summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 16:37:15 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 16:37:15 +0000
commitae5d181b854d3ccb373b6bc01b4869e44ff4d87a (patch)
tree91f59efb48c56a84cc798e012fccb667b63d3fee
parentInitial commit. (diff)
downloadlynx-upstream.tar.xz
lynx-upstream.zip
Adding upstream version 2.9.0dev.12.upstream/2.9.0dev.12upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
-rw-r--r--ABOUT-NLS285
-rw-r--r--AUTHORS56
-rw-r--r--BUILD/README4
-rw-r--r--BUILD/VS2003/clean.bat27
-rw-r--r--BUILD/VS2003/develop.bat7
-rw-r--r--BUILD/VS2003/lynx/lynx.sln30
-rw-r--r--BUILD/VS2003/lynx/lynx.vcproj708
-rw-r--r--BUILD/VS2003/lynx/lynx_cfg.h68
-rw-r--r--BUILD/VS2003/makeuctb/makeuctb.sln21
-rw-r--r--BUILD/VS2003/makeuctb/makeuctb.vcproj179
-rw-r--r--BUILD/VS2005X/clean.bat31
-rw-r--r--BUILD/VS2005X/develop.bat7
-rw-r--r--BUILD/VS2005X/lynx/lynx.sln29
-rw-r--r--BUILD/VS2005X/lynx/lynx.vcproj950
-rw-r--r--BUILD/VS2005X/lynx/lynx_cfg.h70
-rw-r--r--BUILD/VS2005X/makeuctb/makeuctb.sln20
-rw-r--r--BUILD/VS2005X/makeuctb/makeuctb.vcproj227
-rw-r--r--BUILD/VS2008X/clean.bat41
-rw-r--r--BUILD/VS2008X/develop.bat7
-rw-r--r--BUILD/VS2008X/lynx/lynx.sln29
-rw-r--r--BUILD/VS2008X/lynx/lynx.vcproj955
-rw-r--r--BUILD/VS2008X/lynx/lynx_cfg.h70
-rw-r--r--BUILD/VS2008X/makeuctb/makeuctb.sln20
-rw-r--r--BUILD/VS2008X/makeuctb/makeuctb.vcproj226
-rw-r--r--BUILD/VS2010X32/clean.bat40
-rw-r--r--BUILD/VS2010X32/develop.bat7
-rw-r--r--BUILD/VS2010X32/lynx/lynx.sln26
-rw-r--r--BUILD/VS2010X32/lynx/lynx.vcxproj307
-rw-r--r--BUILD/VS2010X32/lynx/lynx.vcxproj.filters609
-rw-r--r--BUILD/VS2010X32/lynx/lynx_cfg.h70
-rw-r--r--BUILD/VS2010X32/makeuctb/makeuctb.sln20
-rw-r--r--BUILD/VS2010X32/makeuctb/makeuctb.vcxproj124
-rw-r--r--BUILD/VS2010X32/makeuctb/makeuctb.vcxproj.filters42
-rw-r--r--BUILD/VS2012X32/clean.bat40
-rw-r--r--BUILD/VS2012X32/develop.bat7
-rw-r--r--BUILD/VS2012X32/lynx/lynx.sln26
-rw-r--r--BUILD/VS2012X32/lynx/lynx.vcxproj309
-rw-r--r--BUILD/VS2012X32/lynx/lynx.vcxproj.filters609
-rw-r--r--BUILD/VS2012X32/lynx/lynx_cfg.h70
-rw-r--r--BUILD/VS2012X32/makeuctb/makeuctb.sln20
-rw-r--r--BUILD/VS2012X32/makeuctb/makeuctb.vcxproj126
-rw-r--r--BUILD/VS2012X32/makeuctb/makeuctb.vcxproj.filters42
-rw-r--r--BUILD/VS2012X64/clean.bat40
-rw-r--r--BUILD/VS2012X64/develop.bat7
-rw-r--r--BUILD/VS2012X64/lynx/lynx.sln38
-rw-r--r--BUILD/VS2012X64/lynx/lynx.vcxproj384
-rw-r--r--BUILD/VS2012X64/lynx/lynx.vcxproj.filters609
-rw-r--r--BUILD/VS2012X64/lynx/lynx_cfg.h70
-rw-r--r--BUILD/VS2012X64/makeuctb/makeuctb.sln20
-rw-r--r--BUILD/VS2012X64/makeuctb/makeuctb.vcxproj213
-rw-r--r--BUILD/VS2012X64/makeuctb/makeuctb.vcxproj.filters42
-rw-r--r--BUILD/VS6/clean.bat27
-rw-r--r--BUILD/VS6/develop.bat7
-rw-r--r--BUILD/VS6/lynx/lynx.dsw44
-rw-r--r--BUILD/VS6/lynx/lynx/lynx.dsp849
-rw-r--r--BUILD/VS6/lynx/lynx/lynx.dsw29
-rw-r--r--BUILD/VS6/lynx/makeuctb/makeuctb.dsp420
-rw-r--r--BUILD/mingw-curses.bat357
-rw-r--r--BUILD/mingw-slang.bat357
-rw-r--r--CHANGES10121
-rw-r--r--COPYHEADER84
-rw-r--r--COPYHEADER.asc15
-rw-r--r--COPYING341
-rw-r--r--COPYING.asc15
-rw-r--r--INSTALLATION1509
-rw-r--r--LYHelp.hin26
-rw-r--r--LYMessages_en.h901
-rw-r--r--PACKAGE/debian/changelog71
-rw-r--r--PACKAGE/debian/compat1
-rw-r--r--PACKAGE/debian/control21
-rw-r--r--PACKAGE/debian/copyright103
-rw-r--r--PACKAGE/debian/doc-base10
-rw-r--r--PACKAGE/debian/lynx-dev.lintian-overrides22
-rw-r--r--PACKAGE/debian/menu2
-rw-r--r--PACKAGE/debian/mime2
-rw-r--r--PACKAGE/debian/postinst27
-rw-r--r--PACKAGE/debian/prerm12
-rwxr-xr-xPACKAGE/debian/rules197
-rw-r--r--PACKAGE/debian/source/format1
-rw-r--r--PACKAGE/debian/watch4
-rw-r--r--PACKAGE/lynx-curses.iss12
-rw-r--r--PACKAGE/lynx-curssl.iss14
-rw-r--r--PACKAGE/lynx-default.iss11
-rw-r--r--PACKAGE/lynx-newssl.iss14
-rw-r--r--PACKAGE/lynx-oldssl.iss15
-rw-r--r--PACKAGE/lynx-slang.iss13
-rw-r--r--PACKAGE/lynx.iss607
-rw-r--r--PACKAGE/lynx.nsi241
-rw-r--r--PACKAGE/lynx.spec132
-rw-r--r--PACKAGE/version.iss14
-rw-r--r--PROBLEMS258
-rw-r--r--README154
-rw-r--r--VMSPrint.com15
-rw-r--r--WWW/FreeofCharge.html26
-rw-r--r--WWW/Library/Implementation/HTAABrow.c1354
-rw-r--r--WWW/Library/Implementation/HTAABrow.h142
-rw-r--r--WWW/Library/Implementation/HTAAProt.c738
-rw-r--r--WWW/Library/Implementation/HTAAProt.h226
-rw-r--r--WWW/Library/Implementation/HTAAUtil.c605
-rw-r--r--WWW/Library/Implementation/HTAAUtil.h318
-rw-r--r--WWW/Library/Implementation/HTAccess.c1460
-rw-r--r--WWW/Library/Implementation/HTAccess.h268
-rw-r--r--WWW/Library/Implementation/HTAnchor.c1460
-rw-r--r--WWW/Library/Implementation/HTAnchor.h412
-rw-r--r--WWW/Library/Implementation/HTAssoc.c82
-rw-r--r--WWW/Library/Implementation/HTAssoc.h35
-rw-r--r--WWW/Library/Implementation/HTAtom.c107
-rw-r--r--WWW/Library/Implementation/HTAtom.h53
-rw-r--r--WWW/Library/Implementation/HTBTree.c680
-rw-r--r--WWW/Library/Implementation/HTBTree.h104
-rw-r--r--WWW/Library/Implementation/HTCJK.h121
-rw-r--r--WWW/Library/Implementation/HTChunk.c332
-rw-r--r--WWW/Library/Implementation/HTChunk.h228
-rw-r--r--WWW/Library/Implementation/HTDOS.c241
-rw-r--r--WWW/Library/Implementation/HTDOS.h56
-rw-r--r--WWW/Library/Implementation/HTFTP.c4177
-rw-r--r--WWW/Library/Implementation/HTFTP.h70
-rw-r--r--WWW/Library/Implementation/HTFWriter.h30
-rw-r--r--WWW/Library/Implementation/HTFile.c3395
-rw-r--r--WWW/Library/Implementation/HTFile.h368
-rw-r--r--WWW/Library/Implementation/HTFinger.c418
-rw-r--r--WWW/Library/Implementation/HTFinger.h30
-rw-r--r--WWW/Library/Implementation/HTFormat.c2181
-rw-r--r--WWW/Library/Implementation/HTFormat.h588
-rw-r--r--WWW/Library/Implementation/HTGopher.c2071
-rw-r--r--WWW/Library/Implementation/HTGopher.h29
-rw-r--r--WWW/Library/Implementation/HTGroup.c758
-rw-r--r--WWW/Library/Implementation/HTGroup.h182
-rw-r--r--WWW/Library/Implementation/HTInit.h34
-rw-r--r--WWW/Library/Implementation/HTLex.c142
-rw-r--r--WWW/Library/Implementation/HTLex.h64
-rw-r--r--WWW/Library/Implementation/HTList.c402
-rw-r--r--WWW/Library/Implementation/HTList.h142
-rw-r--r--WWW/Library/Implementation/HTMIME.c2594
-rw-r--r--WWW/Library/Implementation/HTMIME.h84
-rw-r--r--WWW/Library/Implementation/HTMLDTD.c334
-rw-r--r--WWW/Library/Implementation/HTMLDTD.h97
-rw-r--r--WWW/Library/Implementation/HTMLGen.c738
-rw-r--r--WWW/Library/Implementation/HTMLGen.h26
-rw-r--r--WWW/Library/Implementation/HTNews.c3147
-rw-r--r--WWW/Library/Implementation/HTNews.h60
-rw-r--r--WWW/Library/Implementation/HTParse.c1383
-rw-r--r--WWW/Library/Implementation/HTParse.h212
-rw-r--r--WWW/Library/Implementation/HTPlain.c601
-rw-r--r--WWW/Library/Implementation/HTPlain.h21
-rw-r--r--WWW/Library/Implementation/HTRules.c704
-rw-r--r--WWW/Library/Implementation/HTRules.h169
-rw-r--r--WWW/Library/Implementation/HTStream.h69
-rw-r--r--WWW/Library/Implementation/HTString.c1464
-rw-r--r--WWW/Library/Implementation/HTString.h167
-rw-r--r--WWW/Library/Implementation/HTStyle.c378
-rw-r--r--WWW/Library/Implementation/HTStyle.h241
-rw-r--r--WWW/Library/Implementation/HTTCP.c2623
-rw-r--r--WWW/Library/Implementation/HTTCP.h111
-rw-r--r--WWW/Library/Implementation/HTTP.c2838
-rw-r--r--WWW/Library/Implementation/HTTP.h47
-rw-r--r--WWW/Library/Implementation/HTTelnet.c553
-rw-r--r--WWW/Library/Implementation/HTTelnet.h28
-rw-r--r--WWW/Library/Implementation/HTUU.c210
-rw-r--r--WWW/Library/Implementation/HTUU.h36
-rw-r--r--WWW/Library/Implementation/HTUtils.h847
-rw-r--r--WWW/Library/Implementation/HTVMSUtils.c1131
-rw-r--r--WWW/Library/Implementation/HTVMSUtils.h101
-rw-r--r--WWW/Library/Implementation/HTVMS_WaisProt.c2469
-rw-r--r--WWW/Library/Implementation/HTVMS_WaisProt.h425
-rw-r--r--WWW/Library/Implementation/HTVMS_WaisUI.c2279
-rw-r--r--WWW/Library/Implementation/HTVMS_WaisUI.h664
-rw-r--r--WWW/Library/Implementation/HTWAIS.c1078
-rw-r--r--WWW/Library/Implementation/HTWAIS.h43
-rw-r--r--WWW/Library/Implementation/HTWSRC.c486
-rw-r--r--WWW/Library/Implementation/HTWSRC.h43
-rw-r--r--WWW/Library/Implementation/HText.h219
-rw-r--r--WWW/Library/Implementation/HTioctl.h11
-rw-r--r--WWW/Library/Implementation/LYLeaks.h309
-rw-r--r--WWW/Library/Implementation/LYexit.h67
-rw-r--r--WWW/Library/Implementation/SGML.c5159
-rw-r--r--WWW/Library/Implementation/SGML.h287
-rw-r--r--WWW/Library/Implementation/UCAux.h92
-rw-r--r--WWW/Library/Implementation/UCDefs.h106
-rw-r--r--WWW/Library/Implementation/UCMap.h114
-rw-r--r--WWW/Library/Implementation/Version.make1
-rw-r--r--WWW/Library/Implementation/dtd_util.c1722
-rw-r--r--WWW/Library/Implementation/hdr_HTMLDTD.h1000
-rw-r--r--WWW/Library/Implementation/makefile.in384
-rw-r--r--WWW/Library/Implementation/src0_HTMLDTD.h2478
-rw-r--r--WWW/Library/Implementation/src0_HTMLDTD.txt3901
-rw-r--r--WWW/Library/Implementation/src1_HTMLDTD.h2478
-rw-r--r--WWW/Library/Implementation/src1_HTMLDTD.txt3901
-rw-r--r--WWW/Library/Implementation/tidy_tls.h147
-rw-r--r--WWW/Library/Implementation/www_tcp.h1017
-rw-r--r--WWW/Library/Implementation/www_wait.h34
-rw-r--r--WWW/Library/djgpp/CommonMakefile334
-rw-r--r--WWW/Library/djgpp/makefile59
-rw-r--r--WWW/Library/djgpp/makefile.sla40
-rw-r--r--WWW/Library/vms/COPYING.LIB481
-rw-r--r--WWW/Library/vms/descrip.mms206
-rw-r--r--WWW/Library/vms/libmake.com233
-rw-r--r--aclocal.m48176
-rw-r--r--bcblibs.bat49
-rw-r--r--build.bat169
-rw-r--r--build.com467
-rw-r--r--clean.com22
-rwxr-xr-xconfig.guess1768
-rw-r--r--config.hin398
-rwxr-xr-xconfig.sub1890
-rwxr-xr-xconfigure51590
-rw-r--r--configure.in1637
-rw-r--r--descrip.mms123
-rw-r--r--docs/CHANGES2.3458
-rw-r--r--docs/CHANGES2.4891
-rw-r--r--docs/CHANGES2.51696
-rw-r--r--docs/CHANGES2.6732
-rw-r--r--docs/CHANGES2.7831
-rw-r--r--docs/CHANGES2.83399
-rw-r--r--docs/CRAWL.announce131
-rw-r--r--docs/FM.announce72
-rw-r--r--docs/IBMPC-charsets.announce74
-rw-r--r--docs/OS-390.announce93
-rw-r--r--docs/README.TRST158
-rw-r--r--docs/README.chartrans164
-rw-r--r--docs/README.cookies60
-rw-r--r--docs/README.defines147
-rw-r--r--docs/README.jp130
-rw-r--r--docs/README.metrics283
-rw-r--r--docs/README.options81
-rw-r--r--docs/README.release14
-rw-r--r--docs/README.rootcerts308
-rw-r--r--docs/README.ssl69
-rw-r--r--docs/README.sslcerts265
-rw-r--r--docs/SOCKETSHR.announce67
-rw-r--r--docs/TCPWARE.announce30
-rw-r--r--docs/VMSWAIS.announce28
-rw-r--r--docs/djgpp.key214
-rw-r--r--docs/pdcurses.key123
-rw-r--r--docs/slang.key4
-rw-r--r--docs/win-386.announce40
-rw-r--r--fixed512.com54
-rwxr-xr-xinstall-sh541
-rw-r--r--lib/dirent.c293
-rw-r--r--lib/dirent.h53
-rw-r--r--lynx.cfg3865
-rw-r--r--lynx.hlp1236
-rw-r--r--lynx.man1404
-rw-r--r--lynx_help/Lynx_users_guide.html5729
-rw-r--r--lynx_help/about_lynx.html113
-rw-r--r--lynx_help/help_files.txt38
-rw-r--r--lynx_help/keystrokes/alt_edit_help.html128
-rw-r--r--lynx_help/keystrokes/bashlike_edit_help.html277
-rw-r--r--lynx_help/keystrokes/bookmark_help.html58
-rw-r--r--lynx_help/keystrokes/cookie_help.html76
-rw-r--r--lynx_help/keystrokes/dired_help.html90
-rw-r--r--lynx_help/keystrokes/edit_help.html191
-rw-r--r--lynx_help/keystrokes/environments.html558
-rw-r--r--lynx_help/keystrokes/follow_help.html286
-rw-r--r--lynx_help/keystrokes/gopher_types_help.html87
-rw-r--r--lynx_help/keystrokes/history_help.html58
-rw-r--r--lynx_help/keystrokes/keystroke_help.html177
-rw-r--r--lynx_help/keystrokes/movement_help.html78
-rw-r--r--lynx_help/keystrokes/option_help.html823
-rw-r--r--lynx_help/keystrokes/other_help.html196
-rw-r--r--lynx_help/keystrokes/print_help.html62
-rw-r--r--lynx_help/keystrokes/scrolling_help.html117
-rw-r--r--lynx_help/keystrokes/test_display.html82
-rw-r--r--lynx_help/keystrokes/visited_help.html63
-rw-r--r--lynx_help/keystrokes/xterm_help.html52
-rw-r--r--lynx_help/lynx-dev.html101
-rw-r--r--lynx_help/lynx_help_main.html180
-rw-r--r--lynx_help/lynx_url_support.html796
-rw-r--r--make-msc.bat9
-rw-r--r--makefile.bcb708
-rw-r--r--makefile.in505
-rw-r--r--makefile.msc515
-rw-r--r--makelynx.bat352
-rw-r--r--makew32.bat28
-rw-r--r--po/POTFILES.in44
-rw-r--r--po/ca.po6243
-rw-r--r--po/cs.po6481
-rw-r--r--po/da.po6349
-rw-r--r--po/de.po6588
-rw-r--r--po/eo.po6422
-rw-r--r--po/et.po6403
-rw-r--r--po/fi.po6086
-rw-r--r--po/fr.po6503
-rw-r--r--po/hu.po6098
-rw-r--r--po/id.po6418
-rw-r--r--po/it.po6110
-rw-r--r--po/ja.po6143
-rw-r--r--po/lynx.pot6121
-rw-r--r--po/makefile.inn300
-rw-r--r--po/nl.po6462
-rw-r--r--po/pt_BR.po6533
-rw-r--r--po/readme21
-rw-r--r--po/ro.po5996
-rw-r--r--po/ru.po6317
-rw-r--r--po/sl.po6151
-rw-r--r--po/sv.po6590
-rw-r--r--po/tr.po6446
-rw-r--r--po/uk.po6131
-rw-r--r--po/vi.po6403
-rw-r--r--po/zh_CN.po5246
-rw-r--r--po/zh_TW.po5869
-rw-r--r--samples/blue-background.lss95
-rw-r--r--samples/bright-blue.lss77
-rw-r--r--samples/cernrules.txt640
-rw-r--r--samples/home.htm31
-rw-r--r--samples/installdirs.html18
-rw-r--r--samples/jumps.htm33
-rw-r--r--samples/jumpsUnix.html56
-rw-r--r--samples/jumpsVMS.html28
-rwxr-xr-xsamples/keepviewer20
-rw-r--r--samples/lynx-demo.cfg46
-rw-r--r--samples/lynx-keymaps161
-rw-r--r--samples/lynx.bat31
-rw-r--r--samples/lynx.com59
-rw-r--r--samples/lynx.icobin0 -> 5174 bytes
-rw-r--r--samples/lynx.lss115
-rw-r--r--samples/lynx_bookmarks.htm13
-rwxr-xr-xsamples/lynxdump16
-rw-r--r--samples/mailcap99
-rwxr-xr-xsamples/mailto-form.pl280
-rw-r--r--samples/midnight.lss84
-rw-r--r--samples/mild-colors.lss59
-rw-r--r--samples/mime.types26
-rwxr-xr-xsamples/oldlynx24
-rw-r--r--samples/oldlynx.bat44
-rw-r--r--samples/opaque.lss48
-rwxr-xr-xscripts/cfg2html.pl620
-rwxr-xr-xscripts/cfg_defs.sh51
-rwxr-xr-xscripts/cfg_edit.sh17
-rwxr-xr-xscripts/cfg_path.sh5
-rwxr-xr-xscripts/collapse-br162
-rwxr-xr-xscripts/conf.mingw.sh38
-rwxr-xr-xscripts/config.djgpp.sh24
-rwxr-xr-xscripts/fixtext.sh11
-rwxr-xr-xscripts/indent.sh153
-rwxr-xr-xscripts/install-cfg.sh89
-rwxr-xr-xscripts/install-lss.sh38
-rwxr-xr-xscripts/man2hlp.sh22
-rwxr-xr-xscripts/tbl2html.pl364
-rw-r--r--src/AttrList.h62
-rw-r--r--src/DefaultStyle.c504
-rw-r--r--src/GridText.c15049
-rw-r--r--src/GridText.h302
-rw-r--r--src/HTAlert.c1201
-rw-r--r--src/HTAlert.h168
-rw-r--r--src/HTFWriter.c1516
-rw-r--r--src/HTFont.h50
-rw-r--r--src/HTForms.h174
-rw-r--r--src/HTInit.c1503
-rw-r--r--src/HTML.c8198
-rw-r--r--src/HTML.h283
-rw-r--r--src/HTNestedList.h44
-rw-r--r--src/HTSaveToFile.h29
-rw-r--r--src/LYBookmark.c1169
-rw-r--r--src/LYBookmark.h25
-rw-r--r--src/LYCgi.c757
-rw-r--r--src/LYCgi.h16
-rw-r--r--src/LYCharSets.c1157
-rw-r--r--src/LYCharSets.h154
-rw-r--r--src/LYCharUtils.c3419
-rw-r--r--src/LYCharUtils.h109
-rw-r--r--src/LYCharVals.h34
-rw-r--r--src/LYClean.c203
-rw-r--r--src/LYClean.h25
-rw-r--r--src/LYCookie.c2898
-rw-r--r--src/LYCookie.h59
-rw-r--r--src/LYCurses.c3277
-rw-r--r--src/LYCurses.h841
-rw-r--r--src/LYDownload.c591
-rw-r--r--src/LYDownload.h21
-rw-r--r--src/LYEdit.c298
-rw-r--r--src/LYEdit.h18
-rw-r--r--src/LYEditmap.c1931
-rw-r--r--src/LYExtern.c443
-rw-r--r--src/LYExtern.h16
-rw-r--r--src/LYForms.c1086
-rw-r--r--src/LYGCurses.h246
-rw-r--r--src/LYGetFile.c1569
-rw-r--r--src/LYGetFile.h38
-rw-r--r--src/LYGlobalDefs.h739
-rw-r--r--src/LYHash.c144
-rw-r--r--src/LYHash.h67
-rw-r--r--src/LYHistory.c1163
-rw-r--r--src/LYHistory.h39
-rw-r--r--src/LYIcon.rc34
-rw-r--r--src/LYJump.c504
-rw-r--r--src/LYJump.h36
-rw-r--r--src/LYJustify.h83
-rw-r--r--src/LYKeymap.c1539
-rw-r--r--src/LYKeymap.h307
-rw-r--r--src/LYLeaks.c1169
-rw-r--r--src/LYList.c374
-rw-r--r--src/LYList.h16
-rw-r--r--src/LYLocal.c2685
-rw-r--r--src/LYLocal.h36
-rw-r--r--src/LYMail.c1774
-rw-r--r--src/LYMail.h88
-rw-r--r--src/LYMain.c4554
-rw-r--r--src/LYMainLoop.c8212
-rw-r--r--src/LYMainLoop.h34
-rw-r--r--src/LYMap.c646
-rw-r--r--src/LYMap.h29
-rw-r--r--src/LYNews.c509
-rw-r--r--src/LYNews.h19
-rw-r--r--src/LYOptions.c4365
-rw-r--r--src/LYOptions.h46
-rw-r--r--src/LYPrettySrc.c427
-rw-r--r--src/LYPrettySrc.h92
-rw-r--r--src/LYPrint.c1461
-rw-r--r--src/LYPrint.h20
-rw-r--r--src/LYReadCFG.c2682
-rw-r--r--src/LYReadCFG.h75
-rw-r--r--src/LYSearch.c379
-rw-r--r--src/LYSearch.h33
-rw-r--r--src/LYSession.c267
-rw-r--r--src/LYSession.h16
-rw-r--r--src/LYShowInfo.c499
-rw-r--r--src/LYShowInfo.h21
-rw-r--r--src/LYSignal.h31
-rw-r--r--src/LYStrings.c6236
-rw-r--r--src/LYStrings.h402
-rw-r--r--src/LYStructs.h190
-rw-r--r--src/LYStyle.c970
-rw-r--r--src/LYStyle.h88
-rw-r--r--src/LYTraversal.c182
-rw-r--r--src/LYTraversal.h23
-rw-r--r--src/LYUpload.c221
-rw-r--r--src/LYUpload.h17
-rw-r--r--src/LYUtils.c8042
-rw-r--r--src/LYUtils.h577
-rw-r--r--src/LYVMSdef.h18
-rw-r--r--src/LYebcdic.c48
-rw-r--r--src/LYexit.c185
-rw-r--r--src/LYmktime.c364
-rw-r--r--src/LYrcFile.c1140
-rw-r--r--src/LYrcFile.h318
-rw-r--r--src/TRSTable.c2017
-rw-r--r--src/TRSTable.h50
-rw-r--r--src/UCAuto.c816
-rw-r--r--src/UCAuto.h14
-rw-r--r--src/UCAux.c800
-rw-r--r--src/UCdomap.c2524
-rw-r--r--src/UCdomap.h178
-rw-r--r--src/Xsystem.c589
-rw-r--r--src/chrtrans/README.format138
-rw-r--r--src/chrtrans/README.tables76
-rw-r--r--src/chrtrans/UCkd.h54
-rw-r--r--src/chrtrans/build-chrtrans.com142
-rw-r--r--src/chrtrans/build-header.com37
-rw-r--r--src/chrtrans/caselower.h738
-rw-r--r--src/chrtrans/cp1250_uni.tbl172
-rw-r--r--src/chrtrans/cp1251_uni.tbl161
-rw-r--r--src/chrtrans/cp1252_uni.tbl177
-rw-r--r--src/chrtrans/cp1253_uni.tbl161
-rw-r--r--src/chrtrans/cp1255_uni.tbl161
-rw-r--r--src/chrtrans/cp1256_uni.tbl161
-rw-r--r--src/chrtrans/cp1257_uni.tbl162
-rw-r--r--src/chrtrans/cp437_uni.tbl181
-rw-r--r--src/chrtrans/cp737_uni.tbl172
-rw-r--r--src/chrtrans/cp775_uni.tbl159
-rw-r--r--src/chrtrans/cp850_uni.tbl177
-rw-r--r--src/chrtrans/cp852_uni.tbl170
-rw-r--r--src/chrtrans/cp857_uni.tbl159
-rw-r--r--src/chrtrans/cp862_uni.tbl160
-rw-r--r--src/chrtrans/cp864_uni.tbl160
-rw-r--r--src/chrtrans/cp866_uni.tbl159
-rw-r--r--src/chrtrans/cp866u_uni.tbl157
-rw-r--r--src/chrtrans/cp869_uni.tbl160
-rw-r--r--src/chrtrans/def7_uni.tbl2951
-rw-r--r--src/chrtrans/dmcs_uni.tbl233
-rw-r--r--src/chrtrans/entities.h1414
-rw-r--r--src/chrtrans/hp_uni.tbl212
-rw-r--r--src/chrtrans/iso01_uni.tbl334
-rw-r--r--src/chrtrans/iso02_uni.tbl265
-rw-r--r--src/chrtrans/iso03_uni.tbl255
-rw-r--r--src/chrtrans/iso04_uni.tbl252
-rw-r--r--src/chrtrans/iso05_uni.tbl259
-rw-r--r--src/chrtrans/iso06_uni.tbl208
-rw-r--r--src/chrtrans/iso07_uni.tbl275
-rw-r--r--src/chrtrans/iso08_uni.tbl229
-rw-r--r--src/chrtrans/iso09_uni.tbl266
-rw-r--r--src/chrtrans/iso10_uni.tbl153
-rw-r--r--src/chrtrans/iso13_uni.tbl114
-rw-r--r--src/chrtrans/iso14_uni.tbl114
-rw-r--r--src/chrtrans/iso15_uni.tbl216
-rw-r--r--src/chrtrans/iso16_uni.tbl120
-rw-r--r--src/chrtrans/jcuken_kb.h22
-rw-r--r--src/chrtrans/koi8r_uni.tbl147
-rw-r--r--src/chrtrans/koi8u_uni.tbl154
-rw-r--r--src/chrtrans/mac_uni.tbl284
-rw-r--r--src/chrtrans/make-msc.bat6
-rw-r--r--src/chrtrans/makefile.bcb123
-rw-r--r--src/chrtrans/makefile.dos137
-rw-r--r--src/chrtrans/makefile.in201
-rw-r--r--src/chrtrans/makefile.msc139
-rw-r--r--src/chrtrans/makehdrs.bat51
-rw-r--r--src/chrtrans/makeuctb.c914
-rw-r--r--src/chrtrans/makew32.bat13
-rw-r--r--src/chrtrans/mnem2_suni.tbl1865
-rw-r--r--src/chrtrans/mnem_suni.tbl1861
-rw-r--r--src/chrtrans/next_uni.tbl185
-rw-r--r--src/chrtrans/pt154_uni.tbl174
-rw-r--r--src/chrtrans/rfc_suni.tbl1958
-rw-r--r--src/chrtrans/rot13_kb.h22
-rw-r--r--src/chrtrans/utf8_uni.tbl35
-rw-r--r--src/chrtrans/viscii_uni.tbl300
-rw-r--r--src/chrtrans/yawerty_kb.h22
-rw-r--r--src/cmu_tcp.opt1
-rw-r--r--src/decc.opt2
-rw-r--r--src/descrip.mms172
-rw-r--r--src/gnuc.opt3
-rw-r--r--src/makefile.dos115
-rw-r--r--src/makefile.dsl105
-rw-r--r--src/makefile.in242
-rw-r--r--src/makefile.wsl68
-rw-r--r--src/mktime.c71
-rw-r--r--src/multinet.opt1
-rw-r--r--src/multinet_ucx.opt1
-rw-r--r--src/parsdate.c2425
-rw-r--r--src/parsdate.h21
-rw-r--r--src/parsdate.y991
-rw-r--r--src/socketshr_tcp.opt1
-rw-r--r--src/strstr.c60
-rw-r--r--src/structdump.h164
-rw-r--r--src/tcpipolb.opt1
-rw-r--r--src/tcpipshr.opt1
-rw-r--r--src/tcpwareolb.opt1
-rw-r--r--src/tcpwareshr.opt1
-rw-r--r--src/tidy_tls.c707
-rw-r--r--src/ucxolb.opt1
-rw-r--r--src/ucxshr.opt1
-rw-r--r--src/vaxc.opt2
-rw-r--r--src/wcwidth.c709
-rw-r--r--src/wcwidth.h47
-rw-r--r--src/win_tcp.opt1
-rw-r--r--test/ALT88592.html171
-rw-r--r--test/ISO_LATIN1_test.html83
-rw-r--r--test/README.txt8
-rw-r--r--test/TestComment.html50
-rw-r--r--test/X0
-rw-r--r--test/bad-html.html46
-rw-r--r--test/c1.html63
-rw-r--r--test/circle.html14
-rw-r--r--test/cp-1252.html178
-rw-r--r--test/cp-1252a.html183
-rw-r--r--test/idna-tr46.html54
-rw-r--r--test/image.jpgbin0 -> 1287 bytes
-rw-r--r--test/iso-8859-1.html241
-rw-r--r--test/iso-8859-1a.html275
-rw-r--r--test/iso-8859-2.html174
-rw-r--r--test/iso-8859-2a.html208
-rw-r--r--test/koi8-r.html321
-rw-r--r--test/nobody0
-rw-r--r--test/quickbrown.html103
-rw-r--r--test/raw8bit.html38
-rw-r--r--test/sgml.html1081
-rw-r--r--test/spaces.html37
-rw-r--r--test/special_urls.html22
-rw-r--r--test/square.html14
-rw-r--r--test/tabtest.html39
-rw-r--r--test/tags.html219
-rw-r--r--test/test-styles.html106
-rw-r--r--test/triangle.html14
-rw-r--r--test/unicode.html915
-rw-r--r--test/utf-8-demo.html216
-rw-r--r--userdefs.h1882
566 files changed, 497483 insertions, 0 deletions
diff --git a/ABOUT-NLS b/ABOUT-NLS
new file mode 100644
index 0000000..36bc78d
--- /dev/null
+++ b/ABOUT-NLS
@@ -0,0 +1,285 @@
+Some of this discussion is obsolete - lynx does not bundle the "intl"
+directory, and consequently the "--with-included-gettext" configure option is
+not supported.
+------------------------------------------------------------------------------
+
+Notes on the Free Translation Project
+*************************************
+
+ Free software is going international! The Free Translation Project
+is a way to get maintainers of free software, translators, and users all
+together, so that will gradually become able to speak many languages.
+A few packages already provide translations for their messages.
+
+ If you found this `ABOUT-NLS' file inside a distribution, you may
+assume that the distributed package does use GNU `gettext' internally,
+itself available at your nearest GNU archive site. But you do *not*
+need to install GNU `gettext' prior to configuring, installing or using
+this package with messages translated.
+
+ Installers will find here some useful hints. These notes also
+explain how users should proceed for getting the programs to use the
+available translations. They tell how people wanting to contribute and
+work at translations should contact the appropriate team.
+
+ When reporting bugs in the `intl/' directory or bugs which may be
+related to internationalization, you should tell about the version of
+`gettext' which is used. The information can be found in the
+`intl/VERSION' file, in internationalized packages.
+
+One advise in advance
+=====================
+
+ If you want to exploit the full power of internationalization, you
+should configure it using
+
+ ./configure --with-included-gettext
+
+to force usage of internationalizing routines provided within this
+package, despite the existence of internationalizing capabilities in the
+operating system where this package is being installed. So far, only
+the `gettext' implementation in the GNU C library version 2 provides as
+many features (such as locale alias or message inheritance) as the
+implementation here. It is also not possible to offer this additional
+functionality on top of a `catgets' implementation. Future versions of
+GNU `gettext' will very likely convey even more functionality. So it
+might be a good idea to change to GNU `gettext' as soon as possible.
+
+ So you need not provide this option if you are using GNU libc 2 or
+you have installed a recent copy of the GNU gettext package with the
+included `libintl'.
+
+INSTALL Matters
+===============
+
+ Some packages are "localizable" when properly installed; the
+programs they contain can be made to speak your own native language.
+Most such packages use GNU `gettext'. Other packages have their own
+ways to internationalization, predating GNU `gettext'.
+
+ By default, this package will be installed to allow translation of
+messages. It will automatically detect whether the system provides
+usable `catgets' (if using this is selected by the installer) or
+`gettext' functions. If neither is available, the GNU `gettext' own
+library will be used. This library is wholly contained within this
+package, usually in the `intl/' subdirectory, so prior installation of
+the GNU `gettext' package is *not* required. Installers may use
+special options at configuration time for changing the default
+behaviour. The commands:
+
+ ./configure --with-included-gettext
+ ./configure --with-catgets
+ ./configure --disable-nls
+
+will respectively bypass any pre-existing `catgets' or `gettext' to use
+the internationalizing routines provided within this package, enable
+the use of the `catgets' functions (if found on the locale system), or
+else, *totally* disable translation of messages.
+
+ When you already have GNU `gettext' installed on your system and run
+configure without an option for your new package, `configure' will
+probably detect the previously built and installed `libintl.a' file and
+will decide to use this. This might be not what is desirable. You
+should use the more recent version of the GNU `gettext' library. I.e.
+if the file `intl/VERSION' shows that the library which comes with this
+package is more recent, you should use
+
+ ./configure --with-included-gettext
+
+to prevent auto-detection.
+
+ By default the configuration process will not test for the `catgets'
+function and therefore they will not be used. The reasons are already
+given above: the emulation on top of `catgets' cannot provide all the
+extensions provided by the GNU `gettext' library. If you nevertheless
+want to use the `catgets' functions use
+
+ ./configure --with-catgets
+
+to enable the test for `catgets' (this causes no harm if `catgets' is
+not available on your system). If you really select this option we
+would like to hear about the reasons because we cannot think of any
+good one ourself.
+
+ Internationalized packages have usually many `po/LL.po' files, where
+LL gives an ISO 639 two-letter code identifying the language. Unless
+translations have been forbidden at `configure' time by using the
+`--disable-nls' switch, all available translations are installed
+together with the package. However, the environment variable `LINGUAS'
+may be set, prior to configuration, to limit the installed set.
+`LINGUAS' should then contain a space separated list of two-letter
+codes, stating which languages are allowed.
+
+Using This Package
+==================
+
+ As a user, if your language has been installed for this package, you
+only have to set the `LANG' environment variable to the appropriate
+ISO 639 `LL' two-letter code prior to using the programs in the
+package. For example, let's suppose that you speak German. At the
+shell prompt, merely execute `setenv LANG de' (in `csh'),
+`export LANG; LANG=de' (in `sh') or `export LANG=de' (in `bash'). This
+can be done from your `.login' or `.profile' file, once and for all.
+
+ An operating system might already offer message localization for
+many of its programs, while other programs have been installed locally
+with the full capabilities of GNU `gettext'. Just using `gettext'
+extended syntax for `LANG' would break proper localization of already
+available operating system programs. In this case, users should set
+both `LANGUAGE' and `LANG' variables in their environment, as programs
+using GNU `gettext' give preference to `LANGUAGE'. For example, some
+Swedish users would rather read translations in German than English for
+when Swedish is not available. This is easily accomplished by setting
+`LANGUAGE' to `sv:de' while leaving `LANG' to `sv'.
+
+Translating Teams
+=================
+
+ For the Free Translation Project to be a success, we need interested
+people who like their own language and write it well, and who are also
+able to synergize with other translators speaking the same language.
+Each translation team has its own mailing list, courtesy of Linux
+International. You may reach your translation team at the address
+`LL@li.org', replacing LL by the two-letter ISO 639 code for your
+language. Language codes are *not* the same as the country codes given
+in ISO 3166. The following translation teams exist, as of August 1998:
+
+ Chinese `zh', Czech `cs', Danish `da', Dutch `nl', English `en',
+ Esperanto `eo', Finnish `fi', French `fr', German `de', Hungarian
+ `hu', Irish `ga', Italian `it', Indonesian `id', Japanese `ja',
+ Korean `ko', Latin `la', Norwegian `no', Persian `fa', Polish
+ `pl', Portuguese `pt', Russian `ru', Slovenian `sl', Spanish `es',
+ Swedish `sv', and Turkish `tr'.
+
+For example, you may reach the Chinese translation team by writing to
+`zh@li.org'.
+
+ If you'd like to volunteer to *work* at translating messages, you
+should become a member of the translating team for your own language.
+The subscribing address is *not* the same as the list itself, it has
+`-request' appended. For example, speakers of Swedish can send a
+message to `sv-request@li.org', having this message body:
+
+ subscribe
+
+ Keep in mind that team members are expected to participate
+*actively* in translations, or at solving translational difficulties,
+rather than merely lurking around. If your team does not exist yet and
+you want to start one, or if you are unsure about what to do or how to
+get started, please write to `translation@iro.umontreal.ca' to reach the
+coordinator for all translator teams.
+
+ The English team is special. It works at improving and uniformizing
+the terminology in use. Proven linguistic skill are praised more than
+programming skill, here.
+
+Available Packages
+==================
+
+ Languages are not equally supported in all packages. The following
+matrix shows the current state of internationalization, as of August
+1998. The matrix shows, in regard of each package, for which languages
+PO files have been submitted to translation coordination.
+
+ Ready PO files cs da de el en es fi fr it
+ .----------------------------.
+ bash | [] [] |
+ bison | [] [] |
+ clisp | [] [] [] [] |
+ cpio | [] [] [] |
+ diffutils | [] [] [] |
+ enscript | [] [] [] [] |
+ fileutils | [] [] [] [] |
+ findutils | [] [] [] [] |
+ flex | [] [] |
+ gcal | [] [] |
+ gettext | [] [] [] [] [] |
+ grep | [] [] [] [] |
+ hello | [] [] [] [] [] |
+ id-utils | [] [] |
+ indent | [] [] |
+ libc | [] [] [] |
+ m4 | [] [] |
+ make | [] [] [] |
+ music | [] |
+ ptx | [] [] [] |
+ recode | [] [] [] [] |
+ sed | |
+ sh-utils | [] [] [] |
+ sharutils | [] [] [] [] [] |
+ tar | [] [] [] [] |
+ texinfo | [] [] [] |
+ textutils | [] [] [] [] |
+ wdiff | [] [] [] [] |
+ wget | [] [] [] [] |
+ `----------------------------'
+ cs da de el en es fi fr it
+ 7 4 26 4 1 18 1 26 4
+
+ ja ko nl no pl pt ru sl sv
+ .----------------------------.
+ bash | [] | 3
+ bison | [] | 3
+ clisp | | 4
+ cpio | [] [] [] | 6
+ diffutils | [] [] | 5
+ enscript | [] [] | 6
+ fileutils | [] [] [] [] [] [] [] | 11
+ findutils | [] [] [] [] [] | 9
+ flex | [] [] | 4
+ gcal | [] [] [] | 5
+ gettext | [] [] [] [] [] [] [] | 13
+ grep | [] [] [] [] [] [] [] | 11
+ hello | [] [] [] [] [] [] [] | 12
+ id-utils | [] | 3
+ indent | [] [] [] | 5
+ libc | [] [] [] [] [] | 8
+ m4 | [] [] [] [] | 6
+ make | [] [] [] | 6
+ music | [] | 2
+ ptx | [] [] [] [] [] | 8
+ recode | [] [] [] [] [] | 9
+ sed | | 0
+ sh-utils | [] [] [] [] [] | 8
+ sharutils | [] [] | 7
+ tar | [] [] [] [] [] [] [] | 11
+ texinfo | [] | 4
+ textutils | [] [] [] [] [] | 9
+ wdiff | [] [] [] [] | 8
+ wget | [] | 5
+ `----------------------------'
+ 18 teams ja ko nl no pl pt ru sl sv
+ 29 domains 1 12 21 11 19 7 5 7 17 191
+
+ Some counters in the preceding matrix are higher than the number of
+visible blocks let us expect. This is because a few extra PO files are
+used for implementing regional variants of languages, or language
+dialects.
+
+ For a PO file in the matrix above to be effective, the package to
+which it applies should also have been internationalized and
+distributed as such by its maintainer. There might be an observable
+lag between the mere existence a PO file and its wide availability in a
+distribution.
+
+ If August 1998 seems to be old, you may fetch a more recent copy of
+this `ABOUT-NLS' file on most GNU archive sites.
+
+Using `gettext' in new packages
+===============================
+
+ If you are writing a freely available program and want to
+internationalize it you are welcome to use GNU `gettext' in your
+package. Of course the GNU General Public License applies to your
+sources from then if you include `gettext' directly in your distribution
+on but since you are writing free software anyway this is no
+restriction.
+
+ Once the sources are change appropriately and the setup can handle to
+use of `gettext' the only thing missing are the translations. The Free
+Translation Project is also available for packages which are not
+developed inside the GNU project. Therefore the information given above
+applies also for every other Free Software Project. Contact
+`translation@iro.umontreal.ca' to make the `.pot' files available to
+the translation teams.
+
diff --git a/AUTHORS b/AUTHORS
new file mode 100644
index 0000000..99a8967
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,56 @@
+-- $LynxId: AUTHORS,v 1.10 2019/01/10 22:36:37 tom Exp $
+-- vile:txtmode
+Most of the people who have contributed more than one patch to Lynx (as well as
+a few who have only one) are noted in the changelogs by their initials (to keep
+the changelog short). Here is a summary of those initials and the
+corresponding full names:
+
+AAC Andrey A Chernov
+AJL Alex J Lyons
+BD Binh Do
+BJP Brian J Pardy
+BL Bela Lubkin
+CK Charles Karney
+DK Doug Kaufman
+DSB Scott Bigham
+DW David Woolley
+FLWM Frederic L W Meunier
+FM Foteos Macrides
+GN Glenn Nielsen
+GV Gisle Vanem
+HL Hiram Lester Jr
+HM Hynek Med
+HN Henry Nelson
+IC Ismael Cordeiro
+IZ Ilya Zakharevich
+JB John Bley
+JED John E Davis
+JES James E Spath
+JKT J Kevin Ternes
+JN John Nowlin
+KED Kim DeVaughn
+KH Kihara Hideto
+KW Klaus Weide
+LE Laura Eaves
+LP Leonid Pauzner
+LV Larry W Virden
+NSH nsh@horae.dti.ne.jp
+PBM Paul B Mahol
+PC Peter Canning
+PDS Paul D Smith
+PG Paul Gilmartin
+PHDM Philippe De Muyter
+PW Philip Webb
+RN Ryan Nielsen
+RP Robert J Partington
+RS Rado Smiljanic
+SC Stefan Caunter
+SH Hiroyuki Senshu
+SKY Sinan Kaan Yerli
+SS Sergey Svishchev
+TD Thomas E Dickey
+TG Thorsten Glaser
+TH Hataguchi Takeshi (patakuti)
+VH Vlad Harchev
+WB Wayne Buttles
+WS Bill Schiavo
diff --git a/BUILD/README b/BUILD/README
new file mode 100644
index 0000000..0821cec
--- /dev/null
+++ b/BUILD/README
@@ -0,0 +1,4 @@
+-- $LynxId: README,v 1.1 2018/03/18 20:42:49 tom Exp $
+Lynx is usually built on the command-line, e.g., using make-msc.bat
+However, IDEs are occasionally useful for debugging. Here are project
+files used for different versions of Visual Studio.
diff --git a/BUILD/VS2003/clean.bat b/BUILD/VS2003/clean.bat
new file mode 100644
index 0000000..5920e4a
--- /dev/null
+++ b/BUILD/VS2003/clean.bat
@@ -0,0 +1,27 @@
+@echo off
+@rem $LynxId: clean.bat,v 1.1 2007/06/30 14:17:02 tom Exp $
+@rem Remove all build-products in subdirectories, leaving only sources (and unrecognized types)
+
+del/f/s/q *.aps
+del/f/s/q *.bsc
+del/f/s/q *.exe
+del/f/s/q *.exp
+del/f/s/q *.idb
+del/f/s/q *.ilk
+del/f/s/q *.lib
+del/f/s/q *.ncb
+del/f/s/q *.obj
+del/f/s/q *.opt
+del/f/s/q *.pch
+del/f/s/q *.pdb
+del/f/s/q *.plg
+del/f/s/q *.res
+del/f/s/q *.sbr
+del/f/s/q *.suo
+
+del/f/s/q BuildLog.htm
+
+attrib +r *.h /s
+attrib +r *.bat /s
+attrib +r *.sln /s
+attrib +r *.vcproj /s
diff --git a/BUILD/VS2003/develop.bat b/BUILD/VS2003/develop.bat
new file mode 100644
index 0000000..93509a6
--- /dev/null
+++ b/BUILD/VS2003/develop.bat
@@ -0,0 +1,7 @@
+@echo off
+@rem $LynxId: develop.bat,v 1.2 2007/06/29 00:22:25 tom Exp $
+@rem ensure that all IDE files are writable
+
+attrib -r *.bat /s
+attrib -r *.sln /s
+attrib -r *.vcproj /s \ No newline at end of file
diff --git a/BUILD/VS2003/lynx/lynx.sln b/BUILD/VS2003/lynx/lynx.sln
new file mode 100644
index 0000000..68ee500
--- /dev/null
+++ b/BUILD/VS2003/lynx/lynx.sln
@@ -0,0 +1,30 @@
+Microsoft Visual Studio Solution File, Format Version 8.00
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lynx", "lynx.vcproj", "{0CC852D4-5C5A-475B-9BBB-41A33309B0E5}"
+ ProjectSection(ProjectDependencies) = postProject
+ {C6C72FCE-5049-4D45-A7B2-586A80B6CC20} = {C6C72FCE-5049-4D45-A7B2-586A80B6CC20}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "makeuctb", "..\makeuctb\makeuctb.vcproj", "{C6C72FCE-5049-4D45-A7B2-586A80B6CC20}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Global
+ GlobalSection(SolutionConfiguration) = preSolution
+ Debug = Debug
+ Release = Release
+ EndGlobalSection
+ GlobalSection(ProjectConfiguration) = postSolution
+ {0CC852D4-5C5A-475B-9BBB-41A33309B0E5}.Debug.ActiveCfg = Debug|Win32
+ {0CC852D4-5C5A-475B-9BBB-41A33309B0E5}.Debug.Build.0 = Debug|Win32
+ {0CC852D4-5C5A-475B-9BBB-41A33309B0E5}.Release.ActiveCfg = Release|Win32
+ {0CC852D4-5C5A-475B-9BBB-41A33309B0E5}.Release.Build.0 = Release|Win32
+ {C6C72FCE-5049-4D45-A7B2-586A80B6CC20}.Debug.ActiveCfg = Debug|Win32
+ {C6C72FCE-5049-4D45-A7B2-586A80B6CC20}.Debug.Build.0 = Debug|Win32
+ {C6C72FCE-5049-4D45-A7B2-586A80B6CC20}.Release.ActiveCfg = Release|Win32
+ {C6C72FCE-5049-4D45-A7B2-586A80B6CC20}.Release.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ EndGlobalSection
+ GlobalSection(ExtensibilityAddIns) = postSolution
+ EndGlobalSection
+EndGlobal
diff --git a/BUILD/VS2003/lynx/lynx.vcproj b/BUILD/VS2003/lynx/lynx.vcproj
new file mode 100644
index 0000000..a75648f
--- /dev/null
+++ b/BUILD/VS2003/lynx/lynx.vcproj
@@ -0,0 +1,708 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="7.10"
+ Name="lynx"
+ ProjectGUID="{0CC852D4-5C5A-475B-9BBB-41A33309B0E5}"
+ Keyword="Win32Proj">
+ <Platforms>
+ <Platform
+ Name="Win32"/>
+ </Platforms>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="Debug"
+ IntermediateDirectory="Debug"
+ ConfigurationType="1"
+ CharacterSet="2">
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories=".;..\..\..;..\..\..\lib;..\..\..\WWW\Library\Implementation;..\..\..\src\chrtrans;..\..\..\src"
+ PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;HAVE_CONFIG_H;DONT_HAVE_TM_GMTOFF;_WIN_CC"
+ MinimalRebuild="TRUE"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="5"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="TRUE"
+ DebugInformationFormat="4"/>
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="pdcurses.lib zlib.lib wsock32.lib"
+ OutputFile="$(OutDir)/lynx.exe"
+ LinkIncremental="2"
+ AdditionalLibraryDirectories="..\..\..\lib"
+ IgnoreDefaultLibraryNames="libcmt;libc"
+ GenerateDebugInformation="TRUE"
+ ProgramDatabaseFile="$(OutDir)/lynx.pdb"
+ SubSystem="1"
+ TargetMachine="1"/>
+ <Tool
+ Name="VCMIDLTool"/>
+ <Tool
+ Name="VCPostBuildEventTool"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ <Tool
+ Name="VCResourceCompilerTool"/>
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool
+ Name="VCXMLDataGeneratorTool"/>
+ <Tool
+ Name="VCWebDeploymentTool"/>
+ <Tool
+ Name="VCManagedWrapperGeneratorTool"/>
+ <Tool
+ Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="Release"
+ IntermediateDirectory="Release"
+ ConfigurationType="1"
+ CharacterSet="2">
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=".;..\..\..;..\..\..\lib;..\..\..\WWW\Library\Implementation;..\..\..\src\chrtrans;..\..\..\src"
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;HAVE_CONFIG_H;DONT_HAVE_TM_GMTOFF;_WIN_CC"
+ RuntimeLibrary="4"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="TRUE"
+ DebugInformationFormat="3"/>
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="pdcurses.lib zlib.lib wsock32.lib"
+ OutputFile="$(OutDir)/lynx.exe"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="..\..\..\lib"
+ IgnoreAllDefaultLibraries="FALSE"
+ IgnoreDefaultLibraryNames="libcmt"
+ GenerateDebugInformation="TRUE"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"/>
+ <Tool
+ Name="VCMIDLTool"/>
+ <Tool
+ Name="VCPostBuildEventTool"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ <Tool
+ Name="VCResourceCompilerTool"/>
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool
+ Name="VCXMLDataGeneratorTool"/>
+ <Tool
+ Name="VCWebDeploymentTool"/>
+ <Tool
+ Name="VCManagedWrapperGeneratorTool"/>
+ <Tool
+ Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
+ <File
+ RelativePath="..\..\..\src\DefaultStyle.c">
+ </File>
+ <File
+ RelativePath="..\..\..\lib\dirent.c">
+ </File>
+ <File
+ RelativePath="..\..\..\src\GridText.c">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTAABrow.c">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTAAProt.c">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTAAUtil.c">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTAccess.c">
+ </File>
+ <File
+ RelativePath="..\..\..\src\HTAlert.c">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTAnchor.c">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTAssoc.c">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTAtom.c">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTBTree.c">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTChunk.c">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTDOS.c">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTFile.c">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTFinger.c">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTFormat.c">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTFTP.c">
+ </File>
+ <File
+ RelativePath="..\..\..\src\HTFWriter.c">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTGopher.c">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTGroup.c">
+ </File>
+ <File
+ RelativePath="..\..\..\src\HTInit.c">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTLex.c">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTList.c">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTMIME.c">
+ </File>
+ <File
+ RelativePath="..\..\..\src\HTML.c">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTMLDTD.c">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTMLGen.c">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTNews.c">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTParse.c">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTPlain.c">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTRules.c">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTString.c">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTStyle.c">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTTCP.c">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTTelnet.c">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTTP.c">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTUU.c">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTWSRC.c">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYBookmark.c">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYCgi.c">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYCharSets.c">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYCharUtils.c">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYClean.c">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYCookie.c">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYCurses.c">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYDownload.c">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYEdit.c">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYEditmap.c">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYexit.c">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYExtern.c">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYForms.c">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYGetFile.c">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYHash.c">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYHistory.c">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYJump.c">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYKeymap.c">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYLeaks.c">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYList.c">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYLocal.c">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYMail.c">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYMain.c">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYMainLoop.c">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYMap.c">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYmktime.c">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYNews.c">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYOptions.c">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYPrettySrc.c">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYPrint.c">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYrcFile.c">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYReadCFG.c">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYSearch.c">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYSession.c">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYShowInfo.c">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYStrings.c">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYStyle.c">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYTraversal.c">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYUpload.c">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYUtils.c">
+ </File>
+ <File
+ RelativePath="..\..\..\src\mktime.c">
+ </File>
+ <File
+ RelativePath="..\..\..\src\parsdate.c">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\SGML.c">
+ </File>
+ <File
+ RelativePath="..\..\..\src\strstr.c">
+ </File>
+ <File
+ RelativePath="..\..\..\src\TRSTable.c">
+ </File>
+ <File
+ RelativePath="..\..\..\src\UCAuto.c">
+ </File>
+ <File
+ RelativePath="..\..\..\src\UCAux.c">
+ </File>
+ <File
+ RelativePath="..\..\..\src\UCdomap.c">
+ </File>
+ <File
+ RelativePath="..\..\..\src\Xsystem.c">
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
+ <File
+ RelativePath="..\..\..\src\AttrList.h">
+ </File>
+ <File
+ RelativePath="..\..\..\lib\dirent.h">
+ </File>
+ <File
+ RelativePath="..\..\..\src\GridText.h">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTAABrow.h">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTAAProt.h">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTAAUtil.h">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTAccess.h">
+ </File>
+ <File
+ RelativePath="..\..\..\src\HTAlert.h">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTAnchor.h">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTAssoc.h">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTAtom.h">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTBTree.h">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTChunk.h">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTCJK.h">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTDOS.h">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HText.h">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTFile.h">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTFinger.h">
+ </File>
+ <File
+ RelativePath="..\..\..\src\HTFont.h">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTFormat.h">
+ </File>
+ <File
+ RelativePath="..\..\..\src\HTForms.h">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTFTP.h">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTFWriter.h">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTGopher.h">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTGroup.h">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTInit.h">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTioctl.h">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTLex.h">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTList.h">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTMIME.h">
+ </File>
+ <File
+ RelativePath="..\..\..\src\HTML.h">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTMLDTD.h">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTMLGen.h">
+ </File>
+ <File
+ RelativePath="..\..\..\src\HTNestedList.h">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTNews.h">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTParse.h">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTPlain.h">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTRules.h">
+ </File>
+ <File
+ RelativePath="..\..\..\src\HTSaveToFile.h">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTStream.h">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTString.h">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTStyle.h">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTTCP.h">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTTelnet.h">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTTP.h">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\htutils.h">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTUU.h">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\HTWSRC.h">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYBookmark.h">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYCgi.h">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYCharSets.h">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYCharUtils.h">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYCharVals.h">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYClean.h">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYCookie.h">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYCurses.h">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYDownload.h">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYEdit.h">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\LYexit.h">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYExtern.h">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYGCurses.h">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYGetFile.h">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYGlobalDefs.h">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYHash.h">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYHistory.h">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYJump.h">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYJustify.h">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYKeymap.h">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\LYLeaks.h">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYList.h">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYLocal.h">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYMail.h">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYMainLoop.h">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYMap.h">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYNews.h">
+ </File>
+ <File
+ RelativePath=".\lynx_cfg.h">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYOptions.h">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYPrettySrc.h">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYPrint.h">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYrcFile.h">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYReadCFG.h">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYSearch.h">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYSession.h">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYShowInfo.h">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYSignal.h">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYStrings.h">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYStructs.h">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYStyle.h">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYTraversal.h">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYUpload.h">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYUtils.h">
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYVMSdef.h">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\SGML.h">
+ </File>
+ <File
+ RelativePath="..\..\..\src\structdump.h">
+ </File>
+ <File
+ RelativePath="..\..\..\src\TRSTable.h">
+ </File>
+ <File
+ RelativePath="..\..\..\src\UCAuto.h">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\UCAux.h">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\UCDefs.h">
+ </File>
+ <File
+ RelativePath="..\..\..\src\UCdomap.h">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\UCMap.h">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\www_tcp.h">
+ </File>
+ <File
+ RelativePath="..\..\..\Www\Library\Implementation\www_wait.h">
+ </File>
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/BUILD/VS2003/lynx/lynx_cfg.h b/BUILD/VS2003/lynx/lynx_cfg.h
new file mode 100644
index 0000000..2861e1f
--- /dev/null
+++ b/BUILD/VS2003/lynx/lynx_cfg.h
@@ -0,0 +1,68 @@
+// $LynxId: lynx_cfg.h,v 1.6 2011/05/28 13:07:55 tom Exp $
+// definitions abstracted from makefile.msc
+
+#ifndef LYNX_CFG_H
+#define LYNX_CFG_H 1
+
+#define __WIN32__
+#define _WINDOWS
+#define _WIN32_WINNT 0x0400
+
+#define ACCESS_AUTH 1
+#define CJK_EX 1
+#define DIRED_SUPPORT 1
+#define DISP_PARTIAL 1
+#define DOSPATH 1
+#define USE_ALT_BINDINGS 1
+#define EXP_NESTED_TABLES 1
+#define HAVE_KEYPAD 1
+#define HAVE_PUTENV 1
+#define LONG_LIST 1
+#define NDEBUG 1
+#define NOSIGHUP 1
+#define NOUSERS 1
+#define NO_CONFIG_INFO 1
+#define NO_CUSERID 1
+#define NO_FILIO_H 1
+#define NO_TTYTYPE 1
+#define NO_UNISTD_H 1
+#define NO_UTMP 1
+#define OK_OVERRIDE 1
+#define SH_EX 1
+#define USE_CMD_LOGGING 1
+#define USE_EXTERNALS 1
+#define USE_FILE_UPLOAD 1
+#define USE_JUSTIFY_ELTS 1
+#define USE_MULTIBYTE_CURSES 1
+#define USE_PERSISTENT_COOKIES 1
+#define USE_PRETTYSRC 1
+#define USE_READPROGRESS 1
+#define USE_SCROLLBAR 1
+#define USE_SOURCE_CACHE 1
+#define USE_ZLIB 1
+#define WIN_EX 1
+
+// definitions to account for using this file (see HTUtils.h, userdefs.h)
+#define ANSI_VARARGS 1
+#define HAVE_GETCWD 1
+#define HAVE_STDARG_H 1
+#define HAVE_STDLIB_H 1
+#define LYNX_CFG_FILE "./lynx.cfg"
+#define UNDERLINE_LINKS FALSE
+#define socklen_t int
+
+// configuration choices
+#define PDCURSES 1
+#define USE_WINSOCK2_H 1
+
+#ifdef PDCURSES
+#define USE_COLOR_STYLE 1
+#define COLOR_CURSES 1
+#define FANCY_CURSES 1
+#endif
+
+#pragma warning (disable : 4244) /* conversion from 'xxx' to 'yyy', possible loss of data */
+#pragma warning (disable : 4267) /* conversion from 'xxx' to 'yyy', possible loss of data */
+#pragma warning (disable : 4311) /* 'type cast': pointer truncation from 'xxx' to 'yyy' FIXME */
+
+#endif /* LYNX_CFG_H */
diff --git a/BUILD/VS2003/makeuctb/makeuctb.sln b/BUILD/VS2003/makeuctb/makeuctb.sln
new file mode 100644
index 0000000..f8cfdbd
--- /dev/null
+++ b/BUILD/VS2003/makeuctb/makeuctb.sln
@@ -0,0 +1,21 @@
+Microsoft Visual Studio Solution File, Format Version 8.00
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "makeuctb", "makeuctb.vcproj", "{C6C72FCE-5049-4D45-A7B2-586A80B6CC20}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Global
+ GlobalSection(SolutionConfiguration) = preSolution
+ Debug = Debug
+ Release = Release
+ EndGlobalSection
+ GlobalSection(ProjectConfiguration) = postSolution
+ {C6C72FCE-5049-4D45-A7B2-586A80B6CC20}.Debug.ActiveCfg = Debug|Win32
+ {C6C72FCE-5049-4D45-A7B2-586A80B6CC20}.Debug.Build.0 = Debug|Win32
+ {C6C72FCE-5049-4D45-A7B2-586A80B6CC20}.Release.ActiveCfg = Release|Win32
+ {C6C72FCE-5049-4D45-A7B2-586A80B6CC20}.Release.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ EndGlobalSection
+ GlobalSection(ExtensibilityAddIns) = postSolution
+ EndGlobalSection
+EndGlobal
diff --git a/BUILD/VS2003/makeuctb/makeuctb.vcproj b/BUILD/VS2003/makeuctb/makeuctb.vcproj
new file mode 100644
index 0000000..f217c67
--- /dev/null
+++ b/BUILD/VS2003/makeuctb/makeuctb.vcproj
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="7.10"
+ Name="makeuctb"
+ ProjectGUID="{C6C72FCE-5049-4D45-A7B2-586A80B6CC20}"
+ RootNamespace="makeuctb"
+ Keyword="Win32Proj">
+ <Platforms>
+ <Platform
+ Name="Win32"/>
+ </Platforms>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="Debug"
+ IntermediateDirectory="Debug"
+ ConfigurationType="1"
+ CharacterSet="2">
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\..\..;..\..\..\lib;..\..\..\WWW\Library\Implementation;..\..\..\src\chrtrans;..\..\..\src"
+ PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_MBCS;NO_UNISTD_H;_WINDOWS;__WIN32__"
+ MinimalRebuild="TRUE"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="5"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="TRUE"
+ DebugInformationFormat="4"/>
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="setlocal
+set MYDST=..\..\..\src\chrtrans
+copy $(TargetPath) %MYDST%
+cd %MYDST%
+call makehdrs
+endlocal"
+ Outputs="..\..\..\src\chrtrans\makeuctb.exe;..\..\..\src\chrtrans\def7_uni.h;..\..\..\src\chrtrans\cp1250_uni.h;..\..\..\src\chrtrans\cp1251_uni.h;..\..\..\src\chrtrans\cp1252_uni.h;..\..\..\src\chrtrans\cp1253_uni.h;..\..\..\src\chrtrans\cp1255_uni.h;..\..\..\src\chrtrans\cp1256_uni.h;..\..\..\src\chrtrans\cp1257_uni.h;..\..\..\src\chrtrans\cp437_uni.h;..\..\..\src\chrtrans\cp737_uni.h;..\..\..\src\chrtrans\cp775_uni.h;..\..\..\src\chrtrans\cp850_uni.h;..\..\..\src\chrtrans\cp852_uni.h;..\..\..\src\chrtrans\cp857_uni.h;..\..\..\src\chrtrans\cp862_uni.h;..\..\..\src\chrtrans\cp864_uni.h;..\..\..\src\chrtrans\cp866_uni.h;..\..\..\src\chrtrans\cp866u_uni.h;..\..\..\src\chrtrans\cp869_uni.h;..\..\..\src\chrtrans\dmcs_uni.h;..\..\..\src\chrtrans\hp_uni.h;..\..\..\src\chrtrans\iso01_uni.h;..\..\..\src\chrtrans\iso02_uni.h;..\..\..\src\chrtrans\iso03_uni.h;..\..\..\src\chrtrans\iso04_uni.h;..\..\..\src\chrtrans\iso05_uni.h;..\..\..\src\chrtrans\iso06_uni.h;..\..\..\src\chrtrans\iso07_uni.h;..\..\..\src\chrtrans\iso08_uni.h;..\..\..\src\chrtrans\iso09_uni.h;..\..\..\src\chrtrans\iso10_uni.h;..\..\..\src\chrtrans\iso13_uni.h;..\..\..\src\chrtrans\iso14_uni.h;..\..\..\src\chrtrans\iso15_uni.h;..\..\..\src\chrtrans\koi8r_uni.h;..\..\..\src\chrtrans\koi8u_uni.h;..\..\..\src\chrtrans\mac_uni.h;..\..\..\src\chrtrans\mnem2_suni.h;..\..\..\src\chrtrans\mnem_suni.h;..\..\..\src\chrtrans\next_uni.h;..\..\..\src\chrtrans\pt154_uni.h;..\..\..\src\chrtrans\rfc_suni.h;..\..\..\src\chrtrans\utf8_uni.h;..\..\..\src\chrtrans\viscii_uni.h"/>
+ <Tool
+ Name="VCLinkerTool"
+ OutputFile="$(OutDir)/makeuctb.exe"
+ LinkIncremental="2"
+ GenerateDebugInformation="TRUE"
+ ProgramDatabaseFile="$(OutDir)/makeuctb.pdb"
+ SubSystem="1"
+ TargetMachine="1"/>
+ <Tool
+ Name="VCMIDLTool"/>
+ <Tool
+ Name="VCPostBuildEventTool"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ <Tool
+ Name="VCResourceCompilerTool"/>
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool
+ Name="VCXMLDataGeneratorTool"/>
+ <Tool
+ Name="VCWebDeploymentTool"/>
+ <Tool
+ Name="VCManagedWrapperGeneratorTool"/>
+ <Tool
+ Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="Release"
+ IntermediateDirectory="Release"
+ ConfigurationType="1"
+ CharacterSet="2">
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="..\..\..;..\..\..\lib;..\..\..\WWW\Library\Implementation;..\..\..\src\chrtrans;..\..\..\src"
+ PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_MBCS;NO_UNISTD_H;_WINDOWS;__WIN32__"
+ RuntimeLibrary="4"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="TRUE"
+ DebugInformationFormat="3"/>
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="setlocal
+set MYDST=..\..\..\src\chrtrans
+copy $(TargetPath) %MYDST%
+cd %MYDST%
+call makehdrs
+endlocal"
+ Outputs="..\..\..\src\chrtrans\makeuctb.exe;..\..\..\src\chrtrans\def7_uni.h;..\..\..\src\chrtrans\cp1250_uni.h;..\..\..\src\chrtrans\cp1251_uni.h;..\..\..\src\chrtrans\cp1252_uni.h;..\..\..\src\chrtrans\cp1253_uni.h;..\..\..\src\chrtrans\cp1255_uni.h;..\..\..\src\chrtrans\cp1256_uni.h;..\..\..\src\chrtrans\cp1257_uni.h;..\..\..\src\chrtrans\cp437_uni.h;..\..\..\src\chrtrans\cp737_uni.h;..\..\..\src\chrtrans\cp775_uni.h;..\..\..\src\chrtrans\cp850_uni.h;..\..\..\src\chrtrans\cp852_uni.h;..\..\..\src\chrtrans\cp857_uni.h;..\..\..\src\chrtrans\cp862_uni.h;..\..\..\src\chrtrans\cp864_uni.h;..\..\..\src\chrtrans\cp866_uni.h;..\..\..\src\chrtrans\cp866u_uni.h;..\..\..\src\chrtrans\cp869_uni.h;..\..\..\src\chrtrans\dmcs_uni.h;..\..\..\src\chrtrans\hp_uni.h;..\..\..\src\chrtrans\iso01_uni.h;..\..\..\src\chrtrans\iso02_uni.h;..\..\..\src\chrtrans\iso03_uni.h;..\..\..\src\chrtrans\iso04_uni.h;..\..\..\src\chrtrans\iso05_uni.h;..\..\..\src\chrtrans\iso06_uni.h;..\..\..\src\chrtrans\iso07_uni.h;..\..\..\src\chrtrans\iso08_uni.h;..\..\..\src\chrtrans\iso09_uni.h;..\..\..\src\chrtrans\iso10_uni.h;..\..\..\src\chrtrans\iso13_uni.h;..\..\..\src\chrtrans\iso14_uni.h;..\..\..\src\chrtrans\iso15_uni.h;..\..\..\src\chrtrans\koi8r_uni.h;..\..\..\src\chrtrans\koi8u_uni.h;..\..\..\src\chrtrans\mac_uni.h;..\..\..\src\chrtrans\mnem2_suni.h;..\..\..\src\chrtrans\mnem_suni.h;..\..\..\src\chrtrans\next_uni.h;..\..\..\src\chrtrans\pt154_uni.h;..\..\..\src\chrtrans\rfc_suni.h;..\..\..\src\chrtrans\utf8_uni.h;..\..\..\src\chrtrans\viscii_uni.h"/>
+ <Tool
+ Name="VCLinkerTool"
+ OutputFile="$(OutDir)/makeuctb.exe"
+ LinkIncremental="1"
+ GenerateDebugInformation="TRUE"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"/>
+ <Tool
+ Name="VCMIDLTool"/>
+ <Tool
+ Name="VCPostBuildEventTool"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ <Tool
+ Name="VCResourceCompilerTool"/>
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool
+ Name="VCXMLDataGeneratorTool"/>
+ <Tool
+ Name="VCWebDeploymentTool"/>
+ <Tool
+ Name="VCManagedWrapperGeneratorTool"/>
+ <Tool
+ Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
+ <File
+ RelativePath="..\..\..\src\chrtrans\makeuctb.c">
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ ObjectFile="$(IntDir)/$(InputName)1.obj"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ ObjectFile="$(IntDir)/$(InputName)1.obj"/>
+ </FileConfiguration>
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
+ <File
+ RelativePath="..\..\..\src\chrtrans\caselower.h">
+ </File>
+ <File
+ RelativePath="..\..\..\src\chrtrans\entities.h">
+ </File>
+ <File
+ RelativePath="..\..\..\src\chrtrans\jcuken_kb.h">
+ </File>
+ <File
+ RelativePath="..\..\..\src\chrtrans\rot13_kb.h">
+ </File>
+ <File
+ RelativePath="..\..\..\src\chrtrans\UCkd.h">
+ </File>
+ <File
+ RelativePath="..\..\..\src\chrtrans\yawerty_kb.h">
+ </File>
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/BUILD/VS2005X/clean.bat b/BUILD/VS2005X/clean.bat
new file mode 100644
index 0000000..84d35a1
--- /dev/null
+++ b/BUILD/VS2005X/clean.bat
@@ -0,0 +1,31 @@
+@echo off
+@rem $LynxId: clean.bat,v 1.1 2007/06/30 14:16:07 tom Exp $
+@rem Remove all build-products in subdirectories, leaving only sources (and unrecognized types)
+
+del/f/s/q *.aps
+del/f/s/q *.bsc
+del/f/s/q *.dep
+del/f/s/q *.exe
+del/f/s/q *.exp
+del/f/s/q *.i
+del/f/s/q *.idb
+del/f/s/q *.ilk
+del/f/s/q *.lib
+del/f/s/q *.ncb
+del/f/s/q *.obj
+del/f/s/q *.opt
+del/f/s/q *.pch
+del/f/s/q *.pdb
+del/f/s/q *.plg
+del/f/s/q *.res
+del/f/s/q *.sbr
+del/f/s/q *.suo
+
+del/f/s/q *.manifest
+del/f/s/q *.user
+del/f/s/q BuildLog.htm
+
+attrib +r *.h /s
+attrib +r *.bat /s
+attrib +r *.sln /s
+attrib +r *.vcproj /s
diff --git a/BUILD/VS2005X/develop.bat b/BUILD/VS2005X/develop.bat
new file mode 100644
index 0000000..93509a6
--- /dev/null
+++ b/BUILD/VS2005X/develop.bat
@@ -0,0 +1,7 @@
+@echo off
+@rem $LynxId: develop.bat,v 1.2 2007/06/29 00:22:25 tom Exp $
+@rem ensure that all IDE files are writable
+
+attrib -r *.bat /s
+attrib -r *.sln /s
+attrib -r *.vcproj /s \ No newline at end of file
diff --git a/BUILD/VS2005X/lynx/lynx.sln b/BUILD/VS2005X/lynx/lynx.sln
new file mode 100644
index 0000000..b4d9bc4
--- /dev/null
+++ b/BUILD/VS2005X/lynx/lynx.sln
@@ -0,0 +1,29 @@
+
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual C++ Express 2005
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lynx", "lynx.vcproj", "{77B6BED2-257D-4F7D-AA1B-D180875BD3BF}"
+ ProjectSection(ProjectDependencies) = postProject
+ {3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E} = {3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "makeuctb", "..\makeuctb\makeuctb.vcproj", "{3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {77B6BED2-257D-4F7D-AA1B-D180875BD3BF}.Debug|Win32.ActiveCfg = Debug|Win32
+ {77B6BED2-257D-4F7D-AA1B-D180875BD3BF}.Debug|Win32.Build.0 = Debug|Win32
+ {77B6BED2-257D-4F7D-AA1B-D180875BD3BF}.Release|Win32.ActiveCfg = Release|Win32
+ {77B6BED2-257D-4F7D-AA1B-D180875BD3BF}.Release|Win32.Build.0 = Release|Win32
+ {3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}.Debug|Win32.ActiveCfg = Debug|Win32
+ {3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}.Debug|Win32.Build.0 = Debug|Win32
+ {3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}.Release|Win32.ActiveCfg = Release|Win32
+ {3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}.Release|Win32.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/BUILD/VS2005X/lynx/lynx.vcproj b/BUILD/VS2005X/lynx/lynx.vcproj
new file mode 100644
index 0000000..032e3b7
--- /dev/null
+++ b/BUILD/VS2005X/lynx/lynx.vcproj
@@ -0,0 +1,950 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8.00"
+ Name="lynx"
+ ProjectGUID="{77B6BED2-257D-4F7D-AA1B-D180875BD3BF}"
+ RootNamespace="lynx"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\lynx;&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\lib&quot;;&quot;$(SolutionDir)..\..\..\WWW\Library\Implementation&quot;;&quot;$(SolutionDir)..\..\..\src&quot;;&quot;$(SolutionDir)..\..\..\src\chrtrans&quot;"
+ PreprocessorDefinitions="WIN32;_CONSOLE;HAVE_CONFIG_H;DONT_HAVE_TM_GMTOFF;_WIN_CC"
+ GeneratePreprocessedFile="0"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="4"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="pdcurses.lib zlib.lib wsock32.lib user32.lib advapi32.lib"
+ LinkIncremental="2"
+ AdditionalLibraryDirectories="&quot;$(VcInstallDir)lib&quot;;&quot;$(SolutionDir)\lib&quot;;&quot;$(SolutionDir)..\..\..\lib&quot;"
+ IgnoreDefaultLibraryNames="libc;libcmt"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="1"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="..\lynx;&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\lib&quot;;&quot;$(SolutionDir)..\..\..\WWW\Library\Implementation&quot;;&quot;$(SolutionDir)..\..\..\src&quot;;&quot;$(SolutionDir)..\..\..\src\chrtrans&quot;"
+ PreprocessorDefinitions="WIN32;_CONSOLE;_MBCS;HAVE_CONFIG_H;DONT_HAVE_TM_GMTOFF;_WIN_CC"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="pdcurses.lib zlib.lib wsock32.lib user32.lib advapi32.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="&quot;$(VcInstallDir)lib&quot;;&quot;$(SolutionDir)\lib&quot;;&quot;$(SolutionDir)..\..\..\lib&quot;"
+ IgnoreDefaultLibraryNames="libc;libcmt"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\..\..\src\DefaultStyle.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\lib\dirent.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\GridText.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTAABrow.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTAAProt.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTAAUtil.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTAccess.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\HTAlert.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTAnchor.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTAssoc.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTAtom.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTBTree.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTChunk.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTDOS.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTFile.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTFinger.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTFormat.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTFTP.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\HTFWriter.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTGopher.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTGroup.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\HTInit.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTLex.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTList.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTMIME.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\HTML.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTMLDTD.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTMLGen.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTNews.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTParse.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTPlain.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTRules.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTString.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTStyle.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTTCP.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTTelnet.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTTP.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTUU.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTWSRC.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYBookmark.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYCgi.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYCharSets.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYCharUtils.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYClean.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYCookie.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYCurses.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYDownload.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYEdit.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYEditmap.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYexit.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYExtern.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYForms.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYGetFile.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYHash.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYHistory.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYJump.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYKeymap.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYLeaks.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYList.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYLocal.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYMail.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYMain.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYMainLoop.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYMap.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYmktime.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYNews.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYOptions.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYPrettySrc.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYPrint.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYrcFile.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYReadCFG.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYSearch.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYSession.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYShowInfo.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYStrings.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYStyle.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYTraversal.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYUpload.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYUtils.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\parsdate.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\SGML.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\TRSTable.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\UCAuto.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\UCAux.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\UCdomap.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\Xsystem.c"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath="..\..\..\src\AttrList.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\GridText.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTAABrow.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTAAProt.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTAAUtil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTAccess.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\HTAlert.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTAnchor.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTAssoc.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTAtom.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTBTree.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTChunk.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTCJK.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTDOS.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HText.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTFile.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTFinger.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\HTFont.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTFormat.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\HTForms.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTFTP.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTFWriter.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTGopher.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTGroup.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTInit.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTioctl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTLex.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTList.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTMIME.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\HTML.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTMLDTD.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTMLGen.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\HTNestedList.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTNews.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTParse.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTPlain.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTRules.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\HTSaveToFile.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTStream.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTString.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTStyle.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTTCP.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTTelnet.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTTP.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\htutils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTUU.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTWSRC.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYBookmark.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYCgi.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYCharSets.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYCharUtils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYCharVals.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYClean.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYCookie.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYCurses.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYDownload.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYEdit.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\LYexit.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYExtern.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYGCurses.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYGetFile.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYGlobalDefs.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYHash.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYHistory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYJump.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYJustify.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYKeymap.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\LYLeaks.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYList.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYLocal.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYMail.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYMainLoop.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYMap.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYNews.h"
+ >
+ </File>
+ <File
+ RelativePath=".\lynx_cfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYOptions.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYPrettySrc.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYPrint.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYrcFile.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYReadCFG.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYSearch.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYSession.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYShowInfo.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYSignal.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYStrings.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYStructs.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYStyle.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYTraversal.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYUpload.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYUtils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYVMSdef.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\SGML.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\structdump.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\TRSTable.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\UCAuto.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\UCAux.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\UCDefs.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\UCdomap.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\UCMap.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\www_tcp.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\www_wait.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/BUILD/VS2005X/lynx/lynx_cfg.h b/BUILD/VS2005X/lynx/lynx_cfg.h
new file mode 100644
index 0000000..7059d49
--- /dev/null
+++ b/BUILD/VS2005X/lynx/lynx_cfg.h
@@ -0,0 +1,70 @@
+// $LynxId: lynx_cfg.h,v 1.5 2011/05/28 13:07:55 tom Exp $
+// definitions abstracted from makefile.msc
+
+#ifndef LYNX_CFG_H
+#define LYNX_CFG_H 1
+
+#define __WIN32__
+#define _WINDOWS
+#define _WIN32_WINNT 0x0400
+#define WIN32_LEAN_AND_MEAN 1 // fixes redefinition of winsock2.h
+
+#define ACCESS_AUTH 1
+#define CJK_EX 1
+#define DIRED_SUPPORT 1
+#define DISP_PARTIAL 1
+#define DOSPATH 1
+#define USE_ALT_BINDINGS 1
+#define EXP_NESTED_TABLES 1
+#define HAVE_KEYPAD 1
+#define HAVE_PUTENV 1
+#define LONG_LIST 1
+#define NDEBUG 1
+#define NOSIGHUP 1
+#define NOUSERS 1
+#define NO_CONFIG_INFO 1
+#define NO_CUSERID 1
+#define NO_FILIO_H 1
+#define NO_TTYTYPE 1
+#define NO_UNISTD_H 1
+#define NO_UTMP 1
+#define OK_OVERRIDE 1
+#define SH_EX 1
+#define USE_CMD_LOGGING 1
+#define USE_EXTERNALS 1
+#define USE_FILE_UPLOAD 1
+#define USE_JUSTIFY_ELTS 1
+#define USE_MULTIBYTE_CURSES 1
+#define USE_PERSISTENT_COOKIES 1
+#define USE_PRETTYSRC 1
+#define USE_READPROGRESS 1
+#define USE_SCROLLBAR 1
+#define USE_SOURCE_CACHE 1
+#define USE_ZLIB 1
+#define WIN_EX 1
+
+// definitions to account for using this file (see HTUtils.h, userdefs.h)
+#define ANSI_VARARGS 1
+#define HAVE_GETCWD 1
+#define HAVE_STDARG_H 1
+#define HAVE_STDLIB_H 1
+#define LYNX_CFG_FILE "./lynx.cfg"
+#define UNDERLINE_LINKS FALSE
+#define socklen_t int
+
+// configuration choices
+#define PDCURSES 1
+#define USE_WINSOCK2_H 1
+
+#ifdef PDCURSES
+#define USE_COLOR_STYLE 1
+#define COLOR_CURSES 1
+#define FANCY_CURSES 1
+#endif
+
+#pragma warning (disable : 4244) /* conversion from 'xxx' to 'yyy', possible loss of data */
+#pragma warning (disable : 4267) /* conversion from 'xxx' to 'yyy', possible loss of data */
+#pragma warning (disable : 4311) /* 'type cast': pointer truncation from 'xxx' to 'yyy' FIXME */
+#pragma warning (disable : 4996) /* 'xxx': This function or variable may be unsafe. Consider using yyy instead. */
+
+#endif /* LYNX_CFG_H */
diff --git a/BUILD/VS2005X/makeuctb/makeuctb.sln b/BUILD/VS2005X/makeuctb/makeuctb.sln
new file mode 100644
index 0000000..ebcb3e2
--- /dev/null
+++ b/BUILD/VS2005X/makeuctb/makeuctb.sln
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual C++ Express 2005
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "makeuctb", "makeuctb.vcproj", "{3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}.Debug|Win32.ActiveCfg = Debug|Win32
+ {3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}.Debug|Win32.Build.0 = Debug|Win32
+ {3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}.Release|Win32.ActiveCfg = Release|Win32
+ {3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}.Release|Win32.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/BUILD/VS2005X/makeuctb/makeuctb.vcproj b/BUILD/VS2005X/makeuctb/makeuctb.vcproj
new file mode 100644
index 0000000..fce60eb
--- /dev/null
+++ b/BUILD/VS2005X/makeuctb/makeuctb.vcproj
@@ -0,0 +1,227 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8.00"
+ Name="makeuctb"
+ ProjectGUID="{3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}"
+ RootNamespace="makeuctb"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="setlocal&#x0D;&#x0A;set MYDST=..\..\..\src\chrtrans&#x0D;&#x0A;copy $(TargetPath) %MYDST%&#x0D;&#x0A;cd %MYDST%&#x0D;&#x0A;call makehdrs&#x0D;&#x0A;endlocal"
+ Outputs="..\..\..\src\chrtrans\makeuctb.exe;..\..\..\src\chrtrans\def7_uni.h;..\..\..\src\chrtrans\cp1250_uni.h;..\..\..\src\chrtrans\cp1251_uni.h;..\..\..\src\chrtrans\cp1252_uni.h;..\..\..\src\chrtrans\cp1253_uni.h;..\..\..\src\chrtrans\cp1255_uni.h;..\..\..\src\chrtrans\cp1256_uni.h;..\..\..\src\chrtrans\cp1257_uni.h;..\..\..\src\chrtrans\cp437_uni.h;..\..\..\src\chrtrans\cp737_uni.h;..\..\..\src\chrtrans\cp775_uni.h;..\..\..\src\chrtrans\cp850_uni.h;..\..\..\src\chrtrans\cp852_uni.h;..\..\..\src\chrtrans\cp857_uni.h;..\..\..\src\chrtrans\cp862_uni.h;..\..\..\src\chrtrans\cp864_uni.h;..\..\..\src\chrtrans\cp866_uni.h;..\..\..\src\chrtrans\cp866u_uni.h;..\..\..\src\chrtrans\cp869_uni.h;..\..\..\src\chrtrans\dmcs_uni.h;..\..\..\src\chrtrans\hp_uni.h;..\..\..\src\chrtrans\iso01_uni.h;..\..\..\src\chrtrans\iso02_uni.h;..\..\..\src\chrtrans\iso03_uni.h;..\..\..\src\chrtrans\iso04_uni.h;..\..\..\src\chrtrans\iso05_uni.h;..\..\..\src\chrtrans\iso06_uni.h;..\..\..\src\chrtrans\iso07_uni.h;..\..\..\src\chrtrans\iso08_uni.h;..\..\..\src\chrtrans\iso09_uni.h;..\..\..\src\chrtrans\iso10_uni.h;..\..\..\src\chrtrans\iso13_uni.h;..\..\..\src\chrtrans\iso14_uni.h;..\..\..\src\chrtrans\iso15_uni.h;..\..\..\src\chrtrans\koi8r_uni.h;..\..\..\src\chrtrans\koi8u_uni.h;..\..\..\src\chrtrans\mac_uni.h;..\..\..\src\chrtrans\mnem2_suni.h;..\..\..\src\chrtrans\mnem_suni.h;..\..\..\src\chrtrans\next_uni.h;..\..\..\src\chrtrans\pt154_uni.h;..\..\..\src\chrtrans\rfc_suni.h;..\..\..\src\chrtrans\utf8_uni.h;..\..\..\src\chrtrans\viscii_uni.h"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\lynx;&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\lib&quot;;&quot;$(SolutionDir)..\..\..\WWW\Library\Implementation&quot;;&quot;$(SolutionDir)..\..\..\src&quot;;&quot;$(SolutionDir)..\..\..\src\chrtrans&quot;"
+ PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_MBCS;HAVE_CONFIG_H"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="4"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ LinkIncremental="2"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="1"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="setlocal&#x0D;&#x0A;set MYDST=..\..\..\src\chrtrans&#x0D;&#x0A;copy $(TargetPath) %MYDST%&#x0D;&#x0A;cd %MYDST%&#x0D;&#x0A;call makehdrs&#x0D;&#x0A;endlocal"
+ Outputs="..\..\..\src\chrtrans\makeuctb.exe;..\..\..\src\chrtrans\def7_uni.h;..\..\..\src\chrtrans\cp1250_uni.h;..\..\..\src\chrtrans\cp1251_uni.h;..\..\..\src\chrtrans\cp1252_uni.h;..\..\..\src\chrtrans\cp1253_uni.h;..\..\..\src\chrtrans\cp1255_uni.h;..\..\..\src\chrtrans\cp1256_uni.h;..\..\..\src\chrtrans\cp1257_uni.h;..\..\..\src\chrtrans\cp437_uni.h;..\..\..\src\chrtrans\cp737_uni.h;..\..\..\src\chrtrans\cp775_uni.h;..\..\..\src\chrtrans\cp850_uni.h;..\..\..\src\chrtrans\cp852_uni.h;..\..\..\src\chrtrans\cp857_uni.h;..\..\..\src\chrtrans\cp862_uni.h;..\..\..\src\chrtrans\cp864_uni.h;..\..\..\src\chrtrans\cp866_uni.h;..\..\..\src\chrtrans\cp866u_uni.h;..\..\..\src\chrtrans\cp869_uni.h;..\..\..\src\chrtrans\dmcs_uni.h;..\..\..\src\chrtrans\hp_uni.h;..\..\..\src\chrtrans\iso01_uni.h;..\..\..\src\chrtrans\iso02_uni.h;..\..\..\src\chrtrans\iso03_uni.h;..\..\..\src\chrtrans\iso04_uni.h;..\..\..\src\chrtrans\iso05_uni.h;..\..\..\src\chrtrans\iso06_uni.h;..\..\..\src\chrtrans\iso07_uni.h;..\..\..\src\chrtrans\iso08_uni.h;..\..\..\src\chrtrans\iso09_uni.h;..\..\..\src\chrtrans\iso10_uni.h;..\..\..\src\chrtrans\iso13_uni.h;..\..\..\src\chrtrans\iso14_uni.h;..\..\..\src\chrtrans\iso15_uni.h;..\..\..\src\chrtrans\koi8r_uni.h;..\..\..\src\chrtrans\koi8u_uni.h;..\..\..\src\chrtrans\mac_uni.h;..\..\..\src\chrtrans\mnem2_suni.h;..\..\..\src\chrtrans\mnem_suni.h;..\..\..\src\chrtrans\next_uni.h;..\..\..\src\chrtrans\pt154_uni.h;..\..\..\src\chrtrans\rfc_suni.h;..\..\..\src\chrtrans\utf8_uni.h;..\..\..\src\chrtrans\viscii_uni.h"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="..\lynx;&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\lib&quot;;&quot;$(SolutionDir)..\..\..\WWW\Library\Implementation&quot;;&quot;$(SolutionDir)..\..\..\src&quot;;&quot;$(SolutionDir)..\..\..\src\chrtrans&quot;"
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;HAVE_CONFIG_H"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ LinkIncremental="1"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\..\..\src\chrtrans\makeuctb.c"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath="..\..\..\src\chrtrans\caselower.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\chrtrans\entities.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\chrtrans\jcuken_kb.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\chrtrans\rot13_kb.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\chrtrans\UCkd.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\chrtrans\yawerty_kb.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/BUILD/VS2008X/clean.bat b/BUILD/VS2008X/clean.bat
new file mode 100644
index 0000000..7b11001
--- /dev/null
+++ b/BUILD/VS2008X/clean.bat
@@ -0,0 +1,41 @@
+@echo off
+@rem $LynxId: clean.bat,v 1.4 2018/03/18 23:12:17 tom Exp $
+@rem Remove all build-products in subdirectories, leaving only sources
+@rem (and unrecognized types)
+setlocal
+
+FOR /D %%d IN (*) DO call :dosoln %%d
+
+attrib -h *.suo /s
+
+del/f/s/q *.ncb
+del/f/s/q *.old
+del/f/s/q *.suo
+del/f/s/q *.sdf
+del/f/s/q *.user
+del/f/s/q *.xml
+
+attrib +r *.h /s
+attrib +r *.bat /s
+attrib +r *.sln /s
+attrib +r *.vcproj* /s
+endlocal
+goto :eof
+
+:dosoln
+ setlocal
+ echo Cleanup %*
+ cd %1
+
+ set SOLN=
+ FOR %%d IN ( *.sln ) DO set SOLN=%%d
+ if not "x%SOLN%"=="x" goto :dosoln2
+
+ echo ?? Not a solution directory
+ goto :dosolnx
+
+:dosoln2
+ FOR /D %%d IN (*) DO rmdir /s /q %%d
+:dosolnx
+ endlocal
+ goto :eof
diff --git a/BUILD/VS2008X/develop.bat b/BUILD/VS2008X/develop.bat
new file mode 100644
index 0000000..93509a6
--- /dev/null
+++ b/BUILD/VS2008X/develop.bat
@@ -0,0 +1,7 @@
+@echo off
+@rem $LynxId: develop.bat,v 1.2 2007/06/29 00:22:25 tom Exp $
+@rem ensure that all IDE files are writable
+
+attrib -r *.bat /s
+attrib -r *.sln /s
+attrib -r *.vcproj /s \ No newline at end of file
diff --git a/BUILD/VS2008X/lynx/lynx.sln b/BUILD/VS2008X/lynx/lynx.sln
new file mode 100644
index 0000000..d6d0a39
--- /dev/null
+++ b/BUILD/VS2008X/lynx/lynx.sln
@@ -0,0 +1,29 @@
+
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual C++ Express 2008
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lynx", "lynx.vcproj", "{77B6BED2-257D-4F7D-AA1B-D180875BD3BF}"
+ ProjectSection(ProjectDependencies) = postProject
+ {3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E} = {3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "makeuctb", "..\makeuctb\makeuctb.vcproj", "{3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {77B6BED2-257D-4F7D-AA1B-D180875BD3BF}.Debug|Win32.ActiveCfg = Debug|Win32
+ {77B6BED2-257D-4F7D-AA1B-D180875BD3BF}.Debug|Win32.Build.0 = Debug|Win32
+ {77B6BED2-257D-4F7D-AA1B-D180875BD3BF}.Release|Win32.ActiveCfg = Release|Win32
+ {77B6BED2-257D-4F7D-AA1B-D180875BD3BF}.Release|Win32.Build.0 = Release|Win32
+ {3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}.Debug|Win32.ActiveCfg = Debug|Win32
+ {3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}.Debug|Win32.Build.0 = Debug|Win32
+ {3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}.Release|Win32.ActiveCfg = Release|Win32
+ {3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}.Release|Win32.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/BUILD/VS2008X/lynx/lynx.vcproj b/BUILD/VS2008X/lynx/lynx.vcproj
new file mode 100644
index 0000000..72687b1
--- /dev/null
+++ b/BUILD/VS2008X/lynx/lynx.vcproj
@@ -0,0 +1,955 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="9.00"
+ Name="lynx"
+ ProjectGUID="{77B6BED2-257D-4F7D-AA1B-D180875BD3BF}"
+ RootNamespace="lynx"
+ Keyword="Win32Proj"
+ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\lynx;&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\lib&quot;;&quot;$(SolutionDir)..\..\..\WWW\Library\Implementation&quot;;&quot;$(SolutionDir)..\..\..\src&quot;;&quot;$(SolutionDir)..\..\..\src\chrtrans&quot;"
+ PreprocessorDefinitions="WIN32;_CONSOLE;HAVE_CONFIG_H;DONT_HAVE_TM_GMTOFF;_WIN_CC;$(NOINHERIT)"
+ GeneratePreprocessedFile="0"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ DebugInformationFormat="4"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="pdcurses.lib zlib.lib wsock32.lib user32.lib advapi32.lib"
+ LinkIncremental="2"
+ AdditionalLibraryDirectories="&quot;$(VcInstallDir)lib&quot;;&quot;$(SolutionDir)\lib&quot;;&quot;$(SolutionDir)\..\..\..\lib&quot;"
+ IgnoreDefaultLibraryNames="libc;libcmt"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="1"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="..\lynx;&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\lib&quot;;&quot;$(SolutionDir)..\..\..\WWW\Library\Implementation&quot;;&quot;$(SolutionDir)..\..\..\src&quot;;&quot;$(SolutionDir)..\..\..\src\chrtrans&quot;"
+ PreprocessorDefinitions="WIN32;_CONSOLE;_MBCS;HAVE_CONFIG_H;DONT_HAVE_TM_GMTOFF;_WIN_CC;$(NOINHERIT)"
+ RuntimeLibrary="0"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="pdcurses.lib zlib.lib wsock32.lib user32.lib advapi32.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="&quot;$(VcInstallDir)lib&quot;;&quot;$(SolutionDir)\lib&quot;;&quot;$(SolutionDir)..\..\..\lib&quot;"
+ IgnoreDefaultLibraryNames=""
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\..\..\src\DefaultStyle.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\lib\dirent.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\GridText.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTAABrow.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTAAProt.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTAAUtil.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTAccess.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\HTAlert.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTAnchor.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTAssoc.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTAtom.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTBTree.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTChunk.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTDOS.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTFile.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTFinger.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTFormat.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTFTP.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\HTFWriter.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTGopher.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTGroup.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\HTInit.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTLex.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTList.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTMIME.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\HTML.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTMLDTD.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTMLGen.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTNews.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTParse.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTPlain.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTRules.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTString.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTStyle.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTTCP.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTTelnet.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTTP.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTUU.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTWSRC.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYBookmark.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYCgi.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYCharSets.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYCharUtils.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYClean.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYCookie.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYCurses.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYDownload.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYEdit.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYEditmap.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYexit.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYExtern.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYForms.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYGetFile.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYHash.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYHistory.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYJump.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYKeymap.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYLeaks.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYList.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYLocal.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYMail.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYMain.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYMainLoop.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYMap.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYmktime.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYNews.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYOptions.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYPrettySrc.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYPrint.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYrcFile.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYReadCFG.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYSearch.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYSession.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYShowInfo.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYStrings.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYStyle.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYTraversal.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYUpload.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYUtils.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\parsdate.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\SGML.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\TRSTable.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\UCAuto.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\UCAux.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\UCdomap.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\Xsystem.c"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath="..\..\..\src\AttrList.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\GridText.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTAABrow.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTAAProt.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTAAUtil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTAccess.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\HTAlert.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTAnchor.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTAssoc.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTAtom.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTBTree.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTChunk.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTCJK.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTDOS.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HText.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTFile.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTFinger.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\HTFont.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTFormat.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\HTForms.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTFTP.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTFWriter.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTGopher.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTGroup.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTInit.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTioctl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTLex.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTList.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTMIME.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\HTML.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTMLDTD.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTMLGen.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\HTNestedList.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTNews.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTParse.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTPlain.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTRules.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\HTSaveToFile.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTStream.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTString.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTStyle.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTTCP.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTTelnet.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTTP.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\htutils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTUU.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\HTWSRC.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYBookmark.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYCgi.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYCharSets.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYCharUtils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYCharVals.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYClean.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYCookie.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYCurses.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYDownload.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYEdit.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\LYexit.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYExtern.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYGCurses.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYGetFile.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYGlobalDefs.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYHash.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYHistory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYJump.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYJustify.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYKeymap.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\LYLeaks.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYList.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYLocal.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYMail.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYMainLoop.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYMap.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\LYMessages_en.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYNews.h"
+ >
+ </File>
+ <File
+ RelativePath=".\lynx_cfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYOptions.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYPrettySrc.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYPrint.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYrcFile.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYReadCFG.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYSearch.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYSession.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYShowInfo.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYSignal.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYStrings.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYStructs.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYStyle.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYTraversal.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYUpload.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYUtils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\LYVMSdef.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\SGML.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\structdump.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\TRSTable.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\UCAuto.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\UCAux.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\UCDefs.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\UCdomap.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\UCMap.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\userdefs.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\www_tcp.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\WWW\Library\Implementation\www_wait.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/BUILD/VS2008X/lynx/lynx_cfg.h b/BUILD/VS2008X/lynx/lynx_cfg.h
new file mode 100644
index 0000000..7059d49
--- /dev/null
+++ b/BUILD/VS2008X/lynx/lynx_cfg.h
@@ -0,0 +1,70 @@
+// $LynxId: lynx_cfg.h,v 1.5 2011/05/28 13:07:55 tom Exp $
+// definitions abstracted from makefile.msc
+
+#ifndef LYNX_CFG_H
+#define LYNX_CFG_H 1
+
+#define __WIN32__
+#define _WINDOWS
+#define _WIN32_WINNT 0x0400
+#define WIN32_LEAN_AND_MEAN 1 // fixes redefinition of winsock2.h
+
+#define ACCESS_AUTH 1
+#define CJK_EX 1
+#define DIRED_SUPPORT 1
+#define DISP_PARTIAL 1
+#define DOSPATH 1
+#define USE_ALT_BINDINGS 1
+#define EXP_NESTED_TABLES 1
+#define HAVE_KEYPAD 1
+#define HAVE_PUTENV 1
+#define LONG_LIST 1
+#define NDEBUG 1
+#define NOSIGHUP 1
+#define NOUSERS 1
+#define NO_CONFIG_INFO 1
+#define NO_CUSERID 1
+#define NO_FILIO_H 1
+#define NO_TTYTYPE 1
+#define NO_UNISTD_H 1
+#define NO_UTMP 1
+#define OK_OVERRIDE 1
+#define SH_EX 1
+#define USE_CMD_LOGGING 1
+#define USE_EXTERNALS 1
+#define USE_FILE_UPLOAD 1
+#define USE_JUSTIFY_ELTS 1
+#define USE_MULTIBYTE_CURSES 1
+#define USE_PERSISTENT_COOKIES 1
+#define USE_PRETTYSRC 1
+#define USE_READPROGRESS 1
+#define USE_SCROLLBAR 1
+#define USE_SOURCE_CACHE 1
+#define USE_ZLIB 1
+#define WIN_EX 1
+
+// definitions to account for using this file (see HTUtils.h, userdefs.h)
+#define ANSI_VARARGS 1
+#define HAVE_GETCWD 1
+#define HAVE_STDARG_H 1
+#define HAVE_STDLIB_H 1
+#define LYNX_CFG_FILE "./lynx.cfg"
+#define UNDERLINE_LINKS FALSE
+#define socklen_t int
+
+// configuration choices
+#define PDCURSES 1
+#define USE_WINSOCK2_H 1
+
+#ifdef PDCURSES
+#define USE_COLOR_STYLE 1
+#define COLOR_CURSES 1
+#define FANCY_CURSES 1
+#endif
+
+#pragma warning (disable : 4244) /* conversion from 'xxx' to 'yyy', possible loss of data */
+#pragma warning (disable : 4267) /* conversion from 'xxx' to 'yyy', possible loss of data */
+#pragma warning (disable : 4311) /* 'type cast': pointer truncation from 'xxx' to 'yyy' FIXME */
+#pragma warning (disable : 4996) /* 'xxx': This function or variable may be unsafe. Consider using yyy instead. */
+
+#endif /* LYNX_CFG_H */
diff --git a/BUILD/VS2008X/makeuctb/makeuctb.sln b/BUILD/VS2008X/makeuctb/makeuctb.sln
new file mode 100644
index 0000000..9e3257d
--- /dev/null
+++ b/BUILD/VS2008X/makeuctb/makeuctb.sln
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual C++ Express 2008
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "makeuctb", "makeuctb.vcproj", "{3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}.Debug|Win32.ActiveCfg = Debug|Win32
+ {3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}.Debug|Win32.Build.0 = Debug|Win32
+ {3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}.Release|Win32.ActiveCfg = Release|Win32
+ {3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}.Release|Win32.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/BUILD/VS2008X/makeuctb/makeuctb.vcproj b/BUILD/VS2008X/makeuctb/makeuctb.vcproj
new file mode 100644
index 0000000..74ca626
--- /dev/null
+++ b/BUILD/VS2008X/makeuctb/makeuctb.vcproj
@@ -0,0 +1,226 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="9.00"
+ Name="makeuctb"
+ ProjectGUID="{3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}"
+ RootNamespace="makeuctb"
+ Keyword="Win32Proj"
+ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="setlocal&#x0D;&#x0A;set MYDST=..\..\..\src\chrtrans&#x0D;&#x0A;copy $(TargetPath) %MYDST%&#x0D;&#x0A;cd %MYDST%&#x0D;&#x0A;call makehdrs&#x0D;&#x0A;endlocal&#x0D;&#x0A;"
+ Outputs="..\..\..\src\chrtrans\makeuctb.exe;..\..\..\src\chrtrans\def7_uni.h;..\..\..\src\chrtrans\cp1250_uni.h;..\..\..\src\chrtrans\cp1251_uni.h;..\..\..\src\chrtrans\cp1252_uni.h;..\..\..\src\chrtrans\cp1253_uni.h;..\..\..\src\chrtrans\cp1255_uni.h;..\..\..\src\chrtrans\cp1256_uni.h;..\..\..\src\chrtrans\cp1257_uni.h;..\..\..\src\chrtrans\cp437_uni.h;..\..\..\src\chrtrans\cp737_uni.h;..\..\..\src\chrtrans\cp775_uni.h;..\..\..\src\chrtrans\cp850_uni.h;..\..\..\src\chrtrans\cp852_uni.h;..\..\..\src\chrtrans\cp857_uni.h;..\..\..\src\chrtrans\cp862_uni.h;..\..\..\src\chrtrans\cp864_uni.h;..\..\..\src\chrtrans\cp866_uni.h;..\..\..\src\chrtrans\cp866u_uni.h;..\..\..\src\chrtrans\cp869_uni.h;..\..\..\src\chrtrans\dmcs_uni.h;..\..\..\src\chrtrans\hp_uni.h;..\..\..\src\chrtrans\iso01_uni.h;..\..\..\src\chrtrans\iso02_uni.h;..\..\..\src\chrtrans\iso03_uni.h;..\..\..\src\chrtrans\iso04_uni.h;..\..\..\src\chrtrans\iso05_uni.h;..\..\..\src\chrtrans\iso06_uni.h;..\..\..\src\chrtrans\iso07_uni.h;..\..\..\src\chrtrans\iso08_uni.h;..\..\..\src\chrtrans\iso09_uni.h;..\..\..\src\chrtrans\iso10_uni.h;..\..\..\src\chrtrans\iso13_uni.h;..\..\..\src\chrtrans\iso14_uni.h;..\..\..\src\chrtrans\iso15_uni.h;..\..\..\src\chrtrans\koi8r_uni.h;..\..\..\src\chrtrans\koi8u_uni.h;..\..\..\src\chrtrans\mac_uni.h;..\..\..\src\chrtrans\mnem2_suni.h;..\..\..\src\chrtrans\mnem_suni.h;..\..\..\src\chrtrans\next_uni.h;..\..\..\src\chrtrans\pt154_uni.h;..\..\..\src\chrtrans\rfc_suni.h;..\..\..\src\chrtrans\utf8_uni.h;..\..\..\src\chrtrans\viscii_uni.h"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\lynx;&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\lib&quot;;&quot;$(SolutionDir)..\..\..\WWW\Library\Implementation&quot;;&quot;$(SolutionDir)..\..\..\src&quot;;&quot;$(SolutionDir)..\..\..\src\chrtrans&quot;"
+ PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_MBCS;HAVE_CONFIG_H"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="4"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ LinkIncremental="2"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="1"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="setlocal&#x0D;&#x0A;set MYDST=..\..\..\src\chrtrans&#x0D;&#x0A;copy $(TargetPath) %MYDST%&#x0D;&#x0A;cd %MYDST%&#x0D;&#x0A;call makehdrs&#x0D;&#x0A;endlocal&#x0D;&#x0A;"
+ Outputs="..\..\..\src\chrtrans\makeuctb.exe;..\..\..\src\chrtrans\def7_uni.h;..\..\..\src\chrtrans\cp1250_uni.h;..\..\..\src\chrtrans\cp1251_uni.h;..\..\..\src\chrtrans\cp1252_uni.h;..\..\..\src\chrtrans\cp1253_uni.h;..\..\..\src\chrtrans\cp1255_uni.h;..\..\..\src\chrtrans\cp1256_uni.h;..\..\..\src\chrtrans\cp1257_uni.h;..\..\..\src\chrtrans\cp437_uni.h;..\..\..\src\chrtrans\cp737_uni.h;..\..\..\src\chrtrans\cp775_uni.h;..\..\..\src\chrtrans\cp850_uni.h;..\..\..\src\chrtrans\cp852_uni.h;..\..\..\src\chrtrans\cp857_uni.h;..\..\..\src\chrtrans\cp862_uni.h;..\..\..\src\chrtrans\cp864_uni.h;..\..\..\src\chrtrans\cp866_uni.h;..\..\..\src\chrtrans\cp866u_uni.h;..\..\..\src\chrtrans\cp869_uni.h;..\..\..\src\chrtrans\dmcs_uni.h;..\..\..\src\chrtrans\hp_uni.h;..\..\..\src\chrtrans\iso01_uni.h;..\..\..\src\chrtrans\iso02_uni.h;..\..\..\src\chrtrans\iso03_uni.h;..\..\..\src\chrtrans\iso04_uni.h;..\..\..\src\chrtrans\iso05_uni.h;..\..\..\src\chrtrans\iso06_uni.h;..\..\..\src\chrtrans\iso07_uni.h;..\..\..\src\chrtrans\iso08_uni.h;..\..\..\src\chrtrans\iso09_uni.h;..\..\..\src\chrtrans\iso10_uni.h;..\..\..\src\chrtrans\iso13_uni.h;..\..\..\src\chrtrans\iso14_uni.h;..\..\..\src\chrtrans\iso15_uni.h;..\..\..\src\chrtrans\koi8r_uni.h;..\..\..\src\chrtrans\koi8u_uni.h;..\..\..\src\chrtrans\mac_uni.h;..\..\..\src\chrtrans\mnem2_suni.h;..\..\..\src\chrtrans\mnem_suni.h;..\..\..\src\chrtrans\next_uni.h;..\..\..\src\chrtrans\pt154_uni.h;..\..\..\src\chrtrans\rfc_suni.h;..\..\..\src\chrtrans\utf8_uni.h;..\..\..\src\chrtrans\viscii_uni.h"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="..\lynx;&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\lib&quot;;&quot;$(SolutionDir)..\..\..\WWW\Library\Implementation&quot;;&quot;$(SolutionDir)..\..\..\src&quot;;&quot;$(SolutionDir)..\..\..\src\chrtrans&quot;"
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;HAVE_CONFIG_H"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ LinkIncremental="1"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\..\..\src\chrtrans\makeuctb.c"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath="..\..\..\src\chrtrans\caselower.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\chrtrans\entities.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\chrtrans\jcuken_kb.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\chrtrans\rot13_kb.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\chrtrans\UCkd.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\src\chrtrans\yawerty_kb.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/BUILD/VS2010X32/clean.bat b/BUILD/VS2010X32/clean.bat
new file mode 100644
index 0000000..ce85cd2
--- /dev/null
+++ b/BUILD/VS2010X32/clean.bat
@@ -0,0 +1,40 @@
+@echo off
+@rem $LynxId: clean.bat,v 1.4 2018/03/18 23:17:43 tom Exp $
+@rem Remove all build-products in subdirectories, leaving only sources
+@rem (and unrecognized types)
+setlocal
+
+FOR /D %%d IN (*) DO call :dosoln %%d
+
+attrib -h *.suo /s
+
+del/f/s/q *.old
+del/f/s/q *.suo
+del/f/s/q *.sdf
+del/f/s/q *.user
+del/f/s/q *.xml
+
+attrib +r *.h /s
+attrib +r *.bat /s
+attrib +r *.sln /s
+attrib +r *.vcxproj* /s
+endlocal
+goto :eof
+
+:dosoln
+ setlocal
+ echo Cleanup %*
+ cd %1
+
+ set SOLN=
+ FOR %%d IN ( *.sln ) DO set SOLN=%%d
+ if not "x%SOLN%"=="x" goto :dosoln2
+
+ echo ?? Not a solution directory
+ goto :dosolnx
+
+:dosoln2
+ FOR /D %%d IN (*) DO rmdir /s /q %%d
+:dosolnx
+ endlocal
+ goto :eof
diff --git a/BUILD/VS2010X32/develop.bat b/BUILD/VS2010X32/develop.bat
new file mode 100644
index 0000000..7cde5d6
--- /dev/null
+++ b/BUILD/VS2010X32/develop.bat
@@ -0,0 +1,7 @@
+@echo off
+@rem $LynxId: develop.bat,v 1.2 2018/03/18 23:13:30 tom Exp $
+@rem ensure that all IDE files are writable
+
+attrib -r *.bat /s
+attrib -r *.sln /s
+attrib -r *.vcxproj /s \ No newline at end of file
diff --git a/BUILD/VS2010X32/lynx/lynx.sln b/BUILD/VS2010X32/lynx/lynx.sln
new file mode 100644
index 0000000..b84abfd
--- /dev/null
+++ b/BUILD/VS2010X32/lynx/lynx.sln
@@ -0,0 +1,26 @@
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual C++ Express 2010
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lynx", "lynx.vcxproj", "{77B6BED2-257D-4F7D-AA1B-D180875BD3BF}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "makeuctb", "..\makeuctb\makeuctb.vcxproj", "{3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {77B6BED2-257D-4F7D-AA1B-D180875BD3BF}.Debug|Win32.ActiveCfg = Debug|Win32
+ {77B6BED2-257D-4F7D-AA1B-D180875BD3BF}.Debug|Win32.Build.0 = Debug|Win32
+ {77B6BED2-257D-4F7D-AA1B-D180875BD3BF}.Release|Win32.ActiveCfg = Release|Win32
+ {77B6BED2-257D-4F7D-AA1B-D180875BD3BF}.Release|Win32.Build.0 = Release|Win32
+ {3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}.Debug|Win32.ActiveCfg = Debug|Win32
+ {3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}.Debug|Win32.Build.0 = Debug|Win32
+ {3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}.Release|Win32.ActiveCfg = Release|Win32
+ {3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}.Release|Win32.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/BUILD/VS2010X32/lynx/lynx.vcxproj b/BUILD/VS2010X32/lynx/lynx.vcxproj
new file mode 100644
index 0000000..923977d
--- /dev/null
+++ b/BUILD/VS2010X32/lynx/lynx.vcxproj
@@ -0,0 +1,307 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{77B6BED2-257D-4F7D-AA1B-D180875BD3BF}</ProjectGuid>
+ <RootNamespace>lynx</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\lynx;$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\lib;$(SolutionDir)..\..\..\WWW\Library\Implementation;$(SolutionDir)..\..\..\src;$(SolutionDir)..\..\..\src\chrtrans;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CONSOLE;HAVE_CONFIG_H;DONT_HAVE_TM_GMTOFF;_WIN_CC</PreprocessorDefinitions>
+ <PreprocessToFile>false</PreprocessToFile>
+ <PreprocessSuppressLineNumbers>false</PreprocessSuppressLineNumbers>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>pdcurses.lib;zlib.lib;wsock32.lib;user32.lib;advapi32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalLibraryDirectories>$(VcInstallDir)lib;$(SolutionDir)\lib;$(SolutionDir)..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ <IgnoreSpecificDefaultLibraries>libc;libcmt;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\lynx;$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\lib;$(SolutionDir)..\..\..\WWW\Library\Implementation;$(SolutionDir)..\..\..\src;$(SolutionDir)..\..\..\src\chrtrans;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CONSOLE;_MBCS;HAVE_CONFIG_H;DONT_HAVE_TM_GMTOFF;_WIN_CC</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>pdcurses.lib;zlib.lib;wsock32.lib;user32.lib;advapi32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalLibraryDirectories>$(VcInstallDir)lib;$(SolutionDir)\lib;$(SolutionDir)..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ <IgnoreSpecificDefaultLibraries>%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\src\DefaultStyle.c" />
+ <ClCompile Include="..\..\..\lib\dirent.c" />
+ <ClCompile Include="..\..\..\src\GridText.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTAABrow.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTAAProt.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTAAUtil.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTAccess.c" />
+ <ClCompile Include="..\..\..\src\HTAlert.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTAnchor.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTAssoc.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTAtom.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTBTree.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTChunk.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTDOS.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTFile.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTFinger.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTFormat.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTFTP.c" />
+ <ClCompile Include="..\..\..\src\HTFWriter.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTGopher.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTGroup.c" />
+ <ClCompile Include="..\..\..\src\HTInit.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTLex.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTList.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTMIME.c" />
+ <ClCompile Include="..\..\..\src\HTML.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTMLDTD.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTMLGen.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTNews.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTParse.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTPlain.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTRules.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTString.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTStyle.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTTCP.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTTelnet.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTTP.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTUU.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTWSRC.c" />
+ <ClCompile Include="..\..\..\src\LYBookmark.c" />
+ <ClCompile Include="..\..\..\src\LYCgi.c" />
+ <ClCompile Include="..\..\..\src\LYCharSets.c" />
+ <ClCompile Include="..\..\..\src\LYCharUtils.c" />
+ <ClCompile Include="..\..\..\src\LYClean.c" />
+ <ClCompile Include="..\..\..\src\LYCookie.c" />
+ <ClCompile Include="..\..\..\src\LYCurses.c" />
+ <ClCompile Include="..\..\..\src\LYDownload.c" />
+ <ClCompile Include="..\..\..\src\LYEdit.c" />
+ <ClCompile Include="..\..\..\src\LYEditmap.c" />
+ <ClCompile Include="..\..\..\src\LYexit.c" />
+ <ClCompile Include="..\..\..\src\LYExtern.c" />
+ <ClCompile Include="..\..\..\src\LYForms.c" />
+ <ClCompile Include="..\..\..\src\LYGetFile.c" />
+ <ClCompile Include="..\..\..\src\LYHash.c" />
+ <ClCompile Include="..\..\..\src\LYHistory.c" />
+ <ClCompile Include="..\..\..\src\LYJump.c" />
+ <ClCompile Include="..\..\..\src\LYKeymap.c" />
+ <ClCompile Include="..\..\..\src\LYLeaks.c" />
+ <ClCompile Include="..\..\..\src\LYList.c" />
+ <ClCompile Include="..\..\..\src\LYLocal.c" />
+ <ClCompile Include="..\..\..\src\LYMail.c" />
+ <ClCompile Include="..\..\..\src\LYMain.c" />
+ <ClCompile Include="..\..\..\src\LYMainLoop.c" />
+ <ClCompile Include="..\..\..\src\LYMap.c" />
+ <ClCompile Include="..\..\..\src\LYmktime.c" />
+ <ClCompile Include="..\..\..\src\LYNews.c" />
+ <ClCompile Include="..\..\..\src\LYOptions.c" />
+ <ClCompile Include="..\..\..\src\LYPrettySrc.c" />
+ <ClCompile Include="..\..\..\src\LYPrint.c" />
+ <ClCompile Include="..\..\..\src\LYrcFile.c" />
+ <ClCompile Include="..\..\..\src\LYReadCFG.c" />
+ <ClCompile Include="..\..\..\src\LYSearch.c" />
+ <ClCompile Include="..\..\..\src\LYSession.c" />
+ <ClCompile Include="..\..\..\src\LYShowInfo.c" />
+ <ClCompile Include="..\..\..\src\LYStrings.c" />
+ <ClCompile Include="..\..\..\src\LYStyle.c" />
+ <ClCompile Include="..\..\..\src\LYTraversal.c" />
+ <ClCompile Include="..\..\..\src\LYUpload.c" />
+ <ClCompile Include="..\..\..\src\LYUtils.c" />
+ <ClCompile Include="..\..\..\src\parsdate.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\SGML.c" />
+ <ClCompile Include="..\..\..\src\TRSTable.c" />
+ <ClCompile Include="..\..\..\src\UCAuto.c" />
+ <ClCompile Include="..\..\..\src\UCAux.c" />
+ <ClCompile Include="..\..\..\src\UCdomap.c" />
+ <ClCompile Include="..\..\..\src\Xsystem.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\..\..\lib\bzlib.h" />
+ <ClInclude Include="..\..\..\lib\curses.h" />
+ <ClInclude Include="..\..\..\lib\dirent.h" />
+ <ClInclude Include="..\..\..\lib\zconf.h" />
+ <ClInclude Include="..\..\..\lib\zlib.h" />
+ <ClInclude Include="..\..\..\lymessages_en.h" />
+ <ClInclude Include="..\..\..\src\AttrList.h" />
+ <ClInclude Include="..\..\..\src\chrtrans\cp1251_uni.h" />
+ <ClInclude Include="..\..\..\src\GridText.h" />
+ <ClInclude Include="..\..\..\userdefs.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTAABrow.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTAAProt.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTAAUtil.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTAccess.h" />
+ <ClInclude Include="..\..\..\src\HTAlert.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTAnchor.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTAssoc.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTAtom.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTBTree.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTChunk.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTCJK.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTDOS.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HText.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTFile.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTFinger.h" />
+ <ClInclude Include="..\..\..\src\HTFont.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTFormat.h" />
+ <ClInclude Include="..\..\..\src\HTForms.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTFTP.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTFWriter.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTGopher.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTGroup.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTInit.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTioctl.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTLex.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTList.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTMIME.h" />
+ <ClInclude Include="..\..\..\src\HTML.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTMLDTD.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTMLGen.h" />
+ <ClInclude Include="..\..\..\src\HTNestedList.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTNews.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTParse.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTPlain.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTRules.h" />
+ <ClInclude Include="..\..\..\src\HTSaveToFile.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTStream.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTString.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTStyle.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTTCP.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTTelnet.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTTP.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\htutils.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTUU.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTWSRC.h" />
+ <ClInclude Include="..\..\..\src\LYBookmark.h" />
+ <ClInclude Include="..\..\..\src\LYCgi.h" />
+ <ClInclude Include="..\..\..\src\LYCharSets.h" />
+ <ClInclude Include="..\..\..\src\LYCharUtils.h" />
+ <ClInclude Include="..\..\..\src\LYCharVals.h" />
+ <ClInclude Include="..\..\..\src\LYClean.h" />
+ <ClInclude Include="..\..\..\src\LYCookie.h" />
+ <ClInclude Include="..\..\..\src\LYCurses.h" />
+ <ClInclude Include="..\..\..\src\LYDownload.h" />
+ <ClInclude Include="..\..\..\src\LYEdit.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\LYexit.h" />
+ <ClInclude Include="..\..\..\src\LYExtern.h" />
+ <ClInclude Include="..\..\..\src\LYGCurses.h" />
+ <ClInclude Include="..\..\..\src\LYGetFile.h" />
+ <ClInclude Include="..\..\..\src\LYGlobalDefs.h" />
+ <ClInclude Include="..\..\..\src\LYHash.h" />
+ <ClInclude Include="..\..\..\src\LYHistory.h" />
+ <ClInclude Include="..\..\..\src\LYJump.h" />
+ <ClInclude Include="..\..\..\src\LYJustify.h" />
+ <ClInclude Include="..\..\..\src\LYKeymap.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\LYLeaks.h" />
+ <ClInclude Include="..\..\..\src\LYList.h" />
+ <ClInclude Include="..\..\..\src\LYLocal.h" />
+ <ClInclude Include="..\..\..\src\LYMail.h" />
+ <ClInclude Include="..\..\..\src\LYMainLoop.h" />
+ <ClInclude Include="..\..\..\src\LYMap.h" />
+ <ClInclude Include="..\..\..\src\LYNews.h" />
+ <ClInclude Include="..\..\..\www\library\implementation\tidy_tls.h" />
+ <ClInclude Include="lynx_cfg.h" />
+ <ClInclude Include="..\..\..\src\LYOptions.h" />
+ <ClInclude Include="..\..\..\src\LYPrettySrc.h" />
+ <ClInclude Include="..\..\..\src\LYPrint.h" />
+ <ClInclude Include="..\..\..\src\LYrcFile.h" />
+ <ClInclude Include="..\..\..\src\LYReadCFG.h" />
+ <ClInclude Include="..\..\..\src\LYSearch.h" />
+ <ClInclude Include="..\..\..\src\LYSession.h" />
+ <ClInclude Include="..\..\..\src\LYShowInfo.h" />
+ <ClInclude Include="..\..\..\src\LYSignal.h" />
+ <ClInclude Include="..\..\..\src\LYStrings.h" />
+ <ClInclude Include="..\..\..\src\LYStructs.h" />
+ <ClInclude Include="..\..\..\src\LYStyle.h" />
+ <ClInclude Include="..\..\..\src\LYTraversal.h" />
+ <ClInclude Include="..\..\..\src\LYUpload.h" />
+ <ClInclude Include="..\..\..\src\LYUtils.h" />
+ <ClInclude Include="..\..\..\src\LYVMSdef.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\SGML.h" />
+ <ClInclude Include="..\..\..\src\structdump.h" />
+ <ClInclude Include="..\..\..\src\TRSTable.h" />
+ <ClInclude Include="..\..\..\src\UCAuto.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\UCAux.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\UCDefs.h" />
+ <ClInclude Include="..\..\..\src\UCdomap.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\UCMap.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\www_tcp.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\www_wait.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\makeuctb\makeuctb.vcxproj">
+ <Project>{3ef8c45c-fc77-47b8-a5b6-5f9034ece06e}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/BUILD/VS2010X32/lynx/lynx.vcxproj.filters b/BUILD/VS2010X32/lynx/lynx.vcxproj.filters
new file mode 100644
index 0000000..2da4473
--- /dev/null
+++ b/BUILD/VS2010X32/lynx/lynx.vcxproj.filters
@@ -0,0 +1,609 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+ <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+ </Filter>
+ <Filter Include="Header Files">
+ <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+ <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
+ </Filter>
+ <Filter Include="Resource Files">
+ <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
+ <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav</Extensions>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\src\DefaultStyle.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\lib\dirent.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\GridText.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTAABrow.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTAAProt.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTAAUtil.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTAccess.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\HTAlert.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTAnchor.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTAssoc.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTAtom.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTBTree.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTChunk.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTDOS.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTFile.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTFinger.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTFormat.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTFTP.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\HTFWriter.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTGopher.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTGroup.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\HTInit.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTLex.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTList.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTMIME.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\HTML.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTMLDTD.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTMLGen.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTNews.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTParse.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTPlain.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTRules.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTString.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTStyle.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTTCP.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTTelnet.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTTP.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTUU.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTWSRC.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYBookmark.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYCgi.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYCharSets.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYCharUtils.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYClean.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYCookie.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYCurses.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYDownload.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYEdit.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYEditmap.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYexit.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYExtern.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYForms.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYGetFile.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYHash.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYHistory.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYJump.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYKeymap.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYLeaks.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYList.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYLocal.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYMail.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYMain.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYMainLoop.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYMap.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYmktime.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYNews.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYOptions.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYPrettySrc.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYPrint.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYrcFile.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYReadCFG.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYSearch.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYSession.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYShowInfo.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYStrings.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYStyle.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYTraversal.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYUpload.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYUtils.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\parsdate.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\SGML.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\TRSTable.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\UCAuto.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\UCAux.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\UCdomap.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\Xsystem.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\..\..\src\AttrList.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\GridText.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTAABrow.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTAAProt.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTAAUtil.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTAccess.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\HTAlert.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTAnchor.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTAssoc.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTAtom.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTBTree.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTChunk.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTCJK.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTDOS.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HText.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTFile.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTFinger.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\HTFont.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTFormat.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\HTForms.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTFTP.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTFWriter.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTGopher.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTGroup.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTInit.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTioctl.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTLex.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTList.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTMIME.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\HTML.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTMLDTD.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTMLGen.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\HTNestedList.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTNews.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTParse.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTPlain.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTRules.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\HTSaveToFile.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTStream.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTString.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTStyle.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTTCP.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTTelnet.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTTP.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\htutils.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTUU.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTWSRC.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYBookmark.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYCgi.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYCharSets.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYCharUtils.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYCharVals.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYClean.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYCookie.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYCurses.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYDownload.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYEdit.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\LYexit.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYExtern.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYGCurses.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYGetFile.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYGlobalDefs.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYHash.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYHistory.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYJump.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYJustify.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYKeymap.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\LYLeaks.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYList.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYLocal.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYMail.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYMainLoop.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYMap.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYNews.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="lynx_cfg.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYOptions.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYPrettySrc.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYPrint.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYrcFile.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYReadCFG.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYSearch.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYSession.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYShowInfo.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYSignal.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYStrings.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYStructs.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYStyle.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYTraversal.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYUpload.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYUtils.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYVMSdef.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\SGML.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\structdump.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\TRSTable.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\UCAuto.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\UCAux.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\UCDefs.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\UCdomap.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\UCMap.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\www_tcp.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\www_wait.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\chrtrans\cp1251_uni.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\lymessages_en.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\userdefs.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\www\library\implementation\tidy_tls.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\lib\dirent.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\lib\zlib.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\lib\curses.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\lib\bzlib.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\lib\zconf.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/BUILD/VS2010X32/lynx/lynx_cfg.h b/BUILD/VS2010X32/lynx/lynx_cfg.h
new file mode 100644
index 0000000..095c1a0
--- /dev/null
+++ b/BUILD/VS2010X32/lynx/lynx_cfg.h
@@ -0,0 +1,70 @@
+// $LynxId: lynx_cfg.h,v 1.1 2011/05/28 13:07:55 tom Exp $
+// definitions abstracted from makefile.msc
+
+#ifndef LYNX_CFG_H
+#define LYNX_CFG_H 1
+
+#define __WIN32__
+#define _WINDOWS
+#define _WIN32_WINNT 0x0400
+#define WIN32_LEAN_AND_MEAN 1 // fixes redefinition of winsock2.h
+
+#define ACCESS_AUTH 1
+#define CJK_EX 1
+#define DIRED_SUPPORT 1
+#define DISP_PARTIAL 1
+#define DOSPATH 1
+#define USE_ALT_BINDINGS 1
+#define EXP_NESTED_TABLES 1
+#define HAVE_KEYPAD 1
+#define HAVE_PUTENV 1
+#define LONG_LIST 1
+#define NDEBUG 1
+#define NOSIGHUP 1
+#define NOUSERS 1
+#define NO_CONFIG_INFO 1
+#define NO_CUSERID 1
+#define NO_FILIO_H 1
+#define NO_TTYTYPE 1
+#define NO_UNISTD_H 1
+#define NO_UTMP 1
+#define OK_OVERRIDE 1
+#define SH_EX 1
+#define USE_CMD_LOGGING 1
+#define USE_EXTERNALS 1
+#define USE_FILE_UPLOAD 1
+#define USE_JUSTIFY_ELTS 1
+#define USE_MULTIBYTE_CURSES 1
+#define USE_PERSISTENT_COOKIES 1
+#define USE_PRETTYSRC 1
+#define USE_READPROGRESS 1
+#define USE_SCROLLBAR 1
+#define USE_SOURCE_CACHE 1
+#define USE_ZLIB 1
+#define WIN_EX 1
+
+// definitions to account for using this file (see HTUtils.h, userdefs.h)
+#define ANSI_VARARGS 1
+#define HAVE_GETCWD 1
+#define HAVE_STDARG_H 1
+#define HAVE_STDLIB_H 1
+#define LYNX_CFG_FILE "./lynx.cfg"
+#define UNDERLINE_LINKS FALSE
+#define socklen_t int
+
+// configuration choices
+#define PDCURSES 1
+#define USE_WINSOCK2_H 1
+
+#ifdef PDCURSES
+#define USE_COLOR_STYLE 1
+#define COLOR_CURSES 1
+#define FANCY_CURSES 1
+#endif
+
+#pragma warning (disable : 4244) /* conversion from 'xxx' to 'yyy', possible loss of data */
+#pragma warning (disable : 4267) /* conversion from 'xxx' to 'yyy', possible loss of data */
+#pragma warning (disable : 4311) /* 'type cast': pointer truncation from 'xxx' to 'yyy' FIXME */
+#pragma warning (disable : 4996) /* 'xxx': This function or variable may be unsafe. Consider using yyy instead. */
+
+#endif /* LYNX_CFG_H */
diff --git a/BUILD/VS2010X32/makeuctb/makeuctb.sln b/BUILD/VS2010X32/makeuctb/makeuctb.sln
new file mode 100644
index 0000000..9e3257d
--- /dev/null
+++ b/BUILD/VS2010X32/makeuctb/makeuctb.sln
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual C++ Express 2008
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "makeuctb", "makeuctb.vcproj", "{3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}.Debug|Win32.ActiveCfg = Debug|Win32
+ {3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}.Debug|Win32.Build.0 = Debug|Win32
+ {3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}.Release|Win32.ActiveCfg = Release|Win32
+ {3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}.Release|Win32.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/BUILD/VS2010X32/makeuctb/makeuctb.vcxproj b/BUILD/VS2010X32/makeuctb/makeuctb.vcxproj
new file mode 100644
index 0000000..a84cb27
--- /dev/null
+++ b/BUILD/VS2010X32/makeuctb/makeuctb.vcxproj
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}</ProjectGuid>
+ <RootNamespace>makeuctb</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <CustomBuildStep>
+ <Command>setlocal
+set MYDST=..\..\..\src\chrtrans
+copy $(TargetPath) %MYDST%
+cd %MYDST%
+call makehdrs
+endlocal
+</Command>
+ <Outputs>..\..\..\src\chrtrans\makeuctb.exe;..\..\..\src\chrtrans\def7_uni.h;..\..\..\src\chrtrans\cp1250_uni.h;..\..\..\src\chrtrans\cp1251_uni.h;..\..\..\src\chrtrans\cp1252_uni.h;..\..\..\src\chrtrans\cp1253_uni.h;..\..\..\src\chrtrans\cp1255_uni.h;..\..\..\src\chrtrans\cp1256_uni.h;..\..\..\src\chrtrans\cp1257_uni.h;..\..\..\src\chrtrans\cp437_uni.h;..\..\..\src\chrtrans\cp737_uni.h;..\..\..\src\chrtrans\cp775_uni.h;..\..\..\src\chrtrans\cp850_uni.h;..\..\..\src\chrtrans\cp852_uni.h;..\..\..\src\chrtrans\cp857_uni.h;..\..\..\src\chrtrans\cp862_uni.h;..\..\..\src\chrtrans\cp864_uni.h;..\..\..\src\chrtrans\cp866_uni.h;..\..\..\src\chrtrans\cp866u_uni.h;..\..\..\src\chrtrans\cp869_uni.h;..\..\..\src\chrtrans\dmcs_uni.h;..\..\..\src\chrtrans\hp_uni.h;..\..\..\src\chrtrans\iso01_uni.h;..\..\..\src\chrtrans\iso02_uni.h;..\..\..\src\chrtrans\iso03_uni.h;..\..\..\src\chrtrans\iso04_uni.h;..\..\..\src\chrtrans\iso05_uni.h;..\..\..\src\chrtrans\iso06_uni.h;..\..\..\src\chrtrans\iso07_uni.h;..\..\..\src\chrtrans\iso08_uni.h;..\..\..\src\chrtrans\iso09_uni.h;..\..\..\src\chrtrans\iso10_uni.h;..\..\..\src\chrtrans\iso13_uni.h;..\..\..\src\chrtrans\iso14_uni.h;..\..\..\src\chrtrans\iso15_uni.h;..\..\..\src\chrtrans\koi8r_uni.h;..\..\..\src\chrtrans\koi8u_uni.h;..\..\..\src\chrtrans\mac_uni.h;..\..\..\src\chrtrans\mnem2_suni.h;..\..\..\src\chrtrans\mnem_suni.h;..\..\..\src\chrtrans\next_uni.h;..\..\..\src\chrtrans\pt154_uni.h;..\..\..\src\chrtrans\rfc_suni.h;..\..\..\src\chrtrans\utf8_uni.h;..\..\..\src\chrtrans\viscii_uni.h;%(Outputs)</Outputs>
+ </CustomBuildStep>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\lynx;$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\lib;$(SolutionDir)..\..\..\WWW\Library\Implementation;$(SolutionDir)..\..\..\src;$(SolutionDir)..\..\..\src\chrtrans;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_MBCS;HAVE_CONFIG_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <CustomBuildStep>
+ <Command>setlocal
+set MYDST=..\..\..\src\chrtrans
+copy $(TargetPath) %MYDST%
+cd %MYDST%
+call makehdrs
+endlocal
+</Command>
+ <Outputs>..\..\..\src\chrtrans\makeuctb.exe;..\..\..\src\chrtrans\def7_uni.h;..\..\..\src\chrtrans\cp1250_uni.h;..\..\..\src\chrtrans\cp1251_uni.h;..\..\..\src\chrtrans\cp1252_uni.h;..\..\..\src\chrtrans\cp1253_uni.h;..\..\..\src\chrtrans\cp1255_uni.h;..\..\..\src\chrtrans\cp1256_uni.h;..\..\..\src\chrtrans\cp1257_uni.h;..\..\..\src\chrtrans\cp437_uni.h;..\..\..\src\chrtrans\cp737_uni.h;..\..\..\src\chrtrans\cp775_uni.h;..\..\..\src\chrtrans\cp850_uni.h;..\..\..\src\chrtrans\cp852_uni.h;..\..\..\src\chrtrans\cp857_uni.h;..\..\..\src\chrtrans\cp862_uni.h;..\..\..\src\chrtrans\cp864_uni.h;..\..\..\src\chrtrans\cp866_uni.h;..\..\..\src\chrtrans\cp866u_uni.h;..\..\..\src\chrtrans\cp869_uni.h;..\..\..\src\chrtrans\dmcs_uni.h;..\..\..\src\chrtrans\hp_uni.h;..\..\..\src\chrtrans\iso01_uni.h;..\..\..\src\chrtrans\iso02_uni.h;..\..\..\src\chrtrans\iso03_uni.h;..\..\..\src\chrtrans\iso04_uni.h;..\..\..\src\chrtrans\iso05_uni.h;..\..\..\src\chrtrans\iso06_uni.h;..\..\..\src\chrtrans\iso07_uni.h;..\..\..\src\chrtrans\iso08_uni.h;..\..\..\src\chrtrans\iso09_uni.h;..\..\..\src\chrtrans\iso10_uni.h;..\..\..\src\chrtrans\iso13_uni.h;..\..\..\src\chrtrans\iso14_uni.h;..\..\..\src\chrtrans\iso15_uni.h;..\..\..\src\chrtrans\koi8r_uni.h;..\..\..\src\chrtrans\koi8u_uni.h;..\..\..\src\chrtrans\mac_uni.h;..\..\..\src\chrtrans\mnem2_suni.h;..\..\..\src\chrtrans\mnem_suni.h;..\..\..\src\chrtrans\next_uni.h;..\..\..\src\chrtrans\pt154_uni.h;..\..\..\src\chrtrans\rfc_suni.h;..\..\..\src\chrtrans\utf8_uni.h;..\..\..\src\chrtrans\viscii_uni.h;%(Outputs)</Outputs>
+ </CustomBuildStep>
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\lynx;$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\lib;$(SolutionDir)..\..\..\WWW\Library\Implementation;$(SolutionDir)..\..\..\src;$(SolutionDir)..\..\..\src\chrtrans;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;HAVE_CONFIG_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\src\chrtrans\makeuctb.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\..\..\src\chrtrans\caselower.h" />
+ <ClInclude Include="..\..\..\src\chrtrans\entities.h" />
+ <ClInclude Include="..\..\..\src\chrtrans\jcuken_kb.h" />
+ <ClInclude Include="..\..\..\src\chrtrans\rot13_kb.h" />
+ <ClInclude Include="..\..\..\src\chrtrans\UCkd.h" />
+ <ClInclude Include="..\..\..\src\chrtrans\yawerty_kb.h" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/BUILD/VS2010X32/makeuctb/makeuctb.vcxproj.filters b/BUILD/VS2010X32/makeuctb/makeuctb.vcxproj.filters
new file mode 100644
index 0000000..87c5d40
--- /dev/null
+++ b/BUILD/VS2010X32/makeuctb/makeuctb.vcxproj.filters
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+ <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+ </Filter>
+ <Filter Include="Header Files">
+ <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+ <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
+ </Filter>
+ <Filter Include="Resource Files">
+ <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
+ <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav</Extensions>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\src\chrtrans\makeuctb.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\..\..\src\chrtrans\caselower.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\chrtrans\entities.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\chrtrans\jcuken_kb.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\chrtrans\rot13_kb.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\chrtrans\UCkd.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\chrtrans\yawerty_kb.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/BUILD/VS2012X32/clean.bat b/BUILD/VS2012X32/clean.bat
new file mode 100644
index 0000000..5b8e305
--- /dev/null
+++ b/BUILD/VS2012X32/clean.bat
@@ -0,0 +1,40 @@
+@echo off
+@rem $LynxId: clean.bat,v 1.3 2018/03/18 23:17:43 tom Exp $
+@rem Remove all build-products in subdirectories, leaving only sources
+@rem (and unrecognized types)
+setlocal
+
+FOR /D %%d IN (*) DO call :dosoln %%d
+
+attrib -h *.suo /s
+
+del/f/s/q *.old
+del/f/s/q *.suo
+del/f/s/q *.sdf
+del/f/s/q *.user
+del/f/s/q *.xml
+
+attrib +r *.h /s
+attrib +r *.bat /s
+attrib +r *.sln /s
+attrib +r *.vcxproj* /s
+endlocal
+goto :eof
+
+:dosoln
+ setlocal
+ echo Cleanup %*
+ cd %1
+
+ set SOLN=
+ FOR %%d IN ( *.sln ) DO set SOLN=%%d
+ if not "x%SOLN%"=="x" goto :dosoln2
+
+ echo ?? Not a solution directory
+ goto :dosolnx
+
+:dosoln2
+ FOR /D %%d IN (*) DO rmdir /s /q %%d
+:dosolnx
+ endlocal
+ goto :eof
diff --git a/BUILD/VS2012X32/develop.bat b/BUILD/VS2012X32/develop.bat
new file mode 100644
index 0000000..7cde5d6
--- /dev/null
+++ b/BUILD/VS2012X32/develop.bat
@@ -0,0 +1,7 @@
+@echo off
+@rem $LynxId: develop.bat,v 1.2 2018/03/18 23:13:30 tom Exp $
+@rem ensure that all IDE files are writable
+
+attrib -r *.bat /s
+attrib -r *.sln /s
+attrib -r *.vcxproj /s \ No newline at end of file
diff --git a/BUILD/VS2012X32/lynx/lynx.sln b/BUILD/VS2012X32/lynx/lynx.sln
new file mode 100644
index 0000000..b84abfd
--- /dev/null
+++ b/BUILD/VS2012X32/lynx/lynx.sln
@@ -0,0 +1,26 @@
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual C++ Express 2010
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lynx", "lynx.vcxproj", "{77B6BED2-257D-4F7D-AA1B-D180875BD3BF}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "makeuctb", "..\makeuctb\makeuctb.vcxproj", "{3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {77B6BED2-257D-4F7D-AA1B-D180875BD3BF}.Debug|Win32.ActiveCfg = Debug|Win32
+ {77B6BED2-257D-4F7D-AA1B-D180875BD3BF}.Debug|Win32.Build.0 = Debug|Win32
+ {77B6BED2-257D-4F7D-AA1B-D180875BD3BF}.Release|Win32.ActiveCfg = Release|Win32
+ {77B6BED2-257D-4F7D-AA1B-D180875BD3BF}.Release|Win32.Build.0 = Release|Win32
+ {3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}.Debug|Win32.ActiveCfg = Debug|Win32
+ {3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}.Debug|Win32.Build.0 = Debug|Win32
+ {3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}.Release|Win32.ActiveCfg = Release|Win32
+ {3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}.Release|Win32.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/BUILD/VS2012X32/lynx/lynx.vcxproj b/BUILD/VS2012X32/lynx/lynx.vcxproj
new file mode 100644
index 0000000..8f3da7a
--- /dev/null
+++ b/BUILD/VS2012X32/lynx/lynx.vcxproj
@@ -0,0 +1,309 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{77B6BED2-257D-4F7D-AA1B-D180875BD3BF}</ProjectGuid>
+ <RootNamespace>lynx</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\lynx;$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\lib;$(SolutionDir)..\..\..\WWW\Library\Implementation;$(SolutionDir)..\..\..\src;$(SolutionDir)..\..\..\src\chrtrans;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CONSOLE;HAVE_CONFIG_H;DONT_HAVE_TM_GMTOFF;_WIN_CC</PreprocessorDefinitions>
+ <PreprocessToFile>false</PreprocessToFile>
+ <PreprocessSuppressLineNumbers>false</PreprocessSuppressLineNumbers>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>pdcurses.lib;zlib.lib;wsock32.lib;user32.lib;advapi32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalLibraryDirectories>$(VcInstallDir)lib;$(SolutionDir)\lib;$(SolutionDir)..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ <IgnoreSpecificDefaultLibraries>libc;libcmt;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\lynx;$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\lib;$(SolutionDir)..\..\..\WWW\Library\Implementation;$(SolutionDir)..\..\..\src;$(SolutionDir)..\..\..\src\chrtrans;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CONSOLE;_MBCS;HAVE_CONFIG_H;DONT_HAVE_TM_GMTOFF;_WIN_CC</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>pdcurses.lib;zlib.lib;wsock32.lib;user32.lib;advapi32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalLibraryDirectories>$(VcInstallDir)lib;$(SolutionDir)\lib;$(SolutionDir)..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ <IgnoreSpecificDefaultLibraries>%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\src\DefaultStyle.c" />
+ <ClCompile Include="..\..\..\lib\dirent.c" />
+ <ClCompile Include="..\..\..\src\GridText.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTAABrow.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTAAProt.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTAAUtil.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTAccess.c" />
+ <ClCompile Include="..\..\..\src\HTAlert.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTAnchor.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTAssoc.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTAtom.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTBTree.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTChunk.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTDOS.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTFile.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTFinger.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTFormat.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTFTP.c" />
+ <ClCompile Include="..\..\..\src\HTFWriter.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTGopher.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTGroup.c" />
+ <ClCompile Include="..\..\..\src\HTInit.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTLex.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTList.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTMIME.c" />
+ <ClCompile Include="..\..\..\src\HTML.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTMLDTD.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTMLGen.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTNews.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTParse.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTPlain.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTRules.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTString.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTStyle.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTTCP.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTTelnet.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTTP.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTUU.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTWSRC.c" />
+ <ClCompile Include="..\..\..\src\LYBookmark.c" />
+ <ClCompile Include="..\..\..\src\LYCgi.c" />
+ <ClCompile Include="..\..\..\src\LYCharSets.c" />
+ <ClCompile Include="..\..\..\src\LYCharUtils.c" />
+ <ClCompile Include="..\..\..\src\LYClean.c" />
+ <ClCompile Include="..\..\..\src\LYCookie.c" />
+ <ClCompile Include="..\..\..\src\LYCurses.c" />
+ <ClCompile Include="..\..\..\src\LYDownload.c" />
+ <ClCompile Include="..\..\..\src\LYEdit.c" />
+ <ClCompile Include="..\..\..\src\LYEditmap.c" />
+ <ClCompile Include="..\..\..\src\LYexit.c" />
+ <ClCompile Include="..\..\..\src\LYExtern.c" />
+ <ClCompile Include="..\..\..\src\LYForms.c" />
+ <ClCompile Include="..\..\..\src\LYGetFile.c" />
+ <ClCompile Include="..\..\..\src\LYHash.c" />
+ <ClCompile Include="..\..\..\src\LYHistory.c" />
+ <ClCompile Include="..\..\..\src\LYJump.c" />
+ <ClCompile Include="..\..\..\src\LYKeymap.c" />
+ <ClCompile Include="..\..\..\src\LYLeaks.c" />
+ <ClCompile Include="..\..\..\src\LYList.c" />
+ <ClCompile Include="..\..\..\src\LYLocal.c" />
+ <ClCompile Include="..\..\..\src\LYMail.c" />
+ <ClCompile Include="..\..\..\src\LYMain.c" />
+ <ClCompile Include="..\..\..\src\LYMainLoop.c" />
+ <ClCompile Include="..\..\..\src\LYMap.c" />
+ <ClCompile Include="..\..\..\src\LYmktime.c" />
+ <ClCompile Include="..\..\..\src\LYNews.c" />
+ <ClCompile Include="..\..\..\src\LYOptions.c" />
+ <ClCompile Include="..\..\..\src\LYPrettySrc.c" />
+ <ClCompile Include="..\..\..\src\LYPrint.c" />
+ <ClCompile Include="..\..\..\src\LYrcFile.c" />
+ <ClCompile Include="..\..\..\src\LYReadCFG.c" />
+ <ClCompile Include="..\..\..\src\LYSearch.c" />
+ <ClCompile Include="..\..\..\src\LYSession.c" />
+ <ClCompile Include="..\..\..\src\LYShowInfo.c" />
+ <ClCompile Include="..\..\..\src\LYStrings.c" />
+ <ClCompile Include="..\..\..\src\LYStyle.c" />
+ <ClCompile Include="..\..\..\src\LYTraversal.c" />
+ <ClCompile Include="..\..\..\src\LYUpload.c" />
+ <ClCompile Include="..\..\..\src\LYUtils.c" />
+ <ClCompile Include="..\..\..\src\parsdate.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\SGML.c" />
+ <ClCompile Include="..\..\..\src\TRSTable.c" />
+ <ClCompile Include="..\..\..\src\UCAuto.c" />
+ <ClCompile Include="..\..\..\src\UCAux.c" />
+ <ClCompile Include="..\..\..\src\UCdomap.c" />
+ <ClCompile Include="..\..\..\src\Xsystem.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\..\..\lib\bzlib.h" />
+ <ClInclude Include="..\..\..\lib\curses.h" />
+ <ClInclude Include="..\..\..\lib\dirent.h" />
+ <ClInclude Include="..\..\..\lib\zconf.h" />
+ <ClInclude Include="..\..\..\lib\zlib.h" />
+ <ClInclude Include="..\..\..\lymessages_en.h" />
+ <ClInclude Include="..\..\..\src\AttrList.h" />
+ <ClInclude Include="..\..\..\src\chrtrans\cp1251_uni.h" />
+ <ClInclude Include="..\..\..\src\GridText.h" />
+ <ClInclude Include="..\..\..\userdefs.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTAABrow.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTAAProt.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTAAUtil.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTAccess.h" />
+ <ClInclude Include="..\..\..\src\HTAlert.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTAnchor.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTAssoc.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTAtom.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTBTree.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTChunk.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTCJK.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTDOS.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HText.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTFile.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTFinger.h" />
+ <ClInclude Include="..\..\..\src\HTFont.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTFormat.h" />
+ <ClInclude Include="..\..\..\src\HTForms.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTFTP.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTFWriter.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTGopher.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTGroup.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTInit.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTioctl.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTLex.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTList.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTMIME.h" />
+ <ClInclude Include="..\..\..\src\HTML.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTMLDTD.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTMLGen.h" />
+ <ClInclude Include="..\..\..\src\HTNestedList.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTNews.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTParse.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTPlain.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTRules.h" />
+ <ClInclude Include="..\..\..\src\HTSaveToFile.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTStream.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTString.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTStyle.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTTCP.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTTelnet.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTTP.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\htutils.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTUU.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTWSRC.h" />
+ <ClInclude Include="..\..\..\src\LYBookmark.h" />
+ <ClInclude Include="..\..\..\src\LYCgi.h" />
+ <ClInclude Include="..\..\..\src\LYCharSets.h" />
+ <ClInclude Include="..\..\..\src\LYCharUtils.h" />
+ <ClInclude Include="..\..\..\src\LYCharVals.h" />
+ <ClInclude Include="..\..\..\src\LYClean.h" />
+ <ClInclude Include="..\..\..\src\LYCookie.h" />
+ <ClInclude Include="..\..\..\src\LYCurses.h" />
+ <ClInclude Include="..\..\..\src\LYDownload.h" />
+ <ClInclude Include="..\..\..\src\LYEdit.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\LYexit.h" />
+ <ClInclude Include="..\..\..\src\LYExtern.h" />
+ <ClInclude Include="..\..\..\src\LYGCurses.h" />
+ <ClInclude Include="..\..\..\src\LYGetFile.h" />
+ <ClInclude Include="..\..\..\src\LYGlobalDefs.h" />
+ <ClInclude Include="..\..\..\src\LYHash.h" />
+ <ClInclude Include="..\..\..\src\LYHistory.h" />
+ <ClInclude Include="..\..\..\src\LYJump.h" />
+ <ClInclude Include="..\..\..\src\LYJustify.h" />
+ <ClInclude Include="..\..\..\src\LYKeymap.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\LYLeaks.h" />
+ <ClInclude Include="..\..\..\src\LYList.h" />
+ <ClInclude Include="..\..\..\src\LYLocal.h" />
+ <ClInclude Include="..\..\..\src\LYMail.h" />
+ <ClInclude Include="..\..\..\src\LYMainLoop.h" />
+ <ClInclude Include="..\..\..\src\LYMap.h" />
+ <ClInclude Include="..\..\..\src\LYNews.h" />
+ <ClInclude Include="..\..\..\www\library\implementation\tidy_tls.h" />
+ <ClInclude Include="lynx_cfg.h" />
+ <ClInclude Include="..\..\..\src\LYOptions.h" />
+ <ClInclude Include="..\..\..\src\LYPrettySrc.h" />
+ <ClInclude Include="..\..\..\src\LYPrint.h" />
+ <ClInclude Include="..\..\..\src\LYrcFile.h" />
+ <ClInclude Include="..\..\..\src\LYReadCFG.h" />
+ <ClInclude Include="..\..\..\src\LYSearch.h" />
+ <ClInclude Include="..\..\..\src\LYSession.h" />
+ <ClInclude Include="..\..\..\src\LYShowInfo.h" />
+ <ClInclude Include="..\..\..\src\LYSignal.h" />
+ <ClInclude Include="..\..\..\src\LYStrings.h" />
+ <ClInclude Include="..\..\..\src\LYStructs.h" />
+ <ClInclude Include="..\..\..\src\LYStyle.h" />
+ <ClInclude Include="..\..\..\src\LYTraversal.h" />
+ <ClInclude Include="..\..\..\src\LYUpload.h" />
+ <ClInclude Include="..\..\..\src\LYUtils.h" />
+ <ClInclude Include="..\..\..\src\LYVMSdef.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\SGML.h" />
+ <ClInclude Include="..\..\..\src\structdump.h" />
+ <ClInclude Include="..\..\..\src\TRSTable.h" />
+ <ClInclude Include="..\..\..\src\UCAuto.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\UCAux.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\UCDefs.h" />
+ <ClInclude Include="..\..\..\src\UCdomap.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\UCMap.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\www_tcp.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\www_wait.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\makeuctb\makeuctb.vcxproj">
+ <Project>{3ef8c45c-fc77-47b8-a5b6-5f9034ece06e}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/BUILD/VS2012X32/lynx/lynx.vcxproj.filters b/BUILD/VS2012X32/lynx/lynx.vcxproj.filters
new file mode 100644
index 0000000..2da4473
--- /dev/null
+++ b/BUILD/VS2012X32/lynx/lynx.vcxproj.filters
@@ -0,0 +1,609 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+ <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+ </Filter>
+ <Filter Include="Header Files">
+ <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+ <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
+ </Filter>
+ <Filter Include="Resource Files">
+ <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
+ <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav</Extensions>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\src\DefaultStyle.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\lib\dirent.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\GridText.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTAABrow.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTAAProt.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTAAUtil.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTAccess.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\HTAlert.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTAnchor.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTAssoc.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTAtom.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTBTree.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTChunk.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTDOS.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTFile.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTFinger.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTFormat.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTFTP.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\HTFWriter.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTGopher.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTGroup.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\HTInit.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTLex.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTList.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTMIME.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\HTML.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTMLDTD.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTMLGen.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTNews.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTParse.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTPlain.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTRules.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTString.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTStyle.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTTCP.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTTelnet.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTTP.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTUU.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTWSRC.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYBookmark.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYCgi.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYCharSets.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYCharUtils.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYClean.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYCookie.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYCurses.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYDownload.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYEdit.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYEditmap.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYexit.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYExtern.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYForms.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYGetFile.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYHash.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYHistory.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYJump.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYKeymap.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYLeaks.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYList.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYLocal.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYMail.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYMain.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYMainLoop.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYMap.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYmktime.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYNews.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYOptions.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYPrettySrc.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYPrint.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYrcFile.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYReadCFG.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYSearch.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYSession.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYShowInfo.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYStrings.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYStyle.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYTraversal.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYUpload.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYUtils.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\parsdate.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\SGML.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\TRSTable.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\UCAuto.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\UCAux.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\UCdomap.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\Xsystem.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\..\..\src\AttrList.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\GridText.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTAABrow.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTAAProt.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTAAUtil.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTAccess.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\HTAlert.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTAnchor.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTAssoc.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTAtom.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTBTree.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTChunk.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTCJK.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTDOS.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HText.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTFile.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTFinger.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\HTFont.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTFormat.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\HTForms.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTFTP.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTFWriter.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTGopher.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTGroup.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTInit.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTioctl.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTLex.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTList.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTMIME.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\HTML.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTMLDTD.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTMLGen.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\HTNestedList.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTNews.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTParse.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTPlain.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTRules.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\HTSaveToFile.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTStream.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTString.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTStyle.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTTCP.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTTelnet.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTTP.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\htutils.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTUU.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTWSRC.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYBookmark.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYCgi.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYCharSets.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYCharUtils.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYCharVals.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYClean.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYCookie.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYCurses.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYDownload.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYEdit.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\LYexit.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYExtern.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYGCurses.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYGetFile.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYGlobalDefs.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYHash.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYHistory.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYJump.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYJustify.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYKeymap.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\LYLeaks.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYList.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYLocal.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYMail.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYMainLoop.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYMap.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYNews.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="lynx_cfg.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYOptions.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYPrettySrc.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYPrint.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYrcFile.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYReadCFG.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYSearch.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYSession.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYShowInfo.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYSignal.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYStrings.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYStructs.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYStyle.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYTraversal.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYUpload.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYUtils.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYVMSdef.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\SGML.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\structdump.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\TRSTable.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\UCAuto.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\UCAux.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\UCDefs.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\UCdomap.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\UCMap.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\www_tcp.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\www_wait.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\chrtrans\cp1251_uni.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\lymessages_en.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\userdefs.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\www\library\implementation\tidy_tls.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\lib\dirent.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\lib\zlib.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\lib\curses.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\lib\bzlib.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\lib\zconf.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/BUILD/VS2012X32/lynx/lynx_cfg.h b/BUILD/VS2012X32/lynx/lynx_cfg.h
new file mode 100644
index 0000000..095c1a0
--- /dev/null
+++ b/BUILD/VS2012X32/lynx/lynx_cfg.h
@@ -0,0 +1,70 @@
+// $LynxId: lynx_cfg.h,v 1.1 2011/05/28 13:07:55 tom Exp $
+// definitions abstracted from makefile.msc
+
+#ifndef LYNX_CFG_H
+#define LYNX_CFG_H 1
+
+#define __WIN32__
+#define _WINDOWS
+#define _WIN32_WINNT 0x0400
+#define WIN32_LEAN_AND_MEAN 1 // fixes redefinition of winsock2.h
+
+#define ACCESS_AUTH 1
+#define CJK_EX 1
+#define DIRED_SUPPORT 1
+#define DISP_PARTIAL 1
+#define DOSPATH 1
+#define USE_ALT_BINDINGS 1
+#define EXP_NESTED_TABLES 1
+#define HAVE_KEYPAD 1
+#define HAVE_PUTENV 1
+#define LONG_LIST 1
+#define NDEBUG 1
+#define NOSIGHUP 1
+#define NOUSERS 1
+#define NO_CONFIG_INFO 1
+#define NO_CUSERID 1
+#define NO_FILIO_H 1
+#define NO_TTYTYPE 1
+#define NO_UNISTD_H 1
+#define NO_UTMP 1
+#define OK_OVERRIDE 1
+#define SH_EX 1
+#define USE_CMD_LOGGING 1
+#define USE_EXTERNALS 1
+#define USE_FILE_UPLOAD 1
+#define USE_JUSTIFY_ELTS 1
+#define USE_MULTIBYTE_CURSES 1
+#define USE_PERSISTENT_COOKIES 1
+#define USE_PRETTYSRC 1
+#define USE_READPROGRESS 1
+#define USE_SCROLLBAR 1
+#define USE_SOURCE_CACHE 1
+#define USE_ZLIB 1
+#define WIN_EX 1
+
+// definitions to account for using this file (see HTUtils.h, userdefs.h)
+#define ANSI_VARARGS 1
+#define HAVE_GETCWD 1
+#define HAVE_STDARG_H 1
+#define HAVE_STDLIB_H 1
+#define LYNX_CFG_FILE "./lynx.cfg"
+#define UNDERLINE_LINKS FALSE
+#define socklen_t int
+
+// configuration choices
+#define PDCURSES 1
+#define USE_WINSOCK2_H 1
+
+#ifdef PDCURSES
+#define USE_COLOR_STYLE 1
+#define COLOR_CURSES 1
+#define FANCY_CURSES 1
+#endif
+
+#pragma warning (disable : 4244) /* conversion from 'xxx' to 'yyy', possible loss of data */
+#pragma warning (disable : 4267) /* conversion from 'xxx' to 'yyy', possible loss of data */
+#pragma warning (disable : 4311) /* 'type cast': pointer truncation from 'xxx' to 'yyy' FIXME */
+#pragma warning (disable : 4996) /* 'xxx': This function or variable may be unsafe. Consider using yyy instead. */
+
+#endif /* LYNX_CFG_H */
diff --git a/BUILD/VS2012X32/makeuctb/makeuctb.sln b/BUILD/VS2012X32/makeuctb/makeuctb.sln
new file mode 100644
index 0000000..9e3257d
--- /dev/null
+++ b/BUILD/VS2012X32/makeuctb/makeuctb.sln
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual C++ Express 2008
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "makeuctb", "makeuctb.vcproj", "{3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}.Debug|Win32.ActiveCfg = Debug|Win32
+ {3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}.Debug|Win32.Build.0 = Debug|Win32
+ {3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}.Release|Win32.ActiveCfg = Release|Win32
+ {3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}.Release|Win32.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/BUILD/VS2012X32/makeuctb/makeuctb.vcxproj b/BUILD/VS2012X32/makeuctb/makeuctb.vcxproj
new file mode 100644
index 0000000..54e0d01
--- /dev/null
+++ b/BUILD/VS2012X32/makeuctb/makeuctb.vcxproj
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}</ProjectGuid>
+ <RootNamespace>makeuctb</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <CustomBuildStep>
+ <Command>setlocal
+set MYDST=..\..\..\src\chrtrans
+copy $(TargetPath) %MYDST%
+cd %MYDST%
+call makehdrs
+endlocal
+</Command>
+ <Outputs>..\..\..\src\chrtrans\makeuctb.exe;..\..\..\src\chrtrans\def7_uni.h;..\..\..\src\chrtrans\cp1250_uni.h;..\..\..\src\chrtrans\cp1251_uni.h;..\..\..\src\chrtrans\cp1252_uni.h;..\..\..\src\chrtrans\cp1253_uni.h;..\..\..\src\chrtrans\cp1255_uni.h;..\..\..\src\chrtrans\cp1256_uni.h;..\..\..\src\chrtrans\cp1257_uni.h;..\..\..\src\chrtrans\cp437_uni.h;..\..\..\src\chrtrans\cp737_uni.h;..\..\..\src\chrtrans\cp775_uni.h;..\..\..\src\chrtrans\cp850_uni.h;..\..\..\src\chrtrans\cp852_uni.h;..\..\..\src\chrtrans\cp857_uni.h;..\..\..\src\chrtrans\cp862_uni.h;..\..\..\src\chrtrans\cp864_uni.h;..\..\..\src\chrtrans\cp866_uni.h;..\..\..\src\chrtrans\cp866u_uni.h;..\..\..\src\chrtrans\cp869_uni.h;..\..\..\src\chrtrans\dmcs_uni.h;..\..\..\src\chrtrans\hp_uni.h;..\..\..\src\chrtrans\iso01_uni.h;..\..\..\src\chrtrans\iso02_uni.h;..\..\..\src\chrtrans\iso03_uni.h;..\..\..\src\chrtrans\iso04_uni.h;..\..\..\src\chrtrans\iso05_uni.h;..\..\..\src\chrtrans\iso06_uni.h;..\..\..\src\chrtrans\iso07_uni.h;..\..\..\src\chrtrans\iso08_uni.h;..\..\..\src\chrtrans\iso09_uni.h;..\..\..\src\chrtrans\iso10_uni.h;..\..\..\src\chrtrans\iso13_uni.h;..\..\..\src\chrtrans\iso14_uni.h;..\..\..\src\chrtrans\iso15_uni.h;..\..\..\src\chrtrans\koi8r_uni.h;..\..\..\src\chrtrans\koi8u_uni.h;..\..\..\src\chrtrans\mac_uni.h;..\..\..\src\chrtrans\mnem2_suni.h;..\..\..\src\chrtrans\mnem_suni.h;..\..\..\src\chrtrans\next_uni.h;..\..\..\src\chrtrans\pt154_uni.h;..\..\..\src\chrtrans\rfc_suni.h;..\..\..\src\chrtrans\utf8_uni.h;..\..\..\src\chrtrans\viscii_uni.h;%(Outputs)</Outputs>
+ </CustomBuildStep>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\lynx;$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\lib;$(SolutionDir)..\..\..\WWW\Library\Implementation;$(SolutionDir)..\..\..\src;$(SolutionDir)..\..\..\src\chrtrans;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_MBCS;HAVE_CONFIG_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <CustomBuildStep>
+ <Command>setlocal
+set MYDST=..\..\..\src\chrtrans
+copy $(TargetPath) %MYDST%
+cd %MYDST%
+call makehdrs
+endlocal
+</Command>
+ <Outputs>..\..\..\src\chrtrans\makeuctb.exe;..\..\..\src\chrtrans\def7_uni.h;..\..\..\src\chrtrans\cp1250_uni.h;..\..\..\src\chrtrans\cp1251_uni.h;..\..\..\src\chrtrans\cp1252_uni.h;..\..\..\src\chrtrans\cp1253_uni.h;..\..\..\src\chrtrans\cp1255_uni.h;..\..\..\src\chrtrans\cp1256_uni.h;..\..\..\src\chrtrans\cp1257_uni.h;..\..\..\src\chrtrans\cp437_uni.h;..\..\..\src\chrtrans\cp737_uni.h;..\..\..\src\chrtrans\cp775_uni.h;..\..\..\src\chrtrans\cp850_uni.h;..\..\..\src\chrtrans\cp852_uni.h;..\..\..\src\chrtrans\cp857_uni.h;..\..\..\src\chrtrans\cp862_uni.h;..\..\..\src\chrtrans\cp864_uni.h;..\..\..\src\chrtrans\cp866_uni.h;..\..\..\src\chrtrans\cp866u_uni.h;..\..\..\src\chrtrans\cp869_uni.h;..\..\..\src\chrtrans\dmcs_uni.h;..\..\..\src\chrtrans\hp_uni.h;..\..\..\src\chrtrans\iso01_uni.h;..\..\..\src\chrtrans\iso02_uni.h;..\..\..\src\chrtrans\iso03_uni.h;..\..\..\src\chrtrans\iso04_uni.h;..\..\..\src\chrtrans\iso05_uni.h;..\..\..\src\chrtrans\iso06_uni.h;..\..\..\src\chrtrans\iso07_uni.h;..\..\..\src\chrtrans\iso08_uni.h;..\..\..\src\chrtrans\iso09_uni.h;..\..\..\src\chrtrans\iso10_uni.h;..\..\..\src\chrtrans\iso13_uni.h;..\..\..\src\chrtrans\iso14_uni.h;..\..\..\src\chrtrans\iso15_uni.h;..\..\..\src\chrtrans\koi8r_uni.h;..\..\..\src\chrtrans\koi8u_uni.h;..\..\..\src\chrtrans\mac_uni.h;..\..\..\src\chrtrans\mnem2_suni.h;..\..\..\src\chrtrans\mnem_suni.h;..\..\..\src\chrtrans\next_uni.h;..\..\..\src\chrtrans\pt154_uni.h;..\..\..\src\chrtrans\rfc_suni.h;..\..\..\src\chrtrans\utf8_uni.h;..\..\..\src\chrtrans\viscii_uni.h;%(Outputs)</Outputs>
+ </CustomBuildStep>
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\lynx;$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\lib;$(SolutionDir)..\..\..\WWW\Library\Implementation;$(SolutionDir)..\..\..\src;$(SolutionDir)..\..\..\src\chrtrans;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;HAVE_CONFIG_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\src\chrtrans\makeuctb.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\..\..\src\chrtrans\caselower.h" />
+ <ClInclude Include="..\..\..\src\chrtrans\entities.h" />
+ <ClInclude Include="..\..\..\src\chrtrans\jcuken_kb.h" />
+ <ClInclude Include="..\..\..\src\chrtrans\rot13_kb.h" />
+ <ClInclude Include="..\..\..\src\chrtrans\UCkd.h" />
+ <ClInclude Include="..\..\..\src\chrtrans\yawerty_kb.h" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/BUILD/VS2012X32/makeuctb/makeuctb.vcxproj.filters b/BUILD/VS2012X32/makeuctb/makeuctb.vcxproj.filters
new file mode 100644
index 0000000..87c5d40
--- /dev/null
+++ b/BUILD/VS2012X32/makeuctb/makeuctb.vcxproj.filters
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+ <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+ </Filter>
+ <Filter Include="Header Files">
+ <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+ <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
+ </Filter>
+ <Filter Include="Resource Files">
+ <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
+ <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav</Extensions>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\src\chrtrans\makeuctb.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\..\..\src\chrtrans\caselower.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\chrtrans\entities.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\chrtrans\jcuken_kb.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\chrtrans\rot13_kb.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\chrtrans\UCkd.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\chrtrans\yawerty_kb.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/BUILD/VS2012X64/clean.bat b/BUILD/VS2012X64/clean.bat
new file mode 100644
index 0000000..d353c45
--- /dev/null
+++ b/BUILD/VS2012X64/clean.bat
@@ -0,0 +1,40 @@
+@echo off
+@rem $LynxId: clean.bat,v 1.2 2018/03/18 23:17:43 tom Exp $
+@rem Remove all build-products in subdirectories, leaving only sources
+@rem (and unrecognized types)
+setlocal
+
+FOR /D %%d IN (*) DO call :dosoln %%d
+
+attrib -h *.suo /s
+
+del/f/s/q *.old
+del/f/s/q *.suo
+del/f/s/q *.sdf
+del/f/s/q *.user
+del/f/s/q *.xml
+
+attrib +r *.h /s
+attrib +r *.bat /s
+attrib +r *.sln /s
+attrib +r *.vcxproj* /s
+endlocal
+goto :eof
+
+:dosoln
+ setlocal
+ echo Cleanup %*
+ cd %1
+
+ set SOLN=
+ FOR %%d IN ( *.sln ) DO set SOLN=%%d
+ if not "x%SOLN%"=="x" goto :dosoln2
+
+ echo ?? Not a solution directory
+ goto :dosolnx
+
+:dosoln2
+ FOR /D %%d IN (*) DO rmdir /s /q %%d
+:dosolnx
+ endlocal
+ goto :eof
diff --git a/BUILD/VS2012X64/develop.bat b/BUILD/VS2012X64/develop.bat
new file mode 100644
index 0000000..7cde5d6
--- /dev/null
+++ b/BUILD/VS2012X64/develop.bat
@@ -0,0 +1,7 @@
+@echo off
+@rem $LynxId: develop.bat,v 1.2 2018/03/18 23:13:30 tom Exp $
+@rem ensure that all IDE files are writable
+
+attrib -r *.bat /s
+attrib -r *.sln /s
+attrib -r *.vcxproj /s \ No newline at end of file
diff --git a/BUILD/VS2012X64/lynx/lynx.sln b/BUILD/VS2012X64/lynx/lynx.sln
new file mode 100644
index 0000000..5934e66
--- /dev/null
+++ b/BUILD/VS2012X64/lynx/lynx.sln
@@ -0,0 +1,38 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Express 2013 for Windows Desktop
+VisualStudioVersion = 12.0.40629.0
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lynx", "lynx.vcxproj", "{77B6BED2-257D-4F7D-AA1B-D180875BD3BF}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "makeuctb", "..\makeuctb\makeuctb.vcxproj", "{3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Debug|x64 = Debug|x64
+ Release|Win32 = Release|Win32
+ Release|x64 = Release|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {77B6BED2-257D-4F7D-AA1B-D180875BD3BF}.Debug|Win32.ActiveCfg = Debug|Win32
+ {77B6BED2-257D-4F7D-AA1B-D180875BD3BF}.Debug|Win32.Build.0 = Debug|Win32
+ {77B6BED2-257D-4F7D-AA1B-D180875BD3BF}.Debug|x64.ActiveCfg = Debug|x64
+ {77B6BED2-257D-4F7D-AA1B-D180875BD3BF}.Debug|x64.Build.0 = Debug|x64
+ {77B6BED2-257D-4F7D-AA1B-D180875BD3BF}.Release|Win32.ActiveCfg = Release|Win32
+ {77B6BED2-257D-4F7D-AA1B-D180875BD3BF}.Release|Win32.Build.0 = Release|Win32
+ {77B6BED2-257D-4F7D-AA1B-D180875BD3BF}.Release|x64.ActiveCfg = Release|x64
+ {77B6BED2-257D-4F7D-AA1B-D180875BD3BF}.Release|x64.Build.0 = Release|x64
+ {3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}.Debug|Win32.ActiveCfg = Debug|Win32
+ {3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}.Debug|Win32.Build.0 = Debug|Win32
+ {3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}.Debug|x64.ActiveCfg = Debug|x64
+ {3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}.Debug|x64.Build.0 = Debug|x64
+ {3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}.Release|Win32.ActiveCfg = Release|Win32
+ {3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}.Release|Win32.Build.0 = Release|Win32
+ {3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}.Release|x64.ActiveCfg = Release|x64
+ {3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}.Release|x64.Build.0 = Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/BUILD/VS2012X64/lynx/lynx.vcxproj b/BUILD/VS2012X64/lynx/lynx.vcxproj
new file mode 100644
index 0000000..f3def43
--- /dev/null
+++ b/BUILD/VS2012X64/lynx/lynx.vcxproj
@@ -0,0 +1,384 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{77B6BED2-257D-4F7D-AA1B-D180875BD3BF}</ProjectGuid>
+ <RootNamespace>lynx</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\lynx;$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\lib;$(SolutionDir)..\..\..\WWW\Library\Implementation;$(SolutionDir)..\..\..\src;$(SolutionDir)..\..\..\src\chrtrans;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CONSOLE;HAVE_CONFIG_H;DONT_HAVE_TM_GMTOFF;_WIN_CC</PreprocessorDefinitions>
+ <PreprocessToFile>false</PreprocessToFile>
+ <PreprocessSuppressLineNumbers>false</PreprocessSuppressLineNumbers>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>pdcurses.lib;zlib.lib;wsock32.lib;user32.lib;advapi32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalLibraryDirectories>$(VcInstallDir)lib;$(SolutionDir)lib;$(SolutionDir)..\..\lib;$(SolutionDir)..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ <IgnoreSpecificDefaultLibraries>libc;libcmt;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\lynx;$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\lib;$(SolutionDir)..\..\..\WWW\Library\Implementation;$(SolutionDir)..\..\..\src;$(SolutionDir)..\..\..\src\chrtrans;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CONSOLE;HAVE_CONFIG_H;DONT_HAVE_TM_GMTOFF;_WIN_CC</PreprocessorDefinitions>
+ <PreprocessToFile>false</PreprocessToFile>
+ <PreprocessSuppressLineNumbers>false</PreprocessSuppressLineNumbers>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>pdcurses.lib;zlib.lib;wsock32.lib;user32.lib;advapi32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalLibraryDirectories>$(VcInstallDir)lib\amd64;$(SolutionDir)\lib;$(SolutionDir)..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ <IgnoreSpecificDefaultLibraries>libc;libcmt;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\lynx;$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\lib;$(SolutionDir)..\..\..\WWW\Library\Implementation;$(SolutionDir)..\..\..\src;$(SolutionDir)..\..\..\src\chrtrans;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CONSOLE;_MBCS;HAVE_CONFIG_H;DONT_HAVE_TM_GMTOFF;_WIN_CC</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>pdcurses.lib;zlib.lib;wsock32.lib;user32.lib;advapi32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalLibraryDirectories>$(VcInstallDir)lib;$(SolutionDir)\lib;$(SolutionDir)..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ <IgnoreSpecificDefaultLibraries>%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\lynx;$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\lib;$(SolutionDir)..\..\..\WWW\Library\Implementation;$(SolutionDir)..\..\..\src;$(SolutionDir)..\..\..\src\chrtrans;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CONSOLE;_MBCS;HAVE_CONFIG_H;DONT_HAVE_TM_GMTOFF;_WIN_CC</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>pdcurses.lib;zlib.lib;wsock32.lib;user32.lib;advapi32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalLibraryDirectories>$(VcInstallDir)lib\amd64;$(SolutionDir)\lib;$(SolutionDir)..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ <IgnoreSpecificDefaultLibraries>%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\src\DefaultStyle.c" />
+ <ClCompile Include="..\..\..\lib\dirent.c" />
+ <ClCompile Include="..\..\..\src\GridText.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTAABrow.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTAAProt.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTAAUtil.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTAccess.c" />
+ <ClCompile Include="..\..\..\src\HTAlert.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTAnchor.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTAssoc.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTAtom.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTBTree.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTChunk.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTDOS.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTFile.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTFinger.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTFormat.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTFTP.c" />
+ <ClCompile Include="..\..\..\src\HTFWriter.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTGopher.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTGroup.c" />
+ <ClCompile Include="..\..\..\src\HTInit.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTLex.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTList.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTMIME.c" />
+ <ClCompile Include="..\..\..\src\HTML.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTMLDTD.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTMLGen.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTNews.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTParse.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTPlain.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTRules.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTString.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTStyle.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTTCP.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTTelnet.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTTP.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTUU.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTWSRC.c" />
+ <ClCompile Include="..\..\..\src\LYBookmark.c" />
+ <ClCompile Include="..\..\..\src\LYCgi.c" />
+ <ClCompile Include="..\..\..\src\LYCharSets.c" />
+ <ClCompile Include="..\..\..\src\LYCharUtils.c" />
+ <ClCompile Include="..\..\..\src\LYClean.c" />
+ <ClCompile Include="..\..\..\src\LYCookie.c" />
+ <ClCompile Include="..\..\..\src\LYCurses.c" />
+ <ClCompile Include="..\..\..\src\LYDownload.c" />
+ <ClCompile Include="..\..\..\src\LYEdit.c" />
+ <ClCompile Include="..\..\..\src\LYEditmap.c" />
+ <ClCompile Include="..\..\..\src\LYexit.c" />
+ <ClCompile Include="..\..\..\src\LYExtern.c" />
+ <ClCompile Include="..\..\..\src\LYForms.c" />
+ <ClCompile Include="..\..\..\src\LYGetFile.c" />
+ <ClCompile Include="..\..\..\src\LYHash.c" />
+ <ClCompile Include="..\..\..\src\LYHistory.c" />
+ <ClCompile Include="..\..\..\src\LYJump.c" />
+ <ClCompile Include="..\..\..\src\LYKeymap.c" />
+ <ClCompile Include="..\..\..\src\LYLeaks.c" />
+ <ClCompile Include="..\..\..\src\LYList.c" />
+ <ClCompile Include="..\..\..\src\LYLocal.c" />
+ <ClCompile Include="..\..\..\src\LYMail.c" />
+ <ClCompile Include="..\..\..\src\LYMain.c" />
+ <ClCompile Include="..\..\..\src\LYMainLoop.c" />
+ <ClCompile Include="..\..\..\src\LYMap.c" />
+ <ClCompile Include="..\..\..\src\LYmktime.c" />
+ <ClCompile Include="..\..\..\src\LYNews.c" />
+ <ClCompile Include="..\..\..\src\LYOptions.c" />
+ <ClCompile Include="..\..\..\src\LYPrettySrc.c" />
+ <ClCompile Include="..\..\..\src\LYPrint.c" />
+ <ClCompile Include="..\..\..\src\LYrcFile.c" />
+ <ClCompile Include="..\..\..\src\LYReadCFG.c" />
+ <ClCompile Include="..\..\..\src\LYSearch.c" />
+ <ClCompile Include="..\..\..\src\LYSession.c" />
+ <ClCompile Include="..\..\..\src\LYShowInfo.c" />
+ <ClCompile Include="..\..\..\src\LYStrings.c" />
+ <ClCompile Include="..\..\..\src\LYStyle.c" />
+ <ClCompile Include="..\..\..\src\LYTraversal.c" />
+ <ClCompile Include="..\..\..\src\LYUpload.c" />
+ <ClCompile Include="..\..\..\src\LYUtils.c" />
+ <ClCompile Include="..\..\..\src\parsdate.c" />
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\SGML.c" />
+ <ClCompile Include="..\..\..\src\TRSTable.c" />
+ <ClCompile Include="..\..\..\src\UCAuto.c" />
+ <ClCompile Include="..\..\..\src\UCAux.c" />
+ <ClCompile Include="..\..\..\src\UCdomap.c" />
+ <ClCompile Include="..\..\..\src\Xsystem.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\..\..\lib\bzlib.h" />
+ <ClInclude Include="..\..\..\lib\curses.h" />
+ <ClInclude Include="..\..\..\lib\dirent.h" />
+ <ClInclude Include="..\..\..\lib\zconf.h" />
+ <ClInclude Include="..\..\..\lib\zlib.h" />
+ <ClInclude Include="..\..\..\lymessages_en.h" />
+ <ClInclude Include="..\..\..\src\AttrList.h" />
+ <ClInclude Include="..\..\..\src\chrtrans\cp1251_uni.h" />
+ <ClInclude Include="..\..\..\src\GridText.h" />
+ <ClInclude Include="..\..\..\userdefs.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTAABrow.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTAAProt.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTAAUtil.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTAccess.h" />
+ <ClInclude Include="..\..\..\src\HTAlert.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTAnchor.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTAssoc.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTAtom.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTBTree.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTChunk.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTCJK.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTDOS.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HText.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTFile.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTFinger.h" />
+ <ClInclude Include="..\..\..\src\HTFont.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTFormat.h" />
+ <ClInclude Include="..\..\..\src\HTForms.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTFTP.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTFWriter.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTGopher.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTGroup.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTInit.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTioctl.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTLex.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTList.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTMIME.h" />
+ <ClInclude Include="..\..\..\src\HTML.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTMLDTD.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTMLGen.h" />
+ <ClInclude Include="..\..\..\src\HTNestedList.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTNews.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTParse.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTPlain.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTRules.h" />
+ <ClInclude Include="..\..\..\src\HTSaveToFile.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTStream.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTString.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTStyle.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTTCP.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTTelnet.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTTP.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\htutils.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTUU.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTWSRC.h" />
+ <ClInclude Include="..\..\..\src\LYBookmark.h" />
+ <ClInclude Include="..\..\..\src\LYCgi.h" />
+ <ClInclude Include="..\..\..\src\LYCharSets.h" />
+ <ClInclude Include="..\..\..\src\LYCharUtils.h" />
+ <ClInclude Include="..\..\..\src\LYCharVals.h" />
+ <ClInclude Include="..\..\..\src\LYClean.h" />
+ <ClInclude Include="..\..\..\src\LYCookie.h" />
+ <ClInclude Include="..\..\..\src\LYCurses.h" />
+ <ClInclude Include="..\..\..\src\LYDownload.h" />
+ <ClInclude Include="..\..\..\src\LYEdit.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\LYexit.h" />
+ <ClInclude Include="..\..\..\src\LYExtern.h" />
+ <ClInclude Include="..\..\..\src\LYGCurses.h" />
+ <ClInclude Include="..\..\..\src\LYGetFile.h" />
+ <ClInclude Include="..\..\..\src\LYGlobalDefs.h" />
+ <ClInclude Include="..\..\..\src\LYHash.h" />
+ <ClInclude Include="..\..\..\src\LYHistory.h" />
+ <ClInclude Include="..\..\..\src\LYJump.h" />
+ <ClInclude Include="..\..\..\src\LYJustify.h" />
+ <ClInclude Include="..\..\..\src\LYKeymap.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\LYLeaks.h" />
+ <ClInclude Include="..\..\..\src\LYList.h" />
+ <ClInclude Include="..\..\..\src\LYLocal.h" />
+ <ClInclude Include="..\..\..\src\LYMail.h" />
+ <ClInclude Include="..\..\..\src\LYMainLoop.h" />
+ <ClInclude Include="..\..\..\src\LYMap.h" />
+ <ClInclude Include="..\..\..\src\LYNews.h" />
+ <ClInclude Include="..\..\..\www\library\implementation\tidy_tls.h" />
+ <ClInclude Include="lynx_cfg.h" />
+ <ClInclude Include="..\..\..\src\LYOptions.h" />
+ <ClInclude Include="..\..\..\src\LYPrettySrc.h" />
+ <ClInclude Include="..\..\..\src\LYPrint.h" />
+ <ClInclude Include="..\..\..\src\LYrcFile.h" />
+ <ClInclude Include="..\..\..\src\LYReadCFG.h" />
+ <ClInclude Include="..\..\..\src\LYSearch.h" />
+ <ClInclude Include="..\..\..\src\LYSession.h" />
+ <ClInclude Include="..\..\..\src\LYShowInfo.h" />
+ <ClInclude Include="..\..\..\src\LYSignal.h" />
+ <ClInclude Include="..\..\..\src\LYStrings.h" />
+ <ClInclude Include="..\..\..\src\LYStructs.h" />
+ <ClInclude Include="..\..\..\src\LYStyle.h" />
+ <ClInclude Include="..\..\..\src\LYTraversal.h" />
+ <ClInclude Include="..\..\..\src\LYUpload.h" />
+ <ClInclude Include="..\..\..\src\LYUtils.h" />
+ <ClInclude Include="..\..\..\src\LYVMSdef.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\SGML.h" />
+ <ClInclude Include="..\..\..\src\structdump.h" />
+ <ClInclude Include="..\..\..\src\TRSTable.h" />
+ <ClInclude Include="..\..\..\src\UCAuto.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\UCAux.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\UCDefs.h" />
+ <ClInclude Include="..\..\..\src\UCdomap.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\UCMap.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\www_tcp.h" />
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\www_wait.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\makeuctb\makeuctb.vcxproj">
+ <Project>{3ef8c45c-fc77-47b8-a5b6-5f9034ece06e}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/BUILD/VS2012X64/lynx/lynx.vcxproj.filters b/BUILD/VS2012X64/lynx/lynx.vcxproj.filters
new file mode 100644
index 0000000..2da4473
--- /dev/null
+++ b/BUILD/VS2012X64/lynx/lynx.vcxproj.filters
@@ -0,0 +1,609 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+ <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+ </Filter>
+ <Filter Include="Header Files">
+ <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+ <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
+ </Filter>
+ <Filter Include="Resource Files">
+ <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
+ <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav</Extensions>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\src\DefaultStyle.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\lib\dirent.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\GridText.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTAABrow.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTAAProt.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTAAUtil.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTAccess.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\HTAlert.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTAnchor.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTAssoc.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTAtom.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTBTree.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTChunk.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTDOS.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTFile.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTFinger.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTFormat.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTFTP.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\HTFWriter.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTGopher.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTGroup.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\HTInit.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTLex.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTList.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTMIME.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\HTML.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTMLDTD.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTMLGen.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTNews.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTParse.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTPlain.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTRules.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTString.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTStyle.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTTCP.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTTelnet.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTTP.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTUU.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\HTWSRC.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYBookmark.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYCgi.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYCharSets.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYCharUtils.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYClean.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYCookie.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYCurses.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYDownload.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYEdit.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYEditmap.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYexit.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYExtern.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYForms.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYGetFile.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYHash.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYHistory.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYJump.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYKeymap.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYLeaks.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYList.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYLocal.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYMail.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYMain.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYMainLoop.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYMap.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYmktime.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYNews.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYOptions.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYPrettySrc.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYPrint.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYrcFile.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYReadCFG.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYSearch.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYSession.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYShowInfo.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYStrings.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYStyle.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYTraversal.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYUpload.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\LYUtils.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\parsdate.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\WWW\Library\Implementation\SGML.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\TRSTable.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\UCAuto.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\UCAux.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\UCdomap.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\src\Xsystem.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\..\..\src\AttrList.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\GridText.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTAABrow.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTAAProt.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTAAUtil.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTAccess.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\HTAlert.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTAnchor.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTAssoc.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTAtom.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTBTree.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTChunk.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTCJK.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTDOS.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HText.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTFile.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTFinger.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\HTFont.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTFormat.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\HTForms.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTFTP.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTFWriter.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTGopher.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTGroup.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTInit.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTioctl.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTLex.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTList.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTMIME.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\HTML.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTMLDTD.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTMLGen.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\HTNestedList.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTNews.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTParse.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTPlain.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTRules.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\HTSaveToFile.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTStream.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTString.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTStyle.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTTCP.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTTelnet.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTTP.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\htutils.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTUU.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\HTWSRC.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYBookmark.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYCgi.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYCharSets.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYCharUtils.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYCharVals.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYClean.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYCookie.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYCurses.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYDownload.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYEdit.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\LYexit.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYExtern.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYGCurses.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYGetFile.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYGlobalDefs.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYHash.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYHistory.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYJump.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYJustify.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYKeymap.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\LYLeaks.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYList.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYLocal.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYMail.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYMainLoop.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYMap.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYNews.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="lynx_cfg.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYOptions.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYPrettySrc.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYPrint.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYrcFile.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYReadCFG.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYSearch.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYSession.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYShowInfo.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYSignal.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYStrings.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYStructs.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYStyle.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYTraversal.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYUpload.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYUtils.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\LYVMSdef.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\SGML.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\structdump.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\TRSTable.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\UCAuto.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\UCAux.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\UCDefs.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\UCdomap.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\UCMap.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\www_tcp.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\WWW\Library\Implementation\www_wait.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\chrtrans\cp1251_uni.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\lymessages_en.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\userdefs.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\www\library\implementation\tidy_tls.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\lib\dirent.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\lib\zlib.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\lib\curses.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\lib\bzlib.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\lib\zconf.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/BUILD/VS2012X64/lynx/lynx_cfg.h b/BUILD/VS2012X64/lynx/lynx_cfg.h
new file mode 100644
index 0000000..095c1a0
--- /dev/null
+++ b/BUILD/VS2012X64/lynx/lynx_cfg.h
@@ -0,0 +1,70 @@
+// $LynxId: lynx_cfg.h,v 1.1 2011/05/28 13:07:55 tom Exp $
+// definitions abstracted from makefile.msc
+
+#ifndef LYNX_CFG_H
+#define LYNX_CFG_H 1
+
+#define __WIN32__
+#define _WINDOWS
+#define _WIN32_WINNT 0x0400
+#define WIN32_LEAN_AND_MEAN 1 // fixes redefinition of winsock2.h
+
+#define ACCESS_AUTH 1
+#define CJK_EX 1
+#define DIRED_SUPPORT 1
+#define DISP_PARTIAL 1
+#define DOSPATH 1
+#define USE_ALT_BINDINGS 1
+#define EXP_NESTED_TABLES 1
+#define HAVE_KEYPAD 1
+#define HAVE_PUTENV 1
+#define LONG_LIST 1
+#define NDEBUG 1
+#define NOSIGHUP 1
+#define NOUSERS 1
+#define NO_CONFIG_INFO 1
+#define NO_CUSERID 1
+#define NO_FILIO_H 1
+#define NO_TTYTYPE 1
+#define NO_UNISTD_H 1
+#define NO_UTMP 1
+#define OK_OVERRIDE 1
+#define SH_EX 1
+#define USE_CMD_LOGGING 1
+#define USE_EXTERNALS 1
+#define USE_FILE_UPLOAD 1
+#define USE_JUSTIFY_ELTS 1
+#define USE_MULTIBYTE_CURSES 1
+#define USE_PERSISTENT_COOKIES 1
+#define USE_PRETTYSRC 1
+#define USE_READPROGRESS 1
+#define USE_SCROLLBAR 1
+#define USE_SOURCE_CACHE 1
+#define USE_ZLIB 1
+#define WIN_EX 1
+
+// definitions to account for using this file (see HTUtils.h, userdefs.h)
+#define ANSI_VARARGS 1
+#define HAVE_GETCWD 1
+#define HAVE_STDARG_H 1
+#define HAVE_STDLIB_H 1
+#define LYNX_CFG_FILE "./lynx.cfg"
+#define UNDERLINE_LINKS FALSE
+#define socklen_t int
+
+// configuration choices
+#define PDCURSES 1
+#define USE_WINSOCK2_H 1
+
+#ifdef PDCURSES
+#define USE_COLOR_STYLE 1
+#define COLOR_CURSES 1
+#define FANCY_CURSES 1
+#endif
+
+#pragma warning (disable : 4244) /* conversion from 'xxx' to 'yyy', possible loss of data */
+#pragma warning (disable : 4267) /* conversion from 'xxx' to 'yyy', possible loss of data */
+#pragma warning (disable : 4311) /* 'type cast': pointer truncation from 'xxx' to 'yyy' FIXME */
+#pragma warning (disable : 4996) /* 'xxx': This function or variable may be unsafe. Consider using yyy instead. */
+
+#endif /* LYNX_CFG_H */
diff --git a/BUILD/VS2012X64/makeuctb/makeuctb.sln b/BUILD/VS2012X64/makeuctb/makeuctb.sln
new file mode 100644
index 0000000..9e3257d
--- /dev/null
+++ b/BUILD/VS2012X64/makeuctb/makeuctb.sln
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual C++ Express 2008
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "makeuctb", "makeuctb.vcproj", "{3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}.Debug|Win32.ActiveCfg = Debug|Win32
+ {3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}.Debug|Win32.Build.0 = Debug|Win32
+ {3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}.Release|Win32.ActiveCfg = Release|Win32
+ {3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}.Release|Win32.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/BUILD/VS2012X64/makeuctb/makeuctb.vcxproj b/BUILD/VS2012X64/makeuctb/makeuctb.vcxproj
new file mode 100644
index 0000000..2a9d7f3
--- /dev/null
+++ b/BUILD/VS2012X64/makeuctb/makeuctb.vcxproj
@@ -0,0 +1,213 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{3EF8C45C-FC77-47B8-A5B6-5F9034ECE06E}</ProjectGuid>
+ <RootNamespace>makeuctb</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <CustomBuildStep>
+ <Command>setlocal
+set MYDST=..\..\..\src\chrtrans
+copy $(TargetPath) %MYDST%
+cd %MYDST%
+call makehdrs
+endlocal
+</Command>
+ <Outputs>..\..\..\src\chrtrans\makeuctb.exe;..\..\..\src\chrtrans\def7_uni.h;..\..\..\src\chrtrans\cp1250_uni.h;..\..\..\src\chrtrans\cp1251_uni.h;..\..\..\src\chrtrans\cp1252_uni.h;..\..\..\src\chrtrans\cp1253_uni.h;..\..\..\src\chrtrans\cp1255_uni.h;..\..\..\src\chrtrans\cp1256_uni.h;..\..\..\src\chrtrans\cp1257_uni.h;..\..\..\src\chrtrans\cp437_uni.h;..\..\..\src\chrtrans\cp737_uni.h;..\..\..\src\chrtrans\cp775_uni.h;..\..\..\src\chrtrans\cp850_uni.h;..\..\..\src\chrtrans\cp852_uni.h;..\..\..\src\chrtrans\cp857_uni.h;..\..\..\src\chrtrans\cp862_uni.h;..\..\..\src\chrtrans\cp864_uni.h;..\..\..\src\chrtrans\cp866_uni.h;..\..\..\src\chrtrans\cp866u_uni.h;..\..\..\src\chrtrans\cp869_uni.h;..\..\..\src\chrtrans\dmcs_uni.h;..\..\..\src\chrtrans\hp_uni.h;..\..\..\src\chrtrans\iso01_uni.h;..\..\..\src\chrtrans\iso02_uni.h;..\..\..\src\chrtrans\iso03_uni.h;..\..\..\src\chrtrans\iso04_uni.h;..\..\..\src\chrtrans\iso05_uni.h;..\..\..\src\chrtrans\iso06_uni.h;..\..\..\src\chrtrans\iso07_uni.h;..\..\..\src\chrtrans\iso08_uni.h;..\..\..\src\chrtrans\iso09_uni.h;..\..\..\src\chrtrans\iso10_uni.h;..\..\..\src\chrtrans\iso13_uni.h;..\..\..\src\chrtrans\iso14_uni.h;..\..\..\src\chrtrans\iso15_uni.h;..\..\..\src\chrtrans\koi8r_uni.h;..\..\..\src\chrtrans\koi8u_uni.h;..\..\..\src\chrtrans\mac_uni.h;..\..\..\src\chrtrans\mnem2_suni.h;..\..\..\src\chrtrans\mnem_suni.h;..\..\..\src\chrtrans\next_uni.h;..\..\..\src\chrtrans\pt154_uni.h;..\..\..\src\chrtrans\rfc_suni.h;..\..\..\src\chrtrans\utf8_uni.h;..\..\..\src\chrtrans\viscii_uni.h;%(Outputs)</Outputs>
+ </CustomBuildStep>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\lynx;$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\lib;$(SolutionDir)..\..\..\WWW\Library\Implementation;$(SolutionDir)..\..\..\src;$(SolutionDir)..\..\..\src\chrtrans;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_MBCS;HAVE_CONFIG_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <CustomBuildStep>
+ <Command>setlocal
+set MYDST=..\..\..\src\chrtrans
+copy $(TargetPath) %MYDST%
+cd %MYDST%
+call makehdrs
+endlocal
+</Command>
+ <Outputs>..\..\..\src\chrtrans\makeuctb.exe;..\..\..\src\chrtrans\def7_uni.h;..\..\..\src\chrtrans\cp1250_uni.h;..\..\..\src\chrtrans\cp1251_uni.h;..\..\..\src\chrtrans\cp1252_uni.h;..\..\..\src\chrtrans\cp1253_uni.h;..\..\..\src\chrtrans\cp1255_uni.h;..\..\..\src\chrtrans\cp1256_uni.h;..\..\..\src\chrtrans\cp1257_uni.h;..\..\..\src\chrtrans\cp437_uni.h;..\..\..\src\chrtrans\cp737_uni.h;..\..\..\src\chrtrans\cp775_uni.h;..\..\..\src\chrtrans\cp850_uni.h;..\..\..\src\chrtrans\cp852_uni.h;..\..\..\src\chrtrans\cp857_uni.h;..\..\..\src\chrtrans\cp862_uni.h;..\..\..\src\chrtrans\cp864_uni.h;..\..\..\src\chrtrans\cp866_uni.h;..\..\..\src\chrtrans\cp866u_uni.h;..\..\..\src\chrtrans\cp869_uni.h;..\..\..\src\chrtrans\dmcs_uni.h;..\..\..\src\chrtrans\hp_uni.h;..\..\..\src\chrtrans\iso01_uni.h;..\..\..\src\chrtrans\iso02_uni.h;..\..\..\src\chrtrans\iso03_uni.h;..\..\..\src\chrtrans\iso04_uni.h;..\..\..\src\chrtrans\iso05_uni.h;..\..\..\src\chrtrans\iso06_uni.h;..\..\..\src\chrtrans\iso07_uni.h;..\..\..\src\chrtrans\iso08_uni.h;..\..\..\src\chrtrans\iso09_uni.h;..\..\..\src\chrtrans\iso10_uni.h;..\..\..\src\chrtrans\iso13_uni.h;..\..\..\src\chrtrans\iso14_uni.h;..\..\..\src\chrtrans\iso15_uni.h;..\..\..\src\chrtrans\koi8r_uni.h;..\..\..\src\chrtrans\koi8u_uni.h;..\..\..\src\chrtrans\mac_uni.h;..\..\..\src\chrtrans\mnem2_suni.h;..\..\..\src\chrtrans\mnem_suni.h;..\..\..\src\chrtrans\next_uni.h;..\..\..\src\chrtrans\pt154_uni.h;..\..\..\src\chrtrans\rfc_suni.h;..\..\..\src\chrtrans\utf8_uni.h;..\..\..\src\chrtrans\viscii_uni.h;%(Outputs)</Outputs>
+ </CustomBuildStep>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\lynx;$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\lib;$(SolutionDir)..\..\..\WWW\Library\Implementation;$(SolutionDir)..\..\..\src;$(SolutionDir)..\..\..\src\chrtrans;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_MBCS;HAVE_CONFIG_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <CustomBuildStep>
+ <Command>setlocal
+set MYDST=..\..\..\src\chrtrans
+copy $(TargetPath) %MYDST%
+cd %MYDST%
+call makehdrs
+endlocal
+</Command>
+ <Outputs>..\..\..\src\chrtrans\makeuctb.exe;..\..\..\src\chrtrans\def7_uni.h;..\..\..\src\chrtrans\cp1250_uni.h;..\..\..\src\chrtrans\cp1251_uni.h;..\..\..\src\chrtrans\cp1252_uni.h;..\..\..\src\chrtrans\cp1253_uni.h;..\..\..\src\chrtrans\cp1255_uni.h;..\..\..\src\chrtrans\cp1256_uni.h;..\..\..\src\chrtrans\cp1257_uni.h;..\..\..\src\chrtrans\cp437_uni.h;..\..\..\src\chrtrans\cp737_uni.h;..\..\..\src\chrtrans\cp775_uni.h;..\..\..\src\chrtrans\cp850_uni.h;..\..\..\src\chrtrans\cp852_uni.h;..\..\..\src\chrtrans\cp857_uni.h;..\..\..\src\chrtrans\cp862_uni.h;..\..\..\src\chrtrans\cp864_uni.h;..\..\..\src\chrtrans\cp866_uni.h;..\..\..\src\chrtrans\cp866u_uni.h;..\..\..\src\chrtrans\cp869_uni.h;..\..\..\src\chrtrans\dmcs_uni.h;..\..\..\src\chrtrans\hp_uni.h;..\..\..\src\chrtrans\iso01_uni.h;..\..\..\src\chrtrans\iso02_uni.h;..\..\..\src\chrtrans\iso03_uni.h;..\..\..\src\chrtrans\iso04_uni.h;..\..\..\src\chrtrans\iso05_uni.h;..\..\..\src\chrtrans\iso06_uni.h;..\..\..\src\chrtrans\iso07_uni.h;..\..\..\src\chrtrans\iso08_uni.h;..\..\..\src\chrtrans\iso09_uni.h;..\..\..\src\chrtrans\iso10_uni.h;..\..\..\src\chrtrans\iso13_uni.h;..\..\..\src\chrtrans\iso14_uni.h;..\..\..\src\chrtrans\iso15_uni.h;..\..\..\src\chrtrans\koi8r_uni.h;..\..\..\src\chrtrans\koi8u_uni.h;..\..\..\src\chrtrans\mac_uni.h;..\..\..\src\chrtrans\mnem2_suni.h;..\..\..\src\chrtrans\mnem_suni.h;..\..\..\src\chrtrans\next_uni.h;..\..\..\src\chrtrans\pt154_uni.h;..\..\..\src\chrtrans\rfc_suni.h;..\..\..\src\chrtrans\utf8_uni.h;..\..\..\src\chrtrans\viscii_uni.h;%(Outputs)</Outputs>
+ </CustomBuildStep>
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\lynx;$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\lib;$(SolutionDir)..\..\..\WWW\Library\Implementation;$(SolutionDir)..\..\..\src;$(SolutionDir)..\..\..\src\chrtrans;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;HAVE_CONFIG_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <CustomBuildStep>
+ <Command>setlocal
+set MYDST=..\..\..\src\chrtrans
+copy $(TargetPath) %MYDST%
+cd %MYDST%
+call makehdrs
+endlocal
+</Command>
+ <Outputs>..\..\..\src\chrtrans\makeuctb.exe;..\..\..\src\chrtrans\def7_uni.h;..\..\..\src\chrtrans\cp1250_uni.h;..\..\..\src\chrtrans\cp1251_uni.h;..\..\..\src\chrtrans\cp1252_uni.h;..\..\..\src\chrtrans\cp1253_uni.h;..\..\..\src\chrtrans\cp1255_uni.h;..\..\..\src\chrtrans\cp1256_uni.h;..\..\..\src\chrtrans\cp1257_uni.h;..\..\..\src\chrtrans\cp437_uni.h;..\..\..\src\chrtrans\cp737_uni.h;..\..\..\src\chrtrans\cp775_uni.h;..\..\..\src\chrtrans\cp850_uni.h;..\..\..\src\chrtrans\cp852_uni.h;..\..\..\src\chrtrans\cp857_uni.h;..\..\..\src\chrtrans\cp862_uni.h;..\..\..\src\chrtrans\cp864_uni.h;..\..\..\src\chrtrans\cp866_uni.h;..\..\..\src\chrtrans\cp866u_uni.h;..\..\..\src\chrtrans\cp869_uni.h;..\..\..\src\chrtrans\dmcs_uni.h;..\..\..\src\chrtrans\hp_uni.h;..\..\..\src\chrtrans\iso01_uni.h;..\..\..\src\chrtrans\iso02_uni.h;..\..\..\src\chrtrans\iso03_uni.h;..\..\..\src\chrtrans\iso04_uni.h;..\..\..\src\chrtrans\iso05_uni.h;..\..\..\src\chrtrans\iso06_uni.h;..\..\..\src\chrtrans\iso07_uni.h;..\..\..\src\chrtrans\iso08_uni.h;..\..\..\src\chrtrans\iso09_uni.h;..\..\..\src\chrtrans\iso10_uni.h;..\..\..\src\chrtrans\iso13_uni.h;..\..\..\src\chrtrans\iso14_uni.h;..\..\..\src\chrtrans\iso15_uni.h;..\..\..\src\chrtrans\koi8r_uni.h;..\..\..\src\chrtrans\koi8u_uni.h;..\..\..\src\chrtrans\mac_uni.h;..\..\..\src\chrtrans\mnem2_suni.h;..\..\..\src\chrtrans\mnem_suni.h;..\..\..\src\chrtrans\next_uni.h;..\..\..\src\chrtrans\pt154_uni.h;..\..\..\src\chrtrans\rfc_suni.h;..\..\..\src\chrtrans\utf8_uni.h;..\..\..\src\chrtrans\viscii_uni.h;%(Outputs)</Outputs>
+ </CustomBuildStep>
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\lynx;$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\lib;$(SolutionDir)..\..\..\WWW\Library\Implementation;$(SolutionDir)..\..\..\src;$(SolutionDir)..\..\..\src\chrtrans;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;HAVE_CONFIG_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\src\chrtrans\makeuctb.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\..\..\src\chrtrans\caselower.h" />
+ <ClInclude Include="..\..\..\src\chrtrans\entities.h" />
+ <ClInclude Include="..\..\..\src\chrtrans\jcuken_kb.h" />
+ <ClInclude Include="..\..\..\src\chrtrans\rot13_kb.h" />
+ <ClInclude Include="..\..\..\src\chrtrans\UCkd.h" />
+ <ClInclude Include="..\..\..\src\chrtrans\yawerty_kb.h" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/BUILD/VS2012X64/makeuctb/makeuctb.vcxproj.filters b/BUILD/VS2012X64/makeuctb/makeuctb.vcxproj.filters
new file mode 100644
index 0000000..87c5d40
--- /dev/null
+++ b/BUILD/VS2012X64/makeuctb/makeuctb.vcxproj.filters
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+ <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+ </Filter>
+ <Filter Include="Header Files">
+ <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+ <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
+ </Filter>
+ <Filter Include="Resource Files">
+ <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
+ <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav</Extensions>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\src\chrtrans\makeuctb.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\..\..\src\chrtrans\caselower.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\chrtrans\entities.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\chrtrans\jcuken_kb.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\chrtrans\rot13_kb.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\chrtrans\UCkd.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\chrtrans\yawerty_kb.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/BUILD/VS6/clean.bat b/BUILD/VS6/clean.bat
new file mode 100644
index 0000000..5b51985
--- /dev/null
+++ b/BUILD/VS6/clean.bat
@@ -0,0 +1,27 @@
+@echo off
+@rem $LynxId: clean.bat,v 1.1 2007/07/01 21:52:45 tom Exp $
+@rem Remove all build-products in subdirectories, leaving only sources (and unrecognized types)
+
+del/f/s/q *.aps
+del/f/s/q *.bsc
+del/f/s/q *.exe
+del/f/s/q *.exp
+del/f/s/q *.idb
+del/f/s/q *.ilk
+del/f/s/q *.lib
+del/f/s/q *.ncb
+del/f/s/q *.obj
+del/f/s/q *.opt
+del/f/s/q *.pch
+del/f/s/q *.pdb
+del/f/s/q *.plg
+del/f/s/q *.res
+del/f/s/q *.sbr
+del/f/s/q *.suo
+
+del/f/s/q ne*.h
+del/f/s/q BuildLog.htm
+
+attrib +r *.bat /s
+attrib +r *.dsp /s
+attrib +r *.dsw /s
diff --git a/BUILD/VS6/develop.bat b/BUILD/VS6/develop.bat
new file mode 100644
index 0000000..70c0c24
--- /dev/null
+++ b/BUILD/VS6/develop.bat
@@ -0,0 +1,7 @@
+@echo off
+@rem $LynxId: develop.bat,v 1.1 2007/07/01 21:52:50 tom Exp $
+@rem ensure that all IDE files are writable
+
+attrib -r *.bat /s
+attrib -r *.dsp /s
+attrib -r *.dsw /s \ No newline at end of file
diff --git a/BUILD/VS6/lynx/lynx.dsw b/BUILD/VS6/lynx/lynx.dsw
new file mode 100644
index 0000000..3ef547d
--- /dev/null
+++ b/BUILD/VS6/lynx/lynx.dsw
@@ -0,0 +1,44 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "lynx"=".\lynx\lynx.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name makeuctb
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "makeuctb"=".\makeuctb\makeuctb.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/BUILD/VS6/lynx/lynx/lynx.dsp b/BUILD/VS6/lynx/lynx/lynx.dsp
new file mode 100644
index 0000000..b7f56f9
--- /dev/null
+++ b/BUILD/VS6/lynx/lynx/lynx.dsp
@@ -0,0 +1,849 @@
+# Microsoft Developer Studio Project File - Name="lynx" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=lynx - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "lynx.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "lynx.mak" CFG="lynx - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "lynx - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "lynx - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "lynx - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /I "..\..\..\..\src" /I "..\..\..\..\src\chrtrans" /I "..\..\..\..\WWW\Library\Implementation" /I "..\..\..\..\lib" /I "..\..\..\.." /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_WINDOWS" /D "DOSPATH" /D "NO_UNISTD_H" /D "__WIN32__" /D "WIN_EX" /D "NOUSERS" /D "DIRED_SUPPORT" /D "DISP_PARTIAL" /D "DONT_HAVE_TM_GMTOFF" /D "HAVE_KEYPAD" /D "NOSIGHUP" /D "NO_TTYTYPE" /D "NO_UTMP" /D "SH_EX" /D "USE_EXTERNALS" /D "USE_FILE_UPLOAD" /D "USE_MULTIBYTE_CURSES" /D "USE_PERSISTENT_COOKIES" /D "USE_PRETTYSRC" /D "USE_READPROGRESS" /D "USE_SCROLLBAR" /D "USE_SOURCE_CACHE" /D "USE_ZLIB" /D "PDCURSES" /D "COLOR_CURSES" /D "FANCY_CURSES" /D "USE_COLOR_STYLE" /D "USE_WINSOCK2_H" /D _WIN32_WINNT=0x0400 /YX /FD /c
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib pdcurses.lib zlib.lib /nologo /subsystem:console /machine:I386 /nodefaultlib:"libcmt" /libpath:"..\..\..\..\lib"
+
+!ELSEIF "$(CFG)" == "lynx - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "..\..\..\..\src" /I "..\..\..\..\src\chrtrans" /I "..\..\..\..\WWW\Library\Implementation" /I "..\..\..\..\lib" /I "..\..\..\.." /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_WINDOWS" /D "DOSPATH" /D "NO_UNISTD_H" /D "__WIN32__" /D "WIN_EX" /D "NOUSERS" /D "DIRED_SUPPORT" /D "DISP_PARTIAL" /D "DONT_HAVE_TM_GMTOFF" /D "HAVE_KEYPAD" /D "NOSIGHUP" /D "NO_TTYTYPE" /D "NO_UTMP" /D "SH_EX" /D "USE_EXTERNALS" /D "USE_FILE_UPLOAD" /D "USE_MULTIBYTE_CURSES" /D "USE_PERSISTENT_COOKIES" /D "USE_PRETTYSRC" /D "USE_READPROGRESS" /D "USE_SCROLLBAR" /D "USE_SOURCE_CACHE" /D "USE_ZLIB" /D "PDCURSES" /D "COLOR_CURSES" /D "FANCY_CURSES" /D "USE_COLOR_STYLE" /D "USE_WINSOCK2_H" /D _WIN32_WINNT=0x0400 /YX /FD /GZ /c
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib pdcurses.lib zlib.lib /nologo /subsystem:console /debug /machine:I386 /nodefaultlib:"libc" /nodefaultlib:"libcmt" /pdbtype:sept /libpath:"..\..\..\..\lib"
+
+!ENDIF
+
+# Begin Target
+
+# Name "lynx - Win32 Release"
+# Name "lynx - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\..\..\..\src\DefaultStyle.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\lib\dirent.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\GridText.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTAABrow.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTAAProt.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTAAUtil.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTAccess.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\HTAlert.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTAnchor.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTAssoc.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTAtom.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTBTree.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTChunk.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTDOS.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTFile.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTFinger.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTFormat.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTFTP.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\HTFWriter.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTGopher.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTGroup.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\HTInit.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTLex.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTList.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTMIME.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\HTML.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTMLDTD.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTMLGen.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTNews.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTParse.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTPlain.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTRules.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTString.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTStyle.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTTCP.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTTelnet.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTTP.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTUU.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTWSRC.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYBookmark.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYCgi.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYCharSets.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYCharUtils.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYClean.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYCookie.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYCurses.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYDownload.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYEdit.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYEditmap.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYexit.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYExtern.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYForms.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYGetFile.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYHash.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYHistory.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYJump.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYKeymap.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYLeaks.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYList.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYLocal.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYMail.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYMain.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYMainLoop.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYMap.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYmktime.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYNews.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYOptions.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYPrettySrc.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYPrint.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYrcFile.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYReadCFG.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYSearch.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYShowInfo.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYStrings.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYStyle.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYTraversal.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYUpload.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYUtils.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\mktime.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\parsdate.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\SGML.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\strstr.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\TRSTable.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\UCAuto.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\UCAux.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\UCdomap.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\Xsystem.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\..\..\src\AttrList.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\GridText.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTAABrow.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTAAProt.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTAAUtil.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTAccess.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\HTAlert.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTAnchor.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTAssoc.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTAtom.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTBTree.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTChunk.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTCJK.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTDOS.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HText.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTFile.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTFinger.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\HTFont.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTFormat.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\HTForms.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTFTP.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTFWriter.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTGopher.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTGroup.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTInit.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTioctl.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTLex.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTList.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTMIME.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\HTML.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTMLDTD.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTMLGen.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\HTNestedList.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTNews.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTParse.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTPlain.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTRules.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\HTSaveToFile.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTStream.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTString.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTStyle.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTTCP.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTTelnet.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTTP.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\htutils.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTUU.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\HTWSRC.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYBookmark.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYCgi.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYCharSets.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYCharUtils.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYCharVals.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYClean.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYCookie.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYCurses.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYDownload.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYEdit.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\LYexit.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYExtern.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYGCurses.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYGetFile.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYGlobalDefs.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYHash.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYHistory.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYJump.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYJustify.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYKeymap.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\LYLeaks.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYList.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYLocal.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYMail.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYMainLoop.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYMap.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\LYMessages_en.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYNews.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYOptions.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYPrettySrc.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYPrint.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYrcFile.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYReadCFG.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYSearch.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYShowInfo.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYSignal.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYStrings.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYStructs.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYStyle.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYTraversal.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYUpload.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYUtils.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\LYVMSdef.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\SGML.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\structdump.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\TRSTable.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\UCAuto.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\UCAux.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\UCDefs.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\UCdomap.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\UCMap.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\userdefs.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\www_tcp.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\WWW\Library\Implementation\www_wait.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/BUILD/VS6/lynx/lynx/lynx.dsw b/BUILD/VS6/lynx/lynx/lynx.dsw
new file mode 100644
index 0000000..6b6364f
--- /dev/null
+++ b/BUILD/VS6/lynx/lynx/lynx.dsw
@@ -0,0 +1,29 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "lynx"=".\lynx.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/BUILD/VS6/lynx/makeuctb/makeuctb.dsp b/BUILD/VS6/lynx/makeuctb/makeuctb.dsp
new file mode 100644
index 0000000..1964c31
--- /dev/null
+++ b/BUILD/VS6/lynx/makeuctb/makeuctb.dsp
@@ -0,0 +1,420 @@
+# Microsoft Developer Studio Project File - Name="makeuctb" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=makeuctb - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "makeuctb.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "makeuctb.mak" CFG="makeuctb - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "makeuctb - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "makeuctb - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "makeuctb - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /I "..\..\..\..\src" /I "..\..\..\..\src\chrtrans" /I "..\..\..\..\WWW\Library\Implementation" /I "..\..\..\..\lib" /I "..\..\..\.." /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "__WIN32__" /D "NO_UNISTD_H" /D "_WINDOWS" /YX /FD /c
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# Begin Custom Build
+InputPath=.\Release\makeuctb.exe
+SOURCE="$(InputPath)"
+
+BuildCmds= \
+ setlocal \
+ set MYDST=..\..\..\..\src\chrtrans \
+ copy $(InputPath) %MYDST% \
+ cd %MYDST% \
+ call makehdrs \
+ endlocal \
+
+
+"..\..\..\..\src\chrtrans\makeuctb.exe" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\def7_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\cp1250_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\cp1251_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\cp1252_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\cp1253_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\cp1255_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\cp1256_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\cp1257_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\cp437_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\cp737_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\cp775_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\cp850_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\cp852_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\cp857_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\cp862_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\cp864_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\cp866_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\cp866u_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\cp869_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\dmcs_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\hp_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\iso01_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\iso02_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\iso03_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\iso04_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\iso05_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\iso06_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\iso07_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\iso08_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\iso09_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\iso10_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\iso13_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\iso14_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\iso15_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\koi8r_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\koi8u_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\mac_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\mnem2_suni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\mnem_suni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\next_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\pt154_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\rfc_suni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\utf8_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\viscii_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "makeuctb - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "..\..\..\..\src" /I "..\..\..\..\src\chrtrans" /I "..\..\..\..\WWW\Library\Implementation" /I "..\..\..\..\lib" /I "..\..\..\.." /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "__WIN32__" /D "NO_UNISTD_H" /D "_WINDOWS" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# Begin Custom Build
+InputPath=.\Debug\makeuctb.exe
+SOURCE="$(InputPath)"
+
+BuildCmds= \
+ setlocal \
+ set MYDST=..\..\..\..\src\chrtrans \
+ copy $(InputPath) %MYDST% \
+ cd %MYDST% \
+ call makehdrs \
+ endlocal \
+
+
+"..\..\..\..\src\chrtrans\makeuctb.exe" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\def7_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\cp1250_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\cp1251_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\cp1252_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\cp1253_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\cp1255_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\cp1256_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\cp1257_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\cp437_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\cp737_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\cp775_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\cp850_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\cp852_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\cp857_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\cp862_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\cp864_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\cp866_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\cp866u_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\cp869_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\dmcs_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\hp_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\iso01_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\iso02_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\iso03_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\iso04_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\iso05_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\iso06_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\iso07_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\iso08_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\iso09_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\iso10_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\iso13_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\iso14_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\iso15_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\koi8r_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\koi8u_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\mac_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\mnem2_suni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\mnem_suni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\next_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\pt154_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\rfc_suni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\utf8_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\..\..\src\chrtrans\viscii_uni.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# Begin Target
+
+# Name "makeuctb - Win32 Release"
+# Name "makeuctb - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\..\..\..\src\chrtrans\makeuctb.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\..\..\src\chrtrans\caselower.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\chrtrans\entities.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\chrtrans\jcuken_kb.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\chrtrans\rot13_kb.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\src\chrtrans\UCkd.h
+# End Source File
+# Begin Source File
+
+SOURCE=....\..\..\src\chrtrans\yawerty_kb.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/BUILD/mingw-curses.bat b/BUILD/mingw-curses.bat
new file mode 100644
index 0000000..cb15d82
--- /dev/null
+++ b/BUILD/mingw-curses.bat
@@ -0,0 +1,357 @@
+@echo off
+@echo MAKELYNX.BAT
+@echo Windows/Dos batch makefile for MingW32 and lynx.exe
+@echo Remember to precede this by "command /E:8192" for Windows prior to
+@echo W2000 and "cmd.exe /E:8192" for subsequent Window versions and to
+@echo set the MingW32 C_INCLUDE_PATH and %C_INCLUDE_PATH%..\..\bin paths
+@echo.
+@echo Usage: makelynx [option]
+@echo Default option: all
+@echo Specifying "src" causes the libwww code to be skipped.
+@echo Specifying "link" causes the batch file to skip to the final
+@echo linking phase.
+@echo.
+@echo Note that you have to edit early versions of i386-mingw32\include\stdlib.h
+@echo to put an "#ifndef WIN_EX" around the declaration for `sleep', or the
+@echo compile won't work. There is also an "#ifndef PDCURSES" around
+@echo the declaration for `beep' for the same reason.
+@echo.
+@echo To change the console library from libpdcurses to libslang,
+@echo put a "rem" before the `SET LIBRARY' line below.
+@echo.
+@echo If you don't have libz.a, either compile it
+@echo or put a "rem" in front of the following USE_ZLIB line.
+@echo This will cause the gzip.exe version of lynx
+@echo to be compiled. It doesn't work well at present:
+
+set USE_ZLIB=
+set DEFINES=
+
+SET LIBRARY=PDCURSES
+SET USE_ZLIB=YES
+
+rem Uncomment these lines if the slang/curses headers and libraries
+rem are in the top-level lib directory:
+rem set C_INCLUDE_PATH=..\lib;..\..\..\lib;%C_INCLUDE_PATH%
+rem set LIBRARY_PATH=..\lib;..\..\..\lib;%LIBRARY_PATH%
+
+echo Your compiler may not support -march=pentiumpro.
+echo In that case, replace -march=pentiumpro with -mpentium or -m486 or nothing:
+
+if "%OS%" == "Windows_NT" goto then0
+rem command.com doesn't handle the 'a=b' option
+set CC=gcc -mpentium
+goto else0
+:then0
+rem assumes a cmd.exe, rather than command.com, environment
+set CC=gcc -march=pentiumpro -mthreads
+:else0
+
+
+rem These definitions come from the Microsoft.msc makefile, with some
+rem modification. Note that -Dx=y didn't work in older versions
+rem of Windows batch files, only -Dx, so a lynx_cfg.h was needed as
+rem a workaround.
+echo /* Generated lynx_cfg.h file in the lynx directory: */ > lynx_cfg.h
+echo. >> lynx_cfg.h
+echo. >> lynx_cfg.h
+echo #define ANSI_VARARGS 1 >> lynx_cfg.h
+echo #define BOXHORI 0 >> lynx_cfg.h
+echo #define BOXVERT 0 >> lynx_cfg.h
+echo #define CAN_PIPE_TO_MAILER 0 >> lynx_cfg.h
+echo #define HAVE_GETCWD 1 >> lynx_cfg.h
+echo #define HAVE_STRERROR 1 >> lynx_cfg.h
+echo #define LYNX_CFG_FILE "./lynx.cfg" >> lynx_cfg.h
+echo #define LY_MAXPATH 1024 >> lynx_cfg.h
+echo #define USE_BLAT_MAILER 1 >> lynx_cfg.h
+echo #define USE_ALT_BLAT_MAILER 1 >> lynx_cfg.h
+echo #define VC "2.14FM" >> lynx_cfg.h
+echo #define _WIN_CC 1 >> lynx_cfg.h
+rem echo #define USE_SCROLLBAR 1 >> lynx_cfg.h
+
+SET DEFINES=-DCJK_EX
+SET DEFINES=%DEFINES% -DUSE_READPROGRESS
+SET DEFINES=%DEFINES% -DEXP_NESTED_TABLES
+SET DEFINES=%DEFINES% -DEXP_JUSTIFY_ELTS
+SET DEFINES=%DEFINES% -DEXP_ALT_BINDINGS
+SET DEFINES=%DEFINES% -DUSE_PERSISTENT_COOKIES
+if not "%OS%" == "Windows_NT" goto next11
+SET DEFINES=%DEFINES% -DLY_MAXPATH=1024
+rem The following is unnecessary and causes the
+rem compile to fail:
+rem SET DEFINES=%DEFINES% -DUSE_WINSOCK2_H
+:next11
+SET DEFINES=%DEFINES% -DNO_CONFIG_INFO
+SET DEFINES=%DEFINES% -DSH_EX
+SET DEFINES=%DEFINES% -DWIN_EX
+SET DEFINES=%DEFINES% -D_WINDOWS
+SET DEFINES=%DEFINES% -DUSE_EXTERNALS
+SET DEFINES=%DEFINES% -DDIRED_SUPPORT
+SET DEFINES=%DEFINES% -DDOSPATH
+SET DEFINES=%DEFINES% -DHAVE_DIRENT_H
+SET DEFINES=%DEFINES% -DHAVE_KEYPAD
+SET DEFINES=%DEFINES% -DACCESS_AUTH
+SET DEFINES=%DEFINES% -DNO_FILIO_H
+SET DEFINES=%DEFINES% -DNO_UNISTD_H
+SET DEFINES=%DEFINES% -DNO_UTMP
+SET DEFINES=%DEFINES% -DNO_CUSERID
+SET DEFINES=%DEFINES% -DNO_TTYTYPE
+SET DEFINES=%DEFINES% -DNOSIGHUP
+SET DEFINES=%DEFINES% -DNOUSERS
+SET DEFINES=%DEFINES% -DLONG_LIST
+SET DEFINES=%DEFINES% -DDISP_PARTIAL
+SET DEFINES=%DEFINES% -DUSE_SOURCE_CACHE
+SET DEFINES=%DEFINES% -DUSE_PRETTYSRC
+SET DEFINES=%DEFINES% -DWIN32
+if not "%USE_ZLIB%" == "YES" goto next1
+echo *** Using ZLIB
+SET DEFINES=%DEFINES% -DUSE_ZLIB
+:next1
+if "%LIBRARY%" == "PDCURSES" goto else1
+echo *** Using SLANG
+SET DEFINES=%DEFINES% -DUSE_SLANG
+goto endif1
+:else1
+echo *** Using PDCURSES
+SET DEFINES=%DEFINES% -DFANCY_CURSES
+SET DEFINES=%DEFINES% -DCOLOR_CURSES
+SET DEFINES=%DEFINES% -DPDCURSES
+SET DEFINES=%DEFINES% -DUSE_MULTIBYTE_CURSES
+:endif1
+
+if not "%1" == "src" goto else
+ cd src
+ goto src
+:else
+if not "%1" == "link" goto endif
+ cd src
+ goto link
+:endif
+
+SET INCLUDES=-I. -I..\..\.. -I..\..\..\src
+
+set CFLAGS=-g %INCLUDES% %DEFINES%
+set COMPILE_CMD=%CC% -c %CFLAGS%
+
+cd WWW\Library\Implementation
+erase *.o
+
+%COMPILE_CMD% HTAABrow.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTAAProt.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTAAUtil.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTAccess.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTAnchor.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTAssoc.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTAtom.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTBTree.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTChunk.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTDOS.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTFile.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTFinger.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTFormat.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTFTP.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTFWriter.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTGopher.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTGroup.c
+if errorlevel 1 PAUSE
+
+%COMPILE_CMD% HTLex.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTList.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTMIME.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTMLDTD.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTMLGen.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTNews.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTParse.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTPlain.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTRules.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTString.c
+if errorlevel 1 PAUSE
+
+%COMPILE_CMD% HTStyle.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTTCP.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTTelnet.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTTP.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTUU.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTWSRC.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% SGML.c
+if errorlevel 1 PAUSE
+
+ar crv libwww.a *.o
+
+if errorlevel 1 PAUSE
+
+cd ..\..\..\src\chrtrans
+erase *.o
+
+SET INCLUDES=-I. -I.. -I..\.. -I..\..\WWW\Library\Implementation
+SET CFLAGS=-g %INCLUDES% %DEFINES%
+SET COMPILE_CMD=%CC% -c %CFLAGS%
+
+%COMPILE_CMD% makeuctb.c
+if errorlevel 1 PAUSE
+%CC% -o makeuctb.exe makeuctb.o
+if errorlevel 1 PAUSE
+
+call makew32.bat
+if errorlevel 1 PAUSE
+cd ..\
+
+:src
+SET INCLUDES=-I. -I.. -I.\chrtrans -I..\WWW\Library\Implementation
+SET CFLAGS=-g %INCLUDES% %DEFINES%
+SET COMPILE_CMD=%CC% -c %CFLAGS%
+SET PATH=..\WWW\Library\Implementation;%PATH%
+erase *.o
+
+%COMPILE_CMD% DefaultStyle.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% GridText.c
+if errorlevel 1 PAUSE
+if not exist TRSTable.c goto notrstable
+%COMPILE_CMD% TRSTable.c
+if errorlevel 1 PAUSE
+:notrstable
+if not exist Xsystem.c goto noxsystem
+%COMPILE_CMD% Xsystem.c
+if errorlevel 1 PAUSE
+:noxsystem
+%COMPILE_CMD% HTAlert.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTFWriter.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTInit.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTML.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYBookmark.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYCgi.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYCharSets.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYCharUtils.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYClean.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYCookie.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYCurses.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYDownload.c
+if errorlevel 1 PAUSE
+
+%COMPILE_CMD% LYEdit.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYEditmap.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYexit.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYExtern.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYForms.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYGetFile.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYHash.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYHistory.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYJump.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYKeymap.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYLeaks.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYList.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYLocal.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYMail.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYMain.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYMainLoop.c
+if errorlevel 1 PAUSE
+
+%COMPILE_CMD% LYMap.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYNews.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYOptions.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYPrettySrc.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYPrint.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYrcFile.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYReadCFG.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYSearch.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYShowInfo.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYStrings.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYStyle.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYTraversal.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYUpload.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYUtils.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% UCAuto.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% UCAux.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% UCdomap.c
+if errorlevel 1 PAUSE
+
+:link
+if not "%LIBRARY%" == "PDCURSES" goto else2
+SET LIBS=-L..\WWW\Library\Implementation -lwww -lpdcurses
+goto endif2
+:else2
+SET LIBS=-L..\WWW\Library\Implementation -lwww -lslang
+:endif2
+
+SET LIBS=%LIBS% -lwsock32 -luser32
+
+if not "%USE_ZLIB%" == "YES" goto else4
+SET LIBS=%LIBS% -lz
+:else4
+
+%CC% -g -o lynx *.o %LIBS%
+if exist lynx.exe ECHO "Welcome to lynx!"
diff --git a/BUILD/mingw-slang.bat b/BUILD/mingw-slang.bat
new file mode 100644
index 0000000..d7cb537
--- /dev/null
+++ b/BUILD/mingw-slang.bat
@@ -0,0 +1,357 @@
+@echo off
+@echo MAKELYNX.BAT
+@echo Windows/Dos batch makefile for MingW32 and lynx.exe
+@echo Remember to precede this by "command /E:8192" for Windows prior to
+@echo W2000 and "cmd.exe /E:8192" for subsequent Window versions and to
+@echo set the MingW32 C_INCLUDE_PATH and %C_INCLUDE_PATH%..\..\bin paths
+@echo.
+@echo Usage: makelynx [option]
+@echo Default option: all
+@echo Specifying "src" causes the libwww code to be skipped.
+@echo Specifying "link" causes the batch file to skip to the final
+@echo linking phase.
+@echo.
+@echo Note that you have to edit early versions of i386-mingw32\include\stdlib.h
+@echo to put an "#ifndef WIN_EX" around the declaration for `sleep', or the
+@echo compile won't work. There is also an "#ifndef PDCURSES" around
+@echo the declaration for `beep' for the same reason.
+@echo.
+@echo To change the console library from libpdcurses to libslang,
+@echo put a "rem" before the `SET LIBRARY' line below.
+@echo.
+@echo If you don't have libz.a, either compile it
+@echo or put a "rem" in front of the following USE_ZLIB line.
+@echo This will cause the gzip.exe version of lynx
+@echo to be compiled. It doesn't work well at present:
+
+set USE_ZLIB=
+set DEFINES=
+
+SET LIBRARY=SLANG
+SET USE_ZLIB=YES
+
+rem Uncomment these lines if the slang/curses headers and libraries
+rem are in the top-level lib directory:
+rem set C_INCLUDE_PATH=..\lib;..\..\..\lib;%C_INCLUDE_PATH%
+rem set LIBRARY_PATH=..\lib;..\..\..\lib;%LIBRARY_PATH%
+
+echo Your compiler may not support -march=pentiumpro.
+echo In that case, replace -march=pentiumpro with -mpentium or -m486 or nothing:
+
+if "%OS%" == "Windows_NT" goto then0
+rem command.com doesn't handle the 'a=b' option
+set CC=gcc -mpentium
+goto else0
+:then0
+rem assumes a cmd.exe, rather than command.com, environment
+set CC=gcc -march=pentiumpro -mthreads
+:else0
+
+
+rem These definitions come from the Microsoft.msc makefile, with some
+rem modification. Note that -Dx=y didn't work in older versions
+rem of Windows batch files, only -Dx, so a lynx_cfg.h was needed as
+rem a workaround.
+echo /* Generated lynx_cfg.h file in the lynx directory: */ > lynx_cfg.h
+echo. >> lynx_cfg.h
+echo. >> lynx_cfg.h
+echo #define ANSI_VARARGS 1 >> lynx_cfg.h
+echo #define BOXHORI 0 >> lynx_cfg.h
+echo #define BOXVERT 0 >> lynx_cfg.h
+echo #define CAN_PIPE_TO_MAILER 0 >> lynx_cfg.h
+echo #define HAVE_GETCWD 1 >> lynx_cfg.h
+echo #define HAVE_STRERROR 1 >> lynx_cfg.h
+echo #define LYNX_CFG_FILE "./lynx.cfg" >> lynx_cfg.h
+echo #define LY_MAXPATH 1024 >> lynx_cfg.h
+echo #define USE_BLAT_MAILER 1 >> lynx_cfg.h
+echo #define USE_ALT_BLAT_MAILER 1 >> lynx_cfg.h
+echo #define VC "2.14FM" >> lynx_cfg.h
+echo #define _WIN_CC 1 >> lynx_cfg.h
+rem echo #define USE_SCROLLBAR 1 >> lynx_cfg.h
+
+SET DEFINES=-DCJK_EX
+SET DEFINES=%DEFINES% -DUSE_READPROGRESS
+SET DEFINES=%DEFINES% -DEXP_NESTED_TABLES
+SET DEFINES=%DEFINES% -DEXP_JUSTIFY_ELTS
+SET DEFINES=%DEFINES% -DEXP_ALT_BINDINGS
+SET DEFINES=%DEFINES% -DUSE_PERSISTENT_COOKIES
+if not "%OS%" == "Windows_NT" goto next11
+SET DEFINES=%DEFINES% -DLY_MAXPATH=1024
+rem The following is unnecessary and causes the
+rem compile to fail:
+rem SET DEFINES=%DEFINES% -DUSE_WINSOCK2_H
+:next11
+SET DEFINES=%DEFINES% -DNO_CONFIG_INFO
+SET DEFINES=%DEFINES% -DSH_EX
+SET DEFINES=%DEFINES% -DWIN_EX
+SET DEFINES=%DEFINES% -D_WINDOWS
+SET DEFINES=%DEFINES% -DUSE_EXTERNALS
+SET DEFINES=%DEFINES% -DDIRED_SUPPORT
+SET DEFINES=%DEFINES% -DDOSPATH
+SET DEFINES=%DEFINES% -DHAVE_DIRENT_H
+SET DEFINES=%DEFINES% -DHAVE_KEYPAD
+SET DEFINES=%DEFINES% -DACCESS_AUTH
+SET DEFINES=%DEFINES% -DNO_FILIO_H
+SET DEFINES=%DEFINES% -DNO_UNISTD_H
+SET DEFINES=%DEFINES% -DNO_UTMP
+SET DEFINES=%DEFINES% -DNO_CUSERID
+SET DEFINES=%DEFINES% -DNO_TTYTYPE
+SET DEFINES=%DEFINES% -DNOSIGHUP
+SET DEFINES=%DEFINES% -DNOUSERS
+SET DEFINES=%DEFINES% -DLONG_LIST
+SET DEFINES=%DEFINES% -DDISP_PARTIAL
+SET DEFINES=%DEFINES% -DUSE_SOURCE_CACHE
+SET DEFINES=%DEFINES% -DUSE_PRETTYSRC
+SET DEFINES=%DEFINES% -DWIN32
+if not "%USE_ZLIB%" == "YES" goto next1
+echo *** Using ZLIB
+SET DEFINES=%DEFINES% -DUSE_ZLIB
+:next1
+if "%LIBRARY%" == "PDCURSES" goto else1
+echo *** Using SLANG
+SET DEFINES=%DEFINES% -DUSE_SLANG
+goto endif1
+:else1
+echo *** Using PDCURSES
+SET DEFINES=%DEFINES% -DFANCY_CURSES
+SET DEFINES=%DEFINES% -DCOLOR_CURSES
+SET DEFINES=%DEFINES% -DPDCURSES
+SET DEFINES=%DEFINES% -DUSE_MULTIBYTE_CURSES
+:endif1
+
+if not "%1" == "src" goto else
+ cd src
+ goto src
+:else
+if not "%1" == "link" goto endif
+ cd src
+ goto link
+:endif
+
+SET INCLUDES=-I. -I..\..\.. -I..\..\..\src
+
+set CFLAGS=-g %INCLUDES% %DEFINES%
+set COMPILE_CMD=%CC% -c %CFLAGS%
+
+cd WWW\Library\Implementation
+erase *.o
+
+%COMPILE_CMD% HTAABrow.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTAAProt.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTAAUtil.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTAccess.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTAnchor.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTAssoc.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTAtom.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTBTree.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTChunk.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTDOS.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTFile.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTFinger.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTFormat.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTFTP.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTFWriter.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTGopher.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTGroup.c
+if errorlevel 1 PAUSE
+
+%COMPILE_CMD% HTLex.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTList.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTMIME.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTMLDTD.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTMLGen.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTNews.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTParse.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTPlain.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTRules.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTString.c
+if errorlevel 1 PAUSE
+
+%COMPILE_CMD% HTStyle.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTTCP.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTTelnet.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTTP.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTUU.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTWSRC.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% SGML.c
+if errorlevel 1 PAUSE
+
+ar crv libwww.a *.o
+
+if errorlevel 1 PAUSE
+
+cd ..\..\..\src\chrtrans
+erase *.o
+
+SET INCLUDES=-I. -I.. -I..\.. -I..\..\WWW\Library\Implementation
+SET CFLAGS=-g %INCLUDES% %DEFINES%
+SET COMPILE_CMD=%CC% -c %CFLAGS%
+
+%COMPILE_CMD% makeuctb.c
+if errorlevel 1 PAUSE
+%CC% -o makeuctb.exe makeuctb.o
+if errorlevel 1 PAUSE
+
+call makew32.bat
+if errorlevel 1 PAUSE
+cd ..\
+
+:src
+SET INCLUDES=-I. -I.. -I.\chrtrans -I..\WWW\Library\Implementation
+SET CFLAGS=-g %INCLUDES% %DEFINES%
+SET COMPILE_CMD=%CC% -c %CFLAGS%
+SET PATH=..\WWW\Library\Implementation;%PATH%
+erase *.o
+
+%COMPILE_CMD% DefaultStyle.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% GridText.c
+if errorlevel 1 PAUSE
+if not exist TRSTable.c goto notrstable
+%COMPILE_CMD% TRSTable.c
+if errorlevel 1 PAUSE
+:notrstable
+if not exist Xsystem.c goto noxsystem
+%COMPILE_CMD% Xsystem.c
+if errorlevel 1 PAUSE
+:noxsystem
+%COMPILE_CMD% HTAlert.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTFWriter.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTInit.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTML.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYBookmark.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYCgi.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYCharSets.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYCharUtils.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYClean.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYCookie.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYCurses.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYDownload.c
+if errorlevel 1 PAUSE
+
+%COMPILE_CMD% LYEdit.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYEditmap.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYexit.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYExtern.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYForms.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYGetFile.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYHash.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYHistory.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYJump.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYKeymap.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYLeaks.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYList.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYLocal.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYMail.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYMain.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYMainLoop.c
+if errorlevel 1 PAUSE
+
+%COMPILE_CMD% LYMap.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYNews.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYOptions.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYPrettySrc.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYPrint.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYrcFile.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYReadCFG.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYSearch.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYShowInfo.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYStrings.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYStyle.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYTraversal.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYUpload.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYUtils.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% UCAuto.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% UCAux.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% UCdomap.c
+if errorlevel 1 PAUSE
+
+:link
+if not "%LIBRARY%" == "PDCURSES" goto else2
+SET LIBS=-L..\WWW\Library\Implementation -lwww -lpdcurses
+goto endif2
+:else2
+SET LIBS=-L..\WWW\Library\Implementation -lwww -lslang
+:endif2
+
+SET LIBS=%LIBS% -lwsock32 -luser32
+
+if not "%USE_ZLIB%" == "YES" goto else4
+SET LIBS=%LIBS% -lz
+:else4
+
+%CC% -g -o lynx *.o %LIBS%
+if exist lynx.exe ECHO "Welcome to lynx!"
diff --git a/CHANGES b/CHANGES
new file mode 100644
index 0000000..eff68c9
--- /dev/null
+++ b/CHANGES
@@ -0,0 +1,10121 @@
+-- $LynxId: CHANGES,v 1.1128 2023/01/08 14:08:16 tom Exp $
+===============================================================================
+Changes since Lynx 2.8 release
+===============================================================================
+
+2023-01-08 (2.9.0dev.12)
+* add a rewind() call before reading existing bookmark file opened for append
+ with read/write, to ensure that the file-position is at the beginning of the
+ file (report by Klatt Volkmar) -TD
+* improve compiler-warnings in configure script checks -TD
+* fix a few ifdef'ing problems (prompted by discussion with Klatt Volkmar) -TD
+* fix spelling errors found with codespell (report by Jens Schleusener) -TD
+* update es.po from
+ http://translationproject.org/latest/lynx
+
+2022-12-28 (2.9.0dev.11)
+* update ncurses/lynx homepage URLs to deprecate ftp -TD
+* modify configure script to reduce implicit-function warnings (report by
+ Florian Weimer) -TD
+* update configure script to work around regression in grep 3.8 -TD
+* add some consistency-checks to dtd_util to make it easier to use -TD
+* improve formatting of bookmark file, e.g., to fix warnings by tidy -TD
+* correct workaround for asan2 report of overlapping strcpy (report by KH) -TD
+* amend fix for Debian #738121; URL-encoded "?" in HTFile.c corresponds to an
+ actual "?" in a file path (report by TG) -TD
+* before calling delscreen, delete the private working windows in case delwin
+ invalidates those (Debian #1015756) -TD
+* add presentation type for xhtml, related state information to better handle
+ things such as "<script src=foo />" -Shlomi Fish, TD
+* improve line-breaks and whitespace for Japanese characters -KH
+ + permit line breaks after any Japanese character (enabled by
+ --enable-wcwidth-support configuration and only called on last byte of
+ multibyte UTF-8 sequence)
+ + avoid adding spaces when joining lines after Japanese characters.
+* add new "Minimal" user mode, to minimize on-screen help/status.
+ Eliminates the URL on the bottom line, the forward/backward indicator in the
+ upper left, and most status-line messages - Paul G Fox
+* add PREVENT_KEYBOARD_WRAPAROUND symbol to userdefs.h
+ Undefing this will allow cursor to wrap from bottom to/from top, when there's
+ more content than a single page. (It can already wrap when the content
+ already fits on a page.) - Paul G Fox
+* modify NSL-fork to call freeaddrinfo only if getaddrinfo returns successfully
+ (patch by Rajeev V Pillai)
+* add ".br", ".lz", ".lzip", and ".xz" to binary-suffixes list -TD
+* changes for using brotli stream decompression -TD
+* changes for working with SOCKS5 on Windows 10 -GV, -TD
+* fix a few coverity and clang warnings -TD
+* add a null-pointer check in StrAllocVsprintf() to work with existing SOCKS5
+ configuration (report/patch by Gisle Vanem).
+* change capitalization of "Content-type" sent to the remote server to work
+ around "HeavyThing" server which does not follow RFC 2616 in treating field
+ name as case insensitive (report/patch by Sylvain Bertrand)
+* improved several configure macros:
+ AM_WITH_NLS, CF_ADD_INCDIR, CF_BUILD_CC, CF_CHECK_EXTERN_DATA,
+ CF_DISABLE_ECHO, CF_FIX_WARNINGS, CF_MAKEFLAGS, CF_MATH_LIB,
+ CF_NCURSES_CONFIG, CF_NCURSES_LIBS, CF_PKG_CONFIG, CF_PROG_LINT,
+ CF_SIZECHANGE, CF_TRY_XOPEN_SOURCE, CF_WITH_PATH, CF_XOPEN_SOURCE
+* update config.guess (2022-08-01), config.sub (2022-08-01)
+
+2021-10-24 (2.9.0dev.10)
+* several fixes for problems found using asan2 with fuzzer-generated data
+ (report/testcases by Kuang-che Wu) -TD
+* re-signed copyright/copying files -TD
+* update fr.po, id.po, nl.po, sv.po from
+ http://translationproject.org/latest/lynx
+* update config.sub (2021-08-14)
+
+2021-08-07 (2.9.0dev.9)
+* strip user/password from ssl_host in HTLoadHTTP, incorrectly passed as
+ part of the server name indicator (Debian #991971) -TD
+* update de.po eo.po et.po sv.po tr.po from
+ http://translationproject.org/latest/lynx
+
+2021-07-31 (2.9.0dev.8)
+* regenerated lynx.pot, sent to translation project -TD
+* align options in rpm/deb test-packages -TD
+* change keyword-matching in Lynx's special URLs such as LYNXDOWNLOAD to use
+ case-insensitive matching to work around idn2's conversion -TD
+* build-fix for idn library vs idn2 (report by GV)
+
+2021-07-26 (2.9.0dev.7)
+* trim extra '/' in the Related-ABS case of HTParse introduced by revision of
+ HTSimplify in 2.9.0dev.3 (Debian #989047) -TD
+* modify formatting of gopher telnet and tn3270 selectors to skip a leading
+ "/" which produced ill-formed URI (report by Dario Niederman) -TD
+* modify SGML parsing to allow DEL and INS tags to work on a block-level rather
+ than only inline (Debian #981351) -TD
+* modify configure script to check for libidn2, add options menu setting for
+ selecting old/new/compat behavior (prompted by patch by Robert Scheck, Redhat
+ #1910971) -TD
+ Further reading:
+ https://nikmav.blogspot.com/2017/04/the-mess-with-internationalized-domain.html
+ https://unicode.org/reports/tr46/
+ https://datatracker.ietf.org/doc/html/rfc5890
+ https://datatracker.ietf.org/doc/html/draft-iab-protocol-transitions-01
+* add euc-kr charset support to the chinese-utf8 option, noting issue with
+ the charset here:
+ https://lists.w3.org/Archives/Public/ietf-charsets/2001AprJun/0030.html
+ http://unicode.org/mail-arch/unicode-ml/y2002-m03/0641.html
+ https://docs.microsoft.com/en-us/previous-versions/office/developer/office-2003/aa171439(v=office.11)
+ i.e., "ks_c_5601-1987" -TD
+* add chinese-utf8 optional feature for big5 charset -TD
+* add chinese-utf8 optional feature for gb2312 charset -TD
+* enable cjk and japanese-utf8 features by default, renaming the symbol
+ EXP_JAPANESEUTF8_SUPPORT -> USE_JAPANESEUTF8_SUPPORT -TD
+* fix warnings from scan-build -TD
+* update configure script to work with _Noreturn changes in ncurses 20210320
+ development snapshot -TD
+* document the NO_TABLE_CENTER setting and explain the corresponding -center
+ option in the manual page (report by Dan Jacobson) -TD
+* add Latin 10 aka ISO-8859-16 (patch by emil@vajn.icu)
+* modify configure script and makefiles to work around pmake "jobs"
+ misfeature -TD
+* configure-script improvements -TD
+ + suppress check for mktemp if mkdtemp is found.
+ + suppress check for sys_errlist[] if strerror is found.
+ + various quoting/escaping fixes suggested by shellcheck.
+ + improve configure script workaround for unwanted
+ -Werror=implicit-function-declaration by clang
+ + add "darwin" (macOS) to list of case-insensitive filesystems
+* update config.guess (2021-05-24), config.sub (2021-04-30)
+
+2020-09-05 (2.9.0dev.6)
+* remove commented ENABLE_LYNXRC for SHOW_COLOR:ON, and SHOW_DOTFILES since
+ those are normally saved to .lynxrc -TD
+* modify makeuctb to allow builds with asan2 when the configure option
+ --enable-find-leaks is used-TD
+* add SOCKS5_PROXY environment variable, document the corresponding command
+ line option as "-socks5_proxy" for consistency (Steffen Nurpmeso, TG)
+* in configure script, filter out gcc -Werror options where they would interere
+ with configure checks (report by Ryan Schmidt) -TD
+* minor formatting fixes for manual page (Debian #961080)
+* update autoconf macros, mostly changes to reduce unused-variable warnings
+ in the compile-checks -TD
+* add Windows-specific initialization in tidy_tls.c -GV
+* update cs.po, eo.po from
+ http://translationproject.org/latest/lynx
+
+2020-02-27 (2.9.0dev.5)
+* fix gcc9 warning about sprintf in HTFTP.c -TD
+* workaround for MacOS clang wrapper c99 "-W" option, in configure script -TD
+* use curses_exit() from ncurses 6.2 for leak-checking -TD
+* amend workaround in 2.8.6dev.19 for "-notitle" option, fixing an off-by-one
+ display (report by Keith Bowes) -TD
+* add/adapt changes from Keith Bowes' github:
+ * updated eo.po
+ * add "-update_term_title" option
+* add "-list_decoded" option to toggle feature of "-dump" option which decodes
+ URL-encoded links in the list of "References", from change made in
+ 2.8.8dev.17, for Debian #398274 (prompted by patch by Hiltjo Posthuma) -TD
+* modify HTAddXpand() to provide for the case when the command is a full
+ pathname with embedded blanks, etc., versus an expansion of an environment
+ variable containing parameters (report by Edward McGuire) -TD
+* fix typos found with codespell -TD
+* improved several configure macros, including a fix for clang
+ compiler-warnings, and library order when linking -TD
+* remove a ruler in the user's guide that was added in 2.8.3dev.10 as a
+ conversion aid (report by Edward McGuire) -TD
+* modify HTML DTD to allow <div> in <a> -KH
+* add -socks5-proxy option (Steffen Nurpmeso)
+* if --without-lss-file is used, the configured lss filename is empty and
+ should be ignored (report by Cory Krell) -TD
+* extend table/limit in parsdate.y to 2200 (report by Ian Collier) -TD
+* update eo.po, fr.po, nl.po from
+ http://translationproject.org/latest/lynx
+* update config.guess (2019-12-21), config.sub (2019-09-11)
+
+2019-08-26 (2.9.0dev.4)
+* revert change to port-handling in 2.9.0dev.3 changes for gophermap (report by
+ Martijn Dekker).
+* add ro.po, update de.po, et.po, tr.po, vi.po from
+ http://translationproject.org/latest/lynx
+
+2019-08-25 (2.9.0dev.3)
+* modify gophermap menu-parsing to handle "h" HTML selectors similarly to the
+ command-line parsing, which avoids hex-encoding the parameter delimiters
+ "?", "=", ";" as well as "#" (report by Tobias Girstmair) -TD
+* make redirection-limit configurable, defaulting to 10 -TD
+* remove alert when relative base href is seen, since HTML5 allows for this
+ (report by Sylvain Bertrand) -TD
+* modify lynx.iss to use statically-linked bzip2 and gzip programs, and to
+ eliminate a spurious warning when attempting to remove an optional DLL -TD
+* fix a few coverity warnings -TD
+* revise HTSimplify to eliminate a redundant "." segment at the beginning of a
+ path, referring to RFC 3986 5.2.4 (report by Alejandro Lieber) -TD
+
+2019-07-31 (2.9.0dev.2)
+* improved several configure macros, including workaround for non-POSIX
+ issue with BSDs.
+* fix typo in iso15_uni.tbl (Robert Bell)
+* update de.po from
+ http://translationproject.org/latest/lynx
+* update config.guess (2019-06-10), config.sub (2019-06-30)
+
+2019-01-27 (2.9.0dev.1)
+* add/adapt changes from Keith Bowes' github:
+ * updated eo.po
+ * modify GridText to make page/line percentages translatable
+ + modify HTInit.c to make it possible to view the source of XHTML documents
+ + modify def7_uni.tbl adding ch, gh, hh, jh, sh to replace some single-chars
+* implement features of RFC 6265 (prompted by discussion on mailing list) -TD
+ * recognize but ignore "HttpOnly" attribute
+ * add COOKIE_VERSION to lynx.cfg, which can be used to specify older cookie
+ RFC; provide special cases for RFCs 2109, 2965 and 6265.
+ * add selection for cookie version in options menu.
+* add dummy "check" rule to makefile.in to help with testing Arch package -TD
+* modify tidy_tls.c to work with TLS 1.3 when built with gnutls 3.6.5 or later
+ (patch by Andreas Metzler).
+* add to experimental Japanese UTF-8 feature -KH
+ + fix JIS X 0201 Katakana conversion from Shift_JIS/EUC-JP to UTF-8.
+ http://www1.interq.or.jp/~deton/lynx-sjisjisx0201/
+ + add conversion from Japanese ISO-2022-JP html to UTF-8 display_charset.
+ http://www1.interq.or.jp/~deton/lynx-jis2utf8/
+* add configure option for experimental feature "--enable-wcwidth-support" -TD
+* use/adapt wcwidth from xterm -TD
+* add support for displaying double-cell characters -KH
+ Screen capture:
+ http://www1.interq.or.jp/~deton/lynx-wcwidth/
+ Known issues:
+ * Highlight is incorrect on selecting wrapped long wide-char link text.
+ * Whereis highlight position is incorrect after wide-char text.
+ * Does not support treating double-width for East Asian Ambiguous Width
+ characters (e.g., xterm -cjk_width).
+ TODO:
+ * Use mk_wcwidth_cjk() in http://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c
+ * Add cjk_width option to lynx
+* modify generated HTML when processing -source option for a Gopher menu to
+ convert literal "<", "&", and ">" to HTML named entities (report/testcase by
+ Zachary Lee Andrews) -TD
+* build-fix when persistent cookies are disabled (report by Juan Manuel
+ Guerrero) -TD
+* memory-leak and dead-code fixes from static analysis (patch by Kamil Dudka).
+* restore whitespace in info-page omitted in 2.8.9dev.17, useful for screen
+ readers (report by Dan Dunfee) -Chuck Martin
+* improve error-checks in parsdate.y (prompted by patch by TH) -TD
+* compiler-warning fixes for gcc8 and VS2015 -TD
+* fix overlooked "2.8.9" in README -Larry Hynes
+
+2018-07-08 (2.8.9rel.1)
+* documentation/metrics updates -TD
+
+2018-06-10 (2.8.9pre.1)
+* fix an inconsistency in message for "-listonly" option (Debian #805753) -TD
+
+2018-05-17 (2.8.9dev.19)
+* update test-packages to use current ncurses test-packages -TD
+* improve portability for sockaddr structures used in HTTP and FTP, for
+ IPv6 and SOCKS configurations -TD
+* fix several minor warnings reported by Coverity -TD
+* build-fix overlooked in 2.8.9dev.3 when INACTIVE_INPUT_STYLE_VH is defined,
+ for problem introduced by 2.8.8dev.17 code-cleanup -GV
+* trim unnecessary intllib symbols from src/chrtrans/makefile.in -TD
+* when cross-compiling, trim LDFLAGS from makefile rule linking makeuctb,
+ because it is a build tool, which should generally use BUILD_LDFLAGS
+ (patch by Thomas Petazzoni)
+
+2018-05-06 (2.8.9dev.18)
+* ignore content-encoding in HTContentToCompressType() if the content-type is
+ known, to improve the suggested filename (report by Russell Bell) -TD
+* add support for using client certificate with OpenSSL configuration (patch
+ by Elliot Thomas).
+* fix a few more memory leaks -TD
+* put Lynx.leaks file in home directory like Lynx.trace (report by GV) -TD
+* fix a memory leak in HTFTP.c -GV
+* modify HTDoConnect(), adding a check for keyboard interrupt with 'z' in the
+ select-loop -TD
+* modify legacy feature from Lynx 2.7.2 which checks the hostname of a URI
+ to guess whether to use HTTP, FTP, etc., depending upon the prefix of the
+ URIs hostname. This is now an optional feature, GUESS_SCHEME, which defaults
+ to FALSE (Debian #893907) -TD
+
+2018-03-21 (2.8.9dev.17)
+* modify samples/oldlynx.bat to check if Lynx recognizes the -lss option -TD
+* modify samples/*lynx.bat to check for environment variables that Lynx would
+ test for temp-directory, and only if those are absent will the scripts
+ attempt to create a temp-directory -TD
+* modify samples/*lynx.bat to set PATH for executing utility programs -TD
+* remove unused critSec_DNS -TD
+* use EnterCriticalSection in ws_netread rather than InitializeCriticalSection
+ since critSec_READ was initialized in LYMain.c (report by GV) -TD
+* use freeaddrinfo() in one case where free() was used (report by GV) -TD
+* implement "+" item type for gopher protocol (report by James Tomasino) -TD
+* add checks in options-menu in case no color-styles have been defined -TD
+* add Visual Studio project files for 2010, 2012 -TD
+* improve checks for strings which should not be empty -TD
+* check for empty personal-mail-address (report by TG) -TD
+* modify samples/lynx-demo.cfg to use SOURCE_CACHE:memory -TD
+* modify samples/*lynx.bat to use existing TEMP-directory if possible -TD
+* modify windows installer to select directory containing SSL DLLs and copy
+ them into lynx's application directory -TD
+* add oldlynx.bat sample script to windows installer -TD
+* use default lynx.lss color scheme with samples/lynx.bat -TD
+* modify windows installers to use static libraries for pdcurses and slang,
+ because the dll for the latter is much larger than the rest of lynx.
+ Even with this change, lynx.exe is 50% larger when using slang than with
+ pdcurses -TD
+* rename test-package for ".rpm" to "lynx-dev" for consistency with ".deb" -TD
+* improve samples/lynx.bat by using location of script rather than current
+ directory -loto1992@inbox.ru ("Smuggler")
+* permanently enable MISC_EXP feature -TD
+* remove several obsolete ifdefs: DGUX, DGUX_OLD, HP_TERMINAL,
+ REVERSE_CLEAR_SCREEN_PROBLEM, SHORTENED_RBIND, SLANG_MBCS_HACK, SNAKE -TD
+* improve logic in HTCopy used to limit reads based on content-length to
+ take into account server headers which extend past the first block read
+ (report/test-case by Dick Wesseling) -TD
+* permanently enable EXP_HTTP_HEADERS feature -TD
+* modify color-style hashing to check for collisions (reported by TG, Russell
+ Bell) -TD
+* add PREFERRED_CONTENT_TYPE defaulting to text/plain and options-menu to
+ replace an assumption in HTMIMEConvert that everything is text/html.
+ Since most servers provide a valid Content-Type for HTML, and are more likely
+ to omit it for files lacking a known suffix, defaulting to text/plain is a
+ better choice -TD
+* remove dead-code for OMIT_SCN_KEEPING -TD
+* remove dead/unreachable pretty-source code in HTML.c, noticed because
+ it complicates hashing -TD
+* improve hashing for anchors and styles by using a more suitable hash-table
+ size -TD
+* add a note in lynx.cfg telling how to remove a default key-mapping -TD
+* modify "=" command to make it possible to disable margins for the URL string,
+ by first disabling wrapping using "|" -TD
+* several fixes for Windows version -TH
+ + fix an abnormal terminate when pressing 'd'(download) on no action button.
+ + work around incompatibility in move() between POSIX and Windows.
+ ref: https://www.securecoding.cert.org/confluence/display/c/FIO10-C.+Take+care+when+using+the+rename%28%29+function
+ + fix limit-check for SJIS which prevented showing a show long title in the
+ title bar on Windows environment.
+ + fix problem with PDCurses when wrapping lines.
+ ref: lynx-dev discussions "Subject: Wrapping line behavior"
+ + fix resizing terminal problem with Windows + PDCurses.
+ This problem occurs only with some combinations of source and destination
+ screen size.
+ For example: 80x25 -> 90x20
+ + including some code clean up
+* improve consistency in help-files discussing line-edit keymaps (prompted by
+ Debian #888391) -TD
+* additional fixes to work with LibreSSL on OpenBSD 6.2 -TD
+* build-fixes for OpenSSL 1.1.0 versus 1.0.0 (patch by Quentin Minster).
+* modify configure script to make a quirk of NetBSD's make-program less
+ noticeable -TD
+* modify configure script to work around pkgsrc's misconfiguration of shared
+ libraries -TD
+* modify po/makefile.inn to ensure the temporary files have distinct names
+ to avoid problem with "make -j8" (Debian #890811) -TD
+* update makefile/batch-scripts to allow building with newer Visual Studio
+ versions, e.g., 2010, 2012, so that a 64-bit executable can be built -TD
+* repair link in lynx_help_main.html to HTML 3.2 documentation
+ (Savannah #47803) -TD
+* update eo.po, fr.po from
+ http://translationproject.org/latest/lynx
+* improved several configure macros:
+ CF_BUILD_CC, CF_CC_ENV_FLAGS, CF_CURSES_FUNCS, CF_CURSES_LIBS,
+ CF_NCURSES_CONFIG -D
+* updated ftp-site url -TD
+* update config.guess (2018-01-26), config.sub (2018-01-15)
+
+2017-07-10 (2.8.9dev.16)
+* modify configure script to warn if NLS cannot be configured, and disable
+ the feature rather than leaving it partly configured and failing during
+ the build -TD
+* modify configure script to allow pre-set $MSGFMT and $XGETTEXT variables to
+ to used to build the NLS configuration using system's native NLS support -TD
+* convert po/zh_TW.po to UTF-8 to work with Solaris10, which lacks big5 -TD
+* build-fix for OSX Panther, which has PRId64 but not SCNd64 (patch by Martijn
+ Dekker).
+* modify po-makefile to use msgmerge to align with lynx.pot, and also use sed
+ to update some obsolete homepage URLs in translations -TD
+* add a note in the comments for INCLUDE in lynx.cfg regarding the default
+ directory searches LYOpenCFG(), added in 2.8.4dev.20 (Debian #818047) -TD
+* add a check to ensure that HTML_put_string() will not append a chunk onto
+ itself (report by Ned Williamson) -TD
+* update da.po, et.po, tr.po from
+ http://translationproject.org/latest/lynx
+
+2017-07-04 (2.8.9dev.15)
+* add note in lynx.cfg about default values (Debian #408448) -TD
+* amended Backes' change to the COLLAPSE_BR_TAGS feature for compatibility -TD
+ + use ENABLE_LYNXRC to determine whether it is written to the .lynxrc file.
+ + add command-line option, etc., for controlling whether blank lines are
+ trimmed, e.g., trailing lines as well as the special case for collapsing
+ br-tags. Leading blank lines at the top of the document are untouched.
+ + modify limit for trimmed lines to retain as little as 1 line; previously
+ the trimming would go no smaller than 2 lines.
+* add command-line option and options-menu item for COLLAPSE_BR_TAGS (patch
+ by Peter Backes).
+* fix strict gcc7 warnings on OSX, aside from those due to incorrect system
+ headers -TD
+* adjust definition of alloca() in HTUtils.h to quiet bogus compiler warning
+ with NetBSD 7 -TD
+* add configure check for preprocessor -C option, overlooked in c99 -TD
+* correct logic in HTCopy() when re-reading a page (Debian #863008) -TD
+* fix lintian warnings in ".deb" test-package -TD
+* build-fix for PGI compilers, e.g., symbol conflicts -TD
+* update eo.po from
+ http://translationproject.org/latest/lynx
+
+2017-05-10 (2.8.9dev.14)
+* amend fix for Debian #841155, adding check for complete multibyte strings to
+ decide when the cell-limit has been met (Debian #862148) -TD
+* minor improvements to configure script to reduce warnings in config.log -TD
+* update config.sub (2017-04-02)
+* compiler-warning fixes for c99 on OSX -TD
+
+2017-04-29 (2.8.9dev.13)
+* amend fix for Debian #841155, adding check for special case where the
+ expected number of cells is zero (report by Larry Hynes) -TD
+
+2017-04-28 (2.8.9dev.12)
+* correct logic in cell2char(), which gave up too early in determining the
+ number of cells needed for a multibyte string in the editable text-fields
+ (Debian #841155) -TD
+* improve manual page discussion of environment variables, prompted by
+ comments in Debian #791452, which overlooked the fact that details of proxy
+ behavior are found in the user guide -TD
+* cleanup some of the user's guide formatting, e.g., for quote-characters -TD
+* consistently use "_" in command-line options table and manual page, to work
+ with program logic that treats "-" as "_", but not the reverse (report by
+ Larry Hynes) -TD
+* improved several configure macros: CF_ADD_CFLAGS, CF_CC_ENV_FLAGS,
+ CF_GNU_SOURCE, CF_LARGEFILE, CF_MATH_LIB, CF_PROG_LINT, CF_SRAND,
+ CF_XOPEN_SOURCE -TD
+* modify Windows makefile to allow SSL_LIBS and SSL_DEFS to be overridden,
+ reflecting naming-incompatibility in recent OpenSSL development -TD
+* modify ncurses-specific code to allow its TERMINAL struct to be opaque -TD
+* refine special case of server Content-Type from 2.8.7dev.11 changes to
+ decompress files offered for download when the server has gzip'd them
+ (report by TH) -TD
+* amend comparison from 2.8.8dev.10 changes to handle slang specially
+ (report/testcase by TH) -TD
+* minor cleanup of UCDomap.c -TD
+* build-fix for color-style with leak-checking -TD
+* amend merge/fixes from
+ http://en.sourceforge.jp/project/lynx-win32-pata
+ as well as problem introduced by 2.8.8dev.6 cleanup -TH
+* update ca.po, from
+ http://translationproject.org/latest/lynx
+* tidy whitespace in lynx.cfg (report by David Niklas) -TD
+* fix two more typos in the list of ENABLE_LYNXRC in lynx.cfg -TD
+* remove a repeated item for SEND_USERAGENT from lynx.cfg (Larry Hynes)
+* accept userinfo in a URL, subject to override by -auth option or -pauth
+ options. According to RFC-3986, this is deprecated, but testing shows other
+ clients support it -TD
+* fix several minor warnings reported by Coverity -TD
+* remove redundant asserts which follow a check that leads to outofmem(),
+ added in 2.8.8dev.4 to appease clang 2.6, since clang 3.x understands
+ no-return function declarations -TD
+* when converting host+params to idna, temporarily separate the params to
+ avoid a warning from idna_to_ascii_8z() -TD
+* improve warning messages from 2.8.9dev.11 fixes when stripping user/password,
+ dropping an unnecessary message and fixing a case where all-punctuation
+ user name was not logged (report by Axel Beckert) -TD
+* update config.guess (2017-03-05), config.sub (2017-02-07)
+
+2016-11-15 (2.8.9dev.11)
+* amend fix for stripping user/password to ensure that the stripped value is
+ used when connecting to the host (prompted by discussion of CVE-2016-9179
+ at https://lists.debian.org/debian-lts/2016/11/threads.html#00072) -TD
+
+2016-11-08 (2.8.9dev.10)
+* improved fix for OpenSSL 1.1 (Taketo Kabe).
+* improve warning message when stripping user/password from URL; report on
+ http://seclists.org/oss-sec/2016/q4/322 treated as a Lynx parsing error the
+ punctuation such as "?" which is permitted by RFC-1738 in a user or password
+ field. RFC-3986 subsequently modified this. The improved message points out
+ the possible confusion by users when these fields contain punctuation -TD
+* build-fix for OpenSSL 1.1 (Kamil Dudka)
+* begin work to parse gopher extension "link to URL" -TD
+* remove an obsolete comment in the manual page about -dump versus -force_html
+ (report by Peter Schmitt) -TD
+* modify samples/oldlynx to provide an empty ".lss" file as a better default
+ than providing an empty "-lss" option -TD
+* amend change made in 2.8.8dev.17 to permit multiple COLOR_STYLE items to
+ restore the ability to cancel the color-style by providing an explicitly
+ empty configuration item (in lynx.cfg, -lss or $LYNX_LSS). In lynx.cfg, it
+ is possible to follow the empty COLOR_STYLE with other data, but the -lss
+ option overrides everything, and if that is not found, $LYNX_LSS overrides
+ lynx.cfg -TD
+* correct ifdef so that if the "news" parsing is disabled at compile time,
+ HTTP.c interprets https:// links correctly when a https_proxy is set up
+ (patch by Al Walker).
+* add a limit-check in case colspan is given as zero for non-nested-table case
+ (report by Sami Liedes) -TD
+* update nl.po, sl.po from
+ http://translationproject.org/latest/lynx
+
+2016-04-26 (2.8.9dev.9)
+* add workaround for servers such as https://www.xing.com which fail to close
+ the connection when they finish sending compressed data. This relies on
+ the content-length (report by Klaus-Peter Wegge) -TD
+* restore fix to filter out left-to-right marks which was broken in refactoring
+ in 2.8.9dev.2, and also filter out right-to-left marks (Debian #808949) -TD
+* fix build for current gnutls configuration which dropped the
+ gnutls_protocol_set_priority function (reported by Axel Beckert, Andreas
+ Metzler) -TD
+* modify CF_LD_RPATH_OPT configure macro, changing FreeBSD case to use
+ -Wl,-rpath rather than -rpath option. According to FreeBSD #178732, either
+ works since FreeBSD 4.x; however scons does not accept anything except the
+ -Wl,-rpath form -TD
+* add null-pointer checks for ssl_ctx in HTTP.c in case of error from calls
+ on SSL_CTX_new (report by Yuan Jochen Kang) -TD
+* update config.guess (2016-01-01), config.sub (2016-01-01)
+* update da.po, fi.po, tr.po from
+ http://translationproject.org/latest/lynx
+
+2015-12-18 (2.8.9dev.8)
+* fix regression in SSL support (report by Axel Beckert) -TD
+* update et.po, fr.po, vi.po, zh_CN.po from
+ http://translationproject.org/latest/lynx
+
+2015-12-18 (2.8.9dev.7)
+* make the HTTP version configurable, defaulting to "1.0" (HTTP/1.0) as
+ HTTP_PROTOCOL, and make it changeable in the options menu -TD
+* switch HTTP version to 1.1, adding an explicit "close" to work around
+ the pitfall of persistent connections. This is to work around a selective
+ reading of RFC 2068 by duckduckgo.com - see
+ http://lists.nongnu.org/archive/html/lynx-dev/2015-12/index.html
+ -Axel Beckert
+* fix a potential null dereference in tidy_tls.c reported by Coverity -TD
+* extend advanced mode by showing field names in forms in the status line
+ (suggested by TG) -TD
+* fix some typos found by lintian -Axel Beckert
+* correct buffer size in pretty_html() function of LYKeymap.c -TG
+* add support for some HTML5 elements -KH
+ Using this change, you can jump to <section id="speakers">.
+ (The addition in src{0,1}_HTMLDTD.txt is copied from DIV.)
+ <section>, <article>, <main>, <aside>, <header>, <footer>, <nav>, <figure>
+* improve configure check for extended curses functions, needed for compiling
+ with ncursesw on OSX, in particular when configuring with ncurses6 (report
+ by Tom Wyant) -TD
+* set SSL_MODE_AUTO_RETRY in OpenSSL configuration, completing work needed for
+ Debian #707059 -TD
+* correct description used for "K" vs "k" key binding in manpage -TD
+* adopt some of the patches from Debian lynx package:
+ + add Delete key usage to manpage (patch by Denis Briand, Debian #74358)
+ + add $(LDFLAGS) when building makeuctb (patch by Atsuhito Kohda).
+ + add NO_BUILDSTAMP symbol to appease
+ https://wiki.debian.org/ReproducibleBuilds/TimestampsFromCPPMacros
+ + add -n option to gzip when making gzip'd helpfiles (patch by Andreas
+ Metzler).
+ + add support for client certificates (patch by Simon Kainz, Debian #797901).
+* use POSIX locale when sorting entries in cfg_defs.h (patch by Reiner Hermann,
+ Debian #792770).
+* move homepage for Lynx from
+ http://lynx.isc.org
+ to
+ http://lynx.invisible-island.net
+ because ISC has ended support -TD
+* change "GNU Public License" to "GNU General Public License" for consistency
+ (report by Axel Beckert) -TD
+* free a use-after-free in scan_cookie_sublist (Redhat #1120925) -TG
+* updates for configure macros from ncurses and xterm -TD
+* fix for gnutls logic to support rehandshake on negotiation for optional
+ client certificate, e.g., for https://contributors.debian.org (patch by
+ Simon Kainz, Debian #797059).
+* update ca.po, sv.po, et.po from
+ http://translationproject.org/latest/lynx
+* use gnutls_set_default_priority() to simplify algorithm priorities in the
+ gnutls configuration as well as track occasional changes in that library
+ (patch by Andreas Metzler, Debian #789189, Debian #784430).
+* correct logic in LYsetRcValue() from 2.8.8dev.13, which would free the wrong
+ pointer if the input had leading blanks (patch by Ruda Moura).
+* fix CF_CHECK_SIZEOF autoconf macro to work when its working variables have
+ been preset to an empty value (report by Andrew Arensburger) -TD
+* update config.guess (2015-10-21), config.sub (2015-08-20)
+
+2015-05-06 (2.8.9dev.6)
+* add a note about OCSP to url-support documentation (Debian #745835) -TD
+* change defaults for SSL prompts when a problem is detected to "no" (Debian
+ #783477) -TD
+* if an SSL error message is too long for the screen-width, trim it with an
+ ellipsis so that the "(y)" part of the prompt for continuing will be visible
+ (Debian #783476) -TD
+* update test-packages to use ncurses6 test-packages -TD
+* modify configure script to check for ncurses ".pc" files first before looking
+ for the "ncurses*-config" scripts -TD
+* modify configure script to accept a release-number for the ncurses/ncursesw
+ values of the "--with-screen" option, e.g., "--with-screen=ncursesw6" -TD
+* cosmetic fixes for autoconf macros to avoid vi-workaround -TD
+* update da.po, et.po, fr.po, nl.po, vi.po from
+ http://translationproject.org/latest/lynx
+* regenerated lynx.pot, sent to translation project -TD
+* update config.guess (2015-03-04), config.sub (2015-03-08)
+
+2015-04-12 (2.8.9dev.5)
+* add codes U+200A, U+200B to def7_uni.tbl (prompted by report by Sven
+ Hartrumpf, as well as referring to
+ https://www.cs.tut.fi/~jkorpela/chars/spaces.html) -TD
+* restore large buffer-size from follow_link_number() which was altered in
+ 2.8.8dev.10 changes to use LYgetBString() (Debian #699068) -TD, -TG
+* loosen the check in IsOurFile() to permit hard-linked files
+ (Debian #429606) -TD
+* update ca.po, cs.po, et.po, fi.po, fr.po, id.po, nl.po, pt_BR.po, ru.po,
+ sl.po, tr.po, vi.po from
+ http://translationproject.org/latest/lynx
+
+2015-01-25 (2.8.9dev.4)
+* modify check after gnutls_certificate_verify_peers2() to use
+ gnutls_certificate_verification_status_print() when available, to give
+ potentially more details on certificate revocation (patch by Andreas Metzler,
+ Debian #745835, Debian #752610)
+
+2015-01-05 (2.8.9dev.3)
+* correct shortcut for "Send To" link used in Inno Setup script, broken in
+ 2.8.8dev.15 -TD
+* amend change made in 2.8.8dev.10 to LYLocal.c get_filename(), ensuring that
+ the bstring parameter can be (re)allocated within that function's call to
+ LYgetBString() (report by Raoul Megelas) -TG
+* build-fixes for djgpp 2.04 and gcc 4.8.4 using Watt-32 -GV
+
+2014-12-21 (2.8.9dev.2)
+* correct an inconsistent check for reload using isLYNXCGI() in the
+ options-screen -TD
+* add script after using msginit to create en.po, to work around renaming in
+ Cygwin environment -TD
+* improve overlay of field contents in form for "-dump" option; the change
+ in 2.8.8dev.3 did not take into account UTF-8 values (Debian #770011) -TD
+* correct a bug in the map_string_to_keysym() function introduced in
+ 2.8.8dev.17: as used via the remap() function, this returns the curses
+ code for a special key rather than Lynx's internal code (Debian #769601) -TD
+* add checks when translating from UTF-8 to Unicode, to ensure that only the
+ shortest encoding is accepted. Other/longer encodings are mapped to the UCS
+ replacement character as in xterm (Debian #763268) -TD
+* modify LYExpandHostForURL() to call HTGetAddrInfo(), allowing DNS lookups
+ for IPv6 to be interrupted, e.g., by typing ^G. This was a path overlooked
+ in 2.8.8dev.13 (reports by Chad Kline, etc.) -TD
+* drop libgnutls-extra when using --with-gnutls-compat option -TD
+* drop libgcrypt dependency when building with gnutls, using gnutls_rnd()
+ rather than gcry_randomize() (adapted from patch by Andreas Metzler,
+ Debian #753699) -TD
+* fix a reference-after-free in scan_cookie_sublist(), probably fixing RedHat
+ #1120925 -Mike Gorse
+* update eo.po, id.po from
+ http://translationproject.org/latest/lynx
+* improve workaround for too-long pathnames in LYPrint.c SetupFilename() -TD
+* fix a few inconsistencies between #if / #ifdef, including one for sleep()
+ which broke cross-compiles for MinGW -TD
+* updated/improved configure script macros (TD):
+ + CF_ACVERSION_CHECK: work around another gratuitous incompatibility
+ introduced in 2.69 (reported by Ross Burton, openembedded.org)
+ + CF_ADD_CFLAGS: workaround for ash-shell
+ + CF_ADD_LIBS: workaround in CF_X_TOOLKIT uses pkgconfig, whose files
+ generally are using incomplete dependencies - in turn introducing lots of
+ duplication. filter out the duplicates.
+ + CF_CHECK_CFLAGS: workaround for ash-shell
+ + CF_CURSES_FUNCS: improve workaround for weak-linkage, seems to fix tests
+ with NetBSD 6.1
+ + CF_INTEL_COMPILER: cleanup the -no-gcc option which was leftover from
+ testing - prcs does not build with this option.
+ + CF_MAKEFLAGS: workaround for GNU make 4.0 incompatibility with previous
+ releases.
+ + CF_SUBDIR_PATH: add /usr/pkg and /opt/local to help configuring with
+ pkgsrc and macports -TD
+ + CF_XOPEN_SOURCE: Minix3.2 ifdef's the POSIX.1-2001 functions inside
+ _NETBSD_SOURCE, even though it was released 2012-02-29 - appease it. At
+ the same time, turn on the verbose flag to show that most platforms need
+ platform-specific define's to get POSIX (sic). Also, add case for UnixWare
+ (report/discussion with Mark Ryan).
+ + CF_X_ATHENA: add --with-Xaw3dxft option
+ + CF_X_TOOLKIT: add workaround for breakage in XQuartz upgrades
+* add check to ensure that "submit" command from 2.8.8dev.10 is performed
+ in a form (report by Karen Lewellen) -TD
+* update config.guess (2014-03-23), config.sub (2014-07-28)
+
+2014-03-12 (2.8.9dev.1)
+
+2014-03-09 (2.8.8rel.2)
+* correct errata in test-files which cause broken links in break-out directory
+ in lynx.isc.org server -TD
+* amend change from 2.8.8pre.2, to ensure that MinGW libraries already
+ declaring 'sleep()' will build -TD
+* drop unused save/compress rules from makefile.in, because fixing umask for
+ these is pointless -TD
+* modify makefile.in to establish sane umask value in the "install-doc" rule
+ (report by Rajeev V Pillai) -TD
+* build-fix for NetBSD, whose curses library provides use_default_colors(),
+ but the package turns off the keymap feature (patch by Thomas Klausner).
+
+2014-02-14 (2.8.8rel.1)
+2014-02-14 (2.8.8pre.5)
+* change quoting for fixup to help_files.sed in 2.8.8dev.17 to work around
+ bug in cygwin's make/sed programs -TD
+* change quality value for application/xhtml+xml mime type added for Debian
+ #184482, to ensure that it is offered as one of Lynx's internal types on
+ an "Accept:" line sent to the server (Debian #725178) -TD
+* trim unexpected query-parameters from file: URIs when checking for their
+ presentation and compression types. Not all browsers do this, etc. -TD
+* modify forms-submit to trim query-parameters from the action URI if it
+ happens to be a file-URL. IE and some other browsers do this. The RFCs
+ do not mention this since forms are an HTTP feature (Debian #738121) -TD
+* reviewed command-line options which were not provided in lynx.cfg; added
+ others which could be useful for dumps (i.e., force_html, hiddenlinks,
+ listonly, list_inline, localhost, short_url, with_backspaces) -TD
+* add dont_wrap_pre to lynx.cfg (request by GV) -TD
+* use idn_free() rather than ordinary free (patch by GV)
+* build-fix when alt-bindings are disabled (patch by GV)
+* correct sense of --disable-alt-bindings option in configure script (prompted
+ by report by GV) -TD
+
+2014-02-04 (2.8.8pre.4)
+* modify the LOCALE_CHARSET feature to provide a default value for the
+ ASSUME_CHARSET feature aka "display-charset" (Debian #737416) -TD
+* fix two bugs in print-to-file from 2.8.8dev.10 changes -TD
+ + suggested filename suffix for text/html was ".html" rather than ".txt"
+ + using ^U to clear the filename to print to did not cancel the prompt
+ (report by Klaus-Peter Wegge)
+* disable EXP_JAPANESEUTF8_SUPPORT if the system has no iconv support -TD
+* modify makefiles to perform the src/chrtrans rules from the top-level rather
+ than via the src-level, solving the issue of "makefile races" -TD
+* reviewed minor fixes from OpenBSD CVS for these issues:
+ - fix makefile races [espie]
+ - read/write result checking fixes to avoid unsigned comparisons vs -1 [krw]
+ However, the former is not an improvement; kept only the latter -TD
+
+2014-01-11 (2.8.8pre.3)
+* apply analogous changes to tidytls.c interface -TD
+* apply openssl patch from openSUSE package for Lynx to modify the SSL options
+ to omit the SSLv2 and compression features (report by BJP) -TD
+* add check for alternate package "libssl" also used with Fedora20 -TD
+* fix a check in configure-script for openssl subdirectory in includes. It
+ happened to work in most cases due to a spurious blank in the pkg-config
+ file; this was removed recently, e.g., for Fedora20 -TD
+* fill-in some dangling links in test-files -TD
+* build-fix for --disable-prettysrc (reported by Don Hsi-Yun Yang aka
+ "omoikane") -TD
+* review/improve html helpfiles -TD
+* ensure that $(sysconfdir) exists in makefile as dependency of install-help
+ rule -TD
+* update config.guess (2014-01-01), config.sub (2014-01-01)
+
+2013-12-17 (2.8.8pre.2)
+* change makefile.msc and lynx-slang.iss to use dll for slang -TD
+* change URL for HELPFILE in lynx.cfg, etc., to omit version-specifics -TD
+* update example of options menu shown in user-guide -TD
+* restore ^Z maxscreen-toggle for Windows, omitted in 2.8.8dev.17 cleanup -TD
+* typographical fixes for manpage (patch by Bjarni I. Gislason, Debian #732236)
+* allow fallback sleep() function to be used for MinGW -GV
+* remove special case in configure.in which added "-lcompat" to $LIBS
+ for OpenBSD, MirBSD and EkkoBSD (Christian Weisgerber, Thorsten Glaser).
+* build-fix for --disable-forms-options -TD
+* omit request for admin-access in NullSoft installer, since lynx could be
+ installed in user's directory -TD
+* change Windows default for LYNX_LSS_FILE to not use a directory-path -TD
+
+2013-11-28 (2.8.8pre.1)
+2013-11-28 (2.8.8dev.17)
+* revise/update counts in README.metrics, using a script replacing a manual
+ procedure -TD
+* amend check for magic header bytes from 2.8.8dev.3 for "deflate" to limit it
+ to the 3-bit block header described in RFC-1951 -TD
+* install the sample-files in the dpkg test-script -TD
+* add configure option --with-cfg-path and environment variables LYNX_CFG_PATH
+ to provide search-list capability for the ".cfg" and ".lss" files -TD
+* modify configuration of COLOR_STYLE value in lynx.cfg, allowing multiple
+ filenames to be specified and providing those as choices in the O'ptions
+ menu (Debian #404893) -TD
+* updates for lynx_help_main.html -TD
+* update URLs in about_lynx.html -TD
+* add internal URL "LYNXEDITMAP:", which is (like "LYNXKEYMAP:") generated,
+ making that the primary page for field-editing help -TD
+* improve DOSPATH-related logic in HomeEnv(), making this work properly with
+ Windows Vista and 7. The feature is needed to read Lynx's bookmarks file
+ from the user's "Personal" shell-folder (report by Manuel Nunez) -TD
+* modify samples/*.bat to work when running in a directory whose pathname
+ contains spaces -TD
+* reduce required privileges for installing in lynx.iss -TD
+* improve sed expression appended to help_files.sed to fix a case for the
+ edit-helpfiles which left a ".gz.gz" suffix for compressed filename URLs,
+ overlooked since 2.8.1pre.3 -TD
+* modify logic in lkcstring_to_lkc() to allow named keys, e.g., from curses,
+ to be used consistently in a KEYMAP directive -TD
+* add version-info to LYIcon.rc -TD
+* add symbols in Keysym_Strings[] and table in setup_vtXXX_keymap() for
+ function keys 2-12, to improve keymap-configurability -TD
+* change extra-key #define's in LYStrings.h to enum -TD
+* cleanup pre-2.7 debris from LYStrings.c and LYStrings.h -TD
+* modify tables for key-bindings and edit-bindings to allow them to be reloaded
+ to their initial values -TD
+* add check in get_connection() for ftp-connections to ensure that a password
+ from a URL is non-empty -TD
+* add samples/oldlynx.bat to demonstrate how to use non-color-style -TD
+* add NSIS script, to allow building Windows installer via cross-compiling -TD
+* fixes to configure script and makefiles to work with empty $prefix, e.g.,
+ as used in MSYS -TD
+* improve configure check for sleep() for cross-compiling to MinGW -TD
+* modify configure check for inet_addr() for cross-compiling to MinGW -TD
+* add configure check for Win32 flavor of PDCurses when cross-compiling to
+ MinGW using the "--with-screen=pdcurses" option -TD
+* improve color-style simulation of old color scheme by coloring input fields
+ with color #5 -TD
+* correct search logic to match links which are wrapped on the right margin.
+ Previous fixes to highlight arbitrarily long links overlooked this case
+ (Debian #546264) -TD
+* modify the INFO page, normally bound to "=", to show decoded strings for
+ URLs, e.g., which use %xy hexadecimal encoding. The decoded strings are
+ shown on the line following the encoded URLs if the strings are different.
+ Also if display-charset is UTF-8, modify -dump "References" URLs to show
+ the corresponding decoded strings for consistency with the text which is
+ already in UTF-8. Other URLs such as that shown in the status area are
+ shown in encoded form per previous discussion which recommending doing this
+ to address phishing attempts (Debian #398274) -TD
+* simplify file-URLs shown in reference list of -dump by trimming unnecessary
+ "localhost", e.g.,
+ file://localhost/XXX
+ becomes
+ file:///XXX
+ (Debian #334787) -TD
+* extend the "Bad HTML" warning feature to -dump option when the -stderr
+ option is also set (Debian #398304) -TD
+* add -list_inline option, which modifies -dump output to put links inline with
+ the text rather than in a list at the end of the dump (Debian #584080) -TD
+* add clarification in manpage regarding -force_html option versus -dump or
+ -crawl (Debian #254603, Debian #295273) -TD
+* improve manpage descriptions of -reload, -get_data and -post_data (Debian
+ #350853) -TD
+* modify manpage synopsis to make it clearer that Lynx accepts more than one
+ path and/or URL on the command-line. The paragraph explaining this was
+ added in 2.8.6dev.5 (Debian #350853) -TD
+* update COPYHEADER, clarifying license issues -TD
+* minor change to Content-Length logic from 2.8.8dev.13 to work with Amazon's
+ cookies (Debian #720541) -TD
+* improve warning message for GNUTLS_CERT_SIGNER_NOT_FOUND (Debian #695653) -TD
+* ignore non-fatal return codes from gnutls_handshake introduced by SNI change
+ in 2.8.8dev.15 (Debian #724812, patch by Hans Wurst).
+* updates for configure macros -TD
+ + CF_ACVERSION_CHECK, fix from byacc for "newer" autoconf.
+ + CF_ADD_LIB_AFTER, fix from xterm for problem with -Wl,xxx options
+ + CF_CURSES_LIBS, modify to allow external script to set $cf_term_lib and/or
+ $cf_curs_lib
+ + CF_INTEL_COMPILER, $host_os needs AC_CANONICAL_HOST
+ + CF_MIXEDCASE_FILENAMES, add msys / msysdll to known host/platform types
+ + CF_RPATH_HACK, use sort and uniq rather than sort -u, to work with HPUX
+ 11.11, etc.
+ + CF_TRY_PKG_CONFIG, set variables for consistent usage of this macro
+ + CF_XOPEN_SOURCE, add msys / msysdll to known host/platform types
+ + CF_X_ATHENA, trim extra X libraries after updating lists, to work with ld
+ --as-needed option which in effect uses only the first mention of the
+ library. If that does not follow everything that depends on the library,
+ ld will silently fail to resolve symbols.
+* update config.guess (2013-06-10), config.sub (2013-09-05)
+
+2013-07-29 (2.8.8dev.16)
+* build-fix for setmode() definition on Cygwin -TD
+* modify HTUtils.h to work around header conflict with Cygwin w32api and
+ openssl 1.0.1e (prompted by report/patch by Supriyo Biswas) -TD
+* protect redefined errno values for Windows port from redefinition warnings
+ when using MinGW build, since the WSAxxx values are what the configuration
+ actually uses -TD
+* modify <address> tag to treat it like <p> when used within a list -TD
+* update fi.po from
+ http://translationproject.org/latest/lynx
+* add on/off toggles to options menu for the color-style and default-colors
+ features, to help deal with packages which enable default colors without
+ adjusting the color-style settings to avoid having yellow text on a white
+ background (report by Stephen Isard) -TD
+* add -default-colors command-line option to allow toggling the state of the
+ DEFAULT_COLORS setting from lynx.cfg -TD
+* improve discussion of -dump and -force_html in manpage (Ubuntu #1112568) -TD
+* cleanup quoting and use of ASCII "-" versus hyphen in manpage -TD
+* add checks for zero-length strings in a few places to prevent infinite loop
+ when the focus moves to a text-field which is past the right margin due to
+ improper placement for the nested-tables configuration (report by Rajeev V
+ Pillai) -TD
+* update doctype for html documentation to 4.01 strict -TD
+* correct handling of backslash in TrimCommand() function introduced in
+ 2.8.6dev.4, used to process the commands for "test=" in mime-types -TD
+* correct 2.8.3dev.13 check for permissible place to split UTF-8 encoded text,
+ reported by Coverity -TD
+* make DONT_TRACK_INTERNAL_LINKS logic configurable via lynx.cfg as
+ TRACK_INTERNAL_LINKS; the configure script now sets the default value -TD
+* fix most issues found by clang 3.2 analyze -TD
+* fix most issues found by Coverity scan -TD
+
+2012-11-18 (2.8.8dev.15)
+* corrected position of highlighting from search/whereis function when using
+ multibyte characters (Debian #673385) -TD
+* modify default case for HTLoadGopher() to use the file's suffix to obtain
+ a MIME mapping rather than always storing unknown types to disk (suggested by
+ Dario Niederman) -TD
+* modify ^X-e handling to not limit the result to the form field's length
+ (report by Keith Bowes) -TD
+* modify the Inno Setup files to show lynx's version numbers. Development
+ and prerelease versions are indicated in the numeric-only versions by
+ prefixing a "10" or "20" -TD
+* ask for filesize when downloading via ftp, to use this in the read-progress
+ ETA -TD
+* fix special case when -dont_wrap_pre option is used, to restore space between
+ words which was lost when inserting a soft newline used to splice together
+ segments of a long line (Ubuntu #806749) -TD
+* provide more readable ETA message as an option (prompted by patch by Joerg
+ Hahn) -TD
+* add GNUTLS call to enable SNI (Server Name Indication) extension (Ubuntu
+ #732177) -TD
+* correct typo for -bibhost option in manpage (Redhat #854574) -TD
+* revise nsl-fork logic for passing addrinfo and hostent data back to eliminate
+ fixed limit on the number of records to return -TD
+* correct problem with loop logic in fill_addrinfo() exposed by multiple
+ addresses from
+ http://fbcdn-sphotos-d-a.akamaihd.net
+ (report/analysis by TG) -TD
+* updates for configure script macros (TD):
+ + add 3rd parameter to AC_DEFINE's to allow autoheader to run
+ + remove unused macros
+* update nl.po from
+ http://translationproject.org/latest/lynx
+* improve checking of certificates in the gnutls_certificate_verify_peers2()
+ by handling special case where self-signed certificates should be reported
+ (patch by Jamie Strandboge).
+* update config.guess (2012-09-25), config.sub (2012-08-18)
+
+2012-08-22 (2.8.8dev.14)
+* reset anchor's actual-length calculation at the end of pumpData() to handle
+ scenario where this is used for internal data movement, i.e., for
+ decompressing files (report by Owen Leibman, Debian #681214) -TD
+* drop two files overlooked in previous commit (TD):
+ lynx.rsp and WWW/Library/Implementation/HTFWriter.c
+
+2012-08-15 (2.8.8dev.13)
+* make nsl-fork work for the DNS lookup using getaddrinfo, i.e., for IPv6
+ configurations (report by FLWM) -TD
+* add U+0218, U+0219, U+021a, and U+021b to 0x53, 0x73, 0x54, and 0x74,
+ respectively, for Romanian s/t with cedilla in def7_uni.tbl (Ralph Babel)
+* modify handling of "set" in -cmd_script option to try both cfg-file and
+ rc-file settings (prompted by discussion with Andrew Watts) -TD
+* update configure script to add --datarootdir option, which changes the
+ default for man-page from /usr/lib to /usr/share -TD
+* modify configure check for sizeof(time_t), sizeof(off_t) to help recover if
+ it is run in a deficient environment such as busybox -TD
+* limit downloaded files by Content-Length if any, to match behavior of IE,
+ Firefox and some other browsers; this is not addressed in RFC 2616 (Debian
+ #681214) -TD
+ For more information, see "Content-Length in the Real World" by Eric Law:
+ http://blogs.msdn.com/b/ieinternals/archive/2011/03/09/browsers-accommodate-incorrect-http-content-length-and-sites-depressingly-depend-on-it.aspx
+* fix an unbounded loop in restrictions_fun() which could cause a core dump
+ (Debian #616107) -TD
+* add LDFLAGS to top-level makefile.in, for consistency with other recursive
+ options (suggested by Naomasa Maruyama) -TD
+* modify makefile.in and src/makefile.in to pass make-flags, e.g., "-n" for
+ POSIX make -TD
+* updated configure macros (TD):
+ + add check for clang warning options
+ + check for tinfo library, which may be present
+ + omit -Wpointer-arith check for pre-3.0 gcc
+ + add check for 'make' programs ${MAKEFLAGS} versus ${MFLAGS}, for recursive
+ operation.
+* updated list for "$(TABLES)" in src/makefile.in so that parallel builds work
+ properly (patch by Diego Elio Petteno)
+* remove extra "$(LDFLAGS)" from src/makefile.in when linking lynx (patch by
+ Josef Sontgen)
+* correct formatting of large file-sizes in directory listing (Debian
+ #666213) -TD
+* improve checking of certificates in the gnutls_certificate_verify_peers2()
+ (report by Martin Georgiev) -TD
+* update de.po eo.po sv.po vi.po from
+ http://translationproject.org/latest/lynx
+* use PDCurses "wide" variation in makefile.msc -TD
+* modified quoting for parameter values passed to blat mailer to ensure that
+ it handles embedded blanks (report by pfourier) -TD
+* fix regression introduced by changes for Debian #603648 -TD
+* modify makew32.bat and makefile.bcb to use GnuWin32 packages to simplify
+ builds with Borland 5.51 C++ compiler (prompted by discussion with
+ pfourier) -TD
+* add configure check for windres needed for mingw build if cross-compiling -TD
+
+2012-02-22 (2.8.8dev.12)
+* treat charsets ISO-8859-8-E and ISO-8859-8-I as aliases of ISO-8859-8
+ (Owen Leibman)
+* amend the dev.10 change to HTLoadDocument(), which broke caching of forms,
+ to limit it to just the case where the user has pressed ^R, etc (report by
+ TG) -TD
+
+2012-02-19 (2.8.8dev.11)
+* correct help-message for -html5_charset option -KH
+* correct a typo in strtol change from dev.10 which caused hexadecimal numeric
+ entities to be misrendered -TG
+* update eo.po, et.po and tr.po from
+ http://translationproject.org/latest/lynx
+* correct dll name for bzip2 in lynx.iss package script -TD
+
+2012-02-12 (2.8.8dev.10)
+* updated po/lynx.pot; there are a few new messages -TD
+* add "submit" and "reset" commands (Debian #603645) -TD
+* add "pwd" command, to show current working directory in the statusline -TD
+* modify check in HText_endForm() when a form contains only a single input
+ field, to allow a return in any text-like field other than textarea to cause
+ the form to be submitted (Debian #603648) -TD
+* add bzlib to win32 makefile.msc -TD
+* define WIN32_LEAN_AND_MEAN in makefile.msc to accommodate naming conflict
+ in recent Win32 SDKs, which otherwise include winsock.h in windows.h -TD
+* fixes for the dev.9 Win32 feature to toggle between normal/fullscreen,
+ by checking the actual screensize after maximizing the display -TD
+* use ASCII apostrophe for 7-bit approximation to U+02bd as well -TD
+* use ASCII apostrophe 0x27 for 7-bit approximation to Unicode apostrophe
+ U+02bc (suggested by Ralph Babel)
+* update LYLeaks.c / LYLeaks.h to include the bstring allocation, copy and free
+ functions -TD
+* several fixes for the -find-leaks option, e.g., include LYLeaks.h in a few
+ modules, modify the StrAllocVsprintf function to update the bookkeeping,
+ etc -TD
+* move call to LYCanWriteFile into LYValidateOutput, to make prompts for
+ download, print and upload more alike -TD
+* correct an old bug in send_file_to_file(), used when printing a page to a
+ file, which prevented its check for appending to an existing file -TD
+* modify LYValidateFilename to use LYTildeExpand -TD
+* modify LYConvertToURL to use LYTildeExpand for Unix, and further modify
+ LYTildeExpand to lookup given user's home directory, thereby making commands
+ such as "g ~root/tmp" work as expected -TD
+* replaced most LYgetStr calls with LYgetBString, except for LYMail.c and
+ LYNews.c since those do use LYgetStr's limits as it was designed. Other
+ calls generally did not need those limits -TD
+* modify finish_ExtEditForm to eliminate wrapping when an edited line is longer
+ than MAX_LINE. The user is still offered the choice of wrapping to the
+ displayed size of a TEXTAREA, but if declined, the TEXTAREA's content will
+ not be wrapped -TD
+* modify LYgetstr, making it call revised function LYgetBString which handles
+ bstring's, and allows editing fields which can grow without fixed buffer
+ limits. In particular, forms all use the same calls, which means that
+ their result is no longer limited by MAX_LINE -TD
+* extend ^X-e editing of textarea's to include single-line fields -TD
+* modify comparison for splitting lines to allow for long preformatted lines,
+ e.g., using &nbsp;'s to not wrap when the line-wrap mode is disabled -TD
+* modify cfg2html.pl to handle options which contain a digit, e.g.,
+ HTML5_CHARSETS whose default value was not marked properly -TD
+* modify HTLoadDocument() to not retain a cached document if user is explicitly
+ doing a refresh. This fixes the case for a #fragment url, which was
+ otherwise treated as the same as the address without the #fragment -TD
+* clarify version of GPL used in README (request by Paul Menzel) -TD
+* modify HTLoad() to discard charset information before reloading a document,
+ in case the server changes the content-type information between loads
+ (report by Stanislav Brabec) -TD
+* use tidy to indent html documentation -TD
+* provide a way to substitute parameters in URLs for jumpfiles (adapted from
+ patch by Mark Skilbeck -TD
+* ensure that button/input tags have a value for display, in case the tag is
+ improperly terminated (report by Aki Helin) -TD
+* work around glibc bug in sscanf in SGML_character() using strtol() (report by
+ Aki Helin) -TD
+* add check for charset attribute on meta element -KH
+* eliminate ON/OFF macros, using TRUE/FALSE both to work around breakage from
+ zlib 1.2.5.1 changes as well as because they were unnecessary (GenToo
+ #383113) -Nikos Chantziaras, TD
+* updated several configure script macros (TD):
+ CF_ANSI_CC_CHECK, CF_CURSES_LIBS, CF_LD_RPATH_OPT, CF_NETLIBS,
+ CF_XOPEN_SOURCE, CF_X_ATHENA_LIBS
+
+2011-06-12 (2.8.8dev.9)
+* modify cfg2html to add ".url" directive for referencing RFC's etc -TD
+* document blat/blatj usage in lynx.cfg -TD
+* add/use WriteStreamTitle(), to provide doctype for cookie-jar page, used to
+ help validate the page -TD
+* improve readability of cookie-jar page by showing the unescaped cookie
+ values, other minor formatting changes -TD
+* modify cookie domain-matching to accommodate RFC 6265, which states that a
+ leading dot on a domain attribute should be discarded (report by Sebastien
+ Hinderer) -TD
+* integrate most of the changes from patch in 2.8.6rel.4 package at
+ http://en.sourceforge.jp/project/lynx-win32-pata -TH, TD
+ + provide toggle between normal/fullscreen
+ + ifdef'd changes for FEP.
+ + correct a message translation in ja.po
+ + modify Xsystem.c to not use MinGW's system() call.
+ + add three items to lynx.cfg
+ conv_jisx0201kana
+ message_language
+ wait_viewer_termination
+ + replace ifdef's for CONV_JISX0201KANA_JISX0208KANA with configuration
+ variable conv_jisx0201kana
+ + modify makefile.bcb and lynx.rsp to use openssl and intl libraries.
+ + add feature ifdef'd with USE_PROGRAM_DIR which adds fallback definitions
+ for pathnames to use the directory of lynx.exe
+ + add check for unsafe filenames in DOS/Windows, e.g., those that correspond
+ to a device.
+* update command-line syntax for the blat mailer, to work with blat 2.6.2 -TD
+* change default in makelynx.bat to assume blat rather than blatj, because
+ the latter does not provide a way to authenticate user/password on a mail
+ server -TD
+* change #define's for addrlist-page and alt-bindings to reflect their
+ non-experimental status -TD
+* change default for --enable-addrlist-page configure option to enabled -TD
+* modify blat/blatj configuration so that support for both is compiled-in
+ for DOSPATH configurations. Add "-altblat" option to select blat vs blatj.
+ Define USE_ALT_BLAT_MAILER to specify which is the default (prompted by
+ report by LarryL) -TD
+* correct an interaction between LYCloseOutput() and LYRemoveTemp() as used in
+ send_file_to_mail(), to allow a temporary file to be closed and used by
+ external program before removing it -TD
+* modify lkcstring_to_lkc() to accept hex/octal values, allowing those in the
+ KEYMAP configuration as suggested by the commented lines in lynx.cfg (report
+ by Richie Wood) -TD
+* build-fix for DEC C 5.x with _DECC_V4_SOURCE defined, i.e., missing
+ declaration of "off_t" (report/analysis by Rod Reiger) -TD
+* build-fixes for Alpha VMS V8.3 with C V7.1-015, based on lynx 2.8.7
+ development snapshot (report/analysis by Scott Harrod) -TD
+* improve scripts/tbl2html.pl, to handle translation of octal escapes in the
+ approximation comments -TD
+* amend implementation of "readonly" attribute from 2.8.7dev.10 to distinguish
+ it from "disabled" (report by David Paschal) -TD
+* amend change to cookie prefix matching from Debian #460108. The discussion
+ overlooked this definition from RFC 2109:
+ Path Defaults to the path of the request URL that generated the
+ Set-Cookie response, up to, but not including, the
+ right-most /.
+ In that context, lynx was correct to extract the default "path" attribute
+ of
+ http://jukebox/cgi-bin/disorder
+ as
+ /cgi-bin
+ rather than
+ /cgi-bin/disorder
+ as asserted in the report. However, lynx warned unnecessarily (according to
+ the bug report) about the given path attribute. Deciding whether to suppress
+ this warning is under control of the user via the lynx.cfg setting
+ COOKIE_QUERY_INVALID_DOMAINS since 2.8.2dev.16 (report by Owen Leibman) -TD
+* add eo.po (Esperanto) from
+ http://translationproject.org/latest/lynx
+* modify format of ADVANCED_COOKIE_CONFIRMATION message in nl.po per guideline
+ to allow localized single-letter responses to prompt (report by Jurgen
+ Gaeremy) -TD
+* add configure check for <bsd/random.h>, used in Debian package -TD
+* modify src/tidy_tls.c to use gnutls_priority_set_direct() in preference to
+ various access functions, to eliminate deprecation warnings (report by
+ Andreas Metzler) -TD
+* updated several configure script macros (TD):
+ CF_CURSES_CPPFLAGS, CF_CURSES_FUNCS, CF_CURSES_HEADER, CF_CURSES_LIBS,
+ CF_CURSES_TERM_H, CF_DISABLE_RPATH_HACK, CF_PDCURSES_X11, CF_PKG_CONFIG,
+ CF_RPATH_HACK, CF_STRUCT_TERMIOS, CF_XOPEN_CURSES, CF_XOPEN_SOURCE,
+ CF_X_ATHENA_LIBS
+* update config.guess (2011-01-01), config.sub (2011-04-01)
+
+2011-01-10 (2.8.8dev.8)
+* correct sense of menu-name parameter in add_item_to_list() from dev.7
+ changes (report by Larry Hart) -TD
+* remove duplicate copy of CF_TRY_PKG_CONFIG added to aclocal.m4 in 2.8.8dev.4,
+ which caused autoconf-2.13 to emit weird error messages about undefined
+ symbols (report by TG) -TD
+
+2010-12-11 (2.8.8dev.7)
+* add PERSONAL_MAIL_NAME to options menu and .lynxrc (Debian #603647) -TD
+* remind user how to cancel message (Debian #292787) -TD
+* add HTML5_CHARSETS feature, which allows the user to choose whether to
+ interpret pages without an explicit charset according to the HTML5
+ "compatibility" feature (Debian #604466, Debian #514897) -TD
+* add EXTERNAL_MENU feature to lynx.cfg, which allows the user to customize the
+ menu-entry shown, e.g., to suppress the display of the URL
+ (Debian #603646) -TD
+* cleanup URLs in lynx documentation -DK
+* add check in getfile() when handling a "mailto:" url, to prevent it when the
+ user has requested a dump (Debian #563308) -TD
+* improve configure check for IDNA library, which may depend upon intllib,
+ e.g., building with mingw on cygwin -DK
+* modify autoconf macros which look for X libraries, e.g., for PDCurses, to
+ accommodate ongoing changes in xorg package scripts -TD
+* reorganize autoconf macro CF_WITH_CURSES_DIR, to make it usable for both
+ curses and ncurses -TD
+* several changes to autoconf macros to lessen use of legacy shell feature
+ "${name-value}" in favor of "${name:-value}", since the former is broken in
+ recent versions of bash -TD
+* apply overlooked patch from pre-2.8.5, makes RMDIR_PATH configurable
+ (report/patch by Frank Heckenbach).
+* correct one of the places where link-number is formatted, for form input
+ anchors. This was broken in dev.6 by the -unique_urls changes (report by
+ DK) -TD
+* undo a cleanup change to link-types from dev.6 which broke some uses of
+ input-anchors (report by FLWM) -TD
+* minor formatting improvements to sources using cindent 2.0-20101107 -TD
+* restore \r to \n conversion in HTML_put_character(), broken in gcc warning
+ cleanup (report by FLWM) -TD
+* fix a double-free in make_argv() (report by FLWM) -TD
+* add a memset in RestoreSession(), fixes uninitialized memory reference for
+ the VLINK section -PBM
+* update config.guess (2010-09-24), config.sub (2010-09-11)
+
+2010-10-04 (2.8.8dev.6)
+* amend change for Debian #514897 to exclude XML documents (Debian #592883) -TD
+* use HTParsePort() in a few places, e.g., HTFinger.c, to allow for IPv6
+ addresses with colons (Debian #587330) -TD
+* modify option -dump so it is parsed in the first pass, using that to suppress
+ requirement for lss file if lynx is used only to dump output -TD
+* add option -unique-urls (Debian #586762) -TD
+* fix most gcc type-conversion warnings -TD
+* add configure check for ctags/etags programs, needed for some BSD ports -TD
+* add configure --with-textdomain option to allow overriding the "lynx"
+ NLS textdomain, to help ensure that Lynx's build-script does not conflict
+ with alternative packages -TD
+* use AC_ARG_PROGRAM in configure script, to support --program-suffix, etc.,
+ to help with packaging -TD
+* add Debian build script, for testing (adapted from lynx-cur package) -TD
+* add RPM build script, for testing -TD
+
+2010-08-25 (2.8.8dev.5)
+* modify convert_to_idna() to check for malformed urls (Debian #594300 reports
+ this as CVE-2010-2810) -TD
+* correct typo in po/makefile.inn from removal of mkdirs.sh in dev.4 (Debian
+ #592078) -TD
+* correct a sign-extension error in UpdateBoundary(), used for MIME boundary
+ computation, broken in dev.4 compiler-warning fixes -TD
+
+2010-06-21 (2.8.8dev.4)
+* check for SSL error when reading response from "GET". This incidentally
+ exposes a longstanding bug in GNUTLS:
+ https://savannah.gnu.org/support/index.php?106987
+ (google the message "A TLS packet with unexpected length was received")
+ which prevents connection to
+ https://www.mynortonaccount.com/amsweb/default.do
+ (report by Ignac Vucko) -TD
+* fix ifdef/define's in LYMain.c to show GNUTLS version in user-agent when
+ built with tidy_tls.c -TD
+* improve format of X509_NAME_oneline() in tidy_tls.c, making it compatible
+ with the OpenSSL function so that no post-processing is needed -TD
+* correct typo in configure --enable-gnutls-compat option, which sometimes made
+ it enabled as a side-effect of setting --with-gnutls -TD
+* add configure option --enable-wais, for test-compiles with freeWAIS -TD
+* fixes to build with VMS -Christoph J Gartmann
+ + created [.src]multinet_ucx.opt with a single line
+ multinet_root:[multinet.library]ucx$ipc/LIBRARY
+ + modified build.com to have an additional option "Multinet with
+ UCX emulation"
+ + modified libmake.com for the same reason
+ + modified [.www.library.implementation]www_tcp.h for the same reason
+ + provide definition of IS_CJK_TTY for HTWAIS.c by adding include of
+ LYStrings.h
+* fix typo in users's guide -PBM
+* drop mkdirs.sh and MKINSTALLDIRS symbol from makefiles, using "mkdir -p" -TD
+* limit parsed URIs with new config parameter MAX_URI_SIZE, default 8192
+ (RedHat #605286, forwarded by Vincent Danen). For arbitrarily long URIs,
+ alloca() could run out of stack space -TD
+* several changes to configure script, from ongoing work on xterm, etc -TD
+ + workaround for broken ".pc" file for X Toolkit, which omits the ICE
+ library.
+ + modify CF_NCURSES_CONFIG to use CF_CURSES_HEADER to pick out the particular
+ flavor of ncurses.h, e.g., <ncursesw/curses.h>
+ + add parameter to CF_CURSES_HEADER to allow looking for specific
+ subdirectory ncurses/ncursesw/etc + restructured CF_X_ATHENA to use
+ pkg-config, if available.
+ + use CF_ADD_LIB/CF_ADD_LIBS
+ + CF_GNUTLS eliminates duplicate libraries when configuring with pkg-config
+ + modified several macros to quote params of ifelse()
+ + CF_AR_FLAGS allows $ARFLAGS to override the choice of ar-flags, in
+ particular check if a given choice is part of the current $ARFLAGS
+ + workaround CF_XOPEN_CURSES for (temporary) problem with ncurses headers,
+ which did not account for the fact that _XOPEN_SOURCE_EXTENDED may be
+ defined in a system header.
+* remove redundant updates for CFLAGS and LIBS in configure script which are
+ now done in CF_FIND_LINKAGE macro -TD
+* fix a problem with configure script which broke "--with-gnutls=/usr" (report
+ by Atsuhito Kohda) -TD
+* resolve warnings from "clang --analyze", tested with Fedora 12 and clang
+ 2.6-0.5.pre1.fc12, 2.7-1.fc12 -TD
+* further improvements to print_wwwfile_to_fd() -TD
+ + corrected length used for radio/checkboxes.
+ + fill in wrapped fields.
+
+2010-04-25 (2.8.8dev.3)
+* modify print_wwwfile_to_fd() to add field values to the printed form (Debian
+ #574940) -TD
+* add check for magic (header bytes) before trying to decompress, since zlib
+ does not provide this check (Redhat #503921) -TD
+* add workaround in CF_SSL configure macro for broken openssl pkg-config script
+ on Redhat, CentOS -TD
+* add configure option --disable-rpath-hack -TD
+* allow IPv6 addresses without "http://" prefix (Redhat #425879, patch by Kamil
+ Dudka)
+* build-fixes for OpenSolaris aka Solaris 11 -TD
+* add/use CF_RPATH_HACK, for constructing rpath references to libraries in
+ nonstandard locations -TD
+* improve configure macros CF_CURSES_TERM_H and CF_FIND_LINKAGE -TD
+* add synopsis entries for -get_data and -post_data options to lynx.man
+ (report by Dallas E. Legan II) -TD
+* fix a possible conflict between CF_HEADER_PATH and CF_LIBRARY_PATH by setting
+ their respective target variables, not appending -TD
+* improve configure macro CF_XOPEN_SOURCE by removing rather than undefining
+ preexisting symbols as they are added to the definitions -TD
+* add configure check for -lnetwork, from tin -TD
+* when renaming/copying a bookmark file, e.g., to delete a bookmark, modify
+ its permissions for compatibility with IsOurFile() (Redhat #486070) -TD
+* fix most gcc writable-strings warnings -TD
+* update config.guess (2009-12-30), config.sub (2009-12-31)
+
+2009-11-25 (2.8.8dev.2)
+* modify trimming of URI in LYSetCookie() to eliminate trimming of final leaf
+ (Debian #460108) -TD
+* document the various xxx_PATH settings in lynx.cfg -TD
+* modify cfg2html.pl to improve formatting of cattoc.html -TD
+* split-up top-level makefile install-html rule to allow generating the
+ htmlized cfg without doing an install -TD
+* suppress positioning for editor when using it to edit files via dired -TD
+* modify samples/lynx-demo.cfg to suppress external file-utilities, since the
+ intent is to make the installer work standalone, but allow extension -TD
+* add traces for builtin dired operations -TD
+* modify built-in "touch" for dired to use binary mode when opening file -TD
+* remove check from 2.8.5dev.11 which prevents user from moving a directory in
+ dired unless the external program "mv" is provided -TD
+* regularize use of isEmpty(), non_empty() -BL
+* match built-in "positionable" editor names more liberally -BL
+* promote some experimental options to normal, tidy up related EXP_xxx vs
+ USE_xxx symbols -TD
+ EXP_ASCII_CTYPES is now USE_ASCII_CTYPES
+ EXP_JUSTIFY_ELTS is now USE_JUSTIFY_ELTS
+ EXP_CHARSET_CHOICE is now USE_CHARSET_CHOICE
+ The scrollbar, progressbar, sessions and session-cache options are now
+ enabled by default.
+* modify scanning in HTRules.c to only trim comments where '#' is either at
+ the beginning of a line, or follows whitespace -KH
+* correct a place where LYStrExtent2 was used where byte-count is needed
+ (patch by Bake Timmons).
+* modify LYExecv() in LYLocal.c to allow win32 applications to use this
+ function -TD
+* modify ok_stat() in LYLocal.c to retry with "." appended when the path syntax
+ indicates that it is probably a directory name -TD
+* fix an old typo in configure macro CF_CHECK_FUNCDECL -TD
+* change library dependency for gnutls from crypt to gcrypt, originally in
+ 2.8.5dev.15 (Debian #555579) -TD
+* update de.po from
+ http://translationproject.org/latest/lynx
+* fix some tidy- and linklint-warnings in help-files -TD
+* amend change from 2.8.7dev.14 to not use clrscr() function in stop_curses()
+ if using PDCurses, since clrscr() is not in the win32 api -TD
+* modify configure script to check if linkage for bzlib and zlib succeeded,
+ before defining symbol which makes the compiler uses these libraries -TD
+* update lynx_help_main.html to point to "release/lynx2-8-7" documentation -TD
+
+2009-08-28 (2.8.8dev.1)
+* add <sys/types.h> include in socklen_t configure check (from OpenBSD CVS)
+* eliminate UCPutUtf8ToBuffer() - redundant -TD
+* use memset's to simplify some initialization in HTML.c, extending a change
+ made in 2.8.7dev.10 (prompted by issue in OpenBSD) -TD
+* add optional support for IDNA using GNU libidn (Debian #352596) -TD
+* ignore LEFT-TO-RIGHT-MARK (U+200E) in HTML files (Debian #408835) -TD
+* correct check for return-value from gnutls_certificate_verify_peers2(), which
+ in conjunction with unclean internals of gnutls caused caused some sites to
+ be treated as if they were version-1 X.509 CAs (Debian #231609,
+ Ubuntu 293708) -TD
+* revise dired-mode's modify_tagged() function, correcting and extending the
+ source-paths to validate against the target path. Before, lynx's current
+ working directory was used to validate against target path, i.e., when moving
+ all tagged files to a new location. Lynx's check to ensure that
+ source/target paths are distinct prevented users from moving tagged files to
+ the current directory (report by Jasper) -TD
+* change compiled-in default for SYSLOG_REQUESTED_URLS to false (prompted by
+ Debian #537907) -TD
+* adjust ifdef in change_sug_filename() so that paths containing square
+ brackets are trimmed on VMS only (report by Gaute Strokkenes) -TD
+* amend change to ifdef in LYMain.c (from 2.8.7dev.14), since it prevents build
+ on NetBSD, whose libintl.h does not include locale.h (report by Thomas
+ Klausner) -TD
+* modify configure macro CF_GCC_ATTRIBUTES to make it more self-contained -TD
+* improve configure check for _XOPEN_SOURCE for HPUX 11 to ensure mbstate_t is
+ declared -TD
+* update config.guess (2009-08-19), config.sub (2009-08-19)
+
+2009-07-05 (2.8.7rel.1)
+* update metrics for 2.8.7 release -TD
+* fix ifdef'ing for cfg_bad_html (report by Gabor Z Papp) -TD
+
+2009-06-23 (2.8.7pre.6)
+* update lynx.pot file -TD
+* add "Bad HTML messages" to Options menu, letting the user disable the
+ warning message, write the detailed messages to the LYNXMESSAGES: status
+ buffer (suggested by BL) -TD
+* finish checkbox for send-useragent from pre.3 changes -TD
+* make the size of LYNXMESSAGES configurable in lynx.cfg with
+ STATUS_BUFFER_SIZE -TD
+
+2009-06-06 (2.8.7pre.5)
+* add missing ctrl_chars_on_previous_line when computing 'spare' value in
+ split_line() for the wide-curses configuration. The justified line was
+ shorter than expected when justifying text -TD
+* fix a special case of trailing whitespace not shown in pretty source, at the
+ end of a closing tag -TD
+* remove "Bad HTML" warning for buttons outside a form, since those can be
+ inline, according to the HTML 4 DTD -TD
+* provide navigation to script-buttons, to make them more visible, showing
+ their name -TD
+* change default for send_useragent option to true (prompted by discussion on
+ lynx-dev) -TD
+* correct check for default type of HTML BUTTON, which is "submit". The code
+ treated this as "button" (prompted by discussion on lynx-dev) -TD
+
+2009-05-25 (2.8.7pre.4)
+* update lynx.pot file -TD
+* fix a typo in change for Debian #388622 -TD
+
+2009-05-25 (2.8.7pre.3)
+* suppress check for "disabled" attribute in a select, as a workaround
+ (Debian #525934) -TD
+* accommodate (in)compatibility "feature" in HTML5 draft which replaces
+ ISO-8859-1 with Windows-1252, as indicated here:
+ http://www.whatwg.org/specs/web-apps/current-work/multipage/infrastructure.html#character-encodings-0
+ (Debian #514897) -TD
+* remove check for -dump option from HTHandleAuthInfo(), allowing Lynx to -dump
+ or -source NNTP urls (report by Dallas E Legan II) -TD
+* amend fix for Debian #388622 to allow the user to save names to the home
+ directory, e.g., ~/foo -TD
+* add an Options menu checkbox to tell if Lynx should send a user-agent string.
+ Unless the useragent restriction is set, the default for this checkbox is
+ off, so that Lynx will not send the string. The corresponding setting,
+ send_useragent, may be saved to ~/.lynxrc, but normally is not -TD
+* correct type for HTNewsGetCharacter() in HTNews.c, which could return a
+ sign-extended character mistaken for EOF (report by Dallas E Legan II) -TD
+
+2009-04-26 (2.8.7pre.2)
+* update it.po from
+ http://translationproject.org/latest/lynx/
+* update lynx user's guide section on Options Menu -TD
+* modify prompt in LYLoadCGI() from 2.8.6dev.15 to always prompt user (from
+ FEDORA-2008-9597), and modify compiled-in configuration default for
+ consistency with other lynx.cfg settings to require that lynx.cfg be set to
+ permit use of lynxcgi scripts -TD
+* correct parsing of "--" command-line parameter (Redhat #311031) -TD
+* check for malformed select before adding last-option (Redhat #152146) -TD
+* change default for --enable-ascii-ctypes to true -TD
+* modify Lynx's DTD information to allow it to display form-related tags that
+ are inline, even without being in a form as indicated in
+ http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd
+ for %inline.forms and %misc.inline (Debian #398986) -TD
+* finish dtd_util, making it able to load and save data from a flat file that
+ can be edited -TD
+* correct length of padding with underscores in LYhighlight, which used the
+ wrong variable based on glyph count rather than cells (Debian #519199) -TD
+* fix a few cases where PUTC's intended for pretty-src would display in the
+ HTML view (Debian #521489) -TD
+* fix some mismatched BOOL vs BOOLEAN from compiler warnings due to dev.13
+ change to LYStructs.h -TD
+* add TNS SNI support for the OpenSSL configuration -Phil Pennock
+* add docs/README.cookies and docs/README.options -Stefan Caunter
+* update docs/README.sslcerts -Stefan Caunter
+* add NO_PAUSE setting to lynx.cfg, .lynxrc and Options menu (request by
+ Stefan Caunter) -TD
+
+2009-03-17 (2.8.7pre.1)
+2009-03-17 (2.8.7dev.14)
+* modify command-passing for Win32/DOS to use double-quotes -TD
+* adapt features from vile's install-script to set registry variables, etc. -TD
+* modify LYgetenv() for Win32 platforms to check also in the system registry
+ for settings, adapted from vile -TD
+* modify SGML_write() to check for UCS-2 BOMs, to provide support for UCS-2
+ pages (prompted by comment by TG) -TD
+* modify SGML_write() to check for UTF-8 BOM, using that as a hint to set the
+ default document charset to UTF-8 (prompted by mailing list comments) -TD
+* modify stop_curses() function to fix missing DJGPP and MinGW code -DK, TD
+* modify config.hin to fix prototype for gettimeofday() with MinGW -DK
+* ifdef to avoid conflicting definition of set_timeout() in DJGPP -DK
+* modify ifdef in LYMain.c to avoid possible conflict between libintl.h and
+ locale.h -DK
+* modify configure script to avoid using symbolic links for MinGW, in case
+ the script is run in Cygwin -DK
+* modify makefile.msc to add LYIcon object -TD
+* modify configure script to add LYIcon object for MinGW -DK
+* add sample scripts for configuring MinGW version using Cygwin -DK
+
+2009-02-01 (2.8.7dev.13)
+* modify definitions in LYStructs.h for union to cast to a void* rather than
+ a long, to help with 64-bit ports -TD
+* modify CF_SSL configure macro to check for -ldl needed for recent OpenSSL
+ versions -TD
+* modify CF_SSL configure macro to build with MSYS for MinGW configuration -TD
+* modify scanning of floats from lynx.cfg to allow Lynx to read POSIX values
+ in non-POSIX locales -TD
+* modify configure script to check for msginit, needed to generate "en" po
+ file, and omit that target if msginit is not available, letting lynx build
+ with older gettext versions -TD
+* improve drawing of menus for multibyte characters by changing the way the
+ number of fill-characters is computed in LYpaddstr -TD
+* fix some uses of gettext in options menu and info page where a translated
+ string might contain angle-brackets or ampersand -TD
+* modify AM_WITH_NLS configure macro to add the iconv library dependency for
+ intl library when checking for the latter -DK
+* fix breakage of display of UTF-8 in UCTransUniChar() from cleanup in dev.12
+ (report by TG) -TD
+* rename variable defined by CF_PATHSP to PATH_SEPARATOR, use this consistently
+ to ease use in later autoconf versions (prompted by patch by DK) -TD
+* fix a typo in CF_ADD_LIBDIR which broke check for libintl (report by
+ Jose H Espinosa) -TD
+* modify configure script to append to CFLAGS or CPPFLAGS rather than prepend,
+ to better match the user's intent -DK, TD
+* modify UCSetBoxChars() to let line-drawing work with PDCurses, as well as
+ any fancy-curses implementation that is running in ASCII or Latin-1 -TD
+* add a configure check for curses type "chtype" -TD
+* fix for an ASCII dependency in LYKeymap.c -PG
+* update fr.po, id.po, nl.pl, sv.po, tr.po, vi.po from
+ http://translationproject.org/latest/lynx/
+* change configure script to check for "ar" archiver options, from tin bug
+ report for FreeBSD 8.0 which requires a "-" before the options -TD
+* update config.guess (2008-12-19), config.sub (2008-12-11)
+* use putenv() in preference to unsetenv() in LYReadCFG.c, noting that it is
+ a deprecated BSD interface -TD
+* miscellaneous fixes for gcc type-conversion warnings -TD
+* remove trailing comma from enumeration UCStatus which causes strict-compiler
+ warning -TD
+
+2008-12-31 (2.8.7dev.12)
+* add configure option --enable-ascii-ctypes to enable EXP_ASCII_CTYPES -TD
+* move EBCDIC tables to separate file LYebcdic.c to simplify building test
+ driver for parsdate.c on z/OS -PG
+* fix an off-by-one difference between UTF-8/non-UTF-8 comparisons in
+ HText_appendCharacter() which would leave an extra character wrapped in some
+ cases, e.g., in the options menu when field-numbering was turned on -TD
+* remove logic in GridText.c for ignoring "excess" characters in a field when
+ fields are numbered, since highlighting of wrapped multiline links works,
+ and this feature is incompatible with it -TD
+* remove obsolete CF_VARARGS configure check -TD
+* modify configure script to build with MinGW and MSYS -TD
+* modify configure macro CF_XOPEN_SOURCE to define _ALL_SOURCE for AIX 6.x -TD
+* implement a LONG_LIST equivalent for ftp, configurable as FTP_FORMAT -TD
+* adapt some of the SH_EX ifdef'd features (TD):
+ + extra keypad conversions in LYgetch_for() are for PDCurses.
+ + add -show_cfg option.
+ + entify embedded blanks in HTDOS_wwwName().
+ + treat null file-pointer in HTParseFile(HTFormat() as end-of-file.
+* change the phase during which "-help" option is processed, to allow it to
+ reflect the configured values of the options in the help-message (prompted
+ by discussion with Dan Jacobson regarding Debian #507083) -TD
+* modify havevisible() and UCTransToUni() functions to process UTF-8 input,
+ fixing a problem saving bookmarks whose title is UTF-8 (prompted by patch by
+ Takao Fujiwara) -TD
+* restore logic in HTLoadHTTP() to strip matching square brackets from host
+ name and certificate host (comments by TG) -TD
+* modify UCdomap.c to work with Solaris iconv and handle additional encodings:
+ + if "TRANSLIT" feature (an extension of glibc) does not succeed, retry
+ the call to iconv_open without "TRANSLIT"
+ + add check for any MIME name beginning "iso8859", mapping to "iso-8859"
+ + recognize "eucjp" MIME name as alias for "euc-jp"
+ + recognize "pck" MIME name as alias for "shift_jis"
+ + recognize "ansi-1251" MIME name as alias for "windows-1251"
+ (patch by Takao Fujiwara)
+* add "*.dbg" to suffixes to ignore in autoconf script when checking for
+ executables and objects produced by C compile (report by PG, for z/OS) -TD
+* modify parsdate.y to convert between EBCDIC/ASCII to work on z/OS -PG, -TD
+* modify src/makefile.in to make it simple for a build script running in a
+ separate directory to regenerate parsdate.c (prompted by discussion with PG
+ regarding building on z/OS which uses EBCDIC) -TD
+* add configure check for yacc (report by PG) -TD
+* fixes to make configure --help agree with INSTALLATION (report by PW) -TD
+* add id.po from
+ http://translationproject.org/latest/lynx/
+* add a null-pointer check for content type, fix for dev.11 changes (Debian
+ #509321) -TD
+* improve configurability with regard to pkg-config by adding --with-pkg-config
+ option, which can be used to enable/disable use of the program as well as
+ specify the pathname used (prompted by comments by TG) -TD
+* correct handling of --with-ssl option when pkg-config is not found -TD
+
+2008-12-14 (2.8.7dev.11)
+* add support for HTML5 rel=author in link (mailing list comments) -TD
+* modify cookie-writing to not write if no cookies were read from the file
+ and none are available (Debian #354282) -TD
+* fix src/tidy_tls.c X509_get_issuer_name to actually take the issuer DN of the
+ present certificate and not hope that it is the same as taking the subject DN
+ of the "next" certificate which may or may not exist (Debian #499945, patch
+ by Thomas Viehmann)
+* modify exit code when doing a "-dump" to exit with error if the server
+ returned an error status for the page (Debian #299711) -TD
+* fix ipv6 literal command-line parsing (Debian #180654, analysis by Fabio
+ Massimo Di Nitto) -TD
+* extend configure macros CF_SSL and CF_GNUTLS to check for pkg-config, using
+ that for the default if the corresponding openssl or gnutls packages are
+ installed (suggested by PGNet) -TD
+* add fi.po from
+ http://translationproject.org/latest/lynx/
+* update fr.po from
+ http://translationproject.org/latest/lynx/
+* correct handling of the option value from configure "--with-ssl", which was
+ not being used in the search-list (report by PGNet) -TD
+* update configure script macros -TD
+ CF_CURSES_LIBS - add "pdcurses", e.g., to link with MinGW
+ CF_UTF8_LIB - use CF_FIND_LINKAGE to better work with BSD ports.
+ CF_XOPEN_SOURCE - add case for dragonfly
+* document width-limitation in manpage, fix a few stray 1024's still in the
+ source (report by Barry Haddow) -TD
+* add "read_timeout" to lynx.cfg, and -read_timeout option to command-line
+ (prompted by Dries De Moor report on mailing list) -TD
+* modify to handle a special case where the content-type is given as one of the
+ compressed types, to check if the address (after stripping the file suffix
+ for that compression) has a suffix that lynx could present -TD
+ For example:
+ http://foo/bar.html.gz
+ would display the uncompressed "bar.html" rather than offering to download
+ the file. This also allows one to add SUFFIX commands to lynx.cfg to display
+ the corresponding plain files.
+ For example:
+ SUFFIX:CHANGES.*:text/plain:8bit
+ SUFFIX:CHANGES:text/plain:8bit
+ for
+ http://foo/CHANGES.tmp.gz
+ http://foo/CHANGES.gz
+* workaround for STRING redefinition in parsdate.c on DJGPP -GV
+* improve configure-check to determine proper fallback when no long-long
+ printing format is available -TD
+* update win32 makefiles/build scripts to add LYmktime, parsdate modules -TD
+* update config.guess (2008-04-14), config.sub (2008-06-16)
+
+2008-09-21 (2.8.7dev.10)
+* remove rw.po, since the translation project no longer supplies it -TD
+* implement "readonly" attribute for TEXTAREA and TEXT fields -TD
+* update Lynx's tables of HTML attributes to cover (except for events) the
+ keywords from HTML 4.01 -TD
+* modify initial active link in download-page to be the first download
+ action rather than the "help" link which is provided in Novice mode
+ (Debian #376259) -PBM, TD
+* implement "chunked" transfer-encoding to work with servers that ignore the
+ version number in HTTP get's -TD
+* change initialization of trace file, handing this during the first part of
+ argument parsing along with -help and -version, to show steps done for
+ initialization of presentors, etc -TD
+* minor fix to LYstartPopup() to handle a case where the popup menu was too
+ large for the screen -TD
+* fixes for srcdir!=objdir (report by FLWM) -TD
+* modify man2hlp.sh to work from subdirectory, e.g., its parameter would be
+ "../lynx.man" -TD
+* set POSIX locale for install-cfg.sh and man2hlp.sh since they use character
+ ranges -TD
+* add switch -xhtml-parsing and lynx.cfg XHTML_PARSING setting to control
+ whether the extensions for XHTML 1.0 are used (prompted by bug report by
+ FLWM, as well as discussion on lynx-dev) -TD
+* modify external editing of TEXTAREA to not do tab-conversion -TD
+* modify LYhighlight() to limit display of multicolumn characters -TD
+* rewrite LYRefreshEdit(), to display multibyte/multicolumn characters properly
+ when using wide-character curses -TD
+* revise introductory comment written to ".lynxrc" (Debian #461158) -TD
+* discard anchor's post_data field in HTLoadDocument() if Lynx is about to
+ reload a document. That would happen if the result of the form includes a
+ link back to the form. Removing the data causes Lynx to prompt the user,
+ e.g.,
+ Resubmit POST content to http://localhost/cgi-bin/lynxtest.pl ? (y/n)
+ to offer the user the choice between revisiting form or re-POST'ing the
+ data that was on the form (report by Andreas K Foerster) -TD
+* fixes for LYHighlight() when the highlighted text is empty -TD
+* translate named entities, etc., for "content" field of refresh-URL, cf:
+ 2.8.5dev.13 (report by Ivan Shmakov) -TD
+* suppress computation in TrimmedLength() for source-view, which is not needed
+ for Debian #204515 -Mike Knight
+* add check-po rule to po/makefile -TD
+* modify top-level makefile to work with configure --srcdir -TD
+* add update-po rule to top-level makefile -TD
+* update fr.po, nl.po, tr.po, vi.po, zh_TW.po,sv.po from
+ http://translationproject.org/latest/lynx/
+* parse doctype for xhtml, to tell when empty tags such as "<textarea />" can
+ be discarded (report by Nils Dagsson Moskopp) -TD
+* parse xml processing-instruction to turn on UTF-8 decoding, as well as
+ disable upper/lower case transforming in source view (discussion on
+ lynx-dev) -TD
+* fix typo in Lynx_users_guide.html (report by Kristof Zelechovski) -TD
+* minor fix to documentation in lynx.cfg -PW
+* use off_t rather than long for representing file sizes, e.g., when used to
+ print progress messages (reports by LP, Tomas Liska, TG, PG) -TD
+* use dtd_util to replace most of HTMLDTD.h and HTMLDTD.c with source generated
+ from the existing tables in those files -TD
+* add program dtd_util which can be used to dump the SGML tables in readable
+ form -TD
+* change calls to LYhandlePopupList() to turn on (or off) numbering when
+ keypad_mode is not NUMBERS_AS_ARROWS -PBM
+* move close of session-file outside ifdef for VLINK_IN_SESSION, closing
+ session file properly if that ifdef is disabled. Add a null-pointer check
+ for visited links that are saved -PBM
+* make auto_session and session_file configurable with ENABLE_LYNXRC -PBM
+* separate configure "--enable-sessions" option from "--enable-session-cache"
+ option -PBM
+* add ncurses scroll-wheel support, which requires the extended-mouse configure
+ option of ncurses (Debian #476394) -TD
+ Caveat: if running on a local terminal, setting the ESCDELAY environment
+ variable to 0 (zero) helps, since the event rate is rather high. That would
+ not help on a network with delays (this is true of all text applications that
+ use xterm's mouse protocol, such as gpm and ncurses).
+* adapt/extend parsdate.y from tin to improve parsing of cookie expiration
+ times (Debian #480144) -TD
+* update de.po (patch by Fabian Fingerle)
+
+2008-04-27 (2.8.7dev.9)
+* update nl.po, vi.po from
+ http://translationproject.org/latest/lynx/
+* additional def7_uni.tbl conversions (patch by Tim Larson).
+* update config.guess (2008-03-12), config.sub (2008-03-08)
+* add --enable-gnutls-compat option and associated files to configure with
+ GNU TLS without its gnutls-openssl library, whose newer versions are
+ available only under a restrictive license (reports by Andreas Metzler,
+ Atsuhito Kohda) -TD
+* update README.sslcerts -SC
+* add POSITIONAL_EDITOR setting to configure editors which accept a "+line"
+ parameter -PBM
+* pass a newline after the start of PRE-section in HTGopher.c to force the
+ first newline between records to be seen and cause the lines to split
+ (report by Ciprian Dorin Craciun) -TD
+* use TRST_MAXROWSPAN and TRST_MAXCOLSPAN limits in Stbl_reserveCellsInTable(),
+ to help the non-color-style version work with table using rowspan/colspan
+ set to "0", as well as correcting limits from original 2.8.3dev.14 changes
+ (report by George Sigletos) -TD, PBM
+* modify behavior of "-nonumbers" option for -dump so it can be combined with
+ -listonly to obtain a list of the URLs without reference numbers (Debian
+ #398283) -TD
+* typo in description of SESSION_FILE in lynx.cfg -PBM
+* build-fix for WWW version on Windows -TD
+
+2008-02-17 (2.8.7dev.8)
+* add "nano" to list of editors accepting +number option (patch by Tim Chase)
+* add configure --with-nss-compat option, for building with NSS library's
+ OpenSSL-compatible interface (patch by Zdenek Prikryl)
+* minor fix for version message to ensure WWW version shows when not building
+ with OpenSSL -GV
+* make "--more--" message configurable -PBM
+* improve multibyte editing (patch by Sergej Kvachonok)
+* add XWINDOWS / NON_XWINDOWS environment-variable field to DOWNLOAD, etc., in
+ lynx.cfg to specify whether a downloader (printer, etc) is enabled when
+ the X display variable is set -PBM
+* add configure script options --enable-session-cache and --enable-progressbar
+ for PBM's experimental session and progressbar features -TD
+* add session save/restore feature -PBM
+ + bind ^X to toggle view of page showing session information
+ + add binding for ^U to previous-document (outside of line-editing).
+ + documented command-line options and configuration data for this feature.
+ + document -child_relaxed option in Lynx users's guide.
+* use vasprintf() if available, fixes Fedora #462449 -TD
+* several small changes to configure script to work with MirBSD build
+ environment -TG
+* show progress message in X509 callback -TG
+* modify definition of lynxrc and cookies files in LYMain.c and LYrcFile.c to
+ make it simpler for build script to override -TD
+* reviewed patches at
+ http://www.mirbsd.org/cvs.cgi/ports/www/lynx/patches/
+ improved buffer allocation limits in makeuctb.c -TD
+* add support for the X.509 extension subjectAltName using GNUTLS -Joey Schulze
+* add SSL_CERT_FILE to lynx.cfg -Joey Schulze
+* fix spelling error in HTAccess.h comment (report by Paul de Weerd) -TD
+* add null-pointer checks to cover a special case of exit on error while
+ reading from the standard input (report by Pascal Terjan) -TD
+
+2007-08-02 (2.8.7dev.7)
+* restore top-level descrip.mms due to error in patch -TD
+
+2007-08-02 (2.8.7dev.6)
+* update cs.po from
+ http://translationproject.org/latest/lynx/
+* add a script for Inno Setup, incorporate/adapt configuration files from
+ an installer created by Claudio Santambrogio -TD
+* use struct dirent64 when it is declared via configure script -TD
+* additional def7_uni.tbl conversions (patch by Tim Larson).
+* quiet a message in HTFWriter.c -RS
+* improve IsOurSymlink() from 2.8.7dev.5 changes, allowing the symbolic link
+ to be relative to the directory -RS, TD
+* rewrote several autoconf macros to use extended searches in non-system
+ locations, i.e., AM_ICONV, AM_WITH_NLS, CF_GNUTLS, CF_SSL, CF_WITH_BZLIB
+ and CF_WITH_ZLIB (prompted by LV comments) -TD
+* modify popup for externals added in 2.8.4dev.20 to number the entries if
+ keypad mode is set to one of the numbered forms -PBM
+* free leaks of LYLeaks.c, to make it simpler to check it with a second
+ tool such as valgrind -TD
+* rewrote cached_styles[][] to use memory allocated to match screen size
+ (report by RS) -TD
+* fix typo in SGML.C -RS
+* correct display_lines when -notitle is used while in novice mode -PBM, TD
+* add -child_relaxed option (patch by Andrew Belov).
+* minor typos from OpenBSD (patch by Daniel Dickman).
+* modify VMS build-scripts to accept "TCPIP" parameter, for TCPIP Services
+ (discussion with Dominic Stephens) -TD
+* add IDE-files for building with Visual Studio 6, 2003 and 2005 Express.
+ These are respectively the files in BUILD-VS6, BUILD-VS2003 and
+ BUILD-VS2005X -TD
+* modify def7_uni.tbl to display U+2212 without a leading blank
+ (Debian #428536) -TD
+* add definition for _FILE_OFFSET_BITS in CF_LARGEFILE, needed for Solaris
+ 64-bit compiles (from ncurses) -TD
+* change order of includes (-I options) in makefiles so build-tree is found
+ first (report by PBM) -TD
+* ensure MIME_LIBDIR has a trailing "/" -TD
+* add new -trace-mask codes to cleanup the trace file a little -TD
+* remove redundant call to show_cert_issuer() -TG
+* correct typo in Lynx_users_guide.html (prompted by TG's patch) -TD
+* modify HTDoRead() to add elapsed time to its debug trace -TD
+* fix a case in LYGetfile.c which was broken by 2.8.7dev.3 changes to use
+ LYTildeExpand() to expand embedded "~" -TG
+* update config.guess (2007-05-17), config.sub (2007-06-28)
+
+2007-05-17 (2.8.7dev.5)
+* build/install "en" po file so that GNU gettext LANGUAGE environment variable
+ can find the corresponding English message file (request by Chuck Houpt) -TD
+* add LYNX_HELPFILE environment variable to allow override of location of the
+ help-file -Chuck Houpt
+* make install-bin and install-lss makefile rules a little quieter (prompted
+ by discussion by Chuck Houpt and TG) -TD
+* fix an off-by-one in HText_canScrollDown() and total_pages in GridText.c -TH
+* rewrite strcasecomp_asterisk() to support wildcards as in RFC 2818 (prompted
+ by less-complete patch from Debian #401447, see also Debian #268102) -TD
+* improve X.509 certificate validation -TG
+ This is tested for OpenSSL, ifdef'd to not break gnutls. Changes:
+ + peer certificate is cached, no need to call SSL_get_peer_certificate()
+ twice
+ + support foo.domain:port and [ip.add.re.ss] and [ip.add.re.ss]:port and
+ [i:p:v:6:ad:dr:es:s] and [i:p:v:6:ad:dr:es:s]:port
+ + add support for checking X.509v3 SubjectAltName extensions (of type DNS -
+ tested - and IP - untested) when the X.509 commonName check fails.
+ + when displaying a list of failed CNs, change format from foo:bar:baz to
+ CN<foo>:CN<bar>:CN<baz>:SAN<DNS=foo>:SAN<IP=1.2.3.4> so that we know where
+ what comes from (in "Your recent statusline messages")
+ + if the peer certificate can *NOT* be verified, output a message to the log
+ as well
+ + fix a possible use of an uninitialised value ssl_all_cns
+ + output certificate issuer to the logs as well (so that you can, before
+ entering your online banking PIN, see if the certificate has been issued
+ not only _to_ your bank but also _from_ a place you trust, in case
+ /etc/ssl/certs/ contains a lot of Root CA certs)
+* quiet a gcc warning regarding do_system() -TG
+* if iconv_open() using transliteration fails, retry without the
+ transliteration feature -TG
+* change keymap for "CHANGE_KCODE" from CTRL-L to "J" -TG
+* remove "local" section from lynx manpage -TG
+* log SSL/TLS (HTTPS connection) X.509 certificate issuer information into the
+ "recent statusline messages" (accessible via the backspace key) -TG
+* modify po/makefile.inn to use DESTDIR -Thomas Klausner, TD
+* add --with-destdir configure option to set a default value for the DESTDIR
+ variable in makefiles, and modified makefiles to ensure that setting
+ DESTDIR in the top-level makefile propagates to lower levels (prompted by
+ NetBSD patch for port) -TD
+* correct two places in HTML.c which compared element_number to HTML_H6
+ twice rather also to HTML_H5 (report by hsv@tbbs.net) -TD
+* improve change for UCSetBoxChars() from 2.8.6dev.16 for
+ EXP_CHARTRANS_AUTOSWITCH which assumed that the line-drawing character set
+ was always different from the display character set. If both are US_ASCII
+ for example, ASCII lines would be drawn, which is not good -TD
+* change exit's in configure script test-programs to return's to reduce
+ problems with declaration of exit() -TD
+* use "install-sh" rather than "install.sh" to reduce problems with Sun make
+ program -TD
+* add configure-check for ncurses functions _nc_freeall() and
+ _nc_free_and_exit(), to help with memory-leak checking -TD
+* change a few options such as --enable-locale-charset option to
+ non-experimental -TD
+* correct lynx.cfg parsing of SYSLOG_TEXT which is miscoded as a boolean -TD
+* add --enable-local-docs option to link doc-directory from help-page
+ (request by PW) -TD
+* change default for MIME_LIBDIR from /usr/local/lib/mosaic to /etc -TD
+* add --with-mime-libdir option to set MIME_LIBDIR in userdefs.h file -TD
+* remove "lynxstuff" from help-page, it no longer exists (report by PW) -TD
+* correct loop-limit in print_crawl_to_fd(), which broke
+ "lynx -crawl -dump" from 2.8.6dev.9 changes (Mandriva #29785) -TD
+* replace BROKEN_PROFTPD and BROKEN_WU_FTPD logic with configurable list of
+ strings in lynx.cfg, i.e., BROKEN_FTP_RETR and BROKEN_FTP_EPSV, and add
+ "spftp/" to the predefined values for the former. Prompted by report by
+ Fred Kasner for
+ ftp.symantec.com/AVDEFS/norton_antivirus
+ which has a broken RETR command -TD
+* add -passive-ftp option -TD
+* ifdef'd -ftp option in case ftp is disabled, for consistency -TD
+* ifdef'd options menu so that if ftp is disabled, the corresponding options
+ are not shown -TD
+* improve pretty-src in a few places by passing-through whitespace as
+ demonstrated by
+ http://www.w3.org/TR/html401/index/elements.html
+ (report by Rado Smiljanic) -TD
+* change user-messages in HTFWriter.c to info-messages, which are generally
+ faster (prompted by patch by Rado Smiljanic) -TD
+* fix pretty-src for "attribute without value" case (patch by Rado Smiljanic)
+* correct tab "abbr", was "abbrev" (patch by Rado Smiljanic)
+* modify ifdef's in HTTCP.c to allow building Cygwin configuration without
+ NSL_FORK, broken in 2.8.5dev.5 (report by Holger Lange) -TD
+* modify IsOurFile() to allow its parameter to be a symbolic link to one of
+ the user's files (report by Rado Smiljanic) -TD
+* check if there is piped-in data when starting without "-" or "-stdin"
+ options, warn about the ignored input data in that case (prompted by report
+ by Toralf Foerster) -TD
+* use POSIX macros for decoding system() return value in UCAuto.c -TD
+* use POSIX macros for decoding system() return value in LYEdit.c
+ (adapted from an incomplete change in OpenBSD CVS) -TD
+* modify CF_SRAND to recognize the asymmetric variant of arc4random() -TD
+* updated configure script macros CF_SUBDIR_PATH, CF_XOPEN_SOURCE,
+ CF_X_ATHENA_LIBS, CF_X_TOOLKIT -TD
+* update config.guess (2006-12-22), config.sub (2006-12-08)
+
+2006-11-14 (2.8.7dev.4)
+* use RFC-822 encoding for filenames passed via file-upload forms (Debian
+ #181165) -TD
+* correct check of return-value from FindLeadingTilde() in dev.3 cleanup of
+ "~" parsing -TD
+
+2006-11-12 (2.8.7dev.3)
+* change the default HELPFILE to the 2.8.6 release directory since the
+ page on subir.com contains obsolete information -TD
+* eliminate references to obsolete url
+ http://www.hippo.ru/%7Ehvv/
+ using the 2.8.6 release directory instead, e.g.,
+ http://lynx.isc.org/release/lynx2-8-6/lynx_help/
+ This is useful mainly for platforms which do not use the configure script -TD
+* update et.po from
+ http://www.iro.umontreal.ca/translation/maint/lynx/
+* modify CF_PDCURSES_X11 to use xcurses-config script if available -TD
+* improve parsing for embedded "~", ensuring that it is interpreted as a
+ user's home directory only if it follows a pathname separator (Debian
+ #388622) -TD
+* ensure that PERSONAL_EXTENSION_MAP and PERSONAL_MAILCAP are absolute
+ pathnames, performing tilde expansion as needed. Pathnames that are not
+ given in absolute form will be sought under the user's home directory as if
+ they began with "~/" -TD
+
+2006-11-06 (2.8.7dev.2)
+* ensure that the configured values for GLOBAL_EXTENSION_MAP and GLOBAL_MAILCAP
+ are absolute pathnames -TD
+* modify logic for reading PERSONAL_EXTENSION_MAP and PERSONAL_MAILCAP to
+ ensure that they are files that are controlled only by the user. The
+ default values for these allow lynx to read configuration information
+ from the user's current directory at lynx's startup (Debian #396949) -TD
+* use CF_NCURSES_CONFIG to simplify linking against rpath'd library -TD
+* fix CF_LARGEFILE so --disable-largefile works (from ncurses) -TD
+
+2006-10-12 (2.8.7dev.1)
+* update embedded version numbers for starting 2.8.7 development -TD
+* setup locale before writing version-message -TD
+* update version message to reflect the fact that most of Lynx is copyright
+ the Lynx Developers Group (this would have altered message files) -TD
+* update the ".po" files line-numbers (not done during the release cycle since
+ no new messages were added) -TD
+
+2006-10-12 (2.8.6rel.2)
+* update version numbers in documentation -TD
+* change embedded URL for HTML'ized lynx.cfg to point to example in current
+ release -TD
+
+2006-10-10 (2.8.6rel.1)
+
+2006-10-10 (2.8.6pre.6)
+* minor formatting fixes to CHANGES and CHANGES2.8 to facilitate scripted
+ analysis of contributions -TD
+* predefine _XOPEN_SOURCE_EXTENDED on HPUX to make color-style build -TD
+* broaden the conditions on which to reload the color-style information to
+ cover any (re)initialization of the screen, e.g., when resizing using
+ ordinary curses (report by PG) -TD
+
+2006-10-02 (2.8.6pre.5)
+* modify cfg2html.pl to use "use vars" rather than "our", to allow it to work
+ with perl version 5.5 -TD
+* use curses nodelay() function for BeOS to make HTCheckForInterrupt() work
+ on that platform -TD
+* filter out obsolete URLs from the customizations saved during install of
+ lynx.cfg -TD
+* add a configure check for zError() to allow using old zlib's -TD
+* fix configure --disable-largefile (from ncurses changes) -TD
+* applied lynx's changes to updated files from ftp.unicode.org to take
+ advantage of less restrictive copyright (report by Klaus Singvogel) -TD
+* workaround for PDCurses versus color-style; reload color style information
+ in start_curses() since PDCurses discards that information in endwin()
+ (report by Lawrence Armstrong) -TD
+
+2006-09-18 (2.8.6pre.4)
+* updated link in user's guide to HTML 3.0 reference (report by TH) -TD
+* remove coloring for lh- and high-tags from LYStyle.c and sample ".lss" files
+ since that tag is nonstandard (report by TH) -TD
+* update da.po from
+ http://www.iro.umontreal.ca/translation/maint/lynx/
+* add script samples/oldlynx, which gives the non-color-style scheme using
+ an executable built for color-style -TD
+* add DEFAULT_COLORS item to lynx.cfg to allow disabling the default colors
+ feature at runtime, allowing better matching of old color scheme via a
+ script -TD
+* update VMS descrip.mms files, adding the ability to build with slang -TD
+
+2006-09-10 (2.8.6pre.3)
+* add NESTED_TABLES setting to lynx.cfg to allow site override of the built-in
+ default (see 2001-08-15 comments by TH) -TD
+* update tr.po from
+ http://www.iro.umontreal.ca/translation/maint/lynx/
+* fix a different aspect of Debian #171312, ensuring that if the side-effect
+ of getfile() is unneeded, we restore the link number as well as the line
+ number (Debian #386561) -TD
+* modify makefile.msc to allow building with slang configuration -TD
+* fixes for keyboard input of slang configuration in win32 (not MinGW) which
+ was broken in 2.8.3dev.5 -TD
+* fix LYgetTableString(), making the monochome appearance with an empty ".lss"
+ file for color-style look like the non-color-style (Debian #386216) -TD
+* fix change made to LYwaddnstr() which did not update the position in LYwin
+ after writing text to a subwindow. This caused some cases where the status
+ line would be cleared by the filler color -TD
+* modify noviceline() function to account for trailing newlines in the message
+ text which caused the message to be displayed on the wrong lines (report
+ by Atsuhito Kohda) -TD
+* make "lynx -version" work in the absence of ".cfg" or ".lss" files -TD
+* add docs/README.metrics to support the changes to COPYHEADER -TD
+* update COPYHEADER to reflect the ten years of development after release
+ of Lynx 2.4.2 -TD
+
+2006-09-03 (2.8.6pre.2)
+* change configure script to put the ".cfg" and ".lss" files by default in the
+ --sysconfdir, e.g., $prefix/etc, and the help-files in lynx_doc and lynx_help
+ directories under --datadir, e.g., $prefix/share/lynx_doc,
+ $prefix/share/lynx_doc. To obtain the old behavior, use
+ configure --sysconfdir=/usr/local/lib --datadir=/usr/local/lib
+ (patch by Rado Smiljanic).
+* simplified stop_curses(), ensuring that it does what it claims (report by
+ William McBrine) -TD
+* corrected placement of statements used for quiet compiler warnings for unused
+ variables in fancy_mouse() (reported by Rado Smiljanic, Nelson Beebe) -TD
+* simplify ifdef's in HTCheckForInterrupt() to make it clearer that the win32
+ PDCurses configuration uses nodelay() as an alternative to select() -TD
+* correct fix for PDCurses on win32, i.e., the workaround in LYStrings.c
+ myGetChar() (report by William McBrine) -TD
+* replace a couple of wmove(LYwin,y,x) calls with LYmove(y,x) -TD
+* modify configure macro CF_PATH_SYNTAX to account for the --prefix and
+ --exec-prefix options, making the --with-cfg-file and --with-lss-file options
+ have the expected behavior of using the given prefix (reported by PG) -TD
+* modify ifdef's for Current_Attr variable to allow scrollbar feature to build
+ with slang configuration on Windows (report by Gisle Vanem) -TD
+
+2006-08-31 (2.8.6pre.1)
+2006-08-31 (2.8.6dev.19)
+* add --enable-widec configure option to allow building lynx without wide
+ character support using ncursesw, to accommodate users with older releases
+ of ncurses (request by Emanuele Giaquinta) -TD
+* add -stderr option to write error messages when doing a -dump -or -source.
+ Normally these are written to the status line but that does not exist when
+ dumping to standard output (Debian #375736) -TD
+* fixes for GNU TLS configuration (also addresses Debian #231609) -TG, TH
+* add check for failure to write to disk, e.g., on disk full, and report
+ error condition via HTAlert() -PG
+* updated README.sslcerts -SC
+* add example of -source in manpage to explain how HREF's are constructed
+ (Debian #347989) -TD
+* fixes to make redraw_part_of_line() to work with double-width characters.
+ This is used in color-style to repaint an inactive hyperlink -TD
+* ensure the number of "extra" blanks in a line is greater than zero before
+ attempting to perform text-justification (Debian #363538) -TD
+* improve wrapping logic in LYwaddnstr() by using a derived window. This fixes
+ a problem with wrapping of multibyte character links -TD
+* repair fix for Debian #171312 by ensuring that it is only invoked if the
+ document was not being reloaded, or popped off the history stack. See logic
+ for popped_doc vs LYSetNewline() in LYMainLoop.c (report by TH) -TD
+* add error-reporting for the PRETTYSRC_SPEC data in lynx.cfg
+ (prompted by discussion by OpenMacNews and Thorsten Glaser) -TD
+* add a carriage-return in stop_curses() to work around PDCurses leaving the
+ cursor position other places than lower-level when stopping curses (report
+ by DK) -TD
+* add an explicit wmove() in display_line() to accommodate some wide-character
+ pages which are not handled well by the nested-table logic, resulting in
+ unexpected wrapping (report by Dan Jacobson) -TD
+* modify limit for CJK double-byte characters in display_line() to accommodate
+ a test-case rightSideEdgeTest.html provided by TH -TD
+* add a workaround in LYStrings.c myGetChar() for PDCurses, which may return an
+ ERR value which is not -1 (reports by DK, William McBrine) -TD
+* remove ifdef from 2.8.2dev.14 which omitted bindtextdomain() call from DJGPP
+ NLS configuration -DK
+* modify autoconf macro AM_PATH_PROG_WITH_TEST to account for executable suffix
+ in win32 environment -DK
+* correct a mistyped parameter to CreateThread() (report by DK) -TD
+* do not use LIBOBJS symbol directly in configure script except to support
+ AC_REPLACE_FUNCS, since the autoconf macros dealing with that symbol changed
+ incompatibly in autoconf 2.54 (report by DK) -TD
+* fixes to work with BeOS 5.0 -Nigel Horne
+* use portable TXT_R rather than "rt" for popen() mode in clip_grab() (reported
+ by Antonio Maria Borneo) -TD
+* modify makeutcb.c to avoid compile-time dependency upon gettext, in case it
+ is used in cross-compiling -TD
+* modify expression for ws_read_per_sec in ws_netread() to avoid potential
+ divide-by-zero on a network error
+ (reported by David Potter) -Hataguchi Takeshi, -TD
+* modify fix for Debian #335593 to ensure that only image maps for the current
+ page are listed (report by DK) -TD
+* correct URL for HTML'ized description of all settings in lynx.cfg (report
+ by DK) -TD
+* use configure macro CF_SIGWINCH to work around special case on Mac OS X
+ which leaves SIGWINCH undefined -TD
+* add configure options --with-cfg-file and --with-lss-file to allow one to
+ specify the names and paths of the default configuration and color-style
+ files -TD
+* change configure script --enable-color-style so it is enabled by default
+ (prompted by request by Jason Spiro) -TD
+* add COLOR_STYLE setting to lynx.cfg -TD
+* change default initialization of color-style code when no lss file is given
+ to simulate the non-color-style code. There are some visual differences,
+ e.g., links that contain a mixture of styles will display with mixed colors,
+ but overall the visual effect matches the non-color-style code well enough
+ to change the default configuration.
+ If an empty string is given for the lss filename, this is treated as an
+ empty style file, and lynx will not use its built-in default color style.
+ To make the behavior easier to diagnose, lynx will now exit with an error
+ if it cannot find the lss file. cf: 2000-07-16 (2.8.4dev.5) -TD
+* fix a sign-extension in alignment case-statement in split_line() which could
+ cause a large indent for lines which are wider than the display (Debian
+ #360832, Debian #372670) -TD
+* fix ifdef's in LYOptions.c to make --disable-menu-options work (report by
+ PW) -TD
+
+2006-05-29 (2.8.6dev.18)
+* suppress OpenSSL URL from version message if it happens to be built using
+ GNU TLS -TD
+* change default for DEFAULT_INDEX_FILE in lynx.cfg to http://lynx.isc.org/
+ since the Mosaic MetaIndex file is defunct (suggested by SC)
+* update makelynx.bat (report by FLWM) -TD
+* add presentation for text/css, to allow browsing ".css" files -SC
+* modify LYPrint.c suggested_filename() to strip bzip2's ".bz2" suffixes as
+ well as ".zz" suffixes -TD
+* modify configure script macro AM_PATH_PROG_WITH_TEST to allow for DOS device
+ letter, and to override $PATHSEP with $PATH_SEPARATOR if the latter is
+ set -DK
+* modify ifdef in LYCurses.c to avoid using nonfunctional PDCurses 2.7
+ newterm() -DK
+* update config.guess (2006-04-26) and config.sub (2006-05-13)
+* improvements to configure script macros -TD
+ + don't use curses_colr on HPUX 11
+ + split-out CF_CURSES_HEADER to simplify comparison with CF_NCURSES_HEADER
+ + modify AM_WITH_NLS to make it look in non-system locations, e.g., to
+ work with FreeBSD ports system
+* modify HTLoadHTTP() to interpret leading asterisks in common name fields as
+ wildcards -Thorsten Glaser
+* remove SH_EX hardcoded Latin-1 table for strcasecomp() -TD
+* fixes for compiling in Cygwin environment -TH
+ + modify not to check d_ino when __CYGWIN__ is defined because it
+ does not seem to be supported by Cygwin now.
+ + modify to use fill_rehostent to avoid segfault in _fork_func,
+ which is used in Win32 environment (includes Cygwin).
+* fix some printf formats -Thorsten Glaser
+* fix some non-POSIX syntax in scripts/cfg_path.sh -PG
+* modify makefile.in to ensure that scripts are prefixed with $(SHELL), in
+ case packager has stripped executable permissions from scripts, e.g., by
+ using CVS (report by Atsuhito Kohda) -TD
+* add a null-pointer check in handle_LYK_HEAD() to cover a case where doing
+ a HEAD on a link failed because there was no submit action associated with
+ the link (report by Walter Ian Kaye, SC) -TD
+* improve tbl2html.pl script to cover the ranges and approximations used in
+ def7_uni.tbl -TD
+* additional def7_uni.tbl conversions (patch by Tim Larson).
+* fix ifdef's for repeated-include of winsock.h for Visual Studio 6 -TD
+
+2006-01-22 (2.8.6dev.17)
+* improve EXP_JAPANESEUTF8_SUPPORT -TH
+ + correct an ifdef in HTMIME.c
+ + correct the behavior of encoding a text in input element,
+ when the type is hidden and the text is japanese encoded utf-8.
+ + correct "//TRANSLIT" position in iconv_open() parameter.
+* remove redundant size-check in change for HText_trimHightext() in 2.8.5dev.8
+ to fix highlighting for this case:
+ <a href>Line 1<p>Line 2<p>Line 3</a>
+ (report by Andrew Belov) -TD
+* add U+213B FAX to def7_uni.tbl (Debian #344275) -TD
+* adjust anchor extent to discount trailing blank which is trimmed when
+ rendering. If the blank is not trimmed, link highlighting in color-style
+ will show a spurious character (report by Karl-Heinz Weirich) -TD
+* fixes to source-view of ftp:// and file:// URLs, i.e., eliminate redundant
+ PRE's, add DOCTYPE and meta tags (Debian #347989) -TD
+* modify makefile.msc to ease scripted building of various configurations
+ without needing to edit that file -TD
+* fixes to allow building with Visual C++ .NET 2003 -TD
+* modify configure script checks for gettext to supply include- and lib-paths,
+ e.g., to work on partly broken platforms such as FreeBSD -TD
+* modify parsing of filename from Content-Disposition so that the name is not
+ truncated on embedded whitespace. For most systems, the blanks will be
+ retained. For VMS and MSDOS, the blanks are translated to underscores
+ (Debian #291716) -TD
+* add a range-check for references to the style cache -Andrew Belov
+* modify fmt_tempname() to avoid the possibility of long random sequences that
+ do not yield an unused filename (report by FLWM) -TD
+* modify install rules for lynx.cfg to allow for pathnames on OS/2 EMX that
+ begin with a drive letter rather than a slash -TD
+* move scripts that are not part of the configure script into scripts
+ subdirectory: cfg_defs.sh, cfg_edit, fixtext.sh -TD
+* improve workaround for line-drawing characters with font-switching by
+ checking if the loaded font has line-drawing characters in the same positions
+ as the terminal description, rather than simply ignoring line-drawing when
+ the codeset differs (report by Karl-Heinz Weirich) -TD
+* fix some ifdef's that did not work when disabling all features -TD
+* fix a typo in LYMap.c from Debian #335593 changes (report by Jens
+ Schleusener) -TD
+* really remove pointer to moxienet (report by SC) -TD
+
+2005-12-18 (2.8.6dev.16)
+* change configure option default for --enable-justify-elts to true -TD
+* change default for JUSTIFY to "false" (suggested by Bela Lubkin) -TD
+* update config.guess (2005-11-11) and config.sub (2005-11-13)
+* print the contents of image maps, if any, at the end of a dump (Debian
+ #335593) -TD
+* fix off-by-one line calculation that allowed the last page to be blank
+ (Debian #330413) -TD
+* modify statusline() to retain one trailing blank if the given string has a
+ trailing blank. This makes prompts easier to read (report by Karl-Heinz
+ Weirich) -TD
+* modify pipe read in LYGetHostByName() to retry until either the pipe closes
+ or the struct passed back from the child process completes. This is needed
+ for OS/2 EMX (report by Karl-Heinz Weirich) -TD
+* strip unneeded "&nbsp;" from translation when building info page using
+ wide curses (Debian #342877) -TD
+* add scripts/tbl2html.pl, which can be used to generate test pages for the
+ charsets from src/chrtrans/*.tbl -TD
+* add ISO-8859-13 and ISO-8859-14 chrtrans tables, revise ISO-8859-10
+ based on
+ http://czyborra.com/charsets/iso8859.html
+ Change display name for ISO-8859-10 to indicate the region -TD
+* add codepage 857 (DOSTurkish), since console-tools package provides a
+ suitable font -TD
+* improve UCSetBoxChars(), checking if the current character set does not
+ match the character set inferred from the locale. This reduces the number
+ of cases where line-drawing in the options menu does not work -TD
+* rename test/iso8859-1.html and test/iso88592.html to test/iso-8859-1.html
+ and test/isoi-8859-2.html, corresponding to the proper MIME names to
+ simplify test-scripts -TD
+* update Linux console font support to use console-tools package (tested on
+ Debian). The configure script checks for consolechars and setfont programs
+ (must find at least one). The corresponding SETFONT_PATH can be set in
+ lynx.cfg to provide a choice between the two -TD
+* strip special characters such as '%' from parameters passed to external
+ programs for EXTERNAL mechanism on Windows platform. This is ifdef'd
+ with WIN_EX (Hataguchi Takeshi).
+* modify definition of addch_raw() to allow scrollbar to work with slang2
+ (this only works on the Windows platform) -GV
+* modify LYSysShell() to use $COMSPEC if $SHELL is not defined -GV
+* workaround for codepage support on OS/2 by changing the effect of unctrl().
+ Add/use new preferred function use_legacy_coding() to ncurses which provides
+ the same effect with the wide-character ncursesw (report by Karl-Heinz
+ Weirich) -TD
+* fixes for de.po (Debian #313789, patch by Jens Seidel).
+* add a null pointer check for HTCurSelectedOptionValue in
+ HText_setLastOptionValue() to improve handling of this fragment:
+ <FORM><SELECT><OPTION><FORM><SELECT>
+ (Alexey Dobriyan).
+* add a null pointer check in HTML_TAB case of HTML_start_element() to handle
+ this fragment:
+ <TAB INDENT=1 TO>
+ (Alexey Dobriyan).
+* remove pointer to
+ http://www.moxienet.com/lynx/
+ since it no longer has useful information about SSL for Lynx (Crouton).
+* add description of configure --with-build-cc, etc., to INSTALLATION -TD
+* modify Switch_Display_Charset() so the font-switching feature can be turned
+ off at runtime, rather than silently re-enabling it every time a new page is
+ viewed. The automatic switching is enabled if the user has configured lynx
+ to use one of the automatically-detected fonts -TD
+* fix ifdef's to allow building --without-font-switch with OS/2 EMX -TD
+* work around bug in PDCurses wrapping by adjusting LYcolLimit macro. The
+ dev.14 change to HText_appendCharacter() exposed this bug in the Options menu
+ (report by Hataguchi Takeshi) -TD
+* fix change to lynx_default_colors() from dev.14 change to work with the
+ bright-blue.lss file (report by FLWM) -TD
+* add a configure test for ctermid(), needed for OS/2 EMX (report by
+ YANAGIHARA Nobuyuki) -TD
+
+2005-10-30 (2.8.6dev.15)
+* update URL for VMS server information in LYCgi.c -TD
+* modify LYLoadCGI() to prompt user, displaying the command that would be
+ executed, to confirm that it should be. This makes it easier to notice when
+ a local program would be run by activating a lynxcgi link. This is not done
+ in advanced mode, since the URL is already visible in the status line (report
+ by vade79, comments by Greg MacManus) -TD
+
+2005-10-17 (2.8.6dev.14)
+* add configure script support for large files; some changes made be needed to
+ the C code in dev.15 to exploit this -TD
+* work around part of the forms-menu extra wrapping from dev.12 by adjusting
+ text-field maximum size in HText_beginInput(). There is still wrapping of
+ options lists, which has to be treated differently. The cause for this
+ is the fix made to HText_appendCharacter() in dev.12 -TD
+* extend experimental option --enable-japanese-utf8, allowing lynx to convert
+ EUC-JP and Shift_JIS strings to UTF-8 -TH
+* modify CF_BUILD_CC to avoid clobbering environment variable $BUILD_CC
+ (from ncurses changes) -TD
+* remove special case in CF_XOPEN_SOURCE which suppresses _XOPEN_SOURCE
+ definition for Darwin (request by Emanuele Giaquinta)
+* fix an off-by-one error in comparison in HText_appendCharacter(), from dev.12
+ changes which showed up as wrapped lines in the options menu -TD
+* use h_addr_list[0] rather than h_addr in HTTCP.c for POSIX compatibility
+ (Emanuele Giaquinta)
+* remove references to LIBCMU in HTTCP.c, since it is long obsolete -TD
+* force a newline in HTML_end_element() after a </pre>, which causes lines
+ containing only whitespace before the </pre> to display a new line, rather
+ than putting that whitespace before text that follows the </pre> (report by
+ Thorsten Glaser for http://gcc.gnu.org/gcc-4.1/changes.html) -TD
+* improve fix for LYstartPopup() in dev.6 by keeping the menu width as-is and
+ adjusting its position rather than simply using the full screen-width when
+ the first try fails (report by Gene Small) -TD
+* correct logic in lynx_default_colors() so the color-style configuration does
+ not attempt to use default colors on a terminal which does not support it
+ (report by Bryan Henderson) -TD
+* add/improve limit checks in HTLex.c -Ulf Harnhammar, TD
+* ifdef'd out unused code in HTGroup.c -TD
+* eliminate fixed-size buffers in LYExpandHostForURL() to guard against
+ buffer overflow resulting from too-long domain prefix/suffix data from
+ lynx.cfg (report by Ulf Harnhammar) -TD
+* add a check for missing ':' in gopher response, to recover from the error
+ (patch by Ulf Harnhammar)
+* eliminate fixed-size buffers in HTrjis() and related functions to avoid
+ potential buffer overflow in nntp pages (report by Ulf Harnhammar,
+ CAN-2005-3120) -TD
+* correct "escape" character used in HTMake822Word, which was literally an
+ ASCII escape character rather than the RFC-822 backslash from 2.8.2dev.3
+ changes (report by Frederic Briere, Debian #318034) -TD
+* fix: when first "option" element of "select" had "disabled" attribute, Lynx
+ turned the entire "option/choice list" UNMODIFIABLE. The "disabled"
+ attribute of later "option" elements within the same "select" did not have
+ this effect. If the "disabled" attribute is honored, it should disable only
+ that element, not parent element or sibling elements (report by Paavo
+ Hartikainen) -TD
+* make CF_TAR_OPTIONS configure macro work with DJGPP by using $EXEEXT -DK
+* update config.guess (2005-09-19) and config.sub (2005-07-08)
+* configure script updates from tin and ncurses -TD
+* modify LYwaddnstr() to avoid sign-extension from changes in dev.12 (report
+ by FLWM) -TD
+* modify initialization so that
+ cat options.txt | lynx -
+ will allow interactive use (report by Arne Kowallik) -TD
+* add NO_MARGINS and NO_TITLE to lynx.cfg (request by SC) -TD
+* adjust line-position for form fields when -notitle option is used (report by
+ Arne Kowallik) -TD
+
+2005-06-07 (2.8.6dev.13)
+* add a check in LYnormalColor() to ensure that the color value is really
+ a color, i.e., do not do anything for monochrome displays (reports by
+ OpenMacNews and Jens Schleusener) -TD
+* make -nomargins option apply to Options menu layout -TD
+* changes to LYwaddnstr() in dev.12 exposed a case from dev.6 where the title
+ string was not truncated to avoid wrapping (report by PG) -TD
+* changes to LYwaddnstr() in dev.12 allowed recursion in a case that was only
+ designed for iteration (report by OpenMacNews) -TD
+
+2005-06-02 (2.8.6dev.12)
+* add rw.po, vi.po from
+ http://www.iro.umontreal.ca/translation/maint/lynx/
+* modify ".lss" files to work equally well on terminals setup with white text
+ on black background, or the reverse. This also required fixing a few places
+ in LYsubwindow() and curses_w_style() to make window backgrounds use the
+ colors given in the ".lss" default- and normal-colors lines -TD
+* make ".lss" example files somewhat readable by modifying parser to remove
+ blanks from the color description lines and modifying the example files to
+ use this feature -TD
+* modify scripts/cfg2html.pl to use strict variable checking, Getopt::Std
+ to eliminate a uninitialized variable warning -TD
+* modified fix for slang 2.0 which makes it clearer that the last parameter
+ of SLexpand_escaped_string is for UTF-8 -JED
+* when SOURCE_CACHE_MEMORY is used, avoid repeated realloc's of the same
+ memory chunk (really annoying for a long document) -LP
+* HTChunk extended to a linked list of chunks, additional put methods added.
+ Useful for pool infrastructure -LP
+* add ".h" to .SUFFIXES rule in src/chrtrans/makefile.in to work around change
+ made in NetBSD "make" late in 2003, incorporated into the 2.0 release.
+ The CVS change notes:
+ Trim .SUFFIXES to only contain those used in this file.
+ (reported by SC, comments by Klaus Klein and Martin Husemann) -TD
+* modify LYhighlight() to allow for the case where a form link extends for
+ several lines. It was not providing enough padding to fill in the "_"
+ characters past the first line of the link -TD
+* modify LYwaddnstr() to account for the case where LYhighlight calls it to
+ display a link which extends beyond the current line, i.e., it should be
+ wrapped. When lynx is built to use curses-pads, the highlighting was instead
+ truncated since it was computed according to the pad's limits. Fixing this
+ exposes some related problems with off-by-one's in GridText.c -TD
+* correct parsing of "key 0xNN" lines in command-scripts, had omitted a "!"
+ to invert a check (report by Silvio Moioli) -TD
+* correct off-by-one in expression for LYHideCursor(), since dev.6 changes
+ modified the LYcolLimit variable, changing it from the last usable column
+ value to the number of columns (report by DK) -TD
+* correct expression in HText_appendCharacter() which was simplified in
+ 2.8.5dev.4, but broke a comparison used for text-justification -TD
+* adjust wide-character offset computation in HText_trimHightext() to account
+ for soft newlines, i.e., the cell reserved to show continuation lines -TD
+* modify source-view toggle to keep the current anchor visible. Toggling
+ source view may change the line number on which the anchor is found,
+ requiring some adjustment. This feature is implemented only for source
+ cached pages -TD
+* remove obsolete ifdef in LYwaddnstr() for ncurses 5.1's experimental UTF-8
+ support -TD
+* modify HTConfirmCookie() and statusline() to allow cookie prompt message in
+ Japanese to not be truncated when using wide-curses -TD
+* modify logic for locale_charset configuration variable so it is not modified
+ simply by saving the .lynxrc while in running in a non-locale configuration.
+ That does not alter the display charset used by lynx -TD
+* correct calculation of extra space available for justification in
+ split_line() for the wide-curses configuration. Changes from dev.6
+ made this count formatting control characters twice, resulting in some
+ lines too long when justification was enabled -TD
+* improve description of command-line option syntax in the manpage, including
+ noting how to find the default values for most options (Debian #292393) -TD
+* modify is_true/is_false macros for processing command-line options to accept
+ "true" and "false" strings for consistency with the lynx.cfg parser, and to
+ ignore case of the boolean option values -TD
+* add -notitle option to suppress title line and following blank line to
+ maximize screen use for small displays (request by Daniele Baggio) -TD
+* add -nomargins option to suppress left/right margins to maximize screen use
+ for small displays (request by Daniele Baggio) -TD
+* add null-pointer checks in HText_setLastOptionValue() to guard against empty
+ <select> (report by Al Viro) -TD
+* fixes to allow compiling with slang 2.0 prerelease 5 -GV
+* fix to avoid divide-by-zero in ws_netread() -GV
+* modify ifdef for popup_choice() to work with handle_LYK_LINEWRAP_TOGGLE() on
+ NetBSD 2.0 (report by Gabor Z Papp) -TD
+
+2005-01-05 (2.8.6dev.11)
+* add presentation type for application/xml and text/xml mime types as per
+ http://www.w3.org/TR/xhtml-media-types/
+ http://www.w3.org/TR/2002/NOTE-xhtml-media-types-20020801
+ which states that they may be used, though application/xhtml+xml is the
+ preferred media type (Debian #184482) -TD
+* remove an extra free() introduced in fixes from dev.10 for leak-checking
+ (reports by Thorsten Glaser, FLWM) -TD
+
+2005-01-02 (2.8.6dev.10)
+* correct final sed command in help_files.sed which was not a basic regular
+ expression, left some links ending with .gz.gz -TD
+* update config.guess, config.sub
+* modify configure script to check for Intel compiler 8.0 -TD
+* modify ifdef's for USE_DEFAULT_COLORS, disabling it if the
+ use_default_colors() function is not found -TD
+* modify to allow compiling with C++ compiler, e.g., rename conflicting
+ keywords such as new, class, template (suggested by Nelson Beebe) -TD
+* remove leading/trailing blanks from suggested title string for ADD_BOOKMARK
+ (request by Walter Ian Kaye) -TD
+* add tags rules to makefile.in's -TD
+* repair fix for Debian #171312 by ensuring that it is only invoked if a URL
+ fragment was found in the getfile() call (report by PG) -TD
+* correct leak-checking for result of LYAddHilite(), which was not freeing
+ the associated strings -TD
+* correct leak-checking for result of LYcommandList(), which was not freeing
+ the associated strings -TD
+* correct pointer initialization in LYCheckForProxyURL() broken by fix for
+ Debian #240237 (reported by GV, SC) -TD
+
+2004-12-30 (2.8.6dev.9)
+* remove fixed limit on history[] array (report by Richard Eyre) -TD
+* improve logic for highlighting links which extend to multiple lines by
+ ensuring that if they cover a blank line that the following lines of the
+ link will be highlighted rather than the blank line (report by Hataguchi
+ Takeshi) -TD
+* replace most instances of exit() by exit_immediately(), except those needed
+ for the leak-checking code, to add an ifdef'd call to _nc_freeall() which
+ simplifies testing with valgrind -TD
+* fix definition of put_clip(), to compile in Windows environment (Hataguchi
+ Takeshi).
+* update da.po, et.po, hu.po, nl.po, sv.po, tr.po from
+ http://www.iro.umontreal.ca/translation/maint/lynx/
+* fix for mouse versus network I/O -GV
+ Building the djgpp version with S-Lang and mouse-support causes network I/O
+ to stop when Lynx is idle waiting for key/mouse events. This patch adds a
+ djgpp_idle_loop() function that does what getxkey() used to do; calls
+ tcp_tick() to finish off closed sockets and reply to pings etc. Tested with
+ PD-curses 2.6 too, but I couldn't get mouse to work under DOS. Not sure
+ that's possible at all.
+* add "Anonymous FTP Password" to Options menu, to allow user to override use
+ of personal email address as the anonymous ftp password (Debian #137480) -TD
+* modify LYCheckForProxyURL() to check if a colon follows a slash, which would
+ make the colon not part of a URL (report/patch by Matt Kraal (Debian
+ #240237)).
+* add test/special_urls.html -TD
+* update test/iso8859-1.html (minor fixes) from
+ http://www.ramsch.org/martin/uni/fmi-hp/iso8859-1.html
+* add check for broken WU_FTPD 2.6.2-12, e.g., at ftp://ftp.pppl.gov/, and
+ disable EPSV. This is ifdef'd with BROKEN_WU_FTPD and checks version (Debian
+ #66560, as well as April 2003 reports by HN, PW) -TD
+* modify getfile(), etc., to ensure that following a link consisting of a
+ fragment will move the cursor to the link containing the target rather than
+ simply ensuring that it is visible (Debian #171312) -TD
+* modify ShowInfo() to list the rendered size in bytes if the Content-Length
+ is not available (Debian #61085) -TD
+* modify print_wwwfile_to_fd() and void print_crawl_to_fd() to ensure that no
+ trailing blanks are written (Debian #204515) -TD
+* modify behavior when user attempts to toggle a radiobutton off, to make the
+ message that one radio button must be selected only in novice mode (Debian
+ #121520) -TD
+* make the maximum number of cookies configurable in lynx.cfg, added
+ MAX_COOKIES_DOMAIN, MAX_COOKIES_GLOBAL and MAX_COOKIES_BUFFER (Debian
+ #152810) -TD
+* reduce embedded blanks in button labels to single blanks -TD
+* reduce embedded blanks in title strings to single blanks (Debian #284679) -TD
+* add command-line option (-syslog-urls) and lynx.cfg settings (SYSLOG_TEXT,
+ SYSLOG_REQUESTED_URLS) to allow syslog'ing of URLs to be optional. This
+ cannot be set from the options menu (Debian #282739) -TD
+* modify HTParse() to restore a slash which may be removed during
+ simplification of URLs such as "file://localhost/tmp/..". The
+ LYFillLocalFileURL() function would then append the current directory to the
+ URL rather than the expected "/". This case which happens in DIRED, was
+ caused by 2.8.5dev.15 changes (Debian #285140) -TD
+
+2004-11-07 (2.8.6dev.8)
+* improve def7_uni.tbl substitutions for the symbols beginning at U+2600
+ (patch by Tim Larson <Tim.Larson@conagrafoods.com>).
+* update nl.po, sv.po from
+ http://www.iro.umontreal.ca/translation/maint/lynx/
+* add clean.com -TD
+* scripting fixes to make OpenVMS/IA64 platform build/work -TD
+* several changes to use const, prompted by VMS compiler warnings -TD
+* remove build-slang.com -TD
+* simplify libmake.com -TD
+* modify build.com, making its second parameter a comma-separated list of the
+ special libraries which may be used, e.g., bzlib, slang, ssl and zlib -TD
+* some cleanup using non_empty() macro -TD
+* limit TEXTAREA columns to the screen width, and rows to 3 times the screen
+ height (report by FLWM) -TD
+
+2004-10-17 (2.8.6dev.7)
+* update de.po, et.po from
+ http://www.iro.umontreal.ca/translation/maint/lynx
+* clarification in manpage description of "-pseudo_inlines" option (Dan
+ Jacobson).
+* correct parsing of embedded URLs which have parameters but no path, e.g.,
+ base
+ http://wj55.org/Minutes.php
+ and embedded
+ ?date_meeting=2004-08-31
+ (Debian #274619, report/analysis by Liam K Morland) -TD
+* improve description of --assume-local-charset option (Debian #270915) -TD
+* revise configure script check whether _POSIX_C_SOURCE should be defined,
+ taking into account the _POSIX_SOURCE definition (report by PG) -TD
+* add --with-system-type option to configure script to simplify testing the
+ case-statements involving $host_os -TD
+* fix a memory leak in IPv6 version of HTGetAddrInfo() -TD
+* modify HTCompressed() to choose the last viewer in the list with the best
+ quality. User-defined viewers appear after the built-in viewers, and by
+ choosing the last, lynx allows one to override the built-in defaults -TD
+* add "deflate" to the encoding types which lynx implements. This consists
+ of several parts (report by Thorsten Glaser) -TD
+ + adapted logic from w3m's inflate.c to construct an internal "deflate"
+ decompressor. Tested this with
+ http://carsten.codimi.de/gzip.yaws/
+ + simplify VMS-specific logic for trimming version in HTLoadFile().
+ + combined VMS- and Unix logic for decompression in HTLoadFile() as a new
+ function decompressAndParse() to eliminate clutter. As a side-effect,
+ eliminate some memory leaks in cases where the file is not loaded properly.
+ + add/use new function HTEncodingToCompressType() to eliminate clutter.
+ + add "deflate" to the options menu.
+ + modify logic that builds "Accept-Encoding" value to omit encodings which
+ have no external decompressor associated. The effect of this change is to
+ allow lynx to behave as it did before adding the (possibly incomplete)
+ "inflate" support.
+ + add INFLATE_PATH to lynx.cfg, to optionally specify an external program
+ which can be used to decompress deflated files. For testing, a shell
+ script using w3m's utility, e.g., /usr/lib/w3m/inflate, sufficed.
+ NOTE: As currently implemented, lynx requires the external decompression
+ programs to be specified even if it can decompress using library calls.
+ + use ".zz" for suffix of downloaded (but not inflated) deflated files,
+ mapped to application/deflate and application/x-deflate.
+* fix LYSetConfigValue(), which did not properly handle the CONF_PRG case which
+ is used to allow user configuring the program paths -TD
+* fix content_is_compressed() function, which was checking for the absence only
+ of some nonstandard encodings (8bit, 7bit, binary) rather than for the
+ presence of the encodings as specified in RFC 2068 (gzip, compress, etc).
+ This makes lynx able to view a site
+ which puts the charset as the Content-Type (report by FLWM) -TD
+* fix configure script: top-level makefile uses $(TAR), which was not defined
+ if --without-dired option was used (report by Gabor Z Papp) -TD
+
+2004-10-10 (2.8.6dev.6)
+* highlight the target and pause for 20 milliseconds when selecting a link with
+ the mouse -GV
+* improve layout of options-menu and info-page for multibyte character sets by
+ computing the extent of the labels. This works only for wide-character
+ curses (this addresses part of Debian #240069) -TD
+* improve check in LYstartPopup() for case where a window would be created too
+ far right to be entirely visible. ncurses changes in 20040417 to allow
+ windows to extend beyond the terminal limits exposed this problem (which may
+ have occurred with other versions of curses). Older versions of ncurses
+ would return an error in this case (forcing lynx to do the proper layout),
+ obscuring the actual problem. Noticed that the same problem applies to slang
+ configuration, and applied a comparable fix there too -TD
+* modify HTConfirmCookie() to ensure the translator's note is copied into the
+ lynx.pot file, by adding a gettext("Y/N/A/V") call after the comment -TD
+* remove references in makefile.in to the "intl" subdirectory since that is no
+ longer packaged with lynx -TD
+* modify column limits, allowing text to be written to the last column on the
+ screen. This allows users to view text which is formatted for 80 columns
+ without the last character of each line wrapping to the next line -TD
+* minor fixes to fr.po (Debian #119751, and aspell) -TD
+* remove newline from format in lookup_reject(), fixes a bug introduced in
+ 2.8.5dev.2 which caused traversal reject-lookups to fail -TD
+* minor fixes to fr.po, cs.po and pt_BR.po to eliminate fatal errors as
+ reported by "msgfmt -c -v" -TD
+* minor fix to fr.po (Debian #271048, report/patch by Arnaud Giersch).
+* update URL for "HTML Quick Reference Guide" in lynx_help_main.html (report
+ by Jim Jackson) -TD
+* update hu.po from
+ http://www.iro.umontreal.ca/translation/maint/lynx
+* remove a "defined(gettext)" from the ifdef's in HTConfirmCookie(), since
+ recent GNU gettext, e.g., 0.13.1, introduced an incompatible/undocumented
+ change to make the function a macro which is defined in terms of dgettext()
+ (Debian #204994, report by Mattias Ostergren) -TD
+* modify pumpData() in HTMIME.c to improve recovery when a charset is found
+ that cannot be translated. Before this change, the charset was not stripped
+ from the format string, e.g.,
+ text/html; charset=big5
+ and since there would be no match for the format, lynx would offer to simply
+ download the page (if interactive), or refuse to format (for dumps).
+ Although the content of the page is unusable, the user can still navigate
+ the page using the links which may be there (Debian #254603) -TD
+* add -nonumbers option, which modifies the output of -dump to suppress the
+ link-numbering (Debian #255571) -TD
+* add -listonly option, which modifies the output of -dump to show only the
+ list of links (Debian #255571) -TD
+* modify treatment of symbolic links for ftp-URLs to show the link target, as
+ with the local directory editor -TD
+* correct sort-order of local directory listing, using the target of a symbolic
+ link to determine whether it is grouped with files or directories (adapted
+ from patch by Kees Cook) -TD
+* modify template for temporary-directory name, adding "lynx" prefix (Debian
+ #267356) -TD
+* fixes for configure script macros used for --enable-nls when --srcdir is
+ used (from bug report for dialog by Mike Castle) -TD
+* improve configure script macro CF_XOPEN_SOURCE, ensuring that _POSIX_C_SOURCE
+ is defined with a value (comment on comp.sys.stratus newsgroup) -TD
+* reduce TRST_MAXROWSPAN and TRST_MAXCOLSPAN to 200, which is more plausible
+ than 10000 by 1000 (discussion on lynx-dev related to report by Edgard
+ Pineda) -TD
+* modify LYShowInfo.c to entify most strings, and provide for alignment of
+ fields in different locales -TD
+
+2004-06-30 (2.8.6dev.5)
+* use LYEnsureAbsoluteURL() on the value passed to handle_LYK_HELP() in case
+ it is of the form file:///path rather than file://localhost/path -DK
+* add configure check for ncurses' curses_version() function, using that in
+ the "-version" output. Add comparable ifdef's for PDCurses and slang -TD
+* Some patches to enable IPv6 on Windows (tested with MingW and MSVC6). Some
+ minor cleanups also -GV
+ + LYutils.c; fixed extraction of module/system error strings.
+ + Xsystem.c; use <io.h> for mktemp() prototype.
+ + HTTCP.c; don't use global host[], fixed call-convention of thread- function
+ (must be __stdcall). Sets pending WSAHOST_NOT_FOUND error status.
+ + HTTP.c; _thread_func() wasn't __stdcall.
+ + LYexit.c; avoid redeclaring error of exit() in <process.h>. IMHO it's very
+ bad to shadow ANSI functions like this. Should call LYexit() explicitly.
+ + www_tcp.h; cleanup for MSVC and IPv6 headers and macros. Increase
+ MAXHOSTNAMELEN to 128.
+* updated po files (da.po, et.po, hu.po, sv.po, tr.po) from
+ http://www.iro.umontreal.ca/translation/domains/
+* change HTDOS_wwwName() and HTVMS_wwwName() to return a const value (report
+ by Serge B) -TD
+* update configure script macros CF_XOPEN_SOURCE (fixes Debian #238057) and
+ CF_X_ATHENA (from xterm) -TD
+* update config.guess (2004-06-24) and config.sub (2004-06-24)
+* modified mailcap command and testcommand substitutions to provide for
+ running the testcommand's after program initialization (prompted by review
+ of Debian #167200, which gave as example a mailcap using %{charset} in the
+ test commands) -TD
+* add (ifdef'd with EXP_HTTP_HEADERS) code in HTMIME.c to collect and in
+ LYShowInfo.c to display the full text of the HTTP headers -TD
+* correct command-line options table for "-get_data" and "-post_data" which
+ were processed twice, thereby discarding the value (Debian #132674) -TD
+* lynx accepts multiple URLs on the command line; all are added to G)oto
+ history. Documented this in manpage (Debian #177062) -TD
+* modify logic for -dump so it can dump all pages listed on the command line
+ (Debian #199131) -TD
+* add presentation type for application/xhtml+xml mime type as per RFC 3236
+ (report by Elimar Riesebieter) -TD
+
+2004-05-23 (2.8.6dev.4)
+* use puts() rather than printf() in some messages to avoid chance of "%" in
+ the translation -TD
+* add experimental option --enable-japanese-utf8 for using libiconv for
+ Japanese and UTF-8 -TH, TD
+* update makelynx.bat -Victor Schneider
+* modify configure script CF_ADD_CFLAGS to put definitions of quoted strings
+ in EXTRA_CPPFLAGS -TD
+* fixes from Thorsten Glaser:
+ + check for arc4random as a possible random function.
+ + modify configure script CF_CHECK_CACHE to look for config.guess in
+ $ac_aux_dir if it is not in the source directory.
+* fix naming conflict with AS_cmp() function when NOT_ASCII is defined -PG
+* read user's ".newsauth" file for news-server authentication information
+ (prompted by A R Vener request) -TD
+* modify HTSaveAndExecute() to check first for result from HTFileSuffix()
+ before choosing between BIN_SUFFIX and HTML_SUFFIX. This allows the PDF
+ viewer on OS X to get the proper suffix (.pdf) rather than .bin -PG, TD
+* filter out extra screen-repainting when a charset change is made -IZ
+* update README and other documentation to reflect new mailing list -TD
+* add PREFERRED_ENCODING to lynx.cfg, along with an options-menu selection for
+ this, to set "Accept-Encoding:" string -TD
+* add PREFERRED_MEDIA_TYPES to lynx.cfg, corresponding to the option for
+ HTFilterPresentations(). A minimal set of media types is used by default,
+ though the old behavior can be selected -TD
+* modify HTFilterPresentations() to use new option menu entry for specifying
+ what parts of the user- and system-mailcap data to use in Accept's. The
+ intent is to provide easily managed subsets of the Accept string, to work
+ with servers that do not accept long Accept strings (prompted by discussion
+ on lynx-dev mailing list) -TD
+* Remove logic from HTFilterPresentations() which reduced the Accept strings
+ based on wildcards since RFC 2616 says wildcards are lower precedence than
+ other settings -TD
+* improve matching for mailcap test-commands in HTInit.c by eliminating
+ unnecessary whitespace with TrimCommand() -TD
+* remove obsolete note about SSL patches in lynx_url_support.html -TD
+
+2004-05-06 (2.8.6dev.3)
+* add scripts/indent.sh, use this to reindent C source files -TD
+* bump version in makefile.in to 2.8.6 -TD
+
+2004-04-27 (2.8.6dev.2)
+* modify CF_NCURSES_LIBS to only look for -lmytinfo when building with ncurses.
+ This works around FreeBSD's broken linker semantics when configuring for
+ ncursesw -TD
+* update CF_GNUTLS macro to look for -lgnutls-openssl as well as the older
+ -lgnutls-extra library -TD
+* fix a spurious match of <openssl/ssl.h> when --with-ssl=path option provides
+ enough information to ensure that the test would be incorrect -TD
+* update config.guess (2004-02-16), config.sub (2004-02-23)
+* fixes to src/chrtrans/makefile.in, e.g., for building PDCurses version,
+ broken by dev.1 changes for cross-compiling -TD
+* remove macros such as ARGS1, NOPARM which supported K&R compilers -TD
+
+2004-04-19 (2.8.6dev.1)
+* correct ifdef in LYgetattrs() to ensure that getattrs() is used only if the
+ configure script actually found it (report/patch by Paul Gilmartin).
+* correct LYcommandList() to allocate data passed to HTList_addObject(), since
+ LYRemoveFromCloset() may free it (report by FLWM) -TD
+* modify configure-script check for use_default_colors() to allow it to find
+ NetBSD's implementation of that function (report/patch by Julian Coleman)
+* check for non-null file pointer in cleanup of makeuctb to work properly when
+ it is invoked without command-line parameters (report by FLWM) -TD
+* add a null-pointer check to parameter of HTQuoteParameter(), fixes bug
+ introduced in 2.8.5pre.4 (report by FLWM) -TD
+* correct units shown by HTReadProgress() for very low rates - bug from
+ 2.8.5pre.3 changes (report by PG) -TD
+* use symbol USE_VERTRACE in HTUtils.h to allow makefiles that do not use the
+ configure script to turn on the equivalent --enable vertrace feature (request
+ by FLWM) -TD
+* modify configure script and makefiles to allow cross-compiling -TD
+* make ANSI C required, drop support for K&R C -TD
+* update current-version in README -LP
+* updated po files (da.po, de.po, et.po, hu.po, tr.po) from
+ http://www.iro.umontreal.ca/contrib/po/maint/lynx/
+* use autoconf 2.52 (plus patches), to simplify use in cross-compiling -TD
+* escape "From " when it appears in a page which is mailed, to avoid confusing
+ mail clients -TD
+
+2004-02-04 (2.8.5rel.1)
+* build fixes for MINGW32 -DK
+* build fixes for OS/2 (reported by IZ) -TD
+
+2004-02-02 (2.8.5pre.5)
+* MINGW32-specific changes to build with that configuration using the configure
+ script in Cygwin and "-mno-cygwin" option -DK
+* move Cygwin defines for WIN_EX, _WINDOWS_NSL out of www_tcp.h, to the
+ configure script to fix a definition-order problem with CAN_CUT_AND_PASTE
+ (report by DK) -TD
+* improve workaround for ncurses to build with pre-4.0 versions that do not
+ declare attr_t -TD
+
+2004-01-28 (2.8.5pre.4)
+* workaround to build with ncurses 4.2 -TD
+* fixes from Thorsten Glaser:
+ + use ${GNUSYSTEM_AUX_DIR}/mkinstalldirs if it exists.
+ + use $ac_config_sub variable in CF_CHECK_CACHE macro.
+ + add case in CF_XOPEN_SOURCE macro to prevent defining _XOPEN_SOURCE
+ + use $(MKINSTALLDIRS) variable in generated makefile.
+ + correct comment in lynx.cfg for the default value of FTP_PASSIVE
+ + increase pattern length for mkdtemp() call.
+* add command-line & menu option/config variables to replace the compile-time
+ UNDERLINE_LINKS definition (suggested by BL) -TD
+* correct ownership of installed lynx_doc directory (report by FLWM, PG) -TD
+* modify configure check for tar to test several common variants including
+ star, modify makefile.in to use the configured 'tar' program (request by
+ FLWM) -TD
+* compiler ifdef-fixes -BL
+* documentation updates for DJGPP and OpenSSL -DK
+* fixes/updates for DJGPP makefiles -DK
+* modify po/makefile.inn to substitute the PACKAGE and VERSION strings into
+ lynx.pot automatically, and to remove the unused boilerplate header comment
+ (suggested by LP) -TD
+* fixes for substituted project-version in configure script -TD
+
+2004-01-24 (2.8.5pre.3)
+* update documentation's version numbers for release -TD
+* modify configure check for libbz2 to allow for older headers which do not
+ include <stdio.h> -TD
+* add configure option --enable-locale-charset, which adds configure settings
+ and an option-menu checkbox telling lynx if it should use the function call
+ nl_langinfo(CODESET) to find the display character set rather than rely on
+ the user to set it via lynx.cfg or the options menu (discussion with Andreas
+ Metzler) -TD
+* remove intl subdirectory (gettext-0.10.35), since some of the ".po" files
+ have been modified to rely upon newer features of gettext. Modified
+ configure script macro to report this properly -TD
+* add SSL_CERT_DIR, SSL_CERT_FILE to lynx.man (suggested by SC) -TD
+* documentation updates for DJGPP -DK, LP, FLWM
+* update address for Free Software Foundation in COPYHEADER and COPYING
+ (Atsuhito Kohda).
+* change CF_CHECK_IPV6 to warn rather than error-out if a working getaddrinfo()
+ function cannot be found. The previous behavior would warn on Linux and
+ error-out on other systems (report by RobertM) -TD
+* localized displayed strings used for popups in options menu -TD
+* add SHOW_KB_NAME to allow user to decide whether to display "KB" or "Kib"
+ or even "Kilobytes" for the progress message (discussion on lynx-dev) -TD
+* correct form generated to select Visited Links page in LYHistory.c to match
+ the values used in LYOptions.c with new function LYMenuVisitedLinks, and
+ corrected ifdef to ensure that menu is generated when the forms-based option
+ menu is configured (report by TH) -TD
+* modify configure check for ranlib to use AC_CHECK_TOOL, since AC_PROG_RANLIB
+ does not do proper cross-compiling checks. This actually applies to autoconf
+ 2.5x -- autoconf 2.13 does less in that area -TD
+* update config.guess (2004-01-05) and config.sub (2004-01-05).
+* ensure that freeaddrinfo() is only called if lynx has initialized its
+ parameter, fixes a core-dump on IRIX6.5 -TD
+* change remaining references for lynx.browser.org to lynx.isc.org (reported by
+ Frederic L W Meunier) -TD
+
+2004-01-19 (2.8.5pre.2)
+* update URLs in docs/README.ssl (SC, DK).
+* use http://search.lycos.com rather than the messy http://www.lycos.com -DK
+* update some URLs in lynx_help -FLWM (Frederic L W Meunier)
+* remove a few unnecessary #include's (reported by Frederic L W Meunier) -TD
+* fix some compiler warnings with casts -PG
+* add docs/ directory to "make install-doc" rule. If the help-files are
+ compressed, the same will apply to the non-README files in that directory
+ (reported by Frederic L W Meunier) -TD
+* minor fixes to allow compiling with K&R compiler, e.g.,SunOS 4.x with the
+ 5lib curses -TD
+* split up remove_file() in LYLocal.c so directory removal is performed in a
+ separate function remove_directory(). Neither will perform an "rm -rf",
+ but only single operations "rm" and "rmdir". The original behavior can be
+ obtained by setting RMDIR_PATH to point to a script which does "rm -rf"
+ in lynx.cfg (suggested by Pat Walsh).
+* modify configure script so NetBSD does not define _XOPEN_SOURCE, since that
+ makes the IPv6 code not compile -TD
+* modify configure script to prefer _SGI_SOURCE on IRIX6.5 to allow it to
+ compile IPv6 support (report by RobertM) -TD
+* replace fixed-buffer Style_className[] with a dynamically-allocated buffer,
+ needed for large pages which lack correctly-nested tags, e.g.,
+ http://www.aspas-nature.org/petitions/petition2.html
+ (reported by Frederic L W Meunier) -TD
+* move OMIT_SCN_KEEPING definition to LYHash.h, to avoid mismatch between the
+ LYCurses.c and HTML.c -TD
+* remove obsolete OPT_SCN ifdef from HTML.c since the inactive side does not
+ compile -TD
+* fix a few out-of-bounds errors in LYSetHiText() and related functions,
+ which were found by valgrind -TD
+
+2004-01-07 (2.8.5pre.1)
+This version has been test-built on
+ * Linux (ncurses, ncursesw, PDCurses, slang),
+ * FreeBSD 4.9, 5.1 (ncurses, ncursesw),
+ * Tru64 4.0d, 5.1 (cc, curses),
+ * OpenVMS,
+ * OS/2 EMX,
+ * win32 (Visual C++ 6.0 and Borland C++, Cygwin),
+ * AIX 4.3, 5.1,
+ * HPUX 11,
+ * Solaris 8, 9.
+Other recent builds include IRIX 6.5 (cc and gcc, curses/ncurses),
+FreeBSD 4.1, 4.8, NetBSD 1.5, 1.6 and OpenBSD 2.8 (curses/ncurses).
+
+2004-01-07 (2.8.5dev.17)
+* fix initialization of LYlines and LYcols for curses configurations other than
+ ncurses which implement pads -TD
+* fix ifdef's for alloca(), e.g., on AIX 4 -TD
+* fix misspelled LYGetEnv/LYgetenv in DJGPP configuration -DK
+* a few portability fixes to allow building on OS/2, AIX, Tru64 and HPUX -TD
+* add docs/README.rootcerts -IZ, SC, Johannes Hromadka
+* update po files (ca.po, da.po, de.po, et.po, hu.po, ru.po, sv.po, tr.po and
+ zh_CN.po) from
+ http://www.iro.umontreal.ca/contrib/po/maint/lynx/
+* correct some mismatches between INSTALLATION and "configure --help" (prompted
+ by discussion with SC) -TD
+* undef conflicting symbols "small" and FILE_DOES_NOT_EXIST which are
+ misdefined in Cygwin's w32api headers (report by Frederic L W Meunier) -TD
+* amend check for refresh-URL to ensure it only prepends a link for text/html
+ content type (report by Carlton Anderson) -TD
+* do not strip parameters from refresh-URL (report by Carlton Anderson gave an
+ example of their use) -TD
+* correct logic for resetting count of leading/trailing spaces in S_litteral
+ case (report by TH) -TD
+* remove obsolete XMOSAIC_HACK defines -TD
+* adapted patch by Bjoern Jacke <bjoern@j3e.de> to ensure that toupper(),
+ tolower() and isupper() macros are interpreted in POSIX locale. This is
+ ifdef'd with EXP_ASCII_CTYPES -TD
+* improve check for Unix-style shell given in $SHELL by limiting the check to
+ the base-name (discussion with GV, DK) -TD
+* modify increment_tagged_htline() to reallocate its HTLine parameter if the
+ result would be larger than the allocation. This can happen when a large
+ textarea is adjusted (report by Thorsten Glaser) -TD
+* add ifdef'd logic to change HTLine to calloc() rather than memory pools,
+ making it possible to use valgrind, etc., for debugging -LP
+* modify version shown for SSL to be derived from runtime SSLeay_version()
+ function if linked with OpenSSL or SSLeay. Add corresponding definition
+ for GNU TLS (discussion by Frederic L W Meunier, GV) -TD
+* add check for broken ProFTPD 1.2.5rc1, e.g., at ftp://ftp.oldskool.org/pub,
+ and force a reconnection if an error 550 is detected when doing RETR. This
+ is ifdef'd with BROKEN_PROFTPD and checks version (reports by GV, DK) -TD
+* modify file-upload to not print a warning message if the form-field is empty
+ (Frank Heckenbach).
+* add a few null-pointer checks to GridText.c (addresses symptoms reported by
+ Frederic L W Meunier when nested-tables are toggled off) -TD
+* modify LYTrimNewline() to trim carriage-returns as well as line-feeds, making
+ it possible to share cookie files between platforms that have different
+ line-terminations (report by Frederic L W Meunier) -TD
+* rename EXP_PERSISTENT_COOKIES ifdef to USE_PERSISTENT_COOKIES -TD
+* rename EXP_READPROGRESS ifdef to USE_READPROGRESS -TD
+* rename SOURCE_CACHE ifdef to USE_SOURCE_CACHE -TD
+* change a few configure script defaults to "enable": source-cache, prettysrc
+ and read-eta. Also change default for read-eta configuration flag to "Show
+ KB/Sec" (requests by LP, Frederic L W Meunier) -TD
+* modify generated help_files.sed script to fix a couple of cases where the
+ intermediate result had more than 2 ".gz" substrings to reduce (reported by
+ IZ) -TD
+* change configure script to compile-in file-upload by default, change its
+ corresponding ifdef to USE_FILE_UPLOAD -TD
+* use EXEEXT, OBJEXT substitutions in makefile.in -TD
+* update configure script check for getbegx(), etc -TD
+* revert table-layout changes from dev.15/dev.16 because of unresolved
+ issues -TD
+* add configure option --with-bzlib -TD
+* modify bzip2/zlib ifdef's to make them independent -TD
+* implement support for bzip compression by internal calls to libbz2 -IZ
+* make usage of EDIT_A_PREV_SHORTCUT and EDIT_THE_PREV_SHORTCUT consistent
+ (report by LP) -TD
+* if a document is in the cache (the rendering is in memory), on reload it
+ should not be cleared from the cache until the connection to the server is
+ opened; if the connection fails, the user will reuse the old version (request
+ by IZ) -LP
+* for DJGPP, escape all backslashes in commands given to LYSystem() when
+ a Unix-style shell is given in $SHELL -DK, TD
+* correct strings in LYOptions.c so ENABLE_LYNXRC works for bookmark_file
+ and run_all_execution_links -DK
+* modify comparison in USE_CURSES_PAIR_0 ifdef of parse_attributes() to take
+ into account the mono-attributes as well. This fixes a case where a color
+ style might have the same color-attributes as the background, and would
+ incorrectly fall-through to use the mono-attributes (report by DK) -TD
+* rewrote lynx_chg_color() to handle a COLORS value of 16 (report by TH) -TD
+* redefine PDCurses' COLORS value to 16, since it incorrectly uses 8 -TD
+* add -scrsize option and corresponding SCREEN_SIZE value to lynx.cfg to allow
+ lynx's screensize to be specified. To display background color properly,
+ this also requires a patch to PDCurses:
+ http://www.t3.rim.or.jp/~patakuti/tmp/lynx/PDCurses-2.5.patch.resize
+ This requires PDCurses 2.5 and higher -TH
+* add a clean-rule to src/chrtrans/makefile.bcb -TD
+* fix pathname generated for "View temporary file" in LYDownload.c using new
+ function LYAddPathToSave() (report by P.J.Walsh) -TD
+* comment-out --enable-libjs option since it is not used -TD
+* change code to match lynx.cfg description for FORCE_COOKIE_PROMPT and
+ FORCE_SSL_PROMPT, making "prompt" rather than "default" the keyword to use
+ when telling lynx to prompt (report by DK) -TD
+* really add FORCE_COOKIE_PROMPT setting to lynx.cfg (report by DK) -TD
+* change default of configure script options --enable-source-cache and
+ --enable-prettysrc to non-experimental to "yes", so they will normally
+ be compiled-in, but normally disabled in lynx.cfg (suggested by LP).
+* modify configure script and related ifdef's to build with gnutls 0.8.9
+ (report by Atsuhito Kohda) -TD
+* modify ifdef's to use mkdtemp() if it is available (prompted by MirBSD
+ patch) -TD
+* several fixes from (TG) (Thorsten Glaser - MirBSD):
+ + workaround for invoking shell scripts when executable permissions are
+ discarded as a result from using CVS.
+ + adjust buffer-size used in a readlink() call in case the result is too
+ long to include trailing null.
+ + change default ftp mode to passive.
+ + if ftp connection fails, automatically retry, switching between passive
+ and active modes. Do this retry switching only when connecting to a
+ different host. A new variable ftp_local_passive distinguishes this
+ from the user preference in ftp_passive.
+ + improved certificate handling (case-insensitive domain-comparison, strip
+ port-numbers from comparison).
+ + fix a few typos & compiler-warnings.
+* add PT154 charset support. See
+ http://www.iana.org/assignments/charset-reg/PTCP154 for more information.
+ (patch by Timur Birsh <birsh@mail.kz>)
+* integrate some improvements for configure script in CF_BUNDLED_INTL and
+ CF_OUR_MESSAGES from tin and dialog -TD
+* remove #undef for UTF8 from UCMap.h, rename UTF8 variable, modify configure
+ check for slang to test-compile with with the Debian slang-utf8 package -TD
+* modify configure script to not use "head -1", which does not work for some
+ platforms when POSIXLY_CORRECT (sic) is set -TD
+* fix configure script check for term.h, which may be <ncursesw/term.h> -TD
+* modify an ifdef in HTCheckForInterrupt() to allow compile with DJGPP -GV
+* add docs/README.sslcerts (Stefan Caunter <cauntes@mail.mohawkc.on.ca>).
+* modify LYLocalFileToURL() to allow for CurrentDir() returning a value that
+ does not begin with a slash, e.g., with DJGPP which returns a drive-letter
+ first -DK
+* amend change in dev.15 to HTParse() to escape spaces, to exclude non-URL
+ strings such as absolute filenames (report by Patrick Ash) -TD
+* modify LYParseTagParam() (added in dev.13) to not stop on ';' (fixes a bug
+ reported by LV which broke complicated refresh-URL containing "&amp;") -TD
+* change default start page to lynx.isc.org, since lynx.browser.org is not
+ maintained -TD
+* modify HTML_start_element() to work with a case where there is an HREF
+ attribute without a value, fixes bug introduced after dev.9, e.g., for
+ X-URL: http://bankr.tsr.ru/tv-6.shtml
+ (also reported by Frederic L W Meunier for http://www.jacotei.com.br/) -LP
+* correct construction of link to temporary filename in download options, did
+ not port to DOS-pathnames (report by LP) -TD
+
+2003-06-01 (2.8.5dev.16)
+* add zh_CN.po from
+ http://www.iro.umontreal.ca/contrib/po/maint/lynx/
+* updated obsolete link for nntp in users's guide -TD
+* add F_FILE_TYPE to F_TEXTLIKE() macro, and use it consistently in a few more
+ places, making editing in filename fields consistent with other text input
+ fields -TD
+* add LYAdjHiTextPos() to modify the behavior of color-style code, so leading
+ blanks are not highlighted (reported by Frederic L W Meunier) -TD
+* modify CacheThru_new() to accept "https:" URLs for source-caching (report
+ by Chuck Martin) -TD
+* adapt some of the SH_EX ifdef'd features (TD):
+ + add -delay option, to make progress messages slow, along with corresponding
+ code for lynx.cfg
+ + show build date/time for systems that do not use a configure script.
+ + use LYK_CHG_CENTER keycode bound to ^Q to control whether table cells are
+ centered. The command-line -center option also controls this behavior.
+* add BIN_SUFFIX, TEXT_SUFFIX to userdefs.h -TD
+* modify BeginInternalPage(), adding a doctype to generated internal pages
+ to allow validating them -TD
+* modify HTFWriter.c to use binary suffix for any file with an application
+ presentation type, to better distinguish it from text and html. Use text
+ suffix for any "text/" file other than "text/html". These changes cover the
+ most common cases needed to make a link to view the temporary file useful in
+ the download page -TD
+* modify LYdownload_options(), adding a link to view the temporary file if the
+ downloaded file is text or html -TD
+* modify LYwouldPush(), omitting the download page from list of user-interface
+ pages which should not be pushed onto the history stack when visiting another
+ page, such as info or help. Otherwise the downloaded file is discarded
+ (report by BL) -TD
+* simplify set_vi_keys() and related functions using table-driven
+ set_any_keys() and reset_any_keys() -TD
+* HTAnchor_findAddress now returns HTParentAnchor, avoid casting -LP
+* change select timeout in HTCheckForInterrupt() to zero, allowing immediate
+ return rather than waiting (DJGPP otherwise blocks for 50msec). For Unix
+ platforms, the DontCheck() function limits the amount of polling which
+ otherwise would be too much CPU usage -LP
+* modify configure check for gcc -Winline warning to work around defect in
+ gcc 3.3 -TD
+* fix bug introduced recently in forms-submitting for TEXTAREA; the "%0d%0a"
+ was put after each line rather than before, making the first and second lines
+ joined (report by LV) -TD
+* reset the leading/trailing space counts in error-recovery logic added in
+ 2.8.5dev.15 for S_litteral case in SGML_character(). Otherwise a mismatch,
+ e.g., due to a stray "<" or ">" in <script>...</script>, prevented a match
+ on the </script> -TD
+* do not free adult_table[] atexit - it should be perfectly empty after
+ free'ing all HText's. (There is an error if it is not empty at exit) -LP
+* unnamed child anchors (`children_notag' list) now use HText memory pool.
+ Links properly deleted when reparsing the document -LP
+* Use less memory for documents with many anchors: most anchors are never
+ visited, just stored for the reference. So fill in adult_table[] with
+ HTParentAnchor0 (36 bytes size) instead of full HTParentAnchor (~200 bytes).
+ HTParentAnchor now allocated on demand, nearly 1:1 to HText. [more comments
+ in HTAnchor.h, changes located in HTAnchor.c] -LP
+* HTParentAnchor0 stores its hash value, to avoid calling HASH_FUNCTION twice
+ on the same anchor (Re: HTAnchor_delete()) -LP
+* fix a potential out-of-bounds bug in HTBEquivalent() -LP
+* change strrchr() calls to strchr() in a few src/*.c file when parsing
+ "#fragment" left-to-right -LP
+* modify HTFWriter_abort() to remove file on error -IZ
+* added hot.paste style which puts a right-arrow at the UR corner (which is
+ currently unused). Clicking on it initiates a GOTO to the current selection
+ (same as PASTE_URL action). The hot.paste style is disabled unless STYLES
+ and CUT_AND_PASTE are both enabled. Disabled and the user defines hot.paste
+ in the ".lss" file -IZ
+* modify LYK_PASTE_URL case in LYMainLoop.c to allow pasting URLs of the form
+ <address> and "<URL:address>" to lynx. This is useful when it is not easy to
+ choose address without the surrounding "<>" or "<URL:>" -IZ
+* make a minor memory saving (circa 15%) for table processing, improve yet
+ another case of "ladder" (as in the top of google results), and fixes one
+ case of "wrong indentation" (elements of a table which contained <center>
+ were made too wide) -IZ
+* modify Stbl_trimFakeRows() to compensate for 2.8.5dev.15 changes to
+ Stbl_addRowToTable() from 2.8.5dev.15 which caches shrinking cell arrays in a
+ pool. It did not take into account reallocation of the same data, e.g., in
+ Stbl_reserveCellsInRow(). For example:
+ http://camden-sbc.rutgers.edu/FacultyStaff/Directory/default.htm
+ (report by Patrick Ash) -IZ
+* add FORCE_COOKIE_PROMPT setting to lynx.cfg, allowing for manipulation in the
+ options menu and (if LYNXRC_ENABLE is set) via the .lynxrc file. This lets
+ the user decide whether to ignore prompting for cookies with invalid syntax.
+ If the prompts are ignored, a corresponding message is displayed -TD
+* add FORCE_SSL_PROMPT setting to lynx.cfg, allowing for manipulation in the
+ options menu and (if LYNXRC_ENABLE is set) via the .lynxrc file. This lets
+ the user decide whether to ignore prompting for questionable aspects of
+ an SSL connection. If the prompts are ignored, a corresponding message is
+ displayed -TD
+* change select() calls to use the expected 1+descriptor value documented for
+ that function rather than FD_SETSIZE. It is possible that some very old
+ or unique platform would not work, but this is more efficient (discussion on
+ lynx-dev) -TD
+* modify logic for S_litteral case in SGML_character() to recover from spaces
+ between the '<', '>' and the corresponding end of the tag, e.g.,
+ <style >
+ < style >
+ < style >
+ match "<style>", and
+ </style >
+ < /style >
+ < /style >
+ match "</style>" (report by TH) -TD
+* correct a check in HText_trimHightext() for the last line of the display,
+ which left unhighlighted the portion of a multi-line anchor which fell in
+ that place (report by TH) -TD
+* correct an off-by-one in redraw_lines_of_link() which left the link on the
+ last line on a page highlighted when moving the cursor up (reported by Morten
+ Bo Johansen) -TD
+
+2003-04-27 (2.8.5dev.15)
+* change definition of docdir1, helpdir1 to avoid using ksh-semantics (see
+ 2.8.5dev.2) -TD
+* update ja.po, uk.po, zh_TW.po from
+ http://www.iro.umontreal.ca/contrib/po/maint/lynx/
+* improve layout of TRSTable.c, reducing "laddering" effect, where cells in
+ different columns do not overlap by lines -IZ
+* modify SGML_new() to allow display charset-switching when reloading a
+ document -IZ
+* fix a buffer-size in LYK_PASTE_URL case in LYMainLoop.c -IZ
+* various improvements to load-time for TRSTable.c -IZ
+ As a test:
+ <URL:ilyaz.org/software/tmp/table_2col_bold_it_500000.html.gz>.
+ This is a simple table with 2 columns, one with bold contents, another with
+ italic one. The total number of rows is 500K. With the patch and an
+ acceptable malloc(), lynx should use the working set of about 110M to show
+ the table. On my system with 128M memory, this leads to only 4M of the
+ process space swapped.
+* add case LYK_TO_CLIPBOARD to HTCheckForInterrupt (not a good place), to allow
+ COPY command to work during download (copying the location to clipboard).
+ The best thing would be to get the location *after* redirects, but this will
+ require some additional work -IZ
+* add popen-based support for cut/paste. This is a slightly reworked patch to
+ GNU readline. If RL_PASTE_CMD and RL_CLCOPY_CMD are defined in the
+ environment, lynx will use them as commands to do cut&paste. The simplest
+ such commands could just store/retrieve things from
+ /tmp/.clipboard_user-name; more advanced ones could use X clipboard -IZ
+* modify yawerty_kb.h to map U+0411 and U+0431 to 'B' and 'W' positions
+ respectively. The map contained U+0412 and U+0432 at those positions,
+ which are duplicated at other positions -IZ
+* fix HTLoadFinger() which was miscasting const data -TD
+* update Subir Grewal's Lynx links URL to the newest location
+ http://www.subir.com/lynx.html -TD
+* add configure option --with-gnutls, to allow lynx to be built with gnutls.
+ Used gnutls 0.8.6 on Redhat 8.0 to login at yahoo (gnutls is not very
+ portable, so this is an experimental option) -TD
+* modify loop in HTInitProgramPaths() to convert enum ProgramPaths to an
+ integer, to accommodate HPUX 11.22 compiler (report by JES) -TD
+* amend change in dev.13 to HTParse() to escape spaces, to exclude lynx's
+ internal URL types such as lynxprog (report by P.J.Walsh) -TD
+* modified ifdef's to enable -connect_timeout option for DJGPP -GV
+ In particular, in LYUtils.c, undef "select" in case Lynx is compiled with
+ curses (and not S-Lang). Watt-32's select_s cannot be used on a
+ stdin handle, so one must undef it and use DJGPP's select().
+* modify ifdef in HTCheckForInterrupt() to work with MingW and PDcurses -GV
+* add version information for the macros in aclocal.m4 (request by Lars
+ Hecking) -TD
+* modify file-upload to use actual binary-data rather than base64-format -TD
+* generate unique boundary for multipart data in HText_SubmitForm() -TD
+* reorganize HText_SubmitForm(), maintaining post data using bstring's -TD
+* modify HText_SubmitForm() to add field name for the fake coordinate pair
+ when formatting a multipart submit (report by Peter Pilsl
+ <pilsl_@goldfisch.at>) -TD
+* change post_data to a bstring; implement functions and macros for
+ manipulating bstring data. This allows post_data to maintain embedded nulls,
+ e.g., for file-upload -TD
+* fix ifdef's for <ncursesw/term.h> -TD
+* fixes for file upload -IZ
+ + modify logic for headers use write them even if MultipartContentType was
+ not set.
+ + change logic for base64 to be used ONLY if \0 was found.
+ If a "strange" char is found, only change "text/plain" to
+ "application/octet-stream".
+* change a couple of _user_message() calls to HTUserMsg2() calls so their
+ content is saved in the "Messages" buffer -IZ, TD
+* undo 2002-11-11 SGMLFindTag optimization (problem with color styles,
+ reported by IZ). Optimize the function by storing the previously found tags.
+ Also use my_casecomp() to decrease AS_casecomp() calls by testing the
+ first character manually -LP
+* optimize HTStyle comparison: just compare numbers from enum.
+ It was previously implemented as a strcmp comparison with a fixed string.
+ Used in a very inner loop, in HTML_put_character() -LP
+* LYEnsureAbsoluteURL() now absorbs LYFillLocalFileURL() call -LP
+* optimize LYLegitimizeHREF() -LP
+* in HTML.c, revise href resolving logic. HTAnchor_findChildAndLink now
+ resolves href with respect to BASE internally; HTParse incorporates
+ LYFillLocalFileURL call (after the parsing, and only when the related string
+ is not empty and parse includes access, host, path and punctuation). This
+ removes all LYFillLocalFileURL and most HTParse calls from HTML.c and makes
+ code more consistent. (Previously, functions were called in a different order
+ for document with/without BASE, which had the side effect in some cases,
+ e.g., href="c:" on a DOS machine was resolved properly with _any_ base, and
+ badly broken without:) -LP
+* add/use HTParseALL macro to simplify coding -LP
+* revise "internal links" logic (read KW 1997-11-03 notes, before v2.8).
+ In HTML.c and HTAnchor.c, internal links code affects only parent lookup
+ in the adults table (more correct in case of post data), now a mainline:
+ we omit "#ifndef DONT_TRACK_INTERNAL_LINKS" condition in the two files.
+ In HTML.c, avoid using internal links for unrelated `src=' attributes
+ (BGSOUND_SRC, FRAME_SRC, IFRAME_SRC, OVERLAY_SRC, EMBED_SRC links:) -LP
+* refine HTAnchor_delete() vs deleteLinks() mutual recursion logic - LP
+* change ALIGN_SIZE in GridText.c to sizeof(double), which is probably more
+ portable than "8" -LP
+* modify a syslog() call to guard against possible '%' in its parameter -TD
+* remove extra quotes from calling HTMake822Word() for form boundary names
+ (addresses bug report for fastmail.fm by P.J.Walsh) -TD
+
+2003-02-04 (2.8.5dev.14)
+* correct a missing ">" at the beginning of page sent as response to mailto -TD
+* simplify (clarify) anchor structure: links now moved from HTAnchor to
+ HTChildAnchor (the only place they were used). By this we avoid unneeded
+ casting in calls to HTAnchor_followMainLink, HTAnchor_followTypedLink,
+ deleteLinks. [GridText.c, HTML.c, LYList.c, HTAnchor.c] -LP
+* as of 1998-11-21 "workaround for multiple anchors in the same (invalid) HTML
+ document with the same NAME and different destinations (HTAnchor.c) - KW",
+ along with skipping HTAnchor_link() call in this case now, we realize that
+ HTChildAnchor may have only a single link. (Previously implemented by
+ mainLink and links list). This simplifies HTAnchor.c -LP
+* simplify HTChunk.c -LP
+* optimize LYRemoveNewlines() and LYRemoveBlanks() -LP
+* check for no common name (CN) in certificate when connecting via SSL, fixes
+ a SIGSEGV with
+ https://web-shokai.tokyo-denwa.net/
+ (patch by Hataguchi Takeshi)
+* add uk.po (Ukrainian) from
+ http://www.iro.umontreal.ca/contrib/po/maint/lynx/
+* modify HTList_linkObject to avoid an infinite loop in HTList_unlinkObject due
+ to relinking some node several times, corrupting the previous list chain -LP
+* increase ATEXITSIZE to 50, 40 was not enough -TD
+* ifdef-out call to Cygwin_Shell() in LYMainLoop.c, which does not work
+ properly for some environments (report by Corinna Vinschen
+ <vinschen@redhat.com>, forwarded by Frederic L W Meunier) -TD
+* correct a bug in HTAnchor_findChildAndLink() introduced in dev.13 handling
+ USEMAP, e.g.,
+ http://www.sendas-delivery.com.br/topo_sendas.asp
+ (reported by Frederic L W Meunier) -LP
+* minor fixes for K&R compiler on SunOS: prototype of HTDOS_slashes(),
+ definition of LYLeakSequence -TD
+
+2003-01-22 (2.8.5dev.13)
+* change new memory-allocation in HTString.c and GridText.c to provide pointers
+ to data aligned to the host's pointer-size, to work on Tru64 where this
+ happens to be 8 -TD
+* resync ".po" files using msgmerge -TD
+* remove quadratic complexity from insert_blanks_in_line() usage with large
+ tables (Stbl). It occasionally cleans up split_line() a bit. CPU load
+ anomaly reported by BL -LP
+* ALLOC_IN_POOL, POOL_NEW, POOL_FREE macros now became functions, suggested by
+ BL -LP
+* define HAVE_ALLOCA for djgpp fixed-configuration -LP
+* add command-line option (--nested-tables) to help in testing this feature -TD
+* add command-line option (--find-leaks) to disable the memory leak checking
+ code, allowing one to build an executable which is useful for both normal
+ and leak-checking (request by Frederic L W Meunier) -TD
+* improve performance of HTParse() for very long strings -LP
+* fix memory leak in HTFileSaveStream() -LP
+* further optimization in HTAnchor.c - save 3 mallocs per HTChildAnchor by
+ using new HTList_ functions: HTList_linkObject(), HTList_unlinkObject(),
+ HTList_unlinkLastObject() which utilize external memory, no malloc/free -LP
+* modify "make install-help" rule to avoid warning message about keystrokes
+ subdirectory (report by Martin Mokrejs) -TD
+* optimize !HText_TrueLineSize() expressions as HText_TrueEmptyLine() -LP
+* optimize is_url(), rewriting it as case-statements to avoid unnecessary
+ comparisons, make similar optimization in HTParse() -LP, TD
+* corrected logic in is_url() where the "://" was not necessarily checked in
+ the proper position - TD
+* for color-style configuration, add a link to lynx.lss from LYNXCFG: -TD
+* simplify setup of internal pages with new function InternalPageFP() -TD
+* modify parsing of refresh-URL to strip single quotes, to handle
+ http://tovar.yandex.ru/
+ (reported by LP) -TD
+* investigated conflict between NSL_FORK and _WINDOWS_NSL ifdef's for Cygwin
+ configuration in HTTCP.c; left them as-is since #undef'ing _WINDOWS_NSL in
+ that case causes problems connecting (feedback by Frederic L W Meunier) -TD
+* corrected an off-by-one error in computing the location of the bottom line
+ for mouse input in PDCurses configuration which made that area ignore mouse
+ clicks. Merged almost-identical cases for mouse-input for NT/Windows95 -TD
+* ifdef'd out (USE_CURSES_PAIR_0) the ASSUMED_COLORS logic for the PDCurses
+ configuration (reports by DK) -TD
+* LYSetHiText(), LYAddHiText(), and LYClearHiText() use HText memory pool -TD
+* add atexit-cleanup for history stack, removed incomplete code for this from
+ cleanup(), since that gave misleading results in leak-checking. Fix a few
+ small leaks as well (reported by LP) -TD
+* modify cleanup() to leave the trace file open if checking for leaks -TD
+* add some simple statistics to summary in Lynx.leaks report -TD
+* add malloc-sequence number to Lynx.leaks report, to help with debugging -TD
+* fix memory leaks in nested-tables logic, which did not free subtable data
+ if there was an enclosing table (reports by Frederic L W Meunier) -TD
+* adapted change by LP to allocate HTLine's from memory pool -TD
+* move fallback definition of MAXHOSTNAMELEN from HTFTP.c to www_tcp.h so it
+ can be used in HTTCP.c (Debian #140682) -TD
+* improved configure script checks for ncurses -TD
+* correct description of XLOADIMAGE_COMMAND in lynx.cfg (report by Mats
+ Peterson <mats@alicja.dyns.cx>) -TD
+* fix configure script so it does not compute basename of system mailer when
+ none was found. Add check in LYMail.c, LYPrint.c to avoid using system
+ mailer when it is not configured (report by Frederic L W Meunier) -TD
+* update several po files (da.po, de.po, et.po, hu.po, sv.po, tr.po) from
+ http://www.iro.umontreal.ca/contrib/po/maint/lynx/
+* correct logic in recent HTAnchor_findChildAndLink() changes around internal
+ links and fragments; avoid unneeded reallocations by using HTParseAnchor()
+ instead of HTParse() -LP
+* trim some fat from HTML_start_element(), case HTML_A -LP
+* add optimized string functions StrAllocCopy_extra() [and paired FREE_extra()]
+ which store string size and never shrink; for heavily reallocated strings in
+ temp objects. Used in SGML.c for value[] fields currently -LP
+* in HTUtils.h, FREE macro was unsafe if happen before 'else' -LP
+* modify HTParse() to escape any spaces which remain from LYLegitimizeHREF() or
+ other sources (report by Peter Rasmussen <plr@udgaard.com>) -TD
+
+2002-12-18 (2.8.5dev.12)
+* remove a check in LYMain.c for Cygwin's console, which does not work with
+ screen (report by Frederic L W Meunier) -TD
+* undo line/pool logic, fixing a memory leak -LP
+* changes proposed by Bela Lubkin, to optimize ALLOC_IN_POOL macro
+ substitution, pack bitfields in HTStyleChanges to make them more compact on
+ some systems -LP
+* correct logic of do_check_recall(), broken in dev.9 cleanup of pathname
+ constants with LYIsDosDrive() (report by Frederic L W Meunier) -TD
+* update makelynx.bat, built with slang configuration -TD
+* turn on file-upload in makefile.msc -TD
+
+2002-12-01 (2.8.5dev.11)
+* fix a typo in changelog date -TD
+* add project version & date to lynx.cfg -TD
+* document xxx_PATH variables in lynx.cfg -TD
+
+2002-11-11 (2.8.5dev.10)
+* modify file-upload to provide content-type based on file-suffix. This is
+ needed to validate local html files with current the W3C validation service
+ webpage -TD
+* modify file-upload to warn but permit the filename or file contents to be
+ missing (report by Clemens Fisher) -TD
+* workaround for compiler bug in fix_httplike_urls() -BL
+* change enumShowColor so SHOW_COLOR_NEVER is zero as in 2.8.3, which makes the
+ result from LYChoosePopup() match the enum values. This fixes a bug which
+ would make the slang configuration toggle back to color when accepting an
+ options screen (report by Sean McGuire <smcguire@soc.lib.md.us> and Carlton
+ Anderson) -TD
+* add a null-pointer check in content_is_compressed() -TD
+* in partial mode, load document with #fragment on the fly. Long awaited fix.
+ LYMainLoop_pageDisplay() now returns BOOL -LP
+* calculate WWW_SOURCE once, it is now a constant, not a define -LP
+* use malloc instead of calloc in several places, particularly in HTList
+ operations (each field initialized explicitly) -LP
+* fix a few typos in samples/mailcap (Carlton Anderson
+ <canderson1776@yahoo.com>).
+* ifdef'd default_fg and default_bg for PDCURSES to be 15, since that agrees
+ with lynx's use of color names, and works around a bug exposed by the
+ ASSUMED_COLORS change from 2.8.5dev.9 (report by DK) -TD
+* simplify pretty-source code in SGML.c using PUTS(), put_pretty_entity() and
+ put_pretty_number() -TD
+* refine S_attr test in SGML.c to make pretty-source code handle the case where
+ a blank precedes the '='. The misplaced markers made lynx omit newlines from
+ the pretty-source view (report by LP) -TD
+* rewrote HTStat() to ensure that it does stat() for files on Windows -TD
+* HTTCP.c patch to make DJGPP/Watt-32 non-blocking connect in HTDoConnect().
+ This allows pressing 'z' to abort connections. Removed extra _HTProgress()
+ for INET6; it overwrote previous progress message -GV, DK
+* in SGML.c, element stack now use a pool of 10 elements to avoid most of
+ malloc/free calls -LP
+* in HTParse(), use single alloca instead of three malloc/free pairs -LP
+* in HTParse.c, avoid most strcasecomp calls in scan() - LP
+* modify GridText.c to store lines, anchors, and forms in the same HText memory
+ pool as styles. This will optimize memory allocation/deallocation by 8Kb
+ units. The down side: lines in TRST mode will be stored twice. Some
+ structs are made a bit more compact -LP
+* add DJGPP to SINGLE_USER_UNIX special cases -DK
+* modify configure script to not strip the -g option from $CFLAGS if it was
+ present in the user's environment rather than autoconf adding it (report by
+ DK) -TD
+* add --with-curses-dir configure script option -TD
+* in SGMLFindTag, we translate string uppercase in-place and launch case
+ insensitive search, add SGMLFindUprTag() to cover the cases where the string
+ is readonly - LP, TD
+* DJGPP build restored. MV_PATH was undefined long ago by mistake. Fix recent
+ DJGPP changes in HTTCP.c: move _resolve_hook few lines below, it will not
+ compile otherwise. Remove minor warnings -LP
+* optimize parsing html with many relative links, href="#fragment" -
+ HTAnchor_findChildAndLink() and HTML_start_element(), case HTML_A: now avoid
+ significant overhead when link == HTInternalLink (e.g., resolving against
+ base, lots of reallocations, parent lookup, etc., all are useless). Two
+ functions affected. [HTAnchor.c, HTML.c]. The code works both with and
+ without DONT_TRACK_INTERNAL_LINKS symbol -LP
+* optimize parsing of large html files - with thousands of anchors - LP
+ + remove quadratic complexity from split_line() usage [GridText.c].
+ Because of some work with anchors on the last(=split) line,
+ the anchors list was traversed from the beginning for each output line.
+ Now we store last_anchor_before_split explicitly.
+ [According to gprof, split_line() weight decreased from 33% down to 4%,
+ with the following test file: 13,000 output lines, 3,100 anchors, ~800Kb]
+ + remove quadratic complexity from HTAnchor_findChild() usage [HTAnchor.c].
+ HTParentAnchor::children list was traversed zillion times, now we
+ split it into a tree (named anchors <a name=...>, fast search required)
+ and a list (just a storage for the rest anchors, no search required).
+ [The same file, gprof shows HTAnchor_findChild() weight decreased
+ from 11% down to 0.1%]
+ + remove quadratic complexity when generating a 'l'ist page,
+ now traverse anchors list only once [LYList.c, GridText.c].
+* add a search method to HTBTree implementation - LP
+* amend check for refresh-URL to avoid adding a link if the retrieved page is
+ compressed, since the link would be added to the compressed file, corrupting
+ it (reported by Michel SUCH and Karl-Heinz Weirich <weirich@de.ibm.com>) -TD
+* strip parameters from refresh-URL -TD
+* correct misspelled $LYNX_LOCALEDIR variable in LYMain.c (reported by Michel
+ Such) -TD
+* change the install procedure for lynx.cfg to attempt to update the file with
+ the user's customizations if any, and to save the old configuration
+ information in a series, e.g., lynx.cfg-1, lynx.cfg-2, etc. -TD
+* re-fix the problem with config.cache not being removed at the beginning of
+ the configure script - see 2.8.5dev.3 (report by Clemens Fisher) -TD
+
+2002-10-06 (2.8.5dev.9)
+* improve ETA data shown in experimental read-progress (adapted from Debian
+ #117476) -TD
+* modify -dump, -source and related options which set dump mode to also set
+ -nopause (report by Benjamin Pflugmann <benjamin-mutt@pflugmann.de>) -TD
+* correct indexing in LYStyle.c our_pairs[] array, which did not allow for use
+ of default colors -TD
+* make ASSUMED_COLORS in lynx.cfg apply to normal curses implementations which
+ do not implement assume_default_colors() (prompted by discussion with
+ Bela Lubkin) -TD
+* make permanent an ifdef from SH which provides for truncating a too-long
+ title with an ellipsis -HN
+* gettext'ify a few overlooked strings in LYOptions.c -HN
+* modify LYGetHostByName() for MSDOS/DJGPP/Watt-32 to enable terminating it by
+ pressing 'z' (patch by Gisle Vanem)
+* update configure script macros for NLS to gettext 0.10.40 -TD
+* add PRCS version/date to lynx.cfg -TD
+* setup ifdef's for Unix-specific permissions checks to exclude single-user
+ systems such as OS/2 EMX, Cygwin and BeOS, which otherwise act like Unix
+ since we can run the configure script on those platforms -TD
+* re-order some tests in the configure script to allow pdcurses' X11 port to
+ be recognized as supporting color and line-drawing characters -TD
+* work around a Cygwin bug which causes subprocesses of a full-screen program
+ to dump core (perhaps reported by Frederic L W Meunier, but observed in
+ running lynx in a bash shell spawned from my directory editor) -TD
+* fix an inequality in HTDirTitles() which made the "Up to" link omitted for
+ the first level of an ftp listing, making it awkward to visit the parent
+ directory if one first visited a subdirectory -TD
+* change HTURLPath_toFile() to keep local URLs distinct from remote ones, so
+ win32 version will not display misleading drive letter on ftp listings -TD
+* rewrote Home_Dir(), adding checks for "My Documents" on Windows 2000, and
+ ensuring that the resulting directory actually exists -TD
+* change ifdef's in LYwaddnstr() to use waddstr() consistently, since
+ wide-character curses implementation treat the string in the given locale
+ anyway, just like the waddnwstr() call -TD
+* reduce clutter with new macro LYIsDosDrive() -TD
+* add ifdef's for OS/2 EMX to existing DOSPATH code which checks for drive
+ letter (Michel Such)
+* modify definitions of IsOurFile() and OpenHiddenFile() to allow trace file
+ to be written when one already exists -TD
+* use new macros LYSameFilename(), LYSameHostname(), LYIsNullDevice() to hide
+ platform-specific filename comparisons -TD
+* change sed delimiter in configure script to use '%' consistently, to avoid
+ using '@', which may appear in AFS pathnames (report by Martin Mokrejs) -TD
+* narrowed accommodation for paths with embedded blanks in LYLegitimizeHREF()
+ to exclude those containing newlines or tabs (report by Leslie Fairall for
+ http://www.realtor.com) -TD
+* modified VMS build scripts to allow linking with OpenSSL, tested with
+ OpenSSL-0.9.6g using UCX network libraries. It is reported (by
+ <grant@rigel.cc.wmich.edu>) that one can modify the scripts to also build
+ with Multinet's UCX emulation, but the machine I used for testing has only
+ UCX (comp.os.vms discussion with Christoph Gartmann
+ <gartmann@immunbio.mpg.de>) -TD
+* modify UCSetBoxChars() to assume wide-character curses implementations can
+ draw boxes -TD
+* reduce the number of strncasecomp() calls with associated constants by making
+ macros for the lynx internal URL types, e.g., isLYNXCGI() -TD
+* modify logic that handles goto-fragment (e.g., G #foo) to update the URL
+ shown in the info page (Debian #113734) -TD
+* reduce clutter using new macros findPoundSelector(),
+ restorePoundSelector() and function trimPoundSelector() -TD
+* reduce clutter using functions for updating the strings in DocInfo, mainly in
+ LYMainLoop.c -TD
+* renamed 'document' to 'DocInfo' -TD
+* reduce clutter by using NonNull() macro consistently -TD
+* define HistInfo struct in terms of document, to make it clearer -TD
+* add verification of SSL server certificates. It requires a "cert.pem" file
+ or cert files in the "certs" subdirectory in your OpenSSL directory for CA
+ verification. The mod_ssl distribution includes a "ca-bundle.crt" that has a
+ good set of root certifying authority certs and works well for "cert.pem".
+ Adding custom CA root certs can be done by either putting them in the server
+ "cert.pem", or (for a normal user) copying "cert.pem", adding the cert, and
+ setting the SSL_CERT_FILE environment variable before running Lynx (Chris
+ Adams <cmadams@hiwaay.net>).
+* add REPLAYSECS config value to allow slowing command scripts down, for
+ testing -TD
+* implement a "set" command for command-scripts, allowing the script writer
+ to manipulate the sleep-times for messages (prompted by discussion with
+ Ville Herva) -TD
+* implement an "exit" command for command-scripts (Ville Herva)
+* modify logic for -cmd_script to stop reading from the command script when
+ an end-of-file is detected (patch by Ville Herva <vherva@niksula.hut.fi>).
+* fill in a few descriptions of restrictions for the help message, as well
+ as showing the on/off state of the "goto_xxx" restrictions -TD
+* correct inverted logic of restrictions table which made "-restrict=default"
+ provide incorrect values for several items. This was broken in 2.8.4dev.19
+ (reported by Jeff Long <long@ukans.edu> and RobertM <robm@bob.bofh.org>) -TD
+* add environment variable LYNX_TRACE_FILE which, if given, overrides the
+ compiled-in value of Lynx.trace (or LY-TRACE.LOG). This specifies the
+ name of the trace file relative to the home directory -TD
+* treat empty string for most environment variables, e.g., those specifying
+ a pathname, as null -TD
+* add environment variable LYNX_LOCALEDIR to simplify configuration on OS/2
+ EMX (from discussion with Michel Such) -TD
+* add alias for charsets "ISO-8859-8-I" and "ISO-8859-8-E" to "iso-8859-8"
+ (Debian #152441, request by Atsuhito Kohda) -TD
+* modify handling of HTML_SUP to always append '^'. It was checking if the
+ preceding character was a valid hexadecimal code (reported by HN and Steve
+ White <swhite@zipcon.net>) -TD
+* correct check for calling endwin() to allow for curses implementations
+ without newterm (report/patch by Brett Lymn).
+* add koi8-r.html as a test for non-ANSI 8-bit displays -TD
+* construct "Accept-Encoding" gzip/compress parameters based on whether lynx is
+ built with zlib and/or gzip/compress paths are defined. The latter is
+ assumed on Unix (by the configure script), though non-Unix environments may
+ lack those utilities (report by Roy Langford <rlnopicnodl@geeklife.com>,
+ analysis by Frederic L W Meunier) -TD
+* modify mouse support in slang configuration (Eduardo Chappa):
+ + Middle button takes you to the bookmarks file.
+ + Clicking on empty parts of the screen makes the screen scroll. This is
+ not 100% true, here are the caveats related to this:
+ + When you click in the first line of the screen pine goes back one screen,
+ the same happens when you click in the last line (this is normal Lynx
+ behavior, I did nothing in this respect). With this patch, intermediate
+ scrolling is enabled, which means that left clicking in different (empty
+ parts) of the screen may move you half a screen or two lines. The idea
+ is that close to the top you scroll more, close to the center you scroll
+ less and you scroll in the direction up or down according to which half
+ of the screen you click on.
+ + If you click on an empty part of the screen, Lynx changed its behavior
+ from doing nothing to moving the active link to the closest link near the
+ click. This is not disabled by this patch, instead, if a closest link is
+ not found, the screen will scroll, according to the position of the link.
+* improve check in LYgetEnum() for ambiguous/abbreviated names in the lynx.cfg
+ file, e.g., to match the string "visited_links=first" without confusing it
+ with "visited_links=first_reversed" (report by vortex5 <vortex5@24i.net>,
+ analysis by TH) -TD
+* use StrAllocCopy() rather than strdup() in parse_style() (LYStyle.c) to
+ avoid false report from leak-checking (from report by Martin Mokrejs) -TD
+* share SSL handle between HTTP.c and HTAAUtil.c so that call of
+ HTAA_shouldRetryWithAuth() from HTLoadHTTP() updates the handle used in that
+ function. This makes lynx able to get the user/password prompt for
+ https://enter.nifty.com/iw/ -TH
+* fix a highlighting problem in view-source mode, which left the final
+ character of the target unhighlighted -TH
+* modify LYStringToKeycode(), which is used by -cmd_script option to decode
+ characters, to handle hexadecimal codes written with -cmd_log option from
+ dev.8 changes (reported by Gleb V Kotelnitskyy <kiz@pth.ntu-kpi.kiev.ua>) -TD
+* modify ifdef's in LYCurses.h to implement underline-links for slang
+ configuration (report by TH) -TD
+* modify checks with WEXITSTATUS() and similar "result" macros to ensure that
+ they consistently use corresponding "test" macros such as WIFEXITED() -TD
+* add a null-pointer check in GridText.c to cover a problem with
+ http://209.1.58.86/store/
+ (reported by Walter Ian Kaye) -TD
+* add some more CTRACE's to LYCookie.c to help diagnose LV problem report -TD
+* updated nl.po (patch by Pieter-Paul Spiertz <pspiertz@sci.kun.nl>) -JES
+* new (cs.po, hu.po, tr.po) and updated (da.po, et.po, it.po, ru.po, sv.po) po
+ files from http://www.iro.umontreal.ca/contrib/po/maint/lynx/, used msgmerge
+ to align with 2.8.4's lynx.pot and corrected some minor issues highlighted by
+ check_po. Checking for a newer version of check_po (to handle patterns
+ such as "%1$s") found none, but noticed a comment in gettext mailing list
+ stating that msgfmt does checking. Comparing with "msgfmt -c -v", found
+ that it does useful checks, but misses about 1/4 of what check_po finds.
+ Will use both -TD
+* escape blanks and other non-7bit graphic characters in startfile and similar
+ addresses to guard against interpreting the address as multiple lines
+ during a GET, etc (report by Ulf Harnhammar <ulfh@Update.UU.SE>) -TD
+
+2002-05-28 (2.8.5dev.8)
+* updated makelynx.bat (Victor Schneider).
+* recognize charset value in meta description even if content-type is not
+ given, in LYHandleMETA() -VH
+* remove ifdef that disabled home/end keys with Cygwin configuration -DK
+* fix a problem when whereis target string, which includes Japanese and is top
+ of the second line in the link string, is in the current link (patch by
+ Hataguchi Takeshi).
+* fix a problem with highlighting Japanese string (patch by Hataguchi Takeshi).
+* modify LYDownload() to ensure that local addresses under DJGPP using the
+ special form of path beginning "/dev/" are passed to external programs
+ without stripping the initial slash from the path. This special form of path
+ will be understood only by other DJGPP programs. Addresses of the form
+ "/dev/x/" are equivalent to the DOS path "x:\". Addresses of the form
+ "/dev/env/VARI" are equivalent to the environment variable "VARI" -DK
+* modify remove_bookmark_link() to assume that OS/2 EMX does not allow rename
+ of a file overwriting an existing one -IZ
+* recognize local .php files as HTML files (patch by Karl Eichwalder
+ <ke@suse.de>).
+* change LYCurses.c to not redefine gettext(), and use ScreenClear() instead
+ of clrscr() for DJGPP -DK
+* the DJGPP port of Lynx once used to compile with DJ Delorie's tcp/ip library.
+ It is no longer the case; Watt-32 is required. Changed to assume WATT32 is
+ defined when DJGPP (or __DJGPP__) is defined (patch by Gisle Vanem).
+* change LYKeycodeToString() to provide a default translation for characters
+ which are not key-symbols, etc., so they may be used in command scripts
+ with the -cmd_script option (reported by Christoph Fabianek) -TD
+* new po files (ca.po, et.po, it.po, zh_TW.po) and updated de.po from
+ http://www.iro.umontreal.ca/contrib/po/maint/lynx/, used msgmerge to align
+ with 2.8.4's lynx.pot and corrected some minor issues highlighted by
+ check_po script by Stefan Hundhammer <sh@suse.de> -TD
+* some cleanup/restructuring of HText_SubmitForm(), incomplete - toward
+ implementing correct MIME boundary -TD
+* revalidate user's guide and related files using W3C validator via file-upload
+ facility -TD
+* simplify some loops in GridText.c using new function next_anchor() -TD
+* quote field-names used when submitting form-data as suggested in RFC 2068
+ (report by Lieven Tomme <lieven@itopia.com>) -TD
+* remove configure-check for mkstemp(), which is redundant given that lynx
+ writes temporary files in a directory which is not readable by other users.
+ On more than one system (e.g., Solaris), mkstemp() is not usable in the
+ manner we attempted, since it does not necessarily choose a distinct name if
+ the previously-chosen filename no longer exists (report/analysis by PG) -TD
+* correct a typo in configure macro CF_HEADER_PATH which told the script to
+ look for header files in the user's $HOME/lib rather than $HOME/include
+ directory -TD
+* update config.guess, config.sub -TD
+* add check for HTTP headers using Netscape extension "Refresh", and if found,
+ add a corresponding refresh-URL at the beginning of the document. Fixes
+ Debian #126723 -TD
+* strip username from URLs used in an HTTP GET, and warn about this condition.
+ The example given was
+ "http://www.microsoft.com&item%3dq209354@212.254.206.213/1338825GHU_98.asp"
+ the text of which could mislead a user into believe it was an official site
+ (reported by Frederic L W Meunier) -TD
+* add limit checks in HText_trimHightext() to fix an infinite loop visiting
+ this site (which contains a form with only hidden input fields):
+ 1- http://www.ibazar.com.br/
+ 2- Click "Cadastro" and accept all cookies
+ 3- Click "[accepte.gif]"
+ (reported by Frederic L W Meunier) -TD
+
+2002-01-06 (2.8.5dev.7)
+* ifdef'd new directory-sorting code to compile when configure --disable-dired
+ is specified -TD
+* add (commented-out) definitions for building with OpenSSL in makefile.msc,
+ tested with OpenSSL 0.9.6c and Visual C++ 5.0 -TD
+* correct call to HTGetLinkInfo() in follow_link_number() from 2.8.5dev.6
+ changes to fix uninitialized pointer (report by PW) -TD
+
+2002-01-01 (2.8.5dev.6)
+* add configure options to link with dbmalloc and dmalloc debugging libraries
+ which offer different features than --enable-find-leaks -TD
+* restructured LYhighlight() and logic related to highlighted text using new
+ functions LYSetHilite(), LYAddHilite(), LYGetHiliteStr() and LYGetHilitePos()
+ to allow more than two lines to be highlighted in links (Debian #114062) -TD
+* simplified some of LYCookie.c with new functions find_domain_entry(),
+ alloc_attr_value() and parse_attribute() -TD
+* modify expansion of %s for WIN_EX EXTERN commands so that short names (used
+ when the command begins with an uppercase character) are not quoted, and use
+ backslashes. The normal %s expansion uses forward slashes and may quote the
+ name if it contains a blank -TD
+* modify local directory sort by type to ignore leading '.' characters when
+ looking for filetype -TD
+* modify logic of HTDirEntry() to avoid storing a trailing backslash (DOS-style
+ path separator) in the anchor URL for local directory entries (from report
+ by Hataguchi Takeshi) -TD
+* amend change in 2.8.5dev.2 to HTLoadHTTP() to omit "Accept-Encoding: gzip"
+ ensuring that also -source or -dump option is used. Retesting excite.com
+ shows that it no longer matters, since the page was replaced by a short
+ javascript which is not sent compressed (request by Hataguchi Takeshi) -TD
+* correct a missing definition for COMPRESS_PROG in the configure script
+ introduced by 2.8.5dev.5 changes (also noted by Stepan Kasal) -TD
+* several fixes from Stepan Kasal <kasal@math.cas.cz>:
+ + remove code in LYCurses.c which checks ttytype variable for "dec-vt"
+ prefix. EWAN, a decent telnet program for M$ Windows, sets $TERM to
+ dec-vt100. This is similar to vt102 but it is not appropriate to use vt100
+ settings for it. ncurses has in its terminfo database an entry for
+ "dec-vt100|EWAN telnet's terminal"
+ The terminfo file is successfully opened when ncurses is initialised and
+ ttytype is set to the name mentioned above. After stripping "dec-" from
+ it, lynx ends up searching for
+ "/usr/share/terminfo/v/vt100|EWAN telnet's terminal"
+ which cannot cannot be found and lynx crashes.
+ + compress installed html files with the -9 option of gzip.
+ + improved install-help makefile rule
+* fix some longstanding problems with the DOS port -DK
+ + fix inability to break out of a hung nameserver lookup or hung connection
+ attempt without aborting lynx entirely. Using the WATT-32 signal handler
+ for this seems to work well. Change the default compile option for DJGPP
+ to -DIGNORE_CTRL_C, causing lynx to ignore SIGINT, so CTRL-BREAK is
+ completely disabled. With this patch CTRL-C stops current actions without
+ quitting lynx. To have a way to abort lynx when necessary, bind ALT-X to
+ SIGQUIT. (The unix default of CTRL-\ is not bound to the same scan code on
+ different international keyboards, while ALT-X is familiar to DOS users for
+ existing programs). Because the WATT-32 signal handler was not available
+ to external programs, a patch to WATT-32 is necessary for the new lynx code
+ to work. The patch for WATT-32 is shown in the INSTALLATION documentation.
+ + added some fixes for "/" vs "\" handling in pathnames so that non-DJGPP
+ programs will see standard DOS pathnames when called. The mailer code was
+ ignoring the environment variable SHELL when calling the mailer, leading to
+ a lack of environment space for the mailer to work -DK
+ + add calls to _eth_release() and _eth_init(), which Gisle Vanem says should
+ not be necessary in this part of lynx. But this seems to fix get
+ intermittent hung nameserver lookup sessions after using CTRL-C.
+* simplified a loop in HTConfirmCookie() and added CTRACE's to demonstrate that
+ this is working properly (addresses Debian #119751) -TD
+* add some CTRACE's to curses screen initialization and resizing to provide
+ better diagnosis of problem reported by David Balazic
+ <david.balazic@uni-mb.si> on HP-UX 11.00) -PG
+* modify configure.in and aclocal.m4 to work with autoconf 2.52 patched with
+ ftp://ftp.invisible-island.net/autoconf/autoconf-2.52-20011227.patch.gz
+ (TD).
+* modify configure macros CF_CURSES_CPPFLAGS and CF_NCURSES_CPPFLAGS to ensure
+ that the (n)curses.h header file is actually found, in case someone tries to
+ build lynx without having installed the development files (based on anonymous
+ posting on comp.os.linux.networking newsgroup) -TD
+* update config.guess, config.sub from
+ http://subversions.gnu.org/cgi-bin/viewcvs/config/config/
+
+2001-11-18 (2.8.5dev.5)
+* modify prompt for file- or directory-name in rename/move operation to provide
+ a default based on the selected file/directory -TD
+* add -DOK_OVERRIDE to makefile.msc, to allow rename/move of files in the local
+ directory editor -TD
+* correct delay time for win32's HTAlert, etc., which was in milliseconds
+ rather than seconds -TD
+* modify check for mbstate_t in CF_WIDEC_CURSES to define HAVE_MBSTATE_T if
+ that type is found, use this ifdef in LYwaddnstr() to make that compile
+ properly on Solaris 2.6 (report by PG) -TD
+* disable SUPPORT_MULTIBYTE_EDIT ifdef for EBCDIC (i.e., NOT_ASCII) -PG
+* collect names of lynx.cfg and .lynxrc variables into LYrcFile.h, to simplify
+ checks for matching spelling, e.g., against the values used in
+ LYOptions.c -TD
+* modify dired support to allow sorting by a variety of things in addition to
+ the existing sort into files versus directories. This is saved in ~/lynxrc
+ as dir_sort_order -TD
+* if --disable-full-paths is specified, do not use full path for SYSTEM_MAIL
+ (report by IZ) -TD
+* modify configure script to reduce the number of xxx_PATH definitions compiled
+ into the code if --disable-dired was specified. Change configure script so
+ that dired support for chmod, copy, mkdir, and touch to use built-in
+ functions rather than external programs -TD
+* modify configure script tests for program pathnames so that if full pathnames
+ are specified and the program is not found, no corresponding xxx_PATH symbol
+ is defined -TD
+* eliminate duplicate LYGetEnum() in LYrcFile.c, using the variant from
+ LYReadCFG.c which allows abbreviations -TD
+* change handling of tagsoup option in LYrcFile.c to invoke the corresponding
+ HTSwitchDTD() function, so saved tagsoup initializes properly from ~/.lynxrc
+ (report by Michel Such) -TD
+* modify some tag-names in LYOptions.c to correspond to the names used in
+ lynx.cfg to make the corresponding names work properly when used in ~/.lynxrc
+ via ENABLE_LYNXRC settings (report by Michel Such) -TD
+ old new
+ ----------------------------
+ assume_char_set -> assume_charset
+ show_scrollbar -> scrollbar
+ DTD_recovery -> tagsoup
+ show_rate -> show_kb_rate
+ user_agent -> useragent
+ ----------------------------
+* correct length passed by LYpaddstr() to LYwaddnstr(), which could be larger
+ than allowed -TD
+
+2001-11-08 (2.8.5dev.4)
+* if file-upload code is configured, suppress message that indicates it is not
+ implemented, i.e., "[FILE Input] (not implemented)" -TD
+* modify file-upload submission to send plain text if the file is entirely
+ printable text. Mime encoding is needed if the file contains nulls, etc.,
+ but reportedly may confuse some hosts -TD
+* suppress "charset=" clause on form submission if it is iso-8859-1 -TD
+* move case for F_FILE_TYPE in HText_SubmitForm() to obtain original behavior
+ of fallthrough for F_SUBMIT_TYPE, F_TEXT_SUBMIT_TYPE, F_IMAGE_SUBMIT_TYPE to
+ translate their character set, etc. (report by KW) -TD
+* revert 2.8.4dev.21 change to avoid truncating cookie path in LYSetCookie().
+ The server that wouldn't work with the current lynx behavior is
+ identified as "Oracle_Web_Listener/4.0.8.2.3EnterpriseEdition" -DK
+* modify LYLegitimizeHREF() change from 2.8.4dev.21 to eliminate newlines from
+ the HREF rather than converting them to spaces. This fixes a problem with
+ www.ebay.com which splits up HREFs with newlines. Changing the newlines to
+ spaces made the HREF no longer match, e.g., when it was built up from
+ a CGI script (report by Morten Bo Johansen) -TD
+* add two test files for testing UTF-8, based on Markus Kuhn's demos
+ (quickbrown.html and utf-8-demo.html). These work with ncurses 20011103
+ patch, for wide-characters except for combining characters (more work is
+ needed in ncurses). Tested with XFree86 xterm (patch #163) -TD
+* modify select_multi_bookmarks() check for interrupt character to limit it to
+ "hard" interrupt characters such as ^G. This fixes a case where "z" would
+ have been treated as an interrupt character in advanced multibookmark mode
+ (reports by Michael Warner, HN, as well as Debian #111463) -TD
+* modify SUPPORT_MULTIBYTE_EDIT logic in LYUpperCase() and LYLowerCase() to
+ check for a null character following an upper-128 code. This is more likely
+ to occur in EBCDIC, though the multibyte strings should not have a null at
+ this position in any case (report by PG) -TD
+* for wide-character curses configuration, do not force repainting at the end
+ of display_page() -TD
+* modify configure test for mkstemp() to check if that function returns
+ distinct values (report by Fr3dY indicates that AmigaOS has a broken version
+ of mkstemp() which always returns the same value) -TD
+* modify LYwaddstr() to use wide-character curses functions to make UTF-8
+ output work without relying upon side-effects of narrow-character functions.
+ Note that this relies on the user having set a UTF-8 locale, e.g.,
+ en_US.UTF-8 -TD
+* modify HText_appendCharacter() to not use utfxtra_on_this_line when compiling
+ with WIDEC_CURSES, since the curses library already does this adjustment -TD
+* correct the following names in LYrcFile.c which were added to allow
+ ENABLE_LYNXRC lines in lynx.cfg to enable them to be saved in ~/.lynxrc
+ old new where-used
+ -------------------------------------
+ DTD_recovery tagsoup (command-line option and lynx.cfg)
+ show_rate show_kb_rate (lynx.cfg)
+ user_agent useragent (command-line option)
+ -------------------------------------
+ (report by Michel Such <msuch@free.fr>) -TD
+* modify LYRefreshEdit() to clear field before repainting (patch by Hataguchi
+ Takeshi)
+* for CJK configuration, force clearing/repainting in HTUserMsg() (patch by
+ Hataguchi Takeshi)
+* make HTInfoMsg() sleep condition consistent with other messages by using
+ LYSleepInfo() -TD
+* reduce clutter with new function utf8_length() -TD
+* replace !isascii(ch) with new macro is8bits(ch), to reduce clutter, fix some
+ sign-extensions and make it more portable -TD
+* change some of the "#if" statements to "#ifdef", to work around broken
+ versions (2.96, 3.0.1) of gcc distributed with Mandrake 8.1 (though
+ reportedly this is due to Redhat): the -C option passes through comments as
+ usual, but some comments expand on preprocessor lines, which causes the
+ preprocessor to report an expression error. This prevented "make
+ install-help" from running, though the -C option is not needed for that.
+ However, lacking a working -C option makes the C preprocessor useless for
+ analyzing bugs -TD
+* modify configure script to accept --with-screen=ncursesw, to build with the
+ wide-character version of ncurses -TD
+* modify configure script to look for mkdtemp(), to quiet another bogus linker
+ message -TD
+
+2001-10-06 (2.8.5dev.3)
+* add CF_MKSTEMP configure macro, from vile, to check for a working mkstemp().
+ This will quiet some bogus warning messages in recent runtime support, but
+ (see 2.8.3) does not affect the security of temporary files in lynx -TD
+* updated CF_PATH_SYNTAX configure macro, from vile, to handle leading "\\" in
+ a win32 pathname -TD
+* for configurations that provide scrollbar, add a checkbox to the Options menu
+ to enable or disable it -TD
+* modify LYGetHostByName() in HTTCP.c to use the threaded _WINDOWS_NSL code for
+ all Cygwin machines. The ability to interrupt nameserver lookup has not
+ worked in Win98 using the Cygwin port, despite defining _WINDOWS_NSL. It
+ looks like the threaded code was only for WinNT. At least under Cygwin, that
+ code also seems to work fine under Win98 -DK
+* add FIELDS_ARE_NUMBERED as a possible value for DEFAULT_KEYPAD_MODE in
+ lynx.cfg as well as keypad_mode in .lynxrc -TD
+* add NUMBER_FIELDS_ON_LEFT and NUMBER_LINKS_ON_LEFT to lynx.cfg, use these to
+ control where field- and link-numbering is placed. Caveat: there are some
+ cases where fields that do popup's are truncated, e.g., in the Options menu,
+ when right-alignment is used -TD
+* support for DJGPP's two forms of file addressing, [a-zA-Z]:[/\\] and
+ /dev/[a-zA-z]/ -DK
+* add samples/lynxdump script, to illustrate how to use lynx -dump with no
+ link references (prompted by discussion with LV) -TD
+* add samples/keepviewer script, to illustrate how to retain a temporary file
+ for use in an external viewer -TD
+* add ifdef's in is_url() to avoid recognizing URLs if they are disabled in the
+ given configuration, i.e., bibp, finger, ftp, gopher, news (report by
+ Frederic L W Meunier) -TD
+* modify LYrefresh() to take into account whether a popup window exists, so
+ that a search prompt will not overwrite a popup. This bug was introduced by
+ the curses pads (reported by Felicia Neff <neff@panix.com> and Fr3dY
+ <fr3dy@retemail.es>) -TD
+* add note in keystroke_help.html about CTRL-V as literal-next (lnext) for
+ users who are unfamiliar with stty -TD
+* add NcFTP-style ftp-URLs which are supported by Netscape and wget (request
+ by Martin Mokrejs) -TD
+* add traces in LYReadCFG.c and LYrcFile.c to report lines which are not found
+ in the symbol table, to help diagnose when a user adds lynx.cfg information
+ to .lynxrc -TD
+* define additional -trace-mask option, 8=config -TD
+* modify LYtouchline() to avoid using wredrawln() for ncurses, since the
+ LYwin variable may be a pad much wider than the screen, which is not handled
+ properly (report by Karl Eichwalder <keichwa@gmx.net>) -TD
+* correct beginning of configure script, which was supposed to remove
+ config.cache, but did not, due to a misplaced line when it was added
+ 1998-06-04 (prompted by a report by Fr3dY <fr3dy@retemail.es> that the
+ checks for srand/rand did not work) -TD
+
+2001-08-15 (2.8.5dev.2)
+* several small fixes to HTFile.c to make directory listings work properly on
+ win32, e.g., stat'ing a directory with a trailing slash fails (reported by
+ Hataguchi Takeshi) -TD
+* adjust definitions in LYCurses.h to get rid of slang-ifdef's for getyx() and
+ wmove() -TD
+* change order of srandom/random versus srand48/lrand48 -DK
+* patch to get the DJGPP port to use the configure script -DK
+ It seems to work well in the variations I have tried, including both PDCurses
+ and SLang. revised INSTALLATION for DOS, giving a URL for my DOS patch to
+ openssl. I dropped the reference to goto URL of the form
+ file:///dev/c/path/filename, since this only works in certain parts of lynx
+ (such as lynx.cfg). I'll try to get this working in the future. In fixing
+ makefile.in, I patched the sed script for converting the path to docdir. As
+ far as I can tell, however, from my examination of lynx.cfg, this isn't used
+ for any platform. Does this part of the sed script do anything?
+ Things still needing fixing for DOS:
+ + support for both forms of file addressing, [a-zA-Z]:[/\\] and
+ /dev/[a-zA-z]/.
+ + support for gzipped help files. This works with long file names in a DOS
+ box under Windows, but not in plain DOS, which doesn't allow double
+ extensions.
+ + better handling of local files in root directory. "file:///c:/" takes a
+ long time to work, but "file:///c:/." works fine. I haven't really looked
+ to see why.
+ + no ability to break out of hung nameserver lookups or http requests without
+ closing lynx with SIGINT. This is the biggest complaint I get by email.
+* modify ifdef for myGetChar() in LYStrings.c to build with PDCurses 2.3 e.g.,
+ to use a version which is modified for Japanese input (patch by Hataguchi
+ Takeshi)
+* review LYSafeGets() calls, stripping newlines from a few places where they
+ were overlooked, and simplifying some places where LYSafeGets() would
+ normally return a buffer ended with a newline (prompted by a report by Brian
+ S Queen <bqueen@nas.nasa.gov> for LYTraversal.c) -TD
+* correct reallocation-size in ProcessMailcapEntry() -TD
+* modify HTLoadHTTP() to omit "Accept-Encoding: gzip" if command-line "-base"
+ option is given. This makes
+ lynx -base -source excite.com
+ work as expected. Otherwise, excite.com will transmit the document gzip'd,
+ and the ensuing logic in HTSaveToFile() would see the mime-type as gzip
+ rather than text/html, and not prepend the base URL (report by Kai Shih
+ <kai@mit.edu>) -TD
+* work around defect in move_anchors_in_region() and related logic by changing
+ default for nested-tables to FALSE when Lynx is not configured for
+ color-style. The problem is that when an anchor is shifted right by
+ nested-table logic, if it has a <BR> near the beginning of a table cell and
+ it happens to be split across a line, its size will not be adjusted properly
+ (report by Hataguchi Takeshi) -TD
+* correct logic used for trimming TEXTAREA introduced in 2.8.4pre.3, which did
+ not trim carriage-return characters if TRIM_INPUT_FIELDS was false.
+ (report by Hataguchi Takeshi) -TD
+* correct a bug in search logic which happens with pages shorter than the
+ screen, due to improper starting-line value sent to search function. Fixed
+ by adding checks in www_search_backward() and www_search_foreward(), (report
+ by -Frederic L W Meunier) -TD
+
+2001-07-24 (2.8.5dev.1)
+* modify GetChar() definition for PDCurses to ignore key-modifiers which are
+ passed back from getch() as if they were key codes. Those interfere with
+ shifted commands such as 'Q' -TD
+* modify parse_style() function to operate on a copy of its parameter, to avoid
+ changing it. Otherwise, when parse_style() is executed as a side effect of
+ start_curses(), its data is modified and not valid on successive calls.
+ This bug existed prior to 2.8.4dev.17 -TD
+* set return value of edit_current_file() to true if the file is edited. This
+ forces a reload for example if one edits the current html file, and is needed
+ to make PDCurses repaint the screen as well (report by Victor Schneider,
+ bug introduced in 2.8.4dev.21) -TD
+* add ifdef for wresize() to accommodate FreeBSD 3.x which has resizeterm() but
+ not wresize(). Also, use a 'long' rather than 'attr_t'. These changes are
+ needed to build with the 1.8.6ache patches to ncurses (report by Matt
+ <matt@greenviolet.net>) -TD
+
+2001-07-17 (2.8.4rel.1)
+* remove comment in README.ssl directing people to
+ http://www.moxienet.com/lynx/, since that page is moot with 2.8.4 -DK
+* add an ifdef in CF_CURSES_FUNCS configure macro to avoid confusing ncurses'
+ term.h with other versions -TD
+* update URL for zlib -Frederic L W Meunier
+
+2001-07-14 (2.8.4pre.5)
+* document CHARSETS_DIRECTORY and CHARSET_SWITCH_RULES in lynx.cfg -IZ
+* add a fallback in _Switch_Display_Charset() if no CHARSETS_DIRECTORY was
+ specified -IZ
+* ensure that config variable names in LYReadCFG.c are in alphabetic order,
+ though only the first character matters (report by IZ) -TD
+* updated notes on DOS in INSTALLATION -DK
+* modify ifdef in HTTP.c to build with configure --with-ssl --disable-news
+ (report by Frederic L W Meunier) -TD
+
+2001-07-10 (2.8.4pre.4)
+* correct red/blue color swapping for PDCurses when built on Unix, which uses
+ X11 -TD
+* correct order of checks for wrapping in www_search_forward() and
+ www_search_backward(), which would allow an infinite loop if there were no
+ anchors on the current page (report by Frederic L W Meunier) -TD
+* add a missing chunk to reverted change of SGML_character() -NSH
+ <nsh@horae.dti.ne.jp>
+
+2001-07-07 (2.8.4pre.3)
+* review/add descriptions of new command-line options in lynx.man, lynx.hlp and
+ Lynx_users_guide.html -TD
+* update da.po, ja.po, ru.po, sv.po from
+ http://www.iro.umontreal.ca/contrib/po/maint/lynx/
+ (report by JES) -TD
+* add command-line option -curses-pads which can be used to disable the
+ left/right scrolling logic. This is used for testing, e.g., the repaint
+ bug reported below -TD
+* remove logic in lynx_force_repaint() which reset the window background, since
+ it does not work with the logic used to implement left/right scrolling.
+ Retested older versions of ncurses and did not find a case where this was
+ needed after all (report by IZ) -TD
+* revert dev.21 change to SGML_character() S_equals case, which has undesirable
+ side effects regarding spacing around '=' (report by
+ <nsh@horae.dti.ne.jp>) -TD
+* define additional -trace-mask option, 1=SGML -TD
+* add -trim_input_fields command-line option and corresponding
+ TRIM_INPUT_FIELDS to lynx.cfg to suppress trimming of TEXT and TEXTAREA
+ fields in forms. This does not retain trailing blank lines in a TEXTAREA;
+ more work would be needed to do that (reported by VH, most browsers appear to
+ retain trailing blanks) -TD
+* modify parsing of "<script>...</script>" to allow "<!-- ... -->" comments
+ in SGML_character(). Though the HTML 4.0 spec is fairly clear, other
+ browsers (and some webpages) assume that "</" does not have to be escaped
+ when it appears in a script which is commented to avoid confusion with older
+ browsers. This change doesn't ensure that the comment is at the beginning
+ of a line, since that's awkward to do with SGML_character(), and also leaves
+ the script in a comment which works for lynx since lynx does not interpret
+ it anyway -TD
+* remove redundant enum identifiers in typedefs -TD
+* modify parse_attributes() in LYStyle.c to allow video attributes such as bold
+ and reverse to be combined with colors, used this to debug problem with
+ <script> and comment -TD
+* improve logic for nested-tables to handle cases such as www.tin.org -IZ
+ TRST ignores the horizontal alignment *inside* a multi-line cell of a table.
+ This limitation, in conjunction with the nested-tables modifications does not
+ work well when text with a horizontal alignment (e.g., <ul>) is put in a
+ table cell. This patch introduces a *limited* logic to take this info into
+ account. It should work OK as far as the last non-empty line of the cell is
+ ended by a "line-end" command, not by a </td> (this is often the case with
+ contents using horizontal formatting).
+* updated URLs for ncurses (report by DK) -TD
+* updated samples/bright-blue.lss -IZ
+* make definition of $(SHELL) in makefile.in's consistent, in terms of
+ CONFIG_SHELL, since the configure script no longer uses 'include', and
+ this creates some problem with nonstandard shells (report by IZ) -TD
+* update/extend lists in lynx_help_main.html -Frederic L W Meunier
+* add note about lynx.cfg mouse and color configuration to user's guide -PW
+* document -cmd_log and -cmd_script options in user's guide (Michael Warner).
+
+2001-06-10 (2.8.4pre.2)
+* corrected order of parameters of is_prefix() function in the
+ scan_cookie_sublist() function, broken in dev.21 changes (report by Ken Scott
+ <admin@shellworld.net>) -TD
+* add a fallback definition for SA_LEN(), to build with glibc 2.2 (report by
+ Mark Sutton <mes@lazo.ca>, from
+ http://cvs.pld.org.pl/SOURCES/lynx-SA_LEN.patch?rev=1.1) -Arkadiusz
+ Miskiewicz
+* modify ifdef in HTCheckForInterrupt() to build with DJGPP -DK
+* remove include for <pdcurses.h>, use <curses.h> which is the default for
+ PDCurses - DK
+* reviewed/reverted some changes from dev.20 which changed explicit "r", "w",
+ and "a+" fopen modes to TXT_R, TXT_W and TXT_A, where they relied on the
+ default mode set via SetDefaultMode(). With DJGPP, files containing special
+ graphics such as README's might not otherwise display, for example (report by
+ DK) -TD
+
+2001-06-03 (2.8.4pre.1)
+This version has been test-built on Linux (BSD curses, ncurses,
+slang), Tru64 5.1 (cc, curses/ncurses/slang), OpenVMS, OS/2 EMX, win32
+(both Visual C++ 4.1 and 5.0 as well as Borland C++), AIX 4, HPUX 11,
+Solaris 8. Recent builds include SunOS 4.1.4 (cc and gcc,
+curses/ncurses/slang), Solaris 2.5.1 (cc and gcc,
+curses/ncurses/slang) and IRIX 6.5 (cc and gcc, curses/ncurses). Less
+recently, FreeBSD 4.1, NetBSD 1.5 and OpenBSD 2.8 (curses/ncurses).
+
+2001-06-02 (2.8.4dev.21)
+* regenerated lynx.pot and resync'd the .po files against it with msgmerge,
+ formatted to 132 columns to minimize line-breaks, for ease of comparison -TD
+* add a few more #undef's to work with glibc 2.1.3 -TD
+* include <signal.h> before <curses.h> to work around bug in glibc 2.1.3, which
+ apparently was not used to build a system before release. Note that the
+ preferred solution is to patch /usr/include/sys/ucontext.h to avoid defining
+ ERR, which is defined by all versions of curses.h (report by Karl Eichwalder
+ <ke@suse.de>) -TD
+* change lynx.cfg entry for COLOR #6 to brightred/black, which is what
+ Slackware uses, to make links more visible -TD
+* remove several chunks of dead (#if 0) or commented-out code, especially in
+ TRSTable.c, except a few used for debugging -TD
+* add checks for potential buffer overflow in increment_tagged_htline() -TD
+* consolidate scattered calls to editor with function edit_temporary_file(),
+ which fixes terminal modes when editing TEXTAREA -TD
+* modify LYisNonAlnumKeyname(), etc., using new functions LYindex2MBM() and
+ LBMBM2index() so that it should work with EBCDIC, as well as similar case of
+ translation in LYBookmarks.c which assume that there are no gaps in the
+ coding for the alphabet -TD
+* workaround in lynx_nl2crlf() for ncurses, which did not refrain from using
+ cursor-down if it was set to a newline when nonl() was specified -TD
+* replace permissions[] array in LYLocal.c because Cygwin (mis)implements the
+ S_xxx values as a function -TD
+* add ENABLE_LYNXRC setting to lynx.cfg, which allows one to modify the list
+ of values which are visible on the O'ptions form which can be saved to the
+ .lynxrc file -TD
+* check the width of entries displayed by LYOptions.c non-forms
+ boolean_choice(), to pad shorter ones with spaces -TD
+* change type of LYMultiBookmarks to integer, combine with LYMBMAdvanced, to
+ use enumMultiBookmarks to set it, making its configuration more easily
+ table-driven -TD
+* make the style of menu border/bg/entry/number/active-entry and scroll
+ indicator settable -IZ
+ The names in lynx.lss are
+ menu.frame menu.bg menu.n menu.entry menu.active menu.sb
+* modify cookie path prefix-comparison to ignore a trailing slash, e.g.,
+ /group/sftvnews/ versus /group/sftvnews (workaround for LV visiting
+ http://groups.yahoo.com/group/sftvnews) -TD
+* cookie path= should be a prefix of the request-URI path, so do not truncate
+ request-URI path in LYSetCookie() [we got mistaken "invalid cookie path=..."
+ prompt in some cases previously] -LP
+* parameterized the logic around URL_edit_history to add MAIL_edit_history,
+ used to store addresses for Printing Options, mail file to user (request by
+ LV) -TD
+* check, fix minor problems with some .po files based on check_po script
+ (mentioned on mutt-dev mailing list by Bjorn Jacke <bjacke@suse.de>) -TD
+* fixes to build with U/Win -TD
+* check width in LYpaddstr(), truncate the string if needed. This fixes a
+ case where items in very wide popup menus would wrap, e.g., the EXTERN_LINK
+ menu -TD
+* add a configure checks for term.h, to work around broken package for ncurses
+ on Cygwin -TD
+* combine checks for useragent into one function LYCheckUserAgent() -TD
+* add runtime toggle for EXP_NESTED_TABLES, bind this to "~" (see www.tin.org
+ for comparison) -TD
+* regenerate ja.po from lynx-2.8.3rel1.ja.po using gettext 0.10.37 and libiconv
+ 1.6.1 (updated by Masayuki Hatta <mhatta@po.airs.net>)
+* changed -DNCURSES in DOS makefile to -DPDCURSES -TD
+* changes for DOS makefiles with DJGPP -DK
+ These changes are for DOS under DJGPP with Internationalization and SSL. The
+ openssl port for DOS is dependent on WATT32, so the link order for libraries
+ has to be set appropriately. Made EXP_NESTED_TABLES the default and changed
+ the default locations for WATT-32 and PDCURSES to top-level directories. The
+ DOS port of gettext is now dependent on libiconv.a to convert character sets
+ as the .mo file is read. The format for the makefile in WWW/Library/DJGPP
+ now reflects the changes previously made in the src makefile.
+* improve definition of CTRACE, making it an expression again as it was before
+ dev.20 -PG
+* move logic for cookie_domain_flag_set() out of LYReadCFG.c into LYCookie.c
+ rewriting it to make it table-driven, where it is now shared with
+ LYrcFile.c -TD
+* rewrote LYrcFile.c, making it table-driven as is LYReadCFG.c -TD
+* reviewed/corrected several pointer-mismatches in PARSE_xxx() macro usage -TD
+* corrected return-types of several functions in LYLocal.c, which were given as
+ BOOLEAN though they return a signed integer -TD
+* add DIRED support to makefile.bcb -TD
+* filter the list of mime types sent in "Accept:" header for GET, to eliminate
+ repeated or shadowed types, using new function HTFilterPresentations()
+ (addresses Debian bug report #41594) -TD
+* fix several typos in Lynx help-files -LV
+* change most configure script C-preprocessor assignments to $CFLAGS to
+ $CPPFLAGS, and modify logic of $TRY_CFLAGS to use CF_ADD_CFLAGS, which
+ does the same thing -TD
+* enable scroll indicators on the menus - shown if there is a part of menu
+ before/after the visible area -IZ
+* modify the context-sensitive mouse-menu, making it easier to to configure by
+ reorganizing the tables used to generate the popup menu -IZ
+* correct a couple of places in form_getstr() when keys were "generated"
+ instead of actions, which broke mouse-navigation in input fields -IZ
+* fix return value of Stbl_finishTABLE(), retesting curpos whose value may have
+ been altered, e.g,. in split_line(), causing a cell to overflow to the right
+ of the visible area (even if line wrap is requested) -IZ
+* change the logic of -display-charset: before it was sometimes descriptive
+ (here is the charset, behave as if it was used for display), sometimes
+ prescriptive (make the display to use charset if you can). Now it is only
+ descriptive. One is forced to use the 'O'ptions to manually load a different
+ font -IZ
+* move $(DEFS) and $(CHARSET_DEFS) into $(CPP_OPTS) in src/makefile.in -TD
+* renamed -blink_is_boldbg command-line option to -blink, corrected ifdef's -TD
+* implement -blink_is_boldbg option for OS/2 EMX and ncurses, then integrated
+ some ifdef's to merge with equivalent slang code -IZ
+* rewrote hardcoded if/then/else chains in handle_LYK_SHIFT_LEFT()
+ handle_LYK_SHIFT_RIGHT() to repeat_to_delta() function -TD
+* implement a key-accelerator for shift-left/right commands, i.e., repeating
+ the shift command increases the amount by which the screen is shifted -IZ
+* modify ifdef in handle_LYK_LINEWRAP_TOGGLE() to use popup menus for each
+ configuration rather than limit it only to mouse-supported ones such as
+ ncurses or PDCurses -TD
+* changes to left/right scrolling to limit its effect to tables (IZ):
+ + rename LYlineWrap variable (used to denote the column at which content is
+ wrapped) to LYwideLines (used to denote the opposite sense: true if
+ wrapping is disabled).
+ + add global variable LYtableCols to control the column-limit for tables.
+ The two variables LYLineWrap and LYtableCols have the same effect as did
+ altering LYlineWrap and LYcols, but are limited to table layout.
+ + modify handle_LYK_LINEWRAP_TOGGLE(), use a popup menu to set LYwideLines
+ and LYtableCols. The latter is set to a positive integer, in units of
+ 1/12 of the physical screen width.
+ + modify GridText.c, replacing LYcols with new macros DISPLAY_COLS and
+ WRAP_COLS.
+ + keep scrollbar on the right margin of the screen when the contents are
+ shifted left or right.
+* modify makefile.bcb, add (tested) commented-out lines for building with
+ color-styles -TD
+* modify makefile.msc and makefile.bcb, add (tested) commented-out lines for
+ building with winsock2 -TD
+* add a configure check for napms(), use this if available to support subsecond
+ delay times for INFOSECS, MESSAGESECS, ALERTSECS -TD
+* rewrote www_user_search() to support both forward and backward search.
+ Bound backward-search to 'N' -TD
+* split-out anchor_has_target() and link_has_target() to separate the search
+ loops from the search comparisons -TD
+* reduce some clutter with LYno_attr_strstr() and LYno_attr_mb_strstr() macros,
+ which combine the caseless/case-sensitive functions -TD
+* modify S_equals in SGML_character() to recover when no attribute value
+ is given, e.g., if "alt=" is followed by whitespace. Before, the next
+ attribute was used for the missing value -TD
+* replace call to LYRemoveBlanks() from LYLegitimizeHREF(), which had the
+ effect of removing all blanks from HREFs, with the less drastic step of
+ reducing newlines and tabs to spaces and trimming leading/trailing blanks.
+ Though they do not belong there, it is more likely that the HREF will work
+ with embedded blanks retained -TD
+* add a configure check for BSD- and SYSV-style curses touchline function,
+ needed to build with NetBSD 1.5 curses which has a partial implementation
+ of X/Open curses (report by JES) -TD
+* correct insert_blanks_in_line(), which did not copy trailing style codes
+ such as stop-underline, causing "lynx -dump -with_backspaces" to produce
+ some odd effects -TD
+* modify configure script macro CF_NCURSES_VERSION to define NCURSES, in case
+ it is used in the default screen setting, since lynx uses this definition in
+ some places rather than NCURSES_VERSION to distinguish it from other curses
+ implementations -TD
+* modify configure script macro CF_NCURSES_CPPFLAGS to check for ncurses.h
+ before curses.h, and to specifically check for <ncurses/ncurses.h>, to avoid
+ spurious matches against a /usr/include/ncurses.h, to workaround problems
+ with obsolete versions of ncurses on FreeBSD and NetBSD where the current
+ version is often available only as a "port" (reports by Jim Spath,
+ Michael Warner) -TD
+* add fallback definition for SLSMG_xxx_CHAR symbols which may be missing in
+ older versions of slang (reported by Eduardo Chappa) -TD
+* update config.guess, config.sub
+
+2001-04-01 (2.8.4dev.20)
+* rename KEYMAP 'EXTERN' to 'EXTERN_LINK', adding 'EXTERN_PAGE'. Existing
+ keymaps should work since 'EXTERN_LINK' matches first. EXTERN_PAGE runs the
+ external command on the current page. Map comma (,) to EXTERN_PAGE -TD
+* replace most calloc calls with typecalloc or typecallocn -TD
+* modify LYExtern.c to recognize if more than one EXTERN command has been
+ defined in lynx.cfg for a given name, and allow the user to select one
+ command from a popup menu -TD
+* split-out code that opens lynx.cfg and lynx.lss as LYOpenCFG() function,
+ making that check if the given pathname is absolute. If not, it attempts
+ to look in the same directory as the parent file (when processing includes),
+ or the directory of the default config file -TD
+* replace some explicit "r", "w", and "a+" fopen modes with TXT_R, TXT_W and
+ TXT_A, add/use corresponding BIN_R, BIN_W, BIN_A definitions. Correction to
+ OpenHiddenFile(), which would have appended text to a binary file -TD
+* combined lynx_html_item_type and lynx_printer_item_type structs as
+ lynx_list_item_type to simplify LYReadCFG.c and incidentally fixing a bug in
+ add_printer_to_list by merging it with add_item_to_list -TD
+* implement a simple workaround for staircased messages from running xli as an
+ external viewer, with lynx_nl2crlf() function -TD
+* add bright-blue.lss sample (from IZ) -TD
+* modify makefile.in's to use symbol _O for object suffix to allow simple
+ override for OS/2 EMX -Zomf compiler option (request by IZ) -TD
+* add HAVE_LYHELP_H definition in config.hin and use that in LYGlobalDefs.h
+ to workaround misuse of HAVE_CONFIG_H in makelynx.bat -TD
+* work-around in LYrefresh() when curses pads are used, for special case where
+ cursor is not set properly when prompting with long subject line for mailto
+ URL -TD
+* eliminate some pointer mismatch compiler warnings in LYEditInsert() for
+ EXP_KEYBOARD_LAYOUT configuration -TD
+* improve handling of tables with respect to bad HTML. Also took an
+ opportunity to macroize a couple of places which missed in
+ unobfuscation-of-faking <td></td> (this faking happens when line break
+ happens in a non-first column of a table) -IZ
+ For example:
+ <TR>
+ <TD>
+ <FORM ACTION="FrameWork.class" METHOD="post">
+ y
+ </TD>
+ <TD>
+ <DIV>
+ x
+ </DIV></FORM>
+ </TD>
+ </TR>
+ Note FORM which spans cells. -trace'ing it gives very unintuitive
+ results: it skips </TD> inside FORM, but not <TD>. Then it supplied
+ </TD> when the FORM ends.
+* repair treatment of colspans in TRST, making it work again in one of the
+ special cases it worked before. Another bug was in interaction of
+ justification and tables -IZ
+* marked more TRACEs in TRST as "BUG"s -IZ
+* TRST would sometimes produce non-intuitive results if <td> follows </tr>.
+ Add error recovery for this case -IZ
+* corrections for nested-table configuration -IZ
+ + make trailing <BR> in table cells "behave well" again (the following cell
+ would not be horizontally offset).
+ + fix highlighting of multiline links inside tables, and a "80M tracelog" bug
+ (due to a misprint update of the enclosing table was performed once-per-row
+ instead of once-per-table). Extra updates would not hurt, but led to
+ slowdowns and quadratic-size logs.
+ + fix a special case with table-in-table for partial-display
+* resizing a window on a console may lead to a switch of the character-cell
+ size. The "downloaded font" loaded during an auto-switch of display-charset
+ may be no longer valid. In this case, force a re-download of the suitable
+ font for the current charcell size -IZ
+* add reverse-video style for forwbackw.arrow to lynx.lss -TD
+* while an error in .lynx-keymaps is fatal, but a more or less equivalent error
+ in the KEYMAP section of lynx.cfg is benign. Make them both benign -IZ
+* change remaining uses of lookup_keymap(LYK_xxx) to LAC_TO_LKC0(LYK_xxx) -TD
+* modify set_clicked_link() to return lynx keycodes rather than character
+ values -IZ
+* remove line_for_char() function since it is used for HTLine.start
+ computations -TD
+* several changes to GridText.c -IZ
+ + '#' (shown at the UL corner when there is a toolbar) is shown even at the
+ beginning-of-the document.
+ + with mouse enabled, the first 6 chars in the UL corner were "always"
+ sensitive to Click-1, behaving as PREV_DOC (usually on Left). This patch
+ changes this logic (for color-style):
+ If '#' is shown there, clicking on it behaves as pressing #;
+ Clicking on the next 6 chars behaves as PREV_DOC/NEXT_DOC (3+3);
+ + if you define a style for forwbackw.arrow, then suitable arrows are shown
+ in these 3+3 positions; in fact they are shown only if it makes sense to do
+ PREV_DOC/NEXT_DOC, providing additional feedback.
+ + remove the first empty line shown on any HTML document.
+ + correct an off-by-one error in the removal-of-zero-length-markup logic.
+ Due to this bug, zero-length markup was never removed, which led to
+ accumulation of style change entries, eventually to a buffer overflow. At
+ this moment lynx color-style engine would give up, resulting in
+ incomprehensible ocean of colors on the display. To demonstrate, make a
+ select entry with more than 46 entries. [My auto-display-charset logic
+ added 2 new encodings to the table of Lynx, bringing the number to 46 on
+ the 'o'ption form. ;-]
+ + fixes a bug with incorrectly calculated width of a numeric tag [12]
+ as far as 12 is 10 or more (still fixes Debian #68542).
+ + remove unused members from HTLine struct.
+ + make variables underline_on and bold_on private.
+ + rewrote insert_blanks_in_line(), splitting out move_anchors_in_region().
+ + make split_line() easier to maintain by adding variables to represent
+ common subexpressions, e.g., s_post, s_pre.
+ + use set_style_by_embedded_chars() in split_line() to simplify/improve test
+ for whether lynx should add a bold/underline control.
+ + recode to eliminate HTLine.start
+ + recode to eliminate HTLine.chars
+ + several changes to split_line(), using pointers to HTChangeStyle structs
+ rather than array indices.
+* adjust some ifdef's to make configure --disable-trace compile -TD
+* correct allocation size in mailcap_substitute(), which did not count the
+ trailing null -TD
+* add configure --enable-vertrace option, to put __FILE__ and __LINE__ into
+ trace log -PG
+* improve description of USE_MOUSE in lynx.cfg -PW
+* fix a few warnings from antic (unreached statements due to quirks of ifdef's,
+ incorrectly-indented code) -TD
+* eliminate a few references to USE_HASH and LINKEDSTYLES in documentation -TD
+* fix a couple of compiler warnings for SCO -BL
+* fix a comparison in HTChunkPutUtf8Char() to work with EBCDIC -PG
+* fix a typo in LYCharUtils.c CTRACE macro, amend tracing to avoid suppressing
+ a related user message -PG
+* change CF_TERMCAP_LIBS configure macro to warn rather than exit with an error
+ if it cannot find the libraries it is looking for. This allows one to
+ configure with the slang library on systems without a termcap library (report
+ by Atsuhito Kohda) -TD
+
+2001-02-26 (2.8.4dev.19)
+* add experimental configure option for post-dev.16 TRST changes by IZ
+ (--enable-nested-tables), ifdef'd with EXP_NESTED_TABLES -TD
+* correct a couple of places that used attrset() rather than wattrset(), which
+ caused the status line to lose color when configured for curses pads but not
+ using color-style (report by Fr3dY <fr3dy@retemail.es>) -TD
+* add a restriction for the chdir command, so it is not normally enabled in
+ anonymous mode -TD
+* reduce putenv logic for presetting $LINES and $COLUMNS to a special case
+ for MVS -PG
+* enable pasting an URL into Lynx (similar to 'g'), and improves the code to
+ copy an URL from Lynx -IZ
+* remove arbitrary restrictions on the size of text to be pasted. It also
+ makes a quadratic algorithm into a linear one. Also, it may remove many bugs
+ when the text to paste contains non-printable chars. Not tested with Unicode
+ and on Win* -IZ
+* implement an action NEXT_DOC, which undoes what PREV_DOC (usually on the
+ Left-arrow key) does -IZ
+ Possible enhancements:
+ a) make HISTORY show the position on the (no more!) "stack".
+ b) several places in the source use the value of nhist (they scan
+ history?). Make nhist_extra public, and check whether these
+ places want nhist + nhist_extra instead.
+ c) Currently LYpop() and (some) LYpush() erases "the tail" of the
+ stack. Maybe some callers would prefer a different semantic...
+* correct some logic related to EXP_READPROGRESS -IZ
+* change LYE_xxx symbols to an enum LYEditCodes -TD
+* replace some WIN_EX ifdef's by CAN_CUT_AND_PASTE. Enable cut and paste on
+ OS/2 -IZ
+ For example, in the keymap file:
+ setkey "\200\4" LAC:DO_NOTHING:PASTE # S-insert
+ setkey "^(kIC)" LAC:DO_NOTHING:PASTE # S-insert
+* enable automatic switching of display charsets -IZ
+ Currently, it is supported under OS/2 only. A couple of lines should make it
+ work in LINUX too: express the semantic of _Switch_Display_Charset() in
+ terms of the existing UCChangeTerminalCodepage.
+ For example, in lynx.cfg:
+ CHARSETS_DIRECTORY:I:/get/tfont10/dir1
+ CHARSET_SWITCH_RULES: koi8-r ISO-8859-5 windows-1251 cp866u KOI8-U :cp866, iso-8859-1 windows-1252:cp850
+ The first variable may be not needed outside of OS/2 (the directory which
+ contains glyph tables, as generated/usable with tfont). [Used for
+ full-screen sessions only.] The second variables may go at the future, when
+ Lynx knows how to auto-deduce it itself. Format of CHARSET_SWITCH_RULES
+ source1 source2 source3 : dest1, source4 source5 : dest2
+* move a call for _scrsize() from LYSystem() to size_change(), to fix problem
+ with OS/2 EMX related to screen-size changes -IZ
+* correct a bug in TRSTable.c which left a pointer into a chunk which was
+ reallocated elsewhere (report by Robert Mognet <rmgnt@surfree.com>) -TD
+* make parse_restrictions() warn about keywords it does not recognize -TD
+* rewrote restrictions_fun() in LYMain.c, making it use print_help_strings(),
+ to show the actual restriction values, and listing restrictions that are not
+ documented in the -restrictions message -TD
+* if find-leaks if enabled, free the 'line' variable in HTReadProgress() -TD
+* if find-leaks is enabled, undefine SAVE_TIME_NOT_SPACE in HTString.c to avoid
+ seeing spurious leaks in HTSprintf/HTSprintf0 -TD
+* add command-line option -trace-mask to specify optional traces. Defined
+ these: 2=color-style, 4=TRST -TD
+* improve ifdef's for --disable-trace configure option, eliminating more unused
+ code when NO_LYNX_TRACE is defined -TD
+* make ifdef's for NCURSES and resizeterm consistent -TD
+* add a call to wresize() after resizeterm() in case user resizes screen in
+ ncurses pad configuration (report by IZ) -TD
+* change entry for "bibp" restriction to "goto_bibp" for consistency with the
+ other goto_xxx restrictions, and use CAN_ANONYMOUS_GOTO_BIBP (report by
+ Robert Cameron) -TD
+* add table entries for goto_xxx restrictions, which replace assignments
+ overlooked in conversion to table in dev.18 (report by Robert Cameron) -TD
+
+2001-02-12 (2.8.4dev.18)
+* change LYLineEditors[] to unsigned char since values are out of range for
+ signed chars on Solaris -TD
+* correct a memory leak in HTStat() from mis-patch for Win32 -TD
+* modify fancy_mouse() logic for ncurses to allow the user to quit a menu by
+ clicking outside the menu -IZ
+* allow a different approach to the problem: how to enter a keyboard
+ navigation command when you are in an editing mode. A new EDIT-time action
+ is introduced: LYE_STOP. Use it like this:
+ KEYMAP:^[:INTERRUPT:STOP
+ The action behaves as if -tna is temporarily switched on: your edit is
+ committed, and you go into the non-edit mode - until you press Enter on an
+ edit field again (or switch to a different document), when this temporary
+ switch to -tna is terminated. If the "current" edit field has a different
+ style than the "active" edit field, you get an additional feedback. Anyway,
+ the status line shows a correct info about the current mode.
+ In -tna mode this behaves as the usual end-of-edit action -IZ
+* make bindings for C-w and C-x C-w do not work for form input fields -IZ
+* add etags target to top-level makefile.in -IZ
+* add some traces to make color style code easier to debug -TD
+* restore commented-out call to HText_cancelStbl() in HTML_TABLE case in
+ HTML_start_element() from IZ's changes, which is needed for nested table
+ alignment. The colors shown in deja-news are incorrect however because color
+ styles are not picking up the </tr> and </table> tags properly, and a few
+ tables are misaligned relative to dev.16, more analysis needed -TD
+* change LYHash.c to use const, eliminate redundant unsigned's and casts -TD
+* add a limit check for rand()/etc., result in LYUtils.c, which worked for
+ Linux lrand48() but was not portable (report by PG) -TD
+* add missing definitions to make srand/rand code build for non-autoconf'd
+ configurations such as win32 -TD
+* ifdef'd the mkdir() for lynx_temp_space in LYMain.c to make it apply only to
+ Unix, to avoid prototype conflict with non-POSIX compilers (report by Mike
+ Bledig <mikegb@mweb.co.zw>) -TD
+* adapt patch for FTP_PASSIVE from NetBSD CVS, to make it work with INET6 (from
+ comp.unix.bsd.netbsd.misc newsgroup posting which stated that the patch had
+ been forwarded to lynx-dev) -TD
+* remove unused code of HTParseInet() for INET6 from HTTCP.c -TD
+* updated some translations in fr.po and ru.po (report by JES) -TD
+
+2001-02-08 (2.8.4dev.17)
+* implement left/right scrolling and line-wrap toggle using '{', '}' and '|'
+ characters, respectively. This uses SVr4 curses/ncurses pads to make the
+ whole screen treated as a viewport into a very wide screen -TD
+* make do_check_goto_URL() table-driven to simplify it as well as combine the
+ related messages into GOTO_XXXX_DISALLOWED -TD
+* combine restrict_name[] and restrict_flag[] arrays to eliminate possible
+ ifdef mismatches, as well as to simplify the treatment of "default"
+ restrictions -TD
+* eliminate redundant symbols for color-style ifdefs (USE_HASH and
+ LINKEDSTYLES), using only USE_COLOR_STYLE -TD
+* simplify parse_style() by making most of it a table -TD
+* correct logic in arg_eqs_parse() for OPTNAME_ALLOW_DASHES ifdef which made
+ incorrect match for -display if -display-charset were given
+ (report by IZ) -TD
+* revert a commented-out call to HText_cancelStbl() in HTML_TABLE case in
+ HTML_start_element() from IZ's changes, which had the effect of changing the
+ article color in deja-news for color-style configuration -TD
+* fix off-by-one error in the END key handling (an empty line was shown at the
+ end) -IZ
+* makes END key always show a full last page of the document. That is, even if
+ the last line is already shown, it is moved to become the last line of the
+ screen, so that as much as possible of the document is on the screen -IZ
+* add -display_chars cmdline option, and additionally allows autodetection of
+ the charset on the system which allow it. This provides a way to switch the
+ display charset other than via obscure manipulation with 'O'ptions. (.lynxrc
+ is not viable if you have different charsets in different windows.) -IZ
+ The logic:
+ (1) first autodetect;
+ (2) then read cfg file, and if it is not "AutoDetect ..." (as the saved
+ version says), grant the cfg file charset;
+ (3) then read the cmdline, if it is present, but not "auto", then
+ grant it, otherwise switch back to the autodetected one.
+* allow TRST code to handle table-in-table. There are now two cases only
+ (modulo bugs) when Lynx will not show a table in a table form no matter what
+ is the screen width: when TABLE is inside PRE, and when there is a TAB
+ inside a TABLE. Both look like deliberate decisions, so I did not change
+ these places in HTML.c. But one may need to reconsider this at some
+ moment... Example of usage: to process (my old copy of) DejaNews Power
+ Search form (which has TABLE-in-TABLE, and multiline cells) you need screen
+ width of 112 chars -IZ
+* enable <BR> and <P> in TRSTables. The table still needs to fit into the
+ screen width without line wrapping. A tiny bit of additional work may be
+ needed to allow tables-inside-tables too; then any table should be rendable
+ as a table after an appropriate screen resizing. This patch also should make
+ around 70% of TRSTable.c unreachable. A lot of simplification can be made,
+ and most of the current convoluted hackery may be removed. Since this
+ algorithm tries to align *all* the display lines of the table, in some rare
+ cases it may need larger screen width than the old algorithm (the old
+ algorithm ignores all but one of the display lines corresponding to the given
+ <TR></TR> - and in most cases just gives up for the whole table if a
+ multiline cell is but of the simplest form) -IZ
+* add several traces and comments to TRSTable.c -IZ
+* enable interrupting LYNX by any char bound to INTERRUPT -IZ
+* add configure check for srand()/rand() functions, or alternatives with
+ similar interfaces. These are used in the SSL and experimental temporary
+ file options -TD
+* allow binding ESC to perform some action (such as INTERRUPT:ABORT, or
+ something else). It is useful only if the curses (or similar) package remaps
+ all the reasonable escape sequences, so Lynx internal escape-sequence
+ processing is not needed -IZ
+* enable showing the region between mark and point in the edit areas in a
+ different style. The style names are edit.active.marked and
+ edit.prompt.marked -IZ
+* add visible feedback for special case of unactive current text area which may
+ exist with -tna. The corresponding style is edit.current -IZ
+* add FORW_RL and BACK_LL to edit bindings support to allow cursor forward and
+ backward respectively to move to the next/previous link if done at the end of
+ the edit-field -IZ
+* update several configure script macros to smooth over incompatibilities
+ in autoconf 2.49c (alpha). In particular, this eliminates support for
+ changequote(), and adds limited support for OS/2 -TD
+* add google to list of search engines in lynx_help_main.html -LP
+* minor formatting of help message -Michael Warner
+* modify GetStdin() function in LYMain.c to allow -stdin option to read past
+ a line consisting of "---" (reported by Michael Warner) -TD
+* ifdef'd bibp: support, added configure option --disable-bibp-urls -TD
+* add experimental support for bibp: URLs as described in
+ http://www.ietf.org/internet-drafts/draft-cameron-tatu-bibp-02.txt
+ (patch by Rob Cameron <cameron@cs.sfu.ca>).
+* change sed delimiters in makefile.in to avoid using '@', which may appear
+ in AFS pathnames (report by Martin Mokrejs <mmokrejs@natur.cuni.cz>) -TD
+* fix missing call to LYCloseTempFP() in LYPrint.c, which caused attempt to
+ mail a file from the PRINT menu to send an email with a blank body. It looks
+ like this would happen for any platform not using LYPipeToMailer() -DK
+* change pointers for RFC's from ds.internic.net to rfc-editor.org, since
+ the former appears outdated -Michael Warner
+* add undef for HAVE_DELSCREEN to config.hin, so the delscreen() ifdef from
+ dev.16 works as intended -PG
+* workaround in CF_CURSES_FUNCS for overzealous compiler that optimized away
+ the test code -TD
+* change order of checks by CF_NETLIBS and CF_SSL macros in configure script,
+ since SSL libraries depend on network libraries (reports by Martin McCormick
+ <martin@dc.cis.okstate.edu>, IZ) -TD
+
+2001-01-01 (2.8.4dev.16)
+* add ja.po message file (overlooked in dev.15) -Atsuhito Kohda
+ <kohda@nsx.pm.tokushima-u.ac.jp>
+* use C preprocessor at build-time to replace CF_EBCDIC configure macro -PG
+* integrated SSL patch from http://www.moxienet.com/lynx/ as a configure
+ option, --with-ssl -TD
+* add configure check for delscreen(), which is not available in some older
+ SVr3 curses libraries -TD
+* add configure check for socks5p.h, to allow socks5 build to use function
+ prototypes -TD
+* updated config.sub, config.guess -TD
+* modify some configure macros to use CF_PATHSEP, for path-separator which is
+ usually colon on Unix, and semicolon on MSDOS, etc. -TD
+* modify several configure macros to use $CFLAGS consistently for compiler
+ options and $CPPFLAGS for C preprocessor options -TD
+
+2000-12-21 (2.8.4dev.15)
+* add .po files to main distribution, remove stubs for files that were not
+ implemented, use msgmerge to resync against the current lynx.pot
+ (prompted by discussion with Morten Bo Johansen <mojo@image.dk>) -TD
+* corrected dev.13 changes for EXP_READPROGRESS, to make the
+ non-EXP_READPROGRESS configuration build and work with .lynxrc settings -DK
+* use EXIT_SUCCESS/EXIT_FAILURE in exit() and exit_immediately() calls -TD
+* improve check for lynx_temp_space by ensuring that the directory actually
+ exists; attempt to create the directory if it does not, e.g., ~/tmp/, to
+ resolve problem introduced by Mandrake's patch -TD
+* modify SetOutputMode() to flush stdout to work around buffering problem with
+ Cygwin on error exit from Lynx (reported by Brad Town <btown@ceddec.com>) -TD
+* change definitions for LYCharINTERRUPT1 and LYCharINTERRUPT2 to not use
+ FROMASCII() in the EBCDIC configuration, since those symbols are used in case
+ statements which otherwise would not compile -PG
+
+2000-11-03 (2.8.4dev.14)
+* restore initialization of LYlines, LYcols in setup() which was lost in dev.12
+ changes (reported by DK) -TD
+* modify logic for -stdin option to redirect keyboard input to null device
+ if lynx is not connected to a terminal, e.g., running under cron -TD
+* check in DontCheck() if Lynx is reading from a command-script, to avoid
+ using those characters to interrupt the application -TD
+* add a cleanup handler for win32, since UNIX-style signal handlers do not
+ work on that platform -TD
+
+2000-10-25 (2.8.4dev.13)
+* fix missing ifdef for EXP_READPROGRESS in LYOptions.c (reported by
+ Atsuhito Kohda) -TD
+
+2000-10-25 (2.8.4dev.12)
+* add a configure check for video library on OS/2 EMX, needed to link with
+ slang. Arrow keys do not work -TD
+* use macro UCH to fix gcc's char-used-as-subscript warnings, and to replace
+ existing casts to unsigned char, making the code more readable -TD
+* merge variants of HTReadProgress() -TD
+* modify SHOW_KB_RATE in lynx.cfg to allow disabling logic that
+ shows transfer rate during download. If EXP_READPROGRESS is defined, make
+ this alterable from the command line and options menu as well (from
+ discussion by Karen Lewellen <klewellen@delphi.com>) -TD
+* add the pathname that caused a problem to the error message in
+ CF_PATH_SYNTAX, lest someone be confused when tilde is not expanded
+ (addresses a problem reported by Lawrence Kwan <lawrence@interlog.com>) -TD
+* remove redundant leading newlines in "lynx -version" output (reported by Sven
+ Guckes) -TD
+* add dependency in src/makefile.in for building chrtrans/makeuctb$x, used by
+ UCdomap.o -IZ
+* fix CF_PATH_SYNTAX square brackets for OS/2 EMX case, lost by not disabling
+ m4's quotes for that line (report by IZ) -TD
+* remove older/unused variant of code to set screen size in LYCurses.c by
+ setting environment variables -PG
+* one of the ".po" files is zipped as type binary rather than ASCII, so it does
+ not unzip on OS/390 with the "-a" option. The "-aa" works better since it
+ forces text conversion regardless of the type of the archived file -PG
+* change definitions of LYCharINTERRUPT1 and LYCharINTERRUPT2 to accommodate
+ EBCDIC -PG
+> the remainder (most of the functional changes in this patch) from IZ:
+* add "typeless" notion to color style logic:
+ a) reverts to the style "foo" (from "foo.classname") if the style
+ "foo.classname" was not configured;
+ b) For input elements of type=typename uses style
+ "input.type.typename" if this style is configured (but
+ "input.classname" is not!);
+ c) Same for typeless elements, with typename="".
+ This allows the following:
+ input.type.submit:normal:blue:black
+ # match "link":
+ input:normal:green
+ textarea:normal:white:cyan
+ # type-less input is the same as type=text (similar to textarea)
+ input.type.:normal:white:cyan
+ input.type.text:normal:white:cyan
+ If your "link" is configured as normal:green, then input elements of types
+ other than typeless, text, or submit will be shown in the same style as link.
+ The textareas and text input elements are shown in the same style (but
+ different from "link" style), and submit "buttons" are shown yet in another
+ style.
+* implement styles in "dynamic areas" of documents. Three flavors of them are
+ active text-edit fields, non-active ones, and links/radiobuttons, etc.
+ This patch is concerned with the first flavor only. Two subflavors are
+ document's text-edit areas, and Lynx's ones (such as where you input the URL
+ after `g'). Each one of them has 3 elements: scroll symbols ("arrows"),
+ after-the-end padding, and the actual input string.
+ The patch
+ a) makes styles for these 2*3 elements customizable;
+ b) uses ACS chars (if available) for the arrows (instead of `{'/`}').
+ [It would be nice to make non-active text-areas to have customizable
+ styles for padding, and have scroll arrows too...]
+ Here is my customization for testing:
+ edit.active:normal:red:cyan
+ edit.prompt:normal:green:cyan
+ edit.active.arrow:normal:yellow:cyan
+ edit.prompt.arrow:normal:yellow:gray
+ edit.active.pad:normal:gray:cyan
+ edit.prompt.pad:normal:white:black
+* modify LYSystem() to allow changing size of lynx window with OS/2 EMX
+ at runtime. Example:
+ !mode 110,30;exit
+* use new macros LYCharINTERRUPT1, LYCharINTERRUPT2 and LYCharIsINTERRUPT() to
+ make it simpler to find uses of ^C and ^G
+* modify key mappings so the keymap file overrides the terminfo/termcap
+ description rather than the reverse
+* make unrecognized keynames emit diagnostic when tracing (but ignores them the
+ same way the older code did). Trace info about each keycode received
+* provide better tracing of style choices, both when styles are assigned into
+ text-lines, and when lss directives are converted to "numeric colors"
+* add similar tracing for links and contents of user-editable stuff
+* slightly expand the cache of colors to better accommodate 16-color terminals,
+ and fixes a misprint in handling background-color == maxcolor
+* modify logic in color styles initialization using flag default_color_reset to
+ override ncurses use_default_colors() logic if the "default" color style tag
+ is found in lynx.lss
+
+2000-10-18 (2.8.4dev.11)
+* include LYLeaks.h in LYPrettySrc.c to allow leak-checking -TD
+* modify configure script macro CF_RECHECK_FUNC to ensure that we add a given
+ library only once to the resulting list. This fixes a longstanding bug which
+ caused the nsl library to be repeated on some platforms (reported by BL for
+ one of the SCO configurations, and Urs JanBen <urs@tin.org> for SINIX-L 5.41
+ (i386-sni-sysv4)) -TD
+* modify "make install-doc" rule to first remove targets. Otherwise "ln -s"
+ and "cp" fail to create the targets when installing with normal user
+ permissions (reported by LV) -TD
+* fix for handle_LYK_DWIMEDIT() to ensure it does not dereference a null
+ pointer, when trying to edit a text file with no links within it (report by
+ Harri Tuominen) -DK
+* add fallback definitions to accommodate renaming of UCX$xxx symbols to
+ TCPIP$xxx in recent versions of OpenVMS UCX (reported by Horst Drechsel
+ <ai05@sternwarte.uni-erlangen.de>) -TD
+* add TRSTable.obj to src/descrip.mms objects -TD
+* modify configure script to omit LYExtern.o and LYLocal.o if the corresponding
+ options (externs and dired) are disabled -TD
+* correct a typo that made configure script always define USE_EXTERNALS -TD
+* interpret ftp server type for VMS if a URL is given with "/~name", as a
+ Unix-style server. This works for the following, at least:
+ VMS V6.2 AlphaServer 2100 4/233 MadGoat System type.
+ (reported by Rick Dyson <dyson@iowasp.physics.uiowa.edu>) -TD
+* make configure check for getaddrinfo() less strict, needed with --enable-ipv6
+ on IPv4-only system (patch by Munechika Sumikawa)
+
+2000-09-21 (2.8.4dev.10)
+* modified www_tcp.h and makefile.msc to allow compile with winsock2 if
+ USE_WINSOCK2_H is defined -TD
+* fix: the recently added code to enable external programs to replace normal
+ lynx handling of individual URL types was not refreshing the screen after the
+ external program finished (EXTERNAL set TRUE:TRUE) -DK
+* fixed two URLs in lynx_help_main.html -DK
+* add symbol USE_VMS_MAILER, use to distinguish VMS mail ifdef's for test
+ compiles -TD
+* use new function LYSendMailFile() to consolidate details of non-VMS/non-piped
+ email, e.g., DOS or Win32, and eliminate some minor inconsistencies in that
+ area -TD
+* correct order of ifdef's in send_file_to_mail() which could leave unsent
+ email on some systems without popen/pclose -TD
+* add some checks in LYhandlePopupList() to prevent popup of an empty list -TD
+* change a few messages written to stderr to end lines with \r\n rather than
+ \n, since Lynx may already be in screen mode when they are written -TD
+* treat .Z, .gz and .bz2 suffixes more symmetrically using new function
+ HTCompressFileType() for parsing them -TD
+* change mime type for bzip2 files to bzip2, x-bzip2 -HN
+* move IPV6 definitions in www_tcp.h to the end, to build on FreeBSD 4.1, since
+ SIN6_LEN must not be checked before including netinet/in.h (patch by
+ Munechika Sumikawa (KAME Project <sumikawa@ebina.hitachi.co.jp>))
+* make HTParseInet() private, simplify some ifdef's -TD
+* change shell expression used to process stdin for mailcap to "(command)<file"
+ form, which is a little more robust than "cat file|command" (suggested by
+ PG) -TD
+* update URLs in about_lynx.html -DK
+* remove spurious 'FREE(leaf);' from LYLocalFileToURL() introduced in dev.5 -DK
+
+2000-09-01 (2.8.4dev.9)
+* improve ifdef's for endwin/newterm logic, making a fallback for LYscreen
+ variable -PG
+* modify CF_CURSES_LIBS to check if both initscr() and tgoto() are in the
+ $LIBS list before deciding not to try to look for them -TD
+* add %s substitution to mailcap_substitute(), overlooked when implementing
+ the logic to read from stdin when %s is omitted (reported by IC) -TD
+* restore endwin/newterm code for ncurses (as PG notes it really is needed) -TD
+
+2000-08-24 (2.8.4dev.8)
+* refine CJK-related suppress of refresh() in statusline() to do this only
+ when the status line does not contain CJK characters (Hataguchi Takeshi)
+* add po/da.po placeholder (request by JES)
+* implement %s, %t, %{charset} and %{encoding} substitutions for mailcap
+ commands in HTFWriter.c (addresses Debian #21096) -TD
+* use new function AnchorsOnThisLine() to obtain count of anchors on the
+ current line for correct computation of length required to fix Debian #68542:
+ Text entry field on http://lists.debian.org/ is hidden when "form fields are
+ numbered" (reported by H.Nanosecond) -TD
+* add OS/2 cases to config.guess, config.sub -TD
+* modify CF_FUNC_GETADDRINFO to supply missing definitions for
+ HAVE_GAI_STRERROR and HAVE_GETADDRINFO, needed to make IPV6 build (reported
+ by Wesley Morgan) -TD
+* reset recent_sizechange after reading KEY_RESIZE from ncurses to work around
+ a case with Linux libc5 which would be treated as an EOF, causing an exit -TD
+* suppress PG's endwin/newterm code for ncurses because it is not needed -TD
+* modify start_curses() function to preset environment variables $LINES and
+ $COLUMNS to make the curses library see the proper screen size. After
+ calling endwin(), delete the current SCREEN object, to force curses library
+ to discard its cached values of LINES and COLS. This requires using
+ newterm(), which may not be present in all versions of curses, so we check
+ for and ifdef accordingly. Tested on os390 and Solaris -PG
+* cleanup IPV6 ifdef's using SOCKETADDR_LEN macro -TD
+* add error checks to LYCopyFile() and other places to report problems copying
+ the downloaded file, using new functions LYCloseOutput(), LYCanWriteFile()
+ (reported by H.Nanosecond <aldomel@ix.netcom.com> as Debian bug #63391) -TD
+* correct logic used to check for "Too many tempfiles", which resulted in
+ occasional misfires -TD
+* add configure checks for touchline() and touchwin(), use this info to work
+ with Ultrix V4.5 (report by Bernhard Simon <bs@bsws.zid.tuwien.ac.at>) -TD
+* reorganized CF_SIZECHANGE macro to work with autoconf 2.49a -TD
+* cleanup definitions for wait-status macros, moving them into www_wait.h -TD
+
+2000-08-03 (2.8.4dev.7)
+* add sample mailto-form.pl script to illustrate handling mailto URLs -KW
+* modify HTTCP.c to build on AIX 4.3 using HAVE_TYPE_UNIONWAIT as in LYLocal.c
+ (Georg Drenkhahn <georg@MPA-Garching.MPG.DE>)
+* change $host_os special case for 'os390' to 'openedition' in configure.in,
+ make corresponding changes for config.guess and config.sub -PG
+* integrate KAME patch for IPV6 (Wesley Morgan <morganw@chemicals.tacorp.com>)
+* add configure script macros for checking IPV6 from tin -TD
+* small fixes for configure script macros CF_BUNDLED_INTL, CF_CURSES_LIBS,
+ CF_UPPER, CF_X_ATHENA -TD
+* fix for multibyte characters in status line (Hataguchi Takeshi)
+* align/merge logic in LYOptions.c and LYForms.c which handles navigation in a
+ popup list, for reuse in name-completion -TD
+* restore check for ^G to cancel in HTSaveToFile() lost in dev.4 changes -VH
+* remove duplicate entries in sortedList() which are used for name-completion
+ (Frederic L W Meunier) -TD
+* fix compiler warning about const in LYpaddstr() using LYwaddnstr(), and
+ fix a potential buffer overflow in the latter (report by PG) -TD
+* correct logic in LYsubwindow(), which called delwin() with a null WINDOW
+ pointer -PG, TD
+
+2000-07-17 (2.8.4dev.6)
+* move special case statement for os390 compiler before AC_PROG_CC macro in
+ configure.in and regenerate configure script (reported by PG) -TD
+* correct check for return values of check_color() in parse_color() for slang
+ configuration, which prevented use of "default" color. This applies to
+ 2.8.3rel.1 as well -TD
+* correct draw_option() functions in LYForms.c and LYStrings.c for slang
+ configuration broken in dev.5 by wrong cut/paste (report by IC) -TD
+
+2000-07-16 (2.8.4dev.5)
+* remove "*:OS/390:*:*" item from config.guess -PG
+* add os390 item to $host_os case-statement in configure.in -PG
+* move $host_os case-statement in configure.in before some configuration tests
+ such as CF_BUNDLED_INTL which might perform compile-time tests -TD
+* use LYLocalFileToURL() in handle_LYK_CHDIR() to ensure that DOSPATH is
+ handled properly, inserting a '/' (reported by DK) -TD
+* correct loop condition in HTSaveToFile(), from dev.4 changes for -cmd_script
+ option which left it ignoring 'c' for cancel -TD
+* speed up local directory access for DJGPP by setting _djstat_flags (Gisle
+ Vanem)
+* updates for makelynx.bat, and improved call on the blat mailer (note -f field
+ not needed or wanted) -Victor Schneider
+* fix Debian bug #65151: "<> in javascript causes premature </script>"
+ (reported by H Nanosecond <aldomel@ix.netcom.com>) -KW
+* replaced all occurrences of 'black' with 'default' in /samples/mild-colors.lss
+ to make it more reasonable on terminals with non-black background -VH
+* modify color-style initialization to avoid passing -1's as attribute codes
+ which would happen if the lynx.lss file was not found, or if not all styles
+ were set in that file. Also if lynx.lss is not found, initialize the
+ predefined styles to match those in samples/lynx.lss -TD
+* modify handling of empty values for radio and checkbox fields to avoid
+ sending "on" as the value (reported by Janne Peltonen <jkhp@cc.hut.fi>) -KW
+* don't double backslash characters in HTQuoteParameter(), since that changes
+ the string a program invoked through system will see. Note this assumes UNIX
+ or POSIX interpretation of single-quoted strings by the shell -KW
+* implement first draft of command-completion using popup menu for selection.
+ Pressing tab twice in the prompt for command or URLs will display a sorted
+ list of the choices -TD
+* implement a simple parser for Lynx commands which are normally bound to keys
+ using KEYMAP. This is bound to ':', so you can for instance type ":quit" to
+ exit. The parser allows unique abbreviations, so ":q" is equivalent to
+ ":quit" -TD
+* consolidate/simplify logic for displaying popup menus -TD
+* rewrote tab-completion to use an HTList -TD
+* move related logic into LYSubwindow() to reduce clutter - TD
+* make $(DESTDIR) variable work for po directory -TD
+* update bundled intl directory to match gettext-0.10.35 (except for fixes to
+ build scripts) -TD
+* modify configure macro CF_CURSES_LIBS to use a different order for library
+ checks if it has found ncurses header files (i.e., they are installed as
+ /usr/include/curses.h). This is done to fix an problem where there are two
+ versions of the curses/ncurses libraries installed, and the "curses" library
+ is not ncurses (from a report by Sergei Pokrovsky <pok@nbsp.nsk.su>) -TD
+* fix for configure script from dialog: If we really do not use included intl,
+ suppress the command that would attempt to symlink the two copies of its
+ header -TD
+* updates for config.guess, config.sub from tin -TD
+
+2000-06-23 (2.8.4dev.4)
+* modify handling to EXTERNAL settings by adding a new field in lynx.cfg. When
+ TRUE, then activating (using arrow-right for example) the link with URL
+ matching the one specified by 'prefix' field will be equal to pressing '.' on
+ it -VH
+* restore commented-out "clearok(curscr, TRUE)" in display_page() in GridText.c
+ to workaround problem repainting multibyte characters (reported by Takuya
+ ASADA <asada@isoternet.org>) -KW
+* add HIDDEN_LINK_MARKER entry to lynx.cfg, allowing user to specify string to
+ mark hidden links with (thus hidden links become non-hidden, thus they won't
+ be listed as hidden in the 'l' page) - the name of the setting is
+ hidden_link_marker. If the string to mark with is empty, then old behaviour
+ is restored -VH
+* implement "change directory" command. This is tested only on linux. It's
+ bound to 'C' in both modes (before this in normal modem COMMENT command was
+ bound to 'c' and 'C' in normal mode, and CREATE was bound to 'c' and 'C' in
+ dired mode). The main purpose of this command is not to type the name of the
+ directory when 'p'rinting to files and 'd'ownloading. If this command is
+ invoked in dired mode, the listing of destination directory will be
+ automatically loaded. Dired file operations menu lists this command too as
+ the first item. To disable it, comment the line
+ #define SUPPORT_CHDIR
+ in userdefs.h -VH
+* add definitions to allow slang configuration to implement scrollbars. This
+ will not work for any termcap/terminfo-based systems, appears specific to
+ MS-DOS (patch by Gisle Vanem)
+* updates for config.guess, config.sub from tin -TD
+* fix typo in CF_CHECK_ERRNO configure macro (reported by John Coyne
+ <John.Coyne@ctbto.org>) -TD
+* add <html> and </html> around generated HTML in HTGopher.c, LYKeymap.c,
+ LYCookie.c and LYCgi.c to make them more-correct. Did not modify
+ LYBookmark.c because the logic there relies on appending to the bookmark file
+ (report by Patrick Boylan <pboylan@island.net>) -TD
+* make pretty_html() in LYKeymap.c quote ampersand and quote, simplified logic
+ as well with LYKeycodeToString() implemented for command-logging -TD
+* add command-line options -cmd_log and -cmd_script, to provide a simple
+ command logging and scripting facility -TD
+* minor correction to -stdin option, add newline at the end of each line
+ copied -TD
+
+2000-06-02 (2.8.4dev.3)
+* initial support for SOURCE_CACHE_FOR_ABORTED -VH
+* change default_keypad_mode_fun() to use config_enum() -TD
+* modify config_enum() to check if the given name in lynx.cfg is ambiguous,
+ matching more than one name -TD
+* in passive ftp mode (FTP_PASSIVE:TRUE), use the IP address from the server's
+ response for the data connection, rather than doing another lookup of the
+ hostname -KW
+* correct bug introduced in dev.2 for leading whitespace in mailcap (reported
+ by Andrey Chernov) -VH, TD
+* change server types in HTFTP.c to an enum -TD
+* handle a "215 Windows2000" response from "SYST" command (Gisle Vanem)
+* change return value of parse_arg() when processing non-option data to make
+ URL in stdin (after '-') treated in the second pass, restoring behavior lost
+ in cleanup (reported by Gisle Vanem) -TD
+* allow blank as a separator in arg_eqs_parse() in addition to ':' and '=',
+ to restore behavior lost in cleanup of argument parsing -TD
+* make -stdin option a little more flexible by ifdef'ing primarily based on
+ ttyname(), and adding fallback definitions for Win32 and VMS -TD
+* for slang configurations past 1.3.6, call SLsmg_touch_screen() in
+ start_curses to ensure that the screen is properly initialized for noce
+ terminals -JED (John E Davis)
+* move call on lynx_initialize_keymaps() for slang configuration into the
+ start_curses() function, avoiding premature reference to $TERM, especially
+ when Lynx is running in dump mode, e.g., via cron (report by Hamish Moffatt
+ <hamish@rising.com.au>, analysis by KW) -TD
+* correct logic for ^ and $ commands (FIRST_LINK and LAST_LINK) when the
+ current line happens to be the first or last line on the screen (reported
+ by KW) -TD
+* remove unused fragments of backspace logic from print_crawl_to_fd() -TD
+* modify print_wwwfile_to_fd() and print_crawl_to_fd() to refrain from emitting
+ an offset for empty lines -TD
+* modify print_wwwfile_to_fd() to refrain from emitting backspaces when
+ the is_reply parameter is true -TD
+* add traces for argument parsing, as well as an environment variable
+ LYNX_TRACE which has the effect of the -trace option -TD
+* add configure check for ttyname, used in ifdef's for -stdin option -TD
+
+2000-05-21 (2.8.4dev.2)
+* minor changes to HTInit.c to make it more tolerant of leading whitespace
+ in mailcap entries (reported by Sven Guckes <guckes@math.fu-berlin.de>) -TD
+* add option -stdin, which tells Lynx to read the startfile from standard
+ input -TD
+* simplify argument parsing in LYMain.c, moving the special cases into the
+ table-driven logic by adding a flag that denotes the argument parsing phase
+ that applies -TD
+* correct duplicate description of JUMPFILE in lynx.cfg -TD
+* refine cfg2html.pl changes to use command-line options to control the
+ sorting and marking features, as well as make the script work properly if
+ the markup data is not given -TD
+* moved entry for lynx.cfg setting "viewer" according to the alphabet in
+ LYReadCFG.c:Config_Table -VH
+* modify cfg2html.pl to mark unavailable options, and to provide for sorting
+ the options in body.html -VH
+* update NLS configure script macros using CF_BUNDLED_INTL from tin, etc. -TD
+* update utmp configure script macros from xterm -TD
+* fix (from tin) to autoconf macro AM_WITH_NLS to fix a case where it would
+ refuse to build with non-GNU gettext -TD
+* modified autoconf macros CF_HEADER_PATH and CF_LIBRARY_PATH, to look in more
+ places for the specified files, including $HOME -TD
+* remove intl/libintl.h since it is overwritten by a symbolic link (reported
+ by Atsuhito Kohda <kohda@pm.tokushima-u.ac.jp>) -TD
+* correct a few tests in configure script which must allow inclusion of either
+ ncurses.h or curses.h, otherwise color-style cannot be configured (reported
+ by Frederick Bruckman <fb@enteract.com>) -TD
+* move logic that makes subdirectory for more-secure temporary files into
+ LYOpenTemp() where it can perform that action on demand rather than for all
+ invocations of lynx. Further refine this logic by ensuring that the umask is
+ set to allow execution permissions on the subdirectory (fixes problems
+ reported by Michael Abraham Shulman <mas@kurukshetra.cjb.net> and KW) -TD
+
+2000-05-05 (2.8.4dev.1)
+* use built-in LYCopyFile logic for CYGWIN rather than external cp program -DK
+* minor refinement to LYValidateFilename() to avoid prepending a drive
+ letter when saving files via the PRINT command on DOS systems -DK
+* update URLs in lynx_help_main.html (Frederic L W Meunier)
+* update description in INSTALLATION dealing with passive ftp (report by
+ Frederic L W Meunier) -TD
+* correct ifdef'ing in LYtouchline() for VMS curses versus slang (report by
+ Jerome Lauret) -TD
+* correct an overlooked change of ifdef's from
+ CONV_JISX0201KANA_TO_JISX0208KANA to CONV_JISX0201KANA_JISX0208KANA -TH
+* move include of LYClean.h in LYexit.c to ensure that cleanup_files() is
+ prototyped on VMS (report by Jerome Lauret) -TD
+* move assignment of HadVMSInterrupt in cleanup_sig() to avoid interaction with
+ logic in HTConfirmDefault() on VMS (reported/tested by Jerome Lauret) -KW
+* minor fixes to lynx.man / lynx.hlp for descriptions of -get_data, -post_data,
+ -short_url -KW
+* avoid invalid memory access that can result from redirection messages
+ that include a fragment in the new URL -KW
+* change sed delimiter in makefile.in from '%' to '"', to work around SINIX
+ v5.43 (SYSV4) sed which becomes confused by nested '%' in expression for
+ htmlized cfg install (reported by Shishakov Vjacheslav
+ <shishako@avn.skiftel.ru>) -TD
+
+2000-04-23 (2.8.3rel.1)
+* replace LYNX_RELEASE variable in userdefs.h by functions LYVersionIsRelease()
+ and LYVersionStatus() in LYShowInfo.c -TD
+* remove symbol LYNX_RELEASE_DATE, use same format for both development and
+ release dates -LP
+* remove po/ChangeLog -LP
+
+2000-04-22 (2.8.3pre.8)
+* update option_help.html to describe the Visited Pages settings -TD
+* correct order of body_attr[] and button_attr[] in HTMLDTD.c -TD
+* correction for IMG attributes in HTMLDTD.c -KW
+* tweak form-based options menu: General Preferencies now has User Mode,
+ Editor, Searching type and Cookies (suggested by PW). Correct misspelled
+ gettext'ed message, introduced in pre.7 -LP, DK
+* note in configure --help and INSTALLATION that color-style is implemented
+ for various curses libraries but not slang -TD
+* add a note to INSTALLATION describing how to disable the telnet application
+ when configuring Lynx -TD
+2000-04-19 (2.8.3pre.7)
+* move initialization of WATT-32 "sock_init()" code in LYMain.c so it precedes
+ Lynx's code to setup SIGINT handler, since WATT-32 installs a SIGINT handler
+ as well. This makes Lynx's handler the default again -DK
+* correct handling of CHARSET attributes on LINK and A. Basically this reverts
+ back to original 2.7.2ac logic -KW
+* enable handling of CHARSET attributes on LINK - it was disabled, probably
+ accidentally -KW
+* prevent CHARSET attributes from modifying the charset assumption for the
+ _current_ document -KW
+* correct errors in HTML.c that could result in infinite loop (iteration
+ counter was not incremented) -KW
+* revert one strcpy -> StrAllocCopy change - see added comment in LYCgi.c -KW
+* correct limit of formatted string in status_link() -KW
+* change NO_FILE_REFERER default to TRUE (i.e., do not send local file name
+ in the referer field unless explicitly specified by the user) -LP, KW
+* implement a workaround for gettext'd ADVANCED_COOKIE_CONFIRMATION to make
+ it consistent with HTConfirmDefault(), fixes Debian #62105 -TD
+* clarify/expand notes in lynx.cfg dealing with USE_MOUSE (from comments by
+ Morten Bo Johansen <mojo@image.dk>) -TD
+* noted glibc 2.1.3 bug in PROBLEMS -TD
+* reorganize forms-based options menu: options are now grouped by sections in
+ a more logical way (design by KW). (BTW, it is now more aligned with
+ htmlized-cfg cattoc.html). Help files changed accordingly. A few gettext'ed
+ messages were changed -LP
+* add ifdef's (USE_BLAT_MAILER and USE_ALT_BLAT_MAILER) and corresponding code
+ for blat vs blatj mailer (request by Victor Schneider) -TD
+* update Lynx FAQ locations -JES
+
+2000-04-17 (2.8.3pre.6)
+* change version number in remaining documentation to 2.8.3 -TD
+* remove redundant defines for SUPPORT_MULTIBYTE_EDIT and COLOR_TABLE from
+ DOS/Win32 makefiles -TD
+* small change to configure test for REAL_UNIX_SYSTEM to accommodate linkers
+ that allow assignment from a nonexistent extern. Also, change a few UNIX
+ symbols in LYCurses.c and LYUtils.c to REAL_UNIX_SYSTEM to build on platforms
+ that do not define this symbol -TD
+* update notes in LYMain.c and LYReadCFG.c regarding the options and config
+ variable tables, which no longer need to be sorted -TD
+* htmlized lynx.cfg: add .h2 RULESFILE, remove confusing .h1 header -LP
+* define SUPPORT_MULTIBYTE_EDIT in userdefs.h -TH
+
+2000-04-13 (2.8.3pre.5)
+* fix printing of Last-Modified field in downloaded/printed source -LP
+* update URL for RFC 1942 -LV, DK
+* update Subir Grewal's Lynx links URL to the newest location
+ http://www.trill-home.com/lynx.html -LV, TD
+* move assignment to donelookup in LYGetHostByName() to avoid race with
+ CreateThread() -Alexei Anatski
+* modify LYexecv() in LYLocal.c for MINGW32 -SH, Victor Schneider
+* re-correct logic for .h1 comments in cattoc.html by cfg2html.pl (reported
+ by LP) -TD
+* move call to cleanup_files() into LYexit(), to fix stray temporary directory
+ left, e.g,. when doing "lynx -version" -TD
+
+2000-04-11 (2.8.3pre.4)
+* add to logic of --with-charsets configure option, checking for charset names
+ that happen to be built-into UCdomap.c rather than defined via .tbl files
+ in src/charsets (reported by HN) -TD
+* correct missing extern in CF_SLANG_UNIX compile-test -TD
+
+2000-04-06 (2.8.3pre.3)
+* remove definitions for NCURSES and NCURSES_VERSION from top-level makefiles
+ that really use PDCurses -TD
+* add USE_MOUSE symbol: cleanup/simplify ifdef'ing of mouse code,
+ replace USE_SLANG_MOUSE / NCURSES_MOUSE_VERSION / PDCURSES_MOUSE_VERSION
+ with USE_MOUSE (and modifier when necessary) -LP
+* windows makefiles: add new symbols SOURCE_CACHE and USE_PRETTYSRC,
+ remove obsolete EXP_CHARTRANS and unused EXP_CHARTRANS_AUTOSWITCH -LP
+* fixed a bug with psrcview on lss-enabled lynx. Code such as <a blah href=.>
+ (i.e. unknown attribute and then some other attribute) was causing calls to
+ PSRCSTOP(barattr) twice (and lynx was switched to "non-preformatted" mode
+ losing all white spaces of the document after that piece of code) -VH
+* add configure option --with-screen=pdcurses, mainly for checking ifdef
+ conflicts between ncurses and pdcurses. This builds/runs with the PDCurses
+ X11 library, but is not recommended for general use -TD
+* remove test-artifact in configure check for zlib.h -TD
+* add CF_SLANG_UNIX configure macro, to allow slang configuration to build on
+ AIX, etc., (reported by Jens Schleusener <Jens.Schleusener@dlr.de>) -TD
+* update CF_CURSES_LIBS macro from CDK fixes, adds a special check for HPUX
+ 11.x -lcur_colr library -TD
+
+2000-04-02 (2.8.3pre.2)
+* fixed problem with charset handling for SOURCE_CACHE:MEMORY - if the charset
+ was specified by Content-Type http header it won't be lost (as it was) when
+ reparsing from source cache (applies to toggling DTD, switching to srcview,
+ and other stuff like *,' etc) -VH
+* add ifdef'd call for creat() for Borland C configuration in LYExecv(), as per
+ JES report -TD
+* remove definition of NCURSES_MOUSE_VERSION from makefile.bcb and
+ makelynx.bat, which should fix compile problem reported by JES -TD
+* move a small number of gettext definitions into LYMessages_en.h to allow
+ removing the associated files from POTFILES.in, which must not be larger
+ than 1023 for Solaris (reported by JES) -TD
+* improve ifdef's for fallback definitions of getattrs(), getbegx(), getbegy()
+ and getbkgd() in LYCurses.h since they may be functions rather than macros
+ (reported by PG on os390) -TD
+* further restrict tildeExpand() so it allows embedded "~" only if it follows
+ a slash, or is the first character -TD
+* add check for "~" as the path to be expanded in tildeExpand() (fixes problem
+ reported by Frederic L W Meunier when TEMP_SPACE was defined to "~") -TD
+
+2000-03-31 (2.8.3pre.1)
+* remove annoying trailing period from two statusline messages ending with host
+ name ("Looking up host.foo:81." and "Making HTTP connection to foo.bar.") -LP
+* lynx.cfg: use two lines to separate options description in this
+ configuration file (it looks more readable, for such a huge text) -LP
+* lynx.cfg: make a few corrections to reorganize .h1 sections to improve
+ htmlized cattoc.html logic. More corrections welcome -LP
+* fix some compiler warnings for DECC dealing with time_t being unsigned in
+ that environment (reported by Jerome Lauret) -TD
+* suppress Multinet prototypes in socket.h, to work around some places where
+ Multinet declares parameters a void* while DECC uses char* (patch by Jerome
+ Lauret <JLAURET@mail.chem.sunysb.edu>).
+* undo side-effect of config_enum() function in LYReadCFG.c from cleanup in
+ dev.22 which made default_user_mode and source_cache values not set properly
+ (reported by Alexei Anatski <alexei.anatski@srm.ru>) -TD
+* correct ifdef's in LYStrings.c for NCURSES_MOUSE_VERSION versus PDCURSES
+ adding new PDCURSES_MOUSE_VERSION to cover special case of DJGPP (reported by
+ LP, DK) -TD
+* add PRETTYSRC to lynx.cfg, supplementing -prettysrc commandline option -TD
+* add call to LYStoreCookies() from HTFWriter.c to save cookies when -source is
+ used (patch by KW)
+* remove const from LYGetHostByName() parameter -TD
+* modify makefile.in to ensure links within htmlized lynx.cfg are updated
+ if gzip-help is configured (reported by Ari Moisio) -TD
+* remove -DEXP_CHARTRANS from makefile.msc, makefile.bcb (reported by LP) -TD
+* trim trailing path-separator from lynx_temp_space before removing that
+ directory, on exit -TD
+* ifdef'd IsOurFile() to perform only an ownership check on single-user DOS
+ and OS/2 systems, so user can overwrite files -TD
+* simplified some initialization in LYMain.c with tildeExpand() -TD
+* change prototypes of HTSetPresentation(), HTSetSuffix5() to use double rather
+ than float, since this is the default promotion, working better with some
+ compilers -TD
+* add comments to makefile.msc to show how to build color-style version -TD
+* add fallback definition for getattrs(), move fallback definitions for
+ getbegy() and getbegx() in LYCurses.h to allow building color-style version
+ with PDCurses -TD
+* correct a call on lib$find_file() in HTVMSUtils.c which broke by not
+ supplying it with a fixed-size buffer, from dev.23 changes -TD
+* correct an out-of-range indexing error in LYstatusline_messages_on_exit(),
+ and add a check in to_stack() for a similar problem -TD
+* add definitions and description of USE_TH_JP_AUTO_DETECT,
+ CONV_JISX0201KANA_JISX0208KANA, and KANJI_CODE_OVERRIDE to userdefs.h, along
+ with a new file README.jp -TH
+
+2000-03-26 (2.8.3dev.23)
+* make -nounderline option apply to overloading of colors 4 & 5 with
+ underlines, in slang configuration -TD
+* on initialization, check if the LYNX_TEMP_SPACE denotes a directory which
+ we cannot easily determine if someone could alter our temp-files. If so,
+ make a subdirectory of that, with appropriate permissions -TD
+* disable setuid on initialization -TD
+* add a definition USE_MKSTEMP in userdefs.h which supersedes EXP_RAND_TEMPNAME
+ for sys-admins who believe in mkstemp() -TD
+* change logic for EXP_RAND_TEMPNAME to avoid allowing fmt_tempname() to return
+ the same name during a session. Define EXP_NAME_TEMPNAME in userdefs.h -TD
+* add Last-Modified header into the printed/downloaded source, in addition to
+ the Date header (it is there for years). (Last-Modified field will not be
+ printed if it is not present, or equal to the Date header or equal to
+ "Thu, 01 Jan 1970 00:00:01 GMT", a common mistake in scripts) -LP
+* defined DIRED_SUPPORT in makefile.msc -TD
+* several small fixes in LYLocal.c for dired support, mostly win32-specific -TD
+* modify PDCurses mouse logic to use BUTTON_PRESSED mask rather than
+ BUTTON_CLICKED, since the latter appears to not work in PDCurses 2.4 -TD
+* modify HTDirTitles() to fix a couple of cases for device-only pathnames,
+ e.g., for DOS -TD
+* modify HTDOS_name() to put a trailing '\' on the result if only a device
+ is given. Fix a memory leak in HTDOS_name() -TD
+* simplify local_dired() using new function match_op(), adding DOSPATH
+ and __EMX__ to special case of stripping a leading '/' from parameter so
+ dired mode works properly on Win32 and OS/2 EMX -TD
+* minor cleanup using new function LYformTitle() -TD
+* modify LYUCPushAssumed to push original assume_charset instead of
+ anchor_UCI->MIMEname when HTCJK is JAPANESE. If this modification isn't
+ done, Japanese strings may be mishandled when charset is not specified or
+ assumed as Japanese charset. On the other hand, if this modification IS
+ done, the specified charset is ignored when HTCJK is JAPANESE.
+ # I think it's long way to improve this completely. It rarely
+ # causes small problem in source view mode for Japanese document.
+ # I think it can be ignored -TH
+* improve handling of Japanese titles in List Page, LYNXIMGMAP Page and
+ ShowInfo Page -TH
+* remove spurious backslashes in sed script for adjusting link to htmlized
+ lynx.cfg -Michael Warner
+* add -luser32 library for Cygwin configuration, needed for WIN_EX ifdefs -DK
+* correct some screen handling problems when built with SLang -DK
+* updated the INSTALLATION file to reflect building under Cygwin -DK
+* define WIN_EX and _WINDOWS_NSL for Cygwin configuration -DK
+* use select_s() from WATT-32 for the DJGPP port, rather than select() from
+ DJGPP (suggested by Gisle Vanem, to make it faster) -DK
+* add a configure check CF_SET_ERRNO to check if we really can set errno,
+ even if it has been #define'd -TD
+* remove a redundant call to HTQuoteParameter() from LYExtern.c, which resulted
+ in quoted-quotes (reported by Michael Warner) -TD
+* add configure check for syslog.h, in case --enable-syslog is given for a
+ machine that doesn't support it -TD
+* add ASSUMED_COLOR variable to lynx.cfg, making the use of
+ assume_default_colors() optional (addresses reports by LV, IC) -TD
+* add a configure check for the compiler option needed to find zlib.h, e.g.,
+ if it is in /usr/local/include and the compiler is not gcc -TD
+* disentangle some of the PDCurses ifdef's from ncurses, including the mouse
+ handling. The symbol PDCURSES should be used for PDCurses, not NCURSES*
+ or DOSPATH -TD
+* remove unused getline.c, getpass.c, crypt.c and crypt_util.c -TD
+* change ifdef's in LYisAbsPath() and LYisRootPath to make OS/2 EMX treated the
+ same as DOSPATH -TD
+* review use of strcat/strcpy, changing as needed to avoid buffer overflows -TD
+
+2000-03-12 (2.8.3dev.22)
+* modify Home_Dir() so that on DOS & Windows, if the $HOMEDRIVE variable is
+ set, it may be used to specify the drive on which $HOME is located -TD
+* add configure option --enable-htmlized-cfg to install the htmlized lynx.cfg
+ in the help directory (request by LP) -TD
+* suppress sleep's in crawl or traversal mode (request by LV) -TD
+* cleanup LYReadCFG.c, LYrcFile.c a little, using new functions putBool,
+ getBool, putEnum and getEnum -TD
+* change default mode for visited-links-page to match original behavior, add
+ visited_links to .lynxrc file (requests by KD, LP) -TD
+* update documentation to reflect move from sol.slcc.edu to lynx.isc.org -PG
+* remove obsolete files: WWW/Copyright.txt (replaced by FreeOfCharge.html) and
+ WWW/README.txt (recommended by DK) -TD
+* clean up some of the loose ends, primarily in documentation. A Russian user
+ pointed out that the DOS binary was ignoring character 0xe0. This turned out
+ to be a bug in the PDCurses code for DOS. I modified the INSTALLATION file
+ to reflect the patch to PDCurses. Also include the file for the public
+ domain release of the CERN wwwlib code (FreeOfCharge.html). Other changes
+ fix dead links, Y2K changes, and reflect newer versions of other programs -DK
+* comment-out/disable NO_ANONYMOUS_EMAIL definition in userdefs.h -DK
+* change optimization level to -O1 in makefile.dos -DK
+* use macro set_errno() to hide some of the clutter in HTTCP.c as well as make
+ it simpler to build with threaded libraries -TD
+* ifdef'd out a "QUIT" command sent to the FTP server immediately after opening
+ a data connection in HTFTPLoad(), since this makes the ftp.wku.edu server
+ close the connection prematurely -TD
+* combine redundant HTMake_VMS_name() with HTVMS_name() -TD
+* review use of "%s" in sprintf, to guard against buffer overflows, modified
+ some to use HTSprintf0 or StrAllocCopy, others to use specific lengths
+ (KW noted a related problem in HTTP.c) -TD
+
+2000-02-25 (2.8.3dev.21)
+* modify check for empty news-posting to warn but allow user to override if
+ it contains nonspace characters -TD
+* add FTP_PASSIVE option to lynx.cfg, allowing installer to defer decision
+ of whether lynx uses passive ftp connection (adapted from patch by
+ Bernhard Rosenkraenzer <bero@redhat.de>) -TD
+* remove duplicate definitions of HT_NON_BREAK_SPACE, HT_EN_SPACE leaving them
+ in HTFont.h -TD
+* lynx.cfg option CONNECT_TIMEOUT and commandline option "connect_timeout" were
+ added (not available for DOS port) -VH
+* don't perform submission of the content of disabled form fields -VH
+* add bindings for ^ and $ (like vi) to move the cursor to the first and last
+ link on the current line (prompted by complaint by DH that < and > used to
+ allow movement to the ends of a line) -TD
+* remove --enable-kanji option (request by TH) -TD
+* replace 3 CONV_JISX0201KANA_ISX0208KANA to CONV_JISX0201KANA_JISX0208KANA -TH
+* enable the routines to change kanji code which is used for overriding,
+ since my last change disabled this -TH
+* remove redundant/conflicting definitions of ON/OFF from HTVMS_WaisUI.h -TD
+* fixes for K&R build on SunOS -TD
+
+2000-02-15 (2.8.3dev.20)
+* ifdef fixes for CYGWIN, broken in dev.19 -TD
+* add make-msc.bat script, and update src/chrtrans/makefile.msc to add rules
+ for generating header files -TD
+
+2000-02-14 (2.8.3dev.19)
+* use HTAddParam/HTEndParam rather than HTSprintf0 for building external
+ commands, protecting against badly-formatted string with more than one %s
+ (reported by PW) -TD
+* update placeholder po/nl.po -JES
+* add configure option --enable-kanji for defining symbols related to TH's
+ patch -TD
+* improved handling of Japanese text (patch by TH (Hataguchi Takeshi)):
+ + if Japanese document's charset is specified explicitly by the MIME tag or
+ HTTP responses, Lynx will assume the charset as that value.
+ + change the Japanese charset detection strategy when charset is not
+ specified explicitly.
+ + wrap a long text which includes only CJK characters in source mode.
+ + avoid writing CJK characters at the 80th column.
+ + improve kanji code override routine
+ # My change seems to have broken this
+ + change the phrase "half width kana" to "JIS x0201 Kana" in comments.
+ # The latter has been used originally.
+ + enable assume_charset when display charset and assume charset
+ are Japanese. assume_charset acts like charset by META tag
+ only when charset isn't specified by META nor HTTP responses.
+ + change the behavior of the option menu.
+ For example, when display charset is Japanese (EUC-JP) and
+ CJK mode is on, changing assume_charset from iso-8859-1 to
+ shift_jis using the option menu,
+ old behavior:
+ assume_charset won't be changed.
+ CJK mode will turn off.
+ new behavior:
+ assume_charset will be changed to shift_jis
+ CJK mode won't be changed.
+ + improve handling Japanese in Visited Links Page, History Page
+ and pages with FORM.
+ New macros are:
+ USE_TH_JP_AUTO_DETECT
+ enable (2)
+ CONV_JISX0201KANA_JISX0208KANA
+ convert JIS X0201 Kana to JIS X0208 Kana,
+ i.e. convert half width kana to full width.
+ I've not tested the case not to define this well.
+ KANJI_CODE_OVERRIDE
+ enable kanji code override routine.
+ The code can be changed by ^L.
+ More precisely, this enables us to change the assumption kanji
+ code for the document. This assumption overrides the charset
+ by META tag and HTTP responses.
+* ensure lynx_doc is writable when doing install, since it is not necessarily
+ done as root -TD
+* simplify/correct ifdef'ing in reply_by_mail() -TD
+* add ifdef CANNOT_PIPE_MAIL to simplify ifdef'ing for systems having mailers
+ that we can pipe to versus those that we cannot -TD
+* add ifdef USE_BLAT_MAILER to simplify & make consistent ifdef'ing for
+ blat mail program -TD
+* correct ifdef'ing in mailform() for Unix (report by LV, analysis by KW) -TD
+* tweak lynx.cfg for better cfg2html.pl output -LP
+* fix DOS makefiles for recent renaming USE_PSRC -> USE_PRETTYSRC.
+ Also, change optimization flag to -O1: having experience with slow
+ 386 machine I see no visible difference in speed at run time, but this
+ makes compilation much faster and takes less memory. Tweak INSTALLATION
+ file accordingly -LP
+* ifdef'd feature for generating random temporary filenames with
+ EXP_RAND_TEMPNAME -TD
+* remove duplicate S_xxx definitions from LYLocal.h, already in www_tcp.h -TD
+* add note about building with Visual C++ -TD
+* ifdef'd reference to current_codepage in LYCurses.c with PDCURSES_EXP
+ rather than PDCURSES, since this variable is not found in any release
+ version of PDCurses -TD
+* several small fixes/adjustments to reduce warnings from lint-like program
+ 'antic' -TD
+* fixes to compile on VMS with UCX -TD
+* change LYRemoveTemp() to return a value, needed for VMS -TD
+* rename intl/po2tbl.sed.in to intl/po2tbl.sed_in, to allow unzip on VMS -TD
+* correct HTSetSuffix/HTSetSuffix5 for VMS build (reported by Dan W Olds
+ <oldsdw@wofford.edu>) -TD
+* resync autoconf macros, from tin -TD
+
+2000-01-06 (2.8.3dev.18)
+* correction to LYCookieSavefile so tilde expansion is done (reported by Larry
+ Virden) -BJP
+* now it's guaranteed that LY_SOFT_NEWLINE could be only 0th character in
+ line->data (it could be preceded by LY_*_START_CHAR). Bug that caused
+ empty lines to disappear when printing files was fixed -VH
+* comments are now correctly converted to display charset in prettysrc mode -VH
+* fix "Please see" array initialization in cfg2html.pl (reported by VH, LP) -TD
+* small userdefs.h typo fixed -VH
+* added lynx.cfg setting that controls justification - maximum value for
+ ratio of 'spaces to spread'/'max width of a line' when justification can
+ take place -VH
+* change "PSRC" to "PRETTYSRC" in configuration (suggested by KW) -TD
+* combine a dozen of HTMLSRC_ lynx.cfg settings into PSRCSPEC setting. Old
+ "HTMLSRC_foo:bar1:bar2" should be written as "PSRCSPEC:foo:bar1:bar2" -VH
+* use assume_default_colors() extension from upcoming ncurses 5.1 and related
+ support to provide more flexible coloring. If the user's configuration files
+ do not specify "default", the default-color support is suppressed, and the
+ displayed colors default to white/black. The original behavior matches
+ SVr4 curses, which assumes the default colors of the screen but does not
+ ensure that they match the assumption -TD
+* modify LYsetXDisplay() to permit $DISPLAY to have an empty value, and reuse
+ logic in forms-options from menu-options as validate_x_display() and
+ summarize_x_display(). The forms-options will not display a warning since it
+ exits too early, but at least one may now reset $DISPLAY to an empty string
+ (reported by KW) -TD
+* add note in INSTALLATION pointing to aclocal.m4 for details of regenerating
+ configure script -TD
+* add stub "po" gettext for Czech language, update other stubs -JES
+* undo dev.16 change to print_wwwfile_to_fd() logic for LY_SOFT_NEWLINE which
+ resulted in dropping blank lines from printed files -TD
+* make off by one correction in HTDisplayPartial line counting (as discussed
+ with LP) -KW
+* one invalid memory free (only reached in some (rare?) error case), two
+ memory leaks removed in LYLocal.c -KW
+* date calculations for file times in FTP directory listings used cached values
+ for the current day and year that never got reset. This could cause wrong
+ ordering when sorting by date, and possibly other errors, especially in
+ long-running lynx sessions. Now recalculate them for each new directory
+ request if they are needed -KW
+* be slightly more tolerant about FTP directory listing file times that appear
+ to lie in the future: allow today plus one day without assuming that it must
+ mean a year ago, to account for possible timezone differences -KW
+* add comment to reload_read_cfg() listing things that are/aren't done -LP
+* minor lynx.cfg corections for better cfg2html.pl output -LP
+* restore 'from_source_cache' PRIVATE to LYMainLoop.c, add comments -LP
+* amend dev.16 feature for generating random temporary filenames to ensure that
+ Lynx does not currently have the generated name open as a temporary file -TD
+
+1999-12-15 (2.8.3dev.17)
+* add a caution to jumpsUnix.html -PW
+* ifdef LYEditKeyForAction() to compile when EXP_ALT_BINDINGS is not defined
+ (reported by VH) -TD
+* add 3-valued DEFAULT_KEYPAD_MODE to lynx.cfg -TD
+* revert DEFAULT_KEYPAD_MODE to NUMBERS_AS_ARROWS (consensus) -TD
+* add COOKIE_SAVE_FILE lynx.cfg and corresponding command-line option, default
+ it to /dev/null, which is recognized on all systems -BJP
+* correct typo in declaration of LYLeakSAVsprintf() -Michael Warner
+* remove from_source_cache_p parameters in LYMainLoop.c (request by LP) -TD
+* documentation updates covering the Options Menu & other changes omitted
+ previously -PW
+* small correction in TRSTable.c: One of my previous changes for TRST broke
+ inheritance of alignment for cell contents from TR elements -KW
+* new functions for keeping track of temp files (and some other files) for user
+ interface pages: LYRegisterUIPage(), LYIsUIPage(). Most checks that look at
+ the loaded document's title have been replaced by this mechanism. This also
+ replaces various mechanism that were implemented for some specific pages -KW
+* also replaced some more checks that looked at the document's title by checks
+ of the address, for pages that are always identified by a special URL scheme
+ (LYNXCOOKIE:, LYNXKEYMAP:, LYNXMESSAGES:) -KW
+* now check directly in postoptions() whether the loaded document is one from
+ which submission of option changes can be accepted, using the new tracking
+ mechanism. Only the form-based Options Menu and Visited Links are allowed.
+ Relying on a good random generator to prevent spoofing is not necessary.
+ Kept the secure_string check, but it should be only regarded as an aid to the
+ user, it prevents changing options from an instance of the form-based Options
+ Menu that is not the most recent one (this can happen if an Options Menu page
+ is pushed on the history stack and later returned to) -KW
+* honor REUSE_TEMPFILES for some more user interface pages -KW
+* prevent an obscure LYNXOPTIONS://MBM_MENU crash -KW
+* other minor additions and corrections to checks for special pages -KW
+* changed INSTALLATION text for --enable-internal-links -KW, HN
+* changes to build dev16 with color styles on DJGPP/PDCurses 2.3
+ (you must uncomment a line in makefiles to build lynx that way) -LP
+* correct a missing check in HTML.c HTML_A case against force_empty_hrefless_a
+ (reported by KW) -VH
+* changed lines -> disp_lines, cols -> disp_cols in GridText.c -KW
+* don't reparse with SOURCE_CACHE if screen size changed only
+ vertically (disp_lines). Also don't reparse unnecessarily in
+ some cases of LYK_MINIMAL -KW
+* don't append (HEAD) to title for INFO screen if already present -KW
+* set newdoc.title to curdoc.title in LYMainLoop.c for SOURCE command.
+ Otherwise INFO could show the wrong document's title -KW
+* made global from_source_cache PRIVATE to mainloop -KW
+* reset DIRED_MENU item list when lynx.cfg is reloaded -KW
+* new lynx.cfg option AUTO_UNCACHE_DIRLISTS for Dired mode, see lynx.cfg -KW
+* prevent file descriptor and inode leak in HTFWriter.c that occurred if
+ the same resource is repeatedly downloaded (for 'd' or for passing to
+ a viewer) -KW
+* corrected logic for suppressing last HTDisplayPartial call at end of file,
+ after discussion with LP -KW
+* corrected line counting in HTDisplayPartial, taking into account offsets used
+ for the various variables being compared -KW
+* added confirmation prompt for reloading non-safe post_data documents in
+ form-based Options Menu change handling. Before this change, the prompt
+ would be issued after returning to mainloop() instead, with different
+ behavior if confirmation was denied: The document would be popped instead of
+ keeping the current instance -KW
+* function confirm_post_resub made PUBLIC and moved to HTAlert.c. New function
+ srcmode_for_next_retrieval in LYGetFile.c. Both used for the above and in
+ LYMainLoop.c -KW
+* fixed behavior for various post_data confirmation prompts in connection with
+ SOURCE_CACHE in LYMainLoop.c. Before this change, the user would be prompted
+ to confirm reloading, yet on confirmation reparsing from the source cache
+ would be attempted. So prompts were unnecessary and misleading -KW
+* try to handle some failures of errors in source cache reparsing better. Try
+ to make sure that unsafe post_data documents don't get reloaded accidentally
+ without confirmation if source cache reparsing fails. Treat partial data
+ (i.e. loading from source cache probably 'z'apped by user) as successful, as
+ HTLoadDocument does. (Various error conditions are currently only passed on
+ to the caller by HTParseFile, not by HTParseMem. I left this apparent design
+ decision unchanged.) -KW
+* source cache reparsing did not rewrite a previous cache copy when the
+ document was reloaded from the net. This means that e.g. NOCACHE or RELOAD
+ would force reloading from the network, but then on the next non-forced
+ loading of the document (e.g. by toggling to SOURCE view) the old (and
+ possibly stale) copy would again be used. Now the newer copy replaces the
+ old copy if loading is successful (and not interrupted or aborted with 'z').
+ (Note that RELOAD while in source view, at least in the normal one without
+ -preparsed or -prettysrc, does not have this effect since the document does
+ not get pushed through the cache writer at all in that case.) -KW
+* if a source cache copy for a document exists, we need a way to ensure that
+ reparsing from that copy does not try to rewrite that same copy "under our
+ feet" while still reading from it. Previously that was done by just never
+ rewriting an existing source cache. After changing that (see previous item),
+ a different approach is needed to prevent such collisions. This is now
+ solved in two ways: (a) Base a temporary new file or memory chunk for
+ writing, and only commit it to the doc's ParentAnchor object (replacing the
+ previous copy) at the end of the incoming data stream. This is done in
+ CacheThru_free(), but not in CacheThru_abort(), meaning that an interrupted
+ or otherwise aborted transmission will not replace an existing cached copy
+ with a truncated now version - as long as such interruption gets detected and
+ properly indicated, which is not the case for reading from the source cache
+ with SOURCE_CACHE:MEMORY in effect, see above. (b) Change the
+ HTParentAnchor's protocol field to indicate a non-HTTP protocol, before
+ starting to load from source cache in HTreparse_document(). Normally, as
+ long as DEBUG_SOURCE_CACHE is not defined, this prevents the cache writer
+ from (re)generating a cache copy. Mechanism (b) isn't necessary (everything
+ still works when DEBUG_SOURCE_CACHE is defined), it just avoids unnecessary
+ work -KW
+* source cache files and chunks were not always being removed when they should,
+ probably since change of 1999-06-18. A large number of cache copies could be
+ kept around unnecessarily wasting disk or memory space. Now make sure that
+ the source cache copy gets removed when a document is removed from the cache
+ of rendered docs. They would never be reused anyway. New function
+ HTAnchor_clearSourceCache. Note to other developers: HTAnchor_delete()
+ doesn't always remove the HTParentAnchor object, see its implementation -KW
+* detect errors during appending to the cache copy. Previously, memory
+ allocation errors (for SOURCE_CACHE:MEMORY) would cause program exit, and
+ file write errors (SOURCE_CACHE:FILE, e.g. if the temp disk space was full)
+ would go undetected and leave the cache file corrupt or truncated. Now allow
+ the program to continue normally, just cancel the source cache generation for
+ the current document (which may free up enough memory or disk space to remedy
+ the immediate problem). Produce an alert message. In the case of a file
+ error, produce the alert only once until a possibly re-reading of lynx.cfg,
+ since Lynx should remain otherwise functional in the face of cache file
+ writing errors -KW
+* extended HTChunk: added a variant for which memory allocation errors
+ are not fatal. Used for changes described in previous item -KW
+* don't write raw escape sequences to trace output for lynx-keymaps if
+ not using trace log file -KW
+* protect echo() in stop_curses, it could crash if stop_curses gets called
+ without preceding start_curses -KW
+* save size for regular files in anchor structure (we do the stat() anyway).
+ It shows up on INFO page as Content-Length. Also use it in partial display
+ mode to prevent the last call to HTDisplayPartial from HTFileCopy, since a
+ call to HText_pageDisplay will follow immediately. (But note that nothing
+ important depends on the correct size; should it be wrong, we lose at most
+ one partial display screen update. An equivalent suppression of the last
+ partial update for network protocols is not recommended, since (a) the size
+ is more unreliable and (b) the socket FIN may be delayed by the network.) -KW
+* split HTMIME_put_character into three functions -KW
+* made HTMIME.c handle folded header lines correctly (long-standing bug,
+ reported in February by Devid Coles) -KW
+ [ reference: http://www.flora.org/lynx-dev/html/month0299/msg00135.html ]
+* changed how HTTP redirection messages are handled. Don't read full message
+ and parse buffer for some header fields in HTLoadHTTP. Use common HTMIME.c
+ header parsing instead. Functions added/modified in HTMIME.c for storing
+ away the Location URL (if requested and found) and for stopping after the
+ headers. New private MIME types "message/x-http-redirection" and "www/debug"
+ to control this via HTStreamStack. Basic approach taken from newer W3C
+ libwww. Benefits:
+ - Removes actual bug that was reported: "Content-Location:" was falsely
+ recognized as "Location:". (long-standing bug)
+ [ reference: http://www.flora.org/lynx-dev/html/month1199/msg00370.html ]
+ - Removes potential other bugs caused by inferior header parsing in HTTP.c
+ (including Set-Cookie/Set-Cookie2).
+ - Should more header fields be needed in the future (also) for redirection
+ messages, we now get them automatically instead of having to add extra
+ code.
+ - Trace output now shows the same kind of info as for other responses.
+ In particular, Set-Cookie/Set-Cookie2 header fields will normally be
+ visible.
+ - Statusline progress messages now actually show the HTTP response line
+ as intended, and it is recorded for LYNXMESSAGES:. (Long-standing error,
+ previously what was shown could be an empty string, or arbitrary parts
+ of the response, including HTML markup from the message body.)
+ - Adding redirection support for lynxcgi would now be simpler (although
+ currently not done) -KW
+* HTErrorStream(), similar to W3C libwww, used in some cases for the above -KW
+* remove check in HTParse() dated 98/09/08 which prevented unescaping of 8-bit
+ data (reported by KW) -TD
+* refresh screen for TRST changes in partial display mode as early as possible.
+ This fixes a problem when the table finished below the screen bottom -LP
+* remove global Newline_partial, use LYGetNewline() instead -LP
+* adapt idea by VH as a Perl script cfg-html.pl which generates HTML form of
+ the lynx.cfg documentation -TD
+
+1999-11-30 (2.8.3dev.16)
+* added -nozap command line option -KW
+ - In its basic form, it disables all checks for 'z' or ^G or other
+ "immediate" keys that otherwise happen while processing a request (for name
+ lookups, before or during loading of a document). Note that it also disables
+ paging through an incompletely loaded document during "partial display".
+ Normally, i.e. without this option, key input gets "swallowed" or "used up"
+ by the quasi-asynchronous checks even if they are not 'z' etc. or keys that
+ have meaning during partial display (meaningless keys just get ignored).
+ With this option, key input only gets read when lynx is ready to act on it.
+ - This can be used (a) by people who like to always have predictable
+ type-ahead (and don't care for 'z'apping and partial display scrolling), (b)
+ to achieve predictable reaction to keys if lynx is used under some scripting
+ environment that feeds it input like expect, and (c) for scripting a lynx
+ session by feeding it keyboard-like character input via input redirection
+ from a file or pipe (a simpler alternative to b, without the need for expect
+ or similar).
+ - Point (c) could be called "poor man's scripting". Note that the input has
+ to be provided in a raw form (as lynx would see it when it is actually sent
+ by keys), including raw control characters and escape sequences if necessary.
+ This patch does not change anything in the way such input is read and parsed,
+ other that what is explicitly described here. (This paragraph is only here
+ to explain the context, it does not describe new features.) P.m.s. will only
+ work as expected if lynx, on a given platform and with the display library
+ chosen, uses standard input for reading keyboard input. This is the case
+ with ncurses and possibly other curses implementations, but not with slang,
+ on Unix-like platforms, and cannot work on platforms where lynx gets keyboard
+ input in the form of platform- or implementation-specific keycodes (DOS,
+ Windows - except with Cygwin?) instead of as an octet stream.
+ - The -nozap option takes an argument. The basic functionality as already
+ described gets invoked if the argument is not a specially recognized keyword
+ (it is suggested that -nozap=full or -nozap=all be used). The only
+ recognized keyword is "initially". With -nozap=initially, additional special
+ behavior is invoked the first time (and *only* the first time) when lynx
+ encounters an error or EOF when reading key input. (Currently this will not
+ get detected if slang with USE_KEYMAPS is used.) In this, case, -nozap
+ reverts to the default state ('z' will be checked for again). Under some
+ conditions are true (key input was taken from stdin, and stdin was not
+ connected to a terminal), lynx will then attempt to reopen stdin, connecting
+ it to a terminal (stdout, stderr, and the process's controlling tty are
+ tried, in that order - this is subject to change if something would be more
+ reasonable).
+ - The -nozap=initially special behavior will get triggered if input comes
+ from a file or pipe (p.m.s. above) when the provided characters are "used
+ up". Normally lynx should then just exit. The special behavior hands
+ control of the session to the interactive user instead at that point. All
+ code for -nozap is only compiled in if preprocessor symbol MISC_EXP is
+ explicitly defined.
+* ifdef'd some places for MINGW32 (diffs from Victor Schneider)
+* remove 'host' variable in LYGetHostByName() that obscured module-level
+ 'host[]' array in HTTCP.c for _WINDOWS_NSL configuration (patch by SH,
+ discussion by KW) -TD
+* the Newline variable is now PRIVATE except the mouse code in LYStrings.c -LP
+* modify HTDOS.c for Wattcp targets (Watt-32 and original wattcp). When Lynx
+ is sitting idle in getxkey() waiting for a keypress, no network functions are
+ called. Hence no sockets are processed, "ICMP Echo replies" is sent etc.
+ This patch has been tested with SLang and '-DDJGPP_KEYHANDLER' I'm not sure
+ how to hook into 'SLkp_getkey()' or keyboard polling in performed under raw
+ PDCurses (Gisle Vanem <gvanem@eunet.no>)
+* update docs for -tna instead of --sticky_inputs -KW
+* document extended KEYMAP syntax in lynx.cfg -KW
+* update Users Guide for KEYMAP changes, especially the TEXTAREA-related
+ sections -KW
+* move text on ^V a bit to better place, provide a couple links to it -KW
+* add blurb about TRST to Users Guide. Also mention external scripts for table
+ handling -KW
+* revise section in Supported URLs on internal schemes. Toned down, provide
+ rationale, give examples -KW
+* fix a few typos in README.TRST -LP
+* use 'rand()' in NewSecureValue() -TD
+* use a random number rather than a counter to name temporary files -TD
+* change LYReadCFG.c to accept any leading punctuation in lynx.cfg as a comment
+ delimiter -TD
+* eliminate some clutter with typecalloc/typecallocn macros -TD
+* eliminate some clutter with new function LYBadHTML() -TD
+* add checks for null pointers in CTRACE statements in HTML.c (based on report
+ by LV) -TD
+* change realloc calls in SAVE_TIME_NOT_SPACE ifdef in StrAllocVsprintf() to
+ HTalloc, since older machines (e.g., SunOS 4.x) do not necessarily handle a
+ null pointer parameter to realloc -TD
+* correct ordering of command-line options in LYMain.c -TD
+* updates for files in lynx_help & keystrokes -PW
+* clarify `General Configuration Instructions (all ports)' in INSTALLATION -PW
+* remove "your lynx.cfg"/"compiletime settings" from '='Info Page -LP
+* add a note to Lynx_Users_Guide.html#lynx.cfg on "g lynxcfg:" -LP,HN
+* change LYNXCOMPILEOPTS: to a link from LYNXCFG: -LP
+* slightly reorganize partial mode logic: 'display_partial' variable is now
+ initialized directly in HText_new(), no need for specialized semaphore any
+ more -LP
+* Allow KEYMAP directives in lynx.cfg of extended form
+ KEYMAP:lynxkey:lynxaction:editaction[:sel], where lynxkey and lynxaction are
+ as before, editaction is a line-editor action like FORW, BACK, ERASE etc.
+ and sel selects the line-editor style to be affected (as a number, starting
+ with 1 for the Default Binding; or 0 for all styles (the default); or a
+ negative number -n meaning "all line-editor styles except n"). See Line
+ Editor Help pages for keywords to use as editaction. This includes PASS
+ (which was already implemented), for "passing" on the key when line-editing
+ form fields so that the normal lynxaction will be invoked.
+ (KEYMAP:lynxkey:lynxaction:DIRED is also still possible for defining a Dired
+ mode binding).
+ This is based on a patch from IZ which introduced combined definitions
+ in a .lynx-keymaps file in the form:
+ setkey "\200s" LAC:LEFT_LINK/BACKW # C-left
+ setkey "\200t" LAC:RIGHT_LINK/FORWW # C-right
+ Combined definitions in .lynx-keymaps are also supported in this patch, but
+ the syntax was changed to use another ':' instead of '/' as separator. Note
+ that there is no need to support .lynx-keymaps (i.e., compile with
+ USE_KEYMAPS defined) for using the extended KEYMAP lynx.cfg directive with
+ this patch -KW
+* avoid access to uninitialized members in TRSTable.c -KW
+* limit span values accepted for TRST with TRST_MAXCOLSPAN and TRST_MAXROWSPAN,
+ which can be changed in userdefs.h. Without imposing a limit, attempts to
+ trick lynx into allocating huge blocks of memory (which might cause thrashing
+ without apparent reason) with something like ROWSPAN=10000000 are just too
+ easy -KW
+* moved definition of SAVE_TIME_NOT_SPACE to userdefs.h. You may want to
+ undefine it for a platform where running out of memory is a frequent problem
+ (DOS?), although the effect won't be very pronounced. Used in TRST code to
+ affect size of some allocations (also used as before for
+ HTSprintf0/HTSprintf) -KW
+* implement COLSPAN=0 and ROWSPAN=0 according to HTML 4.01 (not HTML 4.0). The
+ span extends until the end of the current column group and row group (i.e.
+ next THEAD/TFOOT/TBODY), respectively; or until the end of the row or table,
+ respectively, if there is no containing group (thus acting as per HTML 4.0).
+ Also cancel effect of all ROWSPANs at a THEAD/TFOOT/TBODY boundary (problem
+ with other browser described and behavior proposed by G James Berigan in
+ <http://www.war-of-the-worlds.org/html/span-vs-group.html>) -KW
+* 'prev_target' is now PRIVATE to LYMainLoop.c [defined outside of mainloop()];
+ this undoes some dev.15 changes. -LP, KW
+* replace HText_pageDisplay() calls from partial mode (LYUtils.c and
+ HTFormat.c) with LYMainLoop_pageDisplay() function implemented in
+ LYMainLoop.c, it simply calls HText_pageDisplay() but has access to
+ LYMainLoop.c PRIVATE variables. -LP, KW
+* make ^X a prefix key in all Line Edit styles. That means ^V should never be
+ needed any more to invoke the special textarea commands (but it's still
+ supported). Updates to help files to reflect this change -KW
+* don't produce a link from the KEYMAP page to a help file. The one we used to
+ use doesn't really help -KW
+* correction in code executed after textarea external editing (that determines
+ when to prompt for re-wrapping): use start_anchor not anchor_ptr. Without
+ this correction, invalid memory access could occur. (This was probably also
+ responsible for producing the prompt when it shouldn't be produced in some
+ cases, as has been reported.) -KW
+* some tweaks of Novice mode help lines: don't show wrong key "to delete all
+ text in field" (FORM_NOVICELINE_TWO); replaced an occurrence of <delete> with
+ <backspace>. In some cases (e.g., disabled fields), prefer no info to wrong
+ info -KW
+* extended KEYMAP option: additional field can specify DIRED to request
+ mapping in the Dired mode key_override table rather than the normal keymap
+ table. Documented the DIRED field and default override mapping in
+ lynx.cfg -KW
+* corrected KEYMAP display for dired mode. It could display the normal binding
+ when that wouldn't actually be used, for example if a key is bound to
+ DO_NOTHING for DIRED. The logic deciding whether to show a separate line for
+ uppercase letters was only looking at the normal keymap -KW
+* reset the edit_mode flag (indication of Dired mode) in various places, so the
+ flag doesn't stat TRUE after a new page has been loaded. For example,
+ invoking the forms based 'O'ptions page from a Dired directory view would
+ leave the Dired key bindings enabled within the Options page -KW
+* for LYNXMESSAGES: page of recent statusline messages, removed setting of the
+ LYforce_no_cache flag in getfile(). Set the flag in LYMainLoop.c instead,
+ but only for following a link. This makes the page act more like a normal
+ no-cache document, for example returning to it via PREV_DOC does not cause an
+ automatic update. The special handling in LYMainLoop.c is necessary because
+ the link to LYNXMESSAGES: appears on the History Page, and following a link
+ from the History Page (as well as some other generated user interface pages)
+ normally implies overriding of no-cache behavior which we don't want in this
+ case -KW
+* in LYNXMESSAGES: page, number recent statusline messages in historic order,
+ starting with 1 for the oldest. This should make it more obvious that they
+ are listed latest-first. Add "(No messages yet)" text if there are no
+ messages. Removed generation of invalid <pre> -KW
+* use a temporary file instead of the normal .lynxrc file for saving and
+ restoring current settings in reload_read_cfg(). This avoids unexpected side
+ effects of lynx.cfg reloading (LYNXCFG://reload action), i.e. silent
+ modification or first-time generation of .lynxrc contents. In principle this
+ should make reloading of lynx.cfg usable for accounts that don't allow saving
+ of personal settings (i.e. option_save restriction, implied by -anonymous)
+ if other restrictions don't forbid it; but currently the option_save
+ restriction is still obeyed for saving to the temporary file (so that
+ reloading of lynx.cfg is prevented) -KW
+* tweaks for LYNXCFG: and LYNXCOMPILEOPTS: pages: honor REUSE_TEMPFILES
+ setting if pages need to be regenerated, and clean up the memory for holding
+ the file URLs in free_lynx_cfg(). Recover if the tempfile has unexpectedly
+ disappeared, by regenerating it. Also regenerate tempfile if NOCACHE key
+ ('x') is used. Added extra checks before doing automatic uncaching of
+ previous page in LYNXCFG://reload code, to test whether the previous page is
+ really a LYNXCFG: view -KW
+* corrected problems with "show color" in forms Options page. Omit "ON" choice
+ if color is not possible (but saving allowed). When option_save restriction
+ was in effect, the ON/OFF initialization was wrong (resulting in unwanted
+ toggling of color each time options were changed in an anonymous account) -KW
+* tweaks of reload_read_cfg() for retaining "show color" setting and for
+ updating display_lines (user_mode may have changed) -KW
+* change for HTParse: if there is a hostname part, recognize a '?' as ending
+ it if there are no further slash characters -KW
+* tweaks in configure.in and INSTALLATION: describe correctly what
+ --disable-dired-override does. Rename --disable-dired-archive to
+ --disable-dired-dearchive. Clarified INSTALLATION text for
+ --disable-full-paths. Changed some "define" to "prevent defining" -KW
+* don't try to put cursor in last screen position for hiding in
+ show_main_statusline if -show_cursor/SHOW_CURSOR is on. The show_cursor
+ behavior may have been turned on to avoid problems with curses libs or
+ terminal types that cannot deal with it correctly. On pages with no links,
+ for example SOURCE display, this may leave the cursor at the end of the
+ statusline message if show_cursor is on. This just restores previous
+ versions' behavior in that case. On pages with links, the movement is
+ unnecessary anyway since the cursor will move again to the current link -KW
+* removed a bug in automatic textarea growing. Textarea would grow by
+ one line unnecessarily if enter was used on the last input line on a
+ screen (if that was not actually the last line in the textarea). New
+ function HText_TAHasMoreLines() to help with this -KW
+* revision of "nonsticky" behavior / options. Got rid of "sticky" terminology.
+ Renamed the controlling option to TEXTFIELDS_NEED_ACTIVATION and command line
+ flag -tna.
+ Compiling in of this mode can be disabled, see in userdefs.h under
+ TEXTFIELDS_MAY_NEED_ACTIVATION. Two versions of "Textfields Need
+ Activation" mode are provided. The default mode (simpler yet better IMO)
+ highlights an inactive selected text input fields like a current normal
+ anchor. The alternative variant (may go away later?) behaves like VH's
+ previous implementation and gets used when compiling with
+ -DINACTIVE_INPUT_STYLE_VH.
+ Many bugs that would occur in somewhat unusual circumstances are fixed, for
+ both variants. (Action of various commands on TEXT_SUBMIT_TYPE fields,
+ interaction with mouse selection, ...) Selecting an inactive input field with
+ the mouse will activate it. Various tweaks to make sure selecting a field in
+ this way will put the editing cursor at the right position (even if the line
+ had been scrolled / might be scrolled on entering the line editor), at least
+ with NCURSES mouse support. Also, -show_cursor now in general works as
+ expected. (In the INACTIVE_INPUT_STYLE_VH variant, cursor may sometimes end
+ up on the statusline after error messages.) -KW
+* treat input lines of the same textarea more like one entity, as far as
+ "Textfields Need Activation" is concerned, as long as movement among those
+ lines is with PREV_LINK/UP_LINK/LPOS_PREV_LINK/NEXT_LINK/DOWN_LINK/
+ LPOS_NEXT_LINK or ACTIVATE keys (the last one only if TEXTAREA_AUTOGROW is
+ defined, for consistency with line-appending behavior). I.e. moving among
+ textarea lines with those keys automatically activates ('enters') the new
+ field for line editing if the previous one was activated -KW
+* modified statusline messages to be more appropriate and specific on non-
+ activated form fields. (The additional messages are not used or compiled
+ in if TEXTFIELDS_MAY_NEED_ACTIVATION isn't defined.) Avoid unnecessary
+ repainting/refreshing of the physical statusline in many cases of moving
+ among fields and links. Make sure the additional lines shown in Novice
+ mode are also appropriate -KW
+* modified line editor behavior on "disabled" form text fields: instead of
+ disabling all non-terminating edit keys, allow those that never modify the
+ field contents. The user can now scroll through a long value in a disabled
+ field with the arrow keys, rather than being stuck at the end -KW
+* the ncurses mouse popup window would overlap the statusline in Novice mode.
+ Limit the overlap to border area (so at least no significant text gets
+ corrupted) -KW
+* modified code for stickiness of the second kind (ex-STICKY_FIELDS) according
+ to preliminary proposal from Vlad. Named LEFTARROW_IN_TEXTFIELD_PROMPT.
+ Does not depend on any conditional compilation symbols, and is now unrelated
+ to the other kind of "stickiness" discussed above. See lynx.cfg. This isn't
+ optimal yet (LAKABOFTIF discussion etc..), but better than leaving it as it
+ was -KW
+* made default width of textarea fields (if no COLS attribute given) depend on
+ window or screen width, instead of using a fixed default of "60". I.e. for
+ wider windows make better use of available space, and for narrows windows
+ avoid wrapped textarea lines. Take the usual left/right margins (depending
+ on current block style) into account. But for -dump don't make fields longer
+ than 60 anyway (they will just show up as blocks of underscores anyway, not
+ showing text content) -KW
+* changes in code used to create new bookmark file after a bookmark has been
+ 'R'emoved. Change should only affect Unix. Basically, revert back to
+ behavior used before 2.8.1dev.8 for "normal" files (no symlinks or extra
+ hard links). I.e. use rename / maybe try "mv" instead of "cp", then change
+ permission bits explicitly. Using "cp" means running the risk of losing or
+ truncating the user's bookmark file if for example the disk became full
+ (although these occasions should be rare - the scratch file we are trying
+ to copy or rename was written just before without error, usually on the
+ same filesystem). Some more comments in LYBookmark.c. Note: if you like
+ your bookmark files, make backup copies of them anyway... -KW
+* changed F1 key bindings so it always invokes DWIMHELP, also in the Line
+ Editor (for all three Binding tables). This means that pressing F1 (if you
+ have it, and it is correctly mapped and recognized) while in a text form
+ field will now bring up the Line Editor Help Page for the currently selected
+ line edit style. Other keys bound to HELP by default ('?', 'h') remain
+ unchanged, they still always go to the main Help Page -KW
+* don't let DWIMHELP show Line Editor help for a text input field that is
+ disabled -KW
+* don't mangle a -cookie_file like /home/user/.lynx_cookies.~1~, only interpret
+ the '~' as reference to HOME if it's right at the beginning and followed by
+ '/' and then some more. There are probably other instances where '~' gets
+ mistreated (in addition to the intentional dropping of "user" from something
+ like "~user/" in file URLs etc.) -KW
+* changed type of EXP_KEYBOARD_LAYOUT tables to LYKbLayout_t. They hold
+ Unicode values, any similarity to LYKeymap_t is just accidental -KW
+* changed EXP_KEYBOARD_LAYOUT logic so that input characters that are
+ unrepresentable in the current display character set (unless it is UTF-8) get
+ transformed into '?' instead of some accidentally chosen 8-bit character.
+ For UTF-8, convert to UTF-8 encoding instead. Note the Line Editor isn't yet
+ UTF-8 aware; with some care it is possible to enter UTF-8 text, but the
+ display will be messed up, esp. the cursor position will be shown wrong -KW
+* some corrections for TPOS, YANK enhanced lineedit functions -KW
+* added back in a block in LYmbcsstrlen that got lost somehow -KW
+* fix an array boundary accident in GridText.c -JB
+* reiterate that LYNXCGI_LINKS is set by the configure script -PW
+* note that patches should be generated by "diff -u" -PG
+* modify HTReadProgress so that setting SHOW_KB_RATE false will let the
+ amount read be shown in bytes/sec -DK
+* modify mkdirs.sh to ignore DOS-style device -IZ
+* modify CF_PATH_SYNTAX configure macro to accept DOS-style path syntax, for
+ use in OS/2 EMX port -IZ
+* fix some memory leaks in visited-pages tree -IZ
+* correct recent change to LYEditmap.c for EBCDIC -PG
+* change 'elf32ppc' to 'elf32ppc*' in config.guess to work on MkLinux DR3
+ (reported by Christopher Conrade Zseleghovski (kkz@MIMUW.EDU.PL>) -TD
+* add check to HTConfirmDefault() to ensure that NLS form of "yes" and "no"
+ are distinct in the first character, revert to English if not -TD
+* add configure test for wredrawln, and use CF_CURSES_FUNCS -TD
+* improve CF_TERMCAP_LIBS configure test -TD
+
+1999-11-17 (2.8.3dev.15)
+* add popup in options menu to control alternate organizations of the
+ visited links page -IZ
+* reformatted src/makefile.dos and src/makefile.dsl to make them simpler to
+ modify -TD
+* add -DOK_OVERRIDE to DIRED_DEFS for DJGPP -LP
+* change the samples in "URL Schemes Supported in Lynx" so they would appear
+ without //user:passw@ but //user@ with the explanation of yet another
+ possibility added in words... So user will not get a wrong impression if
+ reading that document not so carefully (you know, samples are so easy
+ remembered without details), -KW, LP
+* ifdef bkgd() call in force_repaint that accommodated pre-ncurses 4.1 bugfix,
+ from early 1997. With current code, a ^L when a popup is displayed causes
+ the screen colors to be reset (reported by KW) -TD
+* undo recent no_color_video check for A_BOLD, A_UNDERLINE since this did not
+ have the intended effect (reported by KW) -TD
+* add note to lynx_url_support.html about lynxcgi -PW
+* add user search in partial mode (while loading of the document is in
+ progress). Scrolling to the string in question is not working properly yet
+ if you repeat 'n' next time. More work required -LP
+* improved makelynx.bat (Victor Schneider)
+* fixed bug that corrupted memory (resulting in crashes) in situations when
+ line ends with LY_SOFT_HYPHEN -VH
+* correct comment in userdefs.h regarding renaming of
+ LINKS_AND_FORM_FIELDS_ARE_NUMBERED to LINKS_AND_FIELDS_ARE_NUMBERED and
+ change DEFAULT_KEYPAD_MODE to LINKS_AND_FIELDS_ARE_NUMBERED -PW
+* fix bug that caused lss-enabled lynx to crash on growing textarea or
+ inserting file into it -VH
+* new lynx.cfg option REFERER_WITH_QUERY:[SEND|PARTIAL|DROP] -KW
+* don't send Referer if we have to load a document again that we got
+ from the history stack. Lynx would send the URL of the current
+ document (the one "later" in history) which could only accidentally
+ be right -KW
+* changed default for PERSISTENT_COOKIES from TRUE to FALSE, since
+ persistent cookie support is now configured in by default -KW
+* new functions (key_for_func_ext) to return a "best" key (or key pair) to
+ invoke a given lynx action, either in the Line Editor or in normal mode.
+ Currently only used for a couple of statusline messages (those that had ^V
+ hardcoded). The statusline info while in a textarea now gives the right
+ key(s) for invoking external editing, or omits the info if appropriate
+ (no key bound, or no editor defined or allowed) -KW
+* doc updates for TEXTAREA special functions -KW
+* moved #defines for TEXTAREA_EXPAND_SIZE, AUTOGROW, AUTOEXTEDIT from
+ LYMainLoop.h to userdefs.h, the latter two renamed to TEXTAREA_AUTOGROW
+ and TEXTAREA_AUTOEXTEDIT, added description -KW
+* minor tweaks: -accept_all_cookies help string, some formatting changes,
+ minor text additions and corrections -KW
+* set $(PROG_EXT) variable in makefiles for Cygwin -TD
+* define __CYGWIN__ if needed, e.g., for betas that define __CYGWIN32__ -TD
+* workaround Cygwin b19.1 problem generating cfg_defs.h because it did not
+ properly export $PATH -TD
+
+1999-11-03 (2.8.3dev.14)
+* modify no_color_video check for A_UNDERLINE so it is active for any
+ combination that uses underlining (reported by KW) -TD
+* modified HTML.c so configure --enable-internal-links builds -TD
+* improved 'lynx.patch' rule in makefile.in -PG
+* add rough version of makelynx.bat for use with Khan's MingW32 (from Victor
+ Schneider <vtailor@gte.net>)
+* update dependencies in makefile.bcb for src/TRSTable.c -SH
+* fix PDCurses ifdef's in LYCurses.c to work with WATT-32 -DK
+* correct ifdef's in LYPrint.c so that send_file_to_mail() works with DJGPP -DK
+* modify DOS makefiles for PDCURSES for watt-32 and some of the other recent
+ changes to lynx. Included some of the EXP_ defines that DOS users may want.
+ Changed the -O3 back to -O2, since -O3 has no advantage under DJGPP -DK
+* remove a useless ';', use FREE() instead of free() - JB
+* correct spelling lexem/lexeme (reported by KW) -TD
+* split-out function check_history() in LYMainLoop.c -TD
+* add configure check for vasprintf -TD
+* add configure check for _GNU_SOURCE -TD
+* minor fixes for configure script macros CF_TERMCAP_LIBS, CF_DISABLE_ECHO,
+ CF_GCC_ATTRIBUTES, CF_GCC_WARNINGS -TD
+* fixed bug in psrcmode code. Now htmlsrc_tag encloses only tagname, not
+ everything in generalized brackets <,>,</,/> (reported by KW) -VH
+* fixed a bug with 'g' command (reported by KW) -VH
+* default value for 'OPT' in SGML.c made '1', removed alternatives to code
+ surrounded by #if OPT1 -VH
+* notes (VH):
+ + Seems that 'OPT' stuff doesn't contain errors. Let's enable it for several
+ releases, and then remove alternative code.
+ + Added comments about pools.
+ + Docs updated to reflect new functionality of -dont-wrap-pre
+* old psrcview bug fixed - markup was unbalanced in some situations -VH
+* content of SAMP tag made justifiable -VH
+* implemented HTStyleChange pooling - sizeof(HTStyleChange) is 4 times smaller
+ than before, and only necessary number of stylechanges is allocated now,
+ instead of some constant (1024 by default) -VH
+* functionality of dont-wrap-pre improved and extended. Now it's possible to
+ avoid wrapping the document being dumped completely (size of the non-wrapped
+ line before the patch was limited by MAX_LINE = 1024 by default). Specifying
+ -dont-wrap-pre with interactive session enables wrapped lines (in PRE) to
+ be marked as in source view - with '+' in normal view -VH
+* functionality of -force-empty-hrefless-a was cleaned up,
+ #ifndefs NO_EMPTY_HREFLESS_A and endif's were removed -VH
+* colorstyle changes are not emitted in HTML_end_element if me->skip_stack was
+ >0 on entry to this function. This caused some glitches if
+ -force-empty-hrefless-a was enabled -VH
+* LYPrettySrc.c was slightly cleaned up, added support for lynx.cfg reloading,
+ memory deallocation -VH
+* possible bug in print_wwwfile_to_fd fixed - when quoting the page, seems that
+ several '>'s could be emitted on the long line formed by concatenating lines
+ with LY_SOFT_NEWLINEs at the beginning of them -VH
+* general notes (VH):
+ + users of lss-enabled lynx should consider on upgrading the lynx - at least
+ those who use lynx for viewing huge files. By default, each line on the
+ screen took 1K for colorstyles (on x86). With new approach colorstyle
+ changes take 24 bytes (on x86) per line in average document. Old lynx with
+ 900K html file loaded as startfile occupied 30M of virtual memory, lynx
+ with patch applied occupied 5 Mb on the same file. Old code is still
+ accessible by defining OLD_STYLECHANGE.
+ + I spent 4 hours debugging attempting to write/fix code that cleans up the
+ memory allocated in LYPrettySrc.c, but Lynx.leaks shows that I didn't
+ succeeded. I fear that leak detection stuff is broken - I checked/traced
+ the code very carefully several times.
+> the remainder (most) of this patch from KW:
+* for confirmation prompts (HTConfirm), also accept English letters 'Y', 'y',
+ 'N', 'n' as responses. If characters different from those are derived from
+ the first letters of the translation of "yes" and "no" in a localized lynx,
+ the latter will still be the ones that appear in the prompt text and will
+ have precedence. Message translations using multibyte character sets should
+ continue to *not* translate "yes" and "no". Added a note to that effect.
+* small update for some chartrans tables, minor comment changes.
+* for Unix, use LYSystem instead of system for invoking telnet, rlogin,
+ rtn3270 commands.
+ [ For some non-Unix systems, LYSystem messes around with the passed command
+ string in various ways, and does some other stuff for DJGPP. So no change
+ for those, since I assume it worked before. For Unix the change prevents
+ the following occurring with ncurses (at least if USE_SIGACTION is
+ defined):
+ - access some (valid) telnet://some.host URL.
+ - within telnet client, escape to command level (usually '^]')
+ - suspend (usually 'z' or ^Z)
+ - resume (fg). Lynx process gets woken up, redraws lynx screen,
+ screen & tty state get messed up. ]
+* another tweak for display refreshing when text previously displayed
+ had UTF-8 (for ncurses) - a check in display_page was missing.
+* corrected stupid problem in LYGetFileInfo - invalid memory access.
+* corrected and extended handling for textarea INSERTFILE and EDITTEXTAREA
+ (or DWIMEDIT), the previous patch wasn't quite right:
+ - now really truncate very long lines as intended for INSERTFILE, instead of
+ wrapping with loss of one character.
+ - for EDITTEXTAREA (DWIMEDIT), implement wrapping instead of truncation
+ (Rationale for the difference: user's editing work shouldn't be lost if we
+ can avoid it; it is only temporarily stored in a file which may be
+ unrecoverable, different from the typical INSERTFILE case.) If, upon
+ returning from the external editor, lines are encountered that don't fit in
+ the displayed width of the textarea fields, the user may be given the
+ option to wrap to that width. (This prompt may not be given when the first
+ such line has no suitable spaces for breaking - the file may be binary
+ garbage after all, not worth fixing up too much.) Line breaking is
+ attempted at spaces if possible (using isspace() for checking), but not if
+ the only available spaces are close to the beginning of a line. An attempt
+ is made to join the wrapped part of a line (if not too long) with the next
+ line if it is not indented, by suppressing the next line break (if not too
+ far away). Some other heuristics are used that work reasonably well for
+ normal text paragraphs.
+ If the above mechanisms fail, or the user did not confirm wrapping when
+ prompted, very long lines will still be wrapped to fit into the buffer size
+ (around 1024 chars).
+ [ The wrapping works quite nicely in "normal" cases - please try it! ]
+* mouse action in popups would lead to call of fancy_mouse() with wrong row
+ number, which could lead to messed-up display as well as invalid memory
+ access.
+* The previous changes in link redrawing made things worse instead of better
+ for UTF-8 display with ncurses (without color style). This time (using
+ wredrawln, not touchline) it should really get better...
+ [ The UTF-8 related changes would need testing with non-ncurses curses libs,
+ if anyone has one of those AND a working UTF-8 environment - late xterm
+ betas(?) from Tom's site should do. If the functions used for ncurses are
+ available in other curses libs, the code should probably look the same as
+ for ncurses. ]
+* SGML.c to compile without --enable-prettysrc (reported by HN) -KW
+* fixes an invalid memory problem from previous patch
+* adds alignment inheritance from COLGROUP / COL / THEAD / TFOOT / TBODY.
+* remove some logic from LYmbcsstrlen() that gave an incorrect count for
+ the number of cells displaying multibyte characters, resulting in too-few
+ cells being highlighted (reported by HN, SH) -KW
+* added support for ROWSPAN attribute of TD and TH to TRST. This only
+ reserves the appropriate amount of space in subsequent lines.
+ [ Pages that show off ROWSPAN nicely:
+ <http://www.iro.umontreal.ca/contrib/po/HTML/domain-hello.html>
+ and related ones for other "domain"s. (Verify that there really
+ is a ROWSPAN= in the current version.) View with a screen width
+ of 100. With 80 there is some kind of problem, compare both
+ ^V settings... ]
+* some corrections in TRST code.
+* change initialization order of key escape sequence mappings for slang, so
+ that terminfo/termcap information always overrides defaults that may
+ conflict.
+* minimal memory cleanup / leak prevention for EXP_FILE_UPLOAD error
+ cases in GridText.c.
+* in HText_SubmitForm, don't change the post_content_type of the
+ passed in newdoc structure unless that is really wanted.
+* tweaked UTF-8 prevention of display library wrapping/truncation to make
+ better use of available width for centered text, and to not apply if dumping
+ to stdout.
+* for UTF-8 output with ncurses, do a clearok in display_page also if the page
+ that was *previously* displayed had UTF-8 characters. Without this there
+ were still display glitches.
+* made previous changes to SGML.c and HTMLDTD for handling OBJECT more generic.
+* minor tweaks, cleanups, glitch removal in previous changes.
+* better tracking of HTSprintf0/HTSprintf with --enable-find-leaks
+ (-DLY_FIND_LEAKS). This can be disabled in LYLeaks.h by removing the
+ definition of LY_FIND_LEAKS_EXTENDED.
+* added variant behavior in StrAllocVsprintf to make HTSprintf0/HTSprintf use
+ less memory allocation calls and keep its temporary string buffers across
+ calls. The buffers then only grow and never get cleaned up. This is enabled
+ by defining SAVE_TIME_NOT_SPACE in HTString.c, disable the definition there
+ in case of problems.
+* added code so HTSprintf0/HTSprintf can use vasprintf() in some situations,
+ which should be more efficient. It also works with --enable-find-leaks
+ (EXTENDED or not). This only comes into play if USE_VASPRINTF is defined
+ (not defined automatically anywhere).
+ [ For me (some Debian glibc version), the prototype for this function
+ is in stdio.h but only gets included with an explicit -D_GNU_SOURCE. ]
+ [ Which of the four combinations with/without vasprintf, with/without
+ SAVE_TIME_NOT_SPACE is better (if any) remains to be tested. I have seen
+ drastic differences under leak tracking, but that's just too much
+ different from a normal situation to count for anything. ]
+* Some minor leaks fixed. (LYMainLoop.c)
+
+[ Had to make owner_address and ownerS_address file-wide PRIVATE's
+ instead of auto to unleak them. Could be taken out of more
+ argument lists now. ]
+
+* HTFile.c: correction in FormatNum (could duplicate fields for some
+ LIST_FORMAT settings), avoid some HTSprintf0 calls in FormatStr.
+* replaced calls to HTSprintf with calls to HTSprintf0 in various files.
+* added missing include of LYLeaks.h in LYPrettySrc.c. But disabled memory
+ tracking there, too many allocations show up as leaks.
+* allow digits in tagspec for -prettysrc.
+* the 'fixit' change of 1999-05-16 didn't really let LYConvertToURL() revert to
+ the right old behavior in the non-'g' use. Now return a file URL for the
+ nonexisting file in the relevant situation again, as before 1998-03-25,
+ instead of an erroneous "file://localhost" which (on Unix-like systems at
+ least) would result in access to the root directory. This change (like the
+ changes of 1999-05-16 and 1998-03-25) only matters for strings that aren't
+ already in absolute URL form, don't start with a slash (or, for DOSPATH
+ systems, other path separator) either, and don't get turned into remote URLs
+ by successful 'guessing' and DNS lookup. None of the changes affect VMS.
+* protect INSERTFILE and EDITTEXTAREA from generating memory access violations
+ if the inserted file has lines that are too long for the buffer used. An
+ alert message is issued and the long lines are truncated. Also don't exit if
+ memory allocation fails for the buffer to hold the whole file, since the only
+ reason for the failure may be that the file is too huge when otherwise lynx
+ has enough memory.
+* improved handling of some invalid constructs in SGML, especially
+ '<' followed by various characters; don't lose those characters from
+ what gets displayed for -prettysrc.
+* a pre-filled TEXTAREA text that needed charset translation could cause
+ use of an invalid pointer when building the page, resulting in garbage
+ data being displayed (or worse). The problem was in HTML.c, not related
+ to TEXTAREA editing or other related new functions.
+ [ preceding three were partially already in previous patch ]
+* recognize '<?' as introducing an SGML PI. Within most elements' content (or
+ outside of any elements) this makes no effective difference except for TRACE
+ messages and -prettysrc, the input is still junked up to the next '>' as for
+ a completely invalid tag. Within PCDATA elements the PI is now also ignored
+ instead of being treated as character data, this makes a difference for
+ example in a TEXTAREA in SortaSGML mode. (PI's aren't really expected to
+ occur in the middle of HTML, but are used at the beginning of XHTML documents
+ and other XML documents.)
+* the earlier change of TEXTAREA handling (treating as SGML_PCDATA, SortaSGML
+ only) created a problem, some lynx special characters were passed on as data
+ characters in the field contents and would mess up line editing and possibly
+ the submitted form data. Actually the problem also existed before, but only
+ for non break space, soft hyphen etc. encoded directly as character data
+ (not NCRs or entities). Resolved by telling SGML.c not to generate lynx
+ special chars for some element contents (currently only TEXTAREA), with new
+ flag Tgf_nolyspcl.
+* corrected some logic errors in LYUCFullyTranslateString. Special attribute
+ characters are now more often translated to real characters when 'Back' flag
+ is set, and should now be translated to the *right* characters for the target
+ charset. (They were sometimes converted to ISO-8859-1 values when the 'to'
+ charset was different.)
+* added a missing significant cast in UCReverseTransChar.
+* for scrollbar mouse clicking, use codes that work independent of current
+ line-editor key bindings.
+* better calculation of "subjective distance" from next anchor for mouse.
+ Change of 1999-07-30 had various problems, it wasn't quite intuitive. Use
+ scaled numbers for finer granularity. Don't make "basin of attraction" too
+ wide, or it becomes hard to find a "background" spot to click on that doesn't
+ affect a link if a page has a high density of links.
+ [ For example with a pair of fields:
+ Submit Reset
+ xxx
+ clicking in any of the positions marked 'x' on the next line would
+ select the first field, not the second. That was not an improvement. ]
+* functions LYmbcsstrlen, LYno_attr_mbcs_case_strstr, and LYno_attr_mbcs_strstr
+ in LYStrings.c where unclear about the concept of 'printable' or 'physical'
+ used for some returned values in the CJK case. Callers expected number of
+ display cells, implemented was number of 'characters' counting full-width
+ characters as 1 instead of 2. Now these functions take an additional
+ argument 'count_gcells' that tells them how to count.
+ This removes some long-standing, somewhat obscure problems with search target
+ highlighting under CJK display character sets, as well as new (and less
+ obscure) CJK problems introduces by the latest changes for highlighting.
+ Also fixed some details in the *strstr functions. The positioning of the
+ highlighting in CJK mode should now be correct and work as expected (as for
+ other display character sets) for anchors, search targets, and combinations
+ of both.
+* reorganized LYOpenTempRewrite. It should finally make sense for systems
+ without HAVE_TRUNCATE defined.
+* corrected SNACat (was unused).
+* changes for SUP and SUB: Render SUP visibly as a '^' character if it needs
+ to be separated from a preceding character in order to prevent
+ misinterpretation. The test currently used is isxdigit for the the preceding
+ character. Render <SUB> and </SUB> always as brackets '[' and ']'
+ respectively. SUB is mostly used in technical material while SUP occurs
+ frequently in pages of general nature where it is not essential, therefore
+ the different treatment.
+
+1999-10-21 (2.8.3dev.13)
+* revert a change from dev.4 which disabled getbkgd support in PDCurses -DK
+* modify ifdef for USE_QUOTED_PARAMETER to include __CYGWIN__, else names such
+ as "telnet.sh" are translated to "telnet" -DK
+* improve/simplify scrollbar support -IZ
+* implement LYNXMESSAGES:/ page using non-tempfile approach -LP
+* correct an assignment to last_kcode, broken by restructuring of LYMainLoop.c
+ in dev.11 -SH
+* tweak LYExecv() to exclude SH_EX conditional (dired commands didn't work
+ on non-Windows platforms when SH_EX defined) -LP
+* fix a potential out-of-range pointer in HTParse - JB
+* fix a small leak in the statusline history page - JB
+* restore DELEL lineedit key binding in the Alternate map (which apparently was
+ changed in -dev.4 to the DELNW function) to the ^K key -KED
+* LYMainLoop.c: remove a dozen of unnecessary `refresh_screen' flags from
+ LYK_HISTORY, LYK_PRINT, LYK_LIST, LYK_ADDRLIST, LYK_VLINKS where a new html
+ page is generated (any document update that may be displayed in "partial
+ display" mode need not set `refresh_screen' flag) -LP
+* correct some typos in cernrules.txt -VH
+* move declaration of LastDisplayChar to make GridText.c compile with DJGPP -LP
+> the remainder (most) of this patch from KW:
+* HTFTP.c: (already sent w/o description - this is updated to dev.10)
+ - interrupted_in_next_data_char was not being reset. That could make all
+ subsequent FTP directory listings fail (by showing an empty directory)
+ after receipt of one directory listing had been interrupted.
+ - be nice, send quit before closing at least in the normal (non-interrupted
+ and successful) case. Some servers (wu-ftpd at least) otherwise complain
+ with "You could at least say goodbye" which in turn causes unnecessary RST
+ packets. To minimize round-trip delays, the QUIT is sent before we start
+ reading the returned data (but after the initial response to our retrieval
+ command).
+ - always close data connection immediately after we are done reading from it,
+ also for directory requests. This was already the case for file requests.
+ Some servers (including recent wu-ftpd beta) wait for indication that we
+ closed before proceeding.
+ - keep better track of closed sockets. Some more trace messages.
+ Some comments corrected.
+* tabular representation for simple tables. See included file README.TRST.
+* made User-Agent warning more friendly, and more specific. Tell the user what
+ lynx expects in order to avoid the warning. On the other hand, issue an
+ equivalent warning when -useragent is used. Change documentation
+ accordingly.
+* don't send User-Agent header at all if it somehow would be blank.
+* indicate on forms 'O'ptions Screen which options are not saved to .lynxrc.
+* disable the form fields in the 'O'ptions Screen if the screen is generated
+ when FORMS_OPTIONS code is compiled in but not actually active.
+* LYPrint.c: In subject_translate8bit (see OUTGOING_MAIL_CHARSET
+ option), use higher level function to charset-translate mail Subject
+ line, rather than low-level UCTransCharStr.
+* UPPER8, UCForce8bitTOUPPER: was severely broken for UTF-8 display, making
+ WHEREIS search for strings containing non-ASCII characters impossible (and
+ probably with other bad effects). Now case mapping may still be wrong, but
+ at least identical strings compare as equal.
+* LYHistory.c: Entification for saved statusline messages happened twice by
+ mistake.
+* HTFWriter.c: Made code for automatic decompression of bzip2 files
+ conditional on BZIP2_PATH. Such files should be treated as normal binary
+ files on systems without bzip2. The configure seems to always define
+ BZIP2_PATH, but it could be undefined manually.
+* HTFWriter.c: Use LYRemoveTemp instead of remove in some cases, to avoid
+ keeping those files in the temp file list after they are long gone.
+* HTTCP.c: Check whether port numbers in URLs are really numbers.
+* HTPlain.c:
+ - deal with backspace formatting as used in formatted man pages.
+ (No highlighting, only avoid double output of characters)
+ - pass on 0xAD (soft hyphen) character in more cases.
+* HTNews.c: Prevent some ways that could trick lynx into treating a regular
+ "news:" or "nntp:" URL as something else, like snewspost. Extra check in
+ LYNews.c whether posing is allowed. Return with an error message in some
+ cases of URLs that are too long, instead of silently truncating. Make HEAD
+ work again on news articles. Some memory leaks in error path removed. A
+ message tweak.
+* HTFormat.c: HTStreamStack: avoid some unnecessary work, add a trace message
+ to show what is returned.
+* SGML.c: some cleanup of ugly ifdefs, and of unnecessary abuse of global
+ variables. (still a lot left!)
+* handle INCLUDE and CDDATA marked sections: output the contents.
+* parse various elements differently that had/have special requirements or
+ hacks. Extend meaning of Tgf_strict for literal-like content modes. Use
+ SGML_CDATA in some cases (and treat it similar to SGML_LITTERAL), use
+ SGML_PCDATA for literal-like parsing (but if modified by Tgf_strict it's
+ more like regular SGML_MIXED). A '<' that would start a tag gets displayed
+ (since not element content is allowed that's just error recovery). Comments
+ now work in TEXTAREA instead of getting displayed as text (SortaSGML mode
+ only).
+* minor tweak of sorta SGML handling for invalid end tag if start tag could be
+ validly omitted.
+* more consistent and correct recognition of element names. The characters
+ "_-.:" don't end tag names.
+* improved handling of '/' after element name in a tag: "<foo/>" is treated as
+ an empty element (as in XML). If we recognize "foo" as an empty element, do
+ nothing special; and if we recognize "foo" as a non-empty element; convert to
+ "<foo></foo>". "<foo/bar/" is treated as a shortref construct, by converting
+ to "<foo>bar</foo>" (for non-empty and recognized "foo"). This is not
+ general as it would have to be for or real SGML parser, in particular '/' is
+ only treated this way if it directly follows the element name, and it may not
+ even be quite right. It is better than the recovery lynx previously did in
+ these cases though.
+* changed handling of include buffer which is used to pass back data
+ from HTML.c to SGML.c. Passing data upstream now works without strange
+ reordering effects even when SGML_character was already parsing data from
+ a previous include buffer.
+ Character set translation would happen several times on data passed back
+ to SGML_character in the include buffer for re-parsing. This is now
+ avoided. Well at least in most cases, and for characters that *can* be
+ translated, there are likely combinations of input and output character
+ sets where the assumptions made are still wrong.
+* the start_element and end_element methods of structured stream class now
+ return a status code. Currently only used for the OBJECT stuff below.
+* mostly HTML.c, SGML.c: Changed handling of OBJECT and MAP.
+ - avoid using the include buffer mechanism as much as possible. This
+ involves introducing some new special handling in SGML.c to change parsing
+ mode for element contents, and a way for HTML_{start,end}_element to signal
+ to SGML_character what it should do. In most cases when the OBJECT element
+ content should be parsed and displayed, SGML_character now only needs one
+ pass through the data.
+ - don't lose content when several OBJECTs are nested.
+ - in HTML 4, an OBJECT with USEMAP attribute can refer to a MAP within the
+ OBJECT's content, possibly within nested inner OBJECTs. Lynx would fail to
+ find the MAP in that case, now it doesn't.
+ - in HTML 4, MAP can contain arbitrary block elements in addition to AREA.
+ Lynx now shows such block content, even if it occurs within (possibly
+ nested) OBJECTs with USEMAP whose contents we would otherwise skip.
+ Sometimes we may show too much now, by generating a LYNXIMGMAP link as well
+ as showing block content or by showing more of the OBJECT content than what
+ is within a MAP, but that is preferable to losing data.
+ - treat an A tag with COORDS attribute as equivalent to an AREA when it is
+ within MAP, for the purpose of collecting links for LYNXIMGMAP.
+ - as a fallback, internally redirect a LYNXIMGMAP request to the position of
+ the MAP element in the normally rendered text of the document containing
+ the MAP, if it is known that the MAP element exists and just doesn't
+ contain any AREA (or equivalent A-with-COORDS) links. It is assumed that
+ in such a case there is some block content within the MAP that is rendered
+ normally.
+* HTFile.c: new function LYGetFileInfo.
+* HTAnchor.c: new function HTAnchor_findSimpleAddress.
+* new function HTStartAnchor5.
+* modified the way link text is (re-)drawn by function highlight. The bulk of
+ processing now happens in new function LYMoveToLink. The data of the
+ containing line is now scanned from the beginning, using the same logic as in
+ display_line to make sure that lynx and the display library have the same
+ idea of where in the line the link starts. In UTF-8 output mode, parts of
+ the line preceding the link are also repainted if this is necessary.
+ Refreshing of the physical line is forced if necessary in UTF-8 mode. For
+ anchors split across lines, the new approach is currently only used for the
+ first line.
+ This change is not in effect for lynx with color style. In that case
+ highlighting already is sometimes done in a similar similar, but not quite
+ the same, separate function.
+* modified WHEREIS target highlighting for hypertext links. Now this is done
+ in the same pass as drawing the normal link text, in LYMoveToLink. This
+ avoids problems in UTF-8 display mode. It also avoids a lot of complicated
+ and extremely hard to understand older code in highlight(), but that code is
+ still there for use by lynx with color style and for other remaining cases
+ (non-hypertext anchors, second line highlighting).
+* modified WHEREIS target highlighting for general text. Instead of first
+ writing each line's characters in display_line, then scanning again through
+ the line's data for portions to highlight and repainting those parts after in
+ display_page, this is now done in one pass within display_line. However,
+ this isn't (yet?) done for lynx with color style which still uses the old
+ code.
+* these last three changes reduce problems that occur when using UTF-8 display
+ character set (in an appropriate terminal environment that understands it, of
+ course). Most of them don't apply with color style lynx, so it continues to
+ have more UTF-8 problems. Pages with mostly ASCII characters should be more
+ or less ok. Problems that otherwise are not visible become apparent in
+ search highlighting, and after ^Z / fg.
+* GridText.c: More changes to deal with problems caused by using UTF-8 output
+ with a display library that isn't aware of it. Break line with UTF-8 before
+ curses does it. This causes lines that are too short, effectively the
+ rightmost part of a line cannot be used if there are UTF-8 encoded
+ characters. The alternative, letting curses wrap the line when it thinks it
+ got too long, is worse, so do it in lynx code instead.
+* avoid memory overrun for very long lines in UTF-8 mode. Avoid splitting line
+ in the middle of a multibyte UTF-8 character.
+* test for SHOW_WHEREIS_TARGETS instead of 'defined(FANCY_CURSES) ||
+ defined(USE_SLANG)'.
+* initialize new textarea lines created by insert_new_textarea_anchor with
+ current display character set for value_cs. (The "cloned" value can be stale
+ in some cases if the user changed the display character set after the
+ document was last loaded - normally that should not happen). For a file
+ inserted into a textarea with INSERTFILE use new function LYGetFileInfo
+ instead to determine the file content's charset. Thus -assume_local_charset
+ and conventions based on file suffix should be honored.
+* for Unix, added more specific error message if calling external editor for
+ textarea failed, based on the status returned by system().
+* it is possible to require an additional prompt before Enter in
+ an input field causes form submission: define TEXT_SUBMIT_CONFIRM_WANTED,
+ explained in userdefs.h.
+* some small changes to prevent overstepping string boundary (HTParse.c)
+* extended SUFFIX option, added SUFFIX_ORDER option, see documentation in
+ lynx.cfg. The long list of built-in file suffix rules in HTInit.c can now be
+ disabled, either at compile time - see userdefs.h - or at run time. The
+ equivalent functionality is now available in lynx.cfg for those who want it.
+ Added comments, see HTFileInit in HTInit.c.
+* various tweaks of built-in file suffix rules.
+* allow XLOADIMAGE_COMMAND to be empty (in lynx.cfg) or NULL (in userdefs.h),
+ just don't use a default X viewer for image types in that case.
+* moved UCGetUniFromUtf8String from LYCharUtils.c to UCAux.c.
+* renamed LYUCFullyTranslateString -> LYUCTranslateHTMLString, and
+ LYUCFullyTranslateString_1 -> LYUCFullyTranslateString.
+* tweaks for special chars in (what is now) LYUCFullyTranslateString, in
+ obscure cases (input fields of type password prefilled with unusual content)
+ lynx would pass text back to the server with special characters (soft hyphen
+ or non-break space) expressed as lynx-internal code values.
+* added some replacement characters or strings to various chartrans tables.
+* experimental command line option -convert_to, only compiled in if new
+ MISC_EXP symbol is defined. This takes a string in the form of a MIME type,
+ which can also be combined with an appended ";charset=" parameter. (This
+ needs shell quoting of course). The charset value can be used to set the
+ display character set from the command line. The MIME type can be one of the
+ non-official types used internally, for some interesting effects (crashing
+ lynx not excluded). Try www/download, www/source, www/dump, or some
+ unrecognized string.
+* fixed HTMainText_Get_UCLYhndl, it was returning the wrong kind of charset
+ handle (a "UChndl", which is different from a "LYhndl" or "UCLYhndl" etc.,
+ and shouldn't be directly accessed by arbitrary bits of lynx code - it should
+ be regarded as private to the chartrans mechanism).
+* protect various printf-like calls against crashes from strings with '%':
+ LYSyslog.
+* LYDownload.c: made parsing of LYNXDOWNLOAD: URL slightly more robust.
+* disabled some broken pieces.
+
+1999-10-14 (2.8.3dev.12)
+* fixes for restructured LYMainLoop.c (reported by PG, LP) -TD
+* minor fix for makeutcb, to compile with K&R C -TD
+
+1999-10-13 (2.8.3dev.11)
+* restructured LYMainLoop.c, so the main switch statement calls functions
+ rather than doing everything inline. This greatly reduces memory required
+ to compile that module, as well as making the compile 3-4 times faster -TD
+* tweak CJK_EX code for incorrect x-transparent charset handler - it now
+ depends on --with-charsets= configure flag -LP
+* tweak comments in UCDomap.c to be consistent with KW changes as of
+ 2.8.3dev7 -LP
+* define DECL_ERRNO for Borland compiler, so errno will be declared (report
+ by JES) -TD
+* add definition for DJGPP so truncate() function is used there, needed for
+ LYOpenTempRewrite() function -LP
+* correct character set for lines added in an external editor (Marek Kubita
+ <kubitovi@mbox.lantanet.cz>, KW, KED)
+* remove a couple more duplicate includes -LP
+* remove a couple of duplicate includes -JB (John Bley <jbley@cs.cmu.edu>)
+* fix some missing ifdef's for win32 versus DOS, as well as change calls to
+ strcasecomp() to strncasecmp() -SH
+* undo spurious change from win32 integration in dev.5 to HTSprintf0() which
+ causes a memory leak (reported by John Bley, analysis KW) -TD
+* prevent embedded "%s" in generated messages from causing a core dump in
+ exit_immediately_with_error_message by using fputs rather than fprintf/printf
+ (reported by KW) -TD
+* Changes in UCAuto.c for --enable-font-switch: Support some more code pages
+ if available. Check return code from setfont invocation, and use it to
+ determine whether font and/or translation map loading was successful.
+ Warning, this is not based on any documented interface but on
+ experimentation, so may not work for long or for anyone but me; it shouldn't
+ be worse than before though. Better logic for keeping track of state, some
+ parts just didn't work right. Workaround for wrong data in some distributed
+ font files. Minor memory leak removed -KW
+* modify test/c1.html to use tabs for better formatting, added comments -KW
+* modify HTFTP.c for better conformance with RFC959. Among other things, one
+ major purpose was ending the control conversation cleanly, at least in the
+ normal case, to get rid of the "221 You could at least say goodbye.."
+ responses from wu-ftpd servers and resulting RST traffic. In response to the
+ problem with ftp.wu-ftpd.org, made one small change to when the data_soc is
+ closed. This was done early for some specially code server types, apparently
+ those that has caused the same type of problem in the past; just changed it
+ to close data_soc at that point independent of server type -KW
+* set CDPATH to . in the makefile.in's that use cd, in case user has set
+ CDPATH without . at the beginning -TD
+
+1999-09-29 (2.8.3dev.10)
+* change CTRACE macro to double-parenthesis form, to allow ifdef'ing most
+ trace statements -TD
+* fix the creation of a new bookmark file and takes care that older bookmarks
+ files do not fall into the same bug anymore by making sure the <ol> tag is in
+ a line by itself. This correction will only be activated when the first
+ bookmark is attempted to be erased (patch by Eduardo Chappa)
+* change a trace/error message in HTInit.c to say "Lynx" rather than
+ "metamail", to avoid confusion -HN
+* change <tab> formatting in user's guide, etc., to <pre> sections, thereby
+ appeasing Dave Raggett's "tidy" program -TD
+
+1999-09-13 (2.8.3dev.9)
+* add -nobold, -noreverse, -nounderline options to disable corresponding
+ video attributes (based on a patch by John Hawkinson <jhawk@MIT.EDU>) -TD
+* add STICKEY_FIELDS to lynx.cfg, which tells lynx whether to activate the
+ previous document when an extra key-left is given -VH,TD
+* minor cleanup of run_external(), use single return, HTSprintf0 -TD
+* for WATT32 configuration, call _eth_release() and _eth_init() in HTTelnet.c
+ to make telnet work properly -DK
+* correct redefinition of u_long for WATT32 -LP
+* modify syslog change to make it more specific, based on comments by KW -TD
+* fix potential security problem with SYSLOG_REQUESTED_URLS, which would let
+ syslog() send sensitive information as broadcast to any syslog daemon that
+ care to listen.
+ E.g. URLs with embedded passwords are sent to syslog:
+ Sep 11 12:26:06 lynx[16177]: ftp://joe:password@host/~joe
+ The patch masks the password by breaking up the URL and replacing
+ the password with "******" (Gisle Vanem <giva@bryggen.bgnett.no>).
+* fix mismatch of const's from call of map_string_to_keysym() in
+ lkcstring_to_lkc() -TD
+* supply trailing slash for protocol_proxy settings (whether environment
+ variables or lynx.cfg) in HTAccess.c if the slash was omitted and if the
+ content otherwise looks normal (starts with http, no superfluous slashes) -KW
+* add links for "Free WWW E-mail services" to online help -PW
+* add links in online help to FAQ-o-matic -JES
+* more fixes to build with slang under cygwin32 - DK
+* add/use LYwaddstr(), etc to fix more const-casts (reported by PG) -TD
+* modify HTTCP.c to prevent telnet and similar applications from inadvertently
+ using hostname tokens which look like command-line options -KW
+* modify configure script's --with-charsets option so that if the option
+ --without-charsets is selected, then it will use a 'minimal' set. The
+ keyword 'minimal' is recognized as the list us-ascii,iso-8859-1,utf-8
+ (request by KW, HN) -TD
+* ifdef'd recursive calls on UCGetLYhndl_byMIME() for charsets that may be not
+ present (--with-charsets), and add getLYhndl_byCP() to cover a special case
+ of recursion which was also a preexisting hole (reported by Frederic L W
+ Meunier, analysis by KW) -TD
+* replace fr.po with a placeholder. Add placeholders for ru.po, pt_BR.po -JES
+* review/modify HTNews.c to avoid potential buffer overflows, as well as reduce
+ the number of embedded constants that make it difficult to adjust fixed
+ buffer sizes -TD
+
+1999-08-28 (2.8.3dev.8)
+* correct ifdef's combining HAVE_POPEN and __CYGWIN__ in LYPrint.c, which would
+ link popen() code when it was not available -TD
+* correct order of ifdef's for __CYGWIN__ in LYGlobalDefs.h, which would result
+ in a syntax error if the symbol __CYGWIN__ were undefined when __CYGWIN32__
+ was defined -TD
+* change hardcoded ifdef for <arpa/inet.h> include to autoconf'd form -TD
+* modify makeuctb to add ifdef's allowing most charsets to be suppressed at
+ compile time. Use similar ifdef's in UCdomap.h to suppress registration
+ of non-uctb charsets. Add configure option --with-charsets to specify list
+ of charsets which are not suppressed (def7_uni is always active) -TD
+* change makeuctb to generate the name of the output file, simplifying all of
+ the build scripts in chartrans -TD
+* correct a syntax error in crypt_util.c from dev.7 and an ifdef in LYCurses.c
+ that sets the codepath -SH
+* use macro TABLESIZE throughout for consistency -TD
+* revert use of TYPECAST for parameter of 'FREE()' macro, since that puts a
+ cast on the parameter as an lvalue (reported by LV) -PG
+* correct improperly-nested ifdef EXP_CHARSET_CHOICE in ifdef for USE_PSRC
+ in LYReadCFG.c -TD
+
+1999-08-26 (2.8.3dev.7)
+* tweak ifdef'ing of `debug_delay' (only available with SH_EX _and_ WIN_EX) -LP
+* tweak src/Xsystem.c (extern system_is_NT is now ifdef'ed with WIN_EX) so
+ exec_command() can also be used with DJGPP when compiled with _WIN_CC symbol
+ (though choice of _WIN_CC is questionable) -LP
+* simplified ifdef'ing for resolv() vs LYGetHostByName() for DJGPP -TD
+* DJGPP with WATT32 now does DNS lookup via LYGetHostByName()/gethostbyname()
+ like other lynx ports so we get reasonable error recovery when DNS lookup
+ fails. (For example, we now avoid a hang when wattcp.cfg is not configured
+ properly - a typical situation when playing with nullpkt.com). Build with
+ -DNSL_FORK (in both src and WWW makefiles) is recommended: this will prevent
+ unexpected 1 second curses delay when alerting a wrongly configured tcp. (No
+ real fork() in DJGPP, unfortunately: this function always returns -1 and set
+ 'errno' to ENOMEM, as MS-DOS does not support multiple processes. It exists
+ only to assist in porting Unix programs) -LP
+* alternative patch (replaces HN's) for UCdomap.c -KW
+* modify initialization of lynx_temp_space in case the given name has
+ embedded "~", ifdef'd for WIN_EX -SH
+* fix a problem hanging caused by allowing some unknown entities in an ALT
+ string. The "hang" problem was caused by a combination of removing too much
+ under 'case S_check_name' in 'LYUCFullyTranslateString_1', _and_ having
+ having some Latin 1 character codes that are untranslatable to the display
+ character set -KW
+* added lynx.cfg setting PSRCVIEW_NO_ANCHOR_NUMBERING that inhibits link
+ numbering when in psrc mode if set to TRUE (default is FALSE) -VH
+* fixes for justification code (anchor position recalculation) and the
+ GridText.c:*TrimHightext (it was not designed to support LY_SOFT_NEWLINES),
+ correcting rendering of links on wrapped lines in psrc mode -VH
+* fixes to www_tcp.h, LYUtils.c and UCdomap.c to build on BeOS 4.5 -TD
+* fixes for CYGWIN with Slang, mainly due to platform differences in Slang -DK
+* fixes for DJGPP, missing headers and declarations -DK
+* let CJK charsets default to 7 Bit Approximations. Needed to display entities
+ in the decimal 160-255 range. (Restore behavior before the changes made to
+ declarations of charsets on 1999-03-04) -HN
+* rename -number_links_forms to -number_fields -TD
+* add the -number_links_forms command line option (John Hawkinson
+ <jhawk@MIT.EDU>).
+* modify configure script so --enable-change-exec sets default for
+ the --enable-exec-links and --enable-exec-scripts options -TD
+* modify ifdef's for ENABLE_OPTS_CHANGE_EXEC since one or both of EXEC_LINKS
+ and EXEC_SCRIPTS must also be defined to make this effective (reported by
+ KED) -TD
+* add explanations of the various choices for revealing/not images, to Users
+ Guide, Options Help & lynx.cfg -PW
+* fix LYgetstr() to disable saving of input text on LYE_ENTER state when the
+ input is supposed to be hidden -KW
+* add/use LYaddstr() to fix some const-casts -TD
+* move dependency of "lynx$x" from "install" to
+ "install-bin:" in top-level makefile.in -PG
+* corrected display of SGML_LITTERAL content -VH
+* now LY_SOFT_NEWLINE is used in psrc mode to denote wrapped lines (as in plain
+ source mode) -VH
+* add configure option --enable-scrollbar -TD
+* make the charset-choice code lynx.cfg-reloading-safe -VH
+* add experimental code to allow users to specify that a subset of the
+ compiled-in charset definitions are available for selection for display
+ (ifdef'd with EXP_CHARSET_CHOICE, added configure option
+ --enable-charset-choice -TD) -VH
+* add/use ANSI_PREPRO symbol to simplify ifdef's concerning preprocessor token
+ substitution/concatenation -TD
+* modify ifdef of code that shows current CJK code in the title area under
+ SH_EX as well as CJK_EX -TD
+* modify HTMLDTD.c to set canclose for <Hn> inside <PRE></PRE> -VH
+* correct ifdef'ing of set_ws_title(), which should be applied only on win32
+ (reported by Frederic L W Meunier) -LP, TD
+* reduce compiler warnings from Borland C++Builder. Most of these are casts,
+ with boolean constructs dominating -JES
+
+1999-08-13 (2.8.3dev.6)
+* workarounds in LYMain.c and LYMainLoop.c for excessive compiler warnings due
+ to defective design of glibc2 -TD
+* modify logic for EXP_JUSTIFY_ELTS in GridText.c to change a raw
+ LY_NONBREAK_SPACE to ' ', to work better for tables -VH
+* add/clarify user's guide for command line option syntax -DK, KW
+* add a new command line toggle for DOS to control debugging of packets under
+ WATTCP and WATT-32. Under WATT-32, once dbug_init is called, debugging
+ cannot be turned off (although output can be sent to /dev/null). This new
+ option "-wdebug" controls whether debugging is active, is off by default -DK,
+ Gisle Vanem
+* allow ':' as a separator between the option and its value -DK
+* corrected install rule using symbolic link for copyright files (reported by
+ HN, KED) -TD
+* reset "stalled for xxx" counter from IZ's ETA change in dev.5 between ftp
+ requests -VH
+* add support for scrollbars, ifdef'd with USE_SCROLLBAR. Use command-line
+ options -scrollbar and -scrollbar_arrow or corresponding lynx.cfg to enable
+ it. Requires ncurses; may be further tuned if color-style configuration
+ is used -IZ
+* LYCopyFile(): Thanks to Hiroyuki Senshu, DOS-based systems need no cp.exe
+ binary any more. The code was originally ifdef'ed with SH_EX; now defined
+ with DOSPATH so is used automatically by any dos/windows port, not used for
+ UNIXes (permissions?) -LP
+* a few includes labeled with _WIN_CC now tweaked with WIN_EX as should be -LP
+* adjustments to SH_EX, CJK_EX ifdef's in LYMainLoop.c and LYUtils.c to aid in
+ porting -LP
+* improved logic in status_link() for -short_url option (patches from
+ NSH <nsh@itjit.ne.jp>, Eduardo Chappa)
+* modify display_page() to not necessarily call lynx_force_repaint() to make
+ highlighting work when displaying UTF-8 -Christian Weisgerber, KW
+* add check in read_directory() if transfer was interrupted -KED
+
+1999-07-30 (2.8.3dev.5)
+* add/use LYHideCursor() macro to accommodate position in older curses -TD
+* add configure option --enable-cjk to compile-in CJK_EX logic -TD
+* add -short_url option and associated logic to elide middle of long urls
+ (adapted from patch by Eduardo Chappa <chappa@math.washington.edu>) -TD
+* ifdef'd read-progress changes with EXP_READPROGRESS, add configure option
+ --enable-read-eta to turn this on -TD
+* enhanced read-progress logic (Ilya Zakharevich):
+ a) makes size/transfer rate reports use format "8.3 KB" (instead
+ of "8 KB") if numbers are below 10 KB and reports are in KB;
+ b) makes transferred/expected/transfer-rate use bytes/KB independently
+ so "236 bytes of 56 KB" is possible, as is
+ "8.3 of 56 KB, 456 bytes/sec";
+ c) adds "ETA 23 sec" info if available;
+ d) adds " (stalled for 75 sec)" info if available (updated each 5
+ sec or so);
+ e) uses gettimeofday() if present (instead of current hacks) to get more
+ frequent updates.
+* fixes for OS/2 and ncurses from Ilya Zakharevich:
+ a) Makes lynx ignore mouse events which are not clicks (filtering through
+ ncurses does not work as expected).
+ b) Makes mouse-clicks "basin of attraction" of a link wider (the area where
+ clicks make the link a current link). It was 2 units vertically and
+ horizontally, make it 2 units vertically, and 6 units horizontally. This
+ leads to "more intuitive selection".
+ c) Make processing of .lynx-keymap write messages to trace buffer;
+ d) LAC-keybindings were not working;
+ e) Allow .lss files include one another via INCLUDE:/file/name
+ g) Allow a change of default color in .lss files (not the color of attributes
+ text, but colors for a style if "default" is specified); This (together
+ with "e") allows for a simple modification of a color scheme
+ Here is an example of a .lss file with a changed default
+ foreground/background and a handful of other declarations fine-tuned for
+ this change. (It implements "Commander" style). "Overriding"
+ declarations should be put before INCLUDE:, and the "default:" declaration
+ should be the last one.
+ status:reverse:yellow:black
+ h1:bold:yellow:black
+ em.a:reverse:black:blue
+ em.b:reverse:white:black
+ font.letter:normal:default:black
+ link.blue:bold:white:brightblue
+ link.blue.prev:bold:yellow:brightblue
+ title:normal:magenta:black
+ i:bold:white
+ table:normal:white
+ blockquote:normal:white
+ li.blue:bold:blue:black
+ link.blue.next:bold:blue:black
+ normal:normal:default:default
+ INCLUDE:F:/emx.add/lib/lynx.lss
+ default:normal:brightcyan:blue
+ h) Improve algorithm for allocation of color-pairs;
+ i) Lynx was not recognizing HOME directory on EMX;
+ j) UP_LINK and DOWN_LINK now actually move along a vertical line (as far as
+ it is possible), including an arbitrary sequence of such keypresses.
+* modify LYIsPathSep() macro to include '\' for OS/2 EMX -TD
+* correct a problem with spurious cookie names when reloading lynx.cfg (Michael
+ Warner, KW)
+* add check for too-long line in HText_ExtEditForm(), splitting it if needed
+ (reported by <yury.burkatovsky@telrad.co.il>) -TD
+* move NO_GROUPS definitions from HTFile.c to HTFile.h to make them available
+ for use in LYUtils.c on DOS -LP
+* correct several minor problems with integration of SH's changes in
+ GridText.h, HTAlert.c and LYPrint.c (reported by LP) -TD
+* restore dev.3 interface to LYLowerCase and LYUpperCase and do casts
+ internally to work on unsigned chars -PG
+* corrected typos in some messages (reported by Dmitry Sivachenko
+ <demon@gpad.ac.ru>) -TD
+* changes for win32 -SH
+ + added ifdef's using _WIN_CC (for Borland C) to some places in prettysrc
+ definitions which use the __STDC__ symbol.
+ + renamed makefile.w32 to makefile.bcb
+ + renamed src/chrtrans/makefile.w32 to src/chrtrans/makefile.bcb
+* the DOS port compiled with WATT-32 now works in a DOS window under Windows
+ 3.11 and Windows for Workgroups 3.11. It still needs its own packet driver
+ and does not use any native winsocks and has only been tested with Toni
+ Lopez's DOSPPP. This does fill a void for those running Win3.x, who
+ previously had to close Windows and go back to plain DOS before they could
+ run lynx. Updated the help files, reflecting current platform support -DK
+* corrected definitions in HTTP.c and HTDOS.h to build with old TCP library -LP
+* When keypad_mode was changed from forms options menu
+ set_numbers_as_arrows()/reset_numbers_as_arrows() was not reinitialized
+ (reported by KED) - LP
+* SOURCE_CACHE: add one more parse setting member (keypad_mode)
+ to HText structure -LP
+* SOURCE_CACHE: fix updating the document when "display charset" was changed
+ from Options Menu by user: FREE(anchor->UCStages) call from
+ HTuncache_current_document() now duplicated in HTreparse_document().
+ (problem reported by KW) - LP
+* tweak trace message in scan_cookie_sublist(): limit trace output by trying
+ LYstrstr() as a first approximation before host_matches() -LP
+* open temp-file in LYNewsPost() in binary mode for DJGPP to avoid translation
+ of \r\n vs \n -DK
+* add note about potential conflicts with cookie files to description of
+ --disable-persistent-cookies -BJP
+* added status message to indicate state of text inputs -VH
+* added ability to make text inputs non-sticky (i.e., user will have to
+ activate them explicitly via an LYK_ACTIVATE action) - seems useful for
+ people navigating with alphanumeric keys. Default is 'sticky' - i.e., old
+ behavior. Behavior is controlled via command line option '--sticky-inputs'
+ and STICKY_INPUTS in lynx.cfg -VH
+* added conditionals to 'userdefs.h' that disable support for
+ force-empty-hrefless-a mode if lynx is configured without lss (it's not
+ useful for such setup) -VH
+* minor change to prettysrc mode, writing comments one character at a time
+ to avoid translation of \r\n to \n\n in HText_appendText() -VH
+* correct rendering of DL in EXP_JUSTIFY_ELTS, will inhibit justification of
+ DT's content -VH
+* other modifications to EXP_JUSTIFY_ELTS logic, to use information associated
+ with each element that indicates whether it can be justified -VH
+* modify HTMLDTD.c so that "center" is not treated with EXP_JUSTIFY_ELTS -VH
+* fix for core-dump in EXP_JUSTIFY_ELTS -VH
+* modify signal handling in LYSystem to workaround competing SIGTSTP handlers
+ when a subprocess is active. This adds a new function LYToggleSigDfl(),
+ using sigaction as an alternative to signal to save/restore as much of the
+ signal state as possible -KW
+* add configure option --enable-justify-elts (request by VH) -TD
+* add configure test for sigaction function and related structs -TD
+* restore hardcoded escape sequences on Unix in setup_vtXXX_keymap()
+ inadvertently dropped in dev.4, to accommodate users of slang library who
+ have their $TERM set incorrectly -TD
+* correct ifdef's for resizeterm() call to allow Lynx to build with old
+ versions of ncurses -TD
+
+1999-07-14 (2.8.3dev.4)
+* minor fixes to build with SunOS K&R compiler -TD
+* cleanup unbalanced curly braces from other recent experimental options -TD
+* rename internal definition for LINKS_AND_FORM_FIELDS_ARE_NUMBERED to
+ LINKS_AND_FIELDS_ARE_NUMBERED to keep it shorter than 32 characters -TD
+* change ifndef's for NO_JUSTIFY to ifdef EXP_JUSTIFY_ELTS since something in
+ VH's recent code causes core dumps, by crosslinking the state of two parts of
+ the parser -TD
+* modify slang code to recognize F1 from terminfo/termcap on Unix (John E Davis)
+* changes to use the WATT-32 tcp library, making a DOS port that does http,
+ ftp, news, mailto, and telnet -DK
+ Remaining work includes:
+ * This has been tested only with slang and the djgpp_keyhandler code. There
+ will probably need to be more changes to have this work properly with
+ PDCurses.
+ * There is at least one bug. When set to use http_proxy, there seems to be a
+ long wait between socket connect and write if the proxy is accessed too
+ rapidly in succession. It seems that if it is accessed more frequently
+ than about 20 seconds, there is a timeout of up to about 85 seconds.
+ * some problems with ctrl-break handling, will report to the watt-32 list.
+* rename tcp.h to www_tcp.h -DK
+* fix typo in manpage description of -color (Christian Hudon
+ <chrish@debian.org>).
+* add $(LDFLAGS) to chrtrans/makefile.in, for NetBSD -JES
+* use symbolic link rather than hard link for installing copyright files -TD
+* now dashes and underscores can be intermixed in commandline options, and in
+ -restriction option, ifdef'd with OPTNAME_ALLOW_DASHES -VH
+* added commandline switch '-dont_wrap_pre' that will inhibit line wrapping in
+ <pre> when -dump'ing and -crawl'ing. (But maximal length of line on output
+ can't exceed MAX_LINE (1023 by default)) -VH
+* lynx.man updated to reflect new option -dont_wrap_pre and to note that gnu
+ style of options (with two dashes) is also supported -VH
+* some small developer's docs tweaks -VH
+* added text justification (controlled by commandline switch '-justify' and
+ from lynx.cfg too), ifdef'd with NO_JUSTIFY -VH
+* added support for emitting backspaces (a-la man) - commandline option is
+ '-with-backspaces', ifdef'd with NO_DUMP_WITH_BACKSPACES -VH
+* added support for forcing-empty-HREFless-As - ie A element that doesn't
+ contain HREF will be closed after it was seen (without waiting for </a>) -
+ this fixes rendering of documentation, produced by broken translators that
+ don't emit balanced 'A's (eg RedHat docs produced by 'dlh', Sybase docs) -
+ commandline option is --force-empty-hrefless-a, and force_empty_hrefless_a in
+ lynx.cfg, ifdef'd with NO_EMPTY_HREFLESS_A -VH
+* changes for win32 by Hiroyuki Senshu <senshu@shonai-cit.ac.jp> SH:
+ from
+ ftp://crab.it.osha.sut.ac.jp/pub/Win32/develope/senshu/Lynx/
+ based on his patch against 2.8.2pre.6
+ Most changes are ifdef'd
+ #define _WIN_CC= .... for Windows C Compiler
+ #define CJK_EX .... CJK EXtension
+ #define SH_EX .... Senshu Hiroyuki EXtension
+ #define WIN_EX .... Windows EXtension
+* add missing null-pointer check in MakeNewMapValue(), for verbose-images
+ (from Debian bug report #39596) -TD
+* test/build with gettext-0.10.35 -TD
+* renamed uppercase makefiles and .bat files to lowercase, change the makefiles
+ consistently to Unix-style format -TD
+
+1999-06-29 (2.8.3dev.3)
+* move HTAlert call so we don't get it each time we run the options menu -TD
+* entify messages in LYshow_statusline_messages() -LP
+* add -DNO_PORT to WWW/*/djgpp makefiles -DK
+ This is to make ftp work with new version of the WATTCP library as revised by
+ Igor Poretsky for building lynx with DJGPP. The old version has been renamed
+ to "tcplibdj-old.zip". For the new package, go to:
+ "http://www.rahul.net/dkaufman/tcplibdj.zip" or
+ "ftp://ftp.rahul.net/pub/dkaufman/tcplibdj.zip"
+* new option REUSE_TEMPFILES, see comments in lynx.cfg -KW
+* use P instead of invalid TR for right-aligned "LYNXMESSAGES:" link in HISTORY
+ page -KW
+* better support for accessing FTP directory listings on Windows NT FTP
+ servers: try to switch MSDOS-like directory output off with SITE DIRSTYLE.
+ The price to pay for this is one or (probably more often) two more command/
+ response round trips -KW
+* added support for accessing FTP directory listings in "dls" style sent by
+ some OS/2 servers. Only one server was known and used for testing, so the
+ heuristics used may not be quite general enough. File date/time is not shown
+ since it doesn't seem to be part of the basic format -KW
+* in lynx.man removed bogus "ID:" for -assume_charset,
+ -assume_local_charset -KW
+* in a list, render a <DIV> that doesn't have an ALIGN="center" or
+ ALIGN="right" attribute like a <P> in that situation: break the line if
+ necessary but don't create an empty line, an keep list indentation. This
+ addresses Debian bug #21331 -KW
+* other changes for DIV: it's a block element, so make sure its contents
+ doesn't get rendered inline, even for nested DIVs that don't change text
+ alignment. Try to avoid improperly kept change of DIV styles' alignment by a
+ <P> or </P> in its content -KW
+* make "treating H# in a list as an LH" work also for SortaSGML parsing,
+ previously it only worked with TagSoup -KW
+* removed special handling for empty last field from LYstrsep(), which made it
+ act differently from (GNU) C library's strsep() -KW
+* macro DEFAULT_INVCHECK_BV for default invalid cookie checking behavior, can
+ be changed at top of LYCookie.c for those who really want that -KW
+* reorganize code for invalid cookie checking / prompting somewhat, it is
+ hopefully easier to follow now, and should result in more logical prompting
+ (or not) if a cookie is invalid for more than one reason -KW
+* change invalid cookie confirmation prompts to default to "no" answer. This
+ can prevent the impression that Lynx hangs because the prompt is not
+ completely visible. There should be a better way to ensure that all prompts
+ are recognizable as such (at least with "normal" screen widths) -KW
+* use more of the available statusline width for showing cookie name and value
+ in normal cookie prompts -KW
+* handle \" in quoted cookie values, so that the quote char doesn't end the
+ value string -KW
+* write quoted cookie values to cookie file with the quotes ('"' chars). When
+ the cookie file is read, assume that quoted strings are quoted cookie values.
+ It would be better to have a separate flag stored, but we are limited by the
+ choice of the Netscape-compatible file format. This should resolve Debian
+ bug #35523 -KW
+* handle empty value strings like any other cookie values: they can be kept in
+ the cookie jar (in memory), and can be written to and read from the cookie
+ file -KW
+* more checking whether a line read from a cookie file is complete -KW
+* write out second field in cookie file lines a TRUE or FALSE depending on
+ whether the domain can be used for suffix matching or has to match
+ completely. This seems to be how Netscape uses it. We don't actually use
+ this field when reading a file (presence of a leading dot in the domain value
+ tells us what we need to know), but this should improve behavior for people
+ sharing a cookie file between Lynx and a Netscape browser (although such
+ sharing shouldn't be recommended) -KW
+* treat case as insignificant in cookie domains more consistently -KW
+* remove remnants of FROM_FILE domain behavior, it was unused -KW
+* add some clarifications in lynx.cfg regarding cookies -KW
+* entify strings when adding them to LYNXMESSAGES: stack -KW
+* save HTAlwaysAlert messages for LYNXMESSAGES: page -KW
+* generate TRACE output for prompts that use HTConfirm() or
+ HTConfirmDefault() -KW
+* make sure force_old_UCLYhndl_on_reload is initialized and reset properly -KW
+* minor tweaks (LYCharUtils.c, LYMain.c, LYPrint.c) -KW
+* flush Lynx.leaks file after writing each memory leak record but before
+ freeing the memory block, to ensure the info is on disk if something goes
+ seriously wrong (i.e., FREE causes a signal) -KW
+* more general checking in postoptions - `lynx LYNXOPTIONS:foo' now doesn't
+ crash -KW
+* revived dired "install" functionality, more or less as it was (apparently)
+ originally meant to be used, but with various checks added. Compilation is
+ now conditional on new symbol OK_INSTALL. The "install" function is the
+ closest we have to a "copy file" function, and could be used instead; the
+ actual command executed depends on macros INSTALL_PATH and possibly
+ INSTALL_ARGS, one can define INSTALL_PATH for example to "/bin/cp" before
+ compilation to effectively get something like a dired "copy" function. Note
+ the the "install" function requires a special file in the home directory,
+ which can be customized, see samples/installdirs.html -KW
+* new function HTURLPath_toFile in HTFile.c. Use it if we don't have a full
+ URL where HTnameOfFile_WWW was used previously, this avoids misparsing of
+ some unusual URL forms for files -KW
+* other changes for dired support (KW):
+ - various corrections with respect to URL-unescaping: don't escape
+ too often or too little, dired operations could fail on filenames
+ with special characters
+ - avoid some unnecessary copying and allocation for filenames
+ - avoid some more static buffers
+ - add some buffer overflow checks
+* make local directory display somewhat interruptible even without
+ partial page display -KW
+* make do_readme in HTFile.c 8-bit clean -KW
+* tweak in HTTP.c to avoid doing strlen() on received data that are to be
+ passed on raw; raw NUL bytes within the first block read could lead to data
+ loss -KW
+* change newly introduced CAN_ANONYMOUS_* at end of userdefs.h to be FALSE by
+ default, to get behavior with -anonymous that is equivalent to 2.8.2 -KW
+* handle some more common forms of mailcap $DISPLAY tests internally in
+ HTInit.c -KW
+* correct a problem which appears when the curses library causes FANCY_CURSES
+ to be defined but not COLOR_CURSES: the code can call attrset() twice for
+ the same characters, thus replacing the original attribute with the new one.
+ Fix by using attron() instead (patch by Julian Coleman
+ <J.D.Coleman@newcastle.ac.uk>)
+* modify LYonedot() so it does not change its parameter, avoiding corrupting
+ the name to be zipped (reported by DK) -TD
+* modify LYDownload.c to skip over delimiter for file://localhost to avoid
+ treating it as part of the DOS filename -DK
+* alter LYExecv() to only do an HTAlert if the return-code is zero, i.e., an
+ error was reported. This lets us reuse (and free) memory pointed to by
+ tmpbuf (reported by DK) -TD
+* remove redefinition of lstat() and change test of stat() function with DJGPP,
+ which returns nonzero rather than negative on failure -DK
+
+1999-06-18 (2.8.3dev.2)
+* move some of the path-manipulation from the DJGPP dired change into new
+ functions LYisAbsPath, LYisRootPath and LYLastPathSep -TD
+* dired support with DJDPP -Igor B Poretsky, DK, TD
+ (patch adapted by DK from Igor B Poretsky, (Some corrections/rework by TD
+ also - must retest).
+ Some notes from DK:
+ + since this is DJGPP based, it may be incompatible with a called program
+ that uses a WATCOM DOS extender. I think I had this problem with a
+ precompiled binary for zip. The current zip binary doesn't have this
+ problem.
+ + The key to making this work with DJGPP is the __sysflags = 0x501d in
+ LYMain.c, since this lets the system() call handle multiple commands on one
+ line and allows the cd command to work across disks.
+ + I didn't look at Igor's changes to LYMainLoop.c as regards to the HTUncache
+ calls. He said he wasn't sure about this.
+ + This was tested with Info-Zip's zip and unzip, GNU tar, gzip, comp430d,
+ PKZIP, and PKUNZIP. This was only tested when built with slang. I don't
+ see where PDCurses is likely to cause a problem, however.
+ Problems:
+ + To make this work, I made lynx_edit_mode = TRUE in LYMainLoop.c. This does
+ not seem to be the correct solution. It seems that this should be handled
+ by the code in HTAccess.c, but I don't understand how this works. If
+ lynx_edit_mode isn't true, the dired menu doesn't appear with the "f"
+ invocation of LYK_DIRED_MENU.
+ + I'll try to explain this briefly, but this bug is very reproducible. If a
+ program is invoked from the dired menu which needs to interact with the
+ user, the system sometimes freezes and has to be rebooted. For example, a
+ call to unzip a zip archive where the files already exist has zip ask if
+ the file should be overwritten. If done initially after lynx is started,
+ no keystrokes are accepted and the system always hangs. If, however, any
+ file has been moved or had its name changed via the dired menu, then the
+ above problem doesn't occur. I have tried to see what changes after the
+ name change that fixes this problem, but I am stumped. Gzip and unzip seem
+ to have this problem, but PKUNZIP doesn't.
+* correct most-recent LYNX_RELEASE_DATE (reported by KW) -TD
+* change touchline() call in LYOptions.c to touchwin() in case anyone wants to
+ compile with BSD 4.4 curses (reported by IC) -TD
+* modified ifdef for DECL_ERRNO to allow for errno to be a macro -TD
+* ifdef'd the extern declaration of h_errno in HTTCP.c in case that name is
+ also a macro, e.g., for threaded code (reported by Mike Gravitz
+ <ddavid@lamar.ColoState.EDU> on AIX 4.3.1.0) -TD
+* rename ALLOW_USERS_TO_CHANGE_EXEC_WITHIN_OPTIONS to keep the names less than
+ 31 characters, and add configure option --enable-change-exec to set the
+ ENABLE_OPTS_CHANGE_EXEC ifdef -TD
+* correct syntax of popup_choices() within
+ ALLOW_USERS_TO_CHANGE_EXEC_WITHIN_OPTIONS ifdef (reported by IC) -KW
+* modified some message texts, mostly for consistency -KW
+* correct display of local file times in INFO screen -KW
+* add null-pointer checks for buf2 variable in
+ exit_immediately_with_error_message(). Invalid memory access happens if
+ access to startfile fails but first_file is not true -KW
+* change all ifdef's except on for VAX Ultrix that use the presumed predefined
+ symbol 'unix' to 'UNIX', which the configure script sets. Not all Unix
+ systems define this in their compiler -TD
+ From compiler warning on NetBSD 1.4 (report by JES):
+ deprecated symbol "unix" is no longer predefined
+* add experimental file-upload, ifdef'd with EXP_FILE_UPLOAD and configured
+ with --with-file-upload (adapted from patch by RP) -TD
+* document use of '|' pipes in PRINTER commands in lynx.cfg -TD
+* add shell script man2hlp.sh, used that to generate lynx.hlp from lynx.man -TD
+* SOURCE_CACHE: source_cache_file and source_cache_chunk are now members of
+ HTParentAnchor (where they should belong, not HText nor mutable globals).
+ Add one more parse setting member (verbose_img) to HText structure -LP
+* correct spelling of ifdef for reload_read_cfg() (reported by KW) -LP
+* minor docs tweaks -LP
+* test/{sgml.html, unicode.html} files were badly broken for tagsoup mode
+ (incorrect html: extra <pre>..</pre> were added inside PRE mode in dev26) -LP
+* fix back-slashes conversion for DOSPATH systems when expanding ~ to local
+ path (mostly affects information screen) -LP
+* correct default value for --disable-persistent-cookies configure option
+ (reported by HenSiong Tan <tan@stat.psu.edu>) -TD
+* uncomment --with-libjs configure option -TD
+
+1999-06-11 (2.8.3dev.1)
+> minor corrections by TD, patch from KW:
+* Key handling changes:
+ - Extended lynxkeycodes: a bit flag is used to indicate that the lower bits
+ of the value already are a lynxactioncode and need not be looked up again.
+ Reduces need for back and forth forward and reverse binding lookups;
+ currently only used in some places.
+ - Extended lynxkeycodes: several (currently three) bit flags are used to
+ indicate key modifiers.
+ - Added some macros for manipulating and mapping of these codes, see
+ especially LYKeymap.h, LKC_TO_LAC() etc. Added some comments about the
+ various kinds of codes.
+ - Added several editaction codes and flags for setting key modifier on next
+ key (i.e. for declaring keys as prefix keys, for the purposes of line
+ editing); for flagging a key for different action if same key is repeated;
+ for exiting input field line editing and passing a specific lynxactioncode
+ on; and for undoing 8-bit C1 -> 7-bit replacement transformation for some
+ chars. Added code to line-editor implementation to react to these new
+ editactions. Note that the mapping of lynxkeycode to lynxactioncode
+ outside of line editing, i.e. KEYMAP in lynx.cfg etc., ignores the
+ modifiers. The main loop just drops modifier flags or ignores the modified
+ key; modifier flags cannot be used in lynx.cfg KEYMAP 'keystroke' values.
+ - An ESC not recognized as part of an escape sequence can set the appropriate
+ modifier flag in LYgetch(), except for SLANG which normally uses a
+ different LYgetch() implementation. Interpreting an ESC prefix as modifier
+ is very useful for situations where a held-down Alt key (or some other key)
+ is encoded this way: linux console, kermit with emacs key mappings,
+ possibly xterm with '*eightBitInput: false'. OTOH it doesn't work for all
+ characters or in all situations.
+ - Extended syntax recognized in .lynx-keymaps file (which is only used if
+ compiling with USE_KEYMAPS defined, which in turn depends on slang and
+ ncurses version):
+ (a) Meta-foo can be used to map an escape sequence to a key + modifier.
+ (b) LAC:foo can be used to map an escape sequence directly to a
+ lynxactioncode (actually, to an extended lynxkeycode that
+ encapsulates a lynxactioncode).
+ See examples added to samples/lynx-keymaps.
+ - Extended syntax of KEYMAP option, additional field can override line-editor
+ behavior. PASS documented in lynx.cfg.
+ - Extended syntax that can be used for specifying key in KEYMAP, some of the
+ forms allowed in .lynx-keymaps file are now additionally recognized, but
+ only if compiling with USE_KEYMAPS defined. Left undocumented in lynx.cfg
+ (maybe subject to change).
+ - New "Bash-like" Line Editor binding. Adds several new emacs-like editing
+ functions. Adds tables for keys with modifiers (actually the same table is
+ currently used for all modifiers, to save some space). Most notably, ^X is
+ a prefix key to set a modifier flag. Keys with second function when
+ pressed twice are ^E^E and ^K^K. ESC is also recognized as setting a
+ modifier flag, in case it gets through without been having been handled in
+ LYgetch(). See new file keystrokes/bashlike_edit_help.html for more info.
+ The Bash-like Line Editor Bindings are only compiled in if compiled with
+ -DEXP_ALT_BINDINGS / configured with --enable-alt-bindings (but not subject
+ to a new macro). Implementation code for the new emacs-like functions
+ additionally ifdef'd with ENHANCED_LINEEDIT.
+ - Avoid dependency on DNARROW key binding when form field line-editing is
+ ended with Enter or Return key.
+ - Take setting of real_c/old_c into consideration after return from form
+ field line-editing. Previously there were some strange effects:
+ statusline messages would sometimes not appear when they should, the KEYMAP
+ command would sometimes not work when invoked with ^Vk while in a form
+ field.
+ - Make NOCACHE ('x') work for TEXT_SUBMIT_TYPE form fields (i.e. forms with
+ a single text input field where Enter automatically submits). Of course
+ 'x' has to be typed as ^Vx while line-editing the field (or NOCACHE mapped
+ to a different key). Similarly allow DOWNLOAD, and HEAD to work for such
+ fields. Try to ensure that all permission checks that apply to other form
+ submissions are also done for TEXT_SUBMIT_TYPE fields, this wasn't the case
+ before.
+ - New key actions LPOS_PREV_LINK and LPOS_NEXT_LINK. They are like PREV_LINK
+ and NEXT_LINK, with the difference that, when moving to a form input or
+ textarea line, the last column position (relative to the field) is
+ remembered. They are not mapped by default, but mentioned in lynx.cfg.
+ - New key action DWIMHELP. It should give some context-sensitive help.
+ Currently the appropriate Line Editor Binding help page is shown if a form
+ input field is selected, otherwise it defaults to the main HELP page.
+ - New key action DWIMEDIT. Revert meaning of EDIT back to previous meaning:
+ always edit document file, not textarea content. DWIMEDIT acts like
+ EDITTEXTAREA if the current link is a form textarea or input field and
+ AUTOEXTEDIT was defined, and like EDIT otherwise. Also added slightly
+ different statusline message if form field external editing cannot be done
+ because editing is disabled: it shouldn't refer to "The 'e'dit command".
+ - Summary of reasonable ways to invoke external texarea editing (assuming
+ that it is desired to keep the action of 'e' to edit files at least outside
+ of input fields):
+ 1) KEYMAP 'e' to DWIMEDIT, invoke ^Ve. (if AUTOEXTEDIT is defined,
+ which is the case by default.)
+ 1a) KEYMAP <some other key> to DWIMEDIT, invoke ^V<some other key>.
+ 1b) KEYMAP <some other key> to EDITTEXTAREA, invoke ^V<some other key>.
+ 2) KEYMAP a key (function or control, not printable!) to EDITTEXTAREA
+ or DWIMEDIT, using PASS in the KEYMAP line.
+ 2a) Find some key whose LineEdit binding is already LYE_FORM_PASS, and
+ KEYMAP it to EDITTEXTAREA or DWIMEDIT.
+ 3) compile with EXP_ALT_BINDINGS defined (--enable-alt-bindings),
+ select Bash-like Bindings,
+ invoke ^E^E or ^X^E (or ESC ^E aka M-C-e), or
+ invoke ^Xe (or ESC e aka M-e), or
+ 3a) compile with EXP_ALT_BINDINGS defined (--enable-alt-bindings),
+ and without selecting Bash-like Bindings
+ (invoke ESC ^E aka M-C-e or ESC e aka M-e).
+ Bindings in parentheses under 3/3a may not work with slang unless a
+ tweaked .lynx-keymaps file is used.
+* Other changes related to textarea handling:
+ - More appropriate message statusline message if GROWTEXTAREA or INSERTFILE
+ cannot be done because a textarea is not selected: it shouldn't refer to
+ "external editor".
+ - Check whether an editor is defined before trying to use it for textarea
+ editing. Generate message if spawning of external textarea editor failed.
+ - Allow INSERTFILE only if file access is not restricted.
+ - Enforce dotfiles restriction and "show dot files" setting for INSERTFILE.
+* Mouse handling changes, mostly only if mouse support comes via ncurses:
+ - Re-enabled changing link by clicking in area *near* a link (but not on the
+ link text), but limit max. distance to 2 character positions.
+ - Make mouse popup menu disappear when it should, by applying the right magic
+ touchline() in popup_choice().
+ - Lots of small tweaks to remove glitches in mouse handling, among them: No
+ left scrolling of long input fields on entering with mouse. Try to ensure
+ statusline is updated after mouse menu. Make menu actions work as
+ expected. Avoid acting on mouse events, especially invoking mouse menu, in
+ wrong context (e.g. while at a prompt), at least in many places.
+ - Clicking on left or right border of mouse menu now only moves selection.
+ - At right end of top/bottom line, where single click causes HISTORY action,
+ double click now causes VLINKS action.
+ - Allow to distinguish between submitting and just positioning into a
+ TEXT_SUBMIT_TYPE input field. Single click positions, double click
+ submits, 'activate' from menu also submits.
+ - When initializing ncurses mouse, call mousemask() with only those bits set
+ that we may actually be interested in.
+* Changes relevant for handling window size changes:
+ - For ncurses, changed the way how mainloop() notifies the curses library
+ about a window size change. The approach taken previously, and still used
+ if we are not using ncurses, has more overhead, can unnecessarily switch
+ out of the alternative screen buffer (and back) under xterm, and didn't
+ really make ncurses update the WINDOW structures for the new size in time.
+ - Other tweaks for size change: make sure curdoc.link is valid after
+ refresh.
+ - Detection of size changes in more situations: tolerate EOF from GetChar in
+ the (non-SLANG) LYgetch_for() in more cases if errno is EINTR, if this
+ happens check for a size change and generate trace output. Recognize
+ KEY_RESIZE from ncurses, check for a size change and generate trace output
+ when it occurs.
+ - Added NONRESTARTING_SIGWINCH lynx.cfg option and -nonrestarting_sigwinch
+ flag. If set, lynx *may* react more immediately to window size changes
+ when running under xterm or similar. Whether this actually has an effect
+ depends on the implementation of sigaction() and on the behavior of the
+ curses (or similar) library when a read() (or other system call) is
+ interrupted by signals.
+ Depends on '#if HAVE_SIGACTION', which currently has to be defined by hand,
+ for example by 'make SITE_DEFS="-DHAVE_SIGACTION"'. The command line flag
+ is only available on systems with HAVE_SIGACTION and SIGWINCH.
+ - Tweaks so that lynx in an xterm can survive when the window size is made
+ (probably temporarily) very small, for example 1x1. Avoid display_page's
+ work if it wouldn't be displayable anyway. Make display_title handle very
+ small screen widths, at least to the degree that it doesn't crash.
+* Except for VMS or when DOSPATH is defined, set restore_sigpipe_for_children.
+ Fixes Debian bug #33853, maybe not really a bug but let's be nice.
+* Changes in HTTCP.c:
+ - Added a CTRACE_FLUSH before creation of NSL_FORK child process.
+ - Block certain signals during creation of NSL_FORK child process, if
+ sigprocmask() and friends are available. This should prevent a rare
+ problem where sometimes the child process could be killed before it has a
+ chance to modify its signal handlers, resulting in screen corruption, a
+ seemingly hanging lynx, and/or other problems. It is assumed that
+ sigprocmask() etc. are available if HAVE_SIGACTION is true. It currently
+ has to be defined by hand, for example by 'make
+ SITE_LYDEFS="-DHAVE_SIGACTION"'.
+ - Generate diagnostic messages for some failures of forked lookup. Depends
+ on HAVE_H_ERRNO. In particular, try to detect whether the child process
+ failed because of memory problems, and also fake a 'z' in that case to
+ short-circuit a URL guessing cycle.
+ - For most systems, generate more trace output for connection attempts, close
+ to the actual connect() and select() calls to prevent clobbering errno.
+ See SOCKET_DEBUG_TRACE. This should help diagnose some obscure
+ system-dependent problems that have occasionally been reported.
+* Added some missing stuff for color handling to forms Option Menu code.
+* Printing to screen sometimes didn't show anything for short texts, if screen
+ output was buffered (and ncurses makes stdout buffered). Added another
+ fflush(stdout) in send_file_to_screen().
+* Some checks for specific URLs (helpfilepath, lynxlistfile, and lynxjumpfile)
+ in LYGetFile.c were inappropriately case-insensitive for Unix. The
+ comparison is now case-sensitive except for VMS. This may need tweaking for
+ DOS and similar systems.
+* Added additional LYNoRefererForThis check in getfile(), the one in mainloop()
+ could be missed for TEXT_SUBMIT_TYPE form fields. Also moved other check for
+ whether to send Referer header earlier, and made it apply for URL types that
+ might be proxied.
+* LYAddVisitedLink tried to regard documents with the same address but a
+ different title string as different documents, but this was coded wrong.
+ Removed ineffective comparison, but keep old title string if new title string
+ is empty.
+* Correct long-standing logic error in MAIL_SYSTEM_ERROR_LOGGING handling.
+ Apparently not many people are using it...
+* Fix for traversal code to put the right address into the TRAVERSE_REJECT_FILE
+ if a request fails after popping a document from the history stack (this can
+ only occur if a previous request for the same document had succeeded). Also
+ don't try to send mail in such a case if MAIL_SYSTEM_ERROR_LOGGING is on.
+ Also prevent possible history stack underflow if this occurs on return to the
+ first document.
+* According to lynx.cfg, error logging mail may be sent to ALERTMAIL if no
+ document owner is known, but this was not implemented; now it is. ALERTMAIL
+ is used if it is defined non-empty in userdefs.h. Of course normally it
+ should be left undefined.
+* Fix for traversal code to reject form fields a bit earlier. This prevents
+ unnecessary lookups as well as adding of an empty line to the
+ TRAVERSE_REJECT_FILE for each form field encountered.
+* Format -crawl output as was documented in CRAWL.announce: with this switch,
+ link numbering is always off by default (userdefs.h and lynx.cfg defaults und
+ saved user preference are ignored) unless -number_links is given, and -crawl
+ -traversal format is now consistent with -crawl -dump with respect to link
+ numbering. As a side effect, -crawl without either -traversal or -dump now
+ also turns link numbering off unless -number_links is used (the meaning of
+ -crawl without either of these was undocumented), so it then acts effectively
+ as a (less powerful) negation of the -number_links switch.
+* For -crawl -dump, the list of links was appended twice. Fixed.
+* Check URL as well as title before deciding that a document should not be
+ pushed on the history stack because it looks like a generated special page.
+* Made "Don't waste the cache" optimization in historytarget() subject to
+ additional checks, to avoid uncaching of the wrong document in some cases.
+* LYSafeGets() would drop the last line from a file if it was not terminated.
+ Changed to return the unterminated line like fgets().
+* Clarifications on restrictions. "download" does not imply "disk_save" while
+ "print" does, this doesn't seem to make much sense but has been the behavior
+ for a long time.
+* Restrictions inside_news, outside_news now apply to reading as well as
+ posting. The documentation (except for the corresponding comments in
+ userdefs.h) said that they apply to posting, while in fact they were
+ implemented for reading only. [Does nobody read this stuff???] Also, the
+ implementation only checked the flag for news: URLs, but not for nntp:
+ URLs, which doesn't make much sense given that the latter provide an
+ alternative way for most (if not all) purposes of the first. So now these
+ restrictions apply to news:, nntp:, newspost:, and newsreply: (but not to
+ snews:, snewspost:, or snewsreply:).
+* Document -restrictions=externals.
+* Some of the restriction stuff not added to VMS lynx.hlp file, since I'm not
+ quite sure whether the corresponding features work there at all.
+* Changed restriction parsing so that "all" and "default" don't get ignored if
+ they appear as one of several items in the same list.
+* Implement listing of current restrictions to stdout with new -restrictions=?
+ option. This should appear as the last command line option, otherwise the
+ effect of options appearing later may not be shown. The '?' may require
+ quoting.
+* Made -restrictions= (without any option flags) act like -restrictions
+ (without equal sign either) as implied by documentation, i.e. list
+ recognized restriction options.
+* LYRestricted has been greatly abused. Once upon a time it was a PRIVATE flag
+ in LYMain.c (then called anon_restrictions_set), used only to get the
+ precedence of various command line options right. Recently it has been
+ misused as a check (and as the only one) whether "anonymous restrictions" are
+ in effect. This undermines various assumptions:
+ - that -anonymous is basically an aggregate set of restrictions which could
+ be specified individually with -restrictions=.
+ - that individually listed restrictions (-restrictions=...) act as expected,
+ and can be used to restrict various aspects in a useful manner.
+ - that -validate implies the strongest restrictions, except for what is
+ explicitly exempted (i.e. 'g'oto for http/https URLs).
+ Use specific restrictions instead:
+ - new "compileopts_info" for LYNXCOMPILEOPTS: - for anonymous default see
+ userdefs.h
+ - new "lynxcfg_info" for LYNXCFG: - for anonymous default see userdefs.h
+ - new "lynxcfg_xinfo" for extended LYNXCFG: - for anonymous default see
+ userdefs.h
+ - new invisible "goto_configinfo" for LYNXCOMPILEOPTS: & LYNXCFG: for
+ anonymous default, see userdefs.h
+ - additionally check existing "option_save" for LYNXCFG://reload/ -
+ always restricted by anonymous default
+ ("invisible" means that this restriction cannot be explicitly listed in a
+ -restrictions=... list, but has a value derived from userdefs.h that is used
+ with -anonymous and -restrictions=default.)
+* Forms options menu can now be used with -validate.
+* Allow following local help file links, even if "file_url" restriction is set,
+ from LYNXKEYMAP, LYNXCOOKIES. (Possibly more need to be added.)
+* Apparently realm checking (with -realm option) is bypassed for URLs from
+ (some) form submissions (it seems to be intentional, but why?). Made sure
+ this at least doesn't weaken -validate restrictions.
+* Apply -localhost check in getfile for news URLs that include a hostname,
+ i.e., that begin with with "news://".
+* Add '&' to nonalphanumeric characters forbidden by exec_ok() for lynxexec and
+ lynxprog URLs, but keep allowing it for lynxcgi. There's not much point in
+ excluding ';' and so on if '&' is acceptable!
+* Tweaked LYNXMESSAGES: handling slightly: don't bypass normal getfile
+ handling.
+* Reset LYforce_no_cache flag in mainloop() after failed access, before popping
+ the previous (or, actually, probably currently still displayed) document.
+* Tweak for 'no data' handling: it isn't always an error, but was sometimes
+ treated as such. It mostly doesn't make a difference, except for the message
+ printed when the startfile cannot be accessed and for traversal and mail
+ error logging. This needs to be revised to apply for all protocols.
+* Added new functionality for rules: Redirect, UseProxy, various others. See
+ cernrules.txt in samples directory for details.
+* Prevent crashes in HTNews.c with HEAD.
+* Allow HEAD requests for proxied URLs (checking whether any applicable proxy
+ begins with http: or lynxcgi:), as far as this can be determined based on
+ regular environment settings (i.e. unaware of proxying by rules).
+* Modified add_item_to_list() so that if the restriction flag is omitted from a
+ DOWNLOADER/UPLOADER/EXTERNAL line in lynx.cfg, it is assumed FALSE. This
+ modifies the change of 1998-10-17 to be on the safer side, it is more
+ consistent with how PRINTER lines or lines with the colon separator present
+ but the flag value absent are handled, and it only makes a difference when a
+ -restriction command line option or its equivalent is in effect anyway.
+* Deal with unusual cases where telnet and similar protocols are proxied, or
+ possibly changed to a different type of protocol by rules. Normally such
+ protocols should never be proxied, but there was no protection against it,
+ and lynx could crash. The approach now taken does not disallow it, but just
+ tries to deal with the situation in a way that avoids crashing; it is
+ conceivable that one may want to direct e.g. telnet or rlogin URLs to a HTTP
+ page that explains why these types are not supported. A similar problem
+ that occurred when e.g. telnet was forbidden by a rule is also dealt with.
+* Protect start_curses calls in getfile against being executed if
+ dump_output_immediately is in effect. Maybe access to telnet, rlogin,
+ lynxexec URLs should be completely disabled for this case; skipping the
+ start_curses at least avoids being left with non-restored tty settings after
+ the program exits, is someone attempts to use -dump or -source with such a
+ URL (the -dump or -source flags is then effectively more or less ignored).
+* Tweaks in fix_http_urls, renamed fix_httplike_urls.
+* Moved LYStrerror from LYStrings.{h,c} to HTAlert.{h,c}, so that it can be
+ used in HT*.c files without pulling in yet more LY*.h headers.
+* Reset 'safe' flag in anchor on parsing "Safe: no" and "Safe: false" headers.
+* The top makefile.in had some 'rm -rf' for whole directories $(helpdir) and
+ $(docdir) in install targets that could potentially wipe out unrelated files;
+ added checks to make sure the directories haven't been changed to something
+ not lynx-specific (they are regarded as lynx-specific if the last component
+ is lynx_help and lynx_doc, respectively).
+* Various doc tweaks.
+* Updated README.defines. Other contributors should please add their stuff
+ there, too.
+* Additional non-option args (before the last one), i.e. URLs or filenames,
+ are made available for 'g'oto recall. If unwanted, this can be disabled by
+ changing EXTENDED_STARTFILE_RECALL in LYMain.c -KW
+* In UCChangeTerminalCodepage() used for --enable-font-switch with linux: use
+ LYOpenTemp() etc. instead of tempnam(), this avoids "Invalid pointer" with
+ LY_FIND_LEAKS and avoids leaving old temporary files hanging around in some
+ situations. Also added some error checking -KW
+
+1999-06-01 (2.8.2rel.1)
+-----------------------
+1999-06-01 (2.8.2pre.11)
+* minor fixes from W3C HTML validation -TD
+* update links to HTML'ized lynxcfg in users' guide -VH
+
+1999-05-31 (2.8.2pre.10)
+* add links to HTML'ized lynxcfg to users' guide -LP
+* cleanup temporary files left by
+ lynx -dump LYNXCFG:// > /dev/null
+ (analysis by LP) -VH
+* add comments to lynx.cfg describing effect of restricting configuration
+ settings in nested includes -VH
+* delineate URL's in README with "<URL:" and ">", with space in lynx.man -LV
+* add some comments to lynx.lss -TD
+* minor improvements to configure script: use newer config.guess and
+ config.sub from xterm, which adds case for HP 9000/800 (fix problem reported
+ by Peter Jones <jones.peter@uqam.ca>) -TD
+
+1999-05-29 (2.8.2pre.9)
+* use StrAllocCopy rather than HTSprintf in LYstore_message() because no
+ formatting is done there; the message may contain formatting controls such as
+ %s (related to bug report by Frederic L W Meunier <fredlwm@urbi.com.br>) -TD
+* add/use function LYRenamedTemp() to update our record of temporary filename
+ when using external decompression program, so we will remove the decompressed
+ file correctly on exit. This is the usual case if we do not link with zlib
+ (reported by HN) -TD
+* modify LYValidateFilename() to derive original directory preferably from
+ Current_Dir() rather than environment variable $PWD, since the $PWD directory
+ may not be writable if Lynx is invoked from another application rather than
+ directly from the command line -TD
+* add/use function Current_Dir(), to check for failure in getcwd/getwd -TD
+* change ALL_LINGUAS assignment in configure script to use the .po file which
+ actually reside in the po directory, making it simpler to drop/add message
+ files from a distribution of Lynx. Also, make the assignment contingent on
+ ALL_LINGUAS not being set externally, making it simple to override -TD
+
+1999-05-28 (2.8.2pre.8)
+* when reloading/reparsing the document with forms, issue a warning only when
+ user input is detected (forms content is changed from its default so
+ information will be lost). New function HText_HaveUserChangedForms() is
+ called from HTReparse_document() and HTuncache_current_document() -LP
+* fix exit from postoptions() when need_reload is set but no source_cache,
+ was broken in dev23 -LP
+* remove unneeded float from integer calculations -LP
+* move comment for 'const' off the definition line, to simplify debugging
+ configure problem on HPUX for David Eaton -TD
+* move LYGetYX() out of conditional expression, just in case it cannot be
+ evaluated as a function, i.e., return a value (from bug report by David
+ Eaton) -TD
+* make install for COPYHEADER and COPYING work when the build directory is not
+ the top source directory -PG
+* add check to FastTrimColorClass() to avoid updating stylename and pointer
+ into it when the tag to be trimmed is not found (fixes a core dump reported
+ by VH) -TD
+
+1999-05-25 (2.8.2pre.7)
+* update illustration of forms options menu in Lynx User Guide according to
+ current lynx output -LP
+* old-style options menu: hot key for "local e(X)ecution links" is now
+ displayed in bold (call addlbl() instead of addstr() like the other options
+ do), adapted from Hiroyuki diffs -LP
+* fix handling of incorrect html in psrc mode. If a piece of html matched the
+ pattern "<known_tag_name unknown_attr_name any_attr_name>", then styles of
+ internal markup were unbalanced - resulted in cluttered colors -VH
+* comment-out (for release) configure option --enable-libjs -TD
+* change configure script defaults for --enable-persistent-cookies and
+ --enable-alt-bindings to 'yes' -TD
+* add DESTDIR variable to top-level makefile to facilitate packaging releases
+ with compiled-in pathnames -TD
+* further correction to VMS pathname in HFTPLoad.c, to translate /vms/fileserv/
+ to [vms.fileserv], for example. The wku fileserver gives back a Unix-style
+ listing rather than VMS-style when given a Unix-style CWD, which confuses
+ Lynx into discarding the listing (reported by Andy Harper) -TD
+* modify LYCookies.c to append new items to the end of the list rather than
+ at the start, so cookies will be written and read from .lynx_cookies in
+ consistent order (reported by KED) -TD
+
+1999-05-24 (2.8.2pre.6)
+* fix for problem reported by LP -VH
+ Load an html file with META charset and switch "\" to source mode. Now press
+ ^R to reload:
+ (1) In -prettysrc case you got a broken document (charset will be assumed by
+ lynx from assume_charset or assume_local_charset, not from a META charset
+ which was previously pushed with LYPushAssumed() so you get a problem with
+ 8bit documents when assume_charset != META charset).
+ (2) Without -prettysrc you got a document handled properly via META charset
+ assumption. Now if you press ^R again you will get a broken document.
+* LYK_SOURCE & HTreparse_document(): when using SOURCE_CACHE_MEMORY fix tiny
+ charset problem when switching to the source mode and the original document
+ have its charset specified. Now aligned with SOURCE_CACHE_NONE and
+ SOURCE_CACHE_FILE. More LYK_SOURCE fixes that might affect next coming
+ document in come cases (mainly Info page and Options menu, which now show
+ correct charset information) -LP
+* add CTRACE_FLUSH call before fork() in NSL_FORK logic so child's messages
+ will not mess parent ones -LP
+* add a few trace messages -LP
+* HTReadProgress message now display statusline properly in TRACE mode
+ (was always broken since early HTReadProgress days) -LP
+* install COPYING and COPYRIGHT for install-help rule as well as install-doc,
+ so we can refer to local copies of those files -TD
+* tweak HTParse trace message -LP
+* minor formatting change for Lynx_users_guide.html -SH
+* correct a few mismatches between variable declarations (char vs BOOLEAN)
+ (adapted from win32 version by Hiroyuki Senshu <senshu@shonai-cit.ac.jp>) -TD
+
+1999-05-20 (2.8.2pre.5)
+* correct links to COPYHEADER and COPYING in about_lynx.html, by pointing to
+ author's URLs, rather than to files which are not installed anyway -PG
+* shorten a couple of identifiers to keep with 31-character limit, i.e.,
+ hash_code_aggregate_lower_on_fly -> hash_code_aggregate_lower_str
+ LYprint_statusline_messages_on_exit -> LYstatusline_messages_on_exit
+ (reported by Andy Harper) -TD
+* correct VMS pathname in HTFTPLoad(), allowing connect to
+ ftp://ftp.wku.edu/vms/fileserv (reported by Andy Harper) -TD
+* chartrans: cpXXXX Microsoft codepages verified against ftp.unicode.org -
+ apparently cp1256 (Arabic) was updated recently. Although Arabic letters are
+ hardly useful for lynx (no right-to-left support) this codepage is supported
+ under chrtrans. So update, just for fun -LP
+* fix core dump when starting "lynx LYNXOPTIONS:" command. All phases of forms
+ options logic now handled by postoptions(): LYNXOPTIONS:/ without post_data
+ create a page (gen_options() now PRIVATE), LYNXOPTIONS:/ with post_data do
+ process changes as before. Also LYK_ADD_BOOKMARK fixed: forms options page
+ will not be added to bookmarks file -LP
+* modify HTGetRelLinkNum(), removing increment of HText_getTopOfScreen() value
+ so checks for line number begin at the very top of the screen, fixing a
+ problem reported when processing the 123[g][+-] command -LE
+* minor change to LYReadCFG.c to combine similar gettext'd strings -HN
+
+1999-05-16 (2.8.2pre.4)
+* add 'fixit' parameter to LYEnsureAbsoluteURL() to suppress logic in
+ LYConvertToURL() that was changed in 2.8.1dev.4, to re-offer the original
+ string after an invalid URL is entered at a 'g' prompt. The calls to support
+ 'g' are unmodified; other calls revert to the older behavior (recommended by
+ KW) -TD
+* add/use string functions that make EBCDIC comparisons sort in the ASCII
+ collating sequence, eliminating some special ifdef's in HTMLDTD.c -PG
+* when STARTFILE cannot not be loaded, lynx now exits with more understandable
+ status messages: all important statusline messages are now printed to
+ stderr/stdout -LP
+* add definition for _DECC_V4_SOURCE for VMS SOCKETSHR_TCP configuration to
+ top-level and ./src build*.com files (reported by Andy Harper) -TD
+* change UNKNOWN_URL_TYPE to 1, to keep it distinct from NOT_A_URL_TYPE, fixes
+ an error introduced when changing UrlTypes to an enum (reported by KW) -TD
+
+1999-05-12 (2.8.2pre.3)
+* add DEBUG_SOURCE_CACHE makefile flag so all documents will be cached in
+ SOURCE_CACHE mode, including local files. Normally undef'ed so only http
+ served documents cached with sources -LP
+* in LYK_HISTORY, set newdoc.link = 1 so position at link #2 bypassing "recent
+ statusline messages" link -LP
+* comment out "partial_thres=" option in .lynxrc (it was coded so the changes
+ from lynx.cfg file could not be activated) -LP
+* add a sanity check to LYCurses.h to point out problems with the FANCY_CURSES
+ configure checks -TD
+* fix uninitialized pointer used in decoding of -term switch (patch by Sergey
+ Svishchev)
+* define _DECC_V4_SOURCE for VMS SOCKETSHR_TCP configuration, to fix conflict
+ with unistd.h versus non-POSIX prototypes in the other headers (report by
+ Andy Harper) -TD
+* ifdef'd includes for HTUtils.h to limit size of preprocessor listings with
+ DEC C; verify that all header files include definitions needed for their
+ contents -TD
+* add docs/OS-390.announce (Paul Gilmartin)
+* add fallback extern declaration for h_errno to HTTCP.c for systems that have
+ that variable but do not declare it (reported by Jean-Pierre Radley
+ <jpr@jpr.com> for SCO OpenServer 5.0.5) -BL
+* correct SortaSGML element info: SPAN can contain SPAN -KW
+* fix several small memory leaks (John Bley):
+ + minor (~ 7 bytes) leak in LYCookie.c
+ + leak in the warning message about invalid cookies
+ + obvious leak in do_readme
+ + small leak in dired_options (LYLocal.c)
+ + leak with -selective option in HTFile.c
+ + a few leaks and a minor cleanup in local_dired
+
+1999-05-08 (2.8.2pre.2)
+* substitute a few more free()s with FREE()s in files HTString.c and
+ LYReadCFG.c -John Bley
+* fix buffer problems with long filenames and custom DOWNLOADERs -John Bley
+* fix typical alloc-fail-return-error-without-free leakage in
+ save_bookmark_link (LYBookmark.c) -John Bley
+* modify generated WWW/*/makefile and src/chrtrans/makefile to omit include
+ from intl directory if it is not used (report by LP) -TD
+* add configure test for h_errno, by splitting CF_ERRNO macro and reusing
+ test for external data. Noticed that DECL_ERRNO was not defined/used,
+ added that as well. The h_errno symbol is provided in some network
+ libraries, e.g., on SCO and Linux, but may/may not be declared (report
+ by BL) -TD
+* fix some serious lossage in lookup_reject (LYTraversal.c): memory and
+ logic errors. This (replaced) line is one for the record books:
+ frag = strlen(buffer) - 1; /* real length, minus trailing null */
+ Previously, this code caused a read before an array boundary as well as
+ failing to compare the right number of characters in a pattern -John Bley
+* fix some minor leakage in the cookie jar -John Bley
+* fix up some casts and mode_t types in HTAAProt.c, HTFile.c, LYLocal.c,
+ LYUtils.c -John Bley
+
+1999-05-05 (2.8.2dev.26 - 2.8.2pre.1)
+* remove some weird cruft from HTAAUtil.h (yeah, "/home2/luotonen" is a good
+ default path) -John Bley
+* correct a buffer overflow in LYDownload.c (reported by John Bley) -TD
+* 8bit attribute values are now translated in psrc view (reported by LP) -VH
+* trailing ';' now is shown after HTML entities (reported by LP) -VH
+* split-up/correct typo in text at top of generated bookmark file -JES, -TD
+* allow anchors as input for commands 'g','G','E' -VH
+* correct off-by-one error in pointer to filename in DOSPATH configuration for
+ LYPathLeaf() -DK
+* fix infinite recursion bug in lynx.cfg includes, from dev.25 integration
+ (reported by LP) -VH
+* implement the following separators in lynx.cfg "include" commands
+ ":" on Unix
+ " for " on all OS's -VH
+* fixes for LYList.c, adding title info to the (mostly unused) HTLinkType -KW
+* change remaining <banner>'s to <blockquote> in other html files, fix
+ a few escapes that tidy (15-apr-99) reports. Leaving <tab>'s alone for the
+ moment because there appears to be no standard equivalent -TD
+* change <banner> in lynx-dev.html to <blockquote> since the latter is
+ standard, correct IEFT version and supply <p>'s as needed (Karl Eichwalder)
+* correct a couple of two documentation inconsistencies in the sources for
+ USE_PSRC and -prettysrc (Karl Eichwalder <ke@gnu.franken.de>)
+* register free_messages_stack with atexit to fix some statusline leakage,
+ explicitly fill out a struct initializer -John Bley
+* fix a few html nits in the docs -John Bley
+* cleanup some gcc -Wundef warnings -TD
+* add logic to free_lynx_cfg() to unset environment variables (requested by
+ LP) -TD
+* modify SafeHTUnEscape() to work with EBCDIC (Paul Gilmartin)
+* remove dangling comma in UrlTypes enum (reported by Paul Gilmartin) -TD
+* make description of STARTFILE in userdefs.h agree with lynx.cfg -TD
+* fix: newline position when we come from the history stack and cached HText
+ is used (say, return from 'p'rint menu), was broken in dev23 -LP
+* remove numerous HTMLSetCharacterHandling() calls from getfile(), use single
+ call in mainloop instead -LP
+* #define PUTS() in LYCookie.c and LYMap.c to make code more readable -LP
+* fix: LYmouse_menu() in LYStrings.c calls popup_choice(), which is #ifdef'd
+ out when --disable-menu-options is used (patch by Sergey Svishchev)
+* modify generated src/makefile to omit include from intl directory if it is
+ not used. This in turn required fixing a redefinition of gettext on Solaris
+ when using cc, since the locale.h file includes Sun's libintl.h file which
+ prototypes gettext. Successfully built/ran using Sun's msgfmt utility, (had
+ to manually add -lintl to src/makefile) though the generated message objects
+ are incompatible, resulting in a core dump if not reinstalled (unnecessary
+ include reported by LP) -TD
+* change VMS WWW descrip.mms file to use prefix=all rather than prefix=ansi, so
+ that POSIX functions such as 'read()' are linked properly (reported by Andy
+ Harper) this is a detail I overlooked in dev.18 -TD
+* fixes to compile with SunOS K&R cc -TD
+
+1999-04-27 (2.8.2dev.25)
+* updates to INSTALLATION -HN
+* undo some redundant dev23 changes, in particular PSRC_TEST in HText_new
+ was responsible for a wrong line breaking in -prettysrc mode
+ (try "lynx . -prettysrc" and press "\" to see wrapping with altered
+ define). Also fix Visited Links for internal pages -LP
+* restore links in lynx-dev.html to original form, to make redirection work
+ properly -TD
+* add to MAKEFILE.W32 (untested - suggested by LP) -TD
+ * definitions for DISP_PARTIAL;SOURCE_CACHE;USE_PSRC
+ * lypretty.obj to the list of objects.
+* remove CF_MAKE_INCLUDE from configure script, since it is not needed -TD
+* merge WWW/Library/Implementation/CommonMakefile into WWW/.../makefile.in -TD
+* corrections/simplification of LYSafeGets(), and remove sizeof(buf) from
+ related code in LYCookie.c (analysis by KW) -TD
+
+1999-04-23 (2.8.2dev.24)
+* added overlooked WWW/Library/Implementation/makefile.in -TD
+1999-04-23 (2.8.2dev.23)
+* add/use new function LYSafeGets to replace reads into fixed-size buffers -TD
+* change xxxx_URL_TYPE definitions in LYUtils.h to a enum -TD
+* use HTSprintf0 in LYCurses.c, LYReadCFG.c -TD
+* implement restrictions on options that can be set via the lynx.cfg "include"
+ directive -VH
+ For example, admins may specify
+ include:~/.lynx/colors:COLOR
+ include:~/.lynx/keymap:KEYMAP
+ include:~/.lynx/viewers:VIEWER
+ safely - and be sure that no critical options were altered by those files.
+ The syntax is
+ include:<filename>[:[<OPTNAME>* ] ]
+ More samples:
+ include:~/.lynx/rc:COLOR KEYMAP VIEWER SUFFIX
+ include:/usr/local/lib/lynx-cfg.part: #all settings can be changed
+ The patch does this:
+ * It prints warnings to stderr about unknown options specified in the list of
+ allowed options in include command. When 'o'->'lynx.cfg'->'RELOAD THE
+ CHANGES' is activated, these warnings are also printed on stderr - so the
+ screen will be corrupted if lynx.cfg and included are incorrect.
+ * Only options, allowed for a given file are printed in
+ 'o'->'lynx.cfg'->'RELOAD THE CHANGES'.
+ * Fully backward compatible - lines of the form
+ include:filename
+ will work as they did(i.e., if the list of allowed options is not
+ specified, then the included file can use the same set of options, as the
+ file that contained that 'include' command).
+ * If you wish to allow an included file to
+ include others, you must specify 'include' in the list of allowed options.
+ Sample:
+ include:~/.lynx/suffixes:INCLUDE SUFFIX
+ so that users will be able to use 'include' command in '~/.lynx/suffixes'
+ (otherwise included file will be unable to include anything).
+ * Option sets are ANDed. If file lynx.cfg contains:
+ include:/usr/lib/lynx.cfg.0:COLOR SUFFIX VIEWER INCLUDE
+ and /usr/lib/lynx.cfg.0 contains
+ include:/usr/lib/lynx.cfg.1:SUFFIX VIEWER INCLUDE STARTFILE HELPFILE
+ then /usr/lib/lynx.cfg.1 can use the following options:
+ SUFFIX VIEWER INCLUDE
+* change the STARTFILE description in lynx.cfg to offer the user's home
+ directory as an alternative to lynx.browser.org (amended this to reflect
+ consensus that l.b.o should be the default) -TD
+* move a big chunk of code into print_status_message() -LP
+* also add numerous HTProgress messages to LYNXMESSAGES:/ page (but not
+ HTReadProgress) -LP
+* HTAlert, HTUserMsg and HTInfoMsg statusline messages are now stored in a
+ cycled buffer and accessible from the History Page as LYNXMESSAGES:/ link.
+ This allows us to decrease the messages delay in lynx.cfg when we feel
+ messages too annoying, but have a nice history list for diagnostic purposes.
+ Uses a 40-line buffer (suggested by Bela Lubkin) -LP
+* fix reloading with HTreparse_document() for LYK_MINIMAL, LYK_HISTORICAL,
+ LYK_SOFT_DQUOTES, LYK_SWITCH_DTD mainloop events (hope we work around replies
+ from POST properly) -LP
+* elaborate description in Lynx_users_guide.html for "comments" (Michael
+ Sobolev <mss@transas.com>)
+* fix --disable-trace (by making the ifdef's directly depend on NO_LYNX_TRACE
+ rather than DEBUG), chop more unneeded #includes -John Bley
+* combine WWW/Library/unix and WWW/Library/Implementation to simplify make
+ dependencies, drop Makefile.old -TD
+* fixes for DOS port - DK
+ (a) When exiting with interrupt, the message was printed in binary mode,
+ leaving the cursor in the middle of the screen
+ (b) In the PDCurses build, the keypad enter key only worked when LYK_ACTIVATE
+ was utilized, but not in GOTOLINK or GOTOPAGE. This maps the keypad
+ enter to '\n', so it works in all situations, but keypad enter will no
+ longer be able to be mapped separately. CTRL-PADENTER and ALT-PADENTER
+ can still be separately mapped.
+* various changes to userdefs.h and lynx.cfg explanatory text -KW
+* corrected placement of "partial_thres" code in LYrcFile.c, removed an unused
+ prototype in LYUtils.h -KW
+* add a note about LYNX_SAVE_SPACE to INSTALLATION -JES
+* remove docs/*.old (request by HN) -TD
+* update INSTALLATION notes for DJGPP with PDCurses; a suggested patch is
+ no longer applicable -DK
+* fixes for control/C and control/BREAK handling on DJGPP -DK
+* tweak in HTML_start_element case HTML_DT: prevent generation of empty line
+ between multiple simple DT elements without intervening DD elements (Debian
+ bug #3846) -KW
+* add list of downloaders to lynx_help_main.html -PW
+* add attributes for {bq,blockquote}.cite,{frame,iframe,img}.longdesc,
+ {table,td}.background, td.{height,width} -VH
+* define DISP_PARTIAL for VMS (request by Andy Harper) -TD
+* include <unistd.h> for DEC C, to prototype sleep() and alarm(). Ifdef'd
+ include of HTString.h by HTUtils.h, but keep include as general rule for
+ making headers standalone (report by Andy Harper) -TD
+* modified LYrcFile.c to avoid putting '#' characters at the beginning of
+ lines, since that confuses VAX C (report by Tony Bolton) -TD
+* fix redefinition of h_errno (report by Tony Bolton) -TD
+* ifdef'd print_local_dir in HTFile.c since this function does not compile on
+ VMS (report by Andy Harper, Tony Bolton) -TD
+* fix reload_read_cfg() to avoid persistent cookies mode changing at run time;
+ reload printers list, downloaders list, environments - as expected - LP
+* fixes for SOURCE_CACHE!=NONE mode, trying to accommodate HTreparse_document()
+ for mainloop() events:
+ - add/use flag "from_source_cache" for better mainloop maintenance
+ - add partial display mode for HTreparse_document() operations
+ - add warning when the reparsed document may lose its forms content
+ - fix options menu stuff to use HTreparse_document() when possible - LP
+* fix exit from postoptions() when the reloaded document was in source mode -LP
+* update flags to correct behavior with SOURCE_CACHE!=NONE: the length of the
+ re-rendered text may vary so the scrolling down is broken (especially nice
+ when switching to source). ("more" updated, "lines_in_file" inlined) -LP
+* use configure script macro CF_CHECK_CACHE to compile-in Unix SYSTEM_NAME,
+ for info screen (request by LP) -TD
+* minor fixes for uncaching document, other items missed in dev.22 -LP
+* merge the two versions of start_curses() function -LP
+* add -DSOURCE_CACHE and -DUSE_PSRC to djgpp makefiles -LP
+* add a few words for CHANGES and INSTALLATION -LP
+* add a configure option for prettysrc -TD
+* separate ifdef's for prettysrc from color-style -LP
+* fix for -prettysrc: when pressing '\' on non-local files, the prettysrc view
+ is shown, but there is no way out of this mode -VH
+* change all PUTS() with a string of length 1 to PUTC(), fix a uid_t/int
+ assumption in LYLocal.c, remove some unneeded #includes, remove some spurious
+ semicolons -John Bley
+* fix typo in configure --help for --disable-direct (reported by LV) -TD
+* update user's guide and lynx.cfg descriptions of jumps files - PW
+* fixes for related bugs tweaked by going to an internal page while viewing
+ source, and a few blurbs in the documentation -DSB
+* fixes to separate RAW_MODE from internal variable LYRawMode by adding new
+ variable LYUseDefaultRawMode -LP
+* add a missing null-pointer check in expand_tiname() (from report by KW) -TD
+
+1999-04-13 (2.8.2dev.22)
+* correct a missing include for LYLeaks.h in UCAuto.c -TD
+* implement HTML source caching. In this implementation, each document kept in
+ cache has associated with it a temporary file containing the HTML source for
+ the document (well, not all of them -- only those using the HTTP protocol, on
+ the premise that file:// documents are probably local and ftp:// documents
+ are probably not HTML). The temporary file is deleted when the document is
+ uncached. For certain operations, instead of reloading the document via
+ HTLoad<mumble>(), the source file is reparsed with HTParseFile(). The cached
+ document also remembers certain parser settings (screen size, historical vs.
+ minimal vs. valid comment parsing, and the like), and is regenerated from
+ source if it is fetched out of cache under different settings. This behavior
+ is selectable by a configure option --enable-source-cache and by a lynx.cfg
+ option SOURCE_CACHE; I didn't add a command-line argument or an options menu
+ entry, as this didn't seem to be the sort of thing one would want to change
+ You had to challenge me, didn't you? ;) Okay, after some pfutzing around
+ with HTChunks, I think I've got a working version of memory caching of
+ source. The SOURCE_CACHE option now has settings FILE, MEMORY and NONE, with
+ the obvious meanings, defaulting to NONE. (DSB - Scott Bigham
+ <dsb@cs.duke.edu>)
+* amend HTConfirmDefault() logic so that a second character will cause the
+ default response to be returned, e.g,. so that pressing "qq" will make
+ Lynx exit (reported by John Bley) - TD
+* change the PUTS("\n") calls in HTFile.c to PUTC('\n') since that would be
+ a little more efficient (noted by KW) - TD
+* minor cleanup: remove obsolete parameters from command-line parsing functions
+ in LYMain.c, add newlines in HTFile.c for readability of html - LP
+* change default STARTFILE to the current directory, "." - PW
+* revised lynx-dev.html - PW
+* lynx.cfg and further included cfg files can be edited from LYNXCFG:/ page
+ with the default editor and changes can be activated for the same lynx
+ session. NOT allowed for restricted users (LYRestricted) and occasionally
+ for user mode other than ADVANCED. This is an *experimental* code
+ (reload_read_cfg() in LYMain.c - more work required): currently command-line
+ switches may be lost when overridden by lynx.cfg changes, file paths like
+ lynx_save_space and LYCookieFile should not be changed (unwanted results) -LP
+* retest PARSE_DEBUG ifdef's (LYMain.c, LYReadCFG.c), minor corrections
+ but found no specific reason for LP's problem with tables, except possibly
+ different effect from "&(value)" versus "(&value)" - TD
+* fix the problem of reading included lynx.cfg files by changing LYReadCFG.c
+ table signature (now it is more close to one in LYMain.c). The problem was
+ the ignoring of *some* values got from the included cfg file (at least for
+ DJGPP2.02/gcc2.8.1 build). Probably we calculate the addresses of variables
+ on a later stage now. - LP
+* DOSPATH changes: local directory style now configurable from lynx.cfg
+ (LONG_LIST defined). Unlike UNIX it is not "ls -l" by default
+ but a more compact form (date and size present, from lynx.cfg example) - LP
+* cookies: domains now match case insensitively (reported by Paul Wagner
+ <paul.wagner@mci.com>) - LP
+* correct an ifdef in LYGetFile.c for config-page - LP
+* reading of long local directories now benefits from partial mode and fully
+ interruptible. Split out print_local_dir() function from HTLoadFile() - LP
+* behave sanely if NSL_FORK fork() fails -BL
+* NSL_FORK try for dns_patience *seconds*, not dns_patience select() calls,
+ which might have been shortened by keyboard input -BL
+* fix some screwy comment indentation -BL
+* add section on editing TEXTAREA to user's guide - PW
+* add a null-pointer check in LYCookie.c (Bill Nottingham <notting@redhat.com>)
+* revise changes ifdef'ing LY_FIND_LEAKS by making atexit a no-op function
+ since the DOS port depends on atexit to keep the DOS BREAK function properly
+ set on exit. Put back atexit, and ifdef's each place where atexit isn't
+ needed except when finding leaks - DK
+* modify LYMain.c on DOS, fixing the determination of BREAK status to be
+ independent of SLANG or PDCurses - DK
+* spawn a new function, www_user_search_internals, to begin canceling the
+ effects of cut-n-paste coding in www_user_search. The body of
+ www_user_search_internals used to be duplicated at two points in
+ www_user_search. See comment in GridText.c for more details -John Bley
+* big pile of unneeded #includes removed -John Bley
+* remove obsolete files from the distribution -John Bley
+ WWW/Library/Implementation/HTWriter.*
+* one malloc check, fix --disable-ftp -John Bley
+* fixes for compiler warnings when building for OpenVMS 6.2 using DEC C and the
+ SOCKETSHR library (reported by Andy Harper) - TD
+* add cpp -H option for HPUX bundled C compiler, which otherwise does not
+ have enough symbol table space (reported by JES). Also, modify ifdef's
+ for <stdarg.h> vs <varargs.h> to avoid including the former when ANSI_VARARGS
+ is not defined since HPUX had a broken <stdarg.h> - TD
+* changed OMIT_SCN_KEEPING ifdef to 0 (inactive) in LYCurses.c and in HTML.c,
+ still enabling the Style_className:HTML.c keeping and making lynx with lss
+ slightly slower than it could be (though faster then dev21). If somebody
+ wishes to fix a bug, here is a description: If contents of some tag that has
+ corresponding color style occupies more than 2 screens, after navigating to
+ the page, on which the content of that block starts, and then pressing PGDN
+ PGDN PGUP, the effect (color style) of that tag will be lost. The same
+ (losing style) happens when jumping to the anchor that is in such block and
+ is located not on the 1st page. IMO this is something with style stack. If
+ this will be fixed, then keeping of Style_className:HTML.c can be omitted
+ again -VH
+* fixed the bug in lynx with lss support -when displaying html pieces such as
+ <b> A <b> B </b> C </b>, only 'AB' was drawn in style corresponding to
+ <b> -VH
+* added HTML source syntax highlighting (when option -prettysrc that is added
+ is given to lynx). It's available for lynx compiled with and without lss
+ support (it can be much more beautiful when compiled with lss support - read
+ lynx.cfg for description). The code is ifdef'ed with USE_PSRC.
+ This functionality coexists with old source view and with -preparsed logic
+ (ie different commandline options make source view logic different) -VH
+* HTChunkPutc was inlined in SGML.c for better performance -VH
+* keeping of Style_className was omitted in HTML.c to increase performance of
+ lynx compiled with lss support -VH
+* performance of lynx compiled with lss support is increased ~ by 15-20% for
+ normal documents, and by up to 50% for documents with a lot of tags -VH
+* fixed bug in lynx compiled with lss support that caused it to load local CSS
+ stylesheets - lynx didn't understand their syntax so it was exiting -VH
+* added type information for attributes in HTMLDTD.c (it's used in source
+ syntax highlighting mode) -VH
+* sample .lss files are updated to support source syntax highlighting -VH
+
+1999-03-30 (2.8.2dev.21)
+* disable LYatexit if memory-leak testing is not configured -TD
+* fixes for unhighlighting problems with color-style support (Vlad Harchev)
+* remove '(default: on)' and '(default: off)' strings from configure script
+ help message (much lynx-dev discussion) - TD
+* remove outdated link to the WebTechs HTML Validation Service from help menu
+ and change link to more suitable location for rfc1945 - PW
+* correct logic of --disable-full-paths configure option (reported by Georg
+ Schwarz) - TD
+* fix problems building on OpenVMS with DECC 6.2 -TD
+ (reported by Andy Harper <Andy.Harper@kcl.ac.uk>)
+ + remove 'DEBUG' definition from build scripts since it is defined in
+ the source code.
+ + turn off code that tries to use getpwuid(), by defining NOUSERS, since
+ those functions are not present on VMS.
+ + provide a dummy location for h_errno for systems without that symbol.
+ + correct string syntax in VMSexit function
+ + ifdef'd use of lynx_version_putenv_command in LYMain.c
+ + correct spurious parenthesis in mailform function
+ + correct missing COPY_PATH definition for LYUtils.c
+* check for 'z' user interrupt in HTLoadHTTP before setting up the output
+ stream. This avoids doing unnecessary work, including possible creation of a
+ new HText structure that most likely is never displayed but still pushes
+ another document out of the. cache. Most commonly this occurs when a HTTP
+ error response is received and the user presses 'z' while the resulting alert
+ message is shown - KW
+* fix of HTUnEscapeSome in HTParse.c for non-ASCII - KW, PG
+* tidy up around ed_offset initialization in GridText.c - KED
+ (the patch as given did not compile on a non-ANSI compiler because it used
+ aggregate initialization - TD)
+* add samples/mild-colors.lss (Vlad Harchev)
+* add samples/blue-background.lss (from Sergey Svishchev <svs@ropnet.ru>)
+* documentation updates for INSTALLATION and PROBLEMS - PW
+* use HTConfirm and HTConfirmDefault to gettext'ify CONFIRM_BOOKMARK_DELETE,
+ CONFIRM_COMMENT, CONFIRM_LONG_PAGE_PRINT, CONFIRM_LONG_SCREEN_PRINT,
+ CONFIRM_MAIL_SOURCE_PREPARSED, CONFIRM_MAIN_SCREEN, FILE_EXISTS_HPROMPT,
+ FILE_EXISTS_OPROMPT, NO_OWNER_USE, PREV_DOC_QUERY, REALLY_EXIT_N,
+ REALLY_EXIT_Y, REALLY_QUIT_N, REALLY_QUIT_Y (based on report by LP) - TD
+* at LYNXCFG:/ page, add links for every included configuration file so we can
+ read and edit them (no, currently the changes will be active the next session
+ only. Minor reorganization of LYMain.c done, more required) - LP
+* correct test/spaces.html - it should not be in a <PRE> mode by default - LP
+* undo recent &emsp; changes so it is a single space as before (suggested by
+ KW) - LP
+* add ETag anchor element (currently not used, only for information) - LP
+* assign LYNXCFG:/ and LYNXCOMPILEOPTS:/ for internal pages of parsed lynx.cfg
+ and compile-time info. Now we will not see a temp file link name in a
+ statusline in advanced mode, also kill overhead since pages created only when
+ really accessed - LP
+* form-based options menu: the bug described in 1999-03-17 changes now finally
+ fixed - LP
+* fix expanding entities for x-transparent display charset
+ (was broken from 1999-03-04 changes) - LP
+* trimmed trailing blanks from *.tbl, fixed chrtrans/def7_uni.tbl and
+ chrtrans/viscii_uni.tbl, ensure that it produces correct result - TD
+* chrtrans/def7_uni.tbl - entries with trailing spaces now explicitly enclosed
+ in quotes to avoid problems with integrating the patches sent by e-mail,
+ more comments added - LP
+* attempt to implement --disable-ftp -John Bley
+* fix tiny memory leak in HTAAUtil.c -John Bley
+* chop useless #includes from LYHash.c, LYExtern.c, LYCurses.h -John Bley
+* --disable-news was also disabling ftp, --disable-finger without
+ --disable-gopher wasn't right -John Bley
+* remove a duplicate #include from HTFTP.c -John Bley
+* remove several obsolete files from the source distribution -John Bley
+ WWW/Library/Implementation/HTAAServ.*
+ WWW/Library/Implementation/HTAAFile.*
+ WWW/Library/Implementation/HTAuth.*
+ WWW/Library/Implementation/HTACL.*
+ WWW/Library/Implementation/HTPasswd.*
+ WWW/Library/Implementation/HTHistory.*
+* --disable-partial wasn't compiling because of a suppressed #include, replace
+ one more free() with FREE() -John Bley
+* correct typo LIsListpageTitle vs LYIsListpageTitle
+ (reported by Artur Frysiak <wiget@usa.net> and KED) -TD
+* don't append sed expression to help_files.sed if the $(COMPRESS_EXT)
+ variable is empty - TD
+
+1999-03-17 (2.8.2dev.20)
+* protect a couple of spaces with quotes in def7_uni.tbl (suggested by KW) - TD
+* add ifdef's for NO_RULES to HTAAServ.c - HN
+* add configure --disable-news option - JES
+* add configure --disable-finger option - JES
+* add malloc checks, remove some #includes that don't need to exist, and
+ cleanup where somebody decided to waste instructions setting fields to 0 when
+ he already memset()ed the whole struct to 0 -John Bley
+* remove obsolete/unmaintained SHORT_NAMES ifdef's -John Bley
+* add/use LYTrimStartfile function (suggested by LP) - TD
+* correct missing null-pointer check in add_printer_to_list function (forwarded
+ by BJP from Debian bug-reports) - TD
+* add notes about $CC variable to INSTALLATION and PROBLEMS - JES, PW
+* tweak for TABLE formatting: break line at </TR> end tag (don't wait
+ for next <TR> start tag), effective in SortaSGML mode only - KW
+* lots of color style changes, only effective if compiled with USE_COLOR_STYLE;
+ together they seem to make color styles act much more reliably and
+ consistently - KW
+ - Moved some extern definitions and declarations.
+ - Made extra handling for LINK REL (or TITLE) attributes consistent
+ with example lynx.lss file.
+ - More complete (and hopefully more consistent) setting of "normal"
+ attributes, especially background color, on screen refresh and after
+ statusline messages. Set normal attributes for statusline prompts.
+ - Various other small tweaks, mostly to not lose color changes in a
+ document and to avoid color leaking.
+ - Attributes for highlighting WHEREIS search targets can be controlled
+ by setting style for "whereis" in lynx.lss.
+ - Allow mono attribute field in lynx.lss to be a combination of several
+ attributes separated by '+' characters.
+ - Changes of example lynx.lss file: more logical ordering, added some
+ comments, document new stuff. Changed a few styles for demonstration
+ purposes or because text was really hard to read.
+* apply color styles to HTML source display, using the same methods as
+ for displaying the rendered version. This is done if and only if
+ the -preparsed flag is used (and lynx is compiled with -DUSE_COLOR_STYLE,
+ of course). Please remember that the source displayed with -preparsed
+ is *not* the same as the original text/html document, it has been
+ mangled by lynx (as the name implies) and may itself not be a valid
+ HTML document even if the original was - KW
+* changed some slightly suspicious casts in HText_endAnchor's casting hell;
+ prefer to cast a line's size element to (int), rather than various int
+ variables to (unsigned) - KW
+* remove some unnecessary use of dynamic buffers where there is no apparent
+ benefit for using them, for the sake of performance or to avoid a minor
+ memory leak - KW
+* stuffed small memory leak (MultipartContentType) - KW
+* absorb 'len' parameter into logic of argncmp, so it still achieves its
+ purpose of comparing prefixes of options without undue maintenance effort -TD
+* retain logic that uses final URL on command-line (request by KW) - TD
+* add/use new functions argcmp and argncmp to allow the use of '--' prefix as
+ well as '-' for commandline options. This means that '-localhost' and
+ '--localhost' mean the same thing for lynx. If EXTENDED_OPTION_LOGIC is
+ defined then the extended commandline option logic will be used. It means
+ that '--' will be accepted and will be treated as an end of options.
+ Anything after it will be treated as URL even if begins with '-' or '--'
+ (Vlad Harchev)
+* correct some typos in docs and in scripts (Vlad Harchev <hvv@hippo.ru>)
+* modify generated sed script to handle special case of alt_edit_help.html,
+ which was being rendered in --enable-gzip-help as alt_edit_help.html.gz.gz
+ (reported by KED) - TD
+* modify lynx_help/help_files.txt to update links to gzip'd versions of
+ alt_edit_help.html, environments.html, test_display.html - KED
+* tweak for SGML_LITTERAL (sic) parsing, so that the first nonmatching
+ character after the beginning of a putative end tag goes through character
+ translation - KW
+* add some more pieces of info (if available) to '=' page in advanced user
+ mode. Also show mode as "source" instead of "normal" if viewing SOURCE, in
+ all user modes - KW
+* minor FASTBACKW_LINK / FASTFORW_LINK tweaks - KW
+* removed documentation for nonimplemented chargen URLs - KW
+* remove num_n256 hack introduced in dev18 UCDomap.* - LP
+* forms-based options menu: fix reloading of previous document *only* when
+ necessary (was always, since early forms-based options menu days). Still
+ have a bug - while submitting the options menu lynx reload menu again, but
+ this is much faster to load small local file twice than fetch previous
+ (possible large) document over the net. - LP
+* &mdash; (&#x2014) now display as "--" (popular requests) - LP
+* &emsp; are now displayed as two &ensp; (popular requests),
+ previous definition of HT_EM_SPACE now renamed to HT_EN_SPACE - LP
+* minor tweaks in postoptions(), new flag added - LP
+* minor changes to make this build with SunOS K&R cc - TD
+* entities.h: clean HTML4.0 entities table added, it is #ifdef'ed with
+ ENTITIES_HTML40_ONLY (may be useful for page validation), file entities.h
+ moved to src/chrtrans directory - LP
+* save few KB of static memory by storing unicodes as 'u16' (was 'long') - LP
+* trace log toggle now really interruptible - LP
+* move entities.h to src/chrtrans - LP
+* fix display of -help output: (on/off) info was wrong for UNSET_ARG case - LP
+* ifdef'd recent changes to LYPrint.c to build with djgpp - LP
+* remove redundant -DDEBUG from djgpp makefiles - LP
+* remove nonstandard ISO-9945-2 - LP
+* eliminate a duplicate --enable-included-msgs in configure --help, (reported
+ by LV) - TD
+* redefine LY_BOLD_START_CHAR for EBCDIC platforms to avoid conflict, adjust
+ IsSpecialAttrChar() to take this into account - PG
+* rewrite LYKeymapCodes with leading commas to avoid accidental/illegal
+ use of trailing comma in an enum list - PG
+* modify UCdomap.h to avoid gcc-specific construct using cast to struct of
+ data aggregate - PG
+* modify makefiles to allow .c.i rule to work with --srcdir - PG
+* add a rule to makefile.in to generate patches - PG
+* correction to LYCookie.c, to get it to eat all cookies (reported by LV) - BJP
+* corrections/updates to entities.h (Jacob Poon):
+ HTML 4.0 compliance:
+ - Added support for Euro currency symbol.
+ - Fixed duplicated &loz; definitions.
+ Fixes:
+ - Fixed some typos in the old references. (fixed: b.delta)
+* update follow_help.html for LE's 123g changes - PW
+* further correction to 123g logic - LE
+
+1999-03-04 (2.8.2dev.19)
+* forgot to update PRCS when renaming src/chrtrans/iso9945uni.tbl - TD
+1999-03-04 (2.8.2dev.18)
+* modify configure script to recover if the intl and po directories are
+ missing, allow experimentation with --enable-nls --disable-included-msgs
+ --without-included-gettext options (request by HN) - TD
+* add sanity-check for EBCDIC FixCharacters() in LYMain.c - PG
+* ifdef'd the ADDRLIST code with EXP_ADDRLIST_PAGE, making this available as
+ a configure script option --enable-addrlist-page - TD
+* create a new command called ADDRLIST, which behaves exactly the same as LIST,
+ but which *should* always show only the URL's. Rather than make it a config
+ option (which would have taken me quite a bit longer to do), I've bound it to
+ the "A" key (that's a capital "A"). Why not "L" you ask? Because of the "vi
+ keys" option, whereby "l" is used for cursor movement, and "L" stays reserved
+ for L(ist) - KED
+* change the LYK_xxx keymap definitions to an enum, to simplify ifdef's - TD
+* add configure options --disable-gopher, to remove GOPHER code, and
+ --disable-trace to remove TRACE code - JES
+* modify trace log header to always inform us if anonymous restrictions are
+ set - LP
+* chartrans: old-style declarations of charsets which do not have Unicode
+ tables (CJK, x-transparent, also UTF-8) now moved from LYCharSets.c to
+ UCdomap.h and now included with UCInit() in UCdomap.c in a standard way - LP
+ (Please re-test CJK and UTF-8)
+* add configure --enable-libjs option (Lalo Martins <lalo@webcom.com>)
+* add checks for some more LINK tags as listed in "6.12 Link types" of the HTML
+ 4.0 Specification (Masayasu Ishikawa <mimasa@isoternet.org>)
+* changed the effect of some LINK tags with REL attribute of a very relative
+ character (Up, Next, Prev, ...) on titles as they appear e.g. on the LIST
+ page: the title of the target HTParentAnchor isn't being set when such a
+ LINK tag is parsed, but the relation is now stored as a property of the
+ link itself rather than its destination. The LIST page shows the relation
+ as additional info, not superseding a URL or title string obtained
+ otherwise - KW
+* move commands in top-level makefile.in which clean *.rej and *.orig from
+ 'distclean' rule to 'maintainer-clean', make distinct from the @SRCDIR_CLEAN@
+ substitution which is intended for use with the configure --srcdir option
+ (from reports by Glenn E Thobe <thobe@lafn.org> and BL) - TD
+* correct LYRemoveTemp() to close file before attempting to remove it; else
+ the remove fails on some platforms, e.g., DOS/Windows (report by KW) - TD
+* improved documentation for the new cookie options, e.g,.
+ COOKIE_ACCEPT_DOMAINS, in lynx.cfg - BJP
+* fix some memory leaks in LYCookie.c - BJP
+* modify 123g (and similar movement) commands to allow for relative links,
+ e.g., by using a '+' or '-' after the 'g' - LE
+* modify help_files.sed to include '$', making regular expressions work for
+ HP-UX (Jens Schmalzing <jens@stat.physik.uni-muenchen.de>)
+* add a comment to aclocal.m4 to show where patches for autoconf, needed for
+ this configure script, can be found - JES
+* add toggling trace log on/off in partial mode, when the downloading is still
+ in progress - LP
+* more consistent docs for debugging of invalidly nested HTML: important trace
+ messages from actions on invalid tags now have '***' prefix such as "SGML:
+ ... ***ignored" (well: illegal, forced, assumed, etc.), -preparsed mode now
+ better documented - LP
+* minor code cleanup: remove redundant includes, fill in 0's for some static
+ data initialization -John Bley
+* add 'joe' editor, and variants, to list of those editors that are assumed to
+ position the file to a given line number using the "+line" command-line
+ option - IC
+* remove redundant "(y/n)" substrings from LYMessages_en.h - LV
+* add new command named GROWTEXTAREA which adds 5 new blank lines to the bottom
+ of a TEXTAREA when executed. It does not have a default binding, so you need
+ to add a KEYMAP for it in your lynx.cfg. The number of lines added is fixed
+ by a #define, but 5 seems to be a "reasonable" increment to use - KED
+* add new command named INSERTFILE, which (obviously) inserts a file's contents
+ into a TEXTAREA, just above the line the cursor is on when invoked (which
+ means you cannot insert a file *below* the final existing TEXTAREA line ...
+ but see 1) and 3) for easy ways to over- come this limitation). It too, has
+ no default binding, so a KEYMAP entry is also needed for it - KED
+* by default, when the cursor is on the last line of a TEXTAREA, if you hit the
+ ENTER key, a new line will be added to the TEXTAREA, with the cursor
+ positioned on it. If that should happen at the bottom of the screen, a
+ DOWN_HALF scroll operation is (effectively) performed - KED
+* ifdef'd this feature (since at least one person objected to this automatic
+ behavior when it was discussed awhile back - BL?), for easy disabling (and to
+ make adding a ./configure option easier). The symbol is AUTOGROW is
+ #define'd in LYMainLoop.h - KED
+* added an ifdef for the code that causes the external editor to be
+ invoked "automatically" on the TEXTAREA contents when ^Ve (or whatever
+ the EDIT binding is), rather than attempting to invoke it on the .html
+ source file. This should allow adding a ./configure option to control
+ this behavior, until we come up with a different binding/mechanism to
+ do the job, that we can all agree on. The symbol AUTOEXTEDIT is also
+ #define'd in LYMainLoop.h. The command EDITTEXTAREA is still available
+ for separate KEYMAP binding, per KW's suggestion - KED
+* check the range of chars between 0x80 and LYlowest_eightbit[current_char_set]
+ for validity against the charset in use. If such chars are detected in
+ edited or inserted data, a "." char is substituted for them, as with normal
+ control chars. (Suggested by LP) - KED
+* added KW's LYCloseTempFP bugfix - KED
+* add/use function GetFileName(), e.g., by INSERTFILE. It is fairly general
+ purpose, and can be used whenever the name of an existing file needs to be
+ input. It uses the same mechanism for filename expansion and "history" as
+ does the PRINT function - KED
+* reorganized a lot of the code into subroutines to provide for 1) and 2);
+ still need to do a bit more cleanup of some other (nearly) common code - KED
+* rename iso9945_uni.tbl to iso9945uni.tbl to accommodate 'make' programs on
+ old systems (such as CLIX 3.1) whose suffix rules fail for filenames longer
+ than 14 characters - TD
+* change VMS WWW build-script to use prefix=all rather than prefix=ansi,
+ so that POSIX functions such as 'stat()' are linked properly (reported by
+ Morris D Cox <coxmd@appstate.edu>) - TD
+* modify configure macro CF_EBCDIC to avoid using #error, since that is not
+ recognized by all compilers - TD
+* include <sys/types.h> in CF_INET_ADDR macro, to accommodate systems which
+ require that to compile test program with the socket.h, other network
+ headers - TD
+* removed a cast in free_lynx_cfg, on FREE's argument, which caused some
+ compilers to report that an rvalue was being modified (reported by PW) - TD
+
+1999-02-16 (2.8.2dev.17)
+* modify LYReadCFG.c to avoid duplicating data for cookies - BJP
+* modify HTConfirm to use gettext values for yes/no. Use HTConfirm in a few
+ more places, though completing this will require more work - TD
+* add note about resolv library to PROBLEMS - PW
+* minor clarification about DOS/Windows binaries in README - PW
+* modify ./makefile.in so that portions which are commented-out will be done
+ without a leading tab, since that confuses the make program on Digital Unix
+ 3.2 - TD
+* Unix: Don't accept HOME variable as valid if it does not begin with
+ a slash - KW
+* changed HTGetCharacter to be 8-bit clean, it could not distinguish between a
+ character value 255 and EOF. Changes affect several protocols: nntp,
+ gopher, finger, ftp. Most notably, news articles containing byte value 255
+ could not be completely read - KW
+* removed a memory leak in HTFTP.c for some directory data, added a few gettext
+ calls - KW
+* added ability to show file type description in local Unix directory listings.
+ New format codes for use in LIST_FORMAT %t, %T are not used by default - KW
+* modify "clean" makefile rule to allow for FreeBSD, which generates core
+ files such as lynx.core - KED, TD
+* correct sign-extension when converting characters after edit of TEXTAREA
+ (upper-128 characters were being translated to dots, reported by IC) - KED
+* worked with some pathological/boundary-case pages, and fixed some some edges
+ that could fail (eg, last line of document is also last line of a TEXTAREA,
+ and lines are being added; page containing *only* a one-line TEXTAREA field;
+ etc). While it was unlikely one would run into such beasts in real life,
+ they all work correctly now. Thanks to Greg Marr and Serge Munhov for
+ providing some very basic pages that I was able to easily modify for various
+ test cases - KED
+* added a few flags to the TextAnchor and HTLine struct's, to indicate an
+ expansion line. These were added to allow for line deletion when a TEXTAREA
+ is "reset" or shrinks (when we get around to tackling those tasks) - KED
+* the editor's cursor is now positioned on the same line in the edit file, as
+ it was on when the editor was invoked (relative to the beginning of the
+ TEXTAREA). At least for those editors that lynx knows support initial
+ positioning (emacs, vi, pico, jove, and jed for non-VMS platforms; sedt for
+ VMS) - KED
+* cleaned up and corrected a few comments; simplified a few small bits of
+ code - KED
+* added cookie_domain_flags enum to LYCookie.h, usage should be apparent with
+ patch applied - BJP
+* updated free_lynx_globals() for cookie variables - BJP
+* replaced cookie_add_acceptlist, cookie_add_rejectlist and
+ cookie_set_invcheck functions with cookie_domain_flag_set - BJP
+* saved a bit of memory by dropping useless pointer memory initialization
+ (exactly WHAT was I thinking?) - BJP
+* changed LYrcFile.c, LYReadCFG.c to call cookie_domain_flag_set - BJP
+* new lynxkeycode BACKTAB_KEY with value 0x10F. DO_NOTHING is and shall remain
+ 0x10E, as documented in lynx.cfg. Moved MOUSE_KEY out of the way - does it
+ need to be in the tables at all? BACKTAB_KEY will be recognized if the
+ (n)curses keypad() input handling returns KEY_BTAB, which happens if the
+ terminal description has the right kB or kcbt capability string and the
+ terminal actually generates that string (often "^[[Z", generated for
+ shift+tab). May also work with lynx-keymaps mechanism. Not tested with
+ slang, maybe this has to be added to some more of the various tables in
+ LYStrings.c - KW
+* new user-visible key commands FASTFORW_LINK and FASTBACKW_LINK, with
+ lynxactionscodes LYK_FASTFORW_LINK and LYK_FASTBACKW_LINK. By default mapped
+ from <tab> key (^I) and new BACKTAB_KEY, respectively. Previously <tab> was
+ mapped from NEXT_LINK, which has some special handling if the invoking key
+ was <tab> (and if FASTTAB was defined in LYMainLoop.c, which was the case by
+ default). The old behavior of <tab> is still available if it is mapped with
+ KEYMAP to NEXT_LINK in lynx.cfg - KW
+* these commands always go to a previous (or next) link if there is one,
+ and skip multiple lines that are part of the same textarea - KW
+* recognize the new key actions also during partial file display, for some
+ roughly corresponding movement - KW
+* new lynxeditactioncode LYE_FORM_PASS, to allow any lynxkeycode to end the
+ editing of a form field and be passed up to the caller - it will then
+ normally be mapped to a lynxactioncode. LYE_FORM_PASS keys are generally
+ ignored in non-forms line editing. This is used for BACKTAB_KEY, as well as
+ several other keys that were previously handled specially in form_getstr - KW
+* extended the maps in LYEditmap.c to cover the same range of lynxkeycodes as
+ the LYKeymap.c tables. Yes, this uses more space, but the tables need to be
+ consistent - KW
+* map lynxkeycode 0x00 to LYK_DO_NOTHING, as lynx.cfg said all the time - KW
+* some tweaks of displayed strings in 'K'ey Map page. Don't show CHANGE_LINK
+ binding if mouse not enabled (it may not be useful even when -use_mouse is
+ on) - KW
+* function expand_substring used with NCURSES for user-defined mapping keysyms
+ to byte sequences was parsing the "^(...)" construct wrong - KW
+* other small tweaks in key handling code - KW
+* changes to lynx.cfg to better reflect reality - KW
+* terminology note: lynxkeycode = what's between the colons in lynx.cfg
+ KEYMAP:...:..., lynxactioncode = LYK_* code for what's right of the second
+ colon, lynxeditactioncode = what's assigned in LYEditmap.c (and which may
+ differ between lineedit_mode Default Binding and alternative bindings) - KW
+* formatting tweak in HTML.c for <DD> not preceded by <DT>: Don't use wrong
+ indentation in that case - KW
+* changes from DK for DOS up to 1999-02-14 - KW
+* minor documentation tweaks - LP
+* replace most uses of free with FREE -John Bley
+* correct HTEndParam so that if fewer command-parameters are given than
+ expected, we still terminate the command properly (reported by
+ Michael Warner) - TD
+
+1999-02-08 (2.8.2dev.16)
+* minor documentation tweaks for EDITTEXTAREA - LP
+* correct uninitialized buffer variable in send_file_to_mail() which caused
+ core dump (reported by LV) - KW
+* recognize Subject and Message-Id in embedded comments in HTML documents, in
+ the form generated by MHonArc for mailing list archives (including lynx-dev).
+ Use these to generate a default Subject and an In-Reply-To header (currently
+ not for VMS) when replying by mail (sending a 'C'omment, or following a
+ mailto link) from such a page. The old methods to get a title other than the
+ fallback (the URL) still are there and have precedence, by in reality seem to
+ apply very rarely. If no suitable comment strings are found or they are
+ regarded as invalid (bad characters, not exactly right format) they are not
+ used, and the fallback (URL as Subject, no In-Reply-To) applies - KW
+* use the Message-Id of a news article to generate a References header when
+ posting a reply. Lynx's new article listing doesn't understand threading,
+ but this is nicer for other newsreader that do. The References header of the
+ referenced article is not used, so there will be only one message-id in the
+ generated References header, but this is better than nothing. The article's
+ message-id is appended as a parameter to the URL of the generated newsreply
+ link, in the form ";ref=...", so this extends the syntax of Lynx's newsreply:
+ URL scheme. Nothing should have changed for snews: and other s-versions of
+ the various URL schemes for news access - KW
+* Message-Id and Subject of a news article are also made available for replying
+ by mail - KW
+* LYNews.c: Don't post a message that is empty or has only '>'-quoted text - KW
+* HTNews.c: got rid of some suspicious fixed length buffers. Fixed minor
+ memory leaks. Added abort of the target stream which was missing in some
+ cases. Create mailto: hrefs in URL-escaped form if necessary, they will be
+ unescaped in LYMail.c. (News URLs still don't use escaping the right way,
+ especially for message-ids.) Recognize special meaning of "Followup-to:
+ poster" (don't treat "poster" as a newsgroup name). Other small tweaks - KW
+* add samples/cernrules.txt - KW
+* except for DJGPP, move lookup code for domain names (not dotted-quad IP
+ addresses) from HTParseInet into a new function: LYGetHostByName acts like
+ the normal gethostbyname, but includes the NSL_FORK logic. Interruption is
+ indicated in global variable lynx_nsl_status - KW
+* use LYGetHostByName instead of HTParseInet for URL guessing - KW
+* select on tty file descriptor in NSL_FORK loop also if compiled with slang.
+ This should make 'z' during lookup more responsive - KW
+* don't compile in the rules implementation code if NO_RULES is defined
+ (suggested by BL) - KW
+* fix special case of EDITTEXTAREA where the returned file is empty - BJP
+* write to .lynxrc values for COOKIE_ACCEPT_DOMAINS and COOKIE_REJECT_DOMAIN
+ when options screen is used - BJP
+* add lynx.cfg and .lynxrc support for a few new options (BJP):
+ COOKIE_STRICT_INVALID_DOMAINS,
+ COOKIE_LOOSE_INVALID_DOMAINS,
+ COOKIE_QUERY_INVALID_DOMAINS
+ They're the same sort as COOKIE_ACCEPT_DOMAINS, comma-delimited lists.
+* modify LYOpenTemp() to report unusual errors, i.e., other than if the
+ temporary file could not be created because it already exists - PG
+* more fixes to CF_INET_ADDR - TD
+* modify README to indicate where win32 binaries are found - JES
+* add chrtrans tables for Ukrainian Cyrillic: koi8-u, cp866u, iso-9945-2
+ (patch by Serhii Hlodin <hlodin@lutsk.bank.gov.ua>)
+* patch for TEXTAREA edit feature - KED
+ 1. Handles the renumbering of link number tags [nnn], when the tag itself is
+ split across two lines (see below).
+ 2. Scrolling down, going to the bottom of the document, etc, now work
+ properly, when the TEXTAREA is expanded beyond the bottom of the
+ (original) screen display.
+ 3. Hitting the reset button is now handled properly WRT the "old" text in
+ expansion lines (now *always* empty).
+ 4. Attempting to edit (^Ve) a TEXT field (not a TEXTAREA), is now blocked,
+ with the user getting an error msg.
+ 5. The function call now returns the number of lines that the cursor should
+ be moved from its current position, to end up on the first blank line of
+ any trailing empty lines in the TEXTAREA (there will always be one).
+* bug fixes for TEXTAREA edit feature - KED
+ 1. Thanks to a suggestion by Bela, your regular EDIT keybinding ("e" by
+ default), will now bring up the editor within a TEXTAREA, so there's no
+ need to "waste" a separate keybinding (though you can still additionally
+ bind the function separately, if desired).
+ 2. Converts any tab chars in the edited file, to spaces in the TEXTAREA
+ anchor line. The tabstop is currently #define'd to the quasi-standard
+ value of 8. (If anyone thinks that needs to be user configurable, feel
+ free to add that to the o(ptions) form/menu,
+ cmd-line-arg/lynx.cfg/.lynxrc/userdefs.h, whatever ...
+ I recommend against doing so though, as tabstops that are not set at 8,
+ are a PITA to deal with, generally speaking. I dunno if tab chars in a
+ TEXTAREA form are prohibited "by spec", or if it is just a "lynxism" that
+ they cause rendering problems (as well as downstream problems with
+ submit/etc, I think), but I felt I needed to do something to make lynx
+ behave rationally if they are present in the edited data (quite possibly
+ from an arbitrary file that one pulled into the editor). Filtering them
+ to spaces, seemed the most reasonable thing to do.
+ 3. Replaces any embedded control chars with something printable (I chose a
+ "." char, since it is less "intrusive" than some other choices, like "*",
+ "+", "#", etc). As with tabs, when some of these chars *are* rendered
+ into the TEXTAREA, strange things may happen. This shouldn't be much of a
+ limitation, since many of these chars perform line-editing or
+ system/job-control functions, when entered directly while one is in the
+ TEXTAREA. They currently cannot be "escaped" and entered as actual text
+ chars, so far as I can tell. Anyway ... I don't know of any "legitimate"
+ reason for them to be used as TEXTAREA data, so for now, you get "dots" in
+ their place.
+ 4. Cleans up a few comments, and such.
+* update some linked in lynx_help_main.html (Heikki Kantola <hezu@iki.fi>)
+* add checks for null return from malloc to HTInit.c, LYMain.c, LYReadCFG.c,
+ LYUtils.c -John Bley
+* add telnet, tn3270 and rlogin program paths to configure script
+ (patch by George Lindholm <George.Lindholm@ubc.ca>).
+
+1999-01-28 (2.8.2dev.15)
+* correct calls to HTAddParam() in LYDownLoad.c to handle optional second
+ parameter (reported by KW) - TD
+* change HTAddXpand() to assume its parameter (an environment variable) is
+ already expanded and simply is not quoted (reported by Ryan Hung
+ <rhung@vcn.bc.ca>) - TD
+* add configure --disable-included-msgs option to allow suppressing of bundled
+ ./po directory for the NLS message library contents. If no ./po directory
+ is found, the configure script assumes it is preinstalled anyway (request
+ by HN) - TD
+* add pattern to script which customizes pathnames in lynx.cfg to support
+ GLOBAL_MAILCAP:/PATH_TO/lynx_doc/samples/mailcap
+ (request by PG) - TD
+* export $PATH when calling cfg_defs.sh - PG
+* add a simple test to check if the temporary directory is actually writable
+ if we cannot create a temporary file in LYOpenTemp (reported by PG) - TD
+* miscellaneous DOS/DJGPP compile/build fixes - LP
+* enabled CERN-style rules, there are two new lynx.cfg options, RULESFILE and
+ RULE. No example file or documentation yet beyond comments in lynx.cfg. The
+ rules mechanism itself is unchanged from what was present for a long time
+ (but never used), except for some memory cleanup. Use -DNO_RULES at compile
+ time to disable - KW
+* add changes to invoke external editor on textarea, can be invoked by adding a
+ KEYMAP entry for EDITTEXTAREA area to lynx.cfg (originally from
+ aldomel@ix.netcom.com, but much rework) - KED
+* use HTSprintf0 in HTTCP.c - TD
+* added PARSE_STRICTPATH and PARSE_QUERY to interface of HTParse(), for
+ requesting only the relevant part of what is returned for PARSE_PATH. This
+ isn't yet used anywhere - KW
+* changes to StrAllocVsprintf() to take width and precision in most format
+ specifications into account, and to correct the memory allocation logic.
+ This was tested by setting GROW_SIZE to a small value of 8, so far no
+ crashes, but it is certainly not right for all possible formats, especially
+ involving floating point conversions - KW
+* changed HTSprintf0() to pass a string already existing in its output buffer
+ on, this should save a few realloc's in StrAllocVsprintf() - KW
+* changes to code handling LIST_FORMAT to avoid some unnecessary reallocations,
+ to recognize some more format flags, and to treat invalid formats somewhat
+ better - KW
+* corrected recent HTFile.c change for systems without S_ISVTX - KW
+* added memory cleanup for uid/gid cache functions in HTAAProt.c - KW
+* increased ATEXITSIZE to 40 - KW
+* added TRACE output to HTAnchor.c's free_adult_table. If this shows anything
+ at program exit (if TRACE is on then), it means that HTAnchor structures have
+ been missed by the normal automatic cleanup (walking the history list and
+ following links) - KW
+* changed more status codes in HTUtils.h to libwww5-like values - KW
+* added new function to check for a valid Internet hostname - KW
+ Use it before actually trying to resolve an address, it should
+ a. avoid the overhead of NSL_FORK if it would fail anyway,
+ b. prevent DNS queries for invalid names, which may unnecessarily
+ consume time, bandwidth, and DNS server cache memory, and
+ may confuse some resolver libraries and servers,
+ c. speed up address guessing sometimes if something was mistyped,
+ d. thwart some attempts to crash Lynx with invalid URLs.
+* this time really make "Alert" statusline prefix localizable - KW
+* new function HTAlwaysAlert(), which can be called even when LYCursesON isn't
+ true and should always produce a visible message - KW
+* use new valid_hostname to also check telnet, tn3270, and rlogin hostnames
+ before calling the external program (after most invalid character have
+ already been stripped). Added a fflush(stdout) to make sure messages are
+ visible before external program is called - KW
+* made changes equivalent to the 1998-12-31 HTSACopy and HTSACat modification
+ to the LY_FIND_LEAKS versions of those functions. Having source and target
+ string for StrAllocCopy or StrAllocCat overlap (or being equal) should be
+ considered a programming error, but at least one place in LYEdit.c currently
+ seems to do it and rely on the new behavior. (Editing current file sometimes
+ didn't work with LY_FIND_LEAKS) - KW
+* closed memory leaks in LYKeymap.c, provided for memory cleanup at exit of
+ LYCgi.c environment strings - KW
+* explicitly put HTTP_ACCEPT_LANGUAGE and HTTP_ACCEPT_CHARSET strings into
+ lynxcgi environment only if they are non-empty, i.e., set to something in
+ lynx.cfg or the personal configuration or Options screen. This makes the
+ environment a lynxcgi scripts sees resemble more closely that of a remote CGI
+ script handling a request from Lynx with the same configuration - HTTP.c also
+ only sends Accept-{Language,Charset} headers if preferred language and
+ preferred charset (respectively) have been set to non-empty strings.
+ (Strictly speaking, an empty Accept-* header has a different meaning from a
+ non-existing one, but it doesn't make much sense to generate empty Accept-*
+ headers, since they mean "nothing is accepted".) There are other differences
+ in the lynxcgi environment (e.g. HTTP_ACCEPT isn't set, ",iso-8859-1;q=0.01"
+ etc. isn't appended to HTTP_ACCEPT_CHARSET, apart from missing
+ redirections), but apparently nobody has needed a more exact CGI emulation
+ for real scripts - KW
+* removed sending of "Negotiate: trans" in HTTP.c since it violates transparent
+ content negotiation specs, added comments - KW
+* correct error handling in CF_INET_ADDR, which did not restore $LIBS when no
+ applicable library was found for inet_addr (reported by IC) - TD
+* correction to CF_TERMCAP_LIBS, which used inconsistent spelling for the cache
+ variable, so predefined termcap/terminfo library was not necessarily
+ detected - TD
+* resolved autoconf 2.13 problem, resync configure script with patched
+ autoconf 2.13 - TD
+
+1999-01-18 (2.8.2dev.14)
+* use HTSprintf0 in LYCurses.c, LYForms.c, LYGetFile.c, LYJump.c - TD
+* modify LYCheckMail so it does not continue to report new mail when the mail
+ file's modification time differs from its access time (reported by LV) - TD
+* add check for inet_addr function, and (preferred) inet_aton. The first
+ function is reported to be sometimes in -lresolv, or -lbind when it is not
+ present in the conventional network libraries (from report by
+ mattack@area.com and comments by HN) - TD
+* resync config.sub, config.guess with autoconf 2.13.19990117 (not yet
+ configure, since autoconf 2.13 contains some new bugs) - TD
+* modified handling of untranslatable charsets, after noticing that a page
+ with charset=ISO-2022-JP produced an alert message with a truncated
+ "iso-2022-j". Looking more closely, the code could also result in memory
+ corruption in some cases. Compared with older versions, then changed the
+ code to something somewhat like what was intended there. But we don't have
+ an "Other ISO Latin" display character set any more; maybe those `else'
+ blocks should just have disappeared completely - KW
+* minor changes to SortaSGML DTD for PARAM, THEAD - KW
+* make "Alert" statusline prefix localizable - KW
+* extend fixtext.sh to also change continued lines - KW
+* changed LYCheckForProxyURL to act more like it appears to have been indented,
+ and clarify comment. Minor change in is_url - KW
+* prevent removal of hidden link number from bookmark document in a very
+ obscure case of a bookmarked ISMAP link - KW
+* HText_SubmitForm: make sure query is always allocated, even if the set of
+ form fields to be sent turned out to be empty - KW
+* some comments corrected in HTML.c, LYCharSets.c - KW
+* tweak in curses_w_style for display without color - KW
+* remove minor memory leak in LYDownload.c - KW
+* changed error handling in LYTraversal.c to make sure terminal gets restored
+ to sane mode before showing error message and exiting - KW
+* increased VALUE_SIZE for buffer in HTMIME.c from 1024 to 5120. Someone
+ needed increase for long Set-Cookie headers - KW
+* two new functions in HTList.c to reverse and to combine lists - KW
+* Lynx was using the wrong precedence for entries within a mailcap (relative to
+ other entries from the same file): RFC 1524 says "The configuration
+ information will be obtained from the FIRST matching entry in a mailcap
+ file[...]", but Lynx effectively gave precedence to the last match. Recent
+ Debian packages of lynx have had a patch applied to change this, but that
+ patch also seems to affect the precedence order relative to viewers defined
+ in other places, i.e., lynx.cfg and HTInit.c. The patch here instead changes
+ the precedence of mailcap entries form the same files to RFC-like behavior,
+ by reordering the list generated from a mailcap file after we have finished
+ reading it in. It leaves the order relative to viewers from other sources
+ unchanged. Maybe it should be made configurable whether Lynx's traditional
+ precedence or the new one is used; currently there is just a #define in
+ HTInit.c which could be changed to revert to traditional behavior - KW
+* add checks for null return from malloc to LYCurses.c, LYStrings.c,
+ (patch by John Bley)
+* add support for HP Roman8 as a display character set. HP Roman8 is used by
+ Hewlett-Packard terminals and hpterm, HP's version of xterm. The character
+ repertoire is largely similar to ISO Latin 1 but the code points are all
+ mixed up (patch by Christian Weisgerber)
+* modify WWW/Library/Implementation/HTAAUtil.c::HTAA_setupReader(): to use
+ malloc'd buffer rather than static buffer, to avoid overflow (patch by Thomas
+ Braun <Thomas.Braun@link-up.de>)
+* modifications to allow building the DOS lynx port with support of gettext for
+ producing messages in various languages. The DOS port of the gettext package
+ still needs minor tweaking to get it to function properly, but this shouldn't
+ be a problem for most people trying to compile lynx for DOS themselves.
+ Rather than put yet more DOS-specific makefiles in the distribution, I put
+ the changes to the makefiles within comments, which can easily be removed to
+ enable the changes - DK
+* add a comment about LYUCcharset struct "UChndl" field. Tweak trace
+ messages - LP
+* fix parsing of ALT=value attribute when the value is not quoted. When the
+ first character is not us-ascii it was corrupted by chartrans in all versions
+ of lynx. Fix case S_equals in SGML_character() - LP
+* chartrans: ignore RAW_TOGGLE key and do not change LYUseDefaultRawMode if
+ current document's charset specified explicitly, add status message. (Let
+ user switch toggle only when necessary, to avoid future problems :-) - LP
+* chartrans: change the default value of PREPEND_CHARSET_TO_SOURCE in lynx.cfg
+ from FALSE to TRUE (better safe than sorry) - LP
+* reorder forms-based options menu (cosmetic): rename "HTML error tolerance"
+ to "HTML error recovery", reorganize "Character Set Options" section -
+ "Display character set" went to "Personal preferences" section, "Assume
+ character set" and "Raw 8-bit or CJK mode" went to "Document Layout" section;
+ "Execution Links" went to "File management" section. (Hope this helps to
+ reduce confusion) - LP
+* remove "environment variables" section from INSTALLATION, change references
+ to Lynx User Guide in all docs. Minor tweaks on help files - LP
+* add a comment to mime.types and lynx.cfg on SUFFIX definition: "This has an
+ effect for ftp and local files only, http server does specify MIME type in
+ the Content-Type header" - LP
+
+1999-01-13 (2.8.2dev.13)
+* correct a missing trailing newline in caselower.h (this may be a problem
+ patching since 'diff' does not like that) - TD
+* fix off-by-one alignment download options (reported by LV) - IC
+* use HTSprintf/HTSprintf0 in UCAuto.c - TD
+* remove stop/start curses calls around UCChangeTerminalCodepage() in
+ GridText.c, since they are not necessary, and are a little distracting
+ when running Lynx in xterm - TD
+* correct handling in getfile() of ~/ expansion - KW
+* modify NSL_FORK logic to prevent child process from running any signal
+ handlers the parent may have installed - KW
+* the logic added to display_page for avoiding unnecessary screen redraw with
+ partial display (see 1998-12-03) is now disabled if enable_scrollback is set.
+ Otherwise displayed pages could appear as empty (or with only the current
+ link drawn) - KW
+* modify conditions under which screen style cache is reset (only relevant for
+ color style in combination with partial display) - KW
+* update the INSTALLATION file, reflecting the changes between the two DJGPP
+ versions of GCC in use. Also, change optimization to -O2 in the other two
+ DOS makefiles - DK
+* add support for ISO 8859-15, i.e., "Latin 9", make corrections to DEC
+ Multinational character translations (patch by Christian Weisgerber
+ <naddy@mips.rhein-neckar.de>)
+* modify po/makefile.inn to use mkdirs.sh rather than mkinstalldirs script
+ (reported by LV) - TD
+* modify print_help_and_exit() to print values for the simple options, i.e.,
+ toggle, integer and string, as part of "lynx -help" (request by
+ mattack@area.com) - TD
+* correct sense shown for Old_DTD variable in LYOptions.c (reported by DK) -TD
+* correct order of params for non-Unix use of HTAddParam in LYBookmark.c
+ (reported by DK) -TD
+
+1998-12-31 (2.8.2dev.12a)
+* delete unused 'PREVAIL' color-style code from HTML.c, merge a couple of
+ sections of logic with TrimColorClass, and change Style_className to
+ a dynamically-allocated string - TD
+* modify fmt_tempname() to check for buffer overflow - TD
+* check/modify for potential buffer overflows: HTAlert.c, LYBookMark.c,
+ LYKeymap.c, LYPrint.c (including splitting it up into functions) - TD
+* change GetOptValues to return status separately from the decoded value, in
+ case the options form is damaged (suggested by LP) - TD
+* add new function HTAddXpand to use in special case where Lynx is building
+ shell command using data from user's configuration, which should not be
+ quoted. Use this in LYEdit.c to allow $EDITOR to be given as the editor
+ name (request by PG) - TD
+* add new function LYOpenTraceLog, to combine logic in LYMain.c and
+ LYMainLoop.c, including Lynx's version message - TD
+* fix some discrepancies between the code and the documentation (help files),
+ for the alternate line edit keybindings, that were first included in the
+ distribution somewhere around -dev.3, or so - KED
+* added a delete-to-beginning-of-line (for the alt bindings only), and a help
+ page that describes the alternate bindings - KED
+* improved description of "HTML error tolerance" - KW
+* changes for handling lynxcgi: handle failure of execve(), by showing the
+ system error and then _exit()ing the child process. Make sure REQUEST_METHOD
+ is always set. Added checks for EINTR and other errors from read() - KW
+* DOSPATH or EMX: remove strange code dealing with root of local drive from
+ is_url() and HTDOS_name()/HTDOS_wwwname(), add right code at the earlier
+ stage in LYFillLocalFileURL() - LP (thanks KW)
+* relax warning from HTAlert to HTUserMsg on REFRESH_URL_NOT_ABSOLUTE - LP
+* more tweaks on transfer rate calculation - LP
+* modify HTSACopy and HTSACat in case the source and destination are the same
+ pointer - TD
+* tested/removed redundant OS/2 EMX adjustment to filename from LYEdit.c - TD
+* optimized LYEdit.c by moving calls on HTSYS_name(filename) to a single place
+ near the top - LP
+* forms-based options menu: prevent spoofing attempts from possible overruns
+ (e.g., user can doing 'e'dit in 'o'ptions and get core dump if
+ display_char_set gets an illegal number such as 50, or hang the keyboard with
+ illegal Line edit style) - LP
+* forms-based options menu: add new logical section - Document Layout,
+ currently with "HTML error tolerance" (TagSoup/SortaSGML), "Pop-up for select
+ fields", "Show images" (no_alt/labels/links) and "Verbose images". New
+ switches added for information purposes mostly, they duplicate hot keys but
+ not so hidden from user's view. Documentation updated also. (Oh yes, "Line
+ edit style" option is now available when we have a real choice >1) - LP
+* split cfg_defs.sh into two script based on revised script from PG - TD
+* minor fixes for top-level makefile.in - PG
+* fixes for makefiles with gcc 2.8.1 using DJGPP 2.02 (do not use "-c -o"
+ combination, strip trailing blanks from makefile.sla, change optimization
+ level to -O2) - DK
+* rename New_DTD variable to Old_DTD, change logic for -tagsoup option to be
+ consistent with sense in lynx.cfg (reported by LP) -TD
+
+1998-12-26 (2.8.2dev.12)
+* use HTSprintf0 in LYCgi.c - TD
+* add tab-completion on URL's, by using previously-entered strings for
+ matching (patch by Kari Davidsson <karid@isholf.is>) - TD
+* add version number to trace log (patch by IC)
+* modify HTDOS_name to be consistent with HTVMS_name, which does not modify
+ its parameter (reported by LP). Also, modify HTDOS_name and HTDOS_wwwName
+ so they allocate space for the result rather than using a static buffer - TD
+* modify LYEdit.c to use HTAddParam - TD
+* make HREF/NAME for "Environment" consistent in Lynx_users_guide.html
+ (reported by LP) -TD
+* correct DOS/EMX logic in LYEdit.c which incremented 'filename' pointer when
+ its length was greater than 1 rather than recopying the string, causing a
+ core dump when 'filename' was freed (reported by LP, this applies to
+ 2.8.1rel.2) - TD
+* correct sense of 'already_exists()' function from dev.11, which caused
+ various file-menu operations to stop working (reported by IC) - TD
+
+1998-12-24 (2.8.2dev.11)
+* use HTSprintf/HTSprintf0 in about half of the WWW library files where
+ applicable: HTAABrow.c HTAAServ.c HTAAUtil.c HTAccess.c HTAnchor.c HTDOS.c
+ HTFTP.c HTFWriter.c HTFile.c HTFinger.c HTFormat.c HTGopher.c - TD
+* eliminate most duplicate gettext parameters, reduced the number of files
+ listed in po/POTFILES.in to a size that may allow build with the Solaris
+ xgettext utility - TD
+* correct rule for remaking po/makefile - TD
+* workaround for HPUX sed program, providing '$' anchors for ".*" expressions,
+ which is redundant, but should be harmless (suggested by Jean-Yves Levesque
+ <Jean-Yves.Levesque.jyves@nortelnetworks.com>)
+* add new help file, keystrokes/environments.html - LP
+* fix HTReadProgress(): more accurate transfer rate calculation - LP
+* update slang makefile.dos, and corresponding INSTALLATION notes - DK
+* correct my integration of IZ's LY_CHANGE_LINK code, which resulted in an
+ out-of-bounds index into revmap (reported by LP, LV) - TD
+* add note about sendmail for Win32 to lynx.cfg - JES
+* add note for successful build on NeXT to INSTALLATION (Christian Jensen
+ <cejensen@winternet.com>)
+* add checks for null return from malloc to HTInit.c, LYMainLoop.c, LYUtils.c,
+ (patch by John Bley)
+* remove reference to 'persistent_cookies' in LYCookie.c which prevented
+ compile when persistent cookies configure option was disabled (report
+ by PG) - KW
+* move assignment to SHELL back from WWW/Library/makefile.in to CommonMakefile,
+ and revert use of $CONFIG_SHELL in configure script, since this appears to
+ stop auto-configure from finding working include feature of 'make' on CLIX
+ (reported by Alex Matulich) - TD
+
+1998-12-16 (2.8.2dev.10)
+* FROM_FILE is not used any more for a domain (although it is currently still
+ defined. Renamed COOKIE_FLAG_PERSISTENT to COOKIE_FLAG_FROM_FILE. Don't
+ change a domain's "behavior" (ACCEPT_ALWAYS, REJECT_ALWAYS, or QUERY_USER)
+ just because there was a persistent cookie for it. Users who want to always
+ accept cookies from a domain without prompting should use
+ COOKIE_ACCEPT_DOMAINS - KW
+* FREE domain_entry objects when they are not used any more. Other minor leak
+ removed - KW
+* some (few) changes for draft-ietf-http-state-man-mec-10.txt. Don't accept
+ invalid port lists (this may need more tweaking). Added some comments - KW
+* try to preserve cookies (within a domain) in the same order in which they
+ were received, although this is probably not necessary after all. There is
+ no difference any more w.r.t. insertion into the list between cookies from
+ the file and cookies from response headers - KW
+* use <= instead of < comparison when checking whether a cookie has expired -KW
+* don't write expired cookies, cookies with discard attribute, or cookies
+ without expiration date to persistent file - KW
+* don't call HTConfirmCookie for cookies read from file. This doesn't change
+ the logic since previously HTConfirmCookie allowed all file cookies
+ anyway - KW
+* don't delete the domain_list if it becomes empty. Doing this could result in
+ unnecessary multiple atexit()'s - KW
+* write the cookie file even if we now have no cookies, if we have previously
+ read cookies from the file. The file should be updated if all cookies that
+ were in it are expired or superseded or deleted - KW
+* when reading file cookies, set attributes in a way that (hopefully) makes
+ more sense than just ignoring them. See comments in LYLoadCookies.
+ We are restricted a lot by the choice of a Netscape-compatible cookie file
+ format, some version 1 properties just cannot be stored in it AFAIK. Some
+ more tweaking in LYLoadCookies - KW
+* setting a domains behavior to accept "A)lways" didn't actually work, it had
+ the same effect as "P)rompt". Corrected this simple (probably cut-and-paste)
+ error - KW
+* some changes in what is displayed on Cookie Jar page: FROM_FILE is a
+ property of individual cookies, not of domains as previously. Cookies from
+ file (which haven't been updated) are shown as "(from a previous session)".
+ Show expiration time ("Max. Gobble Date") whenever we have one. The state
+ of the "discard" attribute is already displayed separately - KW
+* made color styles code work much better with TagSoup parsing mode. A new
+ flag bit is set for some tags in HTMLDTD which indicates that, even though
+ they may be otherwise handled as SGML_EMPTY, this emptiness is fake. This
+ can only work reasonably for elements that require an end tag (not for LI,
+ for example) - KW
+* added SUMMARY attribute for TABLE element to HTMLDTD (but we don't do
+ anything with it) - KW
+* split_line: Try to account for changes in anchor position and extent in all
+ possible cases. This improves some cases where the selectable text could
+ become too short and, in extreme cases, a link could become erroneously
+ "hidden" - KW
+* split_line: color style changes after the split position are moved to the
+ correct position in the new line - KW
+* set TextAnchor's line_num in HText_beginInput, so that split_line can adjust
+ the input field's position properly if a split moves it to the next line.
+ Should solve problem reported for www.lycos.com - KW
+* don't refuse to read from file-descriptor 0 in HTDoRead for Unix if it is not
+ a tty. The socket fd from HTDoConnect can be 0 if fd 0 was not open when
+ lynx was started non-interactively - KW
+* increase INIT_LINE_SIZE in HTTP.c slightly from 1024 to 1536, so that for a
+ typical ethernet MTU the first packet of a response can more often be read in
+ with a single read() - KW
+* add a missing FREE() in HTTP.c - KW
+* use case mapping from ftp.unicode.org /Public/UNIDATA for case-insensitive
+ user search (thanks "Kari E Hurtta" <Kari.Hurtta@ozone.FMI.FI>), new file
+ src/chrtrans/caselower.h added. This is used instead of UPPER8 assumption
+ introduced in 2.8 release (see 1998-02-27). There is no difference in speed
+ though - LP
+* fix links in History/Visited Links page for documents with blank
+ <TITLE></TITLE>, also remove leading spaces from titles to make output a
+ little better - LP
+* use djgpp's <sys/config.h> file, which contains default values for autoconf
+ style definitions - LP
+* updated lynx.man, lynx.hlp for "SEE ALSO" sections - KED, JES
+* optimize the test commands specified in the mailcap file by remembering which
+ tests have been run already. (patch by Marc Huber <marc@sixpack.de>)
+* add lint rule to makefile.in, as well as corresponding rule in WWW/... - LV
+* update version in makefile.in to 2-8-2 - PG
+* fix makefiles to build with DJGPP (problem introduced in dev8) - LP
+* use new symbol KEYMAP_SIZE to get rid of various constants relating to the
+ size of keymap[] array, e.g, 0x293, 659 - TD
+* add new mouse and keymap functionality to lynx (IZ):
+ a) If one clicks mouse *near* a link, the "point/focus" is moved to this link
+ (without actual activation);
+ b) One can bind keys with ordinals larger than DO_NOTHING;
+ c) Primitive context sensitive menu added to the middle button of a mouse
+ (currently ncurses only);
+ Current micro-problem with "c" is that I do not know how to refresh a screen
+ before triggering the action, so if the action chosen from the menu would
+ not redraw the screen, the menu outline is left on the screen.
+* modify LYKeymap.c so that it can show internal keymaps above 0400 as
+ hexadecimal codes even if they do not appear in the function-key table -IZ
+* add HTOptParam to avoid spurious quoting of blanks in rlogin URLs by
+ HTAddParam - TD
+* correct missing assignment in remote_session(), from dev.9 changes for
+ HTAddParam, which broke telnet/rlogin URLs (reported by IC) - TD
+
+1998-12-12 (2.8.2dev.9)
+* change location-not-absolute message from an alert to user-message - TD
+* check for EINTR from read() call in HTDoRead, and retry if necessary. This
+ change only for Unix. Interrupted read() system calls should be rare (or
+ impossible, depending on the system implementation?) since the read() is only
+ done after a successful select(), but checking can't hurt - KW
+* check for read read() errors in HTDoRead and HTCopy, and generate alert
+ messages for unexpected errors. HTCopy still returns HT_LOADED to indicate
+ success if any data have been received before an unexpected error or
+ disconnection. Previously this happened without any indication to the user
+ that something was wrong and a document or file might be incomplete. These
+ changes currently only for Unix - KW
+* added/enhanced comments in HTFormat.c to document current behavior of HTCopy,
+ HTFileCopy, HTGzFileCopy, HTParseSocket, HTParseFile, and HTParseGzFile - KW
+* moved definition of HT_NO_DATA to HTUtils.h, changed value of some status
+ codes to libwww5-like values while we're at it - KW
+* correct uninitialized de variable in LYCookie.c when dump_output_immediately
+ is set. Also, made a slight change to this mode in LYMain.c, so that cookies
+ received will also be written to the cookie file; cleanup() is not called in
+ -dump mode (reported by Elwin Oost) - BJP
+* correct include-path for chrtrans makefile to allow builds outside the
+ source tree (Masashi Fujita)
+* minor cleanup of LYCookie.c, add some traces - BJP
+* add support for content encoding for x-bzip2, bzip2 for suffix "bz2" - HN
+* add po directory to install-bin and uninstall rules - TD
+* modify the environment variable logic to avoid freeing string given to putenv
+ until after giving it a new string - TD
+* add several environment variables to LYPrint.c - KED
+* add ENVIRONMENT section to lynx.man and lynx.hlp - KED
+* add installation note about --enable-gzip-help - KED
+* update installation notes for WAIS - DK
+* add/use new functions for building up command-string for shell commands,
+ which quote parameters as needed: HTAddParam(), HTEndParam(). Moved the
+ logic in quote_pathname to HTQuoteParameter, extending that function to quote
+ the parameter only if it contains characters which are problems with various
+ shells (e.g., wildcards), and to escape backslashes. In particular, use
+ these functions to ensure that the user and port strings in HTTelnet.c are
+ quoted (fixes a hole reported by Art Mulder <art@openbsd.org> - TD
+* modify print-to-file logic to permit writing to pipe, provided that the
+ user does not have no-shell restriction - TD
+* split-out logic for LYValidateFilename() from printfile() and LYDownload - TD
+* whitespace fixes - BJP
+* add configure option --with-nls-datadir, to allow installer to specify
+ alternate locale data directory. A separate option from --datadir is
+ required because the GNU gettext code is usually installed under
+ $(prefix)/share rather $(prefix)/lib - TD
+* add configure check for gettimeofday, to implement 0.1 second interval
+ for skipping HTCheckForInterrupt() - TD
+* modify configure script to generate references to $CONFIG_SHELL rather than
+ /bin/sh, to allow some testing with alternate shells. Autoconf uses this
+ variable for a similar purpose - TD
+* correct missing case for 'o', octal in StrAllocVsprintf (reported by IC) - TD
+* fix -restrictions=bookmark check in forms-based options menu (reported by KW
+ & Rodiger Geys) - LP
+* fix memory leaks in LYPrint.c and UCdomap.c - KW
+* when printing HEAD to email use URL in the subject, was title. (it was
+ especially annoying when we have 8bit title being sent as 7bit: no charset
+ information is supplied for letters with 7bit message body) - LP
+* remove "temp fix for HText_trimHightext side effect from partial mode by
+ introducing a flag in HText_beginInput()" from 1998-09-12 since it is now not
+ needed after KW's changes in HText_trimHightext. - LP
+
+1998-12-03 (2.8.2dev.8)
+* use HTSprintf/HTSprintf0 in LYCookie.c, LYLocal.c - TD
+* correct logic in OpenHiddenFile, which did not check if a failure to open a
+ file for append was due to the file's not existing and hence causing
+ IsOurFile to return failure. This caused the -traversal option to fail
+ (reported by Francis Irving <francis@ncgraphics.co.uk>, applies to
+ 2.8.1rel.2) - TD
+* fixed line number removal code in HText_endAnchor in several places, it was
+ modifying the wrong line which could lead to memory corruption - KW
+* tweaks in HText_startAnchor and HText_endAnchor for handling link numbers.
+ Don't swallow space after number if line was split. Find link number on
+ previous line even it it is at the very end. Adjust line split position after
+ number removal. Generate TRACE output in interesting cases - KW
+* prevent havoc (access to already freed memory etc.) caused by multiple
+ recursive invocations of HTAnchor_delete on the same HTParentAnchor. This
+ does not seem to actually happen normally during a session, but can occur
+ when the HTAnchor structures are cleaned up while handling a terminating
+ signal or outofmem condition - KW
+* reset the HTAnchor "underway" flag during final cleanup, so structures are
+ not prevented from being freed. This also should only make a difference when
+ handling a terminating signal or outofmem condition - KW
+* show sticky-bit in directory listings - LV
+* correct options-message on Print page - IC
+* update installation note about freewais library (reported by Chris Maden
+ <crism@oreilly.com>) - TD
+* improvements to mouse code, ncurses-based, from IZ (Ilya Zakharevich):
+ a) Mouse navigation inside text entry fields;
+ b) Mouse navigation to a text entry field (including an empty one)
+ c) Mouse navigation to a specific position of a text field (since I do not
+ know which fields are text fields, I implemented "b" and "c" for
+ F_TEXTAREA_TYPE and F_TEXT_TYPE only, search for these symbols in the
+ patch);
+ d) Mouse navigation in menus: To scroll, one can click on top/bottom border
+ (single=byline, double=bypage, triple=beg/end), or above/below menu
+ (single=bypage, double=beg/end)) mouse-3 ==> quit;
+ e) Double-click-1 on the first and last row are interpreted as goto-
+ start/end/main-window (depending on the location of the click).
+ Other Changes:
+ a) Ask ncurses for all mouse events, but increase mouseinterval() to simulate
+ current behavior (which is effectively an infinite mouseinterval() +
+ masking of repeated clicks);
+ b) Earlier clicking to the left of a link would activate the link. I see no
+ use for this, so consider this a bug.
+* HText_trimHightext (GridText.c): don't apply final adjustment repeatedly to
+ an anchor that has already been handled by this function; the function may be
+ called repeatedly if partial display is enabled. Some other changes in this
+ function, to interact better with the other GridText.c functions, especially
+ for partial display mode. We don't have to handle all anchors if the new
+ parameter "final" is not set.
+ Also empty anchors should now generally not any more move down over empty
+ lines, if they happen at a line end. Made some trace messages give more
+ information - KW
+* color styles: reset screen style cache to avoid random coloring when a link
+ is unhighlighted - KW
+* tweak in HText_setLastOptionValue: if an OPTION tag was directly followed by
+ several newlines, characters could be dropped - KW
+* tweak havevisible() function in LYBookmark.c to compare against Unicode
+ value rather than ASCII when checking for blanks - LP
+* ifdef user/group function caching calls so that this builds with djgpp, which
+ doesn't need/support this (patch by Gisle Vanem)
+* documentation updates for NLS - HN
+* separate some html from gettext in LYCgi.c, LYHistory.c, LYLocal.c - JES
+* avoid setting recent_sizechange during the very first start_curses call for
+ ncurses. This would result in an unnecessary refresh after loading the first
+ document - KW
+* added logic to display_page to avoid repainting the full screen contents in a
+ specific situation: if it has been called before (for the same lines in the
+ same document) during partial display, and is now being called normally (not
+ during partial display). If this applies, the normal line content is not
+ redrawn, but the title line and form fields are still repainted, and updating
+ of the links structures is always done. There are additional checks for
+ recent_sizechange and a text->stale flag (which was already implemented but
+ unused) to do the full redraw if that may be needed. This should avoid
+ unnecessary screen 'blinking' with curses when partial display is used (which
+ didn't seem to happen with slang) - KW
+* modify SGML.c to check for SGML_ELEMENT tag contents, fixing a case where an
+ entity that appears within a TABLE but outside of any table row TR will be
+ displayed by Lynx _without_ its entities being interpreted (analysis by Alan
+ J Flavell <flavell@a5.ph.gla.ac.uk>, applies to 2.8.1rel.2) - KW
+* check that stdin is really a tty before trying to select from it in the
+ NSL-FORK logic in HTParseInet(), file HTTCP.c (reported by Kim DeVaughn, for
+ someone who was unable to run lynx -dump in a cron job, applies to
+ 2.8.1rel.2) - TD, BL
+* updates for lynx_help_main.html (JES, IC).
+* change fopen for write in LYCookie.c to LYNewTxtFile so that the resulting
+ file will be readable by only the owner (Bill Nottingham <wen2@po.cwru.edu>
+ suggested using umask, but that may not be portable enough) - TD
+* use CONST in some places in UCdomap.c and makeuctb, to make more tables
+ shareable (suggested by LP) - TD
+* fixes for SunOS K&R compiler with/without unproto wrapper, i.e., definition
+ of 'const' - TD
+
+1998-11-23 (2.8.2dev.7)
+* convert KEY_ENTER to newline in LYgetch() to make Lynx work with IRIX's
+ iris-ansi terminfo description, which equates the kent capability with
+ carriage return. Doing this will allow lynx to use the keypad "enter" key as
+ an alias for carriage return on most terminals - KW
+* correct a few missing ifdef's for disabling the partial-display logic - TD
+* add/use new functions HTAA_UidToName(), HTAA_NameToUid(), HTAA_GidToName()
+ and HTAA_NameToGid() to hide details of code which uses pwd.h and grp.h,
+ as well as to cache the returned user/group names, improving performance
+ in the dired screen - TD
+* modify HTCheckForInterrupt() to check for interrupt no more than one per
+ second, since this check is comparatively slow - TD
+* modify ANSI_VARARGS case for HTSprintf() and HTSprintf0() to always use
+ ANSI prototypes, since __STDC__ may not necessarily be defined on some
+ systems, resulting in an inconsistent definition - PG
+* add install-full rule to makefile.in - LV
+* modify PutDefs macro in LYShowInfo.c to check for nonnull table[N].value,
+ which may be null due to limitations of cfg_defs.sh script on some
+ platforms where an empty string was intended (reported by LV, PG, applies
+ to 2.8.1rel.2) - TD
+* correct typo in 'make distclean' rule; an extra '-' prevented removal of
+ .orig and .rej files (patch by LV).
+
+1998-11-21 (2.8.2dev.6)
+* add call on dbug_init to LYMain.c, allowing use of the debugging code built
+ into the WATTCP code which is included in the DJGPP port of lynx. This is
+ activated by placing lines in the WATTCP.CFG file for:
+ DEBUG.MODE= (choices are HEADERS, DUMP, or ALL)
+ DEBUG.PROTO= (choices are TCP, UDP, or ALL)
+ DEBUG.FILE= (name of log file. Defaults to WATTCP.DBG)
+ This adds about 2K to the size of the stripped, compressed executable. You
+ get a log of the headers and/or a binary dump of the packets sent and
+ received. Maybe this will help in determining where ftp is failing in this
+ port - DK
+* correct definitions for ANSI_VARARGS, HAVE_STDARG_H in HTUtils.h (reported
+ by LP, for djgpp) - TD
+* correct logic in StrAllocVsprintf(), remove spurious test on dst_len
+ (analysis by LV) - TD
+
+1998-11-21 (2.8.2dev.5)
+* modify HTLoadFile() to make compressed files work with OS/2 EMX and
+ LYSystem() to convert forward slashes in pathnames to backslashes, also for
+ EMX (patches by Ilya Zakharevich).
+* documentation nits (apostrophes) in lynx.cfg and userdefs.h - LV
+* fix inconsistent newlines in po/it.po (report by Irving_Wolfe@Wolfe.net) - TD
+* modify config.guess, added Intergraph 2430 CLIX machines (reported by Alex
+ Matulich <matuli_a@marlin.navsea.navy.mil>) - TD
+* minor fix in LYCharSets.c according to recent changes in UCDefs.h introduced
+ by IBM OS/2 codepage number - LP
+* modify configure script to work with --enable-nls built into a subdirectory
+ of the source tree (reported by PG) - TD
+* disable regeneration of intl/po2tbl.sed and po/POTFILES if --disable-nls
+ configure option is specified - TD
+* add configure test for stdarg.h vs varargs.h - TD
+* fixes to work with SunOS K&R compiler - TD
+* don't trim trailing and leading spaces from unformatted text lines in some
+ cases (split_line in GridText.c). Prevents corruption of some uuencoded
+ files when they are displayed and then 'P'rinted (although 'D'ownload should
+ be used instead) - KW
+* some changes in HText_appendCharacter (GridText.c). Splitting of long SOURCE
+ lines now works with color styles - KW
+* workaround for multiple anchors in the same (invalid) HTML document with the
+ same NAME and different destinations (HTAnchor.c) - KW
+* check for 'z'ap while constructing local directory listings (non-VMS only, in
+ HTFile.c) - KW
+* added a couple outofmem checks (HTAnchor.c). Minor TRACE message change in
+ GridText.c for -tlog / USE_TRACE_LOG disabled - KW
+* when adding bookmark entries, don't accept a title string which appears to
+ consist only of blank characters (LYBookmark.c). When rendering a bookmark
+ file, use hiddenlinks=merge counting, so that numbers after entries with
+ empty titles don't get out of whack (GridText.c). This should prevent 'R'
+ from removing the wrong bookmark entry - KW
+* prevent generation of some unnecessary temp files when constructing mailcap
+ file test commands (HTInit.c) - KW
+* include LYLeaks.h in UCdomap.c for memory leak detection - KW
+* fixed various memory leaks (UCdomap.c, LYShowInfo.c, LYReadCFG.c, LYMain.c,
+ LYDownload.c, LYBookmark.c, HTML.c, DefaultStyle.c) - KW
+* escape '&' and '<' in HTML generated to display current lynx.cfg option
+ values (LYReadCFG.c) - KW
+* revert logic in split_line. Emphasis highlighting that should extend over
+ several lines was being lost at line breaks (GridText.c). (IsSpecialAttrChar
+ probably shouldn't return true for LY_SOFT_NEWLINE since in most places it
+ tests whether to skip a character position, but as long as this special char
+ is only used in SOURCE mode it cannot mess up any anchor positions so it
+ should be ok. - KW
+* correct character counting in SOURCE display continuation lines. A
+ highlighted search target would be shown shifted left by one character
+ position because the LY_SOFT_NEWLINE special was displayed as '+' but not
+ counted (GridText.c) - KW
+* prevent generation of invalid/unparsable comments if
+ UCSaveBookmarksInUnicode is in effect, other minor changes in
+ LYBookmark.c - KW
+* correction for color styles in HText_appendCharacter (GridText.c). At some
+ point a memmove was replaced by a for loop, but source and destination were
+ reversed and the counter was wrong - KW
+* modify HTSprintf/HTSprintf0 to use a more generic approach to varargs by
+ using only va_alist in the parameter list - TD
+* correct html expression in LYShowInfo.c of dev.3 which did not allow the temp
+ file with the lynx.cfg settings to be accessed from the Configuration
+ Definitions page (patch by IC (Ismael Cordeiro)).
+* correct "Exiting" message format in cleanup_sig(), which had unexpanded %d
+ (reported by BJP) - TD
+* add to config.hin the definitions set by AM_GNU_GETTEXT macro (PG pointed
+ out that this also sets 'inline', needed for GNU gettext) - TD
+* modify MakeNewTitle() to check for null pointer, fixing core dump with
+ verbose images when value[src_type] is null (reported by John Bley
+ <jbb6@acpub.duke.edu> for 2.8.1rel.2) - TD
+
+1998-11-18 (2.8.2dev.4)
+* change default for configure option of NLS (gettext) to disabled until we
+ finish porting it to implementations other than GNU gettext. Also,
+ change default for include-gettext configure option to "with" - TD
+* suppress cookie-storing if the value is null - BJP
+* ifdef'd alternative set of line-edit bindings with EXP_ALT_BINDINGS, add
+ configure option --enable-alt-bindings, rename DELEOL to DELEL, remove
+ binding of DELEL to '\' - TD
+* add alternative set of line-edit bindings to change the behavior of the ^B
+ and ^F line editor bindings to provide emacs/tcsh like behavior (cursor
+ left/right), instead of "word" deletes. Corrected a bug in the ^R (LYE_DELN)
+ function, which is described as "delete next character", but was in fact
+ performing identically to ^D (LYE_DELC) "delete current character". Added a
+ function called LYE_DELEL, which does the expected thing, and deletes
+ from the current cursor position, to the EOL.
+ New bindings:
+ ^B = LYE_BACK cursor backwards
+ ^F = LYE_FORW cursor forwards
+ ^K = LYE_DELEOL delete to end-of-line
+ ^T = LYE_DELNW delete next word
+ ^X = LYE_DELPW delete previous word
+ ^^ = LYE_UPPER upper case line (not active when kbd-layout binding is)
+ ^_ = LYE_LOWER lower case line
+ KED (Kim DeVaughn <kimdv@best.com>).
+* modify to show address to submit to on the statusline when in advanced user
+ mode. Also fixes one small typo in LYMainLoop.c. (suggested by
+ <erisson@sw-tech.com>) - BJP
+* modify HTParseInet() so that it works if stdin has been redirected to
+ /dev/null, e.g., when running a cron job (reported by John H DuBois III
+ <spcecdt@armory.com>) - BL
+* minor documentation updates to lynx.cfg (Larry Virden).
+* change some character constants from '\hex' and '\octal' form to decimal,
+ to persuade compilers that upper-128 compares are legal - TD
+* ifdef'd KEYBOARD_LAYOUT with EXP_KEYBOARD_LAYOUT, add configure option
+ --enable-kbd-layout - TD
+* implement EXP_CHARTRANS_AUTOSWITCH for OS/2 EMX (Sergey Svishchev).
+* add 'a' response when printing a file to allow append rather than overwrite
+ (Sergey Svishchev).
+* add KEYBOARD_LAYOUT to lynx.cfg, to support character-translation on input,
+ add missing line editing style selection to Options form. This is enabled
+ and disabled by the line edit control/uparrow (Sergey Svishchev
+ <svs@ropnet.ru>).
+* use exit_immediately() to reduce some signal-function clutter - LP
+* correct dependency in src/makefile.in for cfg_defs.h (Masashi Fujita
+ <objectx@bandit.co.jp>)
+* change quoted includes in intl directory to bracketed includes - TD
+
+1998-11-16 (2.8.2dev.3)
+* misc documentation updates for the gettext/internationalization - LP
+* rename po/makefile.in.in to po/makefile.inn, and modify distclean rule to
+ remove the remaining generated files - TD
+* preliminary changes to support port to OS/390, some ifdef'd with __MVS__,
+ some with EBCDIC and NOT_ASCII -PG
+* modify LYCookie.c to accept cookies with no value, in case the site resets a
+ cookie by nulling out the value (reported by Larry Virden) - BJP
+* modify cookie parsing to ignore comment lines beginning with a '#' (reported
+ by Jonathan Bobin indicates that Netscape adds comments back, confusing
+ Lynx) - BJP
+* highlight option letters in old options screen (adapted from patch by Ismael
+ Cordeiro) - TD
+* use HTSprintf functions in HText_SubmitForm(), user_message(),
+ LYLoadIMGmap(), HTTelnet.c. (The HTTelnet.c modifications fix a security
+ hole reported by Martin Mokrejs) - TD
+* add HTSprintf, HTSprintf0 functions, to use in resolving potential buffer
+ overflows - TD
+* modify HTVMS_purge() to rename the remaining file to version 1 unless a
+ permissions problem was encountered - TD
+
+1998-11-10 (2.8.2dev.2)
+* some testing against Solaris gettext implementation, enough to see that it is
+ not really compatible either source or binary with GNU gettext. For the time
+ being, I recommend building NLS support only with GNU gettext (and
+ --with-included-gettext to avoid conflict with Solaris' gettext in the
+ standard library). Otherwise use the --disable-nls configure option - TD
+* various changes to configure script and makefiles to make this build with and
+ without NLS - TD
+* undo spurious substitutions such as gettext("") - TD
+* modify some gettext() expressions to avoid embedding HTML in them - TD
+* restore definitions in LYMessages_en.h - TD
+* first cut of integrating Jim Spath's changes to incorporate message library
+ support - JES, TD
+
+1998-09-20 (2.8.1dev.29-intl)
+* edited files for language hooks (JES):
+ src/HTAlert.c src/HTInit.c src/HTML.c src/LYBookmark.c src/LYCgi.c
+ src/LYClean.c src/LYCookie.c src/LYCurses.c src/LYDownload.c src/LYEdit.c
+ src/LYForms.c src/LYGetFile.c src/LYMail.c src/LYMain.c src/LYMainLoop.c
+ src/LYMap.c src/LYNews.c src/LYPrint.c src/LYUpload.c src/LYUtils.c
+ src/LYexit.c
+ WWW/Library/Implementation/HTAABrow.c WWW/Library/Implementation/HTAAProt.c
+ WWW/Library/Implementation/HTAccess.c WWW/Library/Implementation/HTFTP.c
+ WWW/Library/Implementation/HTFWriter.c WWW/Library/Implementation/HTFinger.c
+ WWW/Library/Implementation/HTFormat.c WWW/Library/Implementation/HTGopher.c
+ WWW/Library/Implementation/HTMIME.c WWW/Library/Implementation/HTNews.c
+ WWW/Library/Implementation/HTRules.c WWW/Library/Implementation/HTStyle.c
+ WWW/Library/Implementation/HTTCP.c WWW/Library/Implementation/HTTP.c
+ WWW/Library/Implementation/HTVMSUtils.c WWW/Library/Implementation/HTWAIS.c
+ WWW/Library/Implementation/HTWSRC.c
+
+1998-09-08 (2.8.1dev25-intl)
+* Resynch with dev tree - JES
+
+1998-09-07 (2.8.1dev.21-intl p3)
+* About half through language hooks in WWW/Lib... - JES
+ Integrated part of Chebucto's French translations - JES
+* Included latest ABOUT-NLS from GNU project,
+
+1998-08-27 (2.8.1dev.21-intl p2)
+* Tested language hooks using src/LYNews.c and Italian messages file
+ provided by Sabato De Rosa <sabato.derosa@usa.net>. Made changes to
+ LYMain.c, LYMainLoop.c, LYNews.c and HTNews.c - JES
+1998-08-27 (2.8.1dev.21-intl p1)
+* add hooks to GNU gettext for international language support - JES
+ (This is an experimental modification that will be patched into
+ the main Lynx release after other platform testing. I've only done
+ NetBSD.)
+
+1998-11-05 (2.8.2dev.1)
+* relax the cookie sanity checking for version 0 (old) cookies _only when_ the
+ user has accept_all_cookies set (patch by Risto Widenius
+ <widenius@ling.helsinki.fi>)
+* modify get_listen_socket() to check if master_socket is set before attempting
+ to use it in FD_CLR (patch by Karl-Andre Skevik <karls@kosmo.inet.no>)
+* minor documentation fixes - DK
+* use $(LIBS) symbol in src/chrtrans/makefile.in (reported by Alois Maier
+ <m9235159@grz08u.unileoben.ac.at>) -TD
+* Fix core dump which may happen after printing-to-email - LP
+* Move read_rc() before parsing any command-line arguments (except -help)
+ so the latter will override any .lynxrc settings. In particular, the problem
+ was detected with -cookie_file= which was ignored after saving values
+ from Options menu - LP
+* Chartrans bug: LYNXIMGMAP now shows the text in right charset.
+ (The page was converted twice, fixed by adding META charset to this internal
+ page. The bug was in all versions of Lynx starting from 2.7.1ac) - LP
+* Oops, my typo from pre3 back to 27-09-98: windows-1252 appears twice
+ in the list of character sets in options menu, was also typo in docs - LP
+* modify HTDOS.c to permit compile with K&R compiler - TD
+
+1998-10-27 (2.8.1rel.2)
+* tidy up version numbers - TD
+* modify HTDOS.h to permit compile with K&R compiler - TD
+
+1998-10-24 (2.8.1rel.1)
+-----------------------
+* reorganize lynx_help_main.html - PW
+* minor change to WWW/.../tcp.h to eliminate redefinition warning by DEC C - TD
+* move checking for command-line "-head" and related options before curses
+ initialization so that program exits with correct terminal settings
+ (report by LV) -BL
+* correct uninitialized index into id_append in makeuctb, which causes problems
+ with def7_uni.tbl (analysis by LP)
+* add TAGSOUP flag to lynx.cfg to set initial state of Tag Soup vs SortaSGML
+ (request by LP) - TD
+* add PERSISTENT_COOKIES flag to lynx.cfg to allow disabling the persistent
+ cookies feature in a Lynx executable (request by BJP) - TD
+* modify read_cfg so that it does not display included-file information when
+ NO_CONFIG_INFO is defined (reported by LP) - TD
+* minor/cosmetic fixes for comments and documentation - LP
+* revised patch for nsl-fork, which does not rely on WNOWAIT definition - BL
+* include termio.h in LYCurses.c only #ifdef TERMIO_AND_CURSES (Philippe
+ De Muyter <phdm@macqel.be>)
+* modify cfg_defs.sh to work when the 'set' command emits double-quotes
+ (Paul Gilmartin)
+* update obsolete copy of HTFWriter.c to add content-encoding for HTFileSuffix
+ (reported by David Helder <dhelder@umich.edu) - TD
+
+1998-10-17 (2.8.1pre.11)
+* add dependency on cfg_defs.h to src/makefile.in for LYShowInfo.o
+ PG (Paul Gilmartin <pg@sweng.stortek.com>)
+* modify add_item_to_list() so that if the restriction flag is omitted from
+ a download/upload/extern line in lynx.cfg, it is assumed true. Also check
+ for null command string in LYExtern.c (bug report by HN) - TD
+* modify logic in forms-options menu so that assume_char_set now works
+ correctly for any LYRawMode value by synchronizing gen_options() and
+ postoptions() via rawmode memory - LP
+* correct ifdef'ing in LYShowInfo.c for non-Unix platforms - LP
+* modify nsl_fork logic to handle a case where child exits successfully
+ right after parent's select timed out (reported by Serge Munhoven) - BL
+* small updates to lynx_help files and other documentation (BJP, PW, LV).
+* add #define's for later work to simplify configuring the maximum number
+ of cookies (suggested by BJP) - TD
+* flush output in makeuctb, as possible fix for build problems on systems that
+ do not implement POSIX 'exit()' call (reported by Serge Munhoven
+ <munhoven@mema.ucl.ac.be> and Jan Hlavacek) - TD
+* put GOTOBUFFER, JUMPBUFFER and QUIT_DEFAULT_YES back the way they used to be
+ (majority decision) - TD
+
+1998-10-14 (2.8.1pre.10)
+* add/use HTSYS_purge and HTSYS_remove functions (based on report by Tony
+ Bolton and patch by BJP dealing with removing older versions of cookie
+ files) - TD
+* add --disable-config-info option - TD
+* change configure script --enable-forms-options to --disable-forms-options,
+ add --disable-menu-options - TD
+* comment-out FM's code to fold cookie headers and force cookies to be
+ presented in the same order that they were received - BJP
+* use full "Implementation" directory name in include path in WWW djgpp
+ makefile - DK
+* use HTDOS_name() to force DOS temporary-directory into consistent form - DK
+* include HTVMSUtils.h and HTDOS.h from LYUtils.h, consolidate some ifdef's
+ using macro HTSYS_name - TD
+* another fix for HTTCP.c, for lookups with Lynx/32 - WB
+* add fallback to $TMPDIR for Lynx temporary directory on Unix - TD
+* remove verbose_links variable due to popular demand - TD
+
+1998-10-10 (2.8.1pre.9)
+* add verbose_links variable to lynx.cfg and userdefs.h to control whether Lynx
+ should show "(LINK)" before links (request/patch by Moshe Zadka
+ <moshez@math.huji.ac.il>) - TD
+* change defaults in lynx.cfg and userdefs.h, add comments - PW
+ (a) defaults are stated for `verbose' & `KB';
+ (b) GOTOBUFFER & JUMPBUFFER defaults to TRUE;
+ (c) QUIT_DEFAULT_YES defaults to FALSE
+* restore suggested file name in download menu: it is really useful for other
+ download methods which should be available in menu when `save to disk' is
+ disabled. Remove local_path/ prefix (LYNX_SAVE_SPACE if any) from visible
+ suggested file name string near the top instead - LP
+* restore newline position when toggling comments parsing (at least we could
+ return to previous screen to try comments toggling twice) - LP
+* add a link from keystrokes help for edit_help.html (input line keys) - LP
+* corrected to make -nostatus command-line option override HTReadProgress - TD
+* updates to lynx-dev.html (Al Gilman).
+* modify NSL-fork support in HTTCP.c to use waitpid call to reap child
+ processes which may otherwise become orphaned. The new variable
+ "dns_patience" represents how many seconds we're willing to wait for DNS to
+ respond (should later make it configurable) - BL
+* modify PutTextInput and PutDefs macros in LYOptions.c and LYShowInfo.c to
+ avoid pre-ANSI compilers attempting to substitute macro parameters in
+ coincidental matches within quoted strings - BL
+ gcc -Wtraditional reports the first, but not the second, which is "n"
+ substituted into "\n" - TD
+* add an error-check for fg/bg values to lynx_chg_color function in case
+ lynx.cfg specifies color names not in Lynx's table - BL
+* modify IsOurFile function to accommodate links-to-links, so that users whose
+ home directory is reached by that type of path can save .lynxrc file
+ (reported by PW) - TD
+
+1998-10-04 (2.8.1pre.8)
+* modify HTTCP.c to copy soc_in from phost in HTParseInet, making Lynx/32 do
+ lookups again - WB
+* modify LYCurses.c to compile mouse-code with Borland C and PDCURSES 2.3 - WB
+* correct backward logic in CF_TERMIOS_AND_CURSES (reported by LE) - TD
+
+1998-10-04 (2.8.1pre.7)
+* add special-case CF_TERMIOS_AND_CURSES configure macro (fixes problem
+ reported by Philippe De Muyter) - TD
+* update/reorganize option_help.html - PW
+* restore newline position when return from the Print menu or follow a link
+ from History page (was broken for partial display mode only): LYPop() and
+ LYPop_num now reinitialize Newline_partial if it happens on getfile stage.
+ Also remove changes from 1998-06-11 (case LYK_DOWNLOAD) since this is now
+ protected by HText_new() which never starts. - LP
+* tweak suggested filename for download menu: now it we have URL
+ terminated with "/" (e.g., a directory or possibly root) do one more try -
+ remove terminating "/" - LP
+* download menu: do not show "Suggested file name" when "save to disk disabled"
+ (requested by HN) - LP
+* more tweaks on LYshow_kb_rate - LP
+* move fallback definitions for POSIX S_ISLNK, etc., to allow build with
+ VAX C (reported by Tony Bolton) - TD
+* add parentheses to eval-expression in CF_MAKE_INCLUDE configure test to
+ accommodate bash2 (Tadayoshi Okuma <tad@pht.co.jp>)
+
+1998-10-01 (2.8.1pre.6)
+* add EMX to special cases for SetOutputMode, to force stdout to O_BINARY mode
+ so that downloading binary files will not corrupt them (reported by Ilya
+ Zakharevich <ilya@math.ohio-state.edu>) - TD
+* correct missing "\n\" in change to LYrcFile.c for pre.4 (reported by David
+ Eaton) - TD
+* reorder HTCheckForInterrupt() so that partial display mode will work for
+ VMS (reported by LP) - TD
+* fix LYK_DOWNLOAD to restrict downloading remote links for local_host_only,
+ like it was done for mailto: links recently, see comments where in - LP
+* replace few statusline messages with ones from LYMessages.en.h -LP
+
+1998-09-30 (2.8.1pre.5)
+* force compile on VMS to use stdarg.h; it was ifdef'd for __STDC__ which
+ VAX C does not define, though it does support stdarg.h (reported by Tony
+ Bolton). Test-compile HTVMS_WaisUI.c on Linux to check... - TD
+* update url for tcplib in INSTALLATION - DK
+* fix HTDOS_name trace massage - LP
+* expand "~" in include-statements in lynx.cfg (reported by LP) - TD
+* remove some obsolete stuff from INSTALLATION - HN
+* DOSPATH fix: user input URL like c:/path/file.ext (begins with drive letter)
+ now resolved as local path and will not be passed to DNS search in any case
+ (was running URL guessing process for host "c:" if file.ext not found...)
+ fix LYFillLocalFileURL() - LP
+* fix HTUserMsg2 trace massage - LP
+* add user's guide documentation for COOKIE_ACCEPT_DOMAINS and
+ COOKIE_REJECT_DOMAINS - BJP
+* change default Unix cookie-file name to "~/.lynx_cookies" - BJP
+* customize incremental rendering (Eric Brun <erbrun@bellatlantic.net>):
+ - add -partial_thres[=NUMBER] option to set the number of lines
+ - add PARTIAL_THRES config variable in lynx.cfg to set the number of lines
+ - add partial_thres variable in .lynxrc to set the number of lines.
+ Selecting save to disk and hitting Accept Changes in options menu will save
+ this variable to the current value. Haven't looked into making a form
+ entry for this yet. With -partial_thres command line option, probably not
+ necessary.
+* fix some text in lynx.man and Lynx_user_guide.html. The man change includes
+ changes to "h" and "k" so they work whether or not vi keys are on - DK
+* workaround for inconsistency between slang ports to DOS and other platforms
+ by suppressing test of SLtt_Use_Ansi_Colors. This fixes a problem where
+ colors change in the slang DOS port when the forms_based option menu is
+ accepted - DK
+
+1998-09-28 (2.8.1pre.4)
+* tentative fix for HPUX sed problems (reported by jones.peter@uqam.ca) - TD
+* update lynx.man and lynx.hlp to reflect new command-line options - TD
+* minor documentation fix - LP
+* miscellaneous fixes for build on VMS (reported by Tony Bolton) - TD
+* tweak 'const' assignment for VMS (in LYReadCFG.c and LYPrint.c) - LP
+* clarify discussion of download in Lynx user's guide (Al Gilman).
+* trim trailing newline from lines read from cookie file so that Lynx does
+ not send embedded newlines in the cookie list - BJP
+
+1998-09-27 (2.8.1pre.3)
+* fix a place in cookie_add{accept,reject}list() where cookies would be deleted
+ from memory if a persistent cookie had the same domain as an entry in
+ COOKIE_{ACCEPT,REJECT}_DOMAINS - BJP
+* move Lynx's writing of persistent cookies to COOKIE_FILE from happening when
+ you enter the Cookie Jar page to quit time, before cleaning up temporary
+ files - BJP
+* Lynx_user_guide.html: add text about lynx.cfg - LP
+* forms-options: options names moved 2 columns to the right (is it good?) - LP
+* fix reading .lynxrc "character_set" (trim trailing spaces in fullname) - LP
+* fix ReadProgress message for LYshow_kb_rate (while <1024 bytes received
+ we showed byte-transfer rate even in KB mode), extra dot removed - LP
+* DOS text files: opening text mode switch now incorporated in LYNewTxtFile/
+ LYAppendToTxtFile and hope for the best - LP
+
+1998-09-25 (2.8.1pre.2)
+* fixed forms submission charset: was broken by me in dev26 (HText_SubmitForm()
+ in GridText.c) - LP
+* documentation updates for verbose images - LP
+* minor fix for trace message in TrimHightext() -LP
+* add compatibility with 2.8/2.7.2 lynx.cfg and (especially) .lynxrc - old
+ "character_set" parameter now acceptable - LP
+* add OUTGOING_MAIL_CHARSET symbol to lynx.cfg to make mail more recognizable
+ by remote recipient, it may be "US-ASCII" for 7 bit approximation as the
+ safest case or any other value. If blank, use display character set
+ (default, compatibility). Currently implemented only for "subject" in
+ "print-to-email" - LP
+* fix SGML.c so invalid characters are not dispalayed in hex UHHHH but just
+ omitted as already done for plain/text mode - LP
+* fix download' suggested file name (8bit) - LP
+* correct logic error in "Change Location" command, and allow "~" there in
+ addition to the existing "~/" prefix (reported by Ismael Cordeiro) - TD
+* ifdef'd out "don't replace '\n' with ' ' if Chinese or Japanese" from dev.23,
+ with symbol EXP_JAPANESE_SPACES, FIX_JAPANESE_SPACES based on discussion with
+ HN, LP - TD
+* correct missing '\' in generated sed-script for "make install-help" rule,
+ which changed a couple of "/html" substrings to ".html" (reported by BL) - TD
+* modify cfg_defs.sh script to handle empty token in config.cache, e.g., a line
+ such as "foo=${foo=}" (reported by Philip Chong <pchong@boopsie.ml.org>) - TD
+* modify so that lynx_cfg_infopage() and lynx_compile_opts() pages are not
+ invoked when Lynx is running -anonymous - TD
+
+1998-09-22 (2.8.1pre.1)
+* correct logic error in parse_restrictions() which caused infinite loop,
+ probably from changes in dev.8 (reported by HN) - TD
+* add SHOW_KB_RATE symbol to lynx.cfg to allow user to control whether
+ HTReadProgress should show KB/sec or bytes/sec - TD
+* modify HTReadProgress to allow user to display KB/sec or bytes/sec - BL
+* add/use new function LYstyles(), to force initialization of styles[] array
+ when it is used outside HTML.c; fixes a problem with Lynx not using styles
+ for files listed on the command line - TD
+* correct keymap strings for F1 and DO_KEY - TD
+* add keymap table entries for F1, to accommodate slang which appears to ignore
+ terminal description when keymaps are defined - TD
+
+1998-09-20 (2.8.1dev.29)
+* add checks/warnings for user agent string in forms-options menu - TD
+* change render_item to force a '/' before substituted path or directory
+ strings if (as in OS/2 EMX) absolute filenames do not normally begin with a
+ '/' -TD
+* modify HTnameOfFile_WWW() to interpret an empty acc_method as a local file,
+ allowing its use in permit_location(), making OS/2 EMX dired-mode change
+ permissions work - TD
+* make download and print menus a little more compact in intermediate/advanced
+ user modes - TD
+* correct filename shown in download menu - LP
+* change behavior of configure --enable-forms-options switch. By default, both
+ old and new options menu are available via a command-line toggle
+ "-forms_options" or lynx.cfg statement "FORMS_OPTIONS:TRUE/FALSE". Configure
+ --enable-forms-options now _disables_ old-style code, which is
+ ifdef'ed with "#ifndef EXP_FORMS_OPTIONS" - LP
+* add more pointer-checks in GridText.c so that "lynx LYNXDOWNLOAD://" does
+ not crash (reported by Wilson Cheung) - TD
+* add special case to handle NNTPSERVER environment variable, which had been
+ lowercased as part of LYReadCFG.c cleanup (reported by Wilson Cheung
+ <wcheung@netcom.com>) - TD
+* modify info-page to add link to new internal page showing the noncomment
+ lines from lynx.cfg - LP, TD
+* use function wwwName to reduce clutter - LP
+* create "lynx.cfg Information" page, comments skipped, "include" OK.
+ The link is available from '='InfoPage and 'O'ptions menu.
+ Since DJGPP/Win32 binary have no built-in absolute path for distributions
+ lynx.cfg those ports will look for a copy of lynx.cfg in lynx_help/
+ for most advanced info/comments (if you made http:// depository for lynx help
+ please care of it) - LP
+* tweak helpfilepath URL (for DOSPATH only) - LP
+* some cleanup of cp852, cp850, cp775 - LP
+
+1998-09-17 (2.8.1dev.28)
+* minor fix to make PRCS ProjectDate print in "dd mmm yyyy" form - TD
+1998-09-17 (2.8.1dev.27)
+* minor fixes for recent (dev24 and dev25) chartrans changes - LP
+* add LYNX_DATE definitions in userdefs.h; Info Page now shows the date of your
+ lynx along with version number and a link to the latest sources. - LP
+* use ECHO_CC symbol in install-help rule to control whether the sed commands
+ are echoed - TD
+* corrected install-help rule to avoid getting compress-suffix repeated in
+ the generated/updated files - TD
+* documentation nit for COLLAPSE_BR_TAGS (Michael Warner)
+* use getsockname_s rather than getsockname for djgpp (from patch by Gisle
+ Vanem) - DK
+* add .bz2 suffix to lynx.cfg and HTInit.c, for bzip2 utility - DK
+* modify store_cookie to suppress warning message for invalid domain if Lynx is
+ setup to accept all cookies - LV
+* modify/expand LYLocalFileToURL() function, getting rid of most places where
+ inline concatenation is used for "file://localhost/<filename>", as well
+ as eliminating a number of static buffers - TD
+* move fallback definitions for POSIX S_ISLNK, etc., out of NeXT ifdef's, to
+ make this compile on Apollo (reported by David Eaton) - TD
+* restructured pathname-tests in LYLocal.c, using common utility functions
+ ok_stat, ok_lstat, ok_file_or_dir to simplify freeing pointer allocated
+ by HTfullURL_toFile - TD
+* modify HTLocalName, making it a macro around a more flexible function
+ HTnameOfFile_WWW, to reuse logic for stripping off "file://localhost" and
+ "file:" prefixes, fixing some places where a spurious '/' would be left in
+ EMX local filenames (other macros: HTfullURL_toFile, HTpartURL_toFile) - TD
+* modify configure script macro CF_PATH_PROGS for OS/2 EMX, so that compiled-in
+ utility pathnames work - TD
+* use HTDOS.c module for OS/2 EMX, since it has similar device syntax - TD
+* correct logic for wrapping long lines, to not use the rightmost column of the
+ screen, fixes a problem with duplicated character (reported by LP) - TD
+* correct logic for dumping screen to file, so that blank lines are retained,
+ not counted in the logic for pruning soft-newlines which supports wrapped
+ lines - TD
+* add info and user messages to traces - TD
+
+1998-09-12 (2.8.1dev.26)
+* change behavior of NSL_FORK and related I/O (BL):
+ - Make URL guessing (www.huh.com? www.huh.org? www.huh.net?) interruptible.
+ - Make URL guessing from the command line interruptible.
+ - Use select() instead of FIONREAD. This makes it work on OSes where
+ previously it only *looked* like it was working.
+ - select() on stdin as well as the child pipe, when using [n]curses (not
+ SLANG). This allows interrupt to be processed instantly, without
+ up-to-1-second delay.
+ - While looping, 1 second at a time, bail out after "too many" (currently 50)
+ loops: just in case something weird happens, like select() returning some
+ unexpected error that we ignore.
+ - Make sure child processes are always killed and reaped.
+ - Close pipe ends as soon as possible.
+ - Now write the length down the pipe (using a known-to-the-program length of
+ sizeof(int)) first -- this both helps workaround old CMU TCP bugs and the
+ fact that select() doesn't let us get number of bytes ready, like FIONREAD
+ does.
+* change default for NO_ANONYMOUS_EMAIL to TRUE (patch by HN)
+* use url for "W3C HTML Validation Service" rather than "A Kinder, Gentler HTML
+ Validator" -TD
+* update url for HTML Quick Reference Guide (report by LE) - TD
+* modify verbose images to show ISMAPs and USEMAPs (patch by LE).
+* fix typos in AttrList.h, LYStrings.h (reported by LV & HN) - TD
+* Chartrans recovery and cleanup: by introducing an invariant
+ "current_char_set and UCLYhndl_for_unspec always valid charsets" we solve
+ possible problems with invalid/undeclared charsets. Use
+ 'safeUCGetLYhndl_byMIME()' for reading charset information from
+ lynx.cfg/userdefs.h/command line switches to recover possible typos by
+ fallback to ISO-8859-1; If UCLYhndl_for_unrec or UCLYhndl_HTFile_for_unspec
+ not set explicitly - now fallback to UCLYhndl_for_unspec (was before, but
+ not clear in certain places). Add comments to UCMap.h, add comments on
+ chartrans initialization in LYMain.c. UCAssume_localMIMEcharset and
+ UCAssume_unrecMIMEcharset now removed (UCLYhandl_* do all the stuff). - LP
+* LYCharSets.c: LYRawMode code simplified and comments added. It was realized
+ that UCAssume_MIMEcharset may differ from its handler as LYRawMode history.
+ Also: HTMLSetRawModeDefault() moved into HTMLUseCharacterSet() to reduce
+ clutter, declare HTMLSetCJKCharacterSet() as PRIVATE. - LP
+* more "big5" bugs fixed (in HTMIME.c and HTFile.c); function Set_HTCJK() added
+ to LYCharSets.c - LP
+* LYCharUtils.c: META charset code corrected against 2.7.2, obsolete code
+ removed - LP
+* partial mode now repaint the screen in one stage with a complete display
+ ('display_lines' received, fix in HTPartialDisplay()). Incremental rendering
+ of the first page may be annoying on slow connection (reported by Nelson
+ Henry Eric <nelsonhe@nara.kindai.ac.jp>) - LP
+* temp fix for HText_trimHightext side effect from partial mode by introducing
+ a flag in HText_beginInput(), so this side effect still only happens for long
+ documents with forms input mixed with normal href= link. - LP
+* print menu: fixed document URL near the top (was temp file name) - LP
+* forms-options menu: fixed screen size in Novice mode - LP
+* limit length of strings copied via tok_values[] in LYCookie.c - TD
+* clean up a few memory leaks in cookie_add_acceptlist() and
+ cookie_add_rejectlist() in LYCookie.c. These were leaking 4 bytes for each
+ entry in COOKIE_ACCEPT_DOMAINS - BJP
+* fix to LYLoadCookies() which was causing duplicate invalid cookies to be
+ loaded - BJP
+* split out install-doc rule in top-level makefile to install extra
+ documentation files in $(libdir)/lynx_doc (request by HN) - TD
+* improved algorithm to set 'secure_value', used in forms-options to circumvent
+ spoofing (based on comments from Mike Castle) - TD
+* integrate WB's mouse changes (see 1997-04-24) for page-up/down into the Unix
+ flavors of mouse support (e.g., ncurses and slang) - TD
+* use ncurses define_key to implement lynx-keymaps (see dev.10) - TD
+* modify slang keymap code to work with slang 0.99-38 - TD
+* replace several ifdef'd pathname constructions to use LYAddPathToHome() - TD
+* make keymaps file consistently named on Unix and VMS - TD
+* remove redundant "Lynx" from internal-page titles (suggested by LP) - TD
+* remove install-log makefile target, generate cfg_defs.h file directly from
+ lynx_cfg.h and config.cache, to compile-in the configuration-definitions
+ rather than rely on external file lynx_site.txt - TD
+
+1998-09-06 (2.8.1dev.25)
+* corrected compiled-in path for lynx_site.txt - TD
+* implement logic for exec-links in forms-options page - TD
+* add configure options --enable-exec-links and --enable-exec-scripts - TD
+* correct logic for show-color in forms-options page (reported by DK) - TD
+* implement logic to set $DISPLAY in forms-options page - TD
+* add/use functions LYsetXDisplay() and LYgetXDisplay() to reduce clutter - TD
+* retain help-link on internal pages only for those where the pages would be
+ pushed onto the history stack, and only in novice mode - TD
+* absorb LYSystem.h into LYUtils.h, adding LYSystem() and LYSysShell functions
+ to LYUtils.c to hide djgpp clutter - TD
+* limit strings passed to mailer in LYMail.c to 7-bit ASCII, converting other
+ characters to '?'. This guards against trash on the end of the mailing
+ address in a mailto link (from Duncan Simpson <dps@io.stargate.co.uk>).
+* add fallback definitions for <sys/stat.h> S_xxx macros to tcp.h (from report
+ by Francisco A Tomei Torres <fatomei@sandburg.unm.edu> that OpenStep 4.0
+ lacks definition for S_IWOTH) - TD
+* modify quote_pathname() so that for DJGPP it does not put single-quotes
+ around the result - DK
+* correct a missing assignment to turn bold off in split_line (GridText.c) - LE
+* Fixed: forms input in display_partial mode! Previously hightext was printed
+ at wrong positions while loading was in process (try -debug_partial to see
+ the bug). Fix made in HText_pageDisplay: we call HText_trimHightext() which
+ was the main part of HText_endAppend() before. Seems no more problems
+ reported from incremental rendering mode! - LP
+* set PARTIAL mode ON by default, unless it disabled in lynx.cfg or by
+ configure --disable-partial option - LP
+* restore temporary -debug_partial switch, broken in dev.23 - LP
+* made trace in HText_appendCharacter() a little more readable
+ for lynx special characters - LP
+* chartrans: human-readable character set names in Options Menu now changed
+ according to Netscape 4.x style - "language (MIMEname)", it looks more useful
+ and reduce chaos in people's heads. Documentation corrected
+ (option_help.html/Lynx_User_guide.html). Minor tip: "Central and Eastern
+ European" was truncated to "Eastern European" because of space limitation in
+ popup menu. (Changes in chrtrans/*.tbl, LYCharSets.c, also docs including
+ userdefs.h/lynx.cfg). Since names were changed, users on display other than
+ iso-8859-1 should go to options menu and resave .lynxrc (and probably correct
+ lynx.cfg - character_set now uses MIME notation in sync with other charset
+ settings, although complete name string is still acceptable for this
+ field) - LP
+* an attempt made to tweak the code replacing lynx internal 'main' charset '0'
+ (iso-8859-1 in fact) with its MIME name - LP
+* rename ifdef EXP_8BIT_TOUPPER in favor of lynx.cfg switch
+ FORCE_8BIT_TOUPPER - LP
+* remove a lot of "(char **)" casts from HTML.c which obscured some type
+ mismatches - TD
+* add/use functions LYIsHtmlSep, LYAddHtmlSep, LYTrimHtmlSep, LYIsPathSep,
+ LYAddPathSep, LYTrimPathSep to reduce clutter - TD
+* fix a bug, present at least since dev.17, where lynx can't download files if
+ it is started from one of the root directories of a disk drive, since it is
+ trying to write to "c:\\file.ext", rather than "c:\file.ext" - DK
+* correct a comment in userdefs.h; commercial Japanese sites are named with
+ co.jp, not com.jp (LV).
+* correct some debug messages in LYCookie.c - BJP
+* fix a missing </h1> in ShowInfo.c - SKY
+* modified '+'->' ' conversion to allow Unix commands to have '+' beginning
+ options - TD
+* sorted all option items (i.e., static variables, postoptions(),
+ gen_options()) according to the sections they are in - SKY
+* added '+'->' ' conversion for forms-options values - SKY
+* centered 'save to disk' and put a dash between 'accept' and 'reset' for
+ clarity - SKY
+* add "-cookie_file=" commandline option to specify cookie file - BJP
+* add "cookie_file=" option to .lynxrc - BJP
+* add "cookie_file:" option to lynx.cfg - BJP
+* change default cookie file to "Home_Dir()/cookies" (or sys$login:cookies
+ for VMS, which may or may not work, DOS also needs to be checked) - BJP
+* add cookies switch to options menu - LP
+* Security considerations and form-based options: items restricted in
+ gen_options() should be ALSO restricted under the same conditions in
+ postoptions() to prevent a limited access user to edit option's HTML code
+ manually and submit a restricted items. This may be not a good idea to have
+ two functions in sync but those functions are synchronized anyway. Please
+ read comments inside the functions if change something! - LP
+* add new functions BeginInternalPage and EndInternalPage to reduce clutter in
+ code that sets up internal pages (email from LP).
+* change version in makefile.in to 2-8-1 -DK
+* the code in GridText that adds control characters to the current line
+ does not test for buffer overflow. Normally Lynx gets away with this because
+ it will wrap the current line as soon as the line exceeds the display width,
+ but if you have a file with nothing but control characters with no
+ displayable text in-between (a few thousand hidden links will do), then Lynx
+ bombs. Modified to silently ignore excess control characters as well as add
+ a few extra bytes when allocating the line buffer to allow for a bunch of
+ control characters followed by a kanji or utf-8 sequence. (patch by Dick
+ Wesseling <ftu@fi.uu.nl>)
+* remove WWW/Library/Implementation/HTInit.c, which is not used, since
+ src/HTInit.c has this functionality - TD
+* change ID="<number>" in Lynx_users_guide.html to ID="<name>" to appease
+ weblint; tested with IE&NS - TD
+* Al's convention of '#<number>' into '#<id name>' in Lynx_users_guide.html is
+ included - SKY
+
+1998-08-31 (2.8.1dev.24)
+* re-correct DH's patch for COLLAPSE_BR_TAGS (reported by LV) - TD
+
+1998-08-29 (2.8.1dev.23)
+* make interim fix for gzip'd html files until we can resolve portability
+ issues raised by SKY's renaming - TD
+* implement LY_SOFT_NEWLINE, to mark places where wrapping is done in
+ HText_appendCharacter, to allow printing to join lines back together
+ (reported by LP) - TD
+* correct missing assignment in change to HText_appendCharacter, fix a core
+ dump - TD
+* removed SKY's change that attempted to skip help-links, since it causes a
+ core dump, e.g., when viewing source - TD
+* use LYCloseTempFP in forms-options code and LYPrint.c where file was opened
+ with LYOpenTemp, to fix a core dump - TD
+* All XYZ_TITLE defines of UIPs (User Interface Page) are collected in
+ LYMessages_en.h for multi language support - SKY
+* Head and H1 of each UIP is standardized; reduced to 1 line. In this line a
+ context sensitive Help anchor introduced which is skipped by default; i.e.,
+ 'd' will directly goto 'Save to Disk' not to the help anchor - SKY
+* Download and Print UIPs are divided into 'Standard' and 'Local additions'.
+ Current and Suggested Filenames are printed on the page which was hidden on
+ the status line or accessed only by '=' - SKY
+* Information page now has links to either development or lynx home pages
+ depending on LYNX_RELEASE define. Besides compile options can also be
+ accessed on this page: $helpdir/lynx_site.txt. A file derived from
+ 'config.cache'. Its corresponding makefile macro is 'install-log' - SKY
+* New Form-based options page is re-organized; logical sections are introduced
+ and sorted alphabetically (except for 'User Mode' - SKY
+* All links in the help files are marked, i.e., each
+ 'href="../_filename.html_#section"' is converted to
+ 'href="../@FILENAME@#section"'. This is useful if a help filename or
+ link has to be changed through out whole package - SKY
+* 'lynx_help/help_files.txt' is introduced which contains
+ FILENAME=_filename.html_ definitions. Format and details are given in the
+ file - SKY
+* All help files are renamed from '.html' -> '.html_' - SKY
+* For context sensitive help links in UIPs 'src/LYHelp.h' is created with all
+ the filenames marked like the help files. It will be included from
+ LYGlobal.h. In 'src/makefile.in' necessary changes are done to load the
+ filenames from 'lynx_help/help_files.txt' - SKY
+* To be able to compress help files '--enable-gzip-help' option is added in
+ configure script. In 'makefile' 'install-help:' is updated.
+ If COMPRESS_PROG and COMPRESS_EXT are *both* left empty (default) no
+ compression will be carried. For the moment compression is restricted only
+ to 'gzip'. Necessary updates are done in configure.in - SKY
+* documentation fixes for nsl-fork, print screen - PW
+* don't replace '\n' with ' ' if Chinese or Japanese - HN
+* use title information rather than suggested filename as a subject line when
+ printing a page to email - LP
+* add verbose_images to old-style options menu, and the .lynxrc - LE
+* add verbose_images and useragent to forms-based options menu - LP
+* disable download of "mailto:" links (reported by SKY (Sinan Kaan Yerli)
+ <sky@star.cpes.susx.ac.uk> ) - LP
+* Change HTUserMsg to HTInfoMsg for "ALREADY_AT_BEGIN" and "ALREADY_AT_END"
+ messages to make it less annoying - LP
+* reduce clutter in mainloop by inserting LYpop() in postoptions() - LP
+* makefile.dos: split long lines - LP
+* Fix bug with TAIPEI big5 charset in src/LYCharUtils.c
+ (this typo also found in lynx2.7.2: "big-5" instead of "big5"),
+ patch by Shou-Chuan Lai <chuan@cs.nthu.edu.tw> - LP
+* Add -debug_partial command line switch so we got MessageSecs dely
+ between incremental rendering stages if partial display mode is ON.
+ (MessageSecs available from lynx.cfg and set to 2 sec by default).
+ The problem in incremental rendering of forms input was reported by SKY
+ (Sinan Kaan Yerli) <sky@star.cpes.susx.ac.uk> ), still not fixed
+ but now we may enter form-based options menu in -debug_partial mode
+ and rerender the page with Cntrl-R to see what is happening in fact - LP
+* Serious bug fixed for DISP_PARTIAL: two asynchronous processes synchronized.
+ HTDisplayPartial() synchronized by flag against HText_new() which create
+ the new HTMainText object. Otherwise HTDisplayPartial() sometimes was
+ matching old HTMainText (with its own line counter) and repaint previous doc,
+ not a new one. TRACE log now got a message from HText_pageDisplay - LP
+* fixed last chartrans changes, lines such as
+ #0x99 #NOTDEFINED
+ should not be commented with leading comment symbol because they are ignored
+ by makeuctbl in fact - LP
+* modify DH's patch for COLLAPSE_BR_TAGS to only modify the nonstandard case,
+ thereby making that more restrictive, and restoring standard behavior
+ (reported by HN) - TD
+
+1998-08-21 (2.8.1dev.22)
+* correct test for -std1 compiler option on Digital Unix (reported by Michael
+ Warner) - TD
+* modify treatment of COLLAPSE_BR_TAGS, so that if it is set TRUE, two or more
+ concurrent BRs will be collapsed into a single blank line. Note that the
+ valid way to insert extra blank lines in HTML is via a PRE block with only
+ newlines in the block (David Henderson <davidh@psiphi.org>)
+* clarification in userdefs.h - HN
+* MS Windows codepages updated for EURO SIGN (0x20AC), from ftp.unicode.org -LP
+* minor fix for DISP_PARTIAL, disable scrolling when HTTP request already sent
+ but the new document not displayed on the screen yet - LP
+* ifdef DOS/WINDOWS to open lynx.trace in text mode - LP
+* rearrange text in lynx.cfg concerning character_set - LP
+* correct miscellaneous typos - LP
+* Fixed: Verbose images now work with [IMAGE]-Submit. Also, fixed the core
+ dump when clickable_images is on. The problem was an oversight in
+ MakeNewTitle() - LE
+* reviewed the INSTALLATION file as it relates to DOS and updated it for the
+ newly released version of PDCurses 2.3. Added the HAVE_GETBKGD define to
+ makefile.dos, fixes some of the unusual background color handling that was
+ present in the PDCurses DOS port - DK
+* correct ifdef: LYOptions.c fails to build with -DEXP_FORMS_OPTIONS but
+ _without_ -DDIRED_SUPPORT (e.g., djgpp) - LP
+* redesigned cookie_add_{accept,reject}list in LYCookie.c -- they work now -BJP
+* added COOKIE_{ACCEPT,REJECT}_DOMAINS in .lynxrc handling to LYrcFile.c - BJP
+* slight spacing fix in lynx.cfg - BJP
+* added blurb in lynx.cfg about COOKIE_{ACCEPT,REJECT}_DOMAINS - BJP
+* -accept_all_cookies on the commandline works as a toggle now (against
+ lynx.cfg value -- NOT against .lynxrc value) - BJP
+* change HTAlert for bad partial reference to an HTUserMsg to make it less
+ annoying (request by Philip Webb, Jason F McBrayer)
+
+1998-08-15 (2.8.1dev.21)
+* correct pathname for help file in forms-options screen - TD
+* reduce clutter in LYOptions.c with SELECTED, DISABLED, NOTEMPTY macros,
+ PutOptValues, GetOptValues functions - TD
+* modified LYOptions to include MBM support from form-based options,
+ by making a link href="LYNXOPTIONS://MBM_MENU" like it was in LYPrint.c and
+ calling edit_bookmarks() from postoptions() - LP
+* add/use HTUserMsg to encapsulate most of the important messages - TD
+* add/use HTInfoMsg to encapsulate most of the informational messages - TD
+* make most of the alert messages use HTAlert, for consistency - TD
+* exclude forms-options pages from Visited Links page - LP
+* The current keymapping for the DOS Slang ports maps the keys directly to lynx
+ actions via keymap.c. There are several places in the code that test for
+ arrow keys, page up or down, home and end for special handling that depend on
+ the lynx definition of the keys. Hence, the keys in the DOS Slang ports were
+ failing the tests and not working as expected. The following patch now maps
+ these special keys. They can no longer be mapped individually via the KEYMAP
+ mechanism in lynx.cfg. Arrows should now work in GOTO fields. Tested the
+ patch against the binaries maade by makefile.dos, makefile.dsl, and
+ makefile.wsl - DK
+* The wsl port seems to be working well with DISP_PARTIAL, make this the
+ default - DK
+* correct spelling in lynx.cfg - DK
+* modify HText_appendCharacter to wrap long lines when displaying HTML document
+ source - TD
+* add configure option --enable-cgi-links - TD
+* clarify discussion of no_proxy in lynx.cfg (Al Gilman).
+* Multilingual bookmarks: now we store characters >127 in bookmark titles with
+ a more consistent and independent way, by keeping in unicode as &#UUUU
+ (NCR=numeric character reference). The idea belongs to Klaus Weide & Andrey
+ Chernov (long ago). It may be useful if we need switching display charset
+ frequently. This is the case when you use lynx on different platforms, e.g.
+ on UNIX and from remote PC, but want to keep common bookmarks file valid.
+ Compatibility: NCR as part of I18N and HTML4.0 specifications supported
+ starting with Lynx 2.7.2, Netscape 4.0 and MSIE 4.0. New option to lynx.cfg
+ added: NCR_IN_BOOKMARKS which is FALSE by default. - LP
+* Tweak "print options menu" to exclude choices which are not available under
+ the certain conditions (print to the screen and lpansi on DOS/WINDOWS, print
+ to e-mail for local_host_only). - LP
+* Forms options menu: add a link on option_help.html; synchronize
+ option_help.html against Lynx_User_guide.html and lynx.cfg. Rename label
+ "raw 8-bit or CJK Mode" with "CJK Mode" for CJK people and "raw 8-bit" for
+ others. Cleanup postoptions() by introducing flags - LP
+* Force HTuncache_current_document if gen_options() invoked. This is a
+ dirty fix until we uncache previous document only when necessary. - LP
+* Add time/date in addition to X-URL and BASE (PrependBaseToSource), (request
+ by Hans-Joachim Gurt <gurt@nacamar.net>) - LP
+* Turn partial_display off if we are not interactive (reported by Ari Moisio
+ <armoi@sci.fi>) - LP
+* more fixes/refinements for auto-configuring socks5 on AIX (report by Brian
+ Hauber) - TD
+
+1998-08-06 (2.8.1dev.20)
+* rename eat_all_cookies to accept_all_cookies everywhere - BJP
+* added ACCEPT_ALL_COOKIES lines to the dist lynx.cfg with the appropriate
+ description - BJP
+* added COOKIE_ACCEPT_DOMAINS and COOKIE_REJECT_DOMAINS to lynx.cfg. These are
+ comma delimited lists of the domains to handle - BJP
+* added cookie_add_acceptlist and cookie_add_rejectlist to LYCookie.c, which
+ are passed the list of domains from lynx.cfg and add them to the global
+ cookie list. These may be subject to change, as I might not be handling the
+ LYstrsep() right -- it works with dev19's LYstrsep(), but hasn't been tested
+ with Bela's... - BJP
+* added a big ugly ifdef'd out section to LYrcFile.c with what I have so far on
+ the .lynxrc handling of COOKIE_{ACCEPT,REJECT}_DOMAINS. Don't use it. Makes
+ nasty segfaults - BJP (Brian J Pardy)
+* fix a bug where the DJGPP_KEYHANDLER version doesn't allow movement by arrow
+ keys within a text area. Undo previous patch to LYGetFile.c, with LYgetch
+ now changed where it is defined in LYStrings.c, rather than at each place
+ where it is used. The patch in LYStrings.c regarding Windows should fix the
+ problem with keymapping that occurred when we got rid of RAWDOSKEYHACK - DK
+* turn on DISP_PARTIAL in makefile.dos - DK
+* correct typo in LYOptions.c - BL
+* corrected logic of LYstrsep - BL
+* Few minor typos and forgotten notes in man/hlp/cfg files; also quote Bela's
+ note on lynx.cfg INCLUDE facility - LP
+* correct typos in makefile.wsl, makefile.dsl - LP
+* correct typos, fix character set problems in recent changes of
+ LYOptions.c - LP
+* move include for socks.h past tcp.h, to allow for redefinition of some
+ symbols on AIX (report by Brian Hauber) - TD
+* adjust headers so that each can be compiled separately, eliminating order
+ dependencies - TD
+* include tcp.h always from within HTUtils.h, to enforce ordering of headers
+ needed for socks5 definitions - TD
+* use S_ISREG, S_ISDIR macros to reduce clutter - TD
+* make test for OpenHiddenFile to overwrite user's file more stringent by
+ ensuring that the given pathname is not a link from a world-writable
+ directory (reported by BL, with suggested patch) - TD
+* add/use LYPathLeaf() function to reduce clutter of pathname-leaf parsing - TD
+* eliminate redundant definition of 'FREE() - TD
+* ifdef'd LYOptions.c to reduce unneeded code wrt --enable-forms-options - TD
+* check in OpenHiddenFile to ensure that we overwrite only regular files,
+ since we also force the file's permissions to 0600 - TD
+
+1998-07-31 (2.8.1dev.19)
+* modify OpenHiddenFile so that it can overwrite files owned by the real
+ user if the O_EXCL open fails because the file already exists - TD
+* add experimental forms-based options screen (Mike Castle):
+ This is ifdef'd with EXP_FORMS_OPTIONS and configured with
+ --enable-forms-options.
+* add option -eat_all_cookies and corresponding config variable
+ EAT_ALL_COOKIES - BJP (Brian J Pardy <posterkid@psnw.com>)
+* correct spurious 'Content' string versus newline after X-URL in LYMail.c
+ (Bela Lubkin, LV).
+* updated versions of config.guess and config.sub based on automake 1.3 - TD
+* updated experimental persistent-cookie support based on RP's patch: Replaced
+ the call to strsep with a home-rolled one for those people who don't have it.
+ (Reported by Bela Lubkin, Mon, 27 Jul 1998 16:51:14 -0700 on the mailing
+ list.) Bela's modification to make some character arrays static is also
+ included -TD
+* nits/spelling in LYPrint.c, LYUtils.c (reported by Mike Castle) -TD
+* changed LYGetFile.c to build lynx2.8.1dev.18 with SLANG and the
+ DJGPP_KEYHANDLER for DOS - DK
+* fix a couple of places where the return-value of calloc was not checked
+ (reported by Mike Castle <dalgoda@ix.netcom.com>) - TD
+* correct typo in command-line parsing of -lss option (reported by Chris
+ Kottaridis <chrisk@BSDI.COM>) -TD
+* define _AIX if needed for socks5 (request by Brian Hauber) - TD
+* improved configure test for getgroups array type - TD
+
+1998-07-24 (2.8.1dev.18)
+* improved test for socks5, to account for special cases on AIX (reported by
+ Brian Hauber) - TD
+* several changes to reduce the number of gcc cast-qual warnings, by adding
+ CONST, removing casts - TD
+* add configure option --enable-syslog to enable system logging of requested
+ URL's - TD
+* add RP's experimental persistent-cookie support, and configure option
+ --enable-persistent-cookies, ifdef'd with EXP_PERSISTENT_COOKIES - TD
+* removed references to DOSRAWKEYHACK, which is no longer used. Modified the
+ dos makefile for libwww and makefile.dsl to default to using display_partial.
+ Modified INSTALLATION to reflect the successful use of slang with the dos
+ port and the now confusing alternatives when compiling the dos port, along
+ with some other updates - DK
+* modify lynx_enable_mouse() for pdcurses configuration so that mouse support
+ is disabled unless -use_mouse is specified. This is ifdef'd with
+ __BORLANDC__ for the time being (WB).
+* resync build-slang.com, against build.com - TD
+* add $(MMSQUALIFIERS) to top-level descrip.mms, e.g., to use options such as
+ /FROM, /IGNORE, /NOACTION, etc., and $(INCLUDES) definitions to lower-level
+ descrip.mms files. Improve error-recovery in build.com (patches by Liam
+ Davis <ld@stian.demon.co.uk>)
+* use memset to clear soc_in fields before doing a connect, needed for BSD/OS
+ (patch by Jeffrey C Honig <jch@bsdi.com>).
+* remove spurious sprintf params when using FIXED_RECORD_COMMAND_MASK which has
+ only one parameter, change VMSsignal from void* to void (report by Mike Xun
+ Ma <mike@mira.concordia.ca> ) - TD
+* use open(O_CREAT|O_EXCL) to open new hidden files - TD
+* eliminate_*putenv_cmd variables used by LYReadCFG.c as placeholders for
+ putenv calls - TD
+* disable include of <sys/filio.h> for VMS, from report by Chris Doran) - TD
+* fixes for VMS: mismatched curly brace, etc., from CTRACE and buffer-overflow
+ changes (reported by chris.doran@gblis.mail.abb.com) - TD
+* correct a loop in HTML_start_element that strips 7 leading characters from
+ an href, fixes a core-dump in traversing ".." to "/" - TD
+* use new macro SetOutputMode to reduce some clutter - TD
+* modify interface of LYCachedTemp so fileCache member is reset to null, fixes
+ bug in my recent cleanup of temp-files, which caused a core-dump - TD
+* add kb/sec rate to HTReadProgress message - TD
+* modify computation in HTReadProgress to interpolate rate - LP
+* One more fix for DISP_PARTIAL: to avoid blinking while reloading document
+ with Newline_partial > 1 (say, we press '*' and noproxy) we repaint the page
+ only when Newline_partial <= HText_getNumOfLines() - LP
+* add "-verbose" command-line switch - LP
+* DOS fix: open stdout in TEXT mode for -help and startup error message - LP
+* correct use of $mapname variable in CF_ALT_CHAR_SET (Tomas Vanhala)
+
+1998-06-25 (2.8.1dev.17)
+* add configure option --with-socks5 (request by Brian Hauber
+ <bhauber@frenzy.com>) - TD
+* define symbols HAVE_CURSESX_H, HAVE_JCURSES_H (report by Georg Schwarz
+ <schwarz@physik.tu-berlin.de>) - TD
+* modify logic that reports progress of download to update screen no more than
+ once per second, fix an overrun problem (reported by Jacob Poon
+ <a324poon@cdf.toronto.edu>) - TD
+
+1998-06-11 (2.8.1dev.16)
+* modify configure script to check for special compiler options which are
+ assumed for particular platforms (suggested by BL) - TD
+* modify display_page in GridText.c so that TRACE does not cause a repaint,
+ since that causes colors to be incorrectly rendered when tracing - TD
+* fix a few of the signed/unsigned mismatch warnings in GridText.c - TD
+* correct pathname in LYOpenScratch call for bookmarks (reported by DK) - TD
+* DISP_PARTIAL: fix initialization of newdoc.line (case LYK_DOWNLOAD,
+ mainloop) to correct display while 'd'ownloading files (it was initialized
+ _after_ the download completed and was good enough without display_partial
+ mode). - LP
+* correct some ifdef's for DISP_PARTIAL - LP
+
+1998-06-04 (2.8.1dev.14)
+* minor formatting fixes and documentation for upload screen - LP
+* remove config.cache at beginning of configure script - TD
+* eliminate cast for GetChar in LYStrings.c (from bug report by Michael Warner,
+ analysis by BL) - TD
+* shorten logs from WWW/* by disabling echo of compiler options as in src/* -TD
+* add configure test for types pid_t and uid_t - TD
+* add configure test for array type used in getgroups call, to distinguish
+ between BSD and POSIX variations which use different sizes - TD
+* modify configure script to compile DISP_PARTIAL code by default - TD
+* fix compiler warnings dealing with unreached statements - TD
+* change 'keymap[] array to unsigned char, move logic that relies on its size
+ into LYKeymap.c - TD
+* make LYOpenScratch() work properly for 8.3 names (reported by DK) - TD
+* DISP_PARTIAL: introduce separate variables Newline_partial and
+ NumOfLines_partial, initialize them in mainloop and synchronize with Newline
+ later when the reload completes (case NORMAL). To reduce the CPU usage while
+ downloading, call HText_pageDisplay only if NumOfLines_partial is in the
+ current display page or any Scroll key pressed by the user. We disable
+ partial_display if requested URL have #fragment, otherwise user will see the
+ top page first (yes, s/he will be moved to #fragment when the download
+ completed, but only if no scroll keys were pressed before!). Processing of
+ "END" key changed from MAXINT to real number of lines in the document
+ (important for display_partial mode) - LP
+* correct problem that caused DGJPP version built with slang 1.2.2 to lose its
+ socket whenever the rendering of a http URL is interrupted with "z". This is
+ in HTCheckForInterrupt in LYUtils.c (reported by John Lewis) - DK
+* add files pdcurses.key, slang.key, djgpp.key to document the keybindings
+ used for DJGPP version - DK
+* allow mapping of ALT and Function keys with the DOS port for both the
+ PDCurses version and the SLANG version with the DJGPP keyhandler. The
+ extended keys to be mapped have to be specified numerically according to the
+ definitions in curses.h (for PDCurses) or in keys.h (for SLANG with DJGPP
+ keyhandler). DJGPP maps keys up to 0x293, while PDCurses maps keys up to
+ 0x1c0 - DK
+* don't try to use -std1 option for gcc on Digital Unix (reported by Michael
+ Warner <warner@wsu.edu>) - TD
+
+1998-05-23 (2.8.1dev.13)
+* use new function LYLocalFileToUrl to cleanup some pathname references - TD
+* eliminate 'tempname()' function, using LYNewTxtFile, etc., with new functions
+ LYOpenTemp, LYCloseTemp, etc., so that temporary files are opened with
+ appropriate permissions - TD
+* correct use of cache variable in CF_ALT_CHAR_SET (reported by BL) - TD
+* spell out the logic in HTPlain.c against 2.7.2: there was a certain problem
+ with chartrans in text/plain mode (LYRawMode was wrongly interfering,
+ problem reported by Jacob Poon & FM). - LP
+* modify logic for zero-width spaces in conv_uni_to_pc to exclude 0x200a - LP
+* supply missing "break", which was forcing raw utf-8 output in URLs (NOT hex
+ escaped) - LP
+
+1998-05-14 (2.8.1dev.12)
+* remove unneeded definition used in testing dev.11 from config.hin) - TD
+1998-05-14 (2.8.1dev.11)
+* fixes for function-keys with slang configuration on DOS (patch by DK).
+* correct missing '&' in command-line options entry for syslog (reported by
+ HN) - TD
+* correct initial value for NoColorvideo with PDCurses, from my error in
+ 1998-05-10 integration (reported by DK) - TD
+
+1998-05-10 (2.8.1dev.10)
+* eliminate assignment to stderr for trace-file by making tfp a function - TD
+* added keymaps/keysym patch (it really should be integrated with the normal
+ lynx.cfg file (John E Davis).
+* tweak chartrans, "Convert the octet to Unicode": incoming symbols >127 but <
+ LYlowest_eightbit[IN-charset] now ignored, previously displayed as UFFFD.
+ (SGML.c, HTPlain.c, LYCharUtils.c) - LP
+* removed conflicting/unused declaration of 'bzero()' from tcp.h (from report
+ by Ashraf Zorkani <zorkani@aucegypt.edu>) - TD
+* modify the set/unset/toggle options to allow "on" and "off" values also - TD
+* apply the "partial display" patch, modified from
+ http://www.flora.org/lynx-dev/html/month0398/msg00993.html
+ The behavior is controlled by a compile-time option (DISP_PARTIAL), by a
+ command-line argument (-partial), and by a lynx.cfg option (PARTIAL). - BL
+* extend command-line option processing of set/unset/toggle options
+ -toggle- (set that toggle to FALSE)
+ -toggle+ (set that toggle to TRUE)
+ e.g.,
+ lynx -show_cursor+ -case-
+ or with explicit 1/0 values, e.g.,
+ -toggle=0 (set that toggle to FALSE)
+ -toggle=1 (set that toggle to TRUE)
+ NOTE: this allows you to change a few flags that would previously have been
+ controlled by lynx.cfg, and are security-related, such as -locexec or
+ -telnet. I believe there is no issue, because if the user can control the
+ command line to Lynx, he could have run `lynx -cfg my_cfg_file` and
+ circumvented those settings anyway. - BL
+* fix for buffer-overrun in LYMail.c when processing a mailto:very-long-address
+ URL - BL
+* correct, for OS/2 EMX, a place in LYConvertToURL() which must not use
+ HTDOS_wwwName() (patch by Jason F McBrayer <jmcbray@mailhost.tcs.tulane.edu>)
+* similar changes to LYCurses.c, LYMain.c, LYStrings.c, add src/makefile.wsl,
+ for building DOS version with slang - Bill Schiavo
+* modify LYCurses.c, LYMain.c, LYStrings.c, add src/makefile.dsl, for building
+ DOS version with slang - DK
+* fix to improve reloading if user changed assume_charset in options menu
+ using ^A, which sometimes did not work - LP
+* add several chartrans-related files to test/ directory: spaces.html,
+ c1.html, raw8bit.html - LP
+* fixes to compile on SunOS with K&R compiler - TD
+
+1998-05-03 (2.8.1dev.9)
+* correct missing counter increment in tempname(), from cleanup - TD
+
+1998-05-02 (2.8.1dev.8)
+* Fix for CGI-related URLs processing (syntax: ?x=1&yz=2). To avoid interfere
+ with SGML we restrict '=' as terminator for a named entity, this only applied
+ for HREF= attribute translation (LYCharUtils.c). (reported by Alex Matulich
+ alex@unicorn.us.com & FM). - LP
+* restore information in the INSTALLATION file for the DOS port on patching
+ tcplib. Also, clarifies the location of nullpkt. It also clarifies
+ that the PDCurses beta has incorporated some of the patches we made for
+ the lynx DOS port - DK
+* modify logic that updates bookmark file after removing a link to use copy
+ rather than rename, to solve file-ownership problems (patch by Paul
+ Gilmartin, though I kept the permissions check) - TD
+* reduce a little of the clutter in tempname() with fmt_tempname, and
+ bad_tempname functions. Though this doesn't address the security problems it
+ does fix the problem with signed getpid values. - TD
+* simplify LYUtils.c with compare_type() function - TD
+* add/use string functions LYLowerCase, LYUpperCase, LYRemoveBlanks (replaces
+ collapse_spaces), LYTrimLeading, LYTrimTrailing (incidentally fixes core-dump
+ in LYCookie.c) - TD
+* rewrite read_cfg function to make it more table-driven (reworked from a
+ patch by John E Davis) - TD
+* rewrite parse_arg function to make it more table-driven (reworked from a
+ patch by John E Davis) - TD
+* omit -Olimit compiler option on Digital UNIX 4.0 (patch by Tomas Vanhala).
+* modify configure test for acs_map[] array to work on Digital UNIX 4.0
+ (reported by Jim Spath and Tomas Vanhala <vanhala@ling.helsinki.fi>). - TD
+
+1998-04-23 (2.8.1dev.7)
+* fix core-dump when pressing '.' on a page with no links (patch by
+ Jan Hlavacek <lahvak@math.ohio-state.edu>).
+* initial changes to use macros CTRACE and tfp to replace explicit use of
+ stderr for the trace log. Remaining work is required for some complex
+ expressions, switching file pointers and for perror-substitute - TD
+* ifdef's for OS/2 EMX, mostly pathname tweaks (patch by Jason F McBrayer
+ <jmcbray@mailhost.tcs.tulane.edu>).
+
+1998-04-18 (2.8.1dev.6)
+* correct misplaced ifdef in LYMail.c, which caused Cc to not work (patch
+ by LE).
+* convert \x escapes to octal form (reported by Claude Soma) - TD
+* modify configure script to check for cursesX before curses library, for
+ ultrix 4.3 (reported by Claude Soma <soma_c@decus.fr>) - TD
+* incorporate lpansi into LYPrint.c (patch by HN).
+* modify top-level makefile to use INSTALL_PROGRAM and INSTALL_DATA
+ consistently, rather than installbin and installdoc (reported by
+ <karl@deas.harvard.edu>). - TD
+* modify treatment of -auth and -pauth options to allow setting a blank
+ password, e.g., -pauth=user: specifies a blank password, and -pauth=user
+ leaves the password unspecified (patch by Frederick P Herrmann
+ <fph@tiac.net>).
+* Change documentation to indicate "Lynx.trace" file rather than
+ "lynx.trace" -TD
+* Change default for USE_TRACE_LOG in userdefs.h to TRUE, to make behavior
+ consistent with 2.7.2 - TD
+* Rename no_color_video symbol in LYCurses.c to NoColorVideo, to avoid conflict
+ with term.h, which is included by curses.h on some systems (reported by Paul
+ Gilmartin) - TD
+* modify include-path in djgpp makefile to avoid conflicting tcp.h - DK
+* Add -tagsoup option, for initializing parser directly to TagSoup - TD
+* Modify HTML.c, ifdef'ing some of the logic involved in unstacking tags. It
+ appears to be not completely necessary: makes Lynx a little faster, at the
+ cost of making the tagsoup parser do the wrong thing. Some entries in the
+ tagsoup DTD table versus the sortasgml table have SGML_EMPTY versus
+ SGML_MIXED. This information is used to control unstacking (in the
+ color-style configuration as well). There is still a problem evidenced
+ when toggling between the two parsers in the Lynx main help page, but that
+ appears to be missing logic in 2.8's version of the tagsoup parser. - TD
+* Modify HTTCP.c to check the length returned from gethostbyname(), which
+ returns 0 on error on a SunOS 4 system (reported by Paul Gilmartin) - TD
+
+1998-03-29 (2.8.1dev.5)
+* Fixed my typo for FNAMES_8_3 define - WB
+* Added SYSTEM_MAIL and SYSTEM_MAIL_FLAGS defines for DOSPATH target - WB
+* Better kluge to set terminal type for DOSPATH - WB
+* Restored DOSPATH kludge to get to root of directory - WB
+* Added a bit of missing _WINDOWS_NSL ifdef'ing - WB
+* Minor DOS dirent mod to work with Tom's rearrangements - WB
+* Changed #if XYZ to #ifdef XYZ in tcp.h for dumb (?) compilers - WB
+
+1998-03-25 (2.8.1dev.4)
+* restore original string in LYUtils.c when user enters a badly formed or
+ nonexistent URL when prompted for Goto/history list. Otherwise Lynx would
+ always attempt to load a local file if the original string omits scheme://
+ prefix but guessing fails (patch by Randall <hezekiah@may98.rahul.net>).
+* tweak formatting of .message in HTFTP.c so it has leading/trailing blank
+ lines (patch by Ismael Cordeiro <ismael@CAM.ORG>)
+* retested 'make depend' rule (for LV (Larry Virden)) - TD
+* eliminate (except for absolute pathnames, as in VMS) quoted includes - TD
+* remove WWW/Library/Implementation/HTAlert.[ch], since they conflict with
+ src/HTAlert.[ch], and are not used - TD
+* replace the [LINK], [INLINE] and [IMAGE] comments (for images without ALT)
+ with filenames of these images. This feature can be enabled or disabled by
+ setting VERBOSE_IMAGES in lynx.cfg and/or userdefs.h (patches by
+ Helen Sommer <helen@voland.cc.huji.ac.il>,
+ Bill Schiavo <wschiavo@concentric.net>)
+* consistently use ${cf_cv_ncurses_header-curses.h} rather than
+ $cf_cv_ncurses_header in configure script, as noted by JES - TD
+* tweak include of HTML.h in HTFile.h to fix compile problem on VMS (we really
+ should not use quote-style includes) - TD
+* fixes to LYStyle.c to make color-style code work on Digital Unix 4.0 - TD
+
+1998-03-20 (2.8.1dev.3)
+* Added death for Win/DOS clients that don't have a TMP space defined - WB
+* Added _WINDOWS_NSL to provide interruptible lookups in Win32 per a
+ patch from afn06760@afn.org. (modified hopefully for borland AND Cygwin and
+ hard defined in tcp.h). I had to recompile everything in multithread
+ mode for borland, including my zlib library - WB
+* Added _WINDOWS as a target for FNAMES_8_3 in userdefs.h to allow for 16
+ bit helper apps that can't handle LFN's. (report by afn06760@afn.org) - WB
+
+1998-03-18 (2.8.1dev.1)
+* correct an ifdef that caused inconsistent pathname separators on Windows
+ (reported by afn) -DK
+* correct a missing AC_MSG_RESULT in configure.in (also MM) - TD
+* guard against illegal (e.g., zero) value for DEFAULT_CACHE_SIZE, when it is
+ read from lynx.cfg (reported by Martin Mokrejs
+ <mmokrejs@prfdec.natur.cuni.cz>) - TD
+* implement simple 'include' facility for lynx.cfg - BL
+* change TagClass and TagFlags to #define's to accommodate older compilers
+ which do not accept initialization of enums from data that do not correspond
+ to the declared values, e.g., CLIX (which complains) and Apollo (which fails
+ to compile, reported by Dave Eaton). - TD
+* remove some obsolete definitions from userdefs.h, tcp.h and HTUtils.h - TD
+* remove obsolete files from WWW/Library - TD
+
+1998-03-12
+* UPPER8: a separate function HTMLSetDisplayCharsetMatchLocale() introduced
+ (LYCharSets.c). Locale mismatch assumed for DOS/WINDOWS display charsets. -LP
diff --git a/COPYHEADER b/COPYHEADER
new file mode 100644
index 0000000..d77dbe4
--- /dev/null
+++ b/COPYHEADER
@@ -0,0 +1,84 @@
+Copyright 1997-2022,2023 Thomas E. Dickey
+
+This copyright notice must be included in all copies or substantial
+portions of Lynx. It outlines rights and restrictions for Lynx which
+override the guidelines given in the COPYING file.
+
+Most of the content of the Lynx release (and corresponding copyright) is
+the work of developers on the lynx-dev mailing list, who have agreed to
+distribute their work under the terms and conditions of the GNU General
+Public License (Version 2). Note that the License text after the terms
+and conditions is advisory in nature, and contains neither terms nor
+conditions. You may choose to follow that advice.
+
+The copyright owners and developers for Lynx grant their express
+permission for using any version of these common libraries (which are
+known to have problematic licensing issues) with any operating system or
+platform, regardless of the manner in which the libraries are
+connected to the Lynx program:
+
+ GNUTLS
+
+ libbsd http://libbsd.freedesktop.org/releases/
+
+ libidn
+
+ OpenSSL http://www.openssl.org
+
+Additionally, the developers understand that these additional libraries
+have no licensing issues. Permission is in any case granted to use Lynx
+without restriction for these as well:
+
+ libbz2 http://www.bzip.org/
+
+ libiconv
+
+ libutf8 http://www.haible.de/bruno/packages-libutf8.html
+
+ nss_compat_ossl http://fedoraproject.org/wiki/Nss_compat_ossl
+
+ zlib http://www.gzip.org/zlib/
+
+The list given is by no means exhaustive and may not be interpreted to
+limit the set of libraries with which Lynx can be used.
+
+The granted right to "use" (besides the obvious ability to run the
+program as a user) covers all development activities such as of building,
+modifying, distributing modified versions.
+
+Any licensing questions should be directed to the mailing list:
+
+ lynx-dev@nongnu.org
+
+or to the developer/maintainer (Thomas E. Dickey):
+
+ dickey@invisible-island.net
+
+------------------------------------------------------------------------------
+For reference, below is the original copyright notice for Lynx (2.4.2).
+------------------------------------------------------------------------------
+/* Copyright (C) 1995 University of Kansas.
+
+ This file is part of Lynx, a text-based WWW browser.
+
+ Lynx is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License, version 2, as
+ published by the Free Software Foundation.
+
+ Lynx is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
+ License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Lynx; see the file COPYING. If not, write to the Free
+ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ 02111-1307, USA.
+
+ Any licensing or usage questions should be directed to Michael
+ Grobe <grobe@ukans.edu>.
+*/
+------------------------------------------------------------------------------
+-- vile:txtmode fc=72 noti
+-- $LynxId: COPYHEADER,v 1.21 2023/01/02 23:56:18 tom Exp $
+------------------------------------------------------------------------------
diff --git a/COPYHEADER.asc b/COPYHEADER.asc
new file mode 100644
index 0000000..1cee56b
--- /dev/null
+++ b/COPYHEADER.asc
@@ -0,0 +1,15 @@
+-----BEGIN PGP SIGNATURE-----
+Comment: See https://invisible-island.net/public/public.html for info
+
+iQGzBAABCgAdFiEEGYgtkt2kxADCLA1WzCr0RyFnvgMFAmOzb54ACgkQzCr0RyFn
+vgMXrgv/WJiCe9QQefBmP84QO3UL5gDT/I+uxr2DaJNNnO8LUBccWNJAy+s1yOPu
+OJkNl6fpY4JdZO7gWW1c0NxdbxrumLDmIMvODhw/Pj5rU2u/QfuL1yqzyi+WRu1X
+wxxT7tjV+//PIOxk+qZdfW5hiSBXMjW6jxoopuGD40sCXj3TEt0miOjxVxSxcEzX
+PNG4HPwfESkMpND2icM90CqSjHgFaabjHZZSJvDQIbnvqd2jmXUskIyzVUUPTDPS
+BQ0+ZdxREE40svqfp8REcDp9mq/L/37Ytu6Z0RRo3m9J/KQsazeuufhdt3MihibO
+i9RehAE+HKLuFgZDtJIcaDPRrK82UGGx+9gO0souPl+HuL176C1knCeMiMebN1uZ
+APOj4zKBR4atmSxQYMzKDKU605uDbdo8QT1yjMGZvJRml54A9/fgPIWT6T0gbAFm
+KBAeZUE9EdPcchwq6uNw6wgUy0lCPm4fkd2/ldQUv+5UDlvxQO5gJKtO3T3/zbMX
+O0dt+Aqq
+=Ubt4
+-----END PGP SIGNATURE-----
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..01b6151
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,341 @@
+See the COPYHEADER file which gives copyright information for Lynx.
+------------------------------------------------------------------------------
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/COPYING.asc b/COPYING.asc
new file mode 100644
index 0000000..38c04ff
--- /dev/null
+++ b/COPYING.asc
@@ -0,0 +1,15 @@
+-----BEGIN PGP SIGNATURE-----
+Comment: See https://invisible-island.net/public/public.html for info
+
+iQGzBAABCgAdFiEEGYgtkt2kxADCLA1WzCr0RyFnvgMFAmEia9gACgkQzCr0RyFn
+vgPpfAv/QpeczbpaxNOT50ZUUPOvYCOmGVewLwDo4jEwp5nljJ8rfU0miT1uie/M
+pXmH/dv3T6WLiEINeGy+ytsJzGWsiB4Cm/lGspsA9/U39ERro875In2Bx9W9z0VZ
+T/c0JyoVc3yEX1h+C29t2YoiUjcFsx4frHHZNZTnCbB8B8NKJCkoeDu8EZf/PWRW
+lMbYAf6KcGO3CX/Jd20l9Z4mRD+Y3+wb8MtmdQ8zpqIJOJDAXcnA/NxFMsB/W3fI
+thS9Dp8rh2pbL04+yGnds2PGfNp5aQ/iGucn48Xg/+mWYAPA5C4y5lo9ZsdMMaHk
+PpK8ZNR/Qlb8YIoA3JMG7bFFFlKO0Gbh48TjxA07Fpvp9KsshRzdV6N6jkWs91SY
+huwxoKVMqZ72qNRrdrDsEdJpGE4ALExvPUVVK+NYUuBC/LRmpxrdj5S1wllVOwky
+48agdOeN3fp0HZ03Qbstw6ae5B4xUT0/C4arCFfobbMO47M1o5CVoBnNIgdmj2Wk
+VpnF+OEU
+=VMQC
+-----END PGP SIGNATURE-----
diff --git a/INSTALLATION b/INSTALLATION
new file mode 100644
index 0000000..b51d8f8
--- /dev/null
+++ b/INSTALLATION
@@ -0,0 +1,1509 @@
+
+ Lynx Installation Guide
+
+This file describes how to compile and install Lynx. A description of Lynx
+can be found in the README file. Lynx has been ported to UN*X, VMS, Win32
+and 386DOS. The procedures for compiling these ports are quite divergent
+and are detailed respectively in Sections II, III, IV and V. General
+installation, problem solving and environment variables are covered in
+Sections VI and VII. There is also a PROBLEMS file in the same directory
+as INSTALLATION which contains advice for special problems people have
+encountered, especially for particular machines and operating systems.
+
+If you still have difficulties, send an e-mail message to the Lynx-Dev mailing
+list (see the README file). Try to include information about your system,
+the name and version of your compiler, which curses library you are using
+and the compile-time errors. Be sure to say what version and image-number
+of Lynx you are trying to build (alternately the top date of the CHANGES file).
+
+If you don't understand what one of the defines means, try the README.defines
+and *.announce files in the docs subdirectory. The docs/CHANGES* files record
+the entire development history of Lynx and are an invaluable resource for
+understanding how Lynx should perform.
+
+First, you must configure Lynx for your system regardless of the port you use.
+Follow the instructions given immediately below to configure for your system,
+and then go to the respective section concerning the port you wish to compile.
+
+-------------------------------------------------------------------------------
+
+I. General configuration instructions (all ports).
+
+Step 1. Compile-time Variables.
+
+ There are a few variables that MUST be defined if Lynx is to build
+ and there are others you may want to change.
+
+ Lynx MUST be able to find lynx.cfg at start-up: using configure
+ (e.g. with UNIX or Cygwin), its location is best set with --sysconfdir ;
+ you can check in lynx_cfg.h after configure has run, if you wish.
+ otherwise, you can use LYNX_CFG_FILE in userdefs.h ,
+ environment variable LYNX_CFG or the -cfg command-line option.
+
+ If you are using configure, you need not make any changes in userdefs.h .
+ There are a few variables you can't define with configure --options
+ but can define in userdefs.h , e.g. numbering fields as well as links.
+ Many variables which can be defined with configure or userdefs.h
+ can also be defined in lynx.cfg or via the Options Menu.
+
+ Lynx implements Native Language Support. Read "ABOUT-NLS", if you want
+ to build an international version of Lynx or tailor status-line prompts,
+ messages and warnings to the requirements of your site.
+
+Step 2. Run-time Variables.
+
+ Read lynx.cfg thoroughly, as many Lynx features and how to use them
+ are explained there, in some cases ONLY there. Set up local printers,
+ downloaders, assumed character set, key mapping and colors in lynx.cfg .
+ Also see the sample mime.types, mailcap and jumps files
+ in the samples subdirectory.
+
+Step 3. Alternative Character Sets.
+
+ You may skip this, if you are not interested in special characters
+ and all local files or WWW pages you will view will use the ISO-8859-1
+ "ISO Latin 1" Western European character set.
+
+ If you will be running Lynx in an environment with different incompatible
+ character sets, configure CHARACTER_SET (the Display character set)
+ and ASSUME_LOCAL_CHARSET to work correctly before creating bookmark files
+ and other such items: read lynx.cfg for detailed instructions.
+ Additional character sets and their properties may be defined with tables
+ in the src/chrtrans directory: see the README.* files therein.
+
+Step 4. News.
+
+ Set NNTPSERVER in lynx.cfg to your site's NNTP server
+ or set the environment variable externally. For posting to be enabled,
+ NEWS_POSTING must be TRUE in userdefs.h or lynx.cfg.
+ Also define LYNX_SIG_FILE in userdefs.h or lynx.cfg ,
+ so that it points to users' signature files for appending to messages.
+
+Step 5. Anonymous Accounts *** VERY IMPORTANT!!!!! ***
+
+ If you are building Lynx for personal use only, you can skip this.
+
+ If you are setting up anonymous accounts to use Lynx captively,
+ i.e. making Web access publicly available to users who should not
+ be allowed any other type of access to your system,
+ you are STRONGLY advised to use the -anonymous command-line option:
+ if you do not use this option, users may be able to gain access
+ to all readable files on your machine!
+
+ Many implementations of telnetd allow passing of environment variables,
+ which might be used to modify the environment in anonymous accounts,
+ allowing mischief or damage by malicious users, so make sure the wrapper
+ uses the -cfg and -homepage switches to specify lynx.cfg and start-file,
+ rather than relying on variables LYNX_CFG, LYNX_CFG_FILE and WWW_HOME.
+
+-------------------------------------------------------------------------------
+
+II. Compile instructions -- UNIX
+
+1a. Auto-configure. The auto-configure script uses autoconf2.13 to generate a
+ Bourne shell script, configure, which creates "makefile" and "lynx_cfg.h".
+
+ If you are on a UNIX platform, the easiest way to build Lynx is to type:
+
+ ./configure
+ and
+ make
+
+ NOTE: Configure has a number of useful options. Please see below.
+
+ NOTE: The 'configure' script generates auxiliary files "config.status"
+ "config.cache" and "config.log". Normally you will not notice these;
+ they are created automatically and removed by a "make distclean".
+
+ + If you wish to rebuild Lynx with a new host, or change ANY of the
+ parameters which are stored in config.cache, you MUST first remove
+ the config.cache file before running configure; its options do NOT
+ override the settings in that file.
+
+ + The config.status file is a script which creates (or regenerates)
+ the files created by the configure script.
+
+ Please report problems in the configure/make process by including a copy
+ of config.status, config.cache and config.log, as well as the pertinent
+ compiler diagnostics.
+
+ See the note in aclocal.m4 for special instructions if you must modify the
+ configure script.
+
+ NOTE: Lynx is a curses-based application, so you must have a curses
+ library available to link to. Native curses (on the system when it was
+ installed) are often broken, so you may get superior performance if you
+ have either
+
+ "ncurses" ("https://invisible-island.net/ncurses") or
+ "slang" ("ftp://space.mit.edu/pub/davis/slang").
+
+ If you install these libraries in your home directory or a non-default
+ location, you may need to set the CPPFLAGS (full path to include files) and
+ LIBS (full path to library files) environment variables BEFORE running
+ configure. See "1d. Environment". Use the "--with-screen=ncurses" or
+ "--with-screen=slang" option.
+
+ Note that while lynx will build with a variety of versions of curses and
+ ncurses, some will be less satisfactory. Versions of ncurses before
+ 1.9.9g will not render color properly. Some other versions of curses do
+ not display color at all. Likewise, lynx may not build with old versions
+ of slang, e.g., before 0.99-38, because slang's interfaces change
+ periodically.
+
+ Note compiler/system specific problems below. See also:
+ https://invisible-island.net/ncurses/ncurses.faq.html
+
+1b. Platforms. Configure should work properly on any Unix-style system.
+ It has been tested on the following platforms.
+
+ AIX 3.2.5 (cc w/ curses) BeOS 4.5 (gcc w/ ncurses)
+ CLIX (cc w/ curses & ncurses) DGUX
+ Digital Unix 3.2C and 4.0 (gcc & cc w/ curses, ncurses & slang)
+ FreeBSD 2.1.5, 3.1 (gcc 2.6.3 w/ curses & ncurses)
+ HP-UX (K&R and ANSI cc, gcc w/ curses, ncurses & slang)
+ IRIX 5.2 and 6.2 (cc & gcc w/ curses, ncurses & slang)
+ Linux 2.0.0 (gcc 2.7.2 w/ curses, ncurses & slang)
+ MkLinux 2.1.5 (gcc 2.7.2.1) NetBSD
+ NEXTSTEP 3.3 (gcc 2.7.2.3 w/ curses)
+ OS/2 EMX 0.9c (ncurses) SCO OpenServer (cc w/ curses)
+ Solaris 2.5, 2.6 & 2.7 (cc & gcc w/ curses, ncurses & slang)
+ SunOS 4.1 (cc w/ curses, gcc w/ ncurses & slang)
+ OS390 and BS2000.
+
+ NOTE: SunOS and HP-UX come with a bundled K&R compiler, which is only
+ useful for compiling with the bundled curses. Both ncurses and slang
+ require a compiler that recognizes prototypes.
+
+1c. Options
+ To get a list of the configure script's options, type "./configure --help".
+ Below is an alphabetical listing of the Lynx-specific options. The actual
+ order shown by the -help option is different. See "docs/README.defines"
+ for information on defines for which there are no option switches.
+
+ --datadir
+ Defines the location where you want the documentation files installed.
+ The configure script constructs makefile actions to install lynx.cfg
+ modified to reflect this in the HELPFILE setting. (For platforms which
+ do not support a configure script, such as MS-DOS, Win32 and VMS, you
+ must edit lynx.cfg).
+
+ --disable-addrlist-page (prevent defining USE_ADDRLIST_PAGE)
+ Turn off code that displays an alternative list-page, bound to 'A'
+ rather than 'l', which always lists URLs rather than titles.
+
+ --disable-alt-bindings (prevent defining USE_ALT_BINDINGS)
+ Compiles-in an alternative set of line-edit bindings, in addition
+ to the default bindings.
+
+ --disable-bibp-urls (define DISABLE_BIBP)
+ Disable (do not compile code) support for bibp: URLs.
+
+ --disable-cjk (define CJK_EX)
+ Disable logic for supporting CJK documents.
+
+ --disable-color-style (define USE_COLOR_STYLE)
+ Use this option to disable optional color style. This is implemented
+ for modern curses implementations, e.g., those that support color.
+
+ Before lynx 2.8.6dev.18, this option was disabled by default.
+ You can achieve a similar color effect to match the non-color-style
+ (but still allowing users to use color-style) by using the
+ --without-lss-file option.
+
+ --disable-config-info (define NO_CONFIG_INFO)
+ Use this option to disable extended browsable configuration information
+ (a screen that shows the result of the configuration script, as well
+ as extended lynx.cfg viewing with a pointer to the lynx.cfg file and
+ additional functionality).
+
+ --disable-dired (prevent defining DIRED_SUPPORT)
+ Use this option to disable the optional directory-editor.
+
+ Lynx supports directory editing (DirEd) for local directories.
+ This allows users to do things like view, copy and remove files
+ using a tabular display of the directory and single-keystroke
+ commands instead of using the command line. From inside Lynx, the
+ keystroke sequence "g.<enter>" switches Lynx to DirEd mode on the
+ current directory. If you're building a Lynx that is to be used as
+ a kind of restricted shell for users who do not have access to the
+ command line and should not have access to equivalent capabilities,
+ you probably want to disable DirEd with this option. You can also
+ disable some DirEd functions while allowing others. If you have
+ disabled DirEd completely, you can ignore all the more specific
+ DirEd options.
+
+ All DirEd menu functions that were enabled on compilation can be
+ disabled or modified at run time via DIRED_MENU symbols in lynx.cfg.
+
+ --disable-dired-dearchive (define ARCHIVE_ONLY)
+ Use this option to prevent DirEd from extracting files from an
+ archive file.
+
+ --disable-dired-gzip (prevent defining OK_GZIP)
+ Use this option to prevent DirEd from using gzip and gunzip.
+
+ --disable-dired-override (prevent defining OK_OVERRIDE)
+ Normally, in DirEd directory viewing mode some key mappings are
+ overridden. Use this option to disable DirEd keymap overriding.
+
+ --disable-dired-permit (prevent defining OK_PERMIT)
+ Use this option to prevent DirEd from changing the permissions
+ on directories or files (i.e., from doing what the Unix chmod
+ command or the DOS attrib command does).
+
+ --disable-dired-tar (prevent defining OK_TAR)
+ Use this option to prevent DirEd from using the tar program.
+
+ --disable-dired-uudecode (prevent defining OK_UUDECODE)
+ Use this option to prevent DirEd from using uudecode.
+
+ --disable-dired-xpermit (define NO_CHANGE_EXECUTE_PERMS)
+ Use this option if you do not disable out the dired-permit
+ option, but want to restrict changes of the eXecute permission
+ to directories (i.e., not allow it to be changed for files). If
+ you don't do this, you can still block changes of the eXecute
+ permission for files but not directories via the
+ "change_exec_perms" command line restriction.
+
+ --disable-dired-zip (prevent defining OK_ZIP)
+ Use this option to prevent DirEd from using zip and unzip.
+
+ --disable-echo
+ Use this option to suppress the "compiling" commands during a build.
+ Doing this makes it easier to find and read warning messages.
+
+ --disable-extended-dtd (define NO_EXTENDED_HTMLDTD)
+ disable extended HTML DTD logic. This should revert to old-style
+ (2.7.1/2.7.2) behavior, but is not well-tested.
+
+ --disable-file-upload (define USE_FILE_UPLOAD)
+ Compile-in support for form-based file-upload.
+
+ --disable-finger (define DISABLE_FINGER)
+ Do not compile-in code used to connect to "finger" URLs.
+
+ --disable-forms-options (define NO_OPTION_FORMS)
+ Disable the Form-based Options Menu (see --disable-menu-options).
+ The default is to compile key-based & form-based Options Menu code,
+ allowing users the final choice via FORMS_OPTIONS in lynx.cfg
+ or the -forms_options command-line switch.
+
+ --disable-ftp (define DISABLE_FTP)
+ Do not compile-in code used to connect to FTP servers.
+
+ --disable-full-paths
+ Use this option to control whether full pathnames are compiled in for
+ various utilities invoked by lynx as external commands. By default,
+ full pathnames are compiled in for the the locations where configure
+ finds these commands at configure time.
+
+ Affected commands include
+ chmod compress cp gzip install mkdir mv rm tar touch gunzip
+ unzip brotli bzip2 uudecode zcat zip telnet tn3270 rlogin
+ (Not all commands are used on all systems or in all configurations.)
+
+ This option makes Lynx simpler to install, but potentially less secure,
+ since the commands are then set in the user's $PATH. All of these
+ commands may also be overridden individually by setting environment
+ variables before configuring. For example, you can disable the telnet
+ command by doing this:
+
+ setenv TELNET /bin/false
+
+ --disable-gopher (define DISABLE_GOPHER)
+ Do not compile-in code used to connect to GOPHER servers.
+
+ --disable-idna
+ By default, the configure script searches for the GNU idn library,
+ which lets lynx translated URLs which are in UTF-8 to ASCII. The
+ latter is needed for most network accesses. Use this option to
+ suppress the feature, e.g., to reduce size.
+
+ --disable-included-msgs
+ Do not use included messages, for i18n support. If NLS support is
+ requested, the configure script will otherwise use the messages in the
+ ./po subdirectory.
+
+ --disable-japanese-utf8 (define USE_JAPANESEUTF8_SUPPORT)
+ use Japanese UTF-8 logic, which uses iconv to convert pages with
+ charset euc-jp, shift_jis to utf-8.
+
+ --disable-justify-elts (define USE_JUSTIFY_ELTS)
+ Do not use element-justification logic.
+
+ --disable-largefile (prevent defining LONG_LIST)
+
+ Use this option to disable the compiler and linker options that
+ provide largefile interfaces.
+
+ --disable-locale-charset (define USE_LOCALE_CHARSET)
+ Use nl_langinfo(CODESET) to determine initial value for display
+ charset, overrides character_set value in .lynxrc file.
+
+ --disable-long-list (prevent defining LONG_LIST)
+ Use this option to disable long "ls -l" directory listings (when
+ enabled, the actual directory style is configurable from lynx.cfg).
+
+ --disable-menu-options (define NO_OPTION_MENU)
+ Disable the Key-based Options Menu.
+ See --disable-forms-options (above) for further details.
+
+ --disable-news (define DISABLE_NEWS)
+ Do not compile-in code used to connect to NNTP (netnews) servers.
+
+ --disable-parent-dir-refs (define NO_PARENT_DIR_REFERENCE)
+ Use this option to disable "Up-to" parent-links in directory listings.
+
+ --disable-partial (prevent defining DISP_PARTIAL)
+ Turn off code that lets Lynx display parts of a long page while loading
+ it.
+
+ --disable-persistent-cookies (prevent defining USE_PERSISTENT_COOKIES)
+ Turn off support for saving cookies to a file, for subsequent reuse.
+ Persistent cookie support will use (or create) the file specified by
+ the 'COOKIE_FILE' option, or default to ".lynx_cookies" in the home
+ directory. (Currently there is no protection against conflict if
+ several lynx sessions are active from the same account).
+
+ --disable-prettysrc (define USE_PRETTYSRC)
+ Turn off support for colorizing the source view of HTML pages. If
+ compiled-in, new source view mode is available with -prettysrc command
+ line option.
+
+ --disable-progressbar (define USE_PROGRESSBAR)
+ Turn off support for a "progress bar" which displays at the bottom
+ of the screen when doing downloads and other time-consuming (but
+ interruptible) processes. This feature can be selected in the
+ options menu.
+
+ --disable-read-eta (define USE_READPROGRESS)
+ Turn off enhanced read-progress message showing ETA (estimated time to
+ completion), as well as the amount of time stalled without any data
+ transferred.
+
+ --disable-rpath-hack
+ The rpath-hack makes it simpler to build programs, particularly with
+ the *BSD ports which may have essential libraries in unusual places.
+ But it can interfere with building an executable for the base system.
+ Use this option in that case.
+
+ --disable-scrollbar (define USE_SCROLLBAR)
+ Turn off support for scrollbar on the right-margin of the screen.
+ If you configure with ncurses, this works with the mouse on xterm,
+ etc.
+
+ --disable-session-cache (define USE_CACHE_JAR)
+ Turn off support for saving/restoring session information in files.
+ Configurable from lynx.cfg
+
+ --disable-sessions (define USE_SESSIONS)
+ Turn off support for sessions, which allows the user to automatically
+ save and restore history information.
+
+ --disable-source-cache (define USE_SOURCE_CACHE)
+ Turn off support for caching HTML pages locally,
+ in files or in memory. Configurable from lynx.cfg
+
+ --disable-trace (define NO_LYNX_TRACE)
+ Turn off code that lets you trace internal details of Lynx's operation.
+ We recommend that you leave this enabled, since we need this
+ information to diagnose problems with either Lynx or the sites to which
+ you connect.
+
+ --enable-ascii-ctypes (define USE_ASCII_CTYPES)
+ Compiles-in alternative case-conversion functions which ensure that
+ configuration names, etc., are compared in POSIX locale. This is
+ important for operating in some locale such as Turkish.
+
+ --enable-cgi-links (define LYNXCGI_LINKS)
+ Allows lynx to access a cgi script directly without the need for
+ a http daemon.
+
+ --enable-change-exec (define ENABLE_OPTS_CHANGE_EXEC)
+ Allow users to change the execution status within the options screen.
+ See EXEC_LINKS and EXEC_SCRIPTS.
+
+ --enable-charset-choice (define USE_CHARSET_CHOICE)
+ Add logic for ASSUMED_DOC_CHARSET_CHOICE and DISPLAY_CHARSET_CHOICE in
+ lynx.cfg, allowing user to configure a subset of the compiled-in
+ charsets for normal use.
+
+ --enable-chinese-utf8 (define EXP_CHINESEUTF8_SUPPORT)
+ use Chinese UTF-8 logic, which uses iconv for converting pages with
+ charset gb2312 (aliased to euc-cn), big5 to utf-8. The Korean charset
+ euc-kr happens to work with this setting.
+
+ --enable-debug (The symbol DEBUG is always defined.)
+ Use this option to compile-in support for debugging.
+ Note that this flag is ignored if the CFLAGS environment
+ variable is set, in that case "-g" (or whatever) has to
+ be included in the CFLAGS value to get debugging.
+ Autoconf normally adds -g and -O options to CFLAGS if CFLAGS
+ was not set, and if the compiler supports those options.
+
+ --enable-default-colors (define USE_DEFAULT_COLORS)
+ Enable use of default-color background (ncurses/slang). Either
+ configuration supports the use of 'default' for colors even without
+ this option. That is, 'default' is interpreted as white (foreground)
+ or black (background) according to the context. When the default
+ colors configuration is built, the actual values for foreground and
+ background colors are determined by the terminal.
+
+ --enable-exec-links (define EXEC_LINKS)
+ Allows lynx to execute programs by accessing a link.
+
+ --enable-exec-scripts (define EXEC_SCRIPTS)
+ Allows lynx to execute programs inferred from a link.
+
+ --enable-externs (define USE_EXTERNALS)
+ Use this option to enable external application support. (See lynx.cfg.)
+
+ --enable-find-leaks (define LY_FIND_LEAKS)
+ Use this option to compile-in logic for testing memory leaks.
+
+ --enable-font-switch (define EXP_CHARTRANS_AUTOSWITCH)
+ Allow Lynx to automatically change the Linux console state (switch
+ fonts) according to the current Display Character Set. (Linux console
+ only. *Use with discretion.* See docs/README.chartrans.)
+
+ --enable-gnutls-compat (define USE_GNUTLS_FUNCS)
+ When --with-gnutls is used, tell whether to use GNUTLS's OpenSSL
+ compatibility library or use GNUTLS's low-level API directly.
+
+ --enable-gzip-help
+ Install the lynx help files in gzip'd format [*.gz] to save space.
+
+ --enable-htmlized-cfg
+ generate an HTMLized copy of lynx.cfg which will be installed with
+ the other help files.
+
+ --enable-internal-links (define TRACK_INTERNAL_LINKS)
+ With `internal links' (links within a document to a location within
+ the same document) enabled, Lynx will distinguish between, for example,
+ `<A HREF="foo#frag">' and `<A HREF="#frag">' within a document whose
+ URL is `foo'. It may handle such links differently, although practical
+ differences would appear only if the document containing them resulted
+ from a POST request or had a no-cache flag set. This feature attempts
+ to interpret URL-references as suggested by RFC 2396, and to prevent
+ mistaken resubmissions of form content with the POST method. An
+ alternate opinion asserts that the feature could actually result in
+ inappropriate resubmission of form content.
+
+ --enable-ipv6 (define ENABLE_IPV6)
+ use IPV6 (with IPV4) logic.
+
+ --enable-kbd-layout (define EXP_KEYBOARD_LAYOUT)
+ Disabled by default, this option allows you to use translation
+ tables on the input keystrokes. Current tables include
+ ROT13'd keyboard layout
+ JCUKEN Cyrillic, for AT 101-key kbd
+ YAWERTY Cyrillic, for DEC LK201 kbd
+
+ --enable-local-docs
+ On install, modify link from help-page to point to the local
+ doc-directory, e.g., with README files. Normally this points
+ to the current release directory.
+
+ --enable-nested-tables (define EXP_NESTED_TABLES)
+ Extends TRST to format nested tables, as well as be smarter about
+ <BR> and <P> tags in table cells.
+
+ --enable-nls (several definitions)
+ use Native Language Support (i.e., gettext).
+
+ This relies upon external programs (msgfmt and xgettext) to format
+ the message catalogs:
+
+ + Unless you set the environment variables MSGFMT and XGETTEXT to
+ the full pathnames of these utilities, the configure script will
+ search for the GNU versions of these utilities.
+
+ It will also search for the GNU version of the corresponding
+ gettext() runtime function. On some platforms (such as Solaris),
+ this search gives misleading results.
+
+ + If you set those environment variables to full pathnames, the
+ configure script will warn if they are not the GNU versions of
+ the utilities.
+
+ --enable-nsl-fork (define NSL_FORK)
+ Disabled by default, this allows interruption of NSL requests,
+ so that `z' will stop the `look-up' phase of a connection.
+
+ --enable-stdnoreturn (define HAVE_STDNORETURN_H)
+ Check for C11 _Noreturn feature, using that rather than gcc-specific
+ __attribute__((noreturn)), to improve compiler diagnostics.
+
+ --enable-syslog (define SYSLOG_REQUESTED_URLS)
+ Use this option to log NSL requests via syslog().
+
+ --enable-underlines (define UNDERLINE_LINKS)
+ Use this option to underline links rather than using boldface.
+
+ --enable-vertrace (define LY_TRACELINE)
+ Turn on code that prefixes trace output lines with source filename
+ and line number.
+
+ --enable-warnings
+ Use this option to turn on GCC compiler warnings.
+
+ --enable-wais
+ Use this option to turn on configure check for freeWAIS library.
+
+ --enable-wcwidth-support (define EXP_WCWIDTH_SUPPORT)
+ use experimental wcwidth/UTF-8 logic.
+
+ --enable-widec
+ Use this option to allow the configure script to look for wide-curses
+ features. If you do not specify the option, the configure script
+ will look for these features if --with-screen=ncursesw is given.
+ For this release of Lynx, we recommend the ncursew library built from
+ ncurses 5.5.
+
+ --sysconfdir (affect LYNX_CFG_FILE)
+ Defines the location where you want the lynx.cfg file installed.
+ The configure script defines the symbol LYNX_CFG_FILE to correspond
+ with the $sysconfdir environment variable. (For platforms which do not
+ support a configure script, such as MS-DOS, Win32 and VMS, you must
+ edit userdefs.h if you wish to specify the location of lynx.cfg).
+
+ --with-Xaw3d
+ This option allows you to specify the X libraries used if you
+ are configuring lynx to use PDCurses on a Unix platform.
+
+ --with-XawPlus
+ This option allows you to specify the X libraries used if you
+ are configuring lynx to use PDCurses on a Unix platform.
+
+ --with-brotli[=XXX] (define USE_BROTLI)
+ Use brotli decompression.
+
+ The optional value XXX specifies the directory in which the library
+ can be found, and may be either the path of the "lib" directory,
+ or one level above. In either case, the corresponding header files
+ are assumed to be in the parallel "include" directory.
+
+ --with-build-cc=XXX
+ If cross-compiling, specify a host C compiler, which is needed to
+ compile a utility which generates tables for lynx.
+ If you do not give this option, the configure script checks if the
+ $BUILD_CC variable is set, and otherwise defaults to gcc or cc.
+
+ --with-build-cpp=XXX
+ This is unused by lynx.
+
+ --with-build-cflags=XXX
+ If cross-compiling, specify the host C compiler-flags. You might need
+ to do this if the target compiler has unusual flags which confuse the
+ host compiler.
+
+ --with-build-cppflags=XXX
+ If cross-compiling, specify the host C preprocessor-flags. You might
+ need to do this if the target compiler has unusual flags which confuse
+ the host compiler.
+
+ --with-build-ldflags=XXX
+ If cross-compiling, specify the host linker-flags. You might need to
+ do this if the target linker has unusual flags which confuse the host
+ compiler.
+
+ --with-build-libs=XXX
+ If cross-compiling, the host libraries. You might need to do this if
+ the target environment requires unusual libraries.
+
+ --with-bzlib[=XXX] (define USE_BZLIB)
+ Use libbz2 for decompression of some bzip2 files.
+
+ The optional value XXX specifies the directory in which the library
+ can be found, and may be either the path of the "lib" directory,
+ or one level above. In either case, the corresponding header files
+ are assumed to be in the parallel "include" directory.
+
+ --with-charsets=list (define ALL_CHARSETS)
+ Limit the number of charsets that are compiled-in to the specified
+ list of comma-separated MIME names.
+
+ --with-cfg-file (define LYNX_CFG_FILE)
+ Specify the default configuration file's name. Use --without-cfg-file
+ to force the user to specify the configuration file on the command
+ line. The filename can be overridden by using the LYNX_CFG environment
+ variable.
+
+ --with-cfg-path (define LYNX_CFG_PATH)
+ Specify the default configuration file(s) directory search-list. Use
+ --without-cfg-path to limit this to the location of the lynx.cfg file.
+ The search-list can be overridden using the LYNX_CFG_PATH environment
+ variable.
+
+ --with-curses-dir
+ Specify directory under which curses/ncurses is installed. This
+ assumes a standard install, e.g., with an include and lib subdirectory.
+
+ --with-dbmalloc
+ use Conor Cahill's dbmalloc library
+
+ --with-destdir=XXX
+ set DESTDIR variable in makefiles. This is prefixed to all directories
+ in the actual install, but is not really part of the compiled-in or
+ configured directory names. It is convenient for packaging the
+ installed files. If you do not provide the option, the configure
+ script uses your $DESTDIR environment variable.
+
+ --with-dmalloc
+ use Gray Watson's dmalloc library
+
+ --with-gnutls[=XXX] (define USE_SSL, USE_GNUTLS_INCL)
+ Use this option to configure with the GNU TLS library.
+ See docs/README.ssl for additional information.
+
+ The optional value XXX specifies the directory in which the library
+ can be found, and may be either the path of the "lib" directory,
+ or one level above. In either case, the corresponding header files
+ are assumed to be in the parallel "include" directory. The default
+ is /usr/local/gnutls.
+
+ See the "--enable-gnutls-compat" option.
+
+ --with-included-gettext
+ not supported in this package. The configure script uses macros which
+ are bundled together with more useful features.
+
+ See the "--enable-nls" option.
+
+ --with-libiconv-prefix=DIR
+ search for libiconv in DIR/include and DIR/lib
+
+ --with-lss-file{=path} (define LYNX_LSS_FILE)
+ Specify the default style-sheet file's name. Use --without-lss-file
+ to make the default behavior match the non-color-style (if no --lss
+ option is given, and no COLOR_STYLE setting is in lynx.cfg).
+
+ --with-mime-libdir=list (define MIME_LIBDIR)
+ Use this option to specify the system directory containing the
+ mime.types and mailcap files.
+
+ --with-neXtaw
+ This option allows you to specify the X libraries used if you
+ are configuring lynx to use PDCurses on a Unix platform.
+
+ --with-nls-datadir=DIR
+ Use this option to override the configure script's NLS data directory,
+ under which the locale (i.e., language) files are installed. The
+ default value is derived at configure time, and depends on whether GNU
+ or native gettext is used.
+
+ --with-nss-compat[=XXX] (define USE_NSS_COMPAT_INCL)
+ Use this option to configure with the NSS library's OpenSSL-compatible
+ interface.
+ See docs/README.ssl for additional information.
+
+ The optional value XXX specifies the directory in which the library
+ can be found, and may be either the path of the "lib" directory,
+ or one level above. In either case, the corresponding header files
+ are assumed to be in the parallel "include" directory.
+
+ --with-pkg-config[=XXX]
+ Use pkg-config, if available, to tell how to build with certain
+ libraries, e.g., openssl and gnutls. If pkg-config is not used,
+ or if those libraries are not known to pkg-config, then the configure
+ script will search for the libraries as described in the --with-ssl
+ and --with-gnutls options.
+
+ The optional value XXX specifies the pathname for pkg-config, e.g.,
+ "/usr/local/bin/pkg-config".
+
+ Note: The pkg-config program is used only if no explicit directory
+ parameter is provided for the --with-ssl or --with-gnutls options.
+
+ --with-screen=XXX
+ Use this option to select the screen type. The option value, XXX
+ must be one of curses (the default), ncurses, ncursesw, pdcurses or
+ slang. Specifying a screen type causes the configure script to
+ look in standard locations for the associated header and library
+ files, unless you have preset the $CFLAGS and $LIBS variables.
+
+ --with-screen=ncursesw (define NCURSES, WIDEC_CURSES)
+ --with-screen=ncurses (define NCURSES)
+ --with-screen=pdcurses (define PDCURSES)
+ --with-screen=slang (define USE_SLANG)
+
+ Note that some systems may have a default curses library which
+ does not support color, while on others, ncurses is installed as
+ the curses library. The variant ncursesw is the wide-character
+ version of ncurses. See also the --enable-widec option.
+
+ For the ncurses/ncursesw options, the script also accepts variants
+ such as "ncursesw6", which helps it to find a specific ncurses config
+ script.
+
+ The pdcurses selection supported by the configure script is a UNIX-only
+ library which uses X11. If you are configuring with DJGPP, the likely
+ choice is "curses", since that is how PDCurses is normally installed.
+
+ --with-socks[=XXX] (define SOCKS)
+ Use this option to configure with the socks library.
+
+ The optional value XXX specifies the directory in which the library
+ can be found, and may be either the path of the "lib" directory,
+ or one level above. In either case, the corresponding header files
+ are assumed to be in the parallel "include" directory.
+
+ --with-socks5[=XXX] (define USE_SOCKS5, SOCKS)
+ Use this option to configure with the socks5 library.
+
+ The optional value XXX specifies the directory in which the library
+ can be found, and may be either the path of the "lib" directory,
+ or one level above. In either case, the corresponding header files
+ are assumed to be in the parallel "include" directory.
+
+ If you make a SOCKSified lynx, you may have trouble accessing FTP
+ servers. Also, instead of SOCKSifying lynx for use behind a firewall,
+ you are better off if you make it normally, and set it up to use a
+ proxy server. You can SOCKSify the proxy server, and it will handle
+ all clients, not just Lynx. If you do SOCKSify lynx, you can turn off
+ SOCKS proxy usage via a -nosocks command line switch.
+
+ --with-ssl[=XXX] (define USE_SSL)
+ Use this option to configure with the OpenSSL library, or SSLeay.
+ See docs/README.ssl for additional information.
+
+ The optional value XXX specifies the directory in which the library
+ can be found, and may be either the path of the "lib" directory,
+ or one level above. In either case, the corresponding header files
+ are assumed to be in the parallel "include" directory.
+
+ --with-system-type=XXX
+ For testing, override the derived host system-type which is used to
+ decide things such as special compiler options. This is normally
+ chosen automatically based on the type of system which you are
+ building on. We use it for testing the configure script.
+
+ --with-textdomain[=XXX] (define NLS_TEXTDOMAIN)
+ Set the NLS textdomain to the given value. This is normally "lynx".
+
+ --with-zlib[=XXX] (define USE_ZLIB)
+ Use zlib for decompression of some gzip files.
+
+ The optional value XXX specifies the directory in which the library
+ can be found, and may be either the path of the "lib" directory,
+ or one level above. In either case, the corresponding header files
+ are assumed to be in the parallel "include" directory.
+
+1d. Environment variables
+ The configure script looks for programs and libraries in known/standard
+ locations. You can override the behavior of the script by presetting
+ environment variables. If they are set, the script will try to use these
+ values rather than computing new ones. Useful variables include:
+
+ CC - the C compiler. If you do not override this, configure
+ will try to use gcc. For instance, setting CC=cc and
+ exporting this value will cause configure to use cc instead.
+
+ CFLAGS - the C compiler options. These also include C
+ preprocessor options (such as -I), since the $CFLAGS and
+ $CPPFLAGS variables are maintained separately.
+
+ CPPFLAGS - the C preprocessor options. For some configuration
+ tests, you may need to set both $CFLAGS and $CPPFLAGS if
+ you are compiling against header files in nonstandard
+ locations.
+
+ LDFLAGS - linker/loader options.
+
+ LIBS - the libraries to be linked, with -L and -l options. If
+ you are linking against libraries in nonstandard locations
+ unrelated to the install prefix (that you can specify in
+ the configure script) you may have to specify these via
+ the $LIBS variable.
+
+ Lynx has compiled-in the pathnames of various programs which it executes.
+ Normally the full pathnames are given, rather than the program name
+ alone. These may be preset in the environment by the capitalized version,
+ e.g., INSTALL for "install". The corresponding internal definitions
+ are suffixed "_PATH", e.g., "INSTALL_PATH".
+
+
+-- 1997/7/27 - T. Dickey <dickey@clark.net>
+
+1e. Examples
+ If you are compiling Lynx for your personal use and are restricted to your
+ home directory, a simple method for building would be to choose some
+ directory, say ".lynx", and then type:
+
+ ./configure --prefix=~/.lynx --exec-prefix=~/.lynx
+ and
+ make install
+
+ Now you only need to add "~/.lynx/bin" to your PATH and edit "~/.lynx/lib/
+ lynx.cfg" as described above.
+
+ I personally use the following csh shell script to set environment
+ variables and configure options rather than type them each time.
+ #!/bin/csh -f
+ setenv CPPFLAGS "-I$HOME/slang -I$HOME/.usr/include"
+ setenv LIBS "-L$HOME/.slang/lib -L$HOME/.usr/lib"
+ ./configure --exec-prefix=$HOME --bindir=$HOME/.lynx \
+ --mandir=$HOME/.usr/man --sysconfdir=$HOME/.usr/lib \
+ --with-screen=slang --with-zlib
+
+ CPPFLAGS in this example defines the full path to the slang and zlib
+ header files, which are not kept in standard directories. Likewise, LIBS
+ defines the nonstandard locations of libslang.a and libz.a. Setting the
+ option --bindir tells the configure script where I want to install the
+ lynx binary; setting --mandir tells it where to put the lynx.1 man page,
+ and setting --sysconfdir tells it (while at the same time defining
+ LYNX_CFG_FILE) where to put the configuration file "lynx.cfg", when I type
+ "make install". The --with-screen=slang and --with-zlib options are
+ explained above.
+
+2. Wais support (optional)
+ To add direct WAIS support, get the freeWAIS distribution from
+ "ftp://ftp.cnidr.org/pub/NIDR.tools/freewais", and compile it. The
+ compile process will create the libraries you will need, wais.a and
+ client.a. Edit the Makefile in the top level directory and add the
+ library locations under the DIRECT WAIS ACCESS heading. Edit the Makefile
+ for the WWW Library in "WWW/Library/Implementation/makefile" to point to
+ the include directory for the freewais distribution. Precompiled
+ libraries are available for many platforms if you don't wish to compile
+ one yourself.
+
+-------------------------------------------------------------------------------
+
+III. Compile instructions -- VMS
+
+Step 1. Downloading binary files.
+ Lynx must handle all IO as streams, and on VMS, output files are always
+ created with Stream_LF format via the C RTL's fopen(). The file headers
+ indicate Implied Carriage Control, even when the transfer was in binary
+ mode, which can confuse downloading software and cause corruption of
+ the file contents. To deal with this, you should define the symbol
+ USE_FIXED_RECORDS as TRUE in userdefs.h and/or lynx.cfg. This will
+ instruct Lynx to correct the header information to indicate FIXED 512
+ records, with No Implied Carriage Control. If Lynx fails to do the
+ conversion (because the file wasn't mapped to a binary MIME type) you can
+ execute FIXED512.COM externally to correct the header information. The
+ command file uses Joe Meadow's FILE utility, or the SET FILE/ATTRIBUTES
+ command on current versions of VMS, to modify the headers. See the
+ comments in FIXED512.COM, userdefs.h and lynx.cfg for more information.
+
+Step 2. Passive FTP
+ If your system requires the PASV FTP code instead of the standard PORT FTP
+ code (e.g., to deal with a firewall) then set the FTP_PASSIVE option in
+ lynx.cfg
+
+Step 3a.
+ Lynx uses the VMS port of gzip for uncompressing streams which have
+ Content-Encoding headers indicated compression with gzip or the
+ Unix compress. If you do not have gzip installed on your system
+ you can get it from "ftp://ftp.wku.edu/" in the fileserv directory.
+ The command Lynx uses to uncompress on VMS is "gzip -d".
+
+ If you are using the SOCKETSHR library, read SOCKETSHR.announce and
+ make sure you have defined SOCKETSHR and SOCKETSHR_LIBRARY as explained
+ therein.
+
+ A "build.com" and "build-slang.com" script for building Lynx with curses
+ or slang is in the top level directory. All you have to do is type
+ "@build" or "@build-slang" and answer its prompt for your system's TCP-IP
+ software. Current choices are:
+ MULTINET (default)
+ UCX
+ WIN_TCP
+ CMU_TCP
+ SOCKETSHR_TCP
+ TCPWARE
+ It will autosense whether you have VAXC, DECC or GNUC on VAX or AXP and
+ build appropriately. If a WWWLib already exists for that TCP-IP software,
+ it will prompt you for whether you want to rebuild it. If you want to
+ build a WWWLib separately, you can type "@libmake.com" with your default
+ directory set to [.WWW.Library.vms] instead doing it via "build.com" in
+ the top directory. You may need to modify "build-slang.com", as described
+ in its header, so that it can find slang.olb on your system. If you have
+ both DECC and VAXC, it will use DECC to benefit from the newer and more
+ efficient memory management functions.
+
+Step 3b. (optional compilation method)
+ If you have and want to use MMS, read the header of descrip.mms in the
+ top directory and be sure you include the appropriate macro definitions
+ when you invoke it:
+
+ $ MMS /Macro = (MULTINET=1) for VAXC - MultiNet
+ $ MMS /Macro = (WIN_TCP=1) for VAXC - Wollongong TCP/IP
+ $ MMS /Macro = (UCX=1) for VAXC - UCX
+ $ MMS /Macro = (CMU_TCP=1) for VAXC - OpenCMU TCP/IP
+ $ MMS /Macro = (SOCKETSHR_TCP=1) for VAXC - SOCKETSHR/NETLIB
+ $ MMS /Macro = (TCPWARE=1) for VAXC - TCPWare TCP/IP
+
+ $ MMS /Macro = (MULTINET=1, DEC_C=1) for DECC - MultiNet
+ $ MMS /Macro = (WIN_TCP=1, DEC_C=1) for DECC - Wollongong TCP/IP
+ $ MMS /Macro = (UCX=1, DEC_C=1) for DECC - UCX
+ $ MMS /Macro = (CMU_TCP=1, DEC_C=1) for DECC - OpenCMU TCP/IP
+ $ MMS /Macro = (SOCKETSHR_TCP=1,DEC_C=1) for DECC - SOCKETSHR/NETLIB
+ $ MMS /Macro = (TCPWARE=1, DEC_C=1) for DECC - TCPWare TCP/IP
+
+ $ MMS /Macro = (MULTINET=1, GNU_C=1) for GNUC - MultiNet
+ $ MMS /Macro = (WIN_TCP=1, GNU_C=1) for GNUC - Wollongong TCP/IP
+ $ MMS /Macro = (UCX=1, GNU_C=1) for GNUC - UCX
+ $ MMS /Macro = (CMU_TCP=1, GNU_C=1) for GNUC - OpenCMU TCP/IP
+ $ MMS /Macro = (SOCKETSHR_TCP=1,GNU_C=1) for GNUC - SOCKETSHR/NETLIB
+ $ MMS /Macro = (TCPWARE=1, GNU_C=1) for GNUC - TCPWare TCP/IP
+
+ If you just type "MMS" it will default to the MULTINET and VAXC
+ configuration. MMS will build the WWW library and Lynx sources, and
+ link the executable. However, not all of the header dependencies are
+ specified. If you are not a developer, and need a clean build, you
+ should use build.com instead of the MMS utility.
+
+ If you want SOCKS support on VMS, you must add SOCKS as a compilation
+ definition, and the SOCKS library to the link command. However, instead
+ of SOCKSifying Lynx for use behind a firewall, you are better off if you
+ build Lynx normally, and set up Lynx to use a proxy server (see below).
+ You instead can SOCKSify the proxy server, and it will handle all clients,
+ not just Lynx.
+
+-------------------------------------------------------------------------------
+
+IV. Compile instructions -- Win32 (Windows95/98/NT)
+
+Borland C:
+---------
+
+Simplified:
+----------
+
+Sources:
+ Download the current sources (choose a zip-file) from
+ https://lynx.invisible-island.net/
+ and unzip them into a directory where you will build Lynx.
+
+Compiler:
+ Download the Borland C/C++ 5.51 compiler from
+ http://forms.embarcadero.com/forms/BCC32CompilerDownload
+
+ This is a file named "freecompilertools.exe".
+
+ Run that to install the compiler, e.g., in
+ c:\app\bcc55
+
+ Do not install into a directory with spaces in its name, such as
+ c:\program files
+
+Libraries:
+ Download these "setup" files from http://gnuwin32.sourceforge.net
+ libiconv-1.9.2-1.exe (libiconv)
+ libintl-0.14.4.exe (libintl)
+ openssl-0.9.8h-1-setup.exe (openssl)
+ pdcurses-2.6.exe (pdcurses)
+ zlib-1.2.3.exe (zlib)
+
+ Install all of the packages in the same directory, "c:\app\GnuWin32".
+
+ A fix is needed in GnuWin32 include/zconf.h: change line reading
+ #if 1 /* HAVE_UNISTD_H -- this line is updated by ./configure */
+ to
+ #ifdef HAVE_UNISTD_H
+
+ Prepare import-libraries using Borland's implib program. The ".lib"
+ files that it uses are a different format than the import libraries
+ distributed with GnuWin2. From Lynx's source directory run
+ bcblibs
+
+Environment:
+ At this point, the bin-directory for the compiler and for the GnuWin32
+ libraries should be in your path.
+
+Building:
+ From Lynx's source directory
+ cd src\chrtrans
+ makew32 clean
+ makew32
+ cd ..\..
+ makew32 clean
+ makew32
+
+-------------------------------------------------------------------------------
+
+Detailed:
+--------
+ The original Win32 port was built with Borland C++ 4.52, but later
+ versions reportedly can be used. Before compiling the Lynx sources, you
+ need a curses library, and it is recommended that you have the zlib
+ library. Get pdcurses2.3 from "http://pdcurses.sourceforge.net/". I
+ have modified it so that mouse support is no longer broken for Lynx (see
+ "http://www.fdisk.com/doslynx/"). You will want to get zlib from
+ "http://www.zlib.net/ ". Compile these libraries, and
+ put them in a convenient place (pdcurses inside the Lynx directory).
+
+ Unpack the latest Lynx source distribution, and make an obj directory
+ under the source root to contain the compile output. Copy in your
+ IDE file. A sample IDE file and helper libraries are available at
+ "http://www.fdisk.com/doslynx/wlynx/source/".
+
+ First build the .h files in src\chrtrans using "makew32.bat". Double
+ check for new .tbl files; hand edit in any new ones, and then do "makew32".
+ Jump into Borland C++, load the project (IDE file) and compile Lynx.
+ Alternately, after compiling the chartrans tables, you can come back to
+ the top directory and compile manually, i.e., do "make -f makefile.bcb".
+
+ I also have a binary available at "http://www.fdisk.com/doslynx/". This
+ binary was compiled with pdcurses 2.3, hacked so win32 mouse support works,
+ and with zlib, so Lynx can do gzip routines internally. More hints and
+ information can be found in "http://www.fdisk.com/doslynx/lynxport.htm".
+
+-- 1997/10/12 - W. Buttles <lynx-port@fdisk.com>
+-- 2010/11/27 - URL's updated by Doug Kaufman <dkaufman@rahul.net>
+
+-------------------------------------------------------------------------------
+
+Cygwin:
+ It is possible to compile under the cygwin system, which will allow you to
+ use the configure script described above for Unix. Type, for example,
+ "./configure --with-screen=ncurses --with-libz" in a Dos window running the
+ cygwin bash$ shell. You also have the choice of using either pdcurses or
+ slang. You will need a launch program such as sh.exe to call helper
+ applications. Paths may need to be in cygwin style, rather than Windows
+ style (e.g., TMPDIR=/cygdrive/d/cygwin/tmp, rather than
+ TMPDIR=d:\cygwin\tmp).
+
+Visual C++:
+ You must have compiled zlib and PDCurses with the -MT (threaded code)
+ option. This is not the default with zlib (see Makefile.msc).
+
+ Copy into lib the following
+ zconf.h
+ zlib.h
+ zlib.lib
+
+ from the zlib build-tree, and
+ curses.h
+ pdcurses.lib
+
+ from the PDCurses build-tree.
+
+ Then
+ make-msc
+
+ to build lynx.
+
+-------------------------------------------------------------------------------
+
+V. Compile instructions -- 386 DOS
+
+ Compiling for DOS with DJGPP has traditionally been a multistep
+ procedure. Now, if you have a full installation of DJGPP you can
+ also install using the configure script, just as in the UNIX
+ section. This needs to be done under a BASH shell. Use a shell
+ script to run configure as in the example at the end of this
+ section. Otherwise you can follow the below instructions. The
+ multistep procedure for DOS may not be supported in the future
+ and use of the configure script is recommended. The information
+ about required libraries and unpacking applies to both methods of
+ compiling.
+
+ First install the C compiler and its libraries (see readme.1st from
+ DJGPP distribution).
+
+ Originally, lynx makefiles come with the initial -O2 optimization
+ level. If you experience compilation process too slow due to paging
+ to the disk (DPMI server provide virtual memory, when in lack of
+ RAM), you may change optimization to -O1 or turn the optimization
+ off entirely.
+
+ If using optimization level -O2 or -O3 with older versions of DJGPP
+ and GCC, you may need to "stubedit" your "cc1.exe" file to enlarge
+ compiler stack size. For instance, if using DJGPP 2.02 and GCC 2.8.1,
+ to compile with -O3 optimization, the stub needs to be edited to give
+ a larger stack. To do this go into djgpp\lib\gcc-lib\djgpp\2.81 and
+ either type the command:
+ "stubedit cc1.exe bufsize=63k minstack=2M",
+ or edit interactively with: "stubedit cc1.exe". Current versions of
+ DJGPP and GCC generally work with the standard stack.
+
+ Unpack the source code using a DOS program like UNZIP386. If you are
+ using PKUNZIP to unpack the .zip archive, you must use the -d command
+ line switch to restore the directory structure contained in the archive,
+ i.e., do "pkunzip -d lynx-cur.zip". No switch is required if you use
+ unzip386 or unzip. If you are trying to compile the 386DOS port under a
+ WinNT DOS shell, be sure to unpack the source with a DOS program so
+ that all directories will be adjusted to the DOS 8.3 file format necessary
+ for compiling with DJGPP. Do NOT use Winzip, because that will create
+ long filenames that will not be recognized by DJGPP tools.
+
+ If you wish to compile with "USE_ZLIB" (recommended), you must have the
+ zlib library. Get the source from
+ http://www.zlib.net
+ and compile it. Put libz.a in the lib subdirectory of DJGPP, and put
+ zlib.h and zconf.h in the include subdirectory.
+
+ In addition to the files in the Lynx distribution, you will need a curses
+ package and a TCP package. You can use PDCurses (available at
+ "http://pdcurses.sourceforge.net/") and the DJGPP port of WATTCP. The
+ updated version of WATTCP is known as WATT-32, and is available at
+ "http://home.broadpark.no/~gvanem/". You can also use slang (available at
+ "http://www.jedsoft.org/slang/") as your screen library. You must
+ compile these before you go any further. If you wish to use PDCurses 2.6,
+ you need to first apply the following patch:
+
+--- dos/gccdos.mak.ori 2002-01-11 20:11:18.000000000 -0800
++++ dos/gccdos.mak 2003-12-13 21:29:28.000000000 -0800
+@@ -40,11 +40,11 @@
+ CFLAGS = -c -g -Wall -DPDCDEBUG
+ LDFLAGS = -g
+ else
+- CFLAGS = -c -O -Wall
++ CFLAGS = -c -O2 -Wall
+ LDFLAGS =
+ endif
+
+-CPPFLAGS = -I$(PDCURSES_HOME) -I$(CCINCDIR) -D_NAIVE_DOS_REGS
++CPPFLAGS = -I$(PDCURSES_HOME) -I$(CCINCDIR) -D_NAIVE_DOS_REGS -DHAVE_STRING_H
+
+ CCFLAGS = $(CFLAGS) $(CPPFLAGS)
+
+@@ -64,10 +64,10 @@
+ all: $(PDCLIBS) $(DEMOS)
+
+ clean:
+ -del *.o
+- -del curses.lib
+- -del panel.lib
++ -del pdcurses.a
++ -del panel.a
+
+ demos: $(DEMOS)
+
+@@ -287,33 +287,27 @@
+ #------------------------------------------------------------------------
+
+ firework.exe: firework.o $(LIBCURSES)
+- $(LINK) $(LDFLAGS) -o firework firework.o $(LIBCURSES)
+- $(COFF2EXE) firework
++ $(LINK) $(LDFLAGS) -o firework.exe firework.o $(LIBCURSES)
+ strip $@
+
+ newdemo.exe: newdemo.o $(LIBCURSES)
+- $(LINK) $(LDFLAGS) -o newdemo newdemo.o $(LIBCURSES)
+- $(COFF2EXE) newdemo
++ $(LINK) $(LDFLAGS) -o newdemo.exe newdemo.o $(LIBCURSES)
+ strip $@
+
+ ptest.exe: ptest.o $(LIBCURSES) $(LIBPANEL)
+- $(LINK) $(LDFLAGS) -o ptest ptest.o $(LIBCURSES) $(LIBPANEL)
+- $(COFF2EXE) ptest
++ $(LINK) $(LDFLAGS) -o ptest.exe ptest.o $(LIBCURSES) $(LIBPANEL)
+ strip $@
+
+ testcurs.exe: testcurs.o $(LIBCURSES)
+- $(LINK) $(LDFLAGS) -o testcurs testcurs.o $(LIBCURSES)
+- $(COFF2EXE) testcurs
++ $(LINK) $(LDFLAGS) -o testcurs.exe testcurs.o $(LIBCURSES)
+ strip $@
+
+ tuidemo.exe: tuidemo.o tui.o $(LIBCURSES)
+- $(LINK) $(LDFLAGS) -o tuidemo tuidemo.o tui.o $(LIBCURSES)
+- $(COFF2EXE) tuidemo
++ $(LINK) $(LDFLAGS) -o tuidemo.exe tuidemo.o tui.o $(LIBCURSES)
+ strip $@
+
+ xmas.exe: xmas.o $(LIBCURSES)
+- $(LINK) $(LDFLAGS) -o xmas xmas.o $(LIBCURSES)
+- $(COFF2EXE) xmas
++ $(LINK) $(LDFLAGS) -o xmas.exe xmas.o $(LIBCURSES)
+ strip $@
+
+
+--- dos/pdckbd.c.ori 2002-09-01 00:13:30.000000000 -0800
++++ dos/pdckbd.c 2004-01-19 20:30:02.000000000 -0800
+@@ -362,7 +362,7 @@
+ return ((int) (0xb8 << 8));
+ if (ascii == 0xe0 && scan == 0x53 && pdc_key_modifiers & PDC_KEY_MODIFIER_SHIFT) /* Shift Del */
+ return ((int) (0xb9 << 8));
+- if (ascii == 0x00 || ascii == 0xe0)
++ if (ascii == 0x00 || (ascii == 0xe0 && scan != 0x00))
+ return ((int) (scan << 8));
+ return ((int) (ascii));
+ }
+@@ -522,7 +522,7 @@
+ _watch_breaks();
+ #else
+ # ifdef GO32
+- (void*)signal(SIGINT,(setting ? SIG_DFL : SIG_IGN));
++/* (void*)signal(SIGINT,(setting ? SIG_DFL : SIG_IGN)); */
+ /* __djgpp_set_ctrl_c(setting);*/
+ setcbrk(setting);
+ # else
+--- pdcurses/kernel.c.ori 2002-11-27 03:24:32.000000000 -0800
++++ pdcurses/kernel.c 2003-12-13 21:22:38.000000000 -0800
+@@ -27,6 +27,10 @@
+ #include <memory.h>
+ #endif
+
++#ifdef HAVE_STRING_H
++#include <string.h>
++#endif
++
+ #ifdef UNIX
+ #include <defs.h>
+ #include <term.h>
+--- pdcurses/pdcutil.c.ori 2001-01-10 00:27:22.000000000 -0800
++++ pdcurses/pdcutil.c 2003-12-13 21:24:58.000000000 -0800
+@@ -49,7 +49,7 @@
+ # include <limits.h>
+ #endif
+
+-#ifdef STDC_HEADERS
++#if defined(STDC_HEADERS) || defined(HAVE_STRING_H)
+ # include <string.h>
+ #endif
+
+--- pdcurses/pdcwin.c.ori 2002-05-25 17:13:32.000000000 -0800
++++ pdcurses/pdcwin.c 2003-12-13 21:26:02.000000000 -0800
+@@ -27,6 +27,10 @@
+ # include <memory.h>
+ #endif
+
++#ifdef HAVE_STRING_H
++#include <string.h>
++#endif
++
+ #ifndef HAVE_MEMMOVE
+ # define memmove PDC_memmove
+ #endif
+
+ If you wish to compile with SSL enabled, you need to get and compile
+ OpenSSL. The DJGPP port has been successfully compiled with the
+ development version of OpenSSL. DJGPP can compile OpenSSL from the
+ standard source distribution (http://www.openssl.org/). See the file
+ "INSTALL.DJGPP" in the OpenSSL distribution.
+
+ If you have trouble applying the patches, try using the "patch" program,
+ ("http://www.delorie.com/pub/djgpp/current/v2gnu/pat261b.zip").
+ To read the Unix man style documentation, use, for example, "less"
+ ("http://www.delorie.com/pub/djgpp/current/v2gnu/lss374b.zip").
+ Compile or place your compiled PDCurses library in /djgpp/pdcur26, and
+ compile or place your compiled WATT-32 library in /djgpp/watt32. If
+ using the SLANG library, put libslang.a in your DJGPP/lib directory and put
+ slang.h in your DJGPP/include directory, or in the appropriate directories
+ specified by LIBRARY_PATH and INCLUDE_PATH in your DJGPP.ENV file.
+
+ Move to the "lynx2-*/WWW/Library/djgpp" directory. If compiling with
+ PDCurses, do "make". If using SLANG, do "make -f makefile.sla". This
+ should compile libwww.a. Next move to the "lynx2-*/src/chrtrans" directory
+ and do "make -f makefile.dos" to compile the character tables. Then move
+ to the "lynx2-*/src" directory. There are three choices for compiling at
+ this point. You can do "make -f makefile.dos" to compile with PDCurses,
+ "make -f makefile.wsl" to compile with SLANG, or "make -f makefile.dsl" to
+ compile with SLANG and the DJGPP keyhandler. At the time of this writing,
+ it is not clear what the advantages and disadvantages of each version are.
+ The PDCurses version has the most experience and allows remapping of ALT
+ and Function keys. The SLANG version seems to have better screen handling.
+ It allows mapping of function keys, but not ALT keys. The SLANG with DJGPP
+ keyhandler allows mapping of ALT and Function keys, but has the risk of
+ incompatibilities from mixing different programs.
+
+ If you wish to compile with support for internationalization of messages,
+ you first need to install the DOS ports of the GNU gettext and libiconv
+ packages, available from any DJGPP mirror site. Then uncomment the lines
+ for INTLFLAGS in src/makefile.dsl and in WWW/Library/djgpp/makefile.sla,
+ and remove the "#" from the LIBS line in src/makefile.dsl. Make similar
+ changes if using one of the other DOS makefiles. See the gettext
+ documentation for information on creating and using message files for
+ different languages.
+
+ If all goes well, you will have a lynx.exe file. If you have trouble,
+ check to be sure djgpp.env is the way it came in the original package.
+
+ To test Lynx_386 you must have a packet driver installed. The simplest
+ method is to use a null packet driver that just allows Lynx to start
+ up, but doesn't do anything else. One such executable driver has been
+ posted, uuencoded, to the lynx-dev mailing list in January 1998,
+ but is corrupted in the mailing list archive. You can get this at
+ "http://www.ncf.ca/ncf/pda/computer/dos/net/nullpkt.zip". Start the
+ dummy packet driver with "nullpkt 0x60", and take it out of memory with
+ "nullpkt -u". You can also use slip8250.com. See the CRYNWR package
+ "ftp://ftp.simtel.net/pub/simtelnet/msdos/pktdrvr/pktd11.zip". Usage
+ is "slip8250 0x60", but you may have to invoke it as, for example,
+ "slip8250 0x60 6 3 0x2F8" so that it uses COM2 and IRQ 3, in order to
+ avoid an IRQ conflict with a mouse or some other device. Another packet
+ driver is slipper.exe, which is available from many sites, including
+ "http://www.cavazza.it/file/bbs/intsoft/slippr15.zip". To remove it from
+ memory use termin.com (usage "termin 0x60"), available in the CRYNWR
+ package. To connect over a dialup PPP connection you need dosppp or klos'
+ pppshare. (Find at:
+ "http://www.ibiblio.org/pub/micro/pc-stuff/freedos/files/net/dosppp/dosppp06.zip"
+ "http://www.ncf.carleton.ca/ncf/pda/computer/dos/net/dosppp06.zip"
+ "http://www.cavazza.it/file/bbs/intsoft/dosppp06.zip"
+ "http://www.cavazza.it/file/bbs/intsoft/pppshare.exe")
+
+ File access looks like this:
+
+ file:///c:/
+ file:///c:/dos
+ file:///c:/dos/command.com
+ file://localhost/c:/
+ file://localhost/c:/dos
+ file://localhost/c:/dos/command.com
+
+ See "http://www.fdisk.com/doslynx/lynxport.htm" for more hints and
+ some precompiled libraries. One problem you can encounter is editing
+ userdefs.h and lynx.cfg, which have unix-style end of lines. You would
+ be well advised to use an editor that can handle end of lines terminated
+ with a single LF character. You can also unpack the source code using
+ unzip386 or unzip with the -a or -aa switch to convert unix LF to dos CRLF.
+ That will make texts more readable under DOS. If you compile lynx
+ regularly, you may automate the procedure by creating a batch file such
+ as the following.
+
+ cd djgpp\watt32\src
+ configur djgpp
+ make -f djgpp.mak
+ cd ..\..\..\www\library\djgpp
+ make
+ cd ..\..\..\src\chrtrans
+ make -f makefile.dos
+ cd ..\..\src
+ make -f makefile.dos
+ strip lynx.exe
+ cd ..
+
+ This batch file expects the DJGPP port of WATT-32 to be installed in the
+ lynx2-* directory. Place a copy of this batch file, named "djgpp.bat",
+ in the lynx2-* directory, move to that directory and type "djgpp". A more
+ complete batch file with error checking and annotation can be found at:
+ "http://lists.nongnu.org/archive/html/lynx-dev/1997-11/msg00250.html".
+
+ If you use the configure method, remember that if you configure with
+ the option "--enable-nls", you also need to set LIBS="-liconv". A
+ sample shell script to run configure using PDCurses follows. If you
+ compile to use SLANG, note that the DJGPP keyhandler will be used
+ instead of the SLANG keyhandler unless you define "NO_DJ_KEYHANDLER".
+
+ #!/bin/sh
+ CFLAGS="-O2 -I/djgpp/pdcur26 -I/djgpp/watt32/inc" \
+ LIBS="-L/djgpp/pdcur26/lib -L/djgpp/watt32/lib -liconv" \
+ ./configure --prefix=d:/djgpp/lynx-rel/lynx-cnf \
+ --with-screen=curses \
+ --disable-full-paths \
+ --enable-addrlist-page \
+ --enable-change-exec \
+ --enable-cgi-links \
+ --enable-charset-choice \
+ --enable-color-style \
+ --enable-exec-links \
+ --enable-externs \
+ --enable-file-upload \
+ --enable-nested-tables \
+ --enable-nls \
+ --sysconfdir=d:/djgpp/lynx-rel/lynx-cnf \
+ --with-bzlib \
+ --with-zlib \
+ --with-ssl
+
+-- 1997/9/29 - D. Kaufman <dkaufman@rahul.net>
+-- 1997/10/3 - B. Schiavo <Wschiavo@concentric.net>
+-- Last update - 2010/11/27
+
+-------------------------------------------------------------------------------
+
+VI. General installation instructions
+
+ Once you have compiled Lynx, test it out first on a local file. Be sure
+ Lynx can find lynx.cfg. A _sample_ test command line would be:
+ 'lynx -cfg=/usr/local/lib/lynx.cfg .'. Once you are satisfied that
+ Lynx works, go ahead and install it. For Unix, type "make install".
+
+ For VMS, you need to have the executable in a public place, make it
+ accessible, define it as a foreign command, and copy lynx.cfg to
+ "Lynx_Dir". Look at lynx.com in the samples directory as a model for
+ installing Lynx. To include lynx.hlp in the system HELP library, use
+ the command: "$ library/replace sys$help:helplib.hlb lynx.hlp".
+
+ Local copies of the Lynx online help should be made accessible in response
+ to the Lynx 'h'elp command by defining HELPFILE in userdefs.h and/or
+ lynx.cfg to an appropriate file://localhost/path URL. On Unix, all you
+ need to do is type "make install-help." If you are installing manually,
+ copy the files "COPYHEADER" and "COPYING" into the lynx_help directory
+ BEFORE moving the lynx_help tree to its final location. These files are
+ referenced hypertextually from help documents.
+
+ If you have old, pre-existing bookmark files from earlier versions of
+ Lynx, those files may have to be updated. Conversion may just consist
+ of adding one META line near the top, or may require creating new book-
+ mark files and editing in bookmarks from outdated files.
+
+ IMPORTANT! Be sure you have read the warnings about setting up an
+ anonymous account with Lynx if you plan to give public access to Lynx.
+
+ After applying patches or editing files to correct for an unsuccessful
+ build, be certain to do a "make clean" (or "make distclean" for those
+ using auto-configure) before attempting to compile again.
+
+-------------------------------------------------------------------------------
+
+VII. Setting environment variables before running Lynx (optional)
+
+1. All ports
+
+ The Lynx Users Guide describes all of the environment variables used by
+ Lynx. This should be checked later along with reading lynx.cfg after you
+ have installed Lynx.
+
+2. Win32 (95/98/NT) and 386 DOS
+
+ These ports cannot start before setting certain environment variables.
+ Here are some environment variables that should be set, usually in a
+ batch file that runs the lynx executable. Make sure that you have enough
+ room left in your environment. You may need to change your "SHELL="
+ setting in config.sys. In addition, lynx looks for a "SHELL" environment
+ variable when shelling to DOS. If you wish to preserve the environment
+ space when shelling, put a line like this in your AUTOEXEC.BAT file also
+ "SET SHELL=C:\COMMAND.COM /E:4096". It should match CONFIG.SYS.
+
+ HOME Where to keep the bookmark file and personal config files.
+ TEMP or TMP Bookmarks are kept here with no HOME. Temp files here.
+ USER Set to your login name (optional)
+ LYNX_CFG Set to the full path and filename for lynx.cfg
+ LYNX_LSS Set to the full path and filename for lynx.lss
+ LYNX_SAVE_SPACE The (modifiable) location for downloaded file storage.
+ SSL_CERT_FILE Set to the full path and filename for your file of trusted
+ certificates
+
+ 386 version only:
+ WATTCP.CFG Set to the full path for the WATTCP.CFG directory
+ RL_CLCOPY_CMD Command to copy a URL to a "clipboard" file
+ RL_PASTE_CMD Command to go to a URL in your "clipboard" file
+
+ Define these in your batch file for running Lynx. For example, if your
+ application line is "D:\win32\lynx.bat", lynx.bat for Win32 may look like:
+ @ECHO OFF
+ set home=d:\win32
+ set temp=d:\tmp
+ set lynx_cfg=d:\win32\lynx.cfg
+ set lynx_save_space=d:\download
+ d:\win32\lynx.exe %1 %2 %3 %4 %5
+
+ For lynx_386, a typical batch file might look like:
+
+ @echo off
+ set HOME=f:/lynx2-8
+ set USER=your_login_name
+ set LYNX_CFG=%HOME%/lynx.cfg
+ set WATTCP.CFG=%HOME%
+ f:\lynx2-8\lynx %1 %2 %3 %4 %5 %6 %7 %8 %9
+
+ You need to make sure that the WATTCP.CFG file has the correct information
+ for IP number, Gateway, Netmask, and Domain Name Server. This can also be
+ automated in the batch file.
+
+ Adapted from "readme.txt" by Wayne Buttles and "readme.dos" by Doug
+ Kaufman.
+
+VIII. Acknowledgment
+
+ Thanks to the many volunteers who offered suggestions for making this
+ installation manual as accurate and complete as possible.
+
+-- 1999/04/24 - H. Nelson <lynx-admin@irm.nara.kindai.ac.jp>
+-- vile:txtmode
+-- $LynxId: INSTALLATION,v 1.137 2022/12/28 13:40:56 tom Exp $
diff --git a/LYHelp.hin b/LYHelp.hin
new file mode 100644
index 0000000..6e7a7f5
--- /dev/null
+++ b/LYHelp.hin
@@ -0,0 +1,26 @@
+/*
+ * $LynxId: LYHelp.hin,v 1.4 2008/01/10 23:26:53 tom Exp $
+ * vile:cmode
+ */
+/* definitions for help files */
+
+#ifndef LYHELP_H
+#define LYHELP_H
+
+#define ALT_EDIT_HELP "keystrokes/@ALT_EDIT_HELP@"
+#define BASHLIKE_EDIT_HELP "keystrokes/@BASHLIKE_EDIT_HELP@"
+#define COOKIE_JAR_HELP "@LYNX_USERS_GUIDE@#Cookies"
+#define CACHE_JAR_HELP "@LYNX_USERS_GUIDE@#Cache"
+#define CURRENT_KEYMAP_HELP "keystrokes/@KEYSTROKE_HELP@"
+#define DIRED_MENU_HELP "keystrokes/@DIRED_HELP@"
+#define EDIT_HELP "keystrokes/@EDIT_HELP@"
+#define DOWNLOAD_OPTIONS_HELP "@LYNX_USERS_GUIDE@#RemoteSource"
+#define HISTORY_PAGE_HELP "keystrokes/@HISTORY_HELP@"
+#define LIST_PAGE_HELP "keystrokes/@FOLLOW_HELP@"
+#define LYNXCFG_HELP "lynx.cfg"
+#define OPTIONS_HELP "keystrokes/@OPTION_HELP@"
+#define PRINT_OPTIONS_HELP "keystrokes/@PRINT_HELP@"
+#define UPLOAD_OPTIONS_HELP "@LYNX_USERS_GUIDE@#DirEd"
+#define VISITED_LINKS_HELP "keystrokes/@VISITED_HELP@"
+
+#endif /* LYHELP_H */
diff --git a/LYMessages_en.h b/LYMessages_en.h
new file mode 100644
index 0000000..7014be6
--- /dev/null
+++ b/LYMessages_en.h
@@ -0,0 +1,901 @@
+/*
+ * $LynxId: LYMessages_en.h,v 1.82 2019/08/24 00:37:02 tom Exp $
+ *
+ * Lynx - Hypertext navigation system
+ *
+ * Copyright 1997-2019 Thomas E. Dickey
+ * Copyright 1992, 1993, 1994 University of Kansas
+ * Released 1995 using GNU General Public License
+ */
+
+#ifndef LYMESSAGES_EN_H
+#define LYMESSAGES_EN_H
+
+/*******************************************************************
+ * The following definitions are for status line prompts, messages, or
+ * warnings issued by Lynx during program execution. You can modify
+ * them to make them more appropriate for your site. We recommend that
+ * you extend these definitions to other languages using the gettext
+ * library. There are also scattered uses of 'gettext()' throughout the
+ * Lynx source, covering all but those messages which (a) are used for
+ * debugging (CTRACE) or (b) are constants used in interaction with
+ * other programs.
+ *
+ * See ABOUT-NLS and po/readme for details and location of contributed
+ * translations. When no translation is available, the English default is
+ * used.
+ */
+#define ALERT_FORMAT gettext("Alert!: %s")
+#define WELCOME_MSG gettext("Welcome")
+#define REALLY_QUIT gettext("Are you sure you want to quit?")
+#ifdef VMS
+#define REALLY_EXIT gettext("Really exit from Lynx?")
+#endif /* VMS */
+#define CONNECTION_INTERRUPTED gettext("Connection interrupted.")
+#define TRANSFER_INTERRUPTED gettext("Data transfer interrupted.")
+#define CANCELLED gettext("Cancelled!!!")
+#define CANCELLING gettext("Cancelling!")
+#define NO_CANCEL gettext("Excellent!!!")
+#define OPERATION_OK gettext("OK")
+#define OPERATION_DONE gettext("Done!")
+#define BAD_REQUEST gettext("Bad request!")
+#define PREVIOUS gettext("previous")
+#define NEXT_SCREEN gettext("next screen")
+#define TO_HELP gettext("HELP!")
+#define HELP_ON_SEGMENT gettext(", help on ")
+#define HELP \
+ gettext("Commands: Use arrow keys to move, '?' for help, 'q' to quit, '<-' to go back.")
+#define MOREHELP \
+ gettext("-- press space for more, use arrow keys to move, '?' for help, 'q' to quit.")
+#define MORE gettext("-- press space for next page --")
+#define URL_TOO_LONG gettext("URL too long")
+
+/* Forms messages */
+#ifdef TEXTFIELDS_MAY_NEED_ACTIVATION
+/* Inactive input fields, messages used with -tna option - kw */
+#define FORM_LINK_TEXT_ADV_MSG_INA \
+ gettext("(Textfield \"%s\") Inactive. Press <return> to activate.")
+#define FORM_LINK_TEXT_MESSAGE_INA \
+ gettext("(Text entry field) Inactive. Press <return> to activate.")
+#define FORM_LINK_TEXTAREA_ADV_MSG_INA \
+ gettext("(Textarea \"%s\") Inactive. Press <return> to activate.")
+#define FORM_LINK_TEXTAREA_MESSAGE_INA \
+ gettext("(Textarea) Inactive. Press <return> to activate.")
+#define FORM_LINK_TEXTAREA_ADV_MSG_INA_E \
+ gettext("(Textarea \"%s\") Inactive. Press <return> to activate (%s for editor).")
+#define FORM_LINK_TEXTAREA_MESSAGE_INA_E \
+ gettext("(Textarea) Inactive. Press <return> to activate (%s for editor).")
+#define FORM_LINK_TEXT_SUBMIT_MESSAGE_INA \
+ gettext("(Form field) Inactive. Use <return> to edit.")
+#define FORM_TEXT_SUBMIT_MESSAGE_INA_X \
+ gettext("(Form field) Inactive. Use <return> to edit (%s to submit with no cache).")
+#define FORM_TEXT_RESUBMIT_MESSAGE_INA \
+ gettext("(Form field) Inactive. Press <return> to edit, press <return> twice to submit.")
+#define FORM_TEXT_SUBMIT_MAILTO_MSG_INA \
+ gettext("(mailto form field) Inactive. Press <return> to change.")
+#define FORM_LINK_PASSWORD_MESSAGE_INA \
+ gettext("(Password entry field) Inactive. Press <return> to activate.")
+#endif
+#define FORM_LINK_FILE_UNM_MSG \
+ gettext("UNMODIFIABLE file entry field. Use UP or DOWN arrows or tab to move off.")
+#define FORM_LINK_FILE_MESSAGE \
+ gettext("(File entry field) Enter filename. Use UP or DOWN arrows or tab to move off.")
+#define FORM_LINK_TEXT_ADV_MSG \
+ gettext("(Textfield \"%s\") Enter text. Use UP or DOWN arrows or tab to move off.")
+#define FORM_LINK_TEXT_MESSAGE \
+ gettext("(Textfield \"%s\") Enter text. Use UP or DOWN arrows or tab to move off.")
+#define FORM_LINK_TEXTAREA_ADV_MSG \
+ gettext("(Textarea \"%s\") Enter text. Use UP/DOWN arrows or TAB to move off.")
+#define FORM_LINK_TEXTAREA_MESSAGE \
+ gettext("(Textarea) Enter text. Use UP/DOWN arrows or TAB to move off.")
+#define FORM_LINK_TEXTAREA_ADV_MSG_E \
+ gettext("(Textarea \"%s\") Enter text. Use UP/DOWN arrows or TAB to move off (%s for editor).")
+#define FORM_LINK_TEXTAREA_MESSAGE_E \
+ gettext("(Textarea) Enter text. Use UP/DOWN arrows or TAB to move off (%s for editor).")
+#define FORM_LINK_TEXT_UNM_MSG \
+ gettext("UNMODIFIABLE form text field. Use UP or DOWN arrows or tab to move off.")
+#define FORM_LINK_TEXT_SUBMIT_MESSAGE \
+ gettext("(Form field) Enter text. Use <return> to submit.")
+#define FORM_LINK_TEXT_SUBMIT_MESSAGE_X \
+ gettext("(Form field) Enter text. Use <return> to submit (%s for no cache).")
+#define FORM_LINK_TEXT_RESUBMIT_MESSAGE \
+ gettext("(Form field) Enter text. Use <return> to submit, arrows or tab to move off.")
+#define FORM_LINK_TEXT_SUBMIT_UNM_MSG \
+ gettext("UNMODIFIABLE form field. Use UP or DOWN arrows or tab to move off.")
+#define FORM_LINK_TEXT_SUBMIT_MAILTO_MSG \
+ gettext("(mailto form field) Enter text. Use <return> to submit, arrows to move off.")
+#define FORM_LINK_TEXT_SUBMIT_MAILTO_DIS_MSG \
+ gettext("(mailto form field) Mail is disallowed so you cannot submit.")
+#define FORM_LINK_PASSWORD_MESSAGE \
+ gettext("(Password entry field) Enter text. Use UP or DOWN arrows or tab to move off.")
+#define FORM_LINK_PASSWORD_UNM_MSG \
+ gettext("UNMODIFIABLE form password. Use UP or DOWN arrows or tab to move off.")
+#define FORM_LINK_CHECKBOX_ADV_MSG \
+ gettext("(Checkbox \"%s\") Use right-arrow or <return> to toggle.")
+#define FORM_LINK_CHECKBOX_MESSAGE \
+ gettext("(Checkbox Field) Use right-arrow or <return> to toggle.")
+#define FORM_LINK_CHECKBOX_UNM_MSG \
+ gettext("UNMODIFIABLE form checkbox. Use UP or DOWN arrows or tab to move off.")
+#define FORM_LINK_RADIO_ADV_MSG \
+ gettext("(Radio Button \"%s\") Use right-arrow or <return> to toggle.")
+#define FORM_LINK_RADIO_MESSAGE \
+ gettext("(Radio Button) Use right-arrow or <return> to toggle.")
+#define FORM_LINK_RADIO_UNM_MSG \
+ gettext("UNMODIFIABLE form radio button. Use UP or DOWN arrows or tab to move off.")
+#define FORM_LINK_SUBMIT_PREFIX \
+ gettext("Submit ('x' for no cache) to ")
+#define FORM_LINK_RESUBMIT_PREFIX \
+ gettext("Submit to ")
+#define FORM_LINK_SUBMIT_MESSAGE \
+ gettext("(Form submit button) Use right-arrow or <return> to submit ('x' for no cache).")
+#define FORM_LINK_RESUBMIT_MESSAGE \
+ gettext("(Form submit button) Use right-arrow or <return> to submit.")
+#define FORM_LINK_SUBMIT_DIS_MSG \
+ gettext("DISABLED form submit button. Use UP or DOWN arrows or tab to move off.")
+#define FORM_LINK_SUBMIT_MAILTO_PREFIX \
+ gettext("Submit mailto form to ")
+#define FORM_LINK_SUBMIT_MAILTO_MSG \
+ gettext("(mailto form submit button) Use right-arrow or <return> to submit.")
+#define FORM_LINK_SUBMIT_MAILTO_DIS_MSG \
+ gettext("(mailto form submit button) Mail is disallowed so you cannot submit.")
+#define FORM_LINK_RESET_MESSAGE \
+ gettext("(Form reset button) Use right-arrow or <return> to reset form to defaults.")
+#define FORM_LINK_RESET_DIS_MSG \
+ gettext("DISABLED form reset button. Use UP or DOWN arrows or tab to move off.")
+#define FORM_LINK_BUTTON_MESSAGE \
+ gettext("(Script button) Use UP or DOWN arrows or tab to move off.")
+#define FORM_LINK_BUTTON_ADV_MSG \
+ gettext("(Script button \"%s\") Use UP or DOWN arrows or tab to move off.")
+#define FORM_LINK_BUTTON_DIS_MSG \
+ gettext("DISABLED Script button. Use UP or DOWN arrows or tab to move off.")
+#define FORM_LINK_OPTION_LIST_ADV_MSG \
+ gettext("(Option list \"%s\") Hit return to select option.")
+#define FORM_LINK_OPTION_LIST_MESSAGE \
+ gettext("(Option list) Hit return and use arrow keys and return to select option.")
+#define CHOICE_LIST_ADV_MSG \
+ gettext("(Choice entry \"%s\") Use arrow keys and return to select option.")
+#define CHOICE_LIST_MESSAGE \
+ gettext("(Choice list) Hit return and use arrow keys and return to select option.")
+#define MOUSE_CHOICE_MESSAGE \
+ gettext("Left mouse button or return to select, arrow keys to scroll.")
+#define FORM_LINK_OPTION_LIST_UNM_MSG \
+ gettext("UNMODIFIABLE option list. Use return or arrow keys to review or leave.")
+#define CHOICE_LIST_UNM_MSG \
+ gettext("UNMODIFIABLE choice list. Use return or arrow keys to review or leave.")
+#define SUBMITTING_FORM gettext("Submitting form...")
+#define RESETTING_FORM gettext("Resetting form...")
+#define RELOADING_FORM \
+ gettext("Reloading document. Any form entries will be lost!")
+#define LINK_NOT_IN_FORM \
+ gettext("The current link is not in a FORM")
+#define CANNOT_TRANSCODE_FORM gettext("Warning: Cannot transcode form data to charset %s!")
+
+#define NORMAL_LINK_MESSAGE \
+ gettext("(NORMAL LINK) Use right-arrow or <return> to activate.")
+#define LINK_NOT_FOUND gettext("The resource requested is not available at this time.")
+#define ENTER_LYNX_COMMAND gettext("Enter Lynx keystroke command: ")
+#define WWW_FIND_MESSAGE gettext("Looking up ")
+#define WWW_WAIT_MESSAGE gettext("Getting %s")
+#define WWW_SKIP_MESSAGE gettext("Skipping %s")
+#define WWW_USING_MESSAGE gettext("Using %s")
+#define WWW_ILLEGAL_URL_MESSAGE gettext("Illegal URL: %s")
+#define WWW_BAD_ADDR_MESSAGE gettext("Badly formed address %s")
+#define ADVANCED_URL_MESSAGE gettext("URL: %s")
+#define WWW_FAIL_MESSAGE gettext("Unable to access WWW file!!!")
+#define WWW_INDEX_MESSAGE gettext("This is a searchable index. Use %s to search.")
+#define WWW_INDEX_MORE_MESSAGE \
+ gettext("--More-- This is a searchable index. Use %s to search.")
+#define BAD_LINK_NUM_ENTERED gettext("You have entered an invalid link number.")
+#define SOURCE_HELP \
+ gettext("Currently viewing document source. Press '\\' to return to rendered version.")
+#define NOVICE_LINE_ONE \
+ gettext(" Arrow keys: Up and Down to move. Right to follow a link; Left to go back. \n")
+#define NOVICE_LINE_TWO \
+ gettext(" H)elp O)ptions P)rint G)o M)ain screen Q)uit /=search [delete]=history list \n")
+#define NOVICE_LINE_TWO_A \
+ gettext(" O)ther cmds H)elp K)eymap G)oto P)rint M)ain screen o)ptions Q)uit \n")
+#define NOVICE_LINE_TWO_B \
+ gettext(" O)ther cmds B)ack E)dit D)ownload ^R)eload ^W)ipe screen search doc: / \n")
+#define NOVICE_LINE_TWO_C \
+ gettext("O)ther cmds C)omment History: <backspace> Bookmarks: V)iew, A)dd, R)emove \n")
+#define FORM_NOVICELINE_ONE \
+ gettext(" Enter text into the field by typing on the keyboard ")
+#define FORM_NOVICELINE_TWO \
+ gettext(" Ctrl-U to delete all text in field, [Backspace] to delete a character ")
+#define FORM_NOVICELINE_TWO_DELBL \
+ gettext(" Ctrl-U to delete text in field, [Backspace] to delete a character ")
+#define FORM_NOVICELINE_TWO_VAR \
+ gettext(" %s to delete all text in field, [Backspace] to delete a character ")
+#define FORM_NOVICELINE_TWO_DELBL_VAR \
+ gettext(" %s to delete text in field, [Backspace] to delete a character ")
+
+/* mailto */
+#define BAD_FORM_MAILTO gettext("Malformed mailto form submission! Cancelled!")
+#define MAILTO_SQUASH_CTL gettext("Warning! Control codes in mail address replaced by ?")
+#define FORM_MAILTO_DISALLOWED gettext("Mail disallowed! Cannot submit.")
+#define FORM_MAILTO_FAILED gettext("Mailto form submission failed!")
+#define FORM_MAILTO_CANCELLED gettext("Mailto form submission Cancelled!!!")
+#define SENDING_FORM_CONTENT gettext("Sending form content...")
+#define NO_ADDRESS_IN_MAILTO_URL gettext("No email address is present in mailto URL!")
+#define MAILTO_URL_TEMPOPEN_FAILED \
+ gettext("Unable to open temporary file for mailto URL!")
+#define INC_ORIG_MSG_PROMPT \
+ gettext("Do you wish to include the original message?")
+#define INC_PREPARSED_MSG_PROMPT \
+ gettext("Do you wish to include the preparsed source?")
+#define SPAWNING_EDITOR_FOR_MAIL \
+ gettext("Spawning your selected editor to edit mail message")
+#define ERROR_SPAWNING_EDITOR \
+ gettext("Error spawning editor, check your editor definition in the options menu")
+#define SEND_COMMENT_PROMPT gettext("Send this comment?")
+#define SEND_MESSAGE_PROMPT gettext("Send this message?")
+#define SENDING_YOUR_MSG gettext("Sending your message...")
+#define SENDING_COMMENT gettext("Sending your comment:")
+
+/* textarea */
+#define NOT_IN_TEXTAREA_NOEDIT gettext("Not in a TEXTAREA; cannot use external editor.")
+#define NOT_IN_TEXTAREA gettext("Not in a TEXTAREA; cannot use command.")
+
+#define FILE_ACTIONS_DISALLOWED gettext("file: ACTIONs are disallowed!")
+#define FILE_SERVED_LINKS_DISALLOWED \
+ gettext("file: URLs via served links are disallowed!")
+#define NOAUTH_TO_ACCESS_FILES gettext("Access to local files denied.")
+#define FILE_BOOKMARKS_DISALLOWED gettext("file: URLs via bookmarks are disallowed!")
+#define SPECIAL_VIA_EXTERNAL_DISALLOWED \
+ gettext("This special URL is not allowed in external documents!")
+#define RETURN_TO_LYNX gettext("Press <return> to return to Lynx.")
+#ifdef VMS
+#define SPAWNING_MSG \
+ gettext("Spawning DCL subprocess. Use 'logout' to return to Lynx.\n")
+#else
+#ifdef DOSPATH
+#define SPAWNING_MSG \
+ gettext("Type EXIT to return to Lynx.\n")
+#else /* UNIX */
+#define SPAWNING_MSG \
+ gettext("Spawning your default shell. Use 'exit' to return to Lynx.\n")
+#endif
+#endif /* VMS */
+#define SPAWNING_DISABLED gettext("Spawning is currently disabled.")
+#define DOWNLOAD_DISABLED gettext("The 'd'ownload command is currently disabled.")
+#define NO_DOWNLOAD_INPUT gettext("You cannot download an input field.")
+#define NO_DOWNLOAD_MAILTO_ACTION gettext("Form has a mailto action! Cannot download.")
+#define NO_DOWNLOAD_MAILTO_LINK gettext("You cannot download a mailto: link.")
+#define NO_DOWNLOAD_COOKIES gettext("You cannot download cookies.")
+#define NO_DOWNLOAD_PRINT_OP gettext("You cannot download a printing option.")
+#define NO_DOWNLOAD_UPLOAD_OP gettext("You cannot download an upload option.")
+#define NO_DOWNLOAD_PERMIT_OP gettext("You cannot download an permit option.")
+#define NO_DOWNLOAD_SPECIAL gettext("This special URL cannot be downloaded!")
+#define NO_DOWNLOAD_CHOICE gettext("Nothing to download.")
+#define TRACE_ON gettext("Trace ON!")
+#define TRACE_OFF gettext("Trace OFF!")
+#define CLICKABLE_IMAGES_ON \
+ gettext("Links will be included for all images! Reloading...")
+#define CLICKABLE_IMAGES_OFF \
+ gettext("Standard image handling restored! Reloading...")
+#define PSEUDO_INLINE_ALTS_ON \
+ gettext("Pseudo_ALTs will be inserted for inlines without ALT strings! Reloading...")
+#define PSEUDO_INLINE_ALTS_OFF \
+ gettext("Inlines without an ALT string specified will be ignored! Reloading...")
+#define RAWMODE_OFF gettext("Raw 8-bit or CJK mode toggled OFF! Reloading...")
+#define RAWMODE_ON gettext("Raw 8-bit or CJK mode toggled ON! Reloading...")
+#define HEAD_D_L_OR_CANCEL \
+ gettext("Send HEAD request for D)ocument or L)ink, or C)ancel? (d,l,c): ")
+#define HEAD_D_OR_CANCEL \
+ gettext("Send HEAD request for D)ocument, or C)ancel? (d,c): ")
+#define DOC_NOT_HTTP_URL gettext("Sorry, the document is not an http URL.")
+#define LINK_NOT_HTTP_URL gettext("Sorry, the link is not an http URL.")
+#define FORM_ACTION_DISABLED gettext("Sorry, the ACTION for this form is disabled.")
+#define FORM_ACTION_NOT_HTTP_URL \
+ gettext("Sorry, the ACTION for this form is not an http URL.")
+#define NOT_HTTP_URL_OR_ACTION gettext("Not an http URL or form ACTION!")
+#define SPECIAL_ACTION_DISALLOWED gettext("This special URL cannot be a form ACTION!")
+#define NOT_IN_STARTING_REALM gettext("URL is not in starting realm!")
+#define NEWSPOSTING_DISABLED gettext("News posting is disabled!")
+#define DIRED_DISABLED gettext("File management support is disabled!")
+#define NO_JUMPFILE gettext("No jump file is currently available.")
+#define JUMP_PROMPT gettext("Jump to (use '?' for list): ")
+#define JUMP_DISALLOWED gettext("Jumping to a shortcut URL is disallowed!")
+#define RANDOM_URL_DISALLOWED gettext("Random URL is disallowed! Use a shortcut.")
+#define NO_RANDOM_URLS_YET gettext("No random URLs have been used thus far.")
+#define BOOKMARKS_DISABLED gettext("Bookmark features are currently disabled.")
+#define BOOKMARK_EXEC_DISABLED gettext("Execution via bookmarks is disabled.")
+#define BOOKMARK_FILE_NOT_DEFINED \
+ gettext("Bookmark file is not defined. Use %s to see options.")
+#define NO_TEMP_FOR_HOTLIST \
+ gettext("Unable to open tempfile for X Mosaic hotlist conversion.")
+#define BOOKMARK_OPEN_FAILED gettext("ERROR - unable to open bookmark file.")
+#define BOOKMARK_OPEN_FAILED_FOR_DEL \
+ gettext("Unable to open bookmark file for deletion of link.")
+#define BOOKSCRA_OPEN_FAILED_FOR_DEL \
+ gettext("Unable to open scratch file for deletion of link.")
+#ifdef VMS
+#define ERROR_RENAMING_SCRA gettext("Error renaming scratch file.")
+#else
+#define ERROR_RENAMING_TEMP gettext("Error renaming temporary file.")
+#define BOOKTEMP_COPY_FAIL \
+ gettext("Unable to copy temporary file for deletion of link.")
+#define BOOKTEMP_REOPEN_FAIL_FOR_DEL \
+ gettext("Unable to reopen temporary file for deletion of link.")
+#endif /* VMS */
+#define BOOKMARK_LINK_NOT_ONE_LINE \
+ gettext("Link is not by itself all on one line in bookmark file.")
+#define BOOKMARK_DEL_FAILED gettext("Bookmark deletion failed.")
+#define BOOKMARKS_NOT_TRAVERSED \
+ gettext("Bookmark files cannot be traversed (only http URLs).")
+#define BOOKMARKS_NOT_OPEN \
+ gettext("Unable to open bookmark file, use 'a' to save a link first")
+#define BOOKMARKS_NOLINKS gettext("There are no links in this bookmark file!")
+#define CACHE_D_OR_CANCEL \
+ gettext("D)elete cached document or C)ancel? (d,c): ")
+#define BOOK_D_L_OR_CANCEL \
+ gettext("Save D)ocument or L)ink to bookmark file or C)ancel? (d,l,c): ")
+#define BOOK_D_OR_CANCEL gettext("Save D)ocument to bookmark file or C)ancel? (d,c): ")
+#define BOOK_L_OR_CANCEL gettext("Save L)ink to bookmark file or C)ancel? (l,c): ")
+#define NOBOOK_POST_FORM \
+ gettext("Documents from forms with POST content cannot be saved as bookmarks.")
+#define NOBOOK_FORM_FIELD gettext("Cannot save form fields/links")
+#define NOBOOK_HSML \
+ gettext("History, showinfo, menu and list files cannot be saved as bookmarks.")
+#define CONFIRM_BOOKMARK_DELETE \
+ gettext("Do you really want to delete this link from your bookmark file?")
+#define MALFORMED_ADDRESS gettext("Malformed address.")
+#define HISTORICAL_ON_MINIMAL_OFF \
+ gettext("Historical comment parsing ON (Minimal is overridden)!")
+#define HISTORICAL_OFF_MINIMAL_ON \
+ gettext("Historical comment parsing OFF (Minimal is in effect)!")
+#define HISTORICAL_ON_VALID_OFF \
+ gettext("Historical comment parsing ON (Valid is overridden)!")
+#define HISTORICAL_OFF_VALID_ON \
+ gettext("Historical comment parsing OFF (Valid is in effect)!")
+#define MINIMAL_ON_IN_EFFECT \
+ gettext("Minimal comment parsing ON (and in effect)!")
+#define MINIMAL_OFF_VALID_ON \
+ gettext("Minimal comment parsing OFF (Valid is in effect)!")
+#define MINIMAL_ON_BUT_HISTORICAL \
+ gettext("Minimal comment parsing ON (but Historical is in effect)!")
+#define MINIMAL_OFF_HISTORICAL_ON \
+ gettext("Minimal comment parsing OFF (Historical is in effect)!")
+#define SOFT_DOUBLE_QUOTE_ON gettext("Soft double-quote parsing ON!")
+#define SOFT_DOUBLE_QUOTE_OFF gettext("Soft double-quote parsing OFF!")
+#define USING_DTD_0 gettext("Now using TagSoup parsing of HTML.")
+#define USING_DTD_1 gettext("Now using SortaSGML parsing of HTML!")
+#define ALREADY_AT_END gettext("You are already at the end of this document.")
+#define ALREADY_AT_BEGIN gettext("You are already at the beginning of this document.")
+#define ALREADY_AT_PAGE gettext("You are already at page %d of this document.")
+#define LINK_ALREADY_CURRENT gettext("Link number %d already is current.")
+#define ALREADY_AT_FIRST gettext("You are already at the first document")
+#define NO_LINKS_ABOVE gettext("There are no links above this line of the document.")
+#define NO_LINKS_BELOW gettext("There are no links below this line of the document.")
+#define MAXLEN_REACHED_DEL_OR_MOV \
+ gettext("Maximum length reached! Delete text or move off field.")
+#define NOT_ON_SUBMIT_OR_LINK \
+ gettext("You are not on a form submission button or normal link.")
+#define NEED_CHECKED_RADIO_BUTTON \
+ gettext("One radio button must be checked at all times!")
+#define NO_SUBMIT_BUTTON_QUERY gettext("No submit button for this form, submit single text field?")
+#define PREV_DOC_QUERY gettext("Do you want to go back to the previous document?")
+#define ARROWS_OR_TAB_TO_MOVE gettext("Use arrows or tab to move off of field.")
+#define ENTER_TEXT_ARROWS_OR_TAB \
+ gettext("Enter text. Use arrows or tab to move off of field.")
+#define NO_FORM_ACTION gettext("** Bad HTML!! No form action defined. **")
+#define BAD_HTML_NO_POPUP gettext("Bad HTML!! Unable to create popup window!")
+#define POPUP_FAILED gettext("Unable to create popup window!")
+#define GOTO_DISALLOWED gettext("Goto a random URL is disallowed!")
+#define GOTO_NON_HTTP_DISALLOWED gettext("Goto a non-http URL is disallowed!")
+#define GOTO_XXXX_DISALLOWED gettext("You are not allowed to goto \"%s\" URLs")
+#define URL_TO_OPEN gettext("URL to open: ")
+#define EDIT_CURRENT_GOTO gettext("Edit the current Goto URL: ")
+#define EDIT_THE_PREV_GOTO gettext("Edit the previous Goto URL: ")
+#define EDIT_A_PREV_GOTO gettext("Edit a previous Goto URL: ")
+#define CURRENT_DOC_HAS_POST_DATA gettext("Current document has POST data.")
+#define EDIT_CURDOC_URL gettext("Edit this document's URL: ")
+#define EDIT_CURLINK_URL gettext("Edit the current link's URL: ")
+#define EDIT_SUBMIT_URL gettext("Edit the form's submit-URL: ")
+#define EDIT_FM_MENU_URLS_DISALLOWED gettext("You cannot edit File Management URLs")
+#define ENTER_DATABASE_QUERY gettext("Enter a database query: ")
+#define ENTER_WHEREIS_QUERY gettext("Enter a whereis query: ")
+#define EDIT_CURRENT_QUERY gettext("Edit the current query: ")
+#define EDIT_THE_PREV_QUERY gettext("Edit the previous query: ")
+#define EDIT_A_PREV_QUERY gettext("Edit a previous query: ")
+#define USE_C_R_TO_RESUB_CUR_QUERY \
+ gettext("Use Control-R to resubmit the current query.")
+#define EDIT_CURRENT_SHORTCUT gettext("Edit the current shortcut: ")
+#define EDIT_THE_PREV_SHORTCUT gettext("Edit the previous shortcut: ")
+#define EDIT_A_PREV_SHORTCUT gettext("Edit a previous shortcut: ")
+#define KEY_NOT_MAPPED_TO_JUMP_FILE gettext("Key '%c' is not mapped to a jump file!")
+#define CANNOT_LOCATE_JUMP_FILE gettext("Cannot locate jump file!")
+#define CANNOT_OPEN_JUMP_FILE gettext("Cannot open jump file!")
+#define ERROR_READING_JUMP_FILE gettext("Error reading jump file!")
+#define OUTOF_MEM_FOR_JUMP_FILE gettext("Out of memory reading jump file!")
+#define OUTOF_MEM_FOR_JUMP_TABLE gettext("Out of memory reading jump table!")
+#define NO_INDEX_FILE gettext("No index is currently available.")
+#define CONFIRM_MAIN_SCREEN \
+ gettext("Do you really want to go to the Main screen?")
+#define IN_MAIN_SCREEN gettext("You are already at main screen!")
+#define NOT_ISINDEX \
+ gettext("Not a searchable indexed document -- press '/' to search for a text string")
+#define NO_OWNER \
+ gettext("No owner is defined for this file so you cannot send a comment")
+#define NO_OWNER_USE gettext("No owner is defined. Use %s?")
+#define CONFIRM_COMMENT gettext("Do you wish to send a comment?")
+#define MAIL_DISALLOWED gettext("Mail is disallowed so you cannot send a comment")
+#define EDIT_DISABLED gettext("The 'e'dit command is currently disabled.")
+#define ANYEDIT_DISABLED gettext("External editing is currently disabled.")
+#define NO_STATUS gettext("System error - failure to get status.")
+#define NO_EDITOR gettext("No editor is defined!")
+#define PRINT_DISABLED gettext("The 'p'rint command is currently disabled.")
+#define NO_TOOLBAR gettext("Document has no Toolbar links or Banner.")
+#define CANNOT_OPEN_TRAV_FILE gettext("Unable to open traversal file.")
+#define CANNOT_OPEN_TRAF_FILE gettext("Unable to open traversal found file.")
+#define CANNOT_OPEN_REJ_FILE gettext("Unable to open reject file.")
+#define NOOPEN_TRAV_ERR_FILE gettext("Unable to open traversal errors output file")
+#define TRAV_WAS_INTERRUPTED gettext("TRAVERSAL WAS INTERRUPTED")
+#define FOLLOW_LINK_NUMBER gettext("Follow link (or goto link or page) number: ")
+#define SELECT_OPTION_NUMBER gettext("Select option (or page) number: ")
+#define OPTION_ALREADY_CURRENT gettext("Option number %d already is current.")
+#define ALREADY_AT_OPTION_END \
+ gettext("You are already at the end of this option list.")
+#define ALREADY_AT_OPTION_BEGIN \
+ gettext("You are already at the beginning of this option list.")
+#define ALREADY_AT_OPTION_PAGE \
+ gettext("You are already at page %d of this option list.")
+#define BAD_OPTION_NUM_ENTERED gettext("You have entered an invalid option number.")
+#define BAD_HTML_USE_TRACE gettext("** Bad HTML!! Use -trace to diagnose. **")
+#define GIVE_FILENAME gettext("Give name of file to save in")
+#define CANNOT_SAVE_REMOTE gettext("Can't save data to file -- please run WWW locally")
+#define CANNOT_OPEN_TEMP gettext("Can't open temporary file!")
+#define CANNOT_OPEN_OUTPUT gettext("Can't open output file! Cancelling!")
+#define EXECUTION_DISABLED gettext("Execution is disabled.")
+#define EXECUTION_DISABLED_FOR_FILE \
+ gettext("Execution is not enabled for this file. See the Options menu (use %s).")
+#define EXECUTION_NOT_COMPILED \
+ gettext("Execution capabilities are not compiled into this version.")
+#define CANNOT_DISPLAY_FILE gettext("This file cannot be displayed on this terminal.")
+#define CANNOT_DISPLAY_FILE_D_OR_C \
+ gettext("This file cannot be displayed on this terminal: D)ownload, or C)ancel")
+#define MSG_DOWNLOAD_OR_CANCEL gettext("%s D)ownload, or C)ancel")
+#define CANCELLING_FILE gettext("Cancelling file.")
+#define RETRIEVING_FILE gettext("Retrieving file. - PLEASE WAIT -")
+#define FILENAME_PROMPT gettext("Enter a filename: ")
+#define EDIT_THE_PREV_FILENAME gettext("Edit the previous filename: ")
+#define EDIT_A_PREV_FILENAME gettext("Edit a previous filename: ")
+#define NEW_FILENAME_PROMPT gettext("Enter a new filename: ")
+#define FILENAME_CANNOT_BE_DOT gettext("File name may not begin with a dot.")
+#ifdef VMS
+#define FILE_EXISTS_HPROMPT gettext("File exists. Create higher version?")
+#else
+#define FILE_EXISTS_OPROMPT gettext("File exists. Overwrite?")
+#endif /* VMS */
+#define CANNOT_WRITE_TO_FILE gettext("Cannot write to file.")
+#define MISCONF_DOWNLOAD_COMMAND gettext("ERROR! - download command is misconfigured.")
+#define CANNOT_DOWNLOAD_FILE gettext("Unable to download file.")
+#define READING_DIRECTORY gettext("Reading directory...")
+#define BUILDING_DIR_LIST gettext("Building directory listing...")
+#define SAVING gettext("Saving...")
+#define COULD_NOT_EDIT_FILE gettext("Could not edit file '%s'.")
+#define COULD_NOT_ACCESS_DOCUMENT gettext("Unable to access document!")
+#define COULD_NOT_ACCESS_FILE gettext("Could not access file.")
+#define COULD_NOT_ACCESS_DIR gettext("Could not access directory.")
+#define COULD_NOT_LOAD_DATA gettext("Could not load data.")
+#define CANNOT_EDIT_REMOTE_FILES \
+ gettext("Lynx cannot currently (e)dit remote WWW files.")
+#define CANNOT_EDIT_FIELD \
+ gettext("This field cannot be (e)dited with an external editor.")
+#define RULE_INCORRECT gettext("Bad rule")
+#define RULE_NEEDS_DATA gettext("Insufficient operands:")
+#define NOAUTH_TO_EDIT_FILE gettext("You are not authorized to edit this file.")
+#define TITLE_PROMPT gettext("Title: ")
+#define SUBJECT_PROMPT gettext("Subject: ")
+#define USERNAME_PROMPT gettext("Username: ")
+#define PASSWORD_PROMPT gettext("Password: ")
+#define USERNAME_PASSWORD_REQUIRED gettext("lynx: Username and Password required!!!")
+#define PASSWORD_REQUIRED gettext("lynx: Password required!!!")
+#define CLEAR_ALL_AUTH_INFO gettext("Clear all authorization info for this session?")
+#define AUTH_INFO_CLEARED gettext("Authorization info cleared.")
+#define AUTH_FAILED_PROMPT gettext("Authorization failed. Retry?")
+#define CGI_DISABLED gettext("cgi support has been disabled.")
+#define CGI_NOT_COMPILED \
+ gettext("Lynxcgi capabilities are not compiled into this version.")
+#define CANNOT_CONVERT_I_TO_O gettext("Sorry, no known way of converting %s to %s.")
+#define CONNECT_SET_FAILED gettext("Unable to set up connection.")
+#define CONNECT_FAILED gettext("Unable to make connection")
+#define MALFORMED_EXEC_REQUEST \
+ gettext("Executable link rejected due to malformed request.")
+#define BADCHAR_IN_EXEC_LINK \
+ gettext("Executable link rejected due to `%c' character.")
+#define RELPATH_IN_EXEC_LINK \
+ gettext("Executable link rejected due to relative path string ('../').")
+#define BADLOCPATH_IN_EXEC_LINK \
+ gettext("Executable link rejected due to location or path.")
+#define MAIL_DISABLED gettext("Mail access is disabled!")
+#define ACCESS_ONLY_LOCALHOST \
+ gettext("Only files and servers on the local host can be accessed.")
+#define TELNET_DISABLED gettext("Telnet access is disabled!")
+#define TELNET_PORT_SPECS_DISABLED \
+ gettext("Telnet port specifications are disabled.")
+#define NEWS_DISABLED gettext("USENET news access is disabled!")
+#define RLOGIN_DISABLED gettext("Rlogin access is disabled!")
+#define FTP_DISABLED gettext("Ftp access is disabled!")
+#define NO_REFS_FROM_DOC gettext("There are no references from this document.")
+#define NO_VISIBLE_REFS_FROM_DOC gettext("There are only hidden links from this document.")
+#ifdef VMS
+#define CANNOT_OPEN_COMFILE gettext("Unable to open command file.")
+#endif /* VMS */
+#define NEWS_POST_CANCELLED gettext("News Post Cancelled!!!")
+#define SPAWNING_EDITOR_FOR_NEWS \
+ gettext("Spawning your selected editor to edit news message")
+#define POST_MSG_PROMPT gettext("Post this message?")
+#define APPEND_SIG_FILE gettext("Append '%s'?")
+#define POSTING_TO_NEWS gettext("Posting to newsgroup(s)...")
+#ifdef VMS
+#define HAVE_UNREAD_MAIL_MSG gettext("*** You have unread mail. ***")
+#else
+#define HAVE_MAIL_MSG gettext("*** You have mail. ***")
+#endif /* VMS */
+#define HAVE_NEW_MAIL_MSG gettext("*** You have new mail. ***")
+#define FILE_INSERT_CANCELLED gettext("File insert cancelled!!!")
+#define MEMORY_EXHAUSTED_FILE gettext("Not enough memory for file!")
+#define FILE_CANNOT_OPEN_R gettext("Can't open file for reading.")
+#define FILE_DOES_NOT_EXIST gettext("File does not exist.")
+#define FILE_DOES_NOT_EXIST_RE gettext("File does not exist - reenter or cancel:")
+#define FILE_NOT_READABLE gettext("File is not readable.")
+#define FILE_NOT_READABLE_RE gettext("File is not readable - reenter or cancel:")
+#define FILE_INSERT_0_LENGTH gettext("Nothing to insert - file is 0-length.")
+#define SAVE_REQUEST_CANCELLED gettext("Save request cancelled!!!")
+#define MAIL_REQUEST_CANCELLED gettext("Mail request cancelled!!!")
+#define CONFIRM_MAIL_SOURCE_PREPARSED \
+ gettext("Viewing preparsed source. Are you sure you want to mail it?")
+#define PLEASE_WAIT gettext("Please wait...")
+#define MAILING_FILE gettext("Mailing file. Please wait...")
+#define MAIL_REQUEST_FAILED gettext("ERROR - Unable to mail file")
+#define CONFIRM_LONG_SCREEN_PRINT \
+ gettext("File is %d screens long. Are you sure you want to print?")
+#define PRINT_REQUEST_CANCELLED gettext("Print request cancelled!!!")
+#define PRESS_RETURN_TO_BEGIN gettext("Press <return> to begin: ")
+#define PRESS_RETURN_TO_FINISH gettext("Press <return> to finish: ")
+#define CONFIRM_LONG_PAGE_PRINT \
+ gettext("File is %d pages long. Are you sure you want to print?")
+#define CHECK_PRINTER \
+ gettext("Be sure your printer is on-line. Press <return> to start printing:")
+#define FILE_ALLOC_FAILED gettext("ERROR - Unable to allocate file space!!!")
+#define UNABLE_TO_OPEN_TEMPFILE gettext("Unable to open tempfile")
+#define UNABLE_TO_OPEN_PRINTOP_FILE gettext("Unable to open print options file")
+#define PRINTING_FILE gettext("Printing file. Please wait...")
+#define MAIL_ADDRESS_PROMPT gettext("Please enter a valid internet mail address: ")
+#define PRINTER_MISCONF_ERROR gettext("ERROR! - printer is misconfigured!")
+#define FAILED_MAP_POST_REQUEST gettext("Image map from POST response not available!")
+#define MISDIRECTED_MAP_REQUEST gettext("Misdirected client-side image MAP request!")
+#define MAP_NOT_ACCESSIBLE gettext("Client-side image MAP is not accessible!")
+#define MAPS_NOT_AVAILABLE gettext("No client-side image MAPs are available!")
+#define MAP_NOT_AVAILABLE gettext("Client-side image MAP is not available!")
+#ifndef NO_OPTION_MENU
+#define OPTION_SCREEN_NEEDS_24 \
+ gettext("Screen height must be at least 24 lines for the Options menu!")
+#define OPTION_SCREEN_NEEDS_23 \
+ gettext("Screen height must be at least 23 lines for the Options menu!")
+#define OPTION_SCREEN_NEEDS_22 \
+ gettext("Screen height must be at least 22 lines for the Options menu!")
+#endif /* !NO_OPTION_MENU */
+#define NEED_ADVANCED_USER_MODE gettext("That key requires Advanced User mode.")
+#define CONTENT_TYPE_MSG gettext("Content-type: %s")
+#define COMMAND_PROMPT gettext("Command: ")
+#define COMMAND_UNKNOWN gettext("Unknown or ambiguous command")
+#define VERSION_SEGMENT gettext(" Version ")
+#define FIRST_SEGMENT gettext(" first")
+#define GUESSING_SEGMENT gettext(", guessing...")
+#define PERMISSIONS_SEGMENT gettext("Permissions for ")
+#define SELECT_SEGMENT gettext("Select ")
+#define CAP_LETT_SEGMENT gettext("capital letter")
+#define OF_OPT_LINE_SEGMENT gettext(" of option line,")
+#define TO_SAVE_SEGMENT gettext(" to save,")
+#define TO_SEGMENT gettext(" to ")
+#define OR_SEGMENT gettext(" or ")
+#define INDEX_SEGMENT gettext(" index")
+#define TO_RETURN_SEGMENT gettext(" to return to Lynx.")
+#define ACCEPT_CHANGES gettext("Accept Changes")
+#define RESET_CHANGES gettext("Reset Changes")
+#define CANCEL_CHANGES gettext("Left Arrow cancels changes")
+#define SAVE_OPTIONS gettext("Save options to disk")
+#define ACCEPT_DATA gettext("Hit RETURN to accept entered data.")
+#define ACCEPT_DATA_OR_DEFAULT \
+ gettext("Hit RETURN to accept entered data. Delete data to invoke the default.")
+#define VALUE_ACCEPTED gettext("Value accepted!")
+#define VALUE_ACCEPTED_WARNING_X \
+ gettext("Value accepted! -- WARNING: Lynx is configured for XWINDOWS!")
+#define VALUE_ACCEPTED_WARNING_NONX \
+ gettext("Value accepted! -- WARNING: Lynx is NOT configured for XWINDOWS!")
+#define EDITOR_LOCKED gettext("You are not allowed to change which editor to use!")
+#define FAILED_TO_SET_DISPLAY gettext("Failed to set DISPLAY variable!")
+#define FAILED_CLEAR_SET_DISPLAY gettext("Failed to clear DISPLAY variable!")
+#define BOOKMARK_CHANGE_DISALLOWED \
+ gettext("You are not allowed to change the bookmark file!")
+#define COLOR_TOGGLE_DISABLED gettext("Terminal does not support color")
+#define COLOR_TOGGLE_DISABLED_FOR_TERM gettext("Your '%s' terminal does not support color.")
+#define DOTFILE_ACCESS_DISABLED gettext("Access to dot files is disabled!")
+#define UA_NO_LYNX_WARNING \
+ gettext("User-Agent string does not contain \"Lynx\" or \"L_y_n_x\"")
+#define UA_PLEASE_USE_LYNX \
+ gettext("Use \"L_y_n_x\" or \"Lynx\" in User-Agent, or it looks like intentional deception!")
+#define UA_CHANGE_DISABLED \
+ gettext("Changing of the User-Agent string is disabled!")
+#define CHANGE_OF_SETTING_DISALLOWED \
+ gettext("You are not allowed to change this setting.")
+#define SAVING_OPTIONS gettext("Saving Options...")
+#define OPTIONS_SAVED gettext("Options saved!")
+#define OPTIONS_NOT_SAVED gettext("Unable to save Options!")
+#define R_TO_RETURN_TO_LYNX gettext(" 'r' to return to Lynx ")
+#define SAVE_OR_R_TO_RETURN_TO_LYNX gettext(" '>' to save, or 'r' to return to Lynx ")
+#define ANY_KEY_CHANGE_RET_ACCEPT \
+ gettext("Hit any key to change value; RETURN to accept.")
+#define ERROR_UNCOMPRESSING_TEMP gettext("Error uncompressing temporary file!")
+#define UNSUPPORTED_URL_SCHEME gettext("Unsupported URL scheme!")
+#define UNSUPPORTED_DATA_URL gettext("Unsupported data: URL! Use SHOWINFO, for now.")
+#define TOO_MANY_REDIRECTIONS gettext("Redirection limit of %d URL's reached.")
+#define ILLEGAL_REDIRECTION_URL gettext("Illegal redirection URL received from server!")
+#define SERVER_ASKED_FOR_REDIRECTION \
+ gettext("Server asked for %d redirection of POST content to")
+#define REDIRECTION_WITH_BAD_LOCATION "Got redirection with a bad Location header."
+#define REDIRECTION_WITH_NO_LOCATION "Got redirection with no Location header."
+#define PROCEED_GET_CANCEL gettext("P)roceed, use G)ET or C)ancel ")
+#define PROCEED_OR_CANCEL gettext("P)roceed, or C)ancel ")
+#define ADVANCED_POST_GET_REDIRECT \
+ gettext("Redirection of POST content. P)roceed, see U)RL, use G)ET or C)ancel")
+#define ADVANCED_POST_REDIRECT \
+ gettext("Redirection of POST content. P)roceed, see U)RL, or C)ancel")
+#define CONFIRM_POST_RESUBMISSION \
+ gettext("Document from Form with POST content. Resubmit?")
+#define CONFIRM_POST_RESUBMISSION_TO \
+ gettext("Resubmit POST content to %s ?")
+#define CONFIRM_POST_LIST_RELOAD \
+ gettext("List from document with POST data. Reload %s ?")
+#define CONFIRM_POST_DOC_HEAD \
+ gettext("Document from POST action, HEAD may not be understood. Proceed?")
+#define CONFIRM_POST_LINK_HEAD \
+ gettext("Form submit action is POST, HEAD may not be understood. Proceed?")
+#define CONFIRM_WO_PASSWORD gettext("Proceed without a username and password?")
+#define CONFIRM_PROCEED gettext("Proceed (%s)?")
+#define CANNOT_POST gettext("Cannot POST to this host.")
+#define IGNORED_POST gettext("POST not supported for this URL - ignoring POST data!")
+#define DISCARDING_POST_DATA gettext("Discarding POST data...")
+#define WILL_NOT_RELOAD_DOC gettext("Document will not be reloaded!")
+#define LOCATION_HEADER gettext("Location: ")
+#define STRING_NOT_FOUND gettext("'%s' not found!")
+#define MULTIBOOKMARKS_DEFAULT gettext("Default Bookmark File")
+#define MULTIBOOKMARKS_SMALL gettext("Screen too small! (8x35 min)")
+#define MULTIBOOKMARKS_SAVE gettext("Select destination or ^G to Cancel: ")
+#define MULTIBOOKMARKS_SELECT \
+ gettext("Select subbookmark, '=' for menu, or ^G to cancel: ")
+#define MULTIBOOKMARKS_SELF \
+ gettext("Reproduce L)ink in this bookmark file or C)ancel? (l,c): ")
+#define MULTIBOOKMARKS_DISALLOWED gettext("Multiple bookmark support is not available.")
+#define MULTIBOOKMARKS_SHEAD_MASK gettext(" Select Bookmark (screen %d of %d)")
+#define MULTIBOOKMARKS_SHEAD gettext(" Select Bookmark")
+#define MULTIBOOKMARKS_EHEAD_MASK \
+ gettext("Editing Bookmark DESCRIPTION and FILEPATH (%d of 2)")
+#define MULTIBOOKMARKS_EHEAD \
+ gettext(" Editing Bookmark DESCRIPTION and FILEPATH")
+#define MULTIBOOKMARKS_LETTER gettext("Letter: ")
+#ifdef VMS
+#define USE_PATH_OFF_HOME \
+ gettext("Use a filepath off your login directory in SHELL syntax!")
+#else
+#define USE_PATH_OFF_HOME gettext("Use a filepath off your home directory!")
+#endif /* VMS */
+#define MAXLINKS_REACHED \
+ gettext("Maximum links per page exceeded! Use half-page or two-line scrolling.")
+#define VISITED_LINKS_EMPTY gettext("No previously visited links available!")
+#define MEMORY_EXHAUSTED_ABORT gettext("Memory exhausted! Program aborted!")
+#define MEMORY_EXHAUSTED_ABORTING gettext("Memory exhausted! Aborting...")
+#define NOT_ENOUGH_MEMORY gettext("Not enough memory!")
+#define DFM_NOT_AVAILABLE gettext("Directory/File Manager not available")
+#define LOCATION_NOT_ABSOLUTE gettext("Location URL is not absolute.")
+#define REFRESH_URL_NOT_ABSOLUTE gettext("Refresh URL is not absolute.")
+#define SENDING_MESSAGE_WITH_BODY_TO \
+ gettext("You are sending a message with body to:\n ")
+#define SENDING_COMMENT_TO gettext("You are sending a comment to:\n ")
+#define WITH_COPY_TO gettext("\n With copy to:\n ")
+#define WITH_COPIES_TO gettext("\n With copies to:\n ")
+#define CTRL_G_TO_CANCEL_SEND \
+ gettext("\n\nUse Ctrl-G to cancel if you do not want to send a message\n")
+#define ENTER_NAME_OR_BLANK \
+ gettext("\n Please enter your name, or leave it blank to remain anonymous\n")
+#define ENTER_MAIL_ADDRESS_OR_OTHER \
+ gettext("\n Please enter a mail address or some other\n")
+#define MEANS_TO_CONTACT_FOR_RESPONSE \
+ gettext(" means to contact you, if you desire a response.\n")
+#define ENTER_SUBJECT_LINE gettext("\n Please enter a subject line.\n")
+#define ENTER_ADDRESS_FOR_CC \
+ gettext("\n Enter a mail address for a CC of your message.\n")
+#define BLANK_FOR_NO_COPY gettext(" (Leave blank if you don't want a copy.)\n")
+#define REVIEW_MESSAGE_BODY gettext("\n Please review the message body:\n\n")
+#define RETURN_TO_CONTINUE gettext("\nPress RETURN to continue: ")
+#define RETURN_TO_CLEANUP gettext("\nPress RETURN to clean up: ")
+#define CTRL_U_TO_ERASE gettext(" Use Control-U to erase the default.\n")
+#define ENTER_MESSAGE_BELOW gettext("\n Please enter your message below.")
+#define ENTER_PERIOD_WHEN_DONE_A \
+ gettext("\n When you are done, press enter and put a single period (.)")
+#define ENTER_PERIOD_WHEN_DONE_B \
+ gettext("\n on a line and press enter again.")
+
+/* Cookies messages */
+#define ADVANCED_COOKIE_CONFIRMATION \
+ gettext("%s cookie: %.*s=%.*s Allow? (Y/N/Always/neVer)")
+#define INVALID_COOKIE_DOMAIN_CONFIRMATION \
+ gettext("Accept invalid cookie domain=%s for '%s'?")
+#define INVALID_COOKIE_PATH_CONFIRMATION \
+ gettext("Accept invalid cookie path=%s as a prefix of '%s'?")
+#define ALLOWING_COOKIE gettext("Allowing this cookie.")
+#define REJECTING_COOKIE gettext("Rejecting this cookie.")
+#define COOKIE_JAR_IS_EMPTY gettext("The Cookie Jar is empty.")
+#define CACHE_JAR_IS_EMPTY gettext("The Cache Jar is empty.")
+#define ACTIVATE_TO_GOBBLE \
+ gettext("Activate links to gobble up cookies or entire domains,")
+#define OR_CHANGE_ALLOW gettext("or to change a domain's 'allow' setting.")
+#define COOKIES_NEVER_ALLOWED gettext("(Cookies never allowed.)")
+#define COOKIES_ALWAYS_ALLOWED gettext("(Cookies always allowed.)")
+#define COOKIES_ALLOWED_VIA_PROMPT gettext("(Cookies allowed via prompt.)")
+#define COOKIES_READ_FROM_FILE gettext("(Persistent Cookies.)")
+#define NO_TITLE gettext("(No title.)")
+#define NO_NAME gettext("(No name.)")
+#define NO_VALUE gettext("(No value.)")
+#define NO_NOTHING gettext("None")
+#define END_OF_SESSION gettext("(End of session.)")
+#define DELETE_COOKIE_CONFIRMATION gettext("Delete this cookie?")
+#define COOKIE_EATEN gettext("The cookie has been eaten!")
+#define DELETE_EMPTY_DOMAIN_CONFIRMATION gettext("Delete this empty domain?")
+#define DOMAIN_EATEN gettext("The domain has been eaten!")
+#define DELETE_COOKIES_SET_ALLOW_OR_CANCEL \
+ gettext("D)elete domain's cookies, set allow A)lways/P)rompt/neV)er, or C)ancel? ")
+#define DELETE_DOMAIN_SET_ALLOW_OR_CANCEL \
+ gettext("D)elete domain, set allow A)lways/P)rompt/neV)er, or C)ancel? ")
+#define DOMAIN_COOKIES_EATEN gettext("All cookies in the domain have been eaten!")
+#define ALWAYS_ALLOWING_COOKIES gettext("'A'lways allowing from domain '%s'.")
+#define NEVER_ALLOWING_COOKIES gettext("ne'V'er allowing from domain '%s'.")
+#define PROMPTING_TO_ALLOW_COOKIES gettext("'P'rompting to allow from domain '%s'.")
+#define DELETE_ALL_COOKIES_IN_DOMAIN gettext("Delete all cookies in this domain?")
+#define ALL_COOKIES_EATEN gettext("All of the cookies in the jar have been eaten!")
+
+#define PORT_NINETEEN_INVALID gettext("Port 19 not permitted in URLs.")
+#define PORT_TWENTYFIVE_INVALID gettext("Port 25 not permitted in URLs.")
+#define PORT_INVALID gettext("Port %lu not permitted in URLs.")
+#define URL_PORT_BAD gettext("URL has a bad port field.")
+#define HTML_STACK_OVERRUN gettext("Maximum nesting of HTML elements exceeded.")
+#define BAD_PARTIAL_REFERENCE gettext("Bad partial reference! Stripping lead dots.")
+#define TRACELOG_OPEN_FAILED gettext("Trace Log open failed. Trace off!")
+#define LYNX_TRACELOG_TITLE gettext("Lynx Trace Log")
+#define NO_TRACELOG_STARTED gettext("No trace log has been started for this session.")
+#define MAX_TEMPCOUNT_REACHED \
+ gettext("The maximum temporary file count has been reached!")
+#define FORM_VALUE_TOO_LONG \
+ gettext("Form field value exceeds buffer length! Trim the tail.")
+#define FORM_TAIL_COMBINED_WITH_HEAD \
+ gettext("Modified tail combined with head of form field value.")
+
+/* HTFile.c */
+#define ENTRY_IS_DIRECTORY gettext("Directory")
+#define DISALLOWED_DIR_SCAN gettext("Directory browsing is not allowed.")
+#define DISALLOWED_SELECTIVE_ACCESS gettext("Selective access is not enabled for this directory")
+#define FAILED_DIR_SCAN gettext("Multiformat: directory scan failed.")
+#define FAILED_DIR_UNREADABLE gettext("This directory is not readable.")
+#define FAILED_FILE_UNREADABLE gettext("Can't access requested file.")
+#define FAILED_NO_REPRESENTATION gettext("Could not find suitable representation for transmission.")
+#define FAILED_OPEN_COMPRESSED_FILE gettext("Could not open file for decompression!")
+#define LABEL_FILES gettext("Files:")
+#define LABEL_SUBDIRECTORIES gettext("Subdirectories:")
+#define SEGMENT_DIRECTORY gettext(" directory")
+#define SEGMENT_UP_TO gettext("Up to ")
+#define SEGMENT_CURRENT_DIR gettext("Current directory is ")
+
+/* HTFTP.c */
+#define ENTRY_IS_SYMBOLIC_LINK gettext("Symbolic Link")
+
+/* HTGopher.c */
+#define FAILED_NO_RESPONSE gettext("No response from server!")
+#define GOPHER_CSO_INDEX gettext("CSO index")
+#define GOPHER_CSO_INDEX_SUBTITLE gettext("\nThis is a searchable index of a CSO database.\n")
+#define GOPHER_CSO_SEARCH_RESULTS gettext("CSO Search Results")
+#define GOPHER_CSO_SEEK_FAILED gettext("Seek fail on %s\n")
+#define GOPHER_CSO_SOLICIT_KEYWORDS gettext("\nPress the 's' key and enter search keywords.\n")
+#define GOPHER_INDEX_SUBTITLE gettext("\nThis is a searchable Gopher index.\n")
+#define GOPHER_INDEX_TITLE gettext("Gopher index")
+#define GOPHER_MENU_TITLE gettext("Gopher Menu")
+#define GOPHER_SEARCH_RESULTS gettext(" Search Results")
+#define GOPHER_SENDING_CSO_REQUEST gettext("Sending CSO/PH request.")
+#define GOPHER_SENDING_REQUEST gettext("Sending Gopher request.")
+#define GOPHER_SENT_CSO_REQUEST gettext("CSO/PH request sent; waiting for response.")
+#define GOPHER_SENT_REQUEST gettext("Gopher request sent; waiting for response.")
+#define GOPHER_SOLICIT_KEYWORDS gettext("\nPlease enter search keywords.\n")
+#define SEGMENT_KEYWORDS_WILL gettext("\nThe keywords that you enter will allow you to search on a")
+#define SEGMENT_PERSONS_DB_NAME gettext(" person's name in the database.\n")
+
+/* HTNews.c */
+#define FAILED_CONNECTION_CLOSED gettext("Connection closed ???")
+#define FAILED_CANNOT_OPEN_POST gettext("Cannot open temporary file for news POST.")
+#define FAILED_CANNOT_POST_SSL gettext("This client does not contain support for posting to news with SSL.")
+
+/* HTStyle.c */
+#define STYLE_DUMP_FONT gettext("Style %d `%s' SGML:%s. Font %s %.1f point.\n")
+#define STYLE_DUMP_INDENT gettext("\tIndents: first=%.0f others=%.0f, Height=%.1f Desc=%.1f\n"
+#define STYLE_DUMP_ALIGN gettext("\tAlign=%d, %d tabs. (%.0f before, %.0f after)\n")
+#define STYLE_DUMP_TAB gettext("\t\tTab kind=%d at %.0f\n")
+
+/* HTTP.c */
+#define FAILED_NEED_PASSWD gettext("Can't proceed without a username and password.")
+#define FAILED_RETRY_WITH_AUTH gettext("Can't retry with authorization! Contact the server's WebMaster.")
+#define FAILED_RETRY_WITH_PROXY gettext("Can't retry with proxy authorization! Contact the server's WebMaster.")
+#define HTTP_RETRY_WITH_PROXY gettext("Retrying with proxy authorization information.")
+#define SSL_FORCED_PROMPT gettext("SSL error:%s-Continue?")
+
+/* HTWAIS.c */
+#define HTWAIS_MESSAGE_TOO_BIG gettext("HTWAIS: Return message too large.")
+#define HTWAIS_SOLICIT_QUERY gettext("Enter WAIS query: ")
+
+/* Miscellaneous status */
+#define RETRYING_AS_HTTP0 gettext("Retrying as HTTP0 request.")
+#define TRANSFERRED_X_BYTES gettext("Transferred %d bytes")
+#define TRANSFER_COMPLETE gettext("Data transfer complete")
+#define FAILED_READING_KEYMAP gettext("Error processing line %d of %s\n")
+
+/* Lynx internal page titles */
+#define ADDRLIST_PAGE_TITLE gettext("Address List Page")
+#define BOOKMARK_TITLE gettext("Bookmark file")
+#define CONFIG_DEF_TITLE gettext("Configuration Definitions")
+#define COOKIE_JAR_TITLE gettext("Cookie Jar")
+#define CURRENT_EDITMAP_TITLE gettext("Current Edit-Key Map")
+#define CURRENT_KEYMAP_TITLE gettext("Current Key Map")
+#define DIRED_MENU_TITLE gettext("File Management Options")
+#define DOWNLOAD_OPTIONS_TITLE gettext("Download Options")
+#define HISTORY_PAGE_TITLE gettext("History Page")
+#define CACHE_JAR_TITLE gettext("Cache Jar")
+#define LIST_PAGE_TITLE gettext("List Page")
+#define LYNXCFG_TITLE gettext("Lynx.cfg Information")
+#define MOSAIC_BOOKMARK_TITLE gettext("Converted Mosaic Hotlist")
+#define OPTIONS_TITLE gettext("Options Menu")
+#define PERMIT_OPTIONS_TITLE gettext("File Permission Options")
+#define PRINT_OPTIONS_TITLE gettext("Printing Options")
+#define SHOWINFO_TITLE gettext("Information about the current document")
+#define STATUSLINES_TITLE gettext("Your recent statusline messages")
+#define UPLOAD_OPTIONS_TITLE gettext("Upload Options")
+#define VISITED_LINKS_TITLE gettext("Visited Links Page")
+
+/* CONFIG_DEF_TITLE subtitles */
+#define SEE_ALSO gettext("See also")
+#define YOUR_SEGMENT gettext("your")
+#define RUNTIME_OPT_SEGMENT gettext("for runtime options")
+#define COMPILE_OPT_SEGMENT gettext("compile time options")
+#define COLOR_STYLE_SEGMENT gettext("color-style configuration")
+#define REL_VERSION gettext("latest release")
+#define PRE_VERSION gettext("pre-release version")
+#define DEV_VERSION gettext("development version")
+#define AUTOCONF_CONFIG_CACHE \
+ gettext("The following data were derived during the automatic configuration/build\n\
+process of this copy of Lynx. When reporting a bug, please include a copy\n\
+of this page.")
+#define AUTOCONF_LYNXCFG_H \
+ gettext("The following data were used as automatically-configured compile-time\n\
+definitions when this copy of Lynx was built.")
+
+#ifdef DIRED_SUPPORT
+#define DIRED_NOVICELINE \
+ gettext(" C)reate D)ownload E)dit F)ull menu M)odify R)emove T)ag U)pload \n")
+#define CURRENT_LINK_STATUS_FAILED gettext("Failed to obtain status of current link!")
+
+#define INVALID_PERMIT_URL \
+ gettext("Special URL only valid from current File Permission menu!")
+#endif /* DIRED_SUPPORT */
+
+#ifdef USE_EXTERNALS
+#define EXTERNALS_DISABLED gettext("External support is currently disabled.")
+#endif /* USE_EXTERNALS */
+
+/* new with 2.8.4dev.21 */
+#define CHDIR_DISABLED gettext("Changing working-directory is currently disabled.")
+#define LINEWRAP_OFF gettext("Linewrap OFF!")
+#define LINEWRAP_ON gettext("Linewrap ON!")
+#define NESTED_TABLES_OFF gettext("Parsing nested-tables toggled OFF! Reloading...")
+#define NESTED_TABLES_ON gettext("Parsing nested-tables toggled ON! Reloading...")
+#define SHIFT_VS_LINEWRAP gettext("Shifting is disabled while line-wrap is in effect")
+#define TRACE_DISABLED gettext("Trace not supported")
+
+#endif /* LYMESSAGES_EN_H */
diff --git a/PACKAGE/debian/changelog b/PACKAGE/debian/changelog
new file mode 100644
index 0000000..6ffe1b8
--- /dev/null
+++ b/PACKAGE/debian/changelog
@@ -0,0 +1,71 @@
+lynx-dev (2.9.0dev.12) unstable; urgency=low
+
+ * maintenance updates
+
+ -- Thomas E. Dickey <dickey@invisible-island.net> Mon, 02 Jan 2023 18:47:08 -0500
+
+lynx-dev (2.8.8dev.16) unstable; urgency=high
+
+ * changes for dev.16
+
+ -- Thomas E. Dickey <dickey@invisible-island.net> Tue, 30 Apr 2013 04:32:34 -0400
+
+lynx-dev (2.8.8dev.15) unstable; urgency=high
+
+ * changes for dev.15
+
+ -- Thomas E. Dickey <dickey@invisible-island.net> Thu, 08 Nov 2012 17:39:36 -0500
+
+lynx-dev (2.8.8dev.14) unstable; urgency=high
+
+ * fix regression in dev.13
+
+ -- Thomas E. Dickey <dickey@invisible-island.net> Wed, 22 Aug 2012 06:22:28 -0400
+
+lynx-dev (2.8.8dev.13) unstable; urgency=low
+
+ * changes for dev.13
+
+ -- Thomas E. Dickey <dickey@invisible-island.net> Sat, 07 Jul 2012 10:55:34 -0400
+
+lynx-dev (2.8.8dev.12) unstable; urgency=low
+
+ * changes for dev.12
+
+ -- Thomas E. Dickey <dickey@invisible-island.net> Wed, 22 Feb 2012 20:23:20 -0500
+
+lynx-dev (2.8.8dev.11) unstable; urgency=low
+
+ * changes for dev.11
+
+ -- Thomas E. Dickey <dickey@invisible-island.net> Wed, 15 Feb 2012 18:43:49 -0500
+
+lynx-dev (2.8.8dev.10) unstable; urgency=low
+
+ * changes for dev.10
+
+ -- Thomas E. Dickey <dickey@invisible-island.net> Thu, 06 Oct 2011 18:19:01 -0400
+
+lynx-dev (2.8.8dev.9) unstable; urgency=low
+
+ * changes for dev.9
+
+ -- Thomas E. Dickey <dickey@invisible-island.net> Wed, 27 Apr 2011 19:38:05 -0400
+
+lynx-dev (2.8.8dev.8) unstable; urgency=low
+
+ * changes for dev.8
+
+ -- Thomas E. Dickey <dickey@invisible-island.net> Sun, 19 Dec 2010 18:49:04 -0500
+
+lynx-dev (2.8.8dev.7) unstable; urgency=low
+
+ * changes for dev.7
+
+ -- Thomas E. Dickey <dickey@invisible-island.net> Mon, 01 Nov 2010 17:32:06 -0400
+
+lynx-dev (2.8.8dev.6) unstable; urgency=low
+
+ * add build-script for testing, adapted from Debian lynx-cur package.
+
+ -- Thomas E. Dickey <dickey@invisible-island.net> Sat, 18 Sep 2010 07:14:46 -0400
diff --git a/PACKAGE/debian/compat b/PACKAGE/debian/compat
new file mode 100644
index 0000000..f599e28
--- /dev/null
+++ b/PACKAGE/debian/compat
@@ -0,0 +1 @@
+10
diff --git a/PACKAGE/debian/control b/PACKAGE/debian/control
new file mode 100644
index 0000000..1875ece
--- /dev/null
+++ b/PACKAGE/debian/control
@@ -0,0 +1,21 @@
+Source: lynx-dev
+Section: web
+Priority: optional
+Maintainer: Thomas E. Dickey <dickey@invisible-island.net>
+Homepage: https://invisible-island.net/lynx/
+Build-Depends: debhelper (>= 7), dpatch, po-debconf, libncursesw5-dev, zlib1g-dev, gettext, libgnutls-dev, sharutils, telnet, openssh-client, libbsd-dev, libidn11-dev
+Standards-Version: 3.8.2
+
+Package: lynx-dev
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}
+Provides: www-browser, news-reader
+Recommends: mime-support
+Description: Text-mode WWW Browser with NLS support (development version)
+ Lynx is a fully-featured World Wide Web (WWW) client for users running
+ cursor-addressable, character-cell display devices. It is very fast and easy
+ to use. It will display HTML documents containing links to files residing on
+ the local system, as well as files residing on remote systems running Gopher,
+ HTTP, FTP, WAIS, and NNTP servers.
+ .
+ This package contains a development version of lynx.
diff --git a/PACKAGE/debian/copyright b/PACKAGE/debian/copyright
new file mode 100644
index 0000000..ca2d318
--- /dev/null
+++ b/PACKAGE/debian/copyright
@@ -0,0 +1,103 @@
+Upstream source https://lynx.invisible-island.net/current/
+
+Current maintainer: Thomas Dickey <dickey@invisible-island.net>
+
+-------------------------------------------------------------------------------
+
+Copyright 1997-2022,2023 Thomas E. Dickey
+Copyright (C) 1995 University of Kansas.
+
+Most of the content of the lynx release (and corresponding copyright) is
+the work of developers on the lynx-dev mailing list, who have agreed to
+distribute their work under the terms and conditions of the GNU General
+Public License (Version 2). Note that the License text after the terms
+and conditions is advisory in nature, and contains neither terms nor
+conditions. You may choose to follow that advice.
+
+Any licensing questions should be directed to the mailing list:
+
+ lynx-dev@nongnu.org
+
+or to the maintainer (Thomas E. Dickey):
+
+ dickey@invisible-island.net
+
+-------------------------------------------------------------------------------
+
+Files: aclocal.m4
+License: other-BSD
+Copyright: 1997-2022,2023 by Thomas E. Dickey
+ Permission to use, copy, modify, and distribute this software and its
+ documentation for any purpose and without fee is hereby granted,
+ provided that the above copyright notice appear in all copies and that
+ both that copyright notice and this permission notice appear in
+ supporting documentation, and that the name of the above listed
+ copyright holder(s) not be used in advertising or publicity pertaining
+ to distribution of the software without specific, written prior
+ permission.
+
+ THE ABOVE LISTED COPYRIGHT HOLDER(S) DISCLAIM ALL WARRANTIES WITH REGARD
+ TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS, IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE
+ LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+Files: install-sh
+Copyright: 1994 X Consortium
+License: other-BSD
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to
+ deal in the Software without restriction, including without limitation the
+ rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ sell copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+ TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ Except as contained in this notice, the name of the X Consortium shall not
+ be used in advertising or otherwise to promote the sale, use or other deal-
+ ings in this Software without prior written authorization from the X Consor-
+ tium.
+
+ FSF changes to this file are in the public domain.
+
+ Calling this script install-sh is preferred over install.sh, to prevent
+ `make' implicit rules from creating a file called install from it
+ when there is no Makefile.
+
+ This script is compatible with the BSD install script, but was written
+ from scratch. It can only install one file at a time, a restriction
+ shared with many OS's install programs.
+
+Files: debian/*
+Copyright: 2010-2019,2020 Thomas E. Dickey
+License: other-BSD
+ Permission to use, copy, modify, and distribute this software and its
+ documentation for any purpose and without fee is hereby granted,
+ provided that the above copyright notice appear in all copies and that
+ both that copyright notice and this permission notice appear in
+ supporting documentation, and that the name of the above listed
+ copyright holder(s) not be used in advertising or publicity pertaining
+ to distribution of the software without specific, written prior
+ permission.
+
+ THE ABOVE LISTED COPYRIGHT HOLDER(S) DISCLAIM ALL WARRANTIES WITH REGARD
+ TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS, IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE
+ LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+On Debian systems, the complete text of the GNU General
+Public License can be found in '/usr/share/common-licenses/GPL-2'
diff --git a/PACKAGE/debian/doc-base b/PACKAGE/debian/doc-base
new file mode 100644
index 0000000..ef651b7
--- /dev/null
+++ b/PACKAGE/debian/doc-base
@@ -0,0 +1,10 @@
+Document: lynx-dev
+Title: Debian Lynx Manual
+Author: Michael Grobe <grobe@ukans.edu> et al.
+Abstract: This manual describes what lynx-dev is
+ and how it can be used on Debian systems.
+Section: Network/Web Browsing
+
+Format: HTML
+Index: /usr/share/doc/lynx-dev/help_dir/lynx_help_main.html.gz
+Files: /usr/share/doc/lynx-dev/help_dir/*.html.gz
diff --git a/PACKAGE/debian/lynx-dev.lintian-overrides b/PACKAGE/debian/lynx-dev.lintian-overrides
new file mode 100644
index 0000000..fe1f251
--- /dev/null
+++ b/PACKAGE/debian/lynx-dev.lintian-overrides
@@ -0,0 +1,22 @@
+# Lynx's version-numbering is not understood by lintian, though legal.
+lynx-dev: rc-version-greater-than-expected-version
+
+# This is intentional because it is referenced from the documentation.
+lynx-dev: extra-license-file usr/share/doc/lynx-dev/COPYING
+
+# These are intentional, part of the sample files:
+lynx-dev: zero-byte-file-in-doc-directory usr/share/doc/lynx-dev/test/X
+lynx-dev: zero-byte-file-in-doc-directory usr/share/doc/lynx-dev/test/nobody
+
+lynx-dev: national-encoding usr/share/doc/lynx-dev/test/ALT88592.html
+lynx-dev: national-encoding usr/share/doc/lynx-dev/test/iso-8859-1.html
+lynx-dev: national-encoding usr/share/doc/lynx-dev/test/iso-8859-2.html
+
+# These are a known problem with lintian:
+# https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=891301
+lynx-dev: privacy-breach-generic usr/share/doc/lynx-dev/test/ALT88592.html [<link rev="owner" href="http://mail.gnu.org/mailman/listinfo/lynx-dev/">] (http://mail.gnu.org/mailman/listinfo/lynx-dev/)
+lynx-dev: privacy-breach-generic usr/share/doc/lynx-dev/test/bad-html.html [<link rev="owner" href="http://mail.gnu.org/mailman/listinfo/lynx-dev/">] (http://mail.gnu.org/mailman/listinfo/lynx-dev/)
+lynx-dev: privacy-breach-generic usr/share/doc/lynx-dev/test/cp-1252.html [<link rev="owner" href="http://mail.gnu.org/mailman/listinfo/lynx-dev/">] (http://mail.gnu.org/mailman/listinfo/lynx-dev/)
+lynx-dev: privacy-breach-generic usr/share/doc/lynx-dev/test/cp-1252a.html [<link rev="owner" href="http://mail.gnu.org/mailman/listinfo/lynx-dev/">] (http://mail.gnu.org/mailman/listinfo/lynx-dev/)
+lynx-dev: privacy-breach-generic usr/share/doc/lynx-dev/test/iso-8859-2.html [<link rev="owner" href="http://mail.gnu.org/mailman/listinfo/lynx-dev/">] (http://mail.gnu.org/mailman/listinfo/lynx-dev/)
+lynx-dev: privacy-breach-generic usr/share/doc/lynx-dev/test/iso-8859-2a.html [<link rev="owner" href="http://mail.gnu.org/mailman/listinfo/lynx-dev/">] (http://mail.gnu.org/mailman/listinfo/lynx-dev/)
diff --git a/PACKAGE/debian/menu b/PACKAGE/debian/menu
new file mode 100644
index 0000000..6421345
--- /dev/null
+++ b/PACKAGE/debian/menu
@@ -0,0 +1,2 @@
+?package(lynx-dev):needs="text" section="Applications/Network/Web Browsing"\
+ title="Lynx-dev" command="lynx-dev"
diff --git a/PACKAGE/debian/mime b/PACKAGE/debian/mime
new file mode 100644
index 0000000..4777956
--- /dev/null
+++ b/PACKAGE/debian/mime
@@ -0,0 +1,2 @@
+text/html; /usr/bin/lynx -force_html %s; needsterminal; description=HTML Text; nametemplate=%s.html; priority=3
+text/html; /usr/bin/lynx -dump -force_html %s; copiousoutput; description=HTML Text; nametemplate=%s.html; priority=2
diff --git a/PACKAGE/debian/postinst b/PACKAGE/debian/postinst
new file mode 100644
index 0000000..89955d4
--- /dev/null
+++ b/PACKAGE/debian/postinst
@@ -0,0 +1,27 @@
+#! /bin/sh
+# postinst script for lynx
+
+set -e
+
+PRI=50
+ALT=lynx
+PKG=lynx-dev
+
+BINDIR=/usr/bin
+MANDIR=/usr/share/man/man1
+
+if [ $1 != "upgrade" ]
+then
+
+ update-alternatives \
+ --install \
+ $BINDIR/$ALT $ALT \
+ $BINDIR/$PKG $PRI \
+ --slave $MANDIR/$ALT.1.gz $ALT.1.gz \
+ $MANDIR/$PKG.1.gz
+
+fi
+
+#DEBHELPER#
+
+exit 0
diff --git a/PACKAGE/debian/prerm b/PACKAGE/debian/prerm
new file mode 100644
index 0000000..a79bf38
--- /dev/null
+++ b/PACKAGE/debian/prerm
@@ -0,0 +1,12 @@
+#! /bin/sh
+# prerm script for lynx
+
+set -e
+
+if [ $1 != "upgrade" ]; then
+ update-alternatives --remove lynx /usr/bin/lynx-dev
+fi
+
+#DEBHELPER#
+
+exit 0
diff --git a/PACKAGE/debian/rules b/PACKAGE/debian/rules
new file mode 100755
index 0000000..92dc7fc
--- /dev/null
+++ b/PACKAGE/debian/rules
@@ -0,0 +1,197 @@
+#!/usr/bin/make -f
+# $LynxId: rules,v 1.17 2022/03/30 00:33:39 tom Exp $
+
+# Uncomment this to turn on verbose mode.
+#export DH_VERBOSE=1
+
+# These are used for cross-compiling and for saving the configure script
+# from having to guess our platform (since we know it already)
+DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
+DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)
+
+PKG_SUFFIX = -dev
+
+PACKAGE := $(shell dpkg-parsechangelog| \
+ sed -n 's/^Source: \(.*\)$$/\1/p')
+
+docdir := /usr/share/doc/$(PACKAGE)
+helpdir := $(docdir)/help_dir
+
+DSTDIR := $(CURDIR)/debian/$(PACKAGE)
+DOCDIR := $(DSTDIR)$(docdir)
+
+CPPFLAGS := $(shell dpkg-buildflags --get CPPFLAGS)
+CFLAGS := $(shell dpkg-buildflags --get CFLAGS)
+LDFLAGS := $(shell dpkg-buildflags --get LDFLAGS)
+
+ifneq (,$(findstring debug,$(DEB_BUILD_OPTIONS)))
+DEBOP=--enable-debug
+else
+DEBOP=
+endif
+
+ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
+ CFLAGS += -O0
+else
+ CFLAGS += -O2
+endif
+ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS)))
+ INSTALL_PROGRAM += -s
+endif
+
+# This package adds the following not in Debian lynx-cur:
+# --enable-htmlized-cfg
+# --enable-local-docs
+# --with-cfg-path
+
+configure: configure-stamp
+configure-stamp:
+ dh_testdir
+
+ CPPFLAGS="$(CPPFLAGS)" \
+ CFLAGS="$(CFLAGS)" \
+ LDFLAGS="$(LDFLAGS)" \
+ env cf_cv_SYSTEM_MAIL=/usr/sbin/sendmail \
+ COMPRESS=/usr/bin/compress \
+ BZIP2=/bin/bzip2 \
+ UNZIP=/usr/bin/unzip \
+ ZIP=/usr/bin/zip \
+ LIBS="-lbsd" \
+ ./configure \
+ --host=$(DEB_HOST_GNU_TYPE) \
+ --build=$(DEB_BUILD_GNU_TYPE) \
+ --program-suffix=$(PKG_SUFFIX) \
+ --prefix=/usr \
+ --libexecdir=\$${prefix}/lib \
+ --mandir=\$${prefix}/share/man \
+ --sysconfdir=/etc/$(PACKAGE) \
+ --with-cfg-path=/etc/$(PACKAGE):$(docdir)/samples \
+ --localstatedir=/var \
+ --libdir=/etc/$(PACKAGE) \
+ --enable-8bit-toupper \
+ --enable-cgi-links \
+ --enable-change-exec \
+ --enable-charset-choice \
+ --enable-cjk \
+ --enable-default-colors \
+ --enable-exec-links \
+ --enable-exec-scripts \
+ --enable-externs \
+ --enable-font-switch \
+ --enable-forms-options \
+ --enable-gzip-help \
+ --enable-htmlized-cfg \
+ --enable-internal-links \
+ --enable-ipv6 \
+ --enable-chinese-utf8 \
+ --enable-japanese-utf8 \
+ --enable-justify-elts \
+ --enable-kbd-layout \
+ --enable-local-docs \
+ --enable-nested-tables \
+ --enable-nls \
+ --enable-nsl-fork \
+ --enable-partial \
+ --enable-persistent-cookies \
+ --enable-prettysrc \
+ --enable-read-eta \
+ --enable-scrollbar \
+ --enable-source-cache \
+ --enable-syslog \
+ --enable-warnings \
+ --with-brotli \
+ --with-bzlib \
+ --with-gnutls=/usr \
+ --with-screen=ncursesw6dev \
+ --with-textdomain=$(PACKAGE) \
+ --with-zlib \
+ --without-included-gettext \
+ ${DEBOP}
+
+ $(MAKE) preinstall \
+ docdir=$(docdir) \
+ helpdir=$(helpdir)
+
+ touch configure-stamp
+
+build: build-stamp
+build-stamp: configure-stamp
+ dh_testdir
+
+ $(MAKE) \
+ docdir=$(docdir) \
+ helpdir=$(helpdir)
+
+ touch build-stamp
+
+clean:
+ dh_testdir
+ dh_testroot
+
+ [ ! -f Makefile ] || $(MAKE) clean
+
+ rm -f configure-stamp build-stamp install-stamp \
+ config.cache config.h config.status config.log makefile
+
+ rm -f *.o lynx
+
+ dh_clean
+
+install: install-stamp
+install-stamp: build-stamp
+ dh_testdir
+ dh_testroot
+ dh_prep
+ dh_installdirs
+
+ $(MAKE) install \
+ DESTDIR=$(CURDIR)/debian/$(PACKAGE) \
+ docdir=$(docdir) \
+ helpdir=$(helpdir)
+
+ touch install-stamp
+
+install: install-indep install-arch
+install-indep:
+
+install-arch:
+ dh_testdir
+ dh_testroot
+ dh_prep -s
+ dh_installdirs -s
+
+ $(MAKE) install-full \
+ DESTDIR=$(DSTDIR) \
+ docdir=$(docdir) \
+ helpdir=$(helpdir)
+
+ cd $(DOCDIR) && rm -f COPY*.asc CHANGES
+
+# Build architecture-independent files here.
+binary-indep: build install
+# No binary-indep target.
+
+# Build architecture-dependent files here.
+binary-arch: build install
+ dh_testdir
+ dh_testroot
+ dh_lintian
+ dh_installdebconf
+ dh_installdocs
+ dh_installmenu
+ dh_installmime
+ dh_installexamples
+ dh_installchangelogs CHANGES
+ dh_install
+ dh_link
+ dh_strip
+ dh_compress -XCOPY -X.lss
+ dh_fixperms
+ dh_installdeb
+ dh_shlibdeps
+ dh_gencontrol
+ dh_md5sums
+ dh_builddeb
+
+binary: binary-indep binary-arch
+.PHONY: build clean binary-indep binary-arch binary install install-stamp
diff --git a/PACKAGE/debian/source/format b/PACKAGE/debian/source/format
new file mode 100644
index 0000000..89ae9db
--- /dev/null
+++ b/PACKAGE/debian/source/format
@@ -0,0 +1 @@
+3.0 (native)
diff --git a/PACKAGE/debian/watch b/PACKAGE/debian/watch
new file mode 100644
index 0000000..f833931
--- /dev/null
+++ b/PACKAGE/debian/watch
@@ -0,0 +1,4 @@
+version=3
+
+opts=passive https://invisible-island.net/lynx/archives/lynx-cur\.tgz \
+ debian uupdate
diff --git a/PACKAGE/lynx-curses.iss b/PACKAGE/lynx-curses.iss
new file mode 100644
index 0000000..7710893
--- /dev/null
+++ b/PACKAGE/lynx-curses.iss
@@ -0,0 +1,12 @@
+; $LynxId: lynx-curses.iss,v 1.6 2018/03/14 08:34:56 tom Exp $
+;
+; This is an installer for the "color-style" flavor of Lynx.
+;
+; The script assumes environment variables have been set, e.g., to point to
+; data which is used by the installer (see "lynx.lss" for details).
+
+#define NoScreenDll
+#define SetupBaseName "lynx-cs"
+#define SourceExeName "lynx-cs.exe"
+
+#include "lynx.iss"
diff --git a/PACKAGE/lynx-curssl.iss b/PACKAGE/lynx-curssl.iss
new file mode 100644
index 0000000..3182257
--- /dev/null
+++ b/PACKAGE/lynx-curssl.iss
@@ -0,0 +1,14 @@
+; $LynxId: lynx-curssl.iss,v 1.1 2022/12/29 00:38:46 tom Exp $
+;
+; This is an installer for Lynx built with "current" OpenSSL (3.0.x).
+;
+; The script assumes environment variables have been set, e.g., to point to
+; data which is used by the installer (see "lynx.lss" for details).
+
+#define NoScreenDll
+#define SslGlob1 "'libssl-3*.dll'"
+#define SslGlob2 "'libcrypto-3*.dll'"
+#define SetupBaseName "lynx-curssl"
+#define SourceExeName "lynx-curssl.exe"
+
+#include "lynx.iss"
diff --git a/PACKAGE/lynx-default.iss b/PACKAGE/lynx-default.iss
new file mode 100644
index 0000000..f39b9b5
--- /dev/null
+++ b/PACKAGE/lynx-default.iss
@@ -0,0 +1,11 @@
+; $LynxId: lynx-default.iss,v 1.1 2018/03/13 09:10:08 tom Exp $
+;
+; This is an installer for the "default" flavor of Lynx.
+;
+; The script assumes environment variables have been set, e.g., to point to
+; data which is used by the installer (see "lynx.lss" for details).
+
+#define NoScreenDll
+#define SourceExeName "lynx-default.exe"
+
+#include "lynx.iss"
diff --git a/PACKAGE/lynx-newssl.iss b/PACKAGE/lynx-newssl.iss
new file mode 100644
index 0000000..c6ebc97
--- /dev/null
+++ b/PACKAGE/lynx-newssl.iss
@@ -0,0 +1,14 @@
+; $LynxId: lynx-newssl.iss,v 1.6 2022/12/29 00:38:07 tom Exp $
+;
+; This is an installer for Lynx built with "new" OpenSSL (1.1.x).
+;
+; The script assumes environment variables have been set, e.g., to point to
+; data which is used by the installer (see "lynx.lss" for details).
+
+#define NoScreenDll
+#define SslGlob1 "'libssl-1*.dll'"
+#define SslGlob2 "'libcrypto-1*.dll'"
+#define SetupBaseName "lynx-newssl"
+#define SourceExeName "lynx-newssl.exe"
+
+#include "lynx.iss"
diff --git a/PACKAGE/lynx-oldssl.iss b/PACKAGE/lynx-oldssl.iss
new file mode 100644
index 0000000..afe026a
--- /dev/null
+++ b/PACKAGE/lynx-oldssl.iss
@@ -0,0 +1,15 @@
+; $LynxId: lynx-oldssl.iss,v 1.5 2022/12/28 22:37:15 tom Exp $
+;
+; This is an installer for Lynx built with "old" OpenSSL (before 1.1.x).
+;
+; The script assumes environment variables have been set, e.g., to point to
+; data which is used by the installer (see "lynx.lss" for details).
+
+#define NoScreenDll
+#define SslGlob1 "'ssleay32.dll'"
+#define SslGlob2 "'libeay32.dll'"
+#define SetupBaseName "lynx-oldssl"
+#define SourceExeName "lynx-oldssl.exe"
+#define RuntimeBundle "'msvcr120.dll'"
+
+#include "lynx.iss"
diff --git a/PACKAGE/lynx-slang.iss b/PACKAGE/lynx-slang.iss
new file mode 100644
index 0000000..e5a8185
--- /dev/null
+++ b/PACKAGE/lynx-slang.iss
@@ -0,0 +1,13 @@
+; $LynxId: lynx-slang.iss,v 1.3 2018/03/14 08:34:56 tom Exp $
+;
+; This is an installer for the "color-style" flavor of Lynx.
+;
+; The script assumes environment variables have been set, e.g., to point to
+; data which is used by the installer (see "lynx.lss" for details).
+
+#define NoScreenDll
+#define SetupBaseName "lynx-sl"
+#define SourceExeName "lynx-slang.exe"
+#define ScreenDllName "wslang32.dll"
+
+#include "lynx.iss"
diff --git a/PACKAGE/lynx.iss b/PACKAGE/lynx.iss
new file mode 100644
index 0000000..79bb463
--- /dev/null
+++ b/PACKAGE/lynx.iss
@@ -0,0 +1,607 @@
+; $LynxId: lynx.iss,v 1.38 2023/01/03 00:17:48 tom Exp $
+; vile:ts=4 sw=4 notabinsert fk=8bit
+;
+; This is the BASE script for different flavors of the installer for Lynx.
+; It can be overridden to select different source-executables (and their associated
+; screen library, e.g., pdcurses or slang).
+;
+; The script assumes environment variables have been set, e.g., to point to
+; data which is used by the installer:
+;
+; LYNX_BINDIR - directory containing lynx.exe (or different names)
+; LYNX_DLLSDIR - directory containing curses or slang dlls.
+; LYNX_DOCSDIR - files and subdirectories installed from Unix with "make install-doc"
+; LYNX_HELPDIR - files and subdirectories installed from Unix with "make install-help"
+
+#include "version.iss"
+
+#ifndef MyAppExeName
+#define MyAppExeName "lynx.exe"
+#endif
+
+#if Ver < 0x5060100
+#define MySendTo '{sendto}\' + myAppName + '.lnk'
+#else
+#define MySendTo '{usersendto}\' + myAppName + '.lnk'
+#endif
+#define MyQuickLaunch '{userappdata}\Microsoft\Internet Explorer\Quick Launch\' + myAppName + '.lnk'
+
+#ifndef SourceExeName
+#define SourceExeName "lynx-default.exe"
+#endif
+
+#ifndef NoScreenDll
+#ifndef ScreenDllName
+#define ScreenDllName "pdcurses.dll"
+#endif
+#endif
+
+#ifndef BzipDllName
+#define BzipDllName "libbz2.dll"
+#endif
+
+#ifndef ZlibDllName
+#define ZlibDllName "zlib1.dll"
+#endif
+
+#ifndef BzipExeName
+#define BzipExeName "bzip2.exe"
+#endif
+
+#ifndef GzipExeName
+#define GzipExeName "gzip.exe"
+#endif
+
+#ifndef SetupBaseName
+#define SetupBaseName "lynx"
+#endif
+
+#ifndef BinsSrcDir
+#define BinsSrcDir GetEnv("LYNX_BINDIR")
+#if BinsSrcDir == ""
+#define BinsSrcDir "..\bin"
+#endif
+#endif
+
+#ifndef DllsSrcDir
+#define DllsSrcDir GetEnv("LYNX_DLLSDIR")
+#if DllsSrcDir == ""
+#define DllsSrcDir "..\bin"
+#endif
+#endif
+
+#ifndef DocsSrcDir
+#define DocsSrcDir GetEnv("LYNX_DOCSDIR")
+#if DocsSrcDir == ""
+#define DocsSrcDir "..\docs"
+#endif
+#endif
+
+#ifndef HelpSrcDir
+#define HelpSrcDir GetEnv("LYNX_HELPDIR")
+#if HelpSrcDir == ""
+#define HelpSrcDir "..\lynx_help"
+#endif
+#endif
+
+[Setup]
+AppName={#MyAppName}
+#emit 'AppVersion=' + LYNX_VERSION
+#emit 'VersionInfoDescription=Setup for "' + MyAppName + '"'
+#define LYNX_TARGET0 StringChange(LYNX_VERSION,LYNX_RELEASE + "rel.",LYNX_RELEASE + ".00")
+#define LYNX_TARGET1 StringChange(LYNX_TARGET0,LYNX_TARGETS + "dev.",LYNX_RELEASE + ".10")
+#define LYNX_TARGET2 StringChange(LYNX_TARGET1,LYNX_TARGETS + "pre.",LYNX_RELEASE + ".20")
+#emit 'VersionInfoVersion=' + LYNX_TARGET1
+AppVerName={#MyAppVerName}
+AppPublisher={#MyAppPublisher}
+AppCopyright=© 1997-2022,2023, Thomas E. Dickey
+AppPublisherURL={#MyAppURL}
+AppSupportURL={#MyAppURL}
+AppUpdatesURL={#MyAppURL}
+DefaultDirName={pf}\{#MyAppName}
+DefaultGroupName={#MyAppName}
+AllowNoIcons=yes
+LicenseFile=..\COPYHEADER
+InfoBeforeFile=..\README
+OutputDir=..\PACKAGE\lynx-setup
+#emit 'OutputBaseFilename=' + SetupBaseName + LYNX_VERSION + '-setup'
+Compression=lzma
+SolidCompression=yes
+PrivilegesRequired=none
+SetupLogging=no
+
+[Languages]
+Name: "english"; MessagesFile: "compiler:Default.isl"
+
+[Components]
+Name: main; Description: The Lynx executable; types: full custom compact
+Name: explorer; Description: Windows Explorer integration; types: full custom
+
+[Tasks]
+Name: for_all_users; Description: Install for all users on this machine; GroupDescription: Configuration Settings; Components: main; Check: isGuru; Flags: unchecked
+Name: register_vars; Description: Use registry for environment variables; GroupDescription: Configuration Settings; Components: main; Flags: unchecked
+Name: use_sendto; Description: Add Send To Entry; GroupDescription: Windows Explorer; Components: explorer; Flags: unchecked
+Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Components: main; Flags: unchecked
+Name: quicklaunchicon; Description: {cm:CreateQuickLaunchIcon}; GroupDescription: {cm:AdditionalIcons}; Components: main; Flags: unchecked
+
+
+[Dirs]
+Name: "{app}\doc"
+Name: "{app}\doc\samples"
+Name: "{app}\doc\test"
+Name: "{app}\help"
+Name: "{app}\help\keystrokes"
+Name: "{app}\icon"
+
+[Files]
+#emit 'Source: "' + BinsSrcDir + '\' + SourceExeName + '"; DestDir: "{app}"; DestName: ' + MyAppExeName + '; AfterInstall: myPostExecutable; Flags: ignoreversion'
+#ifndef NoScreenDll
+#emit 'Source: "' + DllsSrcDir + '\' + ScreenDllName + '"; DestDir: "{app}"; DestName: ' + ScreenDllName + '; Flags: ignoreversion'
+#endif
+#emit 'Source: "' + DllsSrcDir + '\' + BzipExeName + '"; DestDir: "{app}"; DestName: ' + BzipExeName + '; Flags: ignoreversion'
+#emit 'Source: "' + DllsSrcDir + '\' + GzipExeName + '"; DestDir: "{app}"; DestName: ' + GzipExeName + '; Flags: ignoreversion'
+#emit 'Source: "' + DocsSrcDir + '\*.*"; DestDir: "{app}\doc"; Flags: '
+#emit 'Source: "' + DocsSrcDir + '\..\samples\*.*"; DestDir: "{app}\doc\samples"; Flags: '
+#emit 'Source: "' + DocsSrcDir + '\..\test\*.*"; DestDir: "{app}\doc\test"; Flags: '
+#emit 'Source: "' + HelpSrcDir + '\*.*"; DestDir: "{app}\help"; Flags: '
+#emit 'Source: "' + HelpSrcDir + '\keystrokes\*.*"; DestDir: "{app}\help\keystrokes"; Flags: '
+
+; some of these data files are from an earlier installer by Claudio Santambrogio
+Source: "..\lynx.cfg"; DestDir: "{app}" ; AfterInstall: myCustomCfg; Flags: ignoreversion
+Source: "..\lynx.man"; DestDir: "{app}"
+Source: "..\samples\*.lss"; DestDir: "{app}"
+Source: "..\samples\home.htm"; DestDir: "{app}"
+Source: "..\samples\jumps.htm"; DestDir: "{app}"
+Source: "..\samples\lynx-demo.cfg"; DestDir: "{app}"
+Source: "..\samples\lynx.bat"; DestDir: "{app}"
+Source: "..\samples\lynx.ico"; DestDir: "{app}\icon"
+Source: "..\samples\lynx_bookmarks.htm"; DestDir: "{app}"
+Source: "..\samples\oldlynx.bat"; DestDir: "{app}"
+; NOTE: Don't use "Flags: ignoreversion" on any shared system files
+
+[Icons]
+Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
+Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"
+Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
+
+[Run]
+Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#MyAppName}}"; Flags: nowait postinstall skipifsilent
+
+[UninstallDelete]
+Type: files; Name: {app}\.lynx_cookies
+Type: dirifempty; Name: {app}
+#emit 'Type: files; Name: ' + mySendTo
+#emit 'Type: files; Name: ' + myQuickLaunch
+
+[Code]
+#emit 'const MY_APP_NAME = ''{app}\' + myAppProg + '.exe'';'
+
+
+function isGuru(): Boolean;
+begin
+ Result := isAdminLoggedOn();
+end;
+
+function environRootKey(): Integer;
+begin
+ Result := HKEY_CURRENT_USER;
+end;
+
+function appKey(): string;
+begin
+ Result := 'Software\Lynx';
+end;
+
+function envSubKey(): string;
+begin
+ Result := 'Environment';
+end;
+
+function appSubKey(): string;
+begin
+ Result := appKey() + '\' + envSubKey();
+end;
+
+function envSysKey(): string;
+begin
+ Result := 'System\CurrentControlSet\Control\Session Manager\Environment';
+end;
+
+// Set the environment variable ValueName.
+procedure addVarToEnv(const RootKey: Integer; const SubKeyName, ValueName, toAdd: String);
+var
+ Updated : string;
+begin
+ Updated := ExpandConstant(toAdd);
+ RegWriteStringValue(RootKey, SubKeyName, ValueName, Updated);
+ Log('Added ' + toAdd + ' to ' + ValueName);
+ // MsgBox('addVarToEnv: ' #13#13 + ValueName + '="' + Updated + '"', mbInformation, MB_OK)
+end;
+
+// Remove the given environment variable ValueName.
+function removeVarFromEnv(const RootKey: Integer; const SubKeyName, ValueName: String): Boolean;
+var
+ Current : string;
+begin
+ Result := False;
+ if RegQueryStringValue(RootKey, SubKeyName, ValueName, Current) then
+ begin
+ RegDeleteValue(RootKey, SubKeyName, ValueName);
+ Result := True;
+ Log('Removed ' + ValueName);
+ // MsgBox('removeVarFromEnv: ' #13#13 + ValueName + '="' + Current + '"', mbInformation, MB_OK)
+ end;
+end;
+
+function selectedVarsRootKey(): Integer;
+begin
+ if isTaskSelected('for_all_users') then
+ Result := HKEY_LOCAL_MACHINE
+ else
+ Result := HKEY_CURRENT_USER;
+end;
+
+function selectedVarsSubKey(): String;
+begin
+ if isTaskSelected('for_all_users') then
+ begin
+ if isTaskSelected('register_vars') then
+ Result := appSubKey()
+ else
+ Result := envSysKey();
+ end else
+ begin
+ if isTaskSelected('register_vars') then
+ Result := appSubKey()
+ else
+ Result := envSubKey();
+ end;
+end;
+
+procedure addAnyVariable(const ValueName, newValue: String);
+begin
+ addVarToEnv(selectedVarsRootKey(), selectedVarsSubKey(), ValueName, NewValue);
+end;
+
+// FIXME: should only remove if it matches the installer's value
+procedure removeAnyVariable(const ValueName: String);
+begin
+ removeVarFromEnv(HKEY_CURRENT_USER, envSubKey(), ValueName);
+ removeVarFromEnv(HKEY_CURRENT_USER, appSubKey(), ValueName);
+ removeVarFromEnv(HKEY_LOCAL_MACHINE, appSubKey(), ValueName);
+ removeVarFromEnv(HKEY_LOCAL_MACHINE, envSysKey(), ValueName);
+end;
+
+// http://www.delphidabbler.com/articles?article=12
+procedure AddSendTo();
+begin
+ CreateShellLink(
+#emit 'ExpandConstant(''' + MySendTo + '''),'
+#emit '''SendTo link for ' + myAppName + ''','
+ ExpandConstant(MY_APP_NAME), // program
+ '', // option(s) will be followed by pathname
+ '', // no target directory
+ '', // no icon filename
+ -1, // no icon index
+ SW_SHOWNORMAL);
+end;
+
+procedure AddQuickLaunch();
+begin
+ CreateShellLink(
+#emit 'ExpandConstant(''' + MyQuickLaunch + '''),'
+#emit '''SendTo link for ' + myAppName + ''','
+ ExpandConstant(MY_APP_NAME), // program
+ '', // option(s) will be followed by pathname
+ '', // no target directory
+ '', // no icon filename
+ -1, // no icon index
+ SW_SHOWNORMAL);
+end;
+
+// This is called after installing the executable.
+procedure myPostExecutable();
+var
+ Keypath : String;
+ AppDir : String;
+begin
+ Keypath := appKey();
+ AppDir := ExpandConstant('{app}');
+ Log('Setting registry key "' + Keypath + '" to "' + AppDir + '"');
+ if not RegWriteStringValue(selectedVarsRootKey(), Keypath, '', AppDir) then
+ Log('Failed to set key');
+
+ if isTaskSelected('use_sendto') then
+ begin
+ AddSendTo();
+ Log('** added Send-To link');
+ end;
+
+ if isTaskSelected('quicklaunchicon') then
+ begin
+ AddQuickLaunch();
+ Log('** added Quick-launch link');
+ end;
+end;
+
+// This is called after installing the lynx.cfg file.
+procedure myCustomCfg();
+var
+ AppDir : String;
+ CfgFile : String;
+begin
+ AppDir := ExpandConstant('{app}');
+ CfgFile := AppDir + '\lynx.cfg';
+
+ addAnyVariable('LYNX_CFG', CfgFile);
+ Log('** set LYNX_CFG=' + CfgFile);
+
+ SaveStringToFile(CfgFile, 'HELPFILE:' + AppDir + '/help/Lynx_help_main.html.gz' + #10, True);
+ SaveStringToFile(CfgFile, 'COLOR_STYLE:' + AppDir + '/lynx.lss' + #10, True);
+
+ SaveStringToFile(CfgFile, 'CHMOD_PATH:' + #10, True);
+ SaveStringToFile(CfgFile, 'COPY_PATH:' + #10, True);
+ SaveStringToFile(CfgFile, 'MKDIR_PATH:' + #10, True);
+ SaveStringToFile(CfgFile, 'MV_PATH:' + #10, True);
+ SaveStringToFile(CfgFile, 'RMDIR_PATH:' + #10, True);
+ SaveStringToFile(CfgFile, 'RM_PATH:' + #10, True);
+ SaveStringToFile(CfgFile, 'TOUCH_PATH:' + #10, True);
+
+ Log('** customized ' + CfgFile);
+
+ if isTaskSelected('use_sendto') then
+ begin
+ AddSendTo();
+ Log('** added Send-To link');
+ end;
+end;
+
+function CleanupMyKey(const theRootKey: Integer): Boolean;
+var
+ Path : String;
+ Value : String;
+begin
+ Result := False;
+ if RegQueryStringValue(theRootKey, appKey(), '', Value) then
+ begin
+ if Value <> '' then
+ begin
+ Result := True;
+ Log('Deleting value of "' + appKey() + '" = "' + Value + '"');
+ if not RegDeleteValue(theRootKey, appKey(), '') then
+ Log('Failed to delete value');
+
+ Path := appKey() + '\Environment';
+ Log('Checking for subkey "' + Path + '"');
+ if RegValueExists(theRootKey, Path, '') then
+ begin
+ if RegDeleteKeyIncludingSubkeys(theRootKey, Path) then
+ Log('Deleted key "' + Path + '"')
+ else
+ Log('Failed to delete key "' + Path + '"');
+ end;
+
+ if RegDeleteKeyIfEmpty(theRootKey, appKey()) then
+ Log('Deleted key "' + appKey() + '"')
+ else
+ Log('Failed to delete key "' + appKey() + '"');
+ end
+ end
+end;
+
+#ifdef SslGlob1
+#emit "const SslGlob1 = " + SslGlob1 + ";"
+#emit "const SslGlob2 = " + SslGlob2 + ";"
+var
+ SslDirPage : TInputFileWizardPage;
+ SslLibraryPath : String;
+
+function DirContains(const PathList: string; const PathItem: string): Boolean;
+var
+ myList : string;
+ myItem : string;
+ myPart : string;
+ offset : integer;
+begin
+ Result := False;
+ myList := Uppercase(PathList);
+ myItem := Uppercase(RemoveBackslashUnlessRoot(PathItem));
+ offset := Pos(myItem, myList);
+ if offset <> 0 then
+ begin
+ myPart := Copy( myList, offset + Length(myItem), Length(myList) );
+ if ( Length(myPart) = 0 ) or ( Pos(';', myPart) = 1 ) or ( Pos('\;', myPart) = 1 ) then
+ begin
+ Result := True;
+ end;
+ end;
+end;
+
+function PathCat(const head, tail: string): string;
+begin
+ Result := RemoveBackslashUnlessRoot(head) + '\' + tail;
+end;
+
+procedure CopyFromTo(const source, target, name: string);
+var
+ FailExists : Boolean;
+ Status: Boolean;
+begin
+ Log('Copy from: ' + PathCat(source, name));
+ Log('Copy to: ' + PathCat(target, name));
+ FailExists := False;
+ Status := FileCopy(PathCat(source, name), PathCat(target, name), FailExists);
+ if not Status then
+ begin
+ MsgBox('Failed to copy ' + name, mbError, MB_OK);
+ Abort();
+ end;
+end;
+
+procedure ReallyDelete(const fullPath: string);
+begin
+ if FileExists( fullpath ) then
+ begin
+ if DeleteFile( fullPath ) then
+ Log( '...successful' )
+ else
+ begin
+ MsgBox('Failed to delete ' + fullPath, mbError, MB_OK);
+ end;
+ end;
+end;
+
+procedure DeleteAppFile(const name: string);
+var
+ AppDir : string;
+ fullPath : string;
+ findRec : TFindRec;
+begin
+ AppDir := ExpandConstant('{app}');
+ fullPath := PathCat( AppDir, name );
+ Log( 'Deleting ' + fullPath );
+ if Pos('*', fullPath) <> 0 then
+ begin
+ if FindFirst(fullPath, findRec) then
+ begin
+ ReallyDelete( PathCat( AppDir, findRec.name ) );
+ while FindNext( findRec ) do
+ ReallyDelete( PathCat( AppDir, findRec.name ) );
+ end
+ end
+ else
+ begin
+ ReallyDelete( fullPath );
+ end;
+end;
+
+function checkSslDir(): Boolean;
+begin
+ Result := True;
+ SslLibraryPath := Trim( SslDirPage.Values[0] );
+ if ( Length( SslLibraryPath ) = 0 ) or ( not FileExists( SslLibraryPath ) ) then
+ begin
+ MsgBox('No SSL library found', mbError, MB_OK)
+ Result := False;
+ end;
+end;
+
+procedure copySslDlls();
+var
+ SslDirectory : String;
+ SslFilename : String;
+ TargetDir : String;
+begin
+ Log('Copying SSL DLLs');
+ SslDirectory := ExtractFilePath(SslLibraryPath);
+
+ // If the directory is not already in the PATH, copy the DLLs to
+ // the application directory.
+ if DirContains( GetEnv('PATH'), SslDirectory) then
+ Log( 'PATH contains SSL directory' )
+ else
+ begin
+ TargetDir := ExpandConstant('{app}');
+ CreateDir(TargetDir);
+ if DirExists(TargetDir) then
+ begin
+ SslFilename := Lowercase( ExtractFileName( SslLibraryPath ) );
+ CopyFromTo( SslDirectory, TargetDir, SslFilename );
+ Log( 'comparing: ' + SslFilename + ' to ' + SslGlob1 );
+ if CompareText( SslFilename, SslGlob1 ) = 0 then
+ // old-ssl is literal, new is a glob...
+ CopyFromTo( SslDirectory, TargetDir, SslGlob2 )
+ else
+ // new-ssl matches "libssl-x-x-z", s/libssl/libcrypto/
+ SslFilename := 'libcrypto' + Copy(SslFilename, 7, Length(SslFilename));
+ CopyFromTo( SslDirectory, TargetDir, SslFilename );
+#ifdef RuntimeBundle
+ // older releases of OpenSSL bundled the Visual Studio runtime
+ SslFilename := SslDirectory + '\' + 'msvcr120.dll' ;
+ if FileExists(SslFilename) then
+ begin
+ CopyFromTo( SslDirectory, TargetDir, 'msvcr120.dll' );
+ end
+#endif
+ end
+ else
+ begin
+ MsgBox( 'Cannot create application directory', mbError, MB_OK )
+ Abort();
+ end
+ end;
+ Log('done - Copying SSL DLLs');
+end;
+
+procedure RegisterPreviousData(PreviousDataKey: Integer);
+begin
+ SetPreviousData( PreviousDataKey, 'SSL PATH', SslLibraryPath );
+end;
+
+function NextButtonClick(CurPageId: integer): Boolean;
+begin
+ Result := True;
+ if CurPageId = SslDirPage.Id then
+ begin
+ Result := checkSslDir();
+ end;
+end;
+
+procedure CurStepChanged(CurStep: TSetupStep);
+begin
+ if CurStep = ssInstall then
+ begin
+ CopySslDlls();
+ end;
+end;
+
+procedure InitializeWizard();
+var
+ myGlob: string;
+begin
+ // Create a page to locate the SSL library
+ SslDirPage := CreateInputFilePage(wpSelectDir,
+ 'Select SSL Library Location',
+ 'Where is the SSL library located?',
+ 'Select it from the directory, then click Next.');
+
+ myGlob := 'SSL dll|' + SslGlob1;
+ Log( 'search for SSL libraries ' + myGlob );
+ SslDirPage.Add( 'Locate SSL library:', myGlob, '*.dll' );
+ SslDirPage.Values[0] := GetPreviousData( 'SSL PATH', '' );
+end;
+#endif
+
+// On uninstall, we do not know which registry setting was selected during install, so we remove all.
+procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
+begin
+ case CurUninstallStep of
+ usUninstall:
+ begin
+ Log('CurUninstallStepChanged:' + 'Uninstall is about to start.')
+ // ...insert code to perform pre-uninstall tasks here...
+#ifdef SslGlob1
+ DeleteAppFile( SslGlob1 );
+ DeleteAppFile( SslGlob2 );
+ DeleteAppFile( 'msvcr120.dll' );
+#endif
+ end;
+ usPostUninstall:
+ begin
+ removeAnyVariable('LYNX_CFG');
+ {
+ If we don't find the settings in the current user, try the local machine.
+ The setup program cannot pass the all-users flag to the uninstaller, so we
+ have to try both.
+ }
+ Log('Checking current-user registry key');
+ if not CleanupMyKey(HKEY_CURRENT_USER) then
+ begin
+ Log('Checking local-machine registry key');
+ CleanupMyKey(HKEY_LOCAL_MACHINE);
+ end;
+
+ Log('CurUninstallStepChanged:' + 'Uninstall just finished.');
+ end;
+ end;
+end;
diff --git a/PACKAGE/lynx.nsi b/PACKAGE/lynx.nsi
new file mode 100644
index 0000000..3d4eaa3
--- /dev/null
+++ b/PACKAGE/lynx.nsi
@@ -0,0 +1,241 @@
+; $LynxId: lynx.nsi,v 1.61 2023/01/03 00:17:59 tom Exp $
+; Script originally generated with the Venis Install Wizard, but customized.
+; The Inno Setup script is preferred; but this can be built via cross-compiling.
+
+; Define the application name
+!define APPNAME "Lynx"
+!define EXENAME "lynx.exe"
+
+!define VERSION_EPOCH "2"
+!define VERSION_MAJOR "9"
+!define VERSION_MINOR "0"
+!define VERSION_LEVEL "1012"
+!define VERSION_PATCH "dev.12"
+
+!define SUBKEY "Lynx"
+
+!define INSTALL "Lynx - web browser"
+!define VERSION "${VERSION_EPOCH}.${VERSION_MAJOR}.${VERSION_MINOR}${VERSION_PATCH}"
+
+; Main Install settings
+Name "${INSTALL}"
+InstallDir "$PROGRAMFILES\${INSTALL}"
+InstallDirRegKey HKLM "Software\${SUBKEY}" "$INSTDIR\bin"
+OutFile "NSIS-Output\${APPNAME}-${VERSION}-setup.exe"
+
+CRCCheck on
+SetCompressor /SOLID lzma
+
+VIAddVersionKey ProductName "${SUBKEY}"
+VIAddVersionKey CompanyName "https://invisible-island.net/lynx"
+VIAddVersionKey LegalCopyright "© 1997-2022,2023, Thomas E. Dickey"
+VIAddVersionKey FileDescription "Lynx Installer (MinGW)"
+VIAddVersionKey FileVersion "${VERSION}"
+VIAddVersionKey ProductVersion "${VERSION}"
+VIAddVersionKey Comments "This installer was built with NSIS and cross-compiling to MinGW."
+VIAddVersionKey InternalName "setup-${APPNAME}-${VERSION}.exe"
+VIProductVersion "${VERSION_EPOCH}.${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_LEVEL}"
+
+; adapted from http://nsis.sourceforge.net/Readme_Page_Based_on_MUI_License_Page
+!macro MUI_EXTRAPAGE_README UN TheFile
+ !define MUI_LICENSEPAGE_BUTTON "$(^NextBtn)"
+ !insertmacro MUI_${UN}PAGE_LICENSE "${TheFile}"
+!macroend
+!define ReadmeRun "!insertmacro MUI_EXTRAPAGE_README"
+!macro MUI_PAGE_README TheFile
+ ${ReadmeRun} "" "${TheFile}"
+!macroend
+
+; Modern interface settings
+!include "MUI.nsh"
+
+!define MUI_ABORTWARNING
+!define MUI_FINISHPAGE_RUN "$INSTDIR\${EXENAME}"
+
+!insertmacro MUI_PAGE_WELCOME
+!insertmacro MUI_PAGE_LICENSE "..\COPYHEADER"
+!insertmacro MUI_PAGE_README "..\README"
+!insertmacro MUI_PAGE_COMPONENTS
+!insertmacro MUI_PAGE_DIRECTORY
+!insertmacro MUI_PAGE_INSTFILES
+!insertmacro MUI_PAGE_FINISH
+
+!insertmacro MUI_UNPAGE_CONFIRM
+!insertmacro MUI_UNPAGE_INSTFILES
+
+; Set languages (first is default language)
+!insertmacro MUI_LANGUAGE "English"
+!insertmacro MUI_RESERVEFILE_LANGDLL
+
+!define LYNX_CFG "lynx.cfg"
+
+InstType "Full" ; SectionIn 1
+InstType "Typical" ; SectionIn 2
+InstType "Minimal" ; SectionIn 3
+
+Section "${APPNAME}" Section1
+
+ SectionIn 1 2 3
+
+ ; Set Section properties
+ SetOverwrite on
+
+ ; Set Section Files and Shortcuts
+ SetOutPath "$INSTDIR"
+ File /oname=${EXENAME} ".\bin\*${EXENAME}"
+ File ".\bin\bzip2.exe"
+ File ".\bin\gzip.exe"
+ File ".\bin\*.dll"
+
+ ; TODO: bzip2.exe, gzip.exe, *.dll
+
+ CreateShortCut "$DESKTOP\${APPNAME}.lnk" "$INSTDIR\${EXENAME}"
+ CreateShortCut "$SENDTO\${APPNAME}.lnk" "$INSTDIR\${EXENAME}"
+ CreateDirectory "$SMPROGRAMS\${INSTALL}"
+ CreateShortCut "$SMPROGRAMS\${INSTALL}\${INSTALL}.lnk" "$INSTDIR\${EXENAME}"
+ CreateShortCut "$SMPROGRAMS\${INSTALL}\${APPNAME} - Help.lnk" "$INSTDIR\help\lynx_help_main.html"
+ CreateShortCut "$SMPROGRAMS\${INSTALL}\Uninstall.lnk" "$INSTDIR\uninstall.exe"
+
+ File ".\share\lynx_doc\samples\*.lss"
+
+ ; preinstall lynx.cfg as a temporary file
+ File /oname=${LYNX_CFG} ".\etc\${LYNX_CFG}"
+
+ ; at install-time, append our customization
+ FileOpen $0 "${LYNX_CFG}" a
+ FileSeek $0 0 END
+ FileWrite $0 "HELPFILE:$INSTDIR\help\Lynx_help_main.html.gz$\n"
+ FileWrite $0 "COLOR_STYLE:$INSTDIR\opaque.lss$\n"
+ FileWrite $0 "CHMOD_PATH:$\n"
+ FileWrite $0 "COPY_PATH:$\n"
+ FileWrite $0 "MKDIR_PATH:$\n"
+ FileWrite $0 "MV_PATH:$\n"
+ FileWrite $0 "RMDIR_PATH:$\n"
+ FileWrite $0 "RM_PATH:$\n"
+ FileWrite $0 "TOUCH_PATH:$\n"
+ FileClose $0
+
+ File "..\samples\lynx.bat"
+ File "..\samples\lynx-demo.cfg"
+ File "..\samples\oldlynx.bat"
+
+ File "..\samples\jumps.htm"
+ File "..\samples\home.htm"
+ File "..\samples\lynx_bookmarks.htm"
+
+ SetOutPath "$INSTDIR\icon"
+ File "..\samples\lynx.ico"
+
+ SetOutPath "$INSTDIR\tmp"
+
+SectionEnd
+
+Section "documentation" Section2
+
+ SectionIn 1 2
+
+ ; Set Section properties
+ SetOverwrite on
+
+ ; Set Section Files and Shortcuts
+ SetOutPath "$INSTDIR"
+ File "..\lynx.man"
+
+ SetOutPath "$INSTDIR\doc"
+ File ".\share\lynx_doc\CHANGES*.*"
+ File ".\share\lynx_doc\COPY*.*"
+ File ".\share\lynx_doc\PROBLEM*.*"
+ File ".\share\lynx_doc\README*.*"
+
+ SetOutPath "$INSTDIR\help"
+ File ".\share\lynx_help\*.*"
+
+ SetOutPath "$INSTDIR\help\keystrokes"
+ File ".\share\lynx_help\keystrokes\*.*"
+
+SectionEnd
+
+Section "samples" Section3
+
+ SectionIn 1
+
+ ; Set Section properties
+ SetOverwrite on
+
+ ; Set Section Files and Shortcuts
+ SetOutPath "$INSTDIR\doc\samples"
+ File ".\share\lynx_doc\samples\*.*"
+
+ SetOutPath "$INSTDIR\doc\test"
+ File ".\share\lynx_doc\test\*.*"
+
+SectionEnd
+
+Section -FinishSection
+
+ WriteRegStr HKLM "Software\${SUBKEY}" "" "$INSTDIR"
+ WriteRegStr HKLM "Software\${SUBKEY}" "Environment" ""
+ WriteRegStr HKLM "Software\${SUBKEY}\Environment" "LYNX_CFG" "$INSTDIR\${LYNX_CFG}"
+ WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${INSTALL}" "DisplayName" "${INSTALL} ${VERSION}"
+ WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${INSTALL}" "UninstallString" "$INSTDIR\uninstall.exe"
+ WriteUninstaller "$INSTDIR\uninstall.exe"
+
+SectionEnd
+
+; Modern install component descriptions
+!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
+ !insertmacro MUI_DESCRIPTION_TEXT ${Section1} "${SUBKEY}"
+ !insertmacro MUI_DESCRIPTION_TEXT ${Section2} "Documentation"
+ !insertmacro MUI_DESCRIPTION_TEXT ${Section3} "Samples and Test-files."
+!insertmacro MUI_FUNCTION_DESCRIPTION_END
+
+;Uninstall section
+Section Uninstall
+
+ ;Remove from registry...
+ DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${INSTALL}"
+ DeleteRegKey HKLM "SOFTWARE\${SUBKEY}"
+
+ ; Delete self
+ Delete "$INSTDIR\uninstall.exe"
+
+ ; Delete Shortcuts
+ Delete "$DESKTOP\${APPNAME}.lnk"
+ Delete "$SENDTO\${APPNAME}.lnk"
+ Delete "$SMPROGRAMS\${INSTALL}\${INSTALL}.lnk"
+ Delete "$SMPROGRAMS\${INSTALL}\${APPNAME} - Help.lnk"
+ Delete "$SMPROGRAMS\${INSTALL}\Uninstall.lnk"
+
+ ; Clean up application
+ Delete "$INSTDIR\${EXENAME}"
+ Delete "$INSTDIR\doc\samples\*.*"
+ Delete "$INSTDIR\doc\test\*.*"
+ Delete "$INSTDIR\doc\*.*"
+ Delete "$INSTDIR\help\keystrokes\*.*"
+ Delete "$INSTDIR\help\*.*"
+ Delete "$INSTDIR\icon\*.*"
+ Delete "$INSTDIR\tmp\*.*"
+ Delete "$INSTDIR\bzip2.exe"
+ Delete "$INSTDIR\gzip.exe"
+ Delete "$INSTDIR\*.bat"
+ Delete "$INSTDIR\*.cfg"
+ Delete "$INSTDIR\*.dll"
+ Delete "$INSTDIR\*.htm"
+ Delete "$INSTDIR\*.man"
+ Delete "$INSTDIR\*.lss"
+ Delete "$INSTDIR\*.tmp"
+
+ ; Remove remaining directories
+ RMDir "$SMPROGRAMS\${INSTALL}"
+ RMDir "$INSTDIR\doc\samples"
+ RMDir "$INSTDIR\doc\test"
+ RMDir "$INSTDIR\doc"
+ RMDir "$INSTDIR\help\keystrokes"
+ RMDir "$INSTDIR\help"
+ RMDir "$INSTDIR\icon"
+ RMDir "$INSTDIR\tmp"
+ RMDir "$INSTDIR\"
+
+SectionEnd
+
+; eof \ No newline at end of file
diff --git a/PACKAGE/lynx.spec b/PACKAGE/lynx.spec
new file mode 100644
index 0000000..aa78d00
--- /dev/null
+++ b/PACKAGE/lynx.spec
@@ -0,0 +1,132 @@
+# $LynxId: lynx.spec,v 1.67 2023/01/02 23:47:08 tom Exp $
+Summary: A text-based Web browser
+Name: lynx-dev
+Version: 2.9.0
+Release: dev.12
+License: GPLv2
+Group: Applications/Internet
+Source: lynx%{version}%{release}.tgz
+URL: https://lynx.invisible-island.net
+Provides: webclient >= 0.0
+Provides: text-www-browser >= 0.0
+
+# Fedora:
+BuildRequires: openssl-devel, pkgconfig, ncurses-devel >= 5.3-5,
+BuildRequires: zlib-devel, gettext
+BuildRequires: libidn-devel
+# BuildRequires: bzip2-devel
+
+# SuSE:
+# BuildRequires: libbz2-devel
+
+Requires: gzip, bzip2, tar, zip, unzip
+
+%description
+Lynx is a fully-featured World Wide Web (WWW) client for users running
+cursor-addressable, character-cell display devices. It is very fast and easy
+to use. It will display HTML documents containing links to files residing on
+the local system, as well as files residing on remote systems running Gopher,
+HTTP, FTP, WAIS, and NNTP servers.
+
+%define lynx_doc %{_defaultdocdir}/%{name}
+%define lynx_etc %{_sysconfdir}/%{name}
+
+%prep
+
+%define debug_package %{nil}
+%setup -q -n lynx%{version}%{release}
+
+%build
+%configure \
+ --target %{_target_platform} \
+ --prefix=%{_prefix} \
+ --bindir=%{_bindir} \
+ --program-suffix=-dev \
+ --datadir=%{lynx_doc} \
+ --libdir=%{lynx_etc} \
+ --mandir=%{_mandir} \
+ --sysconfdir=%{lynx_etc} \
+ --with-cfg-path=%{lynx_etc}:%{lynx_doc}/samples \
+ --with-textdomain=%{name} \
+ --enable-8bit-toupper \
+ --enable-cgi-links \
+ --enable-change-exec \
+ --enable-charset-choice \
+ --enable-cjk \
+ --enable-default-colors \
+ --enable-exec-links \
+ --enable-exec-scripts \
+ --enable-externs \
+ --enable-font-switch \
+ --enable-forms-options \
+ --enable-gzip-help \
+ --enable-htmlized-cfg \
+ --enable-internal-links \
+ --enable-ipv6 \
+ --enable-chinese-utf8 \
+ --enable-japanese-utf8 \
+ --enable-justify-elts \
+ --enable-kbd-layout \
+ --enable-local-docs \
+ --enable-nested-tables \
+ --enable-nls \
+ --enable-nsl-fork \
+ --enable-partial \
+ --enable-persistent-cookies \
+ --enable-prettysrc \
+ --enable-read-eta \
+ --enable-scrollbar \
+ --enable-source-cache \
+ --enable-syslog \
+ --enable-warnings \
+ --with-brotli \
+ --with-bzlib \
+ --with-screen=ncursesw6dev \
+ --with-ssl \
+ --with-zlib
+make \
+ docdir=%{lynx_doc}
+
+%install
+rm -rf $RPM_BUILD_ROOT
+chmod -x samples/mailto-form.pl
+
+make install-full \
+ DESTDIR=$RPM_BUILD_ROOT \
+ docdir=%{lynx_doc}
+
+cat >>$RPM_BUILD_ROOT%{lynx_etc}/lynx.cfg <<EOF
+DEFAULT_INDEX_FILE:http://www.google.com/
+LOCALE_CHARSET:TRUE
+EOF
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%files
+%defattr(-,root,root,-)
+%{_bindir}/%{name}
+%{_mandir}/*/*
+%{_datadir}/locale/*
+%{lynx_doc}/*
+%config %{lynx_etc}/*.cfg
+%config %{lynx_etc}/*.lss
+
+%changelog
+
+* Tue Mar 29 2022 Thomas E. Dickey
+- add brotli compression
+
+* Sat Jul 31 2021 Thomas E. Dickey
+- align configure-options with Debian package, removing some which are not
+ needed because they correspond to the default settings.
+
+* Thu May 17 2018 Thomas E. Dickey
+- use "ncursesw6dev", reflecting renaming of ncurses test-packages to avoid
+ conflict with new packages in Fedora.
+
+* Mon Mar 12 2018 Thomas E. Dickey
+- rename to "lynx-dev", add a few dependencies where package names are same.
+
+* Fri Sep 17 2010 Thomas E. Dickey
+- initial version.
diff --git a/PACKAGE/version.iss b/PACKAGE/version.iss
new file mode 100644
index 0000000..7e3c09e
--- /dev/null
+++ b/PACKAGE/version.iss
@@ -0,0 +1,14 @@
+; version used for Inno Setup files.
+
+; $Format: "#define LYNX_VERSION \"$ProjectVersion$\""$
+#define LYNX_VERSION "2.9.0dev.12"
+
+; most-recent full release and target
+#define LYNX_RELEASE "2.9.0"
+#define LYNX_TARGETS "2.9.0"
+
+#define MyAppProg "Lynx"
+#define MyAppName "Lynx - web browser"
+#define MyAppPublisher "Thomas E Dickey"
+#define MyAppURL "https://invisible-island.net/lynx"
+#define MyAppVerName "Lynx " + LYNX_VERSION
diff --git a/PROBLEMS b/PROBLEMS
new file mode 100644
index 0000000..621ccc1
--- /dev/null
+++ b/PROBLEMS
@@ -0,0 +1,258 @@
+Lynx PROBLEMS file.
+
+Ideally you would never have to read this, but inevitably problems
+do arise. As implementation and installation problems become known
+they will be outlined in this file.
+
+---------
+
+ The install script will attempt to preserve your current settings in the
+ lynx.cfg file. You should review these (at the end of lynx.cfg) after
+ install. For instance references to lynx.browser.org for a startfile can
+ be removed, since that site is no longer maintained.
+
+---------
+
+ Some customized installs of OpenSSL are not detected by the configure
+ script. For example, with Redhat9, we did this to work around:
+
+ #!/bin/sh
+ KRB=/usr/kerberos
+ export LIBS="-L$KRB/lib -lssl -lcrypto -lgssapi_krb5 -lkrb5 -lk5crypto -lcom_err"
+ export CPPFLAGS="-I$KRB/include -I/usr/include/openssl"
+ export CFLAGS="-O -g $CPPFLAGS"
+ ./configure --with-ssl $*
+
+---------
+
+ The configure script check for IPv6 (--enable-ipv6) assumes that your build
+ machine can listen for IPv6 connections. It cannot determine if you want
+ to use it only for outgoing connections. If the configure script is
+ otherwise successful, it will warn about a nonfunctioning getaddrinfo()
+ function, and does not define these symbols needed to successfully compile
+ IPv6 support. You can work around this by by editing lynx_cfg.h:
+
+ HAVE_GAI_STRERROR
+ HAVE_GETADDRINFO
+
+---------
+
+ Control-Z on Unix can cause aberrant behavior. If you encounter
+ problems, use -restrictions=suspend to disable it, and only '!'
+ for escapes to shell (on VMS control-Z is unconditional 'Q'uit,
+ with no attempt to suspend the Lynx process only temporarily).
+ Control-Z on Unix often works better with slang.
+
+---------
+
+ Screen resizing can be a bit funny. If you resize the screen,
+ documents that have been cached will be out of whack. Any further
+ documents will look fine. You can reload documents to the current
+ window size with CTRL-R
+
+---------
+
+ If the configure script dies when it discovers that gcc is broken,
+ despite the fact there is a perfectly good ANSI cc in the PATH,
+ try setting the CC environment variable to your working cc compiler
+ before running configure: e.g.
+
+ setenv CC cc (or set CC=cc; export CC , depending on the shell)
+ ./configure
+
+---------
+
+ If you run into a problem compiling GridText.c, try omitting -O from the
+ compiler flags; it is a very big file and may not compile successfully
+ if you include optimization.
+
+---------
+
+ On a Sun system, the message:
+ "Alert!: Unable to connect to remote host"
+ will be displayed every time an attempt is made to access a host
+ other than localhost if Lynx has been built without the resolv
+ library and needed it, or with it and shouldn't have been.
+ Unfortunately, there's no way to check in the Makefile whether
+ -lresolv should be included in the LIBS="" list. What's necessary
+ depends on how that Sun is configured. To get the build right for
+ your SUN 3 or 4 OS, if you didn't have RESOLVLIB defined in the
+ Makefile define it and build Lynx again, or vice versa. Also, if
+ you have upgraded to the bind-8.1 or later library, you should try
+ changing -lresolv to -lbind.
+
+---------
+
+ On Sun systems when accessing sites that use multiple IPs for one URL,
+ you may experience a core dump. It's a bug in the resolver library,
+ which can be fixed by downloading & installing Sun's jumbo patch:
+ search Sun support information, e.g., Solaris newsgroups,
+ or see the following Lynx Archive items:
+
+ http://www.flora.org/lynx-dev/lynx-dev/9606/0422.html
+ http://www.flora.org/lynx-dev/html/month0497/msg01018.html
+ http://www.flora.org/lynx-dev/html/month0497/msg01064.html
+
+ The Sun `shelltool' and `cmdtool' terminals are stupid by default.
+ In order to get bold text to appear differently than inverse video,
+ the user should put this line in ~/.Xdefaults:
+
+ Term*boldStyle: Offset_X
+
+ From the `shelltool' man page, it seems that an analogous line
+ in ~/.defaults
+
+ /Tty/Bold_style "Offset_X"
+
+ ought to work just as well, but you may not get the desired
+ behavior until you modify your .Xdefaults file (and run `xrdb
+ ~/.Xdefaults'). Note also that there are other supported values
+ for the boldStyle resource/Bold_style default, all of which begin
+ with "Offset_". (helpful hint from kevin@traffic.den.mmc.com)
+
+---------
+
+ Directory browsing has been implemented for VMS, but there are no
+ plans to port additional DIRED support, because Lynx must handle files
+ as streams, and this precludes "serious" Directory/File Management on
+ VMS. Use a jumps file link to CSwing (sources or executables are
+ available from ftp://narnia.memst.edu), or define CSWING_PATH in
+ userdefs.h or lynx.cfg to invoke CSwing via the DIRED_MENU command.
+
+---------
+
+ If one switches between K)eypad "Numbers act as arrows" versus "Links
+ are numbered" in the 'o'ptions menu when the current document is a
+ DIRED menu in which links have been tagged, the tagging can be trashed
+ (so don't switch at such times 8-).
+
+---------
+
+ When "Links are numbered" is on, if a line is split on an anchor (to
+ obey right margin restrictions), and there is no space in the bolded
+ string such that the entire "[#]string" must be moved down, the "[#]"
+ becomes bolded, instead on only "string".
+
+---------
+
+ The Mosaic v2.5 hostlist uses HTML similar to that of Lynx's bookmark
+ file, but with </UL></HTML> at the bottom, such that it is not fully
+ compatible with Lynx's file. If you try to use the Mosaic file as if
+ it were a Lynx bookmark file, the </UL></HTML> will not be taken into
+ account and new links will be added below rather than above those end
+ tags. Instead, add a link to the Mosaic file in your Lynx file, and
+ to the Lynx file in your Mosaic file, so that you can access both files
+ with both clients.
+
+---------
+
+ SOCKSification and the -socks switch have not yet been integrated with
+ the slang library support.
+
+---------
+
+ There is an apparently broken version of select() in libcurses.a
+ of HP/UX 10.10. It also breaks tn3270, ncftp, emacs, and xemacs.
+ Using:
+ LIBS="-lc -lcurses -ltermcap \
+ ^^^
+ (i.e, adding -lc *before* the -lcurses) in the snake3 and snake3-slang
+ targets of the top level Makefile yields a usable image, but with
+ inappropriate video attributes on the Lynx displays (reverse video and
+ underscores on everything). Using "-lc -lHcurses" instead fixes the
+ ^^^^^^^^^
+ video attributes but then the arrow keys are messed up. - Donald S.
+ Teiser (dsteis01@homer.louisville.edu)
+ NOTE: If HP fixes the problem or you come up with a better workaround,
+ notify the lynx-dev@nongnu.org list.
+ Updated NOTE (1996-09-02): A patch reportedly is available from HP to
+ fix the select() problem, so that "-lc" is no longer needed, but
+ the curses glitch is not yet fixed, and you should still include
+ "-lHcurses".
+ Updated NOTE (1997-02-03): The problems reportedly are fixed with
+ patches PHCO_8086 and PHCO_8947 from HP.
+ Updated NOTE (1997-12-15): PHCO_8086 & PHCO_8947 are very old and are
+ no longer available. The current patch to install if running
+ under HP-UX 10.20 is PHCO_11342.
+
+---------
+
+ Lynx juggles variable abilities of curses packages or emulations to
+ display bolding and underlining simultaneously. This may fail if
+ Lynx thinks that your terminal, in connection with the curses package,
+ supports a capability which the terminal hardware or emulation does not
+ in fact support. Setting the right TERM environment variable, tweaking
+ terminfo or termcap files, or compiling with a newer version of ncurses
+ or slang may solve problems with missing highlighting or strange
+ characters appearing on the screen. Also, for a mono terminal,
+ make sure "show color" is not set to ON in the Options Menu.
+
+ The Wyse 50 and older TeleVideo terminals, among others, are
+ "magic cookie" terminals. This means that display attributes like
+ reverse, blink, underline, etc. work in a bizarre way that makes them
+ difficult to program. You may see extra spaces scattered around your
+ screen (separating different sorts of highlight); or sections of the
+ screen may be unexpectedly highlighted.
+ There is a workaround which works by restricting the terminal to a
+ single standout attribute (e.g., normal and reverse, but no others).
+ Implementing the workaround is specific to your curses implementation.
+ Most versions of curses use one of two terminal databases, called
+ "termcap" and "terminfo". Updating these databases is system-specific.
+ New databases should be available from the vendor or other sources.
+ For the Wyse 50, try
+ <URL: http://www.wyse.com/text/custserv/faq/wy50faq.htm>;
+ extract the "wy50" (NOT "wy50-mc") entry and use that in place of the
+ existing one. See `terminfo', `infocmp', `tic' etc. man pages if
+ necessary.
+ Alternatively, compiling Lynx with the slang library may avoid problems
+ with these terminals.
+
+ The Sun console driver (aka wscons(7)) implements "reverse" and "bold"
+ as "reverse", causing confusion where Lynx uses the distinction between
+ the two to convey information. Lynx tries to detect this automatically,
+ but if it fails (for instance, you are running under "screen"), try
+ setting the -noreverse commandline option.
+
+---------
+
+ On VMS, Lynx, and other TCP-IP software, have been experiencing chronic
+ problems of incompatibilities between DECC and MultiNet headers whenever
+ new versions of either DECC or MultiNet are released. The Lynx build
+ procedure for VMS and a maze of spaghetti #ifdef-ing in tcp.h of the
+ libwww-FM had previously been successful in dealing with this problem
+ across all versions of MultiNet and of DECC, VAXC, and Pat Rankin's
+ VMS port of GNUC, but are now not 100% successful. If you get compiler
+ messages about "struct timeval timeout" having no linkage, add that
+ declaration immediately below the inclusion of ioctl.h for MultiNet in
+ tcp.h (by deleting the "#ifdef NOT_DEFINED" and "#endif /* NOT_DEFINED */"
+ lines):
+ [...]
+ #include "multinet_root:[multinet.include.sys]ioctl.h"
+ struct timeval {
+ long tv_sec; /* seconds since Jan. 1, 1970 */
+ long tv_usec; /* microseconds */
+ };
+ [...]
+ If you get compiler warnings about incompatible multinet_foo()
+ declarations, delete those where indicated in tcp.h. For the most
+ current versions of MultiNet, you can modify tcp.h to use the DECC
+ socket and related headers.
+
+ On VMS, the ftp function does not work with SOCKETSHR 0.9D and NETLIB
+ 2 (NETLIB 1 may work). This is because the functions getsockname()
+ and getpeername() within SOCKETSHR make incorrect calls to the NETLIB
+ functions. This results in zeroes being returned for part of the local
+ IP address. Since ftp sends this IP address to the remote end, the
+ remote server ends up sending a file back to a non-existent address.
+ Andy Harper (A.HARPER@kcl.ac.uk) has fixed these problems in the
+ SOCKETSHR 0.9D sources and offers the fixes as:
+ http://alder.cc.kcl.ac.uk/fileserv/zip/socketshr_src_09d-2.zip
+ ftp://ftp2.kcl.ac.uk/zip/socketshr_src_09d-2.zip
+
+---------
+
+ On VMS, to build an SSL-capable version, lynx and the ssl library
+ e.g., OpenSSL, must be built using the same network library. If you
+ build OpenSSL without specifying the network library (the 5th parameter
+ of the makevms.com script), it will guess, possibly not the one you
+ intended. We have tested only the UCX configuration -TD (2002/9/15).
diff --git a/README b/README
new file mode 100644
index 0000000..d766827
--- /dev/null
+++ b/README
@@ -0,0 +1,154 @@
+ Lynx README file
+
+Lynx Version 2.8.9 is the latest release (July 2018).
+See the CHANGES file for a complete record of all changes and bug fixes.
+New releases are announced on the lynx-dev mailing list (see below).
+
+FOR REAL NOVICES
+
+To use this package, you need a compiler & a bit of experience
+at very simple programming. If you just want something which will work
+`out-of-the-box', you can get pre-compiled versions of Lynx
+by following the links from
+ <URL: https://lynx.invisible-island.net/resources.html/> ;
+
+For DOS or Windows, go to
+ <URL: http://www.fdisk.com/doslynx/lynxport.htm>.
+
+WHAT IS LYNX?
+
+ Lynx is a fully-featured World Wide Web (WWW) client for users running
+ cursor-addressable, character-cell display devices such as vt100 terminals,
+ vt100 emulators running on Windows 95/NT or Macintoshes, or any other
+ character-cell display. It will display Hypertext Markup Language (HTML)
+ documents containing links to files on the local system, as well as files on
+ remote systems running http, gopher, ftp, wais, nntp, finger, or cso/ph/qi
+ servers, and services accessible via logins to telnet, tn3270 or rlogin
+ accounts. Current versions of Lynx run on Unix, VMS, Windows95
+ through Windows 8, 386DOS and OS/2 EMX.
+
+ Lynx can be used to access information on the WWW, or to establish
+ information systems intended primarily for local access. Lynx has been
+ used to build several Campus Wide Information Systems (CWIS). Lynx can
+ also be used to build systems isolated within a single LAN.
+
+HOW TO GET LYNX
+
+ For the latest release of Lynx go to:
+ <URL: https://lynx.invisible-island.net/release>;
+ <URL: https://invisible-island.net/archives/lynx/tarballs>;
+
+ The latest development version is at:
+ <URL: https://lynx.invisible-island.net/current/>.
+
+ The Lynx homepage is <URL: https://lynx.invisible-island.net/>.
+ The on-line help page (enter `h') has links to many useful things.
+
+LICENSE
+
+ Lynx is distributed under the GNU General Public License, version 2 (GPLv2)
+ without restrictions on usage or redistribution. The Lynx copyright
+ statement, "COPYHEADER", and GNU GPL, "COPYING", are included in the
+ top-level directory of the distribution. Lynx is supported by the Lynx
+ user community, an entirely volunteer (and unofficial) organization.
+
+ Certain portions of the Lynx source distribution were originally
+ created by CERN and have been modified during the development of
+ Lynx. See WWW/FreeofCharge.html for copyright info regarding CERN
+ products used in Lynx.
+
+ Note that Lynx is not self-contained; typically it is built with a
+ variety of add-on libraries, including those for compression, IPv6,
+ SOCKS and SSL support.
+
+YEAR 2000 COMPLIANCE
+
+ We believe Lynx works properly for the Year 2000 issues, since it does
+ not store dates in 2-digit form. Since it must communicate with a wide
+ range of web servers, it interprets dates in a variety of formats. In
+ particular, if Lynx receives a date with a 2-digit year, it assumes that
+ values less than 70 are in the range 2000-2069.
+
+INSTALLING LYNX
+
+ To install Lynx, follow the steps in the INSTALLATION file, which is
+ located in the top directory of the source distribution.
+
+DOCUMENTATION
+
+ A users guide is included in this distribution along with a man page
+ for Unix systems and a help file for VMS systems. All documentation is
+ contained in the top directory and the docs, samples and lynx_help
+ subdirectories.
+
+ While running Lynx, type 'h', 'H', or '?' to invoke the help menu
+ system. From the help menu you may access several useful documents
+ pertaining to Lynx and the World Wide Web. The most important of
+ these is the Lynx Users Guide. By default, Lynx will use the Lynx
+ Enhanced Pages, which includes http links for help and FAQs concerning
+ Lynx. It is recommended that you install your own help menu system at
+ your site in order to lessen the load on http servers. This also will
+ allow you to customize the help menu system for your site and greatly
+ speed up access for those using Lynx over a slow connection.
+
+INSTALLING THE DOCUMENTATION
+
+ For Unix and related systems which support the autoconf configure script,
+ the help menu system is installed by the "make install-help" command.
+
+ For other systems (such as VMS), copy COPYHEADER and COPYING into the
+ lynx_help/ subdirectory. Then copy the lynx_help subdirectory to a public
+ place on your system, or into your $HOME directory if you are a single
+ user. Finally, edit the lynx.cfg file so that the HELPFILE line is
+ defined as follows:
+ HELPFILE:file://localhost/[public_path]/lynx_help/lynx_help_main.html
+
+ where [public_path] is the absolute path to the lynx_help directory.
+ Customizing the help menu system is just a matter of editing a set of
+ HTML files. Additional information about installing and customizing
+ the help file set is available at
+ <URL: http://www.irm.nara.kindai.ac.jp/lynxdev/README.help>.
+
+INSTALLING LYNX
+
+ To install Lynx, follow the steps in the INSTALLATION file, which is
+ located in the top directory of the source distribution. Win32 users
+ who need pre-compiled distributions should visit the site
+ <URL: http://www.fdisk.com/doslynx/lynxport.htm>.
+
+PROBLEMS
+
+ If you experience problems configuring, compiling or installing Lynx,
+ please read Section VI. "General installation instructions" in the
+ INSTALLATION file. Instructions are given there for reporting your
+ problem to the "lynx-dev" mailing list, which is frequented by experienced
+ Lynx users.
+
+LYNX-DEV MAILING LIST
+
+ To subscribe to lynx-dev, send email to
+ <URL: mailto:lynx-dev-request@nongnu.org>
+ with "subscribe" for a subject line.
+
+ If you wish to unsubscribe from lynx-dev, send email to
+ <URL: mailto:lynx-dev-request@nongnu.org>
+ with "unsubscribe" for a subject line.
+
+ Any messages you wish to post should be sent to
+ <URL: mailto:lynx-dev@nongnu.org>.
+
+ PLEASE use the lynx-dev list, NOT private email to the developers,
+ for questions or discussion about Lynx, or contributions of patches.
+ Patches should use the unified diff format (diff -u).
+
+ You need not be subscribed to the lynx-dev list in order to post. If
+ you post without subscribing, though, you should read replies to your
+ questions or comments in the archive since more often than not nobody
+ will send a carbon copy to you. View the archives at:
+ "lynx-dev Mailing list archives"
+ <URL: http://mail.gnu.org/mailman/listinfo/lynx-dev/>
+
+------------------------------------------------------------------------------
+-- vile:txtmode fc=72 noti
+-- $LynxId: README,v 1.36 2022/12/28 13:41:40 tom Exp $
+------------------------------------------------------------------------------
diff --git a/VMSPrint.com b/VMSPrint.com
new file mode 100644
index 0000000..d1e2c93
--- /dev/null
+++ b/VMSPrint.com
@@ -0,0 +1,15 @@
+$!
+$! Lynx_Dir:VMSPrint.com - Alan J. Hirsh (hirsh@atuk.aspentec.com)
+$! ---------------------
+$! Lynx deletes temporary files on exit. If your printer queue
+$! is very busy such that Lynx is deleting the files before they
+$! have been queued for printing, use PRINTER commands in lynx.cfg
+$! which invoke this script.
+$!
+$! PRINTER:description for menu:@Lynx_Dir\:VMSPrint queue_name %s:FALSE:58
+$!
+$! P1 = queue_name (e.g., sys$print) P2 = temporary Lynx file (%s)
+$! --------------------------------- -----------------------------
+$ copy 'P2' 'P2'_temp_print
+$ print/queue='P1'/delete 'P2'_temp_print
+$ exit
diff --git a/WWW/FreeofCharge.html b/WWW/FreeofCharge.html
new file mode 100644
index 0000000..2725dee
--- /dev/null
+++ b/WWW/FreeofCharge.html
@@ -0,0 +1,26 @@
+<!-- X-URL: http://www.w3.org/History/1993/WWW/Conditions/old/FreeofCharge.html -->
+<BASE HREF="http://www.w3.org/History/1993/WWW/Conditions/old/FreeofCharge.html">
+
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
+
+<HTML><HEAD><TITLE>
+CERN WWW software freely available</TITLE><NEXTID N="z9"></HEAD><BODY><H1>
+Software freely available</H1>The following CERN software is hereby put into
+the public domain.
+<UL>
+<LI>WWW basic ("line-mode") client <LI>WWW basic server <LI>WWW Library of
+common code.</UL>CERN relinquishes all intellectual property rights to this
+code, both source and binary form and permission is granted for anyone to use,
+duplicate,
+modify and redistribute it.<P>CERN provides absolutely NO WARRANTY OF ANY KIND
+with respect to this software.
+The entire risk as to the quality and performance of this software is with the
+user.
+IN NO EVENT WILL CERN BE LIABLE TO ANYONE FOR ANY DAMAGES ARISING OUT THE USE
+OF THIS SOFTWARE, INCLUDING, WITHOUT LIMITATION,
+DAMAGES RESULTING FROM LOST DATA OR LOST PROFITS, OR FOR ANY SPECIAL,
+INCIDENTAL OR CONSEQUENTIAL DAMAGES.<P>This is part of the <A
+HREF="Introduction.html" NAME="z8">
+CERN WWW</A> distribution conditions.<P>Declaration to this effect signed by
+the CERN directors of Administration (H. Weber) and Research (W.
+Hoogland), May 1993.</BODY></HTML>
diff --git a/WWW/Library/Implementation/HTAABrow.c b/WWW/Library/Implementation/HTAABrow.c
new file mode 100644
index 0000000..c963acd
--- /dev/null
+++ b/WWW/Library/Implementation/HTAABrow.c
@@ -0,0 +1,1354 @@
+/*
+ * $LynxId: HTAABrow.c,v 1.43 2018/05/11 22:54:19 tom Exp $
+ *
+ * MODULE HTAABrow.c
+ * BROWSER SIDE ACCESS AUTHORIZATION MODULE
+ *
+ * Contains the code for keeping track on server hostnames,
+ * port numbers, scheme names, usernames, passwords
+ * (and servers' public keys).
+ *
+ * IMPORTANT:
+ * Routines in this module use dynamic allocation, but free
+ * automatically all the memory reserved by them.
+ *
+ * Therefore the caller never has to (and never should)
+ * free() any object returned by these functions.
+ *
+ * Therefore also all the strings returned by this package
+ * are only valid until the next call to the same function
+ * is made. This approach is selected, because of the nature
+ * of access authorization: no string returned by the package
+ * needs to be valid longer than until the next call.
+ *
+ * This also makes it easy to plug the AA package in:
+ * you don't have to ponder whether to free() something
+ * here or is it done somewhere else (because it is always
+ * done somewhere else).
+ *
+ * The strings that the package needs to store are copied
+ * so the original strings given as parameters to AA
+ * functions may be freed or modified with no side effects.
+ *
+ * The AA package does not free() anything else than what
+ * it has itself allocated.
+ *
+ * AUTHORS:
+ * AL Ari Luotonen luotonen@dxcern.cern.ch
+ *
+ * HISTORY:
+ * Oct 17 AL Made corrections suggested by marca:
+ * Added if (!realm->username) return NULL;
+ * Changed some ""s to NULLs.
+ * Now doing calloc() to init uuencode source;
+ * otherwise HTUU_encode() reads uninitialized memory
+ * every now and then (not a real bug but not pretty).
+ * Corrected the formula for uuencode destination size.
+ *
+ * 28 Apr 1997 AJL Do Proxy Authorisation.
+ *
+ * BUGS:
+ *
+ *
+ */
+
+#include <HTUtils.h>
+#include <HTString.h>
+#include <HTParse.h> /* URL parsing function */
+#include <HTList.h> /* HTList object */
+#include <HTAlert.h> /* HTConfirm(), HTPrompt() */
+#include <HTAAUtil.h> /* AA common to both sides */
+#include <HTAssoc.h> /* Assoc list */
+#include <HTAccess.h> /* Are we using an HTTP gateway? */
+#include <HTAABrow.h> /* Implemented here */
+#include <HTUU.h> /* Uuencoding and uudecoding */
+
+#include <LYLeaks.h>
+
+/*
+ * Local datatype definitions
+ *
+ * HTAAServer contains all the information about one server.
+ */
+typedef struct {
+
+ char *hostname; /* Host's name */
+ int portnumber; /* Port number */
+ BOOL IsProxy; /* Is it a proxy? */
+ HTList *setups; /* List of protection setups
+ on this server; i.e., valid
+ authentication schemes and
+ templates when to use them.
+ This is actually a list of
+ HTAASetup objects. */
+ HTList *realms; /* Information about passwords */
+} HTAAServer;
+
+/*
+ * HTAASetup contains information about one server's one
+ * protected tree of documents.
+ */
+typedef struct {
+ HTAAServer *server; /* Which server serves this tree */
+ char *ctemplate; /* Template for this tree */
+ HTList *valid_schemes; /* Valid authentic.schemes */
+ HTAssocList **scheme_specifics; /* Scheme specific params */
+ BOOL retry; /* Failed last time -- reprompt (or whatever) */
+} HTAASetup;
+
+/*
+ * Information about usernames and passwords in
+ * Basic and Pubkey authentication schemes;
+ */
+typedef struct {
+ char *realmname; /* Password domain name */
+ char *username; /* Username in that domain */
+ char *password; /* Corresponding password */
+} HTAARealm;
+
+/*
+ * To free off all globals. - FM
+ */
+static void free_HTAAGlobals(void);
+static BOOL free_HTAAGlobalsSet = FALSE;
+static char *HTAA_composeAuthResult = NULL;
+static char *compose_auth_stringResult = NULL; /* Uuencoded presentation */
+
+/*
+ * Module-wide global variables
+ */
+static HTList *server_table = NULL; /* Browser's info about servers */
+static char *secret_key = NULL; /* Browser's latest secret key */
+static HTAASetup *current_setup = NULL; /* The server setup we are currently */
+
+ /* talking to */
+static char *current_hostname = NULL; /* The server's name and portnumber */
+static int current_portnumber = 80; /* where we are currently trying to */
+
+ /* connect. */
+static char *current_docname = NULL; /* The document's name we are */
+
+ /* trying to access. */
+static char *HTAAForwardAuth = NULL; /* Authorization: line to forward */
+
+ /* (used by gateway httpds) */
+static HTAASetup *proxy_setup = NULL; /* Same as above, but for Proxy -AJL */
+static char *proxy_hostname = NULL;
+static char *proxy_docname = NULL;
+static int proxy_portnumber = 80;
+
+/*** HTAAForwardAuth for enabling gateway-httpds to forward Authorization ***/
+
+void HTAAForwardAuth_set(const char *scheme_name,
+ const char *scheme_specifics)
+{
+ size_t len = (20
+ + (scheme_name ? strlen(scheme_name) : 0)
+ + (scheme_specifics ? strlen(scheme_specifics) : 0));
+
+ FREE(HTAAForwardAuth);
+ if ((HTAAForwardAuth = typecallocn(char, len)) == 0)
+ outofmem(__FILE__, "HTAAForwardAuth_set");
+
+ strcpy(HTAAForwardAuth, "Authorization: ");
+ if (scheme_name) {
+ strcat(HTAAForwardAuth, scheme_name);
+ strcat(HTAAForwardAuth, " ");
+ if (scheme_specifics) {
+ strcat(HTAAForwardAuth, scheme_specifics);
+ }
+ }
+}
+
+void HTAAForwardAuth_reset(void)
+{
+ FREE(HTAAForwardAuth);
+}
+
+/**************************** HTAAServer ***********************************/
+
+static void HTAASetup_delete(HTAASetup * killme); /* Forward */
+
+/* static HTAAServer_new()
+ * ALLOCATE A NEW NODE TO HOLD SERVER INFO
+ * AND ADD IT TO THE LIST OF SERVERS
+ * ON ENTRY:
+ * hostname is the name of the host that the server
+ * is running in.
+ * portnumber is the portnumber which the server listens.
+ * IsProxy should be TRUE if this is a proxy.
+ *
+ * ON EXIT:
+ * returns the newly-allocated node with all the strings
+ * duplicated.
+ * Strings will be automatically freed by
+ * the function HTAAServer_delete(), which also
+ * frees the node itself.
+ */
+static HTAAServer *HTAAServer_new(const char *hostname,
+ int portnumber,
+ int IsProxy)
+{
+ HTAAServer *server;
+
+ if ((server = typecalloc(HTAAServer)) == 0)
+ outofmem(__FILE__, "HTAAServer_new");
+
+ server->hostname = NULL;
+ server->portnumber = (portnumber > 0 ? portnumber : 80);
+ server->IsProxy = (BOOLEAN) IsProxy;
+ server->setups = HTList_new();
+ server->realms = HTList_new();
+
+ if (hostname)
+ StrAllocCopy(server->hostname, hostname);
+
+ if (!server_table)
+ server_table = HTList_new();
+
+ HTList_addObject(server_table, (void *) server);
+
+ return server;
+}
+
+/* static HTAAServer_delete()
+ *
+ * DELETE THE ENTRY FOR THE SERVER FROM THE HOST TABLE,
+ * AND FREE THE MEMORY USED BY IT.
+ *
+ * ON ENTRY:
+ * killme points to the HTAAServer to be freed.
+ *
+ * ON EXIT:
+ * returns nothing.
+ */
+static void HTAAServer_delete(HTAAServer *killme)
+{
+ int n, i;
+ HTAASetup *setup;
+ HTAARealm *realm;
+ HTList *cur;
+
+ if (killme) {
+ if (killme->setups != NULL) {
+ n = HTList_count(killme->setups);
+ for (i = (n - 1); i >= 0; i--) {
+ if ((setup = (HTAASetup *) HTList_objectAt(killme->setups,
+ i)) != NULL) {
+ HTAASetup_delete(setup);
+ setup = NULL;
+ }
+ }
+ HTList_delete(killme->setups);
+ killme->setups = NULL;
+ }
+
+ cur = killme->realms;
+ while (NULL != (realm = (HTAARealm *) HTList_nextObject(cur))) {
+ FREE(realm->realmname);
+ FREE(realm->username);
+ FREE(realm->password);
+ FREE(realm);
+ }
+ HTList_delete(killme->realms);
+ killme->realms = NULL;
+
+ FREE(killme->hostname);
+
+ HTList_removeObject(server_table, (void *) killme);
+ FREE(killme);
+ }
+}
+
+/* static HTAAServer_lookup()
+ * LOOK UP SERVER BY HOSTNAME AND PORTNUMBER
+ * ON ENTRY:
+ * hostname obvious.
+ * portnumber if non-positive defaults to 80.
+ * IsProxy should be TRUE if this is a proxy.
+ *
+ * Looks up the server in the module-global server_table.
+ *
+ * ON EXIT:
+ * returns pointer to a HTAAServer structure
+ * representing the looked-up server.
+ * NULL, if not found.
+ */
+static HTAAServer *HTAAServer_lookup(const char *hostname,
+ int portnumber,
+ int IsProxy)
+{
+ if (hostname) {
+ HTList *cur = server_table;
+ HTAAServer *server;
+
+ if (portnumber <= 0)
+ portnumber = 80;
+
+ while (NULL != (server = (HTAAServer *) HTList_nextObject(cur))) {
+ if (server->portnumber == portnumber &&
+ 0 == strcmp(server->hostname, hostname) &&
+ server->IsProxy == IsProxy)
+ return server;
+ }
+ }
+ return NULL; /* NULL parameter, or not found */
+}
+
+/*************************** HTAASetup *******************************/
+
+/* static HTAASetup_lookup()
+ * FIGURE OUT WHICH AUTHENTICATION SETUP THE SERVER
+ * IS USING FOR A GIVEN FILE ON A GIVEN HOST AND PORT
+ *
+ * ON ENTRY:
+ * hostname is the name of the server host machine.
+ * portnumber is the port that the server is running in.
+ * docname is the (URL-)pathname of the document we
+ * are trying to access.
+ * IsProxy should be TRUE if this is a proxy.
+ *
+ * This function goes through the information known about
+ * all the setups of the server, and finds out if the given
+ * filename resides in one of the protected directories.
+ *
+ * ON EXIT:
+ * returns NULL if no match.
+ * Otherwise, a HTAASetup structure representing
+ * the protected server setup on the corresponding
+ * document tree.
+ *
+ */
+static HTAASetup *HTAASetup_lookup(const char *hostname,
+ int portnumber,
+ const char *docname,
+ int IsProxy)
+{
+ HTAAServer *server;
+ HTAASetup *setup;
+
+ if (portnumber <= 0)
+ portnumber = 80;
+
+ if (hostname && docname && *hostname && *docname &&
+ NULL != (server = HTAAServer_lookup(hostname,
+ portnumber,
+ IsProxy))) {
+
+ HTList *cur = server->setups;
+
+ CTRACE((tfp, "%s %s (%s:%d:%s)\n",
+ "HTAASetup_lookup: resolving setup for",
+ (IsProxy ? "proxy" : "server"),
+ hostname, portnumber, docname));
+
+ while (NULL != (setup = (HTAASetup *) HTList_nextObject(cur))) {
+ if (HTAA_templateMatch(setup->ctemplate, docname)) {
+ CTRACE((tfp, "%s `%s' %s `%s'\n",
+ "HTAASetup_lookup:", docname,
+ "matched template", setup->ctemplate));
+ return setup;
+ } else {
+ CTRACE((tfp, "%s `%s' %s `%s'\n",
+ "HTAASetup_lookup:", docname,
+ "did NOT match template", setup->ctemplate));
+ }
+ } /* while setups remain */
+ }
+ /* if valid parameters and server found */
+ CTRACE((tfp, "%s `%s' %s\n",
+ "HTAASetup_lookup: No template matched",
+ NONNULL(docname),
+ "(so probably not protected)"));
+
+ return NULL; /* NULL in parameters, or not found */
+}
+
+/* static HTAASetup_new()
+ * CREATE A NEW SETUP NODE
+ * ON ENTRY:
+ * server is a pointer to a HTAAServer structure
+ * to which this setup belongs.
+ * ctemplate documents matching this template
+ * are protected according to this setup.
+ * valid_schemes a list containing all valid authentication
+ * schemes for this setup.
+ * If NULL, all schemes are disallowed.
+ * scheme_specifics is an array of assoc lists, which
+ * contain scheme specific parameters given
+ * by server in Authenticate: fields.
+ * If NULL, all scheme specifics are
+ * set to NULL.
+ * ON EXIT:
+ * returns a new HTAASetup node, and also adds it as
+ * part of the HTAAServer given as parameter.
+ */
+static HTAASetup *HTAASetup_new(HTAAServer *server, char *ctemplate,
+ HTList *valid_schemes,
+ HTAssocList **scheme_specifics)
+{
+ HTAASetup *setup;
+
+ if (!server || isEmpty(ctemplate))
+ return NULL;
+
+ if ((setup = typecalloc(HTAASetup)) == 0)
+ outofmem(__FILE__, "HTAASetup_new");
+
+ setup->retry = NO;
+ setup->server = server;
+ setup->ctemplate = NULL;
+ if (ctemplate)
+ StrAllocCopy(setup->ctemplate, ctemplate);
+ setup->valid_schemes = valid_schemes;
+ setup->scheme_specifics = scheme_specifics;
+
+ HTList_addObject(server->setups, (void *) setup);
+
+ return setup;
+}
+
+/* static HTAASetup_delete()
+ * FREE A HTAASetup STRUCTURE
+ * ON ENTRY:
+ * killme is a pointer to the structure to free().
+ *
+ * ON EXIT:
+ * returns nothing.
+ */
+static void HTAASetup_delete(HTAASetup * killme)
+{
+ int scheme;
+
+ if (killme) {
+ FREE(killme->ctemplate);
+ if (killme->valid_schemes) {
+ HTList_delete(killme->valid_schemes);
+ killme->valid_schemes = NULL;
+ }
+ for (scheme = 0; scheme < HTAA_MAX_SCHEMES; scheme++)
+ if (killme->scheme_specifics[scheme])
+ HTAssocList_delete(killme->scheme_specifics[scheme]);
+ FREE(killme->scheme_specifics);
+ FREE(killme);
+ }
+}
+
+/* static HTAASetup_updateSpecifics()
+ * COPY SCHEME SPECIFIC PARAMETERS
+ * TO HTAASetup STRUCTURE
+ * ON ENTRY:
+ * setup destination setup structure.
+ * specifics string array containing scheme
+ * specific parameters for each scheme.
+ * If NULL, all the scheme specific
+ * parameters are set to NULL.
+ *
+ * ON EXIT:
+ * returns nothing.
+ */
+static void HTAASetup_updateSpecifics(HTAASetup * setup, HTAssocList **specifics)
+{
+ int scheme;
+
+ if (setup) {
+ if (setup->scheme_specifics) {
+ for (scheme = 0; scheme < HTAA_MAX_SCHEMES; scheme++) {
+ if (setup->scheme_specifics[scheme])
+ HTAssocList_delete(setup->scheme_specifics[scheme]);
+ }
+ FREE(setup->scheme_specifics);
+ }
+ setup->scheme_specifics = specifics;
+ }
+}
+
+/*************************** HTAARealm **********************************/
+
+/* static HTAARealm_lookup()
+ * LOOKUP HTAARealm STRUCTURE BY REALM NAME
+ * ON ENTRY:
+ * realm_table a list of realm objects.
+ * realmname is the name of realm to look for.
+ *
+ * ON EXIT:
+ * returns the realm. NULL, if not found.
+ */
+static HTAARealm *HTAARealm_lookup(HTList *realm_table,
+ const char *realmname)
+{
+ if (realm_table && realmname) {
+ HTList *cur = realm_table;
+ HTAARealm *realm;
+
+ while (NULL != (realm = (HTAARealm *) HTList_nextObject(cur))) {
+ if (0 == strcmp(realm->realmname, realmname))
+ return realm;
+ }
+ }
+ return NULL; /* No table, NULL param, or not found */
+}
+
+/* static HTAARealm_new()
+ * CREATE A NODE CONTAINING USERNAME AND
+ * PASSWORD USED FOR THE GIVEN REALM.
+ * IF REALM ALREADY EXISTS, CHANGE
+ * USERNAME/PASSWORD.
+ * ON ENTRY:
+ * realm_table a list of realms to where to add
+ * the new one, too.
+ * realmname is the name of the password domain.
+ * username and
+ * password are what you can expect them to be.
+ *
+ * ON EXIT:
+ * returns the created realm.
+ */
+static HTAARealm *HTAARealm_new(HTList *realm_table,
+ const char *realmname,
+ const char *username,
+ const char *password)
+{
+ HTAARealm *realm;
+
+ realm = HTAARealm_lookup(realm_table, realmname);
+
+ if (!realm) {
+ if ((realm = typecalloc(HTAARealm)) == 0)
+ outofmem(__FILE__, "HTAARealm_new");
+
+ realm->realmname = NULL;
+ realm->username = NULL;
+ realm->password = NULL;
+ StrAllocCopy(realm->realmname, realmname);
+ if (realm_table)
+ HTList_addObject(realm_table, (void *) realm);
+ }
+ if (username)
+ StrAllocCopy(realm->username, username);
+ if (password)
+ StrAllocCopy(realm->password, password);
+
+ return realm;
+}
+
+BOOL HTAA_HaveUserinfo(const char *hostname)
+{
+ int gen_delims = 0;
+ BOOL result = FALSE;
+ char *my_info = NULL;
+
+ if (StrAllocCopy(my_info, hostname) != NULL) {
+ char *at_sign = HTSkipToAt(my_info, &gen_delims);
+
+ free(my_info);
+ if (at_sign != NULL && gen_delims == 0)
+ result = TRUE;
+ }
+ return result;
+}
+
+/*
+ * If there is userinfo in the hostname string, update the realm to use that
+ * information. The command-line "-auth" option will override this.
+ */
+static void fill_in_userinfo(HTAARealm *realm, const char *hostname)
+{
+ int gen_delims = 0;
+ char *my_info = NULL;
+ char *at_sign = HTSkipToAt(StrAllocCopy(my_info, hostname), &gen_delims);
+
+ if (at_sign != NULL && gen_delims == 0) {
+ char *colon;
+
+ *at_sign = '\0';
+ if ((colon = StrChr(my_info, ':')) != 0) {
+ *colon++ = '\0';
+ }
+ if (non_empty(my_info)) {
+ char *msg;
+ BOOL prior = non_empty(realm->username);
+
+ if (prior && strcmp(realm->username, my_info)) {
+ msg = 0;
+ HTSprintf0(&msg,
+ gettext("username for realm %s changed from %s to %s"),
+ realm->realmname,
+ realm->username,
+ my_info);
+ HTAlert(msg);
+ free(msg);
+ FREE(realm->username);
+ StrAllocCopy(realm->username, my_info);
+ } else if (!prior) {
+ StrAllocCopy(realm->username, my_info);
+ }
+ if (non_empty(colon)) {
+ prior = non_empty(realm->password);
+ if (prior && strcmp(realm->password, colon)) {
+ msg = 0;
+ HTSprintf0(&msg,
+ gettext("password for realm %s user %s changed"),
+ realm->realmname,
+ realm->username);
+ HTAlert(msg);
+ free(msg);
+ FREE(realm->password);
+ StrAllocCopy(realm->password, colon);
+ } else if (!prior) {
+ StrAllocCopy(realm->password, colon);
+ }
+ }
+ }
+ }
+ free(my_info);
+}
+
+/***************** Basic and Pubkey Authentication ************************/
+
+/* static compose_auth_string()
+ *
+ * COMPOSE Basic OR Pubkey AUTHENTICATION STRING;
+ * PROMPTS FOR USERNAME AND PASSWORD IF NEEDED
+ *
+ * ON ENTRY:
+ * hostname may include user- and password information
+ * scheme is either HTAA_BASIC or HTAA_PUBKEY.
+ * setup is the current server setup.
+ * IsProxy should be TRUE if this is a proxy.
+ *
+ * ON EXIT:
+ * returns a newly composed authorization string,
+ * (with, of course, a newly generated secret
+ * key and fresh timestamp, if Pubkey-scheme
+ * is being used).
+ * NULL, if something fails.
+ * NOTE:
+ * Like throughout the entire AA package, no string or structure
+ * returned by AA package needs to (or should) be freed.
+ *
+ */
+static char *compose_auth_string(const char *hostname,
+ HTAAScheme scheme,
+ HTAASetup * setup,
+ int IsProxy)
+{
+ char *cleartext = NULL; /* Cleartext presentation */
+ char *ciphertext = NULL; /* Encrypted presentation */
+ size_t len;
+ char *msg = NULL;
+ char *username = NULL;
+ char *password = NULL;
+ char *realmname = NULL;
+ char *theHost = NULL;
+ char *proxiedHost = NULL;
+ char *thePort = NULL;
+ HTAARealm *realm;
+ const char *i_net_addr = "0.0.0.0"; /* Change... @@@@ */
+ const char *timestamp = "42"; /* ... these @@@@ */
+
+ FREE(compose_auth_stringResult); /* From previous call */
+
+ if ((scheme != HTAA_BASIC && scheme != HTAA_PUBKEY) ||
+ !(setup &&
+ setup->scheme_specifics &&
+ setup->scheme_specifics[scheme] &&
+ setup->server &&
+ setup->server->realms))
+ return NULL;
+
+ realmname = HTAssocList_lookup(setup->scheme_specifics[scheme], "realm");
+ if (!realmname)
+ return NULL;
+
+ realm = HTAARealm_lookup(setup->server->realms, realmname);
+ setup->retry |= HTAA_HaveUserinfo(hostname);
+
+ if (!(realm &&
+ non_empty(realm->username) &&
+ non_empty(realm->password)) || setup->retry) {
+ if (!realm) {
+ CTRACE((tfp, "%s `%s' %s\n",
+ "compose_auth_string: realm:", realmname,
+ "not found -- creating"));
+ realm = HTAARealm_new(setup->server->realms,
+ realmname, NULL, NULL);
+ }
+ fill_in_userinfo(realm, hostname);
+ /*
+ * The template should be either the '*' global for everything on the
+ * server (always true for proxy authorization setups), or a path for
+ * the start of a protected limb, with no host field, but we'll check
+ * for a host anyway in case a WWW-Protection-Template header set an
+ * absolute URL instead of a path. If we do get a host from this, it
+ * will include the port. - FM
+ */
+ if ((!IsProxy) && using_proxy && setup->ctemplate) {
+ proxiedHost = HTParse(setup->ctemplate, "", PARSE_HOST);
+ if (proxiedHost && *proxiedHost != '\0') {
+ theHost = proxiedHost;
+ }
+ }
+ /*
+ * If we didn't get a host field from the template, set up the host
+ * name and port from the setup->server elements. - FM
+ */
+ if (!theHost)
+ theHost = setup->server->hostname;
+ if (setup->server->portnumber > 0 &&
+ setup->server->portnumber != 80) {
+ HTSprintf0(&thePort, ":%d", setup->server->portnumber);
+ }
+
+ HTSprintf0(&msg, gettext("Username for '%s' at %s '%s%s':"),
+ realm->realmname,
+ (IsProxy ? "proxy" : "server"),
+ (theHost ? theHost : "??"),
+ NonNull(thePort));
+ FREE(proxiedHost);
+ FREE(thePort);
+ if (non_empty(realm->username)) {
+ StrAllocCopy(username, realm->username);
+ }
+ if (non_empty(realm->password)) {
+ StrAllocCopy(password, realm->password);
+ }
+ HTPromptUsernameAndPassword(msg, &username, &password, IsProxy);
+
+ FREE(msg);
+ FREE(realm->username);
+ FREE(realm->password);
+
+ realm->username = username;
+ realm->password = password;
+
+ if (!realm->username || !realm->password) {
+ /*
+ * Signals to retry. - FM
+ */
+ return NULL;
+ } else if (*realm->username == '\0') {
+ /*
+ * Signals to abort. - FM
+ */
+ StrAllocCopy(compose_auth_stringResult, "");
+ return compose_auth_stringResult;
+ }
+ }
+
+ len = (strlen(NonNull(realm->username)) +
+ strlen(NonNull(realm->password)) + 3);
+
+ if (scheme == HTAA_PUBKEY) {
+#ifdef PUBKEY
+ /* Generate new secret key */
+ StrAllocCopy(secret_key, HTAA_generateRandomKey());
+#endif /* PUBKEY */
+ /* Room for secret key, timestamp and inet address */
+ len += strlen(NonNull(secret_key)) + 30;
+ } else {
+ FREE(secret_key);
+ }
+
+ if ((cleartext = typecallocn(char, len)) == 0)
+ outofmem(__FILE__, "compose_auth_string");
+
+ if (realm->username)
+ strcpy(cleartext, realm->username);
+ else
+ *cleartext = '\0';
+
+ strcat(cleartext, ":");
+
+ if (realm->password)
+ strcat(cleartext, realm->password);
+
+ if (scheme == HTAA_PUBKEY) {
+ strcat(cleartext, ":");
+ strcat(cleartext, i_net_addr);
+ strcat(cleartext, ":");
+ strcat(cleartext, timestamp);
+ strcat(cleartext, ":");
+ if (secret_key)
+ strcat(cleartext, secret_key);
+
+ if (!((ciphertext = typecallocn(char, 2 * len)) &&
+ (compose_auth_stringResult = typecallocn(char, 3 * len))))
+ outofmem(__FILE__, "compose_auth_string");
+
+#ifdef PUBKEY
+ HTPK_encrypt(cleartext, ciphertext, server->public_key);
+ HTUU_encode((unsigned char *) ciphertext, strlen(ciphertext),
+ compose_auth_stringResult);
+#endif /* PUBKEY */
+ FREE(cleartext);
+ FREE(ciphertext);
+ } else { /* scheme == HTAA_BASIC */
+ if (!(compose_auth_stringResult =
+ typecallocn(char, (4 * ((len + 2) / 3)) + 1)))
+ outofmem(__FILE__, "compose_auth_string");
+
+ HTUU_encode((unsigned char *) cleartext, strlen(cleartext),
+ compose_auth_stringResult);
+ FREE(cleartext);
+ }
+ return compose_auth_stringResult;
+}
+
+/* BROWSER static HTAA_selectScheme()
+ * SELECT THE AUTHENTICATION SCHEME TO USE
+ * ON ENTRY:
+ * setup is the server setup structure which can
+ * be used to make the decision about the
+ * used scheme.
+ *
+ * When new authentication methods are added to library
+ * this function makes the decision about which one to
+ * use at a given time. This can be done by inspecting
+ * environment variables etc.
+ *
+ * Currently only searches for the first valid scheme,
+ * and if nothing found suggests Basic scheme;
+ *
+ * ON EXIT:
+ * returns the authentication scheme to use.
+ */
+static HTAAScheme HTAA_selectScheme(HTAASetup * setup)
+{
+ int scheme;
+
+ if (setup && setup->valid_schemes) {
+ for (scheme = HTAA_BASIC; scheme < HTAA_MAX_SCHEMES; scheme++) {
+ void *object = (void *) (intptr_t) scheme;
+
+ if (-1 < HTList_indexOf(setup->valid_schemes, object))
+ return (HTAAScheme) scheme;
+ }
+ }
+ return HTAA_BASIC;
+}
+
+/*
+ * Purpose: Free off all module globals.
+ * Arguments: void
+ * Return Value: void
+ * Remarks/Portability/Dependencies/Restrictions:
+ * To be used at program exit.
+ * Revision History:
+ * 06-19-96 created - FM
+ */
+static void free_HTAAGlobals(void)
+{
+ HTAAServer *server;
+ int n, i;
+
+ if (server_table != NULL) {
+ n = HTList_count(server_table);
+ for (i = (n - 1); i >= 0; i--) {
+ if ((server = (HTAAServer *) HTList_objectAt(server_table,
+ i)) != NULL) {
+ HTAAServer_delete(server);
+ server = NULL;
+ }
+ }
+ HTList_delete(server_table);
+ server_table = NULL;
+ }
+
+ HTAAForwardAuth_reset();
+ FREE(HTAA_composeAuthResult);
+ FREE(current_hostname);
+ FREE(current_docname);
+ FREE(proxy_hostname);
+ FREE(proxy_docname);
+ FREE(compose_auth_stringResult);
+ FREE(secret_key);
+}
+
+/* BROWSER PUBLIC HTAA_composeAuth()
+ *
+ * SELECT THE AUTHENTICATION SCHEME AND
+ * COMPOSE THE ENTIRE AUTHORIZATION HEADER LINE
+ * IF WE ALREADY KNOW THAT THE HOST REQUIRES AUTHENTICATION
+ *
+ * ON ENTRY:
+ * hostname is the hostname of the server.
+ * portnumber is the portnumber in which the server runs.
+ * docname is the pathname of the document (as in URL)
+ * IsProxy should be TRUE if this is a proxy.
+ *
+ * ON EXIT:
+ * returns NULL, if no authorization seems to be needed, or
+ * if it is the entire Authorization: line, e.g.
+ *
+ * "Authorization: Basic username:password"
+ *
+ * As usual, this string is automatically freed.
+ */
+char *HTAA_composeAuth(const char *hostname,
+ const int portnumber,
+ const char *docname,
+ int IsProxy)
+{
+ char *auth_string;
+ BOOL retry;
+ HTAAScheme scheme;
+ size_t len;
+
+ /*
+ * Setup atexit() freeing if not done already. - FM
+ */
+ if (!free_HTAAGlobalsSet) {
+#ifdef LY_FIND_LEAKS
+ atexit(free_HTAAGlobals);
+#endif
+ free_HTAAGlobalsSet = TRUE;
+ }
+
+ /*
+ * Make gateway httpds pass authorization field as it was received. (This
+ * still doesn't really work because Authenticate: headers from remote
+ * server are not forwarded to client yet so it cannot really know that it
+ * should send authorization; I will not implement it yet because I feel we
+ * will soon change radically the way requests are represented to allow
+ * multithreading on server-side. Life is hard.)
+ */
+ if (HTAAForwardAuth) {
+ CTRACE((tfp, "HTAA_composeAuth: %s\n",
+ "Forwarding received authorization"));
+ StrAllocCopy(HTAA_composeAuthResult, HTAAForwardAuth);
+ HTAAForwardAuth_reset(); /* Just a precaution */
+ return HTAA_composeAuthResult;
+ }
+
+ FREE(HTAA_composeAuthResult); /* From previous call */
+
+ if (IsProxy) {
+ /*
+ * Proxy Authorization required. - AJL
+ */
+
+ CTRACE((tfp, "Composing Proxy Authorization for %s:%d/%s\n",
+ hostname, portnumber, docname));
+
+ if (proxy_portnumber != portnumber ||
+ !proxy_hostname || !proxy_docname ||
+ !hostname || !docname ||
+ 0 != strcmp(proxy_hostname, hostname) ||
+ 0 != strcmp(proxy_docname, docname)) {
+
+ retry = NO;
+
+ proxy_portnumber = portnumber;
+
+ if (hostname)
+ StrAllocCopy(proxy_hostname, hostname);
+ else
+ FREE(proxy_hostname);
+
+ if (docname)
+ StrAllocCopy(proxy_docname, docname);
+ else
+ FREE(proxy_docname);
+ } else {
+ retry = YES;
+ }
+
+ if (!proxy_setup || !retry)
+ proxy_setup = HTAASetup_lookup(hostname, portnumber,
+ docname, IsProxy);
+
+ if (!proxy_setup)
+ return NULL;
+
+ switch (scheme = HTAA_selectScheme(proxy_setup)) {
+ case HTAA_BASIC:
+ case HTAA_PUBKEY:
+ auth_string = compose_auth_string(hostname, scheme, proxy_setup, IsProxy);
+ break;
+ case HTAA_KERBEROS_V4:
+ /* OTHER AUTHENTICATION ROUTINES ARE CALLED HERE */
+ default:
+ {
+ char *msg = NULL;
+
+ HTSprintf0(&msg, "%s `%s'",
+ gettext("This client doesn't know how to compose proxy authorization information for scheme"),
+ HTAAScheme_name(scheme));
+ HTAlert(msg);
+ FREE(msg);
+ auth_string = NULL;
+ }
+ } /* switch scheme */
+
+ proxy_setup->retry = NO;
+
+ if (!auth_string)
+ /*
+ * Signal a failure. - FM
+ */
+ return NULL; /* Added by marca. */
+ if (*auth_string == '\0') {
+ /*
+ * Signal an abort. - FM
+ */
+ StrAllocCopy(HTAA_composeAuthResult, "");
+ return (HTAA_composeAuthResult);
+ }
+ len = strlen(auth_string) + strlen(HTAAScheme_name(scheme)) + 26;
+ if ((HTAA_composeAuthResult = typecallocn(char, len)) == 0)
+ outofmem(__FILE__, "HTAA_composeAuth");
+
+ strcpy(HTAA_composeAuthResult, "Proxy-Authorization: ");
+
+ } else {
+ /*
+ * Normal WWW authorization.
+ */
+ CTRACE((tfp, "Composing Authorization for %s:%d/%s\n",
+ hostname, portnumber, docname));
+
+ if (current_portnumber != portnumber ||
+ !current_hostname || !current_docname ||
+ !hostname || !docname ||
+ 0 != strcmp(current_hostname, hostname) ||
+ 0 != strcmp(current_docname, docname)) {
+
+ retry = NO;
+
+ current_portnumber = portnumber;
+
+ if (hostname)
+ StrAllocCopy(current_hostname, hostname);
+ else
+ FREE(current_hostname);
+
+ if (docname)
+ StrAllocCopy(current_docname, docname);
+ else
+ FREE(current_docname);
+ } else {
+ retry = YES;
+ }
+
+ if (!current_setup || !retry)
+ current_setup = HTAASetup_lookup(hostname, portnumber,
+ docname, IsProxy);
+
+ if (!current_setup)
+ return NULL;
+
+ switch (scheme = HTAA_selectScheme(current_setup)) {
+ case HTAA_BASIC:
+ case HTAA_PUBKEY:
+ auth_string = compose_auth_string(hostname, scheme, current_setup, IsProxy);
+ break;
+ case HTAA_KERBEROS_V4:
+ /* OTHER AUTHENTICATION ROUTINES ARE CALLED HERE */
+ default:
+ {
+ char *msg = 0;
+
+ HTSprintf0(&msg, "%s `%s'",
+ gettext("This client doesn't know how to compose authorization information for scheme"),
+ HTAAScheme_name(scheme));
+ HTAlert(msg);
+ FREE(msg);
+ auth_string = NULL;
+ }
+ } /* switch scheme */
+
+ current_setup->retry = NO;
+
+ if (!auth_string)
+ /*
+ * Signal a failure. - FM
+ */
+ return NULL; /* Added by marca. */
+ if (*auth_string == '\0') {
+ /*
+ * Signal an abort. - FM
+ */
+ StrAllocCopy(HTAA_composeAuthResult, "");
+ return (HTAA_composeAuthResult);
+ }
+
+ len = strlen(auth_string) + strlen(HTAAScheme_name(scheme)) + 20;
+ if ((HTAA_composeAuthResult = typecallocn(char, len)) == 0)
+ outofmem(__FILE__, "HTAA_composeAuth");
+
+ strcpy(HTAA_composeAuthResult, "Authorization: ");
+ }
+
+ strcat(HTAA_composeAuthResult, HTAAScheme_name(scheme));
+ strcat(HTAA_composeAuthResult, " ");
+ strcat(HTAA_composeAuthResult, auth_string);
+ return HTAA_composeAuthResult;
+}
+
+/* BROWSER PUBLIC HTAA_shouldRetryWithAuth()
+ *
+ * DETERMINES IF WE SHOULD RETRY THE SERVER
+ * WITH AUTHORIZATION
+ * (OR IF ALREADY RETRIED, WITH A DIFFERENT
+ * USERNAME AND/OR PASSWORD (IF MISSPELLED))
+ * ON ENTRY:
+ * start_of_headers is the first block already read from socket,
+ * but status line skipped; i.e., points to the
+ * start of the header section.
+ * length is the remaining length of the first block.
+ * soc is the socket to read the rest of server reply.
+ * IsProxy should be TRUE if this is a proxy.
+ *
+ * This function should only be called when
+ * server has replied with a 401 (Unauthorized)
+ * status code.
+ * ON EXIT:
+ * returns YES, if connection should be retried.
+ * The node containing all the necessary
+ * information is
+ * * either constructed if it does not exist
+ * * or password is reset to NULL to indicate
+ * that username and password should be
+ * reprompted when composing Authorization:
+ * field (in function HTAA_composeAuth()).
+ * NO, otherwise.
+ */
+BOOL HTAA_shouldRetryWithAuth(char *start_of_headers,
+ size_t length,
+ int soc,
+ int IsProxy)
+{
+ HTAAScheme scheme;
+ char *line = NULL;
+ int num_schemes = 0;
+ HTList *valid_schemes = HTList_new();
+ HTAssocList **scheme_specifics = NULL;
+ char *ctemplate = NULL;
+ char *temp = NULL;
+ BOOL result = NO;
+
+ /*
+ * Setup atexit() freeing if not done already. - FM
+ */
+ if (!free_HTAAGlobalsSet) {
+#ifdef LY_FIND_LEAKS
+ atexit(free_HTAAGlobals);
+#endif
+ free_HTAAGlobalsSet = TRUE;
+ }
+
+ /*
+ * Read server reply header lines
+ */
+ CTRACE((tfp, "Server reply header lines:\n"));
+
+ HTAA_setupReader(start_of_headers, length, soc);
+ while (NULL != (line = HTAA_getUnfoldedLine()) && *line != '\0') {
+ CTRACE((tfp, "%s\n", line));
+
+ if (StrChr(line, ':')) { /* Valid header line */
+
+ char *p = line;
+ char *fieldname = HTNextField(&p);
+ char *arg1 = HTNextField(&p);
+ char *args = p;
+
+ if ((IsProxy &&
+ 0 == strcasecomp(fieldname, "Proxy-Authenticate:")) ||
+ (!IsProxy &&
+ 0 == strcasecomp(fieldname, "WWW-Authenticate:"))) {
+ if (isEmpty(arg1) || isEmpty(args)) {
+ HTSprintf0(&temp, gettext("Invalid header '%s%s%s%s%s'"), line,
+ (non_empty(arg1) ? " " : ""),
+ NonNull(arg1),
+ (non_empty(args) ? " " : ""),
+ NonNull(args));
+ HTAlert(temp);
+ FREE(temp);
+ } else if (HTAA_UNKNOWN != (scheme = HTAAScheme_enum(arg1))) {
+ HTList_addObject(valid_schemes, (void *) scheme);
+ if (!scheme_specifics) {
+ int i;
+
+ scheme_specifics =
+ typecallocn(HTAssocList *, HTAA_MAX_SCHEMES);
+
+ if (!scheme_specifics)
+ outofmem(__FILE__, "HTAA_shouldRetryWithAuth");
+
+ for (i = 0; i < HTAA_MAX_SCHEMES; i++)
+ scheme_specifics[i] = NULL;
+ }
+ scheme_specifics[scheme] = HTAA_parseArgList(args);
+ num_schemes++;
+ } else {
+ CTRACE((tfp, "Unknown scheme `%s' %s\n",
+ NONNULL(arg1),
+ (IsProxy ?
+ "in Proxy-Authenticate: field" :
+ "in WWW-Authenticate: field")));
+ }
+ }
+
+ else if (!IsProxy &&
+ 0 == strcasecomp(fieldname, "WWW-Protection-Template:")) {
+ CTRACE((tfp, "Protection template set to `%s'\n", arg1));
+ StrAllocCopy(ctemplate, arg1);
+ }
+
+ } else {
+ CTRACE((tfp, "Invalid header line `%s' ignored\n", line));
+ }
+
+ FREE(line);
+ } /* while header lines remain */
+ FREE(line);
+
+ /*
+ * So should we retry with authorization?
+ */
+ if (IsProxy) {
+ if (num_schemes == 0) {
+ /*
+ * No proxy authorization valid
+ */
+ proxy_setup = NULL;
+ result = NO;
+ }
+ /*
+ * Doing it for proxy. -AJL
+ */
+ else if (proxy_setup && proxy_setup->server) {
+ /*
+ * We have already tried with proxy authorization. Either we don't
+ * have access or username or password was misspelled.
+ *
+ * Update scheme-specific parameters (in case they have expired by
+ * chance).
+ */
+ HTAASetup_updateSpecifics(proxy_setup, scheme_specifics);
+
+ if (NO == HTConfirm(AUTH_FAILED_PROMPT)) {
+ proxy_setup = NULL;
+ result = NO;
+ } else {
+ /*
+ * Re-ask username+password (if misspelled).
+ */
+ HTList_delete(valid_schemes);
+ proxy_setup->retry = YES;
+ result = YES;
+ }
+ } else {
+ /*
+ * proxy_setup == NULL, i.e., we have a first connection to a
+ * protected server or the server serves a wider set of documents
+ * than we expected so far.
+ */
+ HTAAServer *server = HTAAServer_lookup(proxy_hostname,
+ proxy_portnumber,
+ IsProxy);
+
+ if (!server) {
+ server = HTAAServer_new(proxy_hostname,
+ proxy_portnumber,
+ IsProxy);
+ }
+ if (!ctemplate) /* Proxy matches everything -AJL */
+ StrAllocCopy(ctemplate, "*");
+ proxy_setup = HTAASetup_new(server,
+ ctemplate,
+ valid_schemes,
+ scheme_specifics);
+ FREE(ctemplate);
+
+ HTAlert(gettext("Proxy authorization required -- retrying"));
+ result = YES;
+ }
+ }
+ /*
+ * Normal WWW authorization.
+ */
+ else if (num_schemes == 0) {
+ /*
+ * No authorization valid.
+ */
+ current_setup = NULL;
+ result = NO;
+ } else if (current_setup && current_setup->server) {
+ /*
+ * So we have already tried with WWW authorization. Either we don't
+ * have access or username or password was misspelled.
+ *
+ * Update scheme-specific parameters (in case they have expired by
+ * chance).
+ */
+ HTAASetup_updateSpecifics(current_setup, scheme_specifics);
+
+ if (NO == HTConfirm(AUTH_FAILED_PROMPT)) {
+ current_setup = NULL;
+ result = NO;
+ } else {
+ /*
+ * Re-ask username+password (if misspelled).
+ */
+ current_setup->retry = YES;
+ result = YES;
+ }
+ } else {
+ /*
+ * current_setup == NULL, i.e., we have a first connection to a
+ * protected server or the server serves a wider set of documents than
+ * we expected so far.
+ */
+ HTAAServer *server = HTAAServer_lookup(current_hostname,
+ current_portnumber,
+ IsProxy);
+
+ if (!server) {
+ server = HTAAServer_new(current_hostname,
+ current_portnumber,
+ IsProxy);
+ }
+ if (!ctemplate)
+ ctemplate = HTAA_makeProtectionTemplate(current_docname);
+ current_setup = HTAASetup_new(server,
+ ctemplate,
+ valid_schemes,
+ scheme_specifics);
+ FREE(ctemplate);
+
+ HTAlert(gettext("Access without authorization denied -- retrying"));
+ result = YES;
+ }
+
+ if (result == NO) {
+ HTList_delete(valid_schemes);
+ }
+ return result;
+}
+
+/*
+ * This function clears all authorization information by
+ * invoking the free_HTAAGlobals() function, which normally
+ * is invoked at exit. It allows a browser command to do
+ * this at any time, for example, if the user is leaving
+ * the terminal for a period of time, but does not want
+ * to end the current session. - FM
+ */
+void HTClearHTTPAuthInfo(void)
+{
+ /*
+ * Need code to check cached documents against the protection templates,
+ * and do something to ensure that any protected documents no longer can be
+ * accessed without a new retrieval. - FM
+ */
+
+ /*
+ * Now free all of the authorization info, and reset the
+ * free_HTAAGlobalsSet flag. - FM
+ */
+ free_HTAAGlobals();
+ free_HTAAGlobalsSet = FALSE;
+}
diff --git a/WWW/Library/Implementation/HTAABrow.h b/WWW/Library/Implementation/HTAABrow.h
new file mode 100644
index 0000000..f151deb
--- /dev/null
+++ b/WWW/Library/Implementation/HTAABrow.h
@@ -0,0 +1,142 @@
+/*
+ * $LynxId: HTAABrow.h,v 1.17 2016/11/24 23:32:22 tom Exp $
+ *
+ * BROWSER SIDE ACCESS AUTHORIZATION MODULE
+
+ This module is the browser side interface to Access Authorization (AA) package. It
+ contains code only for browser.
+
+ Important to know about memory allocation:
+
+ Routines in this module use dynamic allocation, but free automatically all the memory
+ reserved by them.
+
+ Therefore the caller never has to (and never should) free() any object returned by
+ these functions.
+
+ Therefore also all the strings returned by this package are only valid until the next
+ call to the same function is made. This approach is selected, because of the nature of
+ access authorization: no string returned by the package needs to be valid longer than
+ until the next call.
+
+ This also makes it easy to plug the AA package in: you don't have to ponder whether to
+ free()something here or is it done somewhere else (because it is always done somewhere
+ else).
+
+ The strings that the package needs to store are copied so the original strings given as
+ parameters to AA functions may be freed or modified with no side effects.
+
+ Also note:The AA package does not free() anything else than what it has itself
+ allocated.
+
+ */
+
+#ifndef HTAABROW_H
+#define HTAABROW_H
+
+#include <HTAAUtil.h> /* Common parts of AA */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ Routines for Browser Side Recording of AA Info
+
+ Most of the browser-side AA is done by the following two functions (which are called
+ from file HTTP.c so the browsers using libwww only need to be linked with the new
+ library and not be changed at all):
+
+ HTAA_composeAuth() composes the Authorization: line contents, if the AA package
+ thinks that the given document is protected. Otherwise this function returns NULL.
+ This function also calls the functions HTPrompt(),HTPromptPassword() and HTConfirm()
+ to get the username, password and some confirmation from the user.
+
+ HTAA_shouldRetryWithAuth() determines whether to retry the request with AA or with a
+ new AA (in case username or password was misspelled).
+
+ */
+/* PUBLIC HTAA_composeAuth()
+ *
+ * COMPOSE THE ENTIRE AUTHORIZATION HEADER LINE IF WE
+ * ALREADY KNOW, THAT THE HOST MIGHT REQUIRE AUTHORIZATION
+ *
+ * ON ENTRY:
+ * hostname is the hostname of the server.
+ * portnumber is the portnumber in which the server runs.
+ * docname is the pathname of the document (as in URL)
+ *
+ * ON EXIT:
+ * returns NULL, if no authorization seems to be needed, or
+ * if it is the entire Authorization: line, e.g.
+ *
+ * "Authorization: basic username:password"
+ *
+ * As usual, this string is automatically freed.
+ */
+ extern char *HTAA_composeAuth(const char *hostname,
+ const int portnumber,
+ const char *docname,
+ int IsProxy);
+
+/* BROWSER PUBLIC HTAA_shouldRetryWithAuth()
+ *
+ * DETERMINES IF WE SHOULD RETRY THE SERVER
+ * WITH AUTHORIZATION
+ * (OR IF ALREADY RETRIED, WITH A DIFFERENT
+ * USERNAME AND/OR PASSWORD (IF MISSPELLED))
+ * ON ENTRY:
+ * start_of_headers is the first block already read from socket,
+ * but status line skipped; i.e., points to the
+ * start of the header section.
+ * length is the remaining length of the first block.
+ * soc is the socket to read the rest of server reply.
+ *
+ * This function should only be called when
+ * server has replied with a 401 (Unauthorized)
+ * status code.
+ * ON EXIT:
+ * returns YES, if connection should be retried.
+ * The node containing all the necessary
+ * information is
+ * * either constructed if it does not exist
+ * * or password is reset to NULL to indicate
+ * that username and password should be
+ * reprompted when composing Authorization:
+ * field (in function HTAA_composeAuth()).
+ * NO, otherwise.
+ */
+ extern BOOL HTAA_shouldRetryWithAuth(char *start_of_headers,
+ size_t length,
+ int soc,
+ int IsProxy);
+
+/*
+ * Function to allow clearing of all Authorization info
+ * via a browser command. - FM
+ */
+ extern void HTClearHTTPAuthInfo(void);
+
+/*
+ * Check if a hostname-string contains user information.
+ */
+ extern BOOL HTAA_HaveUserinfo(const char *hostname);
+
+/*
+
+Enabling Gateway httpds to Forward Authorization
+
+ These functions should only be called from daemon code, and HTAAForwardAuth_reset()
+ must be called before the next request is handled to make sure that authorization
+ string isn't cached in daemon so that other people can access private files using
+ somebody else's previous authorization information.
+
+ */
+
+ extern void HTAAForwardAuth_set(const char *scheme_name,
+ const char *scheme_specifics);
+ extern void HTAAForwardAuth_reset(void);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* NOT HTAABROW_H */
diff --git a/WWW/Library/Implementation/HTAAProt.c b/WWW/Library/Implementation/HTAAProt.c
new file mode 100644
index 0000000..d5117f1
--- /dev/null
+++ b/WWW/Library/Implementation/HTAAProt.c
@@ -0,0 +1,738 @@
+/*
+ * $LynxId: HTAAProt.c,v 1.34 2016/11/24 15:29:50 tom Exp $
+ *
+ * MODULE HTAAProt.c
+ * PROTECTION FILE PARSING MODULE
+ *
+ * AUTHORS:
+ * AL Ari Luotonen luotonen@dxcern.cern.ch
+ * MD Mark Donszelmann duns@vxdeop.cern.ch
+ *
+ * HISTORY:
+ * 20 Oct 93 AL Now finds uid/gid for nobody/nogroup by name
+ * (doesn't use default 65534 right away).
+ * Also understands negative uids/gids.
+ * 14 Nov 93 MD Added VMS compatibility
+ *
+ * BUGS:
+ *
+ *
+ */
+
+#include <HTUtils.h>
+
+#ifndef VMS
+#ifndef NOUSERS
+#include <pwd.h> /* Unix password file routine: getpwnam() */
+#include <grp.h> /* Unix group file routine: getgrnam() */
+#endif /* NOUSERS */
+#endif /* not VMS */
+
+#include <HTAAUtil.h>
+#include <HTLex.h> /* Lexical analysor */
+#include <HTAAProt.h> /* Implemented here */
+
+#include <LYUtils.h>
+#include <LYLeaks.h>
+
+#define NOBODY 65534 /* -2 in 16-bit environment */
+#define NONESUCH 65533 /* -3 in 16-bit environment */
+
+/*
+ * Protection setup caching
+ */
+typedef struct {
+ char *prot_filename;
+ HTAAProt *prot;
+} HTAAProtCache;
+
+static HTList *prot_cache = NULL; /* Protection setup cache. */
+static HTAAProt *default_prot = NULL; /* Default protection. */
+static HTAAProt *current_prot = NULL; /* Current protection mode */
+
+ /* which is set up by callbacks */
+ /* from the rule system when */
+ /* a "protect" rule is matched. */
+
+#ifndef NOUSERS
+/* static isNumber()
+ * DOES A CHARACTER STRING REPRESENT A NUMBER
+ */
+static BOOL isNumber(const char *s)
+{
+ const char *cur = s;
+
+ if (isEmpty(s))
+ return NO;
+
+ if (*cur == '-')
+ cur++; /* Allow initial minus sign in a number */
+
+ while (*cur) {
+ if (*cur < '0' || *cur > '9')
+ return NO;
+ cur++;
+ }
+ return YES;
+}
+
+/* PUBLIC HTAA_getUid()
+ * GET THE USER ID TO CHANGE THE PROCESS UID TO
+ * ON ENTRY:
+ * No arguments.
+ *
+ * ON EXIT:
+ * returns the uid number to give to setuid() system call.
+ * Default is 65534 (nobody).
+ */
+int HTAA_getUid(void)
+{
+ int uid;
+
+ if (current_prot && current_prot->uid_name) {
+ if (isNumber(current_prot->uid_name)) {
+ uid = atoi(current_prot->uid_name);
+ if ((*HTAA_UidToName(uid)) != '\0') {
+ return uid;
+ }
+ } else { /* User name (not a number) */
+ if ((uid = HTAA_NameToUid(current_prot->uid_name)) != NONESUCH) {
+ return uid;
+ }
+ }
+ }
+ /*
+ * Ok, then let's get uid for nobody.
+ */
+ if ((uid = HTAA_NameToUid("nobody")) != NONESUCH) {
+ return uid;
+ }
+ /*
+ * Ok, then use default.
+ */
+ return NOBODY; /* nobody */
+}
+
+/* PUBLIC HTAA_getGid()
+ * GET THE GROUP ID TO CHANGE THE PROCESS GID TO
+ * ON ENTRY:
+ * No arguments.
+ *
+ * ON EXIT:
+ * returns the uid number to give to setgid() system call.
+ * Default is 65534 (nogroup).
+ */
+int HTAA_getGid(void)
+{
+ int gid;
+
+ if (current_prot && current_prot->gid_name) {
+ if (isNumber(current_prot->gid_name)) {
+ gid = atoi(current_prot->gid_name);
+ if (*HTAA_GidToName(gid) != '\0') {
+ return gid;
+ }
+ } else { /* Group name (not number) */
+ if ((gid = HTAA_NameToGid(current_prot->gid_name)) != NONESUCH) {
+ return gid;
+ }
+ }
+ }
+ /*
+ * Ok, then let's get gid for nogroup.
+ */
+ if ((gid = HTAA_NameToGid("nogroup")) != NONESUCH) {
+ return gid;
+ }
+ /*
+ * Ok, then use default.
+ */
+ return NOBODY; /* nogroup */
+}
+#endif /* !NOUSERS */
+
+/* static HTAA_setIds()
+ * SET UID AND GID (AS NAMES OR NUMBERS)
+ * TO HTAAProt STRUCTURE
+ * ON ENTRY:
+ * prot destination.
+ * ids is a string like "james.www" or "1422.69" etc.
+ * giving uid and gid.
+ *
+ * ON EXIT:
+ * returns nothing.
+ */
+static void HTAA_setIds(HTAAProt *prot, const char *ids)
+{
+ if (ids) {
+ char *local_copy = NULL;
+ char *point;
+
+ StrAllocCopy(local_copy, ids);
+ point = StrChr(local_copy, '.');
+ if (point) {
+ *(point++) = (char) 0;
+ StrAllocCopy(prot->gid_name, point);
+ } else {
+ StrAllocCopy(prot->gid_name, "nogroup");
+ }
+ StrAllocCopy(prot->uid_name, local_copy);
+ FREE(local_copy);
+ } else {
+ StrAllocCopy(prot->uid_name, "nobody");
+ StrAllocCopy(prot->gid_name, "nogroup");
+ }
+}
+
+/* static HTAA_parseProtFile()
+ * PARSE A PROTECTION SETUP FILE AND
+ * PUT THE RESULT IN A HTAAProt STRUCTURE
+ * ON ENTRY:
+ * prot destination structure.
+ * fp open protection file.
+ *
+ * ON EXIT:
+ * returns nothing.
+ */
+static void HTAA_parseProtFile(HTAAProt *prot, FILE *fp)
+{
+ if (prot && fp) {
+ LexItem lex_item;
+ char *fieldname = NULL;
+
+ while (LEX_EOF != (lex_item = lex(fp))) {
+
+ while (lex_item == LEX_REC_SEP) /* Ignore empty lines */
+ lex_item = lex(fp);
+
+ if (lex_item == LEX_EOF) /* End of file */
+ break;
+
+ if (lex_item == LEX_ALPH_STR) { /* Valid setup record */
+
+ StrAllocCopy(fieldname, HTlex_buffer);
+
+ if (LEX_FIELD_SEP != (lex_item = lex(fp)))
+ unlex(lex_item); /* If someone wants to use colon */
+ /* after field name it's ok, but */
+ /* not required. Here we read it. */
+
+ if (0 == strncasecomp(fieldname, "Auth", 4)) {
+ lex_item = lex(fp);
+ while (lex_item == LEX_ALPH_STR) {
+ HTAAScheme scheme = HTAAScheme_enum(HTlex_buffer);
+
+ if (scheme != HTAA_UNKNOWN) {
+ if (!prot->valid_schemes)
+ prot->valid_schemes = HTList_new();
+ HTList_addObject(prot->valid_schemes, (void *) scheme);
+ CTRACE((tfp, "%s %s `%s'\n",
+ "HTAA_parseProtFile: valid",
+ "authentication scheme:",
+ HTAAScheme_name(scheme)));
+ } else {
+ CTRACE((tfp, "%s %s `%s'\n",
+ "HTAA_parseProtFile: unknown",
+ "authentication scheme:",
+ HTlex_buffer));
+ }
+
+ if (LEX_ITEM_SEP != (lex_item = lex(fp)))
+ break;
+ /*
+ * Here lex_item == LEX_ITEM_SEP; after item separator
+ * it is ok to have one or more newlines (LEX_REC_SEP)
+ * and they are ignored (continuation line).
+ */
+ do {
+ lex_item = lex(fp);
+ } while (lex_item == LEX_REC_SEP);
+ } /* while items in list */
+ }
+ /* if "Authenticate" */
+ else if (0 == strncasecomp(fieldname, "mask", 4)) {
+ prot->mask_group = HTAA_parseGroupDef(fp);
+ lex_item = LEX_REC_SEP; /*groupdef parser read this already */
+ if (TRACE) {
+ if (prot->mask_group) {
+ fprintf(tfp,
+ "HTAA_parseProtFile: Mask group:\n");
+ HTAA_printGroupDef(prot->mask_group);
+ } else
+ fprintf(tfp,
+ "HTAA_parseProtFile: Mask group syntax error\n");
+ }
+ }
+ /* if "Mask" */
+ else { /* Just a name-value pair, put it to assoclist */
+
+ if (LEX_ALPH_STR == (lex_item = lex(fp))) {
+ if (!prot->values)
+ prot->values = HTAssocList_new();
+ HTAssocList_add(prot->values, fieldname, HTlex_buffer);
+ lex_item = lex(fp); /* Read record separator */
+ CTRACE((tfp, "%s `%s' bound to value `%s'\n",
+ "HTAA_parseProtFile: Name",
+ fieldname, HTlex_buffer));
+ }
+ } /* else name-value pair */
+
+ }
+ /* if valid field */
+ if (lex_item != LEX_EOF && lex_item != LEX_REC_SEP) {
+ CTRACE((tfp, "%s %s %d (that line ignored)\n",
+ "HTAA_parseProtFile: Syntax error",
+ "in protection setup file at line",
+ HTlex_line));
+ do {
+ lex_item = lex(fp);
+ } while (lex_item != LEX_EOF && lex_item != LEX_REC_SEP);
+ } /* if syntax error */
+ } /* while not end-of-file */
+ FREE(fieldname);
+ } /* if valid parameters */
+}
+
+/* static HTAAProt_new()
+ * ALLOCATE A NEW HTAAProt STRUCTURE AND
+ * INITIALIZE IT FROM PROTECTION SETUP FILE
+ * ON ENTRY:
+ * cur_docname current filename after rule translations.
+ * prot_filename protection setup file name.
+ * If NULL, not an error.
+ * ids Uid and gid names or numbers,
+ * examples:
+ * james ( <=> james.nogroup)
+ * .www ( <=> nobody.www)
+ * james.www
+ * james.69
+ * 1422.69
+ * 1422.www
+ *
+ * May be NULL, defaults to nobody.nogroup.
+ * Should be NULL, if prot_file is NULL.
+ *
+ * ON EXIT:
+ * returns returns a new and initialized protection
+ * setup structure.
+ * If setup file is already read in (found
+ * in cache), only sets uid_name and gid
+ * fields, and returns that.
+ */
+static HTAAProt *HTAAProt_new(const char *cur_docname,
+ const char *prot_filename,
+ const char *ids)
+{
+ HTList *cur = prot_cache;
+ HTAAProtCache *cache_item = NULL;
+ HTAAProt *prot;
+ FILE *fp;
+
+ if (!prot_cache)
+ prot_cache = HTList_new();
+
+ while (NULL != (cache_item = (HTAAProtCache *) HTList_nextObject(cur))) {
+ if (!strcmp(cache_item->prot_filename, prot_filename))
+ break;
+ }
+ if (cache_item) {
+ prot = cache_item->prot;
+ CTRACE((tfp, "%s `%s' already in cache\n",
+ "HTAAProt_new: Protection file", prot_filename));
+ } else {
+ CTRACE((tfp, "HTAAProt_new: Loading protection file `%s'\n",
+ prot_filename));
+
+ if ((prot = typecalloc(HTAAProt)) == 0)
+ outofmem(__FILE__, "HTAAProt_new");
+
+ prot->ctemplate = NULL;
+ prot->filename = NULL;
+ prot->uid_name = NULL;
+ prot->gid_name = NULL;
+ prot->valid_schemes = HTList_new();
+ prot->mask_group = NULL; /* Masking disabled by defaults */
+ prot->values = HTAssocList_new();
+
+ if (prot_filename && NULL != (fp = fopen(prot_filename, TXT_R))) {
+ HTAA_parseProtFile(prot, fp);
+ fclose(fp);
+ if ((cache_item = typecalloc(HTAAProtCache)) == 0)
+ outofmem(__FILE__, "HTAAProt_new");
+
+ cache_item->prot = prot;
+ cache_item->prot_filename = NULL;
+ StrAllocCopy(cache_item->prot_filename, prot_filename);
+ HTList_addObject(prot_cache, (void *) cache_item);
+ } else {
+ CTRACE((tfp, "HTAAProt_new: %s `%s'\n",
+ "Unable to open protection setup file",
+ NONNULL(prot_filename)));
+ }
+ }
+
+ if (cur_docname)
+ StrAllocCopy(prot->filename, cur_docname);
+ HTAA_setIds(prot, ids);
+
+ return prot;
+}
+
+/* PUBLIC HTAA_setDefaultProtection()
+ * SET THE DEFAULT PROTECTION MODE
+ * (called by rule system when a
+ * "defprot" rule is matched)
+ * ON ENTRY:
+ * cur_docname is the current result of rule translations.
+ * prot_filename is the protection setup file (second argument
+ * for "defprot" rule, optional)
+ * ids contains user and group names separated by
+ * a dot, corresponding to the uid
+ * gid under which the server should run,
+ * default is "nobody.nogroup" (third argument
+ * for "defprot" rule, optional; can be given
+ * only if protection setup file is also given).
+ *
+ * ON EXIT:
+ * returns nothing.
+ * Sets the module-wide variable default_prot.
+ */
+void HTAA_setDefaultProtection(const char *cur_docname,
+ const char *prot_filename,
+ const char *ids)
+{
+ default_prot = NULL; /* Not free()'d because this is in cache */
+
+ if (prot_filename) {
+ default_prot = HTAAProt_new(cur_docname, prot_filename, ids);
+ } else {
+ CTRACE((tfp, "%s %s\n",
+ "HTAA_setDefaultProtection: ERROR: Protection file",
+ "not specified (obligatory for DefProt rule)!!\n"));
+ }
+}
+
+/* PUBLIC HTAA_setCurrentProtection()
+ * SET THE CURRENT PROTECTION MODE
+ * (called by rule system when a
+ * "protect" rule is matched)
+ * ON ENTRY:
+ * cur_docname is the current result of rule translations.
+ * prot_filename is the protection setup file (second argument
+ * for "protect" rule, optional)
+ * ids contains user and group names separated by
+ * a dot, corresponding to the uid
+ * gid under which the server should run,
+ * default is "nobody.nogroup" (third argument
+ * for "protect" rule, optional; can be given
+ * only if protection setup file is also given).
+ *
+ * ON EXIT:
+ * returns nothing.
+ * Sets the module-wide variable current_prot.
+ */
+void HTAA_setCurrentProtection(const char *cur_docname,
+ const char *prot_filename,
+ const char *ids)
+{
+ current_prot = NULL; /* Not free()'d because this is in cache */
+
+ if (prot_filename) {
+ current_prot = HTAAProt_new(cur_docname, prot_filename, ids);
+ } else {
+ if (default_prot) {
+ current_prot = default_prot;
+ HTAA_setIds(current_prot, ids);
+ CTRACE((tfp, "%s %s %s\n",
+ "HTAA_setCurrentProtection: Protection file",
+ "not specified for Protect rule",
+ "-- using default protection"));
+ } else {
+ CTRACE((tfp, "%s %s %s\n",
+ "HTAA_setCurrentProtection: ERROR: Protection",
+ "file not specified for Protect rule, and",
+ "default protection is not set!!"));
+ }
+ }
+}
+
+/* PUBLIC HTAA_getCurrentProtection()
+ * GET CURRENT PROTECTION SETUP STRUCTURE
+ * (this is set up by callbacks made from
+ * the rule system when matching "protect"
+ * (and "defprot") rules)
+ * ON ENTRY:
+ * HTTranslate() must have been called before calling
+ * this function.
+ *
+ * ON EXIT:
+ * returns a HTAAProt structure representing the
+ * protection setup of the HTTranslate()'d file.
+ * This must not be free()'d.
+ */
+HTAAProt *HTAA_getCurrentProtection(void)
+{
+ return current_prot;
+}
+
+/* PUBLIC HTAA_getDefaultProtection()
+ * GET DEFAULT PROTECTION SETUP STRUCTURE
+ * AND SET IT TO CURRENT PROTECTION
+ * (this is set up by callbacks made from
+ * the rule system when matching "defprot"
+ * rules)
+ * ON ENTRY:
+ * HTTranslate() must have been called before calling
+ * this function.
+ *
+ * ON EXIT:
+ * returns a HTAAProt structure representing the
+ * default protection setup of the HTTranslate()'d
+ * file (if HTAA_getCurrentProtection() returned
+ * NULL, i.e., if there is no "protect" rule
+ * but ACL exists, and we need to know default
+ * protection settings).
+ * This must not be free()'d.
+ * IMPORTANT:
+ * As a side-effect this tells the protection system that
+ * the file is in fact protected and sets the current
+ * protection mode to default.
+ */
+HTAAProt *HTAA_getDefaultProtection(void)
+{
+ if (!current_prot) {
+ current_prot = default_prot;
+ default_prot = NULL;
+ }
+ return current_prot;
+}
+
+/* SERVER INTERNAL HTAA_clearProtections()
+ * CLEAR DOCUMENT PROTECTION MODE
+ * (ALSO DEFAULT PROTECTION)
+ * (called by the rule system)
+ * ON ENTRY:
+ * No arguments.
+ *
+ * ON EXIT:
+ * returns nothing.
+ * Frees the memory used by protection information.
+ */
+void HTAA_clearProtections(void)
+{
+ current_prot = NULL; /* These are not freed because */
+ default_prot = NULL; /* they are actually in cache. */
+}
+
+typedef struct {
+ char *name;
+ int user;
+} USER_DATA;
+
+#ifndef NOUSERS
+static HTList *known_grp = NULL;
+static HTList *known_pwd = NULL;
+static BOOL uidgid_cache_inited = NO;
+#endif
+
+#ifdef LY_FIND_LEAKS
+static void clear_uidgid_cache(void)
+{
+#ifndef NOUSERS
+ USER_DATA *data;
+
+ if (known_grp) {
+ while ((data = HTList_removeLastObject(known_grp)) != NULL) {
+ FREE(data->name);
+ FREE(data);
+ }
+ FREE(known_grp);
+ }
+ if (known_pwd) {
+ while ((data = HTList_removeLastObject(known_pwd)) != NULL) {
+ FREE(data->name);
+ FREE(data);
+ }
+ FREE(known_pwd);
+ }
+#endif
+}
+#endif /* LY_FIND_LEAKS */
+
+#ifndef NOUSERS
+static void save_gid_info(const char *name, int user)
+{
+ USER_DATA *data = typecalloc(USER_DATA);
+
+ if (!data)
+ return;
+ if (!known_grp) {
+ known_grp = HTList_new();
+ if (!uidgid_cache_inited) {
+#ifdef LY_FIND_LEAKS
+ atexit(clear_uidgid_cache);
+#endif
+ uidgid_cache_inited = YES;
+ }
+ }
+ StrAllocCopy(data->name, name);
+ data->user = user;
+ HTList_addObject(known_grp, data);
+}
+#endif /* NOUSERS */
+
+#ifndef NOUSERS
+static void save_uid_info(const char *name, int user)
+{
+ USER_DATA *data = typecalloc(USER_DATA);
+
+ if (!data)
+ return;
+ if (!known_pwd) {
+ known_pwd = HTList_new();
+ if (!uidgid_cache_inited) {
+#ifdef LY_FIND_LEAKS
+ atexit(clear_uidgid_cache);
+#endif
+ uidgid_cache_inited = YES;
+ }
+ }
+ StrAllocCopy(data->name, name);
+ data->user = user;
+ HTList_addObject(known_pwd, data);
+}
+#endif /* !NOUSERS */
+
+/* PUBLIC HTAA_UidToName
+ * GET THE USER NAME
+ * ON ENTRY:
+ * The user-id
+ *
+ * ON EXIT:
+ * returns the user name, or an empty string if not found.
+ */
+const char *HTAA_UidToName(int uid GCC_UNUSED)
+{
+#ifndef NOUSERS
+ struct passwd *pw;
+ HTList *me = known_pwd;
+
+ while (HTList_nextObject(me)) {
+ USER_DATA *data = (USER_DATA *) (me->object);
+
+ if (uid == data->user)
+ return data->name;
+ }
+
+ if ((pw = getpwuid((uid_t) uid)) != 0
+ && pw->pw_name != 0) {
+ CTRACE((tfp, "%s(%d) returned (%s:%d:...)\n",
+ "HTAA_UidToName: getpwuid",
+ uid,
+ pw->pw_name, (int) pw->pw_uid));
+ save_uid_info(pw->pw_name, (int) pw->pw_uid);
+ return pw->pw_name;
+ }
+#endif
+ return "";
+}
+
+/* PUBLIC HTAA_NameToUid
+ * GET THE USER ID
+ * ON ENTRY:
+ * The user-name
+ *
+ * ON EXIT:
+ * returns the user id, or NONESUCH if not found.
+ */
+int HTAA_NameToUid(const char *name GCC_UNUSED)
+{
+#ifndef NOUSERS
+ struct passwd *pw;
+ HTList *me = known_pwd;
+
+ while (HTList_nextObject(me)) {
+ USER_DATA *data = (USER_DATA *) (me->object);
+
+ if (!strcmp(name, data->name))
+ return data->user;
+ }
+
+ if ((pw = getpwnam(name)) != 0) {
+ CTRACE((tfp, "%s(%s) returned (%s:%d:...)\n",
+ "HTAA_NameToUid: getpwnam",
+ name,
+ pw->pw_name, (int) pw->pw_uid));
+ save_uid_info(pw->pw_name, (int) pw->pw_uid);
+ return (int) pw->pw_uid;
+ }
+#endif
+ return NONESUCH;
+}
+
+/* PUBLIC HTAA_GidToName
+ * GET THE GROUP NAME
+ * ON ENTRY:
+ * The group-id
+ *
+ * ON EXIT:
+ * returns the group name, or an empty string if not found.
+ */
+const char *HTAA_GidToName(int gid GCC_UNUSED)
+{
+#ifndef NOUSERS
+ struct group *gr;
+ HTList *me = known_grp;
+
+ while (HTList_nextObject(me)) {
+ USER_DATA *data = (USER_DATA *) (me->object);
+
+ if (gid == data->user)
+ return data->name;
+ }
+
+ if ((gr = getgrgid((gid_t) gid)) != 0
+ && gr->gr_name != 0) {
+ CTRACE((tfp, "%s(%d) returned (%s:%d:...)\n",
+ "HTAA_GidToName: getgrgid",
+ gid,
+ gr->gr_name, (int) gr->gr_gid));
+ save_gid_info(gr->gr_name, (int) gr->gr_gid);
+ return gr->gr_name;
+ }
+#endif
+ return "";
+}
+
+/* PUBLIC HTAA_NameToGid
+ * GET THE GROUP ID
+ * ON ENTRY:
+ * The group-name
+ *
+ * ON EXIT:
+ * returns the group id, or NONESUCH if not found.
+ */
+int HTAA_NameToGid(const char *name GCC_UNUSED)
+{
+#ifndef NOUSERS
+ struct group *gr;
+ HTList *me = known_grp;
+
+ while (HTList_nextObject(me)) {
+ USER_DATA *data = (USER_DATA *) (me->object);
+
+ if (!strcmp(name, data->name))
+ return data->user;
+ }
+
+ if ((gr = getgrnam(name)) != 0) {
+ CTRACE((tfp, "%s(%s) returned (%s:%d:...)\n",
+ "HTAA_NameToGid: getgrnam",
+ name,
+ gr->gr_name, (int) gr->gr_gid));
+ save_gid_info(gr->gr_name, (int) gr->gr_gid);
+ return (int) gr->gr_gid;
+ }
+#endif
+ return NONESUCH;
+}
diff --git a/WWW/Library/Implementation/HTAAProt.h b/WWW/Library/Implementation/HTAAProt.h
new file mode 100644
index 0000000..22e3d92
--- /dev/null
+++ b/WWW/Library/Implementation/HTAAProt.h
@@ -0,0 +1,226 @@
+/* PROTECTION SETUP FILE
+
+ */
+
+#ifndef HTAAPROT_H
+#define HTAAPROT_H
+
+#include <HTGroup.h>
+#include <HTAssoc.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+
+Server's Representation of Document (Tree) Protections
+
+ */ typedef struct {
+ char *ctemplate; /* Template for this protection */
+ char *filename; /* Current document file */
+ char *uid_name; /* Effective uid (name of it) */
+ char *gid_name; /* Effective gid (name of it) */
+ GroupDef *mask_group; /* Allowed users and IP addresses */
+ HTList *valid_schemes; /* Valid authentication schemes */
+ HTAssocList *values; /* Association list for scheme specific */
+ /* parameters. */
+ } HTAAProt;
+
+/*
+
+Callbacks for rule system
+
+ The following three functioncs are called by the rule system:
+
+ HTAA_clearProtections() when starting to translate a filename
+
+ HTAA_setDefaultProtection() when "defprot" rule is matched
+
+ HTAA_setCurrentProtection() when "protect" rule is matched
+
+ Protection setup files are cached by these functions.
+
+ */
+
+/* PUBLIC HTAA_setDefaultProtection()
+ * SET THE DEFAULT PROTECTION MODE
+ * (called by rule system when a
+ * "defprot" rule is matched)
+ * ON ENTRY:
+ * cur_docname is the current result of rule translations.
+ * prot_filename is the protection setup file (second argument
+ * for "defprot" rule, optional)
+ * eff_ids contains user and group names separated by
+ * a dot, corresponding to the effective uid
+ * gid under which the server should run,
+ * default is "nobody.nogroup" (third argument
+ * for "defprot" rule, optional; can be given
+ * only if protection setup file is also given).
+ *
+ * ON EXIT:
+ * returns nothing.
+ * Sets the module-wide variable default_prot.
+ */
+ extern void HTAA_setDefaultProtection(const char *cur_docname,
+ const char *prot_filename,
+ const char *eff_ids);
+
+/* PUBLIC HTAA_setCurrentProtection()
+ * SET THE CURRENT PROTECTION MODE
+ * (called by rule system when a
+ * "protect" rule is matched)
+ * ON ENTRY:
+ * cur_docname is the current result of rule translations.
+ * prot_filename is the protection setup file (second argument
+ * for "protect" rule, optional)
+ * eff_ids contains user and group names separated by
+ * a dot, corresponding to the effective uid
+ * gid under which the server should run,
+ * default is "nobody.nogroup" (third argument
+ * for "protect" rule, optional; can be given
+ * only if protection setup file is also given).
+ *
+ * ON EXIT:
+ * returns nothing.
+ * Sets the module-wide variable current_prot.
+ */
+ extern void HTAA_setCurrentProtection(const char *cur_docname,
+ const char *prot_filename,
+ const char *eff_ids);
+
+/* SERVER INTERNAL HTAA_clearProtections()
+ * CLEAR DOCUMENT PROTECTION MODE
+ * (ALSO DEFAULT PROTECTION)
+ * (called by the rule system)
+ * ON ENTRY:
+ * No arguments.
+ *
+ * ON EXIT:
+ * returns nothing.
+ * Frees the memory used by protection information.
+ */
+ extern void HTAA_clearProtections(void);
+
+/*
+
+Getting Protection Settings
+
+ HTAA_getCurrentProtection() returns the current protection mode (if there was a
+ "protect" rule). NULL, if no "protect" rule has been matched.
+
+ HTAA_getDefaultProtection() sets the current protection mode to what it was set to
+ by "defprot" rule and also returns it (therefore after this call also
+ HTAA_getCurrentProtection() returns the same structure.
+
+ */
+
+/* PUBLIC HTAA_getCurrentProtection()
+ * GET CURRENT PROTECTION SETUP STRUCTURE
+ * (this is set up by callbacks made from
+ * the rule system when matching "protect"
+ * (and "defprot") rules)
+ * ON ENTRY:
+ * HTTranslate() must have been called before calling
+ * this function.
+ *
+ * ON EXIT:
+ * returns a HTAAProt structure representing the
+ * protection setup of the HTTranslate()'d file.
+ * This must not be free()'d.
+ */
+ extern HTAAProt *HTAA_getCurrentProtection(void);
+
+/* PUBLIC HTAA_getDefaultProtection()
+ * GET DEFAULT PROTECTION SETUP STRUCTURE
+ * (this is set up by callbacks made from
+ * the rule system when matching "defprot"
+ * rules)
+ * ON ENTRY:
+ * HTTranslate() must have been called before calling
+ * this function.
+ *
+ * ON EXIT:
+ * returns a HTAAProt structure representing the
+ * default protection setup of the HTTranslate()'d
+ * file (if HTAA_getCurrentProtection() returned
+ * NULL, i.e., if there is no "protect" rule
+ * but ACL exists, and we need to know default
+ * protection settings).
+ * This must not be free()'d.
+ */
+ extern HTAAProt *HTAA_getDefaultProtection(void);
+
+/*
+
+Get User and Group IDs to Which Set to
+
+ */
+
+#ifndef NOUSERS
+/* PUBLIC HTAA_getUid()
+ * GET THE USER ID TO CHANGE THE PROCESS UID TO
+ * ON ENTRY:
+ * No arguments.
+ *
+ * ON EXIT:
+ * returns the uid number to give to setuid() system call.
+ * Default is 65534 (nobody).
+ */
+ extern int HTAA_getUid(void);
+
+/* PUBLIC HTAA_getGid()
+ * GET THE GROUP ID TO CHANGE THE PROCESS GID TO
+ * ON ENTRY:
+ * No arguments.
+ *
+ * ON EXIT:
+ * returns the uid number to give to setgid() system call.
+ * Default is 65534 (nogroup).
+ */
+ extern int HTAA_getGid(void);
+#endif /* !NOUSERS */
+
+/* PUBLIC HTAA_UidToName
+ * GET THE USER NAME
+ * ON ENTRY:
+ * The user-id
+ *
+ * ON EXIT:
+ * returns the user name
+ */
+ extern const char *HTAA_UidToName(int uid);
+
+/* PUBLIC HTAA_NameToUid
+ * GET THE USER ID
+ * ON ENTRY:
+ * The user-name
+ *
+ * ON EXIT:
+ * returns the user id
+ */
+ extern int HTAA_NameToUid(const char *name);
+
+/* PUBLIC HTAA_GidToName
+ * GET THE GROUP NAME
+ * ON ENTRY:
+ * The group-id
+ *
+ * ON EXIT:
+ * returns the group name
+ */
+ extern const char *HTAA_GidToName(int gid);
+
+/* PUBLIC HTAA_NameToGid
+ * GET THE GROUP ID
+ * ON ENTRY:
+ * The group-name
+ *
+ * ON EXIT:
+ * returns the group id
+ */
+ extern int HTAA_NameToGid(const char *name);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* not HTAAPROT_H */
diff --git a/WWW/Library/Implementation/HTAAUtil.c b/WWW/Library/Implementation/HTAAUtil.c
new file mode 100644
index 0000000..1be26f9
--- /dev/null
+++ b/WWW/Library/Implementation/HTAAUtil.c
@@ -0,0 +1,605 @@
+/*
+ * $LynxId: HTAAUtil.c,v 1.36 2016/11/24 15:29:50 tom Exp $
+ *
+ * MODULE HTAAUtil.c
+ * COMMON PARTS OF ACCESS AUTHORIZATION MODULE
+ * FOR BOTH SERVER AND BROWSER
+ *
+ * IMPORTANT:
+ * Routines in this module use dynamic allocation, but free
+ * automatically all the memory reserved by them.
+ *
+ * Therefore the caller never has to (and never should)
+ * free() any object returned by these functions.
+ *
+ * Therefore also all the strings returned by this package
+ * are only valid until the next call to the same function
+ * is made. This approach is selected, because of the nature
+ * of access authorization: no string returned by the package
+ * needs to be valid longer than until the next call.
+ *
+ * This also makes it easy to plug the AA package in:
+ * you don't have to ponder whether to free() something
+ * here or is it done somewhere else (because it is always
+ * done somewhere else).
+ *
+ * The strings that the package needs to store are copied
+ * so the original strings given as parameters to AA
+ * functions may be freed or modified with no side effects.
+ *
+ * The AA package does not free() anything else than what
+ * it has itself allocated.
+ *
+ * AA (Access Authorization) package means modules which
+ * names start with HTAA.
+ *
+ * AUTHORS:
+ * AL Ari Luotonen luotonen@dxcern.cern.ch
+ * MD Mark Donszelmann duns@vxdeop.cern.ch
+ *
+ * HISTORY:
+ * 8 Nov 93 MD (VMS only) Added case insensitive comparison in HTAA_templateCaseMatch
+ *
+ *
+ * BUGS:
+ *
+ *
+ */
+
+#include <HTUtils.h>
+
+#include <HTAAUtil.h> /* Implemented here */
+#include <HTAssoc.h> /* Assoc list */
+#include <HTTCP.h>
+#include <HTTP.h>
+
+#include <LYStrings.h>
+#include <LYUtils.h>
+#include <LYLeaks.h>
+
+/* PUBLIC HTAAScheme_enum()
+ * TRANSLATE SCHEME NAME INTO
+ * A SCHEME ENUMERATION
+ *
+ * ON ENTRY:
+ * name is a string representing the scheme name.
+ *
+ * ON EXIT:
+ * returns the enumerated constant for that scheme.
+ */
+HTAAScheme HTAAScheme_enum(const char *name)
+{
+ char *upcased = NULL;
+
+ if (!name)
+ return HTAA_UNKNOWN;
+
+ StrAllocCopy(upcased, name);
+ LYUpperCase(upcased);
+
+ if (!StrNCmp(upcased, "NONE", 4)) {
+ FREE(upcased);
+ return HTAA_NONE;
+ } else if (!StrNCmp(upcased, "BASIC", 5)) {
+ FREE(upcased);
+ return HTAA_BASIC;
+ } else if (!StrNCmp(upcased, "PUBKEY", 6)) {
+ FREE(upcased);
+ return HTAA_PUBKEY;
+ } else if (!StrNCmp(upcased, "KERBEROSV4", 10)) {
+ FREE(upcased);
+ return HTAA_KERBEROS_V4;
+ } else if (!StrNCmp(upcased, "KERBEROSV5", 10)) {
+ FREE(upcased);
+ return HTAA_KERBEROS_V5;
+ } else {
+ FREE(upcased);
+ return HTAA_UNKNOWN;
+ }
+}
+
+/* PUBLIC HTAAScheme_name()
+ * GET THE NAME OF A GIVEN SCHEME
+ * ON ENTRY:
+ * scheme is one of the scheme enum values:
+ * HTAA_NONE, HTAA_BASIC, HTAA_PUBKEY, ...
+ *
+ * ON EXIT:
+ * returns the name of the scheme, i.e.
+ * "None", "Basic", "Pubkey", ...
+ */
+const char *HTAAScheme_name(HTAAScheme scheme)
+{
+ switch (scheme) {
+ case HTAA_NONE:
+ return "None";
+ case HTAA_BASIC:
+ return "Basic";
+ case HTAA_PUBKEY:
+ return "Pubkey";
+ case HTAA_KERBEROS_V4:
+ return "KerberosV4";
+ case HTAA_KERBEROS_V5:
+ return "KerberosV5";
+ case HTAA_UNKNOWN:
+ return "UNKNOWN";
+ default:
+ return "THIS-IS-A-BUG";
+ }
+}
+
+/* PUBLIC HTAAMethod_enum()
+ * TRANSLATE METHOD NAME INTO AN ENUMERATED VALUE
+ * ON ENTRY:
+ * name is the method name to translate.
+ *
+ * ON EXIT:
+ * returns HTAAMethod enumerated value corresponding
+ * to the given name.
+ */
+HTAAMethod HTAAMethod_enum(const char *name)
+{
+ if (!name)
+ return METHOD_UNKNOWN;
+
+ if (0 == strcasecomp(name, "GET"))
+ return METHOD_GET;
+ else if (0 == strcasecomp(name, "PUT"))
+ return METHOD_PUT;
+ else
+ return METHOD_UNKNOWN;
+}
+
+/* PUBLIC HTAAMethod_name()
+ * GET THE NAME OF A GIVEN METHOD
+ * ON ENTRY:
+ * method is one of the method enum values:
+ * METHOD_GET, METHOD_PUT, ...
+ *
+ * ON EXIT:
+ * returns the name of the scheme, i.e.
+ * "GET", "PUT", ...
+ */
+const char *HTAAMethod_name(HTAAMethod method)
+{
+ switch (method) {
+ case METHOD_GET:
+ return "GET";
+ case METHOD_PUT:
+ return "PUT";
+ case METHOD_UNKNOWN:
+ return "UNKNOWN";
+ default:
+ return "THIS-IS-A-BUG";
+ }
+}
+
+/* PUBLIC HTAAMethod_inList()
+ * IS A METHOD IN A LIST OF METHOD NAMES
+ * ON ENTRY:
+ * method is the method to look for.
+ * list is a list of method names.
+ *
+ * ON EXIT:
+ * returns YES, if method was found.
+ * NO, if not found.
+ */
+BOOL HTAAMethod_inList(HTAAMethod method, HTList *list)
+{
+ HTList *cur = list;
+ char *item;
+
+ while (NULL != (item = (char *) HTList_nextObject(cur))) {
+ CTRACE((tfp, " %s", item));
+ if (method == HTAAMethod_enum(item))
+ return YES;
+ }
+
+ return NO; /* Not found */
+}
+
+/* PUBLIC HTAA_templateMatch()
+ * STRING COMPARISON FUNCTION FOR FILE NAMES
+ * WITH ONE WILDCARD * IN THE TEMPLATE
+ * NOTE:
+ * This is essentially the same code as in HTRules.c, but it
+ * cannot be used because it is embedded in between other code.
+ * (In fact, HTRules.c should use this routine, but then this
+ * routine would have to be more sophisticated... why is life
+ * sometimes so hard...)
+ *
+ * ON ENTRY:
+ * ctemplate is a template string to match the file name
+ * against, may contain a single wildcard
+ * character * which matches zero or more
+ * arbitrary characters.
+ * filename is the filename (or pathname) to be matched
+ * against the template.
+ *
+ * ON EXIT:
+ * returns YES, if filename matches the template.
+ * NO, otherwise.
+ */
+BOOL HTAA_templateMatch(const char *ctemplate,
+ const char *filename)
+{
+ const char *p = ctemplate;
+ const char *q = filename;
+ int m;
+
+ for (; *p && *q && *p == *q; p++, q++) /* Find first mismatch */
+ ; /* do nothing else */
+
+ if (!*p && !*q)
+ return YES; /* Equally long equal strings */
+ else if ('*' == *p) { /* Wildcard */
+ p++; /* Skip wildcard character */
+ m = (int) (strlen(q) - strlen(p)); /* Amount to match to wildcard */
+ if (m < 0)
+ return NO; /* No match, filename too short */
+ else { /* Skip the matched characters and compare */
+ if (strcmp(p, q + m))
+ return NO; /* Tail mismatch */
+ else
+ return YES; /* Tail match */
+ }
+ /* if wildcard */
+ } else
+ return NO; /* Length or character mismatch */
+}
+
+/* PUBLIC HTAA_templateCaseMatch()
+ * STRING COMPARISON FUNCTION FOR FILE NAMES
+ * WITH ONE WILDCARD * IN THE TEMPLATE (Case Insensitive)
+ * NOTE:
+ * This is essentially the same code as in HTAA_templateMatch, but
+ * it compares case insensitive (for VMS). Reason for this routine
+ * is that HTAA_templateMatch gets called from several places, also
+ * there where a case sensitive match is needed, so one cannot just
+ * change the HTAA_templateMatch routine for VMS.
+ *
+ * ON ENTRY:
+ * template is a template string to match the file name
+ * against, may contain a single wildcard
+ * character * which matches zero or more
+ * arbitrary characters.
+ * filename is the filename (or pathname) to be matched
+ * against the template.
+ *
+ * ON EXIT:
+ * returns YES, if filename matches the template.
+ * NO, otherwise.
+ */
+BOOL HTAA_templateCaseMatch(const char *ctemplate,
+ const char *filename)
+{
+ const char *p = ctemplate;
+ const char *q = filename;
+ int m;
+
+ /* Find first mismatch */
+ for (; *p && *q && TOUPPER(*p) == TOUPPER(*q); p++, q++) ; /* do nothing else */
+
+ if (!*p && !*q)
+ return YES; /* Equally long equal strings */
+ else if ('*' == *p) { /* Wildcard */
+ p++; /* Skip wildcard character */
+ m = (int) (strlen(q) - strlen(p)); /* Amount to match to wildcard */
+ if (m < 0)
+ return NO; /* No match, filename too short */
+ else { /* Skip the matched characters and compare */
+ if (strcasecomp(p, q + m))
+ return NO; /* Tail mismatch */
+ else
+ return YES; /* Tail match */
+ }
+ /* if wildcard */
+ } else
+ return NO; /* Length or character mismatch */
+}
+
+/* PUBLIC HTAA_makeProtectionTemplate()
+ * CREATE A PROTECTION TEMPLATE FOR THE FILES
+ * IN THE SAME DIRECTORY AS THE GIVEN FILE
+ * (Used by server if there is no fancier way for
+ * it to tell the client, and by browser if server
+ * didn't send WWW-ProtectionTemplate: field)
+ * ON ENTRY:
+ * docname is the document pathname (from URL).
+ *
+ * ON EXIT:
+ * returns a template matching docname, and other files
+ * files in that directory.
+ *
+ * E.g. /foo/bar/x.html => /foo/bar/ *
+ * ^
+ * Space only to prevent it from
+ * being a comment marker here,
+ * there really isn't any space.
+ */
+char *HTAA_makeProtectionTemplate(const char *docname)
+{
+ char *ctemplate = NULL;
+ char *slash = NULL;
+
+ if (docname) {
+ StrAllocCopy(ctemplate, docname);
+ slash = strrchr(ctemplate, '/');
+ if (slash)
+ slash++;
+ else
+ slash = ctemplate;
+ *slash = '\0';
+ StrAllocCat(ctemplate, "*");
+ } else
+ StrAllocCopy(ctemplate, "*");
+
+ CTRACE((tfp, "make_template: made template `%s' for file `%s'\n",
+ ctemplate, docname));
+
+ return ctemplate;
+}
+
+/*
+ * Skip leading whitespace from *s forward
+ */
+#define SKIPWS(s) while (*s==' ' || *s=='\t') s++;
+
+/*
+ * Kill trailing whitespace starting from *(s-1) backwards
+ */
+#define KILLWS(s) {char *c=s-1; while (*c==' ' || *c=='\t') *(c--)='\0';}
+
+/* PUBLIC HTAA_parseArgList()
+ * PARSE AN ARGUMENT LIST GIVEN IN A HEADER FIELD
+ * ON ENTRY:
+ * str is a comma-separated list:
+ *
+ * item, item, item
+ * where
+ * item ::= value
+ * | name=value
+ * | name="value"
+ *
+ * Leading and trailing whitespace is ignored
+ * everywhere except inside quotes, so the following
+ * examples are equal:
+ *
+ * name=value,foo=bar
+ * name="value",foo="bar"
+ * name = value , foo = bar
+ * name = "value" , foo = "bar"
+ *
+ * ON EXIT:
+ * returns a list of name-value pairs (actually HTAssocList*).
+ * For items with no name, just value, the name is
+ * the number of order number of that item. E.g.
+ * "1" for the first, etc.
+ */
+HTAssocList *HTAA_parseArgList(char *str)
+{
+ HTAssocList *assoc_list = HTAssocList_new();
+ char *cur = NULL;
+ char *name = NULL;
+ int n = 0;
+
+ if (!str)
+ return assoc_list;
+
+ while (*str) {
+ SKIPWS(str); /* Skip leading whitespace */
+ cur = str;
+ n++;
+
+ while (*cur && *cur != '=' && *cur != ',')
+ cur++; /* Find end of name (or lonely value without a name) */
+ KILLWS(cur); /* Kill trailing whitespace */
+
+ if (*cur == '=') { /* Name followed by a value */
+ *(cur++) = '\0'; /* Terminate name */
+ StrAllocCopy(name, str);
+ SKIPWS(cur); /* Skip WS leading the value */
+ str = cur;
+ if (*str == '"') { /* Quoted value */
+ str++;
+ cur = str;
+ while (*cur && *cur != '"')
+ cur++;
+ if (*cur == '"')
+ *(cur++) = '\0'; /* Terminate value */
+ /* else it is lacking terminating quote */
+ SKIPWS(cur); /* Skip WS leading comma */
+ if (*cur == ',')
+ cur++; /* Skip separating colon */
+ } else { /* Unquoted value */
+ while (*cur && *cur != ',')
+ cur++;
+ KILLWS(cur); /* Kill trailing whitespace */
+ if (*cur == ',')
+ *(cur++) = '\0';
+ /* else *cur already NULL */
+ }
+ } else { /* No name, just a value */
+ if (*cur == ',')
+ *(cur++) = '\0'; /* Terminate value */
+ /* else last value on line (already terminated by NULL) */
+ HTSprintf0(&name, "%d", n); /* Item order number for name */
+ }
+ HTAssocList_add(assoc_list, name, str);
+ str = cur;
+ } /* while *str */
+
+ FREE(name);
+ return assoc_list;
+}
+
+/************** HEADER LINE READER -- DOES UNFOLDING *************************/
+
+#define BUFFER_SIZE 1024
+
+static size_t buffer_length;
+static char *buffer = 0;
+static char *start_pointer;
+static char *end_pointer;
+static int in_soc = -1;
+
+#ifdef LY_FIND_LEAKS
+static void FreeHTAAUtil(void)
+{
+ FREE(buffer);
+}
+#endif /* LY_FIND_LEAKS */
+
+/* PUBLIC HTAA_setupReader()
+ * SET UP HEADER LINE READER, i.e., give
+ * the already-read-but-not-yet-processed
+ * buffer of text to be read before more
+ * is read from the socket.
+ * ON ENTRY:
+ * start_of_headers is a pointer to a buffer containing
+ * the beginning of the header lines
+ * (rest will be read from a socket).
+ * length is the number of valid characters in
+ * 'start_of_headers' buffer.
+ * soc is the socket to use when start_of_headers
+ * buffer is used up.
+ * ON EXIT:
+ * returns nothing.
+ * Subsequent calls to HTAA_getUnfoldedLine()
+ * will use this buffer first and then
+ * proceed to read from socket.
+ */
+void HTAA_setupReader(char *start_of_headers,
+ size_t length,
+ int soc)
+{
+ if (!start_of_headers)
+ length = 0; /* initialize length (is this reached at all?) */
+ if (buffer == NULL) { /* first call? */
+ buffer_length = length;
+ if (buffer_length < BUFFER_SIZE) /* would fall below BUFFER_SIZE? */
+ buffer_length = BUFFER_SIZE;
+ buffer = (char *) malloc((size_t) (sizeof(char) * (buffer_length + 1)));
+ } else if (length > buffer_length) { /* need more space? */
+ buffer_length = length;
+ buffer = (char *) realloc((char *) buffer,
+ (size_t) (sizeof(char) * (buffer_length + 1)));
+ }
+ if (buffer == NULL)
+ outofmem(__FILE__, "HTAA_setupReader");
+
+#ifdef LY_FIND_LEAKS
+ atexit(FreeHTAAUtil);
+#endif
+ start_pointer = buffer;
+ if (start_of_headers) {
+ LYStrNCpy(buffer, start_of_headers, length);
+ end_pointer = buffer + length;
+ } else {
+ *start_pointer = '\0';
+ end_pointer = start_pointer;
+ }
+ in_soc = soc;
+}
+
+/* PUBLIC HTAA_getUnfoldedLine()
+ * READ AN UNFOLDED HEADER LINE FROM SOCKET
+ * ON ENTRY:
+ * HTAA_setupReader must absolutely be called before
+ * this function to set up internal buffer.
+ *
+ * ON EXIT:
+ * returns a newly-allocated character string representing
+ * the read line. The line is unfolded, i.e.
+ * lines that begin with whitespace are appended
+ * to current line. E.g.
+ *
+ * Field-Name: Blaa-Blaa
+ * This-Is-A-Continuation-Line
+ * Here-Is_Another
+ *
+ * is seen by the caller as:
+ *
+ * Field-Name: Blaa-Blaa This-Is-A-Continuation-Line Here-Is_Another
+ *
+ */
+char *HTAA_getUnfoldedLine(void)
+{
+ char *line = NULL;
+ char *cur;
+ int count;
+ BOOL peek_for_folding = NO;
+
+ if (in_soc < 0) {
+ CTRACE((tfp, "%s %s\n",
+ "HTAA_getUnfoldedLine: buffer not initialized",
+ "with function HTAA_setupReader()"));
+ return NULL;
+ }
+
+ for (;;) {
+
+ /* Reading from socket */
+
+ if (start_pointer >= end_pointer) { /*Read the next block and continue */
+#ifdef USE_SSL
+ if (SSL_handle)
+ count = SSL_read(SSL_handle, buffer, BUFFER_SIZE);
+ else
+ count = NETREAD(in_soc, buffer, BUFFER_SIZE);
+#else
+ count = NETREAD(in_soc, buffer, BUFFER_SIZE);
+#endif /* USE_SSL */
+ if (count <= 0) {
+ in_soc = -1;
+ return line;
+ }
+ if (count > (int) buffer_length)
+ count = (int) buffer_length;
+ start_pointer = buffer;
+ end_pointer = buffer + count;
+ *end_pointer = '\0';
+#ifdef NOT_ASCII
+ cur = start_pointer;
+ while (cur < end_pointer) {
+ *cur = TOASCII(*cur);
+ cur++;
+ }
+#endif /*NOT_ASCII */
+ }
+ cur = start_pointer;
+
+ /* Unfolding */
+
+ if (peek_for_folding) {
+ if (*cur != ' ' && *cur != '\t')
+ return line; /* Ok, no continuation line */
+ else /* So this is a continuation line, continue */
+ peek_for_folding = NO;
+ }
+
+ /* Finding end-of-line */
+
+ while (cur < end_pointer && *cur != '\n') /* Find the end-of-line */
+ cur++; /* (or end-of-buffer). */
+
+ /* Terminating line */
+
+ if (cur < end_pointer) { /* So *cur==LF, terminate line */
+ *cur = '\0'; /* Overwrite LF */
+ if (*(cur - 1) == '\r')
+ *(cur - 1) = '\0'; /* Overwrite CR */
+ peek_for_folding = YES; /* Check for a continuation line */
+ }
+
+ /* Copying the result */
+
+ if (line)
+ StrAllocCat(line, start_pointer); /* Append */
+ else
+ StrAllocCopy(line, start_pointer); /* A new line */
+
+ start_pointer = cur + 1; /* Skip the read line */
+
+ } /* forever */
+}
diff --git a/WWW/Library/Implementation/HTAAUtil.h b/WWW/Library/Implementation/HTAAUtil.h
new file mode 100644
index 0000000..33a8ee3
--- /dev/null
+++ b/WWW/Library/Implementation/HTAAUtil.h
@@ -0,0 +1,318 @@
+/*
+ * $LynxId: HTAAUtil.h,v 1.13 2010/10/27 00:09:52 tom Exp $
+ *
+ * Utilities for the Authorization parts of libwww
+ * COMMON PARTS OF AUTHORIZATION MODULE TO BOTH SERVER AND BROWSER
+ *
+ * This module is the interface to the common parts of Access Authorization (AA) package
+ * for both server and browser. Important to know about memory allocation:
+ *
+ * Routines in this module use dynamic allocation, but free automatically all the memory
+ * reserved by them.
+ *
+ * Therefore the caller never has to (and never should) free() any object returned by
+ * these functions.
+ *
+ * Therefore also all the strings returned by this package are only valid until the next
+ * call to the same function is made. This approach is selected, because of the nature of
+ * access authorization: no string returned by the package needs to be valid longer than
+ * until the next call.
+ *
+ * This also makes it easy to plug the AA package in: you don't have to ponder whether to
+ * free() something here or is it done somewhere else (because it is always done somewhere
+ * else).
+ *
+ * The strings that the package needs to store are copied so the original strings given as
+ * parameters to AA functions may be freed or modified with no side effects.
+ *
+ * Also note: The AA package does not free() anything else than what it has itself
+ * allocated.
+ *
+ */
+
+#ifndef HTAAUTIL_H
+#define HTAAUTIL_H
+
+#include <HTList.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Numeric constants
+ */
+#define MAX_USERNAME_LEN 16 /* @@ Longest allowed username */
+#define MAX_PASSWORD_LEN 3*13 /* @@ Longest allowed password */
+ /* (encrypted, so really only 3*8) */
+#define MAX_METHODNAME_LEN 12 /* @@ Longest allowed method name */
+#define MAX_FIELDNAME_LEN 16 /* @@ Longest field name in */
+ /* protection setup file */
+#define MAX_PATHNAME_LEN 80 /* @@ Longest passwd/group file */
+/* pathname to allow */
+/*
+
+ Datatype definitions
+
+ HTAASCHEME
+
+ The enumeration HTAAScheme represents the possible authentication schemes used by the
+ WWW Access Authorization.
+
+ */ typedef enum {
+ HTAA_UNKNOWN,
+ HTAA_NONE,
+ HTAA_BASIC,
+ HTAA_PUBKEY,
+ HTAA_KERBEROS_V4,
+ HTAA_KERBEROS_V5,
+ HTAA_MAX_SCHEMES /* THIS MUST ALWAYS BE LAST! Number of schemes */
+ } HTAAScheme;
+
+/*
+
+ ENUMERATION TO REPRESENT HTTP METHODS
+
+ */
+
+ typedef enum {
+ METHOD_UNKNOWN,
+ METHOD_GET,
+ METHOD_PUT
+ } HTAAMethod;
+
+/*
+
+Authentication Schemes
+
+ */
+
+/* PUBLIC HTAAScheme_enum()
+ * TRANSLATE SCHEME NAME TO A SCHEME ENUMERATION
+ * ON ENTRY:
+ * name is a string representing the scheme name.
+ *
+ * ON EXIT:
+ * returns the enumerated constant for that scheme.
+ */
+ extern HTAAScheme HTAAScheme_enum(const char *name);
+
+/* PUBLIC HTAAScheme_name()
+ * GET THE NAME OF A GIVEN SCHEME
+ * ON ENTRY:
+ * scheme is one of the scheme enum values:
+ * HTAA_NONE, HTAA_BASIC, HTAA_PUBKEY, ...
+ *
+ * ON EXIT:
+ * returns the name of the scheme, i.e.
+ * "none", "basic", "pubkey", ...
+ */
+ extern const char *HTAAScheme_name(HTAAScheme scheme);
+
+/*
+
+Methods
+
+ */
+
+/* PUBLIC HTAAMethod_enum()
+ * TRANSLATE METHOD NAME INTO AN ENUMERATED VALUE
+ * ON ENTRY:
+ * name is the method name to translate.
+ *
+ * ON EXIT:
+ * returns HTAAMethod enumerated value corresponding
+ * to the given name.
+ */
+ extern HTAAMethod HTAAMethod_enum(const char *name);
+
+/* PUBLIC HTAAMethod_name()
+ * GET THE NAME OF A GIVEN METHOD
+ * ON ENTRY:
+ * method is one of the method enum values:
+ * METHOD_GET, METHOD_PUT, ...
+ *
+ * ON EXIT:
+ * returns the name of the scheme, i.e.
+ * "GET", "PUT", ...
+ */
+ extern const char *HTAAMethod_name(HTAAMethod method);
+
+/* PUBLIC HTAAMethod_inList()
+ * IS A METHOD IN A LIST OF METHOD NAMES
+ * ON ENTRY:
+ * method is the method to look for.
+ * list is a list of method names.
+ *
+ * ON EXIT:
+ * returns YES, if method was found.
+ * NO, if not found.
+ */
+ extern BOOL HTAAMethod_inList(HTAAMethod method, HTList *list);
+
+/*
+
+Match Template Against Filename
+
+ */
+
+/* PUBLIC HTAA_templateMatch()
+ * STRING COMPARISON FUNCTION FOR FILE NAMES
+ * WITH ONE WILDCARD * IN THE TEMPLATE
+ * NOTE:
+ * This is essentially the same code as in HTRules.c, but it
+ * cannot be used because it is embedded in between other code.
+ * (In fact, HTRules.c should use this routine, but then this
+ * routine would have to be more sophisticated... why is life
+ * sometimes so hard...)
+ *
+ * ON ENTRY:
+ * ctemplate is a template string to match the file name
+ * against, may contain a single wildcard
+ * character * which matches zero or more
+ * arbitrary characters.
+ * filename is the filename (or pathname) to be matched
+ * against the template.
+ *
+ * ON EXIT:
+ * returns YES, if filename matches the template.
+ * NO, otherwise.
+ */
+ extern BOOL HTAA_templateMatch(const char *ctemplate,
+ const char *filename);
+
+/* PUBLIC HTAA_templateCaseMatch()
+ * STRING COMPARISON FUNCTION FOR FILE NAMES
+ * WITH ONE WILDCARD * IN THE TEMPLATE (Case Insensitive)
+ * NOTE:
+ * This is essentially the same code as in HTAA_templateMatch, but
+ * it compares case insensitive (for VMS). Reason for this routine
+ * is that HTAA_templateMatch gets called from several places, also
+ * there where a case sensitive match is needed, so one cannot just
+ * change the HTAA_templateMatch routine for VMS.
+ *
+ * ON ENTRY:
+ * ctemplate is a template string to match the file name
+ * against, may contain a single wildcard
+ * character * which matches zero or more
+ * arbitrary characters.
+ * filename is the filename (or pathname) to be matched
+ * against the template.
+ *
+ * ON EXIT:
+ * returns YES, if filename matches the template.
+ * NO, otherwise.
+ */
+ extern BOOL HTAA_templateCaseMatch(const char *ctemplate,
+ const char *filename);
+
+/* PUBLIC HTAA_makeProtectionTemplate()
+ * CREATE A PROTECTION TEMPLATE FOR THE FILES
+ * IN THE SAME DIRECTORY AS THE GIVEN FILE
+ * (Used by server if there is no fancier way for
+ * it to tell the client, and by browser if server
+ * didn't send WWW-ProtectionTemplate: field)
+ * ON ENTRY:
+ * docname is the document pathname (from URL).
+ *
+ * ON EXIT:
+ * returns a template matching docname, and other files
+ * files in that directory.
+ *
+ * E.g. /foo/bar/x.html => /foo/bar/ *
+ * ^
+ * Space only to prevent it from
+ * being a comment marker here,
+ * there really isn't any space.
+ */
+ extern char *HTAA_makeProtectionTemplate(const char *docname);
+
+/*
+
+MIME Argument List Parser
+
+ */
+
+/* PUBLIC HTAA_parseArgList()
+ * PARSE AN ARGUMENT LIST GIVEN IN A HEADER FIELD
+ * ON ENTRY:
+ * str is a comma-separated list:
+ *
+ * item, item, item
+ * where
+ * item ::= value
+ * | name=value
+ * | name="value"
+ *
+ * Leading and trailing whitespace is ignored
+ * everywhere except inside quotes, so the following
+ * examples are equal:
+ *
+ * name=value,foo=bar
+ * name="value",foo="bar"
+ * name = value , foo = bar
+ * name = "value" , foo = "bar"
+ *
+ * ON EXIT:
+ * returns a list of name-value pairs (actually HTAssocList*).
+ * For items with no name, just value, the name is
+ * the number of order number of that item. E.g.
+ * "1" for the first, etc.
+ */
+ extern HTList *HTAA_parseArgList(char *str);
+
+/*
+
+Header Line Reader
+
+ */
+
+/* PUBLIC HTAA_setupReader()
+ * SET UP HEADER LINE READER, i.e., give
+ * the already-read-but-not-yet-processed
+ * buffer of text to be read before more
+ * is read from the socket.
+ * ON ENTRY:
+ * start_of_headers is a pointer to a buffer containing
+ * the beginning of the header lines
+ * (rest will be read from a socket).
+ * length is the number of valid characters in
+ * 'start_of_headers' buffer.
+ * soc is the socket to use when start_of_headers
+ * buffer is used up.
+ * ON EXIT:
+ * returns nothing.
+ * Subsequent calls to HTAA_getUnfoldedLine()
+ * will use this buffer first and then
+ * proceed to read from socket.
+ */
+ extern void HTAA_setupReader(char *start_of_headers,
+ size_t length,
+ int soc);
+
+/* PUBLIC HTAA_getUnfoldedLine()
+ * READ AN UNFOLDED HEADER LINE FROM SOCKET
+ * ON ENTRY:
+ * HTAA_setupReader must absolutely be called before
+ * this function to set up internal buffer.
+ *
+ * ON EXIT:
+ * returns a newly-allocated character string representing
+ * the read line. The line is unfolded, i.e.
+ * lines that begin with whitespace are appended
+ * to current line. E.g.
+ *
+ * Field-Name: Blaa-Blaa
+ * This-Is-A-Continuation-Line
+ * Here-Is_Another
+ *
+ * is seen by the caller as:
+ *
+ * Field-Name: Blaa-Blaa This-Is-A-Continuation-Line Here-Is_Another
+ *
+ */
+ extern char *HTAA_getUnfoldedLine(void);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* NOT HTAAUTIL_H */
diff --git a/WWW/Library/Implementation/HTAccess.c b/WWW/Library/Implementation/HTAccess.c
new file mode 100644
index 0000000..a79a8a2
--- /dev/null
+++ b/WWW/Library/Implementation/HTAccess.c
@@ -0,0 +1,1460 @@
+/*
+ * $LynxId: HTAccess.c,v 1.85 2019/08/24 00:27:06 tom Exp $
+ *
+ * Access Manager HTAccess.c
+ * ==============
+ *
+ * Authors
+ * TBL Tim Berners-Lee timbl@info.cern.ch
+ * JFG Jean-Francois Groff jfg@dxcern.cern.ch
+ * DD Denis DeLaRoca (310) 825-4580 <CSP1DWD@mvs.oac.ucla.edu>
+ * FM Foteos Macrides macrides@sci.wfeb.edu
+ * PDM Danny Mayer mayer@ljo.dec.com
+ *
+ * History
+ * 8 Jun 92 Telnet hopping prohibited as telnet is not secure TBL
+ * 26 Jun 92 When over DECnet, suppressed FTP, Gopher and News. JFG
+ * 6 Oct 92 Moved HTClientHost and logfile into here. TBL
+ * 17 Dec 92 Tn3270 added, bug fix. DD
+ * 4 Feb 93 Access registration, Search escapes bad chars TBL
+ * PARAMETERS TO HTSEARCH AND HTLOADRELATIVE CHANGED
+ * 28 May 93 WAIS gateway explicit if no WAIS library linked in.
+ * 31 May 94 Added DIRECT_WAIS support for VMS. FM
+ * 27 Jan 95 Fixed proxy support to use NNTPSERVER for checking
+ * whether or not to use the proxy server. PDM
+ * 27 Jan 95 Ensured that proxy service will be overridden for files
+ * on the local host (because HTLoadFile() doesn't try ftp
+ * for those) and will substitute ftp for remote files. FM
+ * 28 Jan 95 Tweaked PDM's proxy override mods to handle port info
+ * for news and wais URL's. FM
+ *
+ * Bugs
+ * This module assumes that that the graphic object is hypertext, as it
+ * needs to select it when it has been loaded. A superclass needs to be
+ * defined which accepts select and select_anchor.
+ */
+
+#ifdef VMS
+#define DIRECT_WAIS
+#endif /* VMS */
+
+#include <HTUtils.h>
+#include <HTTP.h>
+#include <HTAlert.h>
+/*
+ * Implements:
+ */
+#include <HTAccess.h>
+
+/*
+ * Uses:
+ */
+#include <HTParse.h>
+#include <HTML.h> /* SCW */
+
+#ifndef NO_RULES
+#include <HTRules.h>
+#endif
+
+#include <HTList.h>
+#include <HText.h> /* See bugs above */
+#include <HTCJK.h>
+#include <UCMap.h>
+#include <GridText.h>
+
+#include <LYGlobalDefs.h>
+#include <LYexit.h>
+#include <LYStrings.h>
+#include <LYUtils.h>
+#include <LYLeaks.h>
+
+/*
+ * These flags may be set to modify the operation of this module
+ */
+char *HTClientHost = NULL; /* Name of remote login host if any */
+FILE *HTlogfile = NULL; /* File to which to output one-liners */
+BOOL HTSecure = NO; /* Disable access for telnet users? */
+BOOL HTPermitRedir = NO; /* Always allow redirection in getfile()? */
+
+BOOL using_proxy = NO; /* are we using a proxy gateway? */
+
+/*
+ * To generate other things, play with these:
+ */
+HTFormat HTOutputFormat = NULL;
+HTStream *HTOutputStream = NULL; /* For non-interactive, set this */
+
+static HTList *protocols = NULL; /* List of registered protocol descriptors */
+
+char *use_this_url_instead = NULL;
+
+static int pushed_assume_LYhndl = -1; /* see LYUC* functions below - kw */
+static char *pushed_assume_MIMEname = NULL;
+
+#ifdef LY_FIND_LEAKS
+static void free_protocols(void)
+{
+ HTList_delete(protocols);
+ protocols = NULL;
+ FREE(pushed_assume_MIMEname); /* shouldn't happen, just in case - kw */
+}
+#endif /* LY_FIND_LEAKS */
+
+/* Register a Protocol. HTRegisterProtocol()
+ * --------------------
+ */
+BOOL HTRegisterProtocol(HTProtocol * protocol)
+{
+ if (!protocols) {
+ protocols = HTList_new();
+#ifdef LY_FIND_LEAKS
+ atexit(free_protocols);
+#endif
+ }
+ HTList_addObject(protocols, protocol);
+ return YES;
+}
+
+/* Register all known protocols. HTAccessInit()
+ * -----------------------------
+ *
+ * Add to or subtract from this list if you add or remove protocol
+ * modules. This routine is called the first time the protocol list
+ * is needed, unless any protocols are already registered, in which
+ * case it is not called. Therefore the application can override
+ * this list.
+ *
+ * Compiling with NO_INIT prevents all known protocols from being
+ * forced in at link time.
+ */
+#ifndef NO_INIT
+#ifdef GLOBALREF_IS_MACRO
+extern GLOBALREF (HTProtocol, HTTP);
+extern GLOBALREF (HTProtocol, HTTPS);
+extern GLOBALREF (HTProtocol, HTFile);
+extern GLOBALREF (HTProtocol, HTTelnet);
+extern GLOBALREF (HTProtocol, HTTn3270);
+extern GLOBALREF (HTProtocol, HTRlogin);
+
+#ifndef DECNET
+#ifndef DISABLE_FTP
+extern GLOBALREF (HTProtocol, HTFTP);
+#endif /* DISABLE_FTP */
+#ifndef DISABLE_NEWS
+extern GLOBALREF (HTProtocol, HTNews);
+extern GLOBALREF (HTProtocol, HTNNTP);
+extern GLOBALREF (HTProtocol, HTNewsPost);
+extern GLOBALREF (HTProtocol, HTNewsReply);
+extern GLOBALREF (HTProtocol, HTSNews);
+extern GLOBALREF (HTProtocol, HTSNewsPost);
+extern GLOBALREF (HTProtocol, HTSNewsReply);
+#endif /* not DISABLE_NEWS */
+#ifndef DISABLE_GOPHER
+extern GLOBALREF (HTProtocol, HTGopher);
+extern GLOBALREF (HTProtocol, HTCSO);
+#endif /* not DISABLE_GOPHER */
+#ifndef DISABLE_FINGER
+extern GLOBALREF (HTProtocol, HTFinger);
+#endif /* not DISABLE_FINGER */
+#ifdef DIRECT_WAIS
+extern GLOBALREF (HTProtocol, HTWAIS);
+#endif /* DIRECT_WAIS */
+#endif /* !DECNET */
+#else
+GLOBALREF HTProtocol HTTP, HTTPS, HTFile, HTTelnet, HTTn3270, HTRlogin;
+
+#ifndef DECNET
+#ifndef DISABLE_FTP
+GLOBALREF HTProtocol HTFTP;
+#endif /* DISABLE_FTP */
+#ifndef DISABLE_NEWS
+GLOBALREF HTProtocol HTNews, HTNNTP, HTNewsPost, HTNewsReply;
+GLOBALREF HTProtocol HTSNews, HTSNewsPost, HTSNewsReply;
+#endif /* not DISABLE_NEWS */
+#ifndef DISABLE_GOPHER
+GLOBALREF HTProtocol HTGopher, HTCSO;
+#endif /* not DISABLE_GOPHER */
+#ifndef DISABLE_FINGER
+GLOBALREF HTProtocol HTFinger;
+#endif /* not DISABLE_FINGER */
+#ifdef DIRECT_WAIS
+GLOBALREF HTProtocol HTWAIS;
+#endif /* DIRECT_WAIS */
+#endif /* !DECNET */
+#endif /* GLOBALREF_IS_MACRO */
+
+static void HTAccessInit(void) /* Call me once */
+{
+ HTRegisterProtocol(&HTTP);
+ HTRegisterProtocol(&HTTPS);
+ HTRegisterProtocol(&HTFile);
+ HTRegisterProtocol(&HTTelnet);
+ HTRegisterProtocol(&HTTn3270);
+ HTRegisterProtocol(&HTRlogin);
+#ifndef DECNET
+#ifndef DISABLE_FTP
+ HTRegisterProtocol(&HTFTP);
+#endif /* DISABLE_FTP */
+#ifndef DISABLE_NEWS
+ HTRegisterProtocol(&HTNews);
+ HTRegisterProtocol(&HTNNTP);
+ HTRegisterProtocol(&HTNewsPost);
+ HTRegisterProtocol(&HTNewsReply);
+ HTRegisterProtocol(&HTSNews);
+ HTRegisterProtocol(&HTSNewsPost);
+ HTRegisterProtocol(&HTSNewsReply);
+#endif /* not DISABLE_NEWS */
+#ifndef DISABLE_GOPHER
+ HTRegisterProtocol(&HTGopher);
+ HTRegisterProtocol(&HTCSO);
+#endif /* not DISABLE_GOPHER */
+#ifndef DISABLE_FINGER
+ HTRegisterProtocol(&HTFinger);
+#endif /* not DISABLE_FINGER */
+#ifdef DIRECT_WAIS
+ HTRegisterProtocol(&HTWAIS);
+#endif /* DIRECT_WAIS */
+#endif /* !DECNET */
+ LYRegisterLynxProtocols();
+}
+#endif /* !NO_INIT */
+
+/* Check for proxy override. override_proxy()
+ * -------------------------
+ *
+ * Check the no_proxy environment variable to get the list
+ * of hosts for which proxy server is not consulted.
+ *
+ * no_proxy is a comma- or space-separated list of machine
+ * or domain names, with optional :port part. If no :port
+ * part is present, it applies to all ports on that domain.
+ *
+ * Example:
+ * no_proxy="cern.ch,some.domain:8001"
+ *
+ * Use "*" to override all proxy service:
+ * no_proxy="*"
+ */
+BOOL override_proxy(const char *addr)
+{
+ const char *no_proxy = getenv("no_proxy");
+ char *p = NULL;
+ char *at = NULL;
+ char *host = NULL;
+ char *Host = NULL;
+ char *acc_method = NULL;
+ int port = 0;
+ int h_len = 0;
+
+ /*
+ * Check for global override.
+ */
+ if (no_proxy) {
+ if (!strcmp(no_proxy, "*"))
+ return YES;
+ }
+
+ /*
+ * Never proxy file:// URLs if they are on the local host. HTLoadFile()
+ * will not attempt ftp for those if direct access fails. We'll check that
+ * first, in case no_proxy hasn't been defined. - FM
+ */
+ if (!addr)
+ return NO;
+ if (!(host = HTParse(addr, "", PARSE_HOST)))
+ return NO;
+ if (!*host) {
+ FREE(host);
+ return NO;
+ }
+ Host = (((at = StrChr(host, '@')) != NULL) ? (at + 1) : host);
+
+ if ((acc_method = HTParse(addr, "", PARSE_ACCESS))) {
+ if (!strcmp("file", acc_method) &&
+ (LYSameHostname(Host, "localhost") ||
+ LYSameHostname(Host, HTHostName()))) {
+ FREE(host);
+ FREE(acc_method);
+ return YES;
+ }
+ FREE(acc_method);
+ }
+
+ if (!no_proxy) {
+ FREE(host);
+ return NO;
+ }
+
+ if (NULL != (p = HTParsePort(Host, &port))) { /* Port specified */
+ *p = 0; /* Chop off port */
+ } else { /* Use default port */
+ acc_method = HTParse(addr, "", PARSE_ACCESS);
+ if (acc_method != NULL) {
+ /* *INDENT-OFF* */
+ if (!strcmp(acc_method, "http")) port = 80;
+ else if (!strcmp(acc_method, "https")) port = 443;
+ else if (!strcmp(acc_method, "ftp")) port = 21;
+#ifndef DISABLE_GOPHER
+ else if (!strcmp(acc_method, "gopher")) port = 70;
+#endif
+ else if (!strcmp(acc_method, "cso")) port = 105;
+#ifndef DISABLE_NEWS
+ else if (!strcmp(acc_method, "news")) port = 119;
+ else if (!strcmp(acc_method, "nntp")) port = 119;
+ else if (!strcmp(acc_method, "newspost")) port = 119;
+ else if (!strcmp(acc_method, "newsreply")) port = 119;
+ else if (!strcmp(acc_method, "snews")) port = 563;
+ else if (!strcmp(acc_method, "snewspost")) port = 563;
+ else if (!strcmp(acc_method, "snewsreply")) port = 563;
+#endif
+ else if (!strcmp(acc_method, "wais")) port = 210;
+#ifndef DISABLE_FINGER
+ else if (!strcmp(acc_method, "finger")) port = 79;
+#endif
+ else if (!strcmp(acc_method, "telnet")) port = 23;
+ else if (!strcmp(acc_method, "tn3270")) port = 23;
+ else if (!strcmp(acc_method, "rlogin")) port = 513;
+ /* *INDENT-ON* */
+
+ FREE(acc_method);
+ }
+ }
+ if (!port)
+ port = 80; /* Default */
+ h_len = (int) strlen(Host);
+
+ while (*no_proxy) {
+ const char *end;
+ const char *colon = NULL;
+ int templ_port = 0;
+ int t_len;
+ int brackets = 0;
+
+ while (*no_proxy && (WHITE(*no_proxy) || *no_proxy == ','))
+ no_proxy++; /* Skip whitespace and separators */
+
+ end = no_proxy;
+ while (*end && !WHITE(*end) && *end != ',') { /* Find separator */
+ if (!brackets && (*end == ':'))
+ colon = end; /* Port number given */
+ else if (*end == '[')
+ ++brackets;
+ else if (*end == ']')
+ --brackets;
+ end++;
+ }
+
+ if (colon) {
+ /* unlike HTParsePort(), this may be followed by non-digits */
+ templ_port = atoi(colon + 1);
+ t_len = (int) (colon - no_proxy);
+ } else {
+ t_len = (int) (end - no_proxy);
+ }
+
+ if ((!templ_port || templ_port == port) &&
+ (t_len > 0 && t_len <= h_len &&
+ !strncasecomp(Host + h_len - t_len, no_proxy, t_len))) {
+ FREE(host);
+ return YES;
+ }
+#ifdef CJK_EX /* ASATAKU PROXY HACK */
+ if ((!templ_port || templ_port == port) &&
+ (t_len > 0 && t_len <= h_len &&
+ isdigit(UCH(*no_proxy)) &&
+ !StrNCmp(host, no_proxy, t_len))) {
+ FREE(host);
+ return YES;
+ }
+#endif /* ASATAKU PROXY HACK */
+
+ if (*end)
+ no_proxy = (end + 1);
+ else
+ break;
+ }
+
+ FREE(host);
+ return NO;
+}
+
+/* Find physical name and access protocol get_physical()
+ * --------------------------------------
+ *
+ * On entry,
+ * addr must point to the fully qualified hypertext reference.
+ * anchor a parent anchor with whose address is addr
+ *
+ * On exit,
+ * returns HT_NO_ACCESS Error has occurred.
+ * HT_OK Success
+ */
+static int get_physical(const char *addr,
+ HTParentAnchor *anchor)
+{
+ int result;
+ char *acc_method = NULL; /* Name of access method */
+ char *physical = NULL;
+ char *Server_addr = NULL;
+ BOOL override_flag = NO;
+
+ CTRACE((tfp, "get_physical %s\n", addr));
+
+ /*
+ * Make sure the using_proxy variable is FALSE.
+ */
+ using_proxy = NO;
+
+#ifndef NO_RULES
+ if ((physical = HTTranslate(addr)) == 0) {
+ if (redirecting_url) {
+ return HT_REDIRECTING;
+ }
+ return HT_FORBIDDEN;
+ }
+ if (anchor->isISMAPScript == TRUE) {
+ StrAllocCat(physical, "?0,0");
+ CTRACE((tfp, "HTAccess: Appending '?0,0' coordinate pair.\n"));
+ }
+ if (!StrNCmp(physical, "Proxied=", 8)) {
+ HTAnchor_setPhysical(anchor, physical + 8);
+ using_proxy = YES;
+ } else if (!StrNCmp(physical, "NoProxy=", 8)) {
+ HTAnchor_setPhysical(anchor, physical + 8);
+ override_flag = YES;
+ } else {
+ HTAnchor_setPhysical(anchor, physical);
+ }
+ FREE(physical); /* free our copy */
+#else
+ if (anchor->isISMAPScript == TRUE) {
+ StrAllocCopy(physical, addr);
+ StrAllocCat(physical, "?0,0");
+ CTRACE((tfp, "HTAccess: Appending '?0,0' coordinate pair.\n"));
+ HTAnchor_setPhysical(anchor, physical);
+ FREE(physical); /* free our copy */
+ } else {
+ HTAnchor_setPhysical(anchor, addr);
+ }
+#endif /* NO_RULES */
+
+ acc_method = HTParse(HTAnchor_physical(anchor), STR_FILE_URL, PARSE_ACCESS);
+
+ /*
+ * Check whether gateway access has been set up for this.
+ *
+ * This function can be replaced by the rule system above.
+ *
+ * If the rule system has already determined that we should use a proxy, or
+ * that we shouldn't, ignore proxy-related settings, don't use no_proxy
+ * either.
+ */
+#define USE_GATEWAYS
+#ifdef USE_GATEWAYS
+
+ if (!override_flag && !using_proxy) { /* else ignore no_proxy env var */
+ char *host = NULL;
+ int port;
+
+ if (!strcasecomp(acc_method, "news")) {
+ /*
+ * News is different, so we need to check the name of the server,
+ * as well as the default port for selective exclusions.
+ */
+ if ((host = HTParse(addr, "", PARSE_HOST))) {
+ if (HTParsePort(host, &port) == NULL) {
+ StrAllocCopy(Server_addr, "news://");
+ StrAllocCat(Server_addr, host);
+ StrAllocCat(Server_addr, ":119/");
+ }
+ FREE(host);
+ } else if (LYGetEnv("NNTPSERVER") != NULL) {
+ StrAllocCopy(Server_addr, "news://");
+ StrAllocCat(Server_addr, LYGetEnv("NNTPSERVER"));
+ StrAllocCat(Server_addr, ":119/");
+ }
+ } else if (!strcasecomp(acc_method, "wais")) {
+ /*
+ * Wais also needs checking of the default port for selective
+ * exclusions.
+ */
+ if ((host = HTParse(addr, "", PARSE_HOST))) {
+ if (!(HTParsePort(host, &port))) {
+ StrAllocCopy(Server_addr, "wais://");
+ StrAllocCat(Server_addr, host);
+ StrAllocCat(Server_addr, ":210/");
+ }
+ FREE(host);
+ } else
+ StrAllocCopy(Server_addr, addr);
+ } else {
+ StrAllocCopy(Server_addr, addr);
+ }
+ override_flag = override_proxy(Server_addr);
+ }
+
+ if (!override_flag && !using_proxy) {
+ char *gateway_parameter = NULL, *gateway, *proxy;
+
+ /*
+ * Search for gateways.
+ */
+ HTSprintf0(&gateway_parameter, "WWW_%s_GATEWAY", acc_method);
+ gateway = LYGetEnv(gateway_parameter); /* coerce for decstation */
+
+ /*
+ * Search for proxy servers.
+ */
+ if (!strcmp(acc_method, "file"))
+ /*
+ * If we got to here, a file URL is for ftp on a remote host. - FM
+ */
+ strcpy(gateway_parameter, "ftp_proxy");
+ else
+ sprintf(gateway_parameter, "%s_proxy", acc_method);
+ proxy = LYGetEnv(gateway_parameter);
+ FREE(gateway_parameter);
+
+ if (gateway)
+ CTRACE((tfp, "Gateway found: %s\n", gateway));
+ if (proxy)
+ CTRACE((tfp, "proxy server found: %s\n", proxy));
+
+ /*
+ * Proxy servers have precedence over gateway servers.
+ */
+ if (proxy) {
+ char *gatewayed = NULL;
+
+ StrAllocCopy(gatewayed, proxy);
+ if (!StrNCmp(gatewayed, "http", 4)) {
+ char *cp = strrchr(gatewayed, '/');
+
+ /* Append a slash to the proxy specification if it doesn't
+ * end in one but otherwise looks normal (starts with "http",
+ * has no '/' other than ones before the hostname). - kw */
+ if (cp && (cp - gatewayed) <= 7)
+ LYAddHtmlSep(&gatewayed);
+ }
+ /*
+ * Ensure that the proxy server uses ftp for file URLs. - FM
+ */
+ if (!StrNCmp(addr, "file", 4)) {
+ StrAllocCat(gatewayed, "ftp");
+ StrAllocCat(gatewayed, (addr + 4));
+ } else
+ StrAllocCat(gatewayed, addr);
+ using_proxy = YES;
+ if (anchor->isISMAPScript == TRUE)
+ StrAllocCat(gatewayed, "?0,0");
+ HTAnchor_setPhysical(anchor, gatewayed);
+ FREE(gatewayed);
+ FREE(acc_method);
+
+ acc_method = HTParse(HTAnchor_physical(anchor),
+ STR_HTTP_URL, PARSE_ACCESS);
+
+ } else if (gateway) {
+ char *path = HTParse(addr, "",
+ PARSE_HOST + PARSE_PATH + PARSE_PUNCTUATION);
+
+ /* Chop leading / off to make host into part of path */
+ char *gatewayed = HTParse(path + 1, gateway, PARSE_ALL);
+
+ FREE(path);
+ HTAnchor_setPhysical(anchor, gatewayed);
+ FREE(gatewayed);
+ FREE(acc_method);
+
+ acc_method = HTParse(HTAnchor_physical(anchor),
+ STR_HTTP_URL, PARSE_ACCESS);
+ }
+ }
+ FREE(Server_addr);
+#endif /* use gateways */
+
+ /*
+ * Search registered protocols to find suitable one.
+ */
+ result = HT_NO_ACCESS;
+ {
+ int i, n;
+
+#ifndef NO_INIT
+ if (!protocols)
+ HTAccessInit();
+#endif
+ n = HTList_count(protocols);
+ for (i = 0; i < n; i++) {
+ HTProtocol *p = (HTProtocol *) HTList_objectAt(protocols, i);
+
+ if (!strcmp(p->name, acc_method)) {
+ HTAnchor_setProtocol(anchor, p);
+ FREE(acc_method);
+ result = HT_OK;
+ break;
+ }
+ }
+ }
+
+ FREE(acc_method);
+ return result;
+}
+
+/*
+ * Temporarily set the int UCLYhndl_for_unspec and string UCLYhndl_for_unspec
+ * used for charset "assuming" to the values implied by a HTParentAnchor's
+ * UCStages, after saving the current values for later restoration. - kw @@@
+ * These functions may not really belong here, but where else? I want the
+ * "pop" to occur as soon as possible after loading has finished. - kw @@@
+ */
+void LYUCPushAssumed(HTParentAnchor *anchor)
+{
+ int anchor_LYhndl = -1;
+ LYUCcharset *anchor_UCI = NULL;
+
+ if (anchor) {
+ anchor_LYhndl = HTAnchor_getUCLYhndl(anchor, UCT_STAGE_PARSER);
+ if (anchor_LYhndl >= 0)
+ anchor_UCI = HTAnchor_getUCInfoStage(anchor,
+ UCT_STAGE_PARSER);
+ if (anchor_UCI && anchor_UCI->MIMEname) {
+ pushed_assume_MIMEname = UCAssume_MIMEcharset;
+ UCAssume_MIMEcharset = NULL;
+ if (HTCJK == JAPANESE)
+ StrAllocCopy(UCAssume_MIMEcharset, pushed_assume_MIMEname);
+ else
+ StrAllocCopy(UCAssume_MIMEcharset, anchor_UCI->MIMEname);
+ pushed_assume_LYhndl = anchor_LYhndl;
+ /* some diagnostics */
+ if (UCLYhndl_for_unspec != anchor_LYhndl)
+ CTRACE((tfp,
+ "LYUCPushAssumed: UCLYhndl_for_unspec changed %d -> %d\n",
+ UCLYhndl_for_unspec,
+ anchor_LYhndl));
+ UCLYhndl_for_unspec = anchor_LYhndl;
+ return;
+ }
+ }
+ pushed_assume_LYhndl = -1;
+ FREE(pushed_assume_MIMEname);
+}
+
+/*
+ * Restore the int UCLYhndl_for_unspec and string UCLYhndl_for_unspec used for
+ * charset "assuming" from the values saved by LYUCPushAssumed, if any. - kw
+ */
+int LYUCPopAssumed(void)
+{
+ if (pushed_assume_LYhndl >= 0) {
+ /* some diagnostics */
+ if (UCLYhndl_for_unspec != pushed_assume_LYhndl)
+ CTRACE((tfp,
+ "LYUCPopAssumed: UCLYhndl_for_unspec changed %d -> %d\n",
+ UCLYhndl_for_unspec,
+ pushed_assume_LYhndl));
+ UCLYhndl_for_unspec = pushed_assume_LYhndl;
+ pushed_assume_LYhndl = -1;
+ FREE(UCAssume_MIMEcharset);
+ UCAssume_MIMEcharset = pushed_assume_MIMEname;
+ pushed_assume_MIMEname = NULL;
+ return UCLYhndl_for_unspec;
+ }
+ return -1;
+}
+
+/* Load a document HTLoad()
+ * ---------------
+ *
+ * This is an internal routine, which has an address AND a matching
+ * anchor. (The public routines are called with one OR the other.)
+ *
+ * On entry,
+ * addr must point to the fully qualified hypertext reference.
+ * anchor a parent anchor with whose address is addr
+ *
+ * On exit,
+ * returns <0 Error has occurred.
+ * HT_LOADED Success
+ * HT_NO_DATA Success, but no document loaded.
+ * (telnet session started etc)
+ */
+static int HTLoad(const char *addr,
+ HTParentAnchor *anchor,
+ HTFormat format_out,
+ HTStream *sink)
+{
+ HTProtocol *p;
+ int status = get_physical(addr, anchor);
+
+ if (reloading) {
+ FREE(anchor->charset);
+ FREE(anchor->UCStages);
+ }
+
+ if (status == HT_FORBIDDEN) {
+ /* prevent crash if telnet or similar was forbidden by rule. - kw */
+ LYFixCursesOn("show alert:");
+ status = HTLoadError(sink, 500, gettext("Access forbidden by rule"));
+ } else if (status == HT_REDIRECTING) {
+ ; /* fake redirection by rule, to redirecting_url */
+ } else if (status >= 0) {
+ /* prevent crash if telnet or similar mapped or proxied by rule. - kw */
+ LYFixCursesOnForAccess(addr, HTAnchor_physical(anchor));
+ p = (HTProtocol *) HTAnchor_protocol(anchor);
+ anchor->parent->underway = TRUE; /* Hack to deal with caching */
+ status = p->load(HTAnchor_physical(anchor),
+ anchor, format_out, sink);
+ anchor->parent->underway = FALSE;
+ LYUCPopAssumed();
+ }
+ return status;
+}
+
+/* Get a save stream for a document HTSaveStream()
+ * --------------------------------
+ */
+HTStream *HTSaveStream(HTParentAnchor *anchor)
+{
+ HTProtocol *p = (HTProtocol *) HTAnchor_protocol(anchor);
+
+ if (!p)
+ return NULL;
+
+ return p->saveStream(anchor);
+}
+
+int redirection_limit = 10;
+int redirection_attempts = 0; /* counter in HTLoadDocument */
+
+static BOOL too_many_redirections(void)
+{
+ if (redirection_attempts > redirection_limit) {
+ char *msg = NULL;
+
+ HTSprintf0(&msg, TOO_MANY_REDIRECTIONS, redirection_limit);
+ free(msg);
+ redirection_attempts = 0;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/* Load a document - with logging etc HTLoadDocument()
+ * ----------------------------------
+ *
+ * - Checks or documents already loaded
+ * - Logs the access
+ * - Allows stdin filter option
+ * - Trace output and error messages
+ *
+ * On Entry,
+ * anchor is the node_anchor for the document
+ * full_address The address of the document to be accessed.
+ * filter if YES, treat stdin as HTML
+ *
+ * On Exit,
+ * returns YES Success in opening document
+ * NO Failure
+ */
+static BOOL HTLoadDocument(const char *full_address, /* may include #fragment */
+ HTParentAnchor *anchor,
+ HTFormat format_out,
+ HTStream *sink)
+{
+ int status;
+ HText *text;
+ const char *address_to_load = full_address;
+ char *cp;
+ BOOL ForcingNoCache = LYforce_no_cache;
+
+ CTRACE((tfp, "HTAccess: loading document %s\n", NonNull(address_to_load)));
+ if (isEmpty(address_to_load))
+ return NO;
+
+ /*
+ * Free use_this_url_instead and reset permanent_redirection if not done
+ * elsewhere. - FM
+ */
+ FREE(use_this_url_instead);
+ permanent_redirection = FALSE;
+
+ if (too_many_redirections()) {
+ return NO;
+ }
+
+ /*
+ * If this is marked as an internal link but we don't have the document
+ * loaded any more, and we haven't explicitly flagged that we want to
+ * reload with LYforce_no_cache, then something has disappeared from the
+ * cache when we expected it to be still there. The user probably doesn't
+ * expect a new network access. So if we have POST data and safe is not
+ * set in the anchor, ask for confirmation, and fail if not granted. The
+ * exception are LYNXIMGMAP documents, for which we defer to LYLoadIMGmap
+ * for prompting if necessary. - kw
+ */
+ text = (HText *) HTAnchor_document(anchor);
+ if (LYinternal_flag && !text && !LYforce_no_cache &&
+ anchor->post_data && !anchor->safe &&
+ !isLYNXIMGMAP(full_address) &&
+ HTConfirm(gettext("Document with POST content not found in cache. Resubmit?"))
+ != TRUE) {
+ return NO;
+ }
+
+ /*
+ * If we don't have POST content, check whether this is a previous
+ * redirecting URL, and keep re-checking until we get to the final
+ * destination or redirection limit. If we do have POST content, we didn't
+ * allow permanent redirection, and an interactive user will be deciding
+ * whether to keep redirecting. - FM
+ */
+ if (!anchor->post_data) {
+ while ((cp = HTAnchor_physical(anchor)) != NULL &&
+ !StrNCmp(cp, "Location=", 9)) {
+ DocAddress NewDoc;
+
+ CTRACE((tfp, "HTAccess: '%s' is a redirection URL.\n",
+ anchor->address));
+ CTRACE((tfp, "HTAccess: Redirecting to '%s'\n", cp + 9));
+
+ /*
+ * Don't exceed the redirection_attempts limit. - FM
+ */
+ ++redirection_attempts;
+ if (too_many_redirections()) {
+ FREE(use_this_url_instead);
+ return NO;
+ }
+
+ /*
+ * Set up the redirection. - FM
+ */
+ StrAllocCopy(use_this_url_instead, cp + 9);
+ NewDoc.address = use_this_url_instead;
+ NewDoc.post_data = NULL;
+ NewDoc.post_content_type = NULL;
+ NewDoc.bookmark = anchor->bookmark;
+ NewDoc.isHEAD = anchor->isHEAD;
+ NewDoc.safe = anchor->safe;
+ anchor = HTAnchor_findAddress(&NewDoc);
+ }
+ }
+ /*
+ * If we had previous redirection, go back and check out that the URL under
+ * the current restrictions. - FM
+ */
+ if (use_this_url_instead) {
+ FREE(redirecting_url);
+ return (NO);
+ }
+
+ /*
+ * See if we can use an already loaded document.
+ */
+ text = (HText *) HTAnchor_document(anchor);
+ if (text && !LYforce_no_cache) {
+ /*
+ * We have a cached rendition of the target document. Check if it's OK
+ * to re-use it. We consider it OK if:
+ * (1) the anchor does not have the no_cache element set, or
+ * (2) we've overridden it, e.g., because we are acting on a PREV_DOC
+ * command or a link in the History Page and it's not a reply from a
+ * POST with the LYresubmit_posts flag set, or
+ * (3) we are repositioning within the currently loaded document based
+ * on the target anchor's address (URL_Reference).
+ *
+ * If track_internal_links is false, HText_AreDifferent() is
+ * used to determine whether (3) applies. If the target address
+ * differs from that of the current document only by a fragment and the
+ * target address has an appended fragment, repositioning without
+ * reloading is always assumed. Note that HText_AreDifferent()
+ * currently always returns TRUE if the target has a LYNXIMGMAP URL, so
+ * that an internally generated pseudo-document will normally not be
+ * re-used unless condition (2) applies. (Condition (1) cannot apply
+ * since in LYMap.c, no_cache is always set in the anchor object).
+ * This doesn't guarantee that the resource from which the MAP element
+ * is taken will be read again (reloaded) when the list of links for a
+ * client-side image map is regenerated, when in some cases it should
+ * (e.g., user requested RELOAD, or HTTP response with no-cache header
+ * and we are not overriding).
+ *
+ * If track_internal_links is true, a target address that
+ * points to the same URL as the current document may still result in
+ * reloading, depending on whether the original URL-Reference was given
+ * as an internal link in the context of the previously loaded
+ * document. HText_AreDifferent() is not used here for testing whether
+ * we are just repositioning. For an internal link, the potential
+ * callers of this function from mainloop() down will either avoid
+ * making the call (and do the repositioning differently) or set
+ * LYinternal_flag (or LYoverride_no_cache). Note that (a) LYNXIMGMAP
+ * pseudo-documents and (b) The "List Page" document are treated
+ * logically as being part of the document on which they are based, for
+ * the purpose of whether to treat a link as internal, but the logic
+ * for this (by setting LYinternal_flag as necessary) is implemented
+ * elsewhere. There is a specific test for LYNXIMGMAP here so that the
+ * generated pseudo-document will not be re-used unless
+ * LYoverride_no_cache is set. The same caveat as above applies w.r.t.
+ * reloading of the underlying resource.
+ *
+ * We also should be checking other aspects of cache regulation (e.g.,
+ * based on an If-Modified-Since check, etc.) but the code for doing
+ * those other things isn't available yet.
+ */
+ if ((reloading != REAL_RELOAD) &&
+ (LYoverride_no_cache ||
+ ((!track_internal_links &&
+ (!HText_hasNoCacheSet(text) ||
+ !HText_AreDifferent(anchor, full_address))) ||
+ (track_internal_links &&
+ (((LYinternal_flag || !HText_hasNoCacheSet(text)) &&
+ !isLYNXIMGMAP(full_address))))))) {
+ CTRACE((tfp, "HTAccess: Document already in memory.\n"));
+ HText_select(text);
+
+#ifdef DIRED_SUPPORT
+ if (HTAnchor_format(anchor) == WWW_DIRED)
+ lynx_edit_mode = TRUE;
+#endif
+ redirection_attempts = 0;
+ return YES;
+ } else {
+ ForcingNoCache = YES;
+ BStrFree(anchor->post_data);
+ CTRACE((tfp, "HTAccess: Auto-reloading document.\n"));
+ }
+ }
+
+ if (HText_HaveUserChangedForms(text)) {
+ /*
+ * Issue a warning. User forms content will be lost.
+ * Will not restore changed forms, currently.
+ */
+ HTAlert(RELOADING_FORM);
+ }
+
+ /*
+ * Get the document from the net. If we are auto-reloading, the mutable
+ * anchor elements from the previous rendition should be freed in
+ * conjunction with loading of the new rendition. - FM
+ */
+ LYforce_no_cache = NO; /* reset after each time through */
+ if (ForcingNoCache) {
+ FREE(anchor->title); /* ??? */
+ }
+ status = HTLoad(address_to_load, anchor, format_out, sink);
+ CTRACE((tfp, "HTAccess: status=%d\n", status));
+
+ /*
+ * RECOVERY: if the loading failed, and we had a cached HText copy, and no
+ * new HText created - use a previous copy, issue a warning.
+ */
+ if (text && status < 0 && (HText *) HTAnchor_document(anchor) == text) {
+ HTAlert(gettext("Loading failed, use a previous copy."));
+ CTRACE((tfp, "HTAccess: Loading failed, use a previous copy.\n"));
+ HText_select(text);
+
+#ifdef DIRED_SUPPORT
+ if (HTAnchor_format(anchor) == WWW_DIRED)
+ lynx_edit_mode = TRUE;
+#endif
+ redirection_attempts = 0;
+ return YES;
+ }
+
+ /*
+ * Log the access if necessary.
+ */
+ if (HTlogfile) {
+ time_t theTime;
+
+ time(&theTime);
+ fprintf(HTlogfile, "%24.24s %s %s %s\n",
+ ctime(&theTime),
+ HTClientHost ? HTClientHost : "local",
+ status < 0 ? "FAIL" : "GET",
+ full_address);
+ fflush(HTlogfile); /* Actually update it on disk */
+ CTRACE((tfp, "Log: %24.24s %s %s %s\n",
+ ctime(&theTime),
+ HTClientHost ? HTClientHost : "local",
+ status < 0 ? "FAIL" : "GET",
+ full_address));
+ }
+
+ /*
+ * Check out what we received from the net.
+ */
+ if (status == HT_REDIRECTING) {
+ /* Exported from HTMIME.c, of all places. */
+ /* NO!! - FM */
+ /*
+ * Doing this via HTMIME.c meant that the redirection cover page was
+ * already loaded before we learned that we want a different URL.
+ * Also, changing anchor->address, as Lynx was doing, meant we could
+ * never again access its hash table entry, creating an insolvable
+ * memory leak. Instead, if we had a 301 status and set
+ * permanent_redirection, we'll load the new URL in anchor->physical,
+ * preceded by a token, which we can check to make replacements on
+ * subsequent access attempts. We'll check recursively, and retrieve
+ * the final URL if we had multiple redirections to it. If we just
+ * went to HTLoad now, as Lou originally had this, we couldn't do
+ * Lynx's security checks and alternate handling of some URL types.
+ * So, instead, we'll go all the way back to the top of getfile in
+ * LYGetFile.c when the status is HT_REDIRECTING. This may seem
+ * bizarre, but it works like a charm! - FM
+ *
+ * Actually, the location header for redirections is now again picked
+ * up in HTMIME.c. But that's an internal matter between HTTP.c and
+ * HTMIME.c, is still under control of HTLoadHTTP for http URLs, is
+ * done in a way that doesn't load the redirection response's body
+ * (except when wanted as an error fallback), and thus need not concern
+ * us here. - kw 1999-12-02
+ */
+ CTRACE((tfp, "HTAccess: '%s' is a redirection URL.\n",
+ address_to_load));
+ CTRACE((tfp, "HTAccess: Redirecting to '%s'\n",
+ redirecting_url));
+ /*
+ * Prevent circular references.
+ */
+ if (strcmp(address_to_load, redirecting_url)) { /* if different */
+ /*
+ * Load token and redirecting url into anchor->physical if we had
+ * 301 Permanent redirection. HTTP.c does not allow this if we
+ * have POST content. - FM
+ */
+ if (permanent_redirection) {
+ StrAllocCopy(anchor->physical, "Location=");
+ StrAllocCat(anchor->physical, redirecting_url);
+ }
+
+ /*
+ * Set up flags before return to getfile. - FM
+ */
+ StrAllocCopy(use_this_url_instead, redirecting_url);
+ if (ForcingNoCache)
+ LYforce_no_cache = YES;
+ ++redirection_attempts;
+ FREE(redirecting_url);
+ permanent_redirection = FALSE;
+ return (NO);
+ }
+ ++redirection_attempts;
+ FREE(redirecting_url);
+ permanent_redirection = FALSE;
+ return (YES);
+ }
+
+ /*
+ * We did not receive a redirecting URL. - FM
+ */
+ redirection_attempts = 0;
+ FREE(redirecting_url);
+ permanent_redirection = FALSE;
+
+ if (status == HT_LOADED) {
+ CTRACE((tfp, "HTAccess: `%s' has been accessed.\n",
+ full_address));
+ return YES;
+ }
+ if (status == HT_PARTIAL_CONTENT) {
+ HTAlert(gettext("Loading incomplete."));
+ CTRACE((tfp, "HTAccess: `%s' has been accessed, partial content.\n",
+ full_address));
+ return YES;
+ }
+
+ if (status == HT_NO_DATA) {
+ CTRACE((tfp, "HTAccess: `%s' has been accessed, No data left.\n",
+ full_address));
+ return NO;
+ }
+
+ if (status == HT_NOT_LOADED) {
+ CTRACE((tfp, "HTAccess: `%s' has been accessed, No data loaded.\n",
+ full_address));
+ return NO;
+ }
+
+ if (status == HT_INTERRUPTED) {
+ CTRACE((tfp,
+ "HTAccess: `%s' has been accessed, transfer interrupted.\n",
+ full_address));
+ return NO;
+ }
+
+ if (status > 0) {
+ /*
+ * If you get this, then please find which routine is returning a
+ * positive unrecognized error code!
+ */
+ fprintf(stderr,
+ gettext("**** HTAccess: socket or file number returned by obsolete load routine!\n"));
+ fprintf(stderr,
+ gettext("**** HTAccess: Internal software error. Please mail lynx-dev@nongnu.org!\n"));
+ fprintf(stderr, gettext("**** HTAccess: Status returned was: %d\n"), status);
+ exit_immediately(EXIT_FAILURE);
+ }
+
+ /* Failure in accessing a document */
+ cp = NULL;
+ StrAllocCopy(cp, gettext("Can't Access"));
+ StrAllocCat(cp, " `");
+ StrAllocCat(cp, full_address);
+ StrAllocCat(cp, "'");
+ _HTProgress(cp);
+ FREE(cp);
+
+ CTRACE((tfp, "HTAccess: Can't access `%s'\n", full_address));
+ HTLoadError(sink, 500, gettext("Unable to access document."));
+ return NO;
+} /* HTLoadDocument */
+
+/* Load a document from absolute name. HTLoadAbsolute()
+ * -----------------------------------
+ *
+ * On Entry,
+ * addr The absolute address of the document to be accessed.
+ * filter if YES, treat document as HTML
+ *
+ * On Exit,
+ * returns YES Success in opening document
+ * NO Failure
+ */
+BOOL HTLoadAbsolute(const DocAddress *docaddr)
+{
+ BOOL result;
+ HTParentAnchor *anchor = HTAnchor_findAddress(docaddr);
+
+ result = HTLoadDocument(docaddr->address,
+ anchor,
+ (HTOutputFormat ? HTOutputFormat : WWW_PRESENT),
+ HTOutputStream);
+ if (!result) {
+ HTAnchor_delete(anchor->parent);
+ }
+ return result;
+}
+
+#ifdef NOT_USED_CODE
+/* Load a document from absolute name to stream. HTLoadToStream()
+ * ---------------------------------------------
+ *
+ * On Entry,
+ * addr The absolute address of the document to be accessed.
+ * sink if non-NULL, send data down this stream
+ *
+ * On Exit,
+ * returns YES Success in opening document
+ * NO Failure
+ */
+BOOL HTLoadToStream(const char *addr,
+ BOOL filter,
+ HTStream *sink)
+{
+ return HTLoadDocument(addr,
+ HTAnchor_findSimpleAddress(addr),
+ (HTOutputFormat ? HTOutputFormat : WWW_PRESENT),
+ sink);
+}
+#endif /* NOT_USED_CODE */
+
+/* Load a document from relative name. HTLoadRelative()
+ * -----------------------------------
+ *
+ * On Entry,
+ * relative_name The relative address of the document
+ * to be accessed.
+ *
+ * On Exit,
+ * returns YES Success in opening document
+ * NO Failure
+ */
+BOOL HTLoadRelative(const char *relative_name,
+ HTParentAnchor *here)
+{
+ DocAddress full_address;
+ BOOL result;
+ char *mycopy = NULL;
+ char *stripped = NULL;
+
+ full_address.address = NULL;
+ full_address.post_data = NULL;
+ full_address.post_content_type = NULL;
+ full_address.bookmark = NULL;
+ full_address.isHEAD = FALSE;
+ full_address.safe = FALSE;
+
+ StrAllocCopy(mycopy, relative_name);
+
+ stripped = HTStrip(mycopy);
+ full_address.address =
+ HTParse(stripped,
+ here->address,
+ PARSE_ALL_WITHOUT_ANCHOR);
+ result = HTLoadAbsolute(&full_address);
+ /*
+ * If we got redirection, result will be NO, but use_this_url_instead will
+ * be set. The calling routine should check both and do whatever is
+ * appropriate. - FM
+ */
+ FREE(full_address.address);
+ FREE(mycopy); /* Memory leak fixed 10/7/92 -- JFG */
+ return result;
+}
+
+/* Load if necessary, and select an anchor. HTLoadAnchor()
+ * ----------------------------------------
+ *
+ * On Entry,
+ * destination The child or parent anchor to be loaded.
+ *
+ * On Exit,
+ * returns YES Success
+ * NO Failure
+ */
+BOOL HTLoadAnchor(HTAnchor * destination)
+{
+ HTParentAnchor *parent;
+ BOOL loaded = NO;
+
+ if (!destination)
+ return NO; /* No link */
+
+ parent = HTAnchor_parent(destination);
+
+ if (HTAnchor_document(parent) == NULL) { /* If not already loaded */
+ /* TBL 921202 */
+ BOOL result;
+
+ result = HTLoadDocument(parent->address,
+ parent,
+ HTOutputFormat ?
+ HTOutputFormat : WWW_PRESENT,
+ HTOutputStream);
+ if (!result)
+ return NO;
+ loaded = YES;
+ } {
+ HText *text = (HText *) HTAnchor_document(parent);
+
+ if ((destination != (HTAnchor *) parent) &&
+ (destination != (HTAnchor *) (parent->parent))) {
+ /* If child anchor */
+ HText_selectAnchor(text, /* Double display? @@ */
+ (HTChildAnchor *) destination);
+ } else {
+ if (!loaded)
+ HText_select(text);
+ }
+ }
+ return YES;
+
+} /* HTLoadAnchor */
+
+/* Search. HTSearch()
+ * -------
+ *
+ * Performs a keyword search on word given by the user. Adds the
+ * keyword to the end of the current address and attempts to open
+ * the new address.
+ *
+ * On Entry,
+ * *keywords space-separated keyword list or similar search list
+ * here is anchor search is to be done on.
+ */
+static char hex(int i)
+{
+ const char *hexchars = "0123456789ABCDEF";
+
+ return hexchars[i];
+}
+
+BOOL HTSearch(const char *keywords,
+ HTParentAnchor *here)
+{
+#define acceptable \
+"1234567890abcdefghijlkmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-_"
+
+ char *q, *u;
+ const char *p, *s, *e; /* Pointers into keywords */
+ char *address = NULL;
+ BOOL result;
+ char *escaped = typecallocn(char, (strlen(keywords) * 3) + 1);
+ static const BOOL isAcceptable[96] =
+ /* *INDENT-OFF* */
+ /* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
+ { 0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0, /* 2x !"#$%&'()*+,-./ */
+ 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0, /* 3x 0123456789:;<=>? */
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4x @ABCDEFGHIJKLMNO */
+ 1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1, /* 5X PQRSTUVWXYZ[\]^_ */
+ 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6x `abcdefghijklmno */
+ 1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0 }; /* 7X pqrstuvwxyz{\}~ DEL */
+ /* *INDENT-ON* */
+
+ if (escaped == NULL)
+ outofmem(__FILE__, "HTSearch");
+
+ if (here->isIndexAction == NULL) {
+ free(escaped);
+ return FALSE;
+ }
+ StrAllocCopy(address, here->isIndexAction);
+
+ /*
+ * Convert spaces to + and hex escape unacceptable characters.
+ */
+ for (s = keywords; *s && WHITE(*s); s++) /* Scan */
+ ; /* Skip white space */
+ for (e = s + strlen(s); e > s && WHITE(*(e - 1)); e--) /* Scan */
+ ; /* Skip trailers */
+ for (q = escaped, p = s; p < e; p++) { /* Scan stripped field */
+ unsigned char c = UCH(TOASCII(*p));
+
+ if (WHITE(*p)) {
+ *q++ = '+';
+ } else if (IS_CJK_TTY) {
+ *q++ = *p;
+ } else if (c >= 32 && c <= UCH(127) && isAcceptable[c - 32]) {
+ *q++ = *p; /* 930706 TBL for MVS bug */
+ } else {
+ *q++ = '%';
+ *q++ = hex((int) (c >> 4));
+ *q++ = hex((int) (c & 15));
+ }
+ } /* Loop over string */
+ *q = '\0'; /* Terminate escaped string */
+ u = StrChr(address, '?'); /* Find old search string */
+ if (u != NULL)
+ *u = '\0'; /* Chop old search off */
+
+ StrAllocCat(address, "?");
+ StrAllocCat(address, escaped);
+ FREE(escaped);
+ result = HTLoadRelative(address, here);
+ FREE(address);
+
+ /*
+ * If we got redirection, result will be NO, but use_this_url_instead will
+ * be set. The calling routine should check both and do whatever is
+ * appropriate. Only an http server (not a gopher or wais server) could
+ * return redirection. Lynx will go all the way back to its mainloop() and
+ * subject a redirecting URL to all of its security and restrictions
+ * checks. - FM
+ */
+ return result;
+}
+
+/* Search Given Indexname. HTSearchAbsolute()
+ * -----------------------
+ *
+ * Performs a keyword search on word given by the user. Adds the
+ * keyword to the end of the current address and attempts to open
+ * the new address.
+ *
+ * On Entry,
+ * *keywords space-separated keyword list or similar search list
+ * *indexname is name of object search is to be done on.
+ */
+BOOL HTSearchAbsolute(const char *keywords,
+ char *indexname)
+{
+ DocAddress abs_doc;
+ HTParentAnchor *anchor;
+
+ abs_doc.address = indexname;
+ abs_doc.post_data = NULL;
+ abs_doc.post_content_type = NULL;
+ abs_doc.bookmark = NULL;
+ abs_doc.isHEAD = FALSE;
+ abs_doc.safe = FALSE;
+
+ anchor = HTAnchor_findAddress(&abs_doc);
+ return HTSearch(keywords, anchor);
+}
+
+#ifdef NOT_USED_CODE
+/* Generate the anchor for the home page. HTHomeAnchor()
+ * --------------------------------------
+ *
+ * As it involves file access, this should only be done once
+ * when the program first runs.
+ * This is a default algorithm -- browser don't HAVE to use this.
+ * But consistency between browsers is STRONGLY recommended!
+ *
+ * Priority order is:
+ * 1 WWW_HOME environment variable (logical name, etc)
+ * 2 ~/WWW/default.html
+ * 3 /usr/local/bin/default.html
+ * 4 http://www.w3.org/default.html
+ */
+HTParentAnchor *HTHomeAnchor(void)
+{
+ char *my_home_document = NULL;
+ char *home = LYGetEnv(LOGICAL_DEFAULT);
+ char *ref;
+ HTParentAnchor *anchor;
+
+ if (home) {
+ StrAllocCopy(my_home_document, home);
+#define MAX_FILE_NAME 1024 /* @@@ */
+ } else if (HTClientHost) { /* Telnet server */
+ /*
+ * Someone telnets in, they get a special home.
+ */
+ FILE *fp = fopen(REMOTE_POINTER, "r");
+ char *status;
+
+ if (fp) {
+ my_home_document = typecallocn(char, MAX_FILE_NAME);
+
+ if (my_home_document == NULL)
+ outofmem(__FILE__, "HTHomeAnchor");
+ status = fgets(my_home_document, MAX_FILE_NAME, fp);
+ if (!status) {
+ FREE(my_home_document);
+ }
+ fclose(fp);
+ }
+ if (my_home_document == NULL)
+ StrAllocCopy(my_home_document, REMOTE_ADDRESS);
+ }
+#ifdef UNIX
+ if (my_home_document == NULL) {
+ FILE *fp = NULL;
+ char *home = LYGetEnv("HOME");
+
+ if (home != 0) {
+ HTSprintf0(&my_home_document, "%s/%s", home, PERSONAL_DEFAULT);
+ fp = fopen(my_home_document, "r");
+ }
+
+ if (!fp) {
+ StrAllocCopy(my_home_document, LOCAL_DEFAULT_FILE);
+ fp = fopen(my_home_document, "r");
+ }
+ if (fp) {
+ fclose(fp);
+ } else {
+ CTRACE((tfp, "HTBrowse: No local home document ~/%s or %s\n",
+ PERSONAL_DEFAULT, LOCAL_DEFAULT_FILE));
+ FREE(my_home_document);
+ }
+ }
+#endif /* UNIX */
+ ref = HTParse((my_home_document ?
+ my_home_document : (HTClientHost ?
+ REMOTE_ADDRESS : LAST_RESORT)),
+ STR_FILE_URL,
+ PARSE_ALL_WITHOUT_ANCHOR);
+ if (my_home_document) {
+ CTRACE((tfp, "HTAccess: Using custom home page %s i.e., address %s\n",
+ my_home_document, ref));
+ FREE(my_home_document);
+ }
+ anchor = HTAnchor_findSimpleAddress(ref);
+ FREE(ref);
+ return anchor;
+}
+#endif /* NOT_USED_CODE */
diff --git a/WWW/Library/Implementation/HTAccess.h b/WWW/Library/Implementation/HTAccess.h
new file mode 100644
index 0000000..b898535
--- /dev/null
+++ b/WWW/Library/Implementation/HTAccess.h
@@ -0,0 +1,268 @@
+/*
+ * $LynxId: HTAccess.h,v 1.21 2019/08/23 23:51:45 tom Exp $
+ * HTAccess: Access manager for libwww
+ * ACCESS MANAGER
+ *
+ * This module keeps a list of valid protocol (naming scheme) specifiers with
+ * associated access code. It allows documents to be loaded given various
+ * combinations of parameters. New access protocols may be registered at any
+ * time.
+ *
+ * Part of the libwww library .
+ *
+ */
+#ifndef HTACCESS_H
+#define HTACCESS_H
+
+/* Definition uses:
+*/
+#include <HTAnchor.h>
+#include <HTFormat.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ extern char *use_this_url_instead;
+
+ extern int redirection_limit;
+ extern int redirection_attempts;
+
+/* Return codes from load routines:
+ *
+ * These codes may be returned by the protocol modules,
+ * and by the HTLoad routines.
+ * In general, positive codes are OK and negative ones are bad.
+ */
+
+/*
+
+Default Addresses
+
+ These control the home page selection. To mess with these for normal browses is asking
+ for user confusion.
+
+ */
+#define LOGICAL_DEFAULT "WWW_HOME" /* Defined to be the home page */
+
+#ifndef PERSONAL_DEFAULT
+#define PERSONAL_DEFAULT "WWW/default.html" /* in home directory */
+#endif
+#ifndef LOCAL_DEFAULT_FILE
+#define LOCAL_DEFAULT_FILE "/usr/local/lib/WWW/default.html"
+#endif
+/* If one telnets to a www access point,
+ it will look in this file for home page */
+#ifndef REMOTE_POINTER
+#define REMOTE_POINTER "/etc/www-remote.url" /* can't be file */
+#endif
+/* and if that fails it will use this. */
+#ifndef REMOTE_ADDRESS
+#define REMOTE_ADDRESS "http://www.w3.org/remote.html" /* can't be file */
+#endif
+
+/* If run from telnet daemon and no -l specified, use this file:
+*/
+#ifndef DEFAULT_LOGFILE
+#define DEFAULT_LOGFILE "/usr/adm/www-log/www-log"
+#endif
+
+/* If the home page isn't found, use this file:
+*/
+#ifndef LAST_RESORT
+#define LAST_RESORT "http://www.w3.org/default.html"
+#endif
+
+/*
+
+Flags which may be set to control this module
+
+ */
+#ifdef NOT
+ extern int HTDiag; /* Flag: load source as plain text */
+#endif /* NOT */
+ extern char *HTClientHost; /* Name or number of telnetting host */
+ extern FILE *HTlogfile; /* File to output one-liners to */
+ extern BOOL HTSecure; /* Disable security holes? */
+ extern BOOL HTPermitRedir; /* Special flag for getfile() */
+ extern HTStream *HTOutputStream; /* For non-interactive, set this */
+ extern HTFormat HTOutputFormat; /* To convert on load, set this */
+
+/* Check for proxy override. override_proxy()
+ *
+ * Check the no_proxy environment variable to get the list
+ * of hosts for which proxy server is not consulted.
+ *
+ * no_proxy is a comma- or space-separated list of machine
+ * or domain names, with optional :port part. If no :port
+ * part is present, it applies to all ports on that domain.
+ *
+ * Example:
+ * no_proxy="cern.ch,some.domain:8001"
+ *
+ * Use "*" to override all proxy service:
+ * no_proxy="*"
+ */
+ extern BOOL override_proxy(const char *addr);
+
+/*
+
+Load a document from relative name
+
+ ON ENTRY,
+ relative_name The relative address of the file to be accessed.
+ here The anchor of the object being searched
+
+ ON EXIT,
+ returns YES Success in opening file
+ NO Failure
+
+ */
+ extern BOOL HTLoadRelative(const char *relative_name,
+ HTParentAnchor *here);
+
+/*
+
+Load a document from absolute name
+
+ ON ENTRY,
+ addr The absolute address of the document to be accessed.
+ filter_it if YES, treat document as HTML
+
+ ON EXIT,
+ returns YES Success in opening document
+ NO Failure
+
+ */
+ extern BOOL HTLoadAbsolute(const DocAddress *addr);
+
+/*
+
+Load a document from absolute name to a stream
+
+ ON ENTRY,
+ addr The absolute address of the document to be accessed.
+ filter_it if YES, treat document as HTML
+
+ ON EXIT,
+ returns YES Success in opening document
+ NO Failure
+
+ Note: This is equivalent to HTLoadDocument
+
+ */
+ extern BOOL HTLoadToStream(const char *addr, BOOL filter_it,
+ HTStream *sink);
+
+/*
+
+Load if necessary, and select an anchor
+
+ ON ENTRY,
+ destination The child or parent anchor to be loaded.
+
+ ON EXIT,
+ returns YES Success
+ returns NO Failure
+
+ */
+ extern BOOL HTLoadAnchor(HTAnchor * destination);
+
+/*
+
+Make a stream for Saving object back
+
+ ON ENTRY,
+ anchor is valid anchor which has previously been loaded
+
+ ON EXIT,
+ returns 0 if error else a stream to save the object to.
+
+ */
+ extern HTStream *HTSaveStream(HTParentAnchor *anchor);
+
+/*
+
+Search
+
+ Performs a search on word given by the user. Adds the search words to the end of the
+ current address and attempts to open the new address.
+
+ ON ENTRY,
+ *keywords space-separated keyword list or similar search list
+ here The anchor of the object being searched
+
+ */
+ extern BOOL HTSearch(const char *keywords, HTParentAnchor *here);
+
+/*
+
+Search Given Indexname
+
+ Performs a keyword search on word given by the user. Adds the keyword to the end of
+ the current address and attempts to open the new address.
+
+ ON ENTRY,
+ *keywords space-separated keyword list or similar search list
+ *indexname is name of object search is to be done on.
+
+ */
+ extern BOOL HTSearchAbsolute(const char *keywords,
+ char *indexname);
+
+/*
+
+Register an access method
+
+ */
+
+ typedef struct _HTProtocol {
+ const char *name;
+
+ int (*load) (const char *full_address,
+ HTParentAnchor *anchor,
+ HTFormat format_out,
+ HTStream *sink);
+
+ HTStream *(*saveStream) (HTParentAnchor *anchor);
+
+ } HTProtocol;
+
+ extern BOOL HTRegisterProtocol(HTProtocol * protocol);
+
+/*
+
+Generate the anchor for the home page
+
+ */
+
+/*
+
+ As it involves file access, this should only be done once when the program first runs.
+ This is a default algorithm -- browser don't HAVE to use this.
+
+ */
+ extern HTParentAnchor *HTHomeAnchor(void);
+
+/*
+
+Return Host Name
+
+ */
+ extern const char *HTHostName(void);
+
+/*
+
+For registering protocols supported by Lynx
+
+*/
+ extern void LYRegisterLynxProtocols(void);
+
+ extern void LYUCPushAssumed(HTParentAnchor *anchor);
+ extern int LYUCPopAssumed(void);
+
+ extern BOOL using_proxy; /* Are we using an NNTP proxy? */
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* HTACCESS_H */
diff --git a/WWW/Library/Implementation/HTAnchor.c b/WWW/Library/Implementation/HTAnchor.c
new file mode 100644
index 0000000..b5ca251
--- /dev/null
+++ b/WWW/Library/Implementation/HTAnchor.c
@@ -0,0 +1,1460 @@
+/*
+ * $LynxId: HTAnchor.c,v 1.82 2020/01/21 21:58:52 tom Exp $
+ *
+ * Hypertext "Anchor" Object HTAnchor.c
+ * ==========================
+ *
+ * An anchor represents a region of a hypertext document which is linked to
+ * another anchor in the same or a different document.
+ *
+ * History
+ *
+ * Nov 1990 Written in Objective-C for the NeXT browser (TBL)
+ * 24-Oct-1991 (JFG), written in C, browser-independent
+ * 21-Nov-1991 (JFG), first complete version
+ *
+ * (c) Copyright CERN 1991 - See Copyright.html
+ */
+
+#define HASH_SIZE 997 /* Arbitrary prime. Memory/speed tradeoff */
+
+#include <HTUtils.h>
+#include <HTAnchor.h>
+#include <HTParse.h>
+#include <HTString.h>
+#include <UCAux.h>
+#include <UCMap.h>
+
+#include <GridText.h>
+#include <LYUtils.h>
+#include <LYCharSets.h>
+#include <LYUtils.h>
+#include <LYLeaks.h>
+
+#define HASH_OF(h, v) ((HASH_TYPE)((h) * 3 + UCH(v)) % HASH_SIZE)
+
+static HASH_TYPE anchor_hash(const char *cp_address)
+{
+ HASH_TYPE hash;
+ const char *p;
+
+ for (p = cp_address, hash = 0; *p; p++)
+ hash = HASH_OF(hash, *p);
+
+ return (hash);
+}
+
+typedef struct _HyperDoc Hyperdoc;
+
+#ifdef VMS
+struct _HyperDoc {
+ int junk; /* VMS cannot handle pointers to undefined structs */
+};
+#endif /* VMS */
+
+/* Table of lists of all parents */
+static HTList adult_table[HASH_SIZE] =
+{
+ {NULL, NULL}};
+
+/* Creation Methods
+ * ================
+ *
+ * Do not use "new" by itself outside this module. In order to enforce
+ * consistency, we insist that you furnish more information about the
+ * anchor you are creating : use newWithParent or newWithAddress.
+ */
+static HTParentAnchor0 *HTParentAnchor0_new(const char *address,
+ unsigned hash)
+{
+ HTParentAnchor0 *newAnchor = typecalloc(HTParentAnchor0);
+
+ if (newAnchor == NULL)
+ outofmem(__FILE__, "HTParentAnchor0_new");
+
+ newAnchor->parent = newAnchor; /* self */
+ StrAllocCopy(newAnchor->address, address);
+ newAnchor->adult_hash = (HASH_TYPE) hash;
+
+ return (newAnchor);
+}
+
+static HTParentAnchor *HTParentAnchor_new(HTParentAnchor0 *parent)
+{
+ HTParentAnchor *newAnchor = typecalloc(HTParentAnchor);
+
+ if (newAnchor == NULL)
+ outofmem(__FILE__, "HTParentAnchor_new");
+
+ newAnchor->parent = parent; /* cross reference */
+ parent->info = newAnchor; /* cross reference */
+ newAnchor->address = parent->address; /* copy pointer */
+
+ newAnchor->isISMAPScript = FALSE; /* Lynx appends ?0,0 if TRUE. - FM */
+ newAnchor->isHEAD = FALSE; /* HEAD request if TRUE. - FM */
+ newAnchor->safe = FALSE; /* Safe. - FM */
+ newAnchor->no_cache = FALSE; /* no-cache? - FM */
+ newAnchor->inBASE = FALSE; /* duplicated from HTML.c/h */
+ newAnchor->content_length = 0; /* Content-Length. - FM */
+ return (newAnchor);
+}
+
+static HTChildAnchor *HTChildAnchor_new(HTParentAnchor0 *parent)
+{
+ HTChildAnchor *p = typecalloc(HTChildAnchor);
+
+ if (p == NULL)
+ outofmem(__FILE__, "HTChildAnchor_new");
+
+ p->parent = parent; /* parent reference */
+ return p;
+}
+
+static HTChildAnchor *HText_pool_ChildAnchor_new(HTParentAnchor *parent)
+{
+ HTChildAnchor *p = (HTChildAnchor *) HText_pool_calloc((HText *) (parent->document),
+ (unsigned) sizeof(HTChildAnchor));
+
+ if (p == NULL)
+ outofmem(__FILE__, "HText_pool_ChildAnchor_new");
+
+ p->parent = parent->parent; /* parent reference */
+ return p;
+}
+
+#ifdef CASE_INSENSITIVE_ANCHORS
+/* Case insensitive string comparison */
+#define HT_EQUIV(a,b) (TOUPPER(a) == TOUPPER(b))
+#else
+/* Case sensitive string comparison */
+#define HT_EQUIV(a,b) ((a) == (b))
+#endif
+
+/* Null-terminated string comparison
+ * ---------------------------------
+ * On entry,
+ * s Points to one string, null terminated
+ * t points to the other.
+ * On exit,
+ * returns YES if the strings are equivalent
+ * NO if they differ.
+ */
+static BOOL HTSEquivalent(const char *s,
+ const char *t)
+{
+ if (s && t) { /* Make sure they point to something */
+ for (; *s && *t; s++, t++) {
+ if (!HT_EQUIV(*s, *t)) {
+ return (NO);
+ }
+ }
+ return (BOOL) (HT_EQUIV(*s, *t));
+ } else {
+ return (BOOL) (s == t); /* Two NULLs are equivalent, aren't they ? */
+ }
+}
+
+/* Binary string comparison
+ * ------------------------
+ * On entry,
+ * s Points to one bstring
+ * t points to the other.
+ * On exit,
+ * returns YES if the strings are equivalent
+ * NO if they differ.
+ */
+static BOOL HTBEquivalent(const bstring *s,
+ const bstring *t)
+{
+ if (s && t && BStrLen(s) == BStrLen(t)) {
+ int j;
+ int len = BStrLen(s);
+
+ for (j = 0; j < len; ++j) {
+ if (!HT_EQUIV(BStrData(s)[j], BStrData(t)[j])) {
+ return (NO);
+ }
+ }
+ return (YES);
+ } else {
+ return (BOOL) (s == t); /* Two NULLs are equivalent, aren't they ? */
+ }
+}
+
+/*
+ * Three-way compare function
+ */
+static int compare_anchors(void *l,
+ void *r)
+{
+ const char *a = ((HTChildAnchor *) l)->tag;
+ const char *b = ((HTChildAnchor *) r)->tag;
+
+ /* both tags are not NULL */
+
+#ifdef CASE_INSENSITIVE_ANCHORS
+ return strcasecomp(a, b); /* Case insensitive */
+#else
+ return strcmp(a, b); /* Case sensitive - FM */
+#endif /* CASE_INSENSITIVE_ANCHORS */
+}
+
+/* Create new or find old sub-anchor
+ * ---------------------------------
+ *
+ * This one is for a named child.
+ * The parent anchor must already exist.
+ */
+static HTChildAnchor *HTAnchor_findNamedChild(HTParentAnchor0 *parent,
+ const char *tag)
+{
+ HTChildAnchor *child;
+
+ if (parent && tag && *tag) { /* TBL */
+ if (parent->children) {
+ /*
+ * Parent has children. Search them.
+ */
+ HTChildAnchor sample;
+
+ sample.tag = DeConst(tag); /* for compare_anchors() only */
+
+ child = (HTChildAnchor *) HTBTree_search(parent->children, &sample);
+ if (child != NULL) {
+ CTRACE((tfp,
+ "Child anchor %p of parent %p with name `%s' already exists.\n",
+ (void *) child, (void *) parent, tag));
+ return (child);
+ }
+ } else { /* parent doesn't have any children yet : create family */
+ parent->children = HTBTree_new(compare_anchors);
+ }
+
+ child = HTChildAnchor_new(parent);
+ CTRACE((tfp, "HTAnchor: New Anchor %p named `%s' is child of %p\n",
+ (void *) child,
+ NonNull(tag),
+ (void *) child->parent));
+
+ StrAllocCopy(child->tag, tag); /* should be set before HTBTree_add */
+ HTBTree_add(parent->children, child);
+ return (child);
+
+ } else {
+ CTRACE((tfp, "HTAnchor_findNamedChild called with NULL parent.\n"));
+ return (NULL);
+ }
+
+}
+
+/*
+ * This one is for a new unnamed child being edited into an existing
+ * document. The parent anchor and the document must already exist.
+ * (Just add new unnamed child).
+ */
+static HTChildAnchor *HTAnchor_addChild(HTParentAnchor *parent)
+{
+ HTChildAnchor *child;
+
+ if (!parent) {
+ CTRACE((tfp, "HTAnchor_addChild called with NULL parent.\n"));
+ return (NULL);
+ }
+
+ child = HText_pool_ChildAnchor_new(parent);
+ CTRACE((tfp, "HTAnchor: New unnamed Anchor %p is child of %p\n",
+ (void *) child,
+ (void *) child->parent));
+
+ child->tag = 0;
+ HTList_linkObject(&parent->children_notag, child, &child->_add_children_notag);
+
+ return (child);
+}
+
+static HTParentAnchor0 *HTAnchor_findAddress_in_adult_table(const DocAddress *newdoc);
+
+static BOOL HTAnchor_link(HTChildAnchor *child,
+ HTAnchor * destination,
+ HTLinkType *type);
+
+/* Create or find a child anchor with a possible link
+ * --------------------------------------------------
+ *
+ * Create new anchor with a given parent and possibly
+ * a name, and possibly a link to a _relatively_ named anchor.
+ * (Code originally in ParseHTML.h)
+ */
+HTChildAnchor *HTAnchor_findChildAndLink(HTParentAnchor *parent, /* May not be 0 */
+ const char *tag, /* May be "" or 0 */
+ const char *href, /* May be "" or 0 */
+ HTLinkType *ltype) /* May be 0 */
+{
+ HTChildAnchor *child;
+
+ CTRACE((tfp, "Entered HTAnchor_findChildAndLink: tag=`%s',%s href=`%s'\n",
+ NonNull(tag),
+ (ltype == HTInternalLink) ? " (internal link)" : "",
+ NonNull(href)));
+
+ if (parent == 0) {
+ child = 0;
+ } else {
+ if (non_empty(tag)) {
+ child = HTAnchor_findNamedChild(parent->parent, tag);
+ } else {
+ child = HTAnchor_addChild(parent);
+ }
+
+ if (non_empty(href)) {
+ const char *fragment = NULL;
+ HTParentAnchor0 *dest;
+
+ if (ltype == HTInternalLink && *href == '#') {
+ dest = parent->parent;
+ } else {
+ const char *relative_to = ((parent->inBASE && *href != '#')
+ ? parent->content_base
+ : parent->address);
+ DocAddress parsed_doc;
+
+ parsed_doc.address = HTParse(href, relative_to,
+ PARSE_ALL_WITHOUT_ANCHOR);
+
+ parsed_doc.post_data = NULL;
+ parsed_doc.post_content_type = NULL;
+ if (ltype && parent->post_data && ltype == HTInternalLink) {
+ /* for internal links, find a destination with the same
+ post data if the source of the link has post data. - kw
+ Example: LYNXIMGMAP: */
+ parsed_doc.post_data = parent->post_data;
+ parsed_doc.post_content_type = parent->post_content_type;
+ }
+ parsed_doc.bookmark = NULL;
+ parsed_doc.isHEAD = FALSE;
+ parsed_doc.safe = FALSE;
+
+ dest = HTAnchor_findAddress_in_adult_table(&parsed_doc);
+ FREE(parsed_doc.address);
+ }
+
+ /*
+ * [from HTAnchor_findAddress()]
+ * If the address represents a sub-anchor, we load its parent (above),
+ * then we create a named child anchor within that parent.
+ */
+ fragment = (*href == '#') ? href + 1 : HTParseAnchor(href);
+
+ if (*fragment)
+ dest = (HTParentAnchor0 *) HTAnchor_findNamedChild(dest, fragment);
+
+ if (tag && *tag) {
+ if (child->dest) { /* DUPLICATE_ANCHOR_NAME_WORKAROUND - kw */
+ CTRACE((tfp,
+ "*** Duplicate ChildAnchor %p named `%s'",
+ (void *) child, tag));
+ if ((HTAnchor *) dest != child->dest || ltype != child->type) {
+ CTRACE((tfp,
+ ", different dest %p or type, creating unnamed child\n",
+ (void *) child->dest));
+ child = HTAnchor_addChild(parent);
+ }
+ }
+ }
+ HTAnchor_link(child, (HTAnchor *) dest, ltype);
+ }
+ }
+ return child;
+}
+
+/* Create new or find old parent anchor
+ * ------------------------------------
+ *
+ * Me one is for a reference which is found in a document, and might
+ * not be already loaded.
+ * Note: You are not guaranteed a new anchor -- you might get an old one,
+ * like with fonts.
+ */
+HTParentAnchor *HTAnchor_findAddress(const DocAddress *newdoc)
+{
+ /* Anchor tag specified ? */
+ const char *tag = HTParseAnchor(newdoc->address);
+
+ CTRACE((tfp, "Entered HTAnchor_findAddress\n"));
+
+ /*
+ * If the address represents a sub-anchor, we load its parent, then we
+ * create a named child anchor within that parent.
+ */
+ if (*tag) {
+ DocAddress parsed_doc;
+ HTParentAnchor0 *foundParent;
+
+ parsed_doc.address = HTParse(newdoc->address, "",
+ PARSE_ALL_WITHOUT_ANCHOR);
+ parsed_doc.post_data = newdoc->post_data;
+ parsed_doc.post_content_type = newdoc->post_content_type;
+ parsed_doc.bookmark = newdoc->bookmark;
+ parsed_doc.isHEAD = newdoc->isHEAD;
+ parsed_doc.safe = newdoc->safe;
+
+ foundParent = HTAnchor_findAddress_in_adult_table(&parsed_doc);
+ (void) HTAnchor_findNamedChild(foundParent, tag);
+ FREE(parsed_doc.address);
+ return HTAnchor_parent((HTAnchor *) foundParent);
+ }
+ return HTAnchor_parent((HTAnchor *) HTAnchor_findAddress_in_adult_table(newdoc));
+}
+
+/* The address has no anchor tag, for sure.
+ */
+static HTParentAnchor0 *HTAnchor_findAddress_in_adult_table(const DocAddress *newdoc)
+{
+ /*
+ * Check whether we have this node.
+ */
+ HASH_TYPE hash;
+ HTList *adults;
+ HTList *grownups;
+ HTParentAnchor0 *foundAnchor;
+ BOOL need_extra_info = (BOOL) (newdoc->post_data ||
+ newdoc->post_content_type ||
+ newdoc->bookmark ||
+ newdoc->isHEAD ||
+ newdoc->safe);
+
+ /*
+ * We need not free adult_table[] atexit - it should be perfectly empty
+ * after free'ing all HText's. (There is an error if it is not empty at
+ * exit). -LP
+ */
+
+ /*
+ * Select list from hash table,
+ */
+ hash = anchor_hash(newdoc->address);
+ adults = &(adult_table[hash]);
+
+ /*
+ * Search list for anchor.
+ */
+ grownups = adults;
+ while (NULL != (foundAnchor =
+ (HTParentAnchor0 *) HTList_nextObject(grownups))) {
+ if (HTSEquivalent(foundAnchor->address, newdoc->address) &&
+
+ ((!foundAnchor->info && !need_extra_info) ||
+ (foundAnchor->info &&
+ HTBEquivalent(foundAnchor->info->post_data, newdoc->post_data) &&
+ foundAnchor->info->isHEAD == newdoc->isHEAD))) {
+ CTRACE((tfp, "Anchor %p with address `%s' already exists.\n",
+ (void *) foundAnchor, newdoc->address));
+ return foundAnchor;
+ }
+ }
+
+ /*
+ * Node not found: create new anchor.
+ */
+ foundAnchor = HTParentAnchor0_new(newdoc->address, hash);
+ CTRACE((tfp, "New anchor %p has hash %d and address `%s'\n",
+ (void *) foundAnchor, hash, newdoc->address));
+
+ if (need_extra_info) {
+ /* rare case, create a big structure */
+ HTParentAnchor *p = HTParentAnchor_new(foundAnchor);
+
+ if (newdoc->post_data)
+ BStrCopy(p->post_data, newdoc->post_data);
+ if (newdoc->post_content_type)
+ StrAllocCopy(p->post_content_type,
+ newdoc->post_content_type);
+ if (newdoc->bookmark)
+ StrAllocCopy(p->bookmark, newdoc->bookmark);
+ p->isHEAD = newdoc->isHEAD;
+ p->safe = newdoc->safe;
+ }
+ HTList_linkObject(adults, foundAnchor, &foundAnchor->_add_adult);
+
+ return foundAnchor;
+}
+
+/* Create new or find old named anchor - simple form
+ * -------------------------------------------------
+ *
+ * Like HTAnchor_findAddress, but simpler to use for simple cases.
+ * No post data etc. can be supplied. - kw
+ */
+HTParentAnchor *HTAnchor_findSimpleAddress(const char *url)
+{
+ DocAddress urldoc;
+
+ urldoc.address = DeConst(url); /* ignore warning, it IS treated like const - kw */
+ urldoc.post_data = NULL;
+ urldoc.post_content_type = NULL;
+ urldoc.bookmark = NULL;
+ urldoc.isHEAD = FALSE;
+ urldoc.safe = FALSE;
+ return HTAnchor_findAddress(&urldoc);
+}
+
+/* Link me Anchor to another given one
+ * -------------------------------------
+ */
+static BOOL HTAnchor_link(HTChildAnchor *child,
+ HTAnchor * destination,
+ HTLinkType *type)
+{
+ if (!(child && destination))
+ return (NO); /* Can't link to/from non-existing anchor */
+
+ CTRACE((tfp, "Linking child %p to anchor %p\n", (void *) child, (void *) destination));
+ if (child->dest) {
+ CTRACE((tfp, "*** child anchor already has destination, exiting!\n"));
+ return (NO);
+ }
+
+ child->dest = destination;
+ child->type = type;
+
+ if (child->parent != destination->parent)
+ /* link only foreign children */
+ HTList_linkObject(&destination->parent->sources, child, &child->_add_sources);
+
+ return (YES); /* Success */
+}
+
+/* Delete an anchor and possibly related things (auto garbage collection)
+ * --------------------------------------------
+ *
+ * The anchor is only deleted if the corresponding document is not loaded.
+ * All outgoing links from children are deleted, and children are
+ * removed from the sources lists of theirs targets.
+ * We also try to delete the targets whose documents are not loaded.
+ * If this anchor's sources list is empty, we delete it and its children.
+ */
+
+/*
+ * Recursively try to delete destination anchor of this child.
+ * In any event, this will tell destination anchor that we
+ * no longer consider it a destination.
+ */
+static void deleteLinks(HTChildAnchor *me)
+{
+ /*
+ * Unregister me with our destination anchor's parent.
+ */
+ if (me->dest) {
+ HTParentAnchor0 *parent = me->dest->parent;
+
+ /*
+ * Start. Set the dest pointer to zero.
+ */
+ me->dest = NULL;
+
+ /*
+ * Remove me from the parent's sources so that the parent knows one
+ * less anchor is its dest.
+ */
+ if ((me->parent != parent) && !HTList_isEmpty(&parent->sources)) {
+ /*
+ * Really should only need to deregister once.
+ */
+ HTList_unlinkObject(&parent->sources, (void *) me);
+ }
+
+ /*
+ * Recursive call. Test here to avoid calling overhead. Don't delete
+ * if document is loaded or being loaded.
+ */
+ if ((me->parent != parent) &&
+ parent != NULL &&
+ !parent->underway &&
+ (!parent->info || !parent->info->document)) {
+ HTAnchor_delete(parent);
+ }
+
+ /*
+ * At this point, we haven't a destination. Set it to be so. Leave
+ * the HTAtom pointed to by type up to other code to handle (reusable,
+ * near static).
+ */
+ me->type = NULL;
+ }
+}
+
+static void HTParentAnchor_free(HTParentAnchor *me);
+
+BOOL HTAnchor_delete(HTParentAnchor0 *me)
+{
+ /*
+ * Memory leaks fixed.
+ * 05-27-94 Lynx 2-3-1 Garrett Arch Blythe
+ */
+ HTBTElement *ele;
+ HTChildAnchor *child;
+
+ /*
+ * Do nothing if nothing to do.
+ */
+ if (!me) {
+ return (NO);
+ }
+
+ /*
+ * Don't delete if document is loaded or being loaded.
+ */
+ if (me->underway || (me->info && me->info->document)) {
+ return (NO);
+ }
+
+ /*
+ * Mark ourselves busy, so that recursive calls of this function on this
+ * HTParentAnchor0 will not free it from under our feet. - kw
+ */
+ me->underway = TRUE;
+
+ {
+ /*
+ * Delete all outgoing links from named children. Do not delete named
+ * children itself (may have incoming links).
+ */
+ if (me->children) {
+ ele = HTBTree_next(me->children, NULL);
+ while (ele != NULL) {
+ child = (HTChildAnchor *) HTBTree_object(ele);
+ if (child->dest)
+ deleteLinks(child);
+ ele = HTBTree_next(me->children, ele);
+ }
+ }
+ }
+ me->underway = FALSE;
+
+ /*
+ * There are still incoming links to this one (we are the
+ * destination of another anchor).
+ */
+ if (!HTList_isEmpty(&me->sources)) {
+ /*
+ * Can't delete parent, still have sources.
+ */
+ return (NO);
+ }
+
+ /*
+ * No more incoming and outgoing links : kill everything First, delete
+ * named children.
+ */
+ if (me->children) {
+ ele = HTBTree_next(me->children, NULL);
+ while (ele != NULL) {
+ child = (HTChildAnchor *) HTBTree_object(ele);
+ FREE(child->tag);
+ FREE(child);
+ ele = HTBTree_next(me->children, ele);
+ }
+ HTBTree_free(me->children);
+ }
+
+ /*
+ * Delete the ParentAnchor, if any. (Document was already deleted).
+ */
+ if (me->info) {
+ HTParentAnchor_free(me->info);
+ FREE(me->info);
+ }
+
+ /*
+ * Remove ourselves from the hash table's list.
+ */
+ HTList_unlinkObject(&(adult_table[me->adult_hash]), (void *) me);
+
+ /*
+ * Free the address.
+ */
+ FREE(me->address);
+
+ /*
+ * Finally, kill the parent anchor passed in.
+ */
+ FREE(me);
+
+ return (YES);
+}
+
+/*
+ * Unnamed children (children_notag) have no sense without HText - delete them
+ * and their links if we are about to free HText. Document currently exists.
+ * Called within HText_free().
+ */
+void HTAnchor_delete_links(HTParentAnchor *me)
+{
+ HTList *cur;
+ HTChildAnchor *child;
+
+ /*
+ * Do nothing if nothing to do.
+ */
+ if (!me || !me->document) {
+ return;
+ }
+
+ /*
+ * Mark ourselves busy, so that recursive calls on this HTParentAnchor0
+ * will not free it from under our feet. - kw
+ */
+ me->parent->underway = TRUE;
+
+ /*
+ * Delete all outgoing links from unnamed children.
+ */
+ if (!HTList_isEmpty(&me->children_notag)) {
+ cur = &me->children_notag;
+ while ((child =
+ (HTChildAnchor *) HTList_unlinkLastObject(cur)) != 0) {
+ deleteLinks(child);
+ /* child allocated in HText pool, HText_free() will free it later */
+ }
+ }
+ me->parent->underway = FALSE;
+}
+
+static void HTParentAnchor_free(HTParentAnchor *me)
+{
+ /*
+ * Delete the methods list.
+ */
+ if (me->methods) {
+ /*
+ * Leave what the methods point to up in memory for other code (near
+ * static stuff).
+ */
+ HTList_delete(me->methods);
+ me->methods = NULL;
+ }
+
+ /*
+ * Free up all allocated members.
+ */
+ FREE(me->charset);
+ FREE(me->isIndexAction);
+ FREE(me->isIndexPrompt);
+ FREE(me->title);
+ FREE(me->physical);
+ BStrFree(me->post_data);
+ FREE(me->post_content_type);
+ FREE(me->bookmark);
+ FREE(me->owner);
+ FREE(me->RevTitle);
+ FREE(me->citehost);
+#ifdef USE_SOURCE_CACHE
+ HTAnchor_clearSourceCache(me);
+#endif
+ if (me->FileCache) {
+ FILE *fd;
+
+ if ((fd = fopen(me->FileCache, "r")) != NULL) {
+ fclose(fd);
+ (void) remove(me->FileCache);
+ }
+ FREE(me->FileCache);
+ }
+ FREE(me->SugFname);
+ FREE(me->cache_control);
+ HTChunkClear(&(me->http_headers));
+ FREE(me->content_type_params);
+ FREE(me->content_type);
+ FREE(me->content_language);
+ FREE(me->content_encoding);
+ FREE(me->content_base);
+ FREE(me->content_disposition);
+ FREE(me->content_location);
+ FREE(me->content_md5);
+ FREE(me->message_id);
+ FREE(me->subject);
+ FREE(me->date);
+ FREE(me->expires);
+
+ FREE(me->last_modified);
+ FREE(me->ETag);
+ FREE(me->server);
+#ifdef USE_COLOR_STYLE
+ FREE(me->style);
+#endif
+
+ /*
+ * Original code wanted a way to clean out the HTFormat if no longer needed
+ * (ref count?). I'll leave it alone since those HTAtom objects are a
+ * little harder to know where they are being referenced all at one time.
+ * (near static)
+ */
+
+ FREE(me->UCStages);
+ ImageMapList_free(me->imaps);
+}
+
+#ifdef USE_SOURCE_CACHE
+void HTAnchor_clearSourceCache(HTParentAnchor *me)
+{
+ /*
+ * Clean up the source cache, if any.
+ */
+ if (me->source_cache_file) {
+ CTRACE((tfp, "SourceCache: Removing file %s\n",
+ me->source_cache_file));
+ (void) LYRemoveTemp(me->source_cache_file);
+ FREE(me->source_cache_file);
+ }
+ if (me->source_cache_chunk) {
+ CTRACE((tfp, "SourceCache: Removing memory chunk %p\n",
+ (void *) me->source_cache_chunk));
+ HTChunkFree(me->source_cache_chunk);
+ me->source_cache_chunk = NULL;
+ }
+}
+#endif /* USE_SOURCE_CACHE */
+
+/* Data access functions
+ * ---------------------
+ */
+HTParentAnchor *HTAnchor_parent(HTAnchor * me)
+{
+ if (!me)
+ return NULL;
+
+ if (me->parent->info)
+ return me->parent->info;
+
+ /* else: create a new structure */
+ return HTParentAnchor_new(me->parent);
+}
+
+void HTAnchor_setDocument(HTParentAnchor *me,
+ HyperDoc *doc)
+{
+ if (me)
+ me->document = doc;
+}
+
+HyperDoc *HTAnchor_document(HTParentAnchor *me)
+{
+ return (me ? me->document : NULL);
+}
+
+char *HTAnchor_address(HTAnchor * me)
+{
+ char *addr = NULL;
+
+ if (me) {
+ if (((HTParentAnchor0 *) me == me->parent) ||
+ ((HTParentAnchor *) me == me->parent->info) ||
+ !((HTChildAnchor *) me)->tag) { /* it's an adult or no tag */
+ StrAllocCopy(addr, me->parent->address);
+ } else { /* it's a named child */
+ HTSprintf0(&addr, "%s#%s",
+ me->parent->address, ((HTChildAnchor *) me)->tag);
+ }
+ }
+ return (addr);
+}
+
+char *HTAnchor_short_address(HTAnchor * me)
+{
+ const char chop[] = "file://localhost/";
+ char *addr = HTAnchor_address(me);
+
+ if (!strncmp(addr, chop, sizeof(chop) - 1)) {
+ char *a = addr + 7;
+ char *b = addr + sizeof(chop) - 2;
+
+ while ((*a++ = *b++) != '\0') {
+ ;
+ }
+ }
+ return addr;
+}
+
+void HTAnchor_setFormat(HTParentAnchor *me,
+ HTFormat form)
+{
+ if (me)
+ me->format = form;
+}
+
+HTFormat HTAnchor_format(HTParentAnchor *me)
+{
+ return (me ? me->format : NULL);
+}
+
+void HTAnchor_setIndex(HTParentAnchor *me,
+ const char *address)
+{
+ if (me) {
+ me->isIndex = YES;
+ StrAllocCopy(me->isIndexAction, address);
+ }
+}
+
+void HTAnchor_setPrompt(HTParentAnchor *me,
+ const char *prompt)
+{
+ if (me) {
+ StrAllocCopy(me->isIndexPrompt, prompt);
+ }
+}
+
+BOOL HTAnchor_isIndex(HTParentAnchor *me)
+{
+ return (BOOL) (me
+ ? me->isIndex
+ : NO);
+}
+
+/* Whether Anchor has been designated as an ISMAP link
+ * (normally by presence of an ISMAP attribute on A or IMG) - KW
+ */
+BOOL HTAnchor_isISMAPScript(HTAnchor * me)
+{
+ return (BOOL) ((me && me->parent->info)
+ ? me->parent->info->isISMAPScript
+ : NO);
+}
+
+#if defined(USE_COLOR_STYLE)
+/* Style handling.
+*/
+const char *HTAnchor_style(HTParentAnchor *me)
+{
+ return (me ? me->style : NULL);
+}
+
+void HTAnchor_setStyle(HTParentAnchor *me,
+ const char *style)
+{
+ if (me) {
+ StrAllocCopy(me->style, style);
+ }
+}
+#endif
+
+/* Title handling.
+*/
+const char *HTAnchor_title(HTParentAnchor *me)
+{
+ return (me ? me->title : NULL);
+}
+
+void HTAnchor_setTitle(HTParentAnchor *me,
+ const char *title)
+{
+ int i;
+
+ if (me) {
+ if (title) {
+ StrAllocCopy(me->title, title);
+ for (i = 0; me->title[i]; i++) {
+ if (UCH(me->title[i]) == 1 ||
+ UCH(me->title[i]) == 2) {
+ me->title[i] = ' ';
+ }
+ }
+ } else {
+ CTRACE((tfp, "HTAnchor_setTitle: New title is NULL! "));
+ if (me->title) {
+ CTRACE((tfp, "Old title was \"%s\".\n", me->title));
+ FREE(me->title);
+ } else {
+ CTRACE((tfp, "Old title was NULL.\n"));
+ }
+ }
+ }
+}
+
+void HTAnchor_appendTitle(HTParentAnchor *me,
+ const char *title)
+{
+ int i;
+
+ if (me) {
+ StrAllocCat(me->title, title);
+ for (i = 0; me->title[i]; i++) {
+ if (UCH(me->title[i]) == 1 ||
+ UCH(me->title[i]) == 2) {
+ me->title[i] = ' ';
+ }
+ }
+ }
+}
+
+/* Bookmark handling.
+*/
+const char *HTAnchor_bookmark(HTParentAnchor *me)
+{
+ return (me ? me->bookmark : NULL);
+}
+
+void HTAnchor_setBookmark(HTParentAnchor *me,
+ const char *bookmark)
+{
+ if (me)
+ StrAllocCopy(me->bookmark, bookmark);
+}
+
+/* Owner handling.
+*/
+const char *HTAnchor_owner(HTParentAnchor *me)
+{
+ return (me ? me->owner : NULL);
+}
+
+void HTAnchor_setOwner(HTParentAnchor *me,
+ const char *owner)
+{
+ if (me) {
+ StrAllocCopy(me->owner, owner);
+ }
+}
+
+/* TITLE handling in LINKs with REV="made" or REV="owner". - FM
+*/
+const char *HTAnchor_RevTitle(HTParentAnchor *me)
+{
+ return (me ? me->RevTitle : NULL);
+}
+
+void HTAnchor_setRevTitle(HTParentAnchor *me,
+ const char *title)
+{
+ int i;
+
+ if (me) {
+ StrAllocCopy(me->RevTitle, title);
+ for (i = 0; me->RevTitle[i]; i++) {
+ if (UCH(me->RevTitle[i]) == 1 ||
+ UCH(me->RevTitle[i]) == 2) {
+ me->RevTitle[i] = ' ';
+ }
+ }
+ }
+}
+
+#ifndef DISABLE_BIBP
+/* Citehost for bibp links from LINKs with REL="citehost". - RDC
+*/
+const char *HTAnchor_citehost(HTParentAnchor *me)
+{
+ return (me ? me->citehost : NULL);
+}
+
+void HTAnchor_setCitehost(HTParentAnchor *me,
+ const char *citehost)
+{
+ if (me) {
+ StrAllocCopy(me->citehost, citehost);
+ }
+}
+#endif /* !DISABLE_BIBP */
+
+/* Suggested filename handling. - FM
+ * (will be loaded if we had a Content-Disposition
+ * header or META element with filename=name.suffix)
+ */
+const char *HTAnchor_SugFname(HTParentAnchor *me)
+{
+ return (me ? me->SugFname : NULL);
+}
+
+/* HTTP Headers.
+*/
+const char *HTAnchor_http_headers(HTParentAnchor *me)
+{
+ return (me ? me->http_headers.data : NULL);
+}
+
+/* Content-Type handling (parameter list).
+*/
+const char *HTAnchor_content_type_params(HTParentAnchor *me)
+{
+ return (me ? me->content_type_params : NULL);
+}
+
+/* Content-Encoding handling. - FM
+ * (will be loaded if we had a Content-Encoding
+ * header.)
+ */
+const char *HTAnchor_content_encoding(HTParentAnchor *me)
+{
+ return (me ? me->content_encoding : NULL);
+}
+
+/* Content-Type handling. - FM
+*/
+const char *HTAnchor_content_type(HTParentAnchor *me)
+{
+ return (me ? me->content_type : NULL);
+}
+
+/* Last-Modified header handling. - FM
+*/
+const char *HTAnchor_last_modified(HTParentAnchor *me)
+{
+ return (me ? me->last_modified : NULL);
+}
+
+/* Date header handling. - FM
+*/
+const char *HTAnchor_date(HTParentAnchor *me)
+{
+ return (me ? me->date : NULL);
+}
+
+/* Server header handling. - FM
+*/
+const char *HTAnchor_server(HTParentAnchor *me)
+{
+ return (me ? me->server : NULL);
+}
+
+/* Safe header handling. - FM
+*/
+BOOL HTAnchor_safe(HTParentAnchor *me)
+{
+ return (BOOL) (me ? me->safe : FALSE);
+}
+
+/* Content-Base header handling. - FM
+*/
+const char *HTAnchor_content_base(HTParentAnchor *me)
+{
+ return (me ? me->content_base : NULL);
+}
+
+/* Content-Location header handling. - FM
+*/
+const char *HTAnchor_content_location(HTParentAnchor *me)
+{
+ return (me ? me->content_location : NULL);
+}
+
+/* Message-ID, used for mail replies - kw
+*/
+const char *HTAnchor_messageID(HTParentAnchor *me)
+{
+ return (me ? me->message_id : NULL);
+}
+
+BOOL HTAnchor_setMessageID(HTParentAnchor *me,
+ const char *messageid)
+{
+ if (!(me && messageid && *messageid)) {
+ return FALSE;
+ }
+ StrAllocCopy(me->message_id, messageid);
+ return TRUE;
+}
+
+/* Subject, used for mail replies - kw
+*/
+const char *HTAnchor_subject(HTParentAnchor *me)
+{
+ return (me ? me->subject : NULL);
+}
+
+BOOL HTAnchor_setSubject(HTParentAnchor *me,
+ const char *subject)
+{
+ if (!(me && subject && *subject)) {
+ return FALSE;
+ }
+ StrAllocCopy(me->subject, subject);
+ return TRUE;
+}
+
+/* Manipulation of links
+ * ---------------------
+ */
+HTAnchor *HTAnchor_followLink(HTChildAnchor *me)
+{
+ return (me->dest);
+}
+
+HTAnchor *HTAnchor_followTypedLink(HTChildAnchor *me,
+ HTLinkType *type)
+{
+ if (me->type == type)
+ return (me->dest);
+ return (NULL); /* No link of me type */
+}
+
+/* Methods List
+ * ------------
+ */
+HTList *HTAnchor_methods(HTParentAnchor *me)
+{
+ if (!me->methods) {
+ me->methods = HTList_new();
+ }
+ return (me->methods);
+}
+
+/* Protocol
+ * --------
+ */
+void *HTAnchor_protocol(HTParentAnchor *me)
+{
+ return (me->protocol);
+}
+
+void HTAnchor_setProtocol(HTParentAnchor *me,
+ void *protocol)
+{
+ me->protocol = protocol;
+}
+
+/* Physical Address
+ * ----------------
+ */
+char *HTAnchor_physical(HTParentAnchor *me)
+{
+ return (me->physical);
+}
+
+void HTAnchor_setPhysical(HTParentAnchor *me,
+ char *physical)
+{
+ if (me) {
+ StrAllocCopy(me->physical, physical);
+ }
+}
+
+#ifdef DEBUG
+static void show_stages(HTParentAnchor *me, const char *tag, int which_stage)
+{
+ int j;
+
+ CTRACE((tfp, "Stages %s*%s", NonNull(me->charset), tag));
+ for (j = 0; j < UCT_STAGEMAX; j++) {
+ CTRACE((tfp, " "));
+ if (j == which_stage)
+ CTRACE((tfp, "("));
+ CTRACE((tfp, "%d:%d:%s",
+ j,
+ me->UCStages->s[j].LYhndl,
+ NonNull(me->UCStages->s[j].C.MIMEname)));
+ if (j == which_stage)
+ CTRACE((tfp, ")"));
+ }
+ CTRACE((tfp, "\n"));
+}
+#else
+#define show_stages(me,tag,which_stage) /* nothing */
+#endif
+
+/*
+ * We store charset info in the HTParentAnchor object, for several
+ * "stages". (See UCDefs.h)
+ * A stream method is supposed to know what stage in the model it is.
+ *
+ * General model MIME -> parser -> structured -> HText
+ * e.g., text/html
+ * from HTTP: HTMIME.c -> SGML.c -> HTML.c -> GridText.c
+ * text/plain
+ * from file: HTFile.c -> HTPlain.c -> GridText.c
+ *
+ * The lock/set_by is used to lock e.g. a charset set by an explicit
+ * HTTP MIME header against overriding by a HTML META tag - the MIME
+ * header has higher priority. Defaults (from -assume_.. options etc.)
+ * will not override charset explicitly given by server.
+ *
+ * Some advantages of keeping this in the HTAnchor:
+ * - Global variables are bad.
+ * - Can remember a charset given by META tag when toggling to SOURCE view.
+ * - Can remember a charset given by <A CHARSET=...> href in another doc.
+ *
+ * We don't modify the HTParentAnchor's charset element
+ * here, that one will only be set when explicitly given.
+ */
+LYUCcharset *HTAnchor_getUCInfoStage(HTParentAnchor *me,
+ int which_stage)
+{
+ LYUCcharset *result = NULL;
+
+ if (me) {
+ if (!me->UCStages) {
+ int i;
+ int chndl = UCLYhndl_for_unspec; /* always >= 0 */
+ UCAnchorInfo *stages = typecalloc(UCAnchorInfo);
+
+ if (stages == NULL)
+ outofmem(__FILE__, "HTAnchor_getUCInfoStage");
+
+ for (i = 0; i < UCT_STAGEMAX; i++) {
+ stages->s[i].C.MIMEname = "";
+ stages->s[i].LYhndl = -1;
+ }
+ if (me->charset) {
+ chndl = UCGetLYhndl_byMIME(me->charset);
+ if (chndl < 0)
+ chndl = UCLYhndl_for_unrec;
+ if (chndl < 0)
+ /*
+ * UCLYhndl_for_unrec not defined :-(
+ * fallback to UCLYhndl_for_unspec which always valid.
+ */
+ chndl = UCLYhndl_for_unspec; /* always >= 0 */
+ }
+ MemCpy(&stages->s[UCT_STAGE_MIME].C, &LYCharSet_UC[chndl],
+ sizeof(LYUCcharset));
+
+ stages->s[UCT_STAGE_MIME].lock = UCT_SETBY_DEFAULT;
+ stages->s[UCT_STAGE_MIME].LYhndl = chndl;
+ me->UCStages = stages;
+ }
+ result = (&me->UCStages->s[which_stage].C);
+ show_stages(me, "_getUCInfoStage", which_stage);
+ }
+ return (result);
+}
+
+int HTAnchor_getUCLYhndl(HTParentAnchor *me,
+ int which_stage)
+{
+ if (me) {
+ if (!me->UCStages) {
+ /*
+ * This will allocate and initialize, if not yet done.
+ */
+ (void) HTAnchor_getUCInfoStage(me, which_stage);
+ }
+ if (me->UCStages->s[which_stage].lock > UCT_SETBY_NONE) {
+ return (me->UCStages->s[which_stage].LYhndl);
+ }
+ }
+ return (-1);
+}
+
+#ifdef CAN_SWITCH_DISPLAY_CHARSET
+static void setup_switch_display_charset(HTParentAnchor *me, int h)
+{
+ if (!Switch_Display_Charset(h, SWITCH_DISPLAY_CHARSET_MAYBE))
+ return;
+ HTAnchor_setUCInfoStage(me, current_char_set,
+ UCT_STAGE_HTEXT, UCT_SETBY_MIME); /* highest priority! */
+ HTAnchor_setUCInfoStage(me, current_char_set,
+ UCT_STAGE_STRUCTURED, UCT_SETBY_MIME); /* highest priority! */
+ CTRACE((tfp,
+ "changing UCInfoStage: HTEXT/STRUCTURED stages charset='%s'.\n",
+ LYCharSet_UC[current_char_set].MIMEname));
+}
+#endif
+
+LYUCcharset *HTAnchor_setUCInfoStage(HTParentAnchor *me,
+ int LYhndl,
+ int which_stage,
+ int set_by)
+{
+ if (me) {
+ /*
+ * This will allocate and initialize, if not yet done.
+ */
+ LYUCcharset *p = HTAnchor_getUCInfoStage(me, which_stage);
+
+ /*
+ * Can we override?
+ */
+ if (set_by >= me->UCStages->s[which_stage].lock) {
+#ifdef CAN_SWITCH_DISPLAY_CHARSET
+ int ohandle = me->UCStages->s[which_stage].LYhndl;
+#endif
+ me->UCStages->s[which_stage].lock = set_by;
+ me->UCStages->s[which_stage].LYhndl = LYhndl;
+ if (LYhndl >= 0) {
+ MemCpy(p, &LYCharSet_UC[LYhndl], sizeof(LYUCcharset));
+
+#ifdef CAN_SWITCH_DISPLAY_CHARSET
+ /* Allow a switch to a more suitable display charset */
+ if (LYhndl != ohandle && which_stage == UCT_STAGE_PARSER)
+ setup_switch_display_charset(me, LYhndl);
+#endif
+ } else {
+ p->UChndl = -1;
+ }
+ show_stages(me, "_setUCInfoStage", which_stage);
+ return (p);
+ }
+ }
+ return (NULL);
+}
+
+LYUCcharset *HTAnchor_resetUCInfoStage(HTParentAnchor *me,
+ int LYhndl,
+ int which_stage,
+ int set_by)
+{
+ LYUCcharset *result = NULL;
+ int ohandle;
+
+ if (me && me->UCStages) {
+ me->UCStages->s[which_stage].lock = set_by;
+ ohandle = me->UCStages->s[which_stage].LYhndl;
+ me->UCStages->s[which_stage].LYhndl = LYhndl;
+#ifdef CAN_SWITCH_DISPLAY_CHARSET
+ /* Allow a switch to a more suitable display charset */
+ if (LYhndl >= 0 && LYhndl != ohandle
+ && which_stage == UCT_STAGE_PARSER)
+ setup_switch_display_charset(me, LYhndl);
+#else
+ (void) ohandle;
+#endif
+ show_stages(me, "_resetUCInfoStage", which_stage);
+ result = (&me->UCStages->s[which_stage].C);
+ }
+ return result;
+}
+
+/*
+ * A set_by of (-1) means use the lock value from the from_stage.
+ */
+LYUCcharset *HTAnchor_copyUCInfoStage(HTParentAnchor *me,
+ int to_stage,
+ int from_stage,
+ int set_by)
+{
+ if (me) {
+ /*
+ * This will allocate and initialize, if not yet done.
+ */
+ LYUCcharset *p_from = HTAnchor_getUCInfoStage(me, from_stage);
+ LYUCcharset *p_to = HTAnchor_getUCInfoStage(me, to_stage);
+
+ /*
+ * Can we override?
+ */
+ if (set_by == -1)
+ set_by = me->UCStages->s[from_stage].lock;
+ if (set_by == UCT_SETBY_NONE)
+ set_by = UCT_SETBY_DEFAULT;
+ if (set_by >= me->UCStages->s[to_stage].lock) {
+#ifdef CAN_SWITCH_DISPLAY_CHARSET
+ int ohandle = me->UCStages->s[to_stage].LYhndl;
+#endif
+ me->UCStages->s[to_stage].lock = set_by;
+ me->UCStages->s[to_stage].LYhndl =
+ me->UCStages->s[from_stage].LYhndl;
+#ifdef CAN_SWITCH_DISPLAY_CHARSET
+ /* Allow a switch to a more suitable display charset */
+ if (me->UCStages->s[to_stage].LYhndl >= 0
+ && me->UCStages->s[to_stage].LYhndl != ohandle
+ && to_stage == UCT_STAGE_PARSER)
+ setup_switch_display_charset(me,
+ me->UCStages->s[to_stage].LYhndl);
+#endif
+ if (p_to != p_from)
+ MemCpy(p_to, p_from, sizeof(LYUCcharset));
+
+ return (p_to);
+ }
+ }
+ return (NULL);
+}
diff --git a/WWW/Library/Implementation/HTAnchor.h b/WWW/Library/Implementation/HTAnchor.h
new file mode 100644
index 0000000..3b1e6e6
--- /dev/null
+++ b/WWW/Library/Implementation/HTAnchor.h
@@ -0,0 +1,412 @@
+/*
+ * $LynxId: HTAnchor.h,v 1.40 2018/03/11 18:43:50 tom Exp $
+ *
+ * Hypertext "Anchor" Object HTAnchor.h
+ * ==========================
+ *
+ * An anchor represents a region of a hypertext document which is linked
+ * to another anchor in the same or a different document.
+ */
+
+#ifndef HTANCHOR_H
+#define HTANCHOR_H
+
+/* Version 0 (TBL) written in Objective-C for the NeXT browser */
+/* Version 1 of 24-Oct-1991 (JFG), written in C, browser-independent */
+
+#include <HTList.h>
+#include <HTBTree.h>
+#include <HTChunk.h>
+#include <HTAtom.h>
+#include <UCDefs.h>
+
+typedef struct _HyperDoc HyperDoc; /* Ready for forward references */
+typedef struct _HTAnchor HTAnchor;
+typedef struct _HTParentAnchor HTParentAnchor;
+typedef struct _HTParentAnchor0 HTParentAnchor0;
+
+#include <HTFormat.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ struct _HTAnchor {
+ /* Generic anchor */
+ HTParentAnchor0 *parent; /* Parent of this anchor (self for adults) */
+ };
+
+#define HASH_TYPE unsigned short
+
+ struct _HTParentAnchor0 { /* One for adult_table,
+ * generally not used outside HTAnchor.c */
+ /* Common part from the generic anchor structure */
+ HTParentAnchor0 *parent; /* (self) */
+
+ /* ParentAnchor0-specific information */
+ char *address; /* Absolute address of this node */
+ HTParentAnchor *info; /* additional info, allocated on demand */
+
+ HTBTree *children; /* Subanchors <a name="tag">, sorted by tag */
+ HTList sources; /* List of anchors pointing to this, if any */
+
+ HTList _add_adult; /* - just a memory for list entry:) */
+ HASH_TYPE adult_hash; /* adult list number */
+ BOOL underway; /* Document about to be attached to it */
+ };
+
+ /*
+ * Separated from the above to save memory: allocated on demand,
+ * it is nearly 1:1 to HText (well, sometimes without HText...),
+ * available for SGML, HTML, and HText stages.
+ * [being precise, we currently allocate it before HTLoadDocument(),
+ * in HTAnchor_findAddress() and HTAnchor_parent()].
+ */
+ struct _HTParentAnchor {
+ /* Common part from the generic anchor structure */
+ HTParentAnchor0 *parent; /* Parent of this anchor */
+
+ /* ParentAnchor-specific information */
+ HTList children_notag; /* Subanchors <a href=...>, tag is NULL */
+ HyperDoc *document; /* The document within which this is an anchor */
+
+ char *address; /* parent->address, a pointer */
+ bstring *post_data; /* Posting data */
+ char *post_content_type; /* Type of post data */
+ char *bookmark; /* Bookmark filename */
+ HTFormat format; /* Pointer to node format descriptor */
+ char *charset; /* Pointer to character set (kludge, for now */
+ BOOL isIndex; /* Acceptance of a keyword search */
+ char *isIndexAction; /* URL of isIndex server */
+ char *isIndexPrompt; /* Prompt for isIndex query */
+ char *title; /* Title of document */
+ char *owner; /* Owner of document */
+ char *RevTitle; /* TITLE in REV="made" or REV="owner" LINK */
+ char *citehost; /* Citehost from REL="citehost" LINK */
+#ifdef USE_COLOR_STYLE
+ char *style;
+#endif
+
+ HTList *methods; /* Methods available as HTAtoms */
+ void *protocol; /* Protocol object */
+ char *physical; /* Physical address */
+ BOOL isISMAPScript; /* Script for clickable image map */
+ BOOL isHEAD; /* Document is headers from a HEAD request */
+ BOOL safe; /* Safe */
+#ifdef USE_SOURCE_CACHE
+ char *source_cache_file;
+ HTChunk *source_cache_chunk;
+#endif
+ char *FileCache; /* Path to a disk-cached copy (see src/HTFWriter.c) */
+ char *SugFname; /* Suggested filename */
+ char *cache_control; /* Cache-Control */
+ BOOL no_cache; /* Cache-Control, Pragma or META "no-cache"? */
+ BOOL inHEAD; /* HTMIMEConvert is decoding server-headers */
+ BOOL inBASE; /* duplicated from HTStructured (HTML.c/h) */
+ HTChunk http_headers;
+ BOOL no_content_encoding; /* server did not use C-T? */
+ char *content_type_params; /* Content-Type (with parameters if any) */
+ char *content_type; /* Content-Type */
+ char *content_language; /* Content-Language */
+ char *content_encoding; /* Compression algorithm */
+ char *content_base; /* Content-Base */
+ char *content_disposition; /* Content-Disposition */
+ char *content_location; /* Content-Location */
+ char *content_md5; /* Content-MD5 */
+ char *message_id; /* Message-ID */
+ char *subject; /* Subject */
+ off_t header_length; /* length of headers */
+ off_t content_length; /* Content-Length */
+ off_t actual_length; /* actual length may differ */
+ char *date; /* Date */
+ char *expires; /* Expires */
+ char *last_modified; /* Last-Modified */
+ char *ETag; /* ETag (HTTP1.1 cache validator) */
+ char *server; /* Server */
+ UCAnchorInfo *UCStages; /* chartrans stages */
+ HTList *imaps; /* client side image maps */
+ };
+
+ typedef HTAtom HTLinkType;
+
+ typedef struct {
+ /* Common part from the generic anchor structure */
+ HTParentAnchor0 *parent; /* Parent of this anchor */
+
+ /* ChildAnchor-specific information */
+ char *tag; /* #fragment, relative to the parent */
+
+ HTAnchor *dest; /* The anchor to which this leads */
+ HTLinkType *type; /* Semantics of this link */
+
+ HTList _add_children_notag; /* - just a memory for list entry:) */
+ HTList _add_sources; /* - just a memory for list entry:) */
+ } HTChildAnchor;
+
+ /*
+ * DocAddress structure is used for loading an absolute anchor with all
+ * needed information including posting data and post content type.
+ */
+ typedef struct _DocAddress {
+ char *address;
+ bstring *post_data;
+ char *post_content_type;
+ char *bookmark;
+ BOOL isHEAD;
+ BOOL safe;
+ } DocAddress;
+
+ /* "internal" means "within the same document, with certainty". */
+ extern HTLinkType *HTInternalLink;
+
+ /* Create or find a child anchor with a possible link
+ * --------------------------------------------------
+ *
+ * Create new anchor with a given parent and possibly
+ * a name, and possibly a link to a _relatively_ named anchor.
+ * (Code originally in ParseHTML.h)
+ */
+ extern HTChildAnchor *HTAnchor_findChildAndLink(HTParentAnchor *parent, /* May not be 0 */
+ const char *tag, /* May be "" or 0 */
+ const char *href, /* May be "" or 0 */
+ HTLinkType *ltype); /* May be 0 */
+
+ /* Create new or find old parent anchor
+ * ------------------------------------
+ *
+ * This one is for a reference which is found in a document, and might
+ * not be already loaded.
+ * Note: You are not guaranteed a new anchor -- you might get an old one,
+ * like with fonts.
+ */
+ extern HTParentAnchor *HTAnchor_findAddress(const DocAddress *address);
+
+ /* Create new or find old named anchor - simple form
+ * -------------------------------------------------
+ *
+ * Like the previous one, but simpler to use for simple cases.
+ * No post data etc. can be supplied. - kw
+ */
+ extern HTParentAnchor *HTAnchor_findSimpleAddress(const char *url);
+
+ /* Delete an anchor and possibly related things (auto garbage collection)
+ * --------------------------------------------
+ *
+ * The anchor is only deleted if the corresponding document is not loaded.
+ * All outgoing links from children are deleted, and children are
+ * removed from the sources lists of their targets.
+ * We also try to delete the targets whose documents are not loaded.
+ * If this anchor's sources list is empty, we delete it and its children.
+ */
+ extern BOOL HTAnchor_delete(HTParentAnchor0 *me);
+
+ /*
+ * Unnamed children (children_notag) have no sense without HText -
+ * delete them and their links if we are about to free HText.
+ * Document currently exists. Called within HText_free().
+ */
+ extern void HTAnchor_delete_links(HTParentAnchor *me);
+
+#ifdef USE_SOURCE_CACHE
+ extern void HTAnchor_clearSourceCache(HTParentAnchor *me);
+#endif
+
+ /* Data access functions
+ * ---------------------
+ */
+ extern HTParentAnchor *HTAnchor_parent(HTAnchor * me);
+
+ extern void HTAnchor_setDocument(HTParentAnchor *me,
+ HyperDoc *doc);
+
+ extern HyperDoc *HTAnchor_document(HTParentAnchor *me);
+
+ /* Returns the full URI of the anchor, child or parent
+ * as a malloc'd string to be freed by the caller.
+ */
+ extern char *HTAnchor_address(HTAnchor * me);
+
+ extern char *HTAnchor_short_address(HTAnchor * me);
+
+ extern void HTAnchor_setFormat(HTParentAnchor *me,
+ HTFormat form);
+
+ extern HTFormat HTAnchor_format(HTParentAnchor *me);
+
+ extern void HTAnchor_setIndex(HTParentAnchor *me,
+ const char *address);
+
+ extern void HTAnchor_setPrompt(HTParentAnchor *me,
+ const char *prompt);
+
+ extern BOOL HTAnchor_isIndex(HTParentAnchor *me);
+
+ extern BOOL HTAnchor_isISMAPScript(HTAnchor * me);
+
+#if defined(USE_COLOR_STYLE)
+ extern const char *HTAnchor_style(HTParentAnchor *me);
+
+ extern void HTAnchor_setStyle(HTParentAnchor *me,
+ const char *style);
+#endif
+
+ /* Title handling.
+ */
+ extern const char *HTAnchor_title(HTParentAnchor *me);
+
+ extern void HTAnchor_setTitle(HTParentAnchor *me,
+ const char *title);
+
+ extern void HTAnchor_appendTitle(HTParentAnchor *me,
+ const char *title);
+
+ /* Bookmark handling.
+ */
+ extern const char *HTAnchor_bookmark(HTParentAnchor *me);
+
+ extern void HTAnchor_setBookmark(HTParentAnchor *me,
+ const char *bookmark);
+
+ /* Owner handling.
+ */
+ extern const char *HTAnchor_owner(HTParentAnchor *me);
+
+ extern void HTAnchor_setOwner(HTParentAnchor *me,
+ const char *owner);
+
+ /* TITLE handling in LINKs with REV="made" or REV="owner". - FM
+ */
+ extern const char *HTAnchor_RevTitle(HTParentAnchor *me);
+
+ extern void HTAnchor_setRevTitle(HTParentAnchor *me,
+ const char *title);
+
+ /* Citehost for bibp links from LINKs with REL="citehost". - RDC
+ */
+ extern const char *HTAnchor_citehost(HTParentAnchor *me);
+
+ extern void HTAnchor_setCitehost(HTParentAnchor *me,
+ const char *citehost);
+
+ /* Suggested filename handling. - FM
+ * (will be loaded if we had a Content-Disposition
+ * header or META element with filename=name.suffix)
+ */
+ extern const char *HTAnchor_SugFname(HTParentAnchor *me);
+
+ /* HTTP Headers.
+ */
+ extern const char *HTAnchor_http_headers(HTParentAnchor *me);
+
+ /* Content-Type handling (parameter list).
+ */
+ extern const char *HTAnchor_content_type_params(HTParentAnchor *me);
+
+ /* Content-Type handling. - FM
+ */
+ extern const char *HTAnchor_content_type(HTParentAnchor *me);
+
+ /* Content-Encoding handling. - FM
+ * (will be loaded if we had a Content-Encoding
+ * header.)
+ */
+ extern const char *HTAnchor_content_encoding(HTParentAnchor *me);
+
+ /* Last-Modified header handling. - FM
+ */
+ extern const char *HTAnchor_last_modified(HTParentAnchor *me);
+
+ /* Date header handling. - FM
+ */
+ extern const char *HTAnchor_date(HTParentAnchor *me);
+
+ /* Server header handling. - FM
+ */
+ extern const char *HTAnchor_server(HTParentAnchor *me);
+
+ /* Safe header handling. - FM
+ */
+ extern BOOL HTAnchor_safe(HTParentAnchor *me);
+
+ /* Content-Base header handling. - FM
+ */
+ extern const char *HTAnchor_content_base(HTParentAnchor *me);
+
+ /* Content-Location header handling. - FM
+ */
+ extern const char *HTAnchor_content_location(HTParentAnchor *me);
+
+ /* Message-ID, used for mail replies - kw
+ */
+ extern const char *HTAnchor_messageID(HTParentAnchor *me);
+
+ extern BOOL HTAnchor_setMessageID(HTParentAnchor *me,
+ const char *messageid);
+
+ /* Subject, used for mail replies - kw
+ */
+ extern const char *HTAnchor_subject(HTParentAnchor *me);
+
+ extern BOOL HTAnchor_setSubject(HTParentAnchor *me,
+ const char *subject);
+
+ /* Manipulation of links
+ * ---------------------
+ */
+ extern HTAnchor *HTAnchor_followLink(HTChildAnchor *me);
+
+ extern HTAnchor *HTAnchor_followTypedLink(HTChildAnchor *me,
+ HTLinkType *type);
+
+ /* Read and write methods
+ * ----------------------
+ */
+ extern HTList *HTAnchor_methods(HTParentAnchor *me);
+
+ /* Protocol
+ * --------
+ */
+ extern void *HTAnchor_protocol(HTParentAnchor *me);
+
+ extern void HTAnchor_setProtocol(HTParentAnchor *me,
+ void *protocol);
+
+ /* Physical address
+ * ----------------
+ */
+ extern char *HTAnchor_physical(HTParentAnchor *me);
+
+ extern void HTAnchor_setPhysical(HTParentAnchor *me,
+ char *protocol);
+
+ extern LYUCcharset *HTAnchor_getUCInfoStage(HTParentAnchor *me,
+ int which_stage);
+
+ extern int HTAnchor_getUCLYhndl(HTParentAnchor *me,
+ int which_stage);
+
+ extern LYUCcharset *HTAnchor_setUCInfoStage(HTParentAnchor *me,
+ int LYhndl,
+ int which_stage,
+ int set_by);
+
+ extern LYUCcharset *HTAnchor_setUCInfoStage(HTParentAnchor *me,
+ int LYhndl,
+ int which_stage,
+ int set_by);
+
+ extern LYUCcharset *HTAnchor_resetUCInfoStage(HTParentAnchor *me,
+ int LYhndl,
+ int which_stage,
+ int set_by);
+
+ extern LYUCcharset *HTAnchor_copyUCInfoStage(HTParentAnchor *me,
+ int to_stage,
+ int from_stage,
+ int set_by);
+
+ extern void ImageMapList_free(HTList *list);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* HTANCHOR_H */
diff --git a/WWW/Library/Implementation/HTAssoc.c b/WWW/Library/Implementation/HTAssoc.c
new file mode 100644
index 0000000..831b196
--- /dev/null
+++ b/WWW/Library/Implementation/HTAssoc.c
@@ -0,0 +1,82 @@
+/*
+ * $LynxId: HTAssoc.c,v 1.11 2016/11/24 15:29:50 tom Exp $
+ *
+ * MODULE HTAssoc.c
+ * ASSOCIATION LIST FOR STORING NAME-VALUE PAIRS.
+ * NAMES NOT CASE SENSITIVE, AND ONLY COMMON LENGTH
+ * IS CHECKED (allows abbreviations; well, length is
+ * taken from lookup-up name, so if table contains
+ * a shorter abbrev it is not found).
+ * AUTHORS:
+ * AL Ari Luotonen luotonen@dxcern.cern.ch
+ *
+ * HISTORY:
+ *
+ *
+ * BUGS:
+ *
+ *
+ */
+
+#include <HTUtils.h>
+
+#include <HTAssoc.h>
+
+#include <LYLeaks.h>
+
+HTAssocList *HTAssocList_new(void)
+{
+ return HTList_new();
+}
+
+void HTAssocList_delete(HTAssocList *alist)
+{
+ if (alist) {
+ HTAssocList *cur = alist;
+ HTAssoc *assoc;
+
+ while (NULL != (assoc = (HTAssoc *) HTList_nextObject(cur))) {
+ FREE(assoc->name);
+ FREE(assoc->value);
+ FREE(assoc);
+ }
+ HTList_delete(alist);
+ alist = NULL;
+ }
+}
+
+void HTAssocList_add(HTAssocList *alist,
+ const char *name,
+ const char *value)
+{
+ HTAssoc *assoc;
+
+ if (alist) {
+ if (!(assoc = (HTAssoc *) malloc(sizeof(HTAssoc))))
+ outofmem(__FILE__, "HTAssoc_add");
+
+ assoc->name = NULL;
+ assoc->value = NULL;
+
+ if (name)
+ StrAllocCopy(assoc->name, name);
+ if (value)
+ StrAllocCopy(assoc->value, value);
+ HTList_addObject(alist, (void *) assoc);
+ } else {
+ CTRACE((tfp, "HTAssoc_add: ERROR: assoc list NULL!!\n"));
+ }
+}
+
+char *HTAssocList_lookup(HTAssocList *alist,
+ const char *name)
+{
+ HTAssocList *cur = alist;
+ HTAssoc *assoc;
+
+ while (NULL != (assoc = (HTAssoc *) HTList_nextObject(cur))) {
+ if (!strncasecomp(assoc->name, name, (int) strlen(name)))
+ return assoc->value;
+ }
+ return NULL;
+}
diff --git a/WWW/Library/Implementation/HTAssoc.h b/WWW/Library/Implementation/HTAssoc.h
new file mode 100644
index 0000000..327809c
--- /dev/null
+++ b/WWW/Library/Implementation/HTAssoc.h
@@ -0,0 +1,35 @@
+/* ASSOCIATION LIST FOR STORING NAME-VALUE PAIRS
+
+ Lookups from association list are not case-sensitive.
+
+ */
+
+#ifndef HTASSOC_H
+#define HTASSOC_H
+
+#include <HTList.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ typedef HTList HTAssocList;
+
+ typedef struct {
+ char *name;
+ char *value;
+ } HTAssoc;
+
+ extern HTAssocList *HTAssocList_new(void);
+ extern void HTAssocList_delete(HTAssocList *alist);
+
+ extern void HTAssocList_add(HTAssocList *alist,
+ const char *name,
+ const char *value);
+
+ extern char *HTAssocList_lookup(HTAssocList *alist,
+ const char *name);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* not HTASSOC_H */
diff --git a/WWW/Library/Implementation/HTAtom.c b/WWW/Library/Implementation/HTAtom.c
new file mode 100644
index 0000000..07eca77
--- /dev/null
+++ b/WWW/Library/Implementation/HTAtom.c
@@ -0,0 +1,107 @@
+/*
+ * $LynxId: HTAtom.c,v 1.22 2018/03/06 09:46:58 tom Exp $
+ *
+ * Atoms: Names to numbers HTAtom.c
+ * =======================
+ *
+ * Atoms are names which are given representative pointer values
+ * so that they can be stored more efficiently, and comparisons
+ * for equality done more efficiently.
+ *
+ * Atoms are kept in a hash table consisting of an array of linked lists.
+ *
+ * Authors:
+ * TBL Tim Berners-Lee, WorldWideWeb project, CERN
+ * (c) Copyright CERN 1991 - See Copyright.html
+ *
+ */
+
+#include <HTUtils.h>
+#include <HTAtom.h>
+#include <HTList.h>
+#include <LYexit.h>
+#include <LYLeaks.h>
+
+#define HASH_SIZE 101 /* Arbitrary prime. Memory/speed tradeoff */
+
+static HTAtom *hash_table[HASH_SIZE];
+static BOOL initialised = NO;
+
+/*
+ * To free off all atoms.
+ */
+#ifdef LY_FIND_LEAKS
+static void free_atoms(void);
+#endif
+
+#define HASH_FUNCTION(cp_hash) ((strlen(cp_hash) * UCH(*cp_hash)) % HASH_SIZE)
+
+HTAtom *HTAtom_for(const char *string)
+{
+ size_t hash;
+ HTAtom *a;
+
+ if (!initialised) {
+ memset(hash_table, 0, sizeof(hash_table));
+ initialised = YES;
+#ifdef LY_FIND_LEAKS
+ atexit(free_atoms);
+#endif
+ }
+
+ hash = HASH_FUNCTION(string);
+
+ for (a = hash_table[hash]; a; a = a->next) {
+ if (0 == strcasecomp(a->name, string)) {
+ return a;
+ }
+ }
+
+ a = (HTAtom *) malloc(sizeof(*a));
+ if (a == NULL)
+ outofmem(__FILE__, "HTAtom_for");
+
+ a->name = (char *) malloc(strlen(string) + 1);
+ if (a->name == NULL)
+ outofmem(__FILE__, "HTAtom_for");
+
+ strcpy(a->name, string);
+ a->next = hash_table[hash];
+ hash_table[hash] = a;
+ return a;
+}
+
+#ifdef LY_FIND_LEAKS
+/*
+ * Purpose: Free off all atoms.
+ * Arguments: void
+ * Return Value: void
+ * Remarks/Portability/Dependencies/Restrictions:
+ * To be used at program exit.
+ * Revision History:
+ * 05-29-94 created Lynx 2-3-1 Garrett Arch Blythe
+ */
+static void free_atoms(void)
+{
+ auto int i_counter;
+ HTAtom *HTAp_freeme;
+
+ /*
+ * Loop through all lists of atoms.
+ */
+ for (i_counter = 0; i_counter < HASH_SIZE; i_counter++) {
+ /*
+ * Loop through the list.
+ */
+ while (hash_table[i_counter] != NULL) {
+ /*
+ * Free off atoms and any members.
+ */
+ HTAp_freeme = hash_table[i_counter];
+ hash_table[i_counter] = HTAp_freeme->next;
+ FREE(HTAp_freeme->name);
+ FREE(HTAp_freeme);
+ }
+ }
+}
+#endif /* LY_FIND_LEAKS */
diff --git a/WWW/Library/Implementation/HTAtom.h b/WWW/Library/Implementation/HTAtom.h
new file mode 100644
index 0000000..0d787bc
--- /dev/null
+++ b/WWW/Library/Implementation/HTAtom.h
@@ -0,0 +1,53 @@
+/* */
+
+/* Atoms: Names to numbers HTAtom.h
+ * =======================
+ *
+ * Atoms are names which are given representative pointer values
+ * so that they can be stored more efficiently, and compaisons
+ * for equality done more efficiently.
+ *
+ * HTAtom_for(string) returns a representative value such that it
+ * will always (within one run of the program) return the same
+ * value for the same given string.
+ *
+ * Authors:
+ * TBL Tim Berners-Lee, WorldWideWeb project, CERN
+ *
+ * (c) Copyright CERN 1991 - See Copyright.html
+ *
+ */
+
+#ifndef HTATOM_H
+#define HTATOM_H
+
+#include <HTList.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ typedef struct _HTAtom HTAtom;
+
+ struct _HTAtom {
+ HTAtom *next;
+ char *name;
+ }; /* struct _HTAtom */
+
+ extern HTAtom *HTAtom_for(const char *string);
+
+#define HTAtom_name(a) ((a)->name)
+
+/*
+
+The HTFormat type
+
+ We use the HTAtom object for holding representations. This allows faster manipulation
+ (comparison and copying) that if we stayed with strings.
+
+ */
+ typedef HTAtom *HTFormat;
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* HTATOM_H */
diff --git a/WWW/Library/Implementation/HTBTree.c b/WWW/Library/Implementation/HTBTree.c
new file mode 100644
index 0000000..f595bae
--- /dev/null
+++ b/WWW/Library/Implementation/HTBTree.c
@@ -0,0 +1,680 @@
+/* Binary Tree for sorting things
+ * ==============================
+ * Author: Arthur Secret
+ *
+ * 4 March 94: Bug fixed in the balancing procedure
+ *
+ */
+
+#include <HTUtils.h>
+#include <HTBTree.h>
+
+#define MAXIMUM(a,b) ((a)>(b)?(a):(b))
+
+#include <LYLeaks.h>
+
+/*********************************************************
+ * This function returns an HTBTree with memory allocated
+ * for it when given a mean to compare things
+ */
+HTBTree *HTBTree_new(HTComparer comp)
+{
+ HTBTree *tree = typeMalloc(HTBTree);
+
+ if (tree == NULL)
+ outofmem(__FILE__, "HTBTree_new");
+
+ tree->compare = comp;
+ tree->top = NULL;
+
+ return tree;
+}
+
+/*********************************************************
+ * This void will free the memory allocated for one element
+ */
+static void HTBTElement_free(HTBTElement *element)
+{
+ if (element) {
+ if (element->left != NULL)
+ HTBTElement_free(element->left);
+ if (element->right != NULL)
+ HTBTElement_free(element->right);
+ FREE(element);
+ }
+}
+
+/*************************************************************
+ * This void will free the memory allocated for the whole tree
+ */
+void HTBTree_free(HTBTree *tree)
+{
+ HTBTElement_free(tree->top);
+ FREE(tree);
+}
+
+/*********************************************************
+ * This void will free the memory allocated for one element
+ */
+static void HTBTElementAndObject_free(HTBTElement *element)
+{
+ if (element) { /* Just in case nothing was in the tree anyway */
+ if (element->left != NULL)
+ HTBTElementAndObject_free(element->left);
+ if (element->right != NULL)
+ HTBTElementAndObject_free(element->right);
+ FREE(element->object);
+ FREE(element);
+ }
+}
+
+/*************************************************************
+ * This void will free the memory allocated for the whole tree
+ */
+void HTBTreeAndObject_free(HTBTree *tree)
+{
+ HTBTElementAndObject_free(tree->top);
+ FREE(tree);
+}
+
+/*********************************************************************
+ * Returns a pointer to equivalent object in a tree or NULL if none.
+ */
+void *HTBTree_search(HTBTree *tree,
+ void *object)
+{
+ HTBTElement *cur = tree->top;
+ int res;
+
+ while (cur != NULL) {
+ res = tree->compare(object, cur->object);
+
+ if (res == 0)
+ return cur->object;
+ else if (res < 0)
+ cur = cur->left;
+ else if (res > 0)
+ cur = cur->right;
+ }
+ return NULL;
+}
+
+/*********************************************************************
+ * This void is the core of HTBTree.c . It will
+ * 1/ add a new element to the tree at the right place
+ * so that the tree remains sorted
+ * 2/ balance the tree to be as fast as possible when reading it
+ */
+void HTBTree_add(HTBTree *tree,
+ void *object)
+{
+ HTBTElement *father_of_element;
+ HTBTElement *added_element;
+ HTBTElement *forefather_of_element;
+ HTBTElement *father_of_forefather;
+ BOOL father_found, top_found;
+ int depth, depth2, corrections;
+
+ /* father_of_element is a pointer to the structure that is the father of
+ * the new object "object". added_element is a pointer to the structure
+ * that contains or will contain the new object "object".
+ * father_of_forefather and forefather_of_element are pointers that are
+ * used to modify the depths of upper elements, when needed.
+ *
+ * father_found indicates by a value NO when the future father of "object"
+ * is found. top_found indicates by a value NO when, in case of a
+ * difference of depths < 2, the top of the tree is encountered and forbids
+ * any further try to balance the tree. corrections is an integer used to
+ * avoid infinite loops in cases such as:
+ *
+ * 3 3
+ * 4 4
+ * 5 5
+ *
+ * 3 is used here to show that it need not be the top of the tree.
+ */
+
+ /*
+ * 1/ Adding of the element to the binary tree
+ */
+
+ if (tree->top == NULL) {
+ tree->top = typeMalloc(HTBTElement);
+
+ if (tree->top == NULL)
+ outofmem(__FILE__, "HTBTree_add");
+
+ tree->top->up = NULL;
+ tree->top->object = object;
+ tree->top->left = NULL;
+ tree->top->left_depth = 0;
+ tree->top->right = NULL;
+ tree->top->right_depth = 0;
+ } else {
+ father_found = YES;
+ father_of_element = tree->top;
+ added_element = NULL;
+ father_of_forefather = NULL;
+ forefather_of_element = NULL;
+ while (father_found) {
+ int res = tree->compare(object, father_of_element->object);
+
+ if (res < 0) {
+ if (father_of_element->left != NULL)
+ father_of_element = father_of_element->left;
+ else {
+ father_found = NO;
+ father_of_element->left = typeMalloc(HTBTElement);
+
+ if (father_of_element->left == NULL)
+ outofmem(__FILE__, "HTBTree_add");
+
+ added_element = father_of_element->left;
+ added_element->up = father_of_element;
+ added_element->object = object;
+ added_element->left = NULL;
+ added_element->left_depth = 0;
+ added_element->right = NULL;
+ added_element->right_depth = 0;
+ }
+ } else { /* res >= 0 */
+ if (father_of_element->right != NULL) {
+ father_of_element = father_of_element->right;
+ } else {
+ father_found = NO;
+ father_of_element->right = typeMalloc(HTBTElement);
+
+ if (father_of_element->right == NULL)
+ outofmem(__FILE__, "HTBTree_add");
+
+ added_element = father_of_element->right;
+ added_element->up = father_of_element;
+ added_element->object = object;
+ added_element->left = NULL;
+ added_element->left_depth = 0;
+ added_element->right = NULL;
+ added_element->right_depth = 0;
+ }
+ }
+ }
+
+ /*
+ * Changing of all depths that need to be changed
+ */
+ father_of_forefather = father_of_element;
+ forefather_of_element = added_element;
+ do {
+ if (father_of_forefather->left == forefather_of_element) {
+ depth = father_of_forefather->left_depth;
+ father_of_forefather->left_depth = 1
+ + MAXIMUM(forefather_of_element->right_depth,
+ forefather_of_element->left_depth);
+ depth2 = father_of_forefather->left_depth;
+ } else {
+ depth = father_of_forefather->right_depth;
+ father_of_forefather->right_depth = 1
+ + MAXIMUM(forefather_of_element->right_depth,
+ forefather_of_element->left_depth);
+ depth2 = father_of_forefather->right_depth;
+ }
+ forefather_of_element = father_of_forefather;
+ father_of_forefather = father_of_forefather->up;
+ } while ((depth != depth2) && (father_of_forefather != NULL));
+
+ /*
+ * 2/ Balancing the binary tree, if necessary
+ */
+ top_found = YES;
+ corrections = 0;
+ while ((top_found) && (corrections < 7)) {
+ if ((abs(father_of_element->left_depth
+ - father_of_element->right_depth)) < 2) {
+ if (father_of_element->up != NULL)
+ father_of_element = father_of_element->up;
+ else
+ top_found = NO;
+ } else { /* We start the process of balancing */
+
+ corrections = corrections + 1;
+ /*
+ * corrections is an integer used to avoid infinite
+ * loops in cases such as:
+ *
+ * 3 3
+ * 4 4
+ * 5 5
+ *
+ * 3 is used to show that it need not be the top of the tree
+ * But let's avoid these two exceptions anyhow
+ * with the two following conditions (4 March 94 - AS)
+ */
+
+ if (father_of_element->left == NULL) {
+ if ((father_of_element->right != NULL)
+ && (father_of_element->right->right == NULL)
+ && (father_of_element->right->left != NULL)
+ && (father_of_element->right->left->left == NULL)
+ && (father_of_element->right->left->right == NULL)) {
+ corrections = 7;
+ }
+ } else {
+ if ((father_of_element->right == NULL)
+ && (father_of_element->left->left == NULL)
+ && (father_of_element->left->right != NULL)
+ && (father_of_element->left->right->right == NULL)
+ && (father_of_element->left->right->left == NULL)) {
+ corrections = 7;
+ }
+ }
+
+ if ((father_of_element->left != NULL)
+ && (father_of_element->left_depth > father_of_element->right_depth)) {
+ added_element = father_of_element->left;
+ father_of_element->left_depth = added_element->right_depth;
+ added_element->right_depth = 1
+ + MAXIMUM(father_of_element->right_depth,
+ father_of_element->left_depth);
+ if (father_of_element->up != NULL) {
+ /* Bug fixed in March 94 - AS */
+ BOOL first_time;
+
+ father_of_forefather = father_of_element->up;
+ forefather_of_element = added_element;
+ first_time = YES;
+ do {
+ if (father_of_forefather->left
+ == forefather_of_element->up) {
+ depth = father_of_forefather->left_depth;
+ if (first_time) {
+ father_of_forefather->left_depth = 1
+ + MAXIMUM(forefather_of_element->left_depth,
+ forefather_of_element->right_depth);
+ first_time = NO;
+ } else
+ father_of_forefather->left_depth = 1
+ + MAXIMUM(forefather_of_element->up->left_depth,
+ forefather_of_element->up->right_depth);
+
+ depth2 = father_of_forefather->left_depth;
+ } else {
+ depth = father_of_forefather->right_depth;
+ if (first_time) {
+ father_of_forefather->right_depth = 1
+ + MAXIMUM(forefather_of_element->left_depth,
+ forefather_of_element->right_depth);
+ first_time = NO;
+ } else
+ father_of_forefather->right_depth = 1
+ + MAXIMUM(forefather_of_element->up->left_depth,
+ forefather_of_element->up->right_depth);
+ depth2 = father_of_forefather->right_depth;
+ }
+ forefather_of_element = forefather_of_element->up;
+ father_of_forefather = father_of_forefather->up;
+ } while ((depth != depth2) &&
+ (father_of_forefather != NULL));
+ father_of_forefather = father_of_element->up;
+ if (father_of_forefather->left == father_of_element) {
+ /*
+ * 3 3
+ * 4 5
+ * When tree 5 6 becomes 7 4
+ * 7 8 8 6
+ *
+ * 3 is used to show that it may not be the top of the
+ * tree.
+ */
+ father_of_forefather->left = added_element;
+ father_of_element->left = added_element->right;
+ added_element->right = father_of_element;
+ }
+ if (father_of_forefather->right == father_of_element) {
+ /*
+ * 3 3
+ * 4 5
+ * When tree 5 6 becomes 7 4
+ * 7 8 8 6
+ *
+ * 3 is used to show that it may not be the top of the
+ * tree
+ */
+ father_of_forefather->right = added_element;
+ father_of_element->left = added_element->right;
+ added_element->right = father_of_element;
+ }
+ added_element->up = father_of_forefather;
+ } else {
+ /*
+
+ * 1 2
+ * When tree 2 3 becomes 4 1
+ * 4 5 5 3
+ *
+ * 1 is used to show that it is the top of the tree
+ */
+ added_element->up = NULL;
+ father_of_element->left = added_element->right;
+ added_element->right = father_of_element;
+ }
+ father_of_element->up = added_element;
+ if (father_of_element->left != NULL)
+ father_of_element->left->up = father_of_element;
+ } else if (father_of_element->right != NULL) {
+ added_element = father_of_element->right;
+ father_of_element->right_depth = added_element->left_depth;
+ added_element->left_depth = 1 +
+ MAXIMUM(father_of_element->right_depth,
+ father_of_element->left_depth);
+ if (father_of_element->up != NULL)
+ /* Bug fixed in March 94 - AS */
+ {
+ BOOL first_time;
+
+ father_of_forefather = father_of_element->up;
+ forefather_of_element = added_element;
+ first_time = YES;
+ do {
+ if (father_of_forefather->left
+ == forefather_of_element->up) {
+ depth = father_of_forefather->left_depth;
+ if (first_time) {
+ father_of_forefather->left_depth = 1
+ + MAXIMUM(forefather_of_element->left_depth,
+ forefather_of_element->right_depth);
+ first_time = NO;
+ } else
+ father_of_forefather->left_depth = 1
+ + MAXIMUM(forefather_of_element->up->left_depth,
+ forefather_of_element->up->right_depth);
+ depth2 = father_of_forefather->left_depth;
+ } else {
+ depth = father_of_forefather->right_depth;
+ if (first_time) {
+ father_of_forefather->right_depth = 1
+ + MAXIMUM(forefather_of_element->left_depth,
+ forefather_of_element->right_depth);
+ first_time = NO;
+ } else
+ father_of_forefather->right_depth = 1
+ + MAXIMUM(forefather_of_element->up->left_depth,
+ forefather_of_element->up->right_depth);
+ depth2 = father_of_forefather->right_depth;
+ }
+ father_of_forefather = father_of_forefather->up;
+ forefather_of_element = forefather_of_element->up;
+ } while ((depth != depth2) &&
+ (father_of_forefather != NULL));
+ father_of_forefather = father_of_element->up;
+ if (father_of_forefather->left == father_of_element) {
+ /*
+ * 3 3
+ * 4 6
+ * When tree 5 6 becomes 4 8
+ * 7 8 5 7
+ *
+ * 3 is used to show that it may not be the top of the
+ * tree.
+ */
+ father_of_forefather->left = added_element;
+ father_of_element->right = added_element->left;
+ added_element->left = father_of_element;
+ }
+ if (father_of_forefather->right == father_of_element) {
+ /*
+ * 3 3
+ * 4 6
+ * When tree 5 6 becomes 4 8
+ * 7 8 5 7
+ *
+ * 3 is used to show that it may not be the top of the
+ * tree
+ */
+ father_of_forefather->right = added_element;
+ father_of_element->right = added_element->left;
+ added_element->left = father_of_element;
+ }
+ added_element->up = father_of_forefather;
+ } else {
+ /*
+
+ * 1 3
+ * When tree 2 3 becomes 1 5
+ * 4 5 2 4
+ *
+ * 1 is used to show that it is the top of the tree.
+ */
+ added_element->up = NULL;
+ father_of_element->right = added_element->left;
+ added_element->left = father_of_element;
+ }
+ father_of_element->up = added_element;
+ if (father_of_element->right != NULL)
+ father_of_element->right->up = father_of_element;
+ }
+ }
+ }
+ while (father_of_element->up != NULL) {
+ father_of_element = father_of_element->up;
+ }
+ tree->top = father_of_element;
+ }
+}
+
+/*************************************************************************
+ * this function returns a pointer to the leftmost element if ele is NULL,
+ * and to the next object to the right otherwise.
+ * If no elements left, returns a pointer to NULL.
+ */
+HTBTElement *HTBTree_next(HTBTree *tree,
+ HTBTElement *ele)
+{
+ HTBTElement *father_of_element;
+ HTBTElement *father_of_forefather;
+
+ if (ele == NULL) {
+ father_of_element = tree->top;
+ if (father_of_element != NULL)
+ while (father_of_element->left != NULL)
+ father_of_element = father_of_element->left;
+ } else {
+ father_of_element = ele;
+ if (father_of_element->right != NULL) {
+ father_of_element = father_of_element->right;
+ while (father_of_element->left != NULL)
+ father_of_element = father_of_element->left;
+ } else {
+ father_of_forefather = father_of_element->up;
+ while (father_of_forefather &&
+ (father_of_forefather->right == father_of_element)) {
+ father_of_element = father_of_forefather;
+ father_of_forefather = father_of_element->up;
+ }
+ father_of_element = father_of_forefather;
+ }
+ }
+#ifdef BTREE_TRACE
+ /* The option -DBTREE_TRACE will give much more information
+ * about the way the process is running, for debugging matters
+ */
+ if (father_of_element != NULL) {
+ printf("\nObject = %s\t", (char *) father_of_element->object);
+ if (father_of_element->up != NULL)
+ printf("Objet du pere = %s\n",
+ (char *) father_of_element->up->object);
+ else
+ printf("Pas de Pere\n");
+ if (father_of_element->left != NULL)
+ printf("Objet du fils gauche = %s\t",
+ (char *) father_of_element->left->object);
+ else
+ printf("Pas de fils gauche\t");
+ if (father_of_element->right != NULL)
+ printf("Objet du fils droit = %s\n",
+ (char *) father_of_element->right->object);
+ else
+ printf("Pas de fils droit\n");
+ printf("Profondeur gauche = %d\t", father_of_element->left_depth);
+ printf("Profondeur droite = %d\n", father_of_element->right_depth);
+ printf(" **************\n");
+ }
+#endif
+ return father_of_element;
+}
+
+#ifdef TEST
+/*****************************************************
+ * This is just a test to show how to handle HTBTree.c
+ */
+main()
+{
+ HTBTree *tree;
+ HTBTElement *next_element;
+
+ tree = HTBTree_new((HTComparer) strcasecomp);
+ HTBTree_add(tree, "hypertext");
+ HTBTree_add(tree, "Addressing");
+ HTBTree_add(tree, "X11");
+ HTBTree_add(tree, "Tools");
+ HTBTree_add(tree, "Proposal.wn");
+ HTBTree_add(tree, "Protocols");
+ HTBTree_add(tree, "NeXT");
+ HTBTree_add(tree, "Daemon");
+ HTBTree_add(tree, "Test");
+ HTBTree_add(tree, "Administration");
+ HTBTree_add(tree, "LineMode");
+ HTBTree_add(tree, "DesignIssues");
+ HTBTree_add(tree, "MarkUp");
+ HTBTree_add(tree, "Macintosh");
+ HTBTree_add(tree, "Proposal.rtf.wn");
+ HTBTree_add(tree, "FIND");
+ HTBTree_add(tree, "Paper");
+ HTBTree_add(tree, "Tcl");
+ HTBTree_add(tree, "Talks");
+ HTBTree_add(tree, "Architecture");
+ HTBTree_add(tree, "VMSHelp");
+ HTBTree_add(tree, "Provider");
+ HTBTree_add(tree, "Archive");
+ HTBTree_add(tree, "SLAC");
+ HTBTree_add(tree, "Project");
+ HTBTree_add(tree, "News");
+ HTBTree_add(tree, "Viola");
+ HTBTree_add(tree, "Users");
+ HTBTree_add(tree, "FAQ");
+ HTBTree_add(tree, "WorkingNotes");
+ HTBTree_add(tree, "Windows");
+ HTBTree_add(tree, "FineWWW");
+ HTBTree_add(tree, "Frame");
+ HTBTree_add(tree, "XMosaic");
+ HTBTree_add(tree, "People");
+ HTBTree_add(tree, "All");
+ HTBTree_add(tree, "Curses");
+ HTBTree_add(tree, "Erwise");
+ HTBTree_add(tree, "Carl");
+ HTBTree_add(tree, "MidasWWW");
+ HTBTree_add(tree, "XPM");
+ HTBTree_add(tree, "MailRobot");
+ HTBTree_add(tree, "Illustrations");
+ HTBTree_add(tree, "VMClient");
+ HTBTree_add(tree, "XPA");
+ HTBTree_add(tree, "Clients.html");
+ HTBTree_add(tree, "Library");
+ HTBTree_add(tree, "CERNLIB_Distribution");
+ HTBTree_add(tree, "libHTML");
+ HTBTree_add(tree, "WindowsPC");
+ HTBTree_add(tree, "tkWWW");
+ HTBTree_add(tree, "tk2.3");
+ HTBTree_add(tree, "CVS-RCS");
+ HTBTree_add(tree, "DecnetSockets");
+ HTBTree_add(tree, "SGMLStream");
+ HTBTree_add(tree, "NextStep");
+ HTBTree_add(tree, "CVSRepository_old");
+ HTBTree_add(tree, "ArthurSecret");
+ HTBTree_add(tree, "CVSROOT");
+ HTBTree_add(tree, "HytelnetGate");
+ HTBTree_add(tree, "cern.www.new.src");
+ HTBTree_add(tree, "Conditions");
+ HTBTree_add(tree, "HTMLGate");
+ HTBTree_add(tree, "Makefile");
+ HTBTree_add(tree, "Newsgroups.html");
+ HTBTree_add(tree, "People.html");
+ HTBTree_add(tree, "Bugs.html");
+ HTBTree_add(tree, "Summary.html");
+ HTBTree_add(tree, "zDesignIssues.wn");
+ HTBTree_add(tree, "HT.draw");
+ HTBTree_add(tree, "HTandCERN.wn");
+ HTBTree_add(tree, "Ideas.wn");
+ HTBTree_add(tree, "MarkUp.wn");
+ HTBTree_add(tree, "Proposal.html");
+ HTBTree_add(tree, "SearchPanel.draw");
+ HTBTree_add(tree, "Comments.wn");
+ HTBTree_add(tree, "Xanadu.html");
+ HTBTree_add(tree, "Storinglinks.html");
+ HTBTree_add(tree, "TheW3Book.html");
+ HTBTree_add(tree, "Talk_Feb-91.html");
+ HTBTree_add(tree, "JFosterEntry.txt");
+ HTBTree_add(tree, "Summary.txt");
+ HTBTree_add(tree, "Bibliography.html");
+ HTBTree_add(tree, "HTandCern.txt");
+ HTBTree_add(tree, "Talk.draw");
+ HTBTree_add(tree, "zDesignNotes.html");
+ HTBTree_add(tree, "Link.html");
+ HTBTree_add(tree, "Status.html");
+ HTBTree_add(tree, "http.txt");
+ HTBTree_add(tree, "People.html~");
+ HTBTree_add(tree, "TAGS");
+ HTBTree_add(tree, "summary.txt");
+ HTBTree_add(tree, "Technical.html");
+ HTBTree_add(tree, "Terms.html");
+ HTBTree_add(tree, "JANETAccess.html");
+ HTBTree_add(tree, "People.txt");
+ HTBTree_add(tree, "README.txt");
+ HTBTree_add(tree, "CodingStandards.html");
+ HTBTree_add(tree, "Copyright.txt");
+ HTBTree_add(tree, "Status_old.html");
+ HTBTree_add(tree, "patches~");
+ HTBTree_add(tree, "RelatedProducts.html");
+ HTBTree_add(tree, "Implementation");
+ HTBTree_add(tree, "History.html");
+ HTBTree_add(tree, "Makefile.bak");
+ HTBTree_add(tree, "Makefile.old");
+ HTBTree_add(tree, "Policy.html");
+ HTBTree_add(tree, "WhatIs.html");
+ HTBTree_add(tree, "TheProject.html");
+ HTBTree_add(tree, "Notation.html");
+ HTBTree_add(tree, "Helping.html");
+ HTBTree_add(tree, "Cyber-WWW.sit.Hqx");
+ HTBTree_add(tree, "Glossary.html");
+ HTBTree_add(tree, "maketags.html");
+ HTBTree_add(tree, "IntroCS.html");
+ HTBTree_add(tree, "Contrib");
+ HTBTree_add(tree, "Help.html");
+ HTBTree_add(tree, "CodeManagExec");
+ HTBTree_add(tree, "HT-0.1draz");
+ HTBTree_add(tree, "Cello");
+ HTBTree_add(tree, "TOPUB");
+ HTBTree_add(tree, "BUILD");
+ HTBTree_add(tree, "BUILDALL");
+ HTBTree_add(tree, "Lynx");
+ HTBTree_add(tree, "ArthurLibrary");
+ HTBTree_add(tree, "RashtyClient");
+ HTBTree_add(tree, "#History.html#");
+ HTBTree_add(tree, "PerlServers");
+ HTBTree_add(tree, "modules");
+ HTBTree_add(tree, "NCSA_httpd");
+ HTBTree_add(tree, "MAIL2HTML");
+ HTBTree_add(tree, "core");
+ HTBTree_add(tree, "EmacsWWW");
+#ifdef BTREE_TRACE
+ printf("\nTreeTopObject=%s\n\n", tree->top->object);
+#endif
+ next_element = HTBTree_next(tree, NULL);
+ while (next_element != NULL) {
+#ifndef BTREE_TRACE
+ printf("The next element is %s\n", next_element->object);
+#endif
+ next_element = HTBTree_next(tree, next_element);
+ }
+ HTBTree_free(tree);
+}
+
+#endif
diff --git a/WWW/Library/Implementation/HTBTree.h b/WWW/Library/Implementation/HTBTree.h
new file mode 100644
index 0000000..a4f78f9
--- /dev/null
+++ b/WWW/Library/Implementation/HTBTree.h
@@ -0,0 +1,104 @@
+/* /Net/dxcern/userd/timbl/hypertext/WWW/Library/Implementation/HTBTree.html
+ BALANCED BINARY TREE FOR SORTING THINGS
+
+ Tree creation, traversal and freeing. User-supplied comparison routine.
+
+ Author: Arthur Secret, CERN. Public domain. Please mail bugs and changes to
+ www-request@info.cern.ch
+
+ part of libWWW
+
+ */
+#ifndef HTBTREE_H
+#define HTBTREE_H 1
+
+#ifndef HTUTILS_H
+#include <HTUtils.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+
+Data structures
+
+ */ typedef struct _HTBTree_element {
+ void *object; /* User object */
+ struct _HTBTree_element *up;
+ struct _HTBTree_element *left;
+ int left_depth;
+ struct _HTBTree_element *right;
+ int right_depth;
+ } HTBTElement;
+
+ typedef int (*HTComparer) (void *a, void *b);
+
+ typedef struct _HTBTree_top {
+ HTComparer compare;
+ struct _HTBTree_element *top;
+ } HTBTree;
+
+/*
+
+Create a binary tree given its discrimination routine
+
+ */
+ extern HTBTree *HTBTree_new(HTComparer comp);
+
+/*
+
+Free storage of the tree but not of the objects
+
+ */
+ extern void HTBTree_free(HTBTree *tree);
+
+/*
+
+Free storage of the tree and of the objects
+
+ */
+ extern void HTBTreeAndObject_free(HTBTree *tree);
+
+/*
+
+Add an object to a binary tree
+
+ */
+
+ extern void HTBTree_add(HTBTree *tree, void *object);
+
+/*
+
+Search an object in a binary tree
+
+ returns Pointer to equivalent object in a tree or NULL if none.
+ */
+
+ extern void *HTBTree_search(HTBTree *tree, void *object);
+
+/*
+
+Find user object for element
+
+ */
+#define HTBTree_object(element) ((element)->object)
+
+/*
+
+Find next element in depth-first order
+
+ ON ENTRY,
+
+ ele if NULL, start with leftmost element. if != 0 give next object to
+ the right.
+
+ returns Pointer to element or NULL if none left.
+
+ */
+ extern HTBTElement *HTBTree_next(HTBTree *tree, HTBTElement *ele);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* HTBTREE_H */
diff --git a/WWW/Library/Implementation/HTCJK.h b/WWW/Library/Implementation/HTCJK.h
new file mode 100644
index 0000000..7edf50b
--- /dev/null
+++ b/WWW/Library/Implementation/HTCJK.h
@@ -0,0 +1,121 @@
+/*
+ * $LynxId: HTCJK.h,v 1.22 2021/07/01 23:51:38 tom Exp $
+ *
+ * CJK character converter HTCJK.h
+ * =======================
+ *
+ * Added 11-Jun-96 by FM, based on jiscode.h for
+ * Yutaka Sato's (ysato@etl.go.jp) SJIS.c, and
+ * Takuya ASADA's (asada@three-a.co.jp) CJK patches.
+ * (see SGML.c).
+ *
+ */
+
+#ifndef HTCJK_H
+#define HTCJK_H
+
+#ifndef HTUTILS_H
+#include <HTUtils.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * STATUS CHANGE CODES
+ */
+#define TO_2BCODE '$'
+#define TO_1BCODE '('
+#define TO_KANA '\016'
+#define TO_KANAOUT '\017'
+#define TO_KANJI "\033$B"
+#define TO_HANJI "\033$A"
+#define TO_HANGUL "\033$(C"
+#define TO_ASCII "\033(B"
+
+#define IS_GBK_LO(lo) ((0xA1 <= (lo)) && ((lo) <= 0xFE))
+#define IS_GBK_HI(hi) ((0xA1 <= (hi)) && ((hi) <= 0xF7))
+
+#define IS_SJIS_LO(lo) ((0x40 <= (lo)) && ((lo) != 0x7F) && ((lo) <= 0xFC))
+#define IS_SJIS_HI1(hi) ((0x81 <= (hi)) && ((hi) <= 0x9F)) /* 1st lev. */
+#define IS_SJIS_HI2(hi) ((0xE0 <= (hi)) && ((hi) <= 0xEF)) /* 2nd lev. */
+#define IS_SJIS(hi,lo,in_sjis) (!IS_SJIS_LO(lo) ? 0 : IS_SJIS_HI1(hi) ? (in_sjis=1) : in_sjis && IS_SJIS_HI2(hi))
+#define IS_SJIS_2BYTE(hi,lo) (IS_SJIS_LO(lo) && (IS_SJIS_HI1(hi) || IS_SJIS_HI2(hi)))
+#define IS_SJIS_X0201KANA(lo) ((0xA1 <= (lo)) && ((lo) <= 0xDF))
+
+#define IS_EUC_LOS(lo) ((0x21 <= (lo)) && ((lo) <= 0x7E)) /* standard */
+#define IS_EUC_LOX(lo) ((0xA1 <= (lo)) && ((lo) <= 0xFE)) /* extended */
+#define IS_EUC_HI(hi) ((0xA1 <= (hi)) && ((hi) <= 0xFE))
+#define IS_EUC_X0201KANA(hi,lo) (((hi) == 0x8E) && (0xA1 <= (lo)) && ((lo) <= 0xDF))
+#define IS_EUC(hi,lo) ((IS_EUC_HI(hi) && IS_EUC_LOX(lo)) || IS_EUC_X0201KANA(hi,lo))
+
+#define IS_JAPANESE_2BYTE(hi,lo) (IS_SJIS_2BYTE(hi,lo) || IS_EUC(hi,lo))
+
+#define IS_BIG5_LOS(lo) ((0x40 <= (lo)) && ((lo) <= 0x7E)) /* standard */
+#define IS_BIG5_LOX(lo) ((0xA1 <= (lo)) && ((lo) <= 0xFE)) /* extended */
+#define IS_BIG5_HI(hi) ((0xA1 <= (hi)) && ((hi) <= 0xFE))
+#define IS_BIG5(hi,lo) (IS_BIG5_HI(hi) && (IS_BIG5_LOS(lo) || IS_BIG5_LOX(lo)))
+
+ typedef enum {
+ NOKANJI = 0, EUC, SJIS, JIS
+ } HTkcode;
+ typedef enum {
+ NOCJK = 0, JAPANESE, CHINESE, KOREAN, TAIPEI
+ } HTCJKlang;
+
+ extern HTCJKlang HTCJK;
+
+/*
+ * Function prototypes.
+ */
+ extern void JISx0201TO0208_EUC(unsigned IHI,
+ unsigned ILO,
+ unsigned char *OHI,
+ unsigned char *OLO);
+
+ extern unsigned char *SJIS_TO_JIS1(unsigned HI,
+ unsigned LO,
+ unsigned char *JCODE);
+
+ extern unsigned char *JIS_TO_SJIS1(unsigned HI,
+ unsigned LO,
+ unsigned char *SJCODE);
+
+ extern unsigned char *EUC_TO_SJIS1(unsigned HI,
+ unsigned LO,
+ register unsigned char *SJCODE);
+
+ extern void JISx0201TO0208_SJIS(unsigned I,
+ unsigned char *OHI,
+ unsigned char *OLO);
+
+ extern unsigned char *SJIS_TO_EUC1(unsigned HI,
+ unsigned LO,
+ unsigned char *EUCp);
+
+ extern unsigned char *SJIS_TO_EUC(unsigned char *src,
+ unsigned char *dst);
+
+ extern unsigned char *EUC_TO_SJIS(unsigned char *src,
+ unsigned char *dst);
+
+ extern unsigned char *EUC_TO_JIS(unsigned char *src,
+ unsigned char *dst,
+ const char *toK,
+ const char *toA);
+
+ extern unsigned char *TO_EUC(const unsigned char *jis,
+ unsigned char *euc);
+
+ extern void TO_SJIS(const unsigned char *any,
+ unsigned char *sjis);
+
+ extern void TO_JIS(const unsigned char *any,
+ unsigned char *jis);
+
+ extern char *str_kcode(HTkcode code);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* HTCJK_H */
diff --git a/WWW/Library/Implementation/HTChunk.c b/WWW/Library/Implementation/HTChunk.c
new file mode 100644
index 0000000..6b67011
--- /dev/null
+++ b/WWW/Library/Implementation/HTChunk.c
@@ -0,0 +1,332 @@
+/*
+ * $LynxId: HTChunk.c,v 1.28 2016/11/24 15:29:50 tom Exp $
+ *
+ * Chunk handling: Flexible arrays
+ * ===============================
+ *
+ */
+
+#include <HTUtils.h>
+#include <HTChunk.h>
+
+#include <LYLeaks.h>
+
+/*
+ * Initialize a chunk with a certain allocation unit
+ */
+void HTChunkInit(HTChunk *ch, int grow)
+{
+ ch->data = 0;
+ ch->growby = grow;
+ ch->size = 0;
+ ch->allocated = 0;
+}
+
+/* Create a chunk with a certain allocation unit
+ * --------------
+ */
+HTChunk *HTChunkCreate(int grow)
+{
+ HTChunk *ch = typecalloc(HTChunk);
+
+ if (ch == NULL)
+ outofmem(__FILE__, "creation of chunk");
+
+ HTChunkInit(ch, grow);
+ return ch;
+}
+
+HTChunk *HTChunkCreateMayFail(int grow, int failok)
+{
+ HTChunk *ch = typecalloc(HTChunk);
+
+ if (ch == NULL) {
+ if (!failok) {
+ outofmem(__FILE__, "creation of chunk");
+ } else {
+ return ch;
+ }
+ }
+
+ HTChunkInit(ch, grow);
+ ch->failok = failok;
+ return ch;
+}
+
+/* Create a chunk with a certain allocation unit and ensured size
+ * --------------
+ */
+HTChunk *HTChunkCreate2(int grow, size_t needed)
+{
+ HTChunk *ch = typecalloc(HTChunk);
+
+ if (ch == NULL)
+ outofmem(__FILE__, "HTChunkCreate2");
+
+ HTChunkInit(ch, grow);
+ if (needed-- > 0) {
+ /* Round up */
+ ch->allocated = (int) (needed - (needed % (size_t) ch->growby)
+ + (unsigned) ch->growby);
+ CTRACE((tfp, "HTChunkCreate2: requested %d, allocate %u\n",
+ (int) needed, (unsigned) ch->allocated));
+ ch->data = typecallocn(char, (unsigned) ch->allocated);
+
+ if (!ch->data)
+ outofmem(__FILE__, "HTChunkCreate2 data");
+ }
+ return ch;
+}
+
+/* Clear a chunk of all data
+ * --------------------------
+ */
+void HTChunkClear(HTChunk *ch)
+{
+ FREE(ch->data);
+ ch->size = 0;
+ ch->allocated = 0;
+}
+
+/* Free a chunk (and it's chain, if any)
+ * -------------------------------------
+ */
+void HTChunkFree(HTChunk *ch)
+{
+ HTChunk *next;
+
+ do {
+ next = ch->next;
+ FREE(ch->data);
+ FREE(ch);
+ ch = next;
+ } while (ch != NULL);
+}
+
+/* Realloc the chunk
+ * -----------------
+ */
+BOOL HTChunkRealloc(HTChunk *ch, int growby)
+{
+ char *data;
+
+ ch->allocated = ch->allocated + growby;
+
+ data = (ch->data
+ ? typeRealloc(char, ch->data, ch->allocated)
+ : typecallocn(char, ch->allocated));
+
+ if (data) {
+ ch->data = data;
+ } else if (ch->failok) {
+ HTChunkClear(ch); /* allocation failed, clear all data - kw */
+ return FALSE; /* caller should check ch->allocated - kw */
+ } else {
+ outofmem(__FILE__, "HTChunkRealloc");
+ }
+ return TRUE;
+}
+
+/* Append a character
+ * ------------------
+ */
+void HTChunkPutc(HTChunk *ch, unsigned c)
+{
+ if (ch->size >= ch->allocated) {
+ if (!HTChunkRealloc(ch, ch->growby))
+ return;
+ }
+ ch->data[ch->size++] = (char) c;
+}
+
+/* like above but no realloc: extend to another chunk if necessary */
+HTChunk *HTChunkPutc2(HTChunk *ch, int c)
+{
+ if (ch->size >= ch->allocated) {
+ HTChunk *chunk = HTChunkCreateMayFail(ch->growby, ch->failok);
+
+ ch->next = chunk;
+ ch = chunk;
+ HTChunkPutc(ch, UCH(c));
+ } else {
+ ch->data[ch->size++] = (char) c;
+ }
+ return ch;
+}
+
+/* Ensure a certain size
+ * ---------------------
+ */
+void HTChunkEnsure(HTChunk *ch, int needed)
+{
+ if (needed <= ch->allocated)
+ return;
+ ch->allocated = needed - 1 - ((needed - 1) % ch->growby)
+ + ch->growby; /* Round up */
+ ch->data = (ch->data
+ ? typeRealloc(char, ch->data, ch->allocated)
+ : typecallocn(char, ch->allocated));
+
+ if (ch->data == NULL)
+ outofmem(__FILE__, "HTChunkEnsure");
+}
+
+/*
+ * Append a block of characters.
+ */
+void HTChunkPutb(HTChunk *ch, const char *b, int l)
+{
+ if (l <= 0)
+ return;
+ if (ch->size + l > ch->allocated) {
+ int growby = l - (l % ch->growby) + ch->growby; /* Round up */
+
+ if (!HTChunkRealloc(ch, growby))
+ return;
+ }
+ MemCpy(ch->data + ch->size, b, l);
+ ch->size += l;
+}
+
+/* like above but no realloc: extend to another chunk if necessary */
+HTChunk *HTChunkPutb2(HTChunk *ch, const char *b, int l)
+{
+ if (l <= 0)
+ return ch;
+ if (ch->size + l > ch->allocated) {
+ HTChunk *chunk;
+ int m = ch->allocated - ch->size;
+
+ MemCpy(ch->data + ch->size, b, (unsigned) m);
+ ch->size += m;
+
+ chunk = HTChunkCreateMayFail(ch->growby, ch->failok);
+ ch->next = chunk;
+ ch = chunk;
+ HTChunkPutb(ch, b + m, l - m);
+ } else {
+ MemCpy(ch->data + ch->size, b, (unsigned) l);
+ ch->size += l;
+ }
+ return ch;
+}
+
+#define PUTC(code) ch->data[ch->size++] = (char)(code)
+#define PUTC2(code) ch->data[ch->size++] = (char)(0x80|(0x3f &(code)))
+
+/*
+ * Append a character encoded as UTF-8.
+ */
+void HTChunkPutUtf8Char(HTChunk *ch, UCode_t code)
+{
+ int utflen;
+
+ if (TOASCII(code) < 128)
+ utflen = 1;
+ else if (code < 0x800L) {
+ utflen = 2;
+ } else if (code < 0x10000L) {
+ utflen = 3;
+ } else if (code < 0x200000L) {
+ utflen = 4;
+ } else if (code < 0x4000000L) {
+ utflen = 5;
+ } else if (code <= 0x7fffffffL) {
+ utflen = 6;
+ } else
+ utflen = 0;
+
+ if (ch->size + utflen > ch->allocated) {
+ int growby = (ch->growby >= utflen) ? ch->growby : utflen;
+
+ if (!HTChunkRealloc(ch, growby))
+ return;
+ }
+
+ switch (utflen) {
+ case 0:
+ return;
+ case 1:
+ ch->data[ch->size++] = (char) code;
+ return;
+ case 2:
+ PUTC(0xc0 | (code >> 6));
+ break;
+ case 3:
+ PUTC(0xe0 | (code >> 12));
+ break;
+ case 4:
+ PUTC(0xf0 | (code >> 18));
+ break;
+ case 5:
+ PUTC(0xf8 | (code >> 24));
+ break;
+ case 6:
+ PUTC(0xfc | (code >> 30));
+ break;
+ }
+ switch (utflen) {
+ case 6:
+ PUTC2(code >> 24);
+ /* FALLTHRU */
+ case 5:
+ PUTC2(code >> 18);
+ /* FALLTHRU */
+ case 4:
+ PUTC2(code >> 12);
+ /* FALLTHRU */
+ case 3:
+ PUTC2(code >> 6);
+ /* FALLTHRU */
+ case 2:
+ PUTC2(code);
+ break;
+ }
+}
+
+/* Terminate a chunk
+ * -----------------
+ */
+void HTChunkTerminate(HTChunk *ch)
+{
+ HTChunkPutc(ch, (char) 0);
+}
+
+/* Append a string
+ * ---------------
+ */
+void HTChunkPuts(HTChunk *ch, const char *s)
+{
+ const char *p;
+
+ if (s != NULL) {
+ for (p = s; *p; p++) {
+ if (ch->size >= ch->allocated) {
+ if (!HTChunkRealloc(ch, ch->growby))
+ break;
+ }
+ ch->data[ch->size++] = *p;
+ }
+ }
+}
+
+/* like above but no realloc: extend to another chunk if necessary */
+HTChunk *HTChunkPuts2(HTChunk *ch, const char *s)
+{
+ const char *p;
+
+ if (s != NULL) {
+ for (p = s; *p; p++) {
+ if (ch->size >= ch->allocated) {
+ HTChunk *chunk = HTChunkCreateMayFail(ch->growby, ch->failok);
+
+ ch->next = chunk;
+ ch = chunk;
+ HTChunkPuts(ch, p);
+ break;
+ }
+ ch->data[ch->size++] = *p;
+ }
+ }
+ return ch;
+}
diff --git a/WWW/Library/Implementation/HTChunk.h b/WWW/Library/Implementation/HTChunk.h
new file mode 100644
index 0000000..fa51c99
--- /dev/null
+++ b/WWW/Library/Implementation/HTChunk.h
@@ -0,0 +1,228 @@
+/*
+ * $LynxId: HTChunk.h,v 1.21 2020/01/21 22:02:43 tom Exp $
+ *
+ * HTChunk: Flexible array handling for libwww
+ * CHUNK HANDLING:
+ * FLEXIBLE ARRAYS
+ *
+ * This module implements a flexible array. It is a general utility module. A
+ * chunk is a structure which may be extended. These routines create and
+ * append data to chunks, automatically reallocating them as necessary.
+ *
+ */
+#ifndef HTCHUNK_H
+#define HTCHUNK_H 1
+
+#ifndef HTUTILS_H
+#include <HTUtils.h>
+#endif
+
+#include <UCMap.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ typedef struct _HTChunk HTChunk;
+
+ struct _HTChunk {
+ int size; /* In bytes */
+ int growby; /* Allocation unit in bytes */
+ int allocated; /* Current size of *data */
+ char *data; /* Pointer to malloc'd area or 0 */
+ int failok; /* allowed to fail without exiting program? */
+ HTChunk *next; /* pointer to the next chunk */
+ };
+
+/*
+ * Initialize a chunk's allocation data and allocation-increment.
+ */
+ extern void HTChunkInit(HTChunk *ch, int grow);
+
+/*
+ *
+ * Create new chunk
+ *
+ * ON ENTRY,
+ *
+ * growby The number of bytes to allocate at a time when the chunk
+ * is later extended. Arbitrary but normally a trade-off
+ * of time vs memory.
+ *
+ * ON EXIT,
+ *
+ * returns A chunk pointer to the new chunk,
+ *
+ */
+
+ extern HTChunk *HTChunkCreate(int growby);
+
+/*
+ * Create a chunk for which an allocation error is not a fatal application
+ * error if failok != 0, but merely resets the chunk. When using a chunk
+ * created this way, the caller should always check whether the contents
+ * are ok each time after data have been appended.
+ * The create call may also fail and will return NULL in that case. - kw
+ */
+ extern HTChunk *HTChunkCreateMayFail(int growby, int failok);
+
+/*
+ * Like HTChunkCreate but with initial allocation - kw
+ *
+ */
+ extern HTChunk *HTChunkCreate2(int growby, size_t needed);
+
+/*
+ *
+ * Free a chunk
+ *
+ * ON ENTRY,
+ *
+ * ch A valid chunk pointer made by HTChunkCreate()
+ *
+ * ON EXIT,
+ *
+ * ch is invalid and may not be used.
+ *
+ */
+
+ extern void HTChunkFree(HTChunk *ch);
+
+/*
+ *
+ * Clear a chunk
+ *
+ * ON ENTRY,
+ *
+ * ch A valid chunk pointer made by HTChunkCreate()
+ *
+ * ON EXIT,
+ *
+ * *ch The size of the chunk is zero.
+ *
+ */
+
+ extern void HTChunkClear(HTChunk *ch);
+
+/*
+ *
+ * Realloc a chunk
+ *
+ * ON ENTRY,
+ *
+ * ch A valid chunk pointer made by HTChunkCreate()
+ *
+ * growby growby
+ *
+ * ON EXIT,
+ *
+ * *ch Expanded by growby
+ *
+ */
+
+ extern BOOL HTChunkRealloc(HTChunk *ch, int growby);
+
+/*
+ *
+ * Ensure a chunk has a certain space in
+ *
+ * ON ENTRY,
+ *
+ * ch A valid chunk pointer made by HTChunkCreate()
+ *
+ * s The size required
+ *
+ * ON EXIT,
+ *
+ * *ch Has size at least s
+ *
+ */
+
+ extern void HTChunkEnsure(HTChunk *ch, int s);
+
+/*
+ *
+ * Append a character to a chunk
+ *
+ * ON ENTRY,
+ *
+ * ch A valid chunk pointer made by HTChunkCreate()
+ *
+ * c The character to be appended
+ *
+ * ON EXIT,
+ *
+ * *ch Is one character bigger
+ *
+ */
+ extern void HTChunkPutc(HTChunk *ch, unsigned c);
+
+ extern void HTChunkPutb(HTChunk *ch, const char *b, int l);
+
+ extern void HTChunkPutUtf8Char(HTChunk *ch, UCode_t code);
+
+/*
+ * Append a string to a chunk
+ *
+ * ON ENTRY,
+ *
+ * ch A valid chunk pointer made by HTChunkCreate()
+ *
+ * str Points to a zero-terminated string to be appended
+ *
+ * ON EXIT,
+ *
+ * *ch Is bigger by strlen(str)
+ *
+ */
+
+ extern void HTChunkPuts(HTChunk *ch, const char *str);
+
+/*
+ *
+ * Append a zero character to a chunk
+ *
+ */
+
+/*
+ *
+ * ON ENTRY,
+ *
+ * ch A valid chunk pointer made by HTChunkCreate()
+ *
+ * ON EXIT,
+ *
+ * *ch Is one character bigger
+ *
+ */
+
+ extern void HTChunkTerminate(HTChunk *ch);
+
+/* like the above but no realloc: extend to another chunk if necessary */
+/*
+ *
+ * Append a character (string, data) to a chunk
+ *
+ * ON ENTRY,
+ *
+ * ch A valid chunk pointer made by HTChunkCreate()
+ *
+ * c The character to be appended
+ *
+ * ON EXIT,
+ *
+ * returns original chunk or a pointer to the new chunk
+ * (original chunk is referenced to the new one
+ * by the field 'next')
+ *
+ */
+ extern HTChunk *HTChunkPutc2(HTChunk *ch, int c);
+ extern HTChunk *HTChunkPuts2(HTChunk *ch, const char *str);
+ extern HTChunk *HTChunkPutb2(HTChunk *ch, const char *b, int l);
+
+/* New pool infrastructure: UNlike the above, store data using alignment */
+ extern HTChunk *HTChunkPutb0(HTChunk *ch, const char *b, int l);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* HTCHUNK_H */
diff --git a/WWW/Library/Implementation/HTDOS.c b/WWW/Library/Implementation/HTDOS.c
new file mode 100644
index 0000000..84bff79
--- /dev/null
+++ b/WWW/Library/Implementation/HTDOS.c
@@ -0,0 +1,241 @@
+/*
+ * $LynxId: HTDOS.c,v 1.40 2013/11/28 11:11:05 tom Exp $
+ * DOS specific routines
+ */
+
+#include <HTUtils.h>
+#include <LYUtils.h>
+#include <HTDOS.h>
+#include <LYStrings.h>
+
+#include <LYLeaks.h>
+
+#ifdef _WINDOWS
+#include <LYGlobalDefs.h>
+#include <HTAlert.h>
+#endif
+
+/*
+ * Make a copy of the source argument in the result, allowing some extra
+ * space so we can append directly onto the result without reallocating.
+ */
+static char *copy_plus(char **result, const char *source)
+{
+ int length = (int) strlen(source);
+ int extra = 10;
+ int n;
+
+ for (n = 0; n < length; ++n) {
+ if (source[n] == ' ')
+ ++extra;
+ }
+
+ HTSprintf0(result, "%-*s", length + extra, source);
+ (*result)[length] = 0;
+ return (*result);
+}
+
+/* PUBLIC HTDOS_wwwName()
+ * CONVERTS DOS Name into WWW Name
+ * ON ENTRY:
+ * dosname DOS file specification (NO NODE)
+ *
+ * ON EXIT:
+ * returns WWW file specification
+ *
+ */
+const char *HTDOS_wwwName(const char *dosname)
+{
+ static char *wwwname = NULL;
+ char *cp_url = copy_plus(&wwwname, dosname);
+ int wwwname_len;
+ char ch;
+
+ while ((ch = *dosname) != '\0') {
+ switch (ch) {
+ case '\\':
+ /* convert dos backslash to unix-style */
+ *cp_url++ = '/';
+ break;
+ case ' ':
+ *cp_url++ = '%';
+ *cp_url++ = '2';
+ *cp_url++ = '0';
+ break;
+ default:
+ *cp_url++ = ch;
+ break;
+ }
+ dosname++;
+ }
+ *cp_url = '\0';
+
+ wwwname_len = (int) strlen(wwwname);
+ if (wwwname_len > 1)
+ cp_url--; /* point last char */
+
+ if (wwwname_len > 3 && *cp_url == '/') {
+ cp_url++;
+ *cp_url = '\0';
+ }
+ return (wwwname);
+}
+
+/*
+ * Convert slashes from Unix to DOS
+ */
+char *HTDOS_slashes(char *path)
+{
+ char *s;
+
+ for (s = path; *s != '\0'; ++s) {
+ if (*s == '/') {
+ *s = '\\';
+ }
+ }
+ return path;
+}
+
+/* PUBLIC HTDOS_name()
+ * CONVERTS WWW name into a DOS name
+ * ON ENTRY:
+ * wwwname WWW file name
+ *
+ * ON EXIT:
+ * returns DOS file specification
+ */
+char *HTDOS_name(const char *wwwname)
+{
+ static char *result = NULL;
+ int joe;
+
+#if defined(SH_EX) /* 2000/03/07 (Tue) 18:32:42 */
+ if (unsafe_filename(wwwname)) {
+ HTUserMsg2("unsafe filename : %s", wwwname);
+ copy_plus(&result, "BAD_LOCAL_FILE_NAME");
+ } else {
+ copy_plus(&result, wwwname);
+ }
+#else
+ copy_plus(&result, wwwname);
+#endif
+#ifdef __DJGPP__
+ if (result[0] == '/'
+ && result[1] == 'd'
+ && result[2] == 'e'
+ && result[3] == 'v'
+ && result[4] == '/'
+ && isalpha(result[5])) {
+ return (result);
+ }
+#endif /* __DJGPP__ */
+
+ (void) HTDOS_slashes(result);
+
+ /* pesky leading slash, rudiment from file://localhost/ */
+ /* the rest of path may be with or without drive letter */
+ if ((result[1] != '\\') && (result[0] == '\\')) {
+ for (joe = 0; (result[joe] = result[joe + 1]) != 0; joe++) ;
+ }
+ /* convert '|' after the drive letter to ':' */
+ if (isalpha(UCH(result[0])) && result[1] == '|') {
+ result[1] = ':';
+ }
+#ifdef _WINDOWS /* 1998/04/02 (Thu) 08:59:48 */
+ if (LYLastPathSep(result) != NULL
+ && !LYIsDosDrive(result)) {
+ char temp_buff[LY_MAXPATH];
+
+ sprintf(temp_buff, "%.3s\\%.*s", windows_drive,
+ (int) (sizeof(temp_buff) - 5), result);
+ StrAllocCopy(result, temp_buff);
+ }
+#endif
+ /*
+ * If we have only a device, add a trailing slash. Otherwise it just
+ * refers to the current directory on the given device.
+ */
+ if (LYLastPathSep(result) == NULL
+ && LYIsDosDrive(result))
+ LYAddPathSep0(result);
+
+ CTRACE((tfp, "HTDOS_name changed `%s' to `%s'\n", wwwname, result));
+ return (result);
+}
+
+#ifdef WIN_EX
+char *HTDOS_short_name(const char *path)
+{
+ static char sbuf[LY_MAXPATH];
+ char *ret;
+ DWORD r;
+
+ if (StrChr(path, '/'))
+ path = HTDOS_name(path);
+ r = GetShortPathName(path, sbuf, sizeof sbuf);
+ if (r >= sizeof(sbuf) || r == 0) {
+ ret = LYStrNCpy(sbuf, path, sizeof(sbuf));
+ } else {
+ ret = sbuf;
+ }
+ return ret;
+}
+#endif
+
+#if defined(DJGPP)
+/*
+ * Poll tcp/ip lib and yield to DPMI-host while nothing in
+ * keyboard buffer (head = tail) (simpler than kbhit).
+ * This is required to be able to finish off dead sockets,
+ * answer pings etc.
+ */
+#include <pc.h>
+#include <dpmi.h>
+#include <libc/farptrgs.h>
+#include <go32.h>
+
+void djgpp_idle_loop(void)
+{
+ while (_farpeekw(_dos_ds, 0x41a) == _farpeekw(_dos_ds, 0x41c)) {
+ tcp_tick(NULL);
+ __dpmi_yield();
+#if defined(USE_SLANG)
+ if (SLang_input_pending(1))
+ break;
+#endif
+ }
+}
+
+/* PUBLIC getxkey()
+ * Replaces libc's getxkey() with polling of tcp/ip
+ * library (WatTcp or Watt-32). *
+ * ON EXIT:
+ * returns extended keypress.
+ */
+
+/* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
+
+int getxkey(void)
+{
+#if defined(DJGPP_KEYHANDLER)
+ __dpmi_regs r;
+
+ djgpp_idle_loop();
+
+ r.h.ah = 0x10;
+ __dpmi_int(0x16, &r);
+
+ if (r.h.al == 0x00)
+ return 0x0100 | r.h.ah;
+ if (r.h.al == 0xe0)
+ return 0x0200 | r.h.ah;
+ return r.h.al;
+
+#elif defined(USE_SLANG)
+ djgpp_idle_loop();
+ return SLkp_getkey();
+#else
+ /* PDcurses uses myGetChar() in LYString.c */
+#endif
+}
+#endif /* DJGPP */
diff --git a/WWW/Library/Implementation/HTDOS.h b/WWW/Library/Implementation/HTDOS.h
new file mode 100644
index 0000000..e1613cb
--- /dev/null
+++ b/WWW/Library/Implementation/HTDOS.h
@@ -0,0 +1,56 @@
+/*
+ * $LynxId: HTDOS.h,v 1.14 2009/09/09 00:16:06 tom Exp $
+ *
+ * DOS specific routines
+ */
+
+#ifndef HTDOS_H
+#define HTDOS_H
+
+#ifndef HTUTILS_H
+#include <HTUtils.h>
+#endif /* HTUTILS_H */
+
+/* PUBLIC HTDOS_wwwName()
+ * CONVERTS DOS Name into WWW Name
+ * ON ENTRY:
+ * dosname DOS file specification (NO NODE)
+ *
+ * ON EXIT:
+ * returns WWW file specification
+ *
+ */
+const char *HTDOS_wwwName(const char *dosname);
+
+/*
+ * Converts Unix slashes to DOS
+ */
+char *HTDOS_slashes(char *path);
+
+/* PUBLIC HTDOS_name()
+ * CONVERTS WWW name into a DOS name
+ * ON ENTRY:
+ * wwwname WWW file name
+ *
+ * ON EXIT:
+ * returns DOS file specification
+ *
+ * Bug: Returns pointer to static -- non-reentrant
+ */
+char *HTDOS_name(const char *wwwname);
+
+#ifdef WIN_EX
+char *HTDOS_short_name(const char *fn);
+
+#else
+#define HTDOS_short_name(fn) fn
+#endif
+
+#ifdef DJGPP
+/*
+ * Poll tcp/ip lib and yield to DPMI-host while nothing in
+ * keyboard buffer (head = tail) (simpler than kbhit).
+ */
+void djgpp_idle_loop(void);
+#endif
+#endif /* HTDOS_H */
diff --git a/WWW/Library/Implementation/HTFTP.c b/WWW/Library/Implementation/HTFTP.c
new file mode 100644
index 0000000..decf559
--- /dev/null
+++ b/WWW/Library/Implementation/HTFTP.c
@@ -0,0 +1,4177 @@
+/*
+ * $LynxId: HTFTP.c,v 1.148 2023/01/05 09:17:15 tom Exp $
+ *
+ * File Transfer Protocol (FTP) Client
+ * for a WorldWideWeb browser
+ * ===================================
+ *
+ * A cache of control connections is kept.
+ *
+ * Note: Port allocation
+ *
+ * It is essential that the port is allocated by the system, rather
+ * than chosen in rotation by us (POLL_PORTS), or the following
+ * problem occurs.
+ *
+ * It seems that an attempt by the server to connect to a port which has
+ * been used recently by a listen on the same socket, or by another
+ * socket this or another process causes a hangup of (almost exactly)
+ * one minute. Therefore, we have to use a rotating port number.
+ * The problem remains that if the application is run twice in quick
+ * succession, it will hang for what remains of a minute.
+ *
+ * Authors
+ * TBL Tim Berners-lee <timbl@info.cern.ch>
+ * DD Denis DeLaRoca 310 825-4580 <CSP1DWD@mvs.oac.ucla.edu>
+ * LM Lou Montulli <montulli@ukanaix.cc.ukans.edu>
+ * FM Foteos Macrides <macrides@sci.wfeb.edu>
+ * History:
+ * 2 May 91 Written TBL, as a part of the WorldWideWeb project.
+ * 15 Jan 92 Bug fix: close() was used for NETCLOSE for control soc
+ * 10 Feb 92 Retry if cached connection times out or breaks
+ * 8 Dec 92 Bug fix 921208 TBL after DD
+ * 17 Dec 92 Anon FTP password now just WWWuser@ suggested by DD
+ * fails on princeton.edu!
+ * 27 Dec 93 (FM) Fixed up so FTP now works with VMS hosts. Path
+ * must be Unix-style and cannot include the device
+ * or top directory.
+ * ?? ??? ?? (LM) Added code to prompt and send passwords for non
+ * anonymous FTP
+ * 25 Mar 94 (LM) Added code to recognize different ftp server types
+ * and code to parse dates and sizes on most hosts.
+ * 27 Mar 93 (FM) Added code for getting dates and sizes on VMS hosts.
+ *
+ * Notes:
+ * Portions Copyright 1994 Trustees of Dartmouth College
+ * Code for recognizing different FTP servers and
+ * parsing "ls -l" output taken from Macintosh Fetch
+ * program with permission from Jim Matthews,
+ * Dartmouth Software Development Team.
+ */
+
+/*
+ * BUGS: @@@ Limit connection cache size!
+ * Error reporting to user.
+ * 400 & 500 errors are ack'ed by user with windows.
+ * Use configuration file for user names
+ *
+ * Note for portability this version does not use select() and
+ * so does not watch the control and data channels at the
+ * same time.
+ */
+
+#include <HTUtils.h>
+
+#include <HTAlert.h>
+
+#include <HTFTP.h> /* Implemented here */
+#include <HTTCP.h>
+#include <HTTP.h>
+#include <HTFont.h>
+
+#define REPEAT_PORT /* Give the port number for each file */
+#define REPEAT_LISTEN /* Close each listen socket and open a new one */
+
+/* define POLL_PORTS If allocation does not work, poll ourselves.*/
+#define LISTEN_BACKLOG 2 /* Number of pending connect requests (TCP) */
+
+#define FIRST_TCP_PORT 1024 /* Region to try for a listening port */
+#define LAST_TCP_PORT 5999
+
+#define LINE_LENGTH 256
+
+#include <HTParse.h>
+#include <HTAnchor.h>
+#include <HTFile.h> /* For HTFileFormat() */
+#include <HTBTree.h>
+#include <HTChunk.h>
+#ifndef IPPORT_FTP
+#define IPPORT_FTP 21
+#endif /* !IPORT_FTP */
+
+#include <LYUtils.h>
+#include <LYGlobalDefs.h>
+#include <LYStrings.h>
+#include <LYLeaks.h>
+
+typedef struct _connection {
+ struct _connection *next; /* Link on list */
+ int socket; /* Socket number for communication */
+ BOOL is_binary; /* Binary mode? */
+} connection;
+
+/* Hypertext object building machinery
+*/
+#include <HTML.h>
+
+/*
+ * socklen_t is the standard, but there are many pre-standard variants.
+ * This ifdef works around a few of those cases.
+ *
+ * Information was obtained from header files on these platforms:
+ * AIX 4.3.2, 5.1
+ * HPUX 10.20, 11.00, 11.11
+ * IRIX64 6.5
+ * Tru64 4.0G, 4.0D, 5.1
+ */
+#if defined(SYS_IRIX64)
+ /* IRIX64 6.5 socket.h may use socklen_t if SGI_SOURCE is not defined */
+# if _NO_XOPEN4 && _NO_XOPEN5
+# define LY_SOCKLEN socklen_t
+# elif _ABIAPI
+# define LY_SOCKLEN int
+# elif _XOPEN5
+# if (_MIPS_SIM != _ABIO32)
+# define LY_SOCKLEN socklen_t
+# else
+# define LY_SOCKLEN int
+# endif
+# else
+# define LY_SOCKLEN size_t
+# endif
+#elif defined(SYS_HPUX)
+# if defined(_XOPEN_SOURCE_EXTENDED) && defined(SO_PROTOTYPE)
+# define LY_SOCKLEN socklen_t
+# else /* HPUX 10.20, etc. */
+# define LY_SOCKLEN int
+# endif
+#elif defined(SYS_TRU64)
+# if defined(_POSIX_PII_SOCKET)
+# define LY_SOCKLEN socklen_t
+# elif defined(_XOPEN_SOURCE_EXTENDED)
+# define LY_SOCKLEN size_t
+# else
+# define LY_SOCKLEN int
+# endif
+#else
+# define LY_SOCKLEN socklen_t
+#endif
+
+#define PUTC(c) (*target->isa->put_character) (target, c)
+#define PUTS(s) (*target->isa->put_string) (target, s)
+#define START(e) (*target->isa->start_element) (target, e, 0, 0, -1, 0)
+#define END(e) (*target->isa->end_element) (target, e, 0)
+#define FREE_TARGET (*target->isa->_free) (target)
+#define ABORT_TARGET (*target->isa->_free) (target)
+
+#define TRACE_ENTRY(tag, entry_info) \
+ CTRACE((tfp, "HTFTP: %s filename: %s date: %s size: %" PRI_off_t "\n", \
+ tag, \
+ entry_info->filename, \
+ NonNull(entry_info->date), \
+ CAST_off_t(entry_info->size)))
+
+struct _HTStructured {
+ const HTStructuredClass *isa;
+ /* ... */
+};
+
+/* Global Variables
+ * ---------------------
+ */
+int HTfileSortMethod = FILE_BY_NAME;
+
+#ifndef DISABLE_FTP /*This disables everything to end-of-file */
+static char ThisYear[8];
+static char LastYear[8];
+static int TheDate;
+static BOOLEAN HaveYears = FALSE;
+
+/* Module-Wide Variables
+ * ---------------------
+ */
+static connection *connections = NULL; /* Linked list of connections */
+static char response_text[LINE_LENGTH + 1]; /* Last response from ftp host */
+static connection *control = NULL; /* Current connection */
+static int data_soc = -1; /* Socket for data transfer =invalid */
+static char *user_entered_password = NULL;
+static char *last_username_and_host = NULL;
+
+/*
+ * Some ftp servers are known to have a broken implementation of RETR. If
+ * asked to retrieve a directory, they get confused and fail subsequent
+ * commands such as CWD and LIST.
+ */
+static int Broken_RETR = FALSE;
+
+/*
+ * Some ftp servers are known to have a broken implementation of EPSV. The
+ * server will hang for a long time when we attempt to connect after issuing
+ * this command.
+ */
+#ifdef INET6
+static int Broken_EPSV = FALSE;
+#endif
+
+typedef enum {
+ GENERIC_SERVER
+ ,MACHTEN_SERVER
+ ,UNIX_SERVER
+ ,VMS_SERVER
+ ,CMS_SERVER
+ ,DCTS_SERVER
+ ,TCPC_SERVER
+ ,PETER_LEWIS_SERVER
+ ,NCSA_SERVER
+ ,WINDOWS_NT_SERVER
+ ,WINDOWS_2K_SERVER
+ ,MS_WINDOWS_SERVER
+ ,MSDOS_SERVER
+ ,APPLESHARE_SERVER
+ ,NETPRESENZ_SERVER
+ ,DLS_SERVER
+} eServerType;
+
+static eServerType server_type = GENERIC_SERVER; /* the type of ftp host */
+static int unsure_type = FALSE; /* sure about the type? */
+static BOOLEAN use_list = FALSE; /* use the LIST command? */
+
+static int interrupted_in_next_data_char = FALSE;
+
+#ifdef POLL_PORTS
+static PortNumber port_number = FIRST_TCP_PORT;
+#endif /* POLL_PORTS */
+
+static BOOL have_socket = FALSE; /* true if master_socket is valid */
+static LYNX_FD master_socket; /* Listening socket = invalid */
+
+static char *port_command; /* Command for setting the port */
+static fd_set open_sockets; /* Mask of active channels */
+static LYNX_FD num_sockets; /* Number of sockets to scan */
+static PortNumber passive_port; /* Port server specified for data */
+
+#define NEXT_CHAR HTGetCharacter() /* Use function in HTFormat.c */
+
+#define DATA_BUFFER_SIZE 2048
+static char data_buffer[DATA_BUFFER_SIZE]; /* Input data buffer */
+static char *data_read_pointer;
+static char *data_write_pointer;
+
+#define NEXT_DATA_CHAR next_data_char()
+static int close_connection(connection * con);
+
+#ifndef HAVE_ATOLL
+off_t LYatoll(const char *value)
+{
+ off_t result = 0;
+
+ while (*value != '\0') {
+ result = (result * 10) + (off_t) (*value++ - '0');
+ }
+ return result;
+}
+#endif
+
+#ifdef LY_FIND_LEAKS
+/*
+ * This function frees module globals. - FM
+ */
+static void free_FTPGlobals(void)
+{
+ FREE(user_entered_password);
+ FREE(last_username_and_host);
+ if (control) {
+ if (control->socket != -1)
+ close_connection(control);
+ FREE(control);
+ }
+}
+#endif /* LY_FIND_LEAKS */
+
+/* PUBLIC HTVMS_name()
+ * CONVERTS WWW name into a VMS name
+ * ON ENTRY:
+ * nn Node Name (optional)
+ * fn WWW file name
+ *
+ * ON EXIT:
+ * returns vms file specification
+ *
+ * Bug: Returns pointer to static -- non-reentrant
+ */
+char *HTVMS_name(const char *nn,
+ const char *fn)
+{
+ /* We try converting the filename into Files-11 syntax. That is, we assume
+ * first that the file is, like us, on a VMS node. We try remote (or
+ * local) DECnet access. Files-11, VMS, VAX and DECnet are trademarks of
+ * Digital Equipment Corporation. The node is assumed to be local if the
+ * hostname WITHOUT DOMAIN matches the local one. @@@
+ */
+ static char *vmsname;
+ char *filename = (char *) malloc(strlen(fn) + 1);
+ char *nodename = (char *) malloc(strlen(nn) + 2 + 1); /* Copies to hack */
+ char *second; /* 2nd slash */
+ char *last; /* last slash */
+
+ const char *hostname = HTHostName();
+
+ if (!filename || !nodename)
+ outofmem(__FILE__, "HTVMSname");
+
+ strcpy(filename, fn);
+ strcpy(nodename, ""); /* On same node? Yes if node names match */
+ if (StrNCmp(nn, "localhost", 9)) {
+ const char *p;
+ const char *q;
+
+ for (p = hostname, q = nn;
+ *p && *p != '.' && *q && *q != '.'; p++, q++) {
+ if (TOUPPER(*p) != TOUPPER(*q)) {
+ char *r;
+
+ strcpy(nodename, nn);
+ r = StrChr(nodename, '.'); /* Mismatch */
+ if (r)
+ *r = '\0'; /* Chop domain */
+ strcat(nodename, "::"); /* Try decnet anyway */
+ break;
+ }
+ }
+ }
+
+ second = StrChr(filename + 1, '/'); /* 2nd slash */
+ last = strrchr(filename, '/'); /* last slash */
+
+ if (!second) { /* Only one slash */
+ HTSprintf0(&vmsname, "%s%s", nodename, filename + 1);
+ } else if (second == last) { /* Exactly two slashes */
+ *second = '\0'; /* Split filename from disk */
+ HTSprintf0(&vmsname, "%s%s:%s", nodename, filename + 1, second + 1);
+ *second = '/'; /* restore */
+ } else { /* More than two slashes */
+ char *p;
+
+ *second = '\0'; /* Split disk from directories */
+ *last = '\0'; /* Split dir from filename */
+ HTSprintf0(&vmsname, "%s%s:[%s]%s",
+ nodename, filename + 1, second + 1, last + 1);
+ *second = *last = '/'; /* restore filename */
+ if ((p = StrChr(vmsname, '[')) != 0) {
+ while (*p != '\0' && *p != ']') {
+ if (*p == '/')
+ *p = '.'; /* Convert dir sep. to dots */
+ ++p;
+ }
+ }
+ }
+ FREE(nodename);
+ FREE(filename);
+ return vmsname;
+}
+
+/* Procedure: Read a character from the data connection
+ * ----------------------------------------------------
+ */
+static int next_data_char(void)
+{
+ int status;
+
+ if (data_read_pointer >= data_write_pointer) {
+ status = NETREAD(data_soc, data_buffer, DATA_BUFFER_SIZE);
+ if (status == HT_INTERRUPTED)
+ interrupted_in_next_data_char = 1;
+ if (status <= 0)
+ return EOF;
+ data_write_pointer = data_buffer + status;
+ data_read_pointer = data_buffer;
+ }
+#ifdef NOT_ASCII
+ {
+ char c = *data_read_pointer++;
+
+ return FROMASCII(c);
+ }
+#else
+ return UCH(*data_read_pointer++);
+#endif /* NOT_ASCII */
+}
+
+/* Close an individual connection
+ *
+ */
+static int close_connection(connection * con)
+{
+ connection *scan;
+ int status;
+
+ CTRACE((tfp, "HTFTP: Closing control socket %d\n", con->socket));
+ status = NETCLOSE(con->socket);
+ if (TRACE && status != 0) {
+#ifdef UNIX
+ CTRACE((tfp, "HTFTP:close_connection: %s", LYStrerror(errno)));
+#else
+ if (con->socket != INVSOC)
+ HTInetStatus("HTFTP:close_connection");
+#endif
+ }
+ con->socket = -1;
+ if (connections == con) {
+ connections = con->next;
+ return status;
+ }
+ for (scan = connections; scan; scan = scan->next) {
+ if (scan->next == con) {
+ scan->next = con->next; /* Unlink */
+ if (control == con)
+ control = (connection *) 0;
+ return status;
+ } /*if */
+ } /* for */
+ return -1; /* very strange -- was not on list. */
+}
+
+static char *help_message_buffer = NULL; /* global :( */
+
+static void init_help_message_cache(void)
+{
+ FREE(help_message_buffer);
+}
+
+static void help_message_cache_add(char *string)
+{
+ if (help_message_buffer)
+ StrAllocCat(help_message_buffer, string);
+ else
+ StrAllocCopy(help_message_buffer, string);
+
+ CTRACE((tfp, "Adding message to help cache: %s\n", string));
+}
+
+static char *help_message_cache_non_empty(void)
+{
+ return (help_message_buffer);
+}
+
+static char *help_message_cache_contents(void)
+{
+ return (help_message_buffer);
+}
+
+/* Send One Command
+ * ----------------
+ *
+ * This function checks whether we have a control connection, and sends
+ * one command if given.
+ *
+ * On entry,
+ * control points to the connection which is established.
+ * cmd points to a command, or is zero to just get the response.
+ *
+ * The command should already be terminated with the CRLF pair.
+ *
+ * On exit,
+ * returns: 1 for success,
+ * or negative for communication failure (in which case
+ * the control connection will be closed).
+ */
+static int write_cmd(const char *cmd)
+{
+ int status;
+
+ if (!control) {
+ CTRACE((tfp, "HTFTP: No control connection set up!!\n"));
+ return HT_NO_CONNECTION;
+ }
+
+ if (cmd) {
+ CTRACE((tfp, " Tx: %s", cmd));
+#ifdef NOT_ASCII
+ {
+ char *p;
+
+ for (p = cmd; *p; p++) {
+ *p = TOASCII(*p);
+ }
+ }
+#endif /* NOT_ASCII */
+ status = (int) NETWRITE(control->socket, cmd, (unsigned) strlen(cmd));
+ if (status < 0) {
+ CTRACE((tfp,
+ "HTFTP: Error %d sending command: closing socket %d\n",
+ status, control->socket));
+ close_connection(control);
+ return status;
+ }
+ }
+ return 1;
+}
+
+/*
+ * For each string in the list, check if it is found in the response text.
+ * If so, return TRUE.
+ */
+static BOOL find_response(HTList *list)
+{
+ BOOL result = FALSE;
+ HTList *p = list;
+ char *value;
+
+ while ((value = (char *) HTList_nextObject(p)) != NULL) {
+ if (LYstrstr(response_text, value)) {
+ result = TRUE;
+ break;
+ }
+ }
+ return result;
+}
+
+/* Execute Command and get Response
+ * --------------------------------
+ *
+ * See the state machine illustrated in RFC959, p57. This implements
+ * one command/reply sequence. It also interprets lines which are to
+ * be continued, which are marked with a "-" immediately after the
+ * status code.
+ *
+ * Continuation then goes on until a line with a matching reply code
+ * an a space after it.
+ *
+ * On entry,
+ * control points to the connection which is established.
+ * cmd points to a command, or is zero to just get the response.
+ *
+ * The command must already be terminated with the CRLF pair.
+ *
+ * On exit,
+ * returns: The first digit of the reply type,
+ * or negative for communication failure.
+ */
+static int response(const char *cmd)
+{
+ int result; /* Three-digit decimal code */
+ int continuation_response = -1;
+ int status;
+
+ if ((status = write_cmd(cmd)) < 0)
+ return status;
+
+ do {
+ char *p = response_text;
+
+ for (;;) {
+ int ich = NEXT_CHAR;
+
+ if (((*p++ = (char) ich) == LF)
+ || (p == &response_text[LINE_LENGTH])) {
+
+ char continuation;
+
+ if (interrupted_in_htgetcharacter) {
+ CTRACE((tfp,
+ "HTFTP: Interrupted in HTGetCharacter, apparently.\n"));
+ NETCLOSE(control->socket);
+ control->socket = -1;
+ return HT_INTERRUPTED;
+ }
+
+ *p = '\0'; /* Terminate the string */
+ CTRACE((tfp, " Rx: %s", response_text));
+
+ /* Check for login or help messages */
+ if (!StrNCmp(response_text, "230-", 4) ||
+ !StrNCmp(response_text, "250-", 4) ||
+ !StrNCmp(response_text, "220-", 4))
+ help_message_cache_add(response_text + 4);
+
+ sscanf(response_text, "%d%c", &result, &continuation);
+ if (continuation_response == -1) {
+ if (continuation == '-') /* start continuation */
+ continuation_response = result;
+ } else { /* continuing */
+ if (continuation_response == result &&
+ continuation == ' ')
+ continuation_response = -1; /* ended */
+ }
+ if (result == 220 && find_response(broken_ftp_retr)) {
+ Broken_RETR = TRUE;
+ CTRACE((tfp, "This server is broken (RETR)\n"));
+ }
+#ifdef INET6
+ if (result == 220 && find_response(broken_ftp_epsv)) {
+ Broken_EPSV = TRUE;
+ CTRACE((tfp, "This server is broken (EPSV)\n"));
+ }
+#endif
+ break;
+ }
+ /* if end of line */
+ if (interrupted_in_htgetcharacter) {
+ CTRACE((tfp,
+ "HTFTP: Interrupted in HTGetCharacter, apparently.\n"));
+ NETCLOSE(control->socket);
+ control->socket = -1;
+ return HT_INTERRUPTED;
+ }
+
+ if (ich == EOF) {
+ CTRACE((tfp, "Error on rx: closing socket %d\n",
+ control->socket));
+ strcpy(response_text, "000 *** TCP read error on response\n");
+ close_connection(control);
+ return -1; /* End of file on response */
+ }
+ } /* Loop over characters */
+
+ } while (continuation_response != -1);
+
+ if (result == 421) {
+ CTRACE((tfp, "HTFTP: They close so we close socket %d\n",
+ control->socket));
+ close_connection(control);
+ return -1;
+ }
+ if ((result == 255 && server_type == CMS_SERVER) &&
+ (0 == strncasecomp(cmd, "CWD", 3) ||
+ 0 == strcasecomp(cmd, "CDUP"))) {
+ /*
+ * Alas, CMS returns 255 on failure to CWD to parent of root. - PG
+ */
+ result = 555;
+ }
+ return result / 100;
+}
+
+static int send_cmd_1(const char *verb)
+{
+ char command[80];
+
+ sprintf(command, "%.*s%c%c", (int) sizeof(command) - 4, verb, CR, LF);
+ return response(command);
+}
+
+static int send_cmd_2(const char *verb, const char *param)
+{
+ char *command = 0;
+ int status;
+
+ HTSprintf0(&command, "%s %s%c%c", verb, param, CR, LF);
+ status = response(command);
+ FREE(command);
+
+ return status;
+}
+
+#define send_cwd(path) send_cmd_2("CWD", path)
+
+/*
+ * This function should try to set the macintosh server into binary mode. Some
+ * servers need an additional letter after the MACB command.
+ */
+static int set_mac_binary(eServerType ServerType)
+{
+ /* try to set mac binary mode */
+ if (ServerType == APPLESHARE_SERVER ||
+ ServerType == NETPRESENZ_SERVER) {
+ /*
+ * Presumably E means "Enable". - KW
+ */
+ return (2 == response("MACB E\r\n"));
+ } else {
+ return (2 == response("MACB\r\n"));
+ }
+}
+
+/* This function gets the current working directory to help
+ * determine what kind of host it is
+ */
+
+static void get_ftp_pwd(eServerType *ServerType, BOOLEAN *UseList)
+{
+ char *cp;
+
+ /* get the working directory (to see what it looks like) */
+ int status = response("PWD\r\n");
+
+ if (status < 0) {
+ return;
+ } else {
+ cp = StrChr(response_text + 5, '"');
+ if (cp)
+ *cp = '\0';
+ if (*ServerType == TCPC_SERVER) {
+ *ServerType = ((response_text[5] == '/') ?
+ NCSA_SERVER : TCPC_SERVER);
+ CTRACE((tfp, "HTFTP: Treating as %s server.\n",
+ ((*ServerType == NCSA_SERVER) ?
+ "NCSA" : "TCPC")));
+ } else if (response_text[5] == '/') {
+ /* path names beginning with / imply Unix,
+ * right?
+ */
+ if (set_mac_binary(*ServerType)) {
+ *ServerType = NCSA_SERVER;
+ CTRACE((tfp, "HTFTP: Treating as NCSA server.\n"));
+ } else {
+ *ServerType = UNIX_SERVER;
+ *UseList = TRUE;
+ CTRACE((tfp, "HTFTP: Treating as Unix server.\n"));
+ }
+ return;
+ } else if (response_text[strlen(response_text) - 1] == ']') {
+ /* path names ending with ] imply VMS, right? */
+ *ServerType = VMS_SERVER;
+ *UseList = TRUE;
+ CTRACE((tfp, "HTFTP: Treating as VMS server.\n"));
+ } else {
+ *ServerType = GENERIC_SERVER;
+ CTRACE((tfp, "HTFTP: Treating as Generic server.\n"));
+ }
+
+ if ((*ServerType == NCSA_SERVER) ||
+ (*ServerType == TCPC_SERVER) ||
+ (*ServerType == PETER_LEWIS_SERVER) ||
+ (*ServerType == NETPRESENZ_SERVER))
+ set_mac_binary(*ServerType);
+ }
+}
+
+/* This function turns MSDOS-like directory output off for
+ * Windows NT servers.
+ */
+
+static void set_unix_dirstyle(eServerType *ServerType, BOOLEAN *UseList)
+{
+ char *cp;
+
+ /* This is a toggle. It seems we have to toggle in order to see
+ * the current state (after toggling), so we may end up toggling
+ * twice. - kw
+ */
+ int status = response("SITE DIRSTYLE\r\n");
+
+ if (status != 2) {
+ *ServerType = GENERIC_SERVER;
+ CTRACE((tfp, "HTFTP: DIRSTYLE failed, treating as Generic server.\n"));
+ return;
+ } else {
+ *UseList = TRUE;
+ /* Expecting one of:
+ * 200 MSDOS-like directory output is off
+ * 200 MSDOS-like directory output is on
+ * The following code doesn't look for the full exact string -
+ * who knows how the wording may change in some future version.
+ * If the first response isn't recognized, we toggle again
+ * anyway, under the assumption that it's more likely that
+ * the MSDOS setting was "off" originally. - kw
+ */
+ cp = strstr(response_text + 4, "MSDOS");
+ if (cp && strstr(cp, " off")) {
+ return; /* already off now. */
+ } else {
+ response("SITE DIRSTYLE\r\n");
+ }
+ }
+}
+
+#define CheckForInterrupt(msg) \
+ if (status == HT_INTERRUPTED) { \
+ CTRACE((tfp, "HTFTP: Interrupted %s.\n", msg)); \
+ _HTProgress(CONNECTION_INTERRUPTED); \
+ NETCLOSE(control->socket); \
+ control->socket = -1; \
+ return HT_INTERRUPTED; \
+ }
+
+/* Get a valid connection to the host
+ * ----------------------------------
+ *
+ * On entry,
+ * arg points to the name of the host in a hypertext address
+ * On exit,
+ * returns <0 if error
+ * socket number if success
+ *
+ * This routine takes care of managing timed-out connections, and
+ * limiting the number of connections in use at any one time.
+ *
+ * It ensures that all connections are logged in if they exist.
+ * It ensures they have the port number transferred.
+ */
+static int get_connection(const char *arg,
+ HTParentAnchor *anchor)
+{
+ int status;
+ char *command = 0;
+ connection *con;
+ char *username = NULL;
+ char *password = NULL;
+ static BOOLEAN firstuse = TRUE;
+
+ if (firstuse) {
+ /*
+ * Set up freeing at exit. - FM
+ */
+#ifdef LY_FIND_LEAKS
+ atexit(free_FTPGlobals);
+#endif
+ firstuse = FALSE;
+ }
+
+ if (control != 0) {
+ connection *next = control->next;
+
+ if (control->socket != -1) {
+ NETCLOSE(control->socket);
+ }
+ memset(con = control, 0, sizeof(*con));
+ con->next = next;
+ } else {
+ con = typecalloc(connection);
+ if (con == NULL)
+ outofmem(__FILE__, "get_connection");
+ }
+ con->socket = -1;
+
+ if (isEmpty(arg)) {
+ free(con);
+ return -1; /* Bad if no name specified */
+ }
+
+ /* Get node name:
+ */
+ CTRACE((tfp, "get_connection(%s)\n", arg));
+ {
+ char *p1 = HTParse(arg, "", PARSE_HOST);
+ char *p2 = strrchr(p1, '@'); /* user? */
+ char *pw = NULL;
+
+ if (p2 != NULL) {
+ username = p1;
+ *p2 = '\0'; /* terminate */
+ p1 = p2 + 1; /* point to host */
+ pw = StrChr(username, ':');
+ if (pw != NULL) {
+ *pw++ = '\0';
+ password = HTUnEscape(pw);
+ }
+ if (*username)
+ HTUnEscape(username);
+
+ /*
+ * If the password doesn't exist then we are going to have to ask
+ * the user for it. The only problem is that we don't want to ask
+ * for it every time, so we will store away in a primitive fashion.
+ */
+ if (!password) {
+ char *tmp = NULL;
+
+ HTSprintf0(&tmp, "%s@%s", username, p1);
+ /*
+ * If the user@host is not equal to the last time through or
+ * user_entered_password has no data then we need to ask the
+ * user for the password.
+ */
+ if (!last_username_and_host ||
+ strcmp(tmp, last_username_and_host) ||
+ !user_entered_password) {
+
+ StrAllocCopy(last_username_and_host, tmp);
+ HTSprintf0(&tmp, gettext("Enter password for user %s@%s:"),
+ username, p1);
+ FREE(user_entered_password);
+ user_entered_password = HTPromptPassword(tmp, NULL);
+
+ } /* else we already know the password */
+ password = user_entered_password;
+ FREE(tmp);
+ }
+ }
+
+ if (!username)
+ FREE(p1);
+ } /* scope of p1 */
+
+ status = HTDoConnect(arg, "FTP", IPPORT_FTP, (int *) &con->socket);
+
+ if (status < 0) {
+ if (status == HT_INTERRUPTED) {
+ CTRACE((tfp, "HTFTP: Interrupted on connect\n"));
+ } else {
+ CTRACE((tfp, "HTFTP: Unable to connect to remote host for `%s'.\n",
+ arg));
+ }
+ if (status == HT_INTERRUPTED) {
+ _HTProgress(CONNECTION_INTERRUPTED);
+ status = HT_NOT_LOADED;
+ } else {
+ HTAlert(gettext("Unable to connect to FTP host."));
+ }
+ if (con->socket != -1) {
+ NETCLOSE(con->socket);
+ }
+
+ FREE(username);
+ if (control == con)
+ control = NULL;
+ FREE(con);
+ return status; /* Bad return */
+ }
+
+ CTRACE((tfp, "FTP connected, socket %d control %p\n",
+ con->socket, (void *) con));
+ control = con; /* Current control connection */
+
+ /* Initialise buffering for control connection */
+ HTInitInput(control->socket);
+ init_help_message_cache(); /* Clear the login message buffer. */
+
+ /* Now we log in Look up username, prompt for pw.
+ */
+ status = response(NULL); /* Get greeting */
+ CheckForInterrupt("at beginning of login");
+
+ server_type = GENERIC_SERVER; /* reset */
+ if (status == 2) { /* Send username */
+ char *cp; /* look at greeting text */
+
+ /* don't gettext() this -- incoming text: */
+ if (strlen(response_text) > 4) {
+ if ((cp = strstr(response_text, " awaits your command")) ||
+ (cp = strstr(response_text, " ready."))) {
+ *cp = '\0';
+ }
+ cp = response_text + 4;
+ if (!strncasecomp(cp, "NetPresenz", 10))
+ server_type = NETPRESENZ_SERVER;
+ } else {
+ cp = response_text;
+ }
+ StrAllocCopy(anchor->server, cp);
+
+ status = send_cmd_2("USER", (username && *username)
+ ? username
+ : "anonymous");
+
+ CheckForInterrupt("while sending username");
+ }
+ if (status == 3) { /* Send password */
+ if (non_empty(password)) {
+ HTSprintf0(&command, "PASS %s%c%c", password, CR, LF);
+ } else {
+ /*
+ * No password was given; use mail-address.
+ */
+ const char *the_address;
+ char *user = NULL;
+ const char *host = NULL;
+ char *cp;
+
+ the_address = anonftp_password;
+ if (isEmpty(the_address))
+ the_address = personal_mail_address;
+ if (isEmpty(the_address))
+ the_address = LYGetEnv("USER");
+ if (isEmpty(the_address))
+ the_address = "WWWuser";
+
+ StrAllocCopy(user, the_address);
+ if ((cp = StrChr(user, '@')) != NULL) {
+ *cp++ = '\0';
+ if (*cp == '\0')
+ host = HTHostName();
+ else
+ host = cp;
+ } else {
+ host = HTHostName();
+ }
+
+ /*
+ * If host is not fully qualified, suppress it
+ * as ftp.uu.net prefers a blank to a bad name
+ */
+ if (!(host) || StrChr(host, '.') == NULL)
+ host = "";
+
+ HTSprintf0(&command, "PASS %s@%s%c%c", user, host, CR, LF);
+ FREE(user);
+ }
+ status = response(command);
+ FREE(command);
+ CheckForInterrupt("while sending password");
+ }
+ FREE(username);
+
+ if (status == 3) {
+ status = send_cmd_1("ACCT noaccount");
+ CheckForInterrupt("while sending password");
+ }
+ if (status != 2) {
+ CTRACE((tfp, "HTFTP: Login fail: %s", response_text));
+ /* if (control->socket > 0) close_connection(control->socket); */
+ return -1; /* Bad return */
+ }
+ CTRACE((tfp, "HTFTP: Logged in.\n"));
+
+ /* Check for host type */
+ if (server_type != NETPRESENZ_SERVER)
+ server_type = GENERIC_SERVER; /* reset */
+ use_list = FALSE; /* reset */
+ if (response("SYST\r\n") == 2) {
+ /* we got a line -- what kind of server are we talking to? */
+ if (StrNCmp(response_text + 4,
+ "UNIX Type: L8 MAC-OS MachTen", 28) == 0) {
+ server_type = MACHTEN_SERVER;
+ use_list = TRUE;
+ CTRACE((tfp, "HTFTP: Treating as MachTen server.\n"));
+
+ } else if (strstr(response_text + 4, "UNIX") != NULL ||
+ strstr(response_text + 4, "Unix") != NULL) {
+ server_type = UNIX_SERVER;
+ unsure_type = FALSE; /* to the best of out knowledge... */
+ use_list = TRUE;
+ CTRACE((tfp, "HTFTP: Treating as Unix server.\n"));
+
+ } else if (strstr(response_text + 4, "MSDOS") != NULL) {
+ server_type = MSDOS_SERVER;
+ use_list = TRUE;
+ CTRACE((tfp, "HTFTP: Treating as MSDOS (Unix emulation) server.\n"));
+
+ } else if (StrNCmp(response_text + 4, "VMS", 3) == 0) {
+ char *tilde = strstr(arg, "/~");
+
+ use_list = TRUE;
+ if (tilde != 0
+ && tilde[2] != 0
+ && strstr(response_text + 4, "MadGoat") != 0) {
+ server_type = UNIX_SERVER;
+ CTRACE((tfp, "HTFTP: Treating VMS as UNIX server.\n"));
+ } else {
+ server_type = VMS_SERVER;
+ CTRACE((tfp, "HTFTP: Treating as VMS server.\n"));
+ }
+
+ } else if ((StrNCmp(response_text + 4, "VM/CMS", 6) == 0) ||
+ (StrNCmp(response_text + 4, "VM ", 3) == 0)) {
+ server_type = CMS_SERVER;
+ use_list = TRUE;
+ CTRACE((tfp, "HTFTP: Treating as CMS server.\n"));
+
+ } else if (StrNCmp(response_text + 4, "DCTS", 4) == 0) {
+ server_type = DCTS_SERVER;
+ CTRACE((tfp, "HTFTP: Treating as DCTS server.\n"));
+
+ } else if (strstr(response_text + 4, "MAC-OS TCP/Connect II") != NULL) {
+ server_type = TCPC_SERVER;
+ CTRACE((tfp, "HTFTP: Looks like a TCPC server.\n"));
+ get_ftp_pwd(&server_type, &use_list);
+ unsure_type = TRUE;
+
+ } else if (server_type == NETPRESENZ_SERVER) { /* already set above */
+ use_list = TRUE;
+ set_mac_binary(server_type);
+ CTRACE((tfp, "HTFTP: Treating as NetPresenz (MACOS) server.\n"));
+
+ } else if (StrNCmp(response_text + 4, "MACOS Peter's Server", 20) == 0) {
+ server_type = PETER_LEWIS_SERVER;
+ use_list = TRUE;
+ set_mac_binary(server_type);
+ CTRACE((tfp, "HTFTP: Treating as Peter Lewis (MACOS) server.\n"));
+
+ } else if (StrNCmp(response_text + 4, "Windows_NT", 10) == 0) {
+ server_type = WINDOWS_NT_SERVER;
+ CTRACE((tfp, "HTFTP: Treating as Window_NT server.\n"));
+ set_unix_dirstyle(&server_type, &use_list);
+
+ } else if (StrNCmp(response_text + 4, "Windows2000", 11) == 0) {
+ server_type = WINDOWS_2K_SERVER;
+ CTRACE((tfp, "HTFTP: Treating as Window_2K server.\n"));
+ set_unix_dirstyle(&server_type, &use_list);
+
+ } else if (StrNCmp(response_text + 4, "MS Windows", 10) == 0) {
+ server_type = MS_WINDOWS_SERVER;
+ use_list = TRUE;
+ CTRACE((tfp, "HTFTP: Treating as MS Windows server.\n"));
+
+ } else if (StrNCmp(response_text + 4,
+ "MACOS AppleShare IP FTP Server", 30) == 0) {
+ server_type = APPLESHARE_SERVER;
+ use_list = TRUE;
+ set_mac_binary(server_type);
+ CTRACE((tfp, "HTFTP: Treating as AppleShare server.\n"));
+
+ } else {
+ server_type = GENERIC_SERVER;
+ CTRACE((tfp, "HTFTP: Ugh! A Generic server.\n"));
+ get_ftp_pwd(&server_type, &use_list);
+ unsure_type = TRUE;
+ }
+ } else {
+ /* SYST fails :( try to get the type from the PWD command */
+ get_ftp_pwd(&server_type, &use_list);
+ }
+
+ return con->socket; /* Good return */
+}
+
+static void reset_master_socket(void)
+{
+ have_socket = FALSE;
+}
+
+static void set_master_socket(int value)
+{
+ have_socket = (BOOLEAN) (value >= 0);
+ if (have_socket)
+ master_socket = (LYNX_FD) value;
+}
+
+/* Close Master (listening) socket
+ * -------------------------------
+ *
+ *
+ */
+static int close_master_socket(void)
+{
+ int status;
+
+ if (have_socket)
+ FD_CLR(master_socket, &open_sockets);
+
+ status = NETCLOSE((int) master_socket);
+ CTRACE((tfp, "HTFTP: Closed master socket %u\n", (unsigned) master_socket));
+
+ reset_master_socket();
+
+ if (status < 0)
+ return HTInetStatus(gettext("close master socket"));
+ else
+ return status;
+}
+
+/* Open a master socket for listening on
+ * -------------------------------------
+ *
+ * When data is transferred, we open a port, and wait for the server to
+ * connect with the data.
+ *
+ * On entry,
+ * have_socket Must be false, if master_socket is not setup already
+ * master_socket Must be negative if not set up already.
+ * On exit,
+ * Returns socket number if good
+ * less than zero if error.
+ * master_socket is socket number if good, else negative.
+ * port_number is valid if good.
+ */
+static int get_listen_socket(void)
+{
+ LY_SOCKADDR soc_A;
+
+#ifdef INET6
+ unsigned short af;
+ LY_SOCKLEN slen;
+#endif /* INET6 */
+ int new_socket; /* Will be master_socket */
+
+ FD_ZERO(&open_sockets); /* Clear our record of open sockets */
+ num_sockets = 0;
+
+ FREE(port_command);
+#ifndef REPEAT_LISTEN
+ if (have_socket)
+ return master_socket; /* Done already */
+#endif /* !REPEAT_LISTEN */
+
+#ifdef INET6
+ /* query address family of control connection */
+ memset(&soc_A, 0, sizeof(soc_A));
+ slen = (LY_SOCKLEN) sizeof(soc_A);
+ if (getsockname(control->socket, SOCKADDR_OF(soc_A), &slen) < 0) {
+ return HTInetStatus("getsockname failed");
+ }
+ af = SOCKADDR_OF(soc_A)->sa_family;
+#endif /* INET6 */
+
+/* Create internet socket
+*/
+#ifdef INET6
+ new_socket = socket(af, SOCK_STREAM, IPPROTO_TCP);
+#else
+ new_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+#endif /* INET6 */
+
+ if (new_socket < 0)
+ return HTInetStatus(gettext("socket for master socket"));
+
+ CTRACE((tfp, "HTFTP: Opened master socket number %d\n", new_socket));
+
+/* Search for a free port.
+*/
+#ifdef INET6
+ memset(&soc_A, 0, sizeof(soc_A));
+ SOCKADDR_OF(soc_A)->sa_family = (unsigned short) af;
+ switch (af) {
+ case AF_INET:
+#ifdef SIN6_LEN
+ SOCKADDR_OF(soc_A)->sa_len = sizeof(struct sockaddr_in);
+#endif /* SIN6_LEN */
+ break;
+ case AF_INET6:
+#ifdef SIN6_LEN
+ SOCKADDR_OF(soc_A)->sa_len = sizeof(struct sockaddr_in6);
+#endif /* SIN6_LEN */
+ break;
+ default:
+ HTInetStatus("AF");
+ }
+#else
+ soc_A.soc_in.sin_family = AF_INET; /* Family = internet, host order */
+ soc_A.soc_in.sin_addr.s_addr = INADDR_ANY; /* Any peer address */
+#endif /* INET6 */
+#ifdef POLL_PORTS
+ {
+ PortNumber old_port_number = port_number;
+
+ for (port_number = (old_port_number + 1);; port_number++) {
+ int status;
+
+ if (port_number > LAST_TCP_PORT)
+ port_number = FIRST_TCP_PORT;
+ if (port_number == old_port_number) {
+ return HTInetStatus("bind");
+ }
+#ifdef INET6
+ soc_A.soc_in.sin_port = htons(port_number);
+#else
+ soc_A.sin_port = htons(port_number);
+#endif /* INET6 */
+#ifdef SOCKS
+ if (socks_flag)
+ if ((status = Rbind(new_socket,
+ SOCKADDR_OF(soc_A),
+ SOCKADDR_LEN(soc_A))) == 0) {
+ break;
+ } else
+#endif /* SOCKS */
+ if ((status = bind(new_socket,
+ SOCKADDR_OF(soc_A),
+ SOCKADDR_LEN(soc_A)
+ )) == 0) {
+ break;
+ }
+ CTRACE((tfp, "TCP bind attempt to port %d yields %d, errno=%d\n",
+ port_number, status, SOCKET_ERRNO));
+ } /* for */
+ }
+#else
+ {
+ int status;
+ LY_SOCKLEN address_length = (LY_SOCKLEN) sizeof(soc_A);
+
+#ifdef SOCKS
+ if (socks_flag)
+ status = Rgetsockname(control->socket,
+ SOCKADDR_OF(soc_A),
+ &address_length);
+ else
+#endif /* SOCKS */
+ status = getsockname(control->socket,
+ SOCKADDR_OF(soc_A),
+ &address_length);
+ if (status < 0) {
+ close(new_socket);
+ return HTInetStatus("getsockname");
+ }
+ CTRACE((tfp, "HTFTP: This host is %s\n",
+ HTInetString((void *) &soc_A.soc_in)));
+
+ soc_A.soc_in.sin_port = 0; /* Unspecified: please allocate */
+#ifdef SOCKS
+ if (socks_flag)
+ status = Rbind(new_socket,
+ SOCKADDR_OF(soc_A),
+ sizeof(soc_A));
+ else
+#endif /* SOCKS */
+ status = bind(new_socket,
+ SOCKADDR_OF(soc_A),
+ SOCKADDR_LEN(soc_A));
+ if (status < 0) {
+ close(new_socket);
+ return HTInetStatus("bind");
+ }
+
+ address_length = sizeof(soc_A);
+#ifdef SOCKS
+ if (socks_flag)
+ status = Rgetsockname(new_socket,
+ SOCKADDR_OF(soc_A),
+ &address_length);
+ else
+#endif /* SOCKS */
+ status = getsockname(new_socket,
+ SOCKADDR_OF(soc_A),
+ &address_length);
+ if (status < 0) {
+ close(new_socket);
+ return HTInetStatus("getsockname");
+ }
+ }
+#endif /* POLL_PORTS */
+
+ CTRACE((tfp, "HTFTP: bound to port %d on %s\n",
+ (int) ntohs(soc_A.soc_in.sin_port),
+ HTInetString((void *) &soc_A.soc_in)));
+
+#ifdef REPEAT_LISTEN
+ if (have_socket)
+ (void) close_master_socket();
+#endif /* REPEAT_LISTEN */
+
+ set_master_socket(new_socket);
+
+/* Now we must find out who we are to tell the other guy
+*/
+ (void) HTHostName(); /* Make address valid - doesn't work */
+#ifdef INET6
+ switch (SOCKADDR_OF(soc_A)->sa_family) {
+ case AF_INET:
+#endif /* INET6 */
+ HTSprintf0(&port_command, "PORT %d,%d,%d,%d,%d,%d%c%c",
+ (int) *((unsigned char *) (&soc_A.soc_in.sin_addr) + 0),
+ (int) *((unsigned char *) (&soc_A.soc_in.sin_addr) + 1),
+ (int) *((unsigned char *) (&soc_A.soc_in.sin_addr) + 2),
+ (int) *((unsigned char *) (&soc_A.soc_in.sin_addr) + 3),
+ (int) *((unsigned char *) (&soc_A.soc_in.sin_port) + 0),
+ (int) *((unsigned char *) (&soc_A.soc_in.sin_port) + 1),
+ CR, LF);
+
+#ifdef INET6
+ break;
+
+ case AF_INET6:
+ {
+ char hostbuf[MAXHOSTNAMELEN];
+ char portbuf[MAXHOSTNAMELEN];
+
+ getnameinfo(SOCKADDR_OF(soc_A),
+ SOCKADDR_LEN(soc_A),
+ hostbuf,
+ (socklen_t) sizeof(hostbuf),
+ portbuf,
+ (socklen_t) sizeof(portbuf),
+ NI_NUMERICHOST | NI_NUMERICSERV);
+ HTSprintf0(&port_command, "EPRT |%d|%s|%s|%c%c", 2, hostbuf, portbuf,
+ CR, LF);
+ break;
+ }
+ default:
+ HTSprintf0(&port_command, "JUNK%c%c", CR, LF);
+ break;
+ }
+#endif /* INET6 */
+ if (port_command == NULL)
+ return -1;
+
+ /* Inform TCP that we will accept connections
+ */
+ {
+ int status;
+
+#ifdef SOCKS
+ if (socks_flag)
+ status = Rlisten((int) master_socket, 1);
+ else
+#endif /* SOCKS */
+ status = listen((int) master_socket, 1);
+ if (status < 0) {
+ reset_master_socket();
+ return HTInetStatus("listen");
+ }
+ }
+ CTRACE((tfp, "TCP: Master socket(), bind() and listen() all OK\n"));
+ FD_SET(master_socket, &open_sockets);
+ if ((master_socket + 1) > num_sockets)
+ num_sockets = master_socket + 1;
+
+ return (int) master_socket; /* Good */
+
+} /* get_listen_socket */
+
+static const char *months[12] =
+{
+ "Jan", "Feb", "Mar", "Apr", "May", "Jun",
+ "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
+};
+
+/* Procedure: Set the current and last year strings and date integer
+ * -----------------------------------------------------------------
+ *
+ * Bug:
+ * This code is for sorting listings by date, if that option
+ * is selected in Lynx, and doesn't take into account time
+ * zones or ensure resetting at midnight, so the sort may not
+ * be perfect, but the actual date isn't changed in the display,
+ * i.e., the date is still correct. - FM
+ */
+static void set_years_and_date(void)
+{
+ char day[8], month[8], date[12];
+ time_t NowTime;
+ int i;
+ char *printable;
+
+ NowTime = time(NULL);
+ printable = ctime(&NowTime);
+ LYStrNCpy(day, printable + 8, 2);
+ if (day[0] == ' ') {
+ day[0] = '0';
+ }
+ LYStrNCpy(month, printable + 4, 3);
+ for (i = 0; i < 12; i++) {
+ if (!strcasecomp(month, months[i])) {
+ break;
+ }
+ }
+ i++;
+ sprintf(date, "9999%02d%.2s", i % 100, day);
+ TheDate = atoi(date);
+ LYStrNCpy(ThisYear, printable + 20, 4);
+ sprintf(LastYear, "%d", (atoi(ThisYear) - 1) % 10000);
+ HaveYears = TRUE;
+}
+
+typedef struct _EntryInfo {
+ char *filename;
+ char *linkname; /* symbolic link, if any */
+ char *type;
+ char *date;
+ off_t size;
+ BOOLEAN display; /* show this entry? */
+#ifdef LONG_LIST
+ unsigned long file_links;
+ char *file_mode;
+ char *file_user;
+ char *file_group;
+#endif
+} EntryInfo;
+
+static void free_entryinfo_struct_contents(EntryInfo *entry_info)
+{
+ if (entry_info) {
+#ifdef LONG_LIST
+ FREE(entry_info->file_mode);
+ FREE(entry_info->file_user);
+ FREE(entry_info->file_group);
+#endif
+ FREE(entry_info->filename);
+ FREE(entry_info->linkname);
+ FREE(entry_info->type);
+ FREE(entry_info->date);
+ }
+ /* don't free the struct */
+}
+
+/*
+ * is_ls_date() --
+ * Return TRUE if s points to a string of the form:
+ * "Sep 1 1990 " or
+ * "Sep 11 11:59 " or
+ * "Dec 12 1989 " or
+ * "FCv 23 1990 " ...
+ */
+static BOOLEAN is_ls_date(char *s)
+{
+ /* must start with three alpha characters */
+ if (!isalpha(UCH(*s++)) || !isalpha(UCH(*s++)) || !isalpha(UCH(*s++)))
+ return FALSE;
+
+ /* space or HT_NON_BREAK_SPACE */
+ if (!(*s == ' ' || *s == HT_NON_BREAK_SPACE)) {
+ return FALSE;
+ }
+ s++;
+
+ /* space or digit */
+ if (!(*s == ' ' || isdigit(UCH(*s)))) {
+ return FALSE;
+ }
+ s++;
+
+ /* digit */
+ if (!isdigit(UCH(*s++)))
+ return FALSE;
+
+ /* space */
+ if (*s++ != ' ')
+ return FALSE;
+
+ /* space or digit */
+ if (!(*s == ' ' || isdigit(UCH(*s)))) {
+ return FALSE;
+ }
+ s++;
+
+ /* digit */
+ if (!isdigit(UCH(*s++)))
+ return FALSE;
+
+ /* colon or digit */
+ if (!(*s == ':' || isdigit(UCH(*s)))) {
+ return FALSE;
+ }
+ s++;
+
+ /* digit */
+ if (!isdigit(UCH(*s++)))
+ return FALSE;
+
+ /* space or digit */
+ if (!(*s == ' ' || isdigit(UCH(*s)))) {
+ return FALSE;
+ }
+ s++;
+
+ /* space */
+ if (*s != ' ')
+ return FALSE;
+
+ return TRUE;
+} /* is_ls_date() */
+
+/*
+ * Extract the name, size, and date from an EPLF line. - 08-06-96 DJB
+ */
+static void parse_eplf_line(char *line,
+ EntryInfo *info)
+{
+ char *cp = line;
+ char ct[26];
+ off_t size;
+ time_t secs;
+ static time_t base; /* time() value on this OS in 1970 */
+ static int flagbase = 0;
+
+ if (!flagbase) {
+ struct tm t;
+
+ t.tm_year = 70;
+ t.tm_mon = 0;
+ t.tm_mday = 0;
+ t.tm_hour = 0;
+ t.tm_min = 0;
+ t.tm_sec = 0;
+ t.tm_isdst = -1;
+ base = mktime(&t); /* could return -1 */
+ flagbase = 1;
+ }
+
+ while (*cp) {
+ switch (*cp) {
+ case '\t':
+ StrAllocCopy(info->filename, cp + 1);
+ return;
+ case 's':
+ size = 0;
+ while (*(++cp) && (*cp != ','))
+ size = (size * 10) + (off_t) (*cp - '0');
+ info->size = size;
+ break;
+ case 'm':
+ secs = 0;
+ while (*(++cp) && (*cp != ','))
+ secs = (secs * 10) + (*cp - '0');
+ secs += base; /* assumes that time_t is #seconds */
+ LYStrNCpy(ct, ctime(&secs), 24);
+ StrAllocCopy(info->date, ct);
+ break;
+ case '/':
+ StrAllocCopy(info->type, ENTRY_IS_DIRECTORY);
+ /* FALLTHRU */
+ default:
+ while (*cp) {
+ if (*cp++ == ',')
+ break;
+ }
+ break;
+ }
+ }
+} /* parse_eplf_line */
+
+/*
+ * Extract the name, size, and date from an ls -l line.
+ */
+static void parse_ls_line(char *line,
+ EntryInfo *entry)
+{
+#ifdef LONG_LIST
+ char *next;
+ char *cp;
+#endif
+ int i, j;
+ off_t base = 1;
+ off_t size_num = 0;
+
+ for (i = (int) strlen(line) - 1;
+ (i > 13) && (!isspace(UCH(line[i])) || !is_ls_date(&line[i - 12]));
+ i--) {
+ ; /* null body */
+ }
+ line[i] = '\0';
+ if (i > 13) {
+ StrAllocCopy(entry->date, &line[i - 12]);
+ /* replace the 4th location with nbsp if it is a space or zero */
+ if (entry->date[4] == ' ' || entry->date[4] == '0')
+ entry->date[4] = HT_NON_BREAK_SPACE;
+ /* make sure year or time is flush right */
+ if (entry->date[11] == ' ') {
+ for (j = 11; j > 6; j--) {
+ entry->date[j] = entry->date[j - 1];
+ }
+ }
+ }
+ j = i - 14;
+ while (isdigit(UCH(line[j]))) {
+ size_num += ((off_t) (line[j] - '0') * base);
+ base *= 10;
+ j--;
+ }
+ entry->size = size_num;
+ StrAllocCopy(entry->filename, &line[i + 1]);
+
+#ifdef LONG_LIST
+ line[j] = '\0';
+
+ /*
+ * Extract the file-permissions, as a string.
+ */
+ if ((cp = StrChr(line, ' ')) != 0) {
+ if ((cp - line) == 10) {
+ *cp = '\0';
+ StrAllocCopy(entry->file_mode, line);
+ *cp = ' ';
+ }
+
+ /*
+ * Next is the link-count.
+ */
+ next = 0;
+ entry->file_links = (unsigned long) strtol(cp, &next, 10);
+ if (next == 0 || *next != ' ') {
+ entry->file_links = 0;
+ next = cp;
+ } else {
+ cp = next;
+ }
+ /*
+ * Next is the user-name.
+ */
+ while (isspace(UCH(*cp)))
+ ++cp;
+ if ((next = StrChr(cp, ' ')) != 0)
+ *next = '\0';
+ if (*cp != '\0')
+ StrAllocCopy(entry->file_user, cp);
+ /*
+ * Next is the group-name (perhaps).
+ */
+ if (next != NULL) {
+ cp = (next + 1);
+ while (isspace(UCH(*cp)))
+ ++cp;
+ if ((next = StrChr(cp, ' ')) != 0)
+ *next = '\0';
+ if (*cp != '\0')
+ StrAllocCopy(entry->file_group, cp);
+ }
+ }
+#endif
+}
+
+/*
+ * Extract the name and size info and whether it refers to a directory from a
+ * LIST line in "dls" format.
+ */
+static void parse_dls_line(char *line,
+ EntryInfo *entry_info,
+ char **pspilledname)
+{
+ short j;
+ int base = 1;
+ off_t size_num = 0;
+ int len;
+ char *cps = NULL;
+
+ /* README 763 Information about this server\0
+ bin/ - \0
+ etc/ = \0
+ ls-lR 0 \0
+ ls-lR.Z 3 \0
+ pub/ = Public area\0
+ usr/ - \0
+ morgan 14 -> ../real/morgan\0
+ TIMIT.mostlikely.Z\0
+ 79215 \0
+ */
+
+ len = (int) strlen(line);
+ if (len == 0) {
+ FREE(*pspilledname);
+ entry_info->display = FALSE;
+ return;
+ }
+ cps = LYSkipNonBlanks(line);
+ if (*cps == '\0') { /* only a filename, save it and return. */
+ StrAllocCopy(*pspilledname, line);
+ entry_info->display = FALSE;
+ return;
+ }
+ if (len < 24 || line[23] != ' ' ||
+ (isspace(UCH(line[0])) && !*pspilledname)) {
+ /* this isn't the expected "dls" format! */
+ if (!isspace(UCH(line[0])))
+ *cps = '\0';
+ if (*pspilledname && !*line) {
+ entry_info->filename = *pspilledname;
+ *pspilledname = NULL;
+ if (entry_info->filename[strlen(entry_info->filename) - 1] == '/')
+ StrAllocCopy(entry_info->type, ENTRY_IS_DIRECTORY);
+ else
+ StrAllocCopy(entry_info->type, "");
+ } else {
+ StrAllocCopy(entry_info->filename, line);
+ if (cps != line && *(cps - 1) == '/')
+ StrAllocCopy(entry_info->type, ENTRY_IS_DIRECTORY);
+ else
+ StrAllocCopy(entry_info->type, "");
+ FREE(*pspilledname);
+ }
+ return;
+ }
+
+ j = 22;
+ if (line[j] == '=' || line[j] == '-') {
+ StrAllocCopy(entry_info->type, ENTRY_IS_DIRECTORY);
+ } else {
+ while (isdigit(UCH(line[j]))) {
+ size_num += (line[j] - '0') * base;
+ base *= 10;
+ j--;
+ }
+ }
+ entry_info->size = size_num;
+
+ cps = LYSkipBlanks(&line[23]);
+ if (!StrNCmp(cps, "-> ", 3) && cps[3] != '\0' && cps[3] != ' ') {
+ StrAllocCopy(entry_info->type, ENTRY_IS_SYMBOLIC_LINK);
+ StrAllocCopy(entry_info->linkname, LYSkipBlanks(cps + 3));
+ entry_info->size = 0; /* don't display size */
+ }
+
+ if (j > 0)
+ line[j] = '\0';
+
+ LYTrimTrailing(line);
+
+ len = (int) strlen(line);
+ if (len == 0 && *pspilledname && **pspilledname) {
+ line = *pspilledname;
+ len = (int) strlen(*pspilledname);
+ }
+ if (len > 0 && line[len - 1] == '/') {
+ /*
+ * It's a dir, remove / and mark it as such.
+ */
+ if (len > 1)
+ line[len - 1] = '\0';
+ if (!entry_info->type)
+ StrAllocCopy(entry_info->type, ENTRY_IS_DIRECTORY);
+ }
+
+ StrAllocCopy(entry_info->filename, line);
+ FREE(*pspilledname);
+} /* parse_dls_line() */
+
+/*
+ * parse_vms_dir_entry()
+ * Format the name, date, and size from a VMS LIST line
+ * into the EntryInfo structure - FM
+ */
+static void parse_vms_dir_entry(char *line,
+ EntryInfo *entry_info)
+{
+ int i, j;
+ off_t ialloc;
+ char *cp, *cpd, *cps, date[16];
+ const char *sp = " ";
+
+ /* Get rid of blank lines, and information lines. Valid lines have the ';'
+ * version number token.
+ */
+ if (!strlen(line) || (cp = StrChr(line, ';')) == NULL) {
+ entry_info->display = FALSE;
+ return;
+ }
+
+ /* Cut out file or directory name at VMS version number. */
+ *cp++ = '\0';
+ StrAllocCopy(entry_info->filename, line);
+
+ /* Cast VMS non-README file and directory names to lowercase. */
+ if (strstr(entry_info->filename, "READ") == NULL) {
+ LYLowerCase(entry_info->filename);
+ i = (int) strlen(entry_info->filename);
+ } else {
+ i = (int) ((strstr(entry_info->filename, "READ")
+ - entry_info->filename)
+ + 4);
+ if (!StrNCmp(&entry_info->filename[i], "ME", 2)) {
+ i += 2;
+ while (entry_info->filename[i] && entry_info->filename[i] != '.') {
+ i++;
+ }
+ } else if (!StrNCmp(&entry_info->filename[i], ".ME", 3)) {
+ i = (int) strlen(entry_info->filename);
+ } else {
+ i = 0;
+ }
+ LYLowerCase(entry_info->filename + i);
+ }
+
+ /* Uppercase terminal .z's or _z's. */
+ if ((--i > 2) &&
+ entry_info->filename[i] == 'z' &&
+ (entry_info->filename[i - 1] == '.' ||
+ entry_info->filename[i - 1] == '_'))
+ entry_info->filename[i] = 'Z';
+
+ /* Convert any tabs in rest of line to spaces. */
+ cps = cp - 1;
+ while ((cps = StrChr(cps + 1, '\t')) != NULL)
+ *cps = ' ';
+
+ /* Collapse serial spaces. */
+ i = 0;
+ j = 1;
+ cps = cp;
+ while (cps[j] != '\0') {
+ if (cps[i] == ' ' && cps[j] == ' ')
+ j++;
+ else
+ cps[++i] = cps[j++];
+ }
+ cps[++i] = '\0';
+
+ /* Set the years and date, if we don't have them yet. * */
+ if (!HaveYears) {
+ set_years_and_date();
+ }
+
+ /* Track down the date. */
+ if ((cpd = StrChr(cp, '-')) != NULL &&
+ strlen(cpd) > 9 && isdigit(UCH(*(cpd - 1))) &&
+ isalpha(UCH(*(cpd + 1))) && *(cpd + 4) == '-') {
+
+ /* Month */
+ *(cpd + 2) = (char) TOLOWER(*(cpd + 2));
+ *(cpd + 3) = (char) TOLOWER(*(cpd + 3));
+ sprintf(date, "%.3s ", cpd + 1);
+
+ /* Day */
+ if (isdigit(UCH(*(cpd - 2))))
+ sprintf(date + 4, "%.2s ", cpd - 2);
+ else
+ sprintf(date + 4, "%c%.1s ", HT_NON_BREAK_SPACE, cpd - 1);
+
+ /* Time or Year */
+ if (!StrNCmp(ThisYear, cpd + 5, 4) &&
+ strlen(cpd) > 15 && *(cpd + 12) == ':') {
+ sprintf(date + 7, "%.5s", cpd + 10);
+ } else {
+ sprintf(date + 7, " %.4s", cpd + 5);
+ }
+
+ StrAllocCopy(entry_info->date, date);
+ }
+
+ /* Track down the size */
+ if ((cpd = StrChr(cp, '/')) != NULL) {
+ /* Appears be in used/allocated format */
+ cps = cpd;
+ while (isdigit(UCH(*(cps - 1))))
+ cps--;
+ if (cps < cpd)
+ *cpd = '\0';
+ entry_info->size = LYatoll(cps);
+ cps = cpd + 1;
+ while (isdigit(UCH(*cps)))
+ cps++;
+ *cps = '\0';
+ ialloc = LYatoll(cpd + 1);
+ /* Check if used is in blocks or bytes */
+ if (entry_info->size <= ialloc)
+ entry_info->size *= 512;
+
+ } else if (strtok(cp, sp) != NULL) {
+ /* We just initialized on the version number */
+ /* Now let's hunt for a lone, size number */
+ while ((cps = strtok(NULL, sp)) != NULL) {
+ cpd = cps;
+ while (isdigit(UCH(*cpd)))
+ cpd++;
+ if (*cpd == '\0') {
+ /* Assume it's blocks */
+ entry_info->size = (LYatoll(cps) * 512);
+ break;
+ }
+ }
+ }
+
+ TRACE_ENTRY("VMS", entry_info);
+ return;
+} /* parse_vms_dir_entry() */
+
+/*
+ * parse_ms_windows_dir_entry() --
+ * Format the name, date, and size from an MS_WINDOWS LIST line into
+ * the EntryInfo structure (assumes Chameleon NEWT format). - FM
+ */
+static void parse_ms_windows_dir_entry(char *line,
+ EntryInfo *entry_info)
+{
+ char *cp = line;
+ char *cps, *cpd, date[16];
+ char *end = line + strlen(line);
+
+ /* Get rid of blank or junk lines. */
+ cp = LYSkipBlanks(cp);
+ if (!(*cp)) {
+ entry_info->display = FALSE;
+ return;
+ }
+
+ /* Cut out file or directory name. */
+ cps = LYSkipNonBlanks(cp);
+ *cps++ = '\0';
+ cpd = cps;
+ StrAllocCopy(entry_info->filename, cp);
+
+ /* Track down the size */
+ if (cps < end) {
+ cps = LYSkipBlanks(cps);
+ cpd = LYSkipNonBlanks(cps);
+ *cpd++ = '\0';
+ if (isdigit(UCH(*cps))) {
+ entry_info->size = LYatoll(cps);
+ } else {
+ StrAllocCopy(entry_info->type, ENTRY_IS_DIRECTORY);
+ }
+ } else {
+ StrAllocCopy(entry_info->type, "");
+ }
+
+ /* Set the years and date, if we don't have them yet. * */
+ if (!HaveYears) {
+ set_years_and_date();
+ }
+
+ /* Track down the date. */
+ if (cpd < end) {
+ cpd = LYSkipBlanks(cpd);
+ if (strlen(cpd) > 17) {
+ *(cpd + 6) = '\0'; /* Month and Day */
+ *(cpd + 11) = '\0'; /* Year */
+ *(cpd + 17) = '\0'; /* Time */
+ if (strcmp(ThisYear, cpd + 7))
+ /* Not this year, so show the year */
+ sprintf(date, "%.6s %.4s", cpd, (cpd + 7));
+ else
+ /* Is this year, so show the time */
+ sprintf(date, "%.6s %.5s", cpd, (cpd + 12));
+ StrAllocCopy(entry_info->date, date);
+ if (entry_info->date[4] == ' ' || entry_info->date[4] == '0') {
+ entry_info->date[4] = HT_NON_BREAK_SPACE;
+ }
+ }
+ }
+
+ TRACE_ENTRY("MS Windows", entry_info);
+ return;
+} /* parse_ms_windows_dir_entry */
+
+/*
+ * parse_windows_nt_dir_entry() --
+ * Format the name, date, and size from a WINDOWS_NT LIST line into
+ * the EntryInfo structure (assumes Chameleon NEWT format). - FM
+ */
+#ifdef NOTDEFINED
+static void parse_windows_nt_dir_entry(char *line,
+ EntryInfo *entry_info)
+{
+ char *cp = line;
+ char *cps, *cpd, date[16];
+ char *end = line + strlen(line);
+ int i;
+
+ /* Get rid of blank or junk lines. */
+ cp = LYSkipBlanks(cp);
+ if (!(*cp)) {
+ entry_info->display = FALSE;
+ return;
+ }
+
+ /* Cut out file or directory name. */
+ cpd = cp;
+ cps = LYSkipNonBlanks(end - 1);
+ cp = (cps + 1);
+ if (!strcmp(cp, ".") || !strcmp(cp, "..")) {
+ entry_info->display = FALSE;
+ return;
+ }
+ StrAllocCopy(entry_info->filename, cp);
+ if (cps < cpd)
+ return;
+ *cp = '\0';
+ end = cp;
+
+ /* Set the years and date, if we don't have them yet. * */
+ if (!HaveYears) {
+ set_years_and_date();
+ }
+
+ /* Cut out the date. */
+ cp = cps = cpd;
+ cps = LYSkipNonBlanks(cps);
+ *cps++ = '\0';
+ if (cps > end) {
+ entry_info->display = FALSE;
+ return;
+ }
+ cps = LYSkipBlanks(cps);
+ cpd = LYSkipNonBlanks(cps);
+ *cps++ = '\0';
+ if (cps > end || cpd == cps || strlen(cpd) < 7) {
+ entry_info->display = FALSE;
+ return;
+ }
+ if (strlen(cp) == 8 &&
+ isdigit(*cp) && isdigit(*(cp + 1)) && *(cp + 2) == '-' &&
+ isdigit(*(cp + 3)) && isdigit(*(cp + 4)) && *(cp + 5) == '-') {
+ *(cp + 2) = '\0'; /* Month */
+ i = atoi(cp) - 1;
+ *(cp + 5) = '\0'; /* Day */
+ sprintf(date, "%.3s %.2s", months[i], (cp + 3));
+ if (date[4] == '0')
+ date[4] = ' ';
+ cp += 6; /* Year */
+ if (strcmp((ThisYear + 2), cp)) {
+ /* Not this year, so show the year */
+ if (atoi(cp) < 70) {
+ sprintf(&date[6], " 20%.2s", cp);
+ } else {
+ sprintf(&date[6], " 19%.2s", cp);
+ }
+ } else {
+ /* Is this year, so show the time */
+ *(cpd + 2) = '\0'; /* Hour */
+ i = atoi(cpd);
+ if (*(cpd + 5) == 'P' || *(cpd + 5) == 'p')
+ i += 12;
+ sprintf(&date[6], " %02d:%.2s", i, (cpd + 3));
+ }
+ StrAllocCopy(entry_info->date, date);
+ if (entry_info->date[4] == ' ' || entry_info->date[4] == '0') {
+ entry_info->date[4] = HT_NON_BREAK_SPACE;
+ }
+ }
+
+ /* Track down the size */
+ if (cps < end) {
+ cps = LYSkipBlanks(cps);
+ cpd = LYSkipNonBlanks(cps);
+ *cpd = '\0';
+ if (isdigit(*cps)) {
+ entry_info->size = LYatoll(cps);
+ } else {
+ StrAllocCopy(entry_info->type, ENTRY_IS_DIRECTORY);
+ }
+ } else {
+ StrAllocCopy(entry_info->type, "");
+ }
+
+ /* Wrap it up */
+ CTRACE((tfp, "HTFTP: Windows NT filename: %s date: %s size: %d\n",
+ entry_info->filename,
+ NonNull(entry_info->date),
+ entry_info->size));
+ return;
+} /* parse_windows_nt_dir_entry */
+#endif /* NOTDEFINED */
+
+/*
+ * parse_cms_dir_entry() --
+ * Format the name, date, and size from a VM/CMS line into
+ * the EntryInfo structure. - FM
+ */
+static void parse_cms_dir_entry(char *line,
+ EntryInfo *entry_info)
+{
+ char *cp = line;
+ char *cps, *cpd, date[16];
+ char *end = line + strlen(line);
+ int RecordLength = 0;
+ int Records = 0;
+ int i;
+
+ /* Get rid of blank or junk lines. */
+ cp = LYSkipBlanks(cp);
+ if (!(*cp)) {
+ entry_info->display = FALSE;
+ return;
+ }
+
+ /* Cut out file or directory name. */
+ cps = LYSkipNonBlanks(cp);
+ *cps++ = '\0';
+ StrAllocCopy(entry_info->filename, cp);
+ if (StrChr(entry_info->filename, '.') != NULL)
+ /* If we already have a dot, we did an NLST. */
+ return;
+ cp = LYSkipBlanks(cps);
+ if (!(*cp)) {
+ /* If we don't have more, we've misparsed. */
+ FREE(entry_info->filename);
+ FREE(entry_info->type);
+ entry_info->display = FALSE;
+ return;
+ }
+ cps = LYSkipNonBlanks(cp);
+ *cps++ = '\0';
+ if ((0 == strcasecomp(cp, "DIR")) && (cp - line) > 17) {
+ /* It's an SFS directory. */
+ StrAllocCopy(entry_info->type, ENTRY_IS_DIRECTORY);
+ entry_info->size = 0;
+ } else {
+ /* It's a file. */
+ cp--;
+ *cp = '.';
+ StrAllocCat(entry_info->filename, cp);
+
+ /* Track down the VM/CMS RECFM or type. */
+ cp = cps;
+ if (cp < end) {
+ cp = LYSkipBlanks(cp);
+ cps = LYSkipNonBlanks(cp);
+ *cps++ = '\0';
+ /* Check cp here, if it's relevant someday. */
+ }
+ }
+
+ /* Track down the record length or dash. */
+ cp = cps;
+ if (cp < end) {
+ cp = LYSkipBlanks(cp);
+ cps = LYSkipNonBlanks(cp);
+ *cps++ = '\0';
+ if (isdigit(UCH(*cp))) {
+ RecordLength = atoi(cp);
+ }
+ }
+
+ /* Track down the number of records or the dash. */
+ cp = cps;
+ if (cps < end) {
+ cp = LYSkipBlanks(cp);
+ cps = LYSkipNonBlanks(cp);
+ *cps++ = '\0';
+ if (isdigit(UCH(*cp))) {
+ Records = atoi(cp);
+ }
+ if (Records > 0 && RecordLength > 0) {
+ /* Compute an approximate size. */
+ entry_info->size = ((off_t) Records * (off_t) RecordLength);
+ }
+ }
+
+ /* Set the years and date, if we don't have them yet. */
+ if (!HaveYears) {
+ set_years_and_date();
+ }
+
+ /* Track down the date. */
+ cpd = cps;
+ if (((cps < end) &&
+ (cps = StrChr(cpd, ':')) != NULL) &&
+ (cps < (end - 3) &&
+ isdigit(UCH(*(cps + 1))) && isdigit(UCH(*(cps + 2))) && *(cps + 3) == ':')) {
+ cps += 3;
+ *cps = '\0';
+ if ((cps - cpd) >= 14) {
+ cpd = (cps - 14);
+ *(cpd + 2) = '\0'; /* Month */
+ *(cpd + 5) = '\0'; /* Day */
+ *(cpd + 8) = '\0'; /* Year */
+ cps -= 5; /* Time */
+ if (*cpd == ' ')
+ *cpd = '0';
+ i = atoi(cpd) - 1;
+ sprintf(date, "%.3s %.2s", months[i], (cpd + 3));
+ if (date[4] == '0')
+ date[4] = ' ';
+ cpd += 6; /* Year */
+ if (strcmp((ThisYear + 2), cpd)) {
+ /* Not this year, so show the year. */
+ if (atoi(cpd) < 70) {
+ sprintf(&date[6], " 20%.2s", cpd);
+ } else {
+ sprintf(&date[6], " 19%.2s", cpd);
+ }
+ } else {
+ /* Is this year, so show the time. */
+ *(cps + 2) = '\0'; /* Hour */
+ i = atoi(cps);
+ sprintf(&date[6], " %02d:%.2s", i, (cps + 3));
+ }
+ StrAllocCopy(entry_info->date, date);
+ if (entry_info->date[4] == ' ' || entry_info->date[4] == '0') {
+ entry_info->date[4] = HT_NON_BREAK_SPACE;
+ }
+ }
+ }
+
+ TRACE_ENTRY("VM/CMS", entry_info);
+ return;
+} /* parse_cms_dir_entry */
+
+/*
+ * Given a line of LIST/NLST output in entry, return results and a file/dir
+ * name in entry_info struct
+ *
+ * If first is true, this is the first name in a directory.
+ */
+static EntryInfo *parse_dir_entry(char *entry,
+ BOOLEAN *first,
+ char **pspilledname)
+{
+ EntryInfo *entry_info;
+ int i;
+ int len;
+ BOOLEAN remove_size = FALSE;
+ char *cp;
+
+ entry_info = typecalloc(EntryInfo);
+
+ if (entry_info == NULL)
+ outofmem(__FILE__, "parse_dir_entry");
+
+ entry_info->display = TRUE;
+
+ switch (server_type) {
+ case DLS_SERVER:
+
+ /*
+ * Interpret and edit LIST output from a Unix server in "dls" format.
+ * This one must have claimed to be Unix in order to get here; if the
+ * first line looks fishy, we revert to Unix and hope that fits better
+ * (this recovery is untested). - kw
+ */
+
+ if (*first) {
+ len = (int) strlen(entry);
+ if (!len || entry[0] == ' ' ||
+ (len >= 24 && entry[23] != ' ') ||
+ (len < 24 && StrChr(entry, ' '))) {
+ server_type = UNIX_SERVER;
+ CTRACE((tfp,
+ "HTFTP: Falling back to treating as Unix server.\n"));
+ } else {
+ *first = FALSE;
+ }
+ }
+
+ if (server_type == DLS_SERVER) {
+ /* if still unchanged... */
+ parse_dls_line(entry, entry_info, pspilledname);
+
+ if (isEmpty(entry_info->filename)) {
+ entry_info->display = FALSE;
+ return (entry_info);
+ }
+ if (!strcmp(entry_info->filename, "..") ||
+ !strcmp(entry_info->filename, "."))
+ entry_info->display = FALSE;
+ if (entry_info->type && *entry_info->type == '\0') {
+ FREE(entry_info->type);
+ return (entry_info);
+ }
+ /*
+ * Goto the bottom and get real type.
+ */
+ break;
+ }
+ /* fall through if server_type changed for *first == TRUE ! */
+ /* FALLTHRU */
+ case UNIX_SERVER:
+ case PETER_LEWIS_SERVER:
+ case MACHTEN_SERVER:
+ case MSDOS_SERVER:
+ case WINDOWS_NT_SERVER:
+ case WINDOWS_2K_SERVER:
+ case APPLESHARE_SERVER:
+ case NETPRESENZ_SERVER:
+ /*
+ * Check for EPLF output (local times).
+ */
+ if (*entry == '+') {
+ parse_eplf_line(entry, entry_info);
+ break;
+ }
+
+ /*
+ * Interpret and edit LIST output from Unix server.
+ */
+ len = (int) strlen(entry);
+ if (*first) {
+ /* don't gettext() this -- incoming text: */
+ if (!strcmp(entry, "can not access directory .")) {
+ /*
+ * Don't reset *first, nothing real will follow. - KW
+ */
+ entry_info->display = FALSE;
+ return (entry_info);
+ }
+ *first = FALSE;
+ if (!StrNCmp(entry, "total ", 6) ||
+ strstr(entry, "not available") != NULL) {
+ entry_info->display = FALSE;
+ return (entry_info);
+ } else if (unsure_type) {
+ /* this isn't really a unix server! */
+ server_type = GENERIC_SERVER;
+ entry_info->display = FALSE;
+ return (entry_info);
+ }
+ }
+
+ /*
+ * Check first character of ls -l output.
+ */
+ if (TOUPPER(entry[0]) == 'D') {
+ /*
+ * It's a directory.
+ */
+ StrAllocCopy(entry_info->type, ENTRY_IS_DIRECTORY);
+ remove_size = TRUE; /* size is not useful */
+ } else if (entry[0] == 'l') {
+ /*
+ * It's a symbolic link, does the user care about knowing if it is
+ * symbolic? I think so since it might be a directory.
+ */
+ StrAllocCopy(entry_info->type, ENTRY_IS_SYMBOLIC_LINK);
+ remove_size = TRUE; /* size is not useful */
+
+ /*
+ * Strip off " -> pathname".
+ */
+ for (i = len - 1; (i > 3) &&
+ (!isspace(UCH(entry[i])) ||
+ (entry[i - 1] != '>') ||
+ (entry[i - 2] != '-') ||
+ (entry[i - 3] != ' ')); i--) ; /* null body */
+ if (i > 3) {
+ entry[i - 3] = '\0';
+ StrAllocCopy(entry_info->linkname, LYSkipBlanks(entry + i));
+ }
+ }
+ /* link */
+ parse_ls_line(entry, entry_info);
+
+ if (!strcmp(entry_info->filename, "..") ||
+ !strcmp(entry_info->filename, "."))
+ entry_info->display = FALSE;
+ /*
+ * Goto the bottom and get real type.
+ */
+ break;
+
+ case VMS_SERVER:
+ /*
+ * Interpret and edit LIST output from VMS server and convert
+ * information lines to zero length.
+ */
+ parse_vms_dir_entry(entry, entry_info);
+
+ /*
+ * Get rid of any junk lines.
+ */
+ if (!entry_info->display)
+ return (entry_info);
+
+ /*
+ * Trim off VMS directory extensions.
+ */
+ len = (int) strlen(entry_info->filename);
+ if ((len > 4) && !strcmp(&entry_info->filename[len - 4], ".dir")) {
+ entry_info->filename[len - 4] = '\0';
+ StrAllocCopy(entry_info->type, ENTRY_IS_DIRECTORY);
+ remove_size = TRUE; /* size is not useful */
+ }
+ /*
+ * Goto the bottom and get real type.
+ */
+ break;
+
+ case MS_WINDOWS_SERVER:
+ /*
+ * Interpret and edit LIST output from MS_WINDOWS server and convert
+ * information lines to zero length.
+ */
+ parse_ms_windows_dir_entry(entry, entry_info);
+
+ /*
+ * Get rid of any junk lines.
+ */
+ if (!entry_info->display)
+ return (entry_info);
+ if (entry_info->type && *entry_info->type == '\0') {
+ FREE(entry_info->type);
+ return (entry_info);
+ }
+ /*
+ * Goto the bottom and get real type.
+ */
+ break;
+
+#ifdef NOTDEFINED
+ case WINDOWS_NT_SERVER:
+ /*
+ * Interpret and edit LIST output from MS_WINDOWS server and convert
+ * information lines to zero length.
+ */
+ parse_windows_nt_dir_entry(entry, entry_info);
+
+ /*
+ * Get rid of any junk lines.
+ */
+ if (!entry_info->display)
+ return (entry_info);
+ if (entry_info->type && *entry_info->type == '\0') {
+ FREE(entry_info->type);
+ return (entry_info);
+ }
+ /*
+ * Goto the bottom and get real type.
+ */
+ break;
+#endif /* NOTDEFINED */
+
+ case CMS_SERVER:
+ {
+ /*
+ * Interpret and edit LIST output from VM/CMS server and convert
+ * any information lines to zero length.
+ */
+ parse_cms_dir_entry(entry, entry_info);
+
+ /*
+ * Get rid of any junk lines.
+ */
+ if (!entry_info->display)
+ return (entry_info);
+ if (entry_info->type && *entry_info->type == '\0') {
+ FREE(entry_info->type);
+ return (entry_info);
+ }
+ /*
+ * Goto the bottom and get real type.
+ */
+ break;
+ }
+
+ case NCSA_SERVER:
+ case TCPC_SERVER:
+ /*
+ * Directories identified by trailing "/" characters.
+ */
+ StrAllocCopy(entry_info->filename, entry);
+ len = (int) strlen(entry);
+ if (entry[len - 1] == '/') {
+ /*
+ * It's a dir, remove / and mark it as such.
+ */
+ entry[len - 1] = '\0';
+ StrAllocCopy(entry_info->type, ENTRY_IS_DIRECTORY);
+ remove_size = TRUE; /* size is not useful */
+ }
+ /*
+ * Goto the bottom and get real type.
+ */
+ break;
+
+ default:
+ /*
+ * We can't tell if it is a directory since we only did an NLST :( List
+ * bad file types anyways? NOT!
+ */
+ StrAllocCopy(entry_info->filename, entry);
+ return (entry_info); /* mostly empty info */
+
+ } /* switch (server_type) */
+
+#ifdef LONG_LIST
+ (void) remove_size;
+#else
+ if (remove_size && entry_info->size) {
+ entry_info->size = 0;
+ }
+#endif
+
+ if (isEmpty(entry_info->filename)) {
+ entry_info->display = FALSE;
+ return (entry_info);
+ }
+ if (strlen(entry_info->filename) > 3) {
+ if (((cp = strrchr(entry_info->filename, '.')) != NULL &&
+ 0 == strncasecomp(cp, ".me", 3)) &&
+ (cp[3] == '\0' || cp[3] == ';')) {
+ /*
+ * Don't treat this as application/x-Troff-me if it's a Unix server
+ * but has the string "read.me", or if it's not a Unix server. -
+ * FM
+ */
+ if ((server_type != UNIX_SERVER) ||
+ (cp > (entry_info->filename + 3) &&
+ 0 == strncasecomp((cp - 4), "read.me", 7))) {
+ StrAllocCopy(entry_info->type, STR_PLAINTEXT);
+ }
+ }
+ }
+
+ /*
+ * Get real types eventually.
+ */
+ if (!entry_info->type) {
+ const char *cp2;
+ HTFormat format;
+ HTAtom *encoding; /* @@ not used at all */
+
+ format = HTFileFormat(entry_info->filename, &encoding, &cp2);
+
+ if (cp2 == NULL) {
+ if (!StrNCmp(HTAtom_name(format), "application", 11)) {
+ cp2 = HTAtom_name(format) + 12;
+ if (!StrNCmp(cp2, "x-", 2))
+ cp2 += 2;
+ } else {
+ cp2 = HTAtom_name(format);
+ }
+ }
+
+ StrAllocCopy(entry_info->type, cp2);
+ }
+
+ return (entry_info);
+}
+
+static void formatDate(char target[16], EntryInfo *entry)
+{
+ char temp[8], month[4];
+ int i;
+
+ /*
+ * Set up for sorting in reverse chronological order. - FM
+ */
+ if (entry->date[9] == ':') {
+ strcpy(target, "9999");
+ LYStrNCpy(temp, &entry->date[7], 5);
+ if (temp[0] == ' ') {
+ temp[0] = '0';
+ }
+ } else {
+ LYStrNCpy(target, &entry->date[8], 4);
+ strcpy(temp, "00:00");
+ }
+ LYStrNCpy(month, entry->date, 3);
+ for (i = 0; i < 12; i++) {
+ if (!strcasecomp(month, months[i])) {
+ break;
+ }
+ }
+ i++;
+ sprintf(month, "%02d", i % 100);
+ strcat(target, month);
+ StrNCat(target, &entry->date[4], 2);
+ if (target[6] == ' ' || target[6] == HT_NON_BREAK_SPACE) {
+ target[6] = '0';
+ }
+
+ /* If no year given, assume last year if it would otherwise be in the
+ * future by more than one day. The one day tolerance is to account for a
+ * possible timezone difference. - kw
+ */
+ if (target[0] == '9' && atoi(target) > TheDate + 1) {
+ for (i = 0; i < 4; i++) {
+ target[i] = LastYear[i];
+ }
+ }
+ strcat(target, temp);
+}
+
+static int compare_EntryInfo_structs(EntryInfo *entry1, EntryInfo *entry2)
+{
+ int status;
+ char date1[16], date2[16];
+ int result = strcmp(entry1->filename, entry2->filename);
+
+ switch (HTfileSortMethod) {
+ case FILE_BY_SIZE:
+ /* both equal or both 0 */
+ if (entry1->size > entry2->size)
+ result = 1;
+ else if (entry1->size < entry2->size)
+ result = -1;
+ break;
+
+ case FILE_BY_TYPE:
+ if (entry1->type && entry2->type) {
+ status = strcasecomp(entry1->type, entry2->type);
+ if (status)
+ result = status;
+ }
+ break;
+
+ case FILE_BY_DATE:
+ if (entry1->date && entry2->date &&
+ strlen(entry1->date) == 12 &&
+ strlen(entry2->date) == 12) {
+ /*
+ * Set the years and date, if we don't have them yet.
+ */
+ if (!HaveYears) {
+ set_years_and_date();
+ }
+ formatDate(date1, entry1);
+ formatDate(date2, entry2);
+ /*
+ * Do the comparison. - FM
+ */
+ status = strcasecomp(date2, date1);
+ if (status)
+ result = status;
+ }
+ break;
+
+ case FILE_BY_NAME:
+ default:
+ break;
+ }
+ return result;
+}
+
+#ifdef LONG_LIST
+static char *FormatStr(char **bufp,
+ char *start,
+ const char *value)
+{
+ char fmt[512];
+
+ if (*start) {
+ sprintf(fmt, "%%%.*ss", (int) sizeof(fmt) - 3, start);
+ HTSprintf(bufp, fmt, value);
+ } else if (*bufp && !(value && *value)) {
+ ;
+ } else if (value) {
+ StrAllocCat(*bufp, value);
+ }
+ return *bufp;
+}
+
+static char *FormatSize(char **bufp,
+ char *start,
+ off_t value)
+{
+ char fmt[512];
+
+ if (*start) {
+ sprintf(fmt, "%%%.*s" PRI_off_t,
+ (int) sizeof(fmt) - DigitsOf(start) - 3, start);
+
+ HTSprintf(bufp, fmt, value);
+ } else {
+ sprintf(fmt, "%" PRI_off_t, CAST_off_t (value));
+
+ StrAllocCat(*bufp, fmt);
+ }
+ return *bufp;
+}
+
+static char *FormatNum(char **bufp,
+ char *start,
+ unsigned long value)
+{
+ char fmt[512];
+
+ if (*start) {
+ sprintf(fmt, "%%%.*sld",
+ (int) sizeof(fmt) - DigitsOf(start) - 3, start);
+ HTSprintf(bufp, fmt, value);
+ } else {
+ sprintf(fmt, "%lu", value);
+ StrAllocCat(*bufp, fmt);
+ }
+ return *bufp;
+}
+
+static void FlushParse(HTStructured * target, char **buf)
+{
+ if (*buf && **buf) {
+ PUTS(*buf);
+ **buf = '\0';
+ }
+}
+
+static void LYListFmtParse(const char *fmtstr,
+ EntryInfo *data,
+ HTStructured * target,
+ char *tail)
+{
+ char c;
+ char *s;
+ char *end;
+ char *start;
+ char *str = NULL;
+ char *buf = NULL;
+ BOOL is_directory = (BOOL) (data->file_mode != 0 &&
+ (TOUPPER(data->file_mode[0]) == 'D'));
+ BOOL is_symlinked = (BOOL) (data->file_mode != 0 &&
+ (TOUPPER(data->file_mode[0]) == 'L'));
+ BOOL remove_size = (BOOL) (is_directory || is_symlinked);
+
+ StrAllocCopy(str, fmtstr);
+ s = str;
+ end = str + strlen(str);
+ while (*s) {
+ start = s;
+ while (*s) {
+ if (*s == '%') {
+ if (*(s + 1) == '%') /* literal % */
+ s++;
+ else
+ break;
+ }
+ s++;
+ }
+ /* s is positioned either at a % or at \0 */
+ *s = '\0';
+ if (s > start) { /* some literal chars. */
+ StrAllocCat(buf, start);
+ }
+ if (s == end)
+ break;
+ start = ++s;
+ while (isdigit(UCH(*s)) || *s == '.' || *s == '-' || *s == ' ' ||
+ *s == '#' || *s == '+' || *s == '\'')
+ s++;
+ c = *s; /* the format char. or \0 */
+ *s = '\0';
+
+ switch (c) {
+ case '\0':
+ StrAllocCat(buf, start);
+ continue;
+
+ case 'A':
+ case 'a': /* anchor */
+ FlushParse(target, &buf);
+ HTDirEntry(target, tail, data->filename);
+ FormatStr(&buf, start, data->filename);
+ PUTS(buf);
+ END(HTML_A);
+ if (buf != 0)
+ *buf = '\0';
+ if (c != 'A' && data->linkname != 0) {
+ PUTS(" -> ");
+ PUTS(data->linkname);
+ }
+ break;
+
+ case 'T': /* MIME type */
+ case 't': /* MIME type description */
+ if (is_directory) {
+ if (c != 'T') {
+ FormatStr(&buf, start, ENTRY_IS_DIRECTORY);
+ } else {
+ FormatStr(&buf, start, "");
+ }
+ } else if (is_symlinked) {
+ if (c != 'T') {
+ FormatStr(&buf, start, ENTRY_IS_SYMBOLIC_LINK);
+ } else {
+ FormatStr(&buf, start, "");
+ }
+ } else {
+ const char *cp2;
+ HTFormat format;
+
+ format = HTFileFormat(data->filename, NULL, &cp2);
+
+ if (c != 'T') {
+ if (cp2 == NULL) {
+ if (!StrNCmp(HTAtom_name(format),
+ "application", 11)) {
+ cp2 = HTAtom_name(format) + 12;
+ if (!StrNCmp(cp2, "x-", 2))
+ cp2 += 2;
+ } else {
+ cp2 = HTAtom_name(format);
+ }
+ }
+ FormatStr(&buf, start, cp2);
+ } else {
+ FormatStr(&buf, start, HTAtom_name(format));
+ }
+ }
+ break;
+
+ case 'd': /* date */
+ if (data->date) {
+ FormatStr(&buf, start, data->date);
+ } else {
+ FormatStr(&buf, start, " * ");
+ }
+ break;
+
+ case 's': /* size in bytes */
+ FormatSize(&buf, start, data->size);
+ break;
+
+ case 'K': /* size in Kilobytes but not for directories */
+ if (remove_size) {
+ FormatStr(&buf, start, "");
+ StrAllocCat(buf, " ");
+ break;
+ }
+ /* FALL THROUGH */
+ case 'k': /* size in Kilobytes */
+ /* FIXME - this is inconsistent with HTFile.c, but historical */
+ if (data->size < 1024) {
+ FormatSize(&buf, start, data->size);
+ StrAllocCat(buf, " bytes");
+ } else {
+ FormatSize(&buf, start, data->size / 1024);
+ StrAllocCat(buf, "Kb");
+ }
+ break;
+
+#ifdef LONG_LIST
+ case 'p': /* unix-style permission bits */
+ FormatStr(&buf, start, NonNull(data->file_mode));
+ break;
+
+ case 'o': /* owner */
+ FormatStr(&buf, start, NonNull(data->file_user));
+ break;
+
+ case 'g': /* group */
+ FormatStr(&buf, start, NonNull(data->file_group));
+ break;
+
+ case 'l': /* link count */
+ FormatNum(&buf, start, data->file_links);
+ break;
+#endif
+
+ case '%': /* literal % with flags/width */
+ FormatStr(&buf, start, "%");
+ break;
+
+ default:
+ fprintf(stderr,
+ "Unknown format character `%c' in list format\n", c);
+ break;
+ }
+
+ s++;
+ }
+ if (buf) {
+ LYTrimTrailing(buf);
+ FlushParse(target, &buf);
+ FREE(buf);
+ }
+ PUTC('\n');
+ FREE(str);
+}
+#endif /* LONG_LIST */
+
+/* Read a directory into an hypertext object from the data socket
+ * --------------------------------------------------------------
+ *
+ * On entry,
+ * anchor Parent anchor to link the this node to
+ * address Address of the directory
+ * On exit,
+ * returns HT_LOADED if OK
+ * <0 if error.
+ */
+static int read_directory(HTParentAnchor *parent,
+ const char *address,
+ HTFormat format_out,
+ HTStream *sink)
+{
+ int status;
+ BOOLEAN WasInterrupted = FALSE;
+ HTStructured *target = HTML_new(parent, format_out, sink);
+ char *filename = HTParse(address, "", PARSE_PATH + PARSE_PUNCTUATION);
+ EntryInfo *entry_info;
+ BOOLEAN first = TRUE;
+ char *lastpath = NULL; /* prefix for link, either "" (for root) or xxx */
+ BOOL tildeIsTop = FALSE;
+
+#ifndef LONG_LIST
+ char string_buffer[64];
+#endif
+
+ _HTProgress(gettext("Receiving FTP directory."));
+
+ /*
+ * Force the current Date and Year (TheDate, ThisYear, and LastYear) to be
+ * recalculated for each directory request. Otherwise we have a problem
+ * with long-running sessions assuming the wrong date for today. - kw
+ */
+ HaveYears = FALSE;
+ /*
+ * Check whether we always want the home directory treated as Welcome. -
+ * FM
+ */
+ if (server_type == VMS_SERVER)
+ tildeIsTop = TRUE;
+
+ /*
+ * This should always come back FALSE, since the flag is set only for local
+ * directory listings if LONG_LIST was defined on compilation, but we could
+ * someday set up an equivalent listing for Unix ftp servers. - FM
+ */
+ (void) HTDirTitles(target, parent, format_out, tildeIsTop);
+
+ data_read_pointer = data_write_pointer = data_buffer;
+
+ if (*filename == '\0') { /* Empty filename: use root. */
+ StrAllocCopy(lastpath, "/");
+ } else if (!strcmp(filename, "/")) { /* Root path. */
+ StrAllocCopy(lastpath, "/foo/..");
+ } else {
+ char *p = strrchr(filename, '/'); /* Find the lastslash. */
+ char *cp;
+
+ if (server_type == CMS_SERVER) {
+ StrAllocCopy(lastpath, filename); /* Use absolute path for CMS. */
+ } else {
+ StrAllocCopy(lastpath, p + 1); /* Take slash off the beginning. */
+ }
+ if ((cp = strrchr(lastpath, ';')) != NULL) { /* Trim type= param. */
+ if (!strncasecomp((cp + 1), "type=", 5)) {
+ if (TOUPPER(*(cp + 6)) == 'D' ||
+ TOUPPER(*(cp + 6)) == 'A' ||
+ TOUPPER(*(cp + 6)) == 'I')
+ *cp = '\0';
+ }
+ }
+ }
+ FREE(filename);
+
+ {
+ HTBTree *bt = HTBTree_new((HTComparer) compare_EntryInfo_structs);
+ int ic;
+ HTChunk *chunk = HTChunkCreate(128);
+ int BytesReceived = 0;
+ int BytesReported = 0;
+ char NumBytes[64];
+ char *spilledname = NULL;
+
+ PUTC('\n'); /* prettier LJM */
+ for (ic = 0; ic != EOF;) { /* For each entry in the directory */
+ HTChunkClear(chunk);
+
+ if (HTCheckForInterrupt()) {
+ CTRACE((tfp,
+ "read_directory: interrupted after %d bytes\n",
+ BytesReceived));
+ WasInterrupted = TRUE;
+ if (BytesReceived) {
+ goto unload_btree; /* unload btree */
+ } else {
+ ABORT_TARGET;
+ HTBTreeAndObject_free(bt);
+ FREE(spilledname);
+ HTChunkFree(chunk);
+ return HT_INTERRUPTED;
+ }
+ }
+
+ /* read directory entry
+ */
+ interrupted_in_next_data_char = FALSE;
+ for (;;) { /* Read in one line as filename */
+ ic = NEXT_DATA_CHAR;
+ AgainForMultiNet:
+ if (interrupted_in_next_data_char) {
+ CTRACE((tfp,
+ "read_directory: interrupted_in_next_data_char after %d bytes\n",
+ BytesReceived));
+ WasInterrupted = TRUE;
+ if (BytesReceived) {
+ goto unload_btree; /* unload btree */
+ } else {
+ ABORT_TARGET;
+ HTBTreeAndObject_free(bt);
+ FREE(spilledname);
+ HTChunkFree(chunk);
+ return HT_INTERRUPTED;
+ }
+ } else if ((char) ic == CR || (char) ic == LF) { /* Terminator? */
+ if (chunk->size != 0) { /* got some text */
+ /* Deal with MultiNet's wrapping of long lines */
+ if (server_type == VMS_SERVER) {
+ /* Deal with MultiNet's wrapping of long lines - F.M. */
+ if (data_read_pointer < data_write_pointer &&
+ *(data_read_pointer + 1) == ' ')
+ data_read_pointer++;
+ else if (data_read_pointer >= data_write_pointer) {
+ status = NETREAD(data_soc, data_buffer,
+ DATA_BUFFER_SIZE);
+ if (status == HT_INTERRUPTED) {
+ interrupted_in_next_data_char = 1;
+ goto AgainForMultiNet;
+ }
+ if (status <= 0) {
+ ic = EOF;
+ break;
+ }
+ data_write_pointer = data_buffer + status;
+ data_read_pointer = data_buffer;
+ if (*data_read_pointer == ' ')
+ data_read_pointer++;
+ else
+ break;
+ } else
+ break;
+ } else
+ break; /* finish getting one entry */
+ }
+ } else if (ic == EOF) {
+ break; /* End of file */
+ } else {
+ HTChunkPutc(chunk, UCH(ic));
+ }
+ }
+ HTChunkTerminate(chunk);
+
+ BytesReceived += chunk->size;
+ if (BytesReceived > BytesReported + 1024) {
+#ifdef _WINDOWS
+ sprintf(NumBytes, gettext("Transferred %d bytes (%5d)"),
+ BytesReceived, ws_read_per_sec);
+#else
+ sprintf(NumBytes, TRANSFERRED_X_BYTES, BytesReceived);
+#endif
+ HTProgress(NumBytes);
+ BytesReported = BytesReceived;
+ }
+
+ if (ic == EOF && chunk->size == 1)
+ /* 1 means empty: includes terminating 0 */
+ break;
+ CTRACE((tfp, "HTFTP: Line in %s is %s\n",
+ lastpath, chunk->data));
+
+ entry_info = parse_dir_entry(chunk->data, &first, &spilledname);
+ if (entry_info->display) {
+ FREE(spilledname);
+ CTRACE((tfp, "Adding file to BTree: %s\n",
+ entry_info->filename));
+ HTBTree_add(bt, entry_info);
+ } else {
+ free_entryinfo_struct_contents(entry_info);
+ FREE(entry_info);
+ }
+
+ } /* next entry */
+
+ unload_btree:
+
+ HTChunkFree(chunk);
+ FREE(spilledname);
+
+ /* print out the handy help message if it exists :) */
+ if (help_message_cache_non_empty()) {
+ START(HTML_PRE);
+ START(HTML_HR);
+ PUTC('\n');
+ PUTS(help_message_cache_contents());
+ init_help_message_cache(); /* to free memory */
+ START(HTML_HR);
+ PUTC('\n');
+ } else {
+ START(HTML_PRE);
+ PUTC('\n');
+ }
+
+ /* Run through tree printing out in order
+ */
+ {
+#ifndef LONG_LIST
+#ifdef SH_EX /* 1997/10/18 (Sat) 14:14:28 */
+ char *p, name_buff[256];
+ int name_len, dot_len;
+
+#define FNAME_WIDTH 30
+#define FILE_GAP 1
+
+#endif
+ int i;
+#endif
+ HTBTElement *ele;
+
+ for (ele = HTBTree_next(bt, NULL);
+ ele != NULL;
+ ele = HTBTree_next(bt, ele)) {
+ entry_info = (EntryInfo *) HTBTree_object(ele);
+
+#ifdef LONG_LIST
+ LYListFmtParse(ftp_format,
+ entry_info,
+ target,
+ lastpath);
+#else
+ if (entry_info->date) {
+ PUTS(entry_info->date);
+ PUTS(" ");
+ } else {
+ PUTS(" * ");
+ }
+
+ if (entry_info->type) {
+ for (i = 0; entry_info->type[i] != '\0' && i < 16; i++)
+ PUTC(entry_info->type[i]);
+ for (; i < 17; i++)
+ PUTC(' ');
+ }
+ /* start the anchor */
+ HTDirEntry(target, lastpath, entry_info->filename);
+#ifdef SH_EX /* 1997/10/18 (Sat) 16:00 */
+ name_len = strlen(entry_info->filename);
+
+ sprintf(name_buff, "%-*s", FNAME_WIDTH, entry_info->filename);
+
+ if (name_len < FNAME_WIDTH) {
+ dot_len = FNAME_WIDTH - FILE_GAP - name_len;
+ if (dot_len > 0) {
+ p = name_buff + name_len + 1;
+ while (dot_len-- > 0)
+ *p++ = '.';
+ }
+ } else {
+ name_buff[FNAME_WIDTH] = '\0';
+ }
+
+ PUTS(name_buff);
+#else
+ PUTS(entry_info->filename);
+#endif
+ END(HTML_A);
+
+ if (entry_info->size) {
+#ifdef SH_EX /* 1998/02/02 (Mon) 16:34:52 */
+ if (entry_info->size < 1024)
+ sprintf(string_buffer, "%6ld bytes",
+ entry_info->size);
+ else
+ sprintf(string_buffer, "%6ld Kb",
+ entry_info->size / 1024);
+#else
+ if (entry_info->size < 1024)
+ sprintf(string_buffer, " %lu bytes",
+ (unsigned long) entry_info->size);
+ else
+ sprintf(string_buffer, " %luKb",
+ (unsigned long) entry_info->size / 1024);
+#endif
+ PUTS(string_buffer);
+ } else if (entry_info->linkname != 0) {
+ PUTS(" -> ");
+ PUTS(entry_info->linkname);
+ }
+
+ PUTC('\n'); /* end of this entry */
+#endif
+
+ free_entryinfo_struct_contents(entry_info);
+ }
+ }
+ END(HTML_PRE);
+ END(HTML_BODY);
+ FREE_TARGET;
+ HTBTreeAndObject_free(bt);
+ }
+
+ FREE(lastpath);
+
+ if (WasInterrupted || data_soc != -1) { /* should always be true */
+ /*
+ * Without closing the data socket first, the response(NULL) later may
+ * hang. Some servers expect the client to fin/ack the close of the
+ * data connection before proceeding with the conversation on the
+ * control connection. - kw
+ */
+ CTRACE((tfp, "HTFTP: Closing data socket %d\n", data_soc));
+ status = NETCLOSE(data_soc);
+ if (status == -1)
+ HTInetStatus("close"); /* Comment only */
+ data_soc = -1;
+ }
+
+ if (WasInterrupted || HTCheckForInterrupt()) {
+ _HTProgress(TRANSFER_INTERRUPTED);
+ }
+ return HT_LOADED;
+}
+
+/*
+ * Setup an FTP connection.
+ */
+static int setup_connection(const char *name,
+ HTParentAnchor *anchor)
+{
+ int retry; /* How many times tried? */
+ int status = HT_NO_CONNECTION;
+
+ CTRACE((tfp, "setup_connection(%s)\n", name));
+
+ /* set use_list to NOT since we don't know what kind of server
+ * this is yet. And set the type to GENERIC
+ */
+ use_list = FALSE;
+ server_type = GENERIC_SERVER;
+ Broken_RETR = FALSE;
+
+#ifdef INET6
+ Broken_EPSV = FALSE;
+#endif
+
+ for (retry = 0; retry < 2; retry++) { /* For timed out/broken connections */
+ status = get_connection(name, anchor);
+ if (status < 0) {
+ break;
+ }
+
+ if (!ftp_local_passive) {
+ status = get_listen_socket();
+ if (status < 0) {
+ NETCLOSE(control->socket);
+ control->socket = -1;
+#ifdef INET6
+ if (have_socket)
+ (void) close_master_socket();
+#else
+ close_master_socket();
+#endif /* INET6 */
+ /* HT_INTERRUPTED would fall through, if we could interrupt
+ somehow in the middle of it, which we currently can't. */
+ break;
+ }
+#ifdef REPEAT_PORT
+ /* Inform the server of the port number we will listen on
+ */
+ status = response(port_command);
+ FREE(port_command);
+ if (status == HT_INTERRUPTED) {
+ CTRACE((tfp, "HTFTP: Interrupted in response (port_command)\n"));
+ _HTProgress(CONNECTION_INTERRUPTED);
+ NETCLOSE(control->socket);
+ control->socket = -1;
+ close_master_socket();
+ status = HT_INTERRUPTED;
+ break;
+ }
+ if (status != 2) { /* Could have timed out */
+ if (status < 0)
+ continue; /* try again - net error */
+ status = -status; /* bad reply */
+ break;
+ }
+ CTRACE((tfp, "HTFTP: Port defined.\n"));
+#endif /* REPEAT_PORT */
+ } else { /* Tell the server to be passive */
+ char *command = NULL;
+ const char *p = "?";
+ int h0, h1, h2, h3, p0, p1; /* Parts of reply */
+
+#ifdef INET6
+ char dst[LINE_LENGTH + 1];
+#endif
+
+ data_soc = status;
+
+#ifdef INET6
+ /* see RFC 2428 */
+ if (Broken_EPSV)
+ status = 1;
+ else
+ status = send_cmd_1(p = "EPSV");
+ if (status < 0) /* retry or Bad return */
+ continue;
+ else if (status != 2) {
+ status = send_cmd_1(p = "PASV");
+ if (status < 0) { /* retry or Bad return */
+ continue;
+ } else if (status != 2) {
+ status = -status; /* bad reply */
+ break;
+ }
+ }
+
+ if (strcmp(p, "PASV") == 0) {
+ for (p = response_text; *p && *p != ','; p++) {
+ ; /* null body */
+ }
+
+ while (--p > response_text && '0' <= *p && *p <= '9') {
+ ; /* null body */
+ }
+ status = sscanf(p + 1, "%d,%d,%d,%d,%d,%d",
+ &h0, &h1, &h2, &h3, &p0, &p1);
+ if (status < 4) {
+ fprintf(tfp, "HTFTP: PASV reply has no inet address!\n");
+ status = HT_NO_CONNECTION;
+ break;
+ }
+ passive_port = (PortNumber) ((p0 << 8) + p1);
+ sprintf(dst, "%d.%d.%d.%d", h0, h1, h2, h3);
+ } else if (strcmp(p, "EPSV") == 0) {
+ char c0, c1, c2, c3;
+ LY_SOCKADDR ss;
+ LY_SOCKLEN sslen;
+
+ /*
+ * EPSV bla (|||port|)
+ */
+ for (p = response_text; *p && !isspace(UCH(*p)); p++) {
+ ; /* null body */
+ }
+ for ( /*nothing */ ;
+ *p && *p != '(';
+ p++) { /*) */
+ ; /* null body */
+ }
+ status = sscanf(p, "(%c%c%c%d%c)", &c0, &c1, &c2, &p0, &c3);
+ if (status != 5) {
+ fprintf(tfp, "HTFTP: EPSV reply has invalid format!\n");
+ status = HT_NO_CONNECTION;
+ break;
+ }
+ passive_port = (PortNumber) p0;
+
+ sslen = (LY_SOCKLEN) sizeof(ss);
+ if (getpeername(control->socket, SOCKADDR_OF(ss), &sslen) < 0) {
+ fprintf(tfp, "HTFTP: getpeername(control) failed\n");
+ status = HT_NO_CONNECTION;
+ break;
+ }
+ if (getnameinfo(SOCKADDR_OF(ss),
+ sslen,
+ dst,
+ (socklen_t) sizeof(dst),
+ NULL, 0, NI_NUMERICHOST)) {
+ fprintf(tfp, "HTFTP: getnameinfo failed\n");
+ status = HT_NO_CONNECTION;
+ break;
+ }
+ }
+#else
+ status = send_cmd_1("PASV");
+ if (status != 2) {
+ if (status < 0)
+ continue; /* retry or Bad return */
+ status = -status; /* bad reply */
+ break;
+ }
+ for (p = response_text; *p && *p != ','; p++) {
+ ; /* null body */
+ }
+
+ while (--p > response_text && '0' <= *p && *p <= '9') {
+ ; /* null body */
+ }
+
+ status = sscanf(p + 1, "%d,%d,%d,%d,%d,%d",
+ &h0, &h1, &h2, &h3, &p0, &p1);
+ if (status < 4) {
+ fprintf(tfp, "HTFTP: PASV reply has no inet address!\n");
+ status = HT_NO_CONNECTION;
+ break;
+ }
+ passive_port = (PortNumber) ((p0 << 8) + p1);
+#endif /* INET6 */
+ CTRACE((tfp, "HTFTP: Server is listening on port %d\n",
+ passive_port));
+
+ /* Open connection for data: */
+
+#ifdef INET6
+ HTSprintf0(&command, "%s//%s:%d/", STR_FTP_URL, dst, passive_port);
+#else
+ HTSprintf0(&command, "%s//%d.%d.%d.%d:%d/",
+ STR_FTP_URL, h0, h1, h2, h3, passive_port);
+#endif
+ status = HTDoConnect(command, "FTP data", passive_port, &data_soc);
+ FREE(command);
+
+ if (status < 0) {
+ (void) HTInetStatus(gettext("connect for data"));
+ NETCLOSE(data_soc);
+ break;
+ }
+
+ CTRACE((tfp, "FTP data connected, socket %d\n", data_soc));
+ }
+ status = 0;
+ break; /* No more retries */
+
+ } /* for retries */
+ CTRACE((tfp, "setup_connection returns %d\n", status));
+ return status;
+}
+
+/* Retrieve File from Server
+ * -------------------------
+ *
+ * On entry,
+ * name WWW address of a file: document, including hostname
+ * On exit,
+ * returns Socket number for file if good.
+ * <0 if bad.
+ */
+int HTFTPLoad(const char *name,
+ HTParentAnchor *anchor,
+ HTFormat format_out,
+ HTStream *sink)
+{
+ BOOL isDirectory = NO;
+ HTAtom *encoding = NULL;
+ int status, final_status;
+ int outstanding = 1; /* outstanding control connection responses
+
+ that we are willing to wait for, if we
+ get to the point of reading data - kw */
+ HTFormat format;
+
+ CTRACE((tfp, "HTFTPLoad(%s) %s connection\n",
+ name,
+ (ftp_local_passive
+ ? "passive"
+ : "normal")));
+
+ HTReadProgress((off_t) 0, (off_t) 0);
+
+ status = setup_connection(name, anchor);
+ if (status < 0)
+ return status; /* Failed with this code */
+
+ /* Ask for the file:
+ */
+ {
+ char *filename = HTParse(name, "", PARSE_PATH + PARSE_PUNCTUATION);
+ char *fname = filename; /* Save for subsequent free() */
+ char *vmsname = NULL;
+ BOOL binary;
+ const char *type = NULL;
+ char *types = NULL;
+ char *cp;
+
+ if (server_type == CMS_SERVER) {
+ /* If the unescaped path has a %2f, reject it as illegal. - FM */
+ if (((cp = strstr(filename, "%2")) != NULL) &&
+ TOUPPER(cp[2]) == 'F') {
+ FREE(fname);
+ init_help_message_cache(); /* to free memory */
+ NETCLOSE(control->socket);
+ control->socket = -1;
+ CTRACE((tfp,
+ "HTFTP: Rejecting path due to illegal escaped slash.\n"));
+ return -1;
+ }
+ }
+
+ if (!*filename) {
+ StrAllocCopy(filename, "/");
+ type = "D";
+ } else if ((type = types = strrchr(filename, ';')) != NULL) {
+ /*
+ * Check and trim the type= parameter. - FM
+ */
+ if (!strncasecomp((type + 1), "type=", 5)) {
+ switch (TOUPPER(*(type + 6))) {
+ case 'D':
+ *types = '\0';
+ type = "D";
+ break;
+ case 'A':
+ *types = '\0';
+ type = "A";
+ break;
+ case 'I':
+ *types = '\0';
+ type = "I";
+ break;
+ default:
+ type = "";
+ break;
+ }
+ if (!*filename) {
+ *filename = '/';
+ *(filename + 1) = '\0';
+ }
+ }
+ if (*type != '\0') {
+ CTRACE((tfp, "HTFTP: type=%s\n", type));
+ }
+ }
+ HTUnEscape(filename);
+ CTRACE((tfp, "HTFTP: UnEscaped %s\n", filename));
+ if (filename[1] == '~') {
+ /*
+ * Check if translation of HOME as tilde is supported,
+ * and adjust filename if so. - FM
+ */
+ char *cp2 = NULL;
+ char *fn = NULL;
+
+ if ((cp2 = StrChr((filename + 1), '/')) != NULL) {
+ *cp2 = '\0';
+ }
+ status = send_cmd_1("PWD");
+ if (status == 2 && response_text[5] == '/') {
+ status = send_cwd(filename + 1);
+ if (status == 2) {
+ StrAllocCopy(fn, (filename + 1));
+ if (cp2) {
+ *cp2 = '/';
+ if (fn[strlen(fn) - 1] != '/') {
+ StrAllocCat(fn, cp2);
+ } else {
+ StrAllocCat(fn, (cp2 + 1));
+ }
+ cp2 = NULL;
+ }
+ FREE(fname);
+ fname = filename = fn;
+ }
+ }
+ if (cp2) {
+ *cp2 = '/';
+ }
+ }
+ if (strlen(filename) > 3) {
+ char *cp2;
+
+ if (((cp2 = strrchr(filename, '.')) != NULL &&
+ 0 == strncasecomp(cp2, ".me", 3)) &&
+ (cp2[3] == '\0' || cp2[3] == ';')) {
+ /*
+ * Don't treat this as application/x-Troff-me if it's a Unix
+ * server but has the string "read.me", or if it's not a Unix
+ * server. - FM
+ */
+ if ((server_type != UNIX_SERVER) ||
+ (cp2 > (filename + 3) &&
+ 0 == strncasecomp((cp2 - 4), "read.me", 7))) {
+ *cp2 = '\0';
+ format = HTFileFormat(filename, &encoding, NULL);
+ *cp2 = '.';
+ } else {
+ format = HTFileFormat(filename, &encoding, NULL);
+ }
+ } else {
+ format = HTFileFormat(filename, &encoding, NULL);
+ }
+ } else {
+ format = HTFileFormat(filename, &encoding, NULL);
+ }
+ format = HTCharsetFormat(format, anchor, -1);
+ binary = (BOOL) (encoding != WWW_ENC_8BIT &&
+ encoding != WWW_ENC_7BIT);
+ if (!binary &&
+ /*
+ * Force binary if we're in source, download or dump mode and this is
+ * not a VM/CMS server, so we don't get CRLF instead of LF (or CR) for
+ * newlines in text files. Can't do this for VM/CMS or we'll get raw
+ * EBCDIC. - FM
+ */
+ (format_out == WWW_SOURCE ||
+ format_out == WWW_DOWNLOAD ||
+ format_out == WWW_DUMP) &&
+ (server_type != CMS_SERVER))
+ binary = TRUE;
+ if (!binary && type && *type == 'I') {
+ /*
+ * Force binary if we had ;type=I - FM
+ */
+ binary = TRUE;
+ } else if (binary && type && *type == 'A') {
+ /*
+ * Force ASCII if we had ;type=A - FM
+ */
+ binary = FALSE;
+ }
+ if (binary != control->is_binary) {
+ /*
+ * Act on our setting if not already set. - FM
+ */
+ const char *mode = binary ? "I" : "A";
+
+ status = send_cmd_2("TYPE", mode);
+ if (status != 2) {
+ init_help_message_cache(); /* to free memory */
+ return ((status < 0) ? status : -status);
+ }
+ control->is_binary = binary;
+ }
+ switch (server_type) {
+ /*
+ * Handle what for Lynx are special case servers, e.g., for which
+ * we respect RFC 1738, or which have known conflicts in suffix
+ * mappings. - FM
+ */
+ case VMS_SERVER:
+ {
+ char *cp1, *cp2;
+ BOOL included_device = FALSE;
+ BOOL found_tilde = FALSE;
+
+ /* Accept only Unix-style filename */
+ if (StrChr(filename, ':') != NULL ||
+ StrChr(filename, '[') != NULL) {
+ FREE(fname);
+ init_help_message_cache(); /* to free memory */
+ NETCLOSE(control->socket);
+ control->socket = -1;
+ CTRACE((tfp,
+ "HTFTP: Rejecting path due to non-Unix-style syntax.\n"));
+ return -1;
+ }
+ /* Handle any unescaped "/%2F" path */
+ if (!StrNCmp(filename, "//", 2)) {
+ int i;
+
+ included_device = TRUE;
+ for (i = 0; filename[(i + 1)]; i++)
+ filename[i] = filename[(i + 1)];
+ filename[i] = '\0';
+ CTRACE((tfp, "HTFTP: Trimmed '%s'\n", filename));
+ cp = HTVMS_name("", filename);
+ CTRACE((tfp, "HTFTP: VMSized '%s'\n", cp));
+ if ((cp1 = strrchr(cp, ']')) != NULL) {
+ strcpy(filename, ++cp1);
+ CTRACE((tfp, "HTFTP: Filename '%s'\n", filename));
+ *cp1 = '\0';
+ status = send_cwd(cp);
+ if (status != 2) {
+ char *dotslash = 0;
+
+ if ((cp1 = StrChr(cp, '[')) != NULL) {
+ *cp1++ = '\0';
+ status = send_cwd(cp);
+ if (status != 2) {
+ FREE(fname);
+ init_help_message_cache(); /* to free memory */
+ NETCLOSE(control->socket);
+ control->socket = -1;
+ return ((status < 0) ? status : -status);
+ }
+ HTSprintf0(&dotslash, "[.%s", cp1);
+ status = send_cwd(dotslash);
+ FREE(dotslash);
+ if (status != 2) {
+ FREE(fname);
+ init_help_message_cache(); /* to free memory */
+ NETCLOSE(control->socket);
+ control->socket = -1;
+ return ((status < 0) ? status : -status);
+ }
+ } else {
+ FREE(fname);
+ init_help_message_cache(); /* to free memory */
+ NETCLOSE(control->socket);
+ control->socket = -1;
+ return ((status < 0) ? status : -status);
+ }
+ }
+ } else if ((cp1 = StrChr(cp, ':')) != NULL &&
+ StrChr(cp, '[') == NULL &&
+ StrChr(cp, ']') == NULL) {
+ cp1++;
+ if (*cp1 != '\0') {
+ int cplen = (int) (cp1 - cp);
+
+ strcpy(filename, cp1);
+ CTRACE((tfp, "HTFTP: Filename '%s'\n", filename));
+ HTSprintf0(&vmsname, "%.*s[%s]", cplen, cp, filename);
+ status = send_cwd(vmsname);
+ if (status != 2) {
+ HTSprintf(&vmsname, "%.*s[000000]", cplen, cp);
+ status = send_cwd(vmsname);
+ if (status != 2) {
+ HTSprintf(&vmsname, "%.*s", cplen, cp);
+ status = send_cwd(vmsname);
+ if (status != 2) {
+ FREE(fname);
+ init_help_message_cache();
+ NETCLOSE(control->socket);
+ control->socket = -1;
+ return ((status < 0) ? status : -status);
+ }
+ }
+ } else {
+ HTSprintf0(&vmsname, "000000");
+ filename = vmsname;
+ }
+ }
+ } else if (0 == strcmp(cp, (filename + 1))) {
+ status = send_cwd(cp);
+ if (status != 2) {
+ HTSprintf0(&vmsname, "%s:", cp);
+ status = send_cwd(vmsname);
+ if (status != 2) {
+ FREE(fname);
+ init_help_message_cache(); /* to free memory */
+ NETCLOSE(control->socket);
+ control->socket = -1;
+ return ((status < 0) ? status : -status);
+ }
+ }
+ HTSprintf0(&vmsname, "000000");
+ filename = vmsname;
+ }
+ }
+ /* Trim trailing slash if filename is not the top directory */
+ if (strlen(filename) > 1 && filename[strlen(filename) - 1] == '/')
+ filename[strlen(filename) - 1] = '\0';
+
+#ifdef MAINTAIN_CONNECTION /* Don't need this if always new connection - F.M. */
+ if (!included_device) {
+ /* Get the current default VMS device:[directory] */
+ status = send_cmd_1("PWD");
+ if (status != 2) {
+ FREE(fname);
+ init_help_message_cache(); /* to free memory */
+ NETCLOSE(control->socket);
+ control->socket = -1;
+ return ((status < 0) ? status : -status);
+ }
+ /* Go to the VMS account's top directory */
+ if ((cp = StrChr(response_text, '[')) != NULL &&
+ (cp1 = strrchr(response_text, ']')) != NULL) {
+ char *tmp = 0;
+ unsigned len = 4;
+
+ StrAllocCopy(tmp, cp);
+ if ((cp2 = StrChr(cp, '.')) != NULL && cp2 < cp1) {
+ len += (cp2 - cp);
+ } else {
+ len += (cp1 - cp);
+ }
+ tmp[len] = 0;
+ StrAllocCat(tmp, "]");
+
+ status = send_cwd(tmp);
+ FREE(tmp);
+
+ if (status != 2) {
+ FREE(fname);
+ init_help_message_cache(); /* to free memory */
+ NETCLOSE(control->socket);
+ control->socket = -1;
+ return ((status < 0) ? status : -status);
+ }
+ }
+ }
+#endif /* MAINTAIN_CONNECTION */
+
+ /* If we want the VMS account's top directory, list it now */
+ if (!(strcmp(filename, "/~")) ||
+ (included_device && 0 == strcmp(filename, "000000")) ||
+ (strlen(filename) == 1 && *filename == '/')) {
+ isDirectory = YES;
+ status = send_cmd_1("LIST");
+ FREE(fname);
+ if (status != 1) {
+ /* Action not started */
+ init_help_message_cache(); /* to free memory */
+ NETCLOSE(control->socket);
+ control->socket = -1;
+ return ((status < 0) ? status : -status);
+ }
+ /* Big goto! */
+ goto listen;
+ }
+ /* Otherwise, go to appropriate directory and doctor filename */
+ if (!StrNCmp(filename, "/~", 2)) {
+ filename += 2;
+ found_tilde = TRUE;
+ }
+ CTRACE((tfp, "check '%s' to translate x/y/ to [.x.y]\n", filename));
+ if (!included_device &&
+ (cp = StrChr(filename, '/')) != NULL &&
+ (cp1 = strrchr(cp, '/')) != NULL &&
+ (cp1 - cp) > 1) {
+ char *tmp = 0;
+
+ HTSprintf0(&tmp, "[.%.*s]", (int) (cp1 - cp - 1), cp + 1);
+
+ CTRACE((tfp, "change path '%s'\n", tmp));
+ while ((cp2 = strrchr(tmp, '/')) != NULL)
+ *cp2 = '.';
+ CTRACE((tfp, "...to path '%s'\n", tmp));
+
+ status = send_cwd(tmp);
+ FREE(tmp);
+
+ if (status != 2) {
+ FREE(fname);
+ init_help_message_cache(); /* to free memory */
+ NETCLOSE(control->socket);
+ control->socket = -1;
+ return ((status < 0) ? status : -status);
+ }
+ filename = cp1 + 1;
+ } else {
+ if (!included_device && !found_tilde) {
+ filename += 1;
+ }
+ }
+ break;
+ }
+ case CMS_SERVER:
+ {
+ /*
+ * If we want the CMS account's top directory, or a base SFS or
+ * anonymous directory path (i.e., without a slash), list it
+ * now. FM
+ */
+ if ((strlen(filename) == 1 && *filename == '/') ||
+ ((0 == strncasecomp((filename + 1), "vmsysu:", 7)) &&
+ (cp = StrChr((filename + 1), '.')) != NULL &&
+ StrChr(cp, '/') == NULL) ||
+ (0 == strncasecomp(filename + 1, "anonymou.", 9) &&
+ StrChr(filename + 1, '/') == NULL)) {
+ if (filename[1] != '\0') {
+ status = send_cwd(filename + 1);
+ if (status != 2) {
+ /* Action not started */
+ init_help_message_cache(); /* to free memory */
+ NETCLOSE(control->socket);
+ control->socket = -1;
+ return ((status < 0) ? status : -status);
+ }
+ }
+ isDirectory = YES;
+ if (use_list)
+ status = send_cmd_1("LIST");
+ else
+ status = send_cmd_1("NLST");
+ FREE(fname);
+ if (status != 1) {
+ /* Action not started */
+ init_help_message_cache(); /* to free memory */
+ NETCLOSE(control->socket);
+ control->socket = -1;
+ return ((status < 0) ? status : -status);
+ }
+ /* Big goto! */
+ goto listen;
+ }
+ filename++;
+
+ /* Otherwise, go to appropriate directory and adjust filename */
+ while ((cp = StrChr(filename, '/')) != NULL) {
+ *cp++ = '\0';
+ status = send_cwd(filename);
+ if (status == 2) {
+ if (*cp == '\0') {
+ isDirectory = YES;
+ if (use_list)
+ status = send_cmd_1("LIST");
+ else
+ status = send_cmd_1("NLST");
+ FREE(fname);
+ if (status != 1) {
+ /* Action not started */
+ init_help_message_cache(); /* to free memory */
+ NETCLOSE(control->socket);
+ control->socket = -1;
+ return ((status < 0) ? status : -status);
+ }
+ /* Clear any messages from the login directory */
+ init_help_message_cache();
+ /* Big goto! */
+ goto listen;
+ }
+ filename = cp;
+ }
+ }
+ break;
+ }
+ default:
+ /* Shift for any unescaped "/%2F" path */
+ if (!StrNCmp(filename, "//", 2))
+ filename++;
+ break;
+ }
+ /*
+ * Act on a file or listing request, or try to figure out which we're
+ * dealing with if we don't know yet. - FM
+ */
+ if (!(type) || (type && *type != 'D')) {
+ /*
+ * If we are retrieving a file we will (except for CMS) use
+ * binary mode, which lets us use the size command supported by
+ * ftp servers which implement RFC 3659. Knowing the size lets
+ * us in turn display ETA in the progress message -TD
+ */
+ if (control->is_binary) {
+ int code;
+
+ status = send_cmd_2("SIZE", filename);
+ if (status == 2) {
+#if !defined(HAVE_LONG_LONG) && defined(GUESS_PRI_off_t)
+ long size;
+
+ if (sscanf(response_text, "%d %ld", &code, &size) == 2) {
+ anchor->content_length = (off_t) size;
+ }
+#else
+ off_t size;
+ if (sscanf(response_text, "%d %" SCN_off_t, &code, &size)
+ == 2) {
+ anchor->content_length = size;
+ }
+#endif
+ }
+ }
+ status = send_cmd_2("RETR", filename);
+ if (status >= 5) {
+ int check;
+
+ if (Broken_RETR) {
+ CTRACE((tfp, "{{reconnecting...\n"));
+ close_connection(control);
+ check = setup_connection(name, anchor);
+ CTRACE((tfp, "...done }}reconnecting\n"));
+ if (check < 0)
+ return check;
+ }
+ }
+ } else {
+ status = 5; /* Failed status set as flag. - FM */
+ }
+ if (status != 1) { /* Failed : try to CWD to it */
+ /* Clear any login messages if this isn't the login directory */
+ if (strcmp(filename, "/"))
+ init_help_message_cache();
+
+ status = send_cwd(filename);
+ if (status == 2) { /* Succeeded : let's NAME LIST it */
+ isDirectory = YES;
+ if (use_list)
+ status = send_cmd_1("LIST");
+ else
+ status = send_cmd_1("NLST");
+ }
+ }
+ FREE(fname);
+ FREE(vmsname);
+ if (status != 1) {
+ init_help_message_cache(); /* to free memory */
+ NETCLOSE(control->socket);
+ control->socket = -1;
+ if (status < 0)
+ return status;
+ else
+ return -status;
+ }
+ }
+
+ listen:
+ if (!ftp_local_passive) {
+ /* Wait for the connection */
+ LY_SOCKADDR soc_A;
+ LY_SOCKLEN soc_addrlen = (LY_SOCKLEN) sizeof(soc_A);
+
+#ifdef SOCKS
+ if (socks_flag)
+ status = Raccept((int) master_socket,
+ SOCKADDR_OF(soc_A),
+ &soc_addrlen);
+ else
+#endif /* SOCKS */
+ status = accept((int) master_socket,
+ SOCKADDR_OF(soc_A),
+ &soc_addrlen);
+ if (status < 0) {
+ init_help_message_cache(); /* to free memory */
+ return HTInetStatus("accept");
+ }
+ CTRACE((tfp, "TCP: Accepted new socket %d\n", status));
+ data_soc = status;
+ }
+
+ if (isDirectory) {
+ if (server_type == UNIX_SERVER && !unsure_type &&
+ !strcmp(response_text,
+ "150 Opening ASCII mode data connection for /bin/dl.\n")) {
+ CTRACE((tfp, "HTFTP: Treating as \"dls\" server.\n"));
+ server_type = DLS_SERVER;
+ }
+ final_status = read_directory(anchor, name, format_out, sink);
+ if (final_status > 0) {
+ if (server_type != CMS_SERVER)
+ if (outstanding-- > 0) {
+ status = response(NULL);
+ if (status < 0 ||
+ (status == 2 && !StrNCmp(response_text, "221", 3)))
+ outstanding = 0;
+ }
+ } else { /* HT_INTERRUPTED */
+ /* User may have pressed 'z' to give up because no
+ packets got through, so let's not make them wait
+ any longer - kw */
+ outstanding = 0;
+ }
+
+ if (data_soc != -1) { /* normally done in read_directory */
+ CTRACE((tfp, "HTFTP: Closing data socket %d\n", data_soc));
+ status = NETCLOSE(data_soc);
+ if (status == -1)
+ HTInetStatus("close"); /* Comment only */
+ }
+ status = final_status;
+ } else {
+ int rv;
+ char *FileName = HTParse(name, "", PARSE_PATH + PARSE_PUNCTUATION);
+
+ /* Clear any login messages */
+ init_help_message_cache();
+
+ /* Fake a Content-Encoding for compressed files. - FM */
+ HTUnEscape(FileName);
+ if (!IsUnityEnc(encoding)) {
+ /*
+ * We already know from the call to HTFileFormat above that this is
+ * a compressed file, no need to look at the filename again. - kw
+ */
+ StrAllocCopy(anchor->content_type, format->name);
+ StrAllocCopy(anchor->content_encoding, HTAtom_name(encoding));
+ format = HTAtom_for("www/compressed");
+
+ } else {
+ int rootlen;
+ CompressFileType cft = HTCompressFileType(FileName, "._-", &rootlen);
+
+ if (cft != cftNone) {
+ FileName[rootlen] = '\0';
+ format = HTFileFormat(FileName, &encoding, NULL);
+ format = HTCharsetFormat(format, anchor, -1);
+ StrAllocCopy(anchor->content_type, format->name);
+ format = HTAtom_for("www/compressed");
+ }
+
+ switch (cft) {
+ case cftCompress:
+ StrAllocCopy(anchor->content_encoding, "x-compress");
+ break;
+ case cftGzip:
+ StrAllocCopy(anchor->content_encoding, "x-gzip");
+ break;
+ case cftDeflate:
+ StrAllocCopy(anchor->content_encoding, "x-deflate");
+ break;
+ case cftBzip2:
+ StrAllocCopy(anchor->content_encoding, "x-bzip2");
+ break;
+ case cftBrotli:
+ StrAllocCopy(anchor->content_encoding, "x-brotli");
+ break;
+ case cftNone:
+ break;
+ }
+ }
+ FREE(FileName);
+
+ _HTProgress(gettext("Receiving FTP file."));
+ rv = HTParseSocket(format, format_out, anchor, data_soc, sink);
+
+ HTInitInput(control->socket);
+ /* Reset buffering to control connection DD 921208 */
+
+ if (rv < 0) {
+ if (rv == -2) /* weird error, don't expect much response */
+ outstanding--;
+ else if (rv == HT_INTERRUPTED || rv == -1)
+ /* User may have pressed 'z' to give up because no
+ packets got through, so let's not make them wait
+ longer - kw */
+ outstanding = 0;
+ CTRACE((tfp, "HTFTP: Closing data socket %d\n", data_soc));
+ status = NETCLOSE(data_soc);
+ } else {
+ status = 2; /* data_soc already closed in HTCopy - kw */
+ }
+
+ if (status < 0 && rv != HT_INTERRUPTED && rv != -1) {
+ (void) HTInetStatus("close"); /* Comment only */
+ } else {
+ if (rv != HT_LOADED && outstanding--) {
+ status = response(NULL); /* Pick up final reply */
+ if (status != 2 && rv != HT_INTERRUPTED && rv != -1) {
+ data_soc = -1; /* invalidate it */
+ init_help_message_cache(); /* to free memory */
+ return HTLoadError(sink, 500, response_text);
+ } else if (status == 2 && !StrNCmp(response_text, "221", 3)) {
+ outstanding = 0;
+ }
+ }
+ }
+ final_status = HT_LOADED;
+ }
+ while (outstanding-- > 0 &&
+ (status > 0)) {
+ status = response(NULL);
+ if (status == 2 && !StrNCmp(response_text, "221", 3))
+ break;
+ }
+ data_soc = -1; /* invalidate it */
+ CTRACE((tfp, "HTFTPLoad: normal end; "));
+ if (control->socket < 0) {
+ CTRACE((tfp, "control socket is %d\n", control->socket));
+ } else {
+ CTRACE((tfp, "closing control socket %d\n", control->socket));
+ status = NETCLOSE(control->socket);
+ if (status == -1)
+ HTInetStatus("control connection close"); /* Comment only */
+ }
+ control->socket = -1;
+ init_help_message_cache(); /* to free memory */
+ /* returns HT_LOADED (always for file if we get here) or error */
+ return final_status;
+} /* open_file_read */
+
+/*
+ * This function frees any user entered password, so that
+ * it must be entered again for a future request. - FM
+ */
+void HTClearFTPPassword(void)
+{
+ /*
+ * Need code to check cached documents from non-anonymous ftp accounts and
+ * do something to ensure that they no longer can be accessed without a new
+ * retrieval. - FM
+ */
+
+ /*
+ * Now free the current user entered password, if any. - FM
+ */
+ FREE(user_entered_password);
+}
+
+#endif /* ifndef DISABLE_FTP */
diff --git a/WWW/Library/Implementation/HTFTP.h b/WWW/Library/Implementation/HTFTP.h
new file mode 100644
index 0000000..a903bbb
--- /dev/null
+++ b/WWW/Library/Implementation/HTFTP.h
@@ -0,0 +1,70 @@
+/* FTP access module for libwww
+ FTP ACCESS FUNCTIONS
+
+ This isn't really a valid protocol module -- it is lumped together with HTFile . That
+ could be changed easily.
+
+ Author: Tim Berners-Lee. Public Domain. Please mail changes to timbl@info.cern.ch
+
+ */
+#ifndef HTFTP_H
+#define HTFTP_H
+
+#include <HTAnchor.h>
+#include <HTStream.h>
+#include <HTParse.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define FILE_BY_NAME 0
+#define FILE_BY_TYPE 1
+#define FILE_BY_SIZE 2
+#define FILE_BY_DATE 3
+ extern int HTfileSortMethod; /* specifies the method of sorting */
+
+/* PUBLIC HTVMS_name()
+ * CONVERTS WWW name into a VMS name
+ * ON ENTRY:
+ * nn Node Name (optional)
+ * fn WWW file name
+ *
+ * ON EXIT:
+ * returns vms file specification
+ *
+ * Bug: Returns pointer to static -- non-reentrant
+ */
+ extern char *HTVMS_name(const char *nn,
+ const char *fn);
+
+/*
+
+Retrieve File from Server
+
+ ON EXIT,
+
+ returns Socket number for file if good.<0 if bad.
+
+ */
+ extern int HTFTPLoad(const char *name,
+ HTParentAnchor *anchor,
+ HTFormat format_out,
+ HTStream *sink);
+
+/*
+ * This function frees any user entered password, so that
+ * it must be entered again for a future request. - FM
+ */
+ extern void HTClearFTPPassword(void);
+
+/*
+
+Return Host Name
+
+ */
+ extern const char *HTHostName(void);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/WWW/Library/Implementation/HTFWriter.h b/WWW/Library/Implementation/HTFWriter.h
new file mode 100644
index 0000000..015ea15
--- /dev/null
+++ b/WWW/Library/Implementation/HTFWriter.h
@@ -0,0 +1,30 @@
+/* File Writer for libwww
+ C FILE WRITER
+
+ It is useful to have both FWriter and Writer for environments in which fdopen() doesn't
+ exist for example.
+
+ */
+#ifndef HTFWRITE_H
+#define HTFWRITE_H
+
+#include <HTStream.h>
+#include <HTFormat.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ extern HTStream *HTFWriter_new(FILE *fp);
+
+ extern HTStream *HTSaveAndExecute(HTPresentation *pres,
+ HTParentAnchor *anchor, /* Not used */
+ HTStream *sink);
+
+ extern HTStream *HTSaveLocally(HTPresentation *pres,
+ HTParentAnchor *anchor, /* Not used */
+ HTStream *sink);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* HTFWRITE_H */
diff --git a/WWW/Library/Implementation/HTFile.c b/WWW/Library/Implementation/HTFile.c
new file mode 100644
index 0000000..8fdaa2c
--- /dev/null
+++ b/WWW/Library/Implementation/HTFile.c
@@ -0,0 +1,3395 @@
+/*
+ * $LynxId: HTFile.c,v 1.158 2022/07/25 23:52:05 tom Exp $
+ *
+ * File Access HTFile.c
+ * ===========
+ *
+ * This is unix-specific code in general, with some VMS bits.
+ * These are routines for file access used by browsers.
+ * Development of this module for Unix DIRED_SUPPORT in Lynx
+ * regrettably has has been conducted in a manner with now
+ * creates a major impediment for hopes of adapting Lynx to
+ * a newer version of the library.
+ *
+ * History:
+ * Feb 91 Written Tim Berners-Lee CERN/CN
+ * Apr 91 vms-vms access included using DECnet syntax
+ * 26 Jun 92 (JFG) When running over DECnet, suppressed FTP.
+ * Fixed access bug for relative names on VMS.
+ * Sep 93 (MD) Access to VMS files allows sharing.
+ * 15 Nov 93 (MD) Moved HTVMSname to HTVMSUTILS.C
+ * 27 Dec 93 (FM) FTP now works with VMS hosts.
+ * FTP path must be Unix-style and cannot include
+ * the device or top directory.
+ */
+
+#include <HTUtils.h>
+
+#ifndef VMS
+#if defined(DOSPATH)
+#undef LONG_LIST
+#define LONG_LIST /* Define this for long style unix listings (ls -l),
+ the actual style is configurable from lynx.cfg */
+#endif
+/* #define NO_PARENT_DIR_REFERENCE */
+/* Define this for no parent links */
+#endif /* !VMS */
+
+#if defined(DOSPATH)
+#define HAVE_READDIR 1
+#define USE_DIRENT
+#endif
+
+#if defined(USE_DOS_DRIVES)
+#include <HTDOS.h>
+#endif
+
+#include <HTFile.h> /* Implemented here */
+
+#ifdef VMS
+#include <stat.h>
+#endif /* VMS */
+
+#if defined (USE_ZLIB) || defined (USE_BZLIB)
+#include <GridText.h>
+#endif
+
+#define MULTI_SUFFIX ".multi" /* Extension for scanning formats */
+
+#include <HTParse.h>
+#include <HTTCP.h>
+#ifndef DECNET
+#include <HTFTP.h>
+#endif /* !DECNET */
+#include <HTAnchor.h>
+#include <HTAtom.h>
+#include <HTAAProt.h>
+#include <HTFWriter.h>
+#include <HTInit.h>
+#include <HTBTree.h>
+#include <HTAlert.h>
+#include <HTCJK.h>
+#include <UCDefs.h>
+#include <UCMap.h>
+#include <UCAux.h>
+
+#include <LYexit.h>
+#include <LYCharSets.h>
+#include <LYGlobalDefs.h>
+#include <LYStrings.h>
+#include <LYUtils.h>
+
+#ifdef USE_PRETTYSRC
+# include <LYPrettySrc.h>
+#endif
+
+#include <LYLeaks.h>
+
+typedef struct _HTSuffix {
+ char *suffix;
+ HTAtom *rep;
+ HTAtom *encoding;
+ char *desc;
+ float quality;
+} HTSuffix;
+
+typedef struct {
+ struct stat file_info;
+ char sort_tags;
+ char file_name[1]; /* on the end of the struct, since its length varies */
+} DIRED;
+
+#ifndef NGROUPS
+#ifdef NGROUPS_MAX
+#define NGROUPS NGROUPS_MAX
+#else
+#define NGROUPS 32
+#endif /* NGROUPS_MAX */
+#endif /* NGROUPS */
+
+#ifndef GETGROUPS_T
+#define GETGROUPS_T int
+#endif
+
+#include <HTML.h> /* For directory object building */
+
+#define PUTC(c) (*target->isa->put_character)(target, c)
+#define PUTS(s) (*target->isa->put_string)(target, s)
+#define START(e) (*target->isa->start_element)(target, e, 0, 0, -1, 0)
+#define END(e) (*target->isa->end_element)(target, e, 0)
+#define MAYBE_END(e) if (HTML_dtd.tags[e].contents != SGML_EMPTY) \
+ (*target->isa->end_element)(target, e, 0)
+#define FREE_TARGET (*target->isa->_free)(target)
+#define ABORT_TARGET (*targetClass._abort)(target, NULL);
+
+struct _HTStructured {
+ const HTStructuredClass *isa;
+ /* ... */
+};
+
+/*
+ * Controlling globals.
+ */
+int HTDirAccess = HT_DIR_OK;
+
+#ifdef DIRED_SUPPORT
+int HTDirReadme = HT_DIR_README_NONE;
+
+#else
+int HTDirReadme = HT_DIR_README_TOP;
+#endif /* DIRED_SUPPORT */
+
+static const char *HTMountRoot = "/Net/"; /* Where to find mounts */
+
+#ifdef VMS
+static const char *HTCacheRoot = "/WWW$SCRATCH"; /* Where to cache things */
+
+#else
+static const char *HTCacheRoot = "/tmp/W3_Cache_"; /* Where to cache things */
+#endif /* VMS */
+
+static char s_no_suffix[] = "*";
+static char s_unknown_suffix[] = "*.*";
+
+/*
+ * Suffix registration.
+ */
+static HTList *HTSuffixes = 0;
+
+static HTSuffix no_suffix =
+{
+ s_no_suffix, NULL, NULL, NULL, 1.0
+};
+
+static HTSuffix unknown_suffix =
+{
+ s_unknown_suffix, NULL, NULL, NULL, 1.0
+};
+
+/* To free up the suffixes at program exit.
+ * ----------------------------------------
+ */
+#ifdef LY_FIND_LEAKS
+static void free_suffixes(void);
+#endif
+
+#define FindSearch(filename) strchr(filename, '?')
+
+#ifdef LONG_LIST
+static char *FormatStr(char **bufp,
+ char *start,
+ const char *entry)
+{
+ char fmt[512];
+
+ if (*start) {
+ sprintf(fmt, "%%%.*ss", (int) sizeof(fmt) - 3, start);
+ HTSprintf0(bufp, fmt, entry);
+ } else if (*bufp && !(entry && *entry)) {
+ **bufp = '\0';
+ } else if (entry) {
+ StrAllocCopy(*bufp, entry);
+ }
+ return *bufp;
+}
+
+static char *FormatSize(char **bufp,
+ char *start,
+ off_t entry)
+{
+ char fmt[512];
+
+ if (*start) {
+ sprintf(fmt, "%%%.*s" PRI_off_t,
+ (int) sizeof(fmt) - DigitsOf(start) - 3, start);
+
+ HTSprintf0(bufp, fmt, entry);
+ } else {
+ sprintf(fmt, "%" PRI_off_t, CAST_off_t (entry));
+
+ StrAllocCopy(*bufp, fmt);
+ }
+ return *bufp;
+}
+
+static char *FormatNum(char **bufp,
+ char *start,
+ int entry)
+{
+ char fmt[512];
+
+ if (*start) {
+ sprintf(fmt, "%%%.*sd", (int) sizeof(fmt) - 3, start);
+ HTSprintf0(bufp, fmt, entry);
+ } else {
+ sprintf(fmt, "%d", entry);
+ StrAllocCopy(*bufp, fmt);
+ }
+ return *bufp;
+}
+
+static void LYListFmtParse(const char *fmtstr,
+ DIRED * data,
+ char *file,
+ HTStructured * target,
+ char *tail)
+{
+ char c;
+ char *s;
+ char *end;
+ char *start;
+ char *str = NULL;
+ char *buf = NULL;
+ char tmp[LY_MAXPATH];
+ char type;
+
+#ifndef NOUSERS
+ const char *name;
+#endif
+ time_t now;
+ char *datestr;
+
+#ifdef S_IFLNK
+ int len;
+#endif
+#define SEC_PER_YEAR (60 * 60 * 24 * 365)
+
+#ifdef _WINDOWS /* 1998/01/06 (Tue) 21:20:53 */
+ static const char *pbits[] =
+ {
+ "---", "--x", "-w-", "-wx",
+ "r--", "r-x", "rw-", "rwx",
+ 0};
+
+#define PBIT(a, n, s) pbits[((a) >> (n)) & 0x7]
+
+#else
+ static const char *pbits[] =
+ {"---", "--x", "-w-", "-wx",
+ "r--", "r-x", "rw-", "rwx", 0};
+ static const char *psbits[] =
+ {"--S", "--s", "-wS", "-ws",
+ "r-S", "r-s", "rwS", "rws", 0};
+
+#define PBIT(a, n, s) (s) ? psbits[((a) >> (n)) & 0x7] : \
+ pbits[((a) >> (n)) & 0x7]
+#endif
+#if defined(S_ISVTX) && !defined(_WINDOWS)
+ static const char *ptbits[] =
+ {"--T", "--t", "-wT", "-wt",
+ "r-T", "r-t", "rwT", "rwt", 0};
+
+#define PTBIT(a, s) (s) ? ptbits[(a) & 0x7] : pbits[(a) & 0x7]
+#else
+#define PTBIT(a, s) PBIT(a, 0, 0)
+#endif
+
+ if (data->file_info.st_mode == 0)
+ fmtstr = " %a"; /* can't stat so just do anchor */
+
+ StrAllocCopy(str, fmtstr);
+ s = str;
+ end = str + strlen(str);
+ while (*s) {
+ start = s;
+ while (*s) {
+ if (*s == '%') {
+ if (*(s + 1) == '%') /* literal % */
+ s++;
+ else
+ break;
+ }
+ s++;
+ }
+ /* s is positioned either at a % or at \0 */
+ *s = '\0';
+ if (s > start) { /* some literal chars. */
+ PUTS(start);
+ }
+ if (s == end)
+ break;
+ start = ++s;
+ while (isdigit(UCH(*s)) || *s == '.' || *s == '-' || *s == ' ' ||
+ *s == '#' || *s == '+' || *s == '\'')
+ s++;
+ c = *s; /* the format char. or \0 */
+ *s = '\0';
+
+ switch (c) {
+ case '\0':
+ PUTS(start);
+ continue;
+
+ case 'A':
+ case 'a': /* anchor */
+ HTDirEntry(target, tail, data->file_name);
+ FormatStr(&buf, start, data->file_name);
+ PUTS(buf);
+ END(HTML_A);
+ *buf = '\0';
+#ifdef S_IFLNK
+ if (c != 'A' && S_ISLNK(data->file_info.st_mode) &&
+ (len = (int) readlink(file, tmp, sizeof(tmp) - 1)) >= 0) {
+ PUTS(" -> ");
+ tmp[len] = '\0';
+ PUTS(tmp);
+ }
+#endif
+ break;
+
+ case 'T': /* MIME type */
+ case 't': /* MIME type description */
+ if (S_ISDIR(data->file_info.st_mode)) {
+ if (c != 'T') {
+ FormatStr(&buf, start, ENTRY_IS_DIRECTORY);
+ } else {
+ FormatStr(&buf, start, "");
+ }
+ } else {
+ const char *cp2;
+ HTFormat format;
+
+ format = HTFileFormat(file, NULL, &cp2);
+
+ if (c != 'T') {
+ if (cp2 == NULL) {
+ if (!StrNCmp(HTAtom_name(format),
+ "application", 11)) {
+ cp2 = HTAtom_name(format) + 12;
+ if (!StrNCmp(cp2, "x-", 2))
+ cp2 += 2;
+ } else {
+ cp2 = HTAtom_name(format);
+ }
+ }
+ FormatStr(&buf, start, cp2);
+ } else {
+ FormatStr(&buf, start, HTAtom_name(format));
+ }
+ }
+ break;
+
+ case 'd': /* date */
+ now = time(0);
+ datestr = ctime(&data->file_info.st_mtime);
+ if ((now - data->file_info.st_mtime) < SEC_PER_YEAR / 2)
+ /*
+ * MMM DD HH:MM
+ */
+ sprintf(tmp, "%.12s", datestr + 4);
+ else
+ /*
+ * MMM DD YYYY
+ */
+ sprintf(tmp, "%.7s %.4s ", datestr + 4,
+ datestr + 20);
+ FormatStr(&buf, start, tmp);
+ break;
+
+ case 's': /* size in bytes */
+ FormatSize(&buf, start, data->file_info.st_size);
+ break;
+
+ case 'K': /* size in Kilobytes but not for directories */
+ if (S_ISDIR(data->file_info.st_mode)) {
+ FormatStr(&buf, start, "");
+ StrAllocCat(buf, " ");
+ break;
+ }
+ /* FALL THROUGH */
+ case 'k': /* size in Kilobytes */
+ FormatSize(&buf, start, ((data->file_info.st_size + 1023) / 1024));
+ StrAllocCat(buf, "K");
+ break;
+
+ case 'p': /* unix-style permission bits */
+ switch (data->file_info.st_mode & S_IFMT) {
+#if defined(_MSC_VER) && defined(_S_IFIFO)
+ case _S_IFIFO:
+ type = 'p';
+ break;
+#else
+ case S_IFIFO:
+ type = 'p';
+ break;
+#endif
+ case S_IFCHR:
+ type = 'c';
+ break;
+ case S_IFDIR:
+ type = 'd';
+ break;
+ case S_IFREG:
+ type = '-';
+ break;
+#ifdef S_IFBLK
+ case S_IFBLK:
+ type = 'b';
+ break;
+#endif
+#ifdef S_IFLNK
+ case S_IFLNK:
+ type = 'l';
+ break;
+#endif
+#ifdef S_IFSOCK
+# ifdef S_IFIFO /* some older machines (e.g., apollo) have a conflict */
+# if S_IFIFO != S_IFSOCK
+ case S_IFSOCK:
+ type = 's';
+ break;
+# endif
+# else
+ case S_IFSOCK:
+ type = 's';
+ break;
+# endif
+#endif /* S_IFSOCK */
+ default:
+ type = '?';
+ break;
+ }
+#ifdef _WINDOWS
+ sprintf(tmp, "%c%s", type,
+ PBIT(data->file_info.st_mode, 6, data->file_info.st_mode & S_IRWXU));
+#else
+ sprintf(tmp, "%c%s%s%s", type,
+ PBIT(data->file_info.st_mode, 6, data->file_info.st_mode & S_ISUID),
+ PBIT(data->file_info.st_mode, 3, data->file_info.st_mode & S_ISGID),
+ PTBIT(data->file_info.st_mode, data->file_info.st_mode & S_ISVTX));
+#endif
+ FormatStr(&buf, start, tmp);
+ break;
+
+ case 'o': /* owner */
+#ifndef NOUSERS
+ name = HTAA_UidToName((int) data->file_info.st_uid);
+ if (*name) {
+ FormatStr(&buf, start, name);
+ } else {
+ FormatNum(&buf, start, (int) data->file_info.st_uid);
+ }
+#endif
+ break;
+
+ case 'g': /* group */
+#ifndef NOUSERS
+ name = HTAA_GidToName((int) data->file_info.st_gid);
+ if (*name) {
+ FormatStr(&buf, start, name);
+ } else {
+ FormatNum(&buf, start, (int) data->file_info.st_gid);
+ }
+#endif
+ break;
+
+ case 'l': /* link count */
+ FormatNum(&buf, start, (int) data->file_info.st_nlink);
+ break;
+
+ case '%': /* literal % with flags/width */
+ FormatStr(&buf, start, "%");
+ break;
+
+ default:
+ fprintf(stderr,
+ "Unknown format character `%c' in list format\n", c);
+ break;
+ }
+ if (buf)
+ PUTS(buf);
+
+ s++;
+ }
+ FREE(buf);
+ PUTC('\n');
+ FREE(str);
+}
+#endif /* LONG_LIST */
+
+/* Define the representation associated with a file suffix.
+ * --------------------------------------------------------
+ *
+ * Calling this with suffix set to "*" will set the default
+ * representation.
+ * Calling this with suffix set to "*.*" will set the default
+ * representation for unknown suffix files which contain a ".".
+ *
+ * The encoding parameter can give a trivial (8bit, 7bit, binary)
+ * or real (gzip, compress) encoding.
+ *
+ * If filename suffix is already defined with the same encoding
+ * its previous definition is overridden.
+ */
+void HTSetSuffix5(const char *suffix,
+ const char *representation,
+ const char *encoding,
+ const char *desc,
+ double value)
+{
+ HTSuffix *suff;
+ BOOL trivial_enc = (BOOL) IsUnityEncStr(encoding);
+
+ if (strcmp(suffix, s_no_suffix) == 0)
+ suff = &no_suffix;
+ else if (strcmp(suffix, s_unknown_suffix) == 0)
+ suff = &unknown_suffix;
+ else {
+ HTList *cur = HTSuffixes;
+
+ while (NULL != (suff = (HTSuffix *) HTList_nextObject(cur))) {
+ if (suff->suffix && 0 == strcmp(suff->suffix, suffix) &&
+ ((trivial_enc && IsUnityEnc(suff->encoding)) ||
+ (!trivial_enc && !IsUnityEnc(suff->encoding) &&
+ strcmp(encoding, HTAtom_name(suff->encoding)) == 0)))
+ break;
+ }
+ if (!suff) { /* Not found -- create a new node */
+ suff = typecalloc(HTSuffix);
+ if (suff == NULL)
+ outofmem(__FILE__, "HTSetSuffix");
+
+ if (!HTSuffixes) {
+ HTSuffixes = HTList_new();
+#ifdef LY_FIND_LEAKS
+ atexit(free_suffixes);
+#endif
+ }
+
+ HTList_addObject(HTSuffixes, suff);
+
+ StrAllocCopy(suff->suffix, suffix);
+ }
+ }
+
+ if (representation)
+ suff->rep = HTAtom_for(representation);
+
+ /*
+ * Memory leak fixed.
+ * 05-28-94 Lynx 2-3-1 Garrett Arch Blythe
+ * Invariant code removed.
+ */
+ suff->encoding = HTAtom_for(encoding);
+
+ StrAllocCopy(suff->desc, desc);
+
+ suff->quality = (float) value;
+}
+
+#ifdef LY_FIND_LEAKS
+/*
+ * Purpose: Free all added suffixes.
+ * Arguments: void
+ * Return Value: void
+ * Remarks/Portability/Dependencies/Restrictions:
+ * To be used at program exit.
+ * Revision History:
+ * 05-28-94 created Lynx 2-3-1 Garrett Arch Blythe
+ */
+static void free_suffixes(void)
+{
+ HTSuffix *suff = NULL;
+
+ /*
+ * Loop through all suffixes.
+ */
+ while (!HTList_isEmpty(HTSuffixes)) {
+ /*
+ * Free off each item and its members if need be.
+ */
+ suff = (HTSuffix *) HTList_removeLastObject(HTSuffixes);
+ FREE(suff->suffix);
+ FREE(suff->desc);
+ FREE(suff);
+ }
+ /*
+ * Free off the list itself.
+ */
+ HTList_delete(HTSuffixes);
+ HTSuffixes = NULL;
+}
+#endif /* LY_FIND_LEAKS */
+
+/* Make the cache file name for a W3 document.
+ * -------------------------------------------
+ * Make up a suitable name for saving the node in
+ *
+ * E.g. /tmp/WWW_Cache_news/1234@cernvax.cern.ch
+ * /tmp/WWW_Cache_http/crnvmc/FIND/xx.xxx.xx
+ *
+ * On exit:
+ * Returns a malloc'ed string which must be freed by the caller.
+ */
+char *HTCacheFileName(const char *name)
+{
+ char *acc_method = HTParse(name, "", PARSE_ACCESS);
+ char *host = HTParse(name, "", PARSE_HOST);
+ char *path = HTParse(name, "", PARSE_PATH + PARSE_PUNCTUATION);
+ char *result = NULL;
+
+ HTSprintf0(&result, "%s/WWW/%s/%s%s", HTCacheRoot, acc_method, host, path);
+
+ FREE(path);
+ FREE(acc_method);
+ FREE(host);
+ return result;
+}
+
+/* Open a file for write, creating the path.
+ * -----------------------------------------
+ */
+#ifdef NOT_IMPLEMENTED
+static int HTCreatePath(const char *path)
+{
+ return -1;
+}
+#endif /* NOT_IMPLEMENTED */
+
+/* Convert filename from URL-path syntax to local path format
+ * ----------------------------------------------------------
+ * Input name is assumed to be the URL-path of a local file
+ * URL, i.e. what comes after the "file://localhost".
+ * '#'-fragments to be treated as such must already be stripped.
+ * If expand_all is FALSE, unescape only escaped '/'. - kw
+ *
+ * On exit:
+ * Returns a malloc'ed string which must be freed by the caller.
+ */
+char *HTURLPath_toFile(const char *name,
+ int expand_all,
+ int is_remote GCC_UNUSED)
+{
+ char *path = NULL;
+ char *result = NULL;
+
+ StrAllocCopy(path, name);
+ if (expand_all)
+ HTUnEscape(path); /* Interpret all % signs */
+ else
+ HTUnEscapeSome(path, "/"); /* Interpret % signs for path delims */
+
+ CTRACE((tfp, "URLPath `%s' means path `%s'\n", name, path));
+#if defined(USE_DOS_DRIVES)
+ StrAllocCopy(result, is_remote ? path : HTDOS_name(path));
+#else
+ StrAllocCopy(result, path);
+#endif
+
+ FREE(path);
+
+ return result;
+}
+/* Convert filenames between local and WWW formats.
+ * ------------------------------------------------
+ * Make up a suitable name for saving the node in
+ *
+ * E.g. $(HOME)/WWW/news/1234@cernvax.cern.ch
+ * $(HOME)/WWW/http/crnvmc/FIND/xx.xxx.xx
+ *
+ * On exit:
+ * Returns a malloc'ed string which must be freed by the caller.
+ */
+/* NOTE: Don't use this function if you know that the input is a URL path
+ rather than a full URL, use HTURLPath_toFile instead. Otherwise
+ this function will return the wrong thing for some unusual
+ paths (like ones containing "//", possibly escaped). - kw
+*/
+char *HTnameOfFile_WWW(const char *name,
+ int WWW_prefix,
+ int expand_all)
+{
+ char *acc_method = HTParse(name, "", PARSE_ACCESS);
+ char *host = HTParse(name, "", PARSE_HOST);
+ char *path = HTParse(name, "", PARSE_PATH + PARSE_PUNCTUATION);
+ const char *home;
+ char *result = NULL;
+
+ if (expand_all) {
+ HTUnEscape(path); /* Interpret all % signs */
+ } else
+ HTUnEscapeSome(path, "/"); /* Interpret % signs for path delims */
+
+ if (0 == strcmp(acc_method, "file") /* local file */
+ ||!*acc_method) { /* implicitly local? */
+ if ((0 == strcasecomp(host, HTHostName())) ||
+ (0 == strcasecomp(host, "localhost")) || !*host) {
+ CTRACE((tfp, "Node `%s' means path `%s'\n", name, path));
+ StrAllocCopy(result, HTSYS_name(path));
+ } else if (WWW_prefix) {
+ HTSprintf0(&result, "%s%s%s", "/Net/", host, path);
+ CTRACE((tfp, "Node `%s' means file `%s'\n", name, result));
+ } else {
+ StrAllocCopy(result, path);
+ }
+ } else if (WWW_prefix) { /* other access */
+#ifdef VMS
+ if ((home = LYGetEnv("HOME")) == NULL)
+ home = HTCacheRoot;
+ else
+ home = HTVMS_wwwName(home);
+#else
+#if defined(_WINDOWS) /* 1997/10/16 (Thu) 20:42:51 */
+ home = Home_Dir();
+#else
+ home = LYGetEnv("HOME");
+#endif
+ if (home == NULL)
+ home = "/tmp";
+#endif /* VMS */
+ HTSprintf0(&result, "%s/WWW/%s/%s%s", home, acc_method, host, path);
+ } else {
+ StrAllocCopy(result, path);
+ }
+
+ FREE(host);
+ FREE(path);
+ FREE(acc_method);
+
+ CTRACE((tfp, "HTnameOfFile_WWW(%s,%d,%d) = %s\n",
+ name, WWW_prefix, expand_all, result));
+
+ return result;
+}
+
+/* Make a WWW name from a full local path name.
+ * --------------------------------------------
+ *
+ * Bugs:
+ * At present, only the names of two network root nodes are hand-coded
+ * in and valid for the NeXT only. This should be configurable in
+ * the general case.
+ */
+char *WWW_nameOfFile(const char *name)
+{
+ char *result = NULL;
+
+#ifdef NeXT
+ if (0 == StrNCmp("/private/Net/", name, 13)) {
+ HTSprintf0(&result, "%s//%s", STR_FILE_URL, name + 13);
+ } else
+#endif /* NeXT */
+ if (0 == StrNCmp(HTMountRoot, name, 5)) {
+ HTSprintf0(&result, "%s//%s", STR_FILE_URL, name + 5);
+ } else {
+ HTSprintf0(&result, "%s//%s%s", STR_FILE_URL, HTHostName(), name);
+ }
+ CTRACE((tfp, "File `%s'\n\tmeans node `%s'\n", name, result));
+ return result;
+}
+
+/* Determine a suitable suffix, given the representation.
+ * ------------------------------------------------------
+ *
+ * On entry,
+ * rep is the atomized MIME style representation
+ * enc is an encoding, trivial (8bit, binary, etc.) or gzip etc.
+ *
+ * On exit:
+ * Returns a pointer to a suitable suffix string if one has been
+ * found, else "".
+ */
+const char *HTFileSuffix(HTAtom *rep,
+ const char *enc)
+{
+ HTSuffix *suff;
+
+#ifdef FNAMES_8_3
+ HTSuffix *first_found = NULL;
+#endif
+ BOOL trivial_enc;
+ int n;
+ int i;
+
+#define NO_INIT /* don't init anymore since I do it in Lynx at startup */
+#ifndef NO_INIT
+ if (!HTSuffixes)
+ HTFileInit();
+#endif /* !NO_INIT */
+
+ trivial_enc = (BOOL) IsUnityEncStr(enc);
+ n = HTList_count(HTSuffixes);
+ for (i = 0; i < n; i++) {
+ suff = (HTSuffix *) HTList_objectAt(HTSuffixes, i);
+ if (suff->rep == rep &&
+#if defined(VMS) || defined(FNAMES_8_3)
+ /* Don't return a suffix whose first char is a dot, and which
+ has more dots or asterisks after that, for
+ these systems - kw */
+ (!suff->suffix || !suff->suffix[0] || suff->suffix[0] != '.' ||
+ (StrChr(suff->suffix + 1, '.') == NULL &&
+ StrChr(suff->suffix + 1, '*') == NULL)) &&
+#endif
+ ((trivial_enc && IsUnityEnc(suff->encoding)) ||
+ (!trivial_enc && !IsUnityEnc(suff->encoding) &&
+ strcmp(enc, HTAtom_name(suff->encoding)) == 0))) {
+#ifdef FNAMES_8_3
+ if (suff->suffix && (strlen(suff->suffix) <= 4)) {
+ /*
+ * If length of suffix (including dot) is 4 or smaller, return
+ * this one even if we found a longer one earlier - kw
+ */
+ return suff->suffix;
+ } else if (!first_found) {
+ first_found = suff; /* remember this one */
+ }
+#else
+ return suff->suffix; /* OK -- found */
+#endif
+ }
+ }
+#ifdef FNAMES_8_3
+ if (first_found)
+ return first_found->suffix;
+#endif
+ return ""; /* Dunno */
+}
+
+/*
+ * Trim version from VMS filenames to avoid confusing comparisons.
+ */
+#ifdef VMS
+static const char *VMS_trim_version(const char *filename)
+{
+ const char *result = filename;
+ const char *version = StrChr(filename, ';');
+
+ if (version != 0) {
+ static char *stripped;
+
+ StrAllocCopy(stripped, filename);
+ stripped[version - filename] = '\0';
+ result = (const char *) stripped;
+ }
+ return result;
+}
+#define VMS_DEL_VERSION(name) name = VMS_trim_version(name)
+#else
+#define VMS_DEL_VERSION(name) /* nothing */
+#endif
+
+/* Determine file format from file name.
+ * -------------------------------------
+ *
+ * This version will return the representation and also set
+ * a variable for the encoding.
+ *
+ * Encoding may be a unity encoding (binary, 8bit, etc.) or
+ * a content-coding like gzip, compress.
+ *
+ * It will handle for example x.txt, x.txt,Z, x.Z
+ */
+HTFormat HTFileFormat(const char *filename,
+ HTAtom **pencoding,
+ const char **pdesc)
+{
+ HTSuffix *suff;
+ int n;
+ int i;
+ int lf;
+ char *search;
+
+ VMS_DEL_VERSION(filename);
+
+ if ((search = FindSearch(filename)) != 0) {
+ char *newname = NULL;
+ HTFormat result;
+
+ StrAllocCopy(newname, filename);
+ newname[((const char *) search) - filename] = '\0';
+ result = HTFileFormat(newname, pencoding, pdesc);
+ free(newname);
+ return result;
+ }
+
+ if (pencoding)
+ *pencoding = NULL;
+ if (pdesc)
+ *pdesc = NULL;
+ if (LYforce_HTML_mode) {
+ if (pencoding)
+ *pencoding = WWW_ENC_8BIT;
+ return WWW_HTML;
+ }
+#ifndef NO_INIT
+ if (!HTSuffixes)
+ HTFileInit();
+#endif /* !NO_INIT */
+ lf = (int) strlen(filename);
+ n = HTList_count(HTSuffixes);
+ for (i = 0; i < n; i++) {
+ int ls;
+
+ suff = (HTSuffix *) HTList_objectAt(HTSuffixes, i);
+ ls = (int) strlen(suff->suffix);
+ if ((ls <= lf) && 0 == strcasecomp(suff->suffix, filename + lf - ls)) {
+ int j;
+
+ if (pencoding)
+ *pencoding = suff->encoding;
+ if (pdesc)
+ *pdesc = suff->desc;
+ if (suff->rep) {
+ return suff->rep; /* OK -- found */
+ }
+ for (j = 0; j < n; j++) { /* Got encoding, need representation */
+ int ls2;
+
+ suff = (HTSuffix *) HTList_objectAt(HTSuffixes, j);
+ ls2 = (int) strlen(suff->suffix);
+ if ((ls + ls2 <= lf) &&
+ !strncasecomp(suff->suffix,
+ filename + lf - ls - ls2, ls2)) {
+ if (suff->rep) {
+ if (pdesc && !(*pdesc))
+ *pdesc = suff->desc;
+ if (pencoding && IsUnityEnc(*pencoding) &&
+ *pencoding != WWW_ENC_7BIT &&
+ !IsUnityEnc(suff->encoding))
+ *pencoding = suff->encoding;
+ return suff->rep;
+ }
+ }
+ }
+
+ }
+ }
+
+ /* defaults tree */
+
+ suff = (StrChr(filename, '.')
+ ? (unknown_suffix.rep
+ ? &unknown_suffix
+ : &no_suffix)
+ : &no_suffix);
+
+ /*
+ * Set default encoding unless found with suffix already.
+ */
+ if (pencoding && !*pencoding) {
+ *pencoding = (suff->encoding
+ ? suff->encoding
+ : HTAtom_for("binary"));
+ }
+ return suff->rep ? suff->rep : WWW_BINARY;
+}
+
+/* Revise the file format in relation to the Lynx charset. - FM
+ * -------------------------------------------------------
+ *
+ * This checks the format associated with an anchor for
+ * an extended MIME Content-Type, and if a charset is
+ * indicated, sets Lynx up for proper handling in relation
+ * to the currently selected character set. - FM
+ */
+HTFormat HTCharsetFormat(HTFormat format,
+ HTParentAnchor *anchor,
+ int default_LYhndl)
+{
+ char *cp = NULL, *cp1, *cp2, *cp3 = NULL, *cp4;
+ BOOL chartrans_ok = FALSE;
+ int chndl = -1;
+ const char *format_name = format->name;
+
+ FREE(anchor->charset);
+ if (format_name == 0)
+ format_name = "";
+ StrAllocCopy(cp, format_name);
+ LYLowerCase(cp);
+ if (((cp1 = StrChr(cp, ';')) != NULL) &&
+ (cp2 = strstr(cp1, "charset")) != NULL) {
+ CTRACE((tfp, "HTCharsetFormat: Extended MIME Content-Type is %s\n",
+ format_name));
+ cp2 += 7;
+ while (*cp2 == ' ' || *cp2 == '=')
+ cp2++;
+ StrAllocCopy(cp3, cp2); /* copy to mutilate more */
+ for (cp4 = cp3; (*cp4 != '\0' && *cp4 != '"' &&
+ *cp4 != ';' && *cp4 != ':' &&
+ !WHITE(*cp4)); cp4++) {
+ ; /* do nothing */
+ }
+ *cp4 = '\0';
+ cp4 = cp3;
+ chndl = UCGetLYhndl_byMIME(cp3);
+ if (UCCanTranslateFromTo(chndl, current_char_set)) {
+ chartrans_ok = YES;
+ *cp1 = '\0';
+ format = HTAtom_for(cp);
+ StrAllocCopy(anchor->charset, cp4);
+ HTAnchor_setUCInfoStage(anchor, chndl,
+ UCT_STAGE_MIME,
+ UCT_SETBY_MIME);
+ } else if (chndl < 0) {
+ /*
+ * Got something but we don't recognize it.
+ */
+ chndl = UCLYhndl_for_unrec;
+ if (chndl < 0)
+ /*
+ * UCLYhndl_for_unrec not defined :-( fallback to
+ * UCLYhndl_for_unspec which always valid.
+ */
+ chndl = UCLYhndl_for_unspec; /* always >= 0 */
+ if (UCCanTranslateFromTo(chndl, current_char_set)) {
+ chartrans_ok = YES;
+ HTAnchor_setUCInfoStage(anchor, chndl,
+ UCT_STAGE_MIME,
+ UCT_SETBY_DEFAULT);
+ }
+ }
+ if (chartrans_ok) {
+ LYUCcharset *p_in = HTAnchor_getUCInfoStage(anchor,
+ UCT_STAGE_MIME);
+ LYUCcharset *p_out = HTAnchor_setUCInfoStage(anchor,
+ current_char_set,
+ UCT_STAGE_HTEXT,
+ UCT_SETBY_DEFAULT);
+
+ if (!p_out) {
+ /*
+ * Try again.
+ */
+ p_out = HTAnchor_getUCInfoStage(anchor, UCT_STAGE_HTEXT);
+ }
+ if (!strcmp(p_in->MIMEname, "x-transparent")) {
+ HTPassEightBitRaw = TRUE;
+ HTAnchor_setUCInfoStage(anchor,
+ HTAnchor_getUCLYhndl(anchor,
+ UCT_STAGE_HTEXT),
+ UCT_STAGE_MIME,
+ UCT_SETBY_DEFAULT);
+ }
+ if (!strcmp(p_out->MIMEname, "x-transparent")) {
+ HTPassEightBitRaw = TRUE;
+ HTAnchor_setUCInfoStage(anchor,
+ HTAnchor_getUCLYhndl(anchor,
+ UCT_STAGE_MIME),
+ UCT_STAGE_HTEXT,
+ UCT_SETBY_DEFAULT);
+ }
+ if (p_in->enc != UCT_ENC_CJK) {
+ HTCJK = NOCJK;
+ if (!(p_in->codepoints &
+ UCT_CP_SUBSETOF_LAT1) &&
+ chndl == current_char_set) {
+ HTPassEightBitRaw = TRUE;
+ }
+ } else if (p_out->enc == UCT_ENC_CJK) {
+ Set_HTCJK(p_in->MIMEname, p_out->MIMEname);
+ }
+ } else {
+ /*
+ * Cannot translate. If according to some heuristic the given
+ * charset and the current display character both are likely to be
+ * like ISO-8859 in structure, pretend we have some kind of match.
+ */
+ BOOL given_is_8859 = (BOOL) (!StrNCmp(cp4, "iso-8859-", 9) &&
+ isdigit(UCH(cp4[9])));
+ BOOL given_is_8859like = (BOOL) (given_is_8859 ||
+ !StrNCmp(cp4, "windows-", 8) ||
+ !StrNCmp(cp4, "cp12", 4) ||
+ !StrNCmp(cp4, "cp-12", 5));
+ BOOL given_and_display_8859like = (BOOL) (given_is_8859like &&
+ (strstr(LYchar_set_names[current_char_set],
+ "ISO-8859") ||
+ strstr(LYchar_set_names[current_char_set],
+ "windows-")));
+
+ if (given_and_display_8859like) {
+ *cp1 = '\0';
+ format = HTAtom_for(cp);
+ }
+ if (given_is_8859) {
+ cp1 = &cp4[10];
+ while (*cp1 &&
+ isdigit(UCH(*cp1)))
+ cp1++;
+ *cp1 = '\0';
+ }
+ if (given_and_display_8859like) {
+ StrAllocCopy(anchor->charset, cp4);
+ HTPassEightBitRaw = TRUE;
+ }
+ HTAlert(*cp4 ? cp4 : anchor->charset);
+ }
+ FREE(cp3);
+ } else if (cp1 != NULL) {
+ /*
+ * No charset parameter is present. Ignore all other parameters, as we
+ * do when charset is present. - FM
+ */
+ *cp1 = '\0';
+ format = HTAtom_for(cp);
+ }
+ FREE(cp);
+
+ /*
+ * Set up defaults, if needed. - FM
+ */
+ if (!chartrans_ok && !anchor->charset && default_LYhndl >= 0) {
+ HTAnchor_setUCInfoStage(anchor, default_LYhndl,
+ UCT_STAGE_MIME,
+ UCT_SETBY_DEFAULT);
+ }
+ HTAnchor_copyUCInfoStage(anchor,
+ UCT_STAGE_PARSER,
+ UCT_STAGE_MIME,
+ -1);
+
+ return format;
+}
+
+/* Get various pieces of meta info from file name.
+ * -----------------------------------------------
+ *
+ * LYGetFileInfo fills in information that can be determined without
+ * an actual (new) access to the filesystem, based on current suffix
+ * and character set configuration. If the file has been loaded and
+ * parsed before (with the same URL generated here!) and the anchor
+ * is still around, some results may be influenced by that (in
+ * particular, charset info from a META tag - this is not actually
+ * tested!).
+ * The caller should not keep pointers to the returned objects around
+ * for too long, the valid lifetimes vary. In particular, the returned
+ * charset string should be copied if necessary. If return of the
+ * file_anchor is requested, that one can be used to retrieve
+ * additional bits of info that are stored in the anchor object and
+ * are not covered here; as usual, don't keep pointers to the
+ * file_anchor longer than necessary since the object may disappear
+ * through HTuncache_current_document or at the next document load.
+ * - kw
+ */
+void LYGetFileInfo(const char *filename,
+ HTParentAnchor **pfile_anchor,
+ HTFormat *pformat,
+ HTAtom **pencoding,
+ const char **pdesc,
+ const char **pcharset,
+ int *pfile_cs)
+{
+ char *Afn;
+ char *Aname = NULL;
+ HTFormat format;
+ HTAtom *myEnc = NULL;
+ HTParentAnchor *file_anchor;
+ const char *file_csname;
+ int file_cs;
+
+ /*
+ * Convert filename to URL. Note that it is always supposed to be a
+ * filename, not maybe-filename-maybe-URL, so we don't use
+ * LYFillLocalFileURL and LYEnsureAbsoluteURL. - kw
+ */
+ Afn = HTEscape(filename, URL_PATH);
+ LYLocalFileToURL(&Aname, Afn);
+ file_anchor = HTAnchor_findSimpleAddress(Aname);
+
+ format = HTFileFormat(filename, &myEnc, pdesc);
+ format = HTCharsetFormat(format, file_anchor, UCLYhndl_HTFile_for_unspec);
+ file_cs = HTAnchor_getUCLYhndl(file_anchor, UCT_STAGE_MIME);
+ file_csname = file_anchor->charset;
+ if (!file_csname) {
+ if (file_cs >= 0)
+ file_csname = LYCharSet_UC[file_cs].MIMEname;
+ else
+ file_csname = "display character set";
+ }
+ CTRACE((tfp, "GetFileInfo: '%s' is a%s %s %s file, charset=%s (%d).\n",
+ filename,
+ ((myEnc && *HTAtom_name(myEnc) == '8') ? "n" : myEnc ? "" :
+ *HTAtom_name(format) == 'a' ? "n" : ""),
+ myEnc ? HTAtom_name(myEnc) : "",
+ HTAtom_name(format),
+ file_csname,
+ file_cs));
+ FREE(Afn);
+ FREE(Aname);
+ if (pfile_anchor)
+ *pfile_anchor = file_anchor;
+ if (pformat)
+ *pformat = format;
+ if (pencoding)
+ *pencoding = myEnc;
+ if (pcharset)
+ *pcharset = file_csname;
+ if (pfile_cs)
+ *pfile_cs = file_cs;
+}
+
+/* Determine value from file name.
+ * -------------------------------
+ *
+ */
+float HTFileValue(const char *filename)
+{
+ HTSuffix *suff;
+ int n;
+ int i;
+ int lf = (int) strlen(filename);
+
+#ifndef NO_INIT
+ if (!HTSuffixes)
+ HTFileInit();
+#endif /* !NO_INIT */
+ n = HTList_count(HTSuffixes);
+ for (i = 0; i < n; i++) {
+ int ls;
+
+ suff = (HTSuffix *) HTList_objectAt(HTSuffixes, i);
+ ls = (int) strlen(suff->suffix);
+ if ((ls <= lf) && 0 == strcmp(suff->suffix, filename + lf - ls)) {
+ CTRACE((tfp, "File: Value of %s is %.3f\n",
+ filename, suff->quality));
+ return suff->quality; /* OK -- found */
+ }
+ }
+ return (float) 0.3; /* Dunno! */
+}
+
+/*
+ * Determine compression type from file name, by looking at its suffix.
+ * Sets as side-effect a pointer to the "dot" that begins the suffix.
+ */
+CompressFileType HTCompressFileType(const char *filename,
+ const char *dots,
+ int *rootlen)
+{
+ CompressFileType result = cftNone;
+ char *search;
+
+ if ((search = FindSearch(filename)) != 0) {
+ char *newname = NULL;
+
+ StrAllocCopy(newname, filename);
+ newname[((const char *) search) - filename] = '\0';
+ result = HTCompressFileType(newname, dots, rootlen);
+ free(newname);
+ } else {
+ size_t len;
+ const char *ftype;
+
+ VMS_DEL_VERSION(filename);
+ len = strlen(filename);
+ ftype = filename + len;
+
+ if ((len > 3)
+ && !strcasecomp((ftype - 2), "br")
+ && StrChr(dots, ftype[-3]) != 0) {
+ result = cftBrotli;
+ ftype -= 3;
+ } else if ((len > 4)
+ && !strcasecomp((ftype - 3), "bz2")
+ && StrChr(dots, ftype[-4]) != 0) {
+ result = cftBzip2;
+ ftype -= 4;
+ } else if ((len > 3)
+ && !strcasecomp((ftype - 2), "gz")
+ && StrChr(dots, ftype[-3]) != 0) {
+ result = cftGzip;
+ ftype -= 3;
+ } else if ((len > 3)
+ && !strcasecomp((ftype - 2), "zz")
+ && StrChr(dots, ftype[-3]) != 0) {
+ result = cftDeflate;
+ ftype -= 3;
+ } else if ((len > 2)
+ && !strcmp((ftype - 1), "Z")
+ && StrChr(dots, ftype[-2]) != 0) {
+ result = cftCompress;
+ ftype -= 2;
+ }
+
+ *rootlen = (int) (ftype - filename);
+
+ CTRACE((tfp, "HTCompressFileType(%s) returns %d:%s\n",
+ filename, (int) result, filename + *rootlen));
+ }
+ return result;
+}
+
+/*
+ * Determine expected file-suffix from the compression method.
+ */
+const char *HTCompressTypeToSuffix(CompressFileType method)
+{
+ const char *result = "";
+
+ switch (method) {
+ default:
+ case cftNone:
+ result = "";
+ break;
+ case cftGzip:
+ result = ".gz";
+ break;
+ case cftCompress:
+ result = ".Z";
+ break;
+ case cftBzip2:
+ result = ".bz2";
+ break;
+ case cftDeflate:
+ result = ".zz";
+ break;
+ case cftBrotli:
+ result = ".br";
+ break;
+ }
+ return result;
+}
+
+/*
+ * Determine compression encoding from the compression method.
+ */
+const char *HTCompressTypeToEncoding(CompressFileType method)
+{
+ const char *result = NULL;
+
+ switch (method) {
+ default:
+ case cftNone:
+ result = NULL;
+ break;
+ case cftGzip:
+ result = "gzip";
+ break;
+ case cftCompress:
+ result = "compress";
+ break;
+ case cftBzip2:
+ result = "bzip2";
+ break;
+ case cftDeflate:
+ result = "deflate";
+ break;
+ case cftBrotli:
+ result = "brotli";
+ break;
+ }
+ return result;
+}
+
+/*
+ * Check if the token from "Content-Encoding" corresponds to a compression
+ * type. RFC 2068 (and cut/paste into RFC 2616) lists these:
+ * gzip
+ * compress
+ * deflate
+ * as well as "identity" (but that does nothing).
+ */
+CompressFileType HTEncodingToCompressType(const char *coding)
+{
+ CompressFileType result = cftNone;
+
+ if (coding == NULL) {
+ result = cftNone;
+ } else if (!strcasecomp(coding, "gzip") ||
+ !strcasecomp(coding, "x-gzip")) {
+ result = cftGzip;
+ } else if (!strcasecomp(coding, "compress") ||
+ !strcasecomp(coding, "x-compress")) {
+ result = cftCompress;
+ } else if (!strcasecomp(coding, "bzip2") ||
+ !strcasecomp(coding, "x-bzip2")) {
+ result = cftBzip2;
+ } else if (!strcasecomp(coding, "br") || /* actual */
+ !strcasecomp(coding, "brotli") || /* expected */
+ !strcasecomp(coding, "x-brotli")) {
+ result = cftBrotli;
+ } else if (!strcasecomp(coding, "deflate") ||
+ !strcasecomp(coding, "x-deflate")) {
+ result = cftDeflate;
+ }
+ return result;
+}
+
+CompressFileType HTContentTypeToCompressType(const char *ct)
+{
+ CompressFileType method = cftNone;
+
+ if (ct == NULL) {
+ method = cftNone;
+ } else if (!strncasecomp(ct, "application/gzip", 16) ||
+ !strncasecomp(ct, "application/x-gzip", 18)) {
+ method = cftGzip;
+ } else if (!strncasecomp(ct, "application/compress", 20) ||
+ !strncasecomp(ct, "application/x-compress", 22)) {
+ method = cftCompress;
+ } else if (!strncasecomp(ct, "application/bzip2", 17) ||
+ !strncasecomp(ct, "application/x-bzip2", 19)) {
+ method = cftBzip2;
+ } else if (!strncasecomp(ct, "application/br", 14) ||
+ !strncasecomp(ct, "application/brotli", 18) ||
+ !strncasecomp(ct, "application/x-brotli", 20)) {
+ method = cftBrotli;
+ }
+ return method;
+}
+
+/*
+ * Check the anchor's content_type and content_encoding elements for a gzip or
+ * Unix compressed file -FM, TD
+ */
+CompressFileType HTContentToCompressType(HTParentAnchor *anchor)
+{
+ CompressFileType method = cftNone;
+ const char *ct = HTAnchor_content_type(anchor);
+ const char *ce = HTAnchor_content_encoding(anchor);
+
+ if (ct != 0) {
+ method = HTContentTypeToCompressType(ct);
+ } else if (ce != 0) {
+ method = HTEncodingToCompressType(ce);
+ }
+ return method;
+}
+
+/* Determine write access to a file.
+ * ---------------------------------
+ *
+ * On exit:
+ * Returns YES if file can be accessed and can be written to.
+ *
+ * Bugs:
+ * 1. No code for non-unix systems.
+ * 2. Isn't there a quicker way?
+ */
+BOOL HTEditable(const char *filename GCC_UNUSED)
+{
+#ifndef NO_GROUPS
+ GETGROUPS_T groups[NGROUPS];
+ uid_t myUid;
+ int ngroups; /* The number of groups */
+ struct stat fileStatus;
+ int i;
+
+ if (stat(filename, &fileStatus)) /* Get details of filename */
+ return NO; /* Can't even access file! */
+
+ ngroups = getgroups(NGROUPS, groups); /* Groups to which I belong */
+ myUid = geteuid(); /* Get my user identifier */
+
+ if (TRACE) {
+ int i2;
+
+ fprintf(tfp,
+ "File mode is 0%o, uid=%d, gid=%d. My uid=%d, %d groups (",
+ (unsigned int) fileStatus.st_mode,
+ (int) fileStatus.st_uid,
+ (int) fileStatus.st_gid,
+ (int) myUid,
+ (int) ngroups);
+ for (i2 = 0; i2 < ngroups; i2++)
+ fprintf(tfp, " %d", (int) groups[i2]);
+ fprintf(tfp, ")\n");
+ }
+
+ if (fileStatus.st_mode & 0002) /* I can write anyway? */
+ return YES;
+
+ if ((fileStatus.st_mode & 0200) /* I can write my own file? */
+ &&(fileStatus.st_uid == myUid))
+ return YES;
+
+ if (fileStatus.st_mode & 0020) /* Group I am in can write? */
+ {
+ for (i = 0; i < ngroups; i++) {
+ if (groups[i] == fileStatus.st_gid)
+ return YES;
+ }
+ }
+ CTRACE((tfp, "\tFile is not editable.\n"));
+#endif /* NO_GROUPS */
+ return NO; /* If no excuse, can't do */
+}
+
+/* Make a save stream.
+ * -------------------
+ *
+ * The stream must be used for writing back the file.
+ * @@@ no backup done
+ */
+HTStream *HTFileSaveStream(HTParentAnchor *anchor)
+{
+ const char *addr = anchor->address;
+ char *localname = HTLocalName(addr);
+ FILE *fp = fopen(localname, BIN_W);
+
+ FREE(localname);
+ if (!fp)
+ return NULL;
+
+ return HTFWriter_new(fp);
+}
+
+/* Output one directory entry.
+ * ---------------------------
+ */
+void HTDirEntry(HTStructured * target, const char *tail, const char *entry)
+{
+ char *relative = NULL;
+ char *stripped = NULL;
+ char *escaped = NULL;
+ int len;
+
+ if (entry == NULL)
+ entry = "";
+ StrAllocCopy(escaped, entry);
+ LYTrimPathSep(escaped);
+ if (strcmp(escaped, "..") != 0) {
+ stripped = escaped;
+ escaped = HTEscape(stripped, URL_XPALPHAS);
+ if (((len = (int) strlen(escaped)) > 2) &&
+ escaped[(len - 3)] == '%' &&
+ escaped[(len - 2)] == '2' &&
+ TOUPPER(escaped[(len - 1)]) == 'F') {
+ escaped[(len - 3)] = '\0';
+ }
+ }
+
+ if (isEmpty(tail)) {
+ /*
+ * Handle extra slash at end of path.
+ */
+ HTStartAnchor(target, NULL, (escaped[0] != '\0' ? escaped : "/"));
+ } else {
+ /*
+ * If empty tail, gives absolute ref below.
+ */
+ relative = 0;
+ HTSprintf0(&relative, "%s%s%s",
+ tail,
+ (*escaped != '\0' ? "/" : ""),
+ escaped);
+ HTStartAnchor(target, NULL, relative);
+ FREE(relative);
+ }
+ FREE(stripped);
+ FREE(escaped);
+}
+
+static BOOL view_structured(HTFormat format_out)
+{
+ BOOL result = FALSE;
+
+#ifdef USE_PRETTYSRC
+ if (psrc_view
+ || (format_out == WWW_DUMP))
+ result = TRUE;
+#else
+ if (format_out == WWW_SOURCE)
+ result = TRUE;
+#endif
+ return result;
+}
+
+/*
+ * Write a DOCTYPE to the given stream if we happen to want to see the
+ * source view, or are dumping source. This is not needed when the source
+ * is not visible, since the document is rendered from a HTStructured object.
+ */
+void HTStructured_doctype(HTStructured * target, HTFormat format_out)
+{
+ if (view_structured(format_out))
+ PUTS(LYNX_DOCTYPE "\n");
+}
+
+void HTStructured_meta(HTStructured * target, HTFormat format_out)
+{
+ if (view_structured(format_out))
+ PUTS("<meta http-equiv=\"Content-Type\" content=\"" STR_HTML
+ "; charset=iso-8859-1\">\n");
+}
+/* Output parent directory entry.
+ * ------------------------------
+ *
+ * This gives the TITLE and H1 header, and also a link
+ * to the parent directory if appropriate.
+ *
+ * On exit:
+ * Returns TRUE if an "Up to <parent>" link was not created
+ * for a readable local directory because LONG_LIST is defined
+ * and NO_PARENT_DIR_REFERENCE is not defined, so that the
+ * calling function should use LYListFmtParse() to create a link
+ * to the parent directory. Otherwise, it returns FALSE. - FM
+ */
+BOOL HTDirTitles(HTStructured * target, HTParentAnchor *anchor,
+ HTFormat format_out,
+ int tildeIsTop)
+{
+ const char *logical = anchor->address;
+ char *path = HTParse(logical, "", PARSE_PATH + PARSE_PUNCTUATION);
+ char *current;
+ char *cp = NULL;
+ BOOL need_parent_link = FALSE;
+ int i;
+
+#if defined(USE_DOS_DRIVES)
+ BOOL local_link = (strlen(logical) > 18
+ && !strncasecomp(logical, "file://localhost/", 17)
+ && LYIsDosDrive(logical + 17));
+ BOOL is_remote = !local_link;
+
+#else
+#define is_remote TRUE
+#endif
+
+ /*
+ * Check tildeIsTop for treating home directory as Welcome (assume the
+ * tilde is not followed by a username). - FM
+ */
+ if (tildeIsTop && !StrNCmp(path, "/~", 2)) {
+ if (path[2] == '\0') {
+ path[1] = '\0';
+ } else {
+ for (i = 0; path[(i + 2)]; i++) {
+ path[i] = path[(i + 2)];
+ }
+ path[i] = '\0';
+ }
+ }
+
+ /*
+ * Trim out the ;type= parameter, if present. - FM
+ */
+ if ((cp = strrchr(path, ';')) != NULL) {
+ if (!strncasecomp((cp + 1), "type=", 5)) {
+ if (TOUPPER(*(cp + 6)) == 'D' ||
+ TOUPPER(*(cp + 6)) == 'A' ||
+ TOUPPER(*(cp + 6)) == 'I')
+ *cp = '\0';
+ }
+ cp = NULL;
+ }
+ current = LYPathLeaf(path); /* last part or "" */
+
+ {
+ char *printable = NULL;
+
+#ifdef DIRED_SUPPORT
+ printable = HTURLPath_toFile(((!strncasecomp(path, "/%2F", 4)) /* "//" ? */
+ ? (path + 1)
+ : path),
+ TRUE,
+ is_remote);
+ if (0 == strncasecomp(printable, "/vmsysu:", 8) ||
+ 0 == strncasecomp(printable, "/anonymou.", 10)) {
+ StrAllocCopy(cp, (printable + 1));
+ StrAllocCopy(printable, cp);
+ FREE(cp);
+ }
+#else
+ StrAllocCopy(printable, current);
+ HTUnEscape(printable);
+#endif /* DIRED_SUPPORT */
+
+ HTStructured_doctype(target, format_out);
+
+ START(HTML_HEAD);
+ PUTC('\n');
+ START(HTML_TITLE);
+ PUTS(*printable ? printable : WELCOME_MSG);
+ PUTS(SEGMENT_DIRECTORY);
+ END(HTML_TITLE);
+ PUTC('\n');
+ HTStructured_meta(target, format_out);
+ END(HTML_HEAD);
+ PUTC('\n');
+
+ START(HTML_BODY);
+ PUTC('\n');
+
+#ifdef DIRED_SUPPORT
+ START(HTML_H2);
+ PUTS(*printable ? SEGMENT_CURRENT_DIR : "");
+ PUTS(*printable ? printable : WELCOME_MSG);
+ END(HTML_H2);
+ PUTC('\n');
+#else
+ START(HTML_H1);
+ PUTS(*printable ? printable : WELCOME_MSG);
+ END(HTML_H1);
+ PUTC('\n');
+#endif /* DIRED_SUPPORT */
+ if (((0 == strncasecomp(printable, "vmsysu:", 7)) &&
+ (cp = StrChr(printable, '.')) != NULL &&
+ StrChr(cp, '/') == NULL) ||
+ (0 == strncasecomp(printable, "anonymou.", 9) &&
+ StrChr(printable, '/') == NULL)) {
+ FREE(printable);
+ FREE(path);
+ return (need_parent_link);
+ }
+ FREE(printable);
+ }
+
+#ifndef NO_PARENT_DIR_REFERENCE
+ /*
+ * Make link back to parent directory.
+ */
+ if (current - path > 0
+ && LYIsPathSep(current[-1])
+ && current[0] != '\0') { /* was a slash AND something else too */
+ char *parent = NULL;
+ char *relative = NULL;
+
+ current[-1] = '\0';
+ parent = strrchr(path, '/'); /* penultimate slash */
+
+ if ((parent &&
+ (!strcmp(parent, "/..") ||
+ !strncasecomp(parent, "/%2F", 4))) ||
+ !strncasecomp(current, "%2F", 3)) {
+ FREE(path);
+ return (need_parent_link);
+ }
+
+ relative = 0;
+ HTSprintf0(&relative, "%s/..", current);
+
+#if defined(DOSPATH) || defined(__EMX__)
+ if (local_link) {
+ if (parent != 0 && strlen(parent) == 3) {
+ StrAllocCat(relative, "/.");
+ }
+ } else
+#endif
+
+#if !defined (VMS)
+ {
+ /*
+ * On Unix, if it's not ftp and the directory cannot be read, don't
+ * put out a link.
+ *
+ * On VMS, this problem is dealt with internally by
+ * HTVMSBrowseDir().
+ */
+ DIR *dp = NULL;
+
+ if (LYisLocalFile(logical)) {
+ /*
+ * We need an absolute file path for the opendir. We also need
+ * to unescape for this test. Don't worry about %2F now, they
+ * presumably have been dealt with above, and shouldn't appear
+ * for local files anyway... Assume OS / filesystem will just
+ * ignore superfluous slashes. - KW
+ */
+ char *fullparentpath = NULL;
+
+ /*
+ * Path has been shortened above.
+ */
+ StrAllocCopy(fullparentpath, *path ? path : "/");
+
+ /*
+ * Guard against weirdness.
+ */
+ if (0 == strcmp(current, "..")) {
+ StrAllocCat(fullparentpath, "/../..");
+ } else if (0 == strcmp(current, ".")) {
+ StrAllocCat(fullparentpath, "/..");
+ }
+
+ HTUnEscape(fullparentpath);
+ if ((dp = opendir(fullparentpath)) == NULL) {
+ FREE(fullparentpath);
+ FREE(relative);
+ FREE(path);
+ return (need_parent_link);
+ }
+ closedir(dp);
+ FREE(fullparentpath);
+#ifdef LONG_LIST
+ need_parent_link = TRUE;
+ FREE(path);
+ FREE(relative);
+ return (need_parent_link);
+#endif /* LONG_LIST */
+ }
+ }
+#endif /* !VMS */
+ HTStartAnchor(target, "", relative);
+ FREE(relative);
+
+ PUTS(SEGMENT_UP_TO);
+ if (parent) {
+ if ((0 == strcmp(current, ".")) ||
+ (0 == strcmp(current, ".."))) {
+ /*
+ * Should not happen, but if it does, at least avoid giving
+ * misleading info. - KW
+ */
+ PUTS("..");
+ } else {
+ char *printable = NULL;
+
+ StrAllocCopy(printable, parent + 1);
+ HTUnEscape(printable);
+ PUTS(printable);
+ FREE(printable);
+ }
+ } else {
+ PUTC('/');
+ }
+ END(HTML_A);
+ PUTC('\n');
+ }
+#endif /* !NO_PARENT_DIR_REFERENCE */
+
+ FREE(path);
+ return (need_parent_link);
+}
+
+#if defined HAVE_READDIR
+/* Send README file.
+ * -----------------
+ *
+ * If a README file exists, then it is inserted into the document here.
+ */
+static void do_readme(HTStructured * target, const char *localname)
+{
+ FILE *fp;
+ char *readme_file_name = NULL;
+ int ch;
+
+ HTSprintf0(&readme_file_name, "%s/%s", localname, HT_DIR_README_FILE);
+
+ fp = fopen(readme_file_name, "r");
+
+ if (fp) {
+ START(HTML_PRE);
+ while ((ch = fgetc(fp)) != EOF) {
+ PUTC((char) ch);
+ }
+ END(HTML_PRE);
+ HTDisplayPartial();
+ fclose(fp);
+ }
+ FREE(readme_file_name);
+}
+
+#define DIRED_BLOK(obj) (((DIRED *)(obj))->sort_tags)
+#define DIRED_NAME(obj) (((DIRED *)(obj))->file_name)
+
+#define NM_cmp(a,b) ((a) < (b) ? -1 : ((a) > (b) ? 1 : 0))
+
+#if defined(LONG_LIST) && defined(DIRED_SUPPORT)
+static const char *file_type(const char *path)
+{
+ const char *type;
+
+ while (*path == '.')
+ ++path;
+ type = StrChr(path, '.');
+ if (type == NULL)
+ type = "";
+ return type;
+}
+#endif /* LONG_LIST && DIRED_SUPPORT */
+
+static int dired_cmp(void *a, void *b)
+{
+ DIRED *p = (DIRED *) a;
+ DIRED *q = (DIRED *) b;
+ int code = p->sort_tags - q->sort_tags;
+
+#if defined(LONG_LIST) && defined(DIRED_SUPPORT)
+ if (code == 0) {
+ switch (dir_list_order) {
+ case ORDER_BY_SIZE:
+ code = -NM_cmp(p->file_info.st_size, q->file_info.st_size);
+ break;
+ case ORDER_BY_DATE:
+ code = -NM_cmp(p->file_info.st_mtime, q->file_info.st_mtime);
+ break;
+ case ORDER_BY_MODE:
+ code = NM_cmp(p->file_info.st_mode, q->file_info.st_mode);
+ break;
+ case ORDER_BY_USER:
+ code = NM_cmp(p->file_info.st_uid, q->file_info.st_uid);
+ break;
+ case ORDER_BY_GROUP:
+ code = NM_cmp(p->file_info.st_gid, q->file_info.st_gid);
+ break;
+ case ORDER_BY_TYPE:
+ code = AS_cmp(file_type(p->file_name), file_type(q->file_name));
+ break;
+ default:
+ code = 0;
+ break;
+ }
+ }
+#endif /* LONG_LIST && DIRED_SUPPORT */
+ if (code == 0)
+ code = AS_cmp(p->file_name, q->file_name);
+#if 0
+ CTRACE((tfp, "dired_cmp(%d) ->%d\n\t%c:%s (%s)\n\t%c:%s (%s)\n",
+ dir_list_order,
+ code,
+ p->sort_tags, p->file_name, file_type(p->file_name),
+ q->sort_tags, q->file_name, file_type(q->file_name)));
+#endif
+ return code;
+}
+
+static int print_local_dir(DIR *dp, char *localname,
+ HTParentAnchor *anchor,
+ HTFormat format_out,
+ HTStream *sink)
+{
+ HTStructured *target; /* HTML object */
+ HTBTree *bt;
+ HTStructuredClass targetClass;
+ STRUCT_DIRENT *dirbuf;
+ char *pathname = NULL;
+ char *tail = NULL;
+ const char *p;
+ char *tmpfilename = NULL;
+ BOOL need_parent_link = FALSE;
+ BOOL preformatted = FALSE;
+ int status;
+ struct stat *actual_info;
+
+#ifdef DISP_PARTIAL
+ int num_of_entries = 0; /* lines counter */
+#endif
+
+#ifdef S_IFLNK
+ struct stat link_info;
+#endif
+
+ CTRACE((tfp, "print_local_dir() started\n"));
+
+ pathname = HTParse(anchor->address, "",
+ PARSE_PATH + PARSE_PUNCTUATION);
+
+ if ((p = strrchr(pathname, '/')) == NULL)
+ p = "/";
+ StrAllocCopy(tail, (p + 1));
+ FREE(pathname);
+
+ if (UCLYhndl_HTFile_for_unspec >= 0) {
+ HTAnchor_setUCInfoStage(anchor,
+ UCLYhndl_HTFile_for_unspec,
+ UCT_STAGE_PARSER,
+ UCT_SETBY_DEFAULT);
+ }
+
+ target = HTML_new(anchor, format_out, sink);
+ targetClass = *target->isa; /* Copy routine entry points */
+
+ /*
+ * The need_parent_link flag will be set if an "Up to <parent>" link was
+ * not created for a readable parent in HTDirTitles() because LONG_LIST is
+ * defined and NO_PARENT_DIR_REFERENCE is not defined so that need we to
+ * create the link via an LYListFmtParse() call. - FM
+ */
+ need_parent_link = HTDirTitles(target, anchor, format_out, FALSE);
+
+#ifdef DIRED_SUPPORT
+ if (!isLYNXCGI(anchor->address)) {
+ HTAnchor_setFormat(anchor, WWW_DIRED);
+ lynx_edit_mode = TRUE;
+ }
+#endif /* DIRED_SUPPORT */
+ if (HTDirReadme == HT_DIR_README_TOP)
+ do_readme(target, localname);
+
+ bt = HTBTree_new(dired_cmp);
+
+ _HTProgress(READING_DIRECTORY);
+ status = HT_LOADED; /* assume we don't get interrupted */
+ while ((dirbuf = readdir(dp)) != NULL) {
+ /*
+ * While there are directory entries to be read...
+ */
+ DIRED *data = NULL;
+
+#ifdef STRUCT_DIRENT__D_INO
+ if (dirbuf->d_ino == 0)
+ /*
+ * If the entry is not being used, skip it.
+ */
+ continue;
+#endif
+ /*
+ * Skip self, parent if handled in HTDirTitles() or if
+ * NO_PARENT_DIR_REFERENCE is not defined, and any dot files if
+ * no_dotfiles is set or show_dotfiles is not set. - FM
+ */
+ if (!strcmp(dirbuf->d_name, ".") /* self */ ||
+ (!strcmp(dirbuf->d_name, "..") /* parent */ &&
+ need_parent_link == FALSE) ||
+ ((strcmp(dirbuf->d_name, "..")) &&
+ (dirbuf->d_name[0] == '.' &&
+ (no_dotfiles || !show_dotfiles))))
+ continue;
+
+ StrAllocCopy(tmpfilename, localname);
+ /*
+ * If filename is not root directory, add trailing separator.
+ */
+ LYAddPathSep(&tmpfilename);
+
+ StrAllocCat(tmpfilename, dirbuf->d_name);
+ data = (DIRED *) malloc(sizeof(DIRED) + strlen(dirbuf->d_name) + 4);
+ if (data == NULL) {
+ status = HT_PARTIAL_CONTENT;
+ break;
+ }
+ LYTrimPathSep(tmpfilename);
+
+ actual_info = &(data->file_info);
+#ifdef S_IFLNK
+ if (lstat(tmpfilename, actual_info) < 0) {
+ actual_info->st_mode = 0;
+ } else {
+ if (S_ISLNK(actual_info->st_mode)) {
+ actual_info = &link_info;
+ if (stat(tmpfilename, actual_info) < 0)
+ actual_info->st_mode = 0;
+ }
+ }
+#else
+ if (stat(tmpfilename, actual_info) < 0)
+ actual_info->st_mode = 0;
+#endif
+
+ strcpy(data->file_name, dirbuf->d_name);
+#ifndef DIRED_SUPPORT
+ if (S_ISDIR(actual_info->st_mode)) {
+ data->sort_tags = 'D';
+ } else {
+ data->sort_tags = 'F';
+ /* D & F to have first directories, then files */
+ }
+#else
+ if (S_ISDIR(actual_info->st_mode)) {
+ if (dir_list_style == MIXED_STYLE) {
+ data->sort_tags = ' ';
+ LYAddPathSep0(data->file_name);
+ } else if (!strcmp(dirbuf->d_name, "..")) {
+ data->sort_tags = 'A';
+ } else {
+ data->sort_tags = 'D';
+ }
+ } else if (dir_list_style == MIXED_STYLE) {
+ data->sort_tags = ' ';
+ } else if (dir_list_style == FILES_FIRST) {
+ data->sort_tags = 'C';
+ /* C & D to have first files, then directories */
+ } else {
+ data->sort_tags = 'F';
+ }
+#endif /* !DIRED_SUPPORT */
+ /*
+ * Sort dirname in the tree bt.
+ */
+ HTBTree_add(bt, data);
+
+#ifdef DISP_PARTIAL
+ /* optimize for expensive operation: */
+ if (num_of_entries % (partial_threshold > 0 ?
+ partial_threshold : display_lines) == 0) {
+ if (HTCheckForInterrupt()) {
+ status = HT_PARTIAL_CONTENT;
+ break;
+ }
+ }
+ num_of_entries++;
+#endif /* DISP_PARTIAL */
+
+ } /* end while directory entries left to read */
+
+ if (status != HT_PARTIAL_CONTENT)
+ _HTProgress(OPERATION_OK);
+ else
+ CTRACE((tfp, "Reading the directory interrupted by user\n"));
+
+ /*
+ * Run through tree printing out in order.
+ */
+ {
+ HTBTElement *next_element = HTBTree_next(bt, NULL);
+
+ /* pick up the first element of the list */
+ int num_of_entries_output = 0; /* lines counter */
+
+ char state;
+
+ /* I for initial (.. file),
+ D for directory file,
+ F for file */
+
+#ifdef DIRED_SUPPORT
+ char test;
+#endif /* DIRED_SUPPORT */
+ state = 'I';
+
+ while (next_element != NULL) {
+ DIRED *entry;
+
+#ifndef DISP_PARTIAL
+ if (num_of_entries_output % HTMAX(display_lines, 10) == 0) {
+ if (HTCheckForInterrupt()) {
+ _HTProgress(TRANSFER_INTERRUPTED);
+ status = HT_PARTIAL_CONTENT;
+ break;
+ }
+ }
+#endif
+ StrAllocCopy(tmpfilename, localname);
+ /*
+ * If filename is not root directory.
+ */
+ LYAddPathSep(&tmpfilename);
+
+ entry = (DIRED *) (HTBTree_object(next_element));
+ /*
+ * Append the current entry's filename to the path.
+ */
+ StrAllocCat(tmpfilename, entry->file_name);
+ HTSimplify(tmpfilename, LYIsPathSep(*tmpfilename));
+ /*
+ * Output the directory entry.
+ */
+ if (strcmp(DIRED_NAME(HTBTree_object(next_element)), "..")) {
+#ifdef DIRED_SUPPORT
+ test =
+ (char) (DIRED_BLOK(HTBTree_object(next_element))
+ == 'D' ? 'D' : 'F');
+ if (state != test) {
+#ifndef LONG_LIST
+ if (dir_list_style == FILES_FIRST) {
+ if (state == 'F') {
+ END(HTML_DIR);
+ PUTC('\n');
+ }
+ } else if (dir_list_style != MIXED_STYLE)
+ if (state == 'D') {
+ END(HTML_DIR);
+ PUTC('\n');
+ }
+#endif /* !LONG_LIST */
+ state =
+ (char) (DIRED_BLOK(HTBTree_object(next_element))
+ == 'D' ? 'D' : 'F');
+ if (preformatted) {
+ END(HTML_PRE);
+ PUTC('\n');
+ preformatted = FALSE;
+ }
+ START(HTML_H2);
+ if (dir_list_style != MIXED_STYLE) {
+ START(HTML_EM);
+ PUTS(state == 'D'
+ ? LABEL_SUBDIRECTORIES
+ : LABEL_FILES);
+ END(HTML_EM);
+ }
+ END(HTML_H2);
+ PUTC('\n');
+#ifndef LONG_LIST
+ START(HTML_DIR);
+ PUTC('\n');
+#endif /* !LONG_LIST */
+ }
+#else
+ if (state != DIRED_BLOK(HTBTree_object(next_element))) {
+#ifndef LONG_LIST
+ if (state == 'D') {
+ END(HTML_DIR);
+ PUTC('\n');
+ }
+#endif /* !LONG_LIST */
+ state =
+ (char) (DIRED_BLOK(HTBTree_object(next_element))
+ == 'D' ? 'D' : 'F');
+ if (preformatted) {
+ END(HTML_PRE);
+ PUTC('\n');
+ preformatted = FALSE;
+ }
+ START(HTML_H2);
+ START(HTML_EM);
+ PUTS(state == 'D'
+ ? LABEL_SUBDIRECTORIES
+ : LABEL_FILES);
+ END(HTML_EM);
+ END(HTML_H2);
+ PUTC('\n');
+#ifndef LONG_LIST
+ START(HTML_DIR);
+ PUTC('\n');
+#endif /* !LONG_LIST */
+ }
+#endif /* DIRED_SUPPORT */
+#ifndef LONG_LIST
+ START(HTML_LI);
+#endif /* !LONG_LIST */
+ }
+ if (!preformatted) {
+ START(HTML_PRE);
+ PUTC('\n');
+ preformatted = TRUE;
+ }
+#ifdef LONG_LIST
+ LYListFmtParse(list_format, entry, tmpfilename, target, tail);
+#else
+ HTDirEntry(target, tail, entry->file_name);
+ PUTS(entry->file_name);
+ END(HTML_A);
+ MAYBE_END(HTML_LI);
+ PUTC('\n');
+#endif /* LONG_LIST */
+
+ next_element = HTBTree_next(bt, next_element);
+ /* pick up the next element of the list;
+ if none, return NULL */
+
+ /* optimize for expensive operation: */
+#ifdef DISP_PARTIAL
+ if (num_of_entries_output %
+ ((partial_threshold > 0)
+ ? partial_threshold
+ : display_lines) == 0) {
+ /* num_of_entries, num_of_entries_output... */
+ HTDisplayPartial();
+
+ if (HTCheckForInterrupt()) {
+ _HTProgress(TRANSFER_INTERRUPTED);
+ status = HT_PARTIAL_CONTENT;
+ break;
+ }
+ }
+ num_of_entries_output++;
+#endif /* DISP_PARTIAL */
+
+ } /* end while next_element */
+
+ if (status == HT_LOADED) {
+ if (state == 'I') {
+ START(HTML_P);
+ PUTS("Empty Directory");
+ }
+#ifndef LONG_LIST
+ else
+ END(HTML_DIR);
+#endif /* !LONG_LIST */
+ }
+ } /* end printing out the tree in order */
+ if (preformatted) {
+ END(HTML_PRE);
+ PUTC('\n');
+ }
+ END(HTML_BODY);
+ PUTC('\n');
+
+ FREE(tmpfilename);
+ FREE(tail);
+ HTBTreeAndObject_free(bt);
+
+ if (status == HT_LOADED) {
+ if (HTDirReadme == HT_DIR_README_BOTTOM)
+ do_readme(target, localname);
+ FREE_TARGET;
+ } else {
+ ABORT_TARGET;
+ }
+ HTFinishDisplayPartial();
+ return status; /* document loaded, maybe partial */
+}
+#endif /* HAVE_READDIR */
+
+#ifndef VMS
+int HTStat(const char *filename,
+ struct stat *data)
+{
+ int result = -1;
+ size_t len = strlen(filename);
+
+ if (len != 0 && LYIsPathSep(filename[len - 1])) {
+ char *temp_name = NULL;
+
+ HTSprintf0(&temp_name, "%s.", filename);
+ result = HTStat(temp_name, data);
+ FREE(temp_name);
+ } else {
+ result = stat(filename, data);
+#ifdef _WINDOWS
+ /*
+ * Someone claims that stat() doesn't give the proper result for a
+ * directory on Windows.
+ */
+ if (result == -1
+ && access(filename, 0) == 0) {
+ data->st_mode = S_IFDIR;
+ result = 0;
+ }
+#endif
+ }
+ return result;
+}
+#endif
+
+#if defined(USE_ZLIB) || defined(USE_BZLIB)
+static BOOL sniffStream(FILE *fp, char *buffer, size_t needed)
+{
+ long offset = ftell(fp);
+ BOOL result = FALSE;
+
+ if (offset >= 0) {
+ if (fread(buffer, sizeof(char), needed, fp) == needed) {
+ result = TRUE;
+ }
+ if (fseek(fp, offset, SEEK_SET) < 0) {
+ CTRACE((tfp, "error seeking in stream\n"));
+ result = FALSE;
+ }
+ }
+ return result;
+}
+#endif
+
+#ifdef USE_ZLIB
+static BOOL isGzipStream(FILE *fp)
+{
+ char buffer[3];
+ BOOL result;
+
+ if (sniffStream(fp, buffer, sizeof(buffer))
+ && !MemCmp(buffer, "\037\213", sizeof(buffer) - 1)) {
+ result = TRUE;
+ } else {
+ CTRACE((tfp, "not a gzip-stream\n"));
+ result = FALSE;
+ }
+ return result;
+}
+
+/*
+ * Strictly speaking, DEFLATE has no header bytes. But decode what we can,
+ * (to eliminate the one "reserved" pattern) and provide a trace. See RFC-1951
+ * discussion of BFINAL and BTYPE.
+ */
+static BOOL isDeflateStream(FILE *fp)
+{
+ char buffer[3];
+ BOOL result = FALSE;
+
+ if (sniffStream(fp, buffer, sizeof(buffer))) {
+ int bit1 = ((buffer[0] >> 0) & 1);
+ int bit2 = ((buffer[0] >> 1) & 1);
+ int bit3 = ((buffer[0] >> 2) & 1);
+ int btype = ((bit3 << 1) + bit2);
+
+ if (!MemCmp(buffer, "\170\234", sizeof(buffer) - 1)) {
+ result = TRUE;
+ CTRACE((tfp, "isDeflate: assume zlib-wrapped deflate\n"));
+ } else if (btype == 3) {
+ CTRACE((tfp, "isDeflate: not a deflate-stream\n"));
+ } else {
+ CTRACE((tfp, "isDeflate: %send block, %s compression\n",
+ (bit1 ? "" : "non-"),
+ (btype == 0
+ ? "no"
+ : (btype == 1
+ ? "static Huffman"
+ : "dynamic Huffman"))));
+ result = TRUE;
+ }
+ }
+ return result;
+}
+#endif
+
+#ifdef USE_BZLIB
+static BOOL isBzip2Stream(FILE *fp)
+{
+ char buffer[6];
+ BOOL result;
+
+ if (sniffStream(fp, buffer, sizeof(buffer))
+ && !MemCmp(buffer, "BZh", 3)
+ && isdigit(UCH(buffer[3]))
+ && isdigit(UCH(buffer[4]))) {
+ result = TRUE;
+ } else {
+ CTRACE((tfp, "not a bzip2-stream\n"));
+ result = FALSE;
+ }
+ return result;
+}
+#endif
+
+#ifdef VMS
+#define FOPEN_MODE(bin) "r", "shr=put", "shr=upd"
+#define DOT_STRING "._-" /* FIXME: should we check if suffix is after ']' or ':' ? */
+#else
+#define FOPEN_MODE(bin) (bin ? BIN_R : "r")
+#define DOT_STRING "."
+#endif
+
+#ifdef USE_BROTLI
+static FILE *brotli_open(const char *localname, const char *mode)
+{
+ CTRACE((tfp, "brotli_open file=%s, mode=%s\n", localname, mode));
+ return fopen(localname, mode);
+}
+#endif
+
+static int decompressAndParse(HTParentAnchor *anchor,
+ HTFormat format_out,
+ HTStream *sink,
+ char *nodename GCC_UNUSED,
+ char *filename,
+ HTAtom *myEncoding,
+ HTFormat format,
+ int *statusp)
+{
+ HTAtom *encoding = 0;
+
+#ifdef USE_ZLIB
+ FILE *zzfp = 0;
+ gzFile gzfp = 0;
+#endif /* USE_ZLIB */
+#ifdef USE_BZLIB
+ BZFILE *bzfp = 0;
+#endif /* USE_BZLIB */
+#ifdef USE_BROTLI
+ FILE *brfp = 0;
+#endif /* USE_BROTLI */
+#if defined(USE_ZLIB) || defined(USE_BZLIB)
+ CompressFileType internal_decompress = cftNone;
+ BOOL failed_decompress = NO;
+#endif
+ int rootlen = 0;
+ char *localname = filename;
+ int bin;
+ FILE *fp;
+ int result = FALSE;
+
+#ifdef VMS
+ /*
+ * Assume that the file is in Unix-style syntax if it contains a '/' after
+ * the leading one. @@
+ */
+ localname = (StrChr(localname + 1, '/')
+ ? HTVMS_name(nodename, localname)
+ : localname + 1);
+#endif /* VMS */
+
+ bin = HTCompressFileType(filename, ".", &rootlen) != cftNone;
+ fp = fopen(localname, FOPEN_MODE(bin));
+
+#ifdef VMS
+ /*
+ * If the file wasn't VMS syntax, then perhaps it is Ultrix.
+ */
+ if (!fp) {
+ char *ultrixname = 0;
+
+ CTRACE((tfp, "HTLoadFile: Can't open as %s\n", localname));
+ HTSprintf0(&ultrixname, "%s::\"%s\"", nodename, filename);
+ fp = fopen(ultrixname, FOPEN_MODE(bin));
+ if (!fp) {
+ CTRACE((tfp, "HTLoadFile: Can't open as %s\n", ultrixname));
+ }
+ FREE(ultrixname);
+ }
+#endif /* VMS */
+ CTRACE((tfp, "HTLoadFile: Opening `%s' gives %p\n", localname, (void *) fp));
+ if (fp) { /* Good! */
+ if (HTEditable(localname)) {
+ HTAtom *put = HTAtom_for("PUT");
+ HTList *methods = HTAnchor_methods(anchor);
+
+ if (HTList_indexOf(methods, put) == (-1)) {
+ HTList_addObject(methods, put);
+ }
+ }
+ /*
+ * Fake a Content-Encoding for compressed files. - FM
+ */
+ if (!IsUnityEnc(myEncoding)) {
+ /*
+ * We already know from the call to HTFileFormat that
+ * this is a compressed file, no need to look at the filename
+ * again. - kw
+ */
+#if defined(USE_ZLIB) || defined(USE_BZLIB)
+ CompressFileType method = HTEncodingToCompressType(HTAtom_name(myEncoding));
+#endif
+
+#define isDOWNLOAD(m) (strcmp(format_out->name, STR_DOWNLOAD) && (method == m))
+#ifdef USE_ZLIB
+ if (isDOWNLOAD(cftGzip)) {
+ if (isGzipStream(fp)) {
+ fclose(fp);
+ fp = 0;
+ gzfp = gzopen(localname, BIN_R);
+
+ CTRACE((tfp, "HTLoadFile: gzopen of `%s' gives %p\n",
+ localname, (void *) gzfp));
+ }
+ internal_decompress = cftGzip;
+ } else if (isDOWNLOAD(cftDeflate)) {
+ if (isDeflateStream(fp)) {
+ zzfp = fp;
+ fp = 0;
+
+ CTRACE((tfp, "HTLoadFile: zzopen of `%s' gives %p\n",
+ localname, (void *) zzfp));
+ }
+ internal_decompress = cftDeflate;
+ } else
+#endif /* USE_ZLIB */
+#ifdef USE_BZLIB
+ if (isDOWNLOAD(cftBzip2)) {
+ if (isBzip2Stream(fp)) {
+ fclose(fp);
+ fp = 0;
+ bzfp = BZ2_bzopen(localname, BIN_R);
+
+ CTRACE((tfp, "HTLoadFile: bzopen of `%s' gives %p\n",
+ localname, bzfp));
+ }
+ internal_decompress = cftBzip2;
+ } else
+#endif /* USE_BZLIB */
+#ifdef USE_BROTLI
+ if (isDOWNLOAD(cftBrotli)) {
+ fclose(fp);
+ fp = 0;
+ brfp = brotli_open(localname, BIN_R);
+
+ CTRACE((tfp, "HTLoadFile: brotli_open of `%s' gives %p\n",
+ localname, (void *) brfp));
+ internal_decompress = cftBrotli;
+ } else
+#endif /* USE_BROTLI */
+ {
+ StrAllocCopy(anchor->content_type, format->name);
+ StrAllocCopy(anchor->content_encoding, HTAtom_name(myEncoding));
+ format = HTAtom_for("www/compressed");
+ }
+ } else {
+ CompressFileType cft = HTCompressFileType(localname, DOT_STRING, &rootlen);
+
+ if (cft != cftNone) {
+ char *cp = NULL;
+
+ StrAllocCopy(cp, localname);
+ cp[rootlen] = '\0';
+ format = HTFileFormat(cp, &encoding, NULL);
+ FREE(cp);
+ format = HTCharsetFormat(format, anchor,
+ UCLYhndl_HTFile_for_unspec);
+ StrAllocCopy(anchor->content_type, format->name);
+ }
+
+ switch (cft) {
+ case cftCompress:
+ StrAllocCopy(anchor->content_encoding, "x-compress");
+ format = HTAtom_for("www/compressed");
+ break;
+ case cftDeflate:
+ StrAllocCopy(anchor->content_encoding, "x-deflate");
+#ifdef USE_ZLIB
+ if (strcmp(format_out->name, STR_DOWNLOAD) != 0) {
+ if (isDeflateStream(fp)) {
+ zzfp = fp;
+ fp = 0;
+
+ CTRACE((tfp, "HTLoadFile: zzopen of `%s' gives %p\n",
+ localname, (void *) zzfp));
+ }
+ internal_decompress = cftDeflate;
+ }
+#else /* USE_ZLIB */
+ format = HTAtom_for("www/compressed");
+#endif /* USE_ZLIB */
+ break;
+ case cftGzip:
+ StrAllocCopy(anchor->content_encoding, "x-gzip");
+#ifdef USE_ZLIB
+ if (strcmp(format_out->name, STR_DOWNLOAD) != 0) {
+ if (isGzipStream(fp)) {
+ fclose(fp);
+ fp = 0;
+ gzfp = gzopen(localname, BIN_R);
+
+ CTRACE((tfp, "HTLoadFile: gzopen of `%s' gives %p\n",
+ localname, (void *) gzfp));
+ }
+ internal_decompress = cftGzip;
+ }
+#else /* USE_ZLIB */
+ format = HTAtom_for("www/compressed");
+#endif /* USE_ZLIB */
+ break;
+ case cftBzip2:
+ StrAllocCopy(anchor->content_encoding, "x-bzip2");
+#ifdef USE_BZLIB
+ if (strcmp(format_out->name, STR_DOWNLOAD) != 0) {
+ if (isBzip2Stream(fp)) {
+ fclose(fp);
+ fp = 0;
+ bzfp = BZ2_bzopen(localname, BIN_R);
+
+ CTRACE((tfp, "HTLoadFile: bzopen of `%s' gives %p\n",
+ localname, bzfp));
+ }
+ internal_decompress = cftBzip2;
+ }
+#else /* USE_BZLIB */
+ format = HTAtom_for("www/compressed");
+#endif /* USE_BZLIB */
+ break;
+ case cftBrotli:
+ StrAllocCopy(anchor->content_encoding, "x-brotli");
+#ifdef USE_BROTLI
+ if (strcmp(format_out->name, STR_DOWNLOAD) != 0) {
+ fclose(fp);
+ fp = 0;
+ brfp = brotli_open(localname, BIN_R);
+
+ CTRACE((tfp, "HTLoadFile: brotli_open of `%s' gives %p\n",
+ localname, (void *) brfp));
+ internal_decompress = cftBrotli;
+ }
+#else /* USE_BROTLI */
+ format = HTAtom_for("www/compressed");
+#endif /* USE_BROTLI */
+ break;
+ case cftNone:
+ break;
+ }
+ }
+#if defined(USE_ZLIB) || defined(USE_BZLIB)
+ if (internal_decompress != cftNone) {
+ switch (internal_decompress) {
+#ifdef USE_ZLIB
+ case cftDeflate:
+ failed_decompress = (BOOLEAN) (zzfp == NULL);
+ break;
+ case cftCompress:
+ case cftGzip:
+ failed_decompress = (BOOLEAN) (gzfp == NULL);
+ break;
+#endif
+#ifdef USE_BZLIB
+ case cftBzip2:
+ failed_decompress = (BOOLEAN) (bzfp == NULL);
+ break;
+#endif
+#ifdef USE_BROTLI
+ case cftBrotli:
+ failed_decompress = (BOOLEAN) (brfp == NULL);
+ break;
+#endif
+ default:
+ failed_decompress = YES;
+ break;
+ }
+ if (failed_decompress) {
+ *statusp = HTLoadError(NULL,
+ -(HT_ERROR),
+ FAILED_OPEN_COMPRESSED_FILE);
+ } else {
+ char *sugfname = NULL;
+
+ if (anchor->SugFname) {
+ StrAllocCopy(sugfname, anchor->SugFname);
+ } else {
+ char *anchor_path = HTParse(anchor->address, "",
+ PARSE_PATH + PARSE_PUNCTUATION);
+ char *lastslash;
+
+ HTUnEscape(anchor_path);
+ lastslash = strrchr(anchor_path, '/');
+ if (lastslash)
+ StrAllocCopy(sugfname, lastslash + 1);
+ FREE(anchor_path);
+ }
+ FREE(anchor->content_encoding);
+ if (sugfname && *sugfname)
+ HTCheckFnameForCompression(&sugfname, anchor,
+ TRUE);
+ if (sugfname && *sugfname)
+ StrAllocCopy(anchor->SugFname, sugfname);
+ FREE(sugfname);
+#ifdef USE_BROTLI
+ if (brfp)
+ *statusp = HTParseBrFile(format, format_out,
+ anchor,
+ brfp, sink);
+#endif
+#ifdef USE_BZLIB
+ if (bzfp)
+ *statusp = HTParseBzFile(format, format_out,
+ anchor,
+ bzfp, sink);
+#endif
+#ifdef USE_ZLIB
+ if (gzfp)
+ *statusp = HTParseGzFile(format, format_out,
+ anchor,
+ gzfp, sink);
+ else if (zzfp)
+ *statusp = HTParseZzFile(format, format_out,
+ anchor,
+ zzfp, sink);
+#endif
+ }
+ } else
+#endif /* USE_ZLIB || USE_BZLIB */
+ {
+ *statusp = HTParseFile(format, format_out, anchor, fp, sink);
+ }
+ if (fp != 0) {
+ fclose(fp);
+ fp = 0;
+ }
+ result = TRUE;
+ } /* If successful open */
+ return result;
+}
+
+/* Load a document.
+ * ----------------
+ *
+ * On entry:
+ * addr must point to the fully qualified hypertext reference.
+ * This is the physical address of the file
+ *
+ * On exit:
+ * returns <0 Error has occurred.
+ * HTLOADED OK
+ *
+ */
+int HTLoadFile(const char *addr,
+ HTParentAnchor *anchor,
+ HTFormat format_out,
+ HTStream *sink)
+{
+ char *filename = NULL;
+ char *acc_method = NULL;
+ HTFormat format;
+ char *nodename = NULL;
+ char *newname = NULL; /* Simplified name of file */
+ HTAtom *myEncoding = NULL; /* enc of this file, may be gzip etc. */
+ int status = -1;
+
+#ifndef DISABLE_FTP
+ char *ftp_newhost;
+#endif
+
+#ifdef VMS
+ struct stat stat_info;
+#endif /* VMS */
+
+ /*
+ * Reduce the filename to a basic form (hopefully unique!).
+ */
+ StrAllocCopy(newname, addr);
+ filename = HTParse(newname, "", PARSE_PATH | PARSE_PUNCTUATION);
+ nodename = HTParse(newname, "", PARSE_HOST);
+
+ /*
+ * If access is ftp, or file is on another host, invoke ftp now.
+ */
+ acc_method = HTParse(newname, "", PARSE_ACCESS);
+ if (strcmp("ftp", acc_method) == 0 ||
+ (!LYSameHostname("localhost", nodename) &&
+ !LYSameHostname(nodename, HTHostName()))) {
+ status = -1;
+ FREE(newname);
+ FREE(filename);
+ FREE(nodename);
+ FREE(acc_method);
+#ifndef DISABLE_FTP
+ ftp_newhost = HTParse(addr, "", PARSE_HOST);
+ if (strcmp(ftp_lasthost, ftp_newhost))
+ ftp_local_passive = ftp_passive;
+
+ status = HTFTPLoad(addr, anchor, format_out, sink);
+
+ if (ftp_passive == ftp_local_passive) {
+ if ((status >= 400) || (status < 0)) {
+ ftp_local_passive = (BOOLEAN) !ftp_passive;
+ status = HTFTPLoad(addr, anchor, format_out, sink);
+ }
+ }
+
+ free(ftp_lasthost);
+ ftp_lasthost = ftp_newhost;
+#endif /* DISABLE_FTP */
+ return status;
+ } else {
+ FREE(newname);
+ FREE(acc_method);
+ }
+#if defined(VMS) || defined(USE_DOS_DRIVES)
+ HTUnEscape(filename);
+#endif /* VMS */
+
+ /*
+ * Determine the format and encoding mapped to any suffix.
+ */
+ if (anchor->content_type && anchor->content_encoding) {
+ /*
+ * If content_type and content_encoding are BOTH already set in the
+ * anchor object, we believe it and don't try to derive format and
+ * encoding from the filename. - kw
+ */
+ format = HTAtom_for(anchor->content_type);
+ myEncoding = HTAtom_for(anchor->content_encoding);
+ } else {
+ int default_UCLYhndl = UCLYhndl_HTFile_for_unspec;
+
+ if (force_old_UCLYhndl_on_reload) {
+ force_old_UCLYhndl_on_reload = FALSE;
+ default_UCLYhndl = forced_UCLYhdnl;
+ }
+
+ format = HTFileFormat(filename, &myEncoding, NULL);
+
+ /*
+ * Check the format for an extended MIME charset value, and act on it
+ * if present. Otherwise, assume what is indicated by the last
+ * parameter (fallback will effectively be UCLYhndl_for_unspec, by
+ * default ISO-8859-1). - kw
+ */
+ format = HTCharsetFormat(format, anchor, default_UCLYhndl);
+ }
+
+#ifdef VMS
+ /*
+ * Check to see if the 'filename' is in fact a directory. If it is create
+ * a new hypertext object containing a list of files and subdirectories
+ * contained in the directory. All of these are links to the directories
+ * or files listed.
+ */
+ if (HTStat(filename, &stat_info) == -1) {
+ CTRACE((tfp, "HTLoadFile: Can't stat %s\n", filename));
+ } else {
+ if (S_ISDIR(stat_info.st_mode)) {
+ if (HTDirAccess == HT_DIR_FORBID) {
+ FREE(filename);
+ FREE(nodename);
+ return HTLoadError(sink, 403, DISALLOWED_DIR_SCAN);
+ }
+
+ if (HTDirAccess == HT_DIR_SELECTIVE) {
+ char *enable_file_name = NULL;
+
+ HTSprintf0(&enable_file_name, "%s/%s", filename, HT_DIR_ENABLE_FILE);
+ if (HTStat(enable_file_name, &stat_info) == -1) {
+ FREE(filename);
+ FREE(nodename);
+ FREE(enable_file_name);
+ return HTLoadError(sink, 403, DISALLOWED_SELECTIVE_ACCESS);
+ }
+ }
+
+ FREE(filename);
+ FREE(nodename);
+ return HTVMSBrowseDir(addr, anchor, format_out, sink);
+ }
+ }
+
+ if (decompressAndParse(anchor,
+ format_out,
+ sink,
+ nodename,
+ filename,
+ myEncoding,
+ format,
+ &status)) {
+ FREE(nodename);
+ FREE(filename);
+ return status;
+ }
+ FREE(filename);
+
+#else /* not VMS: */
+
+ FREE(filename);
+
+ /*
+ * For unix, we try to translate the name into the name of a transparently
+ * mounted file.
+ *
+ * Not allowed in secure (HTClientHost) situations. TBL 921019
+ */
+#ifndef NO_UNIX_IO
+ /* Need protection here for telnet server but not httpd server. */
+
+ if (!HTSecure) { /* try local file system */
+ char *localname = HTLocalName(addr);
+ struct stat dir_info;
+
+#ifdef HAVE_READDIR
+ /*
+ * Multiformat handling.
+ *
+ * If needed, scan directory to find a good file. Bug: We don't stat
+ * the file to find the length.
+ */
+ if ((strlen(localname) > strlen(MULTI_SUFFIX)) &&
+ (0 == strcmp(localname + strlen(localname) - strlen(MULTI_SUFFIX),
+ MULTI_SUFFIX))) {
+ DIR *dp = 0;
+ BOOL forget_multi = NO;
+
+ STRUCT_DIRENT *dirbuf;
+ float best = (float) NO_VALUE_FOUND; /* So far best is bad */
+ HTFormat best_rep = NULL; /* Set when rep found */
+ HTAtom *best_enc = NULL;
+ char *best_name = NULL; /* Best dir entry so far */
+
+ char *base = strrchr(localname, '/');
+ size_t baselen = 0;
+
+ if (!base || base == localname) {
+ forget_multi = YES;
+ } else {
+ *base++ = '\0'; /* Just got directory name */
+ baselen = strlen(base) - strlen(MULTI_SUFFIX);
+ base[baselen] = '\0'; /* Chop off suffix */
+
+ dp = opendir(localname);
+ }
+ if (forget_multi || !dp) {
+ FREE(localname);
+ FREE(nodename);
+ return HTLoadError(sink, 500, FAILED_DIR_SCAN);
+ }
+
+ while ((dirbuf = readdir(dp)) != NULL) {
+ /*
+ * While there are directory entries to be read...
+ */
+#ifdef STRUCT_DIRENT__D_INO
+ if (dirbuf->d_ino == 0)
+ continue; /* if the entry is not being used, skip it */
+#endif
+ if (strlen(dirbuf->d_name) > baselen && /* Match? */
+ !StrNCmp(dirbuf->d_name, base, baselen)) {
+ HTAtom *enc;
+ HTFormat rep = HTFileFormat(dirbuf->d_name, &enc, NULL);
+ float filevalue = HTFileValue(dirbuf->d_name);
+ float value = HTStackValue(rep, format_out,
+ filevalue,
+ 0L /* @@@@@@ */ );
+
+ if (value <= 0.0) {
+ int rootlen = 0;
+ const char *atomname = NULL;
+ CompressFileType cft =
+ HTCompressFileType(dirbuf->d_name, ".", &rootlen);
+ char *cp = NULL;
+
+ enc = NULL;
+ if (cft != cftNone) {
+ StrAllocCopy(cp, dirbuf->d_name);
+ cp[rootlen] = '\0';
+ format = HTFileFormat(cp, NULL, NULL);
+ FREE(cp);
+ value = HTStackValue(format, format_out,
+ filevalue, 0L);
+ }
+ switch (cft) {
+ case cftCompress:
+ atomname = "application/x-compressed";
+ break;
+ case cftGzip:
+ atomname = "application/x-gzip";
+ break;
+ case cftDeflate:
+ atomname = "application/x-deflate";
+ break;
+ case cftBzip2:
+ atomname = "application/x-bzip2";
+ break;
+ case cftBrotli:
+ atomname = "application/x-brotli";
+ break;
+ case cftNone:
+ break;
+ }
+
+ if (atomname != NULL) {
+ value = HTStackValue(format, format_out,
+ filevalue, 0L);
+ if (value <= 0.0) {
+ format = HTAtom_for(atomname);
+ value = HTStackValue(format, format_out,
+ filevalue, 0L);
+ }
+ if (value <= 0.0) {
+ format = HTAtom_for("www/compressed");
+ value = HTStackValue(format, format_out,
+ filevalue, 0L);
+ }
+ }
+ }
+ if (value < NO_VALUE_FOUND) {
+ CTRACE((tfp,
+ "HTLoadFile: value of presenting %s is %f\n",
+ HTAtom_name(rep), value));
+ if (value > best) {
+ best_rep = rep;
+ best_enc = enc;
+ best = value;
+ StrAllocCopy(best_name, dirbuf->d_name);
+ }
+ } /* if best so far */
+ }
+ /* if match */
+ } /* end while directory entries left to read */
+ closedir(dp);
+
+ if (best_rep) {
+ format = best_rep;
+ myEncoding = best_enc;
+ base[-1] = '/'; /* Restore directory name */
+ base[0] = '\0';
+ StrAllocCat(localname, best_name);
+ FREE(best_name);
+ } else { /* If not found suitable file */
+ FREE(localname);
+ FREE(nodename);
+ return HTLoadError(sink, 403, FAILED_NO_REPRESENTATION);
+ }
+ /*NOTREACHED */
+ }
+ /* if multi suffix */
+ /*
+ * Check to see if the 'localname' is in fact a directory. If it is
+ * create a new hypertext object containing a list of files and
+ * subdirectories contained in the directory. All of these are links
+ * to the directories or files listed. NB This assumes the existence
+ * of a type 'STRUCT_DIRENT', which will hold the directory entry, and
+ * a type 'DIR' which is used to point to the current directory being
+ * read.
+ */
+#if defined(USE_DOS_DRIVES)
+ if (strlen(localname) == 2 && LYIsDosDrive(localname))
+ LYAddPathSep(&localname);
+#endif
+ if (HTStat(localname, &dir_info) == -1) /* get file information */
+ {
+ /* if can't read file information */
+ CTRACE((tfp, "HTLoadFile: can't stat %s\n", localname));
+
+ } else { /* Stat was OK */
+
+ if (S_ISDIR(dir_info.st_mode)) {
+ /*
+ * If localname is a directory.
+ */
+ DIR *dp;
+ struct stat file_info;
+
+ CTRACE((tfp, "%s is a directory\n", localname));
+
+ /*
+ * Check directory access. Selective access means only those
+ * directories containing a marker file can be browsed.
+ */
+ if (HTDirAccess == HT_DIR_FORBID) {
+ FREE(localname);
+ FREE(nodename);
+ return HTLoadError(sink, 403, DISALLOWED_DIR_SCAN);
+ }
+
+ if (HTDirAccess == HT_DIR_SELECTIVE) {
+ char *enable_file_name = NULL;
+
+ HTSprintf0(&enable_file_name, "%s/%s", localname, HT_DIR_ENABLE_FILE);
+ if (stat(enable_file_name, &file_info) != 0) {
+ FREE(localname);
+ FREE(nodename);
+ FREE(enable_file_name);
+ return HTLoadError(sink, 403, DISALLOWED_SELECTIVE_ACCESS);
+ }
+ }
+
+ CTRACE((tfp, "Opening directory %s\n", localname));
+ dp = opendir(localname);
+ if (!dp) {
+ FREE(localname);
+ FREE(nodename);
+ return HTLoadError(sink, 403, FAILED_DIR_UNREADABLE);
+ }
+
+ /*
+ * Directory access is allowed and possible.
+ */
+
+ status = print_local_dir(dp, localname,
+ anchor, format_out, sink);
+ closedir(dp);
+ FREE(localname);
+ FREE(nodename);
+ return status; /* document loaded, maybe partial */
+
+ }
+ /* end if localname is a directory */
+ if (S_ISREG(dir_info.st_mode)) {
+#ifdef LONG_MAX
+ if (dir_info.st_size <= LONG_MAX)
+#endif
+ anchor->content_length = (long) dir_info.st_size;
+ }
+
+ } /* end if file stat worked */
+
+/* End of directory reading section
+*/
+#endif /* HAVE_READDIR */
+ if (decompressAndParse(anchor,
+ format_out,
+ sink,
+ nodename,
+ localname,
+ myEncoding,
+ format,
+ &status)) {
+ FREE(nodename);
+ FREE(localname);
+ return status;
+ }
+ FREE(localname);
+ } /* local unix file system */
+#endif /* !NO_UNIX_IO */
+#endif /* VMS */
+
+#ifndef DECNET
+ /*
+ * Now, as transparently mounted access has failed, we try FTP.
+ */
+ {
+ /*
+ * Deal with case-sensitivity differences on VMS versus Unix.
+ */
+#ifdef VMS
+ if (strcasecomp(nodename, HTHostName()) != 0)
+#else
+ if (strcmp(nodename, HTHostName()) != 0)
+#endif /* VMS */
+ {
+ status = -1;
+ FREE(nodename);
+ if (StrNCmp(addr, "file://localhost", 16)) {
+ /* never go to ftp site when URL
+ * is file://localhost
+ */
+#ifndef DISABLE_FTP
+ status = HTFTPLoad(addr, anchor, format_out, sink);
+#endif /* DISABLE_FTP */
+ }
+ return status;
+ }
+ FREE(nodename);
+ }
+#endif /* !DECNET */
+
+ /*
+ * All attempts have failed.
+ */
+ {
+ CTRACE((tfp, "Can't open `%s', errno=%d\n", addr, SOCKET_ERRNO));
+
+ return HTLoadError(sink, 403, FAILED_FILE_UNREADABLE);
+ }
+}
+
+static const char *program_paths[pp_Last];
+
+/*
+ * Given a program number, return its path
+ */
+const char *HTGetProgramPath(ProgramPaths code)
+{
+ const char *result = NULL;
+
+ if (code > ppUnknown && code < pp_Last)
+ result = program_paths[code];
+ return result;
+}
+
+/*
+ * Store a program's path. The caller must allocate the string used for 'path',
+ * since HTInitProgramPaths() may free it.
+ */
+void HTSetProgramPath(ProgramPaths code, const char *path)
+{
+ if (code > ppUnknown && code < pp_Last) {
+ program_paths[code] = isEmpty(path) ? 0 : path;
+ }
+}
+
+/*
+ * Reset the list of known program paths to the ones that are compiled-in
+ */
+void HTInitProgramPaths(BOOL init)
+{
+ ProgramPaths code;
+ int n;
+ const char *path;
+ const char *test;
+
+ for (n = (int) ppUnknown + 1; n < (int) pp_Last; ++n) {
+ switch (code = (ProgramPaths) n) {
+#ifdef BROTLI_PATH
+ case ppBROTLI:
+ path = BROTLI_PATH;
+ break;
+#endif
+#ifdef BZIP2_PATH
+ case ppBZIP2:
+ path = BZIP2_PATH;
+ break;
+#endif
+#ifdef CHMOD_PATH
+ case ppCHMOD:
+ path = CHMOD_PATH;
+ break;
+#endif
+#ifdef COMPRESS_PATH
+ case ppCOMPRESS:
+ path = COMPRESS_PATH;
+ break;
+#endif
+#ifdef COPY_PATH
+ case ppCOPY:
+ path = COPY_PATH;
+ break;
+#endif
+#ifdef CSWING_PATH
+ case ppCSWING:
+ path = CSWING_PATH;
+ break;
+#endif
+#ifdef GZIP_PATH
+ case ppGZIP:
+ path = GZIP_PATH;
+ break;
+#endif
+#ifdef INFLATE_PATH
+ case ppINFLATE:
+ path = INFLATE_PATH;
+ break;
+#endif
+#ifdef INSTALL_PATH
+ case ppINSTALL:
+ path = INSTALL_PATH;
+ break;
+#endif
+#ifdef MKDIR_PATH
+ case ppMKDIR:
+ path = MKDIR_PATH;
+ break;
+#endif
+#ifdef MV_PATH
+ case ppMV:
+ path = MV_PATH;
+ break;
+#endif
+#ifdef RLOGIN_PATH
+ case ppRLOGIN:
+ path = RLOGIN_PATH;
+ break;
+#endif
+#ifdef RM_PATH
+ case ppRM:
+ path = RM_PATH;
+ break;
+#endif
+#ifdef RMDIR_PATH
+ case ppRMDIR:
+ path = RMDIR_PATH;
+ break;
+#endif
+#ifdef SETFONT_PATH
+ case ppSETFONT:
+ path = SETFONT_PATH;
+ break;
+#endif
+#ifdef TAR_PATH
+ case ppTAR:
+ path = TAR_PATH;
+ break;
+#endif
+#ifdef TELNET_PATH
+ case ppTELNET:
+ path = TELNET_PATH;
+ break;
+#endif
+#ifdef TN3270_PATH
+ case ppTN3270:
+ path = TN3270_PATH;
+ break;
+#endif
+#ifdef TOUCH_PATH
+ case ppTOUCH:
+ path = TOUCH_PATH;
+ break;
+#endif
+#ifdef UNCOMPRESS_PATH
+ case ppUNCOMPRESS:
+ path = UNCOMPRESS_PATH;
+ break;
+#endif
+#ifdef UNZIP_PATH
+ case ppUNZIP:
+ path = UNZIP_PATH;
+ break;
+#endif
+#ifdef UUDECODE_PATH
+ case ppUUDECODE:
+ path = UUDECODE_PATH;
+ break;
+#endif
+#ifdef ZCAT_PATH
+ case ppZCAT:
+ path = ZCAT_PATH;
+ break;
+#endif
+#ifdef ZIP_PATH
+ case ppZIP:
+ path = ZIP_PATH;
+ break;
+#endif
+ default:
+ path = NULL;
+ break;
+ }
+ test = HTGetProgramPath(code);
+ if (test != NULL && test != path) {
+ free(DeConst(test));
+ }
+ if (init) {
+ HTSetProgramPath(code, path);
+ }
+ }
+}
+
+/*
+ * Protocol descriptors
+ */
+#ifdef GLOBALDEF_IS_MACRO
+#define _HTFILE_C_1_INIT { "ftp", HTLoadFile, 0 }
+GLOBALDEF(HTProtocol, HTFTP, _HTFILE_C_1_INIT);
+#define _HTFILE_C_2_INIT { "file", HTLoadFile, HTFileSaveStream }
+GLOBALDEF(HTProtocol, HTFile, _HTFILE_C_2_INIT);
+#else
+GLOBALDEF HTProtocol HTFTP =
+{"ftp", HTLoadFile, 0};
+GLOBALDEF HTProtocol HTFile =
+{"file", HTLoadFile, HTFileSaveStream};
+#endif /* GLOBALDEF_IS_MACRO */
diff --git a/WWW/Library/Implementation/HTFile.h b/WWW/Library/Implementation/HTFile.h
new file mode 100644
index 0000000..0bdfb79
--- /dev/null
+++ b/WWW/Library/Implementation/HTFile.h
@@ -0,0 +1,368 @@
+/*
+ * $LynxId: HTFile.h,v 1.35 2021/07/29 22:54:21 tom Exp $
+ * File access in libwww
+ * FILE ACCESS
+ *
+ * These are routines for local file access used by WWW browsers and servers.
+ * Implemented by HTFile.c.
+ *
+ * If the file is not a local file, then we pass it on to HTFTP in case it
+ * can be reached by FTP.
+ */
+#ifndef HTFILE_H
+#define HTFILE_H
+
+#include <HTFormat.h>
+#include <HTAccess.h>
+
+#ifndef HTML_H
+#include <HTML.h> /* SCW */
+#endif /* HTML_H */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Controlling globals
+ *
+ * These flags control how directories and files are represented as
+ * hypertext, and are typically set by the application from command
+ * line options, etc.
+ */ extern int HTDirAccess;
+ /* Directory access level */
+
+#define HT_DIR_FORBID 0 /* Altogether forbidden */
+#define HT_DIR_SELECTIVE 1 /* If HT_DIR_ENABLE_FILE exists */
+#define HT_DIR_OK 2 /* Any accessible directory */
+
+#define HT_DIR_ENABLE_FILE ".www_browsable" /* If exists, can browse */
+
+ extern int HTDirReadme; /* Include readme files in listing? */
+
+ /* Values: */
+#define HT_DIR_README_NONE 0 /* No */
+#define HT_DIR_README_TOP 1 /* Yes, first */
+#define HT_DIR_README_BOTTOM 2 /* Yes, at the end */
+
+#define HT_DIR_README_FILE "README"
+
+/*
+ * Convert filenames between local and WWW formats
+ */
+ extern char *HTURLPath_toFile(const char *name, int expand_all, int is_remote);
+ extern char *HTnameOfFile_WWW(const char *name, int WWW_prefix, int expand_all);
+
+#define HTLocalName(name) HTnameOfFile_WWW(name,TRUE,TRUE)
+#define HTfullURL_toFile(name) HTnameOfFile_WWW(name,FALSE,TRUE)
+#define HTpartURL_toFile(name) HTnameOfFile_WWW(name,FALSE,FALSE)
+
+/*
+ * Make a WWW name from a full local path name
+ */
+ extern char *WWW_nameOfFile(const char *name);
+
+/*
+ * Generate the name of a cache file
+ */
+ extern char *HTCacheFileName(const char *name);
+
+/*
+ * Generate fragments of HTML for source-view:
+ */
+ extern void HTStructured_doctype(HTStructured * target, HTFormat format_out);
+
+ extern void HTStructured_meta(HTStructured * target, HTFormat format_out);
+/*
+ * Output directory titles
+ *
+ * This is (like the next one) used by HTFTP. It is common code to generate
+ * the title and heading 1 and the parent directory link for any anchor.
+ *
+ * changed to return TRUE if parent directory link was generated,
+ * FALSE otherwise - KW
+ */
+ extern BOOL HTDirTitles(HTStructured * target, HTParentAnchor *anchor,
+ HTFormat format_out,
+ int tildeIsTop);
+
+/*
+ * Check existence.
+ */
+ extern int HTStat(const char *filename,
+ struct stat *data);
+
+/* Load a document.
+ * ----------------
+ */
+ extern int HTLoadFile(const char *addr,
+ HTParentAnchor *anchor,
+ HTFormat format_out,
+ HTStream *sink);
+
+/*
+ * Output a directory entry
+ *
+ * This is used by HTFTP.c for example -- it is a common routine for
+ * generating a linked directory entry.
+ */
+ extern void HTDirEntry(HTStructured * target, /* in which to put the linked text */ const char *tail, /* last part of directory name */
+ const char *entry); /* name of this entry */
+
+/*
+ * HTSetSuffix: Define the representation for a file suffix
+ *
+ * This defines a mapping between local file suffixes and file content
+ * types and encodings.
+ *
+ * ON ENTRY,
+ *
+ * suffix includes the "." if that is important (normally, yes!)
+ *
+ * representation is MIME-style content-type
+ *
+ * encoding is MIME-style content-transfer-encoding
+ * (8bit, 7bit, etc) or HTTP-style content-encoding
+ * (gzip, compress etc.)
+ *
+ * quality an a priori judgement of the quality of such files
+ * (0.0..1.0)
+ *
+ * HTSetSuffix5 has one more parameter for a short description of the type
+ * which is otherwise derived from the representation:
+ *
+ * desc is a short textual description, or NULL
+ *
+ * Examples: HTSetSuffix(".ps", "application/postscript", "8bit", 1.0);
+ * Examples: HTSetSuffix(".psz", "application/postscript", "gzip", 1.0);
+ * A MIME type could also indicate a non-trivial encoding on its own
+ * ("application/x-compressed-tar"), but in that case don't use encoding
+ * to also indicate it but use "binary" etc.
+ */
+ extern void HTSetSuffix5(const char *suffix,
+ const char *representation,
+ const char *encoding,
+ const char *desc,
+ double quality);
+
+#define HTSetSuffix(suff,rep,enc,q) HTSetSuffix5(suff, rep, enc, NULL, q)
+
+/*
+ * HTFileFormat: Get Representation and Encoding from file name.
+ *
+ * ON EXIT,
+ *
+ * return The represntation it imagines the file is in.
+ *
+ * *pEncoding The encoding (binary, 7bit, etc). See HTSetSuffix.
+ */
+ extern HTFormat HTFileFormat(const char *filename,
+ HTAtom **pEncoding,
+ const char **pDesc);
+
+/*
+ * HTCharsetFormat: Revise the file format in relation to the Lynx charset.
+ *
+ * This checks the format associated with an anchor for
+ * for an extended MIME Content-Type, and if a charset is
+ * indicated, sets Lynx up for proper handling in relation
+ * to the currently selected character set. - FM
+ */
+ extern HTFormat HTCharsetFormat(HTFormat format,
+ HTParentAnchor *anchor,
+ int default_LYhndl);
+
+/* Get various pieces of meta info from file name.
+ * -----------------------------------------------
+ *
+ * LYGetFileInfo fills in information that can be determined without
+ * an actual (new) access to the filesystem, based on current suffix
+ * and character set configuration. If the file has been loaded and
+ * parsed before (with the same URL generated here!) and the anchor
+ * is still around, some results may be influenced by that (in
+ * particular, charset info from a META tag - this is not actually
+ * tested!).
+ * The caller should not keep pointers to the returned objects around
+ * for too long, the valid lifetimes vary. In particular, the returned
+ * charset string should be copied if necessary. If return of the
+ * file_anchor is requested, that one can be used to retrieve
+ * additional bits of info that are stored in the anchor object and
+ * are not covered here; as usual, don't keep pointers to the
+ * file_anchor longer than necessary since the object may disappear
+ * through HTuncache_current_document or at the next document load.
+ * - kw
+ */
+ extern void LYGetFileInfo(const char *filename,
+ HTParentAnchor **pfile_anchor,
+ HTFormat *pformat,
+ HTAtom **pencoding,
+ const char **pdesc,
+ const char **pcharset,
+ int *pfile_cs);
+
+/*
+ * Determine file value from file name.
+ */
+ extern float HTFileValue(const char *filename);
+
+/*
+ * Known compression types.
+ */
+ typedef enum {
+ cftNone
+ ,cftCompress
+ ,cftGzip
+ ,cftBzip2
+ ,cftDeflate
+ ,cftBrotli
+ } CompressFileType;
+
+/*
+ * Determine compression type from file name, by looking at its suffix.
+ */
+ extern CompressFileType HTCompressFileType(const char *filename,
+ const char *dots,
+ int *rootlen);
+
+/*
+ * Determine compression type from the content-encoding.
+ */
+ extern CompressFileType HTEncodingToCompressType(const char *encoding);
+/*
+ * Determine compression type from the content-encoding.
+ */
+ extern CompressFileType HTContentTypeToCompressType(const char *ct);
+/*
+ * Determine compression type from the content-type and/or content-encoding.
+ */
+ extern CompressFileType HTContentToCompressType(HTParentAnchor *anchor);
+/*
+ * Determine compression encoding from the compression method.
+ */
+ extern const char *HTCompressTypeToEncoding(CompressFileType method);
+/*
+ * Determine expected file-suffix from the compression method.
+ */
+ extern const char *HTCompressTypeToSuffix(CompressFileType method);
+/*
+ * Determine write access to a file.
+ *
+ * ON EXIT,
+ *
+ * return value YES if file can be accessed and can be written to.
+ *
+ * BUGS
+ *
+ * Isn't there a quicker way?
+ */
+
+#if defined(HAVE_CONFIG_H)
+
+#ifndef HAVE_GETGROUPS
+#define NO_GROUPS
+#endif
+
+#else
+
+#ifdef VMS
+#define NO_GROUPS
+#endif /* VMS */
+#ifdef NO_UNIX_IO
+#define NO_GROUPS
+#endif /* NO_UNIX_IO */
+#ifdef PCNFS
+#define NO_GROUPS
+#endif /* PCNFS */
+#ifdef NOUSERS
+#define NO_GROUPS
+#endif /* PCNFS */
+
+#endif /* HAVE_CONFIG_H */
+
+ extern BOOL HTEditable(const char *filename);
+
+/* Make a save stream.
+ * -------------------
+ */
+ extern HTStream *HTFileSaveStream(HTParentAnchor *anchor);
+
+/*
+ * Determine a suitable suffix, given the representation.
+ *
+ * ON ENTRY,
+ *
+ * rep is the atomized MIME style representation
+ * enc is an encoding (8bit, binary, gzip, compress,..)
+ *
+ * ON EXIT,
+ *
+ * returns a pointer to a suitable suffix string if one has
+ * been found, else NULL.
+ */
+ extern const char *HTFileSuffix(HTAtom *rep,
+ const char *enc);
+
+/*
+ * Enumerate external programs that lynx may assume exists. Unlike those
+ * given in download scripts, etc., lynx would really like to know their
+ * absolute paths, for better security.
+ */
+ typedef enum {
+ ppUnknown = 0
+ ,ppBROTLI
+ ,ppBZIP2
+ ,ppCHMOD
+ ,ppCOMPRESS
+ ,ppCOPY
+ ,ppCSWING
+ ,ppGZIP
+ ,ppINFLATE
+ ,ppINSTALL
+ ,ppMKDIR
+ ,ppMV
+ ,ppRLOGIN
+ ,ppRM
+ ,ppRMDIR
+ ,ppSETFONT
+ ,ppTAR
+ ,ppTELNET
+ ,ppTN3270
+ ,ppTOUCH
+ ,ppUNCOMPRESS
+ ,ppUNZIP
+ ,ppUUDECODE
+ ,ppZCAT
+ ,ppZIP
+ ,pp_Last
+ } ProgramPaths;
+
+/*
+ * Given a program number, return its path
+ */
+ extern const char *HTGetProgramPath(ProgramPaths code);
+
+/*
+ * Store a program's path
+ */
+ extern void HTSetProgramPath(ProgramPaths code,
+ const char *path);
+
+/*
+ * Reset the list of known program paths to the ones that are compiled-in
+ */
+ extern void HTInitProgramPaths(BOOL init);
+
+/*
+ * The Protocols
+ */
+#ifdef GLOBALREF_IS_MACRO
+ extern GLOBALREF (HTProtocol, HTFTP);
+ extern GLOBALREF (HTProtocol, HTFile);
+
+#else
+ GLOBALREF HTProtocol HTFTP, HTFile;
+#endif /* GLOBALREF_IS_MACRO */
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* HTFILE_H */
diff --git a/WWW/Library/Implementation/HTFinger.c b/WWW/Library/Implementation/HTFinger.c
new file mode 100644
index 0000000..566761a
--- /dev/null
+++ b/WWW/Library/Implementation/HTFinger.c
@@ -0,0 +1,418 @@
+/*
+ * $LynxId: HTFinger.c,v 1.31 2013/11/28 11:27:50 tom Exp $
+ *
+ * FINGER ACCESS HTFinger.c
+ * =============
+ * Authors:
+ * ARB Andrew Brooks
+ *
+ * History:
+ * 21 Apr 94 First version (ARB, from HTNews.c by TBL)
+ * 12 Mar 96 Made the URL and command buffering secure from
+ * stack modifications, beautified the HTLoadFinger()
+ * and response() functions, and added support for the
+ * following URL formats for sending a "", "/w",
+ * "username[@host]", or "/w username[@host]" command
+ * to the server:
+ * finger://host
+ * finger://host/
+ * finger://host/%2fw
+ * finger://host/%2fw%20username[@host]
+ * finger://host/w/username[@host]
+ * finger://host/username[@host]
+ * finger://host/username[@host]/w
+ * finger://username@host
+ * finger://username@host/
+ * finger://username@host/w
+ * 15 Mar 96 Added support for port 79 gtype 0 gopher URLs
+ * relayed from HTLoadGopher. - FM
+ */
+
+#include <HTUtils.h>
+
+#ifndef DISABLE_FINGER
+
+#include <HTAlert.h>
+#include <HTML.h>
+#include <HTParse.h>
+#include <HTFormat.h>
+#include <HTTCP.h>
+#include <HTString.h>
+#include <HTFinger.h>
+
+#include <LYUtils.h>
+#include <LYLeaks.h>
+
+#define FINGER_PORT 79 /* See rfc742 */
+#define BIG 1024 /* Bug */
+
+#define PUTC(c) (*targetClass.put_character)(target, c)
+#define PUTS(s) (*targetClass.put_string)(target, s)
+#define START(e) (*targetClass.start_element)(target, e, 0, 0, -1, 0)
+#define END(e) (*targetClass.end_element)(target, e, 0)
+#define FREE_TARGET (*targetClass._free)(target)
+#define NEXT_CHAR HTGetCharacter()
+
+/* Module-wide variables
+*/
+static int finger_fd; /* Socket for FingerHost */
+
+struct _HTStructured {
+ const HTStructuredClass *isa; /* For gopher streams */
+ /* ... */
+};
+
+static HTStructured *target; /* The output sink */
+static HTStructuredClass targetClass; /* Copy of fn addresses */
+
+/* Initialisation for this module
+ * ------------------------------
+ */
+static BOOL initialized = NO;
+static BOOL initialize(void)
+{
+ finger_fd = -1; /* Disconnected */
+ return YES;
+}
+
+/* Start anchor element
+ * --------------------
+ */
+static void start_anchor(const char *href)
+{
+ BOOL present[HTML_A_ATTRIBUTES];
+ const char *value[HTML_A_ATTRIBUTES];
+
+ {
+ int i;
+
+ for (i = 0; i < HTML_A_ATTRIBUTES; i++)
+ present[i] = (BOOL) (i == HTML_A_HREF);
+ }
+ ((const char **) value)[HTML_A_HREF] = href;
+ (*targetClass.start_element) (target, HTML_A, present,
+ (const char **) value, -1, 0);
+
+}
+
+/* Send Finger Command line to remote host & Check Response
+ * --------------------------------------------------------
+ *
+ * On entry,
+ * command points to the command to be sent, including CRLF, or is null
+ * pointer if no command to be sent.
+ * On exit,
+ * Negative status indicates transmission error, socket closed.
+ * Positive status is a Finger status.
+ */
+
+static int response(char *command,
+ char *sitename,
+ HTParentAnchor *anAnchor,
+ HTFormat format_out,
+ HTStream *sink)
+{
+ int status;
+ int length = (int) strlen(command);
+ int ch, i;
+ char line[BIG], *l, *cmd = NULL;
+ char *p = line, *href = NULL;
+
+ if (length == 0)
+ return (-1);
+
+ /* Set up buffering.
+ */
+ HTInitInput(finger_fd);
+
+ /* Send the command.
+ */
+ CTRACE((tfp, "HTFinger command to be sent: %s", command));
+ status = (int) NETWRITE(finger_fd, (char *) command, (unsigned) length);
+ if (status < 0) {
+ CTRACE((tfp, "HTFinger: Unable to send command. Disconnecting.\n"));
+ NETCLOSE(finger_fd);
+ finger_fd = -1;
+ return status;
+ }
+ /* if bad status */
+ /* Make a hypertext object with an anchor list.
+ */
+ target = HTML_new(anAnchor, format_out, sink);
+ targetClass = *target->isa; /* Copy routine entry points */
+
+ /* Create the results report.
+ */
+ CTRACE((tfp, "HTFinger: Reading finger information\n"));
+ START(HTML_HTML);
+ PUTC('\n');
+ START(HTML_HEAD);
+ PUTC('\n');
+ START(HTML_TITLE);
+ PUTS("Finger server on ");
+ PUTS(sitename);
+ END(HTML_TITLE);
+ PUTC('\n');
+ END(HTML_HEAD);
+ PUTC('\n');
+ START(HTML_BODY);
+ PUTC('\n');
+ START(HTML_H1);
+ PUTS("Finger server on ");
+ START(HTML_EM);
+ PUTS(sitename);
+ END(HTML_EM);
+ PUTS(": ");
+ StrAllocCopy(cmd, command);
+ for (i = ((int) strlen(cmd) - 1); i >= 0; i--) {
+ if (cmd[i] == LF || cmd[i] == CR) {
+ cmd[i] = '\0';
+ } else {
+ break;
+ }
+ }
+ PUTS(cmd);
+ FREE(cmd);
+ END(HTML_H1);
+ PUTC('\n');
+ START(HTML_PRE);
+
+ while ((ch = NEXT_CHAR) != EOF) {
+
+ if (interrupted_in_htgetcharacter) {
+ CTRACE((tfp,
+ "HTFinger: Interrupted in HTGetCharacter, apparently.\n"));
+ _HTProgress(CONNECTION_INTERRUPTED);
+ goto end_html;
+ }
+
+ if (ch != LF) {
+ *p = (char) ch; /* Put character in line */
+ if (p < &line[BIG - 1]) {
+ p++;
+ }
+ } else {
+ *p = '\0'; /* Terminate line */
+ /*
+ * OK we now have a line.
+ * Load it as 'l' and parse it.
+ */
+ p = l = line;
+ while (*l) {
+ if (StrNCmp(l, STR_NEWS_URL, LEN_NEWS_URL) &&
+ StrNCmp(l, "snews://", 8) &&
+ StrNCmp(l, "nntp://", 7) &&
+ StrNCmp(l, "snewspost:", 10) &&
+ StrNCmp(l, "snewsreply:", 11) &&
+ StrNCmp(l, "newspost:", 9) &&
+ StrNCmp(l, "newsreply:", 10) &&
+ StrNCmp(l, "ftp://", 6) &&
+ StrNCmp(l, "file:/", 6) &&
+ StrNCmp(l, "finger://", 9) &&
+ StrNCmp(l, "http://", 7) &&
+ StrNCmp(l, "https://", 8) &&
+ StrNCmp(l, "wais://", 7) &&
+ StrNCmp(l, STR_MAILTO_URL, LEN_MAILTO_URL) &&
+ StrNCmp(l, "cso://", 6) &&
+ StrNCmp(l, "gopher://", 9))
+ PUTC(*l++);
+ else {
+ StrAllocCopy(href, l);
+ start_anchor(strtok(href, " \r\n\t,>)\""));
+ while (*l && !StrChr(" \r\n\t,>)\"", *l))
+ PUTC(*l++);
+ END(HTML_A);
+ FREE(href);
+ }
+ }
+ PUTC('\n');
+ }
+ }
+ NETCLOSE(finger_fd);
+ finger_fd = -1;
+
+ end_html:
+ END(HTML_PRE);
+ PUTC('\n');
+ END(HTML_BODY);
+ PUTC('\n');
+ END(HTML_HTML);
+ PUTC('\n');
+ FREE_TARGET;
+ return (0);
+}
+
+/* Load by name HTLoadFinger
+ * ============
+ */
+int HTLoadFinger(const char *arg,
+ HTParentAnchor *anAnchor,
+ HTFormat format_out,
+ HTStream *stream)
+{
+ static char empty[1];
+
+ char *username, *sitename; /* Fields extracted from URL */
+ char *slash, *at_sign; /* Fields extracted from URL */
+ char *command, *str, *param; /* Buffers */
+ int port; /* Port number from URL */
+ int status; /* tcp return */
+ int result = HT_LOADED;
+ BOOL IsGopherURL = FALSE;
+ const char *p1 = arg;
+
+ CTRACE((tfp, "HTFinger: Looking for %s\n", (arg ? arg : "NULL")));
+
+ if (!(arg && *arg)) {
+ HTAlert(COULD_NOT_LOAD_DATA);
+ return HT_NOT_LOADED; /* Ignore if no name */
+ }
+
+ if (!initialized)
+ initialized = initialize();
+ if (!initialized) {
+ HTAlert(gettext("Could not set up finger connection."));
+ return HT_NOT_LOADED; /* FAIL */
+ }
+
+ /* Set up the host and command fields.
+ */
+ if (!strncasecomp(arg, "finger://", 9)) {
+ p1 = arg + 9; /* Skip "finger://" prefix */
+ } else if (!strncasecomp(arg, "gopher://", 9)) {
+ p1 = arg + 9; /* Skip "gopher://" prefix */
+ IsGopherURL = TRUE;
+ }
+
+ param = 0;
+ sitename = StrAllocCopy(param, p1);
+ if (param == 0) {
+ HTAlert(COULD_NOT_LOAD_DATA);
+ return HT_NOT_LOADED;
+ } else if ((slash = StrChr(sitename, '/')) != NULL) {
+ *slash++ = '\0';
+ HTUnEscape(slash);
+ if (IsGopherURL) {
+ if (*slash != '0') {
+ HTAlert(COULD_NOT_LOAD_DATA);
+ return HT_NOT_LOADED; /* FAIL */
+ }
+ *slash++ = '\0';
+ }
+ }
+
+ if ((at_sign = StrChr(sitename, '@')) != NULL) {
+ if (IsGopherURL) {
+ HTAlert(COULD_NOT_LOAD_DATA);
+ return HT_NOT_LOADED; /* FAIL */
+ } else {
+ *at_sign++ = '\0';
+ username = sitename;
+ sitename = at_sign;
+ HTUnEscape(username);
+ }
+ } else if (slash) {
+ username = slash;
+ } else {
+ username = empty;
+ }
+
+ if (*sitename == '\0') {
+ HTAlert(gettext("Could not load data (no sitename in finger URL)"));
+ result = HT_NOT_LOADED; /* Ignore if no name */
+ } else if (HTParsePort(sitename, &port) != NULL) {
+ if (port != 79) {
+ HTAlert(gettext("Invalid port number - will only use port 79!"));
+ result = HT_NOT_LOADED; /* Ignore if wrong port */
+ }
+ }
+
+ if (result == HT_LOADED) {
+ /* Load the string for making a connection/
+ */
+ str = 0;
+ HTSprintf0(&str, "lose://%s/", sitename);
+
+ /* Load the command for the finger server.
+ */
+ command = 0;
+ if (at_sign && slash) {
+ if (*slash == 'w' || *slash == 'W') {
+ HTSprintf0(&command, "/w %s%c%c", username, CR, LF);
+ } else {
+ HTSprintf0(&command, "%s%c%c", username, CR, LF);
+ }
+ } else if (at_sign) {
+ HTSprintf0(&command, "%s%c%c", username, CR, LF);
+ } else if (*username == '/') {
+ if ((slash = StrChr((username + 1), '/')) != NULL) {
+ *slash = ' ';
+ }
+ HTSprintf0(&command, "%s%c%c", username, CR, LF);
+ } else if ((*username == 'w' || *username == 'W') &&
+ *(username + 1) == '/') {
+ if (*username + 2 != '\0') {
+ *(username + 1) = ' ';
+ } else {
+ *(username + 1) = '\0';
+ }
+ HTSprintf0(&command, "/%s%c%c", username, CR, LF);
+ } else if ((*username == 'w' || *username == 'W') &&
+ *(username + 1) == '\0') {
+ HTSprintf0(&command, "/%s%c%c", username, CR, LF);
+ } else if ((slash = StrChr(username, '/')) != NULL) {
+ *slash++ = '\0';
+ if (*slash == 'w' || *slash == 'W') {
+ HTSprintf0(&command, "/w %s%c%c", username, CR, LF);
+ } else {
+ HTSprintf0(&command, "%s%c%c", username, CR, LF);
+ }
+ } else {
+ HTSprintf0(&command, "%s%c%c", username, CR, LF);
+ }
+
+ /* Now, let's get a stream setup up from the FingerHost:
+ * CONNECTING to finger host
+ */
+ CTRACE((tfp, "HTFinger: doing HTDoConnect on '%s'\n", str));
+ status = HTDoConnect(str, "finger", FINGER_PORT, &finger_fd);
+ CTRACE((tfp, "HTFinger: Done DoConnect; status %d\n", status));
+
+ if (status == HT_INTERRUPTED) {
+ /* Interrupt cleanly */
+ CTRACE((tfp,
+ "HTFinger: Interrupted on connect; recovering cleanly.\n"));
+ HTProgress(CONNECTION_INTERRUPTED);
+ result = HT_NOT_LOADED;
+ } else if (status < 0) {
+ NETCLOSE(finger_fd);
+ finger_fd = -1;
+ CTRACE((tfp, "HTFinger: Unable to connect to finger host.\n"));
+ HTAlert(gettext("Could not access finger host."));
+ result = HT_NOT_LOADED; /* FAIL */
+ } else {
+ CTRACE((tfp, "HTFinger: Connected to finger host '%s'.\n", str));
+
+ /* Send the command, and process response if successful.
+ */
+ if (response(command, sitename, anAnchor, format_out, stream) != 0) {
+ HTAlert(gettext("No response from finger server."));
+ result = HT_NOT_LOADED;
+ }
+ }
+ FREE(str);
+ FREE(command);
+ }
+ FREE(param);
+ return result;
+}
+
+#ifdef GLOBALDEF_IS_MACRO
+#define _HTFINGER_C_1_INIT { "finger", HTLoadFinger, NULL }
+GLOBALDEF(HTProtocol, HTFinger, _HTFINGER_C_1_INIT);
+#else
+GLOBALDEF HTProtocol HTFinger =
+{"finger", HTLoadFinger, NULL};
+#endif /* GLOBALDEF_IS_MACRO */
+
+#endif /* not DISABLE_FINGER */
diff --git a/WWW/Library/Implementation/HTFinger.h b/WWW/Library/Implementation/HTFinger.h
new file mode 100644
index 0000000..071d43b
--- /dev/null
+++ b/WWW/Library/Implementation/HTFinger.h
@@ -0,0 +1,30 @@
+/* Finger protocol module for the WWW library */
+/* History:
+ * 21 Apr 94 Andrew Brooks
+ */
+
+#ifndef HTFINGER_H
+#define HTFINGER_H
+
+#include <HTAccess.h>
+#include <HTAnchor.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#ifdef GLOBALREF_IS_MACRO
+ extern GLOBALREF (HTProtocol, HTFinger);
+
+#else
+ GLOBALREF HTProtocol HTFinger;
+#endif /* GLOBALREF_IS_MACRO */
+
+ extern int HTLoadFinger(const char *arg,
+ HTParentAnchor *anAnchor,
+ HTFormat format_out,
+ HTStream *stream);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* HTFINGER_H */
diff --git a/WWW/Library/Implementation/HTFormat.c b/WWW/Library/Implementation/HTFormat.c
new file mode 100644
index 0000000..a830387
--- /dev/null
+++ b/WWW/Library/Implementation/HTFormat.c
@@ -0,0 +1,2181 @@
+/*
+ * $LynxId: HTFormat.c,v 1.96 2022/03/31 23:39:38 tom Exp $
+ *
+ * Manage different file formats HTFormat.c
+ * =============================
+ *
+ * Bugs:
+ * Not reentrant.
+ *
+ * Assumes the incoming stream is ASCII, rather than a local file
+ * format, and so ALWAYS converts from ASCII on non-ASCII machines.
+ * Therefore, non-ASCII machines can't read local files.
+ *
+ */
+
+#define HTSTREAM_INTERNAL 1
+
+#include <HTUtils.h>
+
+/* Implements:
+*/
+#include <HTFormat.h>
+
+static float HTMaxSecs = 1e10; /* No effective limit */
+
+#ifdef UNIX
+#ifdef NeXT
+#define PRESENT_POSTSCRIPT "open %s; /bin/rm -f %s\n"
+#else
+#define PRESENT_POSTSCRIPT "(ghostview %s ; /bin/rm -f %s)&\n"
+ /* Full pathname would be better! */
+#endif /* NeXT */
+#endif /* UNIX */
+
+#include <HTML.h>
+#include <HTMLDTD.h>
+#include <HText.h>
+#include <HTAlert.h>
+#include <HTList.h>
+#include <HTInit.h>
+#include <HTTCP.h>
+#include <HTTP.h>
+/* Streams and structured streams which we use:
+*/
+#include <HTFWriter.h>
+#include <HTPlain.h>
+#include <SGML.h>
+#include <HTMLGen.h>
+
+#include <LYexit.h>
+#include <LYUtils.h>
+#include <GridText.h>
+#include <LYGlobalDefs.h>
+#include <LYLeaks.h>
+
+#ifdef DISP_PARTIAL
+#include <LYMainLoop.h>
+#endif
+
+#ifdef USE_BROTLI
+#include <brotli/decode.h>
+#endif
+
+BOOL HTOutputSource = NO; /* Flag: shortcut parser to stdout */
+
+/* this version used by the NetToText stream */
+struct _HTStream {
+ const HTStreamClass *isa;
+ BOOL had_cr;
+ HTStream *sink;
+};
+
+/* Presentation methods
+ * --------------------
+ */
+HTList *HTPresentations = NULL;
+HTPresentation *default_presentation = NULL;
+
+/*
+ * To free off the presentation list.
+ */
+#ifdef LY_FIND_LEAKS
+static void HTFreePresentations(void);
+#endif
+
+/* Define a presentation system command for a content-type
+ * -------------------------------------------------------
+ */
+void HTSetPresentation(const char *representation,
+ const char *command,
+ const char *testcommand,
+ double quality,
+ double secs,
+ double secs_per_byte,
+ long int maxbytes,
+ AcceptMedia media)
+{
+ HTPresentation *pres = typecalloc(HTPresentation);
+
+ if (pres == NULL)
+ outofmem(__FILE__, "HTSetPresentation");
+
+ assert(representation != NULL);
+
+ CTRACE2(TRACE_CFG,
+ (tfp,
+ "HTSetPresentation rep=%s, command=%s, test=%s, qual=%f\n",
+ NonNull(representation),
+ NonNull(command),
+ NonNull(testcommand),
+ quality));
+
+ pres->rep = HTAtom_for(representation);
+ pres->rep_out = WWW_PRESENT; /* Fixed for now ... :-) */
+ pres->converter = HTSaveAndExecute; /* Fixed for now ... */
+ pres->quality = (float) quality;
+ pres->secs = (float) secs;
+ pres->secs_per_byte = (float) secs_per_byte;
+ pres->maxbytes = maxbytes;
+ pres->get_accept = 0;
+ pres->accept_opt = media;
+
+ pres->command = NULL;
+ StrAllocCopy(pres->command, command);
+
+ pres->testcommand = NULL;
+ StrAllocCopy(pres->testcommand, testcommand);
+
+ /*
+ * Memory leak fixed.
+ * 05-28-94 Lynx 2-3-1 Garrett Arch Blythe
+ */
+ if (!HTPresentations) {
+ HTPresentations = HTList_new();
+#ifdef LY_FIND_LEAKS
+ atexit(HTFreePresentations);
+#endif
+ }
+
+ if (strcmp(representation, "*") == 0) {
+ FREE(default_presentation);
+ default_presentation = pres;
+ } else {
+ HTList_addObject(HTPresentations, pres);
+ }
+}
+
+/* Define a built-in function for a content-type
+ * ---------------------------------------------
+ */
+void HTSetConversion(const char *representation_in,
+ const char *representation_out,
+ HTConverter *converter,
+ double quality,
+ double secs,
+ double secs_per_byte,
+ long int maxbytes,
+ AcceptMedia media)
+{
+ HTPresentation *pres = typecalloc(HTPresentation);
+
+ if (pres == NULL)
+ outofmem(__FILE__, "HTSetConversion");
+
+ CTRACE2(TRACE_CFG,
+ (tfp,
+ "HTSetConversion rep_in=%s, rep_out=%s, qual=%f\n",
+ NonNull(representation_in),
+ NonNull(representation_out),
+ quality));
+
+ pres->rep = HTAtom_for(representation_in);
+ pres->rep_out = HTAtom_for(representation_out);
+ pres->converter = converter;
+ pres->command = NULL;
+ pres->testcommand = NULL;
+ pres->quality = (float) quality;
+ pres->secs = (float) secs;
+ pres->secs_per_byte = (float) secs_per_byte;
+ pres->maxbytes = maxbytes;
+ pres->get_accept = TRUE;
+ pres->accept_opt = media;
+
+ /*
+ * Memory Leak fixed.
+ * 05-28-94 Lynx 2-3-1 Garrett Arch Blythe
+ */
+ if (!HTPresentations) {
+ HTPresentations = HTList_new();
+#ifdef LY_FIND_LEAKS
+ atexit(HTFreePresentations);
+#endif
+ }
+
+ HTList_addObject(HTPresentations, pres);
+}
+
+#ifdef LY_FIND_LEAKS
+/*
+ * Purpose: Free the presentation list.
+ * Arguments: void
+ * Return Value: void
+ * Remarks/Portability/Dependencies/Restrictions:
+ * Made to clean up Lynx's bad leakage.
+ * Revision History:
+ * 05-28-94 created Lynx 2-3-1 Garrett Arch Blythe
+ */
+static void HTFreePresentations(void)
+{
+ HTPresentation *pres = NULL;
+
+ /*
+ * Loop through the list.
+ */
+ while (!HTList_isEmpty(HTPresentations)) {
+ /*
+ * Free off each item. May also need to free off it's items, but not
+ * sure as of yet.
+ */
+ pres = (HTPresentation *) HTList_removeLastObject(HTPresentations);
+ FREE(pres->command);
+ FREE(pres->testcommand);
+ FREE(pres);
+ }
+ /*
+ * Free the list itself.
+ */
+ HTList_delete(HTPresentations);
+ HTPresentations = NULL;
+}
+#endif /* LY_FIND_LEAKS */
+
+/* File buffering
+ * --------------
+ *
+ * The input file is read using the macro which can read from
+ * a socket or a file.
+ * The input buffer size, if large will give greater efficiency and
+ * release the server faster, and if small will save space on PCs etc.
+ */
+#define INPUT_BUFFER_SIZE 4096 /* Tradeoff */
+static char input_buffer[INPUT_BUFFER_SIZE];
+static char *input_pointer;
+static char *input_limit;
+static int input_file_number;
+
+/* Set up the buffering
+ *
+ * These routines are public because they are in fact needed by
+ * many parsers, and on PCs and Macs we should not duplicate
+ * the static buffer area.
+ */
+void HTInitInput(int file_number)
+{
+ input_file_number = file_number;
+ input_pointer = input_limit = input_buffer;
+}
+
+int interrupted_in_htgetcharacter = 0;
+int HTGetCharacter(void)
+{
+ char ch;
+
+ interrupted_in_htgetcharacter = 0;
+ do {
+ if (input_pointer >= input_limit) {
+ int status = NETREAD(input_file_number,
+ input_buffer, INPUT_BUFFER_SIZE);
+
+ if (status <= 0) {
+ if (status == 0)
+ return EOF;
+ if (status == HT_INTERRUPTED) {
+ CTRACE((tfp, "HTFormat: Interrupted in HTGetCharacter\n"));
+ interrupted_in_htgetcharacter = 1;
+ return EOF;
+ }
+ CTRACE((tfp, "HTFormat: File read error %d\n", status));
+ return EOF; /* -1 is returned by UCX
+ at end of HTTP link */
+ }
+ input_pointer = input_buffer;
+ input_limit = input_buffer + status;
+ }
+ ch = *input_pointer++;
+ } while (ch == (char) 13); /* Ignore ASCII carriage return */
+
+ return FROMASCII(UCH(ch));
+}
+
+#ifdef USE_SSL
+int HTGetSSLCharacter(void *handle)
+{
+ char ch;
+
+ interrupted_in_htgetcharacter = 0;
+ if (!handle)
+ return (char) EOF;
+ do {
+ if (input_pointer >= input_limit) {
+ int status = SSL_read((SSL *) handle,
+ input_buffer, INPUT_BUFFER_SIZE);
+
+ if (status <= 0) {
+ if (status == 0)
+ return (char) EOF;
+ if (status == HT_INTERRUPTED) {
+ CTRACE((tfp,
+ "HTFormat: Interrupted in HTGetSSLCharacter\n"));
+ interrupted_in_htgetcharacter = 1;
+ return (char) EOF;
+ }
+ CTRACE((tfp, "HTFormat: SSL_read error %d\n", status));
+ return (char) EOF; /* -1 is returned by UCX
+ at end of HTTP link */
+ }
+ input_pointer = input_buffer;
+ input_limit = input_buffer + status;
+ }
+ ch = *input_pointer++;
+ } while (ch == (char) 13); /* Ignore ASCII carriage return */
+
+ return FROMASCII(ch);
+}
+#endif /* USE_SSL */
+
+/* Match maintype to any MIME type starting with maintype, for example:
+ * image/gif should match image
+ */
+static int half_match(char *trial_type, char *target)
+{
+ char *cp = StrChr(trial_type, '/');
+
+ /* if no '/' or no '*' */
+ if (!cp || *(cp + 1) != '*')
+ return 0;
+
+ CTRACE((tfp, "HTFormat: comparing %s and %s for half match\n",
+ trial_type, target));
+
+ /* main type matches */
+ if (!StrNCmp(trial_type, target, ((cp - trial_type) - 1)))
+ return 1;
+
+ return 0;
+}
+
+/*
+ * Evaluate a deferred mailcap test command, i.e.,. one that substitutes the
+ * document's charset or other values in %{name} format.
+ */
+static BOOL failsMailcap(HTPresentation *pres, HTParentAnchor *anchor)
+{
+ if (pres->testcommand != NULL &&
+ anchor != NULL &&
+ anchor->content_type_params != NULL) {
+ if (LYTestMailcapCommand(pres->testcommand,
+ anchor->content_type_params) != 0)
+ return TRUE;
+ }
+ return FALSE;
+}
+
+#define WWW_WILDCARD_REP_OUT HTAtom_for("*")
+
+/* Look up a presentation
+ * ----------------------
+ *
+ * If fill_in is NULL, only look for an exact match.
+ * If a wildcard match is made, *fill_in is used to store
+ * a possibly modified presentation, and a pointer to it is
+ * returned. For an exact match, a pointer to the presentation
+ * in the HTPresentations list is returned. Returns NULL if
+ * nothing found. - kw
+ *
+ */
+static HTPresentation *HTFindPresentation(HTFormat rep_in,
+ HTFormat rep_out,
+ HTPresentation *fill_in,
+ HTParentAnchor *anchor)
+{
+#undef THIS_FUNC
+#define THIS_FUNC "HTFindPresentation"
+ HTAtom *wildcard = NULL; /* = HTAtom_for("*"); lookup when needed - kw */
+ int n;
+ int i;
+ HTPresentation *pres;
+ HTPresentation *match;
+ HTPresentation *strong_wildcard_match = 0;
+ HTPresentation *weak_wildcard_match = 0;
+ HTPresentation *last_default_match = 0;
+ HTPresentation *strong_subtype_wildcard_match = 0;
+
+ CTRACE((tfp, THIS_FUNC ": Looking up presentation for %s to %s\n",
+ HTAtom_name(rep_in), HTAtom_name(rep_out)));
+
+ n = HTList_count(HTPresentations);
+ for (i = 0; i < n; i++) {
+ pres = (HTPresentation *) HTList_objectAt(HTPresentations, i);
+ if (pres->rep == rep_in) {
+ if (pres->rep_out == rep_out) {
+ if (failsMailcap(pres, anchor))
+ continue;
+ CTRACE((tfp, THIS_FUNC ": found exact match: %s -> %s\n",
+ HTAtom_name(pres->rep),
+ HTAtom_name(pres->rep_out)));
+ return pres;
+
+ } else if (!fill_in) {
+ continue;
+ } else {
+ if (!wildcard)
+ wildcard = WWW_WILDCARD_REP_OUT;
+ if (pres->rep_out == wildcard) {
+ if (failsMailcap(pres, anchor))
+ continue;
+ if (!strong_wildcard_match)
+ strong_wildcard_match = pres;
+ /* otherwise use the first one */
+ CTRACE((tfp, THIS_FUNC
+ ": found strong wildcard match: %s -> %s\n",
+ HTAtom_name(pres->rep),
+ HTAtom_name(pres->rep_out)));
+ }
+ }
+
+ } else if (!fill_in) {
+ continue;
+
+ } else if (half_match(HTAtom_name(pres->rep),
+ HTAtom_name(rep_in))) {
+ if (pres->rep_out == rep_out) {
+ if (failsMailcap(pres, anchor))
+ continue;
+ if (!strong_subtype_wildcard_match)
+ strong_subtype_wildcard_match = pres;
+ /* otherwise use the first one */
+ CTRACE((tfp, THIS_FUNC
+ ": found strong subtype wildcard match: %s -> %s\n",
+ HTAtom_name(pres->rep),
+ HTAtom_name(pres->rep_out)));
+ }
+ }
+
+ if (pres->rep == WWW_SOURCE) {
+ if (pres->rep_out == rep_out) {
+ if (failsMailcap(pres, anchor))
+ continue;
+ if (!weak_wildcard_match)
+ weak_wildcard_match = pres;
+ /* otherwise use the first one */
+ CTRACE((tfp,
+ THIS_FUNC ": found weak wildcard match: %s\n",
+ HTAtom_name(pres->rep_out)));
+
+ } else if (!last_default_match) {
+ if (!wildcard)
+ wildcard = WWW_WILDCARD_REP_OUT;
+ if (pres->rep_out == wildcard) {
+ if (failsMailcap(pres, anchor))
+ continue;
+ last_default_match = pres;
+ /* otherwise use the first one */
+ }
+ }
+ }
+ }
+
+ match = (strong_subtype_wildcard_match
+ ? strong_subtype_wildcard_match
+ : (strong_wildcard_match
+ ? strong_wildcard_match
+ : (weak_wildcard_match
+ ? weak_wildcard_match
+ : last_default_match)));
+
+ if (match) {
+ *fill_in = *match; /* Specific instance */
+ fill_in->rep = rep_in; /* yuk */
+ fill_in->rep_out = rep_out; /* yuk */
+ return fill_in;
+ }
+
+ return NULL;
+#undef THIS_FUNC
+}
+
+/* Create a filter stack
+ * ---------------------
+ *
+ * If a wildcard match is made, a temporary HTPresentation
+ * structure is made to hold the destination format while the
+ * new stack is generated. This is just to pass the out format to
+ * MIME so far. Storing the format of a stream in the stream might
+ * be a lot neater.
+ *
+ */
+HTStream *HTStreamStack(HTFormat rep_in,
+ HTFormat rep_out,
+ HTStream *sink,
+ HTParentAnchor *anchor)
+{
+#undef THIS_FUNC
+#define THIS_FUNC "HTStreamStack"
+ HTPresentation temp;
+ HTPresentation *match;
+ HTStream *result;
+
+ CTRACE((tfp, THIS_FUNC ": Constructing stream stack for %s to %s (%s)\n",
+ HTAtom_name(rep_in),
+ HTAtom_name(rep_out),
+ NONNULL(anchor->content_type_params)));
+
+ if (rep_out == rep_in) {
+ result = sink;
+
+ } else if ((match = HTFindPresentation(rep_in, rep_out, &temp, anchor))) {
+ if (match == &temp) {
+ CTRACE((tfp, THIS_FUNC ": Using %s\n", HTAtom_name(temp.rep_out)));
+ } else {
+ CTRACE((tfp, THIS_FUNC ": found exact match: %s -> %s\n",
+ HTAtom_name(match->rep),
+ HTAtom_name(match->rep_out)));
+ }
+ result = (*match->converter) (match, anchor, sink);
+ } else {
+ result = NULL;
+ }
+ if (TRACE) {
+ if (result && result->isa && result->isa->name) {
+ CTRACE((tfp, THIS_FUNC ": Returning \"%s\"\n", result->isa->name));
+ } else if (result) {
+ CTRACE((tfp, THIS_FUNC ": Returning *unknown* stream!\n"));
+ } else {
+ CTRACE((tfp, THIS_FUNC ": Returning NULL!\n"));
+ CTRACE_FLUSH(tfp); /* a crash may be imminent... - kw */
+ }
+ }
+ return result;
+#undef THIS_FUNC
+}
+
+/* Put a presentation near start of list
+ * -------------------------------------
+ *
+ * Look up a presentation (exact match only) and, if found, reorder
+ * it to the start of the HTPresentations list. - kw
+ */
+void HTReorderPresentation(HTFormat rep_in,
+ HTFormat rep_out)
+{
+ HTPresentation *match;
+
+ if ((match = HTFindPresentation(rep_in, rep_out, NULL, NULL))) {
+ HTList_removeObject(HTPresentations, match);
+ HTList_addObject(HTPresentations, match);
+ }
+}
+
+/*
+ * Setup 'get_accept' flag to denote presentations that are not redundant,
+ * and will be listed in "Accept:" header.
+ */
+void HTFilterPresentations(void)
+{
+ int i, j;
+ int n = HTList_count(HTPresentations);
+ HTPresentation *p, *q;
+ BOOL matched;
+ char *s, *t;
+
+ CTRACE((tfp, "HTFilterPresentations (AcceptMedia %#x)\n", LYAcceptMedia));
+ for (i = 0; i < n; i++) {
+ p = (HTPresentation *) HTList_objectAt(HTPresentations, i);
+ s = HTAtom_name(p->rep);
+
+ p->get_accept = FALSE;
+ if ((LYAcceptMedia & p->accept_opt) != 0
+ && p->rep_out == WWW_PRESENT
+ && p->rep != WWW_SOURCE
+ && strcasecomp(s, "www/mime")
+ && strcasecomp(s, "www/compressed")
+ && p->quality <= 1.0 && p->quality >= 0.0) {
+ matched = TRUE;
+ for (j = 0; j < i; j++) {
+ q = (HTPresentation *) HTList_objectAt(HTPresentations, j);
+ t = HTAtom_name(q->rep);
+
+ if (!strcasecomp(s, t)) {
+ matched = FALSE;
+ CTRACE((tfp, " match %s %s\n", s, t));
+ break;
+ }
+ }
+ p->get_accept = matched;
+ }
+ }
+}
+
+/* Find the cost of a filter stack
+ * -------------------------------
+ *
+ * Must return the cost of the same stack which HTStreamStack would set up.
+ *
+ * On entry,
+ * length The size of the data to be converted
+ */
+float HTStackValue(HTFormat rep_in,
+ HTFormat rep_out,
+ double initial_value,
+ long int length)
+{
+ HTAtom *wildcard = WWW_WILDCARD_REP_OUT;
+
+ CTRACE((tfp, "HTFormat: Evaluating stream stack for %s worth %.3f to %s\n",
+ HTAtom_name(rep_in), initial_value, HTAtom_name(rep_out)));
+
+ if (rep_out == WWW_SOURCE || rep_out == rep_in)
+ return 0.0;
+
+ {
+ int n = HTList_count(HTPresentations);
+ int i;
+ HTPresentation *pres;
+
+ for (i = 0; i < n; i++) {
+ pres = (HTPresentation *) HTList_objectAt(HTPresentations, i);
+ if (pres->rep == rep_in &&
+ (pres->rep_out == rep_out || pres->rep_out == wildcard)) {
+ float value = (float) (initial_value * pres->quality);
+
+ if (HTMaxSecs > 0.0)
+ value = (value
+ - ((float) length * pres->secs_per_byte
+ + pres->secs)
+ / HTMaxSecs);
+ return value;
+ }
+ }
+ }
+
+ return (float) -1e30; /* Really bad */
+
+}
+
+/* Display the page while transfer in progress
+ * -------------------------------------------
+ *
+ * Repaint the page only when necessary.
+ * This is a traverse call for HText_pageDisplay() - it works!.
+ *
+ */
+void HTDisplayPartial(void)
+{
+#ifdef DISP_PARTIAL
+ if (display_partial) {
+ /*
+ * HText_getNumOfLines() = "current" number of complete lines received
+ * NumOfLines_partial = number of lines at the moment of last repaint.
+ * (we update NumOfLines_partial only when we repaint the display.)
+ *
+ * display_partial could only be enabled in HText_new() so a new
+ * HTMainText object available - all HText_ functions use it, lines
+ * counter HText_getNumOfLines() in particular.
+ *
+ * Otherwise HTMainText holds info from the previous document and we
+ * may repaint it instead of the new one: prev doc scrolled to the
+ * first line (=Newline_partial) is not good looking :-) 23 Aug 1998
+ * Leonid Pauzner
+ *
+ * So repaint the page only when necessary:
+ */
+ int Newline_partial = LYGetNewline();
+
+ if (((Newline_partial + display_lines) - 1 > NumOfLines_partial)
+ /* current page not complete... */
+ && (partial_threshold > 0 ?
+ ((Newline_partial + partial_threshold) - 1 <=
+ HText_getNumOfLines()) :
+ ((Newline_partial + display_lines) - 1 <= HText_getNumOfLines()))
+ /*
+ * Originally we rendered by increments of 2 lines,
+ * but that got annoying on slow network connections.
+ * Then we switched to full-pages. Now it's configurable.
+ * If partial_threshold <= 0, then it's a full page
+ */
+ ) {
+ if (LYMainLoop_pageDisplay(Newline_partial))
+ NumOfLines_partial = HText_getNumOfLines();
+ }
+ }
+#else /* nothing */
+#endif /* DISP_PARTIAL */
+}
+
+/* Put this as early as possible, OK just after HTDisplayPartial() */
+void HTFinishDisplayPartial(void)
+{
+#ifdef DISP_PARTIAL
+ /*
+ * End of incremental rendering stage here.
+ */
+ display_partial = FALSE;
+#endif /* DISP_PARTIAL */
+}
+
+/* Push data from a socket down a stream
+ * -------------------------------------
+ *
+ * This routine is responsible for creating and PRESENTING any
+ * graphic (or other) objects described by the file.
+ *
+ * The file number given is assumed to be a TELNET stream, i.e., containing
+ * CRLF at the end of lines which need to be stripped to LF for unix
+ * when the format is textual.
+ *
+ * State of socket and target stream on entry:
+ * socket (file_number) assumed open,
+ * target (sink) assumed valid.
+ *
+ * Return values:
+ * HT_INTERRUPTED Interruption or error after some data received.
+ * -2 Unexpected disconnect before any data received.
+ * -1 Interruption or error before any data received, or
+ * (UNIX) other read error before any data received, or
+ * download cancelled.
+ * HT_LOADED Normal close of socket (end of file indication
+ * received), or
+ * unexpected disconnect after some data received, or
+ * other read error after some data received, or
+ * (not UNIX) other read error before any data received.
+ *
+ * State of socket and target stream on return depends on return value:
+ * HT_INTERRUPTED socket still open, target aborted.
+ * -2 socket still open, target stream still valid.
+ * -1 socket still open, target aborted.
+ * otherwise socket closed, target stream still valid.
+ */
+int HTCopy(HTParentAnchor *anchor,
+ int file_number,
+ void *handle GCC_UNUSED,
+ HTStream *sink)
+{
+ HTStreamClass targetClass;
+ BOOL suppress_readprogress = NO;
+ off_t limit = anchor ? anchor->content_length : 0;
+ off_t bytes = 0;
+ off_t header_length = 0;
+ int rv = 0;
+
+ /* Push the data down the stream
+ */
+ targetClass = *(sink->isa); /* Copy pointers to procedures */
+
+ /*
+ * Push binary from socket down sink
+ *
+ * This operation could be put into a main event loop
+ */
+ HTReadProgress(bytes, (off_t) 0);
+ for (;;) {
+ int status;
+
+ if (LYCancelDownload) {
+ LYCancelDownload = FALSE;
+ (*targetClass._abort) (sink, NULL);
+ rv = -1;
+ goto finished;
+ }
+
+ if (HTCheckForInterrupt()) {
+ _HTProgress(TRANSFER_INTERRUPTED);
+ (*targetClass._abort) (sink, NULL);
+ if (bytes)
+ rv = HT_INTERRUPTED;
+ else
+ rv = -1;
+ goto finished;
+ }
+#ifdef USE_SSL
+ if (handle)
+ status = SSL_read((SSL *) handle, input_buffer, INPUT_BUFFER_SIZE);
+ else
+ status = NETREAD(file_number, input_buffer, INPUT_BUFFER_SIZE);
+#else
+ status = NETREAD(file_number, input_buffer, INPUT_BUFFER_SIZE);
+#endif /* USE_SSL */
+ if (status <= 0) {
+ if (status == 0) {
+ break;
+ } else if (status == HT_INTERRUPTED) {
+ _HTProgress(TRANSFER_INTERRUPTED);
+ (*targetClass._abort) (sink, NULL);
+ if (bytes)
+ rv = HT_INTERRUPTED;
+ else
+ rv = -1;
+ goto finished;
+ } else if (SOCKET_ERRNO == ENOTCONN ||
+#ifdef _WINDOWS /* 1997/11/10 (Mon) 16:57:18 */
+ SOCKET_ERRNO == ETIMEDOUT ||
+#endif
+ SOCKET_ERRNO == ECONNRESET ||
+ SOCKET_ERRNO == EPIPE) {
+ /*
+ * Arrrrgh, HTTP 0/1 compatibility problem, maybe.
+ */
+ if (bytes <= 0) {
+ /*
+ * Don't have any data, so let the calling function decide
+ * what to do about it. - FM
+ */
+ rv = -2;
+ goto finished;
+ } else {
+#ifdef UNIX
+ /*
+ * Treat what we've received already as the complete
+ * transmission, but not without giving the user an alert.
+ * I don't know about all the different TCP stacks for VMS
+ * etc., so this is currently only for UNIX. - kw
+ */
+ HTInetStatus("NETREAD");
+ HTAlert("Unexpected server disconnect.");
+ CTRACE((tfp,
+ "HTCopy: Unexpected server disconnect. Treating as completed.\n"));
+#else /* !UNIX */
+ /*
+ * Treat what we've gotten already as the complete
+ * transmission. - FM
+ */
+ CTRACE((tfp,
+ "HTCopy: Unexpected server disconnect. Treating as completed.\n"));
+ status = 0;
+#endif /* UNIX */
+ }
+#ifdef UNIX
+ } else { /* status < 0 and other errno */
+ /*
+ * Treat what we've received already as the complete
+ * transmission, but not without giving the user an alert. I
+ * don't know about all the different TCP stacks for VMS etc.,
+ * so this is currently only for UNIX. - kw
+ */
+ HTInetStatus("NETREAD");
+ HTAlert("Unexpected read error.");
+ if (bytes) {
+ (void) NETCLOSE(file_number);
+ rv = HT_LOADED;
+ } else {
+ (*targetClass._abort) (sink, NULL);
+ rv = -1;
+ }
+ goto finished;
+#endif
+ }
+ break;
+ }
+
+ /*
+ * Suppress ReadProgress messages when collecting a redirection
+ * message, at least initially (unless/until anchor->content_type gets
+ * changed, probably by the MIME message parser). That way messages
+ * put up by the HTTP module or elsewhere can linger in the statusline
+ * for a while. - kw
+ */
+ suppress_readprogress = (BOOL) (anchor && anchor->content_type &&
+ !strcmp(anchor->content_type,
+ "message/x-http-redirection"));
+#ifdef NOT_ASCII
+ {
+ char *p;
+
+ for (p = input_buffer; p < input_buffer + status; p++) {
+ *p = FROMASCII(*p);
+ }
+ }
+#endif /* NOT_ASCII */
+
+ header_length = anchor != 0 ? anchor->header_length : 0;
+
+ (*targetClass.put_block) (sink, input_buffer, status);
+ if (anchor != 0 && anchor->inHEAD) {
+ if (!suppress_readprogress) {
+ statusline(gettext("Reading headers..."));
+ }
+ CTRACE((tfp, "HTCopy read %" PRI_off_t " header bytes\n",
+ CAST_off_t (anchor->header_length)));
+ } else {
+ /*
+ * If header-length is increased at this point, that is due to
+ * HTMIME, which detects the end of the server headers. There
+ * may be additional (non-header) data in that block.
+ */
+ if (anchor != 0 && (anchor->header_length > header_length)) {
+ int header = (int) (anchor->header_length - header_length);
+
+ CTRACE((tfp, "HTCopy read %" PRI_off_t " header bytes "
+ "(%d extra vs %d total)\n",
+ CAST_off_t (anchor->header_length),
+ header, status));
+ if (status > header) {
+ bytes += (status - header);
+ }
+ } else {
+ bytes += status;
+ }
+ if (!suppress_readprogress) {
+ HTReadProgress(bytes, limit);
+ }
+ HTDisplayPartial();
+ }
+
+ /* a few buggy implementations do not close the connection properly
+ * and will hang if we try to read past the declared content-length.
+ */
+ if (limit > 0 && bytes >= limit)
+ break;
+ } /* next bufferload */
+ if (anchor != 0) {
+ CTRACE((tfp, "HTCopy copied %"
+ PRI_off_t " actual, %"
+ PRI_off_t " limit\n", CAST_off_t (bytes), CAST_off_t (limit)));
+ anchor->actual_length = bytes;
+ }
+
+ _HTProgress(TRANSFER_COMPLETE);
+ (void) NETCLOSE(file_number);
+ rv = HT_LOADED;
+
+ finished:
+ HTFinishDisplayPartial();
+ return (rv);
+}
+
+/* Push data from a file pointer down a stream
+ * -------------------------------------
+ *
+ * This routine is responsible for creating and PRESENTING any
+ * graphic (or other) objects described by the file.
+ *
+ *
+ * State of file and target stream on entry:
+ * FILE* (fp) assumed open,
+ * target (sink) assumed valid.
+ *
+ * Return values:
+ * HT_INTERRUPTED Interruption after some data read.
+ * HT_PARTIAL_CONTENT Error after some data read.
+ * -1 Error before any data read.
+ * HT_LOADED Normal end of file indication on reading.
+ *
+ * State of file and target stream on return:
+ * always fp still open, target stream still valid.
+ */
+int HTFileCopy(FILE *fp, HTStream *sink)
+{
+ HTStreamClass targetClass;
+ int status;
+ off_t bytes;
+ int rv = HT_OK;
+
+ /* Push the data down the stream
+ */
+ targetClass = *(sink->isa); /* Copy pointers to procedures */
+
+ /* Push binary from socket down sink
+ */
+ HTReadProgress(bytes = 0, (off_t) 0);
+ for (;;) {
+ status = (int) fread(input_buffer,
+ (size_t) 1,
+ (size_t) INPUT_BUFFER_SIZE, fp);
+ if (status == 0) { /* EOF or error */
+ if (ferror(fp) == 0) {
+ rv = HT_LOADED;
+ break;
+ }
+ CTRACE((tfp, "HTFormat: Read error, read returns %d\n",
+ ferror(fp)));
+ if (bytes) {
+ rv = HT_PARTIAL_CONTENT;
+ } else {
+ rv = -1;
+ }
+ break;
+ }
+
+ (*targetClass.put_block) (sink, input_buffer, status);
+ bytes += status;
+ HTReadProgress(bytes, (off_t) 0);
+ /* Suppress last screen update in partial mode - a regular update under
+ * control of mainloop() should follow anyway. - kw
+ */
+#ifdef DISP_PARTIAL
+ if (display_partial && bytes != HTMainAnchor->content_length)
+ HTDisplayPartial();
+#endif
+
+ if (HTCheckForInterrupt()) {
+ _HTProgress(TRANSFER_INTERRUPTED);
+ if (bytes) {
+ rv = HT_INTERRUPTED;
+ } else {
+ rv = -1;
+ }
+ break;
+ }
+ } /* next bufferload */
+
+ HTFinishDisplayPartial();
+ return rv;
+}
+
+#ifdef USE_SOURCE_CACHE
+/* Push data from an HTChunk down a stream
+ * ---------------------------------------
+ *
+ * This routine is responsible for creating and PRESENTING any
+ * graphic (or other) objects described by the file.
+ *
+ * State of memory and target stream on entry:
+ * HTChunk* (chunk) and target (sink) assumed valid.
+ *
+ * Return values:
+ * HT_LOADED All data sent.
+ * HT_INTERRUPTED Interruption after some data read.
+ *
+ * State of memory and target stream on return:
+ * always chunk unchanged, target stream still valid.
+ */
+int HTMemCopy(HTChunk *chunk, HTStream *sink)
+{
+ HTStreamClass targetClass;
+ off_t bytes;
+ int rv = HT_OK;
+
+ targetClass = *(sink->isa);
+ HTReadProgress(bytes = 0, (off_t) 0);
+ for (; chunk != NULL; chunk = chunk->next) {
+
+ /* Push the data down the stream a piece at a time, in case we're
+ * running a large document on a slow machine.
+ */
+ (*targetClass.put_block) (sink, chunk->data, chunk->size);
+ bytes += chunk->size;
+
+ HTReadProgress(bytes, (off_t) 0);
+ HTDisplayPartial();
+
+ if (HTCheckForInterrupt()) {
+ _HTProgress(TRANSFER_INTERRUPTED);
+ if (bytes) {
+ rv = HT_INTERRUPTED;
+ } else {
+ rv = -1;
+ }
+ break;
+ }
+ }
+
+ HTFinishDisplayPartial();
+ return rv;
+}
+#endif
+
+#ifdef USE_ZLIB
+/* Push data from a gzip file pointer down a stream
+ * -------------------------------------
+ *
+ * This routine is responsible for creating and PRESENTING any
+ * graphic (or other) objects described by the file.
+ *
+ *
+ * State of file and target stream on entry:
+ * gzFile (gzfp) assumed open (should have gzipped content),
+ * target (sink) assumed valid.
+ *
+ * Return values:
+ * HT_INTERRUPTED Interruption after some data read.
+ * HT_PARTIAL_CONTENT Error after some data read.
+ * -1 Error before any data read.
+ * HT_LOADED Normal end of file indication on reading.
+ *
+ * State of file and target stream on return:
+ * always gzfp still open, target stream still valid.
+ */
+static int HTGzFileCopy(gzFile gzfp, HTStream *sink)
+{
+ HTStreamClass targetClass;
+ int status;
+ off_t bytes;
+ int gzerrnum;
+ int rv = HT_OK;
+
+ /* Push the data down the stream
+ */
+ targetClass = *(sink->isa); /* Copy pointers to procedures */
+
+ /* read and inflate gzip'd file, and push binary down sink
+ */
+ HTReadProgress(bytes = 0, (off_t) 0);
+ for (;;) {
+ status = gzread(gzfp, input_buffer, INPUT_BUFFER_SIZE);
+ if (status <= 0) { /* EOF or error */
+ if (status == 0) {
+ rv = HT_LOADED;
+ break;
+ }
+ CTRACE((tfp, "HTGzFileCopy: Read error, gzread returns %d\n",
+ status));
+ CTRACE((tfp, "gzerror : %s\n",
+ gzerror(gzfp, &gzerrnum)));
+ if (TRACE) {
+ if (gzerrnum == Z_ERRNO)
+ perror("gzerror ");
+ }
+ if (bytes) {
+ rv = HT_PARTIAL_CONTENT;
+ } else {
+ rv = -1;
+ }
+ break;
+ }
+
+ (*targetClass.put_block) (sink, input_buffer, status);
+ bytes += status;
+ HTReadProgress(bytes, (off_t) -1);
+ HTDisplayPartial();
+
+ if (HTCheckForInterrupt()) {
+ _HTProgress(TRANSFER_INTERRUPTED);
+ rv = HT_INTERRUPTED;
+ break;
+ }
+ } /* next bufferload */
+
+ HTFinishDisplayPartial();
+ return rv;
+}
+
+#ifndef HAVE_ZERROR
+#define zError(s) LynxZError(s)
+static const char *zError(int status)
+{
+ static char result[80];
+
+ sprintf(result, "zlib error %d", status);
+ return result;
+}
+#endif
+
+/* Push data from a deflate file pointer down a stream
+ * -------------------------------------
+ *
+ * This routine is responsible for creating and PRESENTING any
+ * graphic (or other) objects described by the file. The code is
+ * loosely based on the inflate.c file from w3m.
+ *
+ *
+ * State of file and target stream on entry:
+ * FILE (zzfp) assumed open (should have deflated content),
+ * target (sink) assumed valid.
+ *
+ * Return values:
+ * HT_INTERRUPTED Interruption after some data read.
+ * HT_PARTIAL_CONTENT Error after some data read.
+ * -1 Error before any data read.
+ * HT_LOADED Normal end of file indication on reading.
+ *
+ * State of file and target stream on return:
+ * always zzfp still open, target stream still valid.
+ */
+static int HTZzFileCopy(FILE *zzfp, HTStream *sink)
+{
+#undef THIS_FUNC
+#define THIS_FUNC "HTZzFileCopy"
+ static char dummy_head[1 + 1] =
+ {
+ 0x8 + 0x7 * 0x10,
+ (((0x8 + 0x7 * 0x10) * 0x100 + 30) / 31 * 31) & 0xFF,
+ };
+
+ z_stream s;
+ HTStreamClass targetClass;
+ off_t bytes;
+ int rv = HT_OK;
+ char output_buffer[INPUT_BUFFER_SIZE];
+ int status;
+ int flush;
+ int retry = 0;
+ int len = 0;
+
+ /* Push the data down the stream
+ */
+ targetClass = *(sink->isa); /* Copy pointers to procedures */
+
+ memset(&s, 0, sizeof(s));
+ status = inflateInit(&s);
+ if (status != Z_OK) {
+ CTRACE((tfp, THIS_FUNC " inflateInit() %s\n", zError(status)));
+ exit_immediately(EXIT_FAILURE);
+ }
+ s.avail_in = 0;
+ s.next_out = (Bytef *) output_buffer;
+ s.avail_out = sizeof(output_buffer);
+ flush = Z_NO_FLUSH;
+
+ /* read and inflate deflate'd file, and push binary down sink
+ */
+ HTReadProgress(bytes = 0, (off_t) 0);
+ for (;;) {
+ if (s.avail_in == 0) {
+ s.next_in = (Bytef *) input_buffer;
+ s.avail_in = (uInt) fread(input_buffer,
+ (size_t) 1,
+ (size_t) INPUT_BUFFER_SIZE, zzfp);
+ len = (int) s.avail_in;
+ }
+ status = inflate(&s, flush);
+ if (status == Z_STREAM_END || status == Z_BUF_ERROR) {
+ len = (int) sizeof(output_buffer) - (int) s.avail_out;
+ if (len > 0) {
+ (*targetClass.put_block) (sink, output_buffer, len);
+ bytes += len;
+ HTReadProgress(bytes, (off_t) -1);
+ HTDisplayPartial();
+ }
+ rv = HT_LOADED;
+ break;
+ } else if (status == Z_DATA_ERROR && !retry++) {
+ status = inflateReset(&s);
+ if (status != Z_OK) {
+ CTRACE((tfp, THIS_FUNC " inflateReset() %s\n", zError(status)));
+ rv = -1;
+ break;
+ }
+ s.next_in = (Bytef *) dummy_head;
+ s.avail_in = sizeof(dummy_head);
+ (void) inflate(&s, flush);
+ s.next_in = (Bytef *) input_buffer;
+ s.avail_in = (unsigned) len;
+ continue;
+ } else if (status != Z_OK) {
+ CTRACE((tfp, THIS_FUNC " inflate() %s\n", zError(status)));
+ rv = bytes ? HT_PARTIAL_CONTENT : -1;
+ break;
+ } else if (s.avail_out == 0) {
+ len = sizeof(output_buffer);
+ s.next_out = (Bytef *) output_buffer;
+ s.avail_out = sizeof(output_buffer);
+
+ (*targetClass.put_block) (sink, output_buffer, len);
+ bytes += len;
+ HTReadProgress(bytes, (off_t) -1);
+ HTDisplayPartial();
+
+ if (HTCheckForInterrupt()) {
+ _HTProgress(TRANSFER_INTERRUPTED);
+ rv = bytes ? HT_INTERRUPTED : -1;
+ break;
+ }
+ }
+ retry = 1;
+ } /* next bufferload */
+
+ inflateEnd(&s);
+ HTFinishDisplayPartial();
+ return rv;
+#undef THIS_FUNC
+}
+#endif /* USE_ZLIB */
+
+#ifdef USE_BZLIB
+/* Push data from a bzip file pointer down a stream
+ * -------------------------------------
+ *
+ * This routine is responsible for creating and PRESENTING any
+ * graphic (or other) objects described by the file.
+ *
+ *
+ * State of file and target stream on entry:
+ * BZFILE (bzfp) assumed open (should have bzipped content),
+ * target (sink) assumed valid.
+ *
+ * Return values:
+ * HT_INTERRUPTED Interruption after some data read.
+ * HT_PARTIAL_CONTENT Error after some data read.
+ * -1 Error before any data read.
+ * HT_LOADED Normal end of file indication on reading.
+ *
+ * State of file and target stream on return:
+ * always bzfp still open, target stream still valid.
+ */
+static int HTBzFileCopy(BZFILE * bzfp, HTStream *sink)
+{
+ HTStreamClass targetClass;
+ int status;
+ off_t bytes;
+ int bzerrnum;
+ int rv = HT_OK;
+
+ /* Push the data down the stream
+ */
+ targetClass = *(sink->isa); /* Copy pointers to procedures */
+
+ /* read and inflate bzip'd file, and push binary down sink
+ */
+ HTReadProgress(bytes = 0, (off_t) 0);
+ for (;;) {
+ status = BZ2_bzread(bzfp, input_buffer, INPUT_BUFFER_SIZE);
+ if (status <= 0) { /* EOF or error */
+ if (status == 0) {
+ rv = HT_LOADED;
+ break;
+ }
+ CTRACE((tfp, "HTBzFileCopy: Read error, bzread returns %d\n",
+ status));
+ CTRACE((tfp, "bzerror : %s\n",
+ BZ2_bzerror(bzfp, &bzerrnum)));
+ if (bytes) {
+ rv = HT_PARTIAL_CONTENT;
+ } else {
+ rv = -1;
+ }
+ break;
+ }
+
+ (*targetClass.put_block) (sink, input_buffer, status);
+ bytes += status;
+ HTReadProgress(bytes, (off_t) -1);
+ HTDisplayPartial();
+
+ if (HTCheckForInterrupt()) {
+ _HTProgress(TRANSFER_INTERRUPTED);
+ rv = HT_INTERRUPTED;
+ break;
+ }
+ } /* next bufferload */
+
+ HTFinishDisplayPartial();
+ return rv;
+}
+#endif /* USE_BZLIB */
+
+#ifdef USE_BROTLI
+/* Push data from a brotli file pointer down a stream
+ * -------------------------------------
+ *
+ * This routine is responsible for creating and PRESENTING any
+ * graphic (or other) objects described by the file.
+ *
+ *
+ * State of file and target stream on entry:
+ * BZFILE (bzfp) assumed open (should have bzipped content),
+ * target (sink) assumed valid.
+ *
+ * Return values:
+ * HT_INTERRUPTED Interruption after some data read.
+ * HT_PARTIAL_CONTENT Error after some data read.
+ * -1 Error before any data read.
+ * HT_LOADED Normal end of file indication on reading.
+ *
+ * State of file and target stream on return:
+ * always bzfp still open, target stream still valid.
+ */
+static int HTBrFileCopy(FILE *brfp, HTStream *sink)
+{
+#undef THIS_FUNC
+#define THIS_FUNC "HTBrFileCopy"
+ HTStreamClass targetClass;
+ int status;
+ off_t bytes;
+ int rv = HT_OK;
+ BrotliDecoderResult status2 = BROTLI_DECODER_RESULT_ERROR;
+
+ char *brotli_buffer = NULL;
+ char *normal_buffer = NULL;
+ size_t brotli_size;
+ size_t brotli_limit = 0;
+ size_t brotli_offset = brotli_limit;
+ size_t normal_size;
+ size_t normal_limit = 0;
+
+ /* Push the data down the stream
+ */
+ targetClass = *(sink->isa); /* Copy pointers to procedures */
+
+ /* read and inflate brotli'd file, and push binary down sink
+ */
+ HTReadProgress(bytes = 0, (off_t) 0);
+ /*
+ * first, read all of the brotli'd file into memory, to work with the
+ * library's limitations.
+ */
+ for (;;) {
+ size_t input_chunk = INPUT_BUFFER_SIZE;
+
+ brotli_offset = brotli_limit;
+ brotli_limit += input_chunk;
+ brotli_buffer = realloc(brotli_buffer, brotli_limit);
+ if (brotli_buffer == NULL)
+ outofmem(__FILE__, THIS_FUNC);
+ status = (int) fread(brotli_buffer + brotli_offset, sizeof(char),
+ input_chunk, brfp);
+
+ if (status <= 0) { /* EOF or error */
+ if (status == 0) {
+ rv = HT_LOADED;
+ break;
+ }
+ CTRACE((tfp, THIS_FUNC ": Read error, fread returns %d\n", status));
+ if (bytes) {
+ if (!feof(brfp))
+ rv = HT_PARTIAL_CONTENT;
+ } else {
+ rv = -1;
+ }
+ break;
+ }
+ bytes += status;
+ }
+
+ /*
+ * next, unless we encountered an error (and have no data), try
+ * decompressing with increasing output buffer sizes until the brotli
+ * library succeeds.
+ */
+ if (bytes > 0) {
+ do {
+ if (normal_limit == 0)
+ normal_limit = (10 * brotli_limit) + INPUT_BUFFER_SIZE;
+ else
+ normal_limit *= 2;
+ normal_buffer = realloc(normal_buffer, normal_limit);
+ if (normal_buffer == NULL)
+ outofmem(__FILE__, THIS_FUNC);
+ brotli_size = (size_t) bytes;
+ normal_size = normal_limit;
+ status2 = BrotliDecoderDecompress(brotli_size,
+ (uint8_t *) brotli_buffer,
+ &normal_size,
+ (uint8_t *) normal_buffer);
+ /*
+ * brotli library should return
+ * BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT,
+ * but actually returns
+ * BROTLI_DECODER_RESULT_ERROR
+ *
+ * Accommodate possible improvements...
+ */
+ } while (status2 != BROTLI_DECODER_RESULT_SUCCESS);
+ }
+
+ /*
+ * finally, pump that data into the output stream.
+ */
+ if (status2 == BROTLI_DECODER_RESULT_SUCCESS) {
+ CTRACE((tfp, THIS_FUNC ": decompressed %ld -> %ld (1:%.1f)\n",
+ brotli_size, normal_size,
+ (double) normal_size / (double) brotli_size));
+ (*targetClass.put_block) (sink, normal_buffer, (int) normal_size);
+ bytes += status;
+ HTReadProgress(bytes, (off_t) -1);
+ HTDisplayPartial();
+
+ if (HTCheckForInterrupt()) {
+ _HTProgress(TRANSFER_INTERRUPTED);
+ rv = HT_INTERRUPTED;
+ }
+ }
+ free(brotli_buffer);
+ free(normal_buffer);
+
+ /* next bufferload */
+ HTFinishDisplayPartial();
+ return rv;
+#undef THIS_FUNC
+}
+#endif /* USE_BZLIB */
+
+/* Push data from a socket down a stream STRIPPING CR
+ * --------------------------------------------------
+ *
+ * This routine is responsible for creating and PRESENTING any
+ * graphic (or other) objects described by the socket.
+ *
+ * The file number given is assumed to be a TELNET stream ie containing
+ * CRLF at the end of lines which need to be stripped to LF for unix
+ * when the format is textual.
+ *
+ */
+void HTCopyNoCR(HTParentAnchor *anchor GCC_UNUSED,
+ int file_number,
+ HTStream *sink)
+{
+ HTStreamClass targetClass;
+ int character;
+
+ /* Push the data, ignoring CRLF, down the stream
+ */
+ targetClass = *(sink->isa); /* Copy pointers to procedures */
+
+ /*
+ * Push text from telnet socket down sink
+ *
+ * @@@@@ To push strings could be faster? (especially is we cheat and
+ * don't ignore CR! :-}
+ */
+ HTInitInput(file_number);
+ for (;;) {
+ character = HTGetCharacter();
+ if (character == EOF)
+ break;
+ (*targetClass.put_character) (sink, (char) character);
+ }
+}
+
+/* Parse a socket given format and file number
+ *
+ * This routine is responsible for creating and PRESENTING any
+ * graphic (or other) objects described by the file.
+ *
+ * The file number given is assumed to be a TELNET stream ie containing
+ * CRLF at the end of lines which need to be stripped to LF for unix
+ * when the format is textual.
+ *
+ * State of socket and target stream on entry:
+ * socket (file_number) assumed open,
+ * target (sink) usually NULL (will call stream stack).
+ *
+ * Return values:
+ * HT_INTERRUPTED Interruption or error after some data received.
+ * -501 Stream stack failed (cannot present or convert).
+ * -2 Unexpected disconnect before any data received.
+ * -1 Stream stack failed (cannot present or convert), or
+ * Interruption or error before any data received, or
+ * (UNIX) other read error before any data received, or
+ * download cancelled.
+ * HT_LOADED Normal close of socket (end of file indication
+ * received), or
+ * unexpected disconnect after some data received, or
+ * other read error after some data received, or
+ * (not UNIX) other read error before any data received.
+ *
+ * State of socket and target stream on return depends on return value:
+ * HT_INTERRUPTED socket still open, target aborted.
+ * -501 socket still open, target stream NULL.
+ * -2 socket still open, target freed.
+ * -1 socket still open, target stream aborted or NULL.
+ * otherwise socket closed, target stream freed.
+ */
+int HTParseSocket(HTFormat rep_in,
+ HTFormat format_out,
+ HTParentAnchor *anchor,
+ int file_number,
+ HTStream *sink)
+{
+ HTStream *stream;
+ HTStreamClass targetClass;
+ int rv;
+
+ stream = HTStreamStack(rep_in, format_out, sink, anchor);
+
+ if (!stream) {
+ char *buffer = 0;
+
+ if (LYCancelDownload) {
+ LYCancelDownload = FALSE;
+ return -1;
+ }
+ HTSprintf0(&buffer, CANNOT_CONVERT_I_TO_O,
+ HTAtom_name(rep_in), HTAtom_name(format_out));
+ CTRACE((tfp, "HTFormat: %s\n", buffer));
+ rv = HTLoadError(sink, 501, buffer); /* returns -501 */
+ FREE(buffer);
+ } else {
+ /*
+ * Push the data, don't worry about CRLF we can strip them later.
+ */
+ targetClass = *(stream->isa); /* Copy pointers to procedures */
+ rv = HTCopy(anchor, file_number, NULL, stream);
+ if (rv != -1 && rv != HT_INTERRUPTED)
+ (*targetClass._free) (stream);
+ }
+ return rv;
+ /* Originally: full: HT_LOADED; partial: HT_INTERRUPTED; no bytes: -1 */
+}
+
+/* Parse a file given format and file pointer
+ *
+ * This routine is responsible for creating and PRESENTING any
+ * graphic (or other) objects described by the file.
+ *
+ * The file number given is assumed to be a TELNET stream ie containing
+ * CRLF at the end of lines which need to be stripped to \n for unix
+ * when the format is textual.
+ *
+ * State of file and target stream on entry:
+ * FILE* (fp) assumed open,
+ * target (sink) usually NULL (will call stream stack).
+ *
+ * Return values:
+ * -501 Stream stack failed (cannot present or convert).
+ * -1 Download cancelled.
+ * HT_NO_DATA Error before any data read.
+ * HT_PARTIAL_CONTENT Interruption or error after some data read.
+ * HT_LOADED Normal end of file indication on reading.
+ *
+ * State of file and target stream on return:
+ * always fp still open; target freed, aborted, or NULL.
+ */
+int HTParseFile(HTFormat rep_in,
+ HTFormat format_out,
+ HTParentAnchor *anchor,
+ FILE *fp,
+ HTStream *sink)
+{
+ HTStream *stream;
+ HTStreamClass targetClass;
+ int rv;
+ int result;
+
+ if (fp == NULL) {
+ result = HT_LOADED;
+ } else {
+ stream = HTStreamStack(rep_in, format_out, sink, anchor);
+
+ if (!stream || !stream->isa) {
+ char *buffer = 0;
+
+ if (LYCancelDownload) {
+ LYCancelDownload = FALSE;
+ result = -1;
+ } else {
+ HTSprintf0(&buffer, CANNOT_CONVERT_I_TO_O,
+ HTAtom_name(rep_in), HTAtom_name(format_out));
+ CTRACE((tfp, "HTFormat(in HTParseFile): %s\n", buffer));
+ rv = HTLoadError(sink, 501, buffer);
+ FREE(buffer);
+ result = rv;
+ }
+ } else {
+
+ /*
+ * Push the data down the stream
+ *
+ * @@ Bug: This decision ought to be made based on "encoding"
+ * rather than on content-type. @@@ When we handle encoding. The
+ * current method smells anyway.
+ */
+ targetClass = *(stream->isa); /* Copy pointers to procedures */
+ rv = HTFileCopy(fp, stream);
+ if (rv == -1 || rv == HT_INTERRUPTED) {
+ (*targetClass._abort) (stream, NULL);
+ } else {
+ (*targetClass._free) (stream);
+ }
+
+ if (rv == -1) {
+ result = HT_NO_DATA;
+ } else if (rv == HT_INTERRUPTED || (rv > 0 && rv != HT_LOADED)) {
+ result = HT_PARTIAL_CONTENT;
+ } else {
+ result = HT_LOADED;
+ }
+ }
+ }
+ return result;
+}
+
+#ifdef USE_SOURCE_CACHE
+/* Parse a document in memory given format and memory block pointer
+ *
+ * This routine is responsible for creating and PRESENTING any
+ * graphic (or other) objects described by the file.
+ *
+ * State of memory and target stream on entry:
+ * HTChunk* (chunk) assumed valid,
+ * target (sink) usually NULL (will call stream stack).
+ *
+ * Return values:
+ * -501 Stream stack failed (cannot present or convert).
+ * HT_LOADED All data sent.
+ *
+ * State of memory and target stream on return:
+ * always chunk unchanged; target freed, aborted, or NULL.
+ */
+int HTParseMem(HTFormat rep_in,
+ HTFormat format_out,
+ HTParentAnchor *anchor,
+ HTChunk *chunk,
+ HTStream *sink)
+{
+ HTStream *stream;
+ HTStreamClass targetClass;
+ int rv;
+ int result;
+
+ stream = HTStreamStack(rep_in, format_out, sink, anchor);
+ if (!stream || !stream->isa) {
+ char *buffer = 0;
+
+ HTSprintf0(&buffer, CANNOT_CONVERT_I_TO_O,
+ HTAtom_name(rep_in), HTAtom_name(format_out));
+ CTRACE((tfp, "HTFormat(in HTParseMem): %s\n", buffer));
+ rv = HTLoadError(sink, 501, buffer);
+ FREE(buffer);
+ result = rv;
+ } else {
+
+ /* Push the data down the stream
+ */
+ targetClass = *(stream->isa);
+ (void) HTMemCopy(chunk, stream);
+ (*targetClass._free) (stream);
+ result = HT_LOADED;
+ }
+ return result;
+}
+#endif
+
+#ifdef USE_ZLIB
+static int HTCloseGzFile(gzFile gzfp)
+{
+ int gzres;
+
+ if (gzfp == NULL)
+ return 0;
+ gzres = gzclose(gzfp);
+ if (TRACE) {
+ if (gzres == Z_ERRNO) {
+ perror("gzclose ");
+ } else if (gzres != Z_OK) {
+ CTRACE((tfp, "gzclose : error number %d\n", gzres));
+ }
+ }
+ return (gzres);
+}
+
+/* HTParseGzFile
+ *
+ * State of file and target stream on entry:
+ * gzFile (gzfp) assumed open,
+ * target (sink) usually NULL (will call stream stack).
+ *
+ * Return values:
+ * -501 Stream stack failed (cannot present or convert).
+ * -1 Download cancelled.
+ * HT_NO_DATA Error before any data read.
+ * HT_PARTIAL_CONTENT Interruption or error after some data read.
+ * HT_LOADED Normal end of file indication on reading.
+ *
+ * State of file and target stream on return:
+ * always gzfp closed; target freed, aborted, or NULL.
+ */
+int HTParseGzFile(HTFormat rep_in,
+ HTFormat format_out,
+ HTParentAnchor *anchor,
+ gzFile gzfp,
+ HTStream *sink)
+{
+ HTStream *stream;
+ HTStreamClass targetClass;
+ int rv;
+ int result;
+
+ stream = HTStreamStack(rep_in, format_out, sink, anchor);
+
+ if (!stream || !stream->isa) {
+ char *buffer = 0;
+
+ HTCloseGzFile(gzfp);
+ if (LYCancelDownload) {
+ LYCancelDownload = FALSE;
+ result = -1;
+ } else {
+ HTSprintf0(&buffer, CANNOT_CONVERT_I_TO_O,
+ HTAtom_name(rep_in), HTAtom_name(format_out));
+ CTRACE((tfp, "HTFormat(in HTParseGzFile): %s\n", buffer));
+ rv = HTLoadError(sink, 501, buffer);
+ FREE(buffer);
+ result = rv;
+ }
+ } else {
+
+ /*
+ * Push the data down the stream
+ *
+ * @@ Bug: This decision ought to be made based on "encoding" rather than
+ * on content-type. @@@ When we handle encoding. The current method
+ * smells anyway.
+ */
+ targetClass = *(stream->isa); /* Copy pointers to procedures */
+ rv = HTGzFileCopy(gzfp, stream);
+ if (rv == -1 || rv == HT_INTERRUPTED) {
+ (*targetClass._abort) (stream, NULL);
+ } else {
+ (*targetClass._free) (stream);
+ }
+
+ HTCloseGzFile(gzfp);
+ if (rv == -1) {
+ result = HT_NO_DATA;
+ } else if (rv == HT_INTERRUPTED || (rv > 0 && rv != HT_LOADED)) {
+ result = HT_PARTIAL_CONTENT;
+ } else {
+ result = HT_LOADED;
+ }
+ }
+ return result;
+}
+
+/* HTParseZzFile
+ *
+ * State of file and target stream on entry:
+ * FILE (zzfp) assumed open,
+ * target (sink) usually NULL (will call stream stack).
+ *
+ * Return values:
+ * -501 Stream stack failed (cannot present or convert).
+ * -1 Download cancelled.
+ * HT_NO_DATA Error before any data read.
+ * HT_PARTIAL_CONTENT Interruption or error after some data read.
+ * HT_LOADED Normal end of file indication on reading.
+ *
+ * State of file and target stream on return:
+ * always zzfp closed; target freed, aborted, or NULL.
+ */
+int HTParseZzFile(HTFormat rep_in,
+ HTFormat format_out,
+ HTParentAnchor *anchor,
+ FILE *zzfp,
+ HTStream *sink)
+{
+ HTStream *stream;
+ HTStreamClass targetClass;
+ int rv;
+ int result;
+
+ stream = HTStreamStack(rep_in, format_out, sink, anchor);
+
+ if (!stream || !stream->isa) {
+ char *buffer = 0;
+
+ fclose(zzfp);
+ if (LYCancelDownload) {
+ LYCancelDownload = FALSE;
+ result = -1;
+ } else {
+ HTSprintf0(&buffer, CANNOT_CONVERT_I_TO_O,
+ HTAtom_name(rep_in), HTAtom_name(format_out));
+ CTRACE((tfp, "HTFormat(in HTParseGzFile): %s\n", buffer));
+ rv = HTLoadError(sink, 501, buffer);
+ FREE(buffer);
+ result = rv;
+ }
+ } else {
+
+ /*
+ * Push the data down the stream
+ *
+ * @@ Bug: This decision ought to be made based on "encoding" rather than
+ * on content-type. @@@ When we handle encoding. The current method
+ * smells anyway.
+ */
+ targetClass = *(stream->isa); /* Copy pointers to procedures */
+ rv = HTZzFileCopy(zzfp, stream);
+ if (rv == -1 || rv == HT_INTERRUPTED) {
+ (*targetClass._abort) (stream, NULL);
+ } else {
+ (*targetClass._free) (stream);
+ }
+
+ fclose(zzfp);
+ if (rv == -1) {
+ result = HT_NO_DATA;
+ } else if (rv == HT_INTERRUPTED || (rv > 0 && rv != HT_LOADED)) {
+ result = HT_PARTIAL_CONTENT;
+ } else {
+ result = HT_LOADED;
+ }
+ }
+ return result;
+}
+#endif /* USE_ZLIB */
+
+#ifdef USE_BZLIB
+static void HTCloseBzFile(BZFILE * bzfp)
+{
+ if (bzfp)
+ BZ2_bzclose(bzfp);
+}
+
+/* HTParseBzFile
+ *
+ * State of file and target stream on entry:
+ * bzFile (bzfp) assumed open,
+ * target (sink) usually NULL (will call stream stack).
+ *
+ * Return values:
+ * -501 Stream stack failed (cannot present or convert).
+ * -1 Download cancelled.
+ * HT_NO_DATA Error before any data read.
+ * HT_PARTIAL_CONTENT Interruption or error after some data read.
+ * HT_LOADED Normal end of file indication on reading.
+ *
+ * State of file and target stream on return:
+ * always bzfp closed; target freed, aborted, or NULL.
+ */
+int HTParseBzFile(HTFormat rep_in,
+ HTFormat format_out,
+ HTParentAnchor *anchor,
+ BZFILE * bzfp,
+ HTStream *sink)
+{
+ HTStream *stream;
+ HTStreamClass targetClass;
+ int rv;
+ int result;
+
+ stream = HTStreamStack(rep_in, format_out, sink, anchor);
+
+ if (!stream || !stream->isa) {
+ char *buffer = 0;
+
+ HTCloseBzFile(bzfp);
+ if (LYCancelDownload) {
+ LYCancelDownload = FALSE;
+ result = -1;
+ } else {
+ HTSprintf0(&buffer, CANNOT_CONVERT_I_TO_O,
+ HTAtom_name(rep_in), HTAtom_name(format_out));
+ CTRACE((tfp, "HTFormat(in HTParseBzFile): %s\n", buffer));
+ rv = HTLoadError(sink, 501, buffer);
+ FREE(buffer);
+ result = rv;
+ }
+ } else {
+
+ /*
+ * Push the data down the stream
+ *
+ * @@ Bug: This decision ought to be made based on "encoding" rather than
+ * on content-type. @@@ When we handle encoding. The current method
+ * smells anyway.
+ */
+ targetClass = *(stream->isa); /* Copy pointers to procedures */
+ rv = HTBzFileCopy(bzfp, stream);
+ if (rv == -1 || rv == HT_INTERRUPTED) {
+ (*targetClass._abort) (stream, NULL);
+ } else {
+ (*targetClass._free) (stream);
+ }
+
+ HTCloseBzFile(bzfp);
+ if (rv == -1) {
+ result = HT_NO_DATA;
+ } else if (rv == HT_INTERRUPTED || (rv > 0 && rv != HT_LOADED)) {
+ result = HT_PARTIAL_CONTENT;
+ } else {
+ result = HT_LOADED;
+ }
+ }
+ return result;
+}
+#endif /* USE_BZLIB */
+
+#ifdef USE_BROTLI
+/* HTParseBrFile
+ *
+ * State of file and target stream on entry:
+ * FILE* (brfp) assumed open,
+ * target (sink) usually NULL (will call stream stack).
+ *
+ * Return values:
+ * -501 Stream stack failed (cannot present or convert).
+ * -1 Download cancelled.
+ * HT_NO_DATA Error before any data read.
+ * HT_PARTIAL_CONTENT Interruption or error after some data read.
+ * HT_LOADED Normal end of file indication on reading.
+ *
+ * State of file and target stream on return:
+ * always brfp closed; target freed, aborted, or NULL.
+ */
+int HTParseBrFile(HTFormat rep_in,
+ HTFormat format_out,
+ HTParentAnchor *anchor,
+ FILE *brfp,
+ HTStream *sink)
+{
+#undef THIS_FUNC
+#define THIS_FUNC "HTParseBrFile"
+ HTStream *stream;
+ HTStreamClass targetClass;
+ int rv;
+ int result;
+
+ stream = HTStreamStack(rep_in, format_out, sink, anchor);
+
+ if (!stream || !stream->isa) {
+ char *buffer = 0;
+
+ fclose(brfp);
+ if (LYCancelDownload) {
+ LYCancelDownload = FALSE;
+ result = -1;
+ } else {
+ HTSprintf0(&buffer, CANNOT_CONVERT_I_TO_O,
+ HTAtom_name(rep_in), HTAtom_name(format_out));
+ CTRACE((tfp, "HTFormat(in " THIS_FUNC "): %s\n", buffer));
+ rv = HTLoadError(sink, 501, buffer);
+ FREE(buffer);
+ result = rv;
+ }
+ } else {
+
+ /*
+ * Push the data down the stream
+ *
+ * @@ Bug: This decision ought to be made based on "encoding" rather than
+ * on content-type. @@@ When we handle encoding. The current method
+ * smells anyway.
+ */
+ targetClass = *(stream->isa); /* Copy pointers to procedures */
+ rv = HTBrFileCopy(brfp, stream);
+ if (rv == -1 || rv == HT_INTERRUPTED) {
+ (*targetClass._abort) (stream, NULL);
+ } else {
+ (*targetClass._free) (stream);
+ }
+
+ fclose(brfp);
+ if (rv == -1) {
+ result = HT_NO_DATA;
+ } else if (rv == HT_INTERRUPTED || (rv > 0 && rv != HT_LOADED)) {
+ result = HT_PARTIAL_CONTENT;
+ } else {
+ result = HT_LOADED;
+ }
+ }
+ return result;
+#undef THIS_FUNC
+}
+#endif /* USE_BROTLI */
+
+/* Converter stream: Network Telnet to internal character text
+ * -----------------------------------------------------------
+ *
+ * The input is assumed to be in ASCII, with lines delimited
+ * by (13,10) pairs, These pairs are converted into (CR,LF)
+ * pairs in the local representation. The (CR,LF) sequence
+ * when found is changed to a '\n' character, the internal
+ * C representation of a new line.
+ */
+
+static void NetToText_put_character(HTStream *me, int net_char)
+{
+ char c = (char) FROMASCII(net_char);
+
+ if (me->had_cr) {
+ if (c == LF) {
+ me->sink->isa->put_character(me->sink, '\n'); /* Newline */
+ me->had_cr = NO;
+ return;
+ } else {
+ me->sink->isa->put_character(me->sink, CR); /* leftover */
+ }
+ }
+ me->had_cr = (BOOL) (c == CR);
+ if (!me->had_cr)
+ me->sink->isa->put_character(me->sink, c); /* normal */
+}
+
+static void NetToText_put_string(HTStream *me, const char *s)
+{
+ const char *p;
+
+ for (p = s; *p; p++)
+ NetToText_put_character(me, *p);
+}
+
+static void NetToText_put_block(HTStream *me, const char *s, int l)
+{
+ const char *p;
+
+ for (p = s; p < (s + l); p++)
+ NetToText_put_character(me, *p);
+}
+
+static void NetToText_free(HTStream *me)
+{
+ (me->sink->isa->_free) (me->sink); /* Close rest of pipe */
+ FREE(me);
+}
+
+static void NetToText_abort(HTStream *me, HTError e)
+{
+ me->sink->isa->_abort(me->sink, e); /* Abort rest of pipe */
+ FREE(me);
+}
+
+/* The class structure
+*/
+static HTStreamClass NetToTextClass =
+{
+ "NetToText",
+ NetToText_free,
+ NetToText_abort,
+ NetToText_put_character,
+ NetToText_put_string,
+ NetToText_put_block
+};
+
+/* The creation method
+*/
+HTStream *HTNetToText(HTStream *sink)
+{
+ HTStream *me = typecalloc(HTStream);
+
+ if (me == NULL)
+ outofmem(__FILE__, "NetToText");
+
+ me->isa = &NetToTextClass;
+
+ me->had_cr = NO;
+ me->sink = sink;
+ return me;
+}
+
+static HTStream HTBaseStreamInstance; /* Made static */
+
+/*
+ * ERROR STREAM
+ * ------------
+ * There is only one error stream shared by anyone who wants a
+ * generic error returned from all stream methods.
+ */
+static void HTErrorStream_put_character(HTStream *me GCC_UNUSED, int c GCC_UNUSED)
+{
+ LYCancelDownload = TRUE;
+}
+
+static void HTErrorStream_put_string(HTStream *me GCC_UNUSED, const char *s)
+{
+ if (s && *s)
+ LYCancelDownload = TRUE;
+}
+
+static void HTErrorStream_write(HTStream *me GCC_UNUSED, const char *s, int l)
+{
+ if (l && s)
+ LYCancelDownload = TRUE;
+}
+
+static void HTErrorStream_free(HTStream *me GCC_UNUSED)
+{
+ return;
+}
+
+static void HTErrorStream_abort(HTStream *me GCC_UNUSED, HTError e GCC_UNUSED)
+{
+ return;
+}
+
+static const HTStreamClass HTErrorStreamClass =
+{
+ "ErrorStream",
+ HTErrorStream_free,
+ HTErrorStream_abort,
+ HTErrorStream_put_character,
+ HTErrorStream_put_string,
+ HTErrorStream_write
+};
+
+HTStream *HTErrorStream(void)
+{
+ CTRACE((tfp, "ErrorStream. Created\n"));
+ HTBaseStreamInstance.isa = &HTErrorStreamClass; /* The rest is random */
+ return &HTBaseStreamInstance;
+}
diff --git a/WWW/Library/Implementation/HTFormat.h b/WWW/Library/Implementation/HTFormat.h
new file mode 100644
index 0000000..835daef
--- /dev/null
+++ b/WWW/Library/Implementation/HTFormat.h
@@ -0,0 +1,588 @@
+/*
+ * $LynxId: HTFormat.h,v 1.42 2022/04/01 07:54:14 tom Exp $
+ *
+ * HTFormat: The format manager in the WWW Library
+ * MANAGE DIFFERENT DOCUMENT FORMATS
+ *
+ * Here we describe the functions of the HTFormat module which handles conversion between
+ * different data representations. (In MIME parlance, a representation is known as a
+ * content-type. In WWW the term "format" is often used as it is shorter).
+ *
+ * This module is implemented by HTFormat.c. This hypertext document is used to generate
+ * the HTFormat.h include file. Part of the WWW library.
+ */
+#ifndef HTFORMAT_H
+#define HTFORMAT_H
+
+#include <HTStream.h>
+#include <HTAtom.h>
+#include <HTList.h>
+#include <HTAnchor.h>
+
+#ifdef USE_SOURCE_CACHE
+#include <HTChunk.h>
+#endif
+
+#ifdef USE_BZLIB
+#include <bzlib.h>
+#endif
+
+#ifdef USE_ZLIB
+#include <zlib.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+
+ These macros (which used to be constants) define some basic internally
+ referenced representations. The www/xxx ones are of course not MIME
+ standard.
+
+ www/source is an output format which leaves the input untouched. It is
+ useful for diagnostics, and for users who want to see the original, whatever
+ it is.
+
+ */
+/* Internal ones */
+#define STR_SOURCE "www/source"
+ extern HTAtom *WWW_SOURCE; /* calculated once, heavy used */
+
+/*
+
+ www/present represents the user's perception of the document. If you
+ convert to www/present, you present the material to the user.
+
+ */
+#define STR_PRESENT "www/present"
+#define WWW_PRESENT HTAtom_for(STR_PRESENT) /* The user's perception */
+
+#define WWW_DEBUG HTAtom_for("www/debug")
+/*
+
+ WWW_DEBUG represents the user's perception of debug information, for example
+ sent as a HTML document in a HTTP redirection message.
+
+ */
+
+/*
+
+ The message/rfc822 format means a MIME message or a plain text message with
+ no MIME header. This is what is returned by an HTTP server.
+
+ */
+#define WWW_MIME HTAtom_for("www/mime") /* A MIME message */
+
+/*
+ For parsing only the header. - kw
+ */
+#define WWW_MIME_HEAD HTAtom_for("message/x-rfc822-head")
+
+/*
+
+ www/print is like www/present except it represents a printed copy.
+
+ */
+#define WWW_PRINT HTAtom_for("www/print") /* A printed copy */
+
+/*
+
+ www/unknown is a really unknown type. Some default action is appropriate.
+
+ */
+#define WWW_UNKNOWN HTAtom_for("www/unknown")
+
+#ifdef DIRED_SUPPORT
+/*
+ www/dired signals directory edit mode.
+*/
+#define WWW_DIRED HTAtom_for("www/dired")
+#endif
+
+/*
+ * Miscellaneous internal MIME types.
+ */
+#define STR_DOWNLOAD "www/download"
+#define WWW_DOWNLOAD HTAtom_for(STR_DOWNLOAD)
+
+#define STR_DUMP "www/dump"
+#define WWW_DUMP HTAtom_for(STR_DUMP)
+
+/*
+
+ These are regular MIME types. HTML is assumed to be added by the W3 code.
+ application/octet-stream was mistakenly application/binary in earlier libwww
+ versions (pre 2.11).
+
+ */
+#define STR_BINARY "application/octet-stream"
+#define STR_PLAINTEXT "text/plain"
+#define STR_HTML "text/html"
+
+#define WWW_BINARY HTAtom_for(STR_BINARY)
+#define WWW_PLAINTEXT HTAtom_for(STR_PLAINTEXT)
+#define WWW_HTML HTAtom_for(STR_HTML)
+
+#define WWW_POSTSCRIPT HTAtom_for("application/postscript")
+#define WWW_RICHTEXT HTAtom_for("application/rtf")
+#define WWW_AUDIO HTAtom_for("audio/basic")
+
+ typedef HTAtom *HTEncoding;
+
+/*
+ * The following are values for the MIME types:
+ */
+#define WWW_ENC_7BIT HTAtom_for("7bit")
+#define WWW_ENC_8BIT HTAtom_for("8bit")
+#define WWW_ENC_BINARY HTAtom_for("binary")
+
+/*
+ * We also add
+ */
+#define WWW_ENC_COMPRESS HTAtom_for("compress")
+
+/*
+ * Does a string designate a real encoding, or is it just
+ * a "dummy" as for example 7bit, 8bit, and binary?
+ */
+#define IsUnityEncStr(senc) \
+ ((senc)==NULL || *(senc)=='\0' || !strcmp(senc,"identity") ||\
+ !strcmp(senc,"8bit") || !strcmp(senc,"binary") || !strcmp(senc,"7bit"))
+
+#define IsUnityEnc(enc) \
+ ((enc)==NULL || (enc)==HTAtom_for("identity") ||\
+ (enc)==WWW_ENC_8BIT || (enc)==WWW_ENC_BINARY || (enc)==WWW_ENC_7BIT)
+
+/*
+
+The HTPresentation and HTConverter types
+
+ This HTPresentation structure represents a possible conversion algorithm
+ from one format to another. It includes a pointer to a conversion routine.
+ The conversion routine returns a stream to which data should be fed. See
+ also HTStreamStack which scans the list of registered converters and calls
+ one. See the initialisation module for a list of conversion routines.
+
+ */
+ typedef struct _HTPresentation HTPresentation;
+
+ typedef HTStream *HTConverter (HTPresentation *pres,
+ HTParentAnchor *anchor,
+ HTStream *sink);
+
+ struct _HTPresentation {
+ HTAtom *rep; /* representation name atomized */
+ HTAtom *rep_out; /* resulting representation */
+ HTConverter *converter; /* routine to gen the stream stack */
+ char *command; /* MIME-format command string */
+ char *testcommand; /* MIME-format test string */
+ float quality; /* Between 0 (bad) and 1 (good) */
+ float secs;
+ float secs_per_byte;
+ off_t maxbytes;
+ BOOL get_accept; /* list in "Accept:" for GET */
+ int accept_opt; /* matches against LYAcceptMedia */
+ };
+
+/*
+
+ The list of presentations is kept by this module. It is also scanned by
+ modules which want to know the set of formats supported. for example.
+
+ */
+ extern HTList *HTPresentations;
+
+/*
+
+ The default presentation is used when no other is appropriate
+
+ */
+ extern HTPresentation *default_presentation;
+
+/*
+ * Options used for "Content-Type" string
+ */
+ typedef enum {
+ contentBINARY = 0
+ ,contentTEXT
+ ,contentHTML
+ } ContentType;
+
+/*
+ * Options used for "Accept:" string
+ */
+ typedef enum {
+ /* make the components powers of two so we can add them */
+ mediaINT = 1 /* internal types predefined in HTInit.c */
+ ,mediaEXT = 2 /* external types predefined in HTInit.c */
+ ,mediaCFG = 4 /* types, e.g., viewers, from lynx.cfg */
+ ,mediaUSR = 8 /* user's mime-types, etc. */
+ ,mediaSYS = 16 /* system's mime-types, etc. */
+ /* these are useful flavors for the options menu */
+ ,mediaOpt1 = mediaINT
+ ,mediaOpt2 = mediaINT + mediaCFG
+ ,mediaOpt3 = mediaINT + mediaCFG + mediaUSR
+ ,mediaOpt4 = mediaINT + mediaCFG + mediaUSR + mediaSYS
+ /* this is the flavor from pre-2.8.6 */
+ ,mediaALL = mediaINT + mediaEXT + mediaCFG + mediaUSR + mediaSYS
+ } AcceptMedia;
+
+/*
+ * Options used for "Accept-Encoding:" string
+ */
+ typedef enum {
+ encodingNONE = 0
+ ,encodingGZIP = 1
+ ,encodingDEFLATE = 2
+ ,encodingCOMPRESS = 4
+ ,encodingBZIP2 = 8
+ ,encodingBROTLI = 16
+ ,encodingALL = (encodingGZIP
+ + encodingDEFLATE
+ + encodingCOMPRESS
+ + encodingBZIP2
+ + encodingBROTLI)
+ } AcceptEncoding;
+
+/*
+
+HTSetPresentation: Register a system command to present a format
+
+ ON ENTRY,
+
+ rep is the MIME - style format name
+
+ command is the MAILCAP - style command template
+
+ testcommand is the MAILCAP - style testcommand template
+
+ quality A degradation faction 0..1.0
+
+ secs A limit on the time user will wait (0.0 for infinity)
+ secs_per_byte
+
+ maxbytes A limit on the length acceptable as input (0 infinite)
+
+ media Used in filtering presentation types for "Accept:"
+
+ */
+ extern void HTSetPresentation(const char *representation,
+ const char *command,
+ const char *testcommand,
+ double quality,
+ double secs,
+ double secs_per_byte,
+ long int maxbytes,
+ AcceptMedia media
+ );
+
+/*
+
+HTSetConversion: Register a conversion routine
+
+ ON ENTRY,
+
+ rep_in is the content-type input
+
+ rep_out is the resulting content-type
+
+ converter is the routine to make the stream to do it
+
+ */
+
+ extern void HTSetConversion(const char *rep_in,
+ const char *rep_out,
+ HTConverter *converter,
+ double quality,
+ double secs,
+ double secs_per_byte,
+ long int maxbytes,
+ AcceptMedia media
+ );
+
+/*
+
+HTStreamStack: Create a stack of streams
+
+ This is the routine which actually sets up the conversion. It currently
+ checks only for direct conversions, but multi-stage conversions are forseen.
+ It takes a stream into which the output should be sent in the final format,
+ builds the conversion stack, and returns a stream into which the data in the
+ input format should be fed. The anchor is passed because hypertxet objects
+ load information into the anchor object which represents them.
+
+ */
+ extern HTStream *HTStreamStack(HTFormat format_in,
+ HTFormat format_out,
+ HTStream *stream_out,
+ HTParentAnchor *anchor);
+
+/*
+HTReorderPresentation: put presentation near head of list
+
+ Look up a presentation (exact match only) and, if found, reorder it to the
+ start of the HTPresentations list. - kw
+ */
+
+ extern void HTReorderPresentation(HTFormat format_in,
+ HTFormat format_out);
+
+/*
+ * Setup 'get_accept' flag to denote presentations that are not redundant,
+ * and will be listed in "Accept:" header.
+ */
+ extern void HTFilterPresentations(void);
+
+/*
+
+HTStackValue: Find the cost of a filter stack
+
+ Must return the cost of the same stack which HTStreamStack would set up.
+
+ ON ENTRY,
+
+ format_in The format of the data to be converted
+
+ format_out The format required
+
+ initial_value The intrinsic "value" of the data before conversion on a scale
+ from 0 to 1
+
+ length The number of bytes expected in the input format
+
+ */
+ extern float HTStackValue(HTFormat format_in,
+ HTFormat rep_out,
+ double initial_value,
+ long int length);
+
+#define NO_VALUE_FOUND -1e20 /* returned if none found */
+
+/* Display the page while transfer in progress
+ * -------------------------------------------
+ *
+ * Repaint the page only when necessary.
+ * This is a traverse call for HText_pageDispaly() - it works!.
+ *
+ */
+ extern void HTDisplayPartial(void);
+
+ extern void HTFinishDisplayPartial(void);
+
+/*
+
+HTCopy: Copy a socket to a stream
+
+ This is used by the protocol engines to send data down a stream, typically
+ one which has been generated by HTStreamStack.
+
+ */
+ extern int HTCopy(HTParentAnchor *anchor,
+ int file_number,
+ void *handle,
+ HTStream *sink);
+
+/*
+
+HTFileCopy: Copy a file to a stream
+
+ This is used by the protocol engines to send data down a stream, typically
+ one which has been generated by HTStreamStack. It is currently called by
+ HTParseFile
+
+ */
+ extern int HTFileCopy(FILE *fp,
+ HTStream *sink);
+
+#ifdef USE_SOURCE_CACHE
+/*
+
+HTMemCopy: Copy a memory chunk to a stream
+
+ This is used by the protocol engines to send data down a stream, typically
+ one which has been generated by HTStreamStack. It is currently called by
+ HTParseMem
+
+ */
+ extern int HTMemCopy(HTChunk *chunk,
+ HTStream *sink);
+#endif
+
+/*
+
+HTCopyNoCR: Copy a socket to a stream, stripping CR characters.
+
+ It is slower than HTCopy .
+
+ */
+
+ extern void HTCopyNoCR(HTParentAnchor *anchor,
+ int file_number,
+ HTStream *sink);
+
+/*
+
+Clear input buffer and set file number
+
+ This routine and the one below provide simple character input from sockets.
+ (They are left over from the older architecture and may not be used very
+ much.) The existence of a common routine and buffer saves memory space in
+ small implementations.
+
+ */
+ extern void HTInitInput(int file_number);
+
+/*
+
+Get next character from buffer
+
+ */
+ extern int interrupted_in_htgetcharacter;
+ extern int HTGetCharacter(void);
+
+/*
+
+HTParseSocket: Parse a socket given its format
+
+ This routine is called by protocol modules to load an object. uses
+ HTStreamStack and the copy routines above. Returns HT_LOADED if successful,
+ <0 if not.
+
+ */
+ extern int HTParseSocket(HTFormat format_in,
+ HTFormat format_out,
+ HTParentAnchor *anchor,
+ int file_number,
+ HTStream *sink);
+
+/*
+
+HTParseFile: Parse a File through a file pointer
+
+ This routine is called by protocols modules to load an object. uses
+ HTStreamStack and HTFileCopy. Returns HT_LOADED if successful, can also
+ return HT_PARTIAL_CONTENT, HT_NO_DATA, or other <0 for failure.
+
+ */
+ extern int HTParseFile(HTFormat format_in,
+ HTFormat format_out,
+ HTParentAnchor *anchor,
+ FILE *fp,
+ HTStream *sink);
+
+#ifdef USE_SOURCE_CACHE
+/*
+
+HTParseMem: Parse a document in memory
+
+ This routine is called by protocols modules to load an object. uses
+ HTStreamStack and HTMemCopy. Returns HT_LOADED if successful, can also
+ return <0 for failure.
+
+ */
+ extern int HTParseMem(HTFormat format_in,
+ HTFormat format_out,
+ HTParentAnchor *anchor,
+ HTChunk *chunk,
+ HTStream *sink);
+#endif
+
+#ifdef USE_ZLIB
+/*
+HTParseGzFile: Parse a gzip'ed File through a file pointer
+
+ This routine is called by protocols modules to load an object. uses
+ HTStreamStack and HTGzFileCopy. Returns HT_LOADED if successful, can also
+ return HT_PARTIAL_CONTENT, HT_NO_DATA, or other <0 for failure.
+ */
+ extern int HTParseGzFile(HTFormat format_in,
+ HTFormat format_out,
+ HTParentAnchor *anchor,
+ gzFile gzfp,
+ HTStream *sink);
+
+/*
+HTParseZzFile: Parse a deflate'd File through a file pointer
+
+ This routine is called by protocols modules to load an object. uses
+ HTStreamStack and HTZzFileCopy. Returns HT_LOADED if successful, can also
+ return HT_PARTIAL_CONTENT, HT_NO_DATA, or other <0 for failure.
+ */
+ extern int HTParseZzFile(HTFormat format_in,
+ HTFormat format_out,
+ HTParentAnchor *anchor,
+ FILE *zzfp,
+ HTStream *sink);
+
+#endif /* USE_ZLIB */
+
+#ifdef USE_BZLIB
+/*
+HTParseBzFile: Parse a bzip2'ed File through a file pointer
+
+ This routine is called by protocols modules to load an object. uses
+ HTStreamStack and HTBzFileCopy. Returns HT_LOADED if successful, can also
+ return HT_PARTIAL_CONTENT, HT_NO_DATA, or other <0 for failure.
+ */
+ extern int HTParseBzFile(HTFormat format_in,
+ HTFormat format_out,
+ HTParentAnchor *anchor,
+ BZFILE * bzfp,
+ HTStream *sink);
+
+#endif /* USE_BZLIB */
+
+#ifdef USE_BROTLI
+/*
+HTParseBrFile: Parse a brotli'ed File through a file pointer
+
+ This routine is called by protocols modules to load an object. uses
+ HTStreamStack and HTBrFileCopy. Returns HT_LOADED if successful, can also
+ return HT_PARTIAL_CONTENT, HT_NO_DATA, or other <0 for failure.
+ */
+ extern int HTParseBrFile(HTFormat format_in,
+ HTFormat format_out,
+ HTParentAnchor *anchor,
+ FILE *brfp,
+ HTStream *sink);
+
+#endif /* USE_BROTLI */
+
+/*
+
+HTNetToText: Convert Net ASCII to local representation
+
+ This is a filter stream suitable for taking text from a socket and passing
+ it into a stream which expects text in the local C representation. It does
+ ASCII and newline conversion. As usual, pass its output stream to it when
+ creating it.
+
+ */
+ extern HTStream *HTNetToText(HTStream *sink);
+
+/*
+
+HTFormatInit: Set up default presentations and conversions
+
+ These are defined in HTInit.c or HTSInit.c if these have been replaced. If
+ you don't call this routine, and you don't define any presentations, then
+ this routine will automatically be called the first time a conversion is
+ needed. However, if you explicitly add some conversions (eg using
+ HTLoadRules) then you may want also to explicitly call this to get the
+ defaults as well.
+
+ */
+ extern void HTFormatInit(void);
+
+/*
+
+Epilogue
+
+ */
+ extern BOOL HTOutputSource; /* Flag: shortcut parser */
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* HTFORMAT_H */
diff --git a/WWW/Library/Implementation/HTGopher.c b/WWW/Library/Implementation/HTGopher.c
new file mode 100644
index 0000000..0314179
--- /dev/null
+++ b/WWW/Library/Implementation/HTGopher.c
@@ -0,0 +1,2071 @@
+/*
+ * $LynxId: HTGopher.c,v 1.77 2022/04/01 00:18:09 tom Exp $
+ *
+ * GOPHER ACCESS HTGopher.c
+ * =============
+ *
+ * History:
+ * 26 Sep 90 Adapted from other accesses (News, HTTP) TBL
+ * 29 Nov 91 Downgraded to C, for portable implementation.
+ * 10 Mar 96 Foteos Macrides (macrides@sci.wfbr.edu). Added a
+ * form-based CSO/PH gateway. Can be invoked via a
+ * "cso://host[:port]/" or "gopher://host:105/2"
+ * URL. If a gopher URL is used with a query token
+ * ('?'), the old ISINDEX procedure will be used
+ * instead of the form-based gateway.
+ * 15 Mar 96 Foteos Macrides (macrides@sci.wfbr.edu). Pass
+ * port 79, gtype 0 gopher URLs to the finger
+ * gateway.
+ */
+
+#define HTSTREAM_INTERNAL 1
+
+#include <HTUtils.h> /* Coding convention macros */
+#include <HTFile.h> /* For HTFileFormat() */
+
+#ifndef DISABLE_GOPHER
+#include <HTAlert.h>
+#include <HTParse.h>
+#include <HTTCP.h>
+#include <HTFinger.h>
+#include <LYGlobalDefs.h>
+
+/*
+ * Implements.
+ */
+#include <HTGopher.h>
+
+#define GOPHER_PORT 70 /* See protocol spec */
+#define CSO_PORT 105 /* See protocol spec */
+#define BIG 1024 /* Bug */
+#define LINE_LENGTH 256 /* Bug */
+
+/*
+ * Gopher entity types.
+ */
+#define GOPHER_TEXT '0'
+#define GOPHER_MENU '1'
+#define GOPHER_CSO '2'
+#define GOPHER_ERROR '3'
+#define GOPHER_MACBINHEX '4'
+#define GOPHER_PCBINARY '5'
+#define GOPHER_UUENCODED '6'
+#define GOPHER_INDEX '7'
+#define GOPHER_TELNET '8'
+#define GOPHER_BINARY '9'
+#define GOPHER_GIF 'g'
+#define GOPHER_HTML 'h' /* HTML */
+#define GOPHER_CHTML 'H' /* HTML */
+#define GOPHER_SOUND 's'
+#define GOPHER_WWW 'w' /* W3 address */
+#define GOPHER_IMAGE 'I'
+#define GOPHER_TN3270 'T'
+#define GOPHER_INFO 'i'
+#define GOPHER_DUPLICATE '+'
+#define GOPHER_PLUS_IMAGE ':' /* Addition from Gopher Plus */
+#define GOPHER_PLUS_MOVIE ';'
+#define GOPHER_PLUS_SOUND '<'
+#define GOPHER_PLUS_PDF 'P'
+
+#include <HTFormat.h>
+
+/*
+ * Hypertext object building machinery.
+ */
+#include <HTML.h>
+
+#include <LYStrings.h>
+#include <LYUtils.h>
+#include <LYLeaks.h>
+
+#define PUTC(c) (*targetClass.put_character)(target, c)
+#define PUTS(s) (*targetClass.put_string)(target, s)
+#define START(e) (*targetClass.start_element)(target, e, 0, 0, -1, 0)
+#define END(e) (*targetClass.end_element)(target, e, 0)
+#define FREE_TARGET (*targetClass._free)(target)
+
+#define NEXT_CHAR HTGetCharacter()
+
+/*
+ * Module-wide variables.
+ */
+static int s; /* Socket for gopher or CSO host */
+
+struct _HTStructured {
+ const HTStructuredClass *isa; /* For gopher streams */
+ /* ... */
+};
+
+static HTStructured *target; /* the new gopher hypertext */
+static HTStructuredClass targetClass; /* Its action routines */
+
+struct _HTStream {
+ HTStreamClass *isa; /* For form-based CSO gateway - FM */
+};
+
+typedef struct _CSOfield_info { /* For form-based CSO gateway - FM */
+ struct _CSOfield_info *next;
+ char *name;
+ char *attributes;
+ char *description;
+ int id;
+ int lookup;
+ int indexed;
+ int url;
+ int max_size;
+ int defreturn;
+ int explicit_return;
+ int reserved;
+ int gpublic;
+ char name_buf[16]; /* Avoid malloc if we can */
+ char desc_buf[32]; /* Avoid malloc if we can */
+ char attr_buf[80]; /* Avoid malloc if we can */
+} CSOfield_info;
+
+static CSOfield_info *CSOfields = NULL; /* For form-based CSO gateway - FM */
+
+typedef struct _CSOformgen_context { /* For form-based CSO gateway - FM */
+ const char *host;
+ const char *seek;
+ CSOfield_info *fld;
+ int port;
+ int cur_line;
+ int cur_off;
+ int rep_line;
+ int rep_off;
+ int public_override;
+ int field_select;
+} CSOformgen_context;
+
+/* Matrix of allowed characters in filenames
+ * =========================================
+ */
+static BOOL acceptable_html[256];
+static BOOL acceptable_file[256];
+static BOOL acceptable_inited = NO;
+
+static void init_acceptable(void)
+{
+ unsigned int i;
+ const char *good =
+ "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789./-_$";
+
+ for (i = 0; i < 256; i++) {
+ acceptable_html[i] = NO;
+ acceptable_file[i] = NO;
+ }
+ for (; *good; good++) {
+ acceptable_html[(unsigned int) *good] = YES;
+ acceptable_file[(unsigned int) *good] = YES;
+ }
+ for (good = ";?=#"; *good; ++good) {
+ acceptable_html[(unsigned int) *good] = YES;
+ }
+ acceptable_inited = YES;
+}
+
+/* Decode one hex character
+ * ========================
+ */
+static const char hex[17] = "0123456789abcdef";
+
+static char from_hex(int c)
+{
+ return (char) ((c >= '0') && (c <= '9') ? c - '0'
+ : (c >= 'A') && (c <= 'F') ? c - 'A' + 10
+ : (c >= 'a') && (c <= 'f') ? c - 'a' + 10
+ : 0);
+}
+
+/* Paste in an Anchor
+ * ==================
+ *
+ * The title of the destination is set, as there is no way
+ * of knowing what the title is when we arrive.
+ *
+ * On entry,
+ * HT is in append mode.
+ * text points to the text to be put into the file, 0 terminated.
+ * addr points to the hypertext reference address 0 terminated.
+ */
+BOOLEAN HT_Is_Gopher_URL = FALSE;
+
+static void write_anchor(const char *text, const char *addr)
+{
+ BOOL present[HTML_A_ATTRIBUTES];
+ const char *value[HTML_A_ATTRIBUTES];
+
+ int i;
+
+ for (i = 0; i < HTML_A_ATTRIBUTES; i++)
+ present[i] = 0;
+ present[HTML_A_HREF] = YES;
+ ((const char **) value)[HTML_A_HREF] = addr;
+ present[HTML_A_TITLE] = YES;
+ ((const char **) value)[HTML_A_TITLE] = text;
+
+ CTRACE((tfp, "HTGopher: adding URL: %s\n", addr));
+
+ HT_Is_Gopher_URL = TRUE; /* tell HTML.c that this is a Gopher URL */
+ (*targetClass.start_element) (target, HTML_A, present,
+ (const char **) value, -1, 0);
+
+ PUTS(text);
+ END(HTML_A);
+}
+
+/* Parse a Gopher Menu document
+ * ============================
+ */
+static void parse_menu(const char *arg GCC_UNUSED,
+ HTParentAnchor *anAnchor)
+{
+ char gtype;
+ char this_type;
+ int ich;
+ char line[BIG];
+ char *name = NULL, *selector = NULL; /* Gopher menu fields */
+ char *host = NULL;
+ char *port;
+ char *p = line;
+ const char *title;
+ int bytes = 0;
+ int BytesReported = 0;
+ char buffer[128];
+ BOOL *valid_chars;
+
+#define TAB '\t'
+#define HEX_ESCAPE '%'
+
+ START(HTML_HTML);
+ PUTC('\n');
+ START(HTML_HEAD);
+ PUTC('\n');
+ START(HTML_TITLE);
+ if ((title = HTAnchor_title(anAnchor)))
+ PUTS(title);
+ else
+ PUTS(GOPHER_MENU_TITLE);
+ END(HTML_TITLE);
+ PUTC('\n');
+ END(HTML_HEAD);
+ PUTC('\n');
+
+ START(HTML_BODY);
+ PUTC('\n');
+ START(HTML_H1);
+ if ((title = HTAnchor_title(anAnchor)))
+ PUTS(title);
+ else
+ PUTS(GOPHER_MENU_TITLE);
+ END(HTML_H1);
+ PUTC('\n');
+ START(HTML_PRE);
+ PUTC('\n'); /* newline after HTML_PRE forces split-line */
+ this_type = GOPHER_ERROR;
+ while ((ich = NEXT_CHAR) != EOF) {
+
+ if (interrupted_in_htgetcharacter) {
+ CTRACE((tfp,
+ "HTGopher: Interrupted in HTGetCharacter, apparently.\n"));
+ goto end_html;
+ }
+
+ if ((char) ich != LF) {
+ const char *ss = NULL;
+
+ /*
+ * Help the -source output to look like the HTML equivalent of the
+ * Gopher menu.
+ */
+ if (dump_output_immediately
+ && HTOutputFormat == WWW_DUMP) {
+ if (ich == '<') {
+ ss = "&lt;";
+ } else if (ich == '>') {
+ ss = "&gt;";
+ } else if (ich == '&') {
+ ss = "&amp;";
+ }
+ }
+ if (ss != NULL) {
+ if ((p + 5) < &line[BIG - 1]) {
+ while (*ss != '\0') {
+ *p++ = *ss++;
+ }
+ }
+ } else {
+ *p = (char) ich; /* Put character in line */
+ if (p < &line[BIG - 1])
+ p++;
+ }
+
+ } else {
+ *p++ = '\0'; /* Terminate line */
+ bytes += (int) (p - line); /* add size */
+ p = line; /* Scan it to parse it */
+ port = 0; /* Flag "not parsed" */
+ CTRACE((tfp, "HTGopher: Menu item: %s\n", line));
+ gtype = *p++;
+
+ if (bytes > BytesReported + 1024) {
+ sprintf(buffer, TRANSFERRED_X_BYTES, bytes);
+ HTProgress(buffer);
+ BytesReported = bytes;
+ }
+
+ /* Break on line with a dot by itself */
+ if ((gtype == '.') && ((*p == '\r') || (*p == 0)))
+ break;
+
+ if (gtype && *p) {
+ name = p;
+ selector = StrChr(name, TAB);
+ if (selector) {
+ *selector++ = '\0'; /* Terminate name */
+ /*
+ * Gopher+ Type=0+ objects can be binary, and will
+ * have 9 or 5 beginning their selector. Make sure
+ * we don't trash the terminal by treating them as
+ * text. - FM
+ */
+ if (gtype == GOPHER_TEXT && (*selector == GOPHER_BINARY ||
+ *selector == GOPHER_PCBINARY))
+ gtype = *selector;
+ host = StrChr(selector, TAB);
+ if (host) {
+ *host++ = '\0'; /* Terminate selector */
+ port = StrChr(host, TAB);
+ if (port) {
+ char *junk;
+
+ port[0] = ':'; /* delimit host a la W3 */
+ junk = StrChr(port, TAB);
+ if (junk)
+ *junk = '\0'; /* Chop port */
+ if ((port[1] == '0') && (!port[2]))
+ port[0] = '\0'; /* 0 means none */
+ } /* no port */
+ } /* host ok */
+ } /* selector ok */
+ }
+ /* gtype and name ok */
+ /* Nameless files are a separator line */
+ if (name != NULL && gtype == GOPHER_TEXT) {
+ int i = (int) strlen(name) - 1;
+
+ while (name[i] == ' ' && i >= 0)
+ name[i--] = '\0';
+ if (i < 0)
+ gtype = GOPHER_INFO;
+ }
+
+ if (gtype == GOPHER_WWW) { /* Gopher pointer to W3 */
+ PUTS("(HTML) ");
+ write_anchor(name, selector);
+
+ } else if (gtype == GOPHER_INFO) {
+ /* Information or separator line */
+ PUTS(" ");
+ PUTS(name);
+
+ } else if (port && /* Other types need port */
+ (gtype != GOPHER_DUPLICATE ||
+ this_type != GOPHER_ERROR)) {
+ char *address = 0;
+ const char *format = *selector ? "%s//%s@%s/" : "%s//%s/";
+
+ if (gtype == GOPHER_TELNET) {
+ PUTS(" (TEL) ");
+ if (*selector == '/')
+ ++selector;
+ HTSprintf0(&address, format, STR_TELNET_URL, selector, host);
+ } else if (gtype == GOPHER_TN3270) {
+ PUTS("(3270) ");
+ if (*selector == '/')
+ ++selector;
+ HTSprintf0(&address, format, STR_TN3270_URL, selector, host);
+ } else { /* If parsed ok */
+ char *r;
+
+ switch (gtype) {
+ case GOPHER_TEXT:
+ PUTS("(FILE) ");
+ break;
+ case GOPHER_MENU:
+ PUTS(" (DIR) ");
+ break;
+ case GOPHER_DUPLICATE:
+ PUTS(" (+++) ");
+ break;
+ case GOPHER_CSO:
+ PUTS(" (CSO) ");
+ break;
+ case GOPHER_PCBINARY:
+ PUTS(" (BIN) ");
+ break;
+ case GOPHER_UUENCODED:
+ PUTS(" (UUE) ");
+ break;
+ case GOPHER_INDEX:
+ PUTS(" (?) ");
+ break;
+ case GOPHER_BINARY:
+ PUTS(" (BIN) ");
+ break;
+ case GOPHER_GIF:
+ case GOPHER_IMAGE:
+ case GOPHER_PLUS_IMAGE:
+ PUTS(" (IMG) ");
+ break;
+ case GOPHER_SOUND:
+ case GOPHER_PLUS_SOUND:
+ PUTS(" (SND) ");
+ break;
+ case GOPHER_MACBINHEX:
+ PUTS(" (HQX) ");
+ break;
+ case GOPHER_HTML:
+ case GOPHER_CHTML:
+ PUTS("(HTML) ");
+ break;
+ case 'm':
+ PUTS("(MIME) ");
+ break;
+ case GOPHER_PLUS_MOVIE:
+ PUTS(" (MOV) ");
+ break;
+ case GOPHER_PLUS_PDF:
+ PUTS(" (PDF) ");
+ break;
+ default:
+ PUTS("(UNKN) ");
+ break;
+ }
+
+ if (gtype != GOPHER_DUPLICATE)
+ this_type = gtype;
+
+ HTSprintf0(&address, "//%s/%c", host, this_type);
+ if (gtype == GOPHER_HTML) {
+ valid_chars = acceptable_html;
+ if (*selector == '/')
+ ++selector;
+ } else {
+ valid_chars = acceptable_file;
+ }
+
+ for (r = selector; *r; r++) { /* Encode selector string */
+ if (valid_chars[UCH(*r)]) {
+ HTSprintf(&address, "%c", *r);
+ } else {
+ HTSprintf(&address, "%c%c%c",
+ HEX_ESCAPE, /* Means hex coming */
+ hex[(TOASCII(*r)) >> 4],
+ hex[(TOASCII(*r)) & 15]);
+ }
+ }
+ }
+ /* Error response from Gopher doesn't deserve to
+ be a hyperlink. */
+ if (strcmp(address, "gopher://error.host:1/0"))
+ write_anchor(name, address);
+ else
+ PUTS(name);
+ FREE(address);
+ } else { /* parse error */
+ CTRACE((tfp, "HTGopher: Bad menu item (type %d, port %s).\n",
+ gtype, NonNull(port)));
+ PUTS(line);
+
+ } /* parse error */
+
+ PUTC('\n');
+ p = line; /* Start again at beginning of line */
+
+ } /* if end of line */
+
+ } /* Loop over characters */
+
+ end_html:
+ END(HTML_PRE);
+ PUTC('\n');
+ END(HTML_BODY);
+ PUTC('\n');
+ END(HTML_HTML);
+ PUTC('\n');
+ FREE_TARGET;
+
+ return;
+}
+
+/* Parse a Gopher CSO document from an ISINDEX query.
+ * ==================================================
+ *
+ * Accepts an open socket to a CSO server waiting to send us
+ * data and puts it on the screen in a reasonable manner.
+ *
+ * Perhaps this data can be automatically linked to some
+ * other source as well???
+ *
+ * Taken from hacking by Lou Montulli@ukanaix.cc.ukans.edu
+ * on XMosaic-1.1, and put on libwww 2.11 by Arthur Secret,
+ * secret@dxcern.cern.ch .
+ */
+static void parse_cso(const char *arg,
+ HTParentAnchor *anAnchor)
+{
+ int ich;
+ char line[BIG];
+ char *p = line;
+ char *first_colon, *second_colon, last_char = '\0';
+ const char *title;
+
+ START(HTML_HEAD);
+ PUTC('\n');
+ START(HTML_TITLE);
+ if ((title = HTAnchor_title(anAnchor)))
+ PUTS(title);
+ else
+ PUTS(GOPHER_CSO_SEARCH_RESULTS);
+ END(HTML_TITLE);
+ PUTC('\n');
+ END(HTML_HEAD);
+ PUTC('\n');
+ START(HTML_H1);
+ if ((title = HTAnchor_title(anAnchor)))
+ PUTS(title);
+ else {
+ PUTS(arg);
+ PUTS(GOPHER_SEARCH_RESULTS);
+ }
+ END(HTML_H1);
+ PUTC('\n');
+ START(HTML_PRE);
+
+ /*
+ * Start grabbing chars from the network.
+ */
+ while ((ich = NEXT_CHAR) != EOF) {
+ if ((char) ich != LF) {
+ *p = (char) ich; /* Put character in line */
+ if (p < &line[BIG - 1])
+ p++;
+ } else {
+ *p = '\0'; /* Terminate line */
+ p = line; /* Scan it to parse it */
+ /*
+ * OK we now have a line in 'p'. Lets parse it and print it.
+ */
+
+ /*
+ * Break on line that begins with a 2. It's the end of data.
+ */
+ if (*p == '2')
+ break;
+
+ /*
+ * Lines beginning with 5 are errors. Print them and quit.
+ */
+ if (*p == '5') {
+ START(HTML_H2);
+ PUTS(p + 4);
+ END(HTML_H2);
+ break;
+ }
+
+ if (*p == '-') {
+ /*
+ * Data lines look like -200:#:
+ * where # is the search result number and can be multiple
+ * digits (infinite?).
+ * Find the second colon and check the digit to the left of it
+ * to see if they are different. If they are then a different
+ * person is starting. Make this line an <h2>.
+ */
+
+ /*
+ * Find the second_colon.
+ */
+ second_colon = NULL;
+ first_colon = StrChr(p, ':');
+ if (first_colon != NULL) {
+ second_colon = StrChr(first_colon + 1, ':');
+ }
+
+ if (second_colon != NULL) { /* error check */
+
+ if (*(second_colon - 1) != last_char)
+ /* print separator */
+ {
+ END(HTML_PRE);
+ START(HTML_H2);
+ }
+
+ /*
+ * Right now the record appears with the alias (first line)
+ * as the header and the rest as <pre> text.
+ *
+ * It might look better with the name as the header and the
+ * rest as a <ul> with <li> tags. I'm not sure whether the
+ * name field comes in any special order or if its even
+ * required in a record, so for now the first line is the
+ * header no matter what it is (it's almost always the
+ * alias).
+ *
+ * A <dl> with the first line as the <DT> and the rest as
+ * some form of <DD> might good also?
+ */
+
+ /*
+ * Print data.
+ */
+ PUTS(second_colon + 1);
+ PUTC('\n');
+
+ if (*(second_colon - 1) != last_char)
+ /* end separator */
+ {
+ END(HTML_H2);
+ START(HTML_PRE);
+ }
+
+ /*
+ * Save the char before the second colon for comparison on
+ * the next pass.
+ */
+ last_char = *(second_colon - 1);
+
+ } /* end if second_colon */
+ } /* end if *p == '-' */
+ } /* if end of line */
+
+ } /* Loop over characters */
+
+ /* end the text block */
+ PUTC('\n');
+ END(HTML_PRE);
+ PUTC('\n');
+ FREE_TARGET;
+
+ return; /* all done */
+} /* end of procedure */
+
+/* Display a Gopher CSO ISINDEX cover page.
+ * ========================================
+ */
+static void display_cso(const char *arg,
+ HTParentAnchor *anAnchor)
+{
+ const char *title;
+
+ START(HTML_HEAD);
+ PUTC('\n');
+ START(HTML_TITLE);
+ if ((title = HTAnchor_title(anAnchor)))
+ PUTS(title);
+ else
+ PUTS(GOPHER_CSO_INDEX);
+ END(HTML_TITLE);
+ PUTC('\n');
+ START(HTML_ISINDEX);
+ PUTC('\n');
+ END(HTML_HEAD);
+ PUTC('\n');
+ START(HTML_H1);
+ if ((title = HTAnchor_title(anAnchor)))
+ PUTS(title);
+ else {
+ PUTS(arg);
+ PUTS(INDEX_SEGMENT);
+ }
+ END(HTML_H1);
+ PUTS(GOPHER_CSO_INDEX_SUBTITLE);
+ START(HTML_P);
+ PUTS(GOPHER_CSO_SOLICIT_KEYWORDS);
+ START(HTML_P);
+ PUTS(SEGMENT_KEYWORDS_WILL);
+ PUTS(SEGMENT_PERSONS_DB_NAME);
+
+ if (!HTAnchor_title(anAnchor))
+ HTAnchor_setTitle(anAnchor, arg);
+
+ FREE_TARGET;
+ return;
+}
+
+/* Display a Gopher Index document.
+ * ================================
+ */
+static void display_index(const char *arg,
+ HTParentAnchor *anAnchor)
+{
+ const char *title;
+
+ START(HTML_HEAD);
+ PUTC('\n');
+ PUTC('\n');
+ START(HTML_TITLE);
+ if ((title = HTAnchor_title(anAnchor)))
+ PUTS(title);
+ else
+ PUTS(GOPHER_INDEX_TITLE);
+ END(HTML_TITLE);
+ PUTC('\n');
+ START(HTML_ISINDEX);
+ PUTC('\n');
+ END(HTML_HEAD);
+ PUTC('\n');
+ START(HTML_H1);
+ if ((title = HTAnchor_title(anAnchor)))
+ PUTS(title);
+ else {
+ PUTS(arg);
+ PUTS(INDEX_SEGMENT);
+ }
+ END(HTML_H1);
+ PUTS(GOPHER_INDEX_SUBTITLE);
+ START(HTML_P);
+ PUTS(GOPHER_SOLICIT_KEYWORDS);
+
+ if (!HTAnchor_title(anAnchor))
+ HTAnchor_setTitle(anAnchor, arg);
+
+ FREE_TARGET;
+ return;
+}
+
+/* De-escape a selector into a command.
+ * ====================================
+ *
+ * The % hex escapes are converted. Otherwise, the string is copied.
+ */
+static void de_escape(char *command, const char *selector)
+{
+ const char *p = selector;
+ char *q;
+
+ if (command == NULL)
+ outofmem(__FILE__, "HTLoadGopher");
+
+ q = command;
+ while (*p) { /* Decode hex */
+ if (*p == HEX_ESCAPE) {
+ char c;
+ unsigned int b;
+
+ p++;
+ c = *p++;
+ b = UCH(from_hex(c));
+ c = *p++;
+ if (!c)
+ break; /* Odd number of chars! */
+ *q++ = (char) FROMASCII((b << 4) + UCH(from_hex(c)));
+ } else {
+ *q++ = *p++; /* Record */
+ }
+ }
+ *q = '\0'; /* Terminate command */
+}
+
+/* Free the CSOfields structures. - FM
+ * ===================================
+ */
+static void free_CSOfields(void)
+{
+ CSOfield_info *cur = CSOfields;
+ CSOfield_info *prev;
+
+ while (cur) {
+ if (cur->name != cur->name_buf)
+ FREE(cur->name);
+ if (cur->attributes != cur->attr_buf)
+ FREE(cur->attributes);
+ if (cur->description != cur->desc_buf)
+ FREE(cur->description);
+ prev = cur;
+ cur = cur->next;
+ FREE(prev);
+ }
+
+ return;
+}
+
+/* Interpret CSO/PH form template keys. - FM
+ * =========================================
+ */
+static void interpret_cso_key(const char *key,
+ char *buf,
+ size_t bufsize,
+ int *length,
+ CSOformgen_context * ctx,
+ HTStream *Target)
+{
+ CSOfield_info *fld;
+
+ if ((fld = ctx->fld) != 0) {
+ /*
+ * Most substitutions only recognized inside of loops.
+ */
+ int error = 0;
+
+ if (0 == StrNCmp(key, "$(FID)", 6)) {
+ sprintf(buf, "%d", fld->id);
+ } else if (0 == StrNCmp(key, "$(FDESC)", 8)) {
+ sprintf(buf, "%.2046s", fld->description);
+ } else if (0 == StrNCmp(key, "$(FDEF)", 7)) {
+ strcpy(buf, fld->defreturn ? " checked" : "");
+ } else if (0 == StrNCmp(key, "$(FNDX)", 7)) {
+ strcpy(buf, fld->indexed ? "*" : "");
+ } else if (0 == StrNCmp(key, "$(FSIZE)", 8)) {
+ sprintf(buf, " size=%d maxlength=%d",
+ fld->max_size > 55 ? 55 : fld->max_size,
+ fld->max_size);
+ } else if (0 == StrNCmp(key, "$(FSIZE2)", 9)) {
+ sprintf(buf, " maxlength=%d", fld->max_size);
+ } else {
+ error = 1;
+ }
+ if (!error) {
+ *length = (int) strlen(buf);
+ return;
+ }
+ }
+ buf[0] = '\0';
+ if (0 == StrNCmp(key, "$(NEXTFLD)", 10)) {
+ if (!ctx->fld)
+ fld = CSOfields;
+ else
+ fld = ctx->fld->next;
+ switch (ctx->field_select) {
+ case 0:
+ /*
+ * 'Query' fields, public and lookup attributes.
+ */
+ for (; fld; fld = fld->next)
+ if (fld->gpublic && (fld->lookup == 1))
+ break;
+ break;
+ case 1:
+ /*
+ * 'Query' fields, accept lookup attribute.
+ */
+ for (; fld; fld = fld->next)
+ if (fld->lookup == 1)
+ break;
+ break;
+ case 2:
+ /*
+ * 'Return' fields, public only.
+ */
+ for (; fld; fld = fld->next)
+ if (fld->gpublic)
+ break;
+ break;
+ case 3:
+ /*
+ * All fields.
+ */
+ break;
+ }
+ if (fld) {
+ ctx->cur_line = ctx->rep_line;
+ ctx->cur_off = ctx->rep_off;
+ }
+ ctx->fld = fld;
+
+ } else if ((0 == StrNCmp(key, "$(QFIELDS)", 10)) ||
+ (0 == StrNCmp(key, "$(RFIELDS)", 10))) {
+ /*
+ * Begin iteration sequence.
+ */
+ ctx->rep_line = ctx->cur_line;
+ ctx->rep_off = ctx->cur_off;
+ ctx->fld = (CSOfield_info *) 0;
+ ctx->seek = "$(NEXTFLD)";
+ ctx->field_select = (key[2] == 'Q') ? 0 : 2;
+ if (ctx->public_override)
+ ctx->field_select++;
+
+ } else if (0 == StrNCmp(key, "$(NAMEFLD)", 10)) {
+ /*
+ * Special, locate name field. Flag lookup so QFIELDS will skip it.
+ */
+ for (fld = CSOfields; fld; fld = fld->next)
+ if (strcmp(fld->name, "name") == 0 ||
+ strcmp(fld->name, "Name") == 0) {
+ if (fld->lookup)
+ fld->lookup = 2;
+ break;
+ }
+ ctx->fld = fld;
+ } else if (0 == StrNCmp(key, "$(HOST)", 7)) {
+ strcpy(buf, ctx->host);
+ } else if (0 == StrNCmp(key, "$(PORT)", 7)) {
+ sprintf(buf, "%d", ctx->port);
+ } else {
+ /*
+ * No match, dump key to buffer so client sees it for debugging.
+ */
+ size_t out = 0;
+
+ while (*key && (*key != ')')) {
+ buf[out++] = (*key++);
+ if (out > bufsize - 2) {
+ buf[out] = '\0';
+ (*Target->isa->put_block) (Target, buf, (int) strlen(buf));
+ out = 0;
+ }
+ }
+ buf[out++] = ')';
+ buf[out] = '\0';
+ }
+ *length = (int) strlen(buf);
+ return;
+}
+
+/* Parse the elements in a CSO/PH fields structure. - FM
+ * =====================================================
+ */
+static int parse_cso_field_info(CSOfield_info *blk)
+{
+ char *info, *max_spec;
+
+ /*
+ * Initialize all fields to default values.
+ */
+ blk->indexed = blk->lookup = blk->reserved = blk->max_size = blk->url = 0;
+ blk->defreturn = blk->explicit_return = blk->gpublic = 0;
+
+ /*
+ * Search for keywords in info string and set values. Attributes are
+ * converted to all lower-case for comparison.
+ */
+ info = blk->attributes;
+ LYLowerCase(info);
+ if (strstr(info, "indexed "))
+ blk->indexed = 1;
+ if (strstr(info, "default "))
+ blk->defreturn = 1;
+ if (strstr(info, "public "))
+ blk->gpublic = 1;
+ if (strstr(info, "lookup "))
+ blk->lookup = 1;
+ if (strstr(info, "url ")) {
+ blk->url = 1;
+ blk->defreturn = 1;
+ }
+ max_spec = strstr(info, "max ");
+ if (max_spec) {
+ sscanf(&max_spec[4], "%d", &blk->max_size);
+ } else {
+ blk->max_size = 32;
+ }
+
+ return 0;
+}
+
+/* Parse a reply from a CSO/PH fields request. - FM
+ * ================================================
+ */
+static int parse_cso_fields(char *buf,
+ size_t size)
+{
+ int ich;
+ char *p = buf;
+ int i, code = 0, prev_code;
+ size_t alen;
+ char *indx, *name;
+ CSOfield_info *last, *newf;
+
+ last = CSOfields = (CSOfield_info *) 0;
+ prev_code = -2555;
+ buf[0] = '\0';
+
+ /*
+ * Start grabbing chars from the network.
+ */
+ while ((ich = NEXT_CHAR) != EOF) {
+ if (interrupted_in_htgetcharacter) {
+ CTRACE((tfp,
+ "HTLoadCSO: Interrupted in HTGetCharacter, apparently.\n"));
+ free_CSOfields();
+ buf[0] = '\0';
+ return HT_INTERRUPTED;
+ }
+
+ if ((char) ich != LF) {
+ *p = (char) ich; /* Put character in buffer */
+ if (p < &buf[size - 1]) {
+ p++;
+ }
+ } else {
+ *p = '\0'; /* Terminate line */
+ p = buf; /* Scan it to parse it */
+
+ /* OK we now have a line in 'p' lets parse it.
+ */
+
+ /*
+ * Break on line that begins with a 2. It's the end of data.
+ */
+ if (*p == '2')
+ break;
+
+ /*
+ * Lines beginning with 5 are errors. Print them and quit.
+ */
+ if (*p == '5') {
+ return 5;
+ }
+
+ if (*p == '-') {
+ /*
+ * Data lines look like -200:#:
+ * where # is the search result number and can be multiple
+ * digits (infinite?).
+ */
+
+ /*
+ * Check status, ignore any non-success.
+ */
+ if (p[1] != '2')
+ continue;
+
+ /*
+ * Parse fields within returned line into status, ndx, name,
+ * data.
+ */
+ indx = NULL;
+ name = NULL;
+ for (i = 0; p[i]; i++) {
+ if (p[i] == ':') {
+ p[i] = '\0';
+ if (!indx) {
+ indx = (char *) &p[i + 1];
+ code = atoi(indx);
+ } else if (!name) {
+ name = (char *) &p[i + 1];
+ } else {
+ i++;
+ break;
+ }
+ }
+ }
+ /*
+ * Add data to field structure.
+ */
+ if (name) {
+ if (code == prev_code) {
+ /*
+ * Remaining data are description. Save in current
+ * info block.
+ */
+ if (last != NULL) {
+ alen = strlen((char *) &p[i]) + 1;
+ if (alen > sizeof(last->desc_buf)) {
+ if (last->description != last->desc_buf)
+ FREE(last->description);
+ if (!(last->description = (char *) malloc(alen))) {
+ outofmem(__FILE__, "HTLoadCSO");
+ }
+ }
+ strcpy(last->description, (char *) &p[i]);
+ }
+ } else {
+ /*
+ * Initialize new block, append to end of list to
+ * preserve order.
+ */
+ newf = typecalloc(CSOfield_info);
+
+ if (!newf) {
+ outofmem(__FILE__, "HTLoadCSO");
+ }
+
+ if (last)
+ last->next = newf;
+ else
+ CSOfields = newf;
+ last = newf;
+
+ newf->next = (CSOfield_info *) 0;
+ newf->name = newf->name_buf;
+ alen = strlen(name) + 1;
+ if (alen > sizeof(newf->name_buf)) {
+ if (!(newf->name = (char *) malloc(alen))) {
+ outofmem(__FILE__, "HTLoadCSO");
+ }
+ }
+ strcpy(newf->name, name);
+
+ newf->attributes = newf->attr_buf;
+ alen = strlen((char *) &p[i]) + 2;
+ if (alen > sizeof(newf->attr_buf)) {
+ if (!(newf->attributes = (char *) malloc(alen))) {
+ outofmem(__FILE__, "HTLoadCSO");
+ }
+ }
+ strcpy(newf->attributes, (char *) &p[i]);
+ strcpy((char *) &newf->attributes[alen - 2], " ");
+ newf->description = newf->desc_buf;
+ newf->desc_buf[0] = '\0';
+ newf->id = atoi(indx);
+ /*
+ * Scan for keywords.
+ */
+ parse_cso_field_info(newf);
+ }
+ prev_code = code;
+ } else
+ break;
+ } /* end if *p == '-' */
+ } /* if end of line */
+
+ } /* Loop over characters */
+
+ /* end the text block */
+
+ if (buf[0] == '\0') {
+ return -1; /* no response */
+ }
+ buf[0] = '\0';
+ return 0; /* all done */
+} /* end of procedure */
+
+/* Generate a form for submitting CSO/PH searches. - FM
+ * ====================================================
+ */
+static int generate_cso_form(char *host,
+ int port,
+ char *buf,
+ size_t bufsize,
+ HTStream *Target)
+{
+ int i, j, length;
+ size_t out;
+ int full_flag = 1;
+ const char *key;
+ const char *line;
+ CSOformgen_context ctx;
+ static const char *ctemplate[] =
+ {
+ "<HTML>\n<HEAD>\n<TITLE>CSO/PH Query Form for $(HOST)</TITLE>\n</HEAD>\n<BODY>",
+ "<H2><I>CSO/PH Query Form</I> for <EM>$(HOST)</EM></H2>",
+ "To search the database for a name, fill in one or more of the fields",
+ "in the form below and activate the 'Submit query' button. At least",
+ "one of the entered fields must be flagged as indexed.",
+ "<HR><FORM method=\"POST\" action=\"cso://$(HOST)/\">",
+ "[ <input type=\"submit\" value=\"Submit query\"> | ",
+ "<input type=\"reset\" value=\"Clear fields\"> ]",
+ "<P><DL>",
+ " <DT>Search parameters (* indicates indexed field):",
+ " <DD>",
+ "$(NAMEFLD) <DL COMPACT>\n <DT><I>$(FDESC)</I>$(FNDX)",
+ " <DD>Last: <input name=\"q_$(FID)\" type=\"text\" size=49$(FSIZE2)>",
+ " <DD>First: <input name=\"q_$(FID)\" type=\"text\" size=48$(FSIZE2)>",
+ "$(QFIELDS) <DT><I>$(FDESC)</I>$(FNDX)",
+ " <DD><input name=\"q_$(FID)\" type=\"text\" $(FSIZE)>\n$(NEXTFLD)",
+ " </DL>",
+ " </DL>\n<P><DL>",
+ " <DT>Output format:",
+ " <DD>Returned data option: <select name=\"return\">",
+ " <option>default<option selected>all<option>selected</select><BR>",
+ "$(RFIELDS) <input type=\"checkbox\" name=\"r_$(FID)\"$(FDEF)> $(FDESC)<BR>",
+ "$(NEXTFLD) ",
+ " </DL></FORM><HR>\n</BODY>\n</HTML>",
+ (char *) 0
+ };
+
+ memset(&ctx, 0, sizeof(ctx));
+ ctx.host = host;
+ ctx.seek = (char *) 0;
+ ctx.port = port;
+ ctx.fld = (CSOfield_info *) 0;
+ ctx.public_override = full_flag;
+ /*
+ * Parse the strings in the template array to produce HTML document to send
+ * to client. First line is skipped for 'full' lists.
+ */
+ out = 0;
+ buf[out] = '\0';
+ for (i = 0; ctemplate[i]; i++) {
+ /*
+ * Search the current string for substitution, flagged by $(
+ */
+ for (line = ctemplate[i], j = 0; line[j]; j++) {
+ if ((line[j] == '$') && (line[j + 1] == '(')) {
+ /*
+ * Command detected, flush output buffer and find closing ')'
+ * that delimits the command.
+ */
+ buf[out] = '\0';
+ if (out > 0)
+ (*Target->isa->put_block) (Target, buf, (int) strlen(buf));
+ for (key = &line[j]; line[j + 1] && (line[j] != ')'); j++) {
+ ;
+ }
+ /*
+ * Save context, interpret command and restore updated context.
+ */
+ ctx.cur_line = i;
+ ctx.cur_off = j;
+ interpret_cso_key(key, buf, bufsize, &length, &ctx, Target);
+ i = ctx.cur_line;
+ j = ctx.cur_off;
+ line = ctemplate[i];
+ out = (size_t) length;
+
+ if (ctx.seek) {
+ /*
+ * Command wants us to skip (forward) to indicated token.
+ * Start at current position.
+ */
+ size_t slen = strlen(ctx.seek);
+
+ for (; ctemplate[i]; i++) {
+ for (line = ctemplate[i]; line[j]; j++) {
+ if (line[j] == '$')
+ if (0 == StrNCmp(ctx.seek, &line[j], slen)) {
+ if (j == 0)
+ j = (int) strlen(ctemplate[--i]) - 1;
+ else
+ --j;
+ line = ctemplate[i];
+ ctx.seek = (char *) 0;
+ break;
+ }
+ }
+ if (!ctx.seek)
+ break;
+ j = 0;
+ }
+ if (ctx.seek) {
+ char *temp = 0;
+
+ HTSprintf0(&temp, GOPHER_CSO_SEEK_FAILED, ctx.seek);
+ (*Target->isa->put_block) (Target, temp, (int) strlen(temp));
+ FREE(temp);
+ }
+ }
+ } else {
+ /*
+ * Non-command text, add to output buffer.
+ */
+ buf[out++] = line[j];
+ if (out > (bufsize - 3)) {
+ buf[out] = '\0';
+ (*Target->isa->put_block) (Target, buf, (int) strlen(buf));
+ out = 0;
+ }
+ }
+ }
+ buf[out++] = '\n';
+ buf[out] = '\0';
+ }
+ if (out > 0)
+ (*Target->isa->put_block) (Target, buf, (int) strlen(buf));
+
+ return 0;
+}
+
+/* Generate a results report for CSO/PH form-based searches. - FM
+ * ==============================================================
+ */
+static int generate_cso_report(HTStream *Target)
+{
+ int ich;
+ char line[BIG];
+ char *buf = 0;
+ char *p = line, *href = NULL;
+ int i, prev_ndx, ndx;
+ char *rcode, *ndx_str, *fname, *fvalue, *l;
+ CSOfield_info *fld;
+ BOOL stop = FALSE;
+
+ /*
+ * Read lines until non-negative status.
+ */
+ prev_ndx = -100;
+ /*
+ * Start grabbing chars from the network.
+ */
+ while (!stop && (ich = NEXT_CHAR) != EOF) {
+ if (interrupted_in_htgetcharacter) {
+ CTRACE((tfp,
+ "HTLoadCSO: Interrupted in HTGetCharacter, apparently.\n"));
+ _HTProgress(CONNECTION_INTERRUPTED);
+ goto end_CSOreport;
+ }
+
+ if ((char) ich != LF) {
+ *p = (char) ich; /* Put character in line */
+ if (p < &line[BIG - 1]) {
+ p++;
+ }
+ } else {
+ *p = '\0'; /* Terminate line */
+ /*
+ * OK we now have a line. Load it as 'p' and parse it.
+ */
+ p = line;
+ if (p[0] != '-' && p[0] != '1') {
+ stop = TRUE;
+ }
+ rcode = (p[0] == '-') ? &p[1] : p;
+ ndx_str = fname = NULL;
+ for (i = 0; p[i] != '\0'; i++) {
+ if (p[i] == ':') {
+ p[i] = '\0';
+ fname = &p[i + 1];
+ if (ndx_str) {
+ break;
+ }
+ ndx_str = fname;
+ }
+ }
+ if (ndx_str) {
+ ndx = atoi(ndx_str);
+ if (prev_ndx != ndx) {
+ if (prev_ndx != -100) {
+ HTSprintf0(&buf, "</DL></DL>\n");
+ (*Target->isa->put_block) (Target, buf, (int) strlen(buf));
+ }
+ if (ndx == 0) {
+ HTSprintf0(&buf,
+ "<HR><DL><DT>Information/status<DD><DL><DT>\n");
+ (*Target->isa->put_block) (Target, buf, (int) strlen(buf));
+ } else {
+ HTSprintf0(&buf,
+ "<HR><DL><DT>Entry %d:<DD><DL COMPACT><DT>\n", ndx);
+ (*Target->isa->put_block) (Target, buf, (int) strlen(buf));
+ }
+ prev_ndx = ndx;
+ }
+ } else {
+ HTSprintf0(&buf, "<DD>%s\n", rcode);
+ (*Target->isa->put_block) (Target, buf, (int) strlen(buf));
+ continue;
+ }
+ if ((*rcode >= '2') && (*rcode <= '5') && (fname != ndx_str)) {
+ while (*fname == ' ') {
+ fname++; /* trim leading spaces */
+ }
+ for (fvalue = fname; *fvalue; fvalue++) {
+ if (*fvalue == ':') {
+ *fvalue++ = '\0';
+ i = (int) strlen(fname) - 1;
+ while (i >= 0 && fname[i] == ' ') {
+ fname[i--] = '\0'; /* trim trailing */
+ }
+ break;
+ }
+ }
+ if (fvalue) {
+ while (*fvalue == ' ') {
+ fvalue++; /* trim leading spaces */
+ }
+ }
+ if (*fname) {
+ for (fld = CSOfields; fld; fld = fld->next) {
+ if (!strcmp(fld->name, fname)) {
+ if (fld->description) {
+ fname = fld->description;
+ }
+ break;
+ }
+ }
+ if (fld && fld->url) {
+ HTSprintf0(&buf,
+ "<DT><I>%s</I><DD><A HREF=\"%s\">%s</A>\n",
+ fname, fvalue, fvalue);
+ (*Target->isa->put_block) (Target, buf, (int) strlen(buf));
+ } else {
+ HTSprintf0(&buf, "<DT><I>%s</I><DD>", fname);
+ (*Target->isa->put_block) (Target, buf, (int) strlen(buf));
+ buf[0] = '\0';
+ l = fvalue;
+ while (*l) {
+ if (*l == '<') {
+ StrAllocCat(buf, "&lt;");
+ l++;
+ } else if (*l == '>') {
+ StrAllocCat(buf, "&gt;");
+ l++;
+ } else if (StrNCmp(l, STR_NEWS_URL, LEN_NEWS_URL) &&
+ StrNCmp(l, "snews://", 8) &&
+ StrNCmp(l, "nntp://", 7) &&
+ StrNCmp(l, "snewspost:", 10) &&
+ StrNCmp(l, "snewsreply:", 11) &&
+ StrNCmp(l, "newspost:", 9) &&
+ StrNCmp(l, "newsreply:", 10) &&
+ StrNCmp(l, "ftp://", 6) &&
+ StrNCmp(l, "file:/", 6) &&
+ StrNCmp(l, "finger://", 9) &&
+ StrNCmp(l, "http://", 7) &&
+ StrNCmp(l, "https://", 8) &&
+ StrNCmp(l, "wais://", 7) &&
+ StrNCmp(l, STR_MAILTO_URL,
+ LEN_MAILTO_URL) &&
+ StrNCmp(l, "cso://", 6) &&
+ StrNCmp(l, "gopher://", 9)) {
+ HTSprintf(&buf, "%c", *l++);
+ } else {
+ StrAllocCat(buf, "<a href=\"");
+ StrAllocCopy(href, l);
+ StrAllocCat(buf, strtok(href, " \r\n\t,>)\""));
+ StrAllocCat(buf, "\">");
+ while (*l && !StrChr(" \r\n\t,>)\"", *l)) {
+ HTSprintf(&buf, "%c", *l++);
+ }
+ StrAllocCat(buf, "</a>");
+ FREE(href);
+ }
+ }
+ StrAllocCat(buf, "\n");
+ (*Target->isa->put_block) (Target, buf, (int) strlen(buf));
+ }
+ } else {
+ HTSprintf0(&buf, "<DD>");
+ (*Target->isa->put_block) (Target, buf, (int) strlen(buf));
+ buf[0] = '\0';
+ l = fvalue;
+ while (*l) {
+ if (*l == '<') {
+ StrAllocCat(buf, "&lt;");
+ l++;
+ } else if (*l == '>') {
+ StrAllocCat(buf, "&gt;");
+ l++;
+ } else if (StrNCmp(l, STR_NEWS_URL, LEN_NEWS_URL) &&
+ StrNCmp(l, "snews://", 8) &&
+ StrNCmp(l, "nntp://", 7) &&
+ StrNCmp(l, "snewspost:", 10) &&
+ StrNCmp(l, "snewsreply:", 11) &&
+ StrNCmp(l, "newspost:", 9) &&
+ StrNCmp(l, "newsreply:", 10) &&
+ StrNCmp(l, "ftp://", 6) &&
+ StrNCmp(l, "file:/", 6) &&
+ StrNCmp(l, "finger://", 9) &&
+ StrNCmp(l, "http://", 7) &&
+ StrNCmp(l, "https://", 8) &&
+ StrNCmp(l, "wais://", 7) &&
+ StrNCmp(l, STR_MAILTO_URL, LEN_MAILTO_URL) &&
+ StrNCmp(l, "cso://", 6) &&
+ StrNCmp(l, "gopher://", 9)) {
+ HTSprintf(&buf, "%c", *l++);
+ } else {
+ StrAllocCat(buf, "<a href=\"");
+ StrAllocCopy(href, l);
+ StrAllocCat(buf, strtok(href, " \r\n\t,>)\""));
+ StrAllocCat(buf, "\">");
+ while (*l && !StrChr(" \r\n\t,>)\"", *l)) {
+ HTSprintf(&buf, "%c", *l++);
+ }
+ StrAllocCat(buf, "</a>");
+ FREE(href);
+ }
+ }
+ StrAllocCat(buf, "\n");
+ (*Target->isa->put_block) (Target, buf, (int) strlen(buf));
+ }
+ } else {
+ HTSprintf0(&buf, "<DD>%s\n", fname);
+ (*Target->isa->put_block) (Target, buf, (int) strlen(buf));
+ }
+ }
+ }
+ end_CSOreport:
+ if (prev_ndx != -100) {
+ HTSprintf0(&buf, "</DL></DL>\n");
+ (*Target->isa->put_block) (Target, buf, (int) strlen(buf));
+ }
+ FREE(buf);
+ return 0;
+}
+
+/* CSO/PH form-based search gateway - FM HTLoadCSO
+ * =====================================
+ */
+static int HTLoadCSO(const char *arg,
+ HTParentAnchor *anAnchor,
+ HTFormat format_out,
+ HTStream *sink)
+{
+ static const char end_form[] = "</BODY>\n</HTML>\n";
+ char *host, *cp, *data;
+ int port = CSO_PORT;
+ int status; /* tcp return */
+ bstring *command = NULL;
+ bstring *content = NULL;
+ int len, i, j, start, finish, flen, ndx;
+ int return_type, has_indexed;
+ CSOfield_info *fld;
+ char buf[2048];
+ HTFormat format_in = WWW_HTML;
+ HTStream *Target = NULL;
+
+ if (!acceptable_inited)
+ init_acceptable();
+
+ if (!arg)
+ return -3; /* Bad if no name specified */
+ if (!*arg)
+ return -2; /* Bad if name had zero length */
+ CTRACE((tfp, "HTLoadCSO: Looking for %s\n", arg));
+
+ /*
+ * Set up a socket to the server for the data.
+ */
+ status = HTDoConnect(arg, "cso", CSO_PORT, &s);
+ if (status == HT_INTERRUPTED) {
+ /*
+ * Interrupt cleanly.
+ */
+ CTRACE((tfp,
+ "HTLoadCSO: Interrupted on connect; recovering cleanly.\n"));
+ _HTProgress(CONNECTION_INTERRUPTED);
+ return HT_NOT_LOADED;
+ }
+ if (status < 0) {
+ CTRACE((tfp, "HTLoadCSO: Unable to connect to remote host for `%s'.\n",
+ arg));
+ return HTInetStatus("connect");
+ }
+
+ HTInitInput(s); /* Set up input buffering */
+
+ HTBprintf(&command, "fields%c%c", CR, LF);
+ if (TRACE) {
+ CTRACE((tfp, "HTLoadCSO: Connected, writing command `"));
+ trace_bstring(command);
+ CTRACE((tfp, "' to socket %d\n", s));
+ }
+ _HTProgress(GOPHER_SENDING_CSO_REQUEST);
+ status = (int) NETWRITE(s, BStrData(command), BStrLen(command));
+ BStrFree(command);
+ if (status < 0) {
+ CTRACE((tfp, "HTLoadCSO: Unable to send command.\n"));
+ return HTInetStatus("send");
+ }
+ _HTProgress(GOPHER_SENT_CSO_REQUEST);
+
+ /*
+ * Now read the data from the socket.
+ */
+ status = parse_cso_fields(buf, sizeof(buf));
+ if (status) {
+ NETCLOSE(s);
+ if (status == HT_INTERRUPTED) {
+ _HTProgress(CONNECTION_INTERRUPTED);
+ } else if (buf[0] != '\0') {
+ HTAlert(buf);
+ } else {
+ HTAlert(FAILED_NO_RESPONSE);
+ }
+ return HT_NOT_LOADED;
+ }
+ Target = HTStreamStack(format_in,
+ format_out,
+ sink, anAnchor);
+ if (Target == NULL) {
+ char *temp = 0;
+
+ HTSprintf0(&temp, CANNOT_CONVERT_I_TO_O,
+ HTAtom_name(format_in), HTAtom_name(format_out));
+ HTAlert(temp);
+ FREE(temp);
+ NETCLOSE(s);
+ return HT_NOT_LOADED;
+ }
+ host = HTParse(arg, "", PARSE_HOST);
+ if ((cp = HTParsePort(host, &port)) != NULL) {
+ if (port == CSO_PORT) {
+ *cp = '\0';
+ }
+ }
+ anAnchor->safe = TRUE;
+ if (isBEmpty(anAnchor->post_data)) {
+ generate_cso_form(host, port, buf, sizeof(buf), Target);
+ (*Target->isa->_free) (Target);
+ FREE(host);
+ NETCLOSE(s);
+ free_CSOfields();
+ return HT_LOADED;
+ }
+
+ HTBprintf(&command,
+ "<HTML>\n<HEAD>\n<TITLE>CSO/PH Results on %s</TITLE>\n</HEAD>\n<BODY>\n",
+ host);
+ (*Target->isa->put_block) (Target, BStrData(command), BStrLen(command));
+ BStrFree(command);
+ FREE(host);
+
+ BStrCopy(content, anAnchor->post_data);
+ assert(content != NULL);
+
+ if (BStrData(content)[BStrLen(content) - 1] != '&')
+ BStrCat0(content, "&");
+
+ data = BStrData(content);
+ len = BStrLen(content);
+ for (i = 0; i < len; i++) {
+ if (data[i] == '+') {
+ data[i] = ' ';
+ }
+ }
+
+ data = BStrData(content);
+ HTUnEscape(data); /* FIXME: could it have embedded null? */
+ len = BStrLen(content);
+
+ return_type = 0;
+ has_indexed = 0;
+ start = 0;
+ for (i = 0; i < len; i++) {
+ if (!data[i] || data[i] == '&') {
+ /*
+ * Value parsed. Unescape characters and look for first '=' to
+ * delimit field name from value.
+ */
+ flen = i - start;
+ finish = start + flen;
+ data[finish] = '\0';
+ for (j = start; j < finish; j++) {
+ if (data[j] == '=') {
+ /*
+ * data[start..j-1] is field name,
+ * [j+1..finish-1] is value.
+ */
+ if ((data[start + 1] == '_') &&
+ ((data[start] == 'r') || (data[start] == 'q'))) {
+ /*
+ * Decode fields number and lookup field info.
+ */
+ sscanf(&data[start + 2], "%d=", &ndx);
+ for (fld = CSOfields; fld; fld = fld->next) {
+ if (ndx == fld->id) {
+ if ((j + 1) >= finish)
+ break; /* ignore nulls */
+ if (data[start] == 'q') {
+ /*
+ * Append field to query line.
+ */
+ if (fld->lookup) {
+ if (fld->indexed)
+ has_indexed = 1;
+ if (isBEmpty(command)) {
+ BStrCopy0(command, "query ");
+ } else {
+ BStrCat0(command, " ");
+ }
+ HTBprintf(&command, "%s=\"%s\"",
+ fld->name, &data[j + 1]);
+ } else {
+ strcpy(buf,
+ "Warning: non-lookup field ignored<BR>\n");
+ (*Target->isa->put_block) (Target,
+ buf,
+ (int)
+ strlen(buf));
+ }
+ } else if (data[start] == 'r') {
+ fld->explicit_return = 1;
+ }
+ break;
+ }
+ }
+ } else if (!StrNCmp(&data[start], "return=", 7)) {
+ if (!strcmp(&data[start + 7], "all")) {
+ return_type = 1;
+ } else if (!strcmp(&data[start + 7], "selected")) {
+ return_type = 2;
+ }
+ }
+ }
+ }
+ start = i + 1;
+ }
+ }
+ BStrFree(content);
+ if (isBEmpty(command) || !has_indexed) {
+ NETCLOSE(s);
+ strcpy(buf,
+ "<EM>Error:</EM> At least one indexed field value must be specified!\n");
+ (*Target->isa->put_block) (Target, buf, (int) strlen(buf));
+ strcpy(buf, "</BODY>\n</HTML>\n");
+ (*Target->isa->put_block) (Target, buf, (int) strlen(buf));
+ (*Target->isa->_free) (Target);
+ free_CSOfields();
+ BStrFree(command);
+ return HT_LOADED;
+ }
+ /*
+ * Append return fields.
+ */
+ if (return_type == 1) {
+ BStrCat0(command, " return all");
+ } else if (return_type == 2) {
+ BStrCat0(command, " return");
+ for (fld = CSOfields; fld; fld = fld->next) {
+ if (fld->explicit_return) {
+ HTBprintf(&command, " %s", fld->name);
+ }
+ }
+ }
+ HTBprintf(&command, "%c%c", CR, LF);
+ strcpy(buf, "<H2>\n<EM>CSO/PH command:</EM> ");
+ (*Target->isa->put_block) (Target, buf, (int) strlen(buf));
+ (*Target->isa->put_block) (Target, BStrData(command), BStrLen(command));
+ strcpy(buf, "</H2>\n");
+ (*Target->isa->put_block) (Target, buf, (int) strlen(buf));
+ if (TRACE) {
+ CTRACE((tfp, "HTLoadCSO: Writing command `"));
+ trace_bstring(command);
+ CTRACE((tfp, "' to socket %d\n", s));
+ }
+ status = (int) NETWRITE(s, BStrData(command), BStrLen(command));
+ BStrFree(command);
+ if (status < 0) {
+ CTRACE((tfp, "HTLoadCSO: Unable to send command.\n"));
+ free_CSOfields();
+ return HTInetStatus("send");
+ }
+ generate_cso_report(Target);
+ NETCLOSE(s);
+ (*Target->isa->put_block) (Target, end_form, (int) sizeof(end_form) - 1);
+ (*Target->isa->_free) (Target);
+ FREE(host);
+ free_CSOfields();
+ return HT_LOADED;
+}
+
+static char *link_to_URL(const char *arg)
+{
+ char *result;
+ char *next;
+ char *temp = 0;
+
+ StrAllocCopy(temp, arg);
+ HTUnEscape(temp);
+ result = temp;
+
+ /* skip past method://host */
+ if ((next = strstr(result, "://")) != 0) {
+ result = next + 3;
+ }
+ if ((next = strchr(result, '/')) != 0) {
+ result = next + 1;
+ }
+ /* check if the selector is the special html one */
+ if (!strncmp(result, "hURL:", (size_t) 5)) {
+ result += 5;
+ next = result;
+ result = temp;
+ while ((*temp++ = *next++) != 0) ;
+ } else {
+ FREE(temp);
+ result = 0;
+ }
+ return result;
+}
+
+/* Load by name. HTLoadGopher
+ * =============
+ *
+ */
+static int HTLoadGopher(const char *arg,
+ HTParentAnchor *anAnchor,
+ HTFormat format_out,
+ HTStream *sink)
+{
+ char *hURL;
+ char *command; /* The whole command */
+ int status; /* tcp return */
+ char gtype; /* Gopher Node type */
+ char *selector; /* Selector string */
+
+ if (!acceptable_inited)
+ init_acceptable();
+
+ if (!arg)
+ return -3; /* Bad if no name specified */
+ if (!*arg)
+ return -2; /* Bad if name had zero length */
+ CTRACE((tfp, "HTGopher: Looking for %s\n", arg));
+
+ /*
+ * If it's a port 105 GOPHER_CSO gtype with no ISINDEX token ('?'), use the
+ * form-based CSO gateway (otherwise, return an ISINDEX cover page or do
+ * the ISINDEX search). - FM
+ */
+ {
+ size_t len;
+
+ if ((len = strlen(arg)) > 5) {
+ if (0 == strcmp((const char *) &arg[len - 6], ":105/2")) {
+ /* Use CSO gateway. */
+ CTRACE((tfp, "HTGopher: Passing to CSO/PH gateway.\n"));
+ return HTLoadCSO(arg, anAnchor, format_out, sink);
+ }
+ }
+ }
+
+ /*
+ * If it's a port 79/0[/...] URL, use the finger gateway. - FM
+ */
+ if (strstr(arg, ":79/0") != NULL) {
+#ifndef DISABLE_FINGER
+ CTRACE((tfp, "HTGopher: Passing to finger gateway.\n"));
+ return HTLoadFinger(arg, anAnchor, format_out, sink);
+#else /* finger is disabled */
+ HTAlert(COULD_NOT_ACCESS_DOCUMENT);
+ return HT_NOT_LOADED;
+#endif /* DISABLE_FINGER */
+ }
+
+ /*
+ * Get entity type, and selector string.
+ */
+ {
+ char *p1 = HTParse(arg, "", PARSE_PATH | PARSE_PUNCTUATION);
+
+ gtype = '1'; /* Default = menu */
+ selector = p1;
+ if ((*selector++ == '/') && (*selector)) { /* Skip first slash */
+ gtype = *selector++; /* Pick up gtype */
+ }
+ if (gtype == GOPHER_INDEX) {
+ char *query;
+
+ /*
+ * Search is allowed.
+ */
+ HTAnchor_setIndex(anAnchor, anAnchor->address);
+ query = StrChr(selector, '?'); /* Look for search string */
+ if (!query || !query[1]) { /* No search required */
+ target = HTML_new(anAnchor, format_out, sink);
+ targetClass = *target->isa;
+ display_index(arg, anAnchor); /* Display "cover page" */
+ return HT_LOADED; /* Local function only */
+ }
+ *query++ = '\0'; /* Skip '?' */
+ command =
+ (char *) malloc(strlen(selector) + 1 + strlen(query) + 2 + 1);
+ if (command == NULL)
+ outofmem(__FILE__, "HTLoadGopher");
+
+ de_escape(command, selector); /* Bug fix TBL 921208 */
+
+ strcat(command, "\t");
+
+ { /* Remove plus signs 921006 */
+ char *p;
+
+ for (p = query; *p; p++) {
+ if (*p == '+')
+ *p = ' ';
+ }
+ }
+
+ de_escape(&command[strlen(command)], query); /* bug fix LJM 940415 */
+ } else if (gtype == GOPHER_CSO) {
+ char *query;
+
+ /*
+ * Search is allowed.
+ */
+ query = StrChr(selector, '?'); /* Look for search string */
+ if (!query || !query[1]) { /* No search required */
+ target = HTML_new(anAnchor, format_out, sink);
+ targetClass = *target->isa;
+ display_cso(arg, anAnchor); /* Display "cover page" */
+ return HT_LOADED; /* Local function only */
+ }
+ HTAnchor_setIndex(anAnchor, anAnchor->address);
+ *query++ = '\0'; /* Skip '?' */
+ command = (char *) malloc(strlen("query") + 1 +
+ strlen(query) + 2 + 1);
+ if (command == NULL)
+ outofmem(__FILE__, "HTLoadGopher");
+
+ de_escape(command, selector); /* Bug fix TBL 921208 */
+
+ strcpy(command, "query ");
+
+ { /* Remove plus signs 921006 */
+ char *p;
+
+ for (p = query; *p; p++) {
+ if (*p == '+')
+ *p = ' ';
+ }
+ }
+ de_escape(&command[strlen(command)], query); /* bug fix LJM 940415 */
+
+ } else { /* Not index */
+ command = (char *) malloc(strlen(selector) + 2 + 1);
+ if (command == NULL)
+ outofmem(__FILE__, "HTLoadGopher");
+
+ de_escape(command, selector);
+ }
+ FREE(p1);
+ }
+
+ {
+ char *p = command + strlen(command);
+
+ *p++ = CR; /* Macros to be correct on Mac */
+ *p++ = LF;
+ *p = '\0';
+ }
+ /*
+ * Check for link to URL
+ */
+ if ((hURL = link_to_URL(arg)) != 0) {
+ CTRACE((tfp, "gopher found link to URL '%s'\n", hURL));
+ free(hURL);
+ }
+
+ /*
+ * Set up a socket to the server for the data.
+ */
+ status = HTDoConnect(arg, "gopher", GOPHER_PORT, &s);
+ if (status == HT_INTERRUPTED) {
+ /*
+ * Interrupt cleanly.
+ */
+ CTRACE((tfp, "HTGopher: Interrupted on connect; recovering cleanly.\n"));
+ _HTProgress(CONNECTION_INTERRUPTED);
+ FREE(command);
+ return HT_NOT_LOADED;
+ }
+ if (status < 0) {
+ CTRACE((tfp, "HTGopher: Unable to connect to remote host for `%s'.\n",
+ arg));
+ FREE(command);
+ return HTInetStatus("connect");
+ }
+
+ HTInitInput(s); /* Set up input buffering */
+
+ CTRACE((tfp, "HTGopher: Connected, writing command `%s' to socket %d\n",
+ command, s));
+
+#ifdef NOT_ASCII
+ {
+ char *p;
+
+ for (p = command; *p; p++) {
+ *p = TOASCII(*p);
+ }
+ }
+#endif
+
+ _HTProgress(GOPHER_SENDING_REQUEST);
+
+ status = (int) NETWRITE(s, command, (int) strlen(command));
+ FREE(command);
+ if (status < 0) {
+ CTRACE((tfp, "HTGopher: Unable to send command.\n"));
+ return HTInetStatus("send");
+ }
+
+ _HTProgress(GOPHER_SENT_REQUEST);
+
+ /*
+ * Now read the data from the socket.
+ */
+ switch (gtype) {
+
+ case GOPHER_TEXT:
+ HTParseSocket(WWW_PLAINTEXT, format_out, anAnchor, s, sink);
+ break;
+
+ case GOPHER_HTML:
+ case GOPHER_CHTML:
+ HTParseSocket(WWW_HTML, format_out, anAnchor, s, sink);
+ break;
+
+ case GOPHER_GIF:
+ case GOPHER_IMAGE:
+ case GOPHER_PLUS_IMAGE:
+ HTParseSocket(HTAtom_for("image/gif"),
+ format_out, anAnchor, s, sink);
+ break;
+
+ case GOPHER_MENU:
+ case GOPHER_INDEX:
+ target = HTML_new(anAnchor, format_out, sink);
+ targetClass = *target->isa;
+ parse_menu(arg, anAnchor);
+ break;
+
+ case GOPHER_CSO:
+ target = HTML_new(anAnchor, format_out, sink);
+ targetClass = *target->isa;
+ parse_cso(arg, anAnchor);
+ break;
+
+ case GOPHER_SOUND:
+ case GOPHER_PLUS_SOUND:
+ HTParseSocket(WWW_AUDIO, format_out, anAnchor, s, sink);
+ break;
+
+ case GOPHER_PLUS_MOVIE:
+ HTParseSocket(HTAtom_for("video/mpeg"), format_out, anAnchor, s, sink);
+ break;
+
+ case GOPHER_PLUS_PDF:
+ HTParseSocket(HTAtom_for("application/pdf"), format_out, anAnchor,
+ s, sink);
+ break;
+
+ default:
+ {
+ HTAtom *encoding = 0;
+ const char *desc = 0;
+ HTFormat format = HTFileFormat(arg, &encoding, &desc);
+
+ /*
+ * Ignore WWW_BINARY (since that is returned by HTFileFormat when
+ * it does not have a representation), but otherwise use the
+ * result.
+ */
+ if (format != WWW_BINARY) {
+ HTParseSocket(format, format_out, anAnchor, s, sink);
+ break;
+ }
+ }
+ /* FALL-THRU */
+
+ case GOPHER_MACBINHEX:
+ case GOPHER_PCBINARY:
+ case GOPHER_UUENCODED:
+ case GOPHER_BINARY:
+ /*
+ * Specifying WWW_UNKNOWN forces dump to local disk.
+ */
+ HTParseSocket(WWW_UNKNOWN, format_out, anAnchor, s, sink);
+ break;
+
+ } /* switch(gtype) */
+
+ NETCLOSE(s);
+ return HT_LOADED;
+}
+
+#ifdef GLOBALDEF_IS_MACRO
+#define _HTGOPHER_C_1_INIT { "gopher", HTLoadGopher, NULL }
+GLOBALDEF(HTProtocol, HTGopher, _HTGOPHER_C_1_INIT);
+#define _HTCSO_C_1_INIT { "cso", HTLoadCSO, NULL }
+GLOBALDEF(HTProtocol, HTCSO, _HTCSO_C_1_INIT);
+#else
+GLOBALDEF HTProtocol HTGopher =
+{"gopher", HTLoadGopher, NULL};
+GLOBALDEF HTProtocol HTCSO =
+{"cso", HTLoadCSO, NULL};
+#endif /* GLOBALDEF_IS_MACRO */
+
+#endif /* not DISABLE_GOPHER */
diff --git a/WWW/Library/Implementation/HTGopher.h b/WWW/Library/Implementation/HTGopher.h
new file mode 100644
index 0000000..667fc24
--- /dev/null
+++ b/WWW/Library/Implementation/HTGopher.h
@@ -0,0 +1,29 @@
+/* Gopher protocol module for libwww
+ GOPHER ACCESS
+
+ HISTORY:
+
+ 8 Jan 92 Adapted from HTTP TBL
+
+ */
+
+#ifndef HTGOPHER_H
+#define HTGOPHER_H
+
+#include <HTAccess.h>
+#include <HTAnchor.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#ifdef GLOBALREF_IS_MACRO
+ extern GLOBALREF (HTProtocol, HTGopher);
+
+#else
+ GLOBALREF HTProtocol HTGopher;
+#endif /* GLOBALREF_IS_MACRO */
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* HTGOPHER_H */
diff --git a/WWW/Library/Implementation/HTGroup.c b/WWW/Library/Implementation/HTGroup.c
new file mode 100644
index 0000000..42d55dc
--- /dev/null
+++ b/WWW/Library/Implementation/HTGroup.c
@@ -0,0 +1,758 @@
+/* MODULE HTGroup.c
+ * GROUP FILE ROUTINES
+ *
+ * Contains group file parser and routines to match IP
+ * address templates and to find out group membership.
+ *
+ *
+ * AUTHORS:
+ * AL Ari Luotonen luotonen@dxcern.cern.ch
+ *
+ * HISTORY:
+ *
+ *
+ * BUGS:
+ *
+ *
+ *
+ * GROUP DEFINITION GRAMMAR:
+ *
+ * string = "sequence of alphanumeric characters"
+ * user_name ::= string
+ * group_name ::= string
+ * group_ref ::= group_name
+ * user_def ::= user_name | group_ref
+ * user_def_list ::= user_def { ',' user_def }
+ * user_part = user_def | '(' user_def_list ')'
+ *
+ * templ = "sequence of alphanumeric characters and '*'s"
+ * ip_number_mask ::= templ '.' templ '.' templ '.' templ
+ * domain_name_mask ::= templ { '.' templ }
+ * address ::= ip_number_mask | domain_name_mask
+ * address_def ::= address
+ * address_def_list ::= address_def { ',' address_def }
+ * address_part = address_def | '(' address_def_list ')'
+ *
+ * item ::= [user_part] ['@' address_part]
+ * item_list ::= item { ',' item }
+ * group_def ::= item_list
+ * group_decl ::= group_name ':' group_def
+ *
+ */
+
+#include <HTUtils.h>
+
+#include <HTAAUtil.h>
+#include <HTLex.h> /* Lexical analysor */
+#include <HTGroup.h> /* Implemented here */
+
+#include <LYUtils.h>
+#include <LYLeaks.h>
+
+/*
+ * Group file parser
+ */
+
+typedef HTList UserDefList;
+typedef HTList AddressDefList;
+
+typedef struct {
+ UserDefList *user_def_list;
+ AddressDefList *address_def_list;
+} Item;
+
+typedef struct {
+ char *name;
+ GroupDef *translation;
+} Ref;
+
+static void syntax_error(FILE *fp, const char *msg,
+ LexItem lex_item)
+{
+ char buffer[41];
+ int cnt = 0;
+ int ch;
+
+ while ((ch = getc(fp)) != EOF && ch != '\n')
+ if (cnt < 40)
+ buffer[cnt++] = (char) ch;
+ buffer[cnt] = (char) 0;
+
+ CTRACE((tfp, "%s %d before: '%s'\nHTGroup.c: %s (got %s)\n",
+ "HTGroup.c: Syntax error in rule file at line",
+ HTlex_line, buffer, msg, lex_verbose(lex_item)));
+ HTlex_line++;
+}
+
+static AddressDefList *parse_address_part(FILE *fp)
+{
+ AddressDefList *address_def_list = NULL;
+ LexItem lex_item;
+ BOOL only_one = NO;
+
+ lex_item = lex(fp);
+ if (lex_item == LEX_ALPH_STR || lex_item == LEX_TMPL_STR)
+ only_one = YES;
+ else if (lex_item != LEX_OPEN_PAREN ||
+ ((lex_item = lex(fp)) != LEX_ALPH_STR &&
+ lex_item != LEX_TMPL_STR)) {
+ syntax_error(fp, "Expecting a single address or '(' beginning list",
+ lex_item);
+ return NULL;
+ }
+ address_def_list = HTList_new();
+
+ for (;;) {
+ Ref *ref = typecalloc(Ref);
+
+ if (ref == NULL)
+ outofmem(__FILE__, "parse_address_part");
+
+ ref->name = NULL;
+ ref->translation = NULL;
+ StrAllocCopy(ref->name, HTlex_buffer);
+
+ HTList_addObject(address_def_list, (void *) ref);
+
+ if (only_one || (lex_item = lex(fp)) != LEX_ITEM_SEP)
+ break;
+ /*
+ * Here lex_item == LEX_ITEM_SEP; after item separator it
+ * is ok to have one or more newlines (LEX_REC_SEP) and
+ * they are ignored (continuation line).
+ */
+ do {
+ lex_item = lex(fp);
+ } while (lex_item == LEX_REC_SEP);
+
+ if (lex_item != LEX_ALPH_STR && lex_item != LEX_TMPL_STR) {
+ syntax_error(fp, "Expecting an address template", lex_item);
+ HTList_delete(address_def_list);
+ address_def_list = NULL;
+ return NULL;
+ }
+ }
+
+ if (!only_one && lex_item != LEX_CLOSE_PAREN) {
+ HTList_delete(address_def_list);
+ address_def_list = NULL;
+ syntax_error(fp, "Expecting ')' closing address list", lex_item);
+ return NULL;
+ }
+ return address_def_list;
+}
+
+static UserDefList *parse_user_part(FILE *fp)
+{
+ UserDefList *user_def_list = NULL;
+ LexItem lex_item;
+ BOOL only_one = NO;
+
+ lex_item = lex(fp);
+ if (lex_item == LEX_ALPH_STR)
+ only_one = YES;
+ else if (lex_item != LEX_OPEN_PAREN ||
+ (lex_item = lex(fp)) != LEX_ALPH_STR) {
+ syntax_error(fp, "Expecting a single name or '(' beginning list",
+ lex_item);
+ return NULL;
+ }
+ user_def_list = HTList_new();
+
+ for (;;) {
+ Ref *ref = typecalloc(Ref);
+
+ if (ref == NULL)
+ outofmem(__FILE__, "parse_user_part");
+
+ ref->name = NULL;
+ ref->translation = NULL;
+ StrAllocCopy(ref->name, HTlex_buffer);
+
+ HTList_addObject(user_def_list, (void *) ref);
+
+ if (only_one || (lex_item = lex(fp)) != LEX_ITEM_SEP)
+ break;
+ /*
+ * Here lex_item == LEX_ITEM_SEP; after item separator it
+ * is ok to have one or more newlines (LEX_REC_SEP) and
+ * they are ignored (continuation line).
+ */
+ do {
+ lex_item = lex(fp);
+ } while (lex_item == LEX_REC_SEP);
+
+ if (lex_item != LEX_ALPH_STR) {
+ syntax_error(fp, "Expecting user or group name", lex_item);
+ HTList_delete(user_def_list);
+ user_def_list = NULL;
+ return NULL;
+ }
+ }
+
+ if (!only_one && lex_item != LEX_CLOSE_PAREN) {
+ HTList_delete(user_def_list);
+ user_def_list = NULL;
+ syntax_error(fp, "Expecting ')' closing user/group list", lex_item);
+ return NULL;
+ }
+ return user_def_list;
+}
+
+static Item *parse_item(FILE *fp)
+{
+ Item *item = NULL;
+ UserDefList *user_def_list = NULL;
+ AddressDefList *address_def_list = NULL;
+ LexItem lex_item;
+
+ lex_item = lex(fp);
+ if (lex_item == LEX_ALPH_STR || lex_item == LEX_OPEN_PAREN) {
+ unlex(lex_item);
+ user_def_list = parse_user_part(fp);
+ lex_item = lex(fp);
+ }
+
+ if (lex_item == LEX_AT_SIGN) {
+ lex_item = lex(fp);
+ if (lex_item == LEX_ALPH_STR || lex_item == LEX_TMPL_STR ||
+ lex_item == LEX_OPEN_PAREN) {
+ unlex(lex_item);
+ address_def_list = parse_address_part(fp);
+ } else {
+ if (user_def_list) {
+ HTList_delete(user_def_list); /* @@@@ */
+ user_def_list = NULL;
+ }
+ syntax_error(fp, "Expected address part (single address or list)",
+ lex_item);
+ return NULL;
+ }
+ } else
+ unlex(lex_item);
+
+ if (!user_def_list && !address_def_list) {
+ syntax_error(fp, "Empty item not allowed", lex_item);
+ return NULL;
+ }
+ item = typecalloc(Item);
+ if (item == NULL)
+ outofmem(__FILE__, "parse_item");
+
+ item->user_def_list = user_def_list;
+ item->address_def_list = address_def_list;
+ return item;
+}
+
+static ItemList *parse_item_list(FILE *fp)
+{
+ ItemList *item_list = HTList_new();
+ Item *item;
+ LexItem lex_item;
+
+ for (;;) {
+ if (!(item = parse_item(fp))) {
+ HTList_delete(item_list); /* @@@@ */
+ item_list = NULL;
+ return NULL;
+ }
+ HTList_addObject(item_list, (void *) item);
+ lex_item = lex(fp);
+ if (lex_item != LEX_ITEM_SEP) {
+ unlex(lex_item);
+ return item_list;
+ }
+ /*
+ * Here lex_item == LEX_ITEM_SEP; after item separator it
+ * is ok to have one or more newlines (LEX_REC_SEP) and
+ * they are ignored (continuation line).
+ */
+ do {
+ lex_item = lex(fp);
+ } while (lex_item == LEX_REC_SEP);
+ unlex(lex_item);
+ }
+}
+
+GroupDef *HTAA_parseGroupDef(FILE *fp)
+{
+ ItemList *item_list = NULL;
+ GroupDef *group_def = NULL;
+ LexItem lex_item;
+
+ if (!(item_list = parse_item_list(fp))) {
+ return NULL;
+ }
+ group_def = typecalloc(GroupDef);
+ if (group_def == NULL)
+ outofmem(__FILE__, "HTAA_parseGroupDef");
+
+ group_def->group_name = NULL;
+ group_def->item_list = item_list;
+
+ if ((lex_item = lex(fp)) != LEX_REC_SEP) {
+ syntax_error(fp, "Garbage after group definition", lex_item);
+ }
+
+ return group_def;
+}
+
+#if 0
+static GroupDef *parse_group_decl(FILE *fp)
+{
+ char *group_name = NULL;
+ GroupDef *group_def = NULL;
+ LexItem lex_item;
+
+ do {
+ lex_item = lex(fp);
+ } while (lex_item == LEX_REC_SEP); /* Ignore empty lines */
+
+ if (lex_item != LEX_ALPH_STR) {
+ if (lex_item != LEX_EOF)
+ syntax_error(fp, "Expecting group name", lex_item);
+ return NULL;
+ }
+ StrAllocCopy(group_name, HTlex_buffer);
+
+ if (LEX_FIELD_SEP != (lex_item = lex(fp))) {
+ syntax_error(fp, "Expecting field separator", lex_item);
+ FREE(group_name);
+ return NULL;
+ }
+
+ if (!(group_def = HTAA_parseGroupDef(fp))) {
+ FREE(group_name);
+ return NULL;
+ }
+ group_def->group_name = group_name;
+
+ return group_def;
+}
+
+/*
+ * Group manipulation routines
+ */
+
+static GroupDef *find_group_def(GroupDefList *group_list,
+ const char *group_name)
+{
+ if (group_list && group_name) {
+ GroupDefList *cur = group_list;
+ GroupDef *group_def;
+
+ while (NULL != (group_def = (GroupDef *) HTList_nextObject(cur))) {
+ if (!strcmp(group_name, group_def->group_name)) {
+ return group_def;
+ }
+ }
+ }
+ return NULL;
+}
+
+void HTAA_resolveGroupReferences(GroupDef *group_def,
+ GroupDefList *group_def_list)
+{
+ if (group_def && group_def->item_list && group_def_list) {
+ ItemList *cur1 = group_def->item_list;
+ Item *item;
+
+ while (NULL != (item = (Item *) HTList_nextObject(cur1))) {
+ UserDefList *cur2 = item->user_def_list;
+ Ref *ref;
+
+ while (NULL != (ref = (Ref *) HTList_nextObject(cur2)))
+ ref->translation = find_group_def(group_def_list, ref->name);
+
+ /* Does NOT translate address_def_list */
+ }
+ }
+}
+
+static void add_group_def(GroupDefList *group_def_list,
+ GroupDef *group_def)
+{
+ HTAA_resolveGroupReferences(group_def, group_def_list);
+ HTList_addObject(group_def_list, (void *) group_def);
+}
+
+static GroupDefList *parse_group_file(FILE *fp)
+{
+ GroupDefList *group_def_list = HTList_new();
+ GroupDef *group_def;
+
+ while (NULL != (group_def = parse_group_decl(fp)))
+ add_group_def(group_def_list, group_def);
+
+ return group_def_list;
+}
+#endif
+
+/*
+ * Trace functions
+ */
+
+static void print_item(Item *item)
+{
+ if (!item)
+ fprintf(tfp, "\tNULL-ITEM\n");
+ else {
+ UserDefList *cur1 = item->user_def_list;
+ AddressDefList *cur2 = item->address_def_list;
+ Ref *user_ref = (Ref *) HTList_nextObject(cur1);
+ Ref *addr_ref = (Ref *) HTList_nextObject(cur2);
+
+ if (user_ref) {
+ fprintf(tfp, "\t[%s%s", user_ref->name,
+ (user_ref->translation ? "*REF*" : ""));
+ while (NULL != (user_ref = (Ref *) HTList_nextObject(cur1)))
+ fprintf(tfp, "; %s%s", user_ref->name,
+ (user_ref->translation ? "*REF*" : ""));
+ fprintf(tfp, "] ");
+ } else
+ fprintf(tfp, "\tANYBODY ");
+
+ if (addr_ref) {
+ fprintf(tfp, "@ [%s", addr_ref->name);
+ while (NULL != (addr_ref = (Ref *) HTList_nextObject(cur2)))
+ fprintf(tfp, "; %s", addr_ref->name);
+ fprintf(tfp, "]\n");
+ } else
+ fprintf(tfp, "@ ANYADDRESS\n");
+ }
+}
+
+static void print_item_list(ItemList *item_list)
+{
+ ItemList *cur = item_list;
+ Item *item;
+
+ if (!item_list)
+ fprintf(tfp, "EMPTY");
+ else
+ while (NULL != (item = (Item *) HTList_nextObject(cur)))
+ print_item(item);
+}
+
+void HTAA_printGroupDef(GroupDef *group_def)
+{
+ if (!group_def) {
+ fprintf(tfp, "\nNULL RECORD\n");
+ return;
+ }
+
+ fprintf(tfp, "\nGroup %s:\n",
+ (group_def->group_name ? group_def->group_name : "NULL"));
+
+ print_item_list(group_def->item_list);
+ fprintf(tfp, "\n");
+}
+
+#if 0
+static void print_group_def_list(GroupDefList *group_list)
+{
+ GroupDefList *cur = group_list;
+ GroupDef *group_def;
+
+ while (NULL != (group_def = (GroupDef *) HTList_nextObject(cur)))
+ HTAA_printGroupDef(group_def);
+}
+
+/*
+ * IP address template matching
+ */
+
+/* static part_match()
+ * MATCH ONE PART OF INET ADDRESS AGAINST
+ * A PART OF MASK (inet address has 4 parts)
+ * ON ENTRY:
+ * tcur pointer to the beginning of template part.
+ * icur pointer to the beginning of actual inet
+ * number part.
+ *
+ * ON EXIT:
+ * returns YES, if match.
+ */
+static BOOL part_match(const char *tcur,
+ const char *icur)
+{
+ char required[4];
+ char actual[4];
+ const char *cur;
+ int cnt;
+ BOOL status;
+
+ if (!tcur || !icur)
+ return NO;
+
+ cur = tcur;
+ cnt = 0;
+ while (cnt < 3 && *cur && *cur != '.')
+ required[cnt++] = *(cur++);
+ required[cnt] = (char) 0;
+
+ cur = icur;
+ cnt = 0;
+ while (cnt < 3 && *cur && *cur != '.')
+ actual[cnt++] = *(cur++);
+ actual[cnt] = (char) 0;
+
+ status = HTAA_templateMatch(required, actual);
+ CTRACE((tfp, "part_match: req: '%s' act: '%s' match: %s\n",
+ required, actual, (status ? "yes" : "no")));
+
+ return status;
+}
+
+/* static ip_number_match()
+ * MATCH INET NUMBER AGAINST AN INET NUMBER MASK
+ * ON ENTRY:
+ * template mask to match against, e.g., 128.141.*.*
+ * the_inet_addr actual inet address, e.g., 128.141.201.74
+ *
+ * ON EXIT:
+ * returns YES, if match; NO, if not.
+ */
+static BOOL ip_number_match(const char *ctemplate,
+ const char *the_inet_addr)
+{
+ const char *tcur = ctemplate;
+ const char *icur = the_inet_addr;
+ int cnt;
+
+ for (cnt = 0; cnt < 4; cnt++) {
+ if (!tcur || !icur || !part_match(tcur, icur))
+ return NO;
+ if (NULL != (tcur = StrChr(tcur, '.')))
+ tcur++;
+ if (NULL != (icur = StrChr(icur, '.')))
+ icur++;
+ }
+ return YES;
+}
+
+/* static is_domain_mask()
+ * DETERMINE IF A GIVEN MASK IS A
+ * DOMAIN NAME MASK OR AN INET NUMBER MASK
+ * ON ENTRY:
+ * mask either a domain name mask,
+ * e.g.
+ * *.cern.ch
+ *
+ * or an inet number mask,
+ * e.g.
+ * 128.141.*.*
+ *
+ * ON EXIT:
+ * returns YES, if mask is a domain name mask.
+ * NO, if it is an inet number mask.
+ */
+static BOOL is_domain_mask(const char *mask)
+{
+ const char *cur = mask;
+
+ if (!mask)
+ return NO;
+
+ while (*cur) {
+ if (*cur != '.' && *cur != '*' && (*cur < '0' || *cur > '9'))
+ return YES; /* Even one non-digit makes it a domain name mask */
+ cur++;
+ }
+ return NO; /* All digits and dots, so it is an inet number mask */
+}
+
+/* static ip_mask_match()
+ * MATCH AN IP NUMBER MASK OR IP NAME MASK
+ * AGAINST ACTUAL IP NUMBER OR IP NAME
+ *
+ * ON ENTRY:
+ * mask mask. Mask may be either an inet number
+ * mask or a domain name mask,
+ * e.g.
+ * 128.141.*.*
+ * or
+ * *.cern.ch
+ *
+ * ip_number IP number of connecting host.
+ * ip_name IP name of the connecting host.
+ *
+ * ON EXIT:
+ * returns YES, if hostname/internet number
+ * matches the mask.
+ * NO, if no match (no fire).
+ */
+static BOOL ip_mask_match(const char *mask,
+ const char *ip_number,
+ const char *ip_name)
+{
+ if (mask && (ip_number || ip_name)) {
+ if (is_domain_mask(mask)) {
+ if (HTAA_templateMatch(mask, ip_name))
+ return YES;
+ } else {
+ if (ip_number_match(mask, ip_number))
+ return YES;
+ }
+ }
+ return NO;
+}
+
+static BOOL ip_in_def_list(AddressDefList *address_def_list,
+ char *ip_number,
+ char *ip_name)
+{
+ if (address_def_list && (ip_number || ip_name)) {
+ AddressDefList *cur = address_def_list;
+ Ref *ref;
+
+ while (NULL != (ref = (Ref *) HTList_nextObject(cur))) {
+ /* Value of ref->translation is ignored, i.e., */
+ /* no recursion for ip address tamplates. */
+ if (ip_mask_match(ref->name, ip_number, ip_name))
+ return YES;
+ }
+ }
+ return NO;
+}
+
+/*
+ * Group file cached reading
+ */
+
+typedef struct {
+ char *group_filename;
+ GroupDefList *group_list;
+} GroupCache;
+
+typedef HTList GroupCacheList;
+
+static GroupCacheList *group_cache_list = NULL;
+
+GroupDefList *HTAA_readGroupFile(const char *filename)
+{
+ FILE *fp;
+ GroupCache *group_cache;
+
+ if (isEmpty(filename))
+ return NULL;
+
+ if (!group_cache_list)
+ group_cache_list = HTList_new();
+ else {
+ GroupCacheList *cur = group_cache_list;
+
+ while (NULL != (group_cache = (GroupCache *) HTList_nextObject(cur))) {
+ if (!strcmp(filename, group_cache->group_filename)) {
+ CTRACE((tfp, "%s '%s' %s\n",
+ "HTAA_readGroupFile: group file",
+ filename, "already found in cache"));
+ return group_cache->group_list;
+ } /* if cache match */
+ } /* while cached files remain */
+ } /* cache exists */
+
+ CTRACE((tfp, "HTAA_readGroupFile: reading group file `%s'\n",
+ filename));
+
+ if (!(fp = fopen(filename, TXT_R))) {
+ CTRACE((tfp, "%s '%s'\n",
+ "HTAA_readGroupFile: unable to open group file",
+ filename));
+ return NULL;
+ }
+
+ if ((group_cache = typecalloc(GroupCache)) == 0)
+ outofmem(__FILE__, "HTAA_readGroupFile");
+
+ group_cache->group_filename = NULL;
+ StrAllocCopy(group_cache->group_filename, filename);
+ group_cache->group_list = parse_group_file(fp);
+ HTList_addObject(group_cache_list, (void *) group_cache);
+ fclose(fp);
+
+ CTRACE((tfp, "Read group file '%s', results follow:\n", filename));
+ if (TRACE)
+ print_group_def_list(group_cache->group_list);
+
+ return group_cache->group_list;
+}
+
+/* PUBLIC HTAA_userAndInetInGroup()
+ * CHECK IF USER BELONGS TO TO A GIVEN GROUP
+ * AND THAT THE CONNECTION COMES FROM AN
+ * ADDRESS THAT IS ALLOWED BY THAT GROUP
+ * ON ENTRY:
+ * group the group definition structure.
+ * username connecting user.
+ * ip_number browser host IP number, optional.
+ * ip_name browser host IP name, optional.
+ * However, one of ip_number or ip_name
+ * must be given.
+ * ON EXIT:
+ * returns HTAA_IP_MASK, if IP address mask was
+ * reason for failing.
+ * HTAA_NOT_MEMBER, if user does not belong
+ * to the group.
+ * HTAA_OK if both IP address and user are ok.
+ */
+HTAAFailReasonType HTAA_userAndInetInGroup(GroupDef *group,
+ char *username,
+ char *ip_number,
+ char *ip_name)
+{
+ HTAAFailReasonType reason = HTAA_NOT_MEMBER;
+
+ if (group && username) {
+ ItemList *cur1 = group->item_list;
+ Item *item;
+
+ while (NULL != (item = (Item *) HTList_nextObject(cur1))) {
+ if (!item->address_def_list || /* Any address allowed */
+ ip_in_def_list(item->address_def_list, ip_number, ip_name)) {
+
+ if (!item->user_def_list) /* Any user allowed */
+ return HTAA_OK;
+ else {
+ UserDefList *cur2 = item->user_def_list;
+ Ref *ref;
+
+ while (NULL != (ref = (Ref *) HTList_nextObject(cur2))) {
+
+ if (ref->translation) { /* Group, check recursively */
+ reason = HTAA_userAndInetInGroup(ref->translation,
+ username,
+ ip_number, ip_name);
+ if (reason == HTAA_OK)
+ return HTAA_OK;
+ } else { /* Username, check directly */
+ if (username && *username &&
+ 0 == strcmp(ref->name, username))
+ return HTAA_OK;
+ }
+ /* Every user/group name in this group */
+ }
+ /* search for username */
+ }
+ /* IP address ok */
+ } else {
+ reason = HTAA_IP_MASK;
+ }
+ } /* while items in group */
+ }
+ /* valid parameters */
+ return reason; /* No match, or invalid parameters */
+}
+
+void GroupDef_delete(GroupDef *group_def)
+{
+ if (group_def) {
+ FREE(group_def->group_name);
+ if (group_def->item_list) {
+ HTList_delete(group_def->item_list); /* @@@@ */
+ group_def->item_list = NULL;
+ }
+ FREE(group_def);
+ }
+}
+#endif
diff --git a/WWW/Library/Implementation/HTGroup.h b/WWW/Library/Implementation/HTGroup.h
new file mode 100644
index 0000000..7874565
--- /dev/null
+++ b/WWW/Library/Implementation/HTGroup.h
@@ -0,0 +1,182 @@
+/* GROUP FILE ROUTINES
+
+ */
+
+#ifndef HTGROUP_H
+#define HTGROUP_H
+
+#include <HTList.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ typedef HTList GroupDefList;
+ typedef HTList ItemList;
+
+ typedef struct {
+ char *group_name;
+ ItemList *item_list;
+ } GroupDef;
+
+/*
+ * Access Authorization failure reasons
+ */
+ typedef enum {
+ HTAA_OK, /* 200 OK */
+ HTAA_OK_GATEWAY, /* 200 OK, acting as a gateway */
+ HTAA_NO_AUTH, /* 401 Unauthorized, not authenticated */
+ HTAA_NOT_MEMBER, /* 401 Unauthorized, not authorized */
+ HTAA_IP_MASK, /* 403 Forbidden by IP mask */
+ HTAA_BY_RULE, /* 403 Forbidden by rule */
+ HTAA_NO_ACL, /* 403 Forbidden, ACL non-existent */
+ HTAA_NO_ENTRY, /* 403 Forbidden, no ACL entry */
+ HTAA_SETUP_ERROR, /* 403 Forbidden, server setup error */
+ HTAA_DOTDOT, /* 403 Forbidden, URL with /../ illegal */
+ HTAA_HTBIN, /* 403 Forbidden, /htbin not enabled */
+ HTAA_NOT_FOUND /* 404 Not found, or read protected */
+ } HTAAFailReasonType;
+
+/*
+
+Group definition grammar
+
+ string
+ "sequence of alphanumeric characters"
+
+ user_name
+ string
+
+ group_name
+ string
+
+ group_ref
+ group_name
+
+ user_def
+ user_name | group_ref
+
+ user_def_list
+ user_def { ',' user_def }
+
+ user_part
+ user_def | '(' user_def_list ')'
+
+ templ
+
+ "sequence of alphanumeric characters and '*'s"
+
+ ip_number_mask
+ templ '.' templ '.' templ '.' templ
+
+ domain_name_mask
+ templ { '.' templ }
+
+ address
+
+ ip_number_mask | domain_name_mask
+
+ address_def
+
+ address
+
+ address_def_list
+ address_def { ',' address_def }
+
+ address_part
+ address_def | '(' address_def_list ')'
+
+ item
+ [user_part] ['@' address_part]
+
+ item_list
+ item { ',' item }
+
+ group_def
+ item_list
+
+ group_decl
+ group_name ':' group_def
+
+ PARSE GROUP DEFINITION
+
+ */
+
+ extern GroupDef *HTAA_parseGroupDef(FILE *fp);
+
+/*
+
+Fill in Pointers to referenced Group Definitions in a Group Definition
+
+ References to groups (by their name) are resolved from group_def_list and pointers to
+ those structures are added to group_def.
+
+ */
+
+ extern void HTAA_resolveGroupReferences(GroupDef *group_def,
+ GroupDefList *group_def_list);
+
+/*
+
+Read Group File (and do caching)
+
+ If group file is already in cache returns a pointer to previously read group definition
+ list.
+
+ */
+
+ extern GroupDefList *HTAA_readGroupFile(const char *filename);
+
+/*
+
+Delete Group Definition
+
+ Groups in cache should never be freed by this function. This should only be used to
+ free group definitions read by HTAA_parseGroupDef.
+
+ */
+
+ extern void GroupDef_delete(GroupDef *group_def);
+
+/*
+
+Print Out Group Definition (for trace purposes)
+
+ */
+
+ extern void HTAA_printGroupDef(GroupDef *group_def);
+
+/*
+
+Does a User Belong to a Given Set of Groups
+
+ This function checks both the username and the internet address.
+
+ */
+
+/* PUBLIC HTAA_userAndInetInGroup()
+ * CHECK IF USER BELONGS TO TO A GIVEN GROUP
+ * AND THAT THE CONNECTION COMES FROM AN
+ * ADDRESS THAT IS ALLOWED BY THAT GROUP
+ * ON ENTRY:
+ * group the group definition structure.
+ * username connecting user.
+ * ip_number browser host IP number, optional.
+ * ip_name browser host IP name, optional.
+ * However, one of ip_number or ip_name
+ * must be given.
+ * ON EXIT:
+ * returns HTAA_IP_MASK, if IP address mask was
+ * reason for failing.
+ * HTAA_NOT_MEMBER, if user does not belong
+ * to the group.
+ * HTAA_OK if both IP address and user are ok.
+ */
+ extern HTAAFailReasonType HTAA_userAndInetInGroup(GroupDef *group,
+ char *username,
+ char *ip_number,
+ char *ip_name);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* not HTGROUP_H */
diff --git a/WWW/Library/Implementation/HTInit.h b/WWW/Library/Implementation/HTInit.h
new file mode 100644
index 0000000..4fc7000
--- /dev/null
+++ b/WWW/Library/Implementation/HTInit.h
@@ -0,0 +1,34 @@
+/* /Net/dxcern/userd/timbl/hypertext/WWW/Library/Implementation/HTInit.html
+ INITIALISATION MODULE
+
+ This module registers all the plug & play software modules which will be
+ used in the program. This is for a browser.
+
+ To override this, just copy it and link in your version before you link with
+ the library.
+
+ Implemented by HTInit.c by default.
+
+ */
+
+#ifndef HTINIT_H
+#define HTINIT_H 1
+
+#ifndef HTUTILS_H
+#include <HTUtils.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ extern void HTFormatInit(void);
+ extern void HTPreparsedFormatInit(void);
+ extern void HTFileInit(void);
+ extern int LYTestMailcapCommand(const char *testcommand, const char *params);
+ extern BOOL LYMailcapUsesPctS(const char *controlstring);
+ extern char *LYMakeMailcapCommand(const char *command, const char *params, const char *filename);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* HTINIT_H */
diff --git a/WWW/Library/Implementation/HTLex.c b/WWW/Library/Implementation/HTLex.c
new file mode 100644
index 0000000..5a0df91
--- /dev/null
+++ b/WWW/Library/Implementation/HTLex.c
@@ -0,0 +1,142 @@
+
+/* MODULE HTLex.c
+ * LEXICAL ANALYSOR
+ *
+ * AUTHORS:
+ * AL Ari Luotonen luotonen@dxcern.cern.ch
+ *
+ * HISTORY:
+ *
+ *
+ * BUGS:
+ *
+ *
+ */
+
+#include <HTUtils.h>
+
+#include <HTLex.h> /* Implemented here */
+
+#include <LYLeaks.h>
+
+/*
+ * Global variables
+ */
+char HTlex_buffer[40]; /* Read lexical string */
+int HTlex_line = 1; /* Line number in source file */
+
+/*
+ * Module-wide variables
+ */
+static int lex_cnt;
+static BOOL lex_template;
+static LexItem lex_pushed_back = LEX_NONE;
+static FILE *cache = NULL;
+
+void unlex(LexItem lex_item)
+{
+ lex_pushed_back = lex_item;
+}
+
+LexItem lex(FILE *fp)
+{
+ int ch = 0;
+
+ if (fp != cache) { /* This cache doesn't work ok because the system */
+ cache = fp; /* often assign same FILE structure the next open */
+ HTlex_line = 1; /* file. So, if there are syntax errors in setup *
+ files it may confuse things later on. */
+ }
+ if (lex_pushed_back != LEX_NONE) {
+ LexItem ret = lex_pushed_back;
+
+ lex_pushed_back = LEX_NONE;
+ return ret;
+ }
+
+ lex_cnt = 0;
+ lex_template = NO;
+
+ for (;;) {
+ switch (ch = getc(fp)) {
+ case EOF:
+ case ' ':
+ case '\t':
+ case '\r':
+ case '\n':
+ case ':':
+ case ',':
+ case '(':
+ case ')':
+ case '@':
+ if (lex_cnt > 0) {
+ if (ch != EOF)
+ ungetc(ch, fp);
+ if (lex_template)
+ return LEX_TMPL_STR;
+ else
+ return LEX_ALPH_STR;
+ } else
+ switch (ch) {
+ case EOF:
+ return LEX_EOF;
+ case '\n':
+ HTlex_line++;
+ return LEX_REC_SEP;
+ case ':':
+ return LEX_FIELD_SEP;
+ case ',':
+ return LEX_ITEM_SEP;
+ case '(':
+ return LEX_OPEN_PAREN;
+ case ')':
+ return LEX_CLOSE_PAREN;
+ case '@':
+ return LEX_AT_SIGN;
+ default: /* Leading white space ignored (SP,TAB,CR) */
+ break;
+ }
+ break;
+ default:
+ if (lex_cnt < (int) (sizeof(HTlex_buffer) - 1))
+ HTlex_buffer[lex_cnt++] = (char) ch;
+ HTlex_buffer[lex_cnt] = '\0';
+ if ('*' == ch)
+ lex_template = YES;
+ } /* switch ch */
+ } /* forever */
+}
+
+const char *lex_verbose(LexItem lex_item)
+{
+ static char msg[sizeof(HTlex_buffer) + 30]; /* @@@@@@@@ */
+
+ switch (lex_item) {
+ case LEX_NONE: /* Internally used */
+ return "NO-LEX-ITEM";
+ case LEX_EOF: /* End of file */
+ return "end-of-file";
+ case LEX_REC_SEP: /* Record separator */
+ return "record separator (newline)";
+ case LEX_FIELD_SEP: /* Field separator */
+ return "field separator ':'";
+ case LEX_ITEM_SEP: /* List item separator */
+ return "item separator ','";
+ case LEX_OPEN_PAREN: /* Group start tag */
+ return "'('";
+ case LEX_CLOSE_PAREN: /* Group end tag */
+ return "')'";
+ case LEX_AT_SIGN: /* Address qualifier */
+ return "address qualifier '@'";
+ case LEX_ALPH_STR: /* Alphanumeric string */
+ sprintf(msg, "alphanumeric string '%.*s'",
+ (int) sizeof(HTlex_buffer), HTlex_buffer);
+ return msg;
+ case LEX_TMPL_STR: /* Template string */
+ sprintf(msg, "template string '%.*s'",
+ (int) sizeof(HTlex_buffer), HTlex_buffer);
+ return msg;
+ default:
+ return "UNKNOWN-LEX-ITEM";
+ }
+}
diff --git a/WWW/Library/Implementation/HTLex.h b/WWW/Library/Implementation/HTLex.h
new file mode 100644
index 0000000..fde9034
--- /dev/null
+++ b/WWW/Library/Implementation/HTLex.h
@@ -0,0 +1,64 @@
+/* LEXICAL ANALYSOR (MAINLY FOR CONFIG FILES)
+
+ */
+
+#ifndef HTLEX_H
+#define HTLEX_H
+
+#ifndef HTUTILS_H
+#include <HTUtils.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ typedef enum {
+ LEX_NONE, /* Internally used */
+ LEX_EOF, /* End of file */
+ LEX_REC_SEP, /* Record separator */
+ LEX_FIELD_SEP, /* Field separator */
+ LEX_ITEM_SEP, /* List item separator */
+ LEX_OPEN_PAREN, /* Group start tag */
+ LEX_CLOSE_PAREN, /* Group end tag */
+ LEX_AT_SIGN, /* Address qualifier */
+ LEX_ALPH_STR, /* Alphanumeric string */
+ LEX_TMPL_STR /* Template string */
+ } LexItem;
+
+ extern char HTlex_buffer[]; /* Read lexical string */
+ extern int HTlex_line; /* Line number in source file */
+
+/*
+
+Get Next Lexical Item
+
+ If returns LEX_ALPH_STR or LEX_TMPL_STR the string is in global buffer lex_buffer.
+
+ */
+
+ extern LexItem lex(FILE *fp);
+
+/*
+
+Push Back Latest Item
+
+ */
+
+ extern void unlex(LexItem lex_item);
+
+/*
+
+Get the Name for Lexical Item
+
+ */
+
+ extern const char *lex_verbose(LexItem lex_item);
+
+/*
+
+ */
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* not HTLEX_H */
diff --git a/WWW/Library/Implementation/HTList.c b/WWW/Library/Implementation/HTList.c
new file mode 100644
index 0000000..d12cd38
--- /dev/null
+++ b/WWW/Library/Implementation/HTList.c
@@ -0,0 +1,402 @@
+/*
+ * $LynxId: HTList.c,v 1.20 2016/11/24 15:29:50 tom Exp $
+ *
+ * A small List class HTList.c
+ * ==================
+ *
+ * A list is represented as a sequence of linked nodes of type HTList.
+ * The first node is a header which contains no object.
+ * New nodes are inserted between the header and the rest of the list.
+ */
+
+#include <HTUtils.h>
+#include <HTList.h>
+
+#include <LYLeaks.h>
+
+/* Create list.
+*/
+HTList *HTList_new(void)
+{
+ HTList *newList;
+
+ if ((newList = typeMalloc(HTList)) == NULL)
+ outofmem(__FILE__, "HTList_new");
+
+ newList->object = NULL;
+ newList->next = NULL;
+
+ return newList;
+}
+
+/* Delete list.
+*/
+void HTList_delete(HTList *me)
+{
+ HTList *current;
+
+ while ((current = me)) {
+ me = me->next;
+ FREE(current);
+ }
+
+ return;
+}
+
+/* Reverse order of elements in list.
+ */
+HTList *HTList_reverse(HTList *start)
+{
+ HTList *cur, *succ;
+
+ if (!(start && start->next && (cur = start->next->next)))
+ return start;
+ start->next->next = NULL;
+ while (cur) {
+ succ = cur->next;
+ cur->next = start->next;
+ start->next = cur;
+ cur = succ;
+ }
+ return start;
+}
+
+/* Append a list to another.
+ *
+ * If successful, the second list will become empty but not freed.
+ */
+HTList *HTList_appendList(HTList *start,
+ HTList *tail)
+{
+ HTList *temp = start;
+
+ if (!start) {
+ CTRACE((tfp,
+ "HTList: Trying to append list %p to a nonexisting list\n",
+ (void *) tail));
+ return NULL;
+ }
+ if (!(tail && tail->next))
+ return start;
+
+ while (temp->next)
+ temp = temp->next;
+
+ temp->next = tail->next;
+ tail->next = NULL; /* tail is now an empty list */
+ return start;
+}
+
+/* Link object to START of list (so it is pointed to by the head).
+ *
+ * Unlike HTList_addObject(), it does not malloc memory for HTList entry,
+ * it use already allocated memory which should not be free'd by any
+ * list operations (optimization).
+ */
+void HTList_linkObject(HTList *me, void *newObject,
+ HTList *newNode)
+{
+ if (me) {
+ if (newNode->object == NULL && newNode->next == NULL) {
+ /* It is safe: */
+ newNode->object = newObject;
+ newNode->next = me->next;
+ me->next = newNode;
+
+ } else {
+ /*
+ * This node is already linked to some list (probably this one), so
+ * refuse changing node pointers to keep the list valid!!!
+ */
+ CTRACE((tfp, "*** HTList: Refuse linking already linked obj "));
+ CTRACE((tfp, "%p, node %p, list %p\n",
+ (void *) newObject, (void *) newNode, (void *) me));
+ }
+
+ } else {
+ CTRACE((tfp,
+ "HTList: Trying to link object %p to a nonexisting list\n",
+ newObject));
+ }
+
+ return;
+}
+
+/* Add object to START of list (so it is pointed to by the head).
+*/
+void HTList_addObject(HTList *me, void *newObject)
+{
+ HTList *newNode;
+
+ if (me) {
+ if ((newNode = typeMalloc(HTList)) == NULL)
+ outofmem(__FILE__, "HTList_addObject");
+
+ newNode->object = newObject;
+ newNode->next = me->next;
+ me->next = newNode;
+
+ } else {
+ CTRACE((tfp, "HTList: Trying to add object %p to a nonexisting list\n",
+ newObject));
+ }
+
+ return;
+}
+
+/* Append object to END of list (furthest from the head).
+*/
+void HTList_appendObject(HTList *me, void *newObject)
+{
+ HTList *temp = me;
+
+ if (temp && newObject) {
+ while (temp->next)
+ temp = temp->next;
+ HTList_addObject(temp, newObject);
+ }
+
+ return;
+}
+
+/* Insert an object into the list at a specified position.
+ * If position is 0, this places the object at the head of the list
+ * and is equivalent to HTList_addObject().
+ */
+void HTList_insertObjectAt(HTList *me, void *newObject,
+ int pos)
+{
+ HTList *newNode;
+ HTList *temp = me;
+ HTList *prevNode;
+ int Pos = pos;
+
+ if (!temp) {
+ CTRACE((tfp, "HTList: Trying to add object %p to a nonexisting list\n",
+ newObject));
+ return;
+ }
+ if (Pos < 0) {
+ Pos = 0;
+ CTRACE((tfp, "HTList: Treating negative object position %d as %d.\n",
+ pos, Pos));
+ }
+
+ prevNode = temp;
+ while ((temp = temp->next)) {
+ if (Pos == 0) {
+ if ((newNode = typeMalloc(HTList)) == NULL)
+ outofmem(__FILE__, "HTList_addObjectAt");
+
+ newNode->object = newObject;
+ newNode->next = temp;
+ if (prevNode)
+ prevNode->next = newNode;
+ return;
+ }
+ prevNode = temp;
+ Pos--;
+ }
+ if (Pos >= 0)
+ HTList_addObject(prevNode, newObject);
+
+ return;
+}
+
+/* Unlink specified object from list.
+ * It does not free memory.
+ */
+BOOL HTList_unlinkObject(HTList *me, void *oldObject)
+{
+ HTList *temp = me;
+ HTList *prevNode;
+
+ if (temp && oldObject) {
+ while (temp->next) {
+ prevNode = temp;
+ temp = temp->next;
+ if (temp->object == oldObject) {
+ prevNode->next = temp->next;
+ temp->next = NULL;
+ temp->object = NULL;
+ return YES; /* Success */
+ }
+ }
+ }
+ return NO; /* object not found or NULL list */
+}
+
+/* Remove specified object from list.
+*/
+BOOL HTList_removeObject(HTList *me, void *oldObject)
+{
+ HTList *temp = me;
+ HTList *prevNode;
+
+ if (temp && oldObject) {
+ while (temp->next) {
+ prevNode = temp;
+ temp = temp->next;
+ if (temp->object == oldObject) {
+ prevNode->next = temp->next;
+ FREE(temp);
+ return YES; /* Success */
+ }
+ }
+ }
+ return NO; /* object not found or NULL list */
+}
+
+/* Remove object at a given position in the list, where 0 is the
+ * object pointed to by the head (returns a pointer to the element
+ * (->object) for the object, and NULL if the list is empty, or
+ * if it doesn't exist - Yuk!).
+ */
+void *HTList_removeObjectAt(HTList *me, int position)
+{
+ HTList *temp = me;
+ HTList *prevNode;
+ int pos = position;
+ void *result = NULL;
+
+ if (temp != NULL && pos >= 0) {
+ prevNode = temp;
+ while ((temp = temp->next) != NULL) {
+ if (pos == 0) {
+ prevNode->next = temp->next;
+ result = temp->object;
+ FREE(temp);
+ break;
+ }
+ prevNode = temp;
+ pos--;
+ }
+ }
+
+ return result;
+}
+
+/* Unlink object from START of list (the Last one inserted
+ * via HTList_linkObject(), and pointed to by the head).
+ * It does not free memory.
+ */
+void *HTList_unlinkLastObject(HTList *me)
+{
+ HTList *lastNode;
+ void *lastObject;
+
+ if (me && me->next) {
+ lastNode = me->next;
+ lastObject = lastNode->object;
+ me->next = lastNode->next;
+ lastNode->next = NULL;
+ lastNode->object = NULL;
+ return lastObject;
+
+ } else { /* Empty list */
+ return NULL;
+ }
+}
+
+/* Remove object from START of list (the Last one inserted
+ * via HTList_addObject(), and pointed to by the head).
+ */
+void *HTList_removeLastObject(HTList *me)
+{
+ HTList *lastNode;
+ void *lastObject;
+
+ if (me && me->next) {
+ lastNode = me->next;
+ lastObject = lastNode->object;
+ me->next = lastNode->next;
+ FREE(lastNode);
+ return lastObject;
+
+ } else { /* Empty list */
+ return NULL;
+ }
+}
+
+/* Remove object from END of list (the First one inserted
+ * via HTList_addObject(), and furthest from the head).
+ */
+void *HTList_removeFirstObject(HTList *me)
+{
+ HTList *temp = me;
+ HTList *prevNode;
+ void *firstObject;
+
+ if (!temp)
+ return NULL;
+
+ prevNode = temp;
+ if (temp->next) {
+ while (temp->next) {
+ prevNode = temp;
+ temp = temp->next;
+ }
+ firstObject = temp->object;
+ prevNode->next = NULL;
+ FREE(temp);
+ return firstObject;
+
+ } else { /* Empty list */
+ return NULL;
+ }
+}
+
+/* Determine total number of objects in the list,
+ * not counting the head.
+ */
+int HTList_count(HTList *me)
+{
+ HTList *temp = me;
+ int count = 0;
+
+ if (temp)
+ while ((temp = temp->next))
+ count++;
+
+ return count;
+}
+
+/* Determine position of an object in the list (a value of 0
+ * means it is pointed to by the head; returns -1 if not found).
+ */
+int HTList_indexOf(HTList *me, void *object)
+{
+ HTList *temp = me;
+ int position = 0;
+
+ if (temp) {
+ while ((temp = temp->next)) {
+ if (temp->object == object)
+ return position;
+ position++;
+ }
+ }
+
+ return -1; /* Object not in the list */
+}
+
+/* Return pointer to the object at a specified position in the list,
+ * where 0 is the object pointed to by the head (returns NULL if
+ * the list is empty, or if it doesn't exist - Yuk!).
+ */
+void *HTList_objectAt(HTList *me, int position)
+{
+ HTList *temp = me;
+ int pos = position;
+
+ if (!temp || pos < 0)
+ return NULL;
+
+ while ((temp = temp->next)) {
+ if (pos == 0)
+ return temp->object;
+ pos--;
+ }
+
+ return NULL; /* Reached the end of the list */
+}
diff --git a/WWW/Library/Implementation/HTList.h b/WWW/Library/Implementation/HTList.h
new file mode 100644
index 0000000..93f9147
--- /dev/null
+++ b/WWW/Library/Implementation/HTList.h
@@ -0,0 +1,142 @@
+
+/* List object
+ *
+ * The list object is a generic container for storing collections
+ * of things in order.
+ */
+#ifndef HTLIST_H
+#define HTLIST_H
+
+#ifndef HTUTILS_H
+#include <HTUtils.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ typedef struct _HTList HTList;
+
+ struct _HTList {
+ void *object;
+ HTList *next;
+ };
+
+/* Fast macro to traverse a list. Call it first with copy of the list
+ * header. It returns the first object and increments the passed list
+ * pointer. Call it with the same variable until it returns NULL.
+ */
+#define HTList_nextObject(me) \
+ ((me) && ((me) = (me)->next) ? (me)->object : NULL)
+
+/* Macro to find object pointed to by the head (returns NULL
+ * if list is empty, OR if it doesn't exist - Yuk!)
+ */
+#define HTList_lastObject(me) \
+ ((me) && (me)->next ? (me)->next->object : NULL)
+
+/* Macro to check if a list is empty (or doesn't exist - Yuk!)
+*/
+#define HTList_isEmpty(me) ((me) ? ((me)->next == NULL) : YES)
+
+/* Create list.
+*/
+ extern HTList *HTList_new(void);
+
+/* Delete list.
+*/
+ extern void HTList_delete(HTList *me);
+
+/* Reverse a list.
+*/
+ extern HTList *HTList_reverse(HTList *start);
+
+/* Append two lists, making second list empty.
+*/
+ extern HTList *HTList_appendList(HTList *start,
+ HTList *tail);
+
+/* Add object to START of list (so it is pointed to by the head).
+*/
+ extern void HTList_addObject(HTList *me,
+ void *newObject);
+
+/* Append object to END of list (furthest from the head).
+*/
+ extern void HTList_appendObject(HTList *me,
+ void *newObject);
+
+/* Insert an object into the list at a specified position.
+ * If position is 0, this places the object at the head of the list
+ * and is equivalent to HTList_addObject().
+ */
+ extern void HTList_insertObjectAt(HTList *me,
+ void *newObject,
+ int pos);
+
+/* Remove specified object from list.
+*/
+ extern BOOL HTList_removeObject(HTList *me,
+ void *oldObject);
+
+/* Remove object at a given position in the list, where 0 is the
+ * object pointed to by the head (returns a pointer to the element
+ * (->object) for the object, and NULL if the list is empty, or
+ * if it doesn't exist - Yuk!).
+ */
+ extern void *HTList_removeObjectAt(HTList *me,
+ int position);
+
+/* Remove object from START of list (the Last one inserted
+ * via HTList_addObject(), and pointed to by the head).
+ */
+ extern void *HTList_removeLastObject(HTList *me);
+
+/* Remove object from END of list (the First one inserted
+ * via HTList_addObject(), and furthest from the head).
+ */
+ extern void *HTList_removeFirstObject(HTList *me);
+
+/* Determine total number of objects in the list,
+ * not counting the head.
+ */
+ extern int HTList_count(HTList *me);
+
+/* Determine position of an object in the list (a value of 0
+ * means it is pointed to by the head; returns -1 if not found).
+ */
+ extern int HTList_indexOf(HTList *me,
+ void *object);
+
+/* Return pointer to the object at a specified position in the list,
+ * where 0 is the object pointed to by the head (returns NULL if
+ * the list is empty, or if it doesn't exist - Yuk!).
+ */
+ extern void *HTList_objectAt(HTList *me,
+ int position);
+
+/* Link object to START of list (so it is pointed to by the head).
+ *
+ * Unlike HTList_addObject(), it does not malloc memory for HTList entry,
+ * it use already allocated memory which should not be free'd by any
+ * list operations (optimization).
+ */
+ extern void HTList_linkObject(HTList *me,
+ void *newObject,
+ HTList *newNode);
+
+/* Unlink object from START of list (the Last one inserted
+ * via HTList_linkObject(), and pointed to by the head).
+ * It does not free memory.
+ */
+ extern void *HTList_unlinkLastObject(HTList *me);
+
+/* Unlink specified object from list.
+ * It does not free memory.
+ */
+ extern BOOL HTList_unlinkObject(HTList *me,
+ void *oldObject);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* HTLIST_H */
diff --git a/WWW/Library/Implementation/HTMIME.c b/WWW/Library/Implementation/HTMIME.c
new file mode 100644
index 0000000..fde89a6
--- /dev/null
+++ b/WWW/Library/Implementation/HTMIME.c
@@ -0,0 +1,2594 @@
+/*
+ * $LynxId: HTMIME.c,v 1.102 2022/03/12 14:47:02 tom Exp $
+ *
+ * MIME Message Parse HTMIME.c
+ * ==================
+ *
+ * This is RFC 1341-specific code.
+ * The input stream pushed into this parser is assumed to be
+ * stripped on CRs, ie lines end with LF, not CR LF.
+ * (It is easy to change this except for the body part where
+ * conversion can be slow.)
+ *
+ * History:
+ * Feb 92 Written Tim Berners-Lee, CERN
+ *
+ */
+
+#define HTSTREAM_INTERNAL 1
+
+#include <HTUtils.h>
+#include <HTMIME.h> /* Implemented here */
+#include <HTTP.h> /* for redirecting_url */
+#include <HTAlert.h>
+#include <HTFile.h>
+#include <HTCJK.h>
+#include <UCMap.h>
+#include <UCDefs.h>
+#include <UCAux.h>
+
+#include <LYCookie.h>
+#include <LYCharSets.h>
+#include <LYCharUtils.h>
+#include <LYStrings.h>
+#include <LYUtils.h>
+#include <LYGlobalDefs.h>
+#include <LYLeaks.h>
+
+/* MIME Object
+ * -----------
+ */
+
+typedef enum {
+ MIME_TRANSPARENT, /* put straight through to target ASAP! */
+ /* states for "Transfer-Encoding: chunked" */
+ MIME_CHUNKED,
+ mcCHUNKED_COUNT_DIGIT,
+ mcCHUNKED_COUNT_CR,
+ mcCHUNKED_COUNT_LF,
+ mcCHUNKED_EXTENSION,
+ mcCHUNKED_DATA,
+ mcCHUNKED_DATA_CR,
+ mcCHUNKED_DATA_LF,
+ /* character state-machine */
+ miBEGINNING_OF_LINE, /* first character and not a continuation */
+ miA,
+ miACCEPT_RANGES,
+ miAGE,
+ miAL,
+ miALLOW,
+ miALTERNATES,
+ miC,
+ miCACHE_CONTROL,
+ miCO,
+ miCOOKIE,
+ miCON,
+ miCONNECTION,
+ miCONTENT_,
+ miCONTENT_BASE,
+ miCONTENT_DISPOSITION,
+ miCONTENT_ENCODING,
+ miCONTENT_FEATURES,
+ miCONTENT_L,
+ miCONTENT_LANGUAGE,
+ miCONTENT_LENGTH,
+ miCONTENT_LOCATION,
+ miCONTENT_MD5,
+ miCONTENT_RANGE,
+ miCONTENT_T,
+ miCONTENT_TRANSFER_ENCODING,
+ miCONTENT_TYPE,
+ miDATE,
+ miE,
+ miETAG,
+ miEXPIRES,
+ miKEEP_ALIVE,
+ miL,
+ miLAST_MODIFIED,
+ miLINK,
+ miLOCATION,
+ miP,
+ miPR,
+ miPRAGMA,
+ miPROXY_AUTHENTICATE,
+ miPUBLIC,
+ miR,
+ miRE,
+ miREFRESH,
+ miRETRY_AFTER,
+ miS,
+ miSAFE,
+ miSE,
+ miSERVER,
+ miSET_COOKIE,
+ miSET_COOKIE1,
+ miSET_COOKIE2,
+ miT,
+ miTITLE,
+ miTRANSFER_ENCODING,
+ miU,
+ miUPGRADE,
+ miURI,
+ miV,
+ miVARY,
+ miVIA,
+ miW,
+ miWARNING,
+ miWWW_AUTHENTICATE,
+ miSKIP_GET_VALUE, /* Skip space then get value */
+ miGET_VALUE, /* Get value till white space */
+ miJUNK_LINE, /* Ignore the rest of this folded line */
+ miNEWLINE, /* Just found a LF .. maybe continuation */
+ miCHECK, /* check against check_pointer */
+ MIME_NET_ASCII, /* Translate from net ascii */
+ MIME_IGNORE /* Ignore entire file */
+ /* TRANSPARENT and IGNORE are defined as stg else in _WINDOWS */
+} MIME_state;
+
+#define VALUE_SIZE 5120 /* @@@@@@@ Arbitrary? */
+struct _HTStream {
+ const HTStreamClass *isa;
+
+ BOOL net_ascii; /* Is input net ascii? */
+ MIME_state state; /* current state */
+ MIME_state if_ok; /* got this state if match */
+ MIME_state field; /* remember which field */
+ MIME_state fold_state; /* state on a fold */
+ BOOL head_only; /* only parsing header */
+ BOOL pickup_redirection; /* parsing for location */
+ BOOL no_streamstack; /* use sink directly */
+ const char *check_pointer; /* checking input */
+
+ char *value_pointer; /* storing values */
+ char value[VALUE_SIZE];
+
+ HTParentAnchor *anchor; /* Given on creation */
+ HTStream *sink; /* Given on creation */
+
+ char *boundary; /* For multipart */
+ char *set_cookie; /* Set-Cookie */
+ char *set_cookie2; /* Set-Cookie2 */
+ char *location; /* Location */
+
+ char *refresh_url; /* "Refresh:" URL */
+
+ HTFormat c_t_encoding; /* Content-Transfer-Encoding */
+ char *compression_encoding;
+
+ BOOL chunked_encoding; /* Transfer-Encoding: chunked */
+ long chunked_size; /* ...counter for "chunked" */
+
+ HTFormat format; /* Content-Type */
+ HTStream *target; /* While writing out */
+ HTStreamClass targetClass;
+
+ HTAtom *targetRep; /* Converting into? */
+};
+
+/*
+ * This function is for trimming off any paired
+ * open- and close-double quotes from header values.
+ * It does not parse the string for embedded quotes,
+ * and will not modify the string unless both the
+ * first and last characters are double-quotes. - FM
+ */
+void HTMIME_TrimDoubleQuotes(char *value)
+{
+ size_t i;
+ char *cp = value;
+
+ if (isEmpty(cp) || *cp != '"')
+ return;
+
+ i = strlen(cp);
+ if (cp[(i - 1)] != '"')
+ return;
+ else
+ cp[(i - 1)] = '\0';
+
+ for (i = 0; value[i]; i++)
+ value[i] = cp[(i + 1)];
+}
+
+/*
+ * Check if the token from "Content-Encoding" corresponds to a compression
+ * type.
+ */
+static BOOL content_is_compressed(HTStream *me)
+{
+ char *encoding = me->anchor->content_encoding;
+ BOOL result = (BOOL) (HTEncodingToCompressType(encoding) != cftNone);
+
+ CTRACE((tfp, "content is%s compressed\n", result ? "" : " NOT"));
+ return result;
+}
+
+/*
+ * Strip quotes from a refresh-URL.
+ */
+static void dequote(char *url)
+{
+ size_t len;
+
+ len = strlen(url);
+ if (*url == '\'' && len > 1 && url[len - 1] == url[0]) {
+ url[len - 1] = '\0';
+ while ((url[0] = url[1]) != '\0') {
+ ++url;
+ }
+ }
+}
+
+/*
+ * Strip off any compression-suffix from the address and check if the result
+ * looks like one of the presentable suffixes. If so, return the corresponding
+ * MIME type.
+ */
+static const char *UncompressedContentType(HTStream *me, CompressFileType method)
+{
+ const char *result = 0;
+ char *address = me->anchor->address;
+ const char *expected = HTCompressTypeToSuffix(method);
+ const char *actual = strrchr(address, '.');
+
+ /*
+ * We have to ensure the suffix is consistent, to use HTFileFormat().
+ */
+ if (actual != 0 && !strcasecomp(actual, expected)) {
+ HTFormat format;
+ HTAtom *pencoding = 0;
+ const char *description = 0;
+
+ format = HTFileFormat(address, &pencoding, &description);
+ result = HTAtom_name(format);
+ }
+
+ return result;
+}
+
+static int pumpData(HTStream *me)
+{
+ CompressFileType method;
+ const char *new_encoding;
+ const char *new_content;
+
+ CTRACE((tfp, "Begin pumpData\n"));
+ /*
+ * If the content-type says it is compressed, and there is no
+ * content-encoding, check further and see if the address (omitting the
+ * suffix for a compressed type) looks like a type we can present. If so,
+ * rearrange things so we'll present the StreamStack code with the
+ * presentable type, already marked as compressed.
+ */
+ CTRACE((tfp, "...address{%s}\n", me->anchor->address));
+ method = HTContentTypeToCompressType(me->anchor->content_type_params);
+ if (isEmpty(me->anchor->content_encoding))
+ me->anchor->no_content_encoding = TRUE;
+ if ((method != cftNone)
+ && isEmpty(me->anchor->content_encoding)
+ && (new_content = UncompressedContentType(me, method)) != 0) {
+
+ new_encoding = HTCompressTypeToEncoding(method);
+ CTRACE((tfp, "reinterpreting as content-type:%s, encoding:%s\n",
+ new_content, new_encoding));
+
+ StrAllocCopy(me->anchor->content_encoding, new_encoding);
+ FREE(me->compression_encoding);
+ StrAllocCopy(me->compression_encoding, new_encoding);
+
+ LYStrNCpy(me->value, new_content, VALUE_SIZE - 1);
+ StrAllocCopy(me->anchor->content_type_params, me->value);
+ me->format = HTAtom_for(me->value);
+ }
+
+ if (StrChr(HTAtom_name(me->format), ';') != NULL) {
+ char *cp = NULL, *cp1, *cp2, *cp3 = NULL, *cp4;
+
+ CTRACE((tfp, "HTMIME: Extended MIME Content-Type is %s\n",
+ HTAtom_name(me->format)));
+ StrAllocCopy(cp, HTAtom_name(me->format));
+ /*
+ * Note that the Content-Type value was converted
+ * to lower case when we loaded into me->format,
+ * but there may have been a mixed or upper-case
+ * atom, so we'll force lower-casing again. We
+ * also stripped spaces and double-quotes, but
+ * we'll make sure they're still gone from any
+ * charset parameter we check. - FM
+ */
+ LYLowerCase(cp);
+ if ((cp1 = StrChr(cp, ';')) != NULL) {
+ BOOL chartrans_ok = NO;
+
+ if ((cp2 = strstr(cp1, "charset")) != NULL) {
+ int chndl;
+
+ cp2 += 7;
+ while (*cp2 == ' ' || *cp2 == '=' || *cp2 == '"')
+ cp2++;
+ StrAllocCopy(cp3, cp2); /* copy to mutilate more */
+ for (cp4 = cp3; (*cp4 != '\0' && *cp4 != '"' &&
+ *cp4 != ';' && *cp4 != ':' &&
+ !WHITE(*cp4)); cp4++) ; /* do nothing */
+ *cp4 = '\0';
+ cp4 = cp3;
+ chndl = UCGetLYhndl_byMIME(cp3);
+ if (UCCanTranslateFromTo(chndl,
+ current_char_set)) {
+ chartrans_ok = YES;
+ *cp1 = '\0';
+ me->format = HTAtom_for(cp);
+ StrAllocCopy(me->anchor->charset, cp4);
+ HTAnchor_setUCInfoStage(me->anchor, chndl,
+ UCT_STAGE_MIME,
+ UCT_SETBY_MIME);
+ } else if (chndl < 0) { /* got something but we don't
+ recognize it */
+ chndl = UCLYhndl_for_unrec;
+ if (chndl < 0)
+ /*
+ * UCLYhndl_for_unrec not defined :-( fallback to
+ * UCLYhndl_for_unspec which always valid.
+ */
+ chndl = UCLYhndl_for_unspec; /* always >= 0 */
+ if (UCCanTranslateFromTo(chndl,
+ current_char_set)) {
+ chartrans_ok = YES;
+ *cp1 = '\0';
+ me->format = HTAtom_for(cp);
+ HTAnchor_setUCInfoStage(me->anchor, chndl,
+ UCT_STAGE_MIME,
+ UCT_SETBY_DEFAULT);
+ }
+ } else {
+ /*
+ * Something like 'big5' - we cannot translate it, but
+ * the user may still be able to navigate the links.
+ */
+ *cp1 = '\0';
+ me->format = HTAtom_for(cp);
+ StrAllocCopy(me->anchor->charset, cp4);
+ HTAnchor_setUCInfoStage(me->anchor, chndl,
+ UCT_STAGE_MIME,
+ UCT_SETBY_MIME);
+ }
+ if (chartrans_ok) {
+ LYUCcharset *p_in =
+ HTAnchor_getUCInfoStage(me->anchor,
+ UCT_STAGE_MIME);
+ LYUCcharset *p_out =
+ HTAnchor_setUCInfoStage(me->anchor,
+ current_char_set,
+ UCT_STAGE_HTEXT,
+ UCT_SETBY_DEFAULT);
+
+ if (!p_out)
+ /*
+ * Try again.
+ */
+ p_out =
+ HTAnchor_getUCInfoStage(me->anchor,
+ UCT_STAGE_HTEXT);
+
+ if (!strcmp(p_in->MIMEname,
+ "x-transparent")) {
+ HTPassEightBitRaw = TRUE;
+ HTAnchor_setUCInfoStage(me->anchor,
+ HTAnchor_getUCLYhndl(me->anchor,
+ UCT_STAGE_HTEXT),
+ UCT_STAGE_MIME,
+ UCT_SETBY_DEFAULT);
+ }
+ if (!strcmp(p_out->MIMEname,
+ "x-transparent")) {
+ HTPassEightBitRaw = TRUE;
+ HTAnchor_setUCInfoStage(me->anchor,
+ HTAnchor_getUCLYhndl(me->anchor,
+ UCT_STAGE_MIME),
+ UCT_STAGE_HTEXT,
+ UCT_SETBY_DEFAULT);
+ }
+ if ((p_in->enc != UCT_ENC_CJK)
+#ifdef USE_JAPANESEUTF8_SUPPORT
+ && ((p_in->enc != UCT_ENC_UTF8)
+ || (p_out->enc != UCT_ENC_CJK))
+#endif
+ ) {
+ HTCJK = NOCJK;
+ if (!(p_in->codepoints &
+ UCT_CP_SUBSETOF_LAT1) &&
+ chndl == current_char_set) {
+ HTPassEightBitRaw = TRUE;
+ }
+ } else if (p_out->enc == UCT_ENC_CJK) {
+ Set_HTCJK(p_in->MIMEname, p_out->MIMEname);
+ }
+ } else {
+ /*
+ * Cannot translate. If according to some heuristic the
+ * given charset and the current display character both are
+ * likely to be like ISO-8859 in structure, pretend we have
+ * some kind of match.
+ */
+ BOOL given_is_8859 =
+ (BOOL) (!StrNCmp(cp4, "iso-8859-", 9) &&
+ isdigit(UCH(cp4[9])));
+ BOOL given_is_8859like =
+ (BOOL) (given_is_8859 ||
+ !StrNCmp(cp4, "windows-", 8) ||
+ !StrNCmp(cp4, "cp12", 4) ||
+ !StrNCmp(cp4, "cp-12", 5));
+ BOOL given_and_display_8859like =
+ (BOOL) (given_is_8859like &&
+ (strstr(LYchar_set_names[current_char_set],
+ "ISO-8859") ||
+ strstr(LYchar_set_names[current_char_set],
+ "windows-")));
+
+ if (given_and_display_8859like) {
+ *cp1 = '\0';
+ me->format = HTAtom_for(cp);
+ }
+ if (given_is_8859) {
+ cp1 = &cp4[10];
+ while (*cp1 &&
+ isdigit(UCH(*cp1)))
+ cp1++;
+ *cp1 = '\0';
+ }
+ if (given_and_display_8859like) {
+ StrAllocCopy(me->anchor->charset, cp4);
+ HTPassEightBitRaw = TRUE;
+ }
+ HTAlert(*cp4 ? cp4 : me->anchor->charset);
+ }
+ FREE(cp3);
+ } else {
+ /*
+ * No charset parameter is present. Ignore all other
+ * parameters, as we do when charset is present. - FM
+ */
+ *cp1 = '\0';
+ me->format = HTAtom_for(cp);
+ }
+ }
+ FREE(cp);
+ }
+ /*
+ * If we have an Expires header and haven't already set the no_cache
+ * element for the anchor, check if we should set it based on that header.
+ * - FM
+ */
+ if (me->anchor->no_cache == FALSE &&
+ me->anchor->expires != NULL) {
+ if (!strcmp(me->anchor->expires, "0")) {
+ /*
+ * The value is zero, which we treat as an absolute no-cache
+ * directive. - FM
+ */
+ me->anchor->no_cache = TRUE;
+ } else if (me->anchor->date != NULL) {
+ /*
+ * We have a Date header, so check if the value is less than or
+ * equal to that. - FM
+ */
+ if (LYmktime(me->anchor->expires, TRUE) <=
+ LYmktime(me->anchor->date, TRUE)) {
+ me->anchor->no_cache = TRUE;
+ }
+ } else if (LYmktime(me->anchor->expires, FALSE) == 0) {
+ /*
+ * We don't have a Date header, and the value is in past for us. -
+ * FM
+ */
+ me->anchor->no_cache = TRUE;
+ }
+ }
+ StrAllocCopy(me->anchor->content_type,
+ HTAtom_name(me->format));
+
+ if (me->set_cookie != NULL || me->set_cookie2 != NULL) {
+ LYSetCookie(me->set_cookie,
+ me->set_cookie2,
+ me->anchor->address);
+ FREE(me->set_cookie);
+ FREE(me->set_cookie2);
+ }
+ if (me->pickup_redirection) {
+ if (me->location && *me->location) {
+ redirecting_url = me->location;
+ me->location = NULL;
+ if (me->targetRep != WWW_DEBUG || me->sink)
+ me->head_only = YES;
+
+ } else {
+ permanent_redirection = FALSE;
+ if (me->location) {
+ CTRACE((tfp, "HTTP: 'Location:' is zero-length!\n"));
+ HTAlert(REDIRECTION_WITH_BAD_LOCATION);
+ }
+ CTRACE((tfp, "HTTP: Failed to pick up location.\n"));
+ if (me->location) {
+ FREE(me->location);
+ } else {
+ HTAlert(REDIRECTION_WITH_NO_LOCATION);
+ }
+ }
+ }
+ CTRACE((tfp, "...pumpData finished reading header\n"));
+ if (me->head_only) {
+ /* We are done! - kw */
+ me->state = MIME_IGNORE;
+ } else {
+
+ if (me->no_streamstack) {
+ me->target = me->sink;
+ } else {
+ if (!me->compression_encoding) {
+ CTRACE((tfp,
+ "HTMIME: MIME Content-Type is '%s', converting to '%s'\n",
+ HTAtom_name(me->format), HTAtom_name(me->targetRep)));
+ } else {
+ /*
+ * Change the format to that for "www/compressed" and set up a
+ * stream to deal with it. - FM
+ */
+ CTRACE((tfp, "HTMIME: MIME Content-Type is '%s',\n",
+ HTAtom_name(me->format)));
+ me->format = HTAtom_for("www/compressed");
+ CTRACE((tfp, " Treating as '%s'. Converting to '%s'\n",
+ HTAtom_name(me->format), HTAtom_name(me->targetRep)));
+ FREE(me->compression_encoding);
+ }
+ me->target = HTStreamStack(me->format, me->targetRep,
+ me->sink, me->anchor);
+ if (!me->target) {
+ CTRACE((tfp, "HTMIME: Can't translate! ** \n"));
+ me->target = me->sink; /* Cheat */
+ }
+ }
+ if (me->target) {
+ me->targetClass = *me->target->isa;
+ /*
+ * Pump rest of data right through, according to the transfer encoding.
+ */
+ me->state = (me->chunked_encoding
+ ? MIME_CHUNKED
+ : MIME_TRANSPARENT);
+ } else {
+ me->state = MIME_IGNORE; /* What else to do? */
+ }
+ if (me->refresh_url != NULL && !content_is_compressed(me)) {
+ char *url = NULL;
+ char *num = NULL;
+ char *txt = NULL;
+ const char *base = ""; /* FIXME: refresh_url may be relative to doc */
+
+ LYParseRefreshURL(me->refresh_url, &num, &url);
+ if (url != NULL && me->format == WWW_HTML) {
+ CTRACE((tfp,
+ "Formatting refresh-url as first line of result\n"));
+ HTSprintf0(&txt, gettext("Refresh: "));
+ HTSprintf(&txt, gettext("%s seconds "), num);
+ dequote(url);
+ HTSprintf(&txt, "<a href=\"%s%s\">%s</a><br>", base, url, url);
+ CTRACE((tfp, "URL %s%s\n", base, url));
+ (me->isa->put_string) (me, txt);
+ free(txt);
+ }
+ FREE(num);
+ FREE(url);
+ }
+ }
+ CTRACE((tfp, "...end of pumpData, copied %"
+ PRI_off_t " vs %"
+ PRI_off_t "\n",
+ CAST_off_t (me->anchor->actual_length),
+ CAST_off_t (me->anchor->content_length)));
+ me->anchor->actual_length = 0;
+ return HT_OK;
+}
+
+static int dispatchField(HTStream *me)
+{
+ int i, j;
+ char *cp;
+
+ *me->value_pointer = '\0';
+
+ cp = me->value_pointer;
+ while ((cp > me->value) && *(--cp) == ' ') /* S/390 -- gil -- 0146 */
+ /*
+ * Trim trailing spaces.
+ */
+ *cp = '\0';
+
+ switch (me->field) {
+ case miACCEPT_RANGES:
+ HTMIME_TrimDoubleQuotes(me->value);
+ CTRACE((tfp, "HTMIME: PICKED UP Accept-Ranges: '%s'\n",
+ me->value));
+ break;
+ case miAGE:
+ HTMIME_TrimDoubleQuotes(me->value);
+ CTRACE((tfp, "HTMIME: PICKED UP Age: '%s'\n",
+ me->value));
+ break;
+ case miALLOW:
+ HTMIME_TrimDoubleQuotes(me->value);
+ CTRACE((tfp, "HTMIME: PICKED UP Allow: '%s'\n",
+ me->value));
+ break;
+ case miALTERNATES:
+ HTMIME_TrimDoubleQuotes(me->value);
+ CTRACE((tfp, "HTMIME: PICKED UP Alternates: '%s'\n",
+ me->value));
+ break;
+ case miCACHE_CONTROL:
+ HTMIME_TrimDoubleQuotes(me->value);
+ CTRACE((tfp, "HTMIME: PICKED UP Cache-Control: '%s'\n",
+ me->value));
+ if (me->value[0] == '\0')
+ break;
+ /*
+ * Convert to lowercase and indicate in anchor. - FM
+ */
+ LYLowerCase(me->value);
+ StrAllocCopy(me->anchor->cache_control, me->value);
+ /*
+ * Check whether to set no_cache for the anchor. - FM
+ */
+ {
+ char *cp1, *cp0 = me->value;
+
+ while ((cp1 = strstr(cp0, "no-cache")) != NULL) {
+ cp1 += 8;
+ while (*cp1 != '\0' && WHITE(*cp1))
+ cp1++;
+ if (*cp1 == '\0' || *cp1 == ';') {
+ me->anchor->no_cache = TRUE;
+ break;
+ }
+ cp0 = cp1;
+ }
+ if (me->anchor->no_cache == TRUE)
+ break;
+ cp0 = me->value;
+ while ((cp1 = strstr(cp0, "max-age")) != NULL) {
+ cp1 += 7;
+ while (*cp1 != '\0' && WHITE(*cp1))
+ cp1++;
+ if (*cp1 == '=') {
+ cp1++;
+ while (*cp1 != '\0' && WHITE(*cp1))
+ cp1++;
+ if (isdigit(UCH(*cp1))) {
+ cp0 = cp1;
+ while (isdigit(UCH(*cp1)))
+ cp1++;
+ if (*cp0 == '0' && cp1 == (cp0 + 1)) {
+ me->anchor->no_cache = TRUE;
+ break;
+ }
+ }
+ }
+ cp0 = cp1;
+ }
+ }
+ break;
+ case miCOOKIE:
+ HTMIME_TrimDoubleQuotes(me->value);
+ CTRACE((tfp, "HTMIME: PICKED UP Cookie: '%s'\n",
+ me->value));
+ break;
+ case miCONNECTION:
+ HTMIME_TrimDoubleQuotes(me->value);
+ CTRACE((tfp, "HTMIME: PICKED UP Connection: '%s'\n",
+ me->value));
+ break;
+ case miCONTENT_BASE:
+ HTMIME_TrimDoubleQuotes(me->value);
+ CTRACE((tfp, "HTMIME: PICKED UP Content-Base: '%s'\n",
+ me->value));
+ if (me->value[0] == '\0')
+ break;
+ /*
+ * Indicate in anchor. - FM
+ */
+ StrAllocCopy(me->anchor->content_base, me->value);
+ break;
+ case miCONTENT_DISPOSITION:
+ HTMIME_TrimDoubleQuotes(me->value);
+ CTRACE((tfp, "HTMIME: PICKED UP Content-Disposition: '%s'\n",
+ me->value));
+ if (me->value[0] == '\0')
+ break;
+ /*
+ * Indicate in anchor. - FM
+ */
+ StrAllocCopy(me->anchor->content_disposition, me->value);
+ /*
+ * It's not clear yet from existing RFCs and IDs whether we should be
+ * looking for file;, attachment;, and/or inline; before the
+ * filename=value, so we'll just search for "filename" followed by '='
+ * and just hope we get the intended value. It is purely a suggested
+ * name, anyway. - FM
+ */
+ cp = me->anchor->content_disposition;
+ while (*cp != '\0' && strncasecomp(cp, "filename", 8))
+ cp++;
+ if (*cp == '\0')
+ break;
+ cp += 8;
+ while ((*cp != '\0') && (WHITE(*cp) || *cp == '='))
+ cp++;
+ if (*cp == '\0')
+ break;
+ while (*cp != '\0' && WHITE(*cp))
+ cp++;
+ if (*cp == '\0')
+ break;
+ StrAllocCopy(me->anchor->SugFname, cp);
+ if (*me->anchor->SugFname == '"') {
+ if ((cp = StrChr((me->anchor->SugFname + 1),
+ '"')) != NULL) {
+ *(cp + 1) = '\0';
+ HTMIME_TrimDoubleQuotes(me->anchor->SugFname);
+ } else {
+ FREE(me->anchor->SugFname);
+ break;
+ }
+ }
+ cp = me->anchor->SugFname;
+ while (*cp != '\0' && !WHITE(*cp))
+ cp++;
+ *cp = '\0';
+ if (*me->anchor->SugFname == '\0')
+ FREE(me->anchor->SugFname);
+ break;
+ case miCONTENT_ENCODING:
+ HTMIME_TrimDoubleQuotes(me->value);
+ CTRACE((tfp, "HTMIME: PICKED UP Content-Encoding: '%s'\n",
+ me->value));
+ if (me->value[0] == '\0' ||
+ !strcasecomp(me->value, "identity"))
+ break;
+ /*
+ * Convert to lowercase and indicate in anchor. - FM
+ */
+ LYLowerCase(me->value);
+ StrAllocCopy(me->anchor->content_encoding, me->value);
+ FREE(me->compression_encoding);
+ if (content_is_compressed(me)) {
+ /*
+ * Save it to use as a flag for setting up a "www/compressed"
+ * target. - FM
+ */
+ StrAllocCopy(me->compression_encoding, me->value);
+ } else {
+ /*
+ * Some server indicated "8bit", "7bit" or "binary"
+ * inappropriately. We'll ignore it. - FM
+ */
+ CTRACE((tfp, " Ignoring it!\n"));
+ }
+ break;
+ case miCONTENT_FEATURES:
+ HTMIME_TrimDoubleQuotes(me->value);
+ CTRACE((tfp, "HTMIME: PICKED UP Content-Features: '%s'\n",
+ me->value));
+ break;
+ case miCONTENT_LANGUAGE:
+ HTMIME_TrimDoubleQuotes(me->value);
+ CTRACE((tfp, "HTMIME: PICKED UP Content-Language: '%s'\n",
+ me->value));
+ if (me->value[0] == '\0')
+ break;
+ /*
+ * Convert to lowercase and indicate in anchor. - FM
+ */
+ LYLowerCase(me->value);
+ StrAllocCopy(me->anchor->content_language, me->value);
+ break;
+ case miCONTENT_LENGTH:
+ HTMIME_TrimDoubleQuotes(me->value);
+ CTRACE((tfp, "HTMIME: PICKED UP Content-Length: '%s'\n",
+ me->value));
+ if (me->value[0] == '\0')
+ break;
+ /*
+ * Convert to integer and indicate in anchor. - FM
+ */
+ me->anchor->content_length = LYatoll(me->value);
+ if (me->anchor->content_length < 0)
+ me->anchor->content_length = 0;
+ CTRACE((tfp, " Converted to integer: '%" PRI_off_t "'\n",
+ CAST_off_t (me->anchor->content_length)));
+ break;
+ case miCONTENT_LOCATION:
+ HTMIME_TrimDoubleQuotes(me->value);
+ CTRACE((tfp, "HTMIME: PICKED UP Content-Location: '%s'\n",
+ me->value));
+ if (me->value[0] == '\0')
+ break;
+ /*
+ * Indicate in anchor. - FM
+ */
+ StrAllocCopy(me->anchor->content_location, me->value);
+ break;
+ case miCONTENT_MD5:
+ HTMIME_TrimDoubleQuotes(me->value);
+ CTRACE((tfp, "HTMIME: PICKED UP Content-MD5: '%s'\n",
+ me->value));
+ if (me->value[0] == '\0')
+ break;
+ /*
+ * Indicate in anchor. - FM
+ */
+ StrAllocCopy(me->anchor->content_md5, me->value);
+ break;
+ case miCONTENT_RANGE:
+ HTMIME_TrimDoubleQuotes(me->value);
+ CTRACE((tfp, "HTMIME: PICKED UP Content-Range: '%s'\n",
+ me->value));
+ break;
+ case miCONTENT_TRANSFER_ENCODING:
+ HTMIME_TrimDoubleQuotes(me->value);
+ CTRACE((tfp, "HTMIME: PICKED UP Content-Transfer-Encoding: '%s'\n",
+ me->value));
+ if (me->value[0] == '\0')
+ break;
+ /*
+ * Force the Content-Transfer-Encoding value to all lower case. - FM
+ */
+ LYLowerCase(me->value);
+ me->c_t_encoding = HTAtom_for(me->value);
+ break;
+ case miCONTENT_TYPE:
+ HTMIME_TrimDoubleQuotes(me->value);
+ CTRACE((tfp, "HTMIME: PICKED UP Content-Type: '%s'\n",
+ me->value));
+ if (me->value[0] == '\0')
+ break;
+ /*
+ * Force the Content-Type value to all lower case and strip spaces and
+ * double-quotes. - FM
+ */
+ for (i = 0, j = 0; me->value[i]; i++) {
+ if (me->value[i] != ' ' && me->value[i] != '"') {
+ me->value[j++] = (char) TOLOWER(me->value[i]);
+ }
+ }
+ me->value[j] = '\0';
+ me->format = HTAtom_for(me->value);
+ StrAllocCopy(me->anchor->content_type_params, me->value);
+ break;
+ case miDATE:
+ HTMIME_TrimDoubleQuotes(me->value);
+ CTRACE((tfp, "HTMIME: PICKED UP Date: '%s'\n",
+ me->value));
+ if (me->value[0] == '\0')
+ break;
+ /*
+ * Indicate in anchor. - FM
+ */
+ StrAllocCopy(me->anchor->date, me->value);
+ break;
+ case miETAG:
+ /* Do not trim double quotes: an entity tag consists of an opaque
+ * quoted string, possibly prefixed by a weakness indicator.
+ */
+ CTRACE((tfp, "HTMIME: PICKED UP ETag: %s\n",
+ me->value));
+ if (me->value[0] == '\0')
+ break;
+ /*
+ * Indicate in anchor. - FM
+ */
+ StrAllocCopy(me->anchor->ETag, me->value);
+ break;
+ case miEXPIRES:
+ HTMIME_TrimDoubleQuotes(me->value);
+ CTRACE((tfp, "HTMIME: PICKED UP Expires: '%s'\n",
+ me->value));
+ if (me->value[0] == '\0')
+ break;
+ /*
+ * Indicate in anchor. - FM
+ */
+ StrAllocCopy(me->anchor->expires, me->value);
+ break;
+ case miKEEP_ALIVE:
+ HTMIME_TrimDoubleQuotes(me->value);
+ CTRACE((tfp, "HTMIME: PICKED UP Keep-Alive: '%s'\n",
+ me->value));
+ break;
+ case miLAST_MODIFIED:
+ HTMIME_TrimDoubleQuotes(me->value);
+ CTRACE((tfp, "HTMIME: PICKED UP Last-Modified: '%s'\n",
+ me->value));
+ if (me->value[0] == '\0')
+ break;
+ /*
+ * Indicate in anchor. - FM
+ */
+ StrAllocCopy(me->anchor->last_modified, me->value);
+ break;
+ case miLINK:
+ HTMIME_TrimDoubleQuotes(me->value);
+ CTRACE((tfp, "HTMIME: PICKED UP Link: '%s'\n",
+ me->value));
+ break;
+ case miLOCATION:
+ HTMIME_TrimDoubleQuotes(me->value);
+ CTRACE((tfp, "HTMIME: PICKED UP Location: '%s'\n",
+ me->value));
+ if (me->pickup_redirection && !me->location) {
+ StrAllocCopy(me->location, me->value);
+ } else {
+ CTRACE((tfp, "HTMIME: *** Ignoring Location!\n"));
+ }
+ break;
+ case miPRAGMA:
+ HTMIME_TrimDoubleQuotes(me->value);
+ CTRACE((tfp, "HTMIME: PICKED UP Pragma: '%s'\n",
+ me->value));
+ if (me->value[0] == '\0')
+ break;
+ /*
+ * Check whether to set no_cache for the anchor. - FM
+ */
+ if (!strcmp(me->value, "no-cache"))
+ me->anchor->no_cache = TRUE;
+ break;
+ case miPROXY_AUTHENTICATE:
+ HTMIME_TrimDoubleQuotes(me->value);
+ CTRACE((tfp, "HTMIME: PICKED UP Proxy-Authenticate: '%s'\n",
+ me->value));
+ break;
+ case miPUBLIC:
+ HTMIME_TrimDoubleQuotes(me->value);
+ CTRACE((tfp, "HTMIME: PICKED UP Public: '%s'\n",
+ me->value));
+ break;
+ case miREFRESH: /* nonstandard: Netscape */
+ HTMIME_TrimDoubleQuotes(me->value);
+ CTRACE((tfp, "HTMIME: PICKED UP Refresh: '%s'\n",
+ me->value));
+ StrAllocCopy(me->refresh_url, me->value);
+ break;
+ case miRETRY_AFTER:
+ HTMIME_TrimDoubleQuotes(me->value);
+ CTRACE((tfp, "HTMIME: PICKED UP Retry-After: '%s'\n",
+ me->value));
+ break;
+ case miSAFE:
+ HTMIME_TrimDoubleQuotes(me->value);
+ CTRACE((tfp, "HTMIME: PICKED UP Safe: '%s'\n",
+ me->value));
+ if (me->value[0] == '\0')
+ break;
+ /*
+ * Indicate in anchor if "YES" or "TRUE". - FM
+ */
+ if (!strcasecomp(me->value, "YES") ||
+ !strcasecomp(me->value, "TRUE")) {
+ me->anchor->safe = TRUE;
+ } else if (!strcasecomp(me->value, "NO") ||
+ !strcasecomp(me->value, "FALSE")) {
+ /*
+ * If server explicitly tells us that it has changed its mind,
+ * reset flag in anchor. - kw
+ */
+ me->anchor->safe = FALSE;
+ }
+ break;
+ case miSERVER:
+ HTMIME_TrimDoubleQuotes(me->value);
+ CTRACE((tfp, "HTMIME: PICKED UP Server: '%s'\n",
+ me->value));
+ if (me->value[0] == '\0')
+ break;
+ /*
+ * Indicate in anchor. - FM
+ */
+ StrAllocCopy(me->anchor->server, me->value);
+ break;
+ case miSET_COOKIE1:
+ HTMIME_TrimDoubleQuotes(me->value);
+ CTRACE((tfp, "HTMIME: PICKED UP Set-Cookie: '%s'\n",
+ me->value));
+ if (me->set_cookie == NULL) {
+ StrAllocCopy(me->set_cookie, me->value);
+ } else {
+ StrAllocCat(me->set_cookie, ", ");
+ StrAllocCat(me->set_cookie, me->value);
+ }
+ break;
+ case miSET_COOKIE2:
+ HTMIME_TrimDoubleQuotes(me->value);
+ CTRACE((tfp, "HTMIME: PICKED UP Set-Cookie2: '%s'\n",
+ me->value));
+ if (me->set_cookie2 == NULL) {
+ StrAllocCopy(me->set_cookie2, me->value);
+ } else {
+ StrAllocCat(me->set_cookie2, ", ");
+ StrAllocCat(me->set_cookie2, me->value);
+ }
+ break;
+ case miTITLE:
+ HTMIME_TrimDoubleQuotes(me->value);
+ CTRACE((tfp, "HTMIME: PICKED UP Title: '%s'\n",
+ me->value));
+ break;
+ case miTRANSFER_ENCODING:
+ HTMIME_TrimDoubleQuotes(me->value);
+ CTRACE((tfp, "HTMIME: PICKED UP Transfer-Encoding: '%s'\n",
+ me->value));
+ if (!strcmp(me->value, "chunked"))
+ me->chunked_encoding = YES;
+ break;
+ case miUPGRADE:
+ HTMIME_TrimDoubleQuotes(me->value);
+ CTRACE((tfp, "HTMIME: PICKED UP Upgrade: '%s'\n",
+ me->value));
+ break;
+ case miURI:
+ HTMIME_TrimDoubleQuotes(me->value);
+ CTRACE((tfp, "HTMIME: PICKED UP URI: '%s'\n",
+ me->value));
+ break;
+ case miVARY:
+ HTMIME_TrimDoubleQuotes(me->value);
+ CTRACE((tfp, "HTMIME: PICKED UP Vary: '%s'\n",
+ me->value));
+ break;
+ case miVIA:
+ HTMIME_TrimDoubleQuotes(me->value);
+ CTRACE((tfp, "HTMIME: PICKED UP Via: '%s'\n",
+ me->value));
+ break;
+ case miWARNING:
+ HTMIME_TrimDoubleQuotes(me->value);
+ CTRACE((tfp, "HTMIME: PICKED UP Warning: '%s'\n",
+ me->value));
+ break;
+ case miWWW_AUTHENTICATE:
+ HTMIME_TrimDoubleQuotes(me->value);
+ CTRACE((tfp, "HTMIME: PICKED UP WWW-Authenticate: '%s'\n",
+ me->value));
+ break;
+ default: /* Should never get here */
+ return HT_ERROR;
+ }
+ return HT_OK;
+}
+
+/*_________________________________________________________________________
+ *
+ * A C T I O N R O U T I N E S
+ */
+
+/* Character handling
+ * ------------------
+ *
+ * This is a FSM parser. It ignores field names it does not understand.
+ * Folded header fields are recognized. Lines without a fieldname at
+ * the beginning (that are not folded continuation lines) are ignored
+ * as unknown field names. Fields with empty values are not picked up.
+ */
+static void HTMIME_put_character(HTStream *me, int c)
+{
+ if (me->anchor->inHEAD) {
+ me->anchor->header_length++;
+ }
+ switch (me->state) {
+ begin_transparent:
+ case MIME_TRANSPARENT:
+ me->anchor->actual_length += 1;
+ (me->targetClass.put_character) (me->target, c);
+ return;
+
+ /* RFC-2616 describes chunked transfer coding */
+ case mcCHUNKED_DATA:
+ (*me->targetClass.put_character) (me->target, c);
+ me->chunked_size--;
+ if (me->chunked_size <= 0)
+ me->state = mcCHUNKED_DATA_CR;
+ return;
+
+ case mcCHUNKED_DATA_CR:
+ me->state = mcCHUNKED_DATA_LF;
+ if (c == CR) {
+ return;
+ }
+ /* FALLTHRU */
+
+ case mcCHUNKED_DATA_LF:
+ me->state = MIME_CHUNKED;
+ if (c == LF) {
+ return;
+ }
+
+ CTRACE((tfp, "HTIME_put_character expected LF in chunked data\n"));
+ me->state = MIME_TRANSPARENT;
+ goto begin_transparent;
+
+ /* FALLTHRU */
+ begin_chunked:
+ case MIME_CHUNKED:
+ me->chunked_size = 0;
+ me->state = mcCHUNKED_COUNT_DIGIT;
+
+ /* FALLTHRU */
+ case mcCHUNKED_COUNT_DIGIT:
+ if (isxdigit(UCH(c))) {
+ me->chunked_size <<= 4;
+ if (isdigit(UCH(c)))
+ me->chunked_size += UCH(c) - '0';
+ else
+ me->chunked_size += TOUPPER(UCH(c)) - 'A' + 10;
+ return;
+ }
+ if (c == ';')
+ me->state = mcCHUNKED_EXTENSION;
+
+ /* FALLTHRU */
+ case mcCHUNKED_EXTENSION:
+ if (c != CR && c != LF) {
+ return;
+ }
+ me->state = mcCHUNKED_COUNT_CR;
+
+ /* FALLTHRU */
+ case mcCHUNKED_COUNT_CR:
+ me->state = mcCHUNKED_COUNT_LF;
+ if (c == CR) {
+ return;
+ }
+
+ /* FALLTHRU */
+ case mcCHUNKED_COUNT_LF:
+ me->state = ((me->chunked_size != 0)
+ ? mcCHUNKED_DATA
+ : MIME_CHUNKED);
+ if (c == LF) {
+ return;
+ }
+ goto begin_chunked;
+
+ default:
+ break;
+ }
+
+ /*
+ * This slightly simple conversion just strips CR and turns LF to newline.
+ * On unix LF is \n but on Mac \n is CR for example. See NetToText for an
+ * implementation which preserves single CR or LF.
+ */
+ if (me->net_ascii) {
+ /*
+ * <sigh> This is evidence that at one time, this code supported
+ * local character sets other than ASCII. But there is so much
+ * code in HTTP.c that depends on line_buffer's having been
+ * translated to local character set that I needed to put the
+ * FROMASCII translation there, leaving this translation purely
+ * destructive. -- gil
+ */
+ /* S/390 -- gil -- 0118 */
+#ifndef NOT_ASCII
+ c = FROMASCII(c);
+#endif /* NOT_ASCII */
+ if (c == CR)
+ return;
+ else if (c == LF)
+ c = '\n';
+ }
+
+ switch (me->state) {
+
+ case MIME_IGNORE:
+ return;
+
+ case MIME_TRANSPARENT: /* Not reached see above */
+ case MIME_CHUNKED:
+ case mcCHUNKED_COUNT_DIGIT:
+ case mcCHUNKED_COUNT_CR:
+ case mcCHUNKED_COUNT_LF:
+ case mcCHUNKED_EXTENSION:
+ case mcCHUNKED_DATA:
+ case mcCHUNKED_DATA_CR:
+ case mcCHUNKED_DATA_LF:
+ return;
+
+ case MIME_NET_ASCII:
+ (*me->targetClass.put_character) (me->target, c); /* MUST BE FAST */
+ return;
+
+ case miNEWLINE:
+ if (c != '\n' && WHITE(c)) { /* Folded line */
+ me->state = me->fold_state; /* pop state before newline */
+ if (me->state == miGET_VALUE &&
+ me->value_pointer && me->value_pointer != me->value &&
+ !WHITE(*(me->value_pointer - 1))) {
+ c = ' ';
+ goto GET_VALUE; /* will add space to value if it fits - kw */
+ }
+ break;
+ } else if (me->fold_state == miGET_VALUE) {
+ /* Got a field, and now we know it's complete - so
+ * act on it. - kw */
+ dispatchField(me);
+ }
+ /* FALLTHRU */
+
+ case miBEGINNING_OF_LINE:
+ me->net_ascii = YES;
+ switch (c) {
+ case 'a':
+ case 'A':
+ me->state = miA;
+ CTRACE((tfp, "HTMIME: Got 'A' at beginning of line, state now A\n"));
+ break;
+
+ case 'c':
+ case 'C':
+ me->state = miC;
+ CTRACE((tfp, "HTMIME: Got 'C' at beginning of line, state now C\n"));
+ break;
+
+ case 'd':
+ case 'D':
+ me->check_pointer = "ate:";
+ me->if_ok = miDATE;
+ me->state = miCHECK;
+ CTRACE((tfp,
+ "HTMIME: Got 'D' at beginning of line, checking for 'ate:'\n"));
+ break;
+
+ case 'e':
+ case 'E':
+ me->state = miE;
+ CTRACE((tfp, "HTMIME: Got 'E' at beginning of line, state now E\n"));
+ break;
+
+ case 'k':
+ case 'K':
+ me->check_pointer = "eep-alive:";
+ me->if_ok = miKEEP_ALIVE;
+ me->state = miCHECK;
+ CTRACE((tfp,
+ "HTMIME: Got 'K' at beginning of line, checking for 'eep-alive:'\n"));
+ break;
+
+ case 'l':
+ case 'L':
+ me->state = miL;
+ CTRACE((tfp, "HTMIME: Got 'L' at beginning of line, state now L\n"));
+ break;
+
+ case 'p':
+ case 'P':
+ me->state = miP;
+ CTRACE((tfp, "HTMIME: Got 'P' at beginning of line, state now P\n"));
+ break;
+
+ case 'r':
+ case 'R':
+ me->state = miR;
+ CTRACE((tfp, "HTMIME: Got 'R' at beginning of line, state now R\n"));
+ break;
+
+ case 's':
+ case 'S':
+ me->state = miS;
+ CTRACE((tfp, "HTMIME: Got 'S' at beginning of line, state now S\n"));
+ break;
+
+ case 't':
+ case 'T':
+ me->state = miT;
+ CTRACE((tfp, "HTMIME: Got 'T' at beginning of line, state now T\n"));
+ break;
+
+ case 'u':
+ case 'U':
+ me->state = miU;
+ CTRACE((tfp, "HTMIME: Got 'U' at beginning of line, state now U\n"));
+ break;
+
+ case 'v':
+ case 'V':
+ me->state = miV;
+ CTRACE((tfp, "HTMIME: Got 'V' at beginning of line, state now V\n"));
+ break;
+
+ case 'w':
+ case 'W':
+ me->state = miW;
+ CTRACE((tfp, "HTMIME: Got 'W' at beginning of line, state now W\n"));
+ break;
+
+ case '\n': /* Blank line: End of Header! */
+ {
+ me->anchor->inHEAD = FALSE;
+ CTRACE((tfp, "HTMIME length %" PRI_off_t "\n",
+ CAST_off_t (me->anchor->header_length)));
+ me->net_ascii = NO;
+ pumpData(me);
+ }
+ break;
+
+ default:
+ goto bad_field_name;
+
+ } /* switch on character */
+ break;
+
+ case miA: /* Check for 'c','g' or 'l' */
+ switch (c) {
+ case 'c':
+ case 'C':
+ me->check_pointer = "cept-ranges:";
+ me->if_ok = miACCEPT_RANGES;
+ me->state = miCHECK;
+ CTRACE((tfp,
+ "HTMIME: Was A, found C, checking for 'cept-ranges:'\n"));
+ break;
+
+ case 'g':
+ case 'G':
+ me->check_pointer = "e:";
+ me->if_ok = miAGE;
+ me->state = miCHECK;
+ CTRACE((tfp, "HTMIME: Was A, found G, checking for 'e:'\n"));
+ break;
+
+ case 'l':
+ case 'L':
+ me->state = miAL;
+ CTRACE((tfp, "HTMIME: Was A, found L, state now AL'\n"));
+ break;
+
+ default:
+ CTRACE((tfp,
+ "HTMIME: Bad character `%c' found where `%s' expected\n",
+ c, "'g' or 'l'"));
+ goto bad_field_name;
+
+ } /* switch on character */
+ break;
+
+ case miAL: /* Check for 'l' or 't' */
+ switch (c) {
+ case 'l':
+ case 'L':
+ me->check_pointer = "ow:";
+ me->if_ok = miALLOW;
+ me->state = miCHECK;
+ CTRACE((tfp, "HTMIME: Was AL, found L, checking for 'ow:'\n"));
+ break;
+
+ case 't':
+ case 'T':
+ me->check_pointer = "ernates:";
+ me->if_ok = miALTERNATES;
+ me->state = miCHECK;
+ CTRACE((tfp, "HTMIME: Was AL, found T, checking for 'ernates:'\n"));
+ break;
+
+ default:
+ CTRACE((tfp,
+ "HTMIME: Bad character `%c' found where `%s' expected\n",
+ c, "'l' or 't'"));
+ goto bad_field_name;
+
+ } /* switch on character */
+ break;
+
+ case miC: /* Check for 'a' or 'o' */
+ switch (c) {
+ case 'a':
+ case 'A':
+ me->check_pointer = "che-control:";
+ me->if_ok = miCACHE_CONTROL;
+ me->state = miCHECK;
+ CTRACE((tfp,
+ "HTMIME: Was C, found A, checking for 'che-control:'\n"));
+ break;
+
+ case 'o':
+ case 'O':
+ me->state = miCO;
+ CTRACE((tfp, "HTMIME: Was C, found O, state now CO'\n"));
+ break;
+
+ default:
+ CTRACE((tfp,
+ "HTMIME: Bad character `%c' found where `%s' expected\n",
+ c, "'a' or 'o'"));
+ goto bad_field_name;
+
+ } /* switch on character */
+ break;
+
+ case miCO: /* Check for 'n' or 'o' */
+ switch (c) {
+ case 'n':
+ case 'N':
+ me->state = miCON;
+ CTRACE((tfp, "HTMIME: Was CO, found N, state now CON\n"));
+ break;
+
+ case 'o':
+ case 'O':
+ me->check_pointer = "kie:";
+ me->if_ok = miCOOKIE;
+ me->state = miCHECK;
+ CTRACE((tfp, "HTMIME: Was CO, found O, checking for 'kie:'\n"));
+ break;
+
+ default:
+ CTRACE((tfp,
+ "HTMIME: Bad character `%c' found where `%s' expected\n",
+ c, "'n' or 'o'"));
+ goto bad_field_name;
+
+ } /* switch on character */
+ break;
+
+ case miCON: /* Check for 'n' or 't' */
+ switch (c) {
+ case 'n':
+ case 'N':
+ me->check_pointer = "ection:";
+ me->if_ok = miCONNECTION;
+ me->state = miCHECK;
+ CTRACE((tfp, "HTMIME: Was CON, found N, checking for 'ection:'\n"));
+ break;
+
+ case 't':
+ case 'T':
+ me->check_pointer = "ent-";
+ me->if_ok = miCONTENT_;
+ me->state = miCHECK;
+ CTRACE((tfp, "HTMIME: Was CON, found T, checking for 'ent-'\n"));
+ break;
+
+ default:
+ CTRACE((tfp,
+ "HTMIME: Bad character `%c' found where `%s' expected\n",
+ c, "'n' or 't'"));
+ goto bad_field_name;
+
+ } /* switch on character */
+ break;
+
+ case miE: /* Check for 't' or 'x' */
+ switch (c) {
+ case 't':
+ case 'T':
+ me->check_pointer = "ag:";
+ me->if_ok = miETAG;
+ me->state = miCHECK;
+ CTRACE((tfp, "HTMIME: Was E, found T, checking for 'ag:'\n"));
+ break;
+
+ case 'x':
+ case 'X':
+ me->check_pointer = "pires:";
+ me->if_ok = miEXPIRES;
+ me->state = miCHECK;
+ CTRACE((tfp, "HTMIME: Was E, found X, checking for 'pires:'\n"));
+ break;
+
+ default:
+ CTRACE((tfp,
+ "HTMIME: Bad character `%c' found where `%s' expected\n",
+ c, "'t' or 'x'"));
+ goto bad_field_name;
+
+ } /* switch on character */
+ break;
+
+ case miL: /* Check for 'a', 'i' or 'o' */
+ switch (c) {
+ case 'a':
+ case 'A':
+ me->check_pointer = "st-modified:";
+ me->if_ok = miLAST_MODIFIED;
+ me->state = miCHECK;
+ CTRACE((tfp,
+ "HTMIME: Was L, found A, checking for 'st-modified:'\n"));
+ break;
+
+ case 'i':
+ case 'I':
+ me->check_pointer = "nk:";
+ me->if_ok = miLINK;
+ me->state = miCHECK;
+ CTRACE((tfp, "HTMIME: Was L, found I, checking for 'nk:'\n"));
+ break;
+
+ case 'o':
+ case 'O':
+ me->check_pointer = "cation:";
+ me->if_ok = miLOCATION;
+ me->state = miCHECK;
+ CTRACE((tfp, "HTMIME: Was L, found O, checking for 'cation:'\n"));
+ break;
+
+ default:
+ CTRACE((tfp,
+ "HTMIME: Bad character `%c' found where `%s' expected\n",
+ c, "'a', 'i' or 'o'"));
+ goto bad_field_name;
+
+ } /* switch on character */
+ break;
+
+ case miP: /* Check for 'r' or 'u' */
+ switch (c) {
+ case 'r':
+ case 'R':
+ me->state = miPR;
+ CTRACE((tfp, "HTMIME: Was P, found R, state now PR'\n"));
+ break;
+
+ case 'u':
+ case 'U':
+ me->check_pointer = "blic:";
+ me->if_ok = miPUBLIC;
+ me->state = miCHECK;
+ CTRACE((tfp, "HTMIME: Was P, found U, checking for 'blic:'\n"));
+ break;
+
+ default:
+ CTRACE((tfp,
+ "HTMIME: Bad character `%c' found where `%s' expected\n",
+ c, "'r' or 'u'"));
+ goto bad_field_name;
+
+ } /* switch on character */
+ break;
+
+ case miPR: /* Check for 'a' or 'o' */
+ switch (c) {
+ case 'a':
+ case 'A':
+ me->check_pointer = "gma:";
+ me->if_ok = miPRAGMA;
+ me->state = miCHECK;
+ CTRACE((tfp, "HTMIME: Was PR, found A, checking for 'gma'\n"));
+ break;
+
+ case 'o':
+ case 'O':
+ me->check_pointer = "xy-authenticate:";
+ me->if_ok = miPROXY_AUTHENTICATE;
+ me->state = miCHECK;
+ CTRACE((tfp,
+ "HTMIME: Was PR, found O, checking for 'xy-authenticate'\n"));
+ break;
+
+ default:
+ CTRACE((tfp,
+ "HTMIME: Bad character `%c' found where `%s' expected\n",
+ c, "'a' or 'o'"));
+ goto bad_field_name;
+
+ } /* switch on character */
+ break;
+
+ case miR: /* Check for 'e' */
+ switch (c) {
+ case 'e':
+ case 'E':
+ me->state = miRE;
+ CTRACE((tfp, "HTMIME: Was R, found E\n"));
+ break;
+ default:
+ CTRACE((tfp,
+ "HTMIME: Bad character `%c' found where `%s' expected\n",
+ c, "'e'"));
+ goto bad_field_name;
+
+ } /* switch on character */
+ break;
+
+ case miRE: /* Check for 'a' or 'o' */
+ switch (c) {
+ case 'f':
+ case 'F': /* nonstandard: Netscape */
+ me->check_pointer = "resh:";
+ me->if_ok = miREFRESH;
+ me->state = miCHECK;
+ CTRACE((tfp, "HTMIME: Was RE, found F, checking for '%s'\n", me->check_pointer));
+ break;
+
+ case 't':
+ case 'T':
+ me->check_pointer = "ry-after:";
+ me->if_ok = miRETRY_AFTER;
+ me->state = miCHECK;
+ CTRACE((tfp, "HTMIME: Was RE, found T, checking for '%s'\n", me->check_pointer));
+ break;
+
+ default:
+ CTRACE((tfp,
+ "HTMIME: Bad character `%c' found where `%s' expected\n",
+ c, "'f' or 't'"));
+ goto bad_field_name;
+
+ } /* switch on character */
+ break;
+
+ case miS: /* Check for 'a' or 'e' */
+ switch (c) {
+ case 'a':
+ case 'A':
+ me->check_pointer = "fe:";
+ me->if_ok = miSAFE;
+ me->state = miCHECK;
+ CTRACE((tfp, "HTMIME: Was S, found A, checking for 'fe:'\n"));
+ break;
+
+ case 'e':
+ case 'E':
+ me->state = miSE;
+ CTRACE((tfp, "HTMIME: Was S, found E, state now SE'\n"));
+ break;
+
+ default:
+ CTRACE((tfp,
+ "HTMIME: Bad character `%c' found where `%s' expected\n",
+ c, "'a' or 'e'"));
+ goto bad_field_name;
+
+ } /* switch on character */
+ break;
+
+ case miSE: /* Check for 'r' or 't' */
+ switch (c) {
+ case 'r':
+ case 'R':
+ me->check_pointer = "ver:";
+ me->if_ok = miSERVER;
+ me->state = miCHECK;
+ CTRACE((tfp, "HTMIME: Was SE, found R, checking for 'ver'\n"));
+ break;
+
+ case 't':
+ case 'T':
+ me->check_pointer = "-cookie";
+ me->if_ok = miSET_COOKIE;
+ me->state = miCHECK;
+ CTRACE((tfp, "HTMIME: Was SE, found T, checking for '-cookie'\n"));
+ break;
+
+ default:
+ CTRACE((tfp,
+ "HTMIME: Bad character `%c' found where `%s' expected\n",
+ c, "'r' or 't'"));
+ goto bad_field_name;
+
+ } /* switch on character */
+ break;
+
+ case miSET_COOKIE: /* Check for ':' or '2' */
+ switch (c) {
+ case ':':
+ me->field = miSET_COOKIE1; /* remember it */
+ me->state = miSKIP_GET_VALUE;
+ CTRACE((tfp, "HTMIME: Was SET_COOKIE, found :, processing\n"));
+ break;
+
+ case '2':
+ me->check_pointer = ":";
+ me->if_ok = miSET_COOKIE2;
+ me->state = miCHECK;
+ CTRACE((tfp, "HTMIME: Was SET_COOKIE, found 2, checking for ':'\n"));
+ break;
+
+ default:
+ CTRACE((tfp,
+ "HTMIME: Bad character `%c' found where `%s' expected\n",
+ c, "':' or '2'"));
+ goto bad_field_name;
+
+ } /* switch on character */
+ break;
+
+ case miT: /* Check for 'i' or 'r' */
+ switch (c) {
+ case 'i':
+ case 'I':
+ me->check_pointer = "tle:";
+ me->if_ok = miTITLE;
+ me->state = miCHECK;
+ CTRACE((tfp, "HTMIME: Was T, found I, checking for 'tle:'\n"));
+ break;
+
+ case 'r':
+ case 'R':
+ me->check_pointer = "ansfer-encoding:";
+ me->if_ok = miTRANSFER_ENCODING;
+ me->state = miCHECK;
+ CTRACE((tfp,
+ "HTMIME: Was T, found R, checking for 'ansfer-encoding'\n"));
+ break;
+
+ default:
+ CTRACE((tfp,
+ "HTMIME: Bad character `%c' found where `%s' expected\n",
+ c, "'i' or 'r'"));
+ goto bad_field_name;
+
+ } /* switch on character */
+ break;
+
+ case miU: /* Check for 'p' or 'r' */
+ switch (c) {
+ case 'p':
+ case 'P':
+ me->check_pointer = "grade:";
+ me->if_ok = miUPGRADE;
+ me->state = miCHECK;
+ CTRACE((tfp, "HTMIME: Was U, found P, checking for 'grade:'\n"));
+ break;
+
+ case 'r':
+ case 'R':
+ me->check_pointer = "i:";
+ me->if_ok = miURI;
+ me->state = miCHECK;
+ CTRACE((tfp, "HTMIME: Was U, found R, checking for 'i:'\n"));
+ break;
+
+ default:
+ CTRACE((tfp,
+ "HTMIME: Bad character `%c' found where `%s' expected\n",
+ c, "'p' or 'r'"));
+ goto bad_field_name;
+
+ } /* switch on character */
+ break;
+
+ case miV: /* Check for 'a' or 'i' */
+ switch (c) {
+ case 'a':
+ case 'A':
+ me->check_pointer = "ry:";
+ me->if_ok = miVARY;
+ me->state = miCHECK;
+ CTRACE((tfp, "HTMIME: Was V, found A, checking for 'ry:'\n"));
+ break;
+
+ case 'i':
+ case 'I':
+ me->check_pointer = "a:";
+ me->if_ok = miVIA;
+ me->state = miCHECK;
+ CTRACE((tfp, "HTMIME: Was V, found I, checking for 'a:'\n"));
+ break;
+
+ default:
+ CTRACE((tfp,
+ "HTMIME: Bad character `%c' found where `%s' expected\n",
+ c, "'a' or 'i'"));
+ goto bad_field_name;
+
+ } /* switch on character */
+ break;
+
+ case miW: /* Check for 'a' or 'w' */
+ switch (c) {
+ case 'a':
+ case 'A':
+ me->check_pointer = "rning:";
+ me->if_ok = miWARNING;
+ me->state = miCHECK;
+ CTRACE((tfp, "HTMIME: Was W, found A, checking for 'rning:'\n"));
+ break;
+
+ case 'w':
+ case 'W':
+ me->check_pointer = "w-authenticate:";
+ me->if_ok = miWWW_AUTHENTICATE;
+ me->state = miCHECK;
+ CTRACE((tfp,
+ "HTMIME: Was W, found W, checking for 'w-authenticate:'\n"));
+ break;
+
+ default:
+ CTRACE((tfp,
+ "HTMIME: Bad character `%c' found where `%s' expected\n",
+ c, "'a' or 'w'"));
+ goto bad_field_name;
+
+ } /* switch on character */
+ break;
+
+ case miCHECK: /* Check against string */
+ if (TOLOWER(c) == *(me->check_pointer)++) {
+ if (!*me->check_pointer)
+ me->state = me->if_ok;
+ } else { /* Error */
+ CTRACE((tfp,
+ "HTMIME: Bad character `%c' found where `%s' expected\n",
+ c, me->check_pointer - 1));
+ goto bad_field_name;
+ }
+ break;
+
+ case miCONTENT_:
+ CTRACE((tfp, "HTMIME: in case CONTENT_\n"));
+
+ switch (c) {
+ case 'b':
+ case 'B':
+ me->check_pointer = "ase:";
+ me->if_ok = miCONTENT_BASE;
+ me->state = miCHECK;
+ CTRACE((tfp,
+ "HTMIME: Was CONTENT_, found B, checking for 'ase:'\n"));
+ break;
+
+ case 'd':
+ case 'D':
+ me->check_pointer = "isposition:";
+ me->if_ok = miCONTENT_DISPOSITION;
+ me->state = miCHECK;
+ CTRACE((tfp,
+ "HTMIME: Was CONTENT_, found D, checking for 'isposition:'\n"));
+ break;
+
+ case 'e':
+ case 'E':
+ me->check_pointer = "ncoding:";
+ me->if_ok = miCONTENT_ENCODING;
+ me->state = miCHECK;
+ CTRACE((tfp,
+ "HTMIME: Was CONTENT_, found E, checking for 'ncoding:'\n"));
+ break;
+
+ case 'f':
+ case 'F':
+ me->check_pointer = "eatures:";
+ me->if_ok = miCONTENT_FEATURES;
+ me->state = miCHECK;
+ CTRACE((tfp,
+ "HTMIME: Was CONTENT_, found F, checking for 'eatures:'\n"));
+ break;
+
+ case 'l':
+ case 'L':
+ me->state = miCONTENT_L;
+ CTRACE((tfp,
+ "HTMIME: Was CONTENT_, found L, state now CONTENT_L\n"));
+ break;
+
+ case 'm':
+ case 'M':
+ me->check_pointer = "d5:";
+ me->if_ok = miCONTENT_MD5;
+ me->state = miCHECK;
+ CTRACE((tfp, "HTMIME: Was CONTENT_, found M, checking for 'd5:'\n"));
+ break;
+
+ case 'r':
+ case 'R':
+ me->check_pointer = "ange:";
+ me->if_ok = miCONTENT_RANGE;
+ me->state = miCHECK;
+ CTRACE((tfp,
+ "HTMIME: Was CONTENT_, found R, checking for 'ange:'\n"));
+ break;
+
+ case 't':
+ case 'T':
+ me->state = miCONTENT_T;
+ CTRACE((tfp,
+ "HTMIME: Was CONTENT_, found T, state now CONTENT_T\n"));
+ break;
+
+ default:
+ CTRACE((tfp, "HTMIME: Was CONTENT_, found nothing; bleah\n"));
+ goto bad_field_name;
+
+ } /* switch on character */
+ break;
+
+ case miCONTENT_L:
+ CTRACE((tfp, "HTMIME: in case CONTENT_L\n"));
+
+ switch (c) {
+ case 'a':
+ case 'A':
+ me->check_pointer = "nguage:";
+ me->if_ok = miCONTENT_LANGUAGE;
+ me->state = miCHECK;
+ CTRACE((tfp,
+ "HTMIME: Was CONTENT_L, found A, checking for 'nguage:'\n"));
+ break;
+
+ case 'e':
+ case 'E':
+ me->check_pointer = "ngth:";
+ me->if_ok = miCONTENT_LENGTH;
+ me->state = miCHECK;
+ CTRACE((tfp,
+ "HTMIME: Was CONTENT_L, found E, checking for 'ngth:'\n"));
+ break;
+
+ case 'o':
+ case 'O':
+ me->check_pointer = "cation:";
+ me->if_ok = miCONTENT_LOCATION;
+ me->state = miCHECK;
+ CTRACE((tfp,
+ "HTMIME: Was CONTENT_L, found O, checking for 'cation:'\n"));
+ break;
+
+ default:
+ CTRACE((tfp, "HTMIME: Was CONTENT_L, found nothing; bleah\n"));
+ goto bad_field_name;
+
+ } /* switch on character */
+ break;
+
+ case miCONTENT_T:
+ CTRACE((tfp, "HTMIME: in case CONTENT_T\n"));
+
+ switch (c) {
+ case 'r':
+ case 'R':
+ me->check_pointer = "ansfer-encoding:";
+ me->if_ok = miCONTENT_TRANSFER_ENCODING;
+ me->state = miCHECK;
+ CTRACE((tfp,
+ "HTMIME: Was CONTENT_T, found R, checking for 'ansfer-encoding:'\n"));
+ break;
+
+ case 'y':
+ case 'Y':
+ me->check_pointer = "pe:";
+ me->if_ok = miCONTENT_TYPE;
+ me->state = miCHECK;
+ CTRACE((tfp,
+ "HTMIME: Was CONTENT_T, found Y, checking for 'pe:'\n"));
+ break;
+
+ default:
+ CTRACE((tfp, "HTMIME: Was CONTENT_T, found nothing; bleah\n"));
+ goto bad_field_name;
+
+ } /* switch on character */
+ break;
+
+ case miACCEPT_RANGES:
+ case miAGE:
+ case miALLOW:
+ case miALTERNATES:
+ case miCACHE_CONTROL:
+ case miCOOKIE:
+ case miCONNECTION:
+ case miCONTENT_BASE:
+ case miCONTENT_DISPOSITION:
+ case miCONTENT_ENCODING:
+ case miCONTENT_FEATURES:
+ case miCONTENT_LANGUAGE:
+ case miCONTENT_LENGTH:
+ case miCONTENT_LOCATION:
+ case miCONTENT_MD5:
+ case miCONTENT_RANGE:
+ case miCONTENT_TRANSFER_ENCODING:
+ case miCONTENT_TYPE:
+ case miDATE:
+ case miETAG:
+ case miEXPIRES:
+ case miKEEP_ALIVE:
+ case miLAST_MODIFIED:
+ case miLINK:
+ case miLOCATION:
+ case miPRAGMA:
+ case miPROXY_AUTHENTICATE:
+ case miPUBLIC:
+ case miREFRESH:
+ case miRETRY_AFTER:
+ case miSAFE:
+ case miSERVER:
+ case miSET_COOKIE1:
+ case miSET_COOKIE2:
+ case miTITLE:
+ case miTRANSFER_ENCODING:
+ case miUPGRADE:
+ case miURI:
+ case miVARY:
+ case miVIA:
+ case miWARNING:
+ case miWWW_AUTHENTICATE:
+ me->field = me->state; /* remember it */
+ me->state = miSKIP_GET_VALUE;
+ /* FALLTHRU */
+
+ case miSKIP_GET_VALUE:
+ if (c == '\n') {
+ me->fold_state = me->state;
+ me->state = miNEWLINE;
+ break;
+ }
+ if (WHITE(c))
+ /*
+ * Skip white space.
+ */
+ break;
+
+ me->value_pointer = me->value;
+ me->state = miGET_VALUE;
+ /* Fall through to store first character */
+ /* FALLTHRU */
+
+ case miGET_VALUE:
+ GET_VALUE:
+ if (c != '\n') { /* Not end of line */
+ if (me->value_pointer < me->value + VALUE_SIZE - 1) {
+ *me->value_pointer++ = (char) c;
+ break;
+ } else {
+ goto value_too_long;
+ }
+ }
+ /* Fall through (if end of line) */
+ /* FALLTHRU */
+
+ case miJUNK_LINE:
+ if (c == '\n') {
+ me->fold_state = me->state;
+ me->state = miNEWLINE;
+ }
+ break;
+
+ } /* switch on state */
+
+ HTChunkPutc(&me->anchor->http_headers, UCH(c));
+ if (me->state == MIME_TRANSPARENT) {
+ HTChunkTerminate(&me->anchor->http_headers);
+ CTRACE((tfp, "Server Headers (%d bytes):\n%.*s\n",
+ me->anchor->http_headers.size,
+ me->anchor->http_headers.size,
+ me->anchor->http_headers.data));
+ CTRACE((tfp, "Server Content-Type:%s\n",
+ me->anchor->content_type_params));
+ }
+ return;
+
+ value_too_long:
+ CTRACE((tfp, "HTMIME: *** Syntax error. (string too long)\n"));
+
+ bad_field_name: /* Ignore it */
+ me->state = miJUNK_LINE;
+
+ HTChunkPutc(&me->anchor->http_headers, UCH(c));
+
+ return;
+}
+
+/* String handling
+ * ---------------
+ *
+ * Strings must be smaller than this buffer size.
+ */
+static void HTMIME_put_string(HTStream *me,
+ const char *s)
+{
+ const char *p;
+
+ if (me->state == MIME_TRANSPARENT) { /* Optimisation */
+ (*me->targetClass.put_string) (me->target, s);
+
+ } else if (me->state != MIME_IGNORE) {
+ CTRACE((tfp, "HTMIME: %s\n", s));
+
+ for (p = s; *p; p++)
+ HTMIME_put_character(me, *p);
+ }
+}
+
+/* Buffer write. Buffers can (and should!) be big.
+ * ------------
+ */
+static void HTMIME_write(HTStream *me,
+ const char *s,
+ int l)
+{
+ const char *p;
+
+ if (me->state == MIME_TRANSPARENT) { /* Optimisation */
+ (*me->targetClass.put_block) (me->target, s, l);
+
+ } else {
+ CTRACE((tfp, "HTMIME: %.*s\n", l, s));
+
+ for (p = s; p < s + l; p++)
+ HTMIME_put_character(me, *p);
+ }
+}
+
+/* Free an HTML object
+ * -------------------
+ *
+ */
+static void HTMIME_free(HTStream *me)
+{
+ if (me) {
+ FREE(me->location);
+ FREE(me->compression_encoding);
+ if (me->target)
+ (*me->targetClass._free) (me->target);
+ FREE(me);
+ }
+}
+
+/* End writing
+*/
+static void HTMIME_abort(HTStream *me,
+ HTError e)
+{
+ if (me) {
+ FREE(me->location);
+ FREE(me->compression_encoding);
+ if (me->target)
+ (*me->targetClass._abort) (me->target, e);
+ FREE(me);
+ }
+}
+
+/* Structured Object Class
+ * -----------------------
+ */
+static const HTStreamClass HTMIME =
+{
+ "MIMEParser",
+ HTMIME_free,
+ HTMIME_abort,
+ HTMIME_put_character,
+ HTMIME_put_string,
+ HTMIME_write
+};
+
+/* Subclass-specific Methods
+ * -------------------------
+ */
+HTStream *HTMIMEConvert(HTPresentation *pres,
+ HTParentAnchor *anchor,
+ HTStream *sink)
+{
+ HTStream *me;
+
+ CTRACE((tfp, "HTMIMEConvert\n"));
+ me = typecalloc(HTStream);
+
+ if (me == NULL)
+ outofmem(__FILE__, "HTMIMEConvert");
+
+ me->isa = &HTMIME;
+ me->sink = sink;
+ me->anchor = anchor;
+ me->anchor->safe = FALSE;
+ me->anchor->no_cache = FALSE;
+
+ FREE(me->anchor->cache_control);
+ FREE(me->anchor->SugFname);
+ FREE(me->anchor->charset);
+
+ HTChunkClear(&me->anchor->http_headers);
+ HTChunkInit(&me->anchor->http_headers, 128);
+
+ FREE(me->anchor->content_type_params);
+ FREE(me->anchor->content_language);
+ FREE(me->anchor->content_encoding);
+ FREE(me->anchor->content_base);
+ FREE(me->anchor->content_disposition);
+ FREE(me->anchor->content_location);
+ FREE(me->anchor->content_md5);
+
+ me->anchor->inHEAD = TRUE;
+ me->anchor->header_length = 0;
+ me->anchor->content_length = 0;
+
+ FREE(me->anchor->date);
+ FREE(me->anchor->expires);
+ FREE(me->anchor->last_modified);
+ FREE(me->anchor->ETag);
+ FREE(me->anchor->server);
+
+ me->target = NULL;
+ me->state = miBEGINNING_OF_LINE;
+ me->format = HTAtom_for(ContentTypes[LYContentType]);
+
+ CTRACE((tfp, "default Content-Type is %s\n", HTAtom_name(me->format)));
+ me->targetRep = pres->rep_out;
+ me->boundary = NULL; /* Not set yet */
+ me->set_cookie = NULL; /* Not set yet */
+ me->set_cookie2 = NULL; /* Not set yet */
+ me->refresh_url = NULL; /* Not set yet */
+ me->c_t_encoding = 0; /* Not set yet */
+ me->compression_encoding = NULL; /* Not set yet */
+ me->net_ascii = NO; /* Local character set */
+
+ HTAnchor_setUCInfoStage(me->anchor, current_char_set,
+ UCT_STAGE_STRUCTURED,
+ UCT_SETBY_DEFAULT);
+ HTAnchor_setUCInfoStage(me->anchor, current_char_set,
+ UCT_STAGE_HTEXT,
+ UCT_SETBY_DEFAULT);
+ return me;
+}
+
+HTStream *HTNetMIME(HTPresentation *pres,
+ HTParentAnchor *anchor,
+ HTStream *sink)
+{
+ HTStream *me = HTMIMEConvert(pres, anchor, sink);
+
+ if (!me)
+ return NULL;
+
+ me->net_ascii = YES;
+ return me;
+}
+
+HTStream *HTMIMERedirect(HTPresentation *pres,
+ HTParentAnchor *anchor,
+ HTStream *sink)
+{
+ HTStream *me = HTMIMEConvert(pres, anchor, sink);
+
+ if (!me)
+ return NULL;
+
+ me->pickup_redirection = YES;
+ if (me->targetRep == WWW_DEBUG && sink)
+ me->no_streamstack = YES;
+ return me;
+}
+
+/* Japanese header handling functions
+ * ==================================
+ *
+ * K&Rized and added 07-Jun-96 by FM, based on:
+ *
+////////////////////////////////////////////////////////////////////////
+ *
+ * ISO-2022-JP handling routines
+ * &
+ * MIME decode routines (quick hack just for ISO-2022-JP)
+ *
+ * Thu Jan 25 10:11:42 JST 1996
+ *
+ * Copyright (C) 1994, 1995, 1996
+ * Shuichi Ichikawa (ichikawa@nuee.nagoya-u.ac.jp)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either versions 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with SKK, see the file COPYING. If not, write to the Free
+ * Software Foundation Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+/*
+ * MIME decoding routines
+ *
+ * Written by S. Ichikawa,
+ * partially inspired by encdec.c of <jh@efd.lth.se>.
+ * Caller's buffers decode to no longer than the input strings.
+ */
+#include <LYCharVals.h> /* S/390 -- gil -- 0163 */
+
+static char HTmm64[] =
+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
+static char HTmmquote[] = "0123456789ABCDEF";
+static int HTmmcont = 0;
+
+static void HTmmdec_base64(char **t,
+ char *s)
+{
+ int d, count, j, val;
+ char *buf, *bp, nw[4], *p;
+
+ if ((buf = typeMallocn(char, strlen(s) * 3 + 1)) == 0)
+ outofmem(__FILE__, "HTmmdec_base64");
+
+ for (bp = buf; *s; s += 4) {
+ val = 0;
+ if (s[2] == '=')
+ count = 1;
+ else if (s[3] == '=')
+ count = 2;
+ else
+ count = 3;
+
+ for (j = 0; j <= count; j++) {
+ if (!(p = StrChr(HTmm64, s[j]))) {
+ FREE(buf);
+ return;
+ }
+ d = (int) (p - HTmm64);
+ d <<= (3 - j) * 6;
+ val += d;
+ }
+ for (j = 2; j >= 0; j--) {
+ nw[j] = (char) (val & 255);
+ val >>= 8;
+ }
+ if (count--)
+ *bp++ = nw[0];
+ if (count--)
+ *bp++ = nw[1];
+ if (count)
+ *bp++ = nw[2];
+ }
+ *bp = '\0';
+ StrAllocCopy(*t, buf);
+ FREE(buf);
+}
+
+static void HTmmdec_quote(char **t,
+ char *s)
+{
+ char *buf, cval, *bp, *p;
+
+ if ((buf = typeMallocn(char, strlen(s) + 1)) == 0)
+ outofmem(__FILE__, "HTmmdec_quote");
+
+ for (bp = buf; *s;) {
+ if (*s == '=') {
+ cval = 0;
+ if (s[1] && (p = StrChr(HTmmquote, s[1]))) {
+ cval = (char) (cval + (char) (p - HTmmquote));
+ } else {
+ *bp++ = *s++;
+ continue;
+ }
+ if (s[2] && (p = StrChr(HTmmquote, s[2]))) {
+ cval = (char) (cval << 4);
+ cval = (char) (cval + (p - HTmmquote));
+ *bp++ = cval;
+ s += 3;
+ } else {
+ *bp++ = *s++;
+ }
+ } else if (*s == '_') {
+ *bp++ = 0x20;
+ s++;
+ } else {
+ *bp++ = *s++;
+ }
+ }
+ *bp = '\0';
+ StrAllocCopy(*t, buf);
+ FREE(buf);
+}
+
+/*
+ * HTmmdecode for ISO-2022-JP - FM
+ */
+void HTmmdecode(char **target,
+ char *source)
+{
+ char *buf;
+ char *mmbuf = NULL;
+ char *m2buf = NULL;
+ char *s, *t, *u;
+ int base64, quote;
+
+ if ((buf = typeMallocn(char, strlen(source) + 1)) == 0)
+ outofmem(__FILE__, "HTmmdecode");
+
+ for (s = source, *(u = buf) = '\0'; *s;) {
+ if (!strncasecomp(s, "=?ISO-2022-JP?B?", 16)) {
+ base64 = 1;
+ } else {
+ base64 = 0;
+ }
+ if (!strncasecomp(s, "=?ISO-2022-JP?Q?", 16)) {
+ quote = 1;
+ } else {
+ quote = 0;
+ }
+ if (base64 || quote) {
+ if (HTmmcont) {
+ for (t = s - 1;
+ t >= source && (*t == ' ' || *t == '\t'); t--) {
+ u--;
+ }
+ }
+ if (mmbuf == 0) /* allocate buffer big enough for source */
+ StrAllocCopy(mmbuf, source);
+ for (s += 16, t = mmbuf; *s;) {
+ if (s[0] == '?' && s[1] == '=') {
+ break;
+ } else {
+ *t++ = *s++;
+ *t = '\0';
+ }
+ }
+ if (s[0] != '?' || s[1] != '=') {
+ goto end;
+ } else {
+ s += 2;
+ *t = '\0';
+ }
+ if (base64)
+ HTmmdec_base64(&m2buf, mmbuf);
+ else
+ HTmmdec_quote(&m2buf, mmbuf);
+ for (t = m2buf; non_empty(t);)
+ *u++ = *t++;
+ HTmmcont = 1;
+ } else {
+ if (*s != ' ' && *s != '\t')
+ HTmmcont = 0;
+ *u++ = *s++;
+ }
+ }
+ *u = '\0';
+ end:
+ StrAllocCopy(*target, buf);
+ FREE(m2buf);
+ FREE(mmbuf);
+ FREE(buf);
+}
+
+/*
+ * Insert ESC where it seems lost.
+ * (The author of this function "rjis" is S. Ichikawa.)
+ */
+int HTrjis(char **t,
+ char *s)
+{
+ char *p;
+ char *buf = NULL;
+ int kanji = 0;
+
+ if (StrChr(s, CH_ESC) || !StrChr(s, '$')) {
+ if (s != *t)
+ StrAllocCopy(*t, s);
+ return 1;
+ }
+
+ if ((buf = typeMallocn(char, strlen(s) * 2 + 1)) == 0)
+ outofmem(__FILE__, "HTrjis");
+
+ for (p = buf; *s;) {
+ if (!kanji && s[0] == '$' && (s[1] == '@' || s[1] == 'B')) {
+ if (HTmaybekanji((int) s[2], (int) s[3])) {
+ kanji = 1;
+ *p++ = CH_ESC;
+ *p++ = *s++;
+ *p++ = *s++;
+ *p++ = *s++;
+ *p++ = *s++;
+ continue;
+ }
+ *p++ = *s++;
+ continue;
+ }
+ if (kanji && s[0] == '(' && (s[1] == 'J' || s[1] == 'B')) {
+ kanji = 0;
+ *p++ = CH_ESC;
+ *p++ = *s++;
+ *p++ = *s++;
+ continue;
+ }
+ *p++ = *s++;
+ }
+ *p = *s; /* terminate string */
+
+ StrAllocCopy(*t, buf);
+ FREE(buf);
+ return 0;
+}
+
+/*
+ * The following function "maybekanji" is derived from
+ * RJIS-1.0 by Mr. Hironobu Takahashi.
+ * Maybekanji() is included here under the courtesy of the author.
+ * The original comment of rjis.c is also included here.
+ */
+/*
+ * RJIS ( Recover JIS code from broken file )
+ * Copyright (C) 1992 1994
+ * Hironobu Takahashi (takahasi@tiny.or.jp)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either versions 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with SKK, see the file COPYING. If not, write to the Free
+ * Software Foundation Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+int HTmaybekanji(int c1,
+ int c2)
+{
+
+ if ((c2 < 33) || (c2 > 126))
+ return 0;
+ if ((c1 < 33) || ((40 < c1) && (c1 < 48)) || (116 < c1))
+ return 0;
+ c2 -= 32;
+ switch (c1 - 32) {
+ case 2:
+ if ((14 < c2) && (c2 < 26))
+ return 0;
+ if ((33 < c2) && (c2 < 42))
+ return 0;
+ if ((48 < c2) && (c2 < 60))
+ return 0;
+ if ((74 < c2) && (c2 < 82))
+ return 0;
+ if ((89 < c2) && (c2 < 94))
+ return 0;
+ break;
+ case 3:
+ if (c2 < 16)
+ return 0;
+ if ((25 < c2) && (c2 < 33))
+ return 0;
+ if ((58 < c2) && (c2 < 65))
+ return 0;
+ if (90 < c2)
+ return 0;
+ break;
+ case 4:
+ if (83 < c2)
+ return 0;
+ break;
+ case 5:
+ if (86 < c2)
+ return 0;
+ break;
+ case 6:
+ if ((24 < c2) && (c2 < 33))
+ return 0;
+ if (56 < c2)
+ return 0;
+ break;
+ case 7:
+ if ((33 < c2) && (c2 < 49))
+ return 0;
+ if (81 < c2)
+ return 0;
+ break;
+ case 8:
+ if (32 < c2)
+ return 0;
+ break;
+ case 47:
+ if (51 < c2)
+ return 0;
+ break;
+ case 84:
+ if (6 < c2)
+ return 0;
+ break;
+ }
+ return 1;
+}
diff --git a/WWW/Library/Implementation/HTMIME.h b/WWW/Library/Implementation/HTMIME.h
new file mode 100644
index 0000000..6410c15
--- /dev/null
+++ b/WWW/Library/Implementation/HTMIME.h
@@ -0,0 +1,84 @@
+/* /Net/dxcern/userd/timbl/hypertext/WWW/Library/Implementation/HTMIME.html
+ MIME PARSER
+
+ The MIME parser stream presents a MIME document. It recursively invokes the
+ format manager to handle embedded formats.
+
+ As well as stripping off and parsing the headers, the MIME parser has to
+ parse any weirld MIME encodings it may meet within the body parts of
+ messages, and must deal with multipart messages.
+
+ This module is implemented to the level necessary for operation with WWW,
+ but is not currently complete for any arbitrary MIME message.
+
+ Check the source for latest additions to functionality.
+
+ The MIME parser is complicated by the fact that WWW allows real binary to be
+ sent, not ASCII encoded. Therefore the netascii decoding is included in
+ this module. One cannot layer it by converting first from Net to local
+ text, then decoding it. Of course, for local files, the net ascii decoding
+ is not needed. There are therefore two creation routines.
+
+ */
+#ifndef HTMIME_H
+#define HTMIME_H
+
+#include <HTStream.h>
+#include <HTAnchor.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * This function is for trimming off any paired
+ * open- and close-double quotes from header values.
+ * It does not parse the string for embedded quotes,
+ * and will not modify the string unless both the
+ * first and last characters are double-quotes. - FM
+ */ extern void HTMIME_TrimDoubleQuotes(char *value);
+
+/*
+
+ INPUT: LOCAL TEXT
+
+ */
+ extern HTStream *HTMIMEConvert(HTPresentation *pres,
+ HTParentAnchor *anchor,
+ HTStream *sink);
+
+/*
+
+ INPUT: NET ASCII
+
+ */
+ extern HTStream *HTNetMIME(HTPresentation *pres,
+ HTParentAnchor *anchor,
+ HTStream *sink);
+
+/*
+
+ INPUT: Redirection message, parse headers only for Location if present
+
+ */
+ extern HTStream *HTMIMERedirect(HTPresentation *pres,
+ HTParentAnchor *anchor,
+ HTStream *sink);
+
+/*
+
+ For handling Japanese headers.
+
+*/
+ extern void HTmmdecode(char **target,
+ char *source);
+
+ extern int HTrjis(char **target,
+ char *source);
+
+ extern int HTmaybekanji(int c1,
+ int c2);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* !HTMIME_H */
diff --git a/WWW/Library/Implementation/HTMLDTD.c b/WWW/Library/Implementation/HTMLDTD.c
new file mode 100644
index 0000000..382c141
--- /dev/null
+++ b/WWW/Library/Implementation/HTMLDTD.c
@@ -0,0 +1,334 @@
+/*
+ * $LynxId: HTMLDTD.c,v 1.58 2021/07/23 00:00:03 tom Exp $
+ *
+ * Our Static DTD for HTML
+ * -----------------------
+ */
+
+/* Implements:
+*/
+
+#include <HTUtils.h>
+#include <HTMLDTD.h>
+#include <LYLeaks.h>
+#include <LYJustify.h>
+
+/*
+ * Character entities like &nbsp now excluded from our DTD tables, they are
+ * mapped to Unicode and handled by chartrans code directly the similar way the
+ * numeric entities like &#123 does. See src/chrtrans/entities.h for real
+ * mapping.
+ */
+
+/* Entity Names
+ * ------------
+ *
+ * This table must be matched exactly with ALL the translation tables
+ * (this is an obsolete translation mechanism, probably unused,
+ * currently replaced with Unicode chartrans in most cases...)
+ */
+static const char *entities[] =
+{
+ "AElig", /* capital AE diphthong (ligature) */
+ "Aacute", /* capital A, acute accent */
+ "Acirc", /* capital A, circumflex accent */
+ "Agrave", /* capital A, grave accent */
+ "Aring", /* capital A, ring */
+ "Atilde", /* capital A, tilde */
+ "Auml", /* capital A, dieresis or umlaut mark */
+ "Ccedil", /* capital C, cedilla */
+ "Dstrok", /* capital Eth, Icelandic */
+ "ETH", /* capital Eth, Icelandic */
+ "Eacute", /* capital E, acute accent */
+ "Ecirc", /* capital E, circumflex accent */
+ "Egrave", /* capital E, grave accent */
+ "Euml", /* capital E, dieresis or umlaut mark */
+ "Iacute", /* capital I, acute accent */
+ "Icirc", /* capital I, circumflex accent */
+ "Igrave", /* capital I, grave accent */
+ "Iuml", /* capital I, dieresis or umlaut mark */
+ "Ntilde", /* capital N, tilde */
+ "Oacute", /* capital O, acute accent */
+ "Ocirc", /* capital O, circumflex accent */
+ "Ograve", /* capital O, grave accent */
+ "Oslash", /* capital O, slash */
+ "Otilde", /* capital O, tilde */
+ "Ouml", /* capital O, dieresis or umlaut mark */
+ "THORN", /* capital THORN, Icelandic */
+ "Uacute", /* capital U, acute accent */
+ "Ucirc", /* capital U, circumflex accent */
+ "Ugrave", /* capital U, grave accent */
+ "Uuml", /* capital U, dieresis or umlaut mark */
+ "Yacute", /* capital Y, acute accent */
+ "aacute", /* small a, acute accent */
+ "acirc", /* small a, circumflex accent */
+ "acute", /* spacing acute */
+ "aelig", /* small ae diphthong (ligature) */
+ "agrave", /* small a, grave accent */
+ "amp", /* ampersand */
+ "aring", /* small a, ring */
+ "atilde", /* small a, tilde */
+ "auml", /* small a, dieresis or umlaut mark */
+ "brkbar", /* broken vertical bar */
+ "brvbar", /* broken vertical bar */
+ "ccedil", /* small c, cedilla */
+ "cedil", /* spacing cedilla */
+ "cent", /* cent sign */
+ "copy", /* copyright sign */
+ "curren", /* currency sign */
+ "deg", /* degree sign */
+ "die", /* spacing dieresis */
+ "divide", /* division sign */
+ "eacute", /* small e, acute accent */
+ "ecirc", /* small e, circumflex accent */
+ "egrave", /* small e, grave accent */
+ "emdash", /* dash the width of emsp */
+ "emsp", /* em space - not collapsed */
+ "endash", /* dash the width of ensp */
+ "ensp", /* en space - not collapsed */
+ "eth", /* small eth, Icelandic */
+ "euml", /* small e, dieresis or umlaut mark */
+ "frac12", /* fraction 1/2 */
+ "frac14", /* fraction 1/4 */
+ "frac34", /* fraction 3/4 */
+ "gt", /* greater than */
+ "hibar", /* spacing macron */
+ "iacute", /* small i, acute accent */
+ "icirc", /* small i, circumflex accent */
+ "iexcl", /* inverted exclamation mark */
+ "igrave", /* small i, grave accent */
+ "iquest", /* inverted question mark */
+ "iuml", /* small i, dieresis or umlaut mark */
+ "laquo", /* angle quotation mark, left */
+ "lt", /* less than */
+ "macr", /* spacing macron */
+ "mdash", /* dash the width of emsp */
+ "micro", /* micro sign */
+ "middot", /* middle dot */
+ "nbsp", /* non breaking space */
+ "ndash", /* dash the width of ensp */
+ "not", /* negation sign */
+ "ntilde", /* small n, tilde */
+ "oacute", /* small o, acute accent */
+ "ocirc", /* small o, circumflex accent */
+ "ograve", /* small o, grave accent */
+ "ordf", /* feminine ordinal indicator */
+ "ordm", /* masculine ordinal indicator */
+ "oslash", /* small o, slash */
+ "otilde", /* small o, tilde */
+ "ouml", /* small o, dieresis or umlaut mark */
+ "para", /* paragraph sign */
+ "plusmn", /* plus-or-minus sign */
+ "pound", /* pound sign */
+ "quot", /* quote '"' */
+ "raquo", /* angle quotation mark, right */
+ "reg", /* circled R registered sign */
+ "sect", /* section sign */
+ "shy", /* soft hyphen */
+ "sup1", /* superscript 1 */
+ "sup2", /* superscript 2 */
+ "sup3", /* superscript 3 */
+ "szlig", /* small sharp s, German (sz ligature) */
+ "thinsp", /* thin space (not collapsed) */
+ "thorn", /* small thorn, Icelandic */
+ "times", /* multiplication sign */
+ "trade", /* trade mark sign (U+2122) */
+ "uacute", /* small u, acute accent */
+ "ucirc", /* small u, circumflex accent */
+ "ugrave", /* small u, grave accent */
+ "uml", /* spacing dieresis */
+ "uuml", /* small u, dieresis or umlaut mark */
+ "yacute", /* small y, acute accent */
+ "yen", /* yen sign */
+ "yuml", /* small y, dieresis or umlaut mark */
+};
+
+/* Attribute Lists
+ * ---------------
+ *
+ * Lists must be in alphabetical order by attribute name
+ * The tag elements contain the number of attributes
+ */
+
+/* From Peter Flynn's intro to the HTML Pro DTD:
+
+ %structure;
+
+ DIV, CENTER, H1 to H6, P, UL, OL, DL, DIR, MENU, PRE, XMP, LISTING, BLOCKQUOTE, BQ,
+ 2 1 2 2 1 8 8 8 8 8 8 8 8 4 4
+ MULTICOL,?NOBR, FORM, TABLE, ADDRESS, FIG, BDO, NOTE, and FN; plus?WBR, LI, and LH
+ 8 n ?1 n 8 8 2 2 2 2 2 ?1 nE 4 4
+
+ %insertions;
+
+ Elements which usually contain special-purpose material, or no text material at all.
+
+ BASEFONT, APPLET, OBJECT, EMBED, SCRIPT, MAP, MARQUEE, HR, ISINDEX, BGSOUND, TAB,?IMG,
+ 1 e? 2 2 l 1 e 2 l 8 4 4 E 1? E 1 E ! E ?1 E
+ IMAGE, BR, plus NOEMBED, SERVER, SPACER, AUDIOSCOPE, and SIDEBAR; ?area
+ 1 n 1 E n n n n n 8 E
+
+ %text;
+
+ Elements within the %structure; which directly contain running text.
+
+ Descriptive or analytic markup: EM, STRONG, DFN, CODE, SAMP, KBD, VAR, CITE, Q, LANG, AU,
+ 2 2 2 2 2 2 2 2 2 2 n 2
+ AUTHOR, PERSON, ACRONYM, ABBR, INS, DEL, and SPAN
+ 2 2 n 2 2 2 2 2
+ Visual markup:S, STRIKE, I, B, TT, U,?NOBR,?WBR, BR, BIG, SMALL, FONT, STYLE, BLINK, TAB,
+ 1 1 1 1 1 1 ?1 n ?1nE? 1 E 1 1 1 1 l 1 1 E?
+ BLACKFACE, LIMITTEXT, NOSMARTQUOTES, and SHADOW
+ 1 n 1 n 1 n 1 n
+ Hypertext and graphics: A and?IMG
+ 8 ?8 E
+ Mathematical: SUB, SUP, and MATH
+ 4 4 4 l
+ Documentary: COMMENT, ENTITY, ELEMENT, and ATTRIB
+ 4 4 n 4 n 4 n
+ %formula;
+ */
+
+/* Elements
+ * --------
+ *
+ * Must match definitions in HTMLDTD.html!
+ * Must be in alphabetical order.
+ *
+ * The T_* extra info is listed here, even though most fields are not used
+ * in SGML.c if Old_DTD is set (with the exception of some Tgf_* flags).
+ * This simplifies comparison of the tags_table0[] table (otherwise unchanged
+ * from original Lynx treatment) with the tags_table1[] table below. - kw
+ *
+ * Name*, Attributes, No. of attributes, content, extra info...
+ */
+
+#include <src0_HTMLDTD.h>
+#include <src1_HTMLDTD.h>
+
+/* Dummy space, will be filled with the contents of either tags_table1
+ or tags_table0 on calling HTSwitchDTD - kw */
+
+static HTTag tags[HTML_ALL_ELEMENTS];
+
+const SGML_dtd HTML_dtd =
+{
+ tags,
+ HTML_ELEMENTS,
+ entities, /* probably unused */
+ TABLESIZE(entities),
+};
+
+/* This function fills the "tags" part of the HTML_dtd structure with
+ what we want to use, either tags_table0 or tags_table1. Note that it
+ has to be called at least once before HTML_dtd is used, otherwise
+ the HTML_dtd contents will be invalid! This could be coded in a way
+ that would make an initialisation call unnecessary, but my C knowledge
+ is limited and I didn't want to list the whole tags_table1 table
+ twice... - kw */
+void HTSwitchDTD(int new_flag)
+{
+ if (TRACE)
+ CTRACE((tfp,
+ "HTMLDTD: Copying %s DTD element info of size %d, %d * %d\n",
+ new_flag ? "strict" : "tagsoup",
+ (int) (new_flag ? sizeof(tags_table1) : sizeof(tags_table0)),
+ HTML_ALL_ELEMENTS,
+ (int) sizeof(HTTag)));
+ if (new_flag)
+ MemCpy(tags, tags_table1, HTML_ALL_ELEMENTS * sizeof(HTTag));
+ else
+ MemCpy(tags, tags_table0, HTML_ALL_ELEMENTS * sizeof(HTTag));
+}
+
+HTTag HTTag_unrecognized =
+
+{NULL_HTTag, NULL, 0, 0, SGML_EMPTY, T__UNREC_, 0, 0};
+
+/*
+ * Utility Routine: Useful for people building HTML objects.
+ */
+
+/* Start anchor element
+ * --------------------
+ *
+ * It is kinda convenient to have a particulr routine for
+ * starting an anchor element, as everything else for HTML is
+ * simple anyway.
+ */
+struct _HTStructured {
+ HTStructuredClass *isa;
+ /* ... */
+};
+
+void HTStartAnchor(HTStructured * obj, const char *name,
+ const char *href)
+{
+ BOOL present[HTML_A_ATTRIBUTES];
+ const char *value[HTML_A_ATTRIBUTES];
+ int i;
+
+ for (i = 0; i < HTML_A_ATTRIBUTES; i++)
+ present[i] = NO;
+
+ if (name && *name) {
+ present[HTML_A_NAME] = YES;
+ value[HTML_A_NAME] = (const char *) name;
+ }
+ if (href) {
+ present[HTML_A_HREF] = YES;
+ value[HTML_A_HREF] = (const char *) href;
+ }
+
+ (*obj->isa->start_element) (obj, HTML_A, present, value, -1, 0);
+}
+
+void HTStartAnchor5(HTStructured * obj, const char *name,
+ const char *href,
+ const char *linktype,
+ int tag_charset)
+{
+ BOOL present[HTML_A_ATTRIBUTES];
+ const char *value[HTML_A_ATTRIBUTES];
+ int i;
+
+ for (i = 0; i < HTML_A_ATTRIBUTES; i++)
+ present[i] = NO;
+
+ if (name && *name) {
+ present[HTML_A_NAME] = YES;
+ value[HTML_A_NAME] = name;
+ }
+ if (href && *href) {
+ present[HTML_A_HREF] = YES;
+ value[HTML_A_HREF] = href;
+ }
+ if (linktype && *linktype) {
+ present[HTML_A_TYPE] = YES;
+ value[HTML_A_TYPE] = linktype;
+ }
+
+ (*obj->isa->start_element) (obj, HTML_A, present, value, tag_charset, 0);
+}
+
+void HTStartIsIndex(HTStructured * obj, const char *prompt,
+ const char *href)
+{
+ BOOL present[HTML_ISINDEX_ATTRIBUTES];
+ const char *value[HTML_ISINDEX_ATTRIBUTES];
+ int i;
+
+ for (i = 0; i < HTML_ISINDEX_ATTRIBUTES; i++)
+ present[i] = NO;
+
+ if (prompt && *prompt) {
+ present[HTML_ISINDEX_PROMPT] = YES;
+ value[HTML_ISINDEX_PROMPT] = (const char *) prompt;
+ }
+ if (href) {
+ present[HTML_ISINDEX_HREF] = YES;
+ value[HTML_ISINDEX_HREF] = (const char *) href;
+ }
+
+ (*obj->isa->start_element) (obj, HTML_ISINDEX, present, value, -1, 0);
+}
diff --git a/WWW/Library/Implementation/HTMLDTD.h b/WWW/Library/Implementation/HTMLDTD.h
new file mode 100644
index 0000000..10b0308
--- /dev/null
+++ b/WWW/Library/Implementation/HTMLDTD.h
@@ -0,0 +1,97 @@
+/*
+ * $LynxId: HTMLDTD.h,v 1.32 2008/07/06 17:38:13 tom Exp $
+ *
+ The HTML DTD -- software interface in libwww
+ HTML DTD - SOFTWARE INTERFACE
+
+ SGML purists should excuse the use of the term "DTD" in this file to
+ represent DTD-related information which is not exactly a DTD itself.
+
+ The C modular structure doesn't work very well here, as the dtd is
+ partly in the .h and partly in the .c which are not very independent.
+ Tant pis.
+
+ */
+#ifndef HTMLDTD_H
+#define HTMLDTD_H
+
+#include <SGML.h>
+#include <HTFont.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Valid name chars for tag parsing.
+ */
+#define IsNmStart(c) (isalpha(UCH(c)))
+#define IsNmChar(c) (isalnum(UCH(c)) || \
+ c == '_' || c=='-' || c == '.' || c==':')
+#define ReallyEmptyTagNum(e) ((HTML_dtd.tags[e].contents == SGML_EMPTY) && \
+ !(HTML_dtd.tags[e].flags & Tgf_nreie))
+#define ReallyEmptyTag(t) ((t->contents == SGML_EMPTY) && \
+ !(t->flags & Tgf_nreie))
+
+#include <hdr_HTMLDTD.h>
+
+#ifdef USE_PRETTYSRC
+/* values of HTML attributes' types */
+#define HTMLA_NORMAL 0 /* nothing specific */
+#define HTMLA_ANAME 1 /* anchor name - 'id' or a's 'name' */
+#define HTMLA_HREF 2 /* href */
+#define HTMLA_CLASS 4 /* class name. */
+#define HTMLA_AUXCLASS 8 /* attribute, the value of which also designates
+ a class name */
+#endif
+ extern const SGML_dtd HTML_dtd;
+
+ extern void HTSwitchDTD(int new_flag);
+
+ extern HTTag HTTag_unrecognized;
+ extern HTTag HTTag_mixedObject;
+
+/*
+
+Start anchor element
+
+ It is kinda convenient to have a particular routine for starting an anchor
+ element, as everything else for HTML is simple anyway.
+
+ ON ENTRY
+
+ targetstream points to a structured stream object.
+
+ name and href point to attribute strings or are NULL if the attribute is
+ to be omitted.
+
+ */
+ extern void HTStartAnchor(HTStructured * targetstream, const char *name,
+ const char *href);
+
+ extern void HTStartAnchor5(HTStructured * targetstream, const char *name,
+ const char *href,
+ const char *linktype,
+ int tag_charset);
+
+/*
+
+Start IsIndex element - FM
+
+ It is kinda convenient to have a particular routine for starting an IsIndex
+ element with the prompt and/or href (action) attributes specified.
+
+ ON ENTRY
+
+ targetstream points to a structured stream object.
+
+ prompt and href point to attribute strings or are NULL if the attribute is
+ to be omitted.
+
+ */
+ extern void HTStartIsIndex(HTStructured * targetstream, const char *prompt,
+ const char *href);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* HTMLDTD_H */
diff --git a/WWW/Library/Implementation/HTMLGen.c b/WWW/Library/Implementation/HTMLGen.c
new file mode 100644
index 0000000..c63723c
--- /dev/null
+++ b/WWW/Library/Implementation/HTMLGen.c
@@ -0,0 +1,738 @@
+/*
+ * $LynxId: HTMLGen.c,v 1.46 2020/01/21 22:02:35 tom Exp $
+ *
+ * HTML Generator
+ * ==============
+ *
+ * This version of the HTML object sends HTML markup to the output stream.
+ *
+ * Bugs: Line wrapping is not done at all.
+ * All data handled as PCDATA.
+ * Should convert old XMP, LISTING and PLAINTEXT to PRE.
+ *
+ * It is not obvious to me right now whether the HEAD should be generated
+ * from the incoming data or the anchor. Currently it is from the former
+ * which is cleanest.
+ */
+
+#define HTSTREAM_INTERNAL 1
+
+#include <HTUtils.h>
+
+#define BUFFER_SIZE 200 /* Line buffer attempts to make neat breaks */
+#define MAX_CLEANNESS 20
+
+/* Implements:
+*/
+#include <HTMLGen.h>
+
+#include <HTMLDTD.h>
+#include <HTStream.h>
+#include <SGML.h>
+#include <HTFormat.h>
+
+#ifdef USE_COLOR_STYLE
+#include <LYCharUtils.h>
+#include <AttrList.h>
+#include <LYHash.h>
+#include <LYStyle.h>
+#endif
+
+#include <LYGlobalDefs.h>
+#include <LYCurses.h>
+#include <LYLeaks.h>
+
+#ifdef USE_COLOR_STYLE
+char class_string[TEMPSTRINGSIZE + 1];
+
+static char *Style_className = NULL;
+static int hcode;
+#endif
+
+/* HTML Object
+ * -----------
+ */
+struct _HTStream {
+ const HTStreamClass *isa;
+ HTStream *target;
+ HTStreamClass targetClass; /* COPY for speed */
+};
+
+struct _HTStructured {
+ const HTStructuredClass *isa;
+ HTStream *target;
+ HTStreamClass targetClass; /* COPY for speed */
+
+ char buffer[BUFFER_SIZE + 1]; /* 1for NL */
+ int buffer_maxchars;
+ char *write_pointer;
+ char *line_break[MAX_CLEANNESS + 1];
+ int cleanness;
+ BOOL overflowed;
+ BOOL delete_line_break_char[MAX_CLEANNESS + 1];
+ BOOL preformatted;
+ BOOL escape_specials;
+ BOOL in_attrval;
+#ifdef USE_COLOR_STYLE
+ HText *text;
+#endif
+};
+
+/* Flush Buffer
+ * ------------
+ */
+
+static void flush_breaks(HTStructured * me)
+{
+ int i;
+
+ for (i = 0; i <= MAX_CLEANNESS; i++) {
+ me->line_break[i] = NULL;
+ }
+}
+
+static void HTMLGen_flush(HTStructured * me)
+{
+ (*me->targetClass.put_block) (me->target,
+ me->buffer,
+ (int) (me->write_pointer - me->buffer));
+ me->write_pointer = me->buffer;
+ flush_breaks(me);
+ me->cleanness = 0;
+ me->delete_line_break_char[0] = NO;
+}
+
+#ifdef USE_COLOR_STYLE
+/*
+ * We need to flush our buffer each time before we effect a color style change,
+ * this also relies on the subsequent stage not doing any buffering - this is
+ * currently true, in cases where it matters the target stream should be the
+ * HTPlain converter. The flushing currently prevents reasonable line breaking
+ * in lines with tags. Since color styles help visual scanning of displayed
+ * source lines, and long lines are wrapped in GridText anyway, this is
+ * probably acceptable (or even A Good Thing - more to see in one screenful).
+ * The pointer to the HText structure is initialized here before we effect the
+ * first style change. Getting it from the global HTMainText variable isn't
+ * very clean, since it relies on the fact that HText_new() has already been
+ * called for the current stream stack's document by the time we start
+ * processing the first element; we rely on HTMLGenerator's callers
+ * (HTMLParsedPresent in particular) to guarantee this when it matters.
+ * Normally the target stream will have been setup by HTPlainPresent, which
+ * does what we need in this respect. (A check whether we have the right
+ * output stream could be done by checking that targetClass.name is
+ * "PlainPresenter" or similar.)
+ *
+ * All special color style handling is only done if LYPreparsedSource is set.
+ * We could always do it for displaying source generated by an internal
+ * gateway, but this makes the rule more simple for the user: color styles are
+ * applied to html source only with the -preparsed flag. - kw
+ */
+static void do_cstyle_flush(HTStructured * me)
+{
+ if (!me->text && LYPreparsedSource) {
+ me->text = HTMainText;
+ }
+ if (me->text) {
+ HTMLGen_flush(me);
+ }
+}
+#endif /* COLOR_STYLE */
+
+/* Weighted optional line break
+ *
+ * We keep track of all the breaks for when we chop the line
+ */
+
+static void allow_break(HTStructured * me, int new_cleanness, int dlbc)
+{
+ if (dlbc && me->write_pointer == me->buffer)
+ dlbc = NO;
+ me->line_break[new_cleanness] =
+ dlbc ? me->write_pointer - 1 /* Point to space */
+ : me->write_pointer; /* point to gap */
+ me->delete_line_break_char[new_cleanness] = (BOOLEAN) dlbc;
+ if (new_cleanness >= me->cleanness &&
+ (me->overflowed || me->line_break[new_cleanness] > me->buffer))
+ me->cleanness = new_cleanness;
+}
+
+/* Character handling
+ * ------------------
+ *
+ * The tricky bits are the line break handling. This attempts
+ * to synchrononise line breaks on sentence or phrase ends. This
+ * is important if one stores SGML files in a line-oriented code
+ * repository, so that if a small change is made, line ends don't
+ * shift in a ripple-through to apparently change a large part of the
+ * file. We give extra "cleanness" to spaces appearing directly
+ * after periods (full stops), [semi]colons and commas.
+ * This should make the source files easier to read and modify
+ * by hand, too, though this is not a primary design consideration. TBL
+ */
+static void HTMLGen_put_character(HTStructured * me, int c)
+{
+ if (me->escape_specials && UCH(c) < 32) {
+ if (c == HT_NON_BREAK_SPACE || c == HT_EN_SPACE ||
+ c == LY_SOFT_HYPHEN) { /* recursion... */
+ HTMLGen_put_character(me, '&');
+ HTMLGen_put_character(me, '#');
+ HTMLGen_put_character(me, 'x');
+ switch (c) {
+ case HT_NON_BREAK_SPACE: /* &#xA0; */
+ HTMLGen_put_character(me, 'A');
+ HTMLGen_put_character(me, '0');
+ break;
+ case HT_EN_SPACE: /* &#x2002; */
+ HTMLGen_put_character(me, '2');
+ HTMLGen_put_character(me, '0');
+ HTMLGen_put_character(me, '0');
+ HTMLGen_put_character(me, '2');
+ break;
+ case LY_SOFT_HYPHEN: /* &#xAD; */
+ HTMLGen_put_character(me, 'A');
+ HTMLGen_put_character(me, 'D');
+ break;
+ }
+ c = ';';
+ }
+ }
+
+ *me->write_pointer++ = (char) c;
+
+ if (c == '\n') {
+ HTMLGen_flush(me);
+ return;
+ }
+
+ /* Figure our whether we can break at this point
+ */
+ if ((!me->preformatted && (c == ' ' || c == '\t'))) {
+ int new_cleanness = 3;
+
+ if (me->write_pointer > (me->buffer + 1)) {
+ char delims[5];
+ char *p;
+
+ strcpy(delims, ",;:."); /* @@ english bias */
+ p = StrChr(delims, me->write_pointer[-2]);
+ if (p)
+ new_cleanness = (int) (p - delims + 6);
+ if (!me->in_attrval)
+ new_cleanness += 10;
+ }
+ allow_break(me, new_cleanness, YES);
+ }
+
+ /*
+ * Flush buffer out when full, or whenever the line is over the nominal
+ * maximum and we can break at all
+ */
+ if (me->write_pointer >= me->buffer + me->buffer_maxchars ||
+ (me->overflowed && me->cleanness)) {
+ if (me->cleanness) {
+ char line_break_char = me->line_break[me->cleanness][0];
+ char *saved = me->line_break[me->cleanness];
+
+ if (me->delete_line_break_char[me->cleanness])
+ saved++;
+ me->line_break[me->cleanness][0] = '\n';
+ (*me->targetClass.put_block) (me->target,
+ me->buffer,
+ (int) (me->line_break[me->cleanness] -
+ me->buffer + 1));
+ me->line_break[me->cleanness][0] = line_break_char;
+ { /* move next line in */
+ char *p = saved;
+ char *q;
+
+ for (q = me->buffer; p < me->write_pointer;)
+ *q++ = *p++;
+ }
+ me->cleanness = 0;
+ /* Now we have to check whether there are any perfectly good breaks
+ * which weren't good enough for the last line but may be good
+ * enough for the next
+ */
+ {
+ int i;
+
+ for (i = 0; i <= MAX_CLEANNESS; i++) {
+ if (me->line_break[i] != NULL &&
+ me->line_break[i] > saved) {
+ me->line_break[i] = me->line_break[i] -
+ (saved - me->buffer);
+ me->cleanness = i;
+ } else {
+ me->line_break[i] = NULL;
+ }
+ }
+ }
+
+ me->delete_line_break_char[0] = 0;
+ me->write_pointer = me->write_pointer - (saved - me->buffer);
+ me->overflowed = NO;
+
+ } else {
+ (*me->targetClass.put_block) (me->target,
+ me->buffer,
+ me->buffer_maxchars);
+ me->write_pointer = me->buffer;
+ flush_breaks(me);
+ me->overflowed = YES;
+ }
+ }
+}
+
+/* String handling
+ * ---------------
+ */
+static void HTMLGen_put_string(HTStructured * me, const char *s)
+{
+ const char *p;
+
+ for (p = s; *p; p++)
+ HTMLGen_put_character(me, *p);
+}
+
+static void HTMLGen_write(HTStructured * me, const char *s,
+ int l)
+{
+ const char *p;
+
+ for (p = s; p < (s + l); p++)
+ HTMLGen_put_character(me, *p);
+}
+
+/* Start Element
+ * -------------
+ *
+ * Within the opening tag, there may be spaces and the line may be broken at
+ * these spaces.
+ */
+static int HTMLGen_start_element(HTStructured * me, int element_number,
+ const BOOL *present,
+ STRING2PTR value,
+ int charset GCC_UNUSED,
+ char **insert GCC_UNUSED)
+{
+ int i;
+ BOOL was_preformatted = me->preformatted;
+ HTTag *tag = &HTML_dtd.tags[element_number];
+
+#if defined(USE_COLOR_STYLE)
+ char *title = NULL;
+ char *title_tmp = NULL;
+ const char *name;
+
+ if (LYPreparsedSource && (name = tag->name) != 0) {
+ char *myHash = NULL;
+
+ /*
+ * Same logic as in HTML_start_element, copied from there. - kw
+ */
+ HTSprintf(&Style_className, ";%s", name);
+ StrAllocCopy(myHash, name);
+ if (class_string[0]) {
+ StrAllocCat(myHash, ".");
+ StrAllocCat(myHash, class_string);
+ HTSprintf(&Style_className, ".%s", class_string);
+ }
+ class_string[0] = '\0';
+ strtolower(myHash);
+ hcode = color_style_1(myHash);
+ strtolower(Style_className);
+
+ if (TRACE_STYLE) {
+ fprintf(tfp, "CSSTRIM:%s -> %d", myHash, hcode);
+ if (!hashStyles[hcode].used) {
+ char *rp = strrchr(myHash, '.');
+
+ fprintf(tfp, " (undefined) %s\n", myHash);
+ if (rp) {
+ int hcd;
+
+ *rp = '\0'; /* trim the class */
+ hcd = color_style_1(myHash);
+ fprintf(tfp, "CSS:%s -> %d", myHash, hcd);
+ if (!hashStyles[hcd].used)
+ fprintf(tfp, " (undefined) %s\n", myHash);
+ else
+ fprintf(tfp, " ca=%d\n", hashStyles[hcd].color);
+ }
+ } else
+ fprintf(tfp, " ca=%d\n", hashStyles[hcode].color);
+ }
+
+ if (displayStyles[element_number + STARTAT].color > -2) {
+ CTRACE2(TRACE_STYLE,
+ (tfp, "CSSTRIM: start_element: top <%s>\n",
+ tag->name));
+ do_cstyle_flush(me);
+ HText_characterStyle(me->text, hcode, 1);
+ }
+ FREE(myHash);
+ }
+#endif /* USE_COLOR_STYLE */
+ me->preformatted = YES; /* free text within tags */
+ HTMLGen_put_character(me, '<');
+ HTMLGen_put_string(me, tag->name);
+ if (present) {
+ BOOL had_attr = NO;
+
+ for (i = 0; i < tag->number_of_attributes; i++) {
+ if (present[i]) {
+ had_attr = YES;
+ HTMLGen_put_character(me, ' ');
+ allow_break(me, 11, YES);
+#ifdef USE_COLOR_STYLE
+ /*
+ * Try to mimic HTML_start_element's special handling for
+ * HTML_LINK. If applicable, color the displayed attribute /
+ * value pairs differently. - kw
+ */
+ if (LYPreparsedSource &&
+ element_number == HTML_LINK && !title &&
+ present[HTML_LINK_CLASS] && *value[HTML_LINK_CLASS] &&
+ !present[HTML_LINK_REV] &&
+ (present[HTML_LINK_REL] || present[HTML_LINK_HREF])) {
+ if (present[HTML_LINK_TITLE] && *value[HTML_LINK_TITLE]) {
+ StrAllocCopy(title, value[HTML_LINK_TITLE]);
+ LYTrimHead(title);
+ LYTrimTail(title);
+ }
+ if ((!title || *title == '\0') && present[HTML_LINK_REL]) {
+ StrAllocCopy(title, value[HTML_LINK_REL]);
+ }
+ if (title && *title) {
+ HTSprintf0(&title_tmp, "link.%s.%s",
+ value[HTML_LINK_CLASS], title);
+ CTRACE2(TRACE_STYLE,
+ (tfp, "CSSTRIM:link=%s\n", title_tmp));
+
+ do_cstyle_flush(me);
+ HText_characterStyle(me->text,
+ color_style_1(title_tmp), 1);
+ }
+ }
+#endif
+ HTMLGen_put_string(me, tag->attributes[i].name);
+ if (value[i]) {
+ me->preformatted = was_preformatted;
+ me->in_attrval = YES;
+ if (StrChr(value[i], '"') == NULL) {
+ HTMLGen_put_string(me, "=\"");
+ HTMLGen_put_string(me, value[i]);
+ HTMLGen_put_character(me, '"');
+ } else if (StrChr(value[i], '\'') == NULL) {
+ HTMLGen_put_string(me, "='");
+ HTMLGen_put_string(me, value[i]);
+ HTMLGen_put_character(me, '\'');
+ } else { /* attribute value has both kinds of quotes */
+ const char *p;
+
+ HTMLGen_put_string(me, "=\"");
+ for (p = value[i]; *p; p++) {
+ if (*p != '"') {
+ HTMLGen_put_character(me, *p);
+ } else {
+ HTMLGen_put_string(me, "&#34;");
+ }
+ }
+ HTMLGen_put_character(me, '"');
+ }
+ me->preformatted = YES;
+ me->in_attrval = NO;
+ }
+ }
+ }
+#ifdef USE_COLOR_STYLE
+ if (had_attr && LYPreparsedSource && element_number == HTML_LINK) {
+ /*
+ * Clean up after special HTML_LINK handling - kw
+ */
+ if (title && *title) {
+ do_cstyle_flush(me);
+ HText_characterStyle(me->text, color_style_1(title_tmp), 0);
+ FREE(title_tmp);
+ }
+ FREE(title);
+ }
+#endif
+ if (had_attr)
+ allow_break(me, 12, NO);
+ }
+ HTMLGen_put_string(me, ">"); /* got rid of \n LJM */
+
+ /*
+ * Make very specific HTML assumption that PRE can't be nested!
+ */
+ me->preformatted = (BOOL) ((element_number == HTML_PRE)
+ ? YES
+ : was_preformatted);
+
+ /*
+ * Can break after element start.
+ */
+ if (!me->preformatted && tag->contents != SGML_EMPTY) {
+ if (tag->contents == SGML_ELEMENT)
+ allow_break(me, 15, NO);
+ else
+ allow_break(me, 2, NO);
+ }
+#if defined(USE_COLOR_STYLE)
+ /*
+ * Same logic as in HTML_start_element, copied from there. - kw
+ */
+
+ /* end really empty tags straight away */
+ if (LYPreparsedSource && ReallyEmptyTagNum(element_number)) {
+ CTRACE2(TRACE_STYLE,
+ (tfp, "STYLE:begin_element:ending EMPTY element style\n"));
+ do_cstyle_flush(me);
+ HText_characterStyle(me->text, hcode, STACK_OFF);
+ TrimColorClass(tag->name, Style_className, &hcode);
+ }
+#endif /* USE_COLOR_STYLE */
+ if (element_number == HTML_OBJECT && tag->contents == SGML_LITTERAL) {
+ /*
+ * These conditions only approximate the ones used in HTML.c. Let our
+ * SGML parser know that further content is to be parsed normally not
+ * literally. - kw
+ */
+ if (!present) {
+ return HT_PARSER_OTHER_CONTENT;
+ } else if (!present[HTML_OBJECT_DECLARE] &&
+ !(present[HTML_OBJECT_NAME] &&
+ value[HTML_OBJECT_NAME] && *value[HTML_OBJECT_NAME])) {
+ if (present[HTML_OBJECT_SHAPES] ||
+ !(present[HTML_OBJECT_USEMAP] &&
+ value[HTML_OBJECT_USEMAP] && *value[HTML_OBJECT_USEMAP]))
+ return HT_PARSER_OTHER_CONTENT;
+ }
+ }
+ return HT_OK;
+}
+
+/* End Element
+ * -----------
+ *
+ * When we end an element, the style must be returned to that in effect before
+ * that element. Note that anchors (etc?) don't have an associated style, so
+ * that we must scan down the stack for an element with a defined style. (In
+ * fact, the styles should be linked to the whole stack not just the top one.)
+ * TBL 921119
+ */
+static int HTMLGen_end_element(HTStructured * me, int element_number,
+ char **insert GCC_UNUSED)
+{
+ if (!me->preformatted &&
+ HTML_dtd.tags[element_number].contents != SGML_EMPTY) {
+ /*
+ * Can break before element end.
+ */
+ if (HTML_dtd.tags[element_number].contents == SGML_ELEMENT)
+ allow_break(me, 14, NO);
+ else
+ allow_break(me, 1, NO);
+ }
+ HTMLGen_put_string(me, "</");
+ HTMLGen_put_string(me, HTML_dtd.tags[element_number].name);
+ HTMLGen_put_character(me, '>');
+ if (element_number == HTML_PRE) {
+ me->preformatted = NO;
+ }
+#ifdef USE_COLOR_STYLE
+ /*
+ * Same logic as in HTML_end_element, copied from there. - kw
+ */
+ TrimColorClass(HTML_dtd.tags[element_number].name,
+ Style_className, &hcode);
+
+ if (LYPreparsedSource && !ReallyEmptyTagNum(element_number)) {
+ CTRACE2(TRACE_STYLE,
+ (tfp, "STYLE:end_element: ending non-EMPTY style\n"));
+ do_cstyle_flush(me);
+ HText_characterStyle(me->text, hcode, STACK_OFF);
+ }
+#endif /* USE_COLOR_STYLE */
+ return HT_OK;
+}
+
+/* Expanding entities
+ * ------------------
+ *
+ */
+static int HTMLGen_put_entity(HTStructured * me, int entity_number)
+{
+ int nent = (int) HTML_dtd.number_of_entities;
+
+ HTMLGen_put_character(me, '&');
+ if (entity_number < nent) {
+ HTMLGen_put_string(me, HTML_dtd.entity_names[entity_number]);
+ }
+ HTMLGen_put_character(me, ';');
+ return HT_OK;
+}
+
+/* Free an HTML object
+ * -------------------
+ *
+ */
+static void HTMLGen_free(HTStructured * me)
+{
+ (*me->targetClass.put_character) (me->target, '\n');
+ HTMLGen_flush(me);
+ (*me->targetClass._free) (me->target); /* ripple through */
+#ifdef USE_COLOR_STYLE
+ FREE(Style_className);
+#endif
+ FREE(me);
+}
+
+static void PlainToHTML_free(HTStructured * me)
+{
+ HTMLGen_end_element(me, HTML_PRE, 0);
+ HTMLGen_free(me);
+}
+
+static void HTMLGen_abort(HTStructured * me, HTError e GCC_UNUSED)
+{
+ HTMLGen_free(me);
+#ifdef USE_COLOR_STYLE
+ FREE(Style_className);
+#endif
+}
+
+static void PlainToHTML_abort(HTStructured * me, HTError e GCC_UNUSED)
+{
+ PlainToHTML_free(me);
+}
+
+/* Structured Object Class
+ * -----------------------
+ */
+static const HTStructuredClass HTMLGeneration = /* As opposed to print etc */
+{
+ "HTMLGen",
+ HTMLGen_free,
+ HTMLGen_abort,
+ HTMLGen_put_character, HTMLGen_put_string, HTMLGen_write,
+ HTMLGen_start_element, HTMLGen_end_element,
+ HTMLGen_put_entity
+};
+
+/* Subclass-specific Methods
+ * -------------------------
+ */
+HTStructured *HTMLGenerator(HTStream *output)
+{
+ HTStructured *me = (HTStructured *) malloc(sizeof(*me));
+
+ if (me == NULL)
+ outofmem(__FILE__, "HTMLGenerator");
+
+ me->isa = &HTMLGeneration;
+
+ me->target = output;
+ me->targetClass = *me->target->isa; /* Copy pointers to routines for speed */
+
+ me->write_pointer = me->buffer;
+ flush_breaks(me);
+ me->line_break[0] = me->buffer;
+ me->cleanness = 0;
+ me->overflowed = NO;
+ me->delete_line_break_char[0] = NO;
+ me->preformatted = NO;
+ me->in_attrval = NO;
+
+ /*
+ * For what line length should we attempt to wrap ? - kw
+ */
+ if (!LYPreparsedSource) {
+ me->buffer_maxchars = 80; /* work as before - kw */
+ } else if (dump_output_width > 1) {
+ me->buffer_maxchars = dump_output_width; /* try to honor -width - kw */
+ } else if (dump_output_immediately) {
+ me->buffer_maxchars = 80; /* try to honor -width - kw */
+ } else {
+ me->buffer_maxchars = (LYcolLimit - 1);
+ if (me->buffer_maxchars < 38) /* too narrow, let GridText deal */
+ me->buffer_maxchars = 40;
+ }
+ if (me->buffer_maxchars > 900) /* likely not true - kw */
+ me->buffer_maxchars = 78;
+ if (me->buffer_maxchars > BUFFER_SIZE) /* must not be larger! */
+ me->buffer_maxchars = BUFFER_SIZE - 2;
+
+ /*
+ * If dump_output_immediately is set, there likely isn't anything after
+ * this stream to interpret the Lynx special chars. Also if they get
+ * displayed via HTPlain, that will probably make non-breaking space chars
+ * etc. invisible. So let's translate them to numerical character
+ * references. For debugging purposes we'll use the new hex format.
+ */
+ me->escape_specials = LYPreparsedSource;
+
+#ifdef USE_COLOR_STYLE
+ me->text = NULL; /* Will be initialized when first needed. - kw */
+ FREE(Style_className);
+ class_string[0] = '\0';
+#endif /* COLOR_STYLE */
+
+ return me;
+}
+
+/* Stream Object Class
+ * -------------------
+ *
+ * This object just converts a plain text stream into HTML
+ * It is officially a structured stream but only the stream bits exist.
+ * This is just the easiest way of typecasting all the routines.
+ */
+static const HTStructuredClass PlainToHTMLConversion =
+{
+ "plaintexttoHTML",
+ HTMLGen_free,
+ PlainToHTML_abort,
+ HTMLGen_put_character,
+ HTMLGen_put_string,
+ HTMLGen_write,
+ NULL, /* Structured stuff */
+ NULL,
+ NULL
+};
+
+/* HTConverter from plain text to HTML Stream
+ * ------------------------------------------
+ */
+HTStream *HTPlainToHTML(HTPresentation *pres GCC_UNUSED,
+ HTParentAnchor *anchor GCC_UNUSED,
+ HTStream *sink)
+{
+ HTStructured *me = (HTStructured *) malloc(sizeof(*me));
+
+ if (me == NULL)
+ outofmem(__FILE__, "PlainToHTML");
+
+ me->isa = (const HTStructuredClass *) &PlainToHTMLConversion;
+
+ /*
+ * Copy pointers to routines for speed.
+ */
+ me->target = sink;
+ me->targetClass = *me->target->isa;
+ me->write_pointer = me->buffer;
+ flush_breaks(me);
+ me->cleanness = 0;
+ me->overflowed = NO;
+ me->delete_line_break_char[0] = NO;
+ /* try to honor -width - kw */
+ me->buffer_maxchars = (dump_output_width > 1 ?
+ dump_output_width : 80);
+
+ HTMLGen_put_string(me, "<HTML>\n<BODY>\n<PRE>\n");
+ me->preformatted = YES;
+ me->escape_specials = NO;
+ me->in_attrval = NO;
+ return (HTStream *) me;
+}
diff --git a/WWW/Library/Implementation/HTMLGen.h b/WWW/Library/Implementation/HTMLGen.h
new file mode 100644
index 0000000..f2db3d4
--- /dev/null
+++ b/WWW/Library/Implementation/HTMLGen.h
@@ -0,0 +1,26 @@
+/* /Net/dxcern/userd/timbl/hypertext/WWW/Library/Implementation/HTMLGen.html
+ HTML GENERATOR
+
+ This module converts structed stream into stream. That is, given a stream
+ to write to, it will give you a structured stream to
+
+ */
+#ifndef HTMLGEN_H
+#define HTMLGEN_H
+
+#include <HTML.h>
+#include <HTStream.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ extern HTStructured *HTMLGenerator(HTStream *output);
+
+ extern HTStream *HTPlainToHTML(HTPresentation *pres,
+ HTParentAnchor *anchor,
+ HTStream *sink);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* HTMLGEN_H */
diff --git a/WWW/Library/Implementation/HTNews.c b/WWW/Library/Implementation/HTNews.c
new file mode 100644
index 0000000..a1b94dc
--- /dev/null
+++ b/WWW/Library/Implementation/HTNews.c
@@ -0,0 +1,3147 @@
+/*
+ * $LynxId: HTNews.c,v 1.81 2022/04/01 00:18:22 tom Exp $
+ *
+ * NEWS ACCESS HTNews.c
+ * ===========
+ *
+ * History:
+ * 26 Sep 90 Written TBL
+ * 29 Nov 91 Downgraded to C, for portable implementation.
+ */
+
+#include <HTUtils.h> /* Coding convention macros */
+
+#ifndef DISABLE_NEWS
+
+/* Implements:
+*/
+#include <HTNews.h>
+
+#include <HTCJK.h>
+#include <HTMIME.h>
+#include <HTFont.h>
+#include <HTFormat.h>
+#include <HTTCP.h>
+#include <LYUtils.h>
+#include <LYStrings.h>
+
+#define NEWS_PORT 119 /* See rfc977 */
+#define SNEWS_PORT 563 /* See Lou Montulli */
+#define APPEND /* Use append methods */
+int HTNewsChunkSize = 30; /* Number of articles for quick display */
+int HTNewsMaxChunk = 40; /* Largest number of articles in one window */
+
+#ifndef DEFAULT_NEWS_HOST
+#define DEFAULT_NEWS_HOST "news"
+#endif /* DEFAULT_NEWS_HOST */
+
+#ifndef NEWS_SERVER_FILE
+#define NEWS_SERVER_FILE "/usr/local/lib/rn/server"
+#endif /* NEWS_SERVER_FILE */
+
+#ifndef NEWS_AUTH_FILE
+#define NEWS_AUTH_FILE ".newsauth"
+#endif /* NEWS_AUTH_FILE */
+
+#ifdef USE_SSL
+
+#if defined(LIBRESSL_VERSION_NUMBER)
+/* OpenSSL and LibreSSL version numbers do not correspond */
+#elif (OPENSSL_VERSION_NUMBER >= 0x10100000L)
+#undef SSL_load_error_strings
+#define SSL_load_error_strings() /* nothing */
+#endif
+
+static SSL *Handle = NULL;
+static int channel_s = 1;
+
+#define NEWS_NETWRITE(sock, buff, size) \
+ ((Handle != NULL) \
+ ? SSL_write(Handle, buff, size) \
+ : NETWRITE(sock, buff, size))
+#define NEWS_NETCLOSE(sock) \
+ { \
+ if ((int)(sock) >= 0) { \
+ (void)NETCLOSE(sock); \
+ } \
+ if (Handle != NULL) { \
+ SSL_free(Handle); \
+ Handle = NULL; \
+ } \
+ }
+static int HTNewsGetCharacter(void);
+
+#define NEXT_CHAR HTNewsGetCharacter()
+#else
+#define NEWS_NETWRITE NETWRITE
+#define NEWS_NETCLOSE NETCLOSE
+#define NEXT_CHAR HTGetCharacter()
+#endif /* USE_SSL */
+
+#include <HTML.h>
+#include <HTAccess.h>
+#include <HTParse.h>
+#include <HTFormat.h>
+#include <HTAlert.h>
+
+#include <LYNews.h>
+#include <LYGlobalDefs.h>
+#include <LYLeaks.h>
+
+#define SnipIn(d,fmt,len,s) sprintf(d, fmt, (int)sizeof(d)-len, s)
+#define SnipIn2(d,fmt,tag,len,s) sprintf(d, fmt, tag, (int)sizeof(d)-len, s)
+
+struct _HTStructured {
+ const HTStructuredClass *isa;
+ /* ... */
+};
+
+#define LINE_LENGTH 512 /* Maximum length of line of ARTICLE etc */
+#define GROUP_NAME_LENGTH 256 /* Maximum length of group name */
+
+/*
+ * Module-wide variables.
+ */
+char *HTNewsHost = NULL; /* Default host */
+static char *NewsHost = NULL; /* Current host */
+static char *NewsHREF = NULL; /* Current HREF prefix */
+static int s; /* Socket for NewsHost */
+static int HTCanPost = FALSE; /* Current POST permission */
+static char response_text[LINE_LENGTH + 1]; /* Last response */
+
+static HTStructured *target; /* The output sink */
+static HTStructuredClass targetClass; /* Copy of fn addresses */
+static HTStream *rawtarget = NULL; /* The output sink for rawtext */
+static HTStreamClass rawtargetClass; /* Copy of fn addresses */
+static int diagnostic; /* level: 0=none 2=source */
+static BOOL rawtext = NO; /* Flag: HEAD or -mime_headers */
+static HTList *NNTP_AuthInfo = NULL; /* AUTHINFO database */
+static char *name = NULL;
+static char *address = NULL;
+static char *dbuf = NULL; /* dynamic buffer for long messages etc. */
+
+#define PUTC(c) (*targetClass.put_character)(target, c)
+#define PUTS(s) (*targetClass.put_string)(target, s)
+#define RAW_PUTS(s) (*rawtargetClass.put_string)(rawtarget, s)
+#define START(e) (*targetClass.start_element)(target, e, 0, 0, -1, 0)
+#define END(e) (*targetClass.end_element)(target, e, 0)
+#define MAYBE_END(e) if (HTML_dtd.tags[e].contents != SGML_EMPTY) \
+ (*targetClass.end_element)(target, e, 0)
+#define FREE_TARGET if (rawtext) (*rawtargetClass._free)(rawtarget); \
+ else (*targetClass._free)(target)
+#define ABORT_TARGET if (rawtext) (*rawtargetClass._abort)(rawtarget, NULL); \
+ else (*targetClass._abort)(target, NULL)
+
+typedef struct _NNTPAuth {
+ char *host;
+ char *user;
+ char *pass;
+} NNTPAuth;
+
+#ifdef LY_FIND_LEAKS
+static void free_news_globals(void)
+{
+ if (s >= 0) {
+ NEWS_NETCLOSE(s);
+ s = -1;
+ }
+ FREE(HTNewsHost);
+ FREE(NewsHost);
+ FREE(NewsHREF);
+ FREE(name);
+ FREE(address);
+ FREE(dbuf);
+}
+#endif /* LY_FIND_LEAKS */
+
+static void free_NNTP_AuthInfo(void)
+{
+ HTList *cur = NNTP_AuthInfo;
+ NNTPAuth *auth = NULL;
+
+ if (!cur)
+ return;
+
+ while (NULL != (auth = (NNTPAuth *) HTList_nextObject(cur))) {
+ FREE(auth->host);
+ FREE(auth->user);
+ FREE(auth->pass);
+ FREE(auth);
+ }
+ HTList_delete(NNTP_AuthInfo);
+ NNTP_AuthInfo = NULL;
+ return;
+}
+
+/*
+ * Initialize the authentication list by loading the user's $HOME/.newsauth
+ * file. That file is part of tin's configuration and is used by a few other
+ * programs.
+ */
+static void load_NNTP_AuthInfo(void)
+{
+ FILE *fp;
+ char fname[LY_MAXPATH];
+ char buffer[LINE_LENGTH + 1];
+
+ LYAddPathToHome(fname, sizeof(fname), NEWS_AUTH_FILE);
+
+ if ((fp = fopen(fname, "r")) != 0) {
+ while (fgets(buffer, (int) sizeof(buffer), fp) != 0) {
+ char the_host[LINE_LENGTH + 1];
+ char the_pass[LINE_LENGTH + 1];
+ char the_user[LINE_LENGTH + 1];
+
+ if (sscanf(buffer, "%s%s%s", the_host, the_pass, the_user) == 3
+ && strlen(the_host) != 0
+ && strlen(the_pass) != 0
+ && strlen(the_user) != 0) {
+ NNTPAuth *auth = typecalloc(NNTPAuth);
+
+ if (auth == NULL)
+ break;
+ StrAllocCopy(auth->host, the_host);
+ StrAllocCopy(auth->pass, the_pass);
+ StrAllocCopy(auth->user, the_user);
+
+ HTList_appendObject(NNTP_AuthInfo, auth);
+ }
+ }
+ fclose(fp);
+ }
+}
+
+const char *HTGetNewsHost(void)
+{
+ return HTNewsHost;
+}
+
+void HTSetNewsHost(const char *value)
+{
+ StrAllocCopy(HTNewsHost, value);
+}
+
+/* Initialisation for this module
+ * ------------------------------
+ *
+ * Except on the NeXT, we pick up the NewsHost name from
+ *
+ * 1. Environment variable NNTPSERVER
+ * 2. File NEWS_SERVER_FILE
+ * 3. Compilation time macro DEFAULT_NEWS_HOST
+ * 4. Default to "news"
+ *
+ * On the NeXT, we pick up the NewsHost name from, in order:
+ *
+ * 1. WorldWideWeb default "NewsHost"
+ * 2. Global default "NewsHost"
+ * 3. News default "NewsHost"
+ * 4. Compilation time macro DEFAULT_NEWS_HOST
+ * 5. Default to "news"
+ */
+static BOOL initialized = NO;
+static BOOL initialize(void)
+{
+#ifdef NeXTStep
+ char *cp = NULL;
+#endif
+
+ /*
+ * Get name of Host.
+ */
+#ifdef NeXTStep
+ if ((cp = NXGetDefaultValue("WorldWideWeb", "NewsHost")) == 0) {
+ if ((cp = NXGetDefaultValue("News", "NewsHost")) == 0) {
+ StrAllocCopy(HTNewsHost, DEFAULT_NEWS_HOST);
+ }
+ }
+ if (cp) {
+ StrAllocCopy(HTNewsHost, cp);
+ cp = NULL;
+ }
+#else
+ if (LYGetEnv("NNTPSERVER")) {
+ StrAllocCopy(HTNewsHost, LYGetEnv("NNTPSERVER"));
+ CTRACE((tfp, "HTNews: NNTPSERVER defined as `%s'\n",
+ HTNewsHost));
+ } else {
+ FILE *fp = fopen(NEWS_SERVER_FILE, TXT_R);
+
+ if (fp) {
+ char server_name[MAXHOSTNAMELEN + 1];
+
+ if (fgets(server_name, (int) sizeof server_name, fp) != NULL) {
+ char *p = StrChr(server_name, '\n');
+
+ if (p != NULL)
+ *p = '\0';
+ StrAllocCopy(HTNewsHost, server_name);
+ CTRACE((tfp, "HTNews: File %s defines news host as `%s'\n",
+ NEWS_SERVER_FILE, HTNewsHost));
+ }
+ fclose(fp);
+ }
+ }
+ if (!HTNewsHost)
+ StrAllocCopy(HTNewsHost, DEFAULT_NEWS_HOST);
+#endif /* NeXTStep */
+
+ s = -1; /* Disconnected */
+#ifdef LY_FIND_LEAKS
+ atexit(free_news_globals);
+#endif
+ return YES;
+}
+
+/* Send NNTP Command line to remote host & Check Response
+ * ------------------------------------------------------
+ *
+ * On entry,
+ * command points to the command to be sent, including CRLF, or is null
+ * pointer if no command to be sent.
+ * On exit,
+ * Negative status indicates transmission error, socket closed.
+ * Positive status is an NNTP status.
+ */
+static int response(char *command)
+{
+ int result;
+ char *p = response_text;
+ int ich;
+
+ if (command) {
+ int status;
+ int length = (int) strlen(command);
+
+ CTRACE((tfp, "NNTP command to be sent: %s", command));
+#ifdef NOT_ASCII
+ {
+ const char *p2;
+ char *q;
+ char ascii[LINE_LENGTH + 1];
+
+ for (p2 = command, q = ascii; *p2; p2++, q++) {
+ *q = TOASCII(*p2);
+ }
+ status = NEWS_NETWRITE(s, ascii, length);
+ }
+#else
+ status = (int) NEWS_NETWRITE(s, (char *) command, length);
+#endif /* NOT_ASCII */
+ if (status < 0) {
+ CTRACE((tfp, "HTNews: Unable to send command. Disconnecting.\n"));
+ NEWS_NETCLOSE(s);
+ s = -1;
+ return status;
+ } /* if bad status */
+ }
+ /* if command to be sent */
+ for (;;) {
+ ich = NEXT_CHAR;
+ if (((*p++ = (char) ich) == LF) ||
+ (p == &response_text[LINE_LENGTH])) {
+ *--p = '\0'; /* Terminate the string */
+ CTRACE((tfp, "NNTP Response: %s\n", response_text));
+ sscanf(response_text, "%d", &result);
+ return result;
+ }
+ /* if end of line */
+ if (ich == EOF) {
+ *(p - 1) = '\0';
+ if (interrupted_in_htgetcharacter) {
+ CTRACE((tfp,
+ "HTNews: Interrupted on read, closing socket %d\n",
+ s));
+ } else {
+ CTRACE((tfp, "HTNews: EOF on read, closing socket %d\n",
+ s));
+ }
+ NEWS_NETCLOSE(s); /* End of file, close socket */
+ s = -1;
+ if (interrupted_in_htgetcharacter) {
+ interrupted_in_htgetcharacter = 0;
+ return (HT_INTERRUPTED);
+ }
+ return ((int) EOF); /* End of file on response */
+ }
+ } /* Loop over characters */
+}
+
+/* Case insensitive string comparisons
+ * -----------------------------------
+ *
+ * On entry,
+ * template must be already in upper case.
+ * unknown may be in upper or lower or mixed case to match.
+ */
+static BOOL match(const char *unknown, const char *ctemplate)
+{
+ const char *u = unknown;
+ const char *t = ctemplate;
+
+ for (; *u && *t && (TOUPPER(*u) == *t); u++, t++) ; /* Find mismatch or end */
+ return (BOOL) (*t == 0); /* OK if end of template */
+}
+
+typedef enum {
+ NNTPAUTH_ERROR = 0, /* general failure */
+ NNTPAUTH_OK = 281, /* authenticated successfully */
+ NNTPAUTH_CLOSE = 502 /* server probably closed connection */
+} NNTPAuthResult;
+
+/*
+ * This function handles nntp authentication. - FM
+ */
+static NNTPAuthResult HTHandleAuthInfo(char *host)
+{
+ HTList *cur = NULL;
+ NNTPAuth *auth = NULL;
+ char *UserName = NULL;
+ char *PassWord = NULL;
+ char *msg = NULL;
+ char buffer[512];
+ int status, tries;
+
+ /*
+ * Make sure we have a host. - FM
+ */
+ if (isEmpty(host))
+ return NNTPAUTH_ERROR;
+
+ /*
+ * Check for an existing authorization entry. - FM
+ */
+ if (NNTP_AuthInfo == NULL) {
+ NNTP_AuthInfo = HTList_new();
+ load_NNTP_AuthInfo();
+#ifdef LY_FIND_LEAKS
+ atexit(free_NNTP_AuthInfo);
+#endif
+ }
+
+ cur = NNTP_AuthInfo;
+ while (NULL != (auth = (NNTPAuth *) HTList_nextObject(cur))) {
+ if (!strcmp(auth->host, host)) {
+ UserName = auth->user;
+ PassWord = auth->pass;
+ break;
+ }
+ }
+
+ /*
+ * Handle the username. - FM
+ */
+ buffer[sizeof(buffer) - 1] = '\0';
+ tries = 3;
+
+ while (tries) {
+ if (UserName == NULL) {
+ HTSprintf0(&msg, gettext("Username for news host '%s':"), host);
+ UserName = HTPrompt(msg, NULL);
+ FREE(msg);
+ if (!(UserName && *UserName)) {
+ FREE(UserName);
+ return NNTPAUTH_ERROR;
+ }
+ }
+ sprintf(buffer, "AUTHINFO USER %.*s%c%c",
+ (int) sizeof(buffer) - 17, UserName, CR, LF);
+ if ((status = response(buffer)) < 0) {
+ if (status == HT_INTERRUPTED)
+ _HTProgress(CONNECTION_INTERRUPTED);
+ else
+ HTAlert(FAILED_CONNECTION_CLOSED);
+ if (auth) {
+ if (auth->user != UserName) {
+ FREE(auth->user);
+ auth->user = UserName;
+ }
+ } else {
+ FREE(UserName);
+ }
+ return NNTPAUTH_CLOSE;
+ }
+ if (status == 281) {
+ /*
+ * Username is accepted and no password is required. - FM
+ */
+ if (auth) {
+ if (auth->user != UserName) {
+ FREE(auth->user);
+ auth->user = UserName;
+ }
+ } else {
+ /*
+ * Store the accepted username and no password. - FM
+ */
+ if ((auth = typecalloc(NNTPAuth)) != NULL) {
+ StrAllocCopy(auth->host, host);
+ auth->user = UserName;
+ HTList_appendObject(NNTP_AuthInfo, auth);
+ }
+ }
+ return NNTPAUTH_OK;
+ }
+ if (status != 381) {
+ /*
+ * Not success, nor a request for the password, so it must be an
+ * error. - FM
+ */
+ HTAlert(response_text);
+ tries--;
+ if ((tries > 0) && HTConfirm(gettext("Change username?"))) {
+ if (!auth || auth->user != UserName) {
+ FREE(UserName);
+ }
+ if ((UserName = HTPrompt(gettext("Username:"), UserName))
+ != NULL &&
+ *UserName) {
+ continue;
+ }
+ }
+ if (auth) {
+ if (auth->user != UserName) {
+ FREE(auth->user);
+ }
+ FREE(auth->pass);
+ }
+ FREE(UserName);
+ return NNTPAUTH_ERROR;
+ }
+ break;
+ }
+
+ if (status == 381) {
+ /*
+ * Handle the password. - FM
+ */
+ tries = 3;
+ while (tries) {
+ if (PassWord == NULL) {
+ HTSprintf0(&msg, gettext("Password for news host '%s':"), host);
+ PassWord = HTPromptPassword(msg, NULL);
+ FREE(msg);
+ if (!(PassWord && *PassWord)) {
+ FREE(PassWord);
+ return NNTPAUTH_ERROR;
+ }
+ }
+ sprintf(buffer, "AUTHINFO PASS %.*s%c%c",
+ (int) sizeof(buffer) - 17, PassWord, CR, LF);
+ if ((status = response(buffer)) < 0) {
+ if (status == HT_INTERRUPTED) {
+ _HTProgress(CONNECTION_INTERRUPTED);
+ } else {
+ HTAlert(FAILED_CONNECTION_CLOSED);
+ }
+ if (auth) {
+ if (auth->user != UserName) {
+ FREE(auth->user);
+ auth->user = UserName;
+ }
+ if (auth->pass != PassWord) {
+ FREE(auth->pass);
+ auth->pass = PassWord;
+ }
+ } else {
+ FREE(UserName);
+ FREE(PassWord);
+ }
+ return NNTPAUTH_CLOSE;
+ }
+ if (status == 502) {
+ /*
+ * That's what INN's nnrpd returns. It closes the connection
+ * after this. - kw
+ */
+ HTAlert(response_text);
+ if (auth) {
+ if (auth->user == UserName)
+ UserName = NULL;
+ FREE(auth->user);
+ if (auth->pass == PassWord)
+ PassWord = NULL;
+ FREE(auth->pass);
+ }
+ FREE(UserName);
+ FREE(PassWord);
+ return NNTPAUTH_CLOSE;
+ }
+ if (status == 281) {
+ /*
+ * Password also is accepted, and everything has been stored.
+ * - FM
+ */
+ if (auth) {
+ if (auth->user != UserName) {
+ FREE(auth->user);
+ auth->user = UserName;
+ }
+ if (auth->pass != PassWord) {
+ FREE(auth->pass);
+ auth->pass = PassWord;
+ }
+ } else {
+ if ((auth = typecalloc(NNTPAuth)) != NULL) {
+ StrAllocCopy(auth->host, host);
+ auth->user = UserName;
+ auth->pass = PassWord;
+ HTList_appendObject(NNTP_AuthInfo, auth);
+ }
+ }
+ return NNTPAUTH_OK;
+ }
+ /*
+ * Not success, so it must be an error. - FM
+ */
+ HTAlert(response_text);
+ if (!auth || auth->pass != PassWord) {
+ FREE(PassWord);
+ } else {
+ PassWord = NULL;
+ }
+ tries--;
+ if ((tries > 0) && HTConfirm(gettext("Change password?"))) {
+ continue;
+ }
+ if (auth) {
+ if (auth->user == UserName)
+ UserName = NULL;
+ FREE(auth->user);
+ FREE(auth->pass);
+ }
+ FREE(UserName);
+ break;
+ }
+ }
+
+ return NNTPAUTH_ERROR;
+}
+
+/* Find Author's name in mail address
+ * ----------------------------------
+ *
+ * On exit,
+ * Returns allocated string which cannot be freed by the
+ * calling function, and is reallocated on subsequent calls
+ * to this function.
+ *
+ * For example, returns "Tim Berners-Lee" if given any of
+ * " Tim Berners-Lee <tim@online.cern.ch> "
+ * or " tim@online.cern.ch ( Tim Berners-Lee ) "
+ */
+static char *author_name(char *email)
+{
+ char *p, *e;
+
+ StrAllocCopy(name, email);
+ CTRACE((tfp, "Trying to find name in: %s\n", name));
+
+ if ((p = strrchr(name, '(')) && (e = strrchr(name, ')'))) {
+ if (e > p) {
+ *e = '\0'; /* Chop off everything after the ')' */
+ return HTStrip(p + 1); /* Remove leading and trailing spaces */
+ }
+ }
+
+ if ((p = strrchr(name, '<')) && (e = strrchr(name, '>'))) {
+ if (e++ > p) {
+ while ((*p++ = *e++) != 0) /* Remove <...> */
+ ;
+ return HTStrip(name); /* Remove leading and trailing spaces */
+ }
+ }
+
+ return HTStrip(name); /* Default to the whole thing */
+}
+
+/* Find Author's mail address
+ * --------------------------
+ *
+ * On exit,
+ * Returns allocated string which cannot be freed by the
+ * calling function, and is reallocated on subsequent calls
+ * to this function.
+ *
+ * For example, returns "montulli@spaced.out.galaxy.net" if given any of
+ * " Lou Montulli <montulli@spaced.out.galaxy.net> "
+ * or " montulli@spaced.out.galaxy.net ( Lou "The Stud" Montulli ) "
+ */
+static char *author_address(char *email)
+{
+ char *p, *at, *e;
+
+ StrAllocCopy(address, email);
+ CTRACE((tfp, "Trying to find address in: %s\n", address));
+
+ if ((p = strrchr(address, '<'))) {
+ if ((e = strrchr(p, '>')) && (at = strrchr(p, '@'))) {
+ if (at < e) {
+ *e = '\0'; /* Remove > */
+ return HTStrip(p + 1); /* Remove leading and trailing spaces */
+ }
+ }
+ }
+
+ if ((p = strrchr(address, '(')) &&
+ (e = strrchr(address, ')')) && (at = StrChr(address, '@'))) {
+ if (e > p && at < e) {
+ *p = '\0'; /* Chop off everything after the ')' */
+ return HTStrip(address); /* Remove leading and trailing spaces */
+ }
+ }
+
+ if ((at = strrchr(address, '@')) && at > address) {
+ p = (at - 1);
+ e = (at + 1);
+ while (p > address && !isspace(UCH(*p)))
+ p--;
+ while (*e && !isspace(UCH(*e)))
+ e++;
+ *e = 0;
+ return HTStrip(p);
+ }
+
+ /*
+ * Default to the first word.
+ */
+ p = address;
+ while (isspace(UCH(*p)))
+ p++; /* find first non-space */
+ e = p;
+ while (!isspace(UCH(*e)) && *e != '\0')
+ e++; /* find next space or end */
+ *e = '\0'; /* terminate space */
+
+ return (p);
+}
+
+/* Start anchor element
+ * --------------------
+ */
+static void start_anchor(const char *href)
+{
+ BOOL present[HTML_A_ATTRIBUTES];
+ const char *value[HTML_A_ATTRIBUTES];
+ int i;
+
+ for (i = 0; i < HTML_A_ATTRIBUTES; i++)
+ present[i] = (BOOL) (i == HTML_A_HREF);
+ value[HTML_A_HREF] = href;
+ (*targetClass.start_element) (target, HTML_A, present, value, -1, 0);
+}
+
+/* Start link element
+ * ------------------
+ */
+static void start_link(const char *href, const char *rev)
+{
+ BOOL present[HTML_LINK_ATTRIBUTES];
+ const char *value[HTML_LINK_ATTRIBUTES];
+ int i;
+
+ for (i = 0; i < HTML_LINK_ATTRIBUTES; i++)
+ present[i] = (BOOL) (i == HTML_LINK_HREF || i == HTML_LINK_REV);
+ value[HTML_LINK_HREF] = href;
+ value[HTML_LINK_REV] = rev;
+ (*targetClass.start_element) (target, HTML_LINK, present, value, -1, 0);
+}
+
+/* Start list element
+ * ------------------
+ */
+static void start_list(int seqnum)
+{
+ BOOL present[HTML_OL_ATTRIBUTES];
+ const char *value[HTML_OL_ATTRIBUTES];
+ char SeqNum[20];
+ int i;
+
+ for (i = 0; i < HTML_OL_ATTRIBUTES; i++)
+ present[i] = (BOOL) (i == HTML_OL_SEQNUM || i == HTML_OL_START);
+ sprintf(SeqNum, "%d", seqnum);
+ value[HTML_OL_SEQNUM] = SeqNum;
+ value[HTML_OL_START] = SeqNum;
+ (*targetClass.start_element) (target, HTML_OL, present, value, -1, 0);
+}
+
+/* Paste in an Anchor
+ * ------------------
+ *
+ *
+ * On entry,
+ * HT has a selection of zero length at the end.
+ * text points to the text to be put into the file, 0 terminated.
+ * addr points to the hypertext reference address,
+ * terminated by white space, comma, NULL or '>'
+ */
+static void write_anchor(const char *text, const char *addr)
+{
+ char href[LINE_LENGTH + 1];
+ const char *p;
+ char *q;
+
+ for (p = addr; *p && (*p != '>') && !WHITE(*p) && (*p != ','); p++) {
+ ;
+ }
+ if (strlen(NewsHREF) + (size_t) (p - addr) + 1 < sizeof(href)) {
+ q = href;
+ strcpy(q, NewsHREF);
+ /* Make complete hypertext reference */
+ StrNCat(q, addr, (size_t) (p - addr));
+ } else {
+ q = NULL;
+ HTSprintf0(&q, "%s%.*s", NewsHREF, (int) (p - addr), addr);
+ }
+
+ start_anchor(q);
+ PUTS(text);
+ END(HTML_A);
+
+ if (q != href)
+ FREE(q);
+}
+
+/* Write list of anchors
+ * ---------------------
+ *
+ * We take a pointer to a list of objects, and write out each,
+ * generating an anchor for each.
+ *
+ * On entry,
+ * HT has a selection of zero length at the end.
+ * text points to a comma or space separated list of addresses.
+ * On exit,
+ * *text is NOT any more chopped up into substrings.
+ */
+static void write_anchors(char *text)
+{
+ char *start = text;
+ char *end;
+ char c;
+
+ for (;;) {
+ for (; *start && (WHITE(*start)); start++) ; /* Find start */
+ if (!*start)
+ return; /* (Done) */
+ for (end = start;
+ *end && (*end != ' ') && (*end != ','); end++) ; /* Find end */
+ if (*end)
+ end++; /* Include comma or space but not NULL */
+ c = *end;
+ *end = '\0';
+ if (*start == '<')
+ write_anchor(start, start + 1);
+ else
+ write_anchor(start, start);
+ START(HTML_BR);
+ *end = c;
+ start = end; /* Point to next one */
+ }
+}
+
+/* Abort the connection abort_socket
+ * --------------------
+ */
+static void abort_socket(void)
+{
+ CTRACE((tfp, "HTNews: EOF on read, closing socket %d\n", s));
+ NEWS_NETCLOSE(s); /* End of file, close socket */
+ if (rawtext) {
+ RAW_PUTS("Network Error: connection lost\n");
+ } else {
+ PUTS("Network Error: connection lost");
+ PUTC('\n');
+ }
+ s = -1; /* End of file on response */
+}
+
+/*
+ * Determine if a line is a valid header line. valid_header
+ * -------------------------------------------
+ */
+static BOOLEAN valid_header(char *line)
+{
+ char *colon, *space;
+
+ /*
+ * Blank or tab in first position implies this is a continuation header.
+ */
+ if (line[0] == ' ' || line[0] == '\t')
+ return (TRUE);
+
+ /*
+ * Just check for initial letter, colon, and space to make sure we discard
+ * only invalid headers.
+ */
+ colon = StrChr(line, ':');
+ space = StrChr(line, ' ');
+ if (isalpha(UCH(line[0])) && colon && space == colon + 1)
+ return (TRUE);
+
+ /*
+ * Anything else is a bad header -- it should be ignored.
+ */
+ return (FALSE);
+}
+
+/* post in an Article post_article
+ * ------------------
+ * (added by FM, modeled on Lynx's previous mini inews)
+ *
+ * Note the termination condition of a single dot on a line by itself.
+ *
+ * On entry,
+ * s Global socket number is OK
+ * postfile file with header and article to post.
+ */
+static void post_article(char *postfile)
+{
+ char line[512];
+ char buf[512];
+ char crlf[3];
+ char *cp;
+ int status;
+ FILE *fd;
+ int in_header = 1, seen_header = 0, seen_fromline = 0;
+ int blen = 0, llen = 0;
+
+ /*
+ * Open the temporary file with the nntp headers and message body. - FM
+ */
+ if ((fd = fopen(NonNull(postfile), TXT_R)) == NULL) {
+ HTAlert(FAILED_CANNOT_OPEN_POST);
+ return;
+ }
+
+ /*
+ * Read the temporary file and post in maximum 512 byte chunks. - FM
+ */
+ buf[0] = '\0';
+ sprintf(crlf, "%c%c", CR, LF);
+ while (fgets(line, (int) sizeof(line) - 2, fd) != NULL) {
+ if ((cp = StrChr(line, '\n')) != NULL)
+ *cp = '\0';
+ if (line[0] == '.') {
+ /*
+ * A single '.' means end of transmission for nntp. Lead dots on
+ * lines normally are trimmed and the EOF is not registered if the
+ * dot was not followed by CRLF. We prepend an extra dot for any
+ * line beginning with one, to retain the one intended, as well as
+ * avoid a false EOF signal. We know we have room for it in the
+ * buffer, because we normally send when it would exceed 510. - FM
+ */
+ strcat(buf, ".");
+ blen++;
+ }
+ llen = (int) strlen(line);
+ if (in_header && !strncasecomp(line, "From:", 5)) {
+ seen_header = 1;
+ seen_fromline = 1;
+ }
+ if (in_header && line[0] == '\0') {
+ if (seen_header) {
+ in_header = 0;
+ if (!seen_fromline) {
+ if (blen >= (int) sizeof(buf) - 35) {
+ IGNORE_RC(NEWS_NETWRITE(s, buf, blen));
+ buf[blen = 0] = 0;
+ }
+ strcat(buf, "From: anonymous@nowhere.you.know");
+ strcat(buf, crlf);
+ blen += 34;
+ }
+ } else {
+ continue;
+ }
+ } else if (in_header) {
+ if (valid_header(line)) {
+ seen_header = 1;
+ } else {
+ continue;
+ }
+ }
+ strcat(line, crlf);
+ llen += 2;
+ if ((blen + llen) >= (int) sizeof(buf) - 1) {
+ IGNORE_RC(NEWS_NETWRITE(s, buf, blen));
+ buf[blen = 0] = 0;
+ }
+ strcat(buf, line);
+ blen += llen;
+ }
+ fclose(fd);
+ HTSYS_remove(postfile);
+
+ /*
+ * Send the nntp EOF and get the server's response. - FM
+ */
+ if (blen >= (int) sizeof(buf) - 4) {
+ IGNORE_RC(NEWS_NETWRITE(s, buf, blen));
+ buf[blen = 0] = 0;
+ }
+ strcat(buf, ".");
+ strcat(buf, crlf);
+ blen += 3;
+ IGNORE_RC(NEWS_NETWRITE(s, buf, blen));
+
+ status = response(NULL);
+ if (status == 240) {
+ /*
+ * Successful post. - FM
+ */
+ HTProgress(response_text);
+ } else {
+ /*
+ * Shucks, something went wrong. - FM
+ */
+ HTAlert(response_text);
+ }
+}
+
+#ifdef NEWS_DEBUG
+/* for DEBUG 1997/11/07 (Fri) 17:20:16 */
+void debug_print(unsigned char *p)
+{
+ while (*p) {
+ if (*p == '\0')
+ break;
+ if (*p == 0x1b)
+ printf("[ESC]");
+ else if (*p == '\n')
+ printf("[NL]");
+ else if (*p < ' ' || *p >= 0x80)
+ printf("(%02x)", *p);
+ else
+ putchar(*p);
+ p++;
+ }
+ printf("]\n");
+}
+#endif
+
+static char *decode_mime(char **str)
+{
+ static char empty[] = "";
+
+#ifdef SH_EX
+ if (HTCJK != JAPANESE)
+ return *str;
+#endif
+ HTmmdecode(str, *str);
+ return HTrjis(str, *str) ? *str : empty;
+}
+
+/* Read in an Article read_article
+ * ------------------
+ *
+ * Note the termination condition of a single dot on a line by itself.
+ * RFC 977 specifies that the line "folding" of RFC850 is not used, so we
+ * do not handle it here.
+ *
+ * On entry,
+ * s Global socket number is OK
+ * HT Global hypertext object is ready for appending text
+ */
+static int read_article(HTParentAnchor *thisanchor)
+{
+ char line[LINE_LENGTH + 1];
+ char *full_line = NULL;
+ char *subject = NULL; /* Subject string */
+ char *from = NULL; /* From string */
+ char *replyto = NULL; /* Reply-to string */
+ char *date = NULL; /* Date string */
+ char *organization = NULL; /* Organization string */
+ char *references = NULL; /* Hrefs for other articles */
+ char *newsgroups = NULL; /* Newsgroups list */
+ char *followupto = NULL; /* Followup list */
+ char *href = NULL;
+ char *p = line;
+ char *cp;
+ const char *ccp;
+ BOOL done = NO;
+
+ /*
+ * Read in the HEADer of the article.
+ *
+ * The header fields are either ignored, or formatted and put into the
+ * text.
+ */
+ if (!diagnostic && !rawtext) {
+ while (!done) {
+ int ich = NEXT_CHAR;
+
+ *p++ = (char) ich;
+ if (ich == EOF) {
+ if (interrupted_in_htgetcharacter) {
+ interrupted_in_htgetcharacter = 0;
+ CTRACE((tfp,
+ "HTNews: Interrupted on read, closing socket %d\n",
+ s));
+ NEWS_NETCLOSE(s);
+ s = -1;
+ return (HT_INTERRUPTED);
+ }
+ abort_socket(); /* End of file, close socket */
+ return (HT_LOADED); /* End of file on response */
+ }
+ if (((char) ich == LF) || (p == &line[LINE_LENGTH])) {
+ *--p = '\0'; /* Terminate the string */
+ CTRACE((tfp, "H %s\n", line));
+
+ if (line[0] == '\t' || line[0] == ' ') {
+ int i = 0;
+
+ while (line[i]) {
+ if (line[i] == '\t')
+ line[i] = ' ';
+ i++;
+ }
+ if (full_line == NULL) {
+ StrAllocCopy(full_line, line);
+ } else {
+ StrAllocCat(full_line, line);
+ }
+ } else {
+ StrAllocCopy(full_line, line);
+ }
+
+ if (full_line[0] == '.') {
+ /*
+ * End of article?
+ */
+ if (UCH(full_line[1]) < ' ') {
+ done = YES;
+ break;
+ }
+ } else if (UCH(full_line[0]) < ' ') {
+ break; /* End of Header? */
+
+ } else if (match(full_line, "SUBJECT:")) {
+ StrAllocCopy(subject, HTStrip(StrChr(full_line, ':') + 1));
+ decode_mime(&subject);
+ } else if (match(full_line, "DATE:")) {
+ StrAllocCopy(date, HTStrip(StrChr(full_line, ':') + 1));
+
+ } else if (match(full_line, "ORGANIZATION:")) {
+ StrAllocCopy(organization,
+ HTStrip(StrChr(full_line, ':') + 1));
+ decode_mime(&organization);
+
+ } else if (match(full_line, "FROM:")) {
+ StrAllocCopy(from, HTStrip(StrChr(full_line, ':') + 1));
+ decode_mime(&from);
+
+ } else if (match(full_line, "REPLY-TO:")) {
+ StrAllocCopy(replyto, HTStrip(StrChr(full_line, ':') + 1));
+ decode_mime(&replyto);
+
+ } else if (match(full_line, "NEWSGROUPS:")) {
+ StrAllocCopy(newsgroups, HTStrip(StrChr(full_line, ':') + 1));
+
+ } else if (match(full_line, "REFERENCES:")) {
+ StrAllocCopy(references, HTStrip(StrChr(full_line, ':') + 1));
+
+ } else if (match(full_line, "FOLLOWUP-TO:")) {
+ StrAllocCopy(followupto, HTStrip(StrChr(full_line, ':') + 1));
+
+ } else if (match(full_line, "MESSAGE-ID:")) {
+ char *msgid = HTStrip(full_line + 11);
+
+ if (msgid[0] == '<' && msgid[strlen(msgid) - 1] == '>') {
+ msgid[strlen(msgid) - 1] = '\0'; /* Chop > */
+ msgid++; /* Chop < */
+ HTAnchor_setMessageID(thisanchor, msgid);
+ }
+
+ } /* end if match */
+ p = line; /* Restart at beginning */
+ } /* if end of line */
+ } /* Loop over characters */
+ FREE(full_line);
+
+ START(HTML_HEAD);
+ PUTC('\n');
+ START(HTML_TITLE);
+ if (subject && *subject != '\0')
+ PUTS(subject);
+ else
+ PUTS("No Subject");
+ END(HTML_TITLE);
+ PUTC('\n');
+ /*
+ * Put in the owner as a link rel.
+ */
+ if (from || replyto) {
+ char *temp = NULL;
+
+ StrAllocCopy(temp, author_address(replyto ? replyto : from));
+ StrAllocCopy(href, STR_MAILTO_URL);
+ if (StrChr(temp, '%') || StrChr(temp, '?')) {
+ cp = HTEscape(temp, URL_XPALPHAS);
+ StrAllocCat(href, cp);
+ FREE(cp);
+ } else {
+ StrAllocCat(href, temp);
+ }
+ start_link(href, "made");
+ PUTC('\n');
+ FREE(temp);
+ }
+ END(HTML_HEAD);
+ PUTC('\n');
+
+ START(HTML_H1);
+ if (subject && *subject != '\0')
+ PUTS(subject);
+ else
+ PUTS("No Subject");
+ END(HTML_H1);
+ PUTC('\n');
+
+ if (subject)
+ FREE(subject);
+
+ START(HTML_DLC);
+ PUTC('\n');
+
+ if (from || replyto) {
+ START(HTML_DT);
+ START(HTML_B);
+ PUTS("From:");
+ END(HTML_B);
+ PUTC(' ');
+ if (from)
+ PUTS(from);
+ else
+ PUTS(replyto);
+ MAYBE_END(HTML_DT);
+ PUTC('\n');
+
+ if (!replyto)
+ StrAllocCopy(replyto, from);
+ START(HTML_DT);
+ START(HTML_B);
+ PUTS("Reply to:");
+ END(HTML_B);
+ PUTC(' ');
+ start_anchor(href);
+ if (*replyto != '<')
+ PUTS(author_name(replyto));
+ else
+ PUTS(author_address(replyto));
+ END(HTML_A);
+ START(HTML_BR);
+ MAYBE_END(HTML_DT);
+ PUTC('\n');
+
+ FREE(from);
+ FREE(replyto);
+ }
+
+ if (date) {
+ START(HTML_DT);
+ START(HTML_B);
+ PUTS("Date:");
+ END(HTML_B);
+ PUTC(' ');
+ PUTS(date);
+ MAYBE_END(HTML_DT);
+ PUTC('\n');
+ FREE(date);
+ }
+
+ if (organization) {
+ START(HTML_DT);
+ START(HTML_B);
+ PUTS("Organization:");
+ END(HTML_B);
+ PUTC(' ');
+ PUTS(organization);
+ MAYBE_END(HTML_DT);
+ PUTC('\n');
+ FREE(organization);
+ }
+
+ /* sanitize some headers - kw */
+ if (newsgroups &&
+ ((cp = StrChr(newsgroups, '/')) ||
+ (cp = StrChr(newsgroups, '(')))) {
+ *cp = '\0';
+ }
+ if (newsgroups && !*newsgroups) {
+ FREE(newsgroups);
+ }
+ if (followupto &&
+ ((cp = StrChr(followupto, '/')) ||
+ (cp = StrChr(followupto, '(')))) {
+ *cp = '\0';
+ }
+ if (followupto && !*followupto) {
+ FREE(followupto);
+ }
+
+ if (newsgroups && HTCanPost) {
+ START(HTML_DT);
+ START(HTML_B);
+ PUTS("Newsgroups:");
+ END(HTML_B);
+ PUTC('\n');
+ MAYBE_END(HTML_DT);
+ START(HTML_DD);
+ write_anchors(newsgroups);
+ MAYBE_END(HTML_DD);
+ PUTC('\n');
+ }
+
+ if (followupto && !strcasecomp(followupto, "poster")) {
+ /*
+ * "Followup-To: poster" has special meaning. Don't use it to
+ * construct a newsreply link. -kw
+ */
+ START(HTML_DT);
+ START(HTML_B);
+ PUTS("Followup to:");
+ END(HTML_B);
+ PUTC(' ');
+ if (href) {
+ start_anchor(href);
+ PUTS("poster");
+ END(HTML_A);
+ } else {
+ PUTS("poster");
+ }
+ MAYBE_END(HTML_DT);
+ PUTC('\n');
+ FREE(followupto);
+ }
+
+ if (newsgroups && HTCanPost) {
+ /*
+ * We have permission to POST to this host, so add a link for
+ * posting followups for this article. - FM
+ */
+ if (!strncasecomp(NewsHREF, STR_SNEWS_URL, 6))
+ StrAllocCopy(href, "snewsreply://");
+ else
+ StrAllocCopy(href, "newsreply://");
+ StrAllocCat(href, NewsHost);
+ StrAllocCat(href, "/");
+ StrAllocCat(href, (followupto ? followupto : newsgroups));
+ if (*href == 'n' &&
+ (ccp = HTAnchor_messageID(thisanchor)) && *ccp) {
+ StrAllocCat(href, ";ref=");
+ if (StrChr(ccp, '<') || StrChr(ccp, '&') ||
+ StrChr(ccp, ' ') || StrChr(ccp, ':') ||
+ StrChr(ccp, '/') || StrChr(ccp, '%') ||
+ StrChr(ccp, ';')) {
+ char *cp1 = HTEscape(ccp, URL_XPALPHAS);
+
+ StrAllocCat(href, cp1);
+ FREE(cp1);
+ } else {
+ StrAllocCat(href, ccp);
+ }
+ }
+
+ START(HTML_DT);
+ START(HTML_B);
+ PUTS("Followup to:");
+ END(HTML_B);
+ PUTC(' ');
+ start_anchor(href);
+ if (StrChr((followupto ? followupto : newsgroups), ',')) {
+ PUTS("newsgroups");
+ } else {
+ PUTS("newsgroup");
+ }
+ END(HTML_A);
+ MAYBE_END(HTML_DT);
+ PUTC('\n');
+ }
+ FREE(newsgroups);
+ FREE(followupto);
+
+ if (references) {
+ START(HTML_DT);
+ START(HTML_B);
+ PUTS("References:");
+ END(HTML_B);
+ MAYBE_END(HTML_DT);
+ PUTC('\n');
+ START(HTML_DD);
+ write_anchors(references);
+ MAYBE_END(HTML_DD);
+ PUTC('\n');
+ FREE(references);
+ }
+
+ END(HTML_DLC);
+ PUTC('\n');
+ FREE(href);
+ }
+
+ if (rawtext) {
+ /*
+ * No tags, and never do a PUTC. - kw
+ */
+ ;
+ } else if (diagnostic) {
+ /*
+ * Read in the HEAD and BODY of the Article as XMP formatted text. -
+ * FM
+ */
+ START(HTML_XMP);
+ PUTC('\n');
+ } else {
+ /*
+ * Read in the BODY of the Article as PRE formatted text. - FM
+ */
+ START(HTML_PRE);
+ PUTC('\n');
+ }
+
+ p = line;
+ while (!done) {
+ int ich = NEXT_CHAR;
+
+ *p++ = (char) ich;
+ if (ich == EOF) {
+ if (interrupted_in_htgetcharacter) {
+ interrupted_in_htgetcharacter = 0;
+ CTRACE((tfp,
+ "HTNews: Interrupted on read, closing socket %d\n",
+ s));
+ NEWS_NETCLOSE(s);
+ s = -1;
+ return (HT_INTERRUPTED);
+ }
+ abort_socket(); /* End of file, close socket */
+ return (HT_LOADED); /* End of file on response */
+ }
+ if (((char) ich == LF) || (p == &line[LINE_LENGTH])) {
+ *p = '\0'; /* Terminate the string */
+ CTRACE((tfp, "B %s", line));
+#ifdef NEWS_DEBUG /* 1997/11/09 (Sun) 15:56:11 */
+ debug_print(line); /* @@@ */
+#endif
+ if (line[0] == '.') {
+ /*
+ * End of article?
+ */
+ if (UCH(line[1]) < ' ') {
+ break;
+ } else { /* Line starts with dot */
+ if (rawtext) {
+ RAW_PUTS(&line[1]);
+ } else {
+ PUTS(&line[1]); /* Ignore first dot */
+ }
+ }
+ } else {
+ if (rawtext) {
+ RAW_PUTS(line);
+ } else if (diagnostic || !scan_for_buried_news_references) {
+ /*
+ * All lines are passed as unmodified source. - FM
+ */
+ PUTS(line);
+ } else {
+ /*
+ * Normal lines are scanned for buried references to other
+ * articles. Unfortunately, it could pick up mail
+ * addresses as well! It also can corrupt uuencoded
+ * messages! So we don't do this when fetching articles as
+ * WWW_SOURCE or when downloading (diagnostic is TRUE) or
+ * if the client has set scan_for_buried_news_references to
+ * FALSE. Otherwise, we convert all "<...@...>" strings
+ * preceded by "rticle " to "news:...@..." links, and any
+ * strings that look like URLs to links. - FM
+ */
+ char *l = line;
+ char *p2;
+
+ while ((p2 = strstr(l, "rticle <")) != NULL) {
+ char *q = strrchr(p2, '>');
+ char *at = strrchr(p2, '@');
+
+ if (q && at && at < q) {
+ char c = q[1];
+
+ q[1] = 0; /* chop up */
+ p2 += 7;
+ *p2 = 0;
+ while (*l) {
+ if (StrNCmp(l, STR_NEWS_URL, LEN_NEWS_URL) &&
+ StrNCmp(l, "snews://", 8) &&
+ StrNCmp(l, "nntp://", 7) &&
+ StrNCmp(l, "snewspost:", 10) &&
+ StrNCmp(l, "snewsreply:", 11) &&
+ StrNCmp(l, "newspost:", 9) &&
+ StrNCmp(l, "newsreply:", 10) &&
+ StrNCmp(l, "ftp://", 6) &&
+ StrNCmp(l, "file:/", 6) &&
+ StrNCmp(l, "finger://", 9) &&
+ StrNCmp(l, "http://", 7) &&
+ StrNCmp(l, "https://", 8) &&
+ StrNCmp(l, "wais://", 7) &&
+ StrNCmp(l, STR_MAILTO_URL, LEN_MAILTO_URL) &&
+ StrNCmp(l, "cso://", 6) &&
+ StrNCmp(l, "gopher://", 9)) {
+ PUTC(*l++);
+ } else {
+ StrAllocCopy(href, l);
+ start_anchor(strtok(href, " \r\n\t,>)\""));
+ while (*l && !StrChr(" \r\n\t,>)\"", *l))
+ PUTC(*l++);
+ END(HTML_A);
+ FREE(href);
+ }
+ }
+ *p2 = '<'; /* again */
+ *q = 0;
+ start_anchor(p2 + 1);
+ *q = '>'; /* again */
+ PUTS(p2);
+ END(HTML_A);
+ q[1] = c; /* again */
+ l = q + 1;
+ } else {
+ break; /* line has unmatched <> */
+ }
+ }
+ while (*l) { /* Last bit of the line */
+ if (StrNCmp(l, STR_NEWS_URL, LEN_NEWS_URL) &&
+ StrNCmp(l, "snews://", 8) &&
+ StrNCmp(l, "nntp://", 7) &&
+ StrNCmp(l, "snewspost:", 10) &&
+ StrNCmp(l, "snewsreply:", 11) &&
+ StrNCmp(l, "newspost:", 9) &&
+ StrNCmp(l, "newsreply:", 10) &&
+ StrNCmp(l, "ftp://", 6) &&
+ StrNCmp(l, "file:/", 6) &&
+ StrNCmp(l, "finger://", 9) &&
+ StrNCmp(l, "http://", 7) &&
+ StrNCmp(l, "https://", 8) &&
+ StrNCmp(l, "wais://", 7) &&
+ StrNCmp(l, STR_MAILTO_URL, LEN_MAILTO_URL) &&
+ StrNCmp(l, "cso://", 6) &&
+ StrNCmp(l, "gopher://", 9))
+ PUTC(*l++);
+ else {
+ StrAllocCopy(href, l);
+ start_anchor(strtok(href, " \r\n\t,>)\""));
+ while (*l && !StrChr(" \r\n\t,>)\"", *l))
+ PUTC(*l++);
+ END(HTML_A);
+ FREE(href);
+ }
+ }
+ } /* if diagnostic or not scan_for_buried_news_references */
+ } /* if not dot */
+ p = line; /* Restart at beginning */
+ } /* if end of line */
+ } /* Loop over characters */
+
+ if (rawtext)
+ return (HT_LOADED);
+
+ if (diagnostic)
+ END(HTML_XMP);
+ else
+ END(HTML_PRE);
+ PUTC('\n');
+ return (HT_LOADED);
+}
+
+/* Read in a List of Newsgroups
+ * ----------------------------
+ *
+ * Note the termination condition of a single dot on a line by itself.
+ * RFC 977 specifies that the line "folding" of RFC850 is not used,
+ * so we do not handle it here.
+ */
+static int read_list(char *arg)
+{
+ char line[LINE_LENGTH + 1];
+ char *p;
+ BOOL done = NO;
+ BOOL head = NO;
+ BOOL tail = NO;
+ BOOL skip_this_line = NO;
+ BOOL skip_rest_of_line = NO;
+ int listing = 0;
+ char *pattern = NULL;
+ int len = 0;
+
+ /*
+ * Support head or tail matches for groups to list. - FM
+ */
+ if (arg && strlen(arg) > 1) {
+ if (*arg == '*') {
+ tail = YES;
+ StrAllocCopy(pattern, (arg + 1));
+ } else if (arg[strlen(arg) - 1] == '*') {
+ head = YES;
+ StrAllocCopy(pattern, arg);
+ pattern[strlen(pattern) - 1] = '\0';
+ }
+ if (tail || head) {
+ len = (int) strlen(pattern);
+ }
+
+ }
+
+ /*
+ * Read the server's reply.
+ *
+ * The lines are scanned for newsgroup names and descriptions.
+ */
+ START(HTML_HEAD);
+ PUTC('\n');
+ START(HTML_TITLE);
+ PUTS("Newsgroups");
+ END(HTML_TITLE);
+ PUTC('\n');
+ END(HTML_HEAD);
+ PUTC('\n');
+ START(HTML_H1);
+ PUTS("Newsgroups");
+ END(HTML_H1);
+ PUTC('\n');
+ *(p = line) = '\0';
+ START(HTML_DLC);
+ PUTC('\n');
+ while (!done) {
+ int ich = NEXT_CHAR;
+ char ch = (char) ich;
+
+ if (ich == EOF) {
+ if (interrupted_in_htgetcharacter) {
+ interrupted_in_htgetcharacter = 0;
+ CTRACE((tfp,
+ "HTNews: Interrupted on read, closing socket %d\n",
+ s));
+ NEWS_NETCLOSE(s);
+ s = -1;
+ return (HT_INTERRUPTED);
+ }
+ abort_socket(); /* End of file, close socket */
+ FREE(pattern);
+ return (HT_LOADED); /* End of file on response */
+ } else if (skip_this_line) {
+ if (ch == LF) {
+ skip_this_line = skip_rest_of_line = NO;
+ p = line;
+ }
+ continue;
+ } else if (skip_rest_of_line) {
+ if (ch != LF) {
+ continue;
+ }
+ } else if (p == &line[LINE_LENGTH]) {
+ CTRACE((tfp, "b %.*s%c[...]\n", (LINE_LENGTH), line, ch));
+ *p = '\0';
+ if (ch == LF) {
+ ; /* Will be dealt with below */
+ } else if (WHITE(ch)) {
+ ch = LF; /* May treat as line without description */
+ skip_this_line = YES; /* ...and ignore until LF */
+ } else if (StrChr(line, ' ') == NULL &&
+ StrChr(line, '\t') == NULL) {
+ /* No separator found */
+ CTRACE((tfp, "HTNews..... group name too long, discarding.\n"));
+ skip_this_line = YES; /* ignore whole line */
+ continue;
+ } else {
+ skip_rest_of_line = YES; /* skip until ch == LF found */
+ }
+ } else {
+ *p++ = ch;
+ }
+ if (ch == LF) {
+ skip_rest_of_line = NO; /* done, reset flag */
+ *p = '\0'; /* Terminate the string */
+ CTRACE((tfp, "B %s", line));
+ if (line[0] == '.') {
+ /*
+ * End of article?
+ */
+ if (UCH(line[1]) < ' ') {
+ break;
+ } else { /* Line starts with dot */
+ START(HTML_DT);
+ PUTS(&line[1]);
+ MAYBE_END(HTML_DT);
+ }
+ } else if (line[0] == '#') { /* Comment? */
+ p = line; /* Restart at beginning */
+ continue;
+ } else {
+ /*
+ * Normal lines are scanned for references to newsgroups.
+ */
+ int i = 0;
+
+ /* find whitespace if it exits */
+ for (; line[i] != '\0' && !WHITE(line[i]); i++) ; /* null body */
+
+ if (line[i] != '\0') {
+ line[i] = '\0';
+ if ((head && strncasecomp(line, pattern, len)) ||
+ (tail && (i < len ||
+ strcasecomp((line + (i - len)), pattern)))) {
+ p = line; /* Restart at beginning */
+ continue;
+ }
+ START(HTML_DT);
+ write_anchor(line, line);
+ listing++;
+ MAYBE_END(HTML_DT);
+ PUTC('\n');
+ START(HTML_DD);
+ PUTS(&line[i + 1]); /* put description */
+ MAYBE_END(HTML_DD);
+ } else {
+ if ((head && strncasecomp(line, pattern, len)) ||
+ (tail && (i < len ||
+ strcasecomp((line + (i - len)), pattern)))) {
+ p = line; /* Restart at beginning */
+ continue;
+ }
+ START(HTML_DT);
+ write_anchor(line, line);
+ MAYBE_END(HTML_DT);
+ listing++;
+ }
+ } /* if not dot */
+ p = line; /* Restart at beginning */
+ } /* if end of line */
+ } /* Loop over characters */
+ if (!listing) {
+ char *msg = NULL;
+
+ START(HTML_DT);
+ HTSprintf0(&msg, gettext("No matches for: %s"), arg);
+ PUTS(msg);
+ MAYBE_END(HTML_DT);
+ FREE(msg);
+ }
+ END(HTML_DLC);
+ PUTC('\n');
+ FREE(pattern);
+ return (HT_LOADED);
+}
+
+/* Read in a Newsgroup
+ * -------------------
+ *
+ * Unfortunately, we have to ask for each article one by one if we
+ * want more than one field.
+ *
+ */
+static int read_group(const char *groupName,
+ int first_required,
+ int last_required)
+{
+ char line[LINE_LENGTH + 1];
+ char *author = NULL;
+ char *subject = NULL;
+ char *date = NULL;
+ int i;
+ char *p;
+ BOOL done;
+
+ char buffer[LINE_LENGTH + 1];
+ char *temp = NULL;
+ char *reference = NULL; /* Href for article */
+ int art; /* Article number WITHIN GROUP */
+ int status, count, first, last; /* Response fields */
+
+ START(HTML_HEAD);
+ PUTC('\n');
+ START(HTML_TITLE);
+ PUTS("Newsgroup ");
+ PUTS(groupName);
+ END(HTML_TITLE);
+ PUTC('\n');
+ END(HTML_HEAD);
+ PUTC('\n');
+
+ sscanf(response_text, " %d %d %d %d", &status, &count, &first, &last);
+ CTRACE((tfp, "Newsgroup status=%d, count=%d, (%d-%d) required:(%d-%d)\n",
+ status, count, first, last, first_required, last_required));
+ if (last == 0) {
+ PUTS(gettext("\nNo articles in this group.\n"));
+ goto add_post;
+ }
+#define FAST_THRESHOLD 100 /* Above this, read IDs fast */
+#define CHOP_THRESHOLD 50 /* Above this, chop off the rest */
+
+ if (first_required < first)
+ first_required = first; /* clip */
+ if ((last_required == 0) || (last_required > last))
+ last_required = last;
+
+ if (last_required < first_required) {
+ PUTS(gettext("\nNo articles in this range.\n"));
+ goto add_post;
+ }
+
+ if (last_required - first_required + 1 > HTNewsMaxChunk) { /* Trim this block */
+ first_required = last_required - HTNewsChunkSize + 1;
+ }
+ CTRACE((tfp, " Chunk will be (%d-%d)\n",
+ first_required, last_required));
+
+ /*
+ * Set window title.
+ */
+ HTSprintf0(&temp, gettext("%s, Articles %d-%d"),
+ groupName, first_required, last_required);
+ START(HTML_H1);
+ PUTS(temp);
+ FREE(temp);
+ END(HTML_H1);
+ PUTC('\n');
+
+ /*
+ * Link to earlier articles.
+ */
+ if (first_required > first) {
+ int before; /* Start of one before */
+
+ if (first_required - HTNewsMaxChunk <= first)
+ before = first;
+ else
+ before = first_required - HTNewsChunkSize;
+ HTSprintf0(&dbuf, "%s%s/%d-%d", NewsHREF, groupName,
+ before, first_required - 1);
+ CTRACE((tfp, " Block before is %s\n", dbuf));
+ PUTC('(');
+ start_anchor(dbuf);
+ PUTS(gettext("Earlier articles"));
+ END(HTML_A);
+ PUTS("...)\n");
+ START(HTML_P);
+ PUTC('\n');
+ }
+
+ done = NO;
+
+/*#define USE_XHDR*/
+#ifdef USE_XHDR
+ if (count > FAST_THRESHOLD) {
+ HTSprintf0(&temp,
+ gettext("\nThere are about %d articles currently available in %s, IDs as follows:\n\n"),
+ count, groupName);
+ PUTS(temp);
+ FREE(temp);
+ sprintf(buffer, "XHDR Message-ID %d-%d%c%c", first, last, CR, LF);
+ status = response(buffer);
+ if (status == 221) {
+ p = line;
+ while (!done) {
+ int ich = NEXT_CHAR;
+
+ *p++ = ich;
+ if (ich == EOF) {
+ if (interrupted_in_htgetcharacter) {
+ interrupted_in_htgetcharacter = 0;
+ CTRACE((tfp,
+ "HTNews: Interrupted on read, closing socket %d\n",
+ s));
+ NEWS_NETCLOSE(s);
+ s = -1;
+ return (HT_INTERRUPTED);
+ }
+ abort_socket(); /* End of file, close socket */
+ return (HT_LOADED); /* End of file on response */
+ }
+ if (((char) ich == '\n') || (p == &line[LINE_LENGTH])) {
+ *p = '\0'; /* Terminate the string */
+ CTRACE((tfp, "X %s", line));
+ if (line[0] == '.') {
+ /*
+ * End of article?
+ */
+ if (UCH(line[1]) < ' ') {
+ done = YES;
+ break;
+ } else { /* Line starts with dot */
+ /* Ignore strange line */
+ }
+ } else {
+ /*
+ * Normal lines are scanned for references to articles.
+ */
+ char *space = StrChr(line, ' ');
+
+ if (space++)
+ write_anchor(space, space);
+ } /* if not dot */
+ p = line; /* Restart at beginning */
+ } /* if end of line */
+ } /* Loop over characters */
+
+ /* leaving loop with "done" set */
+ } /* Good status */
+ }
+#endif /* USE_XHDR */
+
+ /*
+ * Read newsgroup using individual fields.
+ */
+ if (!done) {
+ START(HTML_B);
+ if (first == first_required && last == last_required)
+ PUTS(gettext("All available articles in "));
+ else
+ PUTS("Articles in ");
+ PUTS(groupName);
+ END(HTML_B);
+ PUTC('\n');
+ if (LYListNewsNumbers)
+ start_list(first_required);
+ else
+ START(HTML_UL);
+ for (art = first_required; art <= last_required; art++) {
+/*#define OVERLAP*/
+#ifdef OVERLAP
+ /*
+ * With this code we try to keep the server running flat out by
+ * queuing just one extra command ahead of time. We assume (1)
+ * that the server won't abort if it gets input during output, and
+ * (2) that TCP buffering is enough for the two commands. Both
+ * these assumptions seem very reasonable. However, we HAVE had a
+ * hangup with a loaded server.
+ */
+ if (art == first_required) {
+ if (art == last_required) { /* Only one */
+ sprintf(buffer, "HEAD %d%c%c",
+ art, CR, LF);
+ status = response(buffer);
+ } else { /* First of many */
+ sprintf(buffer, "HEAD %d%c%cHEAD %d%c%c",
+ art, CR, LF, art + 1, CR, LF);
+ status = response(buffer);
+ }
+ } else if (art == last_required) { /* Last of many */
+ status = response(NULL);
+ } else { /* Middle of many */
+ sprintf(buffer, "HEAD %d%c%c", art + 1, CR, LF);
+ status = response(buffer);
+ }
+#else /* Not OVERLAP: */
+ sprintf(buffer, "HEAD %d%c%c", art, CR, LF);
+ status = response(buffer);
+#endif /* OVERLAP */
+ /*
+ * Check for a good response (221) for the HEAD request, and if so,
+ * parse it. Otherwise, indicate the error so that the number of
+ * listings corresponds to what's claimed for the range, and if we
+ * are listing numbers via an ordered list, they stay in synchrony
+ * with the article numbers. - FM
+ */
+ if (status == 221) { /* Head follows - parse it: */
+ p = line; /* Write pointer */
+ done = NO;
+ while (!done) {
+ int ich = NEXT_CHAR;
+
+ *p++ = (char) ich;
+ if (ich == EOF) {
+ if (interrupted_in_htgetcharacter) {
+ interrupted_in_htgetcharacter = 0;
+ CTRACE((tfp,
+ "HTNews: Interrupted on read, closing socket %d\n",
+ s));
+ NEWS_NETCLOSE(s);
+ s = -1;
+ return (HT_INTERRUPTED);
+ }
+ abort_socket(); /* End of file, close socket */
+ return (HT_LOADED); /* End of file on response */
+ }
+ if (((char) ich == LF) ||
+ (p == &line[LINE_LENGTH])) {
+
+ *--p = '\0'; /* Terminate & chop LF */
+ p = line; /* Restart at beginning */
+ CTRACE((tfp, "G %s\n", line));
+ switch (line[0]) {
+
+ case '.':
+ /*
+ * End of article?
+ */
+ done = (BOOL) (UCH(line[1]) < ' ');
+ break;
+
+ case 'S':
+ case 's':
+ if (match(line, "SUBJECT:")) {
+ StrAllocCopy(subject, line + 9);
+ decode_mime(&subject);
+ }
+ break;
+
+ case 'M':
+ case 'm':
+ if (match(line, "MESSAGE-ID:")) {
+ char *addr = HTStrip(line + 11) + 1; /* Chop < */
+
+ addr[strlen(addr) - 1] = '\0'; /* Chop > */
+ StrAllocCopy(reference, addr);
+ }
+ break;
+
+ case 'f':
+ case 'F':
+ if (match(line, "FROM:")) {
+ char *p2;
+
+ StrAllocCopy(author, StrChr(line, ':') + 1);
+ decode_mime(&author);
+ p2 = author + strlen(author) - 1;
+ if (*p2 == LF)
+ *p2 = '\0'; /* Chop off newline */
+ }
+ break;
+
+ case 'd':
+ case 'D':
+ if (LYListNewsDates && match(line, "DATE:")) {
+ StrAllocCopy(date,
+ HTStrip(StrChr(line, ':') + 1));
+ }
+ break;
+
+ } /* end switch on first character */
+ } /* if end of line */
+ } /* Loop over characters */
+
+ PUTC('\n');
+ START(HTML_LI);
+ p = decode_mime(&subject);
+ HTSprintf0(&temp, "\"%s\"", NonNull(p));
+ if (reference) {
+ write_anchor(temp, reference);
+ FREE(reference);
+ } else {
+ PUTS(temp);
+ }
+ FREE(temp);
+
+ if (author != NULL) {
+ PUTS(" - ");
+ if (LYListNewsDates)
+ START(HTML_I);
+ PUTS(decode_mime(&author));
+ if (LYListNewsDates)
+ END(HTML_I);
+ FREE(author);
+ }
+ if (date) {
+ if (!diagnostic) {
+ for (i = 0; date[i]; i++) {
+ if (date[i] == ' ') {
+ date[i] = HT_NON_BREAK_SPACE;
+ }
+ }
+ }
+ sprintf(buffer, " [%.*s]", (int) (sizeof(buffer) - 4), date);
+ PUTS(buffer);
+ FREE(date);
+ }
+ MAYBE_END(HTML_LI);
+ /*
+ * Indicate progress! @@@@@@
+ */
+ } else if (status == HT_INTERRUPTED) {
+ interrupted_in_htgetcharacter = 0;
+ CTRACE((tfp,
+ "HTNews: Interrupted on read, closing socket %d\n",
+ s));
+ NEWS_NETCLOSE(s);
+ s = -1;
+ return (HT_INTERRUPTED);
+ } else {
+ /*
+ * Use the response text on error. - FM
+ */
+ PUTC('\n');
+ START(HTML_LI);
+ START(HTML_I);
+ if (LYListNewsNumbers)
+ LYStrNCpy(buffer, "Status:", sizeof(buffer) - 1);
+ else
+ sprintf(buffer, "Status (ARTICLE %d):", art);
+ PUTS(buffer);
+ END(HTML_I);
+ PUTC(' ');
+ PUTS(response_text);
+ MAYBE_END(HTML_LI);
+ } /* Handle response to HEAD request */
+ } /* Loop over article */
+ FREE(author);
+ FREE(subject);
+ } /* If read headers */
+ PUTC('\n');
+ if (LYListNewsNumbers)
+ END(HTML_OL);
+ else
+ END(HTML_UL);
+ PUTC('\n');
+
+ /*
+ * Link to later articles.
+ */
+ if (last_required < last) {
+ int after; /* End of article after */
+
+ after = last_required + HTNewsChunkSize;
+ if (after == last)
+ HTSprintf0(&dbuf, "%s%s", NewsHREF, groupName); /* original group */
+ else
+ HTSprintf0(&dbuf, "%s%s/%d-%d", NewsHREF, groupName,
+ last_required + 1, after);
+ CTRACE((tfp, " Block after is %s\n", dbuf));
+ PUTC('(');
+ start_anchor(dbuf);
+ PUTS(gettext("Later articles"));
+ END(HTML_A);
+ PUTS("...)\n");
+ }
+
+ add_post:
+ if (HTCanPost) {
+ /*
+ * We have permission to POST to this host, so add a link for posting
+ * messages to this newsgroup. - FM
+ */
+ char *href = NULL;
+
+ START(HTML_HR);
+ PUTC('\n');
+ if (!strncasecomp(NewsHREF, STR_SNEWS_URL, 6))
+ StrAllocCopy(href, "snewspost://");
+ else
+ StrAllocCopy(href, "newspost://");
+ StrAllocCat(href, NewsHost);
+ StrAllocCat(href, "/");
+ StrAllocCat(href, groupName);
+ start_anchor(href);
+ PUTS(gettext("Post to "));
+ PUTS(groupName);
+ END(HTML_A);
+ FREE(href);
+ } else {
+ START(HTML_HR);
+ }
+ PUTC('\n');
+ return (HT_LOADED);
+}
+
+/* Load by name. HTLoadNews
+ * =============
+ */
+static int HTLoadNews(const char *arg,
+ HTParentAnchor *anAnchor,
+ HTFormat format_out,
+ HTStream *stream)
+{
+ char command[262]; /* The whole command */
+ char proxycmd[260]; /* The proxy command */
+ char groupName[GROUP_NAME_LENGTH]; /* Just the group name */
+ int status; /* tcp return */
+ int retries; /* A count of how hard we have tried */
+ BOOL normal_url; /* Flag: "news:" or "nntp:" (physical) URL */
+ BOOL group_wanted; /* Flag: group was asked for, not article */
+ BOOL list_wanted; /* Flag: list was asked for, not article */
+ BOOL post_wanted; /* Flag: new post to group was asked for */
+ BOOL reply_wanted; /* Flag: followup post was asked for */
+ BOOL spost_wanted; /* Flag: new SSL post to group was asked for */
+ BOOL sreply_wanted; /* Flag: followup SSL post was asked for */
+ BOOL head_wanted = NO; /* Flag: want HEAD of single article */
+ int first, last; /* First and last articles asked for */
+ char *cp = 0;
+ char *ListArg = NULL;
+ char *ProxyHost = NULL;
+ char *ProxyHREF = NULL;
+ char *postfile = NULL;
+
+#ifdef USE_SSL
+ char SSLprogress[256];
+#endif /* USE_SSL */
+
+ diagnostic = (format_out == WWW_SOURCE || /* set global flag */
+ format_out == WWW_DOWNLOAD ||
+ format_out == WWW_DUMP);
+ rawtext = NO;
+
+ CTRACE((tfp, "HTNews: Looking for %s\n", arg));
+
+ if (!initialized)
+ initialized = initialize();
+ if (!initialized)
+ return -1; /* FAIL */
+
+ FREE(NewsHREF);
+ command[0] = '\0';
+ command[sizeof(command) - 1] = '\0';
+ proxycmd[0] = '\0';
+ proxycmd[sizeof(proxycmd) - 1] = '\0';
+
+ {
+ const char *p1;
+
+ /*
+ * We will ask for the document, omitting the host name & anchor.
+ *
+ * Syntax of address is
+ * xxx@yyy Article
+ * <xxx@yyy> Same article
+ * xxxxx News group (no "@")
+ * group/n1-n2 Articles n1 to n2 in group
+ */
+ normal_url = (BOOL) (!StrNCmp(arg, STR_NEWS_URL, LEN_NEWS_URL) ||
+ !StrNCmp(arg, "nntp:", 5));
+ spost_wanted = (BOOL) (!normal_url && strstr(arg, "snewspost:") != NULL);
+ sreply_wanted = (BOOL) (!(normal_url || spost_wanted) &&
+ strstr(arg, "snewsreply:") != NULL);
+ post_wanted = (BOOL) (!(normal_url || spost_wanted || sreply_wanted) &&
+ strstr(arg, "newspost:") != NULL);
+ reply_wanted = (BOOL) (!(normal_url || spost_wanted || sreply_wanted ||
+ post_wanted) &&
+ strstr(arg, "newsreply:") != NULL);
+ group_wanted = (BOOL) ((!(spost_wanted || sreply_wanted ||
+ post_wanted || reply_wanted) &&
+ StrChr(arg, '@') == NULL) &&
+ (StrChr(arg, '*') == NULL));
+ list_wanted = (BOOL) ((!(spost_wanted || sreply_wanted ||
+ post_wanted || reply_wanted ||
+ group_wanted) &&
+ StrChr(arg, '@') == NULL) &&
+ (StrChr(arg, '*') != NULL));
+
+#ifndef USE_SSL
+ if (!strncasecomp(arg, "snewspost:", 10) ||
+ !strncasecomp(arg, "snewsreply:", 11)) {
+ HTAlert(FAILED_CANNOT_POST_SSL);
+ return HT_NOT_LOADED;
+ }
+#endif /* !USE_SSL */
+ if (post_wanted || reply_wanted || spost_wanted || sreply_wanted) {
+ /*
+ * Make sure we have a non-zero path for the newsgroup(s). - FM
+ */
+ if ((p1 = strrchr(arg, '/')) != NULL) {
+ p1++;
+ } else if ((p1 = strrchr(arg, ':')) != NULL) {
+ p1++;
+ }
+ if (!(p1 && *p1)) {
+ HTAlert(WWW_ILLEGAL_URL_MESSAGE);
+ return (HT_NO_DATA);
+ }
+ if (!(cp = HTParse(arg, "", PARSE_HOST)) || *cp == '\0') {
+ if (s >= 0 && NewsHost && strcasecomp(NewsHost, HTNewsHost)) {
+ NEWS_NETCLOSE(s);
+ s = -1;
+ }
+ StrAllocCopy(NewsHost, HTNewsHost);
+ } else {
+ if (s >= 0 && NewsHost && strcasecomp(NewsHost, cp)) {
+ NEWS_NETCLOSE(s);
+ s = -1;
+ }
+ StrAllocCopy(NewsHost, cp);
+ }
+ FREE(cp);
+ HTSprintf0(&NewsHREF, "%s://%.*s/",
+ (post_wanted ?
+ "newspost" :
+ (reply_wanted ?
+ "newreply" :
+ (spost_wanted ?
+ "snewspost" : "snewsreply"))),
+ (int) sizeof(command) - 15, NewsHost);
+
+ /*
+ * If the SSL daemon is being used as a proxy, reset p1 to the
+ * start of the proxied URL rather than to the start of the
+ * newsgroup(s). - FM
+ */
+ if (spost_wanted && strncasecomp(arg, "snewspost:", 10))
+ p1 = strstr(arg, "snewspost:");
+ if (sreply_wanted && strncasecomp(arg, "snewsreply:", 11))
+ p1 = strstr(arg, "snewsreply:");
+
+ /* p1 = HTParse(arg, "", PARSE_PATH | PARSE_PUNCTUATION); */
+ /*
+ * Don't use HTParse because news: access doesn't follow
+ * traditional rules. For instance, if the article reference
+ * contains a '#', the rest of it is lost -- JFG 10/7/92, from a
+ * bug report
+ */
+ } else if (isNNTP_URL(arg)) {
+ if (((*(arg + 5) == '\0') ||
+ (!strcmp((arg + 5), "/") ||
+ !strcmp((arg + 5), "//") ||
+ !strcmp((arg + 5), "///"))) ||
+ ((!StrNCmp((arg + 5), "//", 2)) &&
+ (!(cp = StrChr((arg + 7), '/')) || *(cp + 1) == '\0'))) {
+ p1 = "*";
+ group_wanted = FALSE;
+ list_wanted = TRUE;
+ } else if (*(arg + 5) != '/') {
+ p1 = (arg + 5);
+ } else if (*(arg + 5) == '/' && *(arg + 6) != '/') {
+ p1 = (arg + 6);
+ } else {
+ p1 = (cp ? (cp + 1) : (arg + 6));
+ }
+ if (!(cp = HTParse(arg, "", PARSE_HOST)) || *cp == '\0') {
+ if (s >= 0 && NewsHost && strcasecomp(NewsHost, HTNewsHost)) {
+ NEWS_NETCLOSE(s);
+ s = -1;
+ }
+ StrAllocCopy(NewsHost, HTNewsHost);
+ } else {
+ if (s >= 0 && NewsHost && strcasecomp(NewsHost, cp)) {
+ NEWS_NETCLOSE(s);
+ s = -1;
+ }
+ StrAllocCopy(NewsHost, cp);
+ }
+ FREE(cp);
+ SnipIn2(command, "%s//%.*s/", STR_NNTP_URL, 9, NewsHost);
+ StrAllocCopy(NewsHREF, command);
+ } else if (!strncasecomp(arg, STR_SNEWS_URL, 6)) {
+#ifdef USE_SSL
+ if (((*(arg + 6) == '\0') ||
+ (!strcmp((arg + 6), "/") ||
+ !strcmp((arg + 6), "//") ||
+ !strcmp((arg + 6), "///"))) ||
+ ((!StrNCmp((arg + 6), "//", 2)) &&
+ (!(cp = StrChr((arg + 8), '/')) || *(cp + 1) == '\0'))) {
+ p1 = "*";
+ group_wanted = FALSE;
+ list_wanted = TRUE;
+ } else if (*(arg + 6) != '/') {
+ p1 = (arg + 6);
+ } else if (*(arg + 6) == '/' && *(arg + 7) != '/') {
+ p1 = (arg + 7);
+ } else {
+ p1 = (cp ? (cp + 1) : (arg + 7));
+ }
+ if (!(cp = HTParse(arg, "", PARSE_HOST)) || *cp == '\0') {
+ if (s >= 0 && NewsHost && strcasecomp(NewsHost, HTNewsHost)) {
+ NEWS_NETCLOSE(s);
+ s = -1;
+ }
+ StrAllocCopy(NewsHost, HTNewsHost);
+ } else {
+ if (s >= 0 && NewsHost && strcasecomp(NewsHost, cp)) {
+ NEWS_NETCLOSE(s);
+ s = -1;
+ }
+ StrAllocCopy(NewsHost, cp);
+ }
+ FREE(cp);
+ sprintf(command, "%s//%.250s/", STR_SNEWS_URL, NewsHost);
+ StrAllocCopy(NewsHREF, command);
+#else
+ HTAlert(gettext("This client does not contain support for SNEWS URLs."));
+ return HT_NOT_LOADED;
+#endif /* USE_SSL */
+ } else if (!strncasecomp(arg, "news:/", 6)) {
+ if (((*(arg + 6) == '\0') ||
+ !strcmp((arg + 6), "/") ||
+ !strcmp((arg + 6), "//")) ||
+ ((*(arg + 6) == '/') &&
+ (!(cp = StrChr((arg + 7), '/')) || *(cp + 1) == '\0'))) {
+ p1 = "*";
+ group_wanted = FALSE;
+ list_wanted = TRUE;
+ } else if (*(arg + 6) != '/') {
+ p1 = (arg + 6);
+ } else {
+ p1 = (cp ? (cp + 1) : (arg + 6));
+ }
+ if (!(cp = HTParse(arg, "", PARSE_HOST)) || *cp == '\0') {
+ if (s >= 0 && NewsHost && strcasecomp(NewsHost, HTNewsHost)) {
+ NEWS_NETCLOSE(s);
+ s = -1;
+ }
+ StrAllocCopy(NewsHost, HTNewsHost);
+ } else {
+ if (s >= 0 && NewsHost && strcasecomp(NewsHost, cp)) {
+ NEWS_NETCLOSE(s);
+ s = -1;
+ }
+ StrAllocCopy(NewsHost, cp);
+ }
+ FREE(cp);
+ SnipIn(command, "news://%.*s/", 9, NewsHost);
+ StrAllocCopy(NewsHREF, command);
+ } else {
+ p1 = (arg + 5); /* Skip "news:" prefix */
+ if (*p1 == '\0') {
+ p1 = "*";
+ group_wanted = FALSE;
+ list_wanted = TRUE;
+ }
+ if (s >= 0 && NewsHost && strcasecomp(NewsHost, HTNewsHost)) {
+ NEWS_NETCLOSE(s);
+ s = -1;
+ }
+ StrAllocCopy(NewsHost, HTNewsHost);
+ StrAllocCopy(NewsHREF, STR_NEWS_URL);
+ }
+
+ /*
+ * Set up any proxy for snews URLs that returns NNTP responses for Lynx
+ * to convert to HTML, instead of doing the conversion itself, and for
+ * handling posts or followups. - TZ & FM
+ */
+ if (!strncasecomp(p1, STR_SNEWS_URL, 6) ||
+ !strncasecomp(p1, "snewspost:", 10) ||
+ !strncasecomp(p1, "snewsreply:", 11)) {
+ StrAllocCopy(ProxyHost, NewsHost);
+ if ((cp = HTParse(p1, "", PARSE_HOST)) != NULL && *cp != '\0') {
+ SnipIn2(command, "%s//%.*s", STR_SNEWS_URL, 10, cp);
+ StrAllocCopy(NewsHost, cp);
+ } else {
+ SnipIn2(command, "%s//%.*s", STR_SNEWS_URL, 10, NewsHost);
+ }
+ command[sizeof(command) - 2] = '\0';
+ FREE(cp);
+ sprintf(proxycmd, "GET %.*s%c%c%c%c",
+ (int) sizeof(proxycmd) - 9, command,
+ CR, LF, CR, LF);
+ CTRACE((tfp, "HTNews: Proxy command is '%.*s'\n",
+ (int) (strlen(proxycmd) - 4), proxycmd));
+ strcat(command, "/");
+ StrAllocCopy(ProxyHREF, NewsHREF);
+ StrAllocCopy(NewsHREF, command);
+ if (spost_wanted || sreply_wanted) {
+ /*
+ * Reset p1 so that it points to the newsgroup(s).
+ */
+ if ((p1 = strrchr(arg, '/')) != NULL) {
+ p1++;
+ } else {
+ p1 = (strrchr(arg, ':') + 1);
+ }
+ } else {
+ char *cp2;
+
+ /*
+ * Reset p1 so that it points to the newsgroup (or a wildcard),
+ * or the article.
+ */
+ if (!(cp2 = strrchr((p1 + 6), '/')) || *(cp2 + 1) == '\0') {
+ p1 = "*";
+ group_wanted = FALSE;
+ list_wanted = TRUE;
+ } else {
+ p1 = (cp2 + 1);
+ }
+ }
+ }
+
+ /*
+ * Set up command for a post, listing, or article request. - FM
+ */
+ if (post_wanted || reply_wanted || spost_wanted || sreply_wanted) {
+ strcpy(command, "POST");
+ } else if (list_wanted) {
+ if (strlen(p1) > 249) {
+ FREE(ProxyHost);
+ FREE(ProxyHREF);
+ HTAlert(URL_TOO_LONG);
+ return -400;
+ }
+ SnipIn(command, "XGTITLE %.*s", 11, p1);
+ } else if (group_wanted) {
+ char *slash = StrChr(p1, '/');
+
+ first = 0;
+ last = 0;
+ if (slash) {
+ *slash = '\0';
+ if (strlen(p1) >= sizeof(groupName)) {
+ FREE(ProxyHost);
+ FREE(ProxyHREF);
+ HTAlert(URL_TOO_LONG);
+ return -400;
+ }
+ LYStrNCpy(groupName, p1, sizeof(groupName) - 1);
+ *slash = '/';
+ (void) sscanf(slash + 1, "%d-%d", &first, &last);
+ if ((first > 0) && (isdigit(UCH(*(slash + 1)))) &&
+ (StrChr(slash + 1, '-') == NULL || first == last)) {
+ /*
+ * We got a number greater than 0, which will be loaded as
+ * first, and either no range or the range computes to
+ * zero, so make last negative, as a flag to select the
+ * group and then fetch an article by number (first)
+ * instead of by messageID. - FM
+ */
+ last = -1;
+ }
+ } else {
+ if (strlen(p1) >= sizeof(groupName)) {
+ FREE(ProxyHost);
+ FREE(ProxyHREF);
+ HTAlert(URL_TOO_LONG);
+ return -400;
+ }
+ LYStrNCpy(groupName, p1, sizeof(groupName) - 1);
+ }
+ SnipIn(command, "GROUP %.*s", 9, groupName);
+ } else {
+ size_t add_open = (size_t) (StrChr(p1, '<') == 0);
+ size_t add_close = (size_t) (StrChr(p1, '>') == 0);
+
+ if (strlen(p1) + add_open + add_close >= 252) {
+ FREE(ProxyHost);
+ FREE(ProxyHREF);
+ HTAlert(URL_TOO_LONG);
+ return -400;
+ }
+ sprintf(command, "ARTICLE %s%.*s%s",
+ add_open ? "<" : "",
+ (int) (sizeof(command) - (11 + add_open + add_close)),
+ p1,
+ add_close ? ">" : "");
+ }
+
+ {
+ char *p = command + strlen(command);
+
+ /*
+ * Terminate command with CRLF, as in RFC 977.
+ */
+ *p++ = CR; /* Macros to be correct on Mac */
+ *p++ = LF;
+ *p = 0;
+ }
+ StrAllocCopy(ListArg, p1);
+ } /* scope of p1 */
+
+ if (!*arg) {
+ FREE(NewsHREF);
+ FREE(ProxyHost);
+ FREE(ProxyHREF);
+ FREE(ListArg);
+ return NO; /* Ignore if no name */
+ }
+
+ if (!(post_wanted || reply_wanted || spost_wanted || sreply_wanted ||
+ (group_wanted && last != -1) || list_wanted)) {
+ head_wanted = anAnchor->isHEAD;
+ if (head_wanted && !StrNCmp(command, "ARTICLE ", 8)) {
+ /* overwrite "ARTICLE" - hack... */
+ strcpy(command, "HEAD ");
+ for (cp = command + 5;; cp++)
+ if ((*cp = *(cp + 3)) == '\0')
+ break;
+ }
+ rawtext = (BOOL) (head_wanted || keep_mime_headers);
+ }
+ if (rawtext) {
+ rawtarget = HTStreamStack(WWW_PLAINTEXT,
+ format_out,
+ stream, anAnchor);
+ if (!rawtarget) {
+ FREE(NewsHost);
+ FREE(NewsHREF);
+ FREE(ProxyHost);
+ FREE(ProxyHREF);
+ FREE(ListArg);
+ HTAlert(gettext("No target for raw text!"));
+ return (HT_NOT_LOADED);
+ } /* Copy routine entry points */
+ rawtargetClass = *rawtarget->isa;
+ } else
+ /*
+ * Make a hypertext object with an anchor list.
+ */
+ if (!(post_wanted || reply_wanted || spost_wanted || sreply_wanted)) {
+ target = HTML_new(anAnchor, format_out, stream);
+ targetClass = *target->isa; /* Copy routine entry points */
+ }
+
+ /*
+ * Now, let's get a stream setup up from the NewsHost.
+ */
+ for (retries = 0; retries < 2; retries++) {
+ if (s < 0) {
+ /* CONNECTING to news host */
+ char url[260];
+
+ if (!strcmp(NewsHREF, STR_NEWS_URL)) {
+ SnipIn(url, "lose://%.*s/", 9, NewsHost);
+ } else if (ProxyHREF) {
+ SnipIn(url, "%.*s", 1, ProxyHREF);
+ } else {
+ SnipIn(url, "%.*s", 1, NewsHREF);
+ }
+ CTRACE((tfp, "News: doing HTDoConnect on '%s'\n", url));
+
+ _HTProgress(gettext("Connecting to NewsHost ..."));
+
+#ifdef USE_SSL
+ if (!using_proxy &&
+ (!StrNCmp(arg, STR_SNEWS_URL, 6) ||
+ !StrNCmp(arg, "snewspost:", 10) ||
+ !StrNCmp(arg, "snewsreply:", 11)))
+ status = HTDoConnect(url, "NNTPS", SNEWS_PORT, &s);
+ else
+ status = HTDoConnect(url, "NNTP", NEWS_PORT, &s);
+#else
+ status = HTDoConnect(url, "NNTP", NEWS_PORT, &s);
+#endif /* USE_SSL */
+
+ if (status == HT_INTERRUPTED) {
+ /*
+ * Interrupt cleanly.
+ */
+ CTRACE((tfp,
+ "HTNews: Interrupted on connect; recovering cleanly.\n"));
+ _HTProgress(CONNECTION_INTERRUPTED);
+ if (!(post_wanted || reply_wanted ||
+ spost_wanted || sreply_wanted)) {
+ ABORT_TARGET;
+ }
+ FREE(NewsHost);
+ FREE(NewsHREF);
+ FREE(ProxyHost);
+ FREE(ProxyHREF);
+ FREE(ListArg);
+#ifdef USE_SSL
+ if (Handle) {
+ SSL_free(Handle);
+ Handle = NULL;
+ }
+#endif /* USE_SSL */
+ if (postfile) {
+ HTSYS_remove(postfile);
+ FREE(postfile);
+ }
+ return HT_NOT_LOADED;
+ }
+ if (status < 0) {
+ NEWS_NETCLOSE(s);
+ s = -1;
+ CTRACE((tfp, "HTNews: Unable to connect to news host.\n"));
+ if (retries < 1)
+ continue;
+ if (!(post_wanted || reply_wanted ||
+ spost_wanted || sreply_wanted)) {
+ ABORT_TARGET;
+ }
+ HTSprintf0(&dbuf, gettext("Could not access %s."), NewsHost);
+ FREE(NewsHost);
+ FREE(NewsHREF);
+ FREE(ProxyHost);
+ FREE(ProxyHREF);
+ FREE(ListArg);
+ if (postfile) {
+ HTSYS_remove(postfile);
+ FREE(postfile);
+ }
+ return HTLoadError(stream, 500, dbuf);
+ } else {
+ CTRACE((tfp, "HTNews: Connected to news host %s.\n",
+ NewsHost));
+#ifdef USE_SSL
+ /*
+ * If this is an snews url, then do the SSL stuff here
+ */
+ if (!using_proxy &&
+ (!StrNCmp(url, "snews", 5) ||
+ !StrNCmp(url, "snewspost:", 10) ||
+ !StrNCmp(url, "snewsreply:", 11))) {
+ Handle = HTGetSSLHandle();
+ SSL_set_fd(Handle, s);
+ HTSSLInitPRNG();
+ status = SSL_connect(Handle);
+
+ if (status <= 0) {
+ unsigned long SSLerror;
+
+ CTRACE((tfp,
+ "HTNews: Unable to complete SSL handshake for '%s', SSL_connect=%d, SSL error stack dump follows\n",
+ url, status));
+ SSL_load_error_strings();
+ while ((SSLerror = ERR_get_error()) != 0) {
+ CTRACE((tfp, "HTNews: SSL: %s\n",
+ ERR_error_string(SSLerror, NULL)));
+ }
+ HTAlert("Unable to make secure connection to remote host.");
+ NEWS_NETCLOSE(s);
+ s = -1;
+ if (!(post_wanted || reply_wanted ||
+ spost_wanted || sreply_wanted))
+ (*targetClass._abort) (target, NULL);
+ FREE(NewsHost);
+ FREE(NewsHREF);
+ FREE(ProxyHost);
+ FREE(ProxyHREF);
+ FREE(ListArg);
+ if (postfile) {
+#ifdef VMS
+ while (remove(postfile) == 0) ; /* loop through all versions */
+#else
+ remove(postfile);
+#endif /* VMS */
+ FREE(postfile);
+ }
+ return HT_NOT_LOADED;
+ }
+ sprintf(SSLprogress,
+ "Secure %d-bit %s (%s) NNTP connection",
+ SSL_get_cipher_bits(Handle, NULL),
+ SSL_get_cipher_version(Handle),
+ SSL_get_cipher(Handle));
+ _HTProgress(SSLprogress);
+ }
+#endif /* USE_SSL */
+ HTInitInput(s); /* set up buffering */
+ if (proxycmd[0]) {
+ status = (int) NEWS_NETWRITE(s, proxycmd, (int) strlen(proxycmd));
+ CTRACE((tfp,
+ "HTNews: Proxy command returned status '%d'.\n",
+ status));
+ }
+ if (((status = response(NULL)) / 100) != 2) {
+ NEWS_NETCLOSE(s);
+ s = -1;
+ if (status == HT_INTERRUPTED) {
+ _HTProgress(CONNECTION_INTERRUPTED);
+ if (!(post_wanted || reply_wanted ||
+ spost_wanted || sreply_wanted)) {
+ ABORT_TARGET;
+ }
+ FREE(NewsHost);
+ FREE(NewsHREF);
+ FREE(ProxyHost);
+ FREE(ProxyHREF);
+ FREE(ListArg);
+ if (postfile) {
+ HTSYS_remove(postfile);
+ FREE(postfile);
+ }
+ return (HT_NOT_LOADED);
+ }
+ if (retries < 1)
+ continue;
+ FREE(ProxyHost);
+ FREE(ProxyHREF);
+ FREE(ListArg);
+ FREE(postfile);
+ if (!(post_wanted || reply_wanted ||
+ spost_wanted || sreply_wanted)) {
+ ABORT_TARGET;
+ }
+ if (response_text[0]) {
+ HTSprintf0(&dbuf,
+ gettext("Can't read news info. News host %.20s responded: %.200s"),
+ NewsHost, response_text);
+ } else {
+ HTSprintf0(&dbuf,
+ gettext("Can't read news info, empty response from host %s"),
+ NewsHost);
+ }
+ return HTLoadError(stream, 500, dbuf);
+ }
+ if (status == 200) {
+ HTCanPost = TRUE;
+ } else {
+ HTCanPost = FALSE;
+ if (post_wanted || reply_wanted ||
+ spost_wanted || sreply_wanted) {
+ HTAlert(CANNOT_POST);
+ FREE(NewsHREF);
+ if (ProxyHREF) {
+ StrAllocCopy(NewsHost, ProxyHost);
+ FREE(ProxyHost);
+ FREE(ProxyHREF);
+ }
+ FREE(ListArg);
+ if (postfile) {
+ HTSYS_remove(postfile);
+ FREE(postfile);
+ }
+ return (HT_NOT_LOADED);
+ }
+ }
+ }
+ }
+ /* If needed opening */
+ if (post_wanted || reply_wanted ||
+ spost_wanted || sreply_wanted) {
+ if (!HTCanPost) {
+ HTAlert(CANNOT_POST);
+ FREE(NewsHREF);
+ if (ProxyHREF) {
+ StrAllocCopy(NewsHost, ProxyHost);
+ FREE(ProxyHost);
+ FREE(ProxyHREF);
+ }
+ FREE(ListArg);
+ if (postfile) {
+ HTSYS_remove(postfile);
+ FREE(postfile);
+ }
+ return (HT_NOT_LOADED);
+ }
+ if (postfile == NULL) {
+ postfile = LYNewsPost(ListArg,
+ (reply_wanted || sreply_wanted));
+ }
+ if (postfile == NULL) {
+ HTProgress(CANCELLED);
+ FREE(NewsHREF);
+ if (ProxyHREF) {
+ StrAllocCopy(NewsHost, ProxyHost);
+ FREE(ProxyHost);
+ FREE(ProxyHREF);
+ }
+ FREE(ListArg);
+ return (HT_NOT_LOADED);
+ }
+ } else {
+ /*
+ * Ensure reader mode, but don't bother checking the status for
+ * anything but HT_INTERRUPTED or a 480 Authorization request,
+ * because if the reader mode command is not needed, the server
+ * probably returned a 500, which is irrelevant at this point. -
+ * FM
+ */
+ char buffer[20];
+
+ sprintf(buffer, "mode reader%c%c", CR, LF);
+ if ((status = response(buffer)) == HT_INTERRUPTED) {
+ _HTProgress(CONNECTION_INTERRUPTED);
+ break;
+ }
+ if (status == 480) {
+ NNTPAuthResult auth_result = HTHandleAuthInfo(NewsHost);
+
+ if (auth_result == NNTPAUTH_CLOSE) {
+ if (s != -1 && !(ProxyHost || ProxyHREF)) {
+ NEWS_NETCLOSE(s);
+ s = -1;
+ }
+ }
+ if (auth_result != NNTPAUTH_OK) {
+ break;
+ }
+ if (response(buffer) == HT_INTERRUPTED) {
+ _HTProgress(CONNECTION_INTERRUPTED);
+ break;
+ }
+ }
+ }
+
+ Send_NNTP_command:
+#ifdef NEWS_DEB
+ if (postfile)
+ printf("postfile = %s, command = %s", postfile, command);
+ else
+ printf("command = %s", command);
+#endif
+ if ((status = response(command)) == HT_INTERRUPTED) {
+ _HTProgress(CONNECTION_INTERRUPTED);
+ break;
+ }
+ if (status < 0) {
+ if (retries < 1) {
+ continue;
+ } else {
+ break;
+ }
+ }
+ /*
+ * For some well known error responses which are expected to occur in
+ * normal use, break from the loop without retrying and without closing
+ * the connection. It is unlikely that these are leftovers from a
+ * timed-out connection (but we do some checks to see whether the
+ * response corresponds to the last command), or that they will give
+ * anything else when automatically retried. - kw
+ */
+ if (status == 411 && group_wanted &&
+ !StrNCmp(command, "GROUP ", 6) &&
+ !strncasecomp(response_text + 3, " No such group ", 15) &&
+ !strcmp(response_text + 18, groupName)) {
+
+ HTAlert(response_text);
+ break;
+ } else if (status == 430 && !group_wanted && !list_wanted &&
+ !StrNCmp(command, "ARTICLE <", 9) &&
+ !strcasecomp(response_text + 3, " No such article")) {
+
+ HTAlert(response_text);
+ break;
+ }
+ if ((status / 100) != 2 &&
+ status != 340 &&
+ status != 480) {
+ if (retries) {
+ if (list_wanted && !StrNCmp(command, "XGTITLE", 7)) {
+ sprintf(command, "LIST NEWSGROUPS%c%c", CR, LF);
+ goto Send_NNTP_command;
+ }
+ HTAlert(response_text);
+ } else {
+ _HTProgress(response_text);
+ }
+ NEWS_NETCLOSE(s);
+ s = -1;
+ /*
+ * Message might be a leftover "Timeout-disconnected", so try again
+ * if the retries maximum has not been reached.
+ */
+ continue;
+ }
+
+ /*
+ * Post or load a group, article, etc
+ */
+ if (status == 480) {
+ NNTPAuthResult auth_result;
+
+ /*
+ * Some servers return 480 for a failed XGTITLE. - FM
+ */
+ if (list_wanted && !StrNCmp(command, "XGTITLE", 7) &&
+ strstr(response_text, "uthenticat") == NULL &&
+ strstr(response_text, "uthor") == NULL) {
+ sprintf(command, "LIST NEWSGROUPS%c%c", CR, LF);
+ goto Send_NNTP_command;
+ }
+ /*
+ * Handle Authorization. - FM
+ */
+ if ((auth_result = HTHandleAuthInfo(NewsHost)) == NNTPAUTH_OK) {
+ goto Send_NNTP_command;
+ } else if (auth_result == NNTPAUTH_CLOSE) {
+ if (s != -1 && !(ProxyHost || ProxyHREF)) {
+ NEWS_NETCLOSE(s);
+ s = -1;
+ }
+ if (retries < 1)
+ continue;
+ }
+ status = HT_NOT_LOADED;
+ } else if (post_wanted || reply_wanted ||
+ spost_wanted || sreply_wanted) {
+ /*
+ * Handle posting of an article. - FM
+ */
+ if (status != 340) {
+ HTAlert(CANNOT_POST);
+ if (postfile) {
+ HTSYS_remove(postfile);
+ }
+ } else {
+ post_article(postfile);
+ }
+ FREE(postfile);
+ status = HT_NOT_LOADED;
+ } else if (list_wanted) {
+ /*
+ * List available newsgroups. - FM
+ */
+ _HTProgress(gettext("Reading list of available newsgroups."));
+ status = read_list(ListArg);
+ } else if (group_wanted) {
+ /*
+ * List articles in a news group. - FM
+ */
+ if (last < 0) {
+ /*
+ * We got one article number rather than a range following the
+ * slash which followed the group name, or the range was zero,
+ * so now that we have selected that group, load ARTICLE and
+ * the the number (first) as the command and go back to send it
+ * and check the response. - FM
+ */
+ sprintf(command, "%s %d%c%c",
+ head_wanted ? "HEAD" : "ARTICLE",
+ first, CR, LF);
+ group_wanted = FALSE;
+ retries = 2;
+ goto Send_NNTP_command;
+ }
+ _HTProgress(gettext("Reading list of articles in newsgroup."));
+ status = read_group(groupName, first, last);
+ } else {
+ /*
+ * Get an article from a news group. - FM
+ */
+ _HTProgress(gettext("Reading news article."));
+ status = read_article(anAnchor);
+ }
+ if (status == HT_INTERRUPTED) {
+ _HTProgress(CONNECTION_INTERRUPTED);
+ status = HT_LOADED;
+ }
+ if (!(post_wanted || reply_wanted ||
+ spost_wanted || sreply_wanted)) {
+ if (status == HT_NOT_LOADED) {
+ ABORT_TARGET;
+ } else {
+ FREE_TARGET;
+ }
+ }
+ FREE(NewsHREF);
+ if (ProxyHREF) {
+ StrAllocCopy(NewsHost, ProxyHost);
+ FREE(ProxyHost);
+ FREE(ProxyHREF);
+ }
+ FREE(ListArg);
+ if (postfile) {
+ HTSYS_remove(postfile);
+ FREE(postfile);
+ }
+ return status;
+ } /* Retry loop */
+
+#if 0
+ HTAlert(gettext("Sorry, could not load requested news."));
+ NXRunAlertPanel(NULL, "Sorry, could not load `%s'.", NULL, NULL, NULL, arg);
+ /* No -- message earlier will have covered it */
+#endif
+
+ if (!(post_wanted || reply_wanted ||
+ spost_wanted || sreply_wanted)) {
+ ABORT_TARGET;
+ }
+ FREE(NewsHREF);
+ if (ProxyHREF) {
+ StrAllocCopy(NewsHost, ProxyHost);
+ FREE(ProxyHost);
+ FREE(ProxyHREF);
+ }
+ FREE(ListArg);
+ if (postfile) {
+ HTSYS_remove(postfile);
+ FREE(postfile);
+ }
+ return HT_NOT_LOADED;
+}
+
+/*
+ * This function clears all authorization information by
+ * invoking the free_NNTP_AuthInfo() function, which normally
+ * is invoked at exit. It allows a browser command to do
+ * this at any time, for example, if the user is leaving
+ * the terminal for a period of time, but does not want
+ * to end the current session. - FM
+ */
+void HTClearNNTPAuthInfo(void)
+{
+ /*
+ * Need code to check cached documents and do something to ensure that any
+ * protected documents no longer can be accessed without a new retrieval.
+ * - FM
+ */
+
+ /*
+ * Now free all of the authorization info. - FM
+ */
+ free_NNTP_AuthInfo();
+}
+
+#ifdef USE_SSL
+static int HTNewsGetCharacter(void)
+{
+ if (!Handle)
+ return HTGetCharacter();
+ else
+ return HTGetSSLCharacter((void *) Handle);
+}
+
+int HTNewsProxyConnect(int sock,
+ const char *url,
+ HTParentAnchor *anAnchor,
+ HTFormat format_out,
+ HTStream *sink)
+{
+ int status;
+ const char *arg = url;
+ char SSLprogress[256];
+
+ s = channel_s = sock;
+ Handle = HTGetSSLHandle();
+ SSL_set_fd(Handle, s);
+ HTSSLInitPRNG();
+ status = SSL_connect(Handle);
+
+ if (status <= 0) {
+ unsigned long SSLerror;
+
+ channel_s = -1;
+ CTRACE((tfp,
+ "HTNews: Unable to complete SSL handshake for '%s', SSL_connect=%d, SSL error stack dump follows\n",
+ url, status));
+ SSL_load_error_strings();
+ while ((SSLerror = ERR_get_error()) != 0) {
+ CTRACE((tfp, "HTNews: SSL: %s\n", ERR_error_string(SSLerror, NULL)));
+ }
+ HTAlert("Unable to make secure connection to remote host.");
+ NEWS_NETCLOSE(s);
+ s = -1;
+ return HT_NOT_LOADED;
+ }
+ sprintf(SSLprogress, "Secure %d-bit %s (%s) NNTP connection",
+ SSL_get_cipher_bits(Handle, NULL),
+ SSL_get_cipher_version(Handle),
+ SSL_get_cipher(Handle));
+ _HTProgress(SSLprogress);
+ status = HTLoadNews(arg, anAnchor, format_out, sink);
+ channel_s = -1;
+ return status;
+}
+#endif /* USE_SSL */
+
+#ifdef GLOBALDEF_IS_MACRO
+#define _HTNEWS_C_1_INIT { "news", HTLoadNews, NULL }
+GLOBALDEF(HTProtocol, HTNews, _HTNEWS_C_1_INIT);
+#define _HTNEWS_C_2_INIT { "nntp", HTLoadNews, NULL }
+GLOBALDEF(HTProtocol, HTNNTP, _HTNEWS_C_2_INIT);
+#define _HTNEWS_C_3_INIT { "newspost", HTLoadNews, NULL }
+GLOBALDEF(HTProtocol, HTNewsPost, _HTNEWS_C_3_INIT);
+#define _HTNEWS_C_4_INIT { "newsreply", HTLoadNews, NULL }
+GLOBALDEF(HTProtocol, HTNewsReply, _HTNEWS_C_4_INIT);
+#define _HTNEWS_C_5_INIT { "snews", HTLoadNews, NULL }
+GLOBALDEF(HTProtocol, HTSNews, _HTNEWS_C_5_INIT);
+#define _HTNEWS_C_6_INIT { "snewspost", HTLoadNews, NULL }
+GLOBALDEF(HTProtocol, HTSNewsPost, _HTNEWS_C_6_INIT);
+#define _HTNEWS_C_7_INIT { "snewsreply", HTLoadNews, NULL }
+GLOBALDEF(HTProtocol, HTSNewsReply, _HTNEWS_C_7_INIT);
+#else
+GLOBALDEF HTProtocol HTNews =
+{"news", HTLoadNews, NULL};
+GLOBALDEF HTProtocol HTNNTP =
+{"nntp", HTLoadNews, NULL};
+GLOBALDEF HTProtocol HTNewsPost =
+{"newspost", HTLoadNews, NULL};
+GLOBALDEF HTProtocol HTNewsReply =
+{"newsreply", HTLoadNews, NULL};
+GLOBALDEF HTProtocol HTSNews =
+{"snews", HTLoadNews, NULL};
+GLOBALDEF HTProtocol HTSNewsPost =
+{"snewspost", HTLoadNews, NULL};
+GLOBALDEF HTProtocol HTSNewsReply =
+{"snewsreply", HTLoadNews, NULL};
+#endif /* GLOBALDEF_IS_MACRO */
+
+#endif /* not DISABLE_NEWS */
diff --git a/WWW/Library/Implementation/HTNews.h b/WWW/Library/Implementation/HTNews.h
new file mode 100644
index 0000000..ef9a6e4
--- /dev/null
+++ b/WWW/Library/Implementation/HTNews.h
@@ -0,0 +1,60 @@
+/* Network News Transfer protocol module for the WWW library
+ HTNEWS
+
+ */
+/* History:
+ * 26 Sep 90 Written TBL in Objective-C
+ * 29 Nov 91 Downgraded to C, for portable implementation.
+ */
+
+#ifndef HTNEWS_H
+#define HTNEWS_H
+
+#include <HTAccess.h>
+#include <HTAnchor.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ extern int HTNewsChunkSize;
+ extern int HTNewsMaxChunk;
+
+#ifdef GLOBALREF_IS_MACRO
+ extern GLOBALREF (HTProtocol, HTNews);
+ extern GLOBALREF (HTProtocol, HTNNTP);
+ extern GLOBALREF (HTProtocol, HTNewsPost);
+ extern GLOBALREF (HTProtocol, HTNewsReply);
+ extern GLOBALREF (HTProtocol, HTSNews);
+ extern GLOBALREF (HTProtocol, HTSNewsPost);
+ extern GLOBALREF (HTProtocol, HTSNewsReply);
+
+#else
+ GLOBALREF HTProtocol HTNews;
+ GLOBALREF HTProtocol HTNNTP;
+ GLOBALREF HTProtocol HTNewsPost;
+ GLOBALREF HTProtocol HTNewsReply;
+ GLOBALREF HTProtocol HTSNews;
+ GLOBALREF HTProtocol HTSNewsPost;
+ GLOBALREF HTProtocol HTSNewsReply;
+#endif /* GLOBALREF_IS_MACRO */
+
+ extern void HTSetNewsHost(const char *value);
+ extern const char *HTGetNewsHost(void);
+ extern char *HTNewsHost;
+
+ extern void HTClearNNTPAuthInfo(void);
+
+#ifdef USE_SSL
+ extern SSL_CTX *ssl_ctx;
+
+ extern int HTNewsProxyConnect(int sock,
+ const char *url,
+ HTParentAnchor *anAnchor,
+ HTFormat format_out,
+ HTStream *sink);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* HTNEWS_H */
diff --git a/WWW/Library/Implementation/HTParse.c b/WWW/Library/Implementation/HTParse.c
new file mode 100644
index 0000000..2e45441
--- /dev/null
+++ b/WWW/Library/Implementation/HTParse.c
@@ -0,0 +1,1383 @@
+/*
+ * $LynxId: HTParse.c,v 1.98 2021/07/27 21:29:49 tom Exp $
+ *
+ * Parse HyperText Document Address HTParse.c
+ * ================================
+ */
+
+#include <HTUtils.h>
+#include <HTParse.h>
+
+#include <LYUtils.h>
+#include <LYLeaks.h>
+#include <LYStrings.h>
+#include <LYCharUtils.h>
+#include <LYGlobalDefs.h>
+
+#ifdef HAVE_ALLOCA_H
+#include <alloca.h>
+#else
+#ifdef __MINGW32__
+#include <malloc.h>
+#endif /* __MINGW32__ */
+#endif
+
+#ifdef USE_IDN2
+#include <idn2.h>
+#define FreeIdna(out) idn2_free(out)
+#elif defined(USE_IDNA)
+#include <idna.h>
+#include <idn-free.h>
+#define FreeIdna(out) idn_free(out)
+#define IDN2_OK IDNA_SUCCESS
+#endif
+
+#define HEX_ESCAPE '%'
+
+struct struct_parts {
+ char *access;
+ char *host;
+ char *absolute;
+ char *relative;
+ char *search; /* treated normally as part of path */
+ char *anchor;
+};
+
+#if 0 /* for debugging */
+static void show_parts(const char *name, struct struct_parts *parts, int line)
+{
+ if (TRACE) {
+ CTRACE((tfp, "struct_parts(%s) %s@%d\n", name, __FILE__, line));
+ CTRACE((tfp, " access '%s'\n", NONNULL(parts->access)));
+ CTRACE((tfp, " host '%s'\n", NONNULL(parts->host)));
+ CTRACE((tfp, " absolute '%s'\n", NONNULL(parts->absolute)));
+ CTRACE((tfp, " relative '%s'\n", NONNULL(parts->relative)));
+ CTRACE((tfp, " search '%s'\n", NONNULL(parts->search)));
+ CTRACE((tfp, " anchor '%s'\n", NONNULL(parts->anchor)));
+ }
+}
+#define SHOW_PARTS(name) show_parts(#name, &name, __LINE__)
+#else
+#define SHOW_PARTS(name) /* nothing */
+#endif
+
+/* Strip white space off a string. HTStrip()
+ * -------------------------------
+ *
+ * On exit,
+ * Return value points to first non-white character, or to 0 if none.
+ * All trailing white space is OVERWRITTEN with zero.
+ */
+char *HTStrip(char *s)
+{
+#define SPACE(c) ((c == ' ') || (c == '\t') || (c == '\n'))
+ char *p;
+
+ for (p = s; *p; p++) { /* Find end of string */
+ ;
+ }
+ for (p--; p >= s; p--) {
+ if (SPACE(*p))
+ *p = '\0'; /* Zap trailing blanks */
+ else
+ break;
+ }
+ while (SPACE(*s))
+ s++; /* Strip leading blanks */
+ return s;
+}
+
+/* Scan a filename for its constituents. scan()
+ * -------------------------------------
+ *
+ * On entry,
+ * name points to a document name which may be incomplete.
+ * On exit,
+ * absolute or relative may be nonzero (but not both).
+ * host, anchor and access may be nonzero if they were specified.
+ * Any which are nonzero point to zero terminated strings.
+ */
+static void scan(char *name,
+ struct struct_parts *parts)
+{
+ char *after_access;
+ char *p;
+
+ parts->access = NULL;
+ parts->host = NULL;
+ parts->absolute = NULL;
+ parts->relative = NULL;
+ parts->search = NULL; /* normally not used - kw */
+ parts->anchor = NULL;
+
+ /*
+ * Scan left-to-right for a scheme (access).
+ */
+ after_access = name;
+ for (p = name; *p; p++) {
+ if (*p == ':') {
+ *p = '\0';
+ parts->access = name; /* Access name has been specified */
+ after_access = (p + 1);
+ break;
+ }
+ if (*p == '/' || *p == '#' || *p == ';' || *p == '?')
+ break;
+ }
+
+ /*
+ * Scan left-to-right for a fragment (anchor).
+ */
+ for (p = after_access; *p; p++) {
+ if (*p == '#') {
+ parts->anchor = (p + 1);
+ *p = '\0'; /* terminate the rest */
+ break; /* leave things after first # alone - kw */
+ }
+ }
+
+ /*
+ * Scan left-to-right for a host or absolute path.
+ */
+ p = after_access;
+ if (*p == '/') {
+ if (p[1] == '/') {
+ parts->host = (p + 2); /* host has been specified */
+ *p = '\0'; /* Terminate access */
+ p = StrChr(parts->host, '/'); /* look for end of host name if any */
+ if (p != NULL) {
+ *p = '\0'; /* Terminate host */
+ parts->absolute = (p + 1); /* Root has been found */
+ } else {
+ p = StrChr(parts->host, '?');
+ if (p != NULL) {
+ *p = '\0'; /* Terminate host */
+ parts->search = (p + 1);
+ }
+ }
+ } else {
+ parts->absolute = (p + 1); /* Root found but no host */
+ }
+ } else {
+ parts->relative = (*after_access) ?
+ after_access : NULL; /* NULL for "" */
+ }
+
+ /*
+ * Check schemes that commonly have unescaped hashes.
+ */
+ if (parts->access && parts->anchor &&
+ /* optimize */ StrChr("lnsdLNSD", *parts->access) != NULL) {
+ if ((!parts->host && strcasecomp(parts->access, "lynxcgi")) ||
+ !strcasecomp(parts->access, "nntp") ||
+ !strcasecomp(parts->access, "snews") ||
+ !strcasecomp(parts->access, "news") ||
+ !strcasecomp(parts->access, "data")) {
+ /*
+ * Access specified but no host and not a lynxcgi URL, so the
+ * anchor may not really be one, e.g., news:j462#36487@foo.bar, or
+ * it's an nntp or snews URL, or news URL with a host. Restore the
+ * '#' in the address.
+ */
+ /* but only if we have found a path component of which this will
+ * become part. - kw */
+ if (parts->relative || parts->absolute) {
+ *(parts->anchor - 1) = '#';
+ parts->anchor = NULL;
+ }
+ }
+ }
+} /*scan */
+
+#if defined(HAVE_ALLOCA) && !defined(LY_FIND_LEAKS)
+#define LYalloca(x) alloca((size_t)(x))
+#define LYalloca_free(x) {}
+#else
+#define LYalloca(x) malloc((size_t)(x))
+#define LYalloca_free(x) free((void *)(x))
+#endif
+
+static char *strchr_or_end(char *string, int ch)
+{
+ char *result = StrChr(string, ch);
+
+ if (result == 0) {
+ result = string + strlen(string);
+ }
+ return result;
+}
+
+/*
+ * Given a host specification that may end with a port number, e.g.,
+ * foobar:123
+ * point to the ':' which begins the ":port" to make it simple to handle the
+ * substring.
+ *
+ * If no port is found (or a syntax error), return null.
+ */
+char *HTParsePort(char *host, int *portp)
+{
+ int brackets = 0;
+ char *result = NULL;
+
+ *portp = 0;
+ if (host != NULL) {
+ while (*host != '\0' && result == 0) {
+ switch (*host++) {
+ case ':':
+ if (brackets == 0 && isdigit(UCH(*host))) {
+ char *next = NULL;
+
+ *portp = (int) strtol(host, &next, 10);
+ if (next != 0 && next != host && *next == '\0') {
+ result = (host - 1);
+ CTRACE((tfp, "HTParsePort %d\n", *portp));
+ }
+ }
+ break;
+ case '[': /* for ipv6 */
+ ++brackets;
+ break;
+ case ']': /* for ipv6 */
+ --brackets;
+ break;
+ }
+ }
+ }
+ return result;
+}
+
+#if defined(USE_IDNA) || defined(USE_IDN2)
+static int hex_decode(int ch)
+{
+ int result = -1;
+
+ if (ch >= '0' && ch <= '9')
+ result = (ch - '0');
+ else if (ch >= 'a' && ch <= 'f')
+ result = (ch - 'a') + 10;
+ else if (ch >= 'A' && ch <= 'F')
+ result = (ch - 'A') + 10;
+ return result;
+}
+
+/*
+ * Convert in-place the given hostname to IDNA form. That requires up to 64
+ * characters, and we've allowed for that, with MIN_PARSE.
+ */
+static void convert_to_idna(char *host)
+{
+ size_t length = strlen(host);
+ char *endhost = host + length;
+ char *buffer = malloc(length + 1);
+ char *params = malloc(length + 1);
+ char *output = NULL;
+ char *src, *dst;
+ int code;
+ int hi, lo;
+
+ if (buffer != NULL && params != NULL) {
+ code = TRUE;
+ *params = '\0';
+ for (dst = buffer, src = host; src < endhost; ++dst) {
+ int ch = *src++;
+
+ if (RFC_3986_GEN_DELIMS(ch)) {
+ strcpy(params, src - 1);
+ *dst = '\0';
+ break;
+ } else if (ch == HEX_ESCAPE) {
+ if ((src + 1) < endhost
+ && (hi = hex_decode(src[0])) >= 0
+ && (lo = hex_decode(src[1])) >= 0) {
+
+ *dst = (char) ((hi << 4) | lo);
+ src += 2;
+ } else {
+ CTRACE((tfp, "convert_to_idna: `%s' is malformed\n", host));
+ code = FALSE;
+ break;
+ }
+ } else {
+ *dst = (char) ch;
+ }
+ }
+ if (code) {
+ *dst = '\0';
+#ifdef USE_IDN2
+#if (!defined(IDN2_VERSION_NUMBER) || IDN2_VERSION_NUMBER < 0x02000003)
+ /*
+ * Older libidn2 mishandles STD3, stripping underscores.
+ */
+ if (strchr(buffer, '_') != NULL) {
+ code = -1;
+ } else
+#endif
+ switch (LYidnaMode) {
+ case LYidna2003:
+ code = idn2_to_ascii_8z(buffer, &output, IDN2_TRANSITIONAL);
+ break;
+ case LYidna2008:
+ /* IDNA2008 rules without the TR46 amendments */
+ code = idn2_to_ascii_8z(buffer, &output, 0);
+ break;
+ case LYidnaTR46:
+ code = idn2_to_ascii_8z(buffer, &output, IDN2_NONTRANSITIONAL
+ | IDN2_NFC_INPUT);
+ break;
+ case LYidnaCompat:
+ /* IDNA2008 */
+ code = idn2_to_ascii_8z(buffer, &output, IDN2_NONTRANSITIONAL
+ | IDN2_NFC_INPUT);
+ if (code == IDN2_DISALLOWED) {
+ /* IDNA2003 - compatible */
+ code = idn2_to_ascii_8z(buffer, &output, IDN2_TRANSITIONAL);
+ }
+ break;
+ }
+#else
+ code = idna_to_ascii_8z(buffer, &output, IDNA_USE_STD3_ASCII_RULES);
+#endif
+ if (code == IDN2_OK) {
+ CTRACE((tfp, "convert_to_idna: `%s' -> `%s': OK\n", buffer, output));
+ strcpy(host, output);
+ strcat(host, params);
+ } else {
+ CTRACE((tfp, "convert_to_idna: `%s': %s\n",
+ buffer,
+ idna_strerror((Idna_rc) code)));
+ }
+ if (output)
+ FreeIdna(output);
+ }
+ }
+ free(buffer);
+ free(params);
+}
+#define MIN_PARSE 80
+#else
+#define MIN_PARSE 8
+#endif
+
+/* Parse a Name relative to another name. HTParse()
+ * --------------------------------------
+ *
+ * This returns those parts of a name which are given (and requested)
+ * substituting bits from the related name where necessary.
+ *
+ * Originally based on RFC 1808, some details in RFC 3986 are used.
+ *
+ * On entry,
+ * aName A filename given
+ * relatedName A name relative to which aName is to be parsed
+ * wanted A mask for the bits which are wanted.
+ *
+ * On exit,
+ * returns A pointer to a malloc'd string which MUST BE FREED
+ */
+char *HTParse(const char *aName,
+ const char *relatedName,
+ int wanted)
+{
+ char *result = NULL;
+ char *tail = NULL; /* a pointer to the end of the 'result' string */
+ char *return_value = NULL;
+ size_t len, len1, len2;
+ size_t need;
+ char *name = NULL;
+ char *rel = NULL;
+ char *p, *q;
+ char *acc_method;
+ struct struct_parts given, related;
+
+ CTRACE((tfp, "HTParse: aName:`%s'\n", aName));
+ CTRACE((tfp, " relatedName:`%s'\n", relatedName));
+
+ if (wanted & (PARSE_STRICTPATH | PARSE_QUERY)) { /* if detail wanted... */
+ if ((wanted & (PARSE_STRICTPATH | PARSE_QUERY))
+ == (PARSE_STRICTPATH | PARSE_QUERY)) /* if strictpath AND query */
+ wanted |= PARSE_PATH; /* then treat as if PARSE_PATH wanted */
+ if (wanted & PARSE_PATH) /* if PARSE_PATH wanted */
+ wanted &= ~(PARSE_STRICTPATH | PARSE_QUERY); /* ignore details */
+ }
+/* *INDENT-OFF* */
+ CTRACE((tfp, " want:%s%s%s%s%s%s%s\n",
+ wanted & PARSE_PUNCTUATION ? " punc" : "",
+ wanted & PARSE_ANCHOR ? " anchor" : "",
+ wanted & PARSE_PATH ? " path" : "",
+ wanted & PARSE_HOST ? " host" : "",
+ wanted & PARSE_ACCESS ? " access" : "",
+ wanted & PARSE_STRICTPATH ? " PATH" : "",
+ wanted & PARSE_QUERY ? " QUERY" : ""));
+/* *INDENT-ON* */
+
+ /*
+ * Allocate the temporary string. Optimized.
+ */
+ len1 = strlen(aName) + 1;
+ len2 = strlen(relatedName) + 1;
+ len = len1 + len2 + MIN_PARSE; /* Lots of space: more than enough */
+
+ need = (len * 2 + len1 + len2);
+ if (need > (size_t) max_uri_size ||
+ (int) need < (int) len1 ||
+ (int) need < (int) len2)
+ return StrAllocCopy(return_value, "");
+
+ result = tail = (char *) LYalloca(need);
+ if (result == NULL) {
+ outofmem(__FILE__, "HTParse");
+ }
+ *result = '\0';
+ name = result + len;
+ rel = name + len1;
+
+ /*
+ * Make working copy of the input string to cut up.
+ */
+ MemCpy(name, aName, len1);
+
+ /*
+ * Cut up the string into URL fields.
+ */
+ scan(name, &given);
+ SHOW_PARTS(given);
+
+ /*
+ * Now related string.
+ */
+ if ((given.access && given.host && given.absolute) || !*relatedName) {
+ /*
+ * Inherit nothing!
+ */
+ related.access = NULL;
+ related.host = NULL;
+ related.absolute = NULL;
+ related.relative = NULL;
+ related.search = NULL;
+ related.anchor = NULL;
+ } else {
+ MemCpy(rel, relatedName, len2);
+ scan(rel, &related);
+ }
+ SHOW_PARTS(related);
+
+ /*
+ * Handle the scheme (access) field.
+ */
+ if (given.access && given.host && !given.relative && !given.absolute) {
+ if (!strcmp(given.access, "http") ||
+ !strcmp(given.access, "https") ||
+ !strcmp(given.access, "ftp")) {
+
+ /*
+ * Assume root.
+ */
+ given.absolute = empty_string;
+ }
+ }
+ acc_method = given.access ? given.access : related.access;
+ if (wanted & PARSE_ACCESS) {
+ if (acc_method) {
+ strcpy(tail, acc_method);
+ tail += strlen(tail);
+ if (wanted & PARSE_PUNCTUATION) {
+ *tail++ = ':';
+ *tail = '\0';
+ }
+ }
+ }
+
+ /*
+ * If different schemes, inherit nothing.
+ *
+ * We'll try complying with RFC 1808 and the Fielding draft, and inherit
+ * nothing if both schemes are given, rather than only when they differ,
+ * except for file URLs - FM
+ *
+ * After trying it for a while, it's still premature, IHMO, to go along
+ * with it, so this is back to inheriting for identical schemes whether or
+ * not they are "file". If you want to try it again yourself, uncomment
+ * the strcasecomp() below. - FM
+ */
+ if ((given.access && related.access) &&
+ ( /* strcasecomp(given.access, "file") || */
+ strcmp(given.access, related.access))) {
+ related.host = NULL;
+ related.absolute = NULL;
+ related.relative = NULL;
+ related.search = NULL;
+ related.anchor = NULL;
+ }
+
+ /*
+ * Handle the host field.
+ */
+ if (wanted & PARSE_HOST) {
+ if (given.host || related.host) {
+ if (wanted & PARSE_PUNCTUATION) {
+ *tail++ = '/';
+ *tail++ = '/';
+ }
+ strcpy(tail, given.host ? given.host : related.host);
+ /*
+ * Ignore default port numbers, and trailing dots on FQDNs, which
+ * will only cause identical addresses to look different. (related
+ * is already a clean url).
+ */
+ {
+ char *p2, *h;
+ int portnumber;
+ int gen_delims = 0;
+
+ if ((p2 = HTSkipToAt(result, &gen_delims)) != NULL
+ && gen_delims == 0) {
+ tail = (p2 + 1);
+ }
+ p2 = HTParsePort(result, &portnumber);
+ if (p2 != NULL && acc_method != NULL) {
+ /*
+ * Port specified.
+ */
+#define ACC_METHOD(a,b) (!strcmp(acc_method, a) && (portnumber == b))
+ if (ACC_METHOD("http", 80) ||
+ ACC_METHOD("https", 443) ||
+ ACC_METHOD("gopher", 70) ||
+ ACC_METHOD("ftp", 21) ||
+ ACC_METHOD("wais", 210) ||
+ ACC_METHOD("nntp", 119) ||
+ ACC_METHOD("news", 119) ||
+ ACC_METHOD("newspost", 119) ||
+ ACC_METHOD("newsreply", 119) ||
+ ACC_METHOD("snews", 563) ||
+ ACC_METHOD("snewspost", 563) ||
+ ACC_METHOD("snewsreply", 563) ||
+ ACC_METHOD("finger", 79) ||
+ ACC_METHOD("telnet", 23) ||
+ ACC_METHOD("tn3270", 23) ||
+ ACC_METHOD("rlogin", 513) ||
+ ACC_METHOD("cso", 105))
+ *p2 = '\0'; /* It is the default: ignore it */
+ }
+ if (p2 == NULL) {
+ int len3 = (int) strlen(tail);
+
+ if (len3 > 0) {
+ h = tail + len3 - 1; /* last char of hostname */
+ if (*h == '.')
+ *h = '\0'; /* chop final . */
+ }
+ } else if (p2 != result) {
+ h = p2;
+ h--; /* End of hostname */
+ if (*h == '.') {
+ /*
+ * Slide p2 over h.
+ */
+ while (*p2 != '\0')
+ *h++ = *p2++;
+ *h = '\0'; /* terminate */
+ }
+ }
+ }
+#if defined(USE_IDNA) || defined(USE_IDN2)
+ /*
+ * Depending on locale-support, we could have a literal UTF-8
+ * string as a host name, or a URL-encoded form of that.
+ */
+ convert_to_idna(tail);
+#endif
+ }
+ }
+
+ /*
+ * Trim any blanks from the result so far - there's no excuse for blanks
+ * in a hostname. Also update the tail here.
+ */
+ tail = LYRemoveBlanks(result);
+
+ /*
+ * If host in given or related was ended directly with a '?' (no slash),
+ * fake the search part into absolute. This is the only case search is
+ * returned from scan. A host must have been present. this restores the
+ * '?' at which the host part had been truncated in scan, we have to do
+ * this after host part handling is done. - kw
+ */
+ if (given.search && *(given.search - 1) == '\0') {
+ given.absolute = given.search - 1;
+ given.absolute[0] = '?';
+ } else if (related.search && !related.absolute &&
+ *(related.search - 1) == '\0') {
+ related.absolute = related.search - 1;
+ related.absolute[0] = '?';
+ }
+
+ /*
+ * If different hosts, inherit no path.
+ */
+ if (given.host && related.host)
+ if (strcmp(given.host, related.host) != 0) {
+ related.absolute = NULL;
+ related.relative = NULL;
+ related.anchor = NULL;
+ }
+
+ /*
+ * Handle the path.
+ */
+ if (wanted & (PARSE_PATH | PARSE_STRICTPATH | PARSE_QUERY)) {
+ int want_detail = (wanted & (PARSE_STRICTPATH | PARSE_QUERY));
+
+ if (acc_method && !given.absolute && given.relative) {
+ /*
+ * Treat all given nntp or snews paths, or given paths for news
+ * URLs with a host, as absolute.
+ */
+ switch (*acc_method) {
+ case 'N':
+ case 'n':
+ if (!strcasecomp(acc_method, "nntp") ||
+ (!strcasecomp(acc_method, "news") &&
+ !strncasecomp(result, "news://", 7))) {
+ given.absolute = given.relative;
+ given.relative = NULL;
+ }
+ break;
+ case 'S':
+ case 's':
+ if (!strcasecomp(acc_method, "snews")) {
+ given.absolute = given.relative;
+ given.relative = NULL;
+ }
+ break;
+ }
+ }
+
+ if (given.absolute) { /* All is given */
+ char *base = tail;
+
+ if (wanted & PARSE_PUNCTUATION)
+ *tail++ = '/';
+ strcpy(tail, given.absolute);
+ HTSimplify(base, TRUE);
+ CTRACE((tfp, "HTParse: (ABS)\n"));
+ } else if (related.absolute) { /* Adopt path not name */
+ char *base = tail;
+
+ *tail++ = '/';
+ strcpy(tail, related.absolute);
+ if (given.relative) {
+ /* RFC 1808 part 4 step 5 (if URL path is empty) */
+ /* a) if given has params, add/replace that */
+ if (given.relative[0] == ';') {
+ strcpy(strchr_or_end(tail, ';'), given.relative);
+ }
+ /* b) if given has query, add/replace that */
+ else if (given.relative[0] == '?') {
+ strcpy(strchr_or_end(tail, '?'), given.relative);
+ }
+ /* otherwise fall through to RFC 1808 part 4 step 6 */
+ else {
+ p = StrChr(tail, '?'); /* Search part? */
+ if (p == NULL)
+ p = (tail + strlen(tail) - 1);
+ for (; *p != '/'; p--) ; /* last / */
+ p[1] = '\0'; /* Remove filename */
+ strcat(p, given.relative); /* Add given one */
+ }
+ HTSimplify(base, FALSE);
+ if (*base == '\0')
+ strcpy(base, "/");
+ } else {
+ HTSimplify(base, TRUE);
+ }
+ if (base[0] == '/' && base[1] == '/') {
+ char *pz;
+
+ for (pz = base; (pz[0] = pz[1]) != '\0'; ++pz) ;
+ }
+ CTRACE((tfp, "HTParse: (Related-ABS)\n"));
+ } else if (given.relative) {
+ strcpy(tail, given.relative); /* what we've got */
+ HTSimplify(tail, FALSE);
+ CTRACE((tfp, "HTParse: (REL)\n"));
+ } else if (related.relative) {
+ strcpy(tail, related.relative);
+ HTSimplify(tail, FALSE);
+ CTRACE((tfp, "HTParse: (Related-REL)\n"));
+ } else { /* No inheritance */
+ if (!isLYNXCGI(aName) &&
+ !isLYNXEXEC(aName) &&
+ !isLYNXPROG(aName)) {
+ *tail++ = '/';
+ *tail = '\0';
+ } else {
+ HTSimplify(tail, FALSE);
+ }
+ if (!strcmp(result, "news:/"))
+ result[5] = '*';
+ CTRACE((tfp, "HTParse: (No inheritance)\n"));
+ }
+ if (want_detail) {
+ p = StrChr(tail, '?'); /* Search part? */
+ if (p) {
+ if (PARSE_STRICTPATH) {
+ *p = '\0';
+ } else {
+ if (!(wanted & PARSE_PUNCTUATION))
+ p++;
+ do {
+ *tail++ = *p;
+ } while (*p++);
+ }
+ } else {
+ if (wanted & PARSE_QUERY)
+ *tail = '\0';
+ }
+ }
+ }
+
+ /*
+ * Handle the fragment (anchor). Never inherit.
+ */
+ if (wanted & PARSE_ANCHOR) {
+ if (given.anchor && *given.anchor) {
+ tail += strlen(tail);
+ if (wanted & PARSE_PUNCTUATION)
+ *tail++ = '#';
+ strcpy(tail, given.anchor);
+ }
+ }
+
+ /*
+ * If there are any blanks remaining in the string, escape them as needed.
+ * See the discussion in LYLegitimizeHREF() for example.
+ */
+ if ((p = StrChr(result, ' ')) != 0) {
+ switch (is_url(result)) {
+ case UNKNOWN_URL_TYPE:
+ CTRACE((tfp, "HTParse: ignore:`%s'\n", result));
+ break;
+ case LYNXEXEC_URL_TYPE:
+ case LYNXPROG_URL_TYPE:
+ case LYNXCGI_URL_TYPE:
+ case LYNXPRINT_URL_TYPE:
+ case LYNXHIST_URL_TYPE:
+ case LYNXDOWNLOAD_URL_TYPE:
+ case LYNXKEYMAP_URL_TYPE:
+ case LYNXIMGMAP_URL_TYPE:
+ case LYNXCOOKIE_URL_TYPE:
+ case LYNXCACHE_URL_TYPE:
+ case LYNXDIRED_URL_TYPE:
+ case LYNXOPTIONS_URL_TYPE:
+ case LYNXCFG_URL_TYPE:
+ case LYNXCOMPILE_OPTS_URL_TYPE:
+ case LYNXMESSAGES_URL_TYPE:
+ CTRACE((tfp, "HTParse: spaces:`%s'\n", result));
+ break;
+ case NOT_A_URL_TYPE:
+ default:
+ CTRACE((tfp, "HTParse: encode:`%s'\n", result));
+ do {
+ q = p + strlen(p) + 2;
+
+ while (q != p + 1) {
+ q[0] = q[-2];
+ --q;
+ }
+ p[0] = HEX_ESCAPE;
+ p[1] = '2';
+ p[2] = '0';
+ } while ((p = StrChr(result, ' ')) != 0);
+ break;
+ }
+ }
+ CTRACE((tfp, "HTParse: result:`%s'\n", result));
+
+ StrAllocCopy(return_value, result);
+ LYalloca_free(result);
+
+ /* FIXME: could be optimized using HTParse() internals */
+ if (*relatedName &&
+ ((wanted & PARSE_ALL_WITHOUT_ANCHOR) == PARSE_ALL_WITHOUT_ANCHOR)) {
+ /*
+ * Check whether to fill in localhost. - FM
+ */
+ LYFillLocalFileURL(&return_value, relatedName);
+ CTRACE((tfp, "pass LYFillLocalFile:`%s'\n", return_value));
+ }
+
+ return return_value; /* exactly the right length */
+}
+
+/* HTParseAnchor(), fast HTParse() specialization
+ * ----------------------------------------------
+ *
+ * On exit,
+ * returns A pointer within input string (probably to its end '\0')
+ */
+const char *HTParseAnchor(const char *aName)
+{
+ const char *p = aName;
+
+ for (; *p && *p != '#'; p++) {
+ ;
+ }
+ if (*p == '#') {
+ /* the safe way based on HTParse() -
+ * keeping in mind scan() peculiarities on schemes:
+ */
+ struct struct_parts given;
+ size_t need = ((unsigned) ((p - aName) + (int) strlen(p) + 1));
+ char *name;
+
+ if (need > (size_t) max_uri_size) {
+ p += strlen(p);
+ } else {
+ name = (char *) LYalloca(need);
+
+ if (name == NULL) {
+ outofmem(__FILE__, "HTParseAnchor");
+ }
+ strcpy(name, aName);
+ scan(name, &given);
+ LYalloca_free(name);
+
+ p++; /*next to '#' */
+ if (given.anchor == NULL) {
+ for (; *p; p++) /*scroll to end '\0' */
+ ;
+ }
+ }
+ }
+ return p;
+}
+
+/* Simplify a filename. HTSimplify()
+ * --------------------
+ *
+ * A unix-style file is allowed to contain the sequence xxx/../ which may
+ * be replaced by "" , and the sequence "/./" which may be replaced by "/".
+ * Simplification helps us recognize duplicate filenames.
+ *
+ * RFC 3986 section 5.2.4 says to do this whether or not the path was relative.
+ */
+void HTSimplify(char *filename, BOOL absolute)
+{
+#define MY_FMT "HTParse HTSimplify\t(%s)"
+#ifdef NO_LYNX_TRACE
+#define debug_at(at) /* nothing */
+#define atln "?"
+#else
+ const char *atln;
+
+#define debug_at(at) atln = at
+#endif
+ char *mark;
+ char *p;
+ size_t limit;
+
+ CTRACE2(TRACE_HTPARSE,
+ (tfp, MY_FMT " %s\n",
+ filename,
+ absolute ? "ABS" : "REL"));
+
+ if (LYIsPathSep(*filename) && !absolute)
+ ++filename;
+ mark = filename;
+ limit = strlen(filename);
+
+ for (p = filename; *p; ++p) {
+ if (*p == '?' || *p == '#') {
+ limit = (size_t) (p - filename);
+ break;
+ }
+ }
+ while ((limit != 0) && (*filename != '\0')) {
+ size_t trim = 0;
+ size_t skip = 0;
+ size_t last = 0;
+
+ debug_at("?");
+ p = filename;
+ if (limit >= 2 && !memcmp(p, "./", 2)) { /* 2A */
+ debug_at("2A");
+ trim = 2;
+ } else if (limit >= 3 && !memcmp(p, "../", 3)) {
+ debug_at("2A2");
+ trim = 3;
+ } else if (limit >= 3 && !memcmp(p, "/./", 3)) { /* 2B */
+ debug_at("2B");
+ trim = 2;
+ skip = 1;
+ } else if (limit == 2 && !memcmp(p, "/.", 2)) {
+ debug_at("2B2");
+ trim = 1;
+ skip = 1;
+ } else if (limit >= 4 && !memcmp(p, "/../", 4)) { /* 2C */
+ debug_at("2C");
+ trim = 3;
+ skip = 1;
+ last = 1;
+ } else if (limit == 3 && !memcmp(p, "/..", 3)) {
+ debug_at("2C2");
+ trim = 2;
+ skip = 1;
+ last = 1;
+ } else if (limit == 2 && !memcmp(p, "..", 2)) { /* 2D */
+ debug_at("2D");
+ trim = 2;
+ } else if (limit == 1 && !memcmp(p, ".", 1)) {
+ debug_at("2D2");
+ trim = 1;
+ }
+ if (trim) {
+ CTRACE2(TRACE_HTPARSE,
+ (tfp, MY_FMT " trim %lu/%lu (%.*s) '%.*s' @%s\n",
+ mark, (unsigned long) trim, (unsigned long) limit,
+ (int) trim, p + skip, (int) limit, p, atln));
+ }
+ if (last) {
+ char *prior = filename;
+
+ if (prior != mark) {
+ --prior;
+ while (prior != mark && *prior != '/') {
+ --prior;
+ }
+ }
+ if (prior != filename) {
+ trim += (size_t) (filename - prior);
+ limit += (size_t) (filename - prior);
+ filename = prior;
+ CTRACE2(TRACE_HTPARSE,
+ (tfp, MY_FMT " TRIM %lu/%lu (%.*s)\n",
+ mark, (unsigned long) trim, (unsigned long) limit,
+ (int) trim, filename + skip));
+ }
+ }
+ if (trim) {
+ limit -= trim;
+ for (p = filename;; ++p) {
+ if ((p[0] = p[trim]) == '\0') {
+ break;
+ }
+ if (skip) {
+ p[0] = '/';
+ skip = 0;
+ }
+ }
+ CTRACE2(TRACE_HTPARSE,
+ (tfp, MY_FMT " loop %lu\n", mark, (unsigned long) limit));
+ } else {
+ if (*filename == '/') {
+ ++filename;
+ --limit;
+ }
+ while ((limit != 0) && (*filename != '/')) {
+ ++filename;
+ --limit;
+ }
+ }
+ }
+ CTRACE2(TRACE_HTPARSE, (tfp, MY_FMT " done\n", mark));
+#undef MY_FMT
+}
+
+/* Make Relative Name. HTRelative()
+ * -------------------
+ *
+ * This function creates and returns a string which gives an expression of
+ * one address as related to another. Where there is no relation, an absolute
+ * address is returned.
+ *
+ * On entry,
+ * Both names must be absolute, fully qualified names of nodes
+ * (no anchor bits)
+ *
+ * On exit,
+ * The return result points to a newly allocated name which, if
+ * parsed by HTParse relative to relatedName, will yield aName.
+ * The caller is responsible for freeing the resulting name later.
+ *
+ */
+char *HTRelative(const char *aName,
+ const char *relatedName)
+{
+ char *result = NULL;
+ const char *p = aName;
+ const char *q = relatedName;
+ const char *after_access = NULL;
+ const char *path = NULL;
+ const char *last_slash = NULL;
+ int slashes = 0;
+
+ for (; *p; p++, q++) { /* Find extent of match */
+ if (*p != *q)
+ break;
+ if (*p == ':')
+ after_access = p + 1;
+ if (*p == '/') {
+ last_slash = p;
+ slashes++;
+ if (slashes == 3)
+ path = p;
+ }
+ }
+
+ /* q, p point to the first non-matching character or zero */
+
+ if (!after_access) { /* Different access */
+ StrAllocCopy(result, aName);
+ } else if (slashes < 3) { /* Different nodes */
+ StrAllocCopy(result, after_access);
+ } else if (slashes == 3) { /* Same node, different path */
+ StrAllocCopy(result, path);
+ } else { /* Some path in common */
+ unsigned levels = 0;
+
+ for (; *q && (*q != '#'); q++)
+ if (*q == '/')
+ levels++;
+ result = typecallocn(char, 3 * levels + strlen(last_slash) + 1);
+
+ if (result == NULL)
+ outofmem(__FILE__, "HTRelative");
+
+ result[0] = '\0';
+ for (; levels; levels--)
+ strcat(result, "../");
+ strcat(result, last_slash + 1);
+ }
+ CTRACE((tfp,
+ "HTparse: `%s' expressed relative to\n `%s' is\n `%s'.\n",
+ aName, relatedName, result));
+ return result;
+}
+
+#define AlloCopy(next,base,extra) \
+ typecallocn(char, ((next - base) + ((int) extra)))
+
+/* Escape undesirable characters using % HTEscape()
+ * -------------------------------------
+ *
+ * This function takes a pointer to a string in which
+ * some characters may be unacceptable unescaped.
+ * It returns a string which has these characters
+ * represented by a '%' character followed by two hex digits.
+ *
+ * Unlike HTUnEscape(), this routine returns a calloc'd string.
+ */
+/* *INDENT-OFF* */
+static const unsigned char isAcceptable[96] =
+
+/* Bit 0 xalpha -- see HTFile.h
+ * Bit 1 xpalpha -- as xalpha but with plus.
+ * Bit 2 ... path -- as xpalphas but with /
+ */
+ /* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
+ { 0,0,0,0,0,0,0,0,0,0,7,6,0,7,7,4, /* 2x !"#$%&'()*+,-./ */
+ 7,7,7,7,7,7,7,7,7,7,0,0,0,0,0,0, /* 3x 0123456789:;<=>? */
+ 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, /* 4x @ABCDEFGHIJKLMNO */
+ 7,7,7,7,7,7,7,7,7,7,7,0,0,0,0,7, /* 5X PQRSTUVWXYZ[\]^_ */
+ 0,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, /* 6x `abcdefghijklmno */
+ 7,7,7,7,7,7,7,7,7,7,7,0,0,0,0,0 }; /* 7X pqrstuvwxyz{|}~ DEL */
+/* *INDENT-ON* */
+
+static const char *hex = "0123456789ABCDEF";
+
+#define ACCEPTABLE(a) ( a>=32 && a<128 && ((isAcceptable[a-32]) & mask))
+
+char *HTEscape(const char *str,
+ unsigned mask)
+{
+ const char *p;
+ char *q;
+ char *result;
+ size_t unacceptable = 0;
+
+ for (p = str; *p; p++)
+ if (!ACCEPTABLE(UCH(TOASCII(*p))))
+ unacceptable++;
+ result = AlloCopy(p, str, (unacceptable * 2) + 1);
+
+ if (result == NULL)
+ outofmem(__FILE__, "HTEscape");
+
+ for (q = result, p = str; *p; p++) {
+ unsigned char a = UCH(TOASCII(*p));
+
+ if (!ACCEPTABLE(a)) {
+ *q++ = HEX_ESCAPE; /* Means hex coming */
+ *q++ = hex[a >> 4];
+ *q++ = hex[a & 15];
+ } else
+ *q++ = *p;
+ }
+ *q = '\0'; /* Terminate */
+ return result;
+}
+
+/* Escape unsafe characters using % HTEscapeUnsafe()
+ * --------------------------------
+ *
+ * This function takes a pointer to a string in which
+ * some characters may be that may be unsafe are unescaped.
+ * It returns a string which has these characters
+ * represented by a '%' character followed by two hex digits.
+ *
+ * Unlike HTUnEscape(), this routine returns a malloc'd string.
+ */
+#define UNSAFE(ch) (((ch) <= 32) || ((ch) >= 127))
+
+char *HTEscapeUnsafe(const char *str)
+{
+ const char *p;
+ char *q;
+ char *result;
+ size_t unacceptable = 0;
+
+ for (p = str; *p; p++)
+ if (UNSAFE(UCH(TOASCII(*p))))
+ unacceptable++;
+ result = AlloCopy(p, str, (unacceptable * 2) + 1);
+
+ if (result == NULL)
+ outofmem(__FILE__, "HTEscapeUnsafe");
+
+ for (q = result, p = str; *p; p++) {
+ unsigned char a = UCH(TOASCII(*p));
+
+ if (UNSAFE(a)) {
+ *q++ = HEX_ESCAPE; /* Means hex coming */
+ *q++ = hex[a >> 4];
+ *q++ = hex[a & 15];
+ } else
+ *q++ = *p;
+ }
+ *q = '\0'; /* Terminate */
+ return result;
+}
+
+/* Escape undesirable characters using % but space to +. HTEscapeSP()
+ * -----------------------------------------------------
+ *
+ * This function takes a pointer to a string in which
+ * some characters may be unacceptable unescaped.
+ * It returns a string which has these characters
+ * represented by a '%' character followed by two hex digits,
+ * except that spaces are converted to '+' instead of %2B.
+ *
+ * Unlike HTUnEscape(), this routine returns a calloced string.
+ */
+char *HTEscapeSP(const char *str,
+ unsigned mask)
+{
+ const char *p;
+ char *q;
+ char *result;
+ size_t unacceptable = 0;
+
+ for (p = str; *p; p++)
+ if (!(*p == ' ' || ACCEPTABLE(UCH(TOASCII(*p)))))
+ unacceptable++;
+ result = AlloCopy(p, str, (unacceptable * 2) + 1);
+
+ if (result == NULL)
+ outofmem(__FILE__, "HTEscape");
+
+ for (q = result, p = str; *p; p++) {
+ unsigned char a = UCH(TOASCII(*p));
+
+ if (a == 32) {
+ *q++ = '+';
+ } else if (!ACCEPTABLE(a)) {
+ *q++ = HEX_ESCAPE; /* Means hex coming */
+ *q++ = hex[a >> 4];
+ *q++ = hex[a & 15];
+ } else {
+ *q++ = *p;
+ }
+ }
+ *q = '\0'; /* Terminate */
+ return result;
+}
+
+/* Decode %xx escaped characters. HTUnEscape()
+ * ------------------------------
+ *
+ * This function takes a pointer to a string in which some
+ * characters may have been encoded in %xy form, where xy is
+ * the ASCII hex code for character 16x+y.
+ * The string is converted in place, as it will never grow.
+ */
+static char from_hex(int c)
+{
+ return (char) (c >= '0' && c <= '9' ? c - '0'
+ : c >= 'A' && c <= 'F' ? c - 'A' + 10
+ : c - 'a' + 10); /* accept small letters just in case */
+}
+
+char *HTUnEscape(char *str)
+{
+ char *p = str;
+ char *q = str;
+
+ if (!(p && *p))
+ return str;
+
+ while (*p != '\0') {
+ if (*p == HEX_ESCAPE &&
+ /*
+ * Tests shouldn't be needed, but better safe than sorry.
+ */
+ p[1] && p[2] &&
+ isxdigit(UCH(p[1])) &&
+ isxdigit(UCH(p[2]))) {
+ p++;
+ if (*p)
+ *q = (char) (from_hex(*p++) * 16);
+ if (*p) {
+ /*
+ * Careful! FROMASCII() may evaluate its arg more than once!
+ */
+ /* S/390 -- gil -- 0221 */
+ *q = (char) (*q + from_hex(*p++));
+ }
+ *q = FROMASCII(*q);
+ q++;
+ } else {
+ *q++ = *p++;
+ }
+ }
+
+ *q = '\0';
+ return str;
+
+} /* HTUnEscape */
+
+/* Decode some %xx escaped characters. HTUnEscapeSome()
+ * ----------------------------------- Klaus Weide
+ * (kweide@tezcat.com)
+ * This function takes a pointer to a string in which some
+ * characters may have been encoded in %xy form, where xy is
+ * the ASCII hex code for character 16x+y, and a pointer to
+ * a second string containing one or more characters which
+ * should be unescaped if escaped in the first string.
+ * The first string is converted in place, as it will never grow.
+ */
+char *HTUnEscapeSome(char *str,
+ const char *do_trans)
+{
+ char *p = str;
+ char *q = str;
+ char testcode;
+
+ if (p == NULL || *p == '\0' || do_trans == NULL || *do_trans == '\0')
+ return str;
+
+ while (*p != '\0') {
+ if (*p == HEX_ESCAPE &&
+ p[1] && p[2] && /* tests shouldn't be needed, but.. */
+ isxdigit(UCH(p[1])) &&
+ isxdigit(UCH(p[2])) &&
+ (testcode = (char) FROMASCII(from_hex(p[1]) * 16 +
+ from_hex(p[2]))) && /* %00 no good */
+ StrChr(do_trans, testcode)) { /* it's one of the ones we want */
+ *q++ = testcode;
+ p += 3;
+ } else {
+ *q++ = *p++;
+ }
+ }
+
+ *q = '\0';
+ return str;
+
+} /* HTUnEscapeSome */
+/* *INDENT-OFF* */
+static const unsigned char crfc[96] =
+
+/* Bit 0 xalpha -- need "quoting"
+ * Bit 1 xpalpha -- need \escape if quoted
+ */
+ /* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
+ { 1,0,3,0,0,0,0,0,1,1,0,0,1,0,1,0, /* 2x !"#$%&'()*+,-./ */
+ 0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,0, /* 3x 0123456789:;<=>? */
+ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 4x @ABCDEFGHIJKLMNO */
+ 0,0,0,0,0,0,0,0,0,0,0,1,2,1,0,0, /* 5X PQRSTUVWXYZ[\]^_ */
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 6x `abcdefghijklmno */
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3 }; /* 7X pqrstuvwxyz{|}~ DEL */
+/* *INDENT-ON* */
+
+#define ASCII_TAB '\011'
+#define ASCII_LF '\012'
+#define ASCII_CR '\015'
+#define ASCII_SPC '\040'
+#define ASCII_BAK '\134'
+
+/*
+ * Turn a string which is not a RFC 822 token into a quoted-string. - KW
+ * The "quoted" parameter tells whether we need the beginning/ending quote
+ * marks. If not, the caller will provide them -TD
+ */
+void HTMake822Word(char **str,
+ int quoted)
+{
+ const char *p;
+ char *q;
+ char *result;
+ unsigned char a;
+ unsigned added = 0;
+
+ if (isEmpty(*str)) {
+ StrAllocCopy(*str, quoted ? "\"\"" : "");
+ return;
+ }
+ for (p = *str; *p; p++) {
+ a = UCH(TOASCII(*p)); /* S/390 -- gil -- 0240 */
+ if (a < 32 || a >= 128 ||
+ ((crfc[a - 32]) & 1)) {
+ if (!added)
+ added = 2;
+ if (a >= 160 || a == '\t')
+ continue;
+ if (a == '\r' || a == '\n')
+ added += 2;
+ else if ((a & 127) < 32 || ((crfc[a - 32]) & 2))
+ added++;
+ }
+ }
+ if (!added)
+ return;
+ result = AlloCopy(p, *str, added + 1);
+ if (result == NULL)
+ outofmem(__FILE__, "HTMake822Word");
+
+ q = result;
+ if (quoted)
+ *q++ = '"';
+ /*
+ * Having converted the character to ASCII, we can't use symbolic
+ * escape codes, since they're in the host character set, which
+ * is not necessarily ASCII. Thus we use octal escape codes instead.
+ * -- gil (Paul Gilmartin) <pg@sweng.stortek.com>
+ */
+ /* S/390 -- gil -- 0268 */
+ for (p = *str; *p; p++) {
+ a = UCH(TOASCII(*p));
+ if ((a != ASCII_TAB) &&
+ ((a & 127) < ASCII_SPC ||
+ (a < 128 && ((crfc[a - 32]) & 2))))
+ *q++ = ASCII_BAK;
+ *q++ = *p;
+ if (a == ASCII_LF ||
+ (a == ASCII_CR && (TOASCII(*(p + 1)) != ASCII_LF)))
+ *q++ = ' ';
+ }
+ if (quoted)
+ *q++ = '"';
+ *q = '\0'; /* Terminate */
+ FREE(*str);
+ *str = result;
+}
diff --git a/WWW/Library/Implementation/HTParse.h b/WWW/Library/Implementation/HTParse.h
new file mode 100644
index 0000000..49b40b3
--- /dev/null
+++ b/WWW/Library/Implementation/HTParse.h
@@ -0,0 +1,212 @@
+/*
+ * $LynxId: HTParse.h,v 1.26 2021/07/05 20:56:50 tom Exp $
+ * HTParse: URL parsing in the WWW Library
+ * HTPARSE
+ *
+ * This module of the WWW library contains code to parse URLs and various
+ * related things.
+ * Implemented by HTParse.c .
+ */
+#ifndef HTPARSE_H
+#define HTPARSE_H
+
+#ifndef HTUTILS_H
+#include <HTUtils.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define RFC_3986_UNRESERVED(c) (isalnum(UCH(c)) || strchr("-._~", UCH(c)) != 0)
+#define RFC_3986_GEN_DELIMS(c) ((c) != 0 && strchr(":/?#[]@", UCH(c)) != 0)
+#define RFC_3986_SUB_DELIMS(c) ((c) != 0 && strchr("!$&'()*+,;=", UCH(c)) != 0)
+
+/*
+ * The following are flag bits which may be ORed together to form
+ * a number to give the 'wanted' argument to HTParse.
+ */
+#define PARSE_ACCESS 16
+#define PARSE_HOST 8
+#define PARSE_PATH 4
+#define PARSE_ANCHOR 2
+#define PARSE_PUNCTUATION 1
+#define PARSE_ALL 31
+#define PARSE_ALL_WITHOUT_ANCHOR (PARSE_ALL ^ PARSE_ANCHOR)
+/*
+ * Additional flag bits for more details on components already
+ * covered by the above. The PARSE_PATH above doesn't really
+ * strictly refer to the path component in the sense of the URI
+ * specs only, but rather to that combined with a possible query
+ * component. - kw
+ */
+#define PARSE_STRICTPATH 32
+#define PARSE_QUERY 64
+/*
+ * The following are valid mask values. The terms are the BNF names
+ * in the URL document.
+ */
+#define URL_XALPHAS UCH(1)
+#define URL_XPALPHAS UCH(2)
+#define URL_PATH UCH(4)
+
+#ifdef USE_IDN2
+ typedef enum {
+ LYidna2003 = 1,
+ LYidna2008,
+ LYidnaTR46,
+ LYidnaCompat
+ } HTIdnaModes;
+
+ extern int LYidnaMode;
+#endif
+
+/* Strip white space off a string. HTStrip()
+ * -------------------------------
+ *
+ * On exit,
+ * Return value points to first non-white character, or to 0 if none.
+ * All trailing white space is OVERWRITTEN with zero.
+ */
+ extern char *HTStrip(char *s);
+
+/*
+ * Parse a port number
+ * -------------------
+ *
+ * On entry,
+ * host A pointer to hostname possibly followed by port
+ *
+ * On exit,
+ * returns A pointer to the ":" before the port
+ * sets the port number via the pointer portp.
+ */
+ extern char *HTParsePort(char *host, int *portp);
+
+/* Parse a Name relative to another name. HTParse()
+ * --------------------------------------
+ *
+ * This returns those parts of a name which are given (and requested)
+ * substituting bits from the related name where necessary.
+ *
+ * On entry,
+ * aName A filename given
+ * relatedName A name relative to which aName is to be parsed
+ * wanted A mask for the bits which are wanted.
+ *
+ * On exit,
+ * returns A pointer to a malloc'd string which MUST BE FREED
+ */
+ extern char *HTParse(const char *aName,
+ const char *relatedName,
+ int wanted);
+
+/* HTParseAnchor(), fast HTParse() specialization
+ * ----------------------------------------------
+ *
+ * On exit,
+ * returns A pointer within input string (probably to its end '\0')
+ */
+ extern const char *HTParseAnchor(const char *aName);
+
+/* Simplify a filename. HTSimplify()
+ * --------------------
+ *
+ * A unix-style file is allowed to contain the sequence xxx/../ which may
+ * be replaced by "" , and the sequence "/./" which may be replaced by "/".
+ * Simplification helps us recognize duplicate filenames.
+ */
+ extern void HTSimplify(char *filename, BOOL absolute);
+
+/* Make Relative Name. HTRelative()
+ * -------------------
+ *
+ * This function creates and returns a string which gives an expression of
+ * one address as related to another. Where there is no relation, an absolute
+ * address is returned.
+ *
+ * On entry,
+ * Both names must be absolute, fully qualified names of nodes
+ * (no anchor bits)
+ *
+ * On exit,
+ * The return result points to a newly allocated name which, if
+ * parsed by HTParse relative to relatedName, will yield aName.
+ * The caller is responsible for freeing the resulting name later.
+ *
+ */
+ extern char *HTRelative(const char *aName,
+ const char *relatedName);
+
+/* Escape undesirable characters using % HTEscape()
+ * -------------------------------------
+ *
+ * This function takes a pointer to a string in which
+ * some characters may be unacceptable are unescaped.
+ * It returns a string which has these characters
+ * represented by a '%' character followed by two hex digits.
+ *
+ * Unlike HTUnEscape(), this routine returns a malloc'd string.
+ */
+ extern char *HTEscape(const char *str,
+ unsigned mask);
+
+/* Escape unsafe characters using % HTEscapeUnsafe()
+ * --------------------------------
+ *
+ * This function takes a pointer to a string in which
+ * some characters may be that may be unsafe are unescaped.
+ * It returns a string which has these characters
+ * represented by a '%' character followed by two hex digits.
+ *
+ * Unlike HTUnEscape(), this routine returns a malloc'd string.
+ */
+ extern char *HTEscapeUnsafe(const char *str);
+
+/* Escape undesirable characters using % but space to +. HTEscapeSP()
+ * -----------------------------------------------------
+ *
+ * This function takes a pointer to a string in which
+ * some characters may be unacceptable are unescaped.
+ * It returns a string which has these characters
+ * represented by a '%' character followed by two hex digits,
+ * except that spaces are converted to '+' instead of %2B.
+ *
+ * Unlike HTUnEscape(), this routine returns a malloc'd string.
+ */
+ extern char *HTEscapeSP(const char *str,
+ unsigned mask);
+
+/* Decode %xx escaped characters. HTUnEscape()
+ * ------------------------------
+ *
+ * This function takes a pointer to a string in which some
+ * characters may have been encoded in %xy form, where xy is
+ * the acsii hex code for character 16x+y.
+ * The string is converted in place, as it will never grow.
+ */
+ extern char *HTUnEscape(char *str);
+
+/* Decode some %xx escaped characters. HTUnEscapeSome()
+ * ----------------------------------- Klaus Weide
+ * (kweide@tezcat.com)
+ * This function takes a pointer to a string in which some
+ * characters may have been encoded in %xy form, where xy is
+ * the acsii hex code for character 16x+y, and a pointer to
+ * a second string containing one or more characters which
+ * should be unescaped if escaped in the first string.
+ * The first string is converted in place, as it will never grow.
+ */
+ extern char *HTUnEscapeSome(char *str,
+ const char *do_trans);
+
+/*
+ * Turn a string which is not a RFC 822 token into a quoted-string. - KW
+ */
+ extern void HTMake822Word(char **str,
+ int quoted);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* HTPARSE_H */
diff --git a/WWW/Library/Implementation/HTPlain.c b/WWW/Library/Implementation/HTPlain.c
new file mode 100644
index 0000000..ff52731
--- /dev/null
+++ b/WWW/Library/Implementation/HTPlain.c
@@ -0,0 +1,601 @@
+/*
+ * $LynxId: HTPlain.c,v 1.61 2020/01/21 22:05:46 tom Exp $
+ *
+ * Plain text object HTWrite.c
+ * =================
+ *
+ * This version of the stream object just writes to a socket.
+ * The socket is assumed open and left open.
+ *
+ * Bugs:
+ * strings written must be less than buffer size.
+ */
+
+#define HTSTREAM_INTERNAL 1
+
+#include <HTUtils.h>
+#include <LYCharVals.h> /* S/390 -- gil -- 0288 */
+
+#include <HTPlain.h>
+
+#include <HTChunk.h>
+#include <HText.h>
+#include <HTStyle.h>
+#define Lynx_HTML_Handler
+#include <HTML.h> /* styles[] */
+
+#define BUFFER_SIZE 4096; /* Tradeoff */
+
+#include <HTMLDTD.h>
+#include <HTCJK.h>
+#include <UCMap.h>
+#include <UCDefs.h>
+#include <UCAux.h>
+
+#include <LYCharSets.h>
+#include <LYStrings.h>
+#include <LYLeaks.h>
+
+static int HTPlain_lastraw = -1;
+static int HTPlain_bs_pending = 0; /* 1:bs 2:underline 3:underline+bs - kw */
+
+/* HTML Object
+ * -----------
+ */
+struct _HTStream {
+ const HTStreamClass *isa;
+ HText *text;
+ /*
+ * The node_anchor UCInfo and handle for the input (PARSER) stage. - FM
+ */
+ LYUCcharset *inUCI;
+ int inUCLYhndl;
+ /*
+ * The node_anchor UCInfo and handle for the output (HTEXT) stage. - FM
+ */
+ LYUCcharset *outUCI;
+ int outUCLYhndl;
+
+ UTFDecodeState U;
+ UCTransParams T;
+};
+
+static char replace_buf[64]; /* buffer for replacement strings */
+
+static void HTPlain_getChartransInfo(HTStream *me, HTParentAnchor *anchor)
+{
+ if (me->inUCLYhndl < 0) {
+ HTAnchor_copyUCInfoStage(anchor, UCT_STAGE_PARSER, UCT_STAGE_MIME,
+ UCT_SETBY_PARSER);
+ me->inUCLYhndl = HTAnchor_getUCLYhndl(anchor, UCT_STAGE_PARSER);
+ }
+ if (me->outUCLYhndl < 0) {
+ int chndl = HTAnchor_getUCLYhndl(anchor, UCT_STAGE_HTEXT);
+
+ if (chndl < 0) {
+ chndl = current_char_set;
+ HTAnchor_setUCInfoStage(anchor, chndl,
+ UCT_STAGE_HTEXT, UCT_SETBY_DEFAULT);
+ }
+ HTAnchor_setUCInfoStage(anchor, chndl,
+ UCT_STAGE_HTEXT, UCT_SETBY_DEFAULT);
+ me->outUCLYhndl = HTAnchor_getUCLYhndl(anchor, UCT_STAGE_HTEXT);
+ }
+ me->inUCI = HTAnchor_getUCInfoStage(anchor, UCT_STAGE_PARSER);
+ me->outUCI = HTAnchor_getUCInfoStage(anchor, UCT_STAGE_HTEXT);
+}
+
+/* Write the buffer out to the socket
+ * ----------------------------------
+ */
+
+/*_________________________________________________________________________
+ *
+ * A C T I O N R O U T I N E S
+ */
+
+static void HTPlain_write(HTStream *me, const char *s,
+ int l);
+
+/* Character handling
+ * ------------------
+ */
+static void HTPlain_put_character(HTStream *me, int c)
+{
+#ifdef REMOVE_CR_ONLY
+ /*
+ * Throw away \r's.
+ */
+ if (c != '\r') {
+ HText_appendCharacter(me->text, c);
+ }
+#else
+ /*
+ * See HTPlain_write() for explanations of the following code (we've been
+ * called via HTPlain_put_string() to do for each character of a terminated
+ * string what HTPlain_write() does via a while loop for each character in
+ * a stream of given length). - FM
+ */
+ if ((HTPlain_lastraw == '\r') && c == '\n') {
+ HTPlain_lastraw = -1;
+ return;
+ }
+ if (c == '\b' || c == '_' || HTPlain_bs_pending) {
+ char temp[1];
+
+ temp[0] = (char) c;
+ HTPlain_write(me, temp, 1);
+ return;
+ }
+ HTPlain_lastraw = UCH(c);
+ if (c == '\r') {
+ HText_appendCharacter(me->text, '\n');
+ } else if (TOASCII(UCH(c)) >= 127) { /* S/390 -- gil -- 0305 */
+ char temp[1];
+
+ temp[0] = (char) c;
+ /*
+ * For now, don't repeat everything here that has been done below - KW
+ */
+ HTPlain_write(me, temp, 1);
+ } else if (IS_CJK_TTY) {
+ HText_appendCharacter(me->text, c);
+ } else if (TOASCII(UCH(c)) >= 127 && TOASCII(UCH(c)) < 161 &&
+ HTPassHighCtrlRaw) {
+ HText_appendCharacter(me->text, c);
+#if CH_NBSP < 127
+ } else if (UCH(c) == CH_NBSP) { /* S/390 -- gil -- 0341 */
+ HText_appendCharacter(me->text, ' ');
+#endif
+#if CH_SHY < 127
+ } else if (UCH(c) == CH_SHY) {
+ return;
+#endif
+ } else if ((UCH(c) >= ' ' && TOASCII(UCH(c)) < 127) ||
+ c == '\n' || c == '\t') {
+ HText_appendCharacter(me->text, c);
+ }
+#endif /* REMOVE_CR_ONLY */
+}
+
+/* String handling
+ * ---------------
+ *
+ */
+static void HTPlain_put_string(HTStream *me, const char *s)
+{
+#ifdef REMOVE_CR_ONLY
+ HText_appendText(me->text, s);
+#else
+ const char *p;
+
+ if (s == NULL)
+ return;
+ for (p = s; *p; p++) {
+ HTPlain_put_character(me, *p);
+ }
+#endif /* REMOVE_CR_ONLY */
+}
+
+/*
+ * Entry function for displayed text/plain and WWW_SOURCE strings. - FM
+ * ---------------------------------------------------------------
+ */
+static void HTPlain_write(HTStream *me, const char *s, int l)
+{
+ const char *p;
+ const char *e = s + l;
+ int c;
+ unsigned c_unsign;
+ BOOL chk;
+ UCode_t code, uck = -1;
+ int saved_char_in = '\0';
+
+ for (p = s; p < e; p++) {
+#ifdef REMOVE_CR_ONLY
+ /*
+ * Append the whole string, but remove any \r's. - FM
+ */
+ if (*p != '\r') {
+ HText_appendCharacter(me->text, *p);
+ }
+#else
+ if (*p == '\b') {
+ if (HTPlain_lastraw >= UCH(' ') &&
+ HTPlain_lastraw != '\r' && HTPlain_lastraw != '\n') {
+ if (!HTPlain_bs_pending) {
+ HTPlain_bs_pending = 1;
+ continue;
+ } else if (HTPlain_bs_pending == 2) {
+ HTPlain_bs_pending = 3;
+ continue;
+ }
+ }
+ if (HTPlain_bs_pending >= 2)
+ HText_appendCharacter(me->text, '_');
+ HTPlain_bs_pending = 0;
+ } else if (*p == '_') {
+ if (!HTPlain_bs_pending) {
+ HTPlain_bs_pending = 2;
+ HTPlain_lastraw = UCH(*p);
+ continue;
+ }
+ }
+
+ /*
+ * Try to handle lone LFs, CRLFs and lone CRs as newline, and to deal
+ * with control, ASCII, and 8-bit characters based on best guesses of
+ * what's appropriate. - FM
+ */
+ if ((HTPlain_lastraw == '\r') && *p == '\n') {
+ HTPlain_lastraw = -1;
+ continue;
+ }
+
+ if (HTPlain_bs_pending &&
+ !(UCH(*p) >= ' ' && *p != '\r' && *p != '\n' &&
+ (HTPlain_lastraw == UCH(*p) ||
+ HTPlain_lastraw == UCH('_') ||
+ *p == '_'))) {
+ if (HTPlain_bs_pending >= 2)
+ HText_appendCharacter(me->text, '_');
+ HTPlain_bs_pending = 0;
+ } else if (HTPlain_bs_pending == 1) {
+ HTPlain_bs_pending = 0;
+ continue; /* ignore last two of "X\bX" or "X\b_" - kw */
+ } else if (HTPlain_bs_pending == 3) {
+ if (*p == '_') {
+ HTPlain_bs_pending = 2;
+ continue; /* ignore last two of "_\b_" - kw */
+ } else {
+ HTPlain_bs_pending = 0;
+ /* ignore first two of "_\bX" - kw */
+ }
+ } else if (HTPlain_bs_pending == 2) {
+ HText_appendCharacter(me->text, '_');
+ if (*p == '_')
+ continue; /* keep second of "__" pending - kw */
+ HTPlain_bs_pending = 0;
+ } else {
+ HTPlain_bs_pending = 0;
+ }
+ HTPlain_lastraw = UCH(*p);
+ if (*p == '\r') {
+ HText_appendCharacter(me->text, '\n');
+ continue;
+ }
+ /*
+ * Make sure the character is handled as Unicode whenever that's
+ * appropriate. - FM
+ */
+ c = *p;
+ c_unsign = UCH(c);
+ code = (UCode_t) c_unsign;
+ saved_char_in = '\0';
+ /*
+ * Combine any UTF-8 multibytes into Unicode to check for special
+ * characters. - FM, TD
+ */
+ if (me->T.decode_utf8) {
+ switch (HTDecodeUTF8(&(me->U), &c, &code)) {
+ case dUTF8_ok:
+ if (code < 256) {
+ c = FROMASCII((char) code);
+ c_unsign = UCH(c);
+ }
+ break;
+ case dUTF8_err:
+ code = UCS_REPL;
+ strcpy(me->U.utf_buf, "\357\277\275");
+ me->U.utf_buf_p = (me->U.utf_buf + 3);
+ break;
+ case dUTF8_more:
+ continue;
+ }
+ }
+ /*
+ * Convert characters from non-UTF-8 charsets to Unicode (if
+ * appropriate). - FM
+ */
+ if (!(me->T.decode_utf8 &&
+ UCH(*p) > 127)) {
+ if (me->T.trans_to_uni &&
+ (TOASCII(code) >= LYlowest_eightbit[me->inUCLYhndl] || /* S/390 -- gil -- 0389 */
+ (code < ' ' && code != 0 &&
+ me->T.trans_C0_to_uni))) {
+ /*
+ * Convert the octet to Unicode. - FM
+ */
+ code = (UCode_t) UCTransToUni(c, me->inUCLYhndl);
+ if (code > 0) {
+ saved_char_in = c;
+ if (code < 256) {
+ c = FROMASCII((char) code);
+ c_unsign = UCH(c);
+ }
+ }
+ } else if (code < 32 && code != 0 &&
+ me->T.trans_C0_to_uni) {
+ /*
+ * Quote from SGML.c:
+ * "This else if may be too ugly to keep. - KW"
+ */
+ if (me->T.trans_from_uni &&
+ (((code = UCTransToUni(c, me->inUCLYhndl)) >= 32) ||
+ (me->T.transp &&
+ (code = UCTransToUni(c, me->inUCLYhndl)) > 0))) {
+ saved_char_in = c;
+ if (code < 256) {
+ c = FROMASCII((char) code);
+ c_unsign = UCH(c);
+ }
+ } else {
+ uck = -1;
+ if (me->T.transp) {
+ uck = UCTransCharStr(replace_buf, 60, c,
+ me->inUCLYhndl,
+ me->inUCLYhndl, NO);
+ }
+ if (!me->T.transp || uck < 0) {
+ uck = UCTransCharStr(replace_buf, 60, c,
+ me->inUCLYhndl,
+ me->outUCLYhndl, YES);
+ }
+ if (uck == 0) {
+ continue;
+ } else if (uck < 0) {
+ me->U.utf_buf[0] = '\0';
+ } else {
+ c = replace_buf[0];
+ if (c && replace_buf[1]) {
+ HText_appendText(me->text, replace_buf);
+ continue;
+ }
+ }
+ me->U.utf_buf[0] = '\0';
+ code = UCH(c);
+ } /* Next line end of ugly stuff for C0. - KW */
+ } else {
+ me->U.utf_buf[0] = '\0';
+ code = UCH(c);
+ }
+ }
+ /*
+ * At this point we have either code in Unicode (and c in latin1 if
+ * code is in the latin1 range), or code and c will have to be passed
+ * raw.
+ */
+
+ /*
+ * If CJK mode is on, we'll assume the document matches the user's
+ * display character set, and if not, the user should toggle off
+ * raw/CJK mode to reload. - FM
+ */
+ if (IS_CJK_TTY) {
+ HText_appendCharacter(me->text, c);
+
+#define PASSHICTRL (me->T.transp || \
+ code >= LYlowest_eightbit[me->inUCLYhndl])
+#define PASS8859SPECL me->T.pass_160_173_raw
+#define PASSHI8BIT (HTPassEightBitRaw || \
+ (me->T.do_8bitraw && !me->T.trans_from_uni))
+ /*
+ * If HTPassHighCtrlRaw is set (e.g., for KOI8-R) assume the
+ * document matches and pass 127-160 8-bit characters. If it
+ * doesn't match, the user should toggle raw/CJK mode off. - FM
+ */
+ } else if (TOASCII(code) >= 127 && TOASCII(code) < 161 && /* S/390 -- gil -- 0427 */
+ PASSHICTRL && PASS8859SPECL) {
+ HText_appendCharacter(me->text, c);
+ } else if (code == CH_SHY && PASS8859SPECL) {
+ HText_appendCharacter(me->text, c);
+ /*
+ * If neither HTPassHighCtrlRaw nor CJK is set, play it safe and
+ * treat 160 (nbsp) as an ASCII space (32). - FM
+ */
+ } else if (code == CH_NBSP) {
+ HText_appendCharacter(me->text, ' ');
+ /*
+ * If neither HTPassHighCtrlRaw nor CJK is set, play it safe and
+ * ignore 173 (shy). - FM
+ * Now only ignore it for color style, which doesn't handle it
+ * anyway. Otherwise pass it on as LY_SOFT_HYPHEN and let HText
+ * deal with it. It should be either ignored, or displayed as a
+ * hyphen if it was indeed at the end of a line. Well it should.
+ * - kw
+ */
+ } else if (code == CH_SHY) {
+#ifndef USE_COLOR_STYLE
+ HText_appendCharacter(me->text, LY_SOFT_HYPHEN);
+#endif
+ continue;
+ /*
+ * If we get to here, pass the displayable ASCII characters. - FM
+ */
+ } else if ((code >= ' ' && code != UCS_REPL && TOASCII(code) < 127) ||
+ (PASSHI8BIT &&
+ c >= LYlowest_eightbit[me->outUCLYhndl]) ||
+ *p == '\n' || *p == '\t') {
+ HText_appendCharacter(me->text, c);
+ /*
+ * Use an ASCII space (32) for ensp, emsp or thinsp. - FM
+ */
+ } else if (code == 8194 || code == 8195 || code == 8201) {
+ HText_appendCharacter(me->text, ' ');
+ /*
+ * If we want the raw character, pass it now. - FM
+ */
+ } else if (me->T.use_raw_char_in && saved_char_in) {
+ HText_appendCharacter(me->text, saved_char_in);
+/******************************************************************
+ * I. LATIN-1 OR UCS2 TO DISPLAY CHARSET
+ ******************************************************************/
+ } else if ((chk = (BOOL) (me->T.trans_from_uni && code >= 160)) &&
+ (uck = UCTransUniChar(code,
+ me->outUCLYhndl)) >= ' ' && /* S/390 -- gil -- 0464 */
+ uck < 256) {
+ CTRACE((tfp, "UCTransUniChar returned 0x%.2" PRI_UCode_t
+ ":'%c'.\n",
+ uck, FROMASCII(UCH(uck))));
+ HText_appendCharacter(me->text, ((char) (uck & 0xff)));
+ } else if (chk &&
+ (uck == -4 ||
+ (me->T.repl_translated_C0 && uck > 0 && uck < ' ')) && /* S/390 -- gil -- 0481 */
+ /*
+ * Not found; look for replacement string.
+ */
+ (uck = UCTransUniCharStr(replace_buf, 60, code,
+ me->outUCLYhndl, 0) >= 0)) {
+ /*
+ * No further tests for valididy - assume that whoever defined
+ * replacement strings knew what she was doing.
+ */
+ HText_appendText(me->text, replace_buf);
+ /*
+ * If we get to here, and should have translated, translation has
+ * failed so far.
+ */
+ } else if (chk && TOASCII(code) > 127 && me->T.output_utf8) { /* S/390 -- gil -- 0498 */
+ /*
+ * We want UTF-8 output, so do it now. - FM
+ */
+ if (*me->U.utf_buf) {
+ HText_appendText(me->text, me->U.utf_buf);
+ me->U.utf_buf[0] = '\0';
+ me->U.utf_buf_p = me->U.utf_buf;
+ } else if (UCConvertUniToUtf8(code, replace_buf)) {
+ HText_appendText(me->text, replace_buf);
+ } else {
+ /*
+ * Out of luck, so use the UHHH notation (ugh). - gil
+ */
+ /* S/390 -- gil -- 0517 */
+ sprintf(replace_buf, "U%.2lX", (unsigned long) TOASCII(code));
+ HText_appendText(me->text, replace_buf);
+ }
+ /*
+ * If we don't actually want the character, make it safe and output
+ * that now. - FM
+ */
+ } else if ((c_unsign > 0 &&
+ (int) c_unsign < LYlowest_eightbit[me->outUCLYhndl]) ||
+ (me->T.trans_from_uni && !HTPassEightBitRaw)) {
+ /*
+ * If we do not have the "7-bit approximations" as our output
+ * character set (in which case we did it already) seek a
+ * translation for that. Otherwise, or if the translation fails,
+ * use UHHH notation. - FM
+ */
+ if ((chk = (BOOL) (me->outUCLYhndl !=
+ UCGetLYhndl_byMIME("us-ascii"))) &&
+ (uck = UCTransUniChar(code,
+ UCGetLYhndl_byMIME("us-ascii")))
+ >= ' ' && TOASCII(uck) < 127) { /* S/390 -- gil -- 0535 */
+ /*
+ * Got an ASCII character (yippey). - FM
+ */
+ c = FROMASCII((char) uck);
+ HText_appendCharacter(me->text, c);
+ } else if ((chk && uck == -4) &&
+ (uck = UCTransUniCharStr(replace_buf,
+ 60, code,
+ UCGetLYhndl_byMIME("us-ascii"),
+ 0) >= 0)) {
+ /*
+ * Got a replacement string (yippey). - FM
+ */
+ HText_appendText(me->text, replace_buf);
+ } else if (code == 8204 || code == 8205) {
+ /*
+ * Ignore 8204 (zwnj) or 8205 (zwj), if we get to here. - FM
+ */
+ CTRACE((tfp, "HTPlain_write: Ignoring '%" PRI_UCode_t "'.\n", code));
+ } else if (code == 8206 || code == 8207) {
+ /*
+ * Ignore 8206 (lrm) or 8207 (rlm), if we get to here. - FM
+ */
+ CTRACE((tfp, "HTPlain_write: Ignoring '%" PRI_UCode_t "'.\n", code));
+ } else {
+ /*
+ * Out of luck, so use the UHHH notation (ugh). - FM
+ */
+ /* do not print UHHH for now
+ sprintf(replace_buf, "U%.2lX", code);
+ HText_appendText(me->text, replace_buf);
+ */
+ }
+ /*
+ * If we get to here and have a monobyte character, pass it. - FM
+ */
+ } else if (c_unsign != 0 && c_unsign < 256) {
+ HText_appendCharacter(me->text, c);
+ }
+#endif /* REMOVE_CR_ONLY */
+ }
+}
+
+/* Free an HTML object
+ * -------------------
+ *
+ * Note that the SGML parsing context is freed, but the created object is
+ * not, as it takes on an existence of its own unless explicitly freed.
+ */
+static void HTPlain_free(HTStream *me)
+{
+ if (HTPlain_bs_pending >= 2)
+ HText_appendCharacter(me->text, '_');
+ FREE(me);
+}
+
+/* End writing
+*/
+static void HTPlain_abort(HTStream *me, HTError e GCC_UNUSED)
+{
+ HTPlain_free(me);
+}
+
+/* Structured Object Class
+ * -----------------------
+ */
+static const HTStreamClass HTPlain =
+{
+ "PlainPresenter",
+ HTPlain_free,
+ HTPlain_abort,
+ HTPlain_put_character, HTPlain_put_string, HTPlain_write,
+};
+
+/* New object
+ * ----------
+ */
+HTStream *HTPlainPresent(HTPresentation *pres GCC_UNUSED, HTParentAnchor *anchor,
+ HTStream *sink GCC_UNUSED)
+{
+
+ HTStream *me = (HTStream *) malloc(sizeof(*me));
+
+ if (me == NULL)
+ outofmem(__FILE__, "HTPlain_new");
+
+ me->isa = &HTPlain;
+
+ HTPlain_lastraw = -1;
+
+ me->U.utf_count = 0;
+ me->U.utf_char = 0;
+ me->U.utf_buf[0] = me->U.utf_buf[6] = me->U.utf_buf[7] = '\0';
+ me->U.utf_buf_p = me->U.utf_buf;
+ me->outUCLYhndl = HTAnchor_getUCLYhndl(anchor, UCT_STAGE_HTEXT);
+ me->inUCLYhndl = HTAnchor_getUCLYhndl(anchor, UCT_STAGE_PARSER);
+ HTPlain_getChartransInfo(me, anchor);
+ UCSetTransParams(&me->T,
+ me->inUCLYhndl, me->inUCI,
+ me->outUCLYhndl,
+ HTAnchor_getUCInfoStage(anchor, UCT_STAGE_HTEXT));
+
+ me->text = HText_new(anchor);
+ HText_setStyle(me->text, LYstyles(HTML_XMP));
+ HText_beginAppend(me->text);
+
+ return (HTStream *) me;
+}
diff --git a/WWW/Library/Implementation/HTPlain.h b/WWW/Library/Implementation/HTPlain.h
new file mode 100644
index 0000000..24fd669
--- /dev/null
+++ b/WWW/Library/Implementation/HTPlain.h
@@ -0,0 +1,21 @@
+/* /Net/dxcern/userd/timbl/hypertext/WWW/Library/Implementation/HTPlain.html
+ PLAIN TEXT OBJECT
+
+ */
+#ifndef HTPLAIN_H
+#define HTPLAIN_H
+
+#include <HTStream.h>
+#include <HTAnchor.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ extern HTStream *HTPlainPresent(HTPresentation *pres,
+ HTParentAnchor *anchor,
+ HTStream *sink);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* HTPLAIN_H */
diff --git a/WWW/Library/Implementation/HTRules.c b/WWW/Library/Implementation/HTRules.c
new file mode 100644
index 0000000..91ac93d
--- /dev/null
+++ b/WWW/Library/Implementation/HTRules.c
@@ -0,0 +1,704 @@
+/*
+ * $LynxId: HTRules.c,v 1.47 2017/07/02 19:45:22 tom Exp $
+ *
+ * Configuration manager for Hypertext Daemon HTRules.c
+ * ==========================================
+ *
+ *
+ * History:
+ * 3 Jun 91 Written TBL
+ * 10 Aug 91 Authorisation added after Daniel Martin (pass, fail)
+ * Rule order in file changed
+ * Comments allowed with # on 1st char of rule line
+ * 17 Jun 92 Bug fix: pass and fail failed if didn't contain '*' TBL
+ * 1 Sep 93 Bug fix: no memory check - Nathan Torkington
+ * BYTE_ADDRESSING removed - Arthur Secret
+ * 11 Sep 93 MD Changed %i into %d in debug printf.
+ * VMS does not recognize %i.
+ * Bug Fix: in case of PASS, only one parameter to printf.
+ * 19 Sep 93 AL Added Access Authorization stuff.
+ * 1 Nov 93 AL Added htbin.
+ * 25 May 99 KW Added redirect for lynx.
+ *
+ */
+
+#include <HTUtils.h>
+
+/* (c) CERN WorldWideWeb project 1990,91. See Copyright.html for details */
+#include <HTRules.h>
+
+#include <HTFile.h>
+#include <LYLeaks.h>
+#include <HTAAProt.h>
+
+#define LINE_LENGTH 256
+
+typedef struct _rule {
+ struct _rule *next;
+ HTRuleOp op;
+ char *pattern;
+ char *equiv;
+ char *condition_op; /* as strings - may be inefficient, */
+ char *condition; /* but this is not for a server - kw */
+} rule;
+
+#ifndef NO_RULES
+
+#include <HTTP.h> /* for redirecting_url, indirectly HTPermitRedir - kw */
+#include <LYGlobalDefs.h> /* for LYUserSpecifiedURL - kw */
+#include <LYStrings.h> /* for LYscanFloat */
+#include <LYUtils.h> /* for LYFixCursesOn - kw */
+#include <HTAlert.h>
+
+/* Global variables
+ * ----------------
+ */
+char *HTBinDir = NULL; /* Physical /htbin directory path. */
+
+ /* In future this should not be global. */
+char *HTSearchScript = NULL; /* Search script name. */
+
+/* Module-wide variables
+ * ---------------------
+ */
+
+static rule *rules = 0; /* Pointer to first on list */
+
+#ifndef PUT_ON_HEAD
+static rule *rule_tail = 0; /* Pointer to last on list */
+#endif
+
+/* Add rule to the list HTAddRule()
+ * --------------------
+ *
+ * On entry,
+ * pattern points to 0-terminated string containing a single "*"
+ * equiv points to the equivalent string with * for the
+ * place where the text matched by * goes.
+ * On exit,
+ * returns 0 if success, -1 if error.
+ */
+
+int HTAddRule(HTRuleOp op, const char *pattern,
+ const char *equiv,
+ const char *cond_op,
+ const char *cond)
+{ /* BYTE_ADDRESSING removed and memory check - AS - 1 Sep 93 */
+ rule *temp;
+ char *pPattern = NULL;
+
+ temp = typecalloc(rule);
+ if (temp == NULL)
+ outofmem(__FILE__, "HTAddRule");
+
+ if (equiv) { /* Two operands */
+ char *pEquiv = NULL;
+
+ StrAllocCopy(pEquiv, equiv);
+ temp->equiv = pEquiv;
+ } else {
+ temp->equiv = 0;
+ }
+ if (cond_op) {
+ StrAllocCopy(temp->condition_op, cond_op);
+ StrAllocCopy(temp->condition, cond);
+ }
+ StrAllocCopy(pPattern, pattern);
+ temp->pattern = pPattern;
+ temp->op = op;
+
+ if (equiv) {
+ CTRACE((tfp, "Rule: For `%s' op %d `%s'", pattern, (int) op, equiv));
+ } else {
+ CTRACE((tfp, "Rule: For `%s' op %d", pattern, (int) op));
+ }
+ if (cond_op) {
+ CTRACE((tfp, "\t%s %s\n", cond_op, NONNULL(cond)));
+ } else {
+ CTRACE((tfp, "\n"));
+ }
+
+ if (!rules) {
+#ifdef LY_FIND_LEAKS
+ atexit(HTClearRules);
+#endif
+ }
+#ifdef PUT_ON_HEAD
+ temp->next = rules;
+ rules = temp;
+#else
+ temp->next = 0;
+ if (rule_tail)
+ rule_tail->next = temp;
+ else
+ rules = temp;
+ rule_tail = temp;
+#endif
+
+ return 0;
+}
+
+/* Clear all rules HTClearRules()
+ * ---------------
+ *
+ * On exit,
+ * There are no rules
+ *
+ * See also
+ * HTAddRule()
+ */
+void HTClearRules(void)
+{
+ while (rules) {
+ rule *temp = rules;
+
+ rules = temp->next;
+ FREE(temp->pattern);
+ FREE(temp->equiv);
+ FREE(temp->condition_op);
+ FREE(temp->condition);
+ FREE(temp);
+ }
+#ifndef PUT_ON_HEAD
+ rule_tail = 0;
+#endif
+}
+
+static BOOL rule_cond_ok(rule * r)
+{
+ BOOL result;
+
+ if (!r->condition_op)
+ return YES;
+ if (strcmp(r->condition_op, "if") && strcmp(r->condition_op, "unless")) {
+ CTRACE((tfp, "....... rule ignored, unrecognized `%s'!\n",
+ r->condition_op));
+ return NO;
+ }
+ if (!strcmp(r->condition, "redirected"))
+ result = (BOOL) (redirection_attempts > 0);
+ else if (!strcmp(r->condition, "userspec"))
+ result = LYUserSpecifiedURL;
+ else {
+ CTRACE((tfp, "....... rule ignored, unrecognized `%s %s'!\n",
+ r->condition_op, NONNULL(r->condition)));
+ return NO;
+ }
+ if (!strcmp(r->condition_op, "if"))
+ return result;
+ else
+ return (BOOL) (!result);
+
+}
+
+/* Translate by rules HTTranslate()
+ * ------------------
+ *
+ * The most recently defined rules are applied first.
+ *
+ * On entry,
+ * required points to a string whose equivalent value is needed
+ * On exit,
+ * returns the address of the equivalent string allocated from
+ * the heap which the CALLER MUST FREE. If no translation
+ * occurred, then it is a copy of the original.
+ * NEW FEATURES:
+ * When a "protect" or "defprot" rule is matched,
+ * a call to HTAA_setCurrentProtection() or
+ * HTAA_setDefaultProtection() is made to notify
+ * the Access Authorization module that the file is
+ * protected, and so it knows how to handle it.
+ * -- AL
+ */
+char *HTTranslate(const char *required)
+{
+ rule *r;
+ char *current = NULL;
+ char *msgtmp = NULL;
+ const char *pMsg;
+ int proxy_none_flag = 0;
+ int permitredir_flag = 0;
+
+ StrAllocCopy(current, required);
+
+ HTAA_clearProtections(); /* Reset from previous call -- AL */
+
+ for (r = rules; r; r = r->next) {
+ char *p = r->pattern;
+ int m = 0; /* Number of characters matched against wildcard */
+ const char *q = current;
+
+ for (; *p && *q; p++, q++) { /* Find first mismatch */
+ if (*p != *q)
+ break;
+ }
+
+ if (*p == '*') { /* Match up to wildcard */
+ m = (int) strlen(q) - (int) strlen(p + 1); /* Amount to match to wildcard */
+ if (m < 0)
+ continue; /* tail is too short to match */
+ if (0 != strcmp(q + m, p + 1))
+ continue; /* Tail mismatch */
+ } else
+ /* Not wildcard */ if (*p != *q)
+ continue; /* plain mismatch: go to next rule */
+
+ if (!rule_cond_ok(r)) /* check condition, next rule if false - kw */
+ continue;
+
+ switch (r->op) { /* Perform operation */
+
+ case HT_DefProt:
+ case HT_Protect:
+#ifdef ACCESS_AUTH
+ {
+ char *local_copy = NULL;
+ char *p2;
+ char *eff_ids = NULL;
+ char *prot_file = NULL;
+
+ CTRACE((tfp, "HTRule: `%s' matched %s %s: `%s'\n",
+ current,
+ (r->op == HT_Protect ? "Protect" : "DefProt"),
+ "rule, setup",
+ (r->equiv ? r->equiv :
+ (r->op == HT_Protect ? "DEFAULT" : "NULL!!"))));
+
+ if (r->equiv) {
+ StrAllocCopy(local_copy, r->equiv);
+ p2 = local_copy;
+ prot_file = HTNextField(&p2);
+ eff_ids = HTNextField(&p2);
+ }
+
+ if (r->op == HT_Protect)
+ HTAA_setCurrentProtection(current, prot_file, eff_ids);
+ else
+ HTAA_setDefaultProtection(current, prot_file, eff_ids);
+
+ FREE(local_copy);
+
+ /* continue translating rules */
+ }
+#endif /* ACCESS_AUTH */
+ break;
+
+ case HT_UserMsg: /* Produce message immediately */
+ LYFixCursesOn("show rule message:");
+ HTUserMsg2((r->equiv ? r->equiv : "Rule: %s"), current);
+ break;
+ case HT_InfoMsg: /* Produce messages immediately */
+ case HT_Progress:
+ case HT_Alert:
+ LYFixCursesOn("show rule message:"); /* and fall through */
+ /* FALLTHRU */
+ case HT_AlwaysAlert:
+ pMsg = r->equiv ? r->equiv :
+ (r->op == HT_AlwaysAlert) ? "%s" : "Rule: %s";
+ if (StrChr(pMsg, '%')) {
+ HTSprintf0(&msgtmp, pMsg, current);
+ pMsg = msgtmp;
+ }
+ switch (r->op) { /* Actually produce message */
+ case HT_InfoMsg:
+ HTInfoMsg(pMsg);
+ break;
+ case HT_Progress:
+ HTProgress(pMsg);
+ break;
+ case HT_Alert:
+ HTAlert(pMsg);
+ break;
+ case HT_AlwaysAlert:
+ HTAlwaysAlert("Rule alert:", pMsg);
+ break;
+ default:
+ break;
+ }
+ FREE(msgtmp);
+ break;
+
+ case HT_PermitRedir: /* Set special flag */
+ permitredir_flag = 1;
+ CTRACE((tfp, "HTRule: Mark for redirection permitted\n"));
+ break;
+
+ case HT_Pass: /* Authorised */
+ if (!r->equiv) {
+ if (proxy_none_flag) {
+ char *temp = NULL;
+
+ StrAllocCopy(temp, "NoProxy=");
+ StrAllocCat(temp, current);
+ FREE(current);
+ current = temp;
+ }
+ CTRACE((tfp, "HTRule: Pass `%s'\n", current));
+ return current;
+ }
+ /* FALLTHRU */
+
+ case HT_Map:
+ case HT_Redirect:
+ case HT_RedirectPerm:
+ if (*p == *q) { /* End of both strings, no wildcard */
+ CTRACE((tfp, "For `%s' using `%s'\n", current, r->equiv));
+ StrAllocCopy(current, r->equiv); /* use entire translation */
+ } else {
+ char *ins = StrChr(r->equiv, '*'); /* Insertion point */
+
+ if (ins) { /* Consistent rule!!! */
+ char *temp = NULL;
+
+ HTSprintf0(&temp, "%.*s%.*s%s",
+ (int) (ins - r->equiv),
+ r->equiv,
+ m,
+ q,
+ ins + 1);
+ CTRACE((tfp, "For `%s' using `%s'\n",
+ current, temp));
+ FREE(current);
+ current = temp; /* Use this */
+
+ } else { /* No insertion point */
+ char *temp = NULL;
+
+ StrAllocCopy(temp, r->equiv);
+ CTRACE((tfp, "For `%s' using `%s'\n",
+ current, temp));
+ FREE(current);
+ current = temp; /* Use this */
+ } /* If no insertion point exists */
+ }
+ if (r->op == HT_Pass) {
+ if (proxy_none_flag) {
+ char *temp = NULL;
+
+ StrAllocCopy(temp, "NoProxy=");
+ StrAllocCat(temp, current);
+ FREE(current);
+ current = temp;
+ }
+ CTRACE((tfp, "HTRule: ...and pass `%s'\n",
+ current));
+ return current;
+ } else if (r->op == HT_Redirect) {
+ CTRACE((tfp, "HTRule: ...and redirect to `%s'\n",
+ current));
+ redirecting_url = current;
+ HTPermitRedir = (BOOL) (permitredir_flag == 1);
+ return (char *) 0;
+ } else if (r->op == HT_RedirectPerm) {
+ CTRACE((tfp, "HTRule: ...and redirect like 301 to `%s'\n",
+ current));
+ redirecting_url = current;
+ permanent_redirection = TRUE;
+ HTPermitRedir = (BOOL) (permitredir_flag == 1);
+ return (char *) 0;
+ }
+ break;
+
+ case HT_UseProxy:
+ if (r->equiv && 0 == strcasecomp(r->equiv, "none")) {
+ CTRACE((tfp, "For `%s' will not use proxy\n", current));
+ proxy_none_flag = 1;
+ } else if (proxy_none_flag) {
+ CTRACE((tfp, "For `%s' proxy server ignored: %s\n",
+ current,
+ NONNULL(r->equiv)));
+ } else {
+ char *temp = NULL;
+
+ StrAllocCopy(temp, "Proxied=");
+ StrAllocCat(temp, r->equiv);
+ StrAllocCat(temp, current);
+ CTRACE((tfp, "HTRule: proxy server found: %s\n",
+ NONNULL(r->equiv)));
+ FREE(current);
+ return temp;
+ }
+ break;
+
+ case HT_Invalid:
+ case HT_Fail: /* Unauthorised */
+ CTRACE((tfp, "HTRule: *** FAIL `%s'\n", current));
+ FREE(current);
+ return (char *) 0;
+ } /* if tail matches ... switch operation */
+
+ } /* loop over rules */
+
+ if (proxy_none_flag) {
+ char *temp = NULL;
+
+ StrAllocCopy(temp, "NoProxy=");
+ StrAllocCat(temp, current);
+ FREE(current);
+ return temp;
+ }
+
+ return current;
+}
+
+/* Load one line of configuration
+ * ------------------------------
+ *
+ * Call this, for example, to load a X resource with config info.
+ *
+ * returns 0 OK, < 0 syntax error.
+ */
+int HTSetConfiguration(char *config)
+{
+ HTRuleOp op;
+ char *line = NULL;
+ char *pointer = NULL;
+ char *word1;
+ const char *word2;
+ const char *word3;
+ const char *cond_op = NULL;
+ const char *cond = NULL;
+ float quality, secs, secs_per_byte;
+ long maxbytes;
+ int status;
+
+ StrAllocCopy(line, config);
+ if (line != NULL) {
+ char *p = line;
+
+ /* Chop off comments */
+ while ((p = StrChr(p, '#'))) {
+ if (p == line || isspace(UCH(*(p - 1)))) {
+ *p = 0;
+ break;
+ } else {
+ p++;
+ }
+ }
+ }
+ pointer = line;
+ word1 = HTNextField(&pointer);
+ if (!word1) {
+ FREE(line);
+ return 0;
+ }; /* Comment only or blank */
+
+ word2 = HTNextField(&pointer);
+
+ if (0 == strcasecomp(word1, "defprot") ||
+ 0 == strcasecomp(word1, "protect"))
+ word3 = pointer; /* The rest of the line to be parsed by AA module */
+ else
+ word3 = HTNextField(&pointer); /* Just the next word */
+
+ if (!word2) {
+ fprintf(stderr, "HTRule: %s %s\n", RULE_NEEDS_DATA, line);
+ FREE(line);
+ return -2; /*syntax error */
+ }
+
+ if (0 == strcasecomp(word1, "suffix")) {
+ char *encoding = HTNextField(&pointer);
+
+ status = 0;
+ if (pointer)
+ status = LYscanFloat(pointer, &quality);
+
+ HTSetSuffix(word2, word3,
+ encoding ? encoding : "binary",
+ status >= 1 ? quality : (float) 1.0);
+
+ } else if (0 == strcasecomp(word1, "presentation")) {
+ status = 0;
+ if (pointer) {
+ const char *temp = pointer;
+
+ if (LYscanFloat2(&temp, &quality)) {
+ status = 1;
+ if (LYscanFloat2(&temp, &secs)) {
+ status = 2;
+ if (LYscanFloat2(&temp, &secs_per_byte)) {
+ status = 3;
+ if (sscanf(temp, "%ld", &maxbytes)) {
+ status = 4;
+ }
+ }
+ }
+ }
+ }
+
+ HTSetPresentation(word2, word3, NULL,
+ status >= 1 ? quality : 1.0,
+ status >= 2 ? secs : 0.0,
+ status >= 3 ? secs_per_byte : 0.0,
+ status >= 4 ? maxbytes : 0,
+ mediaCFG);
+
+ } else if (0 == strncasecomp(word1, "htbin", 5) ||
+ 0 == strncasecomp(word1, "bindir", 6)) {
+ StrAllocCopy(HTBinDir, word2); /* Physical /htbin location */
+
+ } else if (0 == strncasecomp(word1, "search", 6)) {
+ StrAllocCopy(HTSearchScript, word2); /* Search script name */
+
+ } else {
+ op = 0 == strcasecomp(word1, "map") ? HT_Map
+ : 0 == strcasecomp(word1, "pass") ? HT_Pass
+ : 0 == strcasecomp(word1, "fail") ? HT_Fail
+ : 0 == strcasecomp(word1, "redirect") ? HT_Redirect
+ : 0 == strncasecomp(word1, "redirectperm", 12) ? HT_RedirectPerm
+ : 0 == strcasecomp(word1, "redirecttemp") ? HT_Redirect
+ : 0 == strcasecomp(word1, "permitredirection") ? HT_PermitRedir
+ : 0 == strcasecomp(word1, "useproxy") ? HT_UseProxy
+ : 0 == strcasecomp(word1, "alert") ? HT_Alert
+ : 0 == strcasecomp(word1, "alwaysalert") ? HT_AlwaysAlert
+ : 0 == strcasecomp(word1, "progress") ? HT_Progress
+ : 0 == strcasecomp(word1, "usermsg") ? HT_UserMsg
+ : 0 == strcasecomp(word1, "infomsg") ? HT_InfoMsg
+ : 0 == strcasecomp(word1, "defprot") ? HT_DefProt
+ : 0 == strcasecomp(word1, "protect") ? HT_Protect
+ : HT_Invalid;
+ if (op == HT_Invalid) {
+ fprintf(stderr, "HTRule: %s '%s'\n", RULE_INCORRECT, config);
+ } else {
+ switch (op) {
+ case HT_Fail: /* never a or other 2nd parameter */
+ case HT_PermitRedir:
+ cond_op = word3;
+ if (cond_op && *cond_op) {
+ word3 = NULL;
+ cond = HTNextField(&pointer);
+ }
+ break;
+
+ case HT_Pass: /* possibly a URL2 */
+ if (word3 && (!strcasecomp(word3, "if") ||
+ !strcasecomp(word3, "unless"))) {
+ cond_op = word3;
+ word3 = NULL;
+ cond = HTNextField(&pointer);
+ break;
+ }
+ /* else fall through */
+ case HT_Map: /* always a URL2 (or other 2nd parameter) */
+ case HT_Redirect:
+ case HT_RedirectPerm:
+ case HT_UseProxy:
+ cond_op = HTNextField(&pointer);
+ /* check for extra status word in "Redirect" */
+ if (op == HT_Redirect && 0 == strcasecomp(word1, "redirect") &&
+ cond_op &&
+ strcasecomp(cond_op, "if") &&
+ strcasecomp(cond_op, "unless")) {
+ if (0 == strcmp(word2, "301") ||
+ 0 == strcasecomp(word2, "permanent")) {
+ op = HT_RedirectPerm;
+ } else if (!(0 == strcmp(word2, "302") ||
+ 0 == strcmp(word2, "303") ||
+ 0 == strcasecomp(word2, "temp") ||
+ 0 == strcasecomp(word2, "seeother"))) {
+ CTRACE((tfp, "Rule: Ignoring `%s' in Redirect\n", word2));
+ }
+ word2 = word3;
+ word3 = cond_op; /* cond_op isn't condition op after all */
+ cond_op = HTNextField(&pointer);
+ }
+ if (cond_op && *cond_op)
+ cond = HTNextField(&pointer);
+ break;
+
+ case HT_Progress:
+ case HT_InfoMsg:
+ case HT_UserMsg:
+ case HT_Alert:
+ case HT_AlwaysAlert:
+ cond_op = HTNextField(&pointer);
+ if (cond_op && *cond_op)
+ cond = HTNextField(&pointer);
+ if (word3) { /* Fix string with too may %s - kw */
+ const char *cp = word3;
+ char *cp1, *cp2;
+
+ while ((cp1 = StrChr(cp, '%'))) {
+ if (cp1[1] == '\0') {
+ *cp1 = '\0';
+ break;
+ } else if (cp1[1] == '%') {
+ cp = cp1 + 2;
+ continue;
+ } else
+ while ((cp2 = StrChr(cp1 + 2, '%'))) {
+ if (cp2[1] == '\0') {
+ *cp2 = '\0';
+ break;
+ } else if (cp2[1] == '%') {
+ cp1 = cp2;
+ } else {
+ *cp2 = '?'; /* replace bad % */
+ cp1 = cp2;
+ }
+ }
+ break;
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+ if (cond_op && cond && *cond && !strcasecomp(cond_op, "unless")) {
+ cond_op = "unless";
+ } else if (cond_op && cond && *cond &&
+ !strcasecomp(cond_op, "if")) {
+ cond_op = "if";
+ } else if (cond_op || cond) {
+ fprintf(stderr, "HTRule: %s '%s'\n", RULE_INCORRECT, config);
+ FREE(line); /* syntax error, condition is a mess - kw */
+ return -2; /* NB unrecognized cond passes here - kw */
+ }
+ if (cond && !strncasecomp(cond, "redirected", (int) strlen(cond))) {
+ cond = "redirected"; /* recognized, canonical case - kw */
+ } else if (cond && strlen(cond) >= 8 &&
+ !strncasecomp(cond, "userspecified", (int) strlen(cond))) {
+ cond = "userspec"; /* also allow abbreviation - kw */
+ }
+ HTAddRule(op, word2, word3, cond_op, cond);
+ }
+ }
+ FREE(line);
+ return 0;
+}
+
+/* Load the rules from a file HTLoadRules()
+ * --------------------------
+ *
+ * On entry,
+ * Rules can be in any state
+ * On exit,
+ * Any existing rules will have been kept.
+ * Any new rules will have been loaded.
+ * Returns 0 if no error, 0 if error!
+ *
+ * Bugs:
+ * The strings may not contain spaces.
+ */
+
+int HTLoadRules(const char *filename)
+{
+ FILE *fp = fopen(filename, TXT_R);
+ char line[LINE_LENGTH + 1];
+
+ if (!fp) {
+ CTRACE((tfp, "HTRules: Can't open rules file %s\n", filename));
+ return -1; /* File open error */
+ }
+ for (;;) {
+ if (!fgets(line, LINE_LENGTH + 1, fp))
+ break; /* EOF or error */
+ (void) HTSetConfiguration(line);
+ }
+ fclose(fp);
+ return 0; /* No error or syntax errors ignored */
+}
+
+#endif /* NO_RULES */
diff --git a/WWW/Library/Implementation/HTRules.h b/WWW/Library/Implementation/HTRules.h
new file mode 100644
index 0000000..9bb8593
--- /dev/null
+++ b/WWW/Library/Implementation/HTRules.h
@@ -0,0 +1,169 @@
+/* Configuration Manager for libwww
+ * CONFIGURATION MANAGER
+ *
+ * Author Tim Berners-Lee/CERN. Public domain. Please mail changes to
+ * timbl@info.cern.ch.
+ *
+ * The configuration information loaded includes tables (file suffixes,
+ * presentation methods) in other modules. The most likely routines needed by
+ * developers will be:
+ *
+ * HTSetConfiguration to load configuration information.
+ *
+ * HTLoadRules to load a whole file of configuration information
+ *
+ * HTTranslate to translate a URL using the rule table.
+ *
+ */
+#ifndef HTRULE_H
+#define HTRULE_H
+
+#ifndef HTUTILS_H
+#include <HTUtils.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ typedef enum {
+ HT_Invalid,
+ HT_Map,
+ HT_Pass,
+ HT_Fail,
+ HT_DefProt,
+ HT_Protect,
+ HT_Progress,
+ HT_InfoMsg,
+ HT_UserMsg,
+ HT_Alert,
+ HT_AlwaysAlert,
+ HT_Redirect,
+ HT_RedirectPerm,
+ HT_PermitRedir,
+ HT_UseProxy
+ } HTRuleOp;
+
+#ifndef NO_RULES
+
+/*
+
+Server Side Script Execution
+
+ If a URL starts with /htbin/ it is understood to mean a script execution request on
+ server. This feature needs to be turned on by setting HTBinDir by the htbin rule.
+ Index searching is enabled by setting HTSearchScript into the name of script in BinDir
+ doing the actual search by search rule (BinDir must also be set in this case, of
+ course).
+
+ */
+
+ extern char *HTBinDir; /* Physical /htbin location */
+ extern char *HTSearchScript; /* Search script name */
+
+/*
+
+HTAddRule: Add rule to the list
+
+ ON ENTRY,
+
+ pattern points to 0-terminated string containing a single "*"
+
+ equiv points to the equivalent string with * for the place where the
+ text matched by * goes; or to other 2nd parameter
+ meaning depends on op).
+
+ cond_op, additional condition for applying rule; cond_op should
+ cond be either NULL (no additional condition), or one of
+ the strings "if" or "unless"; if cond_op is not NULL,
+ cond should point to a recognized condition keyword
+ (as a string) such as "userspec", "redirected".
+
+ ON EXIT,
+
+ returns 0 if success, -1 if error.
+
+ Note that if BYTE_ADDRESSING is set, the three blocks required are allocated and
+ deallocated as one. This will save time and storage, when malloc's allocation units are
+ large.
+
+ */
+ extern int HTAddRule(HTRuleOp op, const char *pattern,
+ const char *equiv,
+ const char *cond_op,
+ const char *cond);
+
+/*
+
+HTClearRules: Clear all rules
+
+ ON EXIT,
+
+ Rule file There are no rules
+
+ */
+
+ extern void HTClearRules(void);
+
+/*
+
+HTTranslate: Translate by rules
+
+ */
+
+/*
+
+ ON ENTRY,
+
+ required points to a string whose equivalent value is needed
+
+ ON EXIT,
+
+ returns the address of the equivalent string allocated from the heap
+ which the CALLER MUST FREE. If no translation occurred, then it is
+ a copy of the original.
+
+ */
+ extern char *HTTranslate(const char *required);
+
+/*
+
+HTSetConfiguration: Load one line of configuration information
+
+ ON ENTRY,
+
+ config is a string in the syntax of a rule file line.
+
+ This routine may be used for loading configuration information from sources other than
+ the rule file, for example INI files for X resources.
+
+ */
+ extern int HTSetConfiguration(char *config);
+
+/*
+
+HtLoadRules: Load the rules from a file
+
+ ON ENTRY,
+
+ Rule table Rules can be in any state
+
+ ON EXIT,
+
+ Rule table Any existing rules will have been kept. Any new rules will have
+ been loaded on top, so as to be tried first.
+
+ Returns 0 if no error.
+
+ */
+
+ extern int HTLoadRules(const char *filename);
+
+/*
+
+ */
+
+#endif /* NO_RULES */
+#ifdef __cplusplus
+}
+#endif
+#endif /* HTRULE_H */
diff --git a/WWW/Library/Implementation/HTStream.h b/WWW/Library/Implementation/HTStream.h
new file mode 100644
index 0000000..a753266
--- /dev/null
+++ b/WWW/Library/Implementation/HTStream.h
@@ -0,0 +1,69 @@
+/*
+ * $LynxId: HTStream.h,v 1.16 2011/06/11 12:08:40 tom Exp $
+ *
+ * The Stream class definition -- libwww
+ STREAM OBJECT DEFINITION
+
+ A Stream object is something which accepts a stream of text.
+
+ The creation methods will vary on the type of Stream Object. All creation
+ methods return a pointer to the stream type below.
+
+ As you can see, but the methods used to write to the stream and close it are
+ pointed to be the object itself.
+
+ */
+#ifndef HTSTREAM_H
+#define HTSTREAM_H
+
+#ifndef HTUTILS_H
+#include <HTUtils.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ typedef struct _HTStream HTStream;
+
+/*
+
+ These are the common methods of all streams. They should be
+ self-explanatory.
+
+ */
+ typedef struct _HTStreamClass {
+
+ const char *name; /* Just for diagnostics */
+
+ void (*_free) (HTStream *me);
+
+ void (*_abort) (HTStream *me, HTError e);
+
+ void (*put_character) (HTStream *me, int ch);
+
+ void (*put_string) (HTStream *me, const char *str);
+
+ void (*put_block) (HTStream *me, const char *str, int len);
+
+ } HTStreamClass;
+
+#ifndef HTSTREAM_INTERNAL
+ struct _HTStream {
+ HTStreamClass *isa;
+ };
+#endif
+/*
+
+ Generic Error Stream
+
+ The Error stream simply signals an error on all output methods.
+ This can be used to stop a stream as soon as data arrives, for
+ example from the network.
+
+ */
+ extern HTStream *HTErrorStream(void);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* HTSTREAM_H */
diff --git a/WWW/Library/Implementation/HTString.c b/WWW/Library/Implementation/HTString.c
new file mode 100644
index 0000000..3cb8358
--- /dev/null
+++ b/WWW/Library/Implementation/HTString.c
@@ -0,0 +1,1464 @@
+/*
+ * $LynxId: HTString.c,v 1.82 2022/03/12 12:19:10 Gisle.Vanem Exp $
+ *
+ * Case-independent string comparison HTString.c
+ *
+ * Original version came with listserv implementation.
+ * Version TBL Oct 91 replaces one which modified the strings.
+ * 02-Dec-91 (JFG) Added stralloccopy and stralloccat
+ * 23 Jan 92 (TBL) Changed strallocc* to 8 char HTSAC* for VM and suchlike
+ * 6 Oct 92 (TBL) Moved WWW_TraceFlag in here to be in library
+ * 15 Nov 98 (TD) Added HTSprintf.
+ */
+
+#include <HTUtils.h>
+#include <HTFile.h>
+
+#include <LYLeaks.h>
+#include <LYUtils.h>
+#include <LYStrings.h>
+
+#ifdef USE_IGNORE_RC
+int ignore_unused;
+#endif
+
+#ifndef NO_LYNX_TRACE
+BOOLEAN WWW_TraceFlag = 0; /* Global trace flag for ALL W3 code */
+int WWW_TraceMask = 0; /* Global trace flag for ALL W3 code */
+#endif
+
+#ifdef _WINDOWS
+#undef VC
+#define VC "2.14FM"
+#endif
+
+#ifndef VC
+#define VC "2.14"
+#endif /* !VC */
+
+const char *HTLibraryVersion = VC; /* String for help screen etc */
+
+/*
+ * strcasecomp8 is a variant of strcasecomp (below)
+ * ------------ -----------
+ * but uses 8bit upper/lower case information
+ * from the current display charset.
+ * It returns 0 if exact match.
+ */
+int strcasecomp8(const char *a,
+ const char *b)
+{
+ const char *p = a;
+ const char *q = b;
+
+ for (; *p && *q; p++, q++) {
+ int diff = UPPER8(*p, *q);
+
+ if (diff)
+ return diff;
+ }
+ if (*p)
+ return 1; /* p was longer than q */
+ if (*q)
+ return -1; /* p was shorter than q */
+ return 0; /* Exact match */
+}
+
+/*
+ * strncasecomp8 is a variant of strncasecomp (below)
+ * ------------- ------------
+ * but uses 8bit upper/lower case information
+ * from the current display charset.
+ * It returns 0 if exact match.
+ */
+int strncasecomp8(const char *a,
+ const char *b,
+ int n)
+{
+ const char *p = a;
+ const char *q = b;
+
+ for (;; p++, q++) {
+ int diff;
+
+ if (p == (a + n))
+ return 0; /* Match up to n characters */
+ if (!(*p && *q))
+ return (*p - *q);
+ diff = UPPER8(*p, *q);
+ if (diff)
+ return diff;
+ }
+ /*NOTREACHED */
+}
+
+#ifndef VM /* VM has these already it seems */
+/* Strings of any length
+ * ---------------------
+ */
+int strcasecomp(const char *a,
+ const char *b)
+{
+ const char *p = a;
+ const char *q = b;
+
+ for (; *p && *q; p++, q++) {
+ int diff = TOLOWER(*p) - TOLOWER(*q);
+
+ if (diff)
+ return diff;
+ }
+ if (*p)
+ return 1; /* p was longer than q */
+ if (*q)
+ return -1; /* p was shorter than q */
+ return 0; /* Exact match */
+}
+
+/* With count limit
+ * ----------------
+ */
+int strncasecomp(const char *a,
+ const char *b,
+ int n)
+{
+ const char *p = a;
+ const char *q = b;
+
+ for (;; p++, q++) {
+ int diff;
+
+ if (p == (a + n))
+ return 0; /* Match up to n characters */
+ if (!(*p && *q))
+ return (*p - *q);
+ diff = TOLOWER(*p) - TOLOWER(*q);
+ if (diff)
+ return diff;
+ }
+ /*NOTREACHED */
+}
+#endif /* VM */
+
+#define end_component(p) (*(p) == '.' || *(p) == '\0')
+
+#ifdef DEBUG_ASTERISK
+#define SHOW_ASTERISK CTRACE
+#else
+#define SHOW_ASTERISK(p) /* nothing */
+#endif
+
+#define SHOW_ASTERISK_NUM(a,b,c) \
+ SHOW_ASTERISK((tfp, "test @%d, '%s' vs '%s' (%d)\n", __LINE__, a,b,c))
+
+#define SHOW_ASTERISK_TXT(a,b,c) \
+ SHOW_ASTERISK((tfp, "test @%d, '%s' vs '%s' %s\n", __LINE__, a,b,c))
+
+/*
+ * Compare names as described in RFC 2818: ignore case, allow wildcards.
+ * Return zero on a match, nonzero on mismatch -TD
+ *
+ * From RFC 2818:
+ * Names may contain the wildcard character * which is considered to match any
+ * single domain name component or component fragment. E.g., *.a.com matches
+ * foo.a.com but not bar.foo.a.com. f*.com matches foo.com but not bar.com.
+ */
+int strcasecomp_asterisk(const char *a, const char *b)
+{
+ const char *p;
+ int result = 0;
+ int done = FALSE;
+
+ while (!result && !done) {
+ SHOW_ASTERISK_TXT(a, b, "main");
+ if (*a == '*') {
+ p = b;
+ for (;;) {
+ SHOW_ASTERISK_TXT(a, p, "loop");
+ if (end_component(p)) {
+ if (end_component(a + 1)) {
+ b = p - 1;
+ result = 0;
+ } else {
+ result = 1;
+ }
+ break;
+ } else if (strcasecomp_asterisk(a + 1, p)) {
+ ++p;
+ } else {
+ b = p - 1;
+ result = 0; /* found a match starting at 'p' */
+ done = TRUE;
+ break;
+ }
+ }
+ SHOW_ASTERISK_NUM(a, b, result);
+ } else if (*b == '*') {
+ result = strcasecomp_asterisk(b, a);
+ SHOW_ASTERISK_NUM(a, b, result);
+ done = (result == 0);
+ } else if (*a == '\0' || *b == '\0') {
+ result = (*a != *b);
+ SHOW_ASTERISK_NUM(a, b, result);
+ break;
+ } else if (TOLOWER(UCH(*a)) != TOLOWER(UCH(*b))) {
+ result = 1;
+ SHOW_ASTERISK_NUM(a, b, result);
+ break;
+ }
+ ++a;
+ ++b;
+ }
+ return result;
+}
+
+#ifdef DEBUG_ASTERISK
+void mismatch_asterisk(void)
+{
+ /* *INDENT-OFF* */
+ static struct {
+ const char *a;
+ const char *b;
+ int code;
+ } table[] = {
+ { "foo.bar", "*.*", 0 },
+ { "foo.bar", "*.b*", 0 },
+ { "foo.bar", "*.ba*", 0 },
+ { "foo.bar", "*.bar*", 0 },
+ { "foo.bar", "*.*bar*", 0 },
+ { "foo.bar", "*.*.", 1 },
+ { "foo.bar", "fo*.b*", 0 },
+ { "*oo.bar", "fo*.b*", 0 },
+ { "*oo.bar.com", "fo*.b*", 1 },
+ { "*oo.bar.com", "fo*.b*m", 1 },
+ { "*oo.bar.com", "fo*.b*.c*", 0 },
+ };
+ /* *INDENT-ON* */
+
+ unsigned n;
+ int code;
+
+ CTRACE((tfp, "mismatch_asterisk testing\n"));
+ for (n = 0; n < TABLESIZE(table); ++n) {
+ CTRACE((tfp, "-------%d\n", n));
+ code = strcasecomp_asterisk(table[n].a, table[n].b);
+ if (code != table[n].code) {
+ CTRACE((tfp, "mismatch_asterisk '%s' '%s' got %d, want %d\n",
+ table[n].a, table[n].b, code, table[n].code));
+ }
+ }
+}
+#endif
+
+#ifdef NOT_ASCII
+
+/* Case-insensitive with ASCII collating sequence
+ * ----------------
+ */
+int AS_casecomp(const char *p,
+ const char *q)
+{
+ int diff;
+
+ for (;; p++, q++) {
+ if (!(*p && *q))
+ return (UCH(*p) - UCH(*q));
+ diff = TOASCII(TOLOWER(*p))
+ - TOASCII(TOLOWER(*q));
+ if (diff)
+ return diff;
+ }
+ /*NOTREACHED */
+}
+
+/* With count limit and ASCII collating sequence
+ * ----------------
+ * AS_cmp uses n == -1 to compare indefinite length.
+ */
+int AS_ncmp(const char *p,
+ const char *q,
+ unsigned int n)
+{
+ const char *a = p;
+ int diff;
+
+ for (; (unsigned) (p - a) < n; p++, q++) {
+ if (!(*p && *q))
+ return (UCH(*p) - UCH(*q));
+ diff = TOASCII(*p)
+ - TOASCII(*q);
+ if (diff)
+ return diff;
+ }
+ return 0; /* Match up to n characters */
+}
+#endif /* NOT_ASCII */
+
+/* Allocate a new copy of a string, and returns it
+*/
+char *HTSACopy(char **dest,
+ const char *src)
+{
+ if (src != 0) {
+ if (src != *dest) {
+ size_t size = strlen(src) + 1;
+
+ FREE(*dest);
+ *dest = (char *) malloc(size);
+ if (*dest == NULL)
+ outofmem(__FILE__, "HTSACopy");
+ MemCpy(*dest, src, size);
+ }
+ } else {
+ FREE(*dest);
+ }
+ return *dest;
+}
+
+/* String Allocate and Concatenate
+*/
+char *HTSACat(char **dest,
+ const char *src)
+{
+ if (src && *src && (src != *dest)) {
+ if (*dest) {
+ size_t length = strlen(*dest);
+
+ *dest = (char *) realloc(*dest, length + strlen(src) + 1);
+ if (*dest == NULL)
+ outofmem(__FILE__, "HTSACat");
+ strcpy(*dest + length, src);
+ } else {
+ *dest = (char *) malloc(strlen(src) + 1);
+ if (*dest == NULL)
+ outofmem(__FILE__, "HTSACat");
+ strcpy(*dest, src);
+ }
+ }
+ return *dest;
+}
+
+/* optimized for heavily realloc'd strings, store length inside */
+
+#define EXTRA_TYPE size_t /* type we use for length */
+#define EXTRA_SIZE sizeof(void *) /* alignment >= sizeof(EXTRA_TYPE) */
+
+void HTSAFree_extra(char *s)
+{
+ free(s - EXTRA_SIZE);
+}
+
+/* never shrink */
+char *HTSACopy_extra(char **dest,
+ const char *src)
+{
+ if (src != 0) {
+ size_t srcsize = strlen(src) + 1;
+ EXTRA_TYPE size = 0;
+
+ if (*dest != 0) {
+ size = *(EXTRA_TYPE *) (void *) ((*dest) - EXTRA_SIZE);
+ }
+ if ((*dest == 0) || (size < srcsize)) {
+ FREE_extra(*dest);
+ size = srcsize * 2; /* x2 step */
+ *dest = (char *) malloc(size + EXTRA_SIZE);
+ if (*dest == NULL)
+ outofmem(__FILE__, "HTSACopy_extra");
+ *(EXTRA_TYPE *) (void *) (*dest) = size;
+ *dest += EXTRA_SIZE;
+ }
+ MemCpy(*dest, src, srcsize);
+ } else {
+ Clear_extra(*dest);
+ }
+ return *dest;
+}
+
+/* Find next Field
+ * ---------------
+ *
+ * On entry,
+ * *pstr points to a string containing white space separated
+ * field, optionlly quoted.
+ *
+ * On exit,
+ * *pstr has been moved to the first delimiter past the
+ * field
+ * THE STRING HAS BEEN MUTILATED by a 0 terminator
+ *
+ * returns a pointer to the first field
+ */
+char *HTNextField(char **pstr)
+{
+ char *p = *pstr;
+ char *start = NULL; /* start of field */
+
+ if (p != NULL) {
+ while (*p && WHITE(*p))
+ p++; /* Strip white space */
+ if (!*p) {
+ *pstr = p;
+ } else {
+ if (*p == '"') { /* quoted field */
+ p++;
+ start = p;
+ for (; *p && *p != '"'; p++) {
+ if (*p == '\\' && p[1])
+ p++; /* Skip escaped chars */
+ }
+ } else {
+ start = p;
+ while (*p && !WHITE(*p))
+ p++; /* Skip first field */
+ }
+ if (*p)
+ *p++ = '\0';
+ *pstr = p;
+ }
+ }
+ return start;
+}
+
+/* Find next Token
+ * ---------------
+ * Finds the next token in a string
+ * On entry,
+ * *pstr points to a string to be parsed.
+ * delims lists characters to be recognized as delimiters.
+ * If NULL, default is white space "," ";" or "=".
+ * The word can optionally be quoted or enclosed with
+ * chars from bracks.
+ * Comments surrounded by '(' ')' are filtered out
+ * unless they are specifically requested by including
+ * ' ' or '(' in delims or bracks.
+ * bracks lists bracketing chars. Some are recognized as
+ * special, for those give the opening char.
+ * If NULL, defaults to <"> and "<" ">".
+ * found points to location to fill with the ending delimiter
+ * found, or is NULL.
+ *
+ * On exit,
+ * *pstr has been moved to the first delimiter past the
+ * field
+ * THE STRING HAS BEEN MUTILATED by a 0 terminator
+ * found points to the delimiter found unless it was NULL.
+ * Returns a pointer to the first word or NULL on error
+ */
+char *HTNextTok(char **pstr,
+ const char *delims,
+ const char *bracks,
+ char *found)
+{
+ char *p = *pstr;
+ char *start = NULL;
+ BOOL get_blanks, skip_comments;
+ BOOL get_comments;
+ BOOL get_closing_char_too = FALSE;
+ char closer;
+
+ if (isEmpty(pstr))
+ return NULL;
+ if (!delims)
+ delims = " ;,=";
+ if (!bracks)
+ bracks = "<\"";
+
+ get_blanks = (BOOL) (!StrChr(delims, ' ') && !StrChr(bracks, ' '));
+ get_comments = (BOOL) (StrChr(bracks, '(') != NULL);
+ skip_comments = (BOOL) (!get_comments && !StrChr(delims, '(') && !get_blanks);
+#define skipWHITE(c) (!get_blanks && WHITE(c))
+
+ while (*p && skipWHITE(*p))
+ p++; /* Strip white space */
+ if (!*p) {
+ *pstr = p;
+ if (found)
+ *found = '\0';
+ return NULL; /* No first field */
+ }
+ while (1) {
+ /* Strip white space and other delimiters */
+ while (*p && (skipWHITE(*p) || StrChr(delims, *p)))
+ p++;
+ if (!*p) {
+ *pstr = p;
+ if (found)
+ *found = *(p - 1);
+ return NULL; /* No field */
+ }
+
+ if (*p == '(' && (skip_comments || get_comments)) { /* Comment */
+ int comment_level = 0;
+
+ if (get_comments && !start)
+ start = p + 1;
+ for (; *p && (*p != ')' || --comment_level > 0); p++) {
+ if (*p == '(')
+ comment_level++;
+ else if (*p == '"') { /* quoted field within Comment */
+ for (p++; *p && *p != '"'; p++)
+ if (*p == '\\' && *(p + 1))
+ p++; /* Skip escaped chars */
+ if (!*p)
+ break; /* (invalid) end of string found, leave */
+ }
+ if (*p == '\\' && *(p + 1))
+ p++; /* Skip escaped chars */
+ }
+ if (get_comments)
+ break;
+ if (*p)
+ p++;
+ if (get_closing_char_too) {
+ if (!*p || (!StrChr(bracks, *p) && StrChr(delims, *p))) {
+ break;
+ } else
+ get_closing_char_too = (BOOL) (StrChr(bracks, *p) != NULL);
+ }
+ } else if (StrChr(bracks, *p)) { /* quoted or bracketed field */
+ switch (*p) {
+ case '<':
+ closer = '>';
+ break;
+ case '[':
+ closer = ']';
+ break;
+ case '{':
+ closer = '}';
+ break;
+ case ':':
+ closer = ';';
+ break;
+ default:
+ closer = *p;
+ }
+ if (!start)
+ start = ++p;
+ for (; *p && *p != closer; p++)
+ if (*p == '\\' && *(p + 1))
+ p++; /* Skip escaped chars */
+ if (get_closing_char_too) {
+ p++;
+ if (!*p || (!StrChr(bracks, *p) && StrChr(delims, *p))) {
+ break;
+ } else
+ get_closing_char_too = (BOOL) (StrChr(bracks, *p) != NULL);
+ } else
+ break; /* kr95-10-9: needs to stop here */
+ } else { /* Spool field */
+ if (!start)
+ start = p;
+ while (*p && !skipWHITE(*p) && !StrChr(bracks, *p) &&
+ !StrChr(delims, *p))
+ p++;
+ if (*p && StrChr(bracks, *p)) {
+ get_closing_char_too = TRUE;
+ } else {
+ if (*p == '(' && skip_comments) {
+ *pstr = p;
+ HTNextTok(pstr, NULL, "(", found); /* Advance pstr */
+ *p = '\0';
+ if (*pstr && **pstr)
+ (*pstr)++;
+ return start;
+ }
+ break; /* Got it */
+ }
+ }
+ }
+ if (found)
+ *found = *p;
+
+ if (*p)
+ *p++ = '\0';
+ *pstr = p;
+ return start;
+}
+
+static char *HTAlloc(char *ptr, size_t length)
+{
+ if (ptr != 0)
+ ptr = (char *) realloc(ptr, length);
+ else
+ ptr = (char *) malloc(length);
+ if (ptr == 0)
+ outofmem(__FILE__, "HTAlloc");
+ return ptr;
+}
+
+/*
+ * If SAVE_TIME_NOT_SPACE is defined, StrAllocVsprintf will hang on to
+ * its temporary string buffers instead of allocating and freeing them
+ * in each invocation. They only grow and never shrink, and won't be
+ * cleaned up on exit. - kw
+ */
+#if defined(_REENTRANT) || defined(_THREAD_SAFE) || defined(LY_FIND_LEAKS)
+#undef SAVE_TIME_NOT_SPACE
+#endif
+
+/*
+ * Replacement for sprintf, allocates buffer on the fly according to what's
+ * needed for its arguments. Unlike sprintf, this always concatenates to the
+ * destination buffer, so we do not have to provide both flavors.
+ */
+typedef enum {
+ Flags,
+ Width,
+ Prec,
+ Type,
+ Format
+} PRINTF;
+
+#define VA_INTGR(type) ival = (int) va_arg((*ap), type)
+#define VA_FLOAT(type) fval = (double) va_arg((*ap), type)
+#define VA_POINT(type) pval = (char *) va_arg((*ap), type)
+
+#define NUM_WIDTH 10 /* allow for width substituted for "*" in "%*s" */
+ /* also number of chars assumed to be needed in addition
+ to a given precision in floating point formats */
+
+#define GROW_EXPR(n) (((n) * 3) / 2)
+#define GROW_SIZE 256
+
+PUBLIC_IF_FIND_LEAKS char *StrAllocVsprintf(char **pstr,
+ size_t dst_len,
+ const char *fmt,
+ va_list *ap)
+{
+#ifdef HAVE_VASPRINTF
+ /*
+ * Use vasprintf() if we have it, since it is simplest.
+ */
+ char *result = 0;
+ char *temp = 0;
+
+ /* discard old destination if no length was given */
+ if (pstr && !dst_len) {
+ if (*pstr)
+ FREE(*pstr);
+ }
+
+ if (vasprintf(&temp, fmt, *ap) >= 0) {
+ if (dst_len != 0) {
+ size_t src_len = strlen(temp);
+ size_t new_len = dst_len + src_len + 1;
+
+ result = HTAlloc(pstr ? *pstr : 0, new_len);
+ if (result != 0) {
+ strcpy(result + dst_len, temp);
+ }
+ (free) (temp);
+ } else {
+ result = temp;
+ mark_malloced(temp, strlen(temp));
+ }
+ }
+
+ if (pstr != 0)
+ *pstr = result;
+
+ return result;
+#else /* !HAVE_VASPRINTF */
+ /*
+ * If vasprintf() is not available, this works - but does not implement
+ * the POSIX '$' formatting character which may be used in some of the
+ * ".po" files.
+ */
+#ifdef SAVE_TIME_NOT_SPACE
+ static size_t tmp_len = 0;
+ static size_t fmt_len = 0;
+ static char *tmp_ptr = NULL;
+ static char *fmt_ptr = NULL;
+
+#else
+ size_t tmp_len = GROW_SIZE;
+ char *tmp_ptr = 0;
+ char *fmt_ptr;
+#endif /* SAVE_TIME_NOT_SPACE */
+ size_t have, need;
+ char *dst_ptr = pstr ? *pstr : NULL;
+ const char *format = fmt;
+
+ if (isEmpty(fmt))
+ return 0;
+
+ need = strlen(fmt) + 1;
+#ifdef SAVE_TIME_NOT_SPACE
+ if (!fmt_ptr || fmt_len < need * NUM_WIDTH) {
+ fmt_ptr = HTAlloc(fmt_ptr, fmt_len = need * NUM_WIDTH);
+ }
+ if (!tmp_ptr || tmp_len < GROW_SIZE) {
+ tmp_ptr = HTAlloc(tmp_ptr, tmp_len = GROW_SIZE);
+ }
+#else
+ if ((fmt_ptr = malloc(need * NUM_WIDTH)) == 0
+ || (tmp_ptr = malloc(tmp_len)) == 0) {
+ outofmem(__FILE__, "StrAllocVsprintf");
+ }
+#endif /* SAVE_TIME_NOT_SPACE */
+
+ if (dst_ptr == 0) {
+ dst_ptr = HTAlloc(dst_ptr, have = GROW_SIZE + need);
+ } else {
+ have = strlen(dst_ptr) + 1;
+ need += dst_len;
+ if (have < need)
+ dst_ptr = HTAlloc(dst_ptr, have = GROW_SIZE + need);
+ }
+
+ while (*fmt != '\0') {
+ if (*fmt == '%') {
+ static char dummy[] = "";
+ PRINTF state = Flags;
+ char *pval = dummy; /* avoid const-cast */
+ double fval = 0.0;
+ int done = FALSE;
+ int ival = 0;
+ int prec = -1;
+ int type = 0;
+ int used = 0;
+ int width = -1;
+ size_t f = 0;
+
+ fmt_ptr[f++] = *fmt;
+ while (*++fmt != '\0' && !done) {
+ fmt_ptr[f++] = *fmt;
+
+ if (isdigit(UCH(*fmt))) {
+ int num = *fmt - '0';
+
+ if (state == Flags && num != 0)
+ state = Width;
+ if (state == Width) {
+ if (width < 0)
+ width = 0;
+ width = (width * 10) + num;
+ } else if (state == Prec) {
+ if (prec < 0)
+ prec = 0;
+ prec = (prec * 10) + num;
+ }
+ } else if (*fmt == '*') {
+ VA_INTGR(int);
+
+ if (state == Flags)
+ state = Width;
+ if (state == Width) {
+ width = ival;
+ } else if (state == Prec) {
+ prec = ival;
+ }
+ sprintf(&fmt_ptr[--f], "%d", ival);
+ f = strlen(fmt_ptr);
+ } else if (isalpha(UCH(*fmt))) {
+ done = TRUE;
+ switch (*fmt) {
+ case 'Z': /* FALLTHRU */
+ case 'h': /* FALLTHRU */
+ case 'l': /* FALLTHRU */
+ case 'L': /* FALLTHRU */
+ done = FALSE;
+ type = *fmt;
+ break;
+ case 'o': /* FALLTHRU */
+ case 'i': /* FALLTHRU */
+ case 'd': /* FALLTHRU */
+ case 'u': /* FALLTHRU */
+ case 'x': /* FALLTHRU */
+ case 'X': /* FALLTHRU */
+ if (type == 'l')
+ VA_INTGR(long);
+
+ else if (type == 'Z')
+ VA_INTGR(size_t);
+
+ else
+ VA_INTGR(int);
+
+ used = 'i';
+ break;
+ case 'f': /* FALLTHRU */
+ case 'e': /* FALLTHRU */
+ case 'E': /* FALLTHRU */
+ case 'g': /* FALLTHRU */
+ case 'G': /* FALLTHRU */
+ VA_FLOAT(double);
+
+ used = 'f';
+ break;
+ case 'c':
+ VA_INTGR(int);
+
+ used = 'c';
+ break;
+ case 's':
+ VA_POINT(char *);
+
+ if (prec < 0)
+ prec = (int) strlen(pval);
+ used = 's';
+ break;
+ case 'p':
+ VA_POINT(void *);
+
+ used = 'p';
+ break;
+ case 'n':
+ VA_POINT(int *);
+
+ used = 0;
+ break;
+ default:
+ CTRACE((tfp, "unknown format character '%c' in %s\n",
+ *fmt, format));
+ break;
+ }
+ } else if (*fmt == '.') {
+ state = Prec;
+ } else if (*fmt == '%') {
+ done = TRUE;
+ used = '%';
+ }
+ }
+ fmt_ptr[f] = '\0';
+
+ if (prec > 0) {
+ switch (used) {
+ case 'f':
+ if (width < prec + NUM_WIDTH)
+ width = prec + NUM_WIDTH;
+ /* FALLTHRU */
+ case 'i':
+ /* FALLTHRU */
+ case 'p':
+ if (width < prec + 2)
+ width = prec + 2; /* leading sign/space/zero, "0x" */
+ break;
+ case 'c':
+ break;
+ case '%':
+ break;
+ default:
+ if (width < prec)
+ width = prec;
+ break;
+ }
+ }
+ if (width >= (int) tmp_len) {
+ tmp_len = GROW_EXPR(tmp_len + width);
+ tmp_ptr = HTAlloc(tmp_ptr, tmp_len);
+ }
+
+ switch (used) {
+ case 'i':
+ case 'c':
+ sprintf(tmp_ptr, fmt_ptr, ival);
+ break;
+ case 'f':
+ sprintf(tmp_ptr, fmt_ptr, fval);
+ break;
+ default:
+ sprintf(tmp_ptr, fmt_ptr, pval);
+ break;
+ }
+ need = dst_len + strlen(tmp_ptr) + 1;
+ if (need >= have) {
+ dst_ptr = HTAlloc(dst_ptr, have = GROW_EXPR(need));
+ }
+ strcpy(dst_ptr + dst_len, tmp_ptr);
+ dst_len += strlen(tmp_ptr);
+ } else {
+ if ((dst_len + 2) >= have) {
+ dst_ptr = HTAlloc(dst_ptr, (have += GROW_SIZE));
+ }
+ dst_ptr[dst_len++] = *fmt++;
+ }
+ }
+
+#ifndef SAVE_TIME_NOT_SPACE
+ FREE(tmp_ptr);
+ FREE(fmt_ptr);
+#endif
+ dst_ptr[dst_len] = '\0';
+ if (pstr)
+ *pstr = dst_ptr;
+ return (dst_ptr);
+#endif /* HAVE_VASPRINTF */
+}
+#undef SAVE_TIME_NOT_SPACE
+
+/*
+ * Replacement for sprintf, allocates buffer on the fly according to what's
+ * needed for its arguments. Unlike sprintf, this always concatenates to the
+ * destination buffer.
+ */
+/* Note: if making changes, also check the memory tracking version
+ * LYLeakHTSprintf in LYLeaks.c. - kw */
+#ifdef HTSprintf /* if hidden by LYLeaks stuff */
+#undef HTSprintf
+#endif
+char *HTSprintf(char **pstr, const char *fmt, ...)
+{
+ char *result = 0;
+ size_t inuse = 0;
+ va_list ap;
+
+ LYva_start(ap, fmt);
+ {
+ if (pstr != 0 && *pstr != 0)
+ inuse = strlen(*pstr);
+ result = StrAllocVsprintf(pstr, inuse, fmt, &ap);
+ }
+ va_end(ap);
+
+ return (result);
+}
+
+/*
+ * Replacement for sprintf, allocates buffer on the fly according to what's
+ * needed for its arguments. Like sprintf, this always resets the destination
+ * buffer.
+ */
+/* Note: if making changes, also check the memory tracking version
+ * LYLeakHTSprintf0 in LYLeaks.c. - kw */
+#ifdef HTSprintf0 /* if hidden by LYLeaks stuff */
+#undef HTSprintf0
+#endif
+char *HTSprintf0(char **pstr, const char *fmt, ...)
+{
+ char *result = 0;
+ va_list ap;
+
+ LYva_start(ap, fmt);
+ {
+ result = StrAllocVsprintf(pstr, (size_t) 0, fmt, &ap);
+ }
+ va_end(ap);
+
+ return (result);
+}
+
+/*
+ * Returns a quoted or escaped form of the given parameter, suitable for use in
+ * a command string.
+ */
+#if USE_QUOTED_PARAMETER
+#define S_QUOTE '\''
+#define D_QUOTE '"'
+char *HTQuoteParameter(const char *parameter)
+{
+ size_t i;
+ size_t last;
+ size_t n = 0;
+ size_t quoted = 0;
+ char *result;
+
+ if (parameter == 0)
+ parameter = "";
+
+ last = strlen(parameter);
+ for (i = 0; i < last; ++i)
+ if (StrChr("\\&#$^*?(){}<>\"';`|", parameter[i]) != 0
+ || isspace(UCH(parameter[i])))
+ ++quoted;
+
+ result = (char *) malloc(last + 5 * quoted + 3);
+ if (result == NULL)
+ outofmem(__FILE__, "HTQuoteParameter");
+
+ n = 0;
+#if (USE_QUOTED_PARAMETER == 1)
+ /*
+ * Only double-quotes are used in Win32/DOS -TD
+ */
+ if (quoted)
+ result[n++] = D_QUOTE;
+ for (i = 0; i < last; i++) {
+ result[n++] = parameter[i];
+ }
+ if (quoted)
+ result[n++] = D_QUOTE;
+#else
+ if (quoted)
+ result[n++] = S_QUOTE;
+ for (i = 0; i < last; i++) {
+ if (parameter[i] == S_QUOTE) {
+ result[n++] = S_QUOTE;
+ result[n++] = D_QUOTE;
+ result[n++] = parameter[i];
+ result[n++] = D_QUOTE;
+ result[n++] = S_QUOTE;
+ } else {
+ /* Note: No special handling of other characters, including
+ backslash, since we are constructing a single-quoted string!
+ Backslash has no special escape meaning within those for sh
+ and compatible shells, so trying to escape a backslash by
+ doubling it is unnecessary and would be interpreted by the
+ shell as an additional data character. - kw 2000-05-02
+ */
+ result[n++] = parameter[i];
+ }
+ }
+ if (quoted)
+ result[n++] = S_QUOTE;
+#endif
+ result[n] = '\0';
+ return result;
+}
+#endif
+
+#define HTIsParam(string) ((string[0] == '%' && string[1] == 's'))
+
+/*
+ * Returns the number of "%s" tokens in a system command-template.
+ */
+int HTCountCommandArgs(const char *command)
+{
+ int number = 0;
+
+ while (command[0] != 0) {
+ if (HTIsParam(command))
+ number++;
+ command++;
+ }
+ return number;
+}
+
+/*
+ * Returns a pointer into the given string after the given parameter number
+ */
+static const char *HTAfterCommandArg(const char *command,
+ int number)
+{
+ while (number > 0) {
+ if (command[0] != 0) {
+ if (HTIsParam(command)) {
+ number--;
+ command++;
+ }
+ command++;
+ } else {
+ break;
+ }
+ }
+ return command;
+}
+
+#if USE_QUOTED_PARAMETER
+/*
+ * Recursively trim possible parameters of the source until an existing file
+ * is found. If no file is found, return -1. If a file is found, return
+ * the offset to a blank just after the filename.
+ *
+ * TODO: this could be smarter about trimming, e.g., matching quotes.
+ */
+static int skipPathname(const char *target, const char *source)
+{
+ int result = -1;
+ const char *last;
+ struct stat stat_info;
+
+ if (HTStat(target, &stat_info) == 0
+ && S_ISREG(stat_info.st_mode)) {
+ result = 0;
+ } else if (*target != ' ' && (last = strrchr(target, ' ')) != NULL) {
+ char *temp = NULL;
+ int inner;
+
+ while (last != target && last[-1] == ' ')
+ --last;
+
+ StrAllocCopy(temp, target);
+ result = (int) (last - target);
+ temp[result] = '\0';
+
+ if ((inner = skipPathname(temp, source)) < 0) {
+ result = -1;
+ } else if (inner > 0) {
+ result = inner;
+ }
+
+ FREE(temp);
+ }
+ CTRACE((tfp, "skip/recur %d '%s'\n", result, target));
+ return result;
+}
+#endif
+
+/*
+ * Like HTAddParam, but the parameter may be an environment variable, which we
+ * will expand and append. Do this only for things like the command-verb,
+ * where we obtain the parameter from the user's configuration. Any quoting
+ * required for the environment variable has to be done within its value, e.g.,
+ *
+ * setenv EDITOR 'xvile -name "No such class"'
+ *
+ * This is useful only when we quote parameters, of course.
+ */
+#if USE_QUOTED_PARAMETER
+void HTAddXpand(char **result,
+ const char *command,
+ int number,
+ const char *parameter)
+{
+ if (parameter == NULL)
+ parameter = "";
+ if (number > 0) {
+ const char *last = HTAfterCommandArg(command, number - 1);
+ const char *next = last;
+
+ if (number <= 1) {
+ FREE(*result);
+ }
+
+ while (next[0] != 0) {
+ if (HTIsParam(next)) {
+ if (next != last) {
+ size_t len = ((size_t) (next - last)
+ + ((*result != 0)
+ ? strlen(*result)
+ : 0));
+
+ HTSACat(result, last);
+ (*result)[len] = 0;
+ }
+ if (LYisAbsPath(parameter)) {
+ int skip = skipPathname(parameter, parameter);
+ char *quoted;
+
+ if (skip > 0) {
+ char *temp = NULL;
+
+ StrAllocCopy(temp, parameter);
+ temp[skip] = 0;
+
+ quoted = HTQuoteParameter(temp);
+ HTSACat(result, quoted);
+ FREE(quoted);
+
+ temp[skip] = ' ';
+ HTSACat(result, temp + skip);
+ FREE(temp);
+ } else {
+ quoted = HTQuoteParameter(parameter);
+ HTSACat(result, quoted);
+ FREE(quoted);
+ }
+ } else {
+ /* leave it unquoted, e.g., environment variable expanded */
+ HTSACat(result, parameter);
+ }
+ CTRACE((tfp, "PARAM-EXP:%s\n", *result));
+ return;
+ }
+ next++;
+ }
+ }
+}
+#endif /* USE_QUOTED_PARAMETER */
+
+/*
+ * Append string to a system command that we are constructing, without quoting.
+ * We're given the index of the newest parameter we're processing. Zero
+ * indicates none, so a value of '1' indicates that we copy from the beginning
+ * of the command string up to the first parameter, substitute the quoted
+ * parameter and return the result.
+ *
+ * Parameters are substituted at "%s" tokens, like printf. Other printf-style
+ * tokens are not substituted; they are passed through without change.
+ */
+void HTAddToCmd(char **result,
+ const char *command,
+ int number,
+ const char *string)
+{
+ if (number > 0) {
+ const char *last = HTAfterCommandArg(command, number - 1);
+ const char *next = last;
+
+ if (number <= 1) {
+ FREE(*result);
+ }
+ if (string == 0)
+ string = "";
+ while (next[0] != 0) {
+ if (HTIsParam(next)) {
+ if (next != last) {
+ size_t len = ((size_t) (next - last)
+ + ((*result != 0)
+ ? strlen(*result)
+ : 0));
+
+ HTSACat(result, last);
+ (*result)[len] = 0;
+ }
+ HTSACat(result, string);
+ CTRACE((tfp, "PARAM-ADD:%s\n", *result));
+ return;
+ }
+ next++;
+ }
+ }
+}
+
+/*
+ * Append string-parameter to a system command that we are constructing. The
+ * string is a complete parameter (which is a necessary assumption so we can
+ * quote it properly).
+ */
+void HTAddParam(char **result,
+ const char *command,
+ int number,
+ const char *parameter)
+{
+ if (number > 0) {
+#if USE_QUOTED_PARAMETER
+ char *quoted = HTQuoteParameter(parameter);
+
+ HTAddToCmd(result, command, number, quoted);
+ FREE(quoted);
+#else
+ HTAddToCmd(result, command, number, parameter);
+#endif
+ }
+}
+
+/*
+ * Append the remaining command-string to a system command (compare with
+ * HTAddParam). Any remaining "%s" tokens are copied as empty strings.
+ */
+void HTEndParam(char **result,
+ const char *command,
+ int number)
+{
+ const char *last;
+ int count;
+
+ count = HTCountCommandArgs(command);
+ if (count < number)
+ number = count;
+ last = HTAfterCommandArg(command, number);
+ if (last[0] != 0) {
+ HTSACat(result, last);
+ }
+ CTRACE((tfp, "PARAM-END:%s\n", *result));
+}
+
+/* Binary-strings (may have embedded nulls). Some modules (HTGopher) assume
+ * there is a null on the end, anyway.
+ */
+
+/* (Re)allocate a bstring, e.g., to increase its buffer size for ad hoc
+ * operations.
+ */
+void HTSABAlloc(bstring **dest, int len)
+{
+ if (*dest == 0) {
+ *dest = typecalloc(bstring);
+
+ if (*dest == 0)
+ outofmem(__FILE__, "HTSABAlloc");
+ }
+
+ if ((*dest)->len != len) {
+ (*dest)->str = typeRealloc(char, (*dest)->str, len);
+
+ if ((*dest)->str == 0)
+ outofmem(__FILE__, "HTSABAlloc");
+
+ (*dest)->len = len;
+ }
+}
+
+/* Allocate a new bstring, and return it.
+*/
+void HTSABCopy(bstring **dest, const char *src,
+ int len)
+{
+ bstring *t;
+ unsigned need = (unsigned) (len + 1);
+
+ CTRACE2(TRACE_BSTRING,
+ (tfp, "HTSABCopy(%p, %p, %d)\n",
+ (void *) dest, (const void *) src, len));
+ HTSABFree(dest);
+ if (src) {
+ if (TRACE_BSTRING) {
+ CTRACE((tfp, "=== %4d:", len));
+ trace_bstring2(src, len);
+ CTRACE((tfp, "\n"));
+ }
+ if ((t = (bstring *) malloc(sizeof(bstring))) == NULL)
+ outofmem(__FILE__, "HTSABCopy");
+
+ if ((t->str = typeMallocn(char, need)) == NULL)
+ outofmem(__FILE__, "HTSABCopy");
+
+ MemCpy(t->str, src, len);
+ t->len = len;
+ t->str[t->len] = '\0';
+ *dest = t;
+ }
+ if (TRACE_BSTRING) {
+ CTRACE((tfp, "=> %4d:", BStrLen(*dest)));
+ trace_bstring(*dest);
+ CTRACE((tfp, "\n"));
+ }
+}
+
+/*
+ * Initialize with a null-terminated string (discards the null).
+ */
+void HTSABCopy0(bstring **dest, const char *src)
+{
+ HTSABCopy(dest, src, (int) strlen(src));
+}
+
+/*
+ * Append a block of memory to a bstring.
+ */
+void HTSABCat(bstring **dest, const char *src,
+ int len)
+{
+ bstring *t = *dest;
+
+ CTRACE2(TRACE_BSTRING,
+ (tfp, "HTSABCat(%p, %p, %d)\n",
+ (void *) dest, (const void *) src, len));
+ if (src) {
+ unsigned need = (unsigned) (len + 1);
+
+ if (TRACE_BSTRING) {
+ CTRACE((tfp, "=== %4d:", len));
+ trace_bstring2(src, len);
+ CTRACE((tfp, "\n"));
+ }
+ if (t) {
+ unsigned length = (unsigned) t->len + need;
+
+ t->str = typeRealloc(char, t->str, length);
+ } else {
+ if ((t = typecalloc(bstring)) == NULL)
+ outofmem(__FILE__, "HTSACat");
+
+ t->str = typeMallocn(char, need);
+ }
+ if (t->str == NULL)
+ outofmem(__FILE__, "HTSACat");
+
+ MemCpy(t->str + t->len, src, len);
+ t->len += len;
+ t->str[t->len] = '\0';
+ *dest = t;
+ }
+ if (TRACE_BSTRING) {
+ CTRACE((tfp, "=> %4d:", BStrLen(*dest)));
+ trace_bstring(*dest);
+ CTRACE((tfp, "\n"));
+ }
+}
+
+/*
+ * Append a null-terminated string (discards the null).
+ */
+void HTSABCat0(bstring **dest, const char *src)
+{
+ HTSABCat(dest, src, (int) strlen(src));
+}
+
+/*
+ * Compare two bstring's for equality
+ */
+BOOL HTSABEql(bstring *a, bstring *b)
+{
+ unsigned len_a = (unsigned) ((a != 0) ? a->len : 0);
+ unsigned len_b = (unsigned) ((b != 0) ? b->len : 0);
+
+ if (len_a == len_b) {
+ if (len_a == 0
+ || MemCmp(a->str, b->str, a->len) == 0)
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/*
+ * Deallocate a bstring.
+ */
+void HTSABFree(bstring **ptr)
+{
+ if (*ptr != NULL) {
+ FREE((*ptr)->str);
+ FREE(*ptr);
+ *ptr = NULL;
+ }
+}
+
+/*
+ * Use this function to perform formatted sprintf's onto the end of a bstring.
+ * The bstring may contain embedded nulls; the formatted portions must not.
+ */
+bstring *HTBprintf(bstring **pstr, const char *fmt, ...)
+{
+ bstring *result = 0;
+ char *temp = 0;
+ va_list ap;
+
+ LYva_start(ap, fmt);
+ {
+ temp = StrAllocVsprintf(&temp, (size_t) 0, fmt, &ap);
+ if (non_empty(temp)) {
+ HTSABCat(pstr, temp, (int) strlen(temp));
+ }
+ FREE(temp);
+ result = *pstr;
+ }
+ va_end(ap);
+
+ return (result);
+}
+
+/*
+ * Write binary-data to the logfile, making it safe for most editors to view.
+ * That is most, since we do not restrict line-length. Nulls and other
+ * non-printing characters are addressed.
+ */
+void trace_bstring2(const char *text,
+ int size)
+{
+ int n;
+
+ if (text != 0) {
+ for (n = 0; n < size; ++n) {
+ int ch = UCH(text[n]);
+
+ switch (ch) {
+ case '\\':
+ fputs("\\\\", tfp);
+ break;
+ case '\r':
+ fputs("\\r", tfp);
+ break;
+ case '\t':
+ fputs("\\t", tfp);
+ break;
+ case '\f':
+ fputs("\\f", tfp);
+ break;
+ default:
+ if (isprint(ch) || isspace(ch)) {
+ fputc(ch, tfp);
+ } else {
+ fprintf(tfp, "\\%03o", ch);
+ }
+ break;
+ }
+ }
+ }
+}
+
+void trace_bstring(bstring *data)
+{
+ trace_bstring2(BStrData(data), BStrLen(data));
+}
diff --git a/WWW/Library/Implementation/HTString.h b/WWW/Library/Implementation/HTString.h
new file mode 100644
index 0000000..82520ad
--- /dev/null
+++ b/WWW/Library/Implementation/HTString.h
@@ -0,0 +1,167 @@
+/*
+ * $LynxId: HTString.h,v 1.41 2021/06/09 19:30:55 tom Exp $
+ * String handling for libwww
+ * STRINGS
+ *
+ * Case-independent string comparison and allocations with copies etc
+ */
+#ifndef HTSTRING_H
+#define HTSTRING_H
+
+#ifndef HTUTILS_H
+#include <HTUtils.h>
+#endif /* HTUTILS_H */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ extern const char *HTLibraryVersion; /* String for help screen etc */
+
+/*
+ * EBCDIC string comparison using ASCII collating sequence
+ */
+#ifdef NOT_ASCII
+ extern int AS_casecomp(const char *a, const char *b);
+ extern int AS_ncmp(const char *a, const char *b, unsigned int n);
+
+#define AS_cmp( a, b ) ( AS_ncmp( ( a ), ( b ), -1 ) )
+
+#else
+#define AS_casecomp( a, b ) ( strcasecomp( ( a ), ( b ) ) )
+#define AS_ncmp( a, b, c ) ( StrNCmp( ( a ), ( b ), ( c ) ) )
+#define AS_cmp strcmp
+
+#endif /* NOT_ASCII */
+
+#define StrNCat(a,b,c) strncat((a),(b),(size_t)(c))
+#define StrNCpy(a,b,c) strncpy((a),(b),(size_t)(c))
+#define StrNCmp(a,b,c) strncmp((a),(b),(size_t)(c))
+
+#define MemCpy(a,b,c) memcpy((a),(b),(size_t)(c))
+#define MemCmp(a,b,c) memcmp((a),(b),(size_t)(c))
+
+ /*
+ * Workaround for glibc header defect combined with -Wlogical-op warnings
+ */
+#define StrChr (strchr)
+
+ /*
+ * Case-insensitive string comparison
+ *
+ * The usual routines (comp instead of cmp) had some problem.
+ */
+ extern int strcasecomp(const char *a, const char *b);
+ extern int strncasecomp(const char *a, const char *b, int n);
+
+ extern int strcasecomp8(const char *a, const char *b);
+ extern int strncasecomp8(const char *a, const char *b, int n);
+
+ extern int strcasecomp_asterisk(const char *a, const char *b);
+
+ /*
+ * strcasecomp8 and strncasecomp8 are variants of strcasecomp and
+ * strncasecomp, but use 8bit upper/lower case information from the
+ * current display charset
+ */
+
+ /*
+ * Malloced string manipulation
+ */
+#define StrAllocCopy(dest, src) HTSACopy (&(dest), src)
+#define StrAllocCat(dest, src) HTSACat (&(dest), src)
+ extern char *HTSACopy(char **dest, const char *src);
+ extern char *HTSACat(char **dest, const char *src);
+
+ /*
+ * optimized for heavily realloc'd strings in temp objects
+ */
+#define StrAllocCopy_extra(dest, src) HTSACopy_extra (&(dest), src)
+#define FREE_extra(x) {if (x != NULL) {HTSAFree_extra(x); x = NULL;}}
+#define Clear_extra(x) {if (x != NULL) {*x = '\0';}}
+ extern char *HTSACopy_extra(char **dest, const char *src);
+ extern void HTSAFree_extra(char *s);
+
+ /*
+ * Next word or quoted string
+ */
+ extern char *HTNextField(char **pstr);
+
+ /* A more general parser - kw */
+ extern char *HTNextTok(char **pstr,
+ const char *delims, const char *bracks, char *found);
+
+ extern char *HTSprintf(char **pstr, const char *fmt, ...) GCC_PRINTFLIKE(2,3);
+ extern char *HTSprintf0(char **pstr, const char *fmt, ...) GCC_PRINTFLIKE(2,3);
+
+#if defined(LY_FIND_LEAKS) /* private otherwise */
+ extern char *StrAllocVsprintf(char **pstr,
+ size_t len,
+ const char *fmt,
+ va_list *ap);
+#endif
+
+#if defined(__CYGWIN__)
+#define USE_QUOTED_PARAMETER 2 /* single and double-quoting */
+#elif defined(DOSPATH)
+#define USE_QUOTED_PARAMETER 1 /* double-quoting only */
+#elif (defined(VMS) || defined(__EMX__))
+#define USE_QUOTED_PARAMETER 0 /* no quoting */
+#else
+#define USE_QUOTED_PARAMETER 2 /* single and double-quoting */
+#endif
+
+#if USE_QUOTED_PARAMETER
+ extern char *HTQuoteParameter(const char *parameter);
+ extern void HTAddXpand(char **result, const char *command, int number, const char *parameter);
+
+#else
+#define HTQuoteParameter(parameter) parameter /* simplify ifdef'ing */
+#define HTAddXpand(result,command,number,parameter) HTAddParam(result,command,number,parameter)
+#endif
+
+ extern int HTCountCommandArgs(const char *command);
+ extern void HTAddToCmd(char **result, const char *command, int number, const char *string);
+ extern void HTAddParam(char **result, const char *command, int number, const char *parameter);
+ extern void HTEndParam(char **result, const char *command, int number);
+
+/* Force an option, with leading blanks, to be appended without quoting them */
+#define HTOptParam(result, command, number, parameter) HTSACat(result, parameter)
+
+/* Binary copy and concat */
+ typedef struct {
+ char *str;
+ int len;
+ } bstring;
+
+ extern void HTSABAlloc(bstring **dest, int len);
+ extern void HTSABCopy(bstring **dest, const char *src, int len);
+ extern void HTSABCopy0(bstring **dest, const char *src);
+ extern void HTSABCat(bstring **dest, const char *src, int len);
+ extern void HTSABCat0(bstring **dest, const char *src);
+ extern BOOL HTSABEql(bstring *a, bstring *b);
+ extern void HTSABFree(bstring **ptr);
+
+#define BStrLen(s) (((s) != 0) ? (s)->len : 0)
+#define BStrData(s) (((s) != 0) ? (s)->str : 0)
+
+#define BINEQ(a,b) (HTSABEql(a,b)) /* like STREQ() */
+
+#define isBEmpty(p) ((p) == 0 || BStrData(p) == 0 || BStrLen(p) == 0)
+
+#define BStrAlloc(d,n) HTSABAlloc( &(d), n)
+#define BStrCopy(d,s) HTSABCopy( &(d), BStrData(s), BStrLen(s))
+#define BStrCopy0(d,s) HTSABCopy0( &(d), s)
+#define BStrCopy1(d,s,n) HTSABCopy( &(d), s, n)
+#define BStrCat(d,s) HTSABCat( &(d), BStrData(s), BStrLen(s))
+#define BStrCat0(d,s) HTSABCat0( &(d), s)
+#define BStrFree(d) HTSABFree( &(d))
+
+ extern bstring *HTBprintf(bstring **pstr, const char *fmt, ...) GCC_PRINTFLIKE(2,3);
+
+ extern void trace_bstring(bstring *data);
+ extern void trace_bstring2(const char *text, int size);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* HTSTRING_H */
diff --git a/WWW/Library/Implementation/HTStyle.c b/WWW/Library/Implementation/HTStyle.c
new file mode 100644
index 0000000..54c0bc5
--- /dev/null
+++ b/WWW/Library/Implementation/HTStyle.c
@@ -0,0 +1,378 @@
+/*
+ * $LynxId: HTStyle.c,v 1.16 2009/11/27 13:01:48 tom Exp $
+ *
+ * Style Implementation for Hypertext HTStyle.c
+ * ==================================
+ *
+ * Styles allow the translation between a logical property
+ * of a piece of text and its physical representation.
+ *
+ * A StyleSheet is a collection of styles, defining the
+ * translation necessary to
+ * represent a document. It is a linked list of styles.
+ */
+
+#include <HTUtils.h>
+#include <HTStyle.h>
+
+#include <LYLeaks.h>
+
+/* Create a new style
+*/
+HTStyle *HTStyleNew(void)
+{
+ HTStyle *self = typecalloc(HTStyle);
+
+ if (self == NULL)
+ outofmem(__FILE__, "HTStyleNew");
+ return self;
+}
+
+/* Create a new style with a name
+*/
+HTStyle *HTStyleNewNamed(const char *name)
+{
+ HTStyle *self = HTStyleNew();
+
+ StrAllocCopy(self->w_name, name);
+ self->id = -1; /* <0 */
+ return self;
+}
+
+/* Free a style
+*/
+HTStyle *HTStyleFree(HTStyle *self)
+{
+ FREE(self->w_name);
+ FREE(self->w_SGMLTag);
+ FREE(self);
+ return NULL;
+}
+
+#ifdef SUPPRESS /* Only on the NeXT */
+/* Read a style from a stream (without its name)
+ * --------------------------
+ *
+ * Reads a style with paragraph information from a stream.
+ * The style name is not read or written by these routines.
+ */
+#define NONE_STRING "(None)"
+#define HTStream NXStream
+
+HTStyle *HTStyleRead(HTStyle *style, HTStream *stream)
+{
+ char myTag[STYLE_NAME_LENGTH];
+ char fontName[STYLE_NAME_LENGTH];
+ NXTextStyle *p;
+ int tab;
+ int gotpara; /* flag: have we got a paragraph definition? */
+
+ NXScanf(stream, "%s%s%f%d",
+ myTag,
+ fontName,
+ &style->fontSize,
+ &gotpara);
+ if (gotpara) {
+ if (!style->paragraph) {
+ style->paragraph = malloc(sizeof(*(style->paragraph)));
+ if (!style->paragraph)
+ outofmem(__FILE__, "HTStyleRead");
+ style->paragraph->tabs = 0;
+ }
+ p = style->paragraph;
+ NXScanf(stream, "%f%f%f%f%hd%f%f%hd",
+ &p->indent1st,
+ &p->indent2nd,
+ &p->lineHt,
+ &p->descentLine,
+ &p->alignment,
+ &style->spaceBefore,
+ &style->spaceAfter,
+ &p->numTabs);
+ FREE(p->tabs);
+ p->tabs = malloc(p->numTabs * sizeof(p->tabs[0]));
+ if (!p->tabs)
+ outofmem(__FILE__, "HTStyleRead");
+ for (tab = 0; tab < p->numTabs; tab++) {
+ NXScanf(stream, "%hd%f",
+ &p->tabs[tab].kind,
+ &p->tabs[tab].x);
+ }
+ } else { /* No paragraph */
+ FREE(style->paragraph);
+ } /* if no paragraph */
+ StrAllocCopy(style->SGMLTag, myTag);
+ if (strcmp(fontName, NONE_STRING) == 0)
+ style->font = 0;
+ else
+ style->font =[Font newFont: fontName size:style->fontSize];
+ return NULL;
+}
+
+/* Write a style to a stream in a compatible way
+*/
+HTStyle *HTStyleWrite(HTStyle *style, NXStream * stream)
+{
+ int tab;
+ NXTextStyle *p = style->paragraph;
+
+ NXPrintf(stream, "%s %s %f %d\n",
+ style->SGMLTag,
+ style->font ?[style->font name] : NONE_STRING,
+ style->fontSize,
+ p != 0);
+
+ if (p) {
+ NXPrintf(stream, "\t%f %f %f %f %d %f %f\t%d\n",
+ p->indent1st,
+ p->indent2nd,
+ p->lineHt,
+ p->descentLine,
+ p->alignment,
+ style->spaceBefore,
+ style->spaceAfter,
+ p->numTabs);
+
+ for (tab = 0; tab < p->numTabs; tab++)
+ NXPrintf(stream, "\t%d %f\n",
+ p->tabs[tab].kind,
+ p->tabs[tab].x);
+ }
+ return style;
+}
+
+/* Write a style to stdout for diagnostics
+*/
+HTStyle *HTStyleDump(HTStyle *style)
+{
+ int tab;
+ NXTextStyle *p = style->paragraph;
+
+ printf(STYLE_DUMP_FONT,
+ style,
+ style->name,
+ style->SGMLTag,
+ [style->font name],
+ style->fontSize);
+ if (p) {
+ printf(STYLE_DUMP_IDENT,
+ p->indent1st,
+ p->indent2nd,
+ p->lineHt,
+ p->descentLine);
+ printf(STYLE_DUMP_ALIGN,
+ p->alignment,
+ p->numTabs,
+ style->spaceBefore,
+ style->spaceAfter);
+
+ for (tab = 0; tab < p->numTabs; tab++) {
+ printf(STYLE_DUMP_TAB,
+ p->tabs[tab].kind,
+ p->tabs[tab].x);
+ }
+ printf("\n");
+ } /* if paragraph */
+ return style;
+}
+#endif /* SUPPRESS */
+
+/* StyleSheet Functions
+ * ====================
+ */
+
+/* Searching for styles:
+*/
+HTStyle *HTStyleNamed(HTStyleSheet *self, const char *name)
+{
+ HTStyle *scan;
+
+ for (scan = self->styles; scan; scan = scan->next)
+ if (0 == strcmp(GetHTStyleName(scan), name))
+ return scan;
+ CTRACE((tfp, "StyleSheet: No style named `%s'\n", name));
+ return NULL;
+}
+
+#ifdef NEXT_SUPRESS /* Not in general common code */
+
+HTStyle *HTStyleMatching(HTStyleSheet *self, HTStyle *style)
+{
+ HTStyle *scan;
+
+ for (scan = self->styles; scan; scan = scan->next)
+ if (scan->paragraph == para)
+ return scan;
+ return NULL;
+}
+
+/* Find the style which best fits a given run
+ * ------------------------------------------
+ *
+ * This heuristic is used for guessing the style for a run of
+ * text which has been pasted in. In order, we try:
+ *
+ * A style whose paragraph structure is actually used by the run.
+ * A style matching in font
+ * A style matching in paragraph style exactly
+ * A style matching in paragraph to a degree
+ */
+
+HTStyle *HTStyleForRun(HTStyleSheet *self, NXRun * run)
+{
+ HTStyle *scan;
+ HTStyle *best = 0;
+ int bestMatch = 0;
+ NXTextStyle *rp = run->paraStyle;
+
+ for (scan = self->styles; scan; scan = scan->next)
+ if (scan->paragraph == run->paraStyle)
+ return scan; /* Exact */
+
+ for (scan = self->styles; scan; scan = scan->next) {
+ NXTextStyle *sp = scan->paragraph;
+
+ if (sp) {
+ int match = 0;
+
+ if (sp->indent1st == rp->indent1st)
+ match = match + 1;
+ if (sp->indent2nd == rp->indent2nd)
+ match = match + 2;
+ if (sp->lineHt == rp->lineHt)
+ match = match + 1;
+ if (sp->numTabs == rp->numTabs)
+ match = match + 1;
+ if (sp->alignment == rp->alignment)
+ match = match + 3;
+ if (scan->font == run->font)
+ match = match + 10;
+ if (match > bestMatch) {
+ best = scan;
+ bestMatch = match;
+ }
+ }
+ }
+ CTRACE((tfp, "HTStyleForRun: Best match for style is %d out of 18\n",
+ bestMatch));
+ return best;
+}
+#endif /* NEXT_SUPRESS */
+
+/* Add a style to a sheet
+ * ----------------------
+ */
+HTStyleSheet *HTStyleSheetAddStyle(HTStyleSheet *self, HTStyle *style)
+{
+ style->next = 0; /* The style will go on the end */
+ if (!self->styles) {
+ self->styles = style;
+ } else {
+ HTStyle *scan;
+
+ for (scan = self->styles; scan->next; scan = scan->next) ; /* Find end */
+ scan->next = style;
+ }
+ return self;
+}
+
+/* Remove the given object from a style sheet if it exists
+*/
+HTStyleSheet *HTStyleSheetRemoveStyle(HTStyleSheet *self, HTStyle *style)
+{
+ if (self->styles == style) {
+ self->styles = style->next;
+ return self;
+ } else {
+ HTStyle *scan;
+
+ for (scan = self->styles; scan; scan = scan->next) {
+ if (scan->next == style) {
+ scan->next = style->next;
+ return self;
+ }
+ }
+ }
+ return NULL;
+}
+
+/* Create new style sheet
+*/
+
+HTStyleSheet *HTStyleSheetNew(void)
+{
+ HTStyleSheet *self = typecalloc(HTStyleSheet);
+
+ if (self == NULL)
+ outofmem(__FILE__, "HTStyleSheetNew");
+ return self;
+}
+
+/* Free off a style sheet pointer
+*/
+HTStyleSheet *HTStyleSheetFree(HTStyleSheet *self)
+{
+ HTStyle *style;
+
+ while ((style = self->styles) != 0) {
+ self->styles = style->next;
+ HTStyleFree(style);
+ }
+ FREE(self);
+ return NULL;
+}
+
+/* Read a stylesheet from a typed stream
+ * -------------------------------------
+ *
+ * Reads a style sheet from a stream. If new styles have the same names
+ * as existing styles, they replace the old ones without changing the ids.
+ */
+
+#ifdef NEXT_SUPRESS /* Only on the NeXT */
+HTStyleSheet *HTStyleSheetRead(HTStyleSheet *self, NXStream * stream)
+{
+ int numStyles;
+ int i;
+ HTStyle *style;
+ char styleName[80];
+
+ NXScanf(stream, " %d ", &numStyles);
+ CTRACE((tfp, "Stylesheet: Reading %d styles\n", numStyles));
+ for (i = 0; i < numStyles; i++) {
+ NXScanf(stream, "%s", styleName);
+ style = HTStyleNamed(self, styleName);
+ if (!style) {
+ style = HTStyleNewNamed(styleName);
+ (void) HTStyleSheetAddStyle(self, style);
+ }
+ (void) HTStyleRead(style, stream);
+ if (TRACE)
+ HTStyleDump(style);
+ }
+ return self;
+}
+
+/* Write a stylesheet to a typed stream
+ * ------------------------------------
+ *
+ * Writes a style sheet to a stream.
+ */
+
+HTStyleSheet *HTStyleSheetWrite(HTStyleSheet *self, NXStream * stream)
+{
+ int numStyles = 0;
+ HTStyle *style;
+
+ for (style = self->styles; style; style = style->next)
+ numStyles++;
+ NXPrintf(stream, "%d\n", numStyles);
+
+ CTRACE((tfp, "StyleSheet: Writing %d styles\n", numStyles));
+ for (style = self->styles; style; style = style->next) {
+ NXPrintf(stream, "%s ", style->name);
+ (void) HTStyleWrite(style, stream);
+ }
+ return self;
+}
+#endif /* NEXT_SUPRESS */
diff --git a/WWW/Library/Implementation/HTStyle.h b/WWW/Library/Implementation/HTStyle.h
new file mode 100644
index 0000000..79ba003
--- /dev/null
+++ b/WWW/Library/Implementation/HTStyle.h
@@ -0,0 +1,241 @@
+/*
+ * $LynxId: HTStyle.h,v 1.18 2020/01/21 22:02:35 tom Exp $
+ HTStyle: Style management for libwww
+ STYLE DEFINITION FOR HYPERTEXT
+
+ Styles allow the translation between a logical property of a piece of text
+ and its physical representation.
+
+ A StyleSheet is a collection of styles, defining the translation necessary
+ to represent a document. It is a linked list of styles.
+
+Overriding this module
+
+ Why is the style structure declared in the HTStyle.h module, instead of
+ having the user browser define the structure, and the HTStyle routines just
+ use sizeof() for copying?
+
+ It's not obvious whether HTStyle.c should be common code. It's useful to
+ have common code for loading style sheets, especially if the movement toward
+ standard style sheets gets going.
+
+ If it IS common code, then both the hypertext object and HTStyle.c must know
+ the structure of a style, so HTStyle.h is a suitable place to put that.
+ HTStyle.c has to be compiled with a knowledge of the
+
+ It we take it out of the library, then of course HTStyle could be declared
+ as an undefined structure. The only references to it are in the
+ structure-flattening code HTML.c and HTPlain.c, which only use
+ HTStypeNamed().
+
+ You can in any case override this function in your own code, which will
+ prevent the HTStyle from being loaded. You will be able to redefine your
+ style structure in this case without problems, as no other moule needs to
+ know it.
+
+ */
+#ifndef HTStyle_H
+#define HTStyle_H
+
+#include <HTAnchor.h>
+
+typedef long int HTFont; /* Dummy definition instead */
+
+#ifdef NeXT_suppressed
+#include <appkit/appkit.h>
+typedef NXCoord HTCoord;
+
+#define HTParagraphStyle NXTextStyle
+#define HTCoord NXCoord
+typedef struct _color {
+ float grey;
+ int RGBColor;
+} HTColor;
+
+#else
+
+typedef int HTCoord; /* changed from float to int - kw */
+
+typedef struct _HTParagraphStyle {
+ HTCoord left_indent; /* @@@@ junk! etc etc */
+} HTParagraphStyle;
+
+typedef int HTColor; /* Sorry about the US spelling! */
+
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define STYLE_NAME_LENGTH 80 /* @@@@@@@@@@@ */
+ typedef struct {
+ short kind; /* only NX_LEFTTAB implemented */
+ HTCoord position; /* x coordinate for stop */
+ } HTTabStop;
+
+/* The Style Structure
+ * -------------------
+ */
+
+ typedef struct _HTStyle {
+
+/* Style management information
+*/
+ struct _HTStyle *next; /* Link for putting into stylesheet */
+ char *w_name; /* Style name */
+ const char *c_name; /* Style name */
+ int id; /* equivalent of name, for speed */
+ char *w_SGMLTag; /* Tag name to start */
+ const char *c_SGMLTag; /* Tag name to start */
+
+/* Character attributes (a la NXRun)
+*/
+ HTFont font; /* Font id */
+ HTCoord fontSize; /* The size of font, not independent */
+ HTColor color; /* text gray of current run */
+ int superscript; /* superscript (-sub) in points */
+
+ HTAnchor *anchor; /* Anchor id if any, else zero */
+
+/* Paragraph Attributes (a la NXTextStyle)
+*/
+ HTCoord indent1st; /* how far first line in paragraph is
+ * indented */
+ HTCoord leftIndent; /* how far second line is indented */
+ HTCoord rightIndent; /* (Missing from NeXT version */
+ short alignment; /* quad justification */
+ HTCoord lineHt; /* line height */
+ HTCoord descentLine; /* descender bottom from baseline */
+ const HTTabStop *tabs; /* array of tab stops, 0 terminated */
+
+ BOOL wordWrap; /* Yes means wrap at space not char */
+ BOOL freeFormat; /* Yes means \n is just white space */
+ HTCoord spaceBefore; /* Omissions from NXTextStyle */
+ HTCoord spaceAfter;
+ int paraFlags; /* Paragraph flags, bits as follows: */
+
+#define PARA_KEEP 1 /* Do not break page within this paragraph */
+#define PARA_WITH_NEXT 2 /* Do not break page after this paragraph */
+
+#define HT_JUSTIFY 0 /* For alignment */
+#define HT_LEFT 1
+#define HT_RIGHT 2
+#define HT_CENTER 3
+
+ } HTStyle;
+
+#define GetHTStyleName(p) ((p)->w_name ? (p)->w_name : (p)->c_name)
+#define GetHTStyleSGML(p) ((p)->w_SGMLTag ? (p)->w_SGMLTag : (p)->c_SGMLTag)
+
+#define HTStyleInit( \
+ next, name, SGML_tag, \
+ font, fontsize, color, superscript, \
+ anchor, indent1st, leftIndent, rightIndent, \
+ alignment, lineHt, descentLine, \
+ tabs, wordWrap, freeFormat, spaceBefore, spaceAfter, paraFlags) \
+ { \
+ next, NULL, #name, ST_##name, NULL, SGML_tag, \
+ font, fontsize, color, superscript, \
+ anchor, indent1st, leftIndent, rightIndent, \
+ alignment, lineHt, descentLine, \
+ tabs, wordWrap, freeFormat, spaceBefore, spaceAfter, paraFlags }
+
+#define HT_ALIGN_NONE (-1)
+
+/* Style functions:
+*/
+ extern HTStyle *HTStyleNew(void);
+ extern HTStyle *HTStyleNewNamed(const char *name);
+ extern HTStyle *HTStyleFree(HTStyle *self);
+
+#ifdef SUPRESS
+ extern HTStyle *HTStyleRead(HTStyle *self, HTStream *stream);
+ extern HTStyle *HTStyleWrite(HTStyle *self, HTStream *stream);
+#endif
+/* Style Sheet
+ * -----------
+ */
+ typedef struct _HTStyleSheet {
+ const char *name;
+ HTStyle *styles;
+ } HTStyleSheet;
+
+/* Stylesheet functions:
+*/
+ extern HTStyleSheet *HTStyleSheetNew(void);
+ extern HTStyleSheet *HTStyleSheetFree(HTStyleSheet *self);
+ extern HTStyle *HTStyleNamed(HTStyleSheet *self, const char *name);
+ extern HTStyle *HTStyleForParagraph(HTStyleSheet *self, HTParagraphStyle * paraStyle);
+ extern HTStyle *HTStyleMatching(HTStyleSheet *self, HTStyle *style);
+
+/* extern HTStyle * HTStyleForRun (HTStyleSheet *self, NXRun * run); */
+ extern HTStyleSheet *HTStyleSheetAddStyle(HTStyleSheet *self, HTStyle *style);
+ extern HTStyleSheet *HTStyleSheetRemoveStyle(HTStyleSheet *self, HTStyle *style);
+
+#ifdef SUPPRESS
+ extern HTStyleSheet *HTStyleSheetRead(HTStyleSheet *self, HTStream *stream);
+ extern HTStyleSheet *HTStyleSheetWrite(HTStyleSheet *self, HTStream *stream);
+#endif
+#define CLEAR_POINTER ((void *)-1) /* Pointer value means "clear me" */
+
+/* DefaultStyle.c */
+ extern HTStyleSheet *DefaultStyle(HTStyle ***result_array);
+
+/* enum, use this instead of HTStyle name comparisons */
+ enum HTStyle_Enum {
+ ST_Normal = 0,
+ ST_DivCenter,
+ ST_DivLeft,
+ ST_DivRight,
+ ST_Banner,
+ ST_Blockquote,
+ ST_Bq,
+ ST_Footnote,
+ ST_List,
+ ST_List1,
+ ST_List2,
+ ST_List3,
+ ST_List4,
+ ST_List5,
+ ST_List6,
+ ST_Menu,
+ ST_Menu1,
+ ST_Menu2,
+ ST_Menu3,
+ ST_Menu4,
+ ST_Menu5,
+ ST_Menu6,
+ ST_Glossary,
+ ST_Glossary1,
+ ST_Glossary2,
+ ST_Glossary3,
+ ST_Glossary4,
+ ST_Glossary5,
+ ST_Glossary6,
+ ST_GlossaryCompact,
+ ST_GlossaryCompact1,
+ ST_GlossaryCompact2,
+ ST_GlossaryCompact3,
+ ST_GlossaryCompact4,
+ ST_GlossaryCompact5,
+ ST_GlossaryCompact6,
+ ST_Example,
+ ST_Preformatted,
+ ST_Listing,
+ ST_Address,
+ ST_Note,
+ ST_Heading1,
+ ST_Heading2,
+ ST_Heading3,
+ ST_Heading4,
+ ST_Heading5,
+ ST_Heading6,
+ ST_HeadingCenter,
+ ST_HeadingLeft,
+ ST_HeadingRight
+ };
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* HTStyle_H */
diff --git a/WWW/Library/Implementation/HTTCP.c b/WWW/Library/Implementation/HTTCP.c
new file mode 100644
index 0000000..a3bfda6
--- /dev/null
+++ b/WWW/Library/Implementation/HTTCP.c
@@ -0,0 +1,2623 @@
+/*
+ * $LynxId: HTTCP.c,v 1.163 2022/04/01 23:18:35 Rajeev.V.Pillai Exp $
+ *
+ * Generic Communication Code HTTCP.c
+ * ==========================
+ *
+ * This code is in common between client and server sides.
+ *
+ * 16 Jan 92 TBL Fix strtol() undefined on CMU Mach.
+ * 25 Jun 92 JFG Added DECNET option through TCP socket emulation.
+ * 13 Sep 93 MD Added correct return of vmserrorno for HTInetStatus.
+ * Added decoding of vms error message for MULTINET.
+ * 7-DEC-1993 Bjorn S. Nilsson, ALEPH, CERN, VMS UCX ioctl() changes
+ * (done of Mosaic)
+ * 19 Feb 94 Danny Mayer Added Bjorn Fixes to Lynx version
+ * 7 Mar 94 Danny Mayer Added Fix UCX version for full domain name
+ * 20 May 94 Andy Harper Added support for CMU TCP/IP transport
+ * 17 Nov 94 Andy Harper Added support for SOCKETSHR transport
+ * 16 Jul 95 S. Bjorndahl added kluge to deal with LIBCMU bug
+ */
+
+#define LYNX_ADDRINFO struct addrinfo
+#define LYNX_HOSTENT struct hostent
+
+#include <HTUtils.h>
+#include <HTParse.h>
+#include <HTAlert.h>
+#include <HTTCP.h>
+#include <LYGlobalDefs.h> /* added for no_suspend */
+#include <LYUtils.h>
+
+#ifdef NSL_FORK
+#include <signal.h>
+#include <www_wait.h>
+#define FREE_NSL_FORK(p) { FREE(p); }
+#elif defined(_WINDOWS_NSL)
+#define FREE_NSL_FORK(p) if ((p) == gbl_phost) { FREE(p); }
+#else
+#define FREE_NSL_FORK(p) /* nothing */
+#endif /* NSL_FORK */
+
+#ifdef HAVE_RESOLV_H
+#include <resolv.h>
+#endif
+
+#ifdef __DJGPP__
+#include <netdb.h>
+#endif /* __DJGPP__ */
+
+#define OK_HOST(p) ((p) != 0 && ((p)->h_length) != 0)
+
+#ifdef SVR4_BSDSELECT
+int BSDselect(int nfds,
+ fd_set * readfds,
+ fd_set * writefds,
+ fd_set * exceptfds,
+ struct timeval *select_timeout);
+
+#ifdef select
+#undef select
+#endif /* select */
+#define select BSDselect
+#ifdef SOCKS
+#ifdef Rselect
+#undef Rselect
+#endif /* Rselect */
+#define Rselect BSDselect
+#endif /* SOCKS */
+#endif /* SVR4_BSDSELECT */
+
+#include <LYLeaks.h>
+
+/*
+ * Module-Wide variables
+ */
+static char *hostname = NULL; /* The name of this host */
+
+/*
+ * PUBLIC VARIABLES
+ */
+#ifdef SOCKS
+unsigned long socks_bind_remoteAddr; /* for long Rbind */
+#endif /* SOCKS */
+
+/* Encode INET status (as in sys/errno.h) inet_status()
+ * ------------------
+ *
+ * On entry,
+ * where gives a description of what caused the error
+ * global errno gives the error number in the Unix way.
+ *
+ * On return,
+ * returns a negative status in the Unix way.
+ */
+
+#ifdef DECL_SYS_ERRLIST
+extern char *sys_errlist[]; /* see man perror on cernvax */
+extern int sys_nerr;
+#endif /* DECL_SYS_ERRLIST */
+
+#ifdef __DJGPP__
+static int ResolveYield(void)
+{
+ return HTCheckForInterrupt()? 0 : 1;
+}
+#endif
+
+#if defined(VMS) && defined(UCX)
+/*
+ * A routine to mimic the ioctl function for UCX.
+ * Bjorn S. Nilsson, 25-Nov-1993. Based on an example in the UCX manual.
+ */
+#include <HTioctl.h>
+
+int HTioctl(int d,
+ int request,
+ int *argp)
+{
+ int sdc, status;
+ unsigned short fun, iosb[4];
+ char *p5, *p6;
+ struct comm {
+ int command;
+ char *addr;
+ } ioctl_comm;
+ struct it2 {
+ unsigned short len;
+ unsigned short opt;
+ struct comm *addr;
+ } ioctl_desc;
+
+ if ((sdc = vaxc$get_sdc(d)) == 0) {
+ set_errno(EBADF);
+ return -1;
+ }
+ ioctl_desc.opt = UCX$C_IOCTL;
+ ioctl_desc.len = sizeof(struct comm);
+
+ ioctl_desc.addr = &ioctl_comm;
+ if (request & IOC_OUT) {
+ fun = IO$_SENSEMODE;
+ p5 = 0;
+ p6 = (char *) &ioctl_desc;
+ } else {
+ fun = IO$_SETMODE;
+ p5 = (char *) &ioctl_desc;
+ p6 = 0;
+ }
+ ioctl_comm.command = request;
+ ioctl_comm.addr = (char *) argp;
+ status = sys$qiow(0, sdc, fun, iosb, 0, 0, 0, 0, 0, 0, p5, p6);
+ if (!(status & 01)) {
+ set_errno(status);
+ return -1;
+ }
+ if (!(iosb[0] & 01)) {
+ set_errno(iosb[0]);
+ return -1;
+ }
+ return 0;
+}
+#endif /* VMS && UCX */
+
+#define MY_FORMAT "TCP: Error %d in `SOCKET_ERRNO' after call to %s() failed.\n\t%s\n"
+ /* third arg is transport/platform specific */
+
+/* Report Internet Error
+ * ---------------------
+ */
+int HTInetStatus(const char *where)
+{
+ int status;
+ int saved_errno = errno;
+
+#ifdef VMS
+#ifdef MULTINET
+ SOCKET_ERRNO = vmserrno;
+#endif /* MULTINET */
+#endif /* VMS */
+
+#ifdef VM
+ CTRACE((tfp, MY_FORMAT, SOCKET_ERRNO, where,
+ "(Error number not translated)")); /* What Is the VM equiv? */
+#define ER_NO_TRANS_DONE
+#endif /* VM */
+
+#ifdef VMS
+#ifdef MULTINET
+ CTRACE((tfp, MY_FORMAT, SOCKET_ERRNO, where,
+ vms_errno_string()));
+#else
+ CTRACE((tfp, MY_FORMAT, SOCKET_ERRNO, where,
+ ((SOCKET_ERRNO > 0 && SOCKET_ERRNO <= 65) ?
+ strerror(SOCKET_ERRNO) : "(Error number not translated)")));
+#endif /* MULTINET */
+#define ER_NO_TRANS_DONE
+#endif /* VMS */
+
+#ifdef HAVE_STRERROR
+ CTRACE((tfp, MY_FORMAT, SOCKET_ERRNO, where,
+ strerror(SOCKET_ERRNO)));
+#define ER_NO_TRANS_DONE
+#endif /* HAVE_STRERROR */
+
+#ifndef ER_NO_TRANS_DONE
+ CTRACE((tfp, MY_FORMAT, SOCKET_ERRNO, where,
+ (SOCKET_ERRNO < sys_nerr ?
+ sys_errlist[SOCKET_ERRNO] : "Unknown error")));
+#endif /* !ER_NO_TRANS_DONE */
+
+#ifdef VMS
+#ifndef MULTINET
+ CTRACE((tfp,
+ " Unix error number (SOCKET_ERRNO) = %ld dec\n",
+ SOCKET_ERRNO));
+ CTRACE((tfp,
+ " VMS error (vaxc$errno) = %lx hex\n",
+ vaxc$errno));
+#endif /* MULTINET */
+#endif /* VMS */
+
+ set_errno(saved_errno);
+
+#ifdef VMS
+ /*
+ * uerrno and errno happen to be zero if vmserrno <> 0
+ */
+#ifdef MULTINET
+ status = -vmserrno;
+#else
+ status = -vaxc$errno;
+#endif /* MULTINET */
+#else
+ status = -SOCKET_ERRNO;
+#endif /* VMS */
+ return status;
+}
+
+/* Parse a cardinal value parse_cardinal()
+ * ----------------------
+ *
+ * On entry,
+ * *pp points to first character to be interpreted, terminated by
+ * non 0:9 character.
+ * *pstatus points to status already valid
+ * maxvalue gives the largest allowable value.
+ *
+ * On exit,
+ * *pp points to first unread character
+ * *pstatus points to status updated iff bad
+ */
+unsigned int HTCardinal(int *pstatus,
+ char **pp,
+ unsigned int max_value)
+{
+ unsigned int n;
+
+ if ((**pp < '0') || (**pp > '9')) { /* Null string is error */
+ *pstatus = -3; /* No number where one expected */
+ return 0;
+ }
+
+ n = 0;
+ while ((**pp >= '0') && (**pp <= '9'))
+ n = n * 10 + (unsigned) (*((*pp)++) - '0');
+
+ if (n > max_value) {
+ *pstatus = -4; /* Cardinal outside range */
+ return 0;
+ }
+
+ return n;
+}
+
+#ifndef DECNET /* Function only used below for a trace message */
+/* Produce a string for an Internet address
+ * ----------------------------------------
+ *
+ * On exit,
+ * returns a pointer to a static string which must be copied if
+ * it is to be kept.
+ */
+const char *HTInetString(LY_SOCKADDR * soc_A)
+{
+#ifdef INET6
+ static char hostbuf[MAXHOSTNAMELEN];
+ struct sockaddr *soc_addr = &(soc_A->soc_address);
+
+ getnameinfo(soc_addr,
+ SA_LEN(soc_addr),
+ hostbuf, (socklen_t) sizeof(hostbuf),
+ NULL, 0,
+ NI_NUMERICHOST);
+ return hostbuf;
+#else
+ struct sockaddr_in *soc_in = &(soc_A->soc_in);
+ static char string[20];
+
+ sprintf(string, "%d.%d.%d.%d",
+ (int) *((unsigned char *) (&soc_in->sin_addr) + 0),
+ (int) *((unsigned char *) (&soc_in->sin_addr) + 1),
+ (int) *((unsigned char *) (&soc_in->sin_addr) + 2),
+ (int) *((unsigned char *) (&soc_in->sin_addr) + 3));
+ return string;
+#endif /* INET6 */
+}
+#endif /* !DECNET */
+
+/* Check whether string is a valid Internet hostname - kw
+ * -------------------------------------------------
+ *
+ * Checks whether
+ * - contains only valid chars for domain names (actually, the
+ * restrictions are somewhat relaxed),
+ * - no leading dots or empty segments,
+ * - no segment starts with '-' or '+' [this protects telnet command],
+ * - max. length of dot-separated segment <= 63 (RFC 1034,1035),
+ * - total length <= 254 (if it ends with dot) or 253 (otherwise)
+ * [an interpretation of RFC 1034,1035, although RFC 1123
+ * suggests 255 as limit - kw].
+ *
+ * Note: user (before '@') and port (after ':') components from
+ * host part of URL should be already stripped (if appropriate)
+ * from the input string.
+ *
+ * On exit,
+ * returns 1 if valid, otherwise 0.
+ */
+BOOL valid_hostname(char *name)
+{
+ int i = 1, iseg = 0;
+ char *cp = name;
+
+ if (!(name && *name))
+ return NO;
+ for (; (*cp && i <= 253); cp++, i++) {
+ if (*cp == '.') {
+ if (iseg == 0) {
+ return NO;
+ } else {
+ iseg = 0;
+ continue;
+ }
+ } else if (iseg == 0 && (*cp == '-' || *cp == '+')) {
+ return NO;
+ } else if (++iseg > 63) {
+ return NO;
+ }
+ if (!isalnum(UCH(*cp)) &&
+ *cp != '-' && *cp != '_' &&
+ *cp != '$' && *cp != '+') {
+ return NO;
+ }
+ }
+ return (BOOL) (*cp == '\0' || (*cp == '.' && iseg != 0 && cp[1] == '\0'));
+}
+
+/* for transfer of status from child to parent: */
+typedef struct _statuses {
+ size_t rehostentlen;
+ int h_length;
+ int child_errno; /* sometimes useful to pass this on */
+ int child_h_errno;
+ BOOL h_errno_valid;
+} STATUSES;
+
+/*
+ * Function to allow us to be killed with a normal signal (not
+ * SIGKILL), but don't go through normal libc exit() processing, which
+ * would screw up parent's stdio. -BL
+ */
+#ifdef NSL_FORK
+static void quench(int sig GCC_UNUSED)
+{
+ _exit(2);
+}
+#endif
+
+int lynx_nsl_status = HT_OK;
+
+#define DEBUG_HOSTENT /* disable in case of problems */
+#define DEBUG_HOSTENT_CHILD /* for NSL_FORK, may screw up trace file */
+
+/*
+ * dump_hostent - dumps the contents of a LYNX_HOSTENT to the
+ * trace log or stderr, including all pointer values, strings, and
+ * addresses, in a format inspired by gdb's print format. - kw
+ */
+static void dump_hostent(const char *msgprefix,
+ const void *data)
+{
+ if (TRACE) {
+ int i;
+ char **pcnt;
+ const LYNX_HOSTENT *phost = data;
+
+ CTRACE((tfp, "%s: %p ", msgprefix, (const void *) phost));
+ if (phost) {
+ CTRACE((tfp, "{ h_name = %p", (void *) phost->h_name));
+ if (phost->h_name) {
+ CTRACE((tfp, " \"%s\",", phost->h_name));
+ } else {
+ CTRACE((tfp, ","));
+ }
+ CTRACE((tfp, "\n\t h_aliases = %p", (void *) phost->h_aliases));
+ if (phost->h_aliases) {
+ CTRACE((tfp, " {"));
+ for (pcnt = phost->h_aliases; *pcnt; pcnt++) {
+ CTRACE((tfp, "%s %p \"%s\"",
+ (pcnt == phost->h_aliases ? " " : ", "),
+ (void *) *pcnt, *pcnt));
+ }
+ CTRACE((tfp, "%s0x0 },\n\t",
+ (*phost->h_aliases ? ", " : " ")));
+ } else {
+ CTRACE((tfp, ",\n\t"));
+ }
+ CTRACE((tfp, " h_addrtype = %d,", phost->h_addrtype));
+ CTRACE((tfp, " h_length = %d,\n\t", phost->h_length));
+ CTRACE((tfp, " h_addr_list = %p", (void *) phost->h_addr_list));
+ if (phost->h_addr_list) {
+ CTRACE((tfp, " {"));
+ for (pcnt = phost->h_addr_list; *pcnt; pcnt++) {
+ CTRACE((tfp, "%s %p",
+ (pcnt == phost->h_addr_list ? "" : ","),
+ (void *) *pcnt));
+ for (i = 0; i < phost->h_length; i++) {
+ CTRACE((tfp, "%s%d%s", (i == 0 ? " \"" : "."),
+ (int) *((unsigned char *) (*pcnt) + i),
+ (i + 1 == phost->h_length ? "\"" : "")));
+ }
+ }
+ if (*phost->h_addr_list) {
+ CTRACE((tfp, ", 0x0 } }"));
+ } else {
+ CTRACE((tfp, " 0x0 } }"));
+ }
+ } else {
+ CTRACE((tfp, "}"));
+ }
+ }
+ CTRACE((tfp, "\n"));
+ fflush(tfp);
+ }
+}
+
+#ifdef NSL_FORK
+
+/*
+ * Even though it is a small amount, we cannot count on reading the whole
+ * struct via a pipe in one read -TD
+ */
+static unsigned read_bytes(int fd, char *buffer, size_t length)
+{
+ unsigned result = 0;
+
+ while (length != 0) {
+ unsigned got = (unsigned) read(fd, buffer, length);
+
+ if ((int) got > 0) {
+ result += got;
+ buffer += got;
+ length -= got;
+ } else {
+ break;
+ }
+ }
+ return result;
+}
+
+static unsigned read_hostent(int fd, char *buffer, size_t length)
+{
+ unsigned have = read_bytes(fd, buffer, length);
+
+ if (have) {
+ LYNX_HOSTENT *data = (LYNX_HOSTENT *) (void *) buffer;
+ char *next_char = (char *) data + sizeof(*data);
+ char **next_ptr = (char **) (void *) next_char;
+ long offset = 0;
+ int n;
+ int num_addrs = 0;
+ int num_aliases = 0;
+
+ if (data->h_addr_list) {
+ data->h_addr_list = next_ptr;
+ while (next_ptr[num_addrs] != 0) {
+ ++num_addrs;
+ }
+ next_ptr += (num_addrs + 1);
+ next_char += (size_t) (num_addrs + 1) * sizeof(data->h_addr_list[0]);
+ }
+
+ if (data->h_aliases) {
+ data->h_aliases = next_ptr;
+ while (next_ptr[num_aliases] != 0) {
+ ++num_aliases;
+ }
+ next_char += (size_t) (num_aliases + 1) * sizeof(data->h_aliases[0]);
+ }
+
+ if (data->h_name) {
+ offset = next_char - data->h_name;
+ data->h_name = next_char;
+ } else if (data->h_addr_list) {
+ offset = next_char - (char *) data->h_addr_list[0];
+ } else if (data->h_aliases) {
+ offset = next_char - (char *) data->h_aliases[0];
+ }
+
+ if (data->h_addr_list) {
+ for (n = 0; n < num_addrs; ++n) {
+ data->h_addr_list[n] += offset;
+ }
+ }
+
+ if (data->h_aliases) {
+ for (n = 0; n < num_aliases; ++n) {
+ data->h_aliases[n] += offset;
+ }
+ }
+ }
+
+ return have;
+}
+#endif /* NSL_FORK */
+
+/*
+ * fill_rehostent - copies as much as possible relevant content from
+ * the LYNX_HOSTENT pointed to by phost to the char buffer given
+ * by rehostent, subject to maximum output length rehostentsize,
+ * following pointers and building self-contained output which can be
+ * cast to a LYNX_HOSTENT. - kw
+ * See also description of LYGetHostByName.
+ */
+#if defined(NSL_FORK) || defined(_WINDOWS_NSL)
+
+#define REHOSTENT_SIZE 128 /* not bigger than pipe buffer! */
+
+typedef struct {
+ LYNX_HOSTENT h;
+ char rest[REHOSTENT_SIZE];
+} AlignedHOSTENT;
+
+static size_t fill_rehostent(void **rehostent,
+ const LYNX_HOSTENT *phost)
+{
+ static const char *this_func = "fill_rehostent";
+
+ LYNX_HOSTENT *data = 0;
+ int num_addrs = 0;
+ int num_aliases = 0;
+ char *result = 0;
+ char *p_next_char;
+ char **p_next_charptr;
+ size_t name_len = 0;
+ size_t need = sizeof(LYNX_HOSTENT);
+ int n;
+
+ if (!phost)
+ return 0;
+
+ if (phost->h_name) {
+ name_len = strlen(phost->h_name);
+ need += name_len + 1;
+ }
+ if (phost->h_addr_list) {
+ while (phost->h_addr_list[num_addrs]) {
+ num_addrs++;
+ }
+ need += ((size_t) num_addrs + 1) * ((size_t) phost->h_length
+ + sizeof(phost->h_addr_list[0]));
+ }
+ if (phost->h_aliases) {
+ while (phost->h_aliases[num_aliases]) {
+ need += strlen(phost->h_aliases[num_aliases]) + 1;
+ num_aliases++;
+ }
+ need += ((size_t) num_aliases + 1) * sizeof(phost->h_aliases[0]);
+ }
+
+ if ((result = calloc(need, sizeof(char))) == 0)
+ outofmem(__FILE__, this_func);
+
+ *rehostent = result;
+
+ data = (LYNX_HOSTENT *) (void *) result;
+
+ data->h_addrtype = phost->h_addrtype;
+ data->h_length = phost->h_length;
+
+ p_next_char = result + sizeof(LYNX_HOSTENT);
+
+ p_next_charptr = (char **) (void *) p_next_char;
+ if (phost->h_addr_list)
+ p_next_char += (size_t) (num_addrs + 1) * sizeof(phost->h_addr_list[0]);
+ if (phost->h_aliases)
+ p_next_char += (size_t) (num_aliases + 1) * sizeof(phost->h_aliases[0]);
+
+ if (phost->h_name) {
+ data->h_name = p_next_char;
+ strcpy(p_next_char, phost->h_name);
+ p_next_char += name_len + 1;
+ }
+
+ if (phost->h_addr_list) {
+ data->h_addr_list = p_next_charptr;
+ for (n = 0; n < num_addrs; ++n) {
+ MemCpy(p_next_char, phost->h_addr_list[n], phost->h_length);
+ *p_next_charptr++ = p_next_char;
+ p_next_char += phost->h_length;
+ }
+ ++p_next_charptr;
+ }
+
+ if (phost->h_aliases) {
+ data->h_aliases = p_next_charptr;
+ for (n = 0; n < num_aliases; ++n) {
+ strcpy(p_next_char, phost->h_aliases[n]);
+ *p_next_charptr++ = p_next_char;
+ p_next_char += strlen(phost->h_aliases[n]) + 1;;
+ }
+ }
+ return need;
+}
+#endif /* NSL_FORK */
+
+/*
+ * This chunk of code is used in both win32 and cygwin.
+ */
+#if defined(_WINDOWS_NSL)
+static LYNX_HOSTENT *gbl_phost; /* Pointer to host - See netdb.h */
+
+#if !(defined(__CYGWIN__) && defined(NSL_FORK))
+static int donelookup;
+
+static unsigned long __stdcall _fork_func(void *arg)
+{
+ const char *host = (const char *) arg;
+ static AlignedHOSTENT aligned_full_rehostent;
+ char *rehostent = (char *) &aligned_full_rehostent;
+ size_t rehostentlen = 0;
+
+#ifdef SH_EX
+ unsigned long addr;
+
+ addr = (unsigned long) inet_addr(host);
+ if (addr != INADDR_NONE)
+ gbl_phost = gethostbyaddr((char *) &addr, sizeof(addr), AF_INET);
+ else
+ gbl_phost = gethostbyname(host);
+#else
+ gbl_phost = gethostbyname(host);
+#endif
+
+ if (gbl_phost) {
+ rehostentlen = fill_rehostent((void **) &rehostent, gbl_phost);
+ if (rehostentlen == 0) {
+ gbl_phost = (LYNX_HOSTENT *) NULL;
+ } else {
+ gbl_phost = (LYNX_HOSTENT *) rehostent;
+ }
+ }
+
+ donelookup = TRUE;
+ return (unsigned long) (gbl_phost);
+}
+#endif /* __CYGWIN__ */
+#endif /* _WINDOWS_NSL */
+
+#ifdef NSL_FORK
+
+#ifndef HAVE_H_ERRNO
+#undef h_errno
+#define h_errno my_errno
+static int my_errno;
+
+#else /* we do HAVE_H_ERRNO: */
+#ifndef h_errno /* there may be a macro as well as the extern data */
+extern int h_errno;
+#endif
+#endif
+
+static BOOL setup_nsl_fork(void (*really) (const char *,
+ const char *,
+ STATUSES *,
+ void **),
+ unsigned (*readit) (int, char *, size_t),
+ void (*dumpit) (const char *, const void *),
+ const char *host,
+ const char *port,
+ void **rehostent)
+{
+ static const char *this_func = "setup_nsl_fork";
+
+ STATUSES statuses;
+
+ /*
+ * fork-based gethostbyname() with checks for interrupts.
+ * - Tom Zerucha (tz@execpc.com) & FM
+ */
+ int got_rehostent = 0;
+
+#if HAVE_SIGACTION
+ sigset_t old_sigset;
+ sigset_t new_sigset;
+#endif
+ /*
+ * Pipe, child pid, status buffers, start time, select() control
+ * variables.
+ */
+ int fpid, waitret;
+ int pfd[2], selret;
+ unsigned readret;
+
+#ifdef HAVE_TYPE_UNIONWAIT
+ union wait waitstat;
+
+#else
+ int waitstat = 0;
+#endif
+ time_t start_time = time((time_t *) 0);
+ fd_set readfds;
+ struct timeval one_second;
+ long dns_patience = 30; /* how many seconds will we wait for DNS? */
+ int child_exited = 0;
+
+ memset(&statuses, 0, sizeof(STATUSES));
+ statuses.h_errno_valid = NO;
+
+ /*
+ * Reap any children that have terminated since last time through.
+ * This might include children that we killed, then waited with WNOHANG
+ * before they were actually ready to be reaped. (Should be max of 1
+ * in this state, but the loop is safe if waitpid() is implemented
+ * correctly: returns 0 when children exist but none have exited; -1
+ * with errno == ECHILD when no children.) -BL
+ */
+ do {
+ waitret = waitpid(-1, 0, WNOHANG);
+ } while (waitret > 0 || (waitret == -1 && errno == EINTR));
+ waitret = 0;
+
+ IGNORE_RC(pipe(pfd));
+
+#if HAVE_SIGACTION
+ /*
+ * Attempt to prevent a rare situation where the child could execute
+ * the Lynx signal handlers because it gets killed before it even has a
+ * chance to reset its handlers, resulting in bogus 'Exiting via
+ * interrupt' message and screen corruption or worse.
+ * Should that continue to be reported, for systems without
+ * sigprocmask(), we need to find a different solutions for those. -
+ * kw 19990430
+ */
+ sigemptyset(&new_sigset);
+ sigaddset(&new_sigset, SIGTERM);
+ sigaddset(&new_sigset, SIGINT);
+#ifndef NOSIGHUP
+ sigaddset(&new_sigset, SIGHUP);
+#endif /* NOSIGHUP */
+#ifdef SIGTSTP
+ sigaddset(&new_sigset, SIGTSTP);
+#endif /* SIGTSTP */
+#ifdef SIGWINCH
+ sigaddset(&new_sigset, SIGWINCH);
+#endif /* SIGWINCH */
+ sigprocmask(SIG_BLOCK, &new_sigset, &old_sigset);
+#endif /* HAVE_SIGACTION */
+
+ if ((fpid = fork()) == 0) {
+ /*
+ * Child - for the long call.
+ *
+ * Make sure parent can kill us at will. -BL
+ */
+ (void) signal(SIGTERM, quench);
+
+ /*
+ * Also make sure the child does not run one of the signal handlers
+ * that may have been installed by Lynx if one of those signals
+ * occurs. For example we don't want the child to remove temp
+ * files on ^C, let the parent deal with that. - kw
+ */
+ (void) signal(SIGINT, quench);
+#ifndef NOSIGHUP
+ (void) signal(SIGHUP, quench);
+#endif /* NOSIGHUP */
+#ifdef SIGTSTP
+ if (no_suspend)
+ (void) signal(SIGTSTP, SIG_IGN);
+ else
+ (void) signal(SIGTSTP, SIG_DFL);
+#endif /* SIGTSTP */
+#ifdef SIGWINCH
+ (void) signal(SIGWINCH, SIG_IGN);
+#endif /* SIGWINCH */
+#ifndef __linux__
+#ifndef DOSPATH
+ signal(SIGBUS, SIG_DFL);
+#endif /* DOSPATH */
+#endif /* !__linux__ */
+ signal(SIGSEGV, SIG_DFL);
+ signal(SIGILL, SIG_DFL);
+
+#if HAVE_SIGACTION
+ /* Restore signal mask to whatever it was before the fork. -kw */
+ sigprocmask(SIG_SETMASK, &old_sigset, NULL);
+#endif /* HAVE_SIGACTION */
+
+ /*
+ * Child won't use read side. -BL
+ */
+ close(pfd[0]);
+#ifdef HAVE_H_ERRNO
+ /* to detect cases when it doesn't get set although it should */
+ h_errno = -2;
+#endif
+ set_errno(0);
+ really(host, port, &statuses, rehostent);
+ /*
+ * Send variables indicating status of lookup to parent. That
+ * includes rehostentlen, which the parent will use as the size for
+ * the second read (if > 0).
+ */
+ if (!statuses.child_errno)
+ statuses.child_errno = errno;
+ IGNORE_RC(write(pfd[1], &statuses, sizeof(statuses)));
+
+ if (statuses.rehostentlen) {
+ /*
+ * Return our resulting rehostent through pipe...
+ */
+ IGNORE_RC(write(pfd[1], *rehostent, statuses.rehostentlen));
+ close(pfd[1]);
+ _exit(0);
+ } else {
+ /*
+ * ... or return error as exit code.
+ */
+ _exit(1);
+ }
+ }
+#if HAVE_SIGACTION
+ /*
+ * (parent) Restore signal mask to whatever it was before the fork. -
+ * kw
+ */
+ sigprocmask(SIG_SETMASK, &old_sigset, NULL);
+#endif /* HAVE_SIGACTION */
+
+ /*
+ * (parent) Wait until lookup finishes, or interrupt, or cycled too
+ * many times (just in case) -BL
+ */
+
+ close(pfd[1]); /* parent won't use write side -BL */
+
+ if (fpid < 0) { /* fork failed */
+ close(pfd[0]);
+ goto failed;
+ }
+
+ while (child_exited || (long) (time((time_t *) 0) - start_time) < dns_patience) {
+
+ FD_ZERO(&readfds);
+ /*
+ * This allows us to abort immediately, not after 1-second timeout,
+ * when user hits abort key. Can't do this when using SLANG (or at
+ * least I don't know how), so SLANG users must live with up-to-1s
+ * timeout. -BL
+ *
+ * Whoops -- we need to make sure stdin is actually selectable!
+ * /dev/null isn't, on some systems, which makes some useful Lynx
+ * invocations fail. -BL
+ */
+ {
+ int kbd_fd = LYConsoleInputFD(TRUE);
+
+ if (kbd_fd != INVSOC) {
+ FD_SET(kbd_fd, &readfds);
+ }
+ }
+
+ one_second.tv_sec = 1;
+ one_second.tv_usec = 0;
+ FD_SET(pfd[0], &readfds);
+
+ /*
+ * Return when data received, interrupted, or failed. If nothing
+ * is waiting, we sleep for 1 second in select(), to be nice to the
+ * system. -BL
+ */
+#ifdef SOCKS
+ if (socks_flag)
+ selret = Rselect(pfd[0] + 1, &readfds, NULL, NULL, &one_second);
+ else
+#endif /* SOCKS */
+ selret = select(pfd[0] + 1, &readfds, NULL, NULL, &one_second);
+
+ if ((selret > 0) && FD_ISSET(pfd[0], &readfds)) {
+ /*
+ * First get status, including length of address. -BL, kw
+ */
+ readret = read_bytes(pfd[0], (char *) &statuses, sizeof(statuses));
+ if (readret == sizeof(statuses)) {
+ h_errno = statuses.child_h_errno;
+ set_errno(statuses.child_errno);
+#ifdef HAVE_H_ERRNO
+ if (statuses.h_errno_valid) {
+ lynx_nsl_status = HT_H_ERRNO_VALID;
+ /*
+ * If something went wrong in the child process other
+ * than normal lookup errors, and it appears that we
+ * have enough info to know what went wrong, generate
+ * diagnostic output. ENOMEM observed on linux in
+ * processes constrained with ulimit. It would be too
+ * unkind to abort the session, access to local files
+ * or through a proxy may still work. - kw
+ */
+ if (
+#ifdef NETDB_INTERNAL /* linux glibc: defined in netdb.h */
+ (errno && h_errno == NETDB_INTERNAL) ||
+#endif
+ (errno == ENOMEM &&
+ statuses.rehostentlen == 0 &&
+ /* should probably be NETDB_INTERNAL if child
+ memory exhausted, but we may find that
+ h_errno remains unchanged. - kw */
+ h_errno == -2)) {
+#ifndef MULTINET
+ HTInetStatus("CHILD gethostbyname");
+#endif
+ HTAlert(LYStrerror(statuses.child_errno));
+ if (errno == ENOMEM) {
+ /*
+ * Not much point in continuing, right? Fake a
+ * 'z', should shorten pointless guessing
+ * cycle. - kw
+ */
+ LYFakeZap(YES);
+ }
+ }
+ }
+#endif /* HAVE_H_ERRNO */
+ if (statuses.rehostentlen != 0) {
+ /*
+ * Then get the full reorganized hostent. -BL, kw
+ */
+ if ((*rehostent = malloc(statuses.rehostentlen)) == 0)
+ outofmem(__FILE__, this_func);
+ readret = (*readit) (pfd[0], *rehostent, statuses.rehostentlen);
+#ifdef DEBUG_HOSTENT
+ dumpit("Read from pipe", *rehostent);
+#endif
+ if (readret == statuses.rehostentlen) {
+ got_rehostent = 1;
+ lynx_nsl_status = HT_OK;
+ } else if (!statuses.h_errno_valid) {
+ lynx_nsl_status = HT_INTERNAL;
+ }
+ }
+ } else {
+ lynx_nsl_status = HT_ERROR;
+ }
+ /*
+ * Make sure child is cleaned up. -BL
+ */
+ if (!child_exited)
+ waitret = waitpid(fpid, &waitstat, WNOHANG);
+ if (!WIFEXITED(waitstat) && !WIFSIGNALED(waitstat)) {
+ kill(fpid, SIGTERM);
+ waitret = waitpid(fpid, &waitstat, WNOHANG);
+ }
+ break;
+ }
+
+ /*
+ * Clean up if child exited before & no data received. -BL
+ */
+ if (child_exited) {
+ waitret = waitpid(fpid, &waitstat, WNOHANG);
+ break;
+ }
+ /*
+ * If child exited, loop once more looking for data. -BL
+ */
+ if ((waitret = waitpid(fpid, &waitstat, WNOHANG)) > 0) {
+ /*
+ * Data will be arriving right now, so make sure we don't
+ * short-circuit out for too many loops, and skip the interrupt
+ * check. -BL
+ */
+ child_exited = 1;
+ continue;
+ }
+
+ /*
+ * Abort if interrupt key pressed.
+ */
+ if (HTCheckForInterrupt()) {
+ CTRACE((tfp, "%s: INTERRUPTED gethostbyname.\n", this_func));
+ kill(fpid, SIGTERM);
+ waitpid(fpid, NULL, WNOHANG);
+ close(pfd[0]);
+ lynx_nsl_status = HT_INTERRUPTED;
+ return FALSE;
+ }
+ }
+ close(pfd[0]);
+ if (waitret <= 0) {
+ kill(fpid, SIGTERM);
+ waitret = waitpid(fpid, &waitstat, WNOHANG);
+ }
+ if (waitret > 0) {
+ if (WIFEXITED(waitstat)) {
+ CTRACE((tfp,
+ "%s: NSL_FORK child %d exited, status 0x%x.\n",
+ this_func, (int) waitret, WEXITSTATUS(waitstat)));
+ } else if (WIFSIGNALED(waitstat)) {
+ CTRACE((tfp,
+ "%s: NSL_FORK child %d got signal, status 0x%x!\n",
+ this_func, (int) waitret, WTERMSIG(waitstat)));
+#ifdef WCOREDUMP
+ if (WCOREDUMP(waitstat)) {
+ CTRACE((tfp,
+ "%s: NSL_FORK child %d dumped core!\n",
+ this_func, (int) waitret));
+ }
+#endif /* WCOREDUMP */
+ } else if (WIFSTOPPED(waitstat)) {
+ CTRACE((tfp,
+ "%s: NSL_FORK child %d is stopped, status 0x%x!\n",
+ this_func, (int) waitret, WSTOPSIG(waitstat)));
+ }
+ }
+ if (!got_rehostent) {
+ goto failed;
+ }
+ return TRUE;
+ failed:
+ return FALSE;
+}
+
+/*
+ * This is called via the child-side of the fork.
+ */
+static void really_gethostbyname(const char *host,
+ const char *port GCC_UNUSED,
+ STATUSES * statuses,
+ void **rehostent)
+{
+ LYNX_HOSTENT *phost; /* Pointer to host - See netdb.h */
+ LYNX_HOSTENT *result = 0;
+
+ (void) port;
+
+ phost = gethostbyname(host);
+ statuses->rehostentlen = 0;
+ statuses->child_errno = errno;
+ statuses->child_h_errno = h_errno;
+#ifdef HAVE_H_ERRNO
+ statuses->h_errno_valid = YES;
+#endif
+#ifdef MVS
+ CTRACE((tfp, "really_gethostbyname() returned %d\n", phost));
+#endif /* MVS */
+
+#ifdef DEBUG_HOSTENT_CHILD
+ dump_hostent("CHILD gethostbyname", phost);
+#endif
+ if (OK_HOST(phost)) {
+ statuses->rehostentlen = fill_rehostent(rehostent, phost);
+ result = (LYNX_HOSTENT *) (*rehostent);
+#ifdef DEBUG_HOSTENT_CHILD
+ dump_hostent("CHILD fill_rehostent", result);
+#endif
+ }
+ if (statuses->rehostentlen <= sizeof(LYNX_HOSTENT) || !OK_HOST(result)) {
+ statuses->rehostentlen = 0;
+ statuses->h_length = 0;
+ } else {
+ statuses->h_length = result->h_length;
+#ifdef HAVE_H_ERRNO
+ if (h_errno == -2) /* success, but h_errno unchanged? */
+ statuses->h_errno_valid = NO;
+#endif
+ }
+}
+#endif /* NSL_FORK */
+
+/* Resolve an internet hostname, like gethostbyname
+ * ------------------------------------------------
+ *
+ * On entry,
+ * host points to the given host name, not numeric address,
+ * without colon or port number.
+ *
+ * On exit,
+ * returns a pointer to a LYNX_HOSTENT in static storage,
+ * or NULL in case of error or user interruption.
+ *
+ * The interface is intended to be exactly the same as for (Unix)
+ * gethostbyname(), except for the following:
+ *
+ * If NSL_FORK is not used, the result of gethostbyname is returned
+ * directly. Otherwise:
+ * All lists, addresses, and strings referred to by pointers in the
+ * returned struct are located, together with the returned struct
+ * itself, in a buffer of size REHOSTENT_SIZE. If not everything fits,
+ * some info is omitted, but the function is careful to still return
+ * a valid structure, without truncating strings; it tries to return,
+ * in order of decreasing priority, the first address (h_addr_list[0]), the
+ * official name (h_name), the additional addresses, then alias names.
+ *
+ * If NULL is returned, the reason is made available in the global
+ * variable lynx_nsl_status, with one of the following values:
+ * HT_INTERRUPTED Interrupted by user
+ * HT_NOT_ACCEPTABLE Hostname detected as invalid
+ * (also sets h_errno)
+ * HT_H_ERRNO_VALID An error occurred, and h_errno holds
+ * an appropriate value
+ * HT_ERROR Resolver error, reason not known
+ * HT_INTERNAL Internal error
+ */
+static LYNX_HOSTENT *LYGetHostByName(char *host)
+{
+ static const char *this_func = "LYGetHostByName";
+
+#ifdef NSL_FORK
+ /* for transfer of result between from child to parent: */
+ LYNX_HOSTENT *rehostent = 0;
+#endif /* NSL_FORK */
+
+ LYNX_HOSTENT *result_phost = NULL;
+
+#ifdef __DJGPP__
+ _resolve_hook = ResolveYield;
+#endif
+
+ if (!host) {
+ CTRACE((tfp, "%s: Can't parse `NULL'.\n", this_func));
+ lynx_nsl_status = HT_INTERNAL;
+ return NULL;
+ }
+ CTRACE((tfp, "%s: parsing `%s'.\n", this_func, host));
+
+ /* Could disable this if all our callers already check - kw */
+ if (HTCheckForInterrupt()) {
+ CTRACE((tfp, "%s: INTERRUPTED for '%s'.\n", this_func, host));
+ lynx_nsl_status = HT_INTERRUPTED;
+ return NULL;
+ }
+
+ if (!valid_hostname(host)) {
+ lynx_nsl_status = HT_NOT_ACCEPTABLE;
+#ifdef NO_RECOVERY
+#ifdef _WINDOWS
+ WSASetLastError(NO_RECOVERY);
+#else
+ h_errno = NO_RECOVERY;
+#endif
+#endif
+ return NULL;
+ }
+#ifdef MVS /* Outstanding problem with crash in MVS gethostbyname */
+ CTRACE((tfp, "%s: Calling gethostbyname(%s)\n", this_func, host));
+#endif /* MVS */
+
+ CTRACE_FLUSH(tfp); /* so child messages will not mess up parent log */
+
+ lynx_nsl_status = HT_INTERNAL; /* should be set to something else below */
+
+#ifdef NSL_FORK
+ if (!setup_nsl_fork(really_gethostbyname,
+ read_hostent,
+ dump_hostent,
+ host, NULL, (void **) &rehostent)) {
+ goto failed;
+ }
+ result_phost = rehostent;
+#else /* Not NSL_FORK: */
+
+#ifdef _WINDOWS_NSL
+ {
+ HANDLE hThread;
+ DWORD dwThreadID;
+
+#ifndef __CYGWIN__
+ if (!system_is_NT) { /* for Windows9x */
+ unsigned long t;
+
+ t = (unsigned long) inet_addr(host);
+ if (t != INADDR_NONE)
+ gbl_phost = gethostbyaddr((char *) &t, sizeof(t), AF_INET);
+ else
+ gbl_phost = gethostbyname(host);
+ } else { /* for Windows NT */
+#endif /* !__CYGWIN__ */
+ gbl_phost = (LYNX_HOSTENT *) NULL;
+ donelookup = FALSE;
+
+#if defined(__CYGWIN__) || defined(USE_WINSOCK2_H)
+ SetLastError(WSAHOST_NOT_FOUND);
+#else
+ WSASetLastError(WSAHOST_NOT_FOUND);
+#endif
+
+ hThread = CreateThread(NULL, 4096UL, _fork_func, host, 0UL,
+ &dwThreadID);
+ if (!hThread)
+ MessageBox(NULL, "CreateThread",
+ "CreateThread Failed", 0L);
+
+ while (!donelookup) {
+ if (HTCheckForInterrupt()) {
+ /* Note that host is a character array and is not freed */
+ /* to avoid possible subthread problems: */
+ if (!CloseHandle(hThread)) {
+ MessageBox((void *) NULL,
+ "CloseHandle", "CloseHandle Failed", 0L);
+ }
+ lynx_nsl_status = HT_INTERRUPTED;
+ return NULL;
+ }
+ }
+#ifndef __CYGWIN__
+ }
+#endif /* !__CYGWIN__ */
+ if (gbl_phost) {
+ lynx_nsl_status = HT_OK;
+ result_phost = gbl_phost;
+ } else {
+ lynx_nsl_status = HT_ERROR;
+ goto failed;
+ }
+ }
+
+#else /* !NSL_FORK, !_WINDOWS_NSL: */
+ {
+ LYNX_HOSTENT *phost;
+
+ phost = gethostbyname(host); /* See netdb.h */
+#ifdef MVS
+ CTRACE((tfp, "%s: gethostbyname() returned %d\n", this_func, phost));
+#endif /* MVS */
+ if (phost) {
+ lynx_nsl_status = HT_OK;
+ result_phost = phost;
+ } else {
+ lynx_nsl_status = HT_H_ERRNO_VALID;
+ goto failed;
+ }
+ }
+#endif /* !NSL_FORK, !_WINDOWS_NSL */
+#endif /* !NSL_FORK */
+
+#ifdef DEBUG_HOSTENT
+ dump_hostent(this_func, result_phost);
+ CTRACE((tfp, "%s: Resolved name to a hostent.\n", this_func));
+#endif
+
+ return result_phost; /* OK */
+
+ failed:
+ CTRACE((tfp, "%s: Can't find internet node name `%s'.\n", this_func, host));
+ return NULL;
+}
+
+BOOLEAN LYCheckHostByName(char *host)
+{
+ LYNX_HOSTENT *data = LYGetHostByName(host);
+ BOOLEAN result = (data != NULL);
+
+ FREE_NSL_FORK(data);
+ return result;
+}
+
+/* Parse a network node address and port
+ * -------------------------------------
+ *
+ * On entry,
+ * str points to a string with a node name or number,
+ * with optional trailing colon and port number.
+ * soc_in points to the binary internet or decnet address field.
+ *
+ * On exit,
+ * *soc_in is filled in. If no port is specified in str, that
+ * field is left unchanged in *soc_in.
+ */
+#ifndef INET6
+static int HTParseInet(SockA *soc_in, const char *str)
+{
+ static const char *this_func = "HTParseInet";
+
+ char *port;
+ int dotcount_ip = 0; /* for dotted decimal IP addr */
+ char *strptr;
+ char *host = NULL;
+
+ if (!str) {
+ CTRACE((tfp, "%s: Can't parse `NULL'.\n", this_func));
+ return -1;
+ }
+ CTRACE((tfp, "%s: parsing `%s'.\n", this_func, str));
+ if (HTCheckForInterrupt()) {
+ CTRACE((tfp, "%s: INTERRUPTED for '%s'.\n", this_func, str));
+ return -1;
+ }
+ StrAllocCopy(host, str); /* Make a copy we can mutilate */
+ /*
+ * Parse port number if present.
+ */
+ if ((port = StrChr(host, ':')) != NULL) {
+ *port++ = 0; /* Chop off port */
+ strptr = port;
+ if (port[0] >= '0' && port[0] <= '9') {
+#ifdef UNIX
+ soc_in->sin_port = (PortNumber) htons(strtol(port, &strptr, 10));
+#else /* VMS: */
+#ifdef DECNET
+ soc_in->sdn_objnum = (unsigned char) (strtol(port, &strptr, 10));
+#else
+ soc_in->sin_port = htons((PortNumber) strtol(port, &strptr, 10));
+#endif /* Decnet */
+#endif /* Unix vs. VMS */
+#ifdef SUPPRESS /* 1. crashes!?!. 2. URL syntax has number not name */
+ } else {
+ struct servent *serv = getservbyname(port, (char *) 0);
+
+ if (serv) {
+ soc_in->sin_port = serv->s_port;
+ } else {
+ CTRACE((tfp, "TCP: Unknown service %s\n", port));
+ }
+#endif /* SUPPRESS */
+ }
+ if (strptr && *strptr != '\0') {
+ FREE(host);
+ HTAlwaysAlert(NULL, gettext("Address has invalid port"));
+ return -1;
+ }
+ }
+#ifdef DECNET
+ /*
+ * Read Decnet node name. @@ Should know about DECnet addresses, but it's
+ * probably worth waiting until the Phase transition from IV to V.
+ */
+ soc_in->sdn_nam.n_len = min(DN_MAXNAML, strlen(host)); /* <=6 in phase 4 */
+ StrNCpy(soc_in->sdn_nam.n_name, host, soc_in->sdn_nam.n_len + 1);
+ CTRACE((tfp,
+ "DECnet: Parsed address as object number %d on host %.6s...\n",
+ soc_in->sdn_objnum, host));
+#else /* parse Internet host: */
+
+ if (*host >= '0' && *host <= '9') { /* Test for numeric node address: */
+ strptr = host;
+ while (*strptr) {
+ if (*strptr == '.') {
+ dotcount_ip++;
+ } else if (!isdigit(UCH(*strptr))) {
+ break;
+ }
+ strptr++;
+ }
+ if (*strptr) { /* found non-numeric, assume domain name */
+ dotcount_ip = 0;
+ }
+ }
+
+ /*
+ * Parse host number if present.
+ */
+ if (dotcount_ip == 3) /* Numeric node address: */
+ {
+#ifdef GUSI
+ soc_in->sin_addr = inet_addr(host); /* See netinet/in.h */
+#else
+#ifdef HAVE_INET_ATON
+ if (!inet_aton(host, &(soc_in->sin_addr))) {
+ CTRACE((tfp, "inet_aton(%s) returns error\n", host));
+ FREE(host);
+ return -1;
+ }
+#else
+ soc_in->sin_addr.s_addr = inet_addr(host); /* See arpa/inet.h */
+#endif /* HAVE_INET_ATON */
+#endif /* GUSI */
+ FREE(host);
+ } else { /* Alphanumeric node name: */
+
+#ifdef MVS /* Outstanding problem with crash in MVS gethostbyname */
+ CTRACE((tfp, "%s: Calling LYGetHostByName(%s)\n", this_func, host));
+#endif /* MVS */
+
+#ifdef _WINDOWS_NSL
+ gbl_phost = LYGetHostByName(host); /* See above */
+ if (!gbl_phost)
+ goto failed;
+ MemCpy((void *) &soc_in->sin_addr, gbl_phost->h_addr_list[0], gbl_phost->h_length);
+ FREE(gbl_phost);
+#else /* !_WINDOWS_NSL */
+ {
+ LYNX_HOSTENT *phost;
+
+ phost = LYGetHostByName(host); /* See above */
+
+ if (!phost)
+ goto failed;
+ if (phost->h_length != sizeof soc_in->sin_addr) {
+ HTAlwaysAlert(host, gettext("Address length looks invalid"));
+ }
+ MemCpy((void *) &soc_in->sin_addr, phost->h_addr_list[0], phost->h_length);
+ FREE_NSL_FORK(phost);
+ }
+#endif /* _WINDOWS_NSL */
+
+ FREE(host);
+ } /* Alphanumeric node name */
+
+ CTRACE((tfp,
+ "%s: Parsed address as port %d, IP address %d.%d.%d.%d\n",
+ this_func,
+ (int) ntohs(soc_in->sin_port),
+ (int) *((unsigned char *) (&soc_in->sin_addr) + 0),
+ (int) *((unsigned char *) (&soc_in->sin_addr) + 1),
+ (int) *((unsigned char *) (&soc_in->sin_addr) + 2),
+ (int) *((unsigned char *) (&soc_in->sin_addr) + 3)));
+#endif /* Internet vs. Decnet */
+
+ return 0; /* OK */
+
+ failed:
+ CTRACE((tfp, "%s: Can't find internet node name `%s'.\n",
+ this_func, host));
+ FREE(host);
+ switch (lynx_nsl_status) {
+ case HT_NOT_ACCEPTABLE:
+ case HT_INTERRUPTED:
+ return lynx_nsl_status;
+ default:
+ return -1;
+ }
+}
+#endif /* !INET6 */
+
+#ifdef INET6
+
+static void dump_addrinfo(const char *tag, const void *data)
+{
+ const LYNX_ADDRINFO *res;
+ int count = 0;
+
+ CTRACE((tfp, "dump_addrinfo %s:\n", tag));
+ for (res = (const LYNX_ADDRINFO *) data; res; res = res->ai_next) {
+ char hostbuf[1024], portbuf[1024];
+
+ ++count;
+ hostbuf[0] = '\0';
+ portbuf[0] = '\0';
+ getnameinfo(res->ai_addr, res->ai_addrlen,
+ hostbuf, (socklen_t) sizeof(hostbuf),
+ portbuf, (socklen_t) sizeof(portbuf),
+ NI_NUMERICHOST | NI_NUMERICSERV);
+
+ CTRACE((tfp,
+ "\t[%d] family %d, socktype %d, protocol %d addr %s port %s\n",
+ count,
+ res->ai_family,
+ res->ai_socktype,
+ res->ai_protocol,
+ hostbuf,
+ portbuf));
+ }
+}
+
+#if defined(NSL_FORK)
+
+/*
+ * Copy the relevant information (on the child-side).
+ */
+static size_t fill_addrinfo(void **buffer,
+ const LYNX_ADDRINFO *phost)
+{
+ static const char *this_func = "fill_addinfo";
+
+ const LYNX_ADDRINFO *q;
+ LYNX_ADDRINFO *actual;
+ LYNX_ADDRINFO *result;
+ int count = 0;
+ int limit = 0;
+ size_t need = sizeof(LYNX_ADDRINFO);
+ char *heap;
+
+ CTRACE((tfp, "filladdr_info %p\n", (const void *) phost));
+ for (q = phost; q != 0; q = q->ai_next) {
+ ++limit;
+ need += phost->ai_addrlen;
+ need += sizeof(LYNX_ADDRINFO);
+ }
+ CTRACE((tfp, "...fill_addrinfo %d:%lu\n", limit, (unsigned long) need));
+
+ if ((result = (LYNX_ADDRINFO *) calloc(1, need)) == 0)
+ outofmem(__FILE__, this_func);
+
+ *buffer = actual = result;
+ heap = ((char *) actual) + ((size_t) limit * sizeof(LYNX_ADDRINFO));
+
+ for (count = 0; count < limit; ++count) {
+
+ /*
+ * copying the whole structure seems simpler but because it is not
+ * packed, uninitialized gaps make it hard to analyse with valgrind.
+ */
+ /* *INDENT-EQLS* */
+ actual->ai_flags = phost->ai_flags;
+ actual->ai_family = phost->ai_family;
+ actual->ai_socktype = phost->ai_socktype;
+ actual->ai_protocol = phost->ai_protocol;
+ actual->ai_addrlen = phost->ai_addrlen;
+ actual->ai_addr = (struct sockaddr *) (void *) heap;
+
+ MemCpy(heap, phost->ai_addr, phost->ai_addrlen);
+ heap += phost->ai_addrlen;
+
+ phost = phost->ai_next;
+
+ actual->ai_next = ((count + 1 < limit)
+ ? (actual + 1)
+ : 0);
+ ++actual;
+ }
+ return (size_t) (heap - (char *) result);
+}
+
+/*
+ * Read data, repair pointers as done in fill_addrinfo().
+ */
+static unsigned read_addrinfo(int fd, char *buffer, size_t length)
+{
+ unsigned result = read_bytes(fd, buffer, length);
+ LYNX_ADDRINFO *actual = (LYNX_ADDRINFO *) (void *) buffer;
+ LYNX_ADDRINFO *res;
+ int count = 0;
+ int limit;
+ char *heap;
+
+ CTRACE((tfp, "read_addrinfo length %lu\n", (unsigned long) length));
+ for (limit = 0; actual[limit].ai_next; ++limit) {
+ }
+ ++limit;
+ heap = (char *) (actual + limit);
+ CTRACE((tfp, "...read_addrinfo %d items\n", limit));
+
+ for (res = actual, count = 0; count < limit; ++count) {
+ res->ai_addr = (struct sockaddr *) (void *) heap;
+ heap += res->ai_addrlen;
+ if (count < limit - 1) {
+ res->ai_next = (res + 1);
+ ++res;
+ } else {
+ res->ai_next = 0;
+ }
+ }
+
+#ifdef DEBUG_HOSTENT
+ dump_addrinfo("read_addrinfo", buffer);
+#endif
+ return result;
+}
+
+/*
+ * This is called via the child-side of the fork.
+ */
+static void really_getaddrinfo(const char *host,
+ const char *port,
+ STATUSES * statuses,
+ void **result)
+{
+ LYNX_ADDRINFO hints, *res = 0;
+ int error;
+
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = PF_UNSPEC;
+ hints.ai_socktype = SOCK_STREAM;
+ error = getaddrinfo(host, port, &hints, &res);
+ if (error) {
+ CTRACE((tfp, "HTGetAddrInfo: getaddrinfo(%s, %s): %s\n", host, port,
+ gai_strerror(error)));
+ } else {
+ statuses->child_errno = errno;
+ statuses->child_h_errno = h_errno;
+#ifdef HAVE_H_ERRNO
+ statuses->h_errno_valid = YES;
+#endif
+
+#ifdef DEBUG_HOSTENT_CHILD
+ dump_addrinfo("CHILD getaddrinfo", res);
+#endif
+ statuses->rehostentlen = fill_addrinfo(result, res);
+#ifdef DEBUG_HOSTENT_CHILD
+ dump_addrinfo("CHILD fill_addrinfo", (const LYNX_ADDRINFO *) (*result));
+#endif
+ if (statuses->rehostentlen <= sizeof(LYNX_ADDRINFO) || (*result) == NULL) {
+ statuses->rehostentlen = 0;
+ statuses->h_length = 0;
+ } else {
+ statuses->h_length = (int) (((LYNX_ADDRINFO *) (*result))->ai_addrlen);
+ }
+ freeaddrinfo(res);
+ }
+}
+#endif /* NSL_FORK */
+
+static LYNX_ADDRINFO *HTGetAddrInfo(const char *str,
+ const int defport)
+{
+#ifdef NSL_FORK
+ /* for transfer of result between from child to parent: */
+ void *readdrinfo = 0;
+
+#else
+ LYNX_ADDRINFO hints;
+ int error;
+#endif /* NSL_FORK */
+ LYNX_ADDRINFO *res;
+ char *p;
+ char *s = NULL;
+ char *host, *port;
+ char pbuf[80];
+
+ StrAllocCopy(s, str);
+
+ if (s[0] == '[' && (p = StrChr(s, ']')) != NULL) {
+ *p++ = '\0';
+ host = s + 1;
+ } else {
+ p = s;
+ host = &s[0];
+ }
+ port = strrchr(p, ':');
+ if (port) {
+ *port++ = '\0';
+ } else {
+ sprintf(pbuf, "%d", defport);
+ port = pbuf;
+ }
+
+#ifdef NSL_FORK
+ if (setup_nsl_fork(really_getaddrinfo,
+ read_addrinfo,
+ dump_addrinfo,
+ host, port, &readdrinfo)) {
+ res = readdrinfo;
+ } else {
+ res = NULL;
+ }
+#else
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = PF_UNSPEC;
+ hints.ai_socktype = SOCK_STREAM;
+ error = getaddrinfo(host, port, &hints, &res);
+ if (error || !res) {
+ CTRACE((tfp, "HTGetAddrInfo: getaddrinfo(%s, %s): %s\n", host, port,
+ gai_strerror(error)));
+ res = NULL;
+ }
+#endif
+
+ free(s);
+#ifdef DEBUG_HOSTENT
+ dump_addrinfo("HTGetAddrInfo", res);
+#endif
+ return res;
+}
+
+BOOLEAN HTCheckAddrInfo(const char *str, const int defport)
+{
+ LYNX_ADDRINFO *data = HTGetAddrInfo(str, defport);
+ BOOLEAN result = (data != 0);
+
+ FREE_NSL_FORK(data);
+ return result;
+}
+#endif /* INET6 */
+
+#ifdef LY_FIND_LEAKS
+/* Free our name for the host on which we are - FM
+ * -------------------------------------------
+ *
+ */
+static void free_HTTCP_hostname(void)
+{
+ FREE(hostname);
+}
+#endif /* LY_FIND_LEAKS */
+
+/* Derive the name of the host on which we are
+ * -------------------------------------------
+ *
+ */
+static void get_host_details(void)
+{
+ char name[MAXHOSTNAMELEN + 1]; /* The name of this host */
+
+#ifdef UCX
+ char *domain_name; /* The name of this host domain */
+#endif /* UCX */
+#ifdef NEED_HOST_ADDRESS /* no -- needs name server! */
+#ifdef INET6
+ LYNX_ADDRINFO hints, *res;
+ int error;
+
+#else
+ LYNX_HOSTENT *phost; /* Pointer to host -- See netdb.h */
+#endif /* INET6 */
+#endif /* NEED_HOST_ADDRESS */
+ size_t namelength = sizeof(name);
+
+ if (hostname)
+ return; /* Already done */
+ gethostname(name, namelength); /* Without domain */
+ StrAllocCopy(hostname, name);
+#ifdef LY_FIND_LEAKS
+ atexit(free_HTTCP_hostname);
+#endif
+#ifdef UCX
+ /*
+ * UCX doesn't give the complete domain name. Get rest from UCX$BIND_DOM
+ * logical.
+ */
+ if (StrChr(hostname, '.') == NULL) { /* Not full address */
+ domain_name = LYGetEnv("UCX$BIND_DOMAIN");
+ if (domain_name == NULL)
+ domain_name = LYGetEnv("TCPIP$BIND_DOMAIN");
+ if (domain_name != NULL) {
+ StrAllocCat(hostname, ".");
+ StrAllocCat(hostname, domain_name);
+ }
+ }
+#endif /* UCX */
+ CTRACE((tfp, "TCP: Local host name is %s\n", hostname));
+
+#ifndef DECNET /* Decnet ain't got no damn name server 8#OO */
+#ifdef NEED_HOST_ADDRESS /* no -- needs name server! */
+#ifdef INET6
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = PF_UNSPEC;
+ hints.ai_socktype = SOCK_STREAM;
+ hints.ai_flags = AI_CANONNAME;
+ error = getaddrinfo(name, NULL, &hints, &res);
+ if (error || !res || !res->ai_canonname) {
+ CTRACE((tfp, "TCP: %s: `%s'\n", gai_strerror(error), name));
+ if (res)
+ freeaddrinfo(res);
+ return; /* Fail! */
+ }
+ StrAllocCopy(hostname, res->ai_canonname);
+ MemCpy(&HTHostAddress, res->ai_addr, res->ai_addrlen);
+ freeaddrinfo(res);
+#else
+ phost = gethostbyname(name); /* See netdb.h */
+ if (!OK_HOST(phost)) {
+ CTRACE((tfp,
+ "TCP: Can't find my own internet node address for `%s'!!\n",
+ name));
+ return; /* Fail! */
+ }
+ StrAllocCopy(hostname, phost->h_name);
+ MemCpy(&HTHostAddress, &phost->h_addr_list[0], phost->h_length);
+#endif /* INET6 */
+ CTRACE((tfp, " Name server says that I am `%s' = %s\n",
+ hostname, HTInetString(&HTHostAddress)));
+#endif /* NEED_HOST_ADDRESS */
+
+#endif /* !DECNET */
+}
+
+const char *HTHostName(void)
+{
+ get_host_details();
+ return hostname;
+}
+
+#ifdef _WINDOWS
+#define SET_EINTR WSASetLastError(EINTR)
+#else
+#define SET_EINTR SOCKET_ERRNO = EINTR
+#endif
+
+static BOOL HTWasInterrupted(int *status)
+{
+ BOOL result = FALSE;
+
+ if (HTCheckForInterrupt()) {
+ result = TRUE;
+ *status = HT_INTERRUPTED;
+ SET_EINTR;
+ }
+ return result;
+}
+
+#define TRIES_PER_SECOND 10
+
+/*
+ * Set the select-timeout to 0.1 seconds.
+ */
+static void set_timeout(struct timeval *timeoutp)
+{
+ timeoutp->tv_sec = 0;
+ timeoutp->tv_usec = 100000;
+}
+
+#ifndef MULTINET /* SOCKET_ERRNO != errno ? */
+#if !defined(UCX) || !defined(VAXC) /* errno not modifiable ? */
+#define SOCKET_DEBUG_TRACE /* show errno status after some system calls */
+#endif /* UCX && VAXC */
+#endif /* MULTINET */
+/*
+ * Interruptible connect as implemented for Mosaic by Marc Andreesen
+ * and hacked in for Lynx years ago by Lou Montulli, and further
+ * modified over the years by numerous Lynx lovers. - FM
+ */
+int HTDoConnect(const char *url,
+ const char *protocol,
+ int default_port,
+ int *s)
+{
+ char *socks5_host = NULL;
+ unsigned socks5_host_len = 0;
+ int socks5_port;
+ const char *socks5_orig_url;
+ char *socks5_new_url = NULL;
+ char *socks5_protocol = NULL;
+ int status = HT_OK;
+ char *line = NULL;
+ char *p1 = NULL;
+ char *host = NULL;
+ char const *emsg;
+
+#ifdef INET6
+ LYNX_ADDRINFO *res = 0, *res0 = 0;
+
+#else
+ struct sockaddr_in sock_A;
+ struct sockaddr_in *soc_in = &sock_A;
+#endif
+
+ *s = -1; /* nothing is open yet */
+
+ /* In case of a present SOCKS5 proxy, marshal */
+ if (socks5_proxy == NULL)
+ socks5_proxy = LYGetEnv("SOCKS5_PROXY");
+ if ((socks5_orig_url = socks5_proxy) != NULL) {
+ int xport;
+
+ xport = default_port;
+ socks5_orig_url = url;
+ StrAllocCopy(socks5_new_url, url);
+
+ /* Get node name and optional port number of wanted URL */
+ if ((p1 = HTParse(socks5_new_url, "", PARSE_HOST)) != NULL) {
+ StrAllocCopy(socks5_host, p1);
+ strip_userid(socks5_host, FALSE);
+ FREE(p1);
+ }
+
+ if (isEmpty(socks5_host)) {
+ emsg = gettext("SOCKS5: no hostname found.");
+ status = HT_ERROR;
+ goto report_error;
+ }
+
+ if (strlen(socks5_host) > 255) {
+ emsg = gettext("SOCKS5: hostname too long.");
+ status = HT_ERROR;
+ goto report_error;
+ }
+ socks5_host_len = (unsigned) strlen(socks5_host);
+
+ if (HTParsePort(socks5_new_url, &socks5_port) == NULL)
+ socks5_port = xport;
+ FREE(socks5_new_url);
+
+ /* And switch over to our SOCKS5 config; in order to embed that into
+ * lynx environment, prepend protocol prefix */
+ default_port = 1080; /* RFC 1928 */
+ HTSACat(&socks5_new_url, "socks://");
+ HTSACat(&socks5_new_url, socks5_proxy);
+ url = socks5_new_url;
+
+ HTSprintf0(&socks5_protocol,
+ gettext("(for %s at %s) SOCKS5"),
+ protocol, socks5_host);
+ protocol = socks5_protocol;
+ }
+#ifndef INET6
+ /*
+ * Set up defaults.
+ */
+ memset(soc_in, 0, sizeof(*soc_in));
+ soc_in->sin_family = AF_INET;
+ soc_in->sin_port = htons((PortNumber) default_port);
+#endif /* INET6 */
+
+ /*
+ * Get node name and optional port number.
+ */
+ p1 = HTParse(url, "", PARSE_HOST);
+ StrAllocCopy(host, p1);
+ strip_userid(host, FALSE);
+ FREE(p1);
+
+ HTSprintf0(&line, "%s%s", WWW_FIND_MESSAGE, host);
+ _HTProgress(line);
+#ifdef INET6
+ /* HTParseInet() is useless! */
+ res0 = HTGetAddrInfo(host, default_port);
+ if (res0 == NULL) {
+ HTSprintf0(&line, gettext("Unable to locate remote host %s."), host);
+ _HTProgress(line);
+ status = HT_NO_DATA;
+ goto cleanup;
+ }
+#else
+ status = HTParseInet(soc_in, host);
+ if (status) {
+ if (status != HT_INTERRUPTED) {
+ if (status == HT_NOT_ACCEPTABLE) {
+ /* Not HTProgress, so warning won't be overwritten immediately;
+ * but not HTAlert, because typically there will be other
+ * alerts from the callers. - kw
+ */
+ HTUserMsg2(gettext("Invalid hostname %s"), host);
+ } else {
+ HTSprintf0(&line,
+ gettext("Unable to locate remote host %s."), host);
+ _HTProgress(line);
+ }
+ status = HT_NO_DATA;
+ }
+ goto cleanup;
+ }
+#endif /* INET6 */
+
+ HTSprintf0(&line, gettext("Making %s connection to %s"), protocol, host);
+ _HTProgress(line);
+
+ /*
+ * Now, let's get a socket set up from the server for the data.
+ */
+#ifndef INET6
+ *s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+ if (*s == -1) {
+ status = HT_NO_DATA;
+ emsg = gettext("socket failed.");
+ goto report_error;
+ }
+#else
+ for (res = res0; res; res = res->ai_next) {
+ *s = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
+ if (*s == -1) {
+ char hostbuf[1024], portbuf[1024];
+
+ getnameinfo(res->ai_addr, res->ai_addrlen,
+ hostbuf, (socklen_t) sizeof(hostbuf),
+ portbuf, (socklen_t) sizeof(portbuf),
+ NI_NUMERICHOST | NI_NUMERICSERV);
+ HTSprintf0(&line,
+ gettext("socket failed: family %d addr %s port %s."),
+ res->ai_family, hostbuf, portbuf);
+ _HTProgress(line);
+ continue;
+ }
+#endif /* INET6 */
+
+#if !defined(DOSPATH) || defined(__DJGPP__)
+#if !defined(NO_IOCTL) || defined(USE_FCNTL)
+ /*
+ * Make the socket non-blocking, so the connect can be canceled. This
+ * means that when we issue the connect we should NOT have to wait for
+ * the accept on the other end.
+ */
+ {
+#ifdef USE_FCNTL
+ int ret = fcntl(*s, F_SETFL, O_NONBLOCK);
+
+#else
+ int val = 1;
+ int ret = IOCTL(*s, FIONBIO, &val);
+#endif /* USE_FCNTL */
+ if (ret == -1)
+ _HTProgress(gettext("Could not make connection non-blocking."));
+ }
+#endif /* !NO_IOCTL || USE_FCNTL */
+#endif /* !DOSPATH || __DJGPP__ */
+
+ /*
+ * Issue the connect. Since the server can't do an instantaneous
+ * accept and we are non-blocking, this will almost certainly return a
+ * negative status.
+ */
+#ifdef SOCKS
+ if (socks_flag) {
+#ifdef INET6
+ status = Rconnect(*s, res->ai_addr, res->ai_addrlen);
+#else
+ status = Rconnect(*s, SOCKADDR_OF(sock_A), sizeof(sock_A));
+#endif /* INET6 */
+ } else
+#endif /* SOCKS */
+#ifdef INET6
+ status = connect(*s, res->ai_addr, res->ai_addrlen);
+#else
+ status = connect(*s, SOCKADDR_OF(sock_A), sizeof(sock_A));
+#endif /* INET6 */
+
+ /*
+ * According to the Sun man page for connect:
+ * EINPROGRESS The socket is non-blocking and the con-
+ * nection cannot be completed immediately.
+ * It is possible to select(2) for comple-
+ * tion by selecting the socket for writ-
+ * ing.
+ * According to the Motorola SVR4 man page for connect:
+ * EAGAIN The socket is non-blocking and the con-
+ * nection cannot be completed immediately.
+ * It is possible to select for completion
+ * by selecting the socket for writing.
+ * However, this is only possible if the
+ * socket STREAMS module is the topmost
+ * module on the protocol stack with a
+ * write service procedure. This will be
+ * the normal case.
+ */
+ CTRACE((tfp, "connect(): status: %d, SOCK_ERRNO: %d\n", status, SOCKET_ERRNO));
+
+ if ((status < 0) &&
+ (SOCKET_ERRNO == EINPROGRESS
+#ifdef EAGAIN
+ || SOCKET_ERRNO == EAGAIN
+#endif
+ )) {
+ struct timeval select_timeout;
+ int ret;
+ int tries = 0;
+
+#ifdef SOCKET_DEBUG_TRACE
+ if (SOCKET_ERRNO != EINPROGRESS) {
+ HTInetStatus("this socket's first connect");
+ }
+#endif /* SOCKET_DEBUG_TRACE */
+ ret = 0;
+ while (ret <= 0) {
+ fd_set writefds;
+
+ /*
+ * Protect against an infinite loop.
+ */
+ if ((tries++ / TRIES_PER_SECOND) >= connect_timeout) {
+ HTAlert(gettext("Connection failed (too many retries)."));
+#ifdef INET6
+#ifndef NSL_FORK
+ if (res0)
+ freeaddrinfo(res0);
+#endif
+#endif /* INET6 */
+ status = HT_NO_DATA;
+ goto cleanup;
+ }
+ set_timeout(&select_timeout);
+ FD_ZERO(&writefds);
+ FD_SET((LYNX_FD) *s, &writefds);
+#ifdef SOCKS
+ if (socks_flag)
+ ret = Rselect(*s + 1, NULL,
+ &writefds, NULL, &select_timeout);
+ else
+#endif /* SOCKS */
+ ret = select(*s + 1,
+ NULL,
+ &writefds,
+ NULL,
+ &select_timeout);
+
+#ifdef SOCKET_DEBUG_TRACE
+ if (tries == 1) {
+ if (SOCKET_ERRNO != EINPROGRESS) {
+ HTInetStatus("this socket's first select");
+ }
+ }
+#endif /* SOCKET_DEBUG_TRACE */
+ /*
+ * If we suspend, then it is possible that select will be
+ * interrupted. Allow for this possibility. - JED
+ */
+ if ((ret == -1) && (SOCKET_ERRNO == EINTR))
+ continue;
+
+#ifdef SOCKET_DEBUG_TRACE
+ if (ret < 0) {
+ HTInetStatus("failed select");
+ }
+#endif /* SOCKET_DEBUG_TRACE */
+ /*
+ * Again according to the Sun and Motorola man pages for
+ * connect:
+ * EALREADY The socket is non-blocking and a previ-
+ * ous connection attempt has not yet been
+ * completed.
+ * Thus if the SOCKET_ERRNO is NOT EALREADY we have a real
+ * error, and should break out here and return that error.
+ * Otherwise if it is EALREADY keep on trying to complete the
+ * connection.
+ */
+ if ((ret < 0) && (SOCKET_ERRNO != EALREADY)) {
+ status = ret;
+ break;
+ } else if (((SOCKET_ERRNO == EALREADY) ||
+ (SOCKET_ERRNO == EINPROGRESS)) &&
+ HTCheckForInterrupt()) {
+ status = HT_INTERRUPTED;
+ break;
+ } else if (ret > 0) {
+ /*
+ * Extra check here for connection success, if we try to
+ * connect again, and get EISCONN, it means we have a
+ * successful connection. But don't check with SOCKS.
+ */
+#ifdef SOCKS
+ if (socks_flag) {
+ status = 0;
+ } else {
+#endif /* SOCKS */
+#ifdef INET6
+ status = connect(*s, res->ai_addr, res->ai_addrlen);
+#else
+ status = connect(*s, SOCKADDR_OF(sock_A), sizeof(sock_A));
+#endif /* INET6 */
+#ifdef UCX
+ /*
+ * A UCX feature: Instead of returning EISCONN UCX
+ * returns EADDRINUSE. Test for this status also.
+ */
+ if ((status < 0) && ((SOCKET_ERRNO == EISCONN) ||
+ (SOCKET_ERRNO == EADDRINUSE)))
+#else
+ if ((status < 0) && (SOCKET_ERRNO == EISCONN))
+#endif /* UCX */
+ {
+ status = 0;
+ }
+
+ if (status && (SOCKET_ERRNO == EALREADY)) /* new stuff LJM */
+ ret = 0; /* keep going */
+ else {
+#ifdef SOCKET_DEBUG_TRACE
+ if (status < 0) {
+ HTInetStatus("confirm-ready connect");
+ }
+#endif /* SOCKET_DEBUG_TRACE */
+ break;
+ }
+#ifdef SOCKS
+ }
+#endif /* SOCKS */
+ }
+#ifdef SOCKS
+ else if (!socks_flag)
+#else
+ else
+#endif /* SOCKS */
+ {
+ /*
+ * The select says we aren't ready yet. Try to connect
+ * again to make sure. If we don't get EALREADY or
+ * EISCONN, something has gone wrong. Break out and report
+ * it.
+ *
+ * For some reason, SVR4 returns EAGAIN here instead of
+ * EALREADY, even though the man page says it should be
+ * EALREADY.
+ *
+ * For some reason, UCX pre 3 apparently returns errno =
+ * 18242 instead of EALREADY or EISCONN.
+ */
+#ifdef INET6
+ status = connect(*s, res->ai_addr, res->ai_addrlen);
+#else
+ status = connect(*s, SOCKADDR_OF(sock_A), sizeof(sock_A));
+#endif /* INET6 */
+ if ((status < 0) &&
+ (SOCKET_ERRNO != EALREADY
+#ifdef EAGAIN
+ && SOCKET_ERRNO != EAGAIN
+#endif
+ ) &&
+#ifdef UCX
+ (SOCKET_ERRNO != 18242) &&
+#endif /* UCX */
+ (SOCKET_ERRNO != EISCONN)) {
+#ifdef SOCKET_DEBUG_TRACE
+ HTInetStatus("confirm-not-ready connect");
+#endif /* SOCKET_DEBUG_TRACE */
+ break;
+ }
+ }
+ if (HTWasInterrupted(&status)) {
+ CTRACE((tfp, "*** INTERRUPTED in middle of connect.\n"));
+ break;
+ }
+ }
+ }
+#ifdef SOCKET_DEBUG_TRACE
+ else if (status < 0) {
+ HTInetStatus("this socket's first and only connect");
+ }
+#endif /* SOCKET_DEBUG_TRACE */
+#ifdef INET6
+ if (status < 0) {
+ NETCLOSE(*s);
+ *s = -1;
+ if (status != HT_INTERRUPTED)
+ continue;
+ }
+ break;
+ }
+#endif /* INET6 */
+
+#ifdef INET6
+ if (*s < 0)
+#else
+ if (status < 0)
+#endif /* INET6 */
+ {
+ /*
+ * The connect attempt failed or was interrupted, so close up the
+ * socket.
+ */
+ NETCLOSE(*s);
+ }
+#if !defined(DOSPATH) || defined(__DJGPP__)
+#if !defined(NO_IOCTL) || defined(USE_FCNTL)
+ else {
+ /*
+ * Make the socket blocking again on good connect.
+ */
+#ifdef USE_FCNTL
+ int ret = fcntl(*s, F_SETFL, 0);
+
+#else
+ int val = 0;
+ int ret = IOCTL(*s, FIONBIO, &val);
+#endif /* USE_FCNTL */
+ if (ret == -1)
+ _HTProgress(gettext("Could not restore socket to blocking."));
+ }
+#endif /* !NO_IOCTL || USE_FCNTL */
+#endif /* !DOSPATH || __DJGPP__ */
+
+#ifdef INET6
+#ifdef NSL_FORK
+ FREE_NSL_FORK(res0);
+#else
+ if (res0)
+ freeaddrinfo(res0);
+#endif
+#endif /* INET6 */
+
+ /* Now if this was a SOCKS5 proxy connection, go for the real one */
+ if (status >= 0 && socks5_orig_url != NULL) {
+ unsigned char pbuf[4 + 1 + 255 + 2];
+ unsigned i;
+
+ /* RFC 1928: version identifier/method selection message */
+ pbuf[0] = 0x05; /* VER: protocol version: X'05' */
+ pbuf[1] = 0x01; /* NMETHODS: 1 */
+ pbuf[2] = 0x00; /* METHOD: X'00' NO AUTHENTICATION REQUIRED */
+ if (NETWRITE(*s, (char *) pbuf, 3) != 3) {
+ goto report_system_err;
+ } else if (HTDoRead(*s, pbuf, 2) != 2) {
+ goto report_system_err;
+ } else if (pbuf[0] != 0x05 || pbuf[1] != 0x00) {
+ goto report_unexpected_reply;
+ }
+
+ /* RFC 1928: CONNECT request */
+ HTSprintf0(&line, gettext("SOCKS5: connecting to %s"), socks5_host);
+ _HTProgress(line);
+ pbuf[0] = 0x05; /* VER: protocol version: X'05' */
+ pbuf[1] = 0x01; /* CMD: CONNECT X'01' */
+ pbuf[2] = 0x00; /* RESERVED */
+ pbuf[3] = 0x03; /* ATYP: domain name */
+ pbuf[4] = (unsigned char) socks5_host_len;
+ memcpy(&pbuf[i = 5], socks5_host, socks5_host_len);
+ i += socks5_host_len;
+ /* C99 */ {
+ unsigned short x; /* XXX 16-bit? */
+
+ x = htons((PortNumber) socks5_port);
+ memcpy(&pbuf[i], (unsigned char *) &x, sizeof x);
+ i += (unsigned) sizeof(x);
+ }
+ if ((size_t) NETWRITE(*s, (char *) pbuf, i) != i) {
+ goto report_system_err;
+ } else if ((unsigned) HTDoRead(*s, pbuf, 4) != 4) {
+ goto report_system_err;
+ }
+ /* Version 5, reserved must be 0 */
+ if (pbuf[0] == 0x05 && pbuf[2] == 0x00) {
+ /* Result */
+ switch (pbuf[1]) {
+ case 0x00:
+ emsg = NULL;
+ break;
+ case 0x01:
+ emsg = gettext("SOCKS server failure");
+ break;
+ case 0x02:
+ emsg = gettext("connection not allowed by ruleset");
+ break;
+ case 0x03:
+ emsg = gettext("network unreachable");
+ break;
+ case 0x04:
+ emsg = gettext("host unreachable");
+ break;
+ case 0x05:
+ emsg = gettext("connection refused");
+ break;
+ case 0x06:
+ emsg = gettext("TTL expired");
+ break;
+ case 0x07:
+ emsg = gettext("command not supported");
+ break;
+ case 0x08:
+ emsg = gettext("address type not supported");
+ break;
+ default:
+ emsg = gettext("unknown SOCKS error code");
+ break;
+ }
+ if (emsg != NULL) {
+ goto report_no_connection;
+ }
+ } else {
+ goto report_unexpected_reply;
+ }
+
+ /* Address type variable; read the BND.PORT with it.
+ * This is actually false since RFC 1928 says that the BND.ADDR reply
+ * to CONNECT contains the IP address, so only 0x01 and 0x04 are
+ * allowed */
+ switch (pbuf[3]) {
+ case 0x01:
+ i = 4;
+ break;
+ case 0x03:
+ i = 1;
+ break;
+ case 0x04:
+ i = 16;
+ break;
+ default:
+ goto report_unexpected_reply;
+ }
+ i += (unsigned) sizeof(unsigned short);
+
+ if ((size_t) HTDoRead(*s, pbuf, i) != i) {
+ goto report_system_err;
+ } else if (i == 1 + sizeof(unsigned short)) {
+ i = pbuf[0];
+ if ((size_t) HTDoRead(*s, pbuf, i) != i) {
+ goto report_system_err;
+ }
+ }
+ }
+ goto cleanup;
+
+ report_system_err:
+ emsg = LYStrerror(errno);
+ goto report_no_connection;
+
+ report_unexpected_reply:
+ emsg = gettext("unexpected reply\n");
+ /* FALLTHRU */
+
+ report_no_connection:
+ status = HT_NO_CONNECTION;
+ /* FALLTHRU */
+
+ report_error:
+ HTAlert(emsg);
+ if (*s != -1) {
+ NETCLOSE(*s);
+ }
+
+ cleanup:
+ if (socks5_proxy != NULL) {
+ FREE(socks5_new_url);
+ FREE(socks5_protocol);
+ FREE(socks5_host);
+ }
+ FREE(host);
+ FREE(line);
+ return status;
+}
+
+/*
+ * This is interruptible so reads can be implemented cleanly.
+ */
+int HTDoRead(int fildes,
+ void *buf,
+ unsigned nbyte)
+{
+ int result;
+ BOOL ready;
+
+#if !defined(NO_IOCTL)
+ int ret;
+ fd_set readfds;
+ struct timeval select_timeout;
+ int tries = 0;
+
+#ifdef USE_READPROGRESS
+ int otries = 0;
+ time_t otime = time((time_t *) 0);
+ time_t start = otime;
+#endif
+#endif /* !NO_IOCTL */
+
+#if defined(UNIX) && !defined(__BEOS__)
+ if (fildes == 0) {
+ /*
+ * 0 can be a valid socket fd, but if it's a tty something must have
+ * gone wrong. - kw
+ */
+ if (isatty(fildes)) {
+ CTRACE((tfp, "HTDoRead - refusing to read fd 0 which is a tty!\n"));
+ return -1;
+ }
+ } else
+#endif
+ if (fildes <= 0) {
+ CTRACE((tfp, "HTDoRead - no file descriptor!\n"));
+ return -1;
+ }
+
+ if (HTWasInterrupted(&result)) {
+ CTRACE((tfp, "HTDoRead - interrupted before starting!\n"));
+ return (result);
+ }
+#if defined(NO_IOCTL)
+ ready = TRUE;
+#else
+ ready = FALSE;
+ while (!ready) {
+ /*
+ * Protect against an infinite loop.
+ */
+ if ((tries++ / TRIES_PER_SECOND) >= reading_timeout) {
+ HTAlert(gettext("Socket read failed (too many tries)."));
+ SET_EINTR;
+ result = HT_INTERRUPTED;
+ break;
+ }
+#ifdef USE_READPROGRESS
+ if (tries - otries > TRIES_PER_SECOND) {
+ time_t t = time((time_t *) 0);
+
+ otries = tries;
+ if (t - otime >= 5) {
+ otime = t;
+ HTReadProgress((off_t) (-1), (off_t) 0); /* Put "stalled" message */
+ }
+ }
+#endif
+
+ /*
+ * If we suspend, then it is possible that select will be interrupted.
+ * Allow for this possibility. - JED
+ */
+ do {
+ set_timeout(&select_timeout);
+ FD_ZERO(&readfds);
+ FD_SET((LYNX_FD) fildes, &readfds);
+#ifdef SOCKS
+ if (socks_flag)
+ ret = Rselect(fildes + 1,
+ &readfds, NULL, NULL, &select_timeout);
+ else
+#endif /* SOCKS */
+ ret = select(fildes + 1,
+ &readfds, NULL, NULL, &select_timeout);
+ } while ((ret == -1) && (errno == EINTR));
+
+ if (ret < 0) {
+ result = -1;
+ break;
+ } else if (ret > 0) {
+ ready = TRUE;
+ } else if (HTWasInterrupted(&result)) {
+ break;
+ }
+ }
+#endif /* !NO_IOCTL */
+
+ if (ready) {
+#if defined(UCX) && defined(VAXC)
+ /*
+ * VAXC and UCX problem only.
+ */
+ errno = vaxc$errno = 0;
+ result = SOCKET_READ(fildes, buf, nbyte);
+ CTRACE((tfp,
+ "Read - result,errno,vaxc$errno: %d %d %d\n", result, errno, vaxc$errno));
+ if ((result <= 0) && TRACE)
+ perror("HTTCP.C:HTDoRead:read"); /* RJF */
+ /*
+ * An errno value of EPIPE and result < 0 indicates end-of-file on VAXC.
+ */
+ if ((result <= 0) && (errno == EPIPE)) {
+ result = 0;
+ set_errno(0);
+ }
+#else
+#ifdef UNIX
+ while ((result = (int) SOCKET_READ(fildes, buf, nbyte)) == -1) {
+ if (errno == EINTR)
+ continue;
+#ifdef ERESTARTSYS
+ if (errno == ERESTARTSYS)
+ continue;
+#endif /* ERESTARTSYS */
+ HTInetStatus("read");
+ break;
+ }
+#else /* UNIX */
+ result = NETREAD(fildes, (char *) buf, nbyte);
+#endif /* !UNIX */
+#endif /* UCX && VAXC */
+ }
+#ifdef USE_READPROGRESS
+ CTRACE2(TRACE_TIMING, (tfp, "...HTDoRead returns %d (%" PRI_time_t
+ " seconds)\n",
+ result, CAST_time_t (time((time_t *)0) - start)));
+#endif
+ return result;
+}
+
+#ifdef SVR4_BSDSELECT
+/*
+ * This is a fix for the difference between BSD's select() and
+ * SVR4's select(). SVR4's select() can never return a value larger
+ * than the total number of file descriptors being checked. So, if
+ * you select for read and write on one file descriptor, and both
+ * are true, SVR4 select() will only return 1. BSD select in the
+ * same situation will return 2.
+ *
+ * Additionally, BSD select() on timing out, will zero the masks,
+ * while SVR4 does not. This is fixed here as well.
+ *
+ * Set your tabstops to 4 characters to have this code nicely formatted.
+ *
+ * Jerry Whelan, guru@bradley.edu, June 12th, 1993
+ */
+#ifdef select
+#undef select
+#endif /* select */
+
+#ifdef SOCKS
+#ifdef Rselect
+#undef Rselect
+#endif /* Rselect */
+#endif /* SOCKS */
+
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/select.h>
+
+int BSDselect(int nfds,
+ fd_set * readfds,
+ fd_set * writefds,
+ fd_set * exceptfds,
+ struct timeval *select_timeout)
+{
+ int rval, i;
+
+#ifdef SOCKS
+ if (socks_flag)
+ rval = Rselect(nfds, readfds, writefds, exceptfds, select_timeout);
+ else
+#endif /* SOCKS */
+ rval = select(nfds, readfds, writefds, exceptfds, select_timeout);
+
+ switch (rval) {
+ case -1:
+ return (rval);
+
+ case 0:
+ if (readfds != NULL)
+ FD_ZERO(readfds);
+ if (writefds != NULL)
+ FD_ZERO(writefds);
+ if (exceptfds != NULL)
+ FD_ZERO(exceptfds);
+ return (rval);
+
+ default:
+ for (i = 0, rval = 0; i < nfds; i++) {
+ if ((readfds != NULL) && FD_ISSET(i, readfds))
+ rval++;
+ if ((writefds != NULL) && FD_ISSET(i, writefds))
+ rval++;
+ if ((exceptfds != NULL) && FD_ISSET(i, exceptfds))
+ rval++;
+
+ }
+ return (rval);
+ }
+/* Should never get here */
+}
+#endif /* SVR4_BSDSELECT */
diff --git a/WWW/Library/Implementation/HTTCP.h b/WWW/Library/Implementation/HTTCP.h
new file mode 100644
index 0000000..a15b290
--- /dev/null
+++ b/WWW/Library/Implementation/HTTCP.h
@@ -0,0 +1,111 @@
+/*
+ * $LynxId: HTTCP.h,v 1.27 2018/05/16 19:48:16 tom Exp $
+ *
+ * /Net/dxcern/userd/timbl/hypertext/WWW/Library/src/HTTCP.html
+ * GENERIC TCP/IP COMMUNICATION
+ *
+ * This module has the common code for handling TCP/IP connections etc.
+ */
+#ifndef HTTCP_H
+#define HTTCP_H
+
+#ifndef HTUTILS_H
+#include <HTUtils.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+/* Produce a string for an internet address
+ * ---------------------------------------
+ *
+ * On exit:
+ * returns a pointer to a static string which must be copied if
+ * it is to be kept.
+ */
+ extern const char *HTInetString(LY_SOCKADDR * mysin);
+
+/* Encode INET status (as in sys/errno.h) inet_status()
+ * ------------------
+ *
+ * On entry:
+ * where gives a description of what caused the error
+ * global errno gives the error number in the unix way.
+ *
+ * On return:
+ * returns a negative status in the unix way.
+ */
+ extern int HTInetStatus(const char *where);
+
+/* Publicly accessible variables
+*/
+/* extern struct sockaddr_in HTHostAddress; */
+ /* The internet address of the host */
+ /* Valid after call to HTHostName() */
+
+/* Parse a cardinal value parse_cardinal()
+ * ----------------------
+ *
+ * On entry:
+ * *pp points to first character to be interpreted, terminated by
+ * non 0..9 character.
+ * *pstatus points to status already valid,
+ * maxvalue gives the largest allowable value.
+ *
+ * On exit:
+ * *pp points to first unread character,
+ * *pstatus points to status updated iff bad
+ */
+
+ extern unsigned int HTCardinal(int *pstatus,
+ char **pp,
+ unsigned int max_value);
+
+/* Check whether string is a valid Internet hostname
+ * -------------------------------------------------
+ */
+
+ extern BOOL valid_hostname(char *name);
+
+/* Resolve an internet hostname, like gethostbyname
+ * ------------------------------------------------
+ *
+ * On entry,
+ * str points to the given host name, not numeric address,
+ * without colon or port number.
+ *
+ * On exit,
+ * returns a pointer to a struct hostent in static storage,
+ * or NULL in case of error or user interruption.
+ *
+ * The interface is intended to be the same as for gethostbyname(),
+ * but additional status is returned in lynx_nsl_status.
+ */
+ extern int lynx_nsl_status;
+
+ extern BOOLEAN LYCheckHostByName(char *host);
+
+#ifdef INET6
+ extern BOOLEAN HTCheckAddrInfo(const char *str, const int defport);
+#endif
+
+/* Get Name of This Machine
+ * ------------------------
+ *
+ */
+
+ extern const char *HTHostName(void);
+
+ extern int HTDoConnect(const char *url,
+ const char *protocol,
+ int default_port,
+ int *s);
+
+ extern int HTDoRead(int fildes,
+ void *buf,
+ unsigned nbyte);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* HTTCP_H */
diff --git a/WWW/Library/Implementation/HTTP.c b/WWW/Library/Implementation/HTTP.c
new file mode 100644
index 0000000..e3c5a4a
--- /dev/null
+++ b/WWW/Library/Implementation/HTTP.c
@@ -0,0 +1,2838 @@
+/*
+ * $LynxId: HTTP.c,v 1.183 2022/04/01 00:10:19 tom Exp $
+ *
+ * HyperText Transfer Protocol - Client implementation HTTP.c
+ * ===========================
+ * Modified:
+ * 27 Jan 1994 PDM Added Ari Luotonen's Fix for Reload when using proxy
+ * servers.
+ * 28 Apr 1997 AJL,FM Do Proxy Authorisation.
+ */
+
+#include <HTUtils.h>
+#include <HTTP.h>
+#include <LYUtils.h>
+
+#ifdef USE_SSL
+#include <HTNews.h>
+#endif
+
+#define HTTP_PORT 80
+#define HTTPS_PORT 443
+#define SNEWS_PORT 563
+
+#define INIT_LINE_SIZE 1536 /* Start with line buffer this big */
+#define LINE_EXTEND_THRESH 256 /* Minimum read size */
+#define VERSION_LENGTH 20 /* for returned protocol version */
+
+#include <HTParse.h>
+#include <HTTCP.h>
+#include <HTFormat.h>
+#include <HTFile.h>
+#include <HTAlert.h>
+#include <HTMIME.h>
+#include <HTML.h>
+#include <HTInit.h>
+#include <HTAABrow.h>
+#include <HTAccess.h> /* Are we using an HTTP gateway? */
+
+#include <LYCookie.h>
+#include <LYGlobalDefs.h>
+#include <GridText.h>
+#include <LYStrings.h>
+#include <LYUtils.h>
+#include <LYrcFile.h>
+#include <LYLeaks.h>
+#include <LYCurses.h>
+
+#ifdef USE_SSL
+
+#ifdef USE_OPENSSL_INCL
+#include <openssl/x509v3.h>
+#endif
+
+#if defined(LIBRESSL_VERSION_NUMBER)
+/* OpenSSL and LibreSSL version numbers do not correspond */
+
+#if LIBRESSL_VERSION_NUMBER >= 0x2060100fL
+#define SSL_set_no_TLSV1() SSL_set_min_proto_version(handle, TLS1_1_VERSION)
+#endif
+
+#elif defined(OPENSSL_VERSION_NUMBER) && (OPENSSL_VERSION_NUMBER >= 0x10100000L)
+
+#define SSLEAY_VERSION_NUMBER OPENSSL_VERSION_NUMBER
+#undef SSL_load_error_strings
+#undef SSLeay_add_ssl_algorithms
+#define ASN1_STRING_data ASN1_STRING_get0_data
+#define TLS_client_method() SSLv23_client_method()
+#define SSL_load_error_strings() /* nothing */
+#define SSLeay_add_ssl_algorithms() /* nothing */
+#define SSL_set_no_TLSV1() SSL_set_min_proto_version(handle, TLS1_1_VERSION)
+
+#elif defined(SSLEAY_VERSION_NUMBER)
+
+#define TLS_client_method() SSLv23_client_method()
+
+#endif
+
+#ifndef SSL_set_no_TLSV1
+#define SSL_set_no_TLSV1() SSL_set_options(handle, SSL_OP_NO_TLSv1)
+#endif
+
+#ifdef USE_GNUTLS_INCL
+#include <gnutls/x509.h>
+#endif
+
+#endif /* USE_SSL */
+
+BOOLEAN reloading = FALSE; /* Reloading => send no-cache pragma to proxy */
+char *redirecting_url = NULL; /* Location: value. */
+BOOL permanent_redirection = FALSE; /* Got 301 status? */
+BOOL redirect_post_content = FALSE; /* Don't convert to GET? */
+
+#ifdef USE_SSL
+SSL_CTX *ssl_ctx = NULL; /* SSL ctx */
+SSL *SSL_handle = NULL;
+static int ssl_okay;
+
+static void free_ssl_ctx(void)
+{
+ if (ssl_ctx != NULL)
+ SSL_CTX_free(ssl_ctx);
+}
+
+static BOOL needs_limit(const char *actual)
+{
+ return ((int) strlen(actual) > LYcols - 7) ? TRUE : FALSE;
+}
+
+static char *limited_string(const char *source, const char *actual)
+{
+ int limit = ((int) strlen(source)
+ - ((int) strlen(actual) - (LYcols - 10)));
+ char *temp = NULL;
+
+ StrAllocCopy(temp, source);
+ if (limit < 0)
+ limit = 0;
+ strcpy(temp + limit, "...");
+ return temp;
+}
+
+/*
+ * If the error message is too long to fit in the line, truncate that to fit
+ * within the limits for prompting.
+ */
+static void SSL_single_prompt(char **target, const char *source)
+{
+ HTSprintf0(target, SSL_FORCED_PROMPT, source);
+ if (needs_limit(*target)) {
+ char *temp = limited_string(source, *target);
+
+ *target = NULL;
+ HTSprintf0(target, SSL_FORCED_PROMPT, temp);
+ free(temp);
+ }
+}
+
+static void SSL_double_prompt(char **target, const char *format, const char
+ *arg1, const char *arg2)
+{
+ HTSprintf0(target, format, arg1, arg2);
+ if (needs_limit(*target)) {
+ char *parg2 = limited_string(arg2, *target);
+
+ *target = NULL;
+ HTSprintf0(target, format, arg1, parg2);
+ if (needs_limit(*target)) {
+ char *parg1 = limited_string(arg1, *target);
+
+ *target = NULL;
+ HTSprintf0(target, format, parg1, parg2);
+ free(parg1);
+ }
+ free(parg2);
+ }
+}
+
+static int HTSSLCallback(int preverify_ok, X509_STORE_CTX * x509_ctx GCC_UNUSED)
+{
+ char *msg = NULL;
+ int result = 1;
+
+#ifdef USE_X509_SUPPORT
+ HTSprintf0(&msg,
+ gettext("SSL callback:%s, preverify_ok=%d, ssl_okay=%d"),
+ X509_verify_cert_error_string((long) X509_STORE_CTX_get_error(x509_ctx)),
+ preverify_ok, ssl_okay);
+ _HTProgress(msg);
+ FREE(msg);
+#endif
+
+#ifndef USE_NSS_COMPAT_INCL
+ if (!(preverify_ok || ssl_okay || ssl_noprompt)) {
+#ifdef USE_X509_SUPPORT
+ SSL_single_prompt(&msg,
+ X509_verify_cert_error_string((long)
+ X509_STORE_CTX_get_error(x509_ctx)));
+ if (HTForcedPrompt(ssl_noprompt, msg, NO))
+ ssl_okay = 1;
+ else
+ result = 0;
+#endif
+
+ FREE(msg);
+ }
+#endif
+ return result;
+}
+
+SSL *HTGetSSLHandle(void)
+{
+#ifdef USE_GNUTLS_INCL
+ static char *certfile = NULL;
+#endif
+ static char *client_keyfile = NULL;
+ static char *client_certfile = NULL;
+
+ if (ssl_ctx == NULL) {
+ /*
+ * First time only.
+ */
+#if SSLEAY_VERSION_NUMBER < 0x0800
+ if ((ssl_ctx = SSL_CTX_new()) != NULL) {
+ X509_set_default_verify_paths(ssl_ctx->cert);
+ }
+#else
+ SSLeay_add_ssl_algorithms();
+ if ((ssl_ctx = SSL_CTX_new(TLS_client_method())) != NULL) {
+#ifdef SSL_OP_NO_SSLv2
+ SSL_CTX_set_options(ssl_ctx, SSL_OP_ALL | SSL_OP_NO_SSLv2);
+#else
+ SSL_CTX_set_options(ssl_ctx, SSL_OP_ALL);
+#endif
+#ifdef SSL_OP_NO_COMPRESSION
+ SSL_CTX_set_options(ssl_ctx, SSL_OP_NO_COMPRESSION);
+#endif
+#ifdef SSL_MODE_AUTO_RETRY
+ SSL_CTX_set_mode(ssl_ctx, SSL_MODE_AUTO_RETRY);
+#endif
+#ifdef SSL_MODE_RELEASE_BUFFERS
+ SSL_CTX_set_mode(ssl_ctx, SSL_MODE_RELEASE_BUFFERS);
+#endif
+ SSL_CTX_set_default_verify_paths(ssl_ctx);
+ SSL_CTX_set_verify(ssl_ctx, SSL_VERIFY_PEER, HTSSLCallback);
+ }
+#endif /* SSLEAY_VERSION_NUMBER < 0x0800 */
+#if defined(USE_PROGRAM_DIR) & !defined(USE_GNUTLS_INCL)
+ if (ssl_ctx != NULL) {
+ X509_LOOKUP *lookup;
+
+ lookup = X509_STORE_add_lookup(ssl_ctx->cert_store,
+ X509_LOOKUP_file());
+ if (lookup != NULL) {
+ char *certfile = NULL;
+
+ HTSprintf0(&certfile, "%s\\cert.pem", program_dir);
+ X509_LOOKUP_load_file(lookup, certfile, X509_FILETYPE_PEM);
+ FREE(certfile);
+ }
+ }
+#endif
+#ifdef USE_GNUTLS_INCL
+ if ((certfile = LYGetEnv("SSL_CERT_FILE")) != NULL) {
+ CTRACE((tfp,
+ "HTGetSSLHandle: certfile is set to %s by SSL_CERT_FILE\n",
+ certfile));
+ } else {
+ if (non_empty(SSL_cert_file)) {
+ certfile = SSL_cert_file;
+ CTRACE((tfp,
+ "HTGetSSLHandle: certfile is set to %s by config SSL_CERT_FILE\n",
+ certfile));
+ }
+#if defined(USE_PROGRAM_DIR)
+ else {
+ HTSprintf0(&(certfile), "%s\\cert.pem", program_dir);
+ CTRACE((tfp,
+ "HTGetSSLHandle: certfile is set to %s by installed directory\n", certfile));
+ }
+#endif
+ }
+#endif
+ atexit(free_ssl_ctx);
+ }
+
+ if (non_empty(SSL_client_key_file)) {
+ client_keyfile = SSL_client_key_file;
+ CTRACE((tfp,
+ "HTGetSSLHandle: client key file is set to %s by config SSL_CLIENT_KEY_FILE\n",
+ client_keyfile));
+ }
+
+ if (non_empty(SSL_client_cert_file)) {
+ client_certfile = SSL_client_cert_file;
+ CTRACE((tfp,
+ "HTGetSSLHandle: client cert file is set to %s by config SSL_CLIENT_CERT_FILE\n",
+ client_certfile));
+ }
+#ifdef USE_GNUTLS_INCL
+ ssl_ctx->certfile = certfile;
+ ssl_ctx->certfile_type = GNUTLS_X509_FMT_PEM;
+ ssl_ctx->client_keyfile = client_keyfile;
+ ssl_ctx->client_keyfile_type = GNUTLS_X509_FMT_PEM;
+ ssl_ctx->client_certfile = client_certfile;
+ ssl_ctx->client_certfile_type = GNUTLS_X509_FMT_PEM;
+#elif SSLEAY_VERSION_NUMBER >= 0x0930
+ if (client_certfile != NULL) {
+ if (client_keyfile == NULL) {
+ client_keyfile = client_certfile;
+ }
+ SSL_CTX_use_certificate_chain_file(ssl_ctx, client_certfile);
+ SSL_CTX_use_PrivateKey_file(ssl_ctx, client_keyfile, SSL_FILETYPE_PEM);
+ }
+#endif
+ ssl_okay = 0;
+ return (SSL_new(ssl_ctx));
+}
+
+void HTSSLInitPRNG(void)
+{
+#if SSLEAY_VERSION_NUMBER >= 0x00905100
+ if (RAND_status() == 0) {
+ char rand_file[256];
+ time_t t;
+ long l, seed;
+
+#ifndef _WINDOWS
+ pid_t pid;
+
+#else
+ DWORD pid;
+#endif
+
+ t = time(NULL);
+
+#ifndef _WINDOWS
+ pid = getpid();
+#else
+ pid = GetCurrentThreadId();
+#endif
+
+ RAND_file_name(rand_file, 256L);
+ CTRACE((tfp, "HTTP: Seeding PRNG\n"));
+ /* Seed as much as 1024 bytes from RAND_file_name */
+ RAND_load_file(rand_file, 1024L);
+ /* Seed in time (mod_ssl does this) */
+ RAND_seed((unsigned char *) &t, (int) sizeof(time_t));
+
+ /* Seed in pid (mod_ssl does this) */
+ RAND_seed((unsigned char *) &pid, (int) sizeof(pid));
+ /* Initialize system's random number generator */
+ RAND_bytes((unsigned char *) &seed, (int) sizeof(long));
+
+ lynx_srand((unsigned) seed);
+ while (RAND_status() == 0) {
+ /* Repeatedly seed the PRNG using the system's random number generator until it has been seeded with enough data */
+ l = (long) lynx_rand();
+ RAND_seed((unsigned char *) &l, (int) sizeof(long));
+ }
+ /* Write a rand_file */
+ RAND_write_file(rand_file);
+ }
+#endif /* SSLEAY_VERSION_NUMBER >= 0x00905100 */
+ return;
+}
+
+#define HTTP_NETREAD(sock, buff, size, handle) \
+ (handle \
+ ? SSL_read(handle, buff, size) \
+ : NETREAD(sock, buff, size))
+
+#define HTTP_NETWRITE(sock, buff, size, handle) \
+ (handle \
+ ? SSL_write(handle, buff, size) \
+ : NETWRITE(sock, buff, size))
+
+#define HTTP_NETCLOSE(sock, handle) \
+ { (void)NETCLOSE(sock); \
+ if (handle) \
+ SSL_free(handle); \
+ SSL_handle = handle = NULL; \
+ }
+
+#else
+#define HTTP_NETREAD(a, b, c, d) NETREAD(a, b, c)
+#define HTTP_NETWRITE(a, b, c, d) NETWRITE(a, b, c)
+#define HTTP_NETCLOSE(a, b) (void)NETCLOSE(a)
+#endif /* USE_SSL */
+
+#ifdef _WINDOWS /* 1997/11/06 (Thu) 13:00:08 */
+
+#define BOX_TITLE "Lynx " __FILE__
+#define BOX_FLAG (MB_ICONINFORMATION | MB_SETFOREGROUND)
+
+typedef struct {
+ int fd;
+ char *buf;
+ int len;
+} recv_data_t;
+
+int ws_read_per_sec = 0;
+static int ws_errno = 0;
+
+static DWORD g_total_times = 0;
+static DWORD g_total_bytes = 0;
+
+/* The same like read, but takes care of EINTR and uses select to
+ timeout the stale connections. */
+
+static int ws_read(int fd, char *buf, int len)
+{
+ int res;
+ int retry = 3;
+
+ do {
+ res = recv(fd, buf, len, 0);
+ if (WSAEWOULDBLOCK == WSAGetLastError()) {
+ Sleep(100);
+ if (retry-- > 0)
+ continue;
+ }
+ } while (res == SOCKET_ERROR && SOCKET_ERRNO == EINTR);
+
+ return res;
+}
+
+#define DWORD_ERR ((DWORD)-1)
+
+static DWORD __stdcall _thread_func(void *p)
+{
+ DWORD result;
+ int i, val;
+ recv_data_t *q = (recv_data_t *) p;
+
+ i = 0;
+ i++;
+ val = ws_read(q->fd, q->buf, q->len);
+
+ if (val == SOCKET_ERROR) {
+ ws_errno = WSAGetLastError();
+#if 0
+ char buff[256];
+
+ sprintf(buff, "Thread read: %d, error (%ld), fd = %d, len = %d",
+ i, ws_errno, q->fd, q->len);
+ MessageBox(NULL, buff, BOX_TITLE, BOX_FLAG);
+#endif
+ result = DWORD_ERR;
+ } else {
+ result = val;
+ }
+
+ return result;
+}
+
+/* The same like read, but takes care of EINTR and uses select to
+ timeout the stale connections. */
+
+int ws_netread(int fd, char *buf, int len)
+{
+ int i;
+ char buff[256];
+
+ /* 1998/03/30 (Mon) 09:01:21 */
+ HANDLE hThread;
+ DWORD dwThreadID;
+ DWORD exitcode = 0;
+ DWORD ret_val = DWORD_ERR;
+ DWORD val, process_time, now_TickCount, save_TickCount;
+
+ static recv_data_t para;
+
+#define TICK 5
+#define STACK_SIZE 0x2000uL
+
+ EnterCriticalSection(&critSec_READ);
+
+ para.fd = fd;
+ para.buf = buf;
+ para.len = len;
+
+ ws_read_per_sec = 0;
+ save_TickCount = GetTickCount();
+
+ hThread = CreateThread(NULL, STACK_SIZE,
+ _thread_func,
+ (void *) &para, 0UL, &dwThreadID);
+
+ if (hThread == 0) {
+ HTInfoMsg("CreateThread Failed (read)");
+ goto read_exit;
+ }
+
+ i = 0;
+ while (1) {
+ val = WaitForSingleObject(hThread, 1000 / TICK);
+ i++;
+ if (val == WAIT_FAILED) {
+ HTInfoMsg("Wait Failed");
+ ret_val = DWORD_ERR;
+ break;
+ } else if (val == WAIT_TIMEOUT) {
+ i++;
+ if (i / TICK > (AlertSecs + 2)) {
+ sprintf(buff, "Read Waiting (%2d.%01d) for %d Bytes",
+ i / TICK, (i % TICK) * 10 / TICK, len);
+ SetConsoleTitle(buff);
+ }
+ if (win32_check_interrupt() || ((i / TICK) > lynx_timeout)) {
+ if (CloseHandle(hThread) == FALSE) {
+ HTInfoMsg("Thread terminate Failed");
+ }
+ WSASetLastError(ETIMEDOUT);
+ ret_val = HT_INTERRUPTED;
+ break;
+ }
+ } else if (val == WAIT_OBJECT_0) {
+ if (GetExitCodeThread(hThread, &exitcode) == FALSE) {
+ exitcode = DWORD_ERR;
+ }
+ if (CloseHandle(hThread) == FALSE) {
+ HTInfoMsg("Thread terminate Failed");
+ }
+ now_TickCount = GetTickCount();
+ if (now_TickCount >= save_TickCount)
+ process_time = now_TickCount - save_TickCount;
+ else
+ process_time = now_TickCount + (0xffffffff - save_TickCount);
+
+ if (process_time == 0)
+ process_time = 1;
+ g_total_times += process_time;
+
+ /*
+ * DWORD is unsigned, and could be an error code which is signed.
+ */
+ if ((long) exitcode > 0)
+ g_total_bytes += exitcode;
+
+ ws_read_per_sec = g_total_bytes;
+ if (ws_read_per_sec > 2000000) {
+ if (g_total_times > 1000)
+ ws_read_per_sec /= (g_total_times / 1000);
+ } else {
+ ws_read_per_sec *= 1000;
+ ws_read_per_sec /= g_total_times;
+ }
+
+ ret_val = exitcode;
+ break;
+ }
+ } /* end while(1) */
+
+ read_exit:
+ LeaveCriticalSection(&critSec_READ);
+ return ret_val;
+}
+#endif /* _WINDOWS */
+
+/*
+ * RFC-1738 says we can have user/password using these ASCII characters
+ * safe = "$" | "-" | "_" | "." | "+"
+ * extra = "!" | "*" | "'" | "(" | ")" | ","
+ * hex = digit | "A" | "B" | "C" | "D" | "E" | "F" |
+ * "a" | "b" | "c" | "d" | "e" | "f"
+ * escape = "%" hex hex
+ * unreserved = alpha | digit | safe | extra
+ * uchar = unreserved | escape
+ * user = *[ uchar | ";" | "?" | "&" | "=" ]
+ * password = *[ uchar | ";" | "?" | "&" | "=" ]
+ * and we cannot have a password without user, i.e., no leading ":"
+ * and ":", "@", "/" must be encoded, i.e., will not appear as such.
+ *
+ * However, in a URL
+ * //<user>:<password>@<host>:<port>/<url-path>
+ * valid characters in the host are different, not allowing most of those
+ * punctuation characters.
+ *
+ * RFC-3986 amends this, using
+ * userinfo = *( unreserved / pct-encoded / sub-delims / ":" )
+ * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
+ * reserved = gen-delims / sub-delims
+ * gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"
+ * sub-delims = "!" / "$" / "&" / "'" / "(" / ")"
+ * / "*" / "+" / "," / ";" / "="
+ * and
+ * host = IP-literal / IPv4address / reg-name
+ * reg-name = *( unreserved / pct-encoded / sub-delims )
+ */
+char *HTSkipToAt(char *host, int *gen_delims)
+{
+ char *result = 0;
+ char *s = host;
+ int pass = 0;
+ int ch;
+ int last = -1;
+
+ *gen_delims = 0;
+ while ((ch = UCH(*s)) != '\0') {
+ if (ch == ':') {
+ if (pass++)
+ break;
+ } else if (ch == '@') {
+ if (s != host && last != ':')
+ result = s;
+ break;
+ } else if (RFC_3986_GEN_DELIMS(ch)) {
+ *gen_delims += 1;
+ if (!RFC_3986_GEN_DELIMS(s[1]))
+ break;
+ } else if (ch == '%') {
+ if (!(isxdigit(UCH(s[1])) && isxdigit(UCH(s[2]))))
+ break;
+ } else if (!(RFC_3986_UNRESERVED(ch) ||
+ RFC_3986_SUB_DELIMS(ch))) {
+ break;
+ }
+ ++s;
+ last = ch;
+ }
+ return result;
+}
+
+static char *fake_hostname(char *auth)
+{
+ char *result = NULL;
+ char *colon = NULL;
+
+ StrAllocCopy(result, auth);
+ if ((colon = strchr(result, ':')) != 0)
+ *colon = '\0';
+ if (strchr(result, '.') == 0)
+ FREE(result);
+ return result;
+}
+
+/*
+ * Strip any username from the given string so we retain only the host.
+ */
+void strip_userid(char *host, int parse_only)
+{
+ int gen_delims = 0;
+ char *p1 = host;
+ char *p2 = HTSkipToAt(host, &gen_delims);
+
+ if (p2 != 0) {
+ char *msg = NULL;
+ char *auth = NULL;
+ char *fake = NULL;
+ char *p3 = p2;
+ int sub_delims = 0;
+ int my_delimit = UCH(*p2);
+ int do_trimming = (my_delimit == '@');
+
+ *p2++ = '\0';
+
+ StrAllocCopy(auth, host);
+
+ /*
+ * Trailing "gen-delims" demonstrates that there is no user/password.
+ */
+ while ((p3 != host) && RFC_3986_GEN_DELIMS(p3[-1])) {
+ *(--p3) = '\0';
+ }
+ /*
+ * While legal, punctuation-only user/password is questionable.
+ */
+ while ((p3 != host) && RFC_3986_SUB_DELIMS(p3[-1])) {
+ ++sub_delims;
+ *(--p3) = '\0';
+ }
+ /*
+ * Trim trailing "gen-delims" from the real hostname.
+ */
+ for (p3 = p2; *p3 != '\0'; ++p3) {
+ if (RFC_3986_GEN_DELIMS(*p3)) {
+ *p3 = '\0';
+ break;
+ }
+ }
+ CTRACE((tfp, "trim auth: result:`%s'\n", host));
+
+ if (gen_delims || strcmp(host, auth)) {
+ do_trimming = !gen_delims;
+ }
+ if (*host == '\0' && sub_delims) {
+ HTSprintf0(&msg,
+ gettext("User/password contains only punctuation: %s"),
+ auth);
+ } else if ((fake = fake_hostname(host)) != NULL) {
+ HTSprintf0(&msg,
+ gettext("User/password may be confused with hostname: '%s' (e.g, '%s')"),
+ auth, fake);
+ }
+ if (msg != 0 && !parse_only)
+ HTAlert(msg);
+ if (do_trimming) {
+ while ((*p1++ = *p2++) != '\0') {
+ ;
+ }
+ CTRACE((tfp, "trim host: result:`%s'\n", host));
+ }
+ FREE(fake);
+ FREE(auth);
+ FREE(msg);
+ }
+}
+
+/*
+ * Check if the user's options specified to use the given encoding. Normally
+ * all encodings with compiled-in support are specified (encodingALL).
+ */
+static BOOL acceptEncoding(int code)
+{
+ BOOL result = FALSE;
+
+ if ((code & LYAcceptEncoding) != 0) {
+ const char *program = 0;
+
+ switch (code) {
+ case encodingGZIP:
+ program = HTGetProgramPath(ppGZIP);
+ break;
+ case encodingDEFLATE:
+ program = HTGetProgramPath(ppINFLATE);
+ break;
+ case encodingCOMPRESS:
+ program = HTGetProgramPath(ppCOMPRESS);
+ break;
+ case encodingBZIP2:
+ program = HTGetProgramPath(ppBZIP2);
+ break;
+ case encodingBROTLI:
+ program = HTGetProgramPath(ppBROTLI);
+ break;
+ default:
+ break;
+ }
+ /*
+ * FIXME: if lynx did not rely upon external programs to decompress
+ * files for external viewers, this check could be relaxed.
+ */
+ result = (BOOL) (program != 0);
+ }
+ return result;
+}
+
+#ifdef USE_SSL
+static void show_cert_issuer(X509 * peer_cert GCC_UNUSED)
+{
+#if defined(USE_OPENSSL_INCL) || defined(USE_GNUTLS_FUNCS)
+ char ssl_dn[1024];
+ char *msg = NULL;
+
+ X509_NAME_oneline(X509_get_issuer_name(peer_cert), ssl_dn, (int) sizeof(ssl_dn));
+ HTSprintf0(&msg, gettext("Certificate issued by: %s"), ssl_dn);
+ _HTProgress(msg);
+ FREE(msg);
+#elif defined(USE_GNUTLS_INCL)
+ /* the OpenSSL "compat" code compiles but dumps core with GNU TLS */
+#endif
+}
+#endif
+
+/*
+ * Remove IPv6 brackets (and any port-number) from the given host-string.
+ */
+#ifdef USE_SSL
+static char *StripIpv6Brackets(char *host)
+{
+ int port_number;
+ char *p;
+
+ if ((p = HTParsePort(host, &port_number)) != 0)
+ *p = '\0';
+
+ if (*host == '[') {
+ p = host + strlen(host) - 1;
+ if (*p == ']') {
+ *p = '\0';
+ for (p = host; (p[0] = p[1]) != '\0'; ++p) {
+ ; /* EMPTY */
+ }
+ }
+ }
+ return host;
+}
+#endif
+
+/*
+ * Remove user/password, if any, from the given host-string.
+ */
+#ifdef USE_SSL
+static char *StripUserAuthents(char *host)
+{
+ char *p = strchr(host, '@');
+
+ if (p != NULL) {
+ char *q = host;
+
+ while ((*q++ = *++p) != '\0') ;
+ }
+ return host;
+}
+#endif
+
+/* Load Document from HTTP Server HTLoadHTTP()
+ * ==============================
+ *
+ * Given a hypertext address, this routine loads a document.
+ *
+ *
+ * On entry,
+ * arg is the hypertext reference of the article to be loaded.
+ *
+ * On exit,
+ * returns >=0 If no error, a good socket number
+ * <0 Error.
+ *
+ * The socket must be closed by the caller after the document has been
+ * read.
+ *
+ */
+static int HTLoadHTTP(const char *arg,
+ HTParentAnchor *anAnchor,
+ HTFormat format_out,
+ HTStream *sink)
+{
+ static char empty[1];
+ int s; /* Socket number for returned data */
+ const char *url = arg; /* The URL which get_physical() returned */
+ bstring *command = NULL; /* The whole command */
+ char *eol; /* End of line if found */
+ char *start_of_data; /* Start of body of reply */
+ int status; /* tcp return */
+ off_t bytes_already_read;
+ char crlf[3]; /* A CR LF equivalent string */
+ HTStream *target; /* Unconverted data */
+ HTFormat format_in; /* Format arriving in the message */
+ BOOL do_head = FALSE; /* Whether or not we should do a head */
+ BOOL do_post = FALSE; /* ARE WE posting ? */
+ const char *METHOD;
+
+ char *line_buffer = NULL;
+ char *line_kept_clean = NULL;
+
+#ifdef SH_EX /* FIX BUG by kaz@maczuka.hitachi.ibaraki.jp */
+ int real_length_of_line = 0;
+#endif
+ BOOL extensions; /* Assume good HTTP server */
+ char *linebuf = NULL;
+ char temp[80];
+ BOOL first_Accept = TRUE;
+ BOOL show_401 = FALSE;
+ BOOL show_407 = FALSE;
+ BOOL auth_proxy = NO; /* Generate a proxy authorization. - AJL */
+
+ int length, rawlength, rv;
+ int server_status = 0;
+ BOOL doing_redirect, already_retrying = FALSE;
+ int len = 0;
+
+#ifdef USE_SSL
+ unsigned long SSLerror;
+ BOOL do_connect = FALSE; /* ARE WE going to use a proxy tunnel ? */
+ BOOL did_connect = FALSE; /* ARE WE actually using a proxy tunnel ? */
+ const char *connect_url = NULL; /* The URL being proxied */
+ char *connect_host = NULL; /* The host being proxied */
+ SSL *handle = NULL; /* The SSL handle */
+ X509 *peer_cert; /* The peer certificate */
+ char ssl_dn[1024];
+ char *cert_host;
+ char *ssl_host;
+ char *p;
+ char *msg = NULL;
+ int status_sslcertcheck;
+ char *ssl_dn_start;
+ char *ssl_all_cns = NULL;
+
+#ifdef USE_GNUTLS_INCL
+ int ret;
+ unsigned tls_status;
+#endif
+
+#if (SSLEAY_VERSION_NUMBER >= 0x0900) && !defined(USE_GNUTLS_FUNCS)
+ BOOL try_tls = TRUE;
+#endif /* SSLEAY_VERSION_NUMBER >= 0x0900 */
+ SSL_handle = NULL;
+#else
+ void *handle = NULL;
+#endif /* USE_SSL */
+
+ if (anAnchor->isHEAD)
+ do_head = TRUE;
+ else if (anAnchor->post_data)
+ do_post = TRUE;
+
+ if (!url) {
+ status = -3;
+ _HTProgress(BAD_REQUEST);
+ goto done;
+ }
+ if (!*url) {
+ status = -2;
+ _HTProgress(BAD_REQUEST);
+ goto done;
+ }
+#ifdef USE_SSL
+ if (using_proxy && !StrNCmp(url, "http://", 7)) {
+ int portnumber;
+
+ if ((connect_url = strstr((url + 7), "https://"))) {
+ do_connect = TRUE;
+ connect_host = HTParse(connect_url, "https", PARSE_HOST);
+ if (!HTParsePort(connect_host, &portnumber)) {
+ sprintf(temp, ":%d", HTTPS_PORT);
+ StrAllocCat(connect_host, temp);
+ }
+ CTRACE((tfp, "HTTP: connect_url = '%s'\n", connect_url));
+ CTRACE((tfp, "HTTP: connect_host = '%s'\n", connect_host));
+ } else if ((connect_url = strstr((url + 7), "snews://"))) {
+ do_connect = TRUE;
+ connect_host = HTParse(connect_url, "snews", PARSE_HOST);
+ if (!HTParsePort(connect_host, &portnumber)) {
+ sprintf(temp, ":%d", SNEWS_PORT);
+ StrAllocCat(connect_host, temp);
+ }
+ CTRACE((tfp, "HTTP: connect_url = '%s'\n", connect_url));
+ CTRACE((tfp, "HTTP: connect_host = '%s'\n", connect_host));
+ }
+ }
+#endif /* USE_SSL */
+
+ sprintf(crlf, "%c%c", CR, LF);
+
+ /*
+ * At this point, we're talking HTTP/1.0.
+ */
+ extensions = YES;
+
+ try_again:
+ /*
+ * All initializations are moved down here from up above, so we can start
+ * over here...
+ */
+ eol = 0;
+ length = 0;
+ doing_redirect = FALSE;
+ permanent_redirection = FALSE;
+ redirect_post_content = FALSE;
+ target = NULL;
+ line_buffer = NULL;
+ line_kept_clean = NULL;
+
+#ifdef USE_SSL
+ if (!StrNCmp(url, "https", 5))
+ status = HTDoConnect(url, "HTTPS", HTTPS_PORT, &s);
+ else
+ status = HTDoConnect(url, "HTTP", HTTP_PORT, &s);
+#else
+ if (!StrNCmp(url, "https", 5)) {
+ HTAlert(gettext("This client does not contain support for HTTPS URLs."));
+ status = HT_NOT_LOADED;
+ goto done;
+ }
+ status = HTDoConnect(arg, "HTTP", HTTP_PORT, &s);
+#endif /* USE_SSL */
+ if (status == HT_INTERRUPTED) {
+ /*
+ * Interrupt cleanly.
+ */
+ CTRACE((tfp, "HTTP: Interrupted on connect; recovering cleanly.\n"));
+ _HTProgress(CONNECTION_INTERRUPTED);
+ status = HT_NOT_LOADED;
+ goto done;
+ }
+ if (status < 0) {
+#ifdef _WINDOWS
+ CTRACE((tfp, "HTTP: Unable to connect to remote host for `%s'\n"
+ " (status = %d, sock_errno = %d).\n",
+ url, status, SOCKET_ERRNO));
+#else
+ CTRACE((tfp,
+ "HTTP: Unable to connect to remote host for `%s' (errno = %d).\n",
+ url, SOCKET_ERRNO));
+#endif
+ HTAlert(gettext("Unable to connect to remote host."));
+ status = HT_NOT_LOADED;
+ goto done;
+ }
+#ifdef USE_SSL
+ use_tunnel:
+ /*
+ * If this is an https document, then do the SSL stuff here.
+ */
+ if (did_connect || !StrNCmp(url, "https", 5)) {
+ SSL_handle = handle = HTGetSSLHandle();
+ SSL_set_fd(handle, s);
+ /* get host we're connecting to */
+ ssl_host = HTParse(url, "", PARSE_HOST);
+ ssl_host = StripIpv6Brackets(ssl_host);
+ ssl_host = StripUserAuthents(ssl_host);
+#if defined(USE_GNUTLS_FUNCS)
+ ret = gnutls_server_name_set(handle->gnutls_state,
+ GNUTLS_NAME_DNS,
+ ssl_host, strlen(ssl_host));
+ CTRACE((tfp, "...called gnutls_server_name_set(%s) ->%d\n", ssl_host, ret));
+#elif SSLEAY_VERSION_NUMBER >= 0x0900
+#ifndef USE_NSS_COMPAT_INCL
+ if (!try_tls) {
+ SSL_set_no_TLSV1();
+ CTRACE((tfp, "...adding SSL_OP_NO_TLSv1\n"));
+ }
+#if OPENSSL_VERSION_NUMBER >= 0x0090806fL && !defined(OPENSSL_NO_TLSEXT)
+ else {
+ int ret = (int) SSL_set_tlsext_host_name(handle, ssl_host);
+
+ CTRACE((tfp, "...called SSL_set_tlsext_host_name(%s) ->%d\n",
+ ssl_host, ret));
+ }
+#endif
+#endif
+#endif /* SSLEAY_VERSION_NUMBER >= 0x0900 */
+ HTSSLInitPRNG();
+ status = SSL_connect(handle);
+
+ if (status <= 0) {
+#if (SSLEAY_VERSION_NUMBER >= 0x0900)
+#if !defined(USE_GNUTLS_FUNCS)
+ if (try_tls) {
+ _HTProgress(gettext("Retrying connection without TLS."));
+ try_tls = FALSE;
+ if (did_connect)
+ HTTP_NETCLOSE(s, handle);
+ goto try_again;
+ } else
+#endif
+ {
+ CTRACE((tfp,
+ "HTTP: Unable to complete SSL handshake for '%s', SSL_connect=%d, SSL error stack dump follows\n",
+ url, status));
+ SSL_load_error_strings();
+ while ((SSLerror = ERR_get_error()) != 0) {
+ CTRACE((tfp, "HTTP: SSL: %s\n", ERR_error_string(SSLerror, NULL)));
+ }
+ HTAlert("Unable to make secure connection to remote host.");
+ if (did_connect)
+ HTTP_NETCLOSE(s, handle);
+ status = HT_NOT_LOADED;
+ goto done;
+ }
+#else
+ unsigned long SSLerror;
+
+ CTRACE((tfp,
+ "HTTP: Unable to complete SSL handshake for '%s', SSL_connect=%d, SSL error stack dump follows\n",
+ url, status));
+ SSL_load_error_strings();
+ while ((SSLerror = ERR_get_error()) != 0) {
+ CTRACE((tfp, "HTTP: SSL: %s\n", ERR_error_string(SSLerror, NULL)));
+ }
+ HTAlert("Unable to make secure connection to remote host.");
+ if (did_connect)
+ HTTP_NETCLOSE(s, handle);
+ status = HT_NOT_LOADED;
+ goto done;
+#endif /* SSLEAY_VERSION_NUMBER >= 0x0900 */
+ }
+#ifdef USE_GNUTLS_INCL
+ gnutls_certificate_set_verify_flags(handle->gnutls_cred,
+ GNUTLS_VERIFY_DO_NOT_ALLOW_SAME |
+ GNUTLS_VERIFY_ALLOW_X509_V1_CA_CRT);
+ ret = gnutls_certificate_verify_peers2(handle->gnutls_state, &tls_status);
+ if (ret < 0 || tls_status != 0) {
+ int flag_continue = 1;
+
+#if GNUTLS_VERSION_NUMBER >= 0x030104
+ int type;
+ gnutls_datum_t out;
+
+ if (ret < 0) {
+ SSL_single_prompt(&msg,
+ gettext("GnuTLS error when trying to verify certificate."));
+ } else {
+ type = gnutls_certificate_type_get(handle->gnutls_state);
+ (void) gnutls_certificate_verification_status_print(tls_status,
+ type,
+ &out, 0);
+ SSL_single_prompt(&msg, (const char *) out.data);
+ gnutls_free(out.data);
+ }
+#else
+ char *msg2;
+
+ if (ret == 0 && tls_status & GNUTLS_CERT_SIGNER_NOT_FOUND) {
+ msg2 = gettext("the certificate has no known issuer");
+ } else if (tls_status & GNUTLS_CERT_SIGNER_NOT_FOUND) {
+ msg2 = gettext("no issuer was found");
+ } else if (tls_status & GNUTLS_CERT_SIGNER_NOT_CA) {
+ msg2 = gettext("issuer is not a CA");
+ } else if (tls_status & GNUTLS_CERT_REVOKED) {
+ msg2 = gettext("the certificate has been revoked");
+ } else {
+ msg2 = gettext("the certificate is not trusted");
+ }
+ SSL_single_prompt(&msg, msg2);
+#endif
+ CTRACE((tfp, "HTLoadHTTP: %s\n", msg));
+ if (!ssl_noprompt) {
+ if (!HTForcedPrompt(ssl_noprompt, msg, NO)) {
+ flag_continue = 0;
+ }
+ } else if (ssl_noprompt == FORCE_PROMPT_NO) {
+ flag_continue = 0;
+ }
+ FREE(msg);
+ if (flag_continue == 0) {
+ status = HT_NOT_LOADED;
+ FREE(msg);
+ goto done;
+ }
+ }
+#endif
+
+ peer_cert = (X509 *) SSL_get_peer_certificate(handle);
+#if defined(USE_OPENSSL_INCL) || defined(USE_GNUTLS_FUNCS)
+ X509_NAME_oneline(X509_get_subject_name(peer_cert),
+ ssl_dn, (int) sizeof(ssl_dn));
+#elif defined(USE_GNUTLS_INCL)
+ X509_NAME_oneline(X509_get_subject_name(peer_cert),
+ ssl_dn + 1, (int) sizeof(ssl_dn) - 1);
+
+ /* Iterate over DN in incompatible GnuTLS format to bring it into OpenSSL format */
+ ssl_dn[0] = '/';
+ ssl_dn_start = ssl_dn;
+ while (*ssl_dn_start) {
+ if ((*ssl_dn_start == ',') && (*(ssl_dn_start + 1) == ' ')) {
+ *ssl_dn_start++ = '/';
+ if (*(p = ssl_dn_start) != 0) {
+ while ((p[0] = p[1]) != 0)
+ ++p;
+ }
+ } else {
+ ssl_dn_start++;
+ }
+ }
+#endif
+
+ /*
+ * X.509 DN validation taking ALL CN fields into account
+ * (c) 2006 Thorsten Glaser <tg@mirbsd.de>
+ */
+
+ /* initialise status information */
+ status_sslcertcheck = 0; /* 0 = no CN found in DN */
+ ssl_dn_start = ssl_dn;
+
+ /* validate all CNs found in DN */
+ CTRACE((tfp, "Validating CNs in '%s'\n", ssl_dn_start));
+ while ((cert_host = strstr(ssl_dn_start, "/CN=")) != NULL) {
+ status_sslcertcheck = 1; /* 1 = could not verify CN */
+ /* start of CommonName */
+ cert_host += 4;
+ /* find next part of DistinguishedName */
+ if ((p = StrChr(cert_host, '/')) != NULL) {
+ *p = '\0';
+ ssl_dn_start = p; /* yes this points to the NUL byte */
+ } else
+ ssl_dn_start = NULL;
+ cert_host = StripIpv6Brackets(cert_host);
+
+ /* verify this CN */
+ CTRACE((tfp, "Matching\n\tssl_host '%s'\n\tcert_host '%s'\n",
+ ssl_host, cert_host));
+ if (!strcasecomp_asterisk(ssl_host, cert_host)) {
+ status_sslcertcheck = 2; /* 2 = verified peer */
+ /* I think this is cool to have in the logs -TG */
+ HTSprintf0(&msg,
+ gettext("Verified connection to %s (cert=%s)"),
+ ssl_host, cert_host);
+ _HTProgress(msg);
+ FREE(msg);
+ /* no need to continue the verification loop */
+ break;
+ }
+
+ /* add this CN to list of failed CNs */
+ if (ssl_all_cns == NULL)
+ StrAllocCopy(ssl_all_cns, "CN<");
+ else
+ StrAllocCat(ssl_all_cns, ":CN<");
+ StrAllocCat(ssl_all_cns, cert_host);
+ StrAllocCat(ssl_all_cns, ">");
+ /* if we cannot retry, don't try it */
+ if (ssl_dn_start == NULL)
+ break;
+ /* now retry next CN found in DN */
+ *ssl_dn_start = '/'; /* formerly NUL byte */
+ }
+
+ /* check the X.509v3 Subject Alternative Name */
+#ifdef USE_GNUTLS_INCL
+ if (status_sslcertcheck < 2) {
+ int i;
+ size_t size;
+ gnutls_x509_crt_t cert;
+ static char buf[2048];
+
+ /* import the certificate to the x509_crt format */
+ if (gnutls_x509_crt_init(&cert) == 0) {
+
+ if (gnutls_x509_crt_import(cert, peer_cert,
+ GNUTLS_X509_FMT_DER) < 0) {
+ gnutls_x509_crt_deinit(cert);
+ goto done;
+ }
+
+ ret = 0;
+ for (i = 0; !(ret < 0); i++) {
+ size = sizeof(buf);
+ ret = gnutls_x509_crt_get_subject_alt_name(cert,
+ (unsigned) i,
+ buf, &size,
+ NULL);
+
+ if (strcasecomp_asterisk(ssl_host, buf) == 0) {
+ status_sslcertcheck = 2;
+ HTSprintf0(&msg,
+ gettext("Verified connection to %s (subj=%s)"),
+ ssl_host, buf);
+ _HTProgress(msg);
+ FREE(msg);
+ break;
+ }
+
+ }
+ }
+ }
+#endif
+#ifdef USE_OPENSSL_INCL
+ if (status_sslcertcheck < 2) {
+ STACK_OF(GENERAL_NAME) * gens;
+ int i, numalts;
+ const GENERAL_NAME *gn;
+
+ gens = (STACK_OF(GENERAL_NAME) *)
+ X509_get_ext_d2i(peer_cert, NID_subject_alt_name, NULL, NULL);
+
+ if (gens != NULL) {
+ numalts = sk_GENERAL_NAME_num(gens);
+ for (i = 0; i < numalts; ++i) {
+ gn = sk_GENERAL_NAME_value(gens, i);
+ if (gn->type == GEN_DNS)
+ cert_host = (char *) ASN1_STRING_data(gn->d.ia5);
+ else if (gn->type == GEN_IPADD) {
+ /* XXX untested -TG */
+ size_t j = (size_t) ASN1_STRING_length(gn->d.ia5);
+
+ cert_host = (char *) malloc(j + 1);
+ MemCpy(cert_host, ASN1_STRING_data(gn->d.ia5), j);
+ cert_host[j] = '\0';
+ } else
+ continue;
+ status_sslcertcheck = 1; /* got at least one */
+ /* verify this SubjectAltName (see above) */
+ cert_host = StripIpv6Brackets(cert_host);
+ if (!(gn->type == GEN_IPADD ? strcasecomp :
+ strcasecomp_asterisk) (ssl_host, cert_host)) {
+ status_sslcertcheck = 2;
+ HTSprintf0(&msg,
+ gettext("Verified connection to %s (subj=%s)"),
+ ssl_host, cert_host);
+ _HTProgress(msg);
+ FREE(msg);
+ if (gn->type == GEN_IPADD)
+ free(cert_host);
+ break;
+ }
+ /* add to list of failed CNs */
+ if (ssl_all_cns == NULL)
+ StrAllocCopy(ssl_all_cns, "SAN<");
+ else
+ StrAllocCat(ssl_all_cns, ":SAN<");
+ if (gn->type == GEN_DNS)
+ StrAllocCat(ssl_all_cns, "DNS=");
+ else if (gn->type == GEN_IPADD)
+ StrAllocCat(ssl_all_cns, "IP=");
+ StrAllocCat(ssl_all_cns, cert_host);
+ StrAllocCat(ssl_all_cns, ">");
+ if (gn->type == GEN_IPADD)
+ free(cert_host);
+ }
+ sk_GENERAL_NAME_free(gens);
+ }
+ }
+#endif /* USE_OPENSSL_INCL */
+
+ /* if an error occurred, format the appropriate message */
+ if (status_sslcertcheck == 0) {
+ SSL_single_prompt(&msg,
+ gettext("Can't find common name in certificate"));
+ } else if (status_sslcertcheck == 1) {
+ SSL_double_prompt(&msg,
+ gettext("SSL error:host(%s)!=cert(%s)-Continue?"),
+ ssl_host, ssl_all_cns);
+ }
+
+ /* if an error occurred, let the user decide how much he trusts */
+ if (status_sslcertcheck < 2) {
+ if (msg == NULL)
+ StrAllocCopy(msg, gettext("SSL error"));
+ if (!HTForcedPrompt(ssl_noprompt, msg, NO)) {
+ status = HT_NOT_LOADED;
+ FREE(msg);
+ FREE(ssl_all_cns);
+ goto done;
+ }
+ SSL_double_prompt(&msg,
+ gettext("UNVERIFIED connection to %s (cert=%s)"),
+ ssl_host, ssl_all_cns ? ssl_all_cns : "NONE");
+ _HTProgress(msg);
+ FREE(msg);
+ }
+
+ show_cert_issuer(peer_cert);
+
+ HTSprintf0(&msg,
+ gettext("Secure %d-bit %s (%s) HTTP connection"),
+ SSL_get_cipher_bits(handle, NULL),
+ SSL_get_cipher_version(handle),
+ SSL_get_cipher(handle));
+ _HTProgress(msg);
+ FREE(msg);
+ FREE(ssl_all_cns);
+ FREE(ssl_host);
+ }
+#endif /* USE_SSL */
+
+ /* Ask that node for the document, omitting the host name & anchor
+ */
+ {
+ char *p1 = (HTParse(url, "", PARSE_PATH | PARSE_PUNCTUATION));
+
+#ifdef USE_SSL
+ if (do_connect) {
+ METHOD = "CONNECT";
+ BStrCopy0(command, "CONNECT ");
+ } else
+#endif /* USE_SSL */
+ if (do_post) {
+ METHOD = "POST";
+ BStrCopy0(command, "POST ");
+ } else if (do_head) {
+ METHOD = "HEAD";
+ BStrCopy0(command, "HEAD ");
+ } else {
+ METHOD = "GET";
+ BStrCopy0(command, "GET ");
+ }
+
+ /*
+ * If we are using a proxy gateway don't copy in the first slash of
+ * say: /gopher://a;lkdjfl;ajdf;lkj/;aldk/adflj so that just
+ * gopher://.... is sent.
+ */
+#ifdef USE_SSL
+ if (using_proxy && !did_connect) {
+ if (do_connect)
+ BStrCat0(command, connect_host);
+ else
+ BStrCat0(command, p1 + 1);
+ }
+#else
+ if (using_proxy)
+ BStrCat0(command, p1 + 1);
+#endif /* USE_SSL */
+ else
+ BStrCat0(command, p1);
+ FREE(p1);
+ }
+ if (extensions) {
+ BStrCat0(command, " ");
+ BStrCat0(command, ((HTprotocolLevel == HTTP_1_0)
+ ? "HTTP/1.0"
+ : "HTTP/1.1"));
+ }
+
+ BStrCat0(command, crlf); /* CR LF, as in rfc 977 */
+
+ if (extensions) {
+ int n, i;
+ char *host = NULL;
+
+ if ((host = HTParse(anAnchor->address, "", PARSE_HOST)) != NULL) {
+ strip_userid(host, TRUE);
+ HTBprintf(&command, "Host: %s%c%c", host, CR, LF);
+ FREE(host);
+ }
+ if (HTprotocolLevel >= HTTP_1_1) {
+ HTBprintf(&command, "Connection: close%c%c", CR, LF);
+ }
+
+ if (!HTPresentations)
+ HTFormatInit();
+ n = HTList_count(HTPresentations);
+
+ first_Accept = TRUE;
+ len = 0;
+ for (i = 0; i < n; i++) {
+ HTPresentation *pres =
+ (HTPresentation *) HTList_objectAt(HTPresentations, i);
+
+ if (pres->get_accept) {
+ if (pres->quality < 1.0) {
+ if (pres->maxbytes > 0) {
+ sprintf(temp, ";q=%4.3f;mxb=%" PRI_off_t "",
+ pres->quality, CAST_off_t (pres->maxbytes));
+ } else {
+ sprintf(temp, ";q=%4.3f", pres->quality);
+ }
+ } else if (pres->maxbytes > 0) {
+ sprintf(temp, ";mxb=%" PRI_off_t "", CAST_off_t (pres->maxbytes));
+ } else {
+ temp[0] = '\0';
+ }
+ HTSprintf0(&linebuf, "%s%s%s",
+ (first_Accept ?
+ "Accept: " : ", "),
+ HTAtom_name(pres->rep),
+ temp);
+ len += (int) strlen(linebuf);
+ if (len > 252 && !first_Accept) {
+ BStrCat0(command, crlf);
+ HTSprintf0(&linebuf, "Accept: %s%s",
+ HTAtom_name(pres->rep),
+ temp);
+ len = (int) strlen(linebuf);
+ }
+ BStrCat0(command, linebuf);
+ first_Accept = FALSE;
+ }
+ }
+ HTBprintf(&command, "%s*/*;q=0.01%c%c",
+ (first_Accept ?
+ "Accept: " : ", "), CR, LF);
+
+ /*
+ * FIXME: suppressing the "Accept-Encoding" in this case is done to
+ * work around limitations of the presentation logic used for the
+ * command-line "-base" option. The remote site may transmit the
+ * document gzip'd, but the ensuing logic in HTSaveToFile() would see
+ * the mime-type as gzip rather than text/html, and not prepend the
+ * base URL. This is less efficient than accepting the compressed data
+ * and uncompressing it, adding the base URL but is simpler than
+ * augmenting the dump's presentation logic -TD
+ */
+ if (LYPrependBaseToSource && dump_output_immediately) {
+ CTRACE((tfp,
+ "omit Accept-Encoding to work-around interaction with -source\n"));
+ } else {
+ char *list = 0;
+ int j, k;
+
+ for (j = 1; j < encodingALL; j <<= 1) {
+ if (acceptEncoding(j)) {
+ for (k = 0; tbl_preferred_encoding[k].name != 0; ++k) {
+ if (tbl_preferred_encoding[k].value == j) {
+ if (list != 0)
+ StrAllocCat(list, ", ");
+ StrAllocCat(list, tbl_preferred_encoding[k].name);
+ break;
+ }
+ }
+ }
+ }
+
+ if (list != 0) {
+ HTBprintf(&command, "Accept-Encoding: %s%c%c", list, CR, LF);
+ free(list);
+ }
+ }
+
+ if (non_empty(language)) {
+ HTBprintf(&command, "Accept-Language: %s%c%c", language, CR, LF);
+ }
+
+ if (non_empty(pref_charset)) {
+ BStrCat0(command, "Accept-Charset: ");
+ StrAllocCopy(linebuf, pref_charset);
+ if (linebuf[strlen(linebuf) - 1] == ',')
+ linebuf[strlen(linebuf) - 1] = '\0';
+ LYLowerCase(linebuf);
+ if (strstr(linebuf, "iso-8859-1") == NULL)
+ StrAllocCat(linebuf, ", iso-8859-1;q=0.01");
+ if (strstr(linebuf, "us-ascii") == NULL)
+ StrAllocCat(linebuf, ", us-ascii;q=0.01");
+ BStrCat0(command, linebuf);
+ HTBprintf(&command, "%c%c", CR, LF);
+ }
+#if 0
+ /*
+ * Promote 300 (Multiple Choices) replies, if supported, over 406 (Not
+ * Acceptable) replies. - FM
+ *
+ * This used to be done in versions 2.7 and 2.8*, but violates the
+ * specs for transparent content negotiation and has the effect that
+ * servers supporting those specs will send 300 (Multiple Choices)
+ * instead of a normal response (e.g. 200 OK), since they will assume
+ * that the client wants to make the choice. It is not clear whether
+ * there are any servers or sites for which sending this header really
+ * improves anything.
+ *
+ * If there ever is a need to send "Negotiate: trans" and really mean
+ * it, we should send "Negotiate: trans,trans" or similar, since that
+ * is semantically equivalent and some servers may ignore "Negotiate:
+ * trans" as a special case when it comes from Lynx (to work around the
+ * old faulty behavior). - kw
+ *
+ * References:
+ * RFC 2295 (see also RFC 2296), and mail to lynx-dev and
+ * new-httpd@apache.org from Koen Holtman, Jan 1999.
+ */
+ if (!do_post) {
+ HTBprintf(&command, "Negotiate: trans%c%c", CR, LF);
+ }
+#endif /* 0 */
+
+ /*
+ * When reloading give no-cache pragma to proxy server to make it
+ * refresh its cache. -- Ari L. <luotonen@dxcern.cern.ch>
+ *
+ * Also send it as a Cache-Control header for HTTP/1.1. - FM
+ */
+ if (reloading) {
+ HTBprintf(&command, "Pragma: no-cache%c%c", CR, LF);
+ HTBprintf(&command, "Cache-Control: no-cache%c%c", CR, LF);
+ }
+
+ if (LYSendUserAgent || no_useragent) {
+ if (non_empty(LYUserAgent)) {
+ char *cp = LYSkipBlanks(LYUserAgent);
+
+ /* Won't send it at all if all blank - kw */
+ if (*cp != '\0')
+ HTBprintf(&command, "User-Agent: %.*s%c%c",
+ INIT_LINE_SIZE - 15, LYUserAgent, CR, LF);
+ } else {
+ HTBprintf(&command, "User-Agent: %s/%s libwww-FM/%s%c%c",
+ HTAppName ? HTAppName : "unknown",
+ HTAppVersion ? HTAppVersion : "0.0",
+ HTLibraryVersion, CR, LF);
+ }
+ }
+
+ if (non_empty(personal_mail_address) && !LYNoFromHeader) {
+ HTBprintf(&command, "From: %s%c%c", personal_mail_address, CR, LF);
+ }
+
+ if (!(LYUserSpecifiedURL ||
+ LYNoRefererHeader || LYNoRefererForThis) &&
+ strcmp(HTLoadedDocumentURL(), "")) {
+ const char *cp = LYRequestReferer;
+
+ if (!cp)
+ cp = HTLoadedDocumentURL(); /* @@@ Try both? - kw */
+ BStrCat0(command, "Referer: ");
+ if (isLYNXIMGMAP(cp)) {
+ char *pound = findPoundSelector(cp);
+ int nn = (pound ? (int) (pound - cp) : (int) strlen(cp));
+
+ HTSABCat(&command, cp + LEN_LYNXIMGMAP, nn);
+ } else {
+ BStrCat0(command, cp);
+ }
+ HTBprintf(&command, "%c%c", CR, LF);
+ } {
+ char *abspath;
+ char *docname;
+ char *hostname;
+ char *colon;
+ int portnumber;
+ char *auth, *cookie = NULL;
+ BOOL secure = (BOOL) (StrNCmp(anAnchor->address, "https", 5)
+ ? FALSE
+ : TRUE);
+
+ abspath = HTParse(arg, "", PARSE_PATH | PARSE_PUNCTUATION);
+ docname = HTParse(arg, "", PARSE_PATH);
+ hostname = HTParse(arg, "", PARSE_HOST);
+ if (hostname &&
+ NULL != (colon = HTParsePort(hostname, &portnumber))) {
+ *colon = '\0'; /* Chop off port number */
+ } else if (!StrNCmp(arg, "https", 5)) {
+ portnumber = HTTPS_PORT;
+ } else {
+ portnumber = HTTP_PORT;
+ }
+
+ /*
+ * Add Authorization, Proxy-Authorization, and/or Cookie headers,
+ * if applicable.
+ */
+ if (using_proxy) {
+ /*
+ * If we are using a proxy, first determine if we should
+ * include an Authorization header and/or Cookie header for the
+ * ultimate target of this request. - FM & AJL
+ */
+ char *host2 = NULL, *path2 = NULL;
+ int port2 = (StrNCmp(docname, "https", 5) ?
+ HTTP_PORT : HTTPS_PORT);
+
+ host2 = HTParse(docname, "", PARSE_HOST);
+ path2 = HTParse(docname, "", PARSE_PATH | PARSE_PUNCTUATION);
+ if ((colon = HTParsePort(host2, &port2)) != NULL) {
+ /* Use non-default port number */
+ *colon = '\0';
+ }
+
+ /*
+ * This composeAuth() does file access, i.e., for the ultimate
+ * target of the request. - AJL
+ */
+ auth_proxy = NO;
+ auth = HTAA_composeAuth(host2, port2, path2, auth_proxy);
+ if (auth == NULL) {
+ CTRACE((tfp, "HTTP: Not sending authorization (yet).\n"));
+ } else if (*auth != '\0') {
+ /*
+ * We have an Authorization header to be included.
+ */
+ HTBprintf(&command, "%s%c%c", auth, CR, LF);
+ CTRACE((tfp, "HTTP: Sending authorization: %s\n", auth));
+ } else {
+ /*
+ * The user either cancelled or made a mistake with the
+ * username and password prompt.
+ */
+ if (!(traversal || dump_output_immediately) &&
+ HTConfirm(CONFIRM_WO_PASSWORD)) {
+ show_401 = TRUE;
+ } else {
+ if (traversal || dump_output_immediately)
+ HTAlert(FAILED_NEED_PASSWD);
+#ifdef USE_SSL
+ if (did_connect)
+ HTTP_NETCLOSE(s, handle);
+#endif /* USE_SSL */
+ BStrFree(command);
+ FREE(hostname);
+ FREE(docname);
+ FREE(abspath);
+ FREE(host2);
+ FREE(path2);
+ status = HT_NOT_LOADED;
+ goto done;
+ }
+ }
+ /*
+ * Add 'Cookie:' header, if it's HTTP or HTTPS document being
+ * proxied.
+ */
+ if (!StrNCmp(docname, "http", 4)) {
+ cookie = LYAddCookieHeader(host2, path2, port2, secure);
+ }
+ FREE(host2);
+ FREE(path2);
+ /*
+ * The next composeAuth() will be for the proxy. - AJL
+ */
+ auth_proxy = YES;
+ } else {
+ /*
+ * Add cookie for a non-proxied request. - FM
+ */
+ cookie = LYAddCookieHeader(hostname, abspath, portnumber, secure);
+ auth_proxy = NO;
+ }
+ /*
+ * If we do have a cookie set, add it to the request buffer. - FM
+ */
+ if (cookie != NULL) {
+ if (*cookie != '$' && USE_RFC_2965) {
+ /*
+ * It's a historical cookie, so signal to the server that
+ * we support modern cookies. - FM
+ */
+ BStrCat0(command, "Cookie2: $Version=\"1\"");
+ BStrCat0(command, crlf);
+ CTRACE((tfp, "HTTP: Sending Cookie2: $Version =\"1\"\n"));
+ }
+ if (*cookie != '\0') {
+ /*
+ * It's not a zero-length string, so add the header. Note
+ * that any folding of long strings has been done already
+ * in LYCookie.c. - FM
+ */
+ BStrCat0(command, "Cookie: ");
+ BStrCat0(command, cookie);
+ BStrCat0(command, crlf);
+ CTRACE((tfp, "HTTP: Sending Cookie: %s\n", cookie));
+ }
+ FREE(cookie);
+ }
+ FREE(abspath);
+
+ /*
+ * If we are using a proxy, auth_proxy should be YES, and we check
+ * here whether we want a Proxy-Authorization header for it. If we
+ * are not using a proxy, auth_proxy should still be NO, and we
+ * check here for whether we want an Authorization header. - FM &
+ * AJL
+ */
+ if ((auth = HTAA_composeAuth(hostname,
+ portnumber,
+ docname,
+ auth_proxy)) != NULL &&
+ *auth != '\0') {
+ /*
+ * If auth is not NULL nor zero-length, it's an Authorization
+ * or Proxy-Authorization header to be included. - FM
+ */
+ HTBprintf(&command, "%s%c%c", auth, CR, LF);
+ CTRACE((tfp, (auth_proxy ?
+ "HTTP: Sending proxy authorization: %s\n" :
+ "HTTP: Sending authorization: %s\n"),
+ auth));
+ } else if (auth && *auth == '\0') {
+ /*
+ * If auth is a zero-length string, the user either cancelled
+ * or goofed at the username and password prompt. - FM
+ */
+ if (!(traversal || dump_output_immediately) && HTConfirm(CONFIRM_WO_PASSWORD)) {
+ if (auth_proxy == TRUE) {
+ show_407 = TRUE;
+ } else {
+ show_401 = TRUE;
+ }
+ } else {
+ if (traversal || dump_output_immediately)
+ HTAlert(FAILED_NEED_PASSWD);
+ BStrFree(command);
+ FREE(hostname);
+ FREE(docname);
+ status = HT_NOT_LOADED;
+ goto done;
+ }
+ } else {
+ CTRACE((tfp, (auth_proxy ?
+ "HTTP: Not sending proxy authorization (yet).\n" :
+ "HTTP: Not sending authorization (yet).\n")));
+ }
+ FREE(hostname);
+ FREE(docname);
+ }
+ }
+
+ if (
+#ifdef USE_SSL
+ !do_connect &&
+#endif /* USE_SSL */
+ do_post) {
+ CTRACE((tfp, "HTTP: Doing post, content-type '%s'\n",
+ anAnchor->post_content_type
+ ? anAnchor->post_content_type
+ : "lose"));
+ HTBprintf(&command, "Content-Type: %s%c%c",
+ anAnchor->post_content_type
+ ? anAnchor->post_content_type
+ : "lose",
+ CR, LF);
+
+ HTBprintf(&command, "Content-Length: %d%c%c",
+ !isBEmpty(anAnchor->post_data)
+ ? BStrLen(anAnchor->post_data)
+ : 0,
+ CR, LF);
+
+ BStrCat0(command, crlf); /* Blank line means "end" of headers */
+
+ BStrCat(command, anAnchor->post_data);
+ } else
+ BStrCat0(command, crlf); /* Blank line means "end" of headers */
+
+ if (TRACE) {
+ CTRACE((tfp, "Writing:\n"));
+ trace_bstring(command);
+#ifdef USE_SSL
+ CTRACE((tfp, "%s",
+ (anAnchor->post_data && !do_connect ? crlf : "")));
+#else
+ CTRACE((tfp, "%s",
+ (anAnchor->post_data ? crlf : "")));
+#endif /* USE_SSL */
+ CTRACE((tfp, "----------------------------------\n"));
+ }
+
+ _HTProgress(gettext("Sending HTTP request."));
+
+#ifdef NOT_ASCII /* S/390 -- gil -- 0548 */
+ {
+ char *p2;
+
+ for (p2 = BStrData(command);
+ p2 < BStrData(command) + BStrLen(command);
+ p2++)
+ *p2 = TOASCII(*p2);
+ }
+#endif /* NOT_ASCII */
+ status = (int) HTTP_NETWRITE(s,
+ BStrData(command),
+ BStrLen(command),
+ handle);
+ BStrFree(command);
+ FREE(linebuf);
+ if (status <= 0) {
+ if (status == 0) {
+ CTRACE((tfp, "HTTP: Got status 0 in initial write\n"));
+ /* Do nothing. */
+ } else if ((SOCKET_ERRNO == ENOTCONN ||
+ SOCKET_ERRNO == ECONNRESET ||
+ SOCKET_ERRNO == EPIPE) &&
+ !already_retrying &&
+ /* Don't retry if we're posting. */ !do_post) {
+ /*
+ * Arrrrgh, HTTP 0/1 compatibility problem, maybe.
+ */
+ CTRACE((tfp,
+ "HTTP: BONZO ON WRITE Trying again with HTTP0 request.\n"));
+ _HTProgress(RETRYING_AS_HTTP0);
+ HTTP_NETCLOSE(s, handle);
+ extensions = NO;
+ already_retrying = TRUE;
+ goto try_again;
+ } else {
+ CTRACE((tfp,
+ "HTTP: Hit unexpected network WRITE error; aborting connection.\n"));
+ HTTP_NETCLOSE(s, handle);
+ status = -1;
+ HTAlert(gettext("Unexpected network write error; connection aborted."));
+ goto done;
+ }
+ }
+
+ CTRACE((tfp, "HTTP: WRITE delivered OK\n"));
+ _HTProgress(gettext("HTTP request sent; waiting for response."));
+
+ /* Read the first line of the response
+ * -----------------------------------
+ */
+ {
+ /* Get numeric status etc */
+ BOOL end_of_file = NO;
+ int buffer_length = INIT_LINE_SIZE;
+
+ line_buffer = typecallocn(char, (size_t) buffer_length);
+
+ if (line_buffer == NULL)
+ outofmem(__FILE__, "HTLoadHTTP");
+
+ HTReadProgress(bytes_already_read = 0, (off_t) 0);
+ do { /* Loop to read in the first line */
+ /*
+ * Extend line buffer if necessary for those crazy WAIS URLs ;-)
+ */
+ if (buffer_length - length < LINE_EXTEND_THRESH) {
+ buffer_length = buffer_length + buffer_length;
+ line_buffer =
+ (char *) realloc(line_buffer, ((unsigned) buffer_length *
+ sizeof(char)));
+
+ if (line_buffer == NULL)
+ outofmem(__FILE__, "HTLoadHTTP");
+ }
+ CTRACE((tfp, "HTTP: Trying to read %d\n", buffer_length - length - 1));
+ status = HTTP_NETREAD(s,
+ line_buffer + length,
+ (buffer_length - length - 1),
+ handle);
+ CTRACE((tfp, "HTTP: Read %d\n", status));
+ if (status <= 0) {
+ /*
+ * Retry if we get nothing back too.
+ * Bomb out if we get nothing twice.
+ */
+ if (status == HT_INTERRUPTED) {
+ CTRACE((tfp, "HTTP: Interrupted initial read.\n"));
+ _HTProgress(CONNECTION_INTERRUPTED);
+ HTTP_NETCLOSE(s, handle);
+ status = HT_NO_DATA;
+ goto clean_up;
+ } else if (status < 0 &&
+ (SOCKET_ERRNO == ENOTCONN ||
+#ifdef _WINDOWS /* 1997/11/09 (Sun) 16:59:58 */
+ SOCKET_ERRNO == ETIMEDOUT ||
+#endif
+ SOCKET_ERRNO == ECONNRESET ||
+ SOCKET_ERRNO == EPIPE) &&
+ !already_retrying && !do_post) {
+ /*
+ * Arrrrgh, HTTP 0/1 compatibility problem, maybe.
+ */
+ CTRACE((tfp,
+ "HTTP: BONZO Trying again with HTTP0 request.\n"));
+ HTTP_NETCLOSE(s, handle);
+ FREE(line_buffer);
+ FREE(line_kept_clean);
+
+ extensions = NO;
+ already_retrying = TRUE;
+ _HTProgress(RETRYING_AS_HTTP0);
+ goto try_again;
+ }
+#ifdef USE_SSL
+ else if ((SSLerror = ERR_get_error()) != 0) {
+ CTRACE((tfp,
+ "HTTP: Hit unexpected network read error; aborting connection; status %d:%s.\n",
+ status, ERR_error_string(SSLerror, NULL)));
+ HTAlert(gettext("Unexpected network read error; connection aborted."));
+ HTTP_NETCLOSE(s, handle);
+ status = -1;
+ goto clean_up;
+ }
+#endif
+ else {
+ CTRACE((tfp,
+ "HTTP: Hit unexpected network read error; aborting connection; status %d.\n",
+ status));
+ HTAlert(gettext("Unexpected network read error; connection aborted."));
+ HTTP_NETCLOSE(s, handle);
+ status = -1;
+ goto clean_up;
+ }
+ }
+#ifdef NOT_ASCII /* S/390 -- gil -- 0564 */
+ {
+ char *p2;
+
+ for (p2 = line_buffer + length;
+ p2 < line_buffer + length + status;
+ p2++)
+ *p2 = FROMASCII(*p2);
+ }
+#endif /* NOT_ASCII */
+
+ bytes_already_read += status;
+ HTReadProgress(bytes_already_read, (off_t) 0);
+
+#ifdef UCX /* UCX returns -1 on EOF */
+ if (status == 0 || status == -1)
+#else
+ if (status == 0)
+#endif
+ {
+ break;
+ }
+ line_buffer[length + status] = 0;
+
+ if (line_buffer) {
+ FREE(line_kept_clean);
+ line_kept_clean = (char *) malloc((unsigned) buffer_length *
+ sizeof(char));
+
+ if (line_kept_clean == NULL)
+ outofmem(__FILE__, "HTLoadHTTP");
+ MemCpy(line_kept_clean, line_buffer, buffer_length);
+#ifdef SH_EX /* FIX BUG by kaz@maczuka.hitachi.ibaraki.jp */
+ real_length_of_line = length + status;
+#endif
+ }
+
+ eol = StrChr(line_buffer + length, LF);
+ /* Do we *really* want to do this? */
+ if (eol && eol != line_buffer && *(eol - 1) == CR)
+ *(eol - 1) = ' ';
+
+ length = length + status;
+
+ /* Do we really want to do *this*? */
+ if (eol)
+ *eol = 0; /* Terminate the line */
+ }
+ /* All we need is the first line of the response. If it's a HTTP/1.0
+ * response, then the first line will be absurdly short and therefore
+ * we can safely gate the number of bytes read through this code (as
+ * opposed to below) to ~1000.
+ *
+ * Well, let's try 100.
+ */
+ while (!eol && !end_of_file && bytes_already_read < 100);
+ } /* Scope of loop variables */
+
+ /* save total length, in case we decide later to show it all - kw */
+ rawlength = length;
+
+ /* We now have a terminated unfolded line. Parse it.
+ * --------------------------------------------------
+ */
+ CTRACE((tfp, "HTTP: Rx: %s\n", line_buffer));
+
+ /*
+ * Kludge to work with old buggy servers and the VMS Help gateway. They
+ * can't handle the third word, so we try again without it.
+ */
+ if (extensions && /* Old buggy server or Help gateway? */
+ (0 == StrNCmp(line_buffer, "<TITLE>Bad File Request</TITLE>", 31) ||
+ 0 == StrNCmp(line_buffer, "Address should begin with", 25) ||
+ 0 == StrNCmp(line_buffer, "<TITLE>Help ", 12) ||
+ 0 == strcmp(line_buffer,
+ "Document address invalid or access not authorised"))) {
+ FREE(line_buffer);
+ FREE(line_kept_clean);
+ extensions = NO;
+ already_retrying = TRUE;
+ CTRACE((tfp, "HTTP: close socket %d to retry with HTTP0\n", s));
+ HTTP_NETCLOSE(s, handle);
+ /* print a progress message */
+ _HTProgress(RETRYING_AS_HTTP0);
+ goto try_again;
+ } {
+ int fields;
+ char server_version[VERSION_LENGTH + 1];
+
+ server_version[0] = 0;
+
+ fields = sscanf(line_buffer, "%20s %d",
+ server_version,
+ &server_status);
+
+ CTRACE((tfp, "HTTP: Scanned %d fields from line_buffer\n", fields));
+
+ if (non_empty(http_error_file)) {
+ /* Make the status code externally available */
+ FILE *error_file;
+
+#ifdef SERVER_STATUS_ONLY
+ error_file = fopen(http_error_file, TXT_W);
+ if (error_file) { /* Managed to open the file */
+ fprintf(error_file, "error=%d\n", server_status);
+ fclose(error_file);
+ }
+#else
+ error_file = fopen(http_error_file, TXT_A);
+ if (error_file) { /* Managed to open the file */
+ fprintf(error_file, " URL=%s (%s)\n", url, METHOD);
+ fprintf(error_file, "STATUS=%s\n", line_buffer);
+ fclose(error_file);
+ }
+#endif /* SERVER_STATUS_ONLY */
+ }
+
+ /*
+ * Rule out a non-HTTP/1.n reply as best we can.
+ */
+ if (fields < 2 || !server_version[0] || server_version[0] != 'H' ||
+ server_version[1] != 'T' || server_version[2] != 'T' ||
+ server_version[3] != 'P' || server_version[4] != '/' ||
+ server_version[6] != '.') {
+ /*
+ * Ugh! An HTTP0 reply,
+ */
+ HTAtom *encoding;
+
+ CTRACE((tfp, "--- Talking HTTP0.\n"));
+
+ format_in = HTFileFormat(url, &encoding, NULL);
+ /*
+ * Treat all plain text as HTML. This sucks but its the only
+ * solution without without looking at content.
+ */
+ if (!StrNCmp(HTAtom_name(format_in), STR_PLAINTEXT, 10)) {
+ CTRACE((tfp, "HTTP: format_in being changed to text/HTML\n"));
+ format_in = WWW_HTML;
+ }
+ if (!IsUnityEnc(encoding)) {
+ /*
+ * Change the format to that for "www/compressed".
+ */
+ CTRACE((tfp, "HTTP: format_in is '%s',\n", HTAtom_name(format_in)));
+ StrAllocCopy(anAnchor->content_type, HTAtom_name(format_in));
+ StrAllocCopy(anAnchor->content_encoding, HTAtom_name(encoding));
+ format_in = HTAtom_for("www/compressed");
+ CTRACE((tfp, " Treating as '%s' with encoding '%s'\n",
+ "www/compressed", HTAtom_name(encoding)));
+ }
+
+ start_of_data = line_kept_clean;
+ } else {
+ /*
+ * Set up to decode full HTTP/1.n response. - FM
+ */
+ format_in = HTAtom_for("www/mime");
+ CTRACE((tfp, "--- Talking HTTP1.\n"));
+
+ /*
+ * We set start_of_data to "" when !eol here because there will be
+ * a put_block done below; we do *not* use the value of
+ * start_of_data (as a pointer) in the computation of length (or
+ * anything else) when !eol. Otherwise, set the value of length to
+ * what we have beyond eol (i.e., beyond the status line). - FM
+ */
+ if (eol != 0) {
+ start_of_data = (eol + 1);
+ } else {
+ start_of_data = empty;
+ }
+ length = (eol
+ ? length - (int) (start_of_data - line_buffer)
+ : 0);
+
+ /*
+ * Trim trailing spaces in line_buffer so that we can use it in
+ * messages which include the status line. - FM
+ */
+ while (line_buffer[strlen(line_buffer) - 1] == ' ')
+ line_buffer[strlen(line_buffer) - 1] = '\0';
+
+ /*
+ * Take appropriate actions based on the status. - FM
+ */
+ switch (server_status / 100) {
+ case 1:
+ /*
+ * HTTP/1.1 Informational statuses.
+ * 100 Continue.
+ * 101 Switching Protocols.
+ * > 101 is unknown.
+ * We should never get these, and they have only the status
+ * line and possibly other headers, so we'll deal with them by
+ * showing the full header to the user as text/plain. - FM
+ */
+ HTAlert(gettext("Got unexpected Informational Status."));
+ do_head = TRUE;
+ break;
+
+ case 2:
+ /*
+ * Good: Got MIME object! (Successful) - FM
+ */
+ if (do_head) {
+ /*
+ * If HEAD was requested, show headers (and possibly bogus
+ * body) for all 2xx status codes as text/plain - KW
+ */
+ HTProgress(line_buffer);
+ break;
+ }
+ switch (server_status) {
+ case 204:
+ /*
+ * No Content.
+ */
+ HTAlert(line_buffer);
+ HTTP_NETCLOSE(s, handle);
+ HTNoDataOK = 1;
+ status = HT_NO_DATA;
+ goto clean_up;
+
+ case 205:
+ /*
+ * Reset Content. The server has fulfilled the request but
+ * nothing is returned and we should reset any form
+ * content. We'll instruct the user to do that, and
+ * restore the current document. - FM
+ */
+ HTAlert(gettext("Request fulfilled. Reset Content."));
+ HTTP_NETCLOSE(s, handle);
+ status = HT_NO_DATA;
+ goto clean_up;
+
+ case 206:
+ /*
+ * Partial Content. We didn't send a Range so something
+ * went wrong somewhere. Show the status message and
+ * restore the current document. - FM
+ */
+ HTAlert(line_buffer);
+ HTTP_NETCLOSE(s, handle);
+ status = HT_NO_DATA;
+ goto clean_up;
+
+ default:
+ /*
+ * 200 OK.
+ * 201 Created.
+ * 202 Accepted.
+ * 203 Non-Authoritative Information.
+ * > 206 is unknown.
+ * All should return something to display.
+ */
+#if defined(USE_SSL) /* && !defined(DISABLE_NEWS) _H */
+ if (do_connect) {
+ CTRACE((tfp,
+ "HTTP: Proxy tunnel to '%s' established.\n",
+ connect_host));
+ do_connect = FALSE;
+ url = connect_url;
+ FREE(line_buffer);
+ FREE(line_kept_clean);
+#ifndef DISABLE_NEWS
+ if (!StrNCmp(connect_url, "snews", 5)) {
+ CTRACE((tfp,
+ " Will attempt handshake and snews connection.\n"));
+ status = HTNewsProxyConnect(s, url, anAnchor,
+ format_out, sink);
+ goto done;
+ }
+#endif /* DISABLE_NEWS */
+ did_connect = TRUE;
+ already_retrying = TRUE;
+ eol = 0;
+ length = 0;
+ doing_redirect = FALSE;
+ permanent_redirection = FALSE;
+ target = NULL;
+ CTRACE((tfp,
+ " Will attempt handshake and resubmit headers.\n"));
+ goto use_tunnel;
+ }
+#endif /* USE_SSL */
+ HTProgress(line_buffer);
+ } /* case 2 switch */
+ break;
+
+ case 3:
+ /*
+ * Various forms of Redirection. - FM
+ * 300 Multiple Choices.
+ * 301 Moved Permanently.
+ * 302 Found (temporary; we can, and do, use GET).
+ * 303 See Other (temporary; always use GET).
+ * 304 Not Modified.
+ * 305 Use Proxy.
+ * 306 Set Proxy.
+ * 307 Temporary Redirect with method retained.
+ * > 308 is unknown.
+ */
+ if (no_url_redirection || do_head || keep_mime_headers) {
+ /*
+ * If any of these flags are set, we do not redirect, but
+ * instead show what was returned to the user as
+ * text/plain. - FM
+ */
+ HTProgress(line_buffer);
+ break;
+ }
+
+ if (server_status == 300) { /* Multiple Choices */
+ /*
+ * For client driven content negotiation. The server
+ * should be sending some way for the user-agent to make a
+ * selection, so we'll show the user whatever the server
+ * returns. There might be a Location: header with the
+ * server's preference present, but the choice should be up
+ * to the user, someday based on an Alternates: header,
+ * and a body always should be present with descriptions
+ * and links for the choices (i.e., we use the latter, for
+ * now). - FM
+ */
+ HTAlert(line_buffer);
+ if (traversal) {
+ HTTP_NETCLOSE(s, handle);
+ status = -1;
+ goto clean_up;
+ }
+ if (!dump_output_immediately &&
+ format_out == WWW_DOWNLOAD) {
+ /*
+ * Convert a download request to a presentation request
+ * for interactive users. - FM
+ */
+ format_out = WWW_PRESENT;
+ }
+ break;
+ }
+
+ if (server_status == 304) { /* Not Modified */
+ /*
+ * We didn't send an "If-Modified-Since" header, so this
+ * status is inappropriate. We'll deal with it by showing
+ * the full header to the user as text/plain. - FM
+ */
+ HTAlert(gettext("Got unexpected 304 Not Modified status."));
+ do_head = TRUE;
+ break;
+ }
+
+ if (server_status == 305 ||
+ server_status == 306 ||
+ server_status > 307) {
+ /*
+ * Show user the content, if any, for 305, 306, or unknown
+ * status. - FM
+ */
+ HTAlert(line_buffer);
+ if (traversal) {
+ HTTP_NETCLOSE(s, handle);
+ status = -1;
+ goto clean_up;
+ }
+ if (!dump_output_immediately &&
+ format_out == WWW_DOWNLOAD) {
+ /*
+ * Convert a download request to a presentation request
+ * for interactive users. - FM
+ */
+ format_out = WWW_PRESENT;
+ }
+ break;
+ }
+
+ /*
+ * We do not load the file, but read the headers for the
+ * "Location:", check out that redirecting_url and if it's
+ * acceptable (e.g., not a telnet URL when we have that
+ * disabled), initiate a new fetch. If that's another
+ * redirecting_url, we'll repeat the checks, and fetch
+ * initiations if acceptable, until we reach the actual URL, or
+ * the redirection limit set in HTAccess.c is exceeded. If the
+ * status was 301 indicating that the relocation is permanent,
+ * we set the permanent_redirection flag to make it permanent
+ * for the current anchor tree (i.e., will persist until the
+ * tree is freed or the client exits). If the redirection
+ * would include POST content, we seek confirmation from an
+ * interactive user, with option to use 303 for 301 (but not
+ * for 307), and otherwise refuse the redirection. We also
+ * don't allow permanent redirection if we keep POST content.
+ * If we don't find the Location header or it's value is
+ * zero-length, we display whatever the server returned, and
+ * the user should RELOAD that to try again, or make a
+ * selection from it if it contains links, or Left-Arrow to the
+ * previous document. - FM
+ */
+ {
+ if ((dump_output_immediately || traversal) &&
+ do_post &&
+ server_status != 303 &&
+ server_status != 302 &&
+ server_status != 301) {
+ /*
+ * Don't redirect POST content without approval from an
+ * interactive user. - FM
+ */
+ HTTP_NETCLOSE(s, handle);
+ status = -1;
+ HTAlert(gettext("Redirection of POST content requires user approval."));
+ if (traversal)
+ HTProgress(line_buffer);
+ goto clean_up;
+ }
+
+ HTProgress(line_buffer);
+ if (server_status == 301) { /* Moved Permanently */
+ if (do_post) {
+ /*
+ * Don't make the redirection permanent if we have
+ * POST content. - FM
+ */
+ CTRACE((tfp,
+ "HTTP: Have POST content. Treating 301 (Permanent) as Temporary.\n"));
+ HTAlert(gettext("Have POST content. Treating Permanent Redirection as Temporary.\n"));
+ } else {
+ permanent_redirection = TRUE;
+ }
+ }
+ doing_redirect = TRUE;
+
+ break;
+ }
+
+ case 4:
+ /*
+ * "I think I goofed!" (Client Error) - FM
+ */
+ switch (server_status) {
+ case 401: /* Unauthorized */
+ /*
+ * Authorization for origin server required. If show_401
+ * is set, proceed to showing the 401 body. Otherwise, if
+ * we can set up authorization based on the
+ * WWW-Authenticate header, and the user provides a
+ * username and password, try again. Otherwise, check
+ * whether to show the 401 body or restore the current
+ * document - FM
+ */
+ if (show_401)
+ break;
+ if (HTAA_shouldRetryWithAuth(start_of_data, (size_t)
+ length, s, NO)) {
+
+ HTTP_NETCLOSE(s, handle);
+ if (dump_output_immediately &&
+ !HTAA_HaveUserinfo(HTParse(arg, "", PARSE_HOST)) &&
+ !authentication_info[0]) {
+ fprintf(stderr,
+ "HTTP: Access authorization required.\n");
+ fprintf(stderr,
+ " Use the -auth=id:pw parameter.\n");
+ status = HT_NO_DATA;
+ goto clean_up;
+ }
+
+ CTRACE((tfp, "%s %d %s\n",
+ "HTTP: close socket", s,
+ "to retry with Access Authorization"));
+
+ _HTProgress(gettext("Retrying with access authorization information."));
+ FREE(line_buffer);
+ FREE(line_kept_clean);
+#ifdef USE_SSL
+ if (using_proxy && !StrNCmp(url, "https://", 8)) {
+ url = arg;
+ do_connect = TRUE;
+ did_connect = FALSE;
+ }
+#endif /* USE_SSL */
+ goto try_again;
+ } else if (!(traversal || dump_output_immediately) &&
+ HTConfirm(gettext("Show the 401 message body?"))) {
+ break;
+ } else {
+ if (traversal || dump_output_immediately)
+ HTAlert(FAILED_RETRY_WITH_AUTH);
+ HTTP_NETCLOSE(s, handle);
+ status = -1;
+ goto clean_up;
+ }
+
+ case 407:
+ /*
+ * Authorization for proxy server required. If we are not
+ * in fact using a proxy, or show_407 is set, proceed to
+ * showing the 407 body. Otherwise, if we can set up
+ * authorization based on the Proxy-Authenticate header,
+ * and the user provides a username and password, try
+ * again. Otherwise, check whether to show the 401 body or
+ * restore the current document. - FM & AJL
+ */
+ if (!using_proxy || show_407)
+ break;
+ if (HTAA_shouldRetryWithAuth(start_of_data, (size_t)
+ length, s, YES)) {
+
+ HTTP_NETCLOSE(s, handle);
+ if (dump_output_immediately && !proxyauth_info[0]) {
+ fprintf(stderr,
+ "HTTP: Proxy authorization required.\n");
+ fprintf(stderr,
+ " Use the -pauth=id:pw parameter.\n");
+ status = HT_NO_DATA;
+ goto clean_up;
+ }
+
+ CTRACE((tfp, "%s %d %s\n",
+ "HTTP: close socket", s,
+ "to retry with Proxy Authorization"));
+
+ _HTProgress(HTTP_RETRY_WITH_PROXY);
+ FREE(line_buffer);
+ FREE(line_kept_clean);
+ goto try_again;
+ } else if (!(traversal || dump_output_immediately) &&
+ HTConfirm(gettext("Show the 407 message body?"))) {
+ if (!dump_output_immediately &&
+ format_out == WWW_DOWNLOAD) {
+ /*
+ * Convert a download request to a presentation
+ * request for interactive users. - FM
+ */
+ format_out = WWW_PRESENT;
+ }
+ break;
+ } else {
+ if (traversal || dump_output_immediately)
+ HTAlert(FAILED_RETRY_WITH_PROXY);
+ HTTP_NETCLOSE(s, handle);
+ status = -1;
+ goto clean_up;
+ }
+
+ case 408:
+ /*
+ * Request Timeout. Show the status message and restore
+ * the current document. - FM
+ */
+ HTAlert(line_buffer);
+ HTTP_NETCLOSE(s, handle);
+ status = HT_NO_DATA;
+ goto clean_up;
+
+ default:
+ /*
+ * 400 Bad Request.
+ * 402 Payment Required.
+ * 403 Forbidden.
+ * 404 Not Found.
+ * 405 Method Not Allowed.
+ * 406 Not Acceptable.
+ * 409 Conflict.
+ * 410 Gone.
+ * 411 Length Required.
+ * 412 Precondition Failed.
+ * 413 Request Entity Too Large.
+ * 414 Request-URI Too Long.
+ * 415 Unsupported Media Type.
+ * 416 List Response (for content negotiation).
+ * > 416 is unknown.
+ * Show the status message, and display the returned text
+ * if we are not doing a traversal. - FM
+ */
+ HTAlert(line_buffer);
+ if (traversal) {
+ HTTP_NETCLOSE(s, handle);
+ status = -1;
+ goto clean_up;
+ }
+ if (!dump_output_immediately &&
+ format_out == WWW_DOWNLOAD) {
+ /*
+ * Convert a download request to a presentation request
+ * for interactive users. - FM
+ */
+ format_out = WWW_PRESENT;
+ }
+ break;
+ } /* case 4 switch */
+ break;
+
+ case 5:
+ /*
+ * "I think YOU goofed!" (server error)
+ * 500 Internal Server Error
+ * 501 Not Implemented
+ * 502 Bad Gateway
+ * 503 Service Unavailable
+ * 504 Gateway Timeout
+ * 505 HTTP Version Not Supported
+ * > 505 is unknown.
+ * Should always include a message, which we always should
+ * display. - FM
+ */
+ HTAlert(line_buffer);
+ if (traversal) {
+ HTTP_NETCLOSE(s, handle);
+ status = -1;
+ goto clean_up;
+ }
+ if (!dump_output_immediately &&
+ format_out == WWW_DOWNLOAD) {
+ /*
+ * Convert a download request to a presentation request for
+ * interactive users. - FM
+ */
+ format_out = WWW_PRESENT;
+ }
+ break;
+
+ default:
+ /*
+ * Bad or unknown server_status number. Take a chance and hope
+ * there is something to display. - FM
+ */
+ HTAlert(gettext("Unknown status reply from server!"));
+ HTAlert(line_buffer);
+ if (traversal) {
+ HTTP_NETCLOSE(s, handle);
+ status = -1;
+ goto clean_up;
+ }
+ if (!dump_output_immediately &&
+ format_out == WWW_DOWNLOAD) {
+ /*
+ * Convert a download request to a presentation request for
+ * interactive users. - FM
+ */
+ format_out = WWW_PRESENT;
+ }
+ break;
+ } /* Switch on server_status/100 */
+
+ } /* Full HTTP reply */
+ } /* scope of fields */
+
+ /*
+ * The user may have pressed the 'z'ap key during the pause caused by one
+ * of the HTAlerts above if the server reported an error, to skip loading
+ * of the error response page. Checking here before setting up the stream
+ * stack and feeding it data avoids doing unnecessary work, it also can
+ * avoid unnecessarily pushing a loaded document out of the cache to make
+ * room for the unwanted error page. - kw
+ */
+ if (HTCheckForInterrupt()) {
+ HTTP_NETCLOSE(s, handle);
+ if (doing_redirect) {
+ /*
+ * Impatient user. - FM
+ */
+ CTRACE((tfp, "HTTP: Interrupted followup read.\n"));
+ _HTProgress(CONNECTION_INTERRUPTED);
+ }
+ status = HT_INTERRUPTED;
+ goto clean_up;
+ }
+ /*
+ * Set up the stream stack to handle the body of the message.
+ */
+ if (do_head || keep_mime_headers) {
+ /*
+ * It was a HEAD request, or we want the headers and source.
+ */
+ start_of_data = line_kept_clean;
+#ifdef SH_EX /* FIX BUG by kaz@maczuka.hitachi.ibaraki.jp */
+/* GIF file contains \0, so strlen does not return the data length */
+ length = real_length_of_line;
+#else
+ length = rawlength;
+#endif
+ format_in = HTAtom_for(STR_PLAINTEXT);
+
+ } else if (doing_redirect) {
+
+ format_in = HTAtom_for("message/x-http-redirection");
+ StrAllocCopy(anAnchor->content_type, HTAtom_name(format_in));
+ if (traversal) {
+ format_out = WWW_DEBUG;
+ if (!sink)
+ sink = HTErrorStream();
+ } else if (!dump_output_immediately &&
+ format_out == WWW_DOWNLOAD) {
+ /*
+ * Convert a download request to a presentation request for
+ * interactive users. - FM
+ */
+ format_out = WWW_PRESENT;
+ }
+ }
+
+ target = HTStreamStack(format_in,
+ format_out,
+ sink, anAnchor);
+
+ if (target == NULL) {
+ char *buffer = NULL;
+
+ HTTP_NETCLOSE(s, handle);
+ HTSprintf0(&buffer, CANNOT_CONVERT_I_TO_O,
+ HTAtom_name(format_in), HTAtom_name(format_out));
+ _HTProgress(buffer);
+ FREE(buffer);
+ status = -1;
+ goto clean_up;
+ }
+
+ /*
+ * Recycle the first chunk of data, in all cases.
+ */
+ (*target->isa->put_block) (target, start_of_data, length);
+
+ /*
+ * Go pull the bulk of the data down.
+ */
+ rv = HTCopy(anAnchor, s, (void *) handle, target);
+
+ /*
+ * If we get here with doing_redirect set, it means that we were looking
+ * for a Location header. We either have got it now in redirecting_url -
+ * in that case the stream should not have loaded any data. Or we didn't
+ * get it, in that case the stream may have presented the message body
+ * normally. - kw
+ */
+
+ if (rv == -1) {
+ /*
+ * Intentional interrupt before data were received, not an error
+ */
+ if (doing_redirect && traversal)
+ status = -1;
+ else
+ status = HT_INTERRUPTED;
+ HTTP_NETCLOSE(s, handle);
+ goto clean_up;
+ }
+
+ if (rv == -2) {
+ /*
+ * Aw hell, a REAL error, maybe cuz it's a dumb HTTP0 server
+ */
+ (*target->isa->_abort) (target, NULL);
+ if (doing_redirect && redirecting_url) {
+ /*
+ * Got a location before the error occurred? Then consider it an
+ * interrupt but proceed below as normal. - kw
+ */
+ /* do nothing here */
+ } else {
+ HTTP_NETCLOSE(s, handle);
+ if (!doing_redirect && !already_retrying && !do_post) {
+ CTRACE((tfp, "HTTP: Trying again with HTTP0 request.\n"));
+ /*
+ * May as well consider it an interrupt -- right?
+ */
+ FREE(line_buffer);
+ FREE(line_kept_clean);
+ extensions = NO;
+ already_retrying = TRUE;
+ _HTProgress(RETRYING_AS_HTTP0);
+ goto try_again;
+ } else {
+ status = HT_NOT_LOADED;
+ goto clean_up;
+ }
+ }
+ }
+
+ /*
+ * Free if complete transmission (socket was closed before return). Close
+ * socket if partial transmission (was freed on abort).
+ */
+ if (rv != HT_INTERRUPTED && rv != -2) {
+ (*target->isa->_free) (target);
+ } else {
+ HTTP_NETCLOSE(s, handle);
+ }
+
+ if (doing_redirect) {
+ if (redirecting_url) {
+ /*
+ * Set up for checking redirecting_url in LYGetFile.c for
+ * restrictions before we seek the document at that Location. - FM
+ */
+ CTRACE((tfp, "HTTP: Picked up location '%s'\n",
+ redirecting_url));
+ if (rv == HT_INTERRUPTED) {
+ /*
+ * Intentional interrupt after data were received, not an error
+ * (probably). We take it as a user request to abandon the
+ * redirection chain.
+ *
+ * This could reasonably be changed (by just removing this
+ * block), it would make sense if there are redirecting
+ * resources that "hang" after sending the headers. - kw
+ */
+ FREE(redirecting_url);
+ CTRACE((tfp, "HTTP: Interrupted followup read.\n"));
+ status = HT_INTERRUPTED;
+ goto clean_up;
+ }
+ HTProgress(line_buffer);
+ if (server_status == 305) { /* Use Proxy */
+ /*
+ * Make sure the proxy field ends with a slash. - FM
+ */
+ if (redirecting_url[strlen(redirecting_url) - 1]
+ != '/')
+ StrAllocCat(redirecting_url, "/");
+ /*
+ * Append our URL. - FM
+ */
+ StrAllocCat(redirecting_url, anAnchor->address);
+ CTRACE((tfp, "HTTP: Proxy URL is '%s'\n",
+ redirecting_url));
+ }
+ if (!do_post ||
+ server_status == 303 ||
+ server_status == 302) {
+ /*
+ * We don't have POST content (nor support PUT or DELETE), or
+ * the status is "See Other" or "General Redirection" and we
+ * can convert to GET, so go back and check out the new URL. -
+ * FM
+ */
+ status = HT_REDIRECTING;
+ goto clean_up;
+ }
+ /*
+ * Make sure the user wants to redirect the POST content, or treat
+ * as GET - FM & DK
+ */
+ switch (HTConfirmPostRedirect(redirecting_url,
+ server_status)) {
+ /*
+ * User failed to confirm. Abort the fetch.
+ */
+ case 0:
+ FREE(redirecting_url);
+ status = HT_NO_DATA;
+ goto clean_up;
+
+ /*
+ * User wants to treat as GET with no content. Go back to
+ * check out the URL.
+ */
+ case 303:
+ break;
+
+ /*
+ * Set the flag to retain the POST content and go back to check
+ * out the URL. - FM
+ */
+ default:
+ redirect_post_content = TRUE;
+ }
+
+ /* Lou's old comment: - FM */
+ /* OK, now we've got the redirection URL temporarily stored
+ in external variable redirecting_url, exported from HTMIME.c,
+ since there's no straightforward way to do this in the library
+ currently. Do the right thing. */
+
+ status = HT_REDIRECTING;
+
+ } else {
+ status = traversal ? -1 : HT_LOADED;
+ }
+
+ } else {
+ /*
+ * If any data were received, treat as a complete transmission
+ */
+ status = HT_LOADED;
+ }
+
+ /*
+ * Clean up
+ */
+ clean_up:
+ FREE(line_buffer);
+ FREE(line_kept_clean);
+
+ done:
+ /*
+ * Clear out on exit, just in case.
+ */
+ reloading = FALSE;
+#ifdef USE_SSL
+ FREE(connect_host);
+ if (handle) {
+ SSL_free(handle);
+ SSL_handle = handle = NULL;
+ }
+#endif /* USE_SSL */
+ dump_server_status = server_status;
+ return status;
+}
+
+/* Protocol descriptor
+*/
+#ifdef GLOBALDEF_IS_MACRO
+#define _HTTP_C_GLOBALDEF_1_INIT { "http", HTLoadHTTP, 0}
+GLOBALDEF(HTProtocol, HTTP, _HTTP_C_GLOBALDEF_1_INIT);
+#define _HTTP_C_GLOBALDEF_2_INIT { "https", HTLoadHTTP, 0}
+GLOBALDEF(HTProtocol, HTTPS, _HTTP_C_GLOBALDEF_2_INIT);
+#else
+GLOBALDEF HTProtocol HTTP =
+{"http", HTLoadHTTP, 0};
+GLOBALDEF HTProtocol HTTPS =
+{"https", HTLoadHTTP, 0};
+#endif /* GLOBALDEF_IS_MACRO */
diff --git a/WWW/Library/Implementation/HTTP.h b/WWW/Library/Implementation/HTTP.h
new file mode 100644
index 0000000..ea0f835
--- /dev/null
+++ b/WWW/Library/Implementation/HTTP.h
@@ -0,0 +1,47 @@
+/*
+ * $LynxId: HTTP.h,v 1.12 2020/01/21 21:59:06 tom Exp $
+ *
+ * /Net/dxcern/userd/timbl/hypertext/WWW/Library/Implementation/HTTP.html
+ * HYPERTEXT TRANSFER PROTOCOL
+ */
+#ifndef HTTP_H
+#define HTTP_H
+
+#include <HTAccess.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#ifdef GLOBALREF_IS_MACRO
+ extern GLOBALREF (HTProtocol, HTTP);
+ extern GLOBALREF (HTProtocol, HTTPS);
+
+#else
+ GLOBALREF HTProtocol HTTP;
+ GLOBALREF HTProtocol HTTPS;
+#endif /* GLOBALREF_IS_MACRO */
+
+#define URL_GET_METHOD 1
+#define URL_POST_METHOD 2
+#define URL_MAIL_METHOD 3
+
+ /*
+ * Special value for 'reloading' used to tell HTLoadDocument() that the
+ * user asked for a reload, versus Lynx doing a reload for other reasons.
+ */
+#define REAL_RELOAD (TRUE + 1)
+
+ extern int ws_read_per_sec;
+ extern BOOLEAN reloading;
+ extern char *redirecting_url;
+ extern BOOL permanent_redirection;
+ extern BOOL redirect_post_content;
+
+#ifdef USE_SSL
+ extern SSL *SSL_handle;
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* HTTP_H */
diff --git a/WWW/Library/Implementation/HTTelnet.c b/WWW/Library/Implementation/HTTelnet.c
new file mode 100644
index 0000000..fb0098a
--- /dev/null
+++ b/WWW/Library/Implementation/HTTelnet.c
@@ -0,0 +1,553 @@
+/*
+ * $LynxId: HTTelnet.c,v 1.41 2013/11/28 11:15:19 tom Exp $
+ *
+ * Telnet Access, Rlogin, etc HTTelnet.c
+ * ==========================
+ *
+ * Authors
+ * TBL Tim Berners-Lee timbl@info.cern.ch
+ * JFG Jean-Francois Groff jgh@next.com
+ * DD Denis DeLaRoca (310) 825-4580 <CSP1DWD@mvs.oac.ucla.edu>
+ * History
+ * 8 Jun 92 Telnet hopping prohibited as telnet is not secure (TBL)
+ * 26 Jun 92 When over DECnet, suppressed FTP, Gopher and News. (JFG)
+ * 6 Oct 92 Moved HTClientHost and logfile into here. (TBL)
+ * 17 Dec 92 Tn3270 added, bug fix. (DD)
+ * 2 Feb 93 Split from HTAccess.c. Registration.(TBL)
+ */
+
+#include <HTUtils.h>
+#include <LYUtils.h>
+
+/* Implements:
+*/
+#include <HTTelnet.h>
+
+#include <HTParse.h>
+#include <HTAnchor.h>
+#include <HTTP.h>
+#include <HTFile.h>
+
+#include <HTTCP.h>
+#include <HText.h>
+
+#include <HTAccess.h>
+#include <HTAlert.h>
+
+#include <LYStrings.h>
+#include <LYClean.h>
+#include <LYLeaks.h>
+
+#ifdef __GNUC__
+static void do_system(char *) GCC_UNUSED;
+#endif
+
+static void do_system(char *command)
+{
+ if (non_empty(command)) {
+ CTRACE((tfp, "HTTelnet: Command is: %s\n\n", command));
+ LYSystem(command);
+ }
+ FREE(command);
+}
+
+/* Telnet or "rlogin" access
+ * -------------------------
+ */
+static int remote_session(char *acc_method, char *host)
+{
+ const char *program;
+ char *user = host;
+ char *password = NULL;
+ char *cp;
+ char *hostname;
+ char *port;
+ char *command = NULL;
+ enum _login_protocol {
+ telnet,
+ rlogin,
+ tn3270
+ } login_protocol =
+ strcmp(acc_method, "rlogin") == 0 ? rlogin :
+ strcmp(acc_method, "tn3270") == 0 ? tn3270 : telnet;
+
+ /*
+ * Modified to allow for odd chars in a username only if exists.
+ * 05-28-94 Lynx 2-3-1 Garrett Arch Blythe
+ */
+ /* prevent telnet://hostname;rm -rf * URL's (VERY BAD)
+ * *cp=0; // terminate at any ;,<,>,`,|,",' or space or return
+ * or tab to prevent security hole
+ */
+ for (cp = (StrChr(host, '@') ? StrChr(host, '@') : host); *cp != '\0';
+ cp++) {
+ if (!isalnum(UCH(*cp)) && *cp != '_' && *cp != '-' &&
+ *cp != ':' && *cp != '.' && *cp != '@') {
+ *cp = '\0';
+ break;
+ }
+ }
+
+ hostname = StrChr(host, '@');
+
+ if (hostname) {
+ *hostname++ = '\0'; /* Split */
+ } else {
+ hostname = host;
+ user = NULL; /* No user specified */
+ }
+
+ port = StrChr(hostname, ':');
+ if (port)
+ *port++ = '\0'; /* Split */
+
+ if (*hostname == '\0') {
+ CTRACE((tfp, "HTTelnet: No host specified!\n"));
+ return HT_NO_DATA;
+ } else if (!valid_hostname(hostname)) {
+ char *prefix = NULL;
+ char *line = NULL;
+
+ CTRACE((tfp, "HTTelnet: Invalid hostname %s!\n", host));
+ HTSprintf0(&prefix,
+ gettext("remote %s session:"), acc_method);
+ HTSprintf0(&line,
+ gettext("Invalid hostname %s"), host);
+ HTAlwaysAlert(prefix, line);
+ FREE(prefix);
+ FREE(line);
+ return HT_NO_DATA;
+ }
+
+ if (user) {
+ password = StrChr(user, ':');
+ if (password) {
+ *password++ = '\0';
+ }
+ }
+
+ /* If the person is already telnetting etc, forbid hopping */
+ /* This is a security precaution, for us and remote site */
+
+ if (HTSecure) {
+
+#ifdef TELNETHOPPER_MAIL
+ HTSprintf0(&command,
+ "finger @%s | mail -s \"**telnethopper %s\" tbl@dxcern.cern.ch",
+ HTClientHost, HTClientHost);
+ do_system(command);
+#endif
+ printf("\n\nSorry, but the service you have selected is one\n");
+ printf("to which you have to log in. If you were running www\n");
+ printf("on your own computer, you would be automatically connected.\n");
+ printf("For security reasons, this is not allowed when\n");
+ printf("you log in to this information service remotely.\n\n");
+
+ printf("You can manually connect to this service using %s\n",
+ acc_method);
+ printf("to host %s", hostname);
+ if (user)
+ printf(", user name %s", user);
+ if (password)
+ printf(", password %s", password);
+ if (port)
+ printf(", port %s", port);
+ printf(".\n\n");
+ return HT_NO_DATA;
+ }
+
+ /* Not all telnet servers get it even if user name is specified so we
+ * always tell the guy what to log in as.
+ */
+ if (user && login_protocol != rlogin)
+ printf("When you are connected, log in as: %s\n", user);
+ if (password && login_protocol != rlogin)
+ printf(" The password is: %s\n", password);
+ fflush(stdout);
+
+/*
+ * NeXTSTEP is the implied version of the NeXT operating system.
+ * You may need to define this yourself.
+ */
+#if !defined(TELNET_DONE) && (defined(NeXT) && defined(NeXTSTEP) && NeXTSTEP<=20100)
+#define FMT_TELNET "%s%s%s %s %s"
+
+ if ((program = HTGetProgramPath(ppTELNET)) != NULL) {
+ HTAddParam(&command, FMT_TELNET, 1, program);
+ HTOptParam(&command, FMT_TELNET, 2, user ? " -l " : "");
+ HTAddParam(&command, FMT_TELNET, 3, user);
+ HTAddParam(&command, FMT_TELNET, 4, hostname);
+ HTAddParam(&command, FMT_TELNET, 5, port);
+ HTEndParam(&command, FMT_TELNET, 5);
+ }
+ do_system(command);
+#define TELNET_DONE
+#endif
+
+/* Most unix machines support username only with rlogin */
+#if !defined(TELNET_DONE) && (defined(UNIX) || defined(DOSPATH) || defined(__CYGWIN__))
+
+#define FMT_RLOGIN "%s %s%s%s"
+#define FMT_TN3270 "%s %s %s"
+#define FMT_TELNET "%s %s %s"
+
+ switch (login_protocol) {
+ case rlogin:
+ if ((program = HTGetProgramPath(ppRLOGIN)) != NULL) {
+ HTAddParam(&command, FMT_RLOGIN, 1, program);
+ HTAddParam(&command, FMT_RLOGIN, 2, hostname);
+ HTOptParam(&command, FMT_RLOGIN, 3, user ? " -l " : "");
+ HTAddParam(&command, FMT_RLOGIN, 4, user);
+ HTEndParam(&command, FMT_RLOGIN, 4);
+ }
+ break;
+
+ case tn3270:
+ if ((program = HTGetProgramPath(ppTN3270)) != NULL) {
+ HTAddParam(&command, FMT_TN3270, 1, program);
+ HTAddParam(&command, FMT_TN3270, 2, hostname);
+ HTAddParam(&command, FMT_TN3270, 3, port);
+ HTEndParam(&command, FMT_TN3270, 3);
+ }
+ break;
+
+ case telnet:
+ if ((program = HTGetProgramPath(ppTELNET)) != NULL) {
+ HTAddParam(&command, FMT_TELNET, 1, program);
+ HTAddParam(&command, FMT_TELNET, 2, hostname);
+ HTAddParam(&command, FMT_TELNET, 3, port);
+ HTEndParam(&command, FMT_TELNET, 3);
+ }
+ break;
+ }
+
+ LYSystem(command);
+#define TELNET_DONE
+#endif /* unix */
+
+/* VMS varieties */
+#if !defined(TELNET_DONE) && (defined(MULTINET))
+ if (login_protocol == rlogin) {
+ HTSprintf0(&command, "RLOGIN%s%s%s%s%s %s", /*lm 930713 */
+ user ? "/USERNAME=\"" : "",
+ NonNull(user),
+ user ? "\"" : "",
+ port ? "/PORT=" : "",
+ NonNull(port),
+ hostname);
+
+ } else if (login_protocol == tn3270) {
+ HTSprintf0(&command, "TELNET/TN3270 %s%s %s",
+ port ? "/PORT=" : "",
+ NonNull(port),
+ hostname);
+
+ } else { /* TELNET */
+ HTSprintf0(&command, "TELNET %s%s %s",
+ port ? "/PORT=" : "",
+ NonNull(port),
+ hostname);
+ }
+
+ do_system(command);
+#define TELNET_DONE
+#endif /* MULTINET */
+
+#if !defined(TELNET_DONE) && defined(WIN_TCP)
+ if ((cp = getenv("WINTCP_COMMAND_STYLE")) != NULL &&
+ 0 == strncasecomp(cp, "VMS", 3)) { /* VMS command syntax */
+ if (login_protocol == rlogin) {
+ HTSprintf0(&command, "RLOGIN%s%s%s%s%s %s", /*lm 930713 */
+ user ? "/USERNAME=\"" : "",
+ NonNull(user),
+ user ? "\"" : "",
+ port ? "/PORT=" : "",
+ NonNull(port),
+ hostname);
+
+ } else if (login_protocol == tn3270) {
+ HTSprintf0(&command, "TELNET/TN3270 %s%s %s",
+ port ? "/PORT=" : "",
+ NonNull(port),
+ hostname);
+
+ } else { /* TELNET */
+ HTSprintf0(&command, "TELNET %s%s %s",
+ port ? "/PORT=" : "",
+ NonNull(port),
+ hostname);
+ }
+
+ } else { /* UNIX command syntax */
+ if (login_protocol == rlogin) {
+ HTSprintf0(&command, "RLOGIN %s%s%s%s%s",
+ hostname,
+ user ? " -l " : "",
+ user ? "\"" : "",
+ NonNull(user),
+ user ? "\"" : "");
+
+ } else if (login_protocol == tn3270) {
+ HTSprintf0(&command, "TN3270 %s %s",
+ hostname,
+ NonNull(port));
+
+ } else { /* TELNET */
+ HTSprintf0(&command, "TELNET %s %s",
+ hostname,
+ NonNull(port));
+ }
+ }
+
+ do_system(command);
+#define TELNET_DONE
+#endif /* WIN_TCP */
+
+#if !defined(TELNET_DONE) && defined(UCX)
+ if (login_protocol == rlogin) {
+ HTSprintf0(&command, "RLOGIN%s%s%s %s %s",
+ user ? "/USERNAME=\"" : "",
+ NonNull(user),
+ user ? "\"" : "",
+ hostname,
+ NonNull(port));
+
+ } else if (login_protocol == tn3270) {
+ HTSprintf0(&command, "TN3270 %s %s",
+ hostname,
+ NonNull(port));
+
+ } else { /* TELNET */
+ HTSprintf0(&command, "TELNET %s %s",
+ hostname,
+ NonNull(port));
+ }
+
+ do_system(command);
+#define TELNET_DONE
+#endif /* UCX */
+
+#if !defined(TELNET_DONE) && defined(CMU_TCP)
+ if (login_protocol == telnet) {
+ HTSprintf0(&command, "TELNET %s%s %s",
+ port ? "/PORT=" : "",
+ NonNull(port),
+ hostname);
+ do_system(command);
+ } else {
+ printf("\nSorry, this browser was compiled without the %s access option.\n",
+ acc_method);
+ printf("\nPress <return> to return to Lynx.");
+ LYgetch();
+ HadVMSInterrupt = FALSE;
+ }
+#define TELNET_DONE
+#endif /* CMU_TCP */
+
+#if !defined(TELNET_DONE) && defined(SOCKETSHR_TCP)
+ if (getenv("MULTINET_SOCKET_LIBRARY") != NULL) {
+ if (login_protocol == rlogin) {
+ HTSprintf0(&command, "MULTINET RLOGIN%s%s%s%s %s", /*lm 930713 */
+ user ? "/USERNAME=" : "",
+ NonNull(user),
+ port ? "/PORT=" : "",
+ NonNull(port),
+ hostname);
+
+ } else if (login_protocol == tn3270) {
+ HTSprintf0(&command, "MULTINET TELNET/TN3270 %s%s %s",
+ port ? "/PORT=" : "",
+ NonNull(port),
+ hostname);
+
+ } else { /* TELNET */
+ HTSprintf0(&command, "MULTINET TELNET %s%s %s",
+ port ? "/PORT=" : "",
+ NonNull(port),
+ hostname);
+ }
+
+ do_system(command);
+ return HT_NO_DATA; /* Ok - it was done but no data */
+ } else if ((cp = getenv("WINTCP_COMMAND_STYLE")) != NULL) {
+ if (0 == strncasecomp(cp, "VMS", 3)) { /* VMS command syntax */
+ if (login_protocol == rlogin) {
+ HTSprintf0(&command, "RLOGIN%s%s%s%s %s", /*lm 930713 */
+ user ? "/USERNAME=" : "",
+ NonNull(user),
+ port ? "/PORT=" : "",
+ NonNull(port),
+ hostname);
+ } else if (login_protocol == tn3270) {
+ HTSprintf0(&command, "TELNET/TN3270 %s%s %s",
+ port ? "/PORT=" : "",
+ NonNull(port),
+ hostname);
+ } else { /* TELNET */
+ HTSprintf0(&command, "TELNET %s%s %s",
+ port ? "/PORT=" : "",
+ NonNull(port),
+ hostname);
+ }
+ } else { /* UNIX command syntax */
+ if (login_protocol == rlogin) {
+ HTSprintf0(&command, "RLOGIN %s%s%s",
+ hostname,
+ user ? " -l " : "",
+ NonNull(user));
+ } else if (login_protocol == tn3270) {
+ HTSprintf0(&command, "TN3270 %s %s",
+ hostname,
+ NonNull(port));
+ } else { /* TELNET */
+ HTSprintf0(&command, "TELNET %s %s",
+ hostname,
+ NonNull(port));
+ }
+ }
+
+ do_system(command);
+ return HT_NO_DATA; /* Ok - it was done but no data */
+ } else if (getenv("UCX$DEVICE") != NULL
+ || getenv("TCPIP$DEVICE") != NULL) {
+ if (login_protocol == rlogin) {
+ HTSprintf0(&command, "RLOGIN%s%s %s %s",
+ user ? "/USERNAME=" : "",
+ NonNull(user),
+ hostname,
+ NonNull(port));
+
+ } else if (login_protocol == tn3270) {
+ HTSprintf0(&command, "TN3270 %s %s",
+ hostname,
+ NonNull(port));
+
+ } else { /* TELNET */
+ HTSprintf0(&command, "TELNET %s %s",
+ hostname,
+ NonNull(port));
+ }
+
+ do_system(command);
+ return HT_NO_DATA; /* Ok - it was done but no data */
+ } else if (getenv("CMUTEK_ROOT") != NULL) {
+ if (login_protocol == telnet) {
+ HTSprintf0(&command, "TELNET %s%s %s",
+ port ? "/PORT=" : "",
+ NonNull(port),
+ hostname);
+ do_system(command);
+ } else {
+ printf("\nSorry, this browser was compiled without the %s access option.\n",
+ acc_method);
+ printf("\nPress <return> to return to Lynx.");
+ LYgetch();
+ HadVMSInterrupt = FALSE;
+ }
+ } else {
+ if (login_protocol == telnet) {
+ HTSprintf0(&command, "TELNET %s%s %s",
+ port ? "/PORT=" : "",
+ NonNull(port),
+ hostname);
+ do_system(command);
+ } else {
+ printf("\nSorry, this browser was compiled without the %s access option.\n",
+ acc_method);
+ printf("\nPress <return> to return to Lynx.");
+ LYgetch();
+ HadVMSInterrupt = FALSE;
+ }
+ }
+#define TELNET_DONE
+#endif /* SOCKETSHR_TCP */
+
+#if !defined(TELNET_DONE) && (defined(SIMPLE_TELNET) || defined(VM))
+ if (login_protocol == telnet) { /* telnet only */
+ HTSprintf0(&command, "TELNET %s", /* @@ Bug: port ignored */
+ hostname);
+ do_system(command);
+ return HT_NO_DATA; /* Ok - it was done but no data */
+ }
+#define TELNET_DONE
+#endif
+
+#ifndef TELNET_DONE
+ printf("\nSorry, this browser was compiled without the %s access option.\n",
+ acc_method);
+ printf("\nTo access the information you must %s to %s", acc_method, hostname);
+ if (port)
+ printf(" (port %s)", port);
+ if (user)
+ printf("\nlogging in with username %s", user);
+ printf(".\n");
+ {
+ printf("\nPress <return> to return to Lynx.");
+ fflush(stdout);
+ LYgetch();
+#ifdef VMS
+ HadVMSInterrupt = FALSE;
+#endif /* VMS */
+ }
+#endif /* !TELNET_DONE */
+ return HT_NO_DATA;
+}
+
+/* "Load a document" -- establishes a session
+ * ------------------------------------------
+ *
+ * On entry,
+ * addr must point to the fully qualified hypertext reference.
+ *
+ * On exit,
+ * returns <0 Error has occurred.
+ * >=0 Value of file descriptor or socket to be used
+ * to read data.
+ * *pFormat Set to the format of the file, if known.
+ * (See WWW.h)
+ *
+ */
+static int HTLoadTelnet(const char *addr,
+ HTParentAnchor *anchor GCC_UNUSED,
+ HTFormat format_out GCC_UNUSED,
+ HTStream *sink) /* Ignored */
+{
+ char *acc_method;
+ char *host;
+ int status;
+
+ if (sink) {
+ CTRACE((tfp,
+ "HTTelnet: Can't output a live session -- must be interactive!\n"));
+ return HT_NO_DATA;
+ }
+ acc_method = HTParse(addr, STR_FILE_URL, PARSE_ACCESS);
+
+ host = HTParse(addr, "", PARSE_HOST);
+ if (!host || *host == '\0') {
+ status = HT_NO_DATA;
+ CTRACE((tfp, "HTTelnet: No host specified!\n"));
+ } else {
+ status = remote_session(acc_method, host);
+ }
+
+ FREE(host);
+ FREE(acc_method);
+ return status;
+}
+
+#ifdef GLOBALDEF_IS_MACRO
+#define _HTTELNET_C_1_INIT { "telnet", HTLoadTelnet, NULL }
+#define _HTTELNET_C_2_INIT { "rlogin", HTLoadTelnet, NULL }
+#define _HTTELNET_C_3_INIT { "tn3270", HTLoadTelnet, NULL }
+GLOBALDEF(HTProtocol, HTTelnet, _HTTELNET_C_1_INIT);
+GLOBALDEF(HTProtocol, HTRlogin, _HTTELNET_C_2_INIT);
+GLOBALDEF(HTProtocol, HTTn3270, _HTTELNET_C_3_INIT);
+#else
+GLOBALDEF HTProtocol HTTelnet =
+{"telnet", HTLoadTelnet, NULL};
+GLOBALDEF HTProtocol HTRlogin =
+{"rlogin", HTLoadTelnet, NULL};
+GLOBALDEF HTProtocol HTTn3270 =
+{"tn3270", HTLoadTelnet, NULL};
+#endif /* GLOBALDEF_IS_MACRO */
diff --git a/WWW/Library/Implementation/HTTelnet.h b/WWW/Library/Implementation/HTTelnet.h
new file mode 100644
index 0000000..f2208d8
--- /dev/null
+++ b/WWW/Library/Implementation/HTTelnet.h
@@ -0,0 +1,28 @@
+/* /Net/dxcern/userd/timbl/hypertext/WWW/Library/Implementation/HTTelnet.html
+ TELNET AND SIMILAR ACCESS METHODS
+
+ */
+
+#ifndef HTTELNET_H
+#define HTTELNET_H
+
+#include <HTAccess.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#ifdef GLOBALREF_IS_MACRO
+ extern GLOBALREF (HTProtocol, HTTelnet);
+ extern GLOBALREF (HTProtocol, HTRlogin);
+ extern GLOBALREF (HTProtocol, HTTn3270);
+
+#else
+ GLOBALREF HTProtocol HTTelnet;
+ GLOBALREF HTProtocol HTRlogin;
+ GLOBALREF HTProtocol HTTn3270;
+#endif /* GLOBALREF_IS_MACRO */
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* HTTELNET_H */
diff --git a/WWW/Library/Implementation/HTUU.c b/WWW/Library/Implementation/HTUU.c
new file mode 100644
index 0000000..4848cce
--- /dev/null
+++ b/WWW/Library/Implementation/HTUU.c
@@ -0,0 +1,210 @@
+/*
+ * $LynxId: HTUU.c,v 1.11 2010/09/21 23:55:12 tom Exp $
+ *
+ * MODULE HTUU.c
+ * UUENCODE AND UUDECODE
+ *
+ * ACKNOWLEDGEMENT:
+ * This code is taken from rpem distribution, and was originally
+ * written by Mark Riordan.
+ *
+ * AUTHORS:
+ * MR Mark Riordan riordanmr@clvax1.cl.msu.edu
+ * AL Ari Luotonen luotonen@dxcern.cern.ch
+ *
+ * HISTORY:
+ * Added as part of the WWW library and edited to conform
+ * with the WWW project coding standards by: AL 5 Aug 1993
+ * Originally written by: MR 12 Aug 1990
+ * Original header text:
+ * -------------------------------------------------------------
+ * File containing routines to convert a buffer
+ * of bytes to/from RFC 1113 printable encoding format.
+ *
+ * This technique is similar to the familiar Unix uuencode
+ * format in that it maps 6 binary bits to one ASCII
+ * character (or more aptly, 3 binary bytes to 4 ASCII
+ * characters). However, RFC 1113 does not use the same
+ * mapping to printable characters as uuencode.
+ *
+ * Mark Riordan 12 August 1990 and 17 Feb 1991.
+ * This code is hereby placed in the public domain.
+ * -------------------------------------------------------------
+ */
+
+#include <HTUtils.h>
+#include <HTUU.h>
+
+#include <LYLeaks.h>
+
+static char six2pr[64] =
+{
+ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
+ 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
+ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
+ 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
+ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'
+};
+
+static unsigned char pr2six[256];
+
+/*--- function HTUU_encode -----------------------------------------------
+ *
+ * Encode a single line of binary data to a standard format that
+ * uses only printing ASCII characters (but takes up 33% more bytes).
+ *
+ * Entry bufin points to a buffer of bytes. If nbytes is not
+ * a multiple of three, then the byte just beyond
+ * the last byte in the buffer must be 0.
+ * nbytes is the number of bytes in that buffer.
+ * This cannot be more than 48.
+ * bufcoded points to an output buffer. Be sure that this
+ * can hold at least 1 + (4*nbytes)/3 characters.
+ *
+ * Exit bufcoded contains the coded line. The first 4*nbytes/3 bytes
+ * contain printing ASCII characters representing
+ * those binary bytes. This may include one or
+ * two '=' characters used as padding at the end.
+ * The last byte is a zero byte.
+ * Returns the number of ASCII characters in "bufcoded".
+ */
+int HTUU_encode(unsigned char *bufin,
+ size_t nbytes,
+ char *bufcoded)
+{
+/* ENC is the basic 1 character encoding function to make a char printing */
+#define ENC(c) six2pr[c]
+
+ register char *outptr = bufcoded;
+ size_t i;
+
+ /* This doesn't seem to be needed (AL): register unsigned char *inptr = bufin; */
+
+ for (i = 0; i < nbytes; i += 3) {
+ *(outptr++) = ENC(*bufin >> 2); /* c1 */
+ *(outptr++) = ENC(((*bufin << 4) & 060) | ((bufin[1] >> 4) & 017)); /*c2 */
+ *(outptr++) = ENC(((bufin[1] << 2) & 074) | ((bufin[2] >> 6) & 03)); /*c3 */
+ *(outptr++) = ENC(bufin[2] & 077); /* c4 */
+
+ bufin += 3;
+ }
+
+ /* If nbytes was not a multiple of 3, then we have encoded too
+ * many characters. Adjust appropriately.
+ */
+ if (i == nbytes + 1) {
+ /* There were only 2 bytes in that last group */
+ outptr[-1] = '=';
+ } else if (i == nbytes + 2) {
+ /* There was only 1 byte in that last group */
+ outptr[-1] = '=';
+ outptr[-2] = '=';
+ }
+ *outptr = '\0';
+ return (int) (outptr - bufcoded);
+}
+
+/*--- function HTUU_decode ------------------------------------------------
+ *
+ * Decode an ASCII-encoded buffer back to its original binary form.
+ *
+ * Entry bufcoded points to a uuencoded string. It is
+ * terminated by any character not in
+ * the printable character table six2pr, but
+ * leading whitespace is stripped.
+ * bufplain points to the output buffer; must be big
+ * enough to hold the decoded string (generally
+ * shorter than the encoded string) plus
+ * as many as two extra bytes used during
+ * the decoding process.
+ * outbufsize is the maximum number of bytes that
+ * can fit in bufplain.
+ *
+ * Exit Returns the number of binary bytes decoded.
+ * bufplain contains these bytes.
+ */
+int HTUU_decode(char *bufcoded,
+ unsigned char *bufplain,
+ int outbufsize)
+{
+/* single character decode */
+#define DEC(c) pr2six[(int)c]
+#define MAXVAL 63
+
+ static int first = 1;
+
+ int nbytesdecoded, j;
+ register char *bufin;
+ register unsigned char *bufout = bufplain;
+ register int nprbytes;
+
+ /* If this is the first call, initialize the mapping table.
+ * This code should work even on non-ASCII machines.
+ */
+ if (first) {
+ first = 0;
+ for (j = 0; j < 256; j++)
+ pr2six[j] = MAXVAL + 1;
+
+ for (j = 0; j < 64; j++)
+ pr2six[UCH(six2pr[j])] = UCH(j);
+#if 0
+ /* *INDENT-OFF* */
+ pr2six['A']= 0; pr2six['B']= 1; pr2six['C']= 2; pr2six['D']= 3;
+ pr2six['E']= 4; pr2six['F']= 5; pr2six['G']= 6; pr2six['H']= 7;
+ pr2six['I']= 8; pr2six['J']= 9; pr2six['K']=10; pr2six['L']=11;
+ pr2six['M']=12; pr2six['N']=13; pr2six['O']=14; pr2six['P']=15;
+ pr2six['Q']=16; pr2six['R']=17; pr2six['S']=18; pr2six['T']=19;
+ pr2six['U']=20; pr2six['V']=21; pr2six['W']=22; pr2six['X']=23;
+ pr2six['Y']=24; pr2six['Z']=25; pr2six['a']=26; pr2six['b']=27;
+ pr2six['c']=28; pr2six['d']=29; pr2six['e']=30; pr2six['f']=31;
+ pr2six['g']=32; pr2six['h']=33; pr2six['i']=34; pr2six['j']=35;
+ pr2six['k']=36; pr2six['l']=37; pr2six['m']=38; pr2six['n']=39;
+ pr2six['o']=40; pr2six['p']=41; pr2six['q']=42; pr2six['r']=43;
+ pr2six['s']=44; pr2six['t']=45; pr2six['u']=46; pr2six['v']=47;
+ pr2six['w']=48; pr2six['x']=49; pr2six['y']=50; pr2six['z']=51;
+ pr2six['0']=52; pr2six['1']=53; pr2six['2']=54; pr2six['3']=55;
+ pr2six['4']=56; pr2six['5']=57; pr2six['6']=58; pr2six['7']=59;
+ pr2six['8']=60; pr2six['9']=61; pr2six['+']=62; pr2six['/']=63;
+ /* *INDENT-ON* */
+
+#endif
+ }
+
+ /* Strip leading whitespace. */
+
+ while (*bufcoded == ' ' || *bufcoded == '\t')
+ bufcoded++;
+
+ /* Figure out how many characters are in the input buffer.
+ * If this would decode into more bytes than would fit into
+ * the output buffer, adjust the number of input bytes downwards.
+ */
+ bufin = bufcoded;
+ while (pr2six[UCH(*(bufin++))] <= MAXVAL) ;
+ nprbytes = (int) (bufin - bufcoded - 1);
+ nbytesdecoded = ((nprbytes + 3) / 4) * 3;
+ if (nbytesdecoded > outbufsize) {
+ nprbytes = (outbufsize * 4) / 3;
+ }
+
+ bufin = bufcoded;
+
+ while (nprbytes > 0) {
+ *(bufout++) = UCH((DEC(bufin[0]) << 2) | (DEC(bufin[1]) >> 4));
+ *(bufout++) = UCH((DEC(bufin[1]) << 4) | (DEC(bufin[2]) >> 2));
+ *(bufout++) = UCH((DEC(bufin[2]) << 6) | (DEC(bufin[3])));
+ bufin += 4;
+ nprbytes -= 4;
+ }
+
+ if (nprbytes & 03) {
+ if (pr2six[(int) bufin[-2]] > MAXVAL) {
+ nbytesdecoded -= 2;
+ } else {
+ nbytesdecoded -= 1;
+ }
+ }
+
+ return (nbytesdecoded);
+}
diff --git a/WWW/Library/Implementation/HTUU.h b/WWW/Library/Implementation/HTUU.h
new file mode 100644
index 0000000..93ba435
--- /dev/null
+++ b/WWW/Library/Implementation/HTUU.h
@@ -0,0 +1,36 @@
+/*
+ * $LynxId: HTUU.h,v 1.11 2010/09/25 11:43:27 tom Exp $
+ *
+ * ENCODING TO PRINTABLE CHARACTERS
+
+ File module provides functions HTUU_encode() and HTUU_decode() which convert
+ a buffer of bytes to/from RFC 1113 printable encoding format. This
+ technique is similar to the familiar Unix uuencode format in that it maps 6
+ binary bits to one ASCII character (or more aptly, 3 binary bytes to 4 ASCII
+ characters). However, RFC 1113 does not use the same mapping to printable
+ characters as uuencode.
+
+ */
+
+#ifndef HTUU_H
+#define HTUU_H
+
+#ifndef HTUTILS_H
+#include <HTUtils.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ extern int HTUU_encode(unsigned char *bufin,
+ size_t nbytes,
+ char *bufcoded);
+
+ extern int HTUU_decode(char *bufcoded,
+ unsigned char *bufplain,
+ int outbufsize);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* HTUU_H */
diff --git a/WWW/Library/Implementation/HTUtils.h b/WWW/Library/Implementation/HTUtils.h
new file mode 100644
index 0000000..d01d0dd
--- /dev/null
+++ b/WWW/Library/Implementation/HTUtils.h
@@ -0,0 +1,847 @@
+/*
+ * $LynxId: HTUtils.h,v 1.134 2021/06/29 22:01:12 tom Exp $
+ *
+ * Utility macros for the W3 code library
+ * MACROS FOR GENERAL USE
+ *
+ * See also: the system dependent file "www_tcp.h", which is included here.
+ */
+
+#ifndef NO_LYNX_TRACE
+#define DEBUG /* Turns on trace; turn off for smaller binary */
+#endif
+
+#ifndef HTUTILS_H
+#define HTUTILS_H
+
+#ifdef HAVE_CONFIG_H
+#include <lynx_cfg.h> /* generated by autoconf 'configure' script */
+
+#ifdef HAVE_STDNORETURN_H
+#include <stdnoreturn.h>
+#undef GCC_NORETURN
+#define GCC_NORETURN _Noreturn
+#endif
+
+/* see AC_FUNC_ALLOCA macro */
+#ifdef __GNUC__
+# define alloca(size) __builtin_alloca(size)
+#else
+# ifdef _MSC_VER
+# include <malloc.h>
+# ifndef alloca
+# define alloca(size) _alloca(size)
+# endif
+# else
+# if HAVE_ALLOCA_H
+# include <alloca.h>
+# else
+# ifdef _AIX
+#pragma alloca
+# else
+# ifndef alloca /* predefined by HP cc +Olibcalls */
+char *alloca();
+
+# endif
+# endif
+# endif
+# endif
+#endif
+
+#include <sys/types.h>
+#include <stdio.h>
+
+#else /* HAVE_CONFIG_H */
+
+#ifdef DJGPP
+#include <sys/config.h> /* pseudo-autoconf values for DJGPP libc/headers */
+#define HAVE_TRUNCATE 1
+#define HAVE_ALLOCA 1
+#include <limits.h>
+#endif /* DJGPP */
+
+#include <sys/types.h>
+#include <stdio.h>
+
+/* Explicit system-configure */
+#ifdef VMS
+#define NO_SIZECHANGE
+
+#if defined(VAXC) && !defined(__DECC)
+#define NO_UNISTD_H /* DEC C has unistd.h, but not VAX C */
+#endif
+
+#define NO_KEYPAD
+#define NO_UTMP
+
+#undef NO_FILIO_H
+#define NO_FILIO_H
+
+#define NOUSERS
+#define DISP_PARTIAL /* experimental */
+#endif
+
+#if defined(VMS) || defined(_WINDOWS)
+#define HAVE_STDLIB_H 1
+#endif
+
+/* Accommodate non-autoconf'd Makefile's (VMS, DJGPP, etc) */
+
+#ifndef NO_ARPA_INET_H
+#define HAVE_ARPA_INET_H 1
+#endif
+
+#ifndef NO_CBREAK
+#define HAVE_CBREAK 1
+#endif
+
+#ifndef NO_CUSERID
+#define HAVE_CUSERID 1
+#endif
+
+#ifndef NO_FILIO_H
+#define HAVE_SYS_FILIO_H 1
+#endif
+
+#ifndef NO_GETCWD
+#define HAVE_GETCWD 1
+#endif
+
+#ifndef USE_SLANG
+#ifndef NO_KEYPAD
+#define HAVE_KEYPAD 1
+#endif
+#ifndef NO_TTYTYPE
+#define HAVE_TTYTYPE 1
+#endif
+#endif /* USE_SLANG */
+
+#ifndef NO_PUTENV
+#define HAVE_PUTENV 1
+#endif
+
+#ifndef NO_SIZECHANGE
+#define HAVE_SIZECHANGE 1
+#endif
+
+#ifndef NO_UNISTD_H
+#undef HAVE_UNISTD_H
+#define HAVE_UNISTD_H 1
+#endif
+
+#ifndef NO_UTMP
+#define HAVE_UTMP 1
+#endif
+
+#endif /* HAVE_CONFIG_H */
+
+#include <assert.h>
+
+/* suppress inadvertent use of gettext in makeuctb when cross-compiling */
+#ifdef DONT_USE_GETTEXT
+#undef HAVE_GETTEXT
+#undef HAVE_LIBGETTEXT_H
+#undef HAVE_LIBINTL_H
+#endif
+
+#ifndef HAVE_ICONV
+#undef USE_JAPANESEUTF8_SUPPORT
+#endif
+
+#ifndef lynx_srand
+#define lynx_srand srand
+#endif
+
+#ifndef lynx_rand
+#define lynx_rand rand
+#endif
+
+#if '0' != 48
+#define NOT_ASCII
+#endif
+
+#if '0' == 240
+#define EBCDIC
+#endif
+
+#ifndef LY_MAXPATH
+#define LY_MAXPATH 256
+#endif
+
+#ifndef GCC_NORETURN
+#define GCC_NORETURN /* nothing */
+#endif
+
+#ifndef GCC_UNUSED
+#define GCC_UNUSED /* nothing */
+#endif
+
+#if defined(__GNUC__) && defined(_FORTIFY_SOURCE)
+#define USE_IGNORE_RC
+extern int ignore_unused;
+
+#define IGNORE_RC(func) ignore_unused = (int) func
+#else
+#define IGNORE_RC(func) (void) func
+#endif /* gcc workarounds */
+
+#if defined(__CYGWIN32__) && ! defined(__CYGWIN__)
+#define __CYGWIN__ 1
+#endif
+
+#if defined(__CYGWIN__) /* 1998/12/31 (Thu) 16:13:46 */
+#ifdef USE_OPENSSL_INCL
+#define NOCRYPT /* workaround for openssl 1.0.1e bug */
+#endif
+#include <windows.h> /* #include "windef.h" */
+#define BOOLEAN_DEFINED
+#undef HAVE_POPEN /* FIXME: does this not work, or is it missing */
+#undef small /* see <w32api/rpcndr.h> */
+#endif
+
+#if defined(__DARWIN_NO_LONG_LONG)
+#undef HAVE_ATOLL
+#endif
+
+#if defined(HAVE_ATOLL)
+#define LYatoll(n) atoll(n)
+#else
+extern off_t LYatoll(const char *value);
+#endif
+
+/* cygwin, mingw32, etc. */
+#ifdef FILE_DOES_NOT_EXIST
+#undef FILE_DOES_NOT_EXIST /* see <w32api/winnt.h> */
+#endif
+
+/*
+ * VS .NET 2003 includes winsock.h unconditionally from windows.h,
+ * so we do not want to include windows.h if we want winsock2.h
+ */
+#if defined(_WINDOWS) && !defined(__CYGWIN__)
+
+#ifndef __GNUC__
+#pragma warning (disable : 4100) /* unreferenced formal parameter */
+#pragma warning (disable : 4127) /* conditional expression is constant */
+#pragma warning (disable : 4201) /* nameless struct/union */
+#pragma warning (disable : 4214) /* bit field types other than int */
+#pragma warning (disable : 4310) /* cast truncates constant value */
+#pragma warning (disable : 4514) /* unreferenced inline function has been removed */
+#pragma warning (disable : 4996) /* This function or variable may be unsafe. ... */
+#endif
+
+#if defined(USE_WINSOCK2_H) && (_MSC_VER >= 1300) && (_MSC_VER < 1400)
+#include <winsock2.h> /* includes windows.h, in turn windef.h */
+#else
+#include <windows.h> /* #include "windef.h" */
+#endif
+
+#define BOOLEAN_DEFINED
+
+#if !_WIN_CC /* 1999/09/29 (Wed) 22:00:53 */
+#include <dos.h>
+#endif
+
+#if defined(DECL_SLEEP) && defined(HAVE_CONFIG_H)
+# undef sleep
+# if defined(__MINGW32__)
+# define sleep(n) Sleep((n)*100)
+# else
+extern void sleep(unsigned __seconds);
+# endif
+#elif !defined(__MINGW32__)
+# undef sleep
+extern void sleep(unsigned __seconds);
+#endif
+
+#define popen _popen
+#define pclose _pclose
+
+#if defined(_MSC_VER) && (_MSC_VER > 0)
+typedef unsigned short mode_t;
+#endif
+
+#endif /* _WINDOWS */
+
+#if defined(USE_DEFAULT_COLORS) && !defined(HAVE_USE_DEFAULT_COLORS)
+ /* if we don't have use_default_colors() */
+# undef USE_DEFAULT_COLORS
+#endif
+
+#ifndef USE_COLOR_STYLE
+ /* it's useless for such setup */
+# define NO_EMPTY_HREFLESS_A
+#endif
+
+#if defined(__EMX__) || defined(WIN_EX) || defined(HAVE_POPEN)
+# define CAN_CUT_AND_PASTE
+#endif
+
+#if defined(USE_SLANG) || (defined(USE_COLOR_STYLE) && defined(__EMX__))
+# define USE_BLINK
+#endif
+
+#if defined(DOSPATH) || defined(__EMX__)
+# define USE_DOS_DRIVES /* we allow things like "c:" in paths */
+#endif
+
+#if defined(UNIX)
+# if (defined(__BEOS__) || defined(__CYGWIN__) || defined(__DJGPP__) || defined(__EMX__) || defined(__MINGW32__))
+# define SINGLE_USER_UNIX /* well, at least they try */
+# else
+# define MULTI_USER_UNIX
+# endif
+#endif
+
+/*
+
+ ERROR TYPE
+
+ This is passed back when streams are aborted. It might be nice to have some structure
+ of error messages, numbers, and recursive pointers to reasons. Currently this is a
+ placeholder for something more sophisticated.
+
+ */
+typedef void *HTError; /* Unused at present -- best definition? */
+
+/*
+
+Standard C library for malloc() etc
+
+ */
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+#ifndef EXIT_SUCCESS
+#define EXIT_SUCCESS 0
+#endif
+
+#ifndef EXIT_FAILURE
+#define EXIT_FAILURE 1
+#endif
+
+#ifdef __EMX__
+#include <unistd.h> /* should be re-include protected under EMX */
+#define getcwd _getcwd2
+#define chdir _chdir2
+#endif
+
+#ifdef vax
+#ifdef unix
+#define ultrix /* Assume vax+unix=ultrix */
+#endif /* unix */
+#endif /* vax */
+
+#ifndef VMS
+#ifndef ultrix
+
+#ifdef NeXT
+#include <libc.h> /* NeXT */
+#endif /* NeXT */
+
+#else /* ultrix: */
+
+#include <malloc.h>
+#include <memory.h>
+
+#endif /* !ultrix */
+#else /* VMS: */
+
+#include <unixlib.h>
+#if defined(VAXC) && !defined(__DECC)
+#define malloc VAXC$MALLOC_OPT
+#define calloc VAXC$CALLOC_OPT
+#define free VAXC$FREE_OPT
+#define cfree VAXC$CFREE_OPT
+#define realloc VAXC$REALLOC_OPT
+#endif /* VAXC && !__DECC */
+
+#endif /* !VMS */
+
+#ifndef NULL
+#define NULL ((void *)0)
+#endif
+
+#define DeConst(p) (void *)(intptr_t)(p)
+
+#define isEmpty(s) ((s) == 0 || *(s) == 0)
+#define non_empty(s) !isEmpty(s)
+
+#define NonNull(s) (((s) != 0) ? s : "")
+#define NONNULL(s) (((s) != 0) ? s : "(null)")
+
+/* array/table size */
+#define TABLESIZE(v) (sizeof(v)/sizeof(v[0]))
+
+#define typecalloc(cast) (cast *)calloc((size_t)1, sizeof(cast))
+#define typecallocn(cast,ntypes) (cast *)calloc((size_t)(ntypes),sizeof(cast))
+
+#define typeRealloc(cast,ptr,ntypes) (cast *)realloc(ptr, (size_t)(ntypes)*sizeof(cast))
+
+#define typeMalloc(cast) (cast *)malloc(sizeof(cast))
+#define typeMallocn(cast,ntypes) (cast *)malloc((size_t)(ntypes)*sizeof(cast))
+
+/*
+
+OFTEN USED INTEGER MACROS
+
+ Min and Max functions
+
+ */
+#ifndef HTMIN
+#define HTMIN(a,b) ((a) <= (b) ? (a) : (b))
+#define HTMAX(a,b) ((a) >= (b) ? (a) : (b))
+#endif
+/*
+
+Booleans
+
+ */
+/* Note: GOOD and BAD are already defined (differently) on RS6000 aix */
+/* #define GOOD(status) ((status)38;1) VMS style status: test bit 0 */
+/* #define BAD(status) (!GOOD(status)) Bit 0 set if OK, otherwise clear */
+
+#ifndef _WINDOWS
+#ifndef BOOLEAN_DEFINED
+typedef char BOOLEAN; /* Logical value */
+
+#ifndef CURSES
+#ifndef TRUE
+#define TRUE (BOOLEAN)1
+#define FALSE (BOOLEAN)0
+#endif
+#endif /* CURSES */
+#endif /* BOOLEAN_DEFINED */
+#define BOOLEAN_DEFINED
+#endif /* _WINDOWS */
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1300)
+/* it declares BOOL/BOOLEAN as BYTE/int */
+#else
+#ifndef BOOL
+#define BOOL BOOLEAN
+#endif
+#endif
+
+#ifndef YES
+#define YES (BOOLEAN)1
+#define NO (BOOLEAN)0
+#endif
+
+#define STRING1PTR const char *
+#define STRING2PTR const char * const *
+
+extern BOOL LYOutOfMemory; /* Declared in LYexit.c - FM */
+
+#define TCP_PORT 80 /* Allocated to http by Jon Postel/ISI 24-Jan-92 */
+#define OLD_TCP_PORT 2784 /* Try the old one if no answer on 80 */
+#define DNP_OBJ 80 /* This one doesn't look busy, but we must check */
+ /* That one was for decnet */
+
+/* Inline Function WHITE: Is character c white space? */
+/* For speed, include all control characters */
+
+#define WHITE(c) ((UCH(TOASCII(c))) <= 32)
+
+/* Inline Function LYIsASCII: Is character c a traditional ASCII
+ * character (i.e. <128) after converting from host character set. */
+
+#define LYIsASCII(c) (TOASCII(UCH(c)) < 128)
+
+/*
+
+Success (>=0) and failure (<0) codes
+
+Some of the values are chosen to be HTTP-like, but status return values
+are generally not the response status from any specific protocol.
+
+ */
+
+#define HT_PARSER_OTHER_CONTENT 701 /* tells SGML to change content model */
+#define HT_PARSER_REOPEN_ELT 700 /* tells SGML parser to keep tag open */
+#define HT_REDIRECTING 399
+#define HT_PARTIAL_CONTENT 206 /* Partial Content */
+#define HT_LOADED 200 /* Instead of a socket */
+
+#define HT_OK 0 /* Generic success */
+
+#define HT_ERROR -1 /* Generic failure */
+#define HT_CANNOT_TRANSLATE -4
+#define HT_BAD_EOF -12 /* Premature EOF */
+#define HT_NO_CONNECTION -99 /* ERR no connection available - */
+#define HT_NO_DATA -204 /* OK but no data was loaded - */
+ /* possibly other app started or forked */
+#define HT_NO_ACCESS -401 /* Access not available */
+#define HT_FORBIDDEN -403 /* Access forbidden */
+#define HT_NOT_ACCEPTABLE -406 /* Not Acceptable */
+#define HT_H_ERRNO_VALID -800 /* see h_errno for resolver error */
+#define HT_INTERNAL -900 /* Weird -- should never happen. */
+#define HT_INTERRUPTED -29998
+#define HT_NOT_LOADED -29999
+
+#ifndef va_arg
+# include <stdarg.h>
+#endif
+
+#define LYva_start(ap,format) va_start(ap,format)
+
+/*
+ * GCC can be told that some functions are like printf (and do type-checking on
+ * their parameters).
+ */
+#ifndef GCC_PRINTFLIKE
+#if defined(GCC_PRINTF) && !defined(printf) && !defined(HAVE_LIBUTF8_H)
+#define GCC_PRINTFLIKE(fmt,var) __attribute__((format(printf,fmt,var)))
+#else
+#define GCC_PRINTFLIKE(fmt,var) /*nothing */
+#endif
+#endif
+
+#include <HTString.h> /* String utilities */
+
+/*
+
+Out Of Memory checking for malloc() return:
+
+ */
+#ifndef __FILE__
+#define __FILE__ ""
+#define __LINE__ ""
+#endif
+
+#include <LYexit.h>
+
+/*
+ * Upper- and Lowercase macros
+ *
+ * The problem here is that toupper(x) is not defined officially unless
+ * isupper(x) is. These macros are CERTAINLY needed on #if defined(pyr) ||
+ * define(mips) or BDSI platforms. For safefy, we make them mandatory.
+ *
+ * Note: Pyramid and Mips can't uppercase non-alpha.
+ */
+#include <ctype.h>
+#include <string.h>
+
+#ifndef TOLOWER
+
+#ifdef USE_ASCII_CTYPES
+
+#define TOLOWER(c) ascii_tolower(UCH(c))
+#define TOUPPER(c) ascii_toupper(UCH(c))
+#define ISUPPER(c) ascii_isupper(UCH(c))
+
+#else
+
+#define TOLOWER(c) (isupper(UCH(c)) ? tolower(UCH(c)) : UCH(c))
+#define TOUPPER(c) (islower(UCH(c)) ? toupper(UCH(c)) : UCH(c))
+#define ISUPPER(c) (isupper(UCH(c)))
+
+#endif
+
+#endif /* TOLOWER */
+
+#define FREE(x) {if (x != 0) {free((char *)x); x = NULL;}}
+
+/*
+
+The local equivalents of CR and LF
+
+ We can check for these after net ascii text has been converted to the local
+ representation. Similarly, we include them in strings to be sent as net ascii after
+ translation.
+
+ */
+#define LF FROMASCII('\012') /* ASCII line feed LOCAL EQUIVALENT */
+#define CR FROMASCII('\015') /* Will be converted to ^M for transmission */
+
+/*
+ * Debug message control.
+ */
+#ifdef NO_LYNX_TRACE
+#define WWW_TraceFlag 0
+#define WWW_TraceMask 0
+#define LYTraceLogFP 0
+#else
+extern BOOLEAN WWW_TraceFlag;
+extern int WWW_TraceMask;
+#endif
+
+#define TRACE (WWW_TraceFlag)
+#define TRACE_bit(n) (TRACE && (WWW_TraceMask & (1 << n)) != 0)
+#define TRACE_SGML (TRACE_bit(0))
+#define TRACE_STYLE (TRACE_bit(1))
+#define TRACE_TRST (TRACE_bit(2))
+#define TRACE_CFG (TRACE_bit(3))
+#define TRACE_BSTRING (TRACE_bit(4))
+#define TRACE_COOKIES (TRACE_bit(5))
+#define TRACE_CHARSETS (TRACE_bit(6))
+#define TRACE_GRIDTEXT (TRACE_bit(7))
+#define TRACE_TIMING (TRACE_bit(8))
+#define TRACE_HTPARSE (TRACE_bit(9))
+
+/*
+ * Get printing/scanning formats.
+ */
+#if defined(HAVE_INTTYPES_H)
+#include <inttypes.h>
+#endif
+
+#define DigitsOf(type) (int)((sizeof(type)*8)/3)
+
+/*
+ * Printing/scanning-formats for "off_t", as well as cast needed to fit.
+ */
+#if defined(HAVE_LONG_LONG) && defined(HAVE_INTTYPES_H) && defined(SIZEOF_OFF_T)
+#if (SIZEOF_OFF_T == 8) && defined(PRId64) && defined(SCNd64)
+
+#define PRI_off_t PRId64
+#define SCN_off_t SCNd64
+#define CAST_off_t(n) (int64_t)(n)
+
+#elif (SIZEOF_OFF_T == 4) && defined(PRId32)
+
+#define PRI_off_t PRId32
+#define SCN_off_t SCNd32
+
+#if (SIZEOF_INT == 4)
+#define CAST_off_t(n) (int)(n)
+#elif (SIZEOF_LONG == 4)
+#define CAST_off_t(n) (long)(n)
+#else
+#define CAST_off_t(n) (int32_t)(n)
+#endif
+
+#endif
+#endif
+
+#ifndef PRI_off_t
+#define GUESS_PRI_off_t
+#if (SIZEOF_OFF_T == SIZEOF_LONG)
+#define PRI_off_t "ld"
+#define SCN_off_t "ld"
+#define CAST_off_t(n) (long)(n)
+#elif defined(HAVE_LONG_LONG)
+#define PRI_off_t "lld"
+#define SCN_off_t "lld"
+#define CAST_off_t(n) (long long)(n)
+#else
+#define PRI_off_t "ld"
+/* SCN_off_t requires workaround */
+#define CAST_off_t(n) (long)(n)
+#endif
+#endif
+
+/*
+ * MinGW-32 uses only 32-bit DLL, which limits printing.
+ */
+#if defined(__MINGW32__)
+#undef PRI_off_t
+#undef CAST_off_t
+#define PRI_off_t "ld"
+#define CAST_off_t(n) (long)(n)
+#endif
+
+/*
+ * Printing-format for "time_t", as well as cast needed to fit.
+ */
+#if defined(HAVE_LONG_LONG) && defined(HAVE_INTTYPES_H) && defined(SIZEOF_TIME_T)
+#if (SIZEOF_TIME_T == 8) && defined(PRId64)
+
+#define PRI_time_t PRId64
+#define SCN_time_t SCNd64
+#define CAST_time_t(n) (int64_t)(n)
+
+#elif (SIZEOF_TIME_T == 4) && defined(PRId32)
+
+#define PRI_time_t PRId32
+#define SCN_time_t SCNd32
+
+#if (SIZEOF_INT == 4)
+#define CAST_time_t(n) (int)(n)
+#elif (SIZEOF_LONG == 4)
+#define CAST_time_t(n) (long)(n)
+#else
+#define CAST_time_t(n) (int32_t)(n)
+#endif
+
+#endif
+#endif
+
+#ifndef PRI_time_t
+#if defined(HAVE_LONG_LONG) && (SIZEOF_TIME_T > SIZEOF_LONG)
+#define PRI_time_t "lld"
+#define SCN_time_t "lld"
+#define CAST_time_t(n) (long long)(n)
+#else
+#define PRI_time_t "ld"
+#define SCN_time_t "ld"
+#define CAST_time_t(n) (long)(n)
+#endif
+#endif
+
+/*
+ * Printing-format for "UCode_t".
+ */
+#define PRI_UCode_t "lX"
+#define CAST_UCode_t(n) (unsigned long)(n)
+
+/*
+ * Verbose-tracing.
+ */
+#if defined(USE_VERTRACE) && !defined(LY_TRACELINE)
+#define LY_TRACELINE __LINE__
+#endif
+
+#if defined(LY_TRACELINE)
+#define LY_SHOWWHERE fprintf( tfp, "%s: %d: ", __FILE__, LY_TRACELINE ),
+#else
+#define LY_SHOWWHERE /* nothing */
+#endif
+
+#define CTRACE(p) ((void)((TRACE) && ( LY_SHOWWHERE fprintf p )))
+#define CTRACE2(m,p) ((void)((m) && ( LY_SHOWWHERE fprintf p )))
+#define tfp TraceFP()
+#define CTRACE_SLEEP(secs) if (TRACE && LYTraceLogFP == 0) sleep((unsigned)secs)
+#define CTRACE_FLUSH(fp) if (TRACE) fflush(fp)
+
+#include <www_tcp.h>
+
+/*
+ * We force this include-ordering since socks.h contains redefinitions of
+ * functions that probably are prototyped via other includes. The socks.h
+ * definitions have to be included everywhere, since they're making wrappers
+ * for the stdio functions as well as the network functions.
+ */
+#if defined(USE_SOCKS5)
+#define SOCKS4TO5 /* turn on the Rxxxx definitions used in Lynx */
+#include <socks.h>
+
+/*
+ * The AIX- and SOCKS4-specific definitions in socks.h are inconsistent.
+ * Repair them so they're consistent (and usable).
+ */
+#if defined(_AIX) && !defined(USE_SOCKS4_PREFIX)
+#undef Raccept
+#define Raccept accept
+#undef Rgetsockname
+#define Rgetsockname getsockname
+#undef Rgetpeername
+#define Rgetpeername getpeername
+#endif
+
+/*
+ * Workaround for order-of-evaluation problem with gcc and socks5 headers
+ * which breaks the Rxxxx names by attaching the prefix twice:
+ */
+#ifdef INCLUDE_PROTOTYPES
+#undef Raccept
+#undef Rbind
+#undef Rconnect
+#undef Rlisten
+#undef Rselect
+#undef Rgetpeername
+#undef Rgetsockname
+#define Raccept accept
+#define Rbind bind
+#define Rconnect connect
+#define Rgetpeername getpeername
+#define Rgetsockname getsockname
+#define Rlisten listen
+#define Rselect select
+#endif
+
+#elif defined(SOCKS)
+#include <socks.h>
+#endif /* USE_SOCKS5 */
+
+#ifdef USE_SSL
+
+#define free_func free__func
+
+#ifdef USE_OPENSSL_INCL
+#include <openssl/ssl.h>
+#include <openssl/crypto.h>
+#include <openssl/rand.h>
+#include <openssl/err.h>
+
+#else
+
+#if defined(USE_GNUTLS_FUNCS)
+#include <tidy_tls.h>
+#define USE_GNUTLS_INCL 1 /* do this for the ".c" ifdef's */
+#elif defined(USE_GNUTLS_INCL)
+#include <gnutls/openssl.h>
+/*
+ * GNUTLS's implementation of OpenSSL is very incomplete and rudimentary.
+ * For a start, let's make it compile (TD - 2003/4/13).
+ */
+#ifndef SSL_VERIFY_PEER
+#define SSL_VERIFY_PEER 0x01
+#endif
+#else
+
+#ifdef USE_NSS_COMPAT_INCL
+#include <nss_compat_ossl/nss_compat_ossl.h>
+
+#else /* assume SSLeay */
+#include <ssl.h>
+#include <crypto.h>
+#include <rand.h>
+#include <err.h>
+#endif
+#endif
+#endif /* USE_OPENSSL_INCL */
+
+#undef free_func
+#endif /* USE_SSL */
+
+#ifdef HAVE_BSD_STDLIB_H
+#include <bsd/stdlib.h> /* prototype for arc4random.h */
+#elif defined(HAVE_BSD_RANDOM_H)
+#include <bsd/random.h> /* prototype for arc4random.h */
+#endif
+
+#ifdef HAVE_LIBDMALLOC
+#include <dmalloc.h> /* Gray Watson's library */
+#define show_alloc() dmalloc_log_unfreed()
+#endif
+
+#ifdef HAVE_LIBDBMALLOC
+#include <dbmalloc.h> /* Conor Cahill's library */
+#define show_alloc() malloc_dump(fileno(stderr))
+#endif
+
+#ifndef show_alloc
+#define show_alloc() /* nothing */
+#endif
+
+#include <userdefs.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#ifndef TOLOWER
+#ifdef USE_ASCII_CTYPES
+ extern int ascii_toupper(int);
+ extern int ascii_tolower(int);
+ extern int ascii_isupper(int);
+#endif
+#endif
+
+ extern FILE *TraceFP(void);
+
+ extern char *HTSkipToAt(char *host, int *gen_delims);
+ extern void strip_userid(char *host, int warn);
+
+#ifdef USE_SSL
+ extern SSL *HTGetSSLHandle(void);
+ extern void HTSSLInitPRNG(void);
+ extern int HTGetSSLCharacter(void *handle);
+#endif /* USE_SSL */
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* HTUTILS_H */
diff --git a/WWW/Library/Implementation/HTVMSUtils.c b/WWW/Library/Implementation/HTVMSUtils.c
new file mode 100644
index 0000000..38e583a
--- /dev/null
+++ b/WWW/Library/Implementation/HTVMSUtils.c
@@ -0,0 +1,1131 @@
+/*
+ * $LynxId: HTVMSUtils.c,v 1.40 2020/01/21 21:58:29 tom Exp $
+ *
+ * MODULE HTVMSUtil.c
+ * VMS Utility Routines
+ *
+ * AUTHORS:
+ * MD Mark Donszelmann duns@vxdeop.cern.ch
+ *
+ * HISTORY:
+ * 14 Nov 93 MD Written
+ *
+ * BUGS:
+ *
+ *
+ */
+
+#include <HTUtils.h>
+#ifdef VMS
+#include <HTFormat.h>
+#include <HTStream.h>
+#include <UCDefs.h>
+#include <UCMap.h>
+#include <UCAux.h>
+#include <HTFTP.h>
+#include <HTTCP.h>
+#include <HTVMSUtils.h>
+#include <ssdef.h>
+#include <jpidef.h>
+#include <prvdef.h>
+#include <acldef.h>
+#include <chpdef.h>
+#include <descrip.h>
+#include <lib$routines.h>
+#include <starlet.h>
+#include <rmsdef.h>
+
+#include <LYGlobalDefs.h>
+#include <LYUtils.h>
+#include <LYLeaks.h>
+#include <LYStrings.h>
+
+BOOL HTVMSFileVersions = FALSE; /* Include version numbers in listing? */
+
+typedef struct {
+ unsigned long BufferLength:16;
+ unsigned long ItemCode:16;
+ unsigned long BufferAddress:32;
+ unsigned long ReturnLengthAddress:32;
+} ItemStruct;
+
+/* PUBLIC HTVMS_authSysPrv()
+ * CHECKS IF THIS PROCESS IS AUTHORIZED TO ENABLE SYSPRV
+ * ON ENTRY:
+ * No arguments.
+ *
+ * ON EXIT:
+ * returns YES if SYSPRV is authorized
+ */
+BOOL HTVMS_authSysPrv(void)
+{
+ unsigned long Result;
+ ItemStruct ItemList[2];
+ unsigned long Length;
+ unsigned long Buffer[2];
+
+ /* fill Item */
+ ItemList[0].BufferLength = sizeof(Buffer);
+ ItemList[0].BufferAddress = (unsigned long) Buffer;
+ ItemList[0].ReturnLengthAddress = (unsigned long) &Length;
+ ItemList[0].ItemCode = JPI$_AUTHPRIV;
+
+ /* terminate list */
+ ItemList[1].ItemCode = 0;
+ ItemList[1].BufferLength = 0;
+
+ /* call system */
+ Result = sys$getjpiw(0, 0, 0, ItemList, 0, 0, 0);
+
+ if (Result != SS$_NORMAL)
+ return (NO);
+
+ if (Buffer[0] & PRV$M_SYSPRV)
+ return (YES);
+
+ return (NO);
+}
+
+/* PUBLIC HTVMS_enableSysPrv()
+ * ENABLES SYSPRV
+ * ON ENTRY:
+ * No arguments.
+ *
+ * ON EXIT:
+ *
+ */
+void HTVMS_enableSysPrv(void)
+{
+ unsigned long Result;
+ unsigned long Prv[2], PreviousPrv[2];
+
+ Prv[0] = PRV$M_SYSPRV;
+ Prv[1] = 0;
+ Result = sys$setprv(1, &Prv, 0, &PreviousPrv);
+
+ if (Result == SS$_NORMAL) {
+ if (!(PreviousPrv[0] & PRV$M_SYSPRV)) {
+ CTRACE((tfp, "HTVMS_enableSysPrv: Enabled SYSPRV\n"));
+ }
+ }
+}
+
+/* PUBLIC HTVMS_disableSysPrv()
+ * DISABLES SYSPRV
+ * ON ENTRY:
+ * No arguments.
+ *
+ * ON EXIT:
+ *
+ */
+void HTVMS_disableSysPrv(void)
+{
+ unsigned long Result;
+ unsigned long Prv[2], PreviousPrv[2];
+
+ Prv[0] = PRV$M_SYSPRV;
+ Prv[1] = 0;
+ Result = sys$setprv(0, &Prv, 0, &PreviousPrv);
+
+ if (Result == SS$_NORMAL) {
+ if (PreviousPrv[0] & PRV$M_SYSPRV) {
+ CTRACE((tfp, "HTVMS_disableSysPrv: Disabled SYSPRV\n"));
+ }
+ }
+}
+
+/* PUBLIC HTVMS_checkAccess()
+ * CHECKS ACCESS TO FILE FOR CERTAIN USER
+ * ON ENTRY:
+ * FileName The file to be accessed
+ * UserName Name of the user to check access for.
+ * User nobody, represented by "" is given NO for an answer
+ * Method Name of the method to be checked
+ *
+ * ON EXIT:
+ * returns YES if access is allowed
+ *
+ */
+BOOL HTVMS_checkAccess(const char *FileName,
+ const char *UserName,
+ const char *Method)
+{
+ unsigned long Result;
+ ItemStruct ItemList[2];
+ unsigned long Length;
+ unsigned long Buffer;
+ unsigned long ObjType;
+
+ char *VmsName;
+
+ struct dsc$descriptor_s FileNameDesc;
+ struct dsc$descriptor_s UserNameDesc;
+
+ char *colon;
+
+ /* user nobody should access as from account under which server is running */
+ if (0 == strcmp(UserName, ""))
+ return (NO);
+
+ /* check Filename and convert */
+ colon = StrChr(FileName, ':');
+ if (colon)
+ VmsName = HTVMS_name("", colon + 1);
+ else
+ VmsName = HTVMS_name("", FileName);
+
+ /* check for GET */
+ if (0 == strcmp(Method, "GET")) {
+ /* fill Item */
+ ItemList[0].BufferLength = sizeof(Buffer);
+ ItemList[0].BufferAddress = (unsigned long) &Buffer;
+ ItemList[0].ReturnLengthAddress = (unsigned long) &Length;
+ ItemList[0].ItemCode = CHP$_FLAGS;
+
+ /* terminate list */
+ ItemList[1].ItemCode = 0;
+ ItemList[1].BufferLength = 0;
+
+ /* fill input */
+ ObjType = ACL$C_FILE;
+ Buffer = CHP$M_READ;
+ UserNameDesc.dsc$w_length = strlen(UserName);
+ UserNameDesc.dsc$b_dtype = DSC$K_DTYPE_T;
+ UserNameDesc.dsc$b_class = DSC$K_CLASS_S;
+ UserNameDesc.dsc$a_pointer = (char *) UserName;
+ FileNameDesc.dsc$w_length = strlen(VmsName);
+ FileNameDesc.dsc$b_dtype = DSC$K_DTYPE_T;
+ FileNameDesc.dsc$b_class = DSC$K_CLASS_S;
+ FileNameDesc.dsc$a_pointer = VmsName;
+
+ /* call system */
+ Result = sys$check_access(&ObjType, &FileNameDesc, &UserNameDesc, ItemList);
+
+ if (Result == SS$_NORMAL)
+ return (YES);
+ else
+ return (NO);
+ }
+
+ return (NO);
+}
+
+/* PUBLIC HTVMS_wwwName()
+ * CONVERTS VMS Name into WWW Name
+ * ON ENTRY:
+ * vmsname VMS file specification (NO NODE)
+ *
+ * ON EXIT:
+ * returns www file specification
+ *
+ * EXAMPLES:
+ * vmsname wwwname
+ * DISK$USER disk$user
+ * DISK$USER: /disk$user/
+ * DISK$USER:[DUNS] /disk$user/duns
+ * DISK$USER:[DUNS.ECHO] /disk$user/duns/echo
+ * [DUNS] duns
+ * [DUNS.ECHO] duns/echo
+ * [DUNS.ECHO.-.TRANS] duns/echo/../trans
+ * [DUNS.ECHO.--.TRANS] duns/echo/../../trans
+ * [.DUNS] duns
+ * [.DUNS.ECHO] duns/echo
+ * [.DUNS.ECHO]TEST.COM duns/echo/test.com
+ * TEST.COM test.com
+ *
+ *
+ */
+const char *HTVMS_wwwName(const char *vmsname)
+{
+ static char wwwname[LY_MAXPATH];
+ const char *src;
+ char *dst;
+ int dir;
+
+ dst = wwwname;
+ src = vmsname;
+ dir = 0;
+ if (StrChr(src, ':'))
+ *(dst++) = '/';
+ for (; *src != '\0'; src++) {
+ switch (*src) {
+ case ':':
+ *(dst++) = '/';
+ break;
+ case '-':
+ if (dir) {
+ if ((*(src - 1) == '[' ||
+ *(src - 1) == '.' ||
+ *(src - 1) == '-') &&
+ (*(src + 1) == '.' ||
+ *(src + 1) == '-')) {
+ *(dst++) = '/';
+ *(dst++) = '.';
+ *(dst++) = '.';
+ } else
+ *(dst++) = '-';
+ } else {
+ if (*(src - 1) == ']')
+ *(dst++) = '/';
+ *(dst++) = '-';
+ }
+ break;
+ case '.':
+ if (dir) {
+ if (*(src - 1) != '[')
+ *(dst++) = '/';
+ } else {
+ if (*(src - 1) == ']')
+ *(dst++) = '/';
+ *(dst++) = '.';
+ }
+ break;
+ case '[':
+ dir = 1;
+ break;
+ case ']':
+ dir = 0;
+ break;
+ default:
+ if (*(src - 1) == ']')
+ *(dst++) = '/';
+ *(dst++) = *src;
+ break;
+ }
+ }
+ *(dst++) = '\0';
+ return (wwwname);
+}
+
+/*
+ * The code below is for directory browsing by VMS Curses clients.
+ * It is based on the newer WWWLib's HTDirBrw.c. - Foteos Macrides
+ */
+int HTStat(const char *filename,
+ struct stat *info)
+{
+ /*
+ the following stuff does not work in VMS with a normal stat...
+ --> /disk$user/duns/www if www is a directory
+ is statted like: /disk$user/duns/www.dir
+ after a normal stat has failed
+ --> /disk$user/duns if duns is a toplevel directory
+ is statted like: /disk$user/000000/duns.dir
+ --> /disk$user since disk$user is a device
+ is statted like: /disk$user/000000/000000.dir
+ --> /
+ searches all devices, no solution yet...
+ --> /vxcern!/disk$cr/wwwteam/login.com
+ is not statted but granted with fake information...
+ */
+ int Result;
+ int Len;
+ char *Ptr, *Ptr2;
+ static char *Name;
+
+ /* try normal stat... */
+ Result = stat((char *) filename, info);
+ if (Result == 0)
+ return (Result);
+
+ /* make local copy */
+ StrAllocCopy(Name, filename);
+
+ /* failed,so do device search in case root is requested */
+ if (!strcmp(Name, "/")) { /* root requested */
+ return (-1);
+ }
+
+ /* failed so this might be a directory, add '.dir' */
+ Len = strlen(Name);
+ if (Name[Len - 1] == '/')
+ Name[Len - 1] = '\0';
+
+ /* fail in case of device */
+ Ptr = StrChr(Name + 1, '/');
+ if ((Ptr == NULL) && (Name[0] == '/')) { /* device only... */
+ StrAllocCat(Name, "/000000/000000");
+ }
+
+ if (Ptr != NULL) { /* correct filename in case of toplevel dir */
+ Ptr2 = StrChr(Ptr + 1, '/');
+ if ((Ptr2 == NULL) && (Name[0] == '/')) {
+ char End[256];
+
+ LYStrNCpy(End, Ptr, sizeof(End) - 1);
+ *(Ptr + 1) = '\0';
+ StrAllocCat(Name, "000000");
+ StrAllocCat(Name, End);
+ }
+ }
+
+ /* try in case a file on toplevel directory or .DIR was already specified */
+ Result = stat(Name, info);
+ if (Result == 0)
+ return (Result);
+
+ /* add .DIR and try again */
+ StrAllocCat(Name, ".dir");
+ Result = stat(Name, info);
+ return (Result);
+}
+
+#ifndef _POSIX_SOURCE
+#define d_ino d_fileno /* compatibility */
+#ifndef NULL
+#define NULL 0
+#endif
+#endif /* !_POSIX_SOURCE */
+
+typedef struct __dirdesc {
+ long context; /* context descriptor for LIB$FIND_FILE calls */
+ char dirname[255 + 1]; /* keeps the directory name, including *.* */
+ struct dsc$descriptor_s dirname_desc; /* descriptor of dirname */
+} DIR;
+
+static DIR *HTVMSopendir(char *dirname);
+static struct dirent *HTVMSreaddir(DIR *dirp);
+static int HTVMSclosedir(DIR *dirp);
+
+/*** #include <sys_dirent.h> ***/
+/*** "sys_dirent.h" ***/
+struct dirent {
+ unsigned long d_fileno; /* file number of entry */
+ unsigned short d_namlen; /* length of string in d_name */
+ char d_name[255 + 1]; /* name (up to MAXNAMLEN + 1) */
+};
+
+#ifndef _POSIX_SOURCE
+/*
+ * It's unlikely to change, but make sure that sizeof d_name above is
+ * at least MAXNAMLEN + 1 (more may be added for padding).
+ */
+#define MAXNAMLEN 255
+/*
+ * The macro DIRSIZ(dp) gives the minimum amount of space required to represent
+ * a directory entry. For any directory entry dp->d_reclen >= DIRSIZ(dp).
+ * Specific filesystem types may use this macro to construct the value
+ * for d_reclen.
+ */
+#undef DIRSIZ
+#define DIRSIZ(dp) \
+ (((sizeof(struct dirent) - (MAXNAMLEN+1) + ((dp)->d_namlen+1)) +3) & ~3)
+
+#endif /* !_POSIX_SOURCE */
+
+static DIR *HTVMSopendir(char *dirname)
+{
+ static DIR dir;
+ char *closebracket;
+ long status;
+ struct dsc$descriptor_s entryname_desc;
+ struct dsc$descriptor_s dirname_desc;
+ static char *DirEntry;
+ char Actual[256];
+ char VMSentry[256];
+ char UnixEntry[256];
+ int index;
+ char *dot;
+
+ /* check if directory exists */
+ /* dirname can look like /disk$user/duns/www/test/multi */
+ /* or like /disk$user/duns/www/test/multi/ */
+ /* DirEntry should look like disk$user:[duns.www.test]multi in both cases */
+ /* dir.dirname should look like disk$user:[duns.www.test.multi] */
+ sprintf(UnixEntry, "%.*s", sizeof(UnixEntry) - 2, dirname);
+ if (UnixEntry[strlen(UnixEntry) - 1] != '/')
+ strcat(UnixEntry, "/");
+
+ StrAllocCopy(DirEntry, HTVMS_name("", UnixEntry));
+ if (strlen(DirEntry) > sizeof(dir.dirname) - 1)
+ return (NULL);
+ strcpy(dir.dirname, DirEntry);
+ index = strlen(DirEntry) - 1;
+
+ if (DirEntry[index] == ']')
+ DirEntry[index] = '\0';
+
+ if ((dot = strrchr(DirEntry, '.')) == NULL) { /* convert disk$user:[duns] into disk$user:[000000]duns.dir */
+ char *openbr = strrchr(DirEntry, '[');
+
+ if (!openbr) { /* convert disk$user: into disk$user:[000000]000000.dir */
+ if (strlen(dir.dirname) > sizeof(dir.dirname) - 10)
+ return (NULL);
+ sprintf(dir.dirname, "%.*s[000000]", sizeof(dir.dirname) - 9, DirEntry);
+ StrAllocCat(DirEntry, "[000000]000000.dir");
+ } else {
+ char End[256];
+
+ strcpy(End, openbr + 1);
+ *(openbr + 1) = '\0';
+ StrAllocCat(DirEntry, "000000]");
+ StrAllocCat(DirEntry, End);
+ StrAllocCat(DirEntry, ".dir");
+ }
+ } else {
+ *dot = ']';
+ StrAllocCat(DirEntry, ".dir");
+ }
+ /* lib$find_file needs a fixed-size buffer */
+ LYStrNCpy(Actual, DirEntry, sizeof(Actual) - 1);
+
+ dir.context = 0;
+ dirname_desc.dsc$w_length = strlen(Actual);
+ dirname_desc.dsc$b_dtype = DSC$K_DTYPE_T;
+ dirname_desc.dsc$b_class = DSC$K_CLASS_S;
+ dirname_desc.dsc$a_pointer = (char *) &(Actual);
+
+ /* look for the directory */
+ entryname_desc.dsc$w_length = 255;
+ entryname_desc.dsc$b_dtype = DSC$K_DTYPE_T;
+ entryname_desc.dsc$b_class = DSC$K_CLASS_S;
+ entryname_desc.dsc$a_pointer = VMSentry;
+
+ status = lib$find_file(&(dirname_desc),
+ &entryname_desc,
+ &(dir.context),
+ 0, 0, 0, 0);
+ if (!(status & 0x01)) { /* directory not found */
+ return (NULL);
+ }
+
+ if (strlen(dir.dirname) > sizeof(dir.dirname) - 10)
+ return (NULL);
+ if (HTVMSFileVersions)
+ strcat(dir.dirname, "*.*;*");
+ else
+ strcat(dir.dirname, "*.*");
+ dir.context = 0;
+ dir.dirname_desc.dsc$w_length = strlen(dir.dirname);
+ dir.dirname_desc.dsc$b_dtype = DSC$K_DTYPE_T;
+ dir.dirname_desc.dsc$b_class = DSC$K_CLASS_S;
+ dir.dirname_desc.dsc$a_pointer = (char *) &(dir.dirname);
+ return (&dir);
+}
+
+static struct dirent *HTVMSreaddir(DIR *dirp)
+{
+ static struct dirent entry;
+ long status;
+ struct dsc$descriptor_s entryname_desc;
+ char *space, *slash;
+ char VMSentry[256];
+ const char *UnixEntry;
+
+ entryname_desc.dsc$w_length = 255;
+ entryname_desc.dsc$b_dtype = DSC$K_DTYPE_T;
+ entryname_desc.dsc$b_class = DSC$K_CLASS_S;
+ entryname_desc.dsc$a_pointer = VMSentry;
+
+ status = lib$find_file(&(dirp->dirname_desc),
+ &entryname_desc,
+ &(dirp->context),
+ 0, 0, 0, 0);
+ if (status == RMS$_NMF) { /* no more files */
+ return (NULL);
+ } else { /* ok */
+ if (!(status & 0x01))
+ return (0);
+ if (HTVMSFileVersions)
+ space = StrChr(VMSentry, ' ');
+ else
+ space = StrChr(VMSentry, ';');
+ if (space)
+ *space = '\0';
+
+ /* convert to unix style... */
+ UnixEntry = HTVMS_wwwName(VMSentry);
+ slash = strrchr(UnixEntry, '/') + 1;
+ strcpy(entry.d_name, slash);
+ entry.d_namlen = strlen(entry.d_name);
+ entry.d_fileno = 1;
+ return (&entry);
+ }
+}
+
+static int HTVMSclosedir(DIR *dirp)
+{
+ long status;
+
+ status = lib$find_file_end(&(dirp->context));
+ if (!(status & 0x01))
+ exit_immediately(status);
+ dirp->context = 0;
+ return (0);
+}
+
+#include <HTAnchor.h>
+#include <HTParse.h>
+#include <HTBTree.h>
+#include <HTFile.h> /* For HTFileFormat() */
+#include <HTAlert.h>
+/*
+ * Hypertext object building machinery.
+ */
+#include <HTML.h>
+#define PUTC(c) (*targetClass.put_character)(target, c)
+#define PUTS(s) (*targetClass.put_string)(target, s)
+#define START(e) (*targetClass.start_element)(target, e, 0, 0, -1, 0)
+#define END(e) (*targetClass.end_element)(target, e, 0)
+#define FREE_TARGET (*targetClass._free)(target)
+#define ABORT_TARGET (*targetClass._free)(target)
+struct _HTStructured {
+ const HTStructuredClass *isa;
+ /* ... */
+};
+
+#define STRUCT_DIRENT struct dirent
+
+static char *months[12] =
+{
+ "Jan", "Feb", "Mar", "Apr", "May", "Jun",
+ "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
+};
+
+typedef struct _VMSEntryInfo {
+ char *filename;
+ char *type;
+ char *date;
+ unsigned int size;
+ BOOLEAN display; /* show this entry? */
+} VMSEntryInfo;
+
+static void free_VMSEntryInfo_contents(VMSEntryInfo * entry_info)
+{
+ if (entry_info) {
+ FREE(entry_info->filename);
+ FREE(entry_info->type);
+ FREE(entry_info->date);
+ }
+ /* don't free the struct */
+}
+
+int compare_VMSEntryInfo_structs(VMSEntryInfo * entry1, VMSEntryInfo * entry2)
+{
+ int i, status;
+ char date1[16], date2[16], time1[8], time2[8], month[4];
+
+ switch (HTfileSortMethod) {
+ case FILE_BY_SIZE:
+ /* both equal or both 0 */
+ if (entry1->size == entry2->size)
+ return (strcasecomp(entry1->filename,
+ entry2->filename));
+ else if (entry1->size > entry2->size)
+ return (1);
+ else
+ return (-1);
+ case FILE_BY_TYPE:
+ if (entry1->type && entry2->type) {
+ status = strcasecomp(entry1->type, entry2->type);
+ if (status)
+ return (status);
+ /* else fall to filename comparison */
+ }
+ return (strcasecomp(entry1->filename,
+ entry2->filename));
+ case FILE_BY_DATE:
+ if (entry1->date && entry2->date) {
+ /*
+ * Make sure we have the correct length. - FM
+ */
+ if (strlen(entry1->date) != 12 ||
+ strlen(entry2->date) != 12) {
+ return (strcasecomp(entry1->filename,
+ entry2->filename));
+ }
+ /*
+ * Set up for sorting in reverse
+ * chronological order. - FM
+ */
+ if (entry1->date[7] != ' ') {
+ strcpy(date1, "9999");
+ strcpy(time1, (char *) &entry1->date[7]);
+ } else {
+ strcpy(date1, (char *) &entry1->date[8]);
+ strcpy(time1, "00:00");
+ }
+ LYStrNCpy(month, entry1->date, 3);
+ for (i = 0; i < 12; i++) {
+ if (!strcasecomp(month, months[i])) {
+ break;
+ }
+ }
+ i++;
+ sprintf(month, "%02d", i);
+ strcat(date1, month);
+ StrNCat(date1, (char *) &entry1->date[4], 2);
+ date1[8] = '\0';
+ if (date1[6] == ' ') {
+ date1[6] = '0';
+ }
+ strcat(date1, time1);
+ if (entry2->date[7] != ' ') {
+ strcpy(date2, "9999");
+ strcpy(time2, (char *) &entry2->date[7]);
+ } else {
+ strcpy(date2, (char *) &entry2->date[8]);
+ strcpy(time2, "00:00");
+ }
+ LYStrNCpy(month, entry2->date, 3);
+ for (i = 0; i < 12; i++) {
+ if (!strcasecomp(month, months[i])) {
+ break;
+ }
+ }
+ i++;
+ sprintf(month, "%02d", i);
+ strcat(date2, month);
+ StrNCat(date2, (char *) &entry2->date[4], 2);
+ date2[8] = '\0';
+ if (date2[6] == ' ') {
+ date2[6] = '0';
+ }
+ strcat(date2, time2);
+ /*
+ * Do the comparison. - FM
+ */
+ status = strcasecomp(date2, date1);
+ if (status)
+ return (status);
+ /* else fall to filename comparison */
+ }
+ return (strcasecomp(entry1->filename,
+ entry2->filename));
+ case FILE_BY_NAME:
+ default:
+ return (strcmp(entry1->filename,
+ entry2->filename));
+ }
+}
+
+/* HTVMSBrowseDir()
+ *
+ * This function generates a directory listing as an HTML-object
+ * for local file URL's. It assumes the first two elements of
+ * of the path are a device followed by a directory:
+ *
+ * file://localhost/device/directory[/[foo]]
+ *
+ * Will not accept 000000 as a directory name.
+ * Will offer links to parent through the top directory, unless
+ * a terminal slash was included in the calling URL.
+ *
+ * Returns HT_LOADED on success, HTLoadError() messages on error.
+ *
+ * Developed for Lynx by Foteos Macrides (macrides@sci.wfeb.edu).
+ */
+int HTVMSBrowseDir(const char *address,
+ HTParentAnchor *anchor,
+ HTFormat format_out,
+ HTStream *sink)
+{
+ HTStructured *target;
+ HTStructuredClass targetClass;
+ char *pathname = HTParse(address, "", PARSE_PATH + PARSE_PUNCTUATION);
+ char *tail = NULL;
+ char *title = NULL;
+ char *header = NULL;
+ char *parent = NULL;
+ char *relative = NULL;
+ char *cp, *cp1;
+ int pathend, len;
+ DIR *dp;
+ struct stat file_info;
+ time_t NowTime;
+ static char ThisYear[8];
+ VMSEntryInfo *entry_info = 0;
+ char string_buffer[64];
+
+ HTUnEscape(pathname);
+ CTRACE((tfp, "HTVMSBrowseDir: Browsing `%s\'\n", pathname));
+
+ /*
+ * Require at least two elements (presumably a device and directory) and
+ * disallow the device root (000000 directory). Symbolic paths (e.g.,
+ * sys$help) should have been translated and expanded (e.g., to
+ * /sys$sysroot/syshlp) before calling this routine.
+ */
+ if (((*pathname != '/') ||
+ (cp = StrChr(pathname + 1, '/')) == NULL ||
+ *(cp + 1) == '\0' ||
+ 0 == StrNCmp((cp + 1), "000000", 6)) ||
+ (dp = HTVMSopendir(pathname)) == NULL) {
+ FREE(pathname);
+ return HTLoadError(sink, 403, COULD_NOT_ACCESS_DIR);
+ }
+
+ /*
+ * Set up the output stream.
+ */
+ _HTProgress(BUILDING_DIR_LIST);
+ if (UCLYhndl_HTFile_for_unspec >= 0) {
+ HTAnchor_setUCInfoStage(anchor,
+ UCLYhndl_HTFile_for_unspec,
+ UCT_STAGE_PARSER,
+ UCT_SETBY_DEFAULT);
+ }
+ target = HTML_new(anchor, format_out, sink);
+ targetClass = *(target->isa);
+
+ /*
+ * Set up the offset string of the anchor reference, and strings for the
+ * title and header.
+ */
+ cp = strrchr(pathname, '/'); /* find lastslash */
+ StrAllocCopy(tail, (cp + 1)); /* take slash off the beginning */
+ if (*tail != '\0') {
+ StrAllocCopy(title, tail);
+ *cp = '\0';
+ if ((cp1 = strrchr(pathname, '/')) != NULL &&
+ cp1 != pathname &&
+ StrNCmp((cp1 + 1), "000000", 6))
+ StrAllocCopy(parent, (cp1 + 1));
+ *cp = '/';
+ } else {
+ pathname[strlen(pathname) - 1] = '\0';
+ cp = strrchr(pathname, '/');
+ StrAllocCopy(title, (cp + 1));
+ pathname[strlen(pathname)] = '/';
+ }
+ StrAllocCopy(header, pathname);
+
+ /*
+ * Initialize path name for HTStat().
+ */
+ pathend = strlen(pathname);
+ if (*(pathname + pathend - 1) != '/') {
+ StrAllocCat(pathname, "/");
+ pathend++;
+ }
+
+ /*
+ * Output the title and header.
+ */
+ START(HTML_HTML);
+ PUTC('\n');
+ START(HTML_HEAD);
+ PUTC('\n');
+ HTUnEscape(title);
+ START(HTML_TITLE);
+ PUTS(title);
+ PUTS(" directory");
+ END(HTML_TITLE);
+ PUTC('\n');
+ FREE(title);
+ END(HTML_HEAD);
+ PUTC('\n');
+ START(HTML_BODY);
+ PUTC('\n');
+ HTUnEscape(header);
+ START(HTML_H1);
+ PUTS(header);
+ END(HTML_H1);
+ PUTC('\n');
+ if (HTDirReadme == HT_DIR_README_TOP) {
+ FILE *fp;
+
+ if (header[strlen(header) - 1] != '/')
+ StrAllocCat(header, "/");
+ StrAllocCat(header, HT_DIR_README_FILE);
+ if ((fp = fopen(header, "r")) != NULL) {
+ START(HTML_PRE);
+ for (;;) {
+ char c = fgetc(fp);
+
+ if (c == (char) EOF)
+ break;
+#ifdef NOTDEFINED
+ switch (c) {
+ case '&':
+ case '<':
+ case '>':
+ PUTC('&');
+ PUTC('#');
+ PUTC((char) (c / 10));
+ PUTC((char) (c % 10));
+ PUTC(';');
+ break;
+ default:
+ PUTC(c);
+ }
+#else
+ PUTC(c);
+#endif /* NOTDEFINED */
+ }
+ END(HTML_PRE);
+ fclose(fp);
+ }
+ }
+ FREE(header);
+ if (parent) {
+ HTSprintf0(&relative, "%s/..", tail);
+ HTStartAnchor(target, "", relative);
+ PUTS("Up to ");
+ HTUnEscape(parent);
+ PUTS(parent);
+ END(HTML_A);
+ START(HTML_P);
+ PUTC('\n');
+ FREE(relative);
+ FREE(parent);
+ }
+
+ /*
+ * Set up the date comparison.
+ */
+ NowTime = time(NULL);
+ strcpy(ThisYear, (char *) ctime(&NowTime) + 20);
+ ThisYear[4] = '\0';
+
+ /*
+ * Now, generate the Btree and put it out to the output stream.
+ */
+ {
+ char dottest = 2; /* To avoid two strcmp() each time */
+ STRUCT_DIRENT *dirbuf;
+ HTBTree *bt;
+
+ /* Set up sort key and initialize BTree */
+ bt = HTBTree_new((HTComparer) compare_VMSEntryInfo_structs);
+
+ /* Build tree */
+ while ((dirbuf = HTVMSreaddir(dp))) {
+ HTAtom *encoding = NULL;
+ HTFormat format;
+
+ /* Skip if not used */
+ if (!dirbuf->d_ino) {
+ continue;
+ }
+
+ /* Current and parent directories are never shown in list */
+ if (dottest && (!strcmp(dirbuf->d_name, ".") ||
+ !strcmp(dirbuf->d_name, ".."))) {
+ dottest--;
+ continue;
+ }
+
+ /* Don't show the selective enabling file
+ * unless version numbers are included */
+ if (!strcasecomp(dirbuf->d_name, HT_DIR_ENABLE_FILE)) {
+ continue;
+ }
+
+ /* Skip files beginning with a dot? */
+ if ((no_dotfiles || !show_dotfiles) && *dirbuf->d_name == '.') {
+ continue;
+ }
+
+ /* OK, make an lstat() and get a key ready. */
+ *(pathname + pathend) = '\0';
+ StrAllocCat(pathname, dirbuf->d_name);
+ if (HTStat(pathname, &file_info)) {
+ /* for VMS the failure here means the file is not readable...
+ we however continue to browse through the directory... */
+ continue;
+ }
+ entry_info = (VMSEntryInfo *) malloc(sizeof(VMSEntryInfo));
+ if (entry_info == NULL)
+ outofmem(__FILE__, "HTVMSBrowseDir");
+ entry_info->type = 0;
+ entry_info->size = 0;
+ entry_info->date = 0;
+ entry_info->filename = 0;
+ entry_info->display = TRUE;
+
+ /* Get the type */
+ format = HTFileFormat(dirbuf->d_name, &encoding,
+ (const char **) &cp);
+ if (!cp) {
+ if (!StrNCmp(HTAtom_name(format), "application", 11)) {
+ cp = HTAtom_name(format) + 12;
+ if (!StrNCmp(cp, "x-", 2))
+ cp += 2;
+ } else
+ cp = HTAtom_name(format);
+ }
+ StrAllocCopy(entry_info->type, cp);
+
+ StrAllocCopy(entry_info->filename, dirbuf->d_name);
+ if (S_ISDIR(file_info.st_mode)) {
+ /* strip .DIR part... */
+ char *dot;
+
+ dot = strstr(entry_info->filename, ".DIR");
+ if (dot)
+ *dot = '\0';
+ LYLowerCase(entry_info->filename);
+ StrAllocCopy(entry_info->type, "Directory");
+ } else {
+ if ((cp = strstr(entry_info->filename, "READ")) == NULL) {
+ cp = entry_info->filename;
+ } else {
+ cp += 4;
+ if (!StrNCmp(cp, "ME", 2)) {
+ cp += 2;
+ while (cp && *cp && *cp != '.') {
+ cp++;
+ }
+ } else if (!StrNCmp(cp, ".ME", 3)) {
+ cp = (entry_info->filename +
+ strlen(entry_info->filename));
+ } else {
+ cp = entry_info->filename;
+ }
+ }
+ LYLowerCase(cp);
+ if (((len = strlen(entry_info->filename)) > 2) &&
+ entry_info->filename[len - 1] == 'z') {
+ if (entry_info->filename[len - 2] == '.' ||
+ entry_info->filename[len - 2] == '_')
+ entry_info->filename[len - 1] = 'Z';
+ }
+ }
+
+ /* Get the date */
+ {
+ char *t = (char *) ctime((const time_t *) &file_info.st_ctime);
+
+ *(t + 24) = '\0';
+
+ StrAllocCopy(entry_info->date, (t + 4));
+ *((entry_info->date) + 7) = '\0';
+ if ((atoi((t + 19))) < atoi(ThisYear))
+ StrAllocCat(entry_info->date, (t + 19));
+ else {
+ StrAllocCat(entry_info->date, (t + 11));
+ *((entry_info->date) + 12) = '\0';
+ }
+ }
+
+ /* Get the size */
+ if (!S_ISDIR(file_info.st_mode))
+ entry_info->size = (unsigned int) file_info.st_size;
+ else
+ entry_info->size = 0;
+
+ /* Now, update the BTree etc. */
+ if (entry_info->display) {
+ CTRACE((tfp, "Adding file to BTree: %s\n",
+ entry_info->filename));
+ HTBTree_add(bt, entry_info);
+ }
+
+ } /* End while HTVMSreaddir() */
+
+ FREE(pathname);
+ HTVMSclosedir(dp);
+
+ START(HTML_PRE);
+ /*
+ * Run through the BTree printing out in order
+ */
+ {
+ HTBTElement *ele;
+ int i;
+
+ for (ele = HTBTree_next(bt, NULL);
+ ele != NULL;
+ ele = HTBTree_next(bt, ele)) {
+ entry_info = (VMSEntryInfo *) HTBTree_object(ele);
+
+ /* Output the date */
+ if (entry_info->date) {
+ PUTS(entry_info->date);
+ PUTS(" ");
+ } else
+ PUTS(" * ");
+
+ /* Output the type */
+ if (entry_info->type) {
+ for (i = 0; entry_info->type[i] != '\0' && i < 15; i++)
+ PUTC(entry_info->type[i]);
+ for (; i < 17; i++)
+ PUTC(' ');
+
+ }
+
+ /* Output the link for the name */
+ HTDirEntry(target, tail, entry_info->filename);
+ PUTS(entry_info->filename);
+ END(HTML_A);
+
+ /* Output the size */
+ if (entry_info->size) {
+ if (entry_info->size < 1024)
+ sprintf(string_buffer, " %d bytes",
+ entry_info->size);
+ else
+ sprintf(string_buffer, " %dKb",
+ entry_info->size / 1024);
+ PUTS(string_buffer);
+ }
+
+ PUTC('\n'); /* end of this entry */
+
+ free_VMSEntryInfo_contents(entry_info);
+ }
+ }
+
+ HTBTreeAndObject_free(bt);
+
+ } /* End of both BTree loops */
+
+ /*
+ * Complete the output stream.
+ */
+ END(HTML_PRE);
+ PUTC('\n');
+ END(HTML_BODY);
+ PUTC('\n');
+ END(HTML_HTML);
+ PUTC('\n');
+ FREE(tail);
+ FREE_TARGET;
+
+ return HT_LOADED;
+
+} /* End of directory reading section */
+
+/*
+ * Remove all versions of the given file. We assume there are no permissions
+ * problems, since we do this mainly for removing temporary files.
+ */
+int HTVMS_remove(char *filename)
+{
+ int code = remove(filename); /* return the first status code */
+
+ while (remove(filename) == 0) ;
+ return code;
+}
+
+/*
+ * Remove all older versions of the given file. We may fail to remove some
+ * version due to permissions -- the loop stops either at that point, or when
+ * we run out of older versions to remove.
+ */
+void HTVMS_purge(char *filename)
+{
+ char *older_file = 0;
+ char *oldest_file = 0;
+ struct stat sb;
+
+ StrAllocCopy(older_file, filename);
+ StrAllocCat(older_file, ";-1");
+
+ while (remove(older_file) == 0) ;
+ /*
+ * If we do not have any more older versions, it is safe to rename the
+ * current file to version #1.
+ */
+ if (stat(older_file, &sb) != 0) {
+ StrAllocCopy(oldest_file, filename);
+ StrAllocCat(oldest_file, ";1");
+ rename(older_file, oldest_file);
+ FREE(oldest_file);
+ }
+
+ FREE(older_file);
+}
+#endif /* VMS */
diff --git a/WWW/Library/Implementation/HTVMSUtils.h b/WWW/Library/Implementation/HTVMSUtils.h
new file mode 100644
index 0000000..d7efe8c
--- /dev/null
+++ b/WWW/Library/Implementation/HTVMSUtils.h
@@ -0,0 +1,101 @@
+/* VMS specific routines
+
+ */
+
+#ifndef HTVMSUTIL_H
+#define HTVMSUTIL_H
+
+#ifndef HTUTILS_H
+#include <HTUtils.h>
+#endif
+
+#include <HTAnchor.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ extern BOOL HTVMSFileVersions; /* Include version numbers in listing? */
+
+/* PUBLIC HTVMS_authSysPrv()
+ * CHECKS IF THIS PROCESS IS AUTHORIZED TO ENABLE SYSPRV
+ * ON ENTRY:
+ * No arguments.
+ *
+ * ON EXIT:
+ * returns YES if SYSPRV is authorized
+ */
+ extern BOOL HTVMS_authSysPrv(void);
+
+/* PUBLIC HTVMS_enableSysPrv()
+ * ENABLES SYSPRV
+ * ON ENTRY:
+ * No arguments.
+ *
+ * ON EXIT:
+ *
+ */
+ extern void HTVMS_enableSysPrv(void);
+
+/* PUBLIC HTVMS_disableSysPrv()
+ * DISABLES SYSPRV
+ * ON ENTRY:
+ * No arguments.
+ *
+ * ON EXIT:
+ *
+ */
+ extern void HTVMS_disableSysPrv(void);
+
+/* PUBLIC HTVMS_checkAccess()
+ * CHECKS ACCESS TO FILE FOR CERTAIN USER
+ * ON ENTRY:
+ * FileName The file to be accessed
+ * UserName Name of the user to check access for
+ *
+ * ON EXIT:
+ * returns YES if access is allowed
+ *
+ */
+ extern BOOL HTVMS_checkAccess(const char *FileName,
+ const char *UserName,
+ const char *Method);
+
+/* PUBLIC HTVMS_wwwName()
+ * CONVERTS VMS Name into WWW Name
+ * ON ENTRY:
+ * vmsname VMS file specification (NO NODE)
+ *
+ * ON EXIT:
+ * returns www file specification
+ *
+ * EXAMPLES:
+ * vmsname wwwname
+ * DISK$USER disk$user
+ * DISK$USER: /disk$user/
+ * DISK$USER:[DUNS] /disk$user/duns
+ * DISK$USER:[DUNS.ECHO] /disk$user/duns/echo
+ * [DUNS] duns
+ * [DUNS.ECHO] duns/echo
+ * [DUNS.ECHO.-.TRANS] duns/echo/../trans
+ * [DUNS.ECHO.--.TRANS] duns/echo/../../trans
+ * [.DUNS] duns
+ * [.DUNS.ECHO] duns/echo
+ * [.DUNS.ECHO]TEST.COM duns/echo/test.com
+ * TEST.COM test.com
+ *
+ *
+ */
+ const extern char *HTVMS_wwwName(const char *vmsname);
+
+ extern int HTVMSBrowseDir(const char *address,
+ HTParentAnchor *anchor,
+ HTFormat format_out,
+ HTStream *sink);
+
+ extern int HTVMS_remove(char *filename);
+ extern void HTVMS_purge(char *filename);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* not HTVMSUTIL_H */
diff --git a/WWW/Library/Implementation/HTVMS_WaisProt.c b/WWW/Library/Implementation/HTVMS_WaisProt.c
new file mode 100644
index 0000000..687c9df
--- /dev/null
+++ b/WWW/Library/Implementation/HTVMS_WaisProt.c
@@ -0,0 +1,2469 @@
+/*
+ * $LynxId: HTVMS_WaisProt.c,v 1.10 2020/01/21 22:10:03 tom Exp $
+ *
+ * HTVMS_WAISProt.c
+ *
+ * Adaptation for Lynx by F.Macrides (macrides@sci.wfeb.edu)
+ *
+ * 31-May-1994 FM Initial version.
+ *
+ *----------------------------------------------------------------------*/
+
+/*
+ * Routines originally from WProt.c -- FM
+ *
+ *----------------------------------------------------------------------*/
+/* WIDE AREA INFORMATION SERVER SOFTWARE:
+ * No guarantees or restrictions. See the readme file for the full standard
+ * disclaimer.
+
+ * 3.26.90 Harry Morris, morris@think.com
+ * 3.30.90 Harry Morris
+ * - removed chunk code from WAISSearchAPDU,
+ * - added makeWAISQueryType1Query() and readWAISType1Query() which replace
+ * makeWAISQueryTerms() and makeWAISQueryDocs().
+ * 4.11.90 HWM - generalized conditional includes (see c-dialect.h)
+ * - renamed makeWAISType1Query() to makeWAISTextQuery()
+ * renamed readWAISType1Query() to readWAISTextQuery()
+ * 5.29.90 TS - fixed bug in makeWAISQueryDocs
+ * added CSTFreeWAISFoo functions
+ */
+
+#define _C_WAIS_protocol_
+
+/* This file implements the Z39.50 extensions required for WAIS
+*/
+
+#include <HTUtils.h>
+#include <HTVMS_WaisUI.h>
+#include <HTVMS_WaisProt.h>
+
+#include <LYLeaks.h>
+
+/* very rough estimates of the size of an object */
+#define DefWAISInitResponseSize (size_t)200
+#define DefWAISSearchSize (size_t)3000
+#define DefWAISSearchResponseSize (size_t)6000
+#define DefWAISPresentSize (size_t)1000
+#define DefWAISPresentResponseSize (size_t)6000
+#define DefWAISDocHeaderSize (size_t)500
+#define DefWAISShortHeaderSize (size_t)200
+#define DefWAISLongHeaderSize (size_t)800
+#define DefWAISDocTextSize (size_t)6000
+#define DefWAISDocHeadlineSize (size_t)500
+#define DefWAISDocCodeSize (size_t)500
+
+#define RESERVE_SPACE_FOR_WAIS_HEADER(len) \
+ if (*len > 0) \
+ *len -= header_len;
+
+#define S_MALLOC(type) (type*)s_malloc(sizeof(type))
+#define S_MALLOC2(type) (type*)s_malloc(sizeof(type) * 2)
+
+#define S_REALLOC2(type, ptr, num) (type*)s_realloc((char*)ptr, (sizeof(type) * (num + 2)))
+
+/*----------------------------------------------------------------------*/
+
+static unsigned long userInfoTagSize(data_tag tag,
+ unsigned long length)
+/* return the number of bytes required to write the user info tag and
+ length
+ */
+{
+ unsigned long size;
+
+ /* calculate bytes required to represent tag. max tag is 16K */
+ size = writtenCompressedIntSize(tag);
+ size += writtenCompressedIntSize(length);
+
+ return (size);
+}
+
+/*----------------------------------------------------------------------*/
+
+static char *writeUserInfoHeader(data_tag tag,
+ long infoSize,
+ long estHeaderSize,
+ char *buffer,
+ long *len)
+/* write the tag and size, making sure the info fits. return the true end
+ of the info (after adjustment) note that the argument infoSize includes
+ estHeaderSize. Note that the argument len is the number of bytes remaining
+ in the buffer. Since we write the tag and size at the beginning of the
+ buffer (in space that we reserved) we don't want to pass len the calls which
+ do that writing.
+ */
+{
+ long dummyLen = 100; /* plenty of space for a tag and size */
+ char *buf = buffer;
+ long realSize = infoSize - estHeaderSize;
+ long realHeaderSize = userInfoTagSize(tag, realSize);
+
+ if (buffer == NULL || *len == 0)
+ return (NULL);
+
+ /* write the tag */
+ buf = writeTag(tag, buf, &dummyLen);
+
+ /* see if the if the header size was correct. if not,
+ we have to shift the info to fit the real header size */
+ if (estHeaderSize != realHeaderSize) { /* make sure there is enough space */
+ CHECK_FOR_SPACE_LEFT(realHeaderSize - estHeaderSize, len);
+ memmove(buffer + realHeaderSize, buffer + estHeaderSize, (size_t) (realSize));
+ }
+
+ /* write the size */
+ writeCompressedInteger(realSize, buf, &dummyLen);
+
+ /* return the true end of buffer */
+ return (buffer + realHeaderSize + realSize);
+}
+
+/*----------------------------------------------------------------------*/
+
+static char *readUserInfoHeader(data_tag *tag,
+ unsigned long *num,
+ char *buffer)
+/* read the tag and size */
+{
+ char *buf = buffer;
+
+ buf = readTag(tag, buf);
+ buf = readCompressedInteger(num, buf);
+ return (buf);
+}
+
+/*----------------------------------------------------------------------*/
+
+WAISInitResponse *makeWAISInitResponse(long chunkCode,
+ long chunkIDLen,
+ char *chunkMarker,
+ char *highlightMarker,
+ char *deHighlightMarker,
+ char *newLineChars)
+/* create a WAIS init response object */
+{
+ WAISInitResponse *init = S_MALLOC(WAISInitResponse);
+
+ init->ChunkCode = chunkCode; /* note: none are copied! */
+ init->ChunkIDLength = chunkIDLen;
+ init->ChunkMarker = chunkMarker;
+ init->HighlightMarker = highlightMarker;
+ init->DeHighlightMarker = deHighlightMarker;
+ init->NewlineCharacters = newLineChars;
+
+ return (init);
+}
+
+/*----------------------------------------------------------------------*/
+
+void freeWAISInitResponse(WAISInitResponse *init)
+/* free an object made with makeWAISInitResponse */
+{
+ s_free(init->ChunkMarker);
+ s_free(init->HighlightMarker);
+ s_free(init->DeHighlightMarker);
+ s_free(init->NewlineCharacters);
+ s_free(init);
+}
+
+/*----------------------------------------------------------------------*/
+
+char *writeInitResponseInfo(InitResponseAPDU *init,
+ char *buffer,
+ long *len)
+/* write an init response object */
+{
+ unsigned long header_len = userInfoTagSize(DT_UserInformationLength,
+ DefWAISInitResponseSize);
+ char *buf = buffer + header_len;
+ WAISInitResponse *info = (WAISInitResponse *) init->UserInformationField;
+ unsigned long size;
+
+ RESERVE_SPACE_FOR_WAIS_HEADER(len);
+
+ buf = writeNum(info->ChunkCode, DT_ChunkCode, buf, len);
+ buf = writeNum(info->ChunkIDLength, DT_ChunkIDLength, buf, len);
+ buf = writeString(info->ChunkMarker, DT_ChunkMarker, buf, len);
+ buf = writeString(info->HighlightMarker, DT_HighlightMarker, buf, len);
+ buf = writeString(info->DeHighlightMarker, DT_DeHighlightMarker, buf, len);
+ buf = writeString(info->NewlineCharacters, DT_NewlineCharacters, buf, len);
+
+ /* now write the header and size */
+ size = buf - buffer;
+ buf = writeUserInfoHeader(DT_UserInformationLength,
+ size,
+ header_len,
+ buffer,
+ len);
+
+ return (buf);
+}
+
+/*----------------------------------------------------------------------*/
+
+char *readInitResponseInfo(void **info,
+ char *buffer)
+/* read an init response object */
+{
+ char *buf = buffer;
+ unsigned long size;
+ unsigned long headerSize;
+ long chunkCode, chunkIDLen;
+ data_tag tag1;
+ char *chunkMarker = NULL;
+ char *highlightMarker = NULL;
+ char *deHighlightMarker = NULL;
+ char *newLineChars = NULL;
+
+ chunkCode = chunkIDLen = UNUSED;
+
+ buf = readUserInfoHeader(&tag1, &size, buf);
+ headerSize = buf - buffer;
+
+ while (buf < (buffer + size + headerSize)) {
+ data_tag tag = peekTag(buf);
+
+ switch (tag) {
+ case DT_ChunkCode:
+ buf = readNum(&chunkCode, buf);
+ break;
+ case DT_ChunkIDLength:
+ buf = readNum(&chunkIDLen, buf);
+ break;
+ case DT_ChunkMarker:
+ buf = readString(&chunkMarker, buf);
+ break;
+ case DT_HighlightMarker:
+ buf = readString(&highlightMarker, buf);
+ break;
+ case DT_DeHighlightMarker:
+ buf = readString(&deHighlightMarker, buf);
+ break;
+ case DT_NewlineCharacters:
+ buf = readString(&newLineChars, buf);
+ break;
+ default:
+ s_free(highlightMarker);
+ s_free(deHighlightMarker);
+ s_free(newLineChars);
+ REPORT_READ_ERROR(buf);
+ break;
+ }
+ }
+
+ *info = (void *) makeWAISInitResponse(chunkCode, chunkIDLen, chunkMarker,
+ highlightMarker, deHighlightMarker,
+ newLineChars);
+ return (buf);
+}
+
+/*----------------------------------------------------------------------*/
+
+WAISSearch *makeWAISSearch(char *seedWords,
+ DocObj **docs,
+ char **textList,
+ long dateFactor,
+ char *beginDateRange,
+ char *endDateRange,
+ long maxDocsRetrieved)
+
+/* create a type 3 query object */
+{
+ WAISSearch *query = S_MALLOC(WAISSearch);
+
+ query->SeedWords = seedWords; /* not copied! */
+ query->Docs = docs; /* not copied! */
+ query->TextList = textList; /* not copied! */
+ query->DateFactor = dateFactor;
+ query->BeginDateRange = beginDateRange;
+ query->EndDateRange = endDateRange;
+ query->MaxDocumentsRetrieved = maxDocsRetrieved;
+
+ return (query);
+}
+
+/*----------------------------------------------------------------------*/
+
+void freeWAISSearch(WAISSearch *query)
+
+/* destroy an object made with makeWAISSearch() */
+{
+ void *ptr = NULL;
+ long i;
+
+ s_free(query->SeedWords);
+
+ if (query->Docs != NULL)
+ for (i = 0, ptr = (void *) query->Docs[i];
+ ptr != NULL;
+ ptr = (void *) query->Docs[++i])
+ freeDocObj((DocObj *) ptr);
+ s_free(query->Docs);
+
+ if (query->TextList != NULL) /* XXX revisit when textlist is fully defined */
+ for (i = 0, ptr = (void *) query->TextList[i];
+ ptr != NULL;
+ ptr = (void *) query->TextList[++i])
+ s_free(ptr);
+ s_free(query->TextList);
+
+ s_free(query->BeginDateRange);
+ s_free(query->EndDateRange);
+ s_free(query);
+}
+
+/*----------------------------------------------------------------------*/
+
+DocObj *makeDocObjUsingWholeDocument(any *docID,
+ char *type)
+
+/* construct a document object using byte chunks - only for use by
+ servers */
+{
+ DocObj *doc = S_MALLOC(DocObj);
+
+ doc->DocumentID = docID; /* not copied! */
+ doc->Type = type; /* not copied! */
+ doc->ChunkCode = CT_document;
+ return (doc);
+}
+
+/*----------------------------------------------------------------------*/
+
+DocObj *makeDocObjUsingLines(any *docID,
+ char *type,
+ long start,
+ long end)
+
+/* construct a document object using line chunks - only for use by
+ servers */
+{
+ DocObj *doc = S_MALLOC(DocObj);
+
+ doc->ChunkCode = CT_line;
+ doc->DocumentID = docID; /* not copied */
+ doc->Type = type; /* not copied! */
+ doc->ChunkStart.Pos = start;
+ doc->ChunkEnd.Pos = end;
+ return (doc);
+}
+
+/*----------------------------------------------------------------------*/
+
+DocObj *makeDocObjUsingBytes(any *docID,
+ char *type,
+ long start,
+ long end)
+
+/* construct a document object using byte chunks - only for use by
+ servers */
+{
+ DocObj *doc = S_MALLOC(DocObj);
+
+ doc->ChunkCode = CT_byte;
+ doc->DocumentID = docID; /* not copied */
+ doc->Type = type; /* not copied! */
+ doc->ChunkStart.Pos = start;
+ doc->ChunkEnd.Pos = end;
+ return (doc);
+}
+
+/*----------------------------------------------------------------------*/
+
+DocObj *makeDocObjUsingParagraphs(any *docID,
+ char *type,
+ any *start,
+ any *end)
+
+/* construct a document object using byte chunks - only for use by
+ servers */
+{
+ DocObj *doc = S_MALLOC(DocObj);
+
+ doc->ChunkCode = CT_paragraph;
+ doc->DocumentID = docID; /* not copied */
+ doc->Type = type;
+ doc->ChunkStart.ID = start;
+ doc->ChunkEnd.ID = end;
+ return (doc);
+}
+
+/*----------------------------------------------------------------------*/
+
+void freeDocObj(DocObj *doc)
+
+/* free a docObj */
+{
+ freeAny(doc->DocumentID);
+ s_free(doc->Type);
+ if (doc->ChunkCode == CT_paragraph) {
+ freeAny(doc->ChunkStart.ID);
+ freeAny(doc->ChunkEnd.ID);
+ }
+ s_free(doc);
+}
+
+/*----------------------------------------------------------------------*/
+
+static char *writeDocObj(DocObj *doc,
+ char *buffer,
+ long *len)
+
+/* write as little as we can about the doc obj */
+{
+ char *buf = buffer;
+
+ /* we always have to write the id, but its tag depends on if it's a chunk */
+ if (doc->ChunkCode == CT_document)
+ buf = writeAny(doc->DocumentID, DT_DocumentID, buf, len);
+ else
+ buf = writeAny(doc->DocumentID, DT_DocumentIDChunk, buf, len);
+
+ if (doc->Type != NULL)
+ buf = writeString(doc->Type, DT_TYPE, buf, len);
+
+ switch (doc->ChunkCode) {
+ case CT_document:
+ /* do nothing - there is no chunk data */
+ break;
+ case CT_byte:
+ case CT_line:
+ buf = writeNum(doc->ChunkCode, DT_ChunkCode, buf, len);
+ buf = writeNum(doc->ChunkStart.Pos, DT_ChunkStartID, buf, len);
+ buf = writeNum(doc->ChunkEnd.Pos, DT_ChunkEndID, buf, len);
+ break;
+ case CT_paragraph:
+ buf = writeNum(doc->ChunkCode, DT_ChunkCode, buf, len);
+ buf = writeAny(doc->ChunkStart.ID, DT_ChunkStartID, buf, len);
+ buf = writeAny(doc->ChunkEnd.ID, DT_ChunkEndID, buf, len);
+ break;
+ default:
+ panic("Implementation error: unknown chuck type %ld",
+ doc->ChunkCode);
+ break;
+ }
+
+ return (buf);
+}
+
+/*----------------------------------------------------------------------*/
+
+static char *readDocObj(DocObj **doc,
+ char *buffer)
+
+/* read whatever we have about the new document */
+{
+ char *buf = buffer;
+ data_tag tag;
+
+ *doc = S_MALLOC(DocObj);
+
+ tag = peekTag(buf);
+ buf = readAny(&((*doc)->DocumentID), buf);
+
+ if (tag == DT_DocumentID) {
+ (*doc)->ChunkCode = CT_document;
+ tag = peekTag(buf);
+ if (tag == DT_TYPE) /* XXX depends on DT_TYPE != what comes next */
+ buf = readString(&((*doc)->Type), buf);
+ /* ChunkStart and ChunkEnd are undefined */
+ } else if (tag == DT_DocumentIDChunk) {
+ boolean readParagraphs = false; /* for cleanup */
+
+ tag = peekTag(buf);
+ if (tag == DT_TYPE) /* XXX depends on DT_TYPE != CT_FOO */
+ buf = readString(&((*doc)->Type), buf);
+ buf = readNum(&((*doc)->ChunkCode), buf);
+ switch ((*doc)->ChunkCode) {
+ case CT_byte:
+ case CT_line:
+ buf = readNum(&((*doc)->ChunkStart.Pos), buf);
+ buf = readNum(&((*doc)->ChunkEnd.Pos), buf);
+ break;
+ case CT_paragraph:
+ buf = readAny(&((*doc)->ChunkStart.ID), buf);
+ buf = readAny(&((*doc)->ChunkEnd.ID), buf);
+ break;
+ default:
+ freeAny((*doc)->DocumentID);
+ if (readParagraphs) {
+ freeAny((*doc)->ChunkStart.ID);
+ freeAny((*doc)->ChunkEnd.ID);
+ }
+ s_free(doc);
+ REPORT_READ_ERROR(buf);
+ break;
+ }
+ } else {
+ freeAny((*doc)->DocumentID);
+ s_free(*doc);
+ REPORT_READ_ERROR(buf);
+ }
+ return (buf);
+}
+
+/*----------------------------------------------------------------------*/
+
+char *writeSearchInfo(SearchAPDU *query,
+ char *buffer,
+ long *len)
+
+/* write out a WAIS query (type 1 or 3) */
+{
+ if (strcmp(query->QueryType, QT_TextRetrievalQuery) == 0) {
+ return (writeAny((any *) query->Query, DT_Query, buffer, len));
+ } else {
+ unsigned long header_len = userInfoTagSize(DT_UserInformationLength,
+ DefWAISSearchSize);
+ char *buf = buffer + header_len;
+ WAISSearch *info = (WAISSearch *) query->Query;
+ unsigned long size;
+ long i;
+
+ RESERVE_SPACE_FOR_WAIS_HEADER(len);
+
+ buf = writeString(info->SeedWords, DT_SeedWords, buf, len);
+
+ if (info->Docs != NULL) {
+ for (i = 0; info->Docs[i] != NULL; i++) {
+ buf = writeDocObj(info->Docs[i], buf, len);
+ }
+ }
+
+ /* XXX text list */
+
+ buf = writeNum(info->DateFactor,
+ DT_DateFactor,
+ buf,
+ len);
+ buf = writeString(info->BeginDateRange,
+ DT_BeginDateRange,
+ buf,
+ len);
+ buf = writeString(info->EndDateRange,
+ DT_EndDateRange,
+ buf,
+ len);
+ buf = writeNum(info->MaxDocumentsRetrieved,
+ DT_MaxDocumentsRetrieved,
+ buf,
+ len);
+
+ /* now write the header and size */
+ size = buf - buffer;
+ buf = writeUserInfoHeader(DT_UserInformationLength,
+ size,
+ header_len,
+ buffer,
+ len);
+
+ return (buf);
+ }
+}
+
+/*----------------------------------------------------------------------*/
+
+char *readSearchInfo(void **info,
+ char *buffer)
+
+/* read a WAIS query (type 1 or 3) */
+{
+ data_tag type = peekTag(buffer);
+
+ if (type == DT_Query) /* this is a type 1 query */
+ {
+ char *buf = buffer;
+ any *query = NULL;
+
+ buf = readAny(&query, buf);
+ *info = (void *) query;
+ return (buf);
+ } else { /* a type 3 query */
+ char *buf = buffer;
+ unsigned long size;
+ unsigned long headerSize;
+ data_tag tag1;
+ char *seedWords = NULL;
+ char *beginDateRange = NULL;
+ char *endDateRange = NULL;
+ long dateFactor, maxDocsRetrieved;
+ char **textList = NULL;
+ DocObj **docIDs = NULL;
+ DocObj *doc = NULL;
+ long docs = 0;
+ long i;
+ void *ptr = NULL;
+
+ dateFactor = maxDocsRetrieved = UNUSED;
+
+ buf = readUserInfoHeader(&tag1, &size, buf);
+ headerSize = buf - buffer;
+
+ while (buf < (buffer + size + headerSize)) {
+ data_tag tag = peekTag(buf);
+
+ switch (tag) {
+ case DT_SeedWords:
+ buf = readString(&seedWords, buf);
+ break;
+ case DT_DocumentID:
+ case DT_DocumentIDChunk:
+ if (docIDs == NULL) /* create a new doc list */
+ {
+ docIDs = S_MALLOC2(DocObj *);
+ } else { /* grow the doc list */
+ docIDs = S_REALLOC2(DocObj *, docIDs, docs);
+ }
+ buf = readDocObj(&doc, buf);
+ if (buf == NULL) {
+ s_free(seedWords);
+ s_free(beginDateRange);
+ s_free(endDateRange);
+ if (docIDs != NULL)
+ for (i = 0, ptr = (void *) docIDs[i];
+ ptr != NULL;
+ ptr = (void *) docIDs[++i])
+ freeDocObj((DocObj *) ptr);
+ s_free(docIDs);
+ /* XXX should also free textlist when it is fully defined */
+ }
+ RETURN_ON_NULL(buf);
+ docIDs[docs++] = doc; /* put it in the list */
+ docIDs[docs] = NULL;
+ break;
+ case DT_TextList:
+ /* XXX */
+ break;
+ case DT_DateFactor:
+ buf = readNum(&dateFactor, buf);
+ break;
+ case DT_BeginDateRange:
+ buf = readString(&beginDateRange, buf);
+ break;
+ case DT_EndDateRange:
+ buf = readString(&endDateRange, buf);
+ break;
+ case DT_MaxDocumentsRetrieved:
+ buf = readNum(&maxDocsRetrieved, buf);
+ break;
+ default:
+ s_free(seedWords);
+ s_free(beginDateRange);
+ s_free(endDateRange);
+ if (docIDs != NULL)
+ for (i = 0, ptr = (void *) docIDs[i];
+ ptr != NULL;
+ ptr = (void *) docIDs[++i])
+ freeDocObj((DocObj *) ptr);
+ s_free(docIDs);
+ /* XXX should also free textlist when it is fully defined */
+ REPORT_READ_ERROR(buf);
+ break;
+ }
+ }
+
+ *info = (void *) makeWAISSearch(seedWords, docIDs, textList,
+ dateFactor, beginDateRange, endDateRange,
+ maxDocsRetrieved);
+ return (buf);
+ }
+}
+
+/*----------------------------------------------------------------------*/
+
+WAISDocumentHeader *makeWAISDocumentHeader(any *docID,
+ long versionNumber,
+ long score,
+ long bestMatch,
+ long docLen,
+ long lines,
+ char **types,
+ char *source,
+ char *date,
+ char *headline,
+ char *originCity)
+
+/* construct a standard document header, note that no fields are copied!
+ if the application needs to save these fields, it should copy them,
+ or set the field in this object to NULL before freeing it.
+ */
+{
+ WAISDocumentHeader *header = S_MALLOC(WAISDocumentHeader);
+
+ header->DocumentID = docID;
+ header->VersionNumber = versionNumber;
+ header->Score = score;
+ header->BestMatch = bestMatch;
+ header->DocumentLength = docLen;
+ header->Lines = lines;
+ header->Types = types;
+ header->Source = source;
+ header->Date = date;
+ header->Headline = headline;
+ header->OriginCity = originCity;
+
+ return (header);
+}
+
+/*----------------------------------------------------------------------*/
+
+void freeWAISDocumentHeader(WAISDocumentHeader *header)
+{
+ freeAny(header->DocumentID);
+ doList((void **) header->Types, fs_free); /* can't use the macro here ! */
+ s_free(header->Types);
+ s_free(header->Source);
+ s_free(header->Date);
+ s_free(header->Headline);
+ s_free(header->OriginCity);
+ s_free(header);
+}
+
+/*----------------------------------------------------------------------*/
+
+char *writeWAISDocumentHeader(WAISDocumentHeader *header, char *buffer,
+ long *len)
+{
+ unsigned long header_len = userInfoTagSize(DT_DocumentHeaderGroup,
+ DefWAISDocHeaderSize);
+ char *buf = buffer + header_len;
+ unsigned long size1;
+
+ RESERVE_SPACE_FOR_WAIS_HEADER(len);
+
+ buf = writeAny(header->DocumentID, DT_DocumentID, buf, len);
+ buf = writeNum(header->VersionNumber, DT_VersionNumber, buf, len);
+ buf = writeNum(header->Score, DT_Score, buf, len);
+ buf = writeNum(header->BestMatch, DT_BestMatch, buf, len);
+ buf = writeNum(header->DocumentLength, DT_DocumentLength, buf, len);
+ buf = writeNum(header->Lines, DT_Lines, buf, len);
+ if (header->Types != NULL) {
+ long size;
+ char *ptr = NULL;
+ long i;
+
+ buf = writeTag(DT_TYPE_BLOCK, buf, len);
+ for (i = 0, size = 0, ptr = header->Types[i];
+ ptr != NULL;
+ ptr = header->Types[++i]) {
+ long typeSize = strlen(ptr);
+
+ size += writtenTagSize(DT_TYPE);
+ size += writtenCompressedIntSize(typeSize);
+ size += typeSize;
+ }
+ buf = writeCompressedInteger((unsigned long) size, buf, len);
+ for (i = 0, ptr = header->Types[i]; ptr != NULL; ptr = header->Types[++i])
+ buf = writeString(ptr, DT_TYPE, buf, len);
+ }
+ buf = writeString(header->Source, DT_Source, buf, len);
+ buf = writeString(header->Date, DT_Date, buf, len);
+ buf = writeString(header->Headline, DT_Headline, buf, len);
+ buf = writeString(header->OriginCity, DT_OriginCity, buf, len);
+
+ /* now write the header and size */
+ size1 = buf - buffer;
+ buf = writeUserInfoHeader(DT_DocumentHeaderGroup,
+ size1,
+ header_len,
+ buffer,
+ len);
+
+ return (buf);
+}
+
+/*----------------------------------------------------------------------*/
+
+char *readWAISDocumentHeader(WAISDocumentHeader **header, char *buffer)
+{
+ char *buf = buffer;
+ unsigned long size1;
+ unsigned long headerSize;
+ data_tag tag1;
+ any *docID = NULL;
+ long versionNumber, score, bestMatch, docLength, lines;
+ char **types = NULL;
+ char *source = NULL;
+ char *date = NULL;
+ char *headline = NULL;
+ char *originCity = NULL;
+
+ versionNumber = score = bestMatch = docLength = lines = UNUSED;
+
+ buf = readUserInfoHeader(&tag1, &size1, buf);
+ headerSize = buf - buffer;
+
+ while (buf < (buffer + size1 + headerSize)) {
+ data_tag tag = peekTag(buf);
+
+ switch (tag) {
+ case DT_DocumentID:
+ buf = readAny(&docID, buf);
+ break;
+ case DT_VersionNumber:
+ buf = readNum(&versionNumber, buf);
+ break;
+ case DT_Score:
+ buf = readNum(&score, buf);
+ break;
+ case DT_BestMatch:
+ buf = readNum(&bestMatch, buf);
+ break;
+ case DT_DocumentLength:
+ buf = readNum(&docLength, buf);
+ break;
+ case DT_Lines:
+ buf = readNum(&lines, buf);
+ break;
+ case DT_TYPE_BLOCK:
+ {
+ unsigned long size = -1;
+ long numTypes = 0;
+
+ buf = readTag(&tag, buf);
+ buf = readCompressedInteger(&size, buf);
+ while (size > 0) {
+ char *type = NULL;
+ char *originalBuf = buf;
+
+ buf = readString(&type, buf);
+ types = S_REALLOC2(char *, types, numTypes);
+
+ types[numTypes++] = type;
+ types[numTypes] = NULL;
+ size -= (buf - originalBuf);
+ }
+ }
+ /* FALLTHRU */
+ case DT_Source:
+ buf = readString(&source, buf);
+ break;
+ case DT_Date:
+ buf = readString(&date, buf);
+ break;
+ case DT_Headline:
+ buf = readString(&headline, buf);
+ break;
+ case DT_OriginCity:
+ buf = readString(&originCity, buf);
+ break;
+ default:
+ freeAny(docID);
+ s_free(source);
+ s_free(date);
+ s_free(headline);
+ s_free(originCity);
+ REPORT_READ_ERROR(buf);
+ break;
+ }
+ }
+
+ *header = makeWAISDocumentHeader(docID, versionNumber, score, bestMatch,
+ docLength, lines, types, source, date, headline,
+ originCity);
+ return (buf);
+}
+
+/*----------------------------------------------------------------------*/
+
+WAISDocumentShortHeader *makeWAISDocumentShortHeader(any *docID,
+ long versionNumber,
+ long score,
+ long bestMatch,
+ long docLen,
+ long lines)
+/* construct a short document header, note that no fields are copied!
+ if the application needs to save these fields, it should copy them,
+ or set the field in this object to NULL before freeing it.
+ */
+{
+ WAISDocumentShortHeader *header = S_MALLOC(WAISDocumentShortHeader);
+
+ header->DocumentID = docID;
+ header->VersionNumber = versionNumber;
+ header->Score = score;
+ header->BestMatch = bestMatch;
+ header->DocumentLength = docLen;
+ header->Lines = lines;
+
+ return (header);
+}
+
+/*----------------------------------------------------------------------*/
+
+void freeWAISDocumentShortHeader(WAISDocumentShortHeader *header)
+{
+ freeAny(header->DocumentID);
+ s_free(header);
+}
+
+/*----------------------------------------------------------------------*/
+
+char *writeWAISDocumentShortHeader(WAISDocumentShortHeader *header, char *buffer,
+ long *len)
+{
+ unsigned long header_len = userInfoTagSize(DT_DocumentShortHeaderGroup,
+ DefWAISShortHeaderSize);
+ char *buf = buffer + header_len;
+ unsigned long size;
+
+ RESERVE_SPACE_FOR_WAIS_HEADER(len);
+
+ buf = writeAny(header->DocumentID, DT_DocumentID, buf, len);
+ buf = writeNum(header->VersionNumber, DT_VersionNumber, buf, len);
+ buf = writeNum(header->Score, DT_Score, buf, len);
+ buf = writeNum(header->BestMatch, DT_BestMatch, buf, len);
+ buf = writeNum(header->DocumentLength, DT_DocumentLength, buf, len);
+ buf = writeNum(header->Lines, DT_Lines, buf, len);
+
+ /* now write the header and size */
+ size = buf - buffer;
+ buf = writeUserInfoHeader(DT_DocumentShortHeaderGroup,
+ size,
+ header_len,
+ buffer,
+ len);
+
+ return (buf);
+}
+
+/*----------------------------------------------------------------------*/
+
+char *readWAISDocumentShortHeader(WAISDocumentShortHeader **header, char *buffer)
+{
+ char *buf = buffer;
+ unsigned long size;
+ unsigned long headerSize;
+ data_tag tag1;
+ any *docID = NULL;
+ long versionNumber, score, bestMatch, docLength, lines;
+
+ versionNumber = score = bestMatch = docLength = lines = UNUSED;
+
+ buf = readUserInfoHeader(&tag1, &size, buf);
+ headerSize = buf - buffer;
+
+ while (buf < (buffer + size + headerSize)) {
+ data_tag tag = peekTag(buf);
+
+ switch (tag) {
+ case DT_DocumentID:
+ buf = readAny(&docID, buf);
+ break;
+ case DT_VersionNumber:
+ buf = readNum(&versionNumber, buf);
+ break;
+ case DT_Score:
+ buf = readNum(&score, buf);
+ break;
+ case DT_BestMatch:
+ buf = readNum(&bestMatch, buf);
+ break;
+ case DT_DocumentLength:
+ buf = readNum(&docLength, buf);
+ break;
+ case DT_Lines:
+ buf = readNum(&lines, buf);
+ break;
+ default:
+ freeAny(docID);
+ REPORT_READ_ERROR(buf);
+ break;
+ }
+ }
+
+ *header = makeWAISDocumentShortHeader(docID, versionNumber, score, bestMatch,
+ docLength, lines);
+ return (buf);
+}
+
+/*----------------------------------------------------------------------*/
+
+WAISDocumentLongHeader *makeWAISDocumentLongHeader(any *docID,
+ long versionNumber,
+ long score,
+ long bestMatch,
+ long docLen,
+ long lines,
+ char **types,
+ char *source,
+ char *date,
+ char *headline,
+ char *originCity,
+ char *stockCodes,
+ char *companyCodes,
+ char *industryCodes)
+/* construct a long document header, note that no fields are copied!
+ if the application needs to save these fields, it should copy them,
+ or set the field in this object to NULL before freeing it.
+ */
+{
+ WAISDocumentLongHeader *header = S_MALLOC(WAISDocumentLongHeader);
+
+ header->DocumentID = docID;
+ header->VersionNumber = versionNumber;
+ header->Score = score;
+ header->BestMatch = bestMatch;
+ header->DocumentLength = docLen;
+ header->Lines = lines;
+ header->Types = types;
+ header->Source = source;
+ header->Date = date;
+ header->Headline = headline;
+ header->OriginCity = originCity;
+ header->StockCodes = stockCodes;
+ header->CompanyCodes = companyCodes;
+ header->IndustryCodes = industryCodes;
+
+ return (header);
+}
+
+/*----------------------------------------------------------------------*/
+
+void freeWAISDocumentLongHeader(WAISDocumentLongHeader *header)
+{
+ freeAny(header->DocumentID);
+ doList((void **) header->Types, fs_free); /* can't use the macro here! */
+ s_free(header->Source);
+ s_free(header->Date);
+ s_free(header->Headline);
+ s_free(header->OriginCity);
+ s_free(header->StockCodes);
+ s_free(header->CompanyCodes);
+ s_free(header->IndustryCodes);
+ s_free(header);
+}
+
+/*----------------------------------------------------------------------*/
+
+char *writeWAISDocumentLongHeader(WAISDocumentLongHeader *header, char *buffer,
+ long *len)
+{
+ unsigned long header_len = userInfoTagSize(DT_DocumentLongHeaderGroup,
+ DefWAISLongHeaderSize);
+ char *buf = buffer + header_len;
+ unsigned long size1;
+
+ RESERVE_SPACE_FOR_WAIS_HEADER(len);
+
+ buf = writeAny(header->DocumentID, DT_DocumentID, buf, len);
+ buf = writeNum(header->VersionNumber, DT_VersionNumber, buf, len);
+ buf = writeNum(header->Score, DT_Score, buf, len);
+ buf = writeNum(header->BestMatch, DT_BestMatch, buf, len);
+ buf = writeNum(header->DocumentLength, DT_DocumentLength, buf, len);
+ buf = writeNum(header->Lines, DT_Lines, buf, len);
+ if (header->Types != NULL) {
+ long size;
+ char *ptr = NULL;
+ long i;
+
+ buf = writeTag(DT_TYPE_BLOCK, buf, len);
+ for (i = 0, size = 0, ptr = header->Types[i];
+ ptr != NULL;
+ ptr = header->Types[++i]) {
+ long typeSize = strlen(ptr);
+
+ size += writtenTagSize(DT_TYPE);
+ size += writtenCompressedIntSize(typeSize);
+ size += typeSize;
+ }
+ buf = writeCompressedInteger((unsigned long) size, buf, len);
+ for (i = 0, ptr = header->Types[i]; ptr != NULL; ptr = header->Types[++i])
+ buf = writeString(ptr, DT_TYPE, buf, len);
+ }
+ buf = writeString(header->Source, DT_Source, buf, len);
+ buf = writeString(header->Date, DT_Date, buf, len);
+ buf = writeString(header->Headline, DT_Headline, buf, len);
+ buf = writeString(header->OriginCity, DT_OriginCity, buf, len);
+ buf = writeString(header->StockCodes, DT_StockCodes, buf, len);
+ buf = writeString(header->CompanyCodes, DT_CompanyCodes, buf, len);
+ buf = writeString(header->IndustryCodes, DT_IndustryCodes, buf, len);
+
+ /* now write the header and size */
+ size1 = buf - buffer;
+ buf = writeUserInfoHeader(DT_DocumentLongHeaderGroup,
+ size1,
+ header_len,
+ buffer,
+ len);
+
+ return (buf);
+}
+
+/*----------------------------------------------------------------------*/
+
+char *readWAISDocumentLongHeader(WAISDocumentLongHeader **header, char *buffer)
+{
+ char *buf = buffer;
+ unsigned long size1;
+ unsigned long headerSize;
+ data_tag tag1;
+ any *docID;
+ long versionNumber, score, bestMatch, docLength, lines;
+ char **types;
+ char *source, *date, *headline, *originCity, *stockCodes, *companyCodes, *industryCodes;
+
+ docID = NULL;
+ versionNumber =
+ score =
+ bestMatch =
+ docLength =
+ lines = UNUSED;
+ types = NULL;
+ source =
+ date =
+ headline =
+ originCity =
+ stockCodes =
+ companyCodes =
+ industryCodes = NULL;
+
+ buf = readUserInfoHeader(&tag1, &size1, buf);
+ headerSize = buf - buffer;
+
+ while (buf < (buffer + size1 + headerSize)) {
+ data_tag tag = peekTag(buf);
+
+ switch (tag) {
+ case DT_DocumentID:
+ buf = readAny(&docID, buf);
+ break;
+ case DT_VersionNumber:
+ buf = readNum(&versionNumber, buf);
+ break;
+ case DT_Score:
+ buf = readNum(&score, buf);
+ break;
+ case DT_BestMatch:
+ buf = readNum(&bestMatch, buf);
+ break;
+ case DT_DocumentLength:
+ buf = readNum(&docLength, buf);
+ break;
+ case DT_Lines:
+ buf = readNum(&lines, buf);
+ break;
+ case DT_TYPE_BLOCK:
+ {
+ unsigned long size = -1;
+ long numTypes = 0;
+
+ buf = readTag(&tag, buf);
+ readCompressedInteger(&size, buf);
+ while (size > 0) {
+ char *type = NULL;
+ char *originalBuf = buf;
+
+ buf = readString(&type, buf);
+ types = S_REALLOC2(char *, types, numTypes);
+
+ types[numTypes++] = type;
+ types[numTypes] = NULL;
+ size -= (buf - originalBuf);
+ }
+ }
+ /* FALLTHRU */
+ case DT_Source:
+ buf = readString(&source, buf);
+ break;
+ case DT_Date:
+ buf = readString(&date, buf);
+ break;
+ case DT_Headline:
+ buf = readString(&headline, buf);
+ break;
+ case DT_OriginCity:
+ buf = readString(&originCity, buf);
+ break;
+ case DT_StockCodes:
+ buf = readString(&stockCodes, buf);
+ break;
+ case DT_CompanyCodes:
+ buf = readString(&companyCodes, buf);
+ break;
+ case DT_IndustryCodes:
+ buf = readString(&industryCodes, buf);
+ break;
+ default:
+ freeAny(docID);
+ s_free(source);
+ s_free(date);
+ s_free(headline);
+ s_free(originCity);
+ s_free(stockCodes);
+ s_free(companyCodes);
+ s_free(industryCodes);
+ REPORT_READ_ERROR(buf);
+ break;
+ }
+ }
+
+ *header = makeWAISDocumentLongHeader(docID,
+ versionNumber,
+ score,
+ bestMatch,
+ docLength,
+ lines,
+ types,
+ source,
+ date,
+ headline,
+ originCity,
+ stockCodes,
+ companyCodes,
+ industryCodes);
+ return (buf);
+}
+
+/*----------------------------------------------------------------------*/
+
+WAISSearchResponse *
+ makeWAISSearchResponse(
+ char *seedWordsUsed,
+ WAISDocumentHeader **docHeaders,
+ WAISDocumentShortHeader **shortHeaders,
+ WAISDocumentLongHeader **longHeaders,
+ WAISDocumentText **text,
+ WAISDocumentHeadlines **headlines,
+ WAISDocumentCodes **codes,
+ diagnosticRecord ** diagnostics)
+{
+ WAISSearchResponse *response = S_MALLOC(WAISSearchResponse);
+
+ response->SeedWordsUsed = seedWordsUsed;
+ response->DocHeaders = docHeaders;
+ response->ShortHeaders = shortHeaders;
+ response->LongHeaders = longHeaders;
+ response->Text = text;
+ response->Headlines = headlines;
+ response->Codes = codes;
+ response->Diagnostics = diagnostics;
+
+ return (response);
+}
+
+/*----------------------------------------------------------------------*/
+
+void freeWAISSearchResponse(WAISSearchResponse * response)
+{
+ void *ptr = NULL;
+ long i;
+
+ s_free(response->SeedWordsUsed);
+
+ if (response->DocHeaders != NULL)
+ for (i = 0, ptr = (void *) response->DocHeaders[i];
+ ptr != NULL;
+ ptr = (void *) response->DocHeaders[++i])
+ freeWAISDocumentHeader((WAISDocumentHeader *) ptr);
+ s_free(response->DocHeaders);
+
+ if (response->ShortHeaders != NULL)
+ for (i = 0, ptr = (void *) response->ShortHeaders[i];
+ ptr != NULL;
+ ptr = (void *) response->ShortHeaders[++i])
+ freeWAISDocumentShortHeader((WAISDocumentShortHeader *) ptr);
+ s_free(response->ShortHeaders);
+
+ if (response->LongHeaders != NULL)
+ for (i = 0, ptr = (void *) response->LongHeaders[i];
+ ptr != NULL;
+ ptr = (void *) response->LongHeaders[++i])
+ freeWAISDocumentLongHeader((WAISDocumentLongHeader *) ptr);
+ s_free(response->LongHeaders);
+
+ if (response->Text != NULL)
+ for (i = 0, ptr = (void *) response->Text[i];
+ ptr != NULL;
+ ptr = (void *) response->Text[++i])
+ freeWAISDocumentText((WAISDocumentText *) ptr);
+ s_free(response->Text);
+
+ if (response->Headlines != NULL)
+ for (i = 0, ptr = (void *) response->Headlines[i];
+ ptr != NULL;
+ ptr = (void *) response->Headlines[++i])
+ freeWAISDocumentHeadlines((WAISDocumentHeadlines *) ptr);
+ s_free(response->Headlines);
+
+ if (response->Codes != NULL)
+ for (i = 0, ptr = (void *) response->Codes[i];
+ ptr != NULL;
+ ptr = (void *) response->Codes[++i])
+ freeWAISDocumentCodes((WAISDocumentCodes *) ptr);
+ s_free(response->Codes);
+
+ if (response->Diagnostics != NULL)
+ for (i = 0, ptr = (void *) response->Diagnostics[i];
+ ptr != NULL;
+ ptr = (void *) response->Diagnostics[++i])
+ freeDiag((diagnosticRecord *) ptr);
+ s_free(response->Diagnostics);
+
+ s_free(response);
+}
+
+/*----------------------------------------------------------------------*/
+
+char *writeSearchResponseInfo(SearchResponseAPDU *query,
+ char *buffer,
+ long *len)
+{
+ unsigned long header_len = userInfoTagSize(DT_UserInformationLength,
+ DefWAISSearchResponseSize);
+ char *buf = buffer + header_len;
+ WAISSearchResponse *info = (WAISSearchResponse *) query->DatabaseDiagnosticRecords;
+ unsigned long size;
+ void *header = NULL;
+ long i;
+
+ RESERVE_SPACE_FOR_WAIS_HEADER(len);
+
+ buf = writeString(info->SeedWordsUsed, DT_SeedWordsUsed, buf, len);
+
+ /* write out all the headers */
+ if (info->DocHeaders != NULL) {
+ for (i = 0, header = (void *) info->DocHeaders[i];
+ header != NULL;
+ header = (void *) info->DocHeaders[++i])
+ buf = writeWAISDocumentHeader((WAISDocumentHeader *) header, buf, len);
+ }
+
+ if (info->ShortHeaders != NULL) {
+ for (i = 0, header = (void *) info->ShortHeaders[i];
+ header != NULL;
+ header = (void *) info->ShortHeaders[++i])
+ buf = writeWAISDocumentShortHeader((WAISDocumentShortHeader *) header,
+ buf,
+ len);
+ }
+
+ if (info->LongHeaders != NULL) {
+ for (i = 0, header = (void *) info->LongHeaders[i];
+ header != NULL;
+ header = (void *) info->LongHeaders[++i])
+ buf = writeWAISDocumentLongHeader((WAISDocumentLongHeader *) header,
+ buf,
+ len);
+ }
+
+ if (info->Text != NULL) {
+ for (i = 0, header = (void *) info->Text[i];
+ header != NULL;
+ header = (void *) info->Text[++i])
+ buf = writeWAISDocumentText((WAISDocumentText *) header, buf, len);
+ }
+
+ if (info->Headlines != NULL) {
+ for (i = 0, header = (void *) info->Headlines[i];
+ header != NULL;
+ header = (void *) info->Headlines[++i])
+ buf = writeWAISDocumentHeadlines((WAISDocumentHeadlines *) header,
+ buf,
+ len);
+ }
+
+ if (info->Codes != NULL) {
+ for (i = 0, header = (void *) info->Codes[i];
+ header != NULL;
+ header = (void *) info->Codes[++i])
+ buf = writeWAISDocumentCodes((WAISDocumentCodes *) header, buf, len);
+ }
+
+ if (info->Diagnostics != NULL) {
+ for (i = 0, header = (void *) info->Diagnostics[i];
+ header != NULL;
+ header = (void *) info->Diagnostics[++i])
+ buf = writeDiag((diagnosticRecord *) header, buf, len);
+ }
+
+ /* now write the header and size */
+ size = buf - buffer;
+ buf = writeUserInfoHeader(DT_UserInformationLength,
+ size,
+ header_len,
+ buffer,
+ len);
+
+ return (buf);
+}
+
+/*----------------------------------------------------------------------*/
+
+static void cleanUpWaisSearchResponse(char *buf,
+ char *seedWordsUsed,
+ WAISDocumentHeader **docHeaders,
+ WAISDocumentShortHeader **shortHeaders,
+ WAISDocumentLongHeader **longHeaders,
+ WAISDocumentText **text,
+ WAISDocumentHeadlines **headlines,
+ WAISDocumentCodes **codes,
+ diagnosticRecord ** diags)
+/* if buf is NULL, we have just gotten a read error, and need to clean up
+ any state we have built. If not, then everything is going fine, and
+ we should just hang loose
+ */
+{
+ void *ptr = NULL;
+ long i;
+
+ if (buf == NULL) {
+ s_free(seedWordsUsed);
+ if (docHeaders != NULL)
+ for (i = 0, ptr = (void *) docHeaders[i]; ptr != NULL;
+ ptr = (void *) docHeaders[++i])
+ freeWAISDocumentHeader((WAISDocumentHeader *) ptr);
+ s_free(docHeaders);
+ if (shortHeaders != NULL)
+ for (i = 0, ptr = (void *) shortHeaders[i]; ptr != NULL;
+ ptr = (void *) shortHeaders[++i])
+ freeWAISDocumentShortHeader((WAISDocumentShortHeader *) ptr);
+ s_free(shortHeaders);
+ if (longHeaders != NULL)
+ for (i = 0, ptr = (void *) longHeaders[i]; ptr != NULL;
+ ptr = (void *) longHeaders[++i])
+ freeWAISDocumentLongHeader((WAISDocumentLongHeader *) ptr);
+ s_free(longHeaders);
+ if (text != NULL)
+ for (i = 0, ptr = (void *) text[i];
+ ptr != NULL;
+ ptr = (void *) text[++i])
+ freeWAISDocumentText((WAISDocumentText *) ptr);
+ s_free(text);
+ if (headlines != NULL)
+ for (i = 0, ptr = (void *) headlines[i]; ptr != NULL;
+ ptr = (void *) headlines[++i])
+ freeWAISDocumentHeadlines((WAISDocumentHeadlines *) ptr);
+ s_free(headlines);
+ if (codes != NULL)
+ for (i = 0, ptr = (void *) codes[i]; ptr != NULL;
+ ptr = (void *) codes[++i])
+ freeWAISDocumentCodes((WAISDocumentCodes *) ptr);
+ s_free(codes);
+ if (diags != NULL)
+ for (i = 0, ptr = (void *) diags[i]; ptr != NULL;
+ ptr = (void *) diags[++i])
+ freeDiag((diagnosticRecord *) ptr);
+ s_free(diags);
+ }
+}
+
+/*----------------------------------------------------------------------*/
+
+char *readSearchResponseInfo(void **info,
+ char *buffer)
+{
+ char *buf = buffer;
+ unsigned long size;
+ unsigned long headerSize;
+ data_tag tag1;
+ void *header = NULL;
+ WAISDocumentHeader **docHeaders = NULL;
+ WAISDocumentShortHeader **shortHeaders = NULL;
+ WAISDocumentLongHeader **longHeaders = NULL;
+ WAISDocumentText **text = NULL;
+ WAISDocumentHeadlines **headlines = NULL;
+ WAISDocumentCodes **codes = NULL;
+ long numDocHeaders, numLongHeaders, numShortHeaders, numText, numHeadlines;
+ long numCodes;
+ char *seedWordsUsed = NULL;
+ diagnosticRecord **diags = NULL;
+ diagnosticRecord *diag = NULL;
+ long numDiags = 0;
+
+ numDocHeaders =
+ numLongHeaders =
+ numShortHeaders =
+ numText =
+ numHeadlines =
+ numCodes = 0;
+
+ buf = readUserInfoHeader(&tag1, &size, buf);
+ headerSize = buf - buffer;
+
+ while (buf < (buffer + size + headerSize)) {
+ data_tag tag = peekTag(buf);
+
+ switch (tag) {
+ case DT_SeedWordsUsed:
+ buf = readString(&seedWordsUsed, buf);
+ break;
+ case DT_DatabaseDiagnosticRecords:
+ if (diags == NULL) /* create a new diag list */
+ {
+ diags = S_MALLOC2(diagnosticRecord *);
+ } else { /* grow the diag list */
+ diags = S_REALLOC2(diagnosticRecord *, diags, numDiags);
+ }
+ buf = readDiag(&diag, buf);
+ diags[numDiags++] = diag; /* put it in the list */
+ diags[numDiags] = NULL;
+ break;
+ case DT_DocumentHeaderGroup:
+ if (docHeaders == NULL) /* create a new header list */
+ {
+ docHeaders = S_MALLOC2(WAISDocumentHeader *);
+ } else { /* grow the doc list */
+ docHeaders = S_REALLOC2(WAISDocumentHeader *, docHeaders, numDocHeaders);
+ }
+ buf = readWAISDocumentHeader((WAISDocumentHeader **) &header, buf);
+ cleanUpWaisSearchResponse(buf,
+ seedWordsUsed,
+ docHeaders,
+ shortHeaders,
+ longHeaders,
+ text,
+ headlines,
+ codes,
+ diags);
+ RETURN_ON_NULL(buf);
+ docHeaders[numDocHeaders++] =
+ (WAISDocumentHeader *) header; /* put it in the list */
+ docHeaders[numDocHeaders] = NULL;
+ break;
+ case DT_DocumentShortHeaderGroup:
+ if (shortHeaders == NULL) /* create a new header list */
+ {
+ shortHeaders = S_MALLOC2(WAISDocumentShortHeader *);
+ } else { /* grow the doc list */
+ shortHeaders = S_REALLOC2(WAISDocumentShortHeader *,
+ shortHeaders,
+ numShortHeaders);
+ }
+ buf = readWAISDocumentShortHeader((WAISDocumentShortHeader **) &header,
+ buf);
+ cleanUpWaisSearchResponse(buf,
+ seedWordsUsed,
+ docHeaders,
+ shortHeaders,
+ longHeaders,
+ text,
+ headlines,
+ codes,
+ diags);
+ RETURN_ON_NULL(buf);
+ shortHeaders[numShortHeaders++] =
+ (WAISDocumentShortHeader *) header; /* put it in the list */
+ shortHeaders[numShortHeaders] = NULL;
+ break;
+ case DT_DocumentLongHeaderGroup:
+ if (longHeaders == NULL) /* create a new header list */
+ {
+ longHeaders = S_MALLOC2(WAISDocumentLongHeader *);
+ } else { /* grow the doc list */
+ longHeaders = S_REALLOC2(WAISDocumentLongHeader *,
+ longHeaders,
+ numLongHeaders);
+ }
+ buf = readWAISDocumentLongHeader((WAISDocumentLongHeader **) &header,
+ buf);
+ cleanUpWaisSearchResponse(buf,
+ seedWordsUsed,
+ docHeaders,
+ shortHeaders,
+ longHeaders,
+ text,
+ headlines,
+ codes,
+ diags);
+ RETURN_ON_NULL(buf);
+ longHeaders[numLongHeaders++] =
+ (WAISDocumentLongHeader *) header; /* put it in the list */
+ longHeaders[numLongHeaders] = NULL;
+ break;
+ case DT_DocumentTextGroup:
+ if (text == NULL) /* create a new list */
+ {
+ text = S_MALLOC2(WAISDocumentText *);
+ } else { /* grow the list */
+ text = S_REALLOC2(WAISDocumentText *, text, numText);
+ }
+ buf = readWAISDocumentText((WAISDocumentText **) &header, buf);
+ cleanUpWaisSearchResponse(buf,
+ seedWordsUsed,
+ docHeaders,
+ shortHeaders,
+ longHeaders,
+ text,
+ headlines,
+ codes,
+ diags);
+ RETURN_ON_NULL(buf);
+ text[numText++] =
+ (WAISDocumentText *) header; /* put it in the list */
+ text[numText] = NULL;
+ break;
+ case DT_DocumentHeadlineGroup:
+ if (headlines == NULL) /* create a new list */
+ {
+ headlines = S_MALLOC2(WAISDocumentHeadlines *);
+ } else { /* grow the list */
+ headlines = S_REALLOC2(WAISDocumentHeadlines *, headlines, numHeadlines);
+ }
+ buf = readWAISDocumentHeadlines((WAISDocumentHeadlines **) &header,
+ buf);
+ cleanUpWaisSearchResponse(buf,
+ seedWordsUsed,
+ docHeaders,
+ shortHeaders,
+ longHeaders,
+ text,
+ headlines,
+ codes,
+ diags);
+ RETURN_ON_NULL(buf);
+ headlines[numHeadlines++] =
+ (WAISDocumentHeadlines *) header; /* put it in the list */
+ headlines[numHeadlines] = NULL;
+ break;
+ case DT_DocumentCodeGroup:
+ if (codes == NULL) /* create a new list */
+ {
+ codes = S_MALLOC2(WAISDocumentCodes *);
+ } else { /* grow the list */
+ codes = S_REALLOC2(WAISDocumentCodes *, codes, numCodes);
+ }
+ buf = readWAISDocumentCodes((WAISDocumentCodes **) &header, buf);
+ cleanUpWaisSearchResponse(buf,
+ seedWordsUsed,
+ docHeaders,
+ shortHeaders,
+ longHeaders,
+ text,
+ headlines,
+ codes,
+ diags);
+ RETURN_ON_NULL(buf);
+ codes[numCodes++] =
+ (WAISDocumentCodes *) header; /* put it in the list */
+ codes[numCodes] = NULL;
+ break;
+ default:
+ cleanUpWaisSearchResponse(buf,
+ seedWordsUsed,
+ docHeaders,
+ shortHeaders,
+ longHeaders,
+ text,
+ headlines,
+ codes,
+ diags);
+ REPORT_READ_ERROR(buf);
+ break;
+ }
+ }
+
+ *info = (void *) makeWAISSearchResponse(seedWordsUsed,
+ docHeaders,
+ shortHeaders,
+ longHeaders,
+ text,
+ headlines,
+ codes,
+ diags);
+
+ return (buf);
+}
+
+/*----------------------------------------------------------------------*/
+
+WAISDocumentText *makeWAISDocumentText(any *docID,
+ long versionNumber,
+ any *documentText)
+{
+ WAISDocumentText *docText = S_MALLOC(WAISDocumentText);
+
+ docText->DocumentID = docID;
+ docText->VersionNumber = versionNumber;
+ docText->DocumentText = documentText;
+
+ return (docText);
+}
+
+/*----------------------------------------------------------------------*/
+
+void freeWAISDocumentText(WAISDocumentText *docText)
+{
+ freeAny(docText->DocumentID);
+ freeAny(docText->DocumentText);
+ s_free(docText);
+}
+
+/*----------------------------------------------------------------------*/
+
+char *writeWAISDocumentText(WAISDocumentText *docText, char *buffer,
+ long *len)
+{
+ unsigned long header_len = userInfoTagSize(DT_DocumentTextGroup,
+ DefWAISDocTextSize);
+ char *buf = buffer + header_len;
+ unsigned long size;
+
+ RESERVE_SPACE_FOR_WAIS_HEADER(len);
+
+ buf = writeAny(docText->DocumentID, DT_DocumentID, buf, len);
+ buf = writeNum(docText->VersionNumber, DT_VersionNumber, buf, len);
+ buf = writeAny(docText->DocumentText, DT_DocumentText, buf, len);
+
+ /* now write the header and size */
+ size = buf - buffer;
+ buf = writeUserInfoHeader(DT_DocumentTextGroup, size, header_len, buffer, len);
+
+ return (buf);
+}
+
+/*----------------------------------------------------------------------*/
+
+char *readWAISDocumentText(WAISDocumentText **docText, char *buffer)
+{
+ char *buf = buffer;
+ unsigned long size;
+ unsigned long headerSize;
+ data_tag tag1;
+ any *docID, *documentText;
+ long versionNumber;
+
+ docID = documentText = NULL;
+ versionNumber = UNUSED;
+
+ buf = readUserInfoHeader(&tag1, &size, buf);
+ headerSize = buf - buffer;
+
+ while (buf < (buffer + size + headerSize)) {
+ data_tag tag = peekTag(buf);
+
+ switch (tag) {
+ case DT_DocumentID:
+ buf = readAny(&docID, buf);
+ break;
+ case DT_VersionNumber:
+ buf = readNum(&versionNumber, buf);
+ break;
+ case DT_DocumentText:
+ buf = readAny(&documentText, buf);
+ break;
+ default:
+ freeAny(docID);
+ freeAny(documentText);
+ REPORT_READ_ERROR(buf);
+ break;
+ }
+ }
+
+ *docText = makeWAISDocumentText(docID, versionNumber, documentText);
+ return (buf);
+}
+
+/*----------------------------------------------------------------------*/
+
+WAISDocumentHeadlines *makeWAISDocumentHeadlines(any *docID,
+ long versionNumber,
+ char *source,
+ char *date,
+ char *headline,
+ char *originCity)
+{
+ WAISDocumentHeadlines *docHeadline = S_MALLOC(WAISDocumentHeadlines);
+
+ docHeadline->DocumentID = docID;
+ docHeadline->VersionNumber = versionNumber;
+ docHeadline->Source = source;
+ docHeadline->Date = date;
+ docHeadline->Headline = headline;
+ docHeadline->OriginCity = originCity;
+
+ return (docHeadline);
+}
+
+/*----------------------------------------------------------------------*/
+
+void freeWAISDocumentHeadlines(WAISDocumentHeadlines *docHeadline)
+{
+ freeAny(docHeadline->DocumentID);
+ s_free(docHeadline->Source);
+ s_free(docHeadline->Date);
+ s_free(docHeadline->Headline);
+ s_free(docHeadline->OriginCity);
+ s_free(docHeadline);
+}
+
+/*----------------------------------------------------------------------*/
+
+char *writeWAISDocumentHeadlines(WAISDocumentHeadlines *docHeadline, char *buffer,
+ long *len)
+{
+ unsigned long header_len = userInfoTagSize(DT_DocumentHeadlineGroup,
+ DefWAISDocHeadlineSize);
+ char *buf = buffer + header_len;
+ unsigned long size;
+
+ RESERVE_SPACE_FOR_WAIS_HEADER(len);
+
+ buf = writeAny(docHeadline->DocumentID, DT_DocumentID, buf, len);
+ buf = writeNum(docHeadline->VersionNumber, DT_VersionNumber, buf, len);
+ buf = writeString(docHeadline->Source, DT_Source, buf, len);
+ buf = writeString(docHeadline->Date, DT_Date, buf, len);
+ buf = writeString(docHeadline->Headline, DT_Headline, buf, len);
+ buf = writeString(docHeadline->OriginCity, DT_OriginCity, buf, len);
+
+ /* now write the header and size */
+ size = buf - buffer;
+ buf = writeUserInfoHeader(DT_DocumentHeadlineGroup,
+ size,
+ header_len,
+ buffer,
+ len);
+
+ return (buf);
+}
+
+/*----------------------------------------------------------------------*/
+
+char *readWAISDocumentHeadlines(WAISDocumentHeadlines **docHeadline, char *buffer)
+{
+ char *buf = buffer;
+ unsigned long size;
+ unsigned long headerSize;
+ data_tag tag1;
+ any *docID;
+ long versionNumber;
+ char *source, *date, *headline, *originCity;
+
+ docID = NULL;
+ versionNumber = UNUSED;
+ source = date = headline = originCity = NULL;
+
+ buf = readUserInfoHeader(&tag1, &size, buf);
+ headerSize = buf - buffer;
+
+ while (buf < (buffer + size + headerSize)) {
+ data_tag tag = peekTag(buf);
+
+ switch (tag) {
+ case DT_DocumentID:
+ buf = readAny(&docID, buf);
+ break;
+ case DT_VersionNumber:
+ buf = readNum(&versionNumber, buf);
+ break;
+ case DT_Source:
+ buf = readString(&source, buf);
+ break;
+ case DT_Date:
+ buf = readString(&date, buf);
+ break;
+ case DT_Headline:
+ buf = readString(&headline, buf);
+ break;
+ case DT_OriginCity:
+ buf = readString(&originCity, buf);
+ break;
+ default:
+ freeAny(docID);
+ s_free(source);
+ s_free(date);
+ s_free(headline);
+ s_free(originCity);
+ REPORT_READ_ERROR(buf);
+ break;
+ }
+ }
+
+ *docHeadline = makeWAISDocumentHeadlines(docID, versionNumber, source, date,
+ headline, originCity);
+ return (buf);
+}
+
+/*----------------------------------------------------------------------*/
+
+WAISDocumentCodes *makeWAISDocumentCodes(any *docID,
+ long versionNumber,
+ char *stockCodes,
+ char *companyCodes,
+ char *industryCodes)
+{
+ WAISDocumentCodes *docCodes = S_MALLOC(WAISDocumentCodes);
+
+ docCodes->DocumentID = docID;
+ docCodes->VersionNumber = versionNumber;
+ docCodes->StockCodes = stockCodes;
+ docCodes->CompanyCodes = companyCodes;
+ docCodes->IndustryCodes = industryCodes;
+
+ return (docCodes);
+}
+
+/*----------------------------------------------------------------------*/
+
+void freeWAISDocumentCodes(WAISDocumentCodes *docCodes)
+{
+ freeAny(docCodes->DocumentID);
+ s_free(docCodes->StockCodes);
+ s_free(docCodes->CompanyCodes);
+ s_free(docCodes->IndustryCodes);
+ s_free(docCodes);
+}
+
+/*----------------------------------------------------------------------*/
+
+char *writeWAISDocumentCodes(WAISDocumentCodes *docCodes,
+ char *buffer,
+ long *len)
+{
+ unsigned long header_len = userInfoTagSize(DT_DocumentCodeGroup,
+ DefWAISDocCodeSize);
+ char *buf = buffer + header_len;
+ unsigned long size;
+
+ RESERVE_SPACE_FOR_WAIS_HEADER(len);
+
+ buf = writeAny(docCodes->DocumentID, DT_DocumentID, buf, len);
+ buf = writeNum(docCodes->VersionNumber, DT_VersionNumber, buf, len);
+ buf = writeString(docCodes->StockCodes, DT_StockCodes, buf, len);
+ buf = writeString(docCodes->CompanyCodes, DT_CompanyCodes, buf, len);
+ buf = writeString(docCodes->IndustryCodes, DT_IndustryCodes, buf, len);
+
+ /* now write the header and size */
+ size = buf - buffer;
+ buf = writeUserInfoHeader(DT_DocumentCodeGroup, size, header_len, buffer, len);
+
+ return (buf);
+}
+
+/*----------------------------------------------------------------------*/
+
+char *readWAISDocumentCodes(WAISDocumentCodes **docCodes,
+ char *buffer)
+{
+ char *buf = buffer;
+ unsigned long size;
+ unsigned long headerSize;
+ data_tag tag1;
+ any *docID;
+ long versionNumber;
+ char *stockCodes, *companyCodes, *industryCodes;
+
+ docID = NULL;
+ versionNumber = UNUSED;
+ stockCodes = companyCodes = industryCodes = NULL;
+
+ buf = readUserInfoHeader(&tag1, &size, buf);
+ headerSize = buf - buffer;
+
+ while (buf < (buffer + size + headerSize)) {
+ data_tag tag = peekTag(buf);
+
+ switch (tag) {
+ case DT_DocumentID:
+ buf = readAny(&docID, buf);
+ break;
+ case DT_VersionNumber:
+ buf = readNum(&versionNumber, buf);
+ break;
+ case DT_StockCodes:
+ buf = readString(&stockCodes, buf);
+ break;
+ case DT_CompanyCodes:
+ buf = readString(&companyCodes, buf);
+ break;
+ case DT_IndustryCodes:
+ buf = readString(&industryCodes, buf);
+ break;
+ default:
+ freeAny(docID);
+ s_free(stockCodes);
+ s_free(companyCodes);
+ s_free(industryCodes);
+ REPORT_READ_ERROR(buf);
+ break;
+ }
+ }
+
+ *docCodes = makeWAISDocumentCodes(docID, versionNumber, stockCodes,
+ companyCodes, industryCodes);
+ return (buf);
+}
+
+/*----------------------------------------------------------------------*/
+
+char *writePresentInfo(PresentAPDU * present GCC_UNUSED, char *buffer,
+ long *len GCC_UNUSED)
+{
+ /* The WAIS protocol doesn't use present info */
+ return (buffer);
+}
+
+/*----------------------------------------------------------------------*/
+
+char *readPresentInfo(void **info,
+ char *buffer)
+{
+ /* The WAIS protocol doesn't use present info */
+ *info = NULL;
+ return (buffer);
+}
+
+/*----------------------------------------------------------------------*/
+
+char *writePresentResponseInfo(PresentResponseAPDU * response GCC_UNUSED, char *buffer,
+ long *len GCC_UNUSED)
+{
+ /* The WAIS protocol doesn't use presentResponse info */
+ return (buffer);
+}
+
+/*----------------------------------------------------------------------*/
+
+char *readPresentResponseInfo(void **info,
+ char *buffer)
+{
+ /* The WAIS protocol doesn't use presentResponse info */
+ *info = NULL;
+ return (buffer);
+}
+
+/*----------------------------------------------------------------------*/
+
+/* support for type 1 queries */
+
+/* new use values (for the chunk types) */
+#define BYTE "wb"
+#define LINE "wl"
+#define PARAGRAPH "wp"
+#define DATA_TYPE "wt"
+
+/* WAIS supports the following semantics for type 1 queries:
+
+ 1. retrieve the header/codes from a document:
+
+ System_Control_Number = docID
+ Data Type = type (optional)
+ And
+
+ 2. retrieve a fragment of the text of a document:
+
+ System_Control_Number = docID
+ Data Type = type (optional)
+ And
+ Chunk >= start
+ And
+ Chunk < end
+ And
+
+ Information from multiple documents may be requested by using
+ groups of the above joined by:
+
+ OR
+
+ ( XXX does an OR come after every group but the first, or do they
+ all come at the end? )
+
+ ( XXX return type could be in the element set)
+*/
+
+static query_term **makeWAISQueryTerms(DocObj **docs)
+/* given a null terminated list of docObjs, construct the appropriate
+ query of the form given above
+ */
+{
+ query_term **terms = NULL;
+ long numTerms = 0;
+ DocObj *doc = NULL;
+ long i;
+
+ if (docs == NULL)
+ return ((query_term **) NULL);
+
+ terms = (query_term **) s_malloc((size_t) (sizeof(query_term *) * 1));
+
+ terms[numTerms] = NULL;
+
+ /* loop through the docs making terms for them all */
+ for (i = 0, doc = docs[i]; doc != NULL; doc = docs[++i]) {
+ any *type = NULL;
+
+ if (doc->Type != NULL)
+ type = stringToAny(doc->Type);
+
+ if (doc->ChunkCode == CT_document) /* a whole document */
+ {
+ terms = S_REALLOC2(query_term *, terms, numTerms + 2);
+
+ terms[numTerms++] = makeAttributeTerm(SYSTEM_CONTROL_NUMBER,
+ EQUAL, IGNORE, IGNORE,
+ IGNORE, IGNORE, doc->DocumentID);
+ if (type != NULL) {
+ terms[numTerms++] = makeAttributeTerm(DATA_TYPE, EQUAL,
+ IGNORE, IGNORE, IGNORE,
+ IGNORE, type);
+ terms[numTerms++] = makeOperatorTerm(AND);
+ }
+ terms[numTerms] = NULL;
+ } else { /* a document fragment */
+ char chunk_att[ATTRIBUTE_SIZE];
+ any *startChunk = NULL;
+ any *endChunk = NULL;
+
+ terms = S_REALLOC2(query_term *, terms, numTerms + 6);
+
+ switch (doc->ChunkCode) {
+ case CT_byte:
+ case CT_line:
+ {
+ char start[20], end[20];
+
+ (doc->ChunkCode == CT_byte) ?
+ StrNCpy(chunk_att, BYTE, ATTRIBUTE_SIZE) :
+ StrNCpy(chunk_att, LINE, ATTRIBUTE_SIZE);
+ sprintf(start, "%ld", doc->ChunkStart.Pos);
+ startChunk = stringToAny(start);
+ sprintf(end, "%ld", doc->ChunkEnd.Pos);
+ endChunk = stringToAny(end);
+ }
+ break;
+ case CT_paragraph:
+ StrNCpy(chunk_att, PARAGRAPH, ATTRIBUTE_SIZE);
+ startChunk = doc->ChunkStart.ID;
+ endChunk = doc->ChunkEnd.ID;
+ break;
+ default:
+ /* error */
+ break;
+ }
+
+ terms[numTerms++] = makeAttributeTerm(SYSTEM_CONTROL_NUMBER,
+ EQUAL, IGNORE, IGNORE,
+ IGNORE,
+ IGNORE, doc->DocumentID);
+ if (type != NULL) {
+ terms[numTerms++] = makeAttributeTerm(DATA_TYPE, EQUAL, IGNORE,
+ IGNORE, IGNORE, IGNORE,
+ type);
+ terms[numTerms++] = makeOperatorTerm(AND);
+ }
+ terms[numTerms++] = makeAttributeTerm(chunk_att,
+ GREATER_THAN_OR_EQUAL,
+ IGNORE, IGNORE, IGNORE,
+ IGNORE,
+ startChunk);
+ terms[numTerms++] = makeOperatorTerm(AND);
+ terms[numTerms++] = makeAttributeTerm(chunk_att, LESS_THAN,
+ IGNORE, IGNORE, IGNORE,
+ IGNORE,
+ endChunk);
+ terms[numTerms++] = makeOperatorTerm(AND);
+ terms[numTerms] = NULL;
+
+ if (doc->ChunkCode == CT_byte || doc->ChunkCode == CT_line) {
+ freeAny(startChunk);
+ freeAny(endChunk);
+ }
+ }
+
+ freeAny(type);
+
+ if (i != 0) /* multiple independent queries, need a disjunction */
+ {
+ terms = S_REALLOC2(query_term *, terms, numTerms);
+
+ terms[numTerms++] = makeOperatorTerm(OR);
+ terms[numTerms] = NULL;
+ }
+ }
+
+ return (terms);
+}
+
+/*----------------------------------------------------------------------*/
+
+static DocObj **makeWAISQueryDocs(query_term **terms)
+/* given a list of terms in the form given above, convert them to
+ DocObjs.
+ */
+{
+ query_term *docTerm = NULL;
+ query_term *fragmentTerm = NULL;
+ DocObj **docs = NULL;
+ DocObj *doc = NULL;
+ long docNum, termNum;
+
+ docNum = termNum = 0;
+
+ docs = S_MALLOC(DocObj *);
+
+ docs[docNum] = NULL;
+
+ /* translate the terms into DocObjs */
+ while (true) {
+ query_term *typeTerm = NULL;
+ char *type = NULL;
+ long startTermOffset;
+
+ docTerm = terms[termNum];
+
+ if (docTerm == NULL)
+ break; /* we're done converting */
+
+ typeTerm = terms[termNum + 1]; /* get the lead Term if it exists */
+
+ if (strcmp(typeTerm->Use, DATA_TYPE) == 0) /* we do have a type */
+ {
+ startTermOffset = 3;
+ type = anyToString(typeTerm->Term);
+ } else { /* no type */
+ startTermOffset = 1;
+ typeTerm = NULL;
+ type = NULL;
+ }
+
+ /* grow the doc list */
+ docs = S_REALLOC2(DocObj *, docs, docNum);
+
+ /* figure out what kind of docObj to build - and build it */
+ fragmentTerm = terms[termNum + startTermOffset];
+ if (fragmentTerm != NULL && fragmentTerm->TermType == TT_Attribute) { /* build a document fragment */
+ query_term *startTerm = fragmentTerm;
+ query_term *endTerm = terms[termNum + startTermOffset + 2];
+
+ if (strcmp(startTerm->Use, BYTE) == 0) { /* a byte chunk */
+ doc = makeDocObjUsingBytes(duplicateAny(docTerm->Term),
+ type,
+ anyToLong(startTerm->Term),
+ anyToLong(endTerm->Term));
+ log_write("byte");
+ } else if (strcmp(startTerm->Use, LINE) == 0) { /* a line chunk */
+ doc = makeDocObjUsingLines(duplicateAny(docTerm->Term),
+ type,
+ anyToLong(startTerm->Term),
+ anyToLong(endTerm->Term));
+ log_write("line");
+ } else {
+ log_write("chunk"); /* a paragraph chunk */
+ doc = makeDocObjUsingParagraphs(duplicateAny(docTerm->Term),
+ type,
+ duplicateAny(startTerm->Term),
+ duplicateAny(endTerm->Term));
+ }
+ termNum += (startTermOffset + 4); /* point to next term */
+ } else { /* build a full document */
+ doc = makeDocObjUsingWholeDocument(duplicateAny(docTerm->Term),
+ type);
+ log_write("whole doc");
+ termNum += startTermOffset; /* point to next term */
+ }
+
+ docs[docNum++] = doc; /* insert the new document */
+
+ docs[docNum] = NULL; /* keep the doc list terminated */
+
+ if (terms[termNum] != NULL)
+ termNum++; /* skip the OR operator it necessary */
+ else
+ break; /* we are done */
+ }
+
+ return (docs);
+}
+
+/*----------------------------------------------------------------------*/
+
+any *makeWAISTextQuery(DocObj **docs)
+/* given a list of DocObjs, return an any whose contents is the corresponding
+ type 1 query
+ */
+{
+ any *buf = NULL;
+ query_term **terms = NULL;
+
+ terms = makeWAISQueryTerms(docs);
+ buf = writeQuery(terms);
+
+ doList((void **) terms, freeTerm);
+ s_free(terms);
+
+ return (buf);
+}
+
+/*----------------------------------------------------------------------*/
+
+DocObj **readWAISTextQuery(any *buf)
+/* given an any whose contents are type 1 queries of the WAIS sort,
+ construct a list of the corresponding DocObjs
+ */
+{
+ query_term **terms = NULL;
+ DocObj **docs = NULL;
+
+ terms = readQuery(buf);
+ docs = makeWAISQueryDocs(terms);
+
+ doList((void **) terms, freeTerm);
+ s_free(terms);
+
+ return (docs);
+}
+
+/*----------------------------------------------------------------------*/
+/* Customized free WAIS object routines: */
+/* */
+/* This set of procedures is for applications to free a WAIS object */
+/* which was made with makeWAISFOO. */
+/* Each procedure frees only the memory that was allocated in its */
+/* associated makeWAISFOO routine, thus it's not necessary for the */
+/* caller to assign nulls to the pointer fields of the WAIS object. */
+/*----------------------------------------------------------------------*/
+
+void CSTFreeWAISInitResponse(WAISInitResponse *init)
+/* free an object made with makeWAISInitResponse */
+{
+ s_free(init);
+}
+
+/*----------------------------------------------------------------------*/
+
+void CSTFreeWAISSearch(WAISSearch *query)
+/* destroy an object made with makeWAISSearch() */
+{
+ s_free(query);
+}
+
+/*----------------------------------------------------------------------*/
+
+void CSTFreeDocObj(DocObj *doc)
+/* free a docObj */
+{
+ s_free(doc);
+}
+
+/*----------------------------------------------------------------------*/
+
+void CSTFreeWAISDocumentHeader(WAISDocumentHeader *header)
+{
+ s_free(header);
+}
+
+/*----------------------------------------------------------------------*/
+
+void CSTFreeWAISDocumentShortHeader(WAISDocumentShortHeader *header)
+{
+ s_free(header);
+}
+
+/*----------------------------------------------------------------------*/
+
+void CSTFreeWAISDocumentLongHeader(WAISDocumentLongHeader *header)
+{
+ s_free(header);
+}
+
+/*----------------------------------------------------------------------*/
+
+void CSTFreeWAISSearchResponse(WAISSearchResponse * response)
+{
+ s_free(response);
+}
+
+/*----------------------------------------------------------------------*/
+
+void CSTFreeWAISDocumentText(WAISDocumentText *docText)
+{
+ s_free(docText);
+}
+
+/*----------------------------------------------------------------------*/
+
+void CSTFreeWAISDocHeadlines(WAISDocumentHeadlines *docHeadline)
+{
+ s_free(docHeadline);
+}
+
+/*----------------------------------------------------------------------*/
+
+void CSTFreeWAISDocumentCodes(WAISDocumentCodes *docCodes)
+{
+ s_free(docCodes);
+}
+
+/*----------------------------------------------------------------------*/
+
+void CSTFreeWAISTextQuery(any *query)
+{
+ freeAny(query);
+}
+
+/*----------------------------------------------------------------------*/
+
+/*
+ * Routines originally from WMessage.c -- FM
+ *
+ *----------------------------------------------------------------------*/
+/* WIDE AREA INFORMATION SERVER SOFTWARE
+ * No guarantees or restrictions. See the readme file for the full standard
+ * disclaimer.
+ * 3.26.90
+ */
+
+/* This file is for reading and writing the wais packet header.
+ * Morris@think.com
+ */
+
+/* to do:
+ * add check sum
+ * what do you do when checksum is wrong?
+ */
+
+/*---------------------------------------------------------------------*/
+
+void readWAISPacketHeader(char *msgBuffer,
+ WAISMessage * header_struct)
+{
+ /* msgBuffer is a string containing at least HEADER_LENGTH bytes. */
+
+ memmove(header_struct->msg_len, msgBuffer, (size_t) 10);
+ header_struct->msg_type = char_downcase((unsigned long) msgBuffer[10]);
+ header_struct->hdr_vers = char_downcase((unsigned long) msgBuffer[11]);
+ memmove(header_struct->server, (void *) (msgBuffer + 12), (size_t) 10);
+ header_struct->compression = char_downcase((unsigned long) msgBuffer[22]);
+ header_struct->encoding = char_downcase((unsigned long) msgBuffer[23]);
+ header_struct->msg_checksum = char_downcase((unsigned long) msgBuffer[24]);
+}
+
+/*---------------------------------------------------------------------*/
+
+/* this modifies the header argument. See wais-message.h for the different
+ * options for the arguments.
+ */
+
+void writeWAISPacketHeader(char *header,
+ long dataLen,
+ long type,
+ char *server,
+ long compression,
+ long encoding,
+ long version)
+/* Puts together the new wais before-the-z39-packet header. */
+{
+ char lengthBuf[11];
+ char serverBuf[11];
+
+ long serverLen = strlen(server);
+
+ if (serverLen > 10)
+ serverLen = 10;
+
+ sprintf(lengthBuf, "%010ld", dataLen);
+ StrNCpy(header, lengthBuf, 10);
+
+ header[10] = type & 0xFF;
+ header[11] = version & 0xFF;
+
+ StrNCpy(serverBuf, server, serverLen);
+ StrNCpy((char *) (header + 12), serverBuf, serverLen);
+
+ header[22] = compression & 0xFF;
+ header[23] = encoding & 0xFF;
+ header[24] = '0'; /* checkSum(header + HEADER_LENGTH,dataLen); XXX the result must be ascii */
+}
+
+/*---------------------------------------------------------------------*/
diff --git a/WWW/Library/Implementation/HTVMS_WaisProt.h b/WWW/Library/Implementation/HTVMS_WaisProt.h
new file mode 100644
index 0000000..cea2a32
--- /dev/null
+++ b/WWW/Library/Implementation/HTVMS_WaisProt.h
@@ -0,0 +1,425 @@
+/* HTVMS_WAISProt.h
+ *
+ * Adaptation for Lynx by F.Macrides (macrides@sci.wfeb.edu)
+ *
+ * 31-May-1994 FM Initial version.
+ *
+ *----------------------------------------------------------------------*/
+
+/*
+ * Routines originally from WProt.h -- FM
+ *
+ *----------------------------------------------------------------------*/
+/* WIDE AREA INFORMATION SERVER SOFTWARE:
+ * No guarantees or restrictions. See the readme file for the full standard
+ * disclaimer.
+ *
+ * 3.26.90 Harry Morris, morris@think.com
+ * 3.30.90 Harry Morris
+ * - removed chunk code from WAISSearchAPDU,
+ * - added makeWAISQueryType1Query() and readWAISType1Query() which
+ * replace makeWAISQueryTerms() and makeWAISQueryDocs().
+ * 4.11.90 HWM - added definitions of wais element set names
+ * 4.14.90 HWM - changed symbol for relevance feedback query from QT_3 to
+ * QT_RelevanceFeedbackQuery added QT_TextRetrievalQuery as a
+ * synonym for QT_BooleanQuery
+ * - renamed makeWAISType1Query() to makeWAISTextQuery()
+ * renamed readWAISType1Query() to readWAISTextQuery()
+ * 5.29.90 TS - added CSTFreeWAISFoo functions
+ */
+
+#ifndef _H_WAIS_protocol_
+#define _H_WAIS_protocol_
+
+#ifndef HTUTILS_H
+#include <HTUtils.h>
+#endif
+
+#include <HTVMS_WaisUI.h>
+
+/*----------------------------------------------------------------------*/
+/* Data types / constants */
+
+/* date factor constants */
+#define DF_INDEPENDENT 1
+#define DF_LATER 2
+#define DF_EARLIER 3
+#define DF_SPECIFIED_RANGE 4
+
+/* chunk types */
+#define CT_document 0
+#define CT_byte 1
+#define CT_line 2
+#define CT_paragraph 3
+
+/* relevance feedback query */
+#define QT_RelevanceFeedbackQuery "3"
+#define QT_TextRetrievalQuery QT_BooleanQuery
+
+/* new data tags */
+#define DT_UserInformationLength (data_tag)99
+#define DT_ChunkCode (data_tag)100
+#define DT_ChunkIDLength (data_tag)101
+#define DT_ChunkMarker (data_tag)102
+#define DT_HighlightMarker (data_tag)103
+#define DT_DeHighlightMarker (data_tag)104
+#define DT_NewlineCharacters (data_tag)105
+#define DT_SeedWords (data_tag)106
+#define DT_DocumentIDChunk (data_tag)107
+#define DT_ChunkStartID (data_tag)108
+#define DT_ChunkEndID (data_tag)109
+#define DT_TextList (data_tag)110
+#define DT_DateFactor (data_tag)111
+#define DT_BeginDateRange (data_tag)112
+#define DT_EndDateRange (data_tag)113
+#define DT_MaxDocumentsRetrieved (data_tag)114
+#define DT_SeedWordsUsed (data_tag)115
+#define DT_DocumentID (data_tag)116
+#define DT_VersionNumber (data_tag)117
+#define DT_Score (data_tag)118
+#define DT_BestMatch (data_tag)119
+#define DT_DocumentLength (data_tag)120
+#define DT_Source (data_tag)121
+#define DT_Date (data_tag)122
+#define DT_Headline (data_tag)123
+#define DT_OriginCity (data_tag)124
+#define DT_PresentStartByte (data_tag)125
+#define DT_TextLength (data_tag)126
+#define DT_DocumentText (data_tag)127
+#define DT_StockCodes (data_tag)128
+#define DT_CompanyCodes (data_tag)129
+#define DT_IndustryCodes (data_tag)130
+
+/* added by harry */
+#define DT_DocumentHeaderGroup (data_tag)150
+#define DT_DocumentShortHeaderGroup (data_tag)151
+#define DT_DocumentLongHeaderGroup (data_tag)152
+#define DT_DocumentTextGroup (data_tag)153
+#define DT_DocumentHeadlineGroup (data_tag)154
+#define DT_DocumentCodeGroup (data_tag)155
+#define DT_Lines (data_tag)131
+#define DT_TYPE_BLOCK (data_tag)132
+#define DT_TYPE (data_tag)133
+
+/* wais element sets */
+#define ES_DocumentHeader "Document Header"
+#define ES_DocumentShortHeader "Document Short Header"
+#define ES_DocumentLongHeader "Document Long Header"
+#define ES_DocumentText "Document Text"
+#define ES_DocumentHeadline "Document Headline"
+#define ES_DocumentCodes "Document Codes"
+
+typedef struct DocObj { /* specifies a section of a document */
+ any *DocumentID;
+ char *Type;
+ long ChunkCode;
+ union {
+ long Pos;
+ any *ID;
+ } ChunkStart;
+ union {
+ long Pos;
+ any *ID;
+ } ChunkEnd;
+} DocObj;
+
+/*----------------------------------------------------------------------*/
+/* WAIS APDU extensions */
+
+typedef struct WAISInitResponse {
+ long ChunkCode;
+ long ChunkIDLength;
+ char *ChunkMarker;
+ char *HighlightMarker;
+ char *DeHighlightMarker;
+ char *NewlineCharacters;
+ /* XXX need to add UpdateFrequency and Update Time */
+} WAISInitResponse;
+
+typedef struct WAISSearch {
+ char *SeedWords;
+ DocObj **Docs;
+ char **TextList;
+ long DateFactor;
+ char *BeginDateRange;
+ char *EndDateRange;
+ long MaxDocumentsRetrieved;
+} WAISSearch;
+
+typedef struct WAISDocumentHeader {
+ any *DocumentID;
+ long VersionNumber;
+ long Score;
+ long BestMatch;
+ long DocumentLength;
+ long Lines;
+ char **Types;
+ char *Source;
+ char *Date;
+ char *Headline;
+ char *OriginCity;
+} WAISDocumentHeader;
+
+typedef struct WAISDocumentShortHeader {
+ any *DocumentID;
+ long VersionNumber;
+ long Score;
+ long BestMatch;
+ long DocumentLength;
+ long Lines;
+} WAISDocumentShortHeader;
+
+typedef struct WAISDocumentLongHeader {
+ any *DocumentID;
+ long VersionNumber;
+ long Score;
+ long BestMatch;
+ long DocumentLength;
+ long Lines;
+ char **Types;
+ char *Source;
+ char *Date;
+ char *Headline;
+ char *OriginCity;
+ char *StockCodes;
+ char *CompanyCodes;
+ char *IndustryCodes;
+} WAISDocumentLongHeader;
+
+typedef struct WAISDocumentText {
+ any *DocumentID;
+ long VersionNumber;
+ any *DocumentText;
+} WAISDocumentText;
+
+typedef struct WAISDocumentHeadlines {
+ any *DocumentID;
+ long VersionNumber;
+ char *Source;
+ char *Date;
+ char *Headline;
+ char *OriginCity;
+} WAISDocumentHeadlines;
+
+typedef struct WAISDocumentCodes {
+ any *DocumentID;
+ long VersionNumber;
+ char *StockCodes;
+ char *CompanyCodes;
+ char *IndustryCodes;
+} WAISDocumentCodes;
+
+typedef struct WAISSearchResponse {
+ char *SeedWordsUsed;
+ WAISDocumentHeader **DocHeaders;
+ WAISDocumentShortHeader **ShortHeaders;
+ WAISDocumentLongHeader **LongHeaders;
+ WAISDocumentText **Text;
+ WAISDocumentHeadlines **Headlines;
+ WAISDocumentCodes **Codes;
+ diagnosticRecord **Diagnostics;
+} WAISSearchResponse;
+
+/*----------------------------------------------------------------------*/
+/* Functions */
+
+char *generate_search_apdu(char *buff, /* buffer to hold the apdu */
+ long *buff_len, /* number of bytes written to the buffer */
+ char *seed_words, /* string of the seed words */
+ char *database_name,
+ DocObj **docobjs,
+ long maxDocsRetrieved);
+
+DocObj *makeDocObjUsingWholeDocument(any *aDocID, char *type);
+DocObj *makeDocObjUsingBytes(any *aDocID, char *type, long start, long end);
+DocObj *makeDocObjUsingLines(any *aDocID, char *type, long start, long end);
+DocObj *makeDocObjUsingParagraphs(any *aDocID, char *type, any *start, any *end);
+void freeDocObj(DocObj *doc);
+
+WAISInitResponse *makeWAISInitResponse(long chunkCode, long chunkIDLen,
+ char *chunkMarker, char *highlightMarker,
+ char *deHighlightMarker, char *newLineChars);
+void freeWAISInitResponse(WAISInitResponse *init);
+
+WAISSearch *makeWAISSearch(char *seedWords,
+ DocObj **docs,
+ char **textList,
+ long dateFactor,
+ char *beginDateRange,
+ char *endDateRange,
+ long maxDocsRetrieved);
+void freeWAISSearch(WAISSearch *query);
+
+WAISDocumentHeader *makeWAISDocumentHeader(any *aDocID,
+ long versionNumber,
+ long score,
+ long bestMatch,
+ long docLen,
+ long lines,
+ char **types,
+ char *source,
+ char *date,
+ char *headline,
+ char *originCity);
+void freeWAISDocumentHeader(WAISDocumentHeader *header);
+char *writeWAISDocumentHeader(WAISDocumentHeader *header, char *buffer, long *len);
+char *readWAISDocumentHeader(WAISDocumentHeader **header, char *buffer);
+
+WAISDocumentShortHeader *makeWAISDocumentShortHeader(any *aDocID,
+ long versionNumber,
+ long score,
+ long bestMatch,
+ long docLen,
+ long lines);
+void freeWAISDocumentShortHeader(WAISDocumentShortHeader *header);
+char *writeWAISDocumentShortHeader(WAISDocumentShortHeader *header,
+ char *buffer, long *len);
+char *readWAISDocumentShortHeader(WAISDocumentShortHeader **header, char *buffer);
+
+WAISDocumentLongHeader *makeWAISDocumentLongHeader(any *aDocID,
+ long versionNumber,
+ long score,
+ long bestMatch,
+ long docLen,
+ long lines,
+ char **types,
+ char *source,
+ char *date, char *headline,
+ char *originCity,
+ char *stockCodes,
+ char *companyCodes,
+ char *industryCodes);
+void freeWAISDocumentLongHeader(WAISDocumentLongHeader *header);
+char *writeWAISDocumentLongHeader(WAISDocumentLongHeader *header,
+ char *buffer,
+ long *len);
+char *readWAISDocumentLongHeader(WAISDocumentLongHeader **header, char *buffer);
+
+WAISSearchResponse *makeWAISSearchResponse(char *seedWordsUsed,
+ WAISDocumentHeader **docHeaders,
+ WAISDocumentShortHeader **shortHeaders,
+ WAISDocumentLongHeader **longHeaders,
+ WAISDocumentText **text, WAISDocumentHeadlines **headlines,
+ WAISDocumentCodes **codes,
+ diagnosticRecord ** diagnostics);
+void freeWAISSearchResponse(WAISSearchResponse * response);
+
+WAISDocumentText *makeWAISDocumentText(any *aDocID, long versionNumber,
+ any *documentText);
+void freeWAISDocumentText(WAISDocumentText *docText);
+char *writeWAISDocumentText(WAISDocumentText *docText, char *buffer, long *len);
+char *readWAISDocumentText(WAISDocumentText **docText, char *buffer);
+
+WAISDocumentHeadlines *makeWAISDocumentHeadlines(any *aDocID,
+ long versionNumber,
+ char *source,
+ char *date,
+ char *headline,
+ char *originCity);
+void freeWAISDocumentHeadlines(WAISDocumentHeadlines *docHeadline);
+char *writeWAISDocumentHeadlines(WAISDocumentHeadlines *docHeadline,
+ char *buffer,
+ long *len);
+char *readWAISDocumentHeadlines(WAISDocumentHeadlines **docHeadline, char *buffer);
+
+WAISDocumentCodes *makeWAISDocumentCodes(any *aDocID,
+ long versionNumber,
+ char *stockCodes,
+ char *companyCodes,
+ char *industryCodes);
+void freeWAISDocumentCodes(WAISDocumentCodes *docCodes);
+char *writeWAISDocumentCodes(WAISDocumentCodes *docCodes, char *buffer, long *len);
+char *readWAISDocumentCodes(WAISDocumentCodes **docCodes, char *buffer);
+
+any *makeWAISTextQuery(DocObj **docs);
+DocObj **readWAISTextQuery(any *terms);
+
+void CSTFreeWAISInitResponse(WAISInitResponse *init);
+void CSTFreeWAISSearch(WAISSearch *query);
+void CSTFreeDocObj(DocObj *doc);
+void CSTFreeWAISDocumentHeader(WAISDocumentHeader *header);
+void CSTFreeWAISDocumentShortHeader(WAISDocumentShortHeader *header);
+void CSTFreeWAISDocumentLongHeader(WAISDocumentLongHeader *header);
+void CSTFreeWAISSearchResponse(WAISSearchResponse * response);
+void CSTFreeWAISDocumentText(WAISDocumentText *docText);
+void CSTFreeWAISDocHeadlines(WAISDocumentHeadlines *docHeadline);
+void CSTFreeWAISDocumentCodes(WAISDocumentCodes *docCodes);
+void CSTFreeWAISTextQuery(any *query);
+
+/*----------------------------------------------------------------------*/
+
+#endif /* ndef _H_WAIS_protocol_ */
+
+/*
+ * Routines originally from WMessage.h -- FM
+ *
+ *----------------------------------------------------------------------*/
+/* WIDE AREA INFORMATION SERVER SOFTWARE
+ * No guarantees or restrictions. See the readme file for the full standard
+ * disclaimer.
+ * 3.26.90
+ */
+
+/* wais-message.h
+ *
+ * This is the header outside of WAIS Z39.50 messages. The header will be
+ * printable ascii, so as to be transportable. This header will precede each
+ * Z39.50 APDU, or zero-length message if it is an ACK or NACK. Be sure to
+ * change hdr_vers current value if you change the structure of the header.
+ *
+ * The characters in the header are case insensitive so that the systems from
+ * the past that only handle one case can at least read the header.
+ *
+ * 7.5.90 HWM - added constants
+ * 7/5/90 brewster added function prototypes and comments
+ * 11/30/90 HWM - went to version 2 (inits and typed retrieval)
+ */
+
+#ifndef WMESSAGE_H
+#define WMESSAGE_H
+
+#ifndef HTUTILS_H
+#include <HTUtils.h>
+#endif
+
+#include <HTVMS_WaisUI.h>
+
+typedef struct wais_header {
+ char msg_len[10]; /* length in bytes of following message */
+ char msg_type; /* type of message: 'z'=Z39.50 APDU,
+ 'a'=ACK, 'n'=NACK */
+ char hdr_vers; /* version of this header, currently = '2' */
+ char server[10]; /* name or address of server */
+ char compression; /* <sp>=no compression, 'u'=unix compress */
+ char encoding; /* <sp>=no encoding, 'h'=hexize,
+ 'u'=uuencode */
+ char msg_checksum; /* XOR of every byte of message */
+} WAISMessage;
+
+#define HEADER_LENGTH 25 /* number of bytes needed to write a
+ wais-header (not sizeof(wais_header)) */
+
+#define HEADER_VERSION (long)'2'
+
+/* message type */
+#define Z3950 'z'
+#define ACK 'a'
+#define NAK 'n'
+
+/* compression */
+#define NO_COMPRESSION ' '
+#define UNIX_COMPRESSION 'u'
+
+/* encoding */
+#define NO_ENCODING ' '
+#define HEX_ENCODING 'h' /* Swartz 4/3 encoding */
+#define IBM_HEXCODING 'i' /* same as h but uses characters acceptable for IBM mainframes */
+#define UUENCODE 'u'
+
+void readWAISPacketHeader(char *msgBuffer, WAISMessage * header_struct);
+long getWAISPacketLength(WAISMessage * header);
+void writeWAISPacketHeader(char *header, long dataLen, long type,
+ char *server, long compression,
+ long encoding, long version);
+
+#endif /* ndef WMESSAGE_H */
diff --git a/WWW/Library/Implementation/HTVMS_WaisUI.c b/WWW/Library/Implementation/HTVMS_WaisUI.c
new file mode 100644
index 0000000..716bbbb
--- /dev/null
+++ b/WWW/Library/Implementation/HTVMS_WaisUI.c
@@ -0,0 +1,2279 @@
+/*
+ * $LynxId: HTVMS_WaisUI.c,v 1.21 2020/01/21 22:00:50 tom Exp $
+ * HTVMS_WAISUI.c
+ *
+ * Adaptation for Lynx by F.Macrides (macrides@sci.wfeb.edu)
+ *
+ * 30-May-1994 FM Initial version.
+ *
+ *----------------------------------------------------------------------*/
+
+/*
+ * Routines originally from UI.c -- FM
+ *
+ *----------------------------------------------------------------------*/
+/* WIDE AREA INFORMATION SERVER SOFTWARE:
+ * No guarantees or restrictions. See the readme file for the full standard
+ * disclaimer.
+ *
+ * Brewster@think.com
+ */
+
+/*
+ * this is a simple ui toolkit for building other ui's on top.
+ * -brewster
+ *
+ * top level functions:
+ * generate_search_apdu
+ * generate_retrieval_apdu
+ * interpret_message
+ *
+ */
+
+/* to do:
+ * generate multiple queries for long documents.
+ * this will crash if the file being retrieved is larger than 100k.
+ * do log_write()
+ *
+ */
+
+#include <HTUtils.h>
+
+#ifdef VMS
+#include <HTVMS_WaisUI.h>
+#include <HTVMS_WaisProt.h>
+#include <HTTCP.h>
+
+#undef MAXINT /* we don't need it here, and www_tcp.h may conflict */
+#include <math.h>
+
+#include <LYexit.h>
+#include <LYLeaks.h>
+
+void log_write(char *s GCC_UNUSED)
+{
+ return;
+}
+
+/*----------------------------------------------------------------------*/
+
+/* returns a pointer in the buffer of the first free byte.
+ if it overflows, then NULL is returned
+ */
+char *generate_search_apdu(char *buff, /* buffer to hold the apdu */
+ long *buff_len, /* length of the buffer changed to reflect new data written */
+ char *seed_words, /* string of the seed words */
+ char *database_name,
+ DocObj **docobjs,
+ long maxDocsRetrieved)
+{
+ /* local variables */
+
+ SearchAPDU *search3;
+ char *end_ptr;
+ static char *database_names[2] =
+ {"", 0};
+ any refID;
+ WAISSearch *query;
+
+ refID.size = 1;
+ refID.bytes = "3";
+
+ database_names[0] = database_name;
+ query = makeWAISSearch(seed_words,
+ docobjs, /* DocObjsPtr */
+ 0,
+ 1, /* DateFactor */
+ 0, /* BeginDateRange */
+ 0, /* EndDateRange */
+ maxDocsRetrieved
+ );
+
+ search3 = makeSearchAPDU(30,
+ 5000, /* should be large */
+ 30,
+ 1, /* replace indicator */
+ "", /* result set name */
+ database_names, /* database name */
+ QT_RelevanceFeedbackQuery, /* query_type */
+ 0, /* element name */
+ NULL, /* reference ID */
+ query);
+
+ end_ptr = writeSearchAPDU(search3, buff, buff_len);
+
+ CSTFreeWAISSearch(query);
+ freeSearchAPDU(search3);
+ return (end_ptr);
+}
+
+/*----------------------------------------------------------------------*/
+
+/* returns a pointer into the buffer of the next free byte.
+ if it overflowed, then NULL is returned
+ */
+
+char *generate_retrieval_apdu(char *buff,
+ long *buff_len, /* length of the buffer changed to reflect new data written */
+ any *docID,
+ long chunk_type,
+ long start,
+ long end,
+ char *type,
+ char *database_name)
+{
+ SearchAPDU *search;
+ char *end_ptr;
+
+ static char *database_names[2];
+ static char *element_names[3];
+ any refID;
+
+ DocObj *DocObjs[2];
+ any *query; /* changed from char* by brewster */
+
+ if (NULL == type)
+ type = s_strdup("TEXT");
+
+ database_names[0] = database_name;
+ database_names[1] = NULL;
+
+ element_names[0] = " ";
+ element_names[1] = ES_DocumentText;
+ element_names[2] = NULL;
+
+ refID.size = 1;
+ refID.bytes = "3";
+
+ switch (chunk_type) {
+ case CT_line:
+ DocObjs[0] = makeDocObjUsingLines(docID, type, start, end);
+ break;
+ case CT_byte:
+ DocObjs[0] = makeDocObjUsingBytes(docID, type, start, end);
+ break;
+ }
+ DocObjs[1] = NULL;
+
+ query = makeWAISTextQuery(DocObjs);
+ search = makeSearchAPDU(10, 16, 15,
+ 1, /* replace indicator */
+ "FOO", /* result set name */
+ database_names, /* database name */
+ QT_TextRetrievalQuery, /* query_type */
+ element_names, /* element name */
+ &refID, /* reference ID */
+ query);
+ end_ptr = writeSearchAPDU(search, buff, buff_len);
+ CSTFreeWAISTextQuery(query);
+ freeSearchAPDU(search);
+ return (end_ptr);
+}
+
+/*----------------------------------------------------------------------*/
+
+/* this is a safe version of unix 'read' it does all the checking
+ * and looping necessary
+ * to those trying to modify the transport code to use non-UNIX streams:
+ * This is the function to modify!
+ */
+static long read_from_stream(int d, char *buf, long nbytes)
+{
+ long didRead;
+ long toRead = nbytes;
+ long totalRead = 0; /* paranoia */
+
+ while (toRead > 0) {
+ didRead = NETREAD(d, buf, (int) toRead);
+ if (didRead == HT_INTERRUPTED)
+ return (HT_INTERRUPTED);
+ if (didRead == -1) /* error */
+ return (-1);
+ if (didRead == 0) /* eof */
+ return (-2); /* maybe this should return 0? */
+ toRead -= didRead;
+ buf += didRead;
+ totalRead += didRead;
+ }
+ if (totalRead != nbytes) /* we overread for some reason */
+ return (-totalRead); /* bad news */
+ return (totalRead);
+}
+
+/*----------------------------------------------------------------------*/
+
+/* returns the length of the response, 0 if an error */
+
+static long transport_message(long connection,
+ char *request_message,
+ long request_length,
+ char *response_message,
+ long response_buffer_length)
+{
+ WAISMessage header;
+ long response_length;
+ int rv;
+
+ /* Write out message. Read back header. Figure out response length. */
+
+ if (request_length + HEADER_LENGTH !=
+ NETWRITE(connection, request_message,
+ (int) (request_length + HEADER_LENGTH)))
+ return 0;
+
+ /* read for the first '0' */
+
+ while (1) {
+ rv = read_from_stream(connection, response_message, 1);
+ if (rv == HT_INTERRUPTED)
+ return HT_INTERRUPTED;
+ if (rv < 0)
+ return 0;
+ if ('0' == response_message[0])
+ break;
+ }
+
+ rv = read_from_stream(connection, response_message + 1, HEADER_LENGTH - 1);
+ if (rv == HT_INTERRUPTED)
+ return HT_INTERRUPTED;
+ if (rv < 0)
+ return 0;
+
+ readWAISPacketHeader(response_message, &header);
+ {
+ char length_array[11];
+
+ LYStrNCpy(length_array, header.msg_len, 10);
+ response_length = atol(length_array);
+ /*
+ if(verbose){
+ printf("WAIS header: '%s' length_array: '%s'\n",
+ response_message, length_array);
+ }
+ */
+ if (response_length > response_buffer_length) {
+ /* we got a message that is too long, therefore empty the message out,
+ and return 0 */
+ long i;
+
+ for (i = 0; i < response_length; i++) {
+ rv = read_from_stream(connection,
+ response_message + HEADER_LENGTH,
+ 1);
+ if (rv == HT_INTERRUPTED)
+ return HT_INTERRUPTED;
+ if (rv < 0)
+ return 0;
+ }
+ return (0);
+ }
+ }
+ rv = read_from_stream(connection,
+ response_message + HEADER_LENGTH,
+ response_length);
+ if (rv == HT_INTERRUPTED)
+ return HT_INTERRUPTED;
+ if (rv < 0)
+ return 0;
+ return (response_length);
+}
+
+/*----------------------------------------------------------------------*/
+
+/* returns the number of bytes written. 0 if an error */
+long interpret_message(char *request_message,
+ long request_length, /* length of the buffer */
+ char *response_message,
+ long response_buffer_length,
+ long connection,
+ boolean verbose GCC_UNUSED)
+{
+ long response_length;
+
+ /* ?
+ if(verbose){
+ printf ("sending");
+ if(hostname_internal && strlen(hostname_internal) > 0)
+ printf(" to host %s", hostname_internal);
+ if(service_name && strlen(service_name) > 0)
+ printf(" for service %s", service_name);
+ printf("\n");
+ twais_dsply_rsp_apdu(request_message + HEADER_LENGTH,
+ request_length);
+ }
+
+ */
+
+ writeWAISPacketHeader(request_message,
+ request_length,
+ (long) 'z', /* Z39.50 */
+ "wais ", /* server name */
+ (long) NO_COMPRESSION, /* no compression */
+ (long) NO_ENCODING, (long) HEADER_VERSION);
+ if (connection != 0) {
+ response_length = transport_message(connection, request_message,
+ request_length,
+ response_message,
+ response_buffer_length);
+ if (response_length == HT_INTERRUPTED)
+ return (HT_INTERRUPTED);
+ } else
+ return (0);
+
+ return (response_length);
+}
+
+/*----------------------------------------------------------------------*/
+
+/* modifies the string to exclude all seeker codes. sets length to
+ the new length. */
+static char *delete_seeker_codes(char *string, long *length)
+{
+ long original_count; /* index into the original string */
+ long new_count = 0; /* index into the collapsed string */
+
+ for (original_count = 0; original_count < *length; original_count++) {
+ if (27 == string[original_count]) {
+ /* then we have an escape code */
+ /* if the next letter is '(' or ')', then ignore two letters */
+ if ('(' == string[original_count + 1] ||
+ ')' == string[original_count + 1])
+ original_count += 1; /* it is a term marker */
+ else
+ original_count += 4; /* it is a paragraph marker */
+ } else
+ string[new_count++] = string[original_count];
+ }
+ *length = new_count;
+ return (string);
+}
+
+/*----------------------------------------------------------------------*/
+
+#if defined(VMS) && defined(__GNUC__) /* 10-AUG-1995 [pr] */
+/*
+ Workaround for an obscure bug in gcc's 2.6.[123] and 2.7.0 vax/vms port;
+ sometimes global variables will end up not being defined properly,
+ causing first gas to assume they're routines, then the linker to complain
+ about unresolved symbols, and finally the program to reference the wrong
+ objects (provoking ACCVIO). It's triggered by the specific ordering of
+ variable usage in the source code, hence rarely appears. This bug is
+ fixed in gcc 2.7.1, and was not present in 2.6.0 and earlier.
+
+ Make a reference to VAXCRTL's _ctype_[], and also one to this dummy
+ variable itself to prevent any "defined but not used" warning.
+ */
+static __const void *__const ctype_dummy[] =
+{&_ctype_, &ctype_dummy};
+#endif /* VMS && __GNUC__ */
+
+/* returns a pointer to a string with good stuff */
+char *trim_junk(char *headline)
+{
+ long length = strlen(headline) + 1; /* include the trailing null */
+ size_t i;
+
+ headline = delete_seeker_codes(headline, &length);
+ /* delete leading spaces */
+ for (i = 0; i < strlen(headline); i++) {
+ if (isprint(headline[i])) {
+ break;
+ }
+ }
+ headline = headline + i;
+ /* delete trailing stuff */
+ for (i = strlen(headline) - 1; i > 0; i--) {
+ if (isprint(headline[i])) {
+ break;
+ }
+ headline[i] = '\0';
+ }
+ return (headline);
+}
+
+/*----------------------------------------------------------------------*/
+
+/*
+ * Routines originally from ZProt.c -- FM
+ *
+ *----------------------------------------------------------------------*/
+/* WIDE AREA INFORMATION SERVER SOFTWARE:`
+ * No guarantees or restrictions. See the readme file for the full standard
+ * disclaimer.
+ *
+ * 3.26.90 Harry Morris, morris@think.com
+ * 3.30.90 Harry Morris - Changed any->bits to any->bytes
+ * 4.11.90 HWM - generalized conditional includes (see c-dialect.h)
+ */
+
+#define RESERVE_SPACE_FOR_HEADER(spaceLeft) \
+ *spaceLeft -= HEADER_LEN;
+
+#define RELEASE_HEADER_SPACE(spaceLeft) \
+ if (*spaceLeft > 0) \
+ *spaceLeft += HEADER_LEN;
+
+/*----------------------------------------------------------------------*/
+
+InitResponseAPDU *makeInitResponseAPDU(boolean result,
+ boolean search,
+ boolean present,
+ boolean deleteIt,
+ boolean accessControl,
+ boolean resourceControl,
+ long prefSize,
+ long maxMsgSize,
+ char *auth,
+ char *id,
+ char *name,
+ char *version,
+ any *refID,
+ void *userInfo)
+/* build an initResponse APDU with user specified information */
+{
+ InitResponseAPDU *init = (InitResponseAPDU *) s_malloc((size_t) sizeof(InitResponseAPDU));
+
+ init->PDUType = initResponseAPDU;
+ init->Result = result;
+ init->willSearch = search;
+ init->willPresent = present;
+ init->willDelete = deleteIt;
+ init->supportAccessControl = accessControl;
+ init->supportResourceControl = resourceControl;
+ init->PreferredMessageSize = prefSize;
+ init->MaximumRecordSize = maxMsgSize;
+ init->IDAuthentication = s_strdup(auth);
+ init->ImplementationID = s_strdup(id);
+ init->ImplementationName = s_strdup(name);
+ init->ImplementationVersion = s_strdup(version);
+ init->ReferenceID = duplicateAny(refID);
+ init->UserInformationField = userInfo; /* not copied! */
+
+ return (init);
+}
+
+/*----------------------------------------------------------------------*/
+
+void freeInitResponseAPDU(InitResponseAPDU *init)
+/* free an initAPDU */
+{
+ s_free(init->IDAuthentication);
+ s_free(init->ImplementationID);
+ s_free(init->ImplementationName);
+ s_free(init->ImplementationVersion);
+ freeAny(init->ReferenceID);
+ s_free(init);
+}
+
+/*----------------------------------------------------------------------*/
+
+char *writeInitResponseAPDU(InitResponseAPDU *init, char *buffer, long *len)
+/* write the initResponse to a buffer, adding system information */
+{
+ char *buf = buffer + HEADER_LEN; /* leave room for the header-length-indicator */
+ long size;
+ bit_map *optionsBM = NULL;
+
+ RESERVE_SPACE_FOR_HEADER(len);
+
+ buf = writePDUType(init->PDUType, buf, len);
+ buf = writeBoolean(init->Result, buf, len);
+ buf = writeProtocolVersion(buf, len);
+
+ optionsBM = makeBitMap((unsigned long) 5, init->willSearch, init->willPresent,
+ init->willDelete, init->supportAccessControl,
+ init->supportResourceControl);
+ buf = writeBitMap(optionsBM, DT_Options, buf, len);
+ freeBitMap(optionsBM);
+
+ buf = writeNum(init->PreferredMessageSize,
+ DT_PreferredMessageSize,
+ buf,
+ len);
+ buf = writeNum(init->MaximumRecordSize,
+ DT_MaximumRecordSize,
+ buf,
+ len);
+ buf = writeString(init->IDAuthentication,
+ DT_IDAuthentication,
+ buf,
+ len);
+ buf = writeString(init->ImplementationID,
+ DT_ImplementationID,
+ buf,
+ len);
+ buf = writeString(init->ImplementationName,
+ DT_ImplementationName,
+ buf,
+ len);
+ buf = writeString(init->ImplementationVersion,
+ DT_ImplementationVersion,
+ buf,
+ len);
+ buf = writeAny(init->ReferenceID,
+ DT_ReferenceID,
+ buf,
+ len);
+
+ /* go back and write the header-length-indicator */
+ RELEASE_HEADER_SPACE(len);
+ size = buf - buffer - HEADER_LEN;
+ writeBinaryInteger(size, HEADER_LEN, buffer, len);
+
+ if (init->UserInformationField != NULL)
+ buf = writeInitResponseInfo(init, buf, len);
+
+ return (buf);
+}
+
+/*----------------------------------------------------------------------*/
+
+char *readInitResponseAPDU(InitResponseAPDU **init, char *buffer)
+{
+ char *buf = buffer;
+ boolean search, present, delete, accessControl, resourceControl;
+ long prefSize, maxMsgSize;
+ char *auth, *id, *name, *version;
+ long size;
+ pdu_type pduType;
+ bit_map *versionBM = NULL;
+ bit_map *optionsBM = NULL;
+ boolean result;
+ any *refID = NULL;
+ void *userInfo = NULL;
+
+ auth = id = name = version = NULL;
+ refID = NULL;
+
+ /* read required part */
+ buf = readBinaryInteger(&size, HEADER_LEN, buf);
+ buf = readPDUType(&pduType, buf);
+ buf = readBoolean(&result, buf);
+ buf = readBitMap(&versionBM, buf);
+ buf = readBitMap(&optionsBM, buf);
+ buf = readNum(&prefSize, buf);
+ buf = readNum(&maxMsgSize, buf);
+
+ /* decode optionsBM */
+ search = bitAtPos(0, optionsBM);
+ present = bitAtPos(1, optionsBM);
+ delete = bitAtPos(2, optionsBM);
+ accessControl = bitAtPos(3, optionsBM);
+ resourceControl = bitAtPos(4, optionsBM);
+
+ /* read optional part */
+ while (buf < (buffer + size + HEADER_LEN)) {
+ data_tag tag = peekTag(buf);
+
+ switch (tag) {
+ case DT_IDAuthentication:
+ buf = readString(&auth, buf);
+ break;
+ case DT_ImplementationID:
+ buf = readString(&id, buf);
+ break;
+ case DT_ImplementationName:
+ buf = readString(&name, buf);
+ break;
+ case DT_ImplementationVersion:
+ buf = readString(&version, buf);
+ break;
+ case DT_ReferenceID:
+ buf = readAny(&refID, buf);
+ break;
+ default:
+ freeBitMap(versionBM);
+ freeBitMap(optionsBM);
+ s_free(auth);
+ s_free(id);
+ s_free(name);
+ s_free(version);
+ freeAny(refID);
+ REPORT_READ_ERROR(buf);
+ break;
+ }
+ }
+
+ buf = readInitResponseInfo(&userInfo, buf);
+ if (buf == NULL) {
+ freeBitMap(versionBM);
+ freeBitMap(optionsBM);
+ s_free(auth);
+ s_free(id);
+ s_free(name);
+ s_free(version);
+ freeAny(refID);
+ }
+ RETURN_ON_NULL(buf);
+
+ /* construct the basic init object */
+ *init = makeInitResponseAPDU(result,
+ search,
+ present,
+ delete,
+ accessControl,
+ resourceControl,
+ prefSize,
+ maxMsgSize,
+ auth,
+ id,
+ name,
+ version,
+ refID,
+ userInfo);
+
+ freeBitMap(versionBM);
+ freeBitMap(optionsBM);
+ s_free(auth);
+ s_free(id);
+ s_free(name);
+ s_free(version);
+ freeAny(refID);
+
+ return (buf);
+}
+
+/*----------------------------------------------------------------------*/
+
+InitResponseAPDU *replyToInitAPDU(InitAPDU * init, boolean result, void *userInfo)
+/* respond to an init message in the default way - echoing back
+ the init info
+ */
+{
+ InitResponseAPDU *initResp;
+
+ initResp = makeInitResponseAPDU(result,
+ init->willSearch,
+ init->willPresent,
+ init->willDelete,
+ init->supportAccessControl,
+ init->supportResourceControl,
+ init->PreferredMessageSize,
+ init->MaximumRecordSize,
+ init->IDAuthentication,
+ defaultImplementationID(),
+ defaultImplementationName(),
+ defaultImplementationVersion(),
+ init->ReferenceID,
+ userInfo);
+ return (initResp);
+}
+
+/*----------------------------------------------------------------------*/
+
+SearchAPDU *makeSearchAPDU(long small,
+ long large,
+ long medium,
+ boolean replace,
+ char *name,
+ char **databases,
+ char *type,
+ char **elements,
+ any *refID,
+ void *queryInfo)
+{
+ char *ptr = NULL;
+ long i;
+ SearchAPDU *query = (SearchAPDU *) s_malloc((size_t) sizeof(SearchAPDU));
+
+ query->PDUType = searchAPDU;
+ query->SmallSetUpperBound = small;
+ query->LargeSetLowerBound = large;
+ query->MediumSetPresentNumber = medium;
+ query->ReplaceIndicator = replace;
+ query->ResultSetName = s_strdup(name);
+ query->DatabaseNames = NULL;
+ if (databases != NULL) {
+ for (i = 0, ptr = databases[i]; ptr != NULL; ptr = databases[++i]) {
+ if (query->DatabaseNames == NULL)
+ query->DatabaseNames = (char **) s_malloc((size_t) (sizeof(char
+ *)
+ * 2));
+
+ else
+ query->DatabaseNames = (char **) s_realloc((char *) query->DatabaseNames,
+ (size_t) (sizeof(char
+ *) *
+ (i + 2)));
+
+ query->DatabaseNames[i] = s_strdup(ptr);
+ query->DatabaseNames[i + 1] = NULL;
+ }
+ }
+ query->QueryType = s_strdup(type);
+ query->ElementSetNames = NULL;
+ if (elements != NULL) {
+ for (i = 0, ptr = elements[i]; ptr != NULL; ptr = elements[++i]) {
+ if (query->ElementSetNames == NULL)
+ query->ElementSetNames =
+ (char **) s_malloc((size_t) (sizeof(char *) * 2));
+
+ else
+ query->ElementSetNames = (char **) s_realloc((char *) query->ElementSetNames,
+ (size_t) (sizeof(char
+ *) *
+ (i + 2)));
+
+ query->ElementSetNames[i] = s_strdup(ptr);
+ query->ElementSetNames[i + 1] = NULL;
+ }
+ }
+ query->ReferenceID = duplicateAny(refID);
+ query->Query = queryInfo; /* not copied! */
+ return (query);
+}
+
+/*----------------------------------------------------------------------*/
+
+void freeSearchAPDU(SearchAPDU *query)
+{
+ s_free(query->ResultSetName);
+ s_free(query->QueryType);
+ doList((void **) query->DatabaseNames, fs_free); /* can't use the macro here ! */
+ s_free(query->DatabaseNames);
+ doList((void **) query->ElementSetNames, fs_free); /* can't use the macro here ! */
+ s_free(query->ElementSetNames);
+ freeAny(query->ReferenceID);
+ s_free(query);
+}
+
+/*----------------------------------------------------------------------*/
+
+#define DB_DELIMITER "\037" /* hex 1F occurs between each database name */
+#define ES_DELIMITER_1 "\037" /* separates database name from element name */
+#define ES_DELIMITER_2 "\036" /* hex 1E separates <db,es> groups from one another */
+
+char *writeSearchAPDU(SearchAPDU *query, char *buffer, long *len)
+{
+ char *buf = buffer + HEADER_LEN; /* leave room for the header-length-indicator */
+ long size, i;
+ char *ptr = NULL;
+ char *scratch = NULL;
+
+ RESERVE_SPACE_FOR_HEADER(len);
+
+ buf = writePDUType(query->PDUType, buf, len);
+ buf = writeBinaryInteger(query->SmallSetUpperBound, (size_t) 3, buf, len);
+ buf = writeBinaryInteger(query->LargeSetLowerBound, (size_t) 3, buf, len);
+ buf = writeBinaryInteger(query->MediumSetPresentNumber, (size_t) 3, buf, len);
+ buf = writeBoolean(query->ReplaceIndicator, buf, len);
+ buf = writeString(query->ResultSetName, DT_ResultSetName, buf, len);
+ /* write database names */
+ if (query->DatabaseNames != NULL) {
+ for (i = 0, scratch = NULL, ptr = query->DatabaseNames[i]; ptr != NULL;
+ ptr = query->DatabaseNames[++i]) {
+ if (scratch == NULL)
+ scratch = s_strdup(ptr);
+ else {
+ size_t newScratchSize = (size_t) (strlen(scratch) +
+ strlen(ptr) + 2);
+
+ scratch = (char *) s_realloc(scratch, newScratchSize);
+ s_strncat(scratch, DB_DELIMITER, 2, newScratchSize);
+ s_strncat(scratch, ptr, strlen(ptr) + 1, newScratchSize);
+ }
+ }
+ buf = writeString(scratch, DT_DatabaseNames, buf, len);
+ s_free(scratch);
+ }
+ buf = writeString(query->QueryType, DT_QueryType, buf, len);
+ /* write element set names */
+ if (query->ElementSetNames != NULL) {
+ for (i = 0, scratch = NULL, ptr = query->ElementSetNames[i];
+ ptr != NULL;
+ ptr = query->ElementSetNames[++i]) {
+ if (scratch == NULL) {
+ if (query->ElementSetNames[i + 1] == NULL) /* there is a single element set name */
+ {
+ scratch = (char *) s_malloc((size_t) strlen(ptr) + 2);
+ StrNCpy(scratch, ES_DELIMITER_1, 2);
+ s_strncat(scratch, ptr, strlen(ptr) + 1, strlen(ptr) + 2);
+ } else { /* this is the first of a series of element set names */
+ size_t newScratchSize = (size_t) (strlen(ptr) +
+ strlen(query->ElementSetNames[i
+ + 1])
+ + 2);
+
+ scratch = s_strdup(ptr); /* the database name */
+ ptr = query->ElementSetNames[++i]; /* the element set name */
+ scratch = (char *) s_realloc(scratch, newScratchSize);
+ s_strncat(scratch, ES_DELIMITER_1, 2, newScratchSize);
+ s_strncat(scratch, ptr, strlen(ptr) + 1, newScratchSize);
+ }
+ } else {
+ char *esPtr = query->ElementSetNames[++i]; /* the element set name */
+ size_t newScratchSize = (size_t) (strlen(scratch) +
+ strlen(ptr) +
+ strlen(esPtr) +
+ 3);
+
+ scratch = (char *) s_realloc(scratch, newScratchSize);
+ s_strncat(scratch, ES_DELIMITER_2, 2, newScratchSize);
+ s_strncat(scratch, ptr, strlen(ptr) + 1, newScratchSize);
+ s_strncat(scratch, ES_DELIMITER_1, 2, newScratchSize);
+ s_strncat(scratch, esPtr, strlen(esPtr) + 1, newScratchSize);
+ }
+ }
+ buf = writeString(scratch, DT_ElementSetNames, buf, len);
+ s_free(scratch);
+ }
+ buf = writeAny(query->ReferenceID, DT_ReferenceID, buf, len);
+
+ /* go back and write the header-length-indicator */
+ RELEASE_HEADER_SPACE(len);
+ size = buf - buffer - HEADER_LEN;
+ writeBinaryInteger(size, HEADER_LEN, buffer, len);
+
+ if (query->Query != NULL)
+ buf = writeSearchInfo(query, buf, len);
+
+ return (buf);
+}
+
+/*----------------------------------------------------------------------*/
+
+SearchResponseAPDU *makeSearchResponseAPDU(long result,
+ long count,
+ long recordsReturned,
+ long nextPos,
+ long resultStatus,
+ long presentStatus,
+ any *refID,
+ void *records)
+{
+ SearchResponseAPDU *query =
+ (SearchResponseAPDU *) s_malloc((size_t) sizeof(SearchResponseAPDU));
+
+ query->PDUType = searchResponseAPDU;
+ query->SearchStatus = result;
+ query->ResultCount = count;
+ query->NumberOfRecordsReturned = recordsReturned;
+ query->NextResultSetPosition = nextPos;
+ query->ResultSetStatus = resultStatus;
+ query->PresentStatus = presentStatus;
+ query->ReferenceID = duplicateAny(refID);
+ query->DatabaseDiagnosticRecords = records;
+ return (query);
+}
+
+/*----------------------------------------------------------------------*/
+
+void freeSearchResponseAPDU(SearchResponseAPDU *queryResponse)
+{
+ freeAny(queryResponse->ReferenceID);
+ s_free(queryResponse);
+}
+
+/*----------------------------------------------------------------------*/
+
+char *writeSearchResponseAPDU(SearchResponseAPDU *queryResponse, char *buffer,
+ long *len)
+{
+ char *buf = buffer + HEADER_LEN; /* leave room for the header-length-indicator */
+ long size;
+
+ RESERVE_SPACE_FOR_HEADER(len);
+
+ buf = writePDUType(queryResponse->PDUType,
+ buf,
+ len);
+ buf = writeBinaryInteger(queryResponse->SearchStatus,
+ (size_t) 1,
+ buf,
+ len);
+ buf = writeBinaryInteger(queryResponse->ResultCount,
+ (size_t) 3,
+ buf,
+ len);
+ buf = writeBinaryInteger(queryResponse->NumberOfRecordsReturned,
+ (size_t) 3,
+ buf,
+ len);
+ buf = writeBinaryInteger(queryResponse->NextResultSetPosition,
+ (size_t) 3,
+ buf,
+ len);
+ buf = writeNum(queryResponse->ResultSetStatus,
+ DT_ResultSetStatus,
+ buf,
+ len);
+ buf = writeNum(queryResponse->PresentStatus,
+ DT_PresentStatus,
+ buf,
+ len);
+ buf = writeAny(queryResponse->ReferenceID,
+ DT_ReferenceID,
+ buf,
+ len);
+
+ /* go back and write the header-length-indicator */
+ RELEASE_HEADER_SPACE(len);
+ size = buf - buffer - HEADER_LEN;
+ writeBinaryInteger(size, HEADER_LEN, buffer, len);
+
+ if (queryResponse->DatabaseDiagnosticRecords != NULL)
+ buf = writeSearchResponseInfo(queryResponse, buf, len);
+
+ return (buf);
+}
+
+/*----------------------------------------------------------------------*/
+
+char *readSearchResponseAPDU(SearchResponseAPDU **queryResponse, char *buffer)
+{
+ char *buf = buffer;
+ long size;
+ pdu_type pduType;
+ long result, count, recordsReturned, nextPos;
+ long resultStatus, presentStatus;
+ any *refID = NULL;
+ void *userInfo = NULL;
+
+ /* read required part */
+ buf = readBinaryInteger(&size, HEADER_LEN, buf);
+ buf = readPDUType(&pduType, buf);
+ buf = readBinaryInteger(&result, (size_t) 1, buf);
+ buf = readBinaryInteger(&count, (size_t) 3, buf);
+ buf = readBinaryInteger(&recordsReturned, (size_t) 3, buf);
+ buf = readBinaryInteger(&nextPos, (size_t) 3, buf);
+
+ resultStatus = presentStatus = UNUSED;
+ refID = NULL;
+
+ /* read optional part */
+ while (buf < (buffer + size + HEADER_LEN)) {
+ data_tag tag = peekTag(buf);
+
+ switch (tag) {
+ case DT_ResultSetStatus:
+ buf = readNum(&resultStatus, buf);
+ break;
+ case DT_PresentStatus:
+ buf = readNum(&presentStatus, buf);
+ break;
+ case DT_ReferenceID:
+ buf = readAny(&refID, buf);
+ break;
+ default:
+ freeAny(refID);
+ REPORT_READ_ERROR(buf);
+ break;
+ }
+ }
+
+ buf = readSearchResponseInfo(&userInfo, buf);
+ if (buf == NULL)
+ freeAny(refID);
+ RETURN_ON_NULL(buf);
+
+ /* construct the search object */
+ *queryResponse = makeSearchResponseAPDU(result,
+ count,
+ recordsReturned,
+ nextPos,
+ (long) resultStatus,
+ (long) presentStatus,
+ refID,
+ userInfo);
+
+ freeAny(refID);
+
+ return (buf);
+}
+
+/*
+ * Routines originally from ZUtil.c -- FM
+ *
+ *----------------------------------------------------------------------*/
+/* WIDE AREA INFORMATION SERVER SOFTWARE:
+ * No guarantees or restrictions. See the readme file for the full standard
+ * disclaimer.
+ *
+ * 3.26.90 Harry Morris, morris@think.com
+ * 3.30.90 Harry Morris - Changed any->bits to any->bytes
+ * 4.11.90 HWM - fixed include file names, changed
+ * - writeCompressedIntegerWithPadding() to
+ * writeCompressedIntWithPadding()
+ * - generalized conditional includes (see c-dialect.h)
+ * 3.7.91 Jonny Goldman. Replaced "short" in makeBitMap with "int" line 632.
+ */
+
+char *readErrorPosition = NULL; /* pos where buf stopped making sense */
+
+/*----------------------------------------------------------------------*/
+/* A note on error handling
+ read - these are low level routines, they do not check the type tags
+ which (sometimes) precede the data (this is done by the higher
+ level functions which call these functions). There is no
+ attempt made to check that the reading does not exceed the read
+ buffer. Such cases should be very rare and usually will be
+ caught by the calling functions. (note - it is unlikely that
+ a series of low level reads will go far off the edge without
+ triggering a type error. However, it is possible for a single
+ bad read in an array function (eg. readAny) to attempt to read a
+ large amount, possibly causing a segmentation violation or out
+ of memory condition.
+ */
+/*----------------------------------------------------------------------*/
+
+diagnosticRecord *makeDiag(boolean surrogate, char *code, char *addInfo)
+{
+ diagnosticRecord *diag =
+ (diagnosticRecord *) s_malloc((size_t) sizeof(diagnosticRecord));
+
+ diag->SURROGATE = surrogate;
+ MemCpy(diag->DIAG, code, DIAGNOSTIC_CODE_SIZE);
+ diag->ADDINFO = s_strdup(addInfo);
+
+ return (diag);
+}
+
+/*----------------------------------------------------------------------*/
+
+void freeDiag(diagnosticRecord * diag)
+{
+ if (diag != NULL) {
+ if (diag->ADDINFO != NULL)
+ s_free(diag->ADDINFO);
+ s_free(diag);
+ }
+}
+
+/*----------------------------------------------------------------------*/
+
+#define END_OF_RECORD 0x1D
+
+char *writeDiag(diagnosticRecord * diag, char *buffer, long *len)
+/* diagnostics (as per Appendix D) have a very weird format - this changes
+ in SR-1
+ */
+{
+ char *buf = buffer;
+ long length;
+
+ if (diag == NULL) /* handle unspecified optional args */
+ return (buf);
+
+ buf = writeTag(DT_DatabaseDiagnosticRecords, buf, len);
+ CHECK_FOR_SPACE_LEFT(0, len);
+
+ length = 3;
+ if (diag->ADDINFO != NULL)
+ length += strlen(diag->ADDINFO);
+
+ if (length >= 0xFFFF) /* make sure the length is reasonable */
+ {
+ length = 0xFFFF - 1;
+ diag->ADDINFO[0xFFFF - 3 - 1] = '\0';
+ }
+
+ buf = writeBinaryInteger(length, 2, buf, len);
+
+ CHECK_FOR_SPACE_LEFT(1, len);
+ buf[0] = diag->DIAG[0];
+ buf++;
+
+ CHECK_FOR_SPACE_LEFT(1, len);
+ buf[0] = diag->DIAG[1];
+ buf++;
+
+ if (length > 3) {
+ CHECK_FOR_SPACE_LEFT(3, len);
+ MemCpy(buf, diag->ADDINFO, length - 3);
+ buf += length - 3;
+ }
+
+ CHECK_FOR_SPACE_LEFT(1, len);
+ buf[0] = diag->SURROGATE;
+ buf++;
+
+ CHECK_FOR_SPACE_LEFT(1, len);
+ buf[0] = END_OF_RECORD;
+ buf++;
+
+ return (buf);
+}
+
+/*----------------------------------------------------------------------*/
+
+char *readDiag(diagnosticRecord ** diag, char *buffer)
+{
+ char *buf = buffer;
+ diagnosticRecord *d = (diagnosticRecord *) s_malloc((size_t) sizeof(diagnosticRecord));
+ data_tag tag;
+ long len;
+
+ buf = readTag(&tag, buf);
+
+ buf = readBinaryInteger(&len, 2, buf);
+
+ d->DIAG[0] = buf[0];
+ d->DIAG[1] = buf[1];
+ d->DIAG[2] = '\0';
+
+ if (len > 3) {
+ d->ADDINFO = (char *) s_malloc((size_t) (len - 3 + 1));
+ MemCpy(d->ADDINFO, (char *) (buf + 2), len - 3);
+ d->ADDINFO[len - 3] = '\0';
+ } else
+ d->ADDINFO = NULL;
+
+ d->SURROGATE = buf[len - 1];
+
+ *diag = d;
+
+ return (buf + len + 1);
+}
+
+/*----------------------------------------------------------------------*/
+
+#define continueBit 0x80
+#define dataMask 0x7F
+#define dataBits 7
+
+char *writeCompressedInteger(unsigned long num, char *buf, long *len)
+/* write a binary integer in the format described on p. 40.
+ this might be sped up
+*/
+{
+ char byte;
+ unsigned long i;
+ unsigned long size;
+
+ size = writtenCompressedIntSize(num);
+ CHECK_FOR_SPACE_LEFT(size, len);
+
+ for (i = size - 1; i != 0; i--) {
+ byte = num & dataMask;
+ if (i != (size - 1)) /* turn on continue bit */
+ byte = (char) (byte | continueBit);
+ buf[i] = byte;
+ num = num >> dataBits; /* don't and here */
+ }
+
+ return (buf + size);
+}
+
+/*----------------------------------------------------------------------*/
+
+char *readCompressedInteger(unsigned long *num, char *buf)
+/* read a binary integer in the format described on p. 40.
+ this might be sped up
+*/
+{
+ long i = 0;
+ unsigned char byte;
+
+ *num = 0;
+
+ do {
+ byte = buf[i++];
+ *num = *num << dataBits;
+ *num += (byte & dataMask);
+ }
+ while (byte & continueBit);
+
+ return (buf + i);
+}
+
+/*----------------------------------------------------------------------*/
+
+#define pad 128 /* high bit is set */
+
+char *writeCompressedIntWithPadding(unsigned long num,
+ unsigned long size,
+ char *buffer,
+ long *len)
+/* Like writeCompressedInteger, except writes padding (128) to make
+ sure that size bytes are used. This can be read correctly by
+ readCompressedInteger()
+*/
+{
+ char *buf = buffer;
+ unsigned long needed, padding;
+ long i;
+
+ CHECK_FOR_SPACE_LEFT(size, len);
+
+ needed = writtenCompressedIntSize(num);
+ padding = size - needed;
+ i = padding - 1;
+
+ for (i = padding - 1; i >= 0; i--) {
+ buf[i] = pad;
+ }
+
+ buf = writeCompressedInteger(num, buf + padding, len);
+
+ return (buf);
+}
+
+/*----------------------------------------------------------------------*/
+
+unsigned long writtenCompressedIntSize(unsigned long num)
+/* return the number of bytes needed to represent the value num in
+ compressed format. currently limited to 4 bytes
+ */
+{
+ if (num < CompressedInt1Byte)
+ return (1);
+ else if (num < CompressedInt2Byte)
+ return (2);
+ else if (num < CompressedInt3Byte)
+ return (3);
+ else
+ return (4);
+}
+
+/*----------------------------------------------------------------------*/
+
+char *writeTag(data_tag tag, char *buf, long *len)
+/* write out a data tag */
+{
+ return (writeCompressedInteger(tag, buf, len));
+}
+
+/*----------------------------------------------------------------------*/
+
+char *readTag(data_tag *tag, char *buf)
+/* read a data tag */
+{
+ return (readCompressedInteger(tag, buf));
+}
+
+/*----------------------------------------------------------------------*/
+
+unsigned long writtenTagSize(data_tag tag)
+{
+ return (writtenCompressedIntSize(tag));
+}
+
+/*----------------------------------------------------------------------*/
+
+data_tag peekTag(char *buf)
+/* read a data tag without advancing the buffer */
+{
+ data_tag tag;
+
+ readTag(&tag, buf);
+ return (tag);
+}
+
+/*----------------------------------------------------------------------*/
+
+any *makeAny(unsigned long size, char *data)
+{
+ any *a = (any *) s_malloc((size_t) sizeof(any));
+
+ a->size = size;
+ a->bytes = data;
+ return (a);
+}
+
+/*----------------------------------------------------------------------*/
+
+void freeAny(any *a)
+/* destroy an any and its associated data. Assumes a->bytes was
+ allocated using the s_malloc family of libraries
+ */
+{
+ if (a != NULL) {
+ if (a->bytes != NULL)
+ s_free(a->bytes);
+ s_free(a);
+ }
+}
+
+/*----------------------------------------------------------------------*/
+
+any *duplicateAny(any *a)
+{
+ any *copy = NULL;
+
+ if (a == NULL)
+ return (NULL);
+
+ copy = (any *) s_malloc((size_t) sizeof(any));
+
+ copy->size = a->size;
+ if (a->bytes == NULL)
+ copy->bytes = NULL;
+ else {
+ copy->bytes = (char *) s_malloc((size_t) copy->size);
+ MemCpy(copy->bytes, a->bytes, copy->size);
+ }
+ return (copy);
+}
+
+/*----------------------------------------------------------------------*/
+
+char *writeAny(any *a, data_tag tag, char *buffer, long *len)
+/* write an any + tag and size info */
+{
+ char *buf = buffer;
+
+ if (a == NULL) /* handle unspecified optional args */
+ return (buf);
+
+ /* write the tags */
+ buf = writeTag(tag, buf, len);
+ buf = writeCompressedInteger(a->size, buf, len);
+
+ /* write the bytes */
+ CHECK_FOR_SPACE_LEFT(a->size, len);
+ MemCpy(buf, a->bytes, a->size);
+
+ return (buf + a->size);
+}
+
+/*----------------------------------------------------------------------*/
+
+char *readAny(any **anAny, char *buffer)
+/* read an any + tag and size info */
+{
+ char *buf;
+ any *a;
+ data_tag tag;
+
+ a = (any *) s_malloc((size_t) sizeof(any));
+
+ buf = buffer;
+
+ buf = readTag(&tag, buf);
+
+ buf = readCompressedInteger(&a->size, buf);
+
+ /* now simply copy the bytes */
+ a->bytes = (char *) s_malloc((size_t) a->size);
+ MemCpy(a->bytes, buf, a->size);
+ *anAny = a;
+
+ return (buf + a->size);
+}
+
+/*----------------------------------------------------------------------*/
+
+unsigned long writtenAnySize(data_tag tag, any *a)
+{
+ unsigned long size;
+
+ if (a == NULL)
+ return (0);
+
+ size = writtenTagSize(tag);
+ size += writtenCompressedIntSize(a->size);
+ size += a->size;
+ return (size);
+}
+
+/*----------------------------------------------------------------------*/
+
+any *stringToAny(char *s)
+{
+ any *a = NULL;
+
+ if (s == NULL)
+ return (NULL);
+
+ a = (any *) s_malloc((size_t) sizeof(any));
+
+ a->size = strlen(s);
+ a->bytes = (char *) s_malloc((size_t) a->size);
+ MemCpy(a->bytes, s, a->size);
+ return (a);
+}
+
+/*----------------------------------------------------------------------*/
+
+char *anyToString(any *a)
+{
+ char *s = NULL;
+
+ if (a == NULL)
+ return (NULL);
+
+ s = s_malloc((size_t) (a->size + 1));
+ MemCpy(s, a->bytes, a->size);
+ s[a->size] = '\0';
+ return (s);
+}
+
+/*----------------------------------------------------------------------*/
+
+char *writeString(char *s, data_tag tag, char *buffer, long *len)
+/* Write a C style string. The terminating null is not written.
+ This function is not part of the Z39.50 spec. It is provided
+ for the convenience of those wishing to pass C strings in
+ the place of an any.
+ */
+{
+ char *buf = buffer;
+ any *data = NULL;
+
+ if (s == NULL)
+ return (buffer); /* handle unused optional item before making an any */
+ data = (any *) s_malloc((size_t) sizeof(any));
+
+ data->size = strlen(s);
+ data->bytes = s; /* save a copy here by not using stringToAny() */
+ buf = writeAny(data, tag, buf, len);
+ s_free(data); /* don't use freeAny() since it will free s too */
+ return (buf);
+}
+
+/*----------------------------------------------------------------------*/
+
+char *readString(char **s, char *buffer)
+/* Read an any and convert it into a C style string.
+ This function is not part of the Z39.50 spec. It is provided
+ for the convenience of those wishing to pass C strings in
+ the place of an any.
+ */
+{
+ any *data = NULL;
+ char *buf = readAny(&data, buffer);
+
+ *s = anyToString(data);
+ freeAny(data);
+ return (buf);
+}
+
+/*----------------------------------------------------------------------*/
+
+unsigned long writtenStringSize(data_tag tag, char *s)
+{
+ unsigned long size;
+
+ if (s == NULL)
+ return (0);
+
+ size = writtenTagSize(tag);
+ size += writtenCompressedIntSize(size);
+ size += strlen(s);
+ return (size);
+}
+
+/*----------------------------------------------------------------------*/
+
+any *longToAny(long num)
+/* a convenience function */
+{
+ char s[40];
+
+ sprintf(s, "%ld", num);
+
+ return (stringToAny(s));
+}
+
+/*----------------------------------------------------------------------*/
+
+long anyToLong(any *a)
+/* a convenience function */
+{
+ long num;
+ char *str = NULL;
+
+ str = anyToString(a);
+ sscanf(str, "%ld", &num); /* could check the result and return
+ an error */
+ s_free(str);
+ return (num);
+}
+
+/*----------------------------------------------------------------------*/
+
+#define bitsPerByte 8
+
+bit_map *makeBitMap(unsigned long numBits, ...)
+/* construct and return a bitmap with numBits elements */
+{
+ va_list ap;
+ unsigned long i, j;
+ bit_map *bm = NULL;
+
+ LYva_start(ap, numBits);
+
+ bm = (bit_map *) s_malloc((size_t) sizeof(bit_map));
+
+ bm->size = (unsigned long) (ceil((double) numBits / bitsPerByte));
+ bm->bytes = (char *) s_malloc((size_t) bm->size);
+
+ /* fill up the bits */
+ for (i = 0; i < bm->size; i++) /* iterate over bytes */
+ {
+ char byte = 0;
+
+ for (j = 0; j < bitsPerByte; j++) /* iterate over bits */
+ {
+ if ((i * bitsPerByte + j) < numBits) {
+ boolean bit = false;
+
+ bit = (boolean) va_arg(ap, boolean);
+
+ if (bit) {
+ byte = byte | (1 << (bitsPerByte - j - 1));
+ }
+ }
+ }
+ bm->bytes[i] = byte;
+ }
+
+ va_end(ap);
+ return (bm);
+}
+
+/*----------------------------------------------------------------------*/
+
+void freeBitMap(bit_map *bm)
+/* destroy a bit map created by makeBitMap() */
+{
+ s_free(bm->bytes);
+ s_free(bm);
+}
+
+/*----------------------------------------------------------------------*/
+
+/* use this routine to interpret a bit map. pos specifies the bit
+ number. bit 0 is the Leftmost bit of the first byte.
+ Could do bounds checking.
+ */
+
+boolean bitAtPos(unsigned long pos, bit_map *bm)
+{
+ if (pos > bm->size * bitsPerByte)
+ return false;
+ else
+ return ((bm->bytes[(pos / bitsPerByte)] &
+ (0x80 >> (pos % bitsPerByte))) ?
+ true : false);
+}
+
+/*----------------------------------------------------------------------*/
+
+char *writeBitMap(bit_map *bm, data_tag tag, char *buffer, long *len)
+/* write a bitmap + type and size info */
+{
+ return (writeAny((any *) bm, tag, buffer, len));
+}
+
+/*----------------------------------------------------------------------*/
+
+char *readBitMap(bit_map **bm, char *buffer)
+/* read a bitmap + type and size info */
+{
+ char *c;
+
+ c = readAny((any **) bm, buffer);
+ return (c);
+}
+
+/*----------------------------------------------------------------------*/
+
+char *writeByte(unsigned long byte, char *buf, long *len)
+{
+ CHECK_FOR_SPACE_LEFT(1, len);
+ buf[0] = byte & 0xFF; /* we really only want the first byte */
+ return (buf + 1);
+}
+
+/*----------------------------------------------------------------------*/
+
+char *readByte(unsigned char *byte, char *buf)
+{
+ *byte = buf[0];
+ return (buf + 1);
+}
+
+/*----------------------------------------------------------------------*/
+
+char *writeBoolean(boolean flag, char *buf, long *len)
+{
+ return (writeByte(flag, buf, len));
+}
+
+/*----------------------------------------------------------------------*/
+
+char *readBoolean(boolean *flag, char *buffer)
+{
+ unsigned char byte;
+ char *buf = readByte(&byte, buffer);
+
+ *flag = (byte == true) ? true : false;
+ return (buf);
+}
+
+/*----------------------------------------------------------------------*/
+
+char *writePDUType(pdu_type pduType, char *buf, long *len)
+/* PDUType is a single byte */
+{
+ return (writeBinaryInteger((long) pduType, (unsigned long) 1, buf, len));
+}
+
+/*----------------------------------------------------------------------*/
+
+char *readPDUType(pdu_type *pduType, char *buf)
+/* PDUType is a single byte */
+{
+ return (readBinaryInteger((long *) pduType, (unsigned long) 1, buf));
+}
+
+/*----------------------------------------------------------------------*/
+
+pdu_type peekPDUType(char *buf)
+/* read the next pdu without advancing the buffer, Note that this
+ function is to be used on a buffer that is known to contain an
+ APDU. The pdu_type is written HEADER_LEN bytes into the buffer
+ */
+{
+ pdu_type pdu;
+
+ readPDUType(&pdu, buf + HEADER_LEN);
+ return (pdu);
+}
+
+/*----------------------------------------------------------------------*/
+
+#define BINARY_INTEGER_BYTES sizeof(long) /* the number of bytes used by
+ a "binary integer" */
+char *writeBinaryInteger(long num, unsigned long size, char *buf, long *len)
+/* write out first size bytes of num - no type info
+ XXX should this take unsigned longs instead ??? */
+{
+ long i;
+ char byte;
+
+ if (size < 1 || size > BINARY_INTEGER_BYTES)
+ return (NULL); /* error */
+
+ CHECK_FOR_SPACE_LEFT(size, len);
+
+ for (i = size - 1; i >= 0; i--) {
+ byte = (char) (num & 255);
+ buf[i] = byte;
+ num = num >> bitsPerByte; /* don't and here */
+ }
+
+ return (buf + size);
+}
+
+/*----------------------------------------------------------------------*/
+
+char *readBinaryInteger(long *num, unsigned long size, char *buf)
+/* read in first size bytes of num - no type info
+ XXX this should take unsigned longs instead !!! */
+{
+ unsigned long i;
+ unsigned char byte;
+
+ if (size < 1 || size > BINARY_INTEGER_BYTES)
+ return (buf); /* error */
+ *num = 0;
+
+ for (i = 0; i < size; i++) {
+ byte = buf[i];
+ *num = *num << bitsPerByte;
+ *num += byte;
+ }
+
+ return (buf + size);
+}
+
+/*----------------------------------------------------------------------*/
+
+unsigned long writtenCompressedBinIntSize(long num)
+/* return the number of bytes needed to represent the value num.
+ currently limited to max of 4 bytes
+ Only compresses for positive nums - negatives get whole 4 bytes
+ */
+{
+ if (num < 0L)
+ return (4);
+ else if (num < 256L) /* 2**8 */
+ return (1);
+ else if (num < 65536L) /* 2**16 */
+ return (2);
+ else if (num < 16777216L) /* 2**24 */
+ return (3);
+ else
+ return (4);
+}
+
+/*----------------------------------------------------------------------*/
+
+char *writeNum(long num, data_tag tag, char *buffer, long *len)
+/* write a binary integer + size and tag info */
+{
+ char *buf = buffer;
+ long size = writtenCompressedBinIntSize(num);
+
+ if (num == UNUSED)
+ return (buffer);
+
+ buf = writeTag(tag, buf, len);
+ buf = writeCompressedInteger(size, buf, len);
+ buf = writeBinaryInteger(num, (unsigned long) size, buf, len);
+ return (buf);
+}
+
+/*----------------------------------------------------------------------*/
+
+char *readNum(long *num, char *buffer)
+/* read a binary integer + size and tag info */
+{
+ char *buf = buffer;
+ data_tag tag;
+ unsigned long size;
+ unsigned long val;
+
+ buf = readTag(&tag, buf);
+ buf = readCompressedInteger(&val, buf);
+ size = (unsigned long) val;
+ buf = readBinaryInteger(num, size, buf);
+ return (buf);
+}
+
+/*----------------------------------------------------------------------*/
+
+unsigned long writtenNumSize(data_tag tag, long num)
+{
+ long dataSize = writtenCompressedBinIntSize(num);
+ long size;
+
+ size = writtenTagSize(tag); /* space for the tag */
+ size += writtenCompressedIntSize(dataSize); /* space for the size */
+ size += dataSize; /* space for the data */
+
+ return (size);
+}
+
+/*----------------------------------------------------------------------*/
+
+typedef void (voidfunc) (void *);
+
+void doList(void **list, voidfunc * func)
+/* call func on each element of the NULL terminated list of pointers */
+{
+ register long i;
+ register void *ptr = NULL;
+
+ if (list == NULL)
+ return;
+ for (i = 0, ptr = list[i]; ptr != NULL; ptr = list[++i])
+ (*func) (ptr);
+}
+
+/*----------------------------------------------------------------------*/
+
+char *writeProtocolVersion(char *buf, long *len)
+/* write a bitmap describing the protocols available */
+{
+ static bit_map *version = NULL;
+
+ if (version == NULL) {
+ version = makeBitMap((unsigned long) 1, true); /* version 1! */
+ }
+
+ return (writeBitMap(version, DT_ProtocolVersion, buf, len));
+}
+
+/*----------------------------------------------------------------------*/
+
+char *defaultImplementationID(void)
+{
+ static char ImplementationID[] = "TMC";
+
+ return (ImplementationID);
+}
+
+/*----------------------------------------------------------------------*/
+
+char *defaultImplementationName(void)
+{
+ static char ImplementationName[] = "Thinking Machines Corporation Z39.50";
+
+ return (ImplementationName);
+}
+
+/*----------------------------------------------------------------------*/
+
+char *defaultImplementationVersion(void)
+{
+ static char ImplementationVersion[] = "2.0A";
+
+ return (ImplementationVersion);
+}
+
+/*----------------------------------------------------------------------*/
+
+/*
+ * Routines originally from ZType1.c -- FM
+ *
+ *----------------------------------------------------------------------*/
+/* WIDE AREA INFORMATION SERVER SOFTWARE:
+ * No guarantees or restrictions. See the readme file for the full standard
+ * disclaimer.
+ *
+ * 3.26.90 Harry Morris, morris@think.com
+ * 4.11.90 HWM - generalized conditional includes (see c-dialect.h)
+ */
+/*----------------------------------------------------------------------*/
+
+query_term *makeAttributeTerm(char *use,
+ char *relation,
+ char *position,
+ char *structure,
+ char *truncation,
+ char *completeness,
+ any *term)
+{
+ query_term *qt = (query_term *) s_malloc((size_t) sizeof(query_term));
+
+ qt->TermType = TT_Attribute;
+
+ /* copy in the attributes */
+ LYStrNCpy(qt->Use, use, ATTRIBUTE_SIZE);
+ LYStrNCpy(qt->Relation, relation, ATTRIBUTE_SIZE);
+ LYStrNCpy(qt->Position, position, ATTRIBUTE_SIZE);
+ LYStrNCpy(qt->Structure, structure, ATTRIBUTE_SIZE);
+ LYStrNCpy(qt->Truncation, truncation, ATTRIBUTE_SIZE);
+ LYStrNCpy(qt->Completeness, completeness, ATTRIBUTE_SIZE);
+
+ qt->Term = duplicateAny(term);
+
+ qt->ResultSetID = NULL;
+
+ return (qt);
+}
+
+/*----------------------------------------------------------------------*/
+
+query_term *makeResultSetTerm(any *resultSet)
+{
+ query_term *qt = (query_term *) s_malloc((size_t) sizeof(query_term));
+
+ qt->TermType = TT_ResultSetID;
+
+ qt->ResultSetID = duplicateAny(resultSet);
+
+ qt->Term = NULL;
+
+ return (qt);
+}
+
+/*----------------------------------------------------------------------*/
+
+query_term *makeOperatorTerm(char *operatorCode)
+{
+ query_term *qt = (query_term *) s_malloc((size_t) sizeof(query_term));
+
+ qt->TermType = TT_Operator;
+
+ LYStrNCpy(qt->Operator, operatorCode, OPERATOR_SIZE);
+
+ qt->Term = NULL;
+ qt->ResultSetID = NULL;
+
+ return (qt);
+}
+
+/*----------------------------------------------------------------------*/
+
+void freeTerm(void *param)
+{
+ query_term *qt = (query_term *) param;
+
+ switch (qt->TermType) {
+ case TT_Attribute:
+ freeAny(qt->Term);
+ break;
+ case TT_ResultSetID:
+ freeAny(qt->ResultSetID);
+ break;
+ case TT_Operator:
+ /* do nothing */
+ break;
+ default:
+ panic("Implementation error: Unknown term type %ld",
+ qt->TermType);
+ break;
+ }
+ s_free(qt);
+}
+
+/*----------------------------------------------------------------------*/
+
+#define ATTRIBUTE_LIST_SIZE ATTRIBUTE_SIZE * 6
+#define AT_DELIMITER " "
+
+char *writeQueryTerm(query_term *qt, char *buffer, long *len)
+{
+ char *buf = buffer;
+ char attributes[ATTRIBUTE_LIST_SIZE];
+
+ switch (qt->TermType) {
+ case TT_Attribute:
+ LYStrNCpy(attributes, qt->Use, ATTRIBUTE_LIST_SIZE);
+ s_strncat(attributes, AT_DELIMITER, sizeof(AT_DELIMITER) + 1, ATTRIBUTE_LIST_SIZE);
+ s_strncat(attributes, qt->Relation, ATTRIBUTE_SIZE, ATTRIBUTE_LIST_SIZE);
+ s_strncat(attributes, AT_DELIMITER, sizeof(AT_DELIMITER) + 1, ATTRIBUTE_LIST_SIZE);
+ s_strncat(attributes, qt->Position, ATTRIBUTE_SIZE, ATTRIBUTE_LIST_SIZE);
+ s_strncat(attributes, AT_DELIMITER, sizeof(AT_DELIMITER) + 1, ATTRIBUTE_LIST_SIZE);
+ s_strncat(attributes, qt->Structure, ATTRIBUTE_SIZE, ATTRIBUTE_LIST_SIZE);
+ s_strncat(attributes, AT_DELIMITER, sizeof(AT_DELIMITER) + 1, ATTRIBUTE_LIST_SIZE);
+ s_strncat(attributes, qt->Truncation, ATTRIBUTE_SIZE, ATTRIBUTE_LIST_SIZE);
+ s_strncat(attributes, AT_DELIMITER, sizeof(AT_DELIMITER) + 1, ATTRIBUTE_LIST_SIZE);
+ s_strncat(attributes, qt->Completeness, ATTRIBUTE_SIZE, ATTRIBUTE_LIST_SIZE);
+ buf = writeString(attributes, DT_AttributeList, buf, len);
+ buf = writeAny(qt->Term, DT_Term, buf, len);
+ break;
+ case TT_ResultSetID:
+ buf = writeAny(qt->ResultSetID, DT_ResultSetID, buf, len);
+ break;
+ case TT_Operator:
+ buf = writeString(qt->Operator, DT_Operator, buf, len);
+ break;
+ default:
+ panic("Implementation error: Unknown term type %ld",
+ qt->TermType);
+ break;
+ }
+
+ return (buf);
+}
+
+/*----------------------------------------------------------------------*/
+
+char *readQueryTerm(query_term **qt, char *buffer)
+{
+ char *buf = buffer;
+ char *attributeList = NULL;
+ char *operator = NULL;
+ any *term;
+ char *use = NULL;
+ char *relation = NULL;
+ char *position = NULL;
+ char *structure = NULL;
+ char *truncation = NULL;
+ char *completeness;
+ any *resultSetID = NULL;
+ data_tag tag;
+
+ tag = peekTag(buffer);
+
+ switch (tag) {
+ case DT_AttributeList:
+ buf = readString(&attributeList, buf);
+ buf = readAny(&term, buf);
+ use = strtok(attributeList, AT_DELIMITER);
+ relation = strtok(NULL, AT_DELIMITER);
+ position = strtok(NULL, AT_DELIMITER);
+ structure = strtok(NULL, AT_DELIMITER);
+ truncation = strtok(NULL, AT_DELIMITER);
+ completeness = strtok(NULL, AT_DELIMITER);
+ *qt = makeAttributeTerm(use, relation, position, structure,
+ truncation, completeness, term);
+ s_free(attributeList);
+ freeAny(term);
+ break;
+ case DT_ResultSetID:
+ buf = readAny(&resultSetID, buf);
+ *qt = makeResultSetTerm(resultSetID);
+ freeAny(resultSetID);
+ break;
+ case DT_Operator:
+ buf = readString(&operator, buf);
+ *qt = makeOperatorTerm(operator);
+ s_free(operator);
+ break;
+ default:
+ REPORT_READ_ERROR(buf);
+ break;
+ }
+
+ return (buf);
+}
+
+/*----------------------------------------------------------------------*/
+
+static unsigned long getQueryTermSize(query_term *qt);
+
+static unsigned long getQueryTermSize(query_term *qt)
+/* figure out how many bytes it will take to write this query */
+{
+ unsigned long size = 0;
+ static char attributes[] = "11 22 33 44 55 66"; /* we just need this to
+
+ calculate its written
+ size */
+
+ switch (qt->TermType) {
+ case TT_Attribute:
+ size = writtenStringSize(DT_AttributeList, attributes);
+ size += writtenAnySize(DT_Term, qt->Term);
+ break;
+ case TT_ResultSetID:
+ size = writtenAnySize(DT_ResultSetID, qt->ResultSetID);
+ break;
+ case TT_Operator:
+ size = writtenStringSize(DT_Operator, qt->Operator);
+ break;
+ default:
+ panic("Implementation error: Unknown term type %ld",
+ qt->TermType);
+ break;
+ }
+
+ return (size);
+}
+
+/*----------------------------------------------------------------------*/
+
+/* A query is simply a null terminated list of query terms. For
+ transmission, a query is written into an any which is sent as
+ the user information field. */
+
+any *writeQuery(query_term **terms)
+{
+ any *info = NULL;
+ char *writePos = NULL;
+ char *data = NULL;
+ unsigned long size = 0;
+ long remaining = 0;
+ long i;
+ query_term *qt = NULL;
+
+ if (terms == NULL)
+ return (NULL);
+
+ /* calculate the size of write buffer */
+ for (i = 0, qt = terms[i]; qt != NULL; qt = terms[++i])
+ size += getQueryTermSize(qt);
+
+ data = (char *) s_malloc((size_t) size);
+
+ /* write the terms */
+ writePos = data;
+ remaining = size;
+ for (i = 0, qt = terms[i]; qt != NULL; qt = terms[++i])
+ writePos = writeQueryTerm(qt, writePos, &remaining);
+
+ info = makeAny(size, data);
+
+ return (info);
+}
+
+/*----------------------------------------------------------------------*/
+
+query_term **readQuery(any *info)
+{
+ char *readPos = info->bytes;
+ query_term **terms = NULL;
+ query_term *qt = NULL;
+ long numTerms = 0L;
+ char tmp[100];
+
+ sprintf(tmp, "readquery: bytes: %ld", info->size);
+ log_write(tmp);
+
+ while (readPos < info->bytes + info->size) {
+ readPos = readQueryTerm(&qt, readPos);
+
+ if (terms == NULL) {
+ terms = (query_term **) s_malloc((size_t) (sizeof(query_term *) * 2));
+ } else {
+ terms =
+ (query_term **) s_realloc((char *) terms,
+ (size_t) (sizeof(query_term *) *
+ (numTerms + 2)));
+ }
+ if (qt == NULL)
+ log_write("qt = null");
+ terms[numTerms++] = qt;
+ terms[numTerms] = NULL;
+ }
+
+ return (terms);
+}
+
+/*----------------------------------------------------------------------*/
+
+/*
+ * Routines originally from panic.c -- FM
+ *
+ *----------------------------------------------------------------------*/
+/* WIDE AREA INFORMATION SERVER SOFTWARE:
+ * No guarantees or restrictions. See the readme file for the full standard
+ * disclaimer.
+ *
+ * Morris@think.com
+ */
+
+/* panic is an error system interface. On the Mac, it will pop
+ * up a little window to explain the problem.
+ * On a unix box, it will print out the error and call perror()
+ */
+
+/*----------------------------------------------------------------------*/
+
+static void exitAction(long error);
+
+static void exitAction(long error GCC_UNUSED)
+{
+ exit_immediately(EXIT_SUCCESS);
+}
+
+/*----------------------------------------------------------------------*/
+
+#define PANIC_HEADER "Fatal Error: "
+
+void panic(char *format, ...)
+{
+ va_list ap; /* the variable arguments */
+
+ fprintf(stderr, PANIC_HEADER);
+ LYva_start(ap, format); /* init ap */
+ vfprintf(stderr, format, ap); /* print the contents */
+ va_end(ap); /* free ap */
+ fflush(stderr);
+
+ exitAction(0);
+}
+
+/*----------------------------------------------------------------------*/
+
+/*
+ * Routines originally from cutil.c -- FM
+ *
+ *----------------------------------------------------------------------*/
+/* Wide AREA INFORMATION SERVER SOFTWARE
+ * No guarantees or restrictions. See the readme file for the full standard
+ * disclaimer.
+ *
+ * 3.26.90 Harry Morris, morris@think.com
+ * 4.11.90 HWM - generalized conditional includes (see c-dialect.h)
+ */
+
+/*----------------------------------------------------------------------*/
+
+void fs_checkPtr(void *ptr)
+/* If the ptr is NULL, give an error */
+{
+ if (ptr == NULL)
+ panic("checkPtr found a NULL pointer");
+}
+
+/*----------------------------------------------------------------------*/
+
+void *fs_malloc(size_t size)
+/* does safety checks and optional accounting */
+{
+ register void *ptr = NULL;
+
+ ptr = (void *) calloc((size_t) size, (size_t) 1);
+ s_checkPtr(ptr);
+
+ return (ptr);
+}
+
+/*----------------------------------------------------------------------*/
+
+void *fs_realloc(void *ptr, size_t size)
+/* does safety checks and optional accounting
+ note - we don't know how big ptr's memory is, so we can't ensure
+ that any new memory allocated is NULLed!
+ */
+{
+ register void *nptr = NULL;
+
+ if (ptr == NULL) /* this is really a malloc */
+ return (s_malloc(size));
+
+ nptr = (void *) realloc(ptr, size);
+ s_checkPtr(ptr);
+
+ return (nptr);
+}
+
+/*----------------------------------------------------------------------*/
+
+void fs_free(void *ptr)
+/* does safety checks and optional accounting */
+{
+ if (ptr != NULL) /* some non-ansi compilers/os's can't handle freeing null */
+ { /* if we knew the size of this block of memory, we could clear it - oh well */
+ free(ptr);
+ ptr = NULL;
+ }
+}
+
+/*----------------------------------------------------------------------*/
+
+char *s_strdup(char *s)
+
+/* return a copy of s. This is identical to the standard library routine
+ strdup(), except that it is safe. If s == NULL or malloc fails,
+ appropriate action is taken.
+ */
+{
+ unsigned long len;
+ char *copy = NULL;
+
+ if (s == NULL) /* safety check to postpone stupid errors */
+ return (NULL);
+
+ len = strlen(s); /* length of string - terminator */
+ copy = (char *) s_malloc((size_t) (sizeof(char) * (len + 1)));
+
+ StrNCpy(copy, s, len + 1);
+ return (copy);
+}
+
+/*----------------------------------------------------------------------*/
+
+char *fs_strncat(char *dst, char *src, size_t maxToAdd, size_t maxTotal)
+
+/* like strncat, except the fourth argument limits the maximum total
+ length of the resulting string
+ */
+{
+ size_t dstSize = strlen(dst);
+ size_t srcSize = strlen(src);
+
+ if (dstSize + srcSize < maxTotal) /* use regular old strncat */
+ return (StrNCat(dst, src, maxToAdd));
+ else {
+ size_t truncateTo = maxTotal - dstSize - 1;
+ char saveChar = src[truncateTo];
+ char *result = NULL;
+
+ src[truncateTo] = '\0';
+ result = StrNCat(dst, src, maxToAdd);
+ src[truncateTo] = saveChar;
+ return (result);
+ }
+}
+
+/*----------------------------------------------------------------------*/
+
+char char_downcase(unsigned long long_ch)
+{
+ unsigned char ch = long_ch & 0xFF; /* just want one byte */
+
+ /* when ansi is the way of the world, this can be tolower */
+ return (((ch >= 'A') && (ch <= 'Z')) ? (ch + 'a' - 'A') : ch);
+}
+
+char *string_downcase(char *word)
+{
+ long i = 0;
+
+ while (word[i] != '\0') {
+ word[i] = char_downcase((unsigned long) word[i]);
+ i++;
+ }
+ return (word);
+}
+
+/*----------------------------------------------------------------------*/
+#endif /* VMS */
diff --git a/WWW/Library/Implementation/HTVMS_WaisUI.h b/WWW/Library/Implementation/HTVMS_WaisUI.h
new file mode 100644
index 0000000..4b5b06d
--- /dev/null
+++ b/WWW/Library/Implementation/HTVMS_WaisUI.h
@@ -0,0 +1,664 @@
+/* HTVMS_WAISUI.h
+ *
+ * Adaptation for Lynx by F.Macrides (macrides@sci.wfeb.edu)
+ *
+ * 31-May-1994 FM Initial version.
+ */
+
+#ifndef HTVMSWAIS_H
+#define HTVMSWAIS_H
+
+#ifndef HTUTILS_H
+#include <HTUtils.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ void log_write(char *);
+
+/*
+ * Routines originally from Panic.h -- FM
+ *
+ *----------------------------------------------------------------------*/
+
+ void panic(char *format, ...);
+
+/*----------------------------------------------------------------------*/
+
+/*
+ * Routines originally from CUtil.h -- FM
+ *
+ *----------------------------------------------------------------------*/
+
+/* types and constants */
+
+#ifndef boolean
+#define boolean unsigned long
+#endif /* boolean */
+
+#ifndef true
+#define true (boolean)1L
+#endif /* true */
+
+#ifndef false
+#define false (boolean)0L /* used to be (!true), but broke
+ some compilers */
+#endif /* false */
+
+#ifndef TRUE
+#define TRUE true
+#endif /* TRUE */
+
+#ifndef FALSE
+#define FALSE false
+#endif /* FALSE */
+
+/*----------------------------------------------------------------------*/
+/* functions */
+
+/* enhanced memory handling functions - don't call them directly, use the
+ macros below */
+ void fs_checkPtr(void *ptr);
+ void *fs_malloc(size_t size);
+ void *fs_realloc(void *ptr, size_t size);
+ void fs_free(void *ptr);
+ char *fs_strncat(char *dst, char *src, size_t maxToAdd, size_t maxTotal);
+
+/* macros for memory functions. call these in your program. */
+#define s_checkPtr(ptr) fs_checkPtr(ptr)
+#define s_malloc(size) fs_malloc(size)
+#define s_realloc(ptr,size) fs_realloc((ptr),(size))
+#define s_free(ptr) { fs_free((char*)ptr); ptr = NULL; }
+#define s_strncat(dst,src,maxToAdd,maxTotal) fs_strncat((dst),(src),(maxToAdd),(maxTotal))
+
+ char *s_strdup(char *s);
+
+#define IS_DELIMITER 1
+#define NOT_DELIMITER !IS_DELIMITER
+
+ char char_downcase(unsigned long ch);
+ char *string_downcase(char *word);
+
+/*----------------------------------------------------------------------*/
+
+/*
+ * Routines originally from ZUtil.c -- FM
+ *
+ *----------------------------------------------------------------------*/
+
+/* Data types / constants */
+
+/* bytes to leave for the header size info */
+#define HEADER_LEN (size_t)2
+
+ typedef long pdu_type;
+
+#define initAPDU (pdu_type)20
+#define initResponseAPDU (pdu_type)21
+#define searchAPDU (pdu_type)22
+#define searchResponseAPDU (pdu_type)23
+#define presentAPDU (pdu_type)24
+#define presentResponseAPDU (pdu_type)25
+#define deteteAPDU (pdu_type)26
+#define deleteResponseAPDU (pdu_type)27
+#define accessControlAPDU (pdu_type)28
+#define accessControlResponseAPDU (pdu_type)29
+#define resourceControlAPDU (pdu_type)30
+#define resourceControlResponseAPDU (pdu_type)31
+
+ typedef struct any { /* an any is a non-ascii string of characters */
+ unsigned long size;
+ char *bytes;
+ } any;
+
+ typedef any bit_map; /* a bit_map is a group of packed bits */
+
+ typedef unsigned long data_tag;
+
+#define DT_PDUType (data_tag)1
+#define DT_ReferenceID (data_tag)2
+#define DT_ProtocolVersion (data_tag)3
+#define DT_Options (data_tag)4
+#define DT_PreferredMessageSize (data_tag)5
+#define DT_MaximumRecordSize (data_tag)6
+#define DT_IDAuthentication (data_tag)7
+#define DT_ImplementationID (data_tag)8
+#define DT_ImplementationName (data_tag)9
+#define DT_ImplementationVersion (data_tag)10
+#define DT_UserInformationField (data_tag)11
+#define DT_Result (data_tag)12
+#define DT_SmallSetUpperBound (data_tag)13
+#define DT_LargeSetLowerBound (data_tag)14
+#define DT_MediumSetPresentNumber (data_tag)15
+#define DT_ReplaceIndicator (data_tag)16
+#define DT_ResultSetName (data_tag)17
+#define DT_DatabaseNames (data_tag)18
+#define DT_ElementSetNames (data_tag)19
+#define DT_QueryType (data_tag)20
+#define DT_Query (data_tag)21
+#define DT_SearchStatus (data_tag)22
+#define DT_ResultCount (data_tag)23
+#define DT_NumberOfRecordsReturned (data_tag)24
+#define DT_NextResultSetPosition (data_tag)25
+#define DT_ResultSetStatus (data_tag)26
+#define DT_PresentStatus (data_tag)27
+#define DT_DatabaseDiagnosticRecords (data_tag)28
+#define DT_NumberOfRecordsRequested (data_tag)29
+#define DT_ResultSetStartPosition (data_tag)30
+#define DT_ResultSetID (data_tag)31
+#define DT_DeleteOperation (data_tag)32
+#define DT_DeleteStatus (data_tag)33
+#define DT_NumberNotDeleted (data_tag)34
+#define DT_BulkStatuses (data_tag)35
+#define DT_DeleteMSG (data_tag)36
+#define DT_SecurityChallenge (data_tag)37
+#define DT_SecurityChallengeResponse (data_tag)38
+#define DT_SuspendedFlag (data_tag)39
+#define DT_ResourceReport (data_tag)40
+#define DT_PartialResultsAvailable (data_tag)41
+#define DT_ContinueFlag (data_tag)42
+#define DT_ResultSetWanted (data_tag)43
+
+#define UNUSED -1
+
+/* number of bytes required to represent the following sizes in compressed
+ integer format
+ */
+#define CompressedInt1Byte 128 /* 2 ^ 7 */
+#define CompressedInt2Byte 16384 /* 2 ^ 14 */
+#define CompressedInt3Byte 2097152 /* 2 ^ 21 */
+/* others may follow ... */
+
+/* types of query */
+#define QT_0 "0" /* query whose non-standard format has been agreed upon
+ client and server */
+/* values for InitAPDU option element */
+#define WILL_USE TRUE
+#define WILL_NOT_USE FALSE
+#define WILL_SUPPORT TRUE
+#define WILL_NOT_SUPPORT FALSE
+
+/* values for InitResponseAPDU result element */
+#define ACCEPT TRUE
+#define REJECT FALSE
+
+/* values for SearchResponseAPDU search status element */
+#define SUCCESS 0 /* intuitive huh? */
+#define FAILURE 1
+
+/* values for SearchResponseAPDU result set status element */
+#define SUBSET 1
+#define INTERIM 2
+#define NONE 3
+
+/* values for SearchResponseAPDU present status element */
+/* SUCCESS already defined */
+#define PARTIAL_1 1
+#define PARTIAL_2 2
+#define PARTIAL_3 3
+#define PARTIAL_4 4
+#define PS_NONE 5 /* can't use NONE since it was used by result
+ set status */
+
+#define DIAGNOSTIC_CODE_SIZE (size_t)3
+
+ typedef struct diagnosticRecord {
+ boolean SURROGATE;
+ char DIAG[DIAGNOSTIC_CODE_SIZE];
+ char *ADDINFO;
+ } diagnosticRecord;
+
+#define D_PermanentSystemError "S1"
+#define D_TemporarySystemError "S2"
+#define D_UnsupportedSearch "S3"
+#define D_TermsOnlyStopWords "S5"
+#define D_TooManyArgumentWords "S6"
+#define D_TooManyBooleanOperators "S7"
+#define D_TooManyTruncatedWords "S8"
+#define D_TooMany IncompleteSubfields "S9"
+#define D_TruncatedWordsTooShort "SA"
+#define D_InvalidFormatForRecordNumber "SB"
+#define D_TooManyCharactersInSearch "SC"
+#define D_TooManyRecordsRetrieved "SD"
+#define D_PresentRequestOutOfRange "SF"
+#define D_SystemErrorInPresentRecords "SG"
+#define D_RecordNotAuthorizedToBeSent "SH"
+#define D_RecordExceedsPrefMessageSize "SI"
+#define D_RecordExceedsMaxRecordSize "SJ"
+#define D_ResultSetNotSuppAsSearchTerm "SK"
+#define D_OnlyOneRsltSetAsSrchTermSupp "SL"
+#define D_OnlyANDingOfASnglRsltSetSupp "SM"
+#define D_RsltSetExistsNoReplace "SN"
+#define D_ResultSetNamingNotSupported "SO"
+#define D_CombinationDatabasesNotSupp "SP"
+#define D_ElementSetNamesNotSupported "SQ"
+#define D_ElementSetNameNotValid "SR"
+#define D_OnlyASingleElmntSetNameSupp "SS"
+#define D_ResultSetDeletedByTarget "ST"
+#define D_ResultSetIsInUse "SU"
+#define D_DatabasesIsLocked "SV"
+#define D_TerminatedByNoContinueResp "SW"
+#define D_ResultSetDoesNotExist "SX"
+#define D_ResExNoResultsAvailable "SY"
+#define D_ResExUnpredictableResults "SZ"
+#define D_ResExValidSubsetOfResults "T1"
+#define D_AccessControlFailure "T2"
+#define D_SecurityNotIssuedReqTerm "T3"
+#define D_SecurityNotBeIssuedRecNotInc "T4"
+
+/*----------------------------------------------------------------------*/
+
+/* for internal error handling */
+
+ extern char *readErrorPosition; /* pos where buf stopped making sense */
+
+/* the following are macros so that they can return OUT of the function
+ which calls them
+ */
+
+#define RETURN_ON_NULL(var) \
+ if (var == NULL) \
+ return(NULL); /* jump out of caller */
+
+#define REPORT_READ_ERROR(pos) \
+ { readErrorPosition = (pos); \
+ return(NULL); /* jump out of caller */ \
+ }
+
+#define CHECK_FOR_SPACE_LEFT(spaceNeeded,spaceLeft) \
+ { if (*spaceLeft >= spaceNeeded) \
+ (*spaceLeft) -= spaceNeeded; \
+ else \
+ { *spaceLeft = 0; \
+ return(NULL); /* jump out of the caller */ \
+ } \
+ }
+
+/*----------------------------------------------------------------------*/
+
+ diagnosticRecord *makeDiag(boolean surrogate, char *code, char *addInfo);
+ void freeDiag(diagnosticRecord * diag);
+ char *writeDiag(diagnosticRecord * diag, char *buffer, long *len);
+ char *readDiag(diagnosticRecord ** diag, char *buffer);
+
+ char *writeCompressedInteger(unsigned long num, char *buf, long *len);
+ char *readCompressedInteger(unsigned long *num, char *buf);
+ char *writeCompressedIntWithPadding(unsigned long num, unsigned long size,
+ char *buffer, long *len);
+ unsigned long writtenCompressedIntSize(unsigned long num);
+
+ char *writeTag(data_tag tag, char *buf, long *len);
+ char *readTag(data_tag *tag, char *buf);
+ data_tag peekTag(char *buf);
+ unsigned long writtenTagSize(data_tag tag);
+
+ any *makeAny(unsigned long size, char *data);
+ void freeAny(any *a);
+ any *duplicateAny(any *a);
+ char *writeAny(any *a, data_tag tag, char *buffer, long *len);
+ char *readAny(any **anAny, char *buffer);
+ unsigned long writtenAnySize(data_tag tag, any *a);
+
+ any *stringToAny(char *s);
+ char *anyToString(any *a);
+ unsigned long writtenStringSize(data_tag tag, char *s);
+
+ any *longToAny(long Num);
+ long anyToLong(any *a);
+
+ char *writeString(char *s, data_tag tag, char *buffer, long *len);
+ char *readString(char **s, char *buffer);
+
+ bit_map *makeBitMap(unsigned long numBits, ...);
+
+ void freeBitMap(bit_map *bm);
+ boolean bitAtPos(unsigned long pos, bit_map *bm);
+ char *writeBitMap(bit_map *bm, data_tag tag, char *buffer, long *len);
+ char *readBitMap(bit_map **bm, char *buffer);
+
+ char *writeByte(unsigned long byte, char *buf, long *len);
+ char *readByte(unsigned char *byte, char *buf);
+
+ char *writeBoolean(boolean flag, char *buf, long *len);
+ char *readBoolean(boolean *flag, char *buf);
+
+ char *writePDUType(pdu_type pduType, char *buf, long *len);
+ char *readPDUType(pdu_type *pduType, char *buf);
+ pdu_type peekPDUType(char *buf);
+
+ char *writeBinaryInteger(long num, unsigned long size,
+ char *buf, long *len);
+ char *readBinaryInteger(long *num, unsigned long size, char *buf);
+ unsigned long writtenCompressedBinIntSize(long num);
+
+ char *writeNum(long num, data_tag tag, char *buffer, long *len);
+ char *readNum(long *num, char *buffer);
+ unsigned long writtenNumSize(data_tag tag, long num);
+
+ void doList(void **list, void (*func) (void *));
+
+ char *writeProtocolVersion(char *buf, long *len);
+ char *defaultImplementationID(void);
+ char *defaultImplementationName(void);
+ char *defaultImplementationVersion(void);
+
+/*----------------------------------------------------------------------*/
+
+/*
+ * Routines originally from ZType1.c -- FM
+ *
+ *----------------------------------------------------------------------*/
+
+/* This file implements the type 1 query defined in appendices B & C
+ of the SR 1 spec.
+ */
+
+/*----------------------------------------------------------------------*/
+/* types and constants */
+
+/* new data tags */
+#define DT_AttributeList (data_tag)44
+#define DT_Term (data_tag)45
+#define DT_Operator (data_tag)46
+
+#define QT_BooleanQuery "1" /* standard boolean query */
+
+/* general attribute code - use in place of any attribute */
+#define IGNORE "ig"
+
+/* use value codes */
+#define UV_ISBN "ub"
+#define CORPORATE_NAME "uc"
+#define ISSN "us"
+#define PERSONAL_NAME "up"
+#define SUBJECT "uj"
+#define TITLE "ut"
+#define GEOGRAPHIC_NAME "ug"
+#define CODEN "ud"
+#define SUBJECT_SUBDIVISION "ue"
+#define SERIES_TITLE "uf"
+#define MICROFORM_GENERATION "uh"
+#define PLACE_OF_PUBLICATION "ui"
+#define NUC_CODE "uk"
+#define LANGUAGE "ul"
+#define COMBINATION_OF_USE_VALUES "um"
+#define SYSTEM_CONTROL_NUMBER "un"
+#define DATE "uo"
+#define LC_CONTROL_NUMBER "ur"
+#define MUSIC_PUBLISHERS_NUMBER "uu"
+#define GOVERNMENT_DOCUMENTS_NUMBER "uv"
+#define SUBJECT_CLASSIFICATION "uw"
+#define RECORD_TYPE "uy"
+
+/* relation value codes */
+#define EQUAL "re"
+#define GREATER_THAN "rg"
+#define GREATER_THAN_OR_EQUAL "ro"
+#define LESS_THAN "rl"
+#define LESS_THAN_OR_EQUAL "rp"
+#define NOT_EQUAL "rn"
+
+/* position value codes */
+#define FIRST_IN_FIELD "pf"
+#define FIRST_IN_SUBFIELD "ps"
+#define FIRST_IN_A_SUBFIELD "pa"
+#define FIRST_IN_NOT_A_SUBFIELD "pt"
+#define ANY_POSITION_IN_FIELD "py"
+
+/* structure value codes */
+#define PHRASE "sp"
+#define WORD "sw"
+#define KEY "sk"
+#define WORD_LIST "sl"
+
+/* truncation value codes */
+#define NO_TRUNCATION "tn"
+#define RIGHT_TRUNCATION "tr"
+#define PROC_NUM_INCLUDED_IN_SEARCH_ARG "ti"
+
+/* completeness value codes */
+#define INCOMPLETE_SUBFIELD "ci"
+#define COMPLETE_SUBFIELD "cs"
+#define COMPLETEFIELD "cf"
+
+/* operator codes */
+#define AND "a"
+#define OR "o"
+#define AND_NOT "n"
+
+/* term types */
+#define TT_Attribute 1
+#define TT_ResultSetID 2
+#define TT_Operator 3
+
+#define ATTRIBUTE_SIZE 3
+#define OPERATOR_SIZE 2
+
+ typedef struct query_term {
+ /* type */
+ long TermType;
+ /* for term */
+ char Use[ATTRIBUTE_SIZE + 1];
+ char Relation[ATTRIBUTE_SIZE + 1];
+ char Position[ATTRIBUTE_SIZE + 1];
+ char Structure[ATTRIBUTE_SIZE + 1];
+ char Truncation[ATTRIBUTE_SIZE + 1];
+ char Completeness[ATTRIBUTE_SIZE + 1];
+ any *Term;
+ /* for result set */
+ any *ResultSetID;
+ /* for operator */
+ char Operator[OPERATOR_SIZE];
+ } query_term;
+
+/*----------------------------------------------------------------------*/
+/* functions */
+
+ query_term *makeAttributeTerm(char *use, char *relation, char *position, char *structure,
+ char *truncation, char *completeness, any *term);
+ query_term *makeResultSetTerm(any *resultSet);
+ query_term *makeOperatorTerm(char *operatorCode);
+ void freeTerm(void *qt);
+ char *writeQueryTerm(query_term *qt, char *buffer, long *len);
+ char *readQueryTerm(query_term **qt, char *buffer);
+ any *writeQuery(query_term **terms);
+ query_term **readQuery(any *info);
+
+/*----------------------------------------------------------------------*/
+
+/*
+ * Routines originally from UI.c -- FM
+ *
+ *----------------------------------------------------------------------*/
+
+ char *generate_retrieval_apdu(char *buff,
+ long *buff_len,
+ any *docID,
+ long chunk_type,
+ long start_line, long end_line,
+ char *type,
+ char *database_name);
+
+ long interpret_message(char *request_message,
+ long request_length,
+ char *response_message,
+ long response_buffer_length, /* length of the buffer (modified) */
+ long connection,
+ boolean verbose);
+
+ char *trim_junk(char *headline);
+
+/*
+ * Routines originally from ZProt.c -- FM
+ *
+ *----------------------------------------------------------------------*/
+
+/* APDU types */
+
+ typedef struct InitAPDU {
+ pdu_type PDUType;
+ boolean willSearch, willPresent, willDelete;
+ boolean supportAccessControl, supportResourceControl;
+ long PreferredMessageSize;
+ long MaximumRecordSize;
+ char *IDAuthentication;
+ char *ImplementationID;
+ char *ImplementationName;
+ char *ImplementationVersion;
+ any *ReferenceID;
+ void *UserInformationField;
+ } InitAPDU;
+
+ typedef struct InitResponseAPDU {
+ pdu_type PDUType;
+ boolean Result;
+ boolean willSearch, willPresent, willDelete;
+ boolean supportAccessControl, supportResourceControl;
+ long PreferredMessageSize;
+ long MaximumRecordSize;
+ char *IDAuthentication;
+ char *ImplementationID;
+ char *ImplementationName;
+ char *ImplementationVersion;
+ any *ReferenceID;
+ void *UserInformationField;
+ } InitResponseAPDU;
+
+ typedef struct SearchAPDU {
+ pdu_type PDUType;
+ long SmallSetUpperBound;
+ long LargeSetLowerBound;
+ long MediumSetPresentNumber;
+ boolean ReplaceIndicator;
+ char *ResultSetName;
+ char **DatabaseNames;
+ char *QueryType;
+ char **ElementSetNames;
+ any *ReferenceID;
+ void *Query;
+ } SearchAPDU;
+
+ typedef struct SearchResponseAPDU {
+ pdu_type PDUType;
+ long SearchStatus;
+ long ResultCount;
+ long NumberOfRecordsReturned;
+ long NextResultSetPosition;
+ long ResultSetStatus;
+ long PresentStatus;
+ any *ReferenceID;
+ void *DatabaseDiagnosticRecords;
+ } SearchResponseAPDU;
+
+ typedef struct PresentAPDU {
+ pdu_type PDUType;
+ long NumberOfRecordsRequested;
+ long ResultSetStartPosition;
+ char *ResultSetID;
+ char *ElementSetNames;
+ any *ReferenceID;
+ void *PresentInfo;
+ } PresentAPDU;
+
+ typedef struct PresentResponseAPDU {
+ pdu_type PDUType;
+ boolean PresentStatus;
+ long NumberOfRecordsReturned;
+ long NextResultSetPosition;
+ any *ReferenceID;
+ void *DatabaseDiagnosticRecords;
+ } PresentResponseAPDU;
+
+/*----------------------------------------------------------------------*/
+/* Functions */
+
+ InitAPDU *makeInitAPDU(boolean search, boolean present, boolean deleteIt,
+ boolean accessControl, boolean resourceControl, long prefMsgSize,
+ long maxMsgSize,
+ char *auth,
+ char *id,
+ char *name,
+ char *version,
+ any *refID,
+ void *userInfo);
+ void freeInitAPDU(InitAPDU * init);
+ char *writeInitAPDU(InitAPDU * init, char *buffer, long *len);
+ char *readInitAPDU(InitAPDU ** init, char *buffer);
+
+ InitResponseAPDU *makeInitResponseAPDU(boolean result,
+ boolean search,
+ boolean present,
+ boolean deleteIt,
+ boolean accessControl,
+ boolean resourceControl,
+ long prefMsgSize,
+ long maxMsgSize,
+ char *auth,
+ char *id,
+ char *name,
+ char *version,
+ any *refID,
+ void *userInfo);
+ void freeInitResponseAPDU(InitResponseAPDU *init);
+ char *writeInitResponseAPDU(InitResponseAPDU *init, char *buffer, long *len);
+ char *readInitResponseAPDU(InitResponseAPDU **init, char *buffer);
+ InitResponseAPDU *replyToInitAPDU(InitAPDU * init, boolean result, void *userInfo);
+
+ SearchAPDU *makeSearchAPDU(long small, long large, long medium,
+ boolean replace, char *name, char **databases,
+ char *type, char **elements, any *refID, void *queryInfo);
+ void freeSearchAPDU(SearchAPDU *query);
+ char *writeSearchAPDU(SearchAPDU *query, char *buffer, long *len);
+ char *readSearchAPDU(SearchAPDU **query, char *buffer);
+
+ SearchResponseAPDU *makeSearchResponseAPDU(long result, long count,
+ long recordsReturned, long nextPos,
+ long resultStatus, long presentStatus,
+ any *refID, void *records);
+ void freeSearchResponseAPDU(SearchResponseAPDU *queryResponse);
+ char *writeSearchResponseAPDU(SearchResponseAPDU *queryResponse, char
+ *buffer, long *len);
+ char *readSearchResponseAPDU(SearchResponseAPDU **queryResponse, char *buffer);
+
+ PresentAPDU *makePresentAPDU(long recsReq, long startPos,
+ char *resultID, any *refID, void *info);
+ void freePresentAPDU(PresentAPDU * present);
+ char *writePresentAPDU(PresentAPDU * present, char *buffer, long *len);
+ char *readPresentAPDU(PresentAPDU ** present, char *buffer);
+
+ PresentResponseAPDU *makePresentResponseAPDU(boolean status, long recsRet,
+ long nextPos, any *refID,
+ void *records);
+ void freePresentResponseAPDU(PresentResponseAPDU * present);
+ char *writePresentResponseAPDU(PresentResponseAPDU * present, char
+ *buffer, long *len);
+ char *readPresentResponseAPDU(PresentResponseAPDU ** present, char *buffer);
+
+/*----------------------------------------------------------------------*/
+/* user extension hooks: */
+
+ extern char *writeInitInfo(InitAPDU * init, char *buffer, long *len);
+ extern char *readInitInfo(void **info, char *buffer);
+
+ extern char *writeInitResponseInfo(InitResponseAPDU *init, char *buffer, long *len);
+ extern char *readInitResponseInfo(void **info, char *buffer);
+
+ extern char *writeSearchInfo(SearchAPDU *query, char *buffer, long *len);
+ extern char *readSearchInfo(void **info, char *buffer);
+
+ extern char *writeSearchResponseInfo(SearchResponseAPDU *query, char
+ *buffer, long *len);
+ extern char *readSearchResponseInfo(void **info, char *buffer);
+
+ extern char *writePresentInfo(PresentAPDU * present, char *buffer, long *len);
+ extern char *readPresentInfo(void **info, char *buffer);
+
+ extern char *writePresentResponseInfo(PresentResponseAPDU * present, char
+ *buffer, long *len);
+ extern char *readPresentResponseInfo(void **info, char *buffer);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* HTVMSWAIS_H */
diff --git a/WWW/Library/Implementation/HTWAIS.c b/WWW/Library/Implementation/HTWAIS.c
new file mode 100644
index 0000000..3c9fb0a
--- /dev/null
+++ b/WWW/Library/Implementation/HTWAIS.c
@@ -0,0 +1,1078 @@
+/*
+ * $LynxId: HTWAIS.c,v 1.40 2020/01/21 22:22:15 tom Exp $
+ *
+ * WorldWideWeb - Wide Area Information Server Access HTWAIS.c
+ * ==================================================
+ *
+ * This module allows a WWW server or client to read data from a
+ * remote WAIS
+ * server, and provide that data to a WWW client in hypertext form.
+ * Source files, once retrieved, are stored and used to provide
+ * information about the index when that is acessed.
+ *
+ * Authors
+ * BK Brewster Kahle, Thinking Machines, <Brewster@think.com>
+ * TBL Tim Berners-Lee, CERN <timbl@info.cern.ch>
+ * FM Foteos Macrides, WFEB <macrides@sci.wfeb.edu>
+ *
+ * History
+ * Sep 91 TBL adapted shell-ui.c (BK) with HTRetrieve.c from WWW.
+ * Feb 91 TBL Generated HTML cleaned up a bit (quotes, escaping)
+ * Refers to lists of sources.
+ * Mar 93 TBL Lib 2.0 compatible module made.
+ * May 94 FM Added DIRECT_WAIS support for VMS.
+ *
+ * Bugs
+ * Uses C stream i/o to read and write sockets, which won't work
+ * on VMS TCP systems.
+ *
+ * Should cache connections.
+ *
+ * ANSI C only as written
+ *
+ * Bugs fixed
+ * NT Nathan Torkington (Nathan.Torkington@vuw.ac.nz)
+ *
+ * WAIS comments:
+ *
+ * 1. Separate directories for different system's .o would help
+ * 2. Document ids are rather long!
+ *
+ * W WW Address mapping convention:
+ *
+ * /servername/database/type/length/document-id
+ *
+ * /servername/database?word+word+word
+ */
+/* WIDE AREA INFORMATION SERVER SOFTWARE:
+ No guarantees or restrictions. See the readme file for the full standard
+ disclaimer.
+
+ Brewster@think.com
+*/
+
+#include <HTUtils.h>
+#include <HTParse.h>
+#include <HTAccess.h> /* We implement a protocol */
+#include <HTML.h> /* The object we will generate */
+#include <HTWSRC.h>
+#include <HTTCP.h>
+#include <HTCJK.h>
+#include <HTAlert.h>
+#include <LYStrings.h>
+
+#undef lines /* term.h conflict with wais.h */
+#undef alloca /* alloca.h conflict with wais.h */
+
+/* From WAIS
+ * ---------
+ */
+#ifdef VMS
+#include <HTVMS_WaisUI.h>
+#include <HTVMS_WaisProt.h>
+#elif defined(HAVE_WAIS_H)
+#include <wais.h>
+#else
+#include <ui.h>
+#endif /* VMS */
+
+#define MAX_MESSAGE_LEN 100000
+#define CHARS_PER_PAGE 10000 /* number of chars retrieved in each request */
+
+#define WAISSEARCH_DATE "Fri Jul 19 1991"
+
+/* FROM WWW
+ * --------
+ */
+#include <LYUtils.h>
+#include <LYLeaks.h>
+
+#define DIRECTORY "/cnidr.org:210/directory-of-servers"
+/* #define DIRECTORY "/quake.think.com:210/directory-of-servers" */
+
+#define BIG 1024 /* identifier size limit @@@@@ */
+
+#define BUFFER_SIZE 4096 /* Arbitrary size for efficiency */
+
+#define HEX_ESCAPE '%'
+
+static BOOL as_gate; /* Client is using us as gateway */
+
+static char line[2048]; /* For building strings to display */
+
+ /* Must be able to take id */
+
+#define PUTC(c) (*target->isa->put_character)(target, c)
+#define PUTS(s) (*target->isa->put_string)(target, s)
+#define START(e) (*target->isa->start_element)(target, e, 0, 0, -1, 0)
+#define END(e) (*target->isa->end_element)(target, e, 0)
+#define MAYBE_END(e) if (HTML_dtd.tags[e].contents != SGML_EMPTY) \
+ (*target->isa->end_element)(target, e, 0)
+#define FREE_TARGET (*target->isa->_free)(target)
+
+struct _HTStructured {
+ const HTStructuredClass *isa;
+ /* ... */
+};
+
+/* ------------------------------------------------------------------------ */
+/* ---------------- Local copy of connect_to_server calls ----------------- */
+/* ------------------------------------------------------------------------ */
+/* Returns 1 on success, 0 on fail, -1 on interrupt. */
+static int fd_mosaic_connect_to_server(char *host_name,
+ long port,
+ long *fd)
+{
+ char *dummy = NULL;
+ int status;
+ int result;
+
+ HTSprintf0(&dummy, "%s//%s:%ld/", STR_WAIS_URL, host_name, port);
+
+ status = HTDoConnect(dummy, "WAIS", 210, (int *) fd);
+ if (status == HT_INTERRUPTED) {
+ result = -1;
+ } else if (status < 0) {
+ result = 0;
+ } else {
+ result = 1;
+ }
+ FREE(dummy);
+ return result;
+}
+
+/* Returns 1 on success, 0 on fail, -1 on interrupt. */
+#ifdef VMS
+static int mosaic_connect_to_server(char *host_name,
+ long port,
+ long *fdp)
+#else
+static int mosaic_connect_to_server(char *host_name,
+ long port,
+ FILE **fp)
+#endif /* VMS */
+{
+#ifndef VMS
+ FILE *file;
+#endif /* VMS */
+ long fd;
+ int rv;
+
+ rv = fd_mosaic_connect_to_server(host_name, port, &fd);
+ if (rv == 0) {
+ HTAlert(gettext("Could not connect to WAIS server."));
+ return 0;
+ } else if (rv == -1) {
+ HTAlert(CONNECTION_INTERRUPTED);
+ return -1;
+ }
+#ifndef VMS
+ if ((file = fdopen(fd, "r+")) == NULL) {
+ HTAlert(gettext("Could not open WAIS connection for reading."));
+ return 0;
+ }
+
+ *fp = file;
+#else
+ *fdp = fd;
+#endif /* VMS */
+ return 1;
+}
+/* ------------------------------------------------------------------------ */
+/* ------------------------------------------------------------------------ */
+
+/* showDiags
+*/
+/* modified from Jonny G's version in ui/question.c */
+static void showDiags(HTStream *target, diagnosticRecord ** d)
+{
+ long i;
+
+ for (i = 0; d[i] != NULL; i++) {
+ if (d[i]->ADDINFO != NULL) {
+ PUTS(gettext("Diagnostic code is "));
+ PUTS(d[i]->DIAG);
+ PUTC(' ');
+ PUTS(d[i]->ADDINFO);
+ PUTC('\n');
+ }
+ }
+}
+
+/* Matrix of allowed characters in filenames
+ * -----------------------------------------
+ */
+
+static BOOL acceptable[256];
+static BOOL acceptable_inited = NO;
+
+static void init_acceptable(void)
+{
+ unsigned int i;
+ char *good =
+ "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789./-_$";
+
+ for (i = 0; i < 256; i++)
+ acceptable[i] = NO;
+ for (; *good; good++)
+ acceptable[(unsigned int) *good] = YES;
+ acceptable_inited = YES;
+}
+
+/* Transform file identifier into WWW address
+ * ------------------------------------------
+ *
+ *
+ * On exit,
+ * returns nil if error
+ * pointer to malloced string (must be freed) if ok
+ */
+static char *WWW_from_archie(char *file)
+{
+ char *end;
+ char *result;
+ char *colon;
+
+ for (end = file; *end > ' '; end++) ; /* assumes ASCII encoding */
+ result = (char *) malloc(10 + (end - file));
+ if (!result)
+ return result; /* Malloc error */
+ strcpy(result, "file://");
+ StrNCat(result, file, end - file);
+ colon = StrChr(result + 7, ':'); /* Expect colon after host */
+ if (colon) {
+ for (; colon[0]; colon[0] = colon[1], colon++) ; /* move down */
+ }
+ return result;
+} /* WWW_from_archie */
+
+/* Transform document identifier into URL
+ * --------------------------------------
+ *
+ * Bugs: A static buffer of finite size is used!
+ * The format of the docid MUST be good!
+ *
+ * On exit,
+ * returns nil if error
+ * pointer to malloced string (must be freed) if ok
+ */
+static char hex[17] = "0123456789ABCDEF";
+
+static char *WWW_from_WAIS(any *docid)
+{
+ static char buf[BIG];
+ char *q = buf;
+ char *p = (docid->bytes);
+ char *result = NULL;
+ int i, l;
+
+ if (TRACE) {
+ char *p2;
+
+ fprintf(tfp, "WAIS id (%d bytes) is ", (int) docid->size);
+ for (p2 = docid->bytes; p2 < docid->bytes + docid->size; p2++) {
+ if ((*p2 >= ' ') && (*p2 <= '~')) /* Assume ASCII! */
+ fprintf(tfp, "%c", *p2);
+ else
+ fprintf(tfp, "<%x>", (unsigned) *p2);
+ }
+ fprintf(tfp, "\n");
+ }
+ for (p = docid->bytes;
+ (p < docid->bytes + docid->size) && (q < &buf[BIG]);) {
+ CTRACE((tfp, " Record type %d, length %d\n", p[0], p[1]));
+ if (*p > 10) {
+ CTRACE((tfp, "Eh? DOCID record type of %d!\n", *p));
+ return 0;
+ } { /* Bug fix -- allow any byte value 15 Apr 93 */
+ unsigned int i2 = (unsigned) *p++;
+
+ if (i2 > 99) {
+ *q++ = (i2 / 100) + '0';
+ i2 = i2 % 100;
+ }
+ if (i2 > 9) {
+ *q++ = (i2 / 10) + '0';
+ i2 = i2 % 10;
+ }
+ *q++ = i2 + '0'; /* Record type */
+ }
+ *q++ = '='; /* Separate */
+ l = *p++; /* Length */
+ for (i = 0; i < l; i++, p++) {
+ if (!acceptable[UCH(*p)]) {
+ *q++ = HEX_ESCAPE; /* Means hex coming */
+ *q++ = hex[(*p) >> 4];
+ *q++ = hex[(*p) & 15];
+ } else
+ *q++ = *p;
+ }
+ *q++ = ';'; /* Terminate field */
+ }
+ *q++ = 0; /* Terminate string */
+ CTRACE((tfp, "WWW form of id: %s\n", buf));
+ StrAllocCopy(result, buf);
+ return result;
+} /* WWW_from_WAIS */
+
+/* Transform URL into WAIS document identifier
+ * -------------------------------------------
+ *
+ * On entry,
+ * docname points to valid name produced originally by
+ * WWW_from_WAIS
+ * On exit,
+ * docid->size is valid
+ * docid->bytes is malloced and must later be freed.
+ */
+static any *WAIS_from_WWW(any *docid, char *docname)
+{
+ char *z; /* Output pointer */
+ char *sor; /* Start of record - points to size field. */
+ char *p; /* Input pointer */
+ char *q; /* Poisition of "=" */
+ char *s; /* Position of semicolon */
+ int n; /* size */
+
+ CTRACE((tfp, "WWW id (to become WAIS id): %s\n", docname));
+ for (n = 0, p = docname; *p; p++) { /* Count sizes of strings */
+ n++;
+ if (*p == ';')
+ n--; /* Not converted */
+ else if (*p == HEX_ESCAPE)
+ n = n - 2; /* Save two bytes */
+ docid->size = n;
+ }
+
+ if (!(docid->bytes = (char *) malloc(docid->size))) /* result record */
+ outofmem(__FILE__, "WAIS_from_WWW");
+ z = docid->bytes;
+
+ for (p = docname; *p;) { /* Convert of strings */
+ /* Record type */
+
+ *z = 0; /* Initialize record type */
+ while (*p >= '0' && *p <= '9') {
+ *z = *z * 10 + (*p++ - '0'); /* Decode decimal record type */
+ }
+ z++;
+ if (*p != '=')
+ return 0;
+ q = p;
+
+ s = StrChr(q, ';'); /* (Check only) */
+ if (!s)
+ return 0; /* Bad! No ';'; */
+ sor = z; /* Remember where the size field was */
+ z++; /* Skip record size for now */
+ for (p = q + 1; *p != ';';) {
+ if (*p == HEX_ESCAPE) {
+ char c;
+ unsigned int b;
+
+ p++;
+ c = *p++;
+ b = from_hex(c);
+ c = *p++;
+ if (!c)
+ break; /* Odd number of chars! */
+ *z++ = (b << 4) + from_hex(c);
+ } else {
+ *z++ = *p++; /* Record */
+ }
+ }
+ *sor = (z - sor - 1); /* Fill in size -- not counting size itself */
+ p++; /* After semicolon: start of next record */
+ }
+
+ if (TRACE) {
+ char *p2;
+
+ fprintf(tfp, "WAIS id (%d bytes) is ", (int) docid->size);
+ for (p2 = docid->bytes; p2 < docid->bytes + docid->size; p2++) {
+ if ((*p2 >= ' ') && (*p2 <= '~')) /* Assume ASCII! */
+ fprintf(tfp, "%c", *p2);
+ else
+ fprintf(tfp, "<%x>", (unsigned) *p2);
+ }
+ fprintf(tfp, "\n");
+ }
+ return docid; /* Ok */
+
+} /* WAIS_from_WWW */
+
+/* Send a plain text record to the client output_text_record()
+ * --------------------------------------
+ */
+static void output_text_record(HTStream *target,
+ WAISDocumentText *record,
+ boolean binary)
+{
+ unsigned long count;
+
+ /* printf(" Text\n");
+ print_any(" DocumentID: ", record->DocumentID);
+ printf(" VersionNumber: %d\n", record->VersionNumber);
+ */
+
+ if (binary) {
+ (*target->isa->put_block) (target,
+ record->DocumentText->bytes,
+ record->DocumentText->size);
+ return;
+ }
+
+ for (count = 0; count < record->DocumentText->size; count++) {
+ long ch = (unsigned char) record->DocumentText->bytes[count];
+
+ if (ch == 27) { /* What is this in for? Tim */
+ /* then we have an escape code */
+ /* if the next letter is '(' or ')', then ignore two letters */
+ if ('(' == record->DocumentText->bytes[count + 1] ||
+ ')' == record->DocumentText->bytes[count + 1])
+ count += 1; /* it is a term marker */
+ else
+ count += 4; /* it is a paragraph marker */
+ } else if (ch == '\n' || ch == '\r') {
+ PUTC('\n');
+ } else if (IS_CJK_TTY || ch == '\t' || isprint(ch)) {
+ PUTC(ch);
+ }
+ }
+} /* output text record */
+
+/* Format A Search response for the client display_search_response
+ * ---------------------------------------
+ */
+/* modified from tracy shen's version in wutil.c
+ * displays either a text record or a set of headlines.
+ */
+static void display_search_response(HTStructured * target, SearchResponseAPDU *response,
+ char *the_database,
+ char *keywords)
+{
+ WAISSearchResponse *info;
+ long i, k;
+
+ BOOL archie = strstr(the_database, "archie") != 0; /* Special handling */
+
+ CTRACE((tfp, "HTWAIS: Displaying search response\n"));
+ PUTS(gettext("Index "));
+ START(HTML_EM);
+ PUTS(the_database);
+ END(HTML_EM);
+ sprintf(line, gettext(" contains the following %d item%s relevant to \""),
+ (int) (response->NumberOfRecordsReturned),
+ response->NumberOfRecordsReturned == 1 ? "" : "s");
+ PUTS(line);
+ START(HTML_EM);
+ PUTS(keywords);
+ END(HTML_EM);
+ PUTS("\".\n");
+ PUTS(gettext("The first figure after each entry is its relative score, "));
+ PUTS(gettext("the second is the number of lines in the item."));
+ START(HTML_BR);
+ START(HTML_BR);
+ PUTC('\n');
+ START(HTML_OL);
+
+ if (response->DatabaseDiagnosticRecords != 0) {
+ info = (WAISSearchResponse *) response->DatabaseDiagnosticRecords;
+ i = 0;
+
+ if (info->Diagnostics != NULL)
+ showDiags((HTStream *) target, info->Diagnostics);
+
+ if (info->DocHeaders != 0) {
+ for (k = 0; info->DocHeaders[k] != 0; k++) {
+ WAISDocumentHeader *head = info->DocHeaders[k];
+ char *headline = trim_junk(head->Headline);
+ any *docid = head->DocumentID;
+ char *docname; /* printable version of docid */
+
+ i++;
+ /*
+ * Make a printable string out of the document id.
+ */
+ CTRACE((tfp, "HTWAIS: %2ld: Score: %4ld, lines:%4ld '%s'\n",
+ i,
+ (long int) (info->DocHeaders[k]->Score),
+ (long int) (info->DocHeaders[k]->Lines),
+ headline));
+
+ START(HTML_LI);
+
+ if (archie) {
+ char *www_name = WWW_from_archie(headline);
+
+ if (www_name) {
+ HTStartAnchor(target, NULL, www_name);
+ PUTS(headline);
+ END(HTML_A);
+ FREE(www_name);
+ } else {
+ PUTS(headline);
+ PUTS(gettext(" (bad file name)"));
+ }
+ } else { /* Not archie */
+ docname = WWW_from_WAIS(docid);
+ if (docname) {
+ if ((head->Types) &&
+ (!strcmp(head->Types[0], "URL"))) {
+ HTStartAnchor(target, NULL, headline);
+ } else {
+ char *dbname = HTEscape(the_database, URL_XPALPHAS);
+ char *w3_address = NULL;
+
+ HTSprintf0(&w3_address,
+ "/%s/%s/%d/%s",
+ dbname,
+ head->Types ? head->Types[0] : "TEXT",
+ (int) (head->DocumentLength),
+ docname);
+ HTStartAnchor(target, NULL, w3_address);
+ FREE(w3_address);
+ FREE(dbname);
+ }
+ PUTS(headline);
+ END(HTML_A);
+ FREE(docname);
+ } else {
+ PUTS(gettext("(bad doc id)"));
+ }
+ }
+
+ sprintf(line, "%5ld %5ld ",
+ head->Score,
+ head->Lines);
+ PUTS(line);
+ MAYBE_END(HTML_LI);
+ } /* next document header */
+ }
+ /* if there were any document headers */
+ if (info->ShortHeaders != 0) {
+ k = 0;
+ while (info->ShortHeaders[k] != 0) {
+ i++;
+ PUTS(gettext("(Short Header record, can't display)"));
+ }
+ }
+ if (info->LongHeaders != 0) {
+ k = 0;
+ while (info->LongHeaders[k] != 0) {
+ i++;
+ PUTS(gettext("\nLong Header record, can't display\n"));
+ }
+ }
+ if (info->Text != 0) {
+ k = 0;
+ while (info->Text[k] != 0) {
+ i++;
+ PUTS(gettext("\nText record\n"));
+ output_text_record((HTStream *) target,
+ info->Text[k++], false);
+ }
+ }
+ if (info->Headlines != 0) {
+ k = 0;
+ while (info->Headlines[k] != 0) {
+ i++;
+ PUTS(gettext("\nHeadline record, can't display\n"));
+ /* dsply_headline_record( info->Headlines[k++]); */
+ }
+ }
+ if (info->Codes != 0) {
+ k = 0;
+ while (info->Codes[k] != 0) {
+ i++;
+ PUTS(gettext("\nCode record, can't display\n"));
+ /* dsply_code_record( info->Codes[k++]); */
+ }
+ }
+ } /* Loop: display user info */
+ END(HTML_OL);
+ PUTC('\n');
+}
+
+/* Load by name HTLoadWAIS
+ * ============
+ *
+ * This renders any object or search as required.
+ */
+int HTLoadWAIS(const char *arg,
+ HTParentAnchor *anAnchor,
+ HTFormat format_out,
+ HTStream *sink)
+#define MAX_KEYWORDS_LENGTH 1000
+#define MAX_SERVER_LENGTH 1000
+#define MAX_DATABASE_LENGTH 1000
+#define MAX_SERVICE_LENGTH 1000
+#define MAXDOCS 200
+
+{
+ char *key; /* pointer to keywords in URL */
+ char *request_message = NULL; /* arbitrary message limit */
+ char *response_message = NULL; /* arbitrary message limit */
+ long request_buffer_length; /* how of the request is left */
+ SearchResponseAPDU *retrieval_response = 0;
+ char keywords[MAX_KEYWORDS_LENGTH + 1];
+ char *the_server_name;
+ char *wais_database = NULL; /* name of current database */
+ char *www_database; /* Same name escaped */
+ char *service;
+ char *doctype;
+ char *doclength;
+ long document_length = 0;
+ char *docname = 0;
+
+#ifdef VMS
+ long connection = 0;
+
+#else
+ FILE *connection = NULL;
+#endif /* VMS */
+ char *names; /* Copy of arg to be hacked up */
+ BOOL ok = NO;
+ int return_status = HT_LOADED;
+ int rv;
+
+ if (!acceptable_inited)
+ init_acceptable();
+
+ /* Decipher and check syntax of WWW address:
+ * ----------------------------------------
+ *
+ * First we remove the "wais:" if it was specified. 920110
+ */
+ names = HTParse(arg, "", PARSE_HOST | PARSE_PATH | PARSE_PUNCTUATION);
+ key = StrChr(names, '?');
+
+ if (key) {
+ char *p;
+
+ *key++ = 0; /* Split off keywords */
+ for (p = key; *p; p++)
+ if (*p == '+')
+ *p = ' ';
+ HTUnEscape(key);
+ }
+ if (names[0] == '/') {
+ the_server_name = names + 1;
+ if ((as_gate = (*the_server_name == '/')) != 0)
+ the_server_name++; /* Accept one or two */
+ www_database = StrChr(the_server_name, '/');
+ if (www_database) {
+ *www_database++ = 0; /* Separate database name */
+ doctype = StrChr(www_database, '/');
+ if (key)
+ ok = YES; /* Don't need doc details */
+ else if (doctype) { /* If not search parse doc details */
+ *doctype++ = 0; /* Separate rest of doc address */
+ doclength = StrChr(doctype, '/');
+ if (doclength) {
+ *doclength++ = 0;
+ document_length = atol(doclength);
+ if (document_length) {
+ docname = StrChr(doclength, '/');
+ if (docname) {
+ *docname++ = 0;
+ ok = YES; /* To avoid a goto! */
+ } /* if docname */
+ } /* if document_length valid */
+ } /* if doclength */
+ } else { /* no doctype? Assume index required */
+ if (!key)
+ key = "";
+ ok = YES;
+ } /* if doctype */
+ } /* if database */
+ }
+
+ if (!ok)
+ return HTLoadError(sink, 500, gettext("Syntax error in WAIS URL"));
+
+ CTRACE((tfp, "HTWAIS: Parsed OK\n"));
+
+ service = StrChr(names, ':');
+ if (service)
+ *service++ = 0;
+ else
+ service = "210";
+
+ if (the_server_name[0] == 0) {
+#ifdef VMS
+ connection = 0;
+#else
+ connection = NULL;
+#endif /* VMS */
+
+ } else if (!(key && !*key)) {
+ int status;
+
+ CTRACE((tfp, "===WAIS=== calling mosaic_connect_to_server\n"));
+ status = mosaic_connect_to_server(the_server_name,
+ atoi(service),
+ &connection);
+ if (status == 0) {
+ CTRACE((tfp, "===WAIS=== connection failed\n"));
+ FREE(names);
+ return HT_NOT_LOADED;
+ } else if (status == -1) {
+ CTRACE((tfp, "===WAIS=== connection interrupted\n"));
+ FREE(names);
+ return HT_NOT_LOADED;
+ }
+ }
+
+ StrAllocCopy(wais_database, www_database);
+ HTUnEscape(wais_database);
+
+ /*
+ * This below fixed size stuff is terrible.
+ */
+#ifdef VMS
+ if ((request_message = typecallocn(char, MAX_MESSAGE_LEN)) == 0)
+ outofmem(__FILE__, "HTLoadWAIS");
+ if ((response_message = typecallocn(char, MAX_MESSAGE_LEN)) == 0)
+ outofmem(__FILE__, "HTLoadWAIS");
+
+#else
+ request_message = (char *) s_malloc((size_t) MAX_MESSAGE_LEN * sizeof(char));
+ response_message = (char *) s_malloc((size_t) MAX_MESSAGE_LEN * sizeof(char));
+#endif /* VMS */
+
+ /*
+ * If keyword search is performed but there are no keywords, the user has
+ * followed a link to the index itself. It would be appropriate at this
+ * point to send him the .SRC file - how?
+ */
+ if (key && !*key) { /* I N D E X */
+#ifdef CACHE_FILE_PREFIX
+ char *filename = NULL;
+ FILE *fp;
+#endif
+ HTStructured *target = HTML_new(anAnchor, format_out, sink);
+
+ START(HTML_HEAD);
+ PUTC('\n');
+ HTStartIsIndex(target, HTWAIS_SOLICIT_QUERY, NULL);
+ PUTC('\n');
+
+ {
+ START(HTML_TITLE);
+ PUTS(wais_database);
+ PUTS(gettext(" (WAIS Index)"));
+ END(HTML_TITLE);
+ PUTC('\n');
+ END(HTML_HEAD);
+ PUTC('\n');
+
+ START(HTML_H1);
+ PUTS(gettext("WAIS Index: "));
+ START(HTML_EM);
+ PUTS(wais_database);
+ END(HTML_EM);
+ END(HTML_H1);
+ PUTC('\n');
+ PUTS(gettext("This is a link for searching the "));
+ START(HTML_EM);
+ PUTS(wais_database);
+ END(HTML_EM);
+ PUTS(gettext(" WAIS Index.\n"));
+
+ }
+ /*
+ * If we have seen a source file for this database, use that.
+ */
+#ifdef CACHE_FILE_PREFIX
+ HTSprintf0(&filename, "%sWSRC-%s:%s:%.100s.txt",
+ CACHE_FILE_PREFIX,
+ the_server_name, service, www_database);
+
+ fp = fopen(filename, "r"); /* Have we found this already? */
+ CTRACE((tfp, "HTWAIS: Description of server %s %s.\n",
+ filename,
+ fp ? "exists already" : "does NOT exist!"));
+
+ if (fp) {
+ char c;
+
+ START(HTML_PRE); /* Preformatted description */
+ PUTC('\n');
+ while ((c = getc(fp)) != EOF)
+ PUTC(c); /* Transfer file */
+ END(HTML_PRE);
+ fclose(fp);
+ }
+ FREE(filename);
+#endif
+ START(HTML_P);
+ PUTS(gettext("\nEnter the 's'earch command and then specify search words.\n"));
+
+ FREE_TARGET;
+ } else if (key) { /* S E A R C H */
+ char *p;
+ HTStructured *target;
+
+ LYStrNCpy(keywords, key, MAX_KEYWORDS_LENGTH);
+ while ((p = StrChr(keywords, '+')) != 0)
+ *p = ' ';
+
+ /*
+ * Send advance title to get something fast to the other end.
+ */
+ target = HTML_new(anAnchor, format_out, sink);
+
+ START(HTML_HEAD);
+ PUTC('\n');
+ HTStartIsIndex(target, HTWAIS_SOLICIT_QUERY, NULL);
+ PUTC('\n');
+ START(HTML_TITLE);
+ PUTS(keywords);
+ PUTS(gettext(" (in "));
+ PUTS(wais_database);
+ PUTC(')');
+ END(HTML_TITLE);
+ PUTC('\n');
+ END(HTML_HEAD);
+ PUTC('\n');
+
+ START(HTML_H1);
+ PUTS(gettext("WAIS Search of \""));
+ START(HTML_EM);
+ PUTS(keywords);
+ END(HTML_EM);
+ PUTS(gettext("\" in: "));
+ START(HTML_EM);
+ PUTS(wais_database);
+ END(HTML_EM);
+ END(HTML_H1);
+ PUTC('\n');
+
+ request_buffer_length = MAX_MESSAGE_LEN; /* Amount left */
+ CTRACE((tfp, "HTWAIS: Search for `%s' in `%s'\n",
+ keywords, wais_database));
+ if (NULL ==
+ generate_search_apdu(request_message + HEADER_LENGTH,
+ &request_buffer_length,
+ keywords, wais_database, NULL, MAXDOCS)) {
+#ifdef VMS
+ HTAlert(gettext("HTWAIS: Request too large."));
+ return_status = HT_NOT_LOADED;
+ FREE_TARGET;
+ goto CleanUp;
+#else
+ panic("request too large");
+#endif /* VMS */
+ }
+
+ HTProgress(gettext("Searching WAIS database..."));
+ rv = interpret_message(request_message,
+ MAX_MESSAGE_LEN - request_buffer_length,
+ response_message,
+ MAX_MESSAGE_LEN,
+ connection,
+ false /* true verbose */
+ );
+
+ if (rv == HT_INTERRUPTED) {
+ HTAlert(gettext("Search interrupted."));
+ return_status = HT_INTERRUPTED;
+ FREE_TARGET;
+ goto CleanUp;
+ } else if (!rv) {
+#ifdef VMS
+ HTAlert(HTWAIS_MESSAGE_TOO_BIG);
+ return_status = HT_NOT_LOADED;
+ FREE_TARGET;
+ goto CleanUp;
+#else
+ panic("returned message too large");
+#endif /* VMS */
+ } else { /* returned message ok */
+ SearchResponseAPDU *query_response = 0;
+
+ readSearchResponseAPDU(&query_response,
+ response_message + HEADER_LENGTH);
+ display_search_response(target,
+ query_response, wais_database, keywords);
+ if (query_response->DatabaseDiagnosticRecords)
+ freeWAISSearchResponse(query_response->DatabaseDiagnosticRecords);
+ freeSearchResponseAPDU(query_response);
+ } /* returned message not too large */
+ FREE_TARGET;
+ } else { /* D O C U M E N T F E T C H */
+ HTFormat format_in;
+ boolean binary; /* how to transfer stuff coming over */
+ HTStream *target;
+ long count;
+ any doc_chunk;
+ any *docid = &doc_chunk;
+
+ CTRACE((tfp,
+ "HTWAIS: Retrieve document id `%s' type `%s' length %ld\n",
+ NonNull(docname), doctype, document_length));
+
+ format_in =
+ !strcmp(doctype, "WSRC") ? HTAtom_for("application/x-wais-source") :
+ !strcmp(doctype, "TEXT") ? HTAtom_for(STR_PLAINTEXT) :
+ !strcmp(doctype, "HTML") ? HTAtom_for(STR_HTML) :
+ !strcmp(doctype, "GIF") ? HTAtom_for("image/gif") :
+ HTAtom_for(STR_BINARY);
+ binary =
+ 0 != strcmp(doctype, "WSRC") &&
+ 0 != strcmp(doctype, "TEXT") &&
+ 0 != strcmp(doctype, "HTML");
+
+ target = HTStreamStack(format_in, format_out, sink, anAnchor);
+ if (!target)
+ return HTLoadError(sink, 500,
+ gettext("Can't convert format of WAIS document"));
+ /*
+ * Decode hex or literal format for document ID.
+ */
+ WAIS_from_WWW(docid, docname);
+
+ /*
+ * Loop over slices of the document.
+ */
+ for (count = 0;
+ count * CHARS_PER_PAGE < document_length;
+ count++) {
+#ifdef VMS
+ char *type = NULL;
+
+ StrAllocCopy(type, doctype);
+#else
+ char *type = s_strdup(doctype); /* Gets freed I guess */
+#endif /* VMS */
+ request_buffer_length = MAX_MESSAGE_LEN; /* Amount left */
+ CTRACE((tfp, "HTWAIS: Slice number %ld\n", count));
+
+ if (HTCheckForInterrupt()) {
+ HTAlert(TRANSFER_INTERRUPTED);
+ (*target->isa->_abort) (target, NULL);
+#ifdef VMS
+ FREE(type);
+#endif /* VMS */
+ return_status = HT_NOT_LOADED;
+ goto CleanUp;
+ }
+
+ if (0 ==
+ generate_retrieval_apdu(request_message + HEADER_LENGTH,
+ &request_buffer_length,
+ docid,
+ CT_byte,
+ count * CHARS_PER_PAGE,
+ (((count + 1) * CHARS_PER_PAGE <= document_length)
+ ? (count + 1) * CHARS_PER_PAGE
+ : document_length),
+ type,
+ wais_database)) {
+#ifdef VMS
+ HTAlert(gettext("HTWAIS: Request too long."));
+ return_status = HT_NOT_LOADED;
+ FREE_TARGET;
+ FREE(type);
+ FREE(docid->bytes);
+ goto CleanUp;
+#else
+ panic("request too long");
+#endif /* VMS */
+ }
+
+ /*
+ * Actually do the transaction given by request_message.
+ */
+ HTProgress(gettext("Fetching WAIS document..."));
+ rv = interpret_message(request_message,
+ MAX_MESSAGE_LEN - request_buffer_length,
+ response_message,
+ MAX_MESSAGE_LEN,
+ connection,
+ false /* true verbose */
+ );
+ if (rv == HT_INTERRUPTED) {
+ HTAlert(TRANSFER_INTERRUPTED);
+ return_status = HT_INTERRUPTED;
+ FREE_TARGET;
+ FREE(type);
+ FREE(docid->bytes);
+ goto CleanUp;
+ } else if (!rv) {
+#ifdef VMS
+ HTAlert(HTWAIS_MESSAGE_TOO_BIG);
+ return_status = HT_NOT_LOADED;
+ FREE_TARGET;
+ FREE(type);
+ FREE(docid->bytes);
+ goto CleanUp;
+#else
+ panic("Returned message too large");
+#endif /* VMS */
+ }
+
+ /*
+ * Parse the result which came back into memory.
+ */
+ readSearchResponseAPDU(&retrieval_response,
+ response_message + HEADER_LENGTH);
+
+ if (NULL ==
+ ((WAISSearchResponse *)
+ retrieval_response->DatabaseDiagnosticRecords)->Text) {
+ /* display_search_response(target, retrieval_response,
+ wais_database, keywords); */
+ PUTS(gettext("No text was returned!\n"));
+ /* panic("No text was returned"); */
+ } else {
+ output_text_record(target,
+ ((WAISSearchResponse *)
+ retrieval_response->DatabaseDiagnosticRecords)->Text[0],
+ binary);
+ } /* If text existed */
+
+#ifdef VMS
+ FREE(type);
+#endif /* VMS */
+ } /* Loop over slices */
+
+ FREE_TARGET;
+ FREE(docid->bytes);
+
+ freeWAISSearchResponse(retrieval_response->DatabaseDiagnosticRecords);
+ freeSearchResponseAPDU(retrieval_response);
+
+ } /* If document rather than search */
+
+ CleanUp:
+ /*
+ * (This postponed until later, after a timeout:)
+ */
+#ifdef VMS
+ if (connection)
+ NETCLOSE((int) connection);
+#else
+ if (connection)
+ fclose(connection);
+#endif /* VMS */
+ FREE(wais_database);
+#ifdef VMS
+ FREE(request_message);
+ FREE(response_message);
+#else
+ s_free(request_message);
+ s_free(response_message);
+#endif /* VMS */
+ FREE(names);
+ return (return_status);
+}
+
+#ifdef GLOBALDEF_IS_MACRO
+#define _HTWAIS_C_1_INIT { "wais", HTLoadWAIS, NULL }
+GLOBALDEF(HTProtocol, HTWAIS, _HTWAIS_C_1_INIT);
+#else
+GLOBALDEF HTProtocol HTWAIS =
+{"wais", HTLoadWAIS, NULL};
+#endif /* GLOBALDEF_IS_MACRO */
diff --git a/WWW/Library/Implementation/HTWAIS.h b/WWW/Library/Implementation/HTWAIS.h
new file mode 100644
index 0000000..4ba6f67
--- /dev/null
+++ b/WWW/Library/Implementation/HTWAIS.h
@@ -0,0 +1,43 @@
+/* WAIS protocol module for the W3 library
+ WAIS PROTOCOL INTERFACE
+
+ This module does not actually perform the WAIS protocol directly, but it does using one
+ or more libraries of the freeWAIS distribution. The ui.a library came with the old free
+ WAIS from TMC, the client.a and wais.a libraries are needed from the freeWAIS from
+ CNIDR.
+
+ If you include this module in the library, you must also
+
+ Register the HTWAIS protocol at initialisation (e.g., HTInit or HTSInit) by compiling
+ it with -DDIRECT_WAIS
+
+ Link with the WAIS libraries
+
+ The wais source files are parsed by a separate and independent module, HTWSRC . You
+ can include HTWSRC without including direct wais using this module, and your WWW code
+ will be able to read source files, and access WAIS indexes through a gateway.
+
+ A WAIS-WWW gateway is just a normal W3 server with a libwww compiled with this module.
+
+ Anyways, this interface won't change much:
+
+ */
+#ifndef HTWAIS_H
+#define HTWAIS_H
+
+#include <HTAccess.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#ifdef GLOBALREF_IS_MACRO
+ extern GLOBALREF (HTProtocol, HTWAIS);
+
+#else
+ GLOBALREF HTProtocol HTWAIS;
+#endif /* GLOBALDEF_IS_MACRO */
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* HTWAIS_H */
diff --git a/WWW/Library/Implementation/HTWSRC.c b/WWW/Library/Implementation/HTWSRC.c
new file mode 100644
index 0000000..ba12cc7
--- /dev/null
+++ b/WWW/Library/Implementation/HTWSRC.c
@@ -0,0 +1,486 @@
+/*
+ * $LynxId: HTWSRC.c,v 1.31 2020/01/21 22:05:46 tom Exp $
+ *
+ * Parse WAIS Source file HTWSRC.c
+ * ======================
+ *
+ * This module parses a stream with WAIS source file
+ * format information on it and creates a structured stream.
+ * That structured stream is then converted into whatever.
+ *
+ * 3 June 93 Bug fix: Won't crash if no description
+ */
+
+#define HTSTREAM_INTERNAL 1
+
+#include <HTUtils.h>
+
+#include <HTWSRC.h>
+#include <LYUtils.h>
+
+#include <HTML.h>
+#include <HTParse.h>
+
+#include <LYLeaks.h>
+
+#define BIG 10000 /* Arbitrary limit to value length */
+#define PARAM_MAX BIG
+#define CACHE_PERIOD (7*86400) /* Time to keep .src file in seconds */
+
+struct _HTStructured {
+ const HTStructuredClass *isa;
+ /* ... */
+};
+
+#define PUTC(c) (*me->target->isa->put_character)(me->target, c)
+#define PUTS(s) (*me->target->isa->put_string)(me->target, s)
+#define START(e) (*me->target->isa->start_element)(me->target, e, 0, 0, -1, 0)
+#define END(e) (*me->target->isa->end_element)(me->target, e, 0)
+#define MAYBE_END(e) if (HTML_dtd.tags[e].contents != SGML_EMPTY) \
+ (*me->target->isa->end_element)(me->target, e, 0)
+
+/* Here are the parameters which can be specified in a source file
+*/
+static const char *par_name[] =
+{
+ "version",
+ "ip-address",
+#define PAR_IP_NAME 2
+ "ip-name",
+#define PAR_TCP_PORT 3
+ "tcp-port",
+#define PAR_DATABASE_NAME 4
+ "database-name",
+#define PAR_COST 5
+ "cost",
+#define PAR_COST_UNIT 6
+ "cost-unit",
+#define PAR_FREE 7
+ "free",
+#define PAR_MAINTAINER 8
+ "maintainer",
+#define PAR_DESCRIPTION 9
+ "description",
+ "keyword-list",
+ "source",
+ "window-geometry",
+ "configuration",
+ "script",
+ "update-time",
+ "contact-at",
+ "last-contacted",
+ "confidence",
+ "num-docs-to-request",
+ "font",
+ "font-size",
+#define PAR_UNKNOWN 22
+ "unknown",
+ 0, /* Terminate list */
+#define PAR_COUNT 23
+};
+
+enum tokenstate {
+ beginning,
+ before_tag,
+ colon,
+ before_value,
+ value,
+ bracketed_value,
+ quoted_value,
+ escape_in_quoted,
+ done
+};
+
+/* Stream Object
+ * ------------
+ *
+ * The target is the structured stream down which the
+ * parsed results will go.
+ *
+ * all the static stuff below should go in here to make it reentrant
+ */
+
+struct _HTStream {
+ const HTStreamClass *isa;
+ HTStructured *target;
+ char *par_value[PAR_COUNT];
+ enum tokenstate state;
+ char param[BIG + 1];
+ int param_number;
+ int param_count;
+};
+
+/* Decode one hex character
+*/
+char from_hex(char c)
+{
+ return (char) ((c >= '0') && (c <= '9') ? c - '0'
+ : (c >= 'A') && (c <= 'F') ? c - 'A' + 10
+ : (c >= 'a') && (c <= 'f') ? c - 'a' + 10
+ : 0);
+}
+
+/* State machine
+ * -------------
+ *
+ * On entry,
+ * me->state is a valid state (see WSRC_init)
+ * c is the next character
+ * On exit,
+ * returns 1 Done with file
+ * 0 Continue. me->state is updated if necessary.
+ * -1 Syntax error error
+ */
+
+/* Treat One Character
+ * -------------------
+ */
+static void WSRCParser_put_character(HTStream *me, int c)
+{
+ switch (me->state) {
+ case beginning:
+ if (c == '(')
+ me->state = before_tag;
+ break;
+
+ case before_tag:
+ if (c == ')') {
+ me->state = done;
+ return; /* Done with input file */
+ } else if (c == ':') {
+ me->param_count = 0;
+ me->state = colon;
+ } /* Ignore other text */
+ break;
+
+ case colon:
+ if (WHITE(c)) {
+ me->param[me->param_count++] = 0; /* Terminate */
+ for (me->param_number = 0;
+ par_name[me->param_number];
+ me->param_number++) {
+ if (0 == strcmp(par_name[me->param_number], me->param)) {
+ break;
+ }
+ }
+ if (!par_name[me->param_number]) { /* Unknown field */
+ CTRACE((tfp, "HTWSRC: Unknown field `%s' in source file\n",
+ me->param));
+ me->param_number = PAR_UNKNOWN;
+ me->state = before_value; /* Could be better ignore */
+ return;
+ }
+ me->state = before_value;
+ } else {
+ if (me->param_count < PARAM_MAX)
+ me->param[me->param_count++] = (char) c;
+ }
+ break;
+
+ case before_value:
+ if (c == ')') {
+ me->state = done;
+ return; /* Done with input file */
+ }
+ if (WHITE(c))
+ return; /* Skip white space */
+ me->param_count = 0;
+ if (c == '"') {
+ me->state = quoted_value;
+ } else {
+ me->state = ((c == '(')
+ ? bracketed_value
+ : value);
+ me->param[me->param_count++] = (char) c; /* Don't miss first character */
+ }
+ break;
+
+ case value:
+ if (WHITE(c)) {
+ me->param[me->param_count] = 0;
+ StrAllocCopy(me->par_value[me->param_number], me->param);
+ me->state = before_tag;
+ } else {
+ if (me->param_count < PARAM_MAX)
+ me->param[me->param_count++] = (char) c;
+ }
+ break;
+
+ case bracketed_value:
+ if (c == ')') {
+ me->param[me->param_count] = 0;
+ StrAllocCopy(me->par_value[me->param_number], me->param);
+ me->state = before_tag;
+ break;
+ }
+ if (me->param_count < PARAM_MAX)
+ me->param[me->param_count++] = (char) c;
+ break;
+
+ case quoted_value:
+ if (c == '"') {
+ me->param[me->param_count] = 0;
+ StrAllocCopy(me->par_value[me->param_number], me->param);
+ me->state = before_tag;
+ break;
+ }
+
+ if (c == '\\') { /* Ignore escape but switch state */
+ me->state = escape_in_quoted;
+ break;
+ }
+ /* Fall through! */
+
+ case escape_in_quoted:
+ if (me->param_count < PARAM_MAX)
+ me->param[me->param_count++] = (char) c;
+ me->state = quoted_value;
+ break;
+
+ case done: /* Ignore anything after EOF */
+ return;
+
+ } /* switch me->state */
+}
+
+/* Open Cache file
+ * ===============
+ *
+ * Bugs: Maybe for filesystem-challenged platforms (MSDOS for example) we
+ * should make a hash code for the filename.
+ */
+
+#ifdef CACHE_FILE_PREFIX
+static BOOL write_cache(HTStream *me)
+{
+ FILE *fp;
+ char *cache_file_name = NULL;
+ char *www_database;
+ int result = NO;
+
+ if (!me->par_value[PAR_DATABASE_NAME]
+ || !me->par_value[PAR_IP_NAME]
+ )
+ return NO;
+
+ www_database = HTEscape(me->par_value[PAR_DATABASE_NAME], URL_XALPHAS);
+ HTSprintf0(&cache_file_name, "%sWSRC-%s:%s:%.100s.txt",
+ CACHE_FILE_PREFIX,
+ me->par_value[PAR_IP_NAME],
+ (me->par_value[PAR_TCP_PORT]
+ ? me->par_value[PAR_TCP_PORT]
+ : "210"),
+ www_database);
+
+ if ((fp = fopen(cache_file_name, TXT_W)) != 0) {
+ result = YES;
+ if (me->par_value[PAR_DESCRIPTION])
+ fputs(me->par_value[PAR_DESCRIPTION], fp);
+ else
+ fputs("Description not available\n", fp);
+ fclose(fp);
+ }
+ FREE(www_database);
+ FREE(cache_file_name);
+ return result;
+}
+#endif
+
+/* Output equivalent HTML
+ * ----------------------
+ *
+ */
+
+static void give_parameter(HTStream *me, int p)
+{
+ PUTS(par_name[p]);
+ if (me->par_value[p]) {
+ PUTS(": ");
+ PUTS(me->par_value[p]);
+ PUTS("; ");
+ } else {
+ PUTS(gettext(" NOT GIVEN in source file; "));
+ }
+}
+
+/* Generate Output
+ * ===============
+ */
+static void WSRC_gen_html(HTStream *me, int source_file)
+{
+ if (me->par_value[PAR_DATABASE_NAME]) {
+ char *shortname = 0;
+ int l;
+
+ StrAllocCopy(shortname, me->par_value[PAR_DATABASE_NAME]);
+ l = (int) strlen(shortname);
+ if (l > 4 && !strcasecomp(shortname + l - 4, ".src")) {
+ shortname[l - 4] = 0; /* Chop of .src -- boring! */
+ }
+
+ START(HTML_HEAD);
+ PUTC('\n');
+ START(HTML_TITLE);
+ PUTS(shortname);
+ PUTS(source_file ? gettext(" WAIS source file") : INDEX_SEGMENT);
+ END(HTML_TITLE);
+ PUTC('\n');
+ END(HTML_HEAD);
+
+ START(HTML_H1);
+ PUTS(shortname);
+ PUTS(source_file ? gettext(" description") : INDEX_SEGMENT);
+ END(HTML_H1);
+ PUTC('\n');
+ FREE(shortname);
+ }
+
+ START(HTML_DL); /* Definition list of details */
+
+ if (source_file) {
+ START(HTML_DT);
+ PUTS(gettext("Access links"));
+ MAYBE_END(HTML_DT);
+ START(HTML_DD);
+ if (me->par_value[PAR_IP_NAME] &&
+ me->par_value[PAR_DATABASE_NAME]) {
+
+ char *WSRC_address = NULL;
+ char *www_database;
+
+ www_database = HTEscape(me->par_value[PAR_DATABASE_NAME],
+ URL_XALPHAS);
+ HTSprintf0(&WSRC_address, "%s//%s%s%s/%s",
+ STR_WAIS_URL,
+ me->par_value[PAR_IP_NAME],
+ me->par_value[PAR_TCP_PORT] ? ":" : "",
+ (me->par_value[PAR_TCP_PORT]
+ ? me->par_value[PAR_TCP_PORT]
+ : ""),
+ www_database);
+
+ HTStartAnchor(me->target, NULL, WSRC_address);
+ PUTS(gettext("Direct access"));
+ END(HTML_A);
+ /** Proxy will be used if defined, so let user know that - FM **/
+ PUTS(gettext(" (or via proxy server, if defined)"));
+
+ FREE(www_database);
+ FREE(WSRC_address);
+
+ } else {
+ give_parameter(me, PAR_IP_NAME);
+ give_parameter(me, PAR_DATABASE_NAME);
+ }
+ MAYBE_END(HTML_DD);
+
+ }
+ /* end if source_file */
+ if (me->par_value[PAR_MAINTAINER]) {
+ START(HTML_DT);
+ PUTS(gettext("Maintainer"));
+ MAYBE_END(HTML_DT);
+ START(HTML_DD);
+ PUTS(me->par_value[PAR_MAINTAINER]);
+ MAYBE_END(HTML_DD);
+ }
+ if (me->par_value[PAR_IP_NAME]) {
+ START(HTML_DT);
+ PUTS(gettext("Host"));
+ MAYBE_END(HTML_DT);
+ START(HTML_DD);
+ PUTS(me->par_value[PAR_IP_NAME]);
+ MAYBE_END(HTML_DD);
+ }
+
+ END(HTML_DL);
+
+ if (me->par_value[PAR_DESCRIPTION]) {
+ START(HTML_PRE); /* Preformatted description */
+ PUTS(me->par_value[PAR_DESCRIPTION]);
+ END(HTML_PRE);
+ }
+
+ (*me->target->isa->_free) (me->target);
+
+ return;
+} /* generate html */
+
+static void WSRCParser_put_string(HTStream *context, const char *str)
+{
+ const char *p;
+
+ for (p = str; *p; p++)
+ WSRCParser_put_character(context, *p);
+}
+
+static void WSRCParser_write(HTStream *context, const char *str,
+ int l)
+{
+ const char *p;
+ const char *e = str + l;
+
+ for (p = str; p < e; p++)
+ WSRCParser_put_character(context, *p);
+}
+
+static void WSRCParser_free(HTStream *me)
+{
+ WSRC_gen_html(me, YES);
+#ifdef CACHE_FILE_PREFIX
+ write_cache(me);
+#endif
+ {
+ int p;
+
+ for (p = 0; par_name[p]; p++) { /* Clear out old values */
+ FREE(me->par_value[p]);
+ }
+ }
+ FREE(me);
+}
+
+static void WSRCParser_abort(HTStream *me, HTError e GCC_UNUSED)
+{
+ WSRCParser_free(me);
+}
+
+/* Stream subclass -- method routines
+ * ---------------
+ */
+
+static HTStreamClass WSRCParserClass =
+{
+ "WSRCParser",
+ WSRCParser_free,
+ WSRCParser_abort,
+ WSRCParser_put_character,
+ WSRCParser_put_string,
+ WSRCParser_write
+};
+
+/* Converter from WAIS Source to whatever
+ * --------------------------------------
+ */
+HTStream *HTWSRCConvert(HTPresentation *pres, HTParentAnchor *anchor,
+ HTStream *sink)
+{
+ HTStream *me = (HTStream *) malloc(sizeof(*me));
+
+ if (!me)
+ outofmem(__FILE__, "HTWSRCConvert");
+
+ me->isa = &WSRCParserClass;
+ me->target = HTML_new(anchor, pres->rep_out, sink);
+
+ {
+ int p;
+
+ for (p = 0; p < PAR_COUNT; p++) { /* Clear out parameter values */
+ me->par_value[p] = 0;
+ }
+ }
+ me->state = beginning;
+
+ return me;
+}
diff --git a/WWW/Library/Implementation/HTWSRC.h b/WWW/Library/Implementation/HTWSRC.h
new file mode 100644
index 0000000..6c81132
--- /dev/null
+++ b/WWW/Library/Implementation/HTWSRC.h
@@ -0,0 +1,43 @@
+/* A parser for WAIS source files
+ WAIS SOURCE FILE PARSER
+
+ This converter returns a stream object into which a WAIS source file can be
+ written. The result is put via a structured stream into whatever format was
+ required for the output stream.
+
+ See also: HTWAIS protocol interface module
+
+ */
+#ifndef HTWSRC_H
+#define HTWSRC_H
+
+#include <HTFormat.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ extern char from_hex(char c);
+
+ extern HTStream *HTWSRCConvert(HTPresentation *pres,
+ HTParentAnchor *anchor,
+ HTStream *sink);
+
+/*
+
+Escaping Strings
+
+ HTDeSlash takes out the invalid characters in a URL path ELEMENT by
+ converting them into hex-escaped characters. HTEnSlash does the reverse.
+
+ Each returns a pointer to a newly allocated string which must eventually be
+ freed by the caller.
+
+ */
+ extern char *HTDeSlash(const char *str);
+
+ extern char *HTEnSlash(const char *str);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* HTWSRC_H */
diff --git a/WWW/Library/Implementation/HText.h b/WWW/Library/Implementation/HText.h
new file mode 100644
index 0000000..93ff4a6
--- /dev/null
+++ b/WWW/Library/Implementation/HText.h
@@ -0,0 +1,219 @@
+/*
+ * $LynxId: HText.h,v 1.17 2020/01/21 22:08:07 tom Exp $
+ * Rich Hypertext object for libWWW
+ * RICH HYPERTEXT OBJECT
+ *
+ * This is the C interface to the Objective-C (or whatever) Style-oriented
+ * HyperText class. It is used when a style-oriented text object is available
+ * or craeted in order to display hypertext.
+ */
+#ifndef HTEXT_H
+#define HTEXT_H
+
+#include <HTAnchor.h>
+#include <HTStyle.h>
+#include <HTStream.h>
+#include <SGML.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#ifndef THINK_C
+#ifndef HyperText /* Objective C version defined HyperText */
+ typedef struct _HText HText; /* Normal Library */
+#endif
+#else
+ class CHyperText; /* Mac Think-C browser hook */
+ typedef CHyperText HText;
+#endif
+
+ extern HText *HTMainText; /* Pointer to current main text */
+ extern HTParentAnchor *HTMainAnchor; /* Pointer to current text's anchor */
+
+ extern const char *HTAppName; /* Application name */
+ extern const char *HTAppVersion; /* Application version */
+
+/*
+
+Creation and deletion
+
+ HTEXT_NEW: CREATE HYPERTEXT OBJECT
+
+ There are several methods depending on how much you want to specify. The
+ output stream is used with objects which need to output the hypertext to a
+ stream. The structure is for objects which need to refer to the structure
+ which is kep by the creating stream.
+
+ */
+ extern HText *HText_new(HTParentAnchor *anchor);
+
+ extern HText *HText_new2(HTParentAnchor *anchor,
+ HTStream *output_stream);
+
+ extern HText *HText_new3(HTParentAnchor *anchor,
+ HTStream *output_stream,
+ HTStructured * structure);
+
+/*
+
+ FREE HYPERTEXT OBJECT
+
+ */
+ extern void HText_free(HText *me);
+
+/*
+
+Object Building methods
+
+ These are used by a parser to build the text in an object HText_beginAppend
+ must be called, then any combination of other append calls, then
+ HText_endAppend. This allows optimised handling using buffers and caches
+ which are flushed at the end.
+
+ */
+ extern void HText_beginAppend(HText *text);
+
+ extern void HText_endAppend(HText *text);
+
+/*
+
+ SET THE STYLE FOR FUTURE TEXT
+
+ */
+
+ extern void HText_setStyle(HText *text, HTStyle *style);
+
+/*
+
+ ADD ONE CHARACTER
+
+ */
+ extern void HText_appendCharacter(HText *text, int ch);
+
+/*
+
+ ADD A ZERO-TERMINATED STRING
+
+ */
+
+ extern void HText_appendText(HText *text, const char *str);
+
+/*
+
+ NEW PARAGRAPH
+
+ and similar things
+
+ */
+ extern void HText_appendParagraph(HText *text);
+
+ extern void HText_appendLineBreak(HText *text);
+
+ extern void HText_appendHorizontalRule(HText *text);
+
+/*
+
+ START/END SENSITIVE TEXT
+
+ */
+
+/*
+
+ The anchor object is created and passed to HText_beginAnchor. The sensitive
+ text is added to the text object, and then HText_endAnchor is called.
+ Anchors may not be nested.
+
+ */
+ extern int HText_beginAnchor(HText *text, int underline,
+ HTChildAnchor *anc);
+ extern void HText_endAnchor(HText *text, int number);
+ extern BOOL HText_isAnchorBlank(HText *text, int number);
+
+/*
+
+ APPEND AN INLINE IMAGE
+
+ The image is handled by the creation of an anchor whose destination is the
+ image document to be included. The semantics is the intended inline display
+ of the image.
+
+ An alternative implementation could be, for example, to begin an anchor,
+ append the alternative text or "IMAGE", then end the anchor. This would
+ simply generate some text linked to the image itself as a separate document.
+
+ */
+ extern void HText_appendImage(HText *text, HTChildAnchor *anc,
+ const char *alternative_text,
+ int alignment,
+ int isMap);
+
+/*
+
+ RETURN THE ANCHOR ASSOCIATED WITH THIS NODE
+
+ */
+ extern HTParentAnchor *HText_nodeAnchor(HText *me);
+
+/*
+
+Browsing functions
+
+ */
+
+/*
+
+ BRING TO FRONT AND HIGHLIGHT IT
+
+ */
+
+ extern BOOL HText_select(HText *text);
+ extern BOOL HText_selectAnchor(HText *text, HTChildAnchor *anchor);
+
+/*
+
+Editing functions
+
+ These are called from the application. There are many more functions not
+ included here from the original text object. These functions NEED NOT BE
+ IMPLEMENTED in a browser which cannot edit.
+
+ */
+/* Style handling:
+*/
+/* Apply this style to the selection
+*/
+ extern void HText_applyStyle(HText *me, HTStyle *style);
+
+/* Update all text with changed style.
+*/
+ extern void HText_updateStyle(HText *me, HTStyle *style);
+
+/* Return style of selection
+*/
+ extern HTStyle *HText_selectionStyle(HText *me, HTStyleSheet *sheet);
+
+/* Paste in styled text
+*/
+ extern void HText_replaceSel(HText *me, const char *aString,
+ HTStyle *aStyle);
+
+/* Apply this style to the selection and all similarly formatted text
+ * (style recovery only)
+ */
+ extern void HTextApplyToSimilar(HText *me, HTStyle *style);
+
+/* Select the first unstyled run.
+ * (style recovery only)
+ */
+ extern void HTextSelectUnstyled(HText *me, HTStyleSheet *sheet);
+
+/* Anchor handling:
+*/
+ extern void HText_unlinkSelection(HText *me);
+ extern HTAnchor *HText_referenceSelected(HText *me);
+ extern HTAnchor *HText_linkSelTo(HText *me, HTAnchor * anchor);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* HTEXT_H */
diff --git a/WWW/Library/Implementation/HTioctl.h b/WWW/Library/Implementation/HTioctl.h
new file mode 100644
index 0000000..99f8632
--- /dev/null
+++ b/WWW/Library/Implementation/HTioctl.h
@@ -0,0 +1,11 @@
+/*
+ * A routine to mimic the ioctl function for UCX.
+ * Bjorn S. Nilsson, 25-Nov-1993. Based on an example in the UCX manual.
+ */
+#include <iodef.h>
+#define IOC_OUT (int)0x40000000
+extern int vaxc$get_sdc(), sys$qiow();
+
+#ifndef UCX$C_IOCTL
+#define UCX$C_IOCTL TCPIP$C_IOCTL
+#endif
diff --git a/WWW/Library/Implementation/LYLeaks.h b/WWW/Library/Implementation/LYLeaks.h
new file mode 100644
index 0000000..a47b962
--- /dev/null
+++ b/WWW/Library/Implementation/LYLeaks.h
@@ -0,0 +1,309 @@
+/*
+ * $LynxId: LYLeaks.h,v 1.19 2020/01/21 22:05:46 tom Exp $
+ */
+#ifndef __LYLEAKS_H
+/*
+ * Avoid include redundancy
+ * Include only if finding memory leaks.
+ */
+#define __LYLEAKS_H
+
+/*
+ * Copyright (c) 1994, University of Kansas, All Rights Reserved
+ *
+ * Include File: LYLeaks.h
+ * Purpose: Header to convert requests for allocation to Lynx
+ * custom functions to track memory leaks.
+ * Remarks/Portability/Dependencies/Restrictions:
+ * For the stdlib.h allocation functions to be overridden by the
+ * Lynx memory tracking functions all modules allocating,
+ * freeing, or resizing memory must have LY_FIND_LEAKS
+ * defined before including this file.
+ * This header file should be included in every source file which
+ * does any memory manipulation through use of the
+ * stdlib.h memory functions.
+ * For proper reporting of memory leaks, the function LYLeaks
+ * should be registered for execution by atexit as the
+ * very first executable statement in main.
+ * This code is slow and should not be used except in debugging
+ * circumstances (don't define LY_FIND_LEAKS).
+ * If you are using LY_FIND_LEAKS and don't want the LYLeak*
+ * memory functions to be used in a certain file,
+ * define NO_MEMORY_TRACKING before including this file.
+ * The only safe way to call the LYLeak* functions is to use
+ * the below macros because they depend on the static
+ * string created by __FILE__ to not be dynamic in
+ * nature (don't free it and assume will exist at all
+ * times during execution).
+ * If you are using LY_FIND_LEAKS and LY_FIND_LEAKS_EXTENDED and
+ * want only normal memory tracking (not extended for
+ * HTSprintf/HTSprintf0) to be used in a certain file,
+ * define NO_EXTENDED_MEMORY_TRACKING and don't define
+ * NO_MEMORY_TRACKING before including this file.
+ * Revision History:
+ * 05-26-94 created for Lynx 2-3-1, Garrett Arch Blythe
+ * 10-30-97 modified to handle StrAllocCopy() and
+ * StrAllocCat(). - KW & FM
+ * 1999-10-17 modified to handle HTSprintf0 and HTSprintf(),
+ * and to provide mark_malloced, if
+ * LY_FIND_LEAKS_EXTENDED is defined. - kw
+ * 2003-01-22 add sequence-id for counting mallocs/frees -TD
+ * 2004-04-27 ANSIfy'd -TD
+ * 2012-02-09 add bstring interfaces -TD
+ */
+
+/* Undefine this to get no improved HTSprintf0/HTSprintf tracking: */
+#define LY_FIND_LEAKS_EXTENDED
+
+/*
+ * Required includes
+ */
+
+#ifndef HTUTILS_H
+#include <HTUtils.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Constant defines
+ */
+#define MAX_CONTENT_LENGTH 50
+#ifdef VMS
+#define LEAKAGE_SINK "sys$login:Lynx.leaks"
+#else
+#define LEAKAGE_SINK "Lynx.leaks"
+#endif /* VMS */
+/*
+ * Data structures
+ */
+ typedef struct SourceLocation_tag {
+ /*
+ * The file name and line number of where an event took place.
+ */
+ const char *cp_FileName;
+ short ssi_LineNumber;
+ } SourceLocation;
+
+ typedef struct AllocationList_tag {
+ /*
+ * A singly linked list.
+ */
+ struct AllocationList_tag *ALp_Next;
+
+ /*
+ * Count the number of mallocs.
+ */
+ long st_Sequence;
+
+ /*
+ * The memory pointer allocated. If set to NULL, then an invalid request
+ * was made. The invalid pointer also.
+ */
+ void *vp_Alloced;
+ void *vp_BadRequest;
+
+ /*
+ * The size in bytes of the allocated memory.
+ */
+ size_t st_Bytes;
+
+ /*
+ * The source location of specific event (calloc, malloc, free). realloc
+ * kept separate since will track last realloc on pointer.
+ */
+ SourceLocation SL_memory;
+ SourceLocation SL_realloc;
+ } AllocationList;
+
+/*
+ * Global variable declarations
+ */
+ extern char LYLeaksPath[];
+
+/*
+ * Macros
+ */
+#if defined(LY_FIND_LEAKS) && !defined(NO_MEMORY_TRACKING)
+/*
+ * Only use these macros if we are to track memory allocations. The reason for
+ * using a macro instead of a define is that we want to track where the initial
+ * allocation took place or where the last reallocation took place. Track
+ * where the allocation took place by the __FILE__ and __LINE__ defines which
+ * are automatic to the compiler.
+ */
+#ifdef malloc
+#undef malloc
+#endif /* malloc */
+#define malloc(st_bytes) LYLeakMalloc(st_bytes, __FILE__, __LINE__)
+
+#ifdef calloc
+#undef calloc
+#endif /* calloc */
+#define calloc(st_number, st_bytes) LYLeakCalloc(st_number, st_bytes, \
+ __FILE__, __LINE__)
+
+#ifdef realloc
+#undef realloc
+#endif /* realloc */
+#define realloc(vp_alloced, st_newbytes) LYLeakRealloc(vp_alloced, \
+ st_newbytes, __FILE__, __LINE__)
+
+#ifdef free
+#undef free
+#endif /* free */
+#define free(vp_alloced) LYLeakFree(vp_alloced, __FILE__, __LINE__)
+
+#ifdef strdup
+#undef strdup
+#endif /* free */
+#define strdup(vp_alloced) LYLeakStrdup(vp_alloced, __FILE__, __LINE__)
+
+/*
+ * Added the following two defines to track Lynx's frequent use of those
+ * macros. - KW 1997-10-12
+ */
+#ifdef StrAllocCopy
+#undef StrAllocCopy
+#endif /* StrAllocCopy */
+#define StrAllocCopy(dest, src) LYLeakSACopy(&(dest), src, __FILE__, __LINE__)
+
+#ifdef StrAllocCat
+#undef StrAllocCat
+#endif /* StrAllocCat */
+#define StrAllocCat(dest, src) LYLeakSACat(&(dest), src, __FILE__, __LINE__)
+
+#ifdef BStrAlloc
+#undef BStrAlloc
+#endif
+#define BStrAlloc(d,n) LYLeakSABAlloc( &(d), n, __FILE__, __LINE__)
+
+#ifdef BStrCopy
+#undef BStrCopy
+#endif
+#define BStrCopy(d,s) LYLeakSABCopy( &(d), BStrData(s), BStrLen(s), __FILE__, __LINE__)
+
+#ifdef BStrCopy0
+#undef BStrCopy0
+#endif
+#define BStrCopy0(d,s) LYLeakSABCopy0( &(d), s, __FILE__, __LINE__)
+
+#ifdef BStrCat
+#undef BStrCat
+#endif
+#define BStrCat(d,s) LYLeakSABCat( &(d), BStrData(s), BStrLen(s), __FILE__, __LINE__)
+
+#ifdef BStrCat0
+#undef BStrCat0
+#endif
+#define BStrCat0(d,s) LYLeakSABCat0( &(d), s, __FILE__, __LINE__)
+
+#define mark_malloced(a,size) LYLeak_mark_malloced(a,size, __FILE__, __LINE__)
+
+#if defined(LY_FIND_LEAKS_EXTENDED) && !defined(NO_EXTENDED_MEMORY_TRACKING)
+
+#ifdef HTSprintf0
+#undef HTSprintf0
+#endif /* HTSprintf0 */
+#define HTSprintf0 (Get_htsprintf0_fn(__FILE__,__LINE__))
+
+#ifdef HTSprintf
+#undef HTSprintf
+#endif /* HTSprintf */
+#define HTSprintf (Get_htsprintf_fn(__FILE__,__LINE__))
+
+#endif /* LY_FIND_LEAKS_EXTENDED and not NO_EXTENDED_MEMORY_TRACKING */
+
+#else /* LY_FIND_LEAKS && !NO_MEMORY_TRACKING */
+
+#define mark_malloced(a,size) /* no-op */
+#define LYLeakSequence() (-1)
+
+#endif /* LY_FIND_LEAKS && !NO_MEMORY_TRACKING */
+
+#if defined(LY_FIND_LEAKS)
+#define PUBLIC_IF_FIND_LEAKS /* nothing */
+#else
+#define PUBLIC_IF_FIND_LEAKS static
+#endif
+
+/*
+ * Function declarations.
+ * See the appropriate source file for usage.
+ */
+#ifndef LYLeakSequence
+ extern long LYLeakSequence(void);
+#endif
+ extern void LYLeaks(void);
+
+#ifdef LY_FIND_LEAKS_EXTENDED
+ extern AllocationList *LYLeak_mark_malloced(void *vp_alloced,
+ size_t st_bytes,
+ const char *cp_File,
+ const short ssi_Line);
+#endif /* LY_FIND_LEAKS_EXTENDED */
+ extern void *LYLeakMalloc(size_t st_bytes, const char *cp_File,
+ const short ssi_Line);
+ extern void *LYLeakCalloc(size_t st_number, size_t st_bytes, const char *cp_File,
+ const short ssi_Line);
+ extern void *LYLeakRealloc(void *vp_alloced,
+ size_t st_newbytes,
+ const char *cp_File,
+ const short ssi_Line);
+ extern void LYLeakFree(void *vp_alloced,
+ const char *cp_File,
+ const short ssi_Line);
+ extern char *LYLeakStrdup(const char *src,
+ const char *cp_File,
+ const short ssi_Line);
+ extern char *LYLeakSACopy(char **dest,
+ const char *src,
+ const char *cp_File,
+ const short ssi_Line);
+ extern char *LYLeakSACat(char **dest,
+ const char *src,
+ const char *cp_File,
+ const short ssi_Line);
+ extern void LYLeakSABAlloc(bstring **dest,
+ int len,
+ const char *cp_File,
+ const short ssi_Line);
+ extern void LYLeakSABCopy(bstring **dest,
+ const char *src,
+ int len,
+ const char *cp_File,
+ const short ssi_Line);
+ extern void LYLeakSABCopy0(bstring **dest,
+ const char *src,
+ const char *cp_File,
+ const short ssi_Line);
+ extern void LYLeakSABCat(bstring **dest,
+ const char *src,
+ int len,
+ const char *cp_File,
+ const short ssi_Line);
+ extern void LYLeakSABCat0(bstring **dest,
+ const char *src,
+ const char *cp_File,
+ const short ssi_Line);
+ extern void LYLeakSABFree(bstring **ptr,
+ const char *cp_File,
+ const short ssi_Line);
+
+#ifdef LY_FIND_LEAKS_EXTENDED
+/*
+ * Trick to get tracking of var arg functions without relying on var arg
+ * preprocessor macros:
+ */
+ typedef char *HTSprintflike(char **, const char *, ...);
+ extern HTSprintflike *Get_htsprintf_fn(const char *cp_File,
+ const short ssi_Line);
+ extern HTSprintflike *Get_htsprintf0_fn(const char *cp_File,
+ const short ssi_Line);
+#endif /* LY_FIND_LEAKS_EXTENDED */
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* __LYLEAKS_H */
diff --git a/WWW/Library/Implementation/LYexit.h b/WWW/Library/Implementation/LYexit.h
new file mode 100644
index 0000000..dd4b0e6
--- /dev/null
+++ b/WWW/Library/Implementation/LYexit.h
@@ -0,0 +1,67 @@
+#ifndef __LYEXIT_H
+/*
+ * Avoid include redundancy
+ */
+#define __LYEXIT_H
+
+/*
+ * Copyright (c) 1994, University of Kansas, All Rights Reserved
+ *
+ * Include File: LYexit.h
+ * Purpose: Provide an atexit function for libraries without such.
+ * Remarks/Portability/Dependencies/Restrictions:
+ * Include this header in every file that you have an exit or
+ * atexit statement.
+ * Revision History:
+ * 06-15-94 created Lynx 2-3-1 Garrett Arch Blythe
+ */
+
+/*
+ * Required includes
+ */
+#ifdef _WINDOWS
+#include <process.h> /* declares exit() */
+#endif
+
+#ifndef HTUTILS_H
+#include <HTUtils.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Constant defines
+ */
+#ifdef exit
+#undef exit
+#endif
+#define exit(code) LYexit(code)
+#define atexit LYatexit
+#define ATEXITSIZE 50
+
+/*
+ * Data structures
+ */
+
+/*
+ * Global variable declarations
+ */
+
+/*
+ * Macros
+ */
+
+/*
+ * Function declarations
+ */
+ extern GCC_NORETURN void outofmem(const char *fname, const char *func);
+ extern void reset_signals(void);
+ extern GCC_NORETURN void exit_immediately(int status);
+ extern GCC_NORETURN void LYexit(int status);
+ extern int LYatexit(void (*function) (void));
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* __LYEXIT_H */
diff --git a/WWW/Library/Implementation/SGML.c b/WWW/Library/Implementation/SGML.c
new file mode 100644
index 0000000..2534606
--- /dev/null
+++ b/WWW/Library/Implementation/SGML.c
@@ -0,0 +1,5159 @@
+/*
+ * $LynxId: SGML.c,v 1.183 2022/06/13 00:20:50 tom Exp $
+ *
+ * General SGML Parser code SGML.c
+ * ========================
+ *
+ * This module implements an HTStream object. To parse an
+ * SGML file, create this object which is a parser. The object
+ * is (currently) created by being passed a DTD structure,
+ * and a target HTStructured object at which to throw the parsed stuff.
+ *
+ * 6 Feb 93 Binary searches used. Interface modified.
+ */
+
+#define HTSTREAM_INTERNAL 1
+
+#include <HTUtils.h>
+
+#include <SGML.h>
+#include <HTMLDTD.h>
+#include <HTAccess.h>
+#include <UCAux.h>
+
+#include <HTChunk.h>
+#include <HTUtils.h>
+
+#include <LYCharSets.h>
+#include <LYCharVals.h> /* S/390 -- gil -- 0635 */
+#include <LYGlobalDefs.h>
+#include <LYStrings.h>
+#include <LYLeaks.h>
+#include <LYUtils.h>
+
+#ifdef USE_COLOR_STYLE
+# include <LYStyle.h>
+#endif
+#ifdef USE_PRETTYSRC
+# include <LYPrettySrc.h>
+#endif
+
+/* a global variable doesn't work with info-stages which convert encoding */
+#if defined(EXP_CHINESEUTF8_SUPPORT)
+#undef IS_CJK_TTY
+#define IS_CJK_TTY me->T.do_cjk
+#endif
+
+#define AssumeCP1252(me) \
+ (((me)->inUCLYhndl == LATIN1 \
+ || (me)->inUCLYhndl == US_ASCII) \
+ && html5_charsets)
+
+#define INVALID (-1)
+
+static int sgml_offset;
+
+#ifdef USE_PRETTYSRC
+
+static char *entity_string; /* this is used for printing entity name.
+
+ Unconditionally added since redundant assignments don't hurt much */
+
+static void fake_put_character(HTStream *p GCC_UNUSED,
+ int c GCC_UNUSED)
+{
+}
+
+#define START TRUE
+#define STOP FALSE
+
+#define PUTS_TR(x) psrc_convert_string = TRUE; PUTS(x)
+
+#endif
+
+/* my_casecomp() - optimized by the first character, NOT_ASCII ok */
+#define my_casecomp(a,b) ((TOUPPER(*a) == TOUPPER(*b)) ? \
+ AS_casecomp(a,b) : \
+ (TOASCII(TOUPPER(*a)) - TOASCII(TOUPPER(*b))))
+
+/* ...used for comments and attributes value like href... */
+#define HTChunkPutUtf8Char(ch,x) \
+ { \
+ if ((TOASCII(x) < 128) && (ch->size < ch->allocated)) \
+ ch->data[ch->size++] = (char)x; \
+ else \
+ (HTChunkPutUtf8Char)(ch,x); \
+ }
+
+#define PUTS(str) ((*me->actions->put_string)(me->target, str))
+#define PUTC(ch) ((*me->actions->put_character)(me->target, (char) ch))
+#define PUTUTF8(code) (UCPutUtf8_charstring((HTStream *)me->target, \
+ (putc_func_t*)(me->actions->put_character), code))
+
+#ifdef USE_PRETTYSRC
+#define PRETTYSRC_PUTC(c) if (psrc_view) PUTC(c)
+#else
+#define PRETTYSRC_PUTC(c) /* nothing */
+#endif
+
+/*the following macros are used for pretty source view. */
+#define IS_C(attr) (attr.type == HTMLA_CLASS)
+
+#if defined(USE_JAPANESEUTF8_SUPPORT)
+# define UTF8_TTY_ISO2022JP (me->T.output_utf8)
+#else
+# define UTF8_TTY_ISO2022JP 0
+#endif
+
+HTCJKlang HTCJK = NOCJK; /* CJK enum value. */
+BOOL HTPassEightBitRaw = FALSE; /* Pass 161-172,174-255 raw. */
+BOOL HTPassEightBitNum = FALSE; /* Pass ^ numeric entities raw. */
+BOOL HTPassHighCtrlRaw = FALSE; /* Pass 127-160,173,&#127; raw. */
+BOOL HTPassHighCtrlNum = FALSE; /* Pass &#128;-&#159; raw. */
+
+/* The State (context) of the parser
+ *
+ * This is passed with each call to make the parser reentrant
+ */
+
+#define MAX_ATTRIBUTES 36 /* Max number of attributes per element */
+
+/* Element Stack
+ * -------------
+ * This allows us to return down the stack reselecting styles.
+ * As we return, attribute values will be garbage in general.
+ */
+typedef struct _HTElement HTElement;
+struct _HTElement {
+ HTElement *next; /* Previously nested element or 0 */
+ HTTag *tag; /* The tag at this level */
+};
+
+typedef enum {
+ S_text = 0
+ ,S_attr
+ ,S_attr_gap
+ ,S_comment
+ ,S_cro
+ ,S_doctype
+ ,S_dollar
+ ,S_dollar_dq
+ ,S_dollar_paren
+ ,S_dollar_paren_dq
+ ,S_dollar_paren_sq
+ ,S_dollar_sq
+ ,S_dquoted
+ ,S_end
+ ,S_entity
+ ,S_equals
+ ,S_ero
+ ,S_esc
+ ,S_esc_dq
+ ,S_esc_sq
+ ,S_exclamation
+ ,S_in_kanji
+ ,S_incro
+ ,S_junk_tag
+ ,S_litteral
+ ,S_marked
+ ,S_nonascii_text
+ ,S_nonascii_text_dq
+ ,S_nonascii_text_sq
+ ,S_paren
+ ,S_paren_dq
+ ,S_paren_sq
+ ,S_pcdata
+ ,S_pi
+ ,S_script
+ ,S_sgmlatt
+ ,S_sgmlele
+ ,S_sgmlent
+ ,S_squoted
+ ,S_tag
+ ,S_tag_gap
+ ,S_tagname_slash
+ ,S_value
+} sgml_state;
+
+/* Internal Context Data Structure
+ * -------------------------------
+ */
+struct _HTStream {
+
+ const HTStreamClass *isa; /* inherited from HTStream */
+
+ const SGML_dtd *dtd;
+ const HTStructuredClass *actions; /* target class */
+ HTStructured *target; /* target object */
+
+ HTTag *current_tag;
+ HTTag *slashedtag;
+ const HTTag *unknown_tag;
+ BOOL extended_html; /* xhtml */
+ BOOL strict_xml; /* xml */
+ BOOL inSELECT;
+ BOOL no_lynx_specialcodes;
+ int current_attribute_number;
+ HTChunk *string;
+ int leading_spaces;
+ int trailing_spaces;
+ HTElement *element_stack;
+ sgml_state state;
+ unsigned char kanji_buf;
+#ifdef CALLERDATA
+ void *callerData;
+#endif /* CALLERDATA */
+ BOOL present[MAX_ATTRIBUTES]; /* Flags: attribute is present? */
+ char *value[MAX_ATTRIBUTES]; /* NULL, or strings alloc'd with StrAllocCopy_extra() */
+
+ BOOL lead_exclamation;
+ BOOL first_dash;
+ BOOL end_comment;
+ BOOL doctype_bracket;
+ BOOL first_bracket;
+ BOOL second_bracket;
+ BOOL isHex;
+
+ HTParentAnchor *node_anchor;
+ LYUCcharset *inUCI; /* pointer to anchor UCInfo */
+ int inUCLYhndl; /* charset we are fed */
+ LYUCcharset *outUCI; /* anchor UCInfo for target */
+ int outUCLYhndl; /* charset for target */
+ UTFDecodeState U;
+ UCTransParams T;
+ int current_tag_charset; /* charset to pass attributes */
+
+ char *recover;
+ int recover_index;
+ char *include;
+ char *active_include;
+ int include_index;
+ char *url;
+ char *csi;
+ int csi_index;
+#ifdef USE_PRETTYSRC
+ BOOL cur_attr_is_href;
+ BOOL cur_attr_is_name;
+#endif
+};
+
+#ifdef NO_LYNX_TRACE
+#define state_name(n) "state"
+#else
+static const char *state_name(sgml_state n)
+{
+ const char *result = "?";
+ /* *INDENT-OFF* */
+ switch (n) {
+ case S_attr: result = "S_attr"; break;
+ case S_attr_gap: result = "S_attr_gap"; break;
+ case S_comment: result = "S_comment"; break;
+ case S_cro: result = "S_cro"; break;
+ case S_doctype: result = "S_doctype"; break;
+ case S_dollar: result = "S_dollar"; break;
+ case S_dollar_dq: result = "S_dollar_dq"; break;
+ case S_dollar_paren: result = "S_dollar_paren"; break;
+ case S_dollar_paren_dq: result = "S_dollar_paren_dq"; break;
+ case S_dollar_paren_sq: result = "S_dollar_paren_sq"; break;
+ case S_dollar_sq: result = "S_dollar_sq"; break;
+ case S_dquoted: result = "S_dquoted"; break;
+ case S_end: result = "S_end"; break;
+ case S_entity: result = "S_entity"; break;
+ case S_equals: result = "S_equals"; break;
+ case S_ero: result = "S_ero"; break;
+ case S_esc: result = "S_esc"; break;
+ case S_esc_dq: result = "S_esc_dq"; break;
+ case S_esc_sq: result = "S_esc_sq"; break;
+ case S_exclamation: result = "S_exclamation"; break;
+ case S_in_kanji: result = "S_in_kanji"; break;
+ case S_incro: result = "S_incro"; break;
+ case S_pi: result = "S_pi"; break;
+ case S_junk_tag: result = "S_junk_tag"; break;
+ case S_litteral: result = "S_litteral"; break;
+ case S_marked: result = "S_marked"; break;
+ case S_nonascii_text: result = "S_nonascii_text"; break;
+ case S_nonascii_text_dq: result = "S_nonascii_text_dq"; break;
+ case S_nonascii_text_sq: result = "S_nonascii_text_sq"; break;
+ case S_paren: result = "S_paren"; break;
+ case S_paren_dq: result = "S_paren_dq"; break;
+ case S_paren_sq: result = "S_paren_sq"; break;
+ case S_pcdata: result = "S_pcdata"; break;
+ case S_script: result = "S_script"; break;
+ case S_sgmlatt: result = "S_sgmlatt"; break;
+ case S_sgmlele: result = "S_sgmlele"; break;
+ case S_sgmlent: result = "S_sgmlent"; break;
+ case S_squoted: result = "S_squoted"; break;
+ case S_tag: result = "S_tag"; break;
+ case S_tag_gap: result = "S_tag_gap"; break;
+ case S_tagname_slash: result = "S_tagname_slash"; break;
+ case S_text: result = "S_text"; break;
+ case S_value: result = "S_value"; break;
+ }
+ /* *INDENT-ON* */
+
+ return result;
+}
+#endif
+
+/* storage for Element Stack */
+#define DEPTH 10
+static HTElement pool[DEPTH];
+static int depth = 0;
+
+static HTElement *pool_alloc(void)
+{
+ depth++;
+ if (depth > DEPTH)
+ return (HTElement *) malloc(sizeof(HTElement));
+ return (pool + depth - 1);
+}
+
+static void pool_free(HTElement * e)
+{
+ if (depth > DEPTH)
+ FREE(e);
+ depth--;
+ return;
+}
+
+#ifdef USE_PRETTYSRC
+
+static void HTMLSRC_apply_markup(HTStream *me,
+ HTlexeme lexeme,
+ int start)
+{
+ HT_tagspec *ts = *((start ? lexeme_start : lexeme_end) + lexeme);
+
+ while (ts) {
+#ifdef USE_COLOR_STYLE
+ if (ts->start) {
+ current_tag_style = ts->style;
+ force_current_tag_style = TRUE;
+ forced_classname = ts->class_name;
+ force_classname = TRUE;
+ }
+#endif
+ CTRACE((tfp, ts->start ? "SRCSTART %d\n" : "SRCSTOP %d\n", (int) lexeme));
+ if (ts->start)
+ (*me->actions->start_element) (me->target,
+ (int) ts->element,
+ ts->present,
+ (STRING2PTR) ts->value,
+ me->current_tag_charset,
+ &me->include);
+ else
+ (*me->actions->end_element) (me->target,
+ (int) ts->element,
+ &me->include);
+ ts = ts->next;
+ }
+}
+
+#define PSRCSTART(x) HTMLSRC_apply_markup(me,HTL_##x,START)
+#define PSRCSTOP(x) HTMLSRC_apply_markup(me,HTL_##x,STOP)
+
+#define attr_is_href me->cur_attr_is_href
+#define attr_is_name me->cur_attr_is_name
+#endif
+
+static void set_chartrans_handling(HTStream *me,
+ HTParentAnchor *anchor,
+ int chndl)
+{
+ if (chndl < 0) {
+ /*
+ * Nothing was set for the parser in earlier stages, so the HTML
+ * parser's UCLYhndl should still be its default. - FM
+ */
+ chndl = HTAnchor_getUCLYhndl(anchor, UCT_STAGE_STRUCTURED);
+ if (chndl < 0)
+ /*
+ * That wasn't set either, so seek the HText default. - FM
+ */
+ chndl = HTAnchor_getUCLYhndl(anchor, UCT_STAGE_HTEXT);
+ if (chndl < 0)
+ /*
+ * That wasn't set either, so assume the current display character
+ * set. - FM
+ */
+ chndl = current_char_set;
+ /*
+ * Try to set the HText and HTML stages' chartrans info with the
+ * default lock level (will not be changed if it was set previously
+ * with a higher lock level). - FM
+ */
+ HTAnchor_setUCInfoStage(anchor, chndl,
+ UCT_STAGE_HTEXT,
+ UCT_SETBY_DEFAULT);
+ HTAnchor_setUCInfoStage(anchor, chndl,
+ UCT_STAGE_STRUCTURED,
+ UCT_SETBY_DEFAULT);
+ /*
+ * Get the chartrans info for output to the HTML parser. - FM
+ */
+ me->outUCI = HTAnchor_getUCInfoStage(anchor,
+ UCT_STAGE_STRUCTURED);
+ me->outUCLYhndl = HTAnchor_getUCLYhndl(me->node_anchor,
+ UCT_STAGE_STRUCTURED);
+ }
+ /*
+ * Set the in->out transformation parameters. - FM
+ */
+ UCSetTransParams(&me->T,
+ me->inUCLYhndl, me->inUCI,
+ me->outUCLYhndl, me->outUCI);
+ /*
+ * This is intended for passing the SGML parser's input charset as an
+ * argument in each call to the HTML parser's start tag function, but it
+ * would be better to call a Lynx_HTML_parser function to set an element in
+ * its HTStructured object, itself, if this were needed. - FM
+ */
+#ifndef USE_JAPANESEUTF8_SUPPORT
+ if (IS_CJK_TTY) {
+ me->current_tag_charset = -1;
+ } else
+#endif
+ if (me->T.transp) {
+ me->current_tag_charset = me->inUCLYhndl;
+ } else if (me->T.decode_utf8) {
+ me->current_tag_charset = me->inUCLYhndl;
+ } else if (me->T.do_8bitraw ||
+ me->T.use_raw_char_in) {
+ me->current_tag_charset = me->inUCLYhndl;
+ } else if (me->T.output_utf8 ||
+ me->T.trans_from_uni) {
+ me->current_tag_charset = UCGetLYhndl_byMIME("utf-8");
+ } else {
+ me->current_tag_charset = LATIN1;
+ }
+}
+
+static void change_chartrans_handling(HTStream *me)
+{
+ int new_LYhndl = HTAnchor_getUCLYhndl(me->node_anchor,
+ UCT_STAGE_PARSER);
+
+ if (new_LYhndl != me->inUCLYhndl &&
+ new_LYhndl >= 0) {
+ /*
+ * Something changed. but ignore if a META wants an unknown charset.
+ */
+ LYUCcharset *new_UCI = HTAnchor_getUCInfoStage(me->node_anchor,
+ UCT_STAGE_PARSER);
+
+ if (new_UCI) {
+ LYUCcharset *next_UCI = HTAnchor_getUCInfoStage(me->node_anchor,
+ UCT_STAGE_STRUCTURED);
+ int next_LYhndl = HTAnchor_getUCLYhndl(me->node_anchor, UCT_STAGE_STRUCTURED);
+
+ me->inUCI = new_UCI;
+ me->inUCLYhndl = new_LYhndl;
+ me->outUCI = next_UCI;
+ me->outUCLYhndl = next_LYhndl;
+ set_chartrans_handling(me,
+ me->node_anchor, next_LYhndl);
+ }
+ }
+}
+
+#ifdef USE_COLOR_STYLE
+#include <AttrList.h>
+static int current_is_class = 0;
+#endif
+
+/* Handle Attribute
+ * ----------------
+ */
+/* PUBLIC const char * SGML_default = ""; ?? */
+
+static void handle_attribute_name(HTStream *me, const char *s)
+{
+ HTTag *tag = me->current_tag;
+ const attr *attributes = tag->attributes;
+ int high, low, i, diff;
+
+#ifdef USE_PRETTYSRC
+ if (psrc_view) {
+ attr_is_href = FALSE;
+ attr_is_name = FALSE;
+ }
+#endif
+ /*
+ * Ignore unknown tag. - KW
+ */
+ if (tag == me->unknown_tag) {
+#ifdef USE_PRETTYSRC
+ if (psrc_view)
+ me->current_attribute_number = 1; /* anything !=INVALID */
+#endif
+ return;
+ }
+
+ /*
+ * Binary search for attribute name.
+ */
+ for (low = 0, high = tag->number_of_attributes;
+ high > low;
+ diff < 0 ? (low = i + 1) : (high = i)) {
+ i = (low + (high - low) / 2);
+ diff = my_casecomp(attributes[i].name, s);
+ if (diff == 0) { /* success: found it */
+ me->current_attribute_number = i;
+#ifdef USE_PRETTYSRC
+ if (psrc_view) {
+ attr_is_name = (BOOL) (attributes[i].type == HTMLA_ANAME);
+ attr_is_href = (BOOL) (attributes[i].type == HTMLA_HREF);
+ } else
+#endif
+ {
+ me->present[i] = YES;
+ Clear_extra(me->value[i]);
+#ifdef USE_COLOR_STYLE
+# ifdef USE_PRETTYSRC
+ current_is_class = IS_C(attributes[i]);
+# else
+ current_is_class = (!strcasecomp("class", s));
+# endif
+ CTRACE((tfp, "SGML: found attribute %s, %d\n", s, current_is_class));
+#endif
+ }
+ return;
+ }
+ /* if */
+ } /* for */
+
+ CTRACE((tfp, "SGML: Unknown attribute %s for tag %s\n",
+ s, NonNull(me->current_tag->name)));
+ me->current_attribute_number = INVALID; /* Invalid */
+}
+
+/* Handle attribute value
+ * ----------------------
+ */
+static void handle_attribute_value(HTStream *me, const char *s)
+{
+ if (me->current_attribute_number != INVALID) {
+ StrAllocCopy_extra(me->value[me->current_attribute_number], s);
+#ifdef USE_COLOR_STYLE
+ if (current_is_class) {
+ StrNCpy(class_string, s, TEMPSTRINGSIZE);
+ CTRACE((tfp, "SGML: class is '%s'\n", s));
+ } else {
+ CTRACE((tfp, "SGML: attribute value is '%s'\n", s));
+ }
+#endif
+ } else {
+ CTRACE((tfp, "SGML: Attribute value %s ***ignored\n", s));
+ }
+ me->current_attribute_number = INVALID; /* can't have two assignments! */
+}
+
+/*
+ * Translate some Unicodes to Lynx special codes and output them.
+ * Special codes - ones those output depend on parsing.
+ *
+ * Additional issue, like handling bidirectional text if necessary
+ * may be called from here: zwnj (8204), zwj (8205), lrm (8206), rlm (8207)
+ * - currently they are ignored in SGML.c and LYCharUtils.c
+ * but also in UCdomap.c because they are non printable...
+ *
+ */
+static BOOL put_special_unicodes(HTStream *me, UCode_t code)
+{
+ /* (Tgf_nolyspcl) */
+ if (me->no_lynx_specialcodes) {
+ /*
+ * We were asked by a "DTD" flag to not generate lynx specials. - kw
+ */
+ return NO;
+ }
+
+ if (code == CH_NBSP) { /* S/390 -- gil -- 0657 */
+ /*
+ * Use Lynx special character for nbsp.
+ */
+#ifdef USE_PRETTYSRC
+ if (!psrc_view)
+#endif
+ PUTC(HT_NON_BREAK_SPACE);
+ } else if (code == CH_SHY) {
+ /*
+ * Use Lynx special character for shy.
+ */
+#ifdef USE_PRETTYSRC
+ if (!psrc_view)
+#endif
+ PUTC(LY_SOFT_HYPHEN);
+ } else if (code == 8194 || code == 8201) {
+ /*
+ * Use Lynx special character for ensp or thinsp.
+ *
+ * Originally, Lynx use space '32' as word delimiter and omits this
+ * space at end of line if word is wrapped to the next line. There are
+ * several other spaces in the Unicode repertoire and we should teach
+ * Lynx to understand them, not only as regular characters but in the
+ * context of line wrapping. Unfortunately, if we use HT_EN_SPACE we
+ * override the chartrans tables for those spaces with a single '32'
+ * for all (but do line wrapping more fancy).
+ *
+ * We may treat emsp as one or two ensp (below).
+ */
+#ifdef USE_PRETTYSRC
+ if (!psrc_view)
+#endif
+ PUTC(HT_EN_SPACE);
+ } else if (code == 8195) {
+ /*
+ * Use Lynx special character for emsp.
+ */
+#ifdef USE_PRETTYSRC
+ if (!psrc_view) {
+#endif
+ /* PUTC(HT_EN_SPACE); let's stay with a single space :) */
+ PUTC(HT_EN_SPACE);
+#ifdef USE_PRETTYSRC
+ }
+#endif
+ } else {
+ /*
+ * Return NO if nothing done.
+ */
+ return NO;
+ }
+ /*
+ * We have handled it.
+ */
+ return YES;
+}
+
+#ifdef USE_PRETTYSRC
+static void put_pretty_entity(HTStream *me, int term)
+{
+ PSRCSTART(entity);
+ PUTC('&');
+ PUTS(entity_string);
+ if (term)
+ PUTC((char) term);
+ PSRCSTOP(entity);
+}
+
+static void put_pretty_number(HTStream *me)
+{
+ PSRCSTART(entity);
+ PUTS((me->isHex ? "&#x" : "&#"));
+ PUTS(entity_string);
+ PUTC(';');
+ PSRCSTOP(entity);
+}
+#endif /* USE_PRETTYSRC */
+
+/* Handle entity
+ * -------------
+ *
+ * On entry,
+ * s contains the entity name zero terminated
+ * Bugs:
+ * If the entity name is unknown, the terminator is treated as
+ * a printable non-special character in all cases, even if it is '<'
+ * Bug-fix:
+ * Modified SGML_character() so we only come here with terminator
+ * as '\0' and check a FoundEntity flag. -- Foteos Macrides
+ *
+ * Modified more (for use with Lynx character translation code):
+ */
+static char replace_buf[64]; /* buffer for replacement strings */
+static BOOL FoundEntity = FALSE;
+
+static void handle_entity(HTStream *me, int term)
+{
+ UCode_t code;
+ long uck = -1;
+ const char *s = me->string->data;
+
+ /*
+ * Handle all entities normally. - FM
+ */
+ FoundEntity = FALSE;
+ if ((code = HTMLGetEntityUCValue(s)) != 0) {
+ /*
+ * We got a Unicode value for the entity name. Check for special
+ * Unicodes. - FM
+ */
+ if (put_special_unicodes(me, code)) {
+#ifdef USE_PRETTYSRC
+ if (psrc_view) {
+ put_pretty_entity(me, term);
+ }
+#endif
+ FoundEntity = TRUE;
+ return;
+ }
+ /*
+ * Seek a translation from the chartrans tables.
+ */
+ if ((uck = UCTransUniChar(code, me->outUCLYhndl)) >= 32 &&
+/* =============== work in ASCII below here =============== S/390 -- gil -- 0672 */
+ uck < 256 &&
+ (uck < 127 ||
+ uck >= LYlowest_eightbit[me->outUCLYhndl])) {
+#ifdef USE_PRETTYSRC
+ if (psrc_view) {
+ put_pretty_entity(me, term);
+ } else
+#endif
+ PUTC(FROMASCII((char) uck));
+ FoundEntity = TRUE;
+ return;
+ } else if ((uck == -4 ||
+ (me->T.repl_translated_C0 &&
+ uck > 0 && uck < 32)) &&
+ /*
+ * Not found; look for replacement string.
+ */
+ (uck = UCTransUniCharStr(replace_buf, 60, code,
+ me->outUCLYhndl, 0) >= 0)) {
+#ifdef USE_PRETTYSRC
+ if (psrc_view) {
+ put_pretty_entity(me, term);
+ } else
+#endif
+ PUTS(replace_buf);
+ FoundEntity = TRUE;
+ return;
+ }
+ /*
+ * If we're displaying UTF-8, try that now. - FM
+ */
+#ifndef USE_PRETTYSRC
+ if (me->T.output_utf8 && PUTUTF8(code)) {
+ FoundEntity = TRUE;
+ return;
+ }
+#else
+ if (me->T.output_utf8 && (psrc_view
+ ? (UCPutUtf8_charstring((HTStream *) me->target,
+ (putc_func_t *) (fake_put_character),
+ code))
+ : PUTUTF8(code))) {
+
+ if (psrc_view) {
+ put_pretty_entity(me, term);
+ }
+
+ FoundEntity = TRUE;
+ return;
+ }
+#endif
+ /*
+ * If it's safe ASCII, use it. - FM
+ */
+ if (code >= 32 && code < 127) {
+#ifdef USE_PRETTYSRC
+ if (psrc_view) {
+ put_pretty_entity(me, term);
+ } else
+#endif
+
+ PUTC(FROMASCII((char) code));
+ FoundEntity = TRUE;
+ return;
+ }
+/* =============== work in ASCII above here =============== S/390 -- gil -- 0682 */
+ /*
+ * Ignore zwnj (8204) and zwj (8205), if we get to here. Note that
+ * zwnj may have been handled as <WBR> by the calling function. - FM
+ */
+ if (!strcmp(s, "zwnj") ||
+ !strcmp(s, "zwj")) {
+ CTRACE((tfp, "handle_entity: Ignoring '%s'.\n", s));
+#ifdef USE_PRETTYSRC
+ if (psrc_view) {
+ put_pretty_entity(me, term);
+ }
+#endif
+ FoundEntity = TRUE;
+ return;
+ }
+ /*
+ * Ignore lrm (8206), and rln (8207), if we get to here. - FM
+ */
+ if (!strcmp(s, "lrm") ||
+ !strcmp(s, "rlm")) {
+ CTRACE((tfp, "handle_entity: Ignoring '%s'.\n", s));
+#ifdef USE_PRETTYSRC
+ if (psrc_view) {
+ put_pretty_entity(me, term);
+ }
+#endif
+ FoundEntity = TRUE;
+ return;
+ }
+ }
+
+ /*
+ * If entity string not found, display as text.
+ */
+#ifdef USE_PRETTYSRC
+ if (psrc_view)
+ PSRCSTART(badseq);
+#endif
+ /* S/390 -- gil -- 0695 */
+ CTRACE((tfp, "SGML: Unknown entity '%s' %" PRI_UCode_t " %ld\n", s, code, uck));
+ PUTC('&');
+ PUTS(s);
+ if (term != '\0')
+ PUTC(term);
+#ifdef USE_PRETTYSRC
+ if (psrc_view)
+ PSRCSTOP(badseq);
+#endif
+}
+
+/* Handle comment
+ * --------------
+ */
+static void handle_comment(HTStream *me)
+{
+ const char *s = me->string->data;
+
+ CTRACE((tfp, "SGML Comment:\n<%s>\n", s));
+
+ if (me->csi == NULL &&
+ StrNCmp(s, "!--#", 4) == 0 &&
+ LYCheckForCSI(me->node_anchor, &me->url) == TRUE) {
+ LYDoCSI(me->url, s, &me->csi);
+ } else {
+ LYCommentHacks(me->node_anchor, me->string->data);
+ }
+
+ return;
+}
+
+/* Handle identifier
+ * -----------------
+ */
+static void handle_identifier(HTStream *me)
+{
+ const char *s = me->string->data;
+
+ CTRACE((tfp, "SGML Identifier:\n<%s>\n", s));
+
+ return;
+}
+
+/* Handle doctype
+ * --------------
+ */
+static void handle_doctype(HTStream *me)
+{
+ const char *s = me->string->data;
+
+ CTRACE((tfp, "SGML Doctype:\n<%s>\n", s));
+ if (strstr(s, "DTD XHTML ") != 0) {
+ CTRACE((tfp, "...processing extended HTML\n"));
+ me->extended_html = TRUE;
+ }
+
+ return;
+}
+
+/* Handle marked
+ * -------------
+ */
+static void handle_marked(HTStream *me)
+{
+ const char *s = me->string->data;
+
+ CTRACE((tfp, "SGML Marked Section:\n<%s>\n", s));
+
+ if (!StrNCmp(me->string->data, "![INCLUDE[", 10)) {
+ me->string->data[me->string->size - 3] = '\0';
+ StrAllocCat(me->include, me->string->data + 10);
+ /* @@@ This needs to take charset into account! @@@
+ the wrong assumptions will be made about the data's
+ charset once it is in include - kw */
+
+ } else if (!StrNCmp(me->string->data, "![CDATA[", 8)) {
+ (*me->actions->put_block) (me->target,
+ me->string->data + 8,
+ me->string->size - 11);
+
+ }
+ return;
+}
+
+/* Handle processing instruction
+ * -----------------------------
+ */
+static void handle_processing_instruction(HTStream *me)
+{
+ const char *s = me->string->data;
+
+ CTRACE((tfp, "SGML Processing instruction:\n<%s>\n", s));
+
+ if (!StrNCmp(s, "?xml ", 5)) {
+ int flag = me->T.decode_utf8;
+
+ me->strict_xml = TRUE;
+ /*
+ * Switch to UTF-8 if the encoding is explicitly "utf-8".
+ */
+ if (!flag) {
+ char *t = strstr(s, "encoding=");
+
+ if (t != 0) {
+ t += 9;
+ if (*t == '"')
+ ++t;
+ flag = !StrNCmp(t, "utf-8", 5);
+ }
+ if (flag) {
+ CTRACE((tfp, "...Use UTF-8 for XML\n"));
+ me->T.decode_utf8 = TRUE;
+ }
+ }
+ }
+
+ return;
+}
+
+/* Handle sgmlent
+ * --------------
+ */
+static void handle_sgmlent(HTStream *me)
+{
+ const char *s = me->string->data;
+
+ CTRACE((tfp, "SGML Entity Declaration:\n<%s>\n", s));
+
+ return;
+}
+
+/* Handle sgmlent
+ * --------------
+ */
+static void handle_sgmlele(HTStream *me)
+{
+ const char *s = me->string->data;
+
+ CTRACE((tfp, "SGML Element Declaration:\n<%s>\n", s));
+
+ return;
+}
+
+/* Handle sgmlatt
+ * --------------
+ */
+static void handle_sgmlatt(HTStream *me)
+{
+ const char *s = me->string->data;
+
+ CTRACE((tfp, "SGML Attribute Declaration:\n<%s>\n", s));
+
+ return;
+}
+
+/*
+ * Convenience macros - tags (elements) are identified sometimes by an int or
+ * enum value ('TAGNUM'), sometimes by a pointer to HTTag ('TAGP'). - kw
+ */
+#define TAGNUM_OF_TAGP(t) (HTMLElement) (t - me->dtd->tags)
+#define TAGP_OF_TAGNUM(e) (me->dtd->tags + e)
+
+/*
+ * The following implement special knowledge about OBJECT. As long as
+ * HTML_OBJECT is the only tag for which an alternative variant exist, they can
+ * be simple macros. - kw
+ */
+/* does 'TAGNUM' e have an alternative (variant) parsing mode? */
+#define HAS_ALT_TAGNUM(e) (e == HTML_OBJECT)
+
+/* return 'TAGNUM' of the alternative mode for 'TAGNUM' e, if any. */
+#define ALT_TAGNUM(e) ((e == HTML_OBJECT) ? HTML_ALT_OBJECT : e)
+
+/* return 'TAGNUM' of the normal mode for 'TAGNUM' e which may be alt. */
+#define NORMAL_TAGNUM(e) (((int)(e) >= HTML_ELEMENTS) ? HTML_OBJECT : (HTMLElement)e)
+
+/* More convenience stuff. - kw */
+#define ALT_TAGP_OF_TAGNUM(e) TAGP_OF_TAGNUM(ALT_TAGNUM(e))
+#define NORMAL_TAGP_OF_TAGNUM(e) TAGP_OF_TAGNUM(NORMAL_TAGNUM(e))
+
+#define ALT_TAGP(t) ALT_TAGP_OF_TAGNUM(TAGNUM_OF_TAGP(t))
+#define NORMAL_TAGP(t) NORMAL_TAGP_OF_TAGNUM(TAGNUM_OF_TAGP(t))
+
+#define IsTagAlias(a,b) (((a) == (b)) || ((a) - (a)->alias == (b) - (b)->alias))
+
+static BOOL element_valid_within(HTTag * new_tag, HTTag * stacked_tag, int direct)
+{
+ BOOL result = YES;
+ TagClass usecontains, usecontained;
+
+ if (stacked_tag && new_tag) {
+ usecontains = (direct ? stacked_tag->contains : stacked_tag->icontains);
+ usecontained = (direct ? new_tag->contained : new_tag->icontained);
+ if (IsTagAlias(new_tag, stacked_tag)) {
+ result = (BOOL) ((Tgc_same & usecontains) &&
+ (Tgc_same & usecontained));
+ } else {
+ result = (BOOL) ((new_tag->tagclass & usecontains) &&
+ (stacked_tag->tagclass & usecontained));
+ }
+ }
+ return result;
+}
+
+static BOOL element_really_within(HTTag * new_tag, HTTag * stacked_tag, int direct)
+{
+ BOOL result = YES;
+ TagClass usecontains, usecontained;
+
+ if (stacked_tag && new_tag) {
+ usecontains = (direct ? stacked_tag->contains : stacked_tag->icontains);
+ usecontained = (direct ? new_tag->contained : new_tag->icontained);
+ if (IsTagAlias(new_tag, stacked_tag)) {
+ result = (BOOL) ((Tgc_same & usecontains) &&
+ (Tgc_same & usecontained));
+ } else {
+ result = (BOOL) ((new_tag->tagclass & usecontains) ==
+ new_tag->tagclass &&
+ (stacked_tag->tagclass & usecontained) == stacked_tag->tagclass);
+ }
+ }
+ return result;
+}
+
+typedef enum {
+ close_NO = 0,
+ close_error = 1,
+ close_valid = 2
+} canclose_t;
+
+static canclose_t can_close(HTTag * new_tag, HTTag * stacked_tag)
+{
+ canclose_t result;
+
+ if (!stacked_tag) {
+ result = close_NO;
+ } else if (stacked_tag->flags & Tgf_endO) {
+ result = close_valid;
+ } else if (IsTagAlias(new_tag, stacked_tag)) {
+ result = ((Tgc_same & new_tag->canclose)
+ ? close_error
+ : close_NO);
+ } else {
+ result = ((stacked_tag->tagclass & new_tag->canclose)
+ ? close_error
+ : close_NO);
+ }
+ return result;
+}
+
+static void do_close_stacked(HTStream *me)
+{
+ HTElement *stacked = me->element_stack;
+ HTMLElement e;
+
+ if (!stacked)
+ return; /* stack was empty */
+ if (me->inSELECT && !strcasecomp(stacked->tag->name, "SELECT")) {
+ me->inSELECT = FALSE;
+ }
+ e = NORMAL_TAGNUM(TAGNUM_OF_TAGP(stacked->tag));
+#ifdef USE_PRETTYSRC
+ if (!psrc_view) /* Don't actually pass call on if viewing psrc - kw */
+#endif
+ (*me->actions->end_element) (me->target,
+ (int) e,
+ &me->include);
+ me->element_stack = stacked->next;
+ pool_free(stacked);
+ me->no_lynx_specialcodes =
+ (BOOL) (me->element_stack
+ ? (me->element_stack->tag->flags & Tgf_nolyspcl)
+ : NO);
+}
+
+static int is_on_stack(HTStream *me, HTTag * old_tag)
+{
+ HTElement *stacked = me->element_stack;
+ int i = 1;
+
+ for (; stacked; stacked = stacked->next, i++) {
+ if (IsTagAlias(stacked->tag, old_tag) ||
+ stacked->tag == ALT_TAGP(old_tag))
+ return i;
+ }
+ return 0;
+}
+
+/* End element
+ * -----------
+ */
+static void end_element(HTStream *me, HTTag * old_tag)
+{
+ BOOL extra_action_taken = NO;
+ canclose_t canclose_check = close_valid;
+ int stackpos = is_on_stack(me, old_tag);
+ BOOL direct_container = YES;
+
+ if (!Old_DTD) {
+ if (old_tag->aliases) {
+ if (me->element_stack) {
+ if (!element_really_within(old_tag,
+ me->element_stack->tag,
+ direct_container) &&
+ element_really_within(old_tag + 1,
+ me->element_stack->tag,
+ direct_container)) {
+ ++old_tag;
+ }
+ }
+ }
+ while (canclose_check != close_NO &&
+ me->element_stack &&
+ (stackpos > 1 || (!extra_action_taken && stackpos == 0))) {
+ if (stackpos == 0 && (old_tag->flags & Tgf_startO) &&
+ element_valid_within(old_tag, me->element_stack->tag, YES)) {
+ CTRACE((tfp, "SGML: </%s> ignored\n", old_tag->name));
+ return;
+ }
+ canclose_check = can_close(old_tag, me->element_stack->tag);
+ if (canclose_check != close_NO) {
+ CTRACE((tfp, "SGML: End </%s> \t<- %s end </%s>\n",
+ me->element_stack->tag->name,
+ ((canclose_check == close_valid)
+ ? "supplied,"
+ : "***forced by"),
+ old_tag->name));
+ do_close_stacked(me);
+ extra_action_taken = YES;
+ stackpos = is_on_stack(me, old_tag);
+ }
+ }
+
+ if (stackpos == 0 && old_tag->contents != SGML_EMPTY) {
+ CTRACE((tfp, "SGML: Still open %s, ***no open %s for </%s>\n",
+ me->element_stack ?
+ me->element_stack->tag->name : "none",
+ old_tag->name,
+ old_tag->name));
+ return;
+ }
+ if (stackpos > 1) {
+ CTRACE((tfp,
+ "SGML: Nesting <%s>...<%s> \t<- ***invalid end </%s>\n",
+ old_tag->name,
+ me->element_stack ?
+ me->element_stack->tag->name : "none",
+ old_tag->name));
+ return;
+ }
+ }
+ /* Now let the non-extended code deal with the rest. - kw */
+
+ /*
+ * If we are in a SELECT block, ignore anything but a SELECT end tag. - FM
+ */
+ if (me->inSELECT) {
+ if (!strcasecomp(old_tag->name, "SELECT")) {
+ /*
+ * Turn off the inSELECT flag and fall through. - FM
+ */
+ me->inSELECT = FALSE;
+ } else {
+ /*
+ * Ignore the end tag. - FM
+ */
+ CTRACE((tfp, "SGML: ***Ignoring end tag </%s> in SELECT block.\n",
+ old_tag->name));
+ return;
+ }
+ }
+ /*
+ * Handle the end tag. - FM
+ */
+ CTRACE((tfp, "SGML: End </%s>\n", old_tag->name));
+ if (old_tag->contents == SGML_EMPTY) {
+ CTRACE((tfp, "SGML: ***Illegal end tag </%s> found.\n",
+ old_tag->name));
+ return;
+ }
+#ifdef WIND_DOWN_STACK
+ while (me->element_stack) /* Loop is error path only */
+#else
+ if (me->element_stack) /* Substitute and remove one stack element */
+#endif /* WIND_DOWN_STACK */
+ {
+ int status = HT_OK;
+ HTMLElement e;
+ HTElement *N = me->element_stack;
+ HTTag *t = (N->tag != old_tag) ? NORMAL_TAGP(N->tag) : N->tag;
+
+ if (old_tag != t) { /* Mismatch: syntax error */
+ if (me->element_stack->next) { /* This is not the last level */
+ CTRACE((tfp,
+ "SGML: Found </%s> when expecting </%s>. </%s> ***assumed.\n",
+ old_tag->name, t->name, t->name));
+ } else { /* last level */
+ CTRACE((tfp,
+ "SGML: Found </%s> when expecting </%s>. </%s> ***Ignored.\n",
+ old_tag->name, t->name, old_tag->name));
+ return; /* Ignore */
+ }
+ }
+
+ e = NORMAL_TAGNUM(TAGNUM_OF_TAGP(t));
+ CTRACE2(TRACE_SGML, (tfp, "tagnum(%p) = %d\n", (void *) t, (int) e));
+#ifdef USE_PRETTYSRC
+ if (!psrc_view) /* Don't actually pass call on if viewing psrc - kw */
+#endif
+ status = (*me->actions->end_element) (me->target,
+ (int) e,
+ &me->include);
+ if (status == HT_PARSER_REOPEN_ELT) {
+ CTRACE((tfp, "SGML: Restart <%s>\n", t->name));
+ (*me->actions->start_element) (me->target,
+ (int) e,
+ NULL,
+ NULL,
+ me->current_tag_charset,
+ &me->include);
+ } else if (status == HT_PARSER_OTHER_CONTENT) {
+ CTRACE((tfp, "SGML: Continue with other content model for <%s>\n", t->name));
+ me->element_stack->tag = ALT_TAGP_OF_TAGNUM(e);
+ } else {
+ me->element_stack = N->next; /* Remove from stack */
+ pool_free(N);
+ }
+ me->no_lynx_specialcodes =
+ (BOOL) (me->element_stack
+ ? (me->element_stack->tag->flags & Tgf_nolyspcl)
+ : NO);
+#ifdef WIND_DOWN_STACK
+ if (IsTagAlias(old_tag, t))
+ return; /* Correct sequence */
+#else
+ return;
+#endif /* WIND_DOWN_STACK */
+
+ /* Syntax error path only */
+
+ }
+ CTRACE((tfp, "SGML: Extra end tag </%s> found and ignored.\n",
+ old_tag->name));
+}
+
+/* Start a element
+*/
+static void start_element(HTStream *me)
+{
+ int status;
+ HTTag *new_tag = me->current_tag;
+ HTMLElement e = TAGNUM_OF_TAGP(new_tag);
+ BOOL ok = FALSE;
+
+ BOOL valid = YES;
+ BOOL direct_container = YES;
+ BOOL extra_action_taken = NO;
+ canclose_t canclose_check = close_valid;
+
+ if (!Old_DTD) {
+ if (new_tag->aliases) {
+ if (me->element_stack) {
+ if (!element_really_within(new_tag,
+ me->element_stack->tag,
+ direct_container) &&
+ element_really_within(new_tag + 1,
+ me->element_stack->tag,
+ direct_container)) {
+ ++new_tag;
+ }
+ }
+ }
+ while (me->element_stack &&
+ (canclose_check == close_valid ||
+ (canclose_check == close_error &&
+ IsTagAlias(new_tag, me->element_stack->tag))) &&
+ !(valid = element_valid_within(new_tag,
+ me->element_stack->tag,
+ direct_container))) {
+ canclose_check = can_close(new_tag, me->element_stack->tag);
+ if (canclose_check != close_NO) {
+ CTRACE((tfp, "SGML: End </%s> \t<- %s start <%s>\n",
+ me->element_stack->tag->name,
+ ((canclose_check == close_valid)
+ ? "supplied,"
+ : "***forced by"),
+ new_tag->name));
+ do_close_stacked(me);
+ extra_action_taken = YES;
+ if (canclose_check == close_error)
+ direct_container = NO;
+ } else {
+ CTRACE((tfp,
+ "SGML: Still open %s \t<- ***invalid start <%s>\n",
+ me->element_stack->tag->name,
+ new_tag->name));
+ }
+ }
+ if (me->element_stack && !valid &&
+ (me->element_stack->tag->flags & Tgf_strict) &&
+ !(valid = element_valid_within(new_tag,
+ me->element_stack->tag,
+ direct_container))) {
+ CTRACE((tfp, "SGML: Still open %s \t<- ***ignoring start <%s>\n",
+ me->element_stack->tag->name,
+ new_tag->name));
+ return;
+ }
+
+ if (me->element_stack &&
+ !extra_action_taken &&
+ (canclose_check == close_NO) &&
+ !valid && (new_tag->flags & Tgf_mafse)) {
+ BOOL has_attributes = NO;
+ int i = 0;
+
+ for (; i < new_tag->number_of_attributes && !has_attributes; i++)
+ has_attributes = me->present[i];
+ if (!has_attributes) {
+ CTRACE((tfp,
+ "SGML: Still open %s, ***converting invalid <%s> to </%s>\n",
+ me->element_stack->tag->name,
+ new_tag->name,
+ new_tag->name));
+ end_element(me, new_tag);
+ return;
+ }
+ }
+
+ if (me->element_stack &&
+ (canclose_check == close_error) &&
+ !element_valid_within(new_tag,
+ me->element_stack->tag,
+ direct_container)) {
+ CTRACE((tfp, "SGML: Still open %s \t<- ***invalid start <%s>\n",
+ me->element_stack->tag->name,
+ new_tag->name));
+ }
+ }
+ /* Fall through to the non-extended code - kw */
+
+ /*
+ * If we are not in a SELECT block, check if this is a SELECT start tag.
+ * Otherwise (i.e., we are in a SELECT block) accept only OPTION as valid,
+ * terminate the SELECT block if it is any other form-related element, and
+ * otherwise ignore it. - FM
+ */
+ if (!me->inSELECT) {
+ /*
+ * We are not in a SELECT block, so check if this starts one. - FM
+ * (frequent case!)
+ */
+ /* my_casecomp() - optimized by the first character */
+ if (!my_casecomp(new_tag->name, "SELECT")) {
+ /*
+ * Set the inSELECT flag and fall through. - FM
+ */
+ me->inSELECT = TRUE;
+ }
+ } else {
+ /*
+ * We are in a SELECT block. - FM
+ */
+ if (strcasecomp(new_tag->name, "OPTION")) {
+ /*
+ * Ugh, it is not an OPTION. - FM
+ */
+ switch (e) {
+ case HTML_INPUT:
+ case HTML_TEXTAREA:
+ case HTML_SELECT:
+ case HTML_BUTTON:
+ case HTML_FIELDSET:
+ case HTML_LABEL:
+ case HTML_LEGEND:
+ case HTML_FORM:
+ ok = TRUE;
+ break;
+ default:
+ break;
+ }
+ if (ok) {
+ /*
+ * It is another form-related start tag, so terminate the
+ * current SELECT block and fall through. - FM
+ */
+ CTRACE((tfp,
+ "SGML: ***Faking SELECT end tag before <%s> start tag.\n",
+ new_tag->name));
+ end_element(me, SGMLFindTag(me->dtd, "SELECT"));
+ } else {
+ /*
+ * Ignore the start tag. - FM
+ */
+ CTRACE((tfp,
+ "SGML: ***Ignoring start tag <%s> in SELECT block.\n",
+ new_tag->name));
+ return;
+ }
+ }
+ }
+ /*
+ * Handle the start tag. - FM
+ */
+ CTRACE((tfp, "SGML: Start <%s>\n", new_tag->name));
+ status = (*me->actions->start_element) (me->target,
+ (int) TAGNUM_OF_TAGP(new_tag),
+ me->present,
+ (STRING2PTR) me->value, /* coerce type for think c */
+ me->current_tag_charset,
+ &me->include);
+ if (status == HT_PARSER_OTHER_CONTENT)
+ new_tag = ALT_TAGP(new_tag); /* this is only returned for OBJECT */
+ if (new_tag->contents != SGML_EMPTY) { /* i.e., tag not empty */
+ HTElement *N = pool_alloc();
+
+ if (N == NULL)
+ outofmem(__FILE__, "start_element");
+
+ N->next = me->element_stack;
+ N->tag = new_tag;
+ me->element_stack = N;
+ me->no_lynx_specialcodes = (BOOLEAN) (new_tag->flags & Tgf_nolyspcl);
+
+ } else if (e == HTML_META) {
+ /*
+ * Check for result of META tag. - KW & FM
+ */
+ change_chartrans_handling(me);
+ }
+}
+
+/* Find Tag in DTD tag list
+ * ------------------------
+ *
+ * On entry,
+ * dtd points to dtd structure including valid tag list
+ * string points to name of tag in question
+ *
+ * On exit,
+ * returns:
+ * NULL tag not found
+ * else address of tag structure in dtd
+ */
+HTTag *SGMLFindTag(const SGML_dtd * dtd,
+ const char *s)
+{
+ int high, low, i, diff;
+ static HTTag *last[64] =
+ {NULL}; /*optimize using the previous results */
+ HTTag **res = last + (UCH(*s) % 64); /*pointer arithmetic */
+
+ if (*res) {
+ if ((*res)->name == NULL)
+ return NULL;
+ if (!strcasecomp((*res)->name, s))
+ return *res;
+ }
+
+ for (low = 0, high = dtd->number_of_tags;
+ high > low;
+ diff < 0 ? (low = i + 1) : (high = i)) { /* Binary search */
+ i = (low + (high - low) / 2);
+ /* my_casecomp() - optimized by the first character, NOT_ASCII ok */
+ diff = my_casecomp(dtd->tags[i].name, s); /* Case insensitive */
+ if (diff == 0) { /* success: found it */
+ i -= dtd->tags[i].alias;
+ *res = &dtd->tags[i];
+ return *res;
+ }
+ }
+ if (IsNmStart(*s)) {
+ /*
+ * Unrecognized, but may be valid. - KW
+ */
+ return &HTTag_unrecognized;
+ }
+ return NULL;
+}
+
+/*________________________________________________________________________
+ * Public Methods
+ */
+
+/* Could check that we are back to bottom of stack! @@ */
+/* Do check! - FM */
+/* */
+static void SGML_free(HTStream *me)
+{
+ int i;
+ HTElement *cur;
+ HTTag *t;
+
+ /*
+ * Free the buffers. - FM
+ */
+ FREE(me->recover);
+ FREE(me->url);
+ FREE(me->csi);
+ FREE(me->include);
+ FREE(me->active_include);
+
+ /*
+ * Wind down stack if any elements are open. - FM
+ */
+ while (me->element_stack) {
+ cur = me->element_stack;
+ t = cur->tag;
+ me->element_stack = cur->next; /* Remove from stack */
+ pool_free(cur);
+#ifdef USE_PRETTYSRC
+ if (!psrc_view) /* Don't actually call on target if viewing psrc - kw */
+#endif
+ (*me->actions->end_element)
+ (me->target,
+ (int) NORMAL_TAGNUM(TAGNUM_OF_TAGP(t)),
+ &me->include);
+ FREE(me->include);
+ }
+
+ /*
+ * Finish off the target. - FM
+ */
+ (*me->actions->_free) (me->target);
+
+ /*
+ * Free the strings and context structure. - FM
+ */
+ HTChunkFree(me->string);
+ for (i = 0; i < MAX_ATTRIBUTES; i++)
+ FREE_extra(me->value[i]);
+ FREE(me);
+
+#ifdef USE_PRETTYSRC
+ sgml_in_psrc_was_initialized = FALSE;
+#endif
+}
+
+static void SGML_abort(HTStream *me, HTError e)
+{
+ int i;
+ HTElement *cur;
+
+ /*
+ * Abort the target. - FM
+ */
+ (*me->actions->_abort) (me->target, e);
+
+ /*
+ * Free the buffers. - FM
+ */
+ FREE(me->recover);
+ FREE(me->include);
+ FREE(me->active_include);
+ FREE(me->url);
+ FREE(me->csi);
+
+ /*
+ * Free stack memory if any elements were left open. - KW
+ */
+ while (me->element_stack) {
+ cur = me->element_stack;
+ me->element_stack = cur->next; /* Remove from stack */
+ pool_free(cur);
+ }
+
+ /*
+ * Free the strings and context structure. - FM
+ */
+ HTChunkFree(me->string);
+ for (i = 0; i < MAX_ATTRIBUTES; i++)
+ FREE_extra(me->value[i]);
+ FREE(me);
+
+#ifdef USE_PRETTYSRC
+ sgml_in_psrc_was_initialized = FALSE;
+#endif
+}
+
+/* Read and write user callback handle
+ * -----------------------------------
+ *
+ * The callbacks from the SGML parser have an SGML context parameter.
+ * These calls allow the caller to associate his own context with a
+ * particular SGML context.
+ */
+
+#ifdef CALLERDATA
+void *SGML_callerData(HTStream *me)
+{
+ return me->callerData;
+}
+
+void SGML_setCallerData(HTStream *me, void *data)
+{
+ me->callerData = data;
+}
+#endif /* CALLERDATA */
+
+#ifdef USE_PRETTYSRC
+static void transform_tag(HTStream *me, HTChunk *string)
+{
+ if (!me->strict_xml) {
+ if (tagname_transform != 1) {
+ if (tagname_transform == 0)
+ LYLowerCase(string->data);
+ else
+ LYUpperCase(string->data);
+ }
+ }
+}
+#endif /* USE_PRETTYSRC */
+
+static BOOL ignore_when_empty(HTTag * tag)
+{
+ BOOL result = FALSE;
+
+ if (!LYPreparsedSource
+ && LYxhtml_parsing
+ && tag->name != 0
+ && !(tag->flags & Tgf_mafse)
+ && tag->contents != SGML_EMPTY
+ && tag->tagclass != Tgc_Plike
+ && (tag->tagclass == Tgc_APPLETlike
+ || tag->tagclass == Tgc_SELECTlike
+ || (tag->contains && tag->icontains))) {
+ result = TRUE;
+ }
+ CTRACE((tfp, "SGML Do%s ignore_when_empty:%s\n",
+ result ? "" : " not",
+ NonNull(tag->name)));
+ return result;
+}
+
+static void discard_empty(HTStream *me)
+{
+ static HTTag empty_tag;
+
+ CTRACE((tfp, "SGML discarding empty %s\n",
+ NonNull(me->current_tag->name)));
+ CTRACE_FLUSH(tfp);
+
+ memset(&empty_tag, 0, sizeof(empty_tag));
+ me->current_tag = &empty_tag;
+ me->string->size = 0;
+
+ /* do not call end_element() if start_element() was not called */
+}
+
+#ifdef USE_PRETTYSRC
+static BOOL end_if_prettysrc(HTStream *me, HTChunk *string, int end_ch)
+{
+ BOOL result = psrc_view;
+
+ if (psrc_view) {
+ if (attr_is_name) {
+ HTStartAnchor(me->target, string->data, NULL);
+ (*me->actions->end_element) (me->target,
+ HTML_A,
+ &me->include);
+ } else if (attr_is_href) {
+ PSRCSTART(href);
+ HTStartAnchor(me->target, NULL, string->data);
+ }
+ PUTS_TR(string->data);
+ if (attr_is_href) {
+ (*me->actions->end_element) (me->target,
+ HTML_A,
+ &me->include);
+ PSRCSTOP(href);
+ }
+ if (end_ch)
+ PUTC(end_ch);
+ PSRCSTOP(attrval);
+ }
+ return result;
+}
+#endif
+
+static void SGML_character(HTStream *me, int c_in)
+{
+ const SGML_dtd *dtd = me->dtd;
+ HTChunk *string = me->string;
+ const char *EntityName;
+ HTTag *testtag = NULL;
+ BOOLEAN chk; /* Helps (?) walk through all the else ifs... */
+ UCode_t clong, uck = 0; /* Enough bits for UCS4 ... */
+ int testlast;
+
+ unsigned char c;
+ unsigned char saved_char_in = '\0';
+
+ ++sgml_offset;
+
+ c = UCH(c_in);
+ clong = UCH(c);
+
+ if (me->T.decode_utf8) {
+ switch (HTDecodeUTF8(&(me->U), &c_in, &clong)) {
+ case dUTF8_ok:
+ if (clong < 256) {
+ c_in = FROMASCII(UCH(clong));
+ }
+ break;
+ case dUTF8_err:
+ clong = UCS_REPL;
+ strcpy(me->U.utf_buf, "\357\277\275");
+ me->U.utf_buf_p = (me->U.utf_buf + 3);
+ break;
+ case dUTF8_more:
+ return;
+ }
+
+ c = UCH(c_in);
+ if ((me->U.utf_buf_p - me->U.utf_buf) > 1) {
+ goto top1;
+ }
+ }
+
+ /*
+ * If we want the raw input converted to Unicode, try that now. - FM
+ */
+#ifdef USE_JAPANESEUTF8_SUPPORT
+ /* Convert ISO-2022-JP to Unicode (charset=iso-2022-jp is unrecognized) */
+#define IS_JIS7_HILO(c) (0x20<(c)&&(c)<0x7F)
+ if (UTF8_TTY_ISO2022JP && (me->state == S_nonascii_text
+ || me->state == S_nonascii_text_sq
+ || me->state == S_nonascii_text_dq)) {
+ /* end of ISO-2022-JP? || not in ISO-2022-JP range */
+ if (TOASCII(c) == '\033' || !IS_JIS7_HILO(c)) {
+ me->kanji_buf = '\0';
+ goto top1;
+ }
+ if (me->kanji_buf == '\t') { /* flag for single byte kana in "ESC(I" */
+ if (conv_jisx0201kana) {
+ JISx0201TO0208_SJIS(c | 0200,
+ (unsigned char *) me->U.utf_buf,
+ (unsigned char *) me->U.utf_buf + 1);
+ clong = UCTransJPToUni(me->U.utf_buf, 2,
+ UCGetLYhndl_byMIME("shift_jis"));
+ } else {
+ clong = UCTransToUni(c | 0200, UCGetLYhndl_byMIME("shift_jis"));
+ }
+ } else if (me->kanji_buf) {
+ me->U.utf_buf[0] = (char) (me->kanji_buf | 0200); /* to EUC-JP */
+ me->U.utf_buf[1] = (char) (c | 0200);
+ clong = UCTransJPToUni(me->U.utf_buf, 2,
+ UCGetLYhndl_byMIME("euc-jp"));
+ me->kanji_buf = '\0';
+ } else {
+ me->kanji_buf = c;
+ clong = ucNeedMore;
+ }
+ goto top1;
+ }
+#endif /* USE_JAPANESEUTF8_SUPPORT */
+#ifdef USE_JAPANESEUTF8_SUPPORT
+ if (me->T.trans_to_uni &&
+ ((strcmp(LYCharSet_UC[me->inUCLYhndl].MIMEname, "euc-jp") == 0) ||
+ (strcmp(LYCharSet_UC[me->inUCLYhndl].MIMEname, "shift_jis") == 0))) {
+ if (strcmp(LYCharSet_UC[me->inUCLYhndl].MIMEname, "shift_jis") == 0) {
+ if (me->U.utf_count == 0) {
+ if (IS_SJIS_HI1(c) ||
+ IS_SJIS_HI2(c)) {
+ me->U.utf_buf[0] = (char) c;
+ me->U.utf_count = 1;
+ clong = ucCannotConvert;
+ } else if (IS_SJIS_X0201KANA(c)) {
+ if (conv_jisx0201kana) {
+ JISx0201TO0208_SJIS(c,
+ (unsigned char *) me->U.utf_buf,
+ (unsigned char *) me->U.utf_buf + 1);
+ clong = UCTransJPToUni(me->U.utf_buf, 2, me->inUCLYhndl);
+ } else {
+ clong = UCTransToUni(c, me->inUCLYhndl);
+ }
+ }
+ } else {
+ if (IS_SJIS_LO(c)) {
+ me->U.utf_buf[1] = (char) c;
+ clong = UCTransJPToUni(me->U.utf_buf, 2, me->inUCLYhndl);
+ }
+ me->U.utf_count = 0;
+ }
+ } else {
+ if (me->U.utf_count == 0) {
+ if (IS_EUC_HI(c) || c == 0x8E) {
+ me->U.utf_buf[0] = (char) c;
+ me->U.utf_count = 1;
+ clong = ucCannotConvert;
+ }
+ } else {
+ if (IS_EUC_LOX(c)) {
+ me->U.utf_buf[1] = (char) c;
+ clong = UCTransJPToUni(me->U.utf_buf, 2, me->inUCLYhndl);
+ }
+ me->U.utf_count = 0;
+ }
+ }
+ goto top1;
+ } else
+#endif /* USE_JAPANESEUTF8_SUPPORT */
+#ifdef EXP_CHINESEUTF8_SUPPORT
+ if (me->T.trans_to_uni &&
+ ((strcmp(LYCharSet_UC[me->inUCLYhndl].MIMEname, "euc-cn") == 0))) {
+ if (me->U.utf_count == 0) {
+ if (IS_GBK_HI(c)) {
+ me->U.utf_buf[0] = (char) c;
+ me->U.utf_count = 1;
+ clong = ucCannotConvert;
+ CTRACE((tfp, "Get EUC-CN: 0x%02X\n", UCH(c)));
+ }
+ } else {
+ if (IS_GBK_LO(c)) {
+ me->U.utf_buf[1] = (char) c;
+ clong = UCTransJPToUni(me->U.utf_buf, 2, me->inUCLYhndl);
+ if (clong > 0) {
+ CTRACE((tfp, "... second: [%02X%02X] U+%04lX\n",
+ UCH(me->U.utf_buf[0]),
+ UCH(me->U.utf_buf[1]),
+ clong));
+ } else {
+ CTRACE((tfp, "... second: [%02X%02X] %ld\n",
+ UCH(me->U.utf_buf[0]),
+ UCH(me->U.utf_buf[1]),
+ clong));
+ }
+ }
+ me->U.utf_count = 0;
+ }
+ goto top1;
+ } else
+#endif /* EXP_CHINESEUTF8_SUPPORT */
+#ifdef EXP_CHINESEUTF8_SUPPORT
+ if (me->T.trans_to_uni &&
+ ((strcmp(LYCharSet_UC[me->inUCLYhndl].MIMEname, "euc-kr") == 0))) {
+ if (me->U.utf_count == 0) {
+ if (IS_EUC_HI(c)) {
+ me->U.utf_buf[0] = (char) c;
+ me->U.utf_count = 1;
+ clong = ucCannotConvert;
+ CTRACE((tfp, "Get EUC-KR: 0x%02X\n", UCH(c)));
+ }
+ } else {
+ if (IS_EUC_LOS(c) ||
+ IS_EUC_LOX(c)) {
+ me->U.utf_buf[1] = (char) c;
+ clong = UCTransJPToUni(me->U.utf_buf, 2, me->inUCLYhndl);
+ if (clong > 0) {
+ CTRACE((tfp, "... second: [%02X%02X] U+%04lX\n",
+ UCH(me->U.utf_buf[0]),
+ UCH(me->U.utf_buf[1]),
+ clong));
+ } else {
+ CTRACE((tfp, "... second: [%02X%02X] %ld\n",
+ UCH(me->U.utf_buf[0]),
+ UCH(me->U.utf_buf[1]),
+ clong));
+ }
+ }
+ me->U.utf_count = 0;
+ }
+ goto top1;
+ } else
+#endif /* EXP_CHINESEUTF8_SUPPORT */
+#ifdef EXP_CHINESEUTF8_SUPPORT
+ if (me->T.trans_to_uni &&
+ ((strcmp(LYCharSet_UC[me->inUCLYhndl].MIMEname, "big5") == 0))) {
+ if (me->U.utf_count == 0) {
+ if (IS_BIG5_HI(c)) {
+ me->U.utf_buf[0] = (char) c;
+ me->U.utf_count = 1;
+ clong = ucCannotConvert;
+ CTRACE((tfp, "Get BIG5: 0x%02X\n", UCH(c)));
+ }
+ } else {
+ if (IS_BIG5_LOS(c) ||
+ IS_BIG5_LOX(c)) {
+ me->U.utf_buf[1] = (char) c;
+ clong = UCTransJPToUni(me->U.utf_buf, 2, me->inUCLYhndl);
+ if (clong > 0) {
+ CTRACE((tfp, "... second: [%02X%02X] U+%04lX\n",
+ UCH(me->U.utf_buf[0]),
+ UCH(me->U.utf_buf[1]),
+ clong));
+ } else {
+ CTRACE((tfp, "... second: [%02X%02X] %ld\n",
+ UCH(me->U.utf_buf[0]),
+ UCH(me->U.utf_buf[1]),
+ clong));
+ }
+ }
+ me->U.utf_count = 0;
+ }
+ goto top1;
+ } else
+#endif /* EXP_CHINESEUTF8_SUPPORT */
+ if (me->T.trans_to_uni &&
+ /* S/390 -- gil -- 0744 */
+ ((TOASCII(clong) >= LYlowest_eightbit[me->inUCLYhndl]) ||
+ (clong < ' ' && clong != 0 &&
+ me->T.trans_C0_to_uni))) {
+ /*
+ * Convert the octet to Unicode. - FM
+ */
+ clong = UCTransToUni((char) c, me->inUCLYhndl);
+ if (clong > 0) {
+ saved_char_in = c;
+ if (clong < 256) {
+ c = FROMASCII(UCH(clong));
+ }
+ }
+ goto top1;
+ } else if (clong < ' ' && clong != 0 && /* S/390 -- gil -- 0768 */
+ me->T.trans_C0_to_uni) {
+ /*
+ * This else if may be too ugly to keep. - KW
+ */
+ if (me->T.trans_from_uni &&
+ (((clong = UCTransToUni((char) c, me->inUCLYhndl)) >= ' ') ||
+ (me->T.transp &&
+ (clong = UCTransToUni((char) c, me->inUCLYhndl)) > 0))) {
+ saved_char_in = c;
+ if (clong < 256) {
+ c = FROMASCII(UCH(clong));
+ }
+ goto top1;
+ } else {
+ uck = -1;
+ if (me->T.transp) {
+ uck = UCTransCharStr(replace_buf, 60, (char) c,
+ me->inUCLYhndl,
+ me->inUCLYhndl, NO);
+ }
+ if (!me->T.transp || uck < 0) {
+ uck = UCTransCharStr(replace_buf, 60, (char) c,
+ me->inUCLYhndl,
+ me->outUCLYhndl, YES);
+ }
+ if (uck == 0) {
+ return;
+ } else if (uck < 0) {
+ goto top0a;
+ }
+ c = UCH(replace_buf[0]);
+ if (c && replace_buf[1]) {
+ if (me->state == S_text) {
+ PUTS(replace_buf);
+ return;
+ }
+ StrAllocCat(me->recover, replace_buf + 1);
+ }
+ goto top0a;
+ } /* Next line end of ugly stuff for C0. - KW */
+ } else { /* end of me->T.trans_to_uni S/390 -- gil -- 0791 */
+ goto top0a;
+ }
+
+ /*
+ * We jump up to here from below if we have
+ * stuff in the recover, insert, or csi buffers
+ * to process. We zero saved_char_in, in effect
+ * as a flag that the octet is not that of the
+ * actual call to this function. This may be OK
+ * for now, for the stuff this function adds to
+ * its recover buffer, but it might not be for
+ * stuff other functions added to the insert or
+ * csi buffer, so bear that in mind. - FM
+ * Stuff from the recover buffer is now handled
+ * as UTF-8 if we can expect that's what it is,
+ * and in that case we don't come back up here. - kw
+ */
+ top:
+ saved_char_in = '\0';
+ /*
+ * We jump to here from above when we don't have
+ * UTF-8 input, haven't converted to Unicode, and
+ * want clong set to the input octet (unsigned)
+ * without zeroing its saved_char_in copy (which
+ * is signed). - FM
+ */
+ top0a:
+ *(me->U.utf_buf) = '\0';
+ clong = UCH(c);
+ /*
+ * We jump to here from above if we have converted
+ * the input, or a multibyte sequence across calls,
+ * to a Unicode value and loaded it into clong (to
+ * which unsign_c has been defined), and from below
+ * when we are recycling a character (e.g., because
+ * it terminated an entity but is not the standard
+ * semi-colon). The character will already have
+ * been put through the Unicode conversions. - FM
+ */
+ top1:
+ /*
+ * Ignore low ISO 646 7-bit control characters if HTCJK is not set. - FM
+ */
+ /*
+ * Works for both ASCII and EBCDIC. -- gil
+ * S/390 -- gil -- 0811
+ */
+ if (TOASCII(clong) < 32 &&
+ c != '\t' && c != '\n' && c != '\r' &&
+ !IS_CJK_TTY &&
+ !(UTF8_TTY_ISO2022JP && (TOASCII(c) == '\033')))
+ goto after_switch;
+
+ /*
+ * Ignore 127 if we don't have HTPassHighCtrlRaw or HTCJK set. - FM
+ */
+#define PASSHICTRL (me->T.transp || \
+ clong >= LYlowest_eightbit[me->inUCLYhndl])
+ if (TOASCII(c) == 127 && /* S/390 -- gil -- 0830 */
+ !(PASSHICTRL || IS_CJK_TTY))
+ goto after_switch;
+
+ /*
+ * Ignore 8-bit control characters 128 - 159 if neither HTPassHighCtrlRaw
+ * nor HTCJK is set. - FM
+ */
+ if (TOASCII(clong) > 127 && TOASCII(clong) < 160 && /* S/390 -- gil -- 0847 */
+ !(PASSHICTRL || IS_CJK_TTY)) {
+ /*
+ * If we happen to be reading from an "ISO-8859-1" or "US-ASCII"
+ * document, allow the cp-1252 codes, to accommodate the HTML5 draft
+ * recommendation for replacement encoding:
+ *
+ * http://www.whatwg.org/specs/web-apps/current-work/multipage/infrastructure.html#character-encodings-0
+ */
+ if (AssumeCP1252(me)) {
+ clong = LYcp1252ToUnicode((UCode_t) c);
+ goto top1;
+ }
+ goto after_switch;
+ }
+
+ /* Almost all CJK characters are double byte but only Japanese
+ * JIS X0201 Kana is single byte. To prevent to fail SGML parsing
+ * we have to take care of them here. -- TH
+ */
+ if ((HTCJK == JAPANESE) && (me->state == S_in_kanji) &&
+ !IS_JAPANESE_2BYTE(me->kanji_buf, UCH(c))
+#ifdef USE_JAPANESEUTF8_SUPPORT
+ && !me->T.decode_utf8
+#endif
+ ) {
+#ifdef CONV_JISX0201KANA_JISX0208KANA
+ if (IS_SJIS_X0201KANA(me->kanji_buf)) {
+ unsigned char sjis_hi, sjis_lo;
+
+ JISx0201TO0208_SJIS(me->kanji_buf, &sjis_hi, &sjis_lo);
+ PUTC(sjis_hi);
+ PUTC(sjis_lo);
+ } else
+#endif
+ PUTC(me->kanji_buf);
+ me->state = S_text;
+ }
+
+ /*
+ * Handle character based on me->state.
+ */
+ CTRACE2(TRACE_SGML, (tfp, "SGML before %s|%.*s|%c|\n",
+ state_name(me->state),
+ string->size,
+ NonNull(string->data),
+ UCH(c)));
+ switch (me->state) {
+
+ case S_in_kanji:
+ /*
+ * Note that if we don't have a CJK input, then this is not the second
+ * byte of a CJK di-byte, and we're trashing the input. That's why
+ * 8-bit characters followed by, for example, '<' can cause the tag to
+ * be treated as text, not markup. We could try to deal with it by
+ * holding each first byte and then checking byte pairs, but that
+ * doesn't seem worth the overhead (see below). - FM
+ */
+ me->state = S_text;
+ PUTC(me->kanji_buf);
+ PUTC(c);
+ break;
+
+ case S_tagname_slash:
+ /*
+ * We had something link "<name/" so far, set state to S_text but keep
+ * me->slashedtag as a flag; except if we get '>' directly
+ * after the "<name/", and really have a tag for that name in
+ * me->slashedtag, in which case keep state as is and let code
+ * below deal with it. - kw
+ */
+ if (!(c == '>' && me->slashedtag && TOASCII(clong) < 127)) {
+ me->state = S_text;
+ }
+ /* FALLTHRU */
+ case S_text:
+#ifdef EXP_CHINESEUTF8_SUPPORT
+ if (IS_CJK_TTY &&
+ (!strcmp(LYCharSet_UC[me->inUCLYhndl].MIMEname, "euc-cn") ||
+ !strcmp(LYCharSet_UC[me->inUCLYhndl].MIMEname, "big5") ||
+ !strcmp(LYCharSet_UC[me->inUCLYhndl].MIMEname, "euc-kr"))) {
+ /*
+ * Leave the case statement if we have not collected both of the
+ * bytes for the EUC-CN character. If we have, then continue on
+ * to convert it to Unicode.
+ */
+ if (clong == ucCannotConvert) {
+ break;
+ }
+ } else
+#endif
+ if (IS_CJK_TTY && ((TOASCII(c) & 0200) != 0)
+#ifdef USE_JAPANESEUTF8_SUPPORT
+ && !me->T.decode_utf8
+#endif
+ ) { /* S/390 -- gil -- 0864 */
+ /*
+ * Setting up for Kanji multibyte handling (based on Takuya ASADA's
+ * (asada@three-a.co.jp) CJK Lynx). Note that if the input is not
+ * in fact CJK, the next byte also will be mishandled, as explained
+ * above. Toggle raw mode off in such cases, or select the "7 bit
+ * approximations" display character set, which is largely
+ * equivalent to having raw mode off with CJK. - FM
+ */
+ me->state = S_in_kanji;
+ me->kanji_buf = c;
+ break;
+ } else if ((IS_CJK_TTY || UTF8_TTY_ISO2022JP) && TOASCII(c) == '\033') {
+ /* S/390 -- gil -- 0881 */
+ /*
+ * Setting up for CJK escape sequence handling (based on Takuya
+ * ASADA's (asada@three-a.co.jp) CJK Lynx). - FM
+ */
+ me->state = S_esc;
+ if (!UTF8_TTY_ISO2022JP)
+ PUTC(c);
+ break;
+ }
+
+ if (c == '&' || c == '<') {
+#ifdef USE_PRETTYSRC
+ if (psrc_view) { /*there is nothing useful in the element_stack */
+ testtag = me->current_tag;
+ } else
+#endif
+ {
+ testtag = me->element_stack ?
+ me->element_stack->tag : NULL;
+ }
+ }
+
+ if (c == '&' && TOASCII(clong) < 127 && /* S/390 -- gil -- 0898 */
+ (!testtag ||
+ (testtag->contents == SGML_MIXED ||
+ testtag->contents == SGML_ELEMENT ||
+ testtag->contents == SGML_PCDATA ||
+#ifdef USE_PRETTYSRC
+ testtag->contents == SGML_EMPTY ||
+#endif
+ testtag->contents == SGML_RCDATA))) {
+ /*
+ * Setting up for possible entity, without the leading '&'. - FM
+ */
+ string->size = 0;
+ me->state = S_ero;
+ } else if (c == '<' && TOASCII(clong) < 127) { /* S/390 -- gil -- 0915 */
+ /*
+ * Setting up for possible tag. - FM
+ */
+ string->size = 0;
+ if (testtag && testtag->contents == SGML_PCDATA) {
+ me->state = S_pcdata;
+ } else if (testtag && (testtag->contents == SGML_LITTERAL
+ || testtag->contents == SGML_CDATA)) {
+ me->state = S_litteral;
+ } else if (testtag && (testtag->contents == SGML_SCRIPT)) {
+ me->state = S_script;
+ } else {
+ me->state = S_tag;
+ }
+ me->slashedtag = NULL;
+ } else if (me->slashedtag &&
+ me->slashedtag->name &&
+ (c == '/' ||
+ (c == '>' && me->state == S_tagname_slash)) &&
+ TOASCII(clong) < 127) {
+ /*
+ * We got either the second slash of a pending "<NAME/blah blah/"
+ * shortref construct, or the '>' of a mere "<NAME/>". In both
+ * cases generate a "</NAME>" end tag in the recover buffer for
+ * reparsing unless NAME is really an empty element. - kw
+ */
+#ifdef USE_PRETTYSRC
+ if (psrc_view) {
+ PSRCSTART(abracket);
+ PUTC(c);
+ PSRCSTOP(abracket);
+ } else
+#endif
+ if (me->slashedtag != me->unknown_tag &&
+ !ReallyEmptyTag(me->slashedtag)) {
+ if (me->recover == NULL) {
+ StrAllocCopy(me->recover, "</");
+ me->recover_index = 0;
+ } else {
+ StrAllocCat(me->recover, "</");
+ }
+ StrAllocCat(me->recover, me->slashedtag->name);
+ StrAllocCat(me->recover, ">");
+ }
+ me->slashedtag = NULL;
+
+ } else if (me->element_stack &&
+ (me->element_stack->tag->flags & Tgf_frecyc)) {
+ /*
+ * The element stack says we are within the contents of an element
+ * that the next stage (HTML.c) may want to feed us back again (via
+ * the *include string). So try to output text in UTF-8 if
+ * possible, using the same logic as for attribute values (which
+ * should be in line with what me->current_tag_charset
+ * indicates). - kw
+ */
+ if (me->T.decode_utf8 &&
+ *me->U.utf_buf) {
+ PUTS(me->U.utf_buf);
+ me->U.utf_buf_p = me->U.utf_buf;
+ *(me->U.utf_buf_p) = '\0';
+ } else if (!IS_CJK_TTY &&
+ (me->T.output_utf8 ||
+ me->T.trans_from_uni)) {
+ if (LYIsASCII(clong)) {
+ PUTC(c);
+ } else if (clong == UCS_REPL && saved_char_in &&
+ HTPassEightBitRaw &&
+ saved_char_in >=
+ LYlowest_eightbit[me->outUCLYhndl]) {
+ PUTUTF8((UCode_t) (0xf000 | saved_char_in));
+ } else {
+ PUTUTF8(clong);
+ }
+ } else if (saved_char_in && me->T.use_raw_char_in) {
+ PUTC(saved_char_in);
+ } else {
+ PUTC(c);
+ }
+
+#define PASS8859SPECL me->T.pass_160_173_raw
+ /*
+ * Convert 160 (nbsp) to Lynx special character if neither
+ * HTPassHighCtrlRaw nor HTCJK is set. - FM
+ */
+ } else if (clong == CH_NBSP && /* S/390 -- gil -- 0932 */
+ !me->no_lynx_specialcodes &&
+ !(PASS8859SPECL || IS_CJK_TTY)) {
+ PUTC(HT_NON_BREAK_SPACE);
+ /*
+ * Convert 173 (shy) to Lynx special character if neither
+ * HTPassHighCtrlRaw nor HTCJK is set. - FM
+ */
+ } else if (clong == CH_SHY && /* S/390 -- gil -- 0949 */
+ !me->no_lynx_specialcodes &&
+ !(PASS8859SPECL || IS_CJK_TTY)) {
+ PUTC(LY_SOFT_HYPHEN);
+ /*
+ * Handle the case in which we think we have a character which
+ * doesn't need further processing (e.g., a koi8-r input for a
+ * koi8-r output). - FM
+ */
+ } else if (me->T.use_raw_char_in && saved_char_in) {
+ /*
+ * Only if the original character is still in saved_char_in,
+ * otherwise we may be iterating from a goto top. - KW
+ */
+ PUTC(saved_char_in);
+ } else if ((chk = (BOOL) (me->T.trans_from_uni &&
+ TOASCII(clong) >= 160)) && /* S/390 -- gil -- 0968 */
+ (uck = UCTransUniChar(clong,
+ me->outUCLYhndl)) >= ' ' &&
+ uck < 256) {
+ CTRACE((tfp, "UCTransUniChar returned 0x%.2" PRI_UCode_t
+ ":'%c'.\n",
+ uck, FROMASCII((char)uck)));
+ /*
+ * We got one octet from the conversions, so use it. - FM
+ */
+ PUTC(FROMASCII((char) uck));
+ } else if ((chk &&
+ (uck == -4 ||
+ (me->T.repl_translated_C0 &&
+ uck > 0 && uck < 32))) &&
+ /*
+ * Not found; look for replacement string. - KW
+ */
+ (uck = UCTransUniCharStr(replace_buf, 60, clong,
+ me->outUCLYhndl,
+ 0) >= 0)) {
+ /*
+ * Got a replacement string. No further tests for validity -
+ * assume that whoever defined replacement strings knew what she
+ * was doing. - KW
+ */
+ PUTS(replace_buf);
+ /*
+ * If we're displaying UTF-8, try that now. - FM
+ */
+ } else if (me->T.output_utf8 && PUTUTF8(clong)) {
+ ; /* do nothing more */
+ /*
+ * If it's any other (> 160) 8-bit character, and we have not set
+ * HTPassEightBitRaw nor HTCJK, nor have the "ISO Latin 1"
+ * character set selected, back translate for our character set. -
+ * FM
+ */
+#define IncludesLatin1Enc \
+ (me->outUCLYhndl == LATIN1 || \
+ (me->outUCI && \
+ (me->outUCI->enc & (UCT_CP_SUPERSETOF_LAT1))))
+
+#define PASSHI8BIT (HTPassEightBitRaw || \
+ (me->T.do_8bitraw && !me->T.trans_from_uni))
+
+ } else if (clong > 160 && clong < 256 &&
+ !(PASSHI8BIT || IS_CJK_TTY) &&
+ !IncludesLatin1Enc) {
+#ifdef USE_PRETTYSRC
+ int psrc_view_backup = 0;
+#endif
+
+ string->size = 0;
+ EntityName = HTMLGetEntityName((UCode_t) (clong - 160));
+ HTChunkPuts(string, EntityName);
+ HTChunkTerminate(string);
+#ifdef USE_PRETTYSRC
+ /* we need to disable it temporarily */
+ if (psrc_view) {
+ psrc_view_backup = 1;
+ psrc_view = 0;
+ }
+#endif
+ handle_entity(me, '\0');
+#ifdef USE_PRETTYSRC
+ /* we need to disable it temporarily */
+ if (psrc_view_backup)
+ psrc_view = TRUE;
+#endif
+
+ string->size = 0;
+ if (!FoundEntity)
+ PUTC(';');
+ /*
+ * If we get to here and have an ASCII char, pass the character. -
+ * KW
+ */
+ } else if (TOASCII(clong) < 127 && clong > 0) { /* S/390 -- gil -- 0987 */
+ PUTC(c);
+ /*
+ * If we get to here, and should have translated, translation has
+ * failed so far. - KW
+ *
+ * We should have sent UTF-8 output to the parser already, but what
+ * the heck, try again. - FM
+ */
+ } else if (me->T.output_utf8 && *me->U.utf_buf) {
+ PUTS(me->U.utf_buf);
+ me->U.utf_buf_p = me->U.utf_buf;
+ *(me->U.utf_buf_p) = '\0';
+ /*
+ * If we don't actually want the character, make it safe and output
+ * that now. - FM
+ */
+ } else if (TOASCII(UCH(c)) < /* S/390 -- gil -- 0997 */
+ LYlowest_eightbit[me->outUCLYhndl] ||
+ (me->T.trans_from_uni && !HTPassEightBitRaw)) {
+ /*
+ * If we get to here, pass the character. - FM
+ */
+ } else {
+ PUTC(c);
+ }
+ break;
+
+ /*
+ * Found '<' in SGML_PCDATA content; treat this mode nearly like
+ * S_litteral, but recognize '<!' and '<?' to filter out comments and
+ * processing instructions. - kw
+ */
+ case S_pcdata:
+ if (!string->size && TOASCII(clong) < 127) { /* first after '<' */
+ if (c == '!') { /* <! */
+ /*
+ * Terminate and set up for possible comment, identifier,
+ * declaration, or marked section as under S_tag. - kw
+ */
+ me->state = S_exclamation;
+ me->lead_exclamation = TRUE;
+ me->doctype_bracket = FALSE;
+ me->first_bracket = FALSE;
+ HTChunkPutc(string, c);
+ break;
+ } else if (c == '?') { /* <? - ignore as a PI until '>' - kw */
+ CTRACE((tfp,
+ "SGML: Found PI in PCDATA, junking it until '>'\n"));
+#ifdef USE_PRETTYSRC
+ if (psrc_view) {
+ PSRCSTART(abracket);
+ PUTS("<?");
+ PSRCSTOP(abracket);
+ }
+#endif
+ me->state = S_pi;
+ break;
+ }
+ }
+ goto case_S_litteral;
+
+ /*
+ * Found '<' in SGML_SCRIPT content; treat this mode nearly like
+ * S_litteral, but recognize '<!' to allow the content to be treated as
+ * a comment by lynx.
+ */
+ case S_script:
+ if (!string->size && TOASCII(clong) < 127) { /* first after '<' */
+ if (c == '!') { /* <! */
+ /*
+ * Terminate and set up for possible comment, identifier,
+ * declaration, or marked section as under S_tag. - kw
+ */
+ me->state = S_exclamation;
+ me->lead_exclamation = TRUE;
+ me->doctype_bracket = FALSE;
+ me->first_bracket = FALSE;
+ HTChunkPutc(string, c);
+ break;
+ }
+ }
+ goto case_S_litteral;
+
+ /*
+ * In literal mode, waits only for specific end tag (for compatibility
+ * with old servers, and for Lynx). - FM
+ */
+ case_S_litteral:
+ case S_litteral:
+ /*PSRC:this case not understood completely by HV, not done */
+ HTChunkPutc(string, c);
+#ifdef USE_PRETTYSRC
+ if (psrc_view) {
+ /* there is nothing useful in the element_stack */
+ testtag = me->current_tag;
+ } else
+#endif
+ testtag = (me->element_stack
+ ? me->element_stack->tag
+ : NULL);
+
+ if (testtag == NULL || testtag->name == NULL) {
+ string->size--;
+ me->state = S_text;
+ goto top1;
+ }
+
+ /*
+ * Normally when we get the closing ">",
+ * testtag contains something like "TITLE"
+ * string contains something like "/title>"
+ * so we decrement by 2 to compare the final character of each.
+ */
+ testlast = string->size - 2 - me->trailing_spaces - me->leading_spaces;
+
+#ifdef USE_COLOR_STYLE
+#define TagSize(p) ((p)->name_len)
+#else
+#define TagSize(p) (strlen((p)->name))
+#endif
+
+ if (TOUPPER(c) != ((testlast < 0)
+ ? '/'
+ : ((testlast < (int) TagSize(testtag))
+ ? testtag->name[testlast]
+ : 0))) {
+ int i;
+
+ /*
+ * If complete match, end literal.
+ */
+ if ((c == '>') &&
+ testlast >= 0 && !testtag->name[testlast]) {
+#ifdef USE_PRETTYSRC
+ if (psrc_view) {
+ char *trailing = NULL;
+
+ if (me->trailing_spaces) {
+ StrAllocCopy(trailing,
+ string->data
+ + string->size
+ - 1
+ - me->trailing_spaces);
+ trailing[me->trailing_spaces] = '\0';
+ }
+
+ PSRCSTART(abracket);
+ PUTS("</");
+ PSRCSTOP(abracket);
+ PSRCSTART(tag);
+
+ strcpy(string->data, me->current_tag->name);
+ transform_tag(me, string);
+ PUTS(string->data);
+
+ if (trailing) {
+ PUTS(trailing);
+ FREE(trailing);
+ }
+
+ PSRCSTOP(tag);
+ PSRCSTART(abracket);
+ PUTC('>');
+ PSRCSTOP(abracket);
+
+ me->current_tag = NULL;
+ } else
+#endif
+ end_element(me, me->element_stack->tag);
+
+ string->size = 0;
+ me->current_attribute_number = INVALID;
+ me->state = S_text;
+ me->leading_spaces = 0;
+ me->trailing_spaces = 0;
+ break;
+ }
+
+ /*
+ * Allow whitespace between the "<" or ">" and the keyword, for
+ * error-recovery.
+ */
+ if (isspace(UCH(c))) {
+ if (testlast == -1) {
+ me->leading_spaces += 1;
+ CTRACE2(TRACE_SGML, (tfp, "leading spaces: %d\n", me->leading_spaces));
+ break;
+ } else if (testlast > 0) {
+ me->trailing_spaces += 1;
+ CTRACE2(TRACE_SGML, (tfp, "trailing spaces: %d\n", me->trailing_spaces));
+ break;
+ }
+ }
+
+ /*
+ * Mismatch - recover.
+ */
+ me->leading_spaces = 0;
+ me->trailing_spaces = 0;
+ if (((testtag->contents != SGML_LITTERAL &&
+ (testtag->flags & Tgf_strict)) ||
+ (me->state == S_pcdata &&
+ (testtag->flags & (Tgf_strict | Tgf_endO)))) &&
+ (testlast > -1 &&
+ (c == '>' || testlast > 0 || IsNmStart(c)))) {
+ me->state = S_end;
+ string->size--;
+ for (i = 0; i < string->size; i++) /* remove '/' */
+ string->data[i] = string->data[i + 1];
+ if ((string->size == 1) ? IsNmStart(c) : IsNmChar(c))
+ break;
+ string->size--;
+ goto top1;
+ }
+ if (me->state == S_pcdata &&
+ (testtag->flags & (Tgf_strict | Tgf_endO)) &&
+ (testlast < 0 && IsNmStart(c))) {
+ me->state = S_tag;
+ break;
+ }
+ /*
+ * If Mismatch: recover string literally.
+ */
+ PUTC('<');
+ for (i = 0; i < string->size - 1; i++) /* recover, except last c */
+ PUTC(string->data[i]);
+ string->size = 0;
+ me->state = S_text;
+ goto top1; /* to recover last c */
+ }
+ break;
+
+ /*
+ * Character reference (numeric entity) or named entity.
+ */
+ case S_ero:
+ if (c == '#') {
+ /*
+ * Setting up for possible numeric entity.
+ */
+ me->state = S_cro; /* &# is Char Ref Open */
+ break;
+ }
+ me->state = S_entity; /* Fall through! */
+
+ /*
+ * Handle possible named entity.
+ */
+ case S_entity:
+ if (TOASCII(clong) < 127 && (string->size ? /* S/390 -- gil -- 1029 */
+ isalnum(UCH(c)) : isalpha(UCH(c)))) {
+ /* Should probably use IsNmStart/IsNmChar above (is that right?),
+ but the world is not ready for that - there's &nbsp: (note
+ colon!) and stuff around. */
+ /*
+ * Accept valid ASCII character. - FM
+ */
+ HTChunkPutc(string, c);
+ } else if (string->size == 0) {
+ /*
+ * It was an ampersand that's just text, so output the ampersand
+ * and recycle this character. - FM
+ */
+#ifdef USE_PRETTYSRC
+ if (psrc_view)
+ PSRCSTART(badseq);
+#endif
+ PUTC('&');
+#ifdef USE_PRETTYSRC
+ if (psrc_view)
+ PSRCSTOP(badseq);
+#endif
+ me->state = S_text;
+ goto top1;
+ } else {
+ /*
+ * Terminate entity name and try to handle it. - FM
+ */
+ HTChunkTerminate(string);
+#ifdef USE_PRETTYSRC
+ entity_string = string->data;
+#endif
+ if (!strcmp(string->data, "zwnj") &&
+ (!me->element_stack ||
+ (me->element_stack->tag &&
+ me->element_stack->tag->contents == SGML_MIXED))) {
+ /*
+ * Handle zwnj (8204) as <WBR>. - FM
+ */
+ char temp[8];
+
+ CTRACE((tfp,
+ "SGML_character: Handling 'zwnj' entity as 'WBR' element.\n"));
+
+ if (c != ';') {
+ sprintf(temp, "<WBR>%c", c);
+ } else {
+ sprintf(temp, "<WBR>");
+ }
+ if (me->recover == NULL) {
+ StrAllocCopy(me->recover, temp);
+ me->recover_index = 0;
+ } else {
+ StrAllocCat(me->recover, temp);
+ }
+ string->size = 0;
+ me->state = S_text;
+ break;
+ } else {
+ handle_entity(me, '\0');
+ }
+ string->size = 0;
+ me->state = S_text;
+ /*
+ * Don't eat the terminator if we didn't find the entity name and
+ * therefore sent the raw string via handle_entity(), or if the
+ * terminator is not the "standard" semi-colon for HTML. - FM
+ */
+#ifdef USE_PRETTYSRC
+ if (psrc_view && FoundEntity && c == ';') {
+ PSRCSTART(entity);
+ PUTC(c);
+ PSRCSTOP(entity);
+ }
+#endif
+ if (!FoundEntity || c != ';')
+ goto top1;
+ }
+ break;
+
+ /*
+ * Check for a numeric entity.
+ */
+ case S_cro:
+ if (TOASCII(clong) < 127 && TOLOWER(UCH(c)) == 'x') { /* S/390 -- gil -- 1060 */
+ me->isHex = TRUE;
+ me->state = S_incro;
+ } else if (TOASCII(clong) < 127 && isdigit(UCH(c))) {
+ /*
+ * Accept only valid ASCII digits. - FM
+ */
+ HTChunkPutc(string, c); /* accumulate a character NUMBER */
+ me->isHex = FALSE;
+ me->state = S_incro;
+ } else if (string->size == 0) {
+ /*
+ * No 'x' or digit following the "&#" so recover them and recycle
+ * the character. - FM
+ */
+#ifdef USE_PRETTYSRC
+ if (psrc_view)
+ PSRCSTART(badseq);
+#endif
+ PUTC('&');
+ PUTC('#');
+#ifdef USE_PRETTYSRC
+ if (psrc_view)
+ PSRCSTOP(badseq);
+#endif
+ me->state = S_text;
+ goto top1;
+ }
+ break;
+
+ /*
+ * Handle a numeric entity.
+ */
+ case S_incro:
+ /* S/390 -- gil -- 1075 */
+ if ((TOASCII(clong) < 127) &&
+ (me->isHex
+ ? isxdigit(UCH(c))
+ : isdigit(UCH(c)))) {
+ /*
+ * Accept only valid hex or ASCII digits. - FM
+ */
+ HTChunkPutc(string, c); /* accumulate a character NUMBER */
+ } else if (string->size == 0) {
+ /*
+ * No hex digit following the "&#x" so recover them and recycle the
+ * character. - FM
+ */
+#ifdef USE_PRETTYSRC
+ if (psrc_view)
+ PSRCSTART(badseq);
+#endif
+ PUTS("&#x");
+#ifdef USE_PRETTYSRC
+ if (psrc_view)
+ PSRCSTOP(badseq);
+#endif
+ me->isHex = FALSE;
+ me->state = S_text;
+ goto top1;
+ } else {
+ /*
+ * Terminate the numeric entity and try to handle it. - FM
+ */
+ UCode_t code;
+ int i;
+
+ HTChunkTerminate(string);
+#ifdef USE_PRETTYSRC
+ entity_string = string->data;
+#endif
+ if (UCScanCode(&code, string->data, me->isHex)) {
+
+/* =============== work in ASCII below here =============== S/390 -- gil -- 1092 */
+ if (AssumeCP1252(me)) {
+ code = LYcp1252ToUnicode(code);
+ }
+ /*
+ * Check for special values. - FM
+ */
+ if ((code == 8204) &&
+ (!me->element_stack ||
+ (me->element_stack->tag &&
+ me->element_stack->tag->contents == SGML_MIXED))) {
+ /*
+ * Handle zwnj (8204) as <WBR>. - FM
+ */
+ char temp[8];
+
+ CTRACE((tfp,
+ "SGML_character: Handling '8204' (zwnj) reference as 'WBR' element.\n"));
+
+ /*
+ * Include the terminator if it is not the standard
+ * semi-colon. - FM
+ */
+ if (c != ';') {
+ sprintf(temp, "<WBR>%c", c);
+ } else {
+ sprintf(temp, "<WBR>");
+ }
+ /*
+ * Add the replacement string to the recover buffer for
+ * processing. - FM
+ */
+ if (me->recover == NULL) {
+ StrAllocCopy(me->recover, temp);
+ me->recover_index = 0;
+ } else {
+ StrAllocCat(me->recover, temp);
+ }
+ string->size = 0;
+ me->isHex = FALSE;
+ me->state = S_text;
+ break;
+ } else if (put_special_unicodes(me, code)) {
+ /*
+ * We handled the value as a special character, so recycle
+ * the terminator or break. - FM
+ */
+#ifdef USE_PRETTYSRC
+ if (psrc_view) {
+ PSRCSTART(entity);
+ PUTS((me->isHex ? "&#x" : "&#"));
+ PUTS(entity_string);
+ if (c == ';')
+ PUTC(';');
+ PSRCSTOP(entity);
+ }
+#endif
+ string->size = 0;
+ me->isHex = FALSE;
+ me->state = S_text;
+ if (c != ';')
+ goto top1;
+ break;
+ }
+ /*
+ * Seek a translation from the chartrans tables.
+ */
+ if ((uck = UCTransUniChar(code,
+ me->outUCLYhndl)) >= 32 &&
+ uck < 256 &&
+ (uck < 127 ||
+ uck >= LYlowest_eightbit[me->outUCLYhndl])) {
+#ifdef USE_PRETTYSRC
+ if (!psrc_view) {
+#endif
+ PUTC(FROMASCII((char) uck));
+#ifdef USE_PRETTYSRC
+ } else {
+ put_pretty_number(me);
+ }
+#endif
+ } else if ((uck == -4 ||
+ (me->T.repl_translated_C0 &&
+ uck > 0 && uck < 32)) &&
+ /*
+ * Not found; look for replacement string.
+ */
+ (uck = UCTransUniCharStr(replace_buf, 60, code,
+ me->outUCLYhndl,
+ 0) >= 0)) {
+#ifdef USE_PRETTYSRC
+ if (psrc_view) {
+ put_pretty_number(me);
+ } else
+#endif
+ PUTS(replace_buf);
+ /*
+ * If we're displaying UTF-8, try that now. - FM
+ */
+ } else if (me->T.output_utf8 && PUTUTF8(code)) {
+ ; /* do nothing more */
+ /*
+ * Ignore 8205 (zwj), 8206 (lrm), and 8207 (rln), if we get
+ * to here. - FM
+ */
+ } else if (code == 8205 ||
+ code == 8206 ||
+ code == 8207) {
+ if (TRACE) {
+ string->size--;
+ LYStrNCpy(replace_buf,
+ string->data,
+ (string->size < 64 ? string->size : 63));
+ fprintf(tfp,
+ "SGML_character: Ignoring '%s%s'.\n",
+ (me->isHex ? "&#x" : "&#"),
+ replace_buf);
+ }
+#ifdef USE_PRETTYSRC
+ if (psrc_view) {
+ PSRCSTART(badseq);
+ PUTS((me->isHex ? "&#x" : "&#"));
+ PUTS(entity_string);
+ if (c == ';')
+ PUTC(';');
+ PSRCSTOP(badseq);
+ }
+#endif
+ string->size = 0;
+ me->isHex = FALSE;
+ me->state = S_text;
+ if (c != ';')
+ goto top1;
+ break;
+ /*
+ * Show the numeric entity if we get to here and the value:
+ * (1) Is greater than 255 (but use ASCII characters for
+ * spaces or dashes).
+ * (2) Is less than 32, and not valid or we don't have
+ * HTCJK set.
+ * (3) Is 127 and we don't have HTPassHighCtrlRaw or HTCJK
+ * set.
+ * (4) Is 128 - 159 and we don't have HTPassHighCtrlNum
+ * set.
+ * - FM
+ */
+ } else if ((code > 255) ||
+ (code < ' ' && /* S/390 -- gil -- 1140 */
+ code != '\t' && code != '\n' && code != '\r' &&
+ !IS_CJK_TTY) ||
+ (TOASCII(code) == 127 &&
+ !(HTPassHighCtrlRaw || IS_CJK_TTY)) ||
+ (TOASCII(code) > 127 && code < 160 &&
+ !HTPassHighCtrlNum)) {
+ /*
+ * Unhandled or illegal value. Recover the "&#" or "&#x"
+ * and digit(s), and recycle the terminator. - FM
+ */
+#ifdef USE_PRETTYSRC
+ if (psrc_view) {
+ PSRCSTART(badseq);
+ }
+#endif
+ if (me->isHex) {
+ PUTS("&#x");
+ me->isHex = FALSE;
+ } else {
+ PUTS("&#");
+ }
+ string->size--;
+ for (i = 0; i < string->size; i++) /* recover */
+ PUTC(string->data[i]);
+#ifdef USE_PRETTYSRC
+ if (psrc_view) {
+ PSRCSTOP(badseq);
+ }
+#endif
+ string->size = 0;
+ me->isHex = FALSE;
+ me->state = S_text;
+ goto top1;
+ } else if (TOASCII(code) < 161 || /* S/390 -- gil -- 1162 */
+ HTPassEightBitNum ||
+ IncludesLatin1Enc) {
+ /*
+ * No conversion needed. - FM
+ */
+#ifdef USE_PRETTYSRC
+ if (psrc_view) {
+ put_pretty_number(me);
+ } else
+#endif
+ PUTC(FROMASCII((char) code));
+ } else {
+ /*
+ * Handle as named entity. - FM
+ */
+ code -= 160;
+ EntityName = HTMLGetEntityName(code);
+ if (EntityName && EntityName[0] != '\0') {
+ string->size = 0;
+ HTChunkPuts(string, EntityName);
+ HTChunkTerminate(string);
+ handle_entity(me, '\0');
+ /*
+ * Add a semi-colon if something went wrong and
+ * handle_entity() sent the string. - FM
+ */
+ if (!FoundEntity) {
+ PUTC(';');
+ }
+ } else {
+ /*
+ * Our conversion failed, so recover the "&#" and
+ * digit(s), and recycle the terminator. - FM
+ */
+#ifdef USE_PRETTYSRC
+ if (psrc_view)
+ PSRCSTART(badseq);
+#endif
+ if (me->isHex) {
+ PUTS("&#x");
+ me->isHex = FALSE;
+ } else {
+ PUTS("&#");
+ }
+ string->size--;
+ for (i = 0; i < string->size; i++) /* recover */
+ PUTC(string->data[i]);
+#ifdef USE_PRETTYSRC
+ if (psrc_view)
+ PSRCSTOP(badseq);
+#endif
+ string->size = 0;
+ me->isHex = FALSE;
+ me->state = S_text;
+ goto top1;
+ }
+ }
+ /*
+ * If we get to here, we succeeded. Hoorah!!! - FM
+ */
+ string->size = 0;
+ me->isHex = FALSE;
+ me->state = S_text;
+ /*
+ * Don't eat the terminator if it's not the "standard"
+ * semi-colon for HTML. - FM
+ */
+ if (c != ';') {
+ goto top1;
+ }
+ } else {
+ /*
+ * Not an entity, and don't know why not, so add the terminator
+ * to the string, output the "&#" or "&#x", and process the
+ * string via the recover element. - FM
+ */
+ string->size--;
+ HTChunkPutc(string, c);
+ HTChunkTerminate(string);
+#ifdef USE_PRETTYSRC
+ if (psrc_view)
+ PSRCSTART(badseq);
+#endif
+ if (me->isHex) {
+ PUTS("&#x");
+ me->isHex = FALSE;
+ } else {
+ PUTS("&#");
+ }
+#ifdef USE_PRETTYSRC
+ if (psrc_view)
+ PSRCSTOP(badseq);
+#endif
+ if (me->recover == NULL) {
+ StrAllocCopy(me->recover, string->data);
+ me->recover_index = 0;
+ } else {
+ StrAllocCat(me->recover, string->data);
+ }
+ string->size = 0;
+ me->isHex = FALSE;
+ me->state = S_text;
+ break;
+ }
+ }
+ break;
+
+ /*
+ * Tag
+ */
+ case S_tag: /* new tag */
+ if (TOASCII(clong) < 127 && (string->size ? /* S/390 -- gil -- 1179 */
+ IsNmChar(c) : IsNmStart(c))) {
+ /*
+ * Add valid ASCII character. - FM
+ */
+ HTChunkPutc(string, c);
+ } else if (c == '!' && !string->size) { /* <! */
+ /*
+ * Terminate and set up for possible comment, identifier,
+ * declaration, or marked section. - FM
+ */
+ me->state = S_exclamation;
+ me->lead_exclamation = TRUE;
+ me->doctype_bracket = FALSE;
+ me->first_bracket = FALSE;
+ HTChunkPutc(string, c);
+ break;
+ } else if (!string->size &&
+ (TOASCII(clong) <= 160 && /* S/390 -- gil -- 1196 */
+ (c != '/' && c != '?' && c != '_' && c != ':'))) {
+ /*
+ * '<' must be followed by an ASCII letter to be a valid start tag.
+ * Here it isn't, nor do we have a '/' for an end tag, nor one of
+ * some other characters with a special meaning for SGML or which
+ * are likely to be legal Name Start characters in XML or some
+ * other extension. So recover the '<' and following character as
+ * data. - FM & KW
+ */
+ me->state = S_text;
+#ifdef USE_PRETTYSRC
+ if (psrc_view)
+ PSRCSTART(badseq);
+#endif
+ PUTC('<');
+#ifdef USE_PRETTYSRC
+ if (psrc_view)
+ PSRCSTOP(badseq);
+#endif
+ goto top1;
+ } else { /* End of tag name */
+ /*
+ * Try to handle tag. - FM
+ */
+ HTTag *t;
+
+ if (c == '/') {
+ if (string->size == 0) {
+ me->state = S_end;
+ break;
+ }
+ CTRACE((tfp, "SGML: `<%.*s/' found!\n", string->size, string->data));
+ }
+ HTChunkTerminate(string);
+
+ t = SGMLFindTag(dtd, string->data);
+ if (t == me->unknown_tag &&
+ ((c == ':' &&
+ string->size == 4 && 0 == strcasecomp(string->data, "URL")) ||
+ (string->size > 4 && 0 == strncasecomp(string->data, "URL:", 4)))) {
+ /*
+ * Treat <URL: as text rather than a junk tag, so we display
+ * it and the URL (Lynxism 8-). - FM
+ */
+#ifdef USE_PRETTYSRC
+ if (psrc_view)
+ PSRCSTART(badseq);
+#endif
+ PUTC('<');
+ PUTS(string->data); /* recover */
+ PUTC(c);
+#ifdef USE_PRETTYSRC
+ if (psrc_view)
+ PSRCSTOP(badseq);
+#endif
+ CTRACE((tfp, "SGML: Treating <%s%c as text\n",
+ string->data, c));
+ string->size = 0;
+ me->state = S_text;
+ break;
+ }
+ if (c == '/' && t) {
+ /*
+ * Element name was ended by '/'. Remember the tag that ended
+ * thusly, we'll interpret this as either an indication of an
+ * empty element (if '>' follows directly) or do some
+ * SGMLshortref-ish treatment. - kw
+ */
+ me->slashedtag = t;
+ }
+ if (!t) {
+ if (c == '?' && string->size <= 1) {
+ CTRACE((tfp, "SGML: Found PI, looking for '>'\n"));
+#ifdef USE_PRETTYSRC
+ if (psrc_view) {
+ PSRCSTART(abracket);
+ PUTS("<?");
+ PSRCSTOP(abracket);
+ }
+#endif
+ string->size = 0;
+ me->state = S_pi;
+ HTChunkPutc(string, c);
+ break;
+ }
+ CTRACE((tfp, "SGML: *** Invalid element %s\n",
+ string->data));
+
+#ifdef USE_PRETTYSRC
+ if (psrc_view) {
+ PSRCSTART(abracket);
+ PUTC('<');
+ PSRCSTOP(abracket);
+ PSRCSTART(badtag);
+ transform_tag(me, string);
+ PUTS(string->data);
+ if (c == '>') {
+ PSRCSTOP(badtag);
+ PSRCSTART(abracket);
+ PUTC('>');
+ PSRCSTOP(abracket);
+ } else {
+ PUTC(c);
+ }
+ }
+#endif
+ me->state = (c == '>') ? S_text : S_junk_tag;
+ break;
+ } else if (t == me->unknown_tag) {
+ CTRACE((tfp, "SGML: *** Unknown element \"%s\"\n",
+ string->data));
+ /*
+ * Fall through and treat like valid tag for attribute parsing.
+ * - KW
+ */
+
+ }
+ me->current_tag = t;
+
+#ifdef USE_PRETTYSRC
+ if (psrc_view) {
+ PSRCSTART(abracket);
+ PUTC('<');
+ PSRCSTOP(abracket);
+ if (t != me->unknown_tag)
+ PSRCSTART(tag);
+ else
+ PSRCSTART(badtag);
+ transform_tag(me, string);
+ PUTS(string->data);
+ if (t != me->unknown_tag)
+ PSRCSTOP(tag);
+ else
+ PSRCSTOP(badtag);
+ }
+ if (!psrc_view) /*don't waste time */
+#endif
+ {
+ /*
+ * Clear out attributes.
+ */
+ memset((void *) me->present, 0, sizeof(BOOL) *
+ (unsigned) (me->current_tag->number_of_attributes));
+ }
+
+ string->size = 0;
+ me->current_attribute_number = INVALID;
+#ifdef USE_PRETTYSRC
+ if (psrc_view) {
+ if (c == '>' || c == '<' || (c == '/' && me->slashedtag)) {
+ if (c != '<') {
+ PSRCSTART(abracket);
+ PUTC(c);
+ PSRCSTOP(abracket);
+ me->state = (c == '>') ? S_text : S_tagname_slash;
+ } else {
+ me->state = S_tag;
+ }
+ } else {
+ if (!WHITE(c))
+ PUTC(c);
+ me->state = S_tag_gap;
+ }
+ } else
+#endif
+ if (c == '>' || c == '<' || (c == '/' && me->slashedtag)) {
+ if (me->current_tag->name)
+ start_element(me);
+ me->state = (c == '>') ? S_text :
+ (c == '<') ? S_tag : S_tagname_slash;
+ } else {
+ me->state = S_tag_gap;
+ }
+ }
+ break;
+
+ case S_exclamation:
+ if (me->lead_exclamation && c == '-') {
+ /*
+ * Set up for possible comment. - FM
+ */
+ me->lead_exclamation = FALSE;
+ me->first_dash = TRUE;
+ HTChunkPutc(string, c);
+ break;
+ }
+ if (me->lead_exclamation && c == '[') {
+ /*
+ * Set up for possible marked section. - FM
+ */
+ me->lead_exclamation = FALSE;
+ me->first_bracket = TRUE;
+ me->second_bracket = FALSE;
+ HTChunkPutc(string, c);
+ me->state = S_marked;
+ break;
+ }
+ if (me->first_dash && c == '-') {
+ /*
+ * Set up to handle comment. - FM
+ */
+ me->lead_exclamation = FALSE;
+ me->first_dash = FALSE;
+ me->end_comment = FALSE;
+ HTChunkPutc(string, c);
+ me->state = S_comment;
+ break;
+ }
+ me->lead_exclamation = FALSE;
+ me->first_dash = FALSE;
+ if (c == '>') {
+ /*
+ * Try to handle identifier. - FM
+ */
+ HTChunkTerminate(string);
+#ifdef USE_PRETTYSRC
+ if (psrc_view) {
+ PSRCSTART(sgmlspecial);
+ PUTC('<');
+ PUTS(string->data);
+ PUTC('>');
+ PSRCSTOP(sgmlspecial);
+ } else
+#endif
+ handle_identifier(me);
+ string->size = 0;
+ me->state = S_text;
+ break;
+ }
+ if (WHITE(c)) {
+ if (string->size == 8 &&
+ !strncasecomp(string->data, "!DOCTYPE", 8)) {
+ /*
+ * Set up for DOCTYPE declaration. - FM
+ */
+ HTChunkPutc(string, c);
+ me->doctype_bracket = FALSE;
+ me->state = S_doctype;
+ break;
+ }
+ if (string->size == 7 &&
+ !strncasecomp(string->data, "!ENTITY", 7)) {
+ /*
+ * Set up for ENTITY declaration. - FM
+ */
+ HTChunkPutc(string, c);
+ me->first_dash = FALSE;
+ me->end_comment = TRUE;
+ me->state = S_sgmlent;
+ break;
+ }
+ if (string->size == 8 &&
+ !strncasecomp(string->data, "!ELEMENT", 8)) {
+ /*
+ * Set up for ELEMENT declaration. - FM
+ */
+ HTChunkPutc(string, c);
+ me->first_dash = FALSE;
+ me->end_comment = TRUE;
+ me->state = S_sgmlele;
+ break;
+ }
+ if (string->size == 8 &&
+ !strncasecomp(string->data, "!ATTLIST", 8)) {
+ /*
+ * Set up for ATTLIST declaration. - FM
+ */
+ HTChunkPutc(string, c);
+ me->first_dash = FALSE;
+ me->end_comment = TRUE;
+ me->state = S_sgmlatt;
+ break;
+ }
+ }
+ HTChunkPutc(string, c);
+ break;
+
+ case S_comment: /* Expecting comment. - FM */
+ if (historical_comments) {
+ /*
+ * Any '>' terminates. - FM
+ */
+ if (c == '>') {
+ HTChunkTerminate(string);
+#ifdef USE_PRETTYSRC
+ if (psrc_view) {
+ PSRCSTART(comm);
+ PUTC('<');
+ PUTS_TR(string->data);
+ PUTC('>');
+ PSRCSTOP(comm);
+ } else
+#endif
+ handle_comment(me);
+ string->size = 0;
+ me->end_comment = FALSE;
+ me->first_dash = FALSE;
+ me->state = S_text;
+ break;
+ }
+ goto S_comment_put_c;
+ }
+ if (!me->first_dash && c == '-') {
+ HTChunkPutc(string, c);
+ me->first_dash = TRUE;
+ break;
+ }
+ if (me->first_dash && c == '-') {
+ HTChunkPutc(string, c);
+ me->first_dash = FALSE;
+ if (!me->end_comment)
+ me->end_comment = TRUE;
+ else if (!minimal_comments)
+ /*
+ * Validly treat '--' pairs as successive comments (for
+ * minimal, any "--WHITE>" terminates). - FM
+ */
+ me->end_comment = FALSE;
+ break;
+ }
+ if (me->end_comment && c == '>') {
+ /*
+ * Terminate and handle the comment. - FM
+ */
+ HTChunkTerminate(string);
+#ifdef USE_PRETTYSRC
+ if (psrc_view) {
+ PSRCSTART(comm);
+ PUTC('<');
+ PUTS_TR(string->data);
+ PUTC('>');
+ PSRCSTOP(comm);
+ } else
+#endif
+ handle_comment(me);
+ string->size = 0;
+ me->end_comment = FALSE;
+ me->first_dash = FALSE;
+ me->state = S_text;
+ break;
+ }
+ me->first_dash = FALSE;
+ if (me->end_comment && !isspace(UCH(c)))
+ me->end_comment = FALSE;
+
+ S_comment_put_c:
+ if (me->T.decode_utf8 &&
+ *me->U.utf_buf) {
+ HTChunkPuts(string, me->U.utf_buf);
+ me->U.utf_buf_p = me->U.utf_buf;
+ *(me->U.utf_buf_p) = '\0';
+ } else if (!IS_CJK_TTY &&
+ (me->T.output_utf8 ||
+ me->T.trans_from_uni)) {
+ if (clong == UCS_REPL && saved_char_in &&
+ HTPassEightBitRaw &&
+ saved_char_in >=
+ LYlowest_eightbit[me->outUCLYhndl]) {
+ (HTChunkPutUtf8Char) (string,
+ (UCode_t) (0xf000 | saved_char_in));
+ } else {
+ HTChunkPutUtf8Char(string, clong);
+ }
+ } else if (saved_char_in && me->T.use_raw_char_in) {
+ HTChunkPutc(string, saved_char_in);
+ } else {
+ HTChunkPutc(string, c);
+ }
+ break;
+
+ case S_doctype: /* Expecting DOCTYPE. - FM */
+ if (me->doctype_bracket) {
+ HTChunkPutc(string, c);
+ if (c == ']')
+ me->doctype_bracket = FALSE;
+ break;
+ }
+ if (c == '[' && WHITE(string->data[string->size - 1])) {
+ HTChunkPutc(string, c);
+ me->doctype_bracket = TRUE;
+ break;
+ }
+ if (c == '>') {
+ HTChunkTerminate(string);
+#ifdef USE_PRETTYSRC
+ if (psrc_view) {
+ PSRCSTART(sgmlspecial);
+ PUTC('<');
+ PUTS(string->data);
+ PUTC('>');
+ PSRCSTOP(sgmlspecial);
+ } else
+#endif
+ handle_doctype(me);
+ string->size = 0;
+ me->state = S_text;
+ break;
+ }
+ HTChunkPutc(string, c);
+ break;
+
+ case S_marked: /* Expecting marked section. - FM */
+ if (me->first_bracket && c == '[') {
+ HTChunkPutc(string, c);
+ me->first_bracket = FALSE;
+ me->second_bracket = TRUE;
+ break;
+ }
+ if (me->second_bracket && c == ']' &&
+ string->data[string->size - 1] == ']') {
+ HTChunkPutc(string, c);
+ me->second_bracket = FALSE;
+ break;
+ }
+ if (!me->second_bracket && c == '>') {
+ HTChunkTerminate(string);
+#ifdef USE_PRETTYSRC
+ if (psrc_view) {
+ PSRCSTART(sgmlspecial);
+ PUTC('<');
+ PUTS(string->data);
+ PUTC('>');
+ PSRCSTOP(sgmlspecial);
+ } else
+#endif
+ handle_marked(me);
+ string->size = 0;
+ me->state = S_text;
+ break;
+ }
+ HTChunkPutc(string, c);
+ break;
+
+ case S_sgmlent: /* Expecting ENTITY. - FM */
+ if (!me->first_dash && c == '-') {
+ HTChunkPutc(string, c);
+ me->first_dash = TRUE;
+ break;
+ }
+ if (me->first_dash && c == '-') {
+ HTChunkPutc(string, c);
+ me->first_dash = FALSE;
+ if (!me->end_comment)
+ me->end_comment = TRUE;
+ else
+ me->end_comment = FALSE;
+ break;
+ }
+ if (me->end_comment && c == '>') {
+ HTChunkTerminate(string);
+#ifdef USE_PRETTYSRC
+ if (psrc_view) {
+ PSRCSTART(sgmlspecial);
+ PUTC('<');
+ PUTS(string->data);
+ PUTC('>');
+ PSRCSTOP(sgmlspecial);
+ } else
+#endif
+ handle_sgmlent(me);
+ string->size = 0;
+ me->end_comment = FALSE;
+ me->first_dash = FALSE;
+ me->state = S_text;
+ break;
+ }
+ me->first_dash = FALSE;
+ HTChunkPutc(string, c);
+ break;
+
+ case S_sgmlele: /* Expecting ELEMENT. - FM */
+ if (!me->first_dash && c == '-') {
+ HTChunkPutc(string, c);
+ me->first_dash = TRUE;
+ break;
+ }
+ if (me->first_dash && c == '-') {
+ HTChunkPutc(string, c);
+ me->first_dash = FALSE;
+ if (!me->end_comment)
+ me->end_comment = TRUE;
+ else
+ me->end_comment = FALSE;
+ break;
+ }
+ if (me->end_comment && c == '>') {
+ HTChunkTerminate(string);
+#ifdef USE_PRETTYSRC
+ if (psrc_view) {
+ PSRCSTART(sgmlspecial);
+ PUTC('<');
+ PUTS(string->data);
+ PUTC('>');
+ PSRCSTOP(sgmlspecial);
+ } else
+#endif
+ handle_sgmlele(me);
+ string->size = 0;
+ me->end_comment = FALSE;
+ me->first_dash = FALSE;
+ me->state = S_text;
+ break;
+ }
+ me->first_dash = FALSE;
+ HTChunkPutc(string, c);
+ break;
+
+ case S_sgmlatt: /* Expecting ATTLIST. - FM */
+ if (!me->first_dash && c == '-') {
+ HTChunkPutc(string, c);
+ me->first_dash = TRUE;
+ break;
+ }
+ if (me->first_dash && c == '-') {
+ HTChunkPutc(string, c);
+ me->first_dash = FALSE;
+ if (!me->end_comment)
+ me->end_comment = TRUE;
+ else
+ me->end_comment = FALSE;
+ break;
+ }
+ if (me->end_comment && c == '>') {
+ HTChunkTerminate(string);
+#ifdef USE_PRETTYSRC
+ if (psrc_view) {
+ PSRCSTART(sgmlspecial);
+ PUTC('<');
+ PUTS(string->data);
+ PUTC('>');
+ PSRCSTOP(sgmlspecial);
+ } else
+#endif
+ handle_sgmlatt(me);
+ string->size = 0;
+ me->end_comment = FALSE;
+ me->first_dash = FALSE;
+ me->state = S_text;
+ break;
+ }
+ me->first_dash = FALSE;
+ HTChunkPutc(string, c);
+ break;
+
+ case S_tag_gap: /* Expecting attribute or '>' */
+ if (WHITE(c)) {
+ /* PUTC(c); - no, done as special case */
+ break; /* Gap between attributes */
+ }
+ if (c == '>') { /* End of tag */
+#ifdef USE_PRETTYSRC
+ if (!psrc_view)
+#endif
+ if (me->current_tag->name)
+ start_element(me);
+#ifdef USE_PRETTYSRC
+ if (psrc_view) {
+ PSRCSTART(abracket);
+ PUTC('>');
+ PSRCSTOP(abracket);
+ }
+#endif
+ me->state = S_text;
+ break;
+ }
+ HTChunkPutc(string, c);
+ me->state = S_attr; /* Get attribute */
+ break;
+
+ /* accumulating value */
+ case S_attr:
+ if (WHITE(c) || (c == '>') || (c == '=')) { /* End of word */
+ if ((c == '>')
+ && (string->size >= 1)
+ && (string->data[string->size - 1] == '/')) {
+ if ((LYxhtml_parsing || me->extended_html)
+ && ignore_when_empty(me->current_tag)) {
+ discard_empty(me);
+ }
+ } else {
+ HTChunkTerminate(string);
+ handle_attribute_name(me, string->data);
+ }
+#ifdef USE_PRETTYSRC
+ if (!psrc_view) {
+#endif
+ string->size = 0;
+ if (c == '>') { /* End of tag */
+ if (me->current_tag->name)
+ start_element(me);
+ me->state = S_text;
+ break;
+ }
+#ifdef USE_PRETTYSRC
+ } else {
+ PUTC(' ');
+ if (me->current_attribute_number == INVALID)
+ PSRCSTART(badattr);
+ else
+ PSRCSTART(attrib);
+ if (attrname_transform != 1) {
+ if (attrname_transform == 0)
+ LYLowerCase(string->data);
+ else
+ LYUpperCase(string->data);
+ }
+ PUTS(string->data);
+ if (c == '=' || WHITE(c))
+ PUTC(c);
+ if (c == '=' || c == '>') {
+ if (me->current_attribute_number == INVALID) {
+ PSRCSTOP(badattr);
+ } else {
+ PSRCSTOP(attrib);
+ }
+ }
+ if (c == '>') {
+ PSRCSTART(abracket);
+ PUTC('>');
+ PSRCSTOP(abracket);
+ me->state = S_text;
+ break;
+ }
+ string->size = 0;
+ }
+#endif
+ me->state = (c == '=' ? S_equals : S_attr_gap);
+ } else {
+ HTChunkPutc(string, c);
+ }
+ break;
+
+ case S_attr_gap: /* Expecting attribute or '=' or '>' */
+ if (WHITE(c)) {
+ PRETTYSRC_PUTC(c);
+ break; /* Gap after attribute */
+ }
+ if (c == '>') { /* End of tag */
+#ifdef USE_PRETTYSRC
+ if (psrc_view) {
+ if (me->current_attribute_number == INVALID) {
+ PSRCSTOP(badattr);
+ } else {
+ PSRCSTOP(attrib);
+ }
+ PSRCSTART(abracket);
+ PUTC('>');
+ PSRCSTOP(abracket);
+ } else
+#endif
+ if (me->current_tag->name)
+ start_element(me);
+ me->state = S_text;
+ break;
+ } else if (c == '=') {
+#ifdef USE_PRETTYSRC
+ if (psrc_view) {
+ PUTC('=');
+ if (me->current_attribute_number == INVALID) {
+ PSRCSTOP(badattr);
+ } else {
+ PSRCSTOP(attrib);
+ }
+ }
+#endif
+ me->state = S_equals;
+ break;
+ }
+ HTChunkPutc(string, c);
+ me->state = S_attr; /* Get next attribute */
+ break;
+
+ case S_equals: /* After attr = */
+ if (WHITE(c)) {
+ PRETTYSRC_PUTC(c);
+ break; /* Before attribute value */
+ }
+ if (c == '>') { /* End of tag */
+ CTRACE((tfp, "SGML: found = but no value\n"));
+#ifdef USE_PRETTYSRC
+ if (psrc_view) {
+ PSRCSTART(abracket);
+ PUTC('>');
+ PSRCSTOP(abracket);
+ } else
+#endif
+ if (me->current_tag->name)
+ start_element(me);
+ me->state = S_text;
+ break;
+
+ } else if (c == '\'') {
+#ifdef USE_PRETTYSRC
+ if (psrc_view) {
+ PSRCSTART(attrval);
+ PUTC(c);
+ }
+#endif
+ me->state = S_squoted;
+ break;
+
+ } else if (c == '"') {
+#ifdef USE_PRETTYSRC
+ if (psrc_view) {
+ PSRCSTART(attrval);
+ PUTC(c);
+ }
+#endif
+ me->state = S_dquoted;
+ break;
+ }
+#ifdef USE_PRETTYSRC
+ if (psrc_view)
+ PSRCSTART(attrval);
+#endif
+ me->state = S_value;
+ /* FALLTHRU */
+
+ case S_value:
+ if (WHITE(c) || (c == '>')) { /* End of word */
+ HTChunkTerminate(string);
+#ifdef USE_PRETTYSRC
+ if (!end_if_prettysrc(me, string, 0))
+#endif
+ {
+#ifdef CJK_EX /* Quick hack. - JH7AYN */
+ if (IS_CJK_TTY) {
+ if (string->data[0] == '$') {
+ if (string->data[1] == 'B' || string->data[1] == '@') {
+ char *jis_buf = 0;
+
+ HTSprintf0(&jis_buf, "\033%s", string->data);
+ TO_EUC((const unsigned char *) jis_buf,
+ (unsigned char *) string->data);
+ FREE(jis_buf);
+ }
+ }
+ }
+#endif
+ handle_attribute_value(me, string->data);
+ }
+ string->size = 0;
+ if (c == '>') { /* End of tag */
+#ifdef USE_PRETTYSRC
+ if (psrc_view) {
+ PSRCSTART(abracket);
+ PUTC('>');
+ PSRCSTOP(abracket);
+ } else
+#endif
+ if (me->current_tag->name)
+ start_element(me);
+ me->state = S_text;
+ break;
+ } else
+ me->state = S_tag_gap;
+ } else if (me->T.decode_utf8 &&
+ *me->U.utf_buf) {
+ HTChunkPuts(string, me->U.utf_buf);
+ me->U.utf_buf_p = me->U.utf_buf;
+ *(me->U.utf_buf_p) = '\0';
+ } else if (!IS_CJK_TTY &&
+ (me->T.output_utf8 ||
+ me->T.trans_from_uni)) {
+ if (clong == UCS_REPL && saved_char_in &&
+ HTPassEightBitRaw &&
+ saved_char_in >=
+ LYlowest_eightbit[me->outUCLYhndl]) {
+ (HTChunkPutUtf8Char) (string,
+ (UCode_t) (0xf000 | saved_char_in));
+ } else {
+ HTChunkPutUtf8Char(string, clong);
+ }
+ } else if (saved_char_in && me->T.use_raw_char_in) {
+ HTChunkPutc(string, saved_char_in);
+ } else {
+ HTChunkPutc(string, c);
+ }
+ break;
+
+ case S_squoted: /* Quoted attribute value */
+ if (c == '\'') { /* End of attribute value */
+ HTChunkTerminate(string);
+#ifdef USE_PRETTYSRC
+ if (!end_if_prettysrc(me, string, '\''))
+#endif
+ handle_attribute_value(me, string->data);
+ string->size = 0;
+ me->state = S_tag_gap;
+ } else if (TOASCII(c) == '\033') { /* S/390 -- gil -- 1213 */
+ /*
+ * Setting up for possible single quotes in CJK escape sequences.
+ * - Takuya ASADA (asada@three-a.co.jp)
+ */
+ me->state = S_esc_sq;
+ if (!UTF8_TTY_ISO2022JP)
+ HTChunkPutc(string, c);
+ } else if (me->T.decode_utf8 &&
+ *me->U.utf_buf) {
+ HTChunkPuts(string, me->U.utf_buf);
+ me->U.utf_buf_p = me->U.utf_buf;
+ *(me->U.utf_buf_p) = '\0';
+ } else if (!IS_CJK_TTY &&
+ (me->T.output_utf8 ||
+ me->T.trans_from_uni)) {
+ if (clong == UCS_REPL && saved_char_in &&
+ HTPassEightBitRaw &&
+ saved_char_in >=
+ LYlowest_eightbit[me->outUCLYhndl]) {
+ (HTChunkPutUtf8Char) (string,
+ (UCode_t) (0xf000 | saved_char_in));
+ } else {
+ HTChunkPutUtf8Char(string, clong);
+ }
+ } else if (saved_char_in && me->T.use_raw_char_in) {
+ HTChunkPutc(string, saved_char_in);
+ } else {
+ HTChunkPutc(string, c);
+ }
+ break;
+
+ case S_dquoted: /* Quoted attribute value */
+ if (c == '"' || /* Valid end of attribute value */
+ (soft_dquotes && /* If emulating old Netscape bug, treat '>' */
+ c == '>')) { /* as a co-terminator of dquoted and tag */
+ HTChunkTerminate(string);
+#ifdef USE_PRETTYSRC
+ if (!end_if_prettysrc(me, string, (char) c))
+#endif
+ handle_attribute_value(me, string->data);
+ string->size = 0;
+ me->state = S_tag_gap;
+ if (c == '>') /* We emulated the Netscape bug, so we go */
+ goto top1; /* back and treat it as the tag terminator */
+ } else if (TOASCII(c) == '\033') { /* S/390 -- gil -- 1230 */
+ /*
+ * Setting up for possible double quotes in CJK escape sequences.
+ * - Takuya ASADA (asada@three-a.co.jp)
+ */
+ me->state = S_esc_dq;
+ if (!UTF8_TTY_ISO2022JP)
+ HTChunkPutc(string, c);
+ } else if (me->T.decode_utf8 &&
+ *me->U.utf_buf) {
+ HTChunkPuts(string, me->U.utf_buf);
+ me->U.utf_buf_p = me->U.utf_buf;
+ *(me->U.utf_buf_p) = '\0';
+ } else if (!IS_CJK_TTY &&
+ (me->T.output_utf8 ||
+ me->T.trans_from_uni)) {
+ if (clong == UCS_REPL && saved_char_in &&
+ HTPassEightBitRaw &&
+ saved_char_in >=
+ LYlowest_eightbit[me->outUCLYhndl]) {
+ (HTChunkPutUtf8Char) (string,
+ (UCode_t) (0xf000 | saved_char_in));
+ } else {
+ HTChunkPutUtf8Char(string, clong);
+ }
+ } else if (saved_char_in && me->T.use_raw_char_in) {
+ HTChunkPutc(string, saved_char_in);
+ } else {
+ HTChunkPutc(string, c);
+ }
+ break;
+
+ case S_end: /* </ */
+ if (TOASCII(clong) < 127 && (string->size ? /* S/390 -- gil -- 1247 */
+ IsNmChar(c) : IsNmStart(c))) {
+ HTChunkPutc(string, c);
+ } else { /* End of end tag name */
+ HTTag *t = 0;
+
+#ifdef USE_PRETTYSRC
+ BOOL psrc_tagname_processed = FALSE;
+#endif
+
+ HTChunkTerminate(string);
+ if (!*string->data) { /* Empty end tag */
+ if (me->element_stack)
+ t = me->element_stack->tag;
+ } else {
+ t = SGMLFindTag(dtd, string->data);
+ }
+ if (!t || t == me->unknown_tag) {
+ CTRACE((tfp, "Unknown end tag </%s>\n", string->data));
+#ifdef USE_PRETTYSRC
+ if (psrc_view) {
+ PSRCSTART(abracket);
+ PUTS("</");
+ PSRCSTOP(abracket);
+ PSRCSTART(badtag);
+ transform_tag(me, string);
+ PUTS(string->data);
+ if (c != '>') {
+ PUTC(c);
+ } else {
+ PSRCSTOP(badtag);
+ PSRCSTART(abracket);
+ PUTC('>');
+ PSRCSTOP(abracket);
+ }
+ psrc_tagname_processed = TRUE;
+ }
+ } else if (psrc_view) {
+#endif
+ } else {
+ BOOL tag_OK = (BOOL) (c == '>' || WHITE(c));
+ HTMLElement e = TAGNUM_OF_TAGP(t);
+ int branch = 2; /* it can be 0,1,2 */
+
+ me->current_tag = t;
+ if (HAS_ALT_TAGNUM(TAGNUM_OF_TAGP(t)) &&
+ me->element_stack &&
+ ALT_TAGP(t) == me->element_stack->tag)
+ me->element_stack->tag = NORMAL_TAGP(me->element_stack->tag);
+
+ if (tag_OK && Old_DTD) {
+ switch (e) {
+ case HTML_DD:
+ case HTML_DT:
+ case HTML_LI:
+ case HTML_LH:
+ case HTML_TD:
+ case HTML_TH:
+ case HTML_TR:
+ case HTML_THEAD:
+ case HTML_TFOOT:
+ case HTML_TBODY:
+ case HTML_COLGROUP:
+ branch = 0;
+ break;
+
+ case HTML_A:
+ case HTML_B:
+ case HTML_BLINK:
+ case HTML_CITE:
+ case HTML_EM:
+ case HTML_FONT:
+ case HTML_FORM:
+ case HTML_I:
+ case HTML_P:
+ case HTML_STRONG:
+ case HTML_TT:
+ case HTML_U:
+ branch = 1;
+ break;
+ default:
+ break;
+ }
+ }
+
+ /*
+ * Just handle ALL end tags normally :-) - kw
+ */
+ if (!Old_DTD) {
+ end_element(me, me->current_tag);
+ } else if (tag_OK && (branch == 0)) {
+ /*
+ * Don't treat these end tags as invalid, nor act on them.
+ * - FM
+ */
+ CTRACE((tfp, "SGML: `</%s%c' found! Ignoring it.\n",
+ string->data, c));
+ string->size = 0;
+ me->current_attribute_number = INVALID;
+ if (c != '>') {
+ me->state = S_junk_tag;
+ } else {
+ me->current_tag = NULL;
+ me->state = S_text;
+ }
+ break;
+ } else if (tag_OK && (branch == 1)) {
+ /*
+ * Handle end tags for container elements declared as
+ * SGML_EMPTY to prevent "expected tag substitution" but
+ * still processed via HTML_end_element() in HTML.c with
+ * checks there to avoid throwing the HTML.c stack out of
+ * whack (Ugh, what a hack! 8-). - FM
+ */
+ if (me->inSELECT) {
+ /*
+ * We are in a SELECT block. - FM
+ */
+ if (strcasecomp(string->data, "FORM")) {
+ /*
+ * It is not at FORM end tag, so ignore it. - FM
+ */
+ CTRACE((tfp,
+ "SGML: ***Ignoring end tag </%s> in SELECT block.\n",
+ string->data));
+ } else {
+ /*
+ * End the SELECT block and then handle the FORM
+ * end tag. - FM
+ */
+ CTRACE((tfp,
+ "SGML: ***Faking SELECT end tag before </%s> end tag.\n",
+ string->data));
+ end_element(me,
+ SGMLFindTag(me->dtd, "SELECT"));
+ CTRACE((tfp, "SGML: End </%s>\n", string->data));
+
+#ifdef USE_PRETTYSRC
+ if (!psrc_view) /* Don't actually call if viewing psrc - kw */
+#endif
+ (*me->actions->end_element)
+ (me->target,
+ (int) TAGNUM_OF_TAGP(me->current_tag),
+ &me->include);
+ }
+ } else if (!strcasecomp(string->data, "P")) {
+ /*
+ * Treat a P end tag like a P start tag (Ugh, what a
+ * hack! 8-). - FM
+ */
+ CTRACE((tfp,
+ "SGML: `</%s%c' found! Treating as '<%s%c'.\n",
+ string->data, c, string->data, c));
+ {
+ int i;
+
+ for (i = 0;
+ i < me->current_tag->number_of_attributes;
+ i++) {
+ me->present[i] = NO;
+ }
+ }
+ if (me->current_tag->name)
+ start_element(me);
+ } else {
+ CTRACE((tfp, "SGML: End </%s>\n", string->data));
+
+#ifdef USE_PRETTYSRC
+ if (!psrc_view) /* Don't actually call if viewing psrc - kw */
+#endif
+ (*me->actions->end_element)
+ (me->target,
+ (int) TAGNUM_OF_TAGP(me->current_tag),
+ &me->include);
+ }
+ string->size = 0;
+ me->current_attribute_number = INVALID;
+ if (c != '>') {
+ me->state = S_junk_tag;
+ } else {
+ me->current_tag = NULL;
+ me->state = S_text;
+ }
+ break;
+ } else {
+ /*
+ * Handle all other end tags normally. - FM
+ */
+ end_element(me, me->current_tag);
+ }
+ }
+
+#ifdef USE_PRETTYSRC
+ if (psrc_view && !psrc_tagname_processed) {
+ PSRCSTART(abracket);
+ PUTS("</");
+ PSRCSTOP(abracket);
+ PSRCSTART(tag);
+ if (tagname_transform != 1) {
+ if (tagname_transform == 0)
+ LYLowerCase(string->data);
+ else
+ LYUpperCase(string->data);
+ }
+ PUTS(string->data);
+ PSRCSTOP(tag);
+ if (c != '>') {
+ PSRCSTART(badtag);
+ PUTC(c);
+ } else {
+ PSRCSTART(abracket);
+ PUTC('>');
+ PSRCSTOP(abracket);
+ }
+ }
+#endif
+
+ string->size = 0;
+ me->current_attribute_number = INVALID;
+ if (c != '>') {
+ if (!WHITE(c))
+ CTRACE((tfp, "SGML: `</%s%c' found!\n", string->data, c));
+ me->state = S_junk_tag;
+ } else {
+ me->current_tag = NULL;
+ me->state = S_text;
+ }
+ }
+ break;
+
+ case S_esc: /* Expecting '$'or '(' following CJK ESC. */
+ if (c == '$') {
+ me->state = S_dollar;
+ } else if (c == '(') {
+ me->state = S_paren;
+ } else {
+ me->state = S_text;
+ if (UTF8_TTY_ISO2022JP)
+ goto top1;
+ }
+ if (!UTF8_TTY_ISO2022JP)
+ PUTC(c);
+ break;
+
+ case S_dollar: /* Expecting '@', 'B', 'A' or '(' after CJK "ESC$". */
+ if (c == '@' || c == 'B' || c == 'A') {
+ me->state = S_nonascii_text;
+ } else if (c == '(') {
+ me->state = S_dollar_paren;
+ }
+ if (!UTF8_TTY_ISO2022JP)
+ PUTC(c);
+ break;
+
+ case S_dollar_paren: /* Expecting 'C' after CJK "ESC$(". */
+ if (c == 'C') {
+ me->state = S_nonascii_text;
+ } else {
+ me->state = S_text;
+ if (UTF8_TTY_ISO2022JP) {
+ PUTS("$(");
+ goto top1;
+ }
+ }
+ if (!UTF8_TTY_ISO2022JP)
+ PUTC(c);
+ break;
+
+ case S_paren: /* Expecting 'B', 'J', 'T' or 'I' after CJK "ESC(". */
+ if (c == 'B' || c == 'J' || c == 'T') {
+ me->state = S_text;
+ } else if (c == 'I') {
+ me->state = S_nonascii_text;
+ if (UTF8_TTY_ISO2022JP)
+ me->kanji_buf = '\t'; /* flag for single byte katakana */
+ } else {
+ me->state = S_text;
+ if (UTF8_TTY_ISO2022JP) {
+ PUTC('(');
+ goto top1;
+ }
+ }
+ if (!UTF8_TTY_ISO2022JP)
+ PUTC(c);
+ break;
+
+ case S_nonascii_text: /* Expecting CJK ESC after non-ASCII text. */
+ if (TOASCII(c) == '\033') { /* S/390 -- gil -- 1264 */
+ me->state = S_esc;
+ } else if (c < 32) {
+ me->state = S_text;
+ }
+ if (UTF8_TTY_ISO2022JP) {
+ if (TOASCII(c) != '\033')
+ PUTUTF8(clong);
+ } else
+ PUTC(c);
+ break;
+
+ case S_esc_sq: /* Expecting '$'or '(' following CJK ESC. */
+ if (c == '$') {
+ me->state = S_dollar_sq;
+ } else if (c == '(') {
+ me->state = S_paren_sq;
+ } else {
+ me->state = S_squoted;
+ if (UTF8_TTY_ISO2022JP)
+ goto top1;
+ }
+ if (!UTF8_TTY_ISO2022JP)
+ HTChunkPutc(string, c);
+ break;
+
+ case S_dollar_sq: /* Expecting '@', 'B', 'A' or '(' after CJK "ESC$". */
+ if (c == '@' || c == 'B' || c == 'A') {
+ me->state = S_nonascii_text_sq;
+ } else if (c == '(') {
+ me->state = S_dollar_paren_sq;
+ }
+ if (!UTF8_TTY_ISO2022JP)
+ HTChunkPutc(string, c);
+ break;
+
+ case S_dollar_paren_sq: /* Expecting 'C' after CJK "ESC$(". */
+ if (c == 'C') {
+ me->state = S_nonascii_text_sq;
+ } else {
+ me->state = S_squoted;
+ if (UTF8_TTY_ISO2022JP) {
+ HTChunkPuts(string, "$(");
+ goto top1;
+ }
+ }
+ if (!UTF8_TTY_ISO2022JP)
+ HTChunkPutc(string, c);
+ break;
+
+ case S_paren_sq: /* Expecting 'B', 'J', 'T' or 'I' after CJK "ESC(". */
+ if (c == 'B' || c == 'J' || c == 'T') {
+ me->state = S_squoted;
+ } else if (c == 'I') {
+ me->state = S_nonascii_text_sq;
+ if (UTF8_TTY_ISO2022JP)
+ me->kanji_buf = '\t'; /* flag for single byte katakana */
+ } else {
+ me->state = S_squoted;
+ if (UTF8_TTY_ISO2022JP) {
+ HTChunkPutc(string, '(');
+ goto top1;
+ }
+ }
+ if (!UTF8_TTY_ISO2022JP)
+ HTChunkPutc(string, c);
+ break;
+
+ case S_nonascii_text_sq: /* Expecting CJK ESC after non-ASCII text. */
+ if (TOASCII(c) == '\033') { /* S/390 -- gil -- 1281 */
+ me->state = S_esc_sq;
+ }
+ if (UTF8_TTY_ISO2022JP) {
+ if (TOASCII(c) != '\033')
+ HTChunkPutUtf8Char(string, clong);
+ } else
+ HTChunkPutc(string, c);
+ break;
+
+ case S_esc_dq: /* Expecting '$'or '(' following CJK ESC. */
+ if (c == '$') {
+ me->state = S_dollar_dq;
+ } else if (c == '(') {
+ me->state = S_paren_dq;
+ } else {
+ me->state = S_dquoted;
+ if (UTF8_TTY_ISO2022JP)
+ goto top1;
+ }
+ if (!UTF8_TTY_ISO2022JP)
+ HTChunkPutc(string, c);
+ break;
+
+ case S_dollar_dq: /* Expecting '@', 'B', 'A' or '(' after CJK "ESC$". */
+ if (c == '@' || c == 'B' || c == 'A') {
+ me->state = S_nonascii_text_dq;
+ } else if (c == '(') {
+ me->state = S_dollar_paren_dq;
+ }
+ if (!UTF8_TTY_ISO2022JP)
+ HTChunkPutc(string, c);
+ break;
+
+ case S_dollar_paren_dq: /* Expecting 'C' after CJK "ESC$(". */
+ if (c == 'C') {
+ me->state = S_nonascii_text_dq;
+ } else {
+ me->state = S_dquoted;
+ if (UTF8_TTY_ISO2022JP) {
+ HTChunkPuts(string, "$(");
+ goto top1;
+ }
+ }
+ if (!UTF8_TTY_ISO2022JP)
+ HTChunkPutc(string, c);
+ break;
+
+ case S_paren_dq: /* Expecting 'B', 'J', 'T' or 'I' after CJK "ESC(". */
+ if (c == 'B' || c == 'J' || c == 'T') {
+ me->state = S_dquoted;
+ } else if (c == 'I') {
+ me->state = S_nonascii_text_dq;
+ if (UTF8_TTY_ISO2022JP)
+ me->kanji_buf = '\t'; /* flag for single byte katakana */
+ } else {
+ me->state = S_dquoted;
+ if (UTF8_TTY_ISO2022JP) {
+ HTChunkPutc(string, '(');
+ goto top1;
+ }
+ }
+ if (!UTF8_TTY_ISO2022JP)
+ HTChunkPutc(string, c);
+ break;
+
+ case S_nonascii_text_dq: /* Expecting CJK ESC after non-ASCII text. */
+ if (TOASCII(c) == '\033') { /* S/390 -- gil -- 1298 */
+ me->state = S_esc_dq;
+ }
+ if (UTF8_TTY_ISO2022JP) {
+ if (TOASCII(c) != '\033')
+ HTChunkPutUtf8Char(string, clong);
+ } else
+ HTChunkPutc(string, c);
+ break;
+
+ case S_junk_tag:
+ case S_pi:
+ if (c == '>') {
+ HTChunkTerminate(string);
+#ifdef USE_PRETTYSRC
+ if (psrc_view) {
+ if (me->state == S_junk_tag) {
+ PSRCSTOP(badtag);
+ }
+ PSRCSTART(abracket);
+ PUTC('>');
+ PSRCSTOP(abracket);
+ }
+#endif
+ if (me->state == S_pi)
+ handle_processing_instruction(me);
+ string->size = 0;
+ me->current_tag = NULL;
+ me->state = S_text;
+ } else {
+ HTChunkPutc(string, c);
+#ifdef USE_PRETTYSRC
+ if (psrc_view) {
+ PUTC(c);
+ }
+#endif
+ }
+
+ } /* switch on me->state */
+ CTRACE2(TRACE_SGML, (tfp, "SGML after %s|%.*s|%c|\n",
+ state_name(me->state),
+ string->size,
+ NonNull(string->data),
+ UCH(c)));
+
+ after_switch:
+ /*
+ * Check whether an external function has added anything to the include
+ * buffer. If so, move the new stuff to the beginning of active_include.
+ * - kw
+ */
+ if (me->include != NULL) {
+ if (me->include[0] == '\0') {
+ FREE(me->include);
+ } else {
+ if (me->active_include &&
+ me->active_include[me->include_index] != '\0')
+ StrAllocCat(me->include,
+ me->active_include + me->include_index);
+ FREE(me->active_include);
+ me->active_include = me->include;
+ me->include_index = 0;
+ me->include = NULL;
+ }
+ }
+
+ /*
+ * Check whether we've added anything to the recover buffer. - FM
+ */
+ if (me->recover != NULL) {
+ if (me->recover[me->recover_index] == '\0') {
+ FREE(me->recover);
+ me->recover_index = 0;
+ } else {
+ c = UCH(me->recover[me->recover_index]);
+ me->recover_index++;
+ goto top;
+ }
+ }
+
+ /*
+ * Check whether an external function had added anything to the include
+ * buffer; it should now be in active_include. - FM / kw
+ */
+ if (me->active_include != NULL) {
+ if (me->active_include[me->include_index] == '\0') {
+ FREE(me->active_include);
+ me->include_index = 0;
+ } else {
+ if (me->current_tag_charset == UTF8_handle ||
+ me->T.trans_from_uni) {
+ /*
+ * If it looks like we would have fed UTF-8 to the next
+ * processing stage, assume that whatever we were fed back is
+ * in UTF-8 form, too. This won't be always true for all uses
+ * of the include buffer, but it's a start. - kw
+ */
+ const char *puni = me->active_include + me->include_index;
+
+ c = UCH(*puni);
+ clong = UCGetUniFromUtf8String(&puni);
+ if (clong < 256 && clong >= 0) {
+ c = UCH((clong & 0xff));
+ }
+ saved_char_in = '\0';
+ me->include_index = (int) (puni
+ - me->active_include
+ + 1);
+ goto top1;
+ } else {
+ /*
+ * Otherwise assume no UTF-8 - do charset-naive processing and
+ * hope for the best. - kw
+ */
+ c = UCH(me->active_include[me->include_index]);
+ me->include_index++;
+ goto top;
+ }
+ }
+ }
+
+ /*
+ * Check whether an external function has added anything to the csi buffer.
+ * - FM
+ */
+ if (me->csi != NULL) {
+ if (me->csi[me->csi_index] == '\0') {
+ FREE(me->csi);
+ me->csi_index = 0;
+ } else {
+ c = UCH(me->csi[me->csi_index]);
+ me->csi_index++;
+ goto top;
+ }
+ }
+} /* SGML_character */
+
+static void InferUtfFromBom(HTStream *me, int chndl)
+{
+ HTAnchor_setUCInfoStage(me->node_anchor, chndl,
+ UCT_STAGE_PARSER,
+ UCT_SETBY_PARSER);
+ change_chartrans_handling(me);
+}
+
+/*
+ * Avoid rewrite of SGML_character() to handle hypothetical case of UTF-16
+ * webpages, by pretending that the data is UTF-8.
+ */
+static void SGML_widechar(HTStream *me, int ch)
+{
+ if (!UCPutUtf8_charstring(me, SGML_character, (UCode_t) ch)) {
+ SGML_character(me, ch);
+ }
+}
+
+static void SGML_write(HTStream *me, const char *str, int l)
+{
+ const char *p;
+ const char *e = str + l;
+
+ if (sgml_offset == 0) {
+ if (l > 3
+ && !MemCmp(str, "\357\273\277", 3)) {
+ CTRACE((tfp, "SGML_write found UTF-8 BOM\n"));
+ InferUtfFromBom(me, UTF8_handle);
+ str += 3;
+ } else if (l > 2) {
+ if (!MemCmp(str, "\377\376", 2)) {
+ CTRACE((tfp, "SGML_write found UCS-2 LE BOM\n"));
+ InferUtfFromBom(me, UTF8_handle);
+ str += 2;
+ me->T.ucs_mode = -1;
+ } else if (!MemCmp(str, "\376\377", 2)) {
+ CTRACE((tfp, "SGML_write found UCS-2 BE BOM\n"));
+ InferUtfFromBom(me, UTF8_handle);
+ str += 2;
+ me->T.ucs_mode = 1;
+ }
+ }
+ }
+ switch (me->T.ucs_mode) {
+ case -1:
+ for (p = str; p < e; p += 2)
+ SGML_widechar(me, (UCH(p[1]) << 8) | UCH(p[0]));
+ break;
+ case 1:
+ for (p = str; p < e; p += 2)
+ SGML_widechar(me, (UCH(p[0]) << 8) | UCH(p[1]));
+ break;
+ default:
+ for (p = str; p < e; p++)
+ SGML_character(me, *p);
+ break;
+ }
+}
+
+static void SGML_string(HTStream *me, const char *str)
+{
+ SGML_write(me, str, (int) strlen(str));
+}
+
+/*_______________________________________________________________________
+*/
+
+/* Structured Object Class
+ * -----------------------
+ */
+const HTStreamClass SGMLParser =
+{
+ "SGMLParser",
+ SGML_free,
+ SGML_abort,
+ SGML_character,
+ SGML_string,
+ SGML_write,
+};
+
+/* Create SGML Engine
+ * ------------------
+ *
+ * On entry,
+ * dtd represents the DTD, along with
+ * actions is the sink for the data as a set of routines.
+ *
+ */
+
+HTStream *SGML_new(const SGML_dtd * dtd,
+ HTParentAnchor *anchor,
+ HTStructured * target,
+ int extended_html)
+{
+ HTStream *me = typecalloc(struct _HTStream);
+
+ if (!me)
+ outofmem(__FILE__, "SGML_begin");
+
+ me->isa = &SGMLParser;
+ me->string = HTChunkCreate(128); /* Grow by this much */
+ me->dtd = dtd;
+ me->target = target;
+ me->actions = (const HTStructuredClass *) (((HTStream *) target)->isa);
+ /* Ugh: no OO */
+ me->unknown_tag = &HTTag_unrecognized;
+ me->current_tag = me->slashedtag = NULL;
+ me->state = S_text;
+#ifdef CALLERDATA
+ me->callerData = (void *) callerData;
+#endif /* CALLERDATA */
+
+ me->node_anchor = anchor; /* Could be NULL? */
+ me->U.utf_buf_p = me->U.utf_buf;
+ UCTransParams_clear(&me->T);
+ me->inUCLYhndl = HTAnchor_getUCLYhndl(anchor,
+ UCT_STAGE_PARSER);
+ if (me->inUCLYhndl < 0) {
+ HTAnchor_copyUCInfoStage(anchor,
+ UCT_STAGE_PARSER,
+ UCT_STAGE_MIME,
+ -1);
+ me->inUCLYhndl = HTAnchor_getUCLYhndl(anchor,
+ UCT_STAGE_PARSER);
+ }
+#ifdef CAN_SWITCH_DISPLAY_CHARSET /* Allow a switch to a more suitable display charset */
+ else if (anchor->UCStages
+ && anchor->UCStages->s[UCT_STAGE_PARSER].LYhndl >= 0
+ && anchor->UCStages->s[UCT_STAGE_PARSER].LYhndl != current_char_set) {
+ int o = anchor->UCStages->s[UCT_STAGE_PARSER].LYhndl;
+
+ anchor->UCStages->s[UCT_STAGE_PARSER].LYhndl = -1; /* Force reset */
+ HTAnchor_resetUCInfoStage(anchor, o, UCT_STAGE_PARSER,
+ /* Preserve change this: */
+ anchor->UCStages->s[UCT_STAGE_PARSER].lock);
+ }
+#endif
+
+ me->inUCI = HTAnchor_getUCInfoStage(anchor,
+ UCT_STAGE_PARSER);
+ set_chartrans_handling(me, anchor, -1);
+
+ me->recover = NULL;
+ me->recover_index = 0;
+ me->include = NULL;
+ me->active_include = NULL;
+ me->include_index = 0;
+ me->url = NULL;
+ me->csi = NULL;
+ me->csi_index = 0;
+
+#ifdef USE_PRETTYSRC
+ if (psrc_view) {
+ psrc_view = FALSE;
+ mark_htext_as_source = TRUE;
+ SGML_string(me,
+ "<HTML><HEAD><TITLE>source</TITLE></HEAD><BODY><PRE>");
+ psrc_view = TRUE;
+ psrc_convert_string = FALSE;
+ sgml_in_psrc_was_initialized = TRUE;
+ }
+#endif
+ if (extended_html)
+ {
+ me->extended_html = TRUE;
+ }
+
+ sgml_offset = 0;
+ return me;
+}
+
+/*
+ * Return the offset within the document where we're parsing. This is used
+ * to help identify anchors which shift around while reparsing.
+ */
+int SGML_offset(void)
+{
+ int result = sgml_offset;
+
+#ifdef USE_PRETTYSRC
+ result += psrc_view;
+#endif
+ return result;
+}
+
+/* Asian character conversion functions
+ * ====================================
+ *
+ * Added 24-Mar-96 by FM, based on:
+ *
+ ////////////////////////////////////////////////////////////////////////
+Copyright (c) 1993 Electrotechnical Laboratory (ETL)
+
+Permission to use, copy, modify, and distribute this material
+for any purpose and without fee is hereby granted, provided
+that the above copyright notice and this permission notice
+appear in all copies, and that the name of ETL not be
+used in advertising or publicity pertaining to this
+material without the specific, prior written permission
+of an authorized representative of ETL.
+ETL MAKES NO REPRESENTATIONS ABOUT THE ACCURACY OR SUITABILITY
+OF THIS MATERIAL FOR ANY PURPOSE. IT IS PROVIDED "AS IS",
+WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES.
+/////////////////////////////////////////////////////////////////////////
+Content-Type: program/C; charset=US-ASCII
+Program: SJIS.c
+Author: Yutaka Sato <ysato@etl.go.jp>
+Description:
+History:
+ 930923 extracted from codeconv.c of cosmos
+///////////////////////////////////////////////////////////////////////
+*/
+
+static int TREAT_SJIS = 1;
+
+void JISx0201TO0208_EUC(unsigned IHI,
+ unsigned ILO,
+ unsigned char *OHI,
+ unsigned char *OLO)
+{
+ static const char *table[] =
+ {
+ "\241\243", /* A1,A3 */
+ "\241\326", /* A1,D6 */
+ "\241\327", /* A1,D7 */
+ "\241\242", /* A1,A2 */
+ "\241\246", /* A1,A6 */
+ "\245\362", /* A5,F2 */
+ "\245\241", /* A5,A1 */
+ "\245\243", /* A5,A3 */
+ "\245\245", /* A5,A5 */
+ "\245\247", /* A5,A7 */
+ "\245\251", /* A5,A9 */
+ "\245\343", /* A5,E3 */
+ "\245\345", /* A5,E5 */
+ "\245\347", /* A5,E7 */
+ "\245\303", /* A5,C3 */
+ "\241\274", /* A1,BC */
+ "\245\242", /* A5,A2 */
+ "\245\244", /* A5,A4 */
+ "\245\246", /* A5,A6 */
+ "\245\250", /* A5,A8 */
+ "\245\252", /* A5,AA */
+ "\245\253", /* A5,AB */
+ "\245\255", /* A5,AD */
+ "\245\257", /* A5,AF */
+ "\245\261", /* A5,B1 */
+ "\245\263", /* A5,B3 */
+ "\245\265", /* A5,B5 */
+ "\245\267", /* A5,B7 */
+ "\245\271", /* A5,B9 */
+ "\245\273", /* A5,BB */
+ "\245\275", /* A5,BD */
+ "\245\277", /* A5,BF */
+ "\245\301", /* A5,C1 */
+ "\245\304", /* A5,C4 */
+ "\245\306", /* A5,C6 */
+ "\245\310", /* A5,C8 */
+ "\245\312", /* A5,CA */
+ "\245\313", /* A5,CB */
+ "\245\314", /* A5,CC */
+ "\245\315", /* A5,CD */
+ "\245\316", /* A5,CE */
+ "\245\317", /* A5,CF */
+ "\245\322", /* A5,D2 */
+ "\245\325", /* A5,D5 */
+ "\245\330", /* A5,D8 */
+ "\245\333", /* A5,DB */
+ "\245\336", /* A5,DE */
+ "\245\337", /* A5,DF */
+ "\245\340", /* A5,E0 */
+ "\245\341", /* A5,E1 */
+ "\245\342", /* A5,E2 */
+ "\245\344", /* A5,E4 */
+ "\245\346", /* A5,E6 */
+ "\245\350", /* A5,E8 */
+ "\245\351", /* A5,E9 */
+ "\245\352", /* A5,EA */
+ "\245\353", /* A5,EB */
+ "\245\354", /* A5,EC */
+ "\245\355", /* A5,ED */
+ "\245\357", /* A5,EF */
+ "\245\363", /* A5,F3 */
+ "\241\253", /* A1,AB */
+ "\241\254" /* A1,AC */
+ };
+
+ if ((IHI == 0x8E) && (ILO >= 0xA1) && (ILO <= 0xDF)) {
+ *OHI = UCH(table[ILO - 0xA1][0]);
+ *OLO = UCH(table[ILO - 0xA1][1]);
+ } else {
+ *OHI = UCH(IHI);
+ *OLO = UCH(ILO);
+ }
+}
+
+static int IS_SJIS_STR(const unsigned char *str)
+{
+ const unsigned char *s;
+ unsigned char ch;
+ int is_sjis = 0;
+
+ s = str;
+ while ((ch = *s++) != '\0') {
+ if (ch & 0x80)
+ if (IS_SJIS(ch, *s, is_sjis))
+ return 1;
+ }
+ return 0;
+}
+
+unsigned char *SJIS_TO_JIS1(unsigned HI,
+ unsigned LO,
+ unsigned char *JCODE)
+{
+ HI = UCH(HI - (unsigned) UCH((HI <= 0x9F) ? 0x71 : 0xB1));
+ HI = UCH((HI << 1) + 1);
+ if (0x7F < LO)
+ LO--;
+ if (0x9E <= LO) {
+ LO = UCH(LO - UCH(0x7D));
+ HI++;
+ } else {
+ LO = UCH(LO - UCH(0x1F));
+ }
+ JCODE[0] = UCH(HI);
+ JCODE[1] = UCH(LO);
+ return JCODE;
+}
+
+unsigned char *JIS_TO_SJIS1(unsigned HI,
+ unsigned LO,
+ unsigned char *SJCODE)
+{
+ if (HI & 1)
+ LO = UCH(LO + UCH(0x1F));
+ else
+ LO = UCH(LO + UCH(0x7D));
+ if (0x7F <= LO)
+ LO++;
+
+ HI = UCH(((HI - 0x21) >> 1) + 0x81);
+ if (0x9F < HI)
+ HI = UCH(HI + UCH(0x40));
+ SJCODE[0] = UCH(HI);
+ SJCODE[1] = UCH(LO);
+ return SJCODE;
+}
+
+unsigned char *EUC_TO_SJIS1(unsigned HI,
+ unsigned LO,
+ unsigned char *SJCODE)
+{
+ unsigned char HI_data[2];
+ unsigned char LO_data[2];
+
+ HI_data[0] = UCH(HI);
+ LO_data[0] = UCH(LO);
+ if (HI == 0x8E) {
+ JISx0201TO0208_EUC(HI, LO, HI_data, LO_data);
+ }
+ JIS_TO_SJIS1(UCH(HI_data[0] & 0x7F), UCH(LO_data[0] & 0x7F), SJCODE);
+ return SJCODE;
+}
+
+void JISx0201TO0208_SJIS(unsigned I,
+ unsigned char *OHI,
+ unsigned char *OLO)
+{
+ unsigned char SJCODE[2];
+
+ JISx0201TO0208_EUC(0x8E, I, OHI, OLO);
+ JIS_TO_SJIS1(UCH(*OHI & 0x7F), UCH(*OLO & 0x7F), SJCODE);
+ *OHI = SJCODE[0];
+ *OLO = SJCODE[1];
+}
+
+unsigned char *SJIS_TO_EUC1(unsigned HI,
+ unsigned LO,
+ unsigned char *data)
+{
+ SJIS_TO_JIS1(HI, LO, data);
+ data[0] |= 0x80;
+ data[1] |= 0x80;
+ return data;
+}
+
+unsigned char *SJIS_TO_EUC(unsigned char *src,
+ unsigned char *dst)
+{
+ unsigned char hi, lo, *sp, *dp;
+ int in_sjis = 0;
+
+ in_sjis = IS_SJIS_STR(src);
+ for (sp = src, dp = dst; (hi = sp[0]) != '\0';) {
+ lo = sp[1];
+ if (TREAT_SJIS && IS_SJIS(hi, lo, in_sjis)) {
+ SJIS_TO_JIS1(hi, lo, dp);
+ dp[0] |= 0x80;
+ dp[1] |= 0x80;
+ dp += 2;
+ sp += 2;
+ } else
+ *dp++ = *sp++;
+ }
+ *dp = 0;
+ return dst;
+}
+
+unsigned char *EUC_TO_SJIS(unsigned char *src,
+ unsigned char *dst)
+{
+ unsigned char *sp, *dp;
+
+ for (sp = src, dp = dst; *sp;) {
+ if (*sp & 0x80) {
+ if (sp[1] && (sp[1] & 0x80)) {
+ JIS_TO_SJIS1(UCH(sp[0] & 0x7F), UCH(sp[1] & 0x7F), dp);
+ dp += 2;
+ sp += 2;
+ } else {
+ sp++;
+ }
+ } else {
+ *dp++ = *sp++;
+ }
+ }
+ *dp = 0;
+ return dst;
+}
+
+#define Strcpy(a,b) (strcpy((char*)a,(const char*)b),&a[strlen((const char*)a)])
+
+unsigned char *EUC_TO_JIS(unsigned char *src,
+ unsigned char *dst,
+ const char *toK,
+ const char *toA)
+{
+ unsigned char kana_mode = 0;
+ unsigned char cch;
+ unsigned char *sp = src;
+ unsigned char *dp = dst;
+ int is_JIS = 0;
+
+ while ((cch = *sp++) != '\0') {
+ if (cch & 0x80) {
+ if (!IS_EUC(cch, *sp)) {
+ if (cch == 0xA0 && is_JIS) /* ignore NBSP */
+ continue;
+ is_JIS++;
+ *dp++ = cch;
+ continue;
+ }
+ if (!kana_mode) {
+ kana_mode = UCH(~kana_mode);
+ dp = Strcpy(dp, toK);
+ }
+ if (*sp & 0x80) {
+ *dp++ = UCH(cch & ~0x80);
+ *dp++ = UCH(*sp++ & ~0x80);
+ }
+ } else {
+ if (kana_mode) {
+ kana_mode = UCH(~kana_mode);
+ dp = Strcpy(dp, toA);
+ }
+ *dp++ = cch;
+ }
+ }
+ if (kana_mode)
+ dp = Strcpy(dp, toA);
+
+ if (dp)
+ *dp = 0;
+ return dst;
+}
+
+#define IS_JIS7(c1,c2) (0x20<(c1)&&(c1)<0x7F && 0x20<(c2)&&(c2)<0x7F)
+#define SO ('N'-0x40)
+#define SI ('O'-0x40)
+
+static int repair_JIS = 0;
+
+static const unsigned char *repairJIStoEUC(const unsigned char *src,
+ unsigned char **dstp)
+{
+ const unsigned char *s;
+ unsigned char *d, ch1, ch2;
+
+ d = *dstp;
+ s = src;
+ while ((ch1 = s[0]) && (ch2 = s[1])) {
+ s += 2;
+ if (ch1 == '(')
+ if (ch2 == 'B' || ch2 == 'J') {
+ *dstp = d;
+ return s;
+ }
+ if (!IS_JIS7(ch1, ch2))
+ return 0;
+
+ *d++ = UCH(0x80 | ch1);
+ *d++ = UCH(0x80 | ch2);
+ }
+ return 0;
+}
+
+unsigned char *TO_EUC(const unsigned char *jis,
+ unsigned char *euc)
+{
+ const unsigned char *s;
+ unsigned char c, jis_stat;
+ unsigned char *d;
+ int to1B, to2B;
+ int in_sjis = 0;
+ static int nje;
+ int n8bits;
+ int is_JIS;
+
+ nje++;
+ n8bits = 0;
+ s = jis;
+ d = euc;
+ jis_stat = 0;
+ to2B = TO_2BCODE;
+ to1B = TO_1BCODE;
+ in_sjis = IS_SJIS_STR(jis);
+ is_JIS = 0;
+
+ while ((c = *s++) != '\0') {
+ if (c == 0x80)
+ continue; /* ignore it */
+ if (c == 0xA0 && is_JIS)
+ continue; /* ignore Non-breaking space */
+
+ if (c == to2B && jis_stat == 0 && repair_JIS) {
+ if (*s == 'B' || *s == '@') {
+ const unsigned char *ts;
+
+ if ((ts = repairJIStoEUC(s + 1, &d)) != NULL) {
+ s = ts;
+ continue;
+ }
+ }
+ }
+ if (c == CH_ESC) {
+ if (*s == to2B) {
+ if ((s[1] == 'B') || (s[1] == '@')) {
+ jis_stat = 0x80;
+ s += 2;
+ is_JIS++;
+ continue;
+ }
+ jis_stat = 0;
+ } else if (*s == to1B) {
+ jis_stat = 0;
+ if ((s[1] == 'B') || (s[1] == 'J') || (s[1] == 'H')) {
+ s += 2;
+ continue;
+ }
+ } else if (*s == ',') { /* MULE */
+ jis_stat = 0;
+ }
+ }
+ if (c & 0x80)
+ n8bits++;
+
+ if (IS_SJIS(c, *s, in_sjis)) {
+ SJIS_TO_EUC1(c, *s, d);
+ d += 2;
+ s++;
+ is_JIS++;
+ } else if (jis_stat) {
+ if (c <= 0x20 || 0x7F <= c) {
+ *d++ = c;
+ if (c == '\n')
+ jis_stat = 0;
+ } else {
+ if (IS_JIS7(c, *s)) {
+ *d++ = jis_stat | c;
+ *d++ = jis_stat | *s++;
+ } else
+ *d++ = c;
+ }
+ } else {
+ if (n8bits == 0 && (c == SI || c == SO)) {
+ } else {
+ *d++ = c;
+ }
+ }
+ }
+ *d = 0;
+ return euc;
+}
+
+#define non94(ch) ((ch) <= 0x20 || (ch) == 0x7F)
+
+static int is_EUC_JP(unsigned char *euc)
+{
+ unsigned char *cp;
+ int ch1, ch2;
+
+ for (cp = euc; (ch1 = *cp) != '\0'; cp++) {
+ if (ch1 & 0x80) {
+ ch2 = cp[1] & 0xFF;
+ if ((ch2 & 0x80) == 0) {
+ /* sv1log("NOT_EUC1[%x][%x]\n",ch1,ch2); */
+ return 0;
+ }
+ if (non94(ch1 & 0x7F) || non94(ch2 & 0x7F)) {
+ /* sv1log("NOT_EUC2[%x][%x]\n",ch1,ch2); */
+ return 0;
+ }
+ cp++;
+ }
+ }
+ return 1;
+}
+
+void TO_SJIS(const unsigned char *arg,
+ unsigned char *sjis)
+{
+ unsigned char *euc;
+
+ euc = typeMallocn(unsigned char, strlen((const char *) arg) + 1);
+
+#ifdef CJK_EX
+ if (!euc)
+ outofmem(__FILE__, "TO_SJIS");
+#endif
+ TO_EUC(arg, euc);
+ if (is_EUC_JP(euc))
+ EUC_TO_SJIS(euc, sjis);
+ else
+ strcpy((char *) sjis, (const char *) arg);
+ free(euc);
+}
+
+void TO_JIS(const unsigned char *arg,
+ unsigned char *jis)
+{
+ unsigned char *euc;
+
+ if (arg[0] == 0) {
+ jis[0] = 0;
+ return;
+ }
+ euc = typeMallocn(unsigned char, strlen((const char *)arg) + 1);
+#ifdef CJK_EX
+ if (!euc)
+ outofmem(__FILE__, "TO_JIS");
+#endif
+ TO_EUC(arg, euc);
+ EUC_TO_JIS(euc, jis, TO_KANJI, TO_ASCII);
+
+ free(euc);
+}
diff --git a/WWW/Library/Implementation/SGML.h b/WWW/Library/Implementation/SGML.h
new file mode 100644
index 0000000..4525fda
--- /dev/null
+++ b/WWW/Library/Implementation/SGML.h
@@ -0,0 +1,287 @@
+/*
+ * $LynxId: SGML.h,v 1.50 2023/01/05 22:23:44 tom Exp $
+ * SGML parse and stream definition for libwww
+ * SGML AND STRUCTURED STREAMS
+ *
+ * The SGML parser is a state machine. It is called for every character
+ * of the input stream. The DTD data structure contains pointers
+ * to functions which are called to implement the actual effect of the
+ * text read. When these functions are called, the attribute structures pointed to by the
+ * DTD are valid, and the function is passed a pointer to the current tag structure, and an
+ * "element stack" which represents the state of nesting within SGML elements.
+ *
+ * The following aspects are from Dan Connolly's suggestions: Binary search,
+ * Structured object scheme basically, SGML content enum type.
+ *
+ * (c) Copyright CERN 1991 - See Copyright.html
+ *
+ */
+#ifndef SGML_H
+#define SGML_H
+
+#include <HTStream.h>
+#include <HTAnchor.h>
+#include <LYJustify.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ *
+ * SGML content types
+ *
+ */ typedef enum {
+ SGML_EMPTY, /* No content. */
+ SGML_LITTERAL, /* Literal character data. Recognize exact close tag only.
+ Old www server compatibility only! Not SGML */
+ SGML_CDATA, /* Character data. Recognize </ only.
+ (But we treat it just as SGML_LITTERAL.) */
+ SGML_SCRIPT, /* Like CDATA, but allow it to be a comment */
+ SGML_RCDATA, /* Replaceable character data. Should recognize </ and &ref;
+ (but we treat it like SGML_MIXED for old times' sake). */
+ SGML_MIXED, /* Elements and parsed character data.
+ Recognize all markup. */
+ SGML_ELEMENT, /* Any data found should be regarded as an error.
+ (But we treat it just like SGML_MIXED.) */
+ SGML_PCDATA /* Should contain no elements but &ref; is parsed.
+ (We treat it like SGML_CDATA wrt. contained tags
+ i.e. pass them on literally, i.e. like we should
+ treat SGML_RCDATA) (added by KW). */
+ } SGMLContent;
+
+ typedef struct {
+ const char *name; /* The name of the attribute */
+#ifdef USE_PRETTYSRC
+ char type; /* code of the type of the attribute. Code
+ values are in HTMLDTD.h */
+#endif
+ } attr;
+
+ typedef const attr *AttrList;
+
+ typedef struct {
+ const char *name;
+ AttrList list;
+ } AttrType;
+
+ typedef int TagClass;
+
+ /* textflow */
+#define Tgc_FONTlike 0x00001 /* S,STRIKE,I,B,TT,U,BIG,SMALL,STYLE,BLINK;BR,TAB */
+#define Tgc_EMlike 0x00002 /* EM,STRONG,DFN,CODE,SAMP,KBD,VAR,CITE,Q,INS,DEL,SPAN,.. */
+#define Tgc_MATHlike 0x00004 /* SUB,SUP,MATH,COMMENT */
+#define Tgc_Alike 0x00008 /* A */
+#define Tgc_formula 0x00010 /* not used until math is supported better... */
+ /* used for special structures: forms, tables,... */
+#define Tgc_TRlike 0x00020 /* TR and similar */
+#define Tgc_SELECTlike 0x00040 /* SELECT,INPUT,TEXTAREA(,...) */
+ /* structure */
+#define Tgc_FORMlike 0x00080 /* FORM itself */
+#define Tgc_Plike 0x00100 /* P,H1..H6,... structures containing text or
+ insertion but not other structures */
+#define Tgc_DIVlike 0x00200 /* ADDRESS,FIG,BDO,NOTE,FN,DIV,CENTER;FIG
+ structures which can contain other structures */
+#define Tgc_LIlike 0x00400 /* LH,LI,DT,DD;TH,TD structure-like, only valid
+ within certain other structures */
+#define Tgc_ULlike 0x00800 /* UL,OL,DL,DIR,MENU;TABLE;XMP,LISTING
+ special in some way, cannot contain (parsed)
+ text directly */
+ /* insertions */
+#define Tgc_BRlike 0x01000 /* BR,IMG,TAB allowed in any text */
+#define Tgc_APPLETlike 0x02000 /* APPLET,OBJECT,EMBED,SCRIPT;BUTTON */
+#define Tgc_HRlike 0x04000 /* HR,MARQUEE can contain all kinds of things
+ and/or are not allowed (?) in running text */
+#define Tgc_MAPlike 0x08000 /* MAP,AREA some specials that never contain
+ (directly or indirectly) other things than
+ special insertions */
+#define Tgc_outer 0x10000 /* HTML,FRAMESET,FRAME,PLAINTEXT; */
+#define Tgc_BODYlike 0x20000 /* BODY,BODYTEXT,NOFRAMES,TEXTFLOW; */
+#define Tgc_HEADstuff 0x40000 /* HEAD,BASE,STYLE,TITLE; */
+ /* special relations */
+#define Tgc_same 0x80000
+#define Tgc_DELlike 0x100000
+ /* DELlike is a class of aliases for inline DEL/INS */
+ typedef unsigned char TagAlias;
+
+/*
+ * Groups for contains-data.
+ */
+#define Tgc_INLINElike (Tgc_Alike | Tgc_APPLETlike | Tgc_BRlike | Tgc_EMlike | Tgc_FONTlike | Tgc_SELECTlike)
+#define Tgc_LISTlike (Tgc_LIlike | Tgc_ULlike)
+#define Tgc_BLOCKlike (Tgc_DIVlike | Tgc_LISTlike)
+
+/* Some more properties of tags (or rather, elements) and rules how
+ to deal with them. - kw */
+ typedef int TagFlags;
+
+#define Tgf_endO 0x00001 /* end tag can be Omitted */
+#define Tgf_startO 0x00002 /* start tag can be Omitted */
+#define Tgf_mafse 0x00004 /* Make Attribute-Free Start-tag End instead
+ (if found invalid) */
+#define Tgf_strict 0x00008 /* Ignore contained invalid elements,
+ don't pass them on; or other variant
+ handling for some content types */
+#define Tgf_nreie 0x00010 /* Not Really Empty If Empty,
+ used by color style code */
+#define Tgf_frecyc 0x00020 /* Pass element content on in a form that
+ allows recycling, i.e. don't translate to
+ output (display) character set yet (treat
+ content similar to attribute values) */
+#define Tgf_nolyspcl 0x00040 /* Don't generate lynx special characters
+ for soft hyphen and various spaces (nbsp,
+ ensp,..) */
+
+/* A tag structure describes an SGML element.
+ * -----------------------------------------
+ *
+ *
+ * name is the string which comes after the tag opener "<".
+ *
+ * attributes points to a zero-terminated array
+ * of attribute names.
+ */
+ typedef struct _tag HTTag;
+ struct _tag {
+ const char *name; /* The name of the tag */
+#ifdef USE_COLOR_STYLE
+ unsigned name_len; /* The length of the name */
+#endif
+#ifdef USE_JUSTIFY_ELTS
+ BOOL can_justify; /* justification allowed? */
+#endif
+ AttrList attributes; /* The list of acceptable attributes */
+ int number_of_attributes; /* Number of possible attributes */
+ const AttrType *attr_types;
+ SGMLContent contents; /* End only on end tag @@ */
+ TagClass tagclass;
+ TagClass contains; /* which classes of elements this one can contain directly */
+ TagClass icontains; /* which classes of elements this one can contain indirectly */
+ TagClass contained; /* in which classes can this tag be contained ? */
+ TagClass icontained; /* in which classes can this tag be indirectly contained ? */
+ TagClass canclose; /* which classes of elements can this one close
+ if something looks wrong ? */
+ TagFlags flags;
+ TagAlias alias; /* extra levels, e.g, DEL/INS */
+ TagAlias aliases; /* number of extra levels, e.g, DEL/INS */
+ };
+
+/* DTD Information
+ * ---------------
+ *
+ * Not the whole DTD, but all this parser uses of it.
+ */
+ typedef struct {
+ HTTag *tags; /* Must be in strcmp order by name */
+ int number_of_tags;
+ STRING2PTR entity_names; /* Must be in strcmp order by name */
+ size_t number_of_entities;
+ /* "entity_names" table probably unused,
+ * see comments in HTMLDTD.c near the top
+ */
+ } SGML_dtd;
+
+/* SGML context passed to parsers
+*/
+ typedef struct _HTSGMLContext *HTSGMLContext; /* Hidden */
+
+/*__________________________________________________________________________
+*/
+
+/*
+
+Structured Object definition
+
+ A structured object is something which can reasonably be represented
+ in SGML. I'll rephrase that. A structured object is an ordered
+ tree-structured arrangement of data which is representable as text.
+ The SGML parser outputs to a Structured object. A Structured object
+ can output its contents to another Structured Object. It's a kind of
+ typed stream. The architecture is largely Dan Conolly's. Elements and
+ entities are passed to the sob by number, implying a knowledge of the
+ DTD. Knowledge of the SGML syntax is not here, though.
+
+ Superclass: HTStream
+
+ The creation methods will vary on the type of Structured Object.
+ Maybe the callerData is enough info to pass along.
+
+ */
+ typedef struct _HTStructured HTStructured;
+
+ typedef struct _HTStructuredClass {
+
+ const char *name; /* Just for diagnostics */
+
+ void (*_free) (HTStructured * me);
+
+ void (*_abort) (HTStructured * me, HTError e);
+
+ void (*put_character) (HTStructured * me, int ch);
+
+ void (*put_string) (HTStructured * me, const char *str);
+
+ void (*put_block) (HTStructured * me, const char *str, int len);
+
+ /* HTStreamClass ends here */
+
+ int (*start_element) (HTStructured * me, int element_number,
+ const BOOL *attribute_present,
+ STRING2PTR attribute_value,
+ int charset,
+ char **include);
+
+ int (*end_element) (HTStructured * me, int element_number,
+ char **include);
+
+ int (*put_entity) (HTStructured * me, int entity_number);
+
+ } HTStructuredClass;
+
+/*
+ Equivalents to the following functions possibly could be generalised
+ into additional HTStructuredClass members. For now they don't do
+ anything target-specific. - kw
+ */
+ extern BOOLEAN LYCheckForCSI(HTParentAnchor *anchor, char **url);
+ extern void LYDoCSI(char *url, const char *comment, char **csi);
+ extern BOOLEAN LYCommentHacks(HTParentAnchor *anchor, const char *comment);
+
+/*
+
+Find a Tag by Name
+
+ Returns a pointer to the tag within the DTD.
+
+ */
+ extern HTTag *SGMLFindTag(const SGML_dtd * dtd,
+ const char *string);
+
+/*
+ * Return the current offset within the file that SGML is parsing
+ */
+ extern int SGML_offset(void);
+
+/*
+
+Create an SGML parser
+
+ */
+/*
+ * On entry,
+ * dtd must point to a DTD structure as defined above
+ * callbacks must point to user routines.
+ * callData is returned in callbacks transparently.
+ * On exit,
+ * The default tag starter has been processed.
+ */
+ extern HTStream *SGML_new(const SGML_dtd * dtd,
+ HTParentAnchor *anchor,
+ HTStructured * target,
+ int extended_html);
+
+ extern const HTStreamClass SGMLParser;
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* SGML_H */
diff --git a/WWW/Library/Implementation/UCAux.h b/WWW/Library/Implementation/UCAux.h
new file mode 100644
index 0000000..3e574a1
--- /dev/null
+++ b/WWW/Library/Implementation/UCAux.h
@@ -0,0 +1,92 @@
+/*
+ * $LynxId: UCAux.h,v 1.22 2014/12/10 09:48:41 tom Exp $
+ */
+#ifndef UCAUX_H
+#define UCAUX_H
+
+#ifndef HTUTILS_H
+#include <HTUtils.h>
+#endif
+
+#ifndef UCDEFS_H
+#include <UCDefs.h>
+#endif /* UCDEFS_H */
+
+#ifndef HTSTREAM_H
+#include <HTStream.h>
+#endif /* HTSTREAM_H */
+
+#ifndef UCMAP_H
+#include <UCMap.h>
+#endif /* UCMAP_H */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ extern BOOL UCCanUniTranslateFrom(int from);
+ extern BOOL UCCanTranslateUniTo(int to);
+ extern BOOL UCCanTranslateFromTo(int from, int to);
+ extern BOOL UCNeedNotTranslate(int from,
+ int to);
+
+ struct _UCTransParams {
+ BOOL transp;
+ BOOL do_cjk;
+ BOOL decode_utf8;
+ BOOL output_utf8;
+ BOOL use_raw_char_in;
+ BOOL strip_raw_char_in;
+ BOOL pass_160_173_raw;
+ BOOL do_8bitraw;
+ BOOL trans_to_uni;
+ BOOL trans_C0_to_uni;
+ BOOL repl_translated_C0;
+ BOOL trans_from_uni;
+ int ucs_mode;
+ };
+ typedef struct _UCTransParams UCTransParams;
+
+ typedef struct {
+ char utf_count;
+ UCode_t utf_char;
+ char utf_buf[8];
+ char *utf_buf_p;
+ } UTFDecodeState;
+
+ typedef enum {
+ dUTF8_ok,
+ dUTF8_err,
+ dUTF8_more
+ } dUTF8;
+
+ extern dUTF8 HTDecodeUTF8(UTFDecodeState * me, int *c_in_out, UCode_t *result);
+
+ extern void UCSetTransParams(UCTransParams * pT, int cs_in,
+ const LYUCcharset *p_in,
+ int cs_out,
+ const LYUCcharset *p_out);
+
+ extern void UCTransParams_clear(UCTransParams * pT);
+
+ extern void UCSetBoxChars(int cset,
+ int *pvert_out,
+ int *phori_out,
+ int vert_in,
+ int hori_in);
+
+ typedef void putc_func_t (HTStream *me,
+ int ch);
+
+ extern BOOL UCPutUtf8_charstring(HTStream *target,
+ putc_func_t *actions,
+ UCode_t code);
+
+ extern BOOL UCConvertUniToUtf8(UCode_t code,
+ char *buffer);
+
+ extern UCode_t UCGetUniFromUtf8String(const char **ppuni);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* UCAUX_H */
diff --git a/WWW/Library/Implementation/UCDefs.h b/WWW/Library/Implementation/UCDefs.h
new file mode 100644
index 0000000..4eb7c56
--- /dev/null
+++ b/WWW/Library/Implementation/UCDefs.h
@@ -0,0 +1,106 @@
+/*
+ * $LynxId: UCDefs.h,v 1.18 2021/06/29 00:21:51 tom Exp $
+ *
+ * Definitions for Unicode character-translations
+ */
+
+#ifndef UCDEFS_H
+#define UCDEFS_H
+
+#ifndef HTUTILS_H
+#include <HTUtils.h>
+#endif
+
+typedef struct _LYUCcharset {
+ int UChndl; /* -1 for "old" charsets, >= 0 for chartrans tables */
+
+ const char *MIMEname;
+ int enc;
+ int codepage; /* if positive, an IBM OS/2 specific number;
+ if negative, flag for no table translation */
+
+ /* parameters below are not used by chartrans mechanism, */
+ /* they describe some relationships against built-in Latin1 charset... */
+ int repertoire; /* unused */
+ int codepoints; /* subset/superset of Latin1 ? */
+ int cpranges; /* unused, obsolete by LYlowest_eightbit;
+ "which ranges have valid displayable chars
+ (including nbsp and shy)" */
+ int like8859; /* currently used for nbsp and shy only
+ (but UCT_R_8859SPECL assumed for any UCT_R_8BIT...);
+ "for which ranges is it like 8859-1" */
+} LYUCcharset;
+
+typedef enum {
+ UCT_ENC_7BIT,
+ UCT_ENC_8BIT,
+ UCT_ENC_8859, /* no displayable chars in 0x80-0x9F */
+ UCT_ENC_8BIT_C0, /* 8-bit + some chars in C0 control area */
+ UCT_ENC_MAYBE2022,
+ UCT_ENC_CJK,
+ UCT_ENC_16BIT,
+ UCT_ENC_UTF8
+} eUCT_ENC;
+
+#define UCT_REP_SUBSETOF_LAT1 0x01
+#define UCT_REP_SUPERSETOF_LAT1 0x02
+#define UCT_REP_IS_LAT1 UCT_REP_SUBSETOF_LAT1 | UCT_REP_SUPERSETOF_LAT1
+/*
+ * Assume everything we deal with is included in the UCS2 repertoire,
+ * so a flag for _REP_SUBSETOF_UCS2 would be redundant.
+ */
+
+/*
+ * More general description how the code points relate to 8859-1 and UCS:
+ */
+#define UCT_CP_SUBSETOF_LAT1 0x01 /* implies UCT_CP_SUBSETOF_UCS2 */
+#define UCT_CP_SUPERSETOF_LAT1 0x02
+#define UCT_CP_SUBSETOF_UCS2 0x04
+
+#define UCT_CP_IS_LAT1 UCT_CP_SUBSETOF_LAT1 | UCT_CP_SUPERSETOF_LAT1
+
+/*
+ * More specific bitflags for practically important code point ranges:
+ */
+#define UCT_R_LOWCTRL 0x08 /* 0x00-0x1F, for completeness */
+#define UCT_R_7BITINV 0x10 /* invariant???, displayable 7bit chars */
+#define UCT_R_7BITNAT 0x20 /* displayable 7bit, national??? */
+#define UCT_R_HIGHCTRL 0x40 /* chars in 0x80-0x9F range */
+#define UCT_R_8859SPECL 0x80 /* special chars in 8859-x sets: nbsp and shy */
+#define UCT_R_HIGH8BIT 0x100 /* rest of 0xA0-0xFF range */
+
+#define UCT_R_ASCII UCT_R_7BITINV | UCT_R_7BITNAT /* displayable US-ASCII */
+#define UCT_R_LAT1 UCT_R_ASCII | UCT_R_8859SPECL | UCT_R_HIGH8BIT
+#define UCT_R_8BIT UCT_R_LAT1 | UCT_R_HIGHCTRL /* full 8bit range */
+
+/*
+ * For the following some comments are in HTAnchor.c.
+ */
+typedef enum {
+ UCT_STAGE_MIME,
+ UCT_STAGE_PARSER, /* What the parser (SGML.c) gets to see */
+ UCT_STAGE_STRUCTURED, /* What the structured stream (HTML) gets fed */
+ UCT_STAGE_HTEXT, /* What gets fed to the HText_* functions */
+ UCT_STAGEMAX
+} eUCT_STAGE;
+
+typedef enum {
+ UCT_SETBY_NONE,
+ UCT_SETBY_DEFAULT,
+ UCT_SETBY_LINK, /* set by A or LINK CHARSET= hint */
+ UCT_SETBY_STRUCTURED, /* structured stream stage (HTML.c) */
+ UCT_SETBY_PARSER, /* set by SGML parser or similar */
+ UCT_SETBY_MIME /* set explicitly by MIME charset parameter */
+} eUCT_SETBY;
+
+typedef struct _UCStageInfo {
+ int lock; /* by what it has been set */
+ int LYhndl;
+ LYUCcharset C;
+} UCStageInfo;
+
+typedef struct _UCAnchorInfo {
+ struct _UCStageInfo s[UCT_STAGEMAX];
+} UCAnchorInfo;
+
+#endif /* UCDEFS_H */
diff --git a/WWW/Library/Implementation/UCMap.h b/WWW/Library/Implementation/UCMap.h
new file mode 100644
index 0000000..0c88969
--- /dev/null
+++ b/WWW/Library/Implementation/UCMap.h
@@ -0,0 +1,114 @@
+/*
+ * $LynxId: UCMap.h,v 1.30 2023/01/05 09:17:15 tom Exp $
+ */
+#ifndef UCMAP_H
+#define UCMAP_H
+
+#ifndef HTUTILS_H
+#include <HTUtils.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define UCS_HIDE 0xffff
+#define UCS_REPL 0xfffd
+
+ typedef enum {
+ ucError = -1,
+ ucZeroWidth = -2,
+ ucInvalidHash = -3,
+ ucNotFound = -4,
+ ucNeedMore = -10,
+ ucCannotConvert = -11,
+ ucCannotOutput = -12,
+ ucBufferTooSmall = -13,
+ ucUnknown = -14
+ } UCStatus;
+
+ typedef long UCode_t;
+
+ extern BOOL UCScanCode(UCode_t *, const char *, BOOL);
+
+ extern int UCTransUniChar(UCode_t unicode,
+ int charset_out);
+ extern int UCTransUniCharStr(char *outbuf,
+ int buflen,
+ UCode_t unicode,
+ int charset_out,
+ int chk_single_flag);
+ extern int UCTransChar(int ch_in,
+ int charset_in,
+ int charset_out);
+ extern int UCReverseTransChar(int ch_out,
+ int charset_in,
+ int charset_out);
+ extern int UCTransCharStr(char *outbuf,
+ int buflen,
+ int ch_in,
+ int charset_in,
+ int charset_out,
+ int chk_single_flag);
+#ifdef EXP_CHINESEUTF8_SUPPORT
+ extern UCode_t UCTransJPToUni(char *inbuf,
+ int buflen,
+ int charset_in);
+#endif
+ extern UCode_t UCTransToUni(int ch_in,
+ int charset_in);
+ extern int UCGetRawUniMode_byLYhndl(int i);
+ extern int UCGetLYhndl_byMIME(const char *p); /* returns -1 if name not recognized */
+ extern int safeUCGetLYhndl_byMIME(const char *p); /* returns LATIN1 if name not recognized */
+
+#ifdef USE_LOCALE_CHARSET
+ extern void LYFindLocaleCharset(void);
+#endif
+
+ extern int UCLYhndl_for_unspec;
+ extern int UCLYhndl_for_unrec;
+ extern int UCLYhndl_HTFile_for_unspec;
+ extern int UCLYhndl_HTFile_for_unrec;
+
+/* easy to type: */
+ extern int LATIN1; /* UCGetLYhndl_byMIME("iso-8859-1") */
+ extern int US_ASCII; /* UCGetLYhndl_byMIME("us-ascii") */
+ extern int UTF8_handle; /* UCGetLYhndl_byMIME("utf-8") */
+
+#undef TRANSPARENT /* defined on Solaris in <sys/stream.h> */
+ extern int TRANSPARENT; /* UCGetLYhndl_byMIME("x-transparent") */
+
+/*
+In general, Lynx translates letters from document charset to display charset.
+If document charset is not specified or not recognized by Lynx, we fall back
+to different assumptions below, read also lynx.cfg for info.
+
+UCLYhndl_for_unspec - assume this as charset for documents that don't
+ specify a charset parameter in HTTP headers or via META
+ this corresponds to "assume_charset"
+
+UCLYhndl_HTFile_for_unspec - assume this as charset of local file
+ this corresponds to "assume_local_charset"
+
+UCLYhndl_for_unrec - in case a charset parameter is not recognized;
+ this corresponds to "assume_unrec_charset"
+
+UCLYhndl_HTFile_for_unrec - the same but only for local files,
+ currently not used.
+
+current_char_set - this corresponds to "display charset",
+ declared in LYCharSets.c and really important.
+
+All external charset information is available in so called MIME format.
+For internal needs Lynx uses charset handlers as integers
+from UCGetLYhndl_byMIME(). However, there is no way to recover
+from user's error in configuration file lynx.cfg or command line switches,
+those unrecognized MIME names are assumed as LATIN1 (via safeUCGetLYhndl...).
+*/
+
+#define UCTRANS_NOTFOUND (-4)
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* UCMAP_H */
diff --git a/WWW/Library/Implementation/Version.make b/WWW/Library/Implementation/Version.make
new file mode 100644
index 0000000..4b4b380
--- /dev/null
+++ b/WWW/Library/Implementation/Version.make
@@ -0,0 +1 @@
+VC = 2.14
diff --git a/WWW/Library/Implementation/dtd_util.c b/WWW/Library/Implementation/dtd_util.c
new file mode 100644
index 0000000..cf88998
--- /dev/null
+++ b/WWW/Library/Implementation/dtd_util.c
@@ -0,0 +1,1722 @@
+/*
+ * $LynxId: dtd_util.c,v 1.89 2022/09/29 23:51:16 tom Exp $
+ *
+ * Given a SGML_dtd structure, write a corresponding flat file, or "C" source.
+ * Given the flat-file, write the "C" source.
+ *
+ * TODO: use symbols for HTMLA_NORMAL, etc.
+ */
+
+#include <HTUtils.h>
+#include <HTMLDTD.h>
+#include <string.h>
+#include <stdarg.h>
+
+/*
+ * Tweaks to build standalone.
+ */
+#undef exit
+
+BOOLEAN WWW_TraceFlag = FALSE;
+FILE *TraceFP(void)
+{
+ return stderr;
+}
+
+/*
+ * Begin the actual utility.
+ */
+#define GETOPT "chl:o:tsx"
+
+#define NOTE(message) fprintf(output, message "\n");
+/* *INDENT-OFF* */
+#ifdef USE_PRETTYSRC
+# define N HTMLA_NORMAL
+# define i HTMLA_ANAME
+# define h HTMLA_HREF
+# define c HTMLA_CLASS
+# define x HTMLA_AUXCLASS
+# define T(t) , t
+#else
+# define T(t) /*nothing */
+#endif
+
+#define ATTR_TYPE(name) { #name, name##_attr_list }
+
+#define MY_LIMIT 1024
+#define FMT_WS "%[ \t\n]"
+#define FMT_NUM_ATTR_TYPES "%d attr_types"
+#define FMT_NUM_ATTRS "%d attributes:"
+#define FMT_ONE_ATTR "%d:%d:%s"
+#define NUM_ONE_ATTR 4
+
+static const char alias_codes[] = "!@#$%^&*";
+
+#define DATA(name) { #name, Tgc_##name }
+static const struct {
+ const char *name;
+ TagClass tagclass;
+} class_list[] = {
+ DATA(APPLETlike),
+ DATA(Alike),
+ DATA(BODYlike),
+ DATA(BRlike),
+ DATA(DELlike),
+ DATA(DIVlike),
+ DATA(EMlike),
+ DATA(FONTlike),
+ DATA(FORMlike),
+ DATA(HEADstuff),
+ DATA(HRlike),
+ DATA(LIlike),
+ DATA(MAPlike),
+ DATA(MATHlike),
+ DATA(Plike),
+ DATA(SELECTlike),
+ DATA(TRlike),
+ DATA(ULlike),
+ DATA(formula),
+ DATA(outer),
+ DATA(same)
+};
+
+static const attr core_attr_list[] = {
+ { "CLASS" T(c) },
+ { "ID" T(i) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr i18n_attr_list[] = {
+ { "DIR" T(N) },
+ { "LANG" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr events_attr_list[] = {
+ { "ONCLICK" T(N) },
+ { "ONDBLCLICK" T(N) },
+ { "ONKEYDOWN" T(N) },
+ { "ONKEYPRESS" T(N) },
+ { "ONKEYUP" T(N) },
+ { "ONMOUSEDOWN" T(N) },
+ { "ONMOUSEMOVE" T(N) },
+ { "ONMOUSEOUT" T(N) },
+ { "ONMOUSEOVER" T(N) },
+ { "ONMOUSEUP" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr align_attr_list[] = {
+ { "ALIGN" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr cellalign_attr_list[] = {
+ { "ALIGN" T(N) },
+ { "CHAR" T(N) },
+ { "CHAROFF" T(N) },
+ { "VALIGN" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr bgcolor_attr_list[] = {
+ { "BGCOLOR" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+#undef T
+/* *INDENT-ON* */
+
+static const char *input_filename;
+static int input_lineno;
+
+static void failed(const char *s)
+{
+ if (input_lineno) {
+ int save = errno;
+
+ fprintf(stderr, "%s:%d ", input_filename, input_lineno);
+ errno = save;
+ }
+ perror(s);
+ exit(EXIT_FAILURE);
+}
+
+static void warning(const char *, ...) GCC_PRINTFLIKE(1, 2);
+
+static void warning(const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ fprintf(stderr, "%s:%d: ", input_filename, input_lineno);
+ vfprintf(stderr, fmt, ap);
+ fputc('\n', stderr);
+ va_end(ap);
+}
+
+static void usage(void)
+{
+ static const char *tbl[] =
+ {
+ "Usage: dtd_util [options]",
+ "",
+ "Options:",
+ " -c generate C-source"
+ " -h generate C-header"
+ " -l load",
+ " -o filename specify output (default: stdout)",
+ " -s strict (HTML DTD 0)",
+ " -t tagsoup (HTML DTD 1)",
+ " -x cross-check contains/contained data (repeat for more)"
+ };
+ unsigned n;
+
+ for (n = 0; n < TABLESIZE(tbl); ++n) {
+ fprintf(stderr, "%s\n", tbl[n]);
+ }
+ exit(EXIT_FAILURE);
+}
+
+static const char *SGMLContent2s(SGMLContent contents)
+{
+ char *value = "?";
+
+ switch (contents) {
+ case SGML_EMPTY:
+ value = "SGML_EMPTY";
+ break;
+ case SGML_LITTERAL:
+ value = "SGML_LITTERAL";
+ break;
+ case SGML_CDATA:
+ value = "SGML_CDATA";
+ break;
+ case SGML_SCRIPT:
+ value = "SGML_SCRIPT";
+ break;
+ case SGML_RCDATA:
+ value = "SGML_RCDATA";
+ break;
+ case SGML_MIXED:
+ value = "SGML_MIXED";
+ break;
+ case SGML_ELEMENT:
+ value = "SGML_ELEMENT";
+ break;
+ case SGML_PCDATA:
+ value = "SGML_PCDATA";
+ break;
+ }
+ return value;
+}
+
+static SGMLContent s2SGMLContent(const char *value)
+{
+ static SGMLContent table[] =
+ {
+ SGML_EMPTY,
+ SGML_LITTERAL,
+ SGML_CDATA,
+ SGML_SCRIPT,
+ SGML_RCDATA,
+ SGML_MIXED,
+ SGML_ELEMENT,
+ SGML_PCDATA
+ };
+ unsigned n;
+ SGMLContent result = SGML_EMPTY;
+
+ for (n = 0; n < TABLESIZE(table); ++n) {
+ if (!strcmp(SGMLContent2s(table[n]), value)) {
+ result = table[n];
+ break;
+ }
+ }
+ return result;
+}
+
+static void PrintF(FILE *, int, const char *, ...) GCC_PRINTFLIKE(3, 4);
+
+static void PrintF(FILE *output, int width, const char *fmt, ...)
+{
+ char buffer[BUFSIZ];
+ va_list ap;
+
+ va_start(ap, fmt);
+ vsprintf(buffer, fmt, ap);
+ va_end(ap);
+
+ fprintf(output, "%-*s", width, buffer);
+}
+
+static char *get_line(FILE *input)
+{
+ char temp[MY_LIMIT];
+ char *result = 0;
+
+ if (fgets(temp, (int) sizeof(temp), input) != 0) {
+ result = strdup(temp);
+ ++input_lineno;
+ }
+ return result;
+}
+
+static int read_num_attr_types(FILE *input)
+{
+ char *next = get_line(input);
+ int count;
+ int code;
+ char trail[MY_LIMIT];
+
+ if (next == 0
+ || (code = sscanf(next, FMT_NUM_ATTR_TYPES FMT_WS, &count, trail)) < 2
+ || !count) {
+ warning("expected attr_types");
+ }
+ return count;
+}
+
+static int same_AttrList(AttrList a, AttrList b)
+{
+ int result = 1;
+
+ if (a && b) {
+ while (a->name && b->name) {
+ if (strcmp(a->name, b->name)) {
+ result = 0;
+ break;
+ }
+ ++a, ++b;
+ }
+ if (a->name || b->name)
+ result = 0;
+ } else {
+ result = 0;
+ }
+ return result;
+}
+
+static int first_attrs(const SGML_dtd * dtd, int which)
+{
+ int check;
+ int result = TRUE;
+
+ for (check = 0; check < which; ++check) {
+ if (dtd->tags[check].attributes == dtd->tags[which].attributes) {
+ result = FALSE;
+ break;
+ } else if (same_AttrList(dtd->tags[check].attributes,
+ dtd->tags[which].attributes)) {
+ result = FALSE;
+ dtd->tags[which].attributes = dtd->tags[check].attributes;
+ break;
+ }
+ }
+ return result;
+}
+
+static char *no_dashes(char *target, const char *source)
+{
+ int j;
+
+ for (j = 0; (target[j] = source[j]) != '\0'; ++j) {
+ if (!isalnum(target[j]))
+ target[j] = '_';
+ }
+ return target;
+}
+
+/* the second "OBJECT" is treated specially */
+static int first_object(const SGML_dtd * dtd, int which)
+{
+ int check;
+
+ for (check = 0; check <= which; ++check) {
+ if (!strcmp(dtd->tags[check].name, "OBJECT"))
+ break;
+ }
+ return (check == which);
+}
+
+static const char *NameOfAttrs(const SGML_dtd * dtd, int which)
+{
+ int check;
+ const char *result = dtd->tags[which].name;
+
+ for (check = 0; check < which; ++check) {
+ if (dtd->tags[check].attributes == dtd->tags[which].attributes) {
+ result = dtd->tags[check].name;
+ break;
+ }
+ }
+ /* special cases to match existing headers */
+ if (!strcmp(result, "ABBR"))
+ result = "GEN";
+ else if (!strcmp(result, "ARTICLE"))
+ result = "GEN5";
+ else if (!strcmp(result, "BLOCKQUOTE"))
+ result = "BQ";
+ else if (!strcmp(result, "BASEFONT"))
+ result = "FONT";
+ else if (!strcmp(result, "CENTER"))
+ result = "DIV";
+ else if (!strcmp(result, "DIR"))
+ result = "UL";
+ else if (!strcmp(result, "H1"))
+ result = "H";
+ else if (!strcmp(result, "TBODY"))
+ result = "TR";
+ return result;
+}
+
+static const char *DEF_name(const SGML_dtd * dtd, int which, unsigned alias)
+{
+ const char *result = dtd->tags[which].name;
+
+ if (!strcmp(result, "OBJECT") && !first_object(dtd, which)) {
+ result = "OBJECT_PCDATA";
+ } else if (alias) {
+ char buffer[MY_LIMIT];
+
+ sprintf(buffer, "%s_%d", result, alias + 1);
+ result = strdup(buffer);
+ }
+ return result;
+}
+
+static const char *EXT_name(HTTag * tag)
+{
+ const char *result = tag->name;
+
+ if (tag->alias) {
+ char buffer[MY_LIMIT];
+
+ sprintf(buffer, "%s%c", result, alias_codes[tag->alias - 1]);
+ result = strdup(buffer);
+ }
+ return result;
+}
+
+typedef struct {
+ const char *name;
+ const attr *attrs;
+ int count;
+ int which;
+} AttrInfo;
+
+static int compare_attr_types(const void *a, const void *b)
+{
+ const AttrType *p = (const AttrType *) a;
+ const AttrType *q = (const AttrType *) b;
+ int result = 0;
+
+ /* keep lowercase AttrType lists before uppercase, since latter are derived */
+ if (isupper(p->name[0]) ^ isupper(q->name[0])) {
+ if (isupper(p->name[0])) {
+ result = 1;
+ } else {
+ result = -1;
+ }
+ } else {
+ result = strcmp(p->name, q->name);
+ }
+ return result;
+}
+
+static int len_AttrTypes(const AttrType * data)
+{
+ int result = 0;
+
+ for (result = 0; data[result].name != 0; ++result) {
+ ;
+ }
+ return result;
+}
+
+static AttrType *sorted_AttrTypes(const AttrType * source)
+{
+ AttrType *result = 0;
+ unsigned number = len_AttrTypes(source);
+
+ if (number != 0) {
+ result = typecallocn(AttrType, number + 1);
+ if (result != 0) {
+ MemCpy(result, source, number * sizeof(*result));
+ qsort(result, number, sizeof(*result), compare_attr_types);
+ }
+ }
+
+ return result;
+}
+
+static int compare_attr(const void *a, const void *b)
+{
+ const AttrInfo *p = (const AttrInfo *) a;
+ const AttrInfo *q = (const AttrInfo *) b;
+
+ return strcmp(p->name, q->name);
+}
+
+static int len_AttrList(AttrList data)
+{
+ int result = 0;
+
+ for (result = 0; data[result].name != 0; ++result) {
+ ;
+ }
+ return result;
+}
+
+static void sort_uniq_AttrList(attr * data)
+{
+ unsigned have = len_AttrList(data);
+ unsigned j, k;
+
+ qsort(data, have, sizeof(*data), compare_attr);
+ /*
+ * Eliminate duplicates
+ */
+ for (j = 0; j < have; ++j) {
+ for (k = j; data[k].name; ++k) {
+ if (data[k + 1].name == 0)
+ break;
+ if (strcmp(data[j].name, data[k + 1].name)) {
+ break;
+ }
+ }
+ data[j] = data[k];
+ }
+ memset(data + j, 0, sizeof(data[0]));
+}
+
+static attr *copy_AttrList(AttrList data)
+{
+ unsigned need = len_AttrList(data);
+ unsigned n;
+
+ attr *result = (attr *) calloc(need + 1, sizeof(attr));
+
+ for (n = 0; n < need; ++n)
+ result[n] = data[n];
+ sort_uniq_AttrList(result);
+ return result;
+}
+
+static attr *merge_AttrLists(const AttrType * data)
+{
+ const AttrType *at;
+ attr *result = 0;
+ unsigned need = 1;
+ unsigned have = 0;
+ unsigned j;
+
+ for (at = data; at->name; ++at) {
+ need += len_AttrList(at->list);
+ }
+ result = (attr *) calloc(need + 1, sizeof(attr));
+ for (at = data; at->name; ++at) {
+ if (!strcmp(at->name, "events")) {
+ ; /* lynx does not use events */
+ } else {
+ for (j = 0; at->list[j].name; ++j) {
+ result[have++] = at->list[j];
+ }
+ }
+ }
+ sort_uniq_AttrList(result);
+ return result;
+}
+
+static int clean_AttrList(attr * target, AttrList source)
+{
+ int result = 0;
+ int j, k;
+
+ for (j = 0; target[j].name != 0; ++j) {
+ for (k = 0; source[k].name != 0; ++k) {
+ if (!strcmp(target[j].name, source[k].name)) {
+ k = j--;
+ for (;;) {
+ target[k] = target[k + 1];
+ if (target[k++].name == 0)
+ break;
+ }
+ ++result;
+ break;
+ }
+ }
+ }
+ return result;
+}
+
+/*
+ * Actually COUNT the number of attributes, to make it possible to edit a
+ * attribute-table in src0_HTMLDTD.h and have all of the files updated by
+ * just doing a "make sources".
+ */
+static int AttrCount(HTTag * tag)
+{
+ return len_AttrList(tag->attributes);
+}
+
+static AttrInfo *sorted_attrs(const SGML_dtd * dtd, unsigned *countp)
+{
+ int j;
+
+ AttrInfo *data = (AttrInfo *) calloc(dtd->number_of_tags, sizeof(AttrInfo));
+ unsigned count = 0;
+
+ /* get the attribute-data */
+ for (j = 0; j < dtd->number_of_tags; ++j) {
+ if (first_attrs(dtd, j)) {
+ data[count].name = NameOfAttrs(dtd, j);
+ data[count].attrs = dtd->tags[j].attributes;
+ data[count].count = AttrCount(&(dtd->tags[j]));
+ data[count].which = j;
+ ++count;
+ }
+ }
+ /* sort the data by the name of their associated tag */
+ qsort(data, count, sizeof(*data), compare_attr);
+ *countp = count;
+ return data;
+}
+
+static void dump_src_HTTag_Defines(FILE *output, const SGML_dtd * dtd, int which)
+{
+ HTTag *tag = &(dtd->tags[which]);
+
+#define myFMT "0x%05X"
+ fprintf(output,
+ "#define T_%-13s "
+ myFMT "," myFMT "," myFMT "," myFMT "," myFMT "," myFMT
+ "," myFMT "\n",
+ DEF_name(dtd, which, tag->alias),
+ tag->tagclass,
+ tag->contains,
+ tag->icontains,
+ tag->contained,
+ tag->icontained,
+ tag->canclose,
+ tag->flags);
+}
+
+static void dump_AttrItem(FILE *output, const attr * data)
+{
+ char buffer[BUFSIZ];
+ char pretty = 'N';
+
+ sprintf(buffer, "\"%s\"", data->name);
+#ifdef USE_PRETTYSRC
+ switch (data->type) {
+ case HTMLA_NORMAL:
+ pretty = 'N';
+ break;
+ case HTMLA_ANAME:
+ pretty = 'i';
+ break;
+ case HTMLA_HREF:
+ pretty = 'h';
+ break;
+ case HTMLA_CLASS:
+ pretty = 'c';
+ break;
+ case HTMLA_AUXCLASS:
+ pretty = 'x';
+ break;
+ }
+#endif
+ fprintf(output, "\t{ %-15s T(%c) },\n", buffer, pretty);
+}
+
+static void dump_AttrItem0(FILE *output)
+{
+ fprintf(output, "\t{ 0 T(N) }\t/* Terminate list */\n");
+}
+
+static void dump_src_AttrType(FILE *output, const char *name, AttrList data, const char **from)
+{
+ int n;
+
+ fprintf(output, "static const attr %s_attr_list[] = {\n", name);
+ if (data != 0) {
+ for (n = 0; data[n].name != 0; ++n) {
+ dump_AttrItem(output, data + n);
+ }
+ }
+ fprintf(output, "\t{ 0 T(N) } /* Terminate list */\n");
+ fprintf(output, "};\n");
+ NOTE("");
+ fprintf(output, "static const AttrType %s_attr_type[] = {\n", name);
+ if (from != 0) {
+ while (*from != 0) {
+ fprintf(output, "\t{ ATTR_TYPE(%s) },\n", *from);
+ ++from;
+ }
+ } else {
+ fprintf(output, "\t{ ATTR_TYPE(%s) },\n", name);
+ }
+ fprintf(output, "\t{ 0, 0 },\n");
+ fprintf(output, "};\n");
+ NOTE("");
+}
+
+static void dump_src_HTTag_Attrs(FILE *output, const SGML_dtd * dtd, int which)
+{
+ HTTag *tag = &(dtd->tags[which]);
+ attr *list = merge_AttrLists(tag->attr_types);
+ char buffer[BUFSIZ];
+ int n;
+ int limit = len_AttrList(list);
+
+ sprintf(buffer, "static const attr %s_attr[] = {", NameOfAttrs(dtd, which));
+ fprintf(output,
+ "%-40s/* %s attributes */\n", buffer, tag->name);
+ for (n = 0; n < limit; ++n) {
+ dump_AttrItem(output, list + n);
+ }
+ dump_AttrItem0(output);
+ fprintf(output, "};\n");
+ NOTE("");
+ free(list);
+}
+
+static void dump_src_HTTag(FILE *output, const SGML_dtd * dtd, int which)
+{
+ HTTag *tag = &(dtd->tags[which]);
+ char *P_macro = "P";
+
+#ifdef USE_JUSTIFY_ELTS
+ if (!tag->can_justify)
+ P_macro = "P0";
+#endif
+ PrintF(output, 19, " { %s(%s),", P_macro, tag->name);
+ PrintF(output, 24, "ATTR_DATA(%s), ", NameOfAttrs(dtd, which));
+ PrintF(output, 14, "%s,", SGMLContent2s(tag->contents));
+ fprintf(output, "T_%s", DEF_name(dtd, which, tag->alias));
+ fprintf(output, ", %d", tag->alias);
+ fprintf(output, ", %d", tag->aliases);
+ fprintf(output, "},\n");
+}
+
+static void dump_source(FILE *output, const SGML_dtd * dtd, int dtd_version)
+{
+ static AttrType generic_types[] =
+ {
+ ATTR_TYPE(core),
+ ATTR_TYPE(i18n),
+ ATTR_TYPE(events),
+ ATTR_TYPE(align),
+ ATTR_TYPE(cellalign),
+ ATTR_TYPE(bgcolor),
+ {0, 0}
+ };
+ AttrType *gt;
+ TagAlias aliases;
+
+ const char *marker = "src_HTMLDTD_H";
+ int j;
+ int inalias;
+
+ unsigned count = 0;
+ AttrInfo *data = sorted_attrs(dtd, &count);
+
+ fprintf(output, "/* %cLynxId%c */\n", '$', '$');
+ fprintf(output, "#ifndef %s%d\n", marker, dtd_version);
+ fprintf(output, "#define %s%d 1\n\n", marker, dtd_version);
+
+ /*
+ * If we ifdef this for once, and make the table names distinct, we can
+ * #include the strict- and tagsoup-output directly in HTMLDTD.c
+ */
+ NOTE("#ifndef once_HTMLDTD");
+ NOTE("#define once_HTMLDTD 1");
+ NOTE("");
+
+ /* construct TagClass-define's */
+ for (j = 0; j <= dtd->number_of_tags; ++j) {
+ dump_src_HTTag_Defines(output, dtd, j);
+ }
+ NOTE("#define T__UNREC_ 0x00000,0x00000,0x00000,0x00000,0x00000,0x00000,0x00000");
+
+ /* construct attribute-tables */
+ NOTE("#ifdef USE_PRETTYSRC");
+ NOTE("# define N HTMLA_NORMAL");
+ NOTE("# define i HTMLA_ANAME");
+ NOTE("# define h HTMLA_HREF");
+ NOTE("# define c HTMLA_CLASS");
+ NOTE("# define x HTMLA_AUXCLASS");
+ NOTE("# define T(t) , t");
+ NOTE("#else");
+ NOTE("# define T(t) /*nothing */");
+ NOTE("#endif");
+ NOTE("/* *INDENT-OFF* */");
+ NOTE("");
+ NOTE("#define ATTR_TYPE(name) #name, name##_attr_list");
+ NOTE("");
+ NOTE("/* generic attributes, used in different tags */");
+ for (gt = generic_types; gt->name != 0; ++gt) {
+ dump_src_AttrType(output, gt->name, gt->list, 0);
+ }
+ NOTE("");
+ NOTE("/* tables defining attributes per-tag in terms of generic attributes (editable) */");
+ for (j = 0; j < (int) count; ++j) {
+ int which = data[j].which;
+
+ if (first_attrs(dtd, which)) {
+ HTTag *tag = &(dtd->tags[which]);
+ const AttrType *types = tag->attr_types;
+ const char *name = NameOfAttrs(dtd, which);
+ attr *list = 0;
+ const char *from_attr[10];
+ int from_size = 0;
+
+ while (types->name != 0) {
+ from_attr[from_size++] = types->name;
+ if (!strcmp(types->name, name)) {
+ list = copy_AttrList(types->list);
+ for (gt = generic_types; gt->name != 0; ++gt) {
+ if (clean_AttrList(list, gt->list)) {
+ int k;
+ int found = 0;
+
+ for (k = 0; k < from_size; ++k) {
+ if (!strcmp(from_attr[k], gt->name)) {
+ found = 1;
+ break;
+ }
+ }
+ if (!found)
+ from_attr[from_size++] = gt->name;
+ break;
+ }
+ }
+ }
+ ++types;
+ }
+ from_attr[from_size] = 0;
+
+ if (list != 0) {
+ /* FIXME check if each remaining attribute is defined in XXX */
+
+ dump_src_AttrType(output, name, list, from_attr);
+ free(list);
+ }
+ }
+ }
+ NOTE("");
+ NOTE("/* attribute lists for the runtime (generated by dtd_util) */");
+ for (j = 0; j < (int) count; ++j) {
+ dump_src_HTTag_Attrs(output, dtd, data[j].which);
+ }
+ NOTE("/* *INDENT-ON* */");
+ NOTE("");
+ NOTE("/* justification-flags */");
+ NOTE("#undef N");
+ NOTE("#undef i");
+ NOTE("#undef h");
+ NOTE("#undef c");
+ NOTE("#undef x");
+ NOTE("");
+ NOTE("#undef T");
+ NOTE("");
+ NOTE("/* tag-names */");
+ /* these may be needed as parameters to macros */
+ for (j = 0; j <= dtd->number_of_tags; ++j) {
+ fprintf(output, "#undef %s\n", DEF_name(dtd, j, 0));
+ }
+ NOTE("");
+ NOTE("/* these definitions are used in the tags-tables */");
+ NOTE("#undef P");
+ NOTE("#undef P_");
+ NOTE("#ifdef USE_COLOR_STYLE");
+ NOTE("#define P_(x) #x, (sizeof #x) -1");
+ NOTE("#define NULL_HTTag_ NULL, 0");
+ NOTE("#else");
+ NOTE("#define P_(x) #x");
+ NOTE("#define NULL_HTTag_ NULL");
+ NOTE("#endif");
+ NOTE("");
+ NOTE("#ifdef USE_JUSTIFY_ELTS");
+ NOTE("#define P(x) P_(x), 1");
+ NOTE("#define P0(x) P_(x), 0");
+ NOTE("#define NULL_HTTag NULL_HTTag_,0");
+ NOTE("#else");
+ NOTE("#define P(x) P_(x)");
+ NOTE("#define P0(x) P_(x)");
+ NOTE("#define NULL_HTTag NULL_HTTag_");
+ NOTE("#endif");
+ NOTE("");
+ NOTE("#define ATTR_DATA(name) name##_attr, HTML_##name##_ATTRIBUTES, name##_attr_type");
+ NOTE("");
+ NOTE("#endif /* once_HTMLDTD */");
+ NOTE("/* *INDENT-OFF* */");
+
+ /* construct the tags table */
+ fprintf(output,
+ "static const HTTag tags_table%d[HTML_ALL_ELEMENTS] = {\n",
+ dtd_version);
+ aliases = 0;
+ inalias = -1;
+ for (j = dtd->number_of_tags - 1; j >= 0; --j) {
+ dtd->tags[j].aliases = aliases;
+ if (aliases != 0) {
+ if ((inalias - aliases) >= j) {
+ aliases = 0;
+ inalias = -1;
+ }
+ } else if ((aliases = dtd->tags[j].alias) != 0) {
+ inalias = j;
+ dtd->tags[j].aliases = aliases;
+ }
+ }
+ for (j = 0; j <= dtd->number_of_tags; ++j) {
+ if (j == dtd->number_of_tags) {
+ NOTE("/* additional (alternative variants), not counted in HTML_ELEMENTS: */");
+ NOTE("/* This one will be used as a temporary substitute within the parser when");
+ NOTE(" it has been signalled to parse OBJECT content as MIXED. - kw */");
+ }
+ dump_src_HTTag(output, dtd, j);
+ }
+ fprintf(output, "};\n");
+
+ NOTE("/* *INDENT-ON* */");
+ NOTE("");
+ fprintf(output, "#endif /* %s%d */\n", marker, dtd_version);
+
+ free(data);
+}
+
+static void dump_hdr_attr(FILE *output, AttrInfo * data)
+{
+ int j;
+ char buffer[BUFSIZ];
+
+ for (j = 0; j < data->count; ++j) {
+ PrintF(output, 33, "#define HTML_%s_%s",
+ data->name,
+ no_dashes(buffer, data->attrs[j].name));
+ fprintf(output, "%2d\n", j);
+ }
+ PrintF(output, 33, "#define HTML_%s_ATTRIBUTES", data->name);
+ fprintf(output, "%2d\n", data->count);
+ fprintf(output, "\n");
+}
+
+static void dump_header(FILE *output, const SGML_dtd * dtd)
+{
+ const char *marker = "hdr_HTMLDTD_H";
+ int j;
+
+ unsigned count = 0;
+ AttrInfo *data = sorted_attrs(dtd, &count);
+
+ fprintf(output, "/* %cLynxId%c */\n", '$', '$');
+ fprintf(output, "#ifndef %s\n", marker);
+ fprintf(output, "#define %s 1\n\n", marker);
+
+ NOTE("#ifdef __cplusplus");
+ NOTE("extern \"C\" {");
+ NOTE("#endif");
+
+ NOTE("/*");
+ NOTE("");
+ NOTE(" Element Numbers");
+ NOTE("");
+ NOTE(" Must Match all tables by element!");
+ NOTE(" These include tables in HTMLDTD.c");
+ NOTE(" and code in HTML.c.");
+ NOTE("");
+ NOTE(" */");
+
+ fprintf(output, " typedef enum {\n");
+ for (j = 0; j < dtd->number_of_tags; ++j) {
+ if (dtd->tags[j].alias) {
+ fprintf(output, "\tHTML_%s_%d,\n", dtd->tags[j].name,
+ dtd->tags[j].alias + 1);
+ } else {
+ fprintf(output, "\tHTML_%s,\n", dtd->tags[j].name);
+ }
+ }
+ NOTE("\tHTML_ALT_OBJECT");
+ NOTE(" } HTMLElement;\n");
+ NOTE("/* Notes: HTML.c uses a different extension of the");
+ NOTE(" HTML_ELEMENTS space privately, see");
+ NOTE(" HTNestedList.h.");
+ NOTE("");
+ NOTE(" Do NOT replace HTML_ELEMENTS with");
+ NOTE(" TABLESIZE(mumble_dtd.tags).");
+ NOTE("");
+ NOTE(" Keep the following defines in synch with");
+ NOTE(" the above enum!");
+ NOTE(" */");
+ NOTE("");
+ NOTE("/* # of elements generally visible to Lynx code */");
+ fprintf(output, "#define HTML_ELEMENTS %d\n", dtd->number_of_tags);
+ NOTE("");
+ NOTE("/* # of elements visible to SGML parser */");
+ fprintf(output, "#define HTML_ALL_ELEMENTS %d\n", dtd->number_of_tags + 1);
+ NOTE("");
+ NOTE("/*");
+ NOTE("");
+ NOTE(" Attribute numbers");
+ NOTE("");
+ NOTE(" Identifier is HTML_<element>_<attribute>.");
+ NOTE(" These must match the tables in HTML.c!");
+ NOTE("");
+ NOTE(" */");
+
+ /* output the sorted list */
+ for (j = 0; j < (int) count; ++j) {
+ dump_hdr_attr(output, data + j);
+ }
+ free(data);
+
+ NOTE("#ifdef __cplusplus");
+ NOTE("}");
+ NOTE("#endif");
+
+ fprintf(output, "#endif\t\t\t\t/* %s */\n", marker);
+}
+
+static void dump_flat_attrs(FILE *output,
+ const attr * attributes,
+ int number_of_attributes)
+{
+ int n;
+
+ fprintf(output, "\t\t" FMT_NUM_ATTRS "\n", number_of_attributes);
+ for (n = 0; n < number_of_attributes; ++n) {
+ fprintf(output, "\t\t\t" FMT_ONE_ATTR "\n", n,
+#ifdef USE_PRETTYSRC
+ attributes[n].type,
+#else
+ 0, /* need placeholder for source-compat */
+#endif
+ attributes[n].name
+ );
+ }
+}
+
+static void dump_flat_attr_types(FILE *output, const AttrType * attr_types)
+{
+ const AttrType *p = sorted_AttrTypes(attr_types);
+ int number = len_AttrTypes(attr_types);
+
+ fprintf(output, "\t\t" FMT_NUM_ATTR_TYPES "\n", number);
+
+ if (p != 0) {
+ while (p->name != 0) {
+ fprintf(output, "\t\t\t%s\n", p->name);
+ ++p;
+ }
+ }
+}
+
+static void dump_flat_SGMLContent(FILE *output, const char *name, SGMLContent contents)
+{
+ fprintf(output, "\t\t%s: %s\n", name, SGMLContent2s(contents));
+}
+
+#define DUMP(name) \
+ if (theClass & Tgc_##name) {\
+ fprintf(output, " " #name); \
+ theClass &= ~(Tgc_##name); \
+ }
+
+static void dump_flat_TagClass(FILE *output, const char *name, TagClass theClass)
+{
+ fprintf(output, "\t\t%s:", name);
+ DUMP(FONTlike);
+ DUMP(EMlike);
+ DUMP(MATHlike);
+ DUMP(Alike);
+ DUMP(formula);
+ DUMP(TRlike);
+ DUMP(SELECTlike);
+ DUMP(FORMlike);
+ DUMP(Plike);
+ DUMP(DIVlike);
+ DUMP(LIlike);
+ DUMP(ULlike);
+ DUMP(BRlike);
+ DUMP(APPLETlike);
+ DUMP(HRlike);
+ DUMP(MAPlike);
+ DUMP(outer);
+ DUMP(BODYlike);
+ DUMP(HEADstuff);
+ DUMP(same);
+ DUMP(DELlike);
+ if (theClass)
+ fprintf(output, " OOPS:%#x", theClass);
+ fprintf(output, "\n");
+}
+
+#undef DUMP
+
+#define DUMP(name) \
+ if (theFlags & Tgf_##name) {\
+ fprintf(output, " " #name); \
+ theFlags &= ~(Tgf_##name); \
+ }
+
+static void dump_flat_TagFlags(FILE *output, const char *name, TagFlags theFlags)
+{
+ fprintf(output, "\t\t%s:", name);
+ DUMP(endO);
+ DUMP(startO);
+ DUMP(mafse);
+ DUMP(strict);
+ DUMP(nreie);
+ DUMP(frecyc);
+ DUMP(nolyspcl);
+ if (theFlags)
+ fprintf(output, " OOPS:%#x", theFlags);
+ fprintf(output, "\n");
+}
+
+#undef DUMP
+
+static void dump_flat_HTTag(FILE *output, unsigned n, HTTag * tag)
+{
+ fprintf(output, "\t%u:%s\n", n, EXT_name(tag));
+#ifdef USE_JUSTIFY_ELTS
+ fprintf(output, "\t\t%s\n", tag->can_justify ? "justify" : "nojustify");
+#endif
+ dump_flat_attrs(output, tag->attributes, AttrCount(tag));
+ dump_flat_attr_types(output, tag->attr_types);
+ dump_flat_SGMLContent(output, "contents", tag->contents);
+ dump_flat_TagClass(output, "tagclass", tag->tagclass);
+ dump_flat_TagClass(output, "contains", tag->contains);
+ dump_flat_TagClass(output, "icontains", tag->icontains);
+ dump_flat_TagClass(output, "contained", tag->contained);
+ dump_flat_TagClass(output, "icontained", tag->icontained);
+ dump_flat_TagClass(output, "canclose", tag->canclose);
+ dump_flat_TagFlags(output, "flags", tag->flags);
+}
+
+static int count_attr_types(AttrType * attr_types, HTTag * tag)
+{
+ int count = 0;
+ const AttrType *p;
+ AttrType *q;
+
+ if ((p = tag->attr_types) != 0) {
+ while (p->name != 0) {
+ if ((q = attr_types) != 0) {
+ while (q->name != 0) {
+ if (!strcmp(q->name, p->name)) {
+ --count;
+ break;
+ }
+ ++q;
+ }
+ *q = *p;
+ }
+ ++count;
+ ++p;
+ }
+ }
+ return count;
+}
+
+static void dump_flatfile(FILE *output, const SGML_dtd * dtd)
+{
+ AttrType *attr_types = 0;
+ int pass;
+ unsigned count = 0;
+ unsigned n;
+
+ /* merge all of the attr_types data */
+ for (pass = 0; pass < 2; ++pass) {
+ for (n = 0; (int) n < dtd->number_of_tags; ++n) {
+ count += count_attr_types(attr_types, &(dtd->tags[n]));
+ }
+ if (pass == 0) {
+ attr_types = typecallocn(AttrType, count + 1);
+ count = 0;
+ } else {
+ count = len_AttrTypes(attr_types);
+ qsort(attr_types, count, sizeof(*attr_types), compare_attr_types);
+ fprintf(output, FMT_NUM_ATTR_TYPES "\n", count);
+ for (n = 0; n < count; ++n) {
+ fprintf(output, "\t%d:%s\n", n, attr_types[n].name);
+ dump_flat_attrs(output, attr_types[n].list,
+ len_AttrList(attr_types[n].list));
+ }
+ }
+ }
+
+ fprintf(output, "%d tags\n", dtd->number_of_tags);
+ for (n = 0; (int) n < dtd->number_of_tags; ++n) {
+ dump_flat_HTTag(output, n, &(dtd->tags[n]));
+ }
+#if 0
+ fprintf(output, "%d entities\n", dtd->number_of_entities);
+ for (n = 0; n < dtd->number_of_entities; ++n) {
+ }
+#endif
+}
+
+#define LOAD(name) \
+ if (!strcmp(data, #name)) {\
+ *theClass |= Tgc_##name; \
+ continue; \
+ }
+
+static int load_flat_TagClass(FILE *input, const char *name, TagClass * theClass)
+{
+ char prefix[80];
+ char *next = get_line(input);
+ char *data;
+ int result = 0;
+
+ *theClass = 0;
+ if (next != 0) {
+ sprintf(prefix, "\t\t%s:", name);
+ data = strtok(next, "\n ");
+
+ if (data != 0 && !strcmp(data, prefix)) {
+ result = 1;
+
+ while ((data = strtok(NULL, "\n ")) != 0) {
+
+ LOAD(FONTlike);
+ LOAD(EMlike);
+ LOAD(MATHlike);
+ LOAD(Alike);
+ LOAD(formula);
+ LOAD(TRlike);
+ LOAD(SELECTlike);
+ LOAD(FORMlike);
+ LOAD(Plike);
+ LOAD(DIVlike);
+ LOAD(LIlike);
+ LOAD(ULlike);
+ LOAD(BRlike);
+ LOAD(APPLETlike);
+ LOAD(HRlike);
+ LOAD(MAPlike);
+ LOAD(outer);
+ LOAD(BODYlike);
+ LOAD(HEADstuff);
+ LOAD(same);
+ LOAD(DELlike);
+
+ warning("Unexpected TagClass '%s'", data);
+ result = 0;
+ break;
+ }
+ } else if (data) {
+ warning("load_flat_TagClass: '%s' vs '%s'", data, prefix);
+ }
+ free(next);
+ } else {
+ warning("Did not find contents");
+ }
+ return result;
+}
+
+#undef LOAD
+
+#define LOAD(name) \
+ if (!strcmp(data, #name)) {\
+ *flags |= Tgf_##name; \
+ continue; \
+ }
+
+static int load_flat_TagFlags(FILE *input, const char *name, TagFlags * flags)
+{
+ char prefix[80];
+ char *next = get_line(input);
+ char *data;
+ int result = 0;
+
+ *flags = 0;
+ if (next != 0) {
+ sprintf(prefix, "\t\t%s:", name);
+ data = strtok(next, "\n ");
+
+ if (data != 0 && !strcmp(data, prefix)) {
+ result = 1;
+
+ while ((data = strtok(NULL, "\n ")) != 0) {
+
+ LOAD(endO);
+ LOAD(startO);
+ LOAD(mafse);
+ LOAD(strict);
+ LOAD(nreie);
+ LOAD(frecyc);
+ LOAD(nolyspcl);
+
+ warning("Unexpected TagFlag '%s'", data);
+ result = 0;
+ break;
+ }
+ } else if (data) {
+ warning("load_flat_TagFlags: '%s' vs '%s'", data, prefix);
+ }
+ free(next);
+ }
+ return result;
+}
+
+#undef LOAD
+
+static int load_flat_AttrList(FILE *input, AttrList * attrs, int *length)
+{
+ attr *attributes;
+ int j, jcmp, code;
+ int result = 1;
+ char name[MY_LIMIT];
+ char *next;
+ char trail[MY_LIMIT];
+
+#ifdef USE_PRETTYSRC
+ int atype;
+#endif
+
+ next = get_line(input);
+ if (sscanf(next, FMT_NUM_ATTRS FMT_WS, length, trail) == 2
+ && *length > 0
+ && (attributes = typecallocn(attr, *length + 1)) != 0) {
+ *attrs = attributes;
+ for (j = 0; j < *length; ++j) {
+ next = get_line(input);
+ code = sscanf(next, FMT_ONE_ATTR FMT_WS, &jcmp, &atype, name, trail);
+ if (code == NUM_ONE_ATTR) {
+ if (j != jcmp)
+ warning("resequence %s from %d to %d", name, jcmp, j);
+ attributes[j].name = strdup(name);
+#ifdef USE_PRETTYSRC
+ attributes[j].type = atype;
+#endif
+ } else {
+ warning("Did not find attributes");
+ result = 0;
+ break;
+ }
+ }
+ if (*length > 1 && result)
+ qsort(attributes, *length, sizeof(attributes[0]), compare_attr);
+ } else {
+ warning("expected attribute count:\n%s", next);
+ }
+ return result;
+}
+
+/* find the given attribute in the list of attr_types */
+static int find_attribute(const char *attribute, const AttrType * attr_types)
+{
+ int j, k;
+ int found = -1;
+
+ for (j = 0; attr_types[j].name; ++j) {
+ AttrList list = attr_types[j].list;
+
+ for (k = 0; list[k].name; ++k) {
+ if (!strcmp(attribute, list[k].name)) {
+ if (found >= 0)
+ warning("attribute %s is in attr_types %s and %s",
+ attribute,
+ attr_types[found].name,
+ attr_types[j].name);
+ found = j;
+ }
+ }
+ }
+ return (found >= 0);
+}
+
+static int load_flat_HTTag(FILE *input, HTTag * tag, AttrType * allTypes)
+{
+ int result = 0;
+ unsigned ncmp = 0;
+ char name[MY_LIMIT];
+ char trail[MY_LIMIT];
+ char *next;
+ int code;
+ int j;
+
+ next = get_line(input);
+ code = sscanf(next, "%d:%s" FMT_WS, &ncmp, name, trail);
+ if (code == 3) {
+ result = 1;
+ tag->alias = 0;
+ tag->aliases = 0;
+ for (j = 0; name[j] != '\0'; ++j) {
+ int ch = UCH(name[j]);
+
+ if (!isalnum(ch)) {
+ if (strchr(alias_codes, ch) != NULL) {
+ tag->alias = (ch - '!') + 1;
+ name[j] = '\0';
+ } else {
+ result = 0;
+ }
+ break;
+ }
+ }
+ tag->name = strdup(name);
+#ifdef USE_COLOR_STYLE
+ tag->name_len = strlen(tag->name);
+#endif
+#ifdef USE_JUSTIFY_ELTS
+ next = get_line(input);
+ if (sscanf(next, "%s" FMT_WS, name, trail) == 2) {
+ tag->can_justify = !strcmp(name, "justify");
+ } else {
+ warning("Did not find can_justify");
+ result = 0;
+ }
+#endif
+ if (result) {
+ result = load_flat_AttrList(input, &(tag->attributes), &(tag->number_of_attributes));
+ }
+ if (result) {
+ AttrType *myTypes;
+ int k, count;
+
+ if ((count = read_num_attr_types(input)) > 0
+ && (myTypes = typecallocn(AttrType, count + 1)) != 0) {
+ tag->attr_types = myTypes;
+ for (k = 0; k < count; ++k) {
+ next = get_line(input);
+ if (next != 0
+ && sscanf(next, "%s" FMT_WS, name, trail)) {
+ int found = -1;
+
+ for (j = 0; allTypes[j].name != 0; ++j) {
+ if (!strcmp(allTypes[j].name, name)) {
+ myTypes[k].name = strdup(name);
+ myTypes[k].list = allTypes[j].list;
+ found = k;
+ break;
+ }
+ }
+ if (found < 0) {
+ warning("not found in attr_types: %s", name);
+ continue;
+ }
+ } else {
+ result = 0;
+ break;
+ }
+ }
+ if (result) {
+ if (count > 1)
+ qsort(myTypes,
+ count,
+ sizeof(myTypes[0]),
+ compare_attr_types);
+ for (k = 0; k < tag->number_of_attributes; ++k) {
+ if (!find_attribute(tag->attributes[k].name, tag->attr_types)) {
+ warning("%s attribute %s not found in attr_types",
+ tag->name, tag->attributes[k].name);
+ }
+ }
+ }
+ }
+ }
+ if (result) {
+
+ next = get_line(input);
+ if (next != 0
+ && sscanf(next, "\t\tcontents: %s" FMT_WS, name, trail)) {
+ tag->contents = s2SGMLContent(name);
+ free(next);
+ } else {
+ warning("Did not find contents");
+ result = 0;
+ }
+ }
+ if (result) {
+ result = load_flat_TagClass(input, "tagclass", &(tag->tagclass));
+ }
+ if (result) {
+ result = load_flat_TagClass(input, "contains", &(tag->contains));
+ }
+ if (result) {
+ result = load_flat_TagClass(input, "icontains", &(tag->icontains));
+ }
+ if (result) {
+ result = load_flat_TagClass(input, "contained", &(tag->contained));
+ }
+ if (result) {
+ result = load_flat_TagClass(input, "icontained", &(tag->icontained));
+ }
+ if (result) {
+ result = load_flat_TagClass(input, "canclose", &(tag->canclose));
+ }
+ if (result) {
+ result = load_flat_TagFlags(input, "flags", &(tag->flags));
+ }
+ } else {
+ warning("load_flat_HTTag error");
+ }
+ return result;
+}
+
+static int load_flat_AttrType(FILE *input, AttrType * types, size_t ncmp)
+{
+ int result = 0;
+ int ntst;
+ char name[MY_LIMIT];
+ char trail[MY_LIMIT];
+ char *next;
+
+ next = get_line(input);
+ if (sscanf(next, "%d:%s" FMT_WS, &ntst, name, trail) == 3
+ && (ntst == (int) ncmp)) {
+ result = 1;
+ types->name = strdup(name);
+ if (!load_flat_AttrList(input, &(types->list), &ntst))
+ result = 0;
+ } else {
+ warning("expected a tag:\n%s", next);
+ }
+ return result;
+}
+
+static int compare_tags(const void *a, const void *b)
+{
+ const HTTag *p = (const HTTag *) a;
+ const HTTag *q = (const HTTag *) b;
+ int result = 0;
+
+ if ((result = strcmp(p->name, q->name)) == 0) {
+ result = p->alias - q->alias;
+ }
+ return result;
+}
+
+static SGML_dtd *load_flatfile(FILE *input)
+{
+ AttrType *attr_types = 0;
+ SGML_dtd *result = 0;
+ char *next;
+ size_t n;
+ int number_of_attrs = 0;
+ int number_of_tags = 0;
+ HTTag *tag;
+ int code;
+ char trail[MY_LIMIT];
+
+ if ((number_of_attrs = read_num_attr_types(input)) <= 0) {
+ ;
+ } else if ((attr_types = typecallocn(AttrType, number_of_attrs + 1)) == 0) {
+ failed("calloc attr_types");
+ }
+
+ for (n = 0; n < (size_t) number_of_attrs; ++n) {
+ if (!load_flat_AttrType(input, attr_types + n, n)) {
+ break;
+ }
+ }
+
+ next = get_line(input);
+ code = sscanf(next, "%d tags" FMT_WS, &number_of_tags, trail);
+ if (code == 2) {
+ if ((result = typecalloc(SGML_dtd)) != 0
+ && (result->tags = typecallocn(HTTag, number_of_tags + 2)) != 0) {
+ for (n = 0; n < (size_t) number_of_tags; ++n) {
+ if (load_flat_HTTag(input, &(result->tags[n]), attr_types)) {
+ result->number_of_tags = (n + 1);
+ } else {
+ break;
+ }
+ }
+ tag = 0;
+ for (n = 0; n < (size_t) number_of_tags; ++n) {
+ if (result->tags[n].name != 0
+ && !strcmp(result->tags[n].name, "OBJECT")) {
+ tag = result->tags + number_of_tags;
+ *tag = result->tags[n];
+ tag->contents = SGML_MIXED;
+ tag->flags = Tgf_strict;
+ break;
+ }
+ }
+ if (tag == 0) {
+ warning("Did not find OBJECT tag");
+ result = 0;
+ } else {
+ qsort(result->tags, number_of_tags, sizeof(HTTag), compare_tags);
+ }
+ }
+ } else {
+ warning("expected tag count:\n%s", next);
+ }
+ return result;
+}
+
+static void cross_check(FILE *output, const SGML_dtd * the_dtd, int level)
+{
+ int ft;
+
+ fprintf(output, "Cross-check HTML DTD:\n");
+ fprintf(output, "\n");
+ /* make a sorted list of tags */
+ /* for each tag in the list, find the classes it might contain */
+ for (ft = 0; ft < the_dtd->number_of_tags; ++ft) {
+ int xc;
+ HTTag *ftag = &(the_dtd->tags[ft]);
+
+ /* for each contained-class, check if it says it can be contained */
+ fprintf(output, "tag %s\n", EXT_name(ftag));
+ for (xc = 0; class_list[xc].name != 0; ++xc) {
+ int rt;
+ int direct;
+ int passes = 2;
+
+ /* most of the tags are (should be) symmetric */
+ if (level <= 1) {
+ BOOL same = TRUE;
+
+ if ((ftag->contains & class_list[xc].tagclass)
+ != (ftag->icontains & class_list[xc].tagclass)) {
+ same = FALSE;
+ } else if ((ftag->contains & class_list[xc].tagclass) == 0) {
+ continue;
+ } else if (0) {
+ HTTag *rtag;
+
+ for (rt = 0; rt < the_dtd->number_of_tags; ++rt) {
+ rtag = &(the_dtd->tags[rt]);
+ if (ftag == rtag)
+ continue;
+ if ((ftag->contains & rtag->tagclass) == 0)
+ continue;
+ if ((rtag->contained & ftag->tagclass)
+ != (rtag->icontained & ftag->tagclass)) {
+ same = FALSE;
+ break;
+ }
+ }
+ }
+ if (same)
+ passes = 1;
+ }
+
+ for (direct = 0; direct < passes; ++direct) {
+ TagClass check = (direct ? ftag->contains : ftag->icontains);
+ BOOL first = TRUE;
+
+ if ((check &= class_list[xc].tagclass) == 0)
+ continue;
+
+ for (rt = 0; rt < the_dtd->number_of_tags; ++rt) {
+ HTTag *rtag = &(the_dtd->tags[rt]);
+ TagClass check2 = (direct ? rtag->contained : rtag->icontained);
+
+ if (rt == ft)
+ continue;
+ if ((check & rtag->tagclass) == 0)
+ continue;
+ if ((check2 & ftag->tagclass) == 0)
+ continue;
+ if (first) {
+ if (passes == 2) {
+ fprintf(output, "\t%s (%s)\n",
+ class_list[xc].name,
+ direct ? "direct" : "indirect");
+ } else {
+ fprintf(output, "\t%s\n",
+ class_list[xc].name);
+ }
+ }
+ fprintf(output, "%s%s",
+ first ? "\t\t" : " ",
+ EXT_name(rtag));
+ first = FALSE;
+ }
+ if (first) {
+ if (level > 1) {
+ if (passes == 2) {
+ fprintf(output, "\t%s (%s)\n",
+ class_list[xc].name,
+ direct ? "direct" : "indirect");
+ } else {
+ fprintf(output, "\t%s\n",
+ class_list[xc].name);
+ }
+ fprintf(output, "\t\t(missing)\n");
+ }
+ } else {
+ fprintf(output, "\n");
+ }
+ }
+ }
+ }
+}
+
+int main(int argc, char *argv[])
+{
+ const SGML_dtd *the_dtd = &HTML_dtd;
+ int ch;
+ int dtd_version = 0;
+ int c_option = FALSE;
+ int h_option = FALSE;
+ int l_option = FALSE;
+ int x_option = 0;
+ FILE *input = stdin;
+ FILE *output = stdout;
+
+ input_filename = "<builtin>";
+ input_lineno = 0;
+
+ while ((ch = getopt(argc, argv, GETOPT)) != -1) {
+ switch (ch) {
+ case 'c':
+ c_option = TRUE;
+ break;
+ case 'h':
+ h_option = TRUE;
+ break;
+ case 'l':
+ l_option = TRUE;
+ input = fopen((input_filename = optarg), "r");
+ if (input == 0)
+ failed(optarg);
+ break;
+ case 'o':
+ output = fopen(optarg, "w");
+ if (output == 0)
+ failed(optarg);
+ break;
+ case 't':
+ dtd_version = 1;
+ break;
+ case 's':
+ dtd_version = 0;
+ break;
+ case 'x':
+ ++x_option;
+ break;
+ default:
+ usage();
+ }
+ }
+
+ HTSwitchDTD(dtd_version);
+ if (l_option)
+ the_dtd = load_flatfile(input);
+
+ if (the_dtd != 0) {
+ if (c_option)
+ dump_source(output, the_dtd, dtd_version);
+ if (h_option)
+ dump_header(output, the_dtd);
+ if (x_option)
+ cross_check(output, the_dtd, x_option);
+ if (!c_option && !h_option && !x_option)
+ dump_flatfile(output, the_dtd);
+ }
+
+ return EXIT_SUCCESS;
+}
diff --git a/WWW/Library/Implementation/hdr_HTMLDTD.h b/WWW/Library/Implementation/hdr_HTMLDTD.h
new file mode 100644
index 0000000..21888d0
--- /dev/null
+++ b/WWW/Library/Implementation/hdr_HTMLDTD.h
@@ -0,0 +1,1000 @@
+/* $LynxId: hdr_HTMLDTD.h,v 1.25 2022/09/28 22:26:32 tom Exp $ */
+#ifndef hdr_HTMLDTD_H
+#define hdr_HTMLDTD_H 1
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+
+ Element Numbers
+
+ Must Match all tables by element!
+ These include tables in HTMLDTD.c
+ and code in HTML.c.
+
+ */
+ typedef enum {
+ HTML_A,
+ HTML_ABBR,
+ HTML_ACRONYM,
+ HTML_ADDRESS,
+ HTML_APPLET,
+ HTML_AREA,
+ HTML_ARTICLE,
+ HTML_ASIDE,
+ HTML_AU,
+ HTML_AUTHOR,
+ HTML_B,
+ HTML_BANNER,
+ HTML_BASE,
+ HTML_BASEFONT,
+ HTML_BDO,
+ HTML_BGSOUND,
+ HTML_BIG,
+ HTML_BLINK,
+ HTML_BLOCKQUOTE,
+ HTML_BODY,
+ HTML_BODYTEXT,
+ HTML_BQ,
+ HTML_BR,
+ HTML_BUTTON,
+ HTML_CAPTION,
+ HTML_CENTER,
+ HTML_CITE,
+ HTML_CODE,
+ HTML_COL,
+ HTML_COLGROUP,
+ HTML_COMMENT,
+ HTML_CREDIT,
+ HTML_DD,
+ HTML_DEL,
+ HTML_DEL_2,
+ HTML_DFN,
+ HTML_DIR,
+ HTML_DIV,
+ HTML_DL,
+ HTML_DLC,
+ HTML_DT,
+ HTML_EM,
+ HTML_EMBED,
+ HTML_FIELDSET,
+ HTML_FIG,
+ HTML_FIGURE,
+ HTML_FN,
+ HTML_FONT,
+ HTML_FOOTER,
+ HTML_FORM,
+ HTML_FRAME,
+ HTML_FRAMESET,
+ HTML_H1,
+ HTML_H2,
+ HTML_H3,
+ HTML_H4,
+ HTML_H5,
+ HTML_H6,
+ HTML_HEAD,
+ HTML_HEADER,
+ HTML_HR,
+ HTML_HTML,
+ HTML_HY,
+ HTML_I,
+ HTML_IFRAME,
+ HTML_IMG,
+ HTML_INPUT,
+ HTML_INS,
+ HTML_INS_2,
+ HTML_ISINDEX,
+ HTML_KBD,
+ HTML_KEYGEN,
+ HTML_LABEL,
+ HTML_LEGEND,
+ HTML_LH,
+ HTML_LI,
+ HTML_LINK,
+ HTML_LISTING,
+ HTML_MAIN,
+ HTML_MAP,
+ HTML_MARQUEE,
+ HTML_MATH,
+ HTML_MENU,
+ HTML_META,
+ HTML_NAV,
+ HTML_NEXTID,
+ HTML_NOFRAMES,
+ HTML_NOTE,
+ HTML_OBJECT,
+ HTML_OL,
+ HTML_OPTION,
+ HTML_OVERLAY,
+ HTML_P,
+ HTML_PARAM,
+ HTML_PLAINTEXT,
+ HTML_PRE,
+ HTML_Q,
+ HTML_S,
+ HTML_SAMP,
+ HTML_SCRIPT,
+ HTML_SECTION,
+ HTML_SELECT,
+ HTML_SHY,
+ HTML_SMALL,
+ HTML_SPAN,
+ HTML_SPOT,
+ HTML_STRIKE,
+ HTML_STRONG,
+ HTML_STYLE,
+ HTML_SUB,
+ HTML_SUP,
+ HTML_TAB,
+ HTML_TABLE,
+ HTML_TBODY,
+ HTML_TD,
+ HTML_TEXTAREA,
+ HTML_TEXTFLOW,
+ HTML_TFOOT,
+ HTML_TH,
+ HTML_THEAD,
+ HTML_TITLE,
+ HTML_TR,
+ HTML_TT,
+ HTML_U,
+ HTML_UL,
+ HTML_VAR,
+ HTML_WBR,
+ HTML_XMP,
+ HTML_ALT_OBJECT
+ } HTMLElement;
+
+/* Notes: HTML.c uses a different extension of the
+ HTML_ELEMENTS space privately, see
+ HTNestedList.h.
+
+ Do NOT replace HTML_ELEMENTS with
+ TABLESIZE(mumble_dtd.tags).
+
+ Keep the following defines in synch with
+ the above enum!
+ */
+
+/* # of elements generally visible to Lynx code */
+#define HTML_ELEMENTS 128
+
+/* # of elements visible to SGML parser */
+#define HTML_ALL_ELEMENTS 129
+
+/*
+
+ Attribute numbers
+
+ Identifier is HTML_<element>_<attribute>.
+ These must match the tables in HTML.c!
+
+ */
+#define HTML_A_ACCESSKEY 0
+#define HTML_A_CHARSET 1
+#define HTML_A_CLASS 2
+#define HTML_A_CLEAR 3
+#define HTML_A_COORDS 4
+#define HTML_A_DIR 5
+#define HTML_A_HREF 6
+#define HTML_A_HREFLANG 7
+#define HTML_A_ID 8
+#define HTML_A_ISMAP 9
+#define HTML_A_LANG 10
+#define HTML_A_MD 11
+#define HTML_A_NAME 12
+#define HTML_A_NOTAB 13
+#define HTML_A_ONBLUR 14
+#define HTML_A_ONFOCUS 15
+#define HTML_A_REL 16
+#define HTML_A_REV 17
+#define HTML_A_SHAPE 18
+#define HTML_A_STYLE 19
+#define HTML_A_TABINDEX 20
+#define HTML_A_TARGET 21
+#define HTML_A_TITLE 22
+#define HTML_A_TYPE 23
+#define HTML_A_URN 24
+#define HTML_A_ATTRIBUTES 25
+
+#define HTML_ADDRESS_CLASS 0
+#define HTML_ADDRESS_CLEAR 1
+#define HTML_ADDRESS_DIR 2
+#define HTML_ADDRESS_ID 3
+#define HTML_ADDRESS_LANG 4
+#define HTML_ADDRESS_NOWRAP 5
+#define HTML_ADDRESS_STYLE 6
+#define HTML_ADDRESS_TITLE 7
+#define HTML_ADDRESS_ATTRIBUTES 8
+
+#define HTML_APPLET_ALIGN 0
+#define HTML_APPLET_ALT 1
+#define HTML_APPLET_CLASS 2
+#define HTML_APPLET_CLEAR 3
+#define HTML_APPLET_CODE 4
+#define HTML_APPLET_CODEBASE 5
+#define HTML_APPLET_DIR 6
+#define HTML_APPLET_DOWNLOAD 7
+#define HTML_APPLET_HEIGHT 8
+#define HTML_APPLET_HSPACE 9
+#define HTML_APPLET_ID 10
+#define HTML_APPLET_LANG 11
+#define HTML_APPLET_NAME 12
+#define HTML_APPLET_STYLE 13
+#define HTML_APPLET_TITLE 14
+#define HTML_APPLET_VSPACE 15
+#define HTML_APPLET_WIDTH 16
+#define HTML_APPLET_ATTRIBUTES 17
+
+#define HTML_AREA_ACCESSKEY 0
+#define HTML_AREA_ALT 1
+#define HTML_AREA_CLASS 2
+#define HTML_AREA_CLEAR 3
+#define HTML_AREA_COORDS 4
+#define HTML_AREA_DIR 5
+#define HTML_AREA_HREF 6
+#define HTML_AREA_ID 7
+#define HTML_AREA_LANG 8
+#define HTML_AREA_NOHREF 9
+#define HTML_AREA_NOTAB 10
+#define HTML_AREA_ONBLUR 11
+#define HTML_AREA_ONFOCUS 12
+#define HTML_AREA_SHAPE 13
+#define HTML_AREA_STYLE 14
+#define HTML_AREA_TABINDEX 15
+#define HTML_AREA_TARGET 16
+#define HTML_AREA_TITLE 17
+#define HTML_AREA_ATTRIBUTES 18
+
+#define HTML_BASE_CLASS 0
+#define HTML_BASE_HREF 1
+#define HTML_BASE_ID 2
+#define HTML_BASE_STYLE 3
+#define HTML_BASE_TARGET 4
+#define HTML_BASE_TITLE 5
+#define HTML_BASE_ATTRIBUTES 6
+
+#define HTML_BGSOUND_CLASS 0
+#define HTML_BGSOUND_CLEAR 1
+#define HTML_BGSOUND_DIR 2
+#define HTML_BGSOUND_ID 3
+#define HTML_BGSOUND_LANG 4
+#define HTML_BGSOUND_LOOP 5
+#define HTML_BGSOUND_SRC 6
+#define HTML_BGSOUND_STYLE 7
+#define HTML_BGSOUND_TITLE 8
+#define HTML_BGSOUND_ATTRIBUTES 9
+
+#define HTML_BODY_ALINK 0
+#define HTML_BODY_BACKGROUND 1
+#define HTML_BODY_BGCOLOR 2
+#define HTML_BODY_CLASS 3
+#define HTML_BODY_CLEAR 4
+#define HTML_BODY_DIR 5
+#define HTML_BODY_ID 6
+#define HTML_BODY_LANG 7
+#define HTML_BODY_LINK 8
+#define HTML_BODY_ONLOAD 9
+#define HTML_BODY_ONUNLOAD 10
+#define HTML_BODY_STYLE 11
+#define HTML_BODY_TEXT 12
+#define HTML_BODY_TITLE 13
+#define HTML_BODY_VLINK 14
+#define HTML_BODY_ATTRIBUTES 15
+
+#define HTML_BODYTEXT_CLASS 0
+#define HTML_BODYTEXT_CLEAR 1
+#define HTML_BODYTEXT_DATA 2
+#define HTML_BODYTEXT_DIR 3
+#define HTML_BODYTEXT_ID 4
+#define HTML_BODYTEXT_LANG 5
+#define HTML_BODYTEXT_NAME 6
+#define HTML_BODYTEXT_OBJECT 7
+#define HTML_BODYTEXT_REF 8
+#define HTML_BODYTEXT_STYLE 9
+#define HTML_BODYTEXT_TITLE 10
+#define HTML_BODYTEXT_TYPE 11
+#define HTML_BODYTEXT_VALUE 12
+#define HTML_BODYTEXT_VALUETYPE 13
+#define HTML_BODYTEXT_ATTRIBUTES 14
+
+#define HTML_BQ_CITE 0
+#define HTML_BQ_CLASS 1
+#define HTML_BQ_CLEAR 2
+#define HTML_BQ_DIR 3
+#define HTML_BQ_ID 4
+#define HTML_BQ_LANG 5
+#define HTML_BQ_NOWRAP 6
+#define HTML_BQ_STYLE 7
+#define HTML_BQ_TITLE 8
+#define HTML_BQ_ATTRIBUTES 9
+
+#define HTML_BUTTON_ACCESSKEY 0
+#define HTML_BUTTON_CLASS 1
+#define HTML_BUTTON_CLEAR 2
+#define HTML_BUTTON_DIR 3
+#define HTML_BUTTON_DISABLED 4
+#define HTML_BUTTON_FORMACTION 5
+#define HTML_BUTTON_ID 6
+#define HTML_BUTTON_LANG 7
+#define HTML_BUTTON_NAME 8
+#define HTML_BUTTON_ONBLUR 9
+#define HTML_BUTTON_ONFOCUS 10
+#define HTML_BUTTON_READONLY 11
+#define HTML_BUTTON_STYLE 12
+#define HTML_BUTTON_TABINDEX 13
+#define HTML_BUTTON_TITLE 14
+#define HTML_BUTTON_TYPE 15
+#define HTML_BUTTON_VALUE 16
+#define HTML_BUTTON_ATTRIBUTES 17
+
+#define HTML_CAPTION_ACCESSKEY 0
+#define HTML_CAPTION_ALIGN 1
+#define HTML_CAPTION_CLASS 2
+#define HTML_CAPTION_CLEAR 3
+#define HTML_CAPTION_DIR 4
+#define HTML_CAPTION_ID 5
+#define HTML_CAPTION_LANG 6
+#define HTML_CAPTION_STYLE 7
+#define HTML_CAPTION_TITLE 8
+#define HTML_CAPTION_ATTRIBUTES 9
+
+#define HTML_COL_ALIGN 0
+#define HTML_COL_CHAR 1
+#define HTML_COL_CHAROFF 2
+#define HTML_COL_CLASS 3
+#define HTML_COL_CLEAR 4
+#define HTML_COL_DIR 5
+#define HTML_COL_ID 6
+#define HTML_COL_LANG 7
+#define HTML_COL_SPAN 8
+#define HTML_COL_STYLE 9
+#define HTML_COL_TITLE 10
+#define HTML_COL_VALIGN 11
+#define HTML_COL_WIDTH 12
+#define HTML_COL_ATTRIBUTES 13
+
+#define HTML_DEL_CITE 0
+#define HTML_DEL_CLASS 1
+#define HTML_DEL_DATETIME 2
+#define HTML_DEL_DIR 3
+#define HTML_DEL_ID 4
+#define HTML_DEL_LANG 5
+#define HTML_DEL_STYLE 6
+#define HTML_DEL_TITLE 7
+#define HTML_DEL_ATTRIBUTES 8
+
+#define HTML_DIV_ALIGN 0
+#define HTML_DIV_CLASS 1
+#define HTML_DIV_CLEAR 2
+#define HTML_DIV_DIR 3
+#define HTML_DIV_ID 4
+#define HTML_DIV_LANG 5
+#define HTML_DIV_STYLE 6
+#define HTML_DIV_TITLE 7
+#define HTML_DIV_ATTRIBUTES 8
+
+#define HTML_DL_CLASS 0
+#define HTML_DL_CLEAR 1
+#define HTML_DL_COMPACT 2
+#define HTML_DL_DIR 3
+#define HTML_DL_ID 4
+#define HTML_DL_LANG 5
+#define HTML_DL_STYLE 6
+#define HTML_DL_TITLE 7
+#define HTML_DL_ATTRIBUTES 8
+
+#define HTML_EMBED_ALIGN 0
+#define HTML_EMBED_ALT 1
+#define HTML_EMBED_BORDER 2
+#define HTML_EMBED_CLASS 3
+#define HTML_EMBED_CLEAR 4
+#define HTML_EMBED_DIR 5
+#define HTML_EMBED_HEIGHT 6
+#define HTML_EMBED_ID 7
+#define HTML_EMBED_IMAGEMAP 8
+#define HTML_EMBED_ISMAP 9
+#define HTML_EMBED_LANG 10
+#define HTML_EMBED_MD 11
+#define HTML_EMBED_NAME 12
+#define HTML_EMBED_NOFLOW 13
+#define HTML_EMBED_PARAMS 14
+#define HTML_EMBED_SRC 15
+#define HTML_EMBED_STYLE 16
+#define HTML_EMBED_TITLE 17
+#define HTML_EMBED_UNITS 18
+#define HTML_EMBED_USEMAP 19
+#define HTML_EMBED_WIDTH 20
+#define HTML_EMBED_ATTRIBUTES 21
+
+#define HTML_FIG_ALIGN 0
+#define HTML_FIG_BORDER 1
+#define HTML_FIG_CLASS 2
+#define HTML_FIG_CLEAR 3
+#define HTML_FIG_DIR 4
+#define HTML_FIG_HEIGHT 5
+#define HTML_FIG_ID 6
+#define HTML_FIG_IMAGEMAP 7
+#define HTML_FIG_ISOBJECT 8
+#define HTML_FIG_LANG 9
+#define HTML_FIG_MD 10
+#define HTML_FIG_NOFLOW 11
+#define HTML_FIG_SRC 12
+#define HTML_FIG_STYLE 13
+#define HTML_FIG_TITLE 14
+#define HTML_FIG_UNITS 15
+#define HTML_FIG_WIDTH 16
+#define HTML_FIG_ATTRIBUTES 17
+
+#define HTML_FONT_CLASS 0
+#define HTML_FONT_CLEAR 1
+#define HTML_FONT_COLOR 2
+#define HTML_FONT_DIR 3
+#define HTML_FONT_END 4
+#define HTML_FONT_FACE 5
+#define HTML_FONT_ID 6
+#define HTML_FONT_LANG 7
+#define HTML_FONT_SIZE 8
+#define HTML_FONT_STYLE 9
+#define HTML_FONT_TITLE 10
+#define HTML_FONT_ATTRIBUTES 11
+
+#define HTML_FORM_ACCEPT 0
+#define HTML_FORM_ACCEPT_CHARSET 1
+#define HTML_FORM_ACTION 2
+#define HTML_FORM_CLASS 3
+#define HTML_FORM_CLEAR 4
+#define HTML_FORM_DIR 5
+#define HTML_FORM_ENCTYPE 6
+#define HTML_FORM_ID 7
+#define HTML_FORM_LANG 8
+#define HTML_FORM_METHOD 9
+#define HTML_FORM_ONRESET 10
+#define HTML_FORM_ONSUBMIT 11
+#define HTML_FORM_SCRIPT 12
+#define HTML_FORM_STYLE 13
+#define HTML_FORM_SUBJECT 14
+#define HTML_FORM_TARGET 15
+#define HTML_FORM_TITLE 16
+#define HTML_FORM_ATTRIBUTES 17
+
+#define HTML_FRAME_CLASS 0
+#define HTML_FRAME_FRAMEBORDER 1
+#define HTML_FRAME_ID 2
+#define HTML_FRAME_LONGDESC 3
+#define HTML_FRAME_MARGINHEIGHT 4
+#define HTML_FRAME_MARGINWIDTH 5
+#define HTML_FRAME_NAME 6
+#define HTML_FRAME_NORESIZE 7
+#define HTML_FRAME_SCROLLING 8
+#define HTML_FRAME_SRC 9
+#define HTML_FRAME_STYLE 10
+#define HTML_FRAME_TITLE 11
+#define HTML_FRAME_ATTRIBUTES 12
+
+#define HTML_FRAMESET_COLS 0
+#define HTML_FRAMESET_ONLOAD 1
+#define HTML_FRAMESET_ONUNLOAD 2
+#define HTML_FRAMESET_ROWS 3
+#define HTML_FRAMESET_ATTRIBUTES 4
+
+#define HTML_GEN_CLASS 0
+#define HTML_GEN_CLEAR 1
+#define HTML_GEN_DIR 2
+#define HTML_GEN_ID 3
+#define HTML_GEN_LANG 4
+#define HTML_GEN_STYLE 5
+#define HTML_GEN_TITLE 6
+#define HTML_GEN_ATTRIBUTES 7
+
+#define HTML_GEN5_CLASS 0
+#define HTML_GEN5_DIR 1
+#define HTML_GEN5_ID 2
+#define HTML_GEN5_LANG 3
+#define HTML_GEN5_ROLE 4
+#define HTML_GEN5_STYLE 5
+#define HTML_GEN5_TITLE 6
+#define HTML_GEN5_ATTRIBUTES 7
+
+#define HTML_H_ALIGN 0
+#define HTML_H_CLASS 1
+#define HTML_H_CLEAR 2
+#define HTML_H_DINGBAT 3
+#define HTML_H_DIR 4
+#define HTML_H_ID 5
+#define HTML_H_LANG 6
+#define HTML_H_MD 7
+#define HTML_H_NOWRAP 8
+#define HTML_H_SEQNUM 9
+#define HTML_H_SKIP 10
+#define HTML_H_SRC 11
+#define HTML_H_STYLE 12
+#define HTML_H_TITLE 13
+#define HTML_H_ATTRIBUTES 14
+
+#define HTML_HR_ALIGN 0
+#define HTML_HR_CLASS 1
+#define HTML_HR_CLEAR 2
+#define HTML_HR_DIR 3
+#define HTML_HR_ID 4
+#define HTML_HR_LANG 5
+#define HTML_HR_MD 6
+#define HTML_HR_NOSHADE 7
+#define HTML_HR_SIZE 8
+#define HTML_HR_SRC 9
+#define HTML_HR_STYLE 10
+#define HTML_HR_TITLE 11
+#define HTML_HR_WIDTH 12
+#define HTML_HR_ATTRIBUTES 13
+
+#define HTML_IFRAME_ALIGN 0
+#define HTML_IFRAME_CLASS 1
+#define HTML_IFRAME_FRAMEBORDER 2
+#define HTML_IFRAME_HEIGHT 3
+#define HTML_IFRAME_ID 4
+#define HTML_IFRAME_LONGDESC 5
+#define HTML_IFRAME_MARGINHEIGHT 6
+#define HTML_IFRAME_MARGINWIDTH 7
+#define HTML_IFRAME_NAME 8
+#define HTML_IFRAME_SCROLLING 9
+#define HTML_IFRAME_SRC 10
+#define HTML_IFRAME_STYLE 11
+#define HTML_IFRAME_TITLE 12
+#define HTML_IFRAME_WIDTH 13
+#define HTML_IFRAME_ATTRIBUTES 14
+
+#define HTML_IMG_ALIGN 0
+#define HTML_IMG_ALT 1
+#define HTML_IMG_BORDER 2
+#define HTML_IMG_CLASS 3
+#define HTML_IMG_CLEAR 4
+#define HTML_IMG_DIR 5
+#define HTML_IMG_HEIGHT 6
+#define HTML_IMG_HSPACE 7
+#define HTML_IMG_ID 8
+#define HTML_IMG_ISMAP 9
+#define HTML_IMG_ISOBJECT 10
+#define HTML_IMG_LANG 11
+#define HTML_IMG_LONGDESC 12
+#define HTML_IMG_MD 13
+#define HTML_IMG_NAME 14
+#define HTML_IMG_SRC 15
+#define HTML_IMG_STYLE 16
+#define HTML_IMG_TITLE 17
+#define HTML_IMG_UNITS 18
+#define HTML_IMG_USEMAP 19
+#define HTML_IMG_VSPACE 20
+#define HTML_IMG_WIDTH 21
+#define HTML_IMG_ATTRIBUTES 22
+
+#define HTML_INPUT_ACCEPT 0
+#define HTML_INPUT_ACCEPT_CHARSET 1
+#define HTML_INPUT_ACCESSKEY 2
+#define HTML_INPUT_ALIGN 3
+#define HTML_INPUT_ALT 4
+#define HTML_INPUT_CHECKED 5
+#define HTML_INPUT_CLASS 6
+#define HTML_INPUT_CLEAR 7
+#define HTML_INPUT_DIR 8
+#define HTML_INPUT_DISABLED 9
+#define HTML_INPUT_ERROR 10
+#define HTML_INPUT_HEIGHT 11
+#define HTML_INPUT_ID 12
+#define HTML_INPUT_ISMAP 13
+#define HTML_INPUT_LANG 14
+#define HTML_INPUT_MAX 15
+#define HTML_INPUT_MAXLENGTH 16
+#define HTML_INPUT_MD 17
+#define HTML_INPUT_MIN 18
+#define HTML_INPUT_NAME 19
+#define HTML_INPUT_NOTAB 20
+#define HTML_INPUT_ONBLUR 21
+#define HTML_INPUT_ONCHANGE 22
+#define HTML_INPUT_ONFOCUS 23
+#define HTML_INPUT_ONSELECT 24
+#define HTML_INPUT_READONLY 25
+#define HTML_INPUT_SIZE 26
+#define HTML_INPUT_SRC 27
+#define HTML_INPUT_STYLE 28
+#define HTML_INPUT_TABINDEX 29
+#define HTML_INPUT_TITLE 30
+#define HTML_INPUT_TYPE 31
+#define HTML_INPUT_USEMAP 32
+#define HTML_INPUT_VALUE 33
+#define HTML_INPUT_WIDTH 34
+#define HTML_INPUT_ATTRIBUTES 35
+
+#define HTML_ISINDEX_ACTION 0
+#define HTML_ISINDEX_CLASS 1
+#define HTML_ISINDEX_DIR 2
+#define HTML_ISINDEX_HREF 3
+#define HTML_ISINDEX_ID 4
+#define HTML_ISINDEX_LANG 5
+#define HTML_ISINDEX_PROMPT 6
+#define HTML_ISINDEX_STYLE 7
+#define HTML_ISINDEX_TITLE 8
+#define HTML_ISINDEX_ATTRIBUTES 9
+
+#define HTML_KEYGEN_CHALLENGE 0
+#define HTML_KEYGEN_CLASS 1
+#define HTML_KEYGEN_DIR 2
+#define HTML_KEYGEN_ID 3
+#define HTML_KEYGEN_LANG 4
+#define HTML_KEYGEN_NAME 5
+#define HTML_KEYGEN_STYLE 6
+#define HTML_KEYGEN_TITLE 7
+#define HTML_KEYGEN_ATTRIBUTES 8
+
+#define HTML_LABEL_ACCESSKEY 0
+#define HTML_LABEL_CLASS 1
+#define HTML_LABEL_CLEAR 2
+#define HTML_LABEL_DIR 3
+#define HTML_LABEL_FOR 4
+#define HTML_LABEL_ID 5
+#define HTML_LABEL_LANG 6
+#define HTML_LABEL_ONBLUR 7
+#define HTML_LABEL_ONFOCUS 8
+#define HTML_LABEL_STYLE 9
+#define HTML_LABEL_TITLE 10
+#define HTML_LABEL_ATTRIBUTES 11
+
+#define HTML_LI_CLASS 0
+#define HTML_LI_CLEAR 1
+#define HTML_LI_DINGBAT 2
+#define HTML_LI_DIR 3
+#define HTML_LI_ID 4
+#define HTML_LI_LANG 5
+#define HTML_LI_MD 6
+#define HTML_LI_SKIP 7
+#define HTML_LI_SRC 8
+#define HTML_LI_STYLE 9
+#define HTML_LI_TITLE 10
+#define HTML_LI_TYPE 11
+#define HTML_LI_VALUE 12
+#define HTML_LI_ATTRIBUTES 13
+
+#define HTML_LINK_CHARSET 0
+#define HTML_LINK_CLASS 1
+#define HTML_LINK_DIR 2
+#define HTML_LINK_HREF 3
+#define HTML_LINK_HREFLANG 4
+#define HTML_LINK_ID 5
+#define HTML_LINK_LANG 6
+#define HTML_LINK_MEDIA 7
+#define HTML_LINK_REL 8
+#define HTML_LINK_REV 9
+#define HTML_LINK_STYLE 10
+#define HTML_LINK_TARGET 11
+#define HTML_LINK_TITLE 12
+#define HTML_LINK_TYPE 13
+#define HTML_LINK_ATTRIBUTES 14
+
+#define HTML_MAP_CLASS 0
+#define HTML_MAP_CLEAR 1
+#define HTML_MAP_DIR 2
+#define HTML_MAP_ID 3
+#define HTML_MAP_LANG 4
+#define HTML_MAP_NAME 5
+#define HTML_MAP_STYLE 6
+#define HTML_MAP_TITLE 7
+#define HTML_MAP_ATTRIBUTES 8
+
+#define HTML_MATH_BOX 0
+#define HTML_MATH_CLASS 1
+#define HTML_MATH_CLEAR 2
+#define HTML_MATH_DIR 3
+#define HTML_MATH_ID 4
+#define HTML_MATH_LANG 5
+#define HTML_MATH_STYLE 6
+#define HTML_MATH_TITLE 7
+#define HTML_MATH_ATTRIBUTES 8
+
+#define HTML_META_CHARSET 0
+#define HTML_META_CONTENT 1
+#define HTML_META_HTTP_EQUIV 2
+#define HTML_META_NAME 3
+#define HTML_META_SCHEME 4
+#define HTML_META_ATTRIBUTES 5
+
+#define HTML_NEXTID_N 0
+#define HTML_NEXTID_ATTRIBUTES 1
+
+#define HTML_NOTE_CLASS 0
+#define HTML_NOTE_CLEAR 1
+#define HTML_NOTE_DIR 2
+#define HTML_NOTE_ID 3
+#define HTML_NOTE_LANG 4
+#define HTML_NOTE_MD 5
+#define HTML_NOTE_ROLE 6
+#define HTML_NOTE_SRC 7
+#define HTML_NOTE_STYLE 8
+#define HTML_NOTE_TITLE 9
+#define HTML_NOTE_ATTRIBUTES 10
+
+#define HTML_OBJECT_ALIGN 0
+#define HTML_OBJECT_ARCHIVE 1
+#define HTML_OBJECT_BORDER 2
+#define HTML_OBJECT_CLASS 3
+#define HTML_OBJECT_CLASSID 4
+#define HTML_OBJECT_CODEBASE 5
+#define HTML_OBJECT_CODETYPE 6
+#define HTML_OBJECT_DATA 7
+#define HTML_OBJECT_DECLARE 8
+#define HTML_OBJECT_DIR 9
+#define HTML_OBJECT_HEIGHT 10
+#define HTML_OBJECT_HSPACE 11
+#define HTML_OBJECT_ID 12
+#define HTML_OBJECT_ISMAP 13
+#define HTML_OBJECT_LANG 14
+#define HTML_OBJECT_NAME 15
+#define HTML_OBJECT_NOTAB 16
+#define HTML_OBJECT_SHAPES 17
+#define HTML_OBJECT_STANDBY 18
+#define HTML_OBJECT_STYLE 19
+#define HTML_OBJECT_TABINDEX 20
+#define HTML_OBJECT_TITLE 21
+#define HTML_OBJECT_TYPE 22
+#define HTML_OBJECT_USEMAP 23
+#define HTML_OBJECT_VSPACE 24
+#define HTML_OBJECT_WIDTH 25
+#define HTML_OBJECT_ATTRIBUTES 26
+
+#define HTML_OL_CLASS 0
+#define HTML_OL_CLEAR 1
+#define HTML_OL_COMPACT 2
+#define HTML_OL_CONTINUE 3
+#define HTML_OL_DIR 4
+#define HTML_OL_ID 5
+#define HTML_OL_LANG 6
+#define HTML_OL_SEQNUM 7
+#define HTML_OL_START 8
+#define HTML_OL_STYLE 9
+#define HTML_OL_TITLE 10
+#define HTML_OL_TYPE 11
+#define HTML_OL_ATTRIBUTES 12
+
+#define HTML_OPTION_CLASS 0
+#define HTML_OPTION_CLEAR 1
+#define HTML_OPTION_DIR 2
+#define HTML_OPTION_DISABLED 3
+#define HTML_OPTION_ERROR 4
+#define HTML_OPTION_ID 5
+#define HTML_OPTION_LABEL 6
+#define HTML_OPTION_LANG 7
+#define HTML_OPTION_SELECTED 8
+#define HTML_OPTION_SHAPE 9
+#define HTML_OPTION_STYLE 10
+#define HTML_OPTION_TITLE 11
+#define HTML_OPTION_VALUE 12
+#define HTML_OPTION_ATTRIBUTES 13
+
+#define HTML_OVERLAY_CLASS 0
+#define HTML_OVERLAY_HEIGHT 1
+#define HTML_OVERLAY_ID 2
+#define HTML_OVERLAY_IMAGEMAP 3
+#define HTML_OVERLAY_MD 4
+#define HTML_OVERLAY_SRC 5
+#define HTML_OVERLAY_STYLE 6
+#define HTML_OVERLAY_TITLE 7
+#define HTML_OVERLAY_UNITS 8
+#define HTML_OVERLAY_WIDTH 9
+#define HTML_OVERLAY_X 10
+#define HTML_OVERLAY_Y 11
+#define HTML_OVERLAY_ATTRIBUTES 12
+
+#define HTML_P_ALIGN 0
+#define HTML_P_CLASS 1
+#define HTML_P_CLEAR 2
+#define HTML_P_DIR 3
+#define HTML_P_ID 4
+#define HTML_P_LANG 5
+#define HTML_P_NOWRAP 6
+#define HTML_P_STYLE 7
+#define HTML_P_TITLE 8
+#define HTML_P_ATTRIBUTES 9
+
+#define HTML_PARAM_ACCEPT 0
+#define HTML_PARAM_ACCEPT_CHARSET 1
+#define HTML_PARAM_ACCEPT_ENCODING 2
+#define HTML_PARAM_CLASS 3
+#define HTML_PARAM_CLEAR 4
+#define HTML_PARAM_DATA 5
+#define HTML_PARAM_DIR 6
+#define HTML_PARAM_ID 7
+#define HTML_PARAM_LANG 8
+#define HTML_PARAM_NAME 9
+#define HTML_PARAM_OBJECT 10
+#define HTML_PARAM_REF 11
+#define HTML_PARAM_STYLE 12
+#define HTML_PARAM_TITLE 13
+#define HTML_PARAM_TYPE 14
+#define HTML_PARAM_VALUE 15
+#define HTML_PARAM_VALUEREF 16
+#define HTML_PARAM_VALUETYPE 17
+#define HTML_PARAM_ATTRIBUTES 18
+
+#define HTML_Q_CITE 0
+#define HTML_Q_CLASS 1
+#define HTML_Q_CLEAR 2
+#define HTML_Q_DIR 3
+#define HTML_Q_ID 4
+#define HTML_Q_LANG 5
+#define HTML_Q_STYLE 6
+#define HTML_Q_TITLE 7
+#define HTML_Q_ATTRIBUTES 8
+
+#define HTML_SCRIPT_CHARSET 0
+#define HTML_SCRIPT_CLASS 1
+#define HTML_SCRIPT_CLEAR 2
+#define HTML_SCRIPT_DEFER 3
+#define HTML_SCRIPT_DIR 4
+#define HTML_SCRIPT_EVENT 5
+#define HTML_SCRIPT_FOR 6
+#define HTML_SCRIPT_ID 7
+#define HTML_SCRIPT_LANG 8
+#define HTML_SCRIPT_LANGUAGE 9
+#define HTML_SCRIPT_NAME 10
+#define HTML_SCRIPT_SCRIPTENGINE 11
+#define HTML_SCRIPT_SRC 12
+#define HTML_SCRIPT_STYLE 13
+#define HTML_SCRIPT_TITLE 14
+#define HTML_SCRIPT_TYPE 15
+#define HTML_SCRIPT_ATTRIBUTES 16
+
+#define HTML_SELECT_ALIGN 0
+#define HTML_SELECT_CLASS 1
+#define HTML_SELECT_CLEAR 2
+#define HTML_SELECT_DIR 3
+#define HTML_SELECT_DISABLED 4
+#define HTML_SELECT_ERROR 5
+#define HTML_SELECT_HEIGHT 6
+#define HTML_SELECT_ID 7
+#define HTML_SELECT_LANG 8
+#define HTML_SELECT_MD 9
+#define HTML_SELECT_MULTIPLE 10
+#define HTML_SELECT_NAME 11
+#define HTML_SELECT_NOTAB 12
+#define HTML_SELECT_ONBLUR 13
+#define HTML_SELECT_ONCHANGE 14
+#define HTML_SELECT_ONFOCUS 15
+#define HTML_SELECT_SIZE 16
+#define HTML_SELECT_STYLE 17
+#define HTML_SELECT_TABINDEX 18
+#define HTML_SELECT_TITLE 19
+#define HTML_SELECT_UNITS 20
+#define HTML_SELECT_WIDTH 21
+#define HTML_SELECT_ATTRIBUTES 22
+
+#define HTML_STYLE_CLASS 0
+#define HTML_STYLE_DIR 1
+#define HTML_STYLE_ID 2
+#define HTML_STYLE_LANG 3
+#define HTML_STYLE_MEDIA 4
+#define HTML_STYLE_NOTATION 5
+#define HTML_STYLE_STYLE 6
+#define HTML_STYLE_TITLE 7
+#define HTML_STYLE_TYPE 8
+#define HTML_STYLE_ATTRIBUTES 9
+
+#define HTML_TAB_ALIGN 0
+#define HTML_TAB_CLASS 1
+#define HTML_TAB_CLEAR 2
+#define HTML_TAB_DIR 3
+#define HTML_TAB_DP 4
+#define HTML_TAB_ID 5
+#define HTML_TAB_INDENT 6
+#define HTML_TAB_LANG 7
+#define HTML_TAB_STYLE 8
+#define HTML_TAB_TITLE 9
+#define HTML_TAB_TO 10
+#define HTML_TAB_ATTRIBUTES 11
+
+#define HTML_TABLE_ALIGN 0
+#define HTML_TABLE_BACKGROUND 1
+#define HTML_TABLE_BORDER 2
+#define HTML_TABLE_CELLPADDING 3
+#define HTML_TABLE_CELLSPACING 4
+#define HTML_TABLE_CLASS 5
+#define HTML_TABLE_CLEAR 6
+#define HTML_TABLE_COLS 7
+#define HTML_TABLE_COLSPEC 8
+#define HTML_TABLE_DIR 9
+#define HTML_TABLE_DP 10
+#define HTML_TABLE_FRAME 11
+#define HTML_TABLE_ID 12
+#define HTML_TABLE_LANG 13
+#define HTML_TABLE_NOFLOW 14
+#define HTML_TABLE_NOWRAP 15
+#define HTML_TABLE_RULES 16
+#define HTML_TABLE_STYLE 17
+#define HTML_TABLE_SUMMARY 18
+#define HTML_TABLE_TITLE 19
+#define HTML_TABLE_UNITS 20
+#define HTML_TABLE_WIDTH 21
+#define HTML_TABLE_ATTRIBUTES 22
+
+#define HTML_TD_ABBR 0
+#define HTML_TD_ALIGN 1
+#define HTML_TD_AXES 2
+#define HTML_TD_AXIS 3
+#define HTML_TD_BACKGROUND 4
+#define HTML_TD_CHAR 5
+#define HTML_TD_CHAROFF 6
+#define HTML_TD_CLASS 7
+#define HTML_TD_CLEAR 8
+#define HTML_TD_COLSPAN 9
+#define HTML_TD_DIR 10
+#define HTML_TD_DP 11
+#define HTML_TD_HEADERS 12
+#define HTML_TD_HEIGHT 13
+#define HTML_TD_ID 14
+#define HTML_TD_LANG 15
+#define HTML_TD_NOWRAP 16
+#define HTML_TD_ROWSPAN 17
+#define HTML_TD_SCOPE 18
+#define HTML_TD_STYLE 19
+#define HTML_TD_TITLE 20
+#define HTML_TD_VALIGN 21
+#define HTML_TD_WIDTH 22
+#define HTML_TD_ATTRIBUTES 23
+
+#define HTML_TEXTAREA_ACCEPT_CHARSET 0
+#define HTML_TEXTAREA_ACCESSKEY 1
+#define HTML_TEXTAREA_ALIGN 2
+#define HTML_TEXTAREA_CLASS 3
+#define HTML_TEXTAREA_CLEAR 4
+#define HTML_TEXTAREA_COLS 5
+#define HTML_TEXTAREA_DIR 6
+#define HTML_TEXTAREA_DISABLED 7
+#define HTML_TEXTAREA_ERROR 8
+#define HTML_TEXTAREA_ID 9
+#define HTML_TEXTAREA_LANG 10
+#define HTML_TEXTAREA_NAME 11
+#define HTML_TEXTAREA_NOTAB 12
+#define HTML_TEXTAREA_ONBLUR 13
+#define HTML_TEXTAREA_ONCHANGE 14
+#define HTML_TEXTAREA_ONFOCUS 15
+#define HTML_TEXTAREA_ONSELECT 16
+#define HTML_TEXTAREA_READONLY 17
+#define HTML_TEXTAREA_ROWS 18
+#define HTML_TEXTAREA_STYLE 19
+#define HTML_TEXTAREA_TABINDEX 20
+#define HTML_TEXTAREA_TITLE 21
+#define HTML_TEXTAREA_ATTRIBUTES 22
+
+#define HTML_TR_ALIGN 0
+#define HTML_TR_CHAR 1
+#define HTML_TR_CHAROFF 2
+#define HTML_TR_CLASS 3
+#define HTML_TR_CLEAR 4
+#define HTML_TR_DIR 5
+#define HTML_TR_DP 6
+#define HTML_TR_ID 7
+#define HTML_TR_LANG 8
+#define HTML_TR_NOWRAP 9
+#define HTML_TR_STYLE 10
+#define HTML_TR_TITLE 11
+#define HTML_TR_VALIGN 12
+#define HTML_TR_ATTRIBUTES 13
+
+#define HTML_UL_CLASS 0
+#define HTML_UL_CLEAR 1
+#define HTML_UL_COMPACT 2
+#define HTML_UL_DINGBAT 3
+#define HTML_UL_DIR 4
+#define HTML_UL_ID 5
+#define HTML_UL_LANG 6
+#define HTML_UL_MD 7
+#define HTML_UL_PLAIN 8
+#define HTML_UL_SRC 9
+#define HTML_UL_STYLE 10
+#define HTML_UL_TITLE 11
+#define HTML_UL_TYPE 12
+#define HTML_UL_WRAP 13
+#define HTML_UL_ATTRIBUTES 14
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* hdr_HTMLDTD_H */
diff --git a/WWW/Library/Implementation/makefile.in b/WWW/Library/Implementation/makefile.in
new file mode 100644
index 0000000..0b467d7
--- /dev/null
+++ b/WWW/Library/Implementation/makefile.in
@@ -0,0 +1,384 @@
+# $LynxId: makefile.in,v 1.35 2021/07/16 20:01:00 tom Exp $
+# Make WWW under unix for a.n.other unix system (bsd)
+# Use this as a template
+
+# For W3 distribution, machine type for subdirectories
+WWW_MACH = Implementation
+WWWINC = $(top_srcdir)/WWW/Library/Implementation
+
+ECHO = @DONT_ECHO_CC@
+LFLAGS =
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+datarootdir = @datarootdir@
+top_srcdir = @top_srcdir@
+srcdir = @srcdir@
+VPATH = $(srcdir)
+
+LYFLAGS = # FIXME: set in parent makefile
+
+CC = @CC@
+DEFS = @DEFS@
+EXTRA_CPPFLAGS = @EXTRA_CPPFLAGS@
+CPPFLAGS = @CPPFLAGS@
+
+AR = @AR@
+ARFLAGS = @ARFLAGS@
+
+RANLIB = @RANLIB@
+
+o = .@OBJEXT@
+x = @EXEEXT@
+
+INTLDIR_CPPFLAGS= @INTLDIR_CPPFLAGS@ -I$(top_srcdir)/intl
+
+CPP = @CPP@
+CPPOPTS = $(DEFS) $(LYFLAGS) \
+ -I../../.. \
+ -I../../../src \
+ -I$(top_srcdir) \
+ -I$(top_srcdir)/src \
+ $(INTLDIR_CPPFLAGS) -I$(WWWINC) $(EXTRA_CPPFLAGS) $(CPPFLAGS)
+
+LY_CFLAGS = @CFLAGS@ @EXTRA_CFLAGS@
+CFLAGS = $(CPPOPTS) $(LY_CFLAGS)
+
+LINT = @LINT@
+LINTOPTS =
+
+CTAGS = @CTAGS@
+
+# Directory for installed binary:
+BINDIR = @bindir@
+
+# Where is the W3 object library to be installed (not normally done)?
+#_________________ OK if normal W3 distribution
+# Where is the WWW source root?
+WWW = $(top_srcdir)/WWW
+
+# Where should temporary (object) files go?
+WTMP = ../..
+
+# (Version.make)
+VC = 2.14
+#______________________________________________________________________
+# (originally CommonMakefile)
+
+# If this env var is set to something else Some makes will use that instead
+SHELL = @CONFIG_SHELL@
+
+# .h files are distributed but originally are made from the
+# self-documenting hypertext files.
+
+.SUFFIXES: .h .html
+.html.h:
+# - chmod +w $*.h
+ www -w90 -na -to text/x-c $*.html > $*.h
+# chmod -w $*.h
+
+# If this is actually run in a subdirectory,
+#
+# WWW = ../../..
+# WWW = ../.. For [cernlib] build in this directory
+
+CMN = $(WWW)/Library/Implementation/
+
+# Where shall we put the objects and built library?
+
+LOB = .
+
+# Only needed if HTWAIS.c is to be compiled. Put into your Makefile.include
+# uncomment these and fill in WAISINC for adding direct wais access
+# to Lynx.
+@MAKE_WAIS@HTWAIS_c = $(CMN)/HTWAIS.c
+@MAKE_WAIS@HTWAIS_o = $(LOB)/HTWAIS$o
+@MAKE_WAIS@WAIS = YES
+#WAISINC = -I../../../../freeWAIS-0.202/ir
+@MAKE_WAIS@WAISCFLAGS = -DDIRECT_WAIS
+#
+
+# add -DNEW_GATEWAY here for the new gateway config stuff
+CFLAGS2 = $(CFLAGS) $(LYFLAGS) $(WAISCFLAGS) -I$(CMN) -DACCESS_AUTH
+
+COMPILE = $(ECHO) $(CC) $(CFLAGS2) -c
+
+COMMON = $(LOB)/HTParse$o $(LOB)/HTAccess$o $(LOB)/HTTP$o \
+ $(LOB)/HTFile$o $(LOB)/HTBTree$o $(LOB)/HTFTP$o $(LOB)/HTTCP$o \
+ $(LOB)/SGML$o $(LOB)/HTMLDTD$o $(LOB)/HTChunk$o \
+ $(LOB)/HTPlain$o \
+ $(LOB)/HTMLGen$o \
+ $(LOB)/HTAtom$o $(LOB)/HTAnchor$o $(LOB)/HTStyle$o \
+ $(LOB)/HTList$o $(LOB)/HTString$o \
+ $(LOB)/HTRules$o $(LOB)/HTFormat$o $(LOB)/HTMIME$o \
+ $(LOB)/HTNews$o $(LOB)/HTGopher$o \
+ $(LOB)/HTTelnet$o $(LOB)/HTFinger$o $(LOB)/HTWSRC$o $(HTWAIS_o) \
+ $(LOB)/HTAAUtil$o $(LOB)/HTAABrow$o \
+ $(LOB)/HTGroup$o \
+ $(LOB)/HTAAProt$o \
+ $(LOB)/HTAssoc$o $(LOB)/HTLex$o $(LOB)/HTUU$o \
+ $(LOB)/HTDOS$o
+
+CFILES = $(CMN)HTParse.c $(CMN)HTAccess.c $(CMN)HTTP.c $(CMN)HTFile.c \
+ $(CMN)HTBTree.c \
+ $(CMN)HTFTP.c $(CMN)HTTCP.c $(CMN)SGML.c \
+ $(CMN)HTMLDTD.c \
+ $(CMN)HTPlain.c \
+ $(CMN)HTMLGen.c \
+ $(CMN)HTChunk.c $(CMN)HTAtom.c $(CMN)HTAnchor.c $(CMN)HTStyle.c \
+ $(CMN)HTList.c $(CMN)HTString.c $(CMN)HTRules.c \
+ $(CMN)HTFormat.c $(CMN)HTMIME.c \
+ $(CMN)HTNews.c $(CMN)HTGopher.c $(CMN)HTTelnet.c \
+ $(CMN)HTFinger.c $(HTWAIS_c) $(CMN)HTWSRC.c \
+ $(CMN)HTAABrow.c \
+ $(CMN)HTGroup.c \
+ $(CMN)HTAAProt.c \
+ $(CMN)HTAssoc.c $(CMN)HTLex.c $(CMN)HTUU.c
+
+HFILES = $(CMN)HTParse.h $(CMN)HTAccess.h $(CMN)HTTP.h $(CMN)HTFile.h \
+ $(CMN)HTBTree.h $(CMN)HTFTP.h $(CMN)HTTCP.h \
+ $(CMN)SGML.h $(CMN)HTML.h $(CMN)HTMLDTD.h $(CMN)HTChunk.h \
+ $(CMN)HTPlain.h \
+ $(CMN)HTFWriter.h $(CMN)HTMLGen.h \
+ $(CMN)HTStream.h \
+ $(CMN)HTAtom.h $(CMN)HTAnchor.h $(CMN)HTStyle.h \
+ $(CMN)HTList.h \
+ $(CMN)HTString.h $(CMN)HTRules.h \
+ $(CMN)HTFormat.h $(CMN)HTInit.h \
+ $(CMN)HTMIME.h $(CMN)HTNews.h \
+ $(CMN)HTGopher.h \
+ $(CMN)HTUtils.h $(CMN)www_tcp.h $(CMN)HText.h \
+ $(CMN)HTTelnet.h $(CMN)HTFinger.h \
+ $(CMN)HTWAIS.h $(CMN)HTWSRC.h \
+ $(CMN)HTAABrow.h \
+ $(CMN)HTGroup.h \
+ $(CMN)HTAAProt.h \
+ $(CMN)HTAssoc.h $(CMN)HTLex.h $(CMN)HTUU.h
+
+C_SRC = $(COMMON:$o=.c)
+
+all : $(LOB)/libwww.a
+
+lint:
+ $(LINT) $(LINTOPTS) $(CPPOPTS) $(C_SRC) 2>&1 |tee ../../../lint.libwww
+
+.SUFFIXES: $o .i .h .html
+
+.c$o:
+ @RULE_CC@
+ @ECHO_CC@$(CC) $(CPPOPTS) $(CFLAGS) -c $(srcdir)/$*.c
+
+.c.i:
+ @RULE_CC@
+ @ECHO_CC@$(CPP) $(CPPOPTS) $(srcdir)/$*.c >$@
+
+depend :
+ makedepend -fmakefile -- $(CFLAGS) -- $(CFILES)
+
+# Library
+#
+# On SGI, ranlib is unnecessary and does not exist so we ignore errors
+# for that step
+$(LOB)/libwww.a : $(COMMON)
+ $(AR) $(ARFLAGS) $(LOB)/libwww.a $(COMMON)
+ -$(RANLIB) $(LOB)/libwww.a
+
+# Clean up everything generatable except final products
+clean :
+ rm -f core *.core *.leaks *.[oi] *.bak tags TAGS
+ rm -f dtd_util$x
+ rm -f $(LOB)/*$o
+
+distclean : clean
+ @echo made $@
+
+tags:
+ $(CTAGS) *.[ch]
+
+# Common code
+# -----------
+
+$(LOB)/HTList$o : $(CMN)HTList.c $(CMN)HTUtils.h $(CMN)HTList.h
+ $(COMPILE) $(CMN)HTList.c
+
+$(LOB)/HTAnchor$o : $(CMN)HTAnchor.c $(CMN)HTUtils.h $(CMN)HTList.h
+ $(COMPILE) $(CMN)HTAnchor.c
+
+$(LOB)/HTFormat$o : $(CMN)HTFormat.c $(CMN)HTUtils.h $(CMN)HTList.h
+ $(COMPILE) $(CMN)HTFormat.c
+
+$(LOB)/HTMIME$o : $(CMN)HTMIME.c $(CMN)HTUtils.h $(CMN)HTList.h
+ $(COMPILE) $(CMN)HTMIME.c
+
+$(LOB)/HTNews$o : $(CMN)HTNews.c $(CMN)HTUtils.h $(CMN)HTList.h\
+ $(CMN)HTMLDTD.h
+ $(COMPILE) $(CMN)HTNews.c
+
+$(LOB)/HTGopher$o : $(CMN)HTGopher.c $(CMN)HTUtils.h $(CMN)HTList.h \
+ $(CMN)HTMLDTD.h
+ $(COMPILE) $(CMN)HTGopher.c
+
+$(LOB)/HTTelnet$o : $(CMN)HTTelnet.c $(CMN)HTUtils.h $(CMN)HTTelnet.h $(CMN)../../../userdefs.h
+ $(COMPILE) $(CMN)HTTelnet.c
+
+$(LOB)/HTFinger$o : $(CMN)HTFinger.c $(CMN)HTUtils.h $(CMN)HTList.h \
+ $(CMN)HTMLDTD.h
+ $(COMPILE) $(CMN)HTFinger.c
+
+$(LOB)/HTStyle$o : $(CMN)HTStyle.c $(CMN)HTUtils.h
+ $(COMPILE) $(CMN)HTStyle.c
+
+$(LOB)/HTAtom$o : $(CMN)HTAtom.c $(CMN)HTUtils.h $(CMN)HTList.h
+ $(COMPILE) $(CMN)HTAtom.c
+
+$(LOB)/HTChunk$o : $(CMN)HTChunk.c $(CMN)HTUtils.h
+ $(COMPILE) $(CMN)HTChunk.c
+
+$(LOB)/HTString$o : $(CMN)HTString.c $(CMN)HTUtils.h $(CMN)Version.make
+ $(COMPILE) -DVC=\"$(VC)\" $(CMN)HTString.c
+
+$(LOB)/HTRules$o : $(CMN)HTRules.c $(CMN)HTUtils.h $(CMN)Version.make \
+ $(CMN)HTAAProt.h
+ $(COMPILE) -DVC=\"$(VC)\" $(CMN)HTRules.c
+
+$(LOB)/SGML$o : $(CMN)SGML.c $(CMN)HTUtils.h $(CMN)UCAux.h
+ $(COMPILE) $(CMN)SGML.c
+
+$(LOB)/HTMLGen$o : $(CMN)HTMLGen.c $(CMN)HTUtils.h $(CMN)HTMLDTD.h
+ $(COMPILE) $(CMN)HTMLGen.c
+
+$(LOB)/HTMLDTD$o : $(CMN)HTMLDTD.c $(CMN)SGML.h
+ $(COMPILE) $(CMN)HTMLDTD.c
+
+$(LOB)/HTPlain$o : $(CMN)HTPlain.c $(CMN)HTPlain.h $(CMN)HTStream.h \
+ $(CMN)UCAux.h
+ $(COMPILE) $(CMN)HTPlain.c
+
+$(LOB)/HTWAIS$o : $(CMN)HTWAIS.c $(CMN)HTUtils.h $(CMN)HTList.h
+ $(COMPILE) $(WAISINC) $(CMN)HTWAIS.c
+
+$(LOB)/HTWSRC$o : $(CMN)HTWSRC.c $(CMN)HTUtils.h $(CMN)HTList.h
+ $(COMPILE) $(CMN)HTWSRC.c
+
+# Access Authorization
+
+$(LOB)/HTAAUtil$o : $(CMN)HTAAUtil.c $(CMN)HTAAUtil.h \
+ $(CMN)HTUtils.h $(CMN)HTString.h
+ $(COMPILE) $(CMN)HTAAUtil.c
+
+$(LOB)/HTGroup$o : $(CMN)HTGroup.c $(CMN)HTGroup.h \
+ $(CMN)HTAAUtil.h \
+ $(CMN)HTAssoc.h $(CMN)HTLex.h
+ $(COMPILE) $(CMN)HTGroup.c
+
+$(LOB)/HTAABrow$o : $(CMN)HTAABrow.c $(CMN)HTAABrow.h \
+ $(CMN)HTAAUtil.h $(CMN)HTUU.h \
+ $(CMN)HTUtils.h $(CMN)HTString.h \
+ $(CMN)HTParse.h $(CMN)HTList.h \
+ $(CMN)HTAssoc.h
+ $(COMPILE) $(CMN)HTAABrow.c
+
+$(LOB)/HTAAProt$o : $(CMN)HTAAProt.c $(CMN)HTAAProt.h \
+ $(CMN)HTUtils.h $(CMN)HTAAUtil.h \
+ $(CMN)HTAssoc.h $(CMN)HTLex.h
+ $(COMPILE) $(CMN)HTAAProt.c
+
+$(LOB)/HTAssoc$o : $(CMN)HTAssoc.c $(CMN)HTAssoc.h \
+ $(CMN)HTUtils.h $(CMN)HTString.h $(CMN)HTList.h
+ $(COMPILE) $(CMN)HTAssoc.c
+
+$(LOB)/HTLex$o : $(CMN)HTLex.c $(CMN)HTLex.h $(CMN)HTUtils.h
+ $(COMPILE) $(CMN)HTLex.c
+
+$(LOB)/HTUU$o : $(CMN)HTUU.c $(CMN)HTUU.h $(CMN)HTUtils.h
+ $(COMPILE) $(CMN)HTUU.c
+
+
+# Communications & Files
+
+$(LOB)/HTTP$o : $(CMN)HTTP.c $(CMN)HTUtils.h $(CMN)HTAABrow.h
+ $(COMPILE) $(CMN)HTTP.c
+
+$(LOB)/HTTCP$o : $(CMN)HTTCP.c $(CMN)HTUtils.h
+ $(COMPILE) $(CMN)HTTCP.c
+
+$(LOB)/HTFile$o : $(CMN)HTFile.c $(CMN)HTUtils.h \
+ $(CMN)HTMLDTD.h
+ $(COMPILE) $(CMN)HTFile.c
+
+$(LOB)/HTBTree$o : $(CMN)HTBTree.c $(CMN)HTUtils.h
+ $(COMPILE) $(CMN)HTBTree.c
+
+$(LOB)/HTFTP$o : $(CMN)HTFTP.c $(CMN)HTUtils.h
+ $(COMPILE) $(CMN)HTFTP.c
+
+$(LOB)/HTAccess$o : $(CMN)HTAccess.c $(CMN)HTUtils.h
+ $(COMPILE) $(CMN)HTAccess.c
+
+$(LOB)/HTParse$o : $(CMN)HTParse.c $(CMN)HTUtils.h
+ $(COMPILE) $(CMN)HTParse.c
+
+$(LOB)/HTVMS_WaisUI$o : $(CMN)HTVMS_WaisUI.c $(CMN)HTUtils.h
+ $(COMPILE) $(CMN)HTVMS_WaisUI.c
+
+$(LOB)/HTDOS$o : $(CMN)HTDOS.c $(CMN)HTUtils.h
+ $(COMPILE) $(CMN)HTDOS.c
+
+# Utilities
+$(LOB)/dtd_util$o : $(CMN)dtd_util.c $(CMN)HTUtils.h
+ $(COMPILE) $(CMN)dtd_util.c
+
+DTD_UTIL = $(LOB)/dtd_util$o $(LOB)/HTMLDTD$o
+
+sources: dtd_util$x src0_HTMLDTD.txt src1_HTMLDTD.txt
+ -rm -f *_HTMLDTD.h
+ ./dtd_util$x -l src0_HTMLDTD.txt -s -c -o src0_HTMLDTD.h
+ ./dtd_util$x -l src1_HTMLDTD.txt -t -c -o src1_HTMLDTD.h
+ ./dtd_util$x -l src0_HTMLDTD.txt -s -h -o hdr_HTMLDTD.h
+
+dtd_util$x: $(DTD_UTIL)
+ $(CC) $(CC_OPTS) $(LDFLAGS) -o $@ $(DTD_UTIL) $(LIBS)
+
+DIFFC = diff -u -I LynxId
+check: dtd_util$x
+ @echo "** comparing builtin src0_HTMLDTD.txt"
+ ./dtd_util$x >HTMLDTD.log
+ -$(DIFFC) src0_HTMLDTD.txt HTMLDTD.log
+
+ @echo "** comparing reloaded src0_HTMLDTD.txt"
+ ./dtd_util$x -l src0_HTMLDTD.txt >HTMLDTD.log
+ -$(DIFFC) src0_HTMLDTD.txt HTMLDTD.log
+
+ @echo "** comparing reloaded src1_HTMLDTD.txt"
+ ./dtd_util$x -t -l src1_HTMLDTD.txt >HTMLDTD.log
+ -$(DIFFC) src1_HTMLDTD.txt HTMLDTD.log
+
+ @echo "** comparing header generated from builtin"
+ ./dtd_util$x -s -h -o HTMLDTD.log
+ -$(DIFFC) hdr_HTMLDTD.h HTMLDTD.log
+ ./dtd_util$x -t -h -o HTMLDTD.log
+ -$(DIFFC) hdr_HTMLDTD.h HTMLDTD.log
+
+ @echo "** comparing header generated by load"
+ ./dtd_util$x -s -h -o HTMLDTD.log -l src0_HTMLDTD.txt
+ -$(DIFFC) hdr_HTMLDTD.h HTMLDTD.log
+ ./dtd_util$x -t -h -o HTMLDTD.log -l src1_HTMLDTD.txt
+ -$(DIFFC) hdr_HTMLDTD.h HTMLDTD.log
+
+ @echo "** comparing strict source generated from builtin"
+ ./dtd_util$x -s -c -o HTMLDTD.log
+ -$(DIFFC) src0_HTMLDTD.h HTMLDTD.log
+
+ @echo "** comparing strict source generated by load"
+ ./dtd_util$x -s -c -o HTMLDTD.log -l src0_HTMLDTD.txt
+ -$(DIFFC) src0_HTMLDTD.h HTMLDTD.log
+
+ @echo "** comparing tagsoup source generated from builtin"
+ ./dtd_util$x -t -c -o HTMLDTD.log
+ -$(DIFFC) src1_HTMLDTD.h HTMLDTD.log
+
+ @echo "** comparing tagsoup source generated by load"
+ ./dtd_util$x -t -c -o HTMLDTD.log -l src1_HTMLDTD.txt
+ -$(DIFFC) src1_HTMLDTD.h HTMLDTD.log
+
+# DO NOT DELETE THIS LINE -- make depend depends on it.
diff --git a/WWW/Library/Implementation/src0_HTMLDTD.h b/WWW/Library/Implementation/src0_HTMLDTD.h
new file mode 100644
index 0000000..a2daa4f
--- /dev/null
+++ b/WWW/Library/Implementation/src0_HTMLDTD.h
@@ -0,0 +1,2478 @@
+/* $LynxId: src0_HTMLDTD.h,v 1.49 2022/09/30 00:04:06 tom Exp $ */
+#ifndef src_HTMLDTD_H0
+#define src_HTMLDTD_H0 1
+
+#ifndef once_HTMLDTD
+#define once_HTMLDTD 1
+
+#define T_A 0x00008,0x0B007,0x0FF17,0x37787,0x77BA7,0x8604F,0x00014
+#define T_ABBR 0x00002,0x8B04F,0x8FFFF,0xA778F,0xF7FBF,0x00003,0x00000
+#define T_ACRONYM 0x00002,0x8B04F,0x8FFFF,0xA778F,0xF7FBF,0x00003,0x00000
+#define T_ADDRESS 0x00200,0x0F14F,0x8FFFF,0x136680,0x1B6FAF,0x80317,0x00000
+#define T_APPLET 0x02000,0x0B0CF,0x8FFFF,0x37F9F,0xB7FBF,0x8300F,0x00000
+#define T_AREA 0x08000,0x00000,0x00000,0x08000,0x3FFFF,0x00F1F,0x00001
+#define T_ARTICLE 0x00200,0x8FBCF,0x8FFFF,0x1B66A0,0x1B7FFF,0x8031F,0x00004
+#define T_ASIDE 0x00200,0x8FBCF,0x8FFFF,0x1B66A0,0x1B7FFF,0x8031F,0x00004
+#define T_AU 0x00002,0x8B04F,0x8FFFF,0xA778F,0xF7FBF,0x00003,0x00000
+#define T_AUTHOR 0x00002,0x8B04F,0x8FFFF,0xA778F,0xF7FBF,0x00003,0x00000
+#define T_B 0x00001,0x8B04F,0xAFFFF,0xA778F,0xF7FBF,0x00001,0x00014
+#define T_BANNER 0x00200,0x0FB8F,0x0FFFF,0x130000,0x130000,0x8031F,0x00000
+#define T_BASE 0x40000,0x00000,0x00000,0x50000,0x50000,0x8000F,0x00001
+#define T_BASEFONT 0x01000,0x00000,0x00000,0x377AF,0x37FAF,0x8F000,0x00001
+#define T_BDO 0x00100,0x0B04F,0x8FFFF,0x136680,0x1B6FAF,0x0033F,0x00000
+#define T_BGSOUND 0x01000,0x00000,0x00000,0x777AF,0x77FAF,0x8730F,0x00001
+#define T_BIG 0x00001,0x8B04F,0x8FFFF,0xA778F,0xF7FBF,0x00001,0x00014
+#define T_BLINK 0x00001,0x8B04F,0x8FFFF,0xA778F,0xF7FAF,0x00001,0x00014
+#define T_BLOCKQUOTE 0x00200,0xAFBCF,0xAFFFF,0x1B6680,0x1B6FAF,0x8031F,0x00000
+#define T_BODY 0x20000,0x12FB8F,0x12FFFF,0x30000,0x30000,0xDFF7F,0x00003
+#define T_BODYTEXT 0x20000,0x10FB8F,0x1AFFFF,0x30200,0xB7FAF,0x8F17F,0x00003
+#define T_BQ 0x00200,0xAFBCF,0xAFFFF,0x1B6680,0x1B6FAF,0x8031F,0x00000
+#define T_BR 0x01000,0x00000,0x00000,0x377BF,0x77FBF,0x8101F,0x00001
+#define T_BUTTON 0x02000,0x0BB07,0x0FF37,0x0378F,0x37FBF,0x8115F,0x00000
+#define T_CAPTION 0x00100,0x0B04F,0x8FFFF,0x106A00,0x1B6FA7,0x8035F,0x00000
+#define T_CENTER 0x00200,0x8FBCF,0x8FFFF,0x1B6680,0x1B6FA7,0x8071F,0x00000
+#define T_CITE 0x00002,0x8B04F,0x8FFFF,0xA778F,0xF7FBF,0x00002,0x00010
+#define T_CODE 0x00002,0x8B04F,0x8FFFF,0xA778F,0xF7FBF,0x00002,0x00000
+#define T_COL 0x04000,0x00000,0x00000,0x00820,0x36FA7,0x88F5F,0x00001
+#define T_COLGROUP 0x00020,0x04000,0x04000,0x00800,0x36FA7,0x8875F,0x00001
+#define T_COMMENT 0x00004,0x00000,0x00000,0xA77AF,0x7FFFF,0x00003,0x00000
+#define T_CREDIT 0x00100,0x0B04F,0x8FFFF,0x106A00,0x1B7FBF,0x8030F,0x00000
+#define T_DD 0x00400,0x0FBCF,0x8FFFF,0x00800,0xB6FFF,0x8071F,0x00001
+#define T_DEL 0x00002,0x8B04F,0x8FEFF,0x87F8F,0xF7FBF,0x100003,0x00000
+#define T_DEL_2 0x100000,0x8BBCF,0x8FFFF,0xA7F8F,0xF7FBF,0x100003,0x00000
+#define T_DFN 0x00002,0x8B0CF,0x8FFFF,0x8778F,0xF7FBF,0x00003,0x00000
+#define T_DIR 0x00800,0x0B400,0x0F75F,0x137680,0x136FB7,0x84F7F,0x00000
+#define T_DIV 0x00200,0x8FBCF,0x8FFFF,0x1B66A0,0x1B7FFF,0x80317,0x00004
+#define T_DL 0x00800,0x0C480,0x8FFFF,0x136680,0x1B7FB7,0x00757,0x00000
+#define T_DLC 0x00800,0x0C480,0x8FFFF,0x136680,0x1B7FB7,0x0075F,0x00000
+#define T_DT 0x00400,0x0B04F,0x0B1FF,0x00800,0x17FFF,0x8071F,0x00001
+#define T_EM 0x00002,0x8B04F,0x8FFFF,0xA778F,0xF7FAF,0x00003,0x00010
+#define T_EMBED 0x02000,0x8F107,0x8FFF7,0xB6FBF,0xB7FBF,0x1FF7F,0x00001
+#define T_FIELDSET 0x00200,0x8FB4F,0x8FF7F,0x186787,0x1B7FF7,0x8805F,0x00000
+#define T_FIG 0x00200,0x0FB00,0x8FFFF,0x136680,0x1B6FBF,0x8834F,0x00000
+#define T_FIGURE 0x00200,0x8FBCF,0x8FFFF,0x1B66A0,0x1B7FFF,0x8031F,0x00004
+#define T_FN 0x00200,0x8FBCF,0x8FFFF,0x1B6680,0x1B7EBF,0x8114F,0x00000
+#define T_FONT 0x00001,0x8B04F,0x8FFFF,0xB778F,0xF7FBF,0x00001,0x00014
+#define T_FOOTER 0x00200,0x8FBCF,0x8FFFF,0x1B66A0,0x1B7FFF,0x8031F,0x00004
+#define T_FORM 0x00080,0x0FF6F,0x0FF7F,0x136E07,0x132F07,0x88DFF,0x00000
+#define T_FRAME 0x10000,0x00000,0x00000,0x10000,0x10000,0x9FFFF,0x00001
+#define T_FRAMESET 0x10000,0x90000,0x90000,0x90000,0x93000,0x9FFFF,0x00000
+#define T_H1 0x00100,0x0B04F,0x0B05F,0x136680,0x137FAF,0x80117,0x00000
+#define T_H2 0x00100,0x0B04F,0x0B05F,0x136680,0x137FAF,0x80117,0x00000
+#define T_H3 0x00100,0x0B04F,0x0B05F,0x136680,0x137FAF,0x80117,0x00000
+#define T_H4 0x00100,0x0B04F,0x0B05F,0x136680,0x137FAF,0x80117,0x00000
+#define T_H5 0x00100,0x0B04F,0x0B05F,0x136680,0x137FAF,0x80117,0x00000
+#define T_H6 0x00100,0x0B04F,0x0B05F,0x136680,0x137FAF,0x80117,0x00000
+#define T_HEAD 0x40000,0x4F000,0x47000,0x10000,0x10000,0x9FF7F,0x00007
+#define T_HEADER 0x00200,0x8FBCF,0x8FFFF,0x1B66A0,0x1B7FFF,0x8031F,0x00004
+#define T_HR 0x04000,0x00000,0x00000,0x3FE80,0x3FFBF,0x87F37,0x00001
+#define T_HTML 0x10000,0x7FB8F,0x7FFFF,0x00000,0x00000,0x1FFFF,0x00003
+#define T_HY 0x01000,0x00000,0x00000,0x3779F,0x77FBF,0x8101F,0x00001
+#define T_I 0x00001,0x8B04F,0x8FFFF,0xA778F,0xF7FBF,0x00001,0x00014
+#define T_IFRAME 0x02000,0x8FBCF,0x8FFFF,0xB679F,0xB6FBF,0xD315F,0x00000
+#define T_IMG 0x01000,0x00000,0x00000,0x3779F,0x37FBF,0x80000,0x00001
+#define T_INPUT 0x00040,0x00000,0x00000,0x03F87,0x37F87,0x8904F,0x00001
+#define T_INS 0x00002,0x8B04F,0x8FEFF,0x87F8F,0xF7FBF,0x100003,0x00000
+#define T_INS_2 0x100000,0x8BBCF,0x8FFFF,0xA7F8F,0xF7FBF,0x100003,0x00000
+#define T_ISINDEX 0x08000,0x00000,0x00000,0x7778F,0x7FFAF,0x80007,0x00001
+#define T_KBD 0x00002,0x00000,0x00000,0x2778F,0x77FBF,0x00003,0x00000
+#define T_KEYGEN 0x00040,0x00000,0x00000,0x07FB7,0x37FB7,0x80070,0x00001
+#define T_LABEL 0x00002,0x0304F,0x0FFFF,0x0679F,0x36FBF,0x00007,0x00000
+#define T_LEGEND 0x00002,0x0B04F,0x8FF7F,0x00200,0xB7FA7,0x00003,0x00000
+#define T_LH 0x00400,0x0BB7F,0x8FFFF,0x00800,0x97FFF,0x8071F,0x00001
+#define T_LI 0x00400,0x0BBFF,0x8FFFF,0x00800,0x97FFF,0x8071F,0x00001
+#define T_LINK 0x08000,0x00000,0x00000,0x50000,0x50000,0x0FF7F,0x00001
+#define T_LISTING 0x00800,0x00000,0x00000,0x136600,0x136F00,0x80F1F,0x00000
+#define T_MAIN 0x00200,0x8FBCF,0x8FFFF,0x1B66A0,0x1B7FFF,0x8031F,0x00004
+#define T_MAP 0x08000,0x08000,0x08000,0x37FCF,0x37FBF,0x0051F,0x00000
+#define T_MARQUEE 0x04000,0x0000F,0x8F01F,0x37787,0xB7FA7,0x8301C,0x00000
+#define T_MATH 0x00004,0x0B05F,0x8FFFF,0x2778F,0xF7FBF,0x0001F,0x00000
+#define T_MENU 0x00800,0x0B400,0x0F75F,0x117680,0x136FB7,0x88F7F,0x00000
+#define T_META 0x08000,0x00000,0x00000,0x50000,0x50000,0x0FF7F,0x00001
+#define T_NAV 0x00200,0x8FBCF,0x8FFFF,0x1B66A0,0x1B7FFF,0x8031F,0x00004
+#define T_NEXTID 0x01000,0x00000,0x00000,0x50000,0x1FFF7,0x00001,0x00001
+#define T_NOFRAMES 0x20000,0x12FB8F,0x10FFFF,0x17000,0x17000,0x0CF5F,0x00000
+#define T_NOTE 0x00200,0x0BBAF,0x8FFFF,0x1376B0,0x1B7FFF,0x8031F,0x00000
+#define T_OBJECT 0x02000,0x8FBCF,0x8FFFF,0xB679F,0xB6FBF,0x83D5F,0x00020
+#define T_OL 0x00800,0x0C400,0x8FFFF,0x137680,0x1B7FB7,0x88F7F,0x00000
+#define T_OPTION 0x08000,0x00000,0x00000,0x00040,0x37FFF,0x8031F,0x00001
+#define T_OVERLAY 0x04000,0x00000,0x00000,0x00200,0x37FBF,0x83F7F,0x00001
+#define T_P 0x00100,0x0B04F,0x8FFFF,0x136680,0x1B6FA7,0x80117,0x00001
+#define T_PARAM 0x01000,0x00000,0x00000,0x33500,0x37FFF,0x81560,0x00001
+#define T_PLAINTEXT 0x10000,0xFFFFF,0xFFFFF,0x90000,0x90000,0x3FFFF,0x00001
+#define T_PRE 0x00200,0x0F04F,0x0F05E,0x136680,0x136FF0,0x8071E,0x00000
+#define T_Q 0x00002,0x8B04F,0x8FFFF,0xA778F,0xF7FAF,0x00003,0x00000
+#define T_S 0x00001,0x8B04F,0x8FFFF,0xA778F,0xF7FBF,0x00001,0x00000
+#define T_SAMP 0x00002,0x8B04F,0x8FFFF,0xA778F,0xF7FBF,0x00002,0x00010
+#define T_SCRIPT 0x02000,0x00000,0x00000,0x77F9F,0x77FFF,0x87D5F,0x00000
+#define T_SECTION 0x00200,0x8FBCF,0x8FFFF,0x1B66A0,0x1B7FFF,0x8031F,0x00004
+#define T_SELECT 0x00040,0x08000,0x08000,0x03FAF,0x33FBF,0x80D5F,0x00008
+#define T_SHY 0x01000,0x00000,0x00000,0x3779F,0x77FBF,0x8101F,0x00001
+#define T_SMALL 0x00001,0x8B04F,0x8FFFF,0xA778F,0xF7FBF,0x00001,0x00014
+#define T_SPAN 0x00002,0x8B04F,0x8FFFF,0xA778F,0xF7FBF,0x80003,0x00000
+#define T_SPOT 0x00008,0x00000,0x00000,0x3FFF7,0x3FFF7,0x00008,0x00001
+#define T_STRIKE 0x00001,0x8B04F,0x8FFFF,0xA778F,0xF7FBF,0x00001,0x00000
+#define T_STRONG 0x00002,0x8B04F,0x8FFFF,0xA778F,0xF7FAF,0x00003,0x00010
+#define T_STYLE 0x40000,0x00000,0x00000,0x7638F,0x76FAF,0x8001F,0x00000
+#define T_SUB 0x00004,0x8B05F,0x8FFFF,0x8779F,0xF7FBF,0x00007,0x00000
+#define T_SUP 0x00004,0x8B05F,0x8FFFF,0x8779F,0xF7FBF,0x00007,0x00000
+#define T_TAB 0x01000,0x00000,0x00000,0x3778F,0x57FAF,0x00001,0x00001
+#define T_TABLE 0x00800,0x0F1E0,0x8FFFF,0x136680,0x1B6FA7,0x8C57F,0x00000
+#define T_TBODY 0x00020,0x00020,0x8FFFF,0x00880,0xB7FB7,0x8C75F,0x00003
+#define T_TD 0x00400,0x0FBCF,0x8FFFF,0x00020,0xB7FB7,0x8C75F,0x00001
+#define T_TEXTAREA 0x00040,0x00000,0x00000,0x07F8F,0x33FBF,0x80D5F,0x00040
+#define T_TEXTFLOW 0x20000,0x18FBFF,0x19FFFF,0x977B0,0xB7FB7,0x9B00F,0x00003
+#define T_TFOOT 0x00020,0x00020,0x8FFFF,0x00800,0xB7FB7,0x8CF5F,0x00001
+#define T_TH 0x00400,0x0FBCF,0x0FFFF,0x00020,0xB7FB7,0x8CF5F,0x00001
+#define T_THEAD 0x00020,0x00020,0x8FFFF,0x00800,0xB7FB7,0x8CF5F,0x00001
+#define T_TITLE 0x40000,0x00000,0x00000,0x50000,0x50000,0x0031F,0x0000C
+#define T_TR 0x00020,0x00400,0x8FFFF,0x00820,0xB7FB7,0x8C75F,0x00001
+#define T_TT 0x00001,0x8B04F,0x8FFFF,0xA778F,0xF7FBF,0x00001,0x00010
+#define T_U 0x00001,0x8B04F,0x8FFFF,0xA778F,0xF7FBF,0x00001,0x00014
+#define T_UL 0x00800,0x0C480,0x8FFFF,0x136680,0x1B7FFF,0x8075F,0x00000
+#define T_VAR 0x00002,0x8B04F,0x8FFFF,0xA778F,0xF7FBF,0x00001,0x00000
+#define T_WBR 0x00001,0x00000,0x00000,0x3778F,0x77FBF,0x8101F,0x00001
+#define T_XMP 0x00800,0x00000,0x00000,0x1367E0,0x136FFF,0x0875F,0x00001
+#define T_OBJECT_PCDATA 0x02000,0x8FBCF,0x8FFFF,0xB679F,0xB6FBF,0x83D5F,0x00008
+#define T__UNREC_ 0x00000,0x00000,0x00000,0x00000,0x00000,0x00000,0x00000
+#ifdef USE_PRETTYSRC
+# define N HTMLA_NORMAL
+# define i HTMLA_ANAME
+# define h HTMLA_HREF
+# define c HTMLA_CLASS
+# define x HTMLA_AUXCLASS
+# define T(t) , t
+#else
+# define T(t) /*nothing */
+#endif
+/* *INDENT-OFF* */
+
+#define ATTR_TYPE(name) #name, name##_attr_list
+
+/* generic attributes, used in different tags */
+static const attr core_attr_list[] = {
+ { "CLASS" T(c) },
+ { "ID" T(i) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType core_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { 0, 0 },
+};
+
+static const attr i18n_attr_list[] = {
+ { "DIR" T(N) },
+ { "LANG" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType i18n_attr_type[] = {
+ { ATTR_TYPE(i18n) },
+ { 0, 0 },
+};
+
+static const attr events_attr_list[] = {
+ { "ONCLICK" T(N) },
+ { "ONDBLCLICK" T(N) },
+ { "ONKEYDOWN" T(N) },
+ { "ONKEYPRESS" T(N) },
+ { "ONKEYUP" T(N) },
+ { "ONMOUSEDOWN" T(N) },
+ { "ONMOUSEMOVE" T(N) },
+ { "ONMOUSEOUT" T(N) },
+ { "ONMOUSEOVER" T(N) },
+ { "ONMOUSEUP" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType events_attr_type[] = {
+ { ATTR_TYPE(events) },
+ { 0, 0 },
+};
+
+static const attr align_attr_list[] = {
+ { "ALIGN" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType align_attr_type[] = {
+ { ATTR_TYPE(align) },
+ { 0, 0 },
+};
+
+static const attr cellalign_attr_list[] = {
+ { "ALIGN" T(N) },
+ { "CHAR" T(N) },
+ { "CHAROFF" T(N) },
+ { "VALIGN" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType cellalign_attr_type[] = {
+ { ATTR_TYPE(cellalign) },
+ { 0, 0 },
+};
+
+static const attr bgcolor_attr_list[] = {
+ { "BGCOLOR" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType bgcolor_attr_type[] = {
+ { ATTR_TYPE(bgcolor) },
+ { 0, 0 },
+};
+
+
+/* tables defining attributes per-tag in terms of generic attributes (editable) */
+static const attr A_attr_list[] = {
+ { "ACCESSKEY" T(N) },
+ { "CHARSET" T(N) },
+ { "CLEAR" T(N) },
+ { "COORDS" T(N) },
+ { "HREF" T(h) },
+ { "HREFLANG" T(N) },
+ { "ISMAP" T(N) },
+ { "MD" T(N) },
+ { "NAME" T(i) },
+ { "NOTAB" T(N) },
+ { "ONBLUR" T(N) },
+ { "ONFOCUS" T(N) },
+ { "REL" T(N) },
+ { "REV" T(N) },
+ { "SHAPE" T(N) },
+ { "TABINDEX" T(N) },
+ { "TARGET" T(N) },
+ { "TYPE" T(N) },
+ { "URN" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType A_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(events) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(A) },
+ { 0, 0 },
+};
+
+static const attr ADDRESS_attr_list[] = {
+ { "CLEAR" T(N) },
+ { "NOWRAP" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType ADDRESS_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(ADDRESS) },
+ { 0, 0 },
+};
+
+static const attr APPLET_attr_list[] = {
+ { "ALT" T(N) },
+ { "CLEAR" T(N) },
+ { "CODE" T(N) },
+ { "CODEBASE" T(h) },
+ { "DOWNLOAD" T(N) },
+ { "HEIGHT" T(N) },
+ { "HSPACE" T(N) },
+ { "NAME" T(i) },
+ { "VSPACE" T(N) },
+ { "WIDTH" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType APPLET_attr_type[] = {
+ { ATTR_TYPE(align) },
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(APPLET) },
+ { 0, 0 },
+};
+
+static const attr AREA_attr_list[] = {
+ { "ACCESSKEY" T(N) },
+ { "ALT" T(N) },
+ { "CLEAR" T(N) },
+ { "COORDS" T(N) },
+ { "HREF" T(h) },
+ { "NOHREF" T(N) },
+ { "NOTAB" T(N) },
+ { "ONBLUR" T(N) },
+ { "ONFOCUS" T(N) },
+ { "SHAPE" T(N) },
+ { "TABINDEX" T(N) },
+ { "TARGET" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType AREA_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(events) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(AREA) },
+ { 0, 0 },
+};
+
+static const attr BASE_attr_list[] = {
+ { "HREF" T(h) },
+ { "TARGET" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType BASE_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(BASE) },
+ { 0, 0 },
+};
+
+static const attr BGSOUND_attr_list[] = {
+ { "CLEAR" T(N) },
+ { "LOOP" T(N) },
+ { "SRC" T(h) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType BGSOUND_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(BGSOUND) },
+ { 0, 0 },
+};
+
+static const attr BODY_attr_list[] = {
+ { "ALINK" T(N) },
+ { "BACKGROUND" T(h) },
+ { "CLEAR" T(N) },
+ { "LINK" T(N) },
+ { "ONLOAD" T(N) },
+ { "ONUNLOAD" T(N) },
+ { "TEXT" T(N) },
+ { "VLINK" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType BODY_attr_type[] = {
+ { ATTR_TYPE(bgcolor) },
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(BODY) },
+ { 0, 0 },
+};
+
+static const attr BODYTEXT_attr_list[] = {
+ { "CLEAR" T(N) },
+ { "DATA" T(N) },
+ { "NAME" T(N) },
+ { "OBJECT" T(N) },
+ { "REF" T(N) },
+ { "TYPE" T(N) },
+ { "VALUE" T(N) },
+ { "VALUETYPE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType BODYTEXT_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(BODYTEXT) },
+ { 0, 0 },
+};
+
+static const attr BQ_attr_list[] = {
+ { "CITE" T(h) },
+ { "CLEAR" T(N) },
+ { "NOWRAP" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType BQ_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(BQ) },
+ { 0, 0 },
+};
+
+static const attr BUTTON_attr_list[] = {
+ { "ACCESSKEY" T(N) },
+ { "CLEAR" T(N) },
+ { "DISABLED" T(N) },
+ { "FORMACTION" T(N) },
+ { "NAME" T(N) },
+ { "ONBLUR" T(N) },
+ { "ONFOCUS" T(N) },
+ { "READONLY" T(N) },
+ { "TABINDEX" T(N) },
+ { "TYPE" T(N) },
+ { "VALUE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType BUTTON_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(events) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(BUTTON) },
+ { 0, 0 },
+};
+
+static const attr CAPTION_attr_list[] = {
+ { "ACCESSKEY" T(N) },
+ { "CLEAR" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType CAPTION_attr_type[] = {
+ { ATTR_TYPE(align) },
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(events) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(CAPTION) },
+ { 0, 0 },
+};
+
+static const attr COL_attr_list[] = {
+ { "CLEAR" T(N) },
+ { "SPAN" T(N) },
+ { "WIDTH" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType COL_attr_type[] = {
+ { ATTR_TYPE(cellalign) },
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(events) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(COL) },
+ { 0, 0 },
+};
+
+static const attr DEL_attr_list[] = {
+ { "CITE" T(N) },
+ { "DATETIME" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType DEL_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(events) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(DEL) },
+ { 0, 0 },
+};
+
+static const attr DIV_attr_list[] = {
+ { "CLEAR" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType DIV_attr_type[] = {
+ { ATTR_TYPE(align) },
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(DIV) },
+ { 0, 0 },
+};
+
+static const attr DL_attr_list[] = {
+ { "CLEAR" T(N) },
+ { "COMPACT" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType DL_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(DL) },
+ { 0, 0 },
+};
+
+static const attr EMBED_attr_list[] = {
+ { "ALT" T(N) },
+ { "BORDER" T(N) },
+ { "CLEAR" T(N) },
+ { "HEIGHT" T(N) },
+ { "IMAGEMAP" T(N) },
+ { "ISMAP" T(N) },
+ { "MD" T(N) },
+ { "NAME" T(i) },
+ { "NOFLOW" T(N) },
+ { "PARAMS" T(N) },
+ { "SRC" T(h) },
+ { "UNITS" T(N) },
+ { "USEMAP" T(N) },
+ { "WIDTH" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType EMBED_attr_type[] = {
+ { ATTR_TYPE(align) },
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(EMBED) },
+ { 0, 0 },
+};
+
+static const attr FIG_attr_list[] = {
+ { "BORDER" T(N) },
+ { "CLEAR" T(N) },
+ { "HEIGHT" T(N) },
+ { "IMAGEMAP" T(N) },
+ { "ISOBJECT" T(N) },
+ { "MD" T(N) },
+ { "NOFLOW" T(N) },
+ { "SRC" T(h) },
+ { "UNITS" T(N) },
+ { "WIDTH" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType FIG_attr_type[] = {
+ { ATTR_TYPE(align) },
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(FIG) },
+ { 0, 0 },
+};
+
+static const attr FONT_attr_list[] = {
+ { "CLEAR" T(N) },
+ { "COLOR" T(N) },
+ { "END" T(N) },
+ { "FACE" T(N) },
+ { "SIZE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType FONT_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(FONT) },
+ { 0, 0 },
+};
+
+static const attr FORM_attr_list[] = {
+ { "ACCEPT" T(N) },
+ { "ACCEPT-CHARSET" T(N) },
+ { "ACTION" T(h) },
+ { "CLEAR" T(N) },
+ { "ENCTYPE" T(N) },
+ { "METHOD" T(N) },
+ { "ONRESET" T(N) },
+ { "ONSUBMIT" T(N) },
+ { "SCRIPT" T(N) },
+ { "SUBJECT" T(N) },
+ { "TARGET" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType FORM_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(FORM) },
+ { 0, 0 },
+};
+
+static const attr FRAME_attr_list[] = {
+ { "FRAMEBORDER" T(N) },
+ { "LONGDESC" T(h) },
+ { "MARGINHEIGHT" T(N) },
+ { "MARGINWIDTH" T(N) },
+ { "NAME" T(N) },
+ { "NORESIZE" T(N) },
+ { "SCROLLING" T(N) },
+ { "SRC" T(h) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType FRAME_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(FRAME) },
+ { 0, 0 },
+};
+
+static const attr FRAMESET_attr_list[] = {
+ { "COLS" T(N) },
+ { "ONLOAD" T(N) },
+ { "ONUNLOAD" T(N) },
+ { "ROWS" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType FRAMESET_attr_type[] = {
+ { ATTR_TYPE(FRAMESET) },
+ { 0, 0 },
+};
+
+static const attr GEN_attr_list[] = {
+ { "CLEAR" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType GEN_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(events) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(GEN) },
+ { 0, 0 },
+};
+
+static const attr GEN5_attr_list[] = {
+ { "ROLE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType GEN5_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(events) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(GEN5) },
+ { 0, 0 },
+};
+
+static const attr H_attr_list[] = {
+ { "CLEAR" T(N) },
+ { "DINGBAT" T(N) },
+ { "MD" T(N) },
+ { "NOWRAP" T(N) },
+ { "SEQNUM" T(N) },
+ { "SKIP" T(N) },
+ { "SRC" T(h) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType H_attr_type[] = {
+ { ATTR_TYPE(align) },
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(events) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(H) },
+ { 0, 0 },
+};
+
+static const attr HR_attr_list[] = {
+ { "CLEAR" T(N) },
+ { "MD" T(N) },
+ { "NOSHADE" T(N) },
+ { "SIZE" T(N) },
+ { "SRC" T(h) },
+ { "WIDTH" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType HR_attr_type[] = {
+ { ATTR_TYPE(align) },
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(HR) },
+ { 0, 0 },
+};
+
+static const attr IFRAME_attr_list[] = {
+ { "FRAMEBORDER" T(N) },
+ { "HEIGHT" T(N) },
+ { "LONGDESC" T(h) },
+ { "MARGINHEIGHT" T(N) },
+ { "MARGINWIDTH" T(N) },
+ { "NAME" T(N) },
+ { "SCROLLING" T(N) },
+ { "SRC" T(h) },
+ { "WIDTH" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType IFRAME_attr_type[] = {
+ { ATTR_TYPE(align) },
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(IFRAME) },
+ { 0, 0 },
+};
+
+static const attr IMG_attr_list[] = {
+ { "ALT" T(N) },
+ { "BORDER" T(N) },
+ { "CLEAR" T(N) },
+ { "HEIGHT" T(N) },
+ { "HSPACE" T(N) },
+ { "ISMAP" T(N) },
+ { "ISOBJECT" T(N) },
+ { "LONGDESC" T(h) },
+ { "MD" T(N) },
+ { "NAME" T(N) },
+ { "SRC" T(h) },
+ { "UNITS" T(N) },
+ { "USEMAP" T(h) },
+ { "VSPACE" T(N) },
+ { "WIDTH" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType IMG_attr_type[] = {
+ { ATTR_TYPE(align) },
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(events) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(IMG) },
+ { 0, 0 },
+};
+
+static const attr INPUT_attr_list[] = {
+ { "ACCEPT" T(N) },
+ { "ACCEPT-CHARSET" T(N) },
+ { "ACCESSKEY" T(N) },
+ { "ALT" T(N) },
+ { "CHECKED" T(N) },
+ { "CLEAR" T(N) },
+ { "DISABLED" T(N) },
+ { "ERROR" T(N) },
+ { "HEIGHT" T(N) },
+ { "ISMAP" T(N) },
+ { "MAX" T(N) },
+ { "MAXLENGTH" T(N) },
+ { "MD" T(N) },
+ { "MIN" T(N) },
+ { "NAME" T(N) },
+ { "NOTAB" T(N) },
+ { "ONBLUR" T(N) },
+ { "ONCHANGE" T(N) },
+ { "ONFOCUS" T(N) },
+ { "ONSELECT" T(N) },
+ { "READONLY" T(N) },
+ { "SIZE" T(N) },
+ { "SRC" T(h) },
+ { "TABINDEX" T(N) },
+ { "TYPE" T(N) },
+ { "USEMAP" T(N) },
+ { "VALUE" T(N) },
+ { "WIDTH" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType INPUT_attr_type[] = {
+ { ATTR_TYPE(align) },
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(events) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(INPUT) },
+ { 0, 0 },
+};
+
+static const attr ISINDEX_attr_list[] = {
+ { "ACTION" T(h) },
+ { "HREF" T(h) },
+ { "PROMPT" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType ISINDEX_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(ISINDEX) },
+ { 0, 0 },
+};
+
+static const attr KEYGEN_attr_list[] = {
+ { "CHALLENGE" T(N) },
+ { "NAME" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType KEYGEN_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(KEYGEN) },
+ { 0, 0 },
+};
+
+static const attr LABEL_attr_list[] = {
+ { "ACCESSKEY" T(N) },
+ { "CLEAR" T(N) },
+ { "FOR" T(N) },
+ { "ONBLUR" T(N) },
+ { "ONFOCUS" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType LABEL_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(events) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(LABEL) },
+ { 0, 0 },
+};
+
+static const attr LI_attr_list[] = {
+ { "CLEAR" T(N) },
+ { "DINGBAT" T(N) },
+ { "MD" T(N) },
+ { "SKIP" T(N) },
+ { "SRC" T(h) },
+ { "TYPE" T(N) },
+ { "VALUE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType LI_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(events) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(LI) },
+ { 0, 0 },
+};
+
+static const attr LINK_attr_list[] = {
+ { "CHARSET" T(N) },
+ { "HREF" T(h) },
+ { "HREFLANG" T(N) },
+ { "MEDIA" T(N) },
+ { "REL" T(N) },
+ { "REV" T(N) },
+ { "TARGET" T(N) },
+ { "TYPE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType LINK_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(events) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(LINK) },
+ { 0, 0 },
+};
+
+static const attr MAP_attr_list[] = {
+ { "CLEAR" T(N) },
+ { "NAME" T(i) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType MAP_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(MAP) },
+ { 0, 0 },
+};
+
+static const attr MATH_attr_list[] = {
+ { "BOX" T(N) },
+ { "CLEAR" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType MATH_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(MATH) },
+ { 0, 0 },
+};
+
+static const attr META_attr_list[] = {
+ { "CHARSET" T(N) },
+ { "CONTENT" T(N) },
+ { "HTTP-EQUIV" T(N) },
+ { "NAME" T(N) },
+ { "SCHEME" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType META_attr_type[] = {
+ { ATTR_TYPE(META) },
+ { 0, 0 },
+};
+
+static const attr NEXTID_attr_list[] = {
+ { "N" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType NEXTID_attr_type[] = {
+ { ATTR_TYPE(NEXTID) },
+ { 0, 0 },
+};
+
+static const attr NOTE_attr_list[] = {
+ { "CLEAR" T(N) },
+ { "MD" T(N) },
+ { "ROLE" T(x) },
+ { "SRC" T(h) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType NOTE_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(NOTE) },
+ { 0, 0 },
+};
+
+static const attr OBJECT_attr_list[] = {
+ { "ARCHIVE" T(N) },
+ { "BORDER" T(N) },
+ { "CLASSID" T(h) },
+ { "CODEBASE" T(h) },
+ { "CODETYPE" T(N) },
+ { "DATA" T(h) },
+ { "DECLARE" T(N) },
+ { "HEIGHT" T(N) },
+ { "HSPACE" T(N) },
+ { "ISMAP" T(N) },
+ { "NAME" T(N) },
+ { "NOTAB" T(N) },
+ { "SHAPES" T(N) },
+ { "STANDBY" T(N) },
+ { "TABINDEX" T(N) },
+ { "TYPE" T(N) },
+ { "USEMAP" T(h) },
+ { "VSPACE" T(N) },
+ { "WIDTH" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType OBJECT_attr_type[] = {
+ { ATTR_TYPE(align) },
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(events) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(OBJECT) },
+ { 0, 0 },
+};
+
+static const attr OL_attr_list[] = {
+ { "CLEAR" T(N) },
+ { "COMPACT" T(N) },
+ { "CONTINUE" T(N) },
+ { "SEQNUM" T(N) },
+ { "START" T(N) },
+ { "TYPE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType OL_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(OL) },
+ { 0, 0 },
+};
+
+static const attr OPTION_attr_list[] = {
+ { "CLEAR" T(N) },
+ { "DISABLED" T(N) },
+ { "ERROR" T(N) },
+ { "LABEL" T(N) },
+ { "SELECTED" T(N) },
+ { "SHAPE" T(N) },
+ { "VALUE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType OPTION_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(events) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(OPTION) },
+ { 0, 0 },
+};
+
+static const attr OVERLAY_attr_list[] = {
+ { "HEIGHT" T(N) },
+ { "IMAGEMAP" T(N) },
+ { "MD" T(N) },
+ { "SRC" T(h) },
+ { "UNITS" T(N) },
+ { "WIDTH" T(N) },
+ { "X" T(N) },
+ { "Y" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType OVERLAY_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(OVERLAY) },
+ { 0, 0 },
+};
+
+static const attr P_attr_list[] = {
+ { "CLEAR" T(N) },
+ { "NOWRAP" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType P_attr_type[] = {
+ { ATTR_TYPE(align) },
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(P) },
+ { 0, 0 },
+};
+
+static const attr PARAM_attr_list[] = {
+ { "ACCEPT" T(N) },
+ { "ACCEPT-CHARSET" T(N) },
+ { "ACCEPT-ENCODING" T(N) },
+ { "CLEAR" T(N) },
+ { "DATA" T(N) },
+ { "NAME" T(N) },
+ { "OBJECT" T(N) },
+ { "REF" T(N) },
+ { "TYPE" T(N) },
+ { "VALUE" T(N) },
+ { "VALUEREF" T(N) },
+ { "VALUETYPE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType PARAM_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(PARAM) },
+ { 0, 0 },
+};
+
+static const attr Q_attr_list[] = {
+ { "CITE" T(h) },
+ { "CLEAR" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType Q_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(Q) },
+ { 0, 0 },
+};
+
+static const attr SCRIPT_attr_list[] = {
+ { "CHARSET" T(N) },
+ { "CLEAR" T(N) },
+ { "DEFER" T(N) },
+ { "EVENT" T(N) },
+ { "FOR" T(N) },
+ { "LANGUAGE" T(N) },
+ { "NAME" T(N) },
+ { "SCRIPTENGINE" T(N) },
+ { "SRC" T(h) },
+ { "TYPE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType SCRIPT_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(SCRIPT) },
+ { 0, 0 },
+};
+
+static const attr SELECT_attr_list[] = {
+ { "CLEAR" T(N) },
+ { "DISABLED" T(N) },
+ { "ERROR" T(N) },
+ { "HEIGHT" T(N) },
+ { "MD" T(N) },
+ { "MULTIPLE" T(N) },
+ { "NAME" T(N) },
+ { "NOTAB" T(N) },
+ { "ONBLUR" T(N) },
+ { "ONCHANGE" T(N) },
+ { "ONFOCUS" T(N) },
+ { "SIZE" T(N) },
+ { "TABINDEX" T(N) },
+ { "UNITS" T(N) },
+ { "WIDTH" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType SELECT_attr_type[] = {
+ { ATTR_TYPE(align) },
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(SELECT) },
+ { 0, 0 },
+};
+
+static const attr STYLE_attr_list[] = {
+ { "MEDIA" T(N) },
+ { "NOTATION" T(N) },
+ { "TYPE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType STYLE_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(STYLE) },
+ { 0, 0 },
+};
+
+static const attr TAB_attr_list[] = {
+ { "CLEAR" T(N) },
+ { "DP" T(N) },
+ { "INDENT" T(N) },
+ { "TO" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType TAB_attr_type[] = {
+ { ATTR_TYPE(align) },
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(TAB) },
+ { 0, 0 },
+};
+
+static const attr TABLE_attr_list[] = {
+ { "BACKGROUND" T(h) },
+ { "BORDER" T(N) },
+ { "CELLPADDING" T(N) },
+ { "CELLSPACING" T(N) },
+ { "CLEAR" T(N) },
+ { "COLS" T(N) },
+ { "COLSPEC" T(N) },
+ { "DP" T(N) },
+ { "FRAME" T(N) },
+ { "NOFLOW" T(N) },
+ { "NOWRAP" T(N) },
+ { "RULES" T(N) },
+ { "SUMMARY" T(N) },
+ { "UNITS" T(N) },
+ { "WIDTH" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType TABLE_attr_type[] = {
+ { ATTR_TYPE(align) },
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(events) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(TABLE) },
+ { 0, 0 },
+};
+
+static const attr TD_attr_list[] = {
+ { "ABBR" T(N) },
+ { "AXES" T(N) },
+ { "AXIS" T(N) },
+ { "BACKGROUND" T(h) },
+ { "CLEAR" T(N) },
+ { "COLSPAN" T(N) },
+ { "DP" T(N) },
+ { "HEADERS" T(N) },
+ { "HEIGHT" T(N) },
+ { "NOWRAP" T(N) },
+ { "ROWSPAN" T(N) },
+ { "SCOPE" T(N) },
+ { "WIDTH" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType TD_attr_type[] = {
+ { ATTR_TYPE(cellalign) },
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(TD) },
+ { 0, 0 },
+};
+
+static const attr TEXTAREA_attr_list[] = {
+ { "ACCEPT-CHARSET" T(N) },
+ { "ACCESSKEY" T(N) },
+ { "CLEAR" T(N) },
+ { "COLS" T(N) },
+ { "DISABLED" T(N) },
+ { "ERROR" T(N) },
+ { "NAME" T(N) },
+ { "NOTAB" T(N) },
+ { "ONBLUR" T(N) },
+ { "ONCHANGE" T(N) },
+ { "ONFOCUS" T(N) },
+ { "ONSELECT" T(N) },
+ { "READONLY" T(N) },
+ { "ROWS" T(N) },
+ { "TABINDEX" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType TEXTAREA_attr_type[] = {
+ { ATTR_TYPE(align) },
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(events) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(TEXTAREA) },
+ { 0, 0 },
+};
+
+static const attr TR_attr_list[] = {
+ { "CLEAR" T(N) },
+ { "DP" T(N) },
+ { "NOWRAP" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType TR_attr_type[] = {
+ { ATTR_TYPE(cellalign) },
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(events) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(TR) },
+ { 0, 0 },
+};
+
+static const attr UL_attr_list[] = {
+ { "CLEAR" T(N) },
+ { "COMPACT" T(N) },
+ { "DINGBAT" T(N) },
+ { "MD" T(N) },
+ { "PLAIN" T(N) },
+ { "SRC" T(h) },
+ { "TYPE" T(N) },
+ { "WRAP" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType UL_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(UL) },
+ { 0, 0 },
+};
+
+
+/* attribute lists for the runtime (generated by dtd_util) */
+static const attr A_attr[] = { /* A attributes */
+ { "ACCESSKEY" T(N) },
+ { "CHARSET" T(N) },
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "COORDS" T(N) },
+ { "DIR" T(N) },
+ { "HREF" T(h) },
+ { "HREFLANG" T(N) },
+ { "ID" T(i) },
+ { "ISMAP" T(N) },
+ { "LANG" T(N) },
+ { "MD" T(N) },
+ { "NAME" T(i) },
+ { "NOTAB" T(N) },
+ { "ONBLUR" T(N) },
+ { "ONFOCUS" T(N) },
+ { "REL" T(N) },
+ { "REV" T(N) },
+ { "SHAPE" T(N) },
+ { "STYLE" T(N) },
+ { "TABINDEX" T(N) },
+ { "TARGET" T(N) },
+ { "TITLE" T(N) },
+ { "TYPE" T(N) },
+ { "URN" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr ADDRESS_attr[] = { /* ADDRESS attributes */
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DIR" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "NOWRAP" T(N) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr APPLET_attr[] = { /* APPLET attributes */
+ { "ALIGN" T(N) },
+ { "ALT" T(N) },
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "CODE" T(N) },
+ { "CODEBASE" T(h) },
+ { "DIR" T(N) },
+ { "DOWNLOAD" T(N) },
+ { "HEIGHT" T(N) },
+ { "HSPACE" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "NAME" T(i) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { "VSPACE" T(N) },
+ { "WIDTH" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr AREA_attr[] = { /* AREA attributes */
+ { "ACCESSKEY" T(N) },
+ { "ALT" T(N) },
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "COORDS" T(N) },
+ { "DIR" T(N) },
+ { "HREF" T(h) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "NOHREF" T(N) },
+ { "NOTAB" T(N) },
+ { "ONBLUR" T(N) },
+ { "ONFOCUS" T(N) },
+ { "SHAPE" T(N) },
+ { "STYLE" T(N) },
+ { "TABINDEX" T(N) },
+ { "TARGET" T(N) },
+ { "TITLE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr BASE_attr[] = { /* BASE attributes */
+ { "CLASS" T(c) },
+ { "HREF" T(h) },
+ { "ID" T(i) },
+ { "STYLE" T(N) },
+ { "TARGET" T(N) },
+ { "TITLE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr BGSOUND_attr[] = { /* BGSOUND attributes */
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DIR" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "LOOP" T(N) },
+ { "SRC" T(h) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr BODY_attr[] = { /* BODY attributes */
+ { "ALINK" T(N) },
+ { "BACKGROUND" T(h) },
+ { "BGCOLOR" T(N) },
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DIR" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "LINK" T(N) },
+ { "ONLOAD" T(N) },
+ { "ONUNLOAD" T(N) },
+ { "STYLE" T(N) },
+ { "TEXT" T(N) },
+ { "TITLE" T(N) },
+ { "VLINK" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr BODYTEXT_attr[] = { /* BODYTEXT attributes */
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DATA" T(N) },
+ { "DIR" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "NAME" T(N) },
+ { "OBJECT" T(N) },
+ { "REF" T(N) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { "TYPE" T(N) },
+ { "VALUE" T(N) },
+ { "VALUETYPE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr BQ_attr[] = { /* BLOCKQUOTE attributes */
+ { "CITE" T(h) },
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DIR" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "NOWRAP" T(N) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr BUTTON_attr[] = { /* BUTTON attributes */
+ { "ACCESSKEY" T(N) },
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DIR" T(N) },
+ { "DISABLED" T(N) },
+ { "FORMACTION" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "NAME" T(N) },
+ { "ONBLUR" T(N) },
+ { "ONFOCUS" T(N) },
+ { "READONLY" T(N) },
+ { "STYLE" T(N) },
+ { "TABINDEX" T(N) },
+ { "TITLE" T(N) },
+ { "TYPE" T(N) },
+ { "VALUE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr CAPTION_attr[] = { /* CAPTION attributes */
+ { "ACCESSKEY" T(N) },
+ { "ALIGN" T(N) },
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DIR" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr COL_attr[] = { /* COL attributes */
+ { "ALIGN" T(N) },
+ { "CHAR" T(N) },
+ { "CHAROFF" T(N) },
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DIR" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "SPAN" T(N) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { "VALIGN" T(N) },
+ { "WIDTH" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr DEL_attr[] = { /* DEL attributes */
+ { "CITE" T(N) },
+ { "CLASS" T(c) },
+ { "DATETIME" T(N) },
+ { "DIR" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr DIV_attr[] = { /* CENTER attributes */
+ { "ALIGN" T(N) },
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DIR" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr DL_attr[] = { /* DL attributes */
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "COMPACT" T(N) },
+ { "DIR" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr EMBED_attr[] = { /* EMBED attributes */
+ { "ALIGN" T(N) },
+ { "ALT" T(N) },
+ { "BORDER" T(N) },
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DIR" T(N) },
+ { "HEIGHT" T(N) },
+ { "ID" T(i) },
+ { "IMAGEMAP" T(N) },
+ { "ISMAP" T(N) },
+ { "LANG" T(N) },
+ { "MD" T(N) },
+ { "NAME" T(i) },
+ { "NOFLOW" T(N) },
+ { "PARAMS" T(N) },
+ { "SRC" T(h) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { "UNITS" T(N) },
+ { "USEMAP" T(N) },
+ { "WIDTH" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr FIG_attr[] = { /* FIG attributes */
+ { "ALIGN" T(N) },
+ { "BORDER" T(N) },
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DIR" T(N) },
+ { "HEIGHT" T(N) },
+ { "ID" T(i) },
+ { "IMAGEMAP" T(N) },
+ { "ISOBJECT" T(N) },
+ { "LANG" T(N) },
+ { "MD" T(N) },
+ { "NOFLOW" T(N) },
+ { "SRC" T(h) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { "UNITS" T(N) },
+ { "WIDTH" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr FONT_attr[] = { /* BASEFONT attributes */
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "COLOR" T(N) },
+ { "DIR" T(N) },
+ { "END" T(N) },
+ { "FACE" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "SIZE" T(N) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr FORM_attr[] = { /* FORM attributes */
+ { "ACCEPT" T(N) },
+ { "ACCEPT-CHARSET" T(N) },
+ { "ACTION" T(h) },
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DIR" T(N) },
+ { "ENCTYPE" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "METHOD" T(N) },
+ { "ONRESET" T(N) },
+ { "ONSUBMIT" T(N) },
+ { "SCRIPT" T(N) },
+ { "STYLE" T(N) },
+ { "SUBJECT" T(N) },
+ { "TARGET" T(N) },
+ { "TITLE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr FRAME_attr[] = { /* FRAME attributes */
+ { "CLASS" T(c) },
+ { "FRAMEBORDER" T(N) },
+ { "ID" T(i) },
+ { "LONGDESC" T(h) },
+ { "MARGINHEIGHT" T(N) },
+ { "MARGINWIDTH" T(N) },
+ { "NAME" T(N) },
+ { "NORESIZE" T(N) },
+ { "SCROLLING" T(N) },
+ { "SRC" T(h) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr FRAMESET_attr[] = { /* FRAMESET attributes */
+ { "COLS" T(N) },
+ { "ONLOAD" T(N) },
+ { "ONUNLOAD" T(N) },
+ { "ROWS" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr GEN_attr[] = { /* ABBR attributes */
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DIR" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr GEN5_attr[] = { /* ARTICLE attributes */
+ { "CLASS" T(c) },
+ { "DIR" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "ROLE" T(N) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr H_attr[] = { /* H1 attributes */
+ { "ALIGN" T(N) },
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DINGBAT" T(N) },
+ { "DIR" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "MD" T(N) },
+ { "NOWRAP" T(N) },
+ { "SEQNUM" T(N) },
+ { "SKIP" T(N) },
+ { "SRC" T(h) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr HR_attr[] = { /* HR attributes */
+ { "ALIGN" T(N) },
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DIR" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "MD" T(N) },
+ { "NOSHADE" T(N) },
+ { "SIZE" T(N) },
+ { "SRC" T(h) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { "WIDTH" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr IFRAME_attr[] = { /* IFRAME attributes */
+ { "ALIGN" T(N) },
+ { "CLASS" T(c) },
+ { "FRAMEBORDER" T(N) },
+ { "HEIGHT" T(N) },
+ { "ID" T(i) },
+ { "LONGDESC" T(h) },
+ { "MARGINHEIGHT" T(N) },
+ { "MARGINWIDTH" T(N) },
+ { "NAME" T(N) },
+ { "SCROLLING" T(N) },
+ { "SRC" T(h) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { "WIDTH" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr IMG_attr[] = { /* IMG attributes */
+ { "ALIGN" T(N) },
+ { "ALT" T(N) },
+ { "BORDER" T(N) },
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DIR" T(N) },
+ { "HEIGHT" T(N) },
+ { "HSPACE" T(N) },
+ { "ID" T(i) },
+ { "ISMAP" T(N) },
+ { "ISOBJECT" T(N) },
+ { "LANG" T(N) },
+ { "LONGDESC" T(h) },
+ { "MD" T(N) },
+ { "NAME" T(N) },
+ { "SRC" T(h) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { "UNITS" T(N) },
+ { "USEMAP" T(h) },
+ { "VSPACE" T(N) },
+ { "WIDTH" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr INPUT_attr[] = { /* INPUT attributes */
+ { "ACCEPT" T(N) },
+ { "ACCEPT-CHARSET" T(N) },
+ { "ACCESSKEY" T(N) },
+ { "ALIGN" T(N) },
+ { "ALT" T(N) },
+ { "CHECKED" T(N) },
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DIR" T(N) },
+ { "DISABLED" T(N) },
+ { "ERROR" T(N) },
+ { "HEIGHT" T(N) },
+ { "ID" T(i) },
+ { "ISMAP" T(N) },
+ { "LANG" T(N) },
+ { "MAX" T(N) },
+ { "MAXLENGTH" T(N) },
+ { "MD" T(N) },
+ { "MIN" T(N) },
+ { "NAME" T(N) },
+ { "NOTAB" T(N) },
+ { "ONBLUR" T(N) },
+ { "ONCHANGE" T(N) },
+ { "ONFOCUS" T(N) },
+ { "ONSELECT" T(N) },
+ { "READONLY" T(N) },
+ { "SIZE" T(N) },
+ { "SRC" T(h) },
+ { "STYLE" T(N) },
+ { "TABINDEX" T(N) },
+ { "TITLE" T(N) },
+ { "TYPE" T(N) },
+ { "USEMAP" T(N) },
+ { "VALUE" T(N) },
+ { "WIDTH" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr ISINDEX_attr[] = { /* ISINDEX attributes */
+ { "ACTION" T(h) },
+ { "CLASS" T(c) },
+ { "DIR" T(N) },
+ { "HREF" T(h) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "PROMPT" T(N) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr KEYGEN_attr[] = { /* KEYGEN attributes */
+ { "CHALLENGE" T(N) },
+ { "CLASS" T(c) },
+ { "DIR" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "NAME" T(N) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr LABEL_attr[] = { /* LABEL attributes */
+ { "ACCESSKEY" T(N) },
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DIR" T(N) },
+ { "FOR" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "ONBLUR" T(N) },
+ { "ONFOCUS" T(N) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr LI_attr[] = { /* LI attributes */
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DINGBAT" T(N) },
+ { "DIR" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "MD" T(N) },
+ { "SKIP" T(N) },
+ { "SRC" T(h) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { "TYPE" T(N) },
+ { "VALUE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr LINK_attr[] = { /* LINK attributes */
+ { "CHARSET" T(N) },
+ { "CLASS" T(c) },
+ { "DIR" T(N) },
+ { "HREF" T(h) },
+ { "HREFLANG" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "MEDIA" T(N) },
+ { "REL" T(N) },
+ { "REV" T(N) },
+ { "STYLE" T(N) },
+ { "TARGET" T(N) },
+ { "TITLE" T(N) },
+ { "TYPE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr MAP_attr[] = { /* MAP attributes */
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DIR" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "NAME" T(i) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr MATH_attr[] = { /* MATH attributes */
+ { "BOX" T(N) },
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DIR" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr META_attr[] = { /* META attributes */
+ { "CHARSET" T(N) },
+ { "CONTENT" T(N) },
+ { "HTTP-EQUIV" T(N) },
+ { "NAME" T(N) },
+ { "SCHEME" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr NEXTID_attr[] = { /* NEXTID attributes */
+ { "N" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr NOTE_attr[] = { /* NOTE attributes */
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DIR" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "MD" T(N) },
+ { "ROLE" T(x) },
+ { "SRC" T(h) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr OBJECT_attr[] = { /* OBJECT attributes */
+ { "ALIGN" T(N) },
+ { "ARCHIVE" T(N) },
+ { "BORDER" T(N) },
+ { "CLASS" T(c) },
+ { "CLASSID" T(h) },
+ { "CODEBASE" T(h) },
+ { "CODETYPE" T(N) },
+ { "DATA" T(h) },
+ { "DECLARE" T(N) },
+ { "DIR" T(N) },
+ { "HEIGHT" T(N) },
+ { "HSPACE" T(N) },
+ { "ID" T(i) },
+ { "ISMAP" T(N) },
+ { "LANG" T(N) },
+ { "NAME" T(N) },
+ { "NOTAB" T(N) },
+ { "SHAPES" T(N) },
+ { "STANDBY" T(N) },
+ { "STYLE" T(N) },
+ { "TABINDEX" T(N) },
+ { "TITLE" T(N) },
+ { "TYPE" T(N) },
+ { "USEMAP" T(h) },
+ { "VSPACE" T(N) },
+ { "WIDTH" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr OL_attr[] = { /* OL attributes */
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "COMPACT" T(N) },
+ { "CONTINUE" T(N) },
+ { "DIR" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "SEQNUM" T(N) },
+ { "START" T(N) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { "TYPE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr OPTION_attr[] = { /* OPTION attributes */
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DIR" T(N) },
+ { "DISABLED" T(N) },
+ { "ERROR" T(N) },
+ { "ID" T(i) },
+ { "LABEL" T(N) },
+ { "LANG" T(N) },
+ { "SELECTED" T(N) },
+ { "SHAPE" T(N) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { "VALUE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr OVERLAY_attr[] = { /* OVERLAY attributes */
+ { "CLASS" T(c) },
+ { "HEIGHT" T(N) },
+ { "ID" T(i) },
+ { "IMAGEMAP" T(N) },
+ { "MD" T(N) },
+ { "SRC" T(h) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { "UNITS" T(N) },
+ { "WIDTH" T(N) },
+ { "X" T(N) },
+ { "Y" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr P_attr[] = { /* P attributes */
+ { "ALIGN" T(N) },
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DIR" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "NOWRAP" T(N) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr PARAM_attr[] = { /* PARAM attributes */
+ { "ACCEPT" T(N) },
+ { "ACCEPT-CHARSET" T(N) },
+ { "ACCEPT-ENCODING" T(N) },
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DATA" T(N) },
+ { "DIR" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "NAME" T(N) },
+ { "OBJECT" T(N) },
+ { "REF" T(N) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { "TYPE" T(N) },
+ { "VALUE" T(N) },
+ { "VALUEREF" T(N) },
+ { "VALUETYPE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr Q_attr[] = { /* Q attributes */
+ { "CITE" T(h) },
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DIR" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr SCRIPT_attr[] = { /* SCRIPT attributes */
+ { "CHARSET" T(N) },
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DEFER" T(N) },
+ { "DIR" T(N) },
+ { "EVENT" T(N) },
+ { "FOR" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "LANGUAGE" T(N) },
+ { "NAME" T(N) },
+ { "SCRIPTENGINE" T(N) },
+ { "SRC" T(h) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { "TYPE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr SELECT_attr[] = { /* SELECT attributes */
+ { "ALIGN" T(N) },
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DIR" T(N) },
+ { "DISABLED" T(N) },
+ { "ERROR" T(N) },
+ { "HEIGHT" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "MD" T(N) },
+ { "MULTIPLE" T(N) },
+ { "NAME" T(N) },
+ { "NOTAB" T(N) },
+ { "ONBLUR" T(N) },
+ { "ONCHANGE" T(N) },
+ { "ONFOCUS" T(N) },
+ { "SIZE" T(N) },
+ { "STYLE" T(N) },
+ { "TABINDEX" T(N) },
+ { "TITLE" T(N) },
+ { "UNITS" T(N) },
+ { "WIDTH" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr STYLE_attr[] = { /* STYLE attributes */
+ { "CLASS" T(c) },
+ { "DIR" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "MEDIA" T(N) },
+ { "NOTATION" T(N) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { "TYPE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr TAB_attr[] = { /* TAB attributes */
+ { "ALIGN" T(N) },
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DIR" T(N) },
+ { "DP" T(N) },
+ { "ID" T(i) },
+ { "INDENT" T(N) },
+ { "LANG" T(N) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { "TO" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr TABLE_attr[] = { /* TABLE attributes */
+ { "ALIGN" T(N) },
+ { "BACKGROUND" T(h) },
+ { "BORDER" T(N) },
+ { "CELLPADDING" T(N) },
+ { "CELLSPACING" T(N) },
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "COLS" T(N) },
+ { "COLSPEC" T(N) },
+ { "DIR" T(N) },
+ { "DP" T(N) },
+ { "FRAME" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "NOFLOW" T(N) },
+ { "NOWRAP" T(N) },
+ { "RULES" T(N) },
+ { "STYLE" T(N) },
+ { "SUMMARY" T(N) },
+ { "TITLE" T(N) },
+ { "UNITS" T(N) },
+ { "WIDTH" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr TD_attr[] = { /* TD attributes */
+ { "ABBR" T(N) },
+ { "ALIGN" T(N) },
+ { "AXES" T(N) },
+ { "AXIS" T(N) },
+ { "BACKGROUND" T(h) },
+ { "CHAR" T(N) },
+ { "CHAROFF" T(N) },
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "COLSPAN" T(N) },
+ { "DIR" T(N) },
+ { "DP" T(N) },
+ { "HEADERS" T(N) },
+ { "HEIGHT" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "NOWRAP" T(N) },
+ { "ROWSPAN" T(N) },
+ { "SCOPE" T(N) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { "VALIGN" T(N) },
+ { "WIDTH" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr TEXTAREA_attr[] = { /* TEXTAREA attributes */
+ { "ACCEPT-CHARSET" T(N) },
+ { "ACCESSKEY" T(N) },
+ { "ALIGN" T(N) },
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "COLS" T(N) },
+ { "DIR" T(N) },
+ { "DISABLED" T(N) },
+ { "ERROR" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "NAME" T(N) },
+ { "NOTAB" T(N) },
+ { "ONBLUR" T(N) },
+ { "ONCHANGE" T(N) },
+ { "ONFOCUS" T(N) },
+ { "ONSELECT" T(N) },
+ { "READONLY" T(N) },
+ { "ROWS" T(N) },
+ { "STYLE" T(N) },
+ { "TABINDEX" T(N) },
+ { "TITLE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr TR_attr[] = { /* TBODY attributes */
+ { "ALIGN" T(N) },
+ { "CHAR" T(N) },
+ { "CHAROFF" T(N) },
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DIR" T(N) },
+ { "DP" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "NOWRAP" T(N) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { "VALIGN" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr UL_attr[] = { /* DIR attributes */
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "COMPACT" T(N) },
+ { "DINGBAT" T(N) },
+ { "DIR" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "MD" T(N) },
+ { "PLAIN" T(N) },
+ { "SRC" T(h) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { "TYPE" T(N) },
+ { "WRAP" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+/* *INDENT-ON* */
+
+/* justification-flags */
+#undef N
+#undef i
+#undef h
+#undef c
+#undef x
+
+#undef T
+
+/* tag-names */
+#undef A
+#undef ABBR
+#undef ACRONYM
+#undef ADDRESS
+#undef APPLET
+#undef AREA
+#undef ARTICLE
+#undef ASIDE
+#undef AU
+#undef AUTHOR
+#undef B
+#undef BANNER
+#undef BASE
+#undef BASEFONT
+#undef BDO
+#undef BGSOUND
+#undef BIG
+#undef BLINK
+#undef BLOCKQUOTE
+#undef BODY
+#undef BODYTEXT
+#undef BQ
+#undef BR
+#undef BUTTON
+#undef CAPTION
+#undef CENTER
+#undef CITE
+#undef CODE
+#undef COL
+#undef COLGROUP
+#undef COMMENT
+#undef CREDIT
+#undef DD
+#undef DEL
+#undef DEL
+#undef DFN
+#undef DIR
+#undef DIV
+#undef DL
+#undef DLC
+#undef DT
+#undef EM
+#undef EMBED
+#undef FIELDSET
+#undef FIG
+#undef FIGURE
+#undef FN
+#undef FONT
+#undef FOOTER
+#undef FORM
+#undef FRAME
+#undef FRAMESET
+#undef H1
+#undef H2
+#undef H3
+#undef H4
+#undef H5
+#undef H6
+#undef HEAD
+#undef HEADER
+#undef HR
+#undef HTML
+#undef HY
+#undef I
+#undef IFRAME
+#undef IMG
+#undef INPUT
+#undef INS
+#undef INS
+#undef ISINDEX
+#undef KBD
+#undef KEYGEN
+#undef LABEL
+#undef LEGEND
+#undef LH
+#undef LI
+#undef LINK
+#undef LISTING
+#undef MAIN
+#undef MAP
+#undef MARQUEE
+#undef MATH
+#undef MENU
+#undef META
+#undef NAV
+#undef NEXTID
+#undef NOFRAMES
+#undef NOTE
+#undef OBJECT
+#undef OL
+#undef OPTION
+#undef OVERLAY
+#undef P
+#undef PARAM
+#undef PLAINTEXT
+#undef PRE
+#undef Q
+#undef S
+#undef SAMP
+#undef SCRIPT
+#undef SECTION
+#undef SELECT
+#undef SHY
+#undef SMALL
+#undef SPAN
+#undef SPOT
+#undef STRIKE
+#undef STRONG
+#undef STYLE
+#undef SUB
+#undef SUP
+#undef TAB
+#undef TABLE
+#undef TBODY
+#undef TD
+#undef TEXTAREA
+#undef TEXTFLOW
+#undef TFOOT
+#undef TH
+#undef THEAD
+#undef TITLE
+#undef TR
+#undef TT
+#undef U
+#undef UL
+#undef VAR
+#undef WBR
+#undef XMP
+#undef OBJECT_PCDATA
+
+/* these definitions are used in the tags-tables */
+#undef P
+#undef P_
+#ifdef USE_COLOR_STYLE
+#define P_(x) #x, (sizeof #x) -1
+#define NULL_HTTag_ NULL, 0
+#else
+#define P_(x) #x
+#define NULL_HTTag_ NULL
+#endif
+
+#ifdef USE_JUSTIFY_ELTS
+#define P(x) P_(x), 1
+#define P0(x) P_(x), 0
+#define NULL_HTTag NULL_HTTag_,0
+#else
+#define P(x) P_(x)
+#define P0(x) P_(x)
+#define NULL_HTTag NULL_HTTag_
+#endif
+
+#define ATTR_DATA(name) name##_attr, HTML_##name##_ATTRIBUTES, name##_attr_type
+
+#endif /* once_HTMLDTD */
+/* *INDENT-OFF* */
+static const HTTag tags_table0[HTML_ALL_ELEMENTS] = {
+ { P(A), ATTR_DATA(A), SGML_EMPTY, T_A, 0, 0},
+ { P(ABBR), ATTR_DATA(GEN), SGML_MIXED, T_ABBR, 0, 0},
+ { P(ACRONYM), ATTR_DATA(GEN), SGML_MIXED, T_ACRONYM, 0, 0},
+ { P(ADDRESS), ATTR_DATA(ADDRESS), SGML_MIXED, T_ADDRESS, 0, 0},
+ { P(APPLET), ATTR_DATA(APPLET), SGML_MIXED, T_APPLET, 0, 0},
+ { P(AREA), ATTR_DATA(AREA), SGML_EMPTY, T_AREA, 0, 0},
+ { P(ARTICLE), ATTR_DATA(GEN5), SGML_MIXED, T_ARTICLE, 0, 0},
+ { P(ASIDE), ATTR_DATA(GEN5), SGML_MIXED, T_ASIDE, 0, 0},
+ { P(AU), ATTR_DATA(GEN), SGML_MIXED, T_AU, 0, 0},
+ { P(AUTHOR), ATTR_DATA(GEN), SGML_MIXED, T_AUTHOR, 0, 0},
+ { P(B), ATTR_DATA(GEN), SGML_EMPTY, T_B, 0, 0},
+ { P0(BANNER), ATTR_DATA(GEN), SGML_MIXED, T_BANNER, 0, 0},
+ { P(BASE), ATTR_DATA(BASE), SGML_EMPTY, T_BASE, 0, 0},
+ { P(BASEFONT), ATTR_DATA(FONT), SGML_EMPTY, T_BASEFONT, 0, 0},
+ { P(BDO), ATTR_DATA(GEN), SGML_MIXED, T_BDO, 0, 0},
+ { P(BGSOUND), ATTR_DATA(BGSOUND), SGML_EMPTY, T_BGSOUND, 0, 0},
+ { P(BIG), ATTR_DATA(GEN), SGML_MIXED, T_BIG, 0, 0},
+ { P(BLINK), ATTR_DATA(GEN), SGML_EMPTY, T_BLINK, 0, 0},
+ { P(BLOCKQUOTE), ATTR_DATA(BQ), SGML_MIXED, T_BLOCKQUOTE, 0, 0},
+ { P(BODY), ATTR_DATA(BODY), SGML_MIXED, T_BODY, 0, 0},
+ { P(BODYTEXT), ATTR_DATA(BODYTEXT), SGML_MIXED, T_BODYTEXT, 0, 0},
+ { P(BQ), ATTR_DATA(BQ), SGML_MIXED, T_BQ, 0, 0},
+ { P(BR), ATTR_DATA(GEN), SGML_EMPTY, T_BR, 0, 0},
+ { P(BUTTON), ATTR_DATA(BUTTON), SGML_MIXED, T_BUTTON, 0, 0},
+ { P(CAPTION), ATTR_DATA(CAPTION), SGML_MIXED, T_CAPTION, 0, 0},
+ { P(CENTER), ATTR_DATA(DIV), SGML_MIXED, T_CENTER, 0, 0},
+ { P(CITE), ATTR_DATA(GEN), SGML_EMPTY, T_CITE, 0, 0},
+ { P(CODE), ATTR_DATA(GEN), SGML_MIXED, T_CODE, 0, 0},
+ { P(COL), ATTR_DATA(COL), SGML_EMPTY, T_COL, 0, 0},
+ { P(COLGROUP), ATTR_DATA(COL), SGML_EMPTY, T_COLGROUP, 0, 0},
+ { P(COMMENT), ATTR_DATA(GEN), SGML_MIXED, T_COMMENT, 0, 0},
+ { P(CREDIT), ATTR_DATA(GEN), SGML_MIXED, T_CREDIT, 0, 0},
+ { P(DD), ATTR_DATA(GEN), SGML_EMPTY, T_DD, 0, 0},
+ { P(DEL), ATTR_DATA(DEL), SGML_MIXED, T_DEL, 0, 1},
+ { P(DEL), ATTR_DATA(DEL), SGML_MIXED, T_DEL_2, 1, 1},
+ { P(DFN), ATTR_DATA(GEN), SGML_MIXED, T_DFN, 0, 0},
+ { P(DIR), ATTR_DATA(UL), SGML_MIXED, T_DIR, 0, 0},
+ { P(DIV), ATTR_DATA(DIV), SGML_MIXED, T_DIV, 0, 0},
+ { P(DL), ATTR_DATA(DL), SGML_MIXED, T_DL, 0, 0},
+ { P(DLC), ATTR_DATA(DL), SGML_MIXED, T_DLC, 0, 0},
+ { P(DT), ATTR_DATA(GEN), SGML_EMPTY, T_DT, 0, 0},
+ { P(EM), ATTR_DATA(GEN), SGML_EMPTY, T_EM, 0, 0},
+ { P(EMBED), ATTR_DATA(EMBED), SGML_EMPTY, T_EMBED, 0, 0},
+ { P(FIELDSET), ATTR_DATA(GEN), SGML_MIXED, T_FIELDSET, 0, 0},
+ { P(FIG), ATTR_DATA(FIG), SGML_MIXED, T_FIG, 0, 0},
+ { P(FIGURE), ATTR_DATA(GEN5), SGML_MIXED, T_FIGURE, 0, 0},
+ { P(FN), ATTR_DATA(GEN), SGML_MIXED, T_FN, 0, 0},
+ { P(FONT), ATTR_DATA(FONT), SGML_EMPTY, T_FONT, 0, 0},
+ { P(FOOTER), ATTR_DATA(GEN5), SGML_MIXED, T_FOOTER, 0, 0},
+ { P(FORM), ATTR_DATA(FORM), SGML_EMPTY, T_FORM, 0, 0},
+ { P(FRAME), ATTR_DATA(FRAME), SGML_EMPTY, T_FRAME, 0, 0},
+ { P(FRAMESET), ATTR_DATA(FRAMESET), SGML_MIXED, T_FRAMESET, 0, 0},
+ { P0(H1), ATTR_DATA(H), SGML_MIXED, T_H1, 0, 0},
+ { P0(H2), ATTR_DATA(H), SGML_MIXED, T_H2, 0, 0},
+ { P0(H3), ATTR_DATA(H), SGML_MIXED, T_H3, 0, 0},
+ { P0(H4), ATTR_DATA(H), SGML_MIXED, T_H4, 0, 0},
+ { P0(H5), ATTR_DATA(H), SGML_MIXED, T_H5, 0, 0},
+ { P0(H6), ATTR_DATA(H), SGML_MIXED, T_H6, 0, 0},
+ { P(HEAD), ATTR_DATA(GEN), SGML_MIXED, T_HEAD, 0, 0},
+ { P(HEADER), ATTR_DATA(GEN5), SGML_MIXED, T_HEADER, 0, 0},
+ { P(HR), ATTR_DATA(HR), SGML_EMPTY, T_HR, 0, 0},
+ { P(HTML), ATTR_DATA(GEN), SGML_MIXED, T_HTML, 0, 0},
+ { P(HY), ATTR_DATA(GEN), SGML_EMPTY, T_HY, 0, 0},
+ { P(I), ATTR_DATA(GEN), SGML_EMPTY, T_I, 0, 0},
+ { P(IFRAME), ATTR_DATA(IFRAME), SGML_MIXED, T_IFRAME, 0, 0},
+ { P(IMG), ATTR_DATA(IMG), SGML_EMPTY, T_IMG, 0, 0},
+ { P(INPUT), ATTR_DATA(INPUT), SGML_EMPTY, T_INPUT, 0, 0},
+ { P(INS), ATTR_DATA(DEL), SGML_MIXED, T_INS, 0, 1},
+ { P(INS), ATTR_DATA(DEL), SGML_MIXED, T_INS_2, 1, 1},
+ { P(ISINDEX), ATTR_DATA(ISINDEX), SGML_EMPTY, T_ISINDEX, 0, 0},
+ { P(KBD), ATTR_DATA(GEN), SGML_MIXED, T_KBD, 0, 0},
+ { P(KEYGEN), ATTR_DATA(KEYGEN), SGML_EMPTY, T_KEYGEN, 0, 0},
+ { P(LABEL), ATTR_DATA(LABEL), SGML_MIXED, T_LABEL, 0, 0},
+ { P(LEGEND), ATTR_DATA(CAPTION), SGML_MIXED, T_LEGEND, 0, 0},
+ { P(LH), ATTR_DATA(GEN), SGML_EMPTY, T_LH, 0, 0},
+ { P(LI), ATTR_DATA(LI), SGML_EMPTY, T_LI, 0, 0},
+ { P(LINK), ATTR_DATA(LINK), SGML_EMPTY, T_LINK, 0, 0},
+ { P(LISTING), ATTR_DATA(GEN), SGML_LITTERAL,T_LISTING, 0, 0},
+ { P(MAIN), ATTR_DATA(GEN5), SGML_MIXED, T_MAIN, 0, 0},
+ { P(MAP), ATTR_DATA(MAP), SGML_MIXED, T_MAP, 0, 0},
+ { P(MARQUEE), ATTR_DATA(GEN), SGML_MIXED, T_MARQUEE, 0, 0},
+ { P(MATH), ATTR_DATA(MATH), SGML_LITTERAL,T_MATH, 0, 0},
+ { P(MENU), ATTR_DATA(UL), SGML_MIXED, T_MENU, 0, 0},
+ { P(META), ATTR_DATA(META), SGML_EMPTY, T_META, 0, 0},
+ { P(NAV), ATTR_DATA(GEN5), SGML_MIXED, T_NAV, 0, 0},
+ { P(NEXTID), ATTR_DATA(NEXTID), SGML_EMPTY, T_NEXTID, 0, 0},
+ { P(NOFRAMES), ATTR_DATA(GEN), SGML_MIXED, T_NOFRAMES, 0, 0},
+ { P(NOTE), ATTR_DATA(NOTE), SGML_MIXED, T_NOTE, 0, 0},
+ { P(OBJECT), ATTR_DATA(OBJECT), SGML_LITTERAL,T_OBJECT, 0, 0},
+ { P(OL), ATTR_DATA(OL), SGML_MIXED, T_OL, 0, 0},
+ { P(OPTION), ATTR_DATA(OPTION), SGML_EMPTY, T_OPTION, 0, 0},
+ { P(OVERLAY), ATTR_DATA(OVERLAY), SGML_EMPTY, T_OVERLAY, 0, 0},
+ { P(P), ATTR_DATA(P), SGML_EMPTY, T_P, 0, 0},
+ { P(PARAM), ATTR_DATA(PARAM), SGML_EMPTY, T_PARAM, 0, 0},
+ { P(PLAINTEXT), ATTR_DATA(GEN), SGML_LITTERAL,T_PLAINTEXT, 0, 0},
+ { P0(PRE), ATTR_DATA(GEN), SGML_MIXED, T_PRE, 0, 0},
+ { P(Q), ATTR_DATA(Q), SGML_MIXED, T_Q, 0, 0},
+ { P(S), ATTR_DATA(GEN), SGML_MIXED, T_S, 0, 0},
+ { P(SAMP), ATTR_DATA(GEN), SGML_MIXED, T_SAMP, 0, 0},
+ { P(SCRIPT), ATTR_DATA(SCRIPT), SGML_LITTERAL,T_SCRIPT, 0, 0},
+ { P(SECTION), ATTR_DATA(GEN5), SGML_MIXED, T_SECTION, 0, 0},
+ { P(SELECT), ATTR_DATA(SELECT), SGML_MIXED, T_SELECT, 0, 0},
+ { P(SHY), ATTR_DATA(GEN), SGML_EMPTY, T_SHY, 0, 0},
+ { P(SMALL), ATTR_DATA(GEN), SGML_MIXED, T_SMALL, 0, 0},
+ { P(SPAN), ATTR_DATA(GEN), SGML_MIXED, T_SPAN, 0, 0},
+ { P(SPOT), ATTR_DATA(GEN), SGML_EMPTY, T_SPOT, 0, 0},
+ { P(STRIKE), ATTR_DATA(GEN), SGML_MIXED, T_STRIKE, 0, 0},
+ { P(STRONG), ATTR_DATA(GEN), SGML_EMPTY, T_STRONG, 0, 0},
+ { P(STYLE), ATTR_DATA(STYLE), SGML_LITTERAL,T_STYLE, 0, 0},
+ { P(SUB), ATTR_DATA(GEN), SGML_MIXED, T_SUB, 0, 0},
+ { P(SUP), ATTR_DATA(GEN), SGML_MIXED, T_SUP, 0, 0},
+ { P(TAB), ATTR_DATA(TAB), SGML_EMPTY, T_TAB, 0, 0},
+ { P(TABLE), ATTR_DATA(TABLE), SGML_MIXED, T_TABLE, 0, 0},
+ { P(TBODY), ATTR_DATA(TR), SGML_EMPTY, T_TBODY, 0, 0},
+ { P(TD), ATTR_DATA(TD), SGML_EMPTY, T_TD, 0, 0},
+ { P(TEXTAREA), ATTR_DATA(TEXTAREA), SGML_LITTERAL,T_TEXTAREA, 0, 0},
+ { P(TEXTFLOW), ATTR_DATA(BODYTEXT), SGML_MIXED, T_TEXTFLOW, 0, 0},
+ { P(TFOOT), ATTR_DATA(TR), SGML_EMPTY, T_TFOOT, 0, 0},
+ { P(TH), ATTR_DATA(TD), SGML_EMPTY, T_TH, 0, 0},
+ { P(THEAD), ATTR_DATA(TR), SGML_EMPTY, T_THEAD, 0, 0},
+ { P(TITLE), ATTR_DATA(GEN), SGML_RCDATA, T_TITLE, 0, 0},
+ { P(TR), ATTR_DATA(TR), SGML_EMPTY, T_TR, 0, 0},
+ { P(TT), ATTR_DATA(GEN), SGML_EMPTY, T_TT, 0, 0},
+ { P(U), ATTR_DATA(GEN), SGML_EMPTY, T_U, 0, 0},
+ { P(UL), ATTR_DATA(UL), SGML_MIXED, T_UL, 0, 0},
+ { P(VAR), ATTR_DATA(GEN), SGML_MIXED, T_VAR, 0, 0},
+ { P(WBR), ATTR_DATA(GEN), SGML_EMPTY, T_WBR, 0, 0},
+ { P0(XMP), ATTR_DATA(GEN), SGML_LITTERAL,T_XMP, 0, 0},
+/* additional (alternative variants), not counted in HTML_ELEMENTS: */
+/* This one will be used as a temporary substitute within the parser when
+ it has been signalled to parse OBJECT content as MIXED. - kw */
+ { P(OBJECT), ATTR_DATA(OBJECT), SGML_MIXED, T_OBJECT_PCDATA, 0, 0},
+};
+/* *INDENT-ON* */
+
+#endif /* src_HTMLDTD_H0 */
diff --git a/WWW/Library/Implementation/src0_HTMLDTD.txt b/WWW/Library/Implementation/src0_HTMLDTD.txt
new file mode 100644
index 0000000..a3c51d9
--- /dev/null
+++ b/WWW/Library/Implementation/src0_HTMLDTD.txt
@@ -0,0 +1,3901 @@
+60 attr_types
+ 0:align
+ 1 attributes:
+ 0:0:ALIGN
+ 1:bgcolor
+ 1 attributes:
+ 0:0:BGCOLOR
+ 2:cellalign
+ 4 attributes:
+ 0:0:ALIGN
+ 1:0:CHAR
+ 2:0:CHAROFF
+ 3:0:VALIGN
+ 3:core
+ 4 attributes:
+ 0:4:CLASS
+ 1:1:ID
+ 2:0:STYLE
+ 3:0:TITLE
+ 4:events
+ 10 attributes:
+ 0:0:ONCLICK
+ 1:0:ONDBLCLICK
+ 2:0:ONKEYDOWN
+ 3:0:ONKEYPRESS
+ 4:0:ONKEYUP
+ 5:0:ONMOUSEDOWN
+ 6:0:ONMOUSEMOVE
+ 7:0:ONMOUSEOUT
+ 8:0:ONMOUSEOVER
+ 9:0:ONMOUSEUP
+ 5:i18n
+ 2 attributes:
+ 0:0:DIR
+ 1:0:LANG
+ 6:A
+ 19 attributes:
+ 0:0:ACCESSKEY
+ 1:0:CHARSET
+ 2:0:CLEAR
+ 3:0:COORDS
+ 4:2:HREF
+ 5:0:HREFLANG
+ 6:0:ISMAP
+ 7:0:MD
+ 8:1:NAME
+ 9:0:NOTAB
+ 10:0:ONBLUR
+ 11:0:ONFOCUS
+ 12:0:REL
+ 13:0:REV
+ 14:0:SHAPE
+ 15:0:TABINDEX
+ 16:0:TARGET
+ 17:0:TYPE
+ 18:0:URN
+ 7:ADDRESS
+ 2 attributes:
+ 0:0:CLEAR
+ 1:0:NOWRAP
+ 8:APPLET
+ 10 attributes:
+ 0:0:ALT
+ 1:0:CLEAR
+ 2:0:CODE
+ 3:2:CODEBASE
+ 4:0:DOWNLOAD
+ 5:0:HEIGHT
+ 6:0:HSPACE
+ 7:1:NAME
+ 8:0:VSPACE
+ 9:0:WIDTH
+ 9:AREA
+ 12 attributes:
+ 0:0:ACCESSKEY
+ 1:0:ALT
+ 2:0:CLEAR
+ 3:0:COORDS
+ 4:2:HREF
+ 5:0:NOHREF
+ 6:0:NOTAB
+ 7:0:ONBLUR
+ 8:0:ONFOCUS
+ 9:0:SHAPE
+ 10:0:TABINDEX
+ 11:0:TARGET
+ 10:BASE
+ 2 attributes:
+ 0:2:HREF
+ 1:0:TARGET
+ 11:BGSOUND
+ 3 attributes:
+ 0:0:CLEAR
+ 1:0:LOOP
+ 2:2:SRC
+ 12:BODY
+ 8 attributes:
+ 0:0:ALINK
+ 1:2:BACKGROUND
+ 2:0:CLEAR
+ 3:0:LINK
+ 4:0:ONLOAD
+ 5:0:ONUNLOAD
+ 6:0:TEXT
+ 7:0:VLINK
+ 13:BODYTEXT
+ 8 attributes:
+ 0:0:CLEAR
+ 1:0:DATA
+ 2:0:NAME
+ 3:0:OBJECT
+ 4:0:REF
+ 5:0:TYPE
+ 6:0:VALUE
+ 7:0:VALUETYPE
+ 14:BQ
+ 3 attributes:
+ 0:2:CITE
+ 1:0:CLEAR
+ 2:0:NOWRAP
+ 15:BUTTON
+ 11 attributes:
+ 0:0:ACCESSKEY
+ 1:0:CLEAR
+ 2:0:DISABLED
+ 3:0:FORMACTION
+ 4:0:NAME
+ 5:0:ONBLUR
+ 6:0:ONFOCUS
+ 7:0:READONLY
+ 8:0:TABINDEX
+ 9:0:TYPE
+ 10:0:VALUE
+ 16:CAPTION
+ 2 attributes:
+ 0:0:ACCESSKEY
+ 1:0:CLEAR
+ 17:COL
+ 3 attributes:
+ 0:0:CLEAR
+ 1:0:SPAN
+ 2:0:WIDTH
+ 18:DEL
+ 2 attributes:
+ 0:0:CITE
+ 1:0:DATETIME
+ 19:DIV
+ 1 attributes:
+ 0:0:CLEAR
+ 20:DL
+ 2 attributes:
+ 0:0:CLEAR
+ 1:0:COMPACT
+ 21:EMBED
+ 14 attributes:
+ 0:0:ALT
+ 1:0:BORDER
+ 2:0:CLEAR
+ 3:0:HEIGHT
+ 4:0:IMAGEMAP
+ 5:0:ISMAP
+ 6:0:MD
+ 7:1:NAME
+ 8:0:NOFLOW
+ 9:0:PARAMS
+ 10:2:SRC
+ 11:0:UNITS
+ 12:0:USEMAP
+ 13:0:WIDTH
+ 22:FIG
+ 10 attributes:
+ 0:0:BORDER
+ 1:0:CLEAR
+ 2:0:HEIGHT
+ 3:0:IMAGEMAP
+ 4:0:ISOBJECT
+ 5:0:MD
+ 6:0:NOFLOW
+ 7:2:SRC
+ 8:0:UNITS
+ 9:0:WIDTH
+ 23:FONT
+ 5 attributes:
+ 0:0:CLEAR
+ 1:0:COLOR
+ 2:0:END
+ 3:0:FACE
+ 4:0:SIZE
+ 24:FORM
+ 11 attributes:
+ 0:0:ACCEPT
+ 1:0:ACCEPT-CHARSET
+ 2:2:ACTION
+ 3:0:CLEAR
+ 4:0:ENCTYPE
+ 5:0:METHOD
+ 6:0:ONRESET
+ 7:0:ONSUBMIT
+ 8:0:SCRIPT
+ 9:0:SUBJECT
+ 10:0:TARGET
+ 25:FRAME
+ 8 attributes:
+ 0:0:FRAMEBORDER
+ 1:2:LONGDESC
+ 2:0:MARGINHEIGHT
+ 3:0:MARGINWIDTH
+ 4:0:NAME
+ 5:0:NORESIZE
+ 6:0:SCROLLING
+ 7:2:SRC
+ 26:FRAMESET
+ 4 attributes:
+ 0:0:COLS
+ 1:0:ONLOAD
+ 2:0:ONUNLOAD
+ 3:0:ROWS
+ 27:GEN
+ 1 attributes:
+ 0:0:CLEAR
+ 28:GEN5
+ 1 attributes:
+ 0:0:ROLE
+ 29:H
+ 7 attributes:
+ 0:0:CLEAR
+ 1:0:DINGBAT
+ 2:0:MD
+ 3:0:NOWRAP
+ 4:0:SEQNUM
+ 5:0:SKIP
+ 6:2:SRC
+ 30:HR
+ 6 attributes:
+ 0:0:CLEAR
+ 1:0:MD
+ 2:0:NOSHADE
+ 3:0:SIZE
+ 4:2:SRC
+ 5:0:WIDTH
+ 31:IFRAME
+ 9 attributes:
+ 0:0:FRAMEBORDER
+ 1:0:HEIGHT
+ 2:2:LONGDESC
+ 3:0:MARGINHEIGHT
+ 4:0:MARGINWIDTH
+ 5:0:NAME
+ 6:0:SCROLLING
+ 7:2:SRC
+ 8:0:WIDTH
+ 32:IMG
+ 15 attributes:
+ 0:0:ALT
+ 1:0:BORDER
+ 2:0:CLEAR
+ 3:0:HEIGHT
+ 4:0:HSPACE
+ 5:0:ISMAP
+ 6:0:ISOBJECT
+ 7:2:LONGDESC
+ 8:0:MD
+ 9:0:NAME
+ 10:2:SRC
+ 11:0:UNITS
+ 12:2:USEMAP
+ 13:0:VSPACE
+ 14:0:WIDTH
+ 33:INPUT
+ 28 attributes:
+ 0:0:ACCEPT
+ 1:0:ACCEPT-CHARSET
+ 2:0:ACCESSKEY
+ 3:0:ALT
+ 4:0:CHECKED
+ 5:0:CLEAR
+ 6:0:DISABLED
+ 7:0:ERROR
+ 8:0:HEIGHT
+ 9:0:ISMAP
+ 10:0:MAX
+ 11:0:MAXLENGTH
+ 12:0:MD
+ 13:0:MIN
+ 14:0:NAME
+ 15:0:NOTAB
+ 16:0:ONBLUR
+ 17:0:ONCHANGE
+ 18:0:ONFOCUS
+ 19:0:ONSELECT
+ 20:0:READONLY
+ 21:0:SIZE
+ 22:2:SRC
+ 23:0:TABINDEX
+ 24:0:TYPE
+ 25:0:USEMAP
+ 26:0:VALUE
+ 27:0:WIDTH
+ 34:ISINDEX
+ 3 attributes:
+ 0:2:ACTION
+ 1:2:HREF
+ 2:0:PROMPT
+ 35:KEYGEN
+ 2 attributes:
+ 0:0:CHALLENGE
+ 1:0:NAME
+ 36:LABEL
+ 5 attributes:
+ 0:0:ACCESSKEY
+ 1:0:CLEAR
+ 2:0:FOR
+ 3:0:ONBLUR
+ 4:0:ONFOCUS
+ 37:LI
+ 7 attributes:
+ 0:0:CLEAR
+ 1:0:DINGBAT
+ 2:0:MD
+ 3:0:SKIP
+ 4:2:SRC
+ 5:0:TYPE
+ 6:0:VALUE
+ 38:LINK
+ 8 attributes:
+ 0:0:CHARSET
+ 1:2:HREF
+ 2:0:HREFLANG
+ 3:0:MEDIA
+ 4:0:REL
+ 5:0:REV
+ 6:0:TARGET
+ 7:0:TYPE
+ 39:MAP
+ 2 attributes:
+ 0:0:CLEAR
+ 1:1:NAME
+ 40:MATH
+ 2 attributes:
+ 0:0:BOX
+ 1:0:CLEAR
+ 41:META
+ 5 attributes:
+ 0:0:CHARSET
+ 1:0:CONTENT
+ 2:0:HTTP-EQUIV
+ 3:0:NAME
+ 4:0:SCHEME
+ 42:NEXTID
+ 1 attributes:
+ 0:0:N
+ 43:NOTE
+ 4 attributes:
+ 0:0:CLEAR
+ 1:0:MD
+ 2:8:ROLE
+ 3:2:SRC
+ 44:OBJECT
+ 19 attributes:
+ 0:0:ARCHIVE
+ 1:0:BORDER
+ 2:2:CLASSID
+ 3:2:CODEBASE
+ 4:0:CODETYPE
+ 5:2:DATA
+ 6:0:DECLARE
+ 7:0:HEIGHT
+ 8:0:HSPACE
+ 9:0:ISMAP
+ 10:0:NAME
+ 11:0:NOTAB
+ 12:0:SHAPES
+ 13:0:STANDBY
+ 14:0:TABINDEX
+ 15:0:TYPE
+ 16:2:USEMAP
+ 17:0:VSPACE
+ 18:0:WIDTH
+ 45:OL
+ 6 attributes:
+ 0:0:CLEAR
+ 1:0:COMPACT
+ 2:0:CONTINUE
+ 3:0:SEQNUM
+ 4:0:START
+ 5:0:TYPE
+ 46:OPTION
+ 7 attributes:
+ 0:0:CLEAR
+ 1:0:DISABLED
+ 2:0:ERROR
+ 3:0:LABEL
+ 4:0:SELECTED
+ 5:0:SHAPE
+ 6:0:VALUE
+ 47:OVERLAY
+ 8 attributes:
+ 0:0:HEIGHT
+ 1:0:IMAGEMAP
+ 2:0:MD
+ 3:2:SRC
+ 4:0:UNITS
+ 5:0:WIDTH
+ 6:0:X
+ 7:0:Y
+ 48:P
+ 2 attributes:
+ 0:0:CLEAR
+ 1:0:NOWRAP
+ 49:PARAM
+ 12 attributes:
+ 0:0:ACCEPT
+ 1:0:ACCEPT-CHARSET
+ 2:0:ACCEPT-ENCODING
+ 3:0:CLEAR
+ 4:0:DATA
+ 5:0:NAME
+ 6:0:OBJECT
+ 7:0:REF
+ 8:0:TYPE
+ 9:0:VALUE
+ 10:0:VALUEREF
+ 11:0:VALUETYPE
+ 50:Q
+ 2 attributes:
+ 0:2:CITE
+ 1:0:CLEAR
+ 51:SCRIPT
+ 10 attributes:
+ 0:0:CHARSET
+ 1:0:CLEAR
+ 2:0:DEFER
+ 3:0:EVENT
+ 4:0:FOR
+ 5:0:LANGUAGE
+ 6:0:NAME
+ 7:0:SCRIPTENGINE
+ 8:2:SRC
+ 9:0:TYPE
+ 52:SELECT
+ 15 attributes:
+ 0:0:CLEAR
+ 1:0:DISABLED
+ 2:0:ERROR
+ 3:0:HEIGHT
+ 4:0:MD
+ 5:0:MULTIPLE
+ 6:0:NAME
+ 7:0:NOTAB
+ 8:0:ONBLUR
+ 9:0:ONCHANGE
+ 10:0:ONFOCUS
+ 11:0:SIZE
+ 12:0:TABINDEX
+ 13:0:UNITS
+ 14:0:WIDTH
+ 53:STYLE
+ 3 attributes:
+ 0:0:MEDIA
+ 1:0:NOTATION
+ 2:0:TYPE
+ 54:TAB
+ 4 attributes:
+ 0:0:CLEAR
+ 1:0:DP
+ 2:0:INDENT
+ 3:0:TO
+ 55:TABLE
+ 15 attributes:
+ 0:2:BACKGROUND
+ 1:0:BORDER
+ 2:0:CELLPADDING
+ 3:0:CELLSPACING
+ 4:0:CLEAR
+ 5:0:COLS
+ 6:0:COLSPEC
+ 7:0:DP
+ 8:0:FRAME
+ 9:0:NOFLOW
+ 10:0:NOWRAP
+ 11:0:RULES
+ 12:0:SUMMARY
+ 13:0:UNITS
+ 14:0:WIDTH
+ 56:TD
+ 13 attributes:
+ 0:0:ABBR
+ 1:0:AXES
+ 2:0:AXIS
+ 3:2:BACKGROUND
+ 4:0:CLEAR
+ 5:0:COLSPAN
+ 6:0:DP
+ 7:0:HEADERS
+ 8:0:HEIGHT
+ 9:0:NOWRAP
+ 10:0:ROWSPAN
+ 11:0:SCOPE
+ 12:0:WIDTH
+ 57:TEXTAREA
+ 15 attributes:
+ 0:0:ACCEPT-CHARSET
+ 1:0:ACCESSKEY
+ 2:0:CLEAR
+ 3:0:COLS
+ 4:0:DISABLED
+ 5:0:ERROR
+ 6:0:NAME
+ 7:0:NOTAB
+ 8:0:ONBLUR
+ 9:0:ONCHANGE
+ 10:0:ONFOCUS
+ 11:0:ONSELECT
+ 12:0:READONLY
+ 13:0:ROWS
+ 14:0:TABINDEX
+ 58:TR
+ 3 attributes:
+ 0:0:CLEAR
+ 1:0:DP
+ 2:0:NOWRAP
+ 59:UL
+ 8 attributes:
+ 0:0:CLEAR
+ 1:0:COMPACT
+ 2:0:DINGBAT
+ 3:0:MD
+ 4:0:PLAIN
+ 5:2:SRC
+ 6:0:TYPE
+ 7:0:WRAP
+128 tags
+ 0:A
+ justify
+ 25 attributes:
+ 0:0:ACCESSKEY
+ 1:0:CHARSET
+ 2:4:CLASS
+ 3:0:CLEAR
+ 4:0:COORDS
+ 5:0:DIR
+ 6:2:HREF
+ 7:0:HREFLANG
+ 8:1:ID
+ 9:0:ISMAP
+ 10:0:LANG
+ 11:0:MD
+ 12:1:NAME
+ 13:0:NOTAB
+ 14:0:ONBLUR
+ 15:0:ONFOCUS
+ 16:0:REL
+ 17:0:REV
+ 18:0:SHAPE
+ 19:0:STYLE
+ 20:0:TABINDEX
+ 21:0:TARGET
+ 22:0:TITLE
+ 23:0:TYPE
+ 24:0:URN
+ 4 attr_types
+ core
+ events
+ i18n
+ A
+ contents: SGML_EMPTY
+ tagclass: Alike
+ contains: FONTlike EMlike MATHlike BRlike APPLETlike MAPlike
+ icontains: FONTlike EMlike MATHlike formula Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike
+ contained: FONTlike EMlike MATHlike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike outer BODYlike
+ icontained: FONTlike EMlike MATHlike TRlike FORMlike Plike DIVlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff
+ canclose: FONTlike EMlike MATHlike Alike SELECTlike APPLETlike HRlike same
+ flags: mafse nreie
+ 1:ABBR
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: EMlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike BODYlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: FONTlike EMlike
+ flags:
+ 2:ACRONYM
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: EMlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike BODYlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: FONTlike EMlike
+ flags:
+ 3:ADDRESS
+ justify
+ 8 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:NOWRAP
+ 6:0:STYLE
+ 7:0:TITLE
+ 3 attr_types
+ core
+ i18n
+ ADDRESS
+ contents: SGML_MIXED
+ tagclass: DIVlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike Plike BRlike APPLETlike HRlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FORMlike DIVlike LIlike APPLETlike HRlike outer BODYlike DELlike
+ icontained: FONTlike EMlike MATHlike Alike TRlike FORMlike Plike DIVlike LIlike ULlike APPLETlike HRlike outer BODYlike same DELlike
+ canclose: FONTlike EMlike MATHlike formula Plike DIVlike same
+ flags:
+ 4:APPLET
+ justify
+ 17 attributes:
+ 0:0:ALIGN
+ 1:0:ALT
+ 2:4:CLASS
+ 3:0:CLEAR
+ 4:0:CODE
+ 5:2:CODEBASE
+ 6:0:DIR
+ 7:0:DOWNLOAD
+ 8:0:HEIGHT
+ 9:0:HSPACE
+ 10:1:ID
+ 11:0:LANG
+ 12:1:NAME
+ 13:0:STYLE
+ 14:0:TITLE
+ 15:0:VSPACE
+ 16:0:WIDTH
+ 4 attr_types
+ align
+ core
+ i18n
+ APPLET
+ contents: SGML_MIXED
+ tagclass: APPLETlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike FORMlike BRlike APPLETlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike formula FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same
+ canclose: FONTlike EMlike MATHlike Alike BRlike APPLETlike same
+ flags:
+ 5:AREA
+ justify
+ 18 attributes:
+ 0:0:ACCESSKEY
+ 1:0:ALT
+ 2:4:CLASS
+ 3:0:CLEAR
+ 4:0:COORDS
+ 5:0:DIR
+ 6:2:HREF
+ 7:1:ID
+ 8:0:LANG
+ 9:0:NOHREF
+ 10:0:NOTAB
+ 11:0:ONBLUR
+ 12:0:ONFOCUS
+ 13:0:SHAPE
+ 14:0:STYLE
+ 15:0:TABINDEX
+ 16:0:TARGET
+ 17:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ AREA
+ contents: SGML_EMPTY
+ tagclass: MAPlike
+ contains:
+ icontains:
+ contained: MAPlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike outer BODYlike
+ canclose: FONTlike EMlike MATHlike Alike formula Plike DIVlike LIlike ULlike
+ flags: endO
+ 6:ARTICLE
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:DIR
+ 2:1:ID
+ 3:0:LANG
+ 4:0:ROLE
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN5
+ contents: SGML_MIXED
+ tagclass: DIVlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike FORMlike Plike DIVlike ULlike BRlike APPLETlike HRlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: TRlike FORMlike DIVlike LIlike APPLETlike HRlike outer BODYlike same DELlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same DELlike
+ canclose: FONTlike EMlike MATHlike Alike formula Plike DIVlike same
+ flags: mafse
+ 7:ASIDE
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:DIR
+ 2:1:ID
+ 3:0:LANG
+ 4:0:ROLE
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN5
+ contents: SGML_MIXED
+ tagclass: DIVlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike FORMlike Plike DIVlike ULlike BRlike APPLETlike HRlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: TRlike FORMlike DIVlike LIlike APPLETlike HRlike outer BODYlike same DELlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same DELlike
+ canclose: FONTlike EMlike MATHlike Alike formula Plike DIVlike same
+ flags: mafse
+ 8:AU
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: EMlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike BODYlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: FONTlike EMlike
+ flags:
+ 9:AUTHOR
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: EMlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike BODYlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: FONTlike EMlike
+ flags:
+ 10:B
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_EMPTY
+ tagclass: FONTlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike BODYlike same
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike BODYlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: FONTlike
+ flags: mafse nreie
+ 11:BANNER
+ nojustify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: DIVlike
+ contains: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike ULlike BRlike APPLETlike HRlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike
+ contained: outer BODYlike DELlike
+ icontained: outer BODYlike DELlike
+ canclose: FONTlike EMlike MATHlike Alike formula Plike DIVlike same
+ flags:
+ 12:BASE
+ justify
+ 6 attributes:
+ 0:4:CLASS
+ 1:2:HREF
+ 2:1:ID
+ 3:0:STYLE
+ 4:0:TARGET
+ 5:0:TITLE
+ 2 attr_types
+ core
+ BASE
+ contents: SGML_EMPTY
+ tagclass: HEADstuff
+ contains:
+ icontains:
+ contained: outer HEADstuff
+ icontained: outer HEADstuff
+ canclose: FONTlike EMlike MATHlike Alike same
+ flags: endO
+ 13:BASEFONT
+ justify
+ 11 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:COLOR
+ 3:0:DIR
+ 4:0:END
+ 5:0:FACE
+ 6:1:ID
+ 7:0:LANG
+ 8:0:SIZE
+ 9:0:STYLE
+ 10:0:TITLE
+ 3 attr_types
+ core
+ i18n
+ FONT
+ contents: SGML_EMPTY
+ tagclass: BRlike
+ contains:
+ icontains:
+ contained: FONTlike EMlike MATHlike Alike TRlike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike outer BODYlike
+ icontained: FONTlike EMlike MATHlike Alike TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike
+ canclose: BRlike APPLETlike HRlike MAPlike same
+ flags: endO
+ 14:BDO
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: Plike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FORMlike DIVlike LIlike APPLETlike HRlike outer BODYlike DELlike
+ icontained: FONTlike EMlike MATHlike Alike TRlike FORMlike Plike DIVlike LIlike ULlike APPLETlike HRlike outer BODYlike same DELlike
+ canclose: FONTlike EMlike MATHlike Alike formula TRlike Plike DIVlike
+ flags:
+ 15:BGSOUND
+ justify
+ 9 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:LOOP
+ 6:2:SRC
+ 7:0:STYLE
+ 8:0:TITLE
+ 3 attr_types
+ core
+ i18n
+ BGSOUND
+ contents: SGML_EMPTY
+ tagclass: BRlike
+ contains:
+ icontains:
+ contained: FONTlike EMlike MATHlike Alike TRlike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike outer BODYlike HEADstuff
+ icontained: FONTlike EMlike MATHlike Alike TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff
+ canclose: FONTlike EMlike MATHlike Alike Plike DIVlike BRlike APPLETlike HRlike same
+ flags: endO
+ 16:BIG
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: FONTlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike BODYlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: FONTlike
+ flags: mafse nreie
+ 17:BLINK
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_EMPTY
+ tagclass: FONTlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike BODYlike same
+ icontained: FONTlike EMlike MATHlike Alike TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: FONTlike
+ flags: mafse nreie
+ 18:BLOCKQUOTE
+ justify
+ 9 attributes:
+ 0:2:CITE
+ 1:4:CLASS
+ 2:0:CLEAR
+ 3:0:DIR
+ 4:1:ID
+ 5:0:LANG
+ 6:0:NOWRAP
+ 7:0:STYLE
+ 8:0:TITLE
+ 3 attr_types
+ core
+ i18n
+ BQ
+ contents: SGML_MIXED
+ tagclass: DIVlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike FORMlike Plike DIVlike ULlike BRlike APPLETlike HRlike MAPlike BODYlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike BODYlike same
+ contained: FORMlike DIVlike LIlike APPLETlike HRlike outer BODYlike same DELlike
+ icontained: FONTlike EMlike MATHlike Alike TRlike FORMlike Plike DIVlike LIlike ULlike APPLETlike HRlike outer BODYlike same DELlike
+ canclose: FONTlike EMlike MATHlike Alike formula Plike DIVlike same
+ flags:
+ 19:BODY
+ justify
+ 15 attributes:
+ 0:0:ALINK
+ 1:2:BACKGROUND
+ 2:0:BGCOLOR
+ 3:4:CLASS
+ 4:0:CLEAR
+ 5:0:DIR
+ 6:1:ID
+ 7:0:LANG
+ 8:0:LINK
+ 9:0:ONLOAD
+ 10:0:ONUNLOAD
+ 11:0:STYLE
+ 12:0:TEXT
+ 13:0:TITLE
+ 14:0:VLINK
+ 4 attr_types
+ bgcolor
+ core
+ i18n
+ BODY
+ contents: SGML_MIXED
+ tagclass: BODYlike
+ contains: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike ULlike BRlike APPLETlike HRlike MAPlike BODYlike DELlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike BODYlike DELlike
+ contained: outer BODYlike
+ icontained: outer BODYlike
+ canclose: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike outer HEADstuff same
+ flags: endO startO
+ 20:BODYTEXT
+ justify
+ 14 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DATA
+ 3:0:DIR
+ 4:1:ID
+ 5:0:LANG
+ 6:0:NAME
+ 7:0:OBJECT
+ 8:0:REF
+ 9:0:STYLE
+ 10:0:TITLE
+ 11:0:TYPE
+ 12:0:VALUE
+ 13:0:VALUETYPE
+ 3 attr_types
+ core
+ i18n
+ BODYTEXT
+ contents: SGML_MIXED
+ tagclass: BODYlike
+ contains: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike ULlike BRlike APPLETlike HRlike MAPlike DELlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike BODYlike same DELlike
+ contained: DIVlike outer BODYlike
+ icontained: FONTlike EMlike MATHlike Alike TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same
+ canclose: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike Plike BRlike APPLETlike HRlike MAPlike same
+ flags: endO startO
+ 21:BQ
+ justify
+ 9 attributes:
+ 0:2:CITE
+ 1:4:CLASS
+ 2:0:CLEAR
+ 3:0:DIR
+ 4:1:ID
+ 5:0:LANG
+ 6:0:NOWRAP
+ 7:0:STYLE
+ 8:0:TITLE
+ 3 attr_types
+ core
+ i18n
+ BQ
+ contents: SGML_MIXED
+ tagclass: DIVlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike FORMlike Plike DIVlike ULlike BRlike APPLETlike HRlike MAPlike BODYlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike BODYlike same
+ contained: FORMlike DIVlike LIlike APPLETlike HRlike outer BODYlike same DELlike
+ icontained: FONTlike EMlike MATHlike Alike TRlike FORMlike Plike DIVlike LIlike ULlike APPLETlike HRlike outer BODYlike same DELlike
+ canclose: FONTlike EMlike MATHlike Alike formula Plike DIVlike same
+ flags:
+ 22:BR
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_EMPTY
+ tagclass: BRlike
+ contains:
+ icontains:
+ contained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike outer BODYlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff
+ canclose: FONTlike EMlike MATHlike Alike formula BRlike same
+ flags: endO
+ 23:BUTTON
+ justify
+ 17 attributes:
+ 0:0:ACCESSKEY
+ 1:4:CLASS
+ 2:0:CLEAR
+ 3:0:DIR
+ 4:0:DISABLED
+ 5:0:FORMACTION
+ 6:1:ID
+ 7:0:LANG
+ 8:0:NAME
+ 9:0:ONBLUR
+ 10:0:ONFOCUS
+ 11:0:READONLY
+ 12:0:STYLE
+ 13:0:TABINDEX
+ 14:0:TITLE
+ 15:0:TYPE
+ 16:0:VALUE
+ 4 attr_types
+ core
+ events
+ i18n
+ BUTTON
+ contents: SGML_MIXED
+ tagclass: APPLETlike
+ contains: FONTlike EMlike MATHlike Plike DIVlike ULlike BRlike APPLETlike MAPlike
+ icontains: FONTlike EMlike MATHlike formula TRlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike
+ canclose: FONTlike EMlike MATHlike Alike formula SELECTlike Plike BRlike same
+ flags:
+ 24:CAPTION
+ justify
+ 9 attributes:
+ 0:0:ACCESSKEY
+ 1:0:ALIGN
+ 2:4:CLASS
+ 3:0:CLEAR
+ 4:0:DIR
+ 5:1:ID
+ 6:0:LANG
+ 7:0:STYLE
+ 8:0:TITLE
+ 5 attr_types
+ align
+ core
+ events
+ i18n
+ CAPTION
+ contents: SGML_MIXED
+ tagclass: Plike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: DIVlike ULlike APPLETlike HRlike DELlike
+ icontained: FONTlike EMlike MATHlike TRlike FORMlike Plike DIVlike LIlike ULlike APPLETlike HRlike outer BODYlike same DELlike
+ canclose: FONTlike EMlike MATHlike Alike formula SELECTlike Plike DIVlike same
+ flags:
+ 25:CENTER
+ justify
+ 8 attributes:
+ 0:0:ALIGN
+ 1:4:CLASS
+ 2:0:CLEAR
+ 3:0:DIR
+ 4:1:ID
+ 5:0:LANG
+ 6:0:STYLE
+ 7:0:TITLE
+ 4 attr_types
+ align
+ core
+ i18n
+ DIV
+ contents: SGML_MIXED
+ tagclass: DIVlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike FORMlike Plike DIVlike ULlike BRlike APPLETlike HRlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FORMlike DIVlike LIlike APPLETlike HRlike outer BODYlike same DELlike
+ icontained: FONTlike EMlike MATHlike TRlike FORMlike Plike DIVlike LIlike ULlike APPLETlike HRlike outer BODYlike same DELlike
+ canclose: FONTlike EMlike MATHlike Alike formula Plike DIVlike LIlike same
+ flags:
+ 26:CITE
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_EMPTY
+ tagclass: EMlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike BODYlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: EMlike
+ flags: nreie
+ 27:CODE
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: EMlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike BODYlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: EMlike
+ flags:
+ 28:COL
+ justify
+ 13 attributes:
+ 0:0:ALIGN
+ 1:0:CHAR
+ 2:0:CHAROFF
+ 3:4:CLASS
+ 4:0:CLEAR
+ 5:0:DIR
+ 6:1:ID
+ 7:0:LANG
+ 8:0:SPAN
+ 9:0:STYLE
+ 10:0:TITLE
+ 11:0:VALIGN
+ 12:0:WIDTH
+ 5 attr_types
+ cellalign
+ core
+ events
+ i18n
+ COL
+ contents: SGML_EMPTY
+ tagclass: HRlike
+ contains:
+ icontains:
+ contained: TRlike ULlike
+ icontained: FONTlike EMlike MATHlike TRlike FORMlike Plike DIVlike LIlike ULlike APPLETlike HRlike outer BODYlike
+ canclose: FONTlike EMlike MATHlike Alike formula SELECTlike Plike DIVlike LIlike ULlike MAPlike same
+ flags: endO
+ 29:COLGROUP
+ justify
+ 13 attributes:
+ 0:0:ALIGN
+ 1:0:CHAR
+ 2:0:CHAROFF
+ 3:4:CLASS
+ 4:0:CLEAR
+ 5:0:DIR
+ 6:1:ID
+ 7:0:LANG
+ 8:0:SPAN
+ 9:0:STYLE
+ 10:0:TITLE
+ 11:0:VALIGN
+ 12:0:WIDTH
+ 5 attr_types
+ cellalign
+ core
+ events
+ i18n
+ COL
+ contents: SGML_EMPTY
+ tagclass: TRlike
+ contains: HRlike
+ icontains: HRlike
+ contained: ULlike
+ icontained: FONTlike EMlike MATHlike TRlike FORMlike Plike DIVlike LIlike ULlike APPLETlike HRlike outer BODYlike
+ canclose: FONTlike EMlike MATHlike Alike formula SELECTlike Plike DIVlike LIlike MAPlike same
+ flags: endO
+ 30:COMMENT
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: MATHlike
+ contains:
+ icontains:
+ contained: FONTlike EMlike MATHlike Alike TRlike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike BODYlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike outer BODYlike HEADstuff
+ canclose: FONTlike EMlike
+ flags:
+ 31:CREDIT
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: Plike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: DIVlike ULlike APPLETlike HRlike DELlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same DELlike
+ canclose: FONTlike EMlike MATHlike Alike Plike DIVlike same
+ flags:
+ 32:DD
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_EMPTY
+ tagclass: LIlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike FORMlike Plike DIVlike ULlike BRlike APPLETlike HRlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: ULlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike APPLETlike HRlike outer BODYlike same
+ canclose: FONTlike EMlike MATHlike Alike formula Plike DIVlike LIlike same
+ flags: endO
+ 33:DEL
+ justify
+ 8 attributes:
+ 0:0:CITE
+ 1:4:CLASS
+ 2:0:DATETIME
+ 3:0:DIR
+ 4:1:ID
+ 5:0:LANG
+ 6:0:STYLE
+ 7:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ DEL
+ contents: SGML_MIXED
+ tagclass: EMlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: FONTlike EMlike DELlike
+ flags:
+ 34:DEL!
+ justify
+ 8 attributes:
+ 0:0:CITE
+ 1:4:CLASS
+ 2:0:DATETIME
+ 3:0:DIR
+ 4:1:ID
+ 5:0:LANG
+ 6:0:STYLE
+ 7:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ DEL
+ contents: SGML_MIXED
+ tagclass: DELlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike FORMlike Plike DIVlike ULlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike BODYlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: FONTlike EMlike DELlike
+ flags:
+ 35:DFN
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: EMlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike FORMlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: FONTlike EMlike
+ flags:
+ 36:DIR
+ justify
+ 14 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:COMPACT
+ 3:0:DINGBAT
+ 4:0:DIR
+ 5:1:ID
+ 6:0:LANG
+ 7:0:MD
+ 8:0:PLAIN
+ 9:2:SRC
+ 10:0:STYLE
+ 11:0:TITLE
+ 12:0:TYPE
+ 13:0:WRAP
+ 3 attr_types
+ core
+ i18n
+ UL
+ contents: SGML_MIXED
+ tagclass: ULlike
+ contains: LIlike BRlike APPLETlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula SELECTlike Plike DIVlike LIlike BRlike APPLETlike HRlike MAPlike
+ contained: FORMlike DIVlike LIlike BRlike APPLETlike HRlike outer BODYlike DELlike
+ icontained: FONTlike EMlike MATHlike formula TRlike FORMlike Plike DIVlike LIlike ULlike APPLETlike HRlike outer BODYlike DELlike
+ canclose: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike Plike DIVlike LIlike ULlike HRlike same
+ flags:
+ 37:DIV
+ justify
+ 8 attributes:
+ 0:0:ALIGN
+ 1:4:CLASS
+ 2:0:CLEAR
+ 3:0:DIR
+ 4:1:ID
+ 5:0:LANG
+ 6:0:STYLE
+ 7:0:TITLE
+ 4 attr_types
+ align
+ core
+ i18n
+ DIV
+ contents: SGML_MIXED
+ tagclass: DIVlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike FORMlike Plike DIVlike ULlike BRlike APPLETlike HRlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: TRlike FORMlike DIVlike LIlike APPLETlike HRlike outer BODYlike same DELlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same DELlike
+ canclose: FONTlike EMlike MATHlike formula Plike DIVlike same
+ flags: mafse
+ 38:DL
+ justify
+ 8 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:COMPACT
+ 3:0:DIR
+ 4:1:ID
+ 5:0:LANG
+ 6:0:STYLE
+ 7:0:TITLE
+ 3 attr_types
+ core
+ i18n
+ DL
+ contents: SGML_MIXED
+ tagclass: ULlike
+ contains: FORMlike LIlike HRlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FORMlike DIVlike LIlike APPLETlike HRlike outer BODYlike DELlike
+ icontained: FONTlike EMlike MATHlike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same DELlike
+ canclose: FONTlike EMlike MATHlike formula SELECTlike Plike DIVlike LIlike
+ flags:
+ 39:DLC
+ justify
+ 8 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:COMPACT
+ 3:0:DIR
+ 4:1:ID
+ 5:0:LANG
+ 6:0:STYLE
+ 7:0:TITLE
+ 3 attr_types
+ core
+ i18n
+ DL
+ contents: SGML_MIXED
+ tagclass: ULlike
+ contains: FORMlike LIlike HRlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FORMlike DIVlike LIlike APPLETlike HRlike outer BODYlike DELlike
+ icontained: FONTlike EMlike MATHlike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same DELlike
+ canclose: FONTlike EMlike MATHlike Alike formula SELECTlike Plike DIVlike LIlike
+ flags:
+ 40:DT
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_EMPTY
+ tagclass: LIlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike BRlike APPLETlike MAPlike
+ contained: ULlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer
+ canclose: FONTlike EMlike MATHlike Alike formula Plike DIVlike LIlike same
+ flags: endO
+ 41:EM
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_EMPTY
+ tagclass: EMlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike BODYlike same
+ icontained: FONTlike EMlike MATHlike Alike TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: FONTlike EMlike
+ flags: nreie
+ 42:EMBED
+ justify
+ 21 attributes:
+ 0:0:ALIGN
+ 1:0:ALT
+ 2:0:BORDER
+ 3:4:CLASS
+ 4:0:CLEAR
+ 5:0:DIR
+ 6:0:HEIGHT
+ 7:1:ID
+ 8:0:IMAGEMAP
+ 9:0:ISMAP
+ 10:0:LANG
+ 11:0:MD
+ 12:1:NAME
+ 13:0:NOFLOW
+ 14:0:PARAMS
+ 15:2:SRC
+ 16:0:STYLE
+ 17:0:TITLE
+ 18:0:UNITS
+ 19:0:USEMAP
+ 20:0:WIDTH
+ 4 attr_types
+ align
+ core
+ i18n
+ EMBED
+ contents: SGML_EMPTY
+ tagclass: APPLETlike
+ contains: FONTlike EMlike MATHlike Plike BRlike APPLETlike HRlike MAPlike same
+ icontains: FONTlike EMlike MATHlike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike APPLETlike HRlike outer BODYlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same
+ canclose: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike outer
+ flags: endO
+ 43:FIELDSET
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: DIVlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike Plike DIVlike ULlike BRlike APPLETlike HRlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike FORMlike Plike DIVlike LIlike APPLETlike HRlike same DELlike
+ icontained: FONTlike EMlike MATHlike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same DELlike
+ canclose: FONTlike EMlike MATHlike Alike formula SELECTlike MAPlike same
+ flags:
+ 44:FIG
+ justify
+ 17 attributes:
+ 0:0:ALIGN
+ 1:0:BORDER
+ 2:4:CLASS
+ 3:0:CLEAR
+ 4:0:DIR
+ 5:0:HEIGHT
+ 6:1:ID
+ 7:0:IMAGEMAP
+ 8:0:ISOBJECT
+ 9:0:LANG
+ 10:0:MD
+ 11:0:NOFLOW
+ 12:2:SRC
+ 13:0:STYLE
+ 14:0:TITLE
+ 15:0:UNITS
+ 16:0:WIDTH
+ 4 attr_types
+ align
+ core
+ i18n
+ FIG
+ contents: SGML_MIXED
+ tagclass: DIVlike
+ contains: Plike DIVlike ULlike BRlike APPLETlike HRlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FORMlike DIVlike LIlike APPLETlike HRlike outer BODYlike DELlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike APPLETlike HRlike outer BODYlike same DELlike
+ canclose: FONTlike EMlike MATHlike Alike SELECTlike Plike DIVlike MAPlike same
+ flags:
+ 45:FIGURE
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:DIR
+ 2:1:ID
+ 3:0:LANG
+ 4:0:ROLE
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN5
+ contents: SGML_MIXED
+ tagclass: DIVlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike FORMlike Plike DIVlike ULlike BRlike APPLETlike HRlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: TRlike FORMlike DIVlike LIlike APPLETlike HRlike outer BODYlike same DELlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same DELlike
+ canclose: FONTlike EMlike MATHlike Alike formula Plike DIVlike same
+ flags: mafse
+ 46:FN
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: DIVlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike FORMlike Plike DIVlike ULlike BRlike APPLETlike HRlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FORMlike DIVlike LIlike APPLETlike HRlike outer BODYlike same DELlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same DELlike
+ canclose: FONTlike EMlike MATHlike Alike SELECTlike Plike BRlike same
+ flags:
+ 47:FONT
+ justify
+ 11 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:COLOR
+ 3:0:DIR
+ 4:0:END
+ 5:0:FACE
+ 6:1:ID
+ 7:0:LANG
+ 8:0:SIZE
+ 9:0:STYLE
+ 10:0:TITLE
+ 3 attr_types
+ core
+ i18n
+ FONT
+ contents: SGML_EMPTY
+ tagclass: FONTlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike outer BODYlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: FONTlike
+ flags: mafse nreie
+ 48:FOOTER
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:DIR
+ 2:1:ID
+ 3:0:LANG
+ 4:0:ROLE
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN5
+ contents: SGML_MIXED
+ tagclass: DIVlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike FORMlike Plike DIVlike ULlike BRlike APPLETlike HRlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: TRlike FORMlike DIVlike LIlike APPLETlike HRlike outer BODYlike same DELlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same DELlike
+ canclose: FONTlike EMlike MATHlike Alike formula Plike DIVlike same
+ flags: mafse
+ 49:FORM
+ justify
+ 17 attributes:
+ 0:0:ACCEPT
+ 1:0:ACCEPT-CHARSET
+ 2:2:ACTION
+ 3:4:CLASS
+ 4:0:CLEAR
+ 5:0:DIR
+ 6:0:ENCTYPE
+ 7:1:ID
+ 8:0:LANG
+ 9:0:METHOD
+ 10:0:ONRESET
+ 11:0:ONSUBMIT
+ 12:0:SCRIPT
+ 13:0:STYLE
+ 14:0:SUBJECT
+ 15:0:TARGET
+ 16:0:TITLE
+ 3 attr_types
+ core
+ i18n
+ FORM
+ contents: SGML_EMPTY
+ tagclass: FORMlike
+ contains: FONTlike EMlike MATHlike Alike TRlike SELECTlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike
+ contained: FONTlike EMlike MATHlike DIVlike LIlike ULlike APPLETlike HRlike outer BODYlike DELlike
+ icontained: FONTlike EMlike MATHlike Plike DIVlike LIlike ULlike APPLETlike outer BODYlike DELlike
+ canclose: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike LIlike ULlike MAPlike same
+ flags:
+ 50:FRAME
+ justify
+ 12 attributes:
+ 0:4:CLASS
+ 1:0:FRAMEBORDER
+ 2:1:ID
+ 3:2:LONGDESC
+ 4:0:MARGINHEIGHT
+ 5:0:MARGINWIDTH
+ 6:0:NAME
+ 7:0:NORESIZE
+ 8:0:SCROLLING
+ 9:2:SRC
+ 10:0:STYLE
+ 11:0:TITLE
+ 2 attr_types
+ core
+ FRAME
+ contents: SGML_EMPTY
+ tagclass: outer
+ contains:
+ icontains:
+ contained: outer
+ icontained: outer
+ canclose: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike outer same
+ flags: endO
+ 51:FRAMESET
+ justify
+ 4 attributes:
+ 0:0:COLS
+ 1:0:ONLOAD
+ 2:0:ONUNLOAD
+ 3:0:ROWS
+ 1 attr_types
+ FRAMESET
+ contents: SGML_MIXED
+ tagclass: outer
+ contains: outer same
+ icontains: outer same
+ contained: outer same
+ icontained: BRlike APPLETlike outer same
+ canclose: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike outer same
+ flags:
+ 52:H1
+ nojustify
+ 14 attributes:
+ 0:0:ALIGN
+ 1:4:CLASS
+ 2:0:CLEAR
+ 3:0:DINGBAT
+ 4:0:DIR
+ 5:1:ID
+ 6:0:LANG
+ 7:0:MD
+ 8:0:NOWRAP
+ 9:0:SEQNUM
+ 10:0:SKIP
+ 11:2:SRC
+ 12:0:STYLE
+ 13:0:TITLE
+ 5 attr_types
+ align
+ core
+ events
+ i18n
+ H
+ contents: SGML_MIXED
+ tagclass: Plike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula SELECTlike BRlike APPLETlike MAPlike
+ contained: FORMlike DIVlike LIlike APPLETlike HRlike outer BODYlike DELlike
+ icontained: FONTlike EMlike MATHlike Alike TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike DELlike
+ canclose: FONTlike EMlike MATHlike formula Plike same
+ flags:
+ 53:H2
+ nojustify
+ 14 attributes:
+ 0:0:ALIGN
+ 1:4:CLASS
+ 2:0:CLEAR
+ 3:0:DINGBAT
+ 4:0:DIR
+ 5:1:ID
+ 6:0:LANG
+ 7:0:MD
+ 8:0:NOWRAP
+ 9:0:SEQNUM
+ 10:0:SKIP
+ 11:2:SRC
+ 12:0:STYLE
+ 13:0:TITLE
+ 5 attr_types
+ align
+ core
+ events
+ i18n
+ H
+ contents: SGML_MIXED
+ tagclass: Plike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula SELECTlike BRlike APPLETlike MAPlike
+ contained: FORMlike DIVlike LIlike APPLETlike HRlike outer BODYlike DELlike
+ icontained: FONTlike EMlike MATHlike Alike TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike DELlike
+ canclose: FONTlike EMlike MATHlike formula Plike same
+ flags:
+ 54:H3
+ nojustify
+ 14 attributes:
+ 0:0:ALIGN
+ 1:4:CLASS
+ 2:0:CLEAR
+ 3:0:DINGBAT
+ 4:0:DIR
+ 5:1:ID
+ 6:0:LANG
+ 7:0:MD
+ 8:0:NOWRAP
+ 9:0:SEQNUM
+ 10:0:SKIP
+ 11:2:SRC
+ 12:0:STYLE
+ 13:0:TITLE
+ 5 attr_types
+ align
+ core
+ events
+ i18n
+ H
+ contents: SGML_MIXED
+ tagclass: Plike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula SELECTlike BRlike APPLETlike MAPlike
+ contained: FORMlike DIVlike LIlike APPLETlike HRlike outer BODYlike DELlike
+ icontained: FONTlike EMlike MATHlike Alike TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike DELlike
+ canclose: FONTlike EMlike MATHlike formula Plike same
+ flags:
+ 55:H4
+ nojustify
+ 14 attributes:
+ 0:0:ALIGN
+ 1:4:CLASS
+ 2:0:CLEAR
+ 3:0:DINGBAT
+ 4:0:DIR
+ 5:1:ID
+ 6:0:LANG
+ 7:0:MD
+ 8:0:NOWRAP
+ 9:0:SEQNUM
+ 10:0:SKIP
+ 11:2:SRC
+ 12:0:STYLE
+ 13:0:TITLE
+ 5 attr_types
+ align
+ core
+ events
+ i18n
+ H
+ contents: SGML_MIXED
+ tagclass: Plike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula SELECTlike BRlike APPLETlike MAPlike
+ contained: FORMlike DIVlike LIlike APPLETlike HRlike outer BODYlike DELlike
+ icontained: FONTlike EMlike MATHlike Alike TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike DELlike
+ canclose: FONTlike EMlike MATHlike formula Plike same
+ flags:
+ 56:H5
+ nojustify
+ 14 attributes:
+ 0:0:ALIGN
+ 1:4:CLASS
+ 2:0:CLEAR
+ 3:0:DINGBAT
+ 4:0:DIR
+ 5:1:ID
+ 6:0:LANG
+ 7:0:MD
+ 8:0:NOWRAP
+ 9:0:SEQNUM
+ 10:0:SKIP
+ 11:2:SRC
+ 12:0:STYLE
+ 13:0:TITLE
+ 5 attr_types
+ align
+ core
+ events
+ i18n
+ H
+ contents: SGML_MIXED
+ tagclass: Plike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula SELECTlike BRlike APPLETlike MAPlike
+ contained: FORMlike DIVlike LIlike APPLETlike HRlike outer BODYlike DELlike
+ icontained: FONTlike EMlike MATHlike Alike TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike DELlike
+ canclose: FONTlike EMlike MATHlike formula Plike same
+ flags:
+ 57:H6
+ nojustify
+ 14 attributes:
+ 0:0:ALIGN
+ 1:4:CLASS
+ 2:0:CLEAR
+ 3:0:DINGBAT
+ 4:0:DIR
+ 5:1:ID
+ 6:0:LANG
+ 7:0:MD
+ 8:0:NOWRAP
+ 9:0:SEQNUM
+ 10:0:SKIP
+ 11:2:SRC
+ 12:0:STYLE
+ 13:0:TITLE
+ 5 attr_types
+ align
+ core
+ events
+ i18n
+ H
+ contents: SGML_MIXED
+ tagclass: Plike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula SELECTlike BRlike APPLETlike MAPlike
+ contained: FORMlike DIVlike LIlike APPLETlike HRlike outer BODYlike DELlike
+ icontained: FONTlike EMlike MATHlike Alike TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike DELlike
+ canclose: FONTlike EMlike MATHlike formula Plike same
+ flags:
+ 58:HEAD
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: HEADstuff
+ contains: BRlike APPLETlike HRlike MAPlike HEADstuff
+ icontains: BRlike APPLETlike HRlike HEADstuff
+ contained: outer
+ icontained: outer
+ canclose: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike outer same
+ flags: endO startO mafse
+ 59:HEADER
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:DIR
+ 2:1:ID
+ 3:0:LANG
+ 4:0:ROLE
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN5
+ contents: SGML_MIXED
+ tagclass: DIVlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike FORMlike Plike DIVlike ULlike BRlike APPLETlike HRlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: TRlike FORMlike DIVlike LIlike APPLETlike HRlike outer BODYlike same DELlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same DELlike
+ canclose: FONTlike EMlike MATHlike Alike formula Plike DIVlike same
+ flags: mafse
+ 60:HR
+ justify
+ 13 attributes:
+ 0:0:ALIGN
+ 1:4:CLASS
+ 2:0:CLEAR
+ 3:0:DIR
+ 4:1:ID
+ 5:0:LANG
+ 6:0:MD
+ 7:0:NOSHADE
+ 8:0:SIZE
+ 9:2:SRC
+ 10:0:STYLE
+ 11:0:TITLE
+ 12:0:WIDTH
+ 4 attr_types
+ align
+ core
+ i18n
+ HR
+ contents: SGML_EMPTY
+ tagclass: HRlike
+ contains:
+ icontains:
+ contained: FORMlike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike outer BODYlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike outer BODYlike
+ canclose: FONTlike EMlike MATHlike formula TRlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike same
+ flags: endO
+ 61:HTML
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: outer
+ contains: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike ULlike BRlike APPLETlike HRlike MAPlike outer BODYlike HEADstuff
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike outer BODYlike HEADstuff
+ contained:
+ icontained:
+ canclose: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike outer
+ flags: endO startO
+ 62:HY
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_EMPTY
+ tagclass: BRlike
+ contains:
+ icontains:
+ contained: FONTlike EMlike MATHlike Alike formula FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike outer BODYlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff
+ canclose: FONTlike EMlike MATHlike Alike formula BRlike same
+ flags: endO
+ 63:I
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_EMPTY
+ tagclass: FONTlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike BODYlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: FONTlike
+ flags: mafse nreie
+ 64:IFRAME
+ justify
+ 14 attributes:
+ 0:0:ALIGN
+ 1:4:CLASS
+ 2:0:FRAMEBORDER
+ 3:0:HEIGHT
+ 4:1:ID
+ 5:2:LONGDESC
+ 6:0:MARGINHEIGHT
+ 7:0:MARGINWIDTH
+ 8:0:NAME
+ 9:0:SCROLLING
+ 10:2:SRC
+ 11:0:STYLE
+ 12:0:TITLE
+ 13:0:WIDTH
+ 3 attr_types
+ align
+ core
+ IFRAME
+ contents: SGML_MIXED
+ tagclass: APPLETlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike FORMlike Plike DIVlike ULlike BRlike APPLETlike HRlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike formula FORMlike Plike DIVlike LIlike APPLETlike HRlike outer BODYlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike APPLETlike HRlike outer BODYlike same
+ canclose: FONTlike EMlike MATHlike Alike formula SELECTlike Plike BRlike APPLETlike outer HEADstuff same
+ flags:
+ 65:IMG
+ justify
+ 22 attributes:
+ 0:0:ALIGN
+ 1:0:ALT
+ 2:0:BORDER
+ 3:4:CLASS
+ 4:0:CLEAR
+ 5:0:DIR
+ 6:0:HEIGHT
+ 7:0:HSPACE
+ 8:1:ID
+ 9:0:ISMAP
+ 10:0:ISOBJECT
+ 11:0:LANG
+ 12:2:LONGDESC
+ 13:0:MD
+ 14:0:NAME
+ 15:2:SRC
+ 16:0:STYLE
+ 17:0:TITLE
+ 18:0:UNITS
+ 19:2:USEMAP
+ 20:0:VSPACE
+ 21:0:WIDTH
+ 5 attr_types
+ align
+ core
+ events
+ i18n
+ IMG
+ contents: SGML_EMPTY
+ tagclass: BRlike
+ contains:
+ icontains:
+ contained: FONTlike EMlike MATHlike Alike formula FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike outer BODYlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike
+ canclose: same
+ flags: endO
+ 66:INPUT
+ justify
+ 35 attributes:
+ 0:0:ACCEPT
+ 1:0:ACCEPT-CHARSET
+ 2:0:ACCESSKEY
+ 3:0:ALIGN
+ 4:0:ALT
+ 5:0:CHECKED
+ 6:4:CLASS
+ 7:0:CLEAR
+ 8:0:DIR
+ 9:0:DISABLED
+ 10:0:ERROR
+ 11:0:HEIGHT
+ 12:1:ID
+ 13:0:ISMAP
+ 14:0:LANG
+ 15:0:MAX
+ 16:0:MAXLENGTH
+ 17:0:MD
+ 18:0:MIN
+ 19:0:NAME
+ 20:0:NOTAB
+ 21:0:ONBLUR
+ 22:0:ONCHANGE
+ 23:0:ONFOCUS
+ 24:0:ONSELECT
+ 25:0:READONLY
+ 26:0:SIZE
+ 27:2:SRC
+ 28:0:STYLE
+ 29:0:TABINDEX
+ 30:0:TITLE
+ 31:0:TYPE
+ 32:0:USEMAP
+ 33:0:VALUE
+ 34:0:WIDTH
+ 5 attr_types
+ align
+ core
+ events
+ i18n
+ INPUT
+ contents: SGML_EMPTY
+ tagclass: SELECTlike
+ contains:
+ icontains:
+ contained: FONTlike EMlike MATHlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike
+ icontained: FONTlike EMlike MATHlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike
+ canclose: FONTlike EMlike MATHlike Alike SELECTlike BRlike MAPlike same
+ flags: endO
+ 67:INS
+ justify
+ 8 attributes:
+ 0:0:CITE
+ 1:4:CLASS
+ 2:0:DATETIME
+ 3:0:DIR
+ 4:1:ID
+ 5:0:LANG
+ 6:0:STYLE
+ 7:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ DEL
+ contents: SGML_MIXED
+ tagclass: EMlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: FONTlike EMlike DELlike
+ flags:
+ 68:INS!
+ justify
+ 8 attributes:
+ 0:0:CITE
+ 1:4:CLASS
+ 2:0:DATETIME
+ 3:0:DIR
+ 4:1:ID
+ 5:0:LANG
+ 6:0:STYLE
+ 7:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ DEL
+ contents: SGML_MIXED
+ tagclass: DELlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike FORMlike Plike DIVlike ULlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike BODYlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: FONTlike EMlike DELlike
+ flags:
+ 69:ISINDEX
+ justify
+ 9 attributes:
+ 0:2:ACTION
+ 1:4:CLASS
+ 2:0:DIR
+ 3:2:HREF
+ 4:1:ID
+ 5:0:LANG
+ 6:0:PROMPT
+ 7:0:STYLE
+ 8:0:TITLE
+ 3 attr_types
+ core
+ i18n
+ ISINDEX
+ contents: SGML_EMPTY
+ tagclass: MAPlike
+ contains:
+ icontains:
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike outer BODYlike HEADstuff
+ icontained: FONTlike EMlike MATHlike Alike TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike outer BODYlike HEADstuff
+ canclose: FONTlike EMlike MATHlike same
+ flags: endO
+ 70:KBD
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: EMlike
+ contains:
+ icontains:
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike BODYlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff
+ canclose: FONTlike EMlike
+ flags:
+ 71:KEYGEN
+ justify
+ 8 attributes:
+ 0:0:CHALLENGE
+ 1:4:CLASS
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:NAME
+ 6:0:STYLE
+ 7:0:TITLE
+ 3 attr_types
+ core
+ i18n
+ KEYGEN
+ contents: SGML_EMPTY
+ tagclass: SELECTlike
+ contains:
+ icontains:
+ contained: FONTlike EMlike MATHlike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike
+ icontained: FONTlike EMlike MATHlike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike
+ canclose: formula TRlike SELECTlike same
+ flags: endO
+ 72:LABEL
+ justify
+ 11 attributes:
+ 0:0:ACCESSKEY
+ 1:4:CLASS
+ 2:0:CLEAR
+ 3:0:DIR
+ 4:0:FOR
+ 5:1:ID
+ 6:0:LANG
+ 7:0:ONBLUR
+ 8:0:ONFOCUS
+ 9:0:STYLE
+ 10:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ LABEL
+ contents: SGML_MIXED
+ tagclass: EMlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike
+ contained: FONTlike EMlike MATHlike Alike formula FORMlike Plike DIVlike LIlike APPLETlike HRlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike APPLETlike HRlike outer BODYlike
+ canclose: FONTlike EMlike MATHlike
+ flags:
+ 73:LEGEND
+ justify
+ 9 attributes:
+ 0:0:ACCESSKEY
+ 1:0:ALIGN
+ 2:4:CLASS
+ 3:0:CLEAR
+ 4:0:DIR
+ 5:1:ID
+ 6:0:LANG
+ 7:0:STYLE
+ 8:0:TITLE
+ 5 attr_types
+ align
+ core
+ events
+ i18n
+ CAPTION
+ contents: SGML_MIXED
+ tagclass: EMlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: DIVlike
+ icontained: FONTlike EMlike MATHlike TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same
+ canclose: FONTlike EMlike
+ flags:
+ 74:LH
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_EMPTY
+ tagclass: LIlike
+ contains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike Plike DIVlike ULlike BRlike APPLETlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: ULlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer same
+ canclose: FONTlike EMlike MATHlike Alike formula Plike DIVlike LIlike same
+ flags: endO
+ 75:LI
+ justify
+ 13 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DINGBAT
+ 3:0:DIR
+ 4:1:ID
+ 5:0:LANG
+ 6:0:MD
+ 7:0:SKIP
+ 8:2:SRC
+ 9:0:STYLE
+ 10:0:TITLE
+ 11:0:TYPE
+ 12:0:VALUE
+ 4 attr_types
+ core
+ events
+ i18n
+ LI
+ contents: SGML_EMPTY
+ tagclass: LIlike
+ contains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike ULlike BRlike APPLETlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: ULlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer same
+ canclose: FONTlike EMlike MATHlike Alike formula Plike DIVlike LIlike same
+ flags: endO
+ 76:LINK
+ justify
+ 14 attributes:
+ 0:0:CHARSET
+ 1:4:CLASS
+ 2:0:DIR
+ 3:2:HREF
+ 4:0:HREFLANG
+ 5:1:ID
+ 6:0:LANG
+ 7:0:MEDIA
+ 8:0:REL
+ 9:0:REV
+ 10:0:STYLE
+ 11:0:TARGET
+ 12:0:TITLE
+ 13:0:TYPE
+ 4 attr_types
+ core
+ events
+ i18n
+ LINK
+ contents: SGML_EMPTY
+ tagclass: MAPlike
+ contains:
+ icontains:
+ contained: outer HEADstuff
+ icontained: outer HEADstuff
+ canclose: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike
+ flags: endO
+ 77:LISTING
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_LITTERAL
+ tagclass: ULlike
+ contains:
+ icontains:
+ contained: DIVlike LIlike APPLETlike HRlike outer BODYlike DELlike
+ icontained: Plike DIVlike LIlike ULlike APPLETlike HRlike outer BODYlike DELlike
+ canclose: FONTlike EMlike MATHlike Alike formula Plike DIVlike LIlike ULlike same
+ flags:
+ 78:MAIN
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:DIR
+ 2:1:ID
+ 3:0:LANG
+ 4:0:ROLE
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN5
+ contents: SGML_MIXED
+ tagclass: DIVlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike FORMlike Plike DIVlike ULlike BRlike APPLETlike HRlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: TRlike FORMlike DIVlike LIlike APPLETlike HRlike outer BODYlike same DELlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same DELlike
+ canclose: FONTlike EMlike MATHlike Alike formula Plike DIVlike same
+ flags: mafse
+ 79:MAP
+ justify
+ 8 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:1:NAME
+ 6:0:STYLE
+ 7:0:TITLE
+ 3 attr_types
+ core
+ i18n
+ MAP
+ contents: SGML_MIXED
+ tagclass: MAPlike
+ contains: MAPlike
+ icontains: MAPlike
+ contained: FONTlike EMlike MATHlike Alike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike
+ canclose: FONTlike EMlike MATHlike Alike formula Plike LIlike
+ flags:
+ 80:MARQUEE
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: HRlike
+ contains: FONTlike EMlike MATHlike Alike
+ icontains: FONTlike EMlike MATHlike Alike formula BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike outer BODYlike
+ icontained: FONTlike EMlike MATHlike TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same
+ canclose: MATHlike Alike formula BRlike APPLETlike same
+ flags:
+ 81:MATH
+ justify
+ 8 attributes:
+ 0:0:BOX
+ 1:4:CLASS
+ 2:0:CLEAR
+ 3:0:DIR
+ 4:1:ID
+ 5:0:LANG
+ 6:0:STYLE
+ 7:0:TITLE
+ 3 attr_types
+ core
+ i18n
+ MATH
+ contents: SGML_LITTERAL
+ tagclass: MATHlike
+ contains: FONTlike EMlike MATHlike Alike formula SELECTlike BRlike APPLETlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike BODYlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: FONTlike EMlike MATHlike Alike formula
+ flags:
+ 82:MENU
+ justify
+ 14 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:COMPACT
+ 3:0:DINGBAT
+ 4:0:DIR
+ 5:1:ID
+ 6:0:LANG
+ 7:0:MD
+ 8:0:PLAIN
+ 9:2:SRC
+ 10:0:STYLE
+ 11:0:TITLE
+ 12:0:TYPE
+ 13:0:WRAP
+ 3 attr_types
+ core
+ i18n
+ UL
+ contents: SGML_MIXED
+ tagclass: ULlike
+ contains: LIlike BRlike APPLETlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula SELECTlike Plike DIVlike LIlike BRlike APPLETlike HRlike MAPlike
+ contained: FORMlike DIVlike LIlike BRlike APPLETlike HRlike outer DELlike
+ icontained: FONTlike EMlike MATHlike formula TRlike FORMlike Plike DIVlike LIlike ULlike APPLETlike HRlike outer BODYlike DELlike
+ canclose: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike Plike DIVlike LIlike ULlike MAPlike same
+ flags:
+ 83:META
+ justify
+ 5 attributes:
+ 0:0:CHARSET
+ 1:0:CONTENT
+ 2:0:HTTP-EQUIV
+ 3:0:NAME
+ 4:0:SCHEME
+ 1 attr_types
+ META
+ contents: SGML_EMPTY
+ tagclass: MAPlike
+ contains:
+ icontains:
+ contained: outer HEADstuff
+ icontained: outer HEADstuff
+ canclose: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike
+ flags: endO
+ 84:NAV
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:DIR
+ 2:1:ID
+ 3:0:LANG
+ 4:0:ROLE
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN5
+ contents: SGML_MIXED
+ tagclass: DIVlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike FORMlike Plike DIVlike ULlike BRlike APPLETlike HRlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: TRlike FORMlike DIVlike LIlike APPLETlike HRlike outer BODYlike same DELlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same DELlike
+ canclose: FONTlike EMlike MATHlike Alike formula Plike DIVlike same
+ flags: mafse
+ 85:NEXTID
+ justify
+ 1 attributes:
+ 0:0:N
+ 1 attr_types
+ NEXTID
+ contents: SGML_EMPTY
+ tagclass: BRlike
+ contains:
+ icontains:
+ contained: outer HEADstuff
+ icontained: FONTlike EMlike MATHlike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike outer
+ canclose: FONTlike
+ flags: endO
+ 86:NOFRAMES
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: BODYlike
+ contains: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike ULlike BRlike APPLETlike HRlike MAPlike BODYlike DELlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike DELlike
+ contained: BRlike APPLETlike HRlike outer
+ icontained: BRlike APPLETlike HRlike outer
+ canclose: FONTlike EMlike MATHlike Alike formula SELECTlike Plike DIVlike LIlike ULlike HRlike MAPlike
+ flags:
+ 87:NOTE
+ justify
+ 10 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:MD
+ 6:8:ROLE
+ 7:2:SRC
+ 8:0:STYLE
+ 9:0:TITLE
+ 3 attr_types
+ core
+ i18n
+ NOTE
+ contents: SGML_MIXED
+ tagclass: DIVlike
+ contains: FONTlike EMlike MATHlike Alike TRlike FORMlike Plike DIVlike ULlike BRlike APPLETlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: formula TRlike FORMlike DIVlike LIlike BRlike APPLETlike HRlike outer BODYlike DELlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same DELlike
+ canclose: FONTlike EMlike MATHlike Alike formula Plike DIVlike same
+ flags:
+ 88:OBJECT
+ justify
+ 26 attributes:
+ 0:0:ALIGN
+ 1:0:ARCHIVE
+ 2:0:BORDER
+ 3:4:CLASS
+ 4:2:CLASSID
+ 5:2:CODEBASE
+ 6:0:CODETYPE
+ 7:2:DATA
+ 8:0:DECLARE
+ 9:0:DIR
+ 10:0:HEIGHT
+ 11:0:HSPACE
+ 12:1:ID
+ 13:0:ISMAP
+ 14:0:LANG
+ 15:0:NAME
+ 16:0:NOTAB
+ 17:0:SHAPES
+ 18:0:STANDBY
+ 19:0:STYLE
+ 20:0:TABINDEX
+ 21:0:TITLE
+ 22:0:TYPE
+ 23:2:USEMAP
+ 24:0:VSPACE
+ 25:0:WIDTH
+ 5 attr_types
+ align
+ core
+ events
+ i18n
+ OBJECT
+ contents: SGML_LITTERAL
+ tagclass: APPLETlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike FORMlike Plike DIVlike ULlike BRlike APPLETlike HRlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike formula FORMlike Plike DIVlike LIlike APPLETlike HRlike outer BODYlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike APPLETlike HRlike outer BODYlike same
+ canclose: FONTlike EMlike MATHlike Alike formula SELECTlike Plike LIlike ULlike BRlike APPLETlike same
+ flags: frecyc
+ 89:OL
+ justify
+ 12 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:COMPACT
+ 3:0:CONTINUE
+ 4:0:DIR
+ 5:1:ID
+ 6:0:LANG
+ 7:0:SEQNUM
+ 8:0:START
+ 9:0:STYLE
+ 10:0:TITLE
+ 11:0:TYPE
+ 3 attr_types
+ core
+ i18n
+ OL
+ contents: SGML_MIXED
+ tagclass: ULlike
+ contains: LIlike HRlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FORMlike DIVlike LIlike BRlike APPLETlike HRlike outer BODYlike DELlike
+ icontained: FONTlike EMlike MATHlike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same DELlike
+ canclose: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike Plike DIVlike LIlike ULlike MAPlike same
+ flags:
+ 90:OPTION
+ justify
+ 13 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:0:DISABLED
+ 4:0:ERROR
+ 5:1:ID
+ 6:0:LABEL
+ 7:0:LANG
+ 8:0:SELECTED
+ 9:0:SHAPE
+ 10:0:STYLE
+ 11:0:TITLE
+ 12:0:VALUE
+ 4 attr_types
+ core
+ events
+ i18n
+ OPTION
+ contents: SGML_EMPTY
+ tagclass: MAPlike
+ contains:
+ icontains:
+ contained: SELECTlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike
+ canclose: FONTlike EMlike MATHlike Alike formula Plike DIVlike same
+ flags: endO
+ 91:OVERLAY
+ justify
+ 12 attributes:
+ 0:4:CLASS
+ 1:0:HEIGHT
+ 2:1:ID
+ 3:0:IMAGEMAP
+ 4:0:MD
+ 5:2:SRC
+ 6:0:STYLE
+ 7:0:TITLE
+ 8:0:UNITS
+ 9:0:WIDTH
+ 10:0:X
+ 11:0:Y
+ 2 attr_types
+ core
+ OVERLAY
+ contents: SGML_EMPTY
+ tagclass: HRlike
+ contains:
+ icontains:
+ contained: DIVlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike
+ canclose: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike Plike DIVlike LIlike ULlike BRlike APPLETlike same
+ flags: endO
+ 92:P
+ justify
+ 9 attributes:
+ 0:0:ALIGN
+ 1:4:CLASS
+ 2:0:CLEAR
+ 3:0:DIR
+ 4:1:ID
+ 5:0:LANG
+ 6:0:NOWRAP
+ 7:0:STYLE
+ 8:0:TITLE
+ 4 attr_types
+ align
+ core
+ i18n
+ P
+ contents: SGML_EMPTY
+ tagclass: Plike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FORMlike DIVlike LIlike APPLETlike HRlike outer BODYlike DELlike
+ icontained: FONTlike EMlike MATHlike TRlike FORMlike Plike DIVlike LIlike ULlike APPLETlike HRlike outer BODYlike same DELlike
+ canclose: FONTlike EMlike MATHlike formula Plike same
+ flags: endO
+ 93:PARAM
+ justify
+ 18 attributes:
+ 0:0:ACCEPT
+ 1:0:ACCEPT-CHARSET
+ 2:0:ACCEPT-ENCODING
+ 3:4:CLASS
+ 4:0:CLEAR
+ 5:0:DATA
+ 6:0:DIR
+ 7:1:ID
+ 8:0:LANG
+ 9:0:NAME
+ 10:0:OBJECT
+ 11:0:REF
+ 12:0:STYLE
+ 13:0:TITLE
+ 14:0:TYPE
+ 15:0:VALUE
+ 16:0:VALUEREF
+ 17:0:VALUETYPE
+ 3 attr_types
+ core
+ i18n
+ PARAM
+ contents: SGML_EMPTY
+ tagclass: BRlike
+ contains:
+ icontains:
+ contained: Plike LIlike BRlike APPLETlike outer BODYlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike
+ canclose: TRlike SELECTlike Plike LIlike BRlike same
+ flags: endO
+ 94:PLAINTEXT
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_LITTERAL
+ tagclass: outer
+ contains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike outer BODYlike HEADstuff same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike outer BODYlike HEADstuff same
+ contained: outer same
+ icontained: outer same
+ canclose: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike outer BODYlike
+ flags: endO
+ 95:PRE
+ nojustify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: DIVlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike HRlike MAPlike
+ icontains: EMlike MATHlike Alike formula SELECTlike BRlike APPLETlike HRlike MAPlike
+ contained: FORMlike DIVlike LIlike APPLETlike HRlike outer BODYlike DELlike
+ icontained: formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike APPLETlike HRlike outer BODYlike DELlike
+ canclose: EMlike MATHlike Alike formula Plike DIVlike LIlike same
+ flags:
+ 96:Q
+ justify
+ 8 attributes:
+ 0:2:CITE
+ 1:4:CLASS
+ 2:0:CLEAR
+ 3:0:DIR
+ 4:1:ID
+ 5:0:LANG
+ 6:0:STYLE
+ 7:0:TITLE
+ 3 attr_types
+ core
+ i18n
+ Q
+ contents: SGML_MIXED
+ tagclass: EMlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike BODYlike same
+ icontained: FONTlike EMlike MATHlike Alike TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: FONTlike EMlike
+ flags:
+ 97:S
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: FONTlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike BODYlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: FONTlike
+ flags:
+ 98:SAMP
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: EMlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike BODYlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: EMlike
+ flags: nreie
+ 99:SCRIPT
+ justify
+ 16 attributes:
+ 0:0:CHARSET
+ 1:4:CLASS
+ 2:0:CLEAR
+ 3:0:DEFER
+ 4:0:DIR
+ 5:0:EVENT
+ 6:0:FOR
+ 7:1:ID
+ 8:0:LANG
+ 9:0:LANGUAGE
+ 10:0:NAME
+ 11:0:SCRIPTENGINE
+ 12:2:SRC
+ 13:0:STYLE
+ 14:0:TITLE
+ 15:0:TYPE
+ 3 attr_types
+ core
+ i18n
+ SCRIPT
+ contents: SGML_LITTERAL
+ tagclass: APPLETlike
+ contains:
+ icontains:
+ contained: FONTlike EMlike MATHlike Alike formula FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff
+ canclose: FONTlike EMlike MATHlike Alike formula SELECTlike Plike LIlike ULlike BRlike APPLETlike HRlike same
+ flags:
+ 100:SECTION
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:DIR
+ 2:1:ID
+ 3:0:LANG
+ 4:0:ROLE
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN5
+ contents: SGML_MIXED
+ tagclass: DIVlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike FORMlike Plike DIVlike ULlike BRlike APPLETlike HRlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: TRlike FORMlike DIVlike LIlike APPLETlike HRlike outer BODYlike same DELlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same DELlike
+ canclose: FONTlike EMlike MATHlike Alike formula Plike DIVlike same
+ flags: mafse
+ 101:SELECT
+ justify
+ 22 attributes:
+ 0:0:ALIGN
+ 1:4:CLASS
+ 2:0:CLEAR
+ 3:0:DIR
+ 4:0:DISABLED
+ 5:0:ERROR
+ 6:0:HEIGHT
+ 7:1:ID
+ 8:0:LANG
+ 9:0:MD
+ 10:0:MULTIPLE
+ 11:0:NAME
+ 12:0:NOTAB
+ 13:0:ONBLUR
+ 14:0:ONCHANGE
+ 15:0:ONFOCUS
+ 16:0:SIZE
+ 17:0:STYLE
+ 18:0:TABINDEX
+ 19:0:TITLE
+ 20:0:UNITS
+ 21:0:WIDTH
+ 4 attr_types
+ align
+ core
+ i18n
+ SELECT
+ contents: SGML_MIXED
+ tagclass: SELECTlike
+ contains: MAPlike
+ icontains: MAPlike
+ contained: FONTlike EMlike MATHlike Alike TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike outer BODYlike
+ canclose: FONTlike EMlike MATHlike Alike formula SELECTlike Plike LIlike ULlike same
+ flags: strict
+ 102:SHY
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_EMPTY
+ tagclass: BRlike
+ contains:
+ icontains:
+ contained: FONTlike EMlike MATHlike Alike formula FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike outer BODYlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff
+ canclose: FONTlike EMlike MATHlike Alike formula BRlike same
+ flags: endO
+ 103:SMALL
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: FONTlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike BODYlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: FONTlike
+ flags: mafse nreie
+ 104:SPAN
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: EMlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike BODYlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: FONTlike EMlike same
+ flags:
+ 105:SPOT
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_EMPTY
+ tagclass: Alike
+ contains:
+ icontains:
+ contained: FONTlike EMlike MATHlike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike outer BODYlike
+ icontained: FONTlike EMlike MATHlike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike outer BODYlike
+ canclose: Alike
+ flags: endO
+ 106:STRIKE
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: FONTlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike BODYlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: FONTlike
+ flags:
+ 107:STRONG
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_EMPTY
+ tagclass: EMlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike BODYlike same
+ icontained: FONTlike EMlike MATHlike Alike TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: FONTlike EMlike
+ flags: nreie
+ 108:STYLE
+ justify
+ 9 attributes:
+ 0:4:CLASS
+ 1:0:DIR
+ 2:1:ID
+ 3:0:LANG
+ 4:0:MEDIA
+ 5:0:NOTATION
+ 6:0:STYLE
+ 7:0:TITLE
+ 8:0:TYPE
+ 3 attr_types
+ core
+ i18n
+ STYLE
+ contents: SGML_LITTERAL
+ tagclass: HEADstuff
+ contains:
+ icontains:
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike APPLETlike HRlike outer BODYlike HEADstuff
+ icontained: FONTlike EMlike MATHlike Alike TRlike FORMlike Plike DIVlike LIlike ULlike APPLETlike HRlike outer BODYlike HEADstuff
+ canclose: FONTlike EMlike MATHlike Alike formula same
+ flags:
+ 109:SUB
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: MATHlike
+ contains: FONTlike EMlike MATHlike Alike formula SELECTlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike formula FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: FONTlike EMlike MATHlike
+ flags:
+ 110:SUP
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: MATHlike
+ contains: FONTlike EMlike MATHlike Alike formula SELECTlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike formula FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: FONTlike EMlike MATHlike
+ flags:
+ 111:TAB
+ justify
+ 11 attributes:
+ 0:0:ALIGN
+ 1:4:CLASS
+ 2:0:CLEAR
+ 3:0:DIR
+ 4:0:DP
+ 5:1:ID
+ 6:0:INDENT
+ 7:0:LANG
+ 8:0:STYLE
+ 9:0:TITLE
+ 10:0:TO
+ 4 attr_types
+ align
+ core
+ i18n
+ TAB
+ contents: SGML_EMPTY
+ tagclass: BRlike
+ contains:
+ icontains:
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike outer BODYlike
+ icontained: FONTlike EMlike MATHlike Alike TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer HEADstuff
+ canclose: FONTlike
+ flags: endO
+ 112:TABLE
+ justify
+ 22 attributes:
+ 0:0:ALIGN
+ 1:2:BACKGROUND
+ 2:0:BORDER
+ 3:0:CELLPADDING
+ 4:0:CELLSPACING
+ 5:4:CLASS
+ 6:0:CLEAR
+ 7:0:COLS
+ 8:0:COLSPEC
+ 9:0:DIR
+ 10:0:DP
+ 11:0:FRAME
+ 12:1:ID
+ 13:0:LANG
+ 14:0:NOFLOW
+ 15:0:NOWRAP
+ 16:0:RULES
+ 17:0:STYLE
+ 18:0:SUMMARY
+ 19:0:TITLE
+ 20:0:UNITS
+ 21:0:WIDTH
+ 5 attr_types
+ align
+ core
+ events
+ i18n
+ TABLE
+ contents: SGML_MIXED
+ tagclass: ULlike
+ contains: TRlike SELECTlike FORMlike Plike BRlike APPLETlike HRlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FORMlike DIVlike LIlike APPLETlike HRlike outer BODYlike DELlike
+ icontained: FONTlike EMlike MATHlike TRlike FORMlike Plike DIVlike LIlike ULlike APPLETlike HRlike outer BODYlike same DELlike
+ canclose: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike Plike LIlike HRlike MAPlike same
+ flags:
+ 113:TBODY
+ justify
+ 13 attributes:
+ 0:0:ALIGN
+ 1:0:CHAR
+ 2:0:CHAROFF
+ 3:4:CLASS
+ 4:0:CLEAR
+ 5:0:DIR
+ 6:0:DP
+ 7:1:ID
+ 8:0:LANG
+ 9:0:NOWRAP
+ 10:0:STYLE
+ 11:0:TITLE
+ 12:0:VALIGN
+ 5 attr_types
+ cellalign
+ core
+ events
+ i18n
+ TR
+ contents: SGML_EMPTY
+ tagclass: TRlike
+ contains: TRlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FORMlike ULlike
+ icontained: FONTlike EMlike MATHlike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same
+ canclose: FONTlike EMlike MATHlike Alike formula SELECTlike Plike DIVlike LIlike HRlike MAPlike same
+ flags: endO startO
+ 114:TD
+ justify
+ 23 attributes:
+ 0:0:ABBR
+ 1:0:ALIGN
+ 2:0:AXES
+ 3:0:AXIS
+ 4:2:BACKGROUND
+ 5:0:CHAR
+ 6:0:CHAROFF
+ 7:4:CLASS
+ 8:0:CLEAR
+ 9:0:COLSPAN
+ 10:0:DIR
+ 11:0:DP
+ 12:0:HEADERS
+ 13:0:HEIGHT
+ 14:1:ID
+ 15:0:LANG
+ 16:0:NOWRAP
+ 17:0:ROWSPAN
+ 18:0:SCOPE
+ 19:0:STYLE
+ 20:0:TITLE
+ 21:0:VALIGN
+ 22:0:WIDTH
+ 4 attr_types
+ cellalign
+ core
+ i18n
+ TD
+ contents: SGML_EMPTY
+ tagclass: LIlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike FORMlike Plike DIVlike ULlike BRlike APPLETlike HRlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: TRlike
+ icontained: FONTlike EMlike MATHlike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same
+ canclose: FONTlike EMlike MATHlike Alike formula SELECTlike Plike DIVlike LIlike HRlike MAPlike same
+ flags: endO
+ 115:TEXTAREA
+ justify
+ 22 attributes:
+ 0:0:ACCEPT-CHARSET
+ 1:0:ACCESSKEY
+ 2:0:ALIGN
+ 3:4:CLASS
+ 4:0:CLEAR
+ 5:0:COLS
+ 6:0:DIR
+ 7:0:DISABLED
+ 8:0:ERROR
+ 9:1:ID
+ 10:0:LANG
+ 11:0:NAME
+ 12:0:NOTAB
+ 13:0:ONBLUR
+ 14:0:ONCHANGE
+ 15:0:ONFOCUS
+ 16:0:ONSELECT
+ 17:0:READONLY
+ 18:0:ROWS
+ 19:0:STYLE
+ 20:0:TABINDEX
+ 21:0:TITLE
+ 5 attr_types
+ align
+ core
+ events
+ i18n
+ TEXTAREA
+ contents: SGML_LITTERAL
+ tagclass: SELECTlike
+ contains:
+ icontains:
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike outer BODYlike
+ canclose: FONTlike EMlike MATHlike Alike formula SELECTlike Plike LIlike ULlike same
+ flags: nolyspcl
+ 116:TEXTFLOW
+ justify
+ 14 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DATA
+ 3:0:DIR
+ 4:1:ID
+ 5:0:LANG
+ 6:0:NAME
+ 7:0:OBJECT
+ 8:0:REF
+ 9:0:STYLE
+ 10:0:TITLE
+ 11:0:TYPE
+ 12:0:VALUE
+ 13:0:VALUETYPE
+ 3 attr_types
+ core
+ i18n
+ BODYTEXT
+ contents: SGML_MIXED
+ tagclass: BODYlike
+ contains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike ULlike BRlike APPLETlike HRlike MAPlike same DELlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike outer same DELlike
+ contained: formula TRlike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike outer same
+ icontained: FONTlike EMlike MATHlike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same
+ canclose: FONTlike EMlike MATHlike Alike BRlike APPLETlike MAPlike outer same
+ flags: endO startO
+ 117:TFOOT
+ justify
+ 13 attributes:
+ 0:0:ALIGN
+ 1:0:CHAR
+ 2:0:CHAROFF
+ 3:4:CLASS
+ 4:0:CLEAR
+ 5:0:DIR
+ 6:0:DP
+ 7:1:ID
+ 8:0:LANG
+ 9:0:NOWRAP
+ 10:0:STYLE
+ 11:0:TITLE
+ 12:0:VALIGN
+ 5 attr_types
+ cellalign
+ core
+ events
+ i18n
+ TR
+ contents: SGML_EMPTY
+ tagclass: TRlike
+ contains: TRlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: ULlike
+ icontained: FONTlike EMlike MATHlike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same
+ canclose: FONTlike EMlike MATHlike Alike formula SELECTlike Plike DIVlike LIlike ULlike HRlike MAPlike same
+ flags: endO
+ 118:TH
+ justify
+ 23 attributes:
+ 0:0:ABBR
+ 1:0:ALIGN
+ 2:0:AXES
+ 3:0:AXIS
+ 4:2:BACKGROUND
+ 5:0:CHAR
+ 6:0:CHAROFF
+ 7:4:CLASS
+ 8:0:CLEAR
+ 9:0:COLSPAN
+ 10:0:DIR
+ 11:0:DP
+ 12:0:HEADERS
+ 13:0:HEIGHT
+ 14:1:ID
+ 15:0:LANG
+ 16:0:NOWRAP
+ 17:0:ROWSPAN
+ 18:0:SCOPE
+ 19:0:STYLE
+ 20:0:TITLE
+ 21:0:VALIGN
+ 22:0:WIDTH
+ 4 attr_types
+ cellalign
+ core
+ i18n
+ TD
+ contents: SGML_EMPTY
+ tagclass: LIlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike FORMlike Plike DIVlike ULlike BRlike APPLETlike HRlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike
+ contained: TRlike
+ icontained: FONTlike EMlike MATHlike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same
+ canclose: FONTlike EMlike MATHlike Alike formula SELECTlike Plike DIVlike LIlike ULlike HRlike MAPlike same
+ flags: endO
+ 119:THEAD
+ justify
+ 13 attributes:
+ 0:0:ALIGN
+ 1:0:CHAR
+ 2:0:CHAROFF
+ 3:4:CLASS
+ 4:0:CLEAR
+ 5:0:DIR
+ 6:0:DP
+ 7:1:ID
+ 8:0:LANG
+ 9:0:NOWRAP
+ 10:0:STYLE
+ 11:0:TITLE
+ 12:0:VALIGN
+ 5 attr_types
+ cellalign
+ core
+ events
+ i18n
+ TR
+ contents: SGML_EMPTY
+ tagclass: TRlike
+ contains: TRlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: ULlike
+ icontained: FONTlike EMlike MATHlike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same
+ canclose: FONTlike EMlike MATHlike Alike formula SELECTlike Plike DIVlike LIlike ULlike HRlike MAPlike same
+ flags: endO
+ 120:TITLE
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_RCDATA
+ tagclass: HEADstuff
+ contains:
+ icontains:
+ contained: outer HEADstuff
+ icontained: outer HEADstuff
+ canclose: FONTlike EMlike MATHlike Alike formula Plike DIVlike
+ flags: mafse strict
+ 121:TR
+ justify
+ 13 attributes:
+ 0:0:ALIGN
+ 1:0:CHAR
+ 2:0:CHAROFF
+ 3:4:CLASS
+ 4:0:CLEAR
+ 5:0:DIR
+ 6:0:DP
+ 7:1:ID
+ 8:0:LANG
+ 9:0:NOWRAP
+ 10:0:STYLE
+ 11:0:TITLE
+ 12:0:VALIGN
+ 5 attr_types
+ cellalign
+ core
+ events
+ i18n
+ TR
+ contents: SGML_EMPTY
+ tagclass: TRlike
+ contains: LIlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: TRlike ULlike
+ icontained: FONTlike EMlike MATHlike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same
+ canclose: FONTlike EMlike MATHlike Alike formula SELECTlike Plike DIVlike LIlike HRlike MAPlike same
+ flags: endO
+ 122:TT
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_EMPTY
+ tagclass: FONTlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike BODYlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: FONTlike
+ flags: nreie
+ 123:U
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_EMPTY
+ tagclass: FONTlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike BODYlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: FONTlike
+ flags: mafse nreie
+ 124:UL
+ justify
+ 14 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:COMPACT
+ 3:0:DINGBAT
+ 4:0:DIR
+ 5:1:ID
+ 6:0:LANG
+ 7:0:MD
+ 8:0:PLAIN
+ 9:2:SRC
+ 10:0:STYLE
+ 11:0:TITLE
+ 12:0:TYPE
+ 13:0:WRAP
+ 3 attr_types
+ core
+ i18n
+ UL
+ contents: SGML_MIXED
+ tagclass: ULlike
+ contains: FORMlike LIlike HRlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FORMlike DIVlike LIlike APPLETlike HRlike outer BODYlike DELlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same DELlike
+ canclose: FONTlike EMlike MATHlike Alike formula SELECTlike Plike DIVlike LIlike same
+ flags:
+ 125:VAR
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: EMlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike BODYlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: FONTlike
+ flags:
+ 126:WBR
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_EMPTY
+ tagclass: FONTlike
+ contains:
+ icontains:
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike outer BODYlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff
+ canclose: FONTlike EMlike MATHlike Alike formula BRlike same
+ flags: endO
+ 127:XMP
+ nojustify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_LITTERAL
+ tagclass: ULlike
+ contains:
+ icontains:
+ contained: TRlike SELECTlike FORMlike Plike DIVlike LIlike APPLETlike HRlike outer BODYlike DELlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike APPLETlike HRlike outer BODYlike DELlike
+ canclose: FONTlike EMlike MATHlike Alike formula SELECTlike Plike DIVlike LIlike MAPlike
+ flags: endO
diff --git a/WWW/Library/Implementation/src1_HTMLDTD.h b/WWW/Library/Implementation/src1_HTMLDTD.h
new file mode 100644
index 0000000..39c9594
--- /dev/null
+++ b/WWW/Library/Implementation/src1_HTMLDTD.h
@@ -0,0 +1,2478 @@
+/* $LynxId: src1_HTMLDTD.h,v 1.49 2022/09/30 00:03:49 tom Exp $ */
+#ifndef src_HTMLDTD_H1
+#define src_HTMLDTD_H1 1
+
+#ifndef once_HTMLDTD
+#define once_HTMLDTD 1
+
+#define T_A 0x00008,0x0B007,0x0FF17,0x37787,0x77BA7,0x8604F,0x00014
+#define T_ABBR 0x00002,0x8B04F,0x8FFFF,0xA778F,0xF7FBF,0x00003,0x00000
+#define T_ACRONYM 0x00002,0x8B04F,0x8FFFF,0xA778F,0xF7FBF,0x00003,0x00000
+#define T_ADDRESS 0x00200,0x0F14F,0x8FFFF,0x136680,0x1B6FAF,0x80317,0x00000
+#define T_APPLET 0x02000,0x0B0CF,0x8FFFF,0x37F9F,0xB7FBF,0x8300F,0x00000
+#define T_AREA 0x08000,0x00000,0x00000,0x08000,0x3FFFF,0x00F1F,0x00001
+#define T_ARTICLE 0x00200,0x8FBCF,0x8FFFF,0x1B66A0,0x1B7FFF,0x8031F,0x00004
+#define T_ASIDE 0x00200,0x8FBCF,0x8FFFF,0x1B66A0,0x1B7FFF,0x8031F,0x00004
+#define T_AU 0x00002,0x8B04F,0x8FFFF,0xA778F,0xF7FBF,0x00003,0x00000
+#define T_AUTHOR 0x00002,0x8B04F,0x8FFFF,0xA778F,0xF7FBF,0x00003,0x00000
+#define T_B 0x00001,0x8B04F,0xAFFFF,0xA778F,0xF7FBF,0x00001,0x00014
+#define T_BANNER 0x00200,0x0FB8F,0x0FFFF,0x130000,0x130000,0x8031F,0x00000
+#define T_BASE 0x40000,0x00000,0x00000,0x50000,0x50000,0x8000F,0x00001
+#define T_BASEFONT 0x01000,0x00000,0x00000,0x377AF,0x37FAF,0x8F000,0x00001
+#define T_BDO 0x00100,0x0B04F,0x8FFFF,0x136680,0x1B6FAF,0x0033F,0x00000
+#define T_BGSOUND 0x01000,0x00000,0x00000,0x777AF,0x77FAF,0x8730F,0x00001
+#define T_BIG 0x00001,0x8B04F,0x8FFFF,0xA778F,0xF7FBF,0x00001,0x00014
+#define T_BLINK 0x00001,0x8B04F,0x8FFFF,0xA778F,0xF7FAF,0x00001,0x00014
+#define T_BLOCKQUOTE 0x00200,0xAFBCF,0xAFFFF,0x1B6680,0x1B6FAF,0x8031F,0x00000
+#define T_BODY 0x20000,0x12FB8F,0x12FFFF,0x30000,0x30000,0xDFF7F,0x00003
+#define T_BODYTEXT 0x20000,0x10FB8F,0x1AFFFF,0x30200,0xB7FAF,0x8F17F,0x00003
+#define T_BQ 0x00200,0xAFBCF,0xAFFFF,0x1B6680,0x1B6FAF,0x8031F,0x00000
+#define T_BR 0x01000,0x00000,0x00000,0x377BF,0x77FBF,0x8101F,0x00001
+#define T_BUTTON 0x02000,0x0BB07,0x0FF37,0x0378F,0x37FBF,0x8115F,0x00000
+#define T_CAPTION 0x00100,0x0B04F,0x8FFFF,0x106A00,0x1B6FA7,0x8035F,0x00000
+#define T_CENTER 0x00200,0x8FBCF,0x8FFFF,0x1B6680,0x1B6FA7,0x8071F,0x00000
+#define T_CITE 0x00002,0x8B04F,0x8FFFF,0xA778F,0xF7FBF,0x00002,0x00010
+#define T_CODE 0x00002,0x8B04F,0x8FFFF,0xA778F,0xF7FBF,0x00002,0x00000
+#define T_COL 0x04000,0x00000,0x00000,0x00820,0x36FA7,0x88F5F,0x00001
+#define T_COLGROUP 0x00020,0x04000,0x04000,0x00800,0x36FA7,0x8875F,0x00001
+#define T_COMMENT 0x00004,0x00000,0x00000,0xA77AF,0x7FFFF,0x00003,0x00000
+#define T_CREDIT 0x00100,0x0B04F,0x8FFFF,0x106A00,0x1B7FBF,0x8030F,0x00000
+#define T_DD 0x00400,0x0FBCF,0x8FFFF,0x00800,0xB6FFF,0x8071F,0x00001
+#define T_DEL 0x00002,0x8B04F,0x8FEFF,0x87F8F,0xF7FBF,0x100003,0x00000
+#define T_DEL_2 0x100000,0x8BBCF,0x8FFFF,0xA7F8F,0xF7FBF,0x100003,0x00000
+#define T_DFN 0x00002,0x8B0CF,0x8FFFF,0x8778F,0xF7FBF,0x00003,0x00000
+#define T_DIR 0x00800,0x0B400,0x0F75F,0x137680,0x136FB7,0x84F7F,0x00000
+#define T_DIV 0x00200,0x8FBCF,0x8FFFF,0x1B66A0,0x1B7FFF,0x80317,0x00004
+#define T_DL 0x00800,0x0C480,0x8FFFF,0x136680,0x1B7FB7,0x00757,0x00000
+#define T_DLC 0x00800,0x0C480,0x8FFFF,0x136680,0x1B7FB7,0x0075F,0x00000
+#define T_DT 0x00400,0x0B04F,0x0B1FF,0x00800,0x17FFF,0x8071F,0x00001
+#define T_EM 0x00002,0x8B04F,0x8FFFF,0xA778F,0xF7FAF,0x00003,0x00010
+#define T_EMBED 0x02000,0x8F107,0x8FFF7,0xB6FBF,0xB7FBF,0x1FF7F,0x00001
+#define T_FIELDSET 0x00200,0x8FB4F,0x8FF7F,0x186787,0x1B7FF7,0x8805F,0x00000
+#define T_FIG 0x00200,0x0FB00,0x8FFFF,0x136680,0x1B6FBF,0x8834F,0x00000
+#define T_FIGURE 0x00200,0x8FBCF,0x8FFFF,0x1B66A0,0x1B7FFF,0x8031F,0x00004
+#define T_FN 0x00200,0x8FBCF,0x8FFFF,0x1B6680,0x1B7EBF,0x8114F,0x00000
+#define T_FONT 0x00001,0x8B04F,0x8FFFF,0xB778F,0xF7FBF,0x00001,0x00014
+#define T_FOOTER 0x00200,0x8FBCF,0x8FFFF,0x1B66A0,0x1B7FFF,0x8031F,0x00004
+#define T_FORM 0x00080,0x0FF6F,0x0FF7F,0x136E07,0x132F07,0x88DFF,0x00000
+#define T_FRAME 0x10000,0x00000,0x00000,0x10000,0x10000,0x9FFFF,0x00001
+#define T_FRAMESET 0x10000,0x90000,0x90000,0x90000,0x93000,0x9FFFF,0x00000
+#define T_H1 0x00100,0x0B04F,0x0B05F,0x136680,0x137FAF,0x80117,0x00000
+#define T_H2 0x00100,0x0B04F,0x0B05F,0x136680,0x137FAF,0x80117,0x00000
+#define T_H3 0x00100,0x0B04F,0x0B05F,0x136680,0x137FAF,0x80117,0x00000
+#define T_H4 0x00100,0x0B04F,0x0B05F,0x136680,0x137FAF,0x80117,0x00000
+#define T_H5 0x00100,0x0B04F,0x0B05F,0x136680,0x137FAF,0x80117,0x00000
+#define T_H6 0x00100,0x0B04F,0x0B05F,0x136680,0x137FAF,0x80117,0x00000
+#define T_HEAD 0x40000,0x4F000,0x47000,0x10000,0x10000,0x9FF7F,0x00007
+#define T_HEADER 0x00200,0x8FBCF,0x8FFFF,0x1B66A0,0x1B7FFF,0x8031F,0x00004
+#define T_HR 0x04000,0x00000,0x00000,0x3FE80,0x3FFBF,0x87F37,0x00001
+#define T_HTML 0x10000,0x7FB8F,0x7FFFF,0x00000,0x00000,0x1FFFF,0x00003
+#define T_HY 0x01000,0x00000,0x00000,0x3779F,0x77FBF,0x8101F,0x00001
+#define T_I 0x00001,0x8B04F,0x8FFFF,0xA778F,0xF7FBF,0x00001,0x00014
+#define T_IFRAME 0x02000,0x8FBCF,0x8FFFF,0xB679F,0xB6FBF,0xD315F,0x00000
+#define T_IMG 0x01000,0x00000,0x00000,0x3779F,0x37FBF,0x80000,0x00001
+#define T_INPUT 0x00040,0x00000,0x00000,0x03F87,0x37F87,0x8904F,0x00001
+#define T_INS 0x00002,0x8B04F,0x8FEFF,0x87F8F,0xF7FBF,0x100003,0x00000
+#define T_INS_2 0x100000,0x8BBCF,0x8FFFF,0xA7F8F,0xF7FBF,0x100003,0x00000
+#define T_ISINDEX 0x08000,0x00000,0x00000,0x7778F,0x7FFAF,0x80007,0x00001
+#define T_KBD 0x00002,0x00000,0x00000,0x2778F,0x77FBF,0x00003,0x00000
+#define T_KEYGEN 0x00040,0x00000,0x00000,0x07FB7,0x37FB7,0x80070,0x00001
+#define T_LABEL 0x00002,0x0304F,0x0FFFF,0x0679F,0x36FBF,0x00007,0x00000
+#define T_LEGEND 0x00002,0x0B04F,0x8FF7F,0x00200,0xB7FA7,0x00003,0x00000
+#define T_LH 0x00400,0x0BB7F,0x8FFFF,0x00800,0x97FFF,0x8071F,0x00001
+#define T_LI 0x00400,0x0BBFF,0x8FFFF,0x00800,0x97FFF,0x8071F,0x00001
+#define T_LINK 0x08000,0x00000,0x00000,0x50000,0x50000,0x0FF7F,0x00001
+#define T_LISTING 0x00800,0x00000,0x00000,0x136600,0x136F00,0x80F1F,0x00000
+#define T_MAIN 0x00200,0x8FBCF,0x8FFFF,0x1B66A0,0x1B7FFF,0x8031F,0x00004
+#define T_MAP 0x08000,0x08000,0x08000,0x37FCF,0x37FBF,0x0051F,0x00000
+#define T_MARQUEE 0x04000,0x0000F,0x8F01F,0x37787,0xB7FA7,0x8301C,0x00000
+#define T_MATH 0x00004,0x0B05F,0x8FFFF,0x2778F,0xF7FBF,0x0001F,0x00000
+#define T_MENU 0x00800,0x0B400,0x0F75F,0x117680,0x136FB7,0x88F7F,0x00000
+#define T_META 0x08000,0x00000,0x00000,0x50000,0x50000,0x0FF7F,0x00001
+#define T_NAV 0x00200,0x8FBCF,0x8FFFF,0x1B66A0,0x1B7FFF,0x8031F,0x00004
+#define T_NEXTID 0x01000,0x00000,0x00000,0x50000,0x1FFF7,0x00001,0x00001
+#define T_NOFRAMES 0x20000,0x12FB8F,0x10FFFF,0x17000,0x17000,0x0CF5F,0x00000
+#define T_NOTE 0x00200,0x0BBAF,0x8FFFF,0x1376B0,0x1B7FFF,0x8031F,0x00000
+#define T_OBJECT 0x02000,0x8FBCF,0x8FFFF,0xB679F,0xB6FBF,0x83D5F,0x00020
+#define T_OL 0x00800,0x0C400,0x8FFFF,0x137680,0x1B7FB7,0x88F7F,0x00000
+#define T_OPTION 0x08000,0x00000,0x00000,0x00040,0x37FFF,0x8031F,0x00001
+#define T_OVERLAY 0x04000,0x00000,0x00000,0x00200,0x37FBF,0x83F7F,0x00001
+#define T_P 0x00100,0x0B04F,0x8FFFF,0x136680,0x1B6FA7,0x80117,0x00001
+#define T_PARAM 0x01000,0x00000,0x00000,0x33500,0x37FFF,0x81560,0x00001
+#define T_PLAINTEXT 0x10000,0xFFFFF,0xFFFFF,0x90000,0x90000,0x3FFFF,0x00001
+#define T_PRE 0x00200,0x0F04F,0x0F05E,0x136680,0x136FF0,0x8071E,0x00000
+#define T_Q 0x00002,0x8B04F,0x8FFFF,0xA778F,0xF7FAF,0x00003,0x00000
+#define T_S 0x00001,0x8B04F,0x8FFFF,0xA778F,0xF7FBF,0x00001,0x00000
+#define T_SAMP 0x00002,0x8B04F,0x8FFFF,0xA778F,0xF7FBF,0x00002,0x00010
+#define T_SCRIPT 0x02000,0x00000,0x00000,0x77F9F,0x77FFF,0x87D5F,0x00000
+#define T_SECTION 0x00200,0x8FBCF,0x8FFFF,0x1B66A0,0x1B7FFF,0x8031F,0x00004
+#define T_SELECT 0x00040,0x08000,0x08000,0x03FAF,0x33FBF,0x80D5F,0x00008
+#define T_SHY 0x01000,0x00000,0x00000,0x3779F,0x77FBF,0x8101F,0x00001
+#define T_SMALL 0x00001,0x8B04F,0x8FFFF,0xA778F,0xF7FBF,0x00001,0x00014
+#define T_SPAN 0x00002,0x8B04F,0x8FFFF,0xA778F,0xF7FBF,0x80003,0x00000
+#define T_SPOT 0x00008,0x00000,0x00000,0x3FFF7,0x3FFF7,0x00008,0x00001
+#define T_STRIKE 0x00001,0x8B04F,0x8FFFF,0xA778F,0xF7FBF,0x00001,0x00000
+#define T_STRONG 0x00002,0x8B04F,0x8FFFF,0xA778F,0xF7FAF,0x00003,0x00010
+#define T_STYLE 0x40000,0x00000,0x00000,0x7638F,0x76FAF,0x8001F,0x00000
+#define T_SUB 0x00004,0x8B05F,0x8FFFF,0x8779F,0xF7FBF,0x00007,0x00000
+#define T_SUP 0x00004,0x8B05F,0x8FFFF,0x8779F,0xF7FBF,0x00007,0x00000
+#define T_TAB 0x01000,0x00000,0x00000,0x3778F,0x57FAF,0x00001,0x00001
+#define T_TABLE 0x00800,0x0F1E0,0x8FFFF,0x136680,0x1B6FA7,0x8C57F,0x00000
+#define T_TBODY 0x00020,0x00020,0x8FFFF,0x00880,0xB7FB7,0x8C75F,0x00003
+#define T_TD 0x00400,0x0FBCF,0x8FFFF,0x00020,0xB7FB7,0x8C75F,0x00001
+#define T_TEXTAREA 0x00040,0x00000,0x00000,0x07F8F,0x33FBF,0x80D5F,0x00040
+#define T_TEXTFLOW 0x20000,0x18FBFF,0x19FFFF,0x977B0,0xB7FB7,0x9B00F,0x00003
+#define T_TFOOT 0x00020,0x00020,0x8FFFF,0x00800,0xB7FB7,0x8CF5F,0x00001
+#define T_TH 0x00400,0x0FBCF,0x0FFFF,0x00020,0xB7FB7,0x8CF5F,0x00001
+#define T_THEAD 0x00020,0x00020,0x8FFFF,0x00800,0xB7FB7,0x8CF5F,0x00001
+#define T_TITLE 0x40000,0x00000,0x00000,0x50000,0x50000,0x0031F,0x0000C
+#define T_TR 0x00020,0x00400,0x8FFFF,0x00820,0xB7FB7,0x8C75F,0x00001
+#define T_TT 0x00001,0x8B04F,0x8FFFF,0xA778F,0xF7FBF,0x00001,0x00010
+#define T_U 0x00001,0x8B04F,0x8FFFF,0xA778F,0xF7FBF,0x00001,0x00014
+#define T_UL 0x00800,0x0C480,0x8FFFF,0x136680,0x1B7FFF,0x8075F,0x00000
+#define T_VAR 0x00002,0x8B04F,0x8FFFF,0xA778F,0xF7FBF,0x00001,0x00000
+#define T_WBR 0x00001,0x00000,0x00000,0x3778F,0x77FBF,0x8101F,0x00001
+#define T_XMP 0x00800,0x00000,0x00000,0x1367E0,0x136FFF,0x0875F,0x00001
+#define T_OBJECT_PCDATA 0x02000,0x8FBCF,0x8FFFF,0xB679F,0xB6FBF,0x83D5F,0x00008
+#define T__UNREC_ 0x00000,0x00000,0x00000,0x00000,0x00000,0x00000,0x00000
+#ifdef USE_PRETTYSRC
+# define N HTMLA_NORMAL
+# define i HTMLA_ANAME
+# define h HTMLA_HREF
+# define c HTMLA_CLASS
+# define x HTMLA_AUXCLASS
+# define T(t) , t
+#else
+# define T(t) /*nothing */
+#endif
+/* *INDENT-OFF* */
+
+#define ATTR_TYPE(name) #name, name##_attr_list
+
+/* generic attributes, used in different tags */
+static const attr core_attr_list[] = {
+ { "CLASS" T(c) },
+ { "ID" T(i) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType core_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { 0, 0 },
+};
+
+static const attr i18n_attr_list[] = {
+ { "DIR" T(N) },
+ { "LANG" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType i18n_attr_type[] = {
+ { ATTR_TYPE(i18n) },
+ { 0, 0 },
+};
+
+static const attr events_attr_list[] = {
+ { "ONCLICK" T(N) },
+ { "ONDBLCLICK" T(N) },
+ { "ONKEYDOWN" T(N) },
+ { "ONKEYPRESS" T(N) },
+ { "ONKEYUP" T(N) },
+ { "ONMOUSEDOWN" T(N) },
+ { "ONMOUSEMOVE" T(N) },
+ { "ONMOUSEOUT" T(N) },
+ { "ONMOUSEOVER" T(N) },
+ { "ONMOUSEUP" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType events_attr_type[] = {
+ { ATTR_TYPE(events) },
+ { 0, 0 },
+};
+
+static const attr align_attr_list[] = {
+ { "ALIGN" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType align_attr_type[] = {
+ { ATTR_TYPE(align) },
+ { 0, 0 },
+};
+
+static const attr cellalign_attr_list[] = {
+ { "ALIGN" T(N) },
+ { "CHAR" T(N) },
+ { "CHAROFF" T(N) },
+ { "VALIGN" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType cellalign_attr_type[] = {
+ { ATTR_TYPE(cellalign) },
+ { 0, 0 },
+};
+
+static const attr bgcolor_attr_list[] = {
+ { "BGCOLOR" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType bgcolor_attr_type[] = {
+ { ATTR_TYPE(bgcolor) },
+ { 0, 0 },
+};
+
+
+/* tables defining attributes per-tag in terms of generic attributes (editable) */
+static const attr A_attr_list[] = {
+ { "ACCESSKEY" T(N) },
+ { "CHARSET" T(N) },
+ { "CLEAR" T(N) },
+ { "COORDS" T(N) },
+ { "HREF" T(h) },
+ { "HREFLANG" T(N) },
+ { "ISMAP" T(N) },
+ { "MD" T(N) },
+ { "NAME" T(i) },
+ { "NOTAB" T(N) },
+ { "ONBLUR" T(N) },
+ { "ONFOCUS" T(N) },
+ { "REL" T(N) },
+ { "REV" T(N) },
+ { "SHAPE" T(N) },
+ { "TABINDEX" T(N) },
+ { "TARGET" T(N) },
+ { "TYPE" T(N) },
+ { "URN" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType A_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(events) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(A) },
+ { 0, 0 },
+};
+
+static const attr ADDRESS_attr_list[] = {
+ { "CLEAR" T(N) },
+ { "NOWRAP" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType ADDRESS_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(ADDRESS) },
+ { 0, 0 },
+};
+
+static const attr APPLET_attr_list[] = {
+ { "ALT" T(N) },
+ { "CLEAR" T(N) },
+ { "CODE" T(N) },
+ { "CODEBASE" T(h) },
+ { "DOWNLOAD" T(N) },
+ { "HEIGHT" T(N) },
+ { "HSPACE" T(N) },
+ { "NAME" T(i) },
+ { "VSPACE" T(N) },
+ { "WIDTH" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType APPLET_attr_type[] = {
+ { ATTR_TYPE(align) },
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(APPLET) },
+ { 0, 0 },
+};
+
+static const attr AREA_attr_list[] = {
+ { "ACCESSKEY" T(N) },
+ { "ALT" T(N) },
+ { "CLEAR" T(N) },
+ { "COORDS" T(N) },
+ { "HREF" T(h) },
+ { "NOHREF" T(N) },
+ { "NOTAB" T(N) },
+ { "ONBLUR" T(N) },
+ { "ONFOCUS" T(N) },
+ { "SHAPE" T(N) },
+ { "TABINDEX" T(N) },
+ { "TARGET" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType AREA_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(events) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(AREA) },
+ { 0, 0 },
+};
+
+static const attr BASE_attr_list[] = {
+ { "HREF" T(h) },
+ { "TARGET" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType BASE_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(BASE) },
+ { 0, 0 },
+};
+
+static const attr BGSOUND_attr_list[] = {
+ { "CLEAR" T(N) },
+ { "LOOP" T(N) },
+ { "SRC" T(h) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType BGSOUND_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(BGSOUND) },
+ { 0, 0 },
+};
+
+static const attr BODY_attr_list[] = {
+ { "ALINK" T(N) },
+ { "BACKGROUND" T(h) },
+ { "CLEAR" T(N) },
+ { "LINK" T(N) },
+ { "ONLOAD" T(N) },
+ { "ONUNLOAD" T(N) },
+ { "TEXT" T(N) },
+ { "VLINK" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType BODY_attr_type[] = {
+ { ATTR_TYPE(bgcolor) },
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(BODY) },
+ { 0, 0 },
+};
+
+static const attr BODYTEXT_attr_list[] = {
+ { "CLEAR" T(N) },
+ { "DATA" T(N) },
+ { "NAME" T(N) },
+ { "OBJECT" T(N) },
+ { "REF" T(N) },
+ { "TYPE" T(N) },
+ { "VALUE" T(N) },
+ { "VALUETYPE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType BODYTEXT_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(BODYTEXT) },
+ { 0, 0 },
+};
+
+static const attr BQ_attr_list[] = {
+ { "CITE" T(h) },
+ { "CLEAR" T(N) },
+ { "NOWRAP" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType BQ_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(BQ) },
+ { 0, 0 },
+};
+
+static const attr BUTTON_attr_list[] = {
+ { "ACCESSKEY" T(N) },
+ { "CLEAR" T(N) },
+ { "DISABLED" T(N) },
+ { "FORMACTION" T(N) },
+ { "NAME" T(N) },
+ { "ONBLUR" T(N) },
+ { "ONFOCUS" T(N) },
+ { "READONLY" T(N) },
+ { "TABINDEX" T(N) },
+ { "TYPE" T(N) },
+ { "VALUE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType BUTTON_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(events) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(BUTTON) },
+ { 0, 0 },
+};
+
+static const attr CAPTION_attr_list[] = {
+ { "ACCESSKEY" T(N) },
+ { "CLEAR" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType CAPTION_attr_type[] = {
+ { ATTR_TYPE(align) },
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(events) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(CAPTION) },
+ { 0, 0 },
+};
+
+static const attr COL_attr_list[] = {
+ { "CLEAR" T(N) },
+ { "SPAN" T(N) },
+ { "WIDTH" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType COL_attr_type[] = {
+ { ATTR_TYPE(cellalign) },
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(events) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(COL) },
+ { 0, 0 },
+};
+
+static const attr DEL_attr_list[] = {
+ { "CITE" T(N) },
+ { "DATETIME" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType DEL_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(events) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(DEL) },
+ { 0, 0 },
+};
+
+static const attr DIV_attr_list[] = {
+ { "CLEAR" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType DIV_attr_type[] = {
+ { ATTR_TYPE(align) },
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(DIV) },
+ { 0, 0 },
+};
+
+static const attr DL_attr_list[] = {
+ { "CLEAR" T(N) },
+ { "COMPACT" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType DL_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(DL) },
+ { 0, 0 },
+};
+
+static const attr EMBED_attr_list[] = {
+ { "ALT" T(N) },
+ { "BORDER" T(N) },
+ { "CLEAR" T(N) },
+ { "HEIGHT" T(N) },
+ { "IMAGEMAP" T(N) },
+ { "ISMAP" T(N) },
+ { "MD" T(N) },
+ { "NAME" T(i) },
+ { "NOFLOW" T(N) },
+ { "PARAMS" T(N) },
+ { "SRC" T(h) },
+ { "UNITS" T(N) },
+ { "USEMAP" T(N) },
+ { "WIDTH" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType EMBED_attr_type[] = {
+ { ATTR_TYPE(align) },
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(EMBED) },
+ { 0, 0 },
+};
+
+static const attr FIG_attr_list[] = {
+ { "BORDER" T(N) },
+ { "CLEAR" T(N) },
+ { "HEIGHT" T(N) },
+ { "IMAGEMAP" T(N) },
+ { "ISOBJECT" T(N) },
+ { "MD" T(N) },
+ { "NOFLOW" T(N) },
+ { "SRC" T(h) },
+ { "UNITS" T(N) },
+ { "WIDTH" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType FIG_attr_type[] = {
+ { ATTR_TYPE(align) },
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(FIG) },
+ { 0, 0 },
+};
+
+static const attr FONT_attr_list[] = {
+ { "CLEAR" T(N) },
+ { "COLOR" T(N) },
+ { "END" T(N) },
+ { "FACE" T(N) },
+ { "SIZE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType FONT_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(FONT) },
+ { 0, 0 },
+};
+
+static const attr FORM_attr_list[] = {
+ { "ACCEPT" T(N) },
+ { "ACCEPT-CHARSET" T(N) },
+ { "ACTION" T(h) },
+ { "CLEAR" T(N) },
+ { "ENCTYPE" T(N) },
+ { "METHOD" T(N) },
+ { "ONRESET" T(N) },
+ { "ONSUBMIT" T(N) },
+ { "SCRIPT" T(N) },
+ { "SUBJECT" T(N) },
+ { "TARGET" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType FORM_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(FORM) },
+ { 0, 0 },
+};
+
+static const attr FRAME_attr_list[] = {
+ { "FRAMEBORDER" T(N) },
+ { "LONGDESC" T(h) },
+ { "MARGINHEIGHT" T(N) },
+ { "MARGINWIDTH" T(N) },
+ { "NAME" T(N) },
+ { "NORESIZE" T(N) },
+ { "SCROLLING" T(N) },
+ { "SRC" T(h) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType FRAME_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(FRAME) },
+ { 0, 0 },
+};
+
+static const attr FRAMESET_attr_list[] = {
+ { "COLS" T(N) },
+ { "ONLOAD" T(N) },
+ { "ONUNLOAD" T(N) },
+ { "ROWS" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType FRAMESET_attr_type[] = {
+ { ATTR_TYPE(FRAMESET) },
+ { 0, 0 },
+};
+
+static const attr GEN_attr_list[] = {
+ { "CLEAR" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType GEN_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(events) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(GEN) },
+ { 0, 0 },
+};
+
+static const attr GEN5_attr_list[] = {
+ { "ROLE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType GEN5_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(events) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(GEN5) },
+ { 0, 0 },
+};
+
+static const attr H_attr_list[] = {
+ { "CLEAR" T(N) },
+ { "DINGBAT" T(N) },
+ { "MD" T(N) },
+ { "NOWRAP" T(N) },
+ { "SEQNUM" T(N) },
+ { "SKIP" T(N) },
+ { "SRC" T(h) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType H_attr_type[] = {
+ { ATTR_TYPE(align) },
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(events) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(H) },
+ { 0, 0 },
+};
+
+static const attr HR_attr_list[] = {
+ { "CLEAR" T(N) },
+ { "MD" T(N) },
+ { "NOSHADE" T(N) },
+ { "SIZE" T(N) },
+ { "SRC" T(h) },
+ { "WIDTH" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType HR_attr_type[] = {
+ { ATTR_TYPE(align) },
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(HR) },
+ { 0, 0 },
+};
+
+static const attr IFRAME_attr_list[] = {
+ { "FRAMEBORDER" T(N) },
+ { "HEIGHT" T(N) },
+ { "LONGDESC" T(h) },
+ { "MARGINHEIGHT" T(N) },
+ { "MARGINWIDTH" T(N) },
+ { "NAME" T(N) },
+ { "SCROLLING" T(N) },
+ { "SRC" T(h) },
+ { "WIDTH" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType IFRAME_attr_type[] = {
+ { ATTR_TYPE(align) },
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(IFRAME) },
+ { 0, 0 },
+};
+
+static const attr IMG_attr_list[] = {
+ { "ALT" T(N) },
+ { "BORDER" T(N) },
+ { "CLEAR" T(N) },
+ { "HEIGHT" T(N) },
+ { "HSPACE" T(N) },
+ { "ISMAP" T(N) },
+ { "ISOBJECT" T(N) },
+ { "LONGDESC" T(h) },
+ { "MD" T(N) },
+ { "NAME" T(N) },
+ { "SRC" T(h) },
+ { "UNITS" T(N) },
+ { "USEMAP" T(h) },
+ { "VSPACE" T(N) },
+ { "WIDTH" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType IMG_attr_type[] = {
+ { ATTR_TYPE(align) },
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(events) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(IMG) },
+ { 0, 0 },
+};
+
+static const attr INPUT_attr_list[] = {
+ { "ACCEPT" T(N) },
+ { "ACCEPT-CHARSET" T(N) },
+ { "ACCESSKEY" T(N) },
+ { "ALT" T(N) },
+ { "CHECKED" T(N) },
+ { "CLEAR" T(N) },
+ { "DISABLED" T(N) },
+ { "ERROR" T(N) },
+ { "HEIGHT" T(N) },
+ { "ISMAP" T(N) },
+ { "MAX" T(N) },
+ { "MAXLENGTH" T(N) },
+ { "MD" T(N) },
+ { "MIN" T(N) },
+ { "NAME" T(N) },
+ { "NOTAB" T(N) },
+ { "ONBLUR" T(N) },
+ { "ONCHANGE" T(N) },
+ { "ONFOCUS" T(N) },
+ { "ONSELECT" T(N) },
+ { "READONLY" T(N) },
+ { "SIZE" T(N) },
+ { "SRC" T(h) },
+ { "TABINDEX" T(N) },
+ { "TYPE" T(N) },
+ { "USEMAP" T(N) },
+ { "VALUE" T(N) },
+ { "WIDTH" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType INPUT_attr_type[] = {
+ { ATTR_TYPE(align) },
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(events) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(INPUT) },
+ { 0, 0 },
+};
+
+static const attr ISINDEX_attr_list[] = {
+ { "ACTION" T(h) },
+ { "HREF" T(h) },
+ { "PROMPT" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType ISINDEX_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(ISINDEX) },
+ { 0, 0 },
+};
+
+static const attr KEYGEN_attr_list[] = {
+ { "CHALLENGE" T(N) },
+ { "NAME" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType KEYGEN_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(KEYGEN) },
+ { 0, 0 },
+};
+
+static const attr LABEL_attr_list[] = {
+ { "ACCESSKEY" T(N) },
+ { "CLEAR" T(N) },
+ { "FOR" T(N) },
+ { "ONBLUR" T(N) },
+ { "ONFOCUS" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType LABEL_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(events) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(LABEL) },
+ { 0, 0 },
+};
+
+static const attr LI_attr_list[] = {
+ { "CLEAR" T(N) },
+ { "DINGBAT" T(N) },
+ { "MD" T(N) },
+ { "SKIP" T(N) },
+ { "SRC" T(h) },
+ { "TYPE" T(N) },
+ { "VALUE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType LI_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(events) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(LI) },
+ { 0, 0 },
+};
+
+static const attr LINK_attr_list[] = {
+ { "CHARSET" T(N) },
+ { "HREF" T(h) },
+ { "HREFLANG" T(N) },
+ { "MEDIA" T(N) },
+ { "REL" T(N) },
+ { "REV" T(N) },
+ { "TARGET" T(N) },
+ { "TYPE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType LINK_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(events) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(LINK) },
+ { 0, 0 },
+};
+
+static const attr MAP_attr_list[] = {
+ { "CLEAR" T(N) },
+ { "NAME" T(i) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType MAP_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(MAP) },
+ { 0, 0 },
+};
+
+static const attr MATH_attr_list[] = {
+ { "BOX" T(N) },
+ { "CLEAR" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType MATH_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(MATH) },
+ { 0, 0 },
+};
+
+static const attr META_attr_list[] = {
+ { "CHARSET" T(N) },
+ { "CONTENT" T(N) },
+ { "HTTP-EQUIV" T(N) },
+ { "NAME" T(N) },
+ { "SCHEME" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType META_attr_type[] = {
+ { ATTR_TYPE(META) },
+ { 0, 0 },
+};
+
+static const attr NEXTID_attr_list[] = {
+ { "N" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType NEXTID_attr_type[] = {
+ { ATTR_TYPE(NEXTID) },
+ { 0, 0 },
+};
+
+static const attr NOTE_attr_list[] = {
+ { "CLEAR" T(N) },
+ { "MD" T(N) },
+ { "ROLE" T(x) },
+ { "SRC" T(h) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType NOTE_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(NOTE) },
+ { 0, 0 },
+};
+
+static const attr OBJECT_attr_list[] = {
+ { "ARCHIVE" T(N) },
+ { "BORDER" T(N) },
+ { "CLASSID" T(h) },
+ { "CODEBASE" T(h) },
+ { "CODETYPE" T(N) },
+ { "DATA" T(h) },
+ { "DECLARE" T(N) },
+ { "HEIGHT" T(N) },
+ { "HSPACE" T(N) },
+ { "ISMAP" T(N) },
+ { "NAME" T(N) },
+ { "NOTAB" T(N) },
+ { "SHAPES" T(N) },
+ { "STANDBY" T(N) },
+ { "TABINDEX" T(N) },
+ { "TYPE" T(N) },
+ { "USEMAP" T(h) },
+ { "VSPACE" T(N) },
+ { "WIDTH" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType OBJECT_attr_type[] = {
+ { ATTR_TYPE(align) },
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(events) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(OBJECT) },
+ { 0, 0 },
+};
+
+static const attr OL_attr_list[] = {
+ { "CLEAR" T(N) },
+ { "COMPACT" T(N) },
+ { "CONTINUE" T(N) },
+ { "SEQNUM" T(N) },
+ { "START" T(N) },
+ { "TYPE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType OL_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(OL) },
+ { 0, 0 },
+};
+
+static const attr OPTION_attr_list[] = {
+ { "CLEAR" T(N) },
+ { "DISABLED" T(N) },
+ { "ERROR" T(N) },
+ { "LABEL" T(N) },
+ { "SELECTED" T(N) },
+ { "SHAPE" T(N) },
+ { "VALUE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType OPTION_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(events) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(OPTION) },
+ { 0, 0 },
+};
+
+static const attr OVERLAY_attr_list[] = {
+ { "HEIGHT" T(N) },
+ { "IMAGEMAP" T(N) },
+ { "MD" T(N) },
+ { "SRC" T(h) },
+ { "UNITS" T(N) },
+ { "WIDTH" T(N) },
+ { "X" T(N) },
+ { "Y" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType OVERLAY_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(OVERLAY) },
+ { 0, 0 },
+};
+
+static const attr P_attr_list[] = {
+ { "CLEAR" T(N) },
+ { "NOWRAP" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType P_attr_type[] = {
+ { ATTR_TYPE(align) },
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(P) },
+ { 0, 0 },
+};
+
+static const attr PARAM_attr_list[] = {
+ { "ACCEPT" T(N) },
+ { "ACCEPT-CHARSET" T(N) },
+ { "ACCEPT-ENCODING" T(N) },
+ { "CLEAR" T(N) },
+ { "DATA" T(N) },
+ { "NAME" T(N) },
+ { "OBJECT" T(N) },
+ { "REF" T(N) },
+ { "TYPE" T(N) },
+ { "VALUE" T(N) },
+ { "VALUEREF" T(N) },
+ { "VALUETYPE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType PARAM_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(PARAM) },
+ { 0, 0 },
+};
+
+static const attr Q_attr_list[] = {
+ { "CITE" T(h) },
+ { "CLEAR" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType Q_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(Q) },
+ { 0, 0 },
+};
+
+static const attr SCRIPT_attr_list[] = {
+ { "CHARSET" T(N) },
+ { "CLEAR" T(N) },
+ { "DEFER" T(N) },
+ { "EVENT" T(N) },
+ { "FOR" T(N) },
+ { "LANGUAGE" T(N) },
+ { "NAME" T(N) },
+ { "SCRIPTENGINE" T(N) },
+ { "SRC" T(h) },
+ { "TYPE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType SCRIPT_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(SCRIPT) },
+ { 0, 0 },
+};
+
+static const attr SELECT_attr_list[] = {
+ { "CLEAR" T(N) },
+ { "DISABLED" T(N) },
+ { "ERROR" T(N) },
+ { "HEIGHT" T(N) },
+ { "MD" T(N) },
+ { "MULTIPLE" T(N) },
+ { "NAME" T(N) },
+ { "NOTAB" T(N) },
+ { "ONBLUR" T(N) },
+ { "ONCHANGE" T(N) },
+ { "ONFOCUS" T(N) },
+ { "SIZE" T(N) },
+ { "TABINDEX" T(N) },
+ { "UNITS" T(N) },
+ { "WIDTH" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType SELECT_attr_type[] = {
+ { ATTR_TYPE(align) },
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(SELECT) },
+ { 0, 0 },
+};
+
+static const attr STYLE_attr_list[] = {
+ { "MEDIA" T(N) },
+ { "NOTATION" T(N) },
+ { "TYPE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType STYLE_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(STYLE) },
+ { 0, 0 },
+};
+
+static const attr TAB_attr_list[] = {
+ { "CLEAR" T(N) },
+ { "DP" T(N) },
+ { "INDENT" T(N) },
+ { "TO" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType TAB_attr_type[] = {
+ { ATTR_TYPE(align) },
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(TAB) },
+ { 0, 0 },
+};
+
+static const attr TABLE_attr_list[] = {
+ { "BACKGROUND" T(h) },
+ { "BORDER" T(N) },
+ { "CELLPADDING" T(N) },
+ { "CELLSPACING" T(N) },
+ { "CLEAR" T(N) },
+ { "COLS" T(N) },
+ { "COLSPEC" T(N) },
+ { "DP" T(N) },
+ { "FRAME" T(N) },
+ { "NOFLOW" T(N) },
+ { "NOWRAP" T(N) },
+ { "RULES" T(N) },
+ { "SUMMARY" T(N) },
+ { "UNITS" T(N) },
+ { "WIDTH" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType TABLE_attr_type[] = {
+ { ATTR_TYPE(align) },
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(events) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(TABLE) },
+ { 0, 0 },
+};
+
+static const attr TD_attr_list[] = {
+ { "ABBR" T(N) },
+ { "AXES" T(N) },
+ { "AXIS" T(N) },
+ { "BACKGROUND" T(h) },
+ { "CLEAR" T(N) },
+ { "COLSPAN" T(N) },
+ { "DP" T(N) },
+ { "HEADERS" T(N) },
+ { "HEIGHT" T(N) },
+ { "NOWRAP" T(N) },
+ { "ROWSPAN" T(N) },
+ { "SCOPE" T(N) },
+ { "WIDTH" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType TD_attr_type[] = {
+ { ATTR_TYPE(cellalign) },
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(TD) },
+ { 0, 0 },
+};
+
+static const attr TEXTAREA_attr_list[] = {
+ { "ACCEPT-CHARSET" T(N) },
+ { "ACCESSKEY" T(N) },
+ { "CLEAR" T(N) },
+ { "COLS" T(N) },
+ { "DISABLED" T(N) },
+ { "ERROR" T(N) },
+ { "NAME" T(N) },
+ { "NOTAB" T(N) },
+ { "ONBLUR" T(N) },
+ { "ONCHANGE" T(N) },
+ { "ONFOCUS" T(N) },
+ { "ONSELECT" T(N) },
+ { "READONLY" T(N) },
+ { "ROWS" T(N) },
+ { "TABINDEX" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType TEXTAREA_attr_type[] = {
+ { ATTR_TYPE(align) },
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(events) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(TEXTAREA) },
+ { 0, 0 },
+};
+
+static const attr TR_attr_list[] = {
+ { "CLEAR" T(N) },
+ { "DP" T(N) },
+ { "NOWRAP" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType TR_attr_type[] = {
+ { ATTR_TYPE(cellalign) },
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(events) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(TR) },
+ { 0, 0 },
+};
+
+static const attr UL_attr_list[] = {
+ { "CLEAR" T(N) },
+ { "COMPACT" T(N) },
+ { "DINGBAT" T(N) },
+ { "MD" T(N) },
+ { "PLAIN" T(N) },
+ { "SRC" T(h) },
+ { "TYPE" T(N) },
+ { "WRAP" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const AttrType UL_attr_type[] = {
+ { ATTR_TYPE(core) },
+ { ATTR_TYPE(i18n) },
+ { ATTR_TYPE(UL) },
+ { 0, 0 },
+};
+
+
+/* attribute lists for the runtime (generated by dtd_util) */
+static const attr A_attr[] = { /* A attributes */
+ { "ACCESSKEY" T(N) },
+ { "CHARSET" T(N) },
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "COORDS" T(N) },
+ { "DIR" T(N) },
+ { "HREF" T(h) },
+ { "HREFLANG" T(N) },
+ { "ID" T(i) },
+ { "ISMAP" T(N) },
+ { "LANG" T(N) },
+ { "MD" T(N) },
+ { "NAME" T(i) },
+ { "NOTAB" T(N) },
+ { "ONBLUR" T(N) },
+ { "ONFOCUS" T(N) },
+ { "REL" T(N) },
+ { "REV" T(N) },
+ { "SHAPE" T(N) },
+ { "STYLE" T(N) },
+ { "TABINDEX" T(N) },
+ { "TARGET" T(N) },
+ { "TITLE" T(N) },
+ { "TYPE" T(N) },
+ { "URN" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr ADDRESS_attr[] = { /* ADDRESS attributes */
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DIR" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "NOWRAP" T(N) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr APPLET_attr[] = { /* APPLET attributes */
+ { "ALIGN" T(N) },
+ { "ALT" T(N) },
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "CODE" T(N) },
+ { "CODEBASE" T(h) },
+ { "DIR" T(N) },
+ { "DOWNLOAD" T(N) },
+ { "HEIGHT" T(N) },
+ { "HSPACE" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "NAME" T(i) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { "VSPACE" T(N) },
+ { "WIDTH" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr AREA_attr[] = { /* AREA attributes */
+ { "ACCESSKEY" T(N) },
+ { "ALT" T(N) },
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "COORDS" T(N) },
+ { "DIR" T(N) },
+ { "HREF" T(h) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "NOHREF" T(N) },
+ { "NOTAB" T(N) },
+ { "ONBLUR" T(N) },
+ { "ONFOCUS" T(N) },
+ { "SHAPE" T(N) },
+ { "STYLE" T(N) },
+ { "TABINDEX" T(N) },
+ { "TARGET" T(N) },
+ { "TITLE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr BASE_attr[] = { /* BASE attributes */
+ { "CLASS" T(c) },
+ { "HREF" T(h) },
+ { "ID" T(i) },
+ { "STYLE" T(N) },
+ { "TARGET" T(N) },
+ { "TITLE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr BGSOUND_attr[] = { /* BGSOUND attributes */
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DIR" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "LOOP" T(N) },
+ { "SRC" T(h) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr BODY_attr[] = { /* BODY attributes */
+ { "ALINK" T(N) },
+ { "BACKGROUND" T(h) },
+ { "BGCOLOR" T(N) },
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DIR" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "LINK" T(N) },
+ { "ONLOAD" T(N) },
+ { "ONUNLOAD" T(N) },
+ { "STYLE" T(N) },
+ { "TEXT" T(N) },
+ { "TITLE" T(N) },
+ { "VLINK" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr BODYTEXT_attr[] = { /* BODYTEXT attributes */
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DATA" T(N) },
+ { "DIR" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "NAME" T(N) },
+ { "OBJECT" T(N) },
+ { "REF" T(N) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { "TYPE" T(N) },
+ { "VALUE" T(N) },
+ { "VALUETYPE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr BQ_attr[] = { /* BLOCKQUOTE attributes */
+ { "CITE" T(h) },
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DIR" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "NOWRAP" T(N) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr BUTTON_attr[] = { /* BUTTON attributes */
+ { "ACCESSKEY" T(N) },
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DIR" T(N) },
+ { "DISABLED" T(N) },
+ { "FORMACTION" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "NAME" T(N) },
+ { "ONBLUR" T(N) },
+ { "ONFOCUS" T(N) },
+ { "READONLY" T(N) },
+ { "STYLE" T(N) },
+ { "TABINDEX" T(N) },
+ { "TITLE" T(N) },
+ { "TYPE" T(N) },
+ { "VALUE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr CAPTION_attr[] = { /* CAPTION attributes */
+ { "ACCESSKEY" T(N) },
+ { "ALIGN" T(N) },
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DIR" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr COL_attr[] = { /* COL attributes */
+ { "ALIGN" T(N) },
+ { "CHAR" T(N) },
+ { "CHAROFF" T(N) },
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DIR" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "SPAN" T(N) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { "VALIGN" T(N) },
+ { "WIDTH" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr DEL_attr[] = { /* DEL attributes */
+ { "CITE" T(N) },
+ { "CLASS" T(c) },
+ { "DATETIME" T(N) },
+ { "DIR" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr DIV_attr[] = { /* CENTER attributes */
+ { "ALIGN" T(N) },
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DIR" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr DL_attr[] = { /* DL attributes */
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "COMPACT" T(N) },
+ { "DIR" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr EMBED_attr[] = { /* EMBED attributes */
+ { "ALIGN" T(N) },
+ { "ALT" T(N) },
+ { "BORDER" T(N) },
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DIR" T(N) },
+ { "HEIGHT" T(N) },
+ { "ID" T(i) },
+ { "IMAGEMAP" T(N) },
+ { "ISMAP" T(N) },
+ { "LANG" T(N) },
+ { "MD" T(N) },
+ { "NAME" T(i) },
+ { "NOFLOW" T(N) },
+ { "PARAMS" T(N) },
+ { "SRC" T(h) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { "UNITS" T(N) },
+ { "USEMAP" T(N) },
+ { "WIDTH" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr FIG_attr[] = { /* FIG attributes */
+ { "ALIGN" T(N) },
+ { "BORDER" T(N) },
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DIR" T(N) },
+ { "HEIGHT" T(N) },
+ { "ID" T(i) },
+ { "IMAGEMAP" T(N) },
+ { "ISOBJECT" T(N) },
+ { "LANG" T(N) },
+ { "MD" T(N) },
+ { "NOFLOW" T(N) },
+ { "SRC" T(h) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { "UNITS" T(N) },
+ { "WIDTH" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr FONT_attr[] = { /* BASEFONT attributes */
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "COLOR" T(N) },
+ { "DIR" T(N) },
+ { "END" T(N) },
+ { "FACE" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "SIZE" T(N) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr FORM_attr[] = { /* FORM attributes */
+ { "ACCEPT" T(N) },
+ { "ACCEPT-CHARSET" T(N) },
+ { "ACTION" T(h) },
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DIR" T(N) },
+ { "ENCTYPE" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "METHOD" T(N) },
+ { "ONRESET" T(N) },
+ { "ONSUBMIT" T(N) },
+ { "SCRIPT" T(N) },
+ { "STYLE" T(N) },
+ { "SUBJECT" T(N) },
+ { "TARGET" T(N) },
+ { "TITLE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr FRAME_attr[] = { /* FRAME attributes */
+ { "CLASS" T(c) },
+ { "FRAMEBORDER" T(N) },
+ { "ID" T(i) },
+ { "LONGDESC" T(h) },
+ { "MARGINHEIGHT" T(N) },
+ { "MARGINWIDTH" T(N) },
+ { "NAME" T(N) },
+ { "NORESIZE" T(N) },
+ { "SCROLLING" T(N) },
+ { "SRC" T(h) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr FRAMESET_attr[] = { /* FRAMESET attributes */
+ { "COLS" T(N) },
+ { "ONLOAD" T(N) },
+ { "ONUNLOAD" T(N) },
+ { "ROWS" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr GEN_attr[] = { /* ABBR attributes */
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DIR" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr GEN5_attr[] = { /* ARTICLE attributes */
+ { "CLASS" T(c) },
+ { "DIR" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "ROLE" T(N) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr H_attr[] = { /* H1 attributes */
+ { "ALIGN" T(N) },
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DINGBAT" T(N) },
+ { "DIR" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "MD" T(N) },
+ { "NOWRAP" T(N) },
+ { "SEQNUM" T(N) },
+ { "SKIP" T(N) },
+ { "SRC" T(h) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr HR_attr[] = { /* HR attributes */
+ { "ALIGN" T(N) },
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DIR" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "MD" T(N) },
+ { "NOSHADE" T(N) },
+ { "SIZE" T(N) },
+ { "SRC" T(h) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { "WIDTH" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr IFRAME_attr[] = { /* IFRAME attributes */
+ { "ALIGN" T(N) },
+ { "CLASS" T(c) },
+ { "FRAMEBORDER" T(N) },
+ { "HEIGHT" T(N) },
+ { "ID" T(i) },
+ { "LONGDESC" T(h) },
+ { "MARGINHEIGHT" T(N) },
+ { "MARGINWIDTH" T(N) },
+ { "NAME" T(N) },
+ { "SCROLLING" T(N) },
+ { "SRC" T(h) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { "WIDTH" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr IMG_attr[] = { /* IMG attributes */
+ { "ALIGN" T(N) },
+ { "ALT" T(N) },
+ { "BORDER" T(N) },
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DIR" T(N) },
+ { "HEIGHT" T(N) },
+ { "HSPACE" T(N) },
+ { "ID" T(i) },
+ { "ISMAP" T(N) },
+ { "ISOBJECT" T(N) },
+ { "LANG" T(N) },
+ { "LONGDESC" T(h) },
+ { "MD" T(N) },
+ { "NAME" T(N) },
+ { "SRC" T(h) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { "UNITS" T(N) },
+ { "USEMAP" T(h) },
+ { "VSPACE" T(N) },
+ { "WIDTH" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr INPUT_attr[] = { /* INPUT attributes */
+ { "ACCEPT" T(N) },
+ { "ACCEPT-CHARSET" T(N) },
+ { "ACCESSKEY" T(N) },
+ { "ALIGN" T(N) },
+ { "ALT" T(N) },
+ { "CHECKED" T(N) },
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DIR" T(N) },
+ { "DISABLED" T(N) },
+ { "ERROR" T(N) },
+ { "HEIGHT" T(N) },
+ { "ID" T(i) },
+ { "ISMAP" T(N) },
+ { "LANG" T(N) },
+ { "MAX" T(N) },
+ { "MAXLENGTH" T(N) },
+ { "MD" T(N) },
+ { "MIN" T(N) },
+ { "NAME" T(N) },
+ { "NOTAB" T(N) },
+ { "ONBLUR" T(N) },
+ { "ONCHANGE" T(N) },
+ { "ONFOCUS" T(N) },
+ { "ONSELECT" T(N) },
+ { "READONLY" T(N) },
+ { "SIZE" T(N) },
+ { "SRC" T(h) },
+ { "STYLE" T(N) },
+ { "TABINDEX" T(N) },
+ { "TITLE" T(N) },
+ { "TYPE" T(N) },
+ { "USEMAP" T(N) },
+ { "VALUE" T(N) },
+ { "WIDTH" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr ISINDEX_attr[] = { /* ISINDEX attributes */
+ { "ACTION" T(h) },
+ { "CLASS" T(c) },
+ { "DIR" T(N) },
+ { "HREF" T(h) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "PROMPT" T(N) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr KEYGEN_attr[] = { /* KEYGEN attributes */
+ { "CHALLENGE" T(N) },
+ { "CLASS" T(c) },
+ { "DIR" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "NAME" T(N) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr LABEL_attr[] = { /* LABEL attributes */
+ { "ACCESSKEY" T(N) },
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DIR" T(N) },
+ { "FOR" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "ONBLUR" T(N) },
+ { "ONFOCUS" T(N) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr LI_attr[] = { /* LI attributes */
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DINGBAT" T(N) },
+ { "DIR" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "MD" T(N) },
+ { "SKIP" T(N) },
+ { "SRC" T(h) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { "TYPE" T(N) },
+ { "VALUE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr LINK_attr[] = { /* LINK attributes */
+ { "CHARSET" T(N) },
+ { "CLASS" T(c) },
+ { "DIR" T(N) },
+ { "HREF" T(h) },
+ { "HREFLANG" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "MEDIA" T(N) },
+ { "REL" T(N) },
+ { "REV" T(N) },
+ { "STYLE" T(N) },
+ { "TARGET" T(N) },
+ { "TITLE" T(N) },
+ { "TYPE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr MAP_attr[] = { /* MAP attributes */
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DIR" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "NAME" T(i) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr MATH_attr[] = { /* MATH attributes */
+ { "BOX" T(N) },
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DIR" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr META_attr[] = { /* META attributes */
+ { "CHARSET" T(N) },
+ { "CONTENT" T(N) },
+ { "HTTP-EQUIV" T(N) },
+ { "NAME" T(N) },
+ { "SCHEME" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr NEXTID_attr[] = { /* NEXTID attributes */
+ { "N" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr NOTE_attr[] = { /* NOTE attributes */
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DIR" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "MD" T(N) },
+ { "ROLE" T(x) },
+ { "SRC" T(h) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr OBJECT_attr[] = { /* OBJECT attributes */
+ { "ALIGN" T(N) },
+ { "ARCHIVE" T(N) },
+ { "BORDER" T(N) },
+ { "CLASS" T(c) },
+ { "CLASSID" T(h) },
+ { "CODEBASE" T(h) },
+ { "CODETYPE" T(N) },
+ { "DATA" T(h) },
+ { "DECLARE" T(N) },
+ { "DIR" T(N) },
+ { "HEIGHT" T(N) },
+ { "HSPACE" T(N) },
+ { "ID" T(i) },
+ { "ISMAP" T(N) },
+ { "LANG" T(N) },
+ { "NAME" T(N) },
+ { "NOTAB" T(N) },
+ { "SHAPES" T(N) },
+ { "STANDBY" T(N) },
+ { "STYLE" T(N) },
+ { "TABINDEX" T(N) },
+ { "TITLE" T(N) },
+ { "TYPE" T(N) },
+ { "USEMAP" T(h) },
+ { "VSPACE" T(N) },
+ { "WIDTH" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr OL_attr[] = { /* OL attributes */
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "COMPACT" T(N) },
+ { "CONTINUE" T(N) },
+ { "DIR" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "SEQNUM" T(N) },
+ { "START" T(N) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { "TYPE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr OPTION_attr[] = { /* OPTION attributes */
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DIR" T(N) },
+ { "DISABLED" T(N) },
+ { "ERROR" T(N) },
+ { "ID" T(i) },
+ { "LABEL" T(N) },
+ { "LANG" T(N) },
+ { "SELECTED" T(N) },
+ { "SHAPE" T(N) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { "VALUE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr OVERLAY_attr[] = { /* OVERLAY attributes */
+ { "CLASS" T(c) },
+ { "HEIGHT" T(N) },
+ { "ID" T(i) },
+ { "IMAGEMAP" T(N) },
+ { "MD" T(N) },
+ { "SRC" T(h) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { "UNITS" T(N) },
+ { "WIDTH" T(N) },
+ { "X" T(N) },
+ { "Y" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr P_attr[] = { /* P attributes */
+ { "ALIGN" T(N) },
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DIR" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "NOWRAP" T(N) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr PARAM_attr[] = { /* PARAM attributes */
+ { "ACCEPT" T(N) },
+ { "ACCEPT-CHARSET" T(N) },
+ { "ACCEPT-ENCODING" T(N) },
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DATA" T(N) },
+ { "DIR" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "NAME" T(N) },
+ { "OBJECT" T(N) },
+ { "REF" T(N) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { "TYPE" T(N) },
+ { "VALUE" T(N) },
+ { "VALUEREF" T(N) },
+ { "VALUETYPE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr Q_attr[] = { /* Q attributes */
+ { "CITE" T(h) },
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DIR" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr SCRIPT_attr[] = { /* SCRIPT attributes */
+ { "CHARSET" T(N) },
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DEFER" T(N) },
+ { "DIR" T(N) },
+ { "EVENT" T(N) },
+ { "FOR" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "LANGUAGE" T(N) },
+ { "NAME" T(N) },
+ { "SCRIPTENGINE" T(N) },
+ { "SRC" T(h) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { "TYPE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr SELECT_attr[] = { /* SELECT attributes */
+ { "ALIGN" T(N) },
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DIR" T(N) },
+ { "DISABLED" T(N) },
+ { "ERROR" T(N) },
+ { "HEIGHT" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "MD" T(N) },
+ { "MULTIPLE" T(N) },
+ { "NAME" T(N) },
+ { "NOTAB" T(N) },
+ { "ONBLUR" T(N) },
+ { "ONCHANGE" T(N) },
+ { "ONFOCUS" T(N) },
+ { "SIZE" T(N) },
+ { "STYLE" T(N) },
+ { "TABINDEX" T(N) },
+ { "TITLE" T(N) },
+ { "UNITS" T(N) },
+ { "WIDTH" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr STYLE_attr[] = { /* STYLE attributes */
+ { "CLASS" T(c) },
+ { "DIR" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "MEDIA" T(N) },
+ { "NOTATION" T(N) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { "TYPE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr TAB_attr[] = { /* TAB attributes */
+ { "ALIGN" T(N) },
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DIR" T(N) },
+ { "DP" T(N) },
+ { "ID" T(i) },
+ { "INDENT" T(N) },
+ { "LANG" T(N) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { "TO" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr TABLE_attr[] = { /* TABLE attributes */
+ { "ALIGN" T(N) },
+ { "BACKGROUND" T(h) },
+ { "BORDER" T(N) },
+ { "CELLPADDING" T(N) },
+ { "CELLSPACING" T(N) },
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "COLS" T(N) },
+ { "COLSPEC" T(N) },
+ { "DIR" T(N) },
+ { "DP" T(N) },
+ { "FRAME" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "NOFLOW" T(N) },
+ { "NOWRAP" T(N) },
+ { "RULES" T(N) },
+ { "STYLE" T(N) },
+ { "SUMMARY" T(N) },
+ { "TITLE" T(N) },
+ { "UNITS" T(N) },
+ { "WIDTH" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr TD_attr[] = { /* TD attributes */
+ { "ABBR" T(N) },
+ { "ALIGN" T(N) },
+ { "AXES" T(N) },
+ { "AXIS" T(N) },
+ { "BACKGROUND" T(h) },
+ { "CHAR" T(N) },
+ { "CHAROFF" T(N) },
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "COLSPAN" T(N) },
+ { "DIR" T(N) },
+ { "DP" T(N) },
+ { "HEADERS" T(N) },
+ { "HEIGHT" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "NOWRAP" T(N) },
+ { "ROWSPAN" T(N) },
+ { "SCOPE" T(N) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { "VALIGN" T(N) },
+ { "WIDTH" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr TEXTAREA_attr[] = { /* TEXTAREA attributes */
+ { "ACCEPT-CHARSET" T(N) },
+ { "ACCESSKEY" T(N) },
+ { "ALIGN" T(N) },
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "COLS" T(N) },
+ { "DIR" T(N) },
+ { "DISABLED" T(N) },
+ { "ERROR" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "NAME" T(N) },
+ { "NOTAB" T(N) },
+ { "ONBLUR" T(N) },
+ { "ONCHANGE" T(N) },
+ { "ONFOCUS" T(N) },
+ { "ONSELECT" T(N) },
+ { "READONLY" T(N) },
+ { "ROWS" T(N) },
+ { "STYLE" T(N) },
+ { "TABINDEX" T(N) },
+ { "TITLE" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr TR_attr[] = { /* TBODY attributes */
+ { "ALIGN" T(N) },
+ { "CHAR" T(N) },
+ { "CHAROFF" T(N) },
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "DIR" T(N) },
+ { "DP" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "NOWRAP" T(N) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { "VALIGN" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+static const attr UL_attr[] = { /* DIR attributes */
+ { "CLASS" T(c) },
+ { "CLEAR" T(N) },
+ { "COMPACT" T(N) },
+ { "DINGBAT" T(N) },
+ { "DIR" T(N) },
+ { "ID" T(i) },
+ { "LANG" T(N) },
+ { "MD" T(N) },
+ { "PLAIN" T(N) },
+ { "SRC" T(h) },
+ { "STYLE" T(N) },
+ { "TITLE" T(N) },
+ { "TYPE" T(N) },
+ { "WRAP" T(N) },
+ { 0 T(N) } /* Terminate list */
+};
+
+/* *INDENT-ON* */
+
+/* justification-flags */
+#undef N
+#undef i
+#undef h
+#undef c
+#undef x
+
+#undef T
+
+/* tag-names */
+#undef A
+#undef ABBR
+#undef ACRONYM
+#undef ADDRESS
+#undef APPLET
+#undef AREA
+#undef ARTICLE
+#undef ASIDE
+#undef AU
+#undef AUTHOR
+#undef B
+#undef BANNER
+#undef BASE
+#undef BASEFONT
+#undef BDO
+#undef BGSOUND
+#undef BIG
+#undef BLINK
+#undef BLOCKQUOTE
+#undef BODY
+#undef BODYTEXT
+#undef BQ
+#undef BR
+#undef BUTTON
+#undef CAPTION
+#undef CENTER
+#undef CITE
+#undef CODE
+#undef COL
+#undef COLGROUP
+#undef COMMENT
+#undef CREDIT
+#undef DD
+#undef DEL
+#undef DEL
+#undef DFN
+#undef DIR
+#undef DIV
+#undef DL
+#undef DLC
+#undef DT
+#undef EM
+#undef EMBED
+#undef FIELDSET
+#undef FIG
+#undef FIGURE
+#undef FN
+#undef FONT
+#undef FOOTER
+#undef FORM
+#undef FRAME
+#undef FRAMESET
+#undef H1
+#undef H2
+#undef H3
+#undef H4
+#undef H5
+#undef H6
+#undef HEAD
+#undef HEADER
+#undef HR
+#undef HTML
+#undef HY
+#undef I
+#undef IFRAME
+#undef IMG
+#undef INPUT
+#undef INS
+#undef INS
+#undef ISINDEX
+#undef KBD
+#undef KEYGEN
+#undef LABEL
+#undef LEGEND
+#undef LH
+#undef LI
+#undef LINK
+#undef LISTING
+#undef MAIN
+#undef MAP
+#undef MARQUEE
+#undef MATH
+#undef MENU
+#undef META
+#undef NAV
+#undef NEXTID
+#undef NOFRAMES
+#undef NOTE
+#undef OBJECT
+#undef OL
+#undef OPTION
+#undef OVERLAY
+#undef P
+#undef PARAM
+#undef PLAINTEXT
+#undef PRE
+#undef Q
+#undef S
+#undef SAMP
+#undef SCRIPT
+#undef SECTION
+#undef SELECT
+#undef SHY
+#undef SMALL
+#undef SPAN
+#undef SPOT
+#undef STRIKE
+#undef STRONG
+#undef STYLE
+#undef SUB
+#undef SUP
+#undef TAB
+#undef TABLE
+#undef TBODY
+#undef TD
+#undef TEXTAREA
+#undef TEXTFLOW
+#undef TFOOT
+#undef TH
+#undef THEAD
+#undef TITLE
+#undef TR
+#undef TT
+#undef U
+#undef UL
+#undef VAR
+#undef WBR
+#undef XMP
+#undef OBJECT_PCDATA
+
+/* these definitions are used in the tags-tables */
+#undef P
+#undef P_
+#ifdef USE_COLOR_STYLE
+#define P_(x) #x, (sizeof #x) -1
+#define NULL_HTTag_ NULL, 0
+#else
+#define P_(x) #x
+#define NULL_HTTag_ NULL
+#endif
+
+#ifdef USE_JUSTIFY_ELTS
+#define P(x) P_(x), 1
+#define P0(x) P_(x), 0
+#define NULL_HTTag NULL_HTTag_,0
+#else
+#define P(x) P_(x)
+#define P0(x) P_(x)
+#define NULL_HTTag NULL_HTTag_
+#endif
+
+#define ATTR_DATA(name) name##_attr, HTML_##name##_ATTRIBUTES, name##_attr_type
+
+#endif /* once_HTMLDTD */
+/* *INDENT-OFF* */
+static const HTTag tags_table1[HTML_ALL_ELEMENTS] = {
+ { P(A), ATTR_DATA(A), SGML_MIXED, T_A, 0, 0},
+ { P(ABBR), ATTR_DATA(GEN), SGML_MIXED, T_ABBR, 0, 0},
+ { P(ACRONYM), ATTR_DATA(GEN), SGML_MIXED, T_ACRONYM, 0, 0},
+ { P(ADDRESS), ATTR_DATA(ADDRESS), SGML_MIXED, T_ADDRESS, 0, 0},
+ { P(APPLET), ATTR_DATA(APPLET), SGML_MIXED, T_APPLET, 0, 0},
+ { P(AREA), ATTR_DATA(AREA), SGML_EMPTY, T_AREA, 0, 0},
+ { P(ARTICLE), ATTR_DATA(GEN5), SGML_MIXED, T_ARTICLE, 0, 0},
+ { P(ASIDE), ATTR_DATA(GEN5), SGML_MIXED, T_ASIDE, 0, 0},
+ { P(AU), ATTR_DATA(GEN), SGML_MIXED, T_AU, 0, 0},
+ { P(AUTHOR), ATTR_DATA(GEN), SGML_MIXED, T_AUTHOR, 0, 0},
+ { P(B), ATTR_DATA(GEN), SGML_MIXED, T_B, 0, 0},
+ { P0(BANNER), ATTR_DATA(GEN), SGML_MIXED, T_BANNER, 0, 0},
+ { P(BASE), ATTR_DATA(BASE), SGML_EMPTY, T_BASE, 0, 0},
+ { P(BASEFONT), ATTR_DATA(FONT), SGML_EMPTY, T_BASEFONT, 0, 0},
+ { P(BDO), ATTR_DATA(GEN), SGML_MIXED, T_BDO, 0, 0},
+ { P(BGSOUND), ATTR_DATA(BGSOUND), SGML_EMPTY, T_BGSOUND, 0, 0},
+ { P(BIG), ATTR_DATA(GEN), SGML_MIXED, T_BIG, 0, 0},
+ { P(BLINK), ATTR_DATA(GEN), SGML_MIXED, T_BLINK, 0, 0},
+ { P(BLOCKQUOTE), ATTR_DATA(BQ), SGML_MIXED, T_BLOCKQUOTE, 0, 0},
+ { P(BODY), ATTR_DATA(BODY), SGML_MIXED, T_BODY, 0, 0},
+ { P(BODYTEXT), ATTR_DATA(BODYTEXT), SGML_MIXED, T_BODYTEXT, 0, 0},
+ { P(BQ), ATTR_DATA(BQ), SGML_MIXED, T_BQ, 0, 0},
+ { P(BR), ATTR_DATA(GEN), SGML_EMPTY, T_BR, 0, 0},
+ { P(BUTTON), ATTR_DATA(BUTTON), SGML_MIXED, T_BUTTON, 0, 0},
+ { P(CAPTION), ATTR_DATA(CAPTION), SGML_MIXED, T_CAPTION, 0, 0},
+ { P(CENTER), ATTR_DATA(DIV), SGML_MIXED, T_CENTER, 0, 0},
+ { P(CITE), ATTR_DATA(GEN), SGML_MIXED, T_CITE, 0, 0},
+ { P(CODE), ATTR_DATA(GEN), SGML_MIXED, T_CODE, 0, 0},
+ { P(COL), ATTR_DATA(COL), SGML_EMPTY, T_COL, 0, 0},
+ { P(COLGROUP), ATTR_DATA(COL), SGML_ELEMENT, T_COLGROUP, 0, 0},
+ { P(COMMENT), ATTR_DATA(GEN), SGML_PCDATA, T_COMMENT, 0, 0},
+ { P(CREDIT), ATTR_DATA(GEN), SGML_MIXED, T_CREDIT, 0, 0},
+ { P(DD), ATTR_DATA(GEN), SGML_MIXED, T_DD, 0, 0},
+ { P(DEL), ATTR_DATA(DEL), SGML_MIXED, T_DEL, 0, 1},
+ { P(DEL), ATTR_DATA(DEL), SGML_MIXED, T_DEL_2, 1, 1},
+ { P(DFN), ATTR_DATA(GEN), SGML_MIXED, T_DFN, 0, 0},
+ { P(DIR), ATTR_DATA(UL), SGML_MIXED, T_DIR, 0, 0},
+ { P(DIV), ATTR_DATA(DIV), SGML_MIXED, T_DIV, 0, 0},
+ { P(DL), ATTR_DATA(DL), SGML_MIXED, T_DL, 0, 0},
+ { P(DLC), ATTR_DATA(DL), SGML_MIXED, T_DLC, 0, 0},
+ { P(DT), ATTR_DATA(GEN), SGML_MIXED, T_DT, 0, 0},
+ { P(EM), ATTR_DATA(GEN), SGML_MIXED, T_EM, 0, 0},
+ { P(EMBED), ATTR_DATA(EMBED), SGML_EMPTY, T_EMBED, 0, 0},
+ { P(FIELDSET), ATTR_DATA(GEN), SGML_MIXED, T_FIELDSET, 0, 0},
+ { P(FIG), ATTR_DATA(FIG), SGML_MIXED, T_FIG, 0, 0},
+ { P(FIGURE), ATTR_DATA(GEN5), SGML_MIXED, T_FIGURE, 0, 0},
+ { P(FN), ATTR_DATA(GEN), SGML_MIXED, T_FN, 0, 0},
+ { P(FONT), ATTR_DATA(FONT), SGML_MIXED, T_FONT, 0, 0},
+ { P(FOOTER), ATTR_DATA(GEN5), SGML_MIXED, T_FOOTER, 0, 0},
+ { P(FORM), ATTR_DATA(FORM), SGML_MIXED, T_FORM, 0, 0},
+ { P(FRAME), ATTR_DATA(FRAME), SGML_EMPTY, T_FRAME, 0, 0},
+ { P(FRAMESET), ATTR_DATA(FRAMESET), SGML_ELEMENT, T_FRAMESET, 0, 0},
+ { P0(H1), ATTR_DATA(H), SGML_MIXED, T_H1, 0, 0},
+ { P0(H2), ATTR_DATA(H), SGML_MIXED, T_H2, 0, 0},
+ { P0(H3), ATTR_DATA(H), SGML_MIXED, T_H3, 0, 0},
+ { P0(H4), ATTR_DATA(H), SGML_MIXED, T_H4, 0, 0},
+ { P0(H5), ATTR_DATA(H), SGML_MIXED, T_H5, 0, 0},
+ { P0(H6), ATTR_DATA(H), SGML_MIXED, T_H6, 0, 0},
+ { P(HEAD), ATTR_DATA(GEN), SGML_ELEMENT, T_HEAD, 0, 0},
+ { P(HEADER), ATTR_DATA(GEN5), SGML_MIXED, T_HEADER, 0, 0},
+ { P(HR), ATTR_DATA(HR), SGML_EMPTY, T_HR, 0, 0},
+ { P(HTML), ATTR_DATA(GEN), SGML_MIXED, T_HTML, 0, 0},
+ { P(HY), ATTR_DATA(GEN), SGML_EMPTY, T_HY, 0, 0},
+ { P(I), ATTR_DATA(GEN), SGML_MIXED, T_I, 0, 0},
+ { P(IFRAME), ATTR_DATA(IFRAME), SGML_MIXED, T_IFRAME, 0, 0},
+ { P(IMG), ATTR_DATA(IMG), SGML_EMPTY, T_IMG, 0, 0},
+ { P(INPUT), ATTR_DATA(INPUT), SGML_EMPTY, T_INPUT, 0, 0},
+ { P(INS), ATTR_DATA(DEL), SGML_MIXED, T_INS, 0, 1},
+ { P(INS), ATTR_DATA(DEL), SGML_MIXED, T_INS_2, 1, 1},
+ { P(ISINDEX), ATTR_DATA(ISINDEX), SGML_EMPTY, T_ISINDEX, 0, 0},
+ { P(KBD), ATTR_DATA(GEN), SGML_MIXED, T_KBD, 0, 0},
+ { P(KEYGEN), ATTR_DATA(KEYGEN), SGML_EMPTY, T_KEYGEN, 0, 0},
+ { P(LABEL), ATTR_DATA(LABEL), SGML_MIXED, T_LABEL, 0, 0},
+ { P(LEGEND), ATTR_DATA(CAPTION), SGML_MIXED, T_LEGEND, 0, 0},
+ { P(LH), ATTR_DATA(GEN), SGML_MIXED, T_LH, 0, 0},
+ { P(LI), ATTR_DATA(LI), SGML_MIXED, T_LI, 0, 0},
+ { P(LINK), ATTR_DATA(LINK), SGML_EMPTY, T_LINK, 0, 0},
+ { P(LISTING), ATTR_DATA(GEN), SGML_LITTERAL,T_LISTING, 0, 0},
+ { P(MAIN), ATTR_DATA(GEN5), SGML_MIXED, T_MAIN, 0, 0},
+ { P(MAP), ATTR_DATA(MAP), SGML_ELEMENT, T_MAP, 0, 0},
+ { P(MARQUEE), ATTR_DATA(GEN), SGML_MIXED, T_MARQUEE, 0, 0},
+ { P(MATH), ATTR_DATA(MATH), SGML_PCDATA, T_MATH, 0, 0},
+ { P(MENU), ATTR_DATA(UL), SGML_MIXED, T_MENU, 0, 0},
+ { P(META), ATTR_DATA(META), SGML_EMPTY, T_META, 0, 0},
+ { P(NAV), ATTR_DATA(GEN5), SGML_MIXED, T_NAV, 0, 0},
+ { P(NEXTID), ATTR_DATA(NEXTID), SGML_EMPTY, T_NEXTID, 0, 0},
+ { P(NOFRAMES), ATTR_DATA(GEN), SGML_MIXED, T_NOFRAMES, 0, 0},
+ { P(NOTE), ATTR_DATA(NOTE), SGML_MIXED, T_NOTE, 0, 0},
+ { P(OBJECT), ATTR_DATA(OBJECT), SGML_LITTERAL,T_OBJECT, 0, 0},
+ { P(OL), ATTR_DATA(OL), SGML_MIXED, T_OL, 0, 0},
+ { P(OPTION), ATTR_DATA(OPTION), SGML_PCDATA, T_OPTION, 0, 0},
+ { P(OVERLAY), ATTR_DATA(OVERLAY), SGML_PCDATA, T_OVERLAY, 0, 0},
+ { P(P), ATTR_DATA(P), SGML_MIXED, T_P, 0, 0},
+ { P(PARAM), ATTR_DATA(PARAM), SGML_EMPTY, T_PARAM, 0, 0},
+ { P(PLAINTEXT), ATTR_DATA(GEN), SGML_LITTERAL,T_PLAINTEXT, 0, 0},
+ { P0(PRE), ATTR_DATA(GEN), SGML_MIXED, T_PRE, 0, 0},
+ { P(Q), ATTR_DATA(Q), SGML_MIXED, T_Q, 0, 0},
+ { P(S), ATTR_DATA(GEN), SGML_MIXED, T_S, 0, 0},
+ { P(SAMP), ATTR_DATA(GEN), SGML_MIXED, T_SAMP, 0, 0},
+ { P(SCRIPT), ATTR_DATA(SCRIPT), SGML_SCRIPT, T_SCRIPT, 0, 0},
+ { P(SECTION), ATTR_DATA(GEN5), SGML_MIXED, T_SECTION, 0, 0},
+ { P(SELECT), ATTR_DATA(SELECT), SGML_ELEMENT, T_SELECT, 0, 0},
+ { P(SHY), ATTR_DATA(GEN), SGML_EMPTY, T_SHY, 0, 0},
+ { P(SMALL), ATTR_DATA(GEN), SGML_MIXED, T_SMALL, 0, 0},
+ { P(SPAN), ATTR_DATA(GEN), SGML_MIXED, T_SPAN, 0, 0},
+ { P(SPOT), ATTR_DATA(GEN), SGML_EMPTY, T_SPOT, 0, 0},
+ { P(STRIKE), ATTR_DATA(GEN), SGML_MIXED, T_STRIKE, 0, 0},
+ { P(STRONG), ATTR_DATA(GEN), SGML_MIXED, T_STRONG, 0, 0},
+ { P(STYLE), ATTR_DATA(STYLE), SGML_CDATA, T_STYLE, 0, 0},
+ { P(SUB), ATTR_DATA(GEN), SGML_MIXED, T_SUB, 0, 0},
+ { P(SUP), ATTR_DATA(GEN), SGML_MIXED, T_SUP, 0, 0},
+ { P(TAB), ATTR_DATA(TAB), SGML_EMPTY, T_TAB, 0, 0},
+ { P(TABLE), ATTR_DATA(TABLE), SGML_ELEMENT, T_TABLE, 0, 0},
+ { P(TBODY), ATTR_DATA(TR), SGML_ELEMENT, T_TBODY, 0, 0},
+ { P(TD), ATTR_DATA(TD), SGML_MIXED, T_TD, 0, 0},
+ { P(TEXTAREA), ATTR_DATA(TEXTAREA), SGML_PCDATA, T_TEXTAREA, 0, 0},
+ { P(TEXTFLOW), ATTR_DATA(BODYTEXT), SGML_MIXED, T_TEXTFLOW, 0, 0},
+ { P(TFOOT), ATTR_DATA(TR), SGML_ELEMENT, T_TFOOT, 0, 0},
+ { P(TH), ATTR_DATA(TD), SGML_MIXED, T_TH, 0, 0},
+ { P(THEAD), ATTR_DATA(TR), SGML_ELEMENT, T_THEAD, 0, 0},
+ { P(TITLE), ATTR_DATA(GEN), SGML_PCDATA, T_TITLE, 0, 0},
+ { P(TR), ATTR_DATA(TR), SGML_MIXED, T_TR, 0, 0},
+ { P(TT), ATTR_DATA(GEN), SGML_MIXED, T_TT, 0, 0},
+ { P(U), ATTR_DATA(GEN), SGML_MIXED, T_U, 0, 0},
+ { P(UL), ATTR_DATA(UL), SGML_MIXED, T_UL, 0, 0},
+ { P(VAR), ATTR_DATA(GEN), SGML_MIXED, T_VAR, 0, 0},
+ { P(WBR), ATTR_DATA(GEN), SGML_EMPTY, T_WBR, 0, 0},
+ { P0(XMP), ATTR_DATA(GEN), SGML_LITTERAL,T_XMP, 0, 0},
+/* additional (alternative variants), not counted in HTML_ELEMENTS: */
+/* This one will be used as a temporary substitute within the parser when
+ it has been signalled to parse OBJECT content as MIXED. - kw */
+ { P(OBJECT), ATTR_DATA(OBJECT), SGML_MIXED, T_OBJECT_PCDATA, 0, 0},
+};
+/* *INDENT-ON* */
+
+#endif /* src_HTMLDTD_H1 */
diff --git a/WWW/Library/Implementation/src1_HTMLDTD.txt b/WWW/Library/Implementation/src1_HTMLDTD.txt
new file mode 100644
index 0000000..df1521b
--- /dev/null
+++ b/WWW/Library/Implementation/src1_HTMLDTD.txt
@@ -0,0 +1,3901 @@
+60 attr_types
+ 0:align
+ 1 attributes:
+ 0:0:ALIGN
+ 1:bgcolor
+ 1 attributes:
+ 0:0:BGCOLOR
+ 2:cellalign
+ 4 attributes:
+ 0:0:ALIGN
+ 1:0:CHAR
+ 2:0:CHAROFF
+ 3:0:VALIGN
+ 3:core
+ 4 attributes:
+ 0:4:CLASS
+ 1:1:ID
+ 2:0:STYLE
+ 3:0:TITLE
+ 4:events
+ 10 attributes:
+ 0:0:ONCLICK
+ 1:0:ONDBLCLICK
+ 2:0:ONKEYDOWN
+ 3:0:ONKEYPRESS
+ 4:0:ONKEYUP
+ 5:0:ONMOUSEDOWN
+ 6:0:ONMOUSEMOVE
+ 7:0:ONMOUSEOUT
+ 8:0:ONMOUSEOVER
+ 9:0:ONMOUSEUP
+ 5:i18n
+ 2 attributes:
+ 0:0:DIR
+ 1:0:LANG
+ 6:A
+ 19 attributes:
+ 0:0:ACCESSKEY
+ 1:0:CHARSET
+ 2:0:CLEAR
+ 3:0:COORDS
+ 4:2:HREF
+ 5:0:HREFLANG
+ 6:0:ISMAP
+ 7:0:MD
+ 8:1:NAME
+ 9:0:NOTAB
+ 10:0:ONBLUR
+ 11:0:ONFOCUS
+ 12:0:REL
+ 13:0:REV
+ 14:0:SHAPE
+ 15:0:TABINDEX
+ 16:0:TARGET
+ 17:0:TYPE
+ 18:0:URN
+ 7:ADDRESS
+ 2 attributes:
+ 0:0:CLEAR
+ 1:0:NOWRAP
+ 8:APPLET
+ 10 attributes:
+ 0:0:ALT
+ 1:0:CLEAR
+ 2:0:CODE
+ 3:2:CODEBASE
+ 4:0:DOWNLOAD
+ 5:0:HEIGHT
+ 6:0:HSPACE
+ 7:1:NAME
+ 8:0:VSPACE
+ 9:0:WIDTH
+ 9:AREA
+ 12 attributes:
+ 0:0:ACCESSKEY
+ 1:0:ALT
+ 2:0:CLEAR
+ 3:0:COORDS
+ 4:2:HREF
+ 5:0:NOHREF
+ 6:0:NOTAB
+ 7:0:ONBLUR
+ 8:0:ONFOCUS
+ 9:0:SHAPE
+ 10:0:TABINDEX
+ 11:0:TARGET
+ 10:BASE
+ 2 attributes:
+ 0:2:HREF
+ 1:0:TARGET
+ 11:BGSOUND
+ 3 attributes:
+ 0:0:CLEAR
+ 1:0:LOOP
+ 2:2:SRC
+ 12:BODY
+ 8 attributes:
+ 0:0:ALINK
+ 1:2:BACKGROUND
+ 2:0:CLEAR
+ 3:0:LINK
+ 4:0:ONLOAD
+ 5:0:ONUNLOAD
+ 6:0:TEXT
+ 7:0:VLINK
+ 13:BODYTEXT
+ 8 attributes:
+ 0:0:CLEAR
+ 1:0:DATA
+ 2:0:NAME
+ 3:0:OBJECT
+ 4:0:REF
+ 5:0:TYPE
+ 6:0:VALUE
+ 7:0:VALUETYPE
+ 14:BQ
+ 3 attributes:
+ 0:2:CITE
+ 1:0:CLEAR
+ 2:0:NOWRAP
+ 15:BUTTON
+ 11 attributes:
+ 0:0:ACCESSKEY
+ 1:0:CLEAR
+ 2:0:DISABLED
+ 3:0:FORMACTION
+ 4:0:NAME
+ 5:0:ONBLUR
+ 6:0:ONFOCUS
+ 7:0:READONLY
+ 8:0:TABINDEX
+ 9:0:TYPE
+ 10:0:VALUE
+ 16:CAPTION
+ 2 attributes:
+ 0:0:ACCESSKEY
+ 1:0:CLEAR
+ 17:COL
+ 3 attributes:
+ 0:0:CLEAR
+ 1:0:SPAN
+ 2:0:WIDTH
+ 18:DEL
+ 2 attributes:
+ 0:0:CITE
+ 1:0:DATETIME
+ 19:DIV
+ 1 attributes:
+ 0:0:CLEAR
+ 20:DL
+ 2 attributes:
+ 0:0:CLEAR
+ 1:0:COMPACT
+ 21:EMBED
+ 14 attributes:
+ 0:0:ALT
+ 1:0:BORDER
+ 2:0:CLEAR
+ 3:0:HEIGHT
+ 4:0:IMAGEMAP
+ 5:0:ISMAP
+ 6:0:MD
+ 7:1:NAME
+ 8:0:NOFLOW
+ 9:0:PARAMS
+ 10:2:SRC
+ 11:0:UNITS
+ 12:0:USEMAP
+ 13:0:WIDTH
+ 22:FIG
+ 10 attributes:
+ 0:0:BORDER
+ 1:0:CLEAR
+ 2:0:HEIGHT
+ 3:0:IMAGEMAP
+ 4:0:ISOBJECT
+ 5:0:MD
+ 6:0:NOFLOW
+ 7:2:SRC
+ 8:0:UNITS
+ 9:0:WIDTH
+ 23:FONT
+ 5 attributes:
+ 0:0:CLEAR
+ 1:0:COLOR
+ 2:0:END
+ 3:0:FACE
+ 4:0:SIZE
+ 24:FORM
+ 11 attributes:
+ 0:0:ACCEPT
+ 1:0:ACCEPT-CHARSET
+ 2:2:ACTION
+ 3:0:CLEAR
+ 4:0:ENCTYPE
+ 5:0:METHOD
+ 6:0:ONRESET
+ 7:0:ONSUBMIT
+ 8:0:SCRIPT
+ 9:0:SUBJECT
+ 10:0:TARGET
+ 25:FRAME
+ 8 attributes:
+ 0:0:FRAMEBORDER
+ 1:2:LONGDESC
+ 2:0:MARGINHEIGHT
+ 3:0:MARGINWIDTH
+ 4:0:NAME
+ 5:0:NORESIZE
+ 6:0:SCROLLING
+ 7:2:SRC
+ 26:FRAMESET
+ 4 attributes:
+ 0:0:COLS
+ 1:0:ONLOAD
+ 2:0:ONUNLOAD
+ 3:0:ROWS
+ 27:GEN
+ 1 attributes:
+ 0:0:CLEAR
+ 28:GEN5
+ 1 attributes:
+ 0:0:ROLE
+ 29:H
+ 7 attributes:
+ 0:0:CLEAR
+ 1:0:DINGBAT
+ 2:0:MD
+ 3:0:NOWRAP
+ 4:0:SEQNUM
+ 5:0:SKIP
+ 6:2:SRC
+ 30:HR
+ 6 attributes:
+ 0:0:CLEAR
+ 1:0:MD
+ 2:0:NOSHADE
+ 3:0:SIZE
+ 4:2:SRC
+ 5:0:WIDTH
+ 31:IFRAME
+ 9 attributes:
+ 0:0:FRAMEBORDER
+ 1:0:HEIGHT
+ 2:2:LONGDESC
+ 3:0:MARGINHEIGHT
+ 4:0:MARGINWIDTH
+ 5:0:NAME
+ 6:0:SCROLLING
+ 7:2:SRC
+ 8:0:WIDTH
+ 32:IMG
+ 15 attributes:
+ 0:0:ALT
+ 1:0:BORDER
+ 2:0:CLEAR
+ 3:0:HEIGHT
+ 4:0:HSPACE
+ 5:0:ISMAP
+ 6:0:ISOBJECT
+ 7:2:LONGDESC
+ 8:0:MD
+ 9:0:NAME
+ 10:2:SRC
+ 11:0:UNITS
+ 12:2:USEMAP
+ 13:0:VSPACE
+ 14:0:WIDTH
+ 33:INPUT
+ 28 attributes:
+ 0:0:ACCEPT
+ 1:0:ACCEPT-CHARSET
+ 2:0:ACCESSKEY
+ 3:0:ALT
+ 4:0:CHECKED
+ 5:0:CLEAR
+ 6:0:DISABLED
+ 7:0:ERROR
+ 8:0:HEIGHT
+ 9:0:ISMAP
+ 10:0:MAX
+ 11:0:MAXLENGTH
+ 12:0:MD
+ 13:0:MIN
+ 14:0:NAME
+ 15:0:NOTAB
+ 16:0:ONBLUR
+ 17:0:ONCHANGE
+ 18:0:ONFOCUS
+ 19:0:ONSELECT
+ 20:0:READONLY
+ 21:0:SIZE
+ 22:2:SRC
+ 23:0:TABINDEX
+ 24:0:TYPE
+ 25:0:USEMAP
+ 26:0:VALUE
+ 27:0:WIDTH
+ 34:ISINDEX
+ 3 attributes:
+ 0:2:ACTION
+ 1:2:HREF
+ 2:0:PROMPT
+ 35:KEYGEN
+ 2 attributes:
+ 0:0:CHALLENGE
+ 1:0:NAME
+ 36:LABEL
+ 5 attributes:
+ 0:0:ACCESSKEY
+ 1:0:CLEAR
+ 2:0:FOR
+ 3:0:ONBLUR
+ 4:0:ONFOCUS
+ 37:LI
+ 7 attributes:
+ 0:0:CLEAR
+ 1:0:DINGBAT
+ 2:0:MD
+ 3:0:SKIP
+ 4:2:SRC
+ 5:0:TYPE
+ 6:0:VALUE
+ 38:LINK
+ 8 attributes:
+ 0:0:CHARSET
+ 1:2:HREF
+ 2:0:HREFLANG
+ 3:0:MEDIA
+ 4:0:REL
+ 5:0:REV
+ 6:0:TARGET
+ 7:0:TYPE
+ 39:MAP
+ 2 attributes:
+ 0:0:CLEAR
+ 1:1:NAME
+ 40:MATH
+ 2 attributes:
+ 0:0:BOX
+ 1:0:CLEAR
+ 41:META
+ 5 attributes:
+ 0:0:CHARSET
+ 1:0:CONTENT
+ 2:0:HTTP-EQUIV
+ 3:0:NAME
+ 4:0:SCHEME
+ 42:NEXTID
+ 1 attributes:
+ 0:0:N
+ 43:NOTE
+ 4 attributes:
+ 0:0:CLEAR
+ 1:0:MD
+ 2:8:ROLE
+ 3:2:SRC
+ 44:OBJECT
+ 19 attributes:
+ 0:0:ARCHIVE
+ 1:0:BORDER
+ 2:2:CLASSID
+ 3:2:CODEBASE
+ 4:0:CODETYPE
+ 5:2:DATA
+ 6:0:DECLARE
+ 7:0:HEIGHT
+ 8:0:HSPACE
+ 9:0:ISMAP
+ 10:0:NAME
+ 11:0:NOTAB
+ 12:0:SHAPES
+ 13:0:STANDBY
+ 14:0:TABINDEX
+ 15:0:TYPE
+ 16:2:USEMAP
+ 17:0:VSPACE
+ 18:0:WIDTH
+ 45:OL
+ 6 attributes:
+ 0:0:CLEAR
+ 1:0:COMPACT
+ 2:0:CONTINUE
+ 3:0:SEQNUM
+ 4:0:START
+ 5:0:TYPE
+ 46:OPTION
+ 7 attributes:
+ 0:0:CLEAR
+ 1:0:DISABLED
+ 2:0:ERROR
+ 3:0:LABEL
+ 4:0:SELECTED
+ 5:0:SHAPE
+ 6:0:VALUE
+ 47:OVERLAY
+ 8 attributes:
+ 0:0:HEIGHT
+ 1:0:IMAGEMAP
+ 2:0:MD
+ 3:2:SRC
+ 4:0:UNITS
+ 5:0:WIDTH
+ 6:0:X
+ 7:0:Y
+ 48:P
+ 2 attributes:
+ 0:0:CLEAR
+ 1:0:NOWRAP
+ 49:PARAM
+ 12 attributes:
+ 0:0:ACCEPT
+ 1:0:ACCEPT-CHARSET
+ 2:0:ACCEPT-ENCODING
+ 3:0:CLEAR
+ 4:0:DATA
+ 5:0:NAME
+ 6:0:OBJECT
+ 7:0:REF
+ 8:0:TYPE
+ 9:0:VALUE
+ 10:0:VALUEREF
+ 11:0:VALUETYPE
+ 50:Q
+ 2 attributes:
+ 0:2:CITE
+ 1:0:CLEAR
+ 51:SCRIPT
+ 10 attributes:
+ 0:0:CHARSET
+ 1:0:CLEAR
+ 2:0:DEFER
+ 3:0:EVENT
+ 4:0:FOR
+ 5:0:LANGUAGE
+ 6:0:NAME
+ 7:0:SCRIPTENGINE
+ 8:2:SRC
+ 9:0:TYPE
+ 52:SELECT
+ 15 attributes:
+ 0:0:CLEAR
+ 1:0:DISABLED
+ 2:0:ERROR
+ 3:0:HEIGHT
+ 4:0:MD
+ 5:0:MULTIPLE
+ 6:0:NAME
+ 7:0:NOTAB
+ 8:0:ONBLUR
+ 9:0:ONCHANGE
+ 10:0:ONFOCUS
+ 11:0:SIZE
+ 12:0:TABINDEX
+ 13:0:UNITS
+ 14:0:WIDTH
+ 53:STYLE
+ 3 attributes:
+ 0:0:MEDIA
+ 1:0:NOTATION
+ 2:0:TYPE
+ 54:TAB
+ 4 attributes:
+ 0:0:CLEAR
+ 1:0:DP
+ 2:0:INDENT
+ 3:0:TO
+ 55:TABLE
+ 15 attributes:
+ 0:2:BACKGROUND
+ 1:0:BORDER
+ 2:0:CELLPADDING
+ 3:0:CELLSPACING
+ 4:0:CLEAR
+ 5:0:COLS
+ 6:0:COLSPEC
+ 7:0:DP
+ 8:0:FRAME
+ 9:0:NOFLOW
+ 10:0:NOWRAP
+ 11:0:RULES
+ 12:0:SUMMARY
+ 13:0:UNITS
+ 14:0:WIDTH
+ 56:TD
+ 13 attributes:
+ 0:0:ABBR
+ 1:0:AXES
+ 2:0:AXIS
+ 3:2:BACKGROUND
+ 4:0:CLEAR
+ 5:0:COLSPAN
+ 6:0:DP
+ 7:0:HEADERS
+ 8:0:HEIGHT
+ 9:0:NOWRAP
+ 10:0:ROWSPAN
+ 11:0:SCOPE
+ 12:0:WIDTH
+ 57:TEXTAREA
+ 15 attributes:
+ 0:0:ACCEPT-CHARSET
+ 1:0:ACCESSKEY
+ 2:0:CLEAR
+ 3:0:COLS
+ 4:0:DISABLED
+ 5:0:ERROR
+ 6:0:NAME
+ 7:0:NOTAB
+ 8:0:ONBLUR
+ 9:0:ONCHANGE
+ 10:0:ONFOCUS
+ 11:0:ONSELECT
+ 12:0:READONLY
+ 13:0:ROWS
+ 14:0:TABINDEX
+ 58:TR
+ 3 attributes:
+ 0:0:CLEAR
+ 1:0:DP
+ 2:0:NOWRAP
+ 59:UL
+ 8 attributes:
+ 0:0:CLEAR
+ 1:0:COMPACT
+ 2:0:DINGBAT
+ 3:0:MD
+ 4:0:PLAIN
+ 5:2:SRC
+ 6:0:TYPE
+ 7:0:WRAP
+128 tags
+ 0:A
+ justify
+ 25 attributes:
+ 0:0:ACCESSKEY
+ 1:0:CHARSET
+ 2:4:CLASS
+ 3:0:CLEAR
+ 4:0:COORDS
+ 5:0:DIR
+ 6:2:HREF
+ 7:0:HREFLANG
+ 8:1:ID
+ 9:0:ISMAP
+ 10:0:LANG
+ 11:0:MD
+ 12:1:NAME
+ 13:0:NOTAB
+ 14:0:ONBLUR
+ 15:0:ONFOCUS
+ 16:0:REL
+ 17:0:REV
+ 18:0:SHAPE
+ 19:0:STYLE
+ 20:0:TABINDEX
+ 21:0:TARGET
+ 22:0:TITLE
+ 23:0:TYPE
+ 24:0:URN
+ 4 attr_types
+ core
+ events
+ i18n
+ A
+ contents: SGML_MIXED
+ tagclass: Alike
+ contains: FONTlike EMlike MATHlike BRlike APPLETlike MAPlike
+ icontains: FONTlike EMlike MATHlike formula Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike
+ contained: FONTlike EMlike MATHlike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike outer BODYlike
+ icontained: FONTlike EMlike MATHlike TRlike FORMlike Plike DIVlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff
+ canclose: FONTlike EMlike MATHlike Alike SELECTlike APPLETlike HRlike same
+ flags: mafse nreie
+ 1:ABBR
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: EMlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike BODYlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: FONTlike EMlike
+ flags:
+ 2:ACRONYM
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: EMlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike BODYlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: FONTlike EMlike
+ flags:
+ 3:ADDRESS
+ justify
+ 8 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:NOWRAP
+ 6:0:STYLE
+ 7:0:TITLE
+ 3 attr_types
+ core
+ i18n
+ ADDRESS
+ contents: SGML_MIXED
+ tagclass: DIVlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike Plike BRlike APPLETlike HRlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FORMlike DIVlike LIlike APPLETlike HRlike outer BODYlike DELlike
+ icontained: FONTlike EMlike MATHlike Alike TRlike FORMlike Plike DIVlike LIlike ULlike APPLETlike HRlike outer BODYlike same DELlike
+ canclose: FONTlike EMlike MATHlike formula Plike DIVlike same
+ flags:
+ 4:APPLET
+ justify
+ 17 attributes:
+ 0:0:ALIGN
+ 1:0:ALT
+ 2:4:CLASS
+ 3:0:CLEAR
+ 4:0:CODE
+ 5:2:CODEBASE
+ 6:0:DIR
+ 7:0:DOWNLOAD
+ 8:0:HEIGHT
+ 9:0:HSPACE
+ 10:1:ID
+ 11:0:LANG
+ 12:1:NAME
+ 13:0:STYLE
+ 14:0:TITLE
+ 15:0:VSPACE
+ 16:0:WIDTH
+ 4 attr_types
+ align
+ core
+ i18n
+ APPLET
+ contents: SGML_MIXED
+ tagclass: APPLETlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike FORMlike BRlike APPLETlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike formula FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same
+ canclose: FONTlike EMlike MATHlike Alike BRlike APPLETlike same
+ flags:
+ 5:AREA
+ justify
+ 18 attributes:
+ 0:0:ACCESSKEY
+ 1:0:ALT
+ 2:4:CLASS
+ 3:0:CLEAR
+ 4:0:COORDS
+ 5:0:DIR
+ 6:2:HREF
+ 7:1:ID
+ 8:0:LANG
+ 9:0:NOHREF
+ 10:0:NOTAB
+ 11:0:ONBLUR
+ 12:0:ONFOCUS
+ 13:0:SHAPE
+ 14:0:STYLE
+ 15:0:TABINDEX
+ 16:0:TARGET
+ 17:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ AREA
+ contents: SGML_EMPTY
+ tagclass: MAPlike
+ contains:
+ icontains:
+ contained: MAPlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike outer BODYlike
+ canclose: FONTlike EMlike MATHlike Alike formula Plike DIVlike LIlike ULlike
+ flags: endO
+ 6:ARTICLE
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:DIR
+ 2:1:ID
+ 3:0:LANG
+ 4:0:ROLE
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN5
+ contents: SGML_MIXED
+ tagclass: DIVlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike FORMlike Plike DIVlike ULlike BRlike APPLETlike HRlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: TRlike FORMlike DIVlike LIlike APPLETlike HRlike outer BODYlike same DELlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same DELlike
+ canclose: FONTlike EMlike MATHlike Alike formula Plike DIVlike same
+ flags: mafse
+ 7:ASIDE
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:DIR
+ 2:1:ID
+ 3:0:LANG
+ 4:0:ROLE
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN5
+ contents: SGML_MIXED
+ tagclass: DIVlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike FORMlike Plike DIVlike ULlike BRlike APPLETlike HRlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: TRlike FORMlike DIVlike LIlike APPLETlike HRlike outer BODYlike same DELlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same DELlike
+ canclose: FONTlike EMlike MATHlike Alike formula Plike DIVlike same
+ flags: mafse
+ 8:AU
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: EMlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike BODYlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: FONTlike EMlike
+ flags:
+ 9:AUTHOR
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: EMlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike BODYlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: FONTlike EMlike
+ flags:
+ 10:B
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: FONTlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike BODYlike same
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike BODYlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: FONTlike
+ flags: mafse nreie
+ 11:BANNER
+ nojustify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: DIVlike
+ contains: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike ULlike BRlike APPLETlike HRlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike
+ contained: outer BODYlike DELlike
+ icontained: outer BODYlike DELlike
+ canclose: FONTlike EMlike MATHlike Alike formula Plike DIVlike same
+ flags:
+ 12:BASE
+ justify
+ 6 attributes:
+ 0:4:CLASS
+ 1:2:HREF
+ 2:1:ID
+ 3:0:STYLE
+ 4:0:TARGET
+ 5:0:TITLE
+ 2 attr_types
+ core
+ BASE
+ contents: SGML_EMPTY
+ tagclass: HEADstuff
+ contains:
+ icontains:
+ contained: outer HEADstuff
+ icontained: outer HEADstuff
+ canclose: FONTlike EMlike MATHlike Alike same
+ flags: endO
+ 13:BASEFONT
+ justify
+ 11 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:COLOR
+ 3:0:DIR
+ 4:0:END
+ 5:0:FACE
+ 6:1:ID
+ 7:0:LANG
+ 8:0:SIZE
+ 9:0:STYLE
+ 10:0:TITLE
+ 3 attr_types
+ core
+ i18n
+ FONT
+ contents: SGML_EMPTY
+ tagclass: BRlike
+ contains:
+ icontains:
+ contained: FONTlike EMlike MATHlike Alike TRlike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike outer BODYlike
+ icontained: FONTlike EMlike MATHlike Alike TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike
+ canclose: BRlike APPLETlike HRlike MAPlike same
+ flags: endO
+ 14:BDO
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: Plike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FORMlike DIVlike LIlike APPLETlike HRlike outer BODYlike DELlike
+ icontained: FONTlike EMlike MATHlike Alike TRlike FORMlike Plike DIVlike LIlike ULlike APPLETlike HRlike outer BODYlike same DELlike
+ canclose: FONTlike EMlike MATHlike Alike formula TRlike Plike DIVlike
+ flags:
+ 15:BGSOUND
+ justify
+ 9 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:LOOP
+ 6:2:SRC
+ 7:0:STYLE
+ 8:0:TITLE
+ 3 attr_types
+ core
+ i18n
+ BGSOUND
+ contents: SGML_EMPTY
+ tagclass: BRlike
+ contains:
+ icontains:
+ contained: FONTlike EMlike MATHlike Alike TRlike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike outer BODYlike HEADstuff
+ icontained: FONTlike EMlike MATHlike Alike TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff
+ canclose: FONTlike EMlike MATHlike Alike Plike DIVlike BRlike APPLETlike HRlike same
+ flags: endO
+ 16:BIG
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: FONTlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike BODYlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: FONTlike
+ flags: mafse nreie
+ 17:BLINK
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: FONTlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike BODYlike same
+ icontained: FONTlike EMlike MATHlike Alike TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: FONTlike
+ flags: mafse nreie
+ 18:BLOCKQUOTE
+ justify
+ 9 attributes:
+ 0:2:CITE
+ 1:4:CLASS
+ 2:0:CLEAR
+ 3:0:DIR
+ 4:1:ID
+ 5:0:LANG
+ 6:0:NOWRAP
+ 7:0:STYLE
+ 8:0:TITLE
+ 3 attr_types
+ core
+ i18n
+ BQ
+ contents: SGML_MIXED
+ tagclass: DIVlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike FORMlike Plike DIVlike ULlike BRlike APPLETlike HRlike MAPlike BODYlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike BODYlike same
+ contained: FORMlike DIVlike LIlike APPLETlike HRlike outer BODYlike same DELlike
+ icontained: FONTlike EMlike MATHlike Alike TRlike FORMlike Plike DIVlike LIlike ULlike APPLETlike HRlike outer BODYlike same DELlike
+ canclose: FONTlike EMlike MATHlike Alike formula Plike DIVlike same
+ flags:
+ 19:BODY
+ justify
+ 15 attributes:
+ 0:0:ALINK
+ 1:2:BACKGROUND
+ 2:0:BGCOLOR
+ 3:4:CLASS
+ 4:0:CLEAR
+ 5:0:DIR
+ 6:1:ID
+ 7:0:LANG
+ 8:0:LINK
+ 9:0:ONLOAD
+ 10:0:ONUNLOAD
+ 11:0:STYLE
+ 12:0:TEXT
+ 13:0:TITLE
+ 14:0:VLINK
+ 4 attr_types
+ bgcolor
+ core
+ i18n
+ BODY
+ contents: SGML_MIXED
+ tagclass: BODYlike
+ contains: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike ULlike BRlike APPLETlike HRlike MAPlike BODYlike DELlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike BODYlike DELlike
+ contained: outer BODYlike
+ icontained: outer BODYlike
+ canclose: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike outer HEADstuff same
+ flags: endO startO
+ 20:BODYTEXT
+ justify
+ 14 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DATA
+ 3:0:DIR
+ 4:1:ID
+ 5:0:LANG
+ 6:0:NAME
+ 7:0:OBJECT
+ 8:0:REF
+ 9:0:STYLE
+ 10:0:TITLE
+ 11:0:TYPE
+ 12:0:VALUE
+ 13:0:VALUETYPE
+ 3 attr_types
+ core
+ i18n
+ BODYTEXT
+ contents: SGML_MIXED
+ tagclass: BODYlike
+ contains: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike ULlike BRlike APPLETlike HRlike MAPlike DELlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike BODYlike same DELlike
+ contained: DIVlike outer BODYlike
+ icontained: FONTlike EMlike MATHlike Alike TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same
+ canclose: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike Plike BRlike APPLETlike HRlike MAPlike same
+ flags: endO startO
+ 21:BQ
+ justify
+ 9 attributes:
+ 0:2:CITE
+ 1:4:CLASS
+ 2:0:CLEAR
+ 3:0:DIR
+ 4:1:ID
+ 5:0:LANG
+ 6:0:NOWRAP
+ 7:0:STYLE
+ 8:0:TITLE
+ 3 attr_types
+ core
+ i18n
+ BQ
+ contents: SGML_MIXED
+ tagclass: DIVlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike FORMlike Plike DIVlike ULlike BRlike APPLETlike HRlike MAPlike BODYlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike BODYlike same
+ contained: FORMlike DIVlike LIlike APPLETlike HRlike outer BODYlike same DELlike
+ icontained: FONTlike EMlike MATHlike Alike TRlike FORMlike Plike DIVlike LIlike ULlike APPLETlike HRlike outer BODYlike same DELlike
+ canclose: FONTlike EMlike MATHlike Alike formula Plike DIVlike same
+ flags:
+ 22:BR
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_EMPTY
+ tagclass: BRlike
+ contains:
+ icontains:
+ contained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike outer BODYlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff
+ canclose: FONTlike EMlike MATHlike Alike formula BRlike same
+ flags: endO
+ 23:BUTTON
+ justify
+ 17 attributes:
+ 0:0:ACCESSKEY
+ 1:4:CLASS
+ 2:0:CLEAR
+ 3:0:DIR
+ 4:0:DISABLED
+ 5:0:FORMACTION
+ 6:1:ID
+ 7:0:LANG
+ 8:0:NAME
+ 9:0:ONBLUR
+ 10:0:ONFOCUS
+ 11:0:READONLY
+ 12:0:STYLE
+ 13:0:TABINDEX
+ 14:0:TITLE
+ 15:0:TYPE
+ 16:0:VALUE
+ 4 attr_types
+ core
+ events
+ i18n
+ BUTTON
+ contents: SGML_MIXED
+ tagclass: APPLETlike
+ contains: FONTlike EMlike MATHlike Plike DIVlike ULlike BRlike APPLETlike MAPlike
+ icontains: FONTlike EMlike MATHlike formula TRlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike
+ canclose: FONTlike EMlike MATHlike Alike formula SELECTlike Plike BRlike same
+ flags:
+ 24:CAPTION
+ justify
+ 9 attributes:
+ 0:0:ACCESSKEY
+ 1:0:ALIGN
+ 2:4:CLASS
+ 3:0:CLEAR
+ 4:0:DIR
+ 5:1:ID
+ 6:0:LANG
+ 7:0:STYLE
+ 8:0:TITLE
+ 5 attr_types
+ align
+ core
+ events
+ i18n
+ CAPTION
+ contents: SGML_MIXED
+ tagclass: Plike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: DIVlike ULlike APPLETlike HRlike DELlike
+ icontained: FONTlike EMlike MATHlike TRlike FORMlike Plike DIVlike LIlike ULlike APPLETlike HRlike outer BODYlike same DELlike
+ canclose: FONTlike EMlike MATHlike Alike formula SELECTlike Plike DIVlike same
+ flags:
+ 25:CENTER
+ justify
+ 8 attributes:
+ 0:0:ALIGN
+ 1:4:CLASS
+ 2:0:CLEAR
+ 3:0:DIR
+ 4:1:ID
+ 5:0:LANG
+ 6:0:STYLE
+ 7:0:TITLE
+ 4 attr_types
+ align
+ core
+ i18n
+ DIV
+ contents: SGML_MIXED
+ tagclass: DIVlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike FORMlike Plike DIVlike ULlike BRlike APPLETlike HRlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FORMlike DIVlike LIlike APPLETlike HRlike outer BODYlike same DELlike
+ icontained: FONTlike EMlike MATHlike TRlike FORMlike Plike DIVlike LIlike ULlike APPLETlike HRlike outer BODYlike same DELlike
+ canclose: FONTlike EMlike MATHlike Alike formula Plike DIVlike LIlike same
+ flags:
+ 26:CITE
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: EMlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike BODYlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: EMlike
+ flags: nreie
+ 27:CODE
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: EMlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike BODYlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: EMlike
+ flags:
+ 28:COL
+ justify
+ 13 attributes:
+ 0:0:ALIGN
+ 1:0:CHAR
+ 2:0:CHAROFF
+ 3:4:CLASS
+ 4:0:CLEAR
+ 5:0:DIR
+ 6:1:ID
+ 7:0:LANG
+ 8:0:SPAN
+ 9:0:STYLE
+ 10:0:TITLE
+ 11:0:VALIGN
+ 12:0:WIDTH
+ 5 attr_types
+ cellalign
+ core
+ events
+ i18n
+ COL
+ contents: SGML_EMPTY
+ tagclass: HRlike
+ contains:
+ icontains:
+ contained: TRlike ULlike
+ icontained: FONTlike EMlike MATHlike TRlike FORMlike Plike DIVlike LIlike ULlike APPLETlike HRlike outer BODYlike
+ canclose: FONTlike EMlike MATHlike Alike formula SELECTlike Plike DIVlike LIlike ULlike MAPlike same
+ flags: endO
+ 29:COLGROUP
+ justify
+ 13 attributes:
+ 0:0:ALIGN
+ 1:0:CHAR
+ 2:0:CHAROFF
+ 3:4:CLASS
+ 4:0:CLEAR
+ 5:0:DIR
+ 6:1:ID
+ 7:0:LANG
+ 8:0:SPAN
+ 9:0:STYLE
+ 10:0:TITLE
+ 11:0:VALIGN
+ 12:0:WIDTH
+ 5 attr_types
+ cellalign
+ core
+ events
+ i18n
+ COL
+ contents: SGML_ELEMENT
+ tagclass: TRlike
+ contains: HRlike
+ icontains: HRlike
+ contained: ULlike
+ icontained: FONTlike EMlike MATHlike TRlike FORMlike Plike DIVlike LIlike ULlike APPLETlike HRlike outer BODYlike
+ canclose: FONTlike EMlike MATHlike Alike formula SELECTlike Plike DIVlike LIlike MAPlike same
+ flags: endO
+ 30:COMMENT
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_PCDATA
+ tagclass: MATHlike
+ contains:
+ icontains:
+ contained: FONTlike EMlike MATHlike Alike TRlike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike BODYlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike outer BODYlike HEADstuff
+ canclose: FONTlike EMlike
+ flags:
+ 31:CREDIT
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: Plike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: DIVlike ULlike APPLETlike HRlike DELlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same DELlike
+ canclose: FONTlike EMlike MATHlike Alike Plike DIVlike same
+ flags:
+ 32:DD
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: LIlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike FORMlike Plike DIVlike ULlike BRlike APPLETlike HRlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: ULlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike APPLETlike HRlike outer BODYlike same
+ canclose: FONTlike EMlike MATHlike Alike formula Plike DIVlike LIlike same
+ flags: endO
+ 33:DEL
+ justify
+ 8 attributes:
+ 0:0:CITE
+ 1:4:CLASS
+ 2:0:DATETIME
+ 3:0:DIR
+ 4:1:ID
+ 5:0:LANG
+ 6:0:STYLE
+ 7:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ DEL
+ contents: SGML_MIXED
+ tagclass: EMlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: FONTlike EMlike DELlike
+ flags:
+ 34:DEL!
+ justify
+ 8 attributes:
+ 0:0:CITE
+ 1:4:CLASS
+ 2:0:DATETIME
+ 3:0:DIR
+ 4:1:ID
+ 5:0:LANG
+ 6:0:STYLE
+ 7:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ DEL
+ contents: SGML_MIXED
+ tagclass: DELlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike FORMlike Plike DIVlike ULlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike BODYlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: FONTlike EMlike DELlike
+ flags:
+ 35:DFN
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: EMlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike FORMlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: FONTlike EMlike
+ flags:
+ 36:DIR
+ justify
+ 14 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:COMPACT
+ 3:0:DINGBAT
+ 4:0:DIR
+ 5:1:ID
+ 6:0:LANG
+ 7:0:MD
+ 8:0:PLAIN
+ 9:2:SRC
+ 10:0:STYLE
+ 11:0:TITLE
+ 12:0:TYPE
+ 13:0:WRAP
+ 3 attr_types
+ core
+ i18n
+ UL
+ contents: SGML_MIXED
+ tagclass: ULlike
+ contains: LIlike BRlike APPLETlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula SELECTlike Plike DIVlike LIlike BRlike APPLETlike HRlike MAPlike
+ contained: FORMlike DIVlike LIlike BRlike APPLETlike HRlike outer BODYlike DELlike
+ icontained: FONTlike EMlike MATHlike formula TRlike FORMlike Plike DIVlike LIlike ULlike APPLETlike HRlike outer BODYlike DELlike
+ canclose: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike Plike DIVlike LIlike ULlike HRlike same
+ flags:
+ 37:DIV
+ justify
+ 8 attributes:
+ 0:0:ALIGN
+ 1:4:CLASS
+ 2:0:CLEAR
+ 3:0:DIR
+ 4:1:ID
+ 5:0:LANG
+ 6:0:STYLE
+ 7:0:TITLE
+ 4 attr_types
+ align
+ core
+ i18n
+ DIV
+ contents: SGML_MIXED
+ tagclass: DIVlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike FORMlike Plike DIVlike ULlike BRlike APPLETlike HRlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: TRlike FORMlike DIVlike LIlike APPLETlike HRlike outer BODYlike same DELlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same DELlike
+ canclose: FONTlike EMlike MATHlike formula Plike DIVlike same
+ flags: mafse
+ 38:DL
+ justify
+ 8 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:COMPACT
+ 3:0:DIR
+ 4:1:ID
+ 5:0:LANG
+ 6:0:STYLE
+ 7:0:TITLE
+ 3 attr_types
+ core
+ i18n
+ DL
+ contents: SGML_MIXED
+ tagclass: ULlike
+ contains: FORMlike LIlike HRlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FORMlike DIVlike LIlike APPLETlike HRlike outer BODYlike DELlike
+ icontained: FONTlike EMlike MATHlike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same DELlike
+ canclose: FONTlike EMlike MATHlike formula SELECTlike Plike DIVlike LIlike
+ flags:
+ 39:DLC
+ justify
+ 8 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:COMPACT
+ 3:0:DIR
+ 4:1:ID
+ 5:0:LANG
+ 6:0:STYLE
+ 7:0:TITLE
+ 3 attr_types
+ core
+ i18n
+ DL
+ contents: SGML_MIXED
+ tagclass: ULlike
+ contains: FORMlike LIlike HRlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FORMlike DIVlike LIlike APPLETlike HRlike outer BODYlike DELlike
+ icontained: FONTlike EMlike MATHlike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same DELlike
+ canclose: FONTlike EMlike MATHlike Alike formula SELECTlike Plike DIVlike LIlike
+ flags:
+ 40:DT
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: LIlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike BRlike APPLETlike MAPlike
+ contained: ULlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer
+ canclose: FONTlike EMlike MATHlike Alike formula Plike DIVlike LIlike same
+ flags: endO
+ 41:EM
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: EMlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike BODYlike same
+ icontained: FONTlike EMlike MATHlike Alike TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: FONTlike EMlike
+ flags: nreie
+ 42:EMBED
+ justify
+ 21 attributes:
+ 0:0:ALIGN
+ 1:0:ALT
+ 2:0:BORDER
+ 3:4:CLASS
+ 4:0:CLEAR
+ 5:0:DIR
+ 6:0:HEIGHT
+ 7:1:ID
+ 8:0:IMAGEMAP
+ 9:0:ISMAP
+ 10:0:LANG
+ 11:0:MD
+ 12:1:NAME
+ 13:0:NOFLOW
+ 14:0:PARAMS
+ 15:2:SRC
+ 16:0:STYLE
+ 17:0:TITLE
+ 18:0:UNITS
+ 19:0:USEMAP
+ 20:0:WIDTH
+ 4 attr_types
+ align
+ core
+ i18n
+ EMBED
+ contents: SGML_EMPTY
+ tagclass: APPLETlike
+ contains: FONTlike EMlike MATHlike Plike BRlike APPLETlike HRlike MAPlike same
+ icontains: FONTlike EMlike MATHlike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike APPLETlike HRlike outer BODYlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same
+ canclose: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike outer
+ flags: endO
+ 43:FIELDSET
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: DIVlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike Plike DIVlike ULlike BRlike APPLETlike HRlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike FORMlike Plike DIVlike LIlike APPLETlike HRlike same DELlike
+ icontained: FONTlike EMlike MATHlike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same DELlike
+ canclose: FONTlike EMlike MATHlike Alike formula SELECTlike MAPlike same
+ flags:
+ 44:FIG
+ justify
+ 17 attributes:
+ 0:0:ALIGN
+ 1:0:BORDER
+ 2:4:CLASS
+ 3:0:CLEAR
+ 4:0:DIR
+ 5:0:HEIGHT
+ 6:1:ID
+ 7:0:IMAGEMAP
+ 8:0:ISOBJECT
+ 9:0:LANG
+ 10:0:MD
+ 11:0:NOFLOW
+ 12:2:SRC
+ 13:0:STYLE
+ 14:0:TITLE
+ 15:0:UNITS
+ 16:0:WIDTH
+ 4 attr_types
+ align
+ core
+ i18n
+ FIG
+ contents: SGML_MIXED
+ tagclass: DIVlike
+ contains: Plike DIVlike ULlike BRlike APPLETlike HRlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FORMlike DIVlike LIlike APPLETlike HRlike outer BODYlike DELlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike APPLETlike HRlike outer BODYlike same DELlike
+ canclose: FONTlike EMlike MATHlike Alike SELECTlike Plike DIVlike MAPlike same
+ flags:
+ 45:FIGURE
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:DIR
+ 2:1:ID
+ 3:0:LANG
+ 4:0:ROLE
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN5
+ contents: SGML_MIXED
+ tagclass: DIVlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike FORMlike Plike DIVlike ULlike BRlike APPLETlike HRlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: TRlike FORMlike DIVlike LIlike APPLETlike HRlike outer BODYlike same DELlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same DELlike
+ canclose: FONTlike EMlike MATHlike Alike formula Plike DIVlike same
+ flags: mafse
+ 46:FN
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: DIVlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike FORMlike Plike DIVlike ULlike BRlike APPLETlike HRlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FORMlike DIVlike LIlike APPLETlike HRlike outer BODYlike same DELlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same DELlike
+ canclose: FONTlike EMlike MATHlike Alike SELECTlike Plike BRlike same
+ flags:
+ 47:FONT
+ justify
+ 11 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:COLOR
+ 3:0:DIR
+ 4:0:END
+ 5:0:FACE
+ 6:1:ID
+ 7:0:LANG
+ 8:0:SIZE
+ 9:0:STYLE
+ 10:0:TITLE
+ 3 attr_types
+ core
+ i18n
+ FONT
+ contents: SGML_MIXED
+ tagclass: FONTlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike outer BODYlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: FONTlike
+ flags: mafse nreie
+ 48:FOOTER
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:DIR
+ 2:1:ID
+ 3:0:LANG
+ 4:0:ROLE
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN5
+ contents: SGML_MIXED
+ tagclass: DIVlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike FORMlike Plike DIVlike ULlike BRlike APPLETlike HRlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: TRlike FORMlike DIVlike LIlike APPLETlike HRlike outer BODYlike same DELlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same DELlike
+ canclose: FONTlike EMlike MATHlike Alike formula Plike DIVlike same
+ flags: mafse
+ 49:FORM
+ justify
+ 17 attributes:
+ 0:0:ACCEPT
+ 1:0:ACCEPT-CHARSET
+ 2:2:ACTION
+ 3:4:CLASS
+ 4:0:CLEAR
+ 5:0:DIR
+ 6:0:ENCTYPE
+ 7:1:ID
+ 8:0:LANG
+ 9:0:METHOD
+ 10:0:ONRESET
+ 11:0:ONSUBMIT
+ 12:0:SCRIPT
+ 13:0:STYLE
+ 14:0:SUBJECT
+ 15:0:TARGET
+ 16:0:TITLE
+ 3 attr_types
+ core
+ i18n
+ FORM
+ contents: SGML_MIXED
+ tagclass: FORMlike
+ contains: FONTlike EMlike MATHlike Alike TRlike SELECTlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike
+ contained: FONTlike EMlike MATHlike DIVlike LIlike ULlike APPLETlike HRlike outer BODYlike DELlike
+ icontained: FONTlike EMlike MATHlike Plike DIVlike LIlike ULlike APPLETlike outer BODYlike DELlike
+ canclose: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike LIlike ULlike MAPlike same
+ flags:
+ 50:FRAME
+ justify
+ 12 attributes:
+ 0:4:CLASS
+ 1:0:FRAMEBORDER
+ 2:1:ID
+ 3:2:LONGDESC
+ 4:0:MARGINHEIGHT
+ 5:0:MARGINWIDTH
+ 6:0:NAME
+ 7:0:NORESIZE
+ 8:0:SCROLLING
+ 9:2:SRC
+ 10:0:STYLE
+ 11:0:TITLE
+ 2 attr_types
+ core
+ FRAME
+ contents: SGML_EMPTY
+ tagclass: outer
+ contains:
+ icontains:
+ contained: outer
+ icontained: outer
+ canclose: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike outer same
+ flags: endO
+ 51:FRAMESET
+ justify
+ 4 attributes:
+ 0:0:COLS
+ 1:0:ONLOAD
+ 2:0:ONUNLOAD
+ 3:0:ROWS
+ 1 attr_types
+ FRAMESET
+ contents: SGML_ELEMENT
+ tagclass: outer
+ contains: outer same
+ icontains: outer same
+ contained: outer same
+ icontained: BRlike APPLETlike outer same
+ canclose: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike outer same
+ flags:
+ 52:H1
+ nojustify
+ 14 attributes:
+ 0:0:ALIGN
+ 1:4:CLASS
+ 2:0:CLEAR
+ 3:0:DINGBAT
+ 4:0:DIR
+ 5:1:ID
+ 6:0:LANG
+ 7:0:MD
+ 8:0:NOWRAP
+ 9:0:SEQNUM
+ 10:0:SKIP
+ 11:2:SRC
+ 12:0:STYLE
+ 13:0:TITLE
+ 5 attr_types
+ align
+ core
+ events
+ i18n
+ H
+ contents: SGML_MIXED
+ tagclass: Plike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula SELECTlike BRlike APPLETlike MAPlike
+ contained: FORMlike DIVlike LIlike APPLETlike HRlike outer BODYlike DELlike
+ icontained: FONTlike EMlike MATHlike Alike TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike DELlike
+ canclose: FONTlike EMlike MATHlike formula Plike same
+ flags:
+ 53:H2
+ nojustify
+ 14 attributes:
+ 0:0:ALIGN
+ 1:4:CLASS
+ 2:0:CLEAR
+ 3:0:DINGBAT
+ 4:0:DIR
+ 5:1:ID
+ 6:0:LANG
+ 7:0:MD
+ 8:0:NOWRAP
+ 9:0:SEQNUM
+ 10:0:SKIP
+ 11:2:SRC
+ 12:0:STYLE
+ 13:0:TITLE
+ 5 attr_types
+ align
+ core
+ events
+ i18n
+ H
+ contents: SGML_MIXED
+ tagclass: Plike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula SELECTlike BRlike APPLETlike MAPlike
+ contained: FORMlike DIVlike LIlike APPLETlike HRlike outer BODYlike DELlike
+ icontained: FONTlike EMlike MATHlike Alike TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike DELlike
+ canclose: FONTlike EMlike MATHlike formula Plike same
+ flags:
+ 54:H3
+ nojustify
+ 14 attributes:
+ 0:0:ALIGN
+ 1:4:CLASS
+ 2:0:CLEAR
+ 3:0:DINGBAT
+ 4:0:DIR
+ 5:1:ID
+ 6:0:LANG
+ 7:0:MD
+ 8:0:NOWRAP
+ 9:0:SEQNUM
+ 10:0:SKIP
+ 11:2:SRC
+ 12:0:STYLE
+ 13:0:TITLE
+ 5 attr_types
+ align
+ core
+ events
+ i18n
+ H
+ contents: SGML_MIXED
+ tagclass: Plike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula SELECTlike BRlike APPLETlike MAPlike
+ contained: FORMlike DIVlike LIlike APPLETlike HRlike outer BODYlike DELlike
+ icontained: FONTlike EMlike MATHlike Alike TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike DELlike
+ canclose: FONTlike EMlike MATHlike formula Plike same
+ flags:
+ 55:H4
+ nojustify
+ 14 attributes:
+ 0:0:ALIGN
+ 1:4:CLASS
+ 2:0:CLEAR
+ 3:0:DINGBAT
+ 4:0:DIR
+ 5:1:ID
+ 6:0:LANG
+ 7:0:MD
+ 8:0:NOWRAP
+ 9:0:SEQNUM
+ 10:0:SKIP
+ 11:2:SRC
+ 12:0:STYLE
+ 13:0:TITLE
+ 5 attr_types
+ align
+ core
+ events
+ i18n
+ H
+ contents: SGML_MIXED
+ tagclass: Plike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula SELECTlike BRlike APPLETlike MAPlike
+ contained: FORMlike DIVlike LIlike APPLETlike HRlike outer BODYlike DELlike
+ icontained: FONTlike EMlike MATHlike Alike TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike DELlike
+ canclose: FONTlike EMlike MATHlike formula Plike same
+ flags:
+ 56:H5
+ nojustify
+ 14 attributes:
+ 0:0:ALIGN
+ 1:4:CLASS
+ 2:0:CLEAR
+ 3:0:DINGBAT
+ 4:0:DIR
+ 5:1:ID
+ 6:0:LANG
+ 7:0:MD
+ 8:0:NOWRAP
+ 9:0:SEQNUM
+ 10:0:SKIP
+ 11:2:SRC
+ 12:0:STYLE
+ 13:0:TITLE
+ 5 attr_types
+ align
+ core
+ events
+ i18n
+ H
+ contents: SGML_MIXED
+ tagclass: Plike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula SELECTlike BRlike APPLETlike MAPlike
+ contained: FORMlike DIVlike LIlike APPLETlike HRlike outer BODYlike DELlike
+ icontained: FONTlike EMlike MATHlike Alike TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike DELlike
+ canclose: FONTlike EMlike MATHlike formula Plike same
+ flags:
+ 57:H6
+ nojustify
+ 14 attributes:
+ 0:0:ALIGN
+ 1:4:CLASS
+ 2:0:CLEAR
+ 3:0:DINGBAT
+ 4:0:DIR
+ 5:1:ID
+ 6:0:LANG
+ 7:0:MD
+ 8:0:NOWRAP
+ 9:0:SEQNUM
+ 10:0:SKIP
+ 11:2:SRC
+ 12:0:STYLE
+ 13:0:TITLE
+ 5 attr_types
+ align
+ core
+ events
+ i18n
+ H
+ contents: SGML_MIXED
+ tagclass: Plike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula SELECTlike BRlike APPLETlike MAPlike
+ contained: FORMlike DIVlike LIlike APPLETlike HRlike outer BODYlike DELlike
+ icontained: FONTlike EMlike MATHlike Alike TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike DELlike
+ canclose: FONTlike EMlike MATHlike formula Plike same
+ flags:
+ 58:HEAD
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_ELEMENT
+ tagclass: HEADstuff
+ contains: BRlike APPLETlike HRlike MAPlike HEADstuff
+ icontains: BRlike APPLETlike HRlike HEADstuff
+ contained: outer
+ icontained: outer
+ canclose: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike outer same
+ flags: endO startO mafse
+ 59:HEADER
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:DIR
+ 2:1:ID
+ 3:0:LANG
+ 4:0:ROLE
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN5
+ contents: SGML_MIXED
+ tagclass: DIVlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike FORMlike Plike DIVlike ULlike BRlike APPLETlike HRlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: TRlike FORMlike DIVlike LIlike APPLETlike HRlike outer BODYlike same DELlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same DELlike
+ canclose: FONTlike EMlike MATHlike Alike formula Plike DIVlike same
+ flags: mafse
+ 60:HR
+ justify
+ 13 attributes:
+ 0:0:ALIGN
+ 1:4:CLASS
+ 2:0:CLEAR
+ 3:0:DIR
+ 4:1:ID
+ 5:0:LANG
+ 6:0:MD
+ 7:0:NOSHADE
+ 8:0:SIZE
+ 9:2:SRC
+ 10:0:STYLE
+ 11:0:TITLE
+ 12:0:WIDTH
+ 4 attr_types
+ align
+ core
+ i18n
+ HR
+ contents: SGML_EMPTY
+ tagclass: HRlike
+ contains:
+ icontains:
+ contained: FORMlike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike outer BODYlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike outer BODYlike
+ canclose: FONTlike EMlike MATHlike formula TRlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike same
+ flags: endO
+ 61:HTML
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: outer
+ contains: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike ULlike BRlike APPLETlike HRlike MAPlike outer BODYlike HEADstuff
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike outer BODYlike HEADstuff
+ contained:
+ icontained:
+ canclose: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike outer
+ flags: endO startO
+ 62:HY
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_EMPTY
+ tagclass: BRlike
+ contains:
+ icontains:
+ contained: FONTlike EMlike MATHlike Alike formula FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike outer BODYlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff
+ canclose: FONTlike EMlike MATHlike Alike formula BRlike same
+ flags: endO
+ 63:I
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: FONTlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike BODYlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: FONTlike
+ flags: mafse nreie
+ 64:IFRAME
+ justify
+ 14 attributes:
+ 0:0:ALIGN
+ 1:4:CLASS
+ 2:0:FRAMEBORDER
+ 3:0:HEIGHT
+ 4:1:ID
+ 5:2:LONGDESC
+ 6:0:MARGINHEIGHT
+ 7:0:MARGINWIDTH
+ 8:0:NAME
+ 9:0:SCROLLING
+ 10:2:SRC
+ 11:0:STYLE
+ 12:0:TITLE
+ 13:0:WIDTH
+ 3 attr_types
+ align
+ core
+ IFRAME
+ contents: SGML_MIXED
+ tagclass: APPLETlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike FORMlike Plike DIVlike ULlike BRlike APPLETlike HRlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike formula FORMlike Plike DIVlike LIlike APPLETlike HRlike outer BODYlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike APPLETlike HRlike outer BODYlike same
+ canclose: FONTlike EMlike MATHlike Alike formula SELECTlike Plike BRlike APPLETlike outer HEADstuff same
+ flags:
+ 65:IMG
+ justify
+ 22 attributes:
+ 0:0:ALIGN
+ 1:0:ALT
+ 2:0:BORDER
+ 3:4:CLASS
+ 4:0:CLEAR
+ 5:0:DIR
+ 6:0:HEIGHT
+ 7:0:HSPACE
+ 8:1:ID
+ 9:0:ISMAP
+ 10:0:ISOBJECT
+ 11:0:LANG
+ 12:2:LONGDESC
+ 13:0:MD
+ 14:0:NAME
+ 15:2:SRC
+ 16:0:STYLE
+ 17:0:TITLE
+ 18:0:UNITS
+ 19:2:USEMAP
+ 20:0:VSPACE
+ 21:0:WIDTH
+ 5 attr_types
+ align
+ core
+ events
+ i18n
+ IMG
+ contents: SGML_EMPTY
+ tagclass: BRlike
+ contains:
+ icontains:
+ contained: FONTlike EMlike MATHlike Alike formula FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike outer BODYlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike
+ canclose: same
+ flags: endO
+ 66:INPUT
+ justify
+ 35 attributes:
+ 0:0:ACCEPT
+ 1:0:ACCEPT-CHARSET
+ 2:0:ACCESSKEY
+ 3:0:ALIGN
+ 4:0:ALT
+ 5:0:CHECKED
+ 6:4:CLASS
+ 7:0:CLEAR
+ 8:0:DIR
+ 9:0:DISABLED
+ 10:0:ERROR
+ 11:0:HEIGHT
+ 12:1:ID
+ 13:0:ISMAP
+ 14:0:LANG
+ 15:0:MAX
+ 16:0:MAXLENGTH
+ 17:0:MD
+ 18:0:MIN
+ 19:0:NAME
+ 20:0:NOTAB
+ 21:0:ONBLUR
+ 22:0:ONCHANGE
+ 23:0:ONFOCUS
+ 24:0:ONSELECT
+ 25:0:READONLY
+ 26:0:SIZE
+ 27:2:SRC
+ 28:0:STYLE
+ 29:0:TABINDEX
+ 30:0:TITLE
+ 31:0:TYPE
+ 32:0:USEMAP
+ 33:0:VALUE
+ 34:0:WIDTH
+ 5 attr_types
+ align
+ core
+ events
+ i18n
+ INPUT
+ contents: SGML_EMPTY
+ tagclass: SELECTlike
+ contains:
+ icontains:
+ contained: FONTlike EMlike MATHlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike
+ icontained: FONTlike EMlike MATHlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike
+ canclose: FONTlike EMlike MATHlike Alike SELECTlike BRlike MAPlike same
+ flags: endO
+ 67:INS
+ justify
+ 8 attributes:
+ 0:0:CITE
+ 1:4:CLASS
+ 2:0:DATETIME
+ 3:0:DIR
+ 4:1:ID
+ 5:0:LANG
+ 6:0:STYLE
+ 7:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ DEL
+ contents: SGML_MIXED
+ tagclass: EMlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: FONTlike EMlike DELlike
+ flags:
+ 68:INS!
+ justify
+ 8 attributes:
+ 0:0:CITE
+ 1:4:CLASS
+ 2:0:DATETIME
+ 3:0:DIR
+ 4:1:ID
+ 5:0:LANG
+ 6:0:STYLE
+ 7:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ DEL
+ contents: SGML_MIXED
+ tagclass: DELlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike FORMlike Plike DIVlike ULlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike BODYlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: FONTlike EMlike DELlike
+ flags:
+ 69:ISINDEX
+ justify
+ 9 attributes:
+ 0:2:ACTION
+ 1:4:CLASS
+ 2:0:DIR
+ 3:2:HREF
+ 4:1:ID
+ 5:0:LANG
+ 6:0:PROMPT
+ 7:0:STYLE
+ 8:0:TITLE
+ 3 attr_types
+ core
+ i18n
+ ISINDEX
+ contents: SGML_EMPTY
+ tagclass: MAPlike
+ contains:
+ icontains:
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike outer BODYlike HEADstuff
+ icontained: FONTlike EMlike MATHlike Alike TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike outer BODYlike HEADstuff
+ canclose: FONTlike EMlike MATHlike same
+ flags: endO
+ 70:KBD
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: EMlike
+ contains:
+ icontains:
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike BODYlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff
+ canclose: FONTlike EMlike
+ flags:
+ 71:KEYGEN
+ justify
+ 8 attributes:
+ 0:0:CHALLENGE
+ 1:4:CLASS
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:NAME
+ 6:0:STYLE
+ 7:0:TITLE
+ 3 attr_types
+ core
+ i18n
+ KEYGEN
+ contents: SGML_EMPTY
+ tagclass: SELECTlike
+ contains:
+ icontains:
+ contained: FONTlike EMlike MATHlike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike
+ icontained: FONTlike EMlike MATHlike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike
+ canclose: formula TRlike SELECTlike same
+ flags: endO
+ 72:LABEL
+ justify
+ 11 attributes:
+ 0:0:ACCESSKEY
+ 1:4:CLASS
+ 2:0:CLEAR
+ 3:0:DIR
+ 4:0:FOR
+ 5:1:ID
+ 6:0:LANG
+ 7:0:ONBLUR
+ 8:0:ONFOCUS
+ 9:0:STYLE
+ 10:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ LABEL
+ contents: SGML_MIXED
+ tagclass: EMlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike
+ contained: FONTlike EMlike MATHlike Alike formula FORMlike Plike DIVlike LIlike APPLETlike HRlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike APPLETlike HRlike outer BODYlike
+ canclose: FONTlike EMlike MATHlike
+ flags:
+ 73:LEGEND
+ justify
+ 9 attributes:
+ 0:0:ACCESSKEY
+ 1:0:ALIGN
+ 2:4:CLASS
+ 3:0:CLEAR
+ 4:0:DIR
+ 5:1:ID
+ 6:0:LANG
+ 7:0:STYLE
+ 8:0:TITLE
+ 5 attr_types
+ align
+ core
+ events
+ i18n
+ CAPTION
+ contents: SGML_MIXED
+ tagclass: EMlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: DIVlike
+ icontained: FONTlike EMlike MATHlike TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same
+ canclose: FONTlike EMlike
+ flags:
+ 74:LH
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: LIlike
+ contains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike Plike DIVlike ULlike BRlike APPLETlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: ULlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer same
+ canclose: FONTlike EMlike MATHlike Alike formula Plike DIVlike LIlike same
+ flags: endO
+ 75:LI
+ justify
+ 13 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DINGBAT
+ 3:0:DIR
+ 4:1:ID
+ 5:0:LANG
+ 6:0:MD
+ 7:0:SKIP
+ 8:2:SRC
+ 9:0:STYLE
+ 10:0:TITLE
+ 11:0:TYPE
+ 12:0:VALUE
+ 4 attr_types
+ core
+ events
+ i18n
+ LI
+ contents: SGML_MIXED
+ tagclass: LIlike
+ contains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike ULlike BRlike APPLETlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: ULlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer same
+ canclose: FONTlike EMlike MATHlike Alike formula Plike DIVlike LIlike same
+ flags: endO
+ 76:LINK
+ justify
+ 14 attributes:
+ 0:0:CHARSET
+ 1:4:CLASS
+ 2:0:DIR
+ 3:2:HREF
+ 4:0:HREFLANG
+ 5:1:ID
+ 6:0:LANG
+ 7:0:MEDIA
+ 8:0:REL
+ 9:0:REV
+ 10:0:STYLE
+ 11:0:TARGET
+ 12:0:TITLE
+ 13:0:TYPE
+ 4 attr_types
+ core
+ events
+ i18n
+ LINK
+ contents: SGML_EMPTY
+ tagclass: MAPlike
+ contains:
+ icontains:
+ contained: outer HEADstuff
+ icontained: outer HEADstuff
+ canclose: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike
+ flags: endO
+ 77:LISTING
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_LITTERAL
+ tagclass: ULlike
+ contains:
+ icontains:
+ contained: DIVlike LIlike APPLETlike HRlike outer BODYlike DELlike
+ icontained: Plike DIVlike LIlike ULlike APPLETlike HRlike outer BODYlike DELlike
+ canclose: FONTlike EMlike MATHlike Alike formula Plike DIVlike LIlike ULlike same
+ flags:
+ 78:MAIN
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:DIR
+ 2:1:ID
+ 3:0:LANG
+ 4:0:ROLE
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN5
+ contents: SGML_MIXED
+ tagclass: DIVlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike FORMlike Plike DIVlike ULlike BRlike APPLETlike HRlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: TRlike FORMlike DIVlike LIlike APPLETlike HRlike outer BODYlike same DELlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same DELlike
+ canclose: FONTlike EMlike MATHlike Alike formula Plike DIVlike same
+ flags: mafse
+ 79:MAP
+ justify
+ 8 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:1:NAME
+ 6:0:STYLE
+ 7:0:TITLE
+ 3 attr_types
+ core
+ i18n
+ MAP
+ contents: SGML_ELEMENT
+ tagclass: MAPlike
+ contains: MAPlike
+ icontains: MAPlike
+ contained: FONTlike EMlike MATHlike Alike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike
+ canclose: FONTlike EMlike MATHlike Alike formula Plike LIlike
+ flags:
+ 80:MARQUEE
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: HRlike
+ contains: FONTlike EMlike MATHlike Alike
+ icontains: FONTlike EMlike MATHlike Alike formula BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike outer BODYlike
+ icontained: FONTlike EMlike MATHlike TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same
+ canclose: MATHlike Alike formula BRlike APPLETlike same
+ flags:
+ 81:MATH
+ justify
+ 8 attributes:
+ 0:0:BOX
+ 1:4:CLASS
+ 2:0:CLEAR
+ 3:0:DIR
+ 4:1:ID
+ 5:0:LANG
+ 6:0:STYLE
+ 7:0:TITLE
+ 3 attr_types
+ core
+ i18n
+ MATH
+ contents: SGML_PCDATA
+ tagclass: MATHlike
+ contains: FONTlike EMlike MATHlike Alike formula SELECTlike BRlike APPLETlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike BODYlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: FONTlike EMlike MATHlike Alike formula
+ flags:
+ 82:MENU
+ justify
+ 14 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:COMPACT
+ 3:0:DINGBAT
+ 4:0:DIR
+ 5:1:ID
+ 6:0:LANG
+ 7:0:MD
+ 8:0:PLAIN
+ 9:2:SRC
+ 10:0:STYLE
+ 11:0:TITLE
+ 12:0:TYPE
+ 13:0:WRAP
+ 3 attr_types
+ core
+ i18n
+ UL
+ contents: SGML_MIXED
+ tagclass: ULlike
+ contains: LIlike BRlike APPLETlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula SELECTlike Plike DIVlike LIlike BRlike APPLETlike HRlike MAPlike
+ contained: FORMlike DIVlike LIlike BRlike APPLETlike HRlike outer DELlike
+ icontained: FONTlike EMlike MATHlike formula TRlike FORMlike Plike DIVlike LIlike ULlike APPLETlike HRlike outer BODYlike DELlike
+ canclose: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike Plike DIVlike LIlike ULlike MAPlike same
+ flags:
+ 83:META
+ justify
+ 5 attributes:
+ 0:0:CHARSET
+ 1:0:CONTENT
+ 2:0:HTTP-EQUIV
+ 3:0:NAME
+ 4:0:SCHEME
+ 1 attr_types
+ META
+ contents: SGML_EMPTY
+ tagclass: MAPlike
+ contains:
+ icontains:
+ contained: outer HEADstuff
+ icontained: outer HEADstuff
+ canclose: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike
+ flags: endO
+ 84:NAV
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:DIR
+ 2:1:ID
+ 3:0:LANG
+ 4:0:ROLE
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN5
+ contents: SGML_MIXED
+ tagclass: DIVlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike FORMlike Plike DIVlike ULlike BRlike APPLETlike HRlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: TRlike FORMlike DIVlike LIlike APPLETlike HRlike outer BODYlike same DELlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same DELlike
+ canclose: FONTlike EMlike MATHlike Alike formula Plike DIVlike same
+ flags: mafse
+ 85:NEXTID
+ justify
+ 1 attributes:
+ 0:0:N
+ 1 attr_types
+ NEXTID
+ contents: SGML_EMPTY
+ tagclass: BRlike
+ contains:
+ icontains:
+ contained: outer HEADstuff
+ icontained: FONTlike EMlike MATHlike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike outer
+ canclose: FONTlike
+ flags: endO
+ 86:NOFRAMES
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: BODYlike
+ contains: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike ULlike BRlike APPLETlike HRlike MAPlike BODYlike DELlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike DELlike
+ contained: BRlike APPLETlike HRlike outer
+ icontained: BRlike APPLETlike HRlike outer
+ canclose: FONTlike EMlike MATHlike Alike formula SELECTlike Plike DIVlike LIlike ULlike HRlike MAPlike
+ flags:
+ 87:NOTE
+ justify
+ 10 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:MD
+ 6:8:ROLE
+ 7:2:SRC
+ 8:0:STYLE
+ 9:0:TITLE
+ 3 attr_types
+ core
+ i18n
+ NOTE
+ contents: SGML_MIXED
+ tagclass: DIVlike
+ contains: FONTlike EMlike MATHlike Alike TRlike FORMlike Plike DIVlike ULlike BRlike APPLETlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: formula TRlike FORMlike DIVlike LIlike BRlike APPLETlike HRlike outer BODYlike DELlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same DELlike
+ canclose: FONTlike EMlike MATHlike Alike formula Plike DIVlike same
+ flags:
+ 88:OBJECT
+ justify
+ 26 attributes:
+ 0:0:ALIGN
+ 1:0:ARCHIVE
+ 2:0:BORDER
+ 3:4:CLASS
+ 4:2:CLASSID
+ 5:2:CODEBASE
+ 6:0:CODETYPE
+ 7:2:DATA
+ 8:0:DECLARE
+ 9:0:DIR
+ 10:0:HEIGHT
+ 11:0:HSPACE
+ 12:1:ID
+ 13:0:ISMAP
+ 14:0:LANG
+ 15:0:NAME
+ 16:0:NOTAB
+ 17:0:SHAPES
+ 18:0:STANDBY
+ 19:0:STYLE
+ 20:0:TABINDEX
+ 21:0:TITLE
+ 22:0:TYPE
+ 23:2:USEMAP
+ 24:0:VSPACE
+ 25:0:WIDTH
+ 5 attr_types
+ align
+ core
+ events
+ i18n
+ OBJECT
+ contents: SGML_LITTERAL
+ tagclass: APPLETlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike FORMlike Plike DIVlike ULlike BRlike APPLETlike HRlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike formula FORMlike Plike DIVlike LIlike APPLETlike HRlike outer BODYlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike APPLETlike HRlike outer BODYlike same
+ canclose: FONTlike EMlike MATHlike Alike formula SELECTlike Plike LIlike ULlike BRlike APPLETlike same
+ flags: frecyc
+ 89:OL
+ justify
+ 12 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:COMPACT
+ 3:0:CONTINUE
+ 4:0:DIR
+ 5:1:ID
+ 6:0:LANG
+ 7:0:SEQNUM
+ 8:0:START
+ 9:0:STYLE
+ 10:0:TITLE
+ 11:0:TYPE
+ 3 attr_types
+ core
+ i18n
+ OL
+ contents: SGML_MIXED
+ tagclass: ULlike
+ contains: LIlike HRlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FORMlike DIVlike LIlike BRlike APPLETlike HRlike outer BODYlike DELlike
+ icontained: FONTlike EMlike MATHlike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same DELlike
+ canclose: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike Plike DIVlike LIlike ULlike MAPlike same
+ flags:
+ 90:OPTION
+ justify
+ 13 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:0:DISABLED
+ 4:0:ERROR
+ 5:1:ID
+ 6:0:LABEL
+ 7:0:LANG
+ 8:0:SELECTED
+ 9:0:SHAPE
+ 10:0:STYLE
+ 11:0:TITLE
+ 12:0:VALUE
+ 4 attr_types
+ core
+ events
+ i18n
+ OPTION
+ contents: SGML_PCDATA
+ tagclass: MAPlike
+ contains:
+ icontains:
+ contained: SELECTlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike
+ canclose: FONTlike EMlike MATHlike Alike formula Plike DIVlike same
+ flags: endO
+ 91:OVERLAY
+ justify
+ 12 attributes:
+ 0:4:CLASS
+ 1:0:HEIGHT
+ 2:1:ID
+ 3:0:IMAGEMAP
+ 4:0:MD
+ 5:2:SRC
+ 6:0:STYLE
+ 7:0:TITLE
+ 8:0:UNITS
+ 9:0:WIDTH
+ 10:0:X
+ 11:0:Y
+ 2 attr_types
+ core
+ OVERLAY
+ contents: SGML_PCDATA
+ tagclass: HRlike
+ contains:
+ icontains:
+ contained: DIVlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike
+ canclose: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike Plike DIVlike LIlike ULlike BRlike APPLETlike same
+ flags: endO
+ 92:P
+ justify
+ 9 attributes:
+ 0:0:ALIGN
+ 1:4:CLASS
+ 2:0:CLEAR
+ 3:0:DIR
+ 4:1:ID
+ 5:0:LANG
+ 6:0:NOWRAP
+ 7:0:STYLE
+ 8:0:TITLE
+ 4 attr_types
+ align
+ core
+ i18n
+ P
+ contents: SGML_MIXED
+ tagclass: Plike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FORMlike DIVlike LIlike APPLETlike HRlike outer BODYlike DELlike
+ icontained: FONTlike EMlike MATHlike TRlike FORMlike Plike DIVlike LIlike ULlike APPLETlike HRlike outer BODYlike same DELlike
+ canclose: FONTlike EMlike MATHlike formula Plike same
+ flags: endO
+ 93:PARAM
+ justify
+ 18 attributes:
+ 0:0:ACCEPT
+ 1:0:ACCEPT-CHARSET
+ 2:0:ACCEPT-ENCODING
+ 3:4:CLASS
+ 4:0:CLEAR
+ 5:0:DATA
+ 6:0:DIR
+ 7:1:ID
+ 8:0:LANG
+ 9:0:NAME
+ 10:0:OBJECT
+ 11:0:REF
+ 12:0:STYLE
+ 13:0:TITLE
+ 14:0:TYPE
+ 15:0:VALUE
+ 16:0:VALUEREF
+ 17:0:VALUETYPE
+ 3 attr_types
+ core
+ i18n
+ PARAM
+ contents: SGML_EMPTY
+ tagclass: BRlike
+ contains:
+ icontains:
+ contained: Plike LIlike BRlike APPLETlike outer BODYlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike
+ canclose: TRlike SELECTlike Plike LIlike BRlike same
+ flags: endO
+ 94:PLAINTEXT
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_LITTERAL
+ tagclass: outer
+ contains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike outer BODYlike HEADstuff same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike outer BODYlike HEADstuff same
+ contained: outer same
+ icontained: outer same
+ canclose: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike outer BODYlike
+ flags: endO
+ 95:PRE
+ nojustify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: DIVlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike HRlike MAPlike
+ icontains: EMlike MATHlike Alike formula SELECTlike BRlike APPLETlike HRlike MAPlike
+ contained: FORMlike DIVlike LIlike APPLETlike HRlike outer BODYlike DELlike
+ icontained: formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike APPLETlike HRlike outer BODYlike DELlike
+ canclose: EMlike MATHlike Alike formula Plike DIVlike LIlike same
+ flags:
+ 96:Q
+ justify
+ 8 attributes:
+ 0:2:CITE
+ 1:4:CLASS
+ 2:0:CLEAR
+ 3:0:DIR
+ 4:1:ID
+ 5:0:LANG
+ 6:0:STYLE
+ 7:0:TITLE
+ 3 attr_types
+ core
+ i18n
+ Q
+ contents: SGML_MIXED
+ tagclass: EMlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike BODYlike same
+ icontained: FONTlike EMlike MATHlike Alike TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: FONTlike EMlike
+ flags:
+ 97:S
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: FONTlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike BODYlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: FONTlike
+ flags:
+ 98:SAMP
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: EMlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike BODYlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: EMlike
+ flags: nreie
+ 99:SCRIPT
+ justify
+ 16 attributes:
+ 0:0:CHARSET
+ 1:4:CLASS
+ 2:0:CLEAR
+ 3:0:DEFER
+ 4:0:DIR
+ 5:0:EVENT
+ 6:0:FOR
+ 7:1:ID
+ 8:0:LANG
+ 9:0:LANGUAGE
+ 10:0:NAME
+ 11:0:SCRIPTENGINE
+ 12:2:SRC
+ 13:0:STYLE
+ 14:0:TITLE
+ 15:0:TYPE
+ 3 attr_types
+ core
+ i18n
+ SCRIPT
+ contents: SGML_SCRIPT
+ tagclass: APPLETlike
+ contains:
+ icontains:
+ contained: FONTlike EMlike MATHlike Alike formula FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff
+ canclose: FONTlike EMlike MATHlike Alike formula SELECTlike Plike LIlike ULlike BRlike APPLETlike HRlike same
+ flags:
+ 100:SECTION
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:DIR
+ 2:1:ID
+ 3:0:LANG
+ 4:0:ROLE
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN5
+ contents: SGML_MIXED
+ tagclass: DIVlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike FORMlike Plike DIVlike ULlike BRlike APPLETlike HRlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: TRlike FORMlike DIVlike LIlike APPLETlike HRlike outer BODYlike same DELlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same DELlike
+ canclose: FONTlike EMlike MATHlike Alike formula Plike DIVlike same
+ flags: mafse
+ 101:SELECT
+ justify
+ 22 attributes:
+ 0:0:ALIGN
+ 1:4:CLASS
+ 2:0:CLEAR
+ 3:0:DIR
+ 4:0:DISABLED
+ 5:0:ERROR
+ 6:0:HEIGHT
+ 7:1:ID
+ 8:0:LANG
+ 9:0:MD
+ 10:0:MULTIPLE
+ 11:0:NAME
+ 12:0:NOTAB
+ 13:0:ONBLUR
+ 14:0:ONCHANGE
+ 15:0:ONFOCUS
+ 16:0:SIZE
+ 17:0:STYLE
+ 18:0:TABINDEX
+ 19:0:TITLE
+ 20:0:UNITS
+ 21:0:WIDTH
+ 4 attr_types
+ align
+ core
+ i18n
+ SELECT
+ contents: SGML_ELEMENT
+ tagclass: SELECTlike
+ contains: MAPlike
+ icontains: MAPlike
+ contained: FONTlike EMlike MATHlike Alike TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike outer BODYlike
+ canclose: FONTlike EMlike MATHlike Alike formula SELECTlike Plike LIlike ULlike same
+ flags: strict
+ 102:SHY
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_EMPTY
+ tagclass: BRlike
+ contains:
+ icontains:
+ contained: FONTlike EMlike MATHlike Alike formula FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike outer BODYlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff
+ canclose: FONTlike EMlike MATHlike Alike formula BRlike same
+ flags: endO
+ 103:SMALL
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: FONTlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike BODYlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: FONTlike
+ flags: mafse nreie
+ 104:SPAN
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: EMlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike BODYlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: FONTlike EMlike same
+ flags:
+ 105:SPOT
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_EMPTY
+ tagclass: Alike
+ contains:
+ icontains:
+ contained: FONTlike EMlike MATHlike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike outer BODYlike
+ icontained: FONTlike EMlike MATHlike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike outer BODYlike
+ canclose: Alike
+ flags: endO
+ 106:STRIKE
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: FONTlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike BODYlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: FONTlike
+ flags:
+ 107:STRONG
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: EMlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike BODYlike same
+ icontained: FONTlike EMlike MATHlike Alike TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: FONTlike EMlike
+ flags: nreie
+ 108:STYLE
+ justify
+ 9 attributes:
+ 0:4:CLASS
+ 1:0:DIR
+ 2:1:ID
+ 3:0:LANG
+ 4:0:MEDIA
+ 5:0:NOTATION
+ 6:0:STYLE
+ 7:0:TITLE
+ 8:0:TYPE
+ 3 attr_types
+ core
+ i18n
+ STYLE
+ contents: SGML_CDATA
+ tagclass: HEADstuff
+ contains:
+ icontains:
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike APPLETlike HRlike outer BODYlike HEADstuff
+ icontained: FONTlike EMlike MATHlike Alike TRlike FORMlike Plike DIVlike LIlike ULlike APPLETlike HRlike outer BODYlike HEADstuff
+ canclose: FONTlike EMlike MATHlike Alike formula same
+ flags:
+ 109:SUB
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: MATHlike
+ contains: FONTlike EMlike MATHlike Alike formula SELECTlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike formula FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: FONTlike EMlike MATHlike
+ flags:
+ 110:SUP
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: MATHlike
+ contains: FONTlike EMlike MATHlike Alike formula SELECTlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike formula FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: FONTlike EMlike MATHlike
+ flags:
+ 111:TAB
+ justify
+ 11 attributes:
+ 0:0:ALIGN
+ 1:4:CLASS
+ 2:0:CLEAR
+ 3:0:DIR
+ 4:0:DP
+ 5:1:ID
+ 6:0:INDENT
+ 7:0:LANG
+ 8:0:STYLE
+ 9:0:TITLE
+ 10:0:TO
+ 4 attr_types
+ align
+ core
+ i18n
+ TAB
+ contents: SGML_EMPTY
+ tagclass: BRlike
+ contains:
+ icontains:
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike outer BODYlike
+ icontained: FONTlike EMlike MATHlike Alike TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer HEADstuff
+ canclose: FONTlike
+ flags: endO
+ 112:TABLE
+ justify
+ 22 attributes:
+ 0:0:ALIGN
+ 1:2:BACKGROUND
+ 2:0:BORDER
+ 3:0:CELLPADDING
+ 4:0:CELLSPACING
+ 5:4:CLASS
+ 6:0:CLEAR
+ 7:0:COLS
+ 8:0:COLSPEC
+ 9:0:DIR
+ 10:0:DP
+ 11:0:FRAME
+ 12:1:ID
+ 13:0:LANG
+ 14:0:NOFLOW
+ 15:0:NOWRAP
+ 16:0:RULES
+ 17:0:STYLE
+ 18:0:SUMMARY
+ 19:0:TITLE
+ 20:0:UNITS
+ 21:0:WIDTH
+ 5 attr_types
+ align
+ core
+ events
+ i18n
+ TABLE
+ contents: SGML_ELEMENT
+ tagclass: ULlike
+ contains: TRlike SELECTlike FORMlike Plike BRlike APPLETlike HRlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FORMlike DIVlike LIlike APPLETlike HRlike outer BODYlike DELlike
+ icontained: FONTlike EMlike MATHlike TRlike FORMlike Plike DIVlike LIlike ULlike APPLETlike HRlike outer BODYlike same DELlike
+ canclose: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike Plike LIlike HRlike MAPlike same
+ flags:
+ 113:TBODY
+ justify
+ 13 attributes:
+ 0:0:ALIGN
+ 1:0:CHAR
+ 2:0:CHAROFF
+ 3:4:CLASS
+ 4:0:CLEAR
+ 5:0:DIR
+ 6:0:DP
+ 7:1:ID
+ 8:0:LANG
+ 9:0:NOWRAP
+ 10:0:STYLE
+ 11:0:TITLE
+ 12:0:VALIGN
+ 5 attr_types
+ cellalign
+ core
+ events
+ i18n
+ TR
+ contents: SGML_ELEMENT
+ tagclass: TRlike
+ contains: TRlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FORMlike ULlike
+ icontained: FONTlike EMlike MATHlike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same
+ canclose: FONTlike EMlike MATHlike Alike formula SELECTlike Plike DIVlike LIlike HRlike MAPlike same
+ flags: endO startO
+ 114:TD
+ justify
+ 23 attributes:
+ 0:0:ABBR
+ 1:0:ALIGN
+ 2:0:AXES
+ 3:0:AXIS
+ 4:2:BACKGROUND
+ 5:0:CHAR
+ 6:0:CHAROFF
+ 7:4:CLASS
+ 8:0:CLEAR
+ 9:0:COLSPAN
+ 10:0:DIR
+ 11:0:DP
+ 12:0:HEADERS
+ 13:0:HEIGHT
+ 14:1:ID
+ 15:0:LANG
+ 16:0:NOWRAP
+ 17:0:ROWSPAN
+ 18:0:SCOPE
+ 19:0:STYLE
+ 20:0:TITLE
+ 21:0:VALIGN
+ 22:0:WIDTH
+ 4 attr_types
+ cellalign
+ core
+ i18n
+ TD
+ contents: SGML_MIXED
+ tagclass: LIlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike FORMlike Plike DIVlike ULlike BRlike APPLETlike HRlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: TRlike
+ icontained: FONTlike EMlike MATHlike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same
+ canclose: FONTlike EMlike MATHlike Alike formula SELECTlike Plike DIVlike LIlike HRlike MAPlike same
+ flags: endO
+ 115:TEXTAREA
+ justify
+ 22 attributes:
+ 0:0:ACCEPT-CHARSET
+ 1:0:ACCESSKEY
+ 2:0:ALIGN
+ 3:4:CLASS
+ 4:0:CLEAR
+ 5:0:COLS
+ 6:0:DIR
+ 7:0:DISABLED
+ 8:0:ERROR
+ 9:1:ID
+ 10:0:LANG
+ 11:0:NAME
+ 12:0:NOTAB
+ 13:0:ONBLUR
+ 14:0:ONCHANGE
+ 15:0:ONFOCUS
+ 16:0:ONSELECT
+ 17:0:READONLY
+ 18:0:ROWS
+ 19:0:STYLE
+ 20:0:TABINDEX
+ 21:0:TITLE
+ 5 attr_types
+ align
+ core
+ events
+ i18n
+ TEXTAREA
+ contents: SGML_PCDATA
+ tagclass: SELECTlike
+ contains:
+ icontains:
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike outer BODYlike
+ canclose: FONTlike EMlike MATHlike Alike formula SELECTlike Plike LIlike ULlike same
+ flags: nolyspcl
+ 116:TEXTFLOW
+ justify
+ 14 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DATA
+ 3:0:DIR
+ 4:1:ID
+ 5:0:LANG
+ 6:0:NAME
+ 7:0:OBJECT
+ 8:0:REF
+ 9:0:STYLE
+ 10:0:TITLE
+ 11:0:TYPE
+ 12:0:VALUE
+ 13:0:VALUETYPE
+ 3 attr_types
+ core
+ i18n
+ BODYTEXT
+ contents: SGML_MIXED
+ tagclass: BODYlike
+ contains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike ULlike BRlike APPLETlike HRlike MAPlike same DELlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike outer same DELlike
+ contained: formula TRlike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike outer same
+ icontained: FONTlike EMlike MATHlike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same
+ canclose: FONTlike EMlike MATHlike Alike BRlike APPLETlike MAPlike outer same
+ flags: endO startO
+ 117:TFOOT
+ justify
+ 13 attributes:
+ 0:0:ALIGN
+ 1:0:CHAR
+ 2:0:CHAROFF
+ 3:4:CLASS
+ 4:0:CLEAR
+ 5:0:DIR
+ 6:0:DP
+ 7:1:ID
+ 8:0:LANG
+ 9:0:NOWRAP
+ 10:0:STYLE
+ 11:0:TITLE
+ 12:0:VALIGN
+ 5 attr_types
+ cellalign
+ core
+ events
+ i18n
+ TR
+ contents: SGML_ELEMENT
+ tagclass: TRlike
+ contains: TRlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: ULlike
+ icontained: FONTlike EMlike MATHlike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same
+ canclose: FONTlike EMlike MATHlike Alike formula SELECTlike Plike DIVlike LIlike ULlike HRlike MAPlike same
+ flags: endO
+ 118:TH
+ justify
+ 23 attributes:
+ 0:0:ABBR
+ 1:0:ALIGN
+ 2:0:AXES
+ 3:0:AXIS
+ 4:2:BACKGROUND
+ 5:0:CHAR
+ 6:0:CHAROFF
+ 7:4:CLASS
+ 8:0:CLEAR
+ 9:0:COLSPAN
+ 10:0:DIR
+ 11:0:DP
+ 12:0:HEADERS
+ 13:0:HEIGHT
+ 14:1:ID
+ 15:0:LANG
+ 16:0:NOWRAP
+ 17:0:ROWSPAN
+ 18:0:SCOPE
+ 19:0:STYLE
+ 20:0:TITLE
+ 21:0:VALIGN
+ 22:0:WIDTH
+ 4 attr_types
+ cellalign
+ core
+ i18n
+ TD
+ contents: SGML_MIXED
+ tagclass: LIlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike FORMlike Plike DIVlike ULlike BRlike APPLETlike HRlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike
+ contained: TRlike
+ icontained: FONTlike EMlike MATHlike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same
+ canclose: FONTlike EMlike MATHlike Alike formula SELECTlike Plike DIVlike LIlike ULlike HRlike MAPlike same
+ flags: endO
+ 119:THEAD
+ justify
+ 13 attributes:
+ 0:0:ALIGN
+ 1:0:CHAR
+ 2:0:CHAROFF
+ 3:4:CLASS
+ 4:0:CLEAR
+ 5:0:DIR
+ 6:0:DP
+ 7:1:ID
+ 8:0:LANG
+ 9:0:NOWRAP
+ 10:0:STYLE
+ 11:0:TITLE
+ 12:0:VALIGN
+ 5 attr_types
+ cellalign
+ core
+ events
+ i18n
+ TR
+ contents: SGML_ELEMENT
+ tagclass: TRlike
+ contains: TRlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: ULlike
+ icontained: FONTlike EMlike MATHlike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same
+ canclose: FONTlike EMlike MATHlike Alike formula SELECTlike Plike DIVlike LIlike ULlike HRlike MAPlike same
+ flags: endO
+ 120:TITLE
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_PCDATA
+ tagclass: HEADstuff
+ contains:
+ icontains:
+ contained: outer HEADstuff
+ icontained: outer HEADstuff
+ canclose: FONTlike EMlike MATHlike Alike formula Plike DIVlike
+ flags: mafse strict
+ 121:TR
+ justify
+ 13 attributes:
+ 0:0:ALIGN
+ 1:0:CHAR
+ 2:0:CHAROFF
+ 3:4:CLASS
+ 4:0:CLEAR
+ 5:0:DIR
+ 6:0:DP
+ 7:1:ID
+ 8:0:LANG
+ 9:0:NOWRAP
+ 10:0:STYLE
+ 11:0:TITLE
+ 12:0:VALIGN
+ 5 attr_types
+ cellalign
+ core
+ events
+ i18n
+ TR
+ contents: SGML_MIXED
+ tagclass: TRlike
+ contains: LIlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: TRlike ULlike
+ icontained: FONTlike EMlike MATHlike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same
+ canclose: FONTlike EMlike MATHlike Alike formula SELECTlike Plike DIVlike LIlike HRlike MAPlike same
+ flags: endO
+ 122:TT
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: FONTlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike BODYlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: FONTlike
+ flags: nreie
+ 123:U
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: FONTlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike BODYlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: FONTlike
+ flags: mafse nreie
+ 124:UL
+ justify
+ 14 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:COMPACT
+ 3:0:DINGBAT
+ 4:0:DIR
+ 5:1:ID
+ 6:0:LANG
+ 7:0:MD
+ 8:0:PLAIN
+ 9:2:SRC
+ 10:0:STYLE
+ 11:0:TITLE
+ 12:0:TYPE
+ 13:0:WRAP
+ 3 attr_types
+ core
+ i18n
+ UL
+ contents: SGML_MIXED
+ tagclass: ULlike
+ contains: FORMlike LIlike HRlike MAPlike
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FORMlike DIVlike LIlike APPLETlike HRlike outer BODYlike DELlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike same DELlike
+ canclose: FONTlike EMlike MATHlike Alike formula SELECTlike Plike DIVlike LIlike same
+ flags:
+ 125:VAR
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_MIXED
+ tagclass: EMlike
+ contains: FONTlike EMlike MATHlike Alike SELECTlike BRlike APPLETlike MAPlike same
+ icontains: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike MAPlike same
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike BODYlike same
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff same
+ canclose: FONTlike
+ flags:
+ 126:WBR
+ justify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_EMPTY
+ tagclass: FONTlike
+ contains:
+ icontains:
+ contained: FONTlike EMlike MATHlike Alike FORMlike Plike DIVlike LIlike BRlike APPLETlike HRlike outer BODYlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike FORMlike Plike DIVlike LIlike ULlike BRlike APPLETlike HRlike outer BODYlike HEADstuff
+ canclose: FONTlike EMlike MATHlike Alike formula BRlike same
+ flags: endO
+ 127:XMP
+ nojustify
+ 7 attributes:
+ 0:4:CLASS
+ 1:0:CLEAR
+ 2:0:DIR
+ 3:1:ID
+ 4:0:LANG
+ 5:0:STYLE
+ 6:0:TITLE
+ 4 attr_types
+ core
+ events
+ i18n
+ GEN
+ contents: SGML_LITTERAL
+ tagclass: ULlike
+ contains:
+ icontains:
+ contained: TRlike SELECTlike FORMlike Plike DIVlike LIlike APPLETlike HRlike outer BODYlike DELlike
+ icontained: FONTlike EMlike MATHlike Alike formula TRlike SELECTlike FORMlike Plike DIVlike LIlike ULlike APPLETlike HRlike outer BODYlike DELlike
+ canclose: FONTlike EMlike MATHlike Alike formula SELECTlike Plike DIVlike LIlike MAPlike
+ flags: endO
diff --git a/WWW/Library/Implementation/tidy_tls.h b/WWW/Library/Implementation/tidy_tls.h
new file mode 100644
index 0000000..56b3636
--- /dev/null
+++ b/WWW/Library/Implementation/tidy_tls.h
@@ -0,0 +1,147 @@
+/*
+ * $LynxId: tidy_tls.h,v 1.8 2015/10/12 00:28:18 tom Exp $
+ * Copyright 2008-2013,2015 Thomas E. Dickey
+ */
+#ifndef TIDY_TLS_H
+#define TIDY_TLS_H
+
+#include <gnutls/gnutls.h>
+
+#define OPENSSL_VERSION_NUMBER (0x0090604F)
+#define SSLEAY_VERSION_NUMBER OPENSSL_VERSION_NUMBER
+
+#define SSLeay_add_ssl_algorithms() SSL_library_init()
+
+#define SSL_ST_OK (1)
+
+#define SSL_OP_ALL (0x000FFFFF)
+#define SSL_OP_NO_SSLv2 (0x00100000)
+#define SSL_OP_NO_SSLv3 (0x00200000)
+#define SSL_OP_NO_TLSv1 (0x00400000)
+
+#define SSL_get_cipher_name(ssl) SSL_CIPHER_get_name(SSL_get_current_cipher(ssl))
+#define SSL_get_cipher(ssl) SSL_get_cipher_name(ssl)
+#define SSL_get_cipher_bits(ssl,bp) SSL_CIPHER_get_bits(SSL_get_current_cipher(ssl),(bp))
+#define SSL_get_cipher_version(ssl) SSL_CIPHER_get_version(SSL_get_current_cipher(ssl))
+
+#define TIDY_TLS_BUFSIZE 256
+
+typedef struct {
+ char common_name[TIDY_TLS_BUFSIZE];
+ char country[TIDY_TLS_BUFSIZE];
+ char email[TIDY_TLS_BUFSIZE];
+ char locality_name[TIDY_TLS_BUFSIZE];
+ char organization[TIDY_TLS_BUFSIZE];
+ char organizational_unit_name[TIDY_TLS_BUFSIZE];
+ char state_or_province_name[TIDY_TLS_BUFSIZE];
+} X509_NAME;
+
+typedef struct _SSL SSL;
+
+typedef gnutls_datum_t X509;
+
+typedef struct {
+ unsigned connend;
+ struct {
+ int protocol[GNUTLS_MAX_ALGORITHM_NUM];
+ int encrypts[GNUTLS_MAX_ALGORITHM_NUM];
+ int compress[GNUTLS_MAX_ALGORITHM_NUM];
+ int key_xchg[GNUTLS_MAX_ALGORITHM_NUM];
+ int msg_code[GNUTLS_MAX_ALGORITHM_NUM];
+ } priority;
+} SSL_METHOD;
+
+typedef struct {
+ SSL *ssl;
+ int error;
+ const gnutls_datum_t *cert_list;
+#define current_cert cert_list
+} X509_STORE_CTX;
+
+typedef struct {
+ gnutls_certificate_type_t cert;
+ gnutls_cipher_algorithm_t encrypts;
+ gnutls_compression_method_t compress;
+ gnutls_kx_algorithm_t key_xchg;
+ gnutls_mac_algorithm_t msg_code;
+ gnutls_protocol_t protocol;
+} SSL_CIPHER;
+
+typedef struct _SSL_CTX {
+ SSL_METHOD *method;
+ char *certfile;
+ int certfile_type;
+ char *keyfile;
+ int keyfile_type;
+ unsigned long options;
+
+ int (*verify_callback) (int, X509_STORE_CTX *);
+ int verify_mode;
+
+ char *client_certfile;
+ int client_certfile_type;
+ char *client_keyfile;
+ int client_keyfile_type;
+
+} SSL_CTX;
+
+struct _SSL {
+ gnutls_session_t gnutls_state;
+
+ gnutls_certificate_client_credentials gnutls_cred;
+
+ SSL_CTX *ctx;
+ SSL_CIPHER ciphersuite;
+
+ int last_error;
+ int shutdown;
+ int state;
+ unsigned long options;
+
+ int (*verify_callback) (int, X509_STORE_CTX *);
+ int verify_mode;
+
+ gnutls_transport_ptr_t rfd;
+ gnutls_transport_ptr_t wfd;
+
+ void *sendbuffer;
+ size_t bytes_sent;
+};
+
+/* use either SSL_VERIFY_NONE or SSL_VERIFY_PEER, the last 2 options
+ * are 'ored' with SSL_VERIFY_PEER if they are desired */
+#define SSL_VERIFY_PEER 0x01
+/* *INDENT-OFF* */
+extern SSL *SSL_new(SSL_CTX * ctx);
+extern SSL_CIPHER *SSL_get_current_cipher(SSL * ssl);
+extern SSL_CTX *SSL_CTX_new(SSL_METHOD * method);
+extern SSL_METHOD *SSLv23_client_method(void);
+extern const X509 *SSL_get_peer_certificate(SSL * ssl);
+extern X509_NAME *X509_get_issuer_name(const X509 * cert);
+extern X509_NAME *X509_get_subject_name(const X509 * cert);
+extern char *X509_NAME_oneline(X509_NAME * name, char *buf, int len);
+extern const char *ERR_error_string(unsigned long e, char *buf);
+extern const char *RAND_file_name(char *buf, size_t len);
+extern const char *SSL_CIPHER_get_name(SSL_CIPHER * cipher);
+extern const char *SSL_CIPHER_get_version(SSL_CIPHER * cipher);
+extern int RAND_bytes(unsigned char *buf, int num);
+extern int RAND_load_file(const char *name, long maxbytes);
+extern int RAND_status(void);
+extern int RAND_write_file(const char *name);
+extern int SSL_CIPHER_get_bits(SSL_CIPHER * cipher, int *bits);
+extern int SSL_CTX_set_default_verify_paths(SSL_CTX * ctx);
+extern int SSL_connect(SSL * ssl);
+extern int SSL_library_init(void);
+extern int SSL_read(SSL * ssl, void *buf, int len);
+extern int SSL_set_fd(SSL * ssl, int fd);
+extern int SSL_write(SSL * ssl, const void *buf, int len);
+extern unsigned long ERR_get_error(void);
+extern unsigned long SSL_CTX_set_options(SSL_CTX * ctx, unsigned long options);
+extern void RAND_seed(const void *buf, int num);
+extern void SSL_CTX_free(SSL_CTX * ctx);
+extern void SSL_CTX_set_verify(SSL_CTX * ctx, int verify_mode, int (*verify_callback) (int, X509_STORE_CTX *));
+extern void SSL_free(SSL * ssl);
+extern void SSL_load_error_strings(void);
+/* *INDENT-ON* */
+
+#endif /* TIDY_TLS_H */
diff --git a/WWW/Library/Implementation/www_tcp.h b/WWW/Library/Implementation/www_tcp.h
new file mode 100644
index 0000000..ef754c8
--- /dev/null
+++ b/WWW/Library/Implementation/www_tcp.h
@@ -0,0 +1,1017 @@
+/* System dependencies in the W3 library
+ * $LynxId: www_tcp.h,v 1.61 2018/12/26 12:30:14 tom Exp $
+ *
+ SYSTEM DEPENDENCIES
+
+ System-system differences for TCP include files and macros. This
+ file includes for each system the files necessary for network and
+ file I/O. It should be used in conjunction with HTUtils.h to help
+ ensure portability across as many platforms and flavors of platforms
+ as possible.
+
+ AUTHORS
+
+ TBL Tim Berners-Lee, W3 project, CERN, <timbl@info.cern.ch>
+ EvA Eelco van Asperen <evas@cs.few.eur.nl>
+ MA Marc Andreessen NCSA
+ AT Aleksandar Totic <atotic@ncsa.uiuc.edu>
+ SCW Susan C. Weber <sweber@kyle.eitech.com>
+
+ HISTORY:
+ 22 Feb 91 Written (TBL) as part of the WWW library.
+ 16 Jan 92 PC code from EvA
+ 22 Apr 93 Merged diffs bits from xmosaic release
+ 29 Apr 93 Windows/NT code from SCW
+ 20 May 94 A.Harper Add support for VMS CMU TCP/IP transport
+ 3 Oct 94 A.Harper Add support for VMS SOCKETSHR/NETLIB
+ 15 Jul 95 S. Bjorndahl Gnu C for VMS Globaldef/ref support
+
+*/
+
+#ifndef TCP_H
+#define TCP_H
+
+/*
+
+Default values
+
+ These values may be reset and altered by system-specific sections
+ later on. there are also a bunch of defaults at the end .
+
+ */
+/* Default values of those: */
+ /* Routine to close a TCP-IP socket */
+#define NETCLOSE close
+ /* Routine to read from a TCP-IP socket */
+#define NETREAD(s,p,n) \
+ HTDoRead(s, p, (unsigned)(n))
+ /* Routine to write to a TCP-IP socket */
+#define NETWRITE(s,p,n) write(s, p, (size_t)(n))
+#define SOCKET_READ(s,b,l) read(s,b,(size_t)(l))
+#define IOCTL(s,cmd,arg) ioctl(s,(long)(cmd),arg)
+#define SOCKET_ERRNO errno /* normal socket errno */
+
+/* Unless stated otherwise, */
+#define SELECT /* Can handle >1 channel. */
+#define GOT_SYSTEM /* Can call shell with string */
+
+#ifdef UNIX
+#define GOT_PIPE
+#endif /* UNIX */
+
+#define INVSOC (-1) /* Unix invalid socket */
+ /* NB: newer libwww has something different for Windows */
+
+#ifndef VMS
+
+#include <sys/types.h>
+
+#if defined(__BORLANDC__)
+#define DECL_ERRNO
+#endif
+
+#if defined(__DJGPP__) || defined(__BORLANDC__)
+#undef HAVE_DIRENT_H
+#define HAVE_DIRENT_H
+#undef HAVE_SYS_FILIO_H
+#endif /* DJGPP or __BORLANDC__ */
+
+#if defined(_MSC_VER)
+#undef HAVE_DIRENT_H
+#define HAVE_DIRENT_H
+#undef HAVE_SYS_FILIO_H
+#endif /* _MSC_VER */
+
+#ifdef HAVE_DIRENT_H
+# include <dirent.h>
+# define D_NAMLEN(dirent) strlen((dirent)->d_name)
+# define STRUCT_DIRENT struct dirent
+#else
+# define D_NAMLEN(dirent) (dirent)->d_namlen
+# define STRUCT_DIRENT struct direct
+# ifdef HAVE_SYS_NDIR_H
+# include <sys/ndir.h>
+# endif
+# ifdef HAVE_SYS_DIR_H
+# include <sys/dir.h>
+# endif
+# ifdef HAVE_NDIR_H
+# include <ndir.h>
+# endif
+#endif /* HAVE_DIRENT_H */
+
+#ifdef HAVE_STRUCT_DIRENT64
+# undef STRUCT_DIRENT
+# define STRUCT_DIRENT struct dirent64
+#endif
+
+#if !(defined(DOSPATH) || defined(__EMX__) || defined(__CYGWIN__))
+#define STRUCT_DIRENT__D_INO 1
+#endif
+
+#endif /* !VMS */
+
+#ifdef TIME_WITH_SYS_TIME
+# include <sys/time.h>
+# include <time.h>
+#else
+# ifdef HAVE_SYS_TIME_H
+# include <sys/time.h>
+# else
+# include <time.h>
+# endif
+#endif
+
+#if defined(_AIX) && !defined(AIX)
+#define AIX
+#endif /* _AIX */
+
+#ifndef __CYGWIN__
+#ifdef WIN_EX
+#define HAVE_FTIME 1
+#define HAVE_SYS_TIMEB_H 1
+#endif
+#endif /* __CYGWIN__ */
+
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#else
+#ifdef HAVE_SYS_FCNTL_H
+#include <sys/fcntl.h>
+#endif
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h> /* For bzero etc */
+#endif /* HAVE_STRING_H */
+
+/*
+
+ MACROS FOR CONVERTING CHARACTERS
+
+ */
+#ifndef TOASCII
+#ifdef EBCDIC /* S/390 -- gil -- 1327 */
+
+extern const char un_IBM1047[];
+extern const unsigned char IBM1047[];
+
+/* For debugging
+#include <assert.h>
+#define TOASCII(c) (assert((c)>=0 && (c)<256), un_IBM1047[c])
+*/
+/* for production */
+#define TOASCII(c) (un_IBM1047[c])
+
+#define FROMASCII(c) (IBM1047[c])
+
+#else /* EBCDIC */
+
+#if '0' != 48
+error Host character set is not ASCII.
+#endif
+
+#define TOASCII(c) (c)
+#define FROMASCII(c) (c)
+
+#endif /* EBCDIC */
+#endif /* !TOASCII */
+
+/* convert a char to an unsigned, needed if we have signed characters for ctype.h */
+#define UCH(ch) ((unsigned char)(ch))
+
+/*
+ * These parameters were provided by Nigel Horne, using BeOS professional 5.0
+ */
+#ifdef __BEOS__
+#undef NETREAD
+#undef NETWRITE
+#undef NETCLOSE
+#define NETREAD(s,b,l) recv((s),(b),(l),0)
+#define NETWRITE(s,b,l) send((s),(b),(l),0)
+#define NETCLOSE(s) closesocket(s)
+#endif
+
+/*
+IBM-PC running Windows NT
+
+ These parameters provided by Susan C. Weber <sweber@kyle.eitech.com>.
+*/
+
+#ifdef _WINDOWS
+
+#ifndef _WINDOWS_NSL
+#define _WINDOWS_NSL
+#endif
+
+#include <fcntl.h> /* For HTFile.c */
+#include <sys/types.h> /* For HTFile.c */
+#include <sys/stat.h> /* For HTFile.c */
+#undef NETREAD
+#undef NETWRITE
+#undef NETCLOSE
+#undef IOCTL
+extern int ws_netread(int fd, char *buf, int len);
+
+#define NETREAD(s,b,l) ws_netread((s),(b),(l)) /* 1997/11/06 (Thu) */
+#define NETWRITE(s,b,l) send((s),(b),(l),0)
+#define NETCLOSE(s) closesocket(s)
+#define IOCTL(s,cmd,arg) ioctlsocket(s,cmd,arg)
+#include <io.h>
+#include <string.h>
+#include <process.h>
+#include <time.h>
+#include <errno.h>
+#include <direct.h>
+
+#ifdef ENABLE_IPV6
+#undef USE_WINSOCK2_H
+#define USE_WINSOCK2_H
+
+/* Avoid including <winsock*.h> in <windows.h> */
+#ifndef WIN32_LEAN_AND_MEAN
+#error Define "WIN32_LEAN_AND_MEAN" in your makefile
+#endif
+
+#ifdef _WINSOCKAPI_
+#error windows.h included before winsock2.h
+#endif
+
+#if defined(_MSC_VER) && (!defined(_WIN32_WINNT) || _WIN32_WINNT < 0x0501)
+/*
+ * Needed to pull in the real getaddrinfo() and not the inline version
+ * in <wspiAPI.H> which doesn't support IPv6 (IPv4 only). <wspiAPI.H> is
+ * included from <ws2tcpip.h> for <= 0x0500 SDKs.
+ */
+#undef _WIN32_WINNT
+#define _WIN32_WINNT 0x0501
+#endif
+#endif /* ENABLE_IPV6 */
+
+#ifdef USE_WINSOCK2_H
+#include <winsock2.h> /* normally included in windows.h */
+
+#ifdef ENABLE_IPV6
+#include <ws2tcpip.h>
+#endif
+
+#undef EINPROGRESS
+#undef EALREADY
+#undef EISCONN
+#undef EINTR
+#undef EAGAIN
+#undef ENOTCONN
+#undef ECONNRESET
+#undef ETIMEDOUT
+
+#define EINPROGRESS WSAEINPROGRESS
+#define EALREADY WSAEALREADY
+#define EISCONN WSAEISCONN
+#define EINTR WSAEINTR
+/* fine EAGAIN WSAEAGAIN */
+#define ENOTCONN WSAENOTCONN
+#define ECONNRESET WSAECONNRESET
+#define ETIMEDOUT WSAETIMEDOUT
+
+#else /* USE_WINSOCK2_H */
+
+#include <winsock.h>
+
+#if defined(_MSC_VER) || defined(__MINGW32__)
+#undef EINTR
+#undef EAGAIN
+#endif /* _MSC_VER */
+
+#undef EINPROGRESS
+#define EINPROGRESS (WSABASEERR+36)
+
+#undef EALREADY
+#define EALREADY (WSABASEERR+37)
+
+#undef EISCONN
+#define EISCONN (WSABASEERR+56)
+
+#undef EINTR
+#define EINTR (WSABASEERR+4)
+
+#undef EAGAIN
+#define EAGAIN (WSABASEERR+1002)
+
+#undef ENOTCONN
+#define ENOTCONN (WSABASEERR+57)
+
+#undef ECONNRESET
+#define ECONNRESET (WSABASEERR+54)
+
+#undef ETIMEDOUT
+#define ETIMEDOUT WSAETIMEDOUT
+
+#endif /* USE_WINSOCK2_H */
+
+#undef SOCKET_ERRNO
+#define SOCKET_ERRNO WSAGetLastError()
+
+#define INCLUDES_DONE
+#define TCP_INCLUDES_DONE
+
+#define LYNX_FD SOCKET /* WINSOCK uses an unsigned value for FD_SET, etc */
+
+#else
+
+#define LYNX_FD int /* POSIX says FD_SET descriptor is int */
+
+#endif /* WINDOWS */
+
+/*
+
+VAX/VMS
+
+ Under VMS, there are many versions of TCP-IP. Define one if you do
+ not use Digital's UCX product:
+
+ UCX DEC's "Ultrix connection" (default)
+ CMU_TCP Available via FTP from sacusr.mp.usbr.gov
+ SOCKETSHR Eckhart Meyer's interface to NETLIB
+ WIN_TCP From Wollongong, now GEC software.
+ MULTINET From SRI, became TGV, then Cisco.
+ DECNET Cern's TCP socket emulation over DECnet
+ TCPIP_SERVICES TCP/IP Services (newer than UCX)
+
+ WIN_TCP, MULTINET and DECNET do not interfere with the
+ unix i/o library, and so they need special calls to read, write and
+ close sockets. In these cases the socket number is a VMS channel
+ number, so we make the @@@ HORRIBLE @@@ assumption that a channel
+ number will be greater than 10 but a unix file descriptor less than
+ 10. It works.
+
+ */
+#ifdef VMS
+
+#ifdef UCX
+#undef IOCTL
+#define IOCTL(s,cmd,arg) HTioctl(s,cmd,arg)
+#endif /* UCX */
+
+#ifdef WIN_TCP
+#undef SOCKET_READ
+#undef NETWRITE
+#undef NETCLOSE
+#define SOCKET_READ(s,b,l) ((s)>10 ? netread((s),(b),(l)) : read((s),(b),(l)))
+#define NETWRITE(s,b,l) ((s)>10 ? netwrite((s),(b),(l)) : write((s),(b),(l)))
+#define NETCLOSE(s) ((s)>10 ? netclose(s) : close(s))
+#undef IOCTL
+#define IOCTL(a,b,c) -1 /* disables ioctl function */
+#define NO_IOCTL /* flag to check if ioctl is disabled */
+#endif /* WIN_TCP */
+
+#ifdef CMU_TCP
+#undef SOCKET_READ
+#undef NETREAD
+#undef NETWRITE
+#undef NETCLOSE
+#define SOCKET_READ(s,b,l) (cmu_get_sdc((s)) != 0 ? cmu_read((s),(b),(l)) : read((s),(b),(l)))
+#define NETREAD(s,b,l) (cmu_get_sdc((s)) != 0 ? HTDoRead((s),(b),(l)) : read((s),(b),(l)))
+#define NETWRITE(s,b,l) (cmu_get_sdc((s)) != 0 ? cmu_write((s),(b),(l)) : write((s),(b),(l)))
+#define NETCLOSE(s) (cmu_get_sdc((s)) != 0 ? cmu_close((s)) : close((s)))
+#endif /* CMU_TCP */
+
+#ifdef MULTINET
+#undef NETCLOSE
+#undef SOCKET_READ
+#undef NETWRITE
+#undef IOCTL
+#undef SOCKET_ERRNO
+/*
+ * Delete these socket_foo() prototypes as MultiNet adds them
+ * to it's socket library headers. Compiler warnings due to
+ * the absence of arguments in the generic prototypes here will
+ * include the names of those which can be deleted. - FM
+ */
+extern int socket_read();
+extern int socket_write();
+extern int socket_close();
+extern int socket_ioctl();
+
+#define SOCKET_READ(s,b,l) ((s)>10 ? socket_read((s),(b),(l)) : \
+ read((s),(b),(l)))
+#define NETWRITE(s,b,l) ((s)>10 ? socket_write((s),(b),(l)) : \
+ write((s),(b),(l)))
+#define NETCLOSE(s) ((s)>10 ? socket_close(s) : close(s))
+#define IOCTL(s,cmd,arg) socket_ioctl(s,cmd,arg)
+#define SOCKET_ERRNO socket_errno
+#endif /* MULTINET */
+
+#ifdef SOCKETSHR_TCP
+#undef SOCKET_READ
+#undef NETREAD
+#undef NETWRITE
+#undef NETCLOSE
+#undef IOCTL
+#define SOCKET_READ(s,b,l) (si_get_sdc((s)) != 0 ? si_read((s),(b),(l)) : \
+ read((s),(b),(l)))
+#define NETREAD(s,b,l) (si_get_sdc((s)) != 0 ? HTDoRead((s),(b),(l)) : \
+ read((s),(b),(l)))
+#define NETWRITE(s,b,l) (si_get_sdc((s)) != 0 ? si_write((s),(b),(l)) : \
+ write((s),(b),(l)))
+#define NETCLOSE(s) (si_get_sdc((s)) != 0 ? si_close((s)) : close((s)))
+#define IOCTL(s,cmd,arg) si_ioctl(s,cmd,arg)
+#endif /* SOCKETSHR_TCP */
+
+#ifdef TCPIP_SERVICES
+/*
+ * TCPIP Services has all of the entrypoints including ioctl().
+ */
+#undef NETWRITE
+#define NETWRITE(s,b,l) send((s),(char *)(b),(l),0)
+
+#define TYPE_FD_SET int
+
+#if 0 /* this should be declared via time.h */
+typedef TYPE_FD_SET fd_set;
+#endif
+
+#endif /* TCPIP_SERVICES */
+
+#include <string.h>
+
+#include <file.h>
+#include <stat.h>
+#include <unixio.h>
+#include <unixlib.h>
+
+#define INCLUDES_DONE
+
+#ifdef MULTINET /* Include from standard Multinet directories */
+/*
+ * Delete any of these multinet_foo() and associated prototypes
+ * as MultiNet adds them to its socket library headers. You'll
+ * get compiler warnings about them, due the absence of arguments
+ * in the generic prototyping here, and the warnings will include
+ * the names of the functions whose prototype entries can be
+ * deleted here. - FM
+ */
+extern int multinet_accept();
+extern int multinet_bind();
+extern int multinet_connect();
+extern int multinet_gethostname();
+extern int multinet_getsockname();
+extern unsigned short multinet_htons(unsigned short __val);
+extern unsigned short multinet_ntohs(unsigned short __val);
+extern int multinet_listen();
+extern int multinet_select();
+extern int multinet_socket();
+extern char *vms_errno_string();
+
+#ifndef __SOCKET_TYPEDEFS
+#define __SOCKET_TYPEDEFS 1
+#endif /* !__SOCKET_TYPEDEFS */
+
+#include <time.h>
+#include <types.h>
+/*
+ * DEC C before version 5.2 added some typedefs to <types.h> which happen
+ * to be suppressed if the version-4 compatibility define is set. In
+ * particular, lynx uses "off_t". VAX-C used "unsigned", DEC-C uses "int".
+ */
+#if defined(_DECC_V4_SOURCE) && !defined(____OFF_T)
+#undef off_t
+#define off_t int
+#endif
+
+#ifdef __TIME_T
+#undef __TYPES
+#define __TYPES 1
+#define __TYPES_LOADED 1
+#endif /* __TIME_T */
+
+#ifdef __SOCKET_TYPEDEFS
+#undef __SOCKET_TYPEDEFS
+#endif /* __SOCKET_TYPEDEFS */
+
+#include "multinet_root:[multinet.include.sys]types.h"
+
+#ifndef __SOCKET_TYPEDEFS
+#define __SOCKET_TYPEDEFS 1
+#endif /* !__SOCKET_TYPEDEFS */
+
+#include "multinet_root:[multinet.include]errno.h"
+
+#ifdef __TYPES
+#undef __TIME_T
+#define __TIME_T 1
+#endif /* __TYPE */
+
+#ifdef __TIME_LOADED
+#undef __TIME
+#define __TIME 1 /* to avoid double definitions in in.h */
+#endif /* __TIME_LOADED */
+
+#include "multinet_root:[multinet.include.sys]time.h"
+
+#define MULTINET_NO_PROTOTYPES /* DECC is compatible-but-different */
+#include "multinet_root:[multinet.include.sys]socket.h"
+#undef MULTINET_NO_PROTOTYPES
+#include "multinet_root:[multinet.include.netinet]in.h"
+#include "multinet_root:[multinet.include.arpa]inet.h"
+#include "multinet_root:[multinet.include]netdb.h"
+#include "multinet_root:[multinet.include.sys]ioctl.h"
+#define TCP_INCLUDES_DONE
+/*
+ * Uncomment this if you get compiler messages
+ * about struct timeval having no linkage. - FM
+ */
+/*#define NO_TIMEVAL*/
+#ifdef NO_TIMEVAL
+struct timeval {
+ long tv_sec; /* seconds since Jan. 1, 1970 */
+ long tv_usec; /* microseconds */
+};
+#endif /* NO_TIMEVAL */
+#endif /* MULTINET */
+
+#ifdef DECNET
+#include <types.h>
+#include <errno.h>
+#include <time.h>
+#include <types.h> /* for socket.h */
+#include <socket.h>
+#include <dn>
+#include <dnetdb>
+/* #include "vms.h" */
+#define TCP_INCLUDES_DONE
+#endif /* DECNET */
+
+#ifdef UCX
+#include <types.h>
+#include <errno.h>
+#include <time.h>
+#include <socket.h>
+#include <in.h>
+#include <inet.h>
+#if defined(TCPWARE) && !defined(__DECC)
+#include "tcpware_include:netdb.h"
+#include "tcpware_include:ucx$inetdef.h"
+#else
+#include <netdb.h>
+#ifdef MUCX
+#include <multinet_root:[multinet.include.vms]ucx$inetdef.h>
+#else
+#include <ucx$inetdef.h>
+#endif /* MUCX */
+#endif /* TCPWARE */
+#define TCP_INCLUDES_DONE
+#endif /* UCX */
+
+#ifdef CMU_TCP
+#include <types.h>
+#include <errno.h>
+#include "cmuip_root:[syslib]time.h"
+#include "cmuip_root:[syslib]socket.h"
+#include <in.h>
+#include <inet.h>
+#include <netdb.h>
+#include "cmuip_root:[syslib]ioctl.h"
+#define TCP_INCLUDES_DONE
+#endif /* CMU_TCP */
+
+#ifdef SOCKETSHR_TCP
+#include <types.h>
+#include <errno.h>
+#include <time.h>
+#include <socket.h>
+#include <in.h>
+#include <inet.h>
+#include <netdb.h>
+#include "socketshr_library:socketshr.h"
+#include "socketshr_library:ioctl.h"
+#define TCP_INCLUDES_DONE
+#endif /* SOCKETSHR_TCP */
+
+#ifdef TCPIP_SERVICES
+#include <types.h>
+#include <errno.h>
+#include <time.h>
+#include <ioctl.h>
+#include <socket.h>
+#include <in.h>
+#include <inet.h>
+#include <netdb.h>
+#define TCP_INCLUDES_DONE
+#endif /* TCPIP_SERVICES */
+
+#ifdef WIN_TCP
+#include <types.h>
+#include <errno.h>
+#include <time.h>
+#include <socket.h>
+#include <in.h>
+#include <inet.h>
+#include <netdb.h>
+#ifndef NO_IOCTL
+#include <ioctl.h>
+#endif /* !NO_IOCTL */
+#define TCP_INCLUDES_DONE
+#endif /* WIN_TCP */
+
+#ifndef TCP_INCLUDES_DONE
+#include <types.h>
+#include <errno.h>
+#include <time.h>
+#ifdef VMS_SOCKET_HEADERS
+/*
+ * Not all versions of VMS have the full set of headers
+ * for socket library functions, because the TCP/IP
+ * packages were layered products. If we want these
+ * specifically, instead of those for the above packages,
+ * the module should be compiled with VMS_SOCKET_HEADERS
+ * defined instead of layered product definitions, above.
+ * If the module is not using socket library functions,
+ * none of the definitions need be used, and we include
+ * only the above three headers. - FM
+ */
+#include <socket.h>
+#include <in.h>
+#include <inet.h>
+#include <netdb.h>
+#include <ioctl.h>
+#endif /* VMS_SOCKET_HEADERS */
+#define TCP_INCLUDES_DONE
+#endif /* !TCP_INCLUDES_DONE */
+
+/*
+ * On VMS machines, the linker needs to be told to put global data sections
+ * into a data segment using these storage classes. (MarkDonszelmann)
+ */
+#if defined(VAXC) && !defined(__DECC)
+#define GLOBALDEF globaldef
+#define GLOBALREF globalref
+#else
+#ifdef __GNUC__ /* this added by Sterling Bjorndahl */
+#define GLOBALREF_IS_MACRO 1
+#define GLOBALDEF_IS_MACRO 1
+#include <gnu_hacks.h> /* defines GLOBALREF and GLOBALDEF for GNUC on VMS */
+#endif /* __GNUC__ */
+#endif /* VAXC && !DECC */
+
+#include <perror.h>
+#ifndef errno
+extern int errno;
+#endif /* !errno */
+
+#endif /* VMS */
+
+/*
+ * On non-VMS machines and for DECC on VMS, the GLOBALDEF and GLOBALREF
+ * storage types default to normal C storage types.
+ */
+#ifndef GLOBALREF
+#define GLOBALDEF
+#define GLOBALREF extern
+#endif /* !GLOBALREF */
+
+#ifdef __DJGPP__
+#undef SELECT
+#define TCP_INCLUDES_DONE
+#undef IOCTL
+#define IOCTL(s,cmd,arg) ioctlsocket(s,cmd,(char*)(arg))
+#define DECL_ERRNO
+#include <errno.h>
+#include <sys/types.h>
+#include <io.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <arpa/inet.h>
+#include <tcp.h>
+#ifdef word
+#undef word
+#endif /* word */
+#ifdef set_timeout
+#undef set_timeout
+#endif /* set_timeout */
+#define select select_s
+
+#undef NETWRITE
+#define NETWRITE write_s
+#undef NETREAD
+#define NETREAD read_s
+#undef NETCLOSE
+#define NETCLOSE close_s
+#ifdef UNIX
+#undef UNIX
+#endif /* UNIX */
+#ifdef HAVE_GETTEXT
+#define gettext gettext__
+#endif
+#if !defined(NCURSES) && !defined(USE_SLANG)
+#define HAVE_CBREAK 1
+#endif /* !NCURSES && !USE_SLANG */
+#if defined(USE_SLANG) && !defined(NO_DJ_KEYHANDLER) && defined(HAVE_CONFIG_H)
+#define DJGPP_KEYHANDLER
+#endif /* USE_SLANG && !NO_DJ_KEYHANDLER && HAVE_CONFIG_H */
+#endif /* DJGPP */
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+
+#ifdef HAVE_SYS_FILIO_H
+#include <sys/filio.h>
+#endif /* HAVE_SYS_FILIO_H */
+
+#if !defined(HAVE_LSTAT) && !defined(lstat)
+#define lstat(path,block) stat(path,block)
+#endif
+
+#if defined(DECL_ERRNO) && !defined(errno)
+extern int errno;
+#endif /* DECL_ERRNO */
+
+/*
+Regular BSD unix versions
+=========================
+ These are a default unix where not already defined specifically.
+ */
+#ifndef INCLUDES_DONE
+#include <sys/types.h>
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif /* HAVE_STRING_H */
+#include <errno.h> /* independent */
+#ifdef __MVS__ /* S/390 -- gil -- 1361 */
+#include <time.h>
+#endif /* __MVS__ */
+#ifdef SCO
+#include <sys/timeb.h>
+#include <time.h>
+#endif /* SCO */
+#if defined(AIX) || defined(SVR4)
+#include <time.h>
+#endif /* AIX || SVR4 */
+#include <sys/time.h> /* independent */
+#include <sys/stat.h>
+#ifndef __MVS__ /* S/390 -- gil -- 1373 */
+#include <sys/param.h>
+#endif /* __MVS__ */
+#include <sys/file.h> /* For open() etc */
+
+#if defined(NeXT) || defined(sony_news)
+#ifndef mode_t
+typedef unsigned short mode_t;
+#endif /* !mode_t */
+
+#endif /* NeXT || sony_news */
+
+#define INCLUDES_DONE
+#endif /* Normal includes */
+
+/* FIXME: this should be autoconf'd */
+/* Interactive UNIX for i386 and i486 -- Thanks to jeffrey@itm.itm.org */
+#ifdef ISC
+#include <net/errno.h>
+#include <sys/types.h>
+#include <sys/tty.h>
+#include <sys/sioctl.h>
+#include <sys/bsdtypes.h>
+#ifndef MERGE
+#define MERGE
+#include <sys/pty.h>
+#undef MERGE
+#else
+#include <sys/pty.h>
+#endif /* !MERGE */
+#ifndef USE_DIRENT
+#define USE_DIRENT /* sys V style directory open */
+#endif /* USE_DIRENT */
+#include <sys/dirent.h>
+#endif /* ISC */
+
+/* Directory reading stuff - BSD or SYS V
+*/
+#ifdef HAVE_CONFIG_H
+
+# ifdef HAVE_LIMITS_H
+# include <limits.h>
+# endif /* HAVE_LIMITS_H */
+# if !defined(MAXINT) && defined(INT_MAX)
+# define MAXINT INT_MAX
+# endif /* !MAXINT && INT_MAX */
+
+#else
+
+#if !(defined(VM) || defined(VMS) || defined(THINK_C) || defined(PCNFS) || defined(_WINDOWS))
+#define DECL_SYS_ERRLIST 1
+#endif
+
+#if defined(VMS)
+#define socklen_t unsigned
+#else
+#define socklen_t int /* used for default LY_SOCKLEN definition */
+#endif
+
+#endif /* !HAVE_CONFIG_H */
+
+#ifdef HAVE_LIBINTL_H
+#include <libintl.h>
+#endif
+
+#ifdef HAVE_LIBGETTEXT_H
+#include <libgettext.h>
+#endif
+
+#define N_(s) s
+
+#ifndef HAVE_GETTEXT
+#define gettext(s) s
+#endif
+
+#ifndef NLS_TEXTDOMAIN
+#define NLS_TEXTDOMAIN "lynx"
+#endif
+
+/*
+Defaults
+========
+ INCLUDE FILES FOR TCP
+ */
+#ifndef TCP_INCLUDES_DONE
+#ifndef NO_IOCTL
+#include <sys/ioctl.h> /* EJB */
+#endif /* !NO_IOCTL */
+#include <sys/socket.h>
+#include <netinet/in.h>
+#ifdef HAVE_ARPA_INET_H
+#include <arpa/inet.h> /* Must be after netinet/in.h */
+#endif
+#include <netdb.h>
+#endif /* TCP includes */
+
+typedef unsigned short PortNumber;
+
+#ifndef S_ISLNK
+#define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK)
+#endif /* S_ISLNK */
+
+#ifndef S_ISDIR
+#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
+#endif /* S_ISDIR */
+
+#ifndef S_ISREG
+#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
+#endif /* S_ISREG */
+
+#ifndef S_ISUID
+#define S_ISUID 0004000
+#endif
+#ifndef S_ISGID
+#define S_ISGID 0002000
+#endif
+#ifndef S_ISVTX
+#define S_ISVTX 0001000
+#endif
+
+#ifndef S_IRWXU
+#define S_IRWXU 00700
+#endif
+
+#ifndef S_IRUSR
+#define S_IRUSR 00400
+#endif
+#ifndef S_IWUSR
+#define S_IWUSR 00200
+#endif
+#ifndef S_IXUSR
+#define S_IXUSR 00100
+#endif
+
+#ifndef S_IRWXG
+#define S_IRWXG 00070
+#endif
+
+#ifndef S_IRGRP
+#define S_IRGRP 00040
+#endif
+#ifndef S_IWGRP
+#define S_IWGRP 00020
+#endif
+#ifndef S_IXGRP
+#define S_IXGRP 00010
+#endif
+
+#ifndef S_IRWXO
+#define S_IRWXO 00007
+#endif
+
+#ifndef S_IROTH
+#define S_IROTH 00004
+#endif
+#ifndef S_IWOTH
+#define S_IWOTH 00002
+#endif
+#ifndef S_IXOTH
+#define S_IXOTH 00001
+#endif
+
+/*
+
+ROUGH ESTIMATE OF MAX PATH LENGTH
+
+*/
+#ifndef HT_MAX_PATH
+#ifdef MAXPATHLEN
+#define HT_MAX_PATH MAXPATHLEN
+#else
+#ifdef PATH_MAX
+#define HT_MAX_PATH PATH_MAX
+#else
+#define HT_MAX_PATH 1024 /* Any better ideas? */
+#endif
+#endif
+#endif /* HT_MAX_PATH */
+
+#if HT_MAX_PATH < 256
+#undef HT_MAX_PATH
+#define HT_MAX_PATH 256
+#endif
+
+/*
+ MACROS FOR MANIPULATING MASKS FOR SELECT()
+ */
+#ifdef SELECT
+#ifndef FD_SET
+#ifndef TYPE_FD_SET
+#define TYPE_FD_SET unsigned
+typedef TYPE_FD_SET fd_set;
+#endif /* !TYPE_FD_SET */
+
+#define FD_SET(fd,pmask) (*(pmask)) |= (1 << (fd))
+#define FD_CLR(fd,pmask) (*(pmask)) &= ~(1 << (fd))
+#define FD_ZERO(pmask) (*(pmask)) = 0
+#define FD_ISSET(fd,pmask) (*(pmask) & (1 << (fd)))
+#endif /* !FD_SET */
+#endif /* SELECT */
+
+/*
+ * Macro for setting errno - only define this if you really can do it.
+ */
+#if defined(CAN_SET_ERRNO) || (!defined(errno) && (!defined(VMS) || defined(UCX)))
+#define set_errno(value) errno = value
+#else
+#define set_errno(value) /* we do not know how */
+#endif
+
+/*
+ * IPv6 support
+ */
+#if defined(HAVE_GETADDRINFO) && defined(ENABLE_IPV6)
+#if defined(HAVE_GAI_STRERROR)
+#define INET6
+#elif defined(_WINDOWS)
+#define INET6
+#ifndef WIN_EX
+#error Define "WIN_EX" in your makefile.
+#endif
+#ifndef _MSC_VER /* MSVC has this inlined in <ws2tcpip.h> */
+#undef gai_strerror
+#define gai_strerror(err) w32_strerror (err)
+#endif
+#endif
+#endif /* HAVE_GETADDRINFO && ENABLE_IPV6 */
+
+typedef union {
+ struct sockaddr_in soc_in;
+ struct sockaddr soc_address;
+#ifdef INET6
+ struct sockaddr_storage soc_storage;
+#endif
+} LY_SOCKADDR;
+
+#ifdef INET6
+typedef struct sockaddr_storage SockA;
+
+#define SOCKADDR_OF(param) (&((param).soc_address))
+
+#ifndef SA_LEN
+#define SA_LEN(x) (((x)->sa_family == AF_INET6) \
+ ? sizeof(struct sockaddr_in6) \
+ : (((x)->sa_family == AF_INET) \
+ ? sizeof(struct sockaddr_in) \
+ : sizeof(struct sockaddr))) /* AF_UNSPEC? */
+#endif
+
+#ifdef SIN6_LEN
+#define SOCKADDR_LEN(param) (SOCKADDR_OF(param)->sa_len)
+#else
+#define SOCKADDR_LEN(param) (socklen_t) SA_LEN(SOCKADDR_OF(param))
+#endif /* SIN6_LEN */
+#else
+typedef struct sockaddr_in SockA;
+
+#define SOCKADDR_OF(param) ((struct sockaddr *)&(param))
+#define SOCKADDR_LEN(param) sizeof(param)
+#endif /* INET6 */
+
+#ifndef MAXHOSTNAMELEN
+#define MAXHOSTNAMELEN 128 /* Max label is 63. Should handle 2 of those */
+#endif /* MAXHOSTNAMELEN */
+
+#endif /* TCP_H */
diff --git a/WWW/Library/Implementation/www_wait.h b/WWW/Library/Implementation/www_wait.h
new file mode 100644
index 0000000..3e40e88
--- /dev/null
+++ b/WWW/Library/Implementation/www_wait.h
@@ -0,0 +1,34 @@
+#ifndef WWW_WAIT_H
+#define WWW_WAIT_H 1
+
+#include <HTUtils.h>
+
+#ifdef HAVE_SYS_WAIT_H
+#include <sys/wait.h>
+#endif
+
+#ifndef WEXITSTATUS
+# ifdef HAVE_TYPE_UNIONWAIT
+# define WEXITSTATUS(status) (status.w_retcode)
+# else
+# define WEXITSTATUS(status) (((status) & 0xff00) >> 8)
+# endif
+#endif
+
+#ifndef WTERMSIG
+# ifdef HAVE_TYPE_UNIONWAIT
+# define WTERMSIG(status) (status.w_termsig)
+# else
+# define WTERMSIG(status) ((status) & 0x7f)
+# endif
+#endif
+
+#ifndef WSTOPSIG
+# ifdef HAVE_TYPE_UNIONWAIT
+# define WSTOPSIG(status) (status.w_stopsig)
+# else
+# define WSTOPSIG(status) WEXITSTATUS(status)
+# endif
+#endif
+
+#endif /* WWW_WAIT_H */
diff --git a/WWW/Library/djgpp/CommonMakefile b/WWW/Library/djgpp/CommonMakefile
new file mode 100644
index 0000000..d8d8d20
--- /dev/null
+++ b/WWW/Library/djgpp/CommonMakefile
@@ -0,0 +1,334 @@
+# Common Makefile for W3 Library Code
+# -----------------------------------
+#
+# (c) CERN 1990, 1991 -- see Copyright.html for conditions
+#
+# This file should be invariant between systems.
+# DEPENDENCIES NOT COMPLETE @@
+#
+# make Compile and link the software (private version)
+# make install Copy it into the system (implies make)
+# make update Copy installed version into installed version
+# make uninstall Unlink installed version from the system
+# make clean Remove intermediate files
+# make cleanall Remove intremediate files and products
+#
+# Macros required to be defined already for make:
+#
+# CC The C compiler
+# CFLAGS Flags for $(CC) -- except the -I which are below
+# LFLAGS Flags for ld
+# LYFLAGS Flags for Lynx
+#
+# WWW The WWW source tree directory
+#
+# Macros needed for make install:
+#
+# LIBDIR Directory for installed library
+#______________________________________________________________________
+
+# If this env var is set to something else Some makes will use that instead
+SHELL = /bin/sh
+
+# .h files are distributed but originally are made from the
+# self-documenting hypertext files.
+
+.SUFFIXES: .h .html .htm
+.html.h:
+# - chmod +w $*.h
+# www -w90 -na -to text/x-c $*.html > $*.h
+# chmod -w $*.h
+
+# If this is actually run in a subdirectory,
+#
+WWW = ../..
+# WWW = ../.. For [cernlib] build in this directory
+
+WC = $(WWW)/Library
+CMN = $(WWW)/Library/Implementation/
+VMS = $(CMN)vms
+# Where shall we put the objects and built library?
+
+LOB = $(WTMP)/Library/$(WWW_MACH)
+
+# Only needed if HTWAIS.c is to be compiled. Put into your Makefile.include
+# uncomment these and fill in WAISINC for adding direct wais access
+# to Lynx.
+#HTWAIS = $(LOB)/HTWAIS.o
+#WAIS = YES
+#WAISINC = -I../../../../freeWAIS-0.202/ir
+#WAISCFLAGS = -DDIRECT_WAIS
+#
+
+# This path, if relative, is taken relative to the directory
+# in which this makefile is, not the pwd. This screws up the
+# recursive invocation
+# include $(CMN)Version.make
+include $(ABS)$(WWW)/Library/Implementation/Version.make
+
+# XMOsAIC hack is only for server to cope with xmosaic kludge for mmedia
+#
+# add -DNEW_GATEWAY here for the new gateway config stuff
+CFLAGS2 = $(CFLAGS) $(LYFLAGS) $(WAISCFLAGS) -I$(CMN) -DACCESS_AUTH
+
+CERNLIBBIN = $(WWW)/bin
+
+COMMON = $(LOB)/HTParse.o $(LOB)/HTAccess.o $(LOB)/HTTP.o \
+ $(LOB)/HTFile.o $(LOB)/HTBTree.o $(LOB)/HTFTP.o $(LOB)/HTTCP.o \
+ $(LOB)/SGML.o $(LOB)/HTMLDTD.o $(LOB)/HTChunk.o \
+ $(LOB)/HTPlain.o \
+ $(LOB)/HTMLGen.o \
+ $(LOB)/HTAtom.o $(LOB)/HTAnchor.o $(LOB)/HTStyle.o \
+ $(LOB)/HTList.o $(LOB)/HTString.o $(LOB)/HTDOS.o \
+ $(LOB)/HTRules.o $(LOB)/HTFormat.o $(LOB)/HTMIME.o \
+ $(LOB)/HTNews.o $(LOB)/HTGopher.o \
+ $(LOB)/HTTelnet.o $(LOB)/HTFinger.o $(LOB)/HTWSRC.o $(HTWAIS) \
+ $(LOB)/HTAAUtil.o $(LOB)/HTAABrow.o \
+ $(LOB)/HTGroup.o \
+ $(LOB)/HTAAProt.o \
+ $(LOB)/HTAssoc.o $(LOB)/HTLex.o $(LOB)/HTUU.o
+
+CFILES = $(CMN)HTParse.c $(CMN)HTAccess.c $(CMN)HTTP.c $(CMN)HTFile.c \
+ $(CMN)HTBTree.c \
+ $(CMN)HTFTP.c $(CMN)HTTCP.c $(CMN)SGML.c \
+ $(CMN)HTMLDTD.c \
+ $(CMN)HTPlain.c \
+ $(CMN)HTDOS.c $(CMN)HTMLGen.c \
+ $(CMN)HTChunk.c $(CMN)HTAtom.c $(CMN)HTAnchor.c $(CMN)HTStyle.c \
+ $(CMN)HTList.c $(CMN)HTString.c $(CMN)HTRules.c \
+ $(CMN)HTFormat.c $(CMN)HTMIME.c \
+ $(CMN)HTNews.c $(CMN)HTGopher.c $(CMN)HTTelnet.c \
+ $(CMN)HTFinger.c $(CMN)HTWAIS.c $(CMN)HTWSRC.c \
+ $(CMN)HTAAUtil.c $(CMN)HTAABrow.c \
+ $(CMN)HTGroup.c \
+ $(CMN)HTAAProt.c \
+ $(CMN)HTAssoc.c $(CMN)HTLex.c $(CMN)HTUU.c
+
+HFILES = $(CMN)HTParse.h $(CMN)HTAccess.h $(CMN)HTTP.h $(CMN)HTFile.h \
+ $(CMN)HTBTree.h $(CMN)HTFTP.h $(CMN)HTTCP.h \
+ $(CMN)SGML.h $(CMN)HTML.h $(CMN)HTMLDTD.h $(CMN)HTChunk.h \
+ $(CMN)HTPlain.h \
+ $(CMN)HTFWriter.h $(CMN)HTMLGen.h $(CMN)HTDOS.h \
+ $(CMN)HTStream.h \
+ $(CMN)HTAtom.h $(CMN)HTAnchor.h $(CMN)HTStyle.h \
+ $(CMN)HTList.h \
+ $(CMN)HTString.h $(CMN)HTRules.h \
+ $(CMN)HTFormat.h $(CMN)HTInit.h \
+ $(CMN)HTMIME.h $(CMN)HTNews.h \
+ $(CMN)HTGopher.h \
+ $(CMN)HTUtils.h $(CMN)www_tcp.h $(CMN)HText.h \
+ $(CMN)HTTelnet.h $(CMN)HTFinger.h \
+ $(CMN)HTWAIS.h $(CMN)HTWSRC.h \
+ $(CMN)HTAAUtil.h $(CMN)HTAABrow.h \
+ $(CMN)HTGroup.h \
+ $(CMN)HTAAProt.h \
+ $(CMN)HTAssoc.h $(CMN)HTLex.h $(CMN)HTUU.h
+
+SOURCES = $(CFILES) $(HFILES) $(CMN)Version.make \
+ $(CMN)CommonMakefile $(CMN)Makefile \
+ $(WWW)/README.txt $(WWW)/Copyright.txt $(WWW)/BUILD $(WWW)/Makefile
+SPECIFIC = $(WWW)/All/*/Makefile.include $(WWW)/All/Implementation/Makefile* \
+ $(VMS)/descrip.mms $(VMS)/build_multinet.com \
+ $(VMS)/COPYING.LIB $(VMS)/setup.com $(VMS)/multinet.opt \
+ $(VMS)/HTVMSUtils.h $(VMS)/HTVMSUtils.c
+
+
+# Library
+#
+# On SGI, ranlib is unnecessary and does not exist so we ignore errors
+# for that step
+$(LOB)/libwww.a : $(COMMON)
+ ar r $(LOB)/libwww.a $(COMMON)
+ -ranlib $(LOB)/libwww.a
+
+# Clean up everything generatable except final products
+clean :
+ rm -f $(LOB)/*.o
+
+# Clean up everything generatable including final products
+
+cleanall : clean
+ rm -f $(LOB)/libwww.a
+
+# Install W3 library into system space (not normally necessary)
+
+install : libwww.a
+ if [ ! -r $(LIBDIR) ] mkdir $(LIBDIR)
+ cp libwww.a $(LIBDIR)/libwww.a
+
+uninstall :
+ rm $(LIBDIR)/libwww.a
+
+# Distribution use only:
+# ----------------------
+
+# Needs www version 2.4 or later to do this
+inc : $(HFILES)
+ echo Include files generated from hypertext.
+
+binary : /pub/www/bin/$(WWW_MACH)/libwww_$(VC).a
+ echo FTP archive binary Library $(VC) for $(WWW_MACH) up to date.
+
+
+/pub/www/bin/$(WWW_MACH)/libwww_$(VC).a : libwww.a
+ -mkdir /pub/www/bin/$(WWW_MACH)
+ cp libwww.a /pub/www/bin/$(WWW_MACH)/libwww_$(VC).a
+
+# Source Distribution:
+
+distribute : /pub/www/README.txt /pub/www/Copyright.txt
+ (cd $(WWW)/..; WWW=WWW ABS=`pwd`/ make $(MFLAGS) \
+ -f WWW/Library/Implementation/CommonMakefile \
+ /pub/www/src/WWWLibrary_$(VC).tar.Z)
+ (cd ../Implementation; cvs tag \
+ `sed -e 's/VC = /v/' Version.make | sed -e 's?\.?/?'` )
+ echo Distribution of Library version $(VC) up to date.
+
+/pub/www/src/WWWLibrary_$(VC).tar.Z : $(SOURCES)
+ tar cf /pub/www/src/WWWLibrary_$(VC).tar \
+ $(SOURCES) $(SPECIFIC) $(WC)/*/Makefile
+ compress /pub/www/src/WWWLibrary_$(VC).tar
+
+
+# Hypertext supplied in text format
+# ---------------------------------
+
+$(WWW)/README.txt : $(WWW)/../README.html
+ www -n -p66 http://www.w3.org/hypertext/README.html \
+ > $(WWW)/README.txt
+/pub/www/README.txt : $(WWW)/README.txt
+ cp $(WWW)/README.txt /pub/www/README.txt
+
+$(WWW)/Copyright.txt : $(WWW)/../Copyright.html
+ www -n -p66 http://www.w3.org/hypertext/Copyright.html \
+ > $(WWW)/Copyright.txt
+/pub/www/Copyright.txt : $(WWW)/Copyright.txt
+ cp $(WWW)/Copyright.txt /pub/www/Copyright.txt
+
+# Common code
+# -----------
+
+# Directory for object files
+
+$(LOB)/HTList.o : $(OE) $(CMN)HTList.c $(CMN)HTUtils.h $(CMN)HTList.h
+ $(CC) -c $(CFLAGS2) $(CMN)HTList.c
+
+$(LOB)/HTAnchor.o : $(OE) $(CMN)HTAnchor.c $(CMN)HTUtils.h $(CMN)HTList.h
+ $(CC) -c $(CFLAGS2) $(CMN)HTAnchor.c
+
+$(LOB)/HTFormat.o : $(OE) $(CMN)HTFormat.c $(CMN)HTUtils.h $(CMN)HTList.h
+ $(CC) -c $(CFLAGS2) $(CMN)HTFormat.c
+
+$(LOB)/HTMIME.o : $(OE) $(CMN)HTMIME.c $(CMN)HTUtils.h $(CMN)HTList.h
+ $(CC) -c $(CFLAGS2) $(CMN)HTMIME.c
+
+$(LOB)/HTDOS.o : $(OE) $(CMN)HTDOS.c $(CMN)HTUtils.h $(CMN)../../../userdefs.h
+ $(CC) -c $(CFLAGS2) $(CMN)HTDOS.c
+
+$(LOB)/HTNews.o : $(OE) $(CMN)HTNews.c $(CMN)HTUtils.h $(CMN)HTList.h\
+ $(CMN)HTMLDTD.h
+ $(CC) -c $(CFLAGS2) $(CMN)HTNews.c
+
+$(LOB)/HTGopher.o : $(OE) $(CMN)HTGopher.c $(CMN)HTUtils.h $(CMN)HTList.h \
+ $(CMN)HTMLDTD.h
+ $(CC) -c $(CFLAGS2) $(CMN)HTGopher.c
+
+$(LOB)/HTTelnet.o : $(OE) $(CMN)HTTelnet.c $(CMN)HTUtils.h $(CMN)HTTelnet.h $(CMN)../../../userdefs.h
+ $(CC) -c $(CFLAGS2) $(CMN)HTTelnet.c
+
+$(LOB)/HTFinger.o : $(OE) $(CMN)HTFinger.c $(CMN)HTUtils.h $(CMN)HTList.h \
+ $(CMN)HTMLDTD.h
+ $(CC) -c $(CFLAGS2) $(CMN)HTFinger.c
+
+$(LOB)/HTStyle.o : $(OE) $(CMN)HTStyle.c $(CMN)HTUtils.h
+ $(CC) -c $(CFLAGS2) $(CMN)HTStyle.c
+
+$(LOB)/HTAtom.o : $(OE) $(CMN)HTAtom.c $(CMN)HTUtils.h $(CMN)HTList.h
+ $(CC) -c $(CFLAGS2) $(CMN)HTAtom.c
+
+$(LOB)/HTChunk.o : $(OE) $(CMN)HTChunk.c $(CMN)HTUtils.h
+ $(CC) -c $(CFLAGS2) $(CMN)HTChunk.c
+
+$(LOB)/HTString.o : $(OE) $(CMN)HTString.c $(CMN)HTUtils.h $(CMN)Version.make
+ $(CC) -c $(CFLAGS2) -DVC=\"$(VC)\" $(CMN)HTString.c
+
+$(LOB)/HTRules.o : $(OE) $(CMN)HTRules.c $(CMN)HTUtils.h $(CMN)Version.make \
+ $(CMN)HTAAProt.h
+ $(CC) -c $(CFLAGS2) -DVC=\"$(VC)\" $(CMN)HTRules.c
+
+$(LOB)/SGML.o : $(OE) $(CMN)SGML.c $(CMN)HTUtils.h
+ $(CC) -c $(CFLAGS2) $(CMN)SGML.c
+
+$(LOB)/HTMLGen.o : $(OE) $(CMN)HTMLGen.c $(CMN)HTUtils.h $(CMN)HTMLDTD.h
+ $(CC) -c $(CFLAGS2) $(CMN)HTMLGen.c
+
+$(LOB)/HTMLDTD.o : $(OE) $(CMN)HTMLDTD.c $(CMN)SGML.h
+ $(CC) -c $(CFLAGS2) $(CMN)HTMLDTD.c
+
+$(LOB)/HTPlain.o : $(OE) $(CMN)HTPlain.c $(CMN)HTPlain.h $(CMN)HTStream.h
+ $(CC) -c $(CFLAGS2) $(CMN)HTPlain.c
+
+$(LOB)/HTWAIS.o : $(OE) $(CMN)HTWAIS.c $(CMN)HTUtils.h $(CMN)HTList.h
+ $(CC) -c $(CFLAGS2) $(WAISINC) $(CMN)HTWAIS.c
+
+$(LOB)/HTWSRC.o : $(OE) $(CMN)HTWSRC.c $(CMN)HTUtils.h $(CMN)HTList.h
+ $(CC) -c $(CFLAGS2) $(CMN)HTWSRC.c
+
+# Access Authorization
+
+$(LOB)/HTAAUtil.o : $(OE) $(CMN)HTAAUtil.c $(CMN)HTAAUtil.h \
+ $(CMN)HTUtils.h $(CMN)HTString.h
+ $(CC) -c $(CFLAGS2) $(CMN)HTAAUtil.c
+
+$(LOB)/HTGroup.o : $(OE) $(CMN)HTGroup.c $(CMN)HTGroup.h \
+ $(CMN)HTAAUtil.h \
+ $(CMN)HTAssoc.h $(CMN)HTLex.h
+ $(CC) -c $(CFLAGS2) $(CMN)HTGroup.c
+
+$(LOB)/HTAABrow.o : $(OE) $(CMN)HTAABrow.c $(CMN)HTAABrow.h \
+ $(CMN)HTAAUtil.h $(CMN)HTUU.h \
+ $(CMN)HTUtils.h $(CMN)HTString.h \
+ $(CMN)HTParse.h $(CMN)HTList.h \
+ $(CMN)HTAssoc.h
+ $(CC) -c $(CFLAGS2) $(CMN)HTAABrow.c
+
+$(LOB)/HTAAProt.o : $(OE) $(CMN)HTAAProt.c $(CMN)HTAAProt.h \
+ $(CMN)HTUtils.h $(CMN)HTAAUtil.h \
+ $(CMN)HTAssoc.h $(CMN)HTLex.h
+ $(CC) -c $(CFLAGS2) $(CMN)HTAAProt.c
+
+$(LOB)/HTAssoc.o : $(OE) $(CMN)HTAssoc.c $(CMN)HTAssoc.h \
+ $(CMN)HTUtils.h $(CMN)HTString.h $(CMN)HTList.h
+ $(CC) -c $(CFLAGS2) $(CMN)HTAssoc.c
+
+$(LOB)/HTLex.o : $(OE) $(CMN)HTLex.c $(CMN)HTLex.h $(CMN)HTUtils.h
+ $(CC) -c $(CFLAGS2) $(CMN)HTLex.c
+
+$(LOB)/HTUU.o : $(OE) $(CMN)HTUU.c $(CMN)HTUU.h $(CMN)HTUtils.h
+ $(CC) -c $(CFLAGS2) $(CMN)HTUU.c
+
+
+# Communications & Files
+
+$(LOB)/HTTP.o : $(OE) $(CMN)HTTP.c $(CMN)HTUtils.h $(CMN)HTAABrow.h
+ $(CC) -c $(CFLAGS2) $(CMN)HTTP.c
+
+$(LOB)/HTTCP.o : $(OE) $(CMN)HTTCP.c $(CMN)HTUtils.h
+ $(CC) -c $(CFLAGS2) $(CMN)HTTCP.c
+
+$(LOB)/HTFile.o : $(OE) $(CMN)HTFile.c $(CMN)HTUtils.h \
+ $(CMN)HTMLDTD.h
+ $(CC) -c $(CFLAGS2) $(CMN)HTFile.c
+
+$(LOB)/HTBTree.o : $(OE) $(CMN)HTBTree.c $(CMN)HTUtils.h
+ $(CC) -c $(CFLAGS2) $(CMN)HTBTree.c
+
+$(LOB)/HTFTP.o : $(OE) $(CMN)HTFTP.c $(CMN)HTUtils.h
+ $(CC) -c $(CFLAGS2) $(CMN)HTFTP.c
+
+$(LOB)/HTAccess.o : $(OE) $(CMN)HTAccess.c $(CMN)HTUtils.h
+ $(CC) -c $(CFLAGS2) $(CMN)HTAccess.c
+
+$(LOB)/HTParse.o : $(OE) $(CMN)HTParse.c $(CMN)HTUtils.h
+ $(CC) -c $(CFLAGS2) $(CMN)HTParse.c
+
diff --git a/WWW/Library/djgpp/makefile b/WWW/Library/djgpp/makefile
new file mode 100644
index 0000000..f46ad1f
--- /dev/null
+++ b/WWW/Library/djgpp/makefile
@@ -0,0 +1,59 @@
+# Make WWW under unix for a.n.other unix system (bsd)
+# Use this as a template
+
+# For W3 distribution, machine type for subdirectories
+WWW_MACH = djgpp
+
+# The ASIS repository's name for the machine we are on
+#ASIS_MACH = hardware/os
+
+# Use this option to enable optional and *experimental* color style.
+#ENABLE_COLOR_STYLE = -DUSE_COLOR_STYLE
+
+# comment this line to suppress DIRED support
+DIRED_DEFS = -DDIRED_SUPPORT
+
+CFLAGS= -O2 $(MCFLAGS) $(INTLFLAGS) $(SSLFLAGS) $(SSLINC)
+
+MCFLAGS = \
+ $(DIRED_DEFS) \
+ $(ENABLE_COLOR_STYLE) \
+ -DDISP_PARTIAL \
+ -DDOSPATH \
+ -DUSE_FILE_UPLOAD \
+ -DNOUSERS \
+ -DUSE_SOURCE_CACHE \
+ -DUSE_PRETTYSRC \
+ -DUSE_ZLIB \
+ -I../Implementation \
+ -I../../../src \
+ -I../../.. \
+ -I/djgpp/pdcur26 \
+ -I/djgpp/watt32/inc
+
+LFLAGS =
+CC = gcc
+
+# Uncomment the following to enable Internationalization.
+#INTLFLAGS = -DHAVE_GETTEXT -DHAVE_LIBINTL_H
+
+# Uncomment the following to enable SSL.
+#SSLFLAGS = -DUSE_SSL
+#SSLINC = -I/dev/env/DJDIR/include/openssl
+
+# Directory for installed binary:
+!BINDIR = /usr/local/bin
+
+# Where is the W3 object library to be installed (not normally done)?
+LIBDIR = $(WWW)/Library/Implementation/$(WWW_MACH)
+
+#_________________ OK if normal W3 distribution
+# Where is the WWW source root?
+WWW = ../..
+
+# Where should temporary (object) files go?
+WTMP = ../..
+
+include $(WWW)/Library/Implementation/Version.make
+#include $(WWW)/Library/Implementation/CommonMakefile
+include ./CommonMakefile
diff --git a/WWW/Library/djgpp/makefile.sla b/WWW/Library/djgpp/makefile.sla
new file mode 100644
index 0000000..79e87b8
--- /dev/null
+++ b/WWW/Library/djgpp/makefile.sla
@@ -0,0 +1,40 @@
+# Make WWW under unix for a.n.other unix system (bsd)
+# Use this as a template
+
+# For W3 distribution, machine type for subdirectories
+WWW_MACH = djgpp
+
+# The ASIS repository's name for the machine we are on
+#ASIS_MACH = hardware/os
+
+CFLAGS = -O2 -DUSE_SLANG -DUSE_ZLIB -DDOSPATH -DNOUSERS -DDISP_PARTIAL \
+-DDIRED_SUPPORT -DUSE_SOURCE_CACHE -DUSE_PRETTYSRC \
+-I../Implementation \
+-I/dev/env/DJDIR/watt32/inc \
+-I../../../src \
+-I../../.. $(SLANGINC) $(INTLFLAGS) $(SSLFLAGS) $(SSLINC)
+
+LFLAGS =
+CC = gcc
+#INTLFLAGS = -DHAVE_GETTEXT -DHAVE_LIBINTL_H
+
+# Uncomment the following to enable SSL.
+#SSLFLAGS = -DUSE_SSL
+#SSLINC = -I/dev/env/DJDIR/include/openssl
+
+# Directory for installed binary:
+!BINDIR = /usr/local/bin
+
+# Where is the W3 object library to be installed (not normally done)?
+LIBDIR = $(WWW)/Library/Implementation/$(WWW_MACH)
+
+#_________________ OK if normal W3 distribution
+# Where is the WWW source root?
+WWW = ../..
+
+# Where should temporary (object) files go?
+WTMP = ../..
+
+include $(WWW)/Library/Implementation/Version.make
+#include $(WWW)/Library/Implementation/CommonMakefile
+include ./CommonMakefile
diff --git a/WWW/Library/vms/COPYING.LIB b/WWW/Library/vms/COPYING.LIB
new file mode 100644
index 0000000..5bc8fb2
--- /dev/null
+++ b/WWW/Library/vms/COPYING.LIB
@@ -0,0 +1,481 @@
+ GNU LIBRARY GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1991 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the library GPL. It is
+ numbered 2 because it goes with version 2 of the ordinary GPL.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Library General Public License, applies to some
+specially designated Free Software Foundation software, and to any
+other libraries whose authors decide to use it. You can use it for
+your libraries, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if
+you distribute copies of the library, or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link a program with the library, you must provide
+complete object files to the recipients so that they can relink them
+with the library, after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ Our method of protecting your rights has two steps: (1) copyright
+the library, and (2) offer you this license which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ Also, for each distributor's protection, we want to make certain
+that everyone understands that there is no warranty for this free
+library. If the library is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original
+version, so that any problems introduced by others will not reflect on
+the original authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that companies distributing free
+software will individually obtain patent licenses, thus in effect
+transforming the program into proprietary software. To prevent this,
+we have made it clear that any patent must be licensed for everyone's
+free use or not licensed at all.
+
+ Most GNU software, including some libraries, is covered by the ordinary
+GNU General Public License, which was designed for utility programs. This
+license, the GNU Library General Public License, applies to certain
+designated libraries. This license is quite different from the ordinary
+one; be sure to read it in full, and don't assume that anything in it is
+the same as in the ordinary license.
+
+ The reason we have a separate public license for some libraries is that
+they blur the distinction we usually make between modifying or adding to a
+program and simply using it. Linking a program with a library, without
+changing the library, is in some sense simply using the library, and is
+analogous to running a utility program or application program. However, in
+a textual and legal sense, the linked executable is a combined work, a
+derivative of the original library, and the ordinary General Public License
+treats it as such.
+
+ Because of this blurred distinction, using the ordinary General
+Public License for libraries did not effectively promote software
+sharing, because most developers did not use the libraries. We
+concluded that weaker conditions might promote sharing better.
+
+ However, unrestricted linking of non-free programs would deprive the
+users of those programs of all benefit from the free status of the
+libraries themselves. This Library General Public License is intended to
+permit developers of non-free programs to use free libraries, while
+preserving your freedom as a user of such programs to change the free
+libraries that are incorporated in them. (We have not seen how to achieve
+this as regards changes in header files, but we have achieved it as regards
+changes in the actual functions of the Library.) The hope is that this
+will lead to faster development of free libraries.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, while the latter only
+works together with the library.
+
+ Note that it is possible for a library to be covered by the ordinary
+General Public License rather than by this special one.
+
+ GNU LIBRARY GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library which
+contains a notice placed by the copyright holder or other authorized
+party saying it may be distributed under the terms of this Library
+General Public License (also called "this License"). Each licensee is
+addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also compile or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ c) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ d) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the source code distributed need not include anything that is normally
+distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Library General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
diff --git a/WWW/Library/vms/descrip.mms b/WWW/Library/vms/descrip.mms
new file mode 100644
index 0000000..fe275bb
--- /dev/null
+++ b/WWW/Library/vms/descrip.mms
@@ -0,0 +1,206 @@
+! Make WorldWideWeb LIBRARY under VMS
+! =======================================================
+!
+! History:
+! 14 Aug 91 (TBL) Reconstituted
+! 25 Jun 92 (JFG) Added TCP socket emulation over DECnet
+! 07 Sep 93 (MD) Remade for version 2.09a
+! 10 Dec 93 (FM) Upgrade for version 2.14 with Lynx v2.1
+! 13 Dec 93 (FM) Added conditional compilations for VAXC vs. DECC
+! (MMS can't handle a MODULE list as large as the
+! WWWLibrary has become, so this just illustrates
+! how you'd set it up if it could 8-).
+! 26 Oct 94 (RLD) Updated to work with VAX/VMS v5.5-1 and AXP/VMS v6.1
+! 31 Oct 94 (RLD) Updated for Lynx v2.3.4, supporting OpenCMU and
+! TCPWare
+! 18 Nov 94 (FM) Updated for SOCKETSHR/NETLIB
+! 07 Dec 94 (FM) Updated for DECC/VAX, VAXC/VAX and DECC/AXP
+! 03 May 95 (FM) Include /NoMember for DECC (not the default on AXP,
+! and the code assumes byte alignment).
+! 07 Jul 95 (FM) Added GNUC support.
+! 15 Sep 06 (TD) Cleanup...
+!
+! Bugs:
+! The dependencies are anything but complete - they were
+! just enough to allow the files to be compiled.
+!
+! Instructions:
+! Copy [WWW.LIBRARY.VMS]DESCRIP.MMS into [WWW.LIBRARY.IMPLEMENTATION]
+! Use the correct command line for your TCP/IP implementation,
+! inside the IMPLEMENTATION directory:
+!
+! $ MMS/MACRO=(MULTINET=1) for VAXC - MultiNet
+! $ MMS/MACRO=(WIN_TCP=1) for VAXC - Wollongong TCP/IP
+! $ MMS/MACRO=(UCX=1) for VAXC - UCX
+! $ MMS/MACRO=(CMU_TCP=1) for VAXC - OpenCMU TCP/IP
+! $ MMS/MACRO=(SOCKETSHR_TCP=1) for VAXC - SOCKETSHR/NETLIB
+! $ MMS/MACRO=(TCPWARE=1) for VAXC - TCPWare TCP/IP
+! $ MMS/MACRO=(DECNET=1) for VAXC - socket emulation over DECnet
+!
+! $ MMS/MACRO=(MULTINET=1,DEC_C=1) for DECC - MultiNet
+! $ MMS/MACRO=(WIN_TCP=1,DEC_C=1) for DECC - Wollongong TCP/IP
+! $ MMS/MACRO=(UCX=1,DEC_C=1) for DECC - UCX
+! $ MMS/MACRO=(CMU_TCP=1,DEC_C=1) for DECC - OpenCMU TCP/IP
+! $ MMS/MACRO=(SOCKETSHR_TCP=1,DEC_C=1) for DECC - SOCKETSHR/NETLIB
+! $ MMS/MACRO=(TCPWARE=1,DEC_C=1) for DECC - TCPWare TCP/IP
+! $ MMS/MACRO=(DECNET=1,DEC_C=1) for DECC - socket emulation over DECnet
+!
+! $ MMS/MACRO=(MULTINET=1,GNU_C=1) for GNUC - MultiNet
+! $ MMS/MACRO=(WIN_TCP=1,GNU_C=1) for GNUC - Wollongong TCP/IP
+! $ MMS/MACRO=(UCX=1,GNU_C=1) for GNUC - UCX
+! $ MMS/MACRO=(CMU_TCP=1,GNU_C=1) for GNUC - OpenCMU TCP/IP
+! $ MMS/MACRO=(SOCKETSHR_TCP=1,GNU_C=1) for GNUC - SOCKETSHR/NETLIB
+! $ MMS/MACRO=(TCPWARE=1,GNU_C=1) for GNUC - TCPWare TCP/IP
+! $ MMS/MACRO=(DECNET=1,GNU_C=1) for GNUC - socket emulation over DECnet
+!
+! To compile with debug mode:
+!
+! $ MMS/MACRO=(MULTINET=1, DEBUG=1) for Multinet
+!
+!
+! If you are on HEP net and want to build using the really latest sources on
+! PRIAM:: then define an extra macro U=PRIAM::, e.g.
+!
+! $ MMS/MACRO=(MULTINET=1, U=PRIAM::) for Multinet
+!
+! This will copy the sources from PRIAM as necessary. You can also try
+!
+! $ MMS/MACRO=(U=PRIAM::) descrip.mms
+!
+! to update this file.
+
+
+.include Version.make
+
+! debug flags
+.ifdef DEBUG
+DEBUGFLAGS = /Debug /NoOptimize
+.endif
+
+INCLUDES = /Include=([-.Implementation],[---.src],[---])
+
+! defines valid for all compilations
+EXTRADEFINES = ACCESS_AUTH, VC="""$(VC)"""
+
+.ifdef WIN_TCP
+NETWORK_DEF = WIN_TCP
+.else
+.ifdef CMU_TCP
+NETWORK_DEF = CMU_TCP
+.else
+.ifdef SOCKETSHR_TCP
+NETWORK_DEF = SOCKETSHR_TCP
+.else
+.ifdef UCX
+NETWORK_DEF = UCX
+.else
+.ifdef TCPWARE
+NETWORK_DEF = TCPWARE,UCX
+.else
+.ifdef DECnet
+NETWORK_DEF = DECNET
+.else ! Default to MultiNet
+NETWORK_DEF = MULTINET
+.endif ! DECnet
+.endif ! TCPWARE
+.endif ! UCX
+.endif ! SOCKETSHR_TCP
+.endif ! CMU_TCP
+.endif ! WIN_TCP
+
+! DECC flags for all compilations
+.ifdef DEC_C
+MY_CFLAGS = /decc/Prefix=All /NoMember /Warning=(disable=implicitfunc) $(INCLUDES)
+.else
+MY_CFLAGS = $(INCLUDES)
+.endif
+
+CFLAGS = $(DEBUGFLAGS) $(MY_CFLAGS) /Define=($(EXTRADEFINES), $(NETWORK_DEF))
+
+.ifdef GNU_C
+CC = gcc
+.endif
+
+!HEADERS = HTUtils.h, HTStream.h, www_tcp.h, HText.h -
+! HTParse.h, HTAccess.h, HTTP.h, HTFile.h, -
+! HTBTree.h, HTTCP.h, SGML.h, -
+! HTML.h, HTMLDTD.h, HTChunk.h, HTPlain.h, -
+! HTFwriter.h, HTMLGen.h, -
+! HTAtom.h, HTAnchor.h, HTStyle.h, -
+! HTList.h, HTString.h, HTAlert.h, -
+! HTRules.h, HTFormat.h, HTInit.h, -
+! HTMIME.h, HTTelnet.h, -
+! HTFinger.h, HTAABrow.h, -
+! HTAAProt.h, HTAAUtil.h, -
+! HTAssoc.h, HTUU.h, -
+! HTVMSUtils.h,
+
+MODULES = HTParse, HTAccess, HTTP, HTFile, HTBTree, HTFTP, HTTCP, HTString, -
+ SGML, HTMLDTD, HTChunk, HTPlain, HTMLGen, -
+ HTAtom, HTAnchor, HTStyle, HTList, HTRules, HTFormat, -
+ HTMIME, HTNews, HTGopher, HTTelnet, HTFinger, -
+ HTWSRC, HTAAUtil, HTAABrow, HTGroup, -
+ HTAAProt, HTAssoc, HTLex, HTUU, HTVMSUtils, -
+ HTWAIS, HTVMS_WaisUI, HTVMS_WaisProt
+
+!.ifdef DECNET ! Strip FTP, Gopher, News, WAIS
+!HEADERS = $(COMMON_HEADERS)
+!MODULES = $(COMMON_MODULES)
+!.else
+!HEADERS = $(COMMON_HEADERS), $(EXTRA_HEADERS), $(WAIS_HEADER)
+!MODULES = $(COMMON_MODULES), $(EXTRA_MODULES), $(WAIS_MODULE)
+!.endif
+
+!___________________________________________________________________
+! WWW Library
+
+!library : $(HEADERS) wwwlib($(MODULES))
+library : wwwlib($(MODULES))
+ @ Continue
+
+build_www.com : descrip.mms
+ $(MMS) /NoAction /From_Sources /Output = build_www.com /Macro = ($(NETWORK_DEF)=1)
+
+clean :
+ - Set Protection = (Owner:RWED) *.*;-1
+ - Purge /NoLog /NoConfirm
+ - Delete /NoLog /NoConfirm *.obj;,*.olb;
+
+!___________________________________________________________________
+! Simple Dependencies
+
+
+!HTString.obj : HTString.c HTString.h www_tcp.h Version.make HTUtils.h
+!HTAtom.obj : HTAtom.c HTAtom.h HTUtils.h HTString.h
+!HTChunk.obj : HTChunk.c HTChunk.h HTUtils.h
+!HTList.obj : HTList.c HTList.h HTUtils.h
+!HTBTree.obj : HTBTree.c HTBTree.h HTUtils.h
+!HTMLDTD.obj : HTMLDTD.c HTMLDTD.h SGML.h
+!HTPlain.obj : HTPlain.c HTPlain.h HTStream.h
+!HTMLGen.obj : HTMLGen.c HTMLGen.h HTUtils.h HTMLDTD.h
+!HTRules.obj : HTRules.c HTRules.h HTUtils.h Version.make
+!HTMIME.obj : HTMIME.c HTMIME.h HTUtils.h HTList.h
+!HTTelnet.obj : HTTelnet.c HTTelnet.h HTUtils.h
+!HTWAIS.obj : HTWAIS.c HTWAIS.h HTUtils.h HTList.h
+!HTWSRC.obj : HTWSRC.c HTWSRC.h HTUtils.h HTList.h
+!HTAccess.obj : HTAccess.c HTAccess.h HTUtils.h
+!HTAnchor.obj : HTAnchor.c HTAnchor.h HTUtils.h HTList.h
+!HTFile.obj : HTFile.c HTFile.h HTUtils.h HTVMSUtils.h
+!HTFormat.obj : HTFormat.c HTFormat.h HTUtils.h HTML.h SGML.h HTPlain.h HTMLGen.h HTList.h
+!HTFTP.obj : HTFTP.c HTFTP.h HTUtils.h
+!HTGopher.obj : HTGopher.c HTGopher.h HTUtils.h HTList.h
+!HTFinger.obj : HTFinger.c HTFinger.h HTUtils.h HTList.h
+!HTNews.obj : HTNews.c HTNews.h HTUtils.h HTList.h
+!HTParse.obj : HTParse.c HTParse.h HTUtils.h
+!HTStyle.obj : HTStyle.c HTStyle.h HTUtils.h
+!HTTCP.obj : HTTCP.c HTTCP.h HTUtils.h www_tcp.h
+!HTTP.obj : HTTP.c HTTP.h HTUtils.h
+!SGML.obj : SGML.c SGML.h HTUtils.h
+!HTAABrow.obj : HTAABrow.c HTUtils.h
+!HTAAProt.obj : HTAAProt.c HTUtils.h
+!HTAAUtil.obj : HTAAUtil.c HTUtils.h
+!HTGroup.obj : HTGroup.c HTUtils.h
+!HTLex.obj : HTLex.c HTUtils.h
+!HTAssoc.obj : HTAssoc.c HTAssoc.h HTAAUtil.h HTString.h
+!HTUU.obj : HTUU.c HTUU.h HTUtils.h
+!HTVMSUtils.obj : HTVMSUtils.c HTVMSUtils.h HTUtils.h
diff --git a/WWW/Library/vms/libmake.com b/WWW/Library/vms/libmake.com
new file mode 100644
index 0000000..6ef7c07
--- /dev/null
+++ b/WWW/Library/vms/libmake.com
@@ -0,0 +1,233 @@
+$ v0 = 0
+$ v = f$verify(v0)
+$! $LynxId: libmake.com,v 1.15 2011/05/23 23:58:48 tom Exp $
+$! LIBMAKE.COM
+$!
+$! Command file to build the WWWLibrary on VMS systems.
+$!
+$! 11-Jul-2010 Ch. Gartmann
+$! add support for "MULTINETUCX"
+$! 01-Jul-2007 T.Dickey
+$! add support for "TCPIP" (TCPIP Services)
+$! 23-Oct-2004 T.Dickey
+$! cleanup, remove duplication, etc.
+$! 08-Oct-1997 F.Macrides macrides@sci.wfeb.edu
+$! Added comments and minor tweaks for convenient addition of
+$! compiler definitions and compiler and linker options.
+$! 26-Jul-1995 F.Macrides macrides@sci.wfeb.edu
+$! Adding support for GNUC.
+$! 03-May-1995 F.Macrides macrides@sci.wfeb.edu
+$! Include /nomember for compilations with DECC. It's not the
+$! default on AXP and the code assumes byte alignment.
+$! 07-Dec-1994 F.Macrides macrides@sci.wfeb.edu
+$! Updated for DECC/VAX, VAXC/VAX and DECC/AXP
+$! 03-NOV-1994 A.Harper A.Harper@kcl.ac.uk
+$! Mods to support SOCKETSHR/NETLIB and add a /DEBUG/NOOPT option
+$! 02-Jun-1994 F.Macrides macrides@sci.wfeb.edu
+$! Mods to support TCPWare (To use non-blocking connects, you need
+$! the DRIVERS_V405B.INC patch from FTP.PROCESS.COM for TCPware for
+$! OpenVMS Version 4.0-5, or a higher version of TCPWare, which will
+$! have that bug in the TCPDRIVER fixed. Otherwise, add NO_IOCTL to
+$! the /define=(...) list.)
+$! 20-May-1994 Andy Harper A.Harper@bay.cc.kcl.ac.uk
+$! Added support for the CMU TCP/IP transport
+$! 13-Dec-1993 F.Macrides macrides@sci.wfeb.edu
+$! Mods for conditional compilations with VAXC versus DECC
+$! 10-Dec-1993 F.Macrides macrides@sci.wfeb.edu
+$! Initial version, for WWWLibrary v2.14 with Lynx v2.1
+$!
+$ ON CONTROL_Y THEN GOTO CLEANUP
+$ ON ERROR THEN GOTO CLEANUP
+$!
+$! Compiler definitions can be added here as a comma separated
+$! list with a lead comma, e.g., ",HAVE_FOO_H,DO_BLAH". They
+$! will apply only to the libwww-FM modules. - FM
+$!
+$ extra_defs = ",ACCESS_AUTH"
+$!
+$! Include-paths can be added here as a comma separated
+$! list with a lead comma, e.g., ",foo".
+$!
+$ extra_incs = ""
+$!
+$ extra_libs = ""
+$!
+$! If no TCP/IP agent is specified (as the first argument),
+$! prompt for a number from the list. Note that the agent
+$! must be the first argument if the debugger mode is to be
+$! set via a second argument (see below). - FM
+$!
+$ agent = 0
+$ IF P1 .EQS. ""
+$ THEN
+$ write sys$output "Acceptable TCP/IP agents are"
+$ write sys$output " [1] MultiNet (default)"
+$ write sys$output " [2] UCX"
+$ write sys$output " [3] WIN_TCP"
+$ write sys$output " [4] CMU_TCP"
+$ write sys$output " [5] SOCKETSHR_TCP"
+$ write sys$output " [6] TCPWARE"
+$ write sys$output " [7] DECNET"
+$ write sys$output " [8] TCPIP"
+$ write sys$output " [9] Multinet UCX emulation"
+$ read sys$command/prompt="Agent [1,2,3,4,5,6,7,8,9] (RETURN = [1]) " agent
+$ ENDIF
+$ if agent .eq. 1 .or. agent .eqs. "" .or. p1 .eqs. "MULTINET" then -
+ transport = "MULTINET"
+$ if agent .eq. 2 .or. p1 .eqs. "UCX" then transport = "UCX"
+$ if agent .eq. 3 .or. p1 .eqs. "WIN_TCP" then transport = "WIN_TCP"
+$ if agent .eq. 4 .or. p1 .eqs. "CMU_TCP" then transport = "CMU_TCP"
+$ if agent .eq. 5 .or. p1 .eqs. "SOCKETSHR_TCP" then transport = "SOCKETSHR_TCP"
+$ if agent .eq. 6 .or. p1 .eqs. "TCPWARE" then transport = "TCPWARE"
+$ if agent .eq. 7 .or. p1 .eqs. "DECNET" then transport = "DECNET"
+$ if agent .eq. 8 .or. p1 .eqs. "TCPIP" then transport = "TCPIP"
+$ IF agent .EQ. 9 .OR. P1 .EQS. "MULTINETUCX"
+$ THEN
+$ transport = "UCX"
+$ extra_defs = extra_defs + ",MUCX"
+$ ENDIF
+$!
+$ if transport .eqs. "SOCKETSHR_TCP" then extra_defs = extra_defs + ",_DECC_V4_SOURCE"
+$ if transport .eqs. "TCPIP" then extra_defs = extra_defs + ",TCPIP_SERVICES"
+$ if transport .eqs. "TCPWARE" then extra_defs = extra_defs + ",UCX"
+$!
+$ if option .eqs. "TCPIP"
+$ then
+$ if f$trnlnm("TCPIP$IPC_SHR") .eqs. "" then define TCPIP$IPC_SHR SYS$LIBRARY:TCPIP$IPC_SHR
+$ endif
+$!
+$ if P2 .nes. ""
+$ then
+$ count_parm = 0
+$ parse_p2:
+$ value_parm = f$element('count_parm, ",", "''p2'")
+$ if value_parm .nes. ","
+$ then
+$ if value_parm .eqs. "BZLIB"
+$ then
+$ write sys$output "** adding BZlib to build."
+$ extra_defs = extra_defs + ",USE_BZLIB"
+$ extra_incs = extra_incs + "," + BZLIB_INC
+$ extra_libs = extra_libs + "," + BZLIB_LIB + "libbz2/LIB"
+$ endif
+$ if value_parm .eqs. "SLANG"
+$ then
+$ write sys$output "** adding SLang to build."
+$ extra_defs = extra_defs + ",USE_SLANG"
+$ extra_incs = extra_incs + "," + SLANG_INC
+$ extra_libs = extra_libs + "," + SLANG_LIB + "slang.olb/lib"
+$ endif
+$ if value_parm .eqs. "SSL"
+$ then
+$ write sys$output "** adding SSL to build."
+$ IF F$TYPE( ssl_lib ) .EQS. "" THEN ssl_lib = F$TRNLNM("SSLLIB")
+$ IF F$TYPE( ssl_inc ) .EQS. "" THEN ssl_inc = F$TRNLNM("SSLINCLUDE")
+$ extra_defs = extra_defs + ",USE_SSL,USE_OPENSSL_INCL"
+$ extra_libs = extra_libs + "," + SSL_LIB + "libssl/LIB," + SSL_LIB + "libcrypto/LIB"
+$!
+$! The "#include <openssl/ssl.h>" requires a logical variable "openssl".
+$!
+$ define/nolog openssl 'SSL_INC
+$ endif
+$ if value_parm .eqs. "ZLIB"
+$ then
+$ write sys$output "** adding Zlib to build."
+$ extra_defs = extra_defs + ",USE_ZLIB"
+$ extra_incs = extra_incs + "," + ZLIB_INC
+$ extra_libs = extra_libs + "," + ZLIB_LIB + "libz/LIB"
+$ endif
+$ count_parm = count_parm + 1
+$ goto parse_p2
+$ endif
+$ endif
+$!
+$! Compiler options can be specified here. If there was
+$! a second argument (with any value), then debugger mode
+$! with no optimization will be specified as well. - FM
+$!
+$ cc_opts = ""
+$ if p3 .nes. "" then cc_opts = cc_opts + "/DEBUG/NOOPT"
+$!
+$ all_defs = transport + extra_defs
+$ all_incs = "[-.Implementation],[---.src],[---.src.chrtrans],[---]" + extra_incs
+$!
+$ IF f$getsyi("ARCH_NAME") .eqs. "Alpha" .or. -
+ f$getsyi("ARCH_NAME") .eqs. "IA64" .or. -
+ f$trnlnm("VAXCMSG") .eqs. "DECC$MSG" .or. -
+ f$trnlnm("DECC$CC_DEFAULT") .eqs. "/DECC" .or. -
+ f$trnlnm("DECC$CC_DEFAULT") .eqs. "/VAXC"
+$ THEN
+$! DECC:
+$ If transport .eqs. "UCX" .or. transport .eqs. "TCPWARE"
+$ Then
+$ cc := cc/decc/prefix=all /nomember 'cc_opts'-
+ /warning=(disable=implicitfunc)-
+ /DEFINE=('all_defs) -
+ /INCLUDE=('all_incs)
+$ Else
+$ if transport .eqs. "MULTINET" then -
+ extra_defs = extra_defs + ",_DECC_V4_SOURCE,__SOCKET_TYPEDEFS"
+$ cc := cc/decc/prefix=all /nomember 'cc_opts'-
+ /warning=(disable=implicitfunc)-
+ /DEFINE=('all_defs) -
+ /INCLUDE=('all_incs)
+$ EndIf
+$ ELSE
+$ IF f$search("gnu_cc:[000000]gcclib.olb") .nes. ""
+$ THEN
+$! GNUC:
+$ cc := gcc/DEFINE=('all_defs) 'cc_opts' /INCLUDE=('all_incs)
+$ ELSE
+$! VAXC:
+$ cc := cc/DEFINE=('all_defs) 'cc_opts' /INCLUDE=('all_incs)
+$ ENDIF
+$ ENDIF
+$ v1 = f$verify(1)
+$ show sym cc
+$ cc [-.Implementation]HTString.c
+$ cc [-.Implementation]HTParse.c
+$ cc [-.Implementation]HTAccess.c
+$ cc [-.Implementation]HTTP.c
+$ cc [-.Implementation]HTFile.c
+$ cc [-.Implementation]HTBTree.c
+$ cc [-.Implementation]HTFTP.c
+$ cc [-.Implementation]HTTCP.c
+$ cc [-.Implementation]SGML.c
+$ cc [-.Implementation]HTMLDTD.c
+$ cc [-.Implementation]HTChunk.c
+$ cc [-.Implementation]HTPlain.c
+$ cc [-.Implementation]HTMLGen.c
+$ cc [-.Implementation]HTAtom.c
+$ cc [-.Implementation]HTAnchor.c
+$ cc [-.Implementation]HTStyle.c
+$ cc [-.Implementation]HTList.c
+$ cc [-.Implementation]HTRules.c
+$ cc [-.Implementation]HTFormat.c
+$ cc [-.Implementation]HTMIME.c
+$ cc [-.Implementation]HTNews.c
+$ cc [-.Implementation]HTGopher.c
+$ cc [-.Implementation]HTTelnet.c
+$ cc [-.Implementation]HTFinger.c
+$ cc [-.Implementation]HTWSRC.c
+$ cc [-.Implementation]HTAAUtil.c
+$ cc [-.Implementation]HTAABrow.c
+$ cc [-.Implementation]HTGroup.c
+$ cc [-.Implementation]HTAAProt.c
+$ cc [-.Implementation]HTAssoc.c
+$ cc [-.Implementation]HTLex.c
+$ cc [-.Implementation]HTUU.c
+$ cc [-.Implementation]HTVMSUtils.c
+$ cc [-.Implementation]HTWAIS.c
+$ cc [-.Implementation]HTVMS_WaisUI.c
+$ cc [-.Implementation]HTVMS_WaisProt.c
+$!
+$ result = "[-.Implementation]WWWLib_''transport'.olb"
+$ If f$search("''result'") .eqs. "" Then -
+ LIBRARY/Create 'result
+$ LIBRARY/Replace 'result *.obj
+$ Delete/nolog/noconf *.obj;*
+$!
+$ v1 = f$verify(v0)
+$ CLEANUP:
+$ v1 = f$verify(v)
+$exit
diff --git a/aclocal.m4 b/aclocal.m4
new file mode 100644
index 0000000..b27cf86
--- /dev/null
+++ b/aclocal.m4
@@ -0,0 +1,8176 @@
+dnl $LynxId: aclocal.m4,v 1.317 2023/01/06 00:37:36 tom Exp $
+dnl Macros for auto-configure script.
+dnl by Thomas E. Dickey <dickey@invisible-island.net>
+dnl and Jim Spath <jspath@mail.bcpl.lib.md.us>
+dnl and Philippe De Muyter <phdm@macqel.be>
+dnl
+dnl Created: 1997/01/28
+dnl
+dnl The autoconf used in Lynx development is GNU autoconf 2.13 or 2.52, patched
+dnl by Thomas Dickey. See your local GNU archives, and this URL:
+dnl https://invisible-island.net/autoconf/autoconf.html
+dnl
+dnl ---------------------------------------------------------------------------
+dnl
+dnl Copyright 1997-2022,2023 by Thomas E. Dickey
+dnl
+dnl Permission to use, copy, modify, and distribute this software and its
+dnl documentation for any purpose and without fee is hereby granted,
+dnl provided that the above copyright notice appear in all copies and that
+dnl both that copyright notice and this permission notice appear in
+dnl supporting documentation, and that the name of the above listed
+dnl copyright holder(s) not be used in advertising or publicity pertaining
+dnl to distribution of the software without specific, written prior
+dnl permission.
+dnl
+dnl THE ABOVE LISTED COPYRIGHT HOLDER(S) DISCLAIM ALL WARRANTIES WITH REGARD
+dnl TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+dnl AND FITNESS, IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE
+dnl LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+dnl WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+dnl ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+dnl OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+dnl
+dnl ---------------------------------------------------------------------------
+dnl A few macros (the AM_xxx ones) are originally from gettext 0.10.35 (but
+dnl are modified), and are part of this file due to mechanical limitations of
+dnl autoconf.
+dnl ---------------------------------------------------------------------------
+dnl See
+dnl https://invisible-island.net/autoconf/autoconf.html
+dnl https://invisible-island.net/autoconf/my-autoconf.html
+dnl ---------------------------------------------------------------------------
+dnl ---------------------------------------------------------------------------
+dnl AM_GNU_GETTEXT version: 15 updated: 2021/01/02 09:31:20
+dnl --------------
+dnl Usage: Just like AM_WITH_NLS, which see.
+AC_DEFUN([AM_GNU_GETTEXT],
+ [AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+ AC_REQUIRE([AC_CANONICAL_HOST])dnl
+ AC_REQUIRE([AC_PROG_RANLIB])dnl
+ AC_REQUIRE([AC_HEADER_STDC])dnl
+ AC_REQUIRE([AC_C_INLINE])dnl
+ AC_REQUIRE([AC_TYPE_OFF_T])dnl
+ AC_REQUIRE([AC_TYPE_SIZE_T])dnl
+ AC_REQUIRE([AC_FUNC_ALLOCA])dnl
+ AC_REQUIRE([AC_FUNC_MMAP])dnl
+ AC_REQUIRE([jm_GLIBC21])dnl
+ AC_REQUIRE([CF_PROG_CC])dnl
+
+ AC_CHECK_HEADERS([argz.h limits.h locale.h nl_types.h malloc.h stddef.h \
+stdlib.h string.h unistd.h sys/param.h])
+ AC_CHECK_FUNCS([feof_unlocked fgets_unlocked getcwd getegid geteuid \
+getgid getuid mempcpy munmap putenv setenv setlocale stpcpy strchr strcasecmp \
+strdup strtoul tsearch __argz_count __argz_stringify __argz_next])
+
+ AM_ICONV
+ AM_LANGINFO_CODESET
+ AM_LC_MESSAGES
+ AM_WITH_NLS([$1],[$2],[$3],[$4])
+
+ if test "x$CATOBJEXT" != "x"; then
+ if test "x$ALL_LINGUAS" = "x"; then
+ LINGUAS=
+ else
+ AC_MSG_CHECKING(for catalogs to be installed)
+ NEW_LINGUAS=
+ for presentlang in $ALL_LINGUAS; do
+ useit=no
+ for desiredlang in ${LINGUAS-$ALL_LINGUAS}; do
+ # Use the presentlang catalog if desiredlang is
+ # a. equal to presentlang, or
+ # b. a variant of presentlang (because in this case,
+ # presentlang can be used as a fallback for messages
+ # which are not translated in the desiredlang catalog).
+ case "$desiredlang" in
+ ("$presentlang"*) useit=yes;;
+ esac
+ done
+ if test "$useit" = yes; then
+ NEW_LINGUAS="$NEW_LINGUAS $presentlang"
+ fi
+ done
+ LINGUAS=$NEW_LINGUAS
+ AC_MSG_RESULT($LINGUAS)
+ fi
+
+ dnl Construct list of names of catalog files to be constructed.
+ if test -n "$LINGUAS"; then
+ for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done
+ fi
+ fi
+
+ dnl Enable libtool support if the surrounding package wishes it.
+ INTL_LIBTOOL_SUFFIX_PREFIX=ifelse([$1], use-libtool, [l], [])
+ AC_SUBST(INTL_LIBTOOL_SUFFIX_PREFIX)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl AM_ICONV version: 12 updated: 2007/07/30 19:12:03
+dnl --------
+dnl Inserted as requested by gettext 0.10.40
+dnl File from /usr/share/aclocal
+dnl iconv.m4
+dnl ====================
+dnl serial AM2
+dnl
+dnl From Bruno Haible.
+dnl
+dnl ====================
+dnl Modified to use CF_FIND_LINKAGE and CF_ADD_SEARCHPATH, to broaden the
+dnl range of locations searched. Retain the same cache-variable naming to
+dnl allow reuse with the other gettext macros -Thomas E Dickey
+AC_DEFUN([AM_ICONV],
+[
+ dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and
+ dnl those with the standalone portable GNU libiconv installed).
+
+ AC_ARG_WITH([libiconv-prefix],
+[ --with-libiconv-prefix=DIR
+ search for libiconv in DIR/include and DIR/lib], [
+ CF_ADD_OPTIONAL_PATH($withval, libiconv)
+ ])
+
+ AC_CACHE_CHECK(for iconv, am_cv_func_iconv, [
+ CF_FIND_LINKAGE(CF__ICONV_HEAD,
+ CF__ICONV_BODY,
+ iconv,
+ am_cv_func_iconv=yes,
+ am_cv_func_iconv=["no, consider installing GNU libiconv"])])
+
+ if test "$am_cv_func_iconv" = yes; then
+ AC_DEFINE(HAVE_ICONV, 1, [Define if you have the iconv() function.])
+
+ AC_CACHE_CHECK([if the declaration of iconv() needs const.],
+ am_cv_proto_iconv_const,[
+ AC_TRY_COMPILE(CF__ICONV_HEAD [
+extern
+#ifdef __cplusplus
+"C"
+#endif
+#if defined(__STDC__) || defined(__cplusplus)
+size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
+#else
+size_t iconv();
+#endif
+],[], am_cv_proto_iconv_const=no,
+ am_cv_proto_iconv_const=yes)])
+
+ if test "$am_cv_proto_iconv_const" = yes ; then
+ am_cv_proto_iconv_arg1="const"
+ else
+ am_cv_proto_iconv_arg1=""
+ fi
+
+ AC_DEFINE_UNQUOTED(ICONV_CONST, $am_cv_proto_iconv_arg1,
+ [Define as const if the declaration of iconv() needs const.])
+ fi
+
+ LIBICONV=
+ if test "$cf_cv_find_linkage_iconv" = yes; then
+ CF_ADD_INCDIR($cf_cv_header_path_iconv)
+ if test -n "$cf_cv_library_file_iconv" ; then
+ LIBICONV="-liconv"
+ CF_ADD_LIBDIR($cf_cv_library_path_iconv)
+ fi
+ fi
+
+ AC_SUBST(LIBICONV)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl AM_LANGINFO_CODESET version: 6 updated: 2021/01/01 16:53:59
+dnl -------------------
+dnl Inserted as requested by gettext 0.10.40
+dnl File from /usr/share/aclocal
+dnl codeset.m4
+dnl ====================
+dnl serial AM1
+dnl
+dnl From Bruno Haible.
+AC_DEFUN([AM_LANGINFO_CODESET],
+[
+AC_CACHE_CHECK([for nl_langinfo and CODESET], am_cv_langinfo_codeset,
+ [AC_TRY_LINK([#include <langinfo.h>],
+ [char* cs = nl_langinfo(CODESET); (void)cs],
+ am_cv_langinfo_codeset=yes,
+ am_cv_langinfo_codeset=no)
+ ])
+ if test "$am_cv_langinfo_codeset" = yes; then
+ AC_DEFINE(HAVE_LANGINFO_CODESET, 1,
+ [Define if you have <langinfo.h> and nl_langinfo(CODESET).])
+ fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl AM_LC_MESSAGES version: 6 updated: 2021/01/02 09:31:20
+dnl --------------
+dnl Inserted as requested by gettext 0.10.40
+dnl File from /usr/share/aclocal
+dnl lcmessage.m4
+dnl ====================
+dnl Check whether LC_MESSAGES is available in <locale.h>.
+dnl Ulrich Drepper <drepper@cygnus.com>, 1995.
+dnl
+dnl This file can be copied and used freely without restrictions. It can
+dnl be used in projects which are not available under the GNU General Public
+dnl License or the GNU Library General Public License but which still want
+dnl to provide support for the GNU gettext functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+dnl
+dnl serial 2
+dnl
+AC_DEFUN([AM_LC_MESSAGES],
+[if test "$ac_cv_header_locale_h" = yes; then
+ AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES,
+ [AC_TRY_LINK([#include <locale.h>], [return LC_MESSAGES],
+ am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)])
+ if test "$am_cv_val_LC_MESSAGES" = yes; then
+ AC_DEFINE(HAVE_LC_MESSAGES, 1,
+ [Define if your <locale.h> file defines LC_MESSAGES.])
+ fi
+fi])dnl
+dnl ---------------------------------------------------------------------------
+dnl AM_PATH_PROG_WITH_TEST version: 10 updated: 2021/01/02 09:31:20
+dnl ----------------------
+dnl Inserted as requested by gettext 0.10.40
+dnl File from /usr/share/aclocal
+dnl progtest.m4
+dnl ====================
+dnl Search path for a program which passes the given test.
+dnl Ulrich Drepper <drepper@cygnus.com>, 1996.
+dnl
+dnl This file can be copied and used freely without restrictions. It can
+dnl be used in projects which are not available under the GNU General Public
+dnl License or the GNU Library General Public License but which still want
+dnl to provide support for the GNU gettext functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+dnl
+dnl serial 2
+dnl
+dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR,
+dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]])
+AC_DEFUN([AM_PATH_PROG_WITH_TEST],
+[# Extract the first word of "$2", so it can be a program name with args.
+AC_REQUIRE([CF_PATHSEP])
+set dummy $2; ac_word=[$]2
+AC_MSG_CHECKING([for $ac_word])
+AC_CACHE_VAL(ac_cv_path_$1,
+[case "[$]$1" in
+ ([[\\/]*|?:[\\/]]*)
+ ac_cv_path_$1="[$]$1" # Let the user override the test with a path.
+ ;;
+ (*)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}"
+ for ac_dir in ifelse([$5], , $PATH, [$5]); do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_word$ac_exeext" ; then
+ if [$3]; then
+ ac_cv_path_$1="$ac_dir/$ac_word$ac_exeext"
+ break
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+dnl If no 4th arg is given, leave the cache variable unset,
+dnl so AC_PATH_PROGS will keep looking.
+ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4"
+])dnl
+ ;;
+esac])dnl
+$1="$ac_cv_path_$1"
+if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then
+ AC_MSG_RESULT([$]$1)
+else
+ AC_MSG_RESULT(no)
+fi
+AC_SUBST($1)dnl
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl AM_WITH_NLS version: 33 updated: 2022/01/28 08:32:11
+dnl -----------
+dnl Inserted as requested by gettext 0.10.40
+dnl File from /usr/share/aclocal
+dnl gettext.m4
+dnl ====================
+dnl Macro to add for using GNU gettext.
+dnl Ulrich Drepper <drepper@cygnus.com>, 1995.
+dnl ====================
+dnl Modified to use CF_FIND_LINKAGE and CF_ADD_SEARCHPATH, to broaden the
+dnl range of locations searched. Retain the same cache-variable naming to
+dnl allow reuse with the other gettext macros -Thomas E Dickey
+dnl ====================
+dnl
+dnl This file can be copied and used freely without restrictions. It can
+dnl be used in projects which are not available under the GNU General Public
+dnl License or the GNU Library General Public License but which still want
+dnl to provide support for the GNU gettext functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+dnl
+dnl serial 10
+dnl
+dnl Usage: AM_WITH_NLS([TOOLSYMBOL], [NEEDSYMBOL], [LIBDIR], [ENABLED]).
+dnl If TOOLSYMBOL is specified and is 'use-libtool', then a libtool library
+dnl $(top_builddir)/intl/libintl.la will be created (shared and/or static,
+dnl depending on --{enable,disable}-{shared,static} and on the presence of
+dnl AM-DISABLE-SHARED). Otherwise, a static library
+dnl $(top_builddir)/intl/libintl.a will be created.
+dnl If NEEDSYMBOL is specified and is 'need-ngettext', then GNU gettext
+dnl implementations (in libc or libintl) without the ngettext() function
+dnl will be ignored.
+dnl LIBDIR is used to find the intl libraries. If empty,
+dnl the value `$(top_builddir)/intl/' is used.
+dnl ENABLED is used to control the default for the related --enable-nls, since
+dnl not all application developers want this feature by default, e.g., lynx.
+dnl
+dnl The result of the configuration is one of three cases:
+dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled
+dnl and used.
+dnl Catalog format: GNU --> install in $(datadir)
+dnl Catalog extension: .mo after installation, .gmo in source tree
+dnl 2) GNU gettext has been found in the system's C library.
+dnl Catalog format: GNU --> install in $(datadir)
+dnl Catalog extension: .mo after installation, .gmo in source tree
+dnl 3) No internationalization, always use English msgid.
+dnl Catalog format: none
+dnl Catalog extension: none
+dnl The use of .gmo is historical (it was needed to avoid overwriting the
+dnl GNU format catalogs when building on a platform with an X/Open gettext),
+dnl but we keep it in order not to force irrelevant filename changes on the
+dnl maintainers.
+dnl
+AC_DEFUN([AM_WITH_NLS],
+[AC_MSG_CHECKING([whether NLS is requested])
+ dnl Default is enabled NLS
+ ifelse([$4],,[
+ AC_ARG_ENABLE(nls,
+ [ --disable-nls do not use Native Language Support],
+ USE_NLS=$enableval, USE_NLS=yes)],[
+ AC_ARG_ENABLE(nls,
+ [ --enable-nls use Native Language Support],
+ USE_NLS=$enableval, USE_NLS=no)])
+ AC_MSG_RESULT($USE_NLS)
+ AC_SUBST(USE_NLS)
+
+ BUILD_INCLUDED_LIBINTL=no
+ USE_INCLUDED_LIBINTL=no
+ INTLLIBS=
+
+ dnl If we use NLS figure out what method
+ if test "$USE_NLS" = "yes"; then
+ dnl We need to process the po/ directory.
+ POSUB=po
+ AC_DEFINE(ENABLE_NLS, 1,
+ [Define to 1 if translation of program messages to the user's native language
+ is requested.])
+ AC_MSG_CHECKING([whether included gettext is requested])
+ AC_ARG_WITH(included-gettext,
+ [ --with-included-gettext use the GNU gettext library included here],
+ nls_cv_force_use_gnu_gettext=$withval,
+ nls_cv_force_use_gnu_gettext=no)
+ AC_MSG_RESULT($nls_cv_force_use_gnu_gettext)
+
+ dnl Search for GNU msgfmt in the PATH.
+ AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt,
+ ["$ac_dir/$ac_word" --statistics /dev/null >/dev/null 2>&1], :)
+ AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT)
+ AC_SUBST(MSGFMT)
+
+ dnl Search for GNU xgettext in the PATH.
+ AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext,
+ ["$ac_dir/$ac_word" --omit-header /dev/null >/dev/null 2>&1], :)
+
+ nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext"
+ if test "$nls_cv_force_use_gnu_gettext" != "yes"; then
+ dnl User does not insist on using GNU NLS library. Figure out what
+ dnl to use. If GNU gettext is available we use this. Else we may have
+ dnl to fall back to GNU NLS library.
+ CATOBJEXT=NONE
+
+ dnl Save these (possibly-set) variables for reference. If the user
+ dnl overrode these to provide full pathnames, then warn if not actually
+ dnl GNU gettext, but do not override their values. Also, if they were
+ dnl overridden, suppress the part of the library test which prevents it
+ dnl from finding anything other than GNU gettext. Doing this also
+ dnl suppresses a bogus search for the intl library.
+ cf_save_msgfmt_path="$MSGFMT"
+ cf_save_xgettext_path="$XGETTEXT"
+
+ cf_save_LIBS_1="$LIBS"
+ CF_ADD_LIBS($LIBICONV)
+
+ cf_save_OPTS_1="$CPPFLAGS"
+ if test "x$cf_save_msgfmt_path" = "x$MSGFMT" && \
+ test "x$cf_save_xgettext_path" = "x$XGETTEXT" ; then
+ CF_ADD_CFLAGS(-DIGNORE_MSGFMT_HACK)
+ fi
+
+ CF_FIND_LINKAGE(CF__INTL_HEAD,
+ CF__INTL_BODY($2),
+ intl,
+ cf_cv_func_gettext=yes,
+ cf_cv_func_gettext=no)
+
+ AC_MSG_CHECKING([for libintl.h and gettext()])
+ AC_MSG_RESULT($cf_cv_func_gettext)
+
+ LIBS="$cf_save_LIBS_1"
+ CPPFLAGS="$cf_save_OPTS_1"
+
+ if test "$cf_cv_func_gettext" = yes ; then
+ AC_DEFINE(HAVE_LIBINTL_H,1,[Define to 1 if we have libintl.h])
+
+ dnl If an already present or preinstalled GNU gettext() is found,
+ dnl use it. But if this macro is used in GNU gettext, and GNU
+ dnl gettext is already preinstalled in libintl, we update this
+ dnl libintl. (Cf. the install rule in intl/Makefile.in.)
+ if test "$PACKAGE" != gettext; then
+ AC_DEFINE(HAVE_GETTEXT, 1,
+ [Define if the GNU gettext() function is already present or preinstalled.])
+
+ CF_ADD_INCDIR($cf_cv_header_path_intl)
+
+ if test -n "$cf_cv_library_file_intl" ; then
+ dnl If iconv() is in a separate libiconv library, then anyone
+ dnl linking with libintl{.a,.so} also needs to link with
+ dnl libiconv.
+ INTLLIBS="$cf_cv_library_file_intl $LIBICONV"
+ CF_ADD_LIBDIR($cf_cv_library_path_intl,INTLLIBS)
+ fi
+
+ gt_save_LIBS="$LIBS"
+ LIBS="$LIBS $INTLLIBS"
+ AC_CHECK_FUNCS(dcgettext)
+ LIBS="$gt_save_LIBS"
+
+ CATOBJEXT=.gmo
+ fi
+ elif test -z "$MSGFMT" || test -z "$XGETTEXT" ; then
+ AC_MSG_WARN(disabling NLS feature)
+ sed -e /ENABLE_NLS/d confdefs.h >confdefs.tmp
+ mv confdefs.tmp confdefs.h
+ ALL_LINGUAS=
+ CATOBJEXT=.ignored
+ MSGFMT=":"
+ GMSGFMT=":"
+ XGETTEXT=":"
+ POSUB=
+ BUILD_INCLUDED_LIBINTL=no
+ USE_INCLUDED_LIBINTL=no
+ USE_NLS=no
+ nls_cv_use_gnu_gettext=no
+ fi
+
+ if test "$CATOBJEXT" = "NONE"; then
+ dnl GNU gettext is not found in the C library.
+ dnl Fall back on GNU gettext library.
+ nls_cv_use_gnu_gettext=maybe
+ fi
+ fi
+
+ if test "$nls_cv_use_gnu_gettext" != "no"; then
+ CATOBJEXT=.gmo
+ if test -f "$srcdir/intl/libintl.h" || test -f "$srcdir/intl/libgnuintl.h" ; then
+ dnl Mark actions used to generate GNU NLS library.
+ AC_DEFINE(HAVE_LIBINTL_H,1,[Define to 1 for included intl header])
+ INTLOBJS="\$(GETTOBJS)"
+ BUILD_INCLUDED_LIBINTL=yes
+ USE_INCLUDED_LIBINTL=yes
+ INTLLIBS="ifelse([$3],[],\$(top_builddir)/intl,[$3])/libintl.ifelse([$1], use-libtool, [l], [])a $LIBICONV"
+ LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'`
+ elif test "$nls_cv_use_gnu_gettext" = "yes"; then
+ nls_cv_use_gnu_gettext=no
+ AC_MSG_WARN(no NLS library is packaged with this application)
+ fi
+ fi
+
+ dnl Test whether we really found GNU msgfmt.
+ if test "$GMSGFMT" != ":"; then
+ if $GMSGFMT --statistics /dev/null >/dev/null 2>&1; then
+ : ;
+ else
+ AC_MSG_WARN([found msgfmt program is not GNU msgfmt])
+ fi
+ fi
+
+ dnl Test whether we really found GNU xgettext.
+ if test "$XGETTEXT" != ":"; then
+ if $XGETTEXT --omit-header /dev/null >/dev/null 2>&1; then
+ : ;
+ else
+ AC_MSG_WARN([found xgettext program is not GNU xgettext])
+ fi
+ fi
+ fi
+
+ if test "$XGETTEXT" != ":"; then
+ AC_OUTPUT_COMMANDS(
+ [for ac_file in $CONFIG_FILES; do
+
+ # Support "outfile[:infile[:infile...]]"
+ case "$ac_file" in
+ (*:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ esac
+
+ # PO directories have a Makefile.in generated from Makefile.inn.
+ case "$ac_file" in
+ (*/[Mm]akefile.in)
+ # Adjust a relative srcdir.
+ ac_dir="`echo "$ac_file"|sed 's%/[^/][^/]*$%%'`"
+ ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`"
+ ac_dots="`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'`"
+ ac_base="`basename $ac_file .in`"
+ # In autoconf-2.13 it is called $ac_given_srcdir.
+ # In autoconf-2.50 it is called $srcdir.
+ test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir"
+
+ case "$ac_given_srcdir" in
+ (.) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;;
+ (/*) top_srcdir="$ac_given_srcdir" ;;
+ (*) top_srcdir="$ac_dots$ac_given_srcdir" ;;
+ esac
+
+ if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then
+ rm -f "$ac_dir/POTFILES"
+ test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES"
+ sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," -e "\$s/\(.*\) \\\\/\1/" < "$ac_given_srcdir/$ac_dir/POTFILES.in" > "$ac_dir/POTFILES"
+ test -n "$as_me" && echo "$as_me: creating $ac_dir/$ac_base" || echo "creating $ac_dir/$ac_base"
+ sed -e "/POTFILES =/r $ac_dir/POTFILES" "$ac_dir/$ac_base.in" > "$ac_dir/$ac_base"
+ fi
+ ;;
+ esac
+ done])
+
+ dnl If this is used in GNU gettext we have to set BUILD_INCLUDED_LIBINTL
+ dnl to 'yes' because some of the testsuite requires it.
+ if test "$PACKAGE" = gettext; then
+ BUILD_INCLUDED_LIBINTL=yes
+ fi
+
+ dnl intl/plural.c is generated from intl/plural.y. It requires an old
+ dnl version of bison, or byacc, because plural.y uses the bison
+ dnl "%pure-parser" feature. That requires at least bison-1.26 because
+ dnl earlier versions generate a plural.c that doesn't compile. However,
+ dnl while byacc (2010) supports this feature, bison dropped compatibility
+ dnl beginning with version 2.3 (2008).
+ dnl
+ dnl bison or byacc are only needed for the maintainer (who touches
+ dnl plural.y). To avoid separate Makefiles or --enable-maintainer-mode, we
+ dnl put the rule in general Makefile. Now, some people carelessly touch
+ dnl the files or have a broken "make" program, hence the plural.c rule will
+ dnl sometimes fire. To avoid an error, define INTL_YACC to ":" if it is
+ dnl not present or too old.
+ if test "$nls_cv_use_gnu_gettext" = "yes"; then
+ AC_CHECK_PROGS([INTL_YACC], [byacc bison])
+ if test -z "$INTL_YACC"; then
+ ac_verc_fail=yes
+ else
+ dnl Found it, now check the version.
+ AC_MSG_CHECKING([version of $INTL_YACC])
+changequote(<<,>>)dnl
+ ac_prog_version=`$INTL_YACC -V 2>&1 | sed -n 's/^.*GNU Bison.* \([0-9]*\.[0-9.]*\).*$/\1/p;s/^\(byacc\) - \([0-9][0-9.]*\) \([0-9]*\).*$/\1-\2.\3/p'`
+ case "$ac_prog_version" in
+ (byacc-[0-9].[0-9].20[1-9]*)
+ ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;;
+ ('') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
+ (1.2[6-9]*|1.[3-9][0-9]*|2.[0-3]*)
+changequote([,])dnl
+ ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;;
+ (*) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
+ esac
+ AC_MSG_RESULT([$ac_prog_version])
+ fi
+ if test "$ac_verc_fail" = yes; then
+ INTL_YACC=:
+ fi
+ fi
+
+ dnl These rules are solely for the distribution goal. While doing this
+ dnl we only have to keep exactly one list of the available catalogs
+ dnl in configure.in.
+ for lang in $ALL_LINGUAS; do
+ GMOFILES="$GMOFILES $lang.gmo"
+ POFILES="$POFILES $lang.po"
+ done
+ fi
+
+ dnl Make all variables we use known to autoconf.
+ AC_SUBST(BUILD_INCLUDED_LIBINTL)
+ AC_SUBST(USE_INCLUDED_LIBINTL)
+ AC_SUBST(CATALOGS)
+ AC_SUBST(CATOBJEXT)
+ AC_SUBST(GMOFILES)
+ AC_SUBST(INTLLIBS)
+ AC_SUBST(INTLOBJS)
+ AC_SUBST(POFILES)
+ AC_SUBST(POSUB)
+
+ dnl For backward compatibility. Some configure.ins may be using this.
+ nls_cv_header_intl=
+ nls_cv_header_libgt=
+
+ dnl For backward compatibility. Some Makefiles may be using this.
+ DATADIRNAME=share
+ AC_SUBST(DATADIRNAME)
+
+ dnl For backward compatibility. Some Makefiles may be using this.
+ INSTOBJEXT=.mo
+ AC_SUBST(INSTOBJEXT)
+
+ dnl For backward compatibility. Some Makefiles may be using this.
+ GENCAT=gencat
+ AC_SUBST(GENCAT)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ACVERSION_CHECK version: 5 updated: 2014/06/04 19:11:49
+dnl ------------------
+dnl Conditionally generate script according to whether we're using a given autoconf.
+dnl
+dnl $1 = version to compare against
+dnl $2 = code to use if AC_ACVERSION is at least as high as $1.
+dnl $3 = code to use if AC_ACVERSION is older than $1.
+define([CF_ACVERSION_CHECK],
+[
+ifdef([AC_ACVERSION], ,[ifdef([AC_AUTOCONF_VERSION],[m4_copy([AC_AUTOCONF_VERSION],[AC_ACVERSION])],[m4_copy([m4_PACKAGE_VERSION],[AC_ACVERSION])])])dnl
+ifdef([m4_version_compare],
+[m4_if(m4_version_compare(m4_defn([AC_ACVERSION]), [$1]), -1, [$3], [$2])],
+[CF_ACVERSION_COMPARE(
+AC_PREREQ_CANON(AC_PREREQ_SPLIT([$1])),
+AC_PREREQ_CANON(AC_PREREQ_SPLIT(AC_ACVERSION)), AC_ACVERSION, [$2], [$3])])])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ACVERSION_COMPARE version: 3 updated: 2012/10/03 18:39:53
+dnl --------------------
+dnl CF_ACVERSION_COMPARE(MAJOR1, MINOR1, TERNARY1,
+dnl MAJOR2, MINOR2, TERNARY2,
+dnl PRINTABLE2, not FOUND, FOUND)
+define([CF_ACVERSION_COMPARE],
+[ifelse(builtin([eval], [$2 < $5]), 1,
+[ifelse([$8], , ,[$8])],
+[ifelse([$9], , ,[$9])])])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ADD_CFLAGS version: 15 updated: 2020/12/31 10:54:15
+dnl -------------
+dnl Copy non-preprocessor flags to $CFLAGS, preprocessor flags to $CPPFLAGS
+dnl $1 = flags to add
+dnl $2 = if given makes this macro verbose.
+dnl
+dnl Put any preprocessor definitions that use quoted strings in $EXTRA_CPPFLAGS,
+dnl to simplify use of $CPPFLAGS in compiler checks, etc., that are easily
+dnl confused by the quotes (which require backslashes to keep them usable).
+AC_DEFUN([CF_ADD_CFLAGS],
+[
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $1
+do
+case "$cf_fix_cppflags" in
+(no)
+ case "$cf_add_cflags" in
+ (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[[^=]]*='\''\"[[^"]]*//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=yes
+
+ if test "$cf_fix_cppflags" = yes ; then
+ CF_APPEND_TEXT(cf_new_extra_cppflags,$cf_add_cflags)
+ continue
+ elif test "${cf_tst_cflags}" = "\"'" ; then
+ CF_APPEND_TEXT(cf_new_extra_cppflags,$cf_add_cflags)
+ continue
+ fi
+ ;;
+ esac
+ case "$CPPFLAGS" in
+ (*$cf_add_cflags)
+ ;;
+ (*)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+ CF_REMOVE_DEFINE(CPPFLAGS,$CPPFLAGS,$cf_tst_cppflags)
+ ;;
+ esac
+ CF_APPEND_TEXT(cf_new_cppflags,$cf_add_cflags)
+ ;;
+ esac
+ ;;
+ (*)
+ CF_APPEND_TEXT(cf_new_cflags,$cf_add_cflags)
+ ;;
+ esac
+ ;;
+(yes)
+ CF_APPEND_TEXT(cf_new_extra_cppflags,$cf_add_cflags)
+
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[[^"]]*"'\''//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=no
+ ;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+ ifelse([$2],,,[CF_VERBOSE(add to \$CFLAGS $cf_new_cflags)])
+ CF_APPEND_TEXT(CFLAGS,$cf_new_cflags)
+fi
+
+if test -n "$cf_new_cppflags" ; then
+ ifelse([$2],,,[CF_VERBOSE(add to \$CPPFLAGS $cf_new_cppflags)])
+ CF_APPEND_TEXT(CPPFLAGS,$cf_new_cppflags)
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+ ifelse([$2],,,[CF_VERBOSE(add to \$EXTRA_CPPFLAGS $cf_new_extra_cppflags)])
+ CF_APPEND_TEXT(EXTRA_CPPFLAGS,$cf_new_extra_cppflags)
+fi
+
+AC_SUBST(EXTRA_CPPFLAGS)
+
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ADD_INCDIR version: 17 updated: 2021/09/04 06:35:04
+dnl -------------
+dnl Add an include-directory to $CPPFLAGS. Don't add /usr/include, since it is
+dnl redundant. We don't normally need to add -I/usr/local/include for gcc,
+dnl but old versions (and some misinstalled ones) need that. To make things
+dnl worse, gcc 3.x may give error messages if -I/usr/local/include is added to
+dnl the include-path).
+AC_DEFUN([CF_ADD_INCDIR],
+[
+if test -n "$1" ; then
+ for cf_add_incdir in $1
+ do
+ while test "$cf_add_incdir" != /usr/include
+ do
+ if test -d "$cf_add_incdir"
+ then
+ cf_have_incdir=no
+ if test -n "$CFLAGS$CPPFLAGS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+ if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+ cf_have_incdir=yes; break
+ fi
+ done
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ if test "$cf_add_incdir" = /usr/local/include ; then
+ if test "$GCC" = yes
+ then
+ cf_save_CPPFLAGS=$CPPFLAGS
+ CF_APPEND_TEXT(CPPFLAGS,-I$cf_add_incdir)
+ AC_TRY_COMPILE([#include <stdio.h>],
+ [printf("Hello")],
+ [],
+ [cf_have_incdir=yes])
+ CPPFLAGS=$cf_save_CPPFLAGS
+ fi
+ fi
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ CF_VERBOSE(adding $cf_add_incdir to include-path)
+ ifelse([$2],,CPPFLAGS,[$2])="$ifelse([$2],,CPPFLAGS,[$2]) -I$cf_add_incdir"
+
+ cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+ test "$cf_top_incdir" = "$cf_add_incdir" && break
+ cf_add_incdir="$cf_top_incdir"
+ else
+ break
+ fi
+ else
+ break
+ fi
+ done
+ done
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ADD_LIB version: 2 updated: 2010/06/02 05:03:05
+dnl ----------
+dnl Add a library, used to enforce consistency.
+dnl
+dnl $1 = library to add, without the "-l"
+dnl $2 = variable to update (default $LIBS)
+AC_DEFUN([CF_ADD_LIB],[CF_ADD_LIBS(-l$1,ifelse($2,,LIBS,[$2]))])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ADD_LIBDIR version: 11 updated: 2020/12/31 20:19:42
+dnl -------------
+dnl Adds to the library-path
+dnl
+dnl Some machines have trouble with multiple -L options.
+dnl
+dnl $1 is the (list of) directory(s) to add
+dnl $2 is the optional name of the variable to update (default LDFLAGS)
+dnl
+AC_DEFUN([CF_ADD_LIBDIR],
+[
+if test -n "$1" ; then
+ for cf_add_libdir in $1
+ do
+ if test "$cf_add_libdir" = /usr/lib ; then
+ :
+ elif test -d "$cf_add_libdir"
+ then
+ cf_have_libdir=no
+ if test -n "$LDFLAGS$LIBS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_libdir in $LDFLAGS $LIBS ; do
+ if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
+ cf_have_libdir=yes; break
+ fi
+ done
+ fi
+ if test "$cf_have_libdir" = no ; then
+ CF_VERBOSE(adding $cf_add_libdir to library-path)
+ ifelse([$2],,LDFLAGS,[$2])="-L$cf_add_libdir $ifelse([$2],,LDFLAGS,[$2])"
+ fi
+ fi
+ done
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ADD_LIBS version: 3 updated: 2019/11/02 16:47:33
+dnl -----------
+dnl Add one or more libraries, used to enforce consistency. Libraries are
+dnl prepended to an existing list, since their dependencies are assumed to
+dnl already exist in the list.
+dnl
+dnl $1 = libraries to add, with the "-l", etc.
+dnl $2 = variable to update (default $LIBS)
+AC_DEFUN([CF_ADD_LIBS],[
+cf_add_libs="[$]ifelse($2,,LIBS,[$2])"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $1; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+ifelse($2,,LIBS,[$2])="$cf_add_libs"
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ADD_LIB_AFTER version: 3 updated: 2013/07/09 21:27:22
+dnl ----------------
+dnl Add a given library after another, e.g., following the one it satisfies a
+dnl dependency for.
+dnl
+dnl $1 = the first library
+dnl $2 = its dependency
+AC_DEFUN([CF_ADD_LIB_AFTER],[
+CF_VERBOSE(...before $LIBS)
+LIBS=`echo "$LIBS" | sed -e "s/[[ ]][[ ]]*/ /g" -e "s%$1 %$1 $2 %" -e 's% % %g'`
+CF_VERBOSE(...after $LIBS)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ADD_OPTIONAL_PATH version: 3 updated: 2015/05/10 19:52:14
+dnl --------------------
+dnl Add an optional search-path to the compile/link variables.
+dnl See CF_WITH_PATH
+dnl
+dnl $1 = shell variable containing the result of --with-XXX=[DIR]
+dnl $2 = module to look for.
+AC_DEFUN([CF_ADD_OPTIONAL_PATH],[
+case "$1" in
+(no)
+ ;;
+(yes)
+ ;;
+(*)
+ CF_ADD_SEARCHPATH([$1], [AC_MSG_ERROR(cannot find $2 under $1)])
+ ;;
+esac
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ADD_SEARCHPATH version: 6 updated: 2020/12/31 20:19:42
+dnl -----------------
+dnl Set $CPPFLAGS and $LDFLAGS with the directories given via the parameter.
+dnl They can be either the common root of include- and lib-directories, or the
+dnl lib-directory (to allow for things like lib64 directories).
+dnl See also CF_FIND_LINKAGE.
+dnl
+dnl $1 is the list of colon-separated directory names to search.
+dnl $2 is the action to take if a parameter does not yield a directory.
+AC_DEFUN([CF_ADD_SEARCHPATH],
+[
+AC_REQUIRE([CF_PATHSEP])
+for cf_searchpath in `echo "$1" | tr $PATH_SEPARATOR ' '`; do
+ if test -d "$cf_searchpath/include" ; then
+ CF_ADD_INCDIR($cf_searchpath/include)
+ elif test -d "$cf_searchpath/../include" ; then
+ CF_ADD_INCDIR($cf_searchpath/../include)
+ ifelse([$2],,,[else
+$2])
+ fi
+ if test -d "$cf_searchpath/lib" ; then
+ CF_ADD_LIBDIR($cf_searchpath/lib)
+ elif test -d "$cf_searchpath" ; then
+ CF_ADD_LIBDIR($cf_searchpath)
+ ifelse([$2],,,[else
+$2])
+ fi
+done
+])
+dnl ---------------------------------------------------------------------------
+dnl CF_ADD_SUBDIR_PATH version: 5 updated: 2020/12/31 20:19:42
+dnl ------------------
+dnl Append to a search-list for a nonstandard header/lib-file
+dnl $1 = the variable to return as result
+dnl $2 = the package name
+dnl $3 = the subdirectory, e.g., bin, include or lib
+dnl $4 = the directory under which we will test for subdirectories
+dnl $5 = a directory that we do not want $4 to match
+AC_DEFUN([CF_ADD_SUBDIR_PATH],
+[
+test "x$4" != "x$5" && \
+test -d "$4" && \
+ifelse([$5],NONE,,[{ test -z "$5" || test "x$5" = xNONE || test "x$4" != "x$5"; } &&]) {
+ test -n "$verbose" && echo " ... testing for $3-directories under $4"
+ test -d "$4/$3" && $1="[$]$1 $4/$3"
+ test -d "$4/$3/$2" && $1="[$]$1 $4/$3/$2"
+ test -d "$4/$3/$2/$3" && $1="[$]$1 $4/$3/$2/$3"
+ test -d "$4/$2/$3" && $1="[$]$1 $4/$2/$3"
+ test -d "$4/$2/$3/$2" && $1="[$]$1 $4/$2/$3/$2"
+}
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ALT_CHAR_SET version: 10 updated: 2021/06/08 18:08:14
+dnl ---------------
+dnl Check for existence of alternate-character-set support in curses, so we
+dnl can decide to use it for box characters.
+dnl
+AC_DEFUN([CF_ALT_CHAR_SET],
+[
+AC_MSG_CHECKING([if curses supports alternate-character set])
+AC_CACHE_VAL(cf_cv_alt_char_set,[
+for mapname in acs_map _acs_map
+do
+ AC_TRY_LINK([
+#include <${cf_cv_ncurses_header:-curses.h}>
+ ],[chtype x = ${mapname}['l']; ${mapname}['m'] = 0; (void)x],
+ [cf_cv_alt_char_set=$mapname
+ break],
+ [cf_cv_alt_char_set=no])
+done
+ ])
+AC_MSG_RESULT($cf_cv_alt_char_set)
+test "$cf_cv_alt_char_set" != no && AC_DEFINE_UNQUOTED(ALT_CHAR_SET,$cf_cv_alt_char_set,[Define to 1 if if curses supports alternate-character set])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ANSI_CC_CHECK version: 13 updated: 2012/10/06 11:17:15
+dnl ----------------
+dnl This was originally adapted from the macros 'fp_PROG_CC_STDC' and
+dnl 'fp_C_PROTOTYPES' in the sharutils 4.2 distribution.
+AC_DEFUN([CF_ANSI_CC_CHECK],
+[
+CF_CC_ENV_FLAGS
+
+AC_CACHE_CHECK(for ${CC:-cc} option to accept ANSI C, cf_cv_ansi_cc,[
+cf_cv_ansi_cc=no
+cf_save_CFLAGS="$CFLAGS"
+cf_save_CPPFLAGS="$CPPFLAGS"
+# Don't try gcc -ansi; that turns off useful extensions and
+# breaks some systems' header files.
+# AIX -qlanglvl=ansi
+# Ultrix and OSF/1 -std1
+# HP-UX -Aa -D_HPUX_SOURCE
+# SVR4 -Xc
+# UnixWare 1.2 (cannot use -Xc, since ANSI/POSIX clashes)
+for cf_arg in "-DCC_HAS_PROTOS" \
+ "" \
+ -qlanglvl=ansi \
+ -std1 \
+ -Ae \
+ "-Aa -D_HPUX_SOURCE" \
+ -Xc
+do
+ CF_ADD_CFLAGS($cf_arg)
+ AC_TRY_COMPILE(
+[
+#ifndef CC_HAS_PROTOS
+#if !defined(__STDC__) || (__STDC__ != 1)
+choke me
+#endif
+#endif
+],[
+ int test (int i, double x);
+ struct s1 {int (*f) (int a);};
+ struct s2 {int (*f) (double a);};],
+ [cf_cv_ansi_cc="$cf_arg"; break])
+done
+CFLAGS="$cf_save_CFLAGS"
+CPPFLAGS="$cf_save_CPPFLAGS"
+])
+
+if test "$cf_cv_ansi_cc" != "no"; then
+if test ".$cf_cv_ansi_cc" != ".-DCC_HAS_PROTOS"; then
+ CF_ADD_CFLAGS($cf_cv_ansi_cc)
+else
+ AC_DEFINE(CC_HAS_PROTOS,1,[Define to 1 if C compiler supports prototypes])
+fi
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ANSI_CC_REQD version: 4 updated: 2008/03/23 14:48:54
+dnl ---------------
+dnl For programs that must use an ANSI compiler, obtain compiler options that
+dnl will make it recognize prototypes. We'll do preprocessor checks in other
+dnl macros, since tools such as unproto can fake prototypes, but only part of
+dnl the preprocessor.
+AC_DEFUN([CF_ANSI_CC_REQD],
+[AC_REQUIRE([CF_ANSI_CC_CHECK])
+if test "$cf_cv_ansi_cc" = "no"; then
+ AC_MSG_ERROR(
+[Your compiler does not appear to recognize prototypes.
+You have the following choices:
+ a. adjust your compiler options
+ b. get an up-to-date compiler
+ c. use a wrapper such as unproto])
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_APPEND_CFLAGS version: 3 updated: 2021/09/05 17:25:40
+dnl ----------------
+dnl Use CF_ADD_CFLAGS after first checking for potential redefinitions.
+dnl $1 = flags to add
+dnl $2 = if given makes this macro verbose.
+define([CF_APPEND_CFLAGS],
+[
+for cf_add_cflags in $1
+do
+ case "x$cf_add_cflags" in
+ (x-[[DU]]*)
+ CF_REMOVE_CFLAGS($cf_add_cflags,CFLAGS,[$2])
+ CF_REMOVE_CFLAGS($cf_add_cflags,CPPFLAGS,[$2])
+ ;;
+ esac
+ CF_ADD_CFLAGS([$cf_add_cflags],[$2])
+done
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_APPEND_TEXT version: 1 updated: 2017/02/25 18:58:55
+dnl --------------
+dnl use this macro for appending text without introducing an extra blank at
+dnl the beginning
+define([CF_APPEND_TEXT],
+[
+ test -n "[$]$1" && $1="[$]$1 "
+ $1="[$]{$1}$2"
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ARG_DISABLE version: 3 updated: 1999/03/30 17:24:31
+dnl --------------
+dnl Allow user to disable a normally-on option.
+AC_DEFUN([CF_ARG_DISABLE],
+[CF_ARG_OPTION($1,[$2],[$3],[$4],yes)])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ARG_ENABLE version: 3 updated: 1999/03/30 17:24:31
+dnl -------------
+dnl Allow user to enable a normally-off option.
+AC_DEFUN([CF_ARG_ENABLE],
+[CF_ARG_OPTION($1,[$2],[$3],[$4],no)])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ARG_OPTION version: 5 updated: 2015/05/10 19:52:14
+dnl -------------
+dnl Restricted form of AC_ARG_ENABLE that ensures user doesn't give bogus
+dnl values.
+dnl
+dnl Parameters:
+dnl $1 = option name
+dnl $2 = help-string
+dnl $3 = action to perform if option is not default
+dnl $4 = action if perform if option is default
+dnl $5 = default option value (either 'yes' or 'no')
+AC_DEFUN([CF_ARG_OPTION],
+[AC_ARG_ENABLE([$1],[$2],[test "$enableval" != ifelse([$5],no,yes,no) && enableval=ifelse([$5],no,no,yes)
+ if test "$enableval" != "$5" ; then
+ifelse([$3],,[ :]dnl
+,[ $3]) ifelse([$4],,,[
+ else
+ $4])
+ fi],[enableval=$5 ifelse([$4],,,[
+ $4
+])dnl
+])])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_AR_FLAGS version: 9 updated: 2021/01/01 13:31:04
+dnl -----------
+dnl Check for suitable "ar" (archiver) options for updating an archive.
+dnl
+dnl In particular, handle some obsolete cases where the "-" might be omitted,
+dnl as well as a workaround for breakage of make's archive rules by the GNU
+dnl binutils "ar" program.
+AC_DEFUN([CF_AR_FLAGS],[
+AC_REQUIRE([CF_PROG_AR])
+
+AC_CACHE_CHECK(for options to update archives, cf_cv_ar_flags,[
+ case "$cf_cv_system_name" in
+ (*-msvc*)
+ cf_cv_ar_flags=''
+ cat >mk_static_lib.sh <<-EOF
+ #!$SHELL
+ MSVC_BIN="[$]AR"
+ out="\[$]1"
+ shift
+ exec \[$]MSVC_BIN -out:"\[$]out" \[$]@
+ EOF
+ chmod +x mk_static_lib.sh
+ AR=`pwd`/mk_static_lib.sh
+ ;;
+ (*)
+ cf_cv_ar_flags=unknown
+ for cf_ar_flags in -curvU -curv curv -crv crv -cqv cqv -rv rv
+ do
+
+ # check if $ARFLAGS already contains this choice
+ if test "x$ARFLAGS" != "x" ; then
+ cf_check_ar_flags=`echo "x$ARFLAGS" | sed -e "s/$cf_ar_flags\$//" -e "s/$cf_ar_flags / /"`
+ if test "x$ARFLAGS" != "$cf_check_ar_flags" ; then
+ cf_cv_ar_flags=
+ break
+ fi
+ fi
+
+ rm -f "conftest.$ac_cv_objext"
+ rm -f conftest.a
+
+ cat >"conftest.$ac_ext" <<EOF
+#line __oline__ "configure"
+int testdata[[3]] = { 123, 456, 789 };
+EOF
+ if AC_TRY_EVAL(ac_compile) ; then
+ echo "$AR $ARFLAGS $cf_ar_flags conftest.a conftest.$ac_cv_objext" >&AC_FD_CC
+ $AR $ARFLAGS "$cf_ar_flags" conftest.a "conftest.$ac_cv_objext" 2>&AC_FD_CC 1>/dev/null
+ if test -f conftest.a ; then
+ cf_cv_ar_flags="$cf_ar_flags"
+ break
+ fi
+ else
+ CF_VERBOSE(cannot compile test-program)
+ break
+ fi
+ done
+ rm -f conftest.a "conftest.$ac_ext" "conftest.$ac_cv_objext"
+ ;;
+ esac
+])
+
+if test -n "$ARFLAGS" ; then
+ if test -n "$cf_cv_ar_flags" ; then
+ ARFLAGS="$ARFLAGS $cf_cv_ar_flags"
+ fi
+else
+ ARFLAGS=$cf_cv_ar_flags
+fi
+
+AC_SUBST(ARFLAGS)
+])
+dnl ---------------------------------------------------------------------------
+dnl CF_BOOL_DEFS version: 5 updated: 2012/11/08 20:57:52
+dnl ------------
+dnl Check if curses.h defines TRUE/FALSE (it does under SVr4).
+AC_DEFUN([CF_BOOL_DEFS],
+[
+AC_MSG_CHECKING(if TRUE/FALSE are defined)
+AC_CACHE_VAL(cf_cv_bool_defs,[
+AC_TRY_COMPILE([
+#include <${cf_cv_ncurses_header:-curses.h}>
+#include <stdio.h>],[int x = TRUE, y = FALSE],
+ [cf_cv_bool_defs=yes],
+ [cf_cv_bool_defs=no])])
+AC_MSG_RESULT($cf_cv_bool_defs)
+if test "$cf_cv_bool_defs" = no ; then
+ AC_DEFINE(TRUE,(1),[Define to TRUE if curses.h does not define])
+ AC_DEFINE(FALSE,(0),[Define to FALSE if curses.h does not define])
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_BUILD_CC version: 11 updated: 2022/12/04 15:40:08
+dnl -----------
+dnl If we're cross-compiling, allow the user to override the tools and their
+dnl options. The configure script is oriented toward identifying the host
+dnl compiler, etc., but we need a build compiler to generate parts of the
+dnl source.
+dnl
+dnl $1 = default for $CPPFLAGS
+dnl $2 = default for $LIBS
+AC_DEFUN([CF_BUILD_CC],[
+CF_ACVERSION_CHECK(2.52,,
+ [AC_REQUIRE([CF_PROG_EXT])])
+if test "$cross_compiling" = yes ; then
+
+ # defaults that we might want to override
+ : ${BUILD_CFLAGS:=''}
+ : ${BUILD_CPPFLAGS:='ifelse([$1],,,[$1])'}
+ : ${BUILD_LDFLAGS:=''}
+ : ${BUILD_LIBS:='ifelse([$2],,,[$2])'}
+ : ${BUILD_EXEEXT:='$x'}
+ : ${BUILD_OBJEXT:='o'}
+
+ AC_ARG_WITH(build-cc,
+ [ --with-build-cc=XXX the build C compiler ($BUILD_CC)],
+ [BUILD_CC="$withval"],
+ [AC_CHECK_PROGS(BUILD_CC, [gcc clang c99 c89 cc cl],none)])
+ AC_MSG_CHECKING(for native build C compiler)
+ AC_MSG_RESULT($BUILD_CC)
+
+ AC_MSG_CHECKING(for native build C preprocessor)
+ AC_ARG_WITH(build-cpp,
+ [ --with-build-cpp=XXX the build C preprocessor ($BUILD_CPP)],
+ [BUILD_CPP="$withval"],
+ [BUILD_CPP='${BUILD_CC} -E'])
+ AC_MSG_RESULT($BUILD_CPP)
+
+ AC_MSG_CHECKING(for native build C flags)
+ AC_ARG_WITH(build-cflags,
+ [ --with-build-cflags=XXX the build C compiler-flags ($BUILD_CFLAGS)],
+ [BUILD_CFLAGS="$withval"])
+ AC_MSG_RESULT($BUILD_CFLAGS)
+
+ AC_MSG_CHECKING(for native build C preprocessor-flags)
+ AC_ARG_WITH(build-cppflags,
+ [ --with-build-cppflags=XXX the build C preprocessor-flags ($BUILD_CPPFLAGS)],
+ [BUILD_CPPFLAGS="$withval"])
+ AC_MSG_RESULT($BUILD_CPPFLAGS)
+
+ AC_MSG_CHECKING(for native build linker-flags)
+ AC_ARG_WITH(build-ldflags,
+ [ --with-build-ldflags=XXX the build linker-flags ($BUILD_LDFLAGS)],
+ [BUILD_LDFLAGS="$withval"])
+ AC_MSG_RESULT($BUILD_LDFLAGS)
+
+ AC_MSG_CHECKING(for native build linker-libraries)
+ AC_ARG_WITH(build-libs,
+ [ --with-build-libs=XXX the build libraries (${BUILD_LIBS})],
+ [BUILD_LIBS="$withval"])
+ AC_MSG_RESULT($BUILD_LIBS)
+
+ # this assumes we're on Unix.
+ BUILD_EXEEXT=
+ BUILD_OBJEXT=o
+
+ : ${BUILD_CC:='${CC}'}
+
+ AC_MSG_CHECKING(if the build-compiler "$BUILD_CC" works)
+
+ cf_save_crossed=$cross_compiling
+ cf_save_ac_link=$ac_link
+ cross_compiling=no
+ cf_build_cppflags=$BUILD_CPPFLAGS
+ test "$cf_build_cppflags" = "#" && cf_build_cppflags=
+ ac_link='$BUILD_CC -o "conftest$ac_exeext" $BUILD_CFLAGS $cf_build_cppflags $BUILD_LDFLAGS "conftest.$ac_ext" $BUILD_LIBS >&AS_MESSAGE_LOG_FD'
+
+ AC_TRY_RUN([#include <stdio.h>
+ int main(int argc, char *argv[])
+ {
+ ${cf_cv_main_return:-return}(argc < 0 || argv == 0 || argv[0] == 0);
+ }
+ ],
+ cf_ok_build_cc=yes,
+ cf_ok_build_cc=no,
+ cf_ok_build_cc=unknown)
+
+ cross_compiling=$cf_save_crossed
+ ac_link=$cf_save_ac_link
+
+ AC_MSG_RESULT($cf_ok_build_cc)
+
+ if test "$cf_ok_build_cc" != yes
+ then
+ AC_MSG_ERROR([Cross-build requires two compilers.
+Use --with-build-cc to specify the native compiler.])
+ fi
+
+else
+ : ${BUILD_CC:='${CC}'}
+ : ${BUILD_CPP:='${CPP}'}
+ : ${BUILD_CFLAGS:='${CFLAGS}'}
+ : ${BUILD_CPPFLAGS:='${CPPFLAGS}'}
+ : ${BUILD_LDFLAGS:='${LDFLAGS}'}
+ : ${BUILD_LIBS:='${LIBS}'}
+ : ${BUILD_EXEEXT:='$x'}
+ : ${BUILD_OBJEXT:='o'}
+fi
+
+AC_SUBST(BUILD_CC)
+AC_SUBST(BUILD_CPP)
+AC_SUBST(BUILD_CFLAGS)
+AC_SUBST(BUILD_CPPFLAGS)
+AC_SUBST(BUILD_LDFLAGS)
+AC_SUBST(BUILD_LIBS)
+AC_SUBST(BUILD_EXEEXT)
+AC_SUBST(BUILD_OBJEXT)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_BUNDLED_INTL version: 20 updated: 2021/01/02 09:31:20
+dnl ---------------
+dnl Top-level macro for configuring an application with a bundled copy of
+dnl the intl and po directories for gettext.
+dnl
+dnl $1 specifies either Makefile or makefile, defaulting to the former.
+dnl $2 if nonempty sets the option to --enable-nls rather than to --disable-nls
+dnl
+dnl Sets variables which can be used to substitute in makefiles:
+dnl GT_YES - "#" comment unless building intl library, otherwise empty
+dnl GT_NO - "#" comment if building intl library, otherwise empty
+dnl INTLDIR_MAKE - to make ./intl directory
+dnl MSG_DIR_MAKE - to make ./po directory
+dnl SUB_MAKEFILE - list of makefiles in ./intl, ./po directories
+dnl
+dnl Defines:
+dnl HAVE_LIBGETTEXT_H if we're using ./intl
+dnl NLS_TEXTDOMAIN
+dnl
+dnl Environment:
+dnl ALL_LINGUAS if set, lists the root names of the ".po" files.
+dnl CONFIG_H assumed to be "config.h"
+dnl PACKAGE must be set, used as default for textdomain
+dnl VERSION may be set, otherwise extract from "VERSION" file.
+dnl
+AC_DEFUN([CF_BUNDLED_INTL],[
+cf_makefile=ifelse($1,,Makefile,$1)
+
+dnl Set of available languages (based on source distribution). Note that
+dnl setting $LINGUAS overrides $ALL_LINGUAS. Some environments set $LINGUAS
+dnl rather than $LC_ALL
+test -z "$ALL_LINGUAS" && ALL_LINGUAS=`test -d "$srcdir/po" && cd "$srcdir/po" && echo *.po|sed -e 's/\.po//g' -e 's/*//'`
+
+# Allow override of "config.h" definition:
+: ${CONFIG_H:=config.h}
+AC_SUBST(CONFIG_H)
+
+if test -z "$PACKAGE" ; then
+ AC_MSG_ERROR([[CF_BUNDLED_INTL] used without setting [PACKAGE] variable])
+fi
+
+if test -z "$VERSION" ; then
+if test -f "$srcdir/VERSION" ; then
+ VERSION=`sed -e '2,$d' "$srcdir/VERSION" |cut -f1`
+else
+ VERSION=unknown
+fi
+fi
+AC_SUBST(VERSION)
+
+AM_GNU_GETTEXT(,,,[$2])
+
+if test "$USE_NLS" = yes ; then
+ AC_ARG_WITH(textdomain,
+ [ --with-textdomain=PKG NLS text-domain (default is package name)],
+ [NLS_TEXTDOMAIN=$withval],
+ [NLS_TEXTDOMAIN=$PACKAGE])
+ AC_DEFINE_UNQUOTED(NLS_TEXTDOMAIN,"$NLS_TEXTDOMAIN",[Define to the nls textdomain value])
+ AC_SUBST(NLS_TEXTDOMAIN)
+fi
+
+INTLDIR_MAKE=
+MSG_DIR_MAKE=
+SUB_MAKEFILE=
+
+dnl this updates SUB_MAKEFILE and MSG_DIR_MAKE:
+CF_OUR_MESSAGES($1)
+
+if test "$USE_INCLUDED_LIBINTL" = yes ; then
+ if test "$nls_cv_force_use_gnu_gettext" = yes ; then
+ :
+ elif test "$nls_cv_use_gnu_gettext" = yes ; then
+ :
+ else
+ INTLDIR_MAKE="#"
+ fi
+ if test -z "$INTLDIR_MAKE"; then
+ AC_DEFINE(HAVE_LIBGETTEXT_H,1,[Define to 1 if we have libgettext.h])
+ for cf_makefile in \
+ $srcdir/intl/Makefile.in \
+ $srcdir/intl/makefile.in
+ do
+ if test -f "$cf_makefile" ; then
+ SUB_MAKEFILE="$SUB_MAKEFILE `echo \"${cf_makefile}\"|sed -e 's,^'$srcdir/',,' -e 's/\.in$//'`:${cf_makefile}"
+ break
+ fi
+ done
+ fi
+else
+ INTLDIR_MAKE="#"
+ if test "$USE_NLS" = yes ; then
+ AC_CHECK_HEADERS(libintl.h)
+ fi
+fi
+
+if test -z "$INTLDIR_MAKE" ; then
+ CF_APPEND_TEXT(CPPFLAGS,-I../intl)
+fi
+
+dnl FIXME: we use this in lynx (the alternative is a spurious dependency upon
+dnl GNU make)
+if test "$BUILD_INCLUDED_LIBINTL" = yes ; then
+ GT_YES="#"
+ GT_NO=
+else
+ GT_YES=
+ GT_NO="#"
+fi
+
+AC_SUBST(INTLDIR_MAKE)
+AC_SUBST(MSG_DIR_MAKE)
+AC_SUBST(GT_YES)
+AC_SUBST(GT_NO)
+
+dnl FIXME: the underlying AM_GNU_GETTEXT macro either needs some fixes or a
+dnl little documentation. It doesn't define anything so that we can ifdef our
+dnl own code, except ENABLE_NLS, which is too vague to be of any use.
+
+if test "$USE_INCLUDED_LIBINTL" = yes ; then
+ if test "$nls_cv_force_use_gnu_gettext" = yes ; then
+ AC_DEFINE(HAVE_GETTEXT,1,[Define to 1 if we have gettext function])
+ elif test "$nls_cv_use_gnu_gettext" = yes ; then
+ AC_DEFINE(HAVE_GETTEXT,1,[Define to 1 if we have gettext function])
+ fi
+ if test -n "$nls_cv_header_intl" ; then
+ AC_DEFINE(HAVE_LIBINTL_H,1,[Define to 1 if we have header-file for libintl])
+ fi
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_C11_NORETURN version: 3 updated: 2021/03/28 11:36:23
+dnl ---------------
+AC_DEFUN([CF_C11_NORETURN],
+[
+AC_MSG_CHECKING(if you want to use C11 _Noreturn feature)
+CF_ARG_ENABLE(stdnoreturn,
+ [ --enable-stdnoreturn enable C11 _Noreturn feature for diagnostics],
+ [enable_stdnoreturn=yes],
+ [enable_stdnoreturn=no])
+AC_MSG_RESULT($enable_stdnoreturn)
+
+if test $enable_stdnoreturn = yes; then
+AC_CACHE_CHECK([for C11 _Noreturn feature], cf_cv_c11_noreturn,
+ [AC_TRY_COMPILE([
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdnoreturn.h>
+static _Noreturn void giveup(void) { exit(0); }
+ ],
+ [if (feof(stdin)) giveup()],
+ cf_cv_c11_noreturn=yes,
+ cf_cv_c11_noreturn=no)
+ ])
+else
+ cf_cv_c11_noreturn=no,
+fi
+
+if test "$cf_cv_c11_noreturn" = yes; then
+ AC_DEFINE(HAVE_STDNORETURN_H, 1,[Define if <stdnoreturn.h> header is available and working])
+ AC_DEFINE_UNQUOTED(STDC_NORETURN,_Noreturn,[Define if C11 _Noreturn keyword is supported])
+ HAVE_STDNORETURN_H=1
+else
+ HAVE_STDNORETURN_H=0
+fi
+
+AC_SUBST(HAVE_STDNORETURN_H)
+AC_SUBST(STDC_NORETURN)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CC_ENV_FLAGS version: 10 updated: 2020/12/31 18:40:20
+dnl ---------------
+dnl Check for user's environment-breakage by stuffing CFLAGS/CPPFLAGS content
+dnl into CC. This will not help with broken scripts that wrap the compiler
+dnl with options, but eliminates a more common category of user confusion.
+dnl
+dnl In particular, it addresses the problem of being able to run the C
+dnl preprocessor in a consistent manner.
+dnl
+dnl Caveat: this also disallows blanks in the pathname for the compiler, but
+dnl the nuisance of having inconsistent settings for compiler and preprocessor
+dnl outweighs that limitation.
+AC_DEFUN([CF_CC_ENV_FLAGS],
+[
+# This should have been defined by AC_PROG_CC
+: "${CC:=cc}"
+
+AC_MSG_CHECKING(\$CFLAGS variable)
+case "x$CFLAGS" in
+(*-[[IUD]]*)
+ AC_MSG_RESULT(broken)
+ AC_MSG_WARN(your environment uses the CFLAGS variable to hold CPPFLAGS options)
+ cf_flags="$CFLAGS"
+ CFLAGS=
+ for cf_arg in $cf_flags
+ do
+ CF_ADD_CFLAGS($cf_arg)
+ done
+ ;;
+(*)
+ AC_MSG_RESULT(ok)
+ ;;
+esac
+
+AC_MSG_CHECKING(\$CC variable)
+case "$CC" in
+(*[[\ \ ]]-*)
+ AC_MSG_RESULT(broken)
+ AC_MSG_WARN(your environment uses the CC variable to hold CFLAGS/CPPFLAGS options)
+ # humor him...
+ cf_prog=`echo "$CC" | sed -e 's/ / /g' -e 's/[[ ]]* / /g' -e 's/[[ ]]*[[ ]]-[[^ ]].*//'`
+ cf_flags=`echo "$CC" | ${AWK:-awk} -v prog="$cf_prog" '{ printf("%s", [substr]([$]0,1+length(prog))); }'`
+ CC="$cf_prog"
+ for cf_arg in $cf_flags
+ do
+ case "x$cf_arg" in
+ (x-[[IUDfgOW]]*)
+ CF_ADD_CFLAGS($cf_arg)
+ ;;
+ (*)
+ CC="$CC $cf_arg"
+ ;;
+ esac
+ done
+ CF_VERBOSE(resulting CC: '$CC')
+ CF_VERBOSE(resulting CFLAGS: '$CFLAGS')
+ CF_VERBOSE(resulting CPPFLAGS: '$CPPFLAGS')
+ ;;
+(*)
+ AC_MSG_RESULT(ok)
+ ;;
+esac
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CHECK_CACHE version: 13 updated: 2020/12/31 10:54:15
+dnl --------------
+dnl Check if we're accidentally using a cache from a different machine.
+dnl Derive the system name, as a check for reusing the autoconf cache.
+dnl
+dnl If we've packaged config.guess and config.sub, run that (since it does a
+dnl better job than uname). Normally we'll use AC_CANONICAL_HOST, but allow
+dnl an extra parameter that we may override, e.g., for AC_CANONICAL_SYSTEM
+dnl which is useful in cross-compiles.
+dnl
+dnl Note: we would use $ac_config_sub, but that is one of the places where
+dnl autoconf 2.5x broke compatibility with autoconf 2.13
+AC_DEFUN([CF_CHECK_CACHE],
+[
+if test -f "$srcdir/config.guess" || test -f "$ac_aux_dir/config.guess" ; then
+ ifelse([$1],,[AC_CANONICAL_HOST],[$1])
+ system_name="$host_os"
+else
+ system_name="`(uname -s -r) 2>/dev/null`"
+ if test -z "$system_name" ; then
+ system_name="`(hostname) 2>/dev/null`"
+ fi
+fi
+test -n "$system_name" && AC_DEFINE_UNQUOTED(SYSTEM_NAME,"$system_name",[Define to the system name.])
+AC_CACHE_VAL(cf_cv_system_name,[cf_cv_system_name="$system_name"])
+
+test -z "$system_name" && system_name="$cf_cv_system_name"
+test -n "$cf_cv_system_name" && AC_MSG_RESULT(Configuring for $cf_cv_system_name)
+
+if test ".$system_name" != ".$cf_cv_system_name" ; then
+ AC_MSG_RESULT(Cached system name ($system_name) does not agree with actual ($cf_cv_system_name))
+ AC_MSG_ERROR("Please remove config.cache and try again.")
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CHECK_CFLAGS version: 4 updated: 2021/01/02 19:22:58
+dnl ---------------
+dnl Conditionally add to $CFLAGS and $CPPFLAGS values which are derived from
+dnl a build-configuration such as imake. These have the pitfall that they
+dnl often contain compiler-specific options which we cannot use, mixed with
+dnl preprocessor options that we usually can.
+AC_DEFUN([CF_CHECK_CFLAGS],
+[
+CF_VERBOSE(checking additions to CFLAGS)
+cf_check_cflags="$CFLAGS"
+cf_check_cppflags="$CPPFLAGS"
+CF_ADD_CFLAGS($1,yes)
+if test "x$cf_check_cflags" != "x$CFLAGS" ; then
+AC_TRY_LINK([#include <stdio.h>],[printf("Hello world");],,
+ [CF_VERBOSE(test-compile failed. Undoing change to \$CFLAGS)
+ if test "x$cf_check_cppflags" != "x$CPPFLAGS" ; then
+ CF_VERBOSE(but keeping change to \$CPPFLAGS)
+ fi
+ CFLAGS="$cf_check_cflags"])
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CHECK_ERRNO version: 13 updated: 2020/03/10 18:53:47
+dnl --------------
+dnl Check for data that is usually declared in <stdio.h> or <errno.h>, e.g.,
+dnl the 'errno' variable. Define a DECL_xxx symbol if we must declare it
+dnl ourselves.
+dnl
+dnl $1 = the name to check
+dnl $2 = the assumed type
+AC_DEFUN([CF_CHECK_ERRNO],
+[
+AC_CACHE_CHECK(if external $1 is declared, cf_cv_dcl_$1,[
+ AC_TRY_COMPILE([
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#include <stdio.h>
+#include <sys/types.h>
+#include <errno.h> ],
+ ifelse([$2],,int,[$2]) x = (ifelse([$2],,int,[$2])) $1; (void)x,
+ [cf_cv_dcl_$1=yes],
+ [cf_cv_dcl_$1=no])
+])
+
+if test "$cf_cv_dcl_$1" = no ; then
+ CF_UPPER(cf_result,decl_$1)
+ AC_DEFINE_UNQUOTED($cf_result)
+fi
+
+# It's possible (for near-UNIX clones) that the data doesn't exist
+CF_CHECK_EXTERN_DATA($1,ifelse([$2],,int,[$2]))
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CHECK_EXTERN_DATA version: 5 updated: 2021/09/04 06:35:04
+dnl --------------------
+dnl Check for existence of external data in the current set of libraries. If
+dnl we can modify it, it is real enough.
+dnl $1 = the name to check
+dnl $2 = its type
+AC_DEFUN([CF_CHECK_EXTERN_DATA],
+[
+AC_CACHE_CHECK(if external $1 exists, cf_cv_have_$1,[
+ AC_TRY_LINK([
+#undef $1
+extern $2 $1;
+],
+ [$1 = 2],
+ [cf_cv_have_$1=yes],
+ [cf_cv_have_$1=no])
+])
+
+if test "$cf_cv_have_$1" = yes ; then
+ CF_UPPER(cf_result,have_$1)
+ AC_DEFINE_UNQUOTED($cf_result)
+fi
+
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CHECK_FUNCDECL version: 7 updated: 2009/10/15 19:39:18
+dnl -----------------
+dnl Check if a function is declared by including a set of include files.
+dnl Invoke the corresponding actions according to whether it is found or not.
+dnl
+dnl Gcc (unlike other compilers) will only warn about the miscast assignment
+dnl in the first test, but most compilers will oblige with an error in the
+dnl second test.
+dnl
+dnl CF_CHECK_FUNCDECL(INCLUDES, FUNCTION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]])
+AC_DEFUN([CF_CHECK_FUNCDECL],
+[
+AC_MSG_CHECKING([for $2 declaration])
+AC_CACHE_VAL(ac_cv_func_decl_$2,
+[AC_TRY_COMPILE([$1],
+[#ifndef $2
+extern int $2();
+#endif],[
+AC_TRY_COMPILE([$1],
+[#ifndef $2
+int (*p)() = $2;
+#endif],[
+eval "ac_cv_func_decl_$2=yes"],[
+eval "ac_cv_func_decl_$2=no"])],[
+eval "ac_cv_func_decl_$2=yes"])])
+if eval "test \"`echo '$ac_cv_func_'decl_$2`\" = yes"; then
+ AC_MSG_RESULT(yes)
+ ifelse([$3], , :, [$3])
+else
+ AC_MSG_RESULT(no)
+ifelse([$4], , , [$4
+])dnl
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CHECK_FUNCDECLS version: 4 updated: 1999/03/30 12:24:31
+dnl ------------------
+dnl Check if functions are declared by including a set of include files.
+dnl and define DECL_XXX if not.
+dnl
+dnl CF_CHECK_FUNCDECLS(INCLUDES, FUNCTION... [, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]])
+AC_DEFUN([CF_CHECK_FUNCDECLS],
+[for ac_func in $2
+do
+CF_CHECK_FUNCDECL([$1], $ac_func,
+[$3],
+[
+ CF_UPPER(ac_tr_func,DECL_$ac_func)
+ AC_DEFINE_UNQUOTED($ac_tr_func) $4])dnl
+done
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CHECK_IPV6 version: 3 updated: 2004/01/22 17:38:22
+dnl -------------
+dnl Check for IPV6 configuration.
+AC_DEFUN([CF_CHECK_IPV6],[
+CF_FIND_IPV6_TYPE
+CF_FIND_IPV6_LIBS
+
+CF_FUNC_GETADDRINFO
+
+if test "$cf_cv_getaddrinfo" != "yes"; then
+ if test "$cf_cv_ipv6type" != "linux"; then
+ AC_MSG_WARN(
+[You must get working getaddrinfo() function,
+or you can specify "--disable-ipv6"])
+ else
+ AC_MSG_WARN(
+[The getaddrinfo() implementation on your system seems be buggy.
+You should upgrade your system library to the newest version
+of GNU C library (aka glibc).])
+ fi
+fi
+
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CHECK_SIZEOF version: 4 updated: 2021/01/02 09:31:20
+dnl ---------------
+dnl Improve on AC_CHECK_SIZEOF for cases when the build-environment is
+dnl deficient, e.g., if someone tries to build in busybox. Use the second
+dnl parameter as the fallback value.
+dnl
+dnl By the way, 2.13/2.52 differ in AC_CHECK_SIZEOF regarding the types they
+dnl can detect; the former includes only stdio.h for types while the latter
+dnl includes several header files.
+AC_DEFUN([CF_CHECK_SIZEOF],[
+AC_CHECK_SIZEOF([$1],[$2])
+if test "${ac_cv_type_$1+set}" = set; then
+ cf_cv_sizeof="$ac_cv_sizeof_$1"
+ if test "${ac_cv_sizeof_$1+set}" != set; then
+ AC_MSG_WARN(using $2 for sizeof $1)
+ ac_cv_sizeof_$1=$2
+ elif test "x${ac_cv_sizeof_$1}" = x0; then
+ AC_MSG_WARN([sizeof $1 not found, using $2])
+ ac_cv_sizeof_$1=$2
+ fi
+ if test "x$ac_cv_sizeof_$1" != "x$cf_cv_sizeof"
+ then
+ CF_UPPER(cf_cv_type,sizeof_$1)
+ sed -e "s/\\([[ ]]${cf_cv_type}[[ ]]\\).*/\\1$ac_cv_sizeof_$1/" confdefs.h >conftest.val
+ mv conftest.val confdefs.h
+ fi
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CHECK_SSL_X509 version: 5 updated: 2014/11/30 18:19:56
+dnl -----------------
+dnl Check for X509 support in the SSL library.
+define([CF_CHECK_SSL_X509],[
+AC_MSG_CHECKING(for X509 support)
+AC_TRY_LINK(CF__SSL_HEAD [
+#if defined(USE_GNUTLS_INCL)
+#include <gnutls/x509.h>
+#else
+#include <openssl/x509.h>
+#endif
+],
+ [X509_verify_cert_error_string(X509_STORE_CTX_get_error(NULL))],
+ [cf_x509_support=yes],
+ [cf_x509_support=no])
+AC_MSG_RESULT($cf_x509_support)
+
+if test "$cf_x509_support" = yes ; then
+ AC_DEFINE(USE_X509_SUPPORT)
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CHECK_TYPE version: 4 updated: 2021/01/02 09:31:20
+dnl -------------
+dnl Add a 3rd parameter to AC_CHECK_TYPE, working around autoconf 2.5x's
+dnl deliberate incompatibility.
+dnl $1 = name of type to check for
+dnl $2 = default type
+dnl $3 = additional #include's and related preprocessor lines.
+ifdef([m4_HAS_AC_CT_FOURARGS], [m4_undefine([m4_HAS_AC_CT_FOURARGS])])dnl
+ifelse(m4_PACKAGE_VERSION, [fnord_acsalt], [],
+[ifdef([m4_version_compare],[m4_define([m4_HAS_AC_CT_FOURARGS])])])dnl
+AC_DEFUN([CF_CHECK_TYPE],
+[
+ifdef([m4_HAS_AC_CT_FOURARGS],[
+ AC_CHECK_TYPE([$1],ac_cv_type_$1=yes,ac_cv_type_$1=no,[$3])
+ ],[
+ AC_MSG_CHECKING(for $1)
+ AC_TRY_COMPILE([
+#if STDC_HEADERS
+#include <stdlib.h>
+#include <stddef.h>
+#endif
+$3
+],[
+ static $1 dummy; if (sizeof(dummy)) return 0; else return 1;],
+ ac_cv_type_$1=yes,
+ ac_cv_type_$1=no)
+ AC_MSG_RESULT($ac_cv_type_$1)
+])dnl
+if test "$ac_cv_type_$1" = no; then
+ AC_DEFINE($1, $2, Define to $2 if $1 is not declared)
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CLANG_COMPILER version: 8 updated: 2021/01/01 13:31:04
+dnl -----------------
+dnl Check if the given compiler is really clang. clang's C driver defines
+dnl __GNUC__ (fooling the configure script into setting $GCC to yes) but does
+dnl not ignore some gcc options.
+dnl
+dnl This macro should be run "soon" after AC_PROG_CC or AC_PROG_CPLUSPLUS, to
+dnl ensure that it is not mistaken for gcc/g++. It is normally invoked from
+dnl the wrappers for gcc and g++ warnings.
+dnl
+dnl $1 = GCC (default) or GXX
+dnl $2 = CLANG_COMPILER (default)
+dnl $3 = CFLAGS (default) or CXXFLAGS
+AC_DEFUN([CF_CLANG_COMPILER],[
+ifelse([$2],,CLANG_COMPILER,[$2])=no
+
+if test "$ifelse([$1],,[$1],GCC)" = yes ; then
+ AC_MSG_CHECKING(if this is really Clang ifelse([$1],GXX,C++,C) compiler)
+ cf_save_CFLAGS="$ifelse([$3],,CFLAGS,[$3])"
+ AC_TRY_COMPILE([],[
+#ifdef __clang__
+#else
+make an error
+#endif
+],[ifelse([$2],,CLANG_COMPILER,[$2])=yes
+],[])
+ ifelse([$3],,CFLAGS,[$3])="$cf_save_CFLAGS"
+ AC_MSG_RESULT($ifelse([$2],,CLANG_COMPILER,[$2]))
+fi
+
+CLANG_VERSION=none
+
+if test "x$ifelse([$2],,CLANG_COMPILER,[$2])" = "xyes" ; then
+ case "$CC" in
+ (c[[1-9]][[0-9]]|*/c[[1-9]][[0-9]])
+ AC_MSG_WARN(replacing broken compiler alias $CC)
+ CFLAGS="$CFLAGS -std=`echo "$CC" | sed -e 's%.*/%%'`"
+ CC=clang
+ ;;
+ esac
+
+ AC_MSG_CHECKING(version of $CC)
+ CLANG_VERSION="`$CC --version 2>/dev/null | sed -e '2,$d' -e 's/^.*(CLANG[[^)]]*) //' -e 's/^.*(Debian[[^)]]*) //' -e 's/^[[^0-9.]]*//' -e 's/[[^0-9.]].*//'`"
+ test -z "$CLANG_VERSION" && CLANG_VERSION=unknown
+ AC_MSG_RESULT($CLANG_VERSION)
+
+ for cf_clang_opt in \
+ -Qunused-arguments \
+ -Wno-error=implicit-function-declaration
+ do
+ AC_MSG_CHECKING(if option $cf_clang_opt works)
+ cf_save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS $cf_clang_opt"
+ AC_TRY_LINK([
+ #include <stdio.h>],[
+ printf("hello!\\n");],[
+ cf_clang_optok=yes],[
+ cf_clang_optok=no])
+ AC_MSG_RESULT($cf_clang_optok)
+ CFLAGS="$cf_save_CFLAGS"
+ if test "$cf_clang_optok" = yes; then
+ CF_VERBOSE(adding option $cf_clang_opt)
+ CF_APPEND_TEXT(CFLAGS,$cf_clang_opt)
+ fi
+ done
+fi
+])
+dnl ---------------------------------------------------------------------------
+dnl CF_COLOR_CURSES version: 9 updated: 2021/01/02 09:31:20
+dnl ---------------
+dnl Check if curses supports color. (Note that while SVr3 curses supports
+dnl color, it does this differently from SVr4 curses; more work would be needed
+dnl to accommodate SVr3).
+dnl
+AC_DEFUN([CF_COLOR_CURSES],
+[
+AC_MSG_CHECKING(if curses supports color attributes)
+AC_CACHE_VAL(cf_cv_color_curses,[
+ AC_TRY_LINK([
+#include <${cf_cv_ncurses_header:-curses.h}>
+],
+ [chtype x = COLOR_BLUE;
+ has_colors();
+ start_color();
+#ifndef NCURSES_BROKEN
+ wbkgd(curscr, getbkgd(stdscr)); /* X/Open XPG4 aka SVr4 Curses */
+#endif
+ ],
+ [cf_cv_color_curses=yes],
+ [cf_cv_color_curses=no])
+ ])
+AC_MSG_RESULT($cf_cv_color_curses)
+if test "$cf_cv_color_curses" = yes ; then
+ AC_DEFINE(COLOR_CURSES,1,[Define to 1 if if curses supports color attributes])
+ test ".$cf_cv_ncurses_broken" != .yes && AC_DEFINE(HAVE_GETBKGD,1,[Define to 1 if curses has getbkgd function])
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CONST_X_STRING version: 7 updated: 2021/06/07 17:39:17
+dnl -----------------
+dnl The X11R4-X11R6 Xt specification uses an ambiguous String type for most
+dnl character-strings.
+dnl
+dnl It is ambiguous because the specification accommodated the pre-ANSI
+dnl compilers bundled by more than one vendor in lieu of providing a standard C
+dnl compiler other than by costly add-ons. Because of this, the specification
+dnl did not take into account the use of const for telling the compiler that
+dnl string literals would be in readonly memory.
+dnl
+dnl As a workaround, one could (starting with X11R5) define XTSTRINGDEFINES, to
+dnl let the compiler decide how to represent Xt's strings which were #define'd.
+dnl That does not solve the problem of using the block of Xt's strings which
+dnl are compiled into the library (and is less efficient than one might want).
+dnl
+dnl Xt specification 7 introduces the _CONST_X_STRING symbol which is used both
+dnl when compiling the library and compiling using the library, to tell the
+dnl compiler that String is const.
+AC_DEFUN([CF_CONST_X_STRING],
+[
+AC_REQUIRE([AC_PATH_XTRA])
+
+CF_SAVE_XTRA_FLAGS([CF_CONST_X_STRING])
+
+AC_TRY_COMPILE(
+[
+#include <stdlib.h>
+#include <X11/Intrinsic.h>
+],
+[String foo = malloc(1); free((void*)foo)],[
+
+AC_CACHE_CHECK(for X11/Xt const-feature,cf_cv_const_x_string,[
+ AC_TRY_COMPILE(
+ [
+#define _CONST_X_STRING /* X11R7.8 (perhaps) */
+#undef XTSTRINGDEFINES /* X11R5 and later */
+#include <stdlib.h>
+#include <X11/Intrinsic.h>
+ ],[String foo = malloc(1); *foo = 0],[
+ cf_cv_const_x_string=no
+ ],[
+ cf_cv_const_x_string=yes
+ ])
+])
+
+CF_RESTORE_XTRA_FLAGS([CF_CONST_X_STRING])
+
+case "$cf_cv_const_x_string" in
+(no)
+ CF_APPEND_TEXT(CPPFLAGS,-DXTSTRINGDEFINES)
+ ;;
+(*)
+ CF_APPEND_TEXT(CPPFLAGS,-D_CONST_X_STRING)
+ ;;
+esac
+
+])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CURSES_CHTYPE version: 11 updated: 2021/01/02 09:31:20
+dnl ----------------
+dnl Test if curses defines 'chtype' (usually a 'long' type for SysV curses).
+AC_DEFUN([CF_CURSES_CHTYPE],
+[
+AC_REQUIRE([CF_CURSES_CPPFLAGS])dnl
+AC_CACHE_CHECK(for chtype typedef,cf_cv_chtype_decl,[
+ AC_TRY_COMPILE([#include <${cf_cv_ncurses_header:-curses.h}>],
+ [chtype foo; (void)foo],
+ [cf_cv_chtype_decl=yes],
+ [cf_cv_chtype_decl=no])])
+if test "$cf_cv_chtype_decl" = yes ; then
+ AC_DEFINE(HAVE_TYPE_CHTYPE,1,[Define to 1 if chtype is declared])
+ AC_CACHE_CHECK(if chtype is scalar or struct,cf_cv_chtype_type,[
+ AC_TRY_COMPILE([#include <${cf_cv_ncurses_header:-curses.h}>],
+ [static chtype foo; long x = foo; (void)x],
+ [cf_cv_chtype_type=scalar],
+ [cf_cv_chtype_type=struct])])
+ if test "$cf_cv_chtype_type" = scalar ; then
+ AC_DEFINE(TYPE_CHTYPE_IS_SCALAR,1,[Define to 1 if chtype is a scaler/integer])
+ fi
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CURSES_CONFIG version: 2 updated: 2006/10/29 11:06:27
+dnl ----------------
+dnl Tie together the configure-script macros for curses. It may be ncurses,
+dnl but unless asked, we do not make a special search for ncurses. However,
+dnl still check for the ncurses version number, for use in other macros.
+AC_DEFUN([CF_CURSES_CONFIG],
+[
+CF_CURSES_CPPFLAGS
+CF_NCURSES_VERSION
+CF_CURSES_LIBS
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CURSES_CPPFLAGS version: 14 updated: 2021/01/02 09:31:20
+dnl ------------------
+dnl Look for the curses headers.
+AC_DEFUN([CF_CURSES_CPPFLAGS],[
+
+AC_CACHE_CHECK(for extra include directories,cf_cv_curses_incdir,[
+cf_cv_curses_incdir=no
+case "$host_os" in
+(hpux10.*)
+ if test "x$cf_cv_screen" = "xcurses_colr"
+ then
+ test -d /usr/include/curses_colr && \
+ cf_cv_curses_incdir="-I/usr/include/curses_colr"
+ fi
+ ;;
+(sunos3*|sunos4*)
+ if test "x$cf_cv_screen" = "xcurses_5lib"
+ then
+ test -d /usr/5lib && \
+ test -d /usr/5include && \
+ cf_cv_curses_incdir="-I/usr/5include"
+ fi
+ ;;
+esac
+])
+if test "$cf_cv_curses_incdir" != no
+then
+ CF_APPEND_TEXT(CPPFLAGS,$cf_cv_curses_incdir)
+fi
+
+CF_CURSES_HEADER
+CF_TERM_HEADER
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CURSES_FUNCS version: 20 updated: 2020/12/31 20:19:42
+dnl ---------------
+dnl Curses-functions are a little complicated, since a lot of them are macros.
+AC_DEFUN([CF_CURSES_FUNCS],
+[
+AC_REQUIRE([CF_CURSES_CPPFLAGS])dnl
+AC_REQUIRE([CF_XOPEN_CURSES])
+AC_REQUIRE([CF_CURSES_TERM_H])
+AC_REQUIRE([CF_CURSES_UNCTRL_H])
+for cf_func in $1
+do
+ CF_UPPER(cf_tr_func,$cf_func)
+ AC_MSG_CHECKING(for ${cf_func})
+ CF_MSG_LOG(${cf_func})
+ AC_CACHE_VAL(cf_cv_func_$cf_func,[
+ eval cf_result='$ac_cv_func_'$cf_func
+ if test ".$cf_result" != ".no"; then
+ AC_TRY_LINK(CF__CURSES_HEAD,
+ [
+#ifndef ${cf_func}
+long foo = (long)(&${cf_func});
+fprintf(stderr, "testing linkage of $cf_func:%p\\n", (void *)foo);
+if (foo + 1234L > 5678L)
+ ${cf_cv_main_return:-return}(foo != 0);
+#endif
+ ],
+ [cf_result=yes],
+ [cf_result=no])
+ fi
+ eval 'cf_cv_func_'$cf_func'="$cf_result"'
+ ])
+ # use the computed/retrieved cache-value:
+ eval 'cf_result=$cf_cv_func_'$cf_func
+ AC_MSG_RESULT($cf_result)
+ if test "$cf_result" != no; then
+ AC_DEFINE_UNQUOTED(HAVE_${cf_tr_func})
+ fi
+done
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CURSES_HEADER version: 6 updated: 2022/12/02 20:06:52
+dnl ----------------
+dnl Find a "curses" header file, e.g,. "curses.h", or one of the more common
+dnl variations of ncurses' installs.
+dnl
+dnl $1 = ncurses when looking for ncurses, or is empty
+AC_DEFUN([CF_CURSES_HEADER],[
+AC_CACHE_CHECK(if we have identified curses headers,cf_cv_ncurses_header,[
+cf_cv_ncurses_header=none
+for cf_header in \
+ ncurses.h ifelse($1,,,[$1/ncurses.h]) \
+ curses.h ifelse($1,,,[$1/curses.h]) ifelse($1,,[ncurses/ncurses.h ncurses/curses.h])
+do
+AC_TRY_COMPILE([#include <${cf_header}>],
+ [initscr(); endwin()],
+ [cf_cv_ncurses_header=$cf_header; break],[])
+done
+])
+
+if test "$cf_cv_ncurses_header" = none ; then
+ AC_MSG_ERROR(No curses header-files found)
+fi
+
+# cheat, to get the right #define's for HAVE_NCURSES_H, etc.
+AC_CHECK_HEADERS($cf_cv_ncurses_header)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CURSES_LIBS version: 45 updated: 2022/12/02 20:06:52
+dnl --------------
+dnl Look for the curses libraries. Older curses implementations may require
+dnl termcap/termlib to be linked as well. Call CF_CURSES_CPPFLAGS first.
+AC_DEFUN([CF_CURSES_LIBS],[
+
+AC_REQUIRE([CF_CURSES_CPPFLAGS])dnl
+AC_MSG_CHECKING(if we have identified curses libraries)
+AC_TRY_LINK([#include <${cf_cv_ncurses_header:-curses.h}>],
+ [initscr(); endwin()],
+ cf_result=yes,
+ cf_result=no)
+AC_MSG_RESULT($cf_result)
+
+if test "$cf_result" = no ; then
+case "$host_os" in
+(freebsd*)
+ AC_CHECK_LIB(mytinfo,tgoto,[CF_ADD_LIBS(-lmytinfo)])
+ ;;
+(hpux10.*)
+ # Looking at HPUX 10.20, the Hcurses library is the oldest (1997), cur_colr
+ # next (1998), and xcurses "newer" (2000). There is no header file for
+ # Hcurses; the subdirectory curses_colr has the headers (curses.h and
+ # term.h) for cur_colr
+ if test "x$cf_cv_screen" = "xcurses_colr"
+ then
+ AC_CHECK_LIB(cur_colr,initscr,[
+ CF_ADD_LIBS(-lcur_colr)
+ ac_cv_func_initscr=yes
+ ],[
+ AC_CHECK_LIB(Hcurses,initscr,[
+ # HP's header uses __HP_CURSES, but user claims _HP_CURSES.
+ CF_ADD_LIBS(-lHcurses)
+ CF_APPEND_TEXT(CPPFLAGS,-D__HP_CURSES -D_HP_CURSES)
+ ac_cv_func_initscr=yes
+ ])])
+ fi
+ ;;
+(linux*)
+ case `arch 2>/dev/null` in
+ (x86_64)
+ if test -d /lib64
+ then
+ CF_ADD_LIBDIR(/lib64)
+ else
+ CF_ADD_LIBDIR(/lib)
+ fi
+ ;;
+ (*)
+ CF_ADD_LIBDIR(/lib)
+ ;;
+ esac
+ ;;
+(sunos3*|sunos4*)
+ if test "x$cf_cv_screen" = "xcurses_5lib"
+ then
+ if test -d /usr/5lib ; then
+ CF_ADD_LIBDIR(/usr/5lib)
+ CF_ADD_LIBS(-lcurses -ltermcap)
+ fi
+ fi
+ ac_cv_func_initscr=yes
+ ;;
+esac
+
+if test ".$ac_cv_func_initscr" != .yes ; then
+ cf_save_LIBS="$LIBS"
+
+ if test ".${cf_cv_ncurses_version:-no}" != .no
+ then
+ cf_check_list="ncurses curses cursesX"
+ else
+ cf_check_list="cursesX curses ncurses"
+ fi
+
+ # Check for library containing tgoto. Do this before curses library
+ # because it may be needed to link the test-case for initscr.
+ if test "x$cf_term_lib" = x
+ then
+ AC_CHECK_FUNC(tgoto,[cf_term_lib=predefined],[
+ for cf_term_lib in $cf_check_list otermcap termcap tinfo termlib unknown
+ do
+ AC_CHECK_LIB($cf_term_lib,tgoto,[
+ : "${cf_nculib_root:=$cf_term_lib}"
+ break
+ ])
+ done
+ ])
+ fi
+
+ # Check for library containing initscr
+ test "$cf_term_lib" != predefined && test "$cf_term_lib" != unknown && LIBS="-l$cf_term_lib $cf_save_LIBS"
+ if test "x$cf_curs_lib" = x
+ then
+ for cf_curs_lib in $cf_check_list xcurses jcurses pdcurses unknown
+ do
+ LIBS="-l$cf_curs_lib $cf_save_LIBS"
+ if test "$cf_term_lib" = unknown || test "$cf_term_lib" = "$cf_curs_lib" ; then
+ AC_MSG_CHECKING(if we can link with $cf_curs_lib library)
+ AC_TRY_LINK([#include <${cf_cv_ncurses_header:-curses.h}>],
+ [initscr()],
+ [cf_result=yes],
+ [cf_result=no])
+ AC_MSG_RESULT($cf_result)
+ test "$cf_result" = yes && break
+ elif test "$cf_curs_lib" = "$cf_term_lib" ; then
+ cf_result=no
+ elif test "$cf_term_lib" != predefined ; then
+ AC_MSG_CHECKING(if we need both $cf_curs_lib and $cf_term_lib libraries)
+ AC_TRY_LINK([#include <${cf_cv_ncurses_header:-curses.h}>],
+ [initscr(); endwin();],
+ [cf_result=no],
+ [
+ LIBS="-l$cf_curs_lib -l$cf_term_lib $cf_save_LIBS"
+ AC_TRY_LINK([#include <${cf_cv_ncurses_header:-curses.h}>],
+ [initscr()],
+ [cf_result=yes],
+ [cf_result=error])
+ ])
+ AC_MSG_RESULT($cf_result)
+ test "$cf_result" != error && break
+ fi
+ done
+ fi
+ test "$cf_curs_lib" = unknown && AC_MSG_ERROR(no curses library found)
+fi
+fi
+
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CURSES_TERM_H version: 15 updated: 2021/01/02 09:31:20
+dnl ----------------
+dnl SVr4 curses should have term.h as well (where it puts the definitions of
+dnl the low-level interface). This may not be true in old/broken implementations,
+dnl as well as in misconfigured systems (e.g., gcc configured for Solaris 2.4
+dnl running with Solaris 2.5.1).
+AC_DEFUN([CF_CURSES_TERM_H],
+[
+AC_REQUIRE([CF_CURSES_CPPFLAGS])dnl
+
+AC_CACHE_CHECK(for term.h, cf_cv_term_header,[
+
+# If we found <ncurses/curses.h>, look for <ncurses/term.h>, but always look
+# for <term.h> if we do not find the variant.
+
+cf_header_list="term.h ncurses/term.h ncursesw/term.h"
+
+case "${cf_cv_ncurses_header:-curses.h}" in
+(*/*)
+ cf_header_item=`echo "${cf_cv_ncurses_header:-curses.h}" | sed -e 's%\..*%%' -e 's%/.*%/%'`term.h
+ cf_header_list="$cf_header_item $cf_header_list"
+ ;;
+esac
+
+for cf_header in $cf_header_list
+do
+ AC_TRY_COMPILE([
+#include <${cf_cv_ncurses_header:-curses.h}>
+#include <${cf_header}>],
+ [WINDOW *x; (void)x],
+ [cf_cv_term_header=$cf_header
+ break],
+ [cf_cv_term_header=no])
+done
+
+case "$cf_cv_term_header" in
+(no)
+ # If curses is ncurses, some packagers still mess it up by trying to make
+ # us use GNU termcap. This handles the most common case.
+ for cf_header in ncurses/term.h ncursesw/term.h
+ do
+ AC_TRY_COMPILE([
+#include <${cf_cv_ncurses_header:-curses.h}>
+#ifdef NCURSES_VERSION
+#include <${cf_header}>
+#else
+make an error
+#endif],
+ [WINDOW *x; (void)x],
+ [cf_cv_term_header=$cf_header
+ break],
+ [cf_cv_term_header=no])
+ done
+ ;;
+esac
+])
+
+case "$cf_cv_term_header" in
+(term.h)
+ AC_DEFINE(HAVE_TERM_H,1,[Define to 1 if we have term.h])
+ ;;
+(ncurses/term.h)
+ AC_DEFINE(HAVE_NCURSES_TERM_H,1,[Define to 1 if we have ncurses/term.h])
+ ;;
+(ncursesw/term.h)
+ AC_DEFINE(HAVE_NCURSESW_TERM_H,1,[Define to 1 if we have ncursesw/term.h])
+ ;;
+esac
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CURSES_UNCTRL_H version: 8 updated: 2021/01/02 09:31:20
+dnl ------------------
+dnl Any X/Open curses implementation must have unctrl.h, but ncurses packages
+dnl may put it in a subdirectory (along with ncurses' other headers, of
+dnl course). Packages which put the headers in inconsistent locations are
+dnl broken).
+AC_DEFUN([CF_CURSES_UNCTRL_H],
+[
+AC_REQUIRE([CF_CURSES_CPPFLAGS])dnl
+
+AC_CACHE_CHECK(for unctrl.h, cf_cv_unctrl_header,[
+
+# If we found <ncurses/curses.h>, look for <ncurses/unctrl.h>, but always look
+# for <unctrl.h> if we do not find the variant.
+
+cf_header_list="unctrl.h ncurses/unctrl.h ncursesw/unctrl.h"
+
+case "${cf_cv_ncurses_header:-curses.h}" in
+(*/*)
+ cf_header_item=`echo "${cf_cv_ncurses_header:-curses.h}" | sed -e 's%\..*%%' -e 's%/.*%/%'`unctrl.h
+ cf_header_list="$cf_header_item $cf_header_list"
+ ;;
+esac
+
+for cf_header in $cf_header_list
+do
+ AC_TRY_COMPILE([
+#include <${cf_cv_ncurses_header:-curses.h}>
+#include <${cf_header}>],
+ [WINDOW *x; (void)x],
+ [cf_cv_unctrl_header=$cf_header
+ break],
+ [cf_cv_unctrl_header=no])
+done
+])
+
+case "$cf_cv_unctrl_header" in
+(no)
+ AC_MSG_WARN(unctrl.h header not found)
+ ;;
+esac
+
+case "$cf_cv_unctrl_header" in
+(unctrl.h)
+ AC_DEFINE(HAVE_UNCTRL_H,1,[Define to 1 if we have unctrl.h])
+ ;;
+(ncurses/unctrl.h)
+ AC_DEFINE(HAVE_NCURSES_UNCTRL_H,1,[Define to 1 if we have ncurses/unctrl.h])
+ ;;
+(ncursesw/unctrl.h)
+ AC_DEFINE(HAVE_NCURSESW_UNCTRL_H,1,[Define to 1 if we have ncursesw/unctrl.h])
+ ;;
+esac
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CURS_PERFORMANCE version: 6 updated: 2021/01/02 09:31:20
+dnl -------------------
+dnl Solaris 2.x curses provides a "performance" tradeoff according to whether
+dnl CURS_PERFORMANCE is defined. If defined, the implementation defines macros
+dnl that access the WINDOW structure. Otherwise, function calls are used.
+AC_DEFUN([CF_CURS_PERFORMANCE],
+[
+AC_MSG_CHECKING([for curses performance tradeoff])
+AC_CACHE_VAL(cf_cv_curs_performance,[
+ cf_cv_curs_performance=no
+ AC_TRY_COMPILE([
+#include <${cf_cv_ncurses_header:-curses.h}>],[
+#if defined(wbkgdset) && defined(clearok) && defined(getbkgd)
+ int x = ERR;
+#else
+ int x = ; /* force an error */
+#endif
+ ],[
+ AC_TRY_COMPILE([
+#define CURS_PERFORMANCE
+#include <${cf_cv_ncurses_header:-curses.h}>],[
+#if defined(wbkgdset) && defined(clearok) && defined(getbkgd)
+ int x = ; /* force an error */
+#else
+ int x = ERR;
+#endif
+ ],[cf_cv_curs_performance=yes])])])
+AC_MSG_RESULT($cf_cv_curs_performance)
+test "$cf_cv_curs_performance" = yes && AC_DEFINE(CURS_PERFORMANCE,1,[Define to 1 ifr curses performance tradeoff available])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CURS_TOUCHLINE version: 5 updated: 2015/04/15 19:08:48
+dnl -----------------
+dnl Check for the flavor of the touchline function, to distinguish between BSD
+dnl and SYSV. This is needed on NetBSD 1.5 which has a partial implementation
+dnl of SVR4 curses.
+AC_DEFUN([CF_CURS_TOUCHLINE],[
+AC_CACHE_CHECK(for curses touchline function,cf_cv_curs_touchline,[
+ AC_TRY_LINK([
+#include <${cf_cv_ncurses_header:-curses.h}>],
+ [touchline(stdscr, 1,2,3);],
+ [cf_cv_curs_touchline=bsd],
+ [AC_TRY_LINK([
+#include <${cf_cv_ncurses_header:-curses.h}>],
+ [touchline(stdscr, 1,2);],
+ [cf_cv_curs_touchline=sysv],
+ [cf_cv_curs_touchline=bsd])])])
+case "$cf_cv_curs_touchline" in
+(bsd)
+ AC_DEFINE(HAVE_BSD_TOUCHLINE,1,[Define to 1 if curses has bsd-style touchline])
+ ;;
+(sysv)
+ AC_DEFINE(HAVE_SYSV_TOUCHLINE,1,[Define to 1 if curses has sysv-style touchline])
+ ;;
+esac
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_DEFINE_PROG version: 5 updated: 2021/01/02 09:31:20
+dnl --------------
+dnl Check for a program in the given list $3, defining the corresponding
+dnl program variable $2.
+dnl
+AC_DEFUN([CF_DEFINE_PROG],[
+AC_MSG_CHECKING(for $1)
+AC_CACHE_VAL(cf_cv_$2,[
+ cf_cv_$2=unknown
+ for cv_path in $3
+ do
+ if test -f "$cv_path" ; then
+ cf_cv_$2="$cv_path"
+ break
+ fi
+ done
+ ])
+AC_MSG_RESULT($cf_cv_$2)
+AC_DEFINE_UNQUOTED($2,"$cf_cv_$2",[Define to program from list])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_DIRNAME version: 5 updated: 2020/12/31 20:19:42
+dnl ----------
+dnl "dirname" is not portable, so we fake it with a shell script.
+AC_DEFUN([CF_DIRNAME],[$1=`echo "$2" | sed -e 's%/[[^/]]*$%%'`])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_DISABLE_ECHO version: 14 updated: 2021/09/04 06:35:04
+dnl ---------------
+dnl You can always use "make -n" to see the actual options, but it is hard to
+dnl pick out/analyze warning messages when the compile-line is long.
+dnl
+dnl Sets:
+dnl ECHO_LT - symbol to control if libtool is verbose
+dnl ECHO_LD - symbol to prefix "cc -o" lines
+dnl RULE_CC - symbol to put before implicit "cc -c" lines (e.g., .c.o)
+dnl SHOW_CC - symbol to put before explicit "cc -c" lines
+dnl ECHO_CC - symbol to put before any "cc" line
+dnl
+AC_DEFUN([CF_DISABLE_ECHO],[
+AC_MSG_CHECKING(if you want to see long compiling messages)
+CF_ARG_DISABLE(echo,
+ [ --disable-echo do not display "compiling" commands],
+ [
+ ECHO_LT='--silent'
+ ECHO_LD='@echo linking [$]@;'
+ RULE_CC='@echo compiling [$]<'
+ SHOW_CC='@echo compiling [$]@'
+ ECHO_CC='@'
+],[
+ ECHO_LT=''
+ ECHO_LD=''
+ RULE_CC=''
+ SHOW_CC=''
+ ECHO_CC=''
+])
+AC_MSG_RESULT($enableval)
+AC_SUBST(ECHO_LT)
+AC_SUBST(ECHO_LD)
+AC_SUBST(RULE_CC)
+AC_SUBST(SHOW_CC)
+AC_SUBST(ECHO_CC)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_DISABLE_RPATH_HACK version: 3 updated: 2021/01/05 20:14:44
+dnl ---------------------
+dnl The rpath-hack makes it simpler to build programs, particularly with the
+dnl *BSD ports which may have essential libraries in unusual places. But it
+dnl can interfere with building an executable for the base system. Use this
+dnl option in that case.
+AC_DEFUN([CF_DISABLE_RPATH_HACK],
+[
+AC_MSG_CHECKING(if rpath-hack should be disabled)
+CF_ARG_DISABLE(rpath-hack,
+ [ --disable-rpath-hack don't add rpath options for additional libraries],
+ [enable_rpath_hack=no],
+ [enable_rpath_hack=yes])
+dnl TODO - drop cf_disable_rpath_hack
+if test "x$enable_rpath_hack" = xno; then cf_disable_rpath_hack=yes; else cf_disable_rpath_hack=no; fi
+AC_MSG_RESULT($cf_disable_rpath_hack)
+
+if test "$enable_rpath_hack" = yes ; then
+ CF_RPATH_HACK
+fi
+])
+dnl ---------------------------------------------------------------------------
+dnl CF_ENABLE_WARNINGS version: 9 updated: 2021/01/05 19:40:50
+dnl ------------------
+dnl Configure-option to enable gcc warnings
+dnl
+dnl $1 = extra options to add, if supported
+dnl $2 = option for checking attributes. By default, this is done when
+dnl warnings are enabled. For other values:
+dnl yes: always do this, e.g., to use in generated library-headers
+dnl no: never do this
+AC_DEFUN([CF_ENABLE_WARNINGS],[
+if test "$GCC" = yes || test "$GXX" = yes
+then
+CF_FIX_WARNINGS(CFLAGS)
+CF_FIX_WARNINGS(CPPFLAGS)
+CF_FIX_WARNINGS(LDFLAGS)
+AC_MSG_CHECKING(if you want to turn on gcc warnings)
+CF_ARG_ENABLE(warnings,
+ [ --enable-warnings test: turn on gcc compiler warnings],
+ [enable_warnings=yes],
+ [enable_warnings=no])
+AC_MSG_RESULT($enable_warnings)
+if test "$enable_warnings" = "yes"
+then
+ ifelse($2,,[CF_GCC_ATTRIBUTES])
+ CF_GCC_WARNINGS($1)
+fi
+ifelse($2,yes,[CF_GCC_ATTRIBUTES])
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ERRNO version: 5 updated: 1997/11/30 12:44:39
+dnl --------
+dnl Check if 'errno' is declared in <errno.h>
+AC_DEFUN([CF_ERRNO],
+[
+CF_CHECK_ERRNO(errno)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_FANCY_CURSES version: 7 updated: 2021/01/02 09:31:20
+dnl ---------------
+AC_DEFUN([CF_FANCY_CURSES],
+[
+AC_MSG_CHECKING(if curses supports fancy attributes)
+AC_CACHE_VAL(cf_cv_fancy_curses,[
+ AC_TRY_LINK([
+#include <${cf_cv_ncurses_header:-curses.h}>
+],
+ [attrset(A_UNDERLINE|A_BOLD|A_REVERSE);
+ wattrset(stdscr, A_BLINK|A_DIM);
+ attroff(A_BOLD);
+ keypad(stdscr,TRUE);
+ ],
+ [cf_cv_fancy_curses=yes],
+ [cf_cv_fancy_curses=no])
+ ])
+AC_MSG_RESULT($cf_cv_fancy_curses)
+test "$cf_cv_fancy_curses" = yes && AC_DEFINE(FANCY_CURSES,1,[Define to 1 if curses supports fancy attributes])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_FIND_IPV6_LIBS version: 9 updated: 2021/01/02 09:31:20
+dnl -----------------
+dnl Based on the IPV6 stack type, look for the corresponding library.
+AC_DEFUN([CF_FIND_IPV6_LIBS],[
+AC_REQUIRE([CF_FIND_IPV6_TYPE])
+
+cf_ipv6lib=none
+cf_ipv6dir=none
+
+AC_MSG_CHECKING(for IPv6 library if required)
+case "$cf_cv_ipv6type" in
+(solaris)
+ ;;
+(inria)
+ ;;
+(kame)
+ dnl http://www.kame.net/
+ cf_ipv6lib=inet6
+ cf_ipv6dir=v6
+ ;;
+(linux-glibc)
+ ;;
+(linux-libinet6)
+ dnl http://www.v6.linux.or.jp/
+ cf_ipv6lib=inet6
+ cf_ipv6dir=inet6
+ ;;
+(toshiba)
+ cf_ipv6lib=inet6
+ cf_ipv6dir=v6
+ ;;
+(v6d)
+ cf_ipv6lib=v6
+ cf_ipv6dir=v6
+ ;;
+(zeta)
+ cf_ipv6lib=inet6
+ cf_ipv6dir=v6
+ ;;
+esac
+AC_MSG_RESULT($cf_ipv6lib)
+
+if test "$cf_ipv6lib" != "none"; then
+
+ AC_TRY_LINK([
+#include <sys/types.h>
+#include <netdb.h>
+#include <netinet/in.h>
+#include <netinet/ip6.h>],
+ [getaddrinfo(0, 0, 0, 0)],,[
+ CF_HEADER_PATH(cf_search,$cf_ipv6dir)
+ for cf_incdir in $cf_search
+ do
+ cf_header=$cf_incdir/netinet/ip6.h
+ if test -f "$cf_header"
+ then
+ CF_ADD_INCDIR($cf_incdir)
+ test -n "$verbose" && echo " ... found $cf_header" 1>&AC_FD_MSG
+ break
+ fi
+ test -n "$verbose" && echo " ... tested $cf_header" 1>&AC_FD_MSG
+ done
+ ])
+
+ CF_FIND_LIBRARY([$cf_ipv6lib],[$cf_ipv6dir],[
+#include <sys/types.h>
+#include <netdb.h>
+#include <netinet/in.h>
+#include <netinet/ip6.h>],
+ [getaddrinfo(0, 0, 0, 0)],
+ [getaddrinfo],
+ noexit)
+ if test "$cf_found_library" = no ; then
+ AC_MSG_ERROR(
+[No $cf_ipv6lib library found, cannot continue. You must fetch lib$cf_ipv6lib.a
+from an appropriate IPv6 kit and compile beforehand.])
+ fi
+fi
+
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_FIND_IPV6_TYPE version: 7 updated: 2021/01/02 09:31:20
+dnl -----------------
+AC_DEFUN([CF_FIND_IPV6_TYPE],[
+AC_CACHE_CHECK(ipv6 stack type, cf_cv_ipv6type, [
+cf_cv_ipv6type=unknown
+for i in solaris inria kame linux-glibc linux-libinet6 toshiba v6d zeta
+do
+ case "$i" in
+ (solaris)
+ if test "SunOS" = "`uname -s`"
+ then
+ if test -f /usr/include/netinet/ip6.h
+ then
+ cf_cv_ipv6type=$i
+ fi
+ fi
+ ;;
+ (inria)
+ dnl http://www.kame.net/
+ AC_EGREP_CPP(yes, [
+#include <netinet/in.h>
+#ifdef IPV6_INRIA_VERSION
+yes
+#endif], [cf_cv_ipv6type=$i])
+ ;;
+ (kame)
+ dnl http://www.kame.net/
+ AC_EGREP_CPP(yes, [
+#include <netinet/in.h>
+#ifdef __KAME__
+yes
+#endif], [cf_cv_ipv6type=$i])
+ ;;
+ (linux-glibc)
+ dnl http://www.v6.linux.or.jp/
+ AC_EGREP_CPP(yes, [
+#include <features.h>
+#if defined(__GLIBC__) && __GLIBC__ >= 2 && __GLIBC_MINOR__ >= 1
+yes
+#endif], [cf_cv_ipv6type=$i])
+ ;;
+ (linux-libinet6)
+ dnl http://www.v6.linux.or.jp/
+ if test -d /usr/inet6
+ then
+ cf_cv_ipv6type=$i
+ elif test -f /usr/include/netinet/ip6.h
+ then
+ cf_cv_ipv6type=$i
+ fi
+ ;;
+ (toshiba)
+ AC_EGREP_CPP(yes, [
+#include <sys/param.h>
+#ifdef _TOSHIBA_INET6
+yes
+#endif], [cf_cv_ipv6type=$i])
+ ;;
+ (v6d)
+ AC_EGREP_CPP(yes, [
+#include </usr/local/v6/include/sys/v6config.h>
+#ifdef __V6D__
+yes
+#endif], [cf_cv_ipv6type=$i])
+ ;;
+ (zeta)
+ AC_EGREP_CPP(yes, [
+#include <sys/param.h>
+#ifdef _ZETA_MINAMI_INET6
+yes
+#endif], [cf_cv_ipv6type=$i])
+ ;;
+ esac
+ if test "$cf_cv_ipv6type" != "unknown"; then
+ break
+ fi
+done
+])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_FIND_LIBRARY version: 11 updated: 2021/01/02 09:31:20
+dnl ---------------
+dnl Look for a non-standard library, given parameters for AC_TRY_LINK. We
+dnl prefer a standard location, and use -L options only if we do not find the
+dnl library in the standard library location(s).
+dnl $1 = library name
+dnl $2 = library class, usually the same as library name
+dnl $3 = includes
+dnl $4 = code fragment to compile/link
+dnl $5 = corresponding function-name
+dnl $6 = flag, nonnull if failure should not cause an error-exit
+dnl
+dnl Sets the variable "$cf_libdir" as a side-effect, so we can see if we had
+dnl to use a -L option.
+AC_DEFUN([CF_FIND_LIBRARY],
+[
+ eval 'cf_cv_have_lib_'"$1"'=no'
+ cf_libdir=""
+ AC_CHECK_FUNC($5,
+ eval 'cf_cv_have_lib_'"$1"'=yes',[
+ cf_save_LIBS="$LIBS"
+ AC_MSG_CHECKING(for $5 in -l$1)
+ LIBS="-l$1 $LIBS"
+ AC_TRY_LINK([$3],[$4],
+ [AC_MSG_RESULT(yes)
+ eval 'cf_cv_have_lib_'"$1"'=yes'
+ ],
+ [AC_MSG_RESULT(no)
+ CF_LIBRARY_PATH(cf_search,$2)
+ for cf_libdir in $cf_search
+ do
+ AC_MSG_CHECKING(for -l$1 in $cf_libdir)
+ LIBS="-L$cf_libdir -l$1 $cf_save_LIBS"
+ AC_TRY_LINK([$3],[$4],
+ [AC_MSG_RESULT(yes)
+ eval 'cf_cv_have_lib_'"$1"'=yes'
+ break],
+ [AC_MSG_RESULT(no)
+ LIBS="$cf_save_LIBS"])
+ done
+ ])
+ ])
+eval 'cf_found_library="[$]cf_cv_have_lib_'"$1"\"
+ifelse($6,,[
+if test "$cf_found_library" = no ; then
+ AC_MSG_ERROR(Cannot link $1 library)
+fi
+])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_FIND_LINKAGE version: 22 updated: 2020/12/31 20:19:42
+dnl ---------------
+dnl Find a library (specifically the linkage used in the code fragment),
+dnl searching for it if it is not already in the library path.
+dnl See also CF_ADD_SEARCHPATH.
+dnl
+dnl Parameters (4-on are optional):
+dnl $1 = headers for library entrypoint
+dnl $2 = code fragment for library entrypoint
+dnl $3 = the library name without the "-l" option or ".so" suffix.
+dnl $4 = action to perform if successful (default: update CPPFLAGS, etc)
+dnl $5 = action to perform if not successful
+dnl $6 = module name, if not the same as the library name
+dnl $7 = extra libraries
+dnl
+dnl Sets these variables:
+dnl $cf_cv_find_linkage_$3 - yes/no according to whether linkage is found
+dnl $cf_cv_header_path_$3 - include-directory if needed
+dnl $cf_cv_library_path_$3 - library-directory if needed
+dnl $cf_cv_library_file_$3 - library-file if needed, e.g., -l$3
+AC_DEFUN([CF_FIND_LINKAGE],[
+
+# If the linkage is not already in the $CPPFLAGS/$LDFLAGS configuration, these
+# will be set on completion of the AC_TRY_LINK below.
+cf_cv_header_path_$3=
+cf_cv_library_path_$3=
+
+CF_MSG_LOG([Starting [FIND_LINKAGE]($3,$6)])
+
+cf_save_LIBS="$LIBS"
+
+AC_TRY_LINK([$1],[$2],[
+ cf_cv_find_linkage_$3=yes
+ cf_cv_header_path_$3=/usr/include
+ cf_cv_library_path_$3=/usr/lib
+],[
+
+LIBS="-l$3 $7 $cf_save_LIBS"
+
+AC_TRY_LINK([$1],[$2],[
+ cf_cv_find_linkage_$3=yes
+ cf_cv_header_path_$3=/usr/include
+ cf_cv_library_path_$3=/usr/lib
+ cf_cv_library_file_$3="-l$3"
+],[
+ cf_cv_find_linkage_$3=no
+ LIBS="$cf_save_LIBS"
+
+ CF_VERBOSE(find linkage for $3 library)
+ CF_MSG_LOG([Searching for headers in [FIND_LINKAGE]($3,$6)])
+
+ cf_save_CPPFLAGS="$CPPFLAGS"
+ cf_test_CPPFLAGS="$CPPFLAGS"
+
+ CF_HEADER_PATH(cf_search,ifelse([$6],,[$3],[$6]))
+ for cf_cv_header_path_$3 in $cf_search
+ do
+ if test -d "$cf_cv_header_path_$3" ; then
+ CF_VERBOSE(... testing $cf_cv_header_path_$3)
+ CPPFLAGS="$cf_save_CPPFLAGS"
+ CF_APPEND_TEXT(CPPFLAGS,-I$cf_cv_header_path_$3)
+ AC_TRY_COMPILE([$1],[$2],[
+ CF_VERBOSE(... found $3 headers in $cf_cv_header_path_$3)
+ cf_cv_find_linkage_$3=maybe
+ cf_test_CPPFLAGS="$CPPFLAGS"
+ break],[
+ CPPFLAGS="$cf_save_CPPFLAGS"
+ ])
+ fi
+ done
+
+ if test "$cf_cv_find_linkage_$3" = maybe ; then
+
+ CF_MSG_LOG([Searching for $3 library in [FIND_LINKAGE]($3,$6)])
+
+ cf_save_LIBS="$LIBS"
+ cf_save_LDFLAGS="$LDFLAGS"
+
+ ifelse([$6],,,[
+ CPPFLAGS="$cf_test_CPPFLAGS"
+ LIBS="-l$3 $7 $cf_save_LIBS"
+ AC_TRY_LINK([$1],[$2],[
+ CF_VERBOSE(... found $3 library in system)
+ cf_cv_find_linkage_$3=yes])
+ CPPFLAGS="$cf_save_CPPFLAGS"
+ LIBS="$cf_save_LIBS"
+ ])
+
+ if test "$cf_cv_find_linkage_$3" != yes ; then
+ CF_LIBRARY_PATH(cf_search,$3)
+ for cf_cv_library_path_$3 in $cf_search
+ do
+ if test -d "$cf_cv_library_path_$3" ; then
+ CF_VERBOSE(... testing $cf_cv_library_path_$3)
+ CPPFLAGS="$cf_test_CPPFLAGS"
+ LIBS="-l$3 $7 $cf_save_LIBS"
+ LDFLAGS="$cf_save_LDFLAGS -L$cf_cv_library_path_$3"
+ AC_TRY_LINK([$1],[$2],[
+ CF_VERBOSE(... found $3 library in $cf_cv_library_path_$3)
+ cf_cv_find_linkage_$3=yes
+ cf_cv_library_file_$3="-l$3"
+ break],[
+ CPPFLAGS="$cf_save_CPPFLAGS"
+ LIBS="$cf_save_LIBS"
+ LDFLAGS="$cf_save_LDFLAGS"
+ ])
+ fi
+ done
+ CPPFLAGS="$cf_save_CPPFLAGS"
+ LDFLAGS="$cf_save_LDFLAGS"
+ fi
+
+ else
+ cf_cv_find_linkage_$3=no
+ fi
+ ],$7)
+])
+
+LIBS="$cf_save_LIBS"
+
+if test "$cf_cv_find_linkage_$3" = yes ; then
+ifelse([$4],,[
+ CF_ADD_INCDIR($cf_cv_header_path_$3)
+ CF_ADD_LIBDIR($cf_cv_library_path_$3)
+ CF_ADD_LIB($3)
+],[$4])
+else
+ifelse([$5],,AC_MSG_WARN(Cannot find $3 library),[$5])
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_FIONBIO version: 4 updated: 2021/06/08 18:08:14
+dnl ----------
+dnl Check for availability of fcntl versus ioctl(,FIONBIO,). Lynx uses this
+dnl for Sequent (ptx), and it is needed for OS/2 EMX.
+AC_DEFUN([CF_FIONBIO],
+[
+AC_CACHE_CHECK(if we should use fcntl or ioctl,cf_cv_fionbio,[
+AC_TRY_LINK([
+#include <sys/types.h>
+#include <sys/ioctl.h>
+],[
+ int ret = ioctl(0, FIONBIO, (char *)0); (void) ret
+ ],[cf_cv_fionbio=ioctl],[
+AC_TRY_LINK([
+#include <sys/types.h>
+#if HAVE_FCNTL_H
+#include <fcntl.h>
+#else
+#if HAVE_SYS_FCNTL_H
+#include <sys/fcntl.h>
+#endif
+#endif],[
+ int ret = fcntl(0, F_SETFL, O_NONBLOCK);
+ ],
+ [cf_cv_fionbio=fcntl],
+ [cf_cv_fionbio=unknown])])
+])
+test "$cf_cv_fionbio" = "fcntl" && AC_DEFINE(USE_FCNTL,1,[Define to 1 if we should use fcntl])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_FIX_WARNINGS version: 4 updated: 2021/12/16 18:22:31
+dnl ---------------
+dnl Warning flags do not belong in CFLAGS, CPPFLAGS, etc. Any of gcc's
+dnl "-Werror" flags can interfere with configure-checks. Those go into
+dnl EXTRA_CFLAGS.
+dnl
+dnl $1 = variable name to repair
+define([CF_FIX_WARNINGS],[
+if test "$GCC" = yes || test "$GXX" = yes
+then
+ case [$]$1 in
+ (*-Werror=*)
+ cf_temp_flags=
+ for cf_temp_scan in [$]$1
+ do
+ case "x$cf_temp_scan" in
+ (x-Werror=format*)
+ CF_APPEND_TEXT(cf_temp_flags,$cf_temp_scan)
+ ;;
+ (x-Werror=*)
+ CF_APPEND_TEXT(EXTRA_CFLAGS,$cf_temp_scan)
+ ;;
+ (*)
+ CF_APPEND_TEXT(cf_temp_flags,$cf_temp_scan)
+ ;;
+ esac
+ done
+ if test "x[$]$1" != "x$cf_temp_flags"
+ then
+ CF_VERBOSE(repairing $1: [$]$1)
+ $1="$cf_temp_flags"
+ CF_VERBOSE(... fixed [$]$1)
+ CF_VERBOSE(... extra $EXTRA_CFLAGS)
+ fi
+ ;;
+ esac
+fi
+AC_SUBST(EXTRA_CFLAGS)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_FUNC_CURSES_VERSION version: 9 updated: 2023/01/05 18:06:10
+dnl ----------------------
+dnl Solaris has a data item 'curses_version', which confuses AC_CHECK_FUNCS.
+dnl It's a character string "SVR4", not documented.
+AC_DEFUN([CF_FUNC_CURSES_VERSION],
+[
+AC_CACHE_CHECK(for function curses_version, cf_cv_func_curses_version,[
+AC_TRY_RUN([
+$ac_includes_default
+
+#include <${cf_cv_ncurses_header:-curses.h}>
+
+int main(void)
+{
+ char temp[1024];
+ sprintf(temp, "%.999s\\n", curses_version());
+ ${cf_cv_main_return:-return}(0);
+}]
+,[cf_cv_func_curses_version=yes]
+,[cf_cv_func_curses_version=no]
+,[cf_cv_func_curses_version=unknown])
+rm -f core])
+test "$cf_cv_func_curses_version" = yes && AC_DEFINE(HAVE_CURSES_VERSION,1,[Define to 1 if we have curses_version function])
+])
+dnl ---------------------------------------------------------------------------
+dnl CF_FUNC_GETADDRINFO version: 10 updated: 2023/01/05 18:06:22
+dnl -------------------
+dnl Look for a working version of getaddrinfo(), for IPV6 support.
+AC_DEFUN([CF_FUNC_GETADDRINFO],[
+AC_CACHE_CHECK(working getaddrinfo, cf_cv_getaddrinfo,[
+AC_TRY_RUN([
+$ac_includes_default
+
+#include <netdb.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+
+#define expect(a,b) if (strcmp(a,b) != 0) goto bad
+
+int main(void)
+{
+ int passive, gaierr, inet4 = 0, inet6 = 0;
+ struct addrinfo hints, *ai, *aitop;
+ char straddr[INET6_ADDRSTRLEN], strport[16];
+
+ for (passive = 0; passive <= 1; passive++) {
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = AF_UNSPEC;
+ hints.ai_flags = passive ? AI_PASSIVE : 0;
+ hints.ai_socktype = SOCK_STREAM;
+ if ((gaierr = getaddrinfo(NULL, "54321", &hints, &aitop)) != 0) {
+ (void)gai_strerror(gaierr);
+ goto bad;
+ }
+ for (ai = aitop; ai; ai = ai->ai_next) {
+ if (ai->ai_addr == NULL ||
+ ai->ai_addrlen == 0 ||
+ getnameinfo(ai->ai_addr, ai->ai_addrlen,
+ straddr, sizeof(straddr), strport, sizeof(strport),
+ NI_NUMERICHOST|NI_NUMERICSERV) != 0) {
+ goto bad;
+ }
+ switch (ai->ai_family) {
+ case AF_INET:
+ expect(strport, "54321");
+ if (passive) {
+ expect(straddr, "0.0.0.0");
+ } else {
+ expect(straddr, "127.0.0.1");
+ }
+ inet4++;
+ break;
+ case AF_INET6:
+ expect(strport, "54321");
+ if (passive) {
+ expect(straddr, "::");
+ } else {
+ expect(straddr, "::1");
+ }
+ inet6++;
+ break;
+ case AF_UNSPEC:
+ goto bad;
+ break;
+ default:
+ /* another family support? */
+ break;
+ }
+ }
+ }
+
+ if (!(inet4 == 0 || inet4 == 2))
+ goto bad;
+ if (!(inet6 == 0 || inet6 == 2))
+ goto bad;
+
+ if (aitop)
+ freeaddrinfo(aitop);
+ ${cf_cv_main_return:-return}(0);
+
+ bad:
+ if (aitop)
+ freeaddrinfo(aitop);
+ ${cf_cv_main_return:-return}(1);
+}
+],
+[cf_cv_getaddrinfo=yes],
+[cf_cv_getaddrinfo=no],
+[cf_cv_getaddrinfo=unknown])
+])
+if test "$cf_cv_getaddrinfo" = yes ; then
+ AC_DEFINE(HAVE_GAI_STRERROR,1,[Define to 1 if we have gai_strerror function])
+ AC_DEFINE(HAVE_GETADDRINFO,1,[Define to 1 if we have getaddrinfo function])
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_FUNC_LSTAT version: 5 updated: 2021/06/08 18:08:14
+dnl -------------
+dnl A conventional existence-check for 'lstat' won't work with the Linux
+dnl version of gcc 2.7.0, since the symbol is defined only within <sys/stat.h>
+dnl as an inline function.
+dnl
+dnl So much for portability.
+AC_DEFUN([CF_FUNC_LSTAT],
+[
+AC_MSG_CHECKING(for lstat)
+AC_CACHE_VAL(ac_cv_func_lstat,[
+AC_TRY_LINK([
+#include <sys/types.h>
+#include <sys/stat.h>],
+ [struct stat sb; lstat(".", &sb); (void) sb],
+ [ac_cv_func_lstat=yes],
+ [ac_cv_func_lstat=no])
+ ])
+AC_MSG_RESULT($ac_cv_func_lstat )
+if test "$ac_cv_func_lstat" = yes; then
+ AC_DEFINE(HAVE_LSTAT,1,[Define to 1 if we have lstat])
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_FUNC_SIGACTION version: 4 updated: 2022/12/02 19:55:38
+dnl -----------------
+dnl Check if we have the sigaction function and related structures.
+AC_DEFUN([CF_FUNC_SIGACTION],[
+AC_CACHE_CHECK(for sigaction and structs,cf_cv_func_sigaction,[
+AC_TRY_LINK([
+#include <sys/types.h>
+#include <signal.h>],
+ [struct sigaction act;
+ act.sa_handler = SIG_DFL;
+#ifdef SA_RESTART
+ act.sa_flags = SA_RESTART;
+#endif /* SA_RESTART */
+ sigaction(1, &act, 0);
+ ],
+ [cf_cv_func_sigaction=yes],
+ [cf_cv_func_sigaction=no])
+])
+test "$cf_cv_func_sigaction" = yes && AC_DEFINE(HAVE_SIGACTION,1,[Define to 1 if we have sigaction])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_FUNC_VASPRINTF version: 2 updated: 2019/12/31 10:27:03
+dnl -----------------
+dnl Check if vasprintf is available, and if it is (or can be) declared.
+AC_DEFUN([CF_FUNC_VASPRINTF],[
+AC_REQUIRE([CF_GNU_SOURCE])
+AC_CHECK_FUNC(vasprintf,[
+ AC_DEFINE(HAVE_VASPRINTF,1,[Define to 1 if we have vasprintf])
+ AC_MSG_CHECKING(if vasprintf requires workaround)
+ AC_TRY_COMPILE([
+ #include <stdio.h>
+ ],[
+ void *p = (void *)vasprintf; return (p != 0)
+ ],[
+ AC_MSG_RESULT(no)
+ ],[
+ AC_TRY_COMPILE([
+ #ifndef _GNU_SOURCE
+ #define _GNU_SOURCE 1
+ #include <stdio.h>
+ #endif
+ ],[
+ void *p = (void *)vasprintf; return (p != 0)
+ ],[
+ AC_MSG_RESULT(yes)
+ CF_APPEND_TEXT(CPPFLAGS,-D_GNU_SOURCE)
+ ],[
+ AC_MSG_RESULT(unknown)
+ ])
+ ])
+])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_FUNC_WAIT version: 4 updated: 2021/01/02 09:31:20
+dnl ------------
+dnl Test for the presence of <sys/wait.h>, 'union wait', arg-type of 'wait()'
+dnl and/or 'waitpid()'.
+dnl
+dnl Note that we cannot simply grep for 'union wait' in the wait.h file,
+dnl because some Posix systems turn this on only when a BSD variable is
+dnl defined.
+dnl
+dnl I don't use AC_HEADER_SYS_WAIT, because it defines HAVE_SYS_WAIT_H, which
+dnl would conflict with an attempt to test that header directly.
+dnl
+AC_DEFUN([CF_FUNC_WAIT],
+[
+AC_REQUIRE([CF_UNION_WAIT])
+if test "$cf_cv_type_unionwait" = yes; then
+
+ AC_MSG_CHECKING(if union wait can be used as wait-arg)
+ AC_CACHE_VAL(cf_cv_arg_union_wait,[
+ AC_TRY_COMPILE($cf_wait_headers,
+ [union wait x; wait(&x)],
+ [cf_cv_arg_union_wait=yes],
+ [cf_cv_arg_union_wait=no])
+ ])
+ AC_MSG_RESULT($cf_cv_arg_union_wait)
+ test "$cf_cv_arg_union_wait" = yes && AC_DEFINE(WAIT_USES_UNION,1,[Define to 1 if wait() uses a union parameter])
+
+ AC_MSG_CHECKING(if union wait can be used as waitpid-arg)
+ AC_CACHE_VAL(cf_cv_arg_union_waitpid,[
+ AC_TRY_COMPILE($cf_wait_headers,
+ [union wait x; waitpid(0, &x, 0)],
+ [cf_cv_arg_union_waitpid=yes],
+ [cf_cv_arg_union_waitpid=no])
+ ])
+ AC_MSG_RESULT($cf_cv_arg_union_waitpid)
+ test "$cf_cv_arg_union_waitpid" = yes && AC_DEFINE(WAITPID_USES_UNION,1,[Define to 1 if waitpid() uses a union parameter])
+
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_GCC_ATTRIBUTES version: 24 updated: 2021/03/20 12:00:25
+dnl -----------------
+dnl Test for availability of useful gcc __attribute__ directives to quiet
+dnl compiler warnings. Though useful, not all are supported -- and contrary
+dnl to documentation, unrecognized directives cause older compilers to barf.
+AC_DEFUN([CF_GCC_ATTRIBUTES],
+[AC_REQUIRE([AC_PROG_FGREP])dnl
+AC_REQUIRE([CF_C11_NORETURN])dnl
+
+if test "$GCC" = yes || test "$GXX" = yes
+then
+cat > conftest.i <<EOF
+#ifndef GCC_PRINTF
+#define GCC_PRINTF 0
+#endif
+#ifndef GCC_SCANF
+#define GCC_SCANF 0
+#endif
+#ifndef GCC_NORETURN
+#define GCC_NORETURN /* nothing */
+#endif
+#ifndef GCC_UNUSED
+#define GCC_UNUSED /* nothing */
+#endif
+EOF
+if test "$GCC" = yes
+then
+ AC_CHECKING([for $CC __attribute__ directives])
+cat > "conftest.$ac_ext" <<EOF
+#line __oline__ "${as_me:-configure}"
+#include <stdio.h>
+#include "confdefs.h"
+#include "conftest.h"
+#include "conftest.i"
+#if GCC_PRINTF
+#define GCC_PRINTFLIKE(fmt,var) __attribute__((format(printf,fmt,var)))
+#else
+#define GCC_PRINTFLIKE(fmt,var) /*nothing*/
+#endif
+#if GCC_SCANF
+#define GCC_SCANFLIKE(fmt,var) __attribute__((format(scanf,fmt,var)))
+#else
+#define GCC_SCANFLIKE(fmt,var) /*nothing*/
+#endif
+extern void wow(char *,...) GCC_SCANFLIKE(1,2);
+extern GCC_NORETURN void oops(char *,...) GCC_PRINTFLIKE(1,2);
+extern GCC_NORETURN void foo(void);
+int main(int argc GCC_UNUSED, char *argv[[]] GCC_UNUSED) { (void)argc; (void)argv; return 0; }
+EOF
+ cf_printf_attribute=no
+ cf_scanf_attribute=no
+ for cf_attribute in scanf printf unused noreturn
+ do
+ CF_UPPER(cf_ATTRIBUTE,$cf_attribute)
+ cf_directive="__attribute__(($cf_attribute))"
+ echo "checking for $CC $cf_directive" 1>&AC_FD_CC
+
+ case "$cf_attribute" in
+ (printf)
+ cf_printf_attribute=yes
+ cat >conftest.h <<EOF
+#define GCC_$cf_ATTRIBUTE 1
+EOF
+ ;;
+ (scanf)
+ cf_scanf_attribute=yes
+ cat >conftest.h <<EOF
+#define GCC_$cf_ATTRIBUTE 1
+EOF
+ ;;
+ (*)
+ cat >conftest.h <<EOF
+#define GCC_$cf_ATTRIBUTE $cf_directive
+EOF
+ ;;
+ esac
+
+ if AC_TRY_EVAL(ac_compile); then
+ test -n "$verbose" && AC_MSG_RESULT(... $cf_attribute)
+ cat conftest.h >>confdefs.h
+ case "$cf_attribute" in
+ (noreturn)
+ AC_DEFINE_UNQUOTED(GCC_NORETURN,$cf_directive,[Define to noreturn-attribute for gcc])
+ ;;
+ (printf)
+ cf_value='/* nothing */'
+ if test "$cf_printf_attribute" != no ; then
+ cf_value='__attribute__((format(printf,fmt,var)))'
+ AC_DEFINE(GCC_PRINTF,1,[Define to 1 if the compiler supports gcc-like printf attribute.])
+ fi
+ AC_DEFINE_UNQUOTED(GCC_PRINTFLIKE(fmt,var),$cf_value,[Define to printf-attribute for gcc])
+ ;;
+ (scanf)
+ cf_value='/* nothing */'
+ if test "$cf_scanf_attribute" != no ; then
+ cf_value='__attribute__((format(scanf,fmt,var)))'
+ AC_DEFINE(GCC_SCANF,1,[Define to 1 if the compiler supports gcc-like scanf attribute.])
+ fi
+ AC_DEFINE_UNQUOTED(GCC_SCANFLIKE(fmt,var),$cf_value,[Define to sscanf-attribute for gcc])
+ ;;
+ (unused)
+ AC_DEFINE_UNQUOTED(GCC_UNUSED,$cf_directive,[Define to unused-attribute for gcc])
+ ;;
+ esac
+ fi
+ done
+else
+ ${FGREP-fgrep} define conftest.i >>confdefs.h
+fi
+rm -rf ./conftest*
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_GCC_VERSION version: 8 updated: 2019/09/07 13:38:36
+dnl --------------
+dnl Find version of gcc, and (because icc/clang pretend to be gcc without being
+dnl compatible), attempt to determine if icc/clang is actually used.
+AC_DEFUN([CF_GCC_VERSION],[
+AC_REQUIRE([AC_PROG_CC])
+GCC_VERSION=none
+if test "$GCC" = yes ; then
+ AC_MSG_CHECKING(version of $CC)
+ GCC_VERSION="`${CC} --version 2>/dev/null | sed -e '2,$d' -e 's/^.*(GCC[[^)]]*) //' -e 's/^.*(Debian[[^)]]*) //' -e 's/^[[^0-9.]]*//' -e 's/[[^0-9.]].*//'`"
+ test -z "$GCC_VERSION" && GCC_VERSION=unknown
+ AC_MSG_RESULT($GCC_VERSION)
+fi
+CF_INTEL_COMPILER(GCC,INTEL_COMPILER,CFLAGS)
+CF_CLANG_COMPILER(GCC,CLANG_COMPILER,CFLAGS)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_GCC_WARNINGS version: 41 updated: 2021/01/01 16:53:59
+dnl ---------------
+dnl Check if the compiler supports useful warning options. There's a few that
+dnl we don't use, simply because they're too noisy:
+dnl
+dnl -Wconversion (useful in older versions of gcc, but not in gcc 2.7.x)
+dnl -Winline (usually not worthwhile)
+dnl -Wredundant-decls (system headers make this too noisy)
+dnl -Wtraditional (combines too many unrelated messages, only a few useful)
+dnl -Wwrite-strings (too noisy, but should review occasionally). This
+dnl is enabled for ncurses using "--enable-const".
+dnl -pedantic
+dnl
+dnl Parameter:
+dnl $1 is an optional list of gcc warning flags that a particular
+dnl application might want to use, e.g., "no-unused" for
+dnl -Wno-unused
+dnl Special:
+dnl If $with_ext_const is "yes", add a check for -Wwrite-strings
+dnl
+AC_DEFUN([CF_GCC_WARNINGS],
+[
+AC_REQUIRE([CF_GCC_VERSION])
+if test "x$have_x" = xyes; then CF_CONST_X_STRING fi
+cat > "conftest.$ac_ext" <<EOF
+#line __oline__ "${as_me:-configure}"
+int main(int argc, char *argv[[]]) { return (argv[[argc-1]] == 0) ; }
+EOF
+if test "$INTEL_COMPILER" = yes
+then
+# The "-wdXXX" options suppress warnings:
+# remark #1419: external declaration in primary source file
+# remark #1683: explicit conversion of a 64-bit integral type to a smaller integral type (potential portability problem)
+# remark #1684: conversion from pointer to same-sized integral type (potential portability problem)
+# remark #193: zero used for undefined preprocessing identifier
+# remark #593: variable "curs_sb_left_arrow" was set but never used
+# remark #810: conversion from "int" to "Dimension={unsigned short}" may lose significant bits
+# remark #869: parameter "tw" was never referenced
+# remark #981: operands are evaluated in unspecified order
+# warning #279: controlling expression is constant
+
+ AC_CHECKING([for $CC warning options])
+ cf_save_CFLAGS="$CFLAGS"
+ EXTRA_CFLAGS="$EXTRA_CFLAGS -Wall"
+ for cf_opt in \
+ wd1419 \
+ wd1683 \
+ wd1684 \
+ wd193 \
+ wd593 \
+ wd279 \
+ wd810 \
+ wd869 \
+ wd981
+ do
+ CFLAGS="$cf_save_CFLAGS $EXTRA_CFLAGS -$cf_opt"
+ if AC_TRY_EVAL(ac_compile); then
+ test -n "$verbose" && AC_MSG_RESULT(... -$cf_opt)
+ EXTRA_CFLAGS="$EXTRA_CFLAGS -$cf_opt"
+ fi
+ done
+ CFLAGS="$cf_save_CFLAGS"
+elif test "$GCC" = yes && test "$GCC_VERSION" != "unknown"
+then
+ AC_CHECKING([for $CC warning options])
+ cf_save_CFLAGS="$CFLAGS"
+ cf_warn_CONST=""
+ test "$with_ext_const" = yes && cf_warn_CONST="Wwrite-strings"
+ cf_gcc_warnings="Wignored-qualifiers Wlogical-op Wvarargs"
+ test "x$CLANG_COMPILER" = xyes && cf_gcc_warnings=
+ for cf_opt in W Wall \
+ Wbad-function-cast \
+ Wcast-align \
+ Wcast-qual \
+ Wdeclaration-after-statement \
+ Wextra \
+ Winline \
+ Wmissing-declarations \
+ Wmissing-prototypes \
+ Wnested-externs \
+ Wpointer-arith \
+ Wshadow \
+ Wstrict-prototypes \
+ Wundef Wno-inline $cf_gcc_warnings $cf_warn_CONST $1
+ do
+ CFLAGS="$cf_save_CFLAGS $EXTRA_CFLAGS -$cf_opt"
+ if AC_TRY_EVAL(ac_compile); then
+ test -n "$verbose" && AC_MSG_RESULT(... -$cf_opt)
+ case "$cf_opt" in
+ (Winline)
+ case "$GCC_VERSION" in
+ ([[34]].*)
+ CF_VERBOSE(feature is broken in gcc $GCC_VERSION)
+ continue;;
+ esac
+ ;;
+ (Wpointer-arith)
+ case "$GCC_VERSION" in
+ ([[12]].*)
+ CF_VERBOSE(feature is broken in gcc $GCC_VERSION)
+ continue;;
+ esac
+ ;;
+ esac
+ EXTRA_CFLAGS="$EXTRA_CFLAGS -$cf_opt"
+ fi
+ done
+ CFLAGS="$cf_save_CFLAGS"
+fi
+rm -rf ./conftest*
+
+AC_SUBST(EXTRA_CFLAGS)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_GNUTLS version: 27 updated: 2021/01/02 09:31:20
+dnl ---------
+dnl Check for gnutls library (TLS "is" SSL)
+dnl $1 = the [optional] directory in which the library may be found
+dnl $2 = the [optional] stub file to provide OpenSSL compatibility
+AC_DEFUN([CF_GNUTLS],[
+ AC_REQUIRE([CF_PKG_CONFIG])
+ cf_cv_have_gnutls=no
+ cf_cv_pkg_config_ssl=no
+
+ CF_ADD_OPTIONAL_PATH($1, [ssl library])
+
+ cf_pkg_gnutls=none
+ if test "x$PKG_CONFIG" != xnone; then
+ cf_pkg_gnutls=ifelse([$2],,gnutls-openssl,gnutls)
+ case "$1" in
+ (no)
+ ;;
+ (yes) # if no explicit directory given, try pkg-config
+ CF_VERBOSE(checking pkg-config for $cf_pkg_gnutls)
+ if "$PKG_CONFIG" --exists $cf_pkg_gnutls ; then
+ CF_VERBOSE(... found $cf_pkg_gnutls in pkg-config)
+ cf_cv_have_gnutls=yes
+ cf_cv_pkg_config_ssl=yes
+
+ cf_cflags_ssl=`$PKG_CONFIG --cflags $cf_pkg_gnutls`
+ cf_libs_ssl=`$PKG_CONFIG --libs $cf_pkg_gnutls`
+
+ if test -n "$cf_cflags_ssl" ; then
+ case "$cf_cflags_ssl" in
+ (*-I*)
+ cf_cv_header_path_gnutls=`echo "$cf_cflags_ssl" | sed -e 's/^.*-I//' -e 's/ .*//'`
+ ;;
+ (*)
+ cf_cv_header_path_gnutls=/usr/include
+ ;;
+ esac
+ if test -d "$cf_cv_header_path_gnutls/gnutls" ; then
+ cf_cv_header_path_gnutls=$cf_cv_header_path_gnutls/gnutls
+ fi
+ CF_ADD_CFLAGS($cf_cflags_ssl)
+ fi
+
+ if test -n "$cf_libs_ssl" ; then
+ case "x$cf_libs_ssl" in
+ (*-L*)
+ cf_cv_library_path_gnutls=`echo "$cf_libs_ssl" | sed -e 's/^.*-L//' -e 's/ .*//'`
+ ;;
+ (*)
+ cf_cv_library_path_gnutls=/usr/lib
+ ;;
+ esac
+ CF_VERBOSE(adding $cf_libs_ssl to LIBS)
+ CF_ADD_LIBS($cf_libs_ssl)
+ fi
+ else
+ CF_VERBOSE(... did not find $cf_pkg_gnutls in pkg-config)
+ cf_pkg_gnutls=none
+ fi
+ ;;
+ esac
+ fi
+
+ ifelse([$2],,
+ [AC_DEFINE(USE_GNUTLS_INCL,1,[Define to 1 if we should include gnutls headers])],
+ [AC_DEFINE(USE_GNUTLS_FUNCS,1,[Define to 1 if we should use gnutls functions])])
+
+ if test "$cf_cv_have_gnutls" = no ; then
+ cf_gnutls_CPPFLAGS=$CPPFLAGS
+
+ CF_FIND_LINKAGE(CF__SSL_HEAD,
+ CF__SSL_BODY,
+ gnutls,
+ cf_cv_have_gnutls=yes,
+ cf_cv_have_gnutls=no,
+ ,
+ ifelse([$2],,[-lgnutls-openssl]))
+
+ CPPFLAGS=$cf_gnutls_CPPFLAGS
+ fi
+
+ if test "$cf_cv_have_gnutls" = yes ; then
+ if test -n "$cf_cv_header_path_gnutls" ; then
+ AC_DEFINE(USE_SSL)
+ case "$cf_cv_header_path_gnutls" in
+ (/usr/include/gnutls)
+ ;;
+ (*)
+ CF_ADD_INCDIR($cf_cv_header_path_gnutls)
+ ;;
+ esac
+ fi
+ if test -n "$cf_cv_library_path_gnutls" ; then
+ CF_ADD_LIBDIR($cf_cv_library_path_gnutls)
+ fi
+ CF_ADD_LIBS(-lgnutls)
+ AC_CHECK_FUNCS(gnutls_protocol_set_priority)
+ AC_CHECK_FUNC(gnutls_rnd,
+ [AC_DEFINE(HAVE_GNUTLS_RND,1,[Define to 1 if we have gnutls_rnd])],
+ [CF_ADD_LIBS(-lgcrypt)])
+
+ ifelse([$2],,
+ [if test "$cf_pkg_gnutls" = none ; then
+ AC_CHECK_LIB(gnutls-openssl,SSL_connect,
+ [CF_ADD_LIBS(-lgnutls-openssl)],
+ [AC_CHECK_LIB(gnutls-extra,SSL_connect,
+ [CF_ADD_LIBS(-lgnutls-extra)],
+ [AC_MSG_ERROR(cannot find gnutls openssl functions)])])
+ fi],[EXTRA_OBJS="$EXTRA_OBJS $2"])
+
+ CF_CHECK_SSL_X509
+ fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_GNU_SOURCE version: 10 updated: 2018/12/10 20:09:41
+dnl -------------
+dnl Check if we must define _GNU_SOURCE to get a reasonable value for
+dnl _XOPEN_SOURCE, upon which many POSIX definitions depend. This is a defect
+dnl (or misfeature) of glibc2, which breaks portability of many applications,
+dnl since it is interwoven with GNU extensions.
+dnl
+dnl Well, yes we could work around it...
+dnl
+dnl Parameters:
+dnl $1 is the nominal value for _XOPEN_SOURCE
+AC_DEFUN([CF_GNU_SOURCE],
+[
+cf_gnu_xopen_source=ifelse($1,,500,$1)
+
+AC_CACHE_CHECK(if this is the GNU C library,cf_cv_gnu_library,[
+AC_TRY_COMPILE([#include <sys/types.h>],[
+ #if __GLIBC__ > 0 && __GLIBC_MINOR__ >= 0
+ return 0;
+ #elif __NEWLIB__ > 0 && __NEWLIB_MINOR__ >= 0
+ return 0;
+ #else
+ # error not GNU C library
+ #endif],
+ [cf_cv_gnu_library=yes],
+ [cf_cv_gnu_library=no])
+])
+
+if test x$cf_cv_gnu_library = xyes; then
+
+ # With glibc 2.19 (13 years after this check was begun), _DEFAULT_SOURCE
+ # was changed to help a little. newlib incorporated the change about 4
+ # years later.
+ AC_CACHE_CHECK(if _DEFAULT_SOURCE can be used as a basis,cf_cv_gnu_library_219,[
+ cf_save="$CPPFLAGS"
+ CF_APPEND_TEXT(CPPFLAGS,-D_DEFAULT_SOURCE)
+ AC_TRY_COMPILE([#include <sys/types.h>],[
+ #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 19) || (__GLIBC__ > 2)
+ return 0;
+ #elif (__NEWLIB__ == 2 && __NEWLIB_MINOR__ >= 4) || (__GLIBC__ > 3)
+ return 0;
+ #else
+ # error GNU C library __GLIBC__.__GLIBC_MINOR__ is too old
+ #endif],
+ [cf_cv_gnu_library_219=yes],
+ [cf_cv_gnu_library_219=no])
+ CPPFLAGS="$cf_save"
+ ])
+
+ if test "x$cf_cv_gnu_library_219" = xyes; then
+ cf_save="$CPPFLAGS"
+ AC_CACHE_CHECK(if _XOPEN_SOURCE=$cf_gnu_xopen_source works with _DEFAULT_SOURCE,cf_cv_gnu_dftsrc_219,[
+ CF_ADD_CFLAGS(-D_DEFAULT_SOURCE -D_XOPEN_SOURCE=$cf_gnu_xopen_source)
+ AC_TRY_COMPILE([
+ #include <limits.h>
+ #include <sys/types.h>
+ ],[
+ #if (_XOPEN_SOURCE >= $cf_gnu_xopen_source) && (MB_LEN_MAX > 1)
+ return 0;
+ #else
+ # error GNU C library is too old
+ #endif],
+ [cf_cv_gnu_dftsrc_219=yes],
+ [cf_cv_gnu_dftsrc_219=no])
+ ])
+ test "x$cf_cv_gnu_dftsrc_219" = "xyes" || CPPFLAGS="$cf_save"
+ else
+ cf_cv_gnu_dftsrc_219=maybe
+ fi
+
+ if test "x$cf_cv_gnu_dftsrc_219" != xyes; then
+
+ AC_CACHE_CHECK(if we must define _GNU_SOURCE,cf_cv_gnu_source,[
+ AC_TRY_COMPILE([#include <sys/types.h>],[
+ #ifndef _XOPEN_SOURCE
+ #error expected _XOPEN_SOURCE to be defined
+ #endif],
+ [cf_cv_gnu_source=no],
+ [cf_save="$CPPFLAGS"
+ CF_ADD_CFLAGS(-D_GNU_SOURCE)
+ AC_TRY_COMPILE([#include <sys/types.h>],[
+ #ifdef _XOPEN_SOURCE
+ #error expected _XOPEN_SOURCE to be undefined
+ #endif],
+ [cf_cv_gnu_source=no],
+ [cf_cv_gnu_source=yes])
+ CPPFLAGS="$cf_save"
+ ])
+ ])
+
+ if test "$cf_cv_gnu_source" = yes
+ then
+ AC_CACHE_CHECK(if we should also define _DEFAULT_SOURCE,cf_cv_default_source,[
+ CF_APPEND_TEXT(CPPFLAGS,-D_GNU_SOURCE)
+ AC_TRY_COMPILE([#include <sys/types.h>],[
+ #ifdef _DEFAULT_SOURCE
+ #error expected _DEFAULT_SOURCE to be undefined
+ #endif],
+ [cf_cv_default_source=no],
+ [cf_cv_default_source=yes])
+ ])
+ if test "$cf_cv_default_source" = yes
+ then
+ CF_APPEND_TEXT(CPPFLAGS,-D_DEFAULT_SOURCE)
+ fi
+ fi
+ fi
+
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_HEADER_PATH version: 15 updated: 2021/01/01 13:31:04
+dnl --------------
+dnl Construct a search-list of directories for a nonstandard header-file
+dnl
+dnl Parameters
+dnl $1 = the variable to return as result
+dnl $2 = the package name
+AC_DEFUN([CF_HEADER_PATH],
+[
+$1=
+
+# collect the current set of include-directories from compiler flags
+cf_header_path_list=""
+if test -n "${CFLAGS}${CPPFLAGS}" ; then
+ for cf_header_path in $CPPFLAGS $CFLAGS
+ do
+ case "$cf_header_path" in
+ (-I*)
+ cf_header_path=`echo ".$cf_header_path" |sed -e 's/^...//' -e 's,/include$,,'`
+ CF_ADD_SUBDIR_PATH($1,$2,include,$cf_header_path,NONE)
+ cf_header_path_list="$cf_header_path_list [$]$1"
+ ;;
+ esac
+ done
+fi
+
+# add the variations for the package we are looking for
+CF_SUBDIR_PATH($1,$2,include)
+
+test "$includedir" != NONE && \
+test "$includedir" != "/usr/include" && \
+test -d "$includedir" && {
+ test -d "$includedir" && $1="[$]$1 $includedir"
+ test -d "$includedir/$2" && $1="[$]$1 $includedir/$2"
+}
+
+test "$oldincludedir" != NONE && \
+test "$oldincludedir" != "/usr/include" && \
+test -d "$oldincludedir" && {
+ test -d "$oldincludedir" && $1="[$]$1 $oldincludedir"
+ test -d "$oldincludedir/$2" && $1="[$]$1 $oldincludedir/$2"
+}
+
+$1="[$]$1 $cf_header_path_list"
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_HELP_MESSAGE version: 4 updated: 2019/12/31 08:53:54
+dnl ---------------
+dnl Insert text into the help-message, for readability, from AC_ARG_WITH.
+AC_DEFUN([CF_HELP_MESSAGE],
+[CF_ACVERSION_CHECK(2.53,[],[
+AC_DIVERT_HELP($1)])dnl
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_INET_ADDR version: 7 updated: 2013/10/08 17:47:05
+dnl ------------
+dnl For Lynx, check if the libraries we have found give us inet_aton, or
+dnl inet_addr. If not, try to find the latter function with -lbind or
+dnl -lresolv, and put that on the end of the libraries, i.e., after the network
+dnl libraries.
+dnl
+dnl FIXME: the inner cases will probably need work on the header files.
+AC_DEFUN([CF_INET_ADDR],[
+AC_CACHE_CHECK(for inet_aton function,cf_cv_have_inet_aton,[
+AC_TRY_LINK(CF__INET_HEAD,[inet_aton(0, (struct in_addr *)0)],
+ [cf_cv_have_inet_aton=yes],
+ [cf_cv_have_inet_aton=no])])
+if test "$cf_cv_have_inet_aton" = yes ; then
+ AC_DEFINE(HAVE_INET_ATON,1,[Define to 1 if we have inet_aton])
+else
+ AC_CACHE_CHECK(for inet_addr function,cf_cv_have_inet_addr,[
+ AC_TRY_LINK(CF__INET_HEAD,[inet_addr(0)],
+ [cf_cv_have_inet_addr=yes],
+ [cf_cv_have_inet_addr=no])])
+ if test "$cf_cv_have_inet_addr" = no ; then
+ AC_CACHE_CHECK(for library with inet_addr,cf_cv_lib_inet_addr,[
+ cf_save_LIBS="$LIBS"
+ for cf_inetlib in -lbind -lresolv
+ do
+ LIBS="$cf_save_LIBS $cf_inetlib"
+ AC_TRY_LINK([#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+ ],[inet_addr(0)],
+ [cf_cv_lib_inet_addr=$cf_inetlib],
+ [cf_cv_lib_inet_addr=no])
+ LIBS="$cf_save_LIBS"
+ test "$cf_cv_lib_inet_addr" != no && break
+ done
+ ])
+ if test "$cf_cv_lib_inet_addr" != no ; then
+ CF_ADD_LIBS($cf_cv_lib_inet_addr)
+ else
+ AC_MSG_WARN(Unable to find library for inet_addr function)
+ fi
+ fi
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_INTEL_COMPILER version: 8 updated: 2021/01/01 16:53:59
+dnl -----------------
+dnl Check if the given compiler is really the Intel compiler for Linux. It
+dnl tries to imitate gcc, but does not return an error when it finds a mismatch
+dnl between prototypes, e.g., as exercised by CF_MISSING_CHECK.
+dnl
+dnl This macro should be run "soon" after AC_PROG_CC or AC_PROG_CPLUSPLUS, to
+dnl ensure that it is not mistaken for gcc/g++. It is normally invoked from
+dnl the wrappers for gcc and g++ warnings.
+dnl
+dnl $1 = GCC (default) or GXX
+dnl $2 = INTEL_COMPILER (default) or INTEL_CPLUSPLUS
+dnl $3 = CFLAGS (default) or CXXFLAGS
+AC_DEFUN([CF_INTEL_COMPILER],[
+AC_REQUIRE([AC_CANONICAL_HOST])
+ifelse([$2],,INTEL_COMPILER,[$2])=no
+
+if test "$ifelse([$1],,[$1],GCC)" = yes ; then
+ case "$host_os" in
+ (linux*|gnu*)
+ AC_MSG_CHECKING(if this is really Intel ifelse([$1],GXX,C++,C) compiler)
+ cf_save_CFLAGS="$ifelse([$3],,CFLAGS,[$3])"
+ ifelse([$3],,CFLAGS,[$3])="$ifelse([$3],,CFLAGS,[$3]) -no-gcc"
+ AC_TRY_COMPILE([],[
+#ifdef __INTEL_COMPILER
+#else
+make an error
+#endif
+],[ifelse([$2],,INTEL_COMPILER,[$2])=yes
+cf_save_CFLAGS="$cf_save_CFLAGS -we147"
+],[])
+ ifelse([$3],,CFLAGS,[$3])="$cf_save_CFLAGS"
+ AC_MSG_RESULT($ifelse([$2],,INTEL_COMPILER,[$2]))
+ ;;
+ esac
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_LARGEFILE version: 12 updated: 2020/03/19 20:23:48
+dnl ------------
+dnl Add checks for large file support.
+AC_DEFUN([CF_LARGEFILE],[
+ifdef([AC_FUNC_FSEEKO],[
+ AC_SYS_LARGEFILE
+ if test "$enable_largefile" != no ; then
+ AC_FUNC_FSEEKO
+
+ # Normally we would collect these definitions in the config.h,
+ # but (like _XOPEN_SOURCE), some environments rely on having these
+ # defined before any of the system headers are included. Another
+ # case comes up with C++, e.g., on AIX the compiler compiles the
+ # header files by themselves before looking at the body files it is
+ # told to compile. For ncurses, those header files do not include
+ # the config.h
+ if test "$ac_cv_sys_large_files" != no
+ then
+ CF_APPEND_TEXT(CPPFLAGS,-D_LARGE_FILES)
+ fi
+ if test "$ac_cv_sys_largefile_source" != no
+ then
+ CF_APPEND_TEXT(CPPFLAGS,-D_LARGEFILE_SOURCE)
+ fi
+ if test "$ac_cv_sys_file_offset_bits" != no
+ then
+ CF_APPEND_TEXT(CPPFLAGS,-D_FILE_OFFSET_BITS=$ac_cv_sys_file_offset_bits)
+ fi
+
+ AC_CACHE_CHECK(whether to use struct dirent64, cf_cv_struct_dirent64,[
+ AC_TRY_COMPILE([
+#pragma GCC diagnostic error "-Wincompatible-pointer-types"
+#include <sys/types.h>
+#include <dirent.h>
+ ],[
+ /* if transitional largefile support is setup, this is true */
+ extern struct dirent64 * readdir(DIR *);
+ struct dirent64 *x = readdir((DIR *)0);
+ struct dirent *y = readdir((DIR *)0);
+ int z = x - y;
+ (void)z;
+ ],
+ [cf_cv_struct_dirent64=yes],
+ [cf_cv_struct_dirent64=no])
+ ])
+ test "$cf_cv_struct_dirent64" = yes && AC_DEFINE(HAVE_STRUCT_DIRENT64,1,[Define to 1 if we have struct dirent64])
+ fi
+])
+])
+dnl ---------------------------------------------------------------------------
+dnl CF_LASTLOG version: 7 updated: 2021/01/02 09:31:20
+dnl ----------
+dnl Check for header defining _PATH_LASTLOG, or failing that, see if the lastlog
+dnl file exists.
+AC_DEFUN([CF_LASTLOG],
+[
+AC_CHECK_HEADERS(lastlog.h paths.h)
+AC_CACHE_CHECK(for lastlog path,cf_cv_path_lastlog,[
+AC_TRY_COMPILE([
+#include <sys/types.h>
+#ifdef HAVE_LASTLOG_H
+#include <lastlog.h>
+#else
+#ifdef HAVE_PATHS_H
+#include <paths.h>
+#endif
+#endif],[char *path = _PATH_LASTLOG; (void)path],
+ [cf_cv_path_lastlog="_PATH_LASTLOG"],
+ [if test -f /usr/adm/lastlog ; then
+ cf_cv_path_lastlog=/usr/adm/lastlog
+ else
+ cf_cv_path_lastlog=no
+ fi])
+])
+test "$cf_cv_path_lastlog" != no && AC_DEFINE(USE_LASTLOG,1,[Define to 1 if we can define lastlog pathname])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_LD_RPATH_OPT version: 9 updated: 2021/01/01 13:31:04
+dnl ---------------
+dnl For the given system and compiler, find the compiler flags to pass to the
+dnl loader to use the "rpath" feature.
+AC_DEFUN([CF_LD_RPATH_OPT],
+[
+AC_REQUIRE([CF_CHECK_CACHE])
+
+LD_RPATH_OPT=
+if test "x$cf_cv_enable_rpath" != xno
+then
+ AC_MSG_CHECKING(for an rpath option)
+ case "$cf_cv_system_name" in
+ (irix*)
+ if test "$GCC" = yes; then
+ LD_RPATH_OPT="-Wl,-rpath,"
+ else
+ LD_RPATH_OPT="-rpath "
+ fi
+ ;;
+ (linux*|gnu*|k*bsd*-gnu|freebsd*)
+ LD_RPATH_OPT="-Wl,-rpath,"
+ ;;
+ (openbsd[[2-9]].*|mirbsd*)
+ LD_RPATH_OPT="-Wl,-rpath,"
+ ;;
+ (dragonfly*)
+ LD_RPATH_OPT="-rpath "
+ ;;
+ (netbsd*)
+ LD_RPATH_OPT="-Wl,-rpath,"
+ ;;
+ (osf*|mls+*)
+ LD_RPATH_OPT="-rpath "
+ ;;
+ (solaris2*)
+ LD_RPATH_OPT="-R"
+ ;;
+ (*)
+ ;;
+ esac
+ AC_MSG_RESULT($LD_RPATH_OPT)
+
+ case "x$LD_RPATH_OPT" in
+ (x-R*)
+ AC_MSG_CHECKING(if we need a space after rpath option)
+ cf_save_LIBS="$LIBS"
+ CF_ADD_LIBS(${LD_RPATH_OPT}$libdir)
+ AC_TRY_LINK(, , cf_rpath_space=no, cf_rpath_space=yes)
+ LIBS="$cf_save_LIBS"
+ AC_MSG_RESULT($cf_rpath_space)
+ test "$cf_rpath_space" = yes && LD_RPATH_OPT="$LD_RPATH_OPT "
+ ;;
+ esac
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_LIBRARY_PATH version: 11 updated: 2021/01/01 13:31:04
+dnl ---------------
+dnl Construct a search-list of directories for a nonstandard library-file
+dnl
+dnl Parameters
+dnl $1 = the variable to return as result
+dnl $2 = the package name
+AC_DEFUN([CF_LIBRARY_PATH],
+[
+$1=
+cf_library_path_list=""
+if test -n "${LDFLAGS}${LIBS}" ; then
+ for cf_library_path in $LDFLAGS $LIBS
+ do
+ case "$cf_library_path" in
+ (-L*)
+ cf_library_path=`echo ".$cf_library_path" |sed -e 's/^...//' -e 's,/lib$,,'`
+ CF_ADD_SUBDIR_PATH($1,$2,lib,$cf_library_path,NONE)
+ cf_library_path_list="$cf_library_path_list [$]$1"
+ ;;
+ esac
+ done
+fi
+
+CF_SUBDIR_PATH($1,$2,lib)
+
+$1="$cf_library_path_list [$]$1"
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_LOCALE version: 6 updated: 2021/01/02 09:31:20
+dnl ---------
+dnl Check if we have setlocale() and its header, <locale.h>
+dnl The optional parameter $1 tells what to do if we do have locale support.
+AC_DEFUN([CF_LOCALE],
+[
+AC_MSG_CHECKING(for setlocale())
+AC_CACHE_VAL(cf_cv_locale,[
+AC_TRY_LINK([#include <locale.h>],
+ [setlocale(LC_ALL, "")],
+ [cf_cv_locale=yes],
+ [cf_cv_locale=no])
+ ])
+AC_MSG_RESULT($cf_cv_locale)
+test "$cf_cv_locale" = yes && { ifelse($1,,AC_DEFINE(LOCALE,1,[Define to 1 if we have locale support]),[$1]) }
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_MAKEFLAGS version: 21 updated: 2021/09/04 06:47:34
+dnl ------------
+dnl Some 'make' programs support ${MAKEFLAGS}, some ${MFLAGS}, to pass 'make'
+dnl options to lower-levels. It is very useful for "make -n" -- if we have it.
+dnl (GNU 'make' does both, something POSIX 'make', which happens to make the
+dnl ${MAKEFLAGS} variable incompatible because it adds the assignments :-)
+AC_DEFUN([CF_MAKEFLAGS],
+[AC_REQUIRE([AC_PROG_FGREP])dnl
+
+AC_CACHE_CHECK(for makeflags variable, cf_cv_makeflags,[
+ cf_cv_makeflags=''
+ for cf_option in '-${MAKEFLAGS}' '${MFLAGS}'
+ do
+ cat >cf_makeflags.tmp <<CF_EOF
+SHELL = $SHELL
+all :
+ @ echo '.$cf_option'
+CF_EOF
+ cf_result=`${MAKE:-make} -k -f cf_makeflags.tmp 2>/dev/null | ${FGREP-fgrep} -v "ing directory" | sed -e 's,[[ ]]*$,,'`
+ case "$cf_result" in
+ (.*k|.*kw)
+ cf_result="`${MAKE:-make} -k -f cf_makeflags.tmp CC=cc 2>/dev/null`"
+ case "$cf_result" in
+ (.*CC=*) cf_cv_makeflags=
+ ;;
+ (*) cf_cv_makeflags=$cf_option
+ ;;
+ esac
+ break
+ ;;
+ (.-)
+ ;;
+ (*)
+ CF_MSG_LOG(given option \"$cf_option\", no match \"$cf_result\")
+ ;;
+ esac
+ done
+ rm -f cf_makeflags.tmp
+])
+
+AC_SUBST(cf_cv_makeflags)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_MAKE_PHONY version: 3 updated: 2021/01/08 16:08:21
+dnl -------------
+dnl Check if the make-program handles a ".PHONY" target, e.g,. a target which
+dnl acts as a placeholder.
+dnl
+dnl The ".PHONY" feature was proposed in 2011 here
+dnl https://www.austingroupbugs.net/view.php?id=523
+dnl and is scheduled for release in P1003.1 Issue 8 (late 2022).
+dnl
+dnl This is not supported by SVr4 make (or SunOS 4, 4.3SD, etc), but works with
+dnl a few others (i.e., GNU make and the non-POSIX "BSD" make):
+dnl
+dnl + This is a GNU make feature (since April 1988, but in turn from binutils,
+dnl date unspecified).
+dnl
+dnl + It was adopted in NetBSD make in June 1995.
+dnl
+dnl + The other BSD make programs are derived from the NetBSD make (and for
+dnl that reason are not actually different "implementations").
+dnl
+dnl + Some features of NetBSD make were actually adapted from pmake, which
+dnl began as a modified GNU make starting in 1993.
+dnl
+dnl + Version 3.8 of the dmake program in January 1992 also implemented this
+dnl GNU make extension, but is less well known than the BSD make.
+AC_DEFUN([CF_MAKE_PHONY],[
+AC_CACHE_CHECK(for \".PHONY\" make-support, cf_cv_make_PHONY,[
+ rm -rf conftest*
+ (
+ mkdir conftest || exit 1
+ cd conftest
+ cat >makefile <<'CF_EOF'
+.PHONY: always
+DATA=0
+always: always.out
+ @echo "** making [$]@ [$](DATA)"
+once: once.out
+ @echo "** making [$]@ [$](DATA)"
+always.out:
+ @echo "** making [$]@ [$](DATA)"
+ echo [$](DATA) > [$]@
+once.out:
+ @echo "** making [$]@ [$](DATA)"
+ echo [$](DATA) > [$]@
+CF_EOF
+ for cf_data in 1 2 3
+ do
+ ${MAKE:-make} always DATA=$cf_data
+ ${MAKE:-make} once DATA=$cf_data
+ ${MAKE:-make} -t always once
+ if test -f always ; then
+ echo "no (case 1)" > ../conftest.tmp
+ elif test ! -f always.out ; then
+ echo "no (case 2)" > ../conftest.tmp
+ elif test ! -f once.out ; then
+ echo "no (case 3)" > ../conftest.tmp
+ elif ! cmp -s always.out once.out ; then
+ echo "no (case 4)" > ../conftest.tmp
+ diff always.out once.out
+ else
+ cf_check="`cat always.out`"
+ if test "x$cf_check" != "x$cf_data" ; then
+ echo "no (case 5)" > ../conftest.tmp
+ else
+ echo yes > ../conftest.tmp
+ rm -f ./*.out
+ continue
+ fi
+ fi
+ break
+ done
+ ) >&AC_FD_CC 2>&1
+ cf_cv_make_PHONY="`cat conftest.tmp`"
+ rm -rf conftest*
+])
+MAKE_NO_PHONY="#"
+MAKE_PHONY="#"
+test "x$cf_cv_make_PHONY" = xyes && MAKE_PHONY=
+test "x$cf_cv_make_PHONY" != xyes && MAKE_NO_PHONY=
+AC_SUBST(MAKE_NO_PHONY)
+AC_SUBST(MAKE_PHONY)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_MAKE_TAGS version: 6 updated: 2010/10/23 15:52:32
+dnl ------------
+dnl Generate tags/TAGS targets for makefiles. Do not generate TAGS if we have
+dnl a monocase filesystem.
+AC_DEFUN([CF_MAKE_TAGS],[
+AC_REQUIRE([CF_MIXEDCASE_FILENAMES])
+
+AC_CHECK_PROGS(CTAGS, exctags ctags)
+AC_CHECK_PROGS(ETAGS, exetags etags)
+
+AC_CHECK_PROG(MAKE_LOWER_TAGS, ${CTAGS:-ctags}, yes, no)
+
+if test "$cf_cv_mixedcase" = yes ; then
+ AC_CHECK_PROG(MAKE_UPPER_TAGS, ${ETAGS:-etags}, yes, no)
+else
+ MAKE_UPPER_TAGS=no
+fi
+
+if test "$MAKE_UPPER_TAGS" = yes ; then
+ MAKE_UPPER_TAGS=
+else
+ MAKE_UPPER_TAGS="#"
+fi
+
+if test "$MAKE_LOWER_TAGS" = yes ; then
+ MAKE_LOWER_TAGS=
+else
+ MAKE_LOWER_TAGS="#"
+fi
+
+AC_SUBST(CTAGS)
+AC_SUBST(ETAGS)
+
+AC_SUBST(MAKE_UPPER_TAGS)
+AC_SUBST(MAKE_LOWER_TAGS)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_MATH_LIB version: 11 updated: 2022/07/27 19:01:48
+dnl -----------
+dnl Checks for libraries. At least one UNIX system, Apple Macintosh
+dnl Rhapsody 5.5, does not have -lm. We cannot use the simpler
+dnl AC_CHECK_LIB(m,sin), because that fails for C++.
+AC_DEFUN([CF_MATH_LIB],
+[
+AC_CACHE_CHECK(if -lm needed for math functions,
+ cf_cv_need_libm,[
+ AC_TRY_LINK([
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <math.h>
+ ],
+ [double x = rand(); printf("result = %g\\n", ]ifelse([$2],,sin(x),$2)[)],
+ [cf_cv_need_libm=no],
+ [cf_cv_need_libm=yes])])
+
+if test "$cf_cv_need_libm" = yes
+then
+
+ cf_save_LIBS="$LIBS"
+ LIBS="$LIBS -lm"
+ AC_CACHE_CHECK(if -lm is available for math functions,
+ cf_cv_have_libm,[
+ AC_TRY_LINK([
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <math.h>
+ ],
+ [double x = rand(); printf("result = %g\\n", ]ifelse([$2],,sin(x),$2)[)],
+ [cf_cv_have_libm=yes],
+ [cf_cv_have_libm=no])])
+ LIBS="$cf_save_LIBS"
+
+ if test "$cf_cv_have_libm" = yes
+ then
+ ifelse($1,,[CF_ADD_LIB(m)],[$1=-lm])
+ fi
+else
+ cf_cv_have_libm=yes
+fi
+
+if test "$cf_cv_have_libm" = yes
+then
+ AC_DEFINE(HAVE_MATH_FUNCS,1,[Define to 1 if math functions are available])
+fi
+])
+dnl ---------------------------------------------------------------------------
+dnl CF_MERGE_EXTRA_CFLAGS version: 2 updated: 2021/01/02 09:31:20
+dnl ---------------------
+dnl CF_FIX_WARNINGS moves problematic flags into EXTRA_CFLAGS, but some scripts
+dnl may depend on being able to override that variable at build-time. Move it
+dnl all back.
+define([CF_MERGE_EXTRA_CFLAGS],[
+if test "$GCC" = yes || test "$GXX" = yes
+then
+ CF_APPEND_TEXT(CFLAGS,$EXTRA_CFLAGS)
+ EXTRA_CFLAGS=
+fi
+])
+dnl ---------------------------------------------------------------------------
+dnl CF_MIXEDCASE_FILENAMES version: 9 updated: 2021/01/01 16:53:59
+dnl ----------------------
+dnl Check if the file-system supports mixed-case filenames. If we're able to
+dnl create a lowercase name and see it as uppercase, it doesn't support that.
+AC_DEFUN([CF_MIXEDCASE_FILENAMES],
+[
+AC_CACHE_CHECK(if filesystem supports mixed-case filenames,cf_cv_mixedcase,[
+if test "$cross_compiling" = yes ; then
+ case "$target_alias" in
+ (*-os2-emx*|*-msdosdjgpp*|*-cygwin*|*-msys*|*-mingw*|*-uwin*|darwin*)
+ cf_cv_mixedcase=no
+ ;;
+ (*)
+ cf_cv_mixedcase=yes
+ ;;
+ esac
+else
+ rm -f conftest CONFTEST
+ echo test >conftest
+ if test -f CONFTEST ; then
+ cf_cv_mixedcase=no
+ else
+ cf_cv_mixedcase=yes
+ fi
+ rm -f conftest CONFTEST
+fi
+])
+test "$cf_cv_mixedcase" = yes && AC_DEFINE(MIXEDCASE_FILENAMES,1,[Define to 1 if filesystem supports mixed-case filenames.])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_MSG_LOG version: 5 updated: 2010/10/23 15:52:32
+dnl ----------
+dnl Write a debug message to config.log, along with the line number in the
+dnl configure script.
+AC_DEFUN([CF_MSG_LOG],[
+echo "${as_me:-configure}:__oline__: testing $* ..." 1>&AC_FD_CC
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_NCURSES_BROKEN version: 8 updated: 2012/11/08 20:57:52
+dnl -----------------
+dnl Check for pre-1.9.9g ncurses (among other problems, the most obvious is
+dnl that color combinations don't work).
+AC_DEFUN([CF_NCURSES_BROKEN],
+[
+AC_REQUIRE([CF_NCURSES_VERSION])
+if test "$cf_cv_ncurses_version" != no ; then
+AC_MSG_CHECKING(for obsolete/broken version of ncurses)
+AC_CACHE_VAL(cf_cv_ncurses_broken,[
+AC_TRY_COMPILE([
+#include <${cf_cv_ncurses_header:-curses.h}>],[
+#if defined(NCURSES_VERSION) && defined(wgetbkgd)
+ make an error
+#else
+ int x = 1
+#endif
+],
+ [cf_cv_ncurses_broken=no],
+ [cf_cv_ncurses_broken=yes])
+])
+AC_MSG_RESULT($cf_cv_ncurses_broken)
+if test "$cf_cv_ncurses_broken" = yes ; then
+ AC_MSG_WARN(hmm... you should get an up-to-date version of ncurses)
+ AC_DEFINE(NCURSES_BROKEN,1,[Define to 1 if you have an obsolete version of ncurses])
+fi
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_NCURSES_CC_CHECK version: 5 updated: 2020/12/31 20:19:42
+dnl -------------------
+dnl Check if we can compile with ncurses' header file
+dnl $1 is the cache variable to set
+dnl $2 is the header-file to include
+dnl $3 is the root name (ncurses or ncursesw)
+AC_DEFUN([CF_NCURSES_CC_CHECK],[
+ AC_TRY_COMPILE([
+]ifelse($3,ncursesw,[
+#define _XOPEN_SOURCE_EXTENDED
+#undef HAVE_LIBUTF8_H /* in case we used CF_UTF8_LIB */
+#define HAVE_LIBUTF8_H /* to force ncurses' header file to use cchar_t */
+])[
+#include <$2>],[
+#ifdef NCURSES_VERSION
+]ifelse($3,ncursesw,[
+#ifndef WACS_BSSB
+ make an error
+#endif
+])[
+printf("%s\\n", NCURSES_VERSION);
+#else
+#ifdef __NCURSES_H
+printf("old\\n");
+#else
+ make an error
+#endif
+#endif
+ ]
+ ,[$1=$2]
+ ,[$1=no])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_NCURSES_CONFIG version: 28 updated: 2021/08/28 15:20:37
+dnl -----------------
+dnl Tie together the configure-script macros for ncurses, preferring these in
+dnl order:
+dnl a) ".pc" files for pkg-config, using $NCURSES_CONFIG_PKG
+dnl b) the "-config" script from ncurses, using $NCURSES_CONFIG
+dnl c) just plain libraries
+dnl
+dnl $1 is the root library name (default: "ncurses")
+AC_DEFUN([CF_NCURSES_CONFIG],[
+AC_REQUIRE([CF_PKG_CONFIG])
+cf_ncuconfig_root=ifelse($1,,ncurses,$1)
+cf_have_ncuconfig=no
+
+if test "x${PKG_CONFIG:=none}" != xnone; then
+ AC_MSG_CHECKING(pkg-config for $cf_ncuconfig_root)
+ if "$PKG_CONFIG" --exists $cf_ncuconfig_root ; then
+ AC_MSG_RESULT(yes)
+
+ AC_MSG_CHECKING(if the $cf_ncuconfig_root package files work)
+ cf_have_ncuconfig=unknown
+
+ cf_save_CFLAGS="$CFLAGS"
+ cf_save_CPPFLAGS="$CPPFLAGS"
+ cf_save_LIBS="$LIBS"
+
+ cf_pkg_cflags="`$PKG_CONFIG --cflags $cf_ncuconfig_root`"
+ cf_pkg_libs="`$PKG_CONFIG --libs $cf_ncuconfig_root`"
+
+ # while -W for passing linker flags is prevalent, it is not "standard".
+ # At least one wrapper for c89/c99 (in Apple's xcode) has its own
+ # incompatible _and_ non-standard -W option which gives an error. Work
+ # around that pitfall.
+ case "x${CC}@@${cf_pkg_libs}@${cf_pkg_cflags}" in
+ (x*c[[89]]9@@*-W*)
+ CF_ADD_CFLAGS($cf_pkg_cflags)
+ CF_ADD_LIBS($cf_pkg_libs)
+
+ AC_TRY_LINK([#include <${cf_cv_ncurses_header:-curses.h}>],
+ [initscr(); mousemask(0,0); tigetstr((char *)0);],
+ [AC_TRY_RUN([#include <${cf_cv_ncurses_header:-curses.h}>
+ int main(void)
+ { const char *xx = curses_version(); return (xx == 0); }],
+ [cf_test_ncuconfig=yes],
+ [cf_test_ncuconfig=no],
+ [cf_test_ncuconfig=maybe])],
+ [cf_test_ncuconfig=no])
+
+ CFLAGS="$cf_save_CFLAGS"
+ CPPFLAGS="$cf_save_CPPFLAGS"
+ LIBS="$cf_save_LIBS"
+
+ if test "x$cf_test_ncuconfig" != xyes; then
+ cf_temp=`echo "x$cf_pkg_cflags" | sed -e s/^x// -e 's/-W[[^ ]]*//g'`
+ cf_pkg_cflags="$cf_temp"
+ cf_temp=`echo "x$cf_pkg_libs" | sed -e s/^x// -e 's/-W[[^ ]]*//g'`
+ cf_pkg_libs="$cf_temp"
+ fi
+ ;;
+ esac
+
+ CF_APPEND_CFLAGS($cf_pkg_cflags)
+ CF_ADD_LIBS($cf_pkg_libs)
+
+ AC_TRY_LINK([#include <${cf_cv_ncurses_header:-curses.h}>],
+ [initscr(); mousemask(0,0); tigetstr((char *)0);],
+ [AC_TRY_RUN([#include <${cf_cv_ncurses_header:-curses.h}>
+ int main(void)
+ { const char *xx = curses_version(); return (xx == 0); }],
+ [cf_have_ncuconfig=yes],
+ [cf_have_ncuconfig=no],
+ [cf_have_ncuconfig=maybe])],
+ [cf_have_ncuconfig=no])
+ AC_MSG_RESULT($cf_have_ncuconfig)
+ test "$cf_have_ncuconfig" = maybe && cf_have_ncuconfig=yes
+ if test "$cf_have_ncuconfig" != "yes"
+ then
+ CPPFLAGS="$cf_save_CPPFLAGS"
+ LIBS="$cf_save_LIBS"
+ NCURSES_CONFIG_PKG=none
+ else
+ AC_DEFINE(NCURSES,1,[Define to 1 if we are using ncurses headers/libraries])
+ NCURSES_CONFIG_PKG=$cf_ncuconfig_root
+ CF_TERM_HEADER
+ fi
+
+ else
+ AC_MSG_RESULT(no)
+ NCURSES_CONFIG_PKG=none
+ fi
+else
+ NCURSES_CONFIG_PKG=none
+fi
+
+if test "x$cf_have_ncuconfig" = "xno"; then
+ cf_ncurses_config="${cf_ncuconfig_root}${NCURSES_CONFIG_SUFFIX}-config"; echo "Looking for ${cf_ncurses_config}"
+
+ CF_ACVERSION_CHECK(2.52,
+ [AC_CHECK_TOOLS(NCURSES_CONFIG, ${cf_ncurses_config} ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}5-config, none)],
+ [AC_PATH_PROGS(NCURSES_CONFIG, ${cf_ncurses_config} ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}5-config, none)])
+
+ if test "$NCURSES_CONFIG" != none ; then
+
+ CF_APPEND_CFLAGS(`$NCURSES_CONFIG --cflags`)
+ CF_ADD_LIBS(`$NCURSES_CONFIG --libs`)
+
+ # even with config script, some packages use no-override for curses.h
+ CF_CURSES_HEADER(ifelse($1,,ncurses,$1))
+
+ dnl like CF_NCURSES_CPPFLAGS
+ AC_DEFINE(NCURSES,1,[Define to 1 if we are using ncurses headers/libraries])
+
+ dnl like CF_NCURSES_LIBS
+ CF_UPPER(cf_nculib_ROOT,HAVE_LIB$cf_ncuconfig_root)
+ AC_DEFINE_UNQUOTED($cf_nculib_ROOT)
+
+ dnl like CF_NCURSES_VERSION
+ cf_cv_ncurses_version="`$NCURSES_CONFIG --version`"
+
+ else
+
+ CF_NCURSES_CPPFLAGS(ifelse($1,,ncurses,$1))
+ CF_NCURSES_LIBS(ifelse($1,,ncurses,$1))
+
+ fi
+else
+ NCURSES_CONFIG=none
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_NCURSES_CPPFLAGS version: 22 updated: 2021/01/02 09:31:20
+dnl -------------------
+dnl Look for the SVr4 curses clone 'ncurses' in the standard places, adjusting
+dnl the CPPFLAGS variable so we can include its header.
+dnl
+dnl The header files may be installed as either curses.h, or ncurses.h (would
+dnl be obsolete, except that some packagers prefer this name to distinguish it
+dnl from a "native" curses implementation). If not installed for overwrite,
+dnl the curses.h file would be in an ncurses subdirectory (e.g.,
+dnl /usr/include/ncurses), but someone may have installed overwriting the
+dnl vendor's curses. Only very old versions (pre-1.9.2d, the first autoconf'd
+dnl version) of ncurses don't define either __NCURSES_H or NCURSES_VERSION in
+dnl the header.
+dnl
+dnl If the installer has set $CFLAGS or $CPPFLAGS so that the ncurses header
+dnl is already in the include-path, don't even bother with this, since we cannot
+dnl easily determine which file it is. In this case, it has to be <curses.h>.
+dnl
+dnl The optional parameter gives the root name of the library, in case it is
+dnl not installed as the default curses library. That is how the
+dnl wide-character version of ncurses is installed.
+AC_DEFUN([CF_NCURSES_CPPFLAGS],
+[AC_REQUIRE([CF_WITH_CURSES_DIR])
+
+AC_PROVIDE([CF_CURSES_CPPFLAGS])dnl
+cf_ncuhdr_root=ifelse($1,,ncurses,$1)
+
+test -n "$cf_cv_curses_dir" && \
+test "$cf_cv_curses_dir" != "no" && { \
+ CF_ADD_INCDIR($cf_cv_curses_dir/include/$cf_ncuhdr_root)
+}
+
+AC_CACHE_CHECK(for $cf_ncuhdr_root header in include-path, cf_cv_ncurses_h,[
+ cf_header_list="$cf_ncuhdr_root/curses.h $cf_ncuhdr_root/ncurses.h"
+ { test "$cf_ncuhdr_root" = ncurses || test "$cf_ncuhdr_root" = ncursesw; } && cf_header_list="$cf_header_list curses.h ncurses.h"
+ for cf_header in $cf_header_list
+ do
+ CF_NCURSES_CC_CHECK(cf_cv_ncurses_h,$cf_header,$1)
+ test "$cf_cv_ncurses_h" != no && break
+ done
+])
+
+CF_NCURSES_HEADER
+CF_TERM_HEADER
+
+# some applications need this, but should check for NCURSES_VERSION
+AC_DEFINE(NCURSES,1,[Define to 1 if we are using ncurses headers/libraries])
+
+CF_NCURSES_VERSION
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_NCURSES_HEADER version: 7 updated: 2021/01/04 19:33:05
+dnl -----------------
+dnl Find a "curses" header file, e.g,. "curses.h", or one of the more common
+dnl variations of ncurses' installs.
+dnl
+dnl See also CF_CURSES_HEADER, which sets the same cache variable.
+AC_DEFUN([CF_NCURSES_HEADER],[
+
+if test "$cf_cv_ncurses_h" != no ; then
+ cf_cv_ncurses_header=$cf_cv_ncurses_h
+else
+
+AC_CACHE_CHECK(for $cf_ncuhdr_root include-path, cf_cv_ncurses_h2,[
+ test -n "$verbose" && echo
+ CF_HEADER_PATH(cf_search,$cf_ncuhdr_root)
+ test -n "$verbose" && echo "search path $cf_search"
+ cf_save2_CPPFLAGS="$CPPFLAGS"
+ for cf_incdir in $cf_search
+ do
+ CF_ADD_INCDIR($cf_incdir)
+ for cf_header in \
+ ncurses.h \
+ curses.h
+ do
+ CF_NCURSES_CC_CHECK(cf_cv_ncurses_h2,$cf_header,$1)
+ if test "$cf_cv_ncurses_h2" != no ; then
+ cf_cv_ncurses_h2=$cf_incdir/$cf_header
+ test -n "$verbose" && echo $ECHO_N " ... found $ECHO_C" 1>&AC_FD_MSG
+ break
+ fi
+ test -n "$verbose" && echo " ... tested $cf_incdir/$cf_header" 1>&AC_FD_MSG
+ done
+ CPPFLAGS="$cf_save2_CPPFLAGS"
+ test "$cf_cv_ncurses_h2" != no && break
+ done
+ test "$cf_cv_ncurses_h2" = no && AC_MSG_ERROR(not found)
+ ])
+
+ CF_DIRNAME(cf_1st_incdir,$cf_cv_ncurses_h2)
+ cf_cv_ncurses_header="`basename "$cf_cv_ncurses_h2"`"
+ if test "`basename "$cf_1st_incdir"`" = "$cf_ncuhdr_root" ; then
+ cf_cv_ncurses_header="$cf_ncuhdr_root/$cf_cv_ncurses_header"
+ fi
+ CF_ADD_INCDIR($cf_1st_incdir)
+
+fi
+
+# Set definitions to allow ifdef'ing for ncurses.h
+
+case "$cf_cv_ncurses_header" in
+(*ncurses.h)
+ AC_DEFINE(HAVE_NCURSES_H,1,[Define to 1 if we have ncurses.h])
+ ;;
+esac
+
+case "$cf_cv_ncurses_header" in
+(ncurses/curses.h|ncurses/ncurses.h)
+ AC_DEFINE(HAVE_NCURSES_NCURSES_H,1,[Define to 1 if we have ncurses/ncurses.h])
+ ;;
+(ncursesw/curses.h|ncursesw/ncurses.h)
+ AC_DEFINE(HAVE_NCURSESW_NCURSES_H,1,[Define to 1 if we have ncursesw/ncurses.h])
+ ;;
+esac
+
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_NCURSES_LIBS version: 21 updated: 2021/09/04 06:37:12
+dnl ---------------
+dnl Look for the ncurses library. This is a little complicated on Linux,
+dnl because it may be linked with the gpm (general purpose mouse) library.
+dnl Some distributions have gpm linked with (bsd) curses, which makes it
+dnl unusable with ncurses. However, we don't want to link with gpm unless
+dnl ncurses has a dependency, since gpm is normally set up as a shared library,
+dnl and the linker will record a dependency.
+dnl
+dnl The optional parameter gives the root name of the library, in case it is
+dnl not installed as the default curses library. That is how the
+dnl wide-character version of ncurses is installed.
+AC_DEFUN([CF_NCURSES_LIBS],
+[AC_REQUIRE([CF_NCURSES_CPPFLAGS])
+
+cf_nculib_root=ifelse($1,,ncurses,$1)
+ # This works, except for the special case where we find gpm, but
+ # ncurses is in a nonstandard location via $LIBS, and we really want
+ # to link gpm.
+cf_ncurses_LIBS=""
+cf_ncurses_SAVE="$LIBS"
+AC_CHECK_LIB(gpm,Gpm_Open,
+ [AC_CHECK_LIB(gpm,initscr,
+ [LIBS="$cf_ncurses_SAVE"],
+ [cf_ncurses_LIBS="-lgpm"])])
+
+case "$host_os" in
+(freebsd*)
+ # This is only necessary if you are linking against an obsolete
+ # version of ncurses (but it should do no harm, since it is static).
+ if test "$cf_nculib_root" = ncurses ; then
+ AC_CHECK_LIB(mytinfo,tgoto,[cf_ncurses_LIBS="-lmytinfo $cf_ncurses_LIBS"])
+ fi
+ ;;
+esac
+
+CF_ADD_LIBS($cf_ncurses_LIBS)
+
+if test -n "$cf_cv_curses_dir" && test "$cf_cv_curses_dir" != "no"
+then
+ CF_ADD_LIBS(-l$cf_nculib_root)
+else
+ CF_FIND_LIBRARY($cf_nculib_root,$cf_nculib_root,
+ [#include <${cf_cv_ncurses_header:-curses.h}>],
+ [initscr()],
+ initscr)
+fi
+
+if test -n "$cf_ncurses_LIBS" ; then
+ AC_MSG_CHECKING(if we can link $cf_nculib_root without $cf_ncurses_LIBS)
+ cf_ncurses_SAVE="$LIBS"
+ for p in $cf_ncurses_LIBS ; do
+ q=`echo "$LIBS" | sed -e "s%$p %%" -e "s%$p$%%"`
+ if test "$q" != "$LIBS" ; then
+ LIBS="$q"
+ fi
+ done
+ AC_TRY_LINK([#include <${cf_cv_ncurses_header:-curses.h}>],
+ [initscr(); mousemask(0,0); tigetstr((char *)0);],
+ [AC_MSG_RESULT(yes)],
+ [AC_MSG_RESULT(no)
+ LIBS="$cf_ncurses_SAVE"])
+fi
+
+CF_UPPER(cf_nculib_ROOT,HAVE_LIB$cf_nculib_root)
+AC_DEFINE_UNQUOTED($cf_nculib_ROOT)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_NCURSES_VERSION version: 17 updated: 2023/01/05 18:54:02
+dnl ------------------
+dnl Check for the version of ncurses, to aid in reporting bugs, etc.
+dnl Call CF_CURSES_CPPFLAGS first, or CF_NCURSES_CPPFLAGS. We don't use
+dnl AC_REQUIRE since that does not work with the shell's if/then/else/fi.
+AC_DEFUN([CF_NCURSES_VERSION],
+[
+AC_REQUIRE([CF_CURSES_CPPFLAGS])dnl
+AC_CACHE_CHECK(for ncurses version, cf_cv_ncurses_version,[
+ cf_cv_ncurses_version=no
+ cf_tempfile=out$$
+ rm -f "$cf_tempfile"
+ AC_TRY_RUN([
+$ac_includes_default
+
+#include <${cf_cv_ncurses_header:-curses.h}>
+
+int main(void)
+{
+ FILE *fp = fopen("$cf_tempfile", "w");
+#ifdef NCURSES_VERSION
+# ifdef NCURSES_VERSION_PATCH
+ fprintf(fp, "%s.%d\\n", NCURSES_VERSION, NCURSES_VERSION_PATCH);
+# else
+ fprintf(fp, "%s\\n", NCURSES_VERSION);
+# endif
+#else
+# ifdef __NCURSES_H
+ fprintf(fp, "old\\n");
+# else
+ make an error
+# endif
+#endif
+ ${cf_cv_main_return:-return}(0);
+}],[
+ cf_cv_ncurses_version=`cat $cf_tempfile`],,[
+
+ # This will not work if the preprocessor splits the line after the
+ # Autoconf token. The 'unproto' program does that.
+ cat > "conftest.$ac_ext" <<EOF
+#include <${cf_cv_ncurses_header:-curses.h}>
+#undef Autoconf
+#ifdef NCURSES_VERSION
+Autoconf NCURSES_VERSION
+#else
+#ifdef __NCURSES_H
+Autoconf "old"
+#endif
+;
+#endif
+EOF
+ cf_try="$ac_cpp conftest.$ac_ext 2>&AC_FD_CC | grep '^Autoconf ' >conftest.out"
+ AC_TRY_EVAL(cf_try)
+ if test -f conftest.out ; then
+ cf_out=`sed -e 's%^Autoconf %%' -e 's%^[[^"]]*"%%' -e 's%".*%%' conftest.out`
+ test -n "$cf_out" && cf_cv_ncurses_version="$cf_out"
+ rm -f conftest.out
+ fi
+])
+ rm -f "$cf_tempfile"
+])
+test "$cf_cv_ncurses_version" = no || AC_DEFINE(NCURSES,1,[Define to 1 if we are using ncurses headers/libraries])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_NETLIBS version: 12 updated: 2021/01/02 09:31:20
+dnl ----------
+dnl After checking for functions in the default $LIBS, make a further check
+dnl for the functions that are netlib-related (these aren't always in the
+dnl libc, etc., and have to be handled specially because there are conflicting
+dnl and broken implementations.
+dnl Common library requirements (in order):
+dnl -lresolv -lsocket -lnsl
+dnl -lnsl -lsocket
+dnl -lsocket
+dnl -lbsd
+dnl -lnetwork
+AC_DEFUN([CF_NETLIBS],[
+cf_test_netlibs=no
+
+AC_MSG_CHECKING(for network libraries)
+
+AC_CACHE_VAL(cf_cv_netlibs,[
+AC_MSG_RESULT(working...)
+
+cf_cv_netlibs=""
+cf_test_netlibs=yes
+
+case "$host_os" in
+(mingw*)
+ AC_CHECK_HEADERS( windows.h winsock.h winsock2.h )
+
+ if test "$ac_cv_header_winsock2_h" = "yes" ; then
+ cf_winsock_lib="-lws2_32"
+ elif test "$ac_cv_header_winsock_h" = "yes" ; then
+ cf_winsock_lib="-lwsock32"
+ fi
+
+ cf_save_LIBS="$LIBS"
+ CF_ADD_LIBS($cf_winsock_lib)
+
+ AC_TRY_LINK([
+#ifdef HAVE_WINDOWS_H
+#undef WIN32_LEAN_AND_MEAN
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#ifdef HAVE_WINSOCK2_H
+#include <winsock2.h>
+#else
+#ifdef HAVE_WINSOCK_H
+#include <winsock.h>
+#endif
+#endif
+#endif
+],[
+ char buffer[1024];
+ gethostname(buffer, sizeof(buffer));],
+ [cf_cv_netlibs="$cf_winsock_lib $cf_cv_netlibs"],
+ [AC_MSG_ERROR(Cannot link against winsock library)])
+
+ LIBS="$cf_save_LIBS"
+ ;;
+(*)
+ AC_CHECK_FUNCS(gethostname,,[
+ CF_RECHECK_FUNC(gethostname,nsl,cf_cv_netlibs,[
+ CF_RECHECK_FUNC(gethostname,socket,cf_cv_netlibs)])])
+
+ AC_CHECK_LIB(inet, main, cf_cv_netlibs="-linet $cf_cv_netlibs")
+
+ if test "$ac_cv_func_lsocket" != no ; then
+ AC_CHECK_FUNCS(socket,,[
+ CF_RECHECK_FUNC(socket,socket,cf_cv_netlibs,[
+ CF_RECHECK_FUNC(socket,bsd,cf_cv_netlibs)])])
+ fi
+
+ AC_CHECK_FUNCS(gethostbyname,,[
+ CF_RECHECK_FUNC(gethostbyname,nsl,cf_cv_netlibs)])
+
+ AC_CHECK_FUNCS(inet_ntoa,,[
+ CF_RECHECK_FUNC(inet_ntoa,nsl,cf_cv_netlibs)])
+
+ AC_CHECK_FUNCS(gethostbyname,,[
+ CF_RECHECK_FUNC(gethostbyname,network,cf_cv_netlibs)])
+
+ AC_CHECK_FUNCS(strcasecmp,,[
+ CF_RECHECK_FUNC(strcasecmp,resolv,cf_cv_netlibs)])
+ ;;
+esac
+])
+
+case "$cf_cv_netlibs" in
+(*ws2_32*)
+ AC_DEFINE(USE_WINSOCK2_H,1,[Define to 1 if we should include winsock2.h])
+ ;;
+esac
+
+CF_ADD_LIBS($cf_cv_netlibs)
+test "$cf_test_netlibs" = no && echo "$cf_cv_netlibs" >&AC_FD_MSG
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_NGROUPS version: 4 updated: 2012/11/08 20:57:52
+dnl ----------
+dnl Check for the symbol NGROUPS
+AC_DEFUN([CF_NGROUPS],
+[
+AC_MSG_CHECKING(if NGROUPS is defined)
+AC_CACHE_VAL(cf_cv_ngroups,[
+AC_TRY_COMPILE([
+#if HAVE_SYS_PARAM_H
+#include <sys/param.h>
+#endif
+#if HAVE_LIMITS_H
+#include <limits.h>
+#endif
+],[int x = NGROUPS],
+ [cf_cv_ngroups=yes],
+ [AC_TRY_COMPILE([
+#if HAVE_SYS_PARAM_H
+#include <sys/param.h>
+#endif
+#if HAVE_LIMITS_H
+#include <limits.h>
+#endif
+],[int x = NGROUPS_MAX],
+ [cf_cv_ngroups=NGROUPS_MAX],
+ [cf_cv_ngroups=no])
+ ])
+AC_MSG_RESULT($cf_cv_ngroups)
+])
+if test "$cf_cv_ngroups" = no ; then
+ AC_DEFINE(NGROUPS,16,[Define to maximum number of groups])
+elif test "$cf_cv_ngroups" = NGROUPS_MAX ; then
+ AC_DEFINE(NGROUPS,NGROUPS_MAX)
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_NO_LEAKS_OPTION version: 9 updated: 2021/06/13 19:45:41
+dnl ------------------
+dnl see CF_WITH_NO_LEAKS
+dnl
+dnl $1 = option/name
+dnl $2 = help-text
+dnl $3 = symbol to define if the option is set
+dnl $4 = additional actions to take if the option is set
+AC_DEFUN([CF_NO_LEAKS_OPTION],[
+AC_MSG_CHECKING(if you want to use $1 for testing)
+AC_ARG_WITH($1,
+ [$2],
+ [case "x$withval" in
+ (x|xno) ;;
+ (*)
+ : "${with_cflags:=-g}"
+ : "${enable_leaks:=no}"
+ with_$1=yes
+ AC_DEFINE_UNQUOTED($3,1,"Define to 1 if you want to use $1 for testing.")ifelse([$4],,[
+ $4
+])
+ ;;
+ esac],
+ [with_$1=])
+AC_MSG_RESULT(${with_$1:-no})
+
+case ".$with_cflags" in
+(.*-g*)
+ case .$CFLAGS in
+ (.*-g*)
+ ;;
+ (*)
+ CF_ADD_CFLAGS([-g])
+ ;;
+ esac
+ ;;
+esac
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_NSS_COMPAT version: 7 updated: 2021/01/02 09:31:20
+dnl -------------
+dnl Check for NSS compatible SSL libraries
+dnl $1 = the [optional] directory in which the library may be found
+AC_DEFUN([CF_NSS_COMPAT],[
+check=`pkg-config --version 2>/dev/null`
+if test -n "$check" ; then
+ cf_ssl_library=`pkg-config --libs nss`
+ cf_ssl_cflags=`pkg-config --cflags nss`
+else
+ # Without pkg-config, we'll kludge in some defaults
+ cf_ssl_library="-lssl3 -lsmime3 -lnss3 -lplds4 -lplc4 -lnspr4 -lpthread -ldl"
+ cf_ssl_cflags="-I/usr/include/nss3 -I/usr/include/nspr4"
+fi
+cf_ssl_library="-lnss_compat_ossl $cf_ssl_library"
+
+case "$1" in
+(no)
+ cf_ssl_root=
+ ;;
+(yes)
+ AC_CHECK_LIB(nss_compat_ossl, SSL_get_version,[],[
+ cf_ssl_root=/usr/local/nss_compat_ossl
+ if test -d "$cf_ssl_root" ; then
+ CF_VERBOSE(assume it is in $cf_ssl_root)
+ cf_ssl_library="-L$cf_ssl_root/lib $cf_ssl_library"
+ else
+ AC_MSG_ERROR(cannot find NSS compliant libraries)
+ fi
+ ],
+ [-lnss_compat_ossl])
+ ;;
+(*)
+ if test -d "$1" ; then
+ if test -d "$1/include" ; then
+ cf_ssl_root=$1
+ elif test -d "$1/../include" ; then
+ cf_ssl_root=$1/..
+ else
+ AC_MSG_ERROR(cannot find NSS compliant library under $1)
+ fi
+ cf_ssl_library="-L$cf_ssl_root/lib $cf_ssl_library"
+ else
+ AC_MSG_WARN(expected a directory: $1)
+ fi
+ ;;
+esac
+CF_ADD_LIBS($cf_ssl_library)
+
+cf_ssl_subincs=yes
+if test -n "$cf_ssl_root" ; then
+ if test -d "$cf_ssl_root/include" ; then
+ cf_ssl_cflags="-I$cf_ssl_root/include $cf_ssl_cflags"
+ test -d "$cf_ssl_root/include/nss_compat_ossl" || cf_ssl_subincs=no
+ fi
+fi
+CF_ADD_CFLAGS($cf_ssl_cflags)
+
+if test "$cf_ssl_subincs" = yes ; then
+AC_MSG_CHECKING(for NSS compliant include directory)
+AC_TRY_COMPILE([
+#include <stdio.h>
+#include <nss_compat_ossl/nss_compat_ossl.h>],
+ [SSL_shutdown((SSL *)0)],
+ [cf_ssl_incl=yes],
+ [cf_ssl_incl=no])
+AC_MSG_RESULT($cf_ssl_incl)
+test "$cf_ssl_incl" = yes && AC_DEFINE(USE_NSS_COMPAT_INCL,1,[Define to 1 if we should use nss compatibility header])
+fi
+
+AC_MSG_CHECKING(if we can link to NSS compliant library)
+AC_TRY_LINK([
+#include <stdio.h>
+#ifdef USE_NSS_COMPAT_INCL
+#include <nss_compat_ossl/nss_compat_ossl.h>
+#else
+#include <ssl.h>
+#endif
+],
+ [SSL_shutdown((SSL *)0)],
+ [cf_ssl_library=yes],
+ [cf_ssl_library=no])
+AC_MSG_RESULT($cf_ssl_library)
+if test "$cf_ssl_library" = yes ; then
+ AC_DEFINE(USE_SSL,1,[Define to 1 if we should use SSL])
+ AC_DEFINE(USE_X509_SUPPORT,1,[Define to 1 if the SSL library provides X509 support])
+else
+ AC_MSG_ERROR(Cannot link with NSS compliant libraries)
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_OUR_MESSAGES version: 8 updated: 2021/01/02 09:31:20
+dnl ---------------
+dnl Check if we use the messages included with this program
+dnl
+dnl $1 specifies either Makefile or makefile, defaulting to the former.
+dnl
+dnl Sets variables which can be used to substitute in makefiles:
+dnl MSG_DIR_MAKE - to make ./po directory
+dnl SUB_MAKEFILE - makefile in ./po directory (see CF_BUNDLED_INTL)
+dnl
+AC_DEFUN([CF_OUR_MESSAGES],
+[
+cf_makefile=ifelse($1,,Makefile,$1)
+
+use_our_messages=no
+if test "$USE_NLS" = yes ; then
+if test -d "$srcdir/po" ; then
+AC_MSG_CHECKING(if we should use included message-library)
+ AC_ARG_ENABLE(included-msgs,
+ [ --disable-included-msgs use included messages, for i18n support],
+ [use_our_messages=$enableval],
+ [use_our_messages=yes])
+fi
+AC_MSG_RESULT($use_our_messages)
+fi
+
+MSG_DIR_MAKE="#"
+if test "$use_our_messages" = yes
+then
+ SUB_MAKEFILE="$SUB_MAKEFILE po/$cf_makefile.in:$srcdir/po/$cf_makefile.inn"
+ MSG_DIR_MAKE=
+fi
+
+AC_SUBST(MSG_DIR_MAKE)
+AC_SUBST(SUB_MAKEFILE)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_PATHSEP version: 8 updated: 2021/01/01 13:31:04
+dnl ----------
+dnl Provide a value for the $PATH and similar separator (or amend the value
+dnl as provided in autoconf 2.5x).
+AC_DEFUN([CF_PATHSEP],
+[
+ AC_MSG_CHECKING(for PATH separator)
+ case "$cf_cv_system_name" in
+ (os2*) PATH_SEPARATOR=';' ;;
+ (*) ${PATH_SEPARATOR:=':'} ;;
+ esac
+ifelse([$1],,,[$1=$PATH_SEPARATOR])
+ AC_SUBST(PATH_SEPARATOR)
+ AC_MSG_RESULT($PATH_SEPARATOR)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_PATH_PROG version: 12 updated: 2021/01/02 09:31:20
+dnl ------------
+dnl Check for a given program, defining corresponding symbol.
+dnl $1 = environment variable, which is suffixed by "_PATH" in the #define.
+dnl $2 = program name to find.
+dnl $3 = optional list of additional program names to test.
+dnl $4 = $PATH
+dnl
+dnl If there is more than one token in the result, #define the remaining tokens
+dnl to $1_ARGS. We need this for 'install' in particular.
+dnl
+dnl FIXME: we should allow this to be overridden by environment variables
+dnl
+AC_DEFUN([CF_PATH_PROG],[
+AC_REQUIRE([CF_PATHSEP])
+test -z "[$]$1" && $1="$2"
+AC_PATH_PROGS($1,[$]$1 $2 ifelse($3,,,$3),[$]$1, ifelse($4,,,$4))
+
+cf_path_prog=""
+cf_path_args=""
+IFS="${IFS:- }"; cf_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR"
+for cf_temp in $ac_cv_path_$1
+do
+ if test -z "$cf_path_prog" ; then
+ if test "$with_full_paths" = yes ; then
+ CF_PATH_SYNTAX(cf_temp,break)
+ cf_path_prog="$cf_temp"
+ else
+ cf_path_prog="`basename "$cf_temp"`"
+ fi
+ elif test -z "$cf_path_args" ; then
+ cf_path_args="$cf_temp"
+ else
+ cf_path_args="$cf_path_args $cf_temp"
+ fi
+done
+IFS="$cf_save_ifs"
+
+if test -n "$cf_path_prog" ; then
+ CF_MSG_LOG(defining path for ${cf_path_prog})
+ AC_DEFINE_UNQUOTED($1_PATH,"$cf_path_prog",Define to pathname $1)
+ test -n "$cf_path_args" && AC_DEFINE_UNQUOTED($1_ARGS,"$cf_path_args",Define to provide args for $1)
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_PATH_SYNTAX version: 18 updated: 2020/12/31 18:40:20
+dnl --------------
+dnl Check the argument to see that it looks like a pathname. Rewrite it if it
+dnl begins with one of the prefix/exec_prefix variables, and then again if the
+dnl result begins with 'NONE'. This is necessary to work around autoconf's
+dnl delayed evaluation of those symbols.
+AC_DEFUN([CF_PATH_SYNTAX],[
+if test "x$prefix" != xNONE; then
+ cf_path_syntax="$prefix"
+else
+ cf_path_syntax="$ac_default_prefix"
+fi
+
+case ".[$]$1" in
+(.\[$]\(*\)*|.\'*\'*)
+ ;;
+(..|./*|.\\*)
+ ;;
+(.[[a-zA-Z]]:[[\\/]]*) # OS/2 EMX
+ ;;
+(.\[$]\{*prefix\}*|.\[$]\{*dir\}*)
+ eval $1="[$]$1"
+ case ".[$]$1" in
+ (.NONE/*)
+ $1=`echo "[$]$1" | sed -e s%NONE%$cf_path_syntax%`
+ ;;
+ esac
+ ;;
+(.no|.NONE/*)
+ $1=`echo "[$]$1" | sed -e s%NONE%$cf_path_syntax%`
+ ;;
+(*)
+ ifelse([$2],,[AC_MSG_ERROR([expected a pathname, not \"[$]$1\"])],$2)
+ ;;
+esac
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_PDCURSES_W32 version: 2 updated: 2019/12/31 10:27:03
+dnl ---------------
+dnl Configure for PDCurses' Win32 library, checking for definitions as well
+dnl which are needed to use its header file correctly.
+AC_DEFUN([CF_PDCURSES_W32],[
+
+AC_CHECK_LIB(pdcurses,initscr,[
+ CF_ADD_LIBS(-lpdcurses)
+ cf_cv_term_header=no
+ cf_cv_unctrl_header=no
+ AC_CHECK_FUNC(winwstr,[AC_DEFINE(PDC_WIDE,1,[Define to 1 if PDCurses has winwstr])])
+ AC_CHECK_FUNC(pdcurses_dll_iname,[AC_DEFINE(PDC_DLL_BUILD,1,[Define to 1 if PDCurses has pdcurses_dll_iname])])
+])
+
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_PDCURSES_X11 version: 15 updated: 2021/01/02 09:31:20
+dnl ---------------
+dnl Configure for PDCurses' X11 library
+AC_DEFUN([CF_PDCURSES_X11],[
+AC_REQUIRE([CF_X_ATHENA])
+
+CF_ACVERSION_CHECK(2.52,
+ [AC_CHECK_TOOLS(XCURSES_CONFIG, xcurses-config, none)],
+ [AC_PATH_PROGS(XCURSES_CONFIG, xcurses-config, none)])
+
+if test "$XCURSES_CONFIG" != none ; then
+
+CF_ADD_CFLAGS(`$XCURSES_CONFIG --cflags`)
+CF_ADD_LIBS(`$XCURSES_CONFIG --libs`)
+
+cf_cv_lib_XCurses=yes
+
+else
+
+LDFLAGS="$LDFLAGS $X_LIBS"
+CF_CHECK_CFLAGS($X_CFLAGS)
+AC_CHECK_LIB(X11,XOpenDisplay,
+ [CF_ADD_LIBS(-lX11)],,
+ [$X_PRE_LIBS $LIBS $X_EXTRA_LIBS])
+AC_CACHE_CHECK(for XCurses library,cf_cv_lib_XCurses,[
+CF_ADD_LIBS(-lXCurses)
+AC_TRY_LINK([
+#include <xcurses.h>
+char *XCursesProgramName = "test";
+],[XCursesExit();],
+[cf_cv_lib_XCurses=yes],
+[cf_cv_lib_XCurses=no])
+])
+
+fi
+
+if test "$cf_cv_lib_XCurses" = yes ; then
+ AC_DEFINE(UNIX,1,[Define to 1 if using PDCurses on Unix])
+ AC_DEFINE(XCURSES,1,[Define to 1 if using PDCurses on Unix])
+ AC_CHECK_HEADER(xcurses.h, AC_DEFINE(HAVE_XCURSES,1,[Define to 1 if using PDCurses on Unix]))
+else
+ AC_MSG_ERROR(Cannot link with XCurses)
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_PKG_CONFIG version: 12 updated: 2021/10/10 20:18:09
+dnl -------------
+dnl Check for the package-config program, unless disabled by command-line.
+dnl
+dnl Sets $PKG_CONFIG to the pathname of the pkg-config program.
+AC_DEFUN([CF_PKG_CONFIG],
+[
+AC_MSG_CHECKING(if you want to use pkg-config)
+AC_ARG_WITH(pkg-config,
+ [ --with-pkg-config{=path} enable/disable use of pkg-config],
+ [cf_pkg_config=$withval],
+ [cf_pkg_config=yes])
+AC_MSG_RESULT($cf_pkg_config)
+
+case "$cf_pkg_config" in
+(no)
+ PKG_CONFIG=none
+ ;;
+(yes)
+ CF_ACVERSION_CHECK(2.52,
+ [AC_PATH_TOOL(PKG_CONFIG, pkg-config, none)],
+ [AC_PATH_PROG(PKG_CONFIG, pkg-config, none)])
+ ;;
+(*)
+ PKG_CONFIG=$withval
+ ;;
+esac
+
+test -z "$PKG_CONFIG" && PKG_CONFIG=none
+if test "$PKG_CONFIG" != none ; then
+ CF_PATH_SYNTAX(PKG_CONFIG)
+elif test "x$cf_pkg_config" != xno ; then
+ AC_MSG_WARN(pkg-config is not installed)
+fi
+
+AC_SUBST(PKG_CONFIG)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_POSIX_C_SOURCE version: 11 updated: 2018/12/31 20:46:17
+dnl -----------------
+dnl Define _POSIX_C_SOURCE to the given level, and _POSIX_SOURCE if needed.
+dnl
+dnl POSIX.1-1990 _POSIX_SOURCE
+dnl POSIX.1-1990 and _POSIX_SOURCE and
+dnl POSIX.2-1992 C-Language _POSIX_C_SOURCE=2
+dnl Bindings Option
+dnl POSIX.1b-1993 _POSIX_C_SOURCE=199309L
+dnl POSIX.1c-1996 _POSIX_C_SOURCE=199506L
+dnl X/Open 2000 _POSIX_C_SOURCE=200112L
+dnl
+dnl Parameters:
+dnl $1 is the nominal value for _POSIX_C_SOURCE
+AC_DEFUN([CF_POSIX_C_SOURCE],
+[AC_REQUIRE([CF_POSIX_VISIBLE])dnl
+
+if test "$cf_cv_posix_visible" = no; then
+
+cf_POSIX_C_SOURCE=ifelse([$1],,199506L,[$1])
+
+cf_save_CFLAGS="$CFLAGS"
+cf_save_CPPFLAGS="$CPPFLAGS"
+
+CF_REMOVE_DEFINE(cf_trim_CFLAGS,$cf_save_CFLAGS,_POSIX_C_SOURCE)
+CF_REMOVE_DEFINE(cf_trim_CPPFLAGS,$cf_save_CPPFLAGS,_POSIX_C_SOURCE)
+
+AC_CACHE_CHECK(if we should define _POSIX_C_SOURCE,cf_cv_posix_c_source,[
+ CF_MSG_LOG(if the symbol is already defined go no further)
+ AC_TRY_COMPILE([#include <sys/types.h>],[
+#ifndef _POSIX_C_SOURCE
+make an error
+#endif],
+ [cf_cv_posix_c_source=no],
+ [cf_want_posix_source=no
+ case .$cf_POSIX_C_SOURCE in
+ (.[[12]]??*)
+ cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE"
+ ;;
+ (.2)
+ cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE"
+ cf_want_posix_source=yes
+ ;;
+ (.*)
+ cf_want_posix_source=yes
+ ;;
+ esac
+ if test "$cf_want_posix_source" = yes ; then
+ AC_TRY_COMPILE([#include <sys/types.h>],[
+#ifdef _POSIX_SOURCE
+make an error
+#endif],[],
+ cf_cv_posix_c_source="$cf_cv_posix_c_source -D_POSIX_SOURCE")
+ fi
+ CF_MSG_LOG(ifdef from value $cf_POSIX_C_SOURCE)
+ CFLAGS="$cf_trim_CFLAGS"
+ CPPFLAGS="$cf_trim_CPPFLAGS"
+ CF_APPEND_TEXT(CPPFLAGS,$cf_cv_posix_c_source)
+ CF_MSG_LOG(if the second compile does not leave our definition intact error)
+ AC_TRY_COMPILE([#include <sys/types.h>],[
+#ifndef _POSIX_C_SOURCE
+make an error
+#endif],,
+ [cf_cv_posix_c_source=no])
+ CFLAGS="$cf_save_CFLAGS"
+ CPPFLAGS="$cf_save_CPPFLAGS"
+ ])
+])
+
+if test "$cf_cv_posix_c_source" != no ; then
+ CFLAGS="$cf_trim_CFLAGS"
+ CPPFLAGS="$cf_trim_CPPFLAGS"
+ CF_ADD_CFLAGS($cf_cv_posix_c_source)
+fi
+
+fi # cf_cv_posix_visible
+
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_POSIX_VISIBLE version: 1 updated: 2018/12/31 20:46:17
+dnl ----------------
+dnl POSIX documents test-macros which an application may set before any system
+dnl headers are included to make features available.
+dnl
+dnl Some BSD platforms (originally FreeBSD, but copied by a few others)
+dnl diverged from POSIX in 2002 by setting symbols which make all of the most
+dnl recent features visible in the system header files unless the application
+dnl overrides the corresponding test-macros. Doing that introduces portability
+dnl problems.
+dnl
+dnl This macro makes a special check for the symbols used for this, to avoid a
+dnl conflicting definition.
+AC_DEFUN([CF_POSIX_VISIBLE],
+[
+AC_CACHE_CHECK(if the POSIX test-macros are already defined,cf_cv_posix_visible,[
+AC_TRY_COMPILE([#include <stdio.h>],[
+#if defined(__POSIX_VISIBLE) && ((__POSIX_VISIBLE - 0L) > 0) \
+ && defined(__XSI_VISIBLE) && ((__XSI_VISIBLE - 0L) > 0) \
+ && defined(__BSD_VISIBLE) && ((__BSD_VISIBLE - 0L) > 0) \
+ && defined(__ISO_C_VISIBLE) && ((__ISO_C_VISIBLE - 0L) > 0)
+#error conflicting symbols found
+#endif
+],[cf_cv_posix_visible=no],[cf_cv_posix_visible=yes])
+])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_PROG_AR version: 1 updated: 2009/01/01 20:15:22
+dnl ----------
+dnl Check for archiver "ar".
+AC_DEFUN([CF_PROG_AR],[
+AC_CHECK_TOOL(AR, ar, ar)
+])
+dnl ---------------------------------------------------------------------------
+dnl CF_PROG_CC version: 5 updated: 2019/12/31 08:53:54
+dnl ----------
+dnl standard check for CC, plus followup sanity checks
+dnl $1 = optional parameter to pass to AC_PROG_CC to specify compiler name
+AC_DEFUN([CF_PROG_CC],[
+CF_ACVERSION_CHECK(2.53,
+ [AC_MSG_WARN(this will incorrectly handle gnatgcc choice)
+ AC_REQUIRE([AC_PROG_CC])],
+ [])
+ifelse($1,,[AC_PROG_CC],[AC_PROG_CC($1)])
+CF_GCC_VERSION
+CF_ACVERSION_CHECK(2.52,
+ [AC_PROG_CC_STDC],
+ [CF_ANSI_CC_REQD])
+CF_CC_ENV_FLAGS
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_PROG_CPP_COMMENTS version: 1 updated: 2017/07/02 14:31:07
+dnl --------------------
+dnl Ask for preprocessor "-C" option if we can get it.
+AC_DEFUN([CF_PROG_CPP_COMMENTS],[
+AC_REQUIRE([AC_PROG_CPP])
+AC_MSG_CHECKING(if preprocessor -C option works)
+AC_CACHE_VAL(cf_cv_prog_cpp_comments,[
+cf_cv_prog_cpp_comments=no
+cat >conftest.c <<CF_EOF
+int main(void)
+{
+ /* COMMENT */
+ return 0;
+}
+CF_EOF
+if ( $CPP -C conftest.c >conftest.i 2>/dev/null )
+then
+ if ( grep COMMENT conftest.i >/dev/null 2>/dev/null )
+ then
+ cf_cv_prog_cpp_comments=yes
+ fi
+fi
+rm -f conftest.[[ci]]
+])
+AC_MSG_RESULT($cf_cv_prog_cpp_comments)
+if test x$cf_cv_prog_cpp_comments = xyes
+then
+ CPP="$CPP -C"
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_PROG_EXT version: 15 updated: 2021/01/02 09:31:20
+dnl -----------
+dnl Compute $PROG_EXT, used for non-Unix ports, such as OS/2 EMX.
+AC_DEFUN([CF_PROG_EXT],
+[
+AC_REQUIRE([CF_CHECK_CACHE])
+case "$cf_cv_system_name" in
+(os2*)
+ CFLAGS="$CFLAGS -Zmt"
+ CF_APPEND_TEXT(CPPFLAGS,-D__ST_MT_ERRNO__)
+ CXXFLAGS="$CXXFLAGS -Zmt"
+ # autoconf's macro sets -Zexe and suffix both, which conflict:w
+ LDFLAGS="$LDFLAGS -Zmt -Zcrtdll"
+ ac_cv_exeext=.exe
+ ;;
+esac
+
+AC_EXEEXT
+AC_OBJEXT
+
+PROG_EXT="$EXEEXT"
+AC_SUBST(PROG_EXT)
+test -n "$PROG_EXT" && AC_DEFINE_UNQUOTED(PROG_EXT,"$PROG_EXT",[Define to the program extension (normally blank)])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_PROG_LINT version: 5 updated: 2022/08/20 15:44:13
+dnl ------------
+AC_DEFUN([CF_PROG_LINT],
+[
+AC_CHECK_PROGS(LINT, lint cppcheck splint)
+case "x$LINT" in
+(xcppcheck|x*/cppcheck)
+ test -z "$LINT_OPTS" && LINT_OPTS="--enable=all"
+ ;;
+esac
+AC_SUBST(LINT_OPTS)
+AC_SUBST(LINT_LIBS)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_PROG_RANLIB version: 1 updated: 2009/01/01 20:15:22
+dnl --------------
+dnl Check for ranlib.
+dnl
+dnl TODO: make this conditionally depend on autoconf version, since the later
+dnl versions of autoconf use check-tool.
+AC_DEFUN([CF_PROG_RANLIB],[
+AC_CHECK_TOOL(RANLIB, ranlib, ':')
+])
+dnl ---------------------------------------------------------------------------
+dnl CF_RECHECK_FUNC version: 3 updated: 2000/10/18 19:29:13
+dnl ---------------
+dnl Re-check on a function to see if we can pick it up by adding a library.
+dnl $1 = function to check
+dnl $2 = library to check in
+dnl $3 = environment to update (e.g., $LIBS)
+dnl $4 = what to do if this fails
+dnl
+dnl This uses 'unset' if the shell happens to support it, but leaves the
+dnl configuration variable set to 'unknown' if not. This is a little better
+dnl than the normal autoconf test, which gives misleading results if a test
+dnl for the function is made (e.g., with AC_CHECK_FUNC) after this macro is
+dnl used (autoconf does not distinguish between a null token and one that is
+dnl set to 'no').
+AC_DEFUN([CF_RECHECK_FUNC],[
+AC_CHECK_LIB($2,$1,[
+ CF_UPPER(cf_tr_func,$1)
+ AC_DEFINE_UNQUOTED(HAVE_$cf_tr_func)
+ ac_cv_func_$1=yes
+ if test "$cf_used_lib_$2" != yes ; then cf_used_lib_$2=yes; $3="-l$2 [$]$3"; fi],[
+ ac_cv_func_$1=unknown
+ unset ac_cv_func_$1 2>/dev/null
+ $4],
+ [[$]$3])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_REMOVE_BROKEN version: 4 updated: 2012/11/08 20:57:52
+dnl ----------------
+dnl Check for broken definition of 'remove()'. This is (in particular) broken
+dnl on the older version of SCO (I'd cite version if I knew where to look) by
+dnl having <stdio.h> #define remove to __unlink, which appears in no library.
+dnl
+dnl Fortuitously, we can combine this with a more general test: do we have
+dnl 'unlink()' but no 'remove()'. Note, however, that we cannot simply #define
+dnl remove to unlink, but have to make a fallback function.
+dnl
+AC_DEFUN([CF_REMOVE_BROKEN],
+[
+AC_MSG_CHECKING(for broken/missing definition of remove)
+AC_CACHE_VAL(cf_cv_baddef_remove,[
+AC_TRY_LINK(
+ [#include <stdio.h>],
+ [remove("dummy")],
+ [cf_cv_baddef_remove=no],
+ [AC_TRY_LINK(
+ [#include <stdio.h>
+ int __unlink(name) { return unlink(name); } ],
+ [remove("dummy")],
+ [cf_cv_baddef_remove=yes],
+ [cf_cv_baddef_remove=unknown])
+ ])
+])
+AC_MSG_RESULT($cf_cv_baddef_remove)
+test "$cf_cv_baddef_remove" != no && AC_DEFINE(NEED_REMOVE,1,[Define to 1 if we should use remove rather than unlink])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_REMOVE_CFLAGS version: 3 updated: 2021/09/05 17:25:40
+dnl ----------------
+dnl Remove a given option from CFLAGS/CPPFLAGS
+dnl $1 = option to remove
+dnl $2 = variable to update
+dnl $3 = nonempty to allow verbose message
+define([CF_REMOVE_CFLAGS],
+[
+cf_tmp_cflag=`echo "x$1" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+ cf_old_cflag=`echo "x[$]$2" | sed -e 's/^.//' -e 's/[[ ]][[ ]]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[[^ ]][[^ ]]*\\)\?%%" -e 's/^[[ ]]*//' -e 's%[[ ]][[ ]]*-D% -D%g' -e 's%[[ ]][[ ]]*-I% -I%g'`
+ test "[$]$2" != "$cf_old_cflag" || break
+ ifelse([$3],,,[CF_VERBOSE(removing old option $1 from $2)])
+ $2="$cf_old_cflag"
+done
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_REMOVE_DEFINE version: 3 updated: 2010/01/09 11:05:50
+dnl ----------------
+dnl Remove all -U and -D options that refer to the given symbol from a list
+dnl of C compiler options. This works around the problem that not all
+dnl compilers process -U and -D options from left-to-right, so a -U option
+dnl cannot be used to cancel the effect of a preceding -D option.
+dnl
+dnl $1 = target (which could be the same as the source variable)
+dnl $2 = source (including '$')
+dnl $3 = symbol to remove
+define([CF_REMOVE_DEFINE],
+[
+$1=`echo "$2" | \
+ sed -e 's/-[[UD]]'"$3"'\(=[[^ ]]*\)\?[[ ]]/ /g' \
+ -e 's/-[[UD]]'"$3"'\(=[[^ ]]*\)\?[$]//g'`
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_RESTORE_XTRA_FLAGS version: 1 updated: 2020/01/11 16:47:45
+dnl ---------------------
+dnl Restore flags saved in CF_SAVE_XTRA_FLAGS
+dnl $1 = name of current macro
+define([CF_RESTORE_XTRA_FLAGS],
+[
+LIBS="$cf_save_LIBS_$1"
+CFLAGS="$cf_save_CFLAGS_$1"
+CPPFLAGS="$cf_save_CPPFLAGS_$1"
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_RPATH_HACK version: 13 updated: 2021/01/03 18:30:50
+dnl -------------
+AC_DEFUN([CF_RPATH_HACK],
+[AC_REQUIRE([AC_PROG_FGREP])dnl
+AC_REQUIRE([CF_LD_RPATH_OPT])dnl
+
+AC_MSG_CHECKING(for updated LDFLAGS)
+if test -n "$LD_RPATH_OPT" ; then
+ AC_MSG_RESULT(maybe)
+
+ AC_CHECK_PROGS(cf_ldd_prog,ldd,no)
+ cf_rpath_list="/usr/lib /lib"
+ if test "$cf_ldd_prog" != no
+ then
+ cf_rpath_oops=
+
+AC_TRY_LINK([#include <stdio.h>],
+ [printf("Hello");],
+ [cf_rpath_oops=`"$cf_ldd_prog" "conftest$ac_exeext" | ${FGREP-fgrep} ' not found' | sed -e 's% =>.*$%%' |sort | uniq`
+ cf_rpath_list=`"$cf_ldd_prog" "conftest$ac_exeext" | ${FGREP-fgrep} / | sed -e 's%^.*[[ ]]/%/%' -e 's%/[[^/]][[^/]]*$%%' |sort | uniq`])
+
+ # If we passed the link-test, but get a "not found" on a given library,
+ # this could be due to inept reconfiguration of gcc to make it only
+ # partly honor /usr/local/lib (or whatever). Sometimes this behavior
+ # is intentional, e.g., installing gcc in /usr/bin and suppressing the
+ # /usr/local libraries.
+ if test -n "$cf_rpath_oops"
+ then
+ for cf_rpath_src in $cf_rpath_oops
+ do
+ for cf_rpath_dir in \
+ /usr/local \
+ /usr/pkg \
+ /opt/sfw
+ do
+ if test -f "$cf_rpath_dir/lib/$cf_rpath_src"
+ then
+ CF_VERBOSE(...adding -L$cf_rpath_dir/lib to LDFLAGS for $cf_rpath_src)
+ LDFLAGS="$LDFLAGS -L$cf_rpath_dir/lib"
+ break
+ fi
+ done
+ done
+ fi
+ fi
+
+ CF_VERBOSE(...checking EXTRA_LDFLAGS $EXTRA_LDFLAGS)
+
+ CF_RPATH_HACK_2(LDFLAGS)
+ CF_RPATH_HACK_2(LIBS)
+
+ CF_VERBOSE(...checked EXTRA_LDFLAGS $EXTRA_LDFLAGS)
+else
+ AC_MSG_RESULT(no)
+fi
+AC_SUBST(EXTRA_LDFLAGS)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_RPATH_HACK_2 version: 8 updated: 2021/01/01 13:31:04
+dnl ---------------
+dnl Do one set of substitutions for CF_RPATH_HACK, adding an rpath option to
+dnl EXTRA_LDFLAGS for each -L option found.
+dnl
+dnl $cf_rpath_list contains a list of directories to ignore.
+dnl
+dnl $1 = variable name to update. The LDFLAGS variable should be the only one,
+dnl but LIBS often has misplaced -L options.
+AC_DEFUN([CF_RPATH_HACK_2],
+[
+CF_VERBOSE(...checking $1 [$]$1)
+
+cf_rpath_dst=
+for cf_rpath_src in [$]$1
+do
+ case "$cf_rpath_src" in
+ (-L*)
+
+ # check if this refers to a directory which we will ignore
+ cf_rpath_skip=no
+ if test -n "$cf_rpath_list"
+ then
+ for cf_rpath_item in $cf_rpath_list
+ do
+ if test "x$cf_rpath_src" = "x-L$cf_rpath_item"
+ then
+ cf_rpath_skip=yes
+ break
+ fi
+ done
+ fi
+
+ if test "$cf_rpath_skip" = no
+ then
+ # transform the option
+ if test "$LD_RPATH_OPT" = "-R " ; then
+ cf_rpath_tmp=`echo "$cf_rpath_src" |sed -e "s%-L%-R %"`
+ else
+ cf_rpath_tmp=`echo "$cf_rpath_src" |sed -e "s%-L%$LD_RPATH_OPT%"`
+ fi
+
+ # if we have not already added this, add it now
+ cf_rpath_tst=`echo "$EXTRA_LDFLAGS" | sed -e "s%$cf_rpath_tmp %%"`
+ if test "x$cf_rpath_tst" = "x$EXTRA_LDFLAGS"
+ then
+ CF_VERBOSE(...Filter $cf_rpath_src ->$cf_rpath_tmp)
+ EXTRA_LDFLAGS="$cf_rpath_tmp $EXTRA_LDFLAGS"
+ fi
+ fi
+ ;;
+ esac
+ cf_rpath_dst="$cf_rpath_dst $cf_rpath_src"
+done
+$1=$cf_rpath_dst
+
+CF_VERBOSE(...checked $1 [$]$1)
+AC_SUBST(EXTRA_LDFLAGS)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_SAVE_XTRA_FLAGS version: 1 updated: 2020/01/11 16:46:44
+dnl ------------------
+dnl Use this macro to save CFLAGS/CPPFLAGS/LIBS before checks against X headers
+dnl and libraries which do not update those variables.
+dnl
+dnl $1 = name of current macro
+define([CF_SAVE_XTRA_FLAGS],
+[
+cf_save_LIBS_$1="$LIBS"
+cf_save_CFLAGS_$1="$CFLAGS"
+cf_save_CPPFLAGS_$1="$CPPFLAGS"
+LIBS="$LIBS ${X_PRE_LIBS} ${X_LIBS} ${X_EXTRA_LIBS}"
+for cf_X_CFLAGS in $X_CFLAGS
+do
+ case "x$cf_X_CFLAGS" in
+ x-[[IUD]]*)
+ CPPFLAGS="$CPPFLAGS $cf_X_CFLAGS"
+ ;;
+ *)
+ CFLAGS="$CFLAGS $cf_X_CFLAGS"
+ ;;
+ esac
+done
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_SET_ERRNO version: 7 updated: 2023/01/05 17:57:28
+dnl ------------
+dnl Check if 'errno' is declared in a fashion that lets us set it.
+AC_DEFUN([CF_SET_ERRNO],
+[
+AC_CACHE_CHECK(if we can set errno,cf_cv_set_errno,[
+AC_TRY_RUN([
+$ac_includes_default
+
+#include <errno.h>
+
+int main(void)
+{
+ errno = 255;
+ ${cf_cv_main_return:-return}(errno != 255);
+}],
+ [cf_cv_set_errno=yes],
+ [cf_cv_set_errno=no],
+ [AC_TRY_LINK(
+ [#include <errno.h>],
+ [errno = 255],
+ [cf_cv_set_errno=maybe],
+ [cf_cv_set_errno=no])])
+])
+test "$cf_cv_set_errno" != no && AC_DEFINE(CAN_SET_ERRNO,1,[Define to 1 if we can set errno])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_SIGWINCH version: 6 updated: 2021/01/01 13:31:04
+dnl -----------
+dnl Use this macro after CF_XOPEN_SOURCE, but do not require it (not all
+dnl programs need this test).
+dnl
+dnl This is really a Mac OS X 10.4.3 workaround. Defining _POSIX_C_SOURCE
+dnl forces SIGWINCH to be undefined (breaks xterm, ncurses). Oddly, the struct
+dnl winsize declaration is left alone - we may revisit this if Apple choose to
+dnl break that part of the interface as well.
+AC_DEFUN([CF_SIGWINCH],
+[
+AC_CACHE_CHECK(if SIGWINCH is defined,cf_cv_define_sigwinch,[
+ AC_TRY_COMPILE([
+#include <sys/types.h>
+#include <sys/signal.h>
+],[int x = SIGWINCH; (void)x],
+ [cf_cv_define_sigwinch=yes],
+ [AC_TRY_COMPILE([
+#undef _XOPEN_SOURCE
+#undef _POSIX_SOURCE
+#undef _POSIX_C_SOURCE
+#include <sys/types.h>
+#include <sys/signal.h>
+],[int x = SIGWINCH; (void)x],
+ [cf_cv_define_sigwinch=maybe],
+ [cf_cv_define_sigwinch=no])
+])
+])
+
+if test "$cf_cv_define_sigwinch" = maybe ; then
+AC_CACHE_CHECK(for actual SIGWINCH definition,cf_cv_fixup_sigwinch,[
+cf_cv_fixup_sigwinch=unknown
+cf_sigwinch=32
+while test "$cf_sigwinch" != 1
+do
+ AC_TRY_COMPILE([
+#undef _XOPEN_SOURCE
+#undef _POSIX_SOURCE
+#undef _POSIX_C_SOURCE
+#include <sys/types.h>
+#include <sys/signal.h>
+],[
+#if SIGWINCH != $cf_sigwinch
+make an error
+#endif
+int x = SIGWINCH; (void)x],
+ [cf_cv_fixup_sigwinch=$cf_sigwinch
+ break])
+
+cf_sigwinch="`expr "$cf_sigwinch" - 1`"
+done
+])
+
+ if test "$cf_cv_fixup_sigwinch" != unknown ; then
+ CPPFLAGS="$CPPFLAGS -DSIGWINCH=$cf_cv_fixup_sigwinch"
+ fi
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_SIZECHANGE version: 18 updated: 2021/09/04 06:35:04
+dnl -------------
+dnl Check for definitions & structures needed for window size-changing
+dnl
+dnl https://stackoverflow.com/questions/18878141/difference-between-structures-ttysize-and-winsize/50769952#50769952
+AC_DEFUN([CF_SIZECHANGE],
+[
+AC_REQUIRE([CF_STRUCT_TERMIOS])
+AC_CACHE_CHECK(declaration of size-change, cf_cv_sizechange,[
+ cf_cv_sizechange=unknown
+ cf_save_CPPFLAGS="$CPPFLAGS"
+
+for cf_opts in "" "NEED_PTEM_H"
+do
+
+ CPPFLAGS="$cf_save_CPPFLAGS"
+ if test -n "$cf_opts"
+ then
+ CF_APPEND_TEXT(CPPFLAGS,-D$cf_opts)
+ fi
+ AC_TRY_COMPILE([#include <sys/types.h>
+#ifdef HAVE_TERMIOS_H
+#include <termios.h>
+#else
+#ifdef HAVE_TERMIO_H
+#include <termio.h>
+#endif
+#endif
+
+#ifdef NEED_PTEM_H
+/* This is a workaround for SCO: they neglected to define struct winsize in
+ * termios.h -- it is only in termio.h and ptem.h
+ */
+#include <sys/stream.h>
+#include <sys/ptem.h>
+#endif
+
+#ifdef HAVE_SYS_IOCTL_H
+#include <sys/ioctl.h>
+#endif
+],[
+#ifdef TIOCGSIZE
+ struct ttysize win; /* SunOS 3.0... */
+ int y = win.ts_lines = 2;
+ int x = win.ts_cols = 1;
+ (void)y;
+ (void)x;
+#else
+#ifdef TIOCGWINSZ
+ struct winsize win; /* everything else */
+ int y = win.ws_row = 2;
+ int x = win.ws_col = 1;
+ (void)y;
+ (void)x;
+#else
+ no TIOCGSIZE or TIOCGWINSZ
+#endif /* TIOCGWINSZ */
+#endif /* TIOCGSIZE */
+ ],
+ [cf_cv_sizechange=yes],
+ [cf_cv_sizechange=no])
+
+ CPPFLAGS="$cf_save_CPPFLAGS"
+ if test "$cf_cv_sizechange" = yes ; then
+ echo "size-change succeeded ($cf_opts)" >&AC_FD_CC
+ test -n "$cf_opts" && cf_cv_sizechange="$cf_opts"
+ break
+ fi
+done
+])
+if test "$cf_cv_sizechange" != no ; then
+ AC_DEFINE(HAVE_SIZECHANGE,1,[Define to 1 if sizechange declarations are provided])
+ case "$cf_cv_sizechange" in
+ (NEED*)
+ AC_DEFINE_UNQUOTED($cf_cv_sizechange )
+ ;;
+ esac
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_SLANG_CPPFLAGS version: 13 updated: 2021/01/04 17:48:08
+dnl -----------------
+dnl Look for the slang header files in the standard places, adjusting the
+dnl CPPFLAGS variable.
+dnl
+dnl $1 = parameter to search for "slang2" class, e.g., for pkgsrc.
+AC_DEFUN([CF_SLANG_CPPFLAGS],
+[AC_REQUIRE([AC_PROG_EGREP])dnl
+
+AC_CACHE_CHECK(for $1 header file,cf_cv_$1_header,[
+ cf_cv_$1_header=no
+ AC_TRY_COMPILE([#include <slang.h>],
+ [printf("%s\\n", SLANG_VERSION)],
+ [cf_cv_$1_header=predefined],[
+ CF_HEADER_PATH(cf_search,$1)
+ for cf_incdir in $cf_search
+ do
+ for cf_header in \
+ slang.h
+ do
+ echo trying "$cf_incdir/$cf_header" 1>&AC_FD_CC
+ if ${EGREP-egrep} "SLANG_VERSION" "$cf_incdir/$cf_header" 1>&AC_FD_CC 2>&1; then
+ cf_cv_$1_header=$cf_incdir/$cf_header
+ break
+ fi
+ done
+ test "$cf_cv_$1_header" != no && break
+ done
+ ])])
+
+if test "x$cf_cv_$1_header" != xno
+then
+ AC_DEFINE(USE_SLANG,1,[Define to 1 if we should use s-lang library])
+
+ CF_DIRNAME(cf_incdir,$cf_cv_$1_header)
+
+ case "$cf_cv_$1_header" in
+ (predefined)
+ ;;
+ (*)
+ CF_ADD_INCDIR($cf_incdir)
+ ;;
+ esac
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_SLANG_LIBS version: 10 updated: 2021/01/02 09:31:20
+dnl -------------
+dnl Look for the slang library.
+dnl
+dnl $1 = the actual library name, usually "slang"
+AC_DEFUN([CF_SLANG_LIBS],
+[
+cf_slang_LIBS1="$LIBS"
+CF_TERMCAP_LIBS
+cf_slang_LIBS2="$LIBS"
+AC_CHECK_FUNC(acos,,[CF_RECHECK_FUNC(acos,m,LIBS)])
+case "$host_os" in
+(os2*)
+ CF_FIND_LIBRARY(video,video,
+ [#include <sys/video.h>],
+ [v_init()],
+ v_init)
+ ;;
+esac
+CF_FIND_LIBRARY($1,$1,
+ [#include <slang.h>],
+ [SLtt_get_screen_size()],
+ SLtt_get_screen_size)
+cf_slang_LIBS3="$LIBS"
+AC_MSG_CHECKING(if we can link $1 without termcap)
+if test -n "`echo "$cf_slang_LIBS1" | sed -e 's/ //g'`" ; then
+ cf_exclude=`echo ".$cf_slang_LIBS2" | sed -e "s%$cf_slang_LIBS1%%" -e 's%^.%%'`
+else
+ cf_exclude="$cf_slang_LIBS2"
+fi
+LIBS=`echo ".$cf_slang_LIBS3" | sed -e "s%$cf_exclude%%" -e 's%^.%%'`
+AC_TRY_LINK([#include <slang.h>],
+ [SLtt_get_screen_size()],
+ [cf_result=yes],
+ [cf_result=no])
+AC_MSG_RESULT($cf_result)
+test "$cf_result" = no && LIBS="$cf_slang_LIBS3"
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_SLANG_UNIX_DEFS version: 7 updated: 2021/01/02 09:31:20
+dnl ------------------
+dnl Slang's header files rely on some predefined symbols to declare variables
+dnl that we might find useful. This check is needed, because those symbols
+dnl are generally not available.
+AC_DEFUN([CF_SLANG_UNIX_DEFS],
+[
+
+CF_SLANG_CPPFLAGS(slang)
+if test "x$cf_cv_slang_header" != xno
+then
+ CF_SLANG_LIBS(slang)
+else
+ CF_SLANG_CPPFLAGS(slang2)
+ if test "x$cf_cv_slang2_header" != xno
+ then
+ CF_SLANG_LIBS(slang2)
+ else
+ AC_MSG_ERROR(cannot find slang headers)
+ fi
+fi
+
+# There's an unofficial set of patches for slang that gives it some limited
+# UTF8 capability. Unfortunately it won't compile unless one defines UTF8.
+AC_CACHE_CHECK(if we must define UTF8,cf_cv_slang_utf8,[
+ AC_TRY_COMPILE([#include <slang.h>],
+ [SLtt_get_screen_size()],
+ [cf_cv_slang_utf8=no],
+ [
+ AC_TRY_COMPILE([
+#define UTF8
+#include <slang.h>],
+ [SLtt_get_screen_size()],
+ [cf_cv_slang_utf8=yes],
+ [cf_cv_slang_utf8=unknown])])
+])
+
+if test "$cf_cv_slang_utf8" = yes ; then
+ AC_DEFINE(UTF8,1,[Define to 1 if we must define UTF-8 for s-lang headers])
+fi
+
+AC_CACHE_CHECK(if we must tell slang this is UNIX,cf_cv_slang_unix,[
+AC_TRY_LINK([#include <slang.h>],
+ [
+#ifdef REAL_UNIX_SYSTEM
+make an error
+#else
+extern int SLang_TT_Baud_Rate;
+SLang_TT_Baud_Rate = 1
+#endif
+],
+ [cf_cv_slang_unix=yes],
+ [cf_cv_slang_unix=no])
+])
+test "$cf_cv_slang_unix" = yes && AC_DEFINE(REAL_UNIX_SYSTEM,1,[Define to 1 if we must define REAL_UNIX_SYSTEM to compile with s-lang headers])
+
+CF_CHECK_TYPE(SLsmg_Color_Type,int,[#include <slang.h>])
+CF_CHECK_TYPE(SLtt_Char_Type,unsigned long,[#include <slang.h>])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_SOCKS version: 9 updated: 2012/11/08 20:57:52
+dnl --------
+dnl Check for socks library
+dnl $1 = the [optional] directory in which the library may be found
+AC_DEFUN([CF_SOCKS],[
+ CF_ADD_OPTIONAL_PATH($1, [socks library])
+ CF_FIND_LINKAGE([
+#include <stdio.h>
+],[
+ Raccept((char *)0)
+],
+ socks)
+
+ if test "x$cf_cv_find_linkage_socks" = "xyes" ; then
+ AC_DEFINE(SOCKS,1,[Define to 1 if we are using socks library])
+
+ AC_DEFINE(accept,Raccept,[Define to override function name if using socks library])
+ AC_DEFINE(bind,Rbind,[Define to override function name if using socks library])
+ AC_DEFINE(connect,Rconnect,[Define to override function name if using socks library])
+ AC_DEFINE(getpeername,Rgetpeername,[Define to override function name if using socks library])
+ AC_DEFINE(getsockname,Rgetsockname,[Define to override function name if using socks library])
+ AC_DEFINE(listen,Rlisten,[Define to override function name if using socks library])
+ AC_DEFINE(recvfrom,Rrecvfrom,[Define to override function name if using socks library])
+ AC_DEFINE(select,Rselect,[Define to override function name if using socks library])
+ else
+ AC_MSG_ERROR(cannot link with socks library)
+ fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_SOCKS5 version: 12 updated: 2012/11/08 20:57:52
+dnl ---------
+dnl Check for socks5 configuration
+dnl $1 = the [optional] directory in which the library may be found
+AC_DEFUN([CF_SOCKS5],[
+ CF_ADD_OPTIONAL_PATH($1, [socks5 library])
+
+CF_ADD_LIBS(-lsocks5)
+
+AC_DEFINE(USE_SOCKS5,1,[Define to 1 if we are using socks5 library])
+AC_DEFINE(SOCKS,1,[Define to 1 if we are using socks library])
+
+AC_MSG_CHECKING(if the socks library uses socks4 prefix)
+cf_use_socks4=error
+AC_TRY_LINK([
+#include <socks.h>],[
+ Rinit((char *)0)],
+ [AC_DEFINE(USE_SOCKS4_PREFIX,1,[Define to 1 if socks library uses socks4 prefix])
+ cf_use_socks4=yes],
+ [AC_TRY_LINK([#include <socks.h>],
+ [SOCKSinit((char *)0)],
+ [cf_use_socks4=no],
+ [AC_MSG_ERROR(Cannot link with socks5 library)])])
+AC_MSG_RESULT($cf_use_socks4)
+
+if test "$cf_use_socks4" = "yes" ; then
+ AC_DEFINE(accept,Raccept)
+ AC_DEFINE(bind,Rbind)
+ AC_DEFINE(connect,Rconnect)
+ AC_DEFINE(getpeername,Rgetpeername)
+ AC_DEFINE(getsockname,Rgetsockname)
+ AC_DEFINE(listen,Rlisten)
+ AC_DEFINE(recvfrom,Rrecvfrom)
+ AC_DEFINE(select,Rselect)
+else
+ AC_DEFINE(accept,SOCKSaccept)
+ AC_DEFINE(getpeername,SOCKSgetpeername)
+ AC_DEFINE(getsockname,SOCKSgetsockname)
+ AC_DEFINE(recvfrom,SOCKSrecvfrom)
+fi
+
+AC_MSG_CHECKING(if socks5p.h is available)
+AC_TRY_COMPILE([
+#define INCLUDE_PROTOTYPES
+#include <socks.h>],[
+ init((char *)0)],
+ [cf_use_socks5p_h=yes],
+ [cf_use_socks5p_h=no])
+AC_MSG_RESULT($cf_use_socks5p_h)
+
+test "$cf_use_socks5p_h" = yes && AC_DEFINE(INCLUDE_PROTOTYPES,1,[Define to 1 if needed to declare prototypes in socks headers])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_SRAND version: 17 updated: 2022/12/02 19:55:38
+dnl --------
+dnl Check for functions similar to srand() and rand(). lrand48() and random()
+dnl return a 31-bit value, while rand() returns a value less than RAND_MAX
+dnl which usually is only 16-bits.
+dnl
+dnl On MirOS, use arc4random_push() and arc4random().
+dnl Some systems support an asymmetric variation of this interface.
+dnl
+dnl $1 = optional prefix for resulting shell variables. The default "my_"
+dnl gives $my_srand and $my_rand to the caller, as well as MY_RAND_MAX.
+dnl These are all AC_SUBST'd and AC_DEFINE'd.
+AC_DEFUN([CF_SRAND],[
+AC_CACHE_CHECK(for random-integer functions, cf_cv_srand_func,[
+cf_cv_srand_func=unknown
+for cf_func in arc4random_push/arc4random arc4random_stir/arc4random srandom/random srand48/lrand48 srand/rand
+do
+ CF_SRAND_PARSE($cf_func,cf_srand_func,cf_rand_func)
+
+AC_TRY_LINK([
+$ac_includes_default
+#ifdef HAVE_LIMITS_H
+#include <limits.h>
+#endif
+],[long seed = 1; $cf_srand_func(seed); seed = $cf_rand_func(); (void)seed],
+[cf_cv_srand_func=$cf_func
+ break])
+done
+])
+if test "$cf_cv_srand_func" != unknown ; then
+ AC_CACHE_CHECK(for range of random-integers, cf_cv_rand_max,[
+ case "$cf_cv_srand_func" in
+ (srand/rand)
+ cf_cv_rand_max=RAND_MAX
+ cf_rand_max=16
+ ;;
+ (*/arc4random)
+ cf_cv_rand_max=0xFFFFFFFFUL
+ cf_rand_max=32
+ ;;
+ (*)
+ cf_cv_rand_max=INT_MAX
+ cf_rand_max=31
+ ;;
+ esac
+ AC_TRY_COMPILE([
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#ifdef HAVE_LIMITS_H
+#include <limits.h>
+#endif
+ ],[long x = $cf_cv_rand_max; (void)x],,
+ [cf_cv_rand_max="(1UL<<$cf_rand_max)-1"])
+ ])
+
+ case "$cf_cv_srand_func" in
+ (*/arc4random)
+ AC_MSG_CHECKING(if <bsd/stdlib.h> should be included)
+ AC_TRY_COMPILE([#include <bsd/stdlib.h>],
+ [void *arc4random(int);
+ void *x = arc4random(1); (void)x],
+ [cf_bsd_stdlib_h=no],
+ [AC_TRY_COMPILE([#include <bsd/stdlib.h>],
+ [unsigned x = arc4random(); (void)x],
+ [cf_bsd_stdlib_h=yes],
+ [cf_bsd_stdlib_h=no])])
+ AC_MSG_RESULT($cf_bsd_stdlib_h)
+ if test "$cf_bsd_stdlib_h" = yes
+ then
+ AC_DEFINE(HAVE_BSD_STDLIB_H,1,[Define to 1 if bsd/stdlib.h header should be used])
+ else
+ AC_MSG_CHECKING(if <bsd/random.h> should be included)
+ AC_TRY_COMPILE([#include <bsd/random.h>],
+ [void *arc4random(int);
+ void *x = arc4random(1); (void)x],
+ [cf_bsd_random_h=no],
+ [AC_TRY_COMPILE([#include <bsd/random.h>],
+ [unsigned x = arc4random(); (void)x],
+ [cf_bsd_random_h=yes],
+ [cf_bsd_random_h=no])])
+ AC_MSG_RESULT($cf_bsd_random_h)
+ if test "$cf_bsd_random_h" = yes
+ then
+ AC_DEFINE(HAVE_BSD_RANDOM_H,1,[Define to 1 if bsd/random.h header should be used])
+ else
+ AC_MSG_WARN(no header file found for arc4random)
+ fi
+ fi
+ ;;
+ esac
+
+ CF_SRAND_PARSE($cf_func,cf_srand_func,cf_rand_func)
+
+ CF_UPPER(cf_rand_max,ifelse($1,,my_,$1)rand_max)
+ AC_DEFINE_UNQUOTED(ifelse($1,,my_,$1)srand,$cf_srand_func,[Define to the name for the srand function])
+ AC_DEFINE_UNQUOTED(ifelse($1,,my_,$1)rand, $cf_rand_func,[Define to the name for the rand function])
+ AC_DEFINE_UNQUOTED([$]cf_rand_max, $cf_cv_rand_max,[Define to the name for the RAND_MAX constant])
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_SRAND_PARSE version: 2 updated: 2015/04/15 19:08:48
+dnl --------------
+dnl Parse the loop variable for CF_SRAND, with a workaround for asymmetric
+dnl variations.
+define([CF_SRAND_PARSE],[
+ $2=`echo $1 | sed -e 's%/.*%%'`
+ $3=`echo $1 | sed -e 's%.*/%%'`
+
+ case [$]$2 in
+ (arc4random_stir)
+ $2='(void)'
+ ;;
+ esac
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_SSL version: 26 updated: 2021/01/02 09:31:20
+dnl ------
+dnl Check for ssl library
+dnl $1 = [optional] directory in which the library may be found, set by AC_ARG_WITH
+AC_DEFUN([CF_SSL],[
+ AC_REQUIRE([CF_PKG_CONFIG])
+ cf_cv_have_ssl=no
+ cf_cv_pkg_config_ssl=no
+
+ # command-line option, etc., override default behavior
+ CF_ADD_OPTIONAL_PATH($1, [ssl library])
+
+ if test "x$PKG_CONFIG" != xnone; then
+ case "$1" in
+ (no)
+ ;;
+ (yes) # if no explicit directory given, try pkg-config
+ cf_cv_pkg_ssl=
+ for cf_try_package in openssl libssl
+ do
+ AC_MSG_CHECKING(pkg-config for $cf_try_package)
+ if "$PKG_CONFIG" --exists $cf_try_package ; then
+ cf_cv_pkg_ssl=$cf_try_package
+ AC_MSG_RESULT(yes)
+ break
+ else
+ AC_MSG_RESULT(no)
+ fi
+ done
+ if test -n "$cf_cv_pkg_ssl" ; then
+ cf_cv_have_ssl=yes
+ cf_cv_pkg_config_ssl=yes
+
+ cf_cflags_ssl=`$PKG_CONFIG --cflags $cf_cv_pkg_ssl`
+ cf_libs_ssl=`$PKG_CONFIG --libs $cf_cv_pkg_ssl`
+
+ if test -n "$cf_cflags_ssl" ; then
+ case "$cf_cflags_ssl" in
+ (*-I*)
+ cf_cv_header_path_ssl=`echo "$cf_cflags_ssl" | sed -e 's/^.*-I//' -e 's/ .*//'`
+ ;;
+ (*)
+ cf_cv_header_path_ssl=/usr/include
+ ;;
+ esac
+ CF_ADD_CFLAGS($cf_cflags_ssl)
+
+ # workaround for broken openssl package using kerberos
+ case "$cf_cflags_ssl" in
+ (*kerberos*)
+ cf_cv_have_ssl=maybe
+ ;;
+ esac
+ else
+ cf_cv_header_path_ssl=/usr/include
+ fi
+
+ if test -d "$cf_cv_header_path_ssl/openssl" ; then
+ cf_cv_header_path_ssl=$cf_cv_header_path_ssl/openssl
+ fi
+
+ if test -n "$cf_libs_ssl" ; then
+ case "x$cf_libs_ssl" in
+ (*-L*)
+ cf_cv_library_path_ssl=`echo "$cf_libs_ssl" | sed -e 's/^.*-L//' -e 's/ .*//'`
+ ;;
+ (*)
+ cf_cv_library_path_ssl=/usr/lib
+ ;;
+ esac
+ CF_VERBOSE(adding $cf_libs_ssl to LIBS)
+ CF_ADD_LIBS($cf_libs_ssl)
+ fi
+ fi
+ ;;
+ esac
+ fi
+
+ if test "$cf_cv_have_ssl" != yes; then
+ case "$host_os" in
+ (mingw*)
+ cf_extra_ssl_libs="-lcrypto -lgdi32"
+ ;;
+ (*)
+ # openssl 0.9.6 and up use dynamic loading for engines.
+ cf_extra_ssl_libs="-lcrypto"
+ case "x$LIBS" in
+ (*-ldl)
+ ;;
+ (*)
+ AC_CHECK_LIB(dl,dlsym,
+ [cf_extra_ssl_libs="$cf_extra_ssl_libs -ldl"])
+ ;;
+ esac
+ ;;
+ esac
+
+ CF_FIND_LINKAGE(CF__SSL_HEAD,
+ CF__SSL_BODY,
+ ssl,
+ cf_cv_have_ssl=yes,
+ cf_cv_have_ssl=no,
+ openssl,
+ $cf_extra_ssl_libs)
+
+ if test "$cf_cv_pkg_config_ssl" != yes ; then
+ if test "$cf_cv_have_ssl" = yes ; then
+ if test -n "$cf_cv_library_path_ssl" ; then
+ CF_ADD_LIBDIR($cf_cv_library_path_ssl)
+ fi
+ CF_ADD_LIBS(-lssl $cf_extra_ssl_libs)
+ if test -n "$cf_cv_header_path_ssl" ; then
+ case "$cf_cv_header_path_ssl" in
+ (/usr/include/openssl)
+ ;;
+ (*)
+ CF_ADD_INCDIR($cf_cv_header_path_ssl)
+ ;;
+ esac
+ fi
+ fi
+ fi
+ fi
+
+ if test "$cf_cv_have_ssl" = yes ; then
+ AC_DEFINE(USE_SSL,1,[Define to 1 if we are using SSL])
+ if test -n "$cf_cv_header_path_ssl" ; then
+ CF_VERBOSE(checking ssl header-path $cf_cv_header_path_ssl)
+ case "$cf_cv_header_path_ssl" in
+ (*/openssl)
+ AC_DEFINE(USE_OPENSSL_INCL,1,[Define to 1 if we are using OpenSSL headers])
+ ;;
+ esac
+ fi
+ CF_CHECK_SSL_X509
+ fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_STRIP_G_OPT version: 4 updated: 2021/01/02 09:31:20
+dnl --------------
+dnl Remove "-g" option from the compiler options
+AC_DEFUN([CF_STRIP_G_OPT],
+[$1=`echo "${$1}" | CF__SED_TRIMBLANKS(-e 's%-g %%' -e 's%-g$%%')`])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_STRIP_O_OPT version: 4 updated: 2021/01/02 09:31:20
+dnl --------------
+dnl Remove "-O" option from the compiler options
+AC_DEFUN([CF_STRIP_O_OPT],[
+$1=`echo "${$1}" | CF__SED_TRIMBLANKS(-e 's%-O[[1-9]]\? %%' -e 's%-O[[1-9]]\?$%%')`
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_STRUCT_TERMIOS version: 11 updated: 2020/03/19 20:46:13
+dnl -----------------
+dnl Some machines require _POSIX_SOURCE to completely define struct termios.
+AC_DEFUN([CF_STRUCT_TERMIOS],[
+AC_REQUIRE([CF_XOPEN_SOURCE])
+
+AC_CHECK_HEADERS( \
+termio.h \
+termios.h \
+unistd.h \
+sys/ioctl.h \
+sys/termio.h \
+)
+
+if test "$ac_cv_header_termios_h" = yes ; then
+ case "$CFLAGS $CPPFLAGS" in
+ (*-D_POSIX_SOURCE*)
+ termios_bad=dunno ;;
+ (*) termios_bad=maybe ;;
+ esac
+ if test "$termios_bad" = maybe ; then
+ AC_MSG_CHECKING(whether termios.h needs _POSIX_SOURCE)
+ AC_TRY_COMPILE([#include <termios.h>],
+ [struct termios foo; int x = foo.c_iflag = 1; (void)x],
+ termios_bad=no, [
+ AC_TRY_COMPILE([
+#define _POSIX_SOURCE
+#include <termios.h>],
+ [struct termios foo; int x = foo.c_iflag = 2; (void)x],
+ termios_bad=unknown,
+ termios_bad=yes AC_DEFINE(_POSIX_SOURCE,1,[Define to 1 if we must define _POSIX_SOURCE]))
+ ])
+ AC_MSG_RESULT($termios_bad)
+ fi
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_SUBDIR_PATH version: 7 updated: 2014/12/04 04:33:06
+dnl --------------
+dnl Construct a search-list for a nonstandard header/lib-file
+dnl $1 = the variable to return as result
+dnl $2 = the package name
+dnl $3 = the subdirectory, e.g., bin, include or lib
+AC_DEFUN([CF_SUBDIR_PATH],
+[
+$1=
+
+CF_ADD_SUBDIR_PATH($1,$2,$3,$prefix,NONE)
+
+for cf_subdir_prefix in \
+ /usr \
+ /usr/local \
+ /usr/pkg \
+ /opt \
+ /opt/local \
+ [$]HOME
+do
+ CF_ADD_SUBDIR_PATH($1,$2,$3,$cf_subdir_prefix,$prefix)
+done
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_SYSTEM_MAIL_FLAGS version: 6 updated: 2021/01/02 09:31:20
+dnl --------------------
+AC_DEFUN([CF_SYSTEM_MAIL_FLAGS],
+[
+AC_MSG_CHECKING([system mail flags])
+AC_CACHE_VAL(cf_cv_system_mail_flags,[
+ case "$cf_cv_SYSTEM_MAIL" in
+ (*/mmdf/*)
+ [cf_cv_system_mail_flags="-mlruxto,cc\\\\*"]
+ ;;
+ (*)
+ [cf_cv_system_mail_flags="-t -oi"]
+ esac
+ ])
+AC_MSG_RESULT($cf_cv_system_mail_flags)
+AC_DEFINE_UNQUOTED(SYSTEM_MAIL_FLAGS, "$cf_cv_system_mail_flags",[Define to value used for system mail-flags])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_SYSV_UTMP version: 7 updated: 2021/01/02 09:31:20
+dnl ------------
+dnl Check if this is a SYSV flavor of UTMP
+AC_DEFUN([CF_SYSV_UTMP],
+[
+AC_CACHE_CHECK(if $cf_cv_have_utmp is SYSV flavor,cf_cv_sysv_utmp,[
+test "$cf_cv_have_utmp" = "utmp" && cf_prefix="ut" || cf_prefix="utx"
+AC_TRY_LINK([
+#include <sys/types.h>
+#include <${cf_cv_have_utmp}.h>],[
+struct $cf_cv_have_utmp x;
+ set${cf_prefix}ent ();
+ get${cf_prefix}id(&x);
+ put${cf_prefix}line(&x);
+ end${cf_prefix}ent();],
+ [cf_cv_sysv_utmp=yes],
+ [cf_cv_sysv_utmp=no])
+])
+test "$cf_cv_sysv_utmp" = yes && AC_DEFINE(USE_SYSV_UTMP,1,[Define to 1 if utmp is SYSV flavor])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_SYS_ERRLIST version: 6 updated: 2001/12/30 13:03:23
+dnl --------------
+dnl Check for declaration of sys_nerr and sys_errlist in one of stdio.h and
+dnl errno.h. Declaration of sys_errlist on BSD4.4 interferes with our
+dnl declaration. Reported by Keith Bostic.
+AC_DEFUN([CF_SYS_ERRLIST],
+[
+ CF_CHECK_ERRNO(sys_nerr)
+ CF_CHECK_ERRNO(sys_errlist)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_TAR_OPTIONS version: 3 updated: 2015/04/15 19:08:48
+dnl --------------
+dnl This is just a list of the most common tar options, allowing for variants
+dnl that can operate with the "-" standard input/output option.
+AC_DEFUN([CF_TAR_OPTIONS],
+[
+case ifelse($1,,tar,$1) in
+(*pax|*pax$EXEEXT)
+ TAR_UP_OPTIONS="-w"
+ TAR_DOWN_OPTIONS="-r"
+ TAR_PIPE_OPTIONS=""
+ TAR_FILE_OPTIONS="-f"
+ ;;
+(*star|*star$EXEEXT)
+ TAR_UP_OPTIONS="-c -f"
+ TAR_DOWN_OPTIONS="-x -U -f"
+ TAR_PIPE_OPTIONS="-"
+ TAR_FILE_OPTIONS=""
+ ;;
+(*tar|*tar$EXEEXT)
+ # FIXME: some versions of tar require, some don't allow the "-"
+ TAR_UP_OPTIONS="-cf"
+ TAR_DOWN_OPTIONS="-xf"
+ TAR_PIPE_OPTIONS="-"
+ TAR_FILE_OPTIONS=""
+ ;;
+esac
+
+AC_SUBST(TAR_UP_OPTIONS)
+AC_SUBST(TAR_DOWN_OPTIONS)
+AC_SUBST(TAR_FILE_OPTIONS)
+AC_SUBST(TAR_PIPE_OPTIONS)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_TERMCAP_LIBS version: 17 updated: 2022/12/21 19:42:05
+dnl ---------------
+dnl Look for termcap libraries, or the equivalent in terminfo.
+dnl
+dnl The optional parameter may be "ncurses", "ncursesw".
+AC_DEFUN([CF_TERMCAP_LIBS],
+[
+AC_CACHE_VAL(cf_cv_termlib,[
+cf_cv_termlib=none
+AC_TRY_LINK(
+ [extern char *tgoto(const char*,int,int);],
+ [char *x=tgoto("",0,0); (void)x;],
+[AC_TRY_LINK(
+ [extern char *tigetstr(const char *);],
+ [char *x=tigetstr(""); (void)x;],
+ [cf_cv_termlib=terminfo],
+ [cf_cv_termlib=termcap])
+ CF_VERBOSE(using functions in predefined $cf_cv_termlib LIBS)
+],[
+ifelse([$1],,,[
+case "$1" in
+(ncurses*)
+ CF_NCURSES_CONFIG($1)
+ cf_cv_termlib=terminfo
+ ;;
+esac
+])
+if test "$cf_cv_termlib" = none; then
+ # FreeBSD's linker gives bogus results for AC_CHECK_LIB, saying that
+ # tgetstr lives in -lcurses when it is only an unsatisfied extern.
+ cf_save_LIBS="$LIBS"
+ for cf_lib in tinfo curses ncurses termlib termcap
+ do
+ LIBS="-l$cf_lib $cf_save_LIBS"
+ for cf_func in tigetstr tgetstr
+ do
+ AC_MSG_CHECKING(for $cf_func in -l$cf_lib)
+ AC_TRY_LINK(
+ [extern char *$cf_func(const char *);],
+ [int x=$cf_func(""); (void)x],
+ [cf_result=yes],
+ [cf_result=no])
+ AC_MSG_RESULT($cf_result)
+ if test "$cf_result" = yes ; then
+ if test "$cf_func" = tigetstr ; then
+ cf_cv_termlib=terminfo
+ else
+ cf_cv_termlib=termcap
+ fi
+ break
+ fi
+ done
+ test "$cf_result" = yes && break
+ done
+ test "$cf_result" = no && LIBS="$cf_save_LIBS"
+fi
+if test "$cf_cv_termlib" = none; then
+ # allow curses library for broken AIX system.
+ AC_CHECK_LIB(curses, initscr, [CF_ADD_LIBS(-lcurses)])
+ AC_CHECK_LIB(termcap, tgoto, [CF_ADD_LIBS(-ltermcap) cf_cv_termlib=termcap])
+fi
+])
+if test "$cf_cv_termlib" = none; then
+ AC_MSG_WARN([Cannot find -ltermlib, -lcurses, or -ltermcap])
+fi
+])])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_TERMIO_AND_CURSES version: 7 updated: 2022/12/02 19:55:38
+dnl --------------------
+dnl Check if including termio.h with <curses.h> dies like on sysv68
+dnl
+dnl $1 = application header which must include <stdio.h>
+dnl $2 = optional, defaulting to config.h
+dnl
+dnl FIXME: CPPFLAGS is Lynx-specific.
+AC_DEFUN([CF_TERMIO_AND_CURSES],
+[
+AC_CACHE_CHECK(if we can include termio.h with curses,cf_cv_termio_and_curses,[
+ cf_save_CFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS -DHAVE_CONFIG_H -I. -I${srcdir:-.} -I${srcdir:-.}/src -I${srcdir:-.}/WWW/Library/Implementation"
+ touch ifelse([$2],,config.h,[$2])
+ AC_TRY_COMPILE([
+#include <$1>
+#include <termio.h>],
+ [putchar(0x0a)],
+ [cf_cv_termio_and_curses=yes],
+ [cf_cv_termio_and_curses=no])
+ CPPFLAGS="$cf_save_CFLAGS"
+ rm -f ifelse([$2],,config.h,[$2])
+])
+
+test "$cf_cv_termio_and_curses" = yes && AC_DEFINE(TERMIO_AND_CURSES,1,[Define to 1 if we can include termio.h with curses.h])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_TERMIO_AND_TERMIOS version: 5 updated: 2022/12/02 19:55:38
+dnl ---------------------
+dnl Check if including both termio.h and termios.h die like on DG.UX
+AC_DEFUN([CF_TERMIO_AND_TERMIOS],
+[
+AC_MSG_CHECKING([termio.h and termios.h])
+AC_CACHE_VAL(cf_cv_termio_and_termios,[
+ AC_TRY_COMPILE([
+#include <stdio.h>
+#if HAVE_TERMIO_H
+#include <termio.h>
+#endif
+#if HAVE_TERMIOS_H
+#include <termios.h>
+#endif ],
+ [putchar (0x0a)],
+ [cf_cv_termio_and_termios=yes],
+ [cf_cv_termio_and_termios=no])])
+AC_MSG_RESULT($cf_cv_termio_and_termios)
+test "$cf_cv_termio_and_termios" = no && AC_DEFINE(TERMIO_AND_TERMIOS,1,[Define to 1 if we can include termio.h and termios.h])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_TERM_HEADER version: 6 updated: 2021/01/02 09:31:20
+dnl --------------
+dnl Look for term.h, which is part of X/Open curses. It defines the interface
+dnl to terminfo database. Usually it is in the same include-path as curses.h,
+dnl but some packagers change this, breaking various applications.
+AC_DEFUN([CF_TERM_HEADER],[
+AC_CACHE_CHECK(for terminfo header, cf_cv_term_header,[
+case "${cf_cv_ncurses_header}" in
+(*/ncurses.h|*/ncursesw.h)
+ cf_term_header=`echo "$cf_cv_ncurses_header" | sed -e 's%ncurses[[^.]]*\.h$%term.h%'`
+ ;;
+(*)
+ cf_term_header=term.h
+ ;;
+esac
+
+for cf_test in $cf_term_header "ncurses/term.h" "ncursesw/term.h"
+do
+AC_TRY_COMPILE([#include <stdio.h>
+#include <${cf_cv_ncurses_header:-curses.h}>
+#include <$cf_test>
+],[int x = auto_left_margin; (void)x],[
+ cf_cv_term_header="$cf_test"],[
+ cf_cv_term_header=unknown
+ ])
+ test "$cf_cv_term_header" != unknown && break
+done
+])
+
+# Set definitions to allow ifdef'ing to accommodate subdirectories
+
+case "$cf_cv_term_header" in
+(*term.h)
+ AC_DEFINE(HAVE_TERM_H,1,[Define to 1 if we have term.h])
+ ;;
+esac
+
+case "$cf_cv_term_header" in
+(ncurses/term.h)
+ AC_DEFINE(HAVE_NCURSES_TERM_H,1,[Define to 1 if we have ncurses/term.h])
+ ;;
+(ncursesw/term.h)
+ AC_DEFINE(HAVE_NCURSESW_TERM_H,1,[Define to 1 if we have ncursesw/term.h])
+ ;;
+esac
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_TM_GMTOFF version: 5 updated: 2021/06/08 18:08:14
+dnl ------------
+dnl Check if the tm-struct defines the '.tm_gmtoff' member (useful in decoding
+dnl dates).
+AC_DEFUN([CF_TM_GMTOFF],
+[
+AC_MSG_CHECKING([for tm.tm_gmtoff])
+AC_CACHE_VAL(cf_cv_tm_gmtoff,[
+ AC_TRY_COMPILE([
+#ifdef TIME_WITH_SYS_TIME
+# include <sys/time.h>
+# include <time.h>
+#else
+# ifdef HAVE_SYS_TIME_H
+# include <sys/time.h>
+# else
+# include <time.h>
+# endif
+#endif
+],[
+ static struct tm foo;
+ long bar = foo.tm_gmtoff; (void) bar],
+ [cf_cv_tm_gmtoff=yes],
+ [cf_cv_tm_gmtoff=no])])
+AC_MSG_RESULT($cf_cv_tm_gmtoff)
+test "$cf_cv_tm_gmtoff" = no && AC_DEFINE(DONT_HAVE_TM_GMTOFF,1,[Define to 1 if the tm-struct defines .tm_gmtoff member])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_TRIM_X_LIBS version: 3 updated: 2015/04/12 15:39:00
+dnl --------------
+dnl Trim extra base X libraries added as a workaround for inconsistent library
+dnl dependencies returned by "new" pkg-config files.
+AC_DEFUN([CF_TRIM_X_LIBS],[
+ for cf_trim_lib in Xmu Xt X11
+ do
+ case "$LIBS" in
+ (*-l$cf_trim_lib\ *-l$cf_trim_lib*)
+ LIBS=`echo "$LIBS " | sed -e 's/ / /g' -e 's%-l'"$cf_trim_lib"' %%' -e 's/ $//'`
+ CF_VERBOSE(..trimmed $LIBS)
+ ;;
+ esac
+ done
+])
+dnl ---------------------------------------------------------------------------
+dnl CF_TRY_PKG_CONFIG version: 6 updated: 2020/12/31 10:54:15
+dnl -----------------
+dnl This is a simple wrapper to use for pkg-config, for libraries which may be
+dnl available in that form.
+dnl
+dnl $1 = package name, which may be a shell variable
+dnl $2 = extra logic to use, if any, after updating CFLAGS and LIBS
+dnl $3 = logic to use if pkg-config does not have the package
+AC_DEFUN([CF_TRY_PKG_CONFIG],[
+AC_REQUIRE([CF_PKG_CONFIG])
+
+if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists "$1"; then
+ CF_VERBOSE(found package $1)
+ cf_pkgconfig_incs="`$PKG_CONFIG --cflags "$1" 2>/dev/null`"
+ cf_pkgconfig_libs="`$PKG_CONFIG --libs "$1" 2>/dev/null`"
+ CF_VERBOSE(package $1 CFLAGS: $cf_pkgconfig_incs)
+ CF_VERBOSE(package $1 LIBS: $cf_pkgconfig_libs)
+ CF_ADD_CFLAGS($cf_pkgconfig_incs)
+ CF_ADD_LIBS($cf_pkgconfig_libs)
+ ifelse([$2],,:,[$2])
+else
+ cf_pkgconfig_incs=
+ cf_pkgconfig_libs=
+ ifelse([$3],,:,[$3])
+fi
+])
+dnl ---------------------------------------------------------------------------
+dnl CF_TRY_RPATH version: 2 updated: 2021/01/02 09:31:20
+dnl ------------
+dnl Work around broken-by-design packaging systems which solve at most the
+dnl problem of building packages, without providing for library reuse...
+AC_DEFUN([CF_TRY_RPATH],[
+AC_REQUIRE([CF_LD_RPATH_OPT])
+if test -z "$LD_RPATH_OPT"
+then
+ CF_VERBOSE(will not attempt to use rpath)
+elif test "x${enable_rpath_hack:-yes}" = "xno"
+then
+ CF_VERBOSE(rpath is disabled)
+elif test -z "${LD_RUN_PATH}${LD_LIBRARY_PATH}"
+then
+ case "$LIBS" in
+ (*-L/*)
+ CF__CHECK_RUN(cf_check_run)
+ if test "x$cf_check_run" = xno
+ then
+ CF_VERBOSE(linkage is broken)
+ cf_result=
+ for cf_item in $LIBS
+ do
+ case " $cf_item" in
+ (\ -L/*)
+ cf_rpath_arg=`echo " $cf_item" | sed -e "s% -L%$LD_RPATH_OPT%"`
+ cf_rpath_tmp=`echo "$cf_result " | sed -e "s% $cf_rpath_arg % %"`
+ if test "x$cf_result " = "x$cf_rpath_tmp"
+ then
+ cf_result="$cf_result $cf_rpath_arg"
+ fi
+ cf_rpath_tmp=`echo "$cf_result " | sed -e "s% $cf_item % %g"`
+ if test "x$cf_result " != "x$cf_rpath_tmp"
+ then
+ continue
+ fi
+ ;;
+ esac
+ cf_result="$cf_result $cf_item"
+ done
+ cf_result=`echo "$cf_result" | sed -e 's/^ //'`
+ if test "x$cf_result" != "x$LIBS"
+ then
+ cf_save_LIBS="$LIBS"
+ LIBS="$cf_result"
+ CF__CHECK_RUN(cf_check_run)
+ if test "x$cf_check_run" = "xyes"
+ then
+ CF_VERBOSE(use rpath for $cf_save_LIBS)
+ LIBS="$cf_result"
+ CF_VERBOSE(result is now $LIBS)
+ else
+ LIBS="$cf_save_LIBS"
+ fi
+ fi
+ fi
+ ;;
+ (*)
+ CF_VERBOSE(will not attempt to use rpath)
+ ;;
+ esac
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_TRY_XOPEN_SOURCE version: 4 updated: 2022/09/10 15:16:16
+dnl -------------------
+dnl If _XOPEN_SOURCE is not defined in the compile environment, check if we
+dnl can define it successfully.
+AC_DEFUN([CF_TRY_XOPEN_SOURCE],[
+AC_CACHE_CHECK(if we should define _XOPEN_SOURCE,cf_cv_xopen_source,[
+ AC_TRY_COMPILE(CF__XOPEN_SOURCE_HEAD,CF__XOPEN_SOURCE_BODY,
+ [cf_cv_xopen_source=no],
+ [cf_save="$CPPFLAGS"
+ CF_APPEND_TEXT(CPPFLAGS,-D_XOPEN_SOURCE=$cf_XOPEN_SOURCE)
+ AC_TRY_COMPILE(CF__XOPEN_SOURCE_HEAD,CF__XOPEN_SOURCE_BODY,
+ [cf_cv_xopen_source=no],
+ [cf_cv_xopen_source=$cf_XOPEN_SOURCE])
+ CPPFLAGS="$cf_save"
+ ])
+])
+
+if test "$cf_cv_xopen_source" != no ; then
+ CF_REMOVE_DEFINE(CFLAGS,$CFLAGS,_XOPEN_SOURCE)
+ CF_REMOVE_DEFINE(CPPFLAGS,$CPPFLAGS,_XOPEN_SOURCE)
+ cf_temp_xopen_source="-D_XOPEN_SOURCE=$cf_cv_xopen_source"
+ CF_APPEND_CFLAGS($cf_temp_xopen_source)
+fi
+])
+dnl ---------------------------------------------------------------------------
+dnl CF_TTYTYPE version: 7 updated: 2021/01/02 09:31:20
+dnl ----------
+AC_DEFUN([CF_TTYTYPE],
+[
+AC_MSG_CHECKING(if ttytype is declared in curses library)
+AC_CACHE_VAL(cf_cv_have_ttytype,[
+ AC_TRY_LINK([#include <${cf_cv_ncurses_header:-curses.h}>],
+ [char *x = &ttytype[1]; *x = 1],
+ [cf_cv_have_ttytype=yes],
+ [cf_cv_have_ttytype=no])
+ ])
+AC_MSG_RESULT($cf_cv_have_ttytype)
+test "$cf_cv_have_ttytype" = yes && AC_DEFINE(HAVE_TTYTYPE,1,[Define to 1 if ttytype is declared in curses library])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_TYPE_LONG_LONG version: 5 updated: 2021/01/04 17:48:08
+dnl -----------------
+dnl Check for long long type.
+AC_DEFUN([CF_TYPE_LONG_LONG],[
+AC_REQUIRE([AC_PROG_FGREP])dnl
+
+AC_CACHE_CHECK(for long long type,cf_cv_type_long_long,[
+ cat >conftest.$ac_ext <<_CFEOF
+#include "confdefs.h"
+int
+main (void)
+{
+ long long foo = 123456789123456789LL;
+ return (foo == 0);
+}
+_CFEOF
+ (eval "[$]ac_compile") 2>conftest.err
+ ac_status=$?
+ if test "$ac_status" = 0 && test -s conftest.err
+ then
+ ${FGREP-fgrep} warning conftest.err >/dev/null 2>&1 && ac_status=1
+ fi
+ if test "$ac_status" != 0
+ then
+ cf_cv_type_long_long=no
+ else
+ cf_cv_type_long_long=yes
+ fi
+ test -s conftest.err && cat conftest.err >&5
+ rm -f conftest*
+])
+
+if test "$cf_cv_type_long_long" = yes ; then
+ AC_DEFINE(HAVE_LONG_LONG,1,[Define to 1 if compiler supports long long type])
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_UNION_WAIT version: 9 updated: 2021/06/08 18:08:14
+dnl -------------
+dnl Check to see if the BSD-style union wait is declared. Some platforms may
+dnl use this, though it is deprecated in favor of the 'int' type in Posix.
+dnl Some vendors provide a bogus implementation that declares union wait, but
+dnl uses the 'int' type instead; we try to spot these by checking for the
+dnl associated macros.
+dnl
+dnl Ahem. Some implementers cast the status value to an int*, as an attempt to
+dnl use the macros for either union wait or int. So we do a check compile to
+dnl see if the macros are defined and apply to an int.
+dnl
+dnl Sets: $cf_cv_type_unionwait
+dnl Defines: HAVE_TYPE_UNIONWAIT
+AC_DEFUN([CF_UNION_WAIT],
+[
+AC_REQUIRE([CF_WAIT_HEADERS])
+AC_MSG_CHECKING([for union wait])
+AC_CACHE_VAL(cf_cv_type_unionwait,[
+ AC_TRY_LINK($cf_wait_headers,
+ [static int x;
+ int y = WEXITSTATUS(x);
+ int z = WTERMSIG(x);
+ wait(&x);
+ (void)x;
+ (void)y;
+ (void)z;
+ ],
+ [cf_cv_type_unionwait=no
+ echo compiles ok w/o union wait 1>&AC_FD_CC
+ ],[
+ AC_TRY_LINK($cf_wait_headers,
+ [union wait x;
+#ifdef WEXITSTATUS
+ int y = WEXITSTATUS(x);
+#endif
+#ifdef WTERMSIG
+ int z = WTERMSIG(x);
+#endif
+ wait(&x);
+ (void)x;
+#ifdef WEXITSTATUS
+ (void)y;
+#endif
+#ifdef WTERMSIG
+ (void)z;
+#endif
+ ],
+ [cf_cv_type_unionwait=yes
+ echo compiles ok with union wait and possibly macros too 1>&AC_FD_CC
+ ],
+ [cf_cv_type_unionwait=no])])])
+AC_MSG_RESULT($cf_cv_type_unionwait)
+test "$cf_cv_type_unionwait" = yes && AC_DEFINE(HAVE_TYPE_UNIONWAIT,1,[Define to 1 if type unionwait is declared])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_UPPER version: 5 updated: 2001/01/29 23:40:59
+dnl --------
+dnl Make an uppercase version of a variable
+dnl $1=uppercase($2)
+AC_DEFUN([CF_UPPER],
+[
+$1=`echo "$2" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_UTF8_LIB version: 9 updated: 2021/05/19 19:35:25
+dnl -----------
+dnl Check for multibyte support, and if not found, utf8 compatibility library
+AC_DEFUN([CF_UTF8_LIB],
+[
+AC_HAVE_HEADERS(wchar.h)
+AC_CACHE_CHECK(for multibyte character support,cf_cv_utf8_lib,[
+ cf_save_LIBS="$LIBS"
+ AC_TRY_LINK([
+#include <stdlib.h>
+#include <stdio.h>
+#ifdef HAVE_WCHAR_H
+#include <wchar.h>
+#endif
+],[putwc(0,0);],
+ [cf_cv_utf8_lib=yes],
+ [CF_FIND_LINKAGE([
+#include <libutf8.h>],[putwc(0,0);],utf8,
+ [cf_cv_utf8_lib=add-on],
+ [cf_cv_utf8_lib=no])
+])])
+
+# HAVE_LIBUTF8_H is used by ncurses if curses.h is shared between
+# ncurses/ncursesw:
+if test "$cf_cv_utf8_lib" = "add-on" ; then
+ AC_DEFINE(HAVE_LIBUTF8_H,1,[Define to 1 if we should include libutf8.h])
+ CF_ADD_INCDIR($cf_cv_header_path_utf8)
+ CF_ADD_LIBDIR($cf_cv_library_path_utf8)
+ CF_ADD_LIBS($cf_cv_library_file_utf8)
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_UTMP version: 12 updated: 2021/01/02 09:31:20
+dnl -------
+dnl Check for UTMP/UTMPX headers
+AC_DEFUN([CF_UTMP],
+[
+AC_REQUIRE([CF_LASTLOG])
+
+AC_CACHE_CHECK(for utmp implementation,cf_cv_have_utmp,[
+ cf_cv_have_utmp=no
+for cf_header in utmpx utmp ; do
+cf_utmp_includes="
+#include <sys/types.h>
+#include <${cf_header}.h>
+#define getutent getutxent
+#ifdef USE_LASTLOG
+#include <lastlog.h> /* may conflict with utmpx.h on Linux */
+#endif
+"
+ AC_TRY_COMPILE([$cf_utmp_includes],
+ [struct $cf_header x;
+ char *name = x.ut_name; /* utmp.h and compatible definitions */
+ (void)x;
+ (void)name;
+ ],
+ [cf_cv_have_utmp=$cf_header
+ break],
+ [
+ AC_TRY_COMPILE([$cf_utmp_includes],
+ [struct $cf_header x;
+ char *name = x.ut_user; /* utmpx.h must declare this */
+ (void)x;
+ (void)name;
+ ],
+ [cf_cv_have_utmp=$cf_header
+ break
+ ])])
+done
+])
+
+if test "$cf_cv_have_utmp" != no ; then
+ AC_DEFINE(HAVE_UTMP,1,[Define to 1 if the utmp interface is available])
+ test "$cf_cv_have_utmp" = utmpx && AC_DEFINE(UTMPX_FOR_UTMP,1,[Define if we have utmpx interface])
+ CF_UTMP_UT_HOST
+ CF_UTMP_UT_SYSLEN
+ CF_UTMP_UT_NAME
+ CF_UTMP_UT_XSTATUS
+ CF_UTMP_UT_XTIME
+ CF_UTMP_UT_SESSION
+ CF_SYSV_UTMP
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_UTMP_UT_HOST version: 10 updated: 2021/01/02 09:31:20
+dnl ---------------
+dnl Check if UTMP/UTMPX struct defines ut_host member
+AC_DEFUN([CF_UTMP_UT_HOST],
+[
+if test "$cf_cv_have_utmp" != no ; then
+AC_MSG_CHECKING(if ${cf_cv_have_utmp}.ut_host is declared)
+AC_CACHE_VAL(cf_cv_have_utmp_ut_host,[
+ AC_TRY_COMPILE([
+#include <sys/types.h>
+#include <${cf_cv_have_utmp}.h>],
+ [struct $cf_cv_have_utmp x;
+ char *y = &x.ut_host[0];
+ (void)x;
+ (void)y],
+ [cf_cv_have_utmp_ut_host=yes],
+ [cf_cv_have_utmp_ut_host=no])
+ ])
+AC_MSG_RESULT($cf_cv_have_utmp_ut_host)
+test "$cf_cv_have_utmp_ut_host" != no && AC_DEFINE(HAVE_UTMP_UT_HOST,1,[Define to 1 if UTMP/UTMPX struct defines ut_host member])
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_UTMP_UT_NAME version: 8 updated: 2021/01/02 09:31:20
+dnl ---------------
+dnl Check if UTMP/UTMPX struct defines ut_name member
+AC_DEFUN([CF_UTMP_UT_NAME],
+[
+if test "$cf_cv_have_utmp" != no ; then
+AC_CACHE_CHECK(if ${cf_cv_have_utmp}.ut_name is declared,cf_cv_have_utmp_ut_name,[
+ cf_cv_have_utmp_ut_name=no
+cf_utmp_includes="
+#include <sys/types.h>
+#include <${cf_cv_have_utmp}.h>
+#define getutent getutxent
+#ifdef USE_LASTLOG
+#include <lastlog.h> /* may conflict with utmpx.h on Linux */
+#endif
+"
+for cf_header in ut_name ut_user ; do
+ AC_TRY_COMPILE([$cf_utmp_includes],
+ [struct $cf_cv_have_utmp x;
+ char *name = x.$cf_header;
+ (void)x;
+ (void)name;
+ ],
+ [cf_cv_have_utmp_ut_name=$cf_header
+ break])
+done
+])
+
+case "$cf_cv_have_utmp_ut_name" in
+(no)
+ AC_MSG_ERROR(Cannot find declaration for ut.ut_name)
+ ;;
+(ut_user)
+ AC_DEFINE(ut_name,ut_user,[Define to rename UTMP/UTMPX struct ut_name member])
+ ;;
+esac
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_UTMP_UT_SESSION version: 9 updated: 2021/06/07 17:39:17
+dnl ------------------
+dnl Check if UTMP/UTMPX struct defines ut_session member
+AC_DEFUN([CF_UTMP_UT_SESSION],
+[
+if test "$cf_cv_have_utmp" != no ; then
+AC_CACHE_CHECK(if ${cf_cv_have_utmp}.ut_session is declared, cf_cv_have_utmp_ut_session,[
+ AC_TRY_COMPILE([
+#include <sys/types.h>
+#include <${cf_cv_have_utmp}.h>],
+ [static struct $cf_cv_have_utmp x;
+ long y = x.ut_session;
+ (void)x;
+ (void)y],
+ [cf_cv_have_utmp_ut_session=yes],
+ [cf_cv_have_utmp_ut_session=no])
+])
+if test "$cf_cv_have_utmp_ut_session" != no ; then
+ AC_DEFINE(HAVE_UTMP_UT_SESSION,1,[Define to 1 if UTMP/UTMPX struct defines ut_session member])
+fi
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_UTMP_UT_SYSLEN version: 4 updated: 2021/01/02 09:31:20
+dnl -----------------
+dnl Check if UTMP/UTMPX struct defines ut_syslen member
+AC_DEFUN([CF_UTMP_UT_SYSLEN],
+[
+if test "$cf_cv_have_utmp" != no ; then
+AC_MSG_CHECKING(if ${cf_cv_have_utmp}.ut_syslen is declared)
+AC_CACHE_VAL(cf_cv_have_utmp_ut_syslen,[
+ AC_TRY_COMPILE([
+#include <sys/types.h>
+#include <${cf_cv_have_utmp}.h>],
+ [struct $cf_cv_have_utmp x;
+ int y = x.ut_syslen;
+ (void)x;
+ (void)y],
+ [cf_cv_have_utmp_ut_syslen=yes],
+ [cf_cv_have_utmp_ut_syslen=no])
+ ])
+AC_MSG_RESULT($cf_cv_have_utmp_ut_syslen)
+test "$cf_cv_have_utmp_ut_syslen" != no && AC_DEFINE(HAVE_UTMP_UT_SYSLEN,1,[Define to 1 if UTMP/UTMPX struct defines ut_syslen member])
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_UTMP_UT_XSTATUS version: 6 updated: 2021/01/02 09:31:20
+dnl ------------------
+dnl Check for known variants on the UTMP/UTMPX struct's exit-status as reported
+dnl by various people:
+dnl
+dnl ut_exit.__e_exit (HPUX 11 - David Ellement, also in glibc2)
+dnl ut_exit.e_exit (SVR4)
+dnl ut_exit.ut_e_exit (os390 - Greg Smith)
+dnl ut_exit.ut_exit (Tru64 4.0f - Jeremie Petit, 4.0e - Tomas Vanhala)
+dnl
+dnl Note: utmp_xstatus is not a conventional compatibility definition in the
+dnl system header files.
+AC_DEFUN([CF_UTMP_UT_XSTATUS],
+[
+if test "$cf_cv_have_utmp" != no ; then
+AC_CACHE_CHECK(for exit-status in $cf_cv_have_utmp,cf_cv_have_utmp_ut_xstatus,[
+for cf_result in \
+ ut_exit.__e_exit \
+ ut_exit.e_exit \
+ ut_exit.ut_e_exit \
+ ut_exit.ut_exit
+do
+AC_TRY_COMPILE([
+#include <sys/types.h>
+#include <${cf_cv_have_utmp}.h>],
+ [struct $cf_cv_have_utmp x;
+ long y = x.$cf_result = 0;
+ (void)x;
+ (void)y],
+ [cf_cv_have_utmp_ut_xstatus=$cf_result
+ break],
+ [cf_cv_have_utmp_ut_xstatus=no])
+done
+])
+if test "$cf_cv_have_utmp_ut_xstatus" != no ; then
+ AC_DEFINE(HAVE_UTMP_UT_XSTATUS,1,[Define to 1 if UTMP/UTMPX has exit-status member])
+ AC_DEFINE_UNQUOTED(ut_xstatus,$cf_cv_have_utmp_ut_xstatus,[Define if needed to rename member ut_xstatus of UTMP/UTMPX])
+fi
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_UTMP_UT_XTIME version: 11 updated: 2021/01/02 09:31:20
+dnl ----------------
+dnl Check if UTMP/UTMPX struct defines ut_xtime member
+AC_DEFUN([CF_UTMP_UT_XTIME],
+[
+if test "$cf_cv_have_utmp" != no ; then
+AC_CACHE_CHECK(if ${cf_cv_have_utmp}.ut_xtime is declared, cf_cv_have_utmp_ut_xtime,[
+ AC_TRY_COMPILE([
+#include <sys/types.h>
+#include <${cf_cv_have_utmp}.h>],
+ [struct $cf_cv_have_utmp x;
+ long y = x.ut_xtime = 0;
+ (void)x;
+ (void)y],
+ [cf_cv_have_utmp_ut_xtime=yes],
+ [AC_TRY_COMPILE([
+#include <sys/types.h>
+#include <${cf_cv_have_utmp}.h>],
+ [struct $cf_cv_have_utmp x;
+ long y = x.ut_tv.tv_sec;
+ (void)x;
+ (void)y],
+ [cf_cv_have_utmp_ut_xtime=define],
+ [cf_cv_have_utmp_ut_xtime=no])
+ ])
+])
+if test "$cf_cv_have_utmp_ut_xtime" != no ; then
+ AC_DEFINE(HAVE_UTMP_UT_XTIME,1,[Define to 1 if UTMP/UTMPX struct defines ut_xtime member])
+ if test "$cf_cv_have_utmp_ut_xtime" = define ; then
+ AC_DEFINE(ut_xtime,ut_tv.tv_sec,[Define if needed to alternate name for utmpx.ut_xtime member])
+ fi
+fi
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_VERBOSE version: 3 updated: 2007/07/29 09:55:12
+dnl ----------
+dnl Use AC_VERBOSE w/o the warnings
+AC_DEFUN([CF_VERBOSE],
+[test -n "$verbose" && echo " $1" 1>&AC_FD_MSG
+CF_MSG_LOG([$1])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_WAIT_HEADERS version: 3 updated: 2021/01/02 09:31:20
+dnl ---------------
+dnl Build up an expression $cf_wait_headers with the header files needed to
+dnl compile against the prototypes for 'wait()', 'waitpid()', etc. Assume it's
+dnl Posix, which uses <sys/types.h> and <sys/wait.h>, but allow SVr4 variation
+dnl with <wait.h>.
+AC_DEFUN([CF_WAIT_HEADERS],
+[
+AC_HAVE_HEADERS(sys/wait.h)
+cf_wait_headers="#include <sys/types.h>
+"
+if test "$ac_cv_header_sys_wait_h" = yes; then
+cf_wait_headers="$cf_wait_headers
+#include <sys/wait.h>
+"
+else
+AC_HAVE_HEADERS(wait.h)
+AC_HAVE_HEADERS(waitstatus.h)
+if test "$ac_cv_header_wait_h" = yes; then
+cf_wait_headers="$cf_wait_headers
+#include <wait.h>
+"
+fi
+if test "$ac_cv_header_waitstatus_h" = yes; then
+cf_wait_headers="$cf_wait_headers
+#include <waitstatus.h>
+"
+fi
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_WIDEC_CURSES version: 6 updated: 2020/03/19 20:23:48
+dnl ---------------
+dnl Check for curses implementations that can handle wide-characters
+AC_DEFUN([CF_WIDEC_CURSES],
+[
+AC_CACHE_CHECK(if curses supports wide characters,cf_cv_widec_curses,[
+AC_TRY_LINK([
+#include <stdlib.h>
+#include <${cf_cv_ncurses_header:-curses.h}>],[
+ wchar_t temp[2];
+ wchar_t wch = 'A';
+ temp[0] = wch;
+ waddnwstr(stdscr, temp, 1);
+],
+[cf_cv_widec_curses=yes],
+[cf_cv_widec_curses=no])
+])
+
+if test "$cf_cv_widec_curses" = yes ; then
+ AC_DEFINE(WIDEC_CURSES,1,[Define to 1 if curses supports wide characters])
+
+ # This is needed on Tru64 5.0 to declare mbstate_t
+ AC_CACHE_CHECK(if we must include wchar.h to declare mbstate_t,cf_cv_widec_mbstate,[
+ AC_TRY_COMPILE([
+#include <stdlib.h>
+#include <${cf_cv_ncurses_header:-curses.h}>],
+[mbstate_t state; (void)state],
+[cf_cv_widec_mbstate=no],
+[AC_TRY_COMPILE([
+#include <stdlib.h>
+#include <wchar.h>
+#include <${cf_cv_ncurses_header:-curses.h}>],
+[mbstate_t state; (void)state],
+[cf_cv_widec_mbstate=yes],
+[cf_cv_widec_mbstate=unknown])])])
+
+if test "$cf_cv_widec_mbstate" = yes ; then
+ AC_DEFINE(NEED_WCHAR_H,1,[Define to 1 if we must include wchar.h])
+fi
+
+if test "$cf_cv_widec_mbstate" != unknown ; then
+ AC_DEFINE(HAVE_MBSTATE_T,1,[Define to 1 if we have mbstate_t type])
+fi
+
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_WITH_BROTLI version: 1 updated: 2022/03/17 15:59:12
+dnl --------------
+dnl Check for Brotli decoder library
+dnl
+dnl $1 = optional path for headers/library
+AC_DEFUN([CF_WITH_BROTLI],[
+ CF_ADD_OPTIONAL_PATH($1)
+
+ CF_FIND_LINKAGE([
+#include <brotli/decode.h>
+],[
+ BrotliDecoderDecompressStream(
+ NULL, /* BrotliDecoderState* state */
+ NULL, /* size_t* available_in */
+ NULL, /* const uint8_t** next_in */
+ NULL, /* size_t* available_out */
+ NULL, /* uint8_t** next_out */
+ NULL /* size_t* total_out */
+ );
+],brotlidec,,,brotlilib)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_WITH_BZLIB version: 4 updated: 2007/07/29 13:19:54
+dnl -------------
+dnl Check for libbz2 aka "bzlib"
+dnl
+dnl $1 = optional path for headers/library
+AC_DEFUN([CF_WITH_BZLIB],[
+ CF_ADD_OPTIONAL_PATH($1)
+
+ CF_FIND_LINKAGE([
+#include <stdio.h>
+#include <bzlib.h>
+],[
+ BZ2_bzopen("name","mode")
+],bz2,,,bzlib)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_WITH_CURSES_DIR version: 4 updated: 2021/01/02 19:22:58
+dnl ------------------
+dnl Wrapper for AC_ARG_WITH to specify directory under which to look for curses
+dnl libraries.
+AC_DEFUN([CF_WITH_CURSES_DIR],[
+
+AC_MSG_CHECKING(for specific curses-directory)
+AC_ARG_WITH(curses-dir,
+ [ --with-curses-dir=DIR directory in which (n)curses is installed],
+ [cf_cv_curses_dir=$withval],
+ [cf_cv_curses_dir=no])
+AC_MSG_RESULT($cf_cv_curses_dir)
+
+if test -n "$cf_cv_curses_dir" && test "$cf_cv_curses_dir" != "no"
+then
+ CF_PATH_SYNTAX(withval)
+ if test -d "$cf_cv_curses_dir"
+ then
+ CF_ADD_INCDIR($cf_cv_curses_dir/include)
+ CF_ADD_LIBDIR($cf_cv_curses_dir/lib)
+ fi
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_WITH_DBMALLOC version: 7 updated: 2010/06/21 17:26:47
+dnl ----------------
+dnl Configure-option for dbmalloc. The optional parameter is used to override
+dnl the updating of $LIBS, e.g., to avoid conflict with subsequent tests.
+AC_DEFUN([CF_WITH_DBMALLOC],[
+CF_NO_LEAKS_OPTION(dbmalloc,
+ [ --with-dbmalloc test: use Conor Cahill's dbmalloc library],
+ [USE_DBMALLOC])
+
+if test "$with_dbmalloc" = yes ; then
+ AC_CHECK_HEADER(dbmalloc.h,
+ [AC_CHECK_LIB(dbmalloc,[debug_malloc]ifelse([$1],,[],[,$1]))])
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_WITH_DMALLOC version: 7 updated: 2010/06/21 17:26:47
+dnl ---------------
+dnl Configure-option for dmalloc. The optional parameter is used to override
+dnl the updating of $LIBS, e.g., to avoid conflict with subsequent tests.
+AC_DEFUN([CF_WITH_DMALLOC],[
+CF_NO_LEAKS_OPTION(dmalloc,
+ [ --with-dmalloc test: use Gray Watson's dmalloc library],
+ [USE_DMALLOC])
+
+if test "$with_dmalloc" = yes ; then
+ AC_CHECK_HEADER(dmalloc.h,
+ [AC_CHECK_LIB(dmalloc,[dmalloc_debug]ifelse([$1],,[],[,$1]))])
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_WITH_IDNA version: 11 updated: 2021/07/05 09:09:42
+dnl ------------
+dnl Check for libidn2, use it if found. Otherwise, check for libidn, use that.
+dnl
+dnl $1 = optional path for headers/library
+AC_DEFUN([CF_WITH_IDNA],[
+CF_ADD_OPTIONAL_PATH($1)
+
+CF_FIND_LINKAGE([
+#include <stdio.h>
+#include <idn2.h>
+],[
+ char *output = 0;
+ int code = idn2_to_ascii_8z("name", &output, IDN2_USE_STD3_ASCII_RULES);
+ (void) code;
+],idn2,,[CF_VERBOSE([unsuccessful, will try idn (older)])],,[$LIBICONV])
+
+if test "x$cf_cv_find_linkage_idn2" = xyes ; then
+ CF_VERBOSE(found idn2 library)
+ AC_DEFINE(USE_IDN2,1,[Define to 1 if we should use IDN2 library])
+else
+ CF_FIND_LINKAGE([
+#include <stdio.h>
+#include <idna.h>
+],[
+ char *output = 0;
+ int code = idna_to_ascii_8z("name", &output, IDNA_USE_STD3_ASCII_RULES);
+ (void) code;
+],idn,,,,[$LIBICONV])
+
+if test "x$cf_cv_find_linkage_idn" = xyes ; then
+ CF_VERBOSE(found idn library)
+ AC_DEFINE(USE_IDNA,1,[Define to 1 if we should use IDNA library])
+fi
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_WITH_PATH version: 12 updated: 2021/09/04 06:35:04
+dnl ------------
+dnl Wrapper for AC_ARG_WITH to ensure that user supplies a pathname, not just
+dnl defaulting to yes/no.
+dnl
+dnl $1 = option name
+dnl $2 = help-text
+dnl $3 = environment variable to set
+dnl $4 = default value, shown in the help-message, must be a constant
+dnl $5 = default value, if it is an expression & cannot be in the help-message
+dnl
+AC_DEFUN([CF_WITH_PATH],
+[AC_ARG_WITH($1,[$2 ](default: ifelse([$4],,empty,[$4])),,
+ifelse([$4],,[withval="${$3}"],[withval="${$3:-ifelse([$5],,[$4],[$5])}"]))dnl
+if ifelse([$5],,true,[test -n "$5"]) ; then
+CF_PATH_SYNTAX(withval)
+fi
+eval $3="$withval"
+AC_SUBST($3)dnl
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_WITH_SCREEN_PDCURSES version: 1 updated: 2020/08/28 16:56:27
+dnl -----------------------
+dnl Call this macro before CF_ENABLE_WARNINGS for configure scripts which use
+dnl the "--with-screen=pdcurses" selection. Doing that allows the configure
+dnl script to search for the X11/Xt header files to declare (or not) the
+dnl symbol needed to enable "const" in those header files. If that configure
+dnl option is not used, then those checks are unnecessary.
+AC_DEFUN([CF_WITH_SCREEN_PDCURSES],[
+AC_PROVIDE([AC_PATH_XTRA])
+AC_PROVIDE([AC_PATH_X])
+if test -n "$with_screen" && test "x$with_screen" = "xpdcurses"
+then
+ AC_PATH_X
+ AC_PATH_XTRA
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_WITH_ZLIB version: 4 updated: 2011/05/28 12:10:58
+dnl ------------
+dnl check for libz aka "zlib"
+AC_DEFUN([CF_WITH_ZLIB],[
+ CF_ADD_OPTIONAL_PATH($1)
+
+ CF_FIND_LINKAGE([
+#include <zlib.h>
+],[
+ gzopen("name","mode")
+],z,,,zlib)
+
+AC_CHECK_FUNCS( \
+ zError \
+)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_XOPEN_CURSES version: 17 updated: 2021/07/10 12:22:27
+dnl ---------------
+dnl Test if we should define X/Open source for curses, needed on Digital Unix
+dnl 4.x, to see the extended functions, but breaks on IRIX 6.x.
+dnl
+dnl The getbegyx() check is needed for HPUX, which omits legacy macros such
+dnl as getbegy(). The latter is better design, but the former is standard.
+AC_DEFUN([CF_XOPEN_CURSES],
+[
+AC_REQUIRE([CF_CURSES_CPPFLAGS])dnl
+AC_CACHE_CHECK(definition to turn on extended curses functions,cf_cv_need_xopen_extension,[
+cf_cv_need_xopen_extension=unknown
+AC_TRY_LINK([
+#include <stdlib.h>
+#include <${cf_cv_ncurses_header:-curses.h}>],[
+#if defined(NCURSES_VERSION_PATCH)
+#if (NCURSES_VERSION_PATCH < 20100501) && (NCURSES_VERSION_PATCH >= 20100403)
+ make an error
+#endif
+#endif
+#ifdef NCURSES_WIDECHAR
+make an error /* prefer to fall-through on the second checks */
+#endif
+ cchar_t check;
+ int check2 = curs_set((int)sizeof(check));
+ long x = winnstr(stdscr, "", 0);
+ int x1, y1;
+ (void)check2;
+ getbegyx(stdscr, y1, x1);
+ (void)x;
+ (void)y1;
+ (void)x1;
+ ],
+ [cf_cv_need_xopen_extension=none],
+ [
+ for cf_try_xopen_extension in _XOPEN_SOURCE_EXTENDED NCURSES_WIDECHAR
+ do
+ AC_TRY_LINK([
+#define $cf_try_xopen_extension 1
+#include <stdlib.h>
+#include <${cf_cv_ncurses_header:-curses.h}>],[
+ cchar_t check;
+ int check2 = curs_set((int)sizeof(check));
+ long x = winnstr(stdscr, "", 0);
+ int x1, y1;
+ getbegyx(stdscr, y1, x1);
+ (void)check2;
+ (void)x;
+ (void)y1;
+ (void)x1;
+ ],
+ [cf_cv_need_xopen_extension=$cf_try_xopen_extension; break])
+ done
+ ])
+])
+
+case "$cf_cv_need_xopen_extension" in
+(*_*)
+ CF_APPEND_TEXT(CPPFLAGS,-D$cf_cv_need_xopen_extension)
+ ;;
+esac
+
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_XOPEN_SOURCE version: 63 updated: 2022/12/29 10:10:26
+dnl ---------------
+dnl Try to get _XOPEN_SOURCE defined properly that we can use POSIX functions,
+dnl or adapt to the vendor's definitions to get equivalent functionality,
+dnl without losing the common non-POSIX features.
+dnl
+dnl Parameters:
+dnl $1 is the nominal value for _XOPEN_SOURCE
+dnl $2 is the nominal value for _POSIX_C_SOURCE
+AC_DEFUN([CF_XOPEN_SOURCE],[
+AC_REQUIRE([AC_CANONICAL_HOST])
+AC_REQUIRE([CF_POSIX_VISIBLE])
+
+if test "$cf_cv_posix_visible" = no; then
+
+cf_XOPEN_SOURCE=ifelse([$1],,500,[$1])
+cf_POSIX_C_SOURCE=ifelse([$2],,199506L,[$2])
+cf_xopen_source=
+
+case "$host_os" in
+(aix[[4-7]]*)
+ cf_xopen_source="-D_ALL_SOURCE"
+ ;;
+(msys)
+ cf_XOPEN_SOURCE=600
+ ;;
+(darwin[[0-8]].*)
+ cf_xopen_source="-D_APPLE_C_SOURCE"
+ ;;
+(darwin*)
+ cf_xopen_source="-D_DARWIN_C_SOURCE"
+ cf_XOPEN_SOURCE=
+ ;;
+(freebsd*|dragonfly*|midnightbsd*)
+ # 5.x headers associate
+ # _XOPEN_SOURCE=600 with _POSIX_C_SOURCE=200112L
+ # _XOPEN_SOURCE=500 with _POSIX_C_SOURCE=199506L
+ cf_POSIX_C_SOURCE=200112L
+ cf_XOPEN_SOURCE=600
+ cf_xopen_source="-D_BSD_TYPES -D__BSD_VISIBLE -D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE -D_XOPEN_SOURCE=$cf_XOPEN_SOURCE"
+ ;;
+(hpux11*)
+ cf_xopen_source="-D_HPUX_SOURCE -D_XOPEN_SOURCE=500"
+ ;;
+(hpux*)
+ cf_xopen_source="-D_HPUX_SOURCE"
+ ;;
+(irix[[56]].*)
+ cf_xopen_source="-D_SGI_SOURCE"
+ cf_XOPEN_SOURCE=
+ ;;
+(linux*gnu|linux*gnuabi64|linux*gnuabin32|linux*gnueabi|linux*gnueabihf|linux*gnux32|uclinux*|gnu*|mint*|k*bsd*-gnu|cygwin)
+ CF_GNU_SOURCE($cf_XOPEN_SOURCE)
+ ;;
+(minix*)
+ cf_xopen_source="-D_NETBSD_SOURCE" # POSIX.1-2001 features are ifdef'd with this...
+ ;;
+(mirbsd*)
+ # setting _XOPEN_SOURCE or _POSIX_SOURCE breaks <sys/select.h> and other headers which use u_int / u_short types
+ cf_XOPEN_SOURCE=
+ CF_POSIX_C_SOURCE($cf_POSIX_C_SOURCE)
+ ;;
+(netbsd*)
+ cf_xopen_source="-D_NETBSD_SOURCE" # setting _XOPEN_SOURCE breaks IPv6 for lynx on NetBSD 1.6, breaks xterm, is not needed for ncursesw
+ ;;
+(openbsd[[6-9]]*)
+ # OpenBSD 6.x has broken locale support, both compile-time and runtime.
+ # see https://www.mail-archive.com/bugs@openbsd.org/msg13200.html
+ # Abusing the conformance level is a workaround.
+ AC_MSG_WARN(this system does not provide usable locale support)
+ cf_xopen_source="-D_BSD_SOURCE"
+ cf_XOPEN_SOURCE=700
+ ;;
+(openbsd[[4-5]]*)
+ # setting _XOPEN_SOURCE lower than 500 breaks g++ compile with wchar.h, needed for ncursesw
+ cf_xopen_source="-D_BSD_SOURCE"
+ cf_XOPEN_SOURCE=600
+ ;;
+(openbsd*)
+ # setting _XOPEN_SOURCE breaks xterm on OpenBSD 2.8, is not needed for ncursesw
+ ;;
+(osf[[45]]*)
+ cf_xopen_source="-D_OSF_SOURCE"
+ ;;
+(nto-qnx*)
+ cf_xopen_source="-D_QNX_SOURCE"
+ ;;
+(sco*)
+ # setting _XOPEN_SOURCE breaks Lynx on SCO Unix / OpenServer
+ ;;
+(solaris2.*)
+ cf_xopen_source="-D__EXTENSIONS__"
+ cf_cv_xopen_source=broken
+ ;;
+(sysv4.2uw2.*) # Novell/SCO UnixWare 2.x (tested on 2.1.2)
+ cf_XOPEN_SOURCE=
+ cf_POSIX_C_SOURCE=
+ ;;
+(*)
+ CF_TRY_XOPEN_SOURCE
+ cf_save_xopen_cppflags="$CPPFLAGS"
+ CF_POSIX_C_SOURCE($cf_POSIX_C_SOURCE)
+ # Some of these niche implementations use copy/paste, double-check...
+ if test "$cf_cv_xopen_source" != no ; then
+ CF_VERBOSE(checking if _POSIX_C_SOURCE inteferes)
+ AC_TRY_COMPILE(CF__XOPEN_SOURCE_HEAD,CF__XOPEN_SOURCE_BODY,,[
+ AC_MSG_WARN(_POSIX_C_SOURCE definition is not usable)
+ CPPFLAGS="$cf_save_xopen_cppflags"])
+ fi
+ ;;
+esac
+
+if test -n "$cf_xopen_source" ; then
+ CF_APPEND_CFLAGS($cf_xopen_source,true)
+fi
+
+dnl In anything but the default case, we may have system-specific setting
+dnl which is still not guaranteed to provide all of the entrypoints that
+dnl _XOPEN_SOURCE would yield.
+if test -n "$cf_XOPEN_SOURCE" && test -z "$cf_cv_xopen_source" ; then
+ AC_MSG_CHECKING(if _XOPEN_SOURCE really is set)
+ AC_TRY_COMPILE([#include <stdlib.h>],[
+#ifndef _XOPEN_SOURCE
+make an error
+#endif],
+ [cf_XOPEN_SOURCE_set=yes],
+ [cf_XOPEN_SOURCE_set=no])
+ AC_MSG_RESULT($cf_XOPEN_SOURCE_set)
+ if test "$cf_XOPEN_SOURCE_set" = yes
+ then
+ AC_TRY_COMPILE([#include <stdlib.h>],[
+#if (_XOPEN_SOURCE - 0) < $cf_XOPEN_SOURCE
+make an error
+#endif],
+ [cf_XOPEN_SOURCE_set_ok=yes],
+ [cf_XOPEN_SOURCE_set_ok=no])
+ if test "$cf_XOPEN_SOURCE_set_ok" = no
+ then
+ AC_MSG_WARN(_XOPEN_SOURCE is lower than requested)
+ fi
+ else
+ CF_TRY_XOPEN_SOURCE
+ fi
+fi
+fi # cf_cv_posix_visible
+])
+dnl ---------------------------------------------------------------------------
+dnl CF_X_ATHENA version: 24 updated: 2020/03/10 18:53:47
+dnl -----------
+dnl Check for Xaw (Athena) libraries
+dnl
+dnl Sets $cf_x_athena according to the flavor of Xaw which is used.
+AC_DEFUN([CF_X_ATHENA],
+[
+cf_x_athena=${cf_x_athena:-Xaw}
+
+AC_MSG_CHECKING(if you want to link with Xaw 3d library)
+withval=
+AC_ARG_WITH(Xaw3d,
+ [ --with-Xaw3d link with Xaw 3d library])
+if test "$withval" = yes ; then
+ cf_x_athena=Xaw3d
+ AC_MSG_RESULT(yes)
+else
+ AC_MSG_RESULT(no)
+fi
+
+AC_MSG_CHECKING(if you want to link with Xaw 3d xft library)
+withval=
+AC_ARG_WITH(Xaw3dxft,
+ [ --with-Xaw3dxft link with Xaw 3d xft library])
+if test "$withval" = yes ; then
+ cf_x_athena=Xaw3dxft
+ AC_MSG_RESULT(yes)
+else
+ AC_MSG_RESULT(no)
+fi
+
+AC_MSG_CHECKING(if you want to link with neXT Athena library)
+withval=
+AC_ARG_WITH(neXtaw,
+ [ --with-neXtaw link with neXT Athena library])
+if test "$withval" = yes ; then
+ cf_x_athena=neXtaw
+ AC_MSG_RESULT(yes)
+else
+ AC_MSG_RESULT(no)
+fi
+
+AC_MSG_CHECKING(if you want to link with Athena-Plus library)
+withval=
+AC_ARG_WITH(XawPlus,
+ [ --with-XawPlus link with Athena-Plus library])
+if test "$withval" = yes ; then
+ cf_x_athena=XawPlus
+ AC_MSG_RESULT(yes)
+else
+ AC_MSG_RESULT(no)
+fi
+
+cf_x_athena_lib=""
+
+if test "$PKG_CONFIG" != none ; then
+ cf_athena_list=
+ test "$cf_x_athena" = Xaw && cf_athena_list="xaw8 xaw7 xaw6"
+ for cf_athena_pkg in \
+ $cf_athena_list \
+ ${cf_x_athena} \
+ ${cf_x_athena}-devel \
+ lib${cf_x_athena} \
+ lib${cf_x_athena}-devel
+ do
+ CF_TRY_PKG_CONFIG($cf_athena_pkg,[
+ cf_x_athena_lib="$cf_pkgconfig_libs"
+ CF_UPPER(cf_x_athena_LIBS,HAVE_LIB_$cf_x_athena)
+ AC_DEFINE_UNQUOTED($cf_x_athena_LIBS)
+
+ CF_TRIM_X_LIBS
+
+AC_CACHE_CHECK(for usable $cf_x_athena/Xmu package,cf_cv_xaw_compat,[
+AC_TRY_LINK([
+#include <X11/Xmu/CharSet.h>
+],[
+int check = XmuCompareISOLatin1("big", "small");
+(void)check;
+],[cf_cv_xaw_compat=yes],[cf_cv_xaw_compat=no])])
+
+ if test "$cf_cv_xaw_compat" = no
+ then
+ # workaround for broken ".pc" files...
+ case "$cf_x_athena_lib" in
+ (*-lXmu*)
+ ;;
+ (*)
+ CF_VERBOSE(work around broken package)
+ cf_save_xmu="$LIBS"
+ cf_first_lib=`echo "$cf_save_xmu" | sed -e 's/^[ ][ ]*//' -e 's/ .*//'`
+ CF_TRY_PKG_CONFIG(xmu,[
+ LIBS="$cf_save_xmu"
+ CF_ADD_LIB_AFTER($cf_first_lib,$cf_pkgconfig_libs)
+ ],[
+ CF_ADD_LIB_AFTER($cf_first_lib,-lXmu)
+ ])
+ CF_TRIM_X_LIBS
+ ;;
+ esac
+ fi
+
+ break])
+ done
+fi
+
+if test -z "$cf_x_athena_lib" ; then
+ CF_X_EXT
+ CF_X_TOOLKIT
+ CF_X_ATHENA_CPPFLAGS($cf_x_athena)
+ CF_X_ATHENA_LIBS($cf_x_athena)
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_X_ATHENA_CPPFLAGS version: 9 updated: 2020/12/31 10:54:15
+dnl --------------------
+dnl Normally invoked by CF_X_ATHENA, with $1 set to the appropriate flavor of
+dnl the Athena widgets, e.g., Xaw, Xaw3d, neXtaw.
+AC_DEFUN([CF_X_ATHENA_CPPFLAGS],
+[
+AC_REQUIRE([AC_PATH_XTRA])
+cf_x_athena_root=ifelse([$1],,Xaw,[$1])
+cf_x_athena_inc=""
+
+for cf_path in default \
+ /usr/contrib/X11R6 \
+ /usr/contrib/X11R5 \
+ /usr/lib/X11R5 \
+ /usr/local
+do
+ if test -z "$cf_x_athena_inc" ; then
+ CF_SAVE_XTRA_FLAGS([CF_X_ATHENA_CPPFLAGS])
+ cf_test=X11/$cf_x_athena_root/SimpleMenu.h
+ if test "$cf_path" != default ; then
+ CF_APPEND_TEXT(CPPFLAGS,-I$cf_path/include)
+ AC_MSG_CHECKING(for $cf_test in $cf_path)
+ else
+ AC_MSG_CHECKING(for $cf_test)
+ fi
+ AC_TRY_COMPILE([
+#include <X11/Intrinsic.h>
+#include <$cf_test>],[],
+ [cf_result=yes],
+ [cf_result=no])
+ AC_MSG_RESULT($cf_result)
+ CF_RESTORE_XTRA_FLAGS([CF_X_ATHENA_CPPFLAGS])
+ if test "$cf_result" = yes ; then
+ test "$cf_path" = default && cf_x_athena_inc=default
+ test "$cf_path" != default && cf_x_athena_inc="$cf_path/include"
+ break
+ fi
+ fi
+done
+
+if test -z "$cf_x_athena_inc" ; then
+ AC_MSG_WARN([Unable to find Athena header files])
+elif test "$cf_x_athena_inc" != default ; then
+ CF_APPEND_TEXT(CPPFLAGS,-I$cf_x_athena_inc)
+fi
+])
+dnl ---------------------------------------------------------------------------
+dnl CF_X_ATHENA_LIBS version: 13 updated: 2020/01/11 18:16:10
+dnl ----------------
+dnl Normally invoked by CF_X_ATHENA, with $1 set to the appropriate flavor of
+dnl the Athena widgets, e.g., Xaw, Xaw3d, neXtaw.
+AC_DEFUN([CF_X_ATHENA_LIBS],
+[AC_REQUIRE([CF_X_TOOLKIT])
+cf_x_athena_root=ifelse([$1],,Xaw,[$1])
+cf_x_athena_lib=""
+
+for cf_path in default \
+ /usr/contrib/X11R6 \
+ /usr/contrib/X11R5 \
+ /usr/lib/X11R5 \
+ /usr/local
+do
+ for cf_lib in \
+ ${cf_x_athena_root} \
+ ${cf_x_athena_root}7 \
+ ${cf_x_athena_root}6
+ do
+ for cf_libs in \
+ "-l$cf_lib -lXmu" \
+ "-l$cf_lib -lXpm -lXmu" \
+ "-l${cf_lib}_s -lXmu_s"
+ do
+ test -n "$cf_x_athena_lib" && break
+
+ CF_SAVE_XTRA_FLAGS([CF_X_ATHENA_LIBS])
+ cf_test=XawSimpleMenuAddGlobalActions
+ test "$cf_path" != default && cf_libs="-L$cf_path/lib $cf_libs"
+ CF_ADD_LIBS($cf_libs)
+ AC_MSG_CHECKING(for $cf_test in $cf_libs)
+ AC_TRY_LINK([
+#include <X11/Intrinsic.h>
+#include <X11/$cf_x_athena_root/SimpleMenu.h>
+],[
+$cf_test((XtAppContext) 0)],
+ [cf_result=yes],
+ [cf_result=no])
+ AC_MSG_RESULT($cf_result)
+ CF_RESTORE_XTRA_FLAGS([CF_X_ATHENA_LIBS])
+
+ if test "$cf_result" = yes ; then
+ cf_x_athena_lib="$cf_libs"
+ break
+ fi
+ done # cf_libs
+ test -n "$cf_x_athena_lib" && break
+ done # cf_lib
+done
+
+if test -z "$cf_x_athena_lib" ; then
+ AC_MSG_ERROR(
+[Unable to successfully link Athena library (-l$cf_x_athena_root) with test program])
+fi
+
+CF_ADD_LIBS($cf_x_athena_lib)
+CF_UPPER(cf_x_athena_LIBS,HAVE_LIB_$cf_x_athena)
+AC_DEFINE_UNQUOTED($cf_x_athena_LIBS)
+])
+dnl ---------------------------------------------------------------------------
+dnl CF_X_EXT version: 3 updated: 2010/06/02 05:03:05
+dnl --------
+AC_DEFUN([CF_X_EXT],[
+CF_TRY_PKG_CONFIG(Xext,,[
+ AC_CHECK_LIB(Xext,XextCreateExtension,
+ [CF_ADD_LIB(Xext)])])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_X_TOOLKIT version: 26 updated: 2021/01/02 09:31:20
+dnl ------------
+dnl Check for X Toolkit libraries
+AC_DEFUN([CF_X_TOOLKIT],
+[
+AC_REQUIRE([AC_PATH_XTRA])
+AC_REQUIRE([CF_CHECK_CACHE])
+
+# OSX is schizoid about who owns /usr/X11 (old) versus /opt/X11 (new) (and
+# in some cases has installed dummy files in the former, other cases replaced
+# it with a link to the new location). This complicates the configure script.
+# Check for that pitfall, and recover using pkg-config
+#
+# If none of these are set, the configuration is almost certainly broken.
+if test -z "${X_CFLAGS}${X_PRE_LIBS}${X_LIBS}${X_EXTRA_LIBS}"
+then
+ CF_TRY_PKG_CONFIG(x11,,[AC_MSG_WARN(unable to find X11 library)])
+ CF_TRY_PKG_CONFIG(ice,,[AC_MSG_WARN(unable to find ICE library)])
+ CF_TRY_PKG_CONFIG(sm,,[AC_MSG_WARN(unable to find SM library)])
+ CF_TRY_PKG_CONFIG(xt,,[AC_MSG_WARN(unable to find Xt library)])
+else
+ LIBS="$X_PRE_LIBS $LIBS $X_EXTRA_LIBS"
+fi
+
+cf_have_X_LIBS=no
+
+CF_TRY_PKG_CONFIG(xt,[
+
+ case "x$LIBS" in
+ (*-lX11*)
+ ;;
+ (*)
+# we have an "xt" package, but it may omit Xt's dependency on X11
+AC_CACHE_CHECK(for usable X dependency,cf_cv_xt_x11_compat,[
+AC_TRY_LINK([
+#include <X11/Xlib.h>
+],[
+ int rc1 = XDrawLine((Display*) 0, (Drawable) 0, (GC) 0, 0, 0, 0, 0);
+ int rc2 = XClearWindow((Display*) 0, (Window) 0);
+ int rc3 = XMoveWindow((Display*) 0, (Window) 0, 0, 0);
+ int rc4 = XMoveResizeWindow((Display*)0, (Window)0, 0, 0, 0, 0);
+],[cf_cv_xt_x11_compat=yes],[cf_cv_xt_x11_compat=no])])
+ if test "$cf_cv_xt_x11_compat" = no
+ then
+ CF_VERBOSE(work around broken X11 dependency)
+ # 2010/11/19 - good enough until a working Xt on Xcb is delivered.
+ CF_TRY_PKG_CONFIG(x11,,[CF_ADD_LIB_AFTER(-lXt,-lX11)])
+ fi
+ ;;
+ esac
+
+AC_CACHE_CHECK(for usable X Toolkit package,cf_cv_xt_ice_compat,[
+AC_TRY_LINK([
+#include <X11/Shell.h>
+],[int num = IceConnectionNumber(0); (void) num
+],[cf_cv_xt_ice_compat=yes],[cf_cv_xt_ice_compat=no])])
+
+ if test "$cf_cv_xt_ice_compat" = no
+ then
+ # workaround for broken ".pc" files used for X Toolkit.
+ case "x$X_PRE_LIBS" in
+ (*-lICE*)
+ case "x$LIBS" in
+ (*-lICE*)
+ ;;
+ (*)
+ CF_VERBOSE(work around broken ICE dependency)
+ CF_TRY_PKG_CONFIG(ice,
+ [CF_TRY_PKG_CONFIG(sm)],
+ [CF_ADD_LIB_AFTER(-lXt,$X_PRE_LIBS)])
+ ;;
+ esac
+ ;;
+ esac
+ fi
+
+ cf_have_X_LIBS=yes
+],[
+
+ LDFLAGS="$X_LIBS $LDFLAGS"
+ CF_CHECK_CFLAGS($X_CFLAGS)
+
+ AC_CHECK_FUNC(XOpenDisplay,,[
+ AC_CHECK_LIB(X11,XOpenDisplay,
+ [CF_ADD_LIB(X11)])])
+
+ AC_CHECK_FUNC(XtAppInitialize,,[
+ AC_CHECK_LIB(Xt, XtAppInitialize,
+ [AC_DEFINE(HAVE_LIBXT,1,[Define to 1 if we can compile with the Xt library])
+ cf_have_X_LIBS=Xt
+ LIBS="-lXt $LIBS"])])
+])
+
+if test "$cf_have_X_LIBS" = no ; then
+ AC_MSG_WARN(
+[Unable to successfully link X Toolkit library (-lXt) with
+test program. You will have to check and add the proper libraries by hand
+to makefile.])
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF__CHECK_RUN version: 2 updated: 2023/01/05 17:58:44
+dnl -------------
+dnl Check if a simple program can be made to run with the existing libraries.
+define([CF__CHECK_RUN],[
+AC_TRY_RUN([$ac_includes_default
+int main(void) {
+ fflush(stderr);
+ ${cf_cv_main_return:-return}(0);
+}],
+ $1=yes,
+ $1=no,
+ $1=unknown)
+])
+dnl ---------------------------------------------------------------------------
+dnl CF__CURSES_HEAD version: 2 updated: 2010/10/23 15:54:49
+dnl ---------------
+dnl Define a reusable chunk which includes <curses.h> and <term.h> when they
+dnl are both available.
+define([CF__CURSES_HEAD],[
+#ifdef HAVE_XCURSES
+#include <xcurses.h>
+char * XCursesProgramName = "test";
+#else
+#include <${cf_cv_ncurses_header:-curses.h}>
+#if defined(NCURSES_VERSION) && defined(HAVE_NCURSESW_TERM_H)
+#include <ncursesw/term.h>
+#elif defined(NCURSES_VERSION) && defined(HAVE_NCURSES_TERM_H)
+#include <ncurses/term.h>
+#elif defined(HAVE_TERM_H)
+#include <term.h>
+#endif
+#endif
+])
+dnl ---------------------------------------------------------------------------
+dnl CF__ICONV_BODY version: 2 updated: 2007/07/26 17:35:47
+dnl --------------
+dnl Test-code needed for iconv compile-checks
+define([CF__ICONV_BODY],[
+ iconv_t cd = iconv_open("","");
+ iconv(cd,NULL,NULL,NULL,NULL);
+ iconv_close(cd);]
+)dnl
+dnl ---------------------------------------------------------------------------
+dnl CF__ICONV_HEAD version: 1 updated: 2007/07/26 15:57:03
+dnl --------------
+dnl Header-files needed for iconv compile-checks
+define([CF__ICONV_HEAD],[
+#include <stdlib.h>
+#include <iconv.h>]
+)dnl
+dnl ---------------------------------------------------------------------------
+dnl CF__INET_HEAD version: 2 updated: 2022/12/04 16:36:15
+dnl -------------
+dnl Header-files needed for inet.h compile-checks
+define([CF__INET_HEAD],[
+$ac_includes_default
+#if defined(__MINGW32__)
+
+#undef WIN32_LEAN_AND_MEAN
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+
+#ifdef HAVE_WINSOCK2_H
+#include <winsock2.h>
+#else
+#ifdef HAVE_WINSOCK_H
+#include <winsock.h>
+#endif
+#endif
+
+#else
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+#endif
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF__INTL_BODY version: 4 updated: 2021/05/19 19:35:25
+dnl -------------
+dnl Test-code needed for libintl compile-checks
+dnl $1 = parameter 2 from AM_WITH_NLS
+define([CF__INTL_BODY],[
+ bindtextdomain ("", "");
+ return (gettext ("") != 0)
+ ifelse([$1], need-ngettext, [ + (ngettext ("", "", 0) != 0)], [])
+#ifndef IGNORE_MSGFMT_HACK
+ [ + _nl_msg_cat_cntr]
+#endif
+])
+dnl ---------------------------------------------------------------------------
+dnl CF__INTL_HEAD version: 1 updated: 2007/07/26 17:35:47
+dnl -------------
+dnl Header-files needed for libintl compile-checks
+define([CF__INTL_HEAD],[
+#include <libintl.h>
+extern int _nl_msg_cat_cntr;
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF__SED_TRIMBLANKS version: 1 updated: 2021/01/02 09:31:20
+dnl ------------------
+dnl Trim something using sed, then trim extra whitespace
+dnl $1 = extra parameters, e.g., in CF_STRIP_G_OPT
+define([CF__SED_TRIMBLANKS],[sed ifelse($1,,,[$1] )-e 's%[[ ]]% %g' -e 's% [[ ]]*% %g' -e 's%^ %%' -e 's% [$]%%'])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF__SSL_BODY version: 2 updated: 2008/04/13 10:56:06
+dnl ------------
+dnl Body for test-compile of SSL code.
+define([CF__SSL_BODY],[
+#ifdef USE_GNUTLS_FUNCS
+ gnutls_global_init();
+#else
+ SSL_shutdown((SSL *)0)
+#endif
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF__SSL_HEAD version: 2 updated: 2008/04/13 10:56:06
+dnl ------------
+dnl Headers for test-compile of SSL code.
+define([CF__SSL_HEAD],[
+#include <stdio.h>
+#if defined(USE_OPENSSL_INCL)
+#include <openssl/ssl.h>
+#elif defined(USE_GNUTLS_FUNCS)
+#include <gnutls/gnutls.h>
+#elif defined(USE_GNUTLS_INCL)
+#include <gnutls/openssl.h>
+#else
+#include <ssl.h>
+#endif
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF__XOPEN_SOURCE_BODY version: 1 updated: 2022/09/10 15:17:35
+dnl ---------------------
+dnl body of test when test-compiling for _XOPEN_SOURCE check
+define([CF__XOPEN_SOURCE_BODY],
+[
+#ifndef _XOPEN_SOURCE
+make an error
+#endif
+])
+dnl ---------------------------------------------------------------------------
+dnl CF__XOPEN_SOURCE_HEAD version: 1 updated: 2022/09/10 15:17:03
+dnl ---------------------
+dnl headers to include when test-compiling for _XOPEN_SOURCE check
+define([CF__XOPEN_SOURCE_HEAD],
+[
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+])
+dnl ---------------------------------------------------------------------------
+dnl jm_GLIBC21 version: 4 updated: 2015/05/10 19:52:14
+dnl ----------
+dnl Inserted as requested by gettext 0.10.40
+dnl File from /usr/share/aclocal
+dnl glibc21.m4
+dnl ====================
+dnl serial 2
+dnl
+dnl Test for the GNU C Library, version 2.1 or newer.
+dnl From Bruno Haible.
+AC_DEFUN([jm_GLIBC21],
+[
+AC_CACHE_CHECK(whether we are using the GNU C Library 2.1 or newer,
+ ac_cv_gnu_library_2_1,
+ [AC_EGREP_CPP([Lucky GNU user],
+ [
+#include <features.h>
+#ifdef __GNU_LIBRARY__
+ #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2)
+ Lucky GNU user
+ #endif
+#endif
+ ],
+ ac_cv_gnu_library_2_1=yes,
+ ac_cv_gnu_library_2_1=no)])
+ AC_SUBST(GLIBC21)
+ GLIBC21="$ac_cv_gnu_library_2_1"
+])
diff --git a/bcblibs.bat b/bcblibs.bat
new file mode 100644
index 0000000..263f4b2
--- /dev/null
+++ b/bcblibs.bat
@@ -0,0 +1,49 @@
+@echo off
+rem $LynxId: bcblibs.bat,v 1.5 2012/07/05 23:32:15 tom Exp $
+rem Use this script to construct import-libraries for the Borland C compiler
+rem from the dll's in the GnuWin32 directory.
+rem
+rem The script assumes that the Borland C compiler is already in your %PATH%
+rem search-list. It also uses the Windows 2000 command-extensions, which are
+rem provided in Windows XP and later by default.
+setlocal
+
+rem Check if GW32_ROOT is defined, and if not, fill in a default value.
+
+ if not "x%GW32_ROOT%"=="x" goto exists
+ set GW32_ROOT=c:\app\gnuwin32
+:exists
+
+ if exist "%GW32_ROOT%" goto doit
+ echo ? %GW32_ROOT% does not exist
+ goto finish
+
+:doit
+ rem do this just in case it is needed
+ set PATH=%PATH%;%GW32_ROOT\bin
+
+ set SAVE_CD="%CD%"
+ cd %GW32_ROOT%
+
+ if not exist bcblibs mkdir bcblibs
+
+ cd bin
+ if ERRORLEVEL 1 goto failed
+
+ for %%N in (*.dll) do call :implib %%~nN%
+
+ cd %CD%
+ goto finish
+
+:implib
+ echo making import-library for %1
+ set SOURCE=%1.dll
+ set TARGET=..\bcblibs\%1.lib
+ copy %1.dll ..\bcblibs
+ implib -a %TARGET% %1.dll
+ :goto :eof
+
+:failed
+
+:finish
+endlocal
diff --git a/build.bat b/build.bat
new file mode 100644
index 0000000..cff8e6d
--- /dev/null
+++ b/build.bat
@@ -0,0 +1,169 @@
+@echo off
+@rem $LynxId: build.bat,v 1.1 2018/02/19 14:54:26 tom Exp $
+ setlocal
+ set SSL_DIR=C:\OpenSSL-%TARGET_ARCH%
+
+if not exist lynx.man goto :not_lynx
+if not exist lynx.cfg goto :not_lynx
+if not exist makefile.msc goto :not_lynx
+if not exist make-msc.bat goto :not_lynx
+
+if "x"=="x%PARTITION%" goto :no_build
+
+rem The locally-built libraries are in a directory tree which has subfolders
+rem for each version of Visual Studio. The OpenSSL directories are in
+rem a separate location. Simplify building Lynx by copying the link-libraries
+rem and DLLs to the build-tree.
+
+ call :copybin \project\all\%PARTITION%
+ call :copylib \project\all\%PARTITION%
+
+ xcopy /f/q lynx.cfg bin
+ xcopy /f/q samples\lynx.lss bin
+
+ call :clean
+ call :build %1
+
+ goto :eof
+
+:no_build
+ echo The build-tools were not setup
+ goto :eof
+
+:not_lynx
+ echo This is not the Lynx build-directory
+ goto :eof
+
+rem Copy configuration and OpenSSL DLLs to bin-directory to simplify
+rem ad hoc testing. The "\com" has some GnuWin32 executables which can be
+rem used for decompressing temporary files. Copy those here as well to
+rem simplify packaging.
+
+:copybin
+ setlocal
+ echo ** Copying files to bin-directory
+ if not exist bin mkdir bin
+ cd bin
+ del /f /q lynx*.*
+ del /f /q *.dll
+ del /f /q *.exe
+ copy %1\dynamic\*.dll .
+ copy c:\com\bzip2.exe .
+ copy c:\com\gzip.exe .
+ call :copy_ssl libeay
+ call :copy_ssl ssleay
+ call :copy_ssl libcrypto
+ call :copy_ssl libssl
+ call :copy_ssl msvcr
+ endlocal
+ goto :eof
+
+:copy_ssl
+ setlocal
+ set DESTDIR=%CD%
+ cd %SSL_DIR%
+ for /f "usebackq" %%i in (`dir /b /s bin`) do xcopy /s /c /f /y %%i\%1*.dll %DESTDIR%
+ endlocal
+ goto :eof
+
+rem We could link with locally-built DLLs, but it would complicate
+rem things unnecessarily, and in the case of the slang library, more
+rem than double the size of an installer since its DLL is larger than all
+rem of the other parts of Lynx combined.
+
+:copylib
+ setlocal
+ echo ** Copying files to lib-directory
+ if not exist lib mkdir lib
+ cd lib
+ del /f /q *.lib
+ del /f /q bzip*.h
+ del /f /q curs*.h
+ del /f /q slang*.h
+ del /f /q z*.h
+ copy %1\include\* .
+ copy %1\static\* .
+ endlocal
+ goto :eof
+
+:clean
+ setlocal
+ call make-msc.bat clean
+ endlocal
+ goto :eof
+
+:build
+ setlocal
+ if "x%1"=="x" call :do_default
+ if not "x%1"=="x" call :do_%1
+ endlocal
+ goto :eof
+
+:do_all
+ call :do_default
+ call :do_sock
+ call :do_oldssl
+ call :do_newssl
+ call :do_cs
+ call :do_slang
+ call make-msc clean
+ goto :eof
+
+@rem just for testing
+:do_default
+ call :doit bin\lynx-default.exe
+ goto :eof
+
+:do_sock
+ call :doit bin\lynx-sock.exe "OPT_SOCK=yes"
+ goto :eof
+
+rem The "with-openssl" batch-file simplifies some of the task of linking
+rem with OpenSSL DLLs by setting SSL_LIBS for the appropriate old/new
+rem filenames.
+
+:do_oldssl
+ setlocal
+ call with-openssl 1.0.2n 0
+ call :doit bin\lynx-oldssl.exe "OPT_SSL=yes" "OPT_SOCK=yes"
+ endlocal
+ goto :eof
+
+:do_newssl
+ setlocal
+ call with-openssl 1.1.0g 1
+ call :doit bin\lynx-newssl.exe "OPT_SSL=yes" "OPT_SOCK=yes"
+ endlocal
+ goto :eof
+
+@rem for packages
+:do_cs
+ call :doit bin\lynx-cs.exe "OPT_SOCK=yes" "OPT_CS=yes"
+ goto :eof
+
+:do_slang
+ call :doit bin\lynx-slang.exe "OPT_SOCK=yes" "SCREEN=slang"
+ goto :eof
+
+:do_none
+ goto :eof
+
+:doit
+ setlocal
+ echo ** START BUILD: %*
+ set progname=%1
+ shift
+ call make-msc clean
+ echo on
+ call make-msc "PROGNAME=%progname%" %1 %2 %3 %4 %5 %6 %7 %8 %9
+ if errorlevel 1 goto :failed
+ echo ** BUILD-SUCCESS %progname%
+ echo.
+ %progname% -version
+ echo.
+ endlocal
+ goto :eof
+:failed
+ echo ?? BUILD-FAILURE %progname%
+ endlocal
+ goto :eof
diff --git a/build.com b/build.com
new file mode 100644
index 0000000..eae12e7
--- /dev/null
+++ b/build.com
@@ -0,0 +1,467 @@
+$ v0 = 0
+$ v = f$verify(v0)
+$! $LynxId: build.com,v 1.20 2020/01/21 21:54:23 tom Exp $
+$! BUILD.COM
+$!
+$! Command file to build LYNX.EXE on VMS systems.
+$! Also invokes build of the WWWLibrary if its
+$! object library does not already exist.
+$!
+$!
+$! 11-Jun-2010 Ch. Gartmann
+$! add support for "Multinet UCX emulation"
+$! 01-Jul-2007 T.Dickey
+$! add support for "TCPIP" (TCPIP Services)
+$! 04-Nov-2004 T.Dickey
+$! workarounds to build with IA64 platform.
+$! 23-Oct-2004 T.Dickey
+$! cleanup, remove duplication, etc.
+$! 08-Oct-1997 F.Macrides macrides@sci.wfeb.edu
+$! Added comments and minor tweaks for convenient addition of
+$! compiler definitions and compiler and linker options.
+$! 28-Jun-1997 F.Macrides macrides@sci.wfeb.edu
+$! Added chartrans support.
+$! 29-Feb-1996 F.Macrides macrides@sci.wfeb.edu
+$! Added LYMap to the compilation and link lists.
+$! 26-Jul-1995 F.Macrides macrides@sci.wfeb.edu
+$! Reorganized the option files into ones for the transport and
+$! ones for the compiler, and adding support for GNUC.
+$! 14-Jun-1995 F.Macrides macrides@sci.wfeb.edu
+$! Added LYList.
+$! 03-May-1995 F.Macrides macrides@sci.wfeb.edu
+$! Include /nomember for compilations with DECC. It's not the
+$! default on AXP and the code assumes byte alignment.
+$! 23-Mar-1995 F.Macrides macrides@sci.wfeb.edu
+$! Replaced references to v2.3.8 or v2.3.9 with v2.3-FM to avoid
+$! any confusion with official releases at UKans.
+$! 16-Mar-1995 F.Macrides macrides@sci.wfeb.edu
+$! Updated to permit submission to BATCH.
+$! 17-Feb-1995 F.Macrides macriees@sci.wfeb.edu
+$! Updated for v2.3-FM
+$! 07-Dec-1994 F.Macrides macrides@sci.wfeb.edu
+$! Updated for DECC/VAX, VAXC/VAX and DECC/AXP
+$! 03-OCT-1994 A.Harper A.Harper@kcl.ac.uk
+$! Mods to support SOCKETSHR/NETLIB and add a /DEBUG/NOOPT option
+$! 02-Jun-1994 F.Macrides macrides@sci.wfeb.edu
+$! Mods to support TCPWare (To use non-blocking connects, you need
+$! the DRIVERS_V405B.INC patch from FTP.PROCESS.COM for TCPware for
+$! OpenVMS Version 4.0-5, or a higher version of TCPWare, which will
+$! have that bug in the TCPDRIVER fixed. Otherwise, add NO_IOCTL to
+$! the $ cc := cc/define=(...) list in [.WWW.Library.VMS]libmake.com).
+$! 20-May-1994 Andy Harper A.Harper@bay.cc.kcl.ac.uk
+$! Mods to support CMU TCP/IP
+$! 13-Dec-1993 F.Macrides macrides@sci.wfeb.edu
+$! Mods for conditional compilations with VAXC versus DECC
+$! 10-Dec-1993 F.Macrides macrides@sci.wfeb.edu
+$! Initial version, for Lynx v2.1
+$!
+$ ON CONTROL_Y THEN GOTO CLEANUP
+$ ON ERROR THEN GOTO CLEANUP
+$ proc = f$environment("PROCEDURE")
+$ where = f$parse(proc,,,"DEVICE") + f$parse(proc,,,"DIRECTORY")
+$ set default 'where'
+$ write sys$output "Default directory:"
+$ show default
+$ write sys$output ""
+$!
+$! Compiler definitions can be added here as a comma separated
+$! list with a lead comma, e.g., ",HAVE_FOO_H,DO_BLAH". The
+$! definitions will apply only to the LYfoo.c modules. Ones
+$! for the libwww-FM modules can be added equivalently in
+$! [.WWW.Library.vms]libmake.com. - FM
+$!
+$ extra_defs = ""
+$!
+$! Include-paths can be added here as a comma separated
+$! list with a lead comma, e.g., ",foo".
+$!
+$ extra_incs = ""
+$!
+$! Library definitions can be added here as a comma separated
+$! list with a lead comma, e.g., ",foo/LIB".
+$!
+$ extra_libs = ""
+$!
+$! If no TCP/IP agent is specified (as the first argument),
+$! prompt for a number from the list. Note that the agent
+$! must be the first argument if the debugger mode is to be
+$! set via a second argument (see below). - FM
+$!
+$ agent = 0
+$ IF P1 .EQS. ""
+$ THEN
+$ If f$mode() .eqs. "BATCH"
+$ Then
+$ write sys$output "TCP/IP agent not specified!"
+$ write sys$output "Defaulting to MULTINET"
+$ agent = 1
+$ Else
+$ write sys$output "Acceptable TCP/IP agents are"
+$ write sys$output " [1] MULTINET (default)"
+$ write sys$output " [2] UCX"
+$ write sys$output " [3] WIN_TCP"
+$ write sys$output " [4] CMU_TCP"
+$ write sys$output " [5] SOCKETSHR_TCP"
+$ write sys$output " [6] TCPWARE"
+$ write sys$output " [7] DECNET"
+$ write sys$output " [8] TCPIP"
+$ write sys$output " [9] Multinet with UCX emulation"
+$ read sys$command/prompt="Agent [1,2,3,4,5,6,7,8,9] (RETURN = [1]) " agent
+$ EndIf
+$ ENDIF
+$ option = ""
+$ if agent .eq. 1 .or. agent .eqs. "" .or. p1 .eqs. "" .or. p1 .eqs. "MULTINET" then -
+ option = "MULTINET"
+$ if agent .eq. 2 .or. p1 .eqs. "UCX" then option = "UCX"
+$ if agent .eq. 3 .or. p1 .eqs. "WIN_TCP" then option = "WIN_TCP"
+$ if agent .eq. 4 .or. p1 .eqs. "CMU_TCP" then option = "CMU_TCP"
+$ if agent .eq. 5 .or. p1 .eqs. "SOCKETSHR_TCP" then option = "SOCKETSHR_TCP"
+$ if agent .eq. 6 .or. p1 .eqs. "TCPWARE" then option = "TCPWARE"
+$ if agent .eq. 7 .or. p1 .eqs. "DECNET" then option = "DECNET"
+$ if agent .eq. 8 .or. p1 .eqs. "TCPIP" then option = "TCPIP"
+$ if agent .eq. 9 .or. p1 .eqs. "MULTINETUCX"
+$ then
+$ option = "UCX"
+$ mucx = 1
+$ extra_defs = extra_defs + ",MUCX"
+$ ELSE
+$ mucx = 0
+$ ENDIF
+$!
+$ if option .eqs. ""
+$ then
+$ write sys$output "TCP/IP agent could not be determined"
+$ exit 18
+$ endif
+$!
+$ if option .eqs. "TCPWARE"
+$ then
+$ write sys$output "Building Lynx for TCPWARE with UCX emulation..."
+$ extra_defs = extra_defs + ",UCX"
+$ endif
+$!
+$ optfile = "''option'"
+$!
+$! Compiler and linker options can be specified here. If
+$! there was a second argument (with any value), then debugger
+$! mode with no optimization will be specified as well. The
+$! compiler options will apply only to the LYfoo.c and UCfoo.c
+$! modules. Ones for the libwww-FM modules can be specified
+$! in [.WWW.Library.vms]libmake.com. - FM
+$!
+$ cc_opts = ""
+$ link_opts = ""
+$!
+$! The second parameter is a comma-separated list of the optional
+$! libraries:
+$! bzlib, slang, ssl, zlib
+$! Because these are normally not installed in a standard place,
+$! you must define their locations (see below for the symbols ending
+$! with "_INC" or "_LIB").
+$!
+$ if P2 .nes. ""
+$ then
+$ count_parm = 0
+$ parse_p2:
+$ value_parm = f$element('count_parm, ",", "''p2'")
+$ if value_parm .nes. ","
+$ then
+$ if value_parm .eqs. "BZLIB"
+$ then
+$ write sys$output "** adding BZlib to build."
+$ extra_defs = extra_defs + ",USE_BZLIB"
+$ extra_incs = extra_incs + "," + BZLIB_INC
+$ extra_libs = extra_libs + "," + BZLIB_LIB + "libbz2/LIB"
+$ endif
+$ if value_parm .eqs. "SLANG"
+$ then
+$ write sys$output "** adding SLang to build."
+$ extra_defs = extra_defs + ",USE_SLANG"
+$ extra_incs = extra_incs + "," + SLANG_INC
+$ extra_libs = extra_libs + "," + SLANG_LIB + "slang.olb/lib"
+$ endif
+$ if value_parm .eqs. "SSL"
+$ then
+$ write sys$output "** adding SSL to build."
+$ IF F$TYPE( ssl_lib ) .EQS. "" THEN ssl_lib = F$TRNLNM("SSLLIB")
+$ IF F$TYPE( ssl_inc ) .EQS. "" THEN ssl_inc = F$TRNLNM("SSLINCLUDE")
+$ extra_defs = extra_defs + ",USE_SSL,USE_OPENSSL_INCL"
+$ extra_libs = extra_libs + "," + SSL_LIB + "libssl/LIB," + SSL_LIB + "libcrypto/LIB"
+$!
+$! The "#include <openssl/ssl.h>" requires a logical variable "openssl".
+$!
+$ define/nolog openssl 'SSL_INC
+$ endif
+$ if value_parm .eqs. "ZLIB"
+$ then
+$ write sys$output "** adding Zlib to build."
+$ extra_defs = extra_defs + ",USE_ZLIB"
+$ extra_incs = extra_incs + "," + ZLIB_INC
+$ extra_libs = extra_libs + "," + ZLIB_LIB + "libz/LIB"
+$ endif
+$ count_parm = count_parm + 1
+$ goto parse_p2
+$ endif
+$ endif
+$!
+$! The third parameter is nonempty to make a debug build
+$!
+$ if P3 .nes. ""
+$ then
+$ debug_arg = "DEBUG"
+$ cc_opts = cc_opts + "/DEBUG/NOOPT"
+$ link_opts = link_opts + "/DEBUG"
+$ else
+$ debug_arg = ""
+$ endif
+$!
+$ IF f$search("[.WWW.Library.Implementation]WWWLib_''option'.olb") .nes. ""
+$ THEN
+$ write sys$output " WWWLib_''option'.olb already exists."
+$ If f$mode() .eqs. "BATCH"
+$ Then
+$ write sys$output " Updating WWWLib_''option'.olb"
+$ Else
+$ read sys$command/prompt=" Update it [default Y]? " reply
+$ if reply .nes. "" .and. -
+ f$extract(0,1,f$edit(reply, "TRIM, UPCASE")) .nes. "Y" then -
+$ goto Compile_CHRTRANS
+$ EndIf
+$ ENDIF
+$ v1 = f$verify(1)
+$!
+$! Build the WWWLibrary
+$!
+$ set default [.WWW.Library.VMS]
+$ v1 = f$verify(v0)
+$ @libmake "''option'" "''P2'" "''debug_arg'"
+$ v1 = f$verify(1)
+$ set default [-.-.-]
+$ v1 = f$verify(v0)
+$ ON CONTROL_Y THEN GOTO CLEANUP
+$ ON ERROR THEN GOTO CLEANUP
+$!
+$Compile_CHRTRANS:
+$ IF f$search("[.src.chrtrans]makeuctb.exe") .nes. ""
+$ THEN
+$ write sys$output " [.src.chrtrans]makeuctb.exe already exists."
+$ If f$mode() .eqs. "BATCH"
+$ Then
+$ write sys$output " Updating makeuctb.exe and chrtrans header files."
+$ Else
+$ read sys$command -
+ /prompt=" Update it and chrtrans header files [default Y]? " reply
+$ if reply .nes. "" .and. -
+ f$extract(0,1,f$edit(reply, "TRIM, UPCASE")) .nes. "Y" then -
+$ goto Compile_SRC
+$ EndIf
+$ ENDIF
+$!
+$ v1 = f$verify(1)
+$!
+$! Build the chrtrans modules.
+$!
+$ set default [.src.chrtrans]
+$ v1 = 'f$verify(v0)
+$ @build-chrtrans
+$ v1 = f$verify(1)
+$ set default [-.-]
+$ v1 = f$verify(v0)
+$ ON CONTROL_Y THEN GOTO CLEANUP
+$ ON ERROR THEN GOTO CLEANUP
+$!
+$Compile_SRC:
+$ v1 = f$verify(1)
+$!
+$! Compile the Lynx [.SRC] modules
+$!
+$ set default [.SRC]
+$ v1 = f$verify(v0)
+$ IF f$getsyi("ARCH_NAME") .eqs. "Alpha" .or. -
+ f$getsyi("ARCH_NAME") .eqs. "IA64" .or. -
+ f$trnlnm("VAXCMSG") .eqs. "DECC$MSG" .or. -
+ f$trnlnm("DECC$CC_DEFAULT") .eqs. "/DECC" .or. -
+ f$trnlnm("DECC$CC_DEFAULT") .eqs. "/VAXC"
+$ THEN
+$ compiler := "DECC"
+$!
+$ if option .eqs. "UCX"
+$ then
+$ optfile = "UCXSHR"
+$ IF mucx THEN optfile = "MULTINET_UCX"
+$ ENDIF
+$ if option .eqs. "TCPIP" then optfile = "TCPIPSHR"
+$ if option .eqs. "TCPWARE" then optfile = "TCPWARESHR"
+$!
+$ if option .eqs. "SOCKETSHR_TCP" then extra_defs = extra_defs + ",_DECC_V4_SOURCE"
+$ if option .eqs. "TCPIP" then extra_defs = extra_defs + ",TCPIP_SERVICES"
+$ if option .eqs. "MULTINET" then -
+ extra_defs = extra_defs + ",_DECC_V4_SOURCE,__SOCKET_TYPEDEFS"
+$!
+$ if option .eqs. "TCPIP"
+$ then
+$ if f$trnlnm("TCPIP$IPC_SHR") .eqs. "" then define TCPIP$IPC_SHR SYS$LIBRARY:TCPIP$IPC_SHR
+$ endif
+$!
+$ v1 = f$verify(1)
+$! DECC:
+$ cc := cc/decc/prefix=all/nomember'cc_opts' -
+ /DEFINE=(ACCESS_AUTH,'option''extra_defs',__VMS_CURSES)-
+ /INCLUDE=([],[-],[-.WWW.Library.Implementation],[.chrtrans]'extra_incs')
+$ v1 = f$verify(v0)
+$ ELSE
+$ IF option .eqs. "UCX"
+$ THEN
+$ optfile = "UCXSHR"
+$ IF mucx THEN optfile = "MULTINET_UCX"
+$ ENDIF
+$ if option .eqs. "TCPIP" then optfile = "TCPIPOLB"
+$ if option .eqs. "TCPWARE" then optfile = "TCPWAREOLB"
+$ IF f$search("gnu_cc:[000000]gcclib.olb") .nes. ""
+$ THEN
+$ compiler := "GNUC"
+$ v1 = f$verify(1)
+$! GNUC:
+$ cc := gcc'cc_opts' -
+ /DEFINE=(ACCESS_AUTH,'option''extra_defs')-
+ /INCLUDE=([],[-],[-.WWW.Library.Implementation],[.chrtrans]'extra_incs')
+$ v1 = f$verify(v0)
+$ ELSE
+$ compiler := "VAXC"
+$ v1 = f$verify(1)
+$! VAXC:
+$ cc := cc'cc_opts' -
+ /DEFINE=(ACCESS_AUTH,'option''extra_defs')-
+ /INCLUDE=([],[-],[-.WWW.Library.Implementation],[.chrtrans]'extra_incs')
+$ v1 = f$verify(v0)
+$ ENDIF
+$ ENDIF
+$ v1 = f$verify(1)
+$!
+$ cc DefaultStyle
+$ cc GridText
+$ cc HTAlert
+$ cc HTFWriter
+$ cc HTInit
+$ cc HTML
+$ cc LYBookmark
+$ cc LYCgi
+$ cc LYCharSets
+$ cc LYCharUtils
+$ cc LYClean
+$ cc LYCookie
+$ cc/nooptimize LYCurses
+$ cc LYDownload
+$ cc LYEdit
+$ cc LYEditmap
+$ cc LYexit
+$ cc LYForms
+$ cc LYGetFile
+$ cc LYHistory
+$ cc LYJump
+$ cc LYKeymap
+$ cc LYLeaks
+$ cc LYList
+$ cc LYMail
+$ cc LYMain
+$ cc LYMainLoop
+$ cc LYMap
+$ cc LYMktime
+$ cc LYNews
+$ cc LYOptions
+$ cc LYPrint
+$ cc LYrcFile
+$ cc LYReadCFG
+$ cc LYSearch
+$ cc LYSession
+$ cc LYShowInfo
+$ cc LYStrings
+$ cc LYTraversal
+$ cc LYUpload
+$ cc LYUtils
+$ cc PARSDATE
+$ cc TRSTable
+$ cc UCAuto
+$ cc UCAux
+$ cc UCdomap
+$!
+$! Link the objects and libraries.
+$!
+$ IF f$getsyi("ARCH_NAME") .eqs. "IA64"
+$ THEN
+$ optslibs="''extra_libs'"
+$ ELSE
+$ optslibs=", sys$disk:[]''optfile'.opt/opt, sys$disk:[]''compiler'.opt/opt ''extra_libs'"
+$ ENDIF
+$!
+$ link/exe=lynx.exe/map=lynx 'link_opts' -
+DefaultStyle.obj, -
+GridText.obj, -
+HTAlert.obj, -
+HTFWriter.obj, -
+HTInit.obj, -
+HTML.obj, -
+LYBookmark.obj, -
+LYCgi.obj, -
+LYCharSets.obj, -
+LYCharUtils.obj, -
+LYClean.obj, -
+LYCookie.obj, -
+LYCurses.obj, -
+LYDownload.obj, -
+LYEdit.obj, -
+LYEditmap.obj, -
+LYexit.obj, -
+LYForms.obj, -
+LYGetFile.obj, -
+LYHistory.obj, -
+LYJump.obj, -
+LYKeymap.obj, -
+LYLeaks.obj, -
+LYList.obj, -
+LYMail.obj, -
+LYMain.obj, -
+LYMainLoop.obj, -
+LYMap.obj, -
+LYMktime.obj, -
+LYNews.obj, -
+LYOptions.obj, -
+LYPrint.obj, -
+LYrcFile.obj, -
+LYReadCFG.obj, -
+LYSearch.obj, -
+LYSession.obj, -
+LYShowInfo.obj, -
+LYStrings.obj, -
+LYTraversal.obj, -
+LYUpload.obj, -
+LYUtils.obj, -
+Parsdate.obj, -
+TRSTable.obj, -
+UCAuto.obj, -
+UCAux.obj, -
+UCdomap.obj, -
+[-.WWW.Library.Implementation]WWWLib_'option'.olb/library 'optslibs
+$!
+$! Copy the executable to the top directory and restore the default.
+$!
+$ copy lynx.exe [-]
+$ set def [-]
+$!
+$ v1 = f$verify(v0)
+$!
+$! Issue message on how to include LYNX.HLP in the system HELP library
+$!
+$ write sys$output ""
+$ write sys$output " To install or update lynx.hlp in the system HELP library,"
+$ write sys$output " use:"
+$ write sys$output " library/replace sys$help:helplib.hlb lynx.hlp"
+$ write sys$output ""
+$!
+$ CLEANUP:
+$ v1 = f$verify(v0)
+$ set default 'where'
+$ write sys$output "Default directory:"
+$ show default
+$ v1 = f$verify(v)
+$ exit
diff --git a/clean.com b/clean.com
new file mode 100644
index 0000000..8a1fa20
--- /dev/null
+++ b/clean.com
@@ -0,0 +1,22 @@
+$! Command file to remove files created by build.com -T.Dickey
+$ set noverify
+$ delete [...]*.obj;*
+$ delete [...]*.olb;*
+$ delete [...]*.lis;*
+$ delete [...]*.map;*
+$ delete [...]*.exe;*
+$
+$ name = ""
+$ loop_tbl :
+$ last = name
+$ name = F$SEARCH("[.src.chrtrans]*.tbl;",1)
+$ if name .nes. "" .and. name .nes. last
+$ then
+$ head = "[.src.chrtrans]" + F$PARSE(name,,,"NAME","SYNTAX_ONLY") + ".h"
+$ if f$search("''head'",2) .nes. ""
+$ then
+$ write sys$output "head " + head
+$ delete 'head;*
+$ endif
+$ goto loop_tbl
+$ endif
diff --git a/config.guess b/config.guess
new file mode 100755
index 0000000..a419d86
--- /dev/null
+++ b/config.guess
@@ -0,0 +1,1768 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+# Copyright 1992-2022 Free Software Foundation, Inc.
+
+# shellcheck disable=SC2006,SC2268 # see below for rationale
+
+timestamp='2022-08-01'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <https://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that
+# program. This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
+#
+# Originally written by Per Bothner; maintained since 2000 by Ben Elliston.
+#
+# You can get the latest version of this script from:
+# https://git.savannah.gnu.org/cgit/config.git/plain/config.guess
+#
+# Please send patches to <config-patches@gnu.org>.
+
+
+# The "shellcheck disable" line above the timestamp inhibits complaints
+# about features and limitations of the classic Bourne shell that were
+# superseded or lifted in POSIX. However, this script identifies a wide
+# variety of pre-POSIX systems that do not have POSIX shells at all, and
+# even some reasonably current systems (Solaris 10 as case-in-point) still
+# have a pre-POSIX /bin/sh.
+
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Options:
+ -h, --help print this help, then exit
+ -t, --time-stamp print date of last modification, then exit
+ -v, --version print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright 1992-2022 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+ case $1 in
+ --time-stamp | --time* | -t )
+ echo "$timestamp" ; exit ;;
+ --version | -v )
+ echo "$version" ; exit ;;
+ --help | --h* | -h )
+ echo "$usage"; exit ;;
+ -- ) # Stop option processing
+ shift; break ;;
+ - ) # Use stdin as input.
+ break ;;
+ -* )
+ echo "$me: invalid option $1$help" >&2
+ exit 1 ;;
+ * )
+ break ;;
+ esac
+done
+
+if test $# != 0; then
+ echo "$me: too many arguments$help" >&2
+ exit 1
+fi
+
+# Just in case it came from the environment.
+GUESS=
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+tmp=
+# shellcheck disable=SC2172
+trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15
+
+set_cc_for_build() {
+ # prevent multiple calls if $tmp is already set
+ test "$tmp" && return 0
+ : "${TMPDIR=/tmp}"
+ # shellcheck disable=SC2039,SC3028
+ { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; }
+ dummy=$tmp/dummy
+ case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in
+ ,,) echo "int x;" > "$dummy.c"
+ for driver in cc gcc c89 c99 ; do
+ if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then
+ CC_FOR_BUILD=$driver
+ break
+ fi
+ done
+ if test x"$CC_FOR_BUILD" = x ; then
+ CC_FOR_BUILD=no_compiler_found
+ fi
+ ;;
+ ,,*) CC_FOR_BUILD=$CC ;;
+ ,*,*) CC_FOR_BUILD=$HOST_CC ;;
+ esac
+}
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if test -f /.attbin/uname ; then
+ PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+case $UNAME_SYSTEM in
+Linux|GNU|GNU/*)
+ LIBC=unknown
+
+ set_cc_for_build
+ cat <<-EOF > "$dummy.c"
+ #include <features.h>
+ #if defined(__UCLIBC__)
+ LIBC=uclibc
+ #elif defined(__dietlibc__)
+ LIBC=dietlibc
+ #elif defined(__GLIBC__)
+ LIBC=gnu
+ #else
+ #include <stdarg.h>
+ /* First heuristic to detect musl libc. */
+ #ifdef __DEFINED_va_list
+ LIBC=musl
+ #endif
+ #endif
+ EOF
+ cc_set_libc=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`
+ eval "$cc_set_libc"
+
+ # Second heuristic to detect musl libc.
+ if [ "$LIBC" = unknown ] &&
+ command -v ldd >/dev/null &&
+ ldd --version 2>&1 | grep -q ^musl; then
+ LIBC=musl
+ fi
+
+ # If the system lacks a compiler, then just pick glibc.
+ # We could probably try harder.
+ if [ "$LIBC" = unknown ]; then
+ LIBC=gnu
+ fi
+ ;;
+esac
+
+# Note: order is significant - the case branches are not exclusive.
+
+case $UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION in
+ *:NetBSD:*:*)
+ # NetBSD (nbsd) targets should (where applicable) match one or
+ # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,
+ # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently
+ # switched to ELF, *-*-netbsd* would select the old
+ # object file format. This provides both forward
+ # compatibility and a consistent mechanism for selecting the
+ # object file format.
+ #
+ # Note: NetBSD doesn't particularly care about the vendor
+ # portion of the name. We always set it to "unknown".
+ UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \
+ /sbin/sysctl -n hw.machine_arch 2>/dev/null || \
+ /usr/sbin/sysctl -n hw.machine_arch 2>/dev/null || \
+ echo unknown)`
+ case $UNAME_MACHINE_ARCH in
+ aarch64eb) machine=aarch64_be-unknown ;;
+ armeb) machine=armeb-unknown ;;
+ arm*) machine=arm-unknown ;;
+ sh3el) machine=shl-unknown ;;
+ sh3eb) machine=sh-unknown ;;
+ sh5el) machine=sh5le-unknown ;;
+ earmv*)
+ arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'`
+ endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'`
+ machine=${arch}${endian}-unknown
+ ;;
+ *) machine=$UNAME_MACHINE_ARCH-unknown ;;
+ esac
+ # The Operating System including object format, if it has switched
+ # to ELF recently (or will in the future) and ABI.
+ case $UNAME_MACHINE_ARCH in
+ earm*)
+ os=netbsdelf
+ ;;
+ arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+ set_cc_for_build
+ if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep -q __ELF__
+ then
+ # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+ # Return netbsd for either. FIX?
+ os=netbsd
+ else
+ os=netbsdelf
+ fi
+ ;;
+ *)
+ os=netbsd
+ ;;
+ esac
+ # Determine ABI tags.
+ case $UNAME_MACHINE_ARCH in
+ earm*)
+ expr='s/^earmv[0-9]/-eabi/;s/eb$//'
+ abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"`
+ ;;
+ esac
+ # The OS release
+ # Debian GNU/NetBSD machines have a different userland, and
+ # thus, need a distinct triplet. However, they do not need
+ # kernel version information, so it can be replaced with a
+ # suitable tag, in the style of linux-gnu.
+ case $UNAME_VERSION in
+ Debian*)
+ release='-gnu'
+ ;;
+ *)
+ release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2`
+ ;;
+ esac
+ # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+ # contains redundant information, the shorter form:
+ # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+ GUESS=$machine-${os}${release}${abi-}
+ ;;
+ *:Bitrig:*:*)
+ UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
+ GUESS=$UNAME_MACHINE_ARCH-unknown-bitrig$UNAME_RELEASE
+ ;;
+ *:OpenBSD:*:*)
+ UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+ GUESS=$UNAME_MACHINE_ARCH-unknown-openbsd$UNAME_RELEASE
+ ;;
+ *:SecBSD:*:*)
+ UNAME_MACHINE_ARCH=`arch | sed 's/SecBSD.//'`
+ GUESS=$UNAME_MACHINE_ARCH-unknown-secbsd$UNAME_RELEASE
+ ;;
+ *:LibertyBSD:*:*)
+ UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'`
+ GUESS=$UNAME_MACHINE_ARCH-unknown-libertybsd$UNAME_RELEASE
+ ;;
+ *:MidnightBSD:*:*)
+ GUESS=$UNAME_MACHINE-unknown-midnightbsd$UNAME_RELEASE
+ ;;
+ *:ekkoBSD:*:*)
+ GUESS=$UNAME_MACHINE-unknown-ekkobsd$UNAME_RELEASE
+ ;;
+ *:SolidBSD:*:*)
+ GUESS=$UNAME_MACHINE-unknown-solidbsd$UNAME_RELEASE
+ ;;
+ *:OS108:*:*)
+ GUESS=$UNAME_MACHINE-unknown-os108_$UNAME_RELEASE
+ ;;
+ macppc:MirBSD:*:*)
+ GUESS=powerpc-unknown-mirbsd$UNAME_RELEASE
+ ;;
+ *:MirBSD:*:*)
+ GUESS=$UNAME_MACHINE-unknown-mirbsd$UNAME_RELEASE
+ ;;
+ *:Sortix:*:*)
+ GUESS=$UNAME_MACHINE-unknown-sortix
+ ;;
+ *:Twizzler:*:*)
+ GUESS=$UNAME_MACHINE-unknown-twizzler
+ ;;
+ *:Redox:*:*)
+ GUESS=$UNAME_MACHINE-unknown-redox
+ ;;
+ mips:OSF1:*.*)
+ GUESS=mips-dec-osf1
+ ;;
+ alpha:OSF1:*:*)
+ # Reset EXIT trap before exiting to avoid spurious non-zero exit code.
+ trap '' 0
+ case $UNAME_RELEASE in
+ *4.0)
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+ ;;
+ *5.*)
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+ ;;
+ esac
+ # According to Compaq, /usr/sbin/psrinfo has been available on
+ # OSF/1 and Tru64 systems produced since 1995. I hope that
+ # covers most systems running today. This code pipes the CPU
+ # types through head -n 1, so we only detect the type of CPU 0.
+ ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+ case $ALPHA_CPU_TYPE in
+ "EV4 (21064)")
+ UNAME_MACHINE=alpha ;;
+ "EV4.5 (21064)")
+ UNAME_MACHINE=alpha ;;
+ "LCA4 (21066/21068)")
+ UNAME_MACHINE=alpha ;;
+ "EV5 (21164)")
+ UNAME_MACHINE=alphaev5 ;;
+ "EV5.6 (21164A)")
+ UNAME_MACHINE=alphaev56 ;;
+ "EV5.6 (21164PC)")
+ UNAME_MACHINE=alphapca56 ;;
+ "EV5.7 (21164PC)")
+ UNAME_MACHINE=alphapca57 ;;
+ "EV6 (21264)")
+ UNAME_MACHINE=alphaev6 ;;
+ "EV6.7 (21264A)")
+ UNAME_MACHINE=alphaev67 ;;
+ "EV6.8CB (21264C)")
+ UNAME_MACHINE=alphaev68 ;;
+ "EV6.8AL (21264B)")
+ UNAME_MACHINE=alphaev68 ;;
+ "EV6.8CX (21264D)")
+ UNAME_MACHINE=alphaev68 ;;
+ "EV6.9A (21264/EV69A)")
+ UNAME_MACHINE=alphaev69 ;;
+ "EV7 (21364)")
+ UNAME_MACHINE=alphaev7 ;;
+ "EV7.9 (21364A)")
+ UNAME_MACHINE=alphaev79 ;;
+ esac
+ # A Pn.n version is a patched version.
+ # A Vn.n version is a released version.
+ # A Tn.n version is a released field test version.
+ # A Xn.n version is an unreleased experimental baselevel.
+ # 1.2 uses "1.2" for uname -r.
+ OSF_REL=`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
+ GUESS=$UNAME_MACHINE-dec-osf$OSF_REL
+ ;;
+ Amiga*:UNIX_System_V:4.0:*)
+ GUESS=m68k-unknown-sysv4
+ ;;
+ *:[Aa]miga[Oo][Ss]:*:*)
+ GUESS=$UNAME_MACHINE-unknown-amigaos
+ ;;
+ *:[Mm]orph[Oo][Ss]:*:*)
+ GUESS=$UNAME_MACHINE-unknown-morphos
+ ;;
+ *:OS/390:*:*)
+ GUESS=i370-ibm-openedition
+ ;;
+ *:z/VM:*:*)
+ GUESS=s390-ibm-zvmoe
+ ;;
+ *:OS400:*:*)
+ GUESS=powerpc-ibm-os400
+ ;;
+ arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+ GUESS=arm-acorn-riscix$UNAME_RELEASE
+ ;;
+ arm*:riscos:*:*|arm*:RISCOS:*:*)
+ GUESS=arm-unknown-riscos
+ ;;
+ SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+ GUESS=hppa1.1-hitachi-hiuxmpp
+ ;;
+ Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+ # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+ case `(/bin/universe) 2>/dev/null` in
+ att) GUESS=pyramid-pyramid-sysv3 ;;
+ *) GUESS=pyramid-pyramid-bsd ;;
+ esac
+ ;;
+ NILE*:*:*:dcosx)
+ GUESS=pyramid-pyramid-svr4
+ ;;
+ DRS?6000:unix:4.0:6*)
+ GUESS=sparc-icl-nx6
+ ;;
+ DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+ case `/usr/bin/uname -p` in
+ sparc) GUESS=sparc-icl-nx7 ;;
+ esac
+ ;;
+ s390x:SunOS:*:*)
+ SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+ GUESS=$UNAME_MACHINE-ibm-solaris2$SUN_REL
+ ;;
+ sun4H:SunOS:5.*:*)
+ SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+ GUESS=sparc-hal-solaris2$SUN_REL
+ ;;
+ sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+ SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+ GUESS=sparc-sun-solaris2$SUN_REL
+ ;;
+ i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
+ GUESS=i386-pc-auroraux$UNAME_RELEASE
+ ;;
+ i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
+ set_cc_for_build
+ SUN_ARCH=i386
+ # If there is a compiler, see if it is configured for 64-bit objects.
+ # Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
+ # This test works for both compilers.
+ if test "$CC_FOR_BUILD" != no_compiler_found; then
+ if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
+ (CCOPTS="" $CC_FOR_BUILD -m64 -E - 2>/dev/null) | \
+ grep IS_64BIT_ARCH >/dev/null
+ then
+ SUN_ARCH=x86_64
+ fi
+ fi
+ SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+ GUESS=$SUN_ARCH-pc-solaris2$SUN_REL
+ ;;
+ sun4*:SunOS:6*:*)
+ # According to config.sub, this is the proper way to canonicalize
+ # SunOS6. Hard to guess exactly what SunOS6 will be like, but
+ # it's likely to be more like Solaris than SunOS4.
+ SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+ GUESS=sparc-sun-solaris3$SUN_REL
+ ;;
+ sun4*:SunOS:*:*)
+ case `/usr/bin/arch -k` in
+ Series*|S4*)
+ UNAME_RELEASE=`uname -v`
+ ;;
+ esac
+ # Japanese Language versions have a version number like `4.1.3-JL'.
+ SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/'`
+ GUESS=sparc-sun-sunos$SUN_REL
+ ;;
+ sun3*:SunOS:*:*)
+ GUESS=m68k-sun-sunos$UNAME_RELEASE
+ ;;
+ sun*:*:4.2BSD:*)
+ UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+ test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3
+ case `/bin/arch` in
+ sun3)
+ GUESS=m68k-sun-sunos$UNAME_RELEASE
+ ;;
+ sun4)
+ GUESS=sparc-sun-sunos$UNAME_RELEASE
+ ;;
+ esac
+ ;;
+ aushp:SunOS:*:*)
+ GUESS=sparc-auspex-sunos$UNAME_RELEASE
+ ;;
+ # The situation for MiNT is a little confusing. The machine name
+ # can be virtually everything (everything which is not
+ # "atarist" or "atariste" at least should have a processor
+ # > m68000). The system name ranges from "MiNT" over "FreeMiNT"
+ # to the lowercase version "mint" (or "freemint"). Finally
+ # the system name "TOS" denotes a system which is actually not
+ # MiNT. But MiNT is downward compatible to TOS, so this should
+ # be no problem.
+ atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+ GUESS=m68k-atari-mint$UNAME_RELEASE
+ ;;
+ atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+ GUESS=m68k-atari-mint$UNAME_RELEASE
+ ;;
+ *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+ GUESS=m68k-atari-mint$UNAME_RELEASE
+ ;;
+ milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+ GUESS=m68k-milan-mint$UNAME_RELEASE
+ ;;
+ hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+ GUESS=m68k-hades-mint$UNAME_RELEASE
+ ;;
+ *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+ GUESS=m68k-unknown-mint$UNAME_RELEASE
+ ;;
+ m68k:machten:*:*)
+ GUESS=m68k-apple-machten$UNAME_RELEASE
+ ;;
+ powerpc:machten:*:*)
+ GUESS=powerpc-apple-machten$UNAME_RELEASE
+ ;;
+ RISC*:Mach:*:*)
+ GUESS=mips-dec-mach_bsd4.3
+ ;;
+ RISC*:ULTRIX:*:*)
+ GUESS=mips-dec-ultrix$UNAME_RELEASE
+ ;;
+ VAX*:ULTRIX*:*:*)
+ GUESS=vax-dec-ultrix$UNAME_RELEASE
+ ;;
+ 2020:CLIX:*:* | 2430:CLIX:*:*)
+ GUESS=clipper-intergraph-clix$UNAME_RELEASE
+ ;;
+ mips:*:*:UMIPS | mips:*:*:RISCos)
+ set_cc_for_build
+ sed 's/^ //' << EOF > "$dummy.c"
+#ifdef __cplusplus
+#include <stdio.h> /* for printf() prototype */
+ int main (int argc, char *argv[]) {
+#else
+ int main (argc, argv) int argc; char *argv[]; {
+#endif
+ #if defined (host_mips) && defined (MIPSEB)
+ #if defined (SYSTYPE_SYSV)
+ printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_SVR4)
+ printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+ printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0);
+ #endif
+ #endif
+ exit (-1);
+ }
+EOF
+ $CC_FOR_BUILD -o "$dummy" "$dummy.c" &&
+ dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+ SYSTEM_NAME=`"$dummy" "$dummyarg"` &&
+ { echo "$SYSTEM_NAME"; exit; }
+ GUESS=mips-mips-riscos$UNAME_RELEASE
+ ;;
+ Motorola:PowerMAX_OS:*:*)
+ GUESS=powerpc-motorola-powermax
+ ;;
+ Motorola:*:4.3:PL8-*)
+ GUESS=powerpc-harris-powermax
+ ;;
+ Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+ GUESS=powerpc-harris-powermax
+ ;;
+ Night_Hawk:Power_UNIX:*:*)
+ GUESS=powerpc-harris-powerunix
+ ;;
+ m88k:CX/UX:7*:*)
+ GUESS=m88k-harris-cxux7
+ ;;
+ m88k:*:4*:R4*)
+ GUESS=m88k-motorola-sysv4
+ ;;
+ m88k:*:3*:R3*)
+ GUESS=m88k-motorola-sysv3
+ ;;
+ AViiON:dgux:*:*)
+ # DG/UX returns AViiON for all architectures
+ UNAME_PROCESSOR=`/usr/bin/uname -p`
+ if test "$UNAME_PROCESSOR" = mc88100 || test "$UNAME_PROCESSOR" = mc88110
+ then
+ if test "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx || \
+ test "$TARGET_BINARY_INTERFACE"x = x
+ then
+ GUESS=m88k-dg-dgux$UNAME_RELEASE
+ else
+ GUESS=m88k-dg-dguxbcs$UNAME_RELEASE
+ fi
+ else
+ GUESS=i586-dg-dgux$UNAME_RELEASE
+ fi
+ ;;
+ M88*:DolphinOS:*:*) # DolphinOS (SVR3)
+ GUESS=m88k-dolphin-sysv3
+ ;;
+ M88*:*:R3*:*)
+ # Delta 88k system running SVR3
+ GUESS=m88k-motorola-sysv3
+ ;;
+ XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+ GUESS=m88k-tektronix-sysv3
+ ;;
+ Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+ GUESS=m68k-tektronix-bsd
+ ;;
+ *:IRIX*:*:*)
+ IRIX_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/g'`
+ GUESS=mips-sgi-irix$IRIX_REL
+ ;;
+ ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+ GUESS=romp-ibm-aix # uname -m gives an 8 hex-code CPU id
+ ;; # Note that: echo "'`uname -s`'" gives 'AIX '
+ i*86:AIX:*:*)
+ GUESS=i386-ibm-aix
+ ;;
+ ia64:AIX:*:*)
+ if test -x /usr/bin/oslevel ; then
+ IBM_REV=`/usr/bin/oslevel`
+ else
+ IBM_REV=$UNAME_VERSION.$UNAME_RELEASE
+ fi
+ GUESS=$UNAME_MACHINE-ibm-aix$IBM_REV
+ ;;
+ *:AIX:2:3)
+ if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+ set_cc_for_build
+ sed 's/^ //' << EOF > "$dummy.c"
+ #include <sys/systemcfg.h>
+
+ main()
+ {
+ if (!__power_pc())
+ exit(1);
+ puts("powerpc-ibm-aix3.2.5");
+ exit(0);
+ }
+EOF
+ if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"`
+ then
+ GUESS=$SYSTEM_NAME
+ else
+ GUESS=rs6000-ibm-aix3.2.5
+ fi
+ elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+ GUESS=rs6000-ibm-aix3.2.4
+ else
+ GUESS=rs6000-ibm-aix3.2
+ fi
+ ;;
+ *:AIX:*:[4567])
+ IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+ if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then
+ IBM_ARCH=rs6000
+ else
+ IBM_ARCH=powerpc
+ fi
+ if test -x /usr/bin/lslpp ; then
+ IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | \
+ awk -F: '{ print $3 }' | sed s/[0-9]*$/0/`
+ else
+ IBM_REV=$UNAME_VERSION.$UNAME_RELEASE
+ fi
+ GUESS=$IBM_ARCH-ibm-aix$IBM_REV
+ ;;
+ *:AIX:*:*)
+ GUESS=rs6000-ibm-aix
+ ;;
+ ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*)
+ GUESS=romp-ibm-bsd4.4
+ ;;
+ ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and
+ GUESS=romp-ibm-bsd$UNAME_RELEASE # 4.3 with uname added to
+ ;; # report: romp-ibm BSD 4.3
+ *:BOSX:*:*)
+ GUESS=rs6000-bull-bosx
+ ;;
+ DPX/2?00:B.O.S.:*:*)
+ GUESS=m68k-bull-sysv3
+ ;;
+ 9000/[34]??:4.3bsd:1.*:*)
+ GUESS=m68k-hp-bsd
+ ;;
+ hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+ GUESS=m68k-hp-bsd4.4
+ ;;
+ 9000/[34678]??:HP-UX:*:*)
+ HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'`
+ case $UNAME_MACHINE in
+ 9000/31?) HP_ARCH=m68000 ;;
+ 9000/[34]??) HP_ARCH=m68k ;;
+ 9000/[678][0-9][0-9])
+ if test -x /usr/bin/getconf; then
+ sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+ sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+ case $sc_cpu_version in
+ 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0
+ 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1
+ 532) # CPU_PA_RISC2_0
+ case $sc_kernel_bits in
+ 32) HP_ARCH=hppa2.0n ;;
+ 64) HP_ARCH=hppa2.0w ;;
+ '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20
+ esac ;;
+ esac
+ fi
+ if test "$HP_ARCH" = ""; then
+ set_cc_for_build
+ sed 's/^ //' << EOF > "$dummy.c"
+
+ #define _HPUX_SOURCE
+ #include <stdlib.h>
+ #include <unistd.h>
+
+ int main ()
+ {
+ #if defined(_SC_KERNEL_BITS)
+ long bits = sysconf(_SC_KERNEL_BITS);
+ #endif
+ long cpu = sysconf (_SC_CPU_VERSION);
+
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+ case CPU_PA_RISC2_0:
+ #if defined(_SC_KERNEL_BITS)
+ switch (bits)
+ {
+ case 64: puts ("hppa2.0w"); break;
+ case 32: puts ("hppa2.0n"); break;
+ default: puts ("hppa2.0"); break;
+ } break;
+ #else /* !defined(_SC_KERNEL_BITS) */
+ puts ("hppa2.0"); break;
+ #endif
+ default: puts ("hppa1.0"); break;
+ }
+ exit (0);
+ }
+EOF
+ (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"`
+ test -z "$HP_ARCH" && HP_ARCH=hppa
+ fi ;;
+ esac
+ if test "$HP_ARCH" = hppa2.0w
+ then
+ set_cc_for_build
+
+ # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+ # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler
+ # generating 64-bit code. GNU and HP use different nomenclature:
+ #
+ # $ CC_FOR_BUILD=cc ./config.guess
+ # => hppa2.0w-hp-hpux11.23
+ # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+ # => hppa64-hp-hpux11.23
+
+ if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) |
+ grep -q __LP64__
+ then
+ HP_ARCH=hppa2.0w
+ else
+ HP_ARCH=hppa64
+ fi
+ fi
+ GUESS=$HP_ARCH-hp-hpux$HPUX_REV
+ ;;
+ ia64:HP-UX:*:*)
+ HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'`
+ GUESS=ia64-hp-hpux$HPUX_REV
+ ;;
+ 3050*:HI-UX:*:*)
+ set_cc_for_build
+ sed 's/^ //' << EOF > "$dummy.c"
+ #include <unistd.h>
+ int
+ main ()
+ {
+ long cpu = sysconf (_SC_CPU_VERSION);
+ /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+ true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct
+ results, however. */
+ if (CPU_IS_PA_RISC (cpu))
+ {
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+ default: puts ("hppa-hitachi-hiuxwe2"); break;
+ }
+ }
+ else if (CPU_IS_HP_MC68K (cpu))
+ puts ("m68k-hitachi-hiuxwe2");
+ else puts ("unknown-hitachi-hiuxwe2");
+ exit (0);
+ }
+EOF
+ $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` &&
+ { echo "$SYSTEM_NAME"; exit; }
+ GUESS=unknown-hitachi-hiuxwe2
+ ;;
+ 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*)
+ GUESS=hppa1.1-hp-bsd
+ ;;
+ 9000/8??:4.3bsd:*:*)
+ GUESS=hppa1.0-hp-bsd
+ ;;
+ *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+ GUESS=hppa1.0-hp-mpeix
+ ;;
+ hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*)
+ GUESS=hppa1.1-hp-osf
+ ;;
+ hp8??:OSF1:*:*)
+ GUESS=hppa1.0-hp-osf
+ ;;
+ i*86:OSF1:*:*)
+ if test -x /usr/sbin/sysversion ; then
+ GUESS=$UNAME_MACHINE-unknown-osf1mk
+ else
+ GUESS=$UNAME_MACHINE-unknown-osf1
+ fi
+ ;;
+ parisc*:Lites*:*:*)
+ GUESS=hppa1.1-hp-lites
+ ;;
+ C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+ GUESS=c1-convex-bsd
+ ;;
+ C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit ;;
+ C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+ GUESS=c34-convex-bsd
+ ;;
+ C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+ GUESS=c38-convex-bsd
+ ;;
+ C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+ GUESS=c4-convex-bsd
+ ;;
+ CRAY*Y-MP:*:*:*)
+ CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`
+ GUESS=ymp-cray-unicos$CRAY_REL
+ ;;
+ CRAY*[A-Z]90:*:*:*)
+ echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \
+ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+ -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*TS:*:*:*)
+ CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`
+ GUESS=t90-cray-unicos$CRAY_REL
+ ;;
+ CRAY*T3E:*:*:*)
+ CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`
+ GUESS=alphaev5-cray-unicosmk$CRAY_REL
+ ;;
+ CRAY*SV1:*:*:*)
+ CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`
+ GUESS=sv1-cray-unicos$CRAY_REL
+ ;;
+ *:UNICOS/mp:*:*)
+ CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`
+ GUESS=craynv-cray-unicosmp$CRAY_REL
+ ;;
+ F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+ FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
+ FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
+ FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'`
+ GUESS=${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}
+ ;;
+ 5000:UNIX_System_V:4.*:*)
+ FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
+ FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'`
+ GUESS=sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}
+ ;;
+ i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+ GUESS=$UNAME_MACHINE-pc-bsdi$UNAME_RELEASE
+ ;;
+ sparc*:BSD/OS:*:*)
+ GUESS=sparc-unknown-bsdi$UNAME_RELEASE
+ ;;
+ *:BSD/OS:*:*)
+ GUESS=$UNAME_MACHINE-unknown-bsdi$UNAME_RELEASE
+ ;;
+ arm:FreeBSD:*:*)
+ UNAME_PROCESSOR=`uname -p`
+ set_cc_for_build
+ if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep -q __ARM_PCS_VFP
+ then
+ FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
+ GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabi
+ else
+ FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
+ GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabihf
+ fi
+ ;;
+ *:FreeBSD:*:*)
+ UNAME_PROCESSOR=`/usr/bin/uname -p`
+ case $UNAME_PROCESSOR in
+ amd64)
+ UNAME_PROCESSOR=x86_64 ;;
+ i386)
+ UNAME_PROCESSOR=i586 ;;
+ esac
+ FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
+ GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL
+ ;;
+ i*:CYGWIN*:*)
+ GUESS=$UNAME_MACHINE-pc-cygwin
+ ;;
+ *:MINGW64*:*)
+ GUESS=$UNAME_MACHINE-pc-mingw64
+ ;;
+ *:MINGW*:*)
+ GUESS=$UNAME_MACHINE-pc-mingw32
+ ;;
+ *:MSYS*:*)
+ GUESS=$UNAME_MACHINE-pc-msys
+ ;;
+ i*:PW*:*)
+ GUESS=$UNAME_MACHINE-pc-pw32
+ ;;
+ *:SerenityOS:*:*)
+ GUESS=$UNAME_MACHINE-pc-serenity
+ ;;
+ *:Interix*:*)
+ case $UNAME_MACHINE in
+ x86)
+ GUESS=i586-pc-interix$UNAME_RELEASE
+ ;;
+ authenticamd | genuineintel | EM64T)
+ GUESS=x86_64-unknown-interix$UNAME_RELEASE
+ ;;
+ IA64)
+ GUESS=ia64-unknown-interix$UNAME_RELEASE
+ ;;
+ esac ;;
+ i*:UWIN*:*)
+ GUESS=$UNAME_MACHINE-pc-uwin
+ ;;
+ amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+ GUESS=x86_64-pc-cygwin
+ ;;
+ prep*:SunOS:5.*:*)
+ SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+ GUESS=powerpcle-unknown-solaris2$SUN_REL
+ ;;
+ *:GNU:*:*)
+ # the GNU system
+ GNU_ARCH=`echo "$UNAME_MACHINE" | sed -e 's,[-/].*$,,'`
+ GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's,/.*$,,'`
+ GUESS=$GNU_ARCH-unknown-$LIBC$GNU_REL
+ ;;
+ *:GNU/*:*:*)
+ # other systems with GNU libc and userland
+ GNU_SYS=`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"`
+ GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
+ GUESS=$UNAME_MACHINE-unknown-$GNU_SYS$GNU_REL-$LIBC
+ ;;
+ *:Minix:*:*)
+ GUESS=$UNAME_MACHINE-unknown-minix
+ ;;
+ aarch64:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ aarch64_be:Linux:*:*)
+ UNAME_MACHINE=aarch64_be
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ alpha:Linux:*:*)
+ case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null` in
+ EV5) UNAME_MACHINE=alphaev5 ;;
+ EV56) UNAME_MACHINE=alphaev56 ;;
+ PCA56) UNAME_MACHINE=alphapca56 ;;
+ PCA57) UNAME_MACHINE=alphapca56 ;;
+ EV6) UNAME_MACHINE=alphaev6 ;;
+ EV67) UNAME_MACHINE=alphaev67 ;;
+ EV68*) UNAME_MACHINE=alphaev68 ;;
+ esac
+ objdump --private-headers /bin/sh | grep -q ld.so.1
+ if test "$?" = 0 ; then LIBC=gnulibc1 ; fi
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ arc:Linux:*:* | arceb:Linux:*:* | arc32:Linux:*:* | arc64:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ arm*:Linux:*:*)
+ set_cc_for_build
+ if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep -q __ARM_EABI__
+ then
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ else
+ if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep -q __ARM_PCS_VFP
+ then
+ GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabi
+ else
+ GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabihf
+ fi
+ fi
+ ;;
+ avr32*:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ cris:Linux:*:*)
+ GUESS=$UNAME_MACHINE-axis-linux-$LIBC
+ ;;
+ crisv32:Linux:*:*)
+ GUESS=$UNAME_MACHINE-axis-linux-$LIBC
+ ;;
+ e2k:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ frv:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ hexagon:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ i*86:Linux:*:*)
+ GUESS=$UNAME_MACHINE-pc-linux-$LIBC
+ ;;
+ ia64:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ k1om:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ loongarch32:Linux:*:* | loongarch64:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ m32r*:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ m68*:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ mips:Linux:*:* | mips64:Linux:*:*)
+ set_cc_for_build
+ IS_GLIBC=0
+ test x"${LIBC}" = xgnu && IS_GLIBC=1
+ sed 's/^ //' << EOF > "$dummy.c"
+ #undef CPU
+ #undef mips
+ #undef mipsel
+ #undef mips64
+ #undef mips64el
+ #if ${IS_GLIBC} && defined(_ABI64)
+ LIBCABI=gnuabi64
+ #else
+ #if ${IS_GLIBC} && defined(_ABIN32)
+ LIBCABI=gnuabin32
+ #else
+ LIBCABI=${LIBC}
+ #endif
+ #endif
+
+ #if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6
+ CPU=mipsisa64r6
+ #else
+ #if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6
+ CPU=mipsisa32r6
+ #else
+ #if defined(__mips64)
+ CPU=mips64
+ #else
+ CPU=mips
+ #endif
+ #endif
+ #endif
+
+ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+ MIPS_ENDIAN=el
+ #else
+ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+ MIPS_ENDIAN=
+ #else
+ MIPS_ENDIAN=
+ #endif
+ #endif
+EOF
+ cc_set_vars=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'`
+ eval "$cc_set_vars"
+ test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; }
+ ;;
+ mips64el:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ openrisc*:Linux:*:*)
+ GUESS=or1k-unknown-linux-$LIBC
+ ;;
+ or32:Linux:*:* | or1k*:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ padre:Linux:*:*)
+ GUESS=sparc-unknown-linux-$LIBC
+ ;;
+ parisc64:Linux:*:* | hppa64:Linux:*:*)
+ GUESS=hppa64-unknown-linux-$LIBC
+ ;;
+ parisc:Linux:*:* | hppa:Linux:*:*)
+ # Look for CPU level
+ case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+ PA7*) GUESS=hppa1.1-unknown-linux-$LIBC ;;
+ PA8*) GUESS=hppa2.0-unknown-linux-$LIBC ;;
+ *) GUESS=hppa-unknown-linux-$LIBC ;;
+ esac
+ ;;
+ ppc64:Linux:*:*)
+ GUESS=powerpc64-unknown-linux-$LIBC
+ ;;
+ ppc:Linux:*:*)
+ GUESS=powerpc-unknown-linux-$LIBC
+ ;;
+ ppc64le:Linux:*:*)
+ GUESS=powerpc64le-unknown-linux-$LIBC
+ ;;
+ ppcle:Linux:*:*)
+ GUESS=powerpcle-unknown-linux-$LIBC
+ ;;
+ riscv32:Linux:*:* | riscv32be:Linux:*:* | riscv64:Linux:*:* | riscv64be:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ s390:Linux:*:* | s390x:Linux:*:*)
+ GUESS=$UNAME_MACHINE-ibm-linux-$LIBC
+ ;;
+ sh64*:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ sh*:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ sparc:Linux:*:* | sparc64:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ tile*:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ vax:Linux:*:*)
+ GUESS=$UNAME_MACHINE-dec-linux-$LIBC
+ ;;
+ x86_64:Linux:*:*)
+ set_cc_for_build
+ CPU=$UNAME_MACHINE
+ LIBCABI=$LIBC
+ if test "$CC_FOR_BUILD" != no_compiler_found; then
+ ABI=64
+ sed 's/^ //' << EOF > "$dummy.c"
+ #ifdef __i386__
+ ABI=x86
+ #else
+ #ifdef __ILP32__
+ ABI=x32
+ #endif
+ #endif
+EOF
+ cc_set_abi=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^ABI' | sed 's, ,,g'`
+ eval "$cc_set_abi"
+ case $ABI in
+ x86) CPU=i686 ;;
+ x32) LIBCABI=${LIBC}x32 ;;
+ esac
+ fi
+ GUESS=$CPU-pc-linux-$LIBCABI
+ ;;
+ xtensa*:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ i*86:DYNIX/ptx:4*:*)
+ # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+ # earlier versions are messed up and put the nodename in both
+ # sysname and nodename.
+ GUESS=i386-sequent-sysv4
+ ;;
+ i*86:UNIX_SV:4.2MP:2.*)
+ # Unixware is an offshoot of SVR4, but it has its own version
+ # number series starting with 2...
+ # I am not positive that other SVR4 systems won't match this,
+ # I just have to hope. -- rms.
+ # Use sysv4.2uw... so that sysv4* matches it.
+ GUESS=$UNAME_MACHINE-pc-sysv4.2uw$UNAME_VERSION
+ ;;
+ i*86:OS/2:*:*)
+ # If we were able to find `uname', then EMX Unix compatibility
+ # is probably installed.
+ GUESS=$UNAME_MACHINE-pc-os2-emx
+ ;;
+ i*86:XTS-300:*:STOP)
+ GUESS=$UNAME_MACHINE-unknown-stop
+ ;;
+ i*86:atheos:*:*)
+ GUESS=$UNAME_MACHINE-unknown-atheos
+ ;;
+ i*86:syllable:*:*)
+ GUESS=$UNAME_MACHINE-pc-syllable
+ ;;
+ i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
+ GUESS=i386-unknown-lynxos$UNAME_RELEASE
+ ;;
+ i*86:*DOS:*:*)
+ GUESS=$UNAME_MACHINE-pc-msdosdjgpp
+ ;;
+ i*86:*:4.*:*)
+ UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'`
+ if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+ GUESS=$UNAME_MACHINE-univel-sysv$UNAME_REL
+ else
+ GUESS=$UNAME_MACHINE-pc-sysv$UNAME_REL
+ fi
+ ;;
+ i*86:*:5:[678]*)
+ # UnixWare 7.x, OpenUNIX and OpenServer 6.
+ case `/bin/uname -X | grep "^Machine"` in
+ *486*) UNAME_MACHINE=i486 ;;
+ *Pentium) UNAME_MACHINE=i586 ;;
+ *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+ esac
+ GUESS=$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+ ;;
+ i*86:*:3.2:*)
+ if test -f /usr/options/cb.name; then
+ UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+ GUESS=$UNAME_MACHINE-pc-isc$UNAME_REL
+ elif /bin/uname -X 2>/dev/null >/dev/null ; then
+ UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+ (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+ (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+ && UNAME_MACHINE=i586
+ (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+ && UNAME_MACHINE=i686
+ (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+ && UNAME_MACHINE=i686
+ GUESS=$UNAME_MACHINE-pc-sco$UNAME_REL
+ else
+ GUESS=$UNAME_MACHINE-pc-sysv32
+ fi
+ ;;
+ pc:*:*:*)
+ # Left here for compatibility:
+ # uname -m prints for DJGPP always 'pc', but it prints nothing about
+ # the processor, so we play safe by assuming i586.
+ # Note: whatever this is, it MUST be the same as what config.sub
+ # prints for the "djgpp" host, or else GDB configure will decide that
+ # this is a cross-build.
+ GUESS=i586-pc-msdosdjgpp
+ ;;
+ Intel:Mach:3*:*)
+ GUESS=i386-pc-mach3
+ ;;
+ paragon:*:*:*)
+ GUESS=i860-intel-osf1
+ ;;
+ i860:*:4.*:*) # i860-SVR4
+ if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+ GUESS=i860-stardent-sysv$UNAME_RELEASE # Stardent Vistra i860-SVR4
+ else # Add other i860-SVR4 vendors below as they are discovered.
+ GUESS=i860-unknown-sysv$UNAME_RELEASE # Unknown i860-SVR4
+ fi
+ ;;
+ mini*:CTIX:SYS*5:*)
+ # "miniframe"
+ GUESS=m68010-convergent-sysv
+ ;;
+ mc68k:UNIX:SYSTEM5:3.51m)
+ GUESS=m68k-convergent-sysv
+ ;;
+ M680?0:D-NIX:5.3:*)
+ GUESS=m68k-diab-dnix
+ ;;
+ M68*:*:R3V[5678]*:*)
+ test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+ 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
+ OS_REL=''
+ test -r /etc/.relid \
+ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && { echo i486-ncr-sysv4.3"$OS_REL"; exit; }
+ /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;;
+ 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && { echo i486-ncr-sysv4; exit; } ;;
+ NCR*:*:4.2:* | MPRAS*:*:4.2:*)
+ OS_REL='.3'
+ test -r /etc/.relid \
+ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && { echo i486-ncr-sysv4.3"$OS_REL"; exit; }
+ /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; }
+ /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
+ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;;
+ m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+ GUESS=m68k-unknown-lynxos$UNAME_RELEASE
+ ;;
+ mc68030:UNIX_System_V:4.*:*)
+ GUESS=m68k-atari-sysv4
+ ;;
+ TSUNAMI:LynxOS:2.*:*)
+ GUESS=sparc-unknown-lynxos$UNAME_RELEASE
+ ;;
+ rs6000:LynxOS:2.*:*)
+ GUESS=rs6000-unknown-lynxos$UNAME_RELEASE
+ ;;
+ PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
+ GUESS=powerpc-unknown-lynxos$UNAME_RELEASE
+ ;;
+ SM[BE]S:UNIX_SV:*:*)
+ GUESS=mips-dde-sysv$UNAME_RELEASE
+ ;;
+ RM*:ReliantUNIX-*:*:*)
+ GUESS=mips-sni-sysv4
+ ;;
+ RM*:SINIX-*:*:*)
+ GUESS=mips-sni-sysv4
+ ;;
+ *:SINIX-*:*:*)
+ if uname -p 2>/dev/null >/dev/null ; then
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ GUESS=$UNAME_MACHINE-sni-sysv4
+ else
+ GUESS=ns32k-sni-sysv
+ fi
+ ;;
+ PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+ # says <Richard.M.Bartel@ccMail.Census.GOV>
+ GUESS=i586-unisys-sysv4
+ ;;
+ *:UNIX_System_V:4*:FTX*)
+ # From Gerald Hewes <hewes@openmarket.com>.
+ # How about differentiating between stratus architectures? -djm
+ GUESS=hppa1.1-stratus-sysv4
+ ;;
+ *:*:*:FTX*)
+ # From seanf@swdc.stratus.com.
+ GUESS=i860-stratus-sysv4
+ ;;
+ i*86:VOS:*:*)
+ # From Paul.Green@stratus.com.
+ GUESS=$UNAME_MACHINE-stratus-vos
+ ;;
+ *:VOS:*:*)
+ # From Paul.Green@stratus.com.
+ GUESS=hppa1.1-stratus-vos
+ ;;
+ mc68*:A/UX:*:*)
+ GUESS=m68k-apple-aux$UNAME_RELEASE
+ ;;
+ news*:NEWS-OS:6*:*)
+ GUESS=mips-sony-newsos6
+ ;;
+ R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+ if test -d /usr/nec; then
+ GUESS=mips-nec-sysv$UNAME_RELEASE
+ else
+ GUESS=mips-unknown-sysv$UNAME_RELEASE
+ fi
+ ;;
+ BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only.
+ GUESS=powerpc-be-beos
+ ;;
+ BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only.
+ GUESS=powerpc-apple-beos
+ ;;
+ BePC:BeOS:*:*) # BeOS running on Intel PC compatible.
+ GUESS=i586-pc-beos
+ ;;
+ BePC:Haiku:*:*) # Haiku running on Intel PC compatible.
+ GUESS=i586-pc-haiku
+ ;;
+ ppc:Haiku:*:*) # Haiku running on Apple PowerPC
+ GUESS=powerpc-apple-haiku
+ ;;
+ *:Haiku:*:*) # Haiku modern gcc (not bound by BeOS compat)
+ GUESS=$UNAME_MACHINE-unknown-haiku
+ ;;
+ SX-4:SUPER-UX:*:*)
+ GUESS=sx4-nec-superux$UNAME_RELEASE
+ ;;
+ SX-5:SUPER-UX:*:*)
+ GUESS=sx5-nec-superux$UNAME_RELEASE
+ ;;
+ SX-6:SUPER-UX:*:*)
+ GUESS=sx6-nec-superux$UNAME_RELEASE
+ ;;
+ SX-7:SUPER-UX:*:*)
+ GUESS=sx7-nec-superux$UNAME_RELEASE
+ ;;
+ SX-8:SUPER-UX:*:*)
+ GUESS=sx8-nec-superux$UNAME_RELEASE
+ ;;
+ SX-8R:SUPER-UX:*:*)
+ GUESS=sx8r-nec-superux$UNAME_RELEASE
+ ;;
+ SX-ACE:SUPER-UX:*:*)
+ GUESS=sxace-nec-superux$UNAME_RELEASE
+ ;;
+ Power*:Rhapsody:*:*)
+ GUESS=powerpc-apple-rhapsody$UNAME_RELEASE
+ ;;
+ *:Rhapsody:*:*)
+ GUESS=$UNAME_MACHINE-apple-rhapsody$UNAME_RELEASE
+ ;;
+ arm64:Darwin:*:*)
+ GUESS=aarch64-apple-darwin$UNAME_RELEASE
+ ;;
+ *:Darwin:*:*)
+ UNAME_PROCESSOR=`uname -p`
+ case $UNAME_PROCESSOR in
+ unknown) UNAME_PROCESSOR=powerpc ;;
+ esac
+ if command -v xcode-select > /dev/null 2> /dev/null && \
+ ! xcode-select --print-path > /dev/null 2> /dev/null ; then
+ # Avoid executing cc if there is no toolchain installed as
+ # cc will be a stub that puts up a graphical alert
+ # prompting the user to install developer tools.
+ CC_FOR_BUILD=no_compiler_found
+ else
+ set_cc_for_build
+ fi
+ if test "$CC_FOR_BUILD" != no_compiler_found; then
+ if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+ grep IS_64BIT_ARCH >/dev/null
+ then
+ case $UNAME_PROCESSOR in
+ i386) UNAME_PROCESSOR=x86_64 ;;
+ powerpc) UNAME_PROCESSOR=powerpc64 ;;
+ esac
+ fi
+ # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc
+ if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \
+ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+ grep IS_PPC >/dev/null
+ then
+ UNAME_PROCESSOR=powerpc
+ fi
+ elif test "$UNAME_PROCESSOR" = i386 ; then
+ # uname -m returns i386 or x86_64
+ UNAME_PROCESSOR=$UNAME_MACHINE
+ fi
+ GUESS=$UNAME_PROCESSOR-apple-darwin$UNAME_RELEASE
+ ;;
+ *:procnto*:*:* | *:QNX:[0123456789]*:*)
+ UNAME_PROCESSOR=`uname -p`
+ if test "$UNAME_PROCESSOR" = x86; then
+ UNAME_PROCESSOR=i386
+ UNAME_MACHINE=pc
+ fi
+ GUESS=$UNAME_PROCESSOR-$UNAME_MACHINE-nto-qnx$UNAME_RELEASE
+ ;;
+ *:QNX:*:4*)
+ GUESS=i386-pc-qnx
+ ;;
+ NEO-*:NONSTOP_KERNEL:*:*)
+ GUESS=neo-tandem-nsk$UNAME_RELEASE
+ ;;
+ NSE-*:NONSTOP_KERNEL:*:*)
+ GUESS=nse-tandem-nsk$UNAME_RELEASE
+ ;;
+ NSR-*:NONSTOP_KERNEL:*:*)
+ GUESS=nsr-tandem-nsk$UNAME_RELEASE
+ ;;
+ NSV-*:NONSTOP_KERNEL:*:*)
+ GUESS=nsv-tandem-nsk$UNAME_RELEASE
+ ;;
+ NSX-*:NONSTOP_KERNEL:*:*)
+ GUESS=nsx-tandem-nsk$UNAME_RELEASE
+ ;;
+ *:NonStop-UX:*:*)
+ GUESS=mips-compaq-nonstopux
+ ;;
+ BS2000:POSIX*:*:*)
+ GUESS=bs2000-siemens-sysv
+ ;;
+ DS/*:UNIX_System_V:*:*)
+ GUESS=$UNAME_MACHINE-$UNAME_SYSTEM-$UNAME_RELEASE
+ ;;
+ *:Plan9:*:*)
+ # "uname -m" is not consistent, so use $cputype instead. 386
+ # is converted to i386 for consistency with other x86
+ # operating systems.
+ if test "${cputype-}" = 386; then
+ UNAME_MACHINE=i386
+ elif test "x${cputype-}" != x; then
+ UNAME_MACHINE=$cputype
+ fi
+ GUESS=$UNAME_MACHINE-unknown-plan9
+ ;;
+ *:TOPS-10:*:*)
+ GUESS=pdp10-unknown-tops10
+ ;;
+ *:TENEX:*:*)
+ GUESS=pdp10-unknown-tenex
+ ;;
+ KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+ GUESS=pdp10-dec-tops20
+ ;;
+ XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+ GUESS=pdp10-xkl-tops20
+ ;;
+ *:TOPS-20:*:*)
+ GUESS=pdp10-unknown-tops20
+ ;;
+ *:ITS:*:*)
+ GUESS=pdp10-unknown-its
+ ;;
+ SEI:*:*:SEIUX)
+ GUESS=mips-sei-seiux$UNAME_RELEASE
+ ;;
+ *:DragonFly:*:*)
+ DRAGONFLY_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
+ GUESS=$UNAME_MACHINE-unknown-dragonfly$DRAGONFLY_REL
+ ;;
+ *:*VMS:*:*)
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ case $UNAME_MACHINE in
+ A*) GUESS=alpha-dec-vms ;;
+ I*) GUESS=ia64-dec-vms ;;
+ V*) GUESS=vax-dec-vms ;;
+ esac ;;
+ *:XENIX:*:SysV)
+ GUESS=i386-pc-xenix
+ ;;
+ i*86:skyos:*:*)
+ SKYOS_REL=`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`
+ GUESS=$UNAME_MACHINE-pc-skyos$SKYOS_REL
+ ;;
+ i*86:rdos:*:*)
+ GUESS=$UNAME_MACHINE-pc-rdos
+ ;;
+ i*86:Fiwix:*:*)
+ GUESS=$UNAME_MACHINE-pc-fiwix
+ ;;
+ *:AROS:*:*)
+ GUESS=$UNAME_MACHINE-unknown-aros
+ ;;
+ x86_64:VMkernel:*:*)
+ GUESS=$UNAME_MACHINE-unknown-esx
+ ;;
+ amd64:Isilon\ OneFS:*:*)
+ GUESS=x86_64-unknown-onefs
+ ;;
+ *:Unleashed:*:*)
+ GUESS=$UNAME_MACHINE-unknown-unleashed$UNAME_RELEASE
+ ;;
+esac
+
+# Do we have a guess based on uname results?
+if test "x$GUESS" != x; then
+ echo "$GUESS"
+ exit
+fi
+
+# No uname command or uname output not recognized.
+set_cc_for_build
+cat > "$dummy.c" <<EOF
+#ifdef _SEQUENT_
+#include <sys/types.h>
+#include <sys/utsname.h>
+#endif
+#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__)
+#if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__)
+#include <signal.h>
+#if defined(_SIZE_T_) || defined(SIGLOST)
+#include <sys/utsname.h>
+#endif
+#endif
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+ /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed,
+ I don't know.... */
+ printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+ printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+ "4"
+#else
+ ""
+#endif
+ ); exit (0);
+#endif
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+ int version;
+ version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+ if (version < 4)
+ printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+ else
+ printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+ exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+ printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+ printf ("ns32k-encore-mach\n"); exit (0);
+#else
+ printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+ printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+ printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+ printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+ struct utsname un;
+
+ uname(&un);
+ if (strncmp(un.version, "V2", 2) == 0) {
+ printf ("i386-sequent-ptx2\n"); exit (0);
+ }
+ if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+ printf ("i386-sequent-ptx1\n"); exit (0);
+ }
+ printf ("i386-sequent-ptx\n"); exit (0);
+#endif
+
+#if defined (vax)
+#if !defined (ultrix)
+#include <sys/param.h>
+#if defined (BSD)
+#if BSD == 43
+ printf ("vax-dec-bsd4.3\n"); exit (0);
+#else
+#if BSD == 199006
+ printf ("vax-dec-bsd4.3reno\n"); exit (0);
+#else
+ printf ("vax-dec-bsd\n"); exit (0);
+#endif
+#endif
+#else
+ printf ("vax-dec-bsd\n"); exit (0);
+#endif
+#else
+#if defined(_SIZE_T_) || defined(SIGLOST)
+ struct utsname un;
+ uname (&un);
+ printf ("vax-dec-ultrix%s\n", un.release); exit (0);
+#else
+ printf ("vax-dec-ultrix\n"); exit (0);
+#endif
+#endif
+#endif
+#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__)
+#if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__)
+#if defined(_SIZE_T_) || defined(SIGLOST)
+ struct utsname *un;
+ uname (&un);
+ printf ("mips-dec-ultrix%s\n", un.release); exit (0);
+#else
+ printf ("mips-dec-ultrix\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (alliant) && defined (i860)
+ printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+ exit (1);
+}
+EOF
+
+$CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=`"$dummy"` &&
+ { echo "$SYSTEM_NAME"; exit; }
+
+# Apollos put the system type in the environment.
+test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; }
+
+echo "$0: unable to guess system type" >&2
+
+case $UNAME_MACHINE:$UNAME_SYSTEM in
+ mips:Linux | mips64:Linux)
+ # If we got here on MIPS GNU/Linux, output extra information.
+ cat >&2 <<EOF
+
+NOTE: MIPS GNU/Linux systems require a C compiler to fully recognize
+the system type. Please install a C compiler and try again.
+EOF
+ ;;
+esac
+
+cat >&2 <<EOF
+
+This script (version $timestamp), has failed to recognize the
+operating system you are using. If your script is old, overwrite *all*
+copies of config.guess and config.sub with the latest versions from:
+
+ https://git.savannah.gnu.org/cgit/config.git/plain/config.guess
+and
+ https://git.savannah.gnu.org/cgit/config.git/plain/config.sub
+EOF
+
+our_year=`echo $timestamp | sed 's,-.*,,'`
+thisyear=`date +%Y`
+# shellcheck disable=SC2003
+script_age=`expr "$thisyear" - "$our_year"`
+if test "$script_age" -lt 3 ; then
+ cat >&2 <<EOF
+
+If $0 has already been updated, send the following data and any
+information you think might be pertinent to config-patches@gnu.org to
+provide the necessary information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo = `(hostinfo) 2>/dev/null`
+/bin/universe = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = "$UNAME_MACHINE"
+UNAME_RELEASE = "$UNAME_RELEASE"
+UNAME_SYSTEM = "$UNAME_SYSTEM"
+UNAME_VERSION = "$UNAME_VERSION"
+EOF
+fi
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/config.hin b/config.hin
new file mode 100644
index 0000000..d59f34e
--- /dev/null
+++ b/config.hin
@@ -0,0 +1,398 @@
+/*
+ * $LynxId: config.hin,v 1.152 2021/07/29 23:16:41 tom Exp $
+ * vile:cmode
+ *
+ * The configure script translates "config.hin" into "lynx_cfg.h"
+ */
+#ifndef LYNX_CFG_H
+#define LYNX_CFG_H 1
+
+#undef HOMEPAGE_URL
+
+#undef ALL_CHARSETS /* AC_ARG_WITH(charsets) */
+#undef ALT_CHAR_SET /* CF_ALT_CHAR_SET */
+#undef ARCHIVE_ONLY /* CF_ARG_DISABLE(dired-archive) */
+#undef BROTLI_PATH /* CF_PATH_PROG(brotli) */
+#undef BZIP2_PATH /* CF_PATH_PROG(bzip2) */
+#undef CAN_SET_ERRNO /* CF_SET_ERRNO */
+#undef CHMOD_PATH /* CF_PATH_PROG(chmod) */
+#undef CJK_EX /* CF_ARG_DISABLE(cjk) */
+#undef COLOR_CURSES /* CF_COLOR_CURSES */
+#undef COMPRESS_PATH /* CF_PATH_PROG(compress) */
+#undef COPY_PATH /* CF_PATH_PROG(cp) */
+#undef CURS_PERFORMANCE /* CF_CURS_PERFORMANCE */
+#undef DEBUG /* configure --enable-debug */
+#undef DECL_ERRNO
+#undef DECL_GETGRGID
+#undef DECL_GETGRNAM
+#undef DECL_SLEEP
+#undef DECL_STRSTR
+#undef DECL_SYS_ERRLIST
+#undef DIRED_SUPPORT /* AC_ARG_WITH(dired) */
+#undef DISABLE_BIBP /* CF_ARG_DISABLE(bibp-urls) */
+#undef DISABLE_FINGER /* CF_ARG_DISABLE(finger) */
+#undef DISABLE_FTP /* CF_ARG_DISABLE(ftp) */
+#undef DISABLE_GOPHER /* CF_ARG_DISABLE(gopher) */
+#undef DISABLE_NEWS /* CF_ARG_DISABLE(news) */
+#undef DISP_PARTIAL /* CF_ARG_ENABLE(partial) */
+#undef DONT_HAVE_TM_GMTOFF /* CF_TM_GMTOFF */
+#undef ENABLE_IPV6 /* CF_CHECK_IPV6 */
+#undef ENABLE_NLS /* defined if NLS is requested */
+#undef ENABLE_OPTS_CHANGE_EXEC /* CF_ARG_ENABLE(change-exec) */
+#undef EXEC_LINKS /* CF_ARG_ENABLE(exec-links) */
+#undef EXEC_SCRIPTS /* CF_ARG_ENABLE(exec-scripts) */
+#undef EXP_CHARTRANS_AUTOSWITCH /* CF_ARG_ENABLE(font-switch) */
+#undef EXP_CHINESEUTF8_SUPPORT /* CF_ARG_ENABLE(chinese-utf8) */
+#undef EXP_KEYBOARD_LAYOUT /* CF_ARG_ENABLE(kbd-layout) */
+#undef EXP_NESTED_TABLES /* CF_ARG_ENABLE(nested-tables) */
+#undef EXP_WCWIDTH_SUPPORT /* CF_ARG_ENABLE(wcwidth-support) */
+#undef FANCY_CURSES /* CF_FANCY_CURSES */
+#undef GCC_NORETURN /* CF_GCC_ATTRIBUTES */
+#undef GCC_PRINTF /* CF_GCC_ATTRIBUTES */
+#undef GCC_UNUSED /* CF_GCC_ATTRIBUTES */
+#undef GETGROUPS_T /* AC_TYPE_GETGROUPS */
+#undef GZIP_PATH /* CF_PATH_PROG(gzip) */
+#undef HAVE_ALLOCA /* AM_GNU_GETTEXT/AC_FUNC_ALLOCA */
+#undef HAVE_ALLOCA_H /* AM_GNU_GETTEXT/AC_FUNC_ALLOCA */
+#undef HAVE_ARGZ_H /* AM_GNU_GETTEXT */
+#undef HAVE_ARPA_INET_H
+#undef HAVE_ASSUME_DEFAULT_COLORS /* ncurses extension */
+#undef HAVE_ATOLL
+#undef HAVE_BSD_RANDOM_H /* CF_SRAND */
+#undef HAVE_BSD_STDLIB_H /* CF_SRAND */
+#undef HAVE_BSD_TOUCHLINE /* CF_CURS_TOUCHLINE */
+#undef HAVE_CATGETS /* defined if you want to use non-GNU catgets */
+#undef HAVE_CBREAK
+#undef HAVE_CTERMID
+#undef HAVE_CURSESX_H
+#undef HAVE_CURSES_EXIT /* ncurses debugging extension */
+#undef HAVE_CURSES_VERSION /* CF_FUNC_CURSES_VERSION */
+#undef HAVE_CUSERID
+#undef HAVE_DCGETTEXT /* AM_GNU_GETTEXT */
+#undef HAVE_DEFINE_KEY
+#undef HAVE_DELSCREEN /* CF_CURSES_FUNCS */
+#undef HAVE_DIRENT_H /* AC_HEADER_DIRENT */
+#undef HAVE_FCNTL_H /* have <fcntl.h> */
+#undef HAVE_FTIME
+#undef HAVE_GAI_STRERROR /* CF_CHECK_IPV6 */
+#undef HAVE_GETADDRINFO /* CF_CHECK_IPV6 */
+#undef HAVE_GETATTRS
+#undef HAVE_GETBEGX
+#undef HAVE_GETBEGY
+#undef HAVE_GETBKGD /* CF_COLOR_CURSES */
+#undef HAVE_GETCWD
+#undef HAVE_GETGROUPS
+#undef HAVE_GETTEXT /* defined if you want to use non-GNU gettext */
+#undef HAVE_GETTIMEOFDAY
+#undef HAVE_GETUID
+#undef HAVE_GNUTLS_PROTOCOL_SET_PRIORITY
+#undef HAVE_GNUTLS_RND
+#undef HAVE_H_ERRNO
+#undef HAVE_ICONV /* AM_ICONV */
+#undef HAVE_INET_ATON /* CF_INET_ADDR */
+#undef HAVE_INTTYPES_H
+#undef HAVE_JCURSES_H
+#undef HAVE_KEYPAD
+#undef HAVE_LANGINFO_CODESET /* AM_LANGINFO_CODESET */
+#undef HAVE_LC_MESSAGES /* locale messages */
+#undef HAVE_LIBDBMALLOC /* --with-dbmalloc */
+#undef HAVE_LIBDMALLOC /* --with-dmalloc */
+#undef HAVE_LIBGETTEXT_H /* defined if you want to use bundled gettext */
+#undef HAVE_LIBINTL_H /* AM_GNU_GETTEXT, or cleanup from that */
+#undef HAVE_LIBUTF8_H /* may be needed for libncursesw */
+#undef HAVE_LIMITS_H
+#undef HAVE_LOCALE_H
+#undef HAVE_LONG_LONG /* CF_TYPE_LONG_LONG */
+#undef HAVE_LSTAT /* CF_FUNC_LSTAT */
+#undef HAVE_MALLOC_H /* AM_GNU_GETTEXT */
+#undef HAVE_MBSTATE_T /* CF_WIDEC_CURSES */
+#undef HAVE_MKDTEMP
+#undef HAVE_MKTEMP
+#undef HAVE_MKTIME /* AC_REPLACE_FUNCS(mktime) */
+#undef HAVE_MMAP /* AM_GNU_GETTEXT */
+#undef HAVE_MUNMAP /* AM_GNU_GETTEXT */
+#undef HAVE_NAPMS
+#undef HAVE_NCURSESW_NCURSES_H /* defined if we include <ncursesw/ncurses.h> */
+#undef HAVE_NCURSESW_TERM_H /* have <ncursesw/term.h> */
+#undef HAVE_NCURSES_H /* defined if we include <ncurses.h> */
+#undef HAVE_NCURSES_NCURSES_H /* defined if we include <ncurses/ncurses.h> */
+#undef HAVE_NCURSES_TERM_H /* have <ncurses/term.h> */
+#undef HAVE_NEWPAD
+#undef HAVE_NEWTERM
+#undef HAVE_NL_TYPES_H /* AM_GNU_GETTEXT */
+#undef HAVE_PNOUTREFRESH
+#undef HAVE_POPEN
+#undef HAVE_PUTENV
+#undef HAVE_READDIR
+#undef HAVE_RESIZETERM
+#undef HAVE_RESOLV_H
+#undef HAVE_SETENV /* AM_GNU_GETTEXT */
+#undef HAVE_SETLOCALE
+#undef HAVE_SETUID
+#undef HAVE_SIGACTION /* CF_FUNC_SIGACTION */
+#undef HAVE_SIZECHANGE /* CF_SIZECHANGE */
+#undef HAVE_SLEEP
+#undef HAVE_STDARG_H /* CF_VARARGS */
+#undef HAVE_STDLIB_H
+#undef HAVE_STDNORETURN_H /* CF_C11_NORETURN */
+#undef HAVE_STPCPY /* AM_GNU_GETTEXT */
+#undef HAVE_STRCASECMP /* AM_GNU_GETTEXT */
+#undef HAVE_STRCHR /* AM_GNU_GETTEXT */
+#undef HAVE_STRERROR
+#undef HAVE_STRING_H
+#undef HAVE_STRUCT_DIRENT64 /* CF_LARGEFILE */
+#undef HAVE_SYSLOG_H
+#undef HAVE_SYSV_TOUCHLINE /* CF_CURS_TOUCHLINE */
+#undef HAVE_SYS_DIR_H /* AC_HEADER_DIRENT */
+#undef HAVE_SYS_FCNTL_H /* have <sys/fcntl.h> */
+#undef HAVE_SYS_FILIO_H /* have <sys/filio.h> */
+#undef HAVE_SYS_IOCTL_H /* have <sys/ioctl.h> */
+#undef HAVE_SYS_NDIR_H /* AC_HEADER_DIRENT */
+#undef HAVE_SYS_PARAM_H /* AM_GNU_GETTEXT */
+#undef HAVE_SYS_TIMEB_H /* have <sys/timeb.h> */
+#undef HAVE_SYS_TIME_H /* have <sys/time.h> */
+#undef HAVE_SYS_WAIT_H /* have <sys/wait.h> */
+#undef HAVE_TERMIOS_H /* have <termios.h> */
+#undef HAVE_TERMIO_H /* have <termio.h> */
+#undef HAVE_TERM_H /* have <term.h> */
+#undef HAVE_TOUCHLINE
+#undef HAVE_TOUCHWIN
+#undef HAVE_TRUNCATE
+#undef HAVE_TTYNAME
+#undef HAVE_TTYTYPE
+#undef HAVE_TYPE_CHTYPE /* CF_CURSES_CHTYPE */
+#undef HAVE_TYPE_UNIONWAIT /* CF_UNION_WAIT */
+#undef HAVE_UNISTD_H /* have <unistd.h> */
+#undef HAVE_UNSETENV
+#undef HAVE_USE_DEFAULT_COLORS /* ncurses extension */
+#undef HAVE_USE_LEGACY_CODING /* ncurses extension */
+#undef HAVE_USLEEP
+#undef HAVE_UTMP /* CF_UTMP */
+#undef HAVE_UTMP_UT_HOST /* CF_UTMP_UT_HOST */
+#undef HAVE_UTMP_UT_SESSION /* CF_UTMP_UT_SESSION */
+#undef HAVE_UTMP_UT_XSTATUS /* CF_UTMP_UT_XSTATUS */
+#undef HAVE_UTMP_UT_XTIME /* CF_UTMP_UT_XTIME */
+#undef HAVE_VALUES_H /* AM_GNU_GETTEXT */
+#undef HAVE_VARARGS_H /* CF_VARARGS */
+#undef HAVE_VASPRINTF /* CF_FUNC_VASPRINTF */
+#undef HAVE_VFORK_H /* have <vfork.h> */
+#undef HAVE_WAIS_H
+#undef HAVE_WAITPID
+#undef HAVE_WATTR_GET
+#undef HAVE_WBORDER
+#undef HAVE_WCHAR_H
+#undef HAVE_WCWIDTH /* AC_REPLACE_FUNCS(wcwidth) */
+#undef HAVE_WINDOWS_H /* CF_NETLIBS */
+#undef HAVE_WINSOCK2_H /* CF_NETLIBS */
+#undef HAVE_WINSOCK_H /* CF_NETLIBS */
+#undef HAVE_WREDRAWLN
+#undef HAVE_WRESIZE
+#undef HAVE_XCURSES /* CF_PDCURSES_X11 */
+#undef HAVE_ZERROR
+#undef HAVE__NC_FREEALL /* ncurses debugging extension */
+#undef HAVE__NC_FREE_AND_EXIT /* ncurses debugging extension */
+#undef HAVE___ARGZ_COUNT /* AM_GNU_GETTEXT */
+#undef HAVE___ARGZ_NEXT /* AM_GNU_GETTEXT */
+#undef HAVE___ARGZ_STRINGIFY /* AM_GNU_GETTEXT */
+#undef ICONV_CONST
+#undef IGNORE_CTRL_C /* FIXME: make tests? */
+#undef INCLUDE_PROTOTYPES /* CF_SOCKS5 */
+#undef INSTALL_ARGS /* CF_PATH_PROG(install) */
+#undef INSTALL_PATH /* CF_PATH_PROG(install) */
+#undef LINUX /* FIXME: make tests? */
+#undef LOCALE /* for locale support */
+#undef LONG_LIST /* CF_ARG_DISABLE(long-list) */
+#undef LYNXCGI_LINKS /* CF_ARG_ENABLE(cgi-links) */
+#undef LYNX_CFG_FILE /* $sysconfdir/lynx.cfg */
+#undef LYNX_CFG_PATH /* $sysconfdir */
+#undef LYNX_LSS_FILE /* $sysconfdir/lynx.lss */
+#undef LYNX_RAND_MAX /* CF_SRAND */
+#undef LY_FIND_LEAKS /* CF_ARG_ENABLE(find-leaks) */
+#undef LY_TRACELINE /* CF_ARG_ENABLE(vertrace) */
+#undef MIME_LIBDIR /* CF_WITH_PATH(mime-libdir */
+#undef MKDIR_PATH /* CF_PATH_PROG(mkdir) */
+#undef MV_PATH /* CF_PATH_PROG(mv) */
+#undef NCURSES /* defined for ncurses support */
+#undef NCURSES_BROKEN /* defined for ncurses color support */
+#undef NEED_PTEM_H /* CF_SIZECHANGE */
+#undef NEED_REMOVE /* CF_REMOVE_BROKEN */
+#undef NEED_WCHAR_H /* CF_WIDEC_CURSES */
+#undef NGROUPS /* CF_NGROUPS */
+#undef NLS_TEXTDOMAIN /* NLS_TEXTDOMAIN */
+#undef NO_CHANGE_EXECUTE_PERMS /* CF_ARG_DISABLE(dired-xpermit) */
+#undef NO_CONFIG_INFO /* CF_ARG_DISABLE(config-info) */
+#undef NO_EXTENDED_HTMLDTD /* CF_ARG_DISABLE(extended-dtd) */
+#undef NO_LYNX_TRACE /* CF_ARG_DISABLE(trace) */
+#undef NO_OPTION_FORMS /* CF_ARG_DISABLE(forms-options) */
+#undef NO_OPTION_MENU /* CF_ARG_DISABLE(option-menu) */
+#undef NO_PARENT_DIR_REFERENCE /* CF_ARG_DISABLE(parent-dir-refs) */
+#undef NSL_FORK /* CF_ARG_ENABLE(nsl-fork) */
+#undef OK_INSTALL
+#undef OK_OVERRIDE /* CF_ARG_DISABLE(dired-override) */
+#undef OK_PERMIT /* CF_ARG_DISABLE(dired-permit) */
+#undef PDC_DLL_BUILD /* CF_PDCURSES_W32 */
+#undef PDC_WIDE /* CF_PDCURSES_W32 */
+#undef REAL_UNIX_SYSTEM /* CF_SLANG_UNIX_DEFS */
+#undef RLOGIN_PATH /* CF_PATH_PROG(rlogin) */
+#undef RM_PATH /* CF_PATH_PROG(rm) */
+#undef SETFONT_PATH /* CF_PATH_PROG(setfont) */
+#undef SIZEOF_INT /* AC_CHECK_SIZEOF(int) */
+#undef SIZEOF_LONG /* AC_CHECK_SIZEOF(long) */
+#undef SIZEOF_OFF_T /* AC_CHECK_SIZEOF(off_t) */
+#undef SIZEOF_SIZE_T /* AC_CHECK_SIZEOF(size_t) */
+#undef SIZEOF_TIME_T /* AC_CHECK_SIZEOF(time_t) */
+#undef SLsmg_Color_Type /* CF_SLANG_UNIX_DEFS */
+#undef SLtt_Char_Type /* CF_SLANG_UNIX_DEFS */
+#undef SOCKS /* CF_SOCKS, CF_SOCKS5 */
+#undef STDC_HEADERS
+#undef STDC_NORETURN /* CF_C11_NORETURN */
+#undef SYSTEM_MAIL /* CF_DEFINE_PROG */
+#undef SYSTEM_MAIL_FLAGS /* CF_SYSTEM_MAIL_FLAGS */
+#undef SYSTEM_NAME /* CF_CHECK_CACHE */
+#undef TAR_DOWN_OPTIONS /* CF_TAR_OPTIONS */
+#undef TAR_FILE_OPTIONS /* CF_TAR_OPTIONS */
+#undef TAR_PATH /* CF_PATH_PROG(tar) */
+#undef TAR_PIPE_OPTIONS /* CF_TAR_OPTIONS */
+#undef TAR_UP_OPTIONS /* CF_TAR_OPTIONS */
+#undef TELNET_PATH /* CF_PATH_PROG(telnet) */
+#undef TERMIO_AND_CURSES /* CF_TERMIO_AND_CURSES workaround */
+#undef TERMIO_AND_TERMIOS /* CF_TERMIO_AND_TERMIOS workaround */
+#undef TIME_WITH_SYS_TIME /* AC_HEADER_TIME */
+#undef TN3270_PATH /* CF_PATH_PROG(tn3270) */
+#undef TOUCH_PATH /* CF_PATH_PROG(touch) */
+#undef TRACK_INTERNAL_LINKS /* CF_ARG_DISABLE(internal-links) */
+#undef ULTRIX /* config.sub */
+#undef UNCOMPRESS_PATH /* CF_PATH_PROG(gunzip) */
+#undef UNDERLINE_LINKS /* CF_ARG_ENABLE(underlines) */
+#undef UNIX
+#undef UNZIP_PATH /* CF_PATH_PROG(unzip) */
+#undef USE_ADDRLIST_PAGE /* CF_ARG_DISABLE(addrlist-page) */
+#undef USE_ALT_BINDINGS /* CF_ARG_DISABLE(alt-bindings) */
+#undef USE_ASCII_CTYPES /* CF_ARG_DISABLE(ascii-ctypes) */
+#undef USE_BROTLI /* AC_ARG_WITH(brotli) */
+#undef USE_BZLIB /* AC_ARG_WITH(bzlib) */
+#undef USE_CACHEJAR /* CF_ARG_DISABLE(session-cache) */
+#undef USE_CHARSET_CHOICE /* CF_ARG_DISABLE(charset-choice) */
+#undef USE_COLOR_STYLE /* CF_ARG_DISABLE(color-style) */
+#undef USE_DEFAULT_COLORS /* CF_ARG_DISABLE(default-colors) */
+#undef USE_EXECVP /* CF_ARG_DISABLE(full-paths) */
+#undef USE_EXTERNALS /* CF_ARG_ENABLE(externs) */
+#undef USE_FCNTL /* CF_FIONBIO */
+#undef USE_FILE_UPLOAD /* CF_ARG_DISABLE(file-upload) */
+#undef USE_GNUTLS_FUNCS /* CF_GNUTLS */
+#undef USE_GNUTLS_INCL /* CF_GNUTLS */
+#undef USE_IDN2 /* CF_ARG_DISABLE(idna) */
+#undef USE_IDNA /* CF_ARG_DISABLE(idna) */
+#undef USE_JAPANESEUTF8_SUPPORT /* CF_ARG_DISABLE(japanese-utf8) */
+#undef USE_JUSTIFY_ELTS /* CF_ARG_DISABLE(justify-elts) */
+#undef USE_LOCALE_CHARSET /* CF_ARG_DISABLE(locale-charset) */
+#undef USE_OPENSSL_INCL /* CF_SSL */
+#undef USE_PERSISTENT_COOKIES /* CF_ARG_DISABLE(persistent-cookies) */
+#undef USE_PRETTYSRC /* CF_ARG_DISABLE(prettysrc) */
+#undef USE_PROGRESSBAR /* CF_ARG_DISABLE(progressbar) */
+#undef USE_READPROGRESS /* CF_ARG_DISABLE(read-eta) */
+#undef USE_SCROLLBAR /* CF_ARG_DISABLE(scrollbar) */
+#undef USE_SESSIONS /* CF_ARG_DISABLE(sessions) */
+#undef USE_SLANG /* AC_ARG_WITH(screen=slang) */
+#undef USE_SOCKS4_PREFIX /* CF_SOCKS5 */
+#undef USE_SOCKS5 /* CF_SOCKS5 */
+#undef USE_SOURCE_CACHE /* CF_ARG_DISABLE(source-cache) */
+#undef USE_SSL /* CF_SSL */
+#undef USE_SYSV_UTMP /* CF_UTMP */
+#undef USE_X509_SUPPORT /* CF_GNUTLS, CF_SSL */
+#undef USE_ZLIB /* AC_ARG_WITH(zlib) */
+#undef UTF8 /* CF_SLANG_CPPFLAGS */
+#undef UTMPX_FOR_UTMP /* use <utmpx.h> since <utmp.h> not found */
+#undef UUDECODE_PATH /* CF_PATH_PROG(uudecode) */
+#undef WAITPID_USES_UNION /* CF_FUNC_WAIT */
+#undef WAIT_USES_UNION /* CF_FUNC_WAIT */
+#undef WIDEC_CURSES /* CF_WIDEC_CURSES */
+#undef XCURSES /* CF_PDCURSES_X11 */
+#undef ZCAT_PATH /* CF_PATH_PROG(zcat) */
+#undef ZIP_PATH /* CF_PATH_PROG(zip) */
+#undef _WINDOWS_NSL /* CF_ARG_ENABLE(nsl-fork) */
+#undef inline /* AC_C_INLINE */
+#undef intptr_t /* AC_CHECK_TYPE(intptr_t,...) */
+#undef lynx_rand /* CF_SRAND */
+#undef lynx_srand /* CF_SRAND */
+#undef mode_t /* AC_TYPE_MODE_T */
+#undef off_t /* AC_TYPE_OFF_T */
+#undef pid_t /* AC_TYPE_PID_T */
+#undef socklen_t /* CF_CHECK_TYPE(socklen_t,...) */
+#undef ssize_t /* CF_CHECK_TYPE(ssize_t,...) */
+#undef uid_t /* AC_TYPE_UID_T */
+#undef ut_name /* CF_UTMP */
+#undef ut_xstatus /* CF_UTMP_UT_XSTATUS */
+#undef ut_xtime /* CF_UTMP_UT_XTIME */
+
+#ifdef GZIP_PATH
+#undef OK_GZIP /* CF_ARG_DISABLE(dired-gzip) */
+#endif
+
+#ifdef TAR_PATH
+#undef OK_TAR /* CF_ARG_DISABLE(dired-tar) */
+#endif
+
+#ifdef UUDECODE_PATH
+#undef OK_UUDECODE /* CF_ARG_DISABLE(dired-uudecode) */
+#endif
+
+#ifdef ZIP_PATH
+#undef OK_ZIP /* CF_ARG_DISABLE(dired-zip) */
+#endif
+
+/*
+ * U/Win defines vfork() as a macro in vfork.h, which is included from unistd.h.
+ */
+#ifndef HAVE_VFORK_H
+#undef vfork /* AC_FUNC_FORK */
+#endif
+
+/* 'const' may be defined externally by the compiler-wrapper, as in 'unproto'
+ * or by AC_C_CONST
+ */
+#ifndef const
+#undef const
+#endif
+
+/*
+ * The configure script generates LYHelp.h (handcrafted makefiles may not do
+ * this, so we set a definition):
+ */
+#define HAVE_LYHELP_H 1
+
+/* FIXME:SVR4_BSDSELECT (done in $host_os case-statement) */
+
+/* Some older socks libraries, especially AIX need special definitions */
+#if defined(_AIX) && !defined(USE_SOCKS5)
+#undef accept
+#undef bind
+#undef connect
+#undef getpeername
+#undef getsockname
+#undef listen
+#undef recvfrom
+#undef select
+#endif
+
+#ifdef HAVE_SYSLOG_H
+#undef SYSLOG_REQUESTED_URLS /* CF_ARG_ENABLE(syslog) */
+#endif
+
+#ifndef HAVE_LSTAT
+#define lstat stat
+#endif
+
+#ifdef DECL_GETGRGID
+extern struct group * getgrgid ();
+#endif
+
+#ifdef DECL_GETGRNAM
+extern struct group * getgrnam ();
+#endif
+
+#ifdef DECL_STRSTR
+extern char * strstr ();
+#endif
+
+#endif /* LYNX_CFG_H */
diff --git a/config.sub b/config.sub
new file mode 100755
index 0000000..fbaa37f
--- /dev/null
+++ b/config.sub
@@ -0,0 +1,1890 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+# Copyright 1992-2022 Free Software Foundation, Inc.
+
+# shellcheck disable=SC2006,SC2268 # see below for rationale
+
+timestamp='2022-08-01'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <https://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that
+# program. This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
+
+
+# Please send patches to <config-patches@gnu.org>.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# You can get the latest version of this script from:
+# https://git.savannah.gnu.org/cgit/config.git/plain/config.sub
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support. The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+# The "shellcheck disable" line above the timestamp inhibits complaints
+# about features and limitations of the classic Bourne shell that were
+# superseded or lifted in POSIX. However, this script identifies a wide
+# variety of pre-POSIX systems that do not have POSIX shells at all, and
+# even some reasonably current systems (Solaris 10 as case-in-point) still
+# have a pre-POSIX /bin/sh.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS
+
+Canonicalize a configuration name.
+
+Options:
+ -h, --help print this help, then exit
+ -t, --time-stamp print date of last modification, then exit
+ -v, --version print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright 1992-2022 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+ case $1 in
+ --time-stamp | --time* | -t )
+ echo "$timestamp" ; exit ;;
+ --version | -v )
+ echo "$version" ; exit ;;
+ --help | --h* | -h )
+ echo "$usage"; exit ;;
+ -- ) # Stop option processing
+ shift; break ;;
+ - ) # Use stdin as input.
+ break ;;
+ -* )
+ echo "$me: invalid option $1$help" >&2
+ exit 1 ;;
+
+ *local*)
+ # First pass through any local machine types.
+ echo "$1"
+ exit ;;
+
+ * )
+ break ;;
+ esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+ exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+ exit 1;;
+esac
+
+# Split fields of configuration type
+# shellcheck disable=SC2162
+saved_IFS=$IFS
+IFS="-" read field1 field2 field3 field4 <<EOF
+$1
+EOF
+IFS=$saved_IFS
+
+# Separate into logical components for further validation
+case $1 in
+ *-*-*-*-*)
+ echo Invalid configuration \`"$1"\': more than four components >&2
+ exit 1
+ ;;
+ *-*-*-*)
+ basic_machine=$field1-$field2
+ basic_os=$field3-$field4
+ ;;
+ *-*-*)
+ # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two
+ # parts
+ maybe_os=$field2-$field3
+ case $maybe_os in
+ nto-qnx* | linux-* | uclinux-uclibc* \
+ | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \
+ | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \
+ | storm-chaos* | os2-emx* | rtmk-nova*)
+ basic_machine=$field1
+ basic_os=$maybe_os
+ ;;
+ android-linux)
+ basic_machine=$field1-unknown
+ basic_os=linux-android
+ ;;
+ *)
+ basic_machine=$field1-$field2
+ basic_os=$field3
+ ;;
+ esac
+ ;;
+ *-*)
+ # A lone config we happen to match not fitting any pattern
+ case $field1-$field2 in
+ decstation-3100)
+ basic_machine=mips-dec
+ basic_os=
+ ;;
+ *-*)
+ # Second component is usually, but not always the OS
+ case $field2 in
+ # Prevent following clause from handling this valid os
+ sun*os*)
+ basic_machine=$field1
+ basic_os=$field2
+ ;;
+ zephyr*)
+ basic_machine=$field1-unknown
+ basic_os=$field2
+ ;;
+ # Manufacturers
+ dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \
+ | att* | 7300* | 3300* | delta* | motorola* | sun[234]* \
+ | unicom* | ibm* | next | hp | isi* | apollo | altos* \
+ | convergent* | ncr* | news | 32* | 3600* | 3100* \
+ | hitachi* | c[123]* | convex* | sun | crds | omron* | dg \
+ | ultra | tti* | harris | dolphin | highlevel | gould \
+ | cbm | ns | masscomp | apple | axis | knuth | cray \
+ | microblaze* | sim | cisco \
+ | oki | wec | wrs | winbond)
+ basic_machine=$field1-$field2
+ basic_os=
+ ;;
+ *)
+ basic_machine=$field1
+ basic_os=$field2
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ *)
+ # Convert single-component short-hands not valid as part of
+ # multi-component configurations.
+ case $field1 in
+ 386bsd)
+ basic_machine=i386-pc
+ basic_os=bsd
+ ;;
+ a29khif)
+ basic_machine=a29k-amd
+ basic_os=udi
+ ;;
+ adobe68k)
+ basic_machine=m68010-adobe
+ basic_os=scout
+ ;;
+ alliant)
+ basic_machine=fx80-alliant
+ basic_os=
+ ;;
+ altos | altos3068)
+ basic_machine=m68k-altos
+ basic_os=
+ ;;
+ am29k)
+ basic_machine=a29k-none
+ basic_os=bsd
+ ;;
+ amdahl)
+ basic_machine=580-amdahl
+ basic_os=sysv
+ ;;
+ amiga)
+ basic_machine=m68k-unknown
+ basic_os=
+ ;;
+ amigaos | amigados)
+ basic_machine=m68k-unknown
+ basic_os=amigaos
+ ;;
+ amigaunix | amix)
+ basic_machine=m68k-unknown
+ basic_os=sysv4
+ ;;
+ apollo68)
+ basic_machine=m68k-apollo
+ basic_os=sysv
+ ;;
+ apollo68bsd)
+ basic_machine=m68k-apollo
+ basic_os=bsd
+ ;;
+ aros)
+ basic_machine=i386-pc
+ basic_os=aros
+ ;;
+ aux)
+ basic_machine=m68k-apple
+ basic_os=aux
+ ;;
+ balance)
+ basic_machine=ns32k-sequent
+ basic_os=dynix
+ ;;
+ blackfin)
+ basic_machine=bfin-unknown
+ basic_os=linux
+ ;;
+ cegcc)
+ basic_machine=arm-unknown
+ basic_os=cegcc
+ ;;
+ convex-c1)
+ basic_machine=c1-convex
+ basic_os=bsd
+ ;;
+ convex-c2)
+ basic_machine=c2-convex
+ basic_os=bsd
+ ;;
+ convex-c32)
+ basic_machine=c32-convex
+ basic_os=bsd
+ ;;
+ convex-c34)
+ basic_machine=c34-convex
+ basic_os=bsd
+ ;;
+ convex-c38)
+ basic_machine=c38-convex
+ basic_os=bsd
+ ;;
+ cray)
+ basic_machine=j90-cray
+ basic_os=unicos
+ ;;
+ crds | unos)
+ basic_machine=m68k-crds
+ basic_os=
+ ;;
+ da30)
+ basic_machine=m68k-da30
+ basic_os=
+ ;;
+ decstation | pmax | pmin | dec3100 | decstatn)
+ basic_machine=mips-dec
+ basic_os=
+ ;;
+ delta88)
+ basic_machine=m88k-motorola
+ basic_os=sysv3
+ ;;
+ dicos)
+ basic_machine=i686-pc
+ basic_os=dicos
+ ;;
+ djgpp)
+ basic_machine=i586-pc
+ basic_os=msdosdjgpp
+ ;;
+ ebmon29k)
+ basic_machine=a29k-amd
+ basic_os=ebmon
+ ;;
+ es1800 | OSE68k | ose68k | ose | OSE)
+ basic_machine=m68k-ericsson
+ basic_os=ose
+ ;;
+ gmicro)
+ basic_machine=tron-gmicro
+ basic_os=sysv
+ ;;
+ go32)
+ basic_machine=i386-pc
+ basic_os=go32
+ ;;
+ h8300hms)
+ basic_machine=h8300-hitachi
+ basic_os=hms
+ ;;
+ h8300xray)
+ basic_machine=h8300-hitachi
+ basic_os=xray
+ ;;
+ h8500hms)
+ basic_machine=h8500-hitachi
+ basic_os=hms
+ ;;
+ harris)
+ basic_machine=m88k-harris
+ basic_os=sysv3
+ ;;
+ hp300 | hp300hpux)
+ basic_machine=m68k-hp
+ basic_os=hpux
+ ;;
+ hp300bsd)
+ basic_machine=m68k-hp
+ basic_os=bsd
+ ;;
+ hppaosf)
+ basic_machine=hppa1.1-hp
+ basic_os=osf
+ ;;
+ hppro)
+ basic_machine=hppa1.1-hp
+ basic_os=proelf
+ ;;
+ i386mach)
+ basic_machine=i386-mach
+ basic_os=mach
+ ;;
+ isi68 | isi)
+ basic_machine=m68k-isi
+ basic_os=sysv
+ ;;
+ m68knommu)
+ basic_machine=m68k-unknown
+ basic_os=linux
+ ;;
+ magnum | m3230)
+ basic_machine=mips-mips
+ basic_os=sysv
+ ;;
+ merlin)
+ basic_machine=ns32k-utek
+ basic_os=sysv
+ ;;
+ mingw64)
+ basic_machine=x86_64-pc
+ basic_os=mingw64
+ ;;
+ mingw32)
+ basic_machine=i686-pc
+ basic_os=mingw32
+ ;;
+ mingw32ce)
+ basic_machine=arm-unknown
+ basic_os=mingw32ce
+ ;;
+ monitor)
+ basic_machine=m68k-rom68k
+ basic_os=coff
+ ;;
+ morphos)
+ basic_machine=powerpc-unknown
+ basic_os=morphos
+ ;;
+ moxiebox)
+ basic_machine=moxie-unknown
+ basic_os=moxiebox
+ ;;
+ msdos)
+ basic_machine=i386-pc
+ basic_os=msdos
+ ;;
+ msys)
+ basic_machine=i686-pc
+ basic_os=msys
+ ;;
+ mvs)
+ basic_machine=i370-ibm
+ basic_os=mvs
+ ;;
+ nacl)
+ basic_machine=le32-unknown
+ basic_os=nacl
+ ;;
+ ncr3000)
+ basic_machine=i486-ncr
+ basic_os=sysv4
+ ;;
+ netbsd386)
+ basic_machine=i386-pc
+ basic_os=netbsd
+ ;;
+ netwinder)
+ basic_machine=armv4l-rebel
+ basic_os=linux
+ ;;
+ news | news700 | news800 | news900)
+ basic_machine=m68k-sony
+ basic_os=newsos
+ ;;
+ news1000)
+ basic_machine=m68030-sony
+ basic_os=newsos
+ ;;
+ necv70)
+ basic_machine=v70-nec
+ basic_os=sysv
+ ;;
+ nh3000)
+ basic_machine=m68k-harris
+ basic_os=cxux
+ ;;
+ nh[45]000)
+ basic_machine=m88k-harris
+ basic_os=cxux
+ ;;
+ nindy960)
+ basic_machine=i960-intel
+ basic_os=nindy
+ ;;
+ mon960)
+ basic_machine=i960-intel
+ basic_os=mon960
+ ;;
+ nonstopux)
+ basic_machine=mips-compaq
+ basic_os=nonstopux
+ ;;
+ os400)
+ basic_machine=powerpc-ibm
+ basic_os=os400
+ ;;
+ OSE68000 | ose68000)
+ basic_machine=m68000-ericsson
+ basic_os=ose
+ ;;
+ os68k)
+ basic_machine=m68k-none
+ basic_os=os68k
+ ;;
+ paragon)
+ basic_machine=i860-intel
+ basic_os=osf
+ ;;
+ parisc)
+ basic_machine=hppa-unknown
+ basic_os=linux
+ ;;
+ psp)
+ basic_machine=mipsallegrexel-sony
+ basic_os=psp
+ ;;
+ pw32)
+ basic_machine=i586-unknown
+ basic_os=pw32
+ ;;
+ rdos | rdos64)
+ basic_machine=x86_64-pc
+ basic_os=rdos
+ ;;
+ rdos32)
+ basic_machine=i386-pc
+ basic_os=rdos
+ ;;
+ rom68k)
+ basic_machine=m68k-rom68k
+ basic_os=coff
+ ;;
+ sa29200)
+ basic_machine=a29k-amd
+ basic_os=udi
+ ;;
+ sei)
+ basic_machine=mips-sei
+ basic_os=seiux
+ ;;
+ sequent)
+ basic_machine=i386-sequent
+ basic_os=
+ ;;
+ sps7)
+ basic_machine=m68k-bull
+ basic_os=sysv2
+ ;;
+ st2000)
+ basic_machine=m68k-tandem
+ basic_os=
+ ;;
+ stratus)
+ basic_machine=i860-stratus
+ basic_os=sysv4
+ ;;
+ sun2)
+ basic_machine=m68000-sun
+ basic_os=
+ ;;
+ sun2os3)
+ basic_machine=m68000-sun
+ basic_os=sunos3
+ ;;
+ sun2os4)
+ basic_machine=m68000-sun
+ basic_os=sunos4
+ ;;
+ sun3)
+ basic_machine=m68k-sun
+ basic_os=
+ ;;
+ sun3os3)
+ basic_machine=m68k-sun
+ basic_os=sunos3
+ ;;
+ sun3os4)
+ basic_machine=m68k-sun
+ basic_os=sunos4
+ ;;
+ sun4)
+ basic_machine=sparc-sun
+ basic_os=
+ ;;
+ sun4os3)
+ basic_machine=sparc-sun
+ basic_os=sunos3
+ ;;
+ sun4os4)
+ basic_machine=sparc-sun
+ basic_os=sunos4
+ ;;
+ sun4sol2)
+ basic_machine=sparc-sun
+ basic_os=solaris2
+ ;;
+ sun386 | sun386i | roadrunner)
+ basic_machine=i386-sun
+ basic_os=
+ ;;
+ sv1)
+ basic_machine=sv1-cray
+ basic_os=unicos
+ ;;
+ symmetry)
+ basic_machine=i386-sequent
+ basic_os=dynix
+ ;;
+ t3e)
+ basic_machine=alphaev5-cray
+ basic_os=unicos
+ ;;
+ t90)
+ basic_machine=t90-cray
+ basic_os=unicos
+ ;;
+ toad1)
+ basic_machine=pdp10-xkl
+ basic_os=tops20
+ ;;
+ tpf)
+ basic_machine=s390x-ibm
+ basic_os=tpf
+ ;;
+ udi29k)
+ basic_machine=a29k-amd
+ basic_os=udi
+ ;;
+ ultra3)
+ basic_machine=a29k-nyu
+ basic_os=sym1
+ ;;
+ v810 | necv810)
+ basic_machine=v810-nec
+ basic_os=none
+ ;;
+ vaxv)
+ basic_machine=vax-dec
+ basic_os=sysv
+ ;;
+ vms)
+ basic_machine=vax-dec
+ basic_os=vms
+ ;;
+ vsta)
+ basic_machine=i386-pc
+ basic_os=vsta
+ ;;
+ vxworks960)
+ basic_machine=i960-wrs
+ basic_os=vxworks
+ ;;
+ vxworks68)
+ basic_machine=m68k-wrs
+ basic_os=vxworks
+ ;;
+ vxworks29k)
+ basic_machine=a29k-wrs
+ basic_os=vxworks
+ ;;
+ xbox)
+ basic_machine=i686-pc
+ basic_os=mingw32
+ ;;
+ ymp)
+ basic_machine=ymp-cray
+ basic_os=unicos
+ ;;
+ *)
+ basic_machine=$1
+ basic_os=
+ ;;
+ esac
+ ;;
+esac
+
+# Decode 1-component or ad-hoc basic machines
+case $basic_machine in
+ # Here we handle the default manufacturer of certain CPU types. It is in
+ # some cases the only manufacturer, in others, it is the most popular.
+ w89k)
+ cpu=hppa1.1
+ vendor=winbond
+ ;;
+ op50n)
+ cpu=hppa1.1
+ vendor=oki
+ ;;
+ op60c)
+ cpu=hppa1.1
+ vendor=oki
+ ;;
+ ibm*)
+ cpu=i370
+ vendor=ibm
+ ;;
+ orion105)
+ cpu=clipper
+ vendor=highlevel
+ ;;
+ mac | mpw | mac-mpw)
+ cpu=m68k
+ vendor=apple
+ ;;
+ pmac | pmac-mpw)
+ cpu=powerpc
+ vendor=apple
+ ;;
+
+ # Recognize the various machine names and aliases which stand
+ # for a CPU type and a company and sometimes even an OS.
+ 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+ cpu=m68000
+ vendor=att
+ ;;
+ 3b*)
+ cpu=we32k
+ vendor=att
+ ;;
+ bluegene*)
+ cpu=powerpc
+ vendor=ibm
+ basic_os=cnk
+ ;;
+ decsystem10* | dec10*)
+ cpu=pdp10
+ vendor=dec
+ basic_os=tops10
+ ;;
+ decsystem20* | dec20*)
+ cpu=pdp10
+ vendor=dec
+ basic_os=tops20
+ ;;
+ delta | 3300 | motorola-3300 | motorola-delta \
+ | 3300-motorola | delta-motorola)
+ cpu=m68k
+ vendor=motorola
+ ;;
+ dpx2*)
+ cpu=m68k
+ vendor=bull
+ basic_os=sysv3
+ ;;
+ encore | umax | mmax)
+ cpu=ns32k
+ vendor=encore
+ ;;
+ elxsi)
+ cpu=elxsi
+ vendor=elxsi
+ basic_os=${basic_os:-bsd}
+ ;;
+ fx2800)
+ cpu=i860
+ vendor=alliant
+ ;;
+ genix)
+ cpu=ns32k
+ vendor=ns
+ ;;
+ h3050r* | hiux*)
+ cpu=hppa1.1
+ vendor=hitachi
+ basic_os=hiuxwe2
+ ;;
+ hp3k9[0-9][0-9] | hp9[0-9][0-9])
+ cpu=hppa1.0
+ vendor=hp
+ ;;
+ hp9k2[0-9][0-9] | hp9k31[0-9])
+ cpu=m68000
+ vendor=hp
+ ;;
+ hp9k3[2-9][0-9])
+ cpu=m68k
+ vendor=hp
+ ;;
+ hp9k6[0-9][0-9] | hp6[0-9][0-9])
+ cpu=hppa1.0
+ vendor=hp
+ ;;
+ hp9k7[0-79][0-9] | hp7[0-79][0-9])
+ cpu=hppa1.1
+ vendor=hp
+ ;;
+ hp9k78[0-9] | hp78[0-9])
+ # FIXME: really hppa2.0-hp
+ cpu=hppa1.1
+ vendor=hp
+ ;;
+ hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+ # FIXME: really hppa2.0-hp
+ cpu=hppa1.1
+ vendor=hp
+ ;;
+ hp9k8[0-9][13679] | hp8[0-9][13679])
+ cpu=hppa1.1
+ vendor=hp
+ ;;
+ hp9k8[0-9][0-9] | hp8[0-9][0-9])
+ cpu=hppa1.0
+ vendor=hp
+ ;;
+ i*86v32)
+ cpu=`echo "$1" | sed -e 's/86.*/86/'`
+ vendor=pc
+ basic_os=sysv32
+ ;;
+ i*86v4*)
+ cpu=`echo "$1" | sed -e 's/86.*/86/'`
+ vendor=pc
+ basic_os=sysv4
+ ;;
+ i*86v)
+ cpu=`echo "$1" | sed -e 's/86.*/86/'`
+ vendor=pc
+ basic_os=sysv
+ ;;
+ i*86sol2)
+ cpu=`echo "$1" | sed -e 's/86.*/86/'`
+ vendor=pc
+ basic_os=solaris2
+ ;;
+ j90 | j90-cray)
+ cpu=j90
+ vendor=cray
+ basic_os=${basic_os:-unicos}
+ ;;
+ iris | iris4d)
+ cpu=mips
+ vendor=sgi
+ case $basic_os in
+ irix*)
+ ;;
+ *)
+ basic_os=irix4
+ ;;
+ esac
+ ;;
+ miniframe)
+ cpu=m68000
+ vendor=convergent
+ ;;
+ *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*)
+ cpu=m68k
+ vendor=atari
+ basic_os=mint
+ ;;
+ news-3600 | risc-news)
+ cpu=mips
+ vendor=sony
+ basic_os=newsos
+ ;;
+ next | m*-next)
+ cpu=m68k
+ vendor=next
+ case $basic_os in
+ openstep*)
+ ;;
+ nextstep*)
+ ;;
+ ns2*)
+ basic_os=nextstep2
+ ;;
+ *)
+ basic_os=nextstep3
+ ;;
+ esac
+ ;;
+ np1)
+ cpu=np1
+ vendor=gould
+ ;;
+ op50n-* | op60c-*)
+ cpu=hppa1.1
+ vendor=oki
+ basic_os=proelf
+ ;;
+ pa-hitachi)
+ cpu=hppa1.1
+ vendor=hitachi
+ basic_os=hiuxwe2
+ ;;
+ pbd)
+ cpu=sparc
+ vendor=tti
+ ;;
+ pbb)
+ cpu=m68k
+ vendor=tti
+ ;;
+ pc532)
+ cpu=ns32k
+ vendor=pc532
+ ;;
+ pn)
+ cpu=pn
+ vendor=gould
+ ;;
+ power)
+ cpu=power
+ vendor=ibm
+ ;;
+ ps2)
+ cpu=i386
+ vendor=ibm
+ ;;
+ rm[46]00)
+ cpu=mips
+ vendor=siemens
+ ;;
+ rtpc | rtpc-*)
+ cpu=romp
+ vendor=ibm
+ ;;
+ sde)
+ cpu=mipsisa32
+ vendor=sde
+ basic_os=${basic_os:-elf}
+ ;;
+ simso-wrs)
+ cpu=sparclite
+ vendor=wrs
+ basic_os=vxworks
+ ;;
+ tower | tower-32)
+ cpu=m68k
+ vendor=ncr
+ ;;
+ vpp*|vx|vx-*)
+ cpu=f301
+ vendor=fujitsu
+ ;;
+ w65)
+ cpu=w65
+ vendor=wdc
+ ;;
+ w89k-*)
+ cpu=hppa1.1
+ vendor=winbond
+ basic_os=proelf
+ ;;
+ none)
+ cpu=none
+ vendor=none
+ ;;
+ leon|leon[3-9])
+ cpu=sparc
+ vendor=$basic_machine
+ ;;
+ leon-*|leon[3-9]-*)
+ cpu=sparc
+ vendor=`echo "$basic_machine" | sed 's/-.*//'`
+ ;;
+
+ *-*)
+ # shellcheck disable=SC2162
+ saved_IFS=$IFS
+ IFS="-" read cpu vendor <<EOF
+$basic_machine
+EOF
+ IFS=$saved_IFS
+ ;;
+ # We use `pc' rather than `unknown'
+ # because (1) that's what they normally are, and
+ # (2) the word "unknown" tends to confuse beginning users.
+ i*86 | x86_64)
+ cpu=$basic_machine
+ vendor=pc
+ ;;
+ # These rules are duplicated from below for sake of the special case above;
+ # i.e. things that normalized to x86 arches should also default to "pc"
+ pc98)
+ cpu=i386
+ vendor=pc
+ ;;
+ x64 | amd64)
+ cpu=x86_64
+ vendor=pc
+ ;;
+ # Recognize the basic CPU types without company name.
+ *)
+ cpu=$basic_machine
+ vendor=unknown
+ ;;
+esac
+
+unset -v basic_machine
+
+# Decode basic machines in the full and proper CPU-Company form.
+case $cpu-$vendor in
+ # Here we handle the default manufacturer of certain CPU types in canonical form. It is in
+ # some cases the only manufacturer, in others, it is the most popular.
+ craynv-unknown)
+ vendor=cray
+ basic_os=${basic_os:-unicosmp}
+ ;;
+ c90-unknown | c90-cray)
+ vendor=cray
+ basic_os=${Basic_os:-unicos}
+ ;;
+ fx80-unknown)
+ vendor=alliant
+ ;;
+ romp-unknown)
+ vendor=ibm
+ ;;
+ mmix-unknown)
+ vendor=knuth
+ ;;
+ microblaze-unknown | microblazeel-unknown)
+ vendor=xilinx
+ ;;
+ rs6000-unknown)
+ vendor=ibm
+ ;;
+ vax-unknown)
+ vendor=dec
+ ;;
+ pdp11-unknown)
+ vendor=dec
+ ;;
+ we32k-unknown)
+ vendor=att
+ ;;
+ cydra-unknown)
+ vendor=cydrome
+ ;;
+ i370-ibm*)
+ vendor=ibm
+ ;;
+ orion-unknown)
+ vendor=highlevel
+ ;;
+ xps-unknown | xps100-unknown)
+ cpu=xps100
+ vendor=honeywell
+ ;;
+
+ # Here we normalize CPU types with a missing or matching vendor
+ armh-unknown | armh-alt)
+ cpu=armv7l
+ vendor=alt
+ basic_os=${basic_os:-linux-gnueabihf}
+ ;;
+ dpx20-unknown | dpx20-bull)
+ cpu=rs6000
+ vendor=bull
+ basic_os=${basic_os:-bosx}
+ ;;
+
+ # Here we normalize CPU types irrespective of the vendor
+ amd64-*)
+ cpu=x86_64
+ ;;
+ blackfin-*)
+ cpu=bfin
+ basic_os=linux
+ ;;
+ c54x-*)
+ cpu=tic54x
+ ;;
+ c55x-*)
+ cpu=tic55x
+ ;;
+ c6x-*)
+ cpu=tic6x
+ ;;
+ e500v[12]-*)
+ cpu=powerpc
+ basic_os=${basic_os}"spe"
+ ;;
+ mips3*-*)
+ cpu=mips64
+ ;;
+ ms1-*)
+ cpu=mt
+ ;;
+ m68knommu-*)
+ cpu=m68k
+ basic_os=linux
+ ;;
+ m9s12z-* | m68hcs12z-* | hcs12z-* | s12z-*)
+ cpu=s12z
+ ;;
+ openrisc-*)
+ cpu=or32
+ ;;
+ parisc-*)
+ cpu=hppa
+ basic_os=linux
+ ;;
+ pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+ cpu=i586
+ ;;
+ pentiumpro-* | p6-* | 6x86-* | athlon-* | athalon_*-*)
+ cpu=i686
+ ;;
+ pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+ cpu=i686
+ ;;
+ pentium4-*)
+ cpu=i786
+ ;;
+ pc98-*)
+ cpu=i386
+ ;;
+ ppc-* | ppcbe-*)
+ cpu=powerpc
+ ;;
+ ppcle-* | powerpclittle-*)
+ cpu=powerpcle
+ ;;
+ ppc64-*)
+ cpu=powerpc64
+ ;;
+ ppc64le-* | powerpc64little-*)
+ cpu=powerpc64le
+ ;;
+ sb1-*)
+ cpu=mipsisa64sb1
+ ;;
+ sb1el-*)
+ cpu=mipsisa64sb1el
+ ;;
+ sh5e[lb]-*)
+ cpu=`echo "$cpu" | sed 's/^\(sh.\)e\(.\)$/\1\2e/'`
+ ;;
+ spur-*)
+ cpu=spur
+ ;;
+ strongarm-* | thumb-*)
+ cpu=arm
+ ;;
+ tx39-*)
+ cpu=mipstx39
+ ;;
+ tx39el-*)
+ cpu=mipstx39el
+ ;;
+ x64-*)
+ cpu=x86_64
+ ;;
+ xscale-* | xscalee[bl]-*)
+ cpu=`echo "$cpu" | sed 's/^xscale/arm/'`
+ ;;
+ arm64-* | aarch64le-*)
+ cpu=aarch64
+ ;;
+
+ # Recognize the canonical CPU Types that limit and/or modify the
+ # company names they are paired with.
+ cr16-*)
+ basic_os=${basic_os:-elf}
+ ;;
+ crisv32-* | etraxfs*-*)
+ cpu=crisv32
+ vendor=axis
+ ;;
+ cris-* | etrax*-*)
+ cpu=cris
+ vendor=axis
+ ;;
+ crx-*)
+ basic_os=${basic_os:-elf}
+ ;;
+ neo-tandem)
+ cpu=neo
+ vendor=tandem
+ ;;
+ nse-tandem)
+ cpu=nse
+ vendor=tandem
+ ;;
+ nsr-tandem)
+ cpu=nsr
+ vendor=tandem
+ ;;
+ nsv-tandem)
+ cpu=nsv
+ vendor=tandem
+ ;;
+ nsx-tandem)
+ cpu=nsx
+ vendor=tandem
+ ;;
+ mipsallegrexel-sony)
+ cpu=mipsallegrexel
+ vendor=sony
+ ;;
+ tile*-*)
+ basic_os=${basic_os:-linux-gnu}
+ ;;
+
+ *)
+ # Recognize the canonical CPU types that are allowed with any
+ # company name.
+ case $cpu in
+ 1750a | 580 \
+ | a29k \
+ | aarch64 | aarch64_be \
+ | abacus \
+ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] \
+ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] \
+ | alphapca5[67] | alpha64pca5[67] \
+ | am33_2.0 \
+ | amdgcn \
+ | arc | arceb | arc32 | arc64 \
+ | arm | arm[lb]e | arme[lb] | armv* \
+ | avr | avr32 \
+ | asmjs \
+ | ba \
+ | be32 | be64 \
+ | bfin | bpf | bs2000 \
+ | c[123]* | c30 | [cjt]90 | c4x \
+ | c8051 | clipper | craynv | csky | cydra \
+ | d10v | d30v | dlx | dsp16xx \
+ | e2k | elxsi | epiphany \
+ | f30[01] | f700 | fido | fr30 | frv | ft32 | fx80 \
+ | h8300 | h8500 \
+ | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+ | hexagon \
+ | i370 | i*86 | i860 | i960 | ia16 | ia64 \
+ | ip2k | iq2000 \
+ | k1om \
+ | le32 | le64 \
+ | lm32 \
+ | loongarch32 | loongarch64 \
+ | m32c | m32r | m32rle \
+ | m5200 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \
+ | m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x \
+ | m88110 | m88k | maxq | mb | mcore | mep | metag \
+ | microblaze | microblazeel \
+ | mips | mipsbe | mipseb | mipsel | mipsle \
+ | mips16 \
+ | mips64 | mips64eb | mips64el \
+ | mips64octeon | mips64octeonel \
+ | mips64orion | mips64orionel \
+ | mips64r5900 | mips64r5900el \
+ | mips64vr | mips64vrel \
+ | mips64vr4100 | mips64vr4100el \
+ | mips64vr4300 | mips64vr4300el \
+ | mips64vr5000 | mips64vr5000el \
+ | mips64vr5900 | mips64vr5900el \
+ | mipsisa32 | mipsisa32el \
+ | mipsisa32r2 | mipsisa32r2el \
+ | mipsisa32r3 | mipsisa32r3el \
+ | mipsisa32r5 | mipsisa32r5el \
+ | mipsisa32r6 | mipsisa32r6el \
+ | mipsisa64 | mipsisa64el \
+ | mipsisa64r2 | mipsisa64r2el \
+ | mipsisa64r3 | mipsisa64r3el \
+ | mipsisa64r5 | mipsisa64r5el \
+ | mipsisa64r6 | mipsisa64r6el \
+ | mipsisa64sb1 | mipsisa64sb1el \
+ | mipsisa64sr71k | mipsisa64sr71kel \
+ | mipsr5900 | mipsr5900el \
+ | mipstx39 | mipstx39el \
+ | mmix \
+ | mn10200 | mn10300 \
+ | moxie \
+ | mt \
+ | msp430 \
+ | nds32 | nds32le | nds32be \
+ | nfp \
+ | nios | nios2 | nios2eb | nios2el \
+ | none | np1 | ns16k | ns32k | nvptx \
+ | open8 \
+ | or1k* \
+ | or32 \
+ | orion \
+ | picochip \
+ | pdp10 | pdp11 | pj | pjl | pn | power \
+ | powerpc | powerpc64 | powerpc64le | powerpcle | powerpcspe \
+ | pru \
+ | pyramid \
+ | riscv | riscv32 | riscv32be | riscv64 | riscv64be \
+ | rl78 | romp | rs6000 | rx \
+ | s390 | s390x \
+ | score \
+ | sh | shl \
+ | sh[1234] | sh[24]a | sh[24]ae[lb] | sh[23]e | she[lb] | sh[lb]e \
+ | sh[1234]e[lb] | sh[12345][lb]e | sh[23]ele | sh64 | sh64le \
+ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet \
+ | sparclite \
+ | sparcv8 | sparcv9 | sparcv9b | sparcv9v | sv1 | sx* \
+ | spu \
+ | tahoe \
+ | thumbv7* \
+ | tic30 | tic4x | tic54x | tic55x | tic6x | tic80 \
+ | tron \
+ | ubicom32 \
+ | v70 | v850 | v850e | v850e1 | v850es | v850e2 | v850e2v3 \
+ | vax \
+ | visium \
+ | w65 \
+ | wasm32 | wasm64 \
+ | we32k \
+ | x86 | x86_64 | xc16x | xgate | xps100 \
+ | xstormy16 | xtensa* \
+ | ymp \
+ | z8k | z80)
+ ;;
+
+ *)
+ echo Invalid configuration \`"$1"\': machine \`"$cpu-$vendor"\' not recognized 1>&2
+ exit 1
+ ;;
+ esac
+ ;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $vendor in
+ digital*)
+ vendor=dec
+ ;;
+ commodore*)
+ vendor=cbm
+ ;;
+ *)
+ ;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if test x$basic_os != x
+then
+
+# First recognize some ad-hoc cases, or perhaps split kernel-os, or else just
+# set os.
+case $basic_os in
+ gnu/linux*)
+ kernel=linux
+ os=`echo "$basic_os" | sed -e 's|gnu/linux|gnu|'`
+ ;;
+ os2-emx)
+ kernel=os2
+ os=`echo "$basic_os" | sed -e 's|os2-emx|emx|'`
+ ;;
+ nto-qnx*)
+ kernel=nto
+ os=`echo "$basic_os" | sed -e 's|nto-qnx|qnx|'`
+ ;;
+ *-*)
+ # shellcheck disable=SC2162
+ saved_IFS=$IFS
+ IFS="-" read kernel os <<EOF
+$basic_os
+EOF
+ IFS=$saved_IFS
+ ;;
+ # Default OS when just kernel was specified
+ nto*)
+ kernel=nto
+ os=`echo "$basic_os" | sed -e 's|nto|qnx|'`
+ ;;
+ linux*)
+ kernel=linux
+ os=`echo "$basic_os" | sed -e 's|linux|gnu|'`
+ ;;
+ *)
+ kernel=
+ os=$basic_os
+ ;;
+esac
+
+# Now, normalize the OS (knowing we just have one component, it's not a kernel,
+# etc.)
+case $os in
+ # First match some system type aliases that might get confused
+ # with valid system types.
+ # solaris* is a basic system type, with this one exception.
+ auroraux)
+ os=auroraux
+ ;;
+ bluegene*)
+ os=cnk
+ ;;
+ solaris1 | solaris1.*)
+ os=`echo "$os" | sed -e 's|solaris1|sunos4|'`
+ ;;
+ solaris)
+ os=solaris2
+ ;;
+ unixware*)
+ os=sysv4.2uw
+ ;;
+ # es1800 is here to avoid being matched by es* (a different OS)
+ es1800*)
+ os=ose
+ ;;
+ # Some version numbers need modification
+ chorusos*)
+ os=chorusos
+ ;;
+ isc)
+ os=isc2.2
+ ;;
+ sco6)
+ os=sco5v6
+ ;;
+ sco5)
+ os=sco3.2v5
+ ;;
+ sco4)
+ os=sco3.2v4
+ ;;
+ sco3.2.[4-9]*)
+ os=`echo "$os" | sed -e 's/sco3.2./sco3.2v/'`
+ ;;
+ sco*v* | scout)
+ # Don't match below
+ ;;
+ sco*)
+ os=sco3.2v2
+ ;;
+ psos*)
+ os=psos
+ ;;
+ qnx*)
+ os=qnx
+ ;;
+ hiux*)
+ os=hiuxwe2
+ ;;
+ lynx*178)
+ os=lynxos178
+ ;;
+ lynx*5)
+ os=lynxos5
+ ;;
+ lynxos*)
+ # don't get caught up in next wildcard
+ ;;
+ lynx*)
+ os=lynxos
+ ;;
+ mac[0-9]*)
+ os=`echo "$os" | sed -e 's|mac|macos|'`
+ ;;
+ opened*)
+ os=openedition
+ ;;
+ os400*)
+ os=os400
+ ;;
+ sunos5*)
+ os=`echo "$os" | sed -e 's|sunos5|solaris2|'`
+ ;;
+ sunos6*)
+ os=`echo "$os" | sed -e 's|sunos6|solaris3|'`
+ ;;
+ wince*)
+ os=wince
+ ;;
+ utek*)
+ os=bsd
+ ;;
+ dynix*)
+ os=bsd
+ ;;
+ acis*)
+ os=aos
+ ;;
+ atheos*)
+ os=atheos
+ ;;
+ syllable*)
+ os=syllable
+ ;;
+ 386bsd)
+ os=bsd
+ ;;
+ ctix* | uts*)
+ os=sysv
+ ;;
+ nova*)
+ os=rtmk-nova
+ ;;
+ ns2)
+ os=nextstep2
+ ;;
+ # Preserve the version number of sinix5.
+ sinix5.*)
+ os=`echo "$os" | sed -e 's|sinix|sysv|'`
+ ;;
+ sinix*)
+ os=sysv4
+ ;;
+ tpf*)
+ os=tpf
+ ;;
+ triton*)
+ os=sysv3
+ ;;
+ oss*)
+ os=sysv3
+ ;;
+ svr4*)
+ os=sysv4
+ ;;
+ svr3)
+ os=sysv3
+ ;;
+ sysvr4)
+ os=sysv4
+ ;;
+ ose*)
+ os=ose
+ ;;
+ *mint | mint[0-9]* | *MiNT | MiNT[0-9]*)
+ os=mint
+ ;;
+ dicos*)
+ os=dicos
+ ;;
+ pikeos*)
+ # Until real need of OS specific support for
+ # particular features comes up, bare metal
+ # configurations are quite functional.
+ case $cpu in
+ arm*)
+ os=eabi
+ ;;
+ *)
+ os=elf
+ ;;
+ esac
+ ;;
+ *)
+ # No normalization, but not necessarily accepted, that comes below.
+ ;;
+esac
+
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system. Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+kernel=
+case $cpu-$vendor in
+ score-*)
+ os=elf
+ ;;
+ spu-*)
+ os=elf
+ ;;
+ *-acorn)
+ os=riscix1.2
+ ;;
+ arm*-rebel)
+ kernel=linux
+ os=gnu
+ ;;
+ arm*-semi)
+ os=aout
+ ;;
+ c4x-* | tic4x-*)
+ os=coff
+ ;;
+ c8051-*)
+ os=elf
+ ;;
+ clipper-intergraph)
+ os=clix
+ ;;
+ hexagon-*)
+ os=elf
+ ;;
+ tic54x-*)
+ os=coff
+ ;;
+ tic55x-*)
+ os=coff
+ ;;
+ tic6x-*)
+ os=coff
+ ;;
+ # This must come before the *-dec entry.
+ pdp10-*)
+ os=tops20
+ ;;
+ pdp11-*)
+ os=none
+ ;;
+ *-dec | vax-*)
+ os=ultrix4.2
+ ;;
+ m68*-apollo)
+ os=domain
+ ;;
+ i386-sun)
+ os=sunos4.0.2
+ ;;
+ m68000-sun)
+ os=sunos3
+ ;;
+ m68*-cisco)
+ os=aout
+ ;;
+ mep-*)
+ os=elf
+ ;;
+ mips*-cisco)
+ os=elf
+ ;;
+ mips*-*)
+ os=elf
+ ;;
+ or32-*)
+ os=coff
+ ;;
+ *-tti) # must be before sparc entry or we get the wrong os.
+ os=sysv3
+ ;;
+ sparc-* | *-sun)
+ os=sunos4.1.1
+ ;;
+ pru-*)
+ os=elf
+ ;;
+ *-be)
+ os=beos
+ ;;
+ *-ibm)
+ os=aix
+ ;;
+ *-knuth)
+ os=mmixware
+ ;;
+ *-wec)
+ os=proelf
+ ;;
+ *-winbond)
+ os=proelf
+ ;;
+ *-oki)
+ os=proelf
+ ;;
+ *-hp)
+ os=hpux
+ ;;
+ *-hitachi)
+ os=hiux
+ ;;
+ i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+ os=sysv
+ ;;
+ *-cbm)
+ os=amigaos
+ ;;
+ *-dg)
+ os=dgux
+ ;;
+ *-dolphin)
+ os=sysv3
+ ;;
+ m68k-ccur)
+ os=rtu
+ ;;
+ m88k-omron*)
+ os=luna
+ ;;
+ *-next)
+ os=nextstep
+ ;;
+ *-sequent)
+ os=ptx
+ ;;
+ *-crds)
+ os=unos
+ ;;
+ *-ns)
+ os=genix
+ ;;
+ i370-*)
+ os=mvs
+ ;;
+ *-gould)
+ os=sysv
+ ;;
+ *-highlevel)
+ os=bsd
+ ;;
+ *-encore)
+ os=bsd
+ ;;
+ *-sgi)
+ os=irix
+ ;;
+ *-siemens)
+ os=sysv4
+ ;;
+ *-masscomp)
+ os=rtu
+ ;;
+ f30[01]-fujitsu | f700-fujitsu)
+ os=uxpv
+ ;;
+ *-rom68k)
+ os=coff
+ ;;
+ *-*bug)
+ os=coff
+ ;;
+ *-apple)
+ os=macos
+ ;;
+ *-atari*)
+ os=mint
+ ;;
+ *-wrs)
+ os=vxworks
+ ;;
+ *)
+ os=none
+ ;;
+esac
+
+fi
+
+# Now, validate our (potentially fixed-up) OS.
+case $os in
+ # Sometimes we do "kernel-libc", so those need to count as OSes.
+ musl* | newlib* | relibc* | uclibc*)
+ ;;
+ # Likewise for "kernel-abi"
+ eabi* | gnueabi*)
+ ;;
+ # VxWorks passes extra cpu info in the 4th filed.
+ simlinux | simwindows | spe)
+ ;;
+ # Now accept the basic system types.
+ # The portable systems comes first.
+ # Each alternative MUST end in a * to match a version number.
+ gnu* | android* | bsd* | mach* | minix* | genix* | ultrix* | irix* \
+ | *vms* | esix* | aix* | cnk* | sunos | sunos[34]* \
+ | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \
+ | sym* | plan9* | psp* | sim* | xray* | os68k* | v88r* \
+ | hiux* | abug | nacl* | netware* | windows* \
+ | os9* | macos* | osx* | ios* \
+ | mpw* | magic* | mmixware* | mon960* | lnews* \
+ | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \
+ | aos* | aros* | cloudabi* | sortix* | twizzler* \
+ | nindy* | vxsim* | vxworks* | ebmon* | hms* | mvs* \
+ | clix* | riscos* | uniplus* | iris* | isc* | rtu* | xenix* \
+ | mirbsd* | netbsd* | dicos* | openedition* | ose* \
+ | bitrig* | openbsd* | secbsd* | solidbsd* | libertybsd* | os108* \
+ | ekkobsd* | freebsd* | riscix* | lynxos* | os400* \
+ | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \
+ | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \
+ | udi* | lites* | ieee* | go32* | aux* | hcos* \
+ | chorusrdb* | cegcc* | glidix* | serenity* \
+ | cygwin* | msys* | pe* | moss* | proelf* | rtems* \
+ | midipix* | mingw32* | mingw64* | mint* \
+ | uxpv* | beos* | mpeix* | udk* | moxiebox* \
+ | interix* | uwin* | mks* | rhapsody* | darwin* \
+ | openstep* | oskit* | conix* | pw32* | nonstopux* \
+ | storm-chaos* | tops10* | tenex* | tops20* | its* \
+ | os2* | vos* | palmos* | uclinux* | nucleus* | morphos* \
+ | scout* | superux* | sysv* | rtmk* | tpf* | windiss* \
+ | powermax* | dnix* | nx6 | nx7 | sei* | dragonfly* \
+ | skyos* | haiku* | rdos* | toppers* | drops* | es* \
+ | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \
+ | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \
+ | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx* | zephyr* \
+ | fiwix* )
+ ;;
+ # This one is extra strict with allowed versions
+ sco3.2v2 | sco3.2v[4-9]* | sco5v6*)
+ # Don't forget version if it is 3.2v4 or newer.
+ ;;
+ none)
+ ;;
+ *)
+ echo Invalid configuration \`"$1"\': OS \`"$os"\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+
+# As a final step for OS-related things, validate the OS-kernel combination
+# (given a valid OS), if there is a kernel.
+case $kernel-$os in
+ linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* \
+ | linux-musl* | linux-relibc* | linux-uclibc* )
+ ;;
+ uclinux-uclibc* )
+ ;;
+ -dietlibc* | -newlib* | -musl* | -relibc* | -uclibc* )
+ # These are just libc implementations, not actual OSes, and thus
+ # require a kernel.
+ echo "Invalid configuration \`$1': libc \`$os' needs explicit kernel." 1>&2
+ exit 1
+ ;;
+ kfreebsd*-gnu* | kopensolaris*-gnu*)
+ ;;
+ vxworks-simlinux | vxworks-simwindows | vxworks-spe)
+ ;;
+ nto-qnx*)
+ ;;
+ os2-emx)
+ ;;
+ *-eabi* | *-gnueabi*)
+ ;;
+ -*)
+ # Blank kernel with real OS is always fine.
+ ;;
+ *-*)
+ echo "Invalid configuration \`$1': Kernel \`$kernel' not known to work with OS \`$os'." 1>&2
+ exit 1
+ ;;
+esac
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer. We pick the logical manufacturer.
+case $vendor in
+ unknown)
+ case $cpu-$os in
+ *-riscix*)
+ vendor=acorn
+ ;;
+ *-sunos*)
+ vendor=sun
+ ;;
+ *-cnk* | *-aix*)
+ vendor=ibm
+ ;;
+ *-beos*)
+ vendor=be
+ ;;
+ *-hpux*)
+ vendor=hp
+ ;;
+ *-mpeix*)
+ vendor=hp
+ ;;
+ *-hiux*)
+ vendor=hitachi
+ ;;
+ *-unos*)
+ vendor=crds
+ ;;
+ *-dgux*)
+ vendor=dg
+ ;;
+ *-luna*)
+ vendor=omron
+ ;;
+ *-genix*)
+ vendor=ns
+ ;;
+ *-clix*)
+ vendor=intergraph
+ ;;
+ *-mvs* | *-opened*)
+ vendor=ibm
+ ;;
+ *-os400*)
+ vendor=ibm
+ ;;
+ s390-* | s390x-*)
+ vendor=ibm
+ ;;
+ *-ptx*)
+ vendor=sequent
+ ;;
+ *-tpf*)
+ vendor=ibm
+ ;;
+ *-vxsim* | *-vxworks* | *-windiss*)
+ vendor=wrs
+ ;;
+ *-aux*)
+ vendor=apple
+ ;;
+ *-hms*)
+ vendor=hitachi
+ ;;
+ *-mpw* | *-macos*)
+ vendor=apple
+ ;;
+ *-*mint | *-mint[0-9]* | *-*MiNT | *-MiNT[0-9]*)
+ vendor=atari
+ ;;
+ *-vos*)
+ vendor=stratus
+ ;;
+ esac
+ ;;
+esac
+
+echo "$cpu-$vendor-${kernel:+$kernel-}$os"
+exit
+
+# Local variables:
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/configure b/configure
new file mode 100755
index 0000000..2e37f16
--- /dev/null
+++ b/configure
@@ -0,0 +1,51590 @@
+#! /bin/sh
+# From configure.in 2.9.0dev.12.
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by Autoconf 2.52.20221202.
+#
+# Copyright 2003-2021,2022 Thomas E. Dickey
+# Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001
+# Free Software Foundation, Inc.
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g"
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+ set -o posix
+fi
+
+# Name of the executable.
+as_me=`echo "$0" |sed 's,.*[\\/],,'`
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr="expr"
+else
+ as_expr="false"
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+ # We could just check for DJGPP; but this test a) works b) is more generic
+ # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+ if test -f conf$$.exe; then
+ # Don't use ln at all; we don't have any links
+ as_ln_s='cp -p'
+ else
+ as_ln_s='ln -s'
+ fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln'
+else
+ as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+as_executable_p="test -f"
+
+# Support unset when possible.
+if (FOO=FOO; unset FOO) >/dev/null 2>&1; then
+ as_unset="unset"
+else
+ as_unset="false"
+fi
+
+# NLS nuisances.
+$as_unset LANG || test "${LANG+set}" != set || { LANG=C; export LANG; }
+$as_unset LC_ALL || test "${LC_ALL+set}" != set || { LC_ALL=C; export LC_ALL; }
+$as_unset LC_TIME || test "${LC_TIME+set}" != set || { LC_TIME=C; export LC_TIME; }
+$as_unset LC_CTYPE || test "${LC_CTYPE+set}" != set || { LC_CTYPE=C; export LC_CTYPE; }
+$as_unset LANGUAGE || test "${LANGUAGE+set}" != set || { LANGUAGE=C; export LANGUAGE; }
+$as_unset LC_COLLATE || test "${LC_COLLATE+set}" != set || { LC_COLLATE=C; export LC_COLLATE; }
+$as_unset LC_NUMERIC || test "${LC_NUMERIC+set}" != set || { LC_NUMERIC=C; export LC_NUMERIC; }
+$as_unset LC_MESSAGES || test "${LC_MESSAGES+set}" != set || { LC_MESSAGES=C; export LC_MESSAGES; }
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" $as_nl"
+
+# CDPATH.
+$as_unset CDPATH || test "${CDPATH+set}" != set || { CDPATH=:; export CDPATH; }
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+exec 6>&1
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Maximum number of lines to put in a shell here document.
+# This variable seems obsolete. It should probably be removed, and
+# only ac_max_sed_lines should be used.
+: "${ac_max_here_lines=38}"
+
+ac_unique_file="userdefs.h"
+ac_default_prefix=/usr/local
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#if HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#if STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# if HAVE_STDLIB_H
+# include <stdlib.h>
+# endif
+#endif
+#if HAVE_STRING_H
+# if !STDC_HEADERS && HAVE_MEMORY_H
+# include <memory.h>
+# endif
+# include <string.h>
+#endif
+#if HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#if HAVE_INTTYPES_H
+# include <inttypes.h>
+#else
+# if HAVE_STDINT_H
+# include <stdint.h>
+# endif
+#endif
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+runstatedir='${localstatedir}/run'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${datarootdir}/info'
+mandir='${datarootdir}/man'
+
+# Identity of this package.
+PACKAGE_NAME=
+PACKAGE_TARNAME=
+PACKAGE_VERSION=
+PACKAGE_STRING=
+PACKAGE_BUGREPORT=
+
+ac_prev=
+for ac_option
+do
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval "$ac_prev=\$ac_option"
+ ac_prev=
+ continue
+ fi
+
+ ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case "$ac_option" in
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir=$ac_optarg ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build_alias ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build_alias=$ac_optarg ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file=$ac_optarg ;;
+
+ --config-cache | -C)
+ cache_file=config.cache ;;
+
+ -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+ | --da=*)
+ datadir=$ac_optarg ;;
+
+ -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+ | --dataroo | --dataro | --datar)
+ ac_prev=datarootdir ;;
+ -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+ datarootdir=$ac_optarg ;;
+
+ -disable-* | --disable-*)
+ ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+ { (exit 1); exit 1; }; }
+ ac_feature=`echo "$ac_feature" | sed 's/-/_/g'`
+ eval "enable_$ac_feature=no" ;;
+
+ -enable-* | --enable-*)
+ ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+ { (exit 1); exit 1; }; }
+ ac_feature=`echo "$ac_feature" | sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "enable_$ac_feature='$ac_optarg'" ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix=$ac_optarg ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he | -h)
+ ac_init_help=long ;;
+ -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+ ac_init_help=recursive ;;
+ -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+ ac_init_help=short ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host_alias ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host_alias=$ac_optarg ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir=$ac_optarg ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir=$ac_optarg ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir=$ac_optarg ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir=$ac_optarg ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst \
+ | --locals | --local | --loca | --loc | --lo)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+ localstatedir=$ac_optarg ;;
+
+ -runstatedir | --runstatedir | --runstatedi | --runstated \
+ | --runstate | --runstat | --runsta | --runst \
+ | --runs | --run | --ru)
+ ac_prev=runstatedir ;;
+ -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \
+ | --runstate=* | --runstat=* | --runsta=* | --runst=* \
+ | --runs=* | --run=* | --ru=*)
+ runstatedir=$ac_optarg ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir=$ac_optarg ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir=$ac_optarg ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix=$ac_optarg ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix=$ac_optarg ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix=$ac_optarg ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name=$ac_optarg ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir=$ac_optarg ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir=$ac_optarg ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site=$ac_optarg ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir=$ac_optarg ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir=$ac_optarg ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target_alias ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target_alias=$ac_optarg ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers | -V)
+ ac_init_version=: ;;
+
+ -with-* | --with-*)
+ ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid package name: $ac_package" >&2
+ { (exit 1); exit 1; }; }
+ ac_package=`echo "$ac_package" | sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "with_$ac_package='$ac_optarg'" ;;
+
+ -without-* | --without-*)
+ ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid package name: $ac_package" >&2
+ { (exit 1); exit 1; }; }
+ ac_package=`echo "$ac_package" | sed 's/-/_/g'`
+ eval "with_$ac_package=no" ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes=$ac_optarg ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries=$ac_optarg ;;
+
+ -*) { echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+ { (exit 1); exit 1; }; }
+ ;;
+
+ *=*)
+ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+ { (exit 1); exit 1; }; }
+ ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`
+ eval "$ac_envvar='$ac_optarg'"
+ export "$ac_envvar" ;;
+
+ *)
+ # FIXME: should be removed in autoconf 3.0.
+ echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+ : "${build_alias=$ac_option}" "${host_alias=$ac_option}" "${target_alias=$ac_option}"
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ ac_option=--`echo "$ac_prev" | sed 's/_/-/g'`
+ { echo "$as_me: error: missing argument to $ac_option" >&2
+ { (exit 1); exit 1; }; }
+fi
+
+# Be sure to have absolute paths.
+for ac_var in exec_prefix prefix
+do
+ eval ac_val=$`echo "$ac_var"`
+ case "$ac_val" in
+ [\\/$]* | ?:[\\/]* | NONE | '' ) ;;
+ *) { echo "$as_me: error: expected an absolute path for --$ac_var: $ac_val" >&2
+ { (exit 1); exit 1; }; };;
+ esac
+done
+
+# Be sure to have absolute paths.
+for ac_var in bindir sbindir libexecdir datarootdir datadir sysconfdir sharedstatedir \
+ localstatedir libdir includedir oldincludedir infodir mandir
+do
+ eval ac_val=$`echo "$ac_var"`
+ case "$ac_val" in
+ [\\/$]* | ?:[\\/]* ) ;;
+ *) { echo "$as_me: error: expected an absolute path for --$ac_var: $ac_val" >&2
+ { (exit 1); exit 1; }; };;
+ esac
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: should be removed in autoconf 3.0.
+if test "x$host_alias" != x; then
+ if test "x$build_alias" = x; then
+ cross_compiling=maybe
+ echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+ If a cross compiler is detected then cross compile mode will be used." >&2
+ elif test "x$build_alias" != "x$host_alias"; then
+ cross_compiling=yes
+ fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then its parent.
+ ac_prog=$0
+ ac_confdir=`echo "$ac_prog" | sed 's%[\\/][^\\/][^\\/]*$%%'`
+ test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
+ srcdir=$ac_confdir
+ if test ! -r "$srcdir/$ac_unique_file"; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+ if test "$ac_srcdir_defaulted" = yes; then
+ { echo "$as_me: error: cannot find sources in $ac_confdir or .." >&2
+ { (exit 1); exit 1; }; }
+ else
+ { echo "$as_me: error: cannot find sources in $srcdir" >&2
+ { (exit 1); exit 1; }; }
+ fi
+fi
+srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'`
+ac_env_build_alias_set=${build_alias+set}
+ac_env_build_alias_value=$build_alias
+ac_cv_env_build_alias_set=${build_alias+set}
+ac_cv_env_build_alias_value=$build_alias
+ac_env_host_alias_set=${host_alias+set}
+ac_env_host_alias_value=$host_alias
+ac_cv_env_host_alias_set=${host_alias+set}
+ac_cv_env_host_alias_value=$host_alias
+ac_env_target_alias_set=${target_alias+set}
+ac_env_target_alias_value=$target_alias
+ac_cv_env_target_alias_set=${target_alias+set}
+ac_cv_env_target_alias_value=$target_alias
+ac_env_CC_set=${CC+set}
+ac_env_CC_value=$CC
+ac_cv_env_CC_set=${CC+set}
+ac_cv_env_CC_value=$CC
+ac_env_CFLAGS_set=${CFLAGS+set}
+ac_env_CFLAGS_value=$CFLAGS
+ac_cv_env_CFLAGS_set=${CFLAGS+set}
+ac_cv_env_CFLAGS_value=$CFLAGS
+ac_env_LDFLAGS_set=${LDFLAGS+set}
+ac_env_LDFLAGS_value=$LDFLAGS
+ac_cv_env_LDFLAGS_set=${LDFLAGS+set}
+ac_cv_env_LDFLAGS_value=$LDFLAGS
+ac_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_env_CPPFLAGS_value=$CPPFLAGS
+ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_cv_env_CPPFLAGS_value=$CPPFLAGS
+ac_env_CPP_set=${CPP+set}
+ac_env_CPP_value=$CPP
+ac_cv_env_CPP_set=${CPP+set}
+ac_cv_env_CPP_value=$CPP
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat <<EOF
+\`configure' configures this package to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE. See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+ -h, --help display this help and exit
+ --help=short display options specific to this package
+ --help=recursive display the short help of all the included packages
+ -V, --version display version information and exit
+ -q, --quiet, --silent do not print \`checking...' messages
+ --cache-file=FILE cache test results in FILE [disabled]
+ -C, --config-cache alias for \`--cache-file=config.cache'
+ -n, --no-create do not create output files
+ --srcdir=DIR find the sources in DIR [configure dir or \`..']
+
+EOF
+
+ cat <<EOF
+Installation directories:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+ --bindir=DIR user executables [EPREFIX/bin]
+ --sbindir=DIR system admin executables [EPREFIX/sbin]
+ --libexecdir=DIR program executables [EPREFIX/libexec]
+ --datarootdir=DIR read-only architecture-independent data [PREFIX/share]
+ --datadir=DIR read-only architecture-independent data [DATAROOTDIR]
+ --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data [PREFIX/var]
+ --runstatedir=DIR extra definition of runtime data [LOCALSTATEDIR/run]
+ --libdir=DIR object code libraries [EPREFIX/lib]
+ --includedir=DIR C header files [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc [/usr/include]
+ --infodir=DIR info documentation [DATAROOTDIR/info]
+ --mandir=DIR man documentation [DATAROOTDIR/man]
+EOF
+
+ cat <<\EOF
+
+Program names:
+ --program-prefix=PREFIX prepend PREFIX to installed program names
+ --program-suffix=SUFFIX append SUFFIX to installed program names
+ --program-transform-name=PROGRAM run sed PROGRAM on installed program names
+
+X features:
+ --x-includes=DIR X include files are in DIR
+ --x-libraries=DIR X library files are in DIR
+
+System types:
+ --build=BUILD configure for building on BUILD [guessed]
+ --host=HOST build programs to run on HOST [BUILD]
+ --target=TARGET configure for building compilers for TARGET [HOST]
+EOF
+fi
+
+if test -n "$ac_init_help"; then
+
+ cat <<\EOF
+
+Optional Packages:
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+
+Optional Features:
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+
+ --with-system-type=XXX test: override derived host system-type
+ --with-destdir=XXX set DESTDIR destination for install (default: $DESTDIR)
+ --with-build-cc=XXX the build C compiler ($BUILD_CC)
+ --with-build-cpp=XXX the build C preprocessor ($BUILD_CPP)
+ --with-build-cflags=XXX the build C compiler-flags ($BUILD_CFLAGS)
+ --with-build-cppflags=XXX the build C preprocessor-flags ($BUILD_CPPFLAGS)
+ --with-build-ldflags=XXX the build linker-flags ($BUILD_LDFLAGS)
+ --with-build-libs=XXX the build libraries (${BUILD_LIBS})
+Development Options:
+ --disable-echo do not display "compiling" commands
+ --enable-find-leaks logic for testing memory leaks
+ --enable-debug compile w/ debugging (if \$CFLAGS is set, add -g there, too)
+ --disable-trace disable logic for trace code
+ --enable-vertrace verbose trace code
+ --with-x use the X Window System
+ --enable-warnings test: turn on gcc compiler warnings
+ --enable-stdnoreturn enable C11 _Noreturn feature for diagnostics
+ --with-dbmalloc test: use Conor Cahill's dbmalloc library
+ --with-dmalloc test: use Gray Watson's dmalloc library
+Basic Configuration Options:
+ --disable-largefile omit support for large files
+ --with-libiconv-prefix=DIR
+ search for libiconv in DIR/include and DIR/lib
+ --enable-nls use Native Language Support
+ --with-included-gettext use the GNU gettext library included here
+ --with-textdomain=PKG NLS text-domain (default is package name)
+ --disable-included-msgs use included messages, for i18n support
+ --with-nls-datadir=DIR NLS data, parent of locale (default: PREFIX/DATADIR)
+ --disable-full-paths control whether full utility pathnames are used
+ --with-nss-compat{=path} link with nss_compat library if available
+ --with-ssl{=path} link with ssl library if available
+ --with-gnutls{=path} link with gnutls support
+ --enable-gnutls-compat link with gnutls-openssl compat
+ --with-socks{=path} link with socks library if available
+ --with-socks5{=path} link with socks5 library if available
+ --with-pkg-config{=path} enable/disable use of pkg-config
+ --enable-ipv6 use ipv6 (with ipv4) support
+ --with-screen=XXX select screen type (XXX is curses (default),
+ ncurses, ncursesw, pdcurses or slang)
+ --with-curses-dir=DIR directory in which (n)curses is installed
+ --enable-widec enable wide-curses features
+ --disable-color-style use color style (ncurses/curses)
+ --with-lss-file{=path} specify the default style-sheet file
+ (default: SYSCONFDIR/lynx.lss)
+ --with-cfg-file{=path} specify the default configuration file
+ (default: SYSCONFDIR/lynx.cfg)
+ --with-cfg-path{=path} specify the default configuration directories
+ (default: SYSCONFDIR)
+ --enable-htmlized-cfg build htmlized lynx.cfg
+ --enable-local-docs link local doc-directory to help-page
+ --with-mime-libdir=DIR MIME data, mime.types and mailcap (default: /etc)
+ --disable-locale-charset use locale-charset selection logic
+ --with-charsets=list limit charsets to given list of MIME names
+Experimental Options:
+ --disable-bibp-urls disable support for bibp: URLs
+ --disable-config-info disable browsable configuration-info
+ --disable-forms-options disable forms-based options
+ --disable-menu-options disable old-style option menu
+ --disable-sessions use sessions code
+ --disable-session-cache use session-caching code
+ --disable-addrlist-page disable address-list page
+ --disable-cjk do not use CJK logic
+ --enable-chinese-utf8 use Chinese UTF-8 logic
+ --disable-japanese-utf8 do not use Japanese UTF-8 logic
+ --enable-wcwidth-support use experimental wcwidth/UTF-8 logic
+ --enable-default-colors enable use of default-colors (ncurses/slang)
+ --enable-kbd-layout use experimental keyboard-layout support
+ --enable-nested-tables use experimental nested-table support
+Miscellaneous Options:
+ --disable-alt-bindings disable alternative line-edit bindings
+ --disable-ascii-ctypes disable use of ascii case-conversion
+ --disable-extended-dtd disable extended HTML DTD logic
+ --disable-file-upload disable file-upload support
+ --disable-idna disable IDNA support
+ --disable-justify-elts disable element-justification logic
+ --disable-partial disable partial-display logic
+ --disable-persistent-cookies disable persistent-cookie support
+ --disable-prettysrc disable colorization of HTML source
+ --disable-progressbar disable progress-bar
+ --disable-read-eta disable read-progress message shows ETA
+ --disable-source-cache do not cache HTML source for parse mode changes
+ --disable-scrollbar disable scrollbar with mouse
+ --enable-charset-choice use charset-selection logic
+ --enable-externs use external commands
+ --enable-font-switch use Linux setfont for character-translation
+ --enable-cgi-links support cgi links w/o a http daemon
+ --enable-change-exec allow users to change exec options
+ --enable-exec-links allow lynx to execute programs accessed via a link
+ --enable-exec-scripts allow lynx to execute programs inferred from a link
+ --enable-internal-links handle following links to same doc differently
+ --enable-nsl-fork fork NSL requests, allowing them to be aborted
+ --enable-syslog log URL requests via syslog
+ --enable-underlines underline links rather than using boldface
+ --enable-gzip-help install gzip'ed help files
+ --with-bzlib use libbz2 for decompression of some bzip2 files
+ --with-zlib use zlib for decompression of some gzip files
+ --with-brotli use brotli decompression
+Other Network Services:
+ --disable-finger disable FINGER logic
+ --disable-gopher disable GOPHER logic
+ --disable-news disable NEWS logic
+ --disable-ftp disable FTP logic
+ --enable-wais enable WAIS logic
+Directory Editor Options:
+ --disable-dired disable optional directory-editor, DirEd
+ --disable-dired-dearchive disable dearchiving commands
+ --disable-dired-override disable DirEd override keymap
+ --disable-dired-permit disable chmod/attrib commands
+ --disable-dired-xpermit disable chmod/attrib commands
+ --disable-dired-tar disable "tar" command
+ --disable-dired-uudecode disable "uudecode" command
+ --disable-dired-zip disable "zip", "unzip" commands
+ --disable-dired-gzip disable "gzip", "gunzip" commands
+ --disable-long-list disable long "ls -l" directory listings
+ --disable-parent-dir-refs
+ disable "Up-to" links in directory listings
+Special Libraries for PDCurses X11:
+ --with-Xaw3d link with Xaw 3d library
+ --with-Xaw3dxft link with Xaw 3d xft library
+ --with-neXtaw link with neXT Athena library
+ --with-XawPlus link with Athena-Plus library
+ --disable-rpath-hack don't add rpath options for additional libraries
+
+Some influential environment variables:
+ CC C compiler command
+ CFLAGS C compiler flags
+ LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
+ nonstandard directory <lib dir>
+ CPPFLAGS C/C++ preprocessor flags, e.g. -I<include dir> if you have
+ headers in a nonstandard directory <include dir>
+ CPP C preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+EOF
+fi
+
+if test "$ac_init_help" = "recursive"; then
+ # If there are subdirs, report their specific --help.
+ ac_popdir=`pwd`
+ for ac_subdir in : $ac_subdirs_all; do test "x$ac_subdir" = x: && continue
+ cd "$ac_subdir"
+ # A "../" for each directory in /$ac_subdir.
+ ac_dots=`echo "$ac_subdir" |
+ sed 's,^\./,,;s,[^/]$,&/,;s,[^/]*/,../,g'`
+
+ case "$srcdir" in
+ .) # No --srcdir option. We are building in place.
+ ac_sub_srcdir="$srcdir" ;;
+ [\\/]* | ?:[\\/]* ) # Absolute path.
+ ac_sub_srcdir="$srcdir/$ac_subdir" ;;
+ *) # Relative path.
+ ac_sub_srcdir="$ac_dots$srcdir/$ac_subdir" ;;
+ esac
+
+ # Check for guested configure; otherwise get Cygnus style configure.
+ if test -f "$ac_sub_srcdir/configure.gnu"; then
+ echo
+ $SHELL "$ac_sub_srcdir/configure.gnu" --help=recursive
+ elif test -f "$ac_sub_srcdir/configure"; then
+ echo
+ $SHELL "$ac_sub_srcdir/configure" --help=recursive
+ elif test -f "$ac_sub_srcdir/configure.ac" ||
+ test -f "$ac_sub_srcdir/configure.in"; then
+ echo
+ "$ac_configure" --help
+ else
+ echo "$as_me: WARNING: no configuration information is in $ac_subdir" >&2
+ fi
+ cd "$ac_popdir"
+ done
+fi
+
+test -n "$ac_init_help" && exit 0
+if "$ac_init_version"; then
+ cat <<\EOF
+
+Copyright 2003-2021,2022 Thomas E. Dickey
+Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001
+Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+EOF
+ exit 0
+fi
+exec 5>config.log
+cat >&5 <<EOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by $as_me, which was
+generated by GNU Autoconf 2.52.20221202. Invocation command line was
+
+ $ $0 $@
+
+EOF
+{
+cat <<_ASUNAME
+## ---------- ##
+## Platform. ##
+## ---------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
+
+/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+hostinfo = `(hostinfo) 2>/dev/null || echo unknown`
+/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
+/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
+
+PATH = $PATH
+
+_ASUNAME
+} >&5
+
+cat >&5 <<EOF
+## ------------ ##
+## Core tests. ##
+## ------------ ##
+
+EOF
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Also quote any args containing shell meta-characters.
+ac_configure_args=
+ac_sep=
+for ac_arg
+do
+ case "$ac_arg" in
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c) ;;
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+ ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"`
+ ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
+ ac_sep=" " ;;
+ *) ac_configure_args="$ac_configure_args$ac_sep$ac_arg"
+ ac_sep=" " ;;
+ esac
+ # Get rid of the leading space.
+done
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log. We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+trap 'exit_status=$?
+ # Save into config.log some information that might help in debugging.
+ echo >&5
+ echo "## ----------------- ##" >&5
+ echo "## Cache variables. ##" >&5
+ echo "## ----------------- ##" >&5
+ echo >&5
+ # The following way of writing the cache mishandles newlines in values,
+{
+ (set) 2>&1 |
+ case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ sed -n \
+ "s/'"'"'/'"'"'\\\\'"'"''"'"'/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"
+ ;;
+ *)
+ sed -n \
+ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+ ;;
+ esac;
+} >&5
+ sed "/^$/d" confdefs.h >conftest.log
+ if test -s conftest.log; then
+ echo >&5
+ echo "## ------------ ##" >&5
+ echo "## confdefs.h. ##" >&5
+ echo "## ------------ ##" >&5
+ echo >&5
+ cat conftest.log >&5
+ fi
+ (echo; echo) >&5
+ test "$ac_signal" != 0 &&
+ echo "$as_me: caught signal $ac_signal" >&5
+ echo "$as_me: exit $exit_status" >&5
+ rm -rf conftest* confdefs* core core.* *.core conf$$* $ac_clean_files &&
+ exit $exit_status
+ ' 0
+for ac_signal in 1 2 13 15; do
+ trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' "$ac_signal"
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo >confdefs.h
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+ if test "x$prefix" != xNONE; then
+ CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+ else
+ CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+ fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+ if test -r "$ac_site_file"; then
+ { echo "$as_me:1025: loading site script $ac_site_file" >&5
+echo "$as_me: loading site script $ac_site_file" >&6;}
+ cat "$ac_site_file" >&5
+ . "$ac_site_file"
+ fi
+done
+
+if test -r "$cache_file"; then
+ # Some versions of bash will fail to source /dev/null (special
+ # files actually), so we avoid doing that.
+ if test -f "$cache_file"; then
+ { echo "$as_me:1036: loading cache $cache_file" >&5
+echo "$as_me: loading cache $cache_file" >&6;}
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) . $cache_file;;
+ *) . ./$cache_file;;
+ esac
+ fi
+else
+ { echo "$as_me:1044: creating cache $cache_file" >&5
+echo "$as_me: creating cache $cache_file" >&6;}
+ >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in `(set) 2>&1 |
+ sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do
+ eval ac_old_set=\$ac_cv_env_${ac_var}_set
+ eval ac_new_set=\$ac_env_${ac_var}_set
+ eval ac_old_val="\$ac_cv_env_${ac_var}_value"
+ eval ac_new_val="\$ac_env_${ac_var}_value"
+ case "$ac_old_set,$ac_new_set" in
+ set,)
+ { echo "$as_me:1060: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,set)
+ { echo "$as_me:1064: error: \`$ac_var' was not set in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,);;
+ *)
+ if test "x$ac_old_val" != "x$ac_new_val"; then
+ { echo "$as_me:1070: error: \`$ac_var' has changed since the previous run:" >&5
+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ { echo "$as_me:1072: former value: $ac_old_val" >&5
+echo "$as_me: former value: $ac_old_val" >&2;}
+ { echo "$as_me:1074: current value: $ac_new_val" >&5
+echo "$as_me: current value: $ac_new_val" >&2;}
+ ac_cache_corrupted=:
+ fi;;
+ esac
+ # Pass precious variables to config.status. It doesn't matter if
+ # we pass some twice (in addition to the command line arguments).
+ if test "$ac_new_set" = set; then
+ case "$ac_new_val" in
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+ ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"`
+ ac_configure_args="$ac_configure_args '$ac_arg'"
+ ;;
+ *) ac_configure_args="$ac_configure_args $ac_var=$ac_new_val"
+ ;;
+ esac
+ fi
+done
+if "$ac_cache_corrupted"; then
+ { echo "$as_me:1093: error: changes in the environment can compromise the build" >&5
+echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+ { { echo "$as_me:1095: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS "conftest.$ac_ext" >&5'
+ac_link='$CC -o "conftest$ac_exeext" $CFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ac_main_return="return"
+
+case `echo "testing\c" 2>/dev/null; echo 1,2,3`,`echo -n testing 2>/dev/null; echo 1,2,3` in
+ *c*,-n*) ECHO_N=
+ ECHO_C= # newlines do not sed ;-) only broken shells would use this case anyway
+ ECHO_T=' '
+ ;;
+ *c*,* ) ECHO_N=-n
+ ECHO_C=
+ ECHO_T=
+ ;;
+ *) ECHO_N=
+ ECHO_C='\c'
+ ECHO_T=
+ ;;
+esac
+echo "#! $SHELL" >conftest.sh
+echo "exit 0" >>conftest.sh
+chmod +x conftest.sh
+if { (echo "$as_me:1124: PATH=\".;.\"; conftest.sh") >&5
+ (PATH=".;."; conftest.sh) 2>&5
+ ac_status=$?
+ echo "$as_me:1127: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; then
+ ac_path_separator=';'
+else
+ ac_path_separator=:
+fi
+PATH_SEPARATOR="$ac_path_separator"
+rm -f conftest.sh
+
+# autoconf 2.5x defaults to no cache file; we need the cache file's information
+# for building the config page. But start with it empty to avoid confusion by
+# people who don't do a "make distclean" after applying patches.
+cache_file=config.cache
+rm -f config.cache; touch config.cache
+
+CONFIG_H=lynx_cfg.h
+ac_config_headers="$ac_config_headers $CONFIG_H:config.hin"
+
+ac_aux_dir=
+for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+ if test -f "$ac_dir/install-sh"; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install-sh -c"
+ break
+ elif test -f "$ac_dir/install.sh"; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install.sh -c"
+ break
+ elif test -f "$ac_dir/shtool"; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/shtool install -c"
+ break
+ fi
+done
+if test -z "$ac_aux_dir"; then
+ { { echo "$as_me:1162: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5
+echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"
+ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure.
+
+# Make sure we can run config.sub.
+$ac_config_sub sun4 >/dev/null 2>&1 ||
+ { { echo "$as_me:1172: error: cannot run $ac_config_sub" >&5
+echo "$as_me: error: cannot run $ac_config_sub" >&2;}
+ { (exit 1); exit 1; }; }
+
+echo "$as_me:1176: checking build system type" >&5
+echo $ECHO_N "checking build system type... $ECHO_C" >&6
+if test "${ac_cv_build+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_build_alias=$build_alias
+test -z "$ac_cv_build_alias" &&
+ ac_cv_build_alias=`$ac_config_guess`
+test -z "$ac_cv_build_alias" &&
+ { { echo "$as_me:1185: error: cannot guess build type; you must specify one" >&5
+echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
+ { (exit 1); exit 1; }; }
+ac_cv_build=`$ac_config_sub "$ac_cv_build_alias"` ||
+ { { echo "$as_me:1189: error: $ac_config_sub $ac_cv_build_alias failed." >&5
+echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed." >&2;}
+ { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:1194: result: $ac_cv_build" >&5
+echo "${ECHO_T}$ac_cv_build" >&6
+build=$ac_cv_build
+build_cpu=`echo "$ac_cv_build" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+build_vendor=`echo "$ac_cv_build" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+build_os=`echo "$ac_cv_build" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+echo "$as_me:1201: checking host system type" >&5
+echo $ECHO_N "checking host system type... $ECHO_C" >&6
+if test "${ac_cv_host+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_host_alias=$host_alias
+test -z "$ac_cv_host_alias" &&
+ ac_cv_host_alias=$ac_cv_build_alias
+ac_cv_host=`$ac_config_sub "$ac_cv_host_alias"` ||
+ { { echo "$as_me:1210: error: $ac_config_sub $ac_cv_host_alias failed" >&5
+echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;}
+ { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:1215: result: $ac_cv_host" >&5
+echo "${ECHO_T}$ac_cv_host" >&6
+host=$ac_cv_host
+host_cpu=`echo "$ac_cv_host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo "$ac_cv_host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo "$ac_cv_host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+if test -f "$srcdir/config.guess" || test -f "$ac_aux_dir/config.guess" ; then
+ echo "$as_me:1223: checking target system type" >&5
+echo $ECHO_N "checking target system type... $ECHO_C" >&6
+if test "${ac_cv_target+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_target_alias=$target_alias
+test "x$ac_cv_target_alias" = "x" &&
+ ac_cv_target_alias=$ac_cv_host_alias
+ac_cv_target=`$ac_config_sub "$ac_cv_target_alias"` ||
+ { { echo "$as_me:1232: error: $ac_config_sub $ac_cv_target_alias failed" >&5
+echo "$as_me: error: $ac_config_sub $ac_cv_target_alias failed" >&2;}
+ { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:1237: result: $ac_cv_target" >&5
+echo "${ECHO_T}$ac_cv_target" >&6
+target=$ac_cv_target
+target_cpu=`echo "$ac_cv_target" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+target_vendor=`echo "$ac_cv_target" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+target_os=`echo "$ac_cv_target" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+# The aliases save the names the user supplied, while $host etc.
+# will get canonicalized.
+test -n "$target_alias" &&
+ test "$program_prefix$program_suffix$program_transform_name" = \
+ NONENONEs,x,x, &&
+ program_prefix=${target_alias}-
+ system_name="$host_os"
+else
+ system_name="`(uname -s -r) 2>/dev/null`"
+ if test -z "$system_name" ; then
+ system_name="`(hostname) 2>/dev/null`"
+ fi
+fi
+test -n "$system_name" &&
+cat >>confdefs.h <<EOF
+#define SYSTEM_NAME "$system_name"
+EOF
+
+if test "${cf_cv_system_name+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cf_cv_system_name="$system_name"
+fi
+
+test -z "$system_name" && system_name="$cf_cv_system_name"
+test -n "$cf_cv_system_name" && echo "$as_me:1269: result: Configuring for $cf_cv_system_name" >&5
+echo "${ECHO_T}Configuring for $cf_cv_system_name" >&6
+
+if test ".$system_name" != ".$cf_cv_system_name" ; then
+ echo "$as_me:1273: result: Cached system name ($system_name) does not agree with actual ($cf_cv_system_name)" >&5
+echo "${ECHO_T}Cached system name ($system_name) does not agree with actual ($cf_cv_system_name)" >&6
+ { { echo "$as_me:1275: error: \"Please remove config.cache and try again.\"" >&5
+echo "$as_me: error: \"Please remove config.cache and try again.\"" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+# Check whether --with-system-type or --without-system-type was given.
+if test "${with_system_type+set}" = set; then
+ withval="$with_system_type"
+ { echo "$as_me:1283: WARNING: overriding system type $host_os to $withval" >&5
+echo "$as_me: WARNING: overriding system type $host_os to $withval" >&2;}
+ host_os=$withval
+fi;
+
+test "$program_prefix" != NONE &&
+ program_transform_name="s,^,$program_prefix,;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+ program_transform_name="s,\$,$program_suffix,;$program_transform_name"
+# Double any \ or $. echo might interpret backslashes.
+# By default was `s,x,x', remove it if useless.
+cat <<\_ACEOF >conftest.sed
+s/[\\$]/&&/g;s/;s,x,x,$//
+_ACEOF
+program_transform_name=`echo $program_transform_name | sed -f conftest.sed`
+rm conftest.sed
+
+PACKAGE=lynx
+# $Format: "VERSION=$ProjectVersion$"$
+VERSION=2.9.0dev.12
+
+echo "$as_me:1305: checking for DESTDIR" >&5
+echo $ECHO_N "checking for DESTDIR... $ECHO_C" >&6
+
+# Check whether --with-destdir or --without-destdir was given.
+if test "${with_destdir+set}" = set; then
+ withval="$with_destdir"
+
+else
+ withval="${DESTDIR:-$DESTDIR}"
+fi; if test -n "$DESTDIR" ; then
+
+if test "x$prefix" != xNONE; then
+ cf_path_syntax="$prefix"
+else
+ cf_path_syntax="$ac_default_prefix"
+fi
+
+case ".$withval" in
+(.\$\(*\)*|.\'*\'*)
+ ;;
+(..|./*|.\\*)
+ ;;
+(.[a-zA-Z]:[\\/]*) # OS/2 EMX
+ ;;
+(.\$\{*prefix\}*|.\$\{*dir\}*)
+ eval withval="$withval"
+ case ".$withval" in
+ (.NONE/*)
+ withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%`
+ ;;
+ esac
+ ;;
+(.no|.NONE/*)
+ withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%`
+ ;;
+(*)
+ { { echo "$as_me:1341: error: expected a pathname, not \"$withval\"" >&5
+echo "$as_me: error: expected a pathname, not \"$withval\"" >&2;}
+ { (exit 1); exit 1; }; }
+ ;;
+esac
+
+fi
+eval DESTDIR="$withval"
+
+echo "$as_me:1350: result: $DESTDIR" >&5
+echo "${ECHO_T}$DESTDIR" >&6
+
+case "$host_os" in
+(openedition)
+ : ${CFLAGS="-D_ALL_SOURCE -Wl,EDIT=NO"}
+ : ${CC=c89}
+ ;;
+esac
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS "conftest.$ac_ext" >&5'
+ac_link='$CC -o "conftest$ac_exeext" $CFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ac_main_return="return"
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+echo "$as_me:1369: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_CC="${ac_tool_prefix}gcc"
+echo "$as_me:1384: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:1392: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:1395: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo "$as_me:1404: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_ac_ct_CC="gcc"
+echo "$as_me:1419: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ echo "$as_me:1427: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+ echo "$as_me:1430: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ CC=$ac_ct_CC
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+echo "$as_me:1443: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_CC="${ac_tool_prefix}cc"
+echo "$as_me:1458: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:1466: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:1469: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:1478: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_ac_ct_CC="cc"
+echo "$as_me:1493: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ echo "$as_me:1501: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+ echo "$as_me:1504: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ CC=$ac_ct_CC
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+fi
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:1517: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ ac_prog_rejected=no
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ $as_executable_p "$ac_dir/$ac_word" || continue
+if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+fi
+ac_cv_prog_CC="cc"
+echo "$as_me:1537: found $ac_dir/$ac_word" >&5
+break
+done
+
+if test "$ac_prog_rejected" = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# != 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ set dummy "$ac_dir/$ac_word" ${1+"$@"}
+ shift
+ ac_cv_prog_CC="$@"
+ fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:1559: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:1562: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in cl
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:1573: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+echo "$as_me:1588: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:1596: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:1599: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$CC" && break
+ done
+fi
+if test -z "$CC"; then
+ ac_ct_CC=$CC
+ for ac_prog in cl
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:1612: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_ac_ct_CC="$ac_prog"
+echo "$as_me:1627: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ echo "$as_me:1635: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+ echo "$as_me:1638: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$ac_ct_CC" && break
+done
+
+ CC=$ac_ct_CC
+fi
+
+fi
+
+test -z "$CC" && { { echo "$as_me:1650: error: no acceptable cc found in \$PATH" >&5
+echo "$as_me: error: no acceptable cc found in \$PATH" >&2;}
+ { (exit 1); exit 1; }; }
+
+# Provide some information about the compiler.
+echo "$as_me:1655:" \
+ "checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo "$2"`
+{ (eval echo "$as_me:1658: \"$ac_compiler --version </dev/null >&5\"") >&5
+ (eval $ac_compiler --version </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:1661: \$? = $ac_status" >&5
+ (exit "$ac_status"); }
+{ (eval echo "$as_me:1663: \"$ac_compiler -v </dev/null >&5\"") >&5
+ (eval $ac_compiler -v </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:1666: \$? = $ac_status" >&5
+ (exit "$ac_status"); }
+{ (eval echo "$as_me:1668: \"$ac_compiler -V </dev/null >&5\"") >&5
+ (eval $ac_compiler -V </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:1671: \$? = $ac_status" >&5
+ (exit "$ac_status"); }
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 1675 "configure"
+#include "confdefs.h"
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.exe"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+echo "$as_me:1691: checking for C compiler default output" >&5
+echo $ECHO_N "checking for C compiler default output... $ECHO_C" >&6
+ac_link_default=`echo "$ac_link" | sed 's/ -o *"conftest[^"]*"//'`
+if { (eval echo "$as_me:1694: \"$ac_link_default\"") >&5
+ (eval $ac_link_default) 2>&5
+ ac_status=$?
+ echo "$as_me:1697: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; then
+ # Find the output, starting from the most likely. This scheme is
+# not robust to junk in `.', hence go to wildcards (a.*) only as a last
+# resort.
+for ac_file in `ls a.exe conftest.exe 2>/dev/null;
+ ls a.out conftest 2>/dev/null;
+ ls a.* conftest.* 2>/dev/null`; do
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.dbg | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;;
+ a.out ) # We found the default executable, but exeext='' is most
+ # certainly right.
+ break;;
+ *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ # FIXME: I believe we export ac_cv_exeext for Libtool --akim.
+ export ac_cv_exeext
+ break;;
+ * ) break;;
+ esac
+done
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+{ { echo "$as_me:1720: error: C compiler cannot create executables" >&5
+echo "$as_me: error: C compiler cannot create executables" >&2;}
+ { (exit 77); exit 77; }; }
+fi
+
+ac_exeext=$ac_cv_exeext
+echo "$as_me:1726: result: $ac_file" >&5
+echo "${ECHO_T}$ac_file" >&6
+
+# Check the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:1731: checking whether the C compiler works" >&5
+echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6
+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+# If not cross compiling, check that we can run a simple program.
+if test "$cross_compiling" != yes; then
+ if { ac_try='./$ac_file'
+ { (eval echo "$as_me:1737: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:1740: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cross_compiling=no
+ else
+ if test "$cross_compiling" = maybe; then
+ cross_compiling=yes
+ else
+ { { echo "$as_me:1747: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'." >&5
+echo "$as_me: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'." >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+ fi
+fi
+echo "$as_me:1755: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+
+rm -f a.out a.exe "conftest$ac_cv_exeext"
+ac_clean_files=$ac_clean_files_save
+# Check the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:1762: checking whether we are cross compiling" >&5
+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6
+echo "$as_me:1764: result: $cross_compiling" >&5
+echo "${ECHO_T}$cross_compiling" >&6
+
+echo "$as_me:1767: checking for executable suffix" >&5
+echo $ECHO_N "checking for executable suffix... $ECHO_C" >&6
+if { (eval echo "$as_me:1769: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:1772: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; then
+ # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in `(ls conftest.exe; ls conftest; ls conftest.*) 2>/dev/null`; do
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.dbg | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;;
+ *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ export ac_cv_exeext
+ break;;
+ * ) break;;
+ esac
+done
+else
+ { { echo "$as_me:1788: error: cannot compute EXEEXT: cannot compile and link" >&5
+echo "$as_me: error: cannot compute EXEEXT: cannot compile and link" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+rm -f "conftest$ac_cv_exeext"
+echo "$as_me:1794: result: $ac_cv_exeext" >&5
+echo "${ECHO_T}$ac_cv_exeext" >&6
+
+rm -f "conftest.$ac_ext"
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+echo "$as_me:1800: checking for object suffix" >&5
+echo $ECHO_N "checking for object suffix... $ECHO_C" >&6
+if test "${ac_cv_objext+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 1806 "configure"
+#include "confdefs.h"
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { (eval echo "$as_me:1818: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:1821: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; then
+ for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.dbg | *.pdb | *.xSYM | *.map | *.inf ) ;;
+ *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+ break;;
+ esac
+done
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+{ { echo "$as_me:1833: error: cannot compute OBJEXT: cannot compile" >&5
+echo "$as_me: error: cannot compute OBJEXT: cannot compile" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+rm -f "conftest.$ac_cv_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:1840: result: $ac_cv_objext" >&5
+echo "${ECHO_T}$ac_cv_objext" >&6
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+echo "$as_me:1844: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 1850 "configure"
+#include "confdefs.h"
+
+int
+main (void)
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:1865: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:1868: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:1871: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:1874: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_compiler_gnu=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_compiler_gnu=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:1886: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6
+GCC=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+CFLAGS="-g"
+echo "$as_me:1892: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_g+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 1898 "configure"
+#include "confdefs.h"
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:1910: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:1913: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:1916: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:1919: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_prog_cc_g=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_prog_cc_g=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:1929: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6
+if test "$ac_test_CFLAGS" = set; then
+ CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+ if test "$GCC" = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-g"
+ fi
+else
+ if test "$GCC" = yes; then
+ CFLAGS="-O2"
+ else
+ CFLAGS=
+ fi
+fi
+# Some people use a C++ compiler to compile C. Since we use `exit',
+# in C++ we need to declare it. In case someone uses the same compiler
+# for both compiling C and C++ we need to have the C++ compiler decide
+# the declaration of exit, since it's the most demanding environment.
+cat >"conftest.$ac_ext" <<_ACEOF
+#ifndef __cplusplus
+ choke me
+#endif
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:1956: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:1959: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:1962: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:1965: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ for ac_declaration in \
+ ''\
+ '#include <stdlib.h>' \
+ 'extern "C" void std::exit (int) throw (); using std::exit;' \
+ 'extern "C" void std::exit (int); using std::exit;' \
+ 'extern "C" void exit (int) throw ();' \
+ 'extern "C" void exit (int);' \
+ 'void exit (int);'
+do
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 1977 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+$ac_declaration
+int
+main (void)
+{
+exit (42);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:1990: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:1993: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:1996: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:1999: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+continue
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 2009 "configure"
+#include "confdefs.h"
+$ac_declaration
+int
+main (void)
+{
+exit (42);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:2021: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:2024: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:2027: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:2030: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+done
+rm -rf conftest*
+if test -n "$ac_declaration"; then
+ echo '#ifdef __cplusplus' >>confdefs.h
+ echo "$ac_declaration" >>confdefs.h
+ echo '#endif' >>confdefs.h
+fi
+
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS "conftest.$ac_ext" >&5'
+ac_link='$CC -o "conftest$ac_exeext" $CFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ac_main_return="return"
+
+GCC_VERSION=none
+if test "$GCC" = yes ; then
+ echo "$as_me:2060: checking version of $CC" >&5
+echo $ECHO_N "checking version of $CC... $ECHO_C" >&6
+ GCC_VERSION="`${CC} --version 2>/dev/null | sed -e '2,$d' -e 's/^.*(GCC[^)]*) //' -e 's/^.*(Debian[^)]*) //' -e 's/^[^0-9.]*//' -e 's/[^0-9.].*//'`"
+ test -z "$GCC_VERSION" && GCC_VERSION=unknown
+ echo "$as_me:2064: result: $GCC_VERSION" >&5
+echo "${ECHO_T}$GCC_VERSION" >&6
+fi
+
+INTEL_COMPILER=no
+
+if test "$GCC" = yes ; then
+ case "$host_os" in
+ (linux*|gnu*)
+ echo "$as_me:2073: checking if this is really Intel C compiler" >&5
+echo $ECHO_N "checking if this is really Intel C compiler... $ECHO_C" >&6
+ cf_save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -no-gcc"
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 2078 "configure"
+#include "confdefs.h"
+
+int
+main (void)
+{
+
+#ifdef __INTEL_COMPILER
+#else
+make an error
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:2095: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:2098: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:2101: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:2104: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ INTEL_COMPILER=yes
+cf_save_CFLAGS="$cf_save_CFLAGS -we147"
+
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ CFLAGS="$cf_save_CFLAGS"
+ echo "$as_me:2115: result: $INTEL_COMPILER" >&5
+echo "${ECHO_T}$INTEL_COMPILER" >&6
+ ;;
+ esac
+fi
+
+CLANG_COMPILER=no
+
+if test "$GCC" = yes ; then
+ echo "$as_me:2124: checking if this is really Clang C compiler" >&5
+echo $ECHO_N "checking if this is really Clang C compiler... $ECHO_C" >&6
+ cf_save_CFLAGS="$CFLAGS"
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 2128 "configure"
+#include "confdefs.h"
+
+int
+main (void)
+{
+
+#ifdef __clang__
+#else
+make an error
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:2145: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:2148: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:2151: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:2154: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ CLANG_COMPILER=yes
+
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ CFLAGS="$cf_save_CFLAGS"
+ echo "$as_me:2164: result: $CLANG_COMPILER" >&5
+echo "${ECHO_T}$CLANG_COMPILER" >&6
+fi
+
+CLANG_VERSION=none
+
+if test "x$CLANG_COMPILER" = "xyes" ; then
+ case "$CC" in
+ (c[1-9][0-9]|*/c[1-9][0-9])
+ { echo "$as_me:2173: WARNING: replacing broken compiler alias $CC" >&5
+echo "$as_me: WARNING: replacing broken compiler alias $CC" >&2;}
+ CFLAGS="$CFLAGS -std=`echo "$CC" | sed -e 's%.*/%%'`"
+ CC=clang
+ ;;
+ esac
+
+ echo "$as_me:2180: checking version of $CC" >&5
+echo $ECHO_N "checking version of $CC... $ECHO_C" >&6
+ CLANG_VERSION="`$CC --version 2>/dev/null | sed -e '2,$d' -e 's/^.*(CLANG[^)]*) //' -e 's/^.*(Debian[^)]*) //' -e 's/^[^0-9.]*//' -e 's/[^0-9.].*//'`"
+ test -z "$CLANG_VERSION" && CLANG_VERSION=unknown
+ echo "$as_me:2184: result: $CLANG_VERSION" >&5
+echo "${ECHO_T}$CLANG_VERSION" >&6
+
+ for cf_clang_opt in \
+ -Qunused-arguments \
+ -Wno-error=implicit-function-declaration
+ do
+ echo "$as_me:2191: checking if option $cf_clang_opt works" >&5
+echo $ECHO_N "checking if option $cf_clang_opt works... $ECHO_C" >&6
+ cf_save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS $cf_clang_opt"
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 2196 "configure"
+#include "confdefs.h"
+
+ #include <stdio.h>
+int
+main (void)
+{
+
+ printf("hello!\\n");
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:2210: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:2213: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:2216: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:2219: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ cf_clang_optok=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+ cf_clang_optok=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+ echo "$as_me:2230: result: $cf_clang_optok" >&5
+echo "${ECHO_T}$cf_clang_optok" >&6
+ CFLAGS="$cf_save_CFLAGS"
+ if test "$cf_clang_optok" = yes; then
+ test -n "$verbose" && echo " adding option $cf_clang_opt" 1>&6
+
+echo "${as_me:-configure}:2236: testing adding option $cf_clang_opt ..." 1>&5
+
+ test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+ CFLAGS="${CFLAGS}$cf_clang_opt"
+
+ fi
+ done
+fi
+
+echo "$as_me:2245: checking for $CC option to accept ANSI C" >&5
+echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_stdc+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_prog_cc_stdc=no
+ac_save_CC=$CC
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 2253 "configure"
+#include "confdefs.h"
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+ char **p;
+ int i;
+{
+ return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+ char *s;
+ va_list v;
+ va_start (v,p);
+ s = g (p, va_arg (v,int));
+ va_end (v);
+ return s;
+}
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main (void)
+{
+return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
+ ;
+ return 0;
+}
+_ACEOF
+# Don't try gcc -ansi; that turns off useful extensions and
+# breaks some systems' header files.
+# AIX -qlanglvl=ansi
+# Ultrix and OSF/1 -std1
+# HP-UX 10.20 and later -Ae
+# HP-UX older versions -Aa -D_HPUX_SOURCE
+# SVR4 -Xc -D__EXTENSIONS__
+for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+ CC="$ac_save_CC $ac_arg"
+ rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:2302: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:2305: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:2308: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:2311: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_prog_cc_stdc=$ac_arg
+break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext"
+done
+rm -f "conftest.$ac_ext" "conftest.$ac_objext"
+CC=$ac_save_CC
+
+fi
+
+case "x$ac_cv_prog_cc_stdc" in
+ x|xno)
+ echo "$as_me:2328: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6 ;;
+ *)
+ echo "$as_me:2331: result: $ac_cv_prog_cc_stdc" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6
+ CC="$CC $ac_cv_prog_cc_stdc" ;;
+esac
+
+# This should have been defined by AC_PROG_CC
+: "${CC:=cc}"
+
+echo "$as_me:2339: checking \$CFLAGS variable" >&5
+echo $ECHO_N "checking \$CFLAGS variable... $ECHO_C" >&6
+case "x$CFLAGS" in
+(*-[IUD]*)
+ echo "$as_me:2343: result: broken" >&5
+echo "${ECHO_T}broken" >&6
+ { echo "$as_me:2345: WARNING: your environment uses the CFLAGS variable to hold CPPFLAGS options" >&5
+echo "$as_me: WARNING: your environment uses the CFLAGS variable to hold CPPFLAGS options" >&2;}
+ cf_flags="$CFLAGS"
+ CFLAGS=
+ for cf_arg in $cf_flags
+ do
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_arg
+do
+case "$cf_fix_cppflags" in
+(no)
+ case "$cf_add_cflags" in
+ (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=yes
+
+ if test "$cf_fix_cppflags" = yes ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ elif test "${cf_tst_cflags}" = "\"'" ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ fi
+ ;;
+ esac
+ case "$CPPFLAGS" in
+ (*$cf_add_cflags)
+ ;;
+ (*)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+ sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \
+ -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'`
+
+ ;;
+ esac
+
+ test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+ cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+ (*)
+
+ test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+ cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+(yes)
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=no
+ ;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+ test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+ CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+ test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+ EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+ done
+ ;;
+(*)
+ echo "$as_me:2453: result: ok" >&5
+echo "${ECHO_T}ok" >&6
+ ;;
+esac
+
+echo "$as_me:2458: checking \$CC variable" >&5
+echo $ECHO_N "checking \$CC variable... $ECHO_C" >&6
+case "$CC" in
+(*[\ \ ]-*)
+ echo "$as_me:2462: result: broken" >&5
+echo "${ECHO_T}broken" >&6
+ { echo "$as_me:2464: WARNING: your environment uses the CC variable to hold CFLAGS/CPPFLAGS options" >&5
+echo "$as_me: WARNING: your environment uses the CC variable to hold CFLAGS/CPPFLAGS options" >&2;}
+ # humor him...
+ cf_prog=`echo "$CC" | sed -e 's/ / /g' -e 's/[ ]* / /g' -e 's/[ ]*[ ]-[^ ].*//'`
+ cf_flags=`echo "$CC" | ${AWK:-awk} -v prog="$cf_prog" '{ printf("%s", substr($0,1+length(prog))); }'`
+ CC="$cf_prog"
+ for cf_arg in $cf_flags
+ do
+ case "x$cf_arg" in
+ (x-[IUDfgOW]*)
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_arg
+do
+case "$cf_fix_cppflags" in
+(no)
+ case "$cf_add_cflags" in
+ (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=yes
+
+ if test "$cf_fix_cppflags" = yes ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ elif test "${cf_tst_cflags}" = "\"'" ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ fi
+ ;;
+ esac
+ case "$CPPFLAGS" in
+ (*$cf_add_cflags)
+ ;;
+ (*)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+ sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \
+ -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'`
+
+ ;;
+ esac
+
+ test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+ cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+ (*)
+
+ test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+ cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+(yes)
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=no
+ ;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+ test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+ CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+ test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+ EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+ ;;
+ (*)
+ CC="$CC $cf_arg"
+ ;;
+ esac
+ done
+ test -n "$verbose" && echo " resulting CC: '$CC'" 1>&6
+
+echo "${as_me:-configure}:2581: testing resulting CC: '$CC' ..." 1>&5
+
+ test -n "$verbose" && echo " resulting CFLAGS: '$CFLAGS'" 1>&6
+
+echo "${as_me:-configure}:2585: testing resulting CFLAGS: '$CFLAGS' ..." 1>&5
+
+ test -n "$verbose" && echo " resulting CPPFLAGS: '$CPPFLAGS'" 1>&6
+
+echo "${as_me:-configure}:2589: testing resulting CPPFLAGS: '$CPPFLAGS' ..." 1>&5
+
+ ;;
+(*)
+ echo "$as_me:2593: result: ok" >&5
+echo "${ECHO_T}ok" >&6
+ ;;
+esac
+
+for ac_prog in ggrep grep
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:2602: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_GREP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$GREP"; then
+ ac_cv_prog_GREP="$GREP" # Let the user override the test.
+else
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_GREP="$ac_prog"
+echo "$as_me:2617: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+GREP=$ac_cv_prog_GREP
+if test -n "$GREP"; then
+ echo "$as_me:2625: result: $GREP" >&5
+echo "${ECHO_T}$GREP" >&6
+else
+ echo "$as_me:2628: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$GREP" && break
+done
+test -n "$GREP" || GREP=": "
+
+echo "$as_me:2636: checking for egrep" >&5
+echo $ECHO_N "checking for egrep... $ECHO_C" >&6
+if test "${ac_cv_path_EGREP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+ then ac_cv_path_EGREP="$GREP -E"
+ else
+ for ac_prog in gegrep egrep
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:2648: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_EGREP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $EGREP in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_EGREP="$EGREP" # Let the user override the test with a path.
+ ;;
+ *)
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ if $as_executable_p "$ac_dir/$ac_word"; then
+ ac_cv_path_EGREP="$ac_dir/$ac_word"
+ echo "$as_me:2665: found $ac_dir/$ac_word" >&5
+ break
+fi
+done
+
+ ;;
+esac
+fi
+EGREP=$ac_cv_path_EGREP
+
+if test -n "$EGREP"; then
+ echo "$as_me:2676: result: $EGREP" >&5
+echo "${ECHO_T}$EGREP" >&6
+else
+ echo "$as_me:2679: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$EGREP" && break
+done
+test -n "$EGREP" || EGREP=": "
+
+ test "x$ac_cv_path_EGREP" = "x:" && { { echo "$as_me:2687: error: cannot find workable egrep" >&5
+echo "$as_me: error: cannot find workable egrep" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+fi
+echo "$as_me:2692: result: $ac_cv_path_EGREP" >&5
+echo "${ECHO_T}$ac_cv_path_EGREP" >&6
+ EGREP="$ac_cv_path_EGREP"
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS "conftest.$ac_ext" >&5'
+ac_link='$CC -o "conftest$ac_exeext" $CFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ac_main_return="return"
+echo "$as_me:2702: checking how to run the C preprocessor" >&5
+echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+fi
+if test -z "$CPP"; then
+ if test "${ac_cv_prog_CPP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ # Double quotes because CPP needs to be expanded
+ for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+ do
+ ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 2723 "configure"
+#include "confdefs.h"
+#include <assert.h>
+ Syntax error
+_ACEOF
+if { (eval echo "$as_me:2728: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+ (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ $EGREP -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:2734: \$? = $ac_status" >&5
+ (exit "$ac_status"); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+ cat "conftest.$ac_ext" >&5
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err "conftest.$ac_ext"
+
+ # OK, works on sane cases. Now check whether non-existent headers
+ # can be detected and how.
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 2757 "configure"
+#include "confdefs.h"
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:2761: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+ (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ $EGREP -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:2767: \$? = $ac_status" >&5
+ (exit "$ac_status"); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ # Broken: success on invalid input.
+continue
+else
+ echo "$as_me: failed program was:" >&5
+ cat "conftest.$ac_ext" >&5
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err "conftest.$ac_ext"
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err "conftest.$ac_ext"
+if $ac_preproc_ok; then
+ break
+fi
+
+ done
+ ac_cv_prog_CPP=$CPP
+
+fi
+ CPP=$ac_cv_prog_CPP
+else
+ ac_cv_prog_CPP=$CPP
+fi
+echo "$as_me:2804: result: $CPP" >&5
+echo "${ECHO_T}$CPP" >&6
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 2814 "configure"
+#include "confdefs.h"
+#include <assert.h>
+ Syntax error
+_ACEOF
+if { (eval echo "$as_me:2819: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+ (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ $EGREP -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:2825: \$? = $ac_status" >&5
+ (exit "$ac_status"); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+ cat "conftest.$ac_ext" >&5
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err "conftest.$ac_ext"
+
+ # OK, works on sane cases. Now check whether non-existent headers
+ # can be detected and how.
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 2848 "configure"
+#include "confdefs.h"
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:2852: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+ (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ $EGREP -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:2858: \$? = $ac_status" >&5
+ (exit "$ac_status"); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ # Broken: success on invalid input.
+continue
+else
+ echo "$as_me: failed program was:" >&5
+ cat "conftest.$ac_ext" >&5
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err "conftest.$ac_ext"
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err "conftest.$ac_ext"
+if $ac_preproc_ok; then
+ :
+else
+ { { echo "$as_me:2886: error: C preprocessor \"$CPP\" fails sanity check" >&5
+echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS "conftest.$ac_ext" >&5'
+ac_link='$CC -o "conftest$ac_exeext" $CFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ac_main_return="return"
+
+echo "$as_me:2898: checking if preprocessor -C option works" >&5
+echo $ECHO_N "checking if preprocessor -C option works... $ECHO_C" >&6
+if test "${cf_cv_prog_cpp_comments+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cf_cv_prog_cpp_comments=no
+cat >conftest.c <<CF_EOF
+int main(void)
+{
+ /* COMMENT */
+ return 0;
+}
+CF_EOF
+if ( $CPP -C conftest.c >conftest.i 2>/dev/null )
+then
+ if ( grep COMMENT conftest.i >/dev/null 2>/dev/null )
+ then
+ cf_cv_prog_cpp_comments=yes
+ fi
+fi
+rm -f conftest.[ci]
+
+fi
+
+echo "$as_me:2923: result: $cf_cv_prog_cpp_comments" >&5
+echo "${ECHO_T}$cf_cv_prog_cpp_comments" >&6
+if test x$cf_cv_prog_cpp_comments = xyes
+then
+ CPP="$CPP -C"
+fi
+
+echo "$as_me:2930: checking whether ln -s works" >&5
+echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6
+LN_S=$as_ln_s
+if test "$LN_S" = "ln -s"; then
+ echo "$as_me:2934: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else
+ echo "$as_me:2937: result: no, using $LN_S" >&5
+echo "${ECHO_T}no, using $LN_S" >&6
+fi
+
+case "$host_os" in
+(mingw*)
+LN_S="cp -p"
+echo "$as_me:2944: result: Override: No symbolic links in mingw." >&5
+echo "${ECHO_T}Override: No symbolic links in mingw." >&6
+ ;;
+(*)
+ ;;
+esac
+echo "$as_me:2950: checking whether ${MAKE-make} sets \${MAKE}" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \${MAKE}... $ECHO_C" >&6
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,./+-,__p_,'`
+if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.make <<\EOF
+all:
+ @echo 'ac_maketemp="${MAKE}"'
+EOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+ eval ac_cv_prog_make_${ac_make}_set=yes
+else
+ eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftest.make
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+ echo "$as_me:2970: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ SET_MAKE=
+else
+ echo "$as_me:2974: result: no" >&5
+echo "${ECHO_T}no" >&6
+ SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+# Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# ./install, which can be erroneously created by make from ./install.sh.
+echo "$as_me:2991: checking for a BSD compatible install" >&5
+echo $ECHO_N "checking for a BSD compatible install... $ECHO_C" >&6
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ for ac_dir in $PATH; do
+ IFS=$ac_save_IFS
+ # Account for people who put trailing slashes in PATH elements.
+ case $ac_dir/ in
+ / | ./ | .// | /cC/* \
+ | /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* \
+ | /usr/ucb/* ) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ if $as_executable_p "$ac_dir/$ac_prog"; then
+ if test $ac_prog = install &&
+ grep dspmsg "$ac_dir/$ac_prog" >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ elif test $ac_prog = install &&
+ grep pwplus "$ac_dir/$ac_prog" >/dev/null 2>&1; then
+ # program-specific install script used by HP pwplus--don't use.
+ :
+ else
+ ac_cv_path_install="$ac_dir/$ac_prog -c"
+ break 2
+ fi
+ fi
+ done
+ ;;
+ esac
+ done
+
+fi
+ if test "${ac_cv_path_install+set}" = set; then
+ INSTALL=$ac_cv_path_install
+ else
+ # As a last resort, use the slow shell script. We don't cache a
+ # path for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the path is relative.
+ INSTALL=$ac_install_sh
+ fi
+fi
+echo "$as_me:3040: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+for ac_prog in byacc 'bison -y'
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:3055: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_YACC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$YACC"; then
+ ac_cv_prog_YACC="$YACC" # Let the user override the test.
+else
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_YACC="$ac_prog"
+echo "$as_me:3070: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+YACC=$ac_cv_prog_YACC
+if test -n "$YACC"; then
+ echo "$as_me:3078: result: $YACC" >&5
+echo "${ECHO_T}$YACC" >&6
+else
+ echo "$as_me:3081: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$YACC" && break
+done
+test -n "$YACC" || YACC="yacc"
+
+echo "$as_me:3089: checking for egrep" >&5
+echo $ECHO_N "checking for egrep... $ECHO_C" >&6
+if test "${ac_cv_path_EGREP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+ then ac_cv_path_EGREP="$GREP -E"
+ else
+ for ac_prog in gegrep egrep
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:3101: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_EGREP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $EGREP in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_EGREP="$EGREP" # Let the user override the test with a path.
+ ;;
+ *)
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ if $as_executable_p "$ac_dir/$ac_word"; then
+ ac_cv_path_EGREP="$ac_dir/$ac_word"
+ echo "$as_me:3118: found $ac_dir/$ac_word" >&5
+ break
+fi
+done
+
+ ;;
+esac
+fi
+EGREP=$ac_cv_path_EGREP
+
+if test -n "$EGREP"; then
+ echo "$as_me:3129: result: $EGREP" >&5
+echo "${ECHO_T}$EGREP" >&6
+else
+ echo "$as_me:3132: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$EGREP" && break
+done
+test -n "$EGREP" || EGREP=": "
+
+ test "x$ac_cv_path_EGREP" = "x:" && { { echo "$as_me:3140: error: cannot find workable egrep" >&5
+echo "$as_me: error: cannot find workable egrep" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+fi
+echo "$as_me:3145: result: $ac_cv_path_EGREP" >&5
+echo "${ECHO_T}$ac_cv_path_EGREP" >&6
+ EGREP="$ac_cv_path_EGREP"
+
+for ac_prog in lint cppcheck splint
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:3153: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_LINT+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$LINT"; then
+ ac_cv_prog_LINT="$LINT" # Let the user override the test.
+else
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_LINT="$ac_prog"
+echo "$as_me:3168: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+LINT=$ac_cv_prog_LINT
+if test -n "$LINT"; then
+ echo "$as_me:3176: result: $LINT" >&5
+echo "${ECHO_T}$LINT" >&6
+else
+ echo "$as_me:3179: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$LINT" && break
+done
+
+case "x$LINT" in
+(xcppcheck|x*/cppcheck)
+ test -z "$LINT_OPTS" && LINT_OPTS="--enable=all"
+ ;;
+esac
+
+echo "$as_me:3192: checking for fgrep" >&5
+echo $ECHO_N "checking for fgrep... $ECHO_C" >&6
+if test "${ac_cv_path_FGREP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
+ then ac_cv_path_FGREP="$GREP -F"
+ else
+ for ac_prog in gfgrep fgrep
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:3204: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_FGREP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $FGREP in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_FGREP="$FGREP" # Let the user override the test with a path.
+ ;;
+ *)
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ if $as_executable_p "$ac_dir/$ac_word"; then
+ ac_cv_path_FGREP="$ac_dir/$ac_word"
+ echo "$as_me:3221: found $ac_dir/$ac_word" >&5
+ break
+fi
+done
+
+ ;;
+esac
+fi
+FGREP=$ac_cv_path_FGREP
+
+if test -n "$FGREP"; then
+ echo "$as_me:3232: result: $FGREP" >&5
+echo "${ECHO_T}$FGREP" >&6
+else
+ echo "$as_me:3235: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$FGREP" && break
+done
+test -n "$FGREP" || FGREP=": "
+
+ test "x$ac_cv_path_FGREP" = "x:" && { { echo "$as_me:3243: error: cannot find workable fgrep" >&5
+echo "$as_me: error: cannot find workable fgrep" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+fi
+echo "$as_me:3248: result: $ac_cv_path_FGREP" >&5
+echo "${ECHO_T}$ac_cv_path_FGREP" >&6
+ FGREP="$ac_cv_path_FGREP"
+
+echo "$as_me:3252: checking for makeflags variable" >&5
+echo $ECHO_N "checking for makeflags variable... $ECHO_C" >&6
+if test "${cf_cv_makeflags+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cf_cv_makeflags=''
+ for cf_option in '-${MAKEFLAGS}' '${MFLAGS}'
+ do
+ cat >cf_makeflags.tmp <<CF_EOF
+SHELL = $SHELL
+all :
+ @ echo '.$cf_option'
+CF_EOF
+ cf_result=`${MAKE:-make} -k -f cf_makeflags.tmp 2>/dev/null | ${FGREP-fgrep} -v "ing directory" | sed -e 's,[ ]*$,,'`
+ case "$cf_result" in
+ (.*k|.*kw)
+ cf_result="`${MAKE:-make} -k -f cf_makeflags.tmp CC=cc 2>/dev/null`"
+ case "$cf_result" in
+ (.*CC=*) cf_cv_makeflags=
+ ;;
+ (*) cf_cv_makeflags=$cf_option
+ ;;
+ esac
+ break
+ ;;
+ (.-)
+ ;;
+ (*)
+
+echo "${as_me:-configure}:3282: testing given option \"$cf_option\",no match \"$cf_result\" ..." 1>&5
+
+ ;;
+ esac
+ done
+ rm -f cf_makeflags.tmp
+
+fi
+echo "$as_me:3290: result: $cf_cv_makeflags" >&5
+echo "${ECHO_T}$cf_cv_makeflags" >&6
+
+echo "$as_me:3293: checking for \".PHONY\" make-support" >&5
+echo $ECHO_N "checking for \".PHONY\" make-support... $ECHO_C" >&6
+if test "${cf_cv_make_PHONY+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ rm -rf conftest*
+ (
+ mkdir conftest || exit 1
+ cd conftest
+ cat >makefile <<'CF_EOF'
+.PHONY: always
+DATA=0
+always: always.out
+ @echo "** making $@ $(DATA)"
+once: once.out
+ @echo "** making $@ $(DATA)"
+always.out:
+ @echo "** making $@ $(DATA)"
+ echo $(DATA) > $@
+once.out:
+ @echo "** making $@ $(DATA)"
+ echo $(DATA) > $@
+CF_EOF
+ for cf_data in 1 2 3
+ do
+ ${MAKE:-make} always DATA=$cf_data
+ ${MAKE:-make} once DATA=$cf_data
+ ${MAKE:-make} -t always once
+ if test -f always ; then
+ echo "no (case 1)" > ../conftest.tmp
+ elif test ! -f always.out ; then
+ echo "no (case 2)" > ../conftest.tmp
+ elif test ! -f once.out ; then
+ echo "no (case 3)" > ../conftest.tmp
+ elif ! cmp -s always.out once.out ; then
+ echo "no (case 4)" > ../conftest.tmp
+ diff always.out once.out
+ else
+ cf_check="`cat always.out`"
+ if test "x$cf_check" != "x$cf_data" ; then
+ echo "no (case 5)" > ../conftest.tmp
+ else
+ echo yes > ../conftest.tmp
+ rm -f ./*.out
+ continue
+ fi
+ fi
+ break
+ done
+ ) >&5 2>&1
+ cf_cv_make_PHONY="`cat conftest.tmp`"
+ rm -rf conftest*
+
+fi
+echo "$as_me:3348: result: $cf_cv_make_PHONY" >&5
+echo "${ECHO_T}$cf_cv_make_PHONY" >&6
+MAKE_NO_PHONY="#"
+MAKE_PHONY="#"
+test "x$cf_cv_make_PHONY" = xyes && MAKE_PHONY=
+test "x$cf_cv_make_PHONY" != xyes && MAKE_NO_PHONY=
+
+echo "$as_me:3355: checking if filesystem supports mixed-case filenames" >&5
+echo $ECHO_N "checking if filesystem supports mixed-case filenames... $ECHO_C" >&6
+if test "${cf_cv_mixedcase+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+if test "$cross_compiling" = yes ; then
+ case "$target_alias" in
+ (*-os2-emx*|*-msdosdjgpp*|*-cygwin*|*-msys*|*-mingw*|*-uwin*|darwin*)
+ cf_cv_mixedcase=no
+ ;;
+ (*)
+ cf_cv_mixedcase=yes
+ ;;
+ esac
+else
+ rm -f conftest CONFTEST
+ echo test >conftest
+ if test -f CONFTEST ; then
+ cf_cv_mixedcase=no
+ else
+ cf_cv_mixedcase=yes
+ fi
+ rm -f conftest CONFTEST
+fi
+
+fi
+echo "$as_me:3382: result: $cf_cv_mixedcase" >&5
+echo "${ECHO_T}$cf_cv_mixedcase" >&6
+test "$cf_cv_mixedcase" = yes &&
+cat >>confdefs.h <<\EOF
+#define MIXEDCASE_FILENAMES 1
+EOF
+
+for ac_prog in exctags ctags
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:3393: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CTAGS+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CTAGS"; then
+ ac_cv_prog_CTAGS="$CTAGS" # Let the user override the test.
+else
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_CTAGS="$ac_prog"
+echo "$as_me:3408: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+CTAGS=$ac_cv_prog_CTAGS
+if test -n "$CTAGS"; then
+ echo "$as_me:3416: result: $CTAGS" >&5
+echo "${ECHO_T}$CTAGS" >&6
+else
+ echo "$as_me:3419: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$CTAGS" && break
+done
+
+for ac_prog in exetags etags
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:3430: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ETAGS+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ETAGS"; then
+ ac_cv_prog_ETAGS="$ETAGS" # Let the user override the test.
+else
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_ETAGS="$ac_prog"
+echo "$as_me:3445: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+ETAGS=$ac_cv_prog_ETAGS
+if test -n "$ETAGS"; then
+ echo "$as_me:3453: result: $ETAGS" >&5
+echo "${ECHO_T}$ETAGS" >&6
+else
+ echo "$as_me:3456: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$ETAGS" && break
+done
+
+# Extract the first word of "${CTAGS:-ctags}", so it can be a program name with args.
+set dummy ${CTAGS:-ctags}; ac_word=$2
+echo "$as_me:3465: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_MAKE_LOWER_TAGS+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$MAKE_LOWER_TAGS"; then
+ ac_cv_prog_MAKE_LOWER_TAGS="$MAKE_LOWER_TAGS" # Let the user override the test.
+else
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_MAKE_LOWER_TAGS="yes"
+echo "$as_me:3480: found $ac_dir/$ac_word" >&5
+break
+done
+
+ test -z "$ac_cv_prog_MAKE_LOWER_TAGS" && ac_cv_prog_MAKE_LOWER_TAGS="no"
+fi
+fi
+MAKE_LOWER_TAGS=$ac_cv_prog_MAKE_LOWER_TAGS
+if test -n "$MAKE_LOWER_TAGS"; then
+ echo "$as_me:3489: result: $MAKE_LOWER_TAGS" >&5
+echo "${ECHO_T}$MAKE_LOWER_TAGS" >&6
+else
+ echo "$as_me:3492: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+if test "$cf_cv_mixedcase" = yes ; then
+ # Extract the first word of "${ETAGS:-etags}", so it can be a program name with args.
+set dummy ${ETAGS:-etags}; ac_word=$2
+echo "$as_me:3499: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_MAKE_UPPER_TAGS+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$MAKE_UPPER_TAGS"; then
+ ac_cv_prog_MAKE_UPPER_TAGS="$MAKE_UPPER_TAGS" # Let the user override the test.
+else
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_MAKE_UPPER_TAGS="yes"
+echo "$as_me:3514: found $ac_dir/$ac_word" >&5
+break
+done
+
+ test -z "$ac_cv_prog_MAKE_UPPER_TAGS" && ac_cv_prog_MAKE_UPPER_TAGS="no"
+fi
+fi
+MAKE_UPPER_TAGS=$ac_cv_prog_MAKE_UPPER_TAGS
+if test -n "$MAKE_UPPER_TAGS"; then
+ echo "$as_me:3523: result: $MAKE_UPPER_TAGS" >&5
+echo "${ECHO_T}$MAKE_UPPER_TAGS" >&6
+else
+ echo "$as_me:3526: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+else
+ MAKE_UPPER_TAGS=no
+fi
+
+if test "$MAKE_UPPER_TAGS" = yes ; then
+ MAKE_UPPER_TAGS=
+else
+ MAKE_UPPER_TAGS="#"
+fi
+
+if test "$MAKE_LOWER_TAGS" = yes ; then
+ MAKE_LOWER_TAGS=
+else
+ MAKE_LOWER_TAGS="#"
+fi
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}windres", so it can be a program name with args.
+set dummy ${ac_tool_prefix}windres; ac_word=$2
+echo "$as_me:3549: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_WINDRES+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $WINDRES in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_WINDRES="$WINDRES" # Let the user override the test with a path.
+ ;;
+ *)
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ if $as_executable_p "$ac_dir/$ac_word"; then
+ ac_cv_path_WINDRES="$ac_dir/$ac_word"
+ echo "$as_me:3566: found $ac_dir/$ac_word" >&5
+ break
+fi
+done
+
+ ;;
+esac
+fi
+WINDRES=$ac_cv_path_WINDRES
+
+if test -n "$WINDRES"; then
+ echo "$as_me:3577: result: $WINDRES" >&5
+echo "${ECHO_T}$WINDRES" >&6
+else
+ echo "$as_me:3580: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_path_WINDRES"; then
+ ac_pt_WINDRES=$WINDRES
+ # Extract the first word of "windres", so it can be a program name with args.
+set dummy windres; ac_word=$2
+echo "$as_me:3589: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_ac_pt_WINDRES+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $ac_pt_WINDRES in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_ac_pt_WINDRES="$ac_pt_WINDRES" # Let the user override the test with a path.
+ ;;
+ *)
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ if $as_executable_p "$ac_dir/$ac_word"; then
+ ac_cv_path_ac_pt_WINDRES="$ac_dir/$ac_word"
+ echo "$as_me:3606: found $ac_dir/$ac_word" >&5
+ break
+fi
+done
+
+ test -z "$ac_cv_path_ac_pt_WINDRES" && ac_cv_path_ac_pt_WINDRES="none"
+ ;;
+esac
+fi
+ac_pt_WINDRES=$ac_cv_path_ac_pt_WINDRES
+
+if test -n "$ac_pt_WINDRES"; then
+ echo "$as_me:3618: result: $ac_pt_WINDRES" >&5
+echo "${ECHO_T}$ac_pt_WINDRES" >&6
+else
+ echo "$as_me:3621: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ WINDRES=$ac_pt_WINDRES
+else
+ WINDRES="$ac_cv_path_WINDRES"
+fi
+
+if test "$cross_compiling" = yes ; then
+
+ # defaults that we might want to override
+ : ${BUILD_CFLAGS:=''}
+ : ${BUILD_CPPFLAGS:='#'}
+ : ${BUILD_LDFLAGS:=''}
+ : ${BUILD_LIBS:=''}
+ : ${BUILD_EXEEXT:='$x'}
+ : ${BUILD_OBJEXT:='o'}
+
+# Check whether --with-build-cc or --without-build-cc was given.
+if test "${with_build_cc+set}" = set; then
+ withval="$with_build_cc"
+ BUILD_CC="$withval"
+else
+ for ac_prog in gcc clang c99 c89 cc cl
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:3649: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_BUILD_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$BUILD_CC"; then
+ ac_cv_prog_BUILD_CC="$BUILD_CC" # Let the user override the test.
+else
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_BUILD_CC="$ac_prog"
+echo "$as_me:3664: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+BUILD_CC=$ac_cv_prog_BUILD_CC
+if test -n "$BUILD_CC"; then
+ echo "$as_me:3672: result: $BUILD_CC" >&5
+echo "${ECHO_T}$BUILD_CC" >&6
+else
+ echo "$as_me:3675: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$BUILD_CC" && break
+done
+test -n "$BUILD_CC" || BUILD_CC="none"
+
+fi;
+ echo "$as_me:3684: checking for native build C compiler" >&5
+echo $ECHO_N "checking for native build C compiler... $ECHO_C" >&6
+ echo "$as_me:3686: result: $BUILD_CC" >&5
+echo "${ECHO_T}$BUILD_CC" >&6
+
+ echo "$as_me:3689: checking for native build C preprocessor" >&5
+echo $ECHO_N "checking for native build C preprocessor... $ECHO_C" >&6
+
+# Check whether --with-build-cpp or --without-build-cpp was given.
+if test "${with_build_cpp+set}" = set; then
+ withval="$with_build_cpp"
+ BUILD_CPP="$withval"
+else
+ BUILD_CPP='${BUILD_CC} -E'
+fi;
+ echo "$as_me:3699: result: $BUILD_CPP" >&5
+echo "${ECHO_T}$BUILD_CPP" >&6
+
+ echo "$as_me:3702: checking for native build C flags" >&5
+echo $ECHO_N "checking for native build C flags... $ECHO_C" >&6
+
+# Check whether --with-build-cflags or --without-build-cflags was given.
+if test "${with_build_cflags+set}" = set; then
+ withval="$with_build_cflags"
+ BUILD_CFLAGS="$withval"
+fi;
+ echo "$as_me:3710: result: $BUILD_CFLAGS" >&5
+echo "${ECHO_T}$BUILD_CFLAGS" >&6
+
+ echo "$as_me:3713: checking for native build C preprocessor-flags" >&5
+echo $ECHO_N "checking for native build C preprocessor-flags... $ECHO_C" >&6
+
+# Check whether --with-build-cppflags or --without-build-cppflags was given.
+if test "${with_build_cppflags+set}" = set; then
+ withval="$with_build_cppflags"
+ BUILD_CPPFLAGS="$withval"
+fi;
+ echo "$as_me:3721: result: $BUILD_CPPFLAGS" >&5
+echo "${ECHO_T}$BUILD_CPPFLAGS" >&6
+
+ echo "$as_me:3724: checking for native build linker-flags" >&5
+echo $ECHO_N "checking for native build linker-flags... $ECHO_C" >&6
+
+# Check whether --with-build-ldflags or --without-build-ldflags was given.
+if test "${with_build_ldflags+set}" = set; then
+ withval="$with_build_ldflags"
+ BUILD_LDFLAGS="$withval"
+fi;
+ echo "$as_me:3732: result: $BUILD_LDFLAGS" >&5
+echo "${ECHO_T}$BUILD_LDFLAGS" >&6
+
+ echo "$as_me:3735: checking for native build linker-libraries" >&5
+echo $ECHO_N "checking for native build linker-libraries... $ECHO_C" >&6
+
+# Check whether --with-build-libs or --without-build-libs was given.
+if test "${with_build_libs+set}" = set; then
+ withval="$with_build_libs"
+ BUILD_LIBS="$withval"
+fi;
+ echo "$as_me:3743: result: $BUILD_LIBS" >&5
+echo "${ECHO_T}$BUILD_LIBS" >&6
+
+ # this assumes we're on Unix.
+ BUILD_EXEEXT=
+ BUILD_OBJEXT=o
+
+ : ${BUILD_CC:='${CC}'}
+
+ echo "$as_me:3752: checking if the build-compiler \"$BUILD_CC\" works" >&5
+echo $ECHO_N "checking if the build-compiler \"$BUILD_CC\" works... $ECHO_C" >&6
+
+ cf_save_crossed=$cross_compiling
+ cf_save_ac_link=$ac_link
+ cross_compiling=no
+ cf_build_cppflags=$BUILD_CPPFLAGS
+ test "$cf_build_cppflags" = "#" && cf_build_cppflags=
+ ac_link='$BUILD_CC -o "conftest$ac_exeext" $BUILD_CFLAGS $cf_build_cppflags $BUILD_LDFLAGS "conftest.$ac_ext" $BUILD_LIBS >&5'
+
+ if test "$cross_compiling" = yes; then
+ cf_ok_build_cc=unknown
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 3766 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+ int main(int argc, char *argv[])
+ {
+ ${cf_cv_main_return:-return}(argc < 0 || argv == 0 || argv[0] == 0);
+ }
+
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:3776: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:3779: \$? = $ac_status" >&5
+ (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+ { (eval echo "$as_me:3781: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:3784: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_ok_build_cc=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_ok_build_cc=no
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+
+ cross_compiling=$cf_save_crossed
+ ac_link=$cf_save_ac_link
+
+ echo "$as_me:3799: result: $cf_ok_build_cc" >&5
+echo "${ECHO_T}$cf_ok_build_cc" >&6
+
+ if test "$cf_ok_build_cc" != yes
+ then
+ { { echo "$as_me:3804: error: Cross-build requires two compilers.
+Use --with-build-cc to specify the native compiler." >&5
+echo "$as_me: error: Cross-build requires two compilers.
+Use --with-build-cc to specify the native compiler." >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+
+else
+ : ${BUILD_CC:='${CC}'}
+ : ${BUILD_CPP:='${CPP}'}
+ : ${BUILD_CFLAGS:='${CFLAGS}'}
+ : ${BUILD_CPPFLAGS:='${CPPFLAGS}'}
+ : ${BUILD_LDFLAGS:='${LDFLAGS}'}
+ : ${BUILD_LIBS:='${LIBS}'}
+ : ${BUILD_EXEEXT:='$x'}
+ : ${BUILD_OBJEXT:='o'}
+fi
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+echo "$as_me:3825: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_RANLIB+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$RANLIB"; then
+ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+echo "$as_me:3840: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+ echo "$as_me:3848: result: $RANLIB" >&5
+echo "${ECHO_T}$RANLIB" >&6
+else
+ echo "$as_me:3851: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+ ac_ct_RANLIB=$RANLIB
+ # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+echo "$as_me:3860: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_RANLIB"; then
+ ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_ac_ct_RANLIB="ranlib"
+echo "$as_me:3875: found $ac_dir/$ac_word" >&5
+break
+done
+
+ test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB="':'"
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+ echo "$as_me:3884: result: $ac_ct_RANLIB" >&5
+echo "${ECHO_T}$ac_ct_RANLIB" >&6
+else
+ echo "$as_me:3887: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ RANLIB=$ac_ct_RANLIB
+else
+ RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ar; ac_word=$2
+echo "$as_me:3899: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_AR+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$AR"; then
+ ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_AR="${ac_tool_prefix}ar"
+echo "$as_me:3914: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+ echo "$as_me:3922: result: $AR" >&5
+echo "${ECHO_T}$AR" >&6
+else
+ echo "$as_me:3925: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_AR"; then
+ ac_ct_AR=$AR
+ # Extract the first word of "ar", so it can be a program name with args.
+set dummy ar; ac_word=$2
+echo "$as_me:3934: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_AR+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_AR"; then
+ ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
+else
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_ac_ct_AR="ar"
+echo "$as_me:3949: found $ac_dir/$ac_word" >&5
+break
+done
+
+ test -z "$ac_cv_prog_ac_ct_AR" && ac_cv_prog_ac_ct_AR="ar"
+fi
+fi
+ac_ct_AR=$ac_cv_prog_ac_ct_AR
+if test -n "$ac_ct_AR"; then
+ echo "$as_me:3958: result: $ac_ct_AR" >&5
+echo "${ECHO_T}$ac_ct_AR" >&6
+else
+ echo "$as_me:3961: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ AR=$ac_ct_AR
+else
+ AR="$ac_cv_prog_AR"
+fi
+
+echo "$as_me:3970: checking for options to update archives" >&5
+echo $ECHO_N "checking for options to update archives... $ECHO_C" >&6
+if test "${cf_cv_ar_flags+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ case "$cf_cv_system_name" in
+ (*-msvc*)
+ cf_cv_ar_flags=''
+ cat >mk_static_lib.sh <<-EOF
+ #!$SHELL
+ MSVC_BIN="$AR"
+ out="\$1"
+ shift
+ exec \$MSVC_BIN -out:"\$out" \$@
+ EOF
+ chmod +x mk_static_lib.sh
+ AR=`pwd`/mk_static_lib.sh
+ ;;
+ (*)
+ cf_cv_ar_flags=unknown
+ for cf_ar_flags in -curvU -curv curv -crv crv -cqv cqv -rv rv
+ do
+
+ # check if $ARFLAGS already contains this choice
+ if test "x$ARFLAGS" != "x" ; then
+ cf_check_ar_flags=`echo "x$ARFLAGS" | sed -e "s/$cf_ar_flags\$//" -e "s/$cf_ar_flags / /"`
+ if test "x$ARFLAGS" != "$cf_check_ar_flags" ; then
+ cf_cv_ar_flags=
+ break
+ fi
+ fi
+
+ rm -f "conftest.$ac_cv_objext"
+ rm -f conftest.a
+
+ cat >"conftest.$ac_ext" <<EOF
+#line 4007 "configure"
+int testdata[3] = { 123, 456, 789 };
+EOF
+ if { (eval echo "$as_me:4010: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:4013: \$? = $ac_status" >&5
+ (exit "$ac_status"); } ; then
+ echo "$AR $ARFLAGS $cf_ar_flags conftest.a conftest.$ac_cv_objext" >&5
+ $AR $ARFLAGS "$cf_ar_flags" conftest.a "conftest.$ac_cv_objext" 2>&5 1>/dev/null
+ if test -f conftest.a ; then
+ cf_cv_ar_flags="$cf_ar_flags"
+ break
+ fi
+ else
+ test -n "$verbose" && echo " cannot compile test-program" 1>&6
+
+echo "${as_me:-configure}:4024: testing cannot compile test-program ..." 1>&5
+
+ break
+ fi
+ done
+ rm -f conftest.a "conftest.$ac_ext" "conftest.$ac_cv_objext"
+ ;;
+ esac
+
+fi
+echo "$as_me:4034: result: $cf_cv_ar_flags" >&5
+echo "${ECHO_T}$cf_cv_ar_flags" >&6
+
+if test -n "$ARFLAGS" ; then
+ if test -n "$cf_cv_ar_flags" ; then
+ ARFLAGS="$ARFLAGS $cf_cv_ar_flags"
+ fi
+else
+ ARFLAGS=$cf_cv_ar_flags
+fi
+
+echo "$as_me:4045: checking if you want to see long compiling messages" >&5
+echo $ECHO_N "checking if you want to see long compiling messages... $ECHO_C" >&6
+
+# Check whether --enable-echo or --disable-echo was given.
+if test "${enable_echo+set}" = set; then
+ enableval="$enable_echo"
+ test "$enableval" != no && enableval=yes
+ if test "$enableval" != "yes" ; then
+
+ ECHO_LT='--silent'
+ ECHO_LD='@echo linking $@;'
+ RULE_CC='@echo compiling $<'
+ SHOW_CC='@echo compiling $@'
+ ECHO_CC='@'
+
+ else
+
+ ECHO_LT=''
+ ECHO_LD=''
+ RULE_CC=''
+ SHOW_CC=''
+ ECHO_CC=''
+
+ fi
+else
+ enableval=yes
+
+ ECHO_LT=''
+ ECHO_LD=''
+ RULE_CC=''
+ SHOW_CC=''
+ ECHO_CC=''
+
+fi;
+echo "$as_me:4079: result: $enableval" >&5
+echo "${ECHO_T}$enableval" >&6
+
+# special case for WWW/*
+if test -n "$ECHO_CC" ; then
+ DONT_ECHO_CC="$SHOW_CC ;"
+else
+ DONT_ECHO_CC=''
+fi
+
+echo "$as_me:4089: checking if you want to check memory-leaks" >&5
+echo $ECHO_N "checking if you want to check memory-leaks... $ECHO_C" >&6
+
+# Check whether --enable-find-leaks or --disable-find-leaks was given.
+if test "${enable_find_leaks+set}" = set; then
+ enableval="$enable_find_leaks"
+ test "$enableval" != yes && enableval=no
+ if test "$enableval" != "no" ; then
+ with_leak_checks=yes
+ else
+ with_leak_checks=no
+ fi
+else
+ enableval=no
+ with_leak_checks=no
+
+fi;
+echo "$as_me:4106: result: $with_leak_checks" >&5
+echo "${ECHO_T}$with_leak_checks" >&6
+test "$with_leak_checks" = "yes" &&
+cat >>confdefs.h <<\EOF
+#define LY_FIND_LEAKS 1
+EOF
+
+# The comment about adding -g to $CFLAGS is unclear. Autoconf tries to add
+# a -g flag; we remove it if the user's $CFLAGS was not set and debugging is
+# disabled.
+echo "$as_me:4116: checking if you want to enable debug-code" >&5
+echo $ECHO_N "checking if you want to enable debug-code... $ECHO_C" >&6
+
+# Check whether --enable-debug or --disable-debug was given.
+if test "${enable_debug+set}" = set; then
+ enableval="$enable_debug"
+ test "$enableval" != yes && enableval=no
+ if test "$enableval" != "no" ; then
+ with_debug=yes
+ else
+ with_debug=no
+ fi
+else
+ enableval=no
+ with_debug=no
+
+fi;
+echo "$as_me:4133: result: $with_debug" >&5
+echo "${ECHO_T}$with_debug" >&6
+if test "$with_debug" = "yes" ; then
+ case "$host_os" in
+ (ultrix*|osf*)
+ test -z "$ORIGINAL_CFLAGS" &&
+CFLAGS=`echo "${CFLAGS}" | sed -e 's%-O1-9\? %%' -e 's%-O1-9\?$%%' -e 's%[ ]% %g' -e 's% [ ]*% %g' -e 's%^ %%' -e 's% $%%'`
+
+ if test -z "$GCC" ; then
+ CFLAGS="$CFLAGS -g3"
+ fi
+ ;;
+ esac
+else
+ case "$host_os" in
+ (osf*)
+ test -z "$GCC" && CFLAGS="$CFLAGS -std1"
+ test -z "$ORIGINAL_CFLAGS" && CFLAGS=`echo "${CFLAGS}" | sed -e 's%-g %%' -e 's%-g$%%' -e 's%[ ]% %g' -e 's% [ ]*% %g' -e 's%^ %%' -e 's% $%%'`
+ ;;
+ (*)
+ test -z "$ORIGINAL_CFLAGS" && CFLAGS=`echo "${CFLAGS}" | sed -e 's%-g %%' -e 's%-g$%%' -e 's%[ ]% %g' -e 's% [ ]*% %g' -e 's%^ %%' -e 's% $%%'`
+ ;;
+ esac
+fi
+
+echo "$as_me:4158: checking if you want to enable lynx trace code *recommended* " >&5
+echo $ECHO_N "checking if you want to enable lynx trace code *recommended* ... $ECHO_C" >&6
+
+# Check whether --enable-trace or --disable-trace was given.
+if test "${enable_trace+set}" = set; then
+ enableval="$enable_trace"
+ test "$enableval" != no && enableval=yes
+ if test "$enableval" != "yes" ; then
+ with_trace=$enableval
+ else
+ with_trace=yes
+ fi
+else
+ enableval=yes
+ with_trace=yes
+
+fi;
+echo "$as_me:4175: result: $with_trace" >&5
+echo "${ECHO_T}$with_trace" >&6
+test "$with_trace" = no &&
+cat >>confdefs.h <<\EOF
+#define NO_LYNX_TRACE 1
+EOF
+
+echo "$as_me:4182: checking if you want verbose trace code" >&5
+echo $ECHO_N "checking if you want verbose trace code... $ECHO_C" >&6
+
+# Check whether --enable-vertrace or --disable-vertrace was given.
+if test "${enable_vertrace+set}" = set; then
+ enableval="$enable_vertrace"
+ test "$enableval" != yes && enableval=no
+ if test "$enableval" != "no" ; then
+ with_vertrace=yes
+ else
+ with_vertrace=no
+ fi
+else
+ enableval=no
+ with_vertrace=no
+
+fi;
+echo "$as_me:4199: result: $with_vertrace" >&5
+echo "${ECHO_T}$with_vertrace" >&6
+test "$with_vertrace" = yes &&
+cat >>confdefs.h <<\EOF
+#define LY_TRACELINE __LINE__
+EOF
+
+if test -n "$with_screen" && test "x$with_screen" = "xpdcurses"
+then
+ echo "$as_me:4208: checking for X" >&5
+echo $ECHO_N "checking for X... $ECHO_C" >&6
+
+# Check whether --with-x or --without-x was given.
+if test "${with_x+set}" = set; then
+ withval="$with_x"
+
+fi;
+# $have_x is `yes', `no', `disabled', or empty when we do not yet know.
+if test "x$with_x" = xno; then
+ # The user explicitly disabled X.
+ have_x=disabled
+else
+ if test "x$x_includes" != xNONE && test "x$x_libraries" != xNONE; then
+ # Both variables are already set.
+ have_x=yes
+ else
+ if test "${ac_cv_have_x+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ # One or both of the vars are not set, and there is no cached value.
+ac_x_includes=no ac_x_libraries=no
+rm -fr conftest.dir
+if mkdir conftest.dir; then
+ cd conftest.dir
+ # Make sure to not put "make" in the Imakefile rules, since we grep it out.
+ cat >Imakefile <<'EOF'
+acfindx:
+ @echo 'ac_im_incroot="${INCROOT}"; ac_im_usrlibdir="${USRLIBDIR}"; ac_im_libdir="${LIBDIR}"'
+EOF
+ if (xmkmf) >/dev/null 2>/dev/null && test -f Makefile; then
+ # GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+ eval "`${MAKE-make} acfindx 2>/dev/null | grep -v make`"
+ # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR.
+ for ac_extension in a so sl dylib dll; do
+ if test ! -f "$ac_im_usrlibdir/libX11.$ac_extension" &&
+ test -f "$ac_im_libdir/libX11.$ac_extension"; then
+ ac_im_usrlibdir=$ac_im_libdir; break
+ fi
+ done
+ # Screen out bogus values from the imake configuration. They are
+ # bogus both because they are the default anyway, and because
+ # using them would break gcc on systems where it needs fixed includes.
+ case $ac_im_incroot in
+ /usr/include) ;;
+ *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;;
+ esac
+ case $ac_im_usrlibdir in
+ /usr/lib | /lib) ;;
+ *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;;
+ esac
+ fi
+ cd ..
+ rm -fr conftest.dir
+fi
+
+# Standard set of common directories for X headers.
+# Check X11 before X11Rn because it is often a symlink to the current release.
+ac_x_header_dirs='
+/usr/X11/include
+/usr/X11R7/include
+/usr/X11R6/include
+/usr/X11R5/include
+/usr/X11R4/include
+
+/opt/local/include
+/opt/X11/include
+
+/usr/include/X11
+/usr/include/X11R7
+/usr/include/X11R6
+/usr/include/X11R5
+/usr/include/X11R4
+
+/usr/local/X11/include
+/usr/local/X11R7/include
+/usr/local/X11R6/include
+/usr/local/X11R5/include
+/usr/local/X11R4/include
+
+/usr/local/include/X11
+/usr/local/include/X11R7
+/usr/local/include/X11R6
+/usr/local/include/X11R5
+/usr/local/include/X11R4
+
+/usr/X386/include
+/usr/x386/include
+/usr/XFree86/include/X11
+
+/usr/include
+/usr/local/include
+/usr/unsupported/include
+/usr/athena/include
+/usr/local/x11r5/include
+/usr/lpp/Xamples/include
+
+/usr/openwin/include
+/usr/openwin/share/include'
+
+if test "$ac_x_includes" = no; then
+ # Guess where to find include files, by looking for Intrinsic.h.
+ # First, try using that file with no special directory specified.
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 4312 "configure"
+#include "confdefs.h"
+#include <X11/Intrinsic.h>
+_ACEOF
+if { (eval echo "$as_me:4316: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+ (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ $EGREP -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:4322: \$? = $ac_status" >&5
+ (exit "$ac_status"); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ # We can compile using X headers with no special include directory.
+ac_x_includes=
+else
+ echo "$as_me: failed program was:" >&5
+ cat "conftest.$ac_ext" >&5
+ for ac_dir in $ac_x_header_dirs; do
+ if test -r "$ac_dir/X11/Intrinsic.h"; then
+ ac_x_includes=$ac_dir
+ break
+ fi
+done
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi # $ac_x_includes = no
+
+if test "$ac_x_libraries" = no; then
+ # Check for the libraries.
+ # See if we find them without any special options.
+ # Don't add to $LIBS permanently.
+ ac_save_LIBS=$LIBS
+ LIBS="-lXt $LIBS"
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 4355 "configure"
+#include "confdefs.h"
+#include <X11/Intrinsic.h>
+int
+main (void)
+{
+XtMalloc (0)
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:4367: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:4370: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:4373: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:4376: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ LIBS=$ac_save_LIBS
+# We can link X programs with no special library path.
+ac_x_libraries=
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+LIBS=$ac_save_LIBS
+for ac_dir in `echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g`
+do
+ # Don't even attempt the hair of trying to link an X program!
+ for ac_extension in a so sl dylib dll; do
+ if test -r "$ac_dir/libXt.$ac_extension"; then
+ ac_x_libraries=$ac_dir
+ break 2
+ fi
+ done
+done
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi # $ac_x_libraries = no
+
+if test "$ac_x_includes" = no || test "$ac_x_libraries" = no; then
+ # Didn't find X anywhere. Cache the known absence of X.
+ ac_cv_have_x="have_x=no"
+else
+ # Record where we found X for the cache.
+ ac_cv_have_x="have_x=yes \
+ ac_x_includes=$ac_x_includes ac_x_libraries=$ac_x_libraries"
+fi
+fi
+
+ fi
+ eval "$ac_cv_have_x"
+fi # $with_x != no
+
+if test "$have_x" != yes; then
+ echo "$as_me:4414: result: $have_x" >&5
+echo "${ECHO_T}$have_x" >&6
+ no_x=yes
+else
+ # If each of the values was on the command line, it overrides each guess.
+ test "x$x_includes" = xNONE && x_includes=$ac_x_includes
+ test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries
+ # Update the cache value to reflect the command line values.
+ ac_cv_have_x="have_x=yes \
+ ac_x_includes=$x_includes ac_x_libraries=$x_libraries"
+ echo "$as_me:4424: result: libraries $x_libraries, headers $x_includes" >&5
+echo "${ECHO_T}libraries $x_libraries, headers $x_includes" >&6
+fi
+
+ if test "$no_x" = yes; then
+ # Not all programs may use this symbol, but it does not hurt to define it.
+
+cat >>confdefs.h <<\EOF
+#define X_DISPLAY_MISSING 1
+EOF
+
+ X_CFLAGS=
+ X_PRE_LIBS=
+ X_LIBS=
+ X_EXTRA_LIBS=
+else
+ if test -n "$x_includes"; then
+ X_CFLAGS="$X_CFLAGS -I$x_includes"
+ fi
+
+ # It would also be nice to do this for all -L options, not just this one.
+ if test -n "$x_libraries"; then
+ X_LIBS="$X_LIBS -L$x_libraries"
+ # For Solaris; some versions of Sun CC require a space after -R and
+ # others require no space. Words are not sufficient . . . .
+ case `(uname -sr) 2>/dev/null` in
+ "SunOS 5"*)
+ echo "$as_me:4451: checking whether -R must be followed by a space" >&5
+echo $ECHO_N "checking whether -R must be followed by a space... $ECHO_C" >&6
+ ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries"
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 4455 "configure"
+#include "confdefs.h"
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:4467: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:4470: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:4473: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:4476: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_R_nospace=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_R_nospace=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+ if test $ac_R_nospace = yes; then
+ echo "$as_me:4486: result: no" >&5
+echo "${ECHO_T}no" >&6
+ X_LIBS="$X_LIBS -R$x_libraries"
+ else
+ LIBS="$ac_xsave_LIBS -R $x_libraries"
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 4492 "configure"
+#include "confdefs.h"
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:4504: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:4507: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:4510: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:4513: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_R_space=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_R_space=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+ if test $ac_R_space = yes; then
+ echo "$as_me:4523: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ X_LIBS="$X_LIBS -R $x_libraries"
+ else
+ echo "$as_me:4527: result: neither works" >&5
+echo "${ECHO_T}neither works" >&6
+ fi
+ fi
+ LIBS=$ac_xsave_LIBS
+ esac
+ fi
+
+ # Check for system-dependent libraries X programs must link with.
+ # Do this before checking for the system-independent R6 libraries
+ # (-lICE), since we may need -lsocket or whatever for X linking.
+
+ if test "$ISC" = yes; then
+ X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet"
+ else
+ # Martyn Johnson says this is needed for Ultrix, if the X
+ # libraries were built with DECnet support. And Karl Berry says
+ # the Alpha needs dnet_stub (dnet does not exist).
+ ac_xsave_LIBS="$LIBS"; LIBS="$LIBS $X_LIBS -lX11"
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 4547 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char XOpenDisplay ();
+int
+main (void)
+{
+XOpenDisplay ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:4566: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:4569: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:4572: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:4575: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+echo "$as_me:4581: checking for dnet_ntoa in -ldnet" >&5
+echo $ECHO_N "checking for dnet_ntoa in -ldnet... $ECHO_C" >&6
+if test "${ac_cv_lib_dnet_dnet_ntoa+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldnet $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 4589 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char dnet_ntoa ();
+int
+main (void)
+{
+dnet_ntoa ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:4608: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:4611: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:4614: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:4617: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_lib_dnet_dnet_ntoa=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_dnet_dnet_ntoa=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:4628: result: $ac_cv_lib_dnet_dnet_ntoa" >&5
+echo "${ECHO_T}$ac_cv_lib_dnet_dnet_ntoa" >&6
+if test "$ac_cv_lib_dnet_dnet_ntoa" = yes; then
+ X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet"
+fi
+
+ if test $ac_cv_lib_dnet_dnet_ntoa = no; then
+ echo "$as_me:4635: checking for dnet_ntoa in -ldnet_stub" >&5
+echo $ECHO_N "checking for dnet_ntoa in -ldnet_stub... $ECHO_C" >&6
+if test "${ac_cv_lib_dnet_stub_dnet_ntoa+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldnet_stub $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 4643 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char dnet_ntoa ();
+int
+main (void)
+{
+dnet_ntoa ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:4662: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:4665: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:4668: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:4671: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_lib_dnet_stub_dnet_ntoa=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_dnet_stub_dnet_ntoa=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:4682: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5
+echo "${ECHO_T}$ac_cv_lib_dnet_stub_dnet_ntoa" >&6
+if test "$ac_cv_lib_dnet_stub_dnet_ntoa" = yes; then
+ X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub"
+fi
+
+ fi
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+ LIBS="$ac_xsave_LIBS"
+
+ # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT,
+ # to get the SysV transport functions.
+ # Chad R. Larson says the Pyramis MIS-ES running DC/OSx (SVR4)
+ # needs -lnsl.
+ # The nsl library prevents programs from opening the X display
+ # on Irix 5.2, according to T.E. Dickey.
+ # The functions gethostbyname, getservbyname, and inet_addr are
+ # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking.
+ echo "$as_me:4701: checking for gethostbyname" >&5
+echo $ECHO_N "checking for gethostbyname... $ECHO_C" >&6
+if test "${ac_cv_func_gethostbyname+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 4707 "configure"
+#include "confdefs.h"
+#define gethostbyname autoconf_temporary
+#include <limits.h> /* least-intrusive standard header which defines gcc2 __stub macros */
+#undef gethostbyname
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char gethostbyname (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_gethostbyname) || defined (__stub___gethostbyname)
+#error found stub for gethostbyname
+#endif
+
+ return gethostbyname ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:4738: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:4741: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:4744: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:4747: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_func_gethostbyname=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_gethostbyname=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:4757: result: $ac_cv_func_gethostbyname" >&5
+echo "${ECHO_T}$ac_cv_func_gethostbyname" >&6
+
+ if test $ac_cv_func_gethostbyname = no; then
+ echo "$as_me:4761: checking for gethostbyname in -lnsl" >&5
+echo $ECHO_N "checking for gethostbyname in -lnsl... $ECHO_C" >&6
+if test "${ac_cv_lib_nsl_gethostbyname+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lnsl $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 4769 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char gethostbyname ();
+int
+main (void)
+{
+gethostbyname ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:4788: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:4791: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:4794: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:4797: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_lib_nsl_gethostbyname=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_nsl_gethostbyname=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:4808: result: $ac_cv_lib_nsl_gethostbyname" >&5
+echo "${ECHO_T}$ac_cv_lib_nsl_gethostbyname" >&6
+if test "$ac_cv_lib_nsl_gethostbyname" = yes; then
+ X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl"
+fi
+
+ if test $ac_cv_lib_nsl_gethostbyname = no; then
+ echo "$as_me:4815: checking for gethostbyname in -lbsd" >&5
+echo $ECHO_N "checking for gethostbyname in -lbsd... $ECHO_C" >&6
+if test "${ac_cv_lib_bsd_gethostbyname+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lbsd $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 4823 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char gethostbyname ();
+int
+main (void)
+{
+gethostbyname ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:4842: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:4845: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:4848: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:4851: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_lib_bsd_gethostbyname=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_bsd_gethostbyname=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:4862: result: $ac_cv_lib_bsd_gethostbyname" >&5
+echo "${ECHO_T}$ac_cv_lib_bsd_gethostbyname" >&6
+if test "$ac_cv_lib_bsd_gethostbyname" = yes; then
+ X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd"
+fi
+
+ fi
+ fi
+
+ # lieder@skyler.mavd.honeywell.com says without -lsocket,
+ # socket/setsockopt and other routines are undefined under SCO ODT
+ # 2.0. But -lsocket is broken on IRIX 5.2 (and is not necessary
+ # on later versions), says Simon Leinen: it contains gethostby*
+ # variants that don't use the nameserver (or something). -lsocket
+ # must be given before -lnsl if both are needed. We assume that
+ # if connect needs -lnsl, so does gethostbyname.
+ echo "$as_me:4878: checking for connect" >&5
+echo $ECHO_N "checking for connect... $ECHO_C" >&6
+if test "${ac_cv_func_connect+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 4884 "configure"
+#include "confdefs.h"
+#define connect autoconf_temporary
+#include <limits.h> /* least-intrusive standard header which defines gcc2 __stub macros */
+#undef connect
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char connect (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_connect) || defined (__stub___connect)
+#error found stub for connect
+#endif
+
+ return connect ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:4915: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:4918: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:4921: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:4924: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_func_connect=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_connect=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:4934: result: $ac_cv_func_connect" >&5
+echo "${ECHO_T}$ac_cv_func_connect" >&6
+
+ if test $ac_cv_func_connect = no; then
+ echo "$as_me:4938: checking for connect in -lsocket" >&5
+echo $ECHO_N "checking for connect in -lsocket... $ECHO_C" >&6
+if test "${ac_cv_lib_socket_connect+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsocket $X_EXTRA_LIBS $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 4946 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char connect ();
+int
+main (void)
+{
+connect ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:4965: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:4968: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:4971: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:4974: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_lib_socket_connect=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_socket_connect=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:4985: result: $ac_cv_lib_socket_connect" >&5
+echo "${ECHO_T}$ac_cv_lib_socket_connect" >&6
+if test "$ac_cv_lib_socket_connect" = yes; then
+ X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS"
+fi
+
+ fi
+
+ # Guillermo Gomez says -lposix is necessary on A/UX.
+ echo "$as_me:4994: checking for remove" >&5
+echo $ECHO_N "checking for remove... $ECHO_C" >&6
+if test "${ac_cv_func_remove+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 5000 "configure"
+#include "confdefs.h"
+#define remove autoconf_temporary
+#include <limits.h> /* least-intrusive standard header which defines gcc2 __stub macros */
+#undef remove
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char remove (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_remove) || defined (__stub___remove)
+#error found stub for remove
+#endif
+
+ return remove ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:5031: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:5034: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:5037: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:5040: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_func_remove=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_remove=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:5050: result: $ac_cv_func_remove" >&5
+echo "${ECHO_T}$ac_cv_func_remove" >&6
+
+ if test $ac_cv_func_remove = no; then
+ echo "$as_me:5054: checking for remove in -lposix" >&5
+echo $ECHO_N "checking for remove in -lposix... $ECHO_C" >&6
+if test "${ac_cv_lib_posix_remove+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lposix $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 5062 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char remove ();
+int
+main (void)
+{
+remove ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:5081: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:5084: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:5087: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:5090: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_lib_posix_remove=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_posix_remove=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:5101: result: $ac_cv_lib_posix_remove" >&5
+echo "${ECHO_T}$ac_cv_lib_posix_remove" >&6
+if test "$ac_cv_lib_posix_remove" = yes; then
+ X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix"
+fi
+
+ fi
+
+ # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay.
+ echo "$as_me:5110: checking for shmat" >&5
+echo $ECHO_N "checking for shmat... $ECHO_C" >&6
+if test "${ac_cv_func_shmat+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 5116 "configure"
+#include "confdefs.h"
+#define shmat autoconf_temporary
+#include <limits.h> /* least-intrusive standard header which defines gcc2 __stub macros */
+#undef shmat
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char shmat (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_shmat) || defined (__stub___shmat)
+#error found stub for shmat
+#endif
+
+ return shmat ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:5147: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:5150: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:5153: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:5156: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_func_shmat=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_shmat=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:5166: result: $ac_cv_func_shmat" >&5
+echo "${ECHO_T}$ac_cv_func_shmat" >&6
+
+ if test $ac_cv_func_shmat = no; then
+ echo "$as_me:5170: checking for shmat in -lipc" >&5
+echo $ECHO_N "checking for shmat in -lipc... $ECHO_C" >&6
+if test "${ac_cv_lib_ipc_shmat+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lipc $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 5178 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char shmat ();
+int
+main (void)
+{
+shmat ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:5197: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:5200: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:5203: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:5206: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_lib_ipc_shmat=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_ipc_shmat=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:5217: result: $ac_cv_lib_ipc_shmat" >&5
+echo "${ECHO_T}$ac_cv_lib_ipc_shmat" >&6
+if test "$ac_cv_lib_ipc_shmat" = yes; then
+ X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc"
+fi
+
+ fi
+ fi
+
+ # Check for libraries that X11R6 Xt/Xaw programs need.
+ ac_save_LDFLAGS=$LDFLAGS
+ test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries"
+ # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to
+ # check for ICE first), but we must link in the order -lSM -lICE or
+ # we get undefined symbols. So assume we have SM if we have ICE.
+ # These have to be linked with before -lX11, unlike the other
+ # libraries we check for below, so use a different variable.
+ # John Interrante, Karl Berry
+ echo "$as_me:5235: checking for IceConnectionNumber in -lICE" >&5
+echo $ECHO_N "checking for IceConnectionNumber in -lICE... $ECHO_C" >&6
+if test "${ac_cv_lib_ICE_IceConnectionNumber+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lICE $X_EXTRA_LIBS $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 5243 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char IceConnectionNumber ();
+int
+main (void)
+{
+IceConnectionNumber ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:5262: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:5265: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:5268: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:5271: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_lib_ICE_IceConnectionNumber=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_ICE_IceConnectionNumber=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:5282: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5
+echo "${ECHO_T}$ac_cv_lib_ICE_IceConnectionNumber" >&6
+if test "$ac_cv_lib_ICE_IceConnectionNumber" = yes; then
+ X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE"
+fi
+
+ LDFLAGS=$ac_save_LDFLAGS
+
+fi
+
+fi
+
+echo "$as_me:5294: checking if you want to use C11 _Noreturn feature" >&5
+echo $ECHO_N "checking if you want to use C11 _Noreturn feature... $ECHO_C" >&6
+
+# Check whether --enable-stdnoreturn or --disable-stdnoreturn was given.
+if test "${enable_stdnoreturn+set}" = set; then
+ enableval="$enable_stdnoreturn"
+ test "$enableval" != yes && enableval=no
+ if test "$enableval" != "no" ; then
+ enable_stdnoreturn=yes
+ else
+ enable_stdnoreturn=no
+ fi
+else
+ enableval=no
+ enable_stdnoreturn=no
+
+fi;
+echo "$as_me:5311: result: $enable_stdnoreturn" >&5
+echo "${ECHO_T}$enable_stdnoreturn" >&6
+
+if test $enable_stdnoreturn = yes; then
+echo "$as_me:5315: checking for C11 _Noreturn feature" >&5
+echo $ECHO_N "checking for C11 _Noreturn feature... $ECHO_C" >&6
+if test "${cf_cv_c11_noreturn+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 5321 "configure"
+#include "confdefs.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdnoreturn.h>
+static _Noreturn void giveup(void) { exit(0); }
+
+int
+main (void)
+{
+if (feof(stdin)) giveup()
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:5338: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:5341: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:5344: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:5347: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_c11_noreturn=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_c11_noreturn=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:5358: result: $cf_cv_c11_noreturn" >&5
+echo "${ECHO_T}$cf_cv_c11_noreturn" >&6
+else
+ cf_cv_c11_noreturn=no,
+fi
+
+if test "$cf_cv_c11_noreturn" = yes; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_STDNORETURN_H 1
+EOF
+
+cat >>confdefs.h <<EOF
+#define STDC_NORETURN _Noreturn
+EOF
+
+ HAVE_STDNORETURN_H=1
+else
+ HAVE_STDNORETURN_H=0
+fi
+
+if test "$GCC" = yes || test "$GXX" = yes
+then
+
+if test "$GCC" = yes || test "$GXX" = yes
+then
+ case $CFLAGS in
+ (*-Werror=*)
+ cf_temp_flags=
+ for cf_temp_scan in $CFLAGS
+ do
+ case "x$cf_temp_scan" in
+ (x-Werror=format*)
+
+ test -n "$cf_temp_flags" && cf_temp_flags="$cf_temp_flags "
+ cf_temp_flags="${cf_temp_flags}$cf_temp_scan"
+
+ ;;
+ (x-Werror=*)
+
+ test -n "$EXTRA_CFLAGS" && EXTRA_CFLAGS="$EXTRA_CFLAGS "
+ EXTRA_CFLAGS="${EXTRA_CFLAGS}$cf_temp_scan"
+
+ ;;
+ (*)
+
+ test -n "$cf_temp_flags" && cf_temp_flags="$cf_temp_flags "
+ cf_temp_flags="${cf_temp_flags}$cf_temp_scan"
+
+ ;;
+ esac
+ done
+ if test "x$CFLAGS" != "x$cf_temp_flags"
+ then
+ test -n "$verbose" && echo " repairing CFLAGS: $CFLAGS" 1>&6
+
+echo "${as_me:-configure}:5414: testing repairing CFLAGS: $CFLAGS ..." 1>&5
+
+ CFLAGS="$cf_temp_flags"
+ test -n "$verbose" && echo " ... fixed $CFLAGS" 1>&6
+
+echo "${as_me:-configure}:5419: testing ... fixed $CFLAGS ..." 1>&5
+
+ test -n "$verbose" && echo " ... extra $EXTRA_CFLAGS" 1>&6
+
+echo "${as_me:-configure}:5423: testing ... extra $EXTRA_CFLAGS ..." 1>&5
+
+ fi
+ ;;
+ esac
+fi
+
+if test "$GCC" = yes || test "$GXX" = yes
+then
+ case $CPPFLAGS in
+ (*-Werror=*)
+ cf_temp_flags=
+ for cf_temp_scan in $CPPFLAGS
+ do
+ case "x$cf_temp_scan" in
+ (x-Werror=format*)
+
+ test -n "$cf_temp_flags" && cf_temp_flags="$cf_temp_flags "
+ cf_temp_flags="${cf_temp_flags}$cf_temp_scan"
+
+ ;;
+ (x-Werror=*)
+
+ test -n "$EXTRA_CFLAGS" && EXTRA_CFLAGS="$EXTRA_CFLAGS "
+ EXTRA_CFLAGS="${EXTRA_CFLAGS}$cf_temp_scan"
+
+ ;;
+ (*)
+
+ test -n "$cf_temp_flags" && cf_temp_flags="$cf_temp_flags "
+ cf_temp_flags="${cf_temp_flags}$cf_temp_scan"
+
+ ;;
+ esac
+ done
+ if test "x$CPPFLAGS" != "x$cf_temp_flags"
+ then
+ test -n "$verbose" && echo " repairing CPPFLAGS: $CPPFLAGS" 1>&6
+
+echo "${as_me:-configure}:5462: testing repairing CPPFLAGS: $CPPFLAGS ..." 1>&5
+
+ CPPFLAGS="$cf_temp_flags"
+ test -n "$verbose" && echo " ... fixed $CPPFLAGS" 1>&6
+
+echo "${as_me:-configure}:5467: testing ... fixed $CPPFLAGS ..." 1>&5
+
+ test -n "$verbose" && echo " ... extra $EXTRA_CFLAGS" 1>&6
+
+echo "${as_me:-configure}:5471: testing ... extra $EXTRA_CFLAGS ..." 1>&5
+
+ fi
+ ;;
+ esac
+fi
+
+if test "$GCC" = yes || test "$GXX" = yes
+then
+ case $LDFLAGS in
+ (*-Werror=*)
+ cf_temp_flags=
+ for cf_temp_scan in $LDFLAGS
+ do
+ case "x$cf_temp_scan" in
+ (x-Werror=format*)
+
+ test -n "$cf_temp_flags" && cf_temp_flags="$cf_temp_flags "
+ cf_temp_flags="${cf_temp_flags}$cf_temp_scan"
+
+ ;;
+ (x-Werror=*)
+
+ test -n "$EXTRA_CFLAGS" && EXTRA_CFLAGS="$EXTRA_CFLAGS "
+ EXTRA_CFLAGS="${EXTRA_CFLAGS}$cf_temp_scan"
+
+ ;;
+ (*)
+
+ test -n "$cf_temp_flags" && cf_temp_flags="$cf_temp_flags "
+ cf_temp_flags="${cf_temp_flags}$cf_temp_scan"
+
+ ;;
+ esac
+ done
+ if test "x$LDFLAGS" != "x$cf_temp_flags"
+ then
+ test -n "$verbose" && echo " repairing LDFLAGS: $LDFLAGS" 1>&6
+
+echo "${as_me:-configure}:5510: testing repairing LDFLAGS: $LDFLAGS ..." 1>&5
+
+ LDFLAGS="$cf_temp_flags"
+ test -n "$verbose" && echo " ... fixed $LDFLAGS" 1>&6
+
+echo "${as_me:-configure}:5515: testing ... fixed $LDFLAGS ..." 1>&5
+
+ test -n "$verbose" && echo " ... extra $EXTRA_CFLAGS" 1>&6
+
+echo "${as_me:-configure}:5519: testing ... extra $EXTRA_CFLAGS ..." 1>&5
+
+ fi
+ ;;
+ esac
+fi
+
+echo "$as_me:5526: checking if you want to turn on gcc warnings" >&5
+echo $ECHO_N "checking if you want to turn on gcc warnings... $ECHO_C" >&6
+
+# Check whether --enable-warnings or --disable-warnings was given.
+if test "${enable_warnings+set}" = set; then
+ enableval="$enable_warnings"
+ test "$enableval" != yes && enableval=no
+ if test "$enableval" != "no" ; then
+ enable_warnings=yes
+ else
+ enable_warnings=no
+ fi
+else
+ enableval=no
+ enable_warnings=no
+
+fi;
+echo "$as_me:5543: result: $enable_warnings" >&5
+echo "${ECHO_T}$enable_warnings" >&6
+if test "$enable_warnings" = "yes"
+then
+
+if test "$GCC" = yes || test "$GXX" = yes
+then
+cat > conftest.i <<EOF
+#ifndef GCC_PRINTF
+#define GCC_PRINTF 0
+#endif
+#ifndef GCC_SCANF
+#define GCC_SCANF 0
+#endif
+#ifndef GCC_NORETURN
+#define GCC_NORETURN /* nothing */
+#endif
+#ifndef GCC_UNUSED
+#define GCC_UNUSED /* nothing */
+#endif
+EOF
+if test "$GCC" = yes
+then
+ { echo "$as_me:5566: checking for $CC __attribute__ directives..." >&5
+echo "$as_me: checking for $CC __attribute__ directives..." >&6;}
+cat > "conftest.$ac_ext" <<EOF
+#line 5569 "${as_me:-configure}"
+#include <stdio.h>
+#include "confdefs.h"
+#include "conftest.h"
+#include "conftest.i"
+#if GCC_PRINTF
+#define GCC_PRINTFLIKE(fmt,var) __attribute__((format(printf,fmt,var)))
+#else
+#define GCC_PRINTFLIKE(fmt,var) /*nothing*/
+#endif
+#if GCC_SCANF
+#define GCC_SCANFLIKE(fmt,var) __attribute__((format(scanf,fmt,var)))
+#else
+#define GCC_SCANFLIKE(fmt,var) /*nothing*/
+#endif
+extern void wow(char *,...) GCC_SCANFLIKE(1,2);
+extern GCC_NORETURN void oops(char *,...) GCC_PRINTFLIKE(1,2);
+extern GCC_NORETURN void foo(void);
+int main(int argc GCC_UNUSED, char *argv[] GCC_UNUSED) { (void)argc; (void)argv; return 0; }
+EOF
+ cf_printf_attribute=no
+ cf_scanf_attribute=no
+ for cf_attribute in scanf printf unused noreturn
+ do
+
+cf_ATTRIBUTE=`echo "$cf_attribute" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+ cf_directive="__attribute__(($cf_attribute))"
+ echo "checking for $CC $cf_directive" 1>&5
+
+ case "$cf_attribute" in
+ (printf)
+ cf_printf_attribute=yes
+ cat >conftest.h <<EOF
+#define GCC_$cf_ATTRIBUTE 1
+EOF
+ ;;
+ (scanf)
+ cf_scanf_attribute=yes
+ cat >conftest.h <<EOF
+#define GCC_$cf_ATTRIBUTE 1
+EOF
+ ;;
+ (*)
+ cat >conftest.h <<EOF
+#define GCC_$cf_ATTRIBUTE $cf_directive
+EOF
+ ;;
+ esac
+
+ if { (eval echo "$as_me:5619: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:5622: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; then
+ test -n "$verbose" && echo "$as_me:5624: result: ... $cf_attribute" >&5
+echo "${ECHO_T}... $cf_attribute" >&6
+ cat conftest.h >>confdefs.h
+ case "$cf_attribute" in
+ (noreturn)
+
+cat >>confdefs.h <<EOF
+#define GCC_NORETURN $cf_directive
+EOF
+
+ ;;
+ (printf)
+ cf_value='/* nothing */'
+ if test "$cf_printf_attribute" != no ; then
+ cf_value='__attribute__((format(printf,fmt,var)))'
+
+cat >>confdefs.h <<\EOF
+#define GCC_PRINTF 1
+EOF
+
+ fi
+
+cat >>confdefs.h <<EOF
+#define GCC_PRINTFLIKE(fmt,var) $cf_value
+EOF
+
+ ;;
+ (scanf)
+ cf_value='/* nothing */'
+ if test "$cf_scanf_attribute" != no ; then
+ cf_value='__attribute__((format(scanf,fmt,var)))'
+
+cat >>confdefs.h <<\EOF
+#define GCC_SCANF 1
+EOF
+
+ fi
+
+cat >>confdefs.h <<EOF
+#define GCC_SCANFLIKE(fmt,var) $cf_value
+EOF
+
+ ;;
+ (unused)
+
+cat >>confdefs.h <<EOF
+#define GCC_UNUSED $cf_directive
+EOF
+
+ ;;
+ esac
+ fi
+ done
+else
+ ${FGREP-fgrep} define conftest.i >>confdefs.h
+fi
+rm -rf ./conftest*
+fi
+
+if test "x$have_x" = xyes; then
+
+cf_save_LIBS_CF_CONST_X_STRING="$LIBS"
+cf_save_CFLAGS_CF_CONST_X_STRING="$CFLAGS"
+cf_save_CPPFLAGS_CF_CONST_X_STRING="$CPPFLAGS"
+LIBS="$LIBS ${X_PRE_LIBS} ${X_LIBS} ${X_EXTRA_LIBS}"
+for cf_X_CFLAGS in $X_CFLAGS
+do
+ case "x$cf_X_CFLAGS" in
+ x-[IUD]*)
+ CPPFLAGS="$CPPFLAGS $cf_X_CFLAGS"
+ ;;
+ *)
+ CFLAGS="$CFLAGS $cf_X_CFLAGS"
+ ;;
+ esac
+done
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 5702 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <X11/Intrinsic.h>
+
+int
+main (void)
+{
+String foo = malloc(1); free((void*)foo)
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:5717: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:5720: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:5723: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:5726: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+echo "$as_me:5729: checking for X11/Xt const-feature" >&5
+echo $ECHO_N "checking for X11/Xt const-feature... $ECHO_C" >&6
+if test "${cf_cv_const_x_string+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 5736 "configure"
+#include "confdefs.h"
+
+#define _CONST_X_STRING /* X11R7.8 (perhaps) */
+#undef XTSTRINGDEFINES /* X11R5 and later */
+#include <stdlib.h>
+#include <X11/Intrinsic.h>
+
+int
+main (void)
+{
+String foo = malloc(1); *foo = 0
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:5753: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:5756: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:5759: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:5762: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ cf_cv_const_x_string=no
+
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+ cf_cv_const_x_string=yes
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:5777: result: $cf_cv_const_x_string" >&5
+echo "${ECHO_T}$cf_cv_const_x_string" >&6
+
+LIBS="$cf_save_LIBS_CF_CONST_X_STRING"
+CFLAGS="$cf_save_CFLAGS_CF_CONST_X_STRING"
+CPPFLAGS="$cf_save_CPPFLAGS_CF_CONST_X_STRING"
+
+case "$cf_cv_const_x_string" in
+(no)
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-DXTSTRINGDEFINES"
+
+ ;;
+(*)
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-D_CONST_X_STRING"
+
+ ;;
+esac
+
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ fi
+cat > "conftest.$ac_ext" <<EOF
+#line 5806 "${as_me:-configure}"
+int main(int argc, char *argv[]) { return (argv[argc-1] == 0) ; }
+EOF
+if test "$INTEL_COMPILER" = yes
+then
+# The "-wdXXX" options suppress warnings:
+# remark #1419: external declaration in primary source file
+# remark #1683: explicit conversion of a 64-bit integral type to a smaller integral type (potential portability problem)
+# remark #1684: conversion from pointer to same-sized integral type (potential portability problem)
+# remark #193: zero used for undefined preprocessing identifier
+# remark #593: variable "curs_sb_left_arrow" was set but never used
+# remark #810: conversion from "int" to "Dimension={unsigned short}" may lose significant bits
+# remark #869: parameter "tw" was never referenced
+# remark #981: operands are evaluated in unspecified order
+# warning #279: controlling expression is constant
+
+ { echo "$as_me:5822: checking for $CC warning options..." >&5
+echo "$as_me: checking for $CC warning options..." >&6;}
+ cf_save_CFLAGS="$CFLAGS"
+ EXTRA_CFLAGS="$EXTRA_CFLAGS -Wall"
+ for cf_opt in \
+ wd1419 \
+ wd1683 \
+ wd1684 \
+ wd193 \
+ wd593 \
+ wd279 \
+ wd810 \
+ wd869 \
+ wd981
+ do
+ CFLAGS="$cf_save_CFLAGS $EXTRA_CFLAGS -$cf_opt"
+ if { (eval echo "$as_me:5838: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:5841: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; then
+ test -n "$verbose" && echo "$as_me:5843: result: ... -$cf_opt" >&5
+echo "${ECHO_T}... -$cf_opt" >&6
+ EXTRA_CFLAGS="$EXTRA_CFLAGS -$cf_opt"
+ fi
+ done
+ CFLAGS="$cf_save_CFLAGS"
+elif test "$GCC" = yes && test "$GCC_VERSION" != "unknown"
+then
+ { echo "$as_me:5851: checking for $CC warning options..." >&5
+echo "$as_me: checking for $CC warning options..." >&6;}
+ cf_save_CFLAGS="$CFLAGS"
+ cf_warn_CONST=""
+ test "$with_ext_const" = yes && cf_warn_CONST="Wwrite-strings"
+ cf_gcc_warnings="Wignored-qualifiers Wlogical-op Wvarargs"
+ test "x$CLANG_COMPILER" = xyes && cf_gcc_warnings=
+ for cf_opt in W Wall \
+ Wbad-function-cast \
+ Wcast-align \
+ Wcast-qual \
+ Wdeclaration-after-statement \
+ Wextra \
+ Winline \
+ Wmissing-declarations \
+ Wmissing-prototypes \
+ Wnested-externs \
+ Wpointer-arith \
+ Wshadow \
+ Wstrict-prototypes \
+ Wundef Wno-inline $cf_gcc_warnings $cf_warn_CONST
+ do
+ CFLAGS="$cf_save_CFLAGS $EXTRA_CFLAGS -$cf_opt"
+ if { (eval echo "$as_me:5874: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:5877: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; then
+ test -n "$verbose" && echo "$as_me:5879: result: ... -$cf_opt" >&5
+echo "${ECHO_T}... -$cf_opt" >&6
+ case "$cf_opt" in
+ (Winline)
+ case "$GCC_VERSION" in
+ ([34].*)
+ test -n "$verbose" && echo " feature is broken in gcc $GCC_VERSION" 1>&6
+
+echo "${as_me:-configure}:5887: testing feature is broken in gcc $GCC_VERSION ..." 1>&5
+
+ continue;;
+ esac
+ ;;
+ (Wpointer-arith)
+ case "$GCC_VERSION" in
+ ([12].*)
+ test -n "$verbose" && echo " feature is broken in gcc $GCC_VERSION" 1>&6
+
+echo "${as_me:-configure}:5897: testing feature is broken in gcc $GCC_VERSION ..." 1>&5
+
+ continue;;
+ esac
+ ;;
+ esac
+ EXTRA_CFLAGS="$EXTRA_CFLAGS -$cf_opt"
+ fi
+ done
+ CFLAGS="$cf_save_CFLAGS"
+fi
+rm -rf ./conftest*
+
+fi
+
+fi
+
+echo "$as_me:5914: checking if you want to use dbmalloc for testing" >&5
+echo $ECHO_N "checking if you want to use dbmalloc for testing... $ECHO_C" >&6
+
+# Check whether --with-dbmalloc or --without-dbmalloc was given.
+if test "${with_dbmalloc+set}" = set; then
+ withval="$with_dbmalloc"
+ case "x$withval" in
+ (x|xno) ;;
+ (*)
+ : "${with_cflags:=-g}"
+ : "${enable_leaks:=no}"
+ with_dbmalloc=yes
+
+cat >>confdefs.h <<EOF
+#define USE_DBMALLOC 1
+EOF
+
+ ;;
+ esac
+else
+ with_dbmalloc=
+fi;
+echo "$as_me:5936: result: ${with_dbmalloc:-no}" >&5
+echo "${ECHO_T}${with_dbmalloc:-no}" >&6
+
+case ".$with_cflags" in
+(.*-g*)
+ case .$CFLAGS in
+ (.*-g*)
+ ;;
+ (*)
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in -g
+do
+case "$cf_fix_cppflags" in
+(no)
+ case "$cf_add_cflags" in
+ (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=yes
+
+ if test "$cf_fix_cppflags" = yes ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ elif test "${cf_tst_cflags}" = "\"'" ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ fi
+ ;;
+ esac
+ case "$CPPFLAGS" in
+ (*$cf_add_cflags)
+ ;;
+ (*)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+ sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \
+ -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'`
+
+ ;;
+ esac
+
+ test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+ cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+ (*)
+
+ test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+ cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+(yes)
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=no
+ ;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+ test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+ CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+ test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+ EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+ ;;
+ esac
+ ;;
+esac
+
+if test "$with_dbmalloc" = yes ; then
+ echo "$as_me:6050: checking for dbmalloc.h" >&5
+echo $ECHO_N "checking for dbmalloc.h... $ECHO_C" >&6
+if test "${ac_cv_header_dbmalloc_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 6056 "configure"
+#include "confdefs.h"
+#include <dbmalloc.h>
+_ACEOF
+if { (eval echo "$as_me:6060: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+ (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ $EGREP -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:6066: \$? = $ac_status" >&5
+ (exit "$ac_status"); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_cv_header_dbmalloc_h=yes
+else
+ echo "$as_me: failed program was:" >&5
+ cat "conftest.$ac_ext" >&5
+ ac_cv_header_dbmalloc_h=no
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi
+echo "$as_me:6085: result: $ac_cv_header_dbmalloc_h" >&5
+echo "${ECHO_T}$ac_cv_header_dbmalloc_h" >&6
+if test "$ac_cv_header_dbmalloc_h" = yes; then
+
+echo "$as_me:6089: checking for debug_malloc in -ldbmalloc" >&5
+echo $ECHO_N "checking for debug_malloc in -ldbmalloc... $ECHO_C" >&6
+if test "${ac_cv_lib_dbmalloc_debug_malloc+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldbmalloc $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 6097 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char debug_malloc ();
+int
+main (void)
+{
+debug_malloc ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:6116: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:6119: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:6122: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:6125: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_lib_dbmalloc_debug_malloc=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_dbmalloc_debug_malloc=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:6136: result: $ac_cv_lib_dbmalloc_debug_malloc" >&5
+echo "${ECHO_T}$ac_cv_lib_dbmalloc_debug_malloc" >&6
+if test "$ac_cv_lib_dbmalloc_debug_malloc" = yes; then
+ cat >>confdefs.h <<EOF
+#define HAVE_LIBDBMALLOC 1
+EOF
+
+ LIBS="-ldbmalloc $LIBS"
+
+fi
+
+fi
+
+fi
+
+echo "$as_me:6151: checking if you want to use dmalloc for testing" >&5
+echo $ECHO_N "checking if you want to use dmalloc for testing... $ECHO_C" >&6
+
+# Check whether --with-dmalloc or --without-dmalloc was given.
+if test "${with_dmalloc+set}" = set; then
+ withval="$with_dmalloc"
+ case "x$withval" in
+ (x|xno) ;;
+ (*)
+ : "${with_cflags:=-g}"
+ : "${enable_leaks:=no}"
+ with_dmalloc=yes
+
+cat >>confdefs.h <<EOF
+#define USE_DMALLOC 1
+EOF
+
+ ;;
+ esac
+else
+ with_dmalloc=
+fi;
+echo "$as_me:6173: result: ${with_dmalloc:-no}" >&5
+echo "${ECHO_T}${with_dmalloc:-no}" >&6
+
+case ".$with_cflags" in
+(.*-g*)
+ case .$CFLAGS in
+ (.*-g*)
+ ;;
+ (*)
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in -g
+do
+case "$cf_fix_cppflags" in
+(no)
+ case "$cf_add_cflags" in
+ (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=yes
+
+ if test "$cf_fix_cppflags" = yes ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ elif test "${cf_tst_cflags}" = "\"'" ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ fi
+ ;;
+ esac
+ case "$CPPFLAGS" in
+ (*$cf_add_cflags)
+ ;;
+ (*)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+ sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \
+ -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'`
+
+ ;;
+ esac
+
+ test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+ cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+ (*)
+
+ test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+ cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+(yes)
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=no
+ ;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+ test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+ CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+ test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+ EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+ ;;
+ esac
+ ;;
+esac
+
+if test "$with_dmalloc" = yes ; then
+ echo "$as_me:6287: checking for dmalloc.h" >&5
+echo $ECHO_N "checking for dmalloc.h... $ECHO_C" >&6
+if test "${ac_cv_header_dmalloc_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 6293 "configure"
+#include "confdefs.h"
+#include <dmalloc.h>
+_ACEOF
+if { (eval echo "$as_me:6297: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+ (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ $EGREP -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:6303: \$? = $ac_status" >&5
+ (exit "$ac_status"); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_cv_header_dmalloc_h=yes
+else
+ echo "$as_me: failed program was:" >&5
+ cat "conftest.$ac_ext" >&5
+ ac_cv_header_dmalloc_h=no
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi
+echo "$as_me:6322: result: $ac_cv_header_dmalloc_h" >&5
+echo "${ECHO_T}$ac_cv_header_dmalloc_h" >&6
+if test "$ac_cv_header_dmalloc_h" = yes; then
+
+echo "$as_me:6326: checking for dmalloc_debug in -ldmalloc" >&5
+echo $ECHO_N "checking for dmalloc_debug in -ldmalloc... $ECHO_C" >&6
+if test "${ac_cv_lib_dmalloc_dmalloc_debug+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldmalloc $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 6334 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char dmalloc_debug ();
+int
+main (void)
+{
+dmalloc_debug ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:6353: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:6356: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:6359: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:6362: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_lib_dmalloc_dmalloc_debug=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_dmalloc_dmalloc_debug=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:6373: result: $ac_cv_lib_dmalloc_dmalloc_debug" >&5
+echo "${ECHO_T}$ac_cv_lib_dmalloc_dmalloc_debug" >&6
+if test "$ac_cv_lib_dmalloc_dmalloc_debug" = yes; then
+ cat >>confdefs.h <<EOF
+#define HAVE_LIBDMALLOC 1
+EOF
+
+ LIBS="-ldmalloc $LIBS"
+
+fi
+
+fi
+
+fi
+
+cat >>confdefs.h <<\EOF
+#define UNIX 1
+EOF
+
+TRY_CFLAGS=
+case "$host_os" in
+(aix4*)
+ TRY_CFLAGS="$TRY_CFLAGS -DAIX4 -D_BSD=44 -D_AIX"
+ LIBS="$LIBS -lbsd"
+ ;;
+(aix*)
+ TRY_CFLAGS="$TRY_CFLAGS -D_ACS_COMPAT_CODE"
+ LIBS="$LIBS -lbsd"
+ ;;
+(apollo*)
+ TRY_CFLAGS="$TRY_CFLAGS -D_BUILTINS -W0,-opt,4"
+ ;;
+(bsdi*)
+ TRY_CFLAGS="$TRY_CFLAGS -DBSDI"
+ ;;
+(clix*)
+ # Tested on CLIX 3.1 (T.Dickey). The original makefile entry
+ # contributed by Alex Matulich (matuli_a@marlin.navsea.navy.mil) also
+ # references -lmalloc and -lbsd.
+
+echo "$as_me:6413: checking for strcmp in -lc_s" >&5
+echo $ECHO_N "checking for strcmp in -lc_s... $ECHO_C" >&6
+if test "${ac_cv_lib_c_s_strcmp+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lc_s $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 6421 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char strcmp ();
+int
+main (void)
+{
+strcmp ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:6440: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:6443: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:6446: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:6449: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_lib_c_s_strcmp=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_c_s_strcmp=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:6460: result: $ac_cv_lib_c_s_strcmp" >&5
+echo "${ECHO_T}$ac_cv_lib_c_s_strcmp" >&6
+if test "$ac_cv_lib_c_s_strcmp" = yes; then
+ cat >>confdefs.h <<EOF
+#define HAVE_LIBC_S 1
+EOF
+
+ LIBS="-lc_s $LIBS"
+
+fi
+
+ ;;
+(convex*)
+ TRY_CFLAGS="$TRY_CFLAGS -D__STDC__ -Dunix"
+ ;;
+(cygwin*)
+ TRY_CFLAGS="$TRY_CFLAGS -DWIN_EX -D_WINDOWS_NSL"
+ LIBS="$LIBS -luser32"
+ ;;
+(hpux*)
+ TRY_CFLAGS="$TRY_CFLAGS -D_XOPEN_SOURCE_EXTENDED"
+ test -z "$GCC" && TRY_CFLAGS="$TRY_CFLAGS -Wp,-H600000 -DSYS_HPUX"
+ ;;
+(isc*)
+ # -DPOSIX_JC is necessary, else LYBookmark.c never finds out what a mode_t is.
+ TRY_CFLAGS="$TRY_CFLAGS -DISC -DPOSIX_JC"
+ LIBS="$LIBS -linet -lnsl_s -lcposix"
+ ;;
+(irix6.*)
+ TRY_CFLAGS="$TRY_CFLAGS -DSYS_IRIX64"
+ ;;
+(irix*)
+ # The original makefile used the $CFLAGS option -cckr for some form
+ # of K&R compatibility. However, this causes compilation warnings for
+ # varargs on IRIX 5.2, and does not appear to be needed.
+ ;;
+(linux*)
+ TRY_CFLAGS="$TRY_CFLAGS -DLINUX"
+ ;;
+(mingw*)
+ # put these directly in CPPFLAGS since they will not work in lynx_cfg.h
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in \
+ -DDOSPATH \
+ -DNOSIGHUP \
+ -DNOUSERS \
+ -DWIN32_LEAN_AND_MEAN \
+ -DWIN_EX \
+ -D_CONSOLE \
+ -D_GNU_SOURCE \
+ -D_MBCS \
+ -D_WINDOWS \
+ -D_WIN_CC \
+ -D__WIN32__ \
+
+do
+case "$cf_fix_cppflags" in
+(no)
+ case "$cf_add_cflags" in
+ (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=yes
+
+ if test "$cf_fix_cppflags" = yes ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ elif test "${cf_tst_cflags}" = "\"'" ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ fi
+ ;;
+ esac
+ case "$CPPFLAGS" in
+ (*$cf_add_cflags)
+ ;;
+ (*)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+ sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \
+ -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'`
+
+ ;;
+ esac
+
+ test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+ cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+ (*)
+
+ test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+ cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+(yes)
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=no
+ ;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+ test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+ CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+ test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+ EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+ EXTRA_OBJS="$EXTRA_OBJS Xsystem\$o"
+ ;;
+(msdosdjgpp*)
+ LIBS="$LIBS -lwatt"
+ TRY_CFLAGS="$TRY_CFLAGS -DDOSPATH -DNOUSERS"
+ ;;
+(next*)
+ TRY_CFLAGS="$TRY_CFLAGS -DNEXT"
+ ;;
+(osf4*)
+ # The -Olimit flag (see below) is no longer available with
+ # Digital C 5.2, which is bundled with Digital UNIX 4.0.
+ TRY_CFLAGS="$TRY_CFLAGS -DDSYS5 -DSYS_TRU64"
+ ;;
+(osf*)
+ # Increase the maximum size of functions that will be optimized.
+ test -z "$GCC" && TRY_CFLAGS="$TRY_CFLAGS -O -Olimit 4000"
+ TRY_CFLAGS="$TRY_CFLAGS -DDSYS5 -DSYS_TRU64"
+ ;;
+(sco3.2v5*)
+ test "$ac_cv_c_compiler_gnu" != yes && TRY_CFLAGS="$TRY_CFLAGS -belf"
+ ;;
+(sco*)
+ LIBS="$LIBS -lmalloc"
+ # It's a little late to do much, but try to warn user if he's using
+ # SCO's cc (which is reported to have broken const/volatile).
+ case "$CC" in
+ (cc|*/cc)
+ { echo "$as_me:6640: WARNING: You should consider using gcc or rcc if available" >&5
+echo "$as_me: WARNING: You should consider using gcc or rcc if available" >&2;}
+ unset ac_cv_prog_CC
+ for ac_prog in gcc rcc
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:6647: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_CC="$ac_prog"
+echo "$as_me:6662: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:6670: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:6673: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$CC" && break
+done
+test -n "$CC" || CC="$CC"
+
+ ;;
+ esac
+ ;;
+(sequent-ptx)
+ TRY_CFLAGS="$TRY_CFLAGS -DSVR4_BSDSELECT -DNO_IOCTL -DUSE_FCNTL"
+ ;;
+(sequent-ptx2)
+ TRY_CFLAGS="$TRY_CFLAGS -DSVR4_BSDSELECT"
+ ;;
+(sony-newsos*)
+ TRY_CFLAGS="$TRY_CFLAGS -I/usr/sony/include"
+
+for ac_header in jcurses.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:6696: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 6702 "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:6706: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+ (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ $EGREP -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:6712: \$? = $ac_status" >&5
+ (exit "$ac_status"); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ eval "$as_ac_Header=yes"
+else
+ echo "$as_me: failed program was:" >&5
+ cat "conftest.$ac_ext" >&5
+ eval "$as_ac_Header=no"
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi
+echo "$as_me:6731: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
+if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
+ cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+ ;;
+(svr4)
+ TRY_CFLAGS="$TRY_CFLAGS -DSVR4_BSDSELECT -DSVR4"
+ ;;
+(sunos3*)
+ TRY_CFLAGS="$TRY_CFLAGS -DSUN"
+ ;;
+(sunos4*)
+ TRY_CFLAGS="$TRY_CFLAGS -DSUN -DSUN4"
+ ;;
+(ultrix*)
+ # Increase the maximum size of functions that will be optimized.
+ test -z "$GCC" && TRY_CFLAGS="$TRY_CFLAGS -O -Olimit 600 -G 7"
+ TRY_CFLAGS="$TRY_CFLAGS -DULTRIX"
+
+for ac_header in cursesX.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:6759: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 6765 "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:6769: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+ (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ $EGREP -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:6775: \$? = $ac_status" >&5
+ (exit "$ac_status"); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ eval "$as_ac_Header=yes"
+else
+ echo "$as_me: failed program was:" >&5
+ cat "conftest.$ac_ext" >&5
+ eval "$as_ac_Header=no"
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi
+echo "$as_me:6794: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
+if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
+ cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+EOF
+
+cat >>confdefs.h <<\EOF
+#define HAVE_CURSESX_H 1
+EOF
+
+ cf_cv_ncurses_header=cursesX.h
+fi
+done
+
+ ;;
+esac
+
+case "$host_os" in
+(mingw*)
+ EXTRA_OBJS="$EXTRA_OBJS LYIcon\$o"
+ ;;
+esac
+
+# This should have been defined by AC_PROG_CC
+: "${CC:=cc}"
+
+echo "$as_me:6821: checking \$CFLAGS variable" >&5
+echo $ECHO_N "checking \$CFLAGS variable... $ECHO_C" >&6
+case "x$CFLAGS" in
+(*-[IUD]*)
+ echo "$as_me:6825: result: broken" >&5
+echo "${ECHO_T}broken" >&6
+ { echo "$as_me:6827: WARNING: your environment uses the CFLAGS variable to hold CPPFLAGS options" >&5
+echo "$as_me: WARNING: your environment uses the CFLAGS variable to hold CPPFLAGS options" >&2;}
+ cf_flags="$CFLAGS"
+ CFLAGS=
+ for cf_arg in $cf_flags
+ do
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_arg
+do
+case "$cf_fix_cppflags" in
+(no)
+ case "$cf_add_cflags" in
+ (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=yes
+
+ if test "$cf_fix_cppflags" = yes ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ elif test "${cf_tst_cflags}" = "\"'" ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ fi
+ ;;
+ esac
+ case "$CPPFLAGS" in
+ (*$cf_add_cflags)
+ ;;
+ (*)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+ sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \
+ -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'`
+
+ ;;
+ esac
+
+ test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+ cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+ (*)
+
+ test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+ cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+(yes)
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=no
+ ;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+ test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+ CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+ test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+ EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+ done
+ ;;
+(*)
+ echo "$as_me:6935: result: ok" >&5
+echo "${ECHO_T}ok" >&6
+ ;;
+esac
+
+echo "$as_me:6940: checking \$CC variable" >&5
+echo $ECHO_N "checking \$CC variable... $ECHO_C" >&6
+case "$CC" in
+(*[\ \ ]-*)
+ echo "$as_me:6944: result: broken" >&5
+echo "${ECHO_T}broken" >&6
+ { echo "$as_me:6946: WARNING: your environment uses the CC variable to hold CFLAGS/CPPFLAGS options" >&5
+echo "$as_me: WARNING: your environment uses the CC variable to hold CFLAGS/CPPFLAGS options" >&2;}
+ # humor him...
+ cf_prog=`echo "$CC" | sed -e 's/ / /g' -e 's/[ ]* / /g' -e 's/[ ]*[ ]-[^ ].*//'`
+ cf_flags=`echo "$CC" | ${AWK:-awk} -v prog="$cf_prog" '{ printf("%s", substr($0,1+length(prog))); }'`
+ CC="$cf_prog"
+ for cf_arg in $cf_flags
+ do
+ case "x$cf_arg" in
+ (x-[IUDfgOW]*)
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_arg
+do
+case "$cf_fix_cppflags" in
+(no)
+ case "$cf_add_cflags" in
+ (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=yes
+
+ if test "$cf_fix_cppflags" = yes ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ elif test "${cf_tst_cflags}" = "\"'" ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ fi
+ ;;
+ esac
+ case "$CPPFLAGS" in
+ (*$cf_add_cflags)
+ ;;
+ (*)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+ sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \
+ -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'`
+
+ ;;
+ esac
+
+ test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+ cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+ (*)
+
+ test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+ cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+(yes)
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=no
+ ;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+ test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+ CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+ test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+ EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+ ;;
+ (*)
+ CC="$CC $cf_arg"
+ ;;
+ esac
+ done
+ test -n "$verbose" && echo " resulting CC: '$CC'" 1>&6
+
+echo "${as_me:-configure}:7063: testing resulting CC: '$CC' ..." 1>&5
+
+ test -n "$verbose" && echo " resulting CFLAGS: '$CFLAGS'" 1>&6
+
+echo "${as_me:-configure}:7067: testing resulting CFLAGS: '$CFLAGS' ..." 1>&5
+
+ test -n "$verbose" && echo " resulting CPPFLAGS: '$CPPFLAGS'" 1>&6
+
+echo "${as_me:-configure}:7071: testing resulting CPPFLAGS: '$CPPFLAGS' ..." 1>&5
+
+ ;;
+(*)
+ echo "$as_me:7075: result: ok" >&5
+echo "${ECHO_T}ok" >&6
+ ;;
+esac
+
+echo "$as_me:7080: checking for ${CC:-cc} option to accept ANSI C" >&5
+echo $ECHO_N "checking for ${CC:-cc} option to accept ANSI C... $ECHO_C" >&6
+if test "${cf_cv_ansi_cc+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cf_cv_ansi_cc=no
+cf_save_CFLAGS="$CFLAGS"
+cf_save_CPPFLAGS="$CPPFLAGS"
+# Don't try gcc -ansi; that turns off useful extensions and
+# breaks some systems' header files.
+# AIX -qlanglvl=ansi
+# Ultrix and OSF/1 -std1
+# HP-UX -Aa -D_HPUX_SOURCE
+# SVR4 -Xc
+# UnixWare 1.2 (cannot use -Xc, since ANSI/POSIX clashes)
+for cf_arg in "-DCC_HAS_PROTOS" \
+ "" \
+ -qlanglvl=ansi \
+ -std1 \
+ -Ae \
+ "-Aa -D_HPUX_SOURCE" \
+ -Xc
+do
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_arg
+do
+case "$cf_fix_cppflags" in
+(no)
+ case "$cf_add_cflags" in
+ (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=yes
+
+ if test "$cf_fix_cppflags" = yes ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ elif test "${cf_tst_cflags}" = "\"'" ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ fi
+ ;;
+ esac
+ case "$CPPFLAGS" in
+ (*$cf_add_cflags)
+ ;;
+ (*)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+ sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \
+ -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'`
+
+ ;;
+ esac
+
+ test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+ cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+ (*)
+
+ test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+ cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+(yes)
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=no
+ ;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+ test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+ CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+ test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+ EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 7204 "configure"
+#include "confdefs.h"
+
+#ifndef CC_HAS_PROTOS
+#if !defined(__STDC__) || (__STDC__ != 1)
+choke me
+#endif
+#endif
+
+int
+main (void)
+{
+
+ int test (int i, double x);
+ struct s1 {int (*f) (int a);};
+ struct s2 {int (*f) (double a);};
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:7225: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:7228: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:7231: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:7234: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_ansi_cc="$cf_arg"; break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+done
+CFLAGS="$cf_save_CFLAGS"
+CPPFLAGS="$cf_save_CPPFLAGS"
+
+fi
+echo "$as_me:7247: result: $cf_cv_ansi_cc" >&5
+echo "${ECHO_T}$cf_cv_ansi_cc" >&6
+
+if test "$cf_cv_ansi_cc" != "no"; then
+if test ".$cf_cv_ansi_cc" != ".-DCC_HAS_PROTOS"; then
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_cv_ansi_cc
+do
+case "$cf_fix_cppflags" in
+(no)
+ case "$cf_add_cflags" in
+ (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=yes
+
+ if test "$cf_fix_cppflags" = yes ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ elif test "${cf_tst_cflags}" = "\"'" ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ fi
+ ;;
+ esac
+ case "$CPPFLAGS" in
+ (*$cf_add_cflags)
+ ;;
+ (*)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+ sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \
+ -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'`
+
+ ;;
+ esac
+
+ test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+ cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+ (*)
+
+ test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+ cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+(yes)
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=no
+ ;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+ test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+ CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+ test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+ EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+else
+
+cat >>confdefs.h <<\EOF
+#define CC_HAS_PROTOS 1
+EOF
+
+fi
+fi
+
+if test "$cf_cv_ansi_cc" = "no"; then
+ { { echo "$as_me:7361: error: Your compiler does not appear to recognize prototypes.
+You have the following choices:
+ a. adjust your compiler options
+ b. get an up-to-date compiler
+ c. use a wrapper such as unproto" >&5
+echo "$as_me: error: Your compiler does not appear to recognize prototypes.
+You have the following choices:
+ a. adjust your compiler options
+ b. get an up-to-date compiler
+ c. use a wrapper such as unproto" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+# Check whether --enable-largefile or --disable-largefile was given.
+if test "${enable_largefile+set}" = set; then
+ enableval="$enable_largefile"
+
+fi;
+if test "$enable_largefile" != no; then
+
+ echo "$as_me:7381: checking for special C compiler options needed for large files" >&5
+echo $ECHO_N "checking for special C compiler options needed for large files... $ECHO_C" >&6
+if test "${ac_cv_sys_largefile_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_sys_largefile_CC=no
+ if test "$GCC" != yes; then
+ ac_save_CC=$CC
+ while :; do
+ # IRIX 6.2 and later do not support large files by default,
+ # so use the C compiler's -n32 option if that helps.
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 7393 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+ We can't simply define LARGE_OFF_T to be 9223372036854775807,
+ since some C++ compilers masquerading as C compilers
+ incorrectly reject 9223372036854775807. */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+ && LARGE_OFF_T % 2147483647 == 1)
+ ? 1 : -1];
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:7413: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:7416: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:7419: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:7422: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext"
+ CC="$CC -n32"
+ rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:7432: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:7435: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:7438: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:7441: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_sys_largefile_CC=' -n32'; break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext"
+ break
+ done
+ CC=$ac_save_CC
+ rm -f "conftest.$ac_ext"
+ fi
+fi
+echo "$as_me:7455: result: $ac_cv_sys_largefile_CC" >&5
+echo "${ECHO_T}$ac_cv_sys_largefile_CC" >&6
+ if test "$ac_cv_sys_largefile_CC" != no; then
+ CC=$CC$ac_cv_sys_largefile_CC
+ fi
+
+ echo "$as_me:7461: checking for _FILE_OFFSET_BITS value needed for large files" >&5
+echo $ECHO_N "checking for _FILE_OFFSET_BITS value needed for large files... $ECHO_C" >&6
+if test "${ac_cv_sys_file_offset_bits+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ while :; do
+ ac_cv_sys_file_offset_bits=no
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 7469 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+ We can't simply define LARGE_OFF_T to be 9223372036854775807,
+ since some C++ compilers masquerading as C compilers
+ incorrectly reject 9223372036854775807. */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+ && LARGE_OFF_T % 2147483647 == 1)
+ ? 1 : -1];
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:7489: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:7492: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:7495: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:7498: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 7507 "configure"
+#include "confdefs.h"
+#define _FILE_OFFSET_BITS 64
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+ We can't simply define LARGE_OFF_T to be 9223372036854775807,
+ since some C++ compilers masquerading as C compilers
+ incorrectly reject 9223372036854775807. */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+ && LARGE_OFF_T % 2147483647 == 1)
+ ? 1 : -1];
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:7528: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:7531: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:7534: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:7537: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_sys_file_offset_bits=64; break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ break
+done
+fi
+echo "$as_me:7548: result: $ac_cv_sys_file_offset_bits" >&5
+echo "${ECHO_T}$ac_cv_sys_file_offset_bits" >&6
+if test "$ac_cv_sys_file_offset_bits" != no; then
+
+cat >>confdefs.h <<EOF
+#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits
+EOF
+
+fi
+rm -rf conftest*
+ echo "$as_me:7558: checking for _LARGE_FILES value needed for large files" >&5
+echo $ECHO_N "checking for _LARGE_FILES value needed for large files... $ECHO_C" >&6
+if test "${ac_cv_sys_large_files+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ while :; do
+ ac_cv_sys_large_files=no
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 7566 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+ We can't simply define LARGE_OFF_T to be 9223372036854775807,
+ since some C++ compilers masquerading as C compilers
+ incorrectly reject 9223372036854775807. */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+ && LARGE_OFF_T % 2147483647 == 1)
+ ? 1 : -1];
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:7586: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:7589: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:7592: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:7595: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 7604 "configure"
+#include "confdefs.h"
+#define _LARGE_FILES 1
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+ We can't simply define LARGE_OFF_T to be 9223372036854775807,
+ since some C++ compilers masquerading as C compilers
+ incorrectly reject 9223372036854775807. */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+ && LARGE_OFF_T % 2147483647 == 1)
+ ? 1 : -1];
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:7625: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:7628: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:7631: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:7634: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_sys_large_files=1; break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ break
+done
+fi
+echo "$as_me:7645: result: $ac_cv_sys_large_files" >&5
+echo "${ECHO_T}$ac_cv_sys_large_files" >&6
+if test "$ac_cv_sys_large_files" != no; then
+
+cat >>confdefs.h <<EOF
+#define _LARGE_FILES $ac_cv_sys_large_files
+EOF
+
+fi
+rm -rf conftest*
+fi
+
+ if test "$enable_largefile" != no ; then
+ echo "$as_me:7658: checking for _LARGEFILE_SOURCE value needed for large files" >&5
+echo $ECHO_N "checking for _LARGEFILE_SOURCE value needed for large files... $ECHO_C" >&6
+if test "${ac_cv_sys_largefile_source+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ while :; do
+ ac_cv_sys_largefile_source=no
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 7666 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+return !fseeko;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:7678: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:7681: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:7684: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:7687: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 7696 "configure"
+#include "confdefs.h"
+#define _LARGEFILE_SOURCE 1
+#include <stdio.h>
+int
+main (void)
+{
+return !fseeko;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:7709: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:7712: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:7715: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:7718: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_sys_largefile_source=1; break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ break
+done
+fi
+echo "$as_me:7729: result: $ac_cv_sys_largefile_source" >&5
+echo "${ECHO_T}$ac_cv_sys_largefile_source" >&6
+if test "$ac_cv_sys_largefile_source" != no; then
+
+cat >>confdefs.h <<EOF
+#define _LARGEFILE_SOURCE $ac_cv_sys_largefile_source
+EOF
+
+fi
+rm -rf conftest*
+
+# We used to try defining _XOPEN_SOURCE=500 too, to work around a bug
+# in glibc 2.1.3, but that breaks too many other things.
+# If you want fseeko and ftello with glibc, upgrade to a fixed glibc.
+echo "$as_me:7743: checking for fseeko" >&5
+echo $ECHO_N "checking for fseeko... $ECHO_C" >&6
+if test "${ac_cv_func_fseeko+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 7749 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+return fseeko && fseeko (stdin, 0, 0);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:7761: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:7764: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:7767: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:7770: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_func_fseeko=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_fseeko=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:7780: result: $ac_cv_func_fseeko" >&5
+echo "${ECHO_T}$ac_cv_func_fseeko" >&6
+if test $ac_cv_func_fseeko = yes; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_FSEEKO 1
+EOF
+
+fi
+
+ # Normally we would collect these definitions in the config.h,
+ # but (like _XOPEN_SOURCE), some environments rely on having these
+ # defined before any of the system headers are included. Another
+ # case comes up with C++, e.g., on AIX the compiler compiles the
+ # header files by themselves before looking at the body files it is
+ # told to compile. For ncurses, those header files do not include
+ # the config.h
+ if test "$ac_cv_sys_large_files" != no
+ then
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-D_LARGE_FILES"
+
+ fi
+ if test "$ac_cv_sys_largefile_source" != no
+ then
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-D_LARGEFILE_SOURCE"
+
+ fi
+ if test "$ac_cv_sys_file_offset_bits" != no
+ then
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-D_FILE_OFFSET_BITS=$ac_cv_sys_file_offset_bits"
+
+ fi
+
+ echo "$as_me:7819: checking whether to use struct dirent64" >&5
+echo $ECHO_N "checking whether to use struct dirent64... $ECHO_C" >&6
+if test "${cf_cv_struct_dirent64+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 7826 "configure"
+#include "confdefs.h"
+
+#pragma GCC diagnostic error "-Wincompatible-pointer-types"
+#include <sys/types.h>
+#include <dirent.h>
+
+int
+main (void)
+{
+
+ /* if transitional largefile support is setup, this is true */
+ extern struct dirent64 * readdir(DIR *);
+ struct dirent64 *x = readdir((DIR *)0);
+ struct dirent *y = readdir((DIR *)0);
+ int z = x - y;
+ (void)z;
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:7849: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:7852: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:7855: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:7858: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_struct_dirent64=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_struct_dirent64=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:7869: result: $cf_cv_struct_dirent64" >&5
+echo "${ECHO_T}$cf_cv_struct_dirent64" >&6
+ test "$cf_cv_struct_dirent64" = yes &&
+cat >>confdefs.h <<\EOF
+#define HAVE_STRUCT_DIRENT64 1
+EOF
+
+ fi
+
+if test -z "$ALL_LINGUAS" ; then
+ ALL_LINGUAS=`test -d "$srcdir/po" && cd "$srcdir/po" && echo *.po|sed -e 's/\.po//g' -e 's/*//'`
+
+ echo "$as_me:7881: checking for PATH separator" >&5
+echo $ECHO_N "checking for PATH separator... $ECHO_C" >&6
+ case "$cf_cv_system_name" in
+ (os2*) PATH_SEPARATOR=';' ;;
+ (*) ${PATH_SEPARATOR:=':'} ;;
+ esac
+
+ echo "$as_me:7888: result: $PATH_SEPARATOR" >&5
+echo "${ECHO_T}$PATH_SEPARATOR" >&6
+
+# Extract the first word of "msginit", so it can be a program name with args.
+
+set dummy msginit; ac_word=$2
+echo "$as_me:7894: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_MSGINIT+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case "$MSGINIT" in
+ ([\\/]*|?:[\\/]*)
+ ac_cv_path_MSGINIT="$MSGINIT" # Let the user override the test with a path.
+ ;;
+ (*)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_word$ac_exeext" ; then
+ if "$ac_dir/$ac_word" --no-translator --version /dev/null >/dev/null 2>&1; then
+ ac_cv_path_MSGINIT="$ac_dir/$ac_word$ac_exeext"
+ break
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_MSGINIT" && ac_cv_path_MSGINIT=":"
+ ;;
+esac
+fi
+MSGINIT="$ac_cv_path_MSGINIT"
+if test "$MSGINIT" != ":"; then
+ echo "$as_me:7921: result: $MSGINIT" >&5
+echo "${ECHO_T}$MSGINIT" >&6
+else
+ echo "$as_me:7924: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ if test "$MSGINIT" != ":" ; then
+ test -n "$verbose" && echo " adding en.po" 1>&6
+
+echo "${as_me:-configure}:7931: testing adding en.po ..." 1>&5
+
+ ALL_LINGUAS="$ALL_LINGUAS en"
+ fi
+fi
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+echo "$as_me:7940: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_RANLIB+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$RANLIB"; then
+ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+echo "$as_me:7955: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+ echo "$as_me:7963: result: $RANLIB" >&5
+echo "${ECHO_T}$RANLIB" >&6
+else
+ echo "$as_me:7966: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+ ac_ct_RANLIB=$RANLIB
+ # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+echo "$as_me:7975: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_RANLIB"; then
+ ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_ac_ct_RANLIB="ranlib"
+echo "$as_me:7990: found $ac_dir/$ac_word" >&5
+break
+done
+
+ test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":"
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+ echo "$as_me:7999: result: $ac_ct_RANLIB" >&5
+echo "${ECHO_T}$ac_ct_RANLIB" >&6
+else
+ echo "$as_me:8002: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ RANLIB=$ac_ct_RANLIB
+else
+ RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+echo "$as_me:8011: checking for ANSI C header files" >&5
+echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6
+if test "${ac_cv_header_stdc+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 8017 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+_ACEOF
+if { (eval echo "$as_me:8025: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+ (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ $EGREP -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:8031: \$? = $ac_status" >&5
+ (exit "$ac_status"); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_cv_header_stdc=yes
+else
+ echo "$as_me: failed program was:" >&5
+ cat "conftest.$ac_ext" >&5
+ ac_cv_header_stdc=no
+fi
+rm -f conftest.err "conftest.$ac_ext"
+
+if test $ac_cv_header_stdc = yes; then
+ # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 8053 "configure"
+#include "confdefs.h"
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "memchr" >/dev/null 2>&1; then
+ :
+else
+ ac_cv_header_stdc=no
+fi
+rm -rf conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 8071 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "free" >/dev/null 2>&1; then
+ :
+else
+ ac_cv_header_stdc=no
+fi
+rm -rf conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+ if test "$cross_compiling" = yes; then
+ :
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 8092 "configure"
+#include "confdefs.h"
+#include <ctype.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) (('a' <= (c) && (c) <= 'i') \
+ || ('j' <= (c) && (c) <= 'r') \
+ || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main (void)
+{
+ int i;
+ for (i = 0; i < 256; i++)
+ if (XOR (islower (i), ISLOWER (i))
+ || toupper (i) != TOUPPER (i))
+ $ac_main_return(2);
+ $ac_main_return (0);
+}
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:8118: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:8121: \$? = $ac_status" >&5
+ (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+ { (eval echo "$as_me:8123: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:8126: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_header_stdc=no
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+fi
+fi
+echo "$as_me:8139: result: $ac_cv_header_stdc" >&5
+echo "${ECHO_T}$ac_cv_header_stdc" >&6
+if test $ac_cv_header_stdc = yes; then
+
+cat >>confdefs.h <<\EOF
+#define STDC_HEADERS 1
+EOF
+
+fi
+
+echo "$as_me:8149: checking for inline" >&5
+echo $ECHO_N "checking for inline... $ECHO_C" >&6
+if test "${ac_cv_c_inline+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_c_inline=no
+for ac_kw in inline __inline__ __inline; do
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 8157 "configure"
+#include "confdefs.h"
+#ifndef __cplusplus
+static $ac_kw int static_foo () {return 0; }
+$ac_kw int foo () {return 0; }
+#endif
+
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:8166: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:8169: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:8172: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:8175: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_c_inline=$ac_kw; break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+done
+
+fi
+echo "$as_me:8186: result: $ac_cv_c_inline" >&5
+echo "${ECHO_T}$ac_cv_c_inline" >&6
+case $ac_cv_c_inline in
+ inline | yes) ;;
+ no)
+cat >>confdefs.h <<\EOF
+#define inline
+EOF
+ ;;
+ *) cat >>confdefs.h <<EOF
+#define inline $ac_cv_c_inline
+EOF
+ ;;
+esac
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+ inttypes.h stdint.h unistd.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:8207: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 8213 "configure"
+#include "confdefs.h"
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:8219: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:8222: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:8225: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:8228: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ eval "$as_ac_Header=yes"
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+eval "$as_ac_Header=no"
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:8238: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
+if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
+ cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+echo "$as_me:8248: checking for off_t" >&5
+echo $ECHO_N "checking for off_t... $ECHO_C" >&6
+if test "${ac_cv_type_off_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 8254 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+if ((off_t *) 0)
+ return 0;
+if (sizeof (off_t))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:8269: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:8272: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:8275: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:8278: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_type_off_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_type_off_t=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:8288: result: $ac_cv_type_off_t" >&5
+echo "${ECHO_T}$ac_cv_type_off_t" >&6
+if test "$ac_cv_type_off_t" = yes; then
+ :
+else
+
+cat >>confdefs.h <<EOF
+#define off_t long
+EOF
+
+fi
+
+echo "$as_me:8300: checking for size_t" >&5
+echo $ECHO_N "checking for size_t... $ECHO_C" >&6
+if test "${ac_cv_type_size_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 8306 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+if ((size_t *) 0)
+ return 0;
+if (sizeof (size_t))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:8321: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:8324: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:8327: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:8330: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_type_size_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_type_size_t=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:8340: result: $ac_cv_type_size_t" >&5
+echo "${ECHO_T}$ac_cv_type_size_t" >&6
+if test "$ac_cv_type_size_t" = yes; then
+ :
+else
+
+cat >>confdefs.h <<EOF
+#define size_t unsigned
+EOF
+
+fi
+
+# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
+# for constant arguments. Useless!
+echo "$as_me:8354: checking for working alloca.h" >&5
+echo $ECHO_N "checking for working alloca.h... $ECHO_C" >&6
+if test "${ac_cv_working_alloca_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 8360 "configure"
+#include "confdefs.h"
+#include <alloca.h>
+int
+main (void)
+{
+char *p = (char *) alloca (2 * sizeof (int));
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:8372: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:8375: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:8378: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:8381: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_working_alloca_h=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_working_alloca_h=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:8391: result: $ac_cv_working_alloca_h" >&5
+echo "${ECHO_T}$ac_cv_working_alloca_h" >&6
+if test $ac_cv_working_alloca_h = yes; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_ALLOCA_H 1
+EOF
+
+fi
+
+echo "$as_me:8401: checking for alloca" >&5
+echo $ECHO_N "checking for alloca... $ECHO_C" >&6
+if test "${ac_cv_func_alloca_works+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 8407 "configure"
+#include "confdefs.h"
+#ifdef __GNUC__
+# define alloca __builtin_alloca
+#else
+# ifdef _MSC_VER
+# include <malloc.h>
+# define alloca _alloca
+# else
+# if HAVE_ALLOCA_H
+# include <alloca.h>
+# else
+# ifdef _AIX
+ #pragma alloca
+# else
+# ifndef alloca /* predefined by HP cc +Olibcalls */
+char *alloca ();
+# endif
+# endif
+# endif
+# endif
+#endif
+
+int
+main (void)
+{
+char *p = (char *) alloca (1);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:8439: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:8442: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:8445: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:8448: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_func_alloca_works=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_alloca_works=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:8458: result: $ac_cv_func_alloca_works" >&5
+echo "${ECHO_T}$ac_cv_func_alloca_works" >&6
+
+if test $ac_cv_func_alloca_works = yes; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_ALLOCA 1
+EOF
+
+else
+ # The SVR3 libPW and SVR4 libucb both contain incompatible functions
+# that cause trouble. Some versions do not even contain alloca or
+# contain a buggy version. If you still want to use their alloca,
+# use ar to extract alloca.o from them instead of compiling alloca.c.
+
+ALLOCA="alloca.$ac_objext"
+
+cat >>confdefs.h <<\EOF
+#define C_ALLOCA 1
+EOF
+
+echo "$as_me:8479: checking whether \`alloca.c' needs Cray hooks" >&5
+echo $ECHO_N "checking whether \`alloca.c' needs Cray hooks... $ECHO_C" >&6
+if test "${ac_cv_os_cray+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 8485 "configure"
+#include "confdefs.h"
+#if defined(CRAY) && ! defined(CRAY2)
+webecray
+#else
+wenotbecray
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "webecray" >/dev/null 2>&1; then
+ ac_cv_os_cray=yes
+else
+ ac_cv_os_cray=no
+fi
+rm -rf conftest*
+
+fi
+echo "$as_me:8503: result: $ac_cv_os_cray" >&5
+echo "${ECHO_T}$ac_cv_os_cray" >&6
+if test $ac_cv_os_cray = yes; then
+ for ac_func in _getb67 GETB67 getb67; do
+ as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:8508: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 8514 "configure"
+#include "confdefs.h"
+#define $ac_func autoconf_temporary
+#include <limits.h> /* least-intrusive standard header which defines gcc2 __stub macros */
+#undef $ac_func
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+#error found stub for $ac_func
+#endif
+
+ return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:8545: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:8548: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:8551: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:8554: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+eval "$as_ac_var=no"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:8564: result: `eval echo '${'"$as_ac_var"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_var"'}'`" >&6
+if test "`eval echo '${'"$as_ac_var"'}'`" = yes; then
+
+cat >>confdefs.h <<EOF
+#define CRAY_STACKSEG_END $ac_func
+EOF
+
+ break
+fi
+
+ done
+fi
+
+echo "$as_me:8578: checking stack direction for C alloca" >&5
+echo $ECHO_N "checking stack direction for C alloca... $ECHO_C" >&6
+if test "${ac_cv_c_stack_direction+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then
+ ac_cv_c_stack_direction=0
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 8587 "configure"
+#include "confdefs.h"
+int
+find_stack_direction (void)
+{
+ static char *addr = 0;
+ auto char dummy;
+ if (addr == 0)
+ {
+ addr = &dummy;
+ return find_stack_direction ();
+ }
+ else
+ return (&dummy > addr) ? 1 : -1;
+}
+
+int
+main (void)
+{
+ $ac_main_return (find_stack_direction () < 0);
+}
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:8610: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:8613: \$? = $ac_status" >&5
+ (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+ { (eval echo "$as_me:8615: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:8618: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_c_stack_direction=1
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_c_stack_direction=-1
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+fi
+echo "$as_me:8630: result: $ac_cv_c_stack_direction" >&5
+echo "${ECHO_T}$ac_cv_c_stack_direction" >&6
+
+cat >>confdefs.h <<EOF
+#define STACK_DIRECTION $ac_cv_c_stack_direction
+EOF
+
+fi
+
+for ac_header in stdlib.h unistd.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:8642: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 8648 "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:8652: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+ (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ $EGREP -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:8658: \$? = $ac_status" >&5
+ (exit "$ac_status"); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ eval "$as_ac_Header=yes"
+else
+ echo "$as_me: failed program was:" >&5
+ cat "conftest.$ac_ext" >&5
+ eval "$as_ac_Header=no"
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi
+echo "$as_me:8677: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
+if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
+ cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+for ac_func in getpagesize
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:8690: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 8696 "configure"
+#include "confdefs.h"
+#define $ac_func autoconf_temporary
+#include <limits.h> /* least-intrusive standard header which defines gcc2 __stub macros */
+#undef $ac_func
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+#error found stub for $ac_func
+#endif
+
+ return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:8727: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:8730: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:8733: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:8736: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+eval "$as_ac_var=no"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:8746: result: `eval echo '${'"$as_ac_var"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_var"'}'`" >&6
+if test "`eval echo '${'"$as_ac_var"'}'`" = yes; then
+ cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+echo "$as_me:8756: checking for working mmap" >&5
+echo $ECHO_N "checking for working mmap... $ECHO_C" >&6
+if test "${ac_cv_func_mmap_fixed_mapped+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then
+ ac_cv_func_mmap_fixed_mapped=no
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 8765 "configure"
+#include "confdefs.h"
+$ac_includes_default
+/* Thanks to Mike Haertel and Jim Avera for this test.
+ Here is a matrix of mmap possibilities:
+ mmap private not fixed
+ mmap private fixed at somewhere currently unmapped
+ mmap private fixed at somewhere already mapped
+ mmap shared not fixed
+ mmap shared fixed at somewhere currently unmapped
+ mmap shared fixed at somewhere already mapped
+ For private mappings, we should verify that changes cannot be read()
+ back from the file, nor mmap's back from the file at a different
+ address. (There have been systems where private was not correctly
+ implemented like the infamous i386 svr4.0, and systems where the
+ VM page cache was not coherent with the file system buffer cache
+ like early versions of FreeBSD and possibly contemporary NetBSD.)
+ For shared mappings, we should conversely verify that changes get
+ propogated back to all the places they're supposed to be.
+
+ Grep wants private fixed already mapped.
+ The main things grep needs to know about mmap are:
+ * does it exist and is it safe to write into the mmap'd area
+ * how to use it (BSD variants) */
+
+#include <fcntl.h>
+#include <sys/mman.h>
+
+#if !STDC_HEADERS && !HAVE_STDLIB_H
+char *malloc ();
+#endif
+
+/* This mess was copied from the GNU getpagesize.h. */
+#if !HAVE_GETPAGESIZE
+/* Assume that all systems that can run configure have sys/param.h. */
+# if !HAVE_SYS_PARAM_H
+# define HAVE_SYS_PARAM_H 1
+# endif
+
+# ifdef _SC_PAGESIZE
+# define getpagesize() sysconf(_SC_PAGESIZE)
+# else /* no _SC_PAGESIZE */
+# if HAVE_SYS_PARAM_H
+# include <sys/param.h>
+# ifdef EXEC_PAGESIZE
+# define getpagesize() EXEC_PAGESIZE
+# else /* no EXEC_PAGESIZE */
+# ifdef NBPG
+# define getpagesize() NBPG * CLSIZE
+# ifndef CLSIZE
+# define CLSIZE 1
+# endif /* no CLSIZE */
+# else /* no NBPG */
+# ifdef NBPC
+# define getpagesize() NBPC
+# else /* no NBPC */
+# ifdef PAGESIZE
+# define getpagesize() PAGESIZE
+# endif /* PAGESIZE */
+# endif /* no NBPC */
+# endif /* no NBPG */
+# endif /* no EXEC_PAGESIZE */
+# else /* no HAVE_SYS_PARAM_H */
+# define getpagesize() 8192 /* punt totally */
+# endif /* no HAVE_SYS_PARAM_H */
+# endif /* no _SC_PAGESIZE */
+
+#endif /* no HAVE_GETPAGESIZE */
+
+int
+main (void)
+{
+ char *data, *data2, *data3;
+ int i, pagesize;
+ int fd;
+
+ pagesize = getpagesize ();
+
+ /* First, make a file with some known garbage in it. */
+ data = (char *) malloc (pagesize);
+ if (!data)
+ $ac_main_return (1);
+ for (i = 0; i < pagesize; ++i)
+ *(data + i) = rand ();
+ umask (0);
+ fd = creat ("conftest.mmap", 0600);
+ if (fd < 0)
+ $ac_main_return (1);
+ if (write (fd, data, pagesize) != pagesize)
+ $ac_main_return (1);
+ close (fd);
+
+ /* Next, try to mmap the file at a fixed address which already has
+ something else allocated at it. If we can, also make sure that
+ we see the same garbage. */
+ fd = open ("conftest.mmap", O_RDWR);
+ if (fd < 0)
+ $ac_main_return (1);
+ data2 = (char *) malloc (2 * pagesize);
+ if (!data2)
+ $ac_main_return (1);
+ data2 += (pagesize - ((int) data2 & (pagesize - 1))) & (pagesize - 1);
+ if (data2 != mmap (data2, pagesize, PROT_READ | PROT_WRITE,
+ MAP_PRIVATE | MAP_FIXED, fd, 0L))
+ $ac_main_return (1);
+ for (i = 0; i < pagesize; ++i)
+ if (*(data + i) != *(data2 + i))
+ $ac_main_return (1);
+
+ /* Finally, make sure that changes to the mapped area do not
+ percolate back to the file as seen by read(). (This is a bug on
+ some variants of i386 svr4.0.) */
+ for (i = 0; i < pagesize; ++i)
+ *(data2 + i) = *(data2 + i) + 1;
+ data3 = (char *) malloc (pagesize);
+ if (!data3)
+ $ac_main_return (1);
+ if (read (fd, data3, pagesize) != pagesize)
+ $ac_main_return (1);
+ for (i = 0; i < pagesize; ++i)
+ if (*(data + i) != *(data3 + i))
+ $ac_main_return (1);
+ close (fd);
+ $ac_main_return (0);
+}
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:8892: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:8895: \$? = $ac_status" >&5
+ (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+ { (eval echo "$as_me:8897: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:8900: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_func_mmap_fixed_mapped=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_mmap_fixed_mapped=no
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+fi
+echo "$as_me:8912: result: $ac_cv_func_mmap_fixed_mapped" >&5
+echo "${ECHO_T}$ac_cv_func_mmap_fixed_mapped" >&6
+if test $ac_cv_func_mmap_fixed_mapped = yes; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_MMAP 1
+EOF
+
+fi
+rm -f conftest.mmap
+
+echo "$as_me:8923: checking whether we are using the GNU C Library 2.1 or newer" >&5
+echo $ECHO_N "checking whether we are using the GNU C Library 2.1 or newer... $ECHO_C" >&6
+if test "${ac_cv_gnu_library_2_1+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 8929 "configure"
+#include "confdefs.h"
+
+#include <features.h>
+#ifdef __GNU_LIBRARY__
+ #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2)
+ Lucky GNU user
+ #endif
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "Lucky GNU user" >/dev/null 2>&1; then
+ ac_cv_gnu_library_2_1=yes
+else
+ ac_cv_gnu_library_2_1=no
+fi
+rm -rf conftest*
+
+fi
+echo "$as_me:8949: result: $ac_cv_gnu_library_2_1" >&5
+echo "${ECHO_T}$ac_cv_gnu_library_2_1" >&6
+
+ GLIBC21="$ac_cv_gnu_library_2_1"
+
+cf_makefile=makefile
+
+test -z "$ALL_LINGUAS" && ALL_LINGUAS=`test -d "$srcdir/po" && cd "$srcdir/po" && echo *.po|sed -e 's/\.po//g' -e 's/*//'`
+
+# Allow override of "config.h" definition:
+: ${CONFIG_H:=config.h}
+
+if test -z "$PACKAGE" ; then
+ { { echo "$as_me:8962: error: CF_BUNDLED_INTL used without setting PACKAGE variable" >&5
+echo "$as_me: error: CF_BUNDLED_INTL used without setting PACKAGE variable" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+if test -z "$VERSION" ; then
+if test -f "$srcdir/VERSION" ; then
+ VERSION=`sed -e '2,$d' "$srcdir/VERSION" |cut -f1`
+else
+ VERSION=unknown
+fi
+fi
+
+for ac_header in argz.h limits.h locale.h nl_types.h malloc.h stddef.h \
+stdlib.h string.h unistd.h sys/param.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:8979: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 8985 "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:8989: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+ (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ $EGREP -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:8995: \$? = $ac_status" >&5
+ (exit "$ac_status"); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ eval "$as_ac_Header=yes"
+else
+ echo "$as_me: failed program was:" >&5
+ cat "conftest.$ac_ext" >&5
+ eval "$as_ac_Header=no"
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi
+echo "$as_me:9014: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
+if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
+ cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+for ac_func in feof_unlocked fgets_unlocked getcwd getegid geteuid \
+getgid getuid mempcpy munmap putenv setenv setlocale stpcpy strchr strcasecmp \
+strdup strtoul tsearch __argz_count __argz_stringify __argz_next
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:9029: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 9035 "configure"
+#include "confdefs.h"
+#define $ac_func autoconf_temporary
+#include <limits.h> /* least-intrusive standard header which defines gcc2 __stub macros */
+#undef $ac_func
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+#error found stub for $ac_func
+#endif
+
+ return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:9066: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:9069: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:9072: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:9075: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+eval "$as_ac_var=no"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:9085: result: `eval echo '${'"$as_ac_var"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_var"'}'`" >&6
+if test "`eval echo '${'"$as_ac_var"'}'`" = yes; then
+ cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+# Check whether --with-libiconv-prefix or --without-libiconv-prefix was given.
+if test "${with_libiconv_prefix+set}" = set; then
+ withval="$with_libiconv_prefix"
+
+case "$withval" in
+(no)
+ ;;
+(yes)
+ ;;
+(*)
+
+for cf_searchpath in `echo "$withval" | tr $PATH_SEPARATOR ' '`; do
+ if test -d "$cf_searchpath/include" ; then
+
+if test -n "$cf_searchpath/include" ; then
+ for cf_add_incdir in $cf_searchpath/include
+ do
+ while test "$cf_add_incdir" != /usr/include
+ do
+ if test -d "$cf_add_incdir"
+ then
+ cf_have_incdir=no
+ if test -n "$CFLAGS$CPPFLAGS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+ if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+ cf_have_incdir=yes; break
+ fi
+ done
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ if test "$cf_add_incdir" = /usr/local/include ; then
+ if test "$GCC" = yes
+ then
+ cf_save_CPPFLAGS=$CPPFLAGS
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 9136 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:9148: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:9151: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:9154: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:9157: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ CPPFLAGS=$cf_save_CPPFLAGS
+ fi
+ fi
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:9174: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+ CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+ cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+ test "$cf_top_incdir" = "$cf_add_incdir" && break
+ cf_add_incdir="$cf_top_incdir"
+ else
+ break
+ fi
+ else
+ break
+ fi
+ done
+ done
+fi
+
+ elif test -d "$cf_searchpath/../include" ; then
+
+if test -n "$cf_searchpath/../include" ; then
+ for cf_add_incdir in $cf_searchpath/../include
+ do
+ while test "$cf_add_incdir" != /usr/include
+ do
+ if test -d "$cf_add_incdir"
+ then
+ cf_have_incdir=no
+ if test -n "$CFLAGS$CPPFLAGS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+ if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+ cf_have_incdir=yes; break
+ fi
+ done
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ if test "$cf_add_incdir" = /usr/local/include ; then
+ if test "$GCC" = yes
+ then
+ cf_save_CPPFLAGS=$CPPFLAGS
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 9220 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:9232: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:9235: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:9238: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:9241: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ CPPFLAGS=$cf_save_CPPFLAGS
+ fi
+ fi
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:9258: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+ CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+ cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+ test "$cf_top_incdir" = "$cf_add_incdir" && break
+ cf_add_incdir="$cf_top_incdir"
+ else
+ break
+ fi
+ else
+ break
+ fi
+ done
+ done
+fi
+
+ else
+{ { echo "$as_me:9276: error: cannot find libiconv under $withval" >&5
+echo "$as_me: error: cannot find libiconv under $withval" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+ if test -d "$cf_searchpath/lib" ; then
+
+if test -n "$cf_searchpath/lib" ; then
+ for cf_add_libdir in $cf_searchpath/lib
+ do
+ if test "$cf_add_libdir" = /usr/lib ; then
+ :
+ elif test -d "$cf_add_libdir"
+ then
+ cf_have_libdir=no
+ if test -n "$LDFLAGS$LIBS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_libdir in $LDFLAGS $LIBS ; do
+ if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
+ cf_have_libdir=yes; break
+ fi
+ done
+ fi
+ if test "$cf_have_libdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
+
+echo "${as_me:-configure}:9301: testing adding $cf_add_libdir to library-path ..." 1>&5
+
+ LDFLAGS="-L$cf_add_libdir $LDFLAGS"
+ fi
+ fi
+ done
+fi
+
+ elif test -d "$cf_searchpath" ; then
+
+if test -n "$cf_searchpath" ; then
+ for cf_add_libdir in $cf_searchpath
+ do
+ if test "$cf_add_libdir" = /usr/lib ; then
+ :
+ elif test -d "$cf_add_libdir"
+ then
+ cf_have_libdir=no
+ if test -n "$LDFLAGS$LIBS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_libdir in $LDFLAGS $LIBS ; do
+ if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
+ cf_have_libdir=yes; break
+ fi
+ done
+ fi
+ if test "$cf_have_libdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
+
+echo "${as_me:-configure}:9330: testing adding $cf_add_libdir to library-path ..." 1>&5
+
+ LDFLAGS="-L$cf_add_libdir $LDFLAGS"
+ fi
+ fi
+ done
+fi
+
+ else
+{ { echo "$as_me:9339: error: cannot find libiconv under $withval" >&5
+echo "$as_me: error: cannot find libiconv under $withval" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+done
+
+ ;;
+esac
+
+fi;
+
+ echo "$as_me:9350: checking for iconv" >&5
+echo $ECHO_N "checking for iconv... $ECHO_C" >&6
+if test "${am_cv_func_iconv+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+# If the linkage is not already in the $CPPFLAGS/$LDFLAGS configuration, these
+# will be set on completion of the AC_TRY_LINK below.
+cf_cv_header_path_iconv=
+cf_cv_library_path_iconv=
+
+echo "${as_me:-configure}:9361: testing Starting FIND_LINKAGE(iconv,) ..." 1>&5
+
+cf_save_LIBS="$LIBS"
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 9366 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <iconv.h>
+
+int
+main (void)
+{
+
+ iconv_t cd = iconv_open("","");
+ iconv(cd,NULL,NULL,NULL,NULL);
+ iconv_close(cd);
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:9385: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:9388: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:9391: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:9394: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ cf_cv_find_linkage_iconv=yes
+ cf_cv_header_path_iconv=/usr/include
+ cf_cv_library_path_iconv=/usr/lib
+
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+LIBS="-liconv $cf_save_LIBS"
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 9408 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <iconv.h>
+
+int
+main (void)
+{
+
+ iconv_t cd = iconv_open("","");
+ iconv(cd,NULL,NULL,NULL,NULL);
+ iconv_close(cd);
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:9427: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:9430: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:9433: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:9436: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ cf_cv_find_linkage_iconv=yes
+ cf_cv_header_path_iconv=/usr/include
+ cf_cv_library_path_iconv=/usr/lib
+ cf_cv_library_file_iconv="-liconv"
+
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+ cf_cv_find_linkage_iconv=no
+ LIBS="$cf_save_LIBS"
+
+ test -n "$verbose" && echo " find linkage for iconv library" 1>&6
+
+echo "${as_me:-configure}:9453: testing find linkage for iconv library ..." 1>&5
+
+echo "${as_me:-configure}:9455: testing Searching for headers in FIND_LINKAGE(iconv,) ..." 1>&5
+
+ cf_save_CPPFLAGS="$CPPFLAGS"
+ cf_test_CPPFLAGS="$CPPFLAGS"
+
+cf_search=
+
+# collect the current set of include-directories from compiler flags
+cf_header_path_list=""
+if test -n "${CFLAGS}${CPPFLAGS}" ; then
+ for cf_header_path in $CPPFLAGS $CFLAGS
+ do
+ case "$cf_header_path" in
+ (-I*)
+ cf_header_path=`echo ".$cf_header_path" |sed -e 's/^...//' -e 's,/include$,,'`
+
+test "x$cf_header_path" != "xNONE" && \
+test -d "$cf_header_path" && \
+ {
+ test -n "$verbose" && echo " ... testing for include-directories under $cf_header_path"
+ test -d "$cf_header_path/include" && cf_search="$cf_search $cf_header_path/include"
+ test -d "$cf_header_path/include/iconv" && cf_search="$cf_search $cf_header_path/include/iconv"
+ test -d "$cf_header_path/include/iconv/include" && cf_search="$cf_search $cf_header_path/include/iconv/include"
+ test -d "$cf_header_path/iconv/include" && cf_search="$cf_search $cf_header_path/iconv/include"
+ test -d "$cf_header_path/iconv/include/iconv" && cf_search="$cf_search $cf_header_path/iconv/include/iconv"
+}
+
+ cf_header_path_list="$cf_header_path_list $cf_search"
+ ;;
+ esac
+ done
+fi
+
+# add the variations for the package we are looking for
+
+cf_search=
+
+test "x$prefix" != "xNONE" && \
+test -d "$prefix" && \
+ {
+ test -n "$verbose" && echo " ... testing for include-directories under $prefix"
+ test -d "$prefix/include" && cf_search="$cf_search $prefix/include"
+ test -d "$prefix/include/iconv" && cf_search="$cf_search $prefix/include/iconv"
+ test -d "$prefix/include/iconv/include" && cf_search="$cf_search $prefix/include/iconv/include"
+ test -d "$prefix/iconv/include" && cf_search="$cf_search $prefix/iconv/include"
+ test -d "$prefix/iconv/include/iconv" && cf_search="$cf_search $prefix/iconv/include/iconv"
+}
+
+for cf_subdir_prefix in \
+ /usr \
+ /usr/local \
+ /usr/pkg \
+ /opt \
+ /opt/local \
+ $HOME
+do
+
+test "x$cf_subdir_prefix" != "x$prefix" && \
+test -d "$cf_subdir_prefix" && \
+{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
+ test -n "$verbose" && echo " ... testing for include-directories under $cf_subdir_prefix"
+ test -d "$cf_subdir_prefix/include" && cf_search="$cf_search $cf_subdir_prefix/include"
+ test -d "$cf_subdir_prefix/include/iconv" && cf_search="$cf_search $cf_subdir_prefix/include/iconv"
+ test -d "$cf_subdir_prefix/include/iconv/include" && cf_search="$cf_search $cf_subdir_prefix/include/iconv/include"
+ test -d "$cf_subdir_prefix/iconv/include" && cf_search="$cf_search $cf_subdir_prefix/iconv/include"
+ test -d "$cf_subdir_prefix/iconv/include/iconv" && cf_search="$cf_search $cf_subdir_prefix/iconv/include/iconv"
+}
+
+done
+
+test "$includedir" != NONE && \
+test "$includedir" != "/usr/include" && \
+test -d "$includedir" && {
+ test -d "$includedir" && cf_search="$cf_search $includedir"
+ test -d "$includedir/iconv" && cf_search="$cf_search $includedir/iconv"
+}
+
+test "$oldincludedir" != NONE && \
+test "$oldincludedir" != "/usr/include" && \
+test -d "$oldincludedir" && {
+ test -d "$oldincludedir" && cf_search="$cf_search $oldincludedir"
+ test -d "$oldincludedir/iconv" && cf_search="$cf_search $oldincludedir/iconv"
+}
+
+cf_search="$cf_search $cf_header_path_list"
+
+ for cf_cv_header_path_iconv in $cf_search
+ do
+ if test -d "$cf_cv_header_path_iconv" ; then
+ test -n "$verbose" && echo " ... testing $cf_cv_header_path_iconv" 1>&6
+
+echo "${as_me:-configure}:9546: testing ... testing $cf_cv_header_path_iconv ..." 1>&5
+
+ CPPFLAGS="$cf_save_CPPFLAGS"
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_cv_header_path_iconv"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 9554 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <iconv.h>
+
+int
+main (void)
+{
+
+ iconv_t cd = iconv_open("","");
+ iconv(cd,NULL,NULL,NULL,NULL);
+ iconv_close(cd);
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:9573: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:9576: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:9579: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:9582: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ test -n "$verbose" && echo " ... found iconv headers in $cf_cv_header_path_iconv" 1>&6
+
+echo "${as_me:-configure}:9587: testing ... found iconv headers in $cf_cv_header_path_iconv ..." 1>&5
+
+ cf_cv_find_linkage_iconv=maybe
+ cf_test_CPPFLAGS="$CPPFLAGS"
+ break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+ CPPFLAGS="$cf_save_CPPFLAGS"
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ fi
+ done
+
+ if test "$cf_cv_find_linkage_iconv" = maybe ; then
+
+echo "${as_me:-configure}:9605: testing Searching for iconv library in FIND_LINKAGE(iconv,) ..." 1>&5
+
+ cf_save_LIBS="$LIBS"
+ cf_save_LDFLAGS="$LDFLAGS"
+
+ if test "$cf_cv_find_linkage_iconv" != yes ; then
+
+cf_search=
+cf_library_path_list=""
+if test -n "${LDFLAGS}${LIBS}" ; then
+ for cf_library_path in $LDFLAGS $LIBS
+ do
+ case "$cf_library_path" in
+ (-L*)
+ cf_library_path=`echo ".$cf_library_path" |sed -e 's/^...//' -e 's,/lib$,,'`
+
+test "x$cf_library_path" != "xNONE" && \
+test -d "$cf_library_path" && \
+ {
+ test -n "$verbose" && echo " ... testing for lib-directories under $cf_library_path"
+ test -d "$cf_library_path/lib" && cf_search="$cf_search $cf_library_path/lib"
+ test -d "$cf_library_path/lib/iconv" && cf_search="$cf_search $cf_library_path/lib/iconv"
+ test -d "$cf_library_path/lib/iconv/lib" && cf_search="$cf_search $cf_library_path/lib/iconv/lib"
+ test -d "$cf_library_path/iconv/lib" && cf_search="$cf_search $cf_library_path/iconv/lib"
+ test -d "$cf_library_path/iconv/lib/iconv" && cf_search="$cf_search $cf_library_path/iconv/lib/iconv"
+}
+
+ cf_library_path_list="$cf_library_path_list $cf_search"
+ ;;
+ esac
+ done
+fi
+
+cf_search=
+
+test "x$prefix" != "xNONE" && \
+test -d "$prefix" && \
+ {
+ test -n "$verbose" && echo " ... testing for lib-directories under $prefix"
+ test -d "$prefix/lib" && cf_search="$cf_search $prefix/lib"
+ test -d "$prefix/lib/iconv" && cf_search="$cf_search $prefix/lib/iconv"
+ test -d "$prefix/lib/iconv/lib" && cf_search="$cf_search $prefix/lib/iconv/lib"
+ test -d "$prefix/iconv/lib" && cf_search="$cf_search $prefix/iconv/lib"
+ test -d "$prefix/iconv/lib/iconv" && cf_search="$cf_search $prefix/iconv/lib/iconv"
+}
+
+for cf_subdir_prefix in \
+ /usr \
+ /usr/local \
+ /usr/pkg \
+ /opt \
+ /opt/local \
+ $HOME
+do
+
+test "x$cf_subdir_prefix" != "x$prefix" && \
+test -d "$cf_subdir_prefix" && \
+{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
+ test -n "$verbose" && echo " ... testing for lib-directories under $cf_subdir_prefix"
+ test -d "$cf_subdir_prefix/lib" && cf_search="$cf_search $cf_subdir_prefix/lib"
+ test -d "$cf_subdir_prefix/lib/iconv" && cf_search="$cf_search $cf_subdir_prefix/lib/iconv"
+ test -d "$cf_subdir_prefix/lib/iconv/lib" && cf_search="$cf_search $cf_subdir_prefix/lib/iconv/lib"
+ test -d "$cf_subdir_prefix/iconv/lib" && cf_search="$cf_search $cf_subdir_prefix/iconv/lib"
+ test -d "$cf_subdir_prefix/iconv/lib/iconv" && cf_search="$cf_search $cf_subdir_prefix/iconv/lib/iconv"
+}
+
+done
+
+cf_search="$cf_library_path_list $cf_search"
+
+ for cf_cv_library_path_iconv in $cf_search
+ do
+ if test -d "$cf_cv_library_path_iconv" ; then
+ test -n "$verbose" && echo " ... testing $cf_cv_library_path_iconv" 1>&6
+
+echo "${as_me:-configure}:9680: testing ... testing $cf_cv_library_path_iconv ..." 1>&5
+
+ CPPFLAGS="$cf_test_CPPFLAGS"
+ LIBS="-liconv $cf_save_LIBS"
+ LDFLAGS="$cf_save_LDFLAGS -L$cf_cv_library_path_iconv"
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 9686 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <iconv.h>
+
+int
+main (void)
+{
+
+ iconv_t cd = iconv_open("","");
+ iconv(cd,NULL,NULL,NULL,NULL);
+ iconv_close(cd);
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:9705: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:9708: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:9711: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:9714: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ test -n "$verbose" && echo " ... found iconv library in $cf_cv_library_path_iconv" 1>&6
+
+echo "${as_me:-configure}:9719: testing ... found iconv library in $cf_cv_library_path_iconv ..." 1>&5
+
+ cf_cv_find_linkage_iconv=yes
+ cf_cv_library_file_iconv="-liconv"
+ break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+ CPPFLAGS="$cf_save_CPPFLAGS"
+ LIBS="$cf_save_LIBS"
+ LDFLAGS="$cf_save_LDFLAGS"
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+ fi
+ done
+ CPPFLAGS="$cf_save_CPPFLAGS"
+ LDFLAGS="$cf_save_LDFLAGS"
+ fi
+
+ else
+ cf_cv_find_linkage_iconv=no
+ fi
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+LIBS="$cf_save_LIBS"
+
+if test "$cf_cv_find_linkage_iconv" = yes ; then
+am_cv_func_iconv=yes
+else
+am_cv_func_iconv="no, consider installing GNU libiconv"
+fi
+
+fi
+echo "$as_me:9759: result: $am_cv_func_iconv" >&5
+echo "${ECHO_T}$am_cv_func_iconv" >&6
+
+ if test "$am_cv_func_iconv" = yes; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_ICONV 1
+EOF
+
+ echo "$as_me:9768: checking if the declaration of iconv() needs const." >&5
+echo $ECHO_N "checking if the declaration of iconv() needs const.... $ECHO_C" >&6
+if test "${am_cv_proto_iconv_const+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 9775 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <iconv.h>
+
+extern
+#ifdef __cplusplus
+"C"
+#endif
+#if defined(__STDC__) || defined(__cplusplus)
+size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
+#else
+size_t iconv();
+#endif
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:9800: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:9803: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:9806: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:9809: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ am_cv_proto_iconv_const=no
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+am_cv_proto_iconv_const=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:9819: result: $am_cv_proto_iconv_const" >&5
+echo "${ECHO_T}$am_cv_proto_iconv_const" >&6
+
+ if test "$am_cv_proto_iconv_const" = yes ; then
+ am_cv_proto_iconv_arg1="const"
+ else
+ am_cv_proto_iconv_arg1=""
+ fi
+
+cat >>confdefs.h <<EOF
+#define ICONV_CONST $am_cv_proto_iconv_arg1
+EOF
+
+ fi
+
+ LIBICONV=
+ if test "$cf_cv_find_linkage_iconv" = yes; then
+
+if test -n "$cf_cv_header_path_iconv" ; then
+ for cf_add_incdir in $cf_cv_header_path_iconv
+ do
+ while test "$cf_add_incdir" != /usr/include
+ do
+ if test -d "$cf_add_incdir"
+ then
+ cf_have_incdir=no
+ if test -n "$CFLAGS$CPPFLAGS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+ if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+ cf_have_incdir=yes; break
+ fi
+ done
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ if test "$cf_add_incdir" = /usr/local/include ; then
+ if test "$GCC" = yes
+ then
+ cf_save_CPPFLAGS=$CPPFLAGS
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 9864 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:9876: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:9879: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:9882: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:9885: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ CPPFLAGS=$cf_save_CPPFLAGS
+ fi
+ fi
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:9902: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+ CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+ cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+ test "$cf_top_incdir" = "$cf_add_incdir" && break
+ cf_add_incdir="$cf_top_incdir"
+ else
+ break
+ fi
+ else
+ break
+ fi
+ done
+ done
+fi
+
+ if test -n "$cf_cv_library_file_iconv" ; then
+ LIBICONV="-liconv"
+
+if test -n "$cf_cv_library_path_iconv" ; then
+ for cf_add_libdir in $cf_cv_library_path_iconv
+ do
+ if test "$cf_add_libdir" = /usr/lib ; then
+ :
+ elif test -d "$cf_add_libdir"
+ then
+ cf_have_libdir=no
+ if test -n "$LDFLAGS$LIBS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_libdir in $LDFLAGS $LIBS ; do
+ if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
+ cf_have_libdir=yes; break
+ fi
+ done
+ fi
+ if test "$cf_have_libdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
+
+echo "${as_me:-configure}:9941: testing adding $cf_add_libdir to library-path ..." 1>&5
+
+ LDFLAGS="-L$cf_add_libdir $LDFLAGS"
+ fi
+ fi
+ done
+fi
+
+ fi
+ fi
+
+echo "$as_me:9952: checking for nl_langinfo and CODESET" >&5
+echo $ECHO_N "checking for nl_langinfo and CODESET... $ECHO_C" >&6
+if test "${am_cv_langinfo_codeset+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 9958 "configure"
+#include "confdefs.h"
+#include <langinfo.h>
+int
+main (void)
+{
+char* cs = nl_langinfo(CODESET); (void)cs
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:9970: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:9973: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:9976: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:9979: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ am_cv_langinfo_codeset=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+am_cv_langinfo_codeset=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:9990: result: $am_cv_langinfo_codeset" >&5
+echo "${ECHO_T}$am_cv_langinfo_codeset" >&6
+ if test "$am_cv_langinfo_codeset" = yes; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_LANGINFO_CODESET 1
+EOF
+
+ fi
+
+ if test "$ac_cv_header_locale_h" = yes; then
+ echo "$as_me:10001: checking for LC_MESSAGES" >&5
+echo $ECHO_N "checking for LC_MESSAGES... $ECHO_C" >&6
+if test "${am_cv_val_LC_MESSAGES+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 10007 "configure"
+#include "confdefs.h"
+#include <locale.h>
+int
+main (void)
+{
+return LC_MESSAGES
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:10019: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:10022: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:10025: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:10028: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ am_cv_val_LC_MESSAGES=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+am_cv_val_LC_MESSAGES=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:10038: result: $am_cv_val_LC_MESSAGES" >&5
+echo "${ECHO_T}$am_cv_val_LC_MESSAGES" >&6
+ if test "$am_cv_val_LC_MESSAGES" = yes; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_LC_MESSAGES 1
+EOF
+
+ fi
+fi
+ echo "$as_me:10048: checking whether NLS is requested" >&5
+echo $ECHO_N "checking whether NLS is requested... $ECHO_C" >&6
+
+# Check whether --enable-nls or --disable-nls was given.
+if test "${enable_nls+set}" = set; then
+ enableval="$enable_nls"
+ USE_NLS=$enableval
+else
+ USE_NLS=no
+fi;
+ echo "$as_me:10058: result: $USE_NLS" >&5
+echo "${ECHO_T}$USE_NLS" >&6
+
+ BUILD_INCLUDED_LIBINTL=no
+ USE_INCLUDED_LIBINTL=no
+ INTLLIBS=
+
+ if test "$USE_NLS" = "yes"; then
+ POSUB=po
+
+cat >>confdefs.h <<\EOF
+#define ENABLE_NLS 1
+EOF
+
+ echo "$as_me:10072: checking whether included gettext is requested" >&5
+echo $ECHO_N "checking whether included gettext is requested... $ECHO_C" >&6
+
+# Check whether --with-included-gettext or --without-included-gettext was given.
+if test "${with_included_gettext+set}" = set; then
+ withval="$with_included_gettext"
+ nls_cv_force_use_gnu_gettext=$withval
+else
+ nls_cv_force_use_gnu_gettext=no
+fi;
+ echo "$as_me:10082: result: $nls_cv_force_use_gnu_gettext" >&5
+echo "${ECHO_T}$nls_cv_force_use_gnu_gettext" >&6
+
+ # Extract the first word of "msgfmt", so it can be a program name with args.
+
+set dummy msgfmt; ac_word=$2
+echo "$as_me:10088: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_MSGFMT+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case "$MSGFMT" in
+ ([\\/]*|?:[\\/]*)
+ ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path.
+ ;;
+ (*)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_word$ac_exeext" ; then
+ if "$ac_dir/$ac_word" --statistics /dev/null >/dev/null 2>&1; then
+ ac_cv_path_MSGFMT="$ac_dir/$ac_word$ac_exeext"
+ break
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT=":"
+ ;;
+esac
+fi
+MSGFMT="$ac_cv_path_MSGFMT"
+if test "$MSGFMT" != ":"; then
+ echo "$as_me:10115: result: $MSGFMT" >&5
+echo "${ECHO_T}$MSGFMT" >&6
+else
+ echo "$as_me:10118: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ # Extract the first word of "gmsgfmt", so it can be a program name with args.
+set dummy gmsgfmt; ac_word=$2
+echo "$as_me:10124: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_GMSGFMT+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $GMSGFMT in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path.
+ ;;
+ *)
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ if $as_executable_p "$ac_dir/$ac_word"; then
+ ac_cv_path_GMSGFMT="$ac_dir/$ac_word"
+ echo "$as_me:10141: found $ac_dir/$ac_word" >&5
+ break
+fi
+done
+
+ test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT"
+ ;;
+esac
+fi
+GMSGFMT=$ac_cv_path_GMSGFMT
+
+if test -n "$GMSGFMT"; then
+ echo "$as_me:10153: result: $GMSGFMT" >&5
+echo "${ECHO_T}$GMSGFMT" >&6
+else
+ echo "$as_me:10156: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ # Extract the first word of "xgettext", so it can be a program name with args.
+
+set dummy xgettext; ac_word=$2
+echo "$as_me:10163: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_XGETTEXT+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case "$XGETTEXT" in
+ ([\\/]*|?:[\\/]*)
+ ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path.
+ ;;
+ (*)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_word$ac_exeext" ; then
+ if "$ac_dir/$ac_word" --omit-header /dev/null >/dev/null 2>&1; then
+ ac_cv_path_XGETTEXT="$ac_dir/$ac_word$ac_exeext"
+ break
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":"
+ ;;
+esac
+fi
+XGETTEXT="$ac_cv_path_XGETTEXT"
+if test "$XGETTEXT" != ":"; then
+ echo "$as_me:10190: result: $XGETTEXT" >&5
+echo "${ECHO_T}$XGETTEXT" >&6
+else
+ echo "$as_me:10193: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext"
+ if test "$nls_cv_force_use_gnu_gettext" != "yes"; then
+ CATOBJEXT=NONE
+
+ cf_save_msgfmt_path="$MSGFMT"
+ cf_save_xgettext_path="$XGETTEXT"
+
+ cf_save_LIBS_1="$LIBS"
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $LIBICONV; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+ cf_save_OPTS_1="$CPPFLAGS"
+ if test "x$cf_save_msgfmt_path" = "x$MSGFMT" && \
+ test "x$cf_save_xgettext_path" = "x$XGETTEXT" ; then
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in -DIGNORE_MSGFMT_HACK
+do
+case "$cf_fix_cppflags" in
+(no)
+ case "$cf_add_cflags" in
+ (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=yes
+
+ if test "$cf_fix_cppflags" = yes ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ elif test "${cf_tst_cflags}" = "\"'" ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ fi
+ ;;
+ esac
+ case "$CPPFLAGS" in
+ (*$cf_add_cflags)
+ ;;
+ (*)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+ sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \
+ -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'`
+
+ ;;
+ esac
+
+ test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+ cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+ (*)
+
+ test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+ cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+(yes)
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=no
+ ;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+ test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+ CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+ test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+ EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+ fi
+
+# If the linkage is not already in the $CPPFLAGS/$LDFLAGS configuration, these
+# will be set on completion of the AC_TRY_LINK below.
+cf_cv_header_path_intl=
+cf_cv_library_path_intl=
+
+echo "${as_me:-configure}:10331: testing Starting FIND_LINKAGE(intl,) ..." 1>&5
+
+cf_save_LIBS="$LIBS"
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 10336 "configure"
+#include "confdefs.h"
+
+#include <libintl.h>
+extern int _nl_msg_cat_cntr;
+
+int
+main (void)
+{
+
+ bindtextdomain ("", "");
+ return (gettext ("") != 0)
+
+#ifndef IGNORE_MSGFMT_HACK
+ + _nl_msg_cat_cntr
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:10358: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:10361: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:10364: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:10367: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ cf_cv_find_linkage_intl=yes
+ cf_cv_header_path_intl=/usr/include
+ cf_cv_library_path_intl=/usr/lib
+
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+LIBS="-lintl $cf_save_LIBS"
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 10381 "configure"
+#include "confdefs.h"
+
+#include <libintl.h>
+extern int _nl_msg_cat_cntr;
+
+int
+main (void)
+{
+
+ bindtextdomain ("", "");
+ return (gettext ("") != 0)
+
+#ifndef IGNORE_MSGFMT_HACK
+ + _nl_msg_cat_cntr
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:10403: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:10406: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:10409: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:10412: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ cf_cv_find_linkage_intl=yes
+ cf_cv_header_path_intl=/usr/include
+ cf_cv_library_path_intl=/usr/lib
+ cf_cv_library_file_intl="-lintl"
+
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+ cf_cv_find_linkage_intl=no
+ LIBS="$cf_save_LIBS"
+
+ test -n "$verbose" && echo " find linkage for intl library" 1>&6
+
+echo "${as_me:-configure}:10429: testing find linkage for intl library ..." 1>&5
+
+echo "${as_me:-configure}:10431: testing Searching for headers in FIND_LINKAGE(intl,) ..." 1>&5
+
+ cf_save_CPPFLAGS="$CPPFLAGS"
+ cf_test_CPPFLAGS="$CPPFLAGS"
+
+cf_search=
+
+# collect the current set of include-directories from compiler flags
+cf_header_path_list=""
+if test -n "${CFLAGS}${CPPFLAGS}" ; then
+ for cf_header_path in $CPPFLAGS $CFLAGS
+ do
+ case "$cf_header_path" in
+ (-I*)
+ cf_header_path=`echo ".$cf_header_path" |sed -e 's/^...//' -e 's,/include$,,'`
+
+test "x$cf_header_path" != "xNONE" && \
+test -d "$cf_header_path" && \
+ {
+ test -n "$verbose" && echo " ... testing for include-directories under $cf_header_path"
+ test -d "$cf_header_path/include" && cf_search="$cf_search $cf_header_path/include"
+ test -d "$cf_header_path/include/intl" && cf_search="$cf_search $cf_header_path/include/intl"
+ test -d "$cf_header_path/include/intl/include" && cf_search="$cf_search $cf_header_path/include/intl/include"
+ test -d "$cf_header_path/intl/include" && cf_search="$cf_search $cf_header_path/intl/include"
+ test -d "$cf_header_path/intl/include/intl" && cf_search="$cf_search $cf_header_path/intl/include/intl"
+}
+
+ cf_header_path_list="$cf_header_path_list $cf_search"
+ ;;
+ esac
+ done
+fi
+
+# add the variations for the package we are looking for
+
+cf_search=
+
+test "x$prefix" != "xNONE" && \
+test -d "$prefix" && \
+ {
+ test -n "$verbose" && echo " ... testing for include-directories under $prefix"
+ test -d "$prefix/include" && cf_search="$cf_search $prefix/include"
+ test -d "$prefix/include/intl" && cf_search="$cf_search $prefix/include/intl"
+ test -d "$prefix/include/intl/include" && cf_search="$cf_search $prefix/include/intl/include"
+ test -d "$prefix/intl/include" && cf_search="$cf_search $prefix/intl/include"
+ test -d "$prefix/intl/include/intl" && cf_search="$cf_search $prefix/intl/include/intl"
+}
+
+for cf_subdir_prefix in \
+ /usr \
+ /usr/local \
+ /usr/pkg \
+ /opt \
+ /opt/local \
+ $HOME
+do
+
+test "x$cf_subdir_prefix" != "x$prefix" && \
+test -d "$cf_subdir_prefix" && \
+{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
+ test -n "$verbose" && echo " ... testing for include-directories under $cf_subdir_prefix"
+ test -d "$cf_subdir_prefix/include" && cf_search="$cf_search $cf_subdir_prefix/include"
+ test -d "$cf_subdir_prefix/include/intl" && cf_search="$cf_search $cf_subdir_prefix/include/intl"
+ test -d "$cf_subdir_prefix/include/intl/include" && cf_search="$cf_search $cf_subdir_prefix/include/intl/include"
+ test -d "$cf_subdir_prefix/intl/include" && cf_search="$cf_search $cf_subdir_prefix/intl/include"
+ test -d "$cf_subdir_prefix/intl/include/intl" && cf_search="$cf_search $cf_subdir_prefix/intl/include/intl"
+}
+
+done
+
+test "$includedir" != NONE && \
+test "$includedir" != "/usr/include" && \
+test -d "$includedir" && {
+ test -d "$includedir" && cf_search="$cf_search $includedir"
+ test -d "$includedir/intl" && cf_search="$cf_search $includedir/intl"
+}
+
+test "$oldincludedir" != NONE && \
+test "$oldincludedir" != "/usr/include" && \
+test -d "$oldincludedir" && {
+ test -d "$oldincludedir" && cf_search="$cf_search $oldincludedir"
+ test -d "$oldincludedir/intl" && cf_search="$cf_search $oldincludedir/intl"
+}
+
+cf_search="$cf_search $cf_header_path_list"
+
+ for cf_cv_header_path_intl in $cf_search
+ do
+ if test -d "$cf_cv_header_path_intl" ; then
+ test -n "$verbose" && echo " ... testing $cf_cv_header_path_intl" 1>&6
+
+echo "${as_me:-configure}:10522: testing ... testing $cf_cv_header_path_intl ..." 1>&5
+
+ CPPFLAGS="$cf_save_CPPFLAGS"
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_cv_header_path_intl"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 10530 "configure"
+#include "confdefs.h"
+
+#include <libintl.h>
+extern int _nl_msg_cat_cntr;
+
+int
+main (void)
+{
+
+ bindtextdomain ("", "");
+ return (gettext ("") != 0)
+
+#ifndef IGNORE_MSGFMT_HACK
+ + _nl_msg_cat_cntr
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:10552: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:10555: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:10558: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:10561: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ test -n "$verbose" && echo " ... found intl headers in $cf_cv_header_path_intl" 1>&6
+
+echo "${as_me:-configure}:10566: testing ... found intl headers in $cf_cv_header_path_intl ..." 1>&5
+
+ cf_cv_find_linkage_intl=maybe
+ cf_test_CPPFLAGS="$CPPFLAGS"
+ break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+ CPPFLAGS="$cf_save_CPPFLAGS"
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ fi
+ done
+
+ if test "$cf_cv_find_linkage_intl" = maybe ; then
+
+echo "${as_me:-configure}:10584: testing Searching for intl library in FIND_LINKAGE(intl,) ..." 1>&5
+
+ cf_save_LIBS="$LIBS"
+ cf_save_LDFLAGS="$LDFLAGS"
+
+ if test "$cf_cv_find_linkage_intl" != yes ; then
+
+cf_search=
+cf_library_path_list=""
+if test -n "${LDFLAGS}${LIBS}" ; then
+ for cf_library_path in $LDFLAGS $LIBS
+ do
+ case "$cf_library_path" in
+ (-L*)
+ cf_library_path=`echo ".$cf_library_path" |sed -e 's/^...//' -e 's,/lib$,,'`
+
+test "x$cf_library_path" != "xNONE" && \
+test -d "$cf_library_path" && \
+ {
+ test -n "$verbose" && echo " ... testing for lib-directories under $cf_library_path"
+ test -d "$cf_library_path/lib" && cf_search="$cf_search $cf_library_path/lib"
+ test -d "$cf_library_path/lib/intl" && cf_search="$cf_search $cf_library_path/lib/intl"
+ test -d "$cf_library_path/lib/intl/lib" && cf_search="$cf_search $cf_library_path/lib/intl/lib"
+ test -d "$cf_library_path/intl/lib" && cf_search="$cf_search $cf_library_path/intl/lib"
+ test -d "$cf_library_path/intl/lib/intl" && cf_search="$cf_search $cf_library_path/intl/lib/intl"
+}
+
+ cf_library_path_list="$cf_library_path_list $cf_search"
+ ;;
+ esac
+ done
+fi
+
+cf_search=
+
+test "x$prefix" != "xNONE" && \
+test -d "$prefix" && \
+ {
+ test -n "$verbose" && echo " ... testing for lib-directories under $prefix"
+ test -d "$prefix/lib" && cf_search="$cf_search $prefix/lib"
+ test -d "$prefix/lib/intl" && cf_search="$cf_search $prefix/lib/intl"
+ test -d "$prefix/lib/intl/lib" && cf_search="$cf_search $prefix/lib/intl/lib"
+ test -d "$prefix/intl/lib" && cf_search="$cf_search $prefix/intl/lib"
+ test -d "$prefix/intl/lib/intl" && cf_search="$cf_search $prefix/intl/lib/intl"
+}
+
+for cf_subdir_prefix in \
+ /usr \
+ /usr/local \
+ /usr/pkg \
+ /opt \
+ /opt/local \
+ $HOME
+do
+
+test "x$cf_subdir_prefix" != "x$prefix" && \
+test -d "$cf_subdir_prefix" && \
+{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
+ test -n "$verbose" && echo " ... testing for lib-directories under $cf_subdir_prefix"
+ test -d "$cf_subdir_prefix/lib" && cf_search="$cf_search $cf_subdir_prefix/lib"
+ test -d "$cf_subdir_prefix/lib/intl" && cf_search="$cf_search $cf_subdir_prefix/lib/intl"
+ test -d "$cf_subdir_prefix/lib/intl/lib" && cf_search="$cf_search $cf_subdir_prefix/lib/intl/lib"
+ test -d "$cf_subdir_prefix/intl/lib" && cf_search="$cf_search $cf_subdir_prefix/intl/lib"
+ test -d "$cf_subdir_prefix/intl/lib/intl" && cf_search="$cf_search $cf_subdir_prefix/intl/lib/intl"
+}
+
+done
+
+cf_search="$cf_library_path_list $cf_search"
+
+ for cf_cv_library_path_intl in $cf_search
+ do
+ if test -d "$cf_cv_library_path_intl" ; then
+ test -n "$verbose" && echo " ... testing $cf_cv_library_path_intl" 1>&6
+
+echo "${as_me:-configure}:10659: testing ... testing $cf_cv_library_path_intl ..." 1>&5
+
+ CPPFLAGS="$cf_test_CPPFLAGS"
+ LIBS="-lintl $cf_save_LIBS"
+ LDFLAGS="$cf_save_LDFLAGS -L$cf_cv_library_path_intl"
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 10665 "configure"
+#include "confdefs.h"
+
+#include <libintl.h>
+extern int _nl_msg_cat_cntr;
+
+int
+main (void)
+{
+
+ bindtextdomain ("", "");
+ return (gettext ("") != 0)
+
+#ifndef IGNORE_MSGFMT_HACK
+ + _nl_msg_cat_cntr
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:10687: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:10690: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:10693: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:10696: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ test -n "$verbose" && echo " ... found intl library in $cf_cv_library_path_intl" 1>&6
+
+echo "${as_me:-configure}:10701: testing ... found intl library in $cf_cv_library_path_intl ..." 1>&5
+
+ cf_cv_find_linkage_intl=yes
+ cf_cv_library_file_intl="-lintl"
+ break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+ CPPFLAGS="$cf_save_CPPFLAGS"
+ LIBS="$cf_save_LIBS"
+ LDFLAGS="$cf_save_LDFLAGS"
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+ fi
+ done
+ CPPFLAGS="$cf_save_CPPFLAGS"
+ LDFLAGS="$cf_save_LDFLAGS"
+ fi
+
+ else
+ cf_cv_find_linkage_intl=no
+ fi
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+LIBS="$cf_save_LIBS"
+
+if test "$cf_cv_find_linkage_intl" = yes ; then
+cf_cv_func_gettext=yes
+else
+cf_cv_func_gettext=no
+fi
+
+ echo "$as_me:10740: checking for libintl.h and gettext()" >&5
+echo $ECHO_N "checking for libintl.h and gettext()... $ECHO_C" >&6
+ echo "$as_me:10742: result: $cf_cv_func_gettext" >&5
+echo "${ECHO_T}$cf_cv_func_gettext" >&6
+
+ LIBS="$cf_save_LIBS_1"
+ CPPFLAGS="$cf_save_OPTS_1"
+
+ if test "$cf_cv_func_gettext" = yes ; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_LIBINTL_H 1
+EOF
+
+ if test "$PACKAGE" != gettext; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_GETTEXT 1
+EOF
+
+if test -n "$cf_cv_header_path_intl" ; then
+ for cf_add_incdir in $cf_cv_header_path_intl
+ do
+ while test "$cf_add_incdir" != /usr/include
+ do
+ if test -d "$cf_add_incdir"
+ then
+ cf_have_incdir=no
+ if test -n "$CFLAGS$CPPFLAGS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+ if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+ cf_have_incdir=yes; break
+ fi
+ done
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ if test "$cf_add_incdir" = /usr/local/include ; then
+ if test "$GCC" = yes
+ then
+ cf_save_CPPFLAGS=$CPPFLAGS
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 10787 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:10799: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:10802: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:10805: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:10808: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ CPPFLAGS=$cf_save_CPPFLAGS
+ fi
+ fi
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:10825: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+ CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+ cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+ test "$cf_top_incdir" = "$cf_add_incdir" && break
+ cf_add_incdir="$cf_top_incdir"
+ else
+ break
+ fi
+ else
+ break
+ fi
+ done
+ done
+fi
+
+ if test -n "$cf_cv_library_file_intl" ; then
+ INTLLIBS="$cf_cv_library_file_intl $LIBICONV"
+
+if test -n "$cf_cv_library_path_intl" ; then
+ for cf_add_libdir in $cf_cv_library_path_intl
+ do
+ if test "$cf_add_libdir" = /usr/lib ; then
+ :
+ elif test -d "$cf_add_libdir"
+ then
+ cf_have_libdir=no
+ if test -n "$LDFLAGS$LIBS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_libdir in $LDFLAGS $LIBS ; do
+ if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
+ cf_have_libdir=yes; break
+ fi
+ done
+ fi
+ if test "$cf_have_libdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
+
+echo "${as_me:-configure}:10864: testing adding $cf_add_libdir to library-path ..." 1>&5
+
+ INTLLIBS="-L$cf_add_libdir $INTLLIBS"
+ fi
+ fi
+ done
+fi
+
+ fi
+
+ gt_save_LIBS="$LIBS"
+ LIBS="$LIBS $INTLLIBS"
+
+for ac_func in dcgettext
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:10880: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 10886 "configure"
+#include "confdefs.h"
+#define $ac_func autoconf_temporary
+#include <limits.h> /* least-intrusive standard header which defines gcc2 __stub macros */
+#undef $ac_func
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+#error found stub for $ac_func
+#endif
+
+ return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:10917: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:10920: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:10923: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:10926: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+eval "$as_ac_var=no"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:10936: result: `eval echo '${'"$as_ac_var"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_var"'}'`" >&6
+if test "`eval echo '${'"$as_ac_var"'}'`" = yes; then
+ cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+ LIBS="$gt_save_LIBS"
+
+ CATOBJEXT=.gmo
+ fi
+ elif test -z "$MSGFMT" || test -z "$XGETTEXT" ; then
+ { echo "$as_me:10951: WARNING: disabling NLS feature" >&5
+echo "$as_me: WARNING: disabling NLS feature" >&2;}
+ sed -e /ENABLE_NLS/d confdefs.h >confdefs.tmp
+ mv confdefs.tmp confdefs.h
+ ALL_LINGUAS=
+ CATOBJEXT=.ignored
+ MSGFMT=":"
+ GMSGFMT=":"
+ XGETTEXT=":"
+ POSUB=
+ BUILD_INCLUDED_LIBINTL=no
+ USE_INCLUDED_LIBINTL=no
+ USE_NLS=no
+ nls_cv_use_gnu_gettext=no
+ fi
+
+ if test "$CATOBJEXT" = "NONE"; then
+ nls_cv_use_gnu_gettext=maybe
+ fi
+ fi
+
+ if test "$nls_cv_use_gnu_gettext" != "no"; then
+ CATOBJEXT=.gmo
+ if test -f "$srcdir/intl/libintl.h" || test -f "$srcdir/intl/libgnuintl.h" ; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_LIBINTL_H 1
+EOF
+
+ INTLOBJS="\$(GETTOBJS)"
+ BUILD_INCLUDED_LIBINTL=yes
+ USE_INCLUDED_LIBINTL=yes
+ INTLLIBS="\$(top_builddir)/intl/libintl.a $LIBICONV"
+ LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'`
+ elif test "$nls_cv_use_gnu_gettext" = "yes"; then
+ nls_cv_use_gnu_gettext=no
+ { echo "$as_me:10987: WARNING: no NLS library is packaged with this application" >&5
+echo "$as_me: WARNING: no NLS library is packaged with this application" >&2;}
+ fi
+ fi
+
+ if test "$GMSGFMT" != ":"; then
+ if $GMSGFMT --statistics /dev/null >/dev/null 2>&1; then
+ : ;
+ else
+ { echo "$as_me:10996: WARNING: found msgfmt program is not GNU msgfmt" >&5
+echo "$as_me: WARNING: found msgfmt program is not GNU msgfmt" >&2;}
+ fi
+ fi
+
+ if test "$XGETTEXT" != ":"; then
+ if $XGETTEXT --omit-header /dev/null >/dev/null 2>&1; then
+ : ;
+ else
+ { echo "$as_me:11005: WARNING: found xgettext program is not GNU xgettext" >&5
+echo "$as_me: WARNING: found xgettext program is not GNU xgettext" >&2;}
+ fi
+ fi
+ fi
+
+ if test "$XGETTEXT" != ":"; then
+ ac_config_commands="$ac_config_commands default-1"
+
+ if test "$PACKAGE" = gettext; then
+ BUILD_INCLUDED_LIBINTL=yes
+ fi
+
+ if test "$nls_cv_use_gnu_gettext" = "yes"; then
+ for ac_prog in byacc bison
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:11023: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_INTL_YACC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$INTL_YACC"; then
+ ac_cv_prog_INTL_YACC="$INTL_YACC" # Let the user override the test.
+else
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_INTL_YACC="$ac_prog"
+echo "$as_me:11038: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+INTL_YACC=$ac_cv_prog_INTL_YACC
+if test -n "$INTL_YACC"; then
+ echo "$as_me:11046: result: $INTL_YACC" >&5
+echo "${ECHO_T}$INTL_YACC" >&6
+else
+ echo "$as_me:11049: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$INTL_YACC" && break
+done
+
+ if test -z "$INTL_YACC"; then
+ ac_verc_fail=yes
+ else
+ echo "$as_me:11059: checking version of $INTL_YACC" >&5
+echo $ECHO_N "checking version of $INTL_YACC... $ECHO_C" >&6
+ ac_prog_version=`$INTL_YACC -V 2>&1 | sed -n 's/^.*GNU Bison.* \([0-9]*\.[0-9.]*\).*$/\1/p;s/^\(byacc\) - \([0-9][0-9.]*\) \([0-9]*\).*$/\1-\2.\3/p'`
+ case "$ac_prog_version" in
+ (byacc-[0-9].[0-9].20[1-9]*)
+ ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;;
+ ('') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
+ (1.2[6-9]*|1.[3-9][0-9]*|2.[0-3]*)
+ ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;;
+ (*) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
+ esac
+ echo "$as_me:11070: result: $ac_prog_version" >&5
+echo "${ECHO_T}$ac_prog_version" >&6
+ fi
+ if test "$ac_verc_fail" = yes; then
+ INTL_YACC=:
+ fi
+ fi
+
+ for lang in $ALL_LINGUAS; do
+ GMOFILES="$GMOFILES $lang.gmo"
+ POFILES="$POFILES $lang.po"
+ done
+ fi
+
+ nls_cv_header_intl=
+ nls_cv_header_libgt=
+
+ DATADIRNAME=share
+
+ INSTOBJEXT=.mo
+
+ GENCAT=gencat
+
+ if test "x$CATOBJEXT" != "x"; then
+ if test "x$ALL_LINGUAS" = "x"; then
+ LINGUAS=
+ else
+ echo "$as_me:11097: checking for catalogs to be installed" >&5
+echo $ECHO_N "checking for catalogs to be installed... $ECHO_C" >&6
+ NEW_LINGUAS=
+ for presentlang in $ALL_LINGUAS; do
+ useit=no
+ for desiredlang in ${LINGUAS-$ALL_LINGUAS}; do
+ # Use the presentlang catalog if desiredlang is
+ # a. equal to presentlang, or
+ # b. a variant of presentlang (because in this case,
+ # presentlang can be used as a fallback for messages
+ # which are not translated in the desiredlang catalog).
+ case "$desiredlang" in
+ ("$presentlang"*) useit=yes;;
+ esac
+ done
+ if test "$useit" = yes; then
+ NEW_LINGUAS="$NEW_LINGUAS $presentlang"
+ fi
+ done
+ LINGUAS=$NEW_LINGUAS
+ echo "$as_me:11117: result: $LINGUAS" >&5
+echo "${ECHO_T}$LINGUAS" >&6
+ fi
+
+ if test -n "$LINGUAS"; then
+ for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done
+ fi
+ fi
+
+ INTL_LIBTOOL_SUFFIX_PREFIX=
+
+if test "$USE_NLS" = yes ; then
+
+# Check whether --with-textdomain or --without-textdomain was given.
+if test "${with_textdomain+set}" = set; then
+ withval="$with_textdomain"
+ NLS_TEXTDOMAIN=$withval
+else
+ NLS_TEXTDOMAIN=$PACKAGE
+fi;
+
+cat >>confdefs.h <<EOF
+#define NLS_TEXTDOMAIN "$NLS_TEXTDOMAIN"
+EOF
+
+fi
+
+INTLDIR_MAKE=
+MSG_DIR_MAKE=
+SUB_MAKEFILE=
+
+cf_makefile=makefile
+
+use_our_messages=no
+if test "$USE_NLS" = yes ; then
+if test -d "$srcdir/po" ; then
+echo "$as_me:11153: checking if we should use included message-library" >&5
+echo $ECHO_N "checking if we should use included message-library... $ECHO_C" >&6
+
+# Check whether --enable-included-msgs or --disable-included-msgs was given.
+if test "${enable_included_msgs+set}" = set; then
+ enableval="$enable_included_msgs"
+ use_our_messages=$enableval
+else
+ use_our_messages=yes
+fi;
+fi
+echo "$as_me:11164: result: $use_our_messages" >&5
+echo "${ECHO_T}$use_our_messages" >&6
+fi
+
+MSG_DIR_MAKE="#"
+if test "$use_our_messages" = yes
+then
+ SUB_MAKEFILE="$SUB_MAKEFILE po/$cf_makefile.in:$srcdir/po/$cf_makefile.inn"
+ MSG_DIR_MAKE=
+fi
+
+if test "$USE_INCLUDED_LIBINTL" = yes ; then
+ if test "$nls_cv_force_use_gnu_gettext" = yes ; then
+ :
+ elif test "$nls_cv_use_gnu_gettext" = yes ; then
+ :
+ else
+ INTLDIR_MAKE="#"
+ fi
+ if test -z "$INTLDIR_MAKE"; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_LIBGETTEXT_H 1
+EOF
+
+ for cf_makefile in \
+ $srcdir/intl/Makefile.in \
+ $srcdir/intl/makefile.in
+ do
+ if test -f "$cf_makefile" ; then
+ SUB_MAKEFILE="$SUB_MAKEFILE `echo \"${cf_makefile}\"|sed -e 's,^'$srcdir/',,' -e 's/\.in$//'`:${cf_makefile}"
+ break
+ fi
+ done
+ fi
+else
+ INTLDIR_MAKE="#"
+ if test "$USE_NLS" = yes ; then
+
+for ac_header in libintl.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:11206: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 11212 "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:11216: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+ (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ $EGREP -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:11222: \$? = $ac_status" >&5
+ (exit "$ac_status"); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ eval "$as_ac_Header=yes"
+else
+ echo "$as_me: failed program was:" >&5
+ cat "conftest.$ac_ext" >&5
+ eval "$as_ac_Header=no"
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi
+echo "$as_me:11241: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
+if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
+ cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+ fi
+fi
+
+if test -z "$INTLDIR_MAKE" ; then
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I../intl"
+
+fi
+
+if test "$BUILD_INCLUDED_LIBINTL" = yes ; then
+ GT_YES="#"
+ GT_NO=
+else
+ GT_YES=
+ GT_NO="#"
+fi
+
+if test "$USE_INCLUDED_LIBINTL" = yes ; then
+ if test "$nls_cv_force_use_gnu_gettext" = yes ; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_GETTEXT 1
+EOF
+
+ elif test "$nls_cv_use_gnu_gettext" = yes ; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_GETTEXT 1
+EOF
+
+ fi
+ if test -n "$nls_cv_header_intl" ; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_LIBINTL_H 1
+EOF
+
+ fi
+fi
+
+INTLDIR_CPPFLAGS="#"
+if test -z "$INTLDIR_MAKE" ; then
+ INTLDIR_CPPFLAGS=
+fi
+
+# Check whether --with-nls-datadir or --without-nls-datadir was given.
+if test "${with_nls_datadir+set}" = set; then
+ withval="$with_nls_datadir"
+
+else
+ withval="${NLS_DATADIR:-$prefix/$DATADIRNAME}"
+fi; if test -n "$prefix/$DATADIRNAME" ; then
+
+if test "x$prefix" != xNONE; then
+ cf_path_syntax="$prefix"
+else
+ cf_path_syntax="$ac_default_prefix"
+fi
+
+case ".$withval" in
+(.\$\(*\)*|.\'*\'*)
+ ;;
+(..|./*|.\\*)
+ ;;
+(.[a-zA-Z]:[\\/]*) # OS/2 EMX
+ ;;
+(.\$\{*prefix\}*|.\$\{*dir\}*)
+ eval withval="$withval"
+ case ".$withval" in
+ (.NONE/*)
+ withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%`
+ ;;
+ esac
+ ;;
+(.no|.NONE/*)
+ withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%`
+ ;;
+(*)
+ { { echo "$as_me:11330: error: expected a pathname, not \"$withval\"" >&5
+echo "$as_me: error: expected a pathname, not \"$withval\"" >&2;}
+ { (exit 1); exit 1; }; }
+ ;;
+esac
+
+fi
+eval NLS_DATADIR="$withval"
+
+echo "$as_me:11339: checking if you want full utility pathnames" >&5
+echo $ECHO_N "checking if you want full utility pathnames... $ECHO_C" >&6
+
+# Check whether --enable-full-paths or --disable-full-paths was given.
+if test "${enable_full_paths+set}" = set; then
+ enableval="$enable_full_paths"
+ test "$enableval" != no && enableval=yes
+ if test "$enableval" != "yes" ; then
+ with_full_paths=no
+ else
+ with_full_paths=yes
+ fi
+else
+ enableval=yes
+ with_full_paths=yes
+
+fi;
+echo "$as_me:11356: result: $with_full_paths" >&5
+echo "${ECHO_T}$with_full_paths" >&6
+test "$with_full_paths" = no &&
+cat >>confdefs.h <<\EOF
+#define USE_EXECVP 1
+EOF
+
+echo "$as_me:11363: checking for system mailer" >&5
+echo $ECHO_N "checking for system mailer... $ECHO_C" >&6
+if test "${cf_cv_SYSTEM_MAIL+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cf_cv_SYSTEM_MAIL=unknown
+ for cv_path in /usr/mmdf/bin/submit \
+ /usr/sbin/sendmail \
+ /usr/lib/sendmail \
+
+ do
+ if test -f "$cv_path" ; then
+ cf_cv_SYSTEM_MAIL="$cv_path"
+ break
+ fi
+ done
+
+fi
+
+echo "$as_me:11383: result: $cf_cv_SYSTEM_MAIL" >&5
+echo "${ECHO_T}$cf_cv_SYSTEM_MAIL" >&6
+
+cat >>confdefs.h <<EOF
+#define SYSTEM_MAIL "$cf_cv_SYSTEM_MAIL"
+EOF
+
+echo "$as_me:11390: checking system mail flags" >&5
+echo $ECHO_N "checking system mail flags... $ECHO_C" >&6
+if test "${cf_cv_system_mail_flags+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ case "$cf_cv_SYSTEM_MAIL" in
+ (*/mmdf/*)
+ cf_cv_system_mail_flags="-mlruxto,cc\\\\*"
+ ;;
+ (*)
+ cf_cv_system_mail_flags="-t -oi"
+ esac
+
+fi
+
+echo "$as_me:11406: result: $cf_cv_system_mail_flags" >&5
+echo "${ECHO_T}$cf_cv_system_mail_flags" >&6
+
+cat >>confdefs.h <<EOF
+#define SYSTEM_MAIL_FLAGS "$cf_cv_system_mail_flags"
+EOF
+
+if test -n "$SYSTEM_MAIL" ; then
+if test "$with_full_paths" = no ; then
+ SYSTEM_MAIL=`basename "$SYSTEM_MAIL"`
+fi
+fi
+
+echo "$as_me:11419: checking if the POSIX test-macros are already defined" >&5
+echo $ECHO_N "checking if the POSIX test-macros are already defined... $ECHO_C" >&6
+if test "${cf_cv_posix_visible+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 11426 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+
+#if defined(__POSIX_VISIBLE) && ((__POSIX_VISIBLE - 0L) > 0) \
+ && defined(__XSI_VISIBLE) && ((__XSI_VISIBLE - 0L) > 0) \
+ && defined(__BSD_VISIBLE) && ((__BSD_VISIBLE - 0L) > 0) \
+ && defined(__ISO_C_VISIBLE) && ((__ISO_C_VISIBLE - 0L) > 0)
+#error conflicting symbols found
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:11445: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:11448: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:11451: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:11454: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_posix_visible=no
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_posix_visible=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:11465: result: $cf_cv_posix_visible" >&5
+echo "${ECHO_T}$cf_cv_posix_visible" >&6
+
+if test "$cf_cv_posix_visible" = no; then
+
+cf_XOPEN_SOURCE=500
+cf_POSIX_C_SOURCE=199506L
+cf_xopen_source=
+
+case "$host_os" in
+(aix[4-7]*)
+ cf_xopen_source="-D_ALL_SOURCE"
+ ;;
+(msys)
+ cf_XOPEN_SOURCE=600
+ ;;
+(darwin[0-8].*)
+ cf_xopen_source="-D_APPLE_C_SOURCE"
+ ;;
+(darwin*)
+ cf_xopen_source="-D_DARWIN_C_SOURCE"
+ cf_XOPEN_SOURCE=
+ ;;
+(freebsd*|dragonfly*|midnightbsd*)
+ # 5.x headers associate
+ # _XOPEN_SOURCE=600 with _POSIX_C_SOURCE=200112L
+ # _XOPEN_SOURCE=500 with _POSIX_C_SOURCE=199506L
+ cf_POSIX_C_SOURCE=200112L
+ cf_XOPEN_SOURCE=600
+ cf_xopen_source="-D_BSD_TYPES -D__BSD_VISIBLE -D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE -D_XOPEN_SOURCE=$cf_XOPEN_SOURCE"
+ ;;
+(hpux11*)
+ cf_xopen_source="-D_HPUX_SOURCE -D_XOPEN_SOURCE=500"
+ ;;
+(hpux*)
+ cf_xopen_source="-D_HPUX_SOURCE"
+ ;;
+(irix[56].*)
+ cf_xopen_source="-D_SGI_SOURCE"
+ cf_XOPEN_SOURCE=
+ ;;
+(linux*gnu|linux*gnuabi64|linux*gnuabin32|linux*gnueabi|linux*gnueabihf|linux*gnux32|uclinux*|gnu*|mint*|k*bsd*-gnu|cygwin)
+
+cf_gnu_xopen_source=$cf_XOPEN_SOURCE
+
+echo "$as_me:11510: checking if this is the GNU C library" >&5
+echo $ECHO_N "checking if this is the GNU C library... $ECHO_C" >&6
+if test "${cf_cv_gnu_library+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 11517 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+int
+main (void)
+{
+
+ #if __GLIBC__ > 0 && __GLIBC_MINOR__ >= 0
+ return 0;
+ #elif __NEWLIB__ > 0 && __NEWLIB_MINOR__ >= 0
+ return 0;
+ #else
+ # error not GNU C library
+ #endif
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:11536: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:11539: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:11542: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:11545: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_gnu_library=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_gnu_library=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:11556: result: $cf_cv_gnu_library" >&5
+echo "${ECHO_T}$cf_cv_gnu_library" >&6
+
+if test x$cf_cv_gnu_library = xyes; then
+
+ # With glibc 2.19 (13 years after this check was begun), _DEFAULT_SOURCE
+ # was changed to help a little. newlib incorporated the change about 4
+ # years later.
+ echo "$as_me:11564: checking if _DEFAULT_SOURCE can be used as a basis" >&5
+echo $ECHO_N "checking if _DEFAULT_SOURCE can be used as a basis... $ECHO_C" >&6
+if test "${cf_cv_gnu_library_219+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cf_save="$CPPFLAGS"
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-D_DEFAULT_SOURCE"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 11576 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+int
+main (void)
+{
+
+ #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 19) || (__GLIBC__ > 2)
+ return 0;
+ #elif (__NEWLIB__ == 2 && __NEWLIB_MINOR__ >= 4) || (__GLIBC__ > 3)
+ return 0;
+ #else
+ # error GNU C library __GLIBC__.__GLIBC_MINOR__ is too old
+ #endif
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:11595: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:11598: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:11601: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:11604: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_gnu_library_219=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_gnu_library_219=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ CPPFLAGS="$cf_save"
+
+fi
+echo "$as_me:11616: result: $cf_cv_gnu_library_219" >&5
+echo "${ECHO_T}$cf_cv_gnu_library_219" >&6
+
+ if test "x$cf_cv_gnu_library_219" = xyes; then
+ cf_save="$CPPFLAGS"
+ echo "$as_me:11621: checking if _XOPEN_SOURCE=$cf_gnu_xopen_source works with _DEFAULT_SOURCE" >&5
+echo $ECHO_N "checking if _XOPEN_SOURCE=$cf_gnu_xopen_source works with _DEFAULT_SOURCE... $ECHO_C" >&6
+if test "${cf_cv_gnu_dftsrc_219+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=$cf_gnu_xopen_source
+do
+case "$cf_fix_cppflags" in
+(no)
+ case "$cf_add_cflags" in
+ (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=yes
+
+ if test "$cf_fix_cppflags" = yes ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ elif test "${cf_tst_cflags}" = "\"'" ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ fi
+ ;;
+ esac
+ case "$CPPFLAGS" in
+ (*$cf_add_cflags)
+ ;;
+ (*)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+ sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \
+ -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'`
+
+ ;;
+ esac
+
+ test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+ cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+ (*)
+
+ test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+ cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+(yes)
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=no
+ ;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+ test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+ CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+ test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+ EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 11726 "configure"
+#include "confdefs.h"
+
+ #include <limits.h>
+ #include <sys/types.h>
+
+int
+main (void)
+{
+
+ #if (_XOPEN_SOURCE >= $cf_gnu_xopen_source) && (MB_LEN_MAX > 1)
+ return 0;
+ #else
+ # error GNU C library is too old
+ #endif
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:11746: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:11749: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:11752: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:11755: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_gnu_dftsrc_219=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_gnu_dftsrc_219=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:11766: result: $cf_cv_gnu_dftsrc_219" >&5
+echo "${ECHO_T}$cf_cv_gnu_dftsrc_219" >&6
+ test "x$cf_cv_gnu_dftsrc_219" = "xyes" || CPPFLAGS="$cf_save"
+ else
+ cf_cv_gnu_dftsrc_219=maybe
+ fi
+
+ if test "x$cf_cv_gnu_dftsrc_219" != xyes; then
+
+ echo "$as_me:11775: checking if we must define _GNU_SOURCE" >&5
+echo $ECHO_N "checking if we must define _GNU_SOURCE... $ECHO_C" >&6
+if test "${cf_cv_gnu_source+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 11782 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+int
+main (void)
+{
+
+ #ifndef _XOPEN_SOURCE
+ #error expected _XOPEN_SOURCE to be defined
+ #endif
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:11797: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:11800: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:11803: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:11806: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_gnu_source=no
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_save="$CPPFLAGS"
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in -D_GNU_SOURCE
+do
+case "$cf_fix_cppflags" in
+(no)
+ case "$cf_add_cflags" in
+ (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=yes
+
+ if test "$cf_fix_cppflags" = yes ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ elif test "${cf_tst_cflags}" = "\"'" ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ fi
+ ;;
+ esac
+ case "$CPPFLAGS" in
+ (*$cf_add_cflags)
+ ;;
+ (*)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+ sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \
+ -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'`
+
+ ;;
+ esac
+
+ test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+ cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+ (*)
+
+ test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+ cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+(yes)
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=no
+ ;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+ test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+ CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+ test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+ EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 11913 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+int
+main (void)
+{
+
+ #ifdef _XOPEN_SOURCE
+ #error expected _XOPEN_SOURCE to be undefined
+ #endif
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:11928: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:11931: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:11934: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:11937: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_gnu_source=no
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_gnu_source=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ CPPFLAGS="$cf_save"
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:11952: result: $cf_cv_gnu_source" >&5
+echo "${ECHO_T}$cf_cv_gnu_source" >&6
+
+ if test "$cf_cv_gnu_source" = yes
+ then
+ echo "$as_me:11957: checking if we should also define _DEFAULT_SOURCE" >&5
+echo $ECHO_N "checking if we should also define _DEFAULT_SOURCE... $ECHO_C" >&6
+if test "${cf_cv_default_source+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-D_GNU_SOURCE"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 11967 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+int
+main (void)
+{
+
+ #ifdef _DEFAULT_SOURCE
+ #error expected _DEFAULT_SOURCE to be undefined
+ #endif
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:11982: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:11985: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:11988: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:11991: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_default_source=no
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_default_source=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:12002: result: $cf_cv_default_source" >&5
+echo "${ECHO_T}$cf_cv_default_source" >&6
+ if test "$cf_cv_default_source" = yes
+ then
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-D_DEFAULT_SOURCE"
+
+ fi
+ fi
+ fi
+
+fi
+
+ ;;
+(minix*)
+ cf_xopen_source="-D_NETBSD_SOURCE" # POSIX.1-2001 features are ifdef'd with this...
+ ;;
+(mirbsd*)
+ # setting _XOPEN_SOURCE or _POSIX_SOURCE breaks <sys/select.h> and other headers which use u_int / u_short types
+ cf_XOPEN_SOURCE=
+
+if test "$cf_cv_posix_visible" = no; then
+
+cf_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE
+
+cf_save_CFLAGS="$CFLAGS"
+cf_save_CPPFLAGS="$CPPFLAGS"
+
+cf_trim_CFLAGS=`echo "$cf_save_CFLAGS" | \
+ sed -e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ ]*\)\?[ ]/ /g' \
+ -e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ ]*\)\?$//g'`
+
+cf_trim_CPPFLAGS=`echo "$cf_save_CPPFLAGS" | \
+ sed -e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ ]*\)\?[ ]/ /g' \
+ -e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ ]*\)\?$//g'`
+
+echo "$as_me:12039: checking if we should define _POSIX_C_SOURCE" >&5
+echo $ECHO_N "checking if we should define _POSIX_C_SOURCE... $ECHO_C" >&6
+if test "${cf_cv_posix_c_source+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+echo "${as_me:-configure}:12045: testing if the symbol is already defined go no further ..." 1>&5
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 12048 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+int
+main (void)
+{
+
+#ifndef _POSIX_C_SOURCE
+make an error
+#endif
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:12063: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:12066: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:12069: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:12072: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_posix_c_source=no
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_want_posix_source=no
+ case .$cf_POSIX_C_SOURCE in
+ (.[12]??*)
+ cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE"
+ ;;
+ (.2)
+ cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE"
+ cf_want_posix_source=yes
+ ;;
+ (.*)
+ cf_want_posix_source=yes
+ ;;
+ esac
+ if test "$cf_want_posix_source" = yes ; then
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 12093 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+int
+main (void)
+{
+
+#ifdef _POSIX_SOURCE
+make an error
+#endif
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:12108: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:12111: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:12114: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:12117: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_posix_c_source="$cf_cv_posix_c_source -D_POSIX_SOURCE"
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ fi
+
+echo "${as_me:-configure}:12128: testing ifdef from value $cf_POSIX_C_SOURCE ..." 1>&5
+
+ CFLAGS="$cf_trim_CFLAGS"
+ CPPFLAGS="$cf_trim_CPPFLAGS"
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}$cf_cv_posix_c_source"
+
+echo "${as_me:-configure}:12136: testing if the second compile does not leave our definition intact error ..." 1>&5
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 12139 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+int
+main (void)
+{
+
+#ifndef _POSIX_C_SOURCE
+make an error
+#endif
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:12154: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:12157: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:12160: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:12163: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_posix_c_source=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ CFLAGS="$cf_save_CFLAGS"
+ CPPFLAGS="$cf_save_CPPFLAGS"
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:12179: result: $cf_cv_posix_c_source" >&5
+echo "${ECHO_T}$cf_cv_posix_c_source" >&6
+
+if test "$cf_cv_posix_c_source" != no ; then
+ CFLAGS="$cf_trim_CFLAGS"
+ CPPFLAGS="$cf_trim_CPPFLAGS"
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_cv_posix_c_source
+do
+case "$cf_fix_cppflags" in
+(no)
+ case "$cf_add_cflags" in
+ (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=yes
+
+ if test "$cf_fix_cppflags" = yes ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ elif test "${cf_tst_cflags}" = "\"'" ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ fi
+ ;;
+ esac
+ case "$CPPFLAGS" in
+ (*$cf_add_cflags)
+ ;;
+ (*)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+ sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \
+ -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'`
+
+ ;;
+ esac
+
+ test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+ cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+ (*)
+
+ test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+ cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+(yes)
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=no
+ ;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+ test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+ CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+ test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+ EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+fi
+
+fi # cf_cv_posix_visible
+
+ ;;
+(netbsd*)
+ cf_xopen_source="-D_NETBSD_SOURCE" # setting _XOPEN_SOURCE breaks IPv6 for lynx on NetBSD 1.6, breaks xterm, is not needed for ncursesw
+ ;;
+(openbsd[6-9]*)
+ # OpenBSD 6.x has broken locale support, both compile-time and runtime.
+ # see https://www.mail-archive.com/bugs@openbsd.org/msg13200.html
+ # Abusing the conformance level is a workaround.
+ { echo "$as_me:12296: WARNING: this system does not provide usable locale support" >&5
+echo "$as_me: WARNING: this system does not provide usable locale support" >&2;}
+ cf_xopen_source="-D_BSD_SOURCE"
+ cf_XOPEN_SOURCE=700
+ ;;
+(openbsd[4-5]*)
+ # setting _XOPEN_SOURCE lower than 500 breaks g++ compile with wchar.h, needed for ncursesw
+ cf_xopen_source="-D_BSD_SOURCE"
+ cf_XOPEN_SOURCE=600
+ ;;
+(openbsd*)
+ # setting _XOPEN_SOURCE breaks xterm on OpenBSD 2.8, is not needed for ncursesw
+ ;;
+(osf[45]*)
+ cf_xopen_source="-D_OSF_SOURCE"
+ ;;
+(nto-qnx*)
+ cf_xopen_source="-D_QNX_SOURCE"
+ ;;
+(sco*)
+ # setting _XOPEN_SOURCE breaks Lynx on SCO Unix / OpenServer
+ ;;
+(solaris2.*)
+ cf_xopen_source="-D__EXTENSIONS__"
+ cf_cv_xopen_source=broken
+ ;;
+(sysv4.2uw2.*) # Novell/SCO UnixWare 2.x (tested on 2.1.2)
+ cf_XOPEN_SOURCE=
+ cf_POSIX_C_SOURCE=
+ ;;
+(*)
+
+echo "$as_me:12328: checking if we should define _XOPEN_SOURCE" >&5
+echo $ECHO_N "checking if we should define _XOPEN_SOURCE... $ECHO_C" >&6
+if test "${cf_cv_xopen_source+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 12335 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+
+int
+main (void)
+{
+
+#ifndef _XOPEN_SOURCE
+make an error
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:12355: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:12358: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:12361: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:12364: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_xopen_source=no
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_save="$CPPFLAGS"
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-D_XOPEN_SOURCE=$cf_XOPEN_SOURCE"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 12376 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+
+int
+main (void)
+{
+
+#ifndef _XOPEN_SOURCE
+make an error
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:12396: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:12399: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:12402: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:12405: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_xopen_source=no
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_xopen_source=$cf_XOPEN_SOURCE
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ CPPFLAGS="$cf_save"
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:12420: result: $cf_cv_xopen_source" >&5
+echo "${ECHO_T}$cf_cv_xopen_source" >&6
+
+if test "$cf_cv_xopen_source" != no ; then
+
+CFLAGS=`echo "$CFLAGS" | \
+ sed -e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ ]*\)\?[ ]/ /g' \
+ -e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ ]*\)\?$//g'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+ sed -e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ ]*\)\?[ ]/ /g' \
+ -e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ ]*\)\?$//g'`
+
+ cf_temp_xopen_source="-D_XOPEN_SOURCE=$cf_cv_xopen_source"
+
+for cf_add_cflags in $cf_temp_xopen_source
+do
+ case "x$cf_add_cflags" in
+ (x-[DU]*)
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+ cf_old_cflag=`echo "x$CFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+ test "$CFLAGS" != "$cf_old_cflag" || break
+
+ CFLAGS="$cf_old_cflag"
+done
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+ cf_old_cflag=`echo "x$CPPFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+ test "$CPPFLAGS" != "$cf_old_cflag" || break
+
+ CPPFLAGS="$cf_old_cflag"
+done
+
+ ;;
+ esac
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_add_cflags
+do
+case "$cf_fix_cppflags" in
+(no)
+ case "$cf_add_cflags" in
+ (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=yes
+
+ if test "$cf_fix_cppflags" = yes ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ elif test "${cf_tst_cflags}" = "\"'" ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ fi
+ ;;
+ esac
+ case "$CPPFLAGS" in
+ (*$cf_add_cflags)
+ ;;
+ (*)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+ sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \
+ -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'`
+
+ ;;
+ esac
+
+ test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+ cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+ (*)
+
+ test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+ cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+(yes)
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=no
+ ;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+ test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+ CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+ test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+ EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+done
+
+fi
+
+ cf_save_xopen_cppflags="$CPPFLAGS"
+
+if test "$cf_cv_posix_visible" = no; then
+
+cf_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE
+
+cf_save_CFLAGS="$CFLAGS"
+cf_save_CPPFLAGS="$CPPFLAGS"
+
+cf_trim_CFLAGS=`echo "$cf_save_CFLAGS" | \
+ sed -e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ ]*\)\?[ ]/ /g' \
+ -e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ ]*\)\?$//g'`
+
+cf_trim_CPPFLAGS=`echo "$cf_save_CPPFLAGS" | \
+ sed -e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ ]*\)\?[ ]/ /g' \
+ -e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ ]*\)\?$//g'`
+
+echo "$as_me:12580: checking if we should define _POSIX_C_SOURCE" >&5
+echo $ECHO_N "checking if we should define _POSIX_C_SOURCE... $ECHO_C" >&6
+if test "${cf_cv_posix_c_source+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+echo "${as_me:-configure}:12586: testing if the symbol is already defined go no further ..." 1>&5
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 12589 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+int
+main (void)
+{
+
+#ifndef _POSIX_C_SOURCE
+make an error
+#endif
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:12604: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:12607: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:12610: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:12613: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_posix_c_source=no
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_want_posix_source=no
+ case .$cf_POSIX_C_SOURCE in
+ (.[12]??*)
+ cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE"
+ ;;
+ (.2)
+ cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE"
+ cf_want_posix_source=yes
+ ;;
+ (.*)
+ cf_want_posix_source=yes
+ ;;
+ esac
+ if test "$cf_want_posix_source" = yes ; then
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 12634 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+int
+main (void)
+{
+
+#ifdef _POSIX_SOURCE
+make an error
+#endif
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:12649: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:12652: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:12655: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:12658: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_posix_c_source="$cf_cv_posix_c_source -D_POSIX_SOURCE"
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ fi
+
+echo "${as_me:-configure}:12669: testing ifdef from value $cf_POSIX_C_SOURCE ..." 1>&5
+
+ CFLAGS="$cf_trim_CFLAGS"
+ CPPFLAGS="$cf_trim_CPPFLAGS"
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}$cf_cv_posix_c_source"
+
+echo "${as_me:-configure}:12677: testing if the second compile does not leave our definition intact error ..." 1>&5
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 12680 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+int
+main (void)
+{
+
+#ifndef _POSIX_C_SOURCE
+make an error
+#endif
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:12695: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:12698: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:12701: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:12704: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_posix_c_source=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ CFLAGS="$cf_save_CFLAGS"
+ CPPFLAGS="$cf_save_CPPFLAGS"
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:12720: result: $cf_cv_posix_c_source" >&5
+echo "${ECHO_T}$cf_cv_posix_c_source" >&6
+
+if test "$cf_cv_posix_c_source" != no ; then
+ CFLAGS="$cf_trim_CFLAGS"
+ CPPFLAGS="$cf_trim_CPPFLAGS"
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_cv_posix_c_source
+do
+case "$cf_fix_cppflags" in
+(no)
+ case "$cf_add_cflags" in
+ (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=yes
+
+ if test "$cf_fix_cppflags" = yes ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ elif test "${cf_tst_cflags}" = "\"'" ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ fi
+ ;;
+ esac
+ case "$CPPFLAGS" in
+ (*$cf_add_cflags)
+ ;;
+ (*)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+ sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \
+ -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'`
+
+ ;;
+ esac
+
+ test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+ cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+ (*)
+
+ test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+ cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+(yes)
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=no
+ ;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+ test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+ CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+ test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+ EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+fi
+
+fi # cf_cv_posix_visible
+
+ # Some of these niche implementations use copy/paste, double-check...
+ if test "$cf_cv_xopen_source" != no ; then
+ test -n "$verbose" && echo " checking if _POSIX_C_SOURCE inteferes" 1>&6
+
+echo "${as_me:-configure}:12833: testing checking if _POSIX_C_SOURCE inteferes ..." 1>&5
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 12836 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+
+int
+main (void)
+{
+
+#ifndef _XOPEN_SOURCE
+make an error
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:12856: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:12859: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:12862: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:12865: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+ { echo "$as_me:12872: WARNING: _POSIX_C_SOURCE definition is not usable" >&5
+echo "$as_me: WARNING: _POSIX_C_SOURCE definition is not usable" >&2;}
+ CPPFLAGS="$cf_save_xopen_cppflags"
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ fi
+ ;;
+esac
+
+if test -n "$cf_xopen_source" ; then
+
+for cf_add_cflags in $cf_xopen_source
+do
+ case "x$cf_add_cflags" in
+ (x-[DU]*)
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+ cf_old_cflag=`echo "x$CFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+ test "$CFLAGS" != "$cf_old_cflag" || break
+ test -n "$verbose" && echo " removing old option $cf_add_cflags from CFLAGS" 1>&6
+
+echo "${as_me:-configure}:12895: testing removing old option $cf_add_cflags from CFLAGS ..." 1>&5
+
+ CFLAGS="$cf_old_cflag"
+done
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+ cf_old_cflag=`echo "x$CPPFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+ test "$CPPFLAGS" != "$cf_old_cflag" || break
+ test -n "$verbose" && echo " removing old option $cf_add_cflags from CPPFLAGS" 1>&6
+
+echo "${as_me:-configure}:12907: testing removing old option $cf_add_cflags from CPPFLAGS ..." 1>&5
+
+ CPPFLAGS="$cf_old_cflag"
+done
+
+ ;;
+ esac
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_add_cflags
+do
+case "$cf_fix_cppflags" in
+(no)
+ case "$cf_add_cflags" in
+ (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=yes
+
+ if test "$cf_fix_cppflags" = yes ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ elif test "${cf_tst_cflags}" = "\"'" ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ fi
+ ;;
+ esac
+ case "$CPPFLAGS" in
+ (*$cf_add_cflags)
+ ;;
+ (*)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+ sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \
+ -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'`
+
+ ;;
+ esac
+
+ test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+ cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+ (*)
+
+ test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+ cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+(yes)
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=no
+ ;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+ test -n "$verbose" && echo " add to \$CFLAGS $cf_new_cflags" 1>&6
+
+echo "${as_me:-configure}:12995: testing add to \$CFLAGS $cf_new_cflags ..." 1>&5
+
+ test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+ CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+ test -n "$verbose" && echo " add to \$CPPFLAGS $cf_new_cppflags" 1>&6
+
+echo "${as_me:-configure}:13005: testing add to \$CPPFLAGS $cf_new_cppflags ..." 1>&5
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+ test -n "$verbose" && echo " add to \$EXTRA_CPPFLAGS $cf_new_extra_cppflags" 1>&6
+
+echo "${as_me:-configure}:13015: testing add to \$EXTRA_CPPFLAGS $cf_new_extra_cppflags ..." 1>&5
+
+ test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+ EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+done
+
+fi
+
+if test -n "$cf_XOPEN_SOURCE" && test -z "$cf_cv_xopen_source" ; then
+ echo "$as_me:13027: checking if _XOPEN_SOURCE really is set" >&5
+echo $ECHO_N "checking if _XOPEN_SOURCE really is set... $ECHO_C" >&6
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 13030 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+int
+main (void)
+{
+
+#ifndef _XOPEN_SOURCE
+make an error
+#endif
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:13045: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:13048: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:13051: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:13054: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_XOPEN_SOURCE_set=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_XOPEN_SOURCE_set=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ echo "$as_me:13063: result: $cf_XOPEN_SOURCE_set" >&5
+echo "${ECHO_T}$cf_XOPEN_SOURCE_set" >&6
+ if test "$cf_XOPEN_SOURCE_set" = yes
+ then
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 13068 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+int
+main (void)
+{
+
+#if (_XOPEN_SOURCE - 0) < $cf_XOPEN_SOURCE
+make an error
+#endif
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:13083: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:13086: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:13089: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:13092: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_XOPEN_SOURCE_set_ok=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_XOPEN_SOURCE_set_ok=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ if test "$cf_XOPEN_SOURCE_set_ok" = no
+ then
+ { echo "$as_me:13103: WARNING: _XOPEN_SOURCE is lower than requested" >&5
+echo "$as_me: WARNING: _XOPEN_SOURCE is lower than requested" >&2;}
+ fi
+ else
+
+echo "$as_me:13108: checking if we should define _XOPEN_SOURCE" >&5
+echo $ECHO_N "checking if we should define _XOPEN_SOURCE... $ECHO_C" >&6
+if test "${cf_cv_xopen_source+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 13115 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+
+int
+main (void)
+{
+
+#ifndef _XOPEN_SOURCE
+make an error
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:13135: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:13138: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:13141: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:13144: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_xopen_source=no
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_save="$CPPFLAGS"
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-D_XOPEN_SOURCE=$cf_XOPEN_SOURCE"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 13156 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+
+int
+main (void)
+{
+
+#ifndef _XOPEN_SOURCE
+make an error
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:13176: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:13179: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:13182: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:13185: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_xopen_source=no
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_xopen_source=$cf_XOPEN_SOURCE
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ CPPFLAGS="$cf_save"
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:13200: result: $cf_cv_xopen_source" >&5
+echo "${ECHO_T}$cf_cv_xopen_source" >&6
+
+if test "$cf_cv_xopen_source" != no ; then
+
+CFLAGS=`echo "$CFLAGS" | \
+ sed -e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ ]*\)\?[ ]/ /g' \
+ -e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ ]*\)\?$//g'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+ sed -e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ ]*\)\?[ ]/ /g' \
+ -e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ ]*\)\?$//g'`
+
+ cf_temp_xopen_source="-D_XOPEN_SOURCE=$cf_cv_xopen_source"
+
+for cf_add_cflags in $cf_temp_xopen_source
+do
+ case "x$cf_add_cflags" in
+ (x-[DU]*)
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+ cf_old_cflag=`echo "x$CFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+ test "$CFLAGS" != "$cf_old_cflag" || break
+
+ CFLAGS="$cf_old_cflag"
+done
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+ cf_old_cflag=`echo "x$CPPFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+ test "$CPPFLAGS" != "$cf_old_cflag" || break
+
+ CPPFLAGS="$cf_old_cflag"
+done
+
+ ;;
+ esac
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_add_cflags
+do
+case "$cf_fix_cppflags" in
+(no)
+ case "$cf_add_cflags" in
+ (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=yes
+
+ if test "$cf_fix_cppflags" = yes ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ elif test "${cf_tst_cflags}" = "\"'" ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ fi
+ ;;
+ esac
+ case "$CPPFLAGS" in
+ (*$cf_add_cflags)
+ ;;
+ (*)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+ sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \
+ -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'`
+
+ ;;
+ esac
+
+ test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+ cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+ (*)
+
+ test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+ cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+(yes)
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=no
+ ;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+ test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+ CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+ test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+ EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+done
+
+fi
+
+ fi
+fi
+fi # cf_cv_posix_visible
+
+echo "$as_me:13347: checking if SIGWINCH is defined" >&5
+echo $ECHO_N "checking if SIGWINCH is defined... $ECHO_C" >&6
+if test "${cf_cv_define_sigwinch+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 13354 "configure"
+#include "confdefs.h"
+
+#include <sys/types.h>
+#include <sys/signal.h>
+
+int
+main (void)
+{
+int x = SIGWINCH; (void)x
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:13369: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:13372: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:13375: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:13378: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_define_sigwinch=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 13385 "configure"
+#include "confdefs.h"
+
+#undef _XOPEN_SOURCE
+#undef _POSIX_SOURCE
+#undef _POSIX_C_SOURCE
+#include <sys/types.h>
+#include <sys/signal.h>
+
+int
+main (void)
+{
+int x = SIGWINCH; (void)x
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:13403: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:13406: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:13409: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:13412: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_define_sigwinch=maybe
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_define_sigwinch=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:13426: result: $cf_cv_define_sigwinch" >&5
+echo "${ECHO_T}$cf_cv_define_sigwinch" >&6
+
+if test "$cf_cv_define_sigwinch" = maybe ; then
+echo "$as_me:13430: checking for actual SIGWINCH definition" >&5
+echo $ECHO_N "checking for actual SIGWINCH definition... $ECHO_C" >&6
+if test "${cf_cv_fixup_sigwinch+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cf_cv_fixup_sigwinch=unknown
+cf_sigwinch=32
+while test "$cf_sigwinch" != 1
+do
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 13441 "configure"
+#include "confdefs.h"
+
+#undef _XOPEN_SOURCE
+#undef _POSIX_SOURCE
+#undef _POSIX_C_SOURCE
+#include <sys/types.h>
+#include <sys/signal.h>
+
+int
+main (void)
+{
+
+#if SIGWINCH != $cf_sigwinch
+make an error
+#endif
+int x = SIGWINCH; (void)x
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:13463: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:13466: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:13469: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:13472: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_fixup_sigwinch=$cf_sigwinch
+ break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+cf_sigwinch="`expr "$cf_sigwinch" - 1`"
+done
+
+fi
+echo "$as_me:13486: result: $cf_cv_fixup_sigwinch" >&5
+echo "${ECHO_T}$cf_cv_fixup_sigwinch" >&6
+
+ if test "$cf_cv_fixup_sigwinch" != unknown ; then
+ CPPFLAGS="$CPPFLAGS -DSIGWINCH=$cf_cv_fixup_sigwinch"
+ fi
+fi
+
+if test -n "$TRY_CFLAGS" ; then
+
+test -n "$verbose" && echo " checking additions to CFLAGS" 1>&6
+
+echo "${as_me:-configure}:13498: testing checking additions to CFLAGS ..." 1>&5
+
+cf_check_cflags="$CFLAGS"
+cf_check_cppflags="$CPPFLAGS"
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $TRY_CFLAGS
+do
+case "$cf_fix_cppflags" in
+(no)
+ case "$cf_add_cflags" in
+ (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=yes
+
+ if test "$cf_fix_cppflags" = yes ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ elif test "${cf_tst_cflags}" = "\"'" ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ fi
+ ;;
+ esac
+ case "$CPPFLAGS" in
+ (*$cf_add_cflags)
+ ;;
+ (*)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+ sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \
+ -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'`
+
+ ;;
+ esac
+
+ test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+ cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+ (*)
+
+ test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+ cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+(yes)
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=no
+ ;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+ test -n "$verbose" && echo " add to \$CFLAGS $cf_new_cflags" 1>&6
+
+echo "${as_me:-configure}:13583: testing add to \$CFLAGS $cf_new_cflags ..." 1>&5
+
+ test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+ CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+ test -n "$verbose" && echo " add to \$CPPFLAGS $cf_new_cppflags" 1>&6
+
+echo "${as_me:-configure}:13593: testing add to \$CPPFLAGS $cf_new_cppflags ..." 1>&5
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+ test -n "$verbose" && echo " add to \$EXTRA_CPPFLAGS $cf_new_extra_cppflags" 1>&6
+
+echo "${as_me:-configure}:13603: testing add to \$EXTRA_CPPFLAGS $cf_new_extra_cppflags ..." 1>&5
+
+ test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+ EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+if test "x$cf_check_cflags" != "x$CFLAGS" ; then
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 13612 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello world");
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:13624: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:13627: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:13630: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:13633: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+test -n "$verbose" && echo " test-compile failed. Undoing change to \$CFLAGS" 1>&6
+
+echo "${as_me:-configure}:13641: testing test-compile failed. Undoing change to \$CFLAGS ..." 1>&5
+
+ if test "x$cf_check_cppflags" != "x$CPPFLAGS" ; then
+ test -n "$verbose" && echo " but keeping change to \$CPPFLAGS" 1>&6
+
+echo "${as_me:-configure}:13646: testing but keeping change to \$CPPFLAGS ..." 1>&5
+
+ fi
+ CFLAGS="$cf_check_cflags"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+
+fi
+
+### Look for network libraries first, since some functions (such as gethostname)
+### are used in a lot of places.
+echo "$as_me:13658: checking if you want NSS compatible SSL libraries" >&5
+echo $ECHO_N "checking if you want NSS compatible SSL libraries... $ECHO_C" >&6
+if test "${cf_cv_use_libnss_compat+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+# Check whether --with-nss-compat or --without-nss-compat was given.
+if test "${with_nss_compat+set}" = set; then
+ withval="$with_nss_compat"
+ cf_cv_use_libnss_compat=$withval
+else
+ cf_cv_use_libnss_compat=no
+fi;
+
+fi
+echo "$as_me:13673: result: $cf_cv_use_libnss_compat" >&5
+echo "${ECHO_T}$cf_cv_use_libnss_compat" >&6
+
+echo "$as_me:13676: checking if you want ssl library" >&5
+echo $ECHO_N "checking if you want ssl library... $ECHO_C" >&6
+if test "${cf_cv_use_libssl+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+# Check whether --with-ssl or --without-ssl was given.
+if test "${with_ssl+set}" = set; then
+ withval="$with_ssl"
+ cf_cv_use_libssl=$withval
+else
+ cf_cv_use_libssl=no
+fi;
+
+fi
+echo "$as_me:13691: result: $cf_cv_use_libssl" >&5
+echo "${ECHO_T}$cf_cv_use_libssl" >&6
+
+echo "$as_me:13694: checking if you want gnutls support" >&5
+echo $ECHO_N "checking if you want gnutls support... $ECHO_C" >&6
+if test "${cf_cv_use_libgnutls+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+# Check whether --with-gnutls or --without-gnutls was given.
+if test "${with_gnutls+set}" = set; then
+ withval="$with_gnutls"
+ cf_cv_use_libgnutls=$withval
+else
+ cf_cv_use_libgnutls=no
+fi;
+
+fi
+echo "$as_me:13709: result: $cf_cv_use_libgnutls" >&5
+echo "${ECHO_T}$cf_cv_use_libgnutls" >&6
+
+# this option is mainly for comparing with/without Lynx's wrapper for GNUTLS.
+echo "$as_me:13713: checking if you want gnutls-openssl compat" >&5
+echo $ECHO_N "checking if you want gnutls-openssl compat... $ECHO_C" >&6
+if test "${cf_cv_gnutls_compat+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+# Check whether --enable-gnutls-compat or --disable-gnutls-compat was given.
+if test "${enable_gnutls_compat+set}" = set; then
+ enableval="$enable_gnutls_compat"
+ cf_cv_gnutls_compat=$enableval
+else
+ cf_cv_gnutls_compat=no
+fi;
+
+fi
+echo "$as_me:13728: result: $cf_cv_gnutls_compat" >&5
+echo "${ECHO_T}$cf_cv_gnutls_compat" >&6
+
+echo "$as_me:13731: checking if you want socks library" >&5
+echo $ECHO_N "checking if you want socks library... $ECHO_C" >&6
+if test "${cf_cv_use_libsocks+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+# Check whether --with-socks or --without-socks was given.
+if test "${with_socks+set}" = set; then
+ withval="$with_socks"
+ cf_cv_use_libsocks=$withval
+else
+ cf_cv_use_libsocks=no
+fi;
+
+fi
+echo "$as_me:13746: result: $cf_cv_use_libsocks" >&5
+echo "${ECHO_T}$cf_cv_use_libsocks" >&6
+
+echo "$as_me:13749: checking if you want socks5 library" >&5
+echo $ECHO_N "checking if you want socks5 library... $ECHO_C" >&6
+if test "${cf_cv_use_libsocks5+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+# Check whether --with-socks5 or --without-socks5 was given.
+if test "${with_socks5+set}" = set; then
+ withval="$with_socks5"
+ cf_cv_use_libsocks5=$withval
+else
+ cf_cv_use_libsocks5=no
+fi;
+
+fi
+echo "$as_me:13764: result: $cf_cv_use_libsocks5" >&5
+echo "${ECHO_T}$cf_cv_use_libsocks5" >&6
+
+if test "x$cf_cv_use_libsocks" != xno ; then
+
+case "$cf_cv_use_libsocks" in
+(no)
+ ;;
+(yes)
+ ;;
+(*)
+
+for cf_searchpath in `echo "$cf_cv_use_libsocks" | tr $PATH_SEPARATOR ' '`; do
+ if test -d "$cf_searchpath/include" ; then
+
+if test -n "$cf_searchpath/include" ; then
+ for cf_add_incdir in $cf_searchpath/include
+ do
+ while test "$cf_add_incdir" != /usr/include
+ do
+ if test -d "$cf_add_incdir"
+ then
+ cf_have_incdir=no
+ if test -n "$CFLAGS$CPPFLAGS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+ if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+ cf_have_incdir=yes; break
+ fi
+ done
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ if test "$cf_add_incdir" = /usr/local/include ; then
+ if test "$GCC" = yes
+ then
+ cf_save_CPPFLAGS=$CPPFLAGS
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 13806 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:13818: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:13821: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:13824: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:13827: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ CPPFLAGS=$cf_save_CPPFLAGS
+ fi
+ fi
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:13844: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+ CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+ cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+ test "$cf_top_incdir" = "$cf_add_incdir" && break
+ cf_add_incdir="$cf_top_incdir"
+ else
+ break
+ fi
+ else
+ break
+ fi
+ done
+ done
+fi
+
+ elif test -d "$cf_searchpath/../include" ; then
+
+if test -n "$cf_searchpath/../include" ; then
+ for cf_add_incdir in $cf_searchpath/../include
+ do
+ while test "$cf_add_incdir" != /usr/include
+ do
+ if test -d "$cf_add_incdir"
+ then
+ cf_have_incdir=no
+ if test -n "$CFLAGS$CPPFLAGS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+ if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+ cf_have_incdir=yes; break
+ fi
+ done
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ if test "$cf_add_incdir" = /usr/local/include ; then
+ if test "$GCC" = yes
+ then
+ cf_save_CPPFLAGS=$CPPFLAGS
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 13890 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:13902: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:13905: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:13908: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:13911: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ CPPFLAGS=$cf_save_CPPFLAGS
+ fi
+ fi
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:13928: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+ CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+ cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+ test "$cf_top_incdir" = "$cf_add_incdir" && break
+ cf_add_incdir="$cf_top_incdir"
+ else
+ break
+ fi
+ else
+ break
+ fi
+ done
+ done
+fi
+
+ else
+{ { echo "$as_me:13946: error: cannot find socks library under $cf_cv_use_libsocks" >&5
+echo "$as_me: error: cannot find socks library under $cf_cv_use_libsocks" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+ if test -d "$cf_searchpath/lib" ; then
+
+if test -n "$cf_searchpath/lib" ; then
+ for cf_add_libdir in $cf_searchpath/lib
+ do
+ if test "$cf_add_libdir" = /usr/lib ; then
+ :
+ elif test -d "$cf_add_libdir"
+ then
+ cf_have_libdir=no
+ if test -n "$LDFLAGS$LIBS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_libdir in $LDFLAGS $LIBS ; do
+ if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
+ cf_have_libdir=yes; break
+ fi
+ done
+ fi
+ if test "$cf_have_libdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
+
+echo "${as_me:-configure}:13971: testing adding $cf_add_libdir to library-path ..." 1>&5
+
+ LDFLAGS="-L$cf_add_libdir $LDFLAGS"
+ fi
+ fi
+ done
+fi
+
+ elif test -d "$cf_searchpath" ; then
+
+if test -n "$cf_searchpath" ; then
+ for cf_add_libdir in $cf_searchpath
+ do
+ if test "$cf_add_libdir" = /usr/lib ; then
+ :
+ elif test -d "$cf_add_libdir"
+ then
+ cf_have_libdir=no
+ if test -n "$LDFLAGS$LIBS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_libdir in $LDFLAGS $LIBS ; do
+ if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
+ cf_have_libdir=yes; break
+ fi
+ done
+ fi
+ if test "$cf_have_libdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
+
+echo "${as_me:-configure}:14000: testing adding $cf_add_libdir to library-path ..." 1>&5
+
+ LDFLAGS="-L$cf_add_libdir $LDFLAGS"
+ fi
+ fi
+ done
+fi
+
+ else
+{ { echo "$as_me:14009: error: cannot find socks library under $cf_cv_use_libsocks" >&5
+echo "$as_me: error: cannot find socks library under $cf_cv_use_libsocks" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+done
+
+ ;;
+esac
+
+# If the linkage is not already in the $CPPFLAGS/$LDFLAGS configuration, these
+# will be set on completion of the AC_TRY_LINK below.
+cf_cv_header_path_socks=
+cf_cv_library_path_socks=
+
+echo "${as_me:-configure}:14023: testing Starting FIND_LINKAGE(socks,) ..." 1>&5
+
+cf_save_LIBS="$LIBS"
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 14028 "configure"
+#include "confdefs.h"
+
+#include <stdio.h>
+
+int
+main (void)
+{
+
+ Raccept((char *)0)
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:14044: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:14047: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:14050: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:14053: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ cf_cv_find_linkage_socks=yes
+ cf_cv_header_path_socks=/usr/include
+ cf_cv_library_path_socks=/usr/lib
+
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+LIBS="-lsocks $cf_save_LIBS"
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 14067 "configure"
+#include "confdefs.h"
+
+#include <stdio.h>
+
+int
+main (void)
+{
+
+ Raccept((char *)0)
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:14083: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:14086: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:14089: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:14092: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ cf_cv_find_linkage_socks=yes
+ cf_cv_header_path_socks=/usr/include
+ cf_cv_library_path_socks=/usr/lib
+ cf_cv_library_file_socks="-lsocks"
+
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+ cf_cv_find_linkage_socks=no
+ LIBS="$cf_save_LIBS"
+
+ test -n "$verbose" && echo " find linkage for socks library" 1>&6
+
+echo "${as_me:-configure}:14109: testing find linkage for socks library ..." 1>&5
+
+echo "${as_me:-configure}:14111: testing Searching for headers in FIND_LINKAGE(socks,) ..." 1>&5
+
+ cf_save_CPPFLAGS="$CPPFLAGS"
+ cf_test_CPPFLAGS="$CPPFLAGS"
+
+cf_search=
+
+# collect the current set of include-directories from compiler flags
+cf_header_path_list=""
+if test -n "${CFLAGS}${CPPFLAGS}" ; then
+ for cf_header_path in $CPPFLAGS $CFLAGS
+ do
+ case "$cf_header_path" in
+ (-I*)
+ cf_header_path=`echo ".$cf_header_path" |sed -e 's/^...//' -e 's,/include$,,'`
+
+test "x$cf_header_path" != "xNONE" && \
+test -d "$cf_header_path" && \
+ {
+ test -n "$verbose" && echo " ... testing for include-directories under $cf_header_path"
+ test -d "$cf_header_path/include" && cf_search="$cf_search $cf_header_path/include"
+ test -d "$cf_header_path/include/socks" && cf_search="$cf_search $cf_header_path/include/socks"
+ test -d "$cf_header_path/include/socks/include" && cf_search="$cf_search $cf_header_path/include/socks/include"
+ test -d "$cf_header_path/socks/include" && cf_search="$cf_search $cf_header_path/socks/include"
+ test -d "$cf_header_path/socks/include/socks" && cf_search="$cf_search $cf_header_path/socks/include/socks"
+}
+
+ cf_header_path_list="$cf_header_path_list $cf_search"
+ ;;
+ esac
+ done
+fi
+
+# add the variations for the package we are looking for
+
+cf_search=
+
+test "x$prefix" != "xNONE" && \
+test -d "$prefix" && \
+ {
+ test -n "$verbose" && echo " ... testing for include-directories under $prefix"
+ test -d "$prefix/include" && cf_search="$cf_search $prefix/include"
+ test -d "$prefix/include/socks" && cf_search="$cf_search $prefix/include/socks"
+ test -d "$prefix/include/socks/include" && cf_search="$cf_search $prefix/include/socks/include"
+ test -d "$prefix/socks/include" && cf_search="$cf_search $prefix/socks/include"
+ test -d "$prefix/socks/include/socks" && cf_search="$cf_search $prefix/socks/include/socks"
+}
+
+for cf_subdir_prefix in \
+ /usr \
+ /usr/local \
+ /usr/pkg \
+ /opt \
+ /opt/local \
+ $HOME
+do
+
+test "x$cf_subdir_prefix" != "x$prefix" && \
+test -d "$cf_subdir_prefix" && \
+{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
+ test -n "$verbose" && echo " ... testing for include-directories under $cf_subdir_prefix"
+ test -d "$cf_subdir_prefix/include" && cf_search="$cf_search $cf_subdir_prefix/include"
+ test -d "$cf_subdir_prefix/include/socks" && cf_search="$cf_search $cf_subdir_prefix/include/socks"
+ test -d "$cf_subdir_prefix/include/socks/include" && cf_search="$cf_search $cf_subdir_prefix/include/socks/include"
+ test -d "$cf_subdir_prefix/socks/include" && cf_search="$cf_search $cf_subdir_prefix/socks/include"
+ test -d "$cf_subdir_prefix/socks/include/socks" && cf_search="$cf_search $cf_subdir_prefix/socks/include/socks"
+}
+
+done
+
+test "$includedir" != NONE && \
+test "$includedir" != "/usr/include" && \
+test -d "$includedir" && {
+ test -d "$includedir" && cf_search="$cf_search $includedir"
+ test -d "$includedir/socks" && cf_search="$cf_search $includedir/socks"
+}
+
+test "$oldincludedir" != NONE && \
+test "$oldincludedir" != "/usr/include" && \
+test -d "$oldincludedir" && {
+ test -d "$oldincludedir" && cf_search="$cf_search $oldincludedir"
+ test -d "$oldincludedir/socks" && cf_search="$cf_search $oldincludedir/socks"
+}
+
+cf_search="$cf_search $cf_header_path_list"
+
+ for cf_cv_header_path_socks in $cf_search
+ do
+ if test -d "$cf_cv_header_path_socks" ; then
+ test -n "$verbose" && echo " ... testing $cf_cv_header_path_socks" 1>&6
+
+echo "${as_me:-configure}:14202: testing ... testing $cf_cv_header_path_socks ..." 1>&5
+
+ CPPFLAGS="$cf_save_CPPFLAGS"
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_cv_header_path_socks"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 14210 "configure"
+#include "confdefs.h"
+
+#include <stdio.h>
+
+int
+main (void)
+{
+
+ Raccept((char *)0)
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:14226: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:14229: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:14232: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:14235: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ test -n "$verbose" && echo " ... found socks headers in $cf_cv_header_path_socks" 1>&6
+
+echo "${as_me:-configure}:14240: testing ... found socks headers in $cf_cv_header_path_socks ..." 1>&5
+
+ cf_cv_find_linkage_socks=maybe
+ cf_test_CPPFLAGS="$CPPFLAGS"
+ break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+ CPPFLAGS="$cf_save_CPPFLAGS"
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ fi
+ done
+
+ if test "$cf_cv_find_linkage_socks" = maybe ; then
+
+echo "${as_me:-configure}:14258: testing Searching for socks library in FIND_LINKAGE(socks,) ..." 1>&5
+
+ cf_save_LIBS="$LIBS"
+ cf_save_LDFLAGS="$LDFLAGS"
+
+ if test "$cf_cv_find_linkage_socks" != yes ; then
+
+cf_search=
+cf_library_path_list=""
+if test -n "${LDFLAGS}${LIBS}" ; then
+ for cf_library_path in $LDFLAGS $LIBS
+ do
+ case "$cf_library_path" in
+ (-L*)
+ cf_library_path=`echo ".$cf_library_path" |sed -e 's/^...//' -e 's,/lib$,,'`
+
+test "x$cf_library_path" != "xNONE" && \
+test -d "$cf_library_path" && \
+ {
+ test -n "$verbose" && echo " ... testing for lib-directories under $cf_library_path"
+ test -d "$cf_library_path/lib" && cf_search="$cf_search $cf_library_path/lib"
+ test -d "$cf_library_path/lib/socks" && cf_search="$cf_search $cf_library_path/lib/socks"
+ test -d "$cf_library_path/lib/socks/lib" && cf_search="$cf_search $cf_library_path/lib/socks/lib"
+ test -d "$cf_library_path/socks/lib" && cf_search="$cf_search $cf_library_path/socks/lib"
+ test -d "$cf_library_path/socks/lib/socks" && cf_search="$cf_search $cf_library_path/socks/lib/socks"
+}
+
+ cf_library_path_list="$cf_library_path_list $cf_search"
+ ;;
+ esac
+ done
+fi
+
+cf_search=
+
+test "x$prefix" != "xNONE" && \
+test -d "$prefix" && \
+ {
+ test -n "$verbose" && echo " ... testing for lib-directories under $prefix"
+ test -d "$prefix/lib" && cf_search="$cf_search $prefix/lib"
+ test -d "$prefix/lib/socks" && cf_search="$cf_search $prefix/lib/socks"
+ test -d "$prefix/lib/socks/lib" && cf_search="$cf_search $prefix/lib/socks/lib"
+ test -d "$prefix/socks/lib" && cf_search="$cf_search $prefix/socks/lib"
+ test -d "$prefix/socks/lib/socks" && cf_search="$cf_search $prefix/socks/lib/socks"
+}
+
+for cf_subdir_prefix in \
+ /usr \
+ /usr/local \
+ /usr/pkg \
+ /opt \
+ /opt/local \
+ $HOME
+do
+
+test "x$cf_subdir_prefix" != "x$prefix" && \
+test -d "$cf_subdir_prefix" && \
+{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
+ test -n "$verbose" && echo " ... testing for lib-directories under $cf_subdir_prefix"
+ test -d "$cf_subdir_prefix/lib" && cf_search="$cf_search $cf_subdir_prefix/lib"
+ test -d "$cf_subdir_prefix/lib/socks" && cf_search="$cf_search $cf_subdir_prefix/lib/socks"
+ test -d "$cf_subdir_prefix/lib/socks/lib" && cf_search="$cf_search $cf_subdir_prefix/lib/socks/lib"
+ test -d "$cf_subdir_prefix/socks/lib" && cf_search="$cf_search $cf_subdir_prefix/socks/lib"
+ test -d "$cf_subdir_prefix/socks/lib/socks" && cf_search="$cf_search $cf_subdir_prefix/socks/lib/socks"
+}
+
+done
+
+cf_search="$cf_library_path_list $cf_search"
+
+ for cf_cv_library_path_socks in $cf_search
+ do
+ if test -d "$cf_cv_library_path_socks" ; then
+ test -n "$verbose" && echo " ... testing $cf_cv_library_path_socks" 1>&6
+
+echo "${as_me:-configure}:14333: testing ... testing $cf_cv_library_path_socks ..." 1>&5
+
+ CPPFLAGS="$cf_test_CPPFLAGS"
+ LIBS="-lsocks $cf_save_LIBS"
+ LDFLAGS="$cf_save_LDFLAGS -L$cf_cv_library_path_socks"
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 14339 "configure"
+#include "confdefs.h"
+
+#include <stdio.h>
+
+int
+main (void)
+{
+
+ Raccept((char *)0)
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:14355: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:14358: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:14361: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:14364: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ test -n "$verbose" && echo " ... found socks library in $cf_cv_library_path_socks" 1>&6
+
+echo "${as_me:-configure}:14369: testing ... found socks library in $cf_cv_library_path_socks ..." 1>&5
+
+ cf_cv_find_linkage_socks=yes
+ cf_cv_library_file_socks="-lsocks"
+ break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+ CPPFLAGS="$cf_save_CPPFLAGS"
+ LIBS="$cf_save_LIBS"
+ LDFLAGS="$cf_save_LDFLAGS"
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+ fi
+ done
+ CPPFLAGS="$cf_save_CPPFLAGS"
+ LDFLAGS="$cf_save_LDFLAGS"
+ fi
+
+ else
+ cf_cv_find_linkage_socks=no
+ fi
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+LIBS="$cf_save_LIBS"
+
+if test "$cf_cv_find_linkage_socks" = yes ; then
+
+if test -n "$cf_cv_header_path_socks" ; then
+ for cf_add_incdir in $cf_cv_header_path_socks
+ do
+ while test "$cf_add_incdir" != /usr/include
+ do
+ if test -d "$cf_add_incdir"
+ then
+ cf_have_incdir=no
+ if test -n "$CFLAGS$CPPFLAGS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+ if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+ cf_have_incdir=yes; break
+ fi
+ done
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ if test "$cf_add_incdir" = /usr/local/include ; then
+ if test "$GCC" = yes
+ then
+ cf_save_CPPFLAGS=$CPPFLAGS
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 14431 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:14443: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:14446: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:14449: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:14452: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ CPPFLAGS=$cf_save_CPPFLAGS
+ fi
+ fi
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:14469: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+ CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+ cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+ test "$cf_top_incdir" = "$cf_add_incdir" && break
+ cf_add_incdir="$cf_top_incdir"
+ else
+ break
+ fi
+ else
+ break
+ fi
+ done
+ done
+fi
+
+if test -n "$cf_cv_library_path_socks" ; then
+ for cf_add_libdir in $cf_cv_library_path_socks
+ do
+ if test "$cf_add_libdir" = /usr/lib ; then
+ :
+ elif test -d "$cf_add_libdir"
+ then
+ cf_have_libdir=no
+ if test -n "$LDFLAGS$LIBS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_libdir in $LDFLAGS $LIBS ; do
+ if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
+ cf_have_libdir=yes; break
+ fi
+ done
+ fi
+ if test "$cf_have_libdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
+
+echo "${as_me:-configure}:14505: testing adding $cf_add_libdir to library-path ..." 1>&5
+
+ LDFLAGS="-L$cf_add_libdir $LDFLAGS"
+ fi
+ fi
+ done
+fi
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lsocks; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+else
+{ echo "$as_me:14530: WARNING: Cannot find socks library" >&5
+echo "$as_me: WARNING: Cannot find socks library" >&2;}
+fi
+
+ if test "x$cf_cv_find_linkage_socks" = "xyes" ; then
+
+cat >>confdefs.h <<\EOF
+#define SOCKS 1
+EOF
+
+cat >>confdefs.h <<\EOF
+#define accept Raccept
+EOF
+
+cat >>confdefs.h <<\EOF
+#define bind Rbind
+EOF
+
+cat >>confdefs.h <<\EOF
+#define connect Rconnect
+EOF
+
+cat >>confdefs.h <<\EOF
+#define getpeername Rgetpeername
+EOF
+
+cat >>confdefs.h <<\EOF
+#define getsockname Rgetsockname
+EOF
+
+cat >>confdefs.h <<\EOF
+#define listen Rlisten
+EOF
+
+cat >>confdefs.h <<\EOF
+#define recvfrom Rrecvfrom
+EOF
+
+cat >>confdefs.h <<\EOF
+#define select Rselect
+EOF
+
+ else
+ { { echo "$as_me:14573: error: cannot link with socks library" >&5
+echo "$as_me: error: cannot link with socks library" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+
+elif test "x$cf_cv_use_libsocks5" != xno ; then
+
+case "$cf_cv_use_libsocks5" in
+(no)
+ ;;
+(yes)
+ ;;
+(*)
+
+for cf_searchpath in `echo "$cf_cv_use_libsocks5" | tr $PATH_SEPARATOR ' '`; do
+ if test -d "$cf_searchpath/include" ; then
+
+if test -n "$cf_searchpath/include" ; then
+ for cf_add_incdir in $cf_searchpath/include
+ do
+ while test "$cf_add_incdir" != /usr/include
+ do
+ if test -d "$cf_add_incdir"
+ then
+ cf_have_incdir=no
+ if test -n "$CFLAGS$CPPFLAGS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+ if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+ cf_have_incdir=yes; break
+ fi
+ done
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ if test "$cf_add_incdir" = /usr/local/include ; then
+ if test "$GCC" = yes
+ then
+ cf_save_CPPFLAGS=$CPPFLAGS
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 14617 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:14629: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:14632: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:14635: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:14638: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ CPPFLAGS=$cf_save_CPPFLAGS
+ fi
+ fi
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:14655: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+ CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+ cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+ test "$cf_top_incdir" = "$cf_add_incdir" && break
+ cf_add_incdir="$cf_top_incdir"
+ else
+ break
+ fi
+ else
+ break
+ fi
+ done
+ done
+fi
+
+ elif test -d "$cf_searchpath/../include" ; then
+
+if test -n "$cf_searchpath/../include" ; then
+ for cf_add_incdir in $cf_searchpath/../include
+ do
+ while test "$cf_add_incdir" != /usr/include
+ do
+ if test -d "$cf_add_incdir"
+ then
+ cf_have_incdir=no
+ if test -n "$CFLAGS$CPPFLAGS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+ if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+ cf_have_incdir=yes; break
+ fi
+ done
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ if test "$cf_add_incdir" = /usr/local/include ; then
+ if test "$GCC" = yes
+ then
+ cf_save_CPPFLAGS=$CPPFLAGS
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 14701 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:14713: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:14716: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:14719: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:14722: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ CPPFLAGS=$cf_save_CPPFLAGS
+ fi
+ fi
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:14739: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+ CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+ cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+ test "$cf_top_incdir" = "$cf_add_incdir" && break
+ cf_add_incdir="$cf_top_incdir"
+ else
+ break
+ fi
+ else
+ break
+ fi
+ done
+ done
+fi
+
+ else
+{ { echo "$as_me:14757: error: cannot find socks5 library under $cf_cv_use_libsocks5" >&5
+echo "$as_me: error: cannot find socks5 library under $cf_cv_use_libsocks5" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+ if test -d "$cf_searchpath/lib" ; then
+
+if test -n "$cf_searchpath/lib" ; then
+ for cf_add_libdir in $cf_searchpath/lib
+ do
+ if test "$cf_add_libdir" = /usr/lib ; then
+ :
+ elif test -d "$cf_add_libdir"
+ then
+ cf_have_libdir=no
+ if test -n "$LDFLAGS$LIBS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_libdir in $LDFLAGS $LIBS ; do
+ if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
+ cf_have_libdir=yes; break
+ fi
+ done
+ fi
+ if test "$cf_have_libdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
+
+echo "${as_me:-configure}:14782: testing adding $cf_add_libdir to library-path ..." 1>&5
+
+ LDFLAGS="-L$cf_add_libdir $LDFLAGS"
+ fi
+ fi
+ done
+fi
+
+ elif test -d "$cf_searchpath" ; then
+
+if test -n "$cf_searchpath" ; then
+ for cf_add_libdir in $cf_searchpath
+ do
+ if test "$cf_add_libdir" = /usr/lib ; then
+ :
+ elif test -d "$cf_add_libdir"
+ then
+ cf_have_libdir=no
+ if test -n "$LDFLAGS$LIBS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_libdir in $LDFLAGS $LIBS ; do
+ if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
+ cf_have_libdir=yes; break
+ fi
+ done
+ fi
+ if test "$cf_have_libdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
+
+echo "${as_me:-configure}:14811: testing adding $cf_add_libdir to library-path ..." 1>&5
+
+ LDFLAGS="-L$cf_add_libdir $LDFLAGS"
+ fi
+ fi
+ done
+fi
+
+ else
+{ { echo "$as_me:14820: error: cannot find socks5 library under $cf_cv_use_libsocks5" >&5
+echo "$as_me: error: cannot find socks5 library under $cf_cv_use_libsocks5" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+done
+
+ ;;
+esac
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lsocks5; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+cat >>confdefs.h <<\EOF
+#define USE_SOCKS5 1
+EOF
+
+cat >>confdefs.h <<\EOF
+#define SOCKS 1
+EOF
+
+echo "$as_me:14853: checking if the socks library uses socks4 prefix" >&5
+echo $ECHO_N "checking if the socks library uses socks4 prefix... $ECHO_C" >&6
+cf_use_socks4=error
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 14857 "configure"
+#include "confdefs.h"
+
+#include <socks.h>
+int
+main (void)
+{
+
+ Rinit((char *)0)
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:14871: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:14874: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:14877: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:14880: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+cat >>confdefs.h <<\EOF
+#define USE_SOCKS4_PREFIX 1
+EOF
+
+ cf_use_socks4=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 14892 "configure"
+#include "confdefs.h"
+#include <socks.h>
+int
+main (void)
+{
+SOCKSinit((char *)0)
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:14904: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:14907: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:14910: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:14913: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_use_socks4=no
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+{ { echo "$as_me:14919: error: Cannot link with socks5 library" >&5
+echo "$as_me: error: Cannot link with socks5 library" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+echo "$as_me:14926: result: $cf_use_socks4" >&5
+echo "${ECHO_T}$cf_use_socks4" >&6
+
+if test "$cf_use_socks4" = "yes" ; then
+ cat >>confdefs.h <<\EOF
+#define accept Raccept
+EOF
+
+ cat >>confdefs.h <<\EOF
+#define bind Rbind
+EOF
+
+ cat >>confdefs.h <<\EOF
+#define connect Rconnect
+EOF
+
+ cat >>confdefs.h <<\EOF
+#define getpeername Rgetpeername
+EOF
+
+ cat >>confdefs.h <<\EOF
+#define getsockname Rgetsockname
+EOF
+
+ cat >>confdefs.h <<\EOF
+#define listen Rlisten
+EOF
+
+ cat >>confdefs.h <<\EOF
+#define recvfrom Rrecvfrom
+EOF
+
+ cat >>confdefs.h <<\EOF
+#define select Rselect
+EOF
+
+else
+ cat >>confdefs.h <<\EOF
+#define accept SOCKSaccept
+EOF
+
+ cat >>confdefs.h <<\EOF
+#define getpeername SOCKSgetpeername
+EOF
+
+ cat >>confdefs.h <<\EOF
+#define getsockname SOCKSgetsockname
+EOF
+
+ cat >>confdefs.h <<\EOF
+#define recvfrom SOCKSrecvfrom
+EOF
+
+fi
+
+echo "$as_me:14981: checking if socks5p.h is available" >&5
+echo $ECHO_N "checking if socks5p.h is available... $ECHO_C" >&6
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 14984 "configure"
+#include "confdefs.h"
+
+#define INCLUDE_PROTOTYPES
+#include <socks.h>
+int
+main (void)
+{
+
+ init((char *)0)
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:14999: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:15002: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:15005: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:15008: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_use_socks5p_h=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_use_socks5p_h=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+echo "$as_me:15017: result: $cf_use_socks5p_h" >&5
+echo "${ECHO_T}$cf_use_socks5p_h" >&6
+
+test "$cf_use_socks5p_h" = yes &&
+cat >>confdefs.h <<\EOF
+#define INCLUDE_PROTOTYPES 1
+EOF
+
+else
+
+cf_test_netlibs=no
+
+echo "$as_me:15029: checking for network libraries" >&5
+echo $ECHO_N "checking for network libraries... $ECHO_C" >&6
+
+if test "${cf_cv_netlibs+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+echo "$as_me:15036: result: working..." >&5
+echo "${ECHO_T}working..." >&6
+
+cf_cv_netlibs=""
+cf_test_netlibs=yes
+
+case "$host_os" in
+(mingw*)
+
+for ac_header in windows.h winsock.h winsock2.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:15048: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 15054 "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:15058: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+ (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ $EGREP -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:15064: \$? = $ac_status" >&5
+ (exit "$ac_status"); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ eval "$as_ac_Header=yes"
+else
+ echo "$as_me: failed program was:" >&5
+ cat "conftest.$ac_ext" >&5
+ eval "$as_ac_Header=no"
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi
+echo "$as_me:15083: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
+if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
+ cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+ if test "$ac_cv_header_winsock2_h" = "yes" ; then
+ cf_winsock_lib="-lws2_32"
+ elif test "$ac_cv_header_winsock_h" = "yes" ; then
+ cf_winsock_lib="-lwsock32"
+ fi
+
+ cf_save_LIBS="$LIBS"
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_winsock_lib; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 15118 "configure"
+#include "confdefs.h"
+
+#ifdef HAVE_WINDOWS_H
+#undef WIN32_LEAN_AND_MEAN
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#ifdef HAVE_WINSOCK2_H
+#include <winsock2.h>
+#else
+#ifdef HAVE_WINSOCK_H
+#include <winsock.h>
+#endif
+#endif
+#endif
+
+int
+main (void)
+{
+
+ char buffer[1024];
+ gethostname(buffer, sizeof(buffer));
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:15145: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:15148: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:15151: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:15154: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_netlibs="$cf_winsock_lib $cf_cv_netlibs"
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+{ { echo "$as_me:15160: error: Cannot link against winsock library" >&5
+echo "$as_me: error: Cannot link against winsock library" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+ LIBS="$cf_save_LIBS"
+ ;;
+(*)
+
+for ac_func in gethostname
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:15173: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 15179 "configure"
+#include "confdefs.h"
+#define $ac_func autoconf_temporary
+#include <limits.h> /* least-intrusive standard header which defines gcc2 __stub macros */
+#undef $ac_func
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+#error found stub for $ac_func
+#endif
+
+ return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:15210: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:15213: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:15216: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:15219: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+eval "$as_ac_var=no"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:15229: result: `eval echo '${'"$as_ac_var"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_var"'}'`" >&6
+if test "`eval echo '${'"$as_ac_var"'}'`" = yes; then
+ cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+EOF
+
+else
+
+echo "$as_me:15238: checking for gethostname in -lnsl" >&5
+echo $ECHO_N "checking for gethostname in -lnsl... $ECHO_C" >&6
+if test "${ac_cv_lib_nsl_gethostname+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lnsl $cf_cv_netlibs $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 15246 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char gethostname ();
+int
+main (void)
+{
+gethostname ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:15265: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:15268: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:15271: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:15274: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_lib_nsl_gethostname=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_nsl_gethostname=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:15285: result: $ac_cv_lib_nsl_gethostname" >&5
+echo "${ECHO_T}$ac_cv_lib_nsl_gethostname" >&6
+if test "$ac_cv_lib_nsl_gethostname" = yes; then
+
+cf_tr_func=`echo "gethostname" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+ cat >>confdefs.h <<EOF
+#define HAVE_$cf_tr_func 1
+EOF
+
+ ac_cv_func_gethostname=yes
+ if test "$cf_used_lib_nsl" != yes ; then cf_used_lib_nsl=yes; cf_cv_netlibs="-lnsl $cf_cv_netlibs"; fi
+else
+
+ ac_cv_func_gethostname=unknown
+ unset ac_cv_func_gethostname 2>/dev/null
+
+echo "$as_me:15302: checking for gethostname in -lsocket" >&5
+echo $ECHO_N "checking for gethostname in -lsocket... $ECHO_C" >&6
+if test "${ac_cv_lib_socket_gethostname+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsocket $cf_cv_netlibs $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 15310 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char gethostname ();
+int
+main (void)
+{
+gethostname ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:15329: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:15332: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:15335: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:15338: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_lib_socket_gethostname=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_socket_gethostname=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:15349: result: $ac_cv_lib_socket_gethostname" >&5
+echo "${ECHO_T}$ac_cv_lib_socket_gethostname" >&6
+if test "$ac_cv_lib_socket_gethostname" = yes; then
+
+cf_tr_func=`echo "gethostname" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+ cat >>confdefs.h <<EOF
+#define HAVE_$cf_tr_func 1
+EOF
+
+ ac_cv_func_gethostname=yes
+ if test "$cf_used_lib_socket" != yes ; then cf_used_lib_socket=yes; cf_cv_netlibs="-lsocket $cf_cv_netlibs"; fi
+else
+
+ ac_cv_func_gethostname=unknown
+ unset ac_cv_func_gethostname 2>/dev/null
+
+fi
+
+fi
+
+fi
+done
+
+ echo "$as_me:15373: checking for main in -linet" >&5
+echo $ECHO_N "checking for main in -linet... $ECHO_C" >&6
+if test "${ac_cv_lib_inet_main+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-linet $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 15381 "configure"
+#include "confdefs.h"
+
+int
+main (void)
+{
+main ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:15393: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:15396: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:15399: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:15402: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_lib_inet_main=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_inet_main=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:15413: result: $ac_cv_lib_inet_main" >&5
+echo "${ECHO_T}$ac_cv_lib_inet_main" >&6
+if test "$ac_cv_lib_inet_main" = yes; then
+ cf_cv_netlibs="-linet $cf_cv_netlibs"
+fi
+
+ if test "$ac_cv_func_lsocket" != no ; then
+
+for ac_func in socket
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:15424: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 15430 "configure"
+#include "confdefs.h"
+#define $ac_func autoconf_temporary
+#include <limits.h> /* least-intrusive standard header which defines gcc2 __stub macros */
+#undef $ac_func
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+#error found stub for $ac_func
+#endif
+
+ return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:15461: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:15464: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:15467: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:15470: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+eval "$as_ac_var=no"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:15480: result: `eval echo '${'"$as_ac_var"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_var"'}'`" >&6
+if test "`eval echo '${'"$as_ac_var"'}'`" = yes; then
+ cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+EOF
+
+else
+
+echo "$as_me:15489: checking for socket in -lsocket" >&5
+echo $ECHO_N "checking for socket in -lsocket... $ECHO_C" >&6
+if test "${ac_cv_lib_socket_socket+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsocket $cf_cv_netlibs $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 15497 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char socket ();
+int
+main (void)
+{
+socket ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:15516: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:15519: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:15522: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:15525: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_lib_socket_socket=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_socket_socket=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:15536: result: $ac_cv_lib_socket_socket" >&5
+echo "${ECHO_T}$ac_cv_lib_socket_socket" >&6
+if test "$ac_cv_lib_socket_socket" = yes; then
+
+cf_tr_func=`echo "socket" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+ cat >>confdefs.h <<EOF
+#define HAVE_$cf_tr_func 1
+EOF
+
+ ac_cv_func_socket=yes
+ if test "$cf_used_lib_socket" != yes ; then cf_used_lib_socket=yes; cf_cv_netlibs="-lsocket $cf_cv_netlibs"; fi
+else
+
+ ac_cv_func_socket=unknown
+ unset ac_cv_func_socket 2>/dev/null
+
+echo "$as_me:15553: checking for socket in -lbsd" >&5
+echo $ECHO_N "checking for socket in -lbsd... $ECHO_C" >&6
+if test "${ac_cv_lib_bsd_socket+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lbsd $cf_cv_netlibs $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 15561 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char socket ();
+int
+main (void)
+{
+socket ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:15580: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:15583: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:15586: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:15589: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_lib_bsd_socket=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_bsd_socket=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:15600: result: $ac_cv_lib_bsd_socket" >&5
+echo "${ECHO_T}$ac_cv_lib_bsd_socket" >&6
+if test "$ac_cv_lib_bsd_socket" = yes; then
+
+cf_tr_func=`echo "socket" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+ cat >>confdefs.h <<EOF
+#define HAVE_$cf_tr_func 1
+EOF
+
+ ac_cv_func_socket=yes
+ if test "$cf_used_lib_bsd" != yes ; then cf_used_lib_bsd=yes; cf_cv_netlibs="-lbsd $cf_cv_netlibs"; fi
+else
+
+ ac_cv_func_socket=unknown
+ unset ac_cv_func_socket 2>/dev/null
+
+fi
+
+fi
+
+fi
+done
+
+ fi
+
+for ac_func in gethostbyname
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:15629: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 15635 "configure"
+#include "confdefs.h"
+#define $ac_func autoconf_temporary
+#include <limits.h> /* least-intrusive standard header which defines gcc2 __stub macros */
+#undef $ac_func
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+#error found stub for $ac_func
+#endif
+
+ return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:15666: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:15669: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:15672: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:15675: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+eval "$as_ac_var=no"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:15685: result: `eval echo '${'"$as_ac_var"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_var"'}'`" >&6
+if test "`eval echo '${'"$as_ac_var"'}'`" = yes; then
+ cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+EOF
+
+else
+
+echo "$as_me:15694: checking for gethostbyname in -lnsl" >&5
+echo $ECHO_N "checking for gethostbyname in -lnsl... $ECHO_C" >&6
+if test "${ac_cv_lib_nsl_gethostbyname+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lnsl $cf_cv_netlibs $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 15702 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char gethostbyname ();
+int
+main (void)
+{
+gethostbyname ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:15721: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:15724: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:15727: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:15730: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_lib_nsl_gethostbyname=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_nsl_gethostbyname=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:15741: result: $ac_cv_lib_nsl_gethostbyname" >&5
+echo "${ECHO_T}$ac_cv_lib_nsl_gethostbyname" >&6
+if test "$ac_cv_lib_nsl_gethostbyname" = yes; then
+
+cf_tr_func=`echo "gethostbyname" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+ cat >>confdefs.h <<EOF
+#define HAVE_$cf_tr_func 1
+EOF
+
+ ac_cv_func_gethostbyname=yes
+ if test "$cf_used_lib_nsl" != yes ; then cf_used_lib_nsl=yes; cf_cv_netlibs="-lnsl $cf_cv_netlibs"; fi
+else
+
+ ac_cv_func_gethostbyname=unknown
+ unset ac_cv_func_gethostbyname 2>/dev/null
+
+fi
+
+fi
+done
+
+for ac_func in inet_ntoa
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:15766: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 15772 "configure"
+#include "confdefs.h"
+#define $ac_func autoconf_temporary
+#include <limits.h> /* least-intrusive standard header which defines gcc2 __stub macros */
+#undef $ac_func
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+#error found stub for $ac_func
+#endif
+
+ return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:15803: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:15806: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:15809: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:15812: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+eval "$as_ac_var=no"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:15822: result: `eval echo '${'"$as_ac_var"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_var"'}'`" >&6
+if test "`eval echo '${'"$as_ac_var"'}'`" = yes; then
+ cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+EOF
+
+else
+
+echo "$as_me:15831: checking for inet_ntoa in -lnsl" >&5
+echo $ECHO_N "checking for inet_ntoa in -lnsl... $ECHO_C" >&6
+if test "${ac_cv_lib_nsl_inet_ntoa+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lnsl $cf_cv_netlibs $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 15839 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char inet_ntoa ();
+int
+main (void)
+{
+inet_ntoa ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:15858: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:15861: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:15864: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:15867: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_lib_nsl_inet_ntoa=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_nsl_inet_ntoa=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:15878: result: $ac_cv_lib_nsl_inet_ntoa" >&5
+echo "${ECHO_T}$ac_cv_lib_nsl_inet_ntoa" >&6
+if test "$ac_cv_lib_nsl_inet_ntoa" = yes; then
+
+cf_tr_func=`echo "inet_ntoa" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+ cat >>confdefs.h <<EOF
+#define HAVE_$cf_tr_func 1
+EOF
+
+ ac_cv_func_inet_ntoa=yes
+ if test "$cf_used_lib_nsl" != yes ; then cf_used_lib_nsl=yes; cf_cv_netlibs="-lnsl $cf_cv_netlibs"; fi
+else
+
+ ac_cv_func_inet_ntoa=unknown
+ unset ac_cv_func_inet_ntoa 2>/dev/null
+
+fi
+
+fi
+done
+
+for ac_func in gethostbyname
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:15903: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 15909 "configure"
+#include "confdefs.h"
+#define $ac_func autoconf_temporary
+#include <limits.h> /* least-intrusive standard header which defines gcc2 __stub macros */
+#undef $ac_func
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+#error found stub for $ac_func
+#endif
+
+ return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:15940: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:15943: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:15946: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:15949: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+eval "$as_ac_var=no"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:15959: result: `eval echo '${'"$as_ac_var"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_var"'}'`" >&6
+if test "`eval echo '${'"$as_ac_var"'}'`" = yes; then
+ cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+EOF
+
+else
+
+echo "$as_me:15968: checking for gethostbyname in -lnetwork" >&5
+echo $ECHO_N "checking for gethostbyname in -lnetwork... $ECHO_C" >&6
+if test "${ac_cv_lib_network_gethostbyname+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lnetwork $cf_cv_netlibs $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 15976 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char gethostbyname ();
+int
+main (void)
+{
+gethostbyname ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:15995: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:15998: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:16001: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:16004: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_lib_network_gethostbyname=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_network_gethostbyname=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:16015: result: $ac_cv_lib_network_gethostbyname" >&5
+echo "${ECHO_T}$ac_cv_lib_network_gethostbyname" >&6
+if test "$ac_cv_lib_network_gethostbyname" = yes; then
+
+cf_tr_func=`echo "gethostbyname" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+ cat >>confdefs.h <<EOF
+#define HAVE_$cf_tr_func 1
+EOF
+
+ ac_cv_func_gethostbyname=yes
+ if test "$cf_used_lib_network" != yes ; then cf_used_lib_network=yes; cf_cv_netlibs="-lnetwork $cf_cv_netlibs"; fi
+else
+
+ ac_cv_func_gethostbyname=unknown
+ unset ac_cv_func_gethostbyname 2>/dev/null
+
+fi
+
+fi
+done
+
+for ac_func in strcasecmp
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:16040: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 16046 "configure"
+#include "confdefs.h"
+#define $ac_func autoconf_temporary
+#include <limits.h> /* least-intrusive standard header which defines gcc2 __stub macros */
+#undef $ac_func
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+#error found stub for $ac_func
+#endif
+
+ return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:16077: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:16080: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:16083: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:16086: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+eval "$as_ac_var=no"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:16096: result: `eval echo '${'"$as_ac_var"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_var"'}'`" >&6
+if test "`eval echo '${'"$as_ac_var"'}'`" = yes; then
+ cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+EOF
+
+else
+
+echo "$as_me:16105: checking for strcasecmp in -lresolv" >&5
+echo $ECHO_N "checking for strcasecmp in -lresolv... $ECHO_C" >&6
+if test "${ac_cv_lib_resolv_strcasecmp+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lresolv $cf_cv_netlibs $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 16113 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char strcasecmp ();
+int
+main (void)
+{
+strcasecmp ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:16132: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:16135: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:16138: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:16141: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_lib_resolv_strcasecmp=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_resolv_strcasecmp=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:16152: result: $ac_cv_lib_resolv_strcasecmp" >&5
+echo "${ECHO_T}$ac_cv_lib_resolv_strcasecmp" >&6
+if test "$ac_cv_lib_resolv_strcasecmp" = yes; then
+
+cf_tr_func=`echo "strcasecmp" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+ cat >>confdefs.h <<EOF
+#define HAVE_$cf_tr_func 1
+EOF
+
+ ac_cv_func_strcasecmp=yes
+ if test "$cf_used_lib_resolv" != yes ; then cf_used_lib_resolv=yes; cf_cv_netlibs="-lresolv $cf_cv_netlibs"; fi
+else
+
+ ac_cv_func_strcasecmp=unknown
+ unset ac_cv_func_strcasecmp 2>/dev/null
+
+fi
+
+fi
+done
+
+ ;;
+esac
+
+fi
+
+case "$cf_cv_netlibs" in
+(*ws2_32*)
+
+cat >>confdefs.h <<\EOF
+#define USE_WINSOCK2_H 1
+EOF
+
+ ;;
+esac
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_cv_netlibs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+test "$cf_test_netlibs" = no && echo "$cf_cv_netlibs" >&6
+
+fi
+
+echo "$as_me:16209: checking for inet_aton function" >&5
+echo $ECHO_N "checking for inet_aton function... $ECHO_C" >&6
+if test "${cf_cv_have_inet_aton+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 16216 "configure"
+#include "confdefs.h"
+
+$ac_includes_default
+#if defined(__MINGW32__)
+
+#undef WIN32_LEAN_AND_MEAN
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+
+#ifdef HAVE_WINSOCK2_H
+#include <winsock2.h>
+#else
+#ifdef HAVE_WINSOCK_H
+#include <winsock.h>
+#endif
+#endif
+
+#else
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+#endif
+
+int
+main (void)
+{
+inet_aton(0, (struct in_addr *)0)
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:16252: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:16255: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:16258: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:16261: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_have_inet_aton=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_have_inet_aton=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:16271: result: $cf_cv_have_inet_aton" >&5
+echo "${ECHO_T}$cf_cv_have_inet_aton" >&6
+if test "$cf_cv_have_inet_aton" = yes ; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_INET_ATON 1
+EOF
+
+else
+ echo "$as_me:16280: checking for inet_addr function" >&5
+echo $ECHO_N "checking for inet_addr function... $ECHO_C" >&6
+if test "${cf_cv_have_inet_addr+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 16287 "configure"
+#include "confdefs.h"
+
+$ac_includes_default
+#if defined(__MINGW32__)
+
+#undef WIN32_LEAN_AND_MEAN
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+
+#ifdef HAVE_WINSOCK2_H
+#include <winsock2.h>
+#else
+#ifdef HAVE_WINSOCK_H
+#include <winsock.h>
+#endif
+#endif
+
+#else
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+#endif
+
+int
+main (void)
+{
+inet_addr(0)
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:16323: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:16326: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:16329: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:16332: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_have_inet_addr=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_have_inet_addr=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:16342: result: $cf_cv_have_inet_addr" >&5
+echo "${ECHO_T}$cf_cv_have_inet_addr" >&6
+ if test "$cf_cv_have_inet_addr" = no ; then
+ echo "$as_me:16345: checking for library with inet_addr" >&5
+echo $ECHO_N "checking for library with inet_addr... $ECHO_C" >&6
+if test "${cf_cv_lib_inet_addr+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cf_save_LIBS="$LIBS"
+ for cf_inetlib in -lbind -lresolv
+ do
+ LIBS="$cf_save_LIBS $cf_inetlib"
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 16356 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+int
+main (void)
+{
+inet_addr(0)
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:16372: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:16375: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:16378: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:16381: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_lib_inet_addr=$cf_inetlib
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_lib_inet_addr=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+ LIBS="$cf_save_LIBS"
+ test "$cf_cv_lib_inet_addr" != no && break
+ done
+
+fi
+echo "$as_me:16395: result: $cf_cv_lib_inet_addr" >&5
+echo "${ECHO_T}$cf_cv_lib_inet_addr" >&6
+ if test "$cf_cv_lib_inet_addr" != no ; then
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_cv_lib_inet_addr; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+ else
+ { echo "$as_me:16416: WARNING: Unable to find library for inet_addr function" >&5
+echo "$as_me: WARNING: Unable to find library for inet_addr function" >&2;}
+ fi
+ fi
+fi
+
+echo "$as_me:16422: checking if you want to use pkg-config" >&5
+echo $ECHO_N "checking if you want to use pkg-config... $ECHO_C" >&6
+
+# Check whether --with-pkg-config or --without-pkg-config was given.
+if test "${with_pkg_config+set}" = set; then
+ withval="$with_pkg_config"
+ cf_pkg_config=$withval
+else
+ cf_pkg_config=yes
+fi;
+echo "$as_me:16432: result: $cf_pkg_config" >&5
+echo "${ECHO_T}$cf_pkg_config" >&6
+
+case "$cf_pkg_config" in
+(no)
+ PKG_CONFIG=none
+ ;;
+(yes)
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
+echo "$as_me:16444: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_PKG_CONFIG+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $PKG_CONFIG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
+ ;;
+ *)
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ if $as_executable_p "$ac_dir/$ac_word"; then
+ ac_cv_path_PKG_CONFIG="$ac_dir/$ac_word"
+ echo "$as_me:16461: found $ac_dir/$ac_word" >&5
+ break
+fi
+done
+
+ ;;
+esac
+fi
+PKG_CONFIG=$ac_cv_path_PKG_CONFIG
+
+if test -n "$PKG_CONFIG"; then
+ echo "$as_me:16472: result: $PKG_CONFIG" >&5
+echo "${ECHO_T}$PKG_CONFIG" >&6
+else
+ echo "$as_me:16475: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_path_PKG_CONFIG"; then
+ ac_pt_PKG_CONFIG=$PKG_CONFIG
+ # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+echo "$as_me:16484: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $ac_pt_PKG_CONFIG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path.
+ ;;
+ *)
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ if $as_executable_p "$ac_dir/$ac_word"; then
+ ac_cv_path_ac_pt_PKG_CONFIG="$ac_dir/$ac_word"
+ echo "$as_me:16501: found $ac_dir/$ac_word" >&5
+ break
+fi
+done
+
+ test -z "$ac_cv_path_ac_pt_PKG_CONFIG" && ac_cv_path_ac_pt_PKG_CONFIG="none"
+ ;;
+esac
+fi
+ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG
+
+if test -n "$ac_pt_PKG_CONFIG"; then
+ echo "$as_me:16513: result: $ac_pt_PKG_CONFIG" >&5
+echo "${ECHO_T}$ac_pt_PKG_CONFIG" >&6
+else
+ echo "$as_me:16516: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ PKG_CONFIG=$ac_pt_PKG_CONFIG
+else
+ PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
+fi
+
+ ;;
+(*)
+ PKG_CONFIG=$withval
+ ;;
+esac
+
+test -z "$PKG_CONFIG" && PKG_CONFIG=none
+if test "$PKG_CONFIG" != none ; then
+
+if test "x$prefix" != xNONE; then
+ cf_path_syntax="$prefix"
+else
+ cf_path_syntax="$ac_default_prefix"
+fi
+
+case ".$PKG_CONFIG" in
+(.\$\(*\)*|.\'*\'*)
+ ;;
+(..|./*|.\\*)
+ ;;
+(.[a-zA-Z]:[\\/]*) # OS/2 EMX
+ ;;
+(.\$\{*prefix\}*|.\$\{*dir\}*)
+ eval PKG_CONFIG="$PKG_CONFIG"
+ case ".$PKG_CONFIG" in
+ (.NONE/*)
+ PKG_CONFIG=`echo "$PKG_CONFIG" | sed -e s%NONE%$cf_path_syntax%`
+ ;;
+ esac
+ ;;
+(.no|.NONE/*)
+ PKG_CONFIG=`echo "$PKG_CONFIG" | sed -e s%NONE%$cf_path_syntax%`
+ ;;
+(*)
+ { { echo "$as_me:16559: error: expected a pathname, not \"$PKG_CONFIG\"" >&5
+echo "$as_me: error: expected a pathname, not \"$PKG_CONFIG\"" >&2;}
+ { (exit 1); exit 1; }; }
+ ;;
+esac
+
+elif test "x$cf_pkg_config" != xno ; then
+ { echo "$as_me:16566: WARNING: pkg-config is not installed" >&5
+echo "$as_me: WARNING: pkg-config is not installed" >&2;}
+fi
+
+if test "x$cf_cv_use_libssl" != xno ; then
+
+ cf_cv_have_ssl=no
+ cf_cv_pkg_config_ssl=no
+
+ # command-line option, etc., override default behavior
+
+case "$cf_cv_use_libssl" in
+(no)
+ ;;
+(yes)
+ ;;
+(*)
+
+for cf_searchpath in `echo "$cf_cv_use_libssl" | tr $PATH_SEPARATOR ' '`; do
+ if test -d "$cf_searchpath/include" ; then
+
+if test -n "$cf_searchpath/include" ; then
+ for cf_add_incdir in $cf_searchpath/include
+ do
+ while test "$cf_add_incdir" != /usr/include
+ do
+ if test -d "$cf_add_incdir"
+ then
+ cf_have_incdir=no
+ if test -n "$CFLAGS$CPPFLAGS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+ if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+ cf_have_incdir=yes; break
+ fi
+ done
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ if test "$cf_add_incdir" = /usr/local/include ; then
+ if test "$GCC" = yes
+ then
+ cf_save_CPPFLAGS=$CPPFLAGS
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 16614 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:16626: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:16629: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:16632: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:16635: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ CPPFLAGS=$cf_save_CPPFLAGS
+ fi
+ fi
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:16652: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+ CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+ cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+ test "$cf_top_incdir" = "$cf_add_incdir" && break
+ cf_add_incdir="$cf_top_incdir"
+ else
+ break
+ fi
+ else
+ break
+ fi
+ done
+ done
+fi
+
+ elif test -d "$cf_searchpath/../include" ; then
+
+if test -n "$cf_searchpath/../include" ; then
+ for cf_add_incdir in $cf_searchpath/../include
+ do
+ while test "$cf_add_incdir" != /usr/include
+ do
+ if test -d "$cf_add_incdir"
+ then
+ cf_have_incdir=no
+ if test -n "$CFLAGS$CPPFLAGS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+ if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+ cf_have_incdir=yes; break
+ fi
+ done
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ if test "$cf_add_incdir" = /usr/local/include ; then
+ if test "$GCC" = yes
+ then
+ cf_save_CPPFLAGS=$CPPFLAGS
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 16698 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:16710: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:16713: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:16716: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:16719: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ CPPFLAGS=$cf_save_CPPFLAGS
+ fi
+ fi
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:16736: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+ CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+ cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+ test "$cf_top_incdir" = "$cf_add_incdir" && break
+ cf_add_incdir="$cf_top_incdir"
+ else
+ break
+ fi
+ else
+ break
+ fi
+ done
+ done
+fi
+
+ else
+{ { echo "$as_me:16754: error: cannot find ssl library under $cf_cv_use_libssl" >&5
+echo "$as_me: error: cannot find ssl library under $cf_cv_use_libssl" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+ if test -d "$cf_searchpath/lib" ; then
+
+if test -n "$cf_searchpath/lib" ; then
+ for cf_add_libdir in $cf_searchpath/lib
+ do
+ if test "$cf_add_libdir" = /usr/lib ; then
+ :
+ elif test -d "$cf_add_libdir"
+ then
+ cf_have_libdir=no
+ if test -n "$LDFLAGS$LIBS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_libdir in $LDFLAGS $LIBS ; do
+ if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
+ cf_have_libdir=yes; break
+ fi
+ done
+ fi
+ if test "$cf_have_libdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
+
+echo "${as_me:-configure}:16779: testing adding $cf_add_libdir to library-path ..." 1>&5
+
+ LDFLAGS="-L$cf_add_libdir $LDFLAGS"
+ fi
+ fi
+ done
+fi
+
+ elif test -d "$cf_searchpath" ; then
+
+if test -n "$cf_searchpath" ; then
+ for cf_add_libdir in $cf_searchpath
+ do
+ if test "$cf_add_libdir" = /usr/lib ; then
+ :
+ elif test -d "$cf_add_libdir"
+ then
+ cf_have_libdir=no
+ if test -n "$LDFLAGS$LIBS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_libdir in $LDFLAGS $LIBS ; do
+ if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
+ cf_have_libdir=yes; break
+ fi
+ done
+ fi
+ if test "$cf_have_libdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
+
+echo "${as_me:-configure}:16808: testing adding $cf_add_libdir to library-path ..." 1>&5
+
+ LDFLAGS="-L$cf_add_libdir $LDFLAGS"
+ fi
+ fi
+ done
+fi
+
+ else
+{ { echo "$as_me:16817: error: cannot find ssl library under $cf_cv_use_libssl" >&5
+echo "$as_me: error: cannot find ssl library under $cf_cv_use_libssl" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+done
+
+ ;;
+esac
+
+ if test "x$PKG_CONFIG" != xnone; then
+ case "$cf_cv_use_libssl" in
+ (no)
+ ;;
+ (yes) # if no explicit directory given, try pkg-config
+ cf_cv_pkg_ssl=
+ for cf_try_package in openssl libssl
+ do
+ echo "$as_me:16834: checking pkg-config for $cf_try_package" >&5
+echo $ECHO_N "checking pkg-config for $cf_try_package... $ECHO_C" >&6
+ if "$PKG_CONFIG" --exists $cf_try_package ; then
+ cf_cv_pkg_ssl=$cf_try_package
+ echo "$as_me:16838: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ break
+ else
+ echo "$as_me:16842: result: no" >&5
+echo "${ECHO_T}no" >&6
+ fi
+ done
+ if test -n "$cf_cv_pkg_ssl" ; then
+ cf_cv_have_ssl=yes
+ cf_cv_pkg_config_ssl=yes
+
+ cf_cflags_ssl=`$PKG_CONFIG --cflags $cf_cv_pkg_ssl`
+ cf_libs_ssl=`$PKG_CONFIG --libs $cf_cv_pkg_ssl`
+
+ if test -n "$cf_cflags_ssl" ; then
+ case "$cf_cflags_ssl" in
+ (*-I*)
+ cf_cv_header_path_ssl=`echo "$cf_cflags_ssl" | sed -e 's/^.*-I//' -e 's/ .*//'`
+ ;;
+ (*)
+ cf_cv_header_path_ssl=/usr/include
+ ;;
+ esac
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_cflags_ssl
+do
+case "$cf_fix_cppflags" in
+(no)
+ case "$cf_add_cflags" in
+ (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=yes
+
+ if test "$cf_fix_cppflags" = yes ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ elif test "${cf_tst_cflags}" = "\"'" ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ fi
+ ;;
+ esac
+ case "$CPPFLAGS" in
+ (*$cf_add_cflags)
+ ;;
+ (*)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+ sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \
+ -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'`
+
+ ;;
+ esac
+
+ test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+ cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+ (*)
+
+ test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+ cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+(yes)
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=no
+ ;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+ test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+ CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+ test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+ EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+ # workaround for broken openssl package using kerberos
+ case "$cf_cflags_ssl" in
+ (*kerberos*)
+ cf_cv_have_ssl=maybe
+ ;;
+ esac
+ else
+ cf_cv_header_path_ssl=/usr/include
+ fi
+
+ if test -d "$cf_cv_header_path_ssl/openssl" ; then
+ cf_cv_header_path_ssl=$cf_cv_header_path_ssl/openssl
+ fi
+
+ if test -n "$cf_libs_ssl" ; then
+ case "x$cf_libs_ssl" in
+ (*-L*)
+ cf_cv_library_path_ssl=`echo "$cf_libs_ssl" | sed -e 's/^.*-L//' -e 's/ .*//'`
+ ;;
+ (*)
+ cf_cv_library_path_ssl=/usr/lib
+ ;;
+ esac
+ test -n "$verbose" && echo " adding $cf_libs_ssl to LIBS" 1>&6
+
+echo "${as_me:-configure}:16986: testing adding $cf_libs_ssl to LIBS ..." 1>&5
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_libs_ssl; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+ fi
+ fi
+ ;;
+ esac
+ fi
+
+ if test "$cf_cv_have_ssl" != yes; then
+ case "$host_os" in
+ (mingw*)
+ cf_extra_ssl_libs="-lcrypto -lgdi32"
+ ;;
+ (*)
+ # openssl 0.9.6 and up use dynamic loading for engines.
+ cf_extra_ssl_libs="-lcrypto"
+ case "x$LIBS" in
+ (*-ldl)
+ ;;
+ (*)
+ echo "$as_me:17022: checking for dlsym in -ldl" >&5
+echo $ECHO_N "checking for dlsym in -ldl... $ECHO_C" >&6
+if test "${ac_cv_lib_dl_dlsym+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 17030 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char dlsym ();
+int
+main (void)
+{
+dlsym ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:17049: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:17052: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:17055: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:17058: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_lib_dl_dlsym=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_dl_dlsym=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:17069: result: $ac_cv_lib_dl_dlsym" >&5
+echo "${ECHO_T}$ac_cv_lib_dl_dlsym" >&6
+if test "$ac_cv_lib_dl_dlsym" = yes; then
+ cf_extra_ssl_libs="$cf_extra_ssl_libs -ldl"
+fi
+
+ ;;
+ esac
+ ;;
+ esac
+
+# If the linkage is not already in the $CPPFLAGS/$LDFLAGS configuration, these
+# will be set on completion of the AC_TRY_LINK below.
+cf_cv_header_path_ssl=
+cf_cv_library_path_ssl=
+
+echo "${as_me:-configure}:17085: testing Starting FIND_LINKAGE(ssl,openssl) ..." 1>&5
+
+cf_save_LIBS="$LIBS"
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 17090 "configure"
+#include "confdefs.h"
+
+#include <stdio.h>
+#if defined(USE_OPENSSL_INCL)
+#include <openssl/ssl.h>
+#elif defined(USE_GNUTLS_FUNCS)
+#include <gnutls/gnutls.h>
+#elif defined(USE_GNUTLS_INCL)
+#include <gnutls/openssl.h>
+#else
+#include <ssl.h>
+#endif
+
+int
+main (void)
+{
+
+#ifdef USE_GNUTLS_FUNCS
+ gnutls_global_init();
+#else
+ SSL_shutdown((SSL *)0)
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:17119: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:17122: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:17125: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:17128: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ cf_cv_find_linkage_ssl=yes
+ cf_cv_header_path_ssl=/usr/include
+ cf_cv_library_path_ssl=/usr/lib
+
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+LIBS="-lssl $cf_extra_ssl_libs $cf_save_LIBS"
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 17142 "configure"
+#include "confdefs.h"
+
+#include <stdio.h>
+#if defined(USE_OPENSSL_INCL)
+#include <openssl/ssl.h>
+#elif defined(USE_GNUTLS_FUNCS)
+#include <gnutls/gnutls.h>
+#elif defined(USE_GNUTLS_INCL)
+#include <gnutls/openssl.h>
+#else
+#include <ssl.h>
+#endif
+
+int
+main (void)
+{
+
+#ifdef USE_GNUTLS_FUNCS
+ gnutls_global_init();
+#else
+ SSL_shutdown((SSL *)0)
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:17171: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:17174: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:17177: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:17180: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ cf_cv_find_linkage_ssl=yes
+ cf_cv_header_path_ssl=/usr/include
+ cf_cv_library_path_ssl=/usr/lib
+ cf_cv_library_file_ssl="-lssl"
+
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+ cf_cv_find_linkage_ssl=no
+ LIBS="$cf_save_LIBS"
+
+ test -n "$verbose" && echo " find linkage for ssl library" 1>&6
+
+echo "${as_me:-configure}:17197: testing find linkage for ssl library ..." 1>&5
+
+echo "${as_me:-configure}:17199: testing Searching for headers in FIND_LINKAGE(ssl,openssl) ..." 1>&5
+
+ cf_save_CPPFLAGS="$CPPFLAGS"
+ cf_test_CPPFLAGS="$CPPFLAGS"
+
+cf_search=
+
+# collect the current set of include-directories from compiler flags
+cf_header_path_list=""
+if test -n "${CFLAGS}${CPPFLAGS}" ; then
+ for cf_header_path in $CPPFLAGS $CFLAGS
+ do
+ case "$cf_header_path" in
+ (-I*)
+ cf_header_path=`echo ".$cf_header_path" |sed -e 's/^...//' -e 's,/include$,,'`
+
+test "x$cf_header_path" != "xNONE" && \
+test -d "$cf_header_path" && \
+ {
+ test -n "$verbose" && echo " ... testing for include-directories under $cf_header_path"
+ test -d "$cf_header_path/include" && cf_search="$cf_search $cf_header_path/include"
+ test -d "$cf_header_path/include/openssl" && cf_search="$cf_search $cf_header_path/include/openssl"
+ test -d "$cf_header_path/include/openssl/include" && cf_search="$cf_search $cf_header_path/include/openssl/include"
+ test -d "$cf_header_path/openssl/include" && cf_search="$cf_search $cf_header_path/openssl/include"
+ test -d "$cf_header_path/openssl/include/openssl" && cf_search="$cf_search $cf_header_path/openssl/include/openssl"
+}
+
+ cf_header_path_list="$cf_header_path_list $cf_search"
+ ;;
+ esac
+ done
+fi
+
+# add the variations for the package we are looking for
+
+cf_search=
+
+test "x$prefix" != "xNONE" && \
+test -d "$prefix" && \
+ {
+ test -n "$verbose" && echo " ... testing for include-directories under $prefix"
+ test -d "$prefix/include" && cf_search="$cf_search $prefix/include"
+ test -d "$prefix/include/openssl" && cf_search="$cf_search $prefix/include/openssl"
+ test -d "$prefix/include/openssl/include" && cf_search="$cf_search $prefix/include/openssl/include"
+ test -d "$prefix/openssl/include" && cf_search="$cf_search $prefix/openssl/include"
+ test -d "$prefix/openssl/include/openssl" && cf_search="$cf_search $prefix/openssl/include/openssl"
+}
+
+for cf_subdir_prefix in \
+ /usr \
+ /usr/local \
+ /usr/pkg \
+ /opt \
+ /opt/local \
+ $HOME
+do
+
+test "x$cf_subdir_prefix" != "x$prefix" && \
+test -d "$cf_subdir_prefix" && \
+{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
+ test -n "$verbose" && echo " ... testing for include-directories under $cf_subdir_prefix"
+ test -d "$cf_subdir_prefix/include" && cf_search="$cf_search $cf_subdir_prefix/include"
+ test -d "$cf_subdir_prefix/include/openssl" && cf_search="$cf_search $cf_subdir_prefix/include/openssl"
+ test -d "$cf_subdir_prefix/include/openssl/include" && cf_search="$cf_search $cf_subdir_prefix/include/openssl/include"
+ test -d "$cf_subdir_prefix/openssl/include" && cf_search="$cf_search $cf_subdir_prefix/openssl/include"
+ test -d "$cf_subdir_prefix/openssl/include/openssl" && cf_search="$cf_search $cf_subdir_prefix/openssl/include/openssl"
+}
+
+done
+
+test "$includedir" != NONE && \
+test "$includedir" != "/usr/include" && \
+test -d "$includedir" && {
+ test -d "$includedir" && cf_search="$cf_search $includedir"
+ test -d "$includedir/openssl" && cf_search="$cf_search $includedir/openssl"
+}
+
+test "$oldincludedir" != NONE && \
+test "$oldincludedir" != "/usr/include" && \
+test -d "$oldincludedir" && {
+ test -d "$oldincludedir" && cf_search="$cf_search $oldincludedir"
+ test -d "$oldincludedir/openssl" && cf_search="$cf_search $oldincludedir/openssl"
+}
+
+cf_search="$cf_search $cf_header_path_list"
+
+ for cf_cv_header_path_ssl in $cf_search
+ do
+ if test -d "$cf_cv_header_path_ssl" ; then
+ test -n "$verbose" && echo " ... testing $cf_cv_header_path_ssl" 1>&6
+
+echo "${as_me:-configure}:17290: testing ... testing $cf_cv_header_path_ssl ..." 1>&5
+
+ CPPFLAGS="$cf_save_CPPFLAGS"
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_cv_header_path_ssl"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 17298 "configure"
+#include "confdefs.h"
+
+#include <stdio.h>
+#if defined(USE_OPENSSL_INCL)
+#include <openssl/ssl.h>
+#elif defined(USE_GNUTLS_FUNCS)
+#include <gnutls/gnutls.h>
+#elif defined(USE_GNUTLS_INCL)
+#include <gnutls/openssl.h>
+#else
+#include <ssl.h>
+#endif
+
+int
+main (void)
+{
+
+#ifdef USE_GNUTLS_FUNCS
+ gnutls_global_init();
+#else
+ SSL_shutdown((SSL *)0)
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:17327: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:17330: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:17333: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:17336: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ test -n "$verbose" && echo " ... found ssl headers in $cf_cv_header_path_ssl" 1>&6
+
+echo "${as_me:-configure}:17341: testing ... found ssl headers in $cf_cv_header_path_ssl ..." 1>&5
+
+ cf_cv_find_linkage_ssl=maybe
+ cf_test_CPPFLAGS="$CPPFLAGS"
+ break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+ CPPFLAGS="$cf_save_CPPFLAGS"
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ fi
+ done
+
+ if test "$cf_cv_find_linkage_ssl" = maybe ; then
+
+echo "${as_me:-configure}:17359: testing Searching for ssl library in FIND_LINKAGE(ssl,openssl) ..." 1>&5
+
+ cf_save_LIBS="$LIBS"
+ cf_save_LDFLAGS="$LDFLAGS"
+
+ CPPFLAGS="$cf_test_CPPFLAGS"
+ LIBS="-lssl $cf_extra_ssl_libs $cf_save_LIBS"
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 17367 "configure"
+#include "confdefs.h"
+
+#include <stdio.h>
+#if defined(USE_OPENSSL_INCL)
+#include <openssl/ssl.h>
+#elif defined(USE_GNUTLS_FUNCS)
+#include <gnutls/gnutls.h>
+#elif defined(USE_GNUTLS_INCL)
+#include <gnutls/openssl.h>
+#else
+#include <ssl.h>
+#endif
+
+int
+main (void)
+{
+
+#ifdef USE_GNUTLS_FUNCS
+ gnutls_global_init();
+#else
+ SSL_shutdown((SSL *)0)
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:17396: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:17399: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:17402: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:17405: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ test -n "$verbose" && echo " ... found ssl library in system" 1>&6
+
+echo "${as_me:-configure}:17410: testing ... found ssl library in system ..." 1>&5
+
+ cf_cv_find_linkage_ssl=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+ CPPFLAGS="$cf_save_CPPFLAGS"
+ LIBS="$cf_save_LIBS"
+
+ if test "$cf_cv_find_linkage_ssl" != yes ; then
+
+cf_search=
+cf_library_path_list=""
+if test -n "${LDFLAGS}${LIBS}" ; then
+ for cf_library_path in $LDFLAGS $LIBS
+ do
+ case "$cf_library_path" in
+ (-L*)
+ cf_library_path=`echo ".$cf_library_path" |sed -e 's/^...//' -e 's,/lib$,,'`
+
+test "x$cf_library_path" != "xNONE" && \
+test -d "$cf_library_path" && \
+ {
+ test -n "$verbose" && echo " ... testing for lib-directories under $cf_library_path"
+ test -d "$cf_library_path/lib" && cf_search="$cf_search $cf_library_path/lib"
+ test -d "$cf_library_path/lib/ssl" && cf_search="$cf_search $cf_library_path/lib/ssl"
+ test -d "$cf_library_path/lib/ssl/lib" && cf_search="$cf_search $cf_library_path/lib/ssl/lib"
+ test -d "$cf_library_path/ssl/lib" && cf_search="$cf_search $cf_library_path/ssl/lib"
+ test -d "$cf_library_path/ssl/lib/ssl" && cf_search="$cf_search $cf_library_path/ssl/lib/ssl"
+}
+
+ cf_library_path_list="$cf_library_path_list $cf_search"
+ ;;
+ esac
+ done
+fi
+
+cf_search=
+
+test "x$prefix" != "xNONE" && \
+test -d "$prefix" && \
+ {
+ test -n "$verbose" && echo " ... testing for lib-directories under $prefix"
+ test -d "$prefix/lib" && cf_search="$cf_search $prefix/lib"
+ test -d "$prefix/lib/ssl" && cf_search="$cf_search $prefix/lib/ssl"
+ test -d "$prefix/lib/ssl/lib" && cf_search="$cf_search $prefix/lib/ssl/lib"
+ test -d "$prefix/ssl/lib" && cf_search="$cf_search $prefix/ssl/lib"
+ test -d "$prefix/ssl/lib/ssl" && cf_search="$cf_search $prefix/ssl/lib/ssl"
+}
+
+for cf_subdir_prefix in \
+ /usr \
+ /usr/local \
+ /usr/pkg \
+ /opt \
+ /opt/local \
+ $HOME
+do
+
+test "x$cf_subdir_prefix" != "x$prefix" && \
+test -d "$cf_subdir_prefix" && \
+{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
+ test -n "$verbose" && echo " ... testing for lib-directories under $cf_subdir_prefix"
+ test -d "$cf_subdir_prefix/lib" && cf_search="$cf_search $cf_subdir_prefix/lib"
+ test -d "$cf_subdir_prefix/lib/ssl" && cf_search="$cf_search $cf_subdir_prefix/lib/ssl"
+ test -d "$cf_subdir_prefix/lib/ssl/lib" && cf_search="$cf_search $cf_subdir_prefix/lib/ssl/lib"
+ test -d "$cf_subdir_prefix/ssl/lib" && cf_search="$cf_search $cf_subdir_prefix/ssl/lib"
+ test -d "$cf_subdir_prefix/ssl/lib/ssl" && cf_search="$cf_search $cf_subdir_prefix/ssl/lib/ssl"
+}
+
+done
+
+cf_search="$cf_library_path_list $cf_search"
+
+ for cf_cv_library_path_ssl in $cf_search
+ do
+ if test -d "$cf_cv_library_path_ssl" ; then
+ test -n "$verbose" && echo " ... testing $cf_cv_library_path_ssl" 1>&6
+
+echo "${as_me:-configure}:17491: testing ... testing $cf_cv_library_path_ssl ..." 1>&5
+
+ CPPFLAGS="$cf_test_CPPFLAGS"
+ LIBS="-lssl $cf_extra_ssl_libs $cf_save_LIBS"
+ LDFLAGS="$cf_save_LDFLAGS -L$cf_cv_library_path_ssl"
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 17497 "configure"
+#include "confdefs.h"
+
+#include <stdio.h>
+#if defined(USE_OPENSSL_INCL)
+#include <openssl/ssl.h>
+#elif defined(USE_GNUTLS_FUNCS)
+#include <gnutls/gnutls.h>
+#elif defined(USE_GNUTLS_INCL)
+#include <gnutls/openssl.h>
+#else
+#include <ssl.h>
+#endif
+
+int
+main (void)
+{
+
+#ifdef USE_GNUTLS_FUNCS
+ gnutls_global_init();
+#else
+ SSL_shutdown((SSL *)0)
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:17526: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:17529: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:17532: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:17535: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ test -n "$verbose" && echo " ... found ssl library in $cf_cv_library_path_ssl" 1>&6
+
+echo "${as_me:-configure}:17540: testing ... found ssl library in $cf_cv_library_path_ssl ..." 1>&5
+
+ cf_cv_find_linkage_ssl=yes
+ cf_cv_library_file_ssl="-lssl"
+ break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+ CPPFLAGS="$cf_save_CPPFLAGS"
+ LIBS="$cf_save_LIBS"
+ LDFLAGS="$cf_save_LDFLAGS"
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+ fi
+ done
+ CPPFLAGS="$cf_save_CPPFLAGS"
+ LDFLAGS="$cf_save_LDFLAGS"
+ fi
+
+ else
+ cf_cv_find_linkage_ssl=no
+ fi
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+LIBS="$cf_save_LIBS"
+
+if test "$cf_cv_find_linkage_ssl" = yes ; then
+cf_cv_have_ssl=yes
+else
+cf_cv_have_ssl=no
+fi
+
+ if test "$cf_cv_pkg_config_ssl" != yes ; then
+ if test "$cf_cv_have_ssl" = yes ; then
+ if test -n "$cf_cv_library_path_ssl" ; then
+
+if test -n "$cf_cv_library_path_ssl" ; then
+ for cf_add_libdir in $cf_cv_library_path_ssl
+ do
+ if test "$cf_add_libdir" = /usr/lib ; then
+ :
+ elif test -d "$cf_add_libdir"
+ then
+ cf_have_libdir=no
+ if test -n "$LDFLAGS$LIBS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_libdir in $LDFLAGS $LIBS ; do
+ if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
+ cf_have_libdir=yes; break
+ fi
+ done
+ fi
+ if test "$cf_have_libdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
+
+echo "${as_me:-configure}:17602: testing adding $cf_add_libdir to library-path ..." 1>&5
+
+ LDFLAGS="-L$cf_add_libdir $LDFLAGS"
+ fi
+ fi
+ done
+fi
+
+ fi
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lssl $cf_extra_ssl_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+ if test -n "$cf_cv_header_path_ssl" ; then
+ case "$cf_cv_header_path_ssl" in
+ (/usr/include/openssl)
+ ;;
+ (*)
+
+if test -n "$cf_cv_header_path_ssl" ; then
+ for cf_add_incdir in $cf_cv_header_path_ssl
+ do
+ while test "$cf_add_incdir" != /usr/include
+ do
+ if test -d "$cf_add_incdir"
+ then
+ cf_have_incdir=no
+ if test -n "$CFLAGS$CPPFLAGS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+ if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+ cf_have_incdir=yes; break
+ fi
+ done
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ if test "$cf_add_incdir" = /usr/local/include ; then
+ if test "$GCC" = yes
+ then
+ cf_save_CPPFLAGS=$CPPFLAGS
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 17661 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:17673: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:17676: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:17679: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:17682: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ CPPFLAGS=$cf_save_CPPFLAGS
+ fi
+ fi
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:17699: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+ CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+ cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+ test "$cf_top_incdir" = "$cf_add_incdir" && break
+ cf_add_incdir="$cf_top_incdir"
+ else
+ break
+ fi
+ else
+ break
+ fi
+ done
+ done
+fi
+
+ ;;
+ esac
+ fi
+ fi
+ fi
+ fi
+
+ if test "$cf_cv_have_ssl" = yes ; then
+
+cat >>confdefs.h <<\EOF
+#define USE_SSL 1
+EOF
+
+ if test -n "$cf_cv_header_path_ssl" ; then
+ test -n "$verbose" && echo " checking ssl header-path $cf_cv_header_path_ssl" 1>&6
+
+echo "${as_me:-configure}:17732: testing checking ssl header-path $cf_cv_header_path_ssl ..." 1>&5
+
+ case "$cf_cv_header_path_ssl" in
+ (*/openssl)
+
+cat >>confdefs.h <<\EOF
+#define USE_OPENSSL_INCL 1
+EOF
+
+ ;;
+ esac
+ fi
+
+echo "$as_me:17745: checking for X509 support" >&5
+echo $ECHO_N "checking for X509 support... $ECHO_C" >&6
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 17748 "configure"
+#include "confdefs.h"
+
+#include <stdio.h>
+#if defined(USE_OPENSSL_INCL)
+#include <openssl/ssl.h>
+#elif defined(USE_GNUTLS_FUNCS)
+#include <gnutls/gnutls.h>
+#elif defined(USE_GNUTLS_INCL)
+#include <gnutls/openssl.h>
+#else
+#include <ssl.h>
+#endif
+
+#if defined(USE_GNUTLS_INCL)
+#include <gnutls/x509.h>
+#else
+#include <openssl/x509.h>
+#endif
+
+int
+main (void)
+{
+X509_verify_cert_error_string(X509_STORE_CTX_get_error(NULL))
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:17777: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:17780: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:17783: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:17786: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_x509_support=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_x509_support=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+echo "$as_me:17795: result: $cf_x509_support" >&5
+echo "${ECHO_T}$cf_x509_support" >&6
+
+if test "$cf_x509_support" = yes ; then
+ cat >>confdefs.h <<\EOF
+#define USE_X509_SUPPORT 1
+EOF
+
+fi
+
+ fi
+
+elif test "x$cf_cv_use_libgnutls" != xno ; then
+ if test "x$cf_cv_gnutls_compat" = xno ; then
+
+ cf_cv_have_gnutls=no
+ cf_cv_pkg_config_ssl=no
+
+case "$cf_cv_use_libgnutls" in
+(no)
+ ;;
+(yes)
+ ;;
+(*)
+
+for cf_searchpath in `echo "$cf_cv_use_libgnutls" | tr $PATH_SEPARATOR ' '`; do
+ if test -d "$cf_searchpath/include" ; then
+
+if test -n "$cf_searchpath/include" ; then
+ for cf_add_incdir in $cf_searchpath/include
+ do
+ while test "$cf_add_incdir" != /usr/include
+ do
+ if test -d "$cf_add_incdir"
+ then
+ cf_have_incdir=no
+ if test -n "$CFLAGS$CPPFLAGS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+ if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+ cf_have_incdir=yes; break
+ fi
+ done
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ if test "$cf_add_incdir" = /usr/local/include ; then
+ if test "$GCC" = yes
+ then
+ cf_save_CPPFLAGS=$CPPFLAGS
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 17850 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:17862: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:17865: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:17868: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:17871: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ CPPFLAGS=$cf_save_CPPFLAGS
+ fi
+ fi
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:17888: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+ CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+ cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+ test "$cf_top_incdir" = "$cf_add_incdir" && break
+ cf_add_incdir="$cf_top_incdir"
+ else
+ break
+ fi
+ else
+ break
+ fi
+ done
+ done
+fi
+
+ elif test -d "$cf_searchpath/../include" ; then
+
+if test -n "$cf_searchpath/../include" ; then
+ for cf_add_incdir in $cf_searchpath/../include
+ do
+ while test "$cf_add_incdir" != /usr/include
+ do
+ if test -d "$cf_add_incdir"
+ then
+ cf_have_incdir=no
+ if test -n "$CFLAGS$CPPFLAGS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+ if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+ cf_have_incdir=yes; break
+ fi
+ done
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ if test "$cf_add_incdir" = /usr/local/include ; then
+ if test "$GCC" = yes
+ then
+ cf_save_CPPFLAGS=$CPPFLAGS
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 17934 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:17946: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:17949: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:17952: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:17955: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ CPPFLAGS=$cf_save_CPPFLAGS
+ fi
+ fi
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:17972: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+ CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+ cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+ test "$cf_top_incdir" = "$cf_add_incdir" && break
+ cf_add_incdir="$cf_top_incdir"
+ else
+ break
+ fi
+ else
+ break
+ fi
+ done
+ done
+fi
+
+ else
+{ { echo "$as_me:17990: error: cannot find ssl library under $cf_cv_use_libgnutls" >&5
+echo "$as_me: error: cannot find ssl library under $cf_cv_use_libgnutls" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+ if test -d "$cf_searchpath/lib" ; then
+
+if test -n "$cf_searchpath/lib" ; then
+ for cf_add_libdir in $cf_searchpath/lib
+ do
+ if test "$cf_add_libdir" = /usr/lib ; then
+ :
+ elif test -d "$cf_add_libdir"
+ then
+ cf_have_libdir=no
+ if test -n "$LDFLAGS$LIBS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_libdir in $LDFLAGS $LIBS ; do
+ if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
+ cf_have_libdir=yes; break
+ fi
+ done
+ fi
+ if test "$cf_have_libdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
+
+echo "${as_me:-configure}:18015: testing adding $cf_add_libdir to library-path ..." 1>&5
+
+ LDFLAGS="-L$cf_add_libdir $LDFLAGS"
+ fi
+ fi
+ done
+fi
+
+ elif test -d "$cf_searchpath" ; then
+
+if test -n "$cf_searchpath" ; then
+ for cf_add_libdir in $cf_searchpath
+ do
+ if test "$cf_add_libdir" = /usr/lib ; then
+ :
+ elif test -d "$cf_add_libdir"
+ then
+ cf_have_libdir=no
+ if test -n "$LDFLAGS$LIBS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_libdir in $LDFLAGS $LIBS ; do
+ if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
+ cf_have_libdir=yes; break
+ fi
+ done
+ fi
+ if test "$cf_have_libdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
+
+echo "${as_me:-configure}:18044: testing adding $cf_add_libdir to library-path ..." 1>&5
+
+ LDFLAGS="-L$cf_add_libdir $LDFLAGS"
+ fi
+ fi
+ done
+fi
+
+ else
+{ { echo "$as_me:18053: error: cannot find ssl library under $cf_cv_use_libgnutls" >&5
+echo "$as_me: error: cannot find ssl library under $cf_cv_use_libgnutls" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+done
+
+ ;;
+esac
+
+ cf_pkg_gnutls=none
+ if test "x$PKG_CONFIG" != xnone; then
+ cf_pkg_gnutls=gnutls
+ case "$cf_cv_use_libgnutls" in
+ (no)
+ ;;
+ (yes) # if no explicit directory given, try pkg-config
+ test -n "$verbose" && echo " checking pkg-config for $cf_pkg_gnutls" 1>&6
+
+echo "${as_me:-configure}:18071: testing checking pkg-config for $cf_pkg_gnutls ..." 1>&5
+
+ if "$PKG_CONFIG" --exists $cf_pkg_gnutls ; then
+ test -n "$verbose" && echo " ... found $cf_pkg_gnutls in pkg-config" 1>&6
+
+echo "${as_me:-configure}:18076: testing ... found $cf_pkg_gnutls in pkg-config ..." 1>&5
+
+ cf_cv_have_gnutls=yes
+ cf_cv_pkg_config_ssl=yes
+
+ cf_cflags_ssl=`$PKG_CONFIG --cflags $cf_pkg_gnutls`
+ cf_libs_ssl=`$PKG_CONFIG --libs $cf_pkg_gnutls`
+
+ if test -n "$cf_cflags_ssl" ; then
+ case "$cf_cflags_ssl" in
+ (*-I*)
+ cf_cv_header_path_gnutls=`echo "$cf_cflags_ssl" | sed -e 's/^.*-I//' -e 's/ .*//'`
+ ;;
+ (*)
+ cf_cv_header_path_gnutls=/usr/include
+ ;;
+ esac
+ if test -d "$cf_cv_header_path_gnutls/gnutls" ; then
+ cf_cv_header_path_gnutls=$cf_cv_header_path_gnutls/gnutls
+ fi
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_cflags_ssl
+do
+case "$cf_fix_cppflags" in
+(no)
+ case "$cf_add_cflags" in
+ (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=yes
+
+ if test "$cf_fix_cppflags" = yes ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ elif test "${cf_tst_cflags}" = "\"'" ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ fi
+ ;;
+ esac
+ case "$CPPFLAGS" in
+ (*$cf_add_cflags)
+ ;;
+ (*)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+ sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \
+ -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'`
+
+ ;;
+ esac
+
+ test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+ cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+ (*)
+
+ test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+ cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+(yes)
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=no
+ ;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+ test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+ CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+ test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+ EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+ fi
+
+ if test -n "$cf_libs_ssl" ; then
+ case "x$cf_libs_ssl" in
+ (*-L*)
+ cf_cv_library_path_gnutls=`echo "$cf_libs_ssl" | sed -e 's/^.*-L//' -e 's/ .*//'`
+ ;;
+ (*)
+ cf_cv_library_path_gnutls=/usr/lib
+ ;;
+ esac
+ test -n "$verbose" && echo " adding $cf_libs_ssl to LIBS" 1>&6
+
+echo "${as_me:-configure}:18208: testing adding $cf_libs_ssl to LIBS ..." 1>&5
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_libs_ssl; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+ fi
+ else
+ test -n "$verbose" && echo " ... did not find $cf_pkg_gnutls in pkg-config" 1>&6
+
+echo "${as_me:-configure}:18230: testing ... did not find $cf_pkg_gnutls in pkg-config ..." 1>&5
+
+ cf_pkg_gnutls=none
+ fi
+ ;;
+ esac
+ fi
+
+cat >>confdefs.h <<\EOF
+#define USE_GNUTLS_FUNCS 1
+EOF
+
+ if test "$cf_cv_have_gnutls" = no ; then
+ cf_gnutls_CPPFLAGS=$CPPFLAGS
+
+# If the linkage is not already in the $CPPFLAGS/$LDFLAGS configuration, these
+# will be set on completion of the AC_TRY_LINK below.
+cf_cv_header_path_gnutls=
+cf_cv_library_path_gnutls=
+
+echo "${as_me:-configure}:18250: testing Starting FIND_LINKAGE(gnutls,) ..." 1>&5
+
+cf_save_LIBS="$LIBS"
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 18255 "configure"
+#include "confdefs.h"
+
+#include <stdio.h>
+#if defined(USE_OPENSSL_INCL)
+#include <openssl/ssl.h>
+#elif defined(USE_GNUTLS_FUNCS)
+#include <gnutls/gnutls.h>
+#elif defined(USE_GNUTLS_INCL)
+#include <gnutls/openssl.h>
+#else
+#include <ssl.h>
+#endif
+
+int
+main (void)
+{
+
+#ifdef USE_GNUTLS_FUNCS
+ gnutls_global_init();
+#else
+ SSL_shutdown((SSL *)0)
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:18284: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:18287: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:18290: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:18293: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ cf_cv_find_linkage_gnutls=yes
+ cf_cv_header_path_gnutls=/usr/include
+ cf_cv_library_path_gnutls=/usr/lib
+
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+LIBS="-lgnutls $cf_save_LIBS"
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 18307 "configure"
+#include "confdefs.h"
+
+#include <stdio.h>
+#if defined(USE_OPENSSL_INCL)
+#include <openssl/ssl.h>
+#elif defined(USE_GNUTLS_FUNCS)
+#include <gnutls/gnutls.h>
+#elif defined(USE_GNUTLS_INCL)
+#include <gnutls/openssl.h>
+#else
+#include <ssl.h>
+#endif
+
+int
+main (void)
+{
+
+#ifdef USE_GNUTLS_FUNCS
+ gnutls_global_init();
+#else
+ SSL_shutdown((SSL *)0)
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:18336: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:18339: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:18342: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:18345: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ cf_cv_find_linkage_gnutls=yes
+ cf_cv_header_path_gnutls=/usr/include
+ cf_cv_library_path_gnutls=/usr/lib
+ cf_cv_library_file_gnutls="-lgnutls"
+
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+ cf_cv_find_linkage_gnutls=no
+ LIBS="$cf_save_LIBS"
+
+ test -n "$verbose" && echo " find linkage for gnutls library" 1>&6
+
+echo "${as_me:-configure}:18362: testing find linkage for gnutls library ..." 1>&5
+
+echo "${as_me:-configure}:18364: testing Searching for headers in FIND_LINKAGE(gnutls,) ..." 1>&5
+
+ cf_save_CPPFLAGS="$CPPFLAGS"
+ cf_test_CPPFLAGS="$CPPFLAGS"
+
+cf_search=
+
+# collect the current set of include-directories from compiler flags
+cf_header_path_list=""
+if test -n "${CFLAGS}${CPPFLAGS}" ; then
+ for cf_header_path in $CPPFLAGS $CFLAGS
+ do
+ case "$cf_header_path" in
+ (-I*)
+ cf_header_path=`echo ".$cf_header_path" |sed -e 's/^...//' -e 's,/include$,,'`
+
+test "x$cf_header_path" != "xNONE" && \
+test -d "$cf_header_path" && \
+ {
+ test -n "$verbose" && echo " ... testing for include-directories under $cf_header_path"
+ test -d "$cf_header_path/include" && cf_search="$cf_search $cf_header_path/include"
+ test -d "$cf_header_path/include/gnutls" && cf_search="$cf_search $cf_header_path/include/gnutls"
+ test -d "$cf_header_path/include/gnutls/include" && cf_search="$cf_search $cf_header_path/include/gnutls/include"
+ test -d "$cf_header_path/gnutls/include" && cf_search="$cf_search $cf_header_path/gnutls/include"
+ test -d "$cf_header_path/gnutls/include/gnutls" && cf_search="$cf_search $cf_header_path/gnutls/include/gnutls"
+}
+
+ cf_header_path_list="$cf_header_path_list $cf_search"
+ ;;
+ esac
+ done
+fi
+
+# add the variations for the package we are looking for
+
+cf_search=
+
+test "x$prefix" != "xNONE" && \
+test -d "$prefix" && \
+ {
+ test -n "$verbose" && echo " ... testing for include-directories under $prefix"
+ test -d "$prefix/include" && cf_search="$cf_search $prefix/include"
+ test -d "$prefix/include/gnutls" && cf_search="$cf_search $prefix/include/gnutls"
+ test -d "$prefix/include/gnutls/include" && cf_search="$cf_search $prefix/include/gnutls/include"
+ test -d "$prefix/gnutls/include" && cf_search="$cf_search $prefix/gnutls/include"
+ test -d "$prefix/gnutls/include/gnutls" && cf_search="$cf_search $prefix/gnutls/include/gnutls"
+}
+
+for cf_subdir_prefix in \
+ /usr \
+ /usr/local \
+ /usr/pkg \
+ /opt \
+ /opt/local \
+ $HOME
+do
+
+test "x$cf_subdir_prefix" != "x$prefix" && \
+test -d "$cf_subdir_prefix" && \
+{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
+ test -n "$verbose" && echo " ... testing for include-directories under $cf_subdir_prefix"
+ test -d "$cf_subdir_prefix/include" && cf_search="$cf_search $cf_subdir_prefix/include"
+ test -d "$cf_subdir_prefix/include/gnutls" && cf_search="$cf_search $cf_subdir_prefix/include/gnutls"
+ test -d "$cf_subdir_prefix/include/gnutls/include" && cf_search="$cf_search $cf_subdir_prefix/include/gnutls/include"
+ test -d "$cf_subdir_prefix/gnutls/include" && cf_search="$cf_search $cf_subdir_prefix/gnutls/include"
+ test -d "$cf_subdir_prefix/gnutls/include/gnutls" && cf_search="$cf_search $cf_subdir_prefix/gnutls/include/gnutls"
+}
+
+done
+
+test "$includedir" != NONE && \
+test "$includedir" != "/usr/include" && \
+test -d "$includedir" && {
+ test -d "$includedir" && cf_search="$cf_search $includedir"
+ test -d "$includedir/gnutls" && cf_search="$cf_search $includedir/gnutls"
+}
+
+test "$oldincludedir" != NONE && \
+test "$oldincludedir" != "/usr/include" && \
+test -d "$oldincludedir" && {
+ test -d "$oldincludedir" && cf_search="$cf_search $oldincludedir"
+ test -d "$oldincludedir/gnutls" && cf_search="$cf_search $oldincludedir/gnutls"
+}
+
+cf_search="$cf_search $cf_header_path_list"
+
+ for cf_cv_header_path_gnutls in $cf_search
+ do
+ if test -d "$cf_cv_header_path_gnutls" ; then
+ test -n "$verbose" && echo " ... testing $cf_cv_header_path_gnutls" 1>&6
+
+echo "${as_me:-configure}:18455: testing ... testing $cf_cv_header_path_gnutls ..." 1>&5
+
+ CPPFLAGS="$cf_save_CPPFLAGS"
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_cv_header_path_gnutls"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 18463 "configure"
+#include "confdefs.h"
+
+#include <stdio.h>
+#if defined(USE_OPENSSL_INCL)
+#include <openssl/ssl.h>
+#elif defined(USE_GNUTLS_FUNCS)
+#include <gnutls/gnutls.h>
+#elif defined(USE_GNUTLS_INCL)
+#include <gnutls/openssl.h>
+#else
+#include <ssl.h>
+#endif
+
+int
+main (void)
+{
+
+#ifdef USE_GNUTLS_FUNCS
+ gnutls_global_init();
+#else
+ SSL_shutdown((SSL *)0)
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:18492: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:18495: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:18498: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:18501: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ test -n "$verbose" && echo " ... found gnutls headers in $cf_cv_header_path_gnutls" 1>&6
+
+echo "${as_me:-configure}:18506: testing ... found gnutls headers in $cf_cv_header_path_gnutls ..." 1>&5
+
+ cf_cv_find_linkage_gnutls=maybe
+ cf_test_CPPFLAGS="$CPPFLAGS"
+ break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+ CPPFLAGS="$cf_save_CPPFLAGS"
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ fi
+ done
+
+ if test "$cf_cv_find_linkage_gnutls" = maybe ; then
+
+echo "${as_me:-configure}:18524: testing Searching for gnutls library in FIND_LINKAGE(gnutls,) ..." 1>&5
+
+ cf_save_LIBS="$LIBS"
+ cf_save_LDFLAGS="$LDFLAGS"
+
+ if test "$cf_cv_find_linkage_gnutls" != yes ; then
+
+cf_search=
+cf_library_path_list=""
+if test -n "${LDFLAGS}${LIBS}" ; then
+ for cf_library_path in $LDFLAGS $LIBS
+ do
+ case "$cf_library_path" in
+ (-L*)
+ cf_library_path=`echo ".$cf_library_path" |sed -e 's/^...//' -e 's,/lib$,,'`
+
+test "x$cf_library_path" != "xNONE" && \
+test -d "$cf_library_path" && \
+ {
+ test -n "$verbose" && echo " ... testing for lib-directories under $cf_library_path"
+ test -d "$cf_library_path/lib" && cf_search="$cf_search $cf_library_path/lib"
+ test -d "$cf_library_path/lib/gnutls" && cf_search="$cf_search $cf_library_path/lib/gnutls"
+ test -d "$cf_library_path/lib/gnutls/lib" && cf_search="$cf_search $cf_library_path/lib/gnutls/lib"
+ test -d "$cf_library_path/gnutls/lib" && cf_search="$cf_search $cf_library_path/gnutls/lib"
+ test -d "$cf_library_path/gnutls/lib/gnutls" && cf_search="$cf_search $cf_library_path/gnutls/lib/gnutls"
+}
+
+ cf_library_path_list="$cf_library_path_list $cf_search"
+ ;;
+ esac
+ done
+fi
+
+cf_search=
+
+test "x$prefix" != "xNONE" && \
+test -d "$prefix" && \
+ {
+ test -n "$verbose" && echo " ... testing for lib-directories under $prefix"
+ test -d "$prefix/lib" && cf_search="$cf_search $prefix/lib"
+ test -d "$prefix/lib/gnutls" && cf_search="$cf_search $prefix/lib/gnutls"
+ test -d "$prefix/lib/gnutls/lib" && cf_search="$cf_search $prefix/lib/gnutls/lib"
+ test -d "$prefix/gnutls/lib" && cf_search="$cf_search $prefix/gnutls/lib"
+ test -d "$prefix/gnutls/lib/gnutls" && cf_search="$cf_search $prefix/gnutls/lib/gnutls"
+}
+
+for cf_subdir_prefix in \
+ /usr \
+ /usr/local \
+ /usr/pkg \
+ /opt \
+ /opt/local \
+ $HOME
+do
+
+test "x$cf_subdir_prefix" != "x$prefix" && \
+test -d "$cf_subdir_prefix" && \
+{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
+ test -n "$verbose" && echo " ... testing for lib-directories under $cf_subdir_prefix"
+ test -d "$cf_subdir_prefix/lib" && cf_search="$cf_search $cf_subdir_prefix/lib"
+ test -d "$cf_subdir_prefix/lib/gnutls" && cf_search="$cf_search $cf_subdir_prefix/lib/gnutls"
+ test -d "$cf_subdir_prefix/lib/gnutls/lib" && cf_search="$cf_search $cf_subdir_prefix/lib/gnutls/lib"
+ test -d "$cf_subdir_prefix/gnutls/lib" && cf_search="$cf_search $cf_subdir_prefix/gnutls/lib"
+ test -d "$cf_subdir_prefix/gnutls/lib/gnutls" && cf_search="$cf_search $cf_subdir_prefix/gnutls/lib/gnutls"
+}
+
+done
+
+cf_search="$cf_library_path_list $cf_search"
+
+ for cf_cv_library_path_gnutls in $cf_search
+ do
+ if test -d "$cf_cv_library_path_gnutls" ; then
+ test -n "$verbose" && echo " ... testing $cf_cv_library_path_gnutls" 1>&6
+
+echo "${as_me:-configure}:18599: testing ... testing $cf_cv_library_path_gnutls ..." 1>&5
+
+ CPPFLAGS="$cf_test_CPPFLAGS"
+ LIBS="-lgnutls $cf_save_LIBS"
+ LDFLAGS="$cf_save_LDFLAGS -L$cf_cv_library_path_gnutls"
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 18605 "configure"
+#include "confdefs.h"
+
+#include <stdio.h>
+#if defined(USE_OPENSSL_INCL)
+#include <openssl/ssl.h>
+#elif defined(USE_GNUTLS_FUNCS)
+#include <gnutls/gnutls.h>
+#elif defined(USE_GNUTLS_INCL)
+#include <gnutls/openssl.h>
+#else
+#include <ssl.h>
+#endif
+
+int
+main (void)
+{
+
+#ifdef USE_GNUTLS_FUNCS
+ gnutls_global_init();
+#else
+ SSL_shutdown((SSL *)0)
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:18634: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:18637: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:18640: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:18643: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ test -n "$verbose" && echo " ... found gnutls library in $cf_cv_library_path_gnutls" 1>&6
+
+echo "${as_me:-configure}:18648: testing ... found gnutls library in $cf_cv_library_path_gnutls ..." 1>&5
+
+ cf_cv_find_linkage_gnutls=yes
+ cf_cv_library_file_gnutls="-lgnutls"
+ break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+ CPPFLAGS="$cf_save_CPPFLAGS"
+ LIBS="$cf_save_LIBS"
+ LDFLAGS="$cf_save_LDFLAGS"
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+ fi
+ done
+ CPPFLAGS="$cf_save_CPPFLAGS"
+ LDFLAGS="$cf_save_LDFLAGS"
+ fi
+
+ else
+ cf_cv_find_linkage_gnutls=no
+ fi
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+LIBS="$cf_save_LIBS"
+
+if test "$cf_cv_find_linkage_gnutls" = yes ; then
+cf_cv_have_gnutls=yes
+else
+cf_cv_have_gnutls=no
+fi
+
+ CPPFLAGS=$cf_gnutls_CPPFLAGS
+ fi
+
+ if test "$cf_cv_have_gnutls" = yes ; then
+ if test -n "$cf_cv_header_path_gnutls" ; then
+ cat >>confdefs.h <<\EOF
+#define USE_SSL 1
+EOF
+
+ case "$cf_cv_header_path_gnutls" in
+ (/usr/include/gnutls)
+ ;;
+ (*)
+
+if test -n "$cf_cv_header_path_gnutls" ; then
+ for cf_add_incdir in $cf_cv_header_path_gnutls
+ do
+ while test "$cf_add_incdir" != /usr/include
+ do
+ if test -d "$cf_add_incdir"
+ then
+ cf_have_incdir=no
+ if test -n "$CFLAGS$CPPFLAGS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+ if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+ cf_have_incdir=yes; break
+ fi
+ done
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ if test "$cf_add_incdir" = /usr/local/include ; then
+ if test "$GCC" = yes
+ then
+ cf_save_CPPFLAGS=$CPPFLAGS
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 18728 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:18740: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:18743: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:18746: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:18749: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ CPPFLAGS=$cf_save_CPPFLAGS
+ fi
+ fi
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:18766: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+ CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+ cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+ test "$cf_top_incdir" = "$cf_add_incdir" && break
+ cf_add_incdir="$cf_top_incdir"
+ else
+ break
+ fi
+ else
+ break
+ fi
+ done
+ done
+fi
+
+ ;;
+ esac
+ fi
+ if test -n "$cf_cv_library_path_gnutls" ; then
+
+if test -n "$cf_cv_library_path_gnutls" ; then
+ for cf_add_libdir in $cf_cv_library_path_gnutls
+ do
+ if test "$cf_add_libdir" = /usr/lib ; then
+ :
+ elif test -d "$cf_add_libdir"
+ then
+ cf_have_libdir=no
+ if test -n "$LDFLAGS$LIBS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_libdir in $LDFLAGS $LIBS ; do
+ if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
+ cf_have_libdir=yes; break
+ fi
+ done
+ fi
+ if test "$cf_have_libdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
+
+echo "${as_me:-configure}:18807: testing adding $cf_add_libdir to library-path ..." 1>&5
+
+ LDFLAGS="-L$cf_add_libdir $LDFLAGS"
+ fi
+ fi
+ done
+fi
+
+ fi
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lgnutls; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+for ac_func in gnutls_protocol_set_priority
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:18836: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 18842 "configure"
+#include "confdefs.h"
+#define $ac_func autoconf_temporary
+#include <limits.h> /* least-intrusive standard header which defines gcc2 __stub macros */
+#undef $ac_func
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+#error found stub for $ac_func
+#endif
+
+ return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:18873: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:18876: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:18879: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:18882: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+eval "$as_ac_var=no"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:18892: result: `eval echo '${'"$as_ac_var"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_var"'}'`" >&6
+if test "`eval echo '${'"$as_ac_var"'}'`" = yes; then
+ cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+ echo "$as_me:18902: checking for gnutls_rnd" >&5
+echo $ECHO_N "checking for gnutls_rnd... $ECHO_C" >&6
+if test "${ac_cv_func_gnutls_rnd+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 18908 "configure"
+#include "confdefs.h"
+#define gnutls_rnd autoconf_temporary
+#include <limits.h> /* least-intrusive standard header which defines gcc2 __stub macros */
+#undef gnutls_rnd
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char gnutls_rnd (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_gnutls_rnd) || defined (__stub___gnutls_rnd)
+#error found stub for gnutls_rnd
+#endif
+
+ return gnutls_rnd ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:18939: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:18942: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:18945: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:18948: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_func_gnutls_rnd=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_gnutls_rnd=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:18958: result: $ac_cv_func_gnutls_rnd" >&5
+echo "${ECHO_T}$ac_cv_func_gnutls_rnd" >&6
+if test "$ac_cv_func_gnutls_rnd" = yes; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_GNUTLS_RND 1
+EOF
+
+else
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lgcrypt; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+fi
+
+ EXTRA_OBJS="$EXTRA_OBJS tidy_tls\$o"
+
+echo "$as_me:18988: checking for X509 support" >&5
+echo $ECHO_N "checking for X509 support... $ECHO_C" >&6
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 18991 "configure"
+#include "confdefs.h"
+
+#include <stdio.h>
+#if defined(USE_OPENSSL_INCL)
+#include <openssl/ssl.h>
+#elif defined(USE_GNUTLS_FUNCS)
+#include <gnutls/gnutls.h>
+#elif defined(USE_GNUTLS_INCL)
+#include <gnutls/openssl.h>
+#else
+#include <ssl.h>
+#endif
+
+#if defined(USE_GNUTLS_INCL)
+#include <gnutls/x509.h>
+#else
+#include <openssl/x509.h>
+#endif
+
+int
+main (void)
+{
+X509_verify_cert_error_string(X509_STORE_CTX_get_error(NULL))
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:19020: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:19023: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:19026: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:19029: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_x509_support=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_x509_support=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+echo "$as_me:19038: result: $cf_x509_support" >&5
+echo "${ECHO_T}$cf_x509_support" >&6
+
+if test "$cf_x509_support" = yes ; then
+ cat >>confdefs.h <<\EOF
+#define USE_X509_SUPPORT 1
+EOF
+
+fi
+
+ fi
+
+ else
+
+ cf_cv_have_gnutls=no
+ cf_cv_pkg_config_ssl=no
+
+case "$cf_cv_use_libgnutls" in
+(no)
+ ;;
+(yes)
+ ;;
+(*)
+
+for cf_searchpath in `echo "$cf_cv_use_libgnutls" | tr $PATH_SEPARATOR ' '`; do
+ if test -d "$cf_searchpath/include" ; then
+
+if test -n "$cf_searchpath/include" ; then
+ for cf_add_incdir in $cf_searchpath/include
+ do
+ while test "$cf_add_incdir" != /usr/include
+ do
+ if test -d "$cf_add_incdir"
+ then
+ cf_have_incdir=no
+ if test -n "$CFLAGS$CPPFLAGS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+ if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+ cf_have_incdir=yes; break
+ fi
+ done
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ if test "$cf_add_incdir" = /usr/local/include ; then
+ if test "$GCC" = yes
+ then
+ cf_save_CPPFLAGS=$CPPFLAGS
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 19092 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:19104: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:19107: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:19110: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:19113: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ CPPFLAGS=$cf_save_CPPFLAGS
+ fi
+ fi
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:19130: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+ CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+ cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+ test "$cf_top_incdir" = "$cf_add_incdir" && break
+ cf_add_incdir="$cf_top_incdir"
+ else
+ break
+ fi
+ else
+ break
+ fi
+ done
+ done
+fi
+
+ elif test -d "$cf_searchpath/../include" ; then
+
+if test -n "$cf_searchpath/../include" ; then
+ for cf_add_incdir in $cf_searchpath/../include
+ do
+ while test "$cf_add_incdir" != /usr/include
+ do
+ if test -d "$cf_add_incdir"
+ then
+ cf_have_incdir=no
+ if test -n "$CFLAGS$CPPFLAGS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+ if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+ cf_have_incdir=yes; break
+ fi
+ done
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ if test "$cf_add_incdir" = /usr/local/include ; then
+ if test "$GCC" = yes
+ then
+ cf_save_CPPFLAGS=$CPPFLAGS
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 19176 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:19188: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:19191: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:19194: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:19197: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ CPPFLAGS=$cf_save_CPPFLAGS
+ fi
+ fi
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:19214: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+ CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+ cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+ test "$cf_top_incdir" = "$cf_add_incdir" && break
+ cf_add_incdir="$cf_top_incdir"
+ else
+ break
+ fi
+ else
+ break
+ fi
+ done
+ done
+fi
+
+ else
+{ { echo "$as_me:19232: error: cannot find ssl library under $cf_cv_use_libgnutls" >&5
+echo "$as_me: error: cannot find ssl library under $cf_cv_use_libgnutls" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+ if test -d "$cf_searchpath/lib" ; then
+
+if test -n "$cf_searchpath/lib" ; then
+ for cf_add_libdir in $cf_searchpath/lib
+ do
+ if test "$cf_add_libdir" = /usr/lib ; then
+ :
+ elif test -d "$cf_add_libdir"
+ then
+ cf_have_libdir=no
+ if test -n "$LDFLAGS$LIBS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_libdir in $LDFLAGS $LIBS ; do
+ if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
+ cf_have_libdir=yes; break
+ fi
+ done
+ fi
+ if test "$cf_have_libdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
+
+echo "${as_me:-configure}:19257: testing adding $cf_add_libdir to library-path ..." 1>&5
+
+ LDFLAGS="-L$cf_add_libdir $LDFLAGS"
+ fi
+ fi
+ done
+fi
+
+ elif test -d "$cf_searchpath" ; then
+
+if test -n "$cf_searchpath" ; then
+ for cf_add_libdir in $cf_searchpath
+ do
+ if test "$cf_add_libdir" = /usr/lib ; then
+ :
+ elif test -d "$cf_add_libdir"
+ then
+ cf_have_libdir=no
+ if test -n "$LDFLAGS$LIBS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_libdir in $LDFLAGS $LIBS ; do
+ if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
+ cf_have_libdir=yes; break
+ fi
+ done
+ fi
+ if test "$cf_have_libdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
+
+echo "${as_me:-configure}:19286: testing adding $cf_add_libdir to library-path ..." 1>&5
+
+ LDFLAGS="-L$cf_add_libdir $LDFLAGS"
+ fi
+ fi
+ done
+fi
+
+ else
+{ { echo "$as_me:19295: error: cannot find ssl library under $cf_cv_use_libgnutls" >&5
+echo "$as_me: error: cannot find ssl library under $cf_cv_use_libgnutls" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+done
+
+ ;;
+esac
+
+ cf_pkg_gnutls=none
+ if test "x$PKG_CONFIG" != xnone; then
+ cf_pkg_gnutls=gnutls-openssl
+ case "$cf_cv_use_libgnutls" in
+ (no)
+ ;;
+ (yes) # if no explicit directory given, try pkg-config
+ test -n "$verbose" && echo " checking pkg-config for $cf_pkg_gnutls" 1>&6
+
+echo "${as_me:-configure}:19313: testing checking pkg-config for $cf_pkg_gnutls ..." 1>&5
+
+ if "$PKG_CONFIG" --exists $cf_pkg_gnutls ; then
+ test -n "$verbose" && echo " ... found $cf_pkg_gnutls in pkg-config" 1>&6
+
+echo "${as_me:-configure}:19318: testing ... found $cf_pkg_gnutls in pkg-config ..." 1>&5
+
+ cf_cv_have_gnutls=yes
+ cf_cv_pkg_config_ssl=yes
+
+ cf_cflags_ssl=`$PKG_CONFIG --cflags $cf_pkg_gnutls`
+ cf_libs_ssl=`$PKG_CONFIG --libs $cf_pkg_gnutls`
+
+ if test -n "$cf_cflags_ssl" ; then
+ case "$cf_cflags_ssl" in
+ (*-I*)
+ cf_cv_header_path_gnutls=`echo "$cf_cflags_ssl" | sed -e 's/^.*-I//' -e 's/ .*//'`
+ ;;
+ (*)
+ cf_cv_header_path_gnutls=/usr/include
+ ;;
+ esac
+ if test -d "$cf_cv_header_path_gnutls/gnutls" ; then
+ cf_cv_header_path_gnutls=$cf_cv_header_path_gnutls/gnutls
+ fi
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_cflags_ssl
+do
+case "$cf_fix_cppflags" in
+(no)
+ case "$cf_add_cflags" in
+ (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=yes
+
+ if test "$cf_fix_cppflags" = yes ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ elif test "${cf_tst_cflags}" = "\"'" ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ fi
+ ;;
+ esac
+ case "$CPPFLAGS" in
+ (*$cf_add_cflags)
+ ;;
+ (*)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+ sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \
+ -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'`
+
+ ;;
+ esac
+
+ test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+ cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+ (*)
+
+ test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+ cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+(yes)
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=no
+ ;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+ test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+ CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+ test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+ EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+ fi
+
+ if test -n "$cf_libs_ssl" ; then
+ case "x$cf_libs_ssl" in
+ (*-L*)
+ cf_cv_library_path_gnutls=`echo "$cf_libs_ssl" | sed -e 's/^.*-L//' -e 's/ .*//'`
+ ;;
+ (*)
+ cf_cv_library_path_gnutls=/usr/lib
+ ;;
+ esac
+ test -n "$verbose" && echo " adding $cf_libs_ssl to LIBS" 1>&6
+
+echo "${as_me:-configure}:19450: testing adding $cf_libs_ssl to LIBS ..." 1>&5
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_libs_ssl; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+ fi
+ else
+ test -n "$verbose" && echo " ... did not find $cf_pkg_gnutls in pkg-config" 1>&6
+
+echo "${as_me:-configure}:19472: testing ... did not find $cf_pkg_gnutls in pkg-config ..." 1>&5
+
+ cf_pkg_gnutls=none
+ fi
+ ;;
+ esac
+ fi
+
+cat >>confdefs.h <<\EOF
+#define USE_GNUTLS_INCL 1
+EOF
+
+ if test "$cf_cv_have_gnutls" = no ; then
+ cf_gnutls_CPPFLAGS=$CPPFLAGS
+
+# If the linkage is not already in the $CPPFLAGS/$LDFLAGS configuration, these
+# will be set on completion of the AC_TRY_LINK below.
+cf_cv_header_path_gnutls=
+cf_cv_library_path_gnutls=
+
+echo "${as_me:-configure}:19492: testing Starting FIND_LINKAGE(gnutls,) ..." 1>&5
+
+cf_save_LIBS="$LIBS"
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 19497 "configure"
+#include "confdefs.h"
+
+#include <stdio.h>
+#if defined(USE_OPENSSL_INCL)
+#include <openssl/ssl.h>
+#elif defined(USE_GNUTLS_FUNCS)
+#include <gnutls/gnutls.h>
+#elif defined(USE_GNUTLS_INCL)
+#include <gnutls/openssl.h>
+#else
+#include <ssl.h>
+#endif
+
+int
+main (void)
+{
+
+#ifdef USE_GNUTLS_FUNCS
+ gnutls_global_init();
+#else
+ SSL_shutdown((SSL *)0)
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:19526: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:19529: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:19532: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:19535: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ cf_cv_find_linkage_gnutls=yes
+ cf_cv_header_path_gnutls=/usr/include
+ cf_cv_library_path_gnutls=/usr/lib
+
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+LIBS="-lgnutls -lgnutls-openssl $cf_save_LIBS"
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 19549 "configure"
+#include "confdefs.h"
+
+#include <stdio.h>
+#if defined(USE_OPENSSL_INCL)
+#include <openssl/ssl.h>
+#elif defined(USE_GNUTLS_FUNCS)
+#include <gnutls/gnutls.h>
+#elif defined(USE_GNUTLS_INCL)
+#include <gnutls/openssl.h>
+#else
+#include <ssl.h>
+#endif
+
+int
+main (void)
+{
+
+#ifdef USE_GNUTLS_FUNCS
+ gnutls_global_init();
+#else
+ SSL_shutdown((SSL *)0)
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:19578: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:19581: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:19584: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:19587: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ cf_cv_find_linkage_gnutls=yes
+ cf_cv_header_path_gnutls=/usr/include
+ cf_cv_library_path_gnutls=/usr/lib
+ cf_cv_library_file_gnutls="-lgnutls"
+
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+ cf_cv_find_linkage_gnutls=no
+ LIBS="$cf_save_LIBS"
+
+ test -n "$verbose" && echo " find linkage for gnutls library" 1>&6
+
+echo "${as_me:-configure}:19604: testing find linkage for gnutls library ..." 1>&5
+
+echo "${as_me:-configure}:19606: testing Searching for headers in FIND_LINKAGE(gnutls,) ..." 1>&5
+
+ cf_save_CPPFLAGS="$CPPFLAGS"
+ cf_test_CPPFLAGS="$CPPFLAGS"
+
+cf_search=
+
+# collect the current set of include-directories from compiler flags
+cf_header_path_list=""
+if test -n "${CFLAGS}${CPPFLAGS}" ; then
+ for cf_header_path in $CPPFLAGS $CFLAGS
+ do
+ case "$cf_header_path" in
+ (-I*)
+ cf_header_path=`echo ".$cf_header_path" |sed -e 's/^...//' -e 's,/include$,,'`
+
+test "x$cf_header_path" != "xNONE" && \
+test -d "$cf_header_path" && \
+ {
+ test -n "$verbose" && echo " ... testing for include-directories under $cf_header_path"
+ test -d "$cf_header_path/include" && cf_search="$cf_search $cf_header_path/include"
+ test -d "$cf_header_path/include/gnutls" && cf_search="$cf_search $cf_header_path/include/gnutls"
+ test -d "$cf_header_path/include/gnutls/include" && cf_search="$cf_search $cf_header_path/include/gnutls/include"
+ test -d "$cf_header_path/gnutls/include" && cf_search="$cf_search $cf_header_path/gnutls/include"
+ test -d "$cf_header_path/gnutls/include/gnutls" && cf_search="$cf_search $cf_header_path/gnutls/include/gnutls"
+}
+
+ cf_header_path_list="$cf_header_path_list $cf_search"
+ ;;
+ esac
+ done
+fi
+
+# add the variations for the package we are looking for
+
+cf_search=
+
+test "x$prefix" != "xNONE" && \
+test -d "$prefix" && \
+ {
+ test -n "$verbose" && echo " ... testing for include-directories under $prefix"
+ test -d "$prefix/include" && cf_search="$cf_search $prefix/include"
+ test -d "$prefix/include/gnutls" && cf_search="$cf_search $prefix/include/gnutls"
+ test -d "$prefix/include/gnutls/include" && cf_search="$cf_search $prefix/include/gnutls/include"
+ test -d "$prefix/gnutls/include" && cf_search="$cf_search $prefix/gnutls/include"
+ test -d "$prefix/gnutls/include/gnutls" && cf_search="$cf_search $prefix/gnutls/include/gnutls"
+}
+
+for cf_subdir_prefix in \
+ /usr \
+ /usr/local \
+ /usr/pkg \
+ /opt \
+ /opt/local \
+ $HOME
+do
+
+test "x$cf_subdir_prefix" != "x$prefix" && \
+test -d "$cf_subdir_prefix" && \
+{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
+ test -n "$verbose" && echo " ... testing for include-directories under $cf_subdir_prefix"
+ test -d "$cf_subdir_prefix/include" && cf_search="$cf_search $cf_subdir_prefix/include"
+ test -d "$cf_subdir_prefix/include/gnutls" && cf_search="$cf_search $cf_subdir_prefix/include/gnutls"
+ test -d "$cf_subdir_prefix/include/gnutls/include" && cf_search="$cf_search $cf_subdir_prefix/include/gnutls/include"
+ test -d "$cf_subdir_prefix/gnutls/include" && cf_search="$cf_search $cf_subdir_prefix/gnutls/include"
+ test -d "$cf_subdir_prefix/gnutls/include/gnutls" && cf_search="$cf_search $cf_subdir_prefix/gnutls/include/gnutls"
+}
+
+done
+
+test "$includedir" != NONE && \
+test "$includedir" != "/usr/include" && \
+test -d "$includedir" && {
+ test -d "$includedir" && cf_search="$cf_search $includedir"
+ test -d "$includedir/gnutls" && cf_search="$cf_search $includedir/gnutls"
+}
+
+test "$oldincludedir" != NONE && \
+test "$oldincludedir" != "/usr/include" && \
+test -d "$oldincludedir" && {
+ test -d "$oldincludedir" && cf_search="$cf_search $oldincludedir"
+ test -d "$oldincludedir/gnutls" && cf_search="$cf_search $oldincludedir/gnutls"
+}
+
+cf_search="$cf_search $cf_header_path_list"
+
+ for cf_cv_header_path_gnutls in $cf_search
+ do
+ if test -d "$cf_cv_header_path_gnutls" ; then
+ test -n "$verbose" && echo " ... testing $cf_cv_header_path_gnutls" 1>&6
+
+echo "${as_me:-configure}:19697: testing ... testing $cf_cv_header_path_gnutls ..." 1>&5
+
+ CPPFLAGS="$cf_save_CPPFLAGS"
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_cv_header_path_gnutls"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 19705 "configure"
+#include "confdefs.h"
+
+#include <stdio.h>
+#if defined(USE_OPENSSL_INCL)
+#include <openssl/ssl.h>
+#elif defined(USE_GNUTLS_FUNCS)
+#include <gnutls/gnutls.h>
+#elif defined(USE_GNUTLS_INCL)
+#include <gnutls/openssl.h>
+#else
+#include <ssl.h>
+#endif
+
+int
+main (void)
+{
+
+#ifdef USE_GNUTLS_FUNCS
+ gnutls_global_init();
+#else
+ SSL_shutdown((SSL *)0)
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:19734: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:19737: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:19740: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:19743: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ test -n "$verbose" && echo " ... found gnutls headers in $cf_cv_header_path_gnutls" 1>&6
+
+echo "${as_me:-configure}:19748: testing ... found gnutls headers in $cf_cv_header_path_gnutls ..." 1>&5
+
+ cf_cv_find_linkage_gnutls=maybe
+ cf_test_CPPFLAGS="$CPPFLAGS"
+ break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+ CPPFLAGS="$cf_save_CPPFLAGS"
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ fi
+ done
+
+ if test "$cf_cv_find_linkage_gnutls" = maybe ; then
+
+echo "${as_me:-configure}:19766: testing Searching for gnutls library in FIND_LINKAGE(gnutls,) ..." 1>&5
+
+ cf_save_LIBS="$LIBS"
+ cf_save_LDFLAGS="$LDFLAGS"
+
+ if test "$cf_cv_find_linkage_gnutls" != yes ; then
+
+cf_search=
+cf_library_path_list=""
+if test -n "${LDFLAGS}${LIBS}" ; then
+ for cf_library_path in $LDFLAGS $LIBS
+ do
+ case "$cf_library_path" in
+ (-L*)
+ cf_library_path=`echo ".$cf_library_path" |sed -e 's/^...//' -e 's,/lib$,,'`
+
+test "x$cf_library_path" != "xNONE" && \
+test -d "$cf_library_path" && \
+ {
+ test -n "$verbose" && echo " ... testing for lib-directories under $cf_library_path"
+ test -d "$cf_library_path/lib" && cf_search="$cf_search $cf_library_path/lib"
+ test -d "$cf_library_path/lib/gnutls" && cf_search="$cf_search $cf_library_path/lib/gnutls"
+ test -d "$cf_library_path/lib/gnutls/lib" && cf_search="$cf_search $cf_library_path/lib/gnutls/lib"
+ test -d "$cf_library_path/gnutls/lib" && cf_search="$cf_search $cf_library_path/gnutls/lib"
+ test -d "$cf_library_path/gnutls/lib/gnutls" && cf_search="$cf_search $cf_library_path/gnutls/lib/gnutls"
+}
+
+ cf_library_path_list="$cf_library_path_list $cf_search"
+ ;;
+ esac
+ done
+fi
+
+cf_search=
+
+test "x$prefix" != "xNONE" && \
+test -d "$prefix" && \
+ {
+ test -n "$verbose" && echo " ... testing for lib-directories under $prefix"
+ test -d "$prefix/lib" && cf_search="$cf_search $prefix/lib"
+ test -d "$prefix/lib/gnutls" && cf_search="$cf_search $prefix/lib/gnutls"
+ test -d "$prefix/lib/gnutls/lib" && cf_search="$cf_search $prefix/lib/gnutls/lib"
+ test -d "$prefix/gnutls/lib" && cf_search="$cf_search $prefix/gnutls/lib"
+ test -d "$prefix/gnutls/lib/gnutls" && cf_search="$cf_search $prefix/gnutls/lib/gnutls"
+}
+
+for cf_subdir_prefix in \
+ /usr \
+ /usr/local \
+ /usr/pkg \
+ /opt \
+ /opt/local \
+ $HOME
+do
+
+test "x$cf_subdir_prefix" != "x$prefix" && \
+test -d "$cf_subdir_prefix" && \
+{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
+ test -n "$verbose" && echo " ... testing for lib-directories under $cf_subdir_prefix"
+ test -d "$cf_subdir_prefix/lib" && cf_search="$cf_search $cf_subdir_prefix/lib"
+ test -d "$cf_subdir_prefix/lib/gnutls" && cf_search="$cf_search $cf_subdir_prefix/lib/gnutls"
+ test -d "$cf_subdir_prefix/lib/gnutls/lib" && cf_search="$cf_search $cf_subdir_prefix/lib/gnutls/lib"
+ test -d "$cf_subdir_prefix/gnutls/lib" && cf_search="$cf_search $cf_subdir_prefix/gnutls/lib"
+ test -d "$cf_subdir_prefix/gnutls/lib/gnutls" && cf_search="$cf_search $cf_subdir_prefix/gnutls/lib/gnutls"
+}
+
+done
+
+cf_search="$cf_library_path_list $cf_search"
+
+ for cf_cv_library_path_gnutls in $cf_search
+ do
+ if test -d "$cf_cv_library_path_gnutls" ; then
+ test -n "$verbose" && echo " ... testing $cf_cv_library_path_gnutls" 1>&6
+
+echo "${as_me:-configure}:19841: testing ... testing $cf_cv_library_path_gnutls ..." 1>&5
+
+ CPPFLAGS="$cf_test_CPPFLAGS"
+ LIBS="-lgnutls -lgnutls-openssl $cf_save_LIBS"
+ LDFLAGS="$cf_save_LDFLAGS -L$cf_cv_library_path_gnutls"
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 19847 "configure"
+#include "confdefs.h"
+
+#include <stdio.h>
+#if defined(USE_OPENSSL_INCL)
+#include <openssl/ssl.h>
+#elif defined(USE_GNUTLS_FUNCS)
+#include <gnutls/gnutls.h>
+#elif defined(USE_GNUTLS_INCL)
+#include <gnutls/openssl.h>
+#else
+#include <ssl.h>
+#endif
+
+int
+main (void)
+{
+
+#ifdef USE_GNUTLS_FUNCS
+ gnutls_global_init();
+#else
+ SSL_shutdown((SSL *)0)
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:19876: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:19879: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:19882: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:19885: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ test -n "$verbose" && echo " ... found gnutls library in $cf_cv_library_path_gnutls" 1>&6
+
+echo "${as_me:-configure}:19890: testing ... found gnutls library in $cf_cv_library_path_gnutls ..." 1>&5
+
+ cf_cv_find_linkage_gnutls=yes
+ cf_cv_library_file_gnutls="-lgnutls"
+ break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+ CPPFLAGS="$cf_save_CPPFLAGS"
+ LIBS="$cf_save_LIBS"
+ LDFLAGS="$cf_save_LDFLAGS"
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+ fi
+ done
+ CPPFLAGS="$cf_save_CPPFLAGS"
+ LDFLAGS="$cf_save_LDFLAGS"
+ fi
+
+ else
+ cf_cv_find_linkage_gnutls=no
+ fi
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+LIBS="$cf_save_LIBS"
+
+if test "$cf_cv_find_linkage_gnutls" = yes ; then
+cf_cv_have_gnutls=yes
+else
+cf_cv_have_gnutls=no
+fi
+
+ CPPFLAGS=$cf_gnutls_CPPFLAGS
+ fi
+
+ if test "$cf_cv_have_gnutls" = yes ; then
+ if test -n "$cf_cv_header_path_gnutls" ; then
+ cat >>confdefs.h <<\EOF
+#define USE_SSL 1
+EOF
+
+ case "$cf_cv_header_path_gnutls" in
+ (/usr/include/gnutls)
+ ;;
+ (*)
+
+if test -n "$cf_cv_header_path_gnutls" ; then
+ for cf_add_incdir in $cf_cv_header_path_gnutls
+ do
+ while test "$cf_add_incdir" != /usr/include
+ do
+ if test -d "$cf_add_incdir"
+ then
+ cf_have_incdir=no
+ if test -n "$CFLAGS$CPPFLAGS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+ if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+ cf_have_incdir=yes; break
+ fi
+ done
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ if test "$cf_add_incdir" = /usr/local/include ; then
+ if test "$GCC" = yes
+ then
+ cf_save_CPPFLAGS=$CPPFLAGS
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 19970 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:19982: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:19985: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:19988: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:19991: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ CPPFLAGS=$cf_save_CPPFLAGS
+ fi
+ fi
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:20008: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+ CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+ cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+ test "$cf_top_incdir" = "$cf_add_incdir" && break
+ cf_add_incdir="$cf_top_incdir"
+ else
+ break
+ fi
+ else
+ break
+ fi
+ done
+ done
+fi
+
+ ;;
+ esac
+ fi
+ if test -n "$cf_cv_library_path_gnutls" ; then
+
+if test -n "$cf_cv_library_path_gnutls" ; then
+ for cf_add_libdir in $cf_cv_library_path_gnutls
+ do
+ if test "$cf_add_libdir" = /usr/lib ; then
+ :
+ elif test -d "$cf_add_libdir"
+ then
+ cf_have_libdir=no
+ if test -n "$LDFLAGS$LIBS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_libdir in $LDFLAGS $LIBS ; do
+ if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
+ cf_have_libdir=yes; break
+ fi
+ done
+ fi
+ if test "$cf_have_libdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
+
+echo "${as_me:-configure}:20049: testing adding $cf_add_libdir to library-path ..." 1>&5
+
+ LDFLAGS="-L$cf_add_libdir $LDFLAGS"
+ fi
+ fi
+ done
+fi
+
+ fi
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lgnutls; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+for ac_func in gnutls_protocol_set_priority
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:20078: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 20084 "configure"
+#include "confdefs.h"
+#define $ac_func autoconf_temporary
+#include <limits.h> /* least-intrusive standard header which defines gcc2 __stub macros */
+#undef $ac_func
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+#error found stub for $ac_func
+#endif
+
+ return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:20115: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:20118: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:20121: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:20124: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+eval "$as_ac_var=no"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:20134: result: `eval echo '${'"$as_ac_var"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_var"'}'`" >&6
+if test "`eval echo '${'"$as_ac_var"'}'`" = yes; then
+ cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+ echo "$as_me:20144: checking for gnutls_rnd" >&5
+echo $ECHO_N "checking for gnutls_rnd... $ECHO_C" >&6
+if test "${ac_cv_func_gnutls_rnd+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 20150 "configure"
+#include "confdefs.h"
+#define gnutls_rnd autoconf_temporary
+#include <limits.h> /* least-intrusive standard header which defines gcc2 __stub macros */
+#undef gnutls_rnd
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char gnutls_rnd (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_gnutls_rnd) || defined (__stub___gnutls_rnd)
+#error found stub for gnutls_rnd
+#endif
+
+ return gnutls_rnd ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:20181: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:20184: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:20187: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:20190: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_func_gnutls_rnd=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_gnutls_rnd=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:20200: result: $ac_cv_func_gnutls_rnd" >&5
+echo "${ECHO_T}$ac_cv_func_gnutls_rnd" >&6
+if test "$ac_cv_func_gnutls_rnd" = yes; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_GNUTLS_RND 1
+EOF
+
+else
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lgcrypt; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+fi
+
+ if test "$cf_pkg_gnutls" = none ; then
+ echo "$as_me:20229: checking for SSL_connect in -lgnutls-openssl" >&5
+echo $ECHO_N "checking for SSL_connect in -lgnutls-openssl... $ECHO_C" >&6
+if test "${ac_cv_lib_gnutls_openssl_SSL_connect+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lgnutls-openssl $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 20237 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char SSL_connect ();
+int
+main (void)
+{
+SSL_connect ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:20256: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:20259: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:20262: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:20265: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_lib_gnutls_openssl_SSL_connect=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_gnutls_openssl_SSL_connect=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:20276: result: $ac_cv_lib_gnutls_openssl_SSL_connect" >&5
+echo "${ECHO_T}$ac_cv_lib_gnutls_openssl_SSL_connect" >&6
+if test "$ac_cv_lib_gnutls_openssl_SSL_connect" = yes; then
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lgnutls-openssl; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+else
+ echo "$as_me:20297: checking for SSL_connect in -lgnutls-extra" >&5
+echo $ECHO_N "checking for SSL_connect in -lgnutls-extra... $ECHO_C" >&6
+if test "${ac_cv_lib_gnutls_extra_SSL_connect+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lgnutls-extra $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 20305 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char SSL_connect ();
+int
+main (void)
+{
+SSL_connect ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:20324: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:20327: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:20330: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:20333: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_lib_gnutls_extra_SSL_connect=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_gnutls_extra_SSL_connect=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:20344: result: $ac_cv_lib_gnutls_extra_SSL_connect" >&5
+echo "${ECHO_T}$ac_cv_lib_gnutls_extra_SSL_connect" >&6
+if test "$ac_cv_lib_gnutls_extra_SSL_connect" = yes; then
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lgnutls-extra; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+else
+ { { echo "$as_me:20365: error: cannot find gnutls openssl functions" >&5
+echo "$as_me: error: cannot find gnutls openssl functions" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+fi
+
+ fi
+
+echo "$as_me:20374: checking for X509 support" >&5
+echo $ECHO_N "checking for X509 support... $ECHO_C" >&6
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 20377 "configure"
+#include "confdefs.h"
+
+#include <stdio.h>
+#if defined(USE_OPENSSL_INCL)
+#include <openssl/ssl.h>
+#elif defined(USE_GNUTLS_FUNCS)
+#include <gnutls/gnutls.h>
+#elif defined(USE_GNUTLS_INCL)
+#include <gnutls/openssl.h>
+#else
+#include <ssl.h>
+#endif
+
+#if defined(USE_GNUTLS_INCL)
+#include <gnutls/x509.h>
+#else
+#include <openssl/x509.h>
+#endif
+
+int
+main (void)
+{
+X509_verify_cert_error_string(X509_STORE_CTX_get_error(NULL))
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:20406: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:20409: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:20412: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:20415: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_x509_support=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_x509_support=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+echo "$as_me:20424: result: $cf_x509_support" >&5
+echo "${ECHO_T}$cf_x509_support" >&6
+
+if test "$cf_x509_support" = yes ; then
+ cat >>confdefs.h <<\EOF
+#define USE_X509_SUPPORT 1
+EOF
+
+fi
+
+ fi
+
+ fi
+elif test "x$cf_cv_use_libnss_compat" != xno ; then
+
+check=`pkg-config --version 2>/dev/null`
+if test -n "$check" ; then
+ cf_ssl_library=`pkg-config --libs nss`
+ cf_ssl_cflags=`pkg-config --cflags nss`
+else
+ # Without pkg-config, we'll kludge in some defaults
+ cf_ssl_library="-lssl3 -lsmime3 -lnss3 -lplds4 -lplc4 -lnspr4 -lpthread -ldl"
+ cf_ssl_cflags="-I/usr/include/nss3 -I/usr/include/nspr4"
+fi
+cf_ssl_library="-lnss_compat_ossl $cf_ssl_library"
+
+case "$cf_cv_use_libnss_compat" in
+(no)
+ cf_ssl_root=
+ ;;
+(yes)
+
+echo "$as_me:20456: checking for SSL_get_version in -lnss_compat_ossl" >&5
+echo $ECHO_N "checking for SSL_get_version in -lnss_compat_ossl... $ECHO_C" >&6
+if test "${ac_cv_lib_nss_compat_ossl_SSL_get_version+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lnss_compat_ossl -lnss_compat_ossl $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 20464 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char SSL_get_version ();
+int
+main (void)
+{
+SSL_get_version ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:20483: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:20486: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:20489: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:20492: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_lib_nss_compat_ossl_SSL_get_version=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_nss_compat_ossl_SSL_get_version=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:20503: result: $ac_cv_lib_nss_compat_ossl_SSL_get_version" >&5
+echo "${ECHO_T}$ac_cv_lib_nss_compat_ossl_SSL_get_version" >&6
+if test "$ac_cv_lib_nss_compat_ossl_SSL_get_version" = yes; then
+ cat >>confdefs.h <<EOF
+#define HAVE_LIBNSS_COMPAT_OSSL 1
+EOF
+
+ LIBS="-lnss_compat_ossl $LIBS"
+
+else
+
+ cf_ssl_root=/usr/local/nss_compat_ossl
+ if test -d "$cf_ssl_root" ; then
+ test -n "$verbose" && echo " assume it is in $cf_ssl_root" 1>&6
+
+echo "${as_me:-configure}:20518: testing assume it is in $cf_ssl_root ..." 1>&5
+
+ cf_ssl_library="-L$cf_ssl_root/lib $cf_ssl_library"
+ else
+ { { echo "$as_me:20522: error: cannot find NSS compliant libraries" >&5
+echo "$as_me: error: cannot find NSS compliant libraries" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+
+fi
+
+ ;;
+(*)
+ if test -d "$cf_cv_use_libnss_compat" ; then
+ if test -d "$cf_cv_use_libnss_compat/include" ; then
+ cf_ssl_root=$cf_cv_use_libnss_compat
+ elif test -d "$cf_cv_use_libnss_compat/../include" ; then
+ cf_ssl_root=$cf_cv_use_libnss_compat/..
+ else
+ { { echo "$as_me:20537: error: cannot find NSS compliant library under $cf_cv_use_libnss_compat" >&5
+echo "$as_me: error: cannot find NSS compliant library under $cf_cv_use_libnss_compat" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+ cf_ssl_library="-L$cf_ssl_root/lib $cf_ssl_library"
+ else
+ { echo "$as_me:20543: WARNING: expected a directory: $cf_cv_use_libnss_compat" >&5
+echo "$as_me: WARNING: expected a directory: $cf_cv_use_libnss_compat" >&2;}
+ fi
+ ;;
+esac
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_ssl_library; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+cf_ssl_subincs=yes
+if test -n "$cf_ssl_root" ; then
+ if test -d "$cf_ssl_root/include" ; then
+ cf_ssl_cflags="-I$cf_ssl_root/include $cf_ssl_cflags"
+ test -d "$cf_ssl_root/include/nss_compat_ossl" || cf_ssl_subincs=no
+ fi
+fi
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_ssl_cflags
+do
+case "$cf_fix_cppflags" in
+(no)
+ case "$cf_add_cflags" in
+ (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=yes
+
+ if test "$cf_fix_cppflags" = yes ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ elif test "${cf_tst_cflags}" = "\"'" ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ fi
+ ;;
+ esac
+ case "$CPPFLAGS" in
+ (*$cf_add_cflags)
+ ;;
+ (*)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+ sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \
+ -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'`
+
+ ;;
+ esac
+
+ test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+ cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+ (*)
+
+ test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+ cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+(yes)
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=no
+ ;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+ test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+ CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+ test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+ EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+if test "$cf_ssl_subincs" = yes ; then
+echo "$as_me:20672: checking for NSS compliant include directory" >&5
+echo $ECHO_N "checking for NSS compliant include directory... $ECHO_C" >&6
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 20675 "configure"
+#include "confdefs.h"
+
+#include <stdio.h>
+#include <nss_compat_ossl/nss_compat_ossl.h>
+int
+main (void)
+{
+SSL_shutdown((SSL *)0)
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:20689: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:20692: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:20695: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:20698: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_ssl_incl=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_ssl_incl=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+echo "$as_me:20707: result: $cf_ssl_incl" >&5
+echo "${ECHO_T}$cf_ssl_incl" >&6
+test "$cf_ssl_incl" = yes &&
+cat >>confdefs.h <<\EOF
+#define USE_NSS_COMPAT_INCL 1
+EOF
+
+fi
+
+echo "$as_me:20716: checking if we can link to NSS compliant library" >&5
+echo $ECHO_N "checking if we can link to NSS compliant library... $ECHO_C" >&6
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 20719 "configure"
+#include "confdefs.h"
+
+#include <stdio.h>
+#ifdef USE_NSS_COMPAT_INCL
+#include <nss_compat_ossl/nss_compat_ossl.h>
+#else
+#include <ssl.h>
+#endif
+
+int
+main (void)
+{
+SSL_shutdown((SSL *)0)
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:20738: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:20741: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:20744: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:20747: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_ssl_library=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_ssl_library=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+echo "$as_me:20756: result: $cf_ssl_library" >&5
+echo "${ECHO_T}$cf_ssl_library" >&6
+if test "$cf_ssl_library" = yes ; then
+
+cat >>confdefs.h <<\EOF
+#define USE_SSL 1
+EOF
+
+cat >>confdefs.h <<\EOF
+#define USE_X509_SUPPORT 1
+EOF
+
+else
+ { { echo "$as_me:20769: error: Cannot link with NSS compliant libraries" >&5
+echo "$as_me: error: Cannot link with NSS compliant libraries" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+fi
+
+### check for ipv6 support
+echo "$as_me:20777: checking whether to enable ipv6" >&5
+echo $ECHO_N "checking whether to enable ipv6... $ECHO_C" >&6
+
+# Check whether --enable-ipv6 or --disable-ipv6 was given.
+if test "${enable_ipv6+set}" = set; then
+ enableval="$enable_ipv6"
+ test "$enableval" != yes && enableval=no
+ if test "$enableval" != "no" ; then
+
+cat >>confdefs.h <<\EOF
+#define ENABLE_IPV6 1
+EOF
+
+ fi
+else
+ enableval=no
+fi;
+echo "$as_me:20794: result: $enableval" >&5
+echo "${ECHO_T}$enableval" >&6
+if test "$enableval" = "yes"; then
+
+echo "$as_me:20798: checking ipv6 stack type" >&5
+echo $ECHO_N "checking ipv6 stack type... $ECHO_C" >&6
+if test "${cf_cv_ipv6type+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cf_cv_ipv6type=unknown
+for i in solaris inria kame linux-glibc linux-libinet6 toshiba v6d zeta
+do
+ case "$i" in
+ (solaris)
+ if test "SunOS" = "`uname -s`"
+ then
+ if test -f /usr/include/netinet/ip6.h
+ then
+ cf_cv_ipv6type=$i
+ fi
+ fi
+ ;;
+ (inria)
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 20819 "configure"
+#include "confdefs.h"
+
+#include <netinet/in.h>
+#ifdef IPV6_INRIA_VERSION
+yes
+#endif
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "yes" >/dev/null 2>&1; then
+ cf_cv_ipv6type=$i
+fi
+rm -rf conftest*
+
+ ;;
+ (kame)
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 20836 "configure"
+#include "confdefs.h"
+
+#include <netinet/in.h>
+#ifdef __KAME__
+yes
+#endif
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "yes" >/dev/null 2>&1; then
+ cf_cv_ipv6type=$i
+fi
+rm -rf conftest*
+
+ ;;
+ (linux-glibc)
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 20853 "configure"
+#include "confdefs.h"
+
+#include <features.h>
+#if defined(__GLIBC__) && __GLIBC__ >= 2 && __GLIBC_MINOR__ >= 1
+yes
+#endif
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "yes" >/dev/null 2>&1; then
+ cf_cv_ipv6type=$i
+fi
+rm -rf conftest*
+
+ ;;
+ (linux-libinet6)
+ if test -d /usr/inet6
+ then
+ cf_cv_ipv6type=$i
+ elif test -f /usr/include/netinet/ip6.h
+ then
+ cf_cv_ipv6type=$i
+ fi
+ ;;
+ (toshiba)
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 20879 "configure"
+#include "confdefs.h"
+
+#include <sys/param.h>
+#ifdef _TOSHIBA_INET6
+yes
+#endif
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "yes" >/dev/null 2>&1; then
+ cf_cv_ipv6type=$i
+fi
+rm -rf conftest*
+
+ ;;
+ (v6d)
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 20896 "configure"
+#include "confdefs.h"
+
+#include </usr/local/v6/include/sys/v6config.h>
+#ifdef __V6D__
+yes
+#endif
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "yes" >/dev/null 2>&1; then
+ cf_cv_ipv6type=$i
+fi
+rm -rf conftest*
+
+ ;;
+ (zeta)
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 20913 "configure"
+#include "confdefs.h"
+
+#include <sys/param.h>
+#ifdef _ZETA_MINAMI_INET6
+yes
+#endif
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "yes" >/dev/null 2>&1; then
+ cf_cv_ipv6type=$i
+fi
+rm -rf conftest*
+
+ ;;
+ esac
+ if test "$cf_cv_ipv6type" != "unknown"; then
+ break
+ fi
+done
+
+fi
+echo "$as_me:20935: result: $cf_cv_ipv6type" >&5
+echo "${ECHO_T}$cf_cv_ipv6type" >&6
+
+cf_ipv6lib=none
+cf_ipv6dir=none
+
+echo "$as_me:20941: checking for IPv6 library if required" >&5
+echo $ECHO_N "checking for IPv6 library if required... $ECHO_C" >&6
+case "$cf_cv_ipv6type" in
+(solaris)
+ ;;
+(inria)
+ ;;
+(kame)
+ cf_ipv6lib=inet6
+ cf_ipv6dir=v6
+ ;;
+(linux-glibc)
+ ;;
+(linux-libinet6)
+ cf_ipv6lib=inet6
+ cf_ipv6dir=inet6
+ ;;
+(toshiba)
+ cf_ipv6lib=inet6
+ cf_ipv6dir=v6
+ ;;
+(v6d)
+ cf_ipv6lib=v6
+ cf_ipv6dir=v6
+ ;;
+(zeta)
+ cf_ipv6lib=inet6
+ cf_ipv6dir=v6
+ ;;
+esac
+echo "$as_me:20971: result: $cf_ipv6lib" >&5
+echo "${ECHO_T}$cf_ipv6lib" >&6
+
+if test "$cf_ipv6lib" != "none"; then
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 20977 "configure"
+#include "confdefs.h"
+
+#include <sys/types.h>
+#include <netdb.h>
+#include <netinet/in.h>
+#include <netinet/ip6.h>
+int
+main (void)
+{
+getaddrinfo(0, 0, 0, 0)
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:20993: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:20996: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:20999: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:21002: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+cf_search=
+
+# collect the current set of include-directories from compiler flags
+cf_header_path_list=""
+if test -n "${CFLAGS}${CPPFLAGS}" ; then
+ for cf_header_path in $CPPFLAGS $CFLAGS
+ do
+ case "$cf_header_path" in
+ (-I*)
+ cf_header_path=`echo ".$cf_header_path" |sed -e 's/^...//' -e 's,/include$,,'`
+
+test "x$cf_header_path" != "xNONE" && \
+test -d "$cf_header_path" && \
+ {
+ test -n "$verbose" && echo " ... testing for include-directories under $cf_header_path"
+ test -d "$cf_header_path/include" && cf_search="$cf_search $cf_header_path/include"
+ test -d "$cf_header_path/include/$cf_ipv6dir" && cf_search="$cf_search $cf_header_path/include/$cf_ipv6dir"
+ test -d "$cf_header_path/include/$cf_ipv6dir/include" && cf_search="$cf_search $cf_header_path/include/$cf_ipv6dir/include"
+ test -d "$cf_header_path/$cf_ipv6dir/include" && cf_search="$cf_search $cf_header_path/$cf_ipv6dir/include"
+ test -d "$cf_header_path/$cf_ipv6dir/include/$cf_ipv6dir" && cf_search="$cf_search $cf_header_path/$cf_ipv6dir/include/$cf_ipv6dir"
+}
+
+ cf_header_path_list="$cf_header_path_list $cf_search"
+ ;;
+ esac
+ done
+fi
+
+# add the variations for the package we are looking for
+
+cf_search=
+
+test "x$prefix" != "xNONE" && \
+test -d "$prefix" && \
+ {
+ test -n "$verbose" && echo " ... testing for include-directories under $prefix"
+ test -d "$prefix/include" && cf_search="$cf_search $prefix/include"
+ test -d "$prefix/include/$cf_ipv6dir" && cf_search="$cf_search $prefix/include/$cf_ipv6dir"
+ test -d "$prefix/include/$cf_ipv6dir/include" && cf_search="$cf_search $prefix/include/$cf_ipv6dir/include"
+ test -d "$prefix/$cf_ipv6dir/include" && cf_search="$cf_search $prefix/$cf_ipv6dir/include"
+ test -d "$prefix/$cf_ipv6dir/include/$cf_ipv6dir" && cf_search="$cf_search $prefix/$cf_ipv6dir/include/$cf_ipv6dir"
+}
+
+for cf_subdir_prefix in \
+ /usr \
+ /usr/local \
+ /usr/pkg \
+ /opt \
+ /opt/local \
+ $HOME
+do
+
+test "x$cf_subdir_prefix" != "x$prefix" && \
+test -d "$cf_subdir_prefix" && \
+{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
+ test -n "$verbose" && echo " ... testing for include-directories under $cf_subdir_prefix"
+ test -d "$cf_subdir_prefix/include" && cf_search="$cf_search $cf_subdir_prefix/include"
+ test -d "$cf_subdir_prefix/include/$cf_ipv6dir" && cf_search="$cf_search $cf_subdir_prefix/include/$cf_ipv6dir"
+ test -d "$cf_subdir_prefix/include/$cf_ipv6dir/include" && cf_search="$cf_search $cf_subdir_prefix/include/$cf_ipv6dir/include"
+ test -d "$cf_subdir_prefix/$cf_ipv6dir/include" && cf_search="$cf_search $cf_subdir_prefix/$cf_ipv6dir/include"
+ test -d "$cf_subdir_prefix/$cf_ipv6dir/include/$cf_ipv6dir" && cf_search="$cf_search $cf_subdir_prefix/$cf_ipv6dir/include/$cf_ipv6dir"
+}
+
+done
+
+test "$includedir" != NONE && \
+test "$includedir" != "/usr/include" && \
+test -d "$includedir" && {
+ test -d "$includedir" && cf_search="$cf_search $includedir"
+ test -d "$includedir/$cf_ipv6dir" && cf_search="$cf_search $includedir/$cf_ipv6dir"
+}
+
+test "$oldincludedir" != NONE && \
+test "$oldincludedir" != "/usr/include" && \
+test -d "$oldincludedir" && {
+ test -d "$oldincludedir" && cf_search="$cf_search $oldincludedir"
+ test -d "$oldincludedir/$cf_ipv6dir" && cf_search="$cf_search $oldincludedir/$cf_ipv6dir"
+}
+
+cf_search="$cf_search $cf_header_path_list"
+
+ for cf_incdir in $cf_search
+ do
+ cf_header=$cf_incdir/netinet/ip6.h
+ if test -f "$cf_header"
+ then
+
+if test -n "$cf_incdir" ; then
+ for cf_add_incdir in $cf_incdir
+ do
+ while test "$cf_add_incdir" != /usr/include
+ do
+ if test -d "$cf_add_incdir"
+ then
+ cf_have_incdir=no
+ if test -n "$CFLAGS$CPPFLAGS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+ if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+ cf_have_incdir=yes; break
+ fi
+ done
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ if test "$cf_add_incdir" = /usr/local/include ; then
+ if test "$GCC" = yes
+ then
+ cf_save_CPPFLAGS=$CPPFLAGS
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 21123 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:21135: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:21138: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:21141: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:21144: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ CPPFLAGS=$cf_save_CPPFLAGS
+ fi
+ fi
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:21161: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+ CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+ cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+ test "$cf_top_incdir" = "$cf_add_incdir" && break
+ cf_add_incdir="$cf_top_incdir"
+ else
+ break
+ fi
+ else
+ break
+ fi
+ done
+ done
+fi
+
+ test -n "$verbose" && echo " ... found $cf_header" 1>&6
+ break
+ fi
+ test -n "$verbose" && echo " ... tested $cf_header" 1>&6
+ done
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+ eval 'cf_cv_have_lib_'"$cf_ipv6lib"'=no'
+ cf_libdir=""
+ echo "$as_me:21189: checking for getaddrinfo" >&5
+echo $ECHO_N "checking for getaddrinfo... $ECHO_C" >&6
+if test "${ac_cv_func_getaddrinfo+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 21195 "configure"
+#include "confdefs.h"
+#define getaddrinfo autoconf_temporary
+#include <limits.h> /* least-intrusive standard header which defines gcc2 __stub macros */
+#undef getaddrinfo
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char getaddrinfo (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_getaddrinfo) || defined (__stub___getaddrinfo)
+#error found stub for getaddrinfo
+#endif
+
+ return getaddrinfo ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:21226: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:21229: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:21232: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:21235: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_func_getaddrinfo=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_getaddrinfo=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:21245: result: $ac_cv_func_getaddrinfo" >&5
+echo "${ECHO_T}$ac_cv_func_getaddrinfo" >&6
+if test "$ac_cv_func_getaddrinfo" = yes; then
+ eval 'cf_cv_have_lib_'"$cf_ipv6lib"'=yes'
+else
+
+ cf_save_LIBS="$LIBS"
+ echo "$as_me:21252: checking for getaddrinfo in -l$cf_ipv6lib" >&5
+echo $ECHO_N "checking for getaddrinfo in -l$cf_ipv6lib... $ECHO_C" >&6
+ LIBS="-l$cf_ipv6lib $LIBS"
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 21256 "configure"
+#include "confdefs.h"
+
+#include <sys/types.h>
+#include <netdb.h>
+#include <netinet/in.h>
+#include <netinet/ip6.h>
+int
+main (void)
+{
+getaddrinfo(0, 0, 0, 0)
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:21272: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:21275: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:21278: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:21281: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ echo "$as_me:21283: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ eval 'cf_cv_have_lib_'"$cf_ipv6lib"'=yes'
+
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+echo "$as_me:21290: result: no" >&5
+echo "${ECHO_T}no" >&6
+
+cf_search=
+cf_library_path_list=""
+if test -n "${LDFLAGS}${LIBS}" ; then
+ for cf_library_path in $LDFLAGS $LIBS
+ do
+ case "$cf_library_path" in
+ (-L*)
+ cf_library_path=`echo ".$cf_library_path" |sed -e 's/^...//' -e 's,/lib$,,'`
+
+test "x$cf_library_path" != "xNONE" && \
+test -d "$cf_library_path" && \
+ {
+ test -n "$verbose" && echo " ... testing for lib-directories under $cf_library_path"
+ test -d "$cf_library_path/lib" && cf_search="$cf_search $cf_library_path/lib"
+ test -d "$cf_library_path/lib/$cf_ipv6dir" && cf_search="$cf_search $cf_library_path/lib/$cf_ipv6dir"
+ test -d "$cf_library_path/lib/$cf_ipv6dir/lib" && cf_search="$cf_search $cf_library_path/lib/$cf_ipv6dir/lib"
+ test -d "$cf_library_path/$cf_ipv6dir/lib" && cf_search="$cf_search $cf_library_path/$cf_ipv6dir/lib"
+ test -d "$cf_library_path/$cf_ipv6dir/lib/$cf_ipv6dir" && cf_search="$cf_search $cf_library_path/$cf_ipv6dir/lib/$cf_ipv6dir"
+}
+
+ cf_library_path_list="$cf_library_path_list $cf_search"
+ ;;
+ esac
+ done
+fi
+
+cf_search=
+
+test "x$prefix" != "xNONE" && \
+test -d "$prefix" && \
+ {
+ test -n "$verbose" && echo " ... testing for lib-directories under $prefix"
+ test -d "$prefix/lib" && cf_search="$cf_search $prefix/lib"
+ test -d "$prefix/lib/$cf_ipv6dir" && cf_search="$cf_search $prefix/lib/$cf_ipv6dir"
+ test -d "$prefix/lib/$cf_ipv6dir/lib" && cf_search="$cf_search $prefix/lib/$cf_ipv6dir/lib"
+ test -d "$prefix/$cf_ipv6dir/lib" && cf_search="$cf_search $prefix/$cf_ipv6dir/lib"
+ test -d "$prefix/$cf_ipv6dir/lib/$cf_ipv6dir" && cf_search="$cf_search $prefix/$cf_ipv6dir/lib/$cf_ipv6dir"
+}
+
+for cf_subdir_prefix in \
+ /usr \
+ /usr/local \
+ /usr/pkg \
+ /opt \
+ /opt/local \
+ $HOME
+do
+
+test "x$cf_subdir_prefix" != "x$prefix" && \
+test -d "$cf_subdir_prefix" && \
+{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
+ test -n "$verbose" && echo " ... testing for lib-directories under $cf_subdir_prefix"
+ test -d "$cf_subdir_prefix/lib" && cf_search="$cf_search $cf_subdir_prefix/lib"
+ test -d "$cf_subdir_prefix/lib/$cf_ipv6dir" && cf_search="$cf_search $cf_subdir_prefix/lib/$cf_ipv6dir"
+ test -d "$cf_subdir_prefix/lib/$cf_ipv6dir/lib" && cf_search="$cf_search $cf_subdir_prefix/lib/$cf_ipv6dir/lib"
+ test -d "$cf_subdir_prefix/$cf_ipv6dir/lib" && cf_search="$cf_search $cf_subdir_prefix/$cf_ipv6dir/lib"
+ test -d "$cf_subdir_prefix/$cf_ipv6dir/lib/$cf_ipv6dir" && cf_search="$cf_search $cf_subdir_prefix/$cf_ipv6dir/lib/$cf_ipv6dir"
+}
+
+done
+
+cf_search="$cf_library_path_list $cf_search"
+
+ for cf_libdir in $cf_search
+ do
+ echo "$as_me:21358: checking for -l$cf_ipv6lib in $cf_libdir" >&5
+echo $ECHO_N "checking for -l$cf_ipv6lib in $cf_libdir... $ECHO_C" >&6
+ LIBS="-L$cf_libdir -l$cf_ipv6lib $cf_save_LIBS"
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 21362 "configure"
+#include "confdefs.h"
+
+#include <sys/types.h>
+#include <netdb.h>
+#include <netinet/in.h>
+#include <netinet/ip6.h>
+int
+main (void)
+{
+getaddrinfo(0, 0, 0, 0)
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:21378: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:21381: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:21384: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:21387: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ echo "$as_me:21389: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ eval 'cf_cv_have_lib_'"$cf_ipv6lib"'=yes'
+ break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+echo "$as_me:21396: result: no" >&5
+echo "${ECHO_T}no" >&6
+ LIBS="$cf_save_LIBS"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+ done
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+
+eval 'cf_found_library="$cf_cv_have_lib_'"$cf_ipv6lib"\"
+
+ if test "$cf_found_library" = no ; then
+ { { echo "$as_me:21411: error: No $cf_ipv6lib library found, cannot continue. You must fetch lib$cf_ipv6lib.a
+from an appropriate IPv6 kit and compile beforehand." >&5
+echo "$as_me: error: No $cf_ipv6lib library found, cannot continue. You must fetch lib$cf_ipv6lib.a
+from an appropriate IPv6 kit and compile beforehand." >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+fi
+
+echo "$as_me:21419: checking working getaddrinfo" >&5
+echo $ECHO_N "checking working getaddrinfo... $ECHO_C" >&6
+if test "${cf_cv_getaddrinfo+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+if test "$cross_compiling" = yes; then
+ cf_cv_getaddrinfo=unknown
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 21429 "configure"
+#include "confdefs.h"
+
+$ac_includes_default
+
+#include <netdb.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+
+#define expect(a,b) if (strcmp(a,b) != 0) goto bad
+
+int main(void)
+{
+ int passive, gaierr, inet4 = 0, inet6 = 0;
+ struct addrinfo hints, *ai, *aitop;
+ char straddr[INET6_ADDRSTRLEN], strport[16];
+
+ for (passive = 0; passive <= 1; passive++) {
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = AF_UNSPEC;
+ hints.ai_flags = passive ? AI_PASSIVE : 0;
+ hints.ai_socktype = SOCK_STREAM;
+ if ((gaierr = getaddrinfo(NULL, "54321", &hints, &aitop)) != 0) {
+ (void)gai_strerror(gaierr);
+ goto bad;
+ }
+ for (ai = aitop; ai; ai = ai->ai_next) {
+ if (ai->ai_addr == NULL ||
+ ai->ai_addrlen == 0 ||
+ getnameinfo(ai->ai_addr, ai->ai_addrlen,
+ straddr, sizeof(straddr), strport, sizeof(strport),
+ NI_NUMERICHOST|NI_NUMERICSERV) != 0) {
+ goto bad;
+ }
+ switch (ai->ai_family) {
+ case AF_INET:
+ expect(strport, "54321");
+ if (passive) {
+ expect(straddr, "0.0.0.0");
+ } else {
+ expect(straddr, "127.0.0.1");
+ }
+ inet4++;
+ break;
+ case AF_INET6:
+ expect(strport, "54321");
+ if (passive) {
+ expect(straddr, "::");
+ } else {
+ expect(straddr, "::1");
+ }
+ inet6++;
+ break;
+ case AF_UNSPEC:
+ goto bad;
+ break;
+ default:
+ /* another family support? */
+ break;
+ }
+ }
+ }
+
+ if (!(inet4 == 0 || inet4 == 2))
+ goto bad;
+ if (!(inet6 == 0 || inet6 == 2))
+ goto bad;
+
+ if (aitop)
+ freeaddrinfo(aitop);
+ ${cf_cv_main_return:-return}(0);
+
+ bad:
+ if (aitop)
+ freeaddrinfo(aitop);
+ ${cf_cv_main_return:-return}(1);
+}
+
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:21509: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:21512: \$? = $ac_status" >&5
+ (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+ { (eval echo "$as_me:21514: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:21517: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_getaddrinfo=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_getaddrinfo=no
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+
+fi
+echo "$as_me:21530: result: $cf_cv_getaddrinfo" >&5
+echo "${ECHO_T}$cf_cv_getaddrinfo" >&6
+if test "$cf_cv_getaddrinfo" = yes ; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_GAI_STRERROR 1
+EOF
+
+cat >>confdefs.h <<\EOF
+#define HAVE_GETADDRINFO 1
+EOF
+
+fi
+
+if test "$cf_cv_getaddrinfo" != "yes"; then
+ if test "$cf_cv_ipv6type" != "linux"; then
+ { echo "$as_me:21546: WARNING: You must get working getaddrinfo() function,
+or you can specify \"--disable-ipv6\"" >&5
+echo "$as_me: WARNING: You must get working getaddrinfo() function,
+or you can specify \"--disable-ipv6\"" >&2;}
+ else
+ { echo "$as_me:21551: WARNING: The getaddrinfo() implementation on your system seems be buggy.
+You should upgrade your system library to the newest version
+of GNU C library (aka glibc)." >&5
+echo "$as_me: WARNING: The getaddrinfo() implementation on your system seems be buggy.
+You should upgrade your system library to the newest version
+of GNU C library (aka glibc)." >&2;}
+ fi
+fi
+
+fi
+
+echo "$as_me:21562: checking for screen type" >&5
+echo $ECHO_N "checking for screen type... $ECHO_C" >&6
+if test "${cf_cv_screen+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+# Check whether --with-screen or --without-screen was given.
+if test "${with_screen+set}" = set; then
+ withval="$with_screen"
+
+case "$withval" in
+(curses|ncurses*|pdcurses|slang)
+ cf_cv_screen=$withval
+ ;;
+(*) { { echo "$as_me:21576: error: Unexpected value $withval" >&5
+echo "$as_me: error: Unexpected value $withval" >&2;}
+ { (exit 1); exit 1; }; }
+ ;;
+esac
+else
+ cf_cv_screen=curses
+fi;
+fi
+echo "$as_me:21585: result: $cf_cv_screen" >&5
+echo "${ECHO_T}$cf_cv_screen" >&6
+
+case "$cf_cv_screen" in
+(curses|ncurses*)
+
+echo "$as_me:21591: checking for specific curses-directory" >&5
+echo $ECHO_N "checking for specific curses-directory... $ECHO_C" >&6
+
+# Check whether --with-curses-dir or --without-curses-dir was given.
+if test "${with_curses_dir+set}" = set; then
+ withval="$with_curses_dir"
+ cf_cv_curses_dir=$withval
+else
+ cf_cv_curses_dir=no
+fi;
+echo "$as_me:21601: result: $cf_cv_curses_dir" >&5
+echo "${ECHO_T}$cf_cv_curses_dir" >&6
+
+if test -n "$cf_cv_curses_dir" && test "$cf_cv_curses_dir" != "no"
+then
+
+if test "x$prefix" != xNONE; then
+ cf_path_syntax="$prefix"
+else
+ cf_path_syntax="$ac_default_prefix"
+fi
+
+case ".$withval" in
+(.\$\(*\)*|.\'*\'*)
+ ;;
+(..|./*|.\\*)
+ ;;
+(.[a-zA-Z]:[\\/]*) # OS/2 EMX
+ ;;
+(.\$\{*prefix\}*|.\$\{*dir\}*)
+ eval withval="$withval"
+ case ".$withval" in
+ (.NONE/*)
+ withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%`
+ ;;
+ esac
+ ;;
+(.no|.NONE/*)
+ withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%`
+ ;;
+(*)
+ { { echo "$as_me:21632: error: expected a pathname, not \"$withval\"" >&5
+echo "$as_me: error: expected a pathname, not \"$withval\"" >&2;}
+ { (exit 1); exit 1; }; }
+ ;;
+esac
+
+ if test -d "$cf_cv_curses_dir"
+ then
+
+if test -n "$cf_cv_curses_dir/include" ; then
+ for cf_add_incdir in $cf_cv_curses_dir/include
+ do
+ while test "$cf_add_incdir" != /usr/include
+ do
+ if test -d "$cf_add_incdir"
+ then
+ cf_have_incdir=no
+ if test -n "$CFLAGS$CPPFLAGS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+ if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+ cf_have_incdir=yes; break
+ fi
+ done
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ if test "$cf_add_incdir" = /usr/local/include ; then
+ if test "$GCC" = yes
+ then
+ cf_save_CPPFLAGS=$CPPFLAGS
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 21668 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:21680: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:21683: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:21686: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:21689: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ CPPFLAGS=$cf_save_CPPFLAGS
+ fi
+ fi
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:21706: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+ CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+ cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+ test "$cf_top_incdir" = "$cf_add_incdir" && break
+ cf_add_incdir="$cf_top_incdir"
+ else
+ break
+ fi
+ else
+ break
+ fi
+ done
+ done
+fi
+
+if test -n "$cf_cv_curses_dir/lib" ; then
+ for cf_add_libdir in $cf_cv_curses_dir/lib
+ do
+ if test "$cf_add_libdir" = /usr/lib ; then
+ :
+ elif test -d "$cf_add_libdir"
+ then
+ cf_have_libdir=no
+ if test -n "$LDFLAGS$LIBS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_libdir in $LDFLAGS $LIBS ; do
+ if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
+ cf_have_libdir=yes; break
+ fi
+ done
+ fi
+ if test "$cf_have_libdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
+
+echo "${as_me:-configure}:21742: testing adding $cf_add_libdir to library-path ..." 1>&5
+
+ LDFLAGS="-L$cf_add_libdir $LDFLAGS"
+ fi
+ fi
+ done
+fi
+
+ fi
+fi
+
+ ;;
+esac
+
+cf_wide_curses=no
+dft_color_style=yes
+case "$cf_cv_screen" in
+(curses)
+
+echo "$as_me:21761: checking for extra include directories" >&5
+echo $ECHO_N "checking for extra include directories... $ECHO_C" >&6
+if test "${cf_cv_curses_incdir+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cf_cv_curses_incdir=no
+case "$host_os" in
+(hpux10.*)
+ if test "x$cf_cv_screen" = "xcurses_colr"
+ then
+ test -d /usr/include/curses_colr && \
+ cf_cv_curses_incdir="-I/usr/include/curses_colr"
+ fi
+ ;;
+(sunos3*|sunos4*)
+ if test "x$cf_cv_screen" = "xcurses_5lib"
+ then
+ test -d /usr/5lib && \
+ test -d /usr/5include && \
+ cf_cv_curses_incdir="-I/usr/5include"
+ fi
+ ;;
+esac
+
+fi
+echo "$as_me:21787: result: $cf_cv_curses_incdir" >&5
+echo "${ECHO_T}$cf_cv_curses_incdir" >&6
+if test "$cf_cv_curses_incdir" != no
+then
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}$cf_cv_curses_incdir"
+
+fi
+
+echo "$as_me:21797: checking if we have identified curses headers" >&5
+echo $ECHO_N "checking if we have identified curses headers... $ECHO_C" >&6
+if test "${cf_cv_ncurses_header+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cf_cv_ncurses_header=none
+for cf_header in \
+ ncurses.h \
+ curses.h ncurses/ncurses.h ncurses/curses.h
+do
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 21809 "configure"
+#include "confdefs.h"
+#include <${cf_header}>
+int
+main (void)
+{
+initscr(); endwin()
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:21821: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:21824: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:21827: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:21830: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_ncurses_header=$cf_header; break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+done
+
+fi
+echo "$as_me:21841: result: $cf_cv_ncurses_header" >&5
+echo "${ECHO_T}$cf_cv_ncurses_header" >&6
+
+if test "$cf_cv_ncurses_header" = none ; then
+ { { echo "$as_me:21845: error: No curses header-files found" >&5
+echo "$as_me: error: No curses header-files found" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+# cheat, to get the right #define's for HAVE_NCURSES_H, etc.
+
+for ac_header in $cf_cv_ncurses_header
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:21855: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 21861 "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:21865: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+ (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ $EGREP -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:21871: \$? = $ac_status" >&5
+ (exit "$ac_status"); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ eval "$as_ac_Header=yes"
+else
+ echo "$as_me: failed program was:" >&5
+ cat "conftest.$ac_ext" >&5
+ eval "$as_ac_Header=no"
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi
+echo "$as_me:21890: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
+if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
+ cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+echo "$as_me:21900: checking for terminfo header" >&5
+echo $ECHO_N "checking for terminfo header... $ECHO_C" >&6
+if test "${cf_cv_term_header+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+case "${cf_cv_ncurses_header}" in
+(*/ncurses.h|*/ncursesw.h)
+ cf_term_header=`echo "$cf_cv_ncurses_header" | sed -e 's%ncurses[^.]*\.h$%term.h%'`
+ ;;
+(*)
+ cf_term_header=term.h
+ ;;
+esac
+
+for cf_test in $cf_term_header "ncurses/term.h" "ncursesw/term.h"
+do
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 21918 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+#include <${cf_cv_ncurses_header:-curses.h}>
+#include <$cf_test>
+
+int
+main (void)
+{
+int x = auto_left_margin; (void)x
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:21933: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:21936: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:21939: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:21942: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ cf_cv_term_header="$cf_test"
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+ cf_cv_term_header=unknown
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ test "$cf_cv_term_header" != unknown && break
+done
+
+fi
+echo "$as_me:21958: result: $cf_cv_term_header" >&5
+echo "${ECHO_T}$cf_cv_term_header" >&6
+
+# Set definitions to allow ifdef'ing to accommodate subdirectories
+
+case "$cf_cv_term_header" in
+(*term.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_TERM_H 1
+EOF
+
+ ;;
+esac
+
+case "$cf_cv_term_header" in
+(ncurses/term.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSES_TERM_H 1
+EOF
+
+ ;;
+(ncursesw/term.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSESW_TERM_H 1
+EOF
+
+ ;;
+esac
+
+echo "$as_me:21990: checking for ncurses version" >&5
+echo $ECHO_N "checking for ncurses version... $ECHO_C" >&6
+if test "${cf_cv_ncurses_version+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cf_cv_ncurses_version=no
+ cf_tempfile=out$$
+ rm -f "$cf_tempfile"
+ if test "$cross_compiling" = yes; then
+
+ # This will not work if the preprocessor splits the line after the
+ # Autoconf token. The 'unproto' program does that.
+ cat > "conftest.$ac_ext" <<EOF
+#include <${cf_cv_ncurses_header:-curses.h}>
+#undef Autoconf
+#ifdef NCURSES_VERSION
+Autoconf NCURSES_VERSION
+#else
+#ifdef __NCURSES_H
+Autoconf "old"
+#endif
+;
+#endif
+EOF
+ cf_try="$ac_cpp conftest.$ac_ext 2>&5 | grep '^Autoconf ' >conftest.out"
+ { (eval echo "$as_me:22016: \"$cf_try\"") >&5
+ (eval $cf_try) 2>&5
+ ac_status=$?
+ echo "$as_me:22019: \$? = $ac_status" >&5
+ (exit "$ac_status"); }
+ if test -f conftest.out ; then
+ cf_out=`sed -e 's%^Autoconf %%' -e 's%^[^"]*"%%' -e 's%".*%%' conftest.out`
+ test -n "$cf_out" && cf_cv_ncurses_version="$cf_out"
+ rm -f conftest.out
+ fi
+
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 22029 "configure"
+#include "confdefs.h"
+
+$ac_includes_default
+
+#include <${cf_cv_ncurses_header:-curses.h}>
+
+int main(void)
+{
+ FILE *fp = fopen("$cf_tempfile", "w");
+#ifdef NCURSES_VERSION
+# ifdef NCURSES_VERSION_PATCH
+ fprintf(fp, "%s.%d\\n", NCURSES_VERSION, NCURSES_VERSION_PATCH);
+# else
+ fprintf(fp, "%s\\n", NCURSES_VERSION);
+# endif
+#else
+# ifdef __NCURSES_H
+ fprintf(fp, "old\\n");
+# else
+ make an error
+# endif
+#endif
+ ${cf_cv_main_return:-return}(0);
+}
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:22056: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:22059: \$? = $ac_status" >&5
+ (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+ { (eval echo "$as_me:22061: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:22064: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ cf_cv_ncurses_version=`cat $cf_tempfile`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+ rm -f "$cf_tempfile"
+
+fi
+echo "$as_me:22078: result: $cf_cv_ncurses_version" >&5
+echo "${ECHO_T}$cf_cv_ncurses_version" >&6
+test "$cf_cv_ncurses_version" = no ||
+cat >>confdefs.h <<\EOF
+#define NCURSES 1
+EOF
+
+echo "$as_me:22085: checking if we have identified curses libraries" >&5
+echo $ECHO_N "checking if we have identified curses libraries... $ECHO_C" >&6
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 22088 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+initscr(); endwin()
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:22100: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:22103: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:22106: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:22109: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_result=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_result=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+echo "$as_me:22118: result: $cf_result" >&5
+echo "${ECHO_T}$cf_result" >&6
+
+if test "$cf_result" = no ; then
+case "$host_os" in
+(freebsd*)
+ echo "$as_me:22124: checking for tgoto in -lmytinfo" >&5
+echo $ECHO_N "checking for tgoto in -lmytinfo... $ECHO_C" >&6
+if test "${ac_cv_lib_mytinfo_tgoto+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lmytinfo $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 22132 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char tgoto ();
+int
+main (void)
+{
+tgoto ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:22151: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:22154: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:22157: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:22160: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_lib_mytinfo_tgoto=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_mytinfo_tgoto=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:22171: result: $ac_cv_lib_mytinfo_tgoto" >&5
+echo "${ECHO_T}$ac_cv_lib_mytinfo_tgoto" >&6
+if test "$ac_cv_lib_mytinfo_tgoto" = yes; then
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lmytinfo; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+fi
+
+ ;;
+(hpux10.*)
+ # Looking at HPUX 10.20, the Hcurses library is the oldest (1997), cur_colr
+ # next (1998), and xcurses "newer" (2000). There is no header file for
+ # Hcurses; the subdirectory curses_colr has the headers (curses.h and
+ # term.h) for cur_colr
+ if test "x$cf_cv_screen" = "xcurses_colr"
+ then
+ echo "$as_me:22201: checking for initscr in -lcur_colr" >&5
+echo $ECHO_N "checking for initscr in -lcur_colr... $ECHO_C" >&6
+if test "${ac_cv_lib_cur_colr_initscr+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lcur_colr $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 22209 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char initscr ();
+int
+main (void)
+{
+initscr ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:22228: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:22231: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:22234: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:22237: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_lib_cur_colr_initscr=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_cur_colr_initscr=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:22248: result: $ac_cv_lib_cur_colr_initscr" >&5
+echo "${ECHO_T}$ac_cv_lib_cur_colr_initscr" >&6
+if test "$ac_cv_lib_cur_colr_initscr" = yes; then
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lcur_colr; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+ ac_cv_func_initscr=yes
+
+else
+
+ echo "$as_me:22272: checking for initscr in -lHcurses" >&5
+echo $ECHO_N "checking for initscr in -lHcurses... $ECHO_C" >&6
+if test "${ac_cv_lib_Hcurses_initscr+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lHcurses $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 22280 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char initscr ();
+int
+main (void)
+{
+initscr ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:22299: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:22302: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:22305: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:22308: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_lib_Hcurses_initscr=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_Hcurses_initscr=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:22319: result: $ac_cv_lib_Hcurses_initscr" >&5
+echo "${ECHO_T}$ac_cv_lib_Hcurses_initscr" >&6
+if test "$ac_cv_lib_Hcurses_initscr" = yes; then
+
+ # HP's header uses __HP_CURSES, but user claims _HP_CURSES.
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lHcurses; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-D__HP_CURSES -D_HP_CURSES"
+
+ ac_cv_func_initscr=yes
+
+fi
+
+fi
+
+ fi
+ ;;
+(linux*)
+ case `arch 2>/dev/null` in
+ (x86_64)
+ if test -d /lib64
+ then
+
+if test -n "/lib64" ; then
+ for cf_add_libdir in /lib64
+ do
+ if test "$cf_add_libdir" = /usr/lib ; then
+ :
+ elif test -d "$cf_add_libdir"
+ then
+ cf_have_libdir=no
+ if test -n "$LDFLAGS$LIBS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_libdir in $LDFLAGS $LIBS ; do
+ if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
+ cf_have_libdir=yes; break
+ fi
+ done
+ fi
+ if test "$cf_have_libdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
+
+echo "${as_me:-configure}:22377: testing adding $cf_add_libdir to library-path ..." 1>&5
+
+ LDFLAGS="-L$cf_add_libdir $LDFLAGS"
+ fi
+ fi
+ done
+fi
+
+ else
+
+if test -n "/lib" ; then
+ for cf_add_libdir in /lib
+ do
+ if test "$cf_add_libdir" = /usr/lib ; then
+ :
+ elif test -d "$cf_add_libdir"
+ then
+ cf_have_libdir=no
+ if test -n "$LDFLAGS$LIBS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_libdir in $LDFLAGS $LIBS ; do
+ if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
+ cf_have_libdir=yes; break
+ fi
+ done
+ fi
+ if test "$cf_have_libdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
+
+echo "${as_me:-configure}:22406: testing adding $cf_add_libdir to library-path ..." 1>&5
+
+ LDFLAGS="-L$cf_add_libdir $LDFLAGS"
+ fi
+ fi
+ done
+fi
+
+ fi
+ ;;
+ (*)
+
+if test -n "/lib" ; then
+ for cf_add_libdir in /lib
+ do
+ if test "$cf_add_libdir" = /usr/lib ; then
+ :
+ elif test -d "$cf_add_libdir"
+ then
+ cf_have_libdir=no
+ if test -n "$LDFLAGS$LIBS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_libdir in $LDFLAGS $LIBS ; do
+ if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
+ cf_have_libdir=yes; break
+ fi
+ done
+ fi
+ if test "$cf_have_libdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
+
+echo "${as_me:-configure}:22437: testing adding $cf_add_libdir to library-path ..." 1>&5
+
+ LDFLAGS="-L$cf_add_libdir $LDFLAGS"
+ fi
+ fi
+ done
+fi
+
+ ;;
+ esac
+ ;;
+(sunos3*|sunos4*)
+ if test "x$cf_cv_screen" = "xcurses_5lib"
+ then
+ if test -d /usr/5lib ; then
+
+if test -n "/usr/5lib" ; then
+ for cf_add_libdir in /usr/5lib
+ do
+ if test "$cf_add_libdir" = /usr/lib ; then
+ :
+ elif test -d "$cf_add_libdir"
+ then
+ cf_have_libdir=no
+ if test -n "$LDFLAGS$LIBS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_libdir in $LDFLAGS $LIBS ; do
+ if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
+ cf_have_libdir=yes; break
+ fi
+ done
+ fi
+ if test "$cf_have_libdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
+
+echo "${as_me:-configure}:22472: testing adding $cf_add_libdir to library-path ..." 1>&5
+
+ LDFLAGS="-L$cf_add_libdir $LDFLAGS"
+ fi
+ fi
+ done
+fi
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lcurses -ltermcap; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+ fi
+ fi
+ ac_cv_func_initscr=yes
+ ;;
+esac
+
+if test ".$ac_cv_func_initscr" != .yes ; then
+ cf_save_LIBS="$LIBS"
+
+ if test ".${cf_cv_ncurses_version:-no}" != .no
+ then
+ cf_check_list="ncurses curses cursesX"
+ else
+ cf_check_list="cursesX curses ncurses"
+ fi
+
+ # Check for library containing tgoto. Do this before curses library
+ # because it may be needed to link the test-case for initscr.
+ if test "x$cf_term_lib" = x
+ then
+ echo "$as_me:22516: checking for tgoto" >&5
+echo $ECHO_N "checking for tgoto... $ECHO_C" >&6
+if test "${ac_cv_func_tgoto+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 22522 "configure"
+#include "confdefs.h"
+#define tgoto autoconf_temporary
+#include <limits.h> /* least-intrusive standard header which defines gcc2 __stub macros */
+#undef tgoto
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char tgoto (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_tgoto) || defined (__stub___tgoto)
+#error found stub for tgoto
+#endif
+
+ return tgoto ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:22553: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:22556: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:22559: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:22562: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_func_tgoto=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_tgoto=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:22572: result: $ac_cv_func_tgoto" >&5
+echo "${ECHO_T}$ac_cv_func_tgoto" >&6
+if test "$ac_cv_func_tgoto" = yes; then
+ cf_term_lib=predefined
+else
+
+ for cf_term_lib in $cf_check_list otermcap termcap tinfo termlib unknown
+ do
+ as_ac_Lib=`echo "ac_cv_lib_$cf_term_lib''_tgoto" | $as_tr_sh`
+echo "$as_me:22581: checking for tgoto in -l$cf_term_lib" >&5
+echo $ECHO_N "checking for tgoto in -l$cf_term_lib... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Lib+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l$cf_term_lib $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 22589 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char tgoto ();
+int
+main (void)
+{
+tgoto ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:22608: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:22611: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:22614: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:22617: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ eval "$as_ac_Lib=yes"
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+eval "$as_ac_Lib=no"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:22628: result: `eval echo '${'"$as_ac_Lib"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_Lib"'}'`" >&6
+if test "`eval echo '${'"$as_ac_Lib"'}'`" = yes; then
+
+ : "${cf_nculib_root:=$cf_term_lib}"
+ break
+
+fi
+
+ done
+
+fi
+
+ fi
+
+ # Check for library containing initscr
+ test "$cf_term_lib" != predefined && test "$cf_term_lib" != unknown && LIBS="-l$cf_term_lib $cf_save_LIBS"
+ if test "x$cf_curs_lib" = x
+ then
+ for cf_curs_lib in $cf_check_list xcurses jcurses pdcurses unknown
+ do
+ LIBS="-l$cf_curs_lib $cf_save_LIBS"
+ if test "$cf_term_lib" = unknown || test "$cf_term_lib" = "$cf_curs_lib" ; then
+ echo "$as_me:22651: checking if we can link with $cf_curs_lib library" >&5
+echo $ECHO_N "checking if we can link with $cf_curs_lib library... $ECHO_C" >&6
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 22654 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+initscr()
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:22666: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:22669: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:22672: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:22675: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_result=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_result=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+ echo "$as_me:22684: result: $cf_result" >&5
+echo "${ECHO_T}$cf_result" >&6
+ test "$cf_result" = yes && break
+ elif test "$cf_curs_lib" = "$cf_term_lib" ; then
+ cf_result=no
+ elif test "$cf_term_lib" != predefined ; then
+ echo "$as_me:22690: checking if we need both $cf_curs_lib and $cf_term_lib libraries" >&5
+echo $ECHO_N "checking if we need both $cf_curs_lib and $cf_term_lib libraries... $ECHO_C" >&6
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 22693 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+initscr(); endwin();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:22705: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:22708: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:22711: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:22714: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_result=no
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+ LIBS="-l$cf_curs_lib -l$cf_term_lib $cf_save_LIBS"
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 22723 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+initscr()
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:22735: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:22738: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:22741: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:22744: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_result=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_result=error
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+ echo "$as_me:22756: result: $cf_result" >&5
+echo "${ECHO_T}$cf_result" >&6
+ test "$cf_result" != error && break
+ fi
+ done
+ fi
+ test "$cf_curs_lib" = unknown && { { echo "$as_me:22762: error: no curses library found" >&5
+echo "$as_me: error: no curses library found" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+fi
+
+echo "$as_me:22768: checking for curses performance tradeoff" >&5
+echo $ECHO_N "checking for curses performance tradeoff... $ECHO_C" >&6
+if test "${cf_cv_curs_performance+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cf_cv_curs_performance=no
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 22776 "configure"
+#include "confdefs.h"
+
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+
+#if defined(wbkgdset) && defined(clearok) && defined(getbkgd)
+ int x = ERR;
+#else
+ int x = ; /* force an error */
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:22795: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:22798: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:22801: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:22804: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 22808 "configure"
+#include "confdefs.h"
+
+#define CURS_PERFORMANCE
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+
+#if defined(wbkgdset) && defined(clearok) && defined(getbkgd)
+ int x = ; /* force an error */
+#else
+ int x = ERR;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:22828: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:22831: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:22834: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:22837: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_curs_performance=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+
+echo "$as_me:22852: result: $cf_cv_curs_performance" >&5
+echo "${ECHO_T}$cf_cv_curs_performance" >&6
+test "$cf_cv_curs_performance" = yes &&
+cat >>confdefs.h <<\EOF
+#define CURS_PERFORMANCE 1
+EOF
+
+echo "$as_me:22859: checking for curses touchline function" >&5
+echo $ECHO_N "checking for curses touchline function... $ECHO_C" >&6
+if test "${cf_cv_curs_touchline+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 22866 "configure"
+#include "confdefs.h"
+
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+touchline(stdscr, 1,2,3);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:22879: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:22882: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:22885: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:22888: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_curs_touchline=bsd
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 22895 "configure"
+#include "confdefs.h"
+
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+touchline(stdscr, 1,2);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:22908: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:22911: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:22914: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:22917: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_curs_touchline=sysv
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_curs_touchline=bsd
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:22929: result: $cf_cv_curs_touchline" >&5
+echo "${ECHO_T}$cf_cv_curs_touchline" >&6
+case "$cf_cv_curs_touchline" in
+(bsd)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_BSD_TOUCHLINE 1
+EOF
+
+ ;;
+(sysv)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_SYSV_TOUCHLINE 1
+EOF
+
+ ;;
+esac
+
+ ;;
+(ncursesw*)
+
+for ac_header in wchar.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:22954: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 22960 "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:22964: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+ (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ $EGREP -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:22970: \$? = $ac_status" >&5
+ (exit "$ac_status"); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ eval "$as_ac_Header=yes"
+else
+ echo "$as_me: failed program was:" >&5
+ cat "conftest.$ac_ext" >&5
+ eval "$as_ac_Header=no"
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi
+echo "$as_me:22989: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
+if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
+ cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+echo "$as_me:22999: checking for multibyte character support" >&5
+echo $ECHO_N "checking for multibyte character support... $ECHO_C" >&6
+if test "${cf_cv_utf8_lib+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cf_save_LIBS="$LIBS"
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 23007 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#ifdef HAVE_WCHAR_H
+#include <wchar.h>
+#endif
+
+int
+main (void)
+{
+putwc(0,0);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:23025: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:23028: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:23031: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:23034: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_utf8_lib=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+# If the linkage is not already in the $CPPFLAGS/$LDFLAGS configuration, these
+# will be set on completion of the AC_TRY_LINK below.
+cf_cv_header_path_utf8=
+cf_cv_library_path_utf8=
+
+echo "${as_me:-configure}:23046: testing Starting FIND_LINKAGE(utf8,) ..." 1>&5
+
+cf_save_LIBS="$LIBS"
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 23051 "configure"
+#include "confdefs.h"
+
+#include <libutf8.h>
+int
+main (void)
+{
+putwc(0,0);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:23064: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:23067: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:23070: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:23073: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ cf_cv_find_linkage_utf8=yes
+ cf_cv_header_path_utf8=/usr/include
+ cf_cv_library_path_utf8=/usr/lib
+
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+LIBS="-lutf8 $cf_save_LIBS"
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 23087 "configure"
+#include "confdefs.h"
+
+#include <libutf8.h>
+int
+main (void)
+{
+putwc(0,0);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:23100: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:23103: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:23106: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:23109: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ cf_cv_find_linkage_utf8=yes
+ cf_cv_header_path_utf8=/usr/include
+ cf_cv_library_path_utf8=/usr/lib
+ cf_cv_library_file_utf8="-lutf8"
+
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+ cf_cv_find_linkage_utf8=no
+ LIBS="$cf_save_LIBS"
+
+ test -n "$verbose" && echo " find linkage for utf8 library" 1>&6
+
+echo "${as_me:-configure}:23126: testing find linkage for utf8 library ..." 1>&5
+
+echo "${as_me:-configure}:23128: testing Searching for headers in FIND_LINKAGE(utf8,) ..." 1>&5
+
+ cf_save_CPPFLAGS="$CPPFLAGS"
+ cf_test_CPPFLAGS="$CPPFLAGS"
+
+cf_search=
+
+# collect the current set of include-directories from compiler flags
+cf_header_path_list=""
+if test -n "${CFLAGS}${CPPFLAGS}" ; then
+ for cf_header_path in $CPPFLAGS $CFLAGS
+ do
+ case "$cf_header_path" in
+ (-I*)
+ cf_header_path=`echo ".$cf_header_path" |sed -e 's/^...//' -e 's,/include$,,'`
+
+test "x$cf_header_path" != "xNONE" && \
+test -d "$cf_header_path" && \
+ {
+ test -n "$verbose" && echo " ... testing for include-directories under $cf_header_path"
+ test -d "$cf_header_path/include" && cf_search="$cf_search $cf_header_path/include"
+ test -d "$cf_header_path/include/utf8" && cf_search="$cf_search $cf_header_path/include/utf8"
+ test -d "$cf_header_path/include/utf8/include" && cf_search="$cf_search $cf_header_path/include/utf8/include"
+ test -d "$cf_header_path/utf8/include" && cf_search="$cf_search $cf_header_path/utf8/include"
+ test -d "$cf_header_path/utf8/include/utf8" && cf_search="$cf_search $cf_header_path/utf8/include/utf8"
+}
+
+ cf_header_path_list="$cf_header_path_list $cf_search"
+ ;;
+ esac
+ done
+fi
+
+# add the variations for the package we are looking for
+
+cf_search=
+
+test "x$prefix" != "xNONE" && \
+test -d "$prefix" && \
+ {
+ test -n "$verbose" && echo " ... testing for include-directories under $prefix"
+ test -d "$prefix/include" && cf_search="$cf_search $prefix/include"
+ test -d "$prefix/include/utf8" && cf_search="$cf_search $prefix/include/utf8"
+ test -d "$prefix/include/utf8/include" && cf_search="$cf_search $prefix/include/utf8/include"
+ test -d "$prefix/utf8/include" && cf_search="$cf_search $prefix/utf8/include"
+ test -d "$prefix/utf8/include/utf8" && cf_search="$cf_search $prefix/utf8/include/utf8"
+}
+
+for cf_subdir_prefix in \
+ /usr \
+ /usr/local \
+ /usr/pkg \
+ /opt \
+ /opt/local \
+ $HOME
+do
+
+test "x$cf_subdir_prefix" != "x$prefix" && \
+test -d "$cf_subdir_prefix" && \
+{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
+ test -n "$verbose" && echo " ... testing for include-directories under $cf_subdir_prefix"
+ test -d "$cf_subdir_prefix/include" && cf_search="$cf_search $cf_subdir_prefix/include"
+ test -d "$cf_subdir_prefix/include/utf8" && cf_search="$cf_search $cf_subdir_prefix/include/utf8"
+ test -d "$cf_subdir_prefix/include/utf8/include" && cf_search="$cf_search $cf_subdir_prefix/include/utf8/include"
+ test -d "$cf_subdir_prefix/utf8/include" && cf_search="$cf_search $cf_subdir_prefix/utf8/include"
+ test -d "$cf_subdir_prefix/utf8/include/utf8" && cf_search="$cf_search $cf_subdir_prefix/utf8/include/utf8"
+}
+
+done
+
+test "$includedir" != NONE && \
+test "$includedir" != "/usr/include" && \
+test -d "$includedir" && {
+ test -d "$includedir" && cf_search="$cf_search $includedir"
+ test -d "$includedir/utf8" && cf_search="$cf_search $includedir/utf8"
+}
+
+test "$oldincludedir" != NONE && \
+test "$oldincludedir" != "/usr/include" && \
+test -d "$oldincludedir" && {
+ test -d "$oldincludedir" && cf_search="$cf_search $oldincludedir"
+ test -d "$oldincludedir/utf8" && cf_search="$cf_search $oldincludedir/utf8"
+}
+
+cf_search="$cf_search $cf_header_path_list"
+
+ for cf_cv_header_path_utf8 in $cf_search
+ do
+ if test -d "$cf_cv_header_path_utf8" ; then
+ test -n "$verbose" && echo " ... testing $cf_cv_header_path_utf8" 1>&6
+
+echo "${as_me:-configure}:23219: testing ... testing $cf_cv_header_path_utf8 ..." 1>&5
+
+ CPPFLAGS="$cf_save_CPPFLAGS"
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_cv_header_path_utf8"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 23227 "configure"
+#include "confdefs.h"
+
+#include <libutf8.h>
+int
+main (void)
+{
+putwc(0,0);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:23240: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:23243: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:23246: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:23249: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ test -n "$verbose" && echo " ... found utf8 headers in $cf_cv_header_path_utf8" 1>&6
+
+echo "${as_me:-configure}:23254: testing ... found utf8 headers in $cf_cv_header_path_utf8 ..." 1>&5
+
+ cf_cv_find_linkage_utf8=maybe
+ cf_test_CPPFLAGS="$CPPFLAGS"
+ break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+ CPPFLAGS="$cf_save_CPPFLAGS"
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ fi
+ done
+
+ if test "$cf_cv_find_linkage_utf8" = maybe ; then
+
+echo "${as_me:-configure}:23272: testing Searching for utf8 library in FIND_LINKAGE(utf8,) ..." 1>&5
+
+ cf_save_LIBS="$LIBS"
+ cf_save_LDFLAGS="$LDFLAGS"
+
+ if test "$cf_cv_find_linkage_utf8" != yes ; then
+
+cf_search=
+cf_library_path_list=""
+if test -n "${LDFLAGS}${LIBS}" ; then
+ for cf_library_path in $LDFLAGS $LIBS
+ do
+ case "$cf_library_path" in
+ (-L*)
+ cf_library_path=`echo ".$cf_library_path" |sed -e 's/^...//' -e 's,/lib$,,'`
+
+test "x$cf_library_path" != "xNONE" && \
+test -d "$cf_library_path" && \
+ {
+ test -n "$verbose" && echo " ... testing for lib-directories under $cf_library_path"
+ test -d "$cf_library_path/lib" && cf_search="$cf_search $cf_library_path/lib"
+ test -d "$cf_library_path/lib/utf8" && cf_search="$cf_search $cf_library_path/lib/utf8"
+ test -d "$cf_library_path/lib/utf8/lib" && cf_search="$cf_search $cf_library_path/lib/utf8/lib"
+ test -d "$cf_library_path/utf8/lib" && cf_search="$cf_search $cf_library_path/utf8/lib"
+ test -d "$cf_library_path/utf8/lib/utf8" && cf_search="$cf_search $cf_library_path/utf8/lib/utf8"
+}
+
+ cf_library_path_list="$cf_library_path_list $cf_search"
+ ;;
+ esac
+ done
+fi
+
+cf_search=
+
+test "x$prefix" != "xNONE" && \
+test -d "$prefix" && \
+ {
+ test -n "$verbose" && echo " ... testing for lib-directories under $prefix"
+ test -d "$prefix/lib" && cf_search="$cf_search $prefix/lib"
+ test -d "$prefix/lib/utf8" && cf_search="$cf_search $prefix/lib/utf8"
+ test -d "$prefix/lib/utf8/lib" && cf_search="$cf_search $prefix/lib/utf8/lib"
+ test -d "$prefix/utf8/lib" && cf_search="$cf_search $prefix/utf8/lib"
+ test -d "$prefix/utf8/lib/utf8" && cf_search="$cf_search $prefix/utf8/lib/utf8"
+}
+
+for cf_subdir_prefix in \
+ /usr \
+ /usr/local \
+ /usr/pkg \
+ /opt \
+ /opt/local \
+ $HOME
+do
+
+test "x$cf_subdir_prefix" != "x$prefix" && \
+test -d "$cf_subdir_prefix" && \
+{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
+ test -n "$verbose" && echo " ... testing for lib-directories under $cf_subdir_prefix"
+ test -d "$cf_subdir_prefix/lib" && cf_search="$cf_search $cf_subdir_prefix/lib"
+ test -d "$cf_subdir_prefix/lib/utf8" && cf_search="$cf_search $cf_subdir_prefix/lib/utf8"
+ test -d "$cf_subdir_prefix/lib/utf8/lib" && cf_search="$cf_search $cf_subdir_prefix/lib/utf8/lib"
+ test -d "$cf_subdir_prefix/utf8/lib" && cf_search="$cf_search $cf_subdir_prefix/utf8/lib"
+ test -d "$cf_subdir_prefix/utf8/lib/utf8" && cf_search="$cf_search $cf_subdir_prefix/utf8/lib/utf8"
+}
+
+done
+
+cf_search="$cf_library_path_list $cf_search"
+
+ for cf_cv_library_path_utf8 in $cf_search
+ do
+ if test -d "$cf_cv_library_path_utf8" ; then
+ test -n "$verbose" && echo " ... testing $cf_cv_library_path_utf8" 1>&6
+
+echo "${as_me:-configure}:23347: testing ... testing $cf_cv_library_path_utf8 ..." 1>&5
+
+ CPPFLAGS="$cf_test_CPPFLAGS"
+ LIBS="-lutf8 $cf_save_LIBS"
+ LDFLAGS="$cf_save_LDFLAGS -L$cf_cv_library_path_utf8"
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 23353 "configure"
+#include "confdefs.h"
+
+#include <libutf8.h>
+int
+main (void)
+{
+putwc(0,0);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:23366: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:23369: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:23372: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:23375: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ test -n "$verbose" && echo " ... found utf8 library in $cf_cv_library_path_utf8" 1>&6
+
+echo "${as_me:-configure}:23380: testing ... found utf8 library in $cf_cv_library_path_utf8 ..." 1>&5
+
+ cf_cv_find_linkage_utf8=yes
+ cf_cv_library_file_utf8="-lutf8"
+ break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+ CPPFLAGS="$cf_save_CPPFLAGS"
+ LIBS="$cf_save_LIBS"
+ LDFLAGS="$cf_save_LDFLAGS"
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+ fi
+ done
+ CPPFLAGS="$cf_save_CPPFLAGS"
+ LDFLAGS="$cf_save_LDFLAGS"
+ fi
+
+ else
+ cf_cv_find_linkage_utf8=no
+ fi
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+LIBS="$cf_save_LIBS"
+
+if test "$cf_cv_find_linkage_utf8" = yes ; then
+cf_cv_utf8_lib=add-on
+else
+cf_cv_utf8_lib=no
+fi
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:23422: result: $cf_cv_utf8_lib" >&5
+echo "${ECHO_T}$cf_cv_utf8_lib" >&6
+
+# HAVE_LIBUTF8_H is used by ncurses if curses.h is shared between
+# ncurses/ncursesw:
+if test "$cf_cv_utf8_lib" = "add-on" ; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_LIBUTF8_H 1
+EOF
+
+if test -n "$cf_cv_header_path_utf8" ; then
+ for cf_add_incdir in $cf_cv_header_path_utf8
+ do
+ while test "$cf_add_incdir" != /usr/include
+ do
+ if test -d "$cf_add_incdir"
+ then
+ cf_have_incdir=no
+ if test -n "$CFLAGS$CPPFLAGS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+ if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+ cf_have_incdir=yes; break
+ fi
+ done
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ if test "$cf_add_incdir" = /usr/local/include ; then
+ if test "$GCC" = yes
+ then
+ cf_save_CPPFLAGS=$CPPFLAGS
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 23460 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:23472: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:23475: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:23478: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:23481: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ CPPFLAGS=$cf_save_CPPFLAGS
+ fi
+ fi
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:23498: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+ CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+ cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+ test "$cf_top_incdir" = "$cf_add_incdir" && break
+ cf_add_incdir="$cf_top_incdir"
+ else
+ break
+ fi
+ else
+ break
+ fi
+ done
+ done
+fi
+
+if test -n "$cf_cv_library_path_utf8" ; then
+ for cf_add_libdir in $cf_cv_library_path_utf8
+ do
+ if test "$cf_add_libdir" = /usr/lib ; then
+ :
+ elif test -d "$cf_add_libdir"
+ then
+ cf_have_libdir=no
+ if test -n "$LDFLAGS$LIBS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_libdir in $LDFLAGS $LIBS ; do
+ if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
+ cf_have_libdir=yes; break
+ fi
+ done
+ fi
+ if test "$cf_have_libdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
+
+echo "${as_me:-configure}:23534: testing adding $cf_add_libdir to library-path ..." 1>&5
+
+ LDFLAGS="-L$cf_add_libdir $LDFLAGS"
+ fi
+ fi
+ done
+fi
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_cv_library_file_utf8; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+fi
+
+cf_ncuconfig_root=$cf_cv_screen
+cf_have_ncuconfig=no
+
+if test "x${PKG_CONFIG:=none}" != xnone; then
+ echo "$as_me:23564: checking pkg-config for $cf_ncuconfig_root" >&5
+echo $ECHO_N "checking pkg-config for $cf_ncuconfig_root... $ECHO_C" >&6
+ if "$PKG_CONFIG" --exists $cf_ncuconfig_root ; then
+ echo "$as_me:23567: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+
+ echo "$as_me:23570: checking if the $cf_ncuconfig_root package files work" >&5
+echo $ECHO_N "checking if the $cf_ncuconfig_root package files work... $ECHO_C" >&6
+ cf_have_ncuconfig=unknown
+
+ cf_save_CFLAGS="$CFLAGS"
+ cf_save_CPPFLAGS="$CPPFLAGS"
+ cf_save_LIBS="$LIBS"
+
+ cf_pkg_cflags="`$PKG_CONFIG --cflags $cf_ncuconfig_root`"
+ cf_pkg_libs="`$PKG_CONFIG --libs $cf_ncuconfig_root`"
+
+ # while -W for passing linker flags is prevalent, it is not "standard".
+ # At least one wrapper for c89/c99 (in Apple's xcode) has its own
+ # incompatible _and_ non-standard -W option which gives an error. Work
+ # around that pitfall.
+ case "x${CC}@@${cf_pkg_libs}@${cf_pkg_cflags}" in
+ (x*c[89]9@@*-W*)
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_pkg_cflags
+do
+case "$cf_fix_cppflags" in
+(no)
+ case "$cf_add_cflags" in
+ (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=yes
+
+ if test "$cf_fix_cppflags" = yes ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ elif test "${cf_tst_cflags}" = "\"'" ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ fi
+ ;;
+ esac
+ case "$CPPFLAGS" in
+ (*$cf_add_cflags)
+ ;;
+ (*)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+ sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \
+ -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'`
+
+ ;;
+ esac
+
+ test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+ cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+ (*)
+
+ test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+ cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+(yes)
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=no
+ ;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+ test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+ CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+ test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+ EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_pkg_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 23703 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+initscr(); mousemask(0,0); tigetstr((char *)0);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:23715: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:23718: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:23721: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:23724: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ if test "$cross_compiling" = yes; then
+ cf_test_ncuconfig=maybe
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 23730 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+ int main(void)
+ { const char *xx = curses_version(); return (xx == 0); }
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:23737: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:23740: \$? = $ac_status" >&5
+ (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+ { (eval echo "$as_me:23742: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:23745: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_test_ncuconfig=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_test_ncuconfig=no
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_test_ncuconfig=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+ CFLAGS="$cf_save_CFLAGS"
+ CPPFLAGS="$cf_save_CPPFLAGS"
+ LIBS="$cf_save_LIBS"
+
+ if test "x$cf_test_ncuconfig" != xyes; then
+ cf_temp=`echo "x$cf_pkg_cflags" | sed -e s/^x// -e 's/-W[^ ]*//g'`
+ cf_pkg_cflags="$cf_temp"
+ cf_temp=`echo "x$cf_pkg_libs" | sed -e s/^x// -e 's/-W[^ ]*//g'`
+ cf_pkg_libs="$cf_temp"
+ fi
+ ;;
+ esac
+
+for cf_add_cflags in $cf_pkg_cflags
+do
+ case "x$cf_add_cflags" in
+ (x-[DU]*)
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+ cf_old_cflag=`echo "x$CFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+ test "$CFLAGS" != "$cf_old_cflag" || break
+
+ CFLAGS="$cf_old_cflag"
+done
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+ cf_old_cflag=`echo "x$CPPFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+ test "$CPPFLAGS" != "$cf_old_cflag" || break
+
+ CPPFLAGS="$cf_old_cflag"
+done
+
+ ;;
+ esac
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_add_cflags
+do
+case "$cf_fix_cppflags" in
+(no)
+ case "$cf_add_cflags" in
+ (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=yes
+
+ if test "$cf_fix_cppflags" = yes ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ elif test "${cf_tst_cflags}" = "\"'" ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ fi
+ ;;
+ esac
+ case "$CPPFLAGS" in
+ (*$cf_add_cflags)
+ ;;
+ (*)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+ sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \
+ -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'`
+
+ ;;
+ esac
+
+ test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+ cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+ (*)
+
+ test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+ cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+(yes)
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=no
+ ;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+ test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+ CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+ test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+ EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+done
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_pkg_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 23919 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+initscr(); mousemask(0,0); tigetstr((char *)0);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:23931: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:23934: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:23937: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:23940: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ if test "$cross_compiling" = yes; then
+ cf_have_ncuconfig=maybe
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 23946 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+ int main(void)
+ { const char *xx = curses_version(); return (xx == 0); }
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:23953: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:23956: \$? = $ac_status" >&5
+ (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+ { (eval echo "$as_me:23958: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:23961: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_have_ncuconfig=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_ncuconfig=no
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_ncuconfig=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+ echo "$as_me:23978: result: $cf_have_ncuconfig" >&5
+echo "${ECHO_T}$cf_have_ncuconfig" >&6
+ test "$cf_have_ncuconfig" = maybe && cf_have_ncuconfig=yes
+ if test "$cf_have_ncuconfig" != "yes"
+ then
+ CPPFLAGS="$cf_save_CPPFLAGS"
+ LIBS="$cf_save_LIBS"
+ NCURSES_CONFIG_PKG=none
+ else
+
+cat >>confdefs.h <<\EOF
+#define NCURSES 1
+EOF
+
+ NCURSES_CONFIG_PKG=$cf_ncuconfig_root
+
+echo "$as_me:23994: checking for terminfo header" >&5
+echo $ECHO_N "checking for terminfo header... $ECHO_C" >&6
+if test "${cf_cv_term_header+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+case "${cf_cv_ncurses_header}" in
+(*/ncurses.h|*/ncursesw.h)
+ cf_term_header=`echo "$cf_cv_ncurses_header" | sed -e 's%ncurses[^.]*\.h$%term.h%'`
+ ;;
+(*)
+ cf_term_header=term.h
+ ;;
+esac
+
+for cf_test in $cf_term_header "ncurses/term.h" "ncursesw/term.h"
+do
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 24012 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+#include <${cf_cv_ncurses_header:-curses.h}>
+#include <$cf_test>
+
+int
+main (void)
+{
+int x = auto_left_margin; (void)x
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:24027: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:24030: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:24033: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:24036: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ cf_cv_term_header="$cf_test"
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+ cf_cv_term_header=unknown
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ test "$cf_cv_term_header" != unknown && break
+done
+
+fi
+echo "$as_me:24052: result: $cf_cv_term_header" >&5
+echo "${ECHO_T}$cf_cv_term_header" >&6
+
+# Set definitions to allow ifdef'ing to accommodate subdirectories
+
+case "$cf_cv_term_header" in
+(*term.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_TERM_H 1
+EOF
+
+ ;;
+esac
+
+case "$cf_cv_term_header" in
+(ncurses/term.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSES_TERM_H 1
+EOF
+
+ ;;
+(ncursesw/term.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSESW_TERM_H 1
+EOF
+
+ ;;
+esac
+
+ fi
+
+ else
+ echo "$as_me:24087: result: no" >&5
+echo "${ECHO_T}no" >&6
+ NCURSES_CONFIG_PKG=none
+ fi
+else
+ NCURSES_CONFIG_PKG=none
+fi
+
+if test "x$cf_have_ncuconfig" = "xno"; then
+ cf_ncurses_config="${cf_ncuconfig_root}${NCURSES_CONFIG_SUFFIX}-config"; echo "Looking for ${cf_ncurses_config}"
+
+if test -n "$ac_tool_prefix"; then
+ for ac_prog in ${cf_ncurses_config} ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}5-config
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:24103: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_NCURSES_CONFIG+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$NCURSES_CONFIG"; then
+ ac_cv_prog_NCURSES_CONFIG="$NCURSES_CONFIG" # Let the user override the test.
+else
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_NCURSES_CONFIG="$ac_tool_prefix$ac_prog"
+echo "$as_me:24118: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+NCURSES_CONFIG=$ac_cv_prog_NCURSES_CONFIG
+if test -n "$NCURSES_CONFIG"; then
+ echo "$as_me:24126: result: $NCURSES_CONFIG" >&5
+echo "${ECHO_T}$NCURSES_CONFIG" >&6
+else
+ echo "$as_me:24129: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$NCURSES_CONFIG" && break
+ done
+fi
+if test -z "$NCURSES_CONFIG"; then
+ ac_ct_NCURSES_CONFIG=$NCURSES_CONFIG
+ for ac_prog in ${cf_ncurses_config} ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}5-config
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:24142: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_NCURSES_CONFIG+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_NCURSES_CONFIG"; then
+ ac_cv_prog_ac_ct_NCURSES_CONFIG="$ac_ct_NCURSES_CONFIG" # Let the user override the test.
+else
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_ac_ct_NCURSES_CONFIG="$ac_prog"
+echo "$as_me:24157: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+ac_ct_NCURSES_CONFIG=$ac_cv_prog_ac_ct_NCURSES_CONFIG
+if test -n "$ac_ct_NCURSES_CONFIG"; then
+ echo "$as_me:24165: result: $ac_ct_NCURSES_CONFIG" >&5
+echo "${ECHO_T}$ac_ct_NCURSES_CONFIG" >&6
+else
+ echo "$as_me:24168: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$ac_ct_NCURSES_CONFIG" && break
+done
+test -n "$ac_ct_NCURSES_CONFIG" || ac_ct_NCURSES_CONFIG="none"
+
+ NCURSES_CONFIG=$ac_ct_NCURSES_CONFIG
+fi
+
+ if test "$NCURSES_CONFIG" != none ; then
+
+for cf_add_cflags in `$NCURSES_CONFIG --cflags`
+do
+ case "x$cf_add_cflags" in
+ (x-[DU]*)
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+ cf_old_cflag=`echo "x$CFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+ test "$CFLAGS" != "$cf_old_cflag" || break
+
+ CFLAGS="$cf_old_cflag"
+done
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+ cf_old_cflag=`echo "x$CPPFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+ test "$CPPFLAGS" != "$cf_old_cflag" || break
+
+ CPPFLAGS="$cf_old_cflag"
+done
+
+ ;;
+ esac
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_add_cflags
+do
+case "$cf_fix_cppflags" in
+(no)
+ case "$cf_add_cflags" in
+ (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=yes
+
+ if test "$cf_fix_cppflags" = yes ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ elif test "${cf_tst_cflags}" = "\"'" ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ fi
+ ;;
+ esac
+ case "$CPPFLAGS" in
+ (*$cf_add_cflags)
+ ;;
+ (*)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+ sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \
+ -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'`
+
+ ;;
+ esac
+
+ test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+ cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+ (*)
+
+ test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+ cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+(yes)
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=no
+ ;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+ test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+ CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+ test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+ EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+done
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in `$NCURSES_CONFIG --libs`; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+ # even with config script, some packages use no-override for curses.h
+
+echo "$as_me:24325: checking if we have identified curses headers" >&5
+echo $ECHO_N "checking if we have identified curses headers... $ECHO_C" >&6
+if test "${cf_cv_ncurses_header+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cf_cv_ncurses_header=none
+for cf_header in \
+ ncurses.h $cf_cv_screen/ncurses.h \
+ curses.h $cf_cv_screen/curses.h
+do
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 24337 "configure"
+#include "confdefs.h"
+#include <${cf_header}>
+int
+main (void)
+{
+initscr(); endwin()
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:24349: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:24352: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:24355: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:24358: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_ncurses_header=$cf_header; break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+done
+
+fi
+echo "$as_me:24369: result: $cf_cv_ncurses_header" >&5
+echo "${ECHO_T}$cf_cv_ncurses_header" >&6
+
+if test "$cf_cv_ncurses_header" = none ; then
+ { { echo "$as_me:24373: error: No curses header-files found" >&5
+echo "$as_me: error: No curses header-files found" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+# cheat, to get the right #define's for HAVE_NCURSES_H, etc.
+
+for ac_header in $cf_cv_ncurses_header
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:24383: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 24389 "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:24393: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+ (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ $EGREP -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:24399: \$? = $ac_status" >&5
+ (exit "$ac_status"); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ eval "$as_ac_Header=yes"
+else
+ echo "$as_me: failed program was:" >&5
+ cat "conftest.$ac_ext" >&5
+ eval "$as_ac_Header=no"
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi
+echo "$as_me:24418: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
+if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
+ cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+cat >>confdefs.h <<\EOF
+#define NCURSES 1
+EOF
+
+cf_nculib_ROOT=`echo "HAVE_LIB$cf_ncuconfig_root" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+ cat >>confdefs.h <<EOF
+#define $cf_nculib_ROOT 1
+EOF
+
+ cf_cv_ncurses_version="`$NCURSES_CONFIG --version`"
+
+ else
+
+cf_ncuhdr_root=$cf_cv_screen
+
+test -n "$cf_cv_curses_dir" && \
+test "$cf_cv_curses_dir" != "no" && { \
+
+if test -n "$cf_cv_curses_dir/include/$cf_ncuhdr_root" ; then
+ for cf_add_incdir in $cf_cv_curses_dir/include/$cf_ncuhdr_root
+ do
+ while test "$cf_add_incdir" != /usr/include
+ do
+ if test -d "$cf_add_incdir"
+ then
+ cf_have_incdir=no
+ if test -n "$CFLAGS$CPPFLAGS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+ if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+ cf_have_incdir=yes; break
+ fi
+ done
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ if test "$cf_add_incdir" = /usr/local/include ; then
+ if test "$GCC" = yes
+ then
+ cf_save_CPPFLAGS=$CPPFLAGS
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 24474 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:24486: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:24489: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:24492: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:24495: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ CPPFLAGS=$cf_save_CPPFLAGS
+ fi
+ fi
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:24512: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+ CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+ cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+ test "$cf_top_incdir" = "$cf_add_incdir" && break
+ cf_add_incdir="$cf_top_incdir"
+ else
+ break
+ fi
+ else
+ break
+ fi
+ done
+ done
+fi
+
+}
+
+echo "$as_me:24531: checking for $cf_ncuhdr_root header in include-path" >&5
+echo $ECHO_N "checking for $cf_ncuhdr_root header in include-path... $ECHO_C" >&6
+if test "${cf_cv_ncurses_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cf_header_list="$cf_ncuhdr_root/curses.h $cf_ncuhdr_root/ncurses.h"
+ { test "$cf_ncuhdr_root" = ncurses || test "$cf_ncuhdr_root" = ncursesw; } && cf_header_list="$cf_header_list curses.h ncurses.h"
+ for cf_header in $cf_header_list
+ do
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 24543 "configure"
+#include "confdefs.h"
+
+#include <$cf_header>
+int
+main (void)
+{
+
+#ifdef NCURSES_VERSION
+
+printf("%s\\n", NCURSES_VERSION);
+#else
+#ifdef __NCURSES_H
+printf("old\\n");
+#else
+ make an error
+#endif
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:24567: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:24570: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:24573: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:24576: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_ncurses_h=$cf_header
+
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_ncurses_h=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+ test "$cf_cv_ncurses_h" != no && break
+ done
+
+fi
+echo "$as_me:24591: result: $cf_cv_ncurses_h" >&5
+echo "${ECHO_T}$cf_cv_ncurses_h" >&6
+
+if test "$cf_cv_ncurses_h" != no ; then
+ cf_cv_ncurses_header=$cf_cv_ncurses_h
+else
+
+echo "$as_me:24598: checking for $cf_ncuhdr_root include-path" >&5
+echo $ECHO_N "checking for $cf_ncuhdr_root include-path... $ECHO_C" >&6
+if test "${cf_cv_ncurses_h2+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ test -n "$verbose" && echo
+
+cf_search=
+
+# collect the current set of include-directories from compiler flags
+cf_header_path_list=""
+if test -n "${CFLAGS}${CPPFLAGS}" ; then
+ for cf_header_path in $CPPFLAGS $CFLAGS
+ do
+ case "$cf_header_path" in
+ (-I*)
+ cf_header_path=`echo ".$cf_header_path" |sed -e 's/^...//' -e 's,/include$,,'`
+
+test "x$cf_header_path" != "xNONE" && \
+test -d "$cf_header_path" && \
+ {
+ test -n "$verbose" && echo " ... testing for include-directories under $cf_header_path"
+ test -d "$cf_header_path/include" && cf_search="$cf_search $cf_header_path/include"
+ test -d "$cf_header_path/include/$cf_ncuhdr_root" && cf_search="$cf_search $cf_header_path/include/$cf_ncuhdr_root"
+ test -d "$cf_header_path/include/$cf_ncuhdr_root/include" && cf_search="$cf_search $cf_header_path/include/$cf_ncuhdr_root/include"
+ test -d "$cf_header_path/$cf_ncuhdr_root/include" && cf_search="$cf_search $cf_header_path/$cf_ncuhdr_root/include"
+ test -d "$cf_header_path/$cf_ncuhdr_root/include/$cf_ncuhdr_root" && cf_search="$cf_search $cf_header_path/$cf_ncuhdr_root/include/$cf_ncuhdr_root"
+}
+
+ cf_header_path_list="$cf_header_path_list $cf_search"
+ ;;
+ esac
+ done
+fi
+
+# add the variations for the package we are looking for
+
+cf_search=
+
+test "x$prefix" != "xNONE" && \
+test -d "$prefix" && \
+ {
+ test -n "$verbose" && echo " ... testing for include-directories under $prefix"
+ test -d "$prefix/include" && cf_search="$cf_search $prefix/include"
+ test -d "$prefix/include/$cf_ncuhdr_root" && cf_search="$cf_search $prefix/include/$cf_ncuhdr_root"
+ test -d "$prefix/include/$cf_ncuhdr_root/include" && cf_search="$cf_search $prefix/include/$cf_ncuhdr_root/include"
+ test -d "$prefix/$cf_ncuhdr_root/include" && cf_search="$cf_search $prefix/$cf_ncuhdr_root/include"
+ test -d "$prefix/$cf_ncuhdr_root/include/$cf_ncuhdr_root" && cf_search="$cf_search $prefix/$cf_ncuhdr_root/include/$cf_ncuhdr_root"
+}
+
+for cf_subdir_prefix in \
+ /usr \
+ /usr/local \
+ /usr/pkg \
+ /opt \
+ /opt/local \
+ $HOME
+do
+
+test "x$cf_subdir_prefix" != "x$prefix" && \
+test -d "$cf_subdir_prefix" && \
+{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
+ test -n "$verbose" && echo " ... testing for include-directories under $cf_subdir_prefix"
+ test -d "$cf_subdir_prefix/include" && cf_search="$cf_search $cf_subdir_prefix/include"
+ test -d "$cf_subdir_prefix/include/$cf_ncuhdr_root" && cf_search="$cf_search $cf_subdir_prefix/include/$cf_ncuhdr_root"
+ test -d "$cf_subdir_prefix/include/$cf_ncuhdr_root/include" && cf_search="$cf_search $cf_subdir_prefix/include/$cf_ncuhdr_root/include"
+ test -d "$cf_subdir_prefix/$cf_ncuhdr_root/include" && cf_search="$cf_search $cf_subdir_prefix/$cf_ncuhdr_root/include"
+ test -d "$cf_subdir_prefix/$cf_ncuhdr_root/include/$cf_ncuhdr_root" && cf_search="$cf_search $cf_subdir_prefix/$cf_ncuhdr_root/include/$cf_ncuhdr_root"
+}
+
+done
+
+test "$includedir" != NONE && \
+test "$includedir" != "/usr/include" && \
+test -d "$includedir" && {
+ test -d "$includedir" && cf_search="$cf_search $includedir"
+ test -d "$includedir/$cf_ncuhdr_root" && cf_search="$cf_search $includedir/$cf_ncuhdr_root"
+}
+
+test "$oldincludedir" != NONE && \
+test "$oldincludedir" != "/usr/include" && \
+test -d "$oldincludedir" && {
+ test -d "$oldincludedir" && cf_search="$cf_search $oldincludedir"
+ test -d "$oldincludedir/$cf_ncuhdr_root" && cf_search="$cf_search $oldincludedir/$cf_ncuhdr_root"
+}
+
+cf_search="$cf_search $cf_header_path_list"
+
+ test -n "$verbose" && echo "search path $cf_search"
+ cf_save2_CPPFLAGS="$CPPFLAGS"
+ for cf_incdir in $cf_search
+ do
+
+if test -n "$cf_incdir" ; then
+ for cf_add_incdir in $cf_incdir
+ do
+ while test "$cf_add_incdir" != /usr/include
+ do
+ if test -d "$cf_add_incdir"
+ then
+ cf_have_incdir=no
+ if test -n "$CFLAGS$CPPFLAGS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+ if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+ cf_have_incdir=yes; break
+ fi
+ done
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ if test "$cf_add_incdir" = /usr/local/include ; then
+ if test "$GCC" = yes
+ then
+ cf_save_CPPFLAGS=$CPPFLAGS
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 24719 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:24731: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:24734: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:24737: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:24740: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ CPPFLAGS=$cf_save_CPPFLAGS
+ fi
+ fi
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:24757: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+ CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+ cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+ test "$cf_top_incdir" = "$cf_add_incdir" && break
+ cf_add_incdir="$cf_top_incdir"
+ else
+ break
+ fi
+ else
+ break
+ fi
+ done
+ done
+fi
+
+ for cf_header in \
+ ncurses.h \
+ curses.h
+ do
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 24780 "configure"
+#include "confdefs.h"
+
+#include <$cf_header>
+int
+main (void)
+{
+
+#ifdef NCURSES_VERSION
+
+printf("%s\\n", NCURSES_VERSION);
+#else
+#ifdef __NCURSES_H
+printf("old\\n");
+#else
+ make an error
+#endif
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:24804: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:24807: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:24810: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:24813: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_ncurses_h2=$cf_header
+
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_ncurses_h2=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+ if test "$cf_cv_ncurses_h2" != no ; then
+ cf_cv_ncurses_h2=$cf_incdir/$cf_header
+ test -n "$verbose" && echo $ECHO_N " ... found $ECHO_C" 1>&6
+ break
+ fi
+ test -n "$verbose" && echo " ... tested $cf_incdir/$cf_header" 1>&6
+ done
+ CPPFLAGS="$cf_save2_CPPFLAGS"
+ test "$cf_cv_ncurses_h2" != no && break
+ done
+ test "$cf_cv_ncurses_h2" = no && { { echo "$as_me:24834: error: not found" >&5
+echo "$as_me: error: not found" >&2;}
+ { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:24839: result: $cf_cv_ncurses_h2" >&5
+echo "${ECHO_T}$cf_cv_ncurses_h2" >&6
+
+ cf_1st_incdir=`echo "$cf_cv_ncurses_h2" | sed -e 's%/[^/]*$%%'`
+ cf_cv_ncurses_header="`basename "$cf_cv_ncurses_h2"`"
+ if test "`basename "$cf_1st_incdir"`" = "$cf_ncuhdr_root" ; then
+ cf_cv_ncurses_header="$cf_ncuhdr_root/$cf_cv_ncurses_header"
+ fi
+
+if test -n "$cf_1st_incdir" ; then
+ for cf_add_incdir in $cf_1st_incdir
+ do
+ while test "$cf_add_incdir" != /usr/include
+ do
+ if test -d "$cf_add_incdir"
+ then
+ cf_have_incdir=no
+ if test -n "$CFLAGS$CPPFLAGS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+ if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+ cf_have_incdir=yes; break
+ fi
+ done
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ if test "$cf_add_incdir" = /usr/local/include ; then
+ if test "$GCC" = yes
+ then
+ cf_save_CPPFLAGS=$CPPFLAGS
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 24875 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:24887: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:24890: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:24893: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:24896: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ CPPFLAGS=$cf_save_CPPFLAGS
+ fi
+ fi
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:24913: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+ CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+ cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+ test "$cf_top_incdir" = "$cf_add_incdir" && break
+ cf_add_incdir="$cf_top_incdir"
+ else
+ break
+ fi
+ else
+ break
+ fi
+ done
+ done
+fi
+
+fi
+
+# Set definitions to allow ifdef'ing for ncurses.h
+
+case "$cf_cv_ncurses_header" in
+(*ncurses.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSES_H 1
+EOF
+
+ ;;
+esac
+
+case "$cf_cv_ncurses_header" in
+(ncurses/curses.h|ncurses/ncurses.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSES_NCURSES_H 1
+EOF
+
+ ;;
+(ncursesw/curses.h|ncursesw/ncurses.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSESW_NCURSES_H 1
+EOF
+
+ ;;
+esac
+
+echo "$as_me:24961: checking for terminfo header" >&5
+echo $ECHO_N "checking for terminfo header... $ECHO_C" >&6
+if test "${cf_cv_term_header+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+case "${cf_cv_ncurses_header}" in
+(*/ncurses.h|*/ncursesw.h)
+ cf_term_header=`echo "$cf_cv_ncurses_header" | sed -e 's%ncurses[^.]*\.h$%term.h%'`
+ ;;
+(*)
+ cf_term_header=term.h
+ ;;
+esac
+
+for cf_test in $cf_term_header "ncurses/term.h" "ncursesw/term.h"
+do
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 24979 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+#include <${cf_cv_ncurses_header:-curses.h}>
+#include <$cf_test>
+
+int
+main (void)
+{
+int x = auto_left_margin; (void)x
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:24994: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:24997: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:25000: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:25003: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ cf_cv_term_header="$cf_test"
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+ cf_cv_term_header=unknown
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ test "$cf_cv_term_header" != unknown && break
+done
+
+fi
+echo "$as_me:25019: result: $cf_cv_term_header" >&5
+echo "${ECHO_T}$cf_cv_term_header" >&6
+
+# Set definitions to allow ifdef'ing to accommodate subdirectories
+
+case "$cf_cv_term_header" in
+(*term.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_TERM_H 1
+EOF
+
+ ;;
+esac
+
+case "$cf_cv_term_header" in
+(ncurses/term.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSES_TERM_H 1
+EOF
+
+ ;;
+(ncursesw/term.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSESW_TERM_H 1
+EOF
+
+ ;;
+esac
+
+# some applications need this, but should check for NCURSES_VERSION
+
+cat >>confdefs.h <<\EOF
+#define NCURSES 1
+EOF
+
+echo "$as_me:25057: checking for ncurses version" >&5
+echo $ECHO_N "checking for ncurses version... $ECHO_C" >&6
+if test "${cf_cv_ncurses_version+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cf_cv_ncurses_version=no
+ cf_tempfile=out$$
+ rm -f "$cf_tempfile"
+ if test "$cross_compiling" = yes; then
+
+ # This will not work if the preprocessor splits the line after the
+ # Autoconf token. The 'unproto' program does that.
+ cat > "conftest.$ac_ext" <<EOF
+#include <${cf_cv_ncurses_header:-curses.h}>
+#undef Autoconf
+#ifdef NCURSES_VERSION
+Autoconf NCURSES_VERSION
+#else
+#ifdef __NCURSES_H
+Autoconf "old"
+#endif
+;
+#endif
+EOF
+ cf_try="$ac_cpp conftest.$ac_ext 2>&5 | grep '^Autoconf ' >conftest.out"
+ { (eval echo "$as_me:25083: \"$cf_try\"") >&5
+ (eval $cf_try) 2>&5
+ ac_status=$?
+ echo "$as_me:25086: \$? = $ac_status" >&5
+ (exit "$ac_status"); }
+ if test -f conftest.out ; then
+ cf_out=`sed -e 's%^Autoconf %%' -e 's%^[^"]*"%%' -e 's%".*%%' conftest.out`
+ test -n "$cf_out" && cf_cv_ncurses_version="$cf_out"
+ rm -f conftest.out
+ fi
+
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 25096 "configure"
+#include "confdefs.h"
+
+$ac_includes_default
+
+#include <${cf_cv_ncurses_header:-curses.h}>
+
+int main(void)
+{
+ FILE *fp = fopen("$cf_tempfile", "w");
+#ifdef NCURSES_VERSION
+# ifdef NCURSES_VERSION_PATCH
+ fprintf(fp, "%s.%d\\n", NCURSES_VERSION, NCURSES_VERSION_PATCH);
+# else
+ fprintf(fp, "%s\\n", NCURSES_VERSION);
+# endif
+#else
+# ifdef __NCURSES_H
+ fprintf(fp, "old\\n");
+# else
+ make an error
+# endif
+#endif
+ ${cf_cv_main_return:-return}(0);
+}
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:25123: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:25126: \$? = $ac_status" >&5
+ (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+ { (eval echo "$as_me:25128: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:25131: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ cf_cv_ncurses_version=`cat $cf_tempfile`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+ rm -f "$cf_tempfile"
+
+fi
+echo "$as_me:25145: result: $cf_cv_ncurses_version" >&5
+echo "${ECHO_T}$cf_cv_ncurses_version" >&6
+test "$cf_cv_ncurses_version" = no ||
+cat >>confdefs.h <<\EOF
+#define NCURSES 1
+EOF
+
+cf_nculib_root=$cf_cv_screen
+ # This works, except for the special case where we find gpm, but
+ # ncurses is in a nonstandard location via $LIBS, and we really want
+ # to link gpm.
+cf_ncurses_LIBS=""
+cf_ncurses_SAVE="$LIBS"
+echo "$as_me:25158: checking for Gpm_Open in -lgpm" >&5
+echo $ECHO_N "checking for Gpm_Open in -lgpm... $ECHO_C" >&6
+if test "${ac_cv_lib_gpm_Gpm_Open+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lgpm $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 25166 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char Gpm_Open ();
+int
+main (void)
+{
+Gpm_Open ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:25185: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:25188: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:25191: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:25194: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_lib_gpm_Gpm_Open=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_gpm_Gpm_Open=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:25205: result: $ac_cv_lib_gpm_Gpm_Open" >&5
+echo "${ECHO_T}$ac_cv_lib_gpm_Gpm_Open" >&6
+if test "$ac_cv_lib_gpm_Gpm_Open" = yes; then
+ echo "$as_me:25208: checking for initscr in -lgpm" >&5
+echo $ECHO_N "checking for initscr in -lgpm... $ECHO_C" >&6
+if test "${ac_cv_lib_gpm_initscr+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lgpm $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 25216 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char initscr ();
+int
+main (void)
+{
+initscr ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:25235: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:25238: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:25241: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:25244: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_lib_gpm_initscr=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_gpm_initscr=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:25255: result: $ac_cv_lib_gpm_initscr" >&5
+echo "${ECHO_T}$ac_cv_lib_gpm_initscr" >&6
+if test "$ac_cv_lib_gpm_initscr" = yes; then
+ LIBS="$cf_ncurses_SAVE"
+else
+ cf_ncurses_LIBS="-lgpm"
+fi
+
+fi
+
+case "$host_os" in
+(freebsd*)
+ # This is only necessary if you are linking against an obsolete
+ # version of ncurses (but it should do no harm, since it is static).
+ if test "$cf_nculib_root" = ncurses ; then
+ echo "$as_me:25270: checking for tgoto in -lmytinfo" >&5
+echo $ECHO_N "checking for tgoto in -lmytinfo... $ECHO_C" >&6
+if test "${ac_cv_lib_mytinfo_tgoto+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lmytinfo $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 25278 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char tgoto ();
+int
+main (void)
+{
+tgoto ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:25297: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:25300: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:25303: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:25306: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_lib_mytinfo_tgoto=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_mytinfo_tgoto=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:25317: result: $ac_cv_lib_mytinfo_tgoto" >&5
+echo "${ECHO_T}$ac_cv_lib_mytinfo_tgoto" >&6
+if test "$ac_cv_lib_mytinfo_tgoto" = yes; then
+ cf_ncurses_LIBS="-lmytinfo $cf_ncurses_LIBS"
+fi
+
+ fi
+ ;;
+esac
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_ncurses_LIBS; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+if test -n "$cf_cv_curses_dir" && test "$cf_cv_curses_dir" != "no"
+then
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -l$cf_nculib_root; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+else
+
+ eval 'cf_cv_have_lib_'"$cf_nculib_root"'=no'
+ cf_libdir=""
+ echo "$as_me:25366: checking for initscr" >&5
+echo $ECHO_N "checking for initscr... $ECHO_C" >&6
+if test "${ac_cv_func_initscr+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 25372 "configure"
+#include "confdefs.h"
+#define initscr autoconf_temporary
+#include <limits.h> /* least-intrusive standard header which defines gcc2 __stub macros */
+#undef initscr
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char initscr (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_initscr) || defined (__stub___initscr)
+#error found stub for initscr
+#endif
+
+ return initscr ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:25403: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:25406: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:25409: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:25412: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_func_initscr=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_initscr=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:25422: result: $ac_cv_func_initscr" >&5
+echo "${ECHO_T}$ac_cv_func_initscr" >&6
+if test "$ac_cv_func_initscr" = yes; then
+ eval 'cf_cv_have_lib_'"$cf_nculib_root"'=yes'
+else
+
+ cf_save_LIBS="$LIBS"
+ echo "$as_me:25429: checking for initscr in -l$cf_nculib_root" >&5
+echo $ECHO_N "checking for initscr in -l$cf_nculib_root... $ECHO_C" >&6
+ LIBS="-l$cf_nculib_root $LIBS"
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 25433 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+initscr()
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:25445: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:25448: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:25451: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:25454: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ echo "$as_me:25456: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ eval 'cf_cv_have_lib_'"$cf_nculib_root"'=yes'
+
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+echo "$as_me:25463: result: no" >&5
+echo "${ECHO_T}no" >&6
+
+cf_search=
+cf_library_path_list=""
+if test -n "${LDFLAGS}${LIBS}" ; then
+ for cf_library_path in $LDFLAGS $LIBS
+ do
+ case "$cf_library_path" in
+ (-L*)
+ cf_library_path=`echo ".$cf_library_path" |sed -e 's/^...//' -e 's,/lib$,,'`
+
+test "x$cf_library_path" != "xNONE" && \
+test -d "$cf_library_path" && \
+ {
+ test -n "$verbose" && echo " ... testing for lib-directories under $cf_library_path"
+ test -d "$cf_library_path/lib" && cf_search="$cf_search $cf_library_path/lib"
+ test -d "$cf_library_path/lib/$cf_nculib_root" && cf_search="$cf_search $cf_library_path/lib/$cf_nculib_root"
+ test -d "$cf_library_path/lib/$cf_nculib_root/lib" && cf_search="$cf_search $cf_library_path/lib/$cf_nculib_root/lib"
+ test -d "$cf_library_path/$cf_nculib_root/lib" && cf_search="$cf_search $cf_library_path/$cf_nculib_root/lib"
+ test -d "$cf_library_path/$cf_nculib_root/lib/$cf_nculib_root" && cf_search="$cf_search $cf_library_path/$cf_nculib_root/lib/$cf_nculib_root"
+}
+
+ cf_library_path_list="$cf_library_path_list $cf_search"
+ ;;
+ esac
+ done
+fi
+
+cf_search=
+
+test "x$prefix" != "xNONE" && \
+test -d "$prefix" && \
+ {
+ test -n "$verbose" && echo " ... testing for lib-directories under $prefix"
+ test -d "$prefix/lib" && cf_search="$cf_search $prefix/lib"
+ test -d "$prefix/lib/$cf_nculib_root" && cf_search="$cf_search $prefix/lib/$cf_nculib_root"
+ test -d "$prefix/lib/$cf_nculib_root/lib" && cf_search="$cf_search $prefix/lib/$cf_nculib_root/lib"
+ test -d "$prefix/$cf_nculib_root/lib" && cf_search="$cf_search $prefix/$cf_nculib_root/lib"
+ test -d "$prefix/$cf_nculib_root/lib/$cf_nculib_root" && cf_search="$cf_search $prefix/$cf_nculib_root/lib/$cf_nculib_root"
+}
+
+for cf_subdir_prefix in \
+ /usr \
+ /usr/local \
+ /usr/pkg \
+ /opt \
+ /opt/local \
+ $HOME
+do
+
+test "x$cf_subdir_prefix" != "x$prefix" && \
+test -d "$cf_subdir_prefix" && \
+{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
+ test -n "$verbose" && echo " ... testing for lib-directories under $cf_subdir_prefix"
+ test -d "$cf_subdir_prefix/lib" && cf_search="$cf_search $cf_subdir_prefix/lib"
+ test -d "$cf_subdir_prefix/lib/$cf_nculib_root" && cf_search="$cf_search $cf_subdir_prefix/lib/$cf_nculib_root"
+ test -d "$cf_subdir_prefix/lib/$cf_nculib_root/lib" && cf_search="$cf_search $cf_subdir_prefix/lib/$cf_nculib_root/lib"
+ test -d "$cf_subdir_prefix/$cf_nculib_root/lib" && cf_search="$cf_search $cf_subdir_prefix/$cf_nculib_root/lib"
+ test -d "$cf_subdir_prefix/$cf_nculib_root/lib/$cf_nculib_root" && cf_search="$cf_search $cf_subdir_prefix/$cf_nculib_root/lib/$cf_nculib_root"
+}
+
+done
+
+cf_search="$cf_library_path_list $cf_search"
+
+ for cf_libdir in $cf_search
+ do
+ echo "$as_me:25531: checking for -l$cf_nculib_root in $cf_libdir" >&5
+echo $ECHO_N "checking for -l$cf_nculib_root in $cf_libdir... $ECHO_C" >&6
+ LIBS="-L$cf_libdir -l$cf_nculib_root $cf_save_LIBS"
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 25535 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+initscr()
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:25547: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:25550: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:25553: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:25556: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ echo "$as_me:25558: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ eval 'cf_cv_have_lib_'"$cf_nculib_root"'=yes'
+ break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+echo "$as_me:25565: result: no" >&5
+echo "${ECHO_T}no" >&6
+ LIBS="$cf_save_LIBS"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+ done
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+
+eval 'cf_found_library="$cf_cv_have_lib_'"$cf_nculib_root"\"
+
+if test "$cf_found_library" = no ; then
+ { { echo "$as_me:25580: error: Cannot link $cf_nculib_root library" >&5
+echo "$as_me: error: Cannot link $cf_nculib_root library" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+fi
+
+if test -n "$cf_ncurses_LIBS" ; then
+ echo "$as_me:25588: checking if we can link $cf_nculib_root without $cf_ncurses_LIBS" >&5
+echo $ECHO_N "checking if we can link $cf_nculib_root without $cf_ncurses_LIBS... $ECHO_C" >&6
+ cf_ncurses_SAVE="$LIBS"
+ for p in $cf_ncurses_LIBS ; do
+ q=`echo "$LIBS" | sed -e "s%$p %%" -e "s%$p$%%"`
+ if test "$q" != "$LIBS" ; then
+ LIBS="$q"
+ fi
+ done
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 25598 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+initscr(); mousemask(0,0); tigetstr((char *)0);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:25610: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:25613: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:25616: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:25619: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ echo "$as_me:25621: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+echo "$as_me:25626: result: no" >&5
+echo "${ECHO_T}no" >&6
+ LIBS="$cf_ncurses_SAVE"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+
+cf_nculib_ROOT=`echo "HAVE_LIB$cf_nculib_root" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+cat >>confdefs.h <<EOF
+#define $cf_nculib_ROOT 1
+EOF
+
+ fi
+else
+ NCURSES_CONFIG=none
+fi
+
+ cf_wide_curses=yes
+ ;;
+(ncurses*)
+
+cf_ncuconfig_root=$cf_cv_screen
+cf_have_ncuconfig=no
+
+if test "x${PKG_CONFIG:=none}" != xnone; then
+ echo "$as_me:25652: checking pkg-config for $cf_ncuconfig_root" >&5
+echo $ECHO_N "checking pkg-config for $cf_ncuconfig_root... $ECHO_C" >&6
+ if "$PKG_CONFIG" --exists $cf_ncuconfig_root ; then
+ echo "$as_me:25655: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+
+ echo "$as_me:25658: checking if the $cf_ncuconfig_root package files work" >&5
+echo $ECHO_N "checking if the $cf_ncuconfig_root package files work... $ECHO_C" >&6
+ cf_have_ncuconfig=unknown
+
+ cf_save_CFLAGS="$CFLAGS"
+ cf_save_CPPFLAGS="$CPPFLAGS"
+ cf_save_LIBS="$LIBS"
+
+ cf_pkg_cflags="`$PKG_CONFIG --cflags $cf_ncuconfig_root`"
+ cf_pkg_libs="`$PKG_CONFIG --libs $cf_ncuconfig_root`"
+
+ # while -W for passing linker flags is prevalent, it is not "standard".
+ # At least one wrapper for c89/c99 (in Apple's xcode) has its own
+ # incompatible _and_ non-standard -W option which gives an error. Work
+ # around that pitfall.
+ case "x${CC}@@${cf_pkg_libs}@${cf_pkg_cflags}" in
+ (x*c[89]9@@*-W*)
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_pkg_cflags
+do
+case "$cf_fix_cppflags" in
+(no)
+ case "$cf_add_cflags" in
+ (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=yes
+
+ if test "$cf_fix_cppflags" = yes ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ elif test "${cf_tst_cflags}" = "\"'" ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ fi
+ ;;
+ esac
+ case "$CPPFLAGS" in
+ (*$cf_add_cflags)
+ ;;
+ (*)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+ sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \
+ -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'`
+
+ ;;
+ esac
+
+ test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+ cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+ (*)
+
+ test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+ cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+(yes)
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=no
+ ;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+ test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+ CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+ test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+ EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_pkg_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 25791 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+initscr(); mousemask(0,0); tigetstr((char *)0);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:25803: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:25806: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:25809: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:25812: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ if test "$cross_compiling" = yes; then
+ cf_test_ncuconfig=maybe
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 25818 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+ int main(void)
+ { const char *xx = curses_version(); return (xx == 0); }
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:25825: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:25828: \$? = $ac_status" >&5
+ (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+ { (eval echo "$as_me:25830: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:25833: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_test_ncuconfig=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_test_ncuconfig=no
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_test_ncuconfig=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+ CFLAGS="$cf_save_CFLAGS"
+ CPPFLAGS="$cf_save_CPPFLAGS"
+ LIBS="$cf_save_LIBS"
+
+ if test "x$cf_test_ncuconfig" != xyes; then
+ cf_temp=`echo "x$cf_pkg_cflags" | sed -e s/^x// -e 's/-W[^ ]*//g'`
+ cf_pkg_cflags="$cf_temp"
+ cf_temp=`echo "x$cf_pkg_libs" | sed -e s/^x// -e 's/-W[^ ]*//g'`
+ cf_pkg_libs="$cf_temp"
+ fi
+ ;;
+ esac
+
+for cf_add_cflags in $cf_pkg_cflags
+do
+ case "x$cf_add_cflags" in
+ (x-[DU]*)
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+ cf_old_cflag=`echo "x$CFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+ test "$CFLAGS" != "$cf_old_cflag" || break
+
+ CFLAGS="$cf_old_cflag"
+done
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+ cf_old_cflag=`echo "x$CPPFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+ test "$CPPFLAGS" != "$cf_old_cflag" || break
+
+ CPPFLAGS="$cf_old_cflag"
+done
+
+ ;;
+ esac
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_add_cflags
+do
+case "$cf_fix_cppflags" in
+(no)
+ case "$cf_add_cflags" in
+ (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=yes
+
+ if test "$cf_fix_cppflags" = yes ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ elif test "${cf_tst_cflags}" = "\"'" ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ fi
+ ;;
+ esac
+ case "$CPPFLAGS" in
+ (*$cf_add_cflags)
+ ;;
+ (*)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+ sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \
+ -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'`
+
+ ;;
+ esac
+
+ test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+ cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+ (*)
+
+ test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+ cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+(yes)
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=no
+ ;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+ test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+ CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+ test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+ EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+done
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_pkg_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 26007 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+initscr(); mousemask(0,0); tigetstr((char *)0);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:26019: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:26022: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:26025: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:26028: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ if test "$cross_compiling" = yes; then
+ cf_have_ncuconfig=maybe
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 26034 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+ int main(void)
+ { const char *xx = curses_version(); return (xx == 0); }
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:26041: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:26044: \$? = $ac_status" >&5
+ (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+ { (eval echo "$as_me:26046: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:26049: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_have_ncuconfig=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_ncuconfig=no
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_ncuconfig=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+ echo "$as_me:26066: result: $cf_have_ncuconfig" >&5
+echo "${ECHO_T}$cf_have_ncuconfig" >&6
+ test "$cf_have_ncuconfig" = maybe && cf_have_ncuconfig=yes
+ if test "$cf_have_ncuconfig" != "yes"
+ then
+ CPPFLAGS="$cf_save_CPPFLAGS"
+ LIBS="$cf_save_LIBS"
+ NCURSES_CONFIG_PKG=none
+ else
+
+cat >>confdefs.h <<\EOF
+#define NCURSES 1
+EOF
+
+ NCURSES_CONFIG_PKG=$cf_ncuconfig_root
+
+echo "$as_me:26082: checking for terminfo header" >&5
+echo $ECHO_N "checking for terminfo header... $ECHO_C" >&6
+if test "${cf_cv_term_header+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+case "${cf_cv_ncurses_header}" in
+(*/ncurses.h|*/ncursesw.h)
+ cf_term_header=`echo "$cf_cv_ncurses_header" | sed -e 's%ncurses[^.]*\.h$%term.h%'`
+ ;;
+(*)
+ cf_term_header=term.h
+ ;;
+esac
+
+for cf_test in $cf_term_header "ncurses/term.h" "ncursesw/term.h"
+do
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 26100 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+#include <${cf_cv_ncurses_header:-curses.h}>
+#include <$cf_test>
+
+int
+main (void)
+{
+int x = auto_left_margin; (void)x
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:26115: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:26118: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:26121: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:26124: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ cf_cv_term_header="$cf_test"
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+ cf_cv_term_header=unknown
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ test "$cf_cv_term_header" != unknown && break
+done
+
+fi
+echo "$as_me:26140: result: $cf_cv_term_header" >&5
+echo "${ECHO_T}$cf_cv_term_header" >&6
+
+# Set definitions to allow ifdef'ing to accommodate subdirectories
+
+case "$cf_cv_term_header" in
+(*term.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_TERM_H 1
+EOF
+
+ ;;
+esac
+
+case "$cf_cv_term_header" in
+(ncurses/term.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSES_TERM_H 1
+EOF
+
+ ;;
+(ncursesw/term.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSESW_TERM_H 1
+EOF
+
+ ;;
+esac
+
+ fi
+
+ else
+ echo "$as_me:26175: result: no" >&5
+echo "${ECHO_T}no" >&6
+ NCURSES_CONFIG_PKG=none
+ fi
+else
+ NCURSES_CONFIG_PKG=none
+fi
+
+if test "x$cf_have_ncuconfig" = "xno"; then
+ cf_ncurses_config="${cf_ncuconfig_root}${NCURSES_CONFIG_SUFFIX}-config"; echo "Looking for ${cf_ncurses_config}"
+
+if test -n "$ac_tool_prefix"; then
+ for ac_prog in ${cf_ncurses_config} ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}5-config
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:26191: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_NCURSES_CONFIG+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$NCURSES_CONFIG"; then
+ ac_cv_prog_NCURSES_CONFIG="$NCURSES_CONFIG" # Let the user override the test.
+else
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_NCURSES_CONFIG="$ac_tool_prefix$ac_prog"
+echo "$as_me:26206: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+NCURSES_CONFIG=$ac_cv_prog_NCURSES_CONFIG
+if test -n "$NCURSES_CONFIG"; then
+ echo "$as_me:26214: result: $NCURSES_CONFIG" >&5
+echo "${ECHO_T}$NCURSES_CONFIG" >&6
+else
+ echo "$as_me:26217: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$NCURSES_CONFIG" && break
+ done
+fi
+if test -z "$NCURSES_CONFIG"; then
+ ac_ct_NCURSES_CONFIG=$NCURSES_CONFIG
+ for ac_prog in ${cf_ncurses_config} ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}5-config
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:26230: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_NCURSES_CONFIG+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_NCURSES_CONFIG"; then
+ ac_cv_prog_ac_ct_NCURSES_CONFIG="$ac_ct_NCURSES_CONFIG" # Let the user override the test.
+else
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_ac_ct_NCURSES_CONFIG="$ac_prog"
+echo "$as_me:26245: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+ac_ct_NCURSES_CONFIG=$ac_cv_prog_ac_ct_NCURSES_CONFIG
+if test -n "$ac_ct_NCURSES_CONFIG"; then
+ echo "$as_me:26253: result: $ac_ct_NCURSES_CONFIG" >&5
+echo "${ECHO_T}$ac_ct_NCURSES_CONFIG" >&6
+else
+ echo "$as_me:26256: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$ac_ct_NCURSES_CONFIG" && break
+done
+test -n "$ac_ct_NCURSES_CONFIG" || ac_ct_NCURSES_CONFIG="none"
+
+ NCURSES_CONFIG=$ac_ct_NCURSES_CONFIG
+fi
+
+ if test "$NCURSES_CONFIG" != none ; then
+
+for cf_add_cflags in `$NCURSES_CONFIG --cflags`
+do
+ case "x$cf_add_cflags" in
+ (x-[DU]*)
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+ cf_old_cflag=`echo "x$CFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+ test "$CFLAGS" != "$cf_old_cflag" || break
+
+ CFLAGS="$cf_old_cflag"
+done
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+ cf_old_cflag=`echo "x$CPPFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+ test "$CPPFLAGS" != "$cf_old_cflag" || break
+
+ CPPFLAGS="$cf_old_cflag"
+done
+
+ ;;
+ esac
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_add_cflags
+do
+case "$cf_fix_cppflags" in
+(no)
+ case "$cf_add_cflags" in
+ (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=yes
+
+ if test "$cf_fix_cppflags" = yes ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ elif test "${cf_tst_cflags}" = "\"'" ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ fi
+ ;;
+ esac
+ case "$CPPFLAGS" in
+ (*$cf_add_cflags)
+ ;;
+ (*)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+ sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \
+ -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'`
+
+ ;;
+ esac
+
+ test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+ cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+ (*)
+
+ test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+ cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+(yes)
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=no
+ ;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+ test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+ CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+ test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+ EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+done
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in `$NCURSES_CONFIG --libs`; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+ # even with config script, some packages use no-override for curses.h
+
+echo "$as_me:26413: checking if we have identified curses headers" >&5
+echo $ECHO_N "checking if we have identified curses headers... $ECHO_C" >&6
+if test "${cf_cv_ncurses_header+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cf_cv_ncurses_header=none
+for cf_header in \
+ ncurses.h $cf_cv_screen/ncurses.h \
+ curses.h $cf_cv_screen/curses.h
+do
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 26425 "configure"
+#include "confdefs.h"
+#include <${cf_header}>
+int
+main (void)
+{
+initscr(); endwin()
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:26437: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:26440: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:26443: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:26446: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_ncurses_header=$cf_header; break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+done
+
+fi
+echo "$as_me:26457: result: $cf_cv_ncurses_header" >&5
+echo "${ECHO_T}$cf_cv_ncurses_header" >&6
+
+if test "$cf_cv_ncurses_header" = none ; then
+ { { echo "$as_me:26461: error: No curses header-files found" >&5
+echo "$as_me: error: No curses header-files found" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+# cheat, to get the right #define's for HAVE_NCURSES_H, etc.
+
+for ac_header in $cf_cv_ncurses_header
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:26471: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 26477 "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:26481: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+ (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ $EGREP -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:26487: \$? = $ac_status" >&5
+ (exit "$ac_status"); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ eval "$as_ac_Header=yes"
+else
+ echo "$as_me: failed program was:" >&5
+ cat "conftest.$ac_ext" >&5
+ eval "$as_ac_Header=no"
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi
+echo "$as_me:26506: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
+if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
+ cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+cat >>confdefs.h <<\EOF
+#define NCURSES 1
+EOF
+
+cf_nculib_ROOT=`echo "HAVE_LIB$cf_ncuconfig_root" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+ cat >>confdefs.h <<EOF
+#define $cf_nculib_ROOT 1
+EOF
+
+ cf_cv_ncurses_version="`$NCURSES_CONFIG --version`"
+
+ else
+
+cf_ncuhdr_root=$cf_cv_screen
+
+test -n "$cf_cv_curses_dir" && \
+test "$cf_cv_curses_dir" != "no" && { \
+
+if test -n "$cf_cv_curses_dir/include/$cf_ncuhdr_root" ; then
+ for cf_add_incdir in $cf_cv_curses_dir/include/$cf_ncuhdr_root
+ do
+ while test "$cf_add_incdir" != /usr/include
+ do
+ if test -d "$cf_add_incdir"
+ then
+ cf_have_incdir=no
+ if test -n "$CFLAGS$CPPFLAGS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+ if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+ cf_have_incdir=yes; break
+ fi
+ done
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ if test "$cf_add_incdir" = /usr/local/include ; then
+ if test "$GCC" = yes
+ then
+ cf_save_CPPFLAGS=$CPPFLAGS
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 26562 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:26574: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:26577: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:26580: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:26583: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ CPPFLAGS=$cf_save_CPPFLAGS
+ fi
+ fi
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:26600: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+ CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+ cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+ test "$cf_top_incdir" = "$cf_add_incdir" && break
+ cf_add_incdir="$cf_top_incdir"
+ else
+ break
+ fi
+ else
+ break
+ fi
+ done
+ done
+fi
+
+}
+
+echo "$as_me:26619: checking for $cf_ncuhdr_root header in include-path" >&5
+echo $ECHO_N "checking for $cf_ncuhdr_root header in include-path... $ECHO_C" >&6
+if test "${cf_cv_ncurses_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cf_header_list="$cf_ncuhdr_root/curses.h $cf_ncuhdr_root/ncurses.h"
+ { test "$cf_ncuhdr_root" = ncurses || test "$cf_ncuhdr_root" = ncursesw; } && cf_header_list="$cf_header_list curses.h ncurses.h"
+ for cf_header in $cf_header_list
+ do
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 26631 "configure"
+#include "confdefs.h"
+
+#include <$cf_header>
+int
+main (void)
+{
+
+#ifdef NCURSES_VERSION
+
+printf("%s\\n", NCURSES_VERSION);
+#else
+#ifdef __NCURSES_H
+printf("old\\n");
+#else
+ make an error
+#endif
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:26655: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:26658: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:26661: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:26664: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_ncurses_h=$cf_header
+
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_ncurses_h=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+ test "$cf_cv_ncurses_h" != no && break
+ done
+
+fi
+echo "$as_me:26679: result: $cf_cv_ncurses_h" >&5
+echo "${ECHO_T}$cf_cv_ncurses_h" >&6
+
+if test "$cf_cv_ncurses_h" != no ; then
+ cf_cv_ncurses_header=$cf_cv_ncurses_h
+else
+
+echo "$as_me:26686: checking for $cf_ncuhdr_root include-path" >&5
+echo $ECHO_N "checking for $cf_ncuhdr_root include-path... $ECHO_C" >&6
+if test "${cf_cv_ncurses_h2+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ test -n "$verbose" && echo
+
+cf_search=
+
+# collect the current set of include-directories from compiler flags
+cf_header_path_list=""
+if test -n "${CFLAGS}${CPPFLAGS}" ; then
+ for cf_header_path in $CPPFLAGS $CFLAGS
+ do
+ case "$cf_header_path" in
+ (-I*)
+ cf_header_path=`echo ".$cf_header_path" |sed -e 's/^...//' -e 's,/include$,,'`
+
+test "x$cf_header_path" != "xNONE" && \
+test -d "$cf_header_path" && \
+ {
+ test -n "$verbose" && echo " ... testing for include-directories under $cf_header_path"
+ test -d "$cf_header_path/include" && cf_search="$cf_search $cf_header_path/include"
+ test -d "$cf_header_path/include/$cf_ncuhdr_root" && cf_search="$cf_search $cf_header_path/include/$cf_ncuhdr_root"
+ test -d "$cf_header_path/include/$cf_ncuhdr_root/include" && cf_search="$cf_search $cf_header_path/include/$cf_ncuhdr_root/include"
+ test -d "$cf_header_path/$cf_ncuhdr_root/include" && cf_search="$cf_search $cf_header_path/$cf_ncuhdr_root/include"
+ test -d "$cf_header_path/$cf_ncuhdr_root/include/$cf_ncuhdr_root" && cf_search="$cf_search $cf_header_path/$cf_ncuhdr_root/include/$cf_ncuhdr_root"
+}
+
+ cf_header_path_list="$cf_header_path_list $cf_search"
+ ;;
+ esac
+ done
+fi
+
+# add the variations for the package we are looking for
+
+cf_search=
+
+test "x$prefix" != "xNONE" && \
+test -d "$prefix" && \
+ {
+ test -n "$verbose" && echo " ... testing for include-directories under $prefix"
+ test -d "$prefix/include" && cf_search="$cf_search $prefix/include"
+ test -d "$prefix/include/$cf_ncuhdr_root" && cf_search="$cf_search $prefix/include/$cf_ncuhdr_root"
+ test -d "$prefix/include/$cf_ncuhdr_root/include" && cf_search="$cf_search $prefix/include/$cf_ncuhdr_root/include"
+ test -d "$prefix/$cf_ncuhdr_root/include" && cf_search="$cf_search $prefix/$cf_ncuhdr_root/include"
+ test -d "$prefix/$cf_ncuhdr_root/include/$cf_ncuhdr_root" && cf_search="$cf_search $prefix/$cf_ncuhdr_root/include/$cf_ncuhdr_root"
+}
+
+for cf_subdir_prefix in \
+ /usr \
+ /usr/local \
+ /usr/pkg \
+ /opt \
+ /opt/local \
+ $HOME
+do
+
+test "x$cf_subdir_prefix" != "x$prefix" && \
+test -d "$cf_subdir_prefix" && \
+{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
+ test -n "$verbose" && echo " ... testing for include-directories under $cf_subdir_prefix"
+ test -d "$cf_subdir_prefix/include" && cf_search="$cf_search $cf_subdir_prefix/include"
+ test -d "$cf_subdir_prefix/include/$cf_ncuhdr_root" && cf_search="$cf_search $cf_subdir_prefix/include/$cf_ncuhdr_root"
+ test -d "$cf_subdir_prefix/include/$cf_ncuhdr_root/include" && cf_search="$cf_search $cf_subdir_prefix/include/$cf_ncuhdr_root/include"
+ test -d "$cf_subdir_prefix/$cf_ncuhdr_root/include" && cf_search="$cf_search $cf_subdir_prefix/$cf_ncuhdr_root/include"
+ test -d "$cf_subdir_prefix/$cf_ncuhdr_root/include/$cf_ncuhdr_root" && cf_search="$cf_search $cf_subdir_prefix/$cf_ncuhdr_root/include/$cf_ncuhdr_root"
+}
+
+done
+
+test "$includedir" != NONE && \
+test "$includedir" != "/usr/include" && \
+test -d "$includedir" && {
+ test -d "$includedir" && cf_search="$cf_search $includedir"
+ test -d "$includedir/$cf_ncuhdr_root" && cf_search="$cf_search $includedir/$cf_ncuhdr_root"
+}
+
+test "$oldincludedir" != NONE && \
+test "$oldincludedir" != "/usr/include" && \
+test -d "$oldincludedir" && {
+ test -d "$oldincludedir" && cf_search="$cf_search $oldincludedir"
+ test -d "$oldincludedir/$cf_ncuhdr_root" && cf_search="$cf_search $oldincludedir/$cf_ncuhdr_root"
+}
+
+cf_search="$cf_search $cf_header_path_list"
+
+ test -n "$verbose" && echo "search path $cf_search"
+ cf_save2_CPPFLAGS="$CPPFLAGS"
+ for cf_incdir in $cf_search
+ do
+
+if test -n "$cf_incdir" ; then
+ for cf_add_incdir in $cf_incdir
+ do
+ while test "$cf_add_incdir" != /usr/include
+ do
+ if test -d "$cf_add_incdir"
+ then
+ cf_have_incdir=no
+ if test -n "$CFLAGS$CPPFLAGS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+ if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+ cf_have_incdir=yes; break
+ fi
+ done
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ if test "$cf_add_incdir" = /usr/local/include ; then
+ if test "$GCC" = yes
+ then
+ cf_save_CPPFLAGS=$CPPFLAGS
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 26807 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:26819: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:26822: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:26825: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:26828: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ CPPFLAGS=$cf_save_CPPFLAGS
+ fi
+ fi
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:26845: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+ CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+ cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+ test "$cf_top_incdir" = "$cf_add_incdir" && break
+ cf_add_incdir="$cf_top_incdir"
+ else
+ break
+ fi
+ else
+ break
+ fi
+ done
+ done
+fi
+
+ for cf_header in \
+ ncurses.h \
+ curses.h
+ do
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 26868 "configure"
+#include "confdefs.h"
+
+#include <$cf_header>
+int
+main (void)
+{
+
+#ifdef NCURSES_VERSION
+
+printf("%s\\n", NCURSES_VERSION);
+#else
+#ifdef __NCURSES_H
+printf("old\\n");
+#else
+ make an error
+#endif
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:26892: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:26895: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:26898: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:26901: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_ncurses_h2=$cf_header
+
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_ncurses_h2=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+ if test "$cf_cv_ncurses_h2" != no ; then
+ cf_cv_ncurses_h2=$cf_incdir/$cf_header
+ test -n "$verbose" && echo $ECHO_N " ... found $ECHO_C" 1>&6
+ break
+ fi
+ test -n "$verbose" && echo " ... tested $cf_incdir/$cf_header" 1>&6
+ done
+ CPPFLAGS="$cf_save2_CPPFLAGS"
+ test "$cf_cv_ncurses_h2" != no && break
+ done
+ test "$cf_cv_ncurses_h2" = no && { { echo "$as_me:26922: error: not found" >&5
+echo "$as_me: error: not found" >&2;}
+ { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:26927: result: $cf_cv_ncurses_h2" >&5
+echo "${ECHO_T}$cf_cv_ncurses_h2" >&6
+
+ cf_1st_incdir=`echo "$cf_cv_ncurses_h2" | sed -e 's%/[^/]*$%%'`
+ cf_cv_ncurses_header="`basename "$cf_cv_ncurses_h2"`"
+ if test "`basename "$cf_1st_incdir"`" = "$cf_ncuhdr_root" ; then
+ cf_cv_ncurses_header="$cf_ncuhdr_root/$cf_cv_ncurses_header"
+ fi
+
+if test -n "$cf_1st_incdir" ; then
+ for cf_add_incdir in $cf_1st_incdir
+ do
+ while test "$cf_add_incdir" != /usr/include
+ do
+ if test -d "$cf_add_incdir"
+ then
+ cf_have_incdir=no
+ if test -n "$CFLAGS$CPPFLAGS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+ if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+ cf_have_incdir=yes; break
+ fi
+ done
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ if test "$cf_add_incdir" = /usr/local/include ; then
+ if test "$GCC" = yes
+ then
+ cf_save_CPPFLAGS=$CPPFLAGS
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 26963 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:26975: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:26978: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:26981: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:26984: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ CPPFLAGS=$cf_save_CPPFLAGS
+ fi
+ fi
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:27001: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+ CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+ cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+ test "$cf_top_incdir" = "$cf_add_incdir" && break
+ cf_add_incdir="$cf_top_incdir"
+ else
+ break
+ fi
+ else
+ break
+ fi
+ done
+ done
+fi
+
+fi
+
+# Set definitions to allow ifdef'ing for ncurses.h
+
+case "$cf_cv_ncurses_header" in
+(*ncurses.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSES_H 1
+EOF
+
+ ;;
+esac
+
+case "$cf_cv_ncurses_header" in
+(ncurses/curses.h|ncurses/ncurses.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSES_NCURSES_H 1
+EOF
+
+ ;;
+(ncursesw/curses.h|ncursesw/ncurses.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSESW_NCURSES_H 1
+EOF
+
+ ;;
+esac
+
+echo "$as_me:27049: checking for terminfo header" >&5
+echo $ECHO_N "checking for terminfo header... $ECHO_C" >&6
+if test "${cf_cv_term_header+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+case "${cf_cv_ncurses_header}" in
+(*/ncurses.h|*/ncursesw.h)
+ cf_term_header=`echo "$cf_cv_ncurses_header" | sed -e 's%ncurses[^.]*\.h$%term.h%'`
+ ;;
+(*)
+ cf_term_header=term.h
+ ;;
+esac
+
+for cf_test in $cf_term_header "ncurses/term.h" "ncursesw/term.h"
+do
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 27067 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+#include <${cf_cv_ncurses_header:-curses.h}>
+#include <$cf_test>
+
+int
+main (void)
+{
+int x = auto_left_margin; (void)x
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:27082: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:27085: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:27088: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:27091: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ cf_cv_term_header="$cf_test"
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+ cf_cv_term_header=unknown
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ test "$cf_cv_term_header" != unknown && break
+done
+
+fi
+echo "$as_me:27107: result: $cf_cv_term_header" >&5
+echo "${ECHO_T}$cf_cv_term_header" >&6
+
+# Set definitions to allow ifdef'ing to accommodate subdirectories
+
+case "$cf_cv_term_header" in
+(*term.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_TERM_H 1
+EOF
+
+ ;;
+esac
+
+case "$cf_cv_term_header" in
+(ncurses/term.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSES_TERM_H 1
+EOF
+
+ ;;
+(ncursesw/term.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSESW_TERM_H 1
+EOF
+
+ ;;
+esac
+
+# some applications need this, but should check for NCURSES_VERSION
+
+cat >>confdefs.h <<\EOF
+#define NCURSES 1
+EOF
+
+echo "$as_me:27145: checking for ncurses version" >&5
+echo $ECHO_N "checking for ncurses version... $ECHO_C" >&6
+if test "${cf_cv_ncurses_version+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cf_cv_ncurses_version=no
+ cf_tempfile=out$$
+ rm -f "$cf_tempfile"
+ if test "$cross_compiling" = yes; then
+
+ # This will not work if the preprocessor splits the line after the
+ # Autoconf token. The 'unproto' program does that.
+ cat > "conftest.$ac_ext" <<EOF
+#include <${cf_cv_ncurses_header:-curses.h}>
+#undef Autoconf
+#ifdef NCURSES_VERSION
+Autoconf NCURSES_VERSION
+#else
+#ifdef __NCURSES_H
+Autoconf "old"
+#endif
+;
+#endif
+EOF
+ cf_try="$ac_cpp conftest.$ac_ext 2>&5 | grep '^Autoconf ' >conftest.out"
+ { (eval echo "$as_me:27171: \"$cf_try\"") >&5
+ (eval $cf_try) 2>&5
+ ac_status=$?
+ echo "$as_me:27174: \$? = $ac_status" >&5
+ (exit "$ac_status"); }
+ if test -f conftest.out ; then
+ cf_out=`sed -e 's%^Autoconf %%' -e 's%^[^"]*"%%' -e 's%".*%%' conftest.out`
+ test -n "$cf_out" && cf_cv_ncurses_version="$cf_out"
+ rm -f conftest.out
+ fi
+
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 27184 "configure"
+#include "confdefs.h"
+
+$ac_includes_default
+
+#include <${cf_cv_ncurses_header:-curses.h}>
+
+int main(void)
+{
+ FILE *fp = fopen("$cf_tempfile", "w");
+#ifdef NCURSES_VERSION
+# ifdef NCURSES_VERSION_PATCH
+ fprintf(fp, "%s.%d\\n", NCURSES_VERSION, NCURSES_VERSION_PATCH);
+# else
+ fprintf(fp, "%s\\n", NCURSES_VERSION);
+# endif
+#else
+# ifdef __NCURSES_H
+ fprintf(fp, "old\\n");
+# else
+ make an error
+# endif
+#endif
+ ${cf_cv_main_return:-return}(0);
+}
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:27211: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:27214: \$? = $ac_status" >&5
+ (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+ { (eval echo "$as_me:27216: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:27219: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ cf_cv_ncurses_version=`cat $cf_tempfile`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+ rm -f "$cf_tempfile"
+
+fi
+echo "$as_me:27233: result: $cf_cv_ncurses_version" >&5
+echo "${ECHO_T}$cf_cv_ncurses_version" >&6
+test "$cf_cv_ncurses_version" = no ||
+cat >>confdefs.h <<\EOF
+#define NCURSES 1
+EOF
+
+cf_nculib_root=$cf_cv_screen
+ # This works, except for the special case where we find gpm, but
+ # ncurses is in a nonstandard location via $LIBS, and we really want
+ # to link gpm.
+cf_ncurses_LIBS=""
+cf_ncurses_SAVE="$LIBS"
+echo "$as_me:27246: checking for Gpm_Open in -lgpm" >&5
+echo $ECHO_N "checking for Gpm_Open in -lgpm... $ECHO_C" >&6
+if test "${ac_cv_lib_gpm_Gpm_Open+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lgpm $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 27254 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char Gpm_Open ();
+int
+main (void)
+{
+Gpm_Open ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:27273: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:27276: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:27279: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:27282: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_lib_gpm_Gpm_Open=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_gpm_Gpm_Open=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:27293: result: $ac_cv_lib_gpm_Gpm_Open" >&5
+echo "${ECHO_T}$ac_cv_lib_gpm_Gpm_Open" >&6
+if test "$ac_cv_lib_gpm_Gpm_Open" = yes; then
+ echo "$as_me:27296: checking for initscr in -lgpm" >&5
+echo $ECHO_N "checking for initscr in -lgpm... $ECHO_C" >&6
+if test "${ac_cv_lib_gpm_initscr+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lgpm $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 27304 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char initscr ();
+int
+main (void)
+{
+initscr ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:27323: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:27326: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:27329: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:27332: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_lib_gpm_initscr=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_gpm_initscr=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:27343: result: $ac_cv_lib_gpm_initscr" >&5
+echo "${ECHO_T}$ac_cv_lib_gpm_initscr" >&6
+if test "$ac_cv_lib_gpm_initscr" = yes; then
+ LIBS="$cf_ncurses_SAVE"
+else
+ cf_ncurses_LIBS="-lgpm"
+fi
+
+fi
+
+case "$host_os" in
+(freebsd*)
+ # This is only necessary if you are linking against an obsolete
+ # version of ncurses (but it should do no harm, since it is static).
+ if test "$cf_nculib_root" = ncurses ; then
+ echo "$as_me:27358: checking for tgoto in -lmytinfo" >&5
+echo $ECHO_N "checking for tgoto in -lmytinfo... $ECHO_C" >&6
+if test "${ac_cv_lib_mytinfo_tgoto+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lmytinfo $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 27366 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char tgoto ();
+int
+main (void)
+{
+tgoto ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:27385: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:27388: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:27391: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:27394: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_lib_mytinfo_tgoto=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_mytinfo_tgoto=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:27405: result: $ac_cv_lib_mytinfo_tgoto" >&5
+echo "${ECHO_T}$ac_cv_lib_mytinfo_tgoto" >&6
+if test "$ac_cv_lib_mytinfo_tgoto" = yes; then
+ cf_ncurses_LIBS="-lmytinfo $cf_ncurses_LIBS"
+fi
+
+ fi
+ ;;
+esac
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_ncurses_LIBS; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+if test -n "$cf_cv_curses_dir" && test "$cf_cv_curses_dir" != "no"
+then
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -l$cf_nculib_root; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+else
+
+ eval 'cf_cv_have_lib_'"$cf_nculib_root"'=no'
+ cf_libdir=""
+ echo "$as_me:27454: checking for initscr" >&5
+echo $ECHO_N "checking for initscr... $ECHO_C" >&6
+if test "${ac_cv_func_initscr+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 27460 "configure"
+#include "confdefs.h"
+#define initscr autoconf_temporary
+#include <limits.h> /* least-intrusive standard header which defines gcc2 __stub macros */
+#undef initscr
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char initscr (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_initscr) || defined (__stub___initscr)
+#error found stub for initscr
+#endif
+
+ return initscr ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:27491: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:27494: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:27497: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:27500: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_func_initscr=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_initscr=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:27510: result: $ac_cv_func_initscr" >&5
+echo "${ECHO_T}$ac_cv_func_initscr" >&6
+if test "$ac_cv_func_initscr" = yes; then
+ eval 'cf_cv_have_lib_'"$cf_nculib_root"'=yes'
+else
+
+ cf_save_LIBS="$LIBS"
+ echo "$as_me:27517: checking for initscr in -l$cf_nculib_root" >&5
+echo $ECHO_N "checking for initscr in -l$cf_nculib_root... $ECHO_C" >&6
+ LIBS="-l$cf_nculib_root $LIBS"
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 27521 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+initscr()
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:27533: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:27536: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:27539: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:27542: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ echo "$as_me:27544: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ eval 'cf_cv_have_lib_'"$cf_nculib_root"'=yes'
+
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+echo "$as_me:27551: result: no" >&5
+echo "${ECHO_T}no" >&6
+
+cf_search=
+cf_library_path_list=""
+if test -n "${LDFLAGS}${LIBS}" ; then
+ for cf_library_path in $LDFLAGS $LIBS
+ do
+ case "$cf_library_path" in
+ (-L*)
+ cf_library_path=`echo ".$cf_library_path" |sed -e 's/^...//' -e 's,/lib$,,'`
+
+test "x$cf_library_path" != "xNONE" && \
+test -d "$cf_library_path" && \
+ {
+ test -n "$verbose" && echo " ... testing for lib-directories under $cf_library_path"
+ test -d "$cf_library_path/lib" && cf_search="$cf_search $cf_library_path/lib"
+ test -d "$cf_library_path/lib/$cf_nculib_root" && cf_search="$cf_search $cf_library_path/lib/$cf_nculib_root"
+ test -d "$cf_library_path/lib/$cf_nculib_root/lib" && cf_search="$cf_search $cf_library_path/lib/$cf_nculib_root/lib"
+ test -d "$cf_library_path/$cf_nculib_root/lib" && cf_search="$cf_search $cf_library_path/$cf_nculib_root/lib"
+ test -d "$cf_library_path/$cf_nculib_root/lib/$cf_nculib_root" && cf_search="$cf_search $cf_library_path/$cf_nculib_root/lib/$cf_nculib_root"
+}
+
+ cf_library_path_list="$cf_library_path_list $cf_search"
+ ;;
+ esac
+ done
+fi
+
+cf_search=
+
+test "x$prefix" != "xNONE" && \
+test -d "$prefix" && \
+ {
+ test -n "$verbose" && echo " ... testing for lib-directories under $prefix"
+ test -d "$prefix/lib" && cf_search="$cf_search $prefix/lib"
+ test -d "$prefix/lib/$cf_nculib_root" && cf_search="$cf_search $prefix/lib/$cf_nculib_root"
+ test -d "$prefix/lib/$cf_nculib_root/lib" && cf_search="$cf_search $prefix/lib/$cf_nculib_root/lib"
+ test -d "$prefix/$cf_nculib_root/lib" && cf_search="$cf_search $prefix/$cf_nculib_root/lib"
+ test -d "$prefix/$cf_nculib_root/lib/$cf_nculib_root" && cf_search="$cf_search $prefix/$cf_nculib_root/lib/$cf_nculib_root"
+}
+
+for cf_subdir_prefix in \
+ /usr \
+ /usr/local \
+ /usr/pkg \
+ /opt \
+ /opt/local \
+ $HOME
+do
+
+test "x$cf_subdir_prefix" != "x$prefix" && \
+test -d "$cf_subdir_prefix" && \
+{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
+ test -n "$verbose" && echo " ... testing for lib-directories under $cf_subdir_prefix"
+ test -d "$cf_subdir_prefix/lib" && cf_search="$cf_search $cf_subdir_prefix/lib"
+ test -d "$cf_subdir_prefix/lib/$cf_nculib_root" && cf_search="$cf_search $cf_subdir_prefix/lib/$cf_nculib_root"
+ test -d "$cf_subdir_prefix/lib/$cf_nculib_root/lib" && cf_search="$cf_search $cf_subdir_prefix/lib/$cf_nculib_root/lib"
+ test -d "$cf_subdir_prefix/$cf_nculib_root/lib" && cf_search="$cf_search $cf_subdir_prefix/$cf_nculib_root/lib"
+ test -d "$cf_subdir_prefix/$cf_nculib_root/lib/$cf_nculib_root" && cf_search="$cf_search $cf_subdir_prefix/$cf_nculib_root/lib/$cf_nculib_root"
+}
+
+done
+
+cf_search="$cf_library_path_list $cf_search"
+
+ for cf_libdir in $cf_search
+ do
+ echo "$as_me:27619: checking for -l$cf_nculib_root in $cf_libdir" >&5
+echo $ECHO_N "checking for -l$cf_nculib_root in $cf_libdir... $ECHO_C" >&6
+ LIBS="-L$cf_libdir -l$cf_nculib_root $cf_save_LIBS"
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 27623 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+initscr()
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:27635: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:27638: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:27641: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:27644: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ echo "$as_me:27646: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ eval 'cf_cv_have_lib_'"$cf_nculib_root"'=yes'
+ break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+echo "$as_me:27653: result: no" >&5
+echo "${ECHO_T}no" >&6
+ LIBS="$cf_save_LIBS"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+ done
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+
+eval 'cf_found_library="$cf_cv_have_lib_'"$cf_nculib_root"\"
+
+if test "$cf_found_library" = no ; then
+ { { echo "$as_me:27668: error: Cannot link $cf_nculib_root library" >&5
+echo "$as_me: error: Cannot link $cf_nculib_root library" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+fi
+
+if test -n "$cf_ncurses_LIBS" ; then
+ echo "$as_me:27676: checking if we can link $cf_nculib_root without $cf_ncurses_LIBS" >&5
+echo $ECHO_N "checking if we can link $cf_nculib_root without $cf_ncurses_LIBS... $ECHO_C" >&6
+ cf_ncurses_SAVE="$LIBS"
+ for p in $cf_ncurses_LIBS ; do
+ q=`echo "$LIBS" | sed -e "s%$p %%" -e "s%$p$%%"`
+ if test "$q" != "$LIBS" ; then
+ LIBS="$q"
+ fi
+ done
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 27686 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+initscr(); mousemask(0,0); tigetstr((char *)0);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:27698: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:27701: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:27704: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:27707: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ echo "$as_me:27709: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+echo "$as_me:27714: result: no" >&5
+echo "${ECHO_T}no" >&6
+ LIBS="$cf_ncurses_SAVE"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+
+cf_nculib_ROOT=`echo "HAVE_LIB$cf_nculib_root" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+cat >>confdefs.h <<EOF
+#define $cf_nculib_ROOT 1
+EOF
+
+ fi
+else
+ NCURSES_CONFIG=none
+fi
+
+ ;;
+(pdcurses)
+ case "$host_os" in
+ (mingw*)
+ cf_cv_ncurses_header=curses.h
+ ;;
+ (*)
+ cf_cv_ncurses_header=xcurses.h
+ # do this last, since it changes definition of main: CF_PDCURSES_X11
+ ;;
+ esac
+ ;;
+(slang)
+
+echo "$as_me:27746: checking for slang header file" >&5
+echo $ECHO_N "checking for slang header file... $ECHO_C" >&6
+if test "${cf_cv_slang_header+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cf_cv_slang_header=no
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 27754 "configure"
+#include "confdefs.h"
+#include <slang.h>
+int
+main (void)
+{
+printf("%s\\n", SLANG_VERSION)
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:27766: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:27769: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:27772: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:27775: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_slang_header=predefined
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+cf_search=
+
+# collect the current set of include-directories from compiler flags
+cf_header_path_list=""
+if test -n "${CFLAGS}${CPPFLAGS}" ; then
+ for cf_header_path in $CPPFLAGS $CFLAGS
+ do
+ case "$cf_header_path" in
+ (-I*)
+ cf_header_path=`echo ".$cf_header_path" |sed -e 's/^...//' -e 's,/include$,,'`
+
+test "x$cf_header_path" != "xNONE" && \
+test -d "$cf_header_path" && \
+ {
+ test -n "$verbose" && echo " ... testing for include-directories under $cf_header_path"
+ test -d "$cf_header_path/include" && cf_search="$cf_search $cf_header_path/include"
+ test -d "$cf_header_path/include/slang" && cf_search="$cf_search $cf_header_path/include/slang"
+ test -d "$cf_header_path/include/slang/include" && cf_search="$cf_search $cf_header_path/include/slang/include"
+ test -d "$cf_header_path/slang/include" && cf_search="$cf_search $cf_header_path/slang/include"
+ test -d "$cf_header_path/slang/include/slang" && cf_search="$cf_search $cf_header_path/slang/include/slang"
+}
+
+ cf_header_path_list="$cf_header_path_list $cf_search"
+ ;;
+ esac
+ done
+fi
+
+# add the variations for the package we are looking for
+
+cf_search=
+
+test "x$prefix" != "xNONE" && \
+test -d "$prefix" && \
+ {
+ test -n "$verbose" && echo " ... testing for include-directories under $prefix"
+ test -d "$prefix/include" && cf_search="$cf_search $prefix/include"
+ test -d "$prefix/include/slang" && cf_search="$cf_search $prefix/include/slang"
+ test -d "$prefix/include/slang/include" && cf_search="$cf_search $prefix/include/slang/include"
+ test -d "$prefix/slang/include" && cf_search="$cf_search $prefix/slang/include"
+ test -d "$prefix/slang/include/slang" && cf_search="$cf_search $prefix/slang/include/slang"
+}
+
+for cf_subdir_prefix in \
+ /usr \
+ /usr/local \
+ /usr/pkg \
+ /opt \
+ /opt/local \
+ $HOME
+do
+
+test "x$cf_subdir_prefix" != "x$prefix" && \
+test -d "$cf_subdir_prefix" && \
+{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
+ test -n "$verbose" && echo " ... testing for include-directories under $cf_subdir_prefix"
+ test -d "$cf_subdir_prefix/include" && cf_search="$cf_search $cf_subdir_prefix/include"
+ test -d "$cf_subdir_prefix/include/slang" && cf_search="$cf_search $cf_subdir_prefix/include/slang"
+ test -d "$cf_subdir_prefix/include/slang/include" && cf_search="$cf_search $cf_subdir_prefix/include/slang/include"
+ test -d "$cf_subdir_prefix/slang/include" && cf_search="$cf_search $cf_subdir_prefix/slang/include"
+ test -d "$cf_subdir_prefix/slang/include/slang" && cf_search="$cf_search $cf_subdir_prefix/slang/include/slang"
+}
+
+done
+
+test "$includedir" != NONE && \
+test "$includedir" != "/usr/include" && \
+test -d "$includedir" && {
+ test -d "$includedir" && cf_search="$cf_search $includedir"
+ test -d "$includedir/slang" && cf_search="$cf_search $includedir/slang"
+}
+
+test "$oldincludedir" != NONE && \
+test "$oldincludedir" != "/usr/include" && \
+test -d "$oldincludedir" && {
+ test -d "$oldincludedir" && cf_search="$cf_search $oldincludedir"
+ test -d "$oldincludedir/slang" && cf_search="$cf_search $oldincludedir/slang"
+}
+
+cf_search="$cf_search $cf_header_path_list"
+
+ for cf_incdir in $cf_search
+ do
+ for cf_header in \
+ slang.h
+ do
+ echo trying "$cf_incdir/$cf_header" 1>&5
+ if ${EGREP-egrep} "SLANG_VERSION" "$cf_incdir/$cf_header" 1>&5 2>&1; then
+ cf_cv_slang_header=$cf_incdir/$cf_header
+ break
+ fi
+ done
+ test "$cf_cv_slang_header" != no && break
+ done
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:27880: result: $cf_cv_slang_header" >&5
+echo "${ECHO_T}$cf_cv_slang_header" >&6
+
+if test "x$cf_cv_slang_header" != xno
+then
+
+cat >>confdefs.h <<\EOF
+#define USE_SLANG 1
+EOF
+
+ cf_incdir=`echo "$cf_cv_slang_header" | sed -e 's%/[^/]*$%%'`
+
+ case "$cf_cv_slang_header" in
+ (predefined)
+ ;;
+ (*)
+
+if test -n "$cf_incdir" ; then
+ for cf_add_incdir in $cf_incdir
+ do
+ while test "$cf_add_incdir" != /usr/include
+ do
+ if test -d "$cf_add_incdir"
+ then
+ cf_have_incdir=no
+ if test -n "$CFLAGS$CPPFLAGS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+ if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+ cf_have_incdir=yes; break
+ fi
+ done
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ if test "$cf_add_incdir" = /usr/local/include ; then
+ if test "$GCC" = yes
+ then
+ cf_save_CPPFLAGS=$CPPFLAGS
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 27924 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:27936: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:27939: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:27942: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:27945: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ CPPFLAGS=$cf_save_CPPFLAGS
+ fi
+ fi
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:27962: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+ CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+ cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+ test "$cf_top_incdir" = "$cf_add_incdir" && break
+ cf_add_incdir="$cf_top_incdir"
+ else
+ break
+ fi
+ else
+ break
+ fi
+ done
+ done
+fi
+
+ ;;
+ esac
+fi
+
+if test "x$cf_cv_slang_header" != xno
+then
+
+cf_slang_LIBS1="$LIBS"
+
+if test "${cf_cv_termlib+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cf_cv_termlib=none
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 27994 "configure"
+#include "confdefs.h"
+extern char *tgoto(const char*,int,int);
+int
+main (void)
+{
+char *x=tgoto("",0,0); (void)x;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:28006: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:28009: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:28012: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:28015: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 28018 "configure"
+#include "confdefs.h"
+extern char *tigetstr(const char *);
+int
+main (void)
+{
+char *x=tigetstr(""); (void)x;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:28030: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:28033: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:28036: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:28039: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_termlib=terminfo
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_termlib=termcap
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+ test -n "$verbose" && echo " using functions in predefined $cf_cv_termlib LIBS" 1>&6
+
+echo "${as_me:-configure}:28050: testing using functions in predefined $cf_cv_termlib LIBS ..." 1>&5
+
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+if test "$cf_cv_termlib" = none; then
+ # FreeBSD's linker gives bogus results for AC_CHECK_LIB, saying that
+ # tgetstr lives in -lcurses when it is only an unsatisfied extern.
+ cf_save_LIBS="$LIBS"
+ for cf_lib in tinfo curses ncurses termlib termcap
+ do
+ LIBS="-l$cf_lib $cf_save_LIBS"
+ for cf_func in tigetstr tgetstr
+ do
+ echo "$as_me:28065: checking for $cf_func in -l$cf_lib" >&5
+echo $ECHO_N "checking for $cf_func in -l$cf_lib... $ECHO_C" >&6
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 28068 "configure"
+#include "confdefs.h"
+extern char *$cf_func(const char *);
+int
+main (void)
+{
+int x=$cf_func(""); (void)x
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:28080: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:28083: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:28086: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:28089: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_result=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_result=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+ echo "$as_me:28098: result: $cf_result" >&5
+echo "${ECHO_T}$cf_result" >&6
+ if test "$cf_result" = yes ; then
+ if test "$cf_func" = tigetstr ; then
+ cf_cv_termlib=terminfo
+ else
+ cf_cv_termlib=termcap
+ fi
+ break
+ fi
+ done
+ test "$cf_result" = yes && break
+ done
+ test "$cf_result" = no && LIBS="$cf_save_LIBS"
+fi
+if test "$cf_cv_termlib" = none; then
+ # allow curses library for broken AIX system.
+ echo "$as_me:28115: checking for initscr in -lcurses" >&5
+echo $ECHO_N "checking for initscr in -lcurses... $ECHO_C" >&6
+if test "${ac_cv_lib_curses_initscr+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lcurses $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 28123 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char initscr ();
+int
+main (void)
+{
+initscr ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:28142: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:28145: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:28148: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:28151: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_lib_curses_initscr=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_curses_initscr=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:28162: result: $ac_cv_lib_curses_initscr" >&5
+echo "${ECHO_T}$ac_cv_lib_curses_initscr" >&6
+if test "$ac_cv_lib_curses_initscr" = yes; then
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lcurses; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+fi
+
+ echo "$as_me:28184: checking for tgoto in -ltermcap" >&5
+echo $ECHO_N "checking for tgoto in -ltermcap... $ECHO_C" >&6
+if test "${ac_cv_lib_termcap_tgoto+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ltermcap $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 28192 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char tgoto ();
+int
+main (void)
+{
+tgoto ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:28211: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:28214: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:28217: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:28220: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_lib_termcap_tgoto=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_termcap_tgoto=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:28231: result: $ac_cv_lib_termcap_tgoto" >&5
+echo "${ECHO_T}$ac_cv_lib_termcap_tgoto" >&6
+if test "$ac_cv_lib_termcap_tgoto" = yes; then
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -ltermcap; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+ cf_cv_termlib=termcap
+fi
+
+fi
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+if test "$cf_cv_termlib" = none; then
+ { echo "$as_me:28258: WARNING: Cannot find -ltermlib, -lcurses, or -ltermcap" >&5
+echo "$as_me: WARNING: Cannot find -ltermlib, -lcurses, or -ltermcap" >&2;}
+fi
+
+fi
+
+cf_slang_LIBS2="$LIBS"
+echo "$as_me:28265: checking for acos" >&5
+echo $ECHO_N "checking for acos... $ECHO_C" >&6
+if test "${ac_cv_func_acos+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 28271 "configure"
+#include "confdefs.h"
+#define acos autoconf_temporary
+#include <limits.h> /* least-intrusive standard header which defines gcc2 __stub macros */
+#undef acos
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char acos (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_acos) || defined (__stub___acos)
+#error found stub for acos
+#endif
+
+ return acos ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:28302: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:28305: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:28308: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:28311: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_func_acos=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_acos=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:28321: result: $ac_cv_func_acos" >&5
+echo "${ECHO_T}$ac_cv_func_acos" >&6
+if test "$ac_cv_func_acos" = yes; then
+ :
+else
+
+echo "$as_me:28327: checking for acos in -lm" >&5
+echo $ECHO_N "checking for acos in -lm... $ECHO_C" >&6
+if test "${ac_cv_lib_m_acos+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lm $LIBS $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 28335 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char acos ();
+int
+main (void)
+{
+acos ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:28354: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:28357: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:28360: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:28363: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_lib_m_acos=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_m_acos=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:28374: result: $ac_cv_lib_m_acos" >&5
+echo "${ECHO_T}$ac_cv_lib_m_acos" >&6
+if test "$ac_cv_lib_m_acos" = yes; then
+
+cf_tr_func=`echo "acos" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+ cat >>confdefs.h <<EOF
+#define HAVE_$cf_tr_func 1
+EOF
+
+ ac_cv_func_acos=yes
+ if test "$cf_used_lib_m" != yes ; then cf_used_lib_m=yes; LIBS="-lm $LIBS"; fi
+else
+
+ ac_cv_func_acos=unknown
+ unset ac_cv_func_acos 2>/dev/null
+
+fi
+
+fi
+
+case "$host_os" in
+(os2*)
+
+ eval 'cf_cv_have_lib_'"video"'=no'
+ cf_libdir=""
+ echo "$as_me:28400: checking for v_init" >&5
+echo $ECHO_N "checking for v_init... $ECHO_C" >&6
+if test "${ac_cv_func_v_init+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 28406 "configure"
+#include "confdefs.h"
+#define v_init autoconf_temporary
+#include <limits.h> /* least-intrusive standard header which defines gcc2 __stub macros */
+#undef v_init
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char v_init (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_v_init) || defined (__stub___v_init)
+#error found stub for v_init
+#endif
+
+ return v_init ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:28437: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:28440: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:28443: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:28446: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_func_v_init=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_v_init=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:28456: result: $ac_cv_func_v_init" >&5
+echo "${ECHO_T}$ac_cv_func_v_init" >&6
+if test "$ac_cv_func_v_init" = yes; then
+ eval 'cf_cv_have_lib_'"video"'=yes'
+else
+
+ cf_save_LIBS="$LIBS"
+ echo "$as_me:28463: checking for v_init in -lvideo" >&5
+echo $ECHO_N "checking for v_init in -lvideo... $ECHO_C" >&6
+ LIBS="-lvideo $LIBS"
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 28467 "configure"
+#include "confdefs.h"
+#include <sys/video.h>
+int
+main (void)
+{
+v_init()
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:28479: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:28482: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:28485: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:28488: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ echo "$as_me:28490: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ eval 'cf_cv_have_lib_'"video"'=yes'
+
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+echo "$as_me:28497: result: no" >&5
+echo "${ECHO_T}no" >&6
+
+cf_search=
+cf_library_path_list=""
+if test -n "${LDFLAGS}${LIBS}" ; then
+ for cf_library_path in $LDFLAGS $LIBS
+ do
+ case "$cf_library_path" in
+ (-L*)
+ cf_library_path=`echo ".$cf_library_path" |sed -e 's/^...//' -e 's,/lib$,,'`
+
+test "x$cf_library_path" != "xNONE" && \
+test -d "$cf_library_path" && \
+ {
+ test -n "$verbose" && echo " ... testing for lib-directories under $cf_library_path"
+ test -d "$cf_library_path/lib" && cf_search="$cf_search $cf_library_path/lib"
+ test -d "$cf_library_path/lib/video" && cf_search="$cf_search $cf_library_path/lib/video"
+ test -d "$cf_library_path/lib/video/lib" && cf_search="$cf_search $cf_library_path/lib/video/lib"
+ test -d "$cf_library_path/video/lib" && cf_search="$cf_search $cf_library_path/video/lib"
+ test -d "$cf_library_path/video/lib/video" && cf_search="$cf_search $cf_library_path/video/lib/video"
+}
+
+ cf_library_path_list="$cf_library_path_list $cf_search"
+ ;;
+ esac
+ done
+fi
+
+cf_search=
+
+test "x$prefix" != "xNONE" && \
+test -d "$prefix" && \
+ {
+ test -n "$verbose" && echo " ... testing for lib-directories under $prefix"
+ test -d "$prefix/lib" && cf_search="$cf_search $prefix/lib"
+ test -d "$prefix/lib/video" && cf_search="$cf_search $prefix/lib/video"
+ test -d "$prefix/lib/video/lib" && cf_search="$cf_search $prefix/lib/video/lib"
+ test -d "$prefix/video/lib" && cf_search="$cf_search $prefix/video/lib"
+ test -d "$prefix/video/lib/video" && cf_search="$cf_search $prefix/video/lib/video"
+}
+
+for cf_subdir_prefix in \
+ /usr \
+ /usr/local \
+ /usr/pkg \
+ /opt \
+ /opt/local \
+ $HOME
+do
+
+test "x$cf_subdir_prefix" != "x$prefix" && \
+test -d "$cf_subdir_prefix" && \
+{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
+ test -n "$verbose" && echo " ... testing for lib-directories under $cf_subdir_prefix"
+ test -d "$cf_subdir_prefix/lib" && cf_search="$cf_search $cf_subdir_prefix/lib"
+ test -d "$cf_subdir_prefix/lib/video" && cf_search="$cf_search $cf_subdir_prefix/lib/video"
+ test -d "$cf_subdir_prefix/lib/video/lib" && cf_search="$cf_search $cf_subdir_prefix/lib/video/lib"
+ test -d "$cf_subdir_prefix/video/lib" && cf_search="$cf_search $cf_subdir_prefix/video/lib"
+ test -d "$cf_subdir_prefix/video/lib/video" && cf_search="$cf_search $cf_subdir_prefix/video/lib/video"
+}
+
+done
+
+cf_search="$cf_library_path_list $cf_search"
+
+ for cf_libdir in $cf_search
+ do
+ echo "$as_me:28565: checking for -lvideo in $cf_libdir" >&5
+echo $ECHO_N "checking for -lvideo in $cf_libdir... $ECHO_C" >&6
+ LIBS="-L$cf_libdir -lvideo $cf_save_LIBS"
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 28569 "configure"
+#include "confdefs.h"
+#include <sys/video.h>
+int
+main (void)
+{
+v_init()
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:28581: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:28584: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:28587: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:28590: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ echo "$as_me:28592: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ eval 'cf_cv_have_lib_'"video"'=yes'
+ break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+echo "$as_me:28599: result: no" >&5
+echo "${ECHO_T}no" >&6
+ LIBS="$cf_save_LIBS"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+ done
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+
+eval 'cf_found_library="$cf_cv_have_lib_'"video"\"
+
+if test "$cf_found_library" = no ; then
+ { { echo "$as_me:28614: error: Cannot link video library" >&5
+echo "$as_me: error: Cannot link video library" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+ ;;
+esac
+
+ eval 'cf_cv_have_lib_'"slang"'=no'
+ cf_libdir=""
+ echo "$as_me:28624: checking for SLtt_get_screen_size" >&5
+echo $ECHO_N "checking for SLtt_get_screen_size... $ECHO_C" >&6
+if test "${ac_cv_func_SLtt_get_screen_size+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 28630 "configure"
+#include "confdefs.h"
+#define SLtt_get_screen_size autoconf_temporary
+#include <limits.h> /* least-intrusive standard header which defines gcc2 __stub macros */
+#undef SLtt_get_screen_size
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char SLtt_get_screen_size (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_SLtt_get_screen_size) || defined (__stub___SLtt_get_screen_size)
+#error found stub for SLtt_get_screen_size
+#endif
+
+ return SLtt_get_screen_size ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:28661: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:28664: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:28667: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:28670: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_func_SLtt_get_screen_size=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_SLtt_get_screen_size=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:28680: result: $ac_cv_func_SLtt_get_screen_size" >&5
+echo "${ECHO_T}$ac_cv_func_SLtt_get_screen_size" >&6
+if test "$ac_cv_func_SLtt_get_screen_size" = yes; then
+ eval 'cf_cv_have_lib_'"slang"'=yes'
+else
+
+ cf_save_LIBS="$LIBS"
+ echo "$as_me:28687: checking for SLtt_get_screen_size in -lslang" >&5
+echo $ECHO_N "checking for SLtt_get_screen_size in -lslang... $ECHO_C" >&6
+ LIBS="-lslang $LIBS"
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 28691 "configure"
+#include "confdefs.h"
+#include <slang.h>
+int
+main (void)
+{
+SLtt_get_screen_size()
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:28703: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:28706: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:28709: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:28712: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ echo "$as_me:28714: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ eval 'cf_cv_have_lib_'"slang"'=yes'
+
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+echo "$as_me:28721: result: no" >&5
+echo "${ECHO_T}no" >&6
+
+cf_search=
+cf_library_path_list=""
+if test -n "${LDFLAGS}${LIBS}" ; then
+ for cf_library_path in $LDFLAGS $LIBS
+ do
+ case "$cf_library_path" in
+ (-L*)
+ cf_library_path=`echo ".$cf_library_path" |sed -e 's/^...//' -e 's,/lib$,,'`
+
+test "x$cf_library_path" != "xNONE" && \
+test -d "$cf_library_path" && \
+ {
+ test -n "$verbose" && echo " ... testing for lib-directories under $cf_library_path"
+ test -d "$cf_library_path/lib" && cf_search="$cf_search $cf_library_path/lib"
+ test -d "$cf_library_path/lib/slang" && cf_search="$cf_search $cf_library_path/lib/slang"
+ test -d "$cf_library_path/lib/slang/lib" && cf_search="$cf_search $cf_library_path/lib/slang/lib"
+ test -d "$cf_library_path/slang/lib" && cf_search="$cf_search $cf_library_path/slang/lib"
+ test -d "$cf_library_path/slang/lib/slang" && cf_search="$cf_search $cf_library_path/slang/lib/slang"
+}
+
+ cf_library_path_list="$cf_library_path_list $cf_search"
+ ;;
+ esac
+ done
+fi
+
+cf_search=
+
+test "x$prefix" != "xNONE" && \
+test -d "$prefix" && \
+ {
+ test -n "$verbose" && echo " ... testing for lib-directories under $prefix"
+ test -d "$prefix/lib" && cf_search="$cf_search $prefix/lib"
+ test -d "$prefix/lib/slang" && cf_search="$cf_search $prefix/lib/slang"
+ test -d "$prefix/lib/slang/lib" && cf_search="$cf_search $prefix/lib/slang/lib"
+ test -d "$prefix/slang/lib" && cf_search="$cf_search $prefix/slang/lib"
+ test -d "$prefix/slang/lib/slang" && cf_search="$cf_search $prefix/slang/lib/slang"
+}
+
+for cf_subdir_prefix in \
+ /usr \
+ /usr/local \
+ /usr/pkg \
+ /opt \
+ /opt/local \
+ $HOME
+do
+
+test "x$cf_subdir_prefix" != "x$prefix" && \
+test -d "$cf_subdir_prefix" && \
+{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
+ test -n "$verbose" && echo " ... testing for lib-directories under $cf_subdir_prefix"
+ test -d "$cf_subdir_prefix/lib" && cf_search="$cf_search $cf_subdir_prefix/lib"
+ test -d "$cf_subdir_prefix/lib/slang" && cf_search="$cf_search $cf_subdir_prefix/lib/slang"
+ test -d "$cf_subdir_prefix/lib/slang/lib" && cf_search="$cf_search $cf_subdir_prefix/lib/slang/lib"
+ test -d "$cf_subdir_prefix/slang/lib" && cf_search="$cf_search $cf_subdir_prefix/slang/lib"
+ test -d "$cf_subdir_prefix/slang/lib/slang" && cf_search="$cf_search $cf_subdir_prefix/slang/lib/slang"
+}
+
+done
+
+cf_search="$cf_library_path_list $cf_search"
+
+ for cf_libdir in $cf_search
+ do
+ echo "$as_me:28789: checking for -lslang in $cf_libdir" >&5
+echo $ECHO_N "checking for -lslang in $cf_libdir... $ECHO_C" >&6
+ LIBS="-L$cf_libdir -lslang $cf_save_LIBS"
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 28793 "configure"
+#include "confdefs.h"
+#include <slang.h>
+int
+main (void)
+{
+SLtt_get_screen_size()
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:28805: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:28808: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:28811: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:28814: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ echo "$as_me:28816: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ eval 'cf_cv_have_lib_'"slang"'=yes'
+ break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+echo "$as_me:28823: result: no" >&5
+echo "${ECHO_T}no" >&6
+ LIBS="$cf_save_LIBS"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+ done
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+
+eval 'cf_found_library="$cf_cv_have_lib_'"slang"\"
+
+if test "$cf_found_library" = no ; then
+ { { echo "$as_me:28838: error: Cannot link slang library" >&5
+echo "$as_me: error: Cannot link slang library" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+cf_slang_LIBS3="$LIBS"
+echo "$as_me:28844: checking if we can link slang without termcap" >&5
+echo $ECHO_N "checking if we can link slang without termcap... $ECHO_C" >&6
+if test -n "`echo "$cf_slang_LIBS1" | sed -e 's/ //g'`" ; then
+ cf_exclude=`echo ".$cf_slang_LIBS2" | sed -e "s%$cf_slang_LIBS1%%" -e 's%^.%%'`
+else
+ cf_exclude="$cf_slang_LIBS2"
+fi
+LIBS=`echo ".$cf_slang_LIBS3" | sed -e "s%$cf_exclude%%" -e 's%^.%%'`
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 28853 "configure"
+#include "confdefs.h"
+#include <slang.h>
+int
+main (void)
+{
+SLtt_get_screen_size()
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:28865: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:28868: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:28871: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:28874: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_result=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_result=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+echo "$as_me:28883: result: $cf_result" >&5
+echo "${ECHO_T}$cf_result" >&6
+test "$cf_result" = no && LIBS="$cf_slang_LIBS3"
+
+else
+
+echo "$as_me:28889: checking for slang2 header file" >&5
+echo $ECHO_N "checking for slang2 header file... $ECHO_C" >&6
+if test "${cf_cv_slang2_header+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cf_cv_slang2_header=no
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 28897 "configure"
+#include "confdefs.h"
+#include <slang.h>
+int
+main (void)
+{
+printf("%s\\n", SLANG_VERSION)
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:28909: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:28912: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:28915: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:28918: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_slang2_header=predefined
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+cf_search=
+
+# collect the current set of include-directories from compiler flags
+cf_header_path_list=""
+if test -n "${CFLAGS}${CPPFLAGS}" ; then
+ for cf_header_path in $CPPFLAGS $CFLAGS
+ do
+ case "$cf_header_path" in
+ (-I*)
+ cf_header_path=`echo ".$cf_header_path" |sed -e 's/^...//' -e 's,/include$,,'`
+
+test "x$cf_header_path" != "xNONE" && \
+test -d "$cf_header_path" && \
+ {
+ test -n "$verbose" && echo " ... testing for include-directories under $cf_header_path"
+ test -d "$cf_header_path/include" && cf_search="$cf_search $cf_header_path/include"
+ test -d "$cf_header_path/include/slang2" && cf_search="$cf_search $cf_header_path/include/slang2"
+ test -d "$cf_header_path/include/slang2/include" && cf_search="$cf_search $cf_header_path/include/slang2/include"
+ test -d "$cf_header_path/slang2/include" && cf_search="$cf_search $cf_header_path/slang2/include"
+ test -d "$cf_header_path/slang2/include/slang2" && cf_search="$cf_search $cf_header_path/slang2/include/slang2"
+}
+
+ cf_header_path_list="$cf_header_path_list $cf_search"
+ ;;
+ esac
+ done
+fi
+
+# add the variations for the package we are looking for
+
+cf_search=
+
+test "x$prefix" != "xNONE" && \
+test -d "$prefix" && \
+ {
+ test -n "$verbose" && echo " ... testing for include-directories under $prefix"
+ test -d "$prefix/include" && cf_search="$cf_search $prefix/include"
+ test -d "$prefix/include/slang2" && cf_search="$cf_search $prefix/include/slang2"
+ test -d "$prefix/include/slang2/include" && cf_search="$cf_search $prefix/include/slang2/include"
+ test -d "$prefix/slang2/include" && cf_search="$cf_search $prefix/slang2/include"
+ test -d "$prefix/slang2/include/slang2" && cf_search="$cf_search $prefix/slang2/include/slang2"
+}
+
+for cf_subdir_prefix in \
+ /usr \
+ /usr/local \
+ /usr/pkg \
+ /opt \
+ /opt/local \
+ $HOME
+do
+
+test "x$cf_subdir_prefix" != "x$prefix" && \
+test -d "$cf_subdir_prefix" && \
+{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
+ test -n "$verbose" && echo " ... testing for include-directories under $cf_subdir_prefix"
+ test -d "$cf_subdir_prefix/include" && cf_search="$cf_search $cf_subdir_prefix/include"
+ test -d "$cf_subdir_prefix/include/slang2" && cf_search="$cf_search $cf_subdir_prefix/include/slang2"
+ test -d "$cf_subdir_prefix/include/slang2/include" && cf_search="$cf_search $cf_subdir_prefix/include/slang2/include"
+ test -d "$cf_subdir_prefix/slang2/include" && cf_search="$cf_search $cf_subdir_prefix/slang2/include"
+ test -d "$cf_subdir_prefix/slang2/include/slang2" && cf_search="$cf_search $cf_subdir_prefix/slang2/include/slang2"
+}
+
+done
+
+test "$includedir" != NONE && \
+test "$includedir" != "/usr/include" && \
+test -d "$includedir" && {
+ test -d "$includedir" && cf_search="$cf_search $includedir"
+ test -d "$includedir/slang2" && cf_search="$cf_search $includedir/slang2"
+}
+
+test "$oldincludedir" != NONE && \
+test "$oldincludedir" != "/usr/include" && \
+test -d "$oldincludedir" && {
+ test -d "$oldincludedir" && cf_search="$cf_search $oldincludedir"
+ test -d "$oldincludedir/slang2" && cf_search="$cf_search $oldincludedir/slang2"
+}
+
+cf_search="$cf_search $cf_header_path_list"
+
+ for cf_incdir in $cf_search
+ do
+ for cf_header in \
+ slang.h
+ do
+ echo trying "$cf_incdir/$cf_header" 1>&5
+ if ${EGREP-egrep} "SLANG_VERSION" "$cf_incdir/$cf_header" 1>&5 2>&1; then
+ cf_cv_slang2_header=$cf_incdir/$cf_header
+ break
+ fi
+ done
+ test "$cf_cv_slang2_header" != no && break
+ done
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:29023: result: $cf_cv_slang2_header" >&5
+echo "${ECHO_T}$cf_cv_slang2_header" >&6
+
+if test "x$cf_cv_slang2_header" != xno
+then
+
+cat >>confdefs.h <<\EOF
+#define USE_SLANG 1
+EOF
+
+ cf_incdir=`echo "$cf_cv_slang2_header" | sed -e 's%/[^/]*$%%'`
+
+ case "$cf_cv_slang2_header" in
+ (predefined)
+ ;;
+ (*)
+
+if test -n "$cf_incdir" ; then
+ for cf_add_incdir in $cf_incdir
+ do
+ while test "$cf_add_incdir" != /usr/include
+ do
+ if test -d "$cf_add_incdir"
+ then
+ cf_have_incdir=no
+ if test -n "$CFLAGS$CPPFLAGS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+ if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+ cf_have_incdir=yes; break
+ fi
+ done
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ if test "$cf_add_incdir" = /usr/local/include ; then
+ if test "$GCC" = yes
+ then
+ cf_save_CPPFLAGS=$CPPFLAGS
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 29067 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:29079: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:29082: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:29085: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:29088: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ CPPFLAGS=$cf_save_CPPFLAGS
+ fi
+ fi
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:29105: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+ CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+ cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+ test "$cf_top_incdir" = "$cf_add_incdir" && break
+ cf_add_incdir="$cf_top_incdir"
+ else
+ break
+ fi
+ else
+ break
+ fi
+ done
+ done
+fi
+
+ ;;
+ esac
+fi
+
+ if test "x$cf_cv_slang2_header" != xno
+ then
+
+cf_slang_LIBS1="$LIBS"
+
+if test "${cf_cv_termlib+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cf_cv_termlib=none
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 29137 "configure"
+#include "confdefs.h"
+extern char *tgoto(const char*,int,int);
+int
+main (void)
+{
+char *x=tgoto("",0,0); (void)x;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:29149: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:29152: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:29155: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:29158: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 29161 "configure"
+#include "confdefs.h"
+extern char *tigetstr(const char *);
+int
+main (void)
+{
+char *x=tigetstr(""); (void)x;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:29173: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:29176: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:29179: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:29182: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_termlib=terminfo
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_termlib=termcap
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+ test -n "$verbose" && echo " using functions in predefined $cf_cv_termlib LIBS" 1>&6
+
+echo "${as_me:-configure}:29193: testing using functions in predefined $cf_cv_termlib LIBS ..." 1>&5
+
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+if test "$cf_cv_termlib" = none; then
+ # FreeBSD's linker gives bogus results for AC_CHECK_LIB, saying that
+ # tgetstr lives in -lcurses when it is only an unsatisfied extern.
+ cf_save_LIBS="$LIBS"
+ for cf_lib in tinfo curses ncurses termlib termcap
+ do
+ LIBS="-l$cf_lib $cf_save_LIBS"
+ for cf_func in tigetstr tgetstr
+ do
+ echo "$as_me:29208: checking for $cf_func in -l$cf_lib" >&5
+echo $ECHO_N "checking for $cf_func in -l$cf_lib... $ECHO_C" >&6
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 29211 "configure"
+#include "confdefs.h"
+extern char *$cf_func(const char *);
+int
+main (void)
+{
+int x=$cf_func(""); (void)x
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:29223: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:29226: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:29229: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:29232: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_result=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_result=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+ echo "$as_me:29241: result: $cf_result" >&5
+echo "${ECHO_T}$cf_result" >&6
+ if test "$cf_result" = yes ; then
+ if test "$cf_func" = tigetstr ; then
+ cf_cv_termlib=terminfo
+ else
+ cf_cv_termlib=termcap
+ fi
+ break
+ fi
+ done
+ test "$cf_result" = yes && break
+ done
+ test "$cf_result" = no && LIBS="$cf_save_LIBS"
+fi
+if test "$cf_cv_termlib" = none; then
+ # allow curses library for broken AIX system.
+ echo "$as_me:29258: checking for initscr in -lcurses" >&5
+echo $ECHO_N "checking for initscr in -lcurses... $ECHO_C" >&6
+if test "${ac_cv_lib_curses_initscr+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lcurses $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 29266 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char initscr ();
+int
+main (void)
+{
+initscr ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:29285: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:29288: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:29291: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:29294: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_lib_curses_initscr=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_curses_initscr=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:29305: result: $ac_cv_lib_curses_initscr" >&5
+echo "${ECHO_T}$ac_cv_lib_curses_initscr" >&6
+if test "$ac_cv_lib_curses_initscr" = yes; then
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lcurses; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+fi
+
+ echo "$as_me:29327: checking for tgoto in -ltermcap" >&5
+echo $ECHO_N "checking for tgoto in -ltermcap... $ECHO_C" >&6
+if test "${ac_cv_lib_termcap_tgoto+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ltermcap $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 29335 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char tgoto ();
+int
+main (void)
+{
+tgoto ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:29354: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:29357: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:29360: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:29363: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_lib_termcap_tgoto=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_termcap_tgoto=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:29374: result: $ac_cv_lib_termcap_tgoto" >&5
+echo "${ECHO_T}$ac_cv_lib_termcap_tgoto" >&6
+if test "$ac_cv_lib_termcap_tgoto" = yes; then
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -ltermcap; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+ cf_cv_termlib=termcap
+fi
+
+fi
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+if test "$cf_cv_termlib" = none; then
+ { echo "$as_me:29401: WARNING: Cannot find -ltermlib, -lcurses, or -ltermcap" >&5
+echo "$as_me: WARNING: Cannot find -ltermlib, -lcurses, or -ltermcap" >&2;}
+fi
+
+fi
+
+cf_slang_LIBS2="$LIBS"
+echo "$as_me:29408: checking for acos" >&5
+echo $ECHO_N "checking for acos... $ECHO_C" >&6
+if test "${ac_cv_func_acos+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 29414 "configure"
+#include "confdefs.h"
+#define acos autoconf_temporary
+#include <limits.h> /* least-intrusive standard header which defines gcc2 __stub macros */
+#undef acos
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char acos (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_acos) || defined (__stub___acos)
+#error found stub for acos
+#endif
+
+ return acos ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:29445: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:29448: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:29451: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:29454: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_func_acos=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_acos=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:29464: result: $ac_cv_func_acos" >&5
+echo "${ECHO_T}$ac_cv_func_acos" >&6
+if test "$ac_cv_func_acos" = yes; then
+ :
+else
+
+echo "$as_me:29470: checking for acos in -lm" >&5
+echo $ECHO_N "checking for acos in -lm... $ECHO_C" >&6
+if test "${ac_cv_lib_m_acos+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lm $LIBS $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 29478 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char acos ();
+int
+main (void)
+{
+acos ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:29497: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:29500: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:29503: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:29506: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_lib_m_acos=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_m_acos=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:29517: result: $ac_cv_lib_m_acos" >&5
+echo "${ECHO_T}$ac_cv_lib_m_acos" >&6
+if test "$ac_cv_lib_m_acos" = yes; then
+
+cf_tr_func=`echo "acos" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+ cat >>confdefs.h <<EOF
+#define HAVE_$cf_tr_func 1
+EOF
+
+ ac_cv_func_acos=yes
+ if test "$cf_used_lib_m" != yes ; then cf_used_lib_m=yes; LIBS="-lm $LIBS"; fi
+else
+
+ ac_cv_func_acos=unknown
+ unset ac_cv_func_acos 2>/dev/null
+
+fi
+
+fi
+
+case "$host_os" in
+(os2*)
+
+ eval 'cf_cv_have_lib_'"video"'=no'
+ cf_libdir=""
+ echo "$as_me:29543: checking for v_init" >&5
+echo $ECHO_N "checking for v_init... $ECHO_C" >&6
+if test "${ac_cv_func_v_init+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 29549 "configure"
+#include "confdefs.h"
+#define v_init autoconf_temporary
+#include <limits.h> /* least-intrusive standard header which defines gcc2 __stub macros */
+#undef v_init
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char v_init (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_v_init) || defined (__stub___v_init)
+#error found stub for v_init
+#endif
+
+ return v_init ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:29580: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:29583: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:29586: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:29589: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_func_v_init=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_v_init=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:29599: result: $ac_cv_func_v_init" >&5
+echo "${ECHO_T}$ac_cv_func_v_init" >&6
+if test "$ac_cv_func_v_init" = yes; then
+ eval 'cf_cv_have_lib_'"video"'=yes'
+else
+
+ cf_save_LIBS="$LIBS"
+ echo "$as_me:29606: checking for v_init in -lvideo" >&5
+echo $ECHO_N "checking for v_init in -lvideo... $ECHO_C" >&6
+ LIBS="-lvideo $LIBS"
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 29610 "configure"
+#include "confdefs.h"
+#include <sys/video.h>
+int
+main (void)
+{
+v_init()
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:29622: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:29625: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:29628: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:29631: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ echo "$as_me:29633: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ eval 'cf_cv_have_lib_'"video"'=yes'
+
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+echo "$as_me:29640: result: no" >&5
+echo "${ECHO_T}no" >&6
+
+cf_search=
+cf_library_path_list=""
+if test -n "${LDFLAGS}${LIBS}" ; then
+ for cf_library_path in $LDFLAGS $LIBS
+ do
+ case "$cf_library_path" in
+ (-L*)
+ cf_library_path=`echo ".$cf_library_path" |sed -e 's/^...//' -e 's,/lib$,,'`
+
+test "x$cf_library_path" != "xNONE" && \
+test -d "$cf_library_path" && \
+ {
+ test -n "$verbose" && echo " ... testing for lib-directories under $cf_library_path"
+ test -d "$cf_library_path/lib" && cf_search="$cf_search $cf_library_path/lib"
+ test -d "$cf_library_path/lib/video" && cf_search="$cf_search $cf_library_path/lib/video"
+ test -d "$cf_library_path/lib/video/lib" && cf_search="$cf_search $cf_library_path/lib/video/lib"
+ test -d "$cf_library_path/video/lib" && cf_search="$cf_search $cf_library_path/video/lib"
+ test -d "$cf_library_path/video/lib/video" && cf_search="$cf_search $cf_library_path/video/lib/video"
+}
+
+ cf_library_path_list="$cf_library_path_list $cf_search"
+ ;;
+ esac
+ done
+fi
+
+cf_search=
+
+test "x$prefix" != "xNONE" && \
+test -d "$prefix" && \
+ {
+ test -n "$verbose" && echo " ... testing for lib-directories under $prefix"
+ test -d "$prefix/lib" && cf_search="$cf_search $prefix/lib"
+ test -d "$prefix/lib/video" && cf_search="$cf_search $prefix/lib/video"
+ test -d "$prefix/lib/video/lib" && cf_search="$cf_search $prefix/lib/video/lib"
+ test -d "$prefix/video/lib" && cf_search="$cf_search $prefix/video/lib"
+ test -d "$prefix/video/lib/video" && cf_search="$cf_search $prefix/video/lib/video"
+}
+
+for cf_subdir_prefix in \
+ /usr \
+ /usr/local \
+ /usr/pkg \
+ /opt \
+ /opt/local \
+ $HOME
+do
+
+test "x$cf_subdir_prefix" != "x$prefix" && \
+test -d "$cf_subdir_prefix" && \
+{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
+ test -n "$verbose" && echo " ... testing for lib-directories under $cf_subdir_prefix"
+ test -d "$cf_subdir_prefix/lib" && cf_search="$cf_search $cf_subdir_prefix/lib"
+ test -d "$cf_subdir_prefix/lib/video" && cf_search="$cf_search $cf_subdir_prefix/lib/video"
+ test -d "$cf_subdir_prefix/lib/video/lib" && cf_search="$cf_search $cf_subdir_prefix/lib/video/lib"
+ test -d "$cf_subdir_prefix/video/lib" && cf_search="$cf_search $cf_subdir_prefix/video/lib"
+ test -d "$cf_subdir_prefix/video/lib/video" && cf_search="$cf_search $cf_subdir_prefix/video/lib/video"
+}
+
+done
+
+cf_search="$cf_library_path_list $cf_search"
+
+ for cf_libdir in $cf_search
+ do
+ echo "$as_me:29708: checking for -lvideo in $cf_libdir" >&5
+echo $ECHO_N "checking for -lvideo in $cf_libdir... $ECHO_C" >&6
+ LIBS="-L$cf_libdir -lvideo $cf_save_LIBS"
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 29712 "configure"
+#include "confdefs.h"
+#include <sys/video.h>
+int
+main (void)
+{
+v_init()
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:29724: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:29727: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:29730: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:29733: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ echo "$as_me:29735: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ eval 'cf_cv_have_lib_'"video"'=yes'
+ break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+echo "$as_me:29742: result: no" >&5
+echo "${ECHO_T}no" >&6
+ LIBS="$cf_save_LIBS"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+ done
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+
+eval 'cf_found_library="$cf_cv_have_lib_'"video"\"
+
+if test "$cf_found_library" = no ; then
+ { { echo "$as_me:29757: error: Cannot link video library" >&5
+echo "$as_me: error: Cannot link video library" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+ ;;
+esac
+
+ eval 'cf_cv_have_lib_'"slang2"'=no'
+ cf_libdir=""
+ echo "$as_me:29767: checking for SLtt_get_screen_size" >&5
+echo $ECHO_N "checking for SLtt_get_screen_size... $ECHO_C" >&6
+if test "${ac_cv_func_SLtt_get_screen_size+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 29773 "configure"
+#include "confdefs.h"
+#define SLtt_get_screen_size autoconf_temporary
+#include <limits.h> /* least-intrusive standard header which defines gcc2 __stub macros */
+#undef SLtt_get_screen_size
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char SLtt_get_screen_size (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_SLtt_get_screen_size) || defined (__stub___SLtt_get_screen_size)
+#error found stub for SLtt_get_screen_size
+#endif
+
+ return SLtt_get_screen_size ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:29804: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:29807: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:29810: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:29813: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_func_SLtt_get_screen_size=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_SLtt_get_screen_size=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:29823: result: $ac_cv_func_SLtt_get_screen_size" >&5
+echo "${ECHO_T}$ac_cv_func_SLtt_get_screen_size" >&6
+if test "$ac_cv_func_SLtt_get_screen_size" = yes; then
+ eval 'cf_cv_have_lib_'"slang2"'=yes'
+else
+
+ cf_save_LIBS="$LIBS"
+ echo "$as_me:29830: checking for SLtt_get_screen_size in -lslang2" >&5
+echo $ECHO_N "checking for SLtt_get_screen_size in -lslang2... $ECHO_C" >&6
+ LIBS="-lslang2 $LIBS"
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 29834 "configure"
+#include "confdefs.h"
+#include <slang.h>
+int
+main (void)
+{
+SLtt_get_screen_size()
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:29846: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:29849: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:29852: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:29855: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ echo "$as_me:29857: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ eval 'cf_cv_have_lib_'"slang2"'=yes'
+
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+echo "$as_me:29864: result: no" >&5
+echo "${ECHO_T}no" >&6
+
+cf_search=
+cf_library_path_list=""
+if test -n "${LDFLAGS}${LIBS}" ; then
+ for cf_library_path in $LDFLAGS $LIBS
+ do
+ case "$cf_library_path" in
+ (-L*)
+ cf_library_path=`echo ".$cf_library_path" |sed -e 's/^...//' -e 's,/lib$,,'`
+
+test "x$cf_library_path" != "xNONE" && \
+test -d "$cf_library_path" && \
+ {
+ test -n "$verbose" && echo " ... testing for lib-directories under $cf_library_path"
+ test -d "$cf_library_path/lib" && cf_search="$cf_search $cf_library_path/lib"
+ test -d "$cf_library_path/lib/slang2" && cf_search="$cf_search $cf_library_path/lib/slang2"
+ test -d "$cf_library_path/lib/slang2/lib" && cf_search="$cf_search $cf_library_path/lib/slang2/lib"
+ test -d "$cf_library_path/slang2/lib" && cf_search="$cf_search $cf_library_path/slang2/lib"
+ test -d "$cf_library_path/slang2/lib/slang2" && cf_search="$cf_search $cf_library_path/slang2/lib/slang2"
+}
+
+ cf_library_path_list="$cf_library_path_list $cf_search"
+ ;;
+ esac
+ done
+fi
+
+cf_search=
+
+test "x$prefix" != "xNONE" && \
+test -d "$prefix" && \
+ {
+ test -n "$verbose" && echo " ... testing for lib-directories under $prefix"
+ test -d "$prefix/lib" && cf_search="$cf_search $prefix/lib"
+ test -d "$prefix/lib/slang2" && cf_search="$cf_search $prefix/lib/slang2"
+ test -d "$prefix/lib/slang2/lib" && cf_search="$cf_search $prefix/lib/slang2/lib"
+ test -d "$prefix/slang2/lib" && cf_search="$cf_search $prefix/slang2/lib"
+ test -d "$prefix/slang2/lib/slang2" && cf_search="$cf_search $prefix/slang2/lib/slang2"
+}
+
+for cf_subdir_prefix in \
+ /usr \
+ /usr/local \
+ /usr/pkg \
+ /opt \
+ /opt/local \
+ $HOME
+do
+
+test "x$cf_subdir_prefix" != "x$prefix" && \
+test -d "$cf_subdir_prefix" && \
+{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
+ test -n "$verbose" && echo " ... testing for lib-directories under $cf_subdir_prefix"
+ test -d "$cf_subdir_prefix/lib" && cf_search="$cf_search $cf_subdir_prefix/lib"
+ test -d "$cf_subdir_prefix/lib/slang2" && cf_search="$cf_search $cf_subdir_prefix/lib/slang2"
+ test -d "$cf_subdir_prefix/lib/slang2/lib" && cf_search="$cf_search $cf_subdir_prefix/lib/slang2/lib"
+ test -d "$cf_subdir_prefix/slang2/lib" && cf_search="$cf_search $cf_subdir_prefix/slang2/lib"
+ test -d "$cf_subdir_prefix/slang2/lib/slang2" && cf_search="$cf_search $cf_subdir_prefix/slang2/lib/slang2"
+}
+
+done
+
+cf_search="$cf_library_path_list $cf_search"
+
+ for cf_libdir in $cf_search
+ do
+ echo "$as_me:29932: checking for -lslang2 in $cf_libdir" >&5
+echo $ECHO_N "checking for -lslang2 in $cf_libdir... $ECHO_C" >&6
+ LIBS="-L$cf_libdir -lslang2 $cf_save_LIBS"
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 29936 "configure"
+#include "confdefs.h"
+#include <slang.h>
+int
+main (void)
+{
+SLtt_get_screen_size()
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:29948: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:29951: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:29954: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:29957: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ echo "$as_me:29959: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ eval 'cf_cv_have_lib_'"slang2"'=yes'
+ break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+echo "$as_me:29966: result: no" >&5
+echo "${ECHO_T}no" >&6
+ LIBS="$cf_save_LIBS"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+ done
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+
+eval 'cf_found_library="$cf_cv_have_lib_'"slang2"\"
+
+if test "$cf_found_library" = no ; then
+ { { echo "$as_me:29981: error: Cannot link slang2 library" >&5
+echo "$as_me: error: Cannot link slang2 library" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+cf_slang_LIBS3="$LIBS"
+echo "$as_me:29987: checking if we can link slang2 without termcap" >&5
+echo $ECHO_N "checking if we can link slang2 without termcap... $ECHO_C" >&6
+if test -n "`echo "$cf_slang_LIBS1" | sed -e 's/ //g'`" ; then
+ cf_exclude=`echo ".$cf_slang_LIBS2" | sed -e "s%$cf_slang_LIBS1%%" -e 's%^.%%'`
+else
+ cf_exclude="$cf_slang_LIBS2"
+fi
+LIBS=`echo ".$cf_slang_LIBS3" | sed -e "s%$cf_exclude%%" -e 's%^.%%'`
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 29996 "configure"
+#include "confdefs.h"
+#include <slang.h>
+int
+main (void)
+{
+SLtt_get_screen_size()
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:30008: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:30011: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:30014: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:30017: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_result=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_result=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+echo "$as_me:30026: result: $cf_result" >&5
+echo "${ECHO_T}$cf_result" >&6
+test "$cf_result" = no && LIBS="$cf_slang_LIBS3"
+
+ else
+ { { echo "$as_me:30031: error: cannot find slang headers" >&5
+echo "$as_me: error: cannot find slang headers" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+fi
+
+# There's an unofficial set of patches for slang that gives it some limited
+# UTF8 capability. Unfortunately it won't compile unless one defines UTF8.
+echo "$as_me:30039: checking if we must define UTF8" >&5
+echo $ECHO_N "checking if we must define UTF8... $ECHO_C" >&6
+if test "${cf_cv_slang_utf8+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 30046 "configure"
+#include "confdefs.h"
+#include <slang.h>
+int
+main (void)
+{
+SLtt_get_screen_size()
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:30058: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:30061: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:30064: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:30067: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_slang_utf8=no
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 30075 "configure"
+#include "confdefs.h"
+
+#define UTF8
+#include <slang.h>
+int
+main (void)
+{
+SLtt_get_screen_size()
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:30089: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:30092: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:30095: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:30098: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_slang_utf8=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_slang_utf8=unknown
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:30111: result: $cf_cv_slang_utf8" >&5
+echo "${ECHO_T}$cf_cv_slang_utf8" >&6
+
+if test "$cf_cv_slang_utf8" = yes ; then
+
+cat >>confdefs.h <<\EOF
+#define UTF8 1
+EOF
+
+fi
+
+echo "$as_me:30122: checking if we must tell slang this is UNIX" >&5
+echo $ECHO_N "checking if we must tell slang this is UNIX... $ECHO_C" >&6
+if test "${cf_cv_slang_unix+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 30129 "configure"
+#include "confdefs.h"
+#include <slang.h>
+int
+main (void)
+{
+
+#ifdef REAL_UNIX_SYSTEM
+make an error
+#else
+extern int SLang_TT_Baud_Rate;
+SLang_TT_Baud_Rate = 1
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:30148: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:30151: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:30154: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:30157: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_slang_unix=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_slang_unix=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:30168: result: $cf_cv_slang_unix" >&5
+echo "${ECHO_T}$cf_cv_slang_unix" >&6
+test "$cf_cv_slang_unix" = yes &&
+cat >>confdefs.h <<\EOF
+#define REAL_UNIX_SYSTEM 1
+EOF
+
+ echo "$as_me:30175: checking for SLsmg_Color_Type" >&5
+echo $ECHO_N "checking for SLsmg_Color_Type... $ECHO_C" >&6
+if test "${ac_cv_type_SLsmg_Color_Type+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 30181 "configure"
+#include "confdefs.h"
+#include <slang.h>
+
+int
+main (void)
+{
+if ((SLsmg_Color_Type *) 0)
+ return 0;
+if (sizeof (SLsmg_Color_Type))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:30197: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:30200: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:30203: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:30206: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_type_SLsmg_Color_Type=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_type_SLsmg_Color_Type=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:30216: result: $ac_cv_type_SLsmg_Color_Type" >&5
+echo "${ECHO_T}$ac_cv_type_SLsmg_Color_Type" >&6
+if test "$ac_cv_type_SLsmg_Color_Type" = yes; then
+ ac_cv_type_SLsmg_Color_Type=yes
+else
+ ac_cv_type_SLsmg_Color_Type=no
+fi
+
+ if test "$ac_cv_type_SLsmg_Color_Type" = no; then
+
+cat >>confdefs.h <<\EOF
+#define SLsmg_Color_Type int
+EOF
+
+fi
+
+ echo "$as_me:30232: checking for SLtt_Char_Type" >&5
+echo $ECHO_N "checking for SLtt_Char_Type... $ECHO_C" >&6
+if test "${ac_cv_type_SLtt_Char_Type+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 30238 "configure"
+#include "confdefs.h"
+#include <slang.h>
+
+int
+main (void)
+{
+if ((SLtt_Char_Type *) 0)
+ return 0;
+if (sizeof (SLtt_Char_Type))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:30254: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:30257: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:30260: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:30263: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_type_SLtt_Char_Type=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_type_SLtt_Char_Type=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:30273: result: $ac_cv_type_SLtt_Char_Type" >&5
+echo "${ECHO_T}$ac_cv_type_SLtt_Char_Type" >&6
+if test "$ac_cv_type_SLtt_Char_Type" = yes; then
+ ac_cv_type_SLtt_Char_Type=yes
+else
+ ac_cv_type_SLtt_Char_Type=no
+fi
+
+ if test "$ac_cv_type_SLtt_Char_Type" = no; then
+
+cat >>confdefs.h <<\EOF
+#define SLtt_Char_Type unsigned long
+EOF
+
+fi
+
+ dft_color_style=no
+ ;;
+esac
+
+LD_RPATH_OPT=
+if test "x$cf_cv_enable_rpath" != xno
+then
+ echo "$as_me:30296: checking for an rpath option" >&5
+echo $ECHO_N "checking for an rpath option... $ECHO_C" >&6
+ case "$cf_cv_system_name" in
+ (irix*)
+ if test "$GCC" = yes; then
+ LD_RPATH_OPT="-Wl,-rpath,"
+ else
+ LD_RPATH_OPT="-rpath "
+ fi
+ ;;
+ (linux*|gnu*|k*bsd*-gnu|freebsd*)
+ LD_RPATH_OPT="-Wl,-rpath,"
+ ;;
+ (openbsd[2-9].*|mirbsd*)
+ LD_RPATH_OPT="-Wl,-rpath,"
+ ;;
+ (dragonfly*)
+ LD_RPATH_OPT="-rpath "
+ ;;
+ (netbsd*)
+ LD_RPATH_OPT="-Wl,-rpath,"
+ ;;
+ (osf*|mls+*)
+ LD_RPATH_OPT="-rpath "
+ ;;
+ (solaris2*)
+ LD_RPATH_OPT="-R"
+ ;;
+ (*)
+ ;;
+ esac
+ echo "$as_me:30327: result: $LD_RPATH_OPT" >&5
+echo "${ECHO_T}$LD_RPATH_OPT" >&6
+
+ case "x$LD_RPATH_OPT" in
+ (x-R*)
+ echo "$as_me:30332: checking if we need a space after rpath option" >&5
+echo $ECHO_N "checking if we need a space after rpath option... $ECHO_C" >&6
+ cf_save_LIBS="$LIBS"
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in ${LD_RPATH_OPT}$libdir; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 30353 "configure"
+#include "confdefs.h"
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:30365: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:30368: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:30371: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:30374: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_rpath_space=no
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_rpath_space=yes
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+ LIBS="$cf_save_LIBS"
+ echo "$as_me:30384: result: $cf_rpath_space" >&5
+echo "${ECHO_T}$cf_rpath_space" >&6
+ test "$cf_rpath_space" = yes && LD_RPATH_OPT="$LD_RPATH_OPT "
+ ;;
+ esac
+fi
+
+if test -z "$LD_RPATH_OPT"
+then
+ test -n "$verbose" && echo " will not attempt to use rpath" 1>&6
+
+echo "${as_me:-configure}:30395: testing will not attempt to use rpath ..." 1>&5
+
+elif test "x${enable_rpath_hack:-yes}" = "xno"
+then
+ test -n "$verbose" && echo " rpath is disabled" 1>&6
+
+echo "${as_me:-configure}:30401: testing rpath is disabled ..." 1>&5
+
+elif test -z "${LD_RUN_PATH}${LD_LIBRARY_PATH}"
+then
+ case "$LIBS" in
+ (*-L/*)
+
+if test "$cross_compiling" = yes; then
+ cf_check_run=unknown
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 30412 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int main(void) {
+ fflush(stderr);
+ ${cf_cv_main_return:-return}(0);
+}
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:30421: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:30424: \$? = $ac_status" >&5
+ (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+ { (eval echo "$as_me:30426: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:30429: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_check_run=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_check_run=no
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+
+ if test "x$cf_check_run" = xno
+ then
+ test -n "$verbose" && echo " linkage is broken" 1>&6
+
+echo "${as_me:-configure}:30445: testing linkage is broken ..." 1>&5
+
+ cf_result=
+ for cf_item in $LIBS
+ do
+ case " $cf_item" in
+ (\ -L/*)
+ cf_rpath_arg=`echo " $cf_item" | sed -e "s% -L%$LD_RPATH_OPT%"`
+ cf_rpath_tmp=`echo "$cf_result " | sed -e "s% $cf_rpath_arg % %"`
+ if test "x$cf_result " = "x$cf_rpath_tmp"
+ then
+ cf_result="$cf_result $cf_rpath_arg"
+ fi
+ cf_rpath_tmp=`echo "$cf_result " | sed -e "s% $cf_item % %g"`
+ if test "x$cf_result " != "x$cf_rpath_tmp"
+ then
+ continue
+ fi
+ ;;
+ esac
+ cf_result="$cf_result $cf_item"
+ done
+ cf_result=`echo "$cf_result" | sed -e 's/^ //'`
+ if test "x$cf_result" != "x$LIBS"
+ then
+ cf_save_LIBS="$LIBS"
+ LIBS="$cf_result"
+
+if test "$cross_compiling" = yes; then
+ cf_check_run=unknown
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 30477 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int main(void) {
+ fflush(stderr);
+ ${cf_cv_main_return:-return}(0);
+}
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:30486: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:30489: \$? = $ac_status" >&5
+ (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+ { (eval echo "$as_me:30491: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:30494: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_check_run=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_check_run=no
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+
+ if test "x$cf_check_run" = "xyes"
+ then
+ test -n "$verbose" && echo " use rpath for $cf_save_LIBS" 1>&6
+
+echo "${as_me:-configure}:30510: testing use rpath for $cf_save_LIBS ..." 1>&5
+
+ LIBS="$cf_result"
+ test -n "$verbose" && echo " result is now $LIBS" 1>&6
+
+echo "${as_me:-configure}:30515: testing result is now $LIBS ..." 1>&5
+
+ else
+ LIBS="$cf_save_LIBS"
+ fi
+ fi
+ fi
+ ;;
+ (*)
+ test -n "$verbose" && echo " will not attempt to use rpath" 1>&6
+
+echo "${as_me:-configure}:30526: testing will not attempt to use rpath ..." 1>&5
+
+ ;;
+ esac
+fi
+
+echo "$as_me:30532: checking for chtype typedef" >&5
+echo $ECHO_N "checking for chtype typedef... $ECHO_C" >&6
+if test "${cf_cv_chtype_decl+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 30539 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+chtype foo; (void)foo
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:30551: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:30554: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:30557: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:30560: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_chtype_decl=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_chtype_decl=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:30570: result: $cf_cv_chtype_decl" >&5
+echo "${ECHO_T}$cf_cv_chtype_decl" >&6
+if test "$cf_cv_chtype_decl" = yes ; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_TYPE_CHTYPE 1
+EOF
+
+ echo "$as_me:30578: checking if chtype is scalar or struct" >&5
+echo $ECHO_N "checking if chtype is scalar or struct... $ECHO_C" >&6
+if test "${cf_cv_chtype_type+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 30585 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+static chtype foo; long x = foo; (void)x
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:30597: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:30600: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:30603: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:30606: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_chtype_type=scalar
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_chtype_type=struct
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:30616: result: $cf_cv_chtype_type" >&5
+echo "${ECHO_T}$cf_cv_chtype_type" >&6
+ if test "$cf_cv_chtype_type" = scalar ; then
+
+cat >>confdefs.h <<\EOF
+#define TYPE_CHTYPE_IS_SCALAR 1
+EOF
+
+ fi
+fi
+
+echo "$as_me:30627: checking if you want the wide-curses features" >&5
+echo $ECHO_N "checking if you want the wide-curses features... $ECHO_C" >&6
+
+# Check whether --enable-widec or --disable-widec was given.
+if test "${enable_widec+set}" = set; then
+ enableval="$enable_widec"
+ test "$enableval" != yes && enableval=no
+ if test "$enableval" != "no" ; then
+ use_wide_curses=$enableval
+ else
+ use_wide_curses=$cf_wide_curses
+ fi
+else
+ enableval=no
+ use_wide_curses=$cf_wide_curses
+
+fi;
+echo "$as_me:30644: result: $use_wide_curses" >&5
+echo "${ECHO_T}$use_wide_curses" >&6
+
+echo "$as_me:30647: checking if color-style code should be used" >&5
+echo $ECHO_N "checking if color-style code should be used... $ECHO_C" >&6
+
+# Check whether --enable-color-style or --disable-color-style was given.
+if test "${enable_color_style+set}" = set; then
+ enableval="$enable_color_style"
+ test "$enableval" != no && enableval=yes
+ if test "$enableval" != "yes" ; then
+ use_color_style=$enableval
+ else
+ use_color_style=$dft_color_style
+ fi
+else
+ enableval=yes
+ use_color_style=$dft_color_style
+
+fi;
+
+case "$use_color_style" in
+(no)
+ echo "$as_me:30667: result: no" >&5
+echo "${ECHO_T}no" >&6
+ INSTALL_LSS=
+ ;;
+(*)
+
+cat >>confdefs.h <<\EOF
+#define USE_COLOR_STYLE 1
+EOF
+
+ echo "$as_me:30677: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+
+ echo "$as_me:30680: checking for location of style-sheet file" >&5
+echo $ECHO_N "checking for location of style-sheet file... $ECHO_C" >&6
+
+# Check whether --with-lss-file or --without-lss-file was given.
+if test "${with_lss_file+set}" = set; then
+ withval="$with_lss_file"
+
+else
+ withval="${LYNX_LSS_FILE:-$sysconfdir/lynx.lss}"
+fi; if test -n "$sysconfdir/lynx.lss" ; then
+
+if test "x$prefix" != xNONE; then
+ cf_path_syntax="$prefix"
+else
+ cf_path_syntax="$ac_default_prefix"
+fi
+
+case ".$withval" in
+(.\$\(*\)*|.\'*\'*)
+ ;;
+(..|./*|.\\*)
+ ;;
+(.[a-zA-Z]:[\\/]*) # OS/2 EMX
+ ;;
+(.\$\{*prefix\}*|.\$\{*dir\}*)
+ eval withval="$withval"
+ case ".$withval" in
+ (.NONE/*)
+ withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%`
+ ;;
+ esac
+ ;;
+(.no|.NONE/*)
+ withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%`
+ ;;
+(*)
+ { { echo "$as_me:30716: error: expected a pathname, not \"$withval\"" >&5
+echo "$as_me: error: expected a pathname, not \"$withval\"" >&2;}
+ { (exit 1); exit 1; }; }
+ ;;
+esac
+
+fi
+eval LYNX_LSS_FILE="$withval"
+
+ echo "$as_me:30725: result: $LYNX_LSS_FILE" >&5
+echo "${ECHO_T}$LYNX_LSS_FILE" >&6
+
+ test "$LYNX_LSS_FILE" = no && LYNX_LSS_FILE=
+
+cat >>confdefs.h <<EOF
+#define LYNX_LSS_FILE "$LYNX_LSS_FILE"
+EOF
+
+ INSTALL_LSS=install-lss
+ ;;
+esac
+
+echo "$as_me:30738: checking for the default configuration-file" >&5
+echo $ECHO_N "checking for the default configuration-file... $ECHO_C" >&6
+
+# Check whether --with-cfg-file or --without-cfg-file was given.
+if test "${with_cfg_file+set}" = set; then
+ withval="$with_cfg_file"
+
+else
+ withval="${LYNX_CFG_FILE:-$sysconfdir/lynx.cfg}"
+fi; if test -n "$sysconfdir/lynx.cfg" ; then
+
+if test "x$prefix" != xNONE; then
+ cf_path_syntax="$prefix"
+else
+ cf_path_syntax="$ac_default_prefix"
+fi
+
+case ".$withval" in
+(.\$\(*\)*|.\'*\'*)
+ ;;
+(..|./*|.\\*)
+ ;;
+(.[a-zA-Z]:[\\/]*) # OS/2 EMX
+ ;;
+(.\$\{*prefix\}*|.\$\{*dir\}*)
+ eval withval="$withval"
+ case ".$withval" in
+ (.NONE/*)
+ withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%`
+ ;;
+ esac
+ ;;
+(.no|.NONE/*)
+ withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%`
+ ;;
+(*)
+ { { echo "$as_me:30774: error: expected a pathname, not \"$withval\"" >&5
+echo "$as_me: error: expected a pathname, not \"$withval\"" >&2;}
+ { (exit 1); exit 1; }; }
+ ;;
+esac
+
+fi
+eval LYNX_CFG_FILE="$withval"
+
+echo "$as_me:30783: result: $LYNX_CFG_FILE" >&5
+echo "${ECHO_T}$LYNX_CFG_FILE" >&6
+
+test "$LYNX_CFG_FILE" = no && LYNX_CFG_FILE=
+
+cat >>confdefs.h <<EOF
+#define LYNX_CFG_FILE "$LYNX_CFG_FILE"
+EOF
+
+echo "$as_me:30792: checking for the default configuration-path" >&5
+echo $ECHO_N "checking for the default configuration-path... $ECHO_C" >&6
+
+# Check whether --with-cfg-path or --without-cfg-path was given.
+if test "${with_cfg_path+set}" = set; then
+ withval="$with_cfg_path"
+
+else
+ withval="${LYNX_CFG_PATH:-$sysconfdir}"
+fi; if test -n "$sysconfdir" ; then
+
+if test "x$prefix" != xNONE; then
+ cf_path_syntax="$prefix"
+else
+ cf_path_syntax="$ac_default_prefix"
+fi
+
+case ".$withval" in
+(.\$\(*\)*|.\'*\'*)
+ ;;
+(..|./*|.\\*)
+ ;;
+(.[a-zA-Z]:[\\/]*) # OS/2 EMX
+ ;;
+(.\$\{*prefix\}*|.\$\{*dir\}*)
+ eval withval="$withval"
+ case ".$withval" in
+ (.NONE/*)
+ withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%`
+ ;;
+ esac
+ ;;
+(.no|.NONE/*)
+ withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%`
+ ;;
+(*)
+ { { echo "$as_me:30828: error: expected a pathname, not \"$withval\"" >&5
+echo "$as_me: error: expected a pathname, not \"$withval\"" >&2;}
+ { (exit 1); exit 1; }; }
+ ;;
+esac
+
+fi
+eval LYNX_CFG_PATH="$withval"
+
+echo "$as_me:30837: result: $LYNX_CFG_PATH" >&5
+echo "${ECHO_T}$LYNX_CFG_PATH" >&6
+
+test -z "$LYNX_CFG_PATH" && LYNX_CFG_PATH="`echo "$LYNX_CFG_FILE" | sed -e 's%/[^/]*$%%'`"
+test "x$LYNX_CFG_PATH" = xno && LYNX_CFG_PATH=
+
+cat >>confdefs.h <<EOF
+#define LYNX_CFG_PATH "$LYNX_CFG_PATH"
+EOF
+
+echo "$as_me:30847: checking if htmlized lynx.cfg should be built" >&5
+echo $ECHO_N "checking if htmlized lynx.cfg should be built... $ECHO_C" >&6
+
+# Check whether --enable-htmlized-cfg or --disable-htmlized-cfg was given.
+if test "${enable_htmlized_cfg+set}" = set; then
+ enableval="$enable_htmlized_cfg"
+ test "$enableval" != yes && enableval=no
+ if test "$enableval" != "no" ; then
+ use_htmlized_cfg=$enableval
+ else
+ use_htmlized_cfg=no
+ fi
+else
+ enableval=no
+ use_htmlized_cfg=no
+
+fi;
+echo "$as_me:30864: result: $use_htmlized_cfg" >&5
+echo "${ECHO_T}$use_htmlized_cfg" >&6
+
+LYNXCFG_MAKE=''
+LYNXCFG_NO_MAKE=''
+if test "$use_htmlized_cfg" = no ; then
+ LYNXCFG_MAKE='#'
+else
+ LYNXCFG_NO_MAKE='#'
+fi
+
+echo "$as_me:30875: checking if local doc directory should be linked to help page" >&5
+echo $ECHO_N "checking if local doc directory should be linked to help page... $ECHO_C" >&6
+
+# Check whether --enable-local-docs or --disable-local-docs was given.
+if test "${enable_local_docs+set}" = set; then
+ enableval="$enable_local_docs"
+ test "$enableval" != yes && enableval=no
+ if test "$enableval" != "no" ; then
+ use_local_docs=$enableval
+ else
+ use_local_docs=no
+ fi
+else
+ enableval=no
+ use_local_docs=no
+
+fi;
+echo "$as_me:30892: result: $use_local_docs" >&5
+echo "${ECHO_T}$use_local_docs" >&6
+
+LYNXDOC_MAKE=''
+if test "$use_local_docs" = no ; then
+ LYNXDOC_MAKE='#'
+fi
+
+echo "$as_me:30900: checking for MIME library directory" >&5
+echo $ECHO_N "checking for MIME library directory... $ECHO_C" >&6
+
+# Check whether --with-mime-libdir or --without-mime-libdir was given.
+if test "${with_mime_libdir+set}" = set; then
+ withval="$with_mime_libdir"
+
+else
+ withval="${MIME_LIBDIR:-/etc}"
+fi; if true ; then
+
+if test "x$prefix" != xNONE; then
+ cf_path_syntax="$prefix"
+else
+ cf_path_syntax="$ac_default_prefix"
+fi
+
+case ".$withval" in
+(.\$\(*\)*|.\'*\'*)
+ ;;
+(..|./*|.\\*)
+ ;;
+(.[a-zA-Z]:[\\/]*) # OS/2 EMX
+ ;;
+(.\$\{*prefix\}*|.\$\{*dir\}*)
+ eval withval="$withval"
+ case ".$withval" in
+ (.NONE/*)
+ withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%`
+ ;;
+ esac
+ ;;
+(.no|.NONE/*)
+ withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%`
+ ;;
+(*)
+ { { echo "$as_me:30936: error: expected a pathname, not \"$withval\"" >&5
+echo "$as_me: error: expected a pathname, not \"$withval\"" >&2;}
+ { (exit 1); exit 1; }; }
+ ;;
+esac
+
+fi
+eval MIME_LIBDIR="$withval"
+
+echo "$as_me:30945: result: $MIME_LIBDIR" >&5
+echo "${ECHO_T}$MIME_LIBDIR" >&6
+MIME_LIBDIR=`echo "$MIME_LIBDIR" | sed -e 's,/$,,' -e 's,$,/,'`
+
+cat >>confdefs.h <<EOF
+#define MIME_LIBDIR "$MIME_LIBDIR"
+EOF
+
+echo "$as_me:30953: checking if locale-charset selection logic should be used" >&5
+echo $ECHO_N "checking if locale-charset selection logic should be used... $ECHO_C" >&6
+
+# Check whether --enable-locale-charset or --disable-locale-charset was given.
+if test "${enable_locale_charset+set}" = set; then
+ enableval="$enable_locale_charset"
+ test "$enableval" != no && enableval=yes
+ if test "$enableval" != "yes" ; then
+ use_locale_charset=$enableval
+ else
+ use_locale_charset=yes
+ fi
+else
+ enableval=yes
+ use_locale_charset=yes
+
+fi;
+echo "$as_me:30970: result: $use_locale_charset" >&5
+echo "${ECHO_T}$use_locale_charset" >&6
+test "$use_locale_charset" != no &&
+cat >>confdefs.h <<\EOF
+#define USE_LOCALE_CHARSET 1
+EOF
+
+CHARSET_DEFS=
+
+echo "$as_me:30979: checking if you want only a few charsets" >&5
+echo $ECHO_N "checking if you want only a few charsets... $ECHO_C" >&6
+
+# Check whether --with-charsets or --without-charsets was given.
+if test "${with_charsets+set}" = set; then
+ withval="$with_charsets"
+ cf_charsets=$withval
+else
+ cf_charsets=
+fi;
+
+if test -n "$cf_charsets" ; then
+ echo "$as_me:30991: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+
+cat >>confdefs.h <<\EOF
+#define ALL_CHARSETS 0
+EOF
+
+ cf_min_charsets=us-ascii,iso-8859-1,utf-8
+ if test "$cf_charsets" = "no" ; then
+ cf_charsets=minimal
+ fi
+ if test "$cf_charsets" = "minimal" ; then
+ test -n "$verbose" && echo " using minimal list of charsets: $cf_min_charsets" 1>&6
+
+echo "${as_me:-configure}:31005: testing using minimal list of charsets: $cf_min_charsets ..." 1>&5
+
+ fi
+ cf_charsets=`echo "$cf_charsets" | sed -e "s/minimal/$cf_min_charsets/g" -e 's/,/ /g'`
+ for cf_charset in $cf_charsets
+ do
+ cf_def_charset=`echo "$cf_charset" | sed -e 's/+/_/g' -e 's/-/_/g'`
+ cf_use_charset=no
+ # check charsets that are defined via .tbl files
+ if ( ${EGREP-egrep} '^M'"$cf_charset"'$' "$srcdir"/src/chrtrans/*.tbl 2>/dev/null >/dev/null )
+ then
+ cf_use_charset=yes
+ # check charsets that are "built-in"
+ else
+ for cf_tst_charset in big5 euc_cn euc_jp euc_kr shift_jis x_transparent
+ do
+ if test "$cf_tst_charset" = "$cf_def_charset"
+ then
+ cf_use_charset=yes
+ break
+ fi
+ done
+ fi
+ if test "$cf_use_charset" = yes
+ then
+ test -n "$verbose" && echo " found $cf_charset" 1>&6
+
+echo "${as_me:-configure}:31032: testing found $cf_charset ..." 1>&5
+
+ CHARSET_DEFS="-DNO_CHARSET_${cf_def_charset}=0 $CHARSET_DEFS"
+ else
+ test -n "$verbose" && echo " not found $cf_charset" 1>&6
+
+echo "${as_me:-configure}:31038: testing not found $cf_charset ..." 1>&5
+
+ fi
+ done
+else
+ echo "$as_me:31043: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+echo "$as_me:31047: checking whether exit is declared" >&5
+echo $ECHO_N "checking whether exit is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_exit+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 31053 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+#ifndef exit
+ char *p = (char *) exit;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:31068: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:31071: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:31074: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:31077: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_have_decl_exit=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_have_decl_exit=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:31087: result: $ac_cv_have_decl_exit" >&5
+echo "${ECHO_T}$ac_cv_have_decl_exit" >&6
+
+echo "$as_me:31090: checking whether time.h and sys/time.h may both be included" >&5
+echo $ECHO_N "checking whether time.h and sys/time.h may both be included... $ECHO_C" >&6
+if test "${ac_cv_header_time+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 31096 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <sys/time.h>
+#include <time.h>
+
+int
+main (void)
+{
+if ((struct tm *) 0)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:31112: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:31115: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:31118: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:31121: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_header_time=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_header_time=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:31131: result: $ac_cv_header_time" >&5
+echo "${ECHO_T}$ac_cv_header_time" >&6
+if test $ac_cv_header_time = yes; then
+
+cat >>confdefs.h <<\EOF
+#define TIME_WITH_SYS_TIME 1
+EOF
+
+fi
+
+ac_header_dirent=no
+for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do
+ as_ac_Header=`echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh`
+echo "$as_me:31144: checking for $ac_hdr that defines DIR" >&5
+echo $ECHO_N "checking for $ac_hdr that defines DIR... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 31150 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <$ac_hdr>
+
+int
+main (void)
+{
+if ((DIR *) 0)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:31165: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:31168: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:31171: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:31174: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ eval "$as_ac_Header=yes"
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+eval "$as_ac_Header=no"
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:31184: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
+if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
+ cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_hdr" | $as_tr_cpp` 1
+EOF
+
+ac_header_dirent=$ac_hdr; break
+fi
+
+done
+# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix.
+if test $ac_header_dirent = dirent.h; then
+ echo "$as_me:31197: checking for opendir in -ldir" >&5
+echo $ECHO_N "checking for opendir in -ldir... $ECHO_C" >&6
+if test "${ac_cv_lib_dir_opendir+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldir $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 31205 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char opendir ();
+int
+main (void)
+{
+opendir ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:31224: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:31227: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:31230: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:31233: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_lib_dir_opendir=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_dir_opendir=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:31244: result: $ac_cv_lib_dir_opendir" >&5
+echo "${ECHO_T}$ac_cv_lib_dir_opendir" >&6
+if test "$ac_cv_lib_dir_opendir" = yes; then
+ LIBS="$LIBS -ldir"
+fi
+
+else
+ echo "$as_me:31251: checking for opendir in -lx" >&5
+echo $ECHO_N "checking for opendir in -lx... $ECHO_C" >&6
+if test "${ac_cv_lib_x_opendir+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lx $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 31259 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char opendir ();
+int
+main (void)
+{
+opendir ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:31278: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:31281: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:31284: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:31287: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_lib_x_opendir=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_x_opendir=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:31298: result: $ac_cv_lib_x_opendir" >&5
+echo "${ECHO_T}$ac_cv_lib_x_opendir" >&6
+if test "$ac_cv_lib_x_opendir" = yes; then
+ LIBS="$LIBS -lx"
+fi
+
+fi
+
+for ac_header in \
+ arpa/inet.h \
+ fcntl.h \
+ limits.h \
+ sys/fcntl.h \
+ sys/filio.h \
+ sys/ioctl.h \
+ sys/param.h \
+ sys/timeb.h \
+ sys/time.h \
+ syslog.h \
+ termio.h \
+ termios.h \
+ vfork.h \
+ wchar.h \
+
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:31324: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 31330 "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:31334: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+ (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ $EGREP -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:31340: \$? = $ac_status" >&5
+ (exit "$ac_status"); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ eval "$as_ac_Header=yes"
+else
+ echo "$as_me: failed program was:" >&5
+ cat "conftest.$ac_ext" >&5
+ eval "$as_ac_Header=no"
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi
+echo "$as_me:31359: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
+if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
+ cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+echo "$as_me:31369: checking termio.h and termios.h" >&5
+echo $ECHO_N "checking termio.h and termios.h... $ECHO_C" >&6
+if test "${cf_cv_termio_and_termios+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 31376 "configure"
+#include "confdefs.h"
+
+#include <stdio.h>
+#if HAVE_TERMIO_H
+#include <termio.h>
+#endif
+#if HAVE_TERMIOS_H
+#include <termios.h>
+#endif
+int
+main (void)
+{
+putchar (0x0a)
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:31395: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:31398: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:31401: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:31404: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_termio_and_termios=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_termio_and_termios=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+
+echo "$as_me:31415: result: $cf_cv_termio_and_termios" >&5
+echo "${ECHO_T}$cf_cv_termio_and_termios" >&6
+test "$cf_cv_termio_and_termios" = no &&
+cat >>confdefs.h <<\EOF
+#define TERMIO_AND_TERMIOS 1
+EOF
+
+echo "$as_me:31422: checking for sigaction and structs" >&5
+echo $ECHO_N "checking for sigaction and structs... $ECHO_C" >&6
+if test "${cf_cv_func_sigaction+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 31429 "configure"
+#include "confdefs.h"
+
+#include <sys/types.h>
+#include <signal.h>
+int
+main (void)
+{
+struct sigaction act;
+ act.sa_handler = SIG_DFL;
+#ifdef SA_RESTART
+ act.sa_flags = SA_RESTART;
+#endif /* SA_RESTART */
+ sigaction(1, &act, 0);
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:31449: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:31452: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:31455: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:31458: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_func_sigaction=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_func_sigaction=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:31469: result: $cf_cv_func_sigaction" >&5
+echo "${ECHO_T}$cf_cv_func_sigaction" >&6
+test "$cf_cv_func_sigaction" = yes &&
+cat >>confdefs.h <<\EOF
+#define HAVE_SIGACTION 1
+EOF
+
+for ac_header in sys/wait.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:31479: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 31485 "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:31489: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+ (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ $EGREP -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:31495: \$? = $ac_status" >&5
+ (exit "$ac_status"); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ eval "$as_ac_Header=yes"
+else
+ echo "$as_me: failed program was:" >&5
+ cat "conftest.$ac_ext" >&5
+ eval "$as_ac_Header=no"
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi
+echo "$as_me:31514: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
+if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
+ cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+cf_wait_headers="#include <sys/types.h>
+"
+if test "$ac_cv_header_sys_wait_h" = yes; then
+cf_wait_headers="$cf_wait_headers
+#include <sys/wait.h>
+"
+else
+
+for ac_header in wait.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:31535: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 31541 "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:31545: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+ (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ $EGREP -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:31551: \$? = $ac_status" >&5
+ (exit "$ac_status"); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ eval "$as_ac_Header=yes"
+else
+ echo "$as_me: failed program was:" >&5
+ cat "conftest.$ac_ext" >&5
+ eval "$as_ac_Header=no"
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi
+echo "$as_me:31570: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
+if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
+ cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+for ac_header in waitstatus.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:31583: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 31589 "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:31593: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+ (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ $EGREP -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:31599: \$? = $ac_status" >&5
+ (exit "$ac_status"); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ eval "$as_ac_Header=yes"
+else
+ echo "$as_me: failed program was:" >&5
+ cat "conftest.$ac_ext" >&5
+ eval "$as_ac_Header=no"
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi
+echo "$as_me:31618: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
+if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
+ cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+if test "$ac_cv_header_wait_h" = yes; then
+cf_wait_headers="$cf_wait_headers
+#include <wait.h>
+"
+fi
+if test "$ac_cv_header_waitstatus_h" = yes; then
+cf_wait_headers="$cf_wait_headers
+#include <waitstatus.h>
+"
+fi
+fi
+
+echo "$as_me:31640: checking for union wait" >&5
+echo $ECHO_N "checking for union wait... $ECHO_C" >&6
+if test "${cf_cv_type_unionwait+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 31647 "configure"
+#include "confdefs.h"
+$cf_wait_headers
+int
+main (void)
+{
+static int x;
+ int y = WEXITSTATUS(x);
+ int z = WTERMSIG(x);
+ wait(&x);
+ (void)x;
+ (void)y;
+ (void)z;
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:31666: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:31669: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:31672: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:31675: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_type_unionwait=no
+ echo compiles ok w/o union wait 1>&5
+
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 31685 "configure"
+#include "confdefs.h"
+$cf_wait_headers
+int
+main (void)
+{
+union wait x;
+#ifdef WEXITSTATUS
+ int y = WEXITSTATUS(x);
+#endif
+#ifdef WTERMSIG
+ int z = WTERMSIG(x);
+#endif
+ wait(&x);
+ (void)x;
+#ifdef WEXITSTATUS
+ (void)y;
+#endif
+#ifdef WTERMSIG
+ (void)z;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:31712: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:31715: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:31718: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:31721: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_type_unionwait=yes
+ echo compiles ok with union wait and possibly macros too 1>&5
+
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_type_unionwait=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+
+echo "$as_me:31736: result: $cf_cv_type_unionwait" >&5
+echo "${ECHO_T}$cf_cv_type_unionwait" >&6
+test "$cf_cv_type_unionwait" = yes &&
+cat >>confdefs.h <<\EOF
+#define HAVE_TYPE_UNIONWAIT 1
+EOF
+
+if test "$cf_cv_type_unionwait" = yes; then
+
+ echo "$as_me:31745: checking if union wait can be used as wait-arg" >&5
+echo $ECHO_N "checking if union wait can be used as wait-arg... $ECHO_C" >&6
+ if test "${cf_cv_arg_union_wait+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 31752 "configure"
+#include "confdefs.h"
+$cf_wait_headers
+int
+main (void)
+{
+union wait x; wait(&x)
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:31764: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:31767: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:31770: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:31773: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_arg_union_wait=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_arg_union_wait=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+
+ echo "$as_me:31785: result: $cf_cv_arg_union_wait" >&5
+echo "${ECHO_T}$cf_cv_arg_union_wait" >&6
+ test "$cf_cv_arg_union_wait" = yes &&
+cat >>confdefs.h <<\EOF
+#define WAIT_USES_UNION 1
+EOF
+
+ echo "$as_me:31792: checking if union wait can be used as waitpid-arg" >&5
+echo $ECHO_N "checking if union wait can be used as waitpid-arg... $ECHO_C" >&6
+ if test "${cf_cv_arg_union_waitpid+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 31799 "configure"
+#include "confdefs.h"
+$cf_wait_headers
+int
+main (void)
+{
+union wait x; waitpid(0, &x, 0)
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:31811: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:31814: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:31817: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:31820: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_arg_union_waitpid=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_arg_union_waitpid=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+
+ echo "$as_me:31832: result: $cf_cv_arg_union_waitpid" >&5
+echo "${ECHO_T}$cf_cv_arg_union_waitpid" >&6
+ test "$cf_cv_arg_union_waitpid" = yes &&
+cat >>confdefs.h <<\EOF
+#define WAITPID_USES_UNION 1
+EOF
+
+fi
+
+echo "$as_me:31841: checking for uid_t in sys/types.h" >&5
+echo $ECHO_N "checking for uid_t in sys/types.h... $ECHO_C" >&6
+if test "${ac_cv_type_uid_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 31847 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "uid_t" >/dev/null 2>&1; then
+ ac_cv_type_uid_t=yes
+else
+ ac_cv_type_uid_t=no
+fi
+rm -rf conftest*
+
+fi
+echo "$as_me:31861: result: $ac_cv_type_uid_t" >&5
+echo "${ECHO_T}$ac_cv_type_uid_t" >&6
+if test $ac_cv_type_uid_t = no; then
+
+cat >>confdefs.h <<\EOF
+#define uid_t int
+EOF
+
+cat >>confdefs.h <<\EOF
+#define gid_t int
+EOF
+
+fi
+
+echo "$as_me:31875: checking type of array argument to getgroups" >&5
+echo $ECHO_N "checking type of array argument to getgroups... $ECHO_C" >&6
+if test "${ac_cv_type_getgroups+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then
+ ac_cv_type_getgroups=cross
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 31884 "configure"
+#include "confdefs.h"
+$ac_includes_default
+/* Thanks to Mike Rendell for this test. */
+#include <sys/types.h>
+#define NGID 256
+#undef MAX
+#define MAX(x, y) ((x) > (y) ? (x) : (y))
+
+int
+main (void)
+{
+ gid_t gidset[NGID];
+ int i, n;
+ union { gid_t gval; long lval; } val;
+
+ val.lval = -1;
+ for (i = 0; i < NGID; i++)
+ gidset[i] = val.gval;
+ n = getgroups (sizeof (gidset) / MAX (sizeof (int), sizeof (gid_t)) - 1,
+ gidset);
+ /* Exit non-zero if getgroups seems to require an array of ints. This
+ happens when gid_t is short but getgroups modifies an array of ints. */
+ $ac_main_return ((n > 0 && gidset[n] != val.gval) ? 1 : 0);
+}
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:31911: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:31914: \$? = $ac_status" >&5
+ (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+ { (eval echo "$as_me:31916: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:31919: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_type_getgroups=gid_t
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_type_getgroups=int
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+if test $ac_cv_type_getgroups = cross; then
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 31932 "configure"
+#include "confdefs.h"
+#include <unistd.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "getgroups.*int.*gid_t" >/dev/null 2>&1; then
+ ac_cv_type_getgroups=gid_t
+else
+ ac_cv_type_getgroups=int
+fi
+rm -rf conftest*
+
+fi
+fi
+echo "$as_me:31947: result: $ac_cv_type_getgroups" >&5
+echo "${ECHO_T}$ac_cv_type_getgroups" >&6
+
+cat >>confdefs.h <<EOF
+#define GETGROUPS_T $ac_cv_type_getgroups
+EOF
+
+echo "$as_me:31954: checking for off_t" >&5
+echo $ECHO_N "checking for off_t... $ECHO_C" >&6
+if test "${ac_cv_type_off_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 31960 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+if ((off_t *) 0)
+ return 0;
+if (sizeof (off_t))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:31975: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:31978: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:31981: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:31984: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_type_off_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_type_off_t=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:31994: result: $ac_cv_type_off_t" >&5
+echo "${ECHO_T}$ac_cv_type_off_t" >&6
+if test "$ac_cv_type_off_t" = yes; then
+ :
+else
+
+cat >>confdefs.h <<EOF
+#define off_t long
+EOF
+
+fi
+
+echo "$as_me:32006: checking for pid_t" >&5
+echo $ECHO_N "checking for pid_t... $ECHO_C" >&6
+if test "${ac_cv_type_pid_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 32012 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+if ((pid_t *) 0)
+ return 0;
+if (sizeof (pid_t))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:32027: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:32030: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:32033: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:32036: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_type_pid_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_type_pid_t=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:32046: result: $ac_cv_type_pid_t" >&5
+echo "${ECHO_T}$ac_cv_type_pid_t" >&6
+if test "$ac_cv_type_pid_t" = yes; then
+ :
+else
+
+cat >>confdefs.h <<EOF
+#define pid_t int
+EOF
+
+fi
+
+echo "$as_me:32058: checking for uid_t in sys/types.h" >&5
+echo $ECHO_N "checking for uid_t in sys/types.h... $ECHO_C" >&6
+if test "${ac_cv_type_uid_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 32064 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "uid_t" >/dev/null 2>&1; then
+ ac_cv_type_uid_t=yes
+else
+ ac_cv_type_uid_t=no
+fi
+rm -rf conftest*
+
+fi
+echo "$as_me:32078: result: $ac_cv_type_uid_t" >&5
+echo "${ECHO_T}$ac_cv_type_uid_t" >&6
+if test $ac_cv_type_uid_t = no; then
+
+cat >>confdefs.h <<\EOF
+#define uid_t int
+EOF
+
+cat >>confdefs.h <<\EOF
+#define gid_t int
+EOF
+
+fi
+
+echo "$as_me:32092: checking for mode_t" >&5
+echo $ECHO_N "checking for mode_t... $ECHO_C" >&6
+if test "${ac_cv_type_mode_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 32098 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+if ((mode_t *) 0)
+ return 0;
+if (sizeof (mode_t))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:32113: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:32116: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:32119: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:32122: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_type_mode_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_type_mode_t=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:32132: result: $ac_cv_type_mode_t" >&5
+echo "${ECHO_T}$ac_cv_type_mode_t" >&6
+if test "$ac_cv_type_mode_t" = yes; then
+ :
+else
+
+cat >>confdefs.h <<EOF
+#define mode_t int
+EOF
+
+fi
+
+ echo "$as_me:32144: checking for ssize_t" >&5
+echo $ECHO_N "checking for ssize_t... $ECHO_C" >&6
+if test "${ac_cv_type_ssize_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 32150 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+if ((ssize_t *) 0)
+ return 0;
+if (sizeof (ssize_t))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:32165: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:32168: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:32171: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:32174: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_type_ssize_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_type_ssize_t=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:32184: result: $ac_cv_type_ssize_t" >&5
+echo "${ECHO_T}$ac_cv_type_ssize_t" >&6
+if test "$ac_cv_type_ssize_t" = yes; then
+ ac_cv_type_ssize_t=yes
+else
+ ac_cv_type_ssize_t=no
+fi
+
+ if test "$ac_cv_type_ssize_t" = no; then
+
+cat >>confdefs.h <<\EOF
+#define ssize_t int
+EOF
+
+fi
+
+ echo "$as_me:32200: checking for socklen_t" >&5
+echo $ECHO_N "checking for socklen_t... $ECHO_C" >&6
+if test "${ac_cv_type_socklen_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 32206 "configure"
+#include "confdefs.h"
+
+#include <sys/types.h>
+#include <sys/socket.h>
+
+int
+main (void)
+{
+if ((socklen_t *) 0)
+ return 0;
+if (sizeof (socklen_t))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:32224: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:32227: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:32230: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:32233: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_type_socklen_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_type_socklen_t=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:32243: result: $ac_cv_type_socklen_t" >&5
+echo "${ECHO_T}$ac_cv_type_socklen_t" >&6
+if test "$ac_cv_type_socklen_t" = yes; then
+ ac_cv_type_socklen_t=yes
+else
+ ac_cv_type_socklen_t=no
+fi
+
+ if test "$ac_cv_type_socklen_t" = no; then
+
+cat >>confdefs.h <<\EOF
+#define socklen_t int
+EOF
+
+fi
+
+echo "$as_me:32259: checking for long long type" >&5
+echo $ECHO_N "checking for long long type... $ECHO_C" >&6
+if test "${cf_cv_type_long_long+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cat >conftest.$ac_ext <<_CFEOF
+#include "confdefs.h"
+int
+main (void)
+{
+ long long foo = 123456789123456789LL;
+ return (foo == 0);
+}
+_CFEOF
+ (eval "$ac_compile") 2>conftest.err
+ ac_status=$?
+ if test "$ac_status" = 0 && test -s conftest.err
+ then
+ ${FGREP-fgrep} warning conftest.err >/dev/null 2>&1 && ac_status=1
+ fi
+ if test "$ac_status" != 0
+ then
+ cf_cv_type_long_long=no
+ else
+ cf_cv_type_long_long=yes
+ fi
+ test -s conftest.err && cat conftest.err >&5
+ rm -f conftest*
+
+fi
+echo "$as_me:32290: result: $cf_cv_type_long_long" >&5
+echo "${ECHO_T}$cf_cv_type_long_long" >&6
+
+if test "$cf_cv_type_long_long" = yes ; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_LONG_LONG 1
+EOF
+
+fi
+
+echo "$as_me:32301: checking for tm.tm_gmtoff" >&5
+echo $ECHO_N "checking for tm.tm_gmtoff... $ECHO_C" >&6
+if test "${cf_cv_tm_gmtoff+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 32308 "configure"
+#include "confdefs.h"
+
+#ifdef TIME_WITH_SYS_TIME
+# include <sys/time.h>
+# include <time.h>
+#else
+# ifdef HAVE_SYS_TIME_H
+# include <sys/time.h>
+# else
+# include <time.h>
+# endif
+#endif
+
+int
+main (void)
+{
+
+ static struct tm foo;
+ long bar = foo.tm_gmtoff; (void) bar
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:32333: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:32336: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:32339: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:32342: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_tm_gmtoff=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_tm_gmtoff=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+
+echo "$as_me:32353: result: $cf_cv_tm_gmtoff" >&5
+echo "${ECHO_T}$cf_cv_tm_gmtoff" >&6
+test "$cf_cv_tm_gmtoff" = no &&
+cat >>confdefs.h <<\EOF
+#define DONT_HAVE_TM_GMTOFF 1
+EOF
+
+echo "$as_me:32360: checking for int" >&5
+echo $ECHO_N "checking for int... $ECHO_C" >&6
+if test "${ac_cv_type_int+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 32366 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+if ((int *) 0)
+ return 0;
+if (sizeof (int))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:32381: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:32384: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:32387: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:32390: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_type_int=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_type_int=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:32400: result: $ac_cv_type_int" >&5
+echo "${ECHO_T}$ac_cv_type_int" >&6
+
+echo "$as_me:32403: checking size of int" >&5
+echo $ECHO_N "checking size of int... $ECHO_C" >&6
+if test "${ac_cv_sizeof_int+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$ac_cv_type_int" = yes; then
+ if test "$cross_compiling" = yes; then
+ # Depending upon the size, compute the lo and hi bounds.
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 32412 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+int _array_ [1 - 2 * !((sizeof (int)) >= 0)]
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:32424: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:32427: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:32430: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:32433: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_lo=0 ac_mid=0
+ while :; do
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 32438 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+int _array_ [1 - 2 * !((sizeof (int)) <= $ac_mid)]
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:32450: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:32453: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:32456: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:32459: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_hi=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_lo=`expr "$ac_mid" + 1`; ac_mid=`expr 2 '*' "$ac_mid" + 1`
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ done
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_hi=-1 ac_mid=-1
+ while :; do
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 32475 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+int _array_ [1 - 2 * !((sizeof (int)) >= $ac_mid)]
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:32487: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:32490: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:32493: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:32496: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_lo=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_hi=`expr "$ac_mid" - 1`; ac_mid=`expr 2 '*' "$ac_mid"`
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ done
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+ ac_mid=`expr '(' "$ac_hi" - "$ac_lo" ')' / 2 + "$ac_lo"`
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 32512 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+int _array_ [1 - 2 * !((sizeof (int)) <= $ac_mid)]
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:32524: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:32527: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:32530: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:32533: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_hi=$ac_mid
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_lo=`expr "$ac_mid" + 1`
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+done
+ac_cv_sizeof_int=$ac_lo
+else
+ if test "$cross_compiling" = yes; then
+ { { echo "$as_me:32546: error: cannot run test program while cross compiling" >&5
+echo "$as_me: error: cannot run test program while cross compiling" >&2;}
+ { (exit 1); exit 1; }; }
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 32551 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+FILE *f = fopen ("conftest.val", "w");
+if (!f)
+ $ac_main_return (1);
+fprintf (f, "%ld", (long)(sizeof (int)));
+fclose (f);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:32567: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:32570: \$? = $ac_status" >&5
+ (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+ { (eval echo "$as_me:32572: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:32575: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_sizeof_int=`cat conftest.val`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+fi
+rm -f conftest.val
+else
+ ac_cv_sizeof_int=0
+fi
+fi
+echo "$as_me:32591: result: $ac_cv_sizeof_int" >&5
+echo "${ECHO_T}$ac_cv_sizeof_int" >&6
+cat >>confdefs.h <<EOF
+#define SIZEOF_INT $ac_cv_sizeof_int
+EOF
+
+if test "${ac_cv_type_int+set}" = set; then
+ cf_cv_sizeof="$ac_cv_sizeof_int"
+ if test "${ac_cv_sizeof_int+set}" != set; then
+ { echo "$as_me:32600: WARNING: using 4 for sizeof int" >&5
+echo "$as_me: WARNING: using 4 for sizeof int" >&2;}
+ ac_cv_sizeof_int=4
+ elif test "x${ac_cv_sizeof_int}" = x0; then
+ { echo "$as_me:32604: WARNING: sizeof int not found, using 4" >&5
+echo "$as_me: WARNING: sizeof int not found, using 4" >&2;}
+ ac_cv_sizeof_int=4
+ fi
+ if test "x$ac_cv_sizeof_int" != "x$cf_cv_sizeof"
+ then
+
+cf_cv_type=`echo "sizeof_int" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+ sed -e "s/\\([ ]${cf_cv_type}[ ]\\).*/\\1$ac_cv_sizeof_int/" confdefs.h >conftest.val
+ mv conftest.val confdefs.h
+ fi
+fi
+
+echo "$as_me:32618: checking for long" >&5
+echo $ECHO_N "checking for long... $ECHO_C" >&6
+if test "${ac_cv_type_long+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 32624 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+if ((long *) 0)
+ return 0;
+if (sizeof (long))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:32639: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:32642: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:32645: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:32648: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_type_long=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_type_long=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:32658: result: $ac_cv_type_long" >&5
+echo "${ECHO_T}$ac_cv_type_long" >&6
+
+echo "$as_me:32661: checking size of long" >&5
+echo $ECHO_N "checking size of long... $ECHO_C" >&6
+if test "${ac_cv_sizeof_long+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$ac_cv_type_long" = yes; then
+ if test "$cross_compiling" = yes; then
+ # Depending upon the size, compute the lo and hi bounds.
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 32670 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+int _array_ [1 - 2 * !((sizeof (long)) >= 0)]
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:32682: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:32685: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:32688: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:32691: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_lo=0 ac_mid=0
+ while :; do
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 32696 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+int _array_ [1 - 2 * !((sizeof (long)) <= $ac_mid)]
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:32708: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:32711: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:32714: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:32717: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_hi=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_lo=`expr "$ac_mid" + 1`; ac_mid=`expr 2 '*' "$ac_mid" + 1`
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ done
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_hi=-1 ac_mid=-1
+ while :; do
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 32733 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+int _array_ [1 - 2 * !((sizeof (long)) >= $ac_mid)]
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:32745: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:32748: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:32751: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:32754: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_lo=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_hi=`expr "$ac_mid" - 1`; ac_mid=`expr 2 '*' "$ac_mid"`
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ done
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+ ac_mid=`expr '(' "$ac_hi" - "$ac_lo" ')' / 2 + "$ac_lo"`
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 32770 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+int _array_ [1 - 2 * !((sizeof (long)) <= $ac_mid)]
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:32782: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:32785: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:32788: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:32791: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_hi=$ac_mid
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_lo=`expr "$ac_mid" + 1`
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+done
+ac_cv_sizeof_long=$ac_lo
+else
+ if test "$cross_compiling" = yes; then
+ { { echo "$as_me:32804: error: cannot run test program while cross compiling" >&5
+echo "$as_me: error: cannot run test program while cross compiling" >&2;}
+ { (exit 1); exit 1; }; }
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 32809 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+FILE *f = fopen ("conftest.val", "w");
+if (!f)
+ $ac_main_return (1);
+fprintf (f, "%ld", (long)(sizeof (long)));
+fclose (f);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:32825: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:32828: \$? = $ac_status" >&5
+ (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+ { (eval echo "$as_me:32830: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:32833: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_sizeof_long=`cat conftest.val`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+fi
+rm -f conftest.val
+else
+ ac_cv_sizeof_long=0
+fi
+fi
+echo "$as_me:32849: result: $ac_cv_sizeof_long" >&5
+echo "${ECHO_T}$ac_cv_sizeof_long" >&6
+cat >>confdefs.h <<EOF
+#define SIZEOF_LONG $ac_cv_sizeof_long
+EOF
+
+if test "${ac_cv_type_long+set}" = set; then
+ cf_cv_sizeof="$ac_cv_sizeof_long"
+ if test "${ac_cv_sizeof_long+set}" != set; then
+ { echo "$as_me:32858: WARNING: using 4 for sizeof long" >&5
+echo "$as_me: WARNING: using 4 for sizeof long" >&2;}
+ ac_cv_sizeof_long=4
+ elif test "x${ac_cv_sizeof_long}" = x0; then
+ { echo "$as_me:32862: WARNING: sizeof long not found, using 4" >&5
+echo "$as_me: WARNING: sizeof long not found, using 4" >&2;}
+ ac_cv_sizeof_long=4
+ fi
+ if test "x$ac_cv_sizeof_long" != "x$cf_cv_sizeof"
+ then
+
+cf_cv_type=`echo "sizeof_long" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+ sed -e "s/\\([ ]${cf_cv_type}[ ]\\).*/\\1$ac_cv_sizeof_long/" confdefs.h >conftest.val
+ mv conftest.val confdefs.h
+ fi
+fi
+
+echo "$as_me:32876: checking for off_t" >&5
+echo $ECHO_N "checking for off_t... $ECHO_C" >&6
+if test "${ac_cv_type_off_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 32882 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+if ((off_t *) 0)
+ return 0;
+if (sizeof (off_t))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:32897: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:32900: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:32903: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:32906: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_type_off_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_type_off_t=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:32916: result: $ac_cv_type_off_t" >&5
+echo "${ECHO_T}$ac_cv_type_off_t" >&6
+
+echo "$as_me:32919: checking size of off_t" >&5
+echo $ECHO_N "checking size of off_t... $ECHO_C" >&6
+if test "${ac_cv_sizeof_off_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$ac_cv_type_off_t" = yes; then
+ if test "$cross_compiling" = yes; then
+ # Depending upon the size, compute the lo and hi bounds.
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 32928 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+int _array_ [1 - 2 * !((sizeof (off_t)) >= 0)]
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:32940: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:32943: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:32946: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:32949: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_lo=0 ac_mid=0
+ while :; do
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 32954 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+int _array_ [1 - 2 * !((sizeof (off_t)) <= $ac_mid)]
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:32966: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:32969: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:32972: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:32975: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_hi=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_lo=`expr "$ac_mid" + 1`; ac_mid=`expr 2 '*' "$ac_mid" + 1`
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ done
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_hi=-1 ac_mid=-1
+ while :; do
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 32991 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+int _array_ [1 - 2 * !((sizeof (off_t)) >= $ac_mid)]
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:33003: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:33006: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:33009: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:33012: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_lo=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_hi=`expr "$ac_mid" - 1`; ac_mid=`expr 2 '*' "$ac_mid"`
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ done
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+ ac_mid=`expr '(' "$ac_hi" - "$ac_lo" ')' / 2 + "$ac_lo"`
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 33028 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+int _array_ [1 - 2 * !((sizeof (off_t)) <= $ac_mid)]
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:33040: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:33043: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:33046: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:33049: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_hi=$ac_mid
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_lo=`expr "$ac_mid" + 1`
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+done
+ac_cv_sizeof_off_t=$ac_lo
+else
+ if test "$cross_compiling" = yes; then
+ { { echo "$as_me:33062: error: cannot run test program while cross compiling" >&5
+echo "$as_me: error: cannot run test program while cross compiling" >&2;}
+ { (exit 1); exit 1; }; }
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 33067 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+FILE *f = fopen ("conftest.val", "w");
+if (!f)
+ $ac_main_return (1);
+fprintf (f, "%ld", (long)(sizeof (off_t)));
+fclose (f);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:33083: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:33086: \$? = $ac_status" >&5
+ (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+ { (eval echo "$as_me:33088: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:33091: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_sizeof_off_t=`cat conftest.val`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+fi
+rm -f conftest.val
+else
+ ac_cv_sizeof_off_t=0
+fi
+fi
+echo "$as_me:33107: result: $ac_cv_sizeof_off_t" >&5
+echo "${ECHO_T}$ac_cv_sizeof_off_t" >&6
+cat >>confdefs.h <<EOF
+#define SIZEOF_OFF_T $ac_cv_sizeof_off_t
+EOF
+
+if test "${ac_cv_type_off_t+set}" = set; then
+ cf_cv_sizeof="$ac_cv_sizeof_off_t"
+ if test "${ac_cv_sizeof_off_t+set}" != set; then
+ { echo "$as_me:33116: WARNING: using 4 for sizeof off_t" >&5
+echo "$as_me: WARNING: using 4 for sizeof off_t" >&2;}
+ ac_cv_sizeof_off_t=4
+ elif test "x${ac_cv_sizeof_off_t}" = x0; then
+ { echo "$as_me:33120: WARNING: sizeof off_t not found, using 4" >&5
+echo "$as_me: WARNING: sizeof off_t not found, using 4" >&2;}
+ ac_cv_sizeof_off_t=4
+ fi
+ if test "x$ac_cv_sizeof_off_t" != "x$cf_cv_sizeof"
+ then
+
+cf_cv_type=`echo "sizeof_off_t" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+ sed -e "s/\\([ ]${cf_cv_type}[ ]\\).*/\\1$ac_cv_sizeof_off_t/" confdefs.h >conftest.val
+ mv conftest.val confdefs.h
+ fi
+fi
+
+echo "$as_me:33134: checking for size_t" >&5
+echo $ECHO_N "checking for size_t... $ECHO_C" >&6
+if test "${ac_cv_type_size_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 33140 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+if ((size_t *) 0)
+ return 0;
+if (sizeof (size_t))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:33155: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:33158: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:33161: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:33164: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_type_size_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_type_size_t=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:33174: result: $ac_cv_type_size_t" >&5
+echo "${ECHO_T}$ac_cv_type_size_t" >&6
+
+echo "$as_me:33177: checking size of size_t" >&5
+echo $ECHO_N "checking size of size_t... $ECHO_C" >&6
+if test "${ac_cv_sizeof_size_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$ac_cv_type_size_t" = yes; then
+ if test "$cross_compiling" = yes; then
+ # Depending upon the size, compute the lo and hi bounds.
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 33186 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+int _array_ [1 - 2 * !((sizeof (size_t)) >= 0)]
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:33198: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:33201: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:33204: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:33207: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_lo=0 ac_mid=0
+ while :; do
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 33212 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+int _array_ [1 - 2 * !((sizeof (size_t)) <= $ac_mid)]
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:33224: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:33227: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:33230: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:33233: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_hi=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_lo=`expr "$ac_mid" + 1`; ac_mid=`expr 2 '*' "$ac_mid" + 1`
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ done
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_hi=-1 ac_mid=-1
+ while :; do
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 33249 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+int _array_ [1 - 2 * !((sizeof (size_t)) >= $ac_mid)]
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:33261: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:33264: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:33267: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:33270: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_lo=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_hi=`expr "$ac_mid" - 1`; ac_mid=`expr 2 '*' "$ac_mid"`
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ done
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+ ac_mid=`expr '(' "$ac_hi" - "$ac_lo" ')' / 2 + "$ac_lo"`
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 33286 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+int _array_ [1 - 2 * !((sizeof (size_t)) <= $ac_mid)]
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:33298: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:33301: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:33304: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:33307: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_hi=$ac_mid
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_lo=`expr "$ac_mid" + 1`
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+done
+ac_cv_sizeof_size_t=$ac_lo
+else
+ if test "$cross_compiling" = yes; then
+ { { echo "$as_me:33320: error: cannot run test program while cross compiling" >&5
+echo "$as_me: error: cannot run test program while cross compiling" >&2;}
+ { (exit 1); exit 1; }; }
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 33325 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+FILE *f = fopen ("conftest.val", "w");
+if (!f)
+ $ac_main_return (1);
+fprintf (f, "%ld", (long)(sizeof (size_t)));
+fclose (f);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:33341: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:33344: \$? = $ac_status" >&5
+ (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+ { (eval echo "$as_me:33346: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:33349: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_sizeof_size_t=`cat conftest.val`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+fi
+rm -f conftest.val
+else
+ ac_cv_sizeof_size_t=0
+fi
+fi
+echo "$as_me:33365: result: $ac_cv_sizeof_size_t" >&5
+echo "${ECHO_T}$ac_cv_sizeof_size_t" >&6
+cat >>confdefs.h <<EOF
+#define SIZEOF_SIZE_T $ac_cv_sizeof_size_t
+EOF
+
+if test "${ac_cv_type_size_t+set}" = set; then
+ cf_cv_sizeof="$ac_cv_sizeof_size_t"
+ if test "${ac_cv_sizeof_size_t+set}" != set; then
+ { echo "$as_me:33374: WARNING: using 4 for sizeof size_t" >&5
+echo "$as_me: WARNING: using 4 for sizeof size_t" >&2;}
+ ac_cv_sizeof_size_t=4
+ elif test "x${ac_cv_sizeof_size_t}" = x0; then
+ { echo "$as_me:33378: WARNING: sizeof size_t not found, using 4" >&5
+echo "$as_me: WARNING: sizeof size_t not found, using 4" >&2;}
+ ac_cv_sizeof_size_t=4
+ fi
+ if test "x$ac_cv_sizeof_size_t" != "x$cf_cv_sizeof"
+ then
+
+cf_cv_type=`echo "sizeof_size_t" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+ sed -e "s/\\([ ]${cf_cv_type}[ ]\\).*/\\1$ac_cv_sizeof_size_t/" confdefs.h >conftest.val
+ mv conftest.val confdefs.h
+ fi
+fi
+
+echo "$as_me:33392: checking for time_t" >&5
+echo $ECHO_N "checking for time_t... $ECHO_C" >&6
+if test "${ac_cv_type_time_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 33398 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+if ((time_t *) 0)
+ return 0;
+if (sizeof (time_t))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:33413: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:33416: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:33419: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:33422: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_type_time_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_type_time_t=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:33432: result: $ac_cv_type_time_t" >&5
+echo "${ECHO_T}$ac_cv_type_time_t" >&6
+
+echo "$as_me:33435: checking size of time_t" >&5
+echo $ECHO_N "checking size of time_t... $ECHO_C" >&6
+if test "${ac_cv_sizeof_time_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$ac_cv_type_time_t" = yes; then
+ if test "$cross_compiling" = yes; then
+ # Depending upon the size, compute the lo and hi bounds.
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 33444 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+int _array_ [1 - 2 * !((sizeof (time_t)) >= 0)]
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:33456: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:33459: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:33462: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:33465: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_lo=0 ac_mid=0
+ while :; do
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 33470 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+int _array_ [1 - 2 * !((sizeof (time_t)) <= $ac_mid)]
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:33482: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:33485: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:33488: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:33491: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_hi=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_lo=`expr "$ac_mid" + 1`; ac_mid=`expr 2 '*' "$ac_mid" + 1`
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ done
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_hi=-1 ac_mid=-1
+ while :; do
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 33507 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+int _array_ [1 - 2 * !((sizeof (time_t)) >= $ac_mid)]
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:33519: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:33522: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:33525: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:33528: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_lo=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_hi=`expr "$ac_mid" - 1`; ac_mid=`expr 2 '*' "$ac_mid"`
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ done
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+ ac_mid=`expr '(' "$ac_hi" - "$ac_lo" ')' / 2 + "$ac_lo"`
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 33544 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+int _array_ [1 - 2 * !((sizeof (time_t)) <= $ac_mid)]
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:33556: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:33559: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:33562: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:33565: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_hi=$ac_mid
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_lo=`expr "$ac_mid" + 1`
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+done
+ac_cv_sizeof_time_t=$ac_lo
+else
+ if test "$cross_compiling" = yes; then
+ { { echo "$as_me:33578: error: cannot run test program while cross compiling" >&5
+echo "$as_me: error: cannot run test program while cross compiling" >&2;}
+ { (exit 1); exit 1; }; }
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 33583 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+FILE *f = fopen ("conftest.val", "w");
+if (!f)
+ $ac_main_return (1);
+fprintf (f, "%ld", (long)(sizeof (time_t)));
+fclose (f);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:33599: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:33602: \$? = $ac_status" >&5
+ (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+ { (eval echo "$as_me:33604: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:33607: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_sizeof_time_t=`cat conftest.val`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+fi
+rm -f conftest.val
+else
+ ac_cv_sizeof_time_t=0
+fi
+fi
+echo "$as_me:33623: result: $ac_cv_sizeof_time_t" >&5
+echo "${ECHO_T}$ac_cv_sizeof_time_t" >&6
+cat >>confdefs.h <<EOF
+#define SIZEOF_TIME_T $ac_cv_sizeof_time_t
+EOF
+
+if test "${ac_cv_type_time_t+set}" = set; then
+ cf_cv_sizeof="$ac_cv_sizeof_time_t"
+ if test "${ac_cv_sizeof_time_t+set}" != set; then
+ { echo "$as_me:33632: WARNING: using 4 for sizeof time_t" >&5
+echo "$as_me: WARNING: using 4 for sizeof time_t" >&2;}
+ ac_cv_sizeof_time_t=4
+ elif test "x${ac_cv_sizeof_time_t}" = x0; then
+ { echo "$as_me:33636: WARNING: sizeof time_t not found, using 4" >&5
+echo "$as_me: WARNING: sizeof time_t not found, using 4" >&2;}
+ ac_cv_sizeof_time_t=4
+ fi
+ if test "x$ac_cv_sizeof_time_t" != "x$cf_cv_sizeof"
+ then
+
+cf_cv_type=`echo "sizeof_time_t" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+ sed -e "s/\\([ ]${cf_cv_type}[ ]\\).*/\\1$ac_cv_sizeof_time_t/" confdefs.h >conftest.val
+ mv conftest.val confdefs.h
+ fi
+fi
+
+echo "$as_me:33650: checking for intptr_t" >&5
+echo $ECHO_N "checking for intptr_t... $ECHO_C" >&6
+if test "${ac_cv_type_intptr_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 33656 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+if ((intptr_t *) 0)
+ return 0;
+if (sizeof (intptr_t))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:33671: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:33674: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:33677: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:33680: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_type_intptr_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_type_intptr_t=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:33690: result: $ac_cv_type_intptr_t" >&5
+echo "${ECHO_T}$ac_cv_type_intptr_t" >&6
+if test "$ac_cv_type_intptr_t" = yes; then
+ :
+else
+
+cat >>confdefs.h <<EOF
+#define intptr_t long
+EOF
+
+fi
+
+# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
+# for constant arguments. Useless!
+echo "$as_me:33704: checking for working alloca.h" >&5
+echo $ECHO_N "checking for working alloca.h... $ECHO_C" >&6
+if test "${ac_cv_working_alloca_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 33710 "configure"
+#include "confdefs.h"
+#include <alloca.h>
+int
+main (void)
+{
+char *p = (char *) alloca (2 * sizeof (int));
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:33722: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:33725: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:33728: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:33731: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_working_alloca_h=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_working_alloca_h=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:33741: result: $ac_cv_working_alloca_h" >&5
+echo "${ECHO_T}$ac_cv_working_alloca_h" >&6
+if test $ac_cv_working_alloca_h = yes; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_ALLOCA_H 1
+EOF
+
+fi
+
+echo "$as_me:33751: checking for alloca" >&5
+echo $ECHO_N "checking for alloca... $ECHO_C" >&6
+if test "${ac_cv_func_alloca_works+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 33757 "configure"
+#include "confdefs.h"
+#ifdef __GNUC__
+# define alloca __builtin_alloca
+#else
+# ifdef _MSC_VER
+# include <malloc.h>
+# define alloca _alloca
+# else
+# if HAVE_ALLOCA_H
+# include <alloca.h>
+# else
+# ifdef _AIX
+ #pragma alloca
+# else
+# ifndef alloca /* predefined by HP cc +Olibcalls */
+char *alloca ();
+# endif
+# endif
+# endif
+# endif
+#endif
+
+int
+main (void)
+{
+char *p = (char *) alloca (1);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:33789: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:33792: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:33795: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:33798: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_func_alloca_works=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_alloca_works=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:33808: result: $ac_cv_func_alloca_works" >&5
+echo "${ECHO_T}$ac_cv_func_alloca_works" >&6
+
+if test $ac_cv_func_alloca_works = yes; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_ALLOCA 1
+EOF
+
+else
+ # The SVR3 libPW and SVR4 libucb both contain incompatible functions
+# that cause trouble. Some versions do not even contain alloca or
+# contain a buggy version. If you still want to use their alloca,
+# use ar to extract alloca.o from them instead of compiling alloca.c.
+
+ALLOCA="alloca.$ac_objext"
+
+cat >>confdefs.h <<\EOF
+#define C_ALLOCA 1
+EOF
+
+echo "$as_me:33829: checking whether \`alloca.c' needs Cray hooks" >&5
+echo $ECHO_N "checking whether \`alloca.c' needs Cray hooks... $ECHO_C" >&6
+if test "${ac_cv_os_cray+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 33835 "configure"
+#include "confdefs.h"
+#if defined(CRAY) && ! defined(CRAY2)
+webecray
+#else
+wenotbecray
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "webecray" >/dev/null 2>&1; then
+ ac_cv_os_cray=yes
+else
+ ac_cv_os_cray=no
+fi
+rm -rf conftest*
+
+fi
+echo "$as_me:33853: result: $ac_cv_os_cray" >&5
+echo "${ECHO_T}$ac_cv_os_cray" >&6
+if test $ac_cv_os_cray = yes; then
+ for ac_func in _getb67 GETB67 getb67; do
+ as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:33858: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 33864 "configure"
+#include "confdefs.h"
+#define $ac_func autoconf_temporary
+#include <limits.h> /* least-intrusive standard header which defines gcc2 __stub macros */
+#undef $ac_func
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+#error found stub for $ac_func
+#endif
+
+ return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:33895: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:33898: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:33901: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:33904: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+eval "$as_ac_var=no"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:33914: result: `eval echo '${'"$as_ac_var"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_var"'}'`" >&6
+if test "`eval echo '${'"$as_ac_var"'}'`" = yes; then
+
+cat >>confdefs.h <<EOF
+#define CRAY_STACKSEG_END $ac_func
+EOF
+
+ break
+fi
+
+ done
+fi
+
+echo "$as_me:33928: checking stack direction for C alloca" >&5
+echo $ECHO_N "checking stack direction for C alloca... $ECHO_C" >&6
+if test "${ac_cv_c_stack_direction+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then
+ ac_cv_c_stack_direction=0
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 33937 "configure"
+#include "confdefs.h"
+int
+find_stack_direction (void)
+{
+ static char *addr = 0;
+ auto char dummy;
+ if (addr == 0)
+ {
+ addr = &dummy;
+ return find_stack_direction ();
+ }
+ else
+ return (&dummy > addr) ? 1 : -1;
+}
+
+int
+main (void)
+{
+ $ac_main_return (find_stack_direction () < 0);
+}
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:33960: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:33963: \$? = $ac_status" >&5
+ (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+ { (eval echo "$as_me:33965: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:33968: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_c_stack_direction=1
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_c_stack_direction=-1
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+fi
+echo "$as_me:33980: result: $ac_cv_c_stack_direction" >&5
+echo "${ECHO_T}$ac_cv_c_stack_direction" >&6
+
+cat >>confdefs.h <<EOF
+#define STACK_DIRECTION $ac_cv_c_stack_direction
+EOF
+
+fi
+
+for ac_header in unistd.h vfork.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:33992: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 33998 "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:34002: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+ (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ $EGREP -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:34008: \$? = $ac_status" >&5
+ (exit "$ac_status"); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ eval "$as_ac_Header=yes"
+else
+ echo "$as_me: failed program was:" >&5
+ cat "conftest.$ac_ext" >&5
+ eval "$as_ac_Header=no"
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi
+echo "$as_me:34027: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
+if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
+ cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+for ac_func in fork vfork
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:34040: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 34046 "configure"
+#include "confdefs.h"
+#define $ac_func autoconf_temporary
+#include <limits.h> /* least-intrusive standard header which defines gcc2 __stub macros */
+#undef $ac_func
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+#error found stub for $ac_func
+#endif
+
+ return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:34077: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:34080: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:34083: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:34086: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+eval "$as_ac_var=no"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:34096: result: `eval echo '${'"$as_ac_var"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_var"'}'`" >&6
+if test "`eval echo '${'"$as_ac_var"'}'`" = yes; then
+ cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+ac_cv_func_fork_works=$ac_cv_func_fork
+if test "x$ac_cv_func_fork" = xyes; then
+ echo "$as_me:34108: checking for working fork" >&5
+echo $ECHO_N "checking for working fork... $ECHO_C" >&6
+if test "${ac_cv_func_fork_works+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then
+ ac_cv_func_fork_works=cross
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+/* By Rüdiger Kuhlmann. */
+ #include <sys/types.h>
+ #if HAVE_UNISTD_H
+ # include <unistd.h>
+ #endif
+ /* Some systems only have a dummy stub for fork() */
+ int main (void)
+ {
+ if (fork() < 0)
+ $ac_main_return (1);
+ $ac_main_return (0);
+ }
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:34131: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:34134: \$? = $ac_status" >&5
+ (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+ { (eval echo "$as_me:34136: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:34139: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_func_fork_works=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_fork_works=no
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+fi
+echo "$as_me:34151: result: $ac_cv_func_fork_works" >&5
+echo "${ECHO_T}$ac_cv_func_fork_works" >&6
+
+fi
+if test "x$ac_cv_func_fork_works" = xcross; then
+ case $host in
+ *-*-amigaos* | *-*-msdosdjgpp*)
+ # Override, as these systems have only a dummy fork() stub
+ ac_cv_func_fork_works=no
+ ;;
+ *)
+ ac_cv_func_fork_works=yes
+ ;;
+ esac
+ { echo "$as_me:34165: WARNING: CROSS: Result $ac_cv_func_fork_works guessed due to cross-compiling." >&5
+echo "$as_me: WARNING: CROSS: Result $ac_cv_func_fork_works guessed due to cross-compiling." >&2;}
+fi
+ac_cv_func_vfork_works=$ac_cv_func_vfork
+if test "x$ac_cv_func_vfork" = xyes; then
+ echo "$as_me:34170: checking for working vfork" >&5
+echo $ECHO_N "checking for working vfork... $ECHO_C" >&6
+if test "${ac_cv_func_vfork_works+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then
+ ac_cv_func_vfork_works=cross
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 34179 "configure"
+#include "confdefs.h"
+/* Thanks to Paul Eggert for this test. */
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#if HAVE_VFORK_H
+# include <vfork.h>
+#endif
+/* On some sparc systems, changes by the child to local and incoming
+ argument registers are propagated back to the parent. The compiler
+ is told about this with #include <vfork.h>, but some compilers
+ (e.g. gcc -O) don't grok <vfork.h>. Test for this by using a
+ static variable whose address is put into a register that is
+ clobbered by the vfork. */
+static
+#ifdef __cplusplus
+sparc_address_test (int arg)
+# else
+sparc_address_test (arg) int arg;
+#endif
+{
+ static pid_t child;
+ if (!child) {
+ child = vfork ();
+ if (child < 0) {
+ perror ("vfork");
+ _exit(2);
+ }
+ if (!child) {
+ arg = getpid();
+ write(-1, "", 0);
+ _exit (arg);
+ }
+ }
+}
+
+int
+main (void)
+{
+ pid_t parent = getpid ();
+ pid_t child;
+
+ sparc_address_test ();
+
+ child = vfork ();
+
+ if (child == 0) {
+ /* Here is another test for sparc vfork register problems. This
+ test uses lots of local variables, at least as many local
+ variables as main has allocated so far including compiler
+ temporaries. 4 locals are enough for gcc 1.40.3 on a Solaris
+ 4.1.3 sparc, but we use 8 to be safe. A buggy compiler should
+ reuse the register of parent for one of the local variables,
+ since it will think that parent can't possibly be used any more
+ in this routine. Assigning to the local variable will thus
+ munge parent in the parent process. */
+ pid_t
+ p = getpid(), p1 = getpid(), p2 = getpid(), p3 = getpid(),
+ p4 = getpid(), p5 = getpid(), p6 = getpid(), p7 = getpid();
+ /* Convince the compiler that p..p7 are live; otherwise, it might
+ use the same hardware register for all 8 local variables. */
+ if (p != p1 || p != p2 || p != p3 || p != p4
+ || p != p5 || p != p6 || p != p7)
+ _exit(1);
+
+ /* On some systems (e.g. IRIX 3.3), vfork doesn't separate parent
+ from child file descriptors. If the child closes a descriptor
+ before it execs or exits, this munges the parent's descriptor
+ as well. Test for this by closing stdout in the child. */
+ _exit(close(fileno(stdout)) != 0);
+ } else {
+ int status;
+ struct stat st;
+
+ while (wait(&status) != child)
+ ;
+ $ac_main_return(
+ /* Was there some problem with vforking? */
+ child < 0
+
+ /* Did the child fail? (This shouldn't happen.) */
+ || status
+
+ /* Did the vfork/compiler bug occur? */
+ || parent != getpid()
+
+ /* Did the file descriptor bug occur? */
+ || fstat(fileno(stdout), &st) != 0
+ );
+ }
+}
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:34276: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:34279: \$? = $ac_status" >&5
+ (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+ { (eval echo "$as_me:34281: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:34284: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_func_vfork_works=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_vfork_works=no
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+fi
+echo "$as_me:34296: result: $ac_cv_func_vfork_works" >&5
+echo "${ECHO_T}$ac_cv_func_vfork_works" >&6
+
+fi;
+if test "x$ac_cv_func_fork_works" = xcross; then
+ ac_cv_func_vfork_works=ac_cv_func_vfork
+ { echo "$as_me:34302: WARNING: CROSS: Result $ac_cv_func_vfork_works guessed due to cross-compiling." >&5
+echo "$as_me: WARNING: CROSS: Result $ac_cv_func_vfork_works guessed due to cross-compiling." >&2;}
+fi
+
+if test "x$ac_cv_func_vfork_works" = xyes; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_WORKING_VFORK 1
+EOF
+
+else
+
+cat >>confdefs.h <<\EOF
+#define vfork fork
+EOF
+
+fi
+if test "x$ac_cv_func_fork_works" = xyes; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_WORKING_FORK 1
+EOF
+
+fi
+
+echo "$as_me:34327: checking if we should use fcntl or ioctl" >&5
+echo $ECHO_N "checking if we should use fcntl or ioctl... $ECHO_C" >&6
+if test "${cf_cv_fionbio+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 34334 "configure"
+#include "confdefs.h"
+
+#include <sys/types.h>
+#include <sys/ioctl.h>
+
+int
+main (void)
+{
+
+ int ret = ioctl(0, FIONBIO, (char *)0); (void) ret
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:34351: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:34354: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:34357: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:34360: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_fionbio=ioctl
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 34368 "configure"
+#include "confdefs.h"
+
+#include <sys/types.h>
+#if HAVE_FCNTL_H
+#include <fcntl.h>
+#else
+#if HAVE_SYS_FCNTL_H
+#include <sys/fcntl.h>
+#endif
+#endif
+int
+main (void)
+{
+
+ int ret = fcntl(0, F_SETFL, O_NONBLOCK);
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:34390: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:34393: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:34396: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:34399: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_fionbio=fcntl
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_fionbio=unknown
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:34412: result: $cf_cv_fionbio" >&5
+echo "${ECHO_T}$cf_cv_fionbio" >&6
+test "$cf_cv_fionbio" = "fcntl" &&
+cat >>confdefs.h <<\EOF
+#define USE_FCNTL 1
+EOF
+
+echo "$as_me:34419: checking for broken/missing definition of remove" >&5
+echo $ECHO_N "checking for broken/missing definition of remove... $ECHO_C" >&6
+if test "${cf_cv_baddef_remove+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 34426 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+remove("dummy")
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:34438: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:34441: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:34444: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:34447: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_baddef_remove=no
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 34454 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+ int __unlink(name) { return unlink(name); }
+int
+main (void)
+{
+remove("dummy")
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:34467: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:34470: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:34473: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:34476: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_baddef_remove=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_baddef_remove=unknown
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+
+echo "$as_me:34491: result: $cf_cv_baddef_remove" >&5
+echo "${ECHO_T}$cf_cv_baddef_remove" >&6
+test "$cf_cv_baddef_remove" != no &&
+cat >>confdefs.h <<\EOF
+#define NEED_REMOVE 1
+EOF
+
+echo "$as_me:34498: checking for lstat" >&5
+echo $ECHO_N "checking for lstat... $ECHO_C" >&6
+if test "${ac_cv_func_lstat+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 34505 "configure"
+#include "confdefs.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+int
+main (void)
+{
+struct stat sb; lstat(".", &sb); (void) sb
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:34519: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:34522: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:34525: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:34528: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_func_lstat=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_lstat=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+
+echo "$as_me:34540: result: $ac_cv_func_lstat " >&5
+echo "${ECHO_T}$ac_cv_func_lstat " >&6
+if test "$ac_cv_func_lstat" = yes; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_LSTAT 1
+EOF
+
+fi
+
+echo "$as_me:34550: checking for vasprintf" >&5
+echo $ECHO_N "checking for vasprintf... $ECHO_C" >&6
+if test "${ac_cv_func_vasprintf+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 34556 "configure"
+#include "confdefs.h"
+#define vasprintf autoconf_temporary
+#include <limits.h> /* least-intrusive standard header which defines gcc2 __stub macros */
+#undef vasprintf
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char vasprintf (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_vasprintf) || defined (__stub___vasprintf)
+#error found stub for vasprintf
+#endif
+
+ return vasprintf ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:34587: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:34590: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:34593: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:34596: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_func_vasprintf=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_vasprintf=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:34606: result: $ac_cv_func_vasprintf" >&5
+echo "${ECHO_T}$ac_cv_func_vasprintf" >&6
+if test "$ac_cv_func_vasprintf" = yes; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_VASPRINTF 1
+EOF
+
+ echo "$as_me:34614: checking if vasprintf requires workaround" >&5
+echo $ECHO_N "checking if vasprintf requires workaround... $ECHO_C" >&6
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 34617 "configure"
+#include "confdefs.h"
+
+ #include <stdio.h>
+
+int
+main (void)
+{
+
+ void *p = (void *)vasprintf; return (p != 0)
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:34633: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:34636: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:34639: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:34642: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ echo "$as_me:34645: result: no" >&5
+echo "${ECHO_T}no" >&6
+
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 34653 "configure"
+#include "confdefs.h"
+
+ #ifndef _GNU_SOURCE
+ #define _GNU_SOURCE 1
+ #include <stdio.h>
+ #endif
+
+int
+main (void)
+{
+
+ void *p = (void *)vasprintf; return (p != 0)
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:34672: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:34675: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:34678: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:34681: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ echo "$as_me:34684: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-D_GNU_SOURCE"
+
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+ echo "$as_me:34694: result: unknown" >&5
+echo "${ECHO_T}unknown" >&6
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+
+for ac_func in \
+ atoll \
+ ctermid \
+ cuserid \
+ ftime \
+ getcwd \
+ getgroups \
+ gettimeofday \
+ getuid \
+ popen \
+ putenv \
+ readdir \
+ setuid \
+ truncate \
+ ttyname \
+ unsetenv \
+ sleep \
+ usleep \
+ waitpid \
+
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:34727: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 34733 "configure"
+#include "confdefs.h"
+#define $ac_func autoconf_temporary
+#include <limits.h> /* least-intrusive standard header which defines gcc2 __stub macros */
+#undef $ac_func
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+#error found stub for $ac_func
+#endif
+
+ return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:34764: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:34767: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:34770: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:34773: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+eval "$as_ac_var=no"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:34783: result: `eval echo '${'"$as_ac_var"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_var"'}'`" >&6
+if test "`eval echo '${'"$as_ac_var"'}'`" = yes; then
+ cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+for ac_func in \
+ mkdtemp
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:34797: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 34803 "configure"
+#include "confdefs.h"
+#define $ac_func autoconf_temporary
+#include <limits.h> /* least-intrusive standard header which defines gcc2 __stub macros */
+#undef $ac_func
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+#error found stub for $ac_func
+#endif
+
+ return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:34834: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:34837: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:34840: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:34843: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+eval "$as_ac_var=no"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:34853: result: `eval echo '${'"$as_ac_var"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_var"'}'`" >&6
+if test "`eval echo '${'"$as_ac_var"'}'`" = yes; then
+ cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+EOF
+
+else
+
+for ac_func in mktemp
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:34865: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 34871 "configure"
+#include "confdefs.h"
+#define $ac_func autoconf_temporary
+#include <limits.h> /* least-intrusive standard header which defines gcc2 __stub macros */
+#undef $ac_func
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+#error found stub for $ac_func
+#endif
+
+ return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:34902: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:34905: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:34908: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:34911: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+eval "$as_ac_var=no"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:34921: result: `eval echo '${'"$as_ac_var"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_var"'}'`" >&6
+if test "`eval echo '${'"$as_ac_var"'}'`" = yes; then
+ cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+fi
+done
+
+for ac_func in \
+ mktime \
+ strstr \
+ wcwidth \
+
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:34941: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 34947 "configure"
+#include "confdefs.h"
+#define $ac_func autoconf_temporary
+#include <limits.h> /* least-intrusive standard header which defines gcc2 __stub macros */
+#undef $ac_func
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+#error found stub for $ac_func
+#endif
+
+ return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:34978: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:34981: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:34984: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:34987: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+eval "$as_ac_var=no"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:34997: result: `eval echo '${'"$as_ac_var"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_var"'}'`" >&6
+if test "`eval echo '${'"$as_ac_var"'}'`" = yes; then
+ cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+EOF
+
+else
+ LIBOBJS="$LIBOBJS $ac_func.$ac_objext"
+fi
+done
+
+echo "$as_me:35009: checking for random-integer functions" >&5
+echo $ECHO_N "checking for random-integer functions... $ECHO_C" >&6
+if test "${cf_cv_srand_func+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cf_cv_srand_func=unknown
+for cf_func in arc4random_push/arc4random arc4random_stir/arc4random srandom/random srand48/lrand48 srand/rand
+do
+
+ cf_srand_func=`echo $cf_func | sed -e 's%/.*%%'`
+ cf_rand_func=`echo $cf_func | sed -e 's%.*/%%'`
+
+ case $cf_srand_func in
+ (arc4random_stir)
+ cf_srand_func='(void)'
+ ;;
+ esac
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 35029 "configure"
+#include "confdefs.h"
+
+$ac_includes_default
+#ifdef HAVE_LIMITS_H
+#include <limits.h>
+#endif
+
+int
+main (void)
+{
+long seed = 1; $cf_srand_func(seed); seed = $cf_rand_func(); (void)seed
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:35046: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:35049: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:35052: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:35055: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_srand_func=$cf_func
+ break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+done
+
+fi
+echo "$as_me:35067: result: $cf_cv_srand_func" >&5
+echo "${ECHO_T}$cf_cv_srand_func" >&6
+if test "$cf_cv_srand_func" != unknown ; then
+ echo "$as_me:35070: checking for range of random-integers" >&5
+echo $ECHO_N "checking for range of random-integers... $ECHO_C" >&6
+if test "${cf_cv_rand_max+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ case "$cf_cv_srand_func" in
+ (srand/rand)
+ cf_cv_rand_max=RAND_MAX
+ cf_rand_max=16
+ ;;
+ (*/arc4random)
+ cf_cv_rand_max=0xFFFFFFFFUL
+ cf_rand_max=32
+ ;;
+ (*)
+ cf_cv_rand_max=INT_MAX
+ cf_rand_max=31
+ ;;
+ esac
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 35091 "configure"
+#include "confdefs.h"
+
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#ifdef HAVE_LIMITS_H
+#include <limits.h>
+#endif
+
+int
+main (void)
+{
+long x = $cf_cv_rand_max; (void)x
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:35110: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:35113: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:35116: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:35119: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_rand_max="(1UL<<$cf_rand_max)-1"
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:35130: result: $cf_cv_rand_max" >&5
+echo "${ECHO_T}$cf_cv_rand_max" >&6
+
+ case "$cf_cv_srand_func" in
+ (*/arc4random)
+ echo "$as_me:35135: checking if <bsd/stdlib.h> should be included" >&5
+echo $ECHO_N "checking if <bsd/stdlib.h> should be included... $ECHO_C" >&6
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 35138 "configure"
+#include "confdefs.h"
+#include <bsd/stdlib.h>
+int
+main (void)
+{
+void *arc4random(int);
+ void *x = arc4random(1); (void)x
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:35151: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:35154: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:35157: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:35160: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_bsd_stdlib_h=no
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 35167 "configure"
+#include "confdefs.h"
+#include <bsd/stdlib.h>
+int
+main (void)
+{
+unsigned x = arc4random(); (void)x
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:35179: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:35182: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:35185: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:35188: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_bsd_stdlib_h=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_bsd_stdlib_h=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ echo "$as_me:35199: result: $cf_bsd_stdlib_h" >&5
+echo "${ECHO_T}$cf_bsd_stdlib_h" >&6
+ if test "$cf_bsd_stdlib_h" = yes
+ then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_BSD_STDLIB_H 1
+EOF
+
+ else
+ echo "$as_me:35209: checking if <bsd/random.h> should be included" >&5
+echo $ECHO_N "checking if <bsd/random.h> should be included... $ECHO_C" >&6
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 35212 "configure"
+#include "confdefs.h"
+#include <bsd/random.h>
+int
+main (void)
+{
+void *arc4random(int);
+ void *x = arc4random(1); (void)x
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:35225: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:35228: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:35231: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:35234: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_bsd_random_h=no
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 35241 "configure"
+#include "confdefs.h"
+#include <bsd/random.h>
+int
+main (void)
+{
+unsigned x = arc4random(); (void)x
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:35253: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:35256: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:35259: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:35262: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_bsd_random_h=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_bsd_random_h=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ echo "$as_me:35273: result: $cf_bsd_random_h" >&5
+echo "${ECHO_T}$cf_bsd_random_h" >&6
+ if test "$cf_bsd_random_h" = yes
+ then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_BSD_RANDOM_H 1
+EOF
+
+ else
+ { echo "$as_me:35283: WARNING: no header file found for arc4random" >&5
+echo "$as_me: WARNING: no header file found for arc4random" >&2;}
+ fi
+ fi
+ ;;
+ esac
+
+ cf_srand_func=`echo $cf_func | sed -e 's%/.*%%'`
+ cf_rand_func=`echo $cf_func | sed -e 's%.*/%%'`
+
+ case $cf_srand_func in
+ (arc4random_stir)
+ cf_srand_func='(void)'
+ ;;
+ esac
+
+cf_rand_max=`echo "lynx_rand_max" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+cat >>confdefs.h <<EOF
+#define lynx_srand $cf_srand_func
+EOF
+
+cat >>confdefs.h <<EOF
+#define lynx_rand $cf_rand_func
+EOF
+
+cat >>confdefs.h <<EOF
+#define $cf_rand_max $cf_cv_rand_max
+EOF
+
+fi
+
+for ac_func in sleep
+do
+
+echo "$as_me:35318: checking for $ac_func declaration" >&5
+echo $ECHO_N "checking for $ac_func declaration... $ECHO_C" >&6
+if eval "test \"\${ac_cv_func_decl_$ac_func+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 35324 "configure"
+#include "confdefs.h"
+
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+int
+main (void)
+{
+#ifndef $ac_func
+extern int $ac_func();
+#endif
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:35345: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:35348: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:35351: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:35354: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 35358 "configure"
+#include "confdefs.h"
+
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+int
+main (void)
+{
+#ifndef $ac_func
+int (*p)() = $ac_func;
+#endif
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:35379: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:35382: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:35385: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:35388: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+eval "ac_cv_func_decl_$ac_func=yes"
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+eval "ac_cv_func_decl_$ac_func=no"
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+eval "ac_cv_func_decl_$ac_func=yes"
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+
+if eval "test \"`echo '$ac_cv_func_'decl_$ac_func`\" = yes"; then
+ echo "$as_me:35409: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ :
+else
+ echo "$as_me:35413: result: no" >&5
+echo "${ECHO_T}no" >&6
+
+ac_tr_func=`echo "DECL_$ac_func" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+ cat >>confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+
+fi
+done
+
+for ac_func in strstr
+do
+
+echo "$as_me:35428: checking for $ac_func declaration" >&5
+echo $ECHO_N "checking for $ac_func declaration... $ECHO_C" >&6
+if eval "test \"\${ac_cv_func_decl_$ac_func+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 35434 "configure"
+#include "confdefs.h"
+#include <string.h>
+int
+main (void)
+{
+#ifndef $ac_func
+extern int $ac_func();
+#endif
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:35448: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:35451: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:35454: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:35457: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 35461 "configure"
+#include "confdefs.h"
+#include <string.h>
+int
+main (void)
+{
+#ifndef $ac_func
+int (*p)() = $ac_func;
+#endif
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:35475: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:35478: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:35481: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:35484: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+eval "ac_cv_func_decl_$ac_func=yes"
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+eval "ac_cv_func_decl_$ac_func=no"
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+eval "ac_cv_func_decl_$ac_func=yes"
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+
+if eval "test \"`echo '$ac_cv_func_'decl_$ac_func`\" = yes"; then
+ echo "$as_me:35505: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ :
+else
+ echo "$as_me:35509: result: no" >&5
+echo "${ECHO_T}no" >&6
+
+ac_tr_func=`echo "DECL_$ac_func" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+ cat >>confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+
+fi
+done
+
+for ac_func in getgrgid getgrnam
+do
+
+echo "$as_me:35524: checking for $ac_func declaration" >&5
+echo $ECHO_N "checking for $ac_func declaration... $ECHO_C" >&6
+if eval "test \"\${ac_cv_func_decl_$ac_func+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 35530 "configure"
+#include "confdefs.h"
+
+#include <stdio.h>
+#include <grp.h>
+int
+main (void)
+{
+#ifndef $ac_func
+extern int $ac_func();
+#endif
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:35546: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:35549: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:35552: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:35555: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 35559 "configure"
+#include "confdefs.h"
+
+#include <stdio.h>
+#include <grp.h>
+int
+main (void)
+{
+#ifndef $ac_func
+int (*p)() = $ac_func;
+#endif
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:35575: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:35578: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:35581: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:35584: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+eval "ac_cv_func_decl_$ac_func=yes"
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+eval "ac_cv_func_decl_$ac_func=no"
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+eval "ac_cv_func_decl_$ac_func=yes"
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+
+if eval "test \"`echo '$ac_cv_func_'decl_$ac_func`\" = yes"; then
+ echo "$as_me:35605: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ :
+else
+ echo "$as_me:35609: result: no" >&5
+echo "${ECHO_T}no" >&6
+
+ac_tr_func=`echo "DECL_$ac_func" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+ cat >>confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+
+fi
+done
+
+echo "$as_me:35621: checking if TRUE/FALSE are defined" >&5
+echo $ECHO_N "checking if TRUE/FALSE are defined... $ECHO_C" >&6
+if test "${cf_cv_bool_defs+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 35628 "configure"
+#include "confdefs.h"
+
+#include <${cf_cv_ncurses_header:-curses.h}>
+#include <stdio.h>
+int
+main (void)
+{
+int x = TRUE, y = FALSE
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:35642: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:35645: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:35648: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:35651: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_bool_defs=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_bool_defs=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+
+echo "$as_me:35662: result: $cf_cv_bool_defs" >&5
+echo "${ECHO_T}$cf_cv_bool_defs" >&6
+if test "$cf_cv_bool_defs" = no ; then
+
+cat >>confdefs.h <<\EOF
+#define TRUE (1)
+EOF
+
+cat >>confdefs.h <<\EOF
+#define FALSE (0)
+EOF
+
+fi
+
+echo "$as_me:35676: checking if external errno is declared" >&5
+echo $ECHO_N "checking if external errno is declared... $ECHO_C" >&6
+if test "${cf_cv_dcl_errno+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 35683 "configure"
+#include "confdefs.h"
+
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#include <stdio.h>
+#include <sys/types.h>
+#include <errno.h>
+int
+main (void)
+{
+int x = (int) errno; (void)x
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:35701: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:35704: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:35707: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:35710: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_dcl_errno=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_dcl_errno=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:35721: result: $cf_cv_dcl_errno" >&5
+echo "${ECHO_T}$cf_cv_dcl_errno" >&6
+
+if test "$cf_cv_dcl_errno" = no ; then
+
+cf_result=`echo "decl_errno" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+ cat >>confdefs.h <<EOF
+#define $cf_result 1
+EOF
+
+fi
+
+# It's possible (for near-UNIX clones) that the data doesn't exist
+
+echo "$as_me:35736: checking if external errno exists" >&5
+echo $ECHO_N "checking if external errno exists... $ECHO_C" >&6
+if test "${cf_cv_have_errno+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 35743 "configure"
+#include "confdefs.h"
+
+#undef errno
+extern int errno;
+
+int
+main (void)
+{
+errno = 2
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:35758: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:35761: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:35764: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:35767: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_have_errno=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_have_errno=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:35778: result: $cf_cv_have_errno" >&5
+echo "${ECHO_T}$cf_cv_have_errno" >&6
+
+if test "$cf_cv_have_errno" = yes ; then
+
+cf_result=`echo "have_errno" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+ cat >>confdefs.h <<EOF
+#define $cf_result 1
+EOF
+
+fi
+
+echo "$as_me:35791: checking if we can set errno" >&5
+echo $ECHO_N "checking if we can set errno... $ECHO_C" >&6
+if test "${cf_cv_set_errno+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+if test "$cross_compiling" = yes; then
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 35799 "configure"
+#include "confdefs.h"
+#include <errno.h>
+int
+main (void)
+{
+errno = 255
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:35811: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:35814: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:35817: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:35820: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_set_errno=maybe
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_set_errno=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 35831 "configure"
+#include "confdefs.h"
+
+$ac_includes_default
+
+#include <errno.h>
+
+int main(void)
+{
+ errno = 255;
+ ${cf_cv_main_return:-return}(errno != 255);
+}
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:35845: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:35848: \$? = $ac_status" >&5
+ (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+ { (eval echo "$as_me:35850: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:35853: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_set_errno=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_set_errno=no
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+
+fi
+echo "$as_me:35866: result: $cf_cv_set_errno" >&5
+echo "${ECHO_T}$cf_cv_set_errno" >&6
+test "$cf_cv_set_errno" != no &&
+cat >>confdefs.h <<\EOF
+#define CAN_SET_ERRNO 1
+EOF
+
+echo "$as_me:35873: checking for setlocale()" >&5
+echo $ECHO_N "checking for setlocale()... $ECHO_C" >&6
+if test "${cf_cv_locale+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 35880 "configure"
+#include "confdefs.h"
+#include <locale.h>
+int
+main (void)
+{
+setlocale(LC_ALL, "")
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:35892: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:35895: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:35898: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:35901: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_locale=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_locale=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+
+echo "$as_me:35913: result: $cf_cv_locale" >&5
+echo "${ECHO_T}$cf_cv_locale" >&6
+test "$cf_cv_locale" = yes && {
+cat >>confdefs.h <<\EOF
+#define LOCALE 1
+EOF
+ }
+
+echo "$as_me:35921: checking if NGROUPS is defined" >&5
+echo $ECHO_N "checking if NGROUPS is defined... $ECHO_C" >&6
+if test "${cf_cv_ngroups+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 35928 "configure"
+#include "confdefs.h"
+
+#if HAVE_SYS_PARAM_H
+#include <sys/param.h>
+#endif
+#if HAVE_LIMITS_H
+#include <limits.h>
+#endif
+
+int
+main (void)
+{
+int x = NGROUPS
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:35947: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:35950: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:35953: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:35956: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_ngroups=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 35963 "configure"
+#include "confdefs.h"
+
+#if HAVE_SYS_PARAM_H
+#include <sys/param.h>
+#endif
+#if HAVE_LIMITS_H
+#include <limits.h>
+#endif
+
+int
+main (void)
+{
+int x = NGROUPS_MAX
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:35982: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:35985: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:35988: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:35991: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_ngroups=NGROUPS_MAX
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_ngroups=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+echo "$as_me:36003: result: $cf_cv_ngroups" >&5
+echo "${ECHO_T}$cf_cv_ngroups" >&6
+
+fi
+
+if test "$cf_cv_ngroups" = no ; then
+
+cat >>confdefs.h <<\EOF
+#define NGROUPS 16
+EOF
+
+elif test "$cf_cv_ngroups" = NGROUPS_MAX ; then
+ cat >>confdefs.h <<\EOF
+#define NGROUPS NGROUPS_MAX
+EOF
+
+fi
+
+for ac_func in strerror
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:36024: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 36030 "configure"
+#include "confdefs.h"
+#define $ac_func autoconf_temporary
+#include <limits.h> /* least-intrusive standard header which defines gcc2 __stub macros */
+#undef $ac_func
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+#error found stub for $ac_func
+#endif
+
+ return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:36061: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:36064: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:36067: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:36070: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+eval "$as_ac_var=no"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:36080: result: `eval echo '${'"$as_ac_var"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_var"'}'`" >&6
+if test "`eval echo '${'"$as_ac_var"'}'`" = yes; then
+ cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+EOF
+
+else
+
+echo "$as_me:36089: checking if external sys_nerr is declared" >&5
+echo $ECHO_N "checking if external sys_nerr is declared... $ECHO_C" >&6
+if test "${cf_cv_dcl_sys_nerr+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 36096 "configure"
+#include "confdefs.h"
+
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#include <stdio.h>
+#include <sys/types.h>
+#include <errno.h>
+int
+main (void)
+{
+int x = (int) sys_nerr; (void)x
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:36114: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:36117: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:36120: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:36123: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_dcl_sys_nerr=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_dcl_sys_nerr=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:36134: result: $cf_cv_dcl_sys_nerr" >&5
+echo "${ECHO_T}$cf_cv_dcl_sys_nerr" >&6
+
+if test "$cf_cv_dcl_sys_nerr" = no ; then
+
+cf_result=`echo "decl_sys_nerr" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+ cat >>confdefs.h <<EOF
+#define $cf_result 1
+EOF
+
+fi
+
+# It's possible (for near-UNIX clones) that the data doesn't exist
+
+echo "$as_me:36149: checking if external sys_nerr exists" >&5
+echo $ECHO_N "checking if external sys_nerr exists... $ECHO_C" >&6
+if test "${cf_cv_have_sys_nerr+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 36156 "configure"
+#include "confdefs.h"
+
+#undef sys_nerr
+extern int sys_nerr;
+
+int
+main (void)
+{
+sys_nerr = 2
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:36171: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:36174: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:36177: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:36180: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_have_sys_nerr=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_have_sys_nerr=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:36191: result: $cf_cv_have_sys_nerr" >&5
+echo "${ECHO_T}$cf_cv_have_sys_nerr" >&6
+
+if test "$cf_cv_have_sys_nerr" = yes ; then
+
+cf_result=`echo "have_sys_nerr" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+ cat >>confdefs.h <<EOF
+#define $cf_result 1
+EOF
+
+fi
+
+echo "$as_me:36204: checking if external sys_errlist is declared" >&5
+echo $ECHO_N "checking if external sys_errlist is declared... $ECHO_C" >&6
+if test "${cf_cv_dcl_sys_errlist+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 36211 "configure"
+#include "confdefs.h"
+
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#include <stdio.h>
+#include <sys/types.h>
+#include <errno.h>
+int
+main (void)
+{
+int x = (int) sys_errlist; (void)x
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:36229: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:36232: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:36235: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:36238: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_dcl_sys_errlist=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_dcl_sys_errlist=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:36249: result: $cf_cv_dcl_sys_errlist" >&5
+echo "${ECHO_T}$cf_cv_dcl_sys_errlist" >&6
+
+if test "$cf_cv_dcl_sys_errlist" = no ; then
+
+cf_result=`echo "decl_sys_errlist" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+ cat >>confdefs.h <<EOF
+#define $cf_result 1
+EOF
+
+fi
+
+# It's possible (for near-UNIX clones) that the data doesn't exist
+
+echo "$as_me:36264: checking if external sys_errlist exists" >&5
+echo $ECHO_N "checking if external sys_errlist exists... $ECHO_C" >&6
+if test "${cf_cv_have_sys_errlist+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 36271 "configure"
+#include "confdefs.h"
+
+#undef sys_errlist
+extern int sys_errlist;
+
+int
+main (void)
+{
+sys_errlist = 2
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:36286: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:36289: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:36292: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:36295: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_have_sys_errlist=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_have_sys_errlist=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:36306: result: $cf_cv_have_sys_errlist" >&5
+echo "${ECHO_T}$cf_cv_have_sys_errlist" >&6
+
+if test "$cf_cv_have_sys_errlist" = yes ; then
+
+cf_result=`echo "have_sys_errlist" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+ cat >>confdefs.h <<EOF
+#define $cf_result 1
+EOF
+
+fi
+
+fi
+done
+
+for ac_header in lastlog.h paths.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:36325: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 36331 "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:36335: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+ (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ $EGREP -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:36341: \$? = $ac_status" >&5
+ (exit "$ac_status"); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ eval "$as_ac_Header=yes"
+else
+ echo "$as_me: failed program was:" >&5
+ cat "conftest.$ac_ext" >&5
+ eval "$as_ac_Header=no"
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi
+echo "$as_me:36360: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
+if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
+ cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+echo "$as_me:36370: checking for lastlog path" >&5
+echo $ECHO_N "checking for lastlog path... $ECHO_C" >&6
+if test "${cf_cv_path_lastlog+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 36377 "configure"
+#include "confdefs.h"
+
+#include <sys/types.h>
+#ifdef HAVE_LASTLOG_H
+#include <lastlog.h>
+#else
+#ifdef HAVE_PATHS_H
+#include <paths.h>
+#endif
+#endif
+int
+main (void)
+{
+char *path = _PATH_LASTLOG; (void)path
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:36397: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:36400: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:36403: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:36406: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_path_lastlog="_PATH_LASTLOG"
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+if test -f /usr/adm/lastlog ; then
+ cf_cv_path_lastlog=/usr/adm/lastlog
+ else
+ cf_cv_path_lastlog=no
+ fi
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:36421: result: $cf_cv_path_lastlog" >&5
+echo "${ECHO_T}$cf_cv_path_lastlog" >&6
+test "$cf_cv_path_lastlog" != no &&
+cat >>confdefs.h <<\EOF
+#define USE_LASTLOG 1
+EOF
+
+echo "$as_me:36428: checking for utmp implementation" >&5
+echo $ECHO_N "checking for utmp implementation... $ECHO_C" >&6
+if test "${cf_cv_have_utmp+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cf_cv_have_utmp=no
+for cf_header in utmpx utmp ; do
+cf_utmp_includes="
+#include <sys/types.h>
+#include <${cf_header}.h>
+#define getutent getutxent
+#ifdef USE_LASTLOG
+#include <lastlog.h> /* may conflict with utmpx.h on Linux */
+#endif
+"
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 36445 "configure"
+#include "confdefs.h"
+$cf_utmp_includes
+int
+main (void)
+{
+struct $cf_header x;
+ char *name = x.ut_name; /* utmp.h and compatible definitions */
+ (void)x;
+ (void)name;
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:36461: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:36464: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:36467: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:36470: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_have_utmp=$cf_header
+ break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 36479 "configure"
+#include "confdefs.h"
+$cf_utmp_includes
+int
+main (void)
+{
+struct $cf_header x;
+ char *name = x.ut_user; /* utmpx.h must declare this */
+ (void)x;
+ (void)name;
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:36495: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:36498: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:36501: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:36504: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_have_utmp=$cf_header
+ break
+
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+done
+
+fi
+echo "$as_me:36519: result: $cf_cv_have_utmp" >&5
+echo "${ECHO_T}$cf_cv_have_utmp" >&6
+
+if test "$cf_cv_have_utmp" != no ; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_UTMP 1
+EOF
+
+ test "$cf_cv_have_utmp" = utmpx &&
+cat >>confdefs.h <<\EOF
+#define UTMPX_FOR_UTMP 1
+EOF
+
+if test "$cf_cv_have_utmp" != no ; then
+echo "$as_me:36534: checking if ${cf_cv_have_utmp}.ut_host is declared" >&5
+echo $ECHO_N "checking if ${cf_cv_have_utmp}.ut_host is declared... $ECHO_C" >&6
+if test "${cf_cv_have_utmp_ut_host+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 36541 "configure"
+#include "confdefs.h"
+
+#include <sys/types.h>
+#include <${cf_cv_have_utmp}.h>
+int
+main (void)
+{
+struct $cf_cv_have_utmp x;
+ char *y = &x.ut_host[0];
+ (void)x;
+ (void)y
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:36558: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:36561: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:36564: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:36567: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_have_utmp_ut_host=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_have_utmp_ut_host=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+
+echo "$as_me:36579: result: $cf_cv_have_utmp_ut_host" >&5
+echo "${ECHO_T}$cf_cv_have_utmp_ut_host" >&6
+test "$cf_cv_have_utmp_ut_host" != no &&
+cat >>confdefs.h <<\EOF
+#define HAVE_UTMP_UT_HOST 1
+EOF
+
+fi
+
+if test "$cf_cv_have_utmp" != no ; then
+echo "$as_me:36589: checking if ${cf_cv_have_utmp}.ut_syslen is declared" >&5
+echo $ECHO_N "checking if ${cf_cv_have_utmp}.ut_syslen is declared... $ECHO_C" >&6
+if test "${cf_cv_have_utmp_ut_syslen+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 36596 "configure"
+#include "confdefs.h"
+
+#include <sys/types.h>
+#include <${cf_cv_have_utmp}.h>
+int
+main (void)
+{
+struct $cf_cv_have_utmp x;
+ int y = x.ut_syslen;
+ (void)x;
+ (void)y
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:36613: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:36616: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:36619: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:36622: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_have_utmp_ut_syslen=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_have_utmp_ut_syslen=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+
+echo "$as_me:36634: result: $cf_cv_have_utmp_ut_syslen" >&5
+echo "${ECHO_T}$cf_cv_have_utmp_ut_syslen" >&6
+test "$cf_cv_have_utmp_ut_syslen" != no &&
+cat >>confdefs.h <<\EOF
+#define HAVE_UTMP_UT_SYSLEN 1
+EOF
+
+fi
+
+if test "$cf_cv_have_utmp" != no ; then
+echo "$as_me:36644: checking if ${cf_cv_have_utmp}.ut_name is declared" >&5
+echo $ECHO_N "checking if ${cf_cv_have_utmp}.ut_name is declared... $ECHO_C" >&6
+if test "${cf_cv_have_utmp_ut_name+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cf_cv_have_utmp_ut_name=no
+cf_utmp_includes="
+#include <sys/types.h>
+#include <${cf_cv_have_utmp}.h>
+#define getutent getutxent
+#ifdef USE_LASTLOG
+#include <lastlog.h> /* may conflict with utmpx.h on Linux */
+#endif
+"
+for cf_header in ut_name ut_user ; do
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 36661 "configure"
+#include "confdefs.h"
+$cf_utmp_includes
+int
+main (void)
+{
+struct $cf_cv_have_utmp x;
+ char *name = x.$cf_header;
+ (void)x;
+ (void)name;
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:36677: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:36680: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:36683: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:36686: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_have_utmp_ut_name=$cf_header
+ break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+done
+
+fi
+echo "$as_me:36698: result: $cf_cv_have_utmp_ut_name" >&5
+echo "${ECHO_T}$cf_cv_have_utmp_ut_name" >&6
+
+case "$cf_cv_have_utmp_ut_name" in
+(no)
+ { { echo "$as_me:36703: error: Cannot find declaration for ut.ut_name" >&5
+echo "$as_me: error: Cannot find declaration for ut.ut_name" >&2;}
+ { (exit 1); exit 1; }; }
+ ;;
+(ut_user)
+
+cat >>confdefs.h <<\EOF
+#define ut_name ut_user
+EOF
+
+ ;;
+esac
+fi
+
+if test "$cf_cv_have_utmp" != no ; then
+echo "$as_me:36718: checking for exit-status in $cf_cv_have_utmp" >&5
+echo $ECHO_N "checking for exit-status in $cf_cv_have_utmp... $ECHO_C" >&6
+if test "${cf_cv_have_utmp_ut_xstatus+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+for cf_result in \
+ ut_exit.__e_exit \
+ ut_exit.e_exit \
+ ut_exit.ut_e_exit \
+ ut_exit.ut_exit
+do
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 36731 "configure"
+#include "confdefs.h"
+
+#include <sys/types.h>
+#include <${cf_cv_have_utmp}.h>
+int
+main (void)
+{
+struct $cf_cv_have_utmp x;
+ long y = x.$cf_result = 0;
+ (void)x;
+ (void)y
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:36748: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:36751: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:36754: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:36757: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_have_utmp_ut_xstatus=$cf_result
+ break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_have_utmp_ut_xstatus=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+done
+
+fi
+echo "$as_me:36770: result: $cf_cv_have_utmp_ut_xstatus" >&5
+echo "${ECHO_T}$cf_cv_have_utmp_ut_xstatus" >&6
+if test "$cf_cv_have_utmp_ut_xstatus" != no ; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_UTMP_UT_XSTATUS 1
+EOF
+
+cat >>confdefs.h <<EOF
+#define ut_xstatus $cf_cv_have_utmp_ut_xstatus
+EOF
+
+fi
+fi
+
+if test "$cf_cv_have_utmp" != no ; then
+echo "$as_me:36786: checking if ${cf_cv_have_utmp}.ut_xtime is declared" >&5
+echo $ECHO_N "checking if ${cf_cv_have_utmp}.ut_xtime is declared... $ECHO_C" >&6
+if test "${cf_cv_have_utmp_ut_xtime+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 36793 "configure"
+#include "confdefs.h"
+
+#include <sys/types.h>
+#include <${cf_cv_have_utmp}.h>
+int
+main (void)
+{
+struct $cf_cv_have_utmp x;
+ long y = x.ut_xtime = 0;
+ (void)x;
+ (void)y
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:36810: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:36813: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:36816: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:36819: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_have_utmp_ut_xtime=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 36826 "configure"
+#include "confdefs.h"
+
+#include <sys/types.h>
+#include <${cf_cv_have_utmp}.h>
+int
+main (void)
+{
+struct $cf_cv_have_utmp x;
+ long y = x.ut_tv.tv_sec;
+ (void)x;
+ (void)y
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:36843: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:36846: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:36849: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:36852: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_have_utmp_ut_xtime=define
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_have_utmp_ut_xtime=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:36866: result: $cf_cv_have_utmp_ut_xtime" >&5
+echo "${ECHO_T}$cf_cv_have_utmp_ut_xtime" >&6
+if test "$cf_cv_have_utmp_ut_xtime" != no ; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_UTMP_UT_XTIME 1
+EOF
+
+ if test "$cf_cv_have_utmp_ut_xtime" = define ; then
+
+cat >>confdefs.h <<\EOF
+#define ut_xtime ut_tv.tv_sec
+EOF
+
+ fi
+fi
+fi
+
+if test "$cf_cv_have_utmp" != no ; then
+echo "$as_me:36885: checking if ${cf_cv_have_utmp}.ut_session is declared" >&5
+echo $ECHO_N "checking if ${cf_cv_have_utmp}.ut_session is declared... $ECHO_C" >&6
+if test "${cf_cv_have_utmp_ut_session+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 36892 "configure"
+#include "confdefs.h"
+
+#include <sys/types.h>
+#include <${cf_cv_have_utmp}.h>
+int
+main (void)
+{
+static struct $cf_cv_have_utmp x;
+ long y = x.ut_session;
+ (void)x;
+ (void)y
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:36909: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:36912: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:36915: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:36918: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_have_utmp_ut_session=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_have_utmp_ut_session=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:36929: result: $cf_cv_have_utmp_ut_session" >&5
+echo "${ECHO_T}$cf_cv_have_utmp_ut_session" >&6
+if test "$cf_cv_have_utmp_ut_session" != no ; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_UTMP_UT_SESSION 1
+EOF
+
+fi
+fi
+
+echo "$as_me:36940: checking if $cf_cv_have_utmp is SYSV flavor" >&5
+echo $ECHO_N "checking if $cf_cv_have_utmp is SYSV flavor... $ECHO_C" >&6
+if test "${cf_cv_sysv_utmp+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+test "$cf_cv_have_utmp" = "utmp" && cf_prefix="ut" || cf_prefix="utx"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 36948 "configure"
+#include "confdefs.h"
+
+#include <sys/types.h>
+#include <${cf_cv_have_utmp}.h>
+int
+main (void)
+{
+
+struct $cf_cv_have_utmp x;
+ set${cf_prefix}ent ();
+ get${cf_prefix}id(&x);
+ put${cf_prefix}line(&x);
+ end${cf_prefix}ent();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:36967: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:36970: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:36973: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:36976: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_sysv_utmp=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_sysv_utmp=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:36987: result: $cf_cv_sysv_utmp" >&5
+echo "${ECHO_T}$cf_cv_sysv_utmp" >&6
+test "$cf_cv_sysv_utmp" = yes &&
+cat >>confdefs.h <<\EOF
+#define USE_SYSV_UTMP 1
+EOF
+
+fi
+
+echo "$as_me:36996: checking if external h_errno exists" >&5
+echo $ECHO_N "checking if external h_errno exists... $ECHO_C" >&6
+if test "${cf_cv_have_h_errno+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 37003 "configure"
+#include "confdefs.h"
+
+#undef h_errno
+extern int h_errno;
+
+int
+main (void)
+{
+h_errno = 2
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:37018: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:37021: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:37024: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:37027: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_have_h_errno=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_have_h_errno=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:37038: result: $cf_cv_have_h_errno" >&5
+echo "${ECHO_T}$cf_cv_have_h_errno" >&6
+
+if test "$cf_cv_have_h_errno" = yes ; then
+
+cf_result=`echo "have_h_errno" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+ cat >>confdefs.h <<EOF
+#define $cf_result 1
+EOF
+
+fi
+
+echo "$as_me:37051: checking if bibp: URLs should be supported" >&5
+echo $ECHO_N "checking if bibp: URLs should be supported... $ECHO_C" >&6
+
+# Check whether --enable-bibp-urls or --disable-bibp-urls was given.
+if test "${enable_bibp_urls+set}" = set; then
+ enableval="$enable_bibp_urls"
+ test "$enableval" != no && enableval=yes
+ if test "$enableval" != "yes" ; then
+ use_bibp_urls=$enableval
+ else
+ use_bibp_urls=yes
+ fi
+else
+ enableval=yes
+ use_bibp_urls=yes
+
+fi;
+echo "$as_me:37068: result: $use_bibp_urls" >&5
+echo "${ECHO_T}$use_bibp_urls" >&6
+test "$use_bibp_urls" = no &&
+cat >>confdefs.h <<\EOF
+#define DISABLE_BIBP 1
+EOF
+
+echo "$as_me:37075: checking if configuration info should be browsable" >&5
+echo $ECHO_N "checking if configuration info should be browsable... $ECHO_C" >&6
+
+# Check whether --enable-config-info or --disable-config-info was given.
+if test "${enable_config_info+set}" = set; then
+ enableval="$enable_config_info"
+ test "$enableval" != no && enableval=yes
+ if test "$enableval" != "yes" ; then
+ use_config_info=$enableval
+ else
+ use_config_info=yes
+ fi
+else
+ enableval=yes
+ use_config_info=yes
+
+fi;
+echo "$as_me:37092: result: $use_config_info" >&5
+echo "${ECHO_T}$use_config_info" >&6
+test "$use_config_info" = no &&
+cat >>confdefs.h <<\EOF
+#define NO_CONFIG_INFO 1
+EOF
+
+echo "$as_me:37099: checking if new-style forms-based options screen should be used" >&5
+echo $ECHO_N "checking if new-style forms-based options screen should be used... $ECHO_C" >&6
+
+# Check whether --enable-forms-options or --disable-forms-options was given.
+if test "${enable_forms_options+set}" = set; then
+ enableval="$enable_forms_options"
+ test "$enableval" != no && enableval=yes
+ if test "$enableval" != "yes" ; then
+ use_forms_options=$enableval
+ else
+ use_forms_options=yes
+ fi
+else
+ enableval=yes
+ use_forms_options=yes
+
+fi;
+echo "$as_me:37116: result: $use_forms_options" >&5
+echo "${ECHO_T}$use_forms_options" >&6
+test "$use_forms_options" = no &&
+cat >>confdefs.h <<\EOF
+#define NO_OPTION_FORMS 1
+EOF
+
+echo "$as_me:37123: checking if old-style options menu should be used" >&5
+echo $ECHO_N "checking if old-style options menu should be used... $ECHO_C" >&6
+
+# Check whether --enable-menu-options or --disable-menu-options was given.
+if test "${enable_menu_options+set}" = set; then
+ enableval="$enable_menu_options"
+ test "$enableval" != no && enableval=yes
+ if test "$enableval" != "yes" ; then
+ use_menu_options=$enableval
+ else
+ use_menu_options=yes
+ fi
+else
+ enableval=yes
+ use_menu_options=yes
+
+fi;
+echo "$as_me:37140: result: $use_menu_options" >&5
+echo "${ECHO_T}$use_menu_options" >&6
+test "$use_menu_options" = no &&
+cat >>confdefs.h <<\EOF
+#define NO_OPTION_MENU 1
+EOF
+
+echo "$as_me:37147: checking if sessions code should be used" >&5
+echo $ECHO_N "checking if sessions code should be used... $ECHO_C" >&6
+
+# Check whether --enable-sessions or --disable-sessions was given.
+if test "${enable_sessions+set}" = set; then
+ enableval="$enable_sessions"
+ test "$enableval" != no && enableval=yes
+ if test "$enableval" != "yes" ; then
+ use_sessions=$enableval
+ else
+ use_sessions=yes
+ fi
+else
+ enableval=yes
+ use_sessions=yes
+
+fi;
+echo "$as_me:37164: result: $use_sessions" >&5
+echo "${ECHO_T}$use_sessions" >&6
+if test "$use_sessions" != no ; then
+
+cat >>confdefs.h <<\EOF
+#define USE_SESSIONS 1
+EOF
+
+ EXTRA_OBJS="$EXTRA_OBJS LYSession\$o"
+fi
+
+echo "$as_me:37175: checking if session-caching code should be used" >&5
+echo $ECHO_N "checking if session-caching code should be used... $ECHO_C" >&6
+
+# Check whether --enable-session-cache or --disable-session-cache was given.
+if test "${enable_session_cache+set}" = set; then
+ enableval="$enable_session_cache"
+ test "$enableval" != no && enableval=yes
+ if test "$enableval" != "yes" ; then
+ use_session_cache=$enableval
+ else
+ use_session_cache=yes
+ fi
+else
+ enableval=yes
+ use_session_cache=yes
+
+fi;
+echo "$as_me:37192: result: $use_session_cache" >&5
+echo "${ECHO_T}$use_session_cache" >&6
+if test "$use_session_cache" != no ; then
+
+cat >>confdefs.h <<\EOF
+#define USE_CACHEJAR 1
+EOF
+
+fi
+
+echo "$as_me:37202: checking if address-list page should be used" >&5
+echo $ECHO_N "checking if address-list page should be used... $ECHO_C" >&6
+
+# Check whether --enable-addrlist-page or --disable-addrlist-page was given.
+if test "${enable_addrlist_page+set}" = set; then
+ enableval="$enable_addrlist_page"
+ test "$enableval" != no && enableval=yes
+ if test "$enableval" != "yes" ; then
+ use_addrlist_page=$enableval
+ else
+ use_addrlist_page=yes
+ fi
+else
+ enableval=yes
+ use_addrlist_page=yes
+
+fi;
+echo "$as_me:37219: result: $use_addrlist_page" >&5
+echo "${ECHO_T}$use_addrlist_page" >&6
+test "$use_addrlist_page" != no &&
+cat >>confdefs.h <<\EOF
+#define USE_ADDRLIST_PAGE 1
+EOF
+
+echo "$as_me:37226: checking if support for CJK should be used" >&5
+echo $ECHO_N "checking if support for CJK should be used... $ECHO_C" >&6
+
+# Check whether --enable-cjk or --disable-cjk was given.
+if test "${enable_cjk+set}" = set; then
+ enableval="$enable_cjk"
+ test "$enableval" != no && enableval=yes
+ if test "$enableval" != "yes" ; then
+ use_cjk=$enableval
+ else
+ use_cjk=yes
+ fi
+else
+ enableval=yes
+ use_cjk=yes
+
+fi;
+echo "$as_me:37243: result: $use_cjk" >&5
+echo "${ECHO_T}$use_cjk" >&6
+test "$use_cjk" != no &&
+cat >>confdefs.h <<\EOF
+#define CJK_EX 1
+EOF
+
+use_cjk_utf8=no
+
+# Check whether --with-libiconv-prefix or --without-libiconv-prefix was given.
+if test "${with_libiconv_prefix+set}" = set; then
+ withval="$with_libiconv_prefix"
+
+case "$withval" in
+(no)
+ ;;
+(yes)
+ ;;
+(*)
+
+for cf_searchpath in `echo "$withval" | tr $PATH_SEPARATOR ' '`; do
+ if test -d "$cf_searchpath/include" ; then
+
+if test -n "$cf_searchpath/include" ; then
+ for cf_add_incdir in $cf_searchpath/include
+ do
+ while test "$cf_add_incdir" != /usr/include
+ do
+ if test -d "$cf_add_incdir"
+ then
+ cf_have_incdir=no
+ if test -n "$CFLAGS$CPPFLAGS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+ if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+ cf_have_incdir=yes; break
+ fi
+ done
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ if test "$cf_add_incdir" = /usr/local/include ; then
+ if test "$GCC" = yes
+ then
+ cf_save_CPPFLAGS=$CPPFLAGS
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 37293 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:37305: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:37308: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:37311: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:37314: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ CPPFLAGS=$cf_save_CPPFLAGS
+ fi
+ fi
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:37331: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+ CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+ cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+ test "$cf_top_incdir" = "$cf_add_incdir" && break
+ cf_add_incdir="$cf_top_incdir"
+ else
+ break
+ fi
+ else
+ break
+ fi
+ done
+ done
+fi
+
+ elif test -d "$cf_searchpath/../include" ; then
+
+if test -n "$cf_searchpath/../include" ; then
+ for cf_add_incdir in $cf_searchpath/../include
+ do
+ while test "$cf_add_incdir" != /usr/include
+ do
+ if test -d "$cf_add_incdir"
+ then
+ cf_have_incdir=no
+ if test -n "$CFLAGS$CPPFLAGS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+ if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+ cf_have_incdir=yes; break
+ fi
+ done
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ if test "$cf_add_incdir" = /usr/local/include ; then
+ if test "$GCC" = yes
+ then
+ cf_save_CPPFLAGS=$CPPFLAGS
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 37377 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:37389: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:37392: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:37395: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:37398: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ CPPFLAGS=$cf_save_CPPFLAGS
+ fi
+ fi
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:37415: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+ CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+ cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+ test "$cf_top_incdir" = "$cf_add_incdir" && break
+ cf_add_incdir="$cf_top_incdir"
+ else
+ break
+ fi
+ else
+ break
+ fi
+ done
+ done
+fi
+
+ else
+{ { echo "$as_me:37433: error: cannot find libiconv under $withval" >&5
+echo "$as_me: error: cannot find libiconv under $withval" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+ if test -d "$cf_searchpath/lib" ; then
+
+if test -n "$cf_searchpath/lib" ; then
+ for cf_add_libdir in $cf_searchpath/lib
+ do
+ if test "$cf_add_libdir" = /usr/lib ; then
+ :
+ elif test -d "$cf_add_libdir"
+ then
+ cf_have_libdir=no
+ if test -n "$LDFLAGS$LIBS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_libdir in $LDFLAGS $LIBS ; do
+ if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
+ cf_have_libdir=yes; break
+ fi
+ done
+ fi
+ if test "$cf_have_libdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
+
+echo "${as_me:-configure}:37458: testing adding $cf_add_libdir to library-path ..." 1>&5
+
+ LDFLAGS="-L$cf_add_libdir $LDFLAGS"
+ fi
+ fi
+ done
+fi
+
+ elif test -d "$cf_searchpath" ; then
+
+if test -n "$cf_searchpath" ; then
+ for cf_add_libdir in $cf_searchpath
+ do
+ if test "$cf_add_libdir" = /usr/lib ; then
+ :
+ elif test -d "$cf_add_libdir"
+ then
+ cf_have_libdir=no
+ if test -n "$LDFLAGS$LIBS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_libdir in $LDFLAGS $LIBS ; do
+ if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
+ cf_have_libdir=yes; break
+ fi
+ done
+ fi
+ if test "$cf_have_libdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
+
+echo "${as_me:-configure}:37487: testing adding $cf_add_libdir to library-path ..." 1>&5
+
+ LDFLAGS="-L$cf_add_libdir $LDFLAGS"
+ fi
+ fi
+ done
+fi
+
+ else
+{ { echo "$as_me:37496: error: cannot find libiconv under $withval" >&5
+echo "$as_me: error: cannot find libiconv under $withval" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+done
+
+ ;;
+esac
+
+fi;
+
+ echo "$as_me:37507: checking for iconv" >&5
+echo $ECHO_N "checking for iconv... $ECHO_C" >&6
+if test "${am_cv_func_iconv+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+# If the linkage is not already in the $CPPFLAGS/$LDFLAGS configuration, these
+# will be set on completion of the AC_TRY_LINK below.
+cf_cv_header_path_iconv=
+cf_cv_library_path_iconv=
+
+echo "${as_me:-configure}:37518: testing Starting FIND_LINKAGE(iconv,) ..." 1>&5
+
+cf_save_LIBS="$LIBS"
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 37523 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <iconv.h>
+
+int
+main (void)
+{
+
+ iconv_t cd = iconv_open("","");
+ iconv(cd,NULL,NULL,NULL,NULL);
+ iconv_close(cd);
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:37542: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:37545: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:37548: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:37551: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ cf_cv_find_linkage_iconv=yes
+ cf_cv_header_path_iconv=/usr/include
+ cf_cv_library_path_iconv=/usr/lib
+
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+LIBS="-liconv $cf_save_LIBS"
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 37565 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <iconv.h>
+
+int
+main (void)
+{
+
+ iconv_t cd = iconv_open("","");
+ iconv(cd,NULL,NULL,NULL,NULL);
+ iconv_close(cd);
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:37584: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:37587: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:37590: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:37593: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ cf_cv_find_linkage_iconv=yes
+ cf_cv_header_path_iconv=/usr/include
+ cf_cv_library_path_iconv=/usr/lib
+ cf_cv_library_file_iconv="-liconv"
+
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+ cf_cv_find_linkage_iconv=no
+ LIBS="$cf_save_LIBS"
+
+ test -n "$verbose" && echo " find linkage for iconv library" 1>&6
+
+echo "${as_me:-configure}:37610: testing find linkage for iconv library ..." 1>&5
+
+echo "${as_me:-configure}:37612: testing Searching for headers in FIND_LINKAGE(iconv,) ..." 1>&5
+
+ cf_save_CPPFLAGS="$CPPFLAGS"
+ cf_test_CPPFLAGS="$CPPFLAGS"
+
+cf_search=
+
+# collect the current set of include-directories from compiler flags
+cf_header_path_list=""
+if test -n "${CFLAGS}${CPPFLAGS}" ; then
+ for cf_header_path in $CPPFLAGS $CFLAGS
+ do
+ case "$cf_header_path" in
+ (-I*)
+ cf_header_path=`echo ".$cf_header_path" |sed -e 's/^...//' -e 's,/include$,,'`
+
+test "x$cf_header_path" != "xNONE" && \
+test -d "$cf_header_path" && \
+ {
+ test -n "$verbose" && echo " ... testing for include-directories under $cf_header_path"
+ test -d "$cf_header_path/include" && cf_search="$cf_search $cf_header_path/include"
+ test -d "$cf_header_path/include/iconv" && cf_search="$cf_search $cf_header_path/include/iconv"
+ test -d "$cf_header_path/include/iconv/include" && cf_search="$cf_search $cf_header_path/include/iconv/include"
+ test -d "$cf_header_path/iconv/include" && cf_search="$cf_search $cf_header_path/iconv/include"
+ test -d "$cf_header_path/iconv/include/iconv" && cf_search="$cf_search $cf_header_path/iconv/include/iconv"
+}
+
+ cf_header_path_list="$cf_header_path_list $cf_search"
+ ;;
+ esac
+ done
+fi
+
+# add the variations for the package we are looking for
+
+cf_search=
+
+test "x$prefix" != "xNONE" && \
+test -d "$prefix" && \
+ {
+ test -n "$verbose" && echo " ... testing for include-directories under $prefix"
+ test -d "$prefix/include" && cf_search="$cf_search $prefix/include"
+ test -d "$prefix/include/iconv" && cf_search="$cf_search $prefix/include/iconv"
+ test -d "$prefix/include/iconv/include" && cf_search="$cf_search $prefix/include/iconv/include"
+ test -d "$prefix/iconv/include" && cf_search="$cf_search $prefix/iconv/include"
+ test -d "$prefix/iconv/include/iconv" && cf_search="$cf_search $prefix/iconv/include/iconv"
+}
+
+for cf_subdir_prefix in \
+ /usr \
+ /usr/local \
+ /usr/pkg \
+ /opt \
+ /opt/local \
+ $HOME
+do
+
+test "x$cf_subdir_prefix" != "x$prefix" && \
+test -d "$cf_subdir_prefix" && \
+{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
+ test -n "$verbose" && echo " ... testing for include-directories under $cf_subdir_prefix"
+ test -d "$cf_subdir_prefix/include" && cf_search="$cf_search $cf_subdir_prefix/include"
+ test -d "$cf_subdir_prefix/include/iconv" && cf_search="$cf_search $cf_subdir_prefix/include/iconv"
+ test -d "$cf_subdir_prefix/include/iconv/include" && cf_search="$cf_search $cf_subdir_prefix/include/iconv/include"
+ test -d "$cf_subdir_prefix/iconv/include" && cf_search="$cf_search $cf_subdir_prefix/iconv/include"
+ test -d "$cf_subdir_prefix/iconv/include/iconv" && cf_search="$cf_search $cf_subdir_prefix/iconv/include/iconv"
+}
+
+done
+
+test "$includedir" != NONE && \
+test "$includedir" != "/usr/include" && \
+test -d "$includedir" && {
+ test -d "$includedir" && cf_search="$cf_search $includedir"
+ test -d "$includedir/iconv" && cf_search="$cf_search $includedir/iconv"
+}
+
+test "$oldincludedir" != NONE && \
+test "$oldincludedir" != "/usr/include" && \
+test -d "$oldincludedir" && {
+ test -d "$oldincludedir" && cf_search="$cf_search $oldincludedir"
+ test -d "$oldincludedir/iconv" && cf_search="$cf_search $oldincludedir/iconv"
+}
+
+cf_search="$cf_search $cf_header_path_list"
+
+ for cf_cv_header_path_iconv in $cf_search
+ do
+ if test -d "$cf_cv_header_path_iconv" ; then
+ test -n "$verbose" && echo " ... testing $cf_cv_header_path_iconv" 1>&6
+
+echo "${as_me:-configure}:37703: testing ... testing $cf_cv_header_path_iconv ..." 1>&5
+
+ CPPFLAGS="$cf_save_CPPFLAGS"
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_cv_header_path_iconv"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 37711 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <iconv.h>
+
+int
+main (void)
+{
+
+ iconv_t cd = iconv_open("","");
+ iconv(cd,NULL,NULL,NULL,NULL);
+ iconv_close(cd);
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:37730: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:37733: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:37736: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:37739: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ test -n "$verbose" && echo " ... found iconv headers in $cf_cv_header_path_iconv" 1>&6
+
+echo "${as_me:-configure}:37744: testing ... found iconv headers in $cf_cv_header_path_iconv ..." 1>&5
+
+ cf_cv_find_linkage_iconv=maybe
+ cf_test_CPPFLAGS="$CPPFLAGS"
+ break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+ CPPFLAGS="$cf_save_CPPFLAGS"
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ fi
+ done
+
+ if test "$cf_cv_find_linkage_iconv" = maybe ; then
+
+echo "${as_me:-configure}:37762: testing Searching for iconv library in FIND_LINKAGE(iconv,) ..." 1>&5
+
+ cf_save_LIBS="$LIBS"
+ cf_save_LDFLAGS="$LDFLAGS"
+
+ if test "$cf_cv_find_linkage_iconv" != yes ; then
+
+cf_search=
+cf_library_path_list=""
+if test -n "${LDFLAGS}${LIBS}" ; then
+ for cf_library_path in $LDFLAGS $LIBS
+ do
+ case "$cf_library_path" in
+ (-L*)
+ cf_library_path=`echo ".$cf_library_path" |sed -e 's/^...//' -e 's,/lib$,,'`
+
+test "x$cf_library_path" != "xNONE" && \
+test -d "$cf_library_path" && \
+ {
+ test -n "$verbose" && echo " ... testing for lib-directories under $cf_library_path"
+ test -d "$cf_library_path/lib" && cf_search="$cf_search $cf_library_path/lib"
+ test -d "$cf_library_path/lib/iconv" && cf_search="$cf_search $cf_library_path/lib/iconv"
+ test -d "$cf_library_path/lib/iconv/lib" && cf_search="$cf_search $cf_library_path/lib/iconv/lib"
+ test -d "$cf_library_path/iconv/lib" && cf_search="$cf_search $cf_library_path/iconv/lib"
+ test -d "$cf_library_path/iconv/lib/iconv" && cf_search="$cf_search $cf_library_path/iconv/lib/iconv"
+}
+
+ cf_library_path_list="$cf_library_path_list $cf_search"
+ ;;
+ esac
+ done
+fi
+
+cf_search=
+
+test "x$prefix" != "xNONE" && \
+test -d "$prefix" && \
+ {
+ test -n "$verbose" && echo " ... testing for lib-directories under $prefix"
+ test -d "$prefix/lib" && cf_search="$cf_search $prefix/lib"
+ test -d "$prefix/lib/iconv" && cf_search="$cf_search $prefix/lib/iconv"
+ test -d "$prefix/lib/iconv/lib" && cf_search="$cf_search $prefix/lib/iconv/lib"
+ test -d "$prefix/iconv/lib" && cf_search="$cf_search $prefix/iconv/lib"
+ test -d "$prefix/iconv/lib/iconv" && cf_search="$cf_search $prefix/iconv/lib/iconv"
+}
+
+for cf_subdir_prefix in \
+ /usr \
+ /usr/local \
+ /usr/pkg \
+ /opt \
+ /opt/local \
+ $HOME
+do
+
+test "x$cf_subdir_prefix" != "x$prefix" && \
+test -d "$cf_subdir_prefix" && \
+{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
+ test -n "$verbose" && echo " ... testing for lib-directories under $cf_subdir_prefix"
+ test -d "$cf_subdir_prefix/lib" && cf_search="$cf_search $cf_subdir_prefix/lib"
+ test -d "$cf_subdir_prefix/lib/iconv" && cf_search="$cf_search $cf_subdir_prefix/lib/iconv"
+ test -d "$cf_subdir_prefix/lib/iconv/lib" && cf_search="$cf_search $cf_subdir_prefix/lib/iconv/lib"
+ test -d "$cf_subdir_prefix/iconv/lib" && cf_search="$cf_search $cf_subdir_prefix/iconv/lib"
+ test -d "$cf_subdir_prefix/iconv/lib/iconv" && cf_search="$cf_search $cf_subdir_prefix/iconv/lib/iconv"
+}
+
+done
+
+cf_search="$cf_library_path_list $cf_search"
+
+ for cf_cv_library_path_iconv in $cf_search
+ do
+ if test -d "$cf_cv_library_path_iconv" ; then
+ test -n "$verbose" && echo " ... testing $cf_cv_library_path_iconv" 1>&6
+
+echo "${as_me:-configure}:37837: testing ... testing $cf_cv_library_path_iconv ..." 1>&5
+
+ CPPFLAGS="$cf_test_CPPFLAGS"
+ LIBS="-liconv $cf_save_LIBS"
+ LDFLAGS="$cf_save_LDFLAGS -L$cf_cv_library_path_iconv"
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 37843 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <iconv.h>
+
+int
+main (void)
+{
+
+ iconv_t cd = iconv_open("","");
+ iconv(cd,NULL,NULL,NULL,NULL);
+ iconv_close(cd);
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:37862: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:37865: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:37868: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:37871: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ test -n "$verbose" && echo " ... found iconv library in $cf_cv_library_path_iconv" 1>&6
+
+echo "${as_me:-configure}:37876: testing ... found iconv library in $cf_cv_library_path_iconv ..." 1>&5
+
+ cf_cv_find_linkage_iconv=yes
+ cf_cv_library_file_iconv="-liconv"
+ break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+ CPPFLAGS="$cf_save_CPPFLAGS"
+ LIBS="$cf_save_LIBS"
+ LDFLAGS="$cf_save_LDFLAGS"
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+ fi
+ done
+ CPPFLAGS="$cf_save_CPPFLAGS"
+ LDFLAGS="$cf_save_LDFLAGS"
+ fi
+
+ else
+ cf_cv_find_linkage_iconv=no
+ fi
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+LIBS="$cf_save_LIBS"
+
+if test "$cf_cv_find_linkage_iconv" = yes ; then
+am_cv_func_iconv=yes
+else
+am_cv_func_iconv="no, consider installing GNU libiconv"
+fi
+
+fi
+echo "$as_me:37916: result: $am_cv_func_iconv" >&5
+echo "${ECHO_T}$am_cv_func_iconv" >&6
+
+ if test "$am_cv_func_iconv" = yes; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_ICONV 1
+EOF
+
+ echo "$as_me:37925: checking if the declaration of iconv() needs const." >&5
+echo $ECHO_N "checking if the declaration of iconv() needs const.... $ECHO_C" >&6
+if test "${am_cv_proto_iconv_const+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 37932 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <iconv.h>
+
+extern
+#ifdef __cplusplus
+"C"
+#endif
+#if defined(__STDC__) || defined(__cplusplus)
+size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
+#else
+size_t iconv();
+#endif
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:37957: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:37960: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:37963: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:37966: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ am_cv_proto_iconv_const=no
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+am_cv_proto_iconv_const=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:37976: result: $am_cv_proto_iconv_const" >&5
+echo "${ECHO_T}$am_cv_proto_iconv_const" >&6
+
+ if test "$am_cv_proto_iconv_const" = yes ; then
+ am_cv_proto_iconv_arg1="const"
+ else
+ am_cv_proto_iconv_arg1=""
+ fi
+
+cat >>confdefs.h <<EOF
+#define ICONV_CONST $am_cv_proto_iconv_arg1
+EOF
+
+ fi
+
+ LIBICONV=
+ if test "$cf_cv_find_linkage_iconv" = yes; then
+
+if test -n "$cf_cv_header_path_iconv" ; then
+ for cf_add_incdir in $cf_cv_header_path_iconv
+ do
+ while test "$cf_add_incdir" != /usr/include
+ do
+ if test -d "$cf_add_incdir"
+ then
+ cf_have_incdir=no
+ if test -n "$CFLAGS$CPPFLAGS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+ if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+ cf_have_incdir=yes; break
+ fi
+ done
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ if test "$cf_add_incdir" = /usr/local/include ; then
+ if test "$GCC" = yes
+ then
+ cf_save_CPPFLAGS=$CPPFLAGS
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 38021 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:38033: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:38036: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:38039: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:38042: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ CPPFLAGS=$cf_save_CPPFLAGS
+ fi
+ fi
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:38059: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+ CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+ cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+ test "$cf_top_incdir" = "$cf_add_incdir" && break
+ cf_add_incdir="$cf_top_incdir"
+ else
+ break
+ fi
+ else
+ break
+ fi
+ done
+ done
+fi
+
+ if test -n "$cf_cv_library_file_iconv" ; then
+ LIBICONV="-liconv"
+
+if test -n "$cf_cv_library_path_iconv" ; then
+ for cf_add_libdir in $cf_cv_library_path_iconv
+ do
+ if test "$cf_add_libdir" = /usr/lib ; then
+ :
+ elif test -d "$cf_add_libdir"
+ then
+ cf_have_libdir=no
+ if test -n "$LDFLAGS$LIBS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_libdir in $LDFLAGS $LIBS ; do
+ if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
+ cf_have_libdir=yes; break
+ fi
+ done
+ fi
+ if test "$cf_have_libdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
+
+echo "${as_me:-configure}:38098: testing adding $cf_add_libdir to library-path ..." 1>&5
+
+ LDFLAGS="-L$cf_add_libdir $LDFLAGS"
+ fi
+ fi
+ done
+fi
+
+ fi
+ fi
+
+if test "x$am_cv_func_iconv" = "xyes"
+then
+
+echo "$as_me:38112: checking if experimental support for Chinese UTF-8 should be used" >&5
+echo $ECHO_N "checking if experimental support for Chinese UTF-8 should be used... $ECHO_C" >&6
+
+# Check whether --enable-chinese-utf8 or --disable-chinese-utf8 was given.
+if test "${enable_chinese_utf8+set}" = set; then
+ enableval="$enable_chinese_utf8"
+ test "$enableval" != yes && enableval=no
+ if test "$enableval" != "no" ; then
+ use_cn_utf8=$enableval
+ else
+ use_cn_utf8=yes
+ fi
+else
+ enableval=no
+ use_cn_utf8=yes
+
+fi;
+echo "$as_me:38129: result: $use_cn_utf8" >&5
+echo "${ECHO_T}$use_cn_utf8" >&6
+if test "$use_cn_utf8" != no ; then
+
+cat >>confdefs.h <<\EOF
+#define EXP_CHINESEUTF8_SUPPORT 1
+EOF
+
+ use_cjk_utf8=yes
+fi
+
+echo "$as_me:38140: checking if support for Japanese UTF-8 should be used" >&5
+echo $ECHO_N "checking if support for Japanese UTF-8 should be used... $ECHO_C" >&6
+
+# Check whether --enable-japanese-utf8 or --disable-japanese-utf8 was given.
+if test "${enable_japanese_utf8+set}" = set; then
+ enableval="$enable_japanese_utf8"
+ test "$enableval" != no && enableval=yes
+ if test "$enableval" != "yes" ; then
+ use_ja_utf8=$enableval
+ else
+ use_ja_utf8=yes
+ fi
+else
+ enableval=yes
+ use_ja_utf8=yes
+
+fi;
+echo "$as_me:38157: result: $use_ja_utf8" >&5
+echo "${ECHO_T}$use_ja_utf8" >&6
+if test "$use_ja_utf8" != no ; then
+
+cat >>confdefs.h <<\EOF
+#define USE_JAPANESEUTF8_SUPPORT 1
+EOF
+
+ use_cjk_utf8=yes
+fi
+
+if test $use_cjk_utf8 = yes
+then
+ if test "$USE_NLS" != yes ; then
+ LIBS="$LIBICONV $LIBS"
+ fi
+fi
+
+else
+ test -n "$verbose" && echo " skipping CJK features which depend on iconv" 1>&6
+
+echo "${as_me:-configure}:38178: testing skipping CJK features which depend on iconv ..." 1>&5
+
+fi
+
+echo "$as_me:38182: checking if experimental wcwidth/UTF-8 logic should be used" >&5
+echo $ECHO_N "checking if experimental wcwidth/UTF-8 logic should be used... $ECHO_C" >&6
+
+# Check whether --enable-wcwidth-support or --disable-wcwidth-support was given.
+if test "${enable_wcwidth_support+set}" = set; then
+ enableval="$enable_wcwidth_support"
+ test "$enableval" != yes && enableval=no
+ if test "$enableval" != "no" ; then
+ use_wcwidth=$enableval
+ else
+ use_wcwidth=no
+ fi
+else
+ enableval=no
+ use_wcwidth=no
+
+fi;
+echo "$as_me:38199: result: $use_wcwidth" >&5
+echo "${ECHO_T}$use_wcwidth" >&6
+test "$use_wcwidth" != no &&
+cat >>confdefs.h <<\EOF
+#define EXP_WCWIDTH_SUPPORT 1
+EOF
+
+use_dft_colors=no
+case "$cf_cv_screen" in
+(curses|slang|ncurses*)
+ use_dft_colors=maybe
+ ;;
+esac
+
+if test "$use_dft_colors" != no ; then
+echo "$as_me:38214: checking if you want to use default-colors" >&5
+echo $ECHO_N "checking if you want to use default-colors... $ECHO_C" >&6
+
+# Check whether --enable-default-colors or --disable-default-colors was given.
+if test "${enable_default_colors+set}" = set; then
+ enableval="$enable_default_colors"
+ test "$enableval" != yes && enableval=no
+ if test "$enableval" != "no" ; then
+ use_dft_colors=yes
+ else
+ use_dft_colors=no
+ fi
+else
+ enableval=no
+ use_dft_colors=no
+
+fi;
+echo "$as_me:38231: result: $use_dft_colors" >&5
+echo "${ECHO_T}$use_dft_colors" >&6
+test "$use_dft_colors" = "yes" &&
+cat >>confdefs.h <<\EOF
+#define USE_DEFAULT_COLORS 1
+EOF
+
+fi
+
+echo "$as_me:38240: checking if experimental keyboard-layout logic should be used" >&5
+echo $ECHO_N "checking if experimental keyboard-layout logic should be used... $ECHO_C" >&6
+
+# Check whether --enable-kbd-layout or --disable-kbd-layout was given.
+if test "${enable_kbd_layout+set}" = set; then
+ enableval="$enable_kbd_layout"
+ test "$enableval" != yes && enableval=no
+ if test "$enableval" != "no" ; then
+ use_kbd_layout=$enableval
+ else
+ use_kbd_layout=no
+ fi
+else
+ enableval=no
+ use_kbd_layout=no
+
+fi;
+echo "$as_me:38257: result: $use_kbd_layout" >&5
+echo "${ECHO_T}$use_kbd_layout" >&6
+test "$use_kbd_layout" != no &&
+cat >>confdefs.h <<\EOF
+#define EXP_KEYBOARD_LAYOUT 1
+EOF
+
+echo "$as_me:38264: checking if experimental nested-table logic should be used" >&5
+echo $ECHO_N "checking if experimental nested-table logic should be used... $ECHO_C" >&6
+
+# Check whether --enable-nested-tables or --disable-nested-tables was given.
+if test "${enable_nested_tables+set}" = set; then
+ enableval="$enable_nested_tables"
+ test "$enableval" != yes && enableval=no
+ if test "$enableval" != "no" ; then
+ use_nested_tables=$enableval
+ else
+ use_nested_tables=no
+ fi
+else
+ enableval=no
+ use_nested_tables=no
+
+fi;
+echo "$as_me:38281: result: $use_nested_tables" >&5
+echo "${ECHO_T}$use_nested_tables" >&6
+test "$use_nested_tables" != no &&
+cat >>confdefs.h <<\EOF
+#define EXP_NESTED_TABLES 1
+EOF
+
+echo "$as_me:38288: checking if alternative line-edit bindings should be used" >&5
+echo $ECHO_N "checking if alternative line-edit bindings should be used... $ECHO_C" >&6
+
+# Check whether --enable-alt-bindings or --disable-alt-bindings was given.
+if test "${enable_alt_bindings+set}" = set; then
+ enableval="$enable_alt_bindings"
+ test "$enableval" != no && enableval=yes
+ if test "$enableval" != "yes" ; then
+ use_alt_bindings=$enableval
+ else
+ use_alt_bindings=yes
+ fi
+else
+ enableval=yes
+ use_alt_bindings=yes
+
+fi;
+echo "$as_me:38305: result: $use_alt_bindings" >&5
+echo "${ECHO_T}$use_alt_bindings" >&6
+test "$use_alt_bindings" != no &&
+cat >>confdefs.h <<\EOF
+#define USE_ALT_BINDINGS 1
+EOF
+
+echo "$as_me:38312: checking if ascii case-conversion should be used" >&5
+echo $ECHO_N "checking if ascii case-conversion should be used... $ECHO_C" >&6
+
+# Check whether --enable-ascii-ctypes or --disable-ascii-ctypes was given.
+if test "${enable_ascii_ctypes+set}" = set; then
+ enableval="$enable_ascii_ctypes"
+ test "$enableval" != no && enableval=yes
+ if test "$enableval" != "yes" ; then
+ use_ascii_ctypes=$enableval
+ else
+ use_ascii_ctypes=yes
+ fi
+else
+ enableval=yes
+ use_ascii_ctypes=yes
+
+fi;
+echo "$as_me:38329: result: $use_ascii_ctypes" >&5
+echo "${ECHO_T}$use_ascii_ctypes" >&6
+test "$use_ascii_ctypes" != no &&
+cat >>confdefs.h <<\EOF
+#define USE_ASCII_CTYPES 1
+EOF
+
+echo "$as_me:38336: checking if you want to use extended HTML DTD logic" >&5
+echo $ECHO_N "checking if you want to use extended HTML DTD logic... $ECHO_C" >&6
+
+# Check whether --enable-extended-dtd or --disable-extended-dtd was given.
+if test "${enable_extended_dtd+set}" = set; then
+ enableval="$enable_extended_dtd"
+ test "$enableval" != no && enableval=yes
+ if test "$enableval" != "yes" ; then
+ use_ext_htmldtd=no
+ else
+ use_ext_htmldtd=yes
+ fi
+else
+ enableval=yes
+ use_ext_htmldtd=yes
+
+fi;
+echo "$as_me:38353: result: $use_ext_htmldtd" >&5
+echo "${ECHO_T}$use_ext_htmldtd" >&6
+test "$use_ext_htmldtd" = "no" &&
+cat >>confdefs.h <<\EOF
+#define NO_EXTENDED_HTMLDTD 1
+EOF
+
+echo "$as_me:38360: checking if file-upload logic should be used" >&5
+echo $ECHO_N "checking if file-upload logic should be used... $ECHO_C" >&6
+
+# Check whether --enable-file-upload or --disable-file-upload was given.
+if test "${enable_file_upload+set}" = set; then
+ enableval="$enable_file_upload"
+ test "$enableval" != no && enableval=yes
+ if test "$enableval" != "yes" ; then
+ use_file_upload=$enableval
+ else
+ use_file_upload=yes
+ fi
+else
+ enableval=yes
+ use_file_upload=yes
+
+fi;
+echo "$as_me:38377: result: $use_file_upload" >&5
+echo "${ECHO_T}$use_file_upload" >&6
+test "$use_file_upload" != no &&
+cat >>confdefs.h <<\EOF
+#define USE_FILE_UPLOAD 1
+EOF
+
+echo "$as_me:38384: checking if IDNA support should be used" >&5
+echo $ECHO_N "checking if IDNA support should be used... $ECHO_C" >&6
+
+# Check whether --enable-idna or --disable-idna was given.
+if test "${enable_idna+set}" = set; then
+ enableval="$enable_idna"
+ test "$enableval" != no && enableval=yes
+ if test "$enableval" != "yes" ; then
+ use_idna=$enableval
+ else
+ use_idna=yes
+ fi
+else
+ enableval=yes
+ use_idna=yes
+
+fi;
+echo "$as_me:38401: result: $use_idna" >&5
+echo "${ECHO_T}$use_idna" >&6
+
+if test "$use_idna" = yes ; then
+
+case "$use_idna" in
+(no)
+ ;;
+(yes)
+ ;;
+(*)
+
+for cf_searchpath in `echo "$use_idna" | tr $PATH_SEPARATOR ' '`; do
+ if test -d "$cf_searchpath/include" ; then
+
+if test -n "$cf_searchpath/include" ; then
+ for cf_add_incdir in $cf_searchpath/include
+ do
+ while test "$cf_add_incdir" != /usr/include
+ do
+ if test -d "$cf_add_incdir"
+ then
+ cf_have_incdir=no
+ if test -n "$CFLAGS$CPPFLAGS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+ if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+ cf_have_incdir=yes; break
+ fi
+ done
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ if test "$cf_add_incdir" = /usr/local/include ; then
+ if test "$GCC" = yes
+ then
+ cf_save_CPPFLAGS=$CPPFLAGS
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 38443 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:38455: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:38458: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:38461: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:38464: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ CPPFLAGS=$cf_save_CPPFLAGS
+ fi
+ fi
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:38481: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+ CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+ cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+ test "$cf_top_incdir" = "$cf_add_incdir" && break
+ cf_add_incdir="$cf_top_incdir"
+ else
+ break
+ fi
+ else
+ break
+ fi
+ done
+ done
+fi
+
+ elif test -d "$cf_searchpath/../include" ; then
+
+if test -n "$cf_searchpath/../include" ; then
+ for cf_add_incdir in $cf_searchpath/../include
+ do
+ while test "$cf_add_incdir" != /usr/include
+ do
+ if test -d "$cf_add_incdir"
+ then
+ cf_have_incdir=no
+ if test -n "$CFLAGS$CPPFLAGS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+ if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+ cf_have_incdir=yes; break
+ fi
+ done
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ if test "$cf_add_incdir" = /usr/local/include ; then
+ if test "$GCC" = yes
+ then
+ cf_save_CPPFLAGS=$CPPFLAGS
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 38527 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:38539: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:38542: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:38545: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:38548: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ CPPFLAGS=$cf_save_CPPFLAGS
+ fi
+ fi
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:38565: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+ CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+ cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+ test "$cf_top_incdir" = "$cf_add_incdir" && break
+ cf_add_incdir="$cf_top_incdir"
+ else
+ break
+ fi
+ else
+ break
+ fi
+ done
+ done
+fi
+
+ else
+{ { echo "$as_me:38583: error: cannot find under $use_idna" >&5
+echo "$as_me: error: cannot find under $use_idna" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+ if test -d "$cf_searchpath/lib" ; then
+
+if test -n "$cf_searchpath/lib" ; then
+ for cf_add_libdir in $cf_searchpath/lib
+ do
+ if test "$cf_add_libdir" = /usr/lib ; then
+ :
+ elif test -d "$cf_add_libdir"
+ then
+ cf_have_libdir=no
+ if test -n "$LDFLAGS$LIBS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_libdir in $LDFLAGS $LIBS ; do
+ if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
+ cf_have_libdir=yes; break
+ fi
+ done
+ fi
+ if test "$cf_have_libdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
+
+echo "${as_me:-configure}:38608: testing adding $cf_add_libdir to library-path ..." 1>&5
+
+ LDFLAGS="-L$cf_add_libdir $LDFLAGS"
+ fi
+ fi
+ done
+fi
+
+ elif test -d "$cf_searchpath" ; then
+
+if test -n "$cf_searchpath" ; then
+ for cf_add_libdir in $cf_searchpath
+ do
+ if test "$cf_add_libdir" = /usr/lib ; then
+ :
+ elif test -d "$cf_add_libdir"
+ then
+ cf_have_libdir=no
+ if test -n "$LDFLAGS$LIBS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_libdir in $LDFLAGS $LIBS ; do
+ if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
+ cf_have_libdir=yes; break
+ fi
+ done
+ fi
+ if test "$cf_have_libdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
+
+echo "${as_me:-configure}:38637: testing adding $cf_add_libdir to library-path ..." 1>&5
+
+ LDFLAGS="-L$cf_add_libdir $LDFLAGS"
+ fi
+ fi
+ done
+fi
+
+ else
+{ { echo "$as_me:38646: error: cannot find under $use_idna" >&5
+echo "$as_me: error: cannot find under $use_idna" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+done
+
+ ;;
+esac
+
+# If the linkage is not already in the $CPPFLAGS/$LDFLAGS configuration, these
+# will be set on completion of the AC_TRY_LINK below.
+cf_cv_header_path_idn2=
+cf_cv_library_path_idn2=
+
+echo "${as_me:-configure}:38660: testing Starting FIND_LINKAGE(idn2,) ..." 1>&5
+
+cf_save_LIBS="$LIBS"
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 38665 "configure"
+#include "confdefs.h"
+
+#include <stdio.h>
+#include <idn2.h>
+
+int
+main (void)
+{
+
+ char *output = 0;
+ int code = idn2_to_ascii_8z("name", &output, IDN2_USE_STD3_ASCII_RULES);
+ (void) code;
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:38684: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:38687: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:38690: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:38693: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ cf_cv_find_linkage_idn2=yes
+ cf_cv_header_path_idn2=/usr/include
+ cf_cv_library_path_idn2=/usr/lib
+
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+LIBS="-lidn2 $LIBICONV $cf_save_LIBS"
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 38707 "configure"
+#include "confdefs.h"
+
+#include <stdio.h>
+#include <idn2.h>
+
+int
+main (void)
+{
+
+ char *output = 0;
+ int code = idn2_to_ascii_8z("name", &output, IDN2_USE_STD3_ASCII_RULES);
+ (void) code;
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:38726: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:38729: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:38732: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:38735: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ cf_cv_find_linkage_idn2=yes
+ cf_cv_header_path_idn2=/usr/include
+ cf_cv_library_path_idn2=/usr/lib
+ cf_cv_library_file_idn2="-lidn2"
+
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+ cf_cv_find_linkage_idn2=no
+ LIBS="$cf_save_LIBS"
+
+ test -n "$verbose" && echo " find linkage for idn2 library" 1>&6
+
+echo "${as_me:-configure}:38752: testing find linkage for idn2 library ..." 1>&5
+
+echo "${as_me:-configure}:38754: testing Searching for headers in FIND_LINKAGE(idn2,) ..." 1>&5
+
+ cf_save_CPPFLAGS="$CPPFLAGS"
+ cf_test_CPPFLAGS="$CPPFLAGS"
+
+cf_search=
+
+# collect the current set of include-directories from compiler flags
+cf_header_path_list=""
+if test -n "${CFLAGS}${CPPFLAGS}" ; then
+ for cf_header_path in $CPPFLAGS $CFLAGS
+ do
+ case "$cf_header_path" in
+ (-I*)
+ cf_header_path=`echo ".$cf_header_path" |sed -e 's/^...//' -e 's,/include$,,'`
+
+test "x$cf_header_path" != "xNONE" && \
+test -d "$cf_header_path" && \
+ {
+ test -n "$verbose" && echo " ... testing for include-directories under $cf_header_path"
+ test -d "$cf_header_path/include" && cf_search="$cf_search $cf_header_path/include"
+ test -d "$cf_header_path/include/idn2" && cf_search="$cf_search $cf_header_path/include/idn2"
+ test -d "$cf_header_path/include/idn2/include" && cf_search="$cf_search $cf_header_path/include/idn2/include"
+ test -d "$cf_header_path/idn2/include" && cf_search="$cf_search $cf_header_path/idn2/include"
+ test -d "$cf_header_path/idn2/include/idn2" && cf_search="$cf_search $cf_header_path/idn2/include/idn2"
+}
+
+ cf_header_path_list="$cf_header_path_list $cf_search"
+ ;;
+ esac
+ done
+fi
+
+# add the variations for the package we are looking for
+
+cf_search=
+
+test "x$prefix" != "xNONE" && \
+test -d "$prefix" && \
+ {
+ test -n "$verbose" && echo " ... testing for include-directories under $prefix"
+ test -d "$prefix/include" && cf_search="$cf_search $prefix/include"
+ test -d "$prefix/include/idn2" && cf_search="$cf_search $prefix/include/idn2"
+ test -d "$prefix/include/idn2/include" && cf_search="$cf_search $prefix/include/idn2/include"
+ test -d "$prefix/idn2/include" && cf_search="$cf_search $prefix/idn2/include"
+ test -d "$prefix/idn2/include/idn2" && cf_search="$cf_search $prefix/idn2/include/idn2"
+}
+
+for cf_subdir_prefix in \
+ /usr \
+ /usr/local \
+ /usr/pkg \
+ /opt \
+ /opt/local \
+ $HOME
+do
+
+test "x$cf_subdir_prefix" != "x$prefix" && \
+test -d "$cf_subdir_prefix" && \
+{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
+ test -n "$verbose" && echo " ... testing for include-directories under $cf_subdir_prefix"
+ test -d "$cf_subdir_prefix/include" && cf_search="$cf_search $cf_subdir_prefix/include"
+ test -d "$cf_subdir_prefix/include/idn2" && cf_search="$cf_search $cf_subdir_prefix/include/idn2"
+ test -d "$cf_subdir_prefix/include/idn2/include" && cf_search="$cf_search $cf_subdir_prefix/include/idn2/include"
+ test -d "$cf_subdir_prefix/idn2/include" && cf_search="$cf_search $cf_subdir_prefix/idn2/include"
+ test -d "$cf_subdir_prefix/idn2/include/idn2" && cf_search="$cf_search $cf_subdir_prefix/idn2/include/idn2"
+}
+
+done
+
+test "$includedir" != NONE && \
+test "$includedir" != "/usr/include" && \
+test -d "$includedir" && {
+ test -d "$includedir" && cf_search="$cf_search $includedir"
+ test -d "$includedir/idn2" && cf_search="$cf_search $includedir/idn2"
+}
+
+test "$oldincludedir" != NONE && \
+test "$oldincludedir" != "/usr/include" && \
+test -d "$oldincludedir" && {
+ test -d "$oldincludedir" && cf_search="$cf_search $oldincludedir"
+ test -d "$oldincludedir/idn2" && cf_search="$cf_search $oldincludedir/idn2"
+}
+
+cf_search="$cf_search $cf_header_path_list"
+
+ for cf_cv_header_path_idn2 in $cf_search
+ do
+ if test -d "$cf_cv_header_path_idn2" ; then
+ test -n "$verbose" && echo " ... testing $cf_cv_header_path_idn2" 1>&6
+
+echo "${as_me:-configure}:38845: testing ... testing $cf_cv_header_path_idn2 ..." 1>&5
+
+ CPPFLAGS="$cf_save_CPPFLAGS"
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_cv_header_path_idn2"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 38853 "configure"
+#include "confdefs.h"
+
+#include <stdio.h>
+#include <idn2.h>
+
+int
+main (void)
+{
+
+ char *output = 0;
+ int code = idn2_to_ascii_8z("name", &output, IDN2_USE_STD3_ASCII_RULES);
+ (void) code;
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:38872: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:38875: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:38878: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:38881: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ test -n "$verbose" && echo " ... found idn2 headers in $cf_cv_header_path_idn2" 1>&6
+
+echo "${as_me:-configure}:38886: testing ... found idn2 headers in $cf_cv_header_path_idn2 ..." 1>&5
+
+ cf_cv_find_linkage_idn2=maybe
+ cf_test_CPPFLAGS="$CPPFLAGS"
+ break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+ CPPFLAGS="$cf_save_CPPFLAGS"
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ fi
+ done
+
+ if test "$cf_cv_find_linkage_idn2" = maybe ; then
+
+echo "${as_me:-configure}:38904: testing Searching for idn2 library in FIND_LINKAGE(idn2,) ..." 1>&5
+
+ cf_save_LIBS="$LIBS"
+ cf_save_LDFLAGS="$LDFLAGS"
+
+ if test "$cf_cv_find_linkage_idn2" != yes ; then
+
+cf_search=
+cf_library_path_list=""
+if test -n "${LDFLAGS}${LIBS}" ; then
+ for cf_library_path in $LDFLAGS $LIBS
+ do
+ case "$cf_library_path" in
+ (-L*)
+ cf_library_path=`echo ".$cf_library_path" |sed -e 's/^...//' -e 's,/lib$,,'`
+
+test "x$cf_library_path" != "xNONE" && \
+test -d "$cf_library_path" && \
+ {
+ test -n "$verbose" && echo " ... testing for lib-directories under $cf_library_path"
+ test -d "$cf_library_path/lib" && cf_search="$cf_search $cf_library_path/lib"
+ test -d "$cf_library_path/lib/idn2" && cf_search="$cf_search $cf_library_path/lib/idn2"
+ test -d "$cf_library_path/lib/idn2/lib" && cf_search="$cf_search $cf_library_path/lib/idn2/lib"
+ test -d "$cf_library_path/idn2/lib" && cf_search="$cf_search $cf_library_path/idn2/lib"
+ test -d "$cf_library_path/idn2/lib/idn2" && cf_search="$cf_search $cf_library_path/idn2/lib/idn2"
+}
+
+ cf_library_path_list="$cf_library_path_list $cf_search"
+ ;;
+ esac
+ done
+fi
+
+cf_search=
+
+test "x$prefix" != "xNONE" && \
+test -d "$prefix" && \
+ {
+ test -n "$verbose" && echo " ... testing for lib-directories under $prefix"
+ test -d "$prefix/lib" && cf_search="$cf_search $prefix/lib"
+ test -d "$prefix/lib/idn2" && cf_search="$cf_search $prefix/lib/idn2"
+ test -d "$prefix/lib/idn2/lib" && cf_search="$cf_search $prefix/lib/idn2/lib"
+ test -d "$prefix/idn2/lib" && cf_search="$cf_search $prefix/idn2/lib"
+ test -d "$prefix/idn2/lib/idn2" && cf_search="$cf_search $prefix/idn2/lib/idn2"
+}
+
+for cf_subdir_prefix in \
+ /usr \
+ /usr/local \
+ /usr/pkg \
+ /opt \
+ /opt/local \
+ $HOME
+do
+
+test "x$cf_subdir_prefix" != "x$prefix" && \
+test -d "$cf_subdir_prefix" && \
+{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
+ test -n "$verbose" && echo " ... testing for lib-directories under $cf_subdir_prefix"
+ test -d "$cf_subdir_prefix/lib" && cf_search="$cf_search $cf_subdir_prefix/lib"
+ test -d "$cf_subdir_prefix/lib/idn2" && cf_search="$cf_search $cf_subdir_prefix/lib/idn2"
+ test -d "$cf_subdir_prefix/lib/idn2/lib" && cf_search="$cf_search $cf_subdir_prefix/lib/idn2/lib"
+ test -d "$cf_subdir_prefix/idn2/lib" && cf_search="$cf_search $cf_subdir_prefix/idn2/lib"
+ test -d "$cf_subdir_prefix/idn2/lib/idn2" && cf_search="$cf_search $cf_subdir_prefix/idn2/lib/idn2"
+}
+
+done
+
+cf_search="$cf_library_path_list $cf_search"
+
+ for cf_cv_library_path_idn2 in $cf_search
+ do
+ if test -d "$cf_cv_library_path_idn2" ; then
+ test -n "$verbose" && echo " ... testing $cf_cv_library_path_idn2" 1>&6
+
+echo "${as_me:-configure}:38979: testing ... testing $cf_cv_library_path_idn2 ..." 1>&5
+
+ CPPFLAGS="$cf_test_CPPFLAGS"
+ LIBS="-lidn2 $LIBICONV $cf_save_LIBS"
+ LDFLAGS="$cf_save_LDFLAGS -L$cf_cv_library_path_idn2"
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 38985 "configure"
+#include "confdefs.h"
+
+#include <stdio.h>
+#include <idn2.h>
+
+int
+main (void)
+{
+
+ char *output = 0;
+ int code = idn2_to_ascii_8z("name", &output, IDN2_USE_STD3_ASCII_RULES);
+ (void) code;
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:39004: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:39007: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:39010: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:39013: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ test -n "$verbose" && echo " ... found idn2 library in $cf_cv_library_path_idn2" 1>&6
+
+echo "${as_me:-configure}:39018: testing ... found idn2 library in $cf_cv_library_path_idn2 ..." 1>&5
+
+ cf_cv_find_linkage_idn2=yes
+ cf_cv_library_file_idn2="-lidn2"
+ break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+ CPPFLAGS="$cf_save_CPPFLAGS"
+ LIBS="$cf_save_LIBS"
+ LDFLAGS="$cf_save_LDFLAGS"
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+ fi
+ done
+ CPPFLAGS="$cf_save_CPPFLAGS"
+ LDFLAGS="$cf_save_LDFLAGS"
+ fi
+
+ else
+ cf_cv_find_linkage_idn2=no
+ fi
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+LIBS="$cf_save_LIBS"
+
+if test "$cf_cv_find_linkage_idn2" = yes ; then
+
+if test -n "$cf_cv_header_path_idn2" ; then
+ for cf_add_incdir in $cf_cv_header_path_idn2
+ do
+ while test "$cf_add_incdir" != /usr/include
+ do
+ if test -d "$cf_add_incdir"
+ then
+ cf_have_incdir=no
+ if test -n "$CFLAGS$CPPFLAGS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+ if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+ cf_have_incdir=yes; break
+ fi
+ done
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ if test "$cf_add_incdir" = /usr/local/include ; then
+ if test "$GCC" = yes
+ then
+ cf_save_CPPFLAGS=$CPPFLAGS
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 39080 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:39092: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:39095: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:39098: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:39101: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ CPPFLAGS=$cf_save_CPPFLAGS
+ fi
+ fi
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:39118: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+ CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+ cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+ test "$cf_top_incdir" = "$cf_add_incdir" && break
+ cf_add_incdir="$cf_top_incdir"
+ else
+ break
+ fi
+ else
+ break
+ fi
+ done
+ done
+fi
+
+if test -n "$cf_cv_library_path_idn2" ; then
+ for cf_add_libdir in $cf_cv_library_path_idn2
+ do
+ if test "$cf_add_libdir" = /usr/lib ; then
+ :
+ elif test -d "$cf_add_libdir"
+ then
+ cf_have_libdir=no
+ if test -n "$LDFLAGS$LIBS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_libdir in $LDFLAGS $LIBS ; do
+ if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
+ cf_have_libdir=yes; break
+ fi
+ done
+ fi
+ if test "$cf_have_libdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
+
+echo "${as_me:-configure}:39154: testing adding $cf_add_libdir to library-path ..." 1>&5
+
+ LDFLAGS="-L$cf_add_libdir $LDFLAGS"
+ fi
+ fi
+ done
+fi
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lidn2; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+else
+test -n "$verbose" && echo " unsuccessful, will try idn (older)" 1>&6
+
+echo "${as_me:-configure}:39181: testing unsuccessful, will try idn (older) ..." 1>&5
+
+fi
+
+if test "x$cf_cv_find_linkage_idn2" = xyes ; then
+ test -n "$verbose" && echo " found idn2 library" 1>&6
+
+echo "${as_me:-configure}:39188: testing found idn2 library ..." 1>&5
+
+cat >>confdefs.h <<\EOF
+#define USE_IDN2 1
+EOF
+
+else
+
+# If the linkage is not already in the $CPPFLAGS/$LDFLAGS configuration, these
+# will be set on completion of the AC_TRY_LINK below.
+cf_cv_header_path_idn=
+cf_cv_library_path_idn=
+
+echo "${as_me:-configure}:39201: testing Starting FIND_LINKAGE(idn,) ..." 1>&5
+
+cf_save_LIBS="$LIBS"
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 39206 "configure"
+#include "confdefs.h"
+
+#include <stdio.h>
+#include <idna.h>
+
+int
+main (void)
+{
+
+ char *output = 0;
+ int code = idna_to_ascii_8z("name", &output, IDNA_USE_STD3_ASCII_RULES);
+ (void) code;
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:39225: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:39228: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:39231: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:39234: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ cf_cv_find_linkage_idn=yes
+ cf_cv_header_path_idn=/usr/include
+ cf_cv_library_path_idn=/usr/lib
+
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+LIBS="-lidn $LIBICONV $cf_save_LIBS"
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 39248 "configure"
+#include "confdefs.h"
+
+#include <stdio.h>
+#include <idna.h>
+
+int
+main (void)
+{
+
+ char *output = 0;
+ int code = idna_to_ascii_8z("name", &output, IDNA_USE_STD3_ASCII_RULES);
+ (void) code;
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:39267: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:39270: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:39273: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:39276: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ cf_cv_find_linkage_idn=yes
+ cf_cv_header_path_idn=/usr/include
+ cf_cv_library_path_idn=/usr/lib
+ cf_cv_library_file_idn="-lidn"
+
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+ cf_cv_find_linkage_idn=no
+ LIBS="$cf_save_LIBS"
+
+ test -n "$verbose" && echo " find linkage for idn library" 1>&6
+
+echo "${as_me:-configure}:39293: testing find linkage for idn library ..." 1>&5
+
+echo "${as_me:-configure}:39295: testing Searching for headers in FIND_LINKAGE(idn,) ..." 1>&5
+
+ cf_save_CPPFLAGS="$CPPFLAGS"
+ cf_test_CPPFLAGS="$CPPFLAGS"
+
+cf_search=
+
+# collect the current set of include-directories from compiler flags
+cf_header_path_list=""
+if test -n "${CFLAGS}${CPPFLAGS}" ; then
+ for cf_header_path in $CPPFLAGS $CFLAGS
+ do
+ case "$cf_header_path" in
+ (-I*)
+ cf_header_path=`echo ".$cf_header_path" |sed -e 's/^...//' -e 's,/include$,,'`
+
+test "x$cf_header_path" != "xNONE" && \
+test -d "$cf_header_path" && \
+ {
+ test -n "$verbose" && echo " ... testing for include-directories under $cf_header_path"
+ test -d "$cf_header_path/include" && cf_search="$cf_search $cf_header_path/include"
+ test -d "$cf_header_path/include/idn" && cf_search="$cf_search $cf_header_path/include/idn"
+ test -d "$cf_header_path/include/idn/include" && cf_search="$cf_search $cf_header_path/include/idn/include"
+ test -d "$cf_header_path/idn/include" && cf_search="$cf_search $cf_header_path/idn/include"
+ test -d "$cf_header_path/idn/include/idn" && cf_search="$cf_search $cf_header_path/idn/include/idn"
+}
+
+ cf_header_path_list="$cf_header_path_list $cf_search"
+ ;;
+ esac
+ done
+fi
+
+# add the variations for the package we are looking for
+
+cf_search=
+
+test "x$prefix" != "xNONE" && \
+test -d "$prefix" && \
+ {
+ test -n "$verbose" && echo " ... testing for include-directories under $prefix"
+ test -d "$prefix/include" && cf_search="$cf_search $prefix/include"
+ test -d "$prefix/include/idn" && cf_search="$cf_search $prefix/include/idn"
+ test -d "$prefix/include/idn/include" && cf_search="$cf_search $prefix/include/idn/include"
+ test -d "$prefix/idn/include" && cf_search="$cf_search $prefix/idn/include"
+ test -d "$prefix/idn/include/idn" && cf_search="$cf_search $prefix/idn/include/idn"
+}
+
+for cf_subdir_prefix in \
+ /usr \
+ /usr/local \
+ /usr/pkg \
+ /opt \
+ /opt/local \
+ $HOME
+do
+
+test "x$cf_subdir_prefix" != "x$prefix" && \
+test -d "$cf_subdir_prefix" && \
+{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
+ test -n "$verbose" && echo " ... testing for include-directories under $cf_subdir_prefix"
+ test -d "$cf_subdir_prefix/include" && cf_search="$cf_search $cf_subdir_prefix/include"
+ test -d "$cf_subdir_prefix/include/idn" && cf_search="$cf_search $cf_subdir_prefix/include/idn"
+ test -d "$cf_subdir_prefix/include/idn/include" && cf_search="$cf_search $cf_subdir_prefix/include/idn/include"
+ test -d "$cf_subdir_prefix/idn/include" && cf_search="$cf_search $cf_subdir_prefix/idn/include"
+ test -d "$cf_subdir_prefix/idn/include/idn" && cf_search="$cf_search $cf_subdir_prefix/idn/include/idn"
+}
+
+done
+
+test "$includedir" != NONE && \
+test "$includedir" != "/usr/include" && \
+test -d "$includedir" && {
+ test -d "$includedir" && cf_search="$cf_search $includedir"
+ test -d "$includedir/idn" && cf_search="$cf_search $includedir/idn"
+}
+
+test "$oldincludedir" != NONE && \
+test "$oldincludedir" != "/usr/include" && \
+test -d "$oldincludedir" && {
+ test -d "$oldincludedir" && cf_search="$cf_search $oldincludedir"
+ test -d "$oldincludedir/idn" && cf_search="$cf_search $oldincludedir/idn"
+}
+
+cf_search="$cf_search $cf_header_path_list"
+
+ for cf_cv_header_path_idn in $cf_search
+ do
+ if test -d "$cf_cv_header_path_idn" ; then
+ test -n "$verbose" && echo " ... testing $cf_cv_header_path_idn" 1>&6
+
+echo "${as_me:-configure}:39386: testing ... testing $cf_cv_header_path_idn ..." 1>&5
+
+ CPPFLAGS="$cf_save_CPPFLAGS"
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_cv_header_path_idn"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 39394 "configure"
+#include "confdefs.h"
+
+#include <stdio.h>
+#include <idna.h>
+
+int
+main (void)
+{
+
+ char *output = 0;
+ int code = idna_to_ascii_8z("name", &output, IDNA_USE_STD3_ASCII_RULES);
+ (void) code;
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:39413: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:39416: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:39419: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:39422: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ test -n "$verbose" && echo " ... found idn headers in $cf_cv_header_path_idn" 1>&6
+
+echo "${as_me:-configure}:39427: testing ... found idn headers in $cf_cv_header_path_idn ..." 1>&5
+
+ cf_cv_find_linkage_idn=maybe
+ cf_test_CPPFLAGS="$CPPFLAGS"
+ break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+ CPPFLAGS="$cf_save_CPPFLAGS"
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ fi
+ done
+
+ if test "$cf_cv_find_linkage_idn" = maybe ; then
+
+echo "${as_me:-configure}:39445: testing Searching for idn library in FIND_LINKAGE(idn,) ..." 1>&5
+
+ cf_save_LIBS="$LIBS"
+ cf_save_LDFLAGS="$LDFLAGS"
+
+ if test "$cf_cv_find_linkage_idn" != yes ; then
+
+cf_search=
+cf_library_path_list=""
+if test -n "${LDFLAGS}${LIBS}" ; then
+ for cf_library_path in $LDFLAGS $LIBS
+ do
+ case "$cf_library_path" in
+ (-L*)
+ cf_library_path=`echo ".$cf_library_path" |sed -e 's/^...//' -e 's,/lib$,,'`
+
+test "x$cf_library_path" != "xNONE" && \
+test -d "$cf_library_path" && \
+ {
+ test -n "$verbose" && echo " ... testing for lib-directories under $cf_library_path"
+ test -d "$cf_library_path/lib" && cf_search="$cf_search $cf_library_path/lib"
+ test -d "$cf_library_path/lib/idn" && cf_search="$cf_search $cf_library_path/lib/idn"
+ test -d "$cf_library_path/lib/idn/lib" && cf_search="$cf_search $cf_library_path/lib/idn/lib"
+ test -d "$cf_library_path/idn/lib" && cf_search="$cf_search $cf_library_path/idn/lib"
+ test -d "$cf_library_path/idn/lib/idn" && cf_search="$cf_search $cf_library_path/idn/lib/idn"
+}
+
+ cf_library_path_list="$cf_library_path_list $cf_search"
+ ;;
+ esac
+ done
+fi
+
+cf_search=
+
+test "x$prefix" != "xNONE" && \
+test -d "$prefix" && \
+ {
+ test -n "$verbose" && echo " ... testing for lib-directories under $prefix"
+ test -d "$prefix/lib" && cf_search="$cf_search $prefix/lib"
+ test -d "$prefix/lib/idn" && cf_search="$cf_search $prefix/lib/idn"
+ test -d "$prefix/lib/idn/lib" && cf_search="$cf_search $prefix/lib/idn/lib"
+ test -d "$prefix/idn/lib" && cf_search="$cf_search $prefix/idn/lib"
+ test -d "$prefix/idn/lib/idn" && cf_search="$cf_search $prefix/idn/lib/idn"
+}
+
+for cf_subdir_prefix in \
+ /usr \
+ /usr/local \
+ /usr/pkg \
+ /opt \
+ /opt/local \
+ $HOME
+do
+
+test "x$cf_subdir_prefix" != "x$prefix" && \
+test -d "$cf_subdir_prefix" && \
+{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
+ test -n "$verbose" && echo " ... testing for lib-directories under $cf_subdir_prefix"
+ test -d "$cf_subdir_prefix/lib" && cf_search="$cf_search $cf_subdir_prefix/lib"
+ test -d "$cf_subdir_prefix/lib/idn" && cf_search="$cf_search $cf_subdir_prefix/lib/idn"
+ test -d "$cf_subdir_prefix/lib/idn/lib" && cf_search="$cf_search $cf_subdir_prefix/lib/idn/lib"
+ test -d "$cf_subdir_prefix/idn/lib" && cf_search="$cf_search $cf_subdir_prefix/idn/lib"
+ test -d "$cf_subdir_prefix/idn/lib/idn" && cf_search="$cf_search $cf_subdir_prefix/idn/lib/idn"
+}
+
+done
+
+cf_search="$cf_library_path_list $cf_search"
+
+ for cf_cv_library_path_idn in $cf_search
+ do
+ if test -d "$cf_cv_library_path_idn" ; then
+ test -n "$verbose" && echo " ... testing $cf_cv_library_path_idn" 1>&6
+
+echo "${as_me:-configure}:39520: testing ... testing $cf_cv_library_path_idn ..." 1>&5
+
+ CPPFLAGS="$cf_test_CPPFLAGS"
+ LIBS="-lidn $LIBICONV $cf_save_LIBS"
+ LDFLAGS="$cf_save_LDFLAGS -L$cf_cv_library_path_idn"
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 39526 "configure"
+#include "confdefs.h"
+
+#include <stdio.h>
+#include <idna.h>
+
+int
+main (void)
+{
+
+ char *output = 0;
+ int code = idna_to_ascii_8z("name", &output, IDNA_USE_STD3_ASCII_RULES);
+ (void) code;
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:39545: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:39548: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:39551: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:39554: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ test -n "$verbose" && echo " ... found idn library in $cf_cv_library_path_idn" 1>&6
+
+echo "${as_me:-configure}:39559: testing ... found idn library in $cf_cv_library_path_idn ..." 1>&5
+
+ cf_cv_find_linkage_idn=yes
+ cf_cv_library_file_idn="-lidn"
+ break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+ CPPFLAGS="$cf_save_CPPFLAGS"
+ LIBS="$cf_save_LIBS"
+ LDFLAGS="$cf_save_LDFLAGS"
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+ fi
+ done
+ CPPFLAGS="$cf_save_CPPFLAGS"
+ LDFLAGS="$cf_save_LDFLAGS"
+ fi
+
+ else
+ cf_cv_find_linkage_idn=no
+ fi
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+LIBS="$cf_save_LIBS"
+
+if test "$cf_cv_find_linkage_idn" = yes ; then
+
+if test -n "$cf_cv_header_path_idn" ; then
+ for cf_add_incdir in $cf_cv_header_path_idn
+ do
+ while test "$cf_add_incdir" != /usr/include
+ do
+ if test -d "$cf_add_incdir"
+ then
+ cf_have_incdir=no
+ if test -n "$CFLAGS$CPPFLAGS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+ if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+ cf_have_incdir=yes; break
+ fi
+ done
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ if test "$cf_add_incdir" = /usr/local/include ; then
+ if test "$GCC" = yes
+ then
+ cf_save_CPPFLAGS=$CPPFLAGS
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 39621 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:39633: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:39636: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:39639: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:39642: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ CPPFLAGS=$cf_save_CPPFLAGS
+ fi
+ fi
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:39659: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+ CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+ cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+ test "$cf_top_incdir" = "$cf_add_incdir" && break
+ cf_add_incdir="$cf_top_incdir"
+ else
+ break
+ fi
+ else
+ break
+ fi
+ done
+ done
+fi
+
+if test -n "$cf_cv_library_path_idn" ; then
+ for cf_add_libdir in $cf_cv_library_path_idn
+ do
+ if test "$cf_add_libdir" = /usr/lib ; then
+ :
+ elif test -d "$cf_add_libdir"
+ then
+ cf_have_libdir=no
+ if test -n "$LDFLAGS$LIBS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_libdir in $LDFLAGS $LIBS ; do
+ if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
+ cf_have_libdir=yes; break
+ fi
+ done
+ fi
+ if test "$cf_have_libdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
+
+echo "${as_me:-configure}:39695: testing adding $cf_add_libdir to library-path ..." 1>&5
+
+ LDFLAGS="-L$cf_add_libdir $LDFLAGS"
+ fi
+ fi
+ done
+fi
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lidn; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+else
+{ echo "$as_me:39720: WARNING: Cannot find idn library" >&5
+echo "$as_me: WARNING: Cannot find idn library" >&2;}
+fi
+
+if test "x$cf_cv_find_linkage_idn" = xyes ; then
+ test -n "$verbose" && echo " found idn library" 1>&6
+
+echo "${as_me:-configure}:39727: testing found idn library ..." 1>&5
+
+cat >>confdefs.h <<\EOF
+#define USE_IDNA 1
+EOF
+
+fi
+fi
+
+fi
+
+echo "$as_me:39738: checking if element-justification logic should be used" >&5
+echo $ECHO_N "checking if element-justification logic should be used... $ECHO_C" >&6
+
+# Check whether --enable-justify-elts or --disable-justify-elts was given.
+if test "${enable_justify_elts+set}" = set; then
+ enableval="$enable_justify_elts"
+ test "$enableval" != no && enableval=yes
+ if test "$enableval" != "yes" ; then
+ use_justify_elts=$enableval
+ else
+ use_justify_elts=yes
+ fi
+else
+ enableval=yes
+ use_justify_elts=yes
+
+fi;
+echo "$as_me:39755: result: $use_justify_elts" >&5
+echo "${ECHO_T}$use_justify_elts" >&6
+test "$use_justify_elts" != no &&
+cat >>confdefs.h <<\EOF
+#define USE_JUSTIFY_ELTS 1
+EOF
+
+echo "$as_me:39762: checking if partial-display should be used" >&5
+echo $ECHO_N "checking if partial-display should be used... $ECHO_C" >&6
+
+# Check whether --enable-partial or --disable-partial was given.
+if test "${enable_partial+set}" = set; then
+ enableval="$enable_partial"
+ test "$enableval" != no && enableval=yes
+ if test "$enableval" != "yes" ; then
+ use_partial_display=$enableval
+ else
+ use_partial_display=yes
+ fi
+else
+ enableval=yes
+ use_partial_display=yes
+
+fi;
+echo "$as_me:39779: result: $use_partial_display" >&5
+echo "${ECHO_T}$use_partial_display" >&6
+test "$use_partial_display" != no &&
+cat >>confdefs.h <<\EOF
+#define DISP_PARTIAL 1
+EOF
+
+echo "$as_me:39786: checking if persistent-cookie logic should be used" >&5
+echo $ECHO_N "checking if persistent-cookie logic should be used... $ECHO_C" >&6
+
+# Check whether --enable-persistent-cookies or --disable-persistent-cookies was given.
+if test "${enable_persistent_cookies+set}" = set; then
+ enableval="$enable_persistent_cookies"
+ test "$enableval" != no && enableval=yes
+ if test "$enableval" != "yes" ; then
+ use_filed_cookies=$enableval
+ else
+ use_filed_cookies=yes
+ fi
+else
+ enableval=yes
+ use_filed_cookies=yes
+
+fi;
+echo "$as_me:39803: result: $use_filed_cookies" >&5
+echo "${ECHO_T}$use_filed_cookies" >&6
+test "$use_filed_cookies" != no &&
+cat >>confdefs.h <<\EOF
+#define USE_PERSISTENT_COOKIES 1
+EOF
+
+echo "$as_me:39810: checking if html source should be colorized" >&5
+echo $ECHO_N "checking if html source should be colorized... $ECHO_C" >&6
+
+# Check whether --enable-prettysrc or --disable-prettysrc was given.
+if test "${enable_prettysrc+set}" = set; then
+ enableval="$enable_prettysrc"
+ test "$enableval" != no && enableval=yes
+ if test "$enableval" != "yes" ; then
+ use_prettysrc=$enableval
+ else
+ use_prettysrc=yes
+ fi
+else
+ enableval=yes
+ use_prettysrc=yes
+
+fi;
+echo "$as_me:39827: result: $use_prettysrc" >&5
+echo "${ECHO_T}$use_prettysrc" >&6
+test "$use_prettysrc" != no &&
+cat >>confdefs.h <<\EOF
+#define USE_PRETTYSRC 1
+EOF
+
+echo "$as_me:39834: checking if progress-bar code should be used" >&5
+echo $ECHO_N "checking if progress-bar code should be used... $ECHO_C" >&6
+
+# Check whether --enable-progressbar or --disable-progressbar was given.
+if test "${enable_progressbar+set}" = set; then
+ enableval="$enable_progressbar"
+ test "$enableval" != no && enableval=yes
+ if test "$enableval" != "yes" ; then
+ use_progressbar=$enableval
+ else
+ use_progressbar=yes
+ fi
+else
+ enableval=yes
+ use_progressbar=yes
+
+fi;
+echo "$as_me:39851: result: $use_progressbar" >&5
+echo "${ECHO_T}$use_progressbar" >&6
+test "$use_progressbar" != no &&
+cat >>confdefs.h <<\EOF
+#define USE_PROGRESSBAR 1
+EOF
+
+echo "$as_me:39858: checking if read-progress message should show ETA" >&5
+echo $ECHO_N "checking if read-progress message should show ETA... $ECHO_C" >&6
+
+# Check whether --enable-read-eta or --disable-read-eta was given.
+if test "${enable_read_eta+set}" = set; then
+ enableval="$enable_read_eta"
+ test "$enableval" != no && enableval=yes
+ if test "$enableval" != "yes" ; then
+ use_read_eta=$enableval
+ else
+ use_read_eta=yes
+ fi
+else
+ enableval=yes
+ use_read_eta=yes
+
+fi;
+echo "$as_me:39875: result: $use_read_eta" >&5
+echo "${ECHO_T}$use_read_eta" >&6
+test "$use_read_eta" != no &&
+cat >>confdefs.h <<\EOF
+#define USE_READPROGRESS 1
+EOF
+
+echo "$as_me:39882: checking if source caching should be used" >&5
+echo $ECHO_N "checking if source caching should be used... $ECHO_C" >&6
+
+# Check whether --enable-source-cache or --disable-source-cache was given.
+if test "${enable_source_cache+set}" = set; then
+ enableval="$enable_source_cache"
+ test "$enableval" != no && enableval=yes
+ if test "$enableval" != "yes" ; then
+ use_source_cache=$enableval
+ else
+ use_source_cache=yes
+ fi
+else
+ enableval=yes
+ use_source_cache=yes
+
+fi;
+echo "$as_me:39899: result: $use_source_cache" >&5
+echo "${ECHO_T}$use_source_cache" >&6
+test "$use_source_cache" != no &&
+cat >>confdefs.h <<\EOF
+#define USE_SOURCE_CACHE 1
+EOF
+
+echo "$as_me:39906: checking if scrollbar code should be used" >&5
+echo $ECHO_N "checking if scrollbar code should be used... $ECHO_C" >&6
+
+# Check whether --enable-scrollbar or --disable-scrollbar was given.
+if test "${enable_scrollbar+set}" = set; then
+ enableval="$enable_scrollbar"
+ test "$enableval" != no && enableval=yes
+ if test "$enableval" != "yes" ; then
+ use_scrollbar=$enableval
+ else
+ use_scrollbar=yes
+ fi
+else
+ enableval=yes
+ use_scrollbar=yes
+
+fi;
+echo "$as_me:39923: result: $use_scrollbar" >&5
+echo "${ECHO_T}$use_scrollbar" >&6
+
+echo "$as_me:39926: checking if charset-selection logic should be used" >&5
+echo $ECHO_N "checking if charset-selection logic should be used... $ECHO_C" >&6
+
+# Check whether --enable-charset-choice or --disable-charset-choice was given.
+if test "${enable_charset_choice+set}" = set; then
+ enableval="$enable_charset_choice"
+ test "$enableval" != yes && enableval=no
+ if test "$enableval" != "no" ; then
+ use_charset_choice=$enableval
+ else
+ use_charset_choice=no
+ fi
+else
+ enableval=no
+ use_charset_choice=no
+
+fi;
+echo "$as_me:39943: result: $use_charset_choice" >&5
+echo "${ECHO_T}$use_charset_choice" >&6
+test "$use_charset_choice" != no &&
+cat >>confdefs.h <<\EOF
+#define USE_CHARSET_CHOICE 1
+EOF
+
+echo "$as_me:39950: checking if you want to use external commands" >&5
+echo $ECHO_N "checking if you want to use external commands... $ECHO_C" >&6
+
+# Check whether --enable-externs or --disable-externs was given.
+if test "${enable_externs+set}" = set; then
+ enableval="$enable_externs"
+ test "$enableval" != yes && enableval=no
+ if test "$enableval" != "no" ; then
+ use_externs=yes
+ else
+ use_externs=no
+ fi
+else
+ enableval=no
+ use_externs=no
+
+fi;
+echo "$as_me:39967: result: $use_externs" >&5
+echo "${ECHO_T}$use_externs" >&6
+if test "$use_externs" != "no" ; then
+
+cat >>confdefs.h <<\EOF
+#define USE_EXTERNALS 1
+EOF
+
+ EXTRA_OBJS="$EXTRA_OBJS LYExtern\$o"
+fi
+
+echo "$as_me:39978: checking if you want to use setfont support" >&5
+echo $ECHO_N "checking if you want to use setfont support... $ECHO_C" >&6
+
+# Check whether --enable-font-switch or --disable-font-switch was given.
+if test "${enable_font_switch+set}" = set; then
+ enableval="$enable_font_switch"
+ test "$enableval" != yes && enableval=no
+ if test "$enableval" != "no" ; then
+ use_setfont=yes
+ else
+ use_setfont=no
+ fi
+else
+ enableval=no
+ use_setfont=no
+
+fi;
+echo "$as_me:39995: result: $use_setfont" >&5
+echo "${ECHO_T}$use_setfont" >&6
+if test "$use_setfont" = yes ; then
+ case "$host_os" in
+ (linux*)
+
+test -z "$SETFONT" && SETFONT="consolechars"
+for ac_prog in $SETFONT consolechars setfont
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:40006: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_SETFONT+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $SETFONT in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_SETFONT="$SETFONT" # Let the user override the test with a path.
+ ;;
+ *)
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ if $as_executable_p "$ac_dir/$ac_word"; then
+ ac_cv_path_SETFONT="$ac_dir/$ac_word"
+ echo "$as_me:40023: found $ac_dir/$ac_word" >&5
+ break
+fi
+done
+
+ ;;
+esac
+fi
+SETFONT=$ac_cv_path_SETFONT
+
+if test -n "$SETFONT"; then
+ echo "$as_me:40034: result: $SETFONT" >&5
+echo "${ECHO_T}$SETFONT" >&6
+else
+ echo "$as_me:40037: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$SETFONT" && break
+done
+test -n "$SETFONT" || SETFONT="$SETFONT"
+
+cf_path_prog=""
+cf_path_args=""
+IFS="${IFS:- }"; cf_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR"
+for cf_temp in $ac_cv_path_SETFONT
+do
+ if test -z "$cf_path_prog" ; then
+ if test "$with_full_paths" = yes ; then
+
+if test "x$prefix" != xNONE; then
+ cf_path_syntax="$prefix"
+else
+ cf_path_syntax="$ac_default_prefix"
+fi
+
+case ".$cf_temp" in
+(.\$\(*\)*|.\'*\'*)
+ ;;
+(..|./*|.\\*)
+ ;;
+(.[a-zA-Z]:[\\/]*) # OS/2 EMX
+ ;;
+(.\$\{*prefix\}*|.\$\{*dir\}*)
+ eval cf_temp="$cf_temp"
+ case ".$cf_temp" in
+ (.NONE/*)
+ cf_temp=`echo "$cf_temp" | sed -e s%NONE%$cf_path_syntax%`
+ ;;
+ esac
+ ;;
+(.no|.NONE/*)
+ cf_temp=`echo "$cf_temp" | sed -e s%NONE%$cf_path_syntax%`
+ ;;
+(*)
+ break
+ ;;
+esac
+
+ cf_path_prog="$cf_temp"
+ else
+ cf_path_prog="`basename "$cf_temp"`"
+ fi
+ elif test -z "$cf_path_args" ; then
+ cf_path_args="$cf_temp"
+ else
+ cf_path_args="$cf_path_args $cf_temp"
+ fi
+done
+IFS="$cf_save_ifs"
+
+if test -n "$cf_path_prog" ; then
+
+echo "${as_me:-configure}:40096: testing defining path for ${cf_path_prog} ..." 1>&5
+
+cat >>confdefs.h <<EOF
+#define SETFONT_PATH "$cf_path_prog"
+EOF
+
+ test -n "$cf_path_args" &&
+cat >>confdefs.h <<EOF
+#define SETFONT_ARGS "$cf_path_args"
+EOF
+
+fi
+
+ ;;
+ (os2*)
+ SETFONT=built-in
+ test -n "$verbose" && echo " Assume $host_os has font-switching" 1>&6
+
+echo "${as_me:-configure}:40114: testing Assume $host_os has font-switching ..." 1>&5
+
+ ;;
+ (*)
+ SETFONT=unknown
+ test -n "$verbose" && echo " Assume $host_os has no font-switching" 1>&6
+
+echo "${as_me:-configure}:40121: testing Assume $host_os has no font-switching ..." 1>&5
+
+ ;;
+ esac
+ if test -z "$SETFONT" ; then
+ { echo "$as_me:40126: WARNING: Cannot find a font-setting program" >&5
+echo "$as_me: WARNING: Cannot find a font-setting program" >&2;}
+ elif test "$SETFONT" != unknown ; then
+
+cat >>confdefs.h <<\EOF
+#define EXP_CHARTRANS_AUTOSWITCH 1
+EOF
+
+ fi
+fi
+
+echo "$as_me:40137: checking if you want cgi-link support" >&5
+echo $ECHO_N "checking if you want cgi-link support... $ECHO_C" >&6
+
+# Check whether --enable-cgi-links or --disable-cgi-links was given.
+if test "${enable_cgi_links+set}" = set; then
+ enableval="$enable_cgi_links"
+ test "$enableval" != yes && enableval=no
+ if test "$enableval" != "no" ; then
+
+cat >>confdefs.h <<\EOF
+#define LYNXCGI_LINKS 1
+EOF
+
+ fi
+else
+ enableval=no
+fi;
+echo "$as_me:40154: result: $enableval" >&5
+echo "${ECHO_T}$enableval" >&6
+
+echo "$as_me:40157: checking if you want change-exec support" >&5
+echo $ECHO_N "checking if you want change-exec support... $ECHO_C" >&6
+
+# Check whether --enable-change-exec or --disable-change-exec was given.
+if test "${enable_change_exec+set}" = set; then
+ enableval="$enable_change_exec"
+ test "$enableval" != yes && enableval=no
+ if test "$enableval" != "no" ; then
+ use_change_exec=yes
+ else
+ use_change_exec=no
+ fi
+else
+ enableval=no
+ use_change_exec=no
+
+fi;
+echo "$as_me:40174: result: $use_change_exec" >&5
+echo "${ECHO_T}$use_change_exec" >&6
+test "$use_change_exec" = yes &&
+cat >>confdefs.h <<\EOF
+#define ENABLE_OPTS_CHANGE_EXEC 1
+EOF
+
+echo "$as_me:40181: checking if you want exec-links support" >&5
+echo $ECHO_N "checking if you want exec-links support... $ECHO_C" >&6
+
+# Check whether --enable-exec-links or --disable-exec-links was given.
+if test "${enable_exec_links+set}" = set; then
+ enableval="$enable_exec_links"
+ test "$enableval" != no && enableval=yes
+ if test "$enableval" != "$use_change_exec" ; then
+ use_exec_links=$enableval
+ else
+ use_exec_links=$enableval
+ fi
+else
+ enableval=$use_change_exec
+ use_exec_links=$enableval
+
+fi;
+echo "$as_me:40198: result: $use_exec_links" >&5
+echo "${ECHO_T}$use_exec_links" >&6
+test "$use_exec_links" = yes &&
+cat >>confdefs.h <<\EOF
+#define EXEC_LINKS 1
+EOF
+
+echo "$as_me:40205: checking if you want exec-scripts support" >&5
+echo $ECHO_N "checking if you want exec-scripts support... $ECHO_C" >&6
+
+# Check whether --enable-exec-scripts or --disable-exec-scripts was given.
+if test "${enable_exec_scripts+set}" = set; then
+ enableval="$enable_exec_scripts"
+ test "$enableval" != no && enableval=yes
+ if test "$enableval" != "$use_change_exec" ; then
+ use_exec_scripts=$enableval
+ else
+ use_exec_scripts=$enableval
+ fi
+else
+ enableval=$use_change_exec
+ use_exec_scripts=$enableval
+
+fi;
+echo "$as_me:40222: result: $use_exec_scripts" >&5
+echo "${ECHO_T}$use_exec_scripts" >&6
+test "$use_exec_scripts" = yes &&
+cat >>confdefs.h <<\EOF
+#define EXEC_SCRIPTS 1
+EOF
+
+echo "$as_me:40229: checking if you want internal-links feature" >&5
+echo $ECHO_N "checking if you want internal-links feature... $ECHO_C" >&6
+
+# Check whether --enable-internal-links or --disable-internal-links was given.
+if test "${enable_internal_links+set}" = set; then
+ enableval="$enable_internal_links"
+ test "$enableval" != yes && enableval=no
+ if test "$enableval" != "no" ; then
+ use_internal_links=yes
+ else
+ use_internal_links=no
+ fi
+else
+ enableval=no
+ use_internal_links=no
+
+fi;
+echo "$as_me:40246: result: $use_internal_links" >&5
+echo "${ECHO_T}$use_internal_links" >&6
+test "$use_internal_links" = yes &&
+cat >>confdefs.h <<\EOF
+#define TRACK_INTERNAL_LINKS 1
+EOF
+
+echo "$as_me:40253: checking if you want to fork NSL requests" >&5
+echo $ECHO_N "checking if you want to fork NSL requests... $ECHO_C" >&6
+
+# Check whether --enable-nsl-fork or --disable-nsl-fork was given.
+if test "${enable_nsl_fork+set}" = set; then
+ enableval="$enable_nsl_fork"
+ test "$enableval" != yes && enableval=no
+ if test "$enableval" != "no" ; then
+ use_nsl_fork=yes
+ else
+ use_nsl_fork=no
+ fi
+else
+ enableval=no
+ use_nsl_fork=no
+
+fi;
+echo "$as_me:40270: result: $use_nsl_fork" >&5
+echo "${ECHO_T}$use_nsl_fork" >&6
+if test "$use_nsl_fork" = yes ; then
+ case "$host_os" in
+ (mingw*)
+
+cat >>confdefs.h <<\EOF
+#define _WINDOWS_NSL 1
+EOF
+
+ ;;
+ (*)
+
+cat >>confdefs.h <<\EOF
+#define NSL_FORK 1
+EOF
+
+ ;;
+ esac
+fi
+
+echo "$as_me:40291: checking if you want to log URL requests via syslog" >&5
+echo $ECHO_N "checking if you want to log URL requests via syslog... $ECHO_C" >&6
+
+# Check whether --enable-syslog or --disable-syslog was given.
+if test "${enable_syslog+set}" = set; then
+ enableval="$enable_syslog"
+ test "$enableval" != yes && enableval=no
+ if test "$enableval" != "no" ; then
+ use_syslog=yes
+ else
+ use_syslog=no
+ fi
+else
+ enableval=no
+ use_syslog=no
+
+fi;
+echo "$as_me:40308: result: $use_syslog" >&5
+echo "${ECHO_T}$use_syslog" >&6
+test "$use_syslog" = yes &&
+cat >>confdefs.h <<\EOF
+#define SYSLOG_REQUESTED_URLS 1
+EOF
+
+echo "$as_me:40315: checking if you want to underline links" >&5
+echo $ECHO_N "checking if you want to underline links... $ECHO_C" >&6
+
+# Check whether --enable-underlines or --disable-underlines was given.
+if test "${enable_underlines+set}" = set; then
+ enableval="$enable_underlines"
+ test "$enableval" != yes && enableval=no
+ if test "$enableval" != "no" ; then
+ use_underline=yes
+ else
+ use_underline=no
+ fi
+else
+ enableval=no
+ use_underline=no
+
+fi;
+echo "$as_me:40332: result: $use_underline" >&5
+echo "${ECHO_T}$use_underline" >&6
+test "$use_underline" = yes &&
+cat >>confdefs.h <<\EOF
+#define UNDERLINE_LINKS 1
+EOF
+
+test "$use_underline" = no &&
+cat >>confdefs.h <<\EOF
+#define UNDERLINE_LINKS 0
+EOF
+
+echo "$as_me:40344: checking if help files should be gzip'ed" >&5
+echo $ECHO_N "checking if help files should be gzip'ed... $ECHO_C" >&6
+
+# Check whether --enable-gzip-help or --disable-gzip-help was given.
+if test "${enable_gzip_help+set}" = set; then
+ enableval="$enable_gzip_help"
+ test "$enableval" != yes && enableval=no
+ if test "$enableval" != "no" ; then
+ use_gzip_help=$enableval
+ else
+ use_gzip_help=no
+ fi
+else
+ enableval=no
+ use_gzip_help=no
+
+fi;
+echo "$as_me:40361: result: $use_gzip_help" >&5
+echo "${ECHO_T}$use_gzip_help" >&6
+
+echo "$as_me:40364: checking if you want to use libbz2 for decompression of some bzip2 files" >&5
+echo $ECHO_N "checking if you want to use libbz2 for decompression of some bzip2 files... $ECHO_C" >&6
+
+# Check whether --with-bzlib or --without-bzlib was given.
+if test "${with_bzlib+set}" = set; then
+ withval="$with_bzlib"
+ use_bzlib=$withval
+else
+ use_bzlib=no
+fi;
+echo "$as_me:40374: result: $use_bzlib" >&5
+echo "${ECHO_T}$use_bzlib" >&6
+
+if test ".$use_bzlib" != ".no" ; then
+
+case "$use_bzlib" in
+(no)
+ ;;
+(yes)
+ ;;
+(*)
+
+for cf_searchpath in `echo "$use_bzlib" | tr $PATH_SEPARATOR ' '`; do
+ if test -d "$cf_searchpath/include" ; then
+
+if test -n "$cf_searchpath/include" ; then
+ for cf_add_incdir in $cf_searchpath/include
+ do
+ while test "$cf_add_incdir" != /usr/include
+ do
+ if test -d "$cf_add_incdir"
+ then
+ cf_have_incdir=no
+ if test -n "$CFLAGS$CPPFLAGS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+ if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+ cf_have_incdir=yes; break
+ fi
+ done
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ if test "$cf_add_incdir" = /usr/local/include ; then
+ if test "$GCC" = yes
+ then
+ cf_save_CPPFLAGS=$CPPFLAGS
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 40416 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:40428: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:40431: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:40434: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:40437: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ CPPFLAGS=$cf_save_CPPFLAGS
+ fi
+ fi
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:40454: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+ CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+ cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+ test "$cf_top_incdir" = "$cf_add_incdir" && break
+ cf_add_incdir="$cf_top_incdir"
+ else
+ break
+ fi
+ else
+ break
+ fi
+ done
+ done
+fi
+
+ elif test -d "$cf_searchpath/../include" ; then
+
+if test -n "$cf_searchpath/../include" ; then
+ for cf_add_incdir in $cf_searchpath/../include
+ do
+ while test "$cf_add_incdir" != /usr/include
+ do
+ if test -d "$cf_add_incdir"
+ then
+ cf_have_incdir=no
+ if test -n "$CFLAGS$CPPFLAGS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+ if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+ cf_have_incdir=yes; break
+ fi
+ done
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ if test "$cf_add_incdir" = /usr/local/include ; then
+ if test "$GCC" = yes
+ then
+ cf_save_CPPFLAGS=$CPPFLAGS
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 40500 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:40512: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:40515: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:40518: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:40521: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ CPPFLAGS=$cf_save_CPPFLAGS
+ fi
+ fi
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:40538: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+ CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+ cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+ test "$cf_top_incdir" = "$cf_add_incdir" && break
+ cf_add_incdir="$cf_top_incdir"
+ else
+ break
+ fi
+ else
+ break
+ fi
+ done
+ done
+fi
+
+ else
+{ { echo "$as_me:40556: error: cannot find under $use_bzlib" >&5
+echo "$as_me: error: cannot find under $use_bzlib" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+ if test -d "$cf_searchpath/lib" ; then
+
+if test -n "$cf_searchpath/lib" ; then
+ for cf_add_libdir in $cf_searchpath/lib
+ do
+ if test "$cf_add_libdir" = /usr/lib ; then
+ :
+ elif test -d "$cf_add_libdir"
+ then
+ cf_have_libdir=no
+ if test -n "$LDFLAGS$LIBS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_libdir in $LDFLAGS $LIBS ; do
+ if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
+ cf_have_libdir=yes; break
+ fi
+ done
+ fi
+ if test "$cf_have_libdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
+
+echo "${as_me:-configure}:40581: testing adding $cf_add_libdir to library-path ..." 1>&5
+
+ LDFLAGS="-L$cf_add_libdir $LDFLAGS"
+ fi
+ fi
+ done
+fi
+
+ elif test -d "$cf_searchpath" ; then
+
+if test -n "$cf_searchpath" ; then
+ for cf_add_libdir in $cf_searchpath
+ do
+ if test "$cf_add_libdir" = /usr/lib ; then
+ :
+ elif test -d "$cf_add_libdir"
+ then
+ cf_have_libdir=no
+ if test -n "$LDFLAGS$LIBS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_libdir in $LDFLAGS $LIBS ; do
+ if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
+ cf_have_libdir=yes; break
+ fi
+ done
+ fi
+ if test "$cf_have_libdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
+
+echo "${as_me:-configure}:40610: testing adding $cf_add_libdir to library-path ..." 1>&5
+
+ LDFLAGS="-L$cf_add_libdir $LDFLAGS"
+ fi
+ fi
+ done
+fi
+
+ else
+{ { echo "$as_me:40619: error: cannot find under $use_bzlib" >&5
+echo "$as_me: error: cannot find under $use_bzlib" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+done
+
+ ;;
+esac
+
+# If the linkage is not already in the $CPPFLAGS/$LDFLAGS configuration, these
+# will be set on completion of the AC_TRY_LINK below.
+cf_cv_header_path_bz2=
+cf_cv_library_path_bz2=
+
+echo "${as_me:-configure}:40633: testing Starting FIND_LINKAGE(bz2,bzlib) ..." 1>&5
+
+cf_save_LIBS="$LIBS"
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 40638 "configure"
+#include "confdefs.h"
+
+#include <stdio.h>
+#include <bzlib.h>
+
+int
+main (void)
+{
+
+ BZ2_bzopen("name","mode")
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:40655: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:40658: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:40661: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:40664: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ cf_cv_find_linkage_bz2=yes
+ cf_cv_header_path_bz2=/usr/include
+ cf_cv_library_path_bz2=/usr/lib
+
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+LIBS="-lbz2 $cf_save_LIBS"
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 40678 "configure"
+#include "confdefs.h"
+
+#include <stdio.h>
+#include <bzlib.h>
+
+int
+main (void)
+{
+
+ BZ2_bzopen("name","mode")
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:40695: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:40698: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:40701: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:40704: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ cf_cv_find_linkage_bz2=yes
+ cf_cv_header_path_bz2=/usr/include
+ cf_cv_library_path_bz2=/usr/lib
+ cf_cv_library_file_bz2="-lbz2"
+
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+ cf_cv_find_linkage_bz2=no
+ LIBS="$cf_save_LIBS"
+
+ test -n "$verbose" && echo " find linkage for bz2 library" 1>&6
+
+echo "${as_me:-configure}:40721: testing find linkage for bz2 library ..." 1>&5
+
+echo "${as_me:-configure}:40723: testing Searching for headers in FIND_LINKAGE(bz2,bzlib) ..." 1>&5
+
+ cf_save_CPPFLAGS="$CPPFLAGS"
+ cf_test_CPPFLAGS="$CPPFLAGS"
+
+cf_search=
+
+# collect the current set of include-directories from compiler flags
+cf_header_path_list=""
+if test -n "${CFLAGS}${CPPFLAGS}" ; then
+ for cf_header_path in $CPPFLAGS $CFLAGS
+ do
+ case "$cf_header_path" in
+ (-I*)
+ cf_header_path=`echo ".$cf_header_path" |sed -e 's/^...//' -e 's,/include$,,'`
+
+test "x$cf_header_path" != "xNONE" && \
+test -d "$cf_header_path" && \
+ {
+ test -n "$verbose" && echo " ... testing for include-directories under $cf_header_path"
+ test -d "$cf_header_path/include" && cf_search="$cf_search $cf_header_path/include"
+ test -d "$cf_header_path/include/bzlib" && cf_search="$cf_search $cf_header_path/include/bzlib"
+ test -d "$cf_header_path/include/bzlib/include" && cf_search="$cf_search $cf_header_path/include/bzlib/include"
+ test -d "$cf_header_path/bzlib/include" && cf_search="$cf_search $cf_header_path/bzlib/include"
+ test -d "$cf_header_path/bzlib/include/bzlib" && cf_search="$cf_search $cf_header_path/bzlib/include/bzlib"
+}
+
+ cf_header_path_list="$cf_header_path_list $cf_search"
+ ;;
+ esac
+ done
+fi
+
+# add the variations for the package we are looking for
+
+cf_search=
+
+test "x$prefix" != "xNONE" && \
+test -d "$prefix" && \
+ {
+ test -n "$verbose" && echo " ... testing for include-directories under $prefix"
+ test -d "$prefix/include" && cf_search="$cf_search $prefix/include"
+ test -d "$prefix/include/bzlib" && cf_search="$cf_search $prefix/include/bzlib"
+ test -d "$prefix/include/bzlib/include" && cf_search="$cf_search $prefix/include/bzlib/include"
+ test -d "$prefix/bzlib/include" && cf_search="$cf_search $prefix/bzlib/include"
+ test -d "$prefix/bzlib/include/bzlib" && cf_search="$cf_search $prefix/bzlib/include/bzlib"
+}
+
+for cf_subdir_prefix in \
+ /usr \
+ /usr/local \
+ /usr/pkg \
+ /opt \
+ /opt/local \
+ $HOME
+do
+
+test "x$cf_subdir_prefix" != "x$prefix" && \
+test -d "$cf_subdir_prefix" && \
+{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
+ test -n "$verbose" && echo " ... testing for include-directories under $cf_subdir_prefix"
+ test -d "$cf_subdir_prefix/include" && cf_search="$cf_search $cf_subdir_prefix/include"
+ test -d "$cf_subdir_prefix/include/bzlib" && cf_search="$cf_search $cf_subdir_prefix/include/bzlib"
+ test -d "$cf_subdir_prefix/include/bzlib/include" && cf_search="$cf_search $cf_subdir_prefix/include/bzlib/include"
+ test -d "$cf_subdir_prefix/bzlib/include" && cf_search="$cf_search $cf_subdir_prefix/bzlib/include"
+ test -d "$cf_subdir_prefix/bzlib/include/bzlib" && cf_search="$cf_search $cf_subdir_prefix/bzlib/include/bzlib"
+}
+
+done
+
+test "$includedir" != NONE && \
+test "$includedir" != "/usr/include" && \
+test -d "$includedir" && {
+ test -d "$includedir" && cf_search="$cf_search $includedir"
+ test -d "$includedir/bzlib" && cf_search="$cf_search $includedir/bzlib"
+}
+
+test "$oldincludedir" != NONE && \
+test "$oldincludedir" != "/usr/include" && \
+test -d "$oldincludedir" && {
+ test -d "$oldincludedir" && cf_search="$cf_search $oldincludedir"
+ test -d "$oldincludedir/bzlib" && cf_search="$cf_search $oldincludedir/bzlib"
+}
+
+cf_search="$cf_search $cf_header_path_list"
+
+ for cf_cv_header_path_bz2 in $cf_search
+ do
+ if test -d "$cf_cv_header_path_bz2" ; then
+ test -n "$verbose" && echo " ... testing $cf_cv_header_path_bz2" 1>&6
+
+echo "${as_me:-configure}:40814: testing ... testing $cf_cv_header_path_bz2 ..." 1>&5
+
+ CPPFLAGS="$cf_save_CPPFLAGS"
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_cv_header_path_bz2"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 40822 "configure"
+#include "confdefs.h"
+
+#include <stdio.h>
+#include <bzlib.h>
+
+int
+main (void)
+{
+
+ BZ2_bzopen("name","mode")
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:40839: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:40842: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:40845: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:40848: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ test -n "$verbose" && echo " ... found bz2 headers in $cf_cv_header_path_bz2" 1>&6
+
+echo "${as_me:-configure}:40853: testing ... found bz2 headers in $cf_cv_header_path_bz2 ..." 1>&5
+
+ cf_cv_find_linkage_bz2=maybe
+ cf_test_CPPFLAGS="$CPPFLAGS"
+ break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+ CPPFLAGS="$cf_save_CPPFLAGS"
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ fi
+ done
+
+ if test "$cf_cv_find_linkage_bz2" = maybe ; then
+
+echo "${as_me:-configure}:40871: testing Searching for bz2 library in FIND_LINKAGE(bz2,bzlib) ..." 1>&5
+
+ cf_save_LIBS="$LIBS"
+ cf_save_LDFLAGS="$LDFLAGS"
+
+ CPPFLAGS="$cf_test_CPPFLAGS"
+ LIBS="-lbz2 $cf_save_LIBS"
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 40879 "configure"
+#include "confdefs.h"
+
+#include <stdio.h>
+#include <bzlib.h>
+
+int
+main (void)
+{
+
+ BZ2_bzopen("name","mode")
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:40896: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:40899: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:40902: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:40905: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ test -n "$verbose" && echo " ... found bz2 library in system" 1>&6
+
+echo "${as_me:-configure}:40910: testing ... found bz2 library in system ..." 1>&5
+
+ cf_cv_find_linkage_bz2=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+ CPPFLAGS="$cf_save_CPPFLAGS"
+ LIBS="$cf_save_LIBS"
+
+ if test "$cf_cv_find_linkage_bz2" != yes ; then
+
+cf_search=
+cf_library_path_list=""
+if test -n "${LDFLAGS}${LIBS}" ; then
+ for cf_library_path in $LDFLAGS $LIBS
+ do
+ case "$cf_library_path" in
+ (-L*)
+ cf_library_path=`echo ".$cf_library_path" |sed -e 's/^...//' -e 's,/lib$,,'`
+
+test "x$cf_library_path" != "xNONE" && \
+test -d "$cf_library_path" && \
+ {
+ test -n "$verbose" && echo " ... testing for lib-directories under $cf_library_path"
+ test -d "$cf_library_path/lib" && cf_search="$cf_search $cf_library_path/lib"
+ test -d "$cf_library_path/lib/bz2" && cf_search="$cf_search $cf_library_path/lib/bz2"
+ test -d "$cf_library_path/lib/bz2/lib" && cf_search="$cf_search $cf_library_path/lib/bz2/lib"
+ test -d "$cf_library_path/bz2/lib" && cf_search="$cf_search $cf_library_path/bz2/lib"
+ test -d "$cf_library_path/bz2/lib/bz2" && cf_search="$cf_search $cf_library_path/bz2/lib/bz2"
+}
+
+ cf_library_path_list="$cf_library_path_list $cf_search"
+ ;;
+ esac
+ done
+fi
+
+cf_search=
+
+test "x$prefix" != "xNONE" && \
+test -d "$prefix" && \
+ {
+ test -n "$verbose" && echo " ... testing for lib-directories under $prefix"
+ test -d "$prefix/lib" && cf_search="$cf_search $prefix/lib"
+ test -d "$prefix/lib/bz2" && cf_search="$cf_search $prefix/lib/bz2"
+ test -d "$prefix/lib/bz2/lib" && cf_search="$cf_search $prefix/lib/bz2/lib"
+ test -d "$prefix/bz2/lib" && cf_search="$cf_search $prefix/bz2/lib"
+ test -d "$prefix/bz2/lib/bz2" && cf_search="$cf_search $prefix/bz2/lib/bz2"
+}
+
+for cf_subdir_prefix in \
+ /usr \
+ /usr/local \
+ /usr/pkg \
+ /opt \
+ /opt/local \
+ $HOME
+do
+
+test "x$cf_subdir_prefix" != "x$prefix" && \
+test -d "$cf_subdir_prefix" && \
+{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
+ test -n "$verbose" && echo " ... testing for lib-directories under $cf_subdir_prefix"
+ test -d "$cf_subdir_prefix/lib" && cf_search="$cf_search $cf_subdir_prefix/lib"
+ test -d "$cf_subdir_prefix/lib/bz2" && cf_search="$cf_search $cf_subdir_prefix/lib/bz2"
+ test -d "$cf_subdir_prefix/lib/bz2/lib" && cf_search="$cf_search $cf_subdir_prefix/lib/bz2/lib"
+ test -d "$cf_subdir_prefix/bz2/lib" && cf_search="$cf_search $cf_subdir_prefix/bz2/lib"
+ test -d "$cf_subdir_prefix/bz2/lib/bz2" && cf_search="$cf_search $cf_subdir_prefix/bz2/lib/bz2"
+}
+
+done
+
+cf_search="$cf_library_path_list $cf_search"
+
+ for cf_cv_library_path_bz2 in $cf_search
+ do
+ if test -d "$cf_cv_library_path_bz2" ; then
+ test -n "$verbose" && echo " ... testing $cf_cv_library_path_bz2" 1>&6
+
+echo "${as_me:-configure}:40991: testing ... testing $cf_cv_library_path_bz2 ..." 1>&5
+
+ CPPFLAGS="$cf_test_CPPFLAGS"
+ LIBS="-lbz2 $cf_save_LIBS"
+ LDFLAGS="$cf_save_LDFLAGS -L$cf_cv_library_path_bz2"
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 40997 "configure"
+#include "confdefs.h"
+
+#include <stdio.h>
+#include <bzlib.h>
+
+int
+main (void)
+{
+
+ BZ2_bzopen("name","mode")
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:41014: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:41017: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:41020: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:41023: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ test -n "$verbose" && echo " ... found bz2 library in $cf_cv_library_path_bz2" 1>&6
+
+echo "${as_me:-configure}:41028: testing ... found bz2 library in $cf_cv_library_path_bz2 ..." 1>&5
+
+ cf_cv_find_linkage_bz2=yes
+ cf_cv_library_file_bz2="-lbz2"
+ break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+ CPPFLAGS="$cf_save_CPPFLAGS"
+ LIBS="$cf_save_LIBS"
+ LDFLAGS="$cf_save_LDFLAGS"
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+ fi
+ done
+ CPPFLAGS="$cf_save_CPPFLAGS"
+ LDFLAGS="$cf_save_LDFLAGS"
+ fi
+
+ else
+ cf_cv_find_linkage_bz2=no
+ fi
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+LIBS="$cf_save_LIBS"
+
+if test "$cf_cv_find_linkage_bz2" = yes ; then
+
+if test -n "$cf_cv_header_path_bz2" ; then
+ for cf_add_incdir in $cf_cv_header_path_bz2
+ do
+ while test "$cf_add_incdir" != /usr/include
+ do
+ if test -d "$cf_add_incdir"
+ then
+ cf_have_incdir=no
+ if test -n "$CFLAGS$CPPFLAGS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+ if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+ cf_have_incdir=yes; break
+ fi
+ done
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ if test "$cf_add_incdir" = /usr/local/include ; then
+ if test "$GCC" = yes
+ then
+ cf_save_CPPFLAGS=$CPPFLAGS
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 41090 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:41102: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:41105: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:41108: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:41111: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ CPPFLAGS=$cf_save_CPPFLAGS
+ fi
+ fi
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:41128: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+ CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+ cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+ test "$cf_top_incdir" = "$cf_add_incdir" && break
+ cf_add_incdir="$cf_top_incdir"
+ else
+ break
+ fi
+ else
+ break
+ fi
+ done
+ done
+fi
+
+if test -n "$cf_cv_library_path_bz2" ; then
+ for cf_add_libdir in $cf_cv_library_path_bz2
+ do
+ if test "$cf_add_libdir" = /usr/lib ; then
+ :
+ elif test -d "$cf_add_libdir"
+ then
+ cf_have_libdir=no
+ if test -n "$LDFLAGS$LIBS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_libdir in $LDFLAGS $LIBS ; do
+ if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
+ cf_have_libdir=yes; break
+ fi
+ done
+ fi
+ if test "$cf_have_libdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
+
+echo "${as_me:-configure}:41164: testing adding $cf_add_libdir to library-path ..." 1>&5
+
+ LDFLAGS="-L$cf_add_libdir $LDFLAGS"
+ fi
+ fi
+ done
+fi
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lbz2; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+else
+{ echo "$as_me:41189: WARNING: Cannot find bz2 library" >&5
+echo "$as_me: WARNING: Cannot find bz2 library" >&2;}
+fi
+
+ test "x$cf_cv_find_linkage_bz2" = "xyes" &&
+cat >>confdefs.h <<\EOF
+#define USE_BZLIB 1
+EOF
+
+fi
+
+echo "$as_me:41200: checking if you want to use zlib for decompression of some gzip files" >&5
+echo $ECHO_N "checking if you want to use zlib for decompression of some gzip files... $ECHO_C" >&6
+
+# Check whether --with-zlib or --without-zlib was given.
+if test "${with_zlib+set}" = set; then
+ withval="$with_zlib"
+ use_zlib=$withval
+else
+ use_zlib=no
+fi;
+echo "$as_me:41210: result: $use_zlib" >&5
+echo "${ECHO_T}$use_zlib" >&6
+
+if test ".$use_zlib" != ".no" ; then
+
+case "$use_zlib" in
+(no)
+ ;;
+(yes)
+ ;;
+(*)
+
+for cf_searchpath in `echo "$use_zlib" | tr $PATH_SEPARATOR ' '`; do
+ if test -d "$cf_searchpath/include" ; then
+
+if test -n "$cf_searchpath/include" ; then
+ for cf_add_incdir in $cf_searchpath/include
+ do
+ while test "$cf_add_incdir" != /usr/include
+ do
+ if test -d "$cf_add_incdir"
+ then
+ cf_have_incdir=no
+ if test -n "$CFLAGS$CPPFLAGS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+ if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+ cf_have_incdir=yes; break
+ fi
+ done
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ if test "$cf_add_incdir" = /usr/local/include ; then
+ if test "$GCC" = yes
+ then
+ cf_save_CPPFLAGS=$CPPFLAGS
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 41252 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:41264: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:41267: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:41270: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:41273: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ CPPFLAGS=$cf_save_CPPFLAGS
+ fi
+ fi
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:41290: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+ CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+ cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+ test "$cf_top_incdir" = "$cf_add_incdir" && break
+ cf_add_incdir="$cf_top_incdir"
+ else
+ break
+ fi
+ else
+ break
+ fi
+ done
+ done
+fi
+
+ elif test -d "$cf_searchpath/../include" ; then
+
+if test -n "$cf_searchpath/../include" ; then
+ for cf_add_incdir in $cf_searchpath/../include
+ do
+ while test "$cf_add_incdir" != /usr/include
+ do
+ if test -d "$cf_add_incdir"
+ then
+ cf_have_incdir=no
+ if test -n "$CFLAGS$CPPFLAGS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+ if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+ cf_have_incdir=yes; break
+ fi
+ done
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ if test "$cf_add_incdir" = /usr/local/include ; then
+ if test "$GCC" = yes
+ then
+ cf_save_CPPFLAGS=$CPPFLAGS
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 41336 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:41348: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:41351: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:41354: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:41357: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ CPPFLAGS=$cf_save_CPPFLAGS
+ fi
+ fi
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:41374: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+ CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+ cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+ test "$cf_top_incdir" = "$cf_add_incdir" && break
+ cf_add_incdir="$cf_top_incdir"
+ else
+ break
+ fi
+ else
+ break
+ fi
+ done
+ done
+fi
+
+ else
+{ { echo "$as_me:41392: error: cannot find under $use_zlib" >&5
+echo "$as_me: error: cannot find under $use_zlib" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+ if test -d "$cf_searchpath/lib" ; then
+
+if test -n "$cf_searchpath/lib" ; then
+ for cf_add_libdir in $cf_searchpath/lib
+ do
+ if test "$cf_add_libdir" = /usr/lib ; then
+ :
+ elif test -d "$cf_add_libdir"
+ then
+ cf_have_libdir=no
+ if test -n "$LDFLAGS$LIBS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_libdir in $LDFLAGS $LIBS ; do
+ if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
+ cf_have_libdir=yes; break
+ fi
+ done
+ fi
+ if test "$cf_have_libdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
+
+echo "${as_me:-configure}:41417: testing adding $cf_add_libdir to library-path ..." 1>&5
+
+ LDFLAGS="-L$cf_add_libdir $LDFLAGS"
+ fi
+ fi
+ done
+fi
+
+ elif test -d "$cf_searchpath" ; then
+
+if test -n "$cf_searchpath" ; then
+ for cf_add_libdir in $cf_searchpath
+ do
+ if test "$cf_add_libdir" = /usr/lib ; then
+ :
+ elif test -d "$cf_add_libdir"
+ then
+ cf_have_libdir=no
+ if test -n "$LDFLAGS$LIBS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_libdir in $LDFLAGS $LIBS ; do
+ if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
+ cf_have_libdir=yes; break
+ fi
+ done
+ fi
+ if test "$cf_have_libdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
+
+echo "${as_me:-configure}:41446: testing adding $cf_add_libdir to library-path ..." 1>&5
+
+ LDFLAGS="-L$cf_add_libdir $LDFLAGS"
+ fi
+ fi
+ done
+fi
+
+ else
+{ { echo "$as_me:41455: error: cannot find under $use_zlib" >&5
+echo "$as_me: error: cannot find under $use_zlib" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+done
+
+ ;;
+esac
+
+# If the linkage is not already in the $CPPFLAGS/$LDFLAGS configuration, these
+# will be set on completion of the AC_TRY_LINK below.
+cf_cv_header_path_z=
+cf_cv_library_path_z=
+
+echo "${as_me:-configure}:41469: testing Starting FIND_LINKAGE(z,zlib) ..." 1>&5
+
+cf_save_LIBS="$LIBS"
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 41474 "configure"
+#include "confdefs.h"
+
+#include <zlib.h>
+
+int
+main (void)
+{
+
+ gzopen("name","mode")
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:41490: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:41493: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:41496: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:41499: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ cf_cv_find_linkage_z=yes
+ cf_cv_header_path_z=/usr/include
+ cf_cv_library_path_z=/usr/lib
+
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+LIBS="-lz $cf_save_LIBS"
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 41513 "configure"
+#include "confdefs.h"
+
+#include <zlib.h>
+
+int
+main (void)
+{
+
+ gzopen("name","mode")
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:41529: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:41532: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:41535: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:41538: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ cf_cv_find_linkage_z=yes
+ cf_cv_header_path_z=/usr/include
+ cf_cv_library_path_z=/usr/lib
+ cf_cv_library_file_z="-lz"
+
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+ cf_cv_find_linkage_z=no
+ LIBS="$cf_save_LIBS"
+
+ test -n "$verbose" && echo " find linkage for z library" 1>&6
+
+echo "${as_me:-configure}:41555: testing find linkage for z library ..." 1>&5
+
+echo "${as_me:-configure}:41557: testing Searching for headers in FIND_LINKAGE(z,zlib) ..." 1>&5
+
+ cf_save_CPPFLAGS="$CPPFLAGS"
+ cf_test_CPPFLAGS="$CPPFLAGS"
+
+cf_search=
+
+# collect the current set of include-directories from compiler flags
+cf_header_path_list=""
+if test -n "${CFLAGS}${CPPFLAGS}" ; then
+ for cf_header_path in $CPPFLAGS $CFLAGS
+ do
+ case "$cf_header_path" in
+ (-I*)
+ cf_header_path=`echo ".$cf_header_path" |sed -e 's/^...//' -e 's,/include$,,'`
+
+test "x$cf_header_path" != "xNONE" && \
+test -d "$cf_header_path" && \
+ {
+ test -n "$verbose" && echo " ... testing for include-directories under $cf_header_path"
+ test -d "$cf_header_path/include" && cf_search="$cf_search $cf_header_path/include"
+ test -d "$cf_header_path/include/zlib" && cf_search="$cf_search $cf_header_path/include/zlib"
+ test -d "$cf_header_path/include/zlib/include" && cf_search="$cf_search $cf_header_path/include/zlib/include"
+ test -d "$cf_header_path/zlib/include" && cf_search="$cf_search $cf_header_path/zlib/include"
+ test -d "$cf_header_path/zlib/include/zlib" && cf_search="$cf_search $cf_header_path/zlib/include/zlib"
+}
+
+ cf_header_path_list="$cf_header_path_list $cf_search"
+ ;;
+ esac
+ done
+fi
+
+# add the variations for the package we are looking for
+
+cf_search=
+
+test "x$prefix" != "xNONE" && \
+test -d "$prefix" && \
+ {
+ test -n "$verbose" && echo " ... testing for include-directories under $prefix"
+ test -d "$prefix/include" && cf_search="$cf_search $prefix/include"
+ test -d "$prefix/include/zlib" && cf_search="$cf_search $prefix/include/zlib"
+ test -d "$prefix/include/zlib/include" && cf_search="$cf_search $prefix/include/zlib/include"
+ test -d "$prefix/zlib/include" && cf_search="$cf_search $prefix/zlib/include"
+ test -d "$prefix/zlib/include/zlib" && cf_search="$cf_search $prefix/zlib/include/zlib"
+}
+
+for cf_subdir_prefix in \
+ /usr \
+ /usr/local \
+ /usr/pkg \
+ /opt \
+ /opt/local \
+ $HOME
+do
+
+test "x$cf_subdir_prefix" != "x$prefix" && \
+test -d "$cf_subdir_prefix" && \
+{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
+ test -n "$verbose" && echo " ... testing for include-directories under $cf_subdir_prefix"
+ test -d "$cf_subdir_prefix/include" && cf_search="$cf_search $cf_subdir_prefix/include"
+ test -d "$cf_subdir_prefix/include/zlib" && cf_search="$cf_search $cf_subdir_prefix/include/zlib"
+ test -d "$cf_subdir_prefix/include/zlib/include" && cf_search="$cf_search $cf_subdir_prefix/include/zlib/include"
+ test -d "$cf_subdir_prefix/zlib/include" && cf_search="$cf_search $cf_subdir_prefix/zlib/include"
+ test -d "$cf_subdir_prefix/zlib/include/zlib" && cf_search="$cf_search $cf_subdir_prefix/zlib/include/zlib"
+}
+
+done
+
+test "$includedir" != NONE && \
+test "$includedir" != "/usr/include" && \
+test -d "$includedir" && {
+ test -d "$includedir" && cf_search="$cf_search $includedir"
+ test -d "$includedir/zlib" && cf_search="$cf_search $includedir/zlib"
+}
+
+test "$oldincludedir" != NONE && \
+test "$oldincludedir" != "/usr/include" && \
+test -d "$oldincludedir" && {
+ test -d "$oldincludedir" && cf_search="$cf_search $oldincludedir"
+ test -d "$oldincludedir/zlib" && cf_search="$cf_search $oldincludedir/zlib"
+}
+
+cf_search="$cf_search $cf_header_path_list"
+
+ for cf_cv_header_path_z in $cf_search
+ do
+ if test -d "$cf_cv_header_path_z" ; then
+ test -n "$verbose" && echo " ... testing $cf_cv_header_path_z" 1>&6
+
+echo "${as_me:-configure}:41648: testing ... testing $cf_cv_header_path_z ..." 1>&5
+
+ CPPFLAGS="$cf_save_CPPFLAGS"
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_cv_header_path_z"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 41656 "configure"
+#include "confdefs.h"
+
+#include <zlib.h>
+
+int
+main (void)
+{
+
+ gzopen("name","mode")
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:41672: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:41675: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:41678: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:41681: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ test -n "$verbose" && echo " ... found z headers in $cf_cv_header_path_z" 1>&6
+
+echo "${as_me:-configure}:41686: testing ... found z headers in $cf_cv_header_path_z ..." 1>&5
+
+ cf_cv_find_linkage_z=maybe
+ cf_test_CPPFLAGS="$CPPFLAGS"
+ break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+ CPPFLAGS="$cf_save_CPPFLAGS"
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ fi
+ done
+
+ if test "$cf_cv_find_linkage_z" = maybe ; then
+
+echo "${as_me:-configure}:41704: testing Searching for z library in FIND_LINKAGE(z,zlib) ..." 1>&5
+
+ cf_save_LIBS="$LIBS"
+ cf_save_LDFLAGS="$LDFLAGS"
+
+ CPPFLAGS="$cf_test_CPPFLAGS"
+ LIBS="-lz $cf_save_LIBS"
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 41712 "configure"
+#include "confdefs.h"
+
+#include <zlib.h>
+
+int
+main (void)
+{
+
+ gzopen("name","mode")
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:41728: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:41731: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:41734: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:41737: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ test -n "$verbose" && echo " ... found z library in system" 1>&6
+
+echo "${as_me:-configure}:41742: testing ... found z library in system ..." 1>&5
+
+ cf_cv_find_linkage_z=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+ CPPFLAGS="$cf_save_CPPFLAGS"
+ LIBS="$cf_save_LIBS"
+
+ if test "$cf_cv_find_linkage_z" != yes ; then
+
+cf_search=
+cf_library_path_list=""
+if test -n "${LDFLAGS}${LIBS}" ; then
+ for cf_library_path in $LDFLAGS $LIBS
+ do
+ case "$cf_library_path" in
+ (-L*)
+ cf_library_path=`echo ".$cf_library_path" |sed -e 's/^...//' -e 's,/lib$,,'`
+
+test "x$cf_library_path" != "xNONE" && \
+test -d "$cf_library_path" && \
+ {
+ test -n "$verbose" && echo " ... testing for lib-directories under $cf_library_path"
+ test -d "$cf_library_path/lib" && cf_search="$cf_search $cf_library_path/lib"
+ test -d "$cf_library_path/lib/z" && cf_search="$cf_search $cf_library_path/lib/z"
+ test -d "$cf_library_path/lib/z/lib" && cf_search="$cf_search $cf_library_path/lib/z/lib"
+ test -d "$cf_library_path/z/lib" && cf_search="$cf_search $cf_library_path/z/lib"
+ test -d "$cf_library_path/z/lib/z" && cf_search="$cf_search $cf_library_path/z/lib/z"
+}
+
+ cf_library_path_list="$cf_library_path_list $cf_search"
+ ;;
+ esac
+ done
+fi
+
+cf_search=
+
+test "x$prefix" != "xNONE" && \
+test -d "$prefix" && \
+ {
+ test -n "$verbose" && echo " ... testing for lib-directories under $prefix"
+ test -d "$prefix/lib" && cf_search="$cf_search $prefix/lib"
+ test -d "$prefix/lib/z" && cf_search="$cf_search $prefix/lib/z"
+ test -d "$prefix/lib/z/lib" && cf_search="$cf_search $prefix/lib/z/lib"
+ test -d "$prefix/z/lib" && cf_search="$cf_search $prefix/z/lib"
+ test -d "$prefix/z/lib/z" && cf_search="$cf_search $prefix/z/lib/z"
+}
+
+for cf_subdir_prefix in \
+ /usr \
+ /usr/local \
+ /usr/pkg \
+ /opt \
+ /opt/local \
+ $HOME
+do
+
+test "x$cf_subdir_prefix" != "x$prefix" && \
+test -d "$cf_subdir_prefix" && \
+{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
+ test -n "$verbose" && echo " ... testing for lib-directories under $cf_subdir_prefix"
+ test -d "$cf_subdir_prefix/lib" && cf_search="$cf_search $cf_subdir_prefix/lib"
+ test -d "$cf_subdir_prefix/lib/z" && cf_search="$cf_search $cf_subdir_prefix/lib/z"
+ test -d "$cf_subdir_prefix/lib/z/lib" && cf_search="$cf_search $cf_subdir_prefix/lib/z/lib"
+ test -d "$cf_subdir_prefix/z/lib" && cf_search="$cf_search $cf_subdir_prefix/z/lib"
+ test -d "$cf_subdir_prefix/z/lib/z" && cf_search="$cf_search $cf_subdir_prefix/z/lib/z"
+}
+
+done
+
+cf_search="$cf_library_path_list $cf_search"
+
+ for cf_cv_library_path_z in $cf_search
+ do
+ if test -d "$cf_cv_library_path_z" ; then
+ test -n "$verbose" && echo " ... testing $cf_cv_library_path_z" 1>&6
+
+echo "${as_me:-configure}:41823: testing ... testing $cf_cv_library_path_z ..." 1>&5
+
+ CPPFLAGS="$cf_test_CPPFLAGS"
+ LIBS="-lz $cf_save_LIBS"
+ LDFLAGS="$cf_save_LDFLAGS -L$cf_cv_library_path_z"
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 41829 "configure"
+#include "confdefs.h"
+
+#include <zlib.h>
+
+int
+main (void)
+{
+
+ gzopen("name","mode")
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:41845: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:41848: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:41851: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:41854: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ test -n "$verbose" && echo " ... found z library in $cf_cv_library_path_z" 1>&6
+
+echo "${as_me:-configure}:41859: testing ... found z library in $cf_cv_library_path_z ..." 1>&5
+
+ cf_cv_find_linkage_z=yes
+ cf_cv_library_file_z="-lz"
+ break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+ CPPFLAGS="$cf_save_CPPFLAGS"
+ LIBS="$cf_save_LIBS"
+ LDFLAGS="$cf_save_LDFLAGS"
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+ fi
+ done
+ CPPFLAGS="$cf_save_CPPFLAGS"
+ LDFLAGS="$cf_save_LDFLAGS"
+ fi
+
+ else
+ cf_cv_find_linkage_z=no
+ fi
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+LIBS="$cf_save_LIBS"
+
+if test "$cf_cv_find_linkage_z" = yes ; then
+
+if test -n "$cf_cv_header_path_z" ; then
+ for cf_add_incdir in $cf_cv_header_path_z
+ do
+ while test "$cf_add_incdir" != /usr/include
+ do
+ if test -d "$cf_add_incdir"
+ then
+ cf_have_incdir=no
+ if test -n "$CFLAGS$CPPFLAGS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+ if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+ cf_have_incdir=yes; break
+ fi
+ done
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ if test "$cf_add_incdir" = /usr/local/include ; then
+ if test "$GCC" = yes
+ then
+ cf_save_CPPFLAGS=$CPPFLAGS
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 41921 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:41933: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:41936: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:41939: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:41942: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ CPPFLAGS=$cf_save_CPPFLAGS
+ fi
+ fi
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:41959: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+ CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+ cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+ test "$cf_top_incdir" = "$cf_add_incdir" && break
+ cf_add_incdir="$cf_top_incdir"
+ else
+ break
+ fi
+ else
+ break
+ fi
+ done
+ done
+fi
+
+if test -n "$cf_cv_library_path_z" ; then
+ for cf_add_libdir in $cf_cv_library_path_z
+ do
+ if test "$cf_add_libdir" = /usr/lib ; then
+ :
+ elif test -d "$cf_add_libdir"
+ then
+ cf_have_libdir=no
+ if test -n "$LDFLAGS$LIBS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_libdir in $LDFLAGS $LIBS ; do
+ if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
+ cf_have_libdir=yes; break
+ fi
+ done
+ fi
+ if test "$cf_have_libdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
+
+echo "${as_me:-configure}:41995: testing adding $cf_add_libdir to library-path ..." 1>&5
+
+ LDFLAGS="-L$cf_add_libdir $LDFLAGS"
+ fi
+ fi
+ done
+fi
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lz; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+else
+{ echo "$as_me:42020: WARNING: Cannot find z library" >&5
+echo "$as_me: WARNING: Cannot find z library" >&2;}
+fi
+
+for ac_func in \
+ zError \
+
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:42029: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 42035 "configure"
+#include "confdefs.h"
+#define $ac_func autoconf_temporary
+#include <limits.h> /* least-intrusive standard header which defines gcc2 __stub macros */
+#undef $ac_func
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+#error found stub for $ac_func
+#endif
+
+ return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:42066: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:42069: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:42072: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:42075: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+eval "$as_ac_var=no"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:42085: result: `eval echo '${'"$as_ac_var"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_var"'}'`" >&6
+if test "`eval echo '${'"$as_ac_var"'}'`" = yes; then
+ cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+ test "x$cf_cv_find_linkage_z" = "xyes" &&
+cat >>confdefs.h <<\EOF
+#define USE_ZLIB 1
+EOF
+
+fi
+
+echo "$as_me:42102: checking if you want to use brotli decompression" >&5
+echo $ECHO_N "checking if you want to use brotli decompression... $ECHO_C" >&6
+
+# Check whether --with-brotli or --without-brotli was given.
+if test "${with_brotli+set}" = set; then
+ withval="$with_brotli"
+ use_brotli=$withval
+else
+ use_brotli=no
+fi;
+echo "$as_me:42112: result: $use_brotli" >&5
+echo "${ECHO_T}$use_brotli" >&6
+
+if test ".$use_brotli" != ".no" ; then
+
+case "$use_brotli" in
+(no)
+ ;;
+(yes)
+ ;;
+(*)
+
+for cf_searchpath in `echo "$use_brotli" | tr $PATH_SEPARATOR ' '`; do
+ if test -d "$cf_searchpath/include" ; then
+
+if test -n "$cf_searchpath/include" ; then
+ for cf_add_incdir in $cf_searchpath/include
+ do
+ while test "$cf_add_incdir" != /usr/include
+ do
+ if test -d "$cf_add_incdir"
+ then
+ cf_have_incdir=no
+ if test -n "$CFLAGS$CPPFLAGS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+ if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+ cf_have_incdir=yes; break
+ fi
+ done
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ if test "$cf_add_incdir" = /usr/local/include ; then
+ if test "$GCC" = yes
+ then
+ cf_save_CPPFLAGS=$CPPFLAGS
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 42154 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:42166: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:42169: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:42172: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:42175: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ CPPFLAGS=$cf_save_CPPFLAGS
+ fi
+ fi
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:42192: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+ CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+ cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+ test "$cf_top_incdir" = "$cf_add_incdir" && break
+ cf_add_incdir="$cf_top_incdir"
+ else
+ break
+ fi
+ else
+ break
+ fi
+ done
+ done
+fi
+
+ elif test -d "$cf_searchpath/../include" ; then
+
+if test -n "$cf_searchpath/../include" ; then
+ for cf_add_incdir in $cf_searchpath/../include
+ do
+ while test "$cf_add_incdir" != /usr/include
+ do
+ if test -d "$cf_add_incdir"
+ then
+ cf_have_incdir=no
+ if test -n "$CFLAGS$CPPFLAGS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+ if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+ cf_have_incdir=yes; break
+ fi
+ done
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ if test "$cf_add_incdir" = /usr/local/include ; then
+ if test "$GCC" = yes
+ then
+ cf_save_CPPFLAGS=$CPPFLAGS
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 42238 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:42250: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:42253: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:42256: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:42259: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ CPPFLAGS=$cf_save_CPPFLAGS
+ fi
+ fi
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:42276: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+ CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+ cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+ test "$cf_top_incdir" = "$cf_add_incdir" && break
+ cf_add_incdir="$cf_top_incdir"
+ else
+ break
+ fi
+ else
+ break
+ fi
+ done
+ done
+fi
+
+ else
+{ { echo "$as_me:42294: error: cannot find under $use_brotli" >&5
+echo "$as_me: error: cannot find under $use_brotli" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+ if test -d "$cf_searchpath/lib" ; then
+
+if test -n "$cf_searchpath/lib" ; then
+ for cf_add_libdir in $cf_searchpath/lib
+ do
+ if test "$cf_add_libdir" = /usr/lib ; then
+ :
+ elif test -d "$cf_add_libdir"
+ then
+ cf_have_libdir=no
+ if test -n "$LDFLAGS$LIBS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_libdir in $LDFLAGS $LIBS ; do
+ if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
+ cf_have_libdir=yes; break
+ fi
+ done
+ fi
+ if test "$cf_have_libdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
+
+echo "${as_me:-configure}:42319: testing adding $cf_add_libdir to library-path ..." 1>&5
+
+ LDFLAGS="-L$cf_add_libdir $LDFLAGS"
+ fi
+ fi
+ done
+fi
+
+ elif test -d "$cf_searchpath" ; then
+
+if test -n "$cf_searchpath" ; then
+ for cf_add_libdir in $cf_searchpath
+ do
+ if test "$cf_add_libdir" = /usr/lib ; then
+ :
+ elif test -d "$cf_add_libdir"
+ then
+ cf_have_libdir=no
+ if test -n "$LDFLAGS$LIBS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_libdir in $LDFLAGS $LIBS ; do
+ if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
+ cf_have_libdir=yes; break
+ fi
+ done
+ fi
+ if test "$cf_have_libdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
+
+echo "${as_me:-configure}:42348: testing adding $cf_add_libdir to library-path ..." 1>&5
+
+ LDFLAGS="-L$cf_add_libdir $LDFLAGS"
+ fi
+ fi
+ done
+fi
+
+ else
+{ { echo "$as_me:42357: error: cannot find under $use_brotli" >&5
+echo "$as_me: error: cannot find under $use_brotli" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+done
+
+ ;;
+esac
+
+# If the linkage is not already in the $CPPFLAGS/$LDFLAGS configuration, these
+# will be set on completion of the AC_TRY_LINK below.
+cf_cv_header_path_brotlidec=
+cf_cv_library_path_brotlidec=
+
+echo "${as_me:-configure}:42371: testing Starting FIND_LINKAGE(brotlidec,brotlilib) ..." 1>&5
+
+cf_save_LIBS="$LIBS"
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 42376 "configure"
+#include "confdefs.h"
+
+#include <brotli/decode.h>
+
+int
+main (void)
+{
+
+ BrotliDecoderDecompressStream(
+ NULL, /* BrotliDecoderState* state */
+ NULL, /* size_t* available_in */
+ NULL, /* const uint8_t** next_in */
+ NULL, /* size_t* available_out */
+ NULL, /* uint8_t** next_out */
+ NULL /* size_t* total_out */
+ );
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:42399: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:42402: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:42405: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:42408: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ cf_cv_find_linkage_brotlidec=yes
+ cf_cv_header_path_brotlidec=/usr/include
+ cf_cv_library_path_brotlidec=/usr/lib
+
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+LIBS="-lbrotlidec $cf_save_LIBS"
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 42422 "configure"
+#include "confdefs.h"
+
+#include <brotli/decode.h>
+
+int
+main (void)
+{
+
+ BrotliDecoderDecompressStream(
+ NULL, /* BrotliDecoderState* state */
+ NULL, /* size_t* available_in */
+ NULL, /* const uint8_t** next_in */
+ NULL, /* size_t* available_out */
+ NULL, /* uint8_t** next_out */
+ NULL /* size_t* total_out */
+ );
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:42445: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:42448: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:42451: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:42454: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ cf_cv_find_linkage_brotlidec=yes
+ cf_cv_header_path_brotlidec=/usr/include
+ cf_cv_library_path_brotlidec=/usr/lib
+ cf_cv_library_file_brotlidec="-lbrotlidec"
+
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+ cf_cv_find_linkage_brotlidec=no
+ LIBS="$cf_save_LIBS"
+
+ test -n "$verbose" && echo " find linkage for brotlidec library" 1>&6
+
+echo "${as_me:-configure}:42471: testing find linkage for brotlidec library ..." 1>&5
+
+echo "${as_me:-configure}:42473: testing Searching for headers in FIND_LINKAGE(brotlidec,brotlilib) ..." 1>&5
+
+ cf_save_CPPFLAGS="$CPPFLAGS"
+ cf_test_CPPFLAGS="$CPPFLAGS"
+
+cf_search=
+
+# collect the current set of include-directories from compiler flags
+cf_header_path_list=""
+if test -n "${CFLAGS}${CPPFLAGS}" ; then
+ for cf_header_path in $CPPFLAGS $CFLAGS
+ do
+ case "$cf_header_path" in
+ (-I*)
+ cf_header_path=`echo ".$cf_header_path" |sed -e 's/^...//' -e 's,/include$,,'`
+
+test "x$cf_header_path" != "xNONE" && \
+test -d "$cf_header_path" && \
+ {
+ test -n "$verbose" && echo " ... testing for include-directories under $cf_header_path"
+ test -d "$cf_header_path/include" && cf_search="$cf_search $cf_header_path/include"
+ test -d "$cf_header_path/include/brotlilib" && cf_search="$cf_search $cf_header_path/include/brotlilib"
+ test -d "$cf_header_path/include/brotlilib/include" && cf_search="$cf_search $cf_header_path/include/brotlilib/include"
+ test -d "$cf_header_path/brotlilib/include" && cf_search="$cf_search $cf_header_path/brotlilib/include"
+ test -d "$cf_header_path/brotlilib/include/brotlilib" && cf_search="$cf_search $cf_header_path/brotlilib/include/brotlilib"
+}
+
+ cf_header_path_list="$cf_header_path_list $cf_search"
+ ;;
+ esac
+ done
+fi
+
+# add the variations for the package we are looking for
+
+cf_search=
+
+test "x$prefix" != "xNONE" && \
+test -d "$prefix" && \
+ {
+ test -n "$verbose" && echo " ... testing for include-directories under $prefix"
+ test -d "$prefix/include" && cf_search="$cf_search $prefix/include"
+ test -d "$prefix/include/brotlilib" && cf_search="$cf_search $prefix/include/brotlilib"
+ test -d "$prefix/include/brotlilib/include" && cf_search="$cf_search $prefix/include/brotlilib/include"
+ test -d "$prefix/brotlilib/include" && cf_search="$cf_search $prefix/brotlilib/include"
+ test -d "$prefix/brotlilib/include/brotlilib" && cf_search="$cf_search $prefix/brotlilib/include/brotlilib"
+}
+
+for cf_subdir_prefix in \
+ /usr \
+ /usr/local \
+ /usr/pkg \
+ /opt \
+ /opt/local \
+ $HOME
+do
+
+test "x$cf_subdir_prefix" != "x$prefix" && \
+test -d "$cf_subdir_prefix" && \
+{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
+ test -n "$verbose" && echo " ... testing for include-directories under $cf_subdir_prefix"
+ test -d "$cf_subdir_prefix/include" && cf_search="$cf_search $cf_subdir_prefix/include"
+ test -d "$cf_subdir_prefix/include/brotlilib" && cf_search="$cf_search $cf_subdir_prefix/include/brotlilib"
+ test -d "$cf_subdir_prefix/include/brotlilib/include" && cf_search="$cf_search $cf_subdir_prefix/include/brotlilib/include"
+ test -d "$cf_subdir_prefix/brotlilib/include" && cf_search="$cf_search $cf_subdir_prefix/brotlilib/include"
+ test -d "$cf_subdir_prefix/brotlilib/include/brotlilib" && cf_search="$cf_search $cf_subdir_prefix/brotlilib/include/brotlilib"
+}
+
+done
+
+test "$includedir" != NONE && \
+test "$includedir" != "/usr/include" && \
+test -d "$includedir" && {
+ test -d "$includedir" && cf_search="$cf_search $includedir"
+ test -d "$includedir/brotlilib" && cf_search="$cf_search $includedir/brotlilib"
+}
+
+test "$oldincludedir" != NONE && \
+test "$oldincludedir" != "/usr/include" && \
+test -d "$oldincludedir" && {
+ test -d "$oldincludedir" && cf_search="$cf_search $oldincludedir"
+ test -d "$oldincludedir/brotlilib" && cf_search="$cf_search $oldincludedir/brotlilib"
+}
+
+cf_search="$cf_search $cf_header_path_list"
+
+ for cf_cv_header_path_brotlidec in $cf_search
+ do
+ if test -d "$cf_cv_header_path_brotlidec" ; then
+ test -n "$verbose" && echo " ... testing $cf_cv_header_path_brotlidec" 1>&6
+
+echo "${as_me:-configure}:42564: testing ... testing $cf_cv_header_path_brotlidec ..." 1>&5
+
+ CPPFLAGS="$cf_save_CPPFLAGS"
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_cv_header_path_brotlidec"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 42572 "configure"
+#include "confdefs.h"
+
+#include <brotli/decode.h>
+
+int
+main (void)
+{
+
+ BrotliDecoderDecompressStream(
+ NULL, /* BrotliDecoderState* state */
+ NULL, /* size_t* available_in */
+ NULL, /* const uint8_t** next_in */
+ NULL, /* size_t* available_out */
+ NULL, /* uint8_t** next_out */
+ NULL /* size_t* total_out */
+ );
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:42595: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:42598: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:42601: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:42604: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ test -n "$verbose" && echo " ... found brotlidec headers in $cf_cv_header_path_brotlidec" 1>&6
+
+echo "${as_me:-configure}:42609: testing ... found brotlidec headers in $cf_cv_header_path_brotlidec ..." 1>&5
+
+ cf_cv_find_linkage_brotlidec=maybe
+ cf_test_CPPFLAGS="$CPPFLAGS"
+ break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+ CPPFLAGS="$cf_save_CPPFLAGS"
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ fi
+ done
+
+ if test "$cf_cv_find_linkage_brotlidec" = maybe ; then
+
+echo "${as_me:-configure}:42627: testing Searching for brotlidec library in FIND_LINKAGE(brotlidec,brotlilib) ..." 1>&5
+
+ cf_save_LIBS="$LIBS"
+ cf_save_LDFLAGS="$LDFLAGS"
+
+ CPPFLAGS="$cf_test_CPPFLAGS"
+ LIBS="-lbrotlidec $cf_save_LIBS"
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 42635 "configure"
+#include "confdefs.h"
+
+#include <brotli/decode.h>
+
+int
+main (void)
+{
+
+ BrotliDecoderDecompressStream(
+ NULL, /* BrotliDecoderState* state */
+ NULL, /* size_t* available_in */
+ NULL, /* const uint8_t** next_in */
+ NULL, /* size_t* available_out */
+ NULL, /* uint8_t** next_out */
+ NULL /* size_t* total_out */
+ );
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:42658: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:42661: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:42664: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:42667: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ test -n "$verbose" && echo " ... found brotlidec library in system" 1>&6
+
+echo "${as_me:-configure}:42672: testing ... found brotlidec library in system ..." 1>&5
+
+ cf_cv_find_linkage_brotlidec=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+ CPPFLAGS="$cf_save_CPPFLAGS"
+ LIBS="$cf_save_LIBS"
+
+ if test "$cf_cv_find_linkage_brotlidec" != yes ; then
+
+cf_search=
+cf_library_path_list=""
+if test -n "${LDFLAGS}${LIBS}" ; then
+ for cf_library_path in $LDFLAGS $LIBS
+ do
+ case "$cf_library_path" in
+ (-L*)
+ cf_library_path=`echo ".$cf_library_path" |sed -e 's/^...//' -e 's,/lib$,,'`
+
+test "x$cf_library_path" != "xNONE" && \
+test -d "$cf_library_path" && \
+ {
+ test -n "$verbose" && echo " ... testing for lib-directories under $cf_library_path"
+ test -d "$cf_library_path/lib" && cf_search="$cf_search $cf_library_path/lib"
+ test -d "$cf_library_path/lib/brotlidec" && cf_search="$cf_search $cf_library_path/lib/brotlidec"
+ test -d "$cf_library_path/lib/brotlidec/lib" && cf_search="$cf_search $cf_library_path/lib/brotlidec/lib"
+ test -d "$cf_library_path/brotlidec/lib" && cf_search="$cf_search $cf_library_path/brotlidec/lib"
+ test -d "$cf_library_path/brotlidec/lib/brotlidec" && cf_search="$cf_search $cf_library_path/brotlidec/lib/brotlidec"
+}
+
+ cf_library_path_list="$cf_library_path_list $cf_search"
+ ;;
+ esac
+ done
+fi
+
+cf_search=
+
+test "x$prefix" != "xNONE" && \
+test -d "$prefix" && \
+ {
+ test -n "$verbose" && echo " ... testing for lib-directories under $prefix"
+ test -d "$prefix/lib" && cf_search="$cf_search $prefix/lib"
+ test -d "$prefix/lib/brotlidec" && cf_search="$cf_search $prefix/lib/brotlidec"
+ test -d "$prefix/lib/brotlidec/lib" && cf_search="$cf_search $prefix/lib/brotlidec/lib"
+ test -d "$prefix/brotlidec/lib" && cf_search="$cf_search $prefix/brotlidec/lib"
+ test -d "$prefix/brotlidec/lib/brotlidec" && cf_search="$cf_search $prefix/brotlidec/lib/brotlidec"
+}
+
+for cf_subdir_prefix in \
+ /usr \
+ /usr/local \
+ /usr/pkg \
+ /opt \
+ /opt/local \
+ $HOME
+do
+
+test "x$cf_subdir_prefix" != "x$prefix" && \
+test -d "$cf_subdir_prefix" && \
+{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
+ test -n "$verbose" && echo " ... testing for lib-directories under $cf_subdir_prefix"
+ test -d "$cf_subdir_prefix/lib" && cf_search="$cf_search $cf_subdir_prefix/lib"
+ test -d "$cf_subdir_prefix/lib/brotlidec" && cf_search="$cf_search $cf_subdir_prefix/lib/brotlidec"
+ test -d "$cf_subdir_prefix/lib/brotlidec/lib" && cf_search="$cf_search $cf_subdir_prefix/lib/brotlidec/lib"
+ test -d "$cf_subdir_prefix/brotlidec/lib" && cf_search="$cf_search $cf_subdir_prefix/brotlidec/lib"
+ test -d "$cf_subdir_prefix/brotlidec/lib/brotlidec" && cf_search="$cf_search $cf_subdir_prefix/brotlidec/lib/brotlidec"
+}
+
+done
+
+cf_search="$cf_library_path_list $cf_search"
+
+ for cf_cv_library_path_brotlidec in $cf_search
+ do
+ if test -d "$cf_cv_library_path_brotlidec" ; then
+ test -n "$verbose" && echo " ... testing $cf_cv_library_path_brotlidec" 1>&6
+
+echo "${as_me:-configure}:42753: testing ... testing $cf_cv_library_path_brotlidec ..." 1>&5
+
+ CPPFLAGS="$cf_test_CPPFLAGS"
+ LIBS="-lbrotlidec $cf_save_LIBS"
+ LDFLAGS="$cf_save_LDFLAGS -L$cf_cv_library_path_brotlidec"
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 42759 "configure"
+#include "confdefs.h"
+
+#include <brotli/decode.h>
+
+int
+main (void)
+{
+
+ BrotliDecoderDecompressStream(
+ NULL, /* BrotliDecoderState* state */
+ NULL, /* size_t* available_in */
+ NULL, /* const uint8_t** next_in */
+ NULL, /* size_t* available_out */
+ NULL, /* uint8_t** next_out */
+ NULL /* size_t* total_out */
+ );
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:42782: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:42785: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:42788: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:42791: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+
+ test -n "$verbose" && echo " ... found brotlidec library in $cf_cv_library_path_brotlidec" 1>&6
+
+echo "${as_me:-configure}:42796: testing ... found brotlidec library in $cf_cv_library_path_brotlidec ..." 1>&5
+
+ cf_cv_find_linkage_brotlidec=yes
+ cf_cv_library_file_brotlidec="-lbrotlidec"
+ break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+ CPPFLAGS="$cf_save_CPPFLAGS"
+ LIBS="$cf_save_LIBS"
+ LDFLAGS="$cf_save_LDFLAGS"
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+ fi
+ done
+ CPPFLAGS="$cf_save_CPPFLAGS"
+ LDFLAGS="$cf_save_LDFLAGS"
+ fi
+
+ else
+ cf_cv_find_linkage_brotlidec=no
+ fi
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+LIBS="$cf_save_LIBS"
+
+if test "$cf_cv_find_linkage_brotlidec" = yes ; then
+
+if test -n "$cf_cv_header_path_brotlidec" ; then
+ for cf_add_incdir in $cf_cv_header_path_brotlidec
+ do
+ while test "$cf_add_incdir" != /usr/include
+ do
+ if test -d "$cf_add_incdir"
+ then
+ cf_have_incdir=no
+ if test -n "$CFLAGS$CPPFLAGS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+ if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+ cf_have_incdir=yes; break
+ fi
+ done
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ if test "$cf_add_incdir" = /usr/local/include ; then
+ if test "$GCC" = yes
+ then
+ cf_save_CPPFLAGS=$CPPFLAGS
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 42858 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:42870: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:42873: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:42876: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:42879: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ CPPFLAGS=$cf_save_CPPFLAGS
+ fi
+ fi
+ fi
+
+ if test "$cf_have_incdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:42896: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+ CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+ cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+ test "$cf_top_incdir" = "$cf_add_incdir" && break
+ cf_add_incdir="$cf_top_incdir"
+ else
+ break
+ fi
+ else
+ break
+ fi
+ done
+ done
+fi
+
+if test -n "$cf_cv_library_path_brotlidec" ; then
+ for cf_add_libdir in $cf_cv_library_path_brotlidec
+ do
+ if test "$cf_add_libdir" = /usr/lib ; then
+ :
+ elif test -d "$cf_add_libdir"
+ then
+ cf_have_libdir=no
+ if test -n "$LDFLAGS$LIBS" ; then
+ # a loop is needed to ensure we can add subdirs of existing dirs
+ for cf_test_libdir in $LDFLAGS $LIBS ; do
+ if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
+ cf_have_libdir=yes; break
+ fi
+ done
+ fi
+ if test "$cf_have_libdir" = no ; then
+ test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
+
+echo "${as_me:-configure}:42932: testing adding $cf_add_libdir to library-path ..." 1>&5
+
+ LDFLAGS="-L$cf_add_libdir $LDFLAGS"
+ fi
+ fi
+ done
+fi
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lbrotlidec; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+else
+{ echo "$as_me:42957: WARNING: Cannot find brotlidec library" >&5
+echo "$as_me: WARNING: Cannot find brotlidec library" >&2;}
+fi
+
+ test "x$cf_cv_find_linkage_brotlidec" = "xyes" &&
+cat >>confdefs.h <<\EOF
+#define USE_BROTLI 1
+EOF
+
+fi
+
+echo "$as_me:42968: checking if you want to exclude FINGER code" >&5
+echo $ECHO_N "checking if you want to exclude FINGER code... $ECHO_C" >&6
+
+# Check whether --enable-finger or --disable-finger was given.
+if test "${enable_finger+set}" = set; then
+ enableval="$enable_finger"
+ test "$enableval" != no && enableval=yes
+ if test "$enableval" != "yes" ; then
+ use_finger=yes
+ else
+ use_finger=no
+ fi
+else
+ enableval=yes
+ use_finger=no
+
+fi;
+echo "$as_me:42985: result: $use_finger" >&5
+echo "${ECHO_T}$use_finger" >&6
+test "$use_finger" != "no" &&
+cat >>confdefs.h <<\EOF
+#define DISABLE_FINGER 1
+EOF
+
+echo "$as_me:42992: checking if you want to exclude GOPHER code" >&5
+echo $ECHO_N "checking if you want to exclude GOPHER code... $ECHO_C" >&6
+
+# Check whether --enable-gopher or --disable-gopher was given.
+if test "${enable_gopher+set}" = set; then
+ enableval="$enable_gopher"
+ test "$enableval" != no && enableval=yes
+ if test "$enableval" != "yes" ; then
+ use_gopher=yes
+ else
+ use_gopher=no
+ fi
+else
+ enableval=yes
+ use_gopher=no
+
+fi;
+echo "$as_me:43009: result: $use_gopher" >&5
+echo "${ECHO_T}$use_gopher" >&6
+test "$use_gopher" != "no" &&
+cat >>confdefs.h <<\EOF
+#define DISABLE_GOPHER 1
+EOF
+
+echo "$as_me:43016: checking if you want to exclude NEWS code" >&5
+echo $ECHO_N "checking if you want to exclude NEWS code... $ECHO_C" >&6
+
+# Check whether --enable-news or --disable-news was given.
+if test "${enable_news+set}" = set; then
+ enableval="$enable_news"
+ test "$enableval" != no && enableval=yes
+ if test "$enableval" != "yes" ; then
+ use_news=yes
+ else
+ use_news=no
+ fi
+else
+ enableval=yes
+ use_news=no
+
+fi;
+echo "$as_me:43033: result: $use_news" >&5
+echo "${ECHO_T}$use_news" >&6
+test "$use_news" != "no" &&
+cat >>confdefs.h <<\EOF
+#define DISABLE_NEWS 1
+EOF
+
+echo "$as_me:43040: checking if you want to exclude FTP code" >&5
+echo $ECHO_N "checking if you want to exclude FTP code... $ECHO_C" >&6
+
+# Check whether --enable-ftp or --disable-ftp was given.
+if test "${enable_ftp+set}" = set; then
+ enableval="$enable_ftp"
+ test "$enableval" != no && enableval=yes
+ if test "$enableval" != "yes" ; then
+ use_ftp=yes
+ else
+ use_ftp=no
+ fi
+else
+ enableval=yes
+ use_ftp=no
+
+fi;
+echo "$as_me:43057: result: $use_ftp" >&5
+echo "${ECHO_T}$use_ftp" >&6
+test "$use_ftp" != "no" &&
+cat >>confdefs.h <<\EOF
+#define DISABLE_FTP 1
+EOF
+
+echo "$as_me:43064: checking if you want to include WAIS code" >&5
+echo $ECHO_N "checking if you want to include WAIS code... $ECHO_C" >&6
+
+# Check whether --enable-wais or --disable-wais was given.
+if test "${enable_wais+set}" = set; then
+ enableval="$enable_wais"
+ test "$enableval" != yes && enableval=no
+ if test "$enableval" != "no" ; then
+ use_wais=yes
+ else
+ use_wais=no
+ fi
+else
+ enableval=no
+ use_wais=no
+
+fi;
+echo "$as_me:43081: result: $use_wais" >&5
+echo "${ECHO_T}$use_wais" >&6
+
+MAKE_WAIS="#"
+if test "$use_wais" != "no"
+then
+ echo "$as_me:43087: checking for fs_free in -lwais" >&5
+echo $ECHO_N "checking for fs_free in -lwais... $ECHO_C" >&6
+if test "${ac_cv_lib_wais_fs_free+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lwais $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 43095 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char fs_free ();
+int
+main (void)
+{
+fs_free ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:43114: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:43117: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:43120: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:43123: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_lib_wais_fs_free=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_wais_fs_free=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:43134: result: $ac_cv_lib_wais_fs_free" >&5
+echo "${ECHO_T}$ac_cv_lib_wais_fs_free" >&6
+if test "$ac_cv_lib_wais_fs_free" = yes; then
+
+echo "$as_me:43138: checking if -lm needed for math functions" >&5
+echo $ECHO_N "checking if -lm needed for math functions... $ECHO_C" >&6
+if test "${cf_cv_need_libm+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 43145 "configure"
+#include "confdefs.h"
+
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <math.h>
+
+int
+main (void)
+{
+double x = rand(); printf("result = %g\\n", sin(x))
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:43161: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:43164: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:43167: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:43170: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_need_libm=no
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_need_libm=yes
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:43180: result: $cf_cv_need_libm" >&5
+echo "${ECHO_T}$cf_cv_need_libm" >&6
+
+if test "$cf_cv_need_libm" = yes
+then
+
+ cf_save_LIBS="$LIBS"
+ LIBS="$LIBS -lm"
+ echo "$as_me:43188: checking if -lm is available for math functions" >&5
+echo $ECHO_N "checking if -lm is available for math functions... $ECHO_C" >&6
+if test "${cf_cv_have_libm+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 43195 "configure"
+#include "confdefs.h"
+
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <math.h>
+
+int
+main (void)
+{
+double x = rand(); printf("result = %g\\n", sin(x))
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:43211: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:43214: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:43217: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:43220: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_have_libm=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_have_libm=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:43230: result: $cf_cv_have_libm" >&5
+echo "${ECHO_T}$cf_cv_have_libm" >&6
+ LIBS="$cf_save_LIBS"
+
+ if test "$cf_cv_have_libm" = yes
+ then
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lm; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+ fi
+else
+ cf_cv_have_libm=yes
+fi
+
+if test "$cf_cv_have_libm" = yes
+then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_MATH_FUNCS 1
+EOF
+
+fi
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lwais; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+for ac_header in wais.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:43286: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 43292 "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:43296: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+ (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ $EGREP -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:43302: \$? = $ac_status" >&5
+ (exit "$ac_status"); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ eval "$as_ac_Header=yes"
+else
+ echo "$as_me: failed program was:" >&5
+ cat "conftest.$ac_ext" >&5
+ eval "$as_ac_Header=no"
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi
+echo "$as_me:43321: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
+if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
+ cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+ MAKE_WAIS=
+
+else
+ { echo "$as_me:43334: WARNING: could not find WAIS library" >&5
+echo "$as_me: WARNING: could not find WAIS library" >&2;}
+fi
+
+fi
+
+# All DirEd functions that were enabled on compilation can be disabled
+# or modified at run time via DIRED_MENU symbols in lynx.cfg.
+echo "$as_me:43342: checking if directory-editor code should be used" >&5
+echo $ECHO_N "checking if directory-editor code should be used... $ECHO_C" >&6
+
+# Check whether --enable-dired or --disable-dired was given.
+if test "${enable_dired+set}" = set; then
+ enableval="$enable_dired"
+ test "$enableval" != no && enableval=yes
+ if test "$enableval" != "yes" ; then
+ use_dired=$enableval
+ else
+ use_dired=yes
+ fi
+else
+ enableval=yes
+ use_dired=yes
+
+fi;
+echo "$as_me:43359: result: $use_dired" >&5
+echo "${ECHO_T}$use_dired" >&6
+
+if test ".$use_dired" != ".no" ; then
+ EXTRA_OBJS="$EXTRA_OBJS LYLocal\$o"
+
+cat >>confdefs.h <<\EOF
+#define DIRED_SUPPORT 1
+EOF
+
+ echo "$as_me:43369: checking if you wish to allow extracting from archives via DirEd" >&5
+echo $ECHO_N "checking if you wish to allow extracting from archives via DirEd... $ECHO_C" >&6
+
+# Check whether --enable-dired-dearchive or --disable-dired-dearchive was given.
+if test "${enable_dired_dearchive+set}" = set; then
+ enableval="$enable_dired_dearchive"
+ test "$enableval" != no && enableval=yes
+ if test "$enableval" != "yes" ; then
+
+cat >>confdefs.h <<\EOF
+#define ARCHIVE_ONLY 1
+EOF
+
+ fi
+else
+ enableval=yes
+fi;
+ echo "$as_me:43386: result: $enableval" >&5
+echo "${ECHO_T}$enableval" >&6
+
+ echo "$as_me:43389: checking if DirEd mode should override keys" >&5
+echo $ECHO_N "checking if DirEd mode should override keys... $ECHO_C" >&6
+
+# Check whether --enable-dired-override or --disable-dired-override was given.
+if test "${enable_dired_override+set}" = set; then
+ enableval="$enable_dired_override"
+ test "$enableval" != no && enableval=yes
+ if test "$enableval" != "yes" ; then
+ :
+ else
+
+cat >>confdefs.h <<\EOF
+#define OK_OVERRIDE 1
+EOF
+
+ fi
+else
+ enableval=yes
+
+cat >>confdefs.h <<\EOF
+#define OK_OVERRIDE 1
+EOF
+
+fi;
+ echo "$as_me:43413: result: $enableval" >&5
+echo "${ECHO_T}$enableval" >&6
+
+ echo "$as_me:43416: checking if you wish to allow permissions commands via DirEd" >&5
+echo $ECHO_N "checking if you wish to allow permissions commands via DirEd... $ECHO_C" >&6
+
+# Check whether --enable-dired-permit or --disable-dired-permit was given.
+if test "${enable_dired_permit+set}" = set; then
+ enableval="$enable_dired_permit"
+ test "$enableval" != no && enableval=yes
+ if test "$enableval" != "yes" ; then
+ :
+ else
+
+cat >>confdefs.h <<\EOF
+#define OK_PERMIT 1
+EOF
+
+ fi
+else
+ enableval=yes
+
+cat >>confdefs.h <<\EOF
+#define OK_PERMIT 1
+EOF
+
+fi;
+ echo "$as_me:43440: result: $enableval" >&5
+echo "${ECHO_T}$enableval" >&6
+
+ echo "$as_me:43443: checking if you wish to allow executable-permission commands via DirEd" >&5
+echo $ECHO_N "checking if you wish to allow executable-permission commands via DirEd... $ECHO_C" >&6
+
+# Check whether --enable-dired-xpermit or --disable-dired-xpermit was given.
+if test "${enable_dired_xpermit+set}" = set; then
+ enableval="$enable_dired_xpermit"
+ test "$enableval" != no && enableval=yes
+ if test "$enableval" != "yes" ; then
+
+cat >>confdefs.h <<\EOF
+#define NO_CHANGE_EXECUTE_PERMS 1
+EOF
+
+ fi
+else
+ enableval=yes
+fi;
+ echo "$as_me:43460: result: $enableval" >&5
+echo "${ECHO_T}$enableval" >&6
+
+ echo "$as_me:43463: checking if you wish to allow \"tar\" commands from DirEd" >&5
+echo $ECHO_N "checking if you wish to allow \"tar\" commands from DirEd... $ECHO_C" >&6
+
+# Check whether --enable-dired-tar or --disable-dired-tar was given.
+if test "${enable_dired_tar+set}" = set; then
+ enableval="$enable_dired_tar"
+ test "$enableval" != no && enableval=yes
+ if test "$enableval" != "yes" ; then
+ :
+ else
+
+cat >>confdefs.h <<\EOF
+#define OK_TAR 1
+EOF
+
+ fi
+else
+ enableval=yes
+
+cat >>confdefs.h <<\EOF
+#define OK_TAR 1
+EOF
+
+fi;
+ echo "$as_me:43487: result: $enableval" >&5
+echo "${ECHO_T}$enableval" >&6
+
+ echo "$as_me:43490: checking if you wish to allow \"uudecode\" commands from DirEd" >&5
+echo $ECHO_N "checking if you wish to allow \"uudecode\" commands from DirEd... $ECHO_C" >&6
+
+# Check whether --enable-dired-uudecode or --disable-dired-uudecode was given.
+if test "${enable_dired_uudecode+set}" = set; then
+ enableval="$enable_dired_uudecode"
+ test "$enableval" != no && enableval=yes
+ if test "$enableval" != "yes" ; then
+ :
+ else
+
+cat >>confdefs.h <<\EOF
+#define OK_UUDECODE 1
+EOF
+
+ fi
+else
+ enableval=yes
+
+cat >>confdefs.h <<\EOF
+#define OK_UUDECODE 1
+EOF
+
+fi;
+ echo "$as_me:43514: result: $enableval" >&5
+echo "${ECHO_T}$enableval" >&6
+
+ echo "$as_me:43517: checking if you wish to allow \"zip\" and \"unzip\" commands from DirEd" >&5
+echo $ECHO_N "checking if you wish to allow \"zip\" and \"unzip\" commands from DirEd... $ECHO_C" >&6
+
+# Check whether --enable-dired-zip or --disable-dired-zip was given.
+if test "${enable_dired_zip+set}" = set; then
+ enableval="$enable_dired_zip"
+ test "$enableval" != no && enableval=yes
+ if test "$enableval" != "yes" ; then
+ :
+ else
+
+cat >>confdefs.h <<\EOF
+#define OK_ZIP 1
+EOF
+
+ fi
+else
+ enableval=yes
+
+cat >>confdefs.h <<\EOF
+#define OK_ZIP 1
+EOF
+
+fi;
+ echo "$as_me:43541: result: $enableval" >&5
+echo "${ECHO_T}$enableval" >&6
+
+ echo "$as_me:43544: checking if you wish to allow \"gzip\" and \"gunzip\" commands from DirEd" >&5
+echo $ECHO_N "checking if you wish to allow \"gzip\" and \"gunzip\" commands from DirEd... $ECHO_C" >&6
+
+# Check whether --enable-dired-gzip or --disable-dired-gzip was given.
+if test "${enable_dired_gzip+set}" = set; then
+ enableval="$enable_dired_gzip"
+ test "$enableval" != no && enableval=yes
+ if test "$enableval" != "yes" ; then
+ :
+ else
+
+cat >>confdefs.h <<\EOF
+#define OK_GZIP 1
+EOF
+
+ fi
+else
+ enableval=yes
+
+cat >>confdefs.h <<\EOF
+#define OK_GZIP 1
+EOF
+
+fi;
+ echo "$as_me:43568: result: $enableval" >&5
+echo "${ECHO_T}$enableval" >&6
+fi
+
+echo "$as_me:43572: checking if you want long-directory listings" >&5
+echo $ECHO_N "checking if you want long-directory listings... $ECHO_C" >&6
+
+# Check whether --enable-long-list or --disable-long-list was given.
+if test "${enable_long_list+set}" = set; then
+ enableval="$enable_long_list"
+ test "$enableval" != no && enableval=yes
+ if test "$enableval" != "yes" ; then
+ :
+ else
+
+cat >>confdefs.h <<\EOF
+#define LONG_LIST 1
+EOF
+
+ fi
+else
+ enableval=yes
+
+cat >>confdefs.h <<\EOF
+#define LONG_LIST 1
+EOF
+
+fi;
+echo "$as_me:43596: result: $enableval" >&5
+echo "${ECHO_T}$enableval" >&6
+
+echo "$as_me:43599: checking if parent-directory references are permitted" >&5
+echo $ECHO_N "checking if parent-directory references are permitted... $ECHO_C" >&6
+
+# Check whether --enable-parent-dir-refs or --disable-parent-dir-refs was given.
+if test "${enable_parent_dir_refs+set}" = set; then
+ enableval="$enable_parent_dir_refs"
+ test "$enableval" != no && enableval=yes
+ if test "$enableval" != "yes" ; then
+
+cat >>confdefs.h <<\EOF
+#define NO_PARENT_DIR_REFERENCE 1
+EOF
+
+ fi
+else
+ enableval=yes
+fi;
+echo "$as_me:43616: result: $enableval" >&5
+echo "${ECHO_T}$enableval" >&6
+
+test -z "$TELNET" && TELNET="telnet"
+for ac_prog in $TELNET telnet
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:43624: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_TELNET+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $TELNET in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_TELNET="$TELNET" # Let the user override the test with a path.
+ ;;
+ *)
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ if $as_executable_p "$ac_dir/$ac_word"; then
+ ac_cv_path_TELNET="$ac_dir/$ac_word"
+ echo "$as_me:43641: found $ac_dir/$ac_word" >&5
+ break
+fi
+done
+
+ ;;
+esac
+fi
+TELNET=$ac_cv_path_TELNET
+
+if test -n "$TELNET"; then
+ echo "$as_me:43652: result: $TELNET" >&5
+echo "${ECHO_T}$TELNET" >&6
+else
+ echo "$as_me:43655: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$TELNET" && break
+done
+test -n "$TELNET" || TELNET="$TELNET"
+
+cf_path_prog=""
+cf_path_args=""
+IFS="${IFS:- }"; cf_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR"
+for cf_temp in $ac_cv_path_TELNET
+do
+ if test -z "$cf_path_prog" ; then
+ if test "$with_full_paths" = yes ; then
+
+if test "x$prefix" != xNONE; then
+ cf_path_syntax="$prefix"
+else
+ cf_path_syntax="$ac_default_prefix"
+fi
+
+case ".$cf_temp" in
+(.\$\(*\)*|.\'*\'*)
+ ;;
+(..|./*|.\\*)
+ ;;
+(.[a-zA-Z]:[\\/]*) # OS/2 EMX
+ ;;
+(.\$\{*prefix\}*|.\$\{*dir\}*)
+ eval cf_temp="$cf_temp"
+ case ".$cf_temp" in
+ (.NONE/*)
+ cf_temp=`echo "$cf_temp" | sed -e s%NONE%$cf_path_syntax%`
+ ;;
+ esac
+ ;;
+(.no|.NONE/*)
+ cf_temp=`echo "$cf_temp" | sed -e s%NONE%$cf_path_syntax%`
+ ;;
+(*)
+ break
+ ;;
+esac
+
+ cf_path_prog="$cf_temp"
+ else
+ cf_path_prog="`basename "$cf_temp"`"
+ fi
+ elif test -z "$cf_path_args" ; then
+ cf_path_args="$cf_temp"
+ else
+ cf_path_args="$cf_path_args $cf_temp"
+ fi
+done
+IFS="$cf_save_ifs"
+
+if test -n "$cf_path_prog" ; then
+
+echo "${as_me:-configure}:43714: testing defining path for ${cf_path_prog} ..." 1>&5
+
+cat >>confdefs.h <<EOF
+#define TELNET_PATH "$cf_path_prog"
+EOF
+
+ test -n "$cf_path_args" &&
+cat >>confdefs.h <<EOF
+#define TELNET_ARGS "$cf_path_args"
+EOF
+
+fi
+
+test -z "$TN3270" && TN3270="tn3270"
+for ac_prog in $TN3270 tn3270
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:43732: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_TN3270+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $TN3270 in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_TN3270="$TN3270" # Let the user override the test with a path.
+ ;;
+ *)
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ if $as_executable_p "$ac_dir/$ac_word"; then
+ ac_cv_path_TN3270="$ac_dir/$ac_word"
+ echo "$as_me:43749: found $ac_dir/$ac_word" >&5
+ break
+fi
+done
+
+ ;;
+esac
+fi
+TN3270=$ac_cv_path_TN3270
+
+if test -n "$TN3270"; then
+ echo "$as_me:43760: result: $TN3270" >&5
+echo "${ECHO_T}$TN3270" >&6
+else
+ echo "$as_me:43763: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$TN3270" && break
+done
+test -n "$TN3270" || TN3270="$TN3270"
+
+cf_path_prog=""
+cf_path_args=""
+IFS="${IFS:- }"; cf_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR"
+for cf_temp in $ac_cv_path_TN3270
+do
+ if test -z "$cf_path_prog" ; then
+ if test "$with_full_paths" = yes ; then
+
+if test "x$prefix" != xNONE; then
+ cf_path_syntax="$prefix"
+else
+ cf_path_syntax="$ac_default_prefix"
+fi
+
+case ".$cf_temp" in
+(.\$\(*\)*|.\'*\'*)
+ ;;
+(..|./*|.\\*)
+ ;;
+(.[a-zA-Z]:[\\/]*) # OS/2 EMX
+ ;;
+(.\$\{*prefix\}*|.\$\{*dir\}*)
+ eval cf_temp="$cf_temp"
+ case ".$cf_temp" in
+ (.NONE/*)
+ cf_temp=`echo "$cf_temp" | sed -e s%NONE%$cf_path_syntax%`
+ ;;
+ esac
+ ;;
+(.no|.NONE/*)
+ cf_temp=`echo "$cf_temp" | sed -e s%NONE%$cf_path_syntax%`
+ ;;
+(*)
+ break
+ ;;
+esac
+
+ cf_path_prog="$cf_temp"
+ else
+ cf_path_prog="`basename "$cf_temp"`"
+ fi
+ elif test -z "$cf_path_args" ; then
+ cf_path_args="$cf_temp"
+ else
+ cf_path_args="$cf_path_args $cf_temp"
+ fi
+done
+IFS="$cf_save_ifs"
+
+if test -n "$cf_path_prog" ; then
+
+echo "${as_me:-configure}:43822: testing defining path for ${cf_path_prog} ..." 1>&5
+
+cat >>confdefs.h <<EOF
+#define TN3270_PATH "$cf_path_prog"
+EOF
+
+ test -n "$cf_path_args" &&
+cat >>confdefs.h <<EOF
+#define TN3270_ARGS "$cf_path_args"
+EOF
+
+fi
+
+test -z "$RLOGIN" && RLOGIN="rlogin"
+for ac_prog in $RLOGIN rlogin
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:43840: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_RLOGIN+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $RLOGIN in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_RLOGIN="$RLOGIN" # Let the user override the test with a path.
+ ;;
+ *)
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ if $as_executable_p "$ac_dir/$ac_word"; then
+ ac_cv_path_RLOGIN="$ac_dir/$ac_word"
+ echo "$as_me:43857: found $ac_dir/$ac_word" >&5
+ break
+fi
+done
+
+ ;;
+esac
+fi
+RLOGIN=$ac_cv_path_RLOGIN
+
+if test -n "$RLOGIN"; then
+ echo "$as_me:43868: result: $RLOGIN" >&5
+echo "${ECHO_T}$RLOGIN" >&6
+else
+ echo "$as_me:43871: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$RLOGIN" && break
+done
+test -n "$RLOGIN" || RLOGIN="$RLOGIN"
+
+cf_path_prog=""
+cf_path_args=""
+IFS="${IFS:- }"; cf_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR"
+for cf_temp in $ac_cv_path_RLOGIN
+do
+ if test -z "$cf_path_prog" ; then
+ if test "$with_full_paths" = yes ; then
+
+if test "x$prefix" != xNONE; then
+ cf_path_syntax="$prefix"
+else
+ cf_path_syntax="$ac_default_prefix"
+fi
+
+case ".$cf_temp" in
+(.\$\(*\)*|.\'*\'*)
+ ;;
+(..|./*|.\\*)
+ ;;
+(.[a-zA-Z]:[\\/]*) # OS/2 EMX
+ ;;
+(.\$\{*prefix\}*|.\$\{*dir\}*)
+ eval cf_temp="$cf_temp"
+ case ".$cf_temp" in
+ (.NONE/*)
+ cf_temp=`echo "$cf_temp" | sed -e s%NONE%$cf_path_syntax%`
+ ;;
+ esac
+ ;;
+(.no|.NONE/*)
+ cf_temp=`echo "$cf_temp" | sed -e s%NONE%$cf_path_syntax%`
+ ;;
+(*)
+ break
+ ;;
+esac
+
+ cf_path_prog="$cf_temp"
+ else
+ cf_path_prog="`basename "$cf_temp"`"
+ fi
+ elif test -z "$cf_path_args" ; then
+ cf_path_args="$cf_temp"
+ else
+ cf_path_args="$cf_path_args $cf_temp"
+ fi
+done
+IFS="$cf_save_ifs"
+
+if test -n "$cf_path_prog" ; then
+
+echo "${as_me:-configure}:43930: testing defining path for ${cf_path_prog} ..." 1>&5
+
+cat >>confdefs.h <<EOF
+#define RLOGIN_PATH "$cf_path_prog"
+EOF
+
+ test -n "$cf_path_args" &&
+cat >>confdefs.h <<EOF
+#define RLOGIN_ARGS "$cf_path_args"
+EOF
+
+fi
+
+test -z "$MV" && MV="mv"
+for ac_prog in $MV mv
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:43948: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_MV+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $MV in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_MV="$MV" # Let the user override the test with a path.
+ ;;
+ *)
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ if $as_executable_p "$ac_dir/$ac_word"; then
+ ac_cv_path_MV="$ac_dir/$ac_word"
+ echo "$as_me:43965: found $ac_dir/$ac_word" >&5
+ break
+fi
+done
+
+ ;;
+esac
+fi
+MV=$ac_cv_path_MV
+
+if test -n "$MV"; then
+ echo "$as_me:43976: result: $MV" >&5
+echo "${ECHO_T}$MV" >&6
+else
+ echo "$as_me:43979: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$MV" && break
+done
+test -n "$MV" || MV="$MV"
+
+cf_path_prog=""
+cf_path_args=""
+IFS="${IFS:- }"; cf_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR"
+for cf_temp in $ac_cv_path_MV
+do
+ if test -z "$cf_path_prog" ; then
+ if test "$with_full_paths" = yes ; then
+
+if test "x$prefix" != xNONE; then
+ cf_path_syntax="$prefix"
+else
+ cf_path_syntax="$ac_default_prefix"
+fi
+
+case ".$cf_temp" in
+(.\$\(*\)*|.\'*\'*)
+ ;;
+(..|./*|.\\*)
+ ;;
+(.[a-zA-Z]:[\\/]*) # OS/2 EMX
+ ;;
+(.\$\{*prefix\}*|.\$\{*dir\}*)
+ eval cf_temp="$cf_temp"
+ case ".$cf_temp" in
+ (.NONE/*)
+ cf_temp=`echo "$cf_temp" | sed -e s%NONE%$cf_path_syntax%`
+ ;;
+ esac
+ ;;
+(.no|.NONE/*)
+ cf_temp=`echo "$cf_temp" | sed -e s%NONE%$cf_path_syntax%`
+ ;;
+(*)
+ break
+ ;;
+esac
+
+ cf_path_prog="$cf_temp"
+ else
+ cf_path_prog="`basename "$cf_temp"`"
+ fi
+ elif test -z "$cf_path_args" ; then
+ cf_path_args="$cf_temp"
+ else
+ cf_path_args="$cf_path_args $cf_temp"
+ fi
+done
+IFS="$cf_save_ifs"
+
+if test -n "$cf_path_prog" ; then
+
+echo "${as_me:-configure}:44038: testing defining path for ${cf_path_prog} ..." 1>&5
+
+cat >>confdefs.h <<EOF
+#define MV_PATH "$cf_path_prog"
+EOF
+
+ test -n "$cf_path_args" &&
+cat >>confdefs.h <<EOF
+#define MV_ARGS "$cf_path_args"
+EOF
+
+fi
+
+test -z "$GZIP" && GZIP="gzip"
+for ac_prog in $GZIP gzip
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:44056: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_GZIP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $GZIP in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_GZIP="$GZIP" # Let the user override the test with a path.
+ ;;
+ *)
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ if $as_executable_p "$ac_dir/$ac_word"; then
+ ac_cv_path_GZIP="$ac_dir/$ac_word"
+ echo "$as_me:44073: found $ac_dir/$ac_word" >&5
+ break
+fi
+done
+
+ ;;
+esac
+fi
+GZIP=$ac_cv_path_GZIP
+
+if test -n "$GZIP"; then
+ echo "$as_me:44084: result: $GZIP" >&5
+echo "${ECHO_T}$GZIP" >&6
+else
+ echo "$as_me:44087: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$GZIP" && break
+done
+test -n "$GZIP" || GZIP="$GZIP"
+
+cf_path_prog=""
+cf_path_args=""
+IFS="${IFS:- }"; cf_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR"
+for cf_temp in $ac_cv_path_GZIP
+do
+ if test -z "$cf_path_prog" ; then
+ if test "$with_full_paths" = yes ; then
+
+if test "x$prefix" != xNONE; then
+ cf_path_syntax="$prefix"
+else
+ cf_path_syntax="$ac_default_prefix"
+fi
+
+case ".$cf_temp" in
+(.\$\(*\)*|.\'*\'*)
+ ;;
+(..|./*|.\\*)
+ ;;
+(.[a-zA-Z]:[\\/]*) # OS/2 EMX
+ ;;
+(.\$\{*prefix\}*|.\$\{*dir\}*)
+ eval cf_temp="$cf_temp"
+ case ".$cf_temp" in
+ (.NONE/*)
+ cf_temp=`echo "$cf_temp" | sed -e s%NONE%$cf_path_syntax%`
+ ;;
+ esac
+ ;;
+(.no|.NONE/*)
+ cf_temp=`echo "$cf_temp" | sed -e s%NONE%$cf_path_syntax%`
+ ;;
+(*)
+ break
+ ;;
+esac
+
+ cf_path_prog="$cf_temp"
+ else
+ cf_path_prog="`basename "$cf_temp"`"
+ fi
+ elif test -z "$cf_path_args" ; then
+ cf_path_args="$cf_temp"
+ else
+ cf_path_args="$cf_path_args $cf_temp"
+ fi
+done
+IFS="$cf_save_ifs"
+
+if test -n "$cf_path_prog" ; then
+
+echo "${as_me:-configure}:44146: testing defining path for ${cf_path_prog} ..." 1>&5
+
+cat >>confdefs.h <<EOF
+#define GZIP_PATH "$cf_path_prog"
+EOF
+
+ test -n "$cf_path_args" &&
+cat >>confdefs.h <<EOF
+#define GZIP_ARGS "$cf_path_args"
+EOF
+
+fi
+
+test -z "$UNCOMPRESS" && UNCOMPRESS="gunzip"
+for ac_prog in $UNCOMPRESS gunzip
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:44164: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_UNCOMPRESS+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $UNCOMPRESS in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_UNCOMPRESS="$UNCOMPRESS" # Let the user override the test with a path.
+ ;;
+ *)
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ if $as_executable_p "$ac_dir/$ac_word"; then
+ ac_cv_path_UNCOMPRESS="$ac_dir/$ac_word"
+ echo "$as_me:44181: found $ac_dir/$ac_word" >&5
+ break
+fi
+done
+
+ ;;
+esac
+fi
+UNCOMPRESS=$ac_cv_path_UNCOMPRESS
+
+if test -n "$UNCOMPRESS"; then
+ echo "$as_me:44192: result: $UNCOMPRESS" >&5
+echo "${ECHO_T}$UNCOMPRESS" >&6
+else
+ echo "$as_me:44195: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$UNCOMPRESS" && break
+done
+test -n "$UNCOMPRESS" || UNCOMPRESS="$UNCOMPRESS"
+
+cf_path_prog=""
+cf_path_args=""
+IFS="${IFS:- }"; cf_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR"
+for cf_temp in $ac_cv_path_UNCOMPRESS
+do
+ if test -z "$cf_path_prog" ; then
+ if test "$with_full_paths" = yes ; then
+
+if test "x$prefix" != xNONE; then
+ cf_path_syntax="$prefix"
+else
+ cf_path_syntax="$ac_default_prefix"
+fi
+
+case ".$cf_temp" in
+(.\$\(*\)*|.\'*\'*)
+ ;;
+(..|./*|.\\*)
+ ;;
+(.[a-zA-Z]:[\\/]*) # OS/2 EMX
+ ;;
+(.\$\{*prefix\}*|.\$\{*dir\}*)
+ eval cf_temp="$cf_temp"
+ case ".$cf_temp" in
+ (.NONE/*)
+ cf_temp=`echo "$cf_temp" | sed -e s%NONE%$cf_path_syntax%`
+ ;;
+ esac
+ ;;
+(.no|.NONE/*)
+ cf_temp=`echo "$cf_temp" | sed -e s%NONE%$cf_path_syntax%`
+ ;;
+(*)
+ break
+ ;;
+esac
+
+ cf_path_prog="$cf_temp"
+ else
+ cf_path_prog="`basename "$cf_temp"`"
+ fi
+ elif test -z "$cf_path_args" ; then
+ cf_path_args="$cf_temp"
+ else
+ cf_path_args="$cf_path_args $cf_temp"
+ fi
+done
+IFS="$cf_save_ifs"
+
+if test -n "$cf_path_prog" ; then
+
+echo "${as_me:-configure}:44254: testing defining path for ${cf_path_prog} ..." 1>&5
+
+cat >>confdefs.h <<EOF
+#define UNCOMPRESS_PATH "$cf_path_prog"
+EOF
+
+ test -n "$cf_path_args" &&
+cat >>confdefs.h <<EOF
+#define UNCOMPRESS_ARGS "$cf_path_args"
+EOF
+
+fi
+
+test -z "$UNZIP" && UNZIP="unzip"
+for ac_prog in $UNZIP unzip
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:44272: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_UNZIP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $UNZIP in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_UNZIP="$UNZIP" # Let the user override the test with a path.
+ ;;
+ *)
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ if $as_executable_p "$ac_dir/$ac_word"; then
+ ac_cv_path_UNZIP="$ac_dir/$ac_word"
+ echo "$as_me:44289: found $ac_dir/$ac_word" >&5
+ break
+fi
+done
+
+ ;;
+esac
+fi
+UNZIP=$ac_cv_path_UNZIP
+
+if test -n "$UNZIP"; then
+ echo "$as_me:44300: result: $UNZIP" >&5
+echo "${ECHO_T}$UNZIP" >&6
+else
+ echo "$as_me:44303: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$UNZIP" && break
+done
+test -n "$UNZIP" || UNZIP="$UNZIP"
+
+cf_path_prog=""
+cf_path_args=""
+IFS="${IFS:- }"; cf_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR"
+for cf_temp in $ac_cv_path_UNZIP
+do
+ if test -z "$cf_path_prog" ; then
+ if test "$with_full_paths" = yes ; then
+
+if test "x$prefix" != xNONE; then
+ cf_path_syntax="$prefix"
+else
+ cf_path_syntax="$ac_default_prefix"
+fi
+
+case ".$cf_temp" in
+(.\$\(*\)*|.\'*\'*)
+ ;;
+(..|./*|.\\*)
+ ;;
+(.[a-zA-Z]:[\\/]*) # OS/2 EMX
+ ;;
+(.\$\{*prefix\}*|.\$\{*dir\}*)
+ eval cf_temp="$cf_temp"
+ case ".$cf_temp" in
+ (.NONE/*)
+ cf_temp=`echo "$cf_temp" | sed -e s%NONE%$cf_path_syntax%`
+ ;;
+ esac
+ ;;
+(.no|.NONE/*)
+ cf_temp=`echo "$cf_temp" | sed -e s%NONE%$cf_path_syntax%`
+ ;;
+(*)
+ break
+ ;;
+esac
+
+ cf_path_prog="$cf_temp"
+ else
+ cf_path_prog="`basename "$cf_temp"`"
+ fi
+ elif test -z "$cf_path_args" ; then
+ cf_path_args="$cf_temp"
+ else
+ cf_path_args="$cf_path_args $cf_temp"
+ fi
+done
+IFS="$cf_save_ifs"
+
+if test -n "$cf_path_prog" ; then
+
+echo "${as_me:-configure}:44362: testing defining path for ${cf_path_prog} ..." 1>&5
+
+cat >>confdefs.h <<EOF
+#define UNZIP_PATH "$cf_path_prog"
+EOF
+
+ test -n "$cf_path_args" &&
+cat >>confdefs.h <<EOF
+#define UNZIP_ARGS "$cf_path_args"
+EOF
+
+fi
+
+test -z "$BZIP2" && BZIP2="bzip2"
+for ac_prog in $BZIP2 bzip2
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:44380: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_BZIP2+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $BZIP2 in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_BZIP2="$BZIP2" # Let the user override the test with a path.
+ ;;
+ *)
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ if $as_executable_p "$ac_dir/$ac_word"; then
+ ac_cv_path_BZIP2="$ac_dir/$ac_word"
+ echo "$as_me:44397: found $ac_dir/$ac_word" >&5
+ break
+fi
+done
+
+ ;;
+esac
+fi
+BZIP2=$ac_cv_path_BZIP2
+
+if test -n "$BZIP2"; then
+ echo "$as_me:44408: result: $BZIP2" >&5
+echo "${ECHO_T}$BZIP2" >&6
+else
+ echo "$as_me:44411: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$BZIP2" && break
+done
+test -n "$BZIP2" || BZIP2="$BZIP2"
+
+cf_path_prog=""
+cf_path_args=""
+IFS="${IFS:- }"; cf_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR"
+for cf_temp in $ac_cv_path_BZIP2
+do
+ if test -z "$cf_path_prog" ; then
+ if test "$with_full_paths" = yes ; then
+
+if test "x$prefix" != xNONE; then
+ cf_path_syntax="$prefix"
+else
+ cf_path_syntax="$ac_default_prefix"
+fi
+
+case ".$cf_temp" in
+(.\$\(*\)*|.\'*\'*)
+ ;;
+(..|./*|.\\*)
+ ;;
+(.[a-zA-Z]:[\\/]*) # OS/2 EMX
+ ;;
+(.\$\{*prefix\}*|.\$\{*dir\}*)
+ eval cf_temp="$cf_temp"
+ case ".$cf_temp" in
+ (.NONE/*)
+ cf_temp=`echo "$cf_temp" | sed -e s%NONE%$cf_path_syntax%`
+ ;;
+ esac
+ ;;
+(.no|.NONE/*)
+ cf_temp=`echo "$cf_temp" | sed -e s%NONE%$cf_path_syntax%`
+ ;;
+(*)
+ break
+ ;;
+esac
+
+ cf_path_prog="$cf_temp"
+ else
+ cf_path_prog="`basename "$cf_temp"`"
+ fi
+ elif test -z "$cf_path_args" ; then
+ cf_path_args="$cf_temp"
+ else
+ cf_path_args="$cf_path_args $cf_temp"
+ fi
+done
+IFS="$cf_save_ifs"
+
+if test -n "$cf_path_prog" ; then
+
+echo "${as_me:-configure}:44470: testing defining path for ${cf_path_prog} ..." 1>&5
+
+cat >>confdefs.h <<EOF
+#define BZIP2_PATH "$cf_path_prog"
+EOF
+
+ test -n "$cf_path_args" &&
+cat >>confdefs.h <<EOF
+#define BZIP2_ARGS "$cf_path_args"
+EOF
+
+fi
+
+test -z "$BROTLI" && BROTLI="brotli"
+for ac_prog in $BROTLI brotli
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:44488: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_BROTLI+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $BROTLI in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_BROTLI="$BROTLI" # Let the user override the test with a path.
+ ;;
+ *)
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ if $as_executable_p "$ac_dir/$ac_word"; then
+ ac_cv_path_BROTLI="$ac_dir/$ac_word"
+ echo "$as_me:44505: found $ac_dir/$ac_word" >&5
+ break
+fi
+done
+
+ ;;
+esac
+fi
+BROTLI=$ac_cv_path_BROTLI
+
+if test -n "$BROTLI"; then
+ echo "$as_me:44516: result: $BROTLI" >&5
+echo "${ECHO_T}$BROTLI" >&6
+else
+ echo "$as_me:44519: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$BROTLI" && break
+done
+test -n "$BROTLI" || BROTLI="$BROTLI"
+
+cf_path_prog=""
+cf_path_args=""
+IFS="${IFS:- }"; cf_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR"
+for cf_temp in $ac_cv_path_BROTLI
+do
+ if test -z "$cf_path_prog" ; then
+ if test "$with_full_paths" = yes ; then
+
+if test "x$prefix" != xNONE; then
+ cf_path_syntax="$prefix"
+else
+ cf_path_syntax="$ac_default_prefix"
+fi
+
+case ".$cf_temp" in
+(.\$\(*\)*|.\'*\'*)
+ ;;
+(..|./*|.\\*)
+ ;;
+(.[a-zA-Z]:[\\/]*) # OS/2 EMX
+ ;;
+(.\$\{*prefix\}*|.\$\{*dir\}*)
+ eval cf_temp="$cf_temp"
+ case ".$cf_temp" in
+ (.NONE/*)
+ cf_temp=`echo "$cf_temp" | sed -e s%NONE%$cf_path_syntax%`
+ ;;
+ esac
+ ;;
+(.no|.NONE/*)
+ cf_temp=`echo "$cf_temp" | sed -e s%NONE%$cf_path_syntax%`
+ ;;
+(*)
+ break
+ ;;
+esac
+
+ cf_path_prog="$cf_temp"
+ else
+ cf_path_prog="`basename "$cf_temp"`"
+ fi
+ elif test -z "$cf_path_args" ; then
+ cf_path_args="$cf_temp"
+ else
+ cf_path_args="$cf_path_args $cf_temp"
+ fi
+done
+IFS="$cf_save_ifs"
+
+if test -n "$cf_path_prog" ; then
+
+echo "${as_me:-configure}:44578: testing defining path for ${cf_path_prog} ..." 1>&5
+
+cat >>confdefs.h <<EOF
+#define BROTLI_PATH "$cf_path_prog"
+EOF
+
+ test -n "$cf_path_args" &&
+cat >>confdefs.h <<EOF
+#define BROTLI_ARGS "$cf_path_args"
+EOF
+
+fi
+
+test -z "$TAR" && TAR="tar"
+for ac_prog in $TAR tar pax gtar gnutar bsdtar star
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:44596: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_TAR+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $TAR in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_TAR="$TAR" # Let the user override the test with a path.
+ ;;
+ *)
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ if $as_executable_p "$ac_dir/$ac_word"; then
+ ac_cv_path_TAR="$ac_dir/$ac_word"
+ echo "$as_me:44613: found $ac_dir/$ac_word" >&5
+ break
+fi
+done
+
+ ;;
+esac
+fi
+TAR=$ac_cv_path_TAR
+
+if test -n "$TAR"; then
+ echo "$as_me:44624: result: $TAR" >&5
+echo "${ECHO_T}$TAR" >&6
+else
+ echo "$as_me:44627: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$TAR" && break
+done
+test -n "$TAR" || TAR="$TAR"
+
+cf_path_prog=""
+cf_path_args=""
+IFS="${IFS:- }"; cf_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR"
+for cf_temp in $ac_cv_path_TAR
+do
+ if test -z "$cf_path_prog" ; then
+ if test "$with_full_paths" = yes ; then
+
+if test "x$prefix" != xNONE; then
+ cf_path_syntax="$prefix"
+else
+ cf_path_syntax="$ac_default_prefix"
+fi
+
+case ".$cf_temp" in
+(.\$\(*\)*|.\'*\'*)
+ ;;
+(..|./*|.\\*)
+ ;;
+(.[a-zA-Z]:[\\/]*) # OS/2 EMX
+ ;;
+(.\$\{*prefix\}*|.\$\{*dir\}*)
+ eval cf_temp="$cf_temp"
+ case ".$cf_temp" in
+ (.NONE/*)
+ cf_temp=`echo "$cf_temp" | sed -e s%NONE%$cf_path_syntax%`
+ ;;
+ esac
+ ;;
+(.no|.NONE/*)
+ cf_temp=`echo "$cf_temp" | sed -e s%NONE%$cf_path_syntax%`
+ ;;
+(*)
+ break
+ ;;
+esac
+
+ cf_path_prog="$cf_temp"
+ else
+ cf_path_prog="`basename "$cf_temp"`"
+ fi
+ elif test -z "$cf_path_args" ; then
+ cf_path_args="$cf_temp"
+ else
+ cf_path_args="$cf_path_args $cf_temp"
+ fi
+done
+IFS="$cf_save_ifs"
+
+if test -n "$cf_path_prog" ; then
+
+echo "${as_me:-configure}:44686: testing defining path for ${cf_path_prog} ..." 1>&5
+
+cat >>confdefs.h <<EOF
+#define TAR_PATH "$cf_path_prog"
+EOF
+
+ test -n "$cf_path_args" &&
+cat >>confdefs.h <<EOF
+#define TAR_ARGS "$cf_path_args"
+EOF
+
+fi
+
+case $TAR in
+(*pax|*pax$EXEEXT)
+ TAR_UP_OPTIONS="-w"
+ TAR_DOWN_OPTIONS="-r"
+ TAR_PIPE_OPTIONS=""
+ TAR_FILE_OPTIONS="-f"
+ ;;
+(*star|*star$EXEEXT)
+ TAR_UP_OPTIONS="-c -f"
+ TAR_DOWN_OPTIONS="-x -U -f"
+ TAR_PIPE_OPTIONS="-"
+ TAR_FILE_OPTIONS=""
+ ;;
+(*tar|*tar$EXEEXT)
+ # FIXME: some versions of tar require, some don't allow the "-"
+ TAR_UP_OPTIONS="-cf"
+ TAR_DOWN_OPTIONS="-xf"
+ TAR_PIPE_OPTIONS="-"
+ TAR_FILE_OPTIONS=""
+ ;;
+esac
+
+cat >>confdefs.h <<EOF
+#define TAR_UP_OPTIONS "$TAR_UP_OPTIONS"
+EOF
+
+cat >>confdefs.h <<EOF
+#define TAR_DOWN_OPTIONS "$TAR_DOWN_OPTIONS"
+EOF
+
+cat >>confdefs.h <<EOF
+#define TAR_FILE_OPTIONS "$TAR_FILE_OPTIONS"
+EOF
+
+cat >>confdefs.h <<EOF
+#define TAR_PIPE_OPTIONS "$TAR_PIPE_OPTIONS"
+EOF
+
+if test ".$use_dired" != ".no" ; then
+
+test -z "$COMPRESS" && COMPRESS="compress"
+for ac_prog in $COMPRESS compress
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:44744: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_COMPRESS+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $COMPRESS in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_COMPRESS="$COMPRESS" # Let the user override the test with a path.
+ ;;
+ *)
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ if $as_executable_p "$ac_dir/$ac_word"; then
+ ac_cv_path_COMPRESS="$ac_dir/$ac_word"
+ echo "$as_me:44761: found $ac_dir/$ac_word" >&5
+ break
+fi
+done
+
+ ;;
+esac
+fi
+COMPRESS=$ac_cv_path_COMPRESS
+
+if test -n "$COMPRESS"; then
+ echo "$as_me:44772: result: $COMPRESS" >&5
+echo "${ECHO_T}$COMPRESS" >&6
+else
+ echo "$as_me:44775: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$COMPRESS" && break
+done
+test -n "$COMPRESS" || COMPRESS="$COMPRESS"
+
+cf_path_prog=""
+cf_path_args=""
+IFS="${IFS:- }"; cf_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR"
+for cf_temp in $ac_cv_path_COMPRESS
+do
+ if test -z "$cf_path_prog" ; then
+ if test "$with_full_paths" = yes ; then
+
+if test "x$prefix" != xNONE; then
+ cf_path_syntax="$prefix"
+else
+ cf_path_syntax="$ac_default_prefix"
+fi
+
+case ".$cf_temp" in
+(.\$\(*\)*|.\'*\'*)
+ ;;
+(..|./*|.\\*)
+ ;;
+(.[a-zA-Z]:[\\/]*) # OS/2 EMX
+ ;;
+(.\$\{*prefix\}*|.\$\{*dir\}*)
+ eval cf_temp="$cf_temp"
+ case ".$cf_temp" in
+ (.NONE/*)
+ cf_temp=`echo "$cf_temp" | sed -e s%NONE%$cf_path_syntax%`
+ ;;
+ esac
+ ;;
+(.no|.NONE/*)
+ cf_temp=`echo "$cf_temp" | sed -e s%NONE%$cf_path_syntax%`
+ ;;
+(*)
+ break
+ ;;
+esac
+
+ cf_path_prog="$cf_temp"
+ else
+ cf_path_prog="`basename "$cf_temp"`"
+ fi
+ elif test -z "$cf_path_args" ; then
+ cf_path_args="$cf_temp"
+ else
+ cf_path_args="$cf_path_args $cf_temp"
+ fi
+done
+IFS="$cf_save_ifs"
+
+if test -n "$cf_path_prog" ; then
+
+echo "${as_me:-configure}:44834: testing defining path for ${cf_path_prog} ..." 1>&5
+
+cat >>confdefs.h <<EOF
+#define COMPRESS_PATH "$cf_path_prog"
+EOF
+
+ test -n "$cf_path_args" &&
+cat >>confdefs.h <<EOF
+#define COMPRESS_ARGS "$cf_path_args"
+EOF
+
+fi
+
+test -z "$RM" && RM="rm"
+for ac_prog in $RM rm
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:44852: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_RM+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $RM in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_RM="$RM" # Let the user override the test with a path.
+ ;;
+ *)
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ if $as_executable_p "$ac_dir/$ac_word"; then
+ ac_cv_path_RM="$ac_dir/$ac_word"
+ echo "$as_me:44869: found $ac_dir/$ac_word" >&5
+ break
+fi
+done
+
+ ;;
+esac
+fi
+RM=$ac_cv_path_RM
+
+if test -n "$RM"; then
+ echo "$as_me:44880: result: $RM" >&5
+echo "${ECHO_T}$RM" >&6
+else
+ echo "$as_me:44883: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$RM" && break
+done
+test -n "$RM" || RM="$RM"
+
+cf_path_prog=""
+cf_path_args=""
+IFS="${IFS:- }"; cf_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR"
+for cf_temp in $ac_cv_path_RM
+do
+ if test -z "$cf_path_prog" ; then
+ if test "$with_full_paths" = yes ; then
+
+if test "x$prefix" != xNONE; then
+ cf_path_syntax="$prefix"
+else
+ cf_path_syntax="$ac_default_prefix"
+fi
+
+case ".$cf_temp" in
+(.\$\(*\)*|.\'*\'*)
+ ;;
+(..|./*|.\\*)
+ ;;
+(.[a-zA-Z]:[\\/]*) # OS/2 EMX
+ ;;
+(.\$\{*prefix\}*|.\$\{*dir\}*)
+ eval cf_temp="$cf_temp"
+ case ".$cf_temp" in
+ (.NONE/*)
+ cf_temp=`echo "$cf_temp" | sed -e s%NONE%$cf_path_syntax%`
+ ;;
+ esac
+ ;;
+(.no|.NONE/*)
+ cf_temp=`echo "$cf_temp" | sed -e s%NONE%$cf_path_syntax%`
+ ;;
+(*)
+ break
+ ;;
+esac
+
+ cf_path_prog="$cf_temp"
+ else
+ cf_path_prog="`basename "$cf_temp"`"
+ fi
+ elif test -z "$cf_path_args" ; then
+ cf_path_args="$cf_temp"
+ else
+ cf_path_args="$cf_path_args $cf_temp"
+ fi
+done
+IFS="$cf_save_ifs"
+
+if test -n "$cf_path_prog" ; then
+
+echo "${as_me:-configure}:44942: testing defining path for ${cf_path_prog} ..." 1>&5
+
+cat >>confdefs.h <<EOF
+#define RM_PATH "$cf_path_prog"
+EOF
+
+ test -n "$cf_path_args" &&
+cat >>confdefs.h <<EOF
+#define RM_ARGS "$cf_path_args"
+EOF
+
+fi
+
+test -z "$UUDECODE" && UUDECODE="uudecode"
+for ac_prog in $UUDECODE uudecode
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:44960: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_UUDECODE+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $UUDECODE in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_UUDECODE="$UUDECODE" # Let the user override the test with a path.
+ ;;
+ *)
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ if $as_executable_p "$ac_dir/$ac_word"; then
+ ac_cv_path_UUDECODE="$ac_dir/$ac_word"
+ echo "$as_me:44977: found $ac_dir/$ac_word" >&5
+ break
+fi
+done
+
+ ;;
+esac
+fi
+UUDECODE=$ac_cv_path_UUDECODE
+
+if test -n "$UUDECODE"; then
+ echo "$as_me:44988: result: $UUDECODE" >&5
+echo "${ECHO_T}$UUDECODE" >&6
+else
+ echo "$as_me:44991: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$UUDECODE" && break
+done
+test -n "$UUDECODE" || UUDECODE="$UUDECODE"
+
+cf_path_prog=""
+cf_path_args=""
+IFS="${IFS:- }"; cf_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR"
+for cf_temp in $ac_cv_path_UUDECODE
+do
+ if test -z "$cf_path_prog" ; then
+ if test "$with_full_paths" = yes ; then
+
+if test "x$prefix" != xNONE; then
+ cf_path_syntax="$prefix"
+else
+ cf_path_syntax="$ac_default_prefix"
+fi
+
+case ".$cf_temp" in
+(.\$\(*\)*|.\'*\'*)
+ ;;
+(..|./*|.\\*)
+ ;;
+(.[a-zA-Z]:[\\/]*) # OS/2 EMX
+ ;;
+(.\$\{*prefix\}*|.\$\{*dir\}*)
+ eval cf_temp="$cf_temp"
+ case ".$cf_temp" in
+ (.NONE/*)
+ cf_temp=`echo "$cf_temp" | sed -e s%NONE%$cf_path_syntax%`
+ ;;
+ esac
+ ;;
+(.no|.NONE/*)
+ cf_temp=`echo "$cf_temp" | sed -e s%NONE%$cf_path_syntax%`
+ ;;
+(*)
+ break
+ ;;
+esac
+
+ cf_path_prog="$cf_temp"
+ else
+ cf_path_prog="`basename "$cf_temp"`"
+ fi
+ elif test -z "$cf_path_args" ; then
+ cf_path_args="$cf_temp"
+ else
+ cf_path_args="$cf_path_args $cf_temp"
+ fi
+done
+IFS="$cf_save_ifs"
+
+if test -n "$cf_path_prog" ; then
+
+echo "${as_me:-configure}:45050: testing defining path for ${cf_path_prog} ..." 1>&5
+
+cat >>confdefs.h <<EOF
+#define UUDECODE_PATH "$cf_path_prog"
+EOF
+
+ test -n "$cf_path_args" &&
+cat >>confdefs.h <<EOF
+#define UUDECODE_ARGS "$cf_path_args"
+EOF
+
+fi
+
+test -z "$ZCAT" && ZCAT="zcat"
+for ac_prog in $ZCAT zcat
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:45068: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_ZCAT+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $ZCAT in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_ZCAT="$ZCAT" # Let the user override the test with a path.
+ ;;
+ *)
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ if $as_executable_p "$ac_dir/$ac_word"; then
+ ac_cv_path_ZCAT="$ac_dir/$ac_word"
+ echo "$as_me:45085: found $ac_dir/$ac_word" >&5
+ break
+fi
+done
+
+ ;;
+esac
+fi
+ZCAT=$ac_cv_path_ZCAT
+
+if test -n "$ZCAT"; then
+ echo "$as_me:45096: result: $ZCAT" >&5
+echo "${ECHO_T}$ZCAT" >&6
+else
+ echo "$as_me:45099: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$ZCAT" && break
+done
+test -n "$ZCAT" || ZCAT="$ZCAT"
+
+cf_path_prog=""
+cf_path_args=""
+IFS="${IFS:- }"; cf_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR"
+for cf_temp in $ac_cv_path_ZCAT
+do
+ if test -z "$cf_path_prog" ; then
+ if test "$with_full_paths" = yes ; then
+
+if test "x$prefix" != xNONE; then
+ cf_path_syntax="$prefix"
+else
+ cf_path_syntax="$ac_default_prefix"
+fi
+
+case ".$cf_temp" in
+(.\$\(*\)*|.\'*\'*)
+ ;;
+(..|./*|.\\*)
+ ;;
+(.[a-zA-Z]:[\\/]*) # OS/2 EMX
+ ;;
+(.\$\{*prefix\}*|.\$\{*dir\}*)
+ eval cf_temp="$cf_temp"
+ case ".$cf_temp" in
+ (.NONE/*)
+ cf_temp=`echo "$cf_temp" | sed -e s%NONE%$cf_path_syntax%`
+ ;;
+ esac
+ ;;
+(.no|.NONE/*)
+ cf_temp=`echo "$cf_temp" | sed -e s%NONE%$cf_path_syntax%`
+ ;;
+(*)
+ break
+ ;;
+esac
+
+ cf_path_prog="$cf_temp"
+ else
+ cf_path_prog="`basename "$cf_temp"`"
+ fi
+ elif test -z "$cf_path_args" ; then
+ cf_path_args="$cf_temp"
+ else
+ cf_path_args="$cf_path_args $cf_temp"
+ fi
+done
+IFS="$cf_save_ifs"
+
+if test -n "$cf_path_prog" ; then
+
+echo "${as_me:-configure}:45158: testing defining path for ${cf_path_prog} ..." 1>&5
+
+cat >>confdefs.h <<EOF
+#define ZCAT_PATH "$cf_path_prog"
+EOF
+
+ test -n "$cf_path_args" &&
+cat >>confdefs.h <<EOF
+#define ZCAT_ARGS "$cf_path_args"
+EOF
+
+fi
+
+test -z "$ZIP" && ZIP="zip"
+for ac_prog in $ZIP zip
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:45176: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_ZIP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $ZIP in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_ZIP="$ZIP" # Let the user override the test with a path.
+ ;;
+ *)
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ if $as_executable_p "$ac_dir/$ac_word"; then
+ ac_cv_path_ZIP="$ac_dir/$ac_word"
+ echo "$as_me:45193: found $ac_dir/$ac_word" >&5
+ break
+fi
+done
+
+ ;;
+esac
+fi
+ZIP=$ac_cv_path_ZIP
+
+if test -n "$ZIP"; then
+ echo "$as_me:45204: result: $ZIP" >&5
+echo "${ECHO_T}$ZIP" >&6
+else
+ echo "$as_me:45207: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$ZIP" && break
+done
+test -n "$ZIP" || ZIP="$ZIP"
+
+cf_path_prog=""
+cf_path_args=""
+IFS="${IFS:- }"; cf_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR"
+for cf_temp in $ac_cv_path_ZIP
+do
+ if test -z "$cf_path_prog" ; then
+ if test "$with_full_paths" = yes ; then
+
+if test "x$prefix" != xNONE; then
+ cf_path_syntax="$prefix"
+else
+ cf_path_syntax="$ac_default_prefix"
+fi
+
+case ".$cf_temp" in
+(.\$\(*\)*|.\'*\'*)
+ ;;
+(..|./*|.\\*)
+ ;;
+(.[a-zA-Z]:[\\/]*) # OS/2 EMX
+ ;;
+(.\$\{*prefix\}*|.\$\{*dir\}*)
+ eval cf_temp="$cf_temp"
+ case ".$cf_temp" in
+ (.NONE/*)
+ cf_temp=`echo "$cf_temp" | sed -e s%NONE%$cf_path_syntax%`
+ ;;
+ esac
+ ;;
+(.no|.NONE/*)
+ cf_temp=`echo "$cf_temp" | sed -e s%NONE%$cf_path_syntax%`
+ ;;
+(*)
+ break
+ ;;
+esac
+
+ cf_path_prog="$cf_temp"
+ else
+ cf_path_prog="`basename "$cf_temp"`"
+ fi
+ elif test -z "$cf_path_args" ; then
+ cf_path_args="$cf_temp"
+ else
+ cf_path_args="$cf_path_args $cf_temp"
+ fi
+done
+IFS="$cf_save_ifs"
+
+if test -n "$cf_path_prog" ; then
+
+echo "${as_me:-configure}:45266: testing defining path for ${cf_path_prog} ..." 1>&5
+
+cat >>confdefs.h <<EOF
+#define ZIP_PATH "$cf_path_prog"
+EOF
+
+ test -n "$cf_path_args" &&
+cat >>confdefs.h <<EOF
+#define ZIP_ARGS "$cf_path_args"
+EOF
+
+fi
+
+case "$INSTALL" in
+($srcdir*)
+ cat >>confdefs.h <<EOF
+#define INSTALL_PATH "install"
+EOF
+
+ ;;
+(*)
+ cf_save_INSTALL="$INSTALL"
+
+test -z "$INSTALL" && INSTALL="install"
+for ac_prog in $INSTALL install
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:45294: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_INSTALL+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $INSTALL in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_INSTALL="$INSTALL" # Let the user override the test with a path.
+ ;;
+ *)
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ if $as_executable_p "$ac_dir/$ac_word"; then
+ ac_cv_path_INSTALL="$ac_dir/$ac_word"
+ echo "$as_me:45311: found $ac_dir/$ac_word" >&5
+ break
+fi
+done
+
+ ;;
+esac
+fi
+INSTALL=$ac_cv_path_INSTALL
+
+if test -n "$INSTALL"; then
+ echo "$as_me:45322: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6
+else
+ echo "$as_me:45325: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$INSTALL" && break
+done
+test -n "$INSTALL" || INSTALL="$INSTALL"
+
+cf_path_prog=""
+cf_path_args=""
+IFS="${IFS:- }"; cf_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR"
+for cf_temp in $ac_cv_path_INSTALL
+do
+ if test -z "$cf_path_prog" ; then
+ if test "$with_full_paths" = yes ; then
+
+if test "x$prefix" != xNONE; then
+ cf_path_syntax="$prefix"
+else
+ cf_path_syntax="$ac_default_prefix"
+fi
+
+case ".$cf_temp" in
+(.\$\(*\)*|.\'*\'*)
+ ;;
+(..|./*|.\\*)
+ ;;
+(.[a-zA-Z]:[\\/]*) # OS/2 EMX
+ ;;
+(.\$\{*prefix\}*|.\$\{*dir\}*)
+ eval cf_temp="$cf_temp"
+ case ".$cf_temp" in
+ (.NONE/*)
+ cf_temp=`echo "$cf_temp" | sed -e s%NONE%$cf_path_syntax%`
+ ;;
+ esac
+ ;;
+(.no|.NONE/*)
+ cf_temp=`echo "$cf_temp" | sed -e s%NONE%$cf_path_syntax%`
+ ;;
+(*)
+ break
+ ;;
+esac
+
+ cf_path_prog="$cf_temp"
+ else
+ cf_path_prog="`basename "$cf_temp"`"
+ fi
+ elif test -z "$cf_path_args" ; then
+ cf_path_args="$cf_temp"
+ else
+ cf_path_args="$cf_path_args $cf_temp"
+ fi
+done
+IFS="$cf_save_ifs"
+
+if test -n "$cf_path_prog" ; then
+
+echo "${as_me:-configure}:45384: testing defining path for ${cf_path_prog} ..." 1>&5
+
+cat >>confdefs.h <<EOF
+#define INSTALL_PATH "$cf_path_prog"
+EOF
+
+ test -n "$cf_path_args" &&
+cat >>confdefs.h <<EOF
+#define INSTALL_ARGS "$cf_path_args"
+EOF
+
+fi
+
+ INSTALL="$cf_save_INSTALL"
+ ;;
+esac
+fi
+
+COMPRESS_PROG=
+COMPRESS_EXT=
+if test "$use_gzip_help" = yes ; then
+ COMPRESS_PROG="$ac_cv_path_GZIP -9 -n"
+ COMPRESS_EXT=.gz
+fi
+
+if test "$cf_cv_screen" = pdcurses ; then
+
+ case "$host_os" in
+ (mingw*)
+
+echo "$as_me:45414: checking for initscr in -lpdcurses" >&5
+echo $ECHO_N "checking for initscr in -lpdcurses... $ECHO_C" >&6
+if test "${ac_cv_lib_pdcurses_initscr+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lpdcurses $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 45422 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char initscr ();
+int
+main (void)
+{
+initscr ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:45441: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:45444: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:45447: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:45450: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_lib_pdcurses_initscr=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_pdcurses_initscr=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:45461: result: $ac_cv_lib_pdcurses_initscr" >&5
+echo "${ECHO_T}$ac_cv_lib_pdcurses_initscr" >&6
+if test "$ac_cv_lib_pdcurses_initscr" = yes; then
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lpdcurses; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+ cf_cv_term_header=no
+ cf_cv_unctrl_header=no
+ echo "$as_me:45483: checking for winwstr" >&5
+echo $ECHO_N "checking for winwstr... $ECHO_C" >&6
+if test "${ac_cv_func_winwstr+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 45489 "configure"
+#include "confdefs.h"
+#define winwstr autoconf_temporary
+#include <limits.h> /* least-intrusive standard header which defines gcc2 __stub macros */
+#undef winwstr
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char winwstr (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_winwstr) || defined (__stub___winwstr)
+#error found stub for winwstr
+#endif
+
+ return winwstr ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:45520: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:45523: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:45526: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:45529: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_func_winwstr=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_winwstr=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:45539: result: $ac_cv_func_winwstr" >&5
+echo "${ECHO_T}$ac_cv_func_winwstr" >&6
+if test "$ac_cv_func_winwstr" = yes; then
+
+cat >>confdefs.h <<\EOF
+#define PDC_WIDE 1
+EOF
+
+fi
+
+ echo "$as_me:45549: checking for pdcurses_dll_iname" >&5
+echo $ECHO_N "checking for pdcurses_dll_iname... $ECHO_C" >&6
+if test "${ac_cv_func_pdcurses_dll_iname+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 45555 "configure"
+#include "confdefs.h"
+#define pdcurses_dll_iname autoconf_temporary
+#include <limits.h> /* least-intrusive standard header which defines gcc2 __stub macros */
+#undef pdcurses_dll_iname
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char pdcurses_dll_iname (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_pdcurses_dll_iname) || defined (__stub___pdcurses_dll_iname)
+#error found stub for pdcurses_dll_iname
+#endif
+
+ return pdcurses_dll_iname ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:45586: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:45589: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:45592: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:45595: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_func_pdcurses_dll_iname=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_pdcurses_dll_iname=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:45605: result: $ac_cv_func_pdcurses_dll_iname" >&5
+echo "${ECHO_T}$ac_cv_func_pdcurses_dll_iname" >&6
+if test "$ac_cv_func_pdcurses_dll_iname" = yes; then
+
+cat >>confdefs.h <<\EOF
+#define PDC_DLL_BUILD 1
+EOF
+
+fi
+
+fi
+
+ ;;
+ (*)
+
+cf_x_athena=${cf_x_athena:-Xaw}
+
+echo "$as_me:45622: checking if you want to link with Xaw 3d library" >&5
+echo $ECHO_N "checking if you want to link with Xaw 3d library... $ECHO_C" >&6
+withval=
+
+# Check whether --with-Xaw3d or --without-Xaw3d was given.
+if test "${with_Xaw3d+set}" = set; then
+ withval="$with_Xaw3d"
+
+fi;
+if test "$withval" = yes ; then
+ cf_x_athena=Xaw3d
+ echo "$as_me:45633: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else
+ echo "$as_me:45636: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+echo "$as_me:45640: checking if you want to link with Xaw 3d xft library" >&5
+echo $ECHO_N "checking if you want to link with Xaw 3d xft library... $ECHO_C" >&6
+withval=
+
+# Check whether --with-Xaw3dxft or --without-Xaw3dxft was given.
+if test "${with_Xaw3dxft+set}" = set; then
+ withval="$with_Xaw3dxft"
+
+fi;
+if test "$withval" = yes ; then
+ cf_x_athena=Xaw3dxft
+ echo "$as_me:45651: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else
+ echo "$as_me:45654: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+echo "$as_me:45658: checking if you want to link with neXT Athena library" >&5
+echo $ECHO_N "checking if you want to link with neXT Athena library... $ECHO_C" >&6
+withval=
+
+# Check whether --with-neXtaw or --without-neXtaw was given.
+if test "${with_neXtaw+set}" = set; then
+ withval="$with_neXtaw"
+
+fi;
+if test "$withval" = yes ; then
+ cf_x_athena=neXtaw
+ echo "$as_me:45669: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else
+ echo "$as_me:45672: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+echo "$as_me:45676: checking if you want to link with Athena-Plus library" >&5
+echo $ECHO_N "checking if you want to link with Athena-Plus library... $ECHO_C" >&6
+withval=
+
+# Check whether --with-XawPlus or --without-XawPlus was given.
+if test "${with_XawPlus+set}" = set; then
+ withval="$with_XawPlus"
+
+fi;
+if test "$withval" = yes ; then
+ cf_x_athena=XawPlus
+ echo "$as_me:45687: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else
+ echo "$as_me:45690: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+cf_x_athena_lib=""
+
+if test "$PKG_CONFIG" != none ; then
+ cf_athena_list=
+ test "$cf_x_athena" = Xaw && cf_athena_list="xaw8 xaw7 xaw6"
+ for cf_athena_pkg in \
+ $cf_athena_list \
+ ${cf_x_athena} \
+ ${cf_x_athena}-devel \
+ lib${cf_x_athena} \
+ lib${cf_x_athena}-devel
+ do
+
+if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists "$cf_athena_pkg"; then
+ test -n "$verbose" && echo " found package $cf_athena_pkg" 1>&6
+
+echo "${as_me:-configure}:45710: testing found package $cf_athena_pkg ..." 1>&5
+
+ cf_pkgconfig_incs="`$PKG_CONFIG --cflags "$cf_athena_pkg" 2>/dev/null`"
+ cf_pkgconfig_libs="`$PKG_CONFIG --libs "$cf_athena_pkg" 2>/dev/null`"
+ test -n "$verbose" && echo " package $cf_athena_pkg CFLAGS: $cf_pkgconfig_incs" 1>&6
+
+echo "${as_me:-configure}:45716: testing package $cf_athena_pkg CFLAGS: $cf_pkgconfig_incs ..." 1>&5
+
+ test -n "$verbose" && echo " package $cf_athena_pkg LIBS: $cf_pkgconfig_libs" 1>&6
+
+echo "${as_me:-configure}:45720: testing package $cf_athena_pkg LIBS: $cf_pkgconfig_libs ..." 1>&5
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_pkgconfig_incs
+do
+case "$cf_fix_cppflags" in
+(no)
+ case "$cf_add_cflags" in
+ (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=yes
+
+ if test "$cf_fix_cppflags" = yes ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ elif test "${cf_tst_cflags}" = "\"'" ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ fi
+ ;;
+ esac
+ case "$CPPFLAGS" in
+ (*$cf_add_cflags)
+ ;;
+ (*)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+ sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \
+ -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'`
+
+ ;;
+ esac
+
+ test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+ cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+ (*)
+
+ test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+ cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+(yes)
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=no
+ ;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+ test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+ CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+ test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+ EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+ cf_x_athena_lib="$cf_pkgconfig_libs"
+
+cf_x_athena_LIBS=`echo "HAVE_LIB_$cf_x_athena" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+ cat >>confdefs.h <<EOF
+#define $cf_x_athena_LIBS 1
+EOF
+
+ for cf_trim_lib in Xmu Xt X11
+ do
+ case "$LIBS" in
+ (*-l$cf_trim_lib\ *-l$cf_trim_lib*)
+ LIBS=`echo "$LIBS " | sed -e 's/ / /g' -e 's%-l'"$cf_trim_lib"' %%' -e 's/ $//'`
+ test -n "$verbose" && echo " ..trimmed $LIBS" 1>&6
+
+echo "${as_me:-configure}:45851: testing ..trimmed $LIBS ..." 1>&5
+
+ ;;
+ esac
+ done
+
+echo "$as_me:45857: checking for usable $cf_x_athena/Xmu package" >&5
+echo $ECHO_N "checking for usable $cf_x_athena/Xmu package... $ECHO_C" >&6
+if test "${cf_cv_xaw_compat+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 45864 "configure"
+#include "confdefs.h"
+
+#include <X11/Xmu/CharSet.h>
+
+int
+main (void)
+{
+
+int check = XmuCompareISOLatin1("big", "small");
+(void)check;
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:45881: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:45884: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:45887: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:45890: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_xaw_compat=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_xaw_compat=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:45900: result: $cf_cv_xaw_compat" >&5
+echo "${ECHO_T}$cf_cv_xaw_compat" >&6
+
+ if test "$cf_cv_xaw_compat" = no
+ then
+ # workaround for broken ".pc" files...
+ case "$cf_x_athena_lib" in
+ (*-lXmu*)
+ ;;
+ (*)
+ test -n "$verbose" && echo " work around broken package" 1>&6
+
+echo "${as_me:-configure}:45912: testing work around broken package ..." 1>&5
+
+ cf_save_xmu="$LIBS"
+ cf_first_lib=`echo "$cf_save_xmu" | sed -e 's/^ *//' -e 's/ .*//'`
+
+if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists "xmu"; then
+ test -n "$verbose" && echo " found package xmu" 1>&6
+
+echo "${as_me:-configure}:45920: testing found package xmu ..." 1>&5
+
+ cf_pkgconfig_incs="`$PKG_CONFIG --cflags "xmu" 2>/dev/null`"
+ cf_pkgconfig_libs="`$PKG_CONFIG --libs "xmu" 2>/dev/null`"
+ test -n "$verbose" && echo " package xmu CFLAGS: $cf_pkgconfig_incs" 1>&6
+
+echo "${as_me:-configure}:45926: testing package xmu CFLAGS: $cf_pkgconfig_incs ..." 1>&5
+
+ test -n "$verbose" && echo " package xmu LIBS: $cf_pkgconfig_libs" 1>&6
+
+echo "${as_me:-configure}:45930: testing package xmu LIBS: $cf_pkgconfig_libs ..." 1>&5
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_pkgconfig_incs
+do
+case "$cf_fix_cppflags" in
+(no)
+ case "$cf_add_cflags" in
+ (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=yes
+
+ if test "$cf_fix_cppflags" = yes ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ elif test "${cf_tst_cflags}" = "\"'" ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ fi
+ ;;
+ esac
+ case "$CPPFLAGS" in
+ (*$cf_add_cflags)
+ ;;
+ (*)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+ sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \
+ -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'`
+
+ ;;
+ esac
+
+ test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+ cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+ (*)
+
+ test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+ cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+(yes)
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=no
+ ;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+ test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+ CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+ test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+ EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+ LIBS="$cf_save_xmu"
+
+test -n "$verbose" && echo " ...before $LIBS" 1>&6
+
+echo "${as_me:-configure}:46050: testing ...before $LIBS ..." 1>&5
+
+LIBS=`echo "$LIBS" | sed -e "s/[ ][ ]*/ /g" -e "s%$cf_first_lib %$cf_first_lib $cf_pkgconfig_libs %" -e 's% % %g'`
+test -n "$verbose" && echo " ...after $LIBS" 1>&6
+
+echo "${as_me:-configure}:46055: testing ...after $LIBS ..." 1>&5
+
+else
+ cf_pkgconfig_incs=
+ cf_pkgconfig_libs=
+
+test -n "$verbose" && echo " ...before $LIBS" 1>&6
+
+echo "${as_me:-configure}:46063: testing ...before $LIBS ..." 1>&5
+
+LIBS=`echo "$LIBS" | sed -e "s/[ ][ ]*/ /g" -e "s%$cf_first_lib %$cf_first_lib -lXmu %" -e 's% % %g'`
+test -n "$verbose" && echo " ...after $LIBS" 1>&6
+
+echo "${as_me:-configure}:46068: testing ...after $LIBS ..." 1>&5
+
+fi
+
+ for cf_trim_lib in Xmu Xt X11
+ do
+ case "$LIBS" in
+ (*-l$cf_trim_lib\ *-l$cf_trim_lib*)
+ LIBS=`echo "$LIBS " | sed -e 's/ / /g' -e 's%-l'"$cf_trim_lib"' %%' -e 's/ $//'`
+ test -n "$verbose" && echo " ..trimmed $LIBS" 1>&6
+
+echo "${as_me:-configure}:46079: testing ..trimmed $LIBS ..." 1>&5
+
+ ;;
+ esac
+ done
+
+ ;;
+ esac
+ fi
+
+ break
+else
+ cf_pkgconfig_incs=
+ cf_pkgconfig_libs=
+ :
+fi
+
+ done
+fi
+
+if test -z "$cf_x_athena_lib" ; then
+
+if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists "Xext"; then
+ test -n "$verbose" && echo " found package Xext" 1>&6
+
+echo "${as_me:-configure}:46104: testing found package Xext ..." 1>&5
+
+ cf_pkgconfig_incs="`$PKG_CONFIG --cflags "Xext" 2>/dev/null`"
+ cf_pkgconfig_libs="`$PKG_CONFIG --libs "Xext" 2>/dev/null`"
+ test -n "$verbose" && echo " package Xext CFLAGS: $cf_pkgconfig_incs" 1>&6
+
+echo "${as_me:-configure}:46110: testing package Xext CFLAGS: $cf_pkgconfig_incs ..." 1>&5
+
+ test -n "$verbose" && echo " package Xext LIBS: $cf_pkgconfig_libs" 1>&6
+
+echo "${as_me:-configure}:46114: testing package Xext LIBS: $cf_pkgconfig_libs ..." 1>&5
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_pkgconfig_incs
+do
+case "$cf_fix_cppflags" in
+(no)
+ case "$cf_add_cflags" in
+ (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=yes
+
+ if test "$cf_fix_cppflags" = yes ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ elif test "${cf_tst_cflags}" = "\"'" ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ fi
+ ;;
+ esac
+ case "$CPPFLAGS" in
+ (*$cf_add_cflags)
+ ;;
+ (*)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+ sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \
+ -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'`
+
+ ;;
+ esac
+
+ test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+ cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+ (*)
+
+ test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+ cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+(yes)
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=no
+ ;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+ test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+ CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+ test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+ EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+ :
+else
+ cf_pkgconfig_incs=
+ cf_pkgconfig_libs=
+
+ echo "$as_me:46235: checking for XextCreateExtension in -lXext" >&5
+echo $ECHO_N "checking for XextCreateExtension in -lXext... $ECHO_C" >&6
+if test "${ac_cv_lib_Xext_XextCreateExtension+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lXext $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 46243 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char XextCreateExtension ();
+int
+main (void)
+{
+XextCreateExtension ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:46262: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:46265: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:46268: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:46271: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_lib_Xext_XextCreateExtension=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_Xext_XextCreateExtension=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:46282: result: $ac_cv_lib_Xext_XextCreateExtension" >&5
+echo "${ECHO_T}$ac_cv_lib_Xext_XextCreateExtension" >&6
+if test "$ac_cv_lib_Xext_XextCreateExtension" = yes; then
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lXext; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+fi
+
+fi
+
+# OSX is schizoid about who owns /usr/X11 (old) versus /opt/X11 (new) (and
+# in some cases has installed dummy files in the former, other cases replaced
+# it with a link to the new location). This complicates the configure script.
+# Check for that pitfall, and recover using pkg-config
+#
+# If none of these are set, the configuration is almost certainly broken.
+if test -z "${X_CFLAGS}${X_PRE_LIBS}${X_LIBS}${X_EXTRA_LIBS}"
+then
+
+if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists "x11"; then
+ test -n "$verbose" && echo " found package x11" 1>&6
+
+echo "${as_me:-configure}:46318: testing found package x11 ..." 1>&5
+
+ cf_pkgconfig_incs="`$PKG_CONFIG --cflags "x11" 2>/dev/null`"
+ cf_pkgconfig_libs="`$PKG_CONFIG --libs "x11" 2>/dev/null`"
+ test -n "$verbose" && echo " package x11 CFLAGS: $cf_pkgconfig_incs" 1>&6
+
+echo "${as_me:-configure}:46324: testing package x11 CFLAGS: $cf_pkgconfig_incs ..." 1>&5
+
+ test -n "$verbose" && echo " package x11 LIBS: $cf_pkgconfig_libs" 1>&6
+
+echo "${as_me:-configure}:46328: testing package x11 LIBS: $cf_pkgconfig_libs ..." 1>&5
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_pkgconfig_incs
+do
+case "$cf_fix_cppflags" in
+(no)
+ case "$cf_add_cflags" in
+ (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=yes
+
+ if test "$cf_fix_cppflags" = yes ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ elif test "${cf_tst_cflags}" = "\"'" ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ fi
+ ;;
+ esac
+ case "$CPPFLAGS" in
+ (*$cf_add_cflags)
+ ;;
+ (*)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+ sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \
+ -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'`
+
+ ;;
+ esac
+
+ test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+ cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+ (*)
+
+ test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+ cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+(yes)
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=no
+ ;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+ test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+ CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+ test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+ EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+ :
+else
+ cf_pkgconfig_incs=
+ cf_pkgconfig_libs=
+ { echo "$as_me:46448: WARNING: unable to find X11 library" >&5
+echo "$as_me: WARNING: unable to find X11 library" >&2;}
+fi
+
+if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists "ice"; then
+ test -n "$verbose" && echo " found package ice" 1>&6
+
+echo "${as_me:-configure}:46455: testing found package ice ..." 1>&5
+
+ cf_pkgconfig_incs="`$PKG_CONFIG --cflags "ice" 2>/dev/null`"
+ cf_pkgconfig_libs="`$PKG_CONFIG --libs "ice" 2>/dev/null`"
+ test -n "$verbose" && echo " package ice CFLAGS: $cf_pkgconfig_incs" 1>&6
+
+echo "${as_me:-configure}:46461: testing package ice CFLAGS: $cf_pkgconfig_incs ..." 1>&5
+
+ test -n "$verbose" && echo " package ice LIBS: $cf_pkgconfig_libs" 1>&6
+
+echo "${as_me:-configure}:46465: testing package ice LIBS: $cf_pkgconfig_libs ..." 1>&5
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_pkgconfig_incs
+do
+case "$cf_fix_cppflags" in
+(no)
+ case "$cf_add_cflags" in
+ (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=yes
+
+ if test "$cf_fix_cppflags" = yes ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ elif test "${cf_tst_cflags}" = "\"'" ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ fi
+ ;;
+ esac
+ case "$CPPFLAGS" in
+ (*$cf_add_cflags)
+ ;;
+ (*)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+ sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \
+ -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'`
+
+ ;;
+ esac
+
+ test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+ cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+ (*)
+
+ test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+ cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+(yes)
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=no
+ ;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+ test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+ CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+ test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+ EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+ :
+else
+ cf_pkgconfig_incs=
+ cf_pkgconfig_libs=
+ { echo "$as_me:46585: WARNING: unable to find ICE library" >&5
+echo "$as_me: WARNING: unable to find ICE library" >&2;}
+fi
+
+if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists "sm"; then
+ test -n "$verbose" && echo " found package sm" 1>&6
+
+echo "${as_me:-configure}:46592: testing found package sm ..." 1>&5
+
+ cf_pkgconfig_incs="`$PKG_CONFIG --cflags "sm" 2>/dev/null`"
+ cf_pkgconfig_libs="`$PKG_CONFIG --libs "sm" 2>/dev/null`"
+ test -n "$verbose" && echo " package sm CFLAGS: $cf_pkgconfig_incs" 1>&6
+
+echo "${as_me:-configure}:46598: testing package sm CFLAGS: $cf_pkgconfig_incs ..." 1>&5
+
+ test -n "$verbose" && echo " package sm LIBS: $cf_pkgconfig_libs" 1>&6
+
+echo "${as_me:-configure}:46602: testing package sm LIBS: $cf_pkgconfig_libs ..." 1>&5
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_pkgconfig_incs
+do
+case "$cf_fix_cppflags" in
+(no)
+ case "$cf_add_cflags" in
+ (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=yes
+
+ if test "$cf_fix_cppflags" = yes ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ elif test "${cf_tst_cflags}" = "\"'" ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ fi
+ ;;
+ esac
+ case "$CPPFLAGS" in
+ (*$cf_add_cflags)
+ ;;
+ (*)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+ sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \
+ -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'`
+
+ ;;
+ esac
+
+ test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+ cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+ (*)
+
+ test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+ cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+(yes)
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=no
+ ;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+ test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+ CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+ test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+ EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+ :
+else
+ cf_pkgconfig_incs=
+ cf_pkgconfig_libs=
+ { echo "$as_me:46722: WARNING: unable to find SM library" >&5
+echo "$as_me: WARNING: unable to find SM library" >&2;}
+fi
+
+if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists "xt"; then
+ test -n "$verbose" && echo " found package xt" 1>&6
+
+echo "${as_me:-configure}:46729: testing found package xt ..." 1>&5
+
+ cf_pkgconfig_incs="`$PKG_CONFIG --cflags "xt" 2>/dev/null`"
+ cf_pkgconfig_libs="`$PKG_CONFIG --libs "xt" 2>/dev/null`"
+ test -n "$verbose" && echo " package xt CFLAGS: $cf_pkgconfig_incs" 1>&6
+
+echo "${as_me:-configure}:46735: testing package xt CFLAGS: $cf_pkgconfig_incs ..." 1>&5
+
+ test -n "$verbose" && echo " package xt LIBS: $cf_pkgconfig_libs" 1>&6
+
+echo "${as_me:-configure}:46739: testing package xt LIBS: $cf_pkgconfig_libs ..." 1>&5
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_pkgconfig_incs
+do
+case "$cf_fix_cppflags" in
+(no)
+ case "$cf_add_cflags" in
+ (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=yes
+
+ if test "$cf_fix_cppflags" = yes ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ elif test "${cf_tst_cflags}" = "\"'" ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ fi
+ ;;
+ esac
+ case "$CPPFLAGS" in
+ (*$cf_add_cflags)
+ ;;
+ (*)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+ sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \
+ -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'`
+
+ ;;
+ esac
+
+ test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+ cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+ (*)
+
+ test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+ cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+(yes)
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=no
+ ;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+ test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+ CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+ test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+ EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+ :
+else
+ cf_pkgconfig_incs=
+ cf_pkgconfig_libs=
+ { echo "$as_me:46859: WARNING: unable to find Xt library" >&5
+echo "$as_me: WARNING: unable to find Xt library" >&2;}
+fi
+
+else
+ LIBS="$X_PRE_LIBS $LIBS $X_EXTRA_LIBS"
+fi
+
+cf_have_X_LIBS=no
+
+if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists "xt"; then
+ test -n "$verbose" && echo " found package xt" 1>&6
+
+echo "${as_me:-configure}:46872: testing found package xt ..." 1>&5
+
+ cf_pkgconfig_incs="`$PKG_CONFIG --cflags "xt" 2>/dev/null`"
+ cf_pkgconfig_libs="`$PKG_CONFIG --libs "xt" 2>/dev/null`"
+ test -n "$verbose" && echo " package xt CFLAGS: $cf_pkgconfig_incs" 1>&6
+
+echo "${as_me:-configure}:46878: testing package xt CFLAGS: $cf_pkgconfig_incs ..." 1>&5
+
+ test -n "$verbose" && echo " package xt LIBS: $cf_pkgconfig_libs" 1>&6
+
+echo "${as_me:-configure}:46882: testing package xt LIBS: $cf_pkgconfig_libs ..." 1>&5
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_pkgconfig_incs
+do
+case "$cf_fix_cppflags" in
+(no)
+ case "$cf_add_cflags" in
+ (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=yes
+
+ if test "$cf_fix_cppflags" = yes ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ elif test "${cf_tst_cflags}" = "\"'" ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ fi
+ ;;
+ esac
+ case "$CPPFLAGS" in
+ (*$cf_add_cflags)
+ ;;
+ (*)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+ sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \
+ -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'`
+
+ ;;
+ esac
+
+ test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+ cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+ (*)
+
+ test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+ cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+(yes)
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=no
+ ;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+ test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+ CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+ test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+ EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+ case "x$LIBS" in
+ (*-lX11*)
+ ;;
+ (*)
+# we have an "xt" package, but it may omit Xt's dependency on X11
+echo "$as_me:47003: checking for usable X dependency" >&5
+echo $ECHO_N "checking for usable X dependency... $ECHO_C" >&6
+if test "${cf_cv_xt_x11_compat+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 47010 "configure"
+#include "confdefs.h"
+
+#include <X11/Xlib.h>
+
+int
+main (void)
+{
+
+ int rc1 = XDrawLine((Display*) 0, (Drawable) 0, (GC) 0, 0, 0, 0, 0);
+ int rc2 = XClearWindow((Display*) 0, (Window) 0);
+ int rc3 = XMoveWindow((Display*) 0, (Window) 0, 0, 0);
+ int rc4 = XMoveResizeWindow((Display*)0, (Window)0, 0, 0, 0, 0);
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:47029: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:47032: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:47035: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:47038: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_xt_x11_compat=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_xt_x11_compat=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:47048: result: $cf_cv_xt_x11_compat" >&5
+echo "${ECHO_T}$cf_cv_xt_x11_compat" >&6
+ if test "$cf_cv_xt_x11_compat" = no
+ then
+ test -n "$verbose" && echo " work around broken X11 dependency" 1>&6
+
+echo "${as_me:-configure}:47054: testing work around broken X11 dependency ..." 1>&5
+
+ # 2010/11/19 - good enough until a working Xt on Xcb is delivered.
+
+if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists "x11"; then
+ test -n "$verbose" && echo " found package x11" 1>&6
+
+echo "${as_me:-configure}:47061: testing found package x11 ..." 1>&5
+
+ cf_pkgconfig_incs="`$PKG_CONFIG --cflags "x11" 2>/dev/null`"
+ cf_pkgconfig_libs="`$PKG_CONFIG --libs "x11" 2>/dev/null`"
+ test -n "$verbose" && echo " package x11 CFLAGS: $cf_pkgconfig_incs" 1>&6
+
+echo "${as_me:-configure}:47067: testing package x11 CFLAGS: $cf_pkgconfig_incs ..." 1>&5
+
+ test -n "$verbose" && echo " package x11 LIBS: $cf_pkgconfig_libs" 1>&6
+
+echo "${as_me:-configure}:47071: testing package x11 LIBS: $cf_pkgconfig_libs ..." 1>&5
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_pkgconfig_incs
+do
+case "$cf_fix_cppflags" in
+(no)
+ case "$cf_add_cflags" in
+ (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=yes
+
+ if test "$cf_fix_cppflags" = yes ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ elif test "${cf_tst_cflags}" = "\"'" ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ fi
+ ;;
+ esac
+ case "$CPPFLAGS" in
+ (*$cf_add_cflags)
+ ;;
+ (*)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+ sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \
+ -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'`
+
+ ;;
+ esac
+
+ test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+ cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+ (*)
+
+ test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+ cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+(yes)
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=no
+ ;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+ test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+ CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+ test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+ EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+ :
+else
+ cf_pkgconfig_incs=
+ cf_pkgconfig_libs=
+
+test -n "$verbose" && echo " ...before $LIBS" 1>&6
+
+echo "${as_me:-configure}:47194: testing ...before $LIBS ..." 1>&5
+
+LIBS=`echo "$LIBS" | sed -e "s/[ ][ ]*/ /g" -e "s%-lXt %-lXt -lX11 %" -e 's% % %g'`
+test -n "$verbose" && echo " ...after $LIBS" 1>&6
+
+echo "${as_me:-configure}:47199: testing ...after $LIBS ..." 1>&5
+
+fi
+
+ fi
+ ;;
+ esac
+
+echo "$as_me:47207: checking for usable X Toolkit package" >&5
+echo $ECHO_N "checking for usable X Toolkit package... $ECHO_C" >&6
+if test "${cf_cv_xt_ice_compat+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 47214 "configure"
+#include "confdefs.h"
+
+#include <X11/Shell.h>
+
+int
+main (void)
+{
+int num = IceConnectionNumber(0); (void) num
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:47229: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:47232: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:47235: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:47238: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_xt_ice_compat=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_xt_ice_compat=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:47248: result: $cf_cv_xt_ice_compat" >&5
+echo "${ECHO_T}$cf_cv_xt_ice_compat" >&6
+
+ if test "$cf_cv_xt_ice_compat" = no
+ then
+ # workaround for broken ".pc" files used for X Toolkit.
+ case "x$X_PRE_LIBS" in
+ (*-lICE*)
+ case "x$LIBS" in
+ (*-lICE*)
+ ;;
+ (*)
+ test -n "$verbose" && echo " work around broken ICE dependency" 1>&6
+
+echo "${as_me:-configure}:47262: testing work around broken ICE dependency ..." 1>&5
+
+if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists "ice"; then
+ test -n "$verbose" && echo " found package ice" 1>&6
+
+echo "${as_me:-configure}:47267: testing found package ice ..." 1>&5
+
+ cf_pkgconfig_incs="`$PKG_CONFIG --cflags "ice" 2>/dev/null`"
+ cf_pkgconfig_libs="`$PKG_CONFIG --libs "ice" 2>/dev/null`"
+ test -n "$verbose" && echo " package ice CFLAGS: $cf_pkgconfig_incs" 1>&6
+
+echo "${as_me:-configure}:47273: testing package ice CFLAGS: $cf_pkgconfig_incs ..." 1>&5
+
+ test -n "$verbose" && echo " package ice LIBS: $cf_pkgconfig_libs" 1>&6
+
+echo "${as_me:-configure}:47277: testing package ice LIBS: $cf_pkgconfig_libs ..." 1>&5
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_pkgconfig_incs
+do
+case "$cf_fix_cppflags" in
+(no)
+ case "$cf_add_cflags" in
+ (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=yes
+
+ if test "$cf_fix_cppflags" = yes ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ elif test "${cf_tst_cflags}" = "\"'" ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ fi
+ ;;
+ esac
+ case "$CPPFLAGS" in
+ (*$cf_add_cflags)
+ ;;
+ (*)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+ sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \
+ -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'`
+
+ ;;
+ esac
+
+ test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+ cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+ (*)
+
+ test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+ cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+(yes)
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=no
+ ;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+ test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+ CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+ test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+ EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists "sm"; then
+ test -n "$verbose" && echo " found package sm" 1>&6
+
+echo "${as_me:-configure}:47396: testing found package sm ..." 1>&5
+
+ cf_pkgconfig_incs="`$PKG_CONFIG --cflags "sm" 2>/dev/null`"
+ cf_pkgconfig_libs="`$PKG_CONFIG --libs "sm" 2>/dev/null`"
+ test -n "$verbose" && echo " package sm CFLAGS: $cf_pkgconfig_incs" 1>&6
+
+echo "${as_me:-configure}:47402: testing package sm CFLAGS: $cf_pkgconfig_incs ..." 1>&5
+
+ test -n "$verbose" && echo " package sm LIBS: $cf_pkgconfig_libs" 1>&6
+
+echo "${as_me:-configure}:47406: testing package sm LIBS: $cf_pkgconfig_libs ..." 1>&5
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_pkgconfig_incs
+do
+case "$cf_fix_cppflags" in
+(no)
+ case "$cf_add_cflags" in
+ (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=yes
+
+ if test "$cf_fix_cppflags" = yes ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ elif test "${cf_tst_cflags}" = "\"'" ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ fi
+ ;;
+ esac
+ case "$CPPFLAGS" in
+ (*$cf_add_cflags)
+ ;;
+ (*)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+ sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \
+ -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'`
+
+ ;;
+ esac
+
+ test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+ cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+ (*)
+
+ test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+ cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+(yes)
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=no
+ ;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+ test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+ CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+ test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+ EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+ :
+else
+ cf_pkgconfig_incs=
+ cf_pkgconfig_libs=
+ :
+fi
+
+else
+ cf_pkgconfig_incs=
+ cf_pkgconfig_libs=
+
+test -n "$verbose" && echo " ...before $LIBS" 1>&6
+
+echo "${as_me:-configure}:47535: testing ...before $LIBS ..." 1>&5
+
+LIBS=`echo "$LIBS" | sed -e "s/[ ][ ]*/ /g" -e "s%-lXt %-lXt $X_PRE_LIBS %" -e 's% % %g'`
+test -n "$verbose" && echo " ...after $LIBS" 1>&6
+
+echo "${as_me:-configure}:47540: testing ...after $LIBS ..." 1>&5
+
+fi
+
+ ;;
+ esac
+ ;;
+ esac
+ fi
+
+ cf_have_X_LIBS=yes
+
+else
+ cf_pkgconfig_incs=
+ cf_pkgconfig_libs=
+
+ LDFLAGS="$X_LIBS $LDFLAGS"
+
+test -n "$verbose" && echo " checking additions to CFLAGS" 1>&6
+
+echo "${as_me:-configure}:47560: testing checking additions to CFLAGS ..." 1>&5
+
+cf_check_cflags="$CFLAGS"
+cf_check_cppflags="$CPPFLAGS"
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $X_CFLAGS
+do
+case "$cf_fix_cppflags" in
+(no)
+ case "$cf_add_cflags" in
+ (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=yes
+
+ if test "$cf_fix_cppflags" = yes ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ elif test "${cf_tst_cflags}" = "\"'" ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ fi
+ ;;
+ esac
+ case "$CPPFLAGS" in
+ (*$cf_add_cflags)
+ ;;
+ (*)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+ sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \
+ -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'`
+
+ ;;
+ esac
+
+ test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+ cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+ (*)
+
+ test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+ cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+(yes)
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=no
+ ;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+ test -n "$verbose" && echo " add to \$CFLAGS $cf_new_cflags" 1>&6
+
+echo "${as_me:-configure}:47645: testing add to \$CFLAGS $cf_new_cflags ..." 1>&5
+
+ test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+ CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+ test -n "$verbose" && echo " add to \$CPPFLAGS $cf_new_cppflags" 1>&6
+
+echo "${as_me:-configure}:47655: testing add to \$CPPFLAGS $cf_new_cppflags ..." 1>&5
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+ test -n "$verbose" && echo " add to \$EXTRA_CPPFLAGS $cf_new_extra_cppflags" 1>&6
+
+echo "${as_me:-configure}:47665: testing add to \$EXTRA_CPPFLAGS $cf_new_extra_cppflags ..." 1>&5
+
+ test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+ EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+if test "x$cf_check_cflags" != "x$CFLAGS" ; then
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 47674 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello world");
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:47686: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:47689: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:47692: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:47695: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+test -n "$verbose" && echo " test-compile failed. Undoing change to \$CFLAGS" 1>&6
+
+echo "${as_me:-configure}:47703: testing test-compile failed. Undoing change to \$CFLAGS ..." 1>&5
+
+ if test "x$cf_check_cppflags" != "x$CPPFLAGS" ; then
+ test -n "$verbose" && echo " but keeping change to \$CPPFLAGS" 1>&6
+
+echo "${as_me:-configure}:47708: testing but keeping change to \$CPPFLAGS ..." 1>&5
+
+ fi
+ CFLAGS="$cf_check_cflags"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+
+ echo "$as_me:47716: checking for XOpenDisplay" >&5
+echo $ECHO_N "checking for XOpenDisplay... $ECHO_C" >&6
+if test "${ac_cv_func_XOpenDisplay+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 47722 "configure"
+#include "confdefs.h"
+#define XOpenDisplay autoconf_temporary
+#include <limits.h> /* least-intrusive standard header which defines gcc2 __stub macros */
+#undef XOpenDisplay
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char XOpenDisplay (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_XOpenDisplay) || defined (__stub___XOpenDisplay)
+#error found stub for XOpenDisplay
+#endif
+
+ return XOpenDisplay ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:47753: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:47756: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:47759: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:47762: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_func_XOpenDisplay=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_XOpenDisplay=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:47772: result: $ac_cv_func_XOpenDisplay" >&5
+echo "${ECHO_T}$ac_cv_func_XOpenDisplay" >&6
+if test "$ac_cv_func_XOpenDisplay" = yes; then
+ :
+else
+
+ echo "$as_me:47778: checking for XOpenDisplay in -lX11" >&5
+echo $ECHO_N "checking for XOpenDisplay in -lX11... $ECHO_C" >&6
+if test "${ac_cv_lib_X11_XOpenDisplay+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lX11 $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 47786 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char XOpenDisplay ();
+int
+main (void)
+{
+XOpenDisplay ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:47805: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:47808: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:47811: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:47814: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_lib_X11_XOpenDisplay=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_X11_XOpenDisplay=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:47825: result: $ac_cv_lib_X11_XOpenDisplay" >&5
+echo "${ECHO_T}$ac_cv_lib_X11_XOpenDisplay" >&6
+if test "$ac_cv_lib_X11_XOpenDisplay" = yes; then
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lX11; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+fi
+
+fi
+
+ echo "$as_me:47849: checking for XtAppInitialize" >&5
+echo $ECHO_N "checking for XtAppInitialize... $ECHO_C" >&6
+if test "${ac_cv_func_XtAppInitialize+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 47855 "configure"
+#include "confdefs.h"
+#define XtAppInitialize autoconf_temporary
+#include <limits.h> /* least-intrusive standard header which defines gcc2 __stub macros */
+#undef XtAppInitialize
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char XtAppInitialize (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_XtAppInitialize) || defined (__stub___XtAppInitialize)
+#error found stub for XtAppInitialize
+#endif
+
+ return XtAppInitialize ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:47886: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:47889: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:47892: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:47895: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_func_XtAppInitialize=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_XtAppInitialize=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:47905: result: $ac_cv_func_XtAppInitialize" >&5
+echo "${ECHO_T}$ac_cv_func_XtAppInitialize" >&6
+if test "$ac_cv_func_XtAppInitialize" = yes; then
+ :
+else
+
+ echo "$as_me:47911: checking for XtAppInitialize in -lXt" >&5
+echo $ECHO_N "checking for XtAppInitialize in -lXt... $ECHO_C" >&6
+if test "${ac_cv_lib_Xt_XtAppInitialize+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lXt $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 47919 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char XtAppInitialize ();
+int
+main (void)
+{
+XtAppInitialize ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:47938: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:47941: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:47944: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:47947: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_lib_Xt_XtAppInitialize=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_Xt_XtAppInitialize=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:47958: result: $ac_cv_lib_Xt_XtAppInitialize" >&5
+echo "${ECHO_T}$ac_cv_lib_Xt_XtAppInitialize" >&6
+if test "$ac_cv_lib_Xt_XtAppInitialize" = yes; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_LIBXT 1
+EOF
+
+ cf_have_X_LIBS=Xt
+ LIBS="-lXt $LIBS"
+fi
+
+fi
+
+fi
+
+if test "$cf_have_X_LIBS" = no ; then
+ { echo "$as_me:47975: WARNING: Unable to successfully link X Toolkit library (-lXt) with
+test program. You will have to check and add the proper libraries by hand
+to makefile." >&5
+echo "$as_me: WARNING: Unable to successfully link X Toolkit library (-lXt) with
+test program. You will have to check and add the proper libraries by hand
+to makefile." >&2;}
+fi
+
+cf_x_athena_root=$cf_x_athena
+cf_x_athena_inc=""
+
+for cf_path in default \
+ /usr/contrib/X11R6 \
+ /usr/contrib/X11R5 \
+ /usr/lib/X11R5 \
+ /usr/local
+do
+ if test -z "$cf_x_athena_inc" ; then
+
+cf_save_LIBS_CF_X_ATHENA_CPPFLAGS="$LIBS"
+cf_save_CFLAGS_CF_X_ATHENA_CPPFLAGS="$CFLAGS"
+cf_save_CPPFLAGS_CF_X_ATHENA_CPPFLAGS="$CPPFLAGS"
+LIBS="$LIBS ${X_PRE_LIBS} ${X_LIBS} ${X_EXTRA_LIBS}"
+for cf_X_CFLAGS in $X_CFLAGS
+do
+ case "x$cf_X_CFLAGS" in
+ x-[IUD]*)
+ CPPFLAGS="$CPPFLAGS $cf_X_CFLAGS"
+ ;;
+ *)
+ CFLAGS="$CFLAGS $cf_X_CFLAGS"
+ ;;
+ esac
+done
+
+ cf_test=X11/$cf_x_athena_root/SimpleMenu.h
+ if test "$cf_path" != default ; then
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_path/include"
+
+ echo "$as_me:48016: checking for $cf_test in $cf_path" >&5
+echo $ECHO_N "checking for $cf_test in $cf_path... $ECHO_C" >&6
+ else
+ echo "$as_me:48019: checking for $cf_test" >&5
+echo $ECHO_N "checking for $cf_test... $ECHO_C" >&6
+ fi
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 48023 "configure"
+#include "confdefs.h"
+
+#include <X11/Intrinsic.h>
+#include <$cf_test>
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:48037: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:48040: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:48043: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:48046: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_result=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_result=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ echo "$as_me:48055: result: $cf_result" >&5
+echo "${ECHO_T}$cf_result" >&6
+
+LIBS="$cf_save_LIBS_CF_X_ATHENA_CPPFLAGS"
+CFLAGS="$cf_save_CFLAGS_CF_X_ATHENA_CPPFLAGS"
+CPPFLAGS="$cf_save_CPPFLAGS_CF_X_ATHENA_CPPFLAGS"
+
+ if test "$cf_result" = yes ; then
+ test "$cf_path" = default && cf_x_athena_inc=default
+ test "$cf_path" != default && cf_x_athena_inc="$cf_path/include"
+ break
+ fi
+ fi
+done
+
+if test -z "$cf_x_athena_inc" ; then
+ { echo "$as_me:48071: WARNING: Unable to find Athena header files" >&5
+echo "$as_me: WARNING: Unable to find Athena header files" >&2;}
+elif test "$cf_x_athena_inc" != default ; then
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-I$cf_x_athena_inc"
+
+fi
+
+cf_x_athena_root=$cf_x_athena
+cf_x_athena_lib=""
+
+for cf_path in default \
+ /usr/contrib/X11R6 \
+ /usr/contrib/X11R5 \
+ /usr/lib/X11R5 \
+ /usr/local
+do
+ for cf_lib in \
+ ${cf_x_athena_root} \
+ ${cf_x_athena_root}7 \
+ ${cf_x_athena_root}6
+ do
+ for cf_libs in \
+ "-l$cf_lib -lXmu" \
+ "-l$cf_lib -lXpm -lXmu" \
+ "-l${cf_lib}_s -lXmu_s"
+ do
+ test -n "$cf_x_athena_lib" && break
+
+cf_save_LIBS_CF_X_ATHENA_LIBS="$LIBS"
+cf_save_CFLAGS_CF_X_ATHENA_LIBS="$CFLAGS"
+cf_save_CPPFLAGS_CF_X_ATHENA_LIBS="$CPPFLAGS"
+LIBS="$LIBS ${X_PRE_LIBS} ${X_LIBS} ${X_EXTRA_LIBS}"
+for cf_X_CFLAGS in $X_CFLAGS
+do
+ case "x$cf_X_CFLAGS" in
+ x-[IUD]*)
+ CPPFLAGS="$CPPFLAGS $cf_X_CFLAGS"
+ ;;
+ *)
+ CFLAGS="$CFLAGS $cf_X_CFLAGS"
+ ;;
+ esac
+done
+
+ cf_test=XawSimpleMenuAddGlobalActions
+ test "$cf_path" != default && cf_libs="-L$cf_path/lib $cf_libs"
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+ echo "$as_me:48136: checking for $cf_test in $cf_libs" >&5
+echo $ECHO_N "checking for $cf_test in $cf_libs... $ECHO_C" >&6
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 48139 "configure"
+#include "confdefs.h"
+
+#include <X11/Intrinsic.h>
+#include <X11/$cf_x_athena_root/SimpleMenu.h>
+
+int
+main (void)
+{
+
+$cf_test((XtAppContext) 0)
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:48155: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:48158: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:48161: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:48164: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_result=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_result=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+ echo "$as_me:48173: result: $cf_result" >&5
+echo "${ECHO_T}$cf_result" >&6
+
+LIBS="$cf_save_LIBS_CF_X_ATHENA_LIBS"
+CFLAGS="$cf_save_CFLAGS_CF_X_ATHENA_LIBS"
+CPPFLAGS="$cf_save_CPPFLAGS_CF_X_ATHENA_LIBS"
+
+ if test "$cf_result" = yes ; then
+ cf_x_athena_lib="$cf_libs"
+ break
+ fi
+ done # cf_libs
+ test -n "$cf_x_athena_lib" && break
+ done # cf_lib
+done
+
+if test -z "$cf_x_athena_lib" ; then
+ { { echo "$as_me:48190: error: Unable to successfully link Athena library (-l$cf_x_athena_root) with test program" >&5
+echo "$as_me: error: Unable to successfully link Athena library (-l$cf_x_athena_root) with test program" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_x_athena_lib; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+cf_x_athena_LIBS=`echo "HAVE_LIB_$cf_x_athena" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+cat >>confdefs.h <<EOF
+#define $cf_x_athena_LIBS 1
+EOF
+
+fi
+
+if test -n "$ac_tool_prefix"; then
+ for ac_prog in xcurses-config
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:48224: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_XCURSES_CONFIG+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$XCURSES_CONFIG"; then
+ ac_cv_prog_XCURSES_CONFIG="$XCURSES_CONFIG" # Let the user override the test.
+else
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_XCURSES_CONFIG="$ac_tool_prefix$ac_prog"
+echo "$as_me:48239: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+XCURSES_CONFIG=$ac_cv_prog_XCURSES_CONFIG
+if test -n "$XCURSES_CONFIG"; then
+ echo "$as_me:48247: result: $XCURSES_CONFIG" >&5
+echo "${ECHO_T}$XCURSES_CONFIG" >&6
+else
+ echo "$as_me:48250: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$XCURSES_CONFIG" && break
+ done
+fi
+if test -z "$XCURSES_CONFIG"; then
+ ac_ct_XCURSES_CONFIG=$XCURSES_CONFIG
+ for ac_prog in xcurses-config
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:48263: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_XCURSES_CONFIG+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_XCURSES_CONFIG"; then
+ ac_cv_prog_ac_ct_XCURSES_CONFIG="$ac_ct_XCURSES_CONFIG" # Let the user override the test.
+else
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_ac_ct_XCURSES_CONFIG="$ac_prog"
+echo "$as_me:48278: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+ac_ct_XCURSES_CONFIG=$ac_cv_prog_ac_ct_XCURSES_CONFIG
+if test -n "$ac_ct_XCURSES_CONFIG"; then
+ echo "$as_me:48286: result: $ac_ct_XCURSES_CONFIG" >&5
+echo "${ECHO_T}$ac_ct_XCURSES_CONFIG" >&6
+else
+ echo "$as_me:48289: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$ac_ct_XCURSES_CONFIG" && break
+done
+test -n "$ac_ct_XCURSES_CONFIG" || ac_ct_XCURSES_CONFIG="none"
+
+ XCURSES_CONFIG=$ac_ct_XCURSES_CONFIG
+fi
+
+if test "$XCURSES_CONFIG" != none ; then
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in `$XCURSES_CONFIG --cflags`
+do
+case "$cf_fix_cppflags" in
+(no)
+ case "$cf_add_cflags" in
+ (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=yes
+
+ if test "$cf_fix_cppflags" = yes ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ elif test "${cf_tst_cflags}" = "\"'" ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ fi
+ ;;
+ esac
+ case "$CPPFLAGS" in
+ (*$cf_add_cflags)
+ ;;
+ (*)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+ sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \
+ -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'`
+
+ ;;
+ esac
+
+ test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+ cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+ (*)
+
+ test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+ cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+(yes)
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=no
+ ;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+ test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+ CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+ test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+ EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in `$XCURSES_CONFIG --libs`; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+cf_cv_lib_XCurses=yes
+
+else
+
+LDFLAGS="$LDFLAGS $X_LIBS"
+
+test -n "$verbose" && echo " checking additions to CFLAGS" 1>&6
+
+echo "${as_me:-configure}:48424: testing checking additions to CFLAGS ..." 1>&5
+
+cf_check_cflags="$CFLAGS"
+cf_check_cppflags="$CPPFLAGS"
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $X_CFLAGS
+do
+case "$cf_fix_cppflags" in
+(no)
+ case "$cf_add_cflags" in
+ (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=yes
+
+ if test "$cf_fix_cppflags" = yes ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ elif test "${cf_tst_cflags}" = "\"'" ; then
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ continue
+ fi
+ ;;
+ esac
+ case "$CPPFLAGS" in
+ (*$cf_add_cflags)
+ ;;
+ (*)
+ case "$cf_add_cflags" in
+ (-D*)
+ cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+ sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \
+ -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'`
+
+ ;;
+ esac
+
+ test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+ cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+ (*)
+
+ test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+ cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+ ;;
+ esac
+ ;;
+(yes)
+
+ test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+ cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+ cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+ test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+ && test -z "${cf_tst_cflags}" \
+ && cf_fix_cppflags=no
+ ;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+ test -n "$verbose" && echo " add to \$CFLAGS $cf_new_cflags" 1>&6
+
+echo "${as_me:-configure}:48509: testing add to \$CFLAGS $cf_new_cflags ..." 1>&5
+
+ test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+ CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+ test -n "$verbose" && echo " add to \$CPPFLAGS $cf_new_cppflags" 1>&6
+
+echo "${as_me:-configure}:48519: testing add to \$CPPFLAGS $cf_new_cppflags ..." 1>&5
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+ test -n "$verbose" && echo " add to \$EXTRA_CPPFLAGS $cf_new_extra_cppflags" 1>&6
+
+echo "${as_me:-configure}:48529: testing add to \$EXTRA_CPPFLAGS $cf_new_extra_cppflags ..." 1>&5
+
+ test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+ EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+if test "x$cf_check_cflags" != "x$CFLAGS" ; then
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 48538 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello world");
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:48550: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:48553: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:48556: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:48559: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+test -n "$verbose" && echo " test-compile failed. Undoing change to \$CFLAGS" 1>&6
+
+echo "${as_me:-configure}:48567: testing test-compile failed. Undoing change to \$CFLAGS ..." 1>&5
+
+ if test "x$cf_check_cppflags" != "x$CPPFLAGS" ; then
+ test -n "$verbose" && echo " but keeping change to \$CPPFLAGS" 1>&6
+
+echo "${as_me:-configure}:48572: testing but keeping change to \$CPPFLAGS ..." 1>&5
+
+ fi
+ CFLAGS="$cf_check_cflags"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+
+echo "$as_me:48580: checking for XOpenDisplay in -lX11" >&5
+echo $ECHO_N "checking for XOpenDisplay in -lX11... $ECHO_C" >&6
+if test "${ac_cv_lib_X11_XOpenDisplay+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lX11 $X_PRE_LIBS $LIBS $X_EXTRA_LIBS $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 48588 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char XOpenDisplay ();
+int
+main (void)
+{
+XOpenDisplay ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:48607: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:48610: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:48613: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:48616: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ ac_cv_lib_X11_XOpenDisplay=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_X11_XOpenDisplay=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:48627: result: $ac_cv_lib_X11_XOpenDisplay" >&5
+echo "${ECHO_T}$ac_cv_lib_X11_XOpenDisplay" >&6
+if test "$ac_cv_lib_X11_XOpenDisplay" = yes; then
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lX11; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+fi
+
+echo "$as_me:48649: checking for XCurses library" >&5
+echo $ECHO_N "checking for XCurses library... $ECHO_C" >&6
+if test "${cf_cv_lib_XCurses+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lXCurses; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+ for cf_add_2lib in $cf_add_libs; do
+ if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+ cf_add_1lib=
+ break
+ fi
+ done
+ test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 48672 "configure"
+#include "confdefs.h"
+
+#include <xcurses.h>
+char *XCursesProgramName = "test";
+
+int
+main (void)
+{
+XCursesExit();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:48687: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:48690: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:48693: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:48696: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_lib_XCurses=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_lib_XCurses=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:48707: result: $cf_cv_lib_XCurses" >&5
+echo "${ECHO_T}$cf_cv_lib_XCurses" >&6
+
+fi
+
+if test "$cf_cv_lib_XCurses" = yes ; then
+
+cat >>confdefs.h <<\EOF
+#define UNIX 1
+EOF
+
+cat >>confdefs.h <<\EOF
+#define XCURSES 1
+EOF
+
+ echo "$as_me:48722: checking for xcurses.h" >&5
+echo $ECHO_N "checking for xcurses.h... $ECHO_C" >&6
+if test "${ac_cv_header_xcurses_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 48728 "configure"
+#include "confdefs.h"
+#include <xcurses.h>
+_ACEOF
+if { (eval echo "$as_me:48732: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+ (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ $EGREP -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:48738: \$? = $ac_status" >&5
+ (exit "$ac_status"); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_cv_header_xcurses_h=yes
+else
+ echo "$as_me: failed program was:" >&5
+ cat "conftest.$ac_ext" >&5
+ ac_cv_header_xcurses_h=no
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi
+echo "$as_me:48757: result: $ac_cv_header_xcurses_h" >&5
+echo "${ECHO_T}$ac_cv_header_xcurses_h" >&6
+if test "$ac_cv_header_xcurses_h" = yes; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_XCURSES 1
+EOF
+
+fi
+
+else
+ { { echo "$as_me:48768: error: Cannot link with XCurses" >&5
+echo "$as_me: error: Cannot link with XCurses" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+ ;;
+ esac
+else
+
+echo "$as_me:48777: checking if we can include termio.h with curses" >&5
+echo $ECHO_N "checking if we can include termio.h with curses... $ECHO_C" >&6
+if test "${cf_cv_termio_and_curses+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cf_save_CFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS -DHAVE_CONFIG_H -I. -I${srcdir:-.} -I${srcdir:-.}/src -I${srcdir:-.}/WWW/Library/Implementation"
+ touch lynx_cfg.h
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 48787 "configure"
+#include "confdefs.h"
+
+#include <LYCurses.h>
+#include <termio.h>
+int
+main (void)
+{
+putchar(0x0a)
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:48801: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:48804: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:48807: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:48810: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_termio_and_curses=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_termio_and_curses=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ CPPFLAGS="$cf_save_CFLAGS"
+ rm -f lynx_cfg.h
+
+fi
+echo "$as_me:48823: result: $cf_cv_termio_and_curses" >&5
+echo "${ECHO_T}$cf_cv_termio_and_curses" >&6
+
+test "$cf_cv_termio_and_curses" = yes &&
+cat >>confdefs.h <<\EOF
+#define TERMIO_AND_CURSES 1
+EOF
+
+fi
+
+### These tests must be run after establishing the curses library.
+if test "$cf_cv_screen" != slang ; then
+ if test "$cf_cv_screen" != pdcurses ; then
+
+for ac_header in $cf_cv_screen/term.h term.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:48840: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 48846 "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:48850: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+ (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ $EGREP -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:48856: \$? = $ac_status" >&5
+ (exit "$ac_status"); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ eval "$as_ac_Header=yes"
+else
+ echo "$as_me: failed program was:" >&5
+ cat "conftest.$ac_ext" >&5
+ eval "$as_ac_Header=no"
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi
+echo "$as_me:48875: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
+if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
+ cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+ fi
+
+echo "$as_me:48887: checking if curses supports alternate-character set" >&5
+echo $ECHO_N "checking if curses supports alternate-character set... $ECHO_C" >&6
+if test "${cf_cv_alt_char_set+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+for mapname in acs_map _acs_map
+do
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 48896 "configure"
+#include "confdefs.h"
+
+#include <${cf_cv_ncurses_header:-curses.h}>
+
+int
+main (void)
+{
+chtype x = ${mapname}['l']; ${mapname}['m'] = 0; (void)x
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:48910: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:48913: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:48916: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:48919: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_alt_char_set=$mapname
+ break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_alt_char_set=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+done
+
+fi
+
+echo "$as_me:48933: result: $cf_cv_alt_char_set" >&5
+echo "${ECHO_T}$cf_cv_alt_char_set" >&6
+test "$cf_cv_alt_char_set" != no &&
+cat >>confdefs.h <<EOF
+#define ALT_CHAR_SET $cf_cv_alt_char_set
+EOF
+
+echo "$as_me:48940: checking if curses supports fancy attributes" >&5
+echo $ECHO_N "checking if curses supports fancy attributes... $ECHO_C" >&6
+if test "${cf_cv_fancy_curses+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 48947 "configure"
+#include "confdefs.h"
+
+#include <${cf_cv_ncurses_header:-curses.h}>
+
+int
+main (void)
+{
+attrset(A_UNDERLINE|A_BOLD|A_REVERSE);
+ wattrset(stdscr, A_BLINK|A_DIM);
+ attroff(A_BOLD);
+ keypad(stdscr,TRUE);
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:48965: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:48968: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:48971: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:48974: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_fancy_curses=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_fancy_curses=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+
+echo "$as_me:48986: result: $cf_cv_fancy_curses" >&5
+echo "${ECHO_T}$cf_cv_fancy_curses" >&6
+test "$cf_cv_fancy_curses" = yes &&
+cat >>confdefs.h <<\EOF
+#define FANCY_CURSES 1
+EOF
+
+echo "$as_me:48993: checking for function curses_version" >&5
+echo $ECHO_N "checking for function curses_version... $ECHO_C" >&6
+if test "${cf_cv_func_curses_version+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+if test "$cross_compiling" = yes; then
+ cf_cv_func_curses_version=unknown
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 49003 "configure"
+#include "confdefs.h"
+
+$ac_includes_default
+
+#include <${cf_cv_ncurses_header:-curses.h}>
+
+int main(void)
+{
+ char temp[1024];
+ sprintf(temp, "%.999s\\n", curses_version());
+ ${cf_cv_main_return:-return}(0);
+}
+
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:49019: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:49022: \$? = $ac_status" >&5
+ (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+ { (eval echo "$as_me:49024: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:49027: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_func_curses_version=yes
+
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_func_curses_version=no
+
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+rm -f core
+fi
+echo "$as_me:49042: result: $cf_cv_func_curses_version" >&5
+echo "${ECHO_T}$cf_cv_func_curses_version" >&6
+test "$cf_cv_func_curses_version" = yes &&
+cat >>confdefs.h <<\EOF
+#define HAVE_CURSES_VERSION 1
+EOF
+
+if test "$cf_cv_ncurses_version" != no ; then
+echo "$as_me:49050: checking for obsolete/broken version of ncurses" >&5
+echo $ECHO_N "checking for obsolete/broken version of ncurses... $ECHO_C" >&6
+if test "${cf_cv_ncurses_broken+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 49057 "configure"
+#include "confdefs.h"
+
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+
+#if defined(NCURSES_VERSION) && defined(wgetbkgd)
+ make an error
+#else
+ int x = 1
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:49076: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:49079: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:49082: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:49085: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_ncurses_broken=no
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_ncurses_broken=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+
+echo "$as_me:49097: result: $cf_cv_ncurses_broken" >&5
+echo "${ECHO_T}$cf_cv_ncurses_broken" >&6
+if test "$cf_cv_ncurses_broken" = yes ; then
+ { echo "$as_me:49100: WARNING: hmm... you should get an up-to-date version of ncurses" >&5
+echo "$as_me: WARNING: hmm... you should get an up-to-date version of ncurses" >&2;}
+
+cat >>confdefs.h <<\EOF
+#define NCURSES_BROKEN 1
+EOF
+
+fi
+fi
+
+echo "$as_me:49110: checking if curses supports color attributes" >&5
+echo $ECHO_N "checking if curses supports color attributes... $ECHO_C" >&6
+if test "${cf_cv_color_curses+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 49117 "configure"
+#include "confdefs.h"
+
+#include <${cf_cv_ncurses_header:-curses.h}>
+
+int
+main (void)
+{
+chtype x = COLOR_BLUE;
+ has_colors();
+ start_color();
+#ifndef NCURSES_BROKEN
+ wbkgd(curscr, getbkgd(stdscr)); /* X/Open XPG4 aka SVr4 Curses */
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:49137: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:49140: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:49143: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:49146: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_color_curses=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_color_curses=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+
+echo "$as_me:49158: result: $cf_cv_color_curses" >&5
+echo "${ECHO_T}$cf_cv_color_curses" >&6
+if test "$cf_cv_color_curses" = yes ; then
+
+cat >>confdefs.h <<\EOF
+#define COLOR_CURSES 1
+EOF
+
+ test ".$cf_cv_ncurses_broken" != .yes &&
+cat >>confdefs.h <<\EOF
+#define HAVE_GETBKGD 1
+EOF
+
+fi
+
+for ac_header in \
+termio.h \
+termios.h \
+unistd.h \
+sys/ioctl.h \
+sys/termio.h \
+
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:49182: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 49188 "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:49192: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+ (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ $EGREP -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:49198: \$? = $ac_status" >&5
+ (exit "$ac_status"); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ eval "$as_ac_Header=yes"
+else
+ echo "$as_me: failed program was:" >&5
+ cat "conftest.$ac_ext" >&5
+ eval "$as_ac_Header=no"
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi
+echo "$as_me:49217: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
+if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
+ cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+if test "$ac_cv_header_termios_h" = yes ; then
+ case "$CFLAGS $CPPFLAGS" in
+ (*-D_POSIX_SOURCE*)
+ termios_bad=dunno ;;
+ (*) termios_bad=maybe ;;
+ esac
+ if test "$termios_bad" = maybe ; then
+ echo "$as_me:49234: checking whether termios.h needs _POSIX_SOURCE" >&5
+echo $ECHO_N "checking whether termios.h needs _POSIX_SOURCE... $ECHO_C" >&6
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 49237 "configure"
+#include "confdefs.h"
+#include <termios.h>
+int
+main (void)
+{
+struct termios foo; int x = foo.c_iflag = 1; (void)x
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:49249: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:49252: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:49255: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:49258: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ termios_bad=no
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 49266 "configure"
+#include "confdefs.h"
+
+#define _POSIX_SOURCE
+#include <termios.h>
+int
+main (void)
+{
+struct termios foo; int x = foo.c_iflag = 2; (void)x
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:49280: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:49283: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:49286: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:49289: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ termios_bad=unknown
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+termios_bad=yes
+cat >>confdefs.h <<\EOF
+#define _POSIX_SOURCE 1
+EOF
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ echo "$as_me:49305: result: $termios_bad" >&5
+echo "${ECHO_T}$termios_bad" >&6
+ fi
+fi
+
+echo "$as_me:49310: checking declaration of size-change" >&5
+echo $ECHO_N "checking declaration of size-change... $ECHO_C" >&6
+if test "${cf_cv_sizechange+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cf_cv_sizechange=unknown
+ cf_save_CPPFLAGS="$CPPFLAGS"
+
+for cf_opts in "" "NEED_PTEM_H"
+do
+
+ CPPFLAGS="$cf_save_CPPFLAGS"
+ if test -n "$cf_opts"
+ then
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-D$cf_opts"
+
+ fi
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 49331 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#ifdef HAVE_TERMIOS_H
+#include <termios.h>
+#else
+#ifdef HAVE_TERMIO_H
+#include <termio.h>
+#endif
+#endif
+
+#ifdef NEED_PTEM_H
+/* This is a workaround for SCO: they neglected to define struct winsize in
+ * termios.h -- it is only in termio.h and ptem.h
+ */
+#include <sys/stream.h>
+#include <sys/ptem.h>
+#endif
+
+#ifdef HAVE_SYS_IOCTL_H
+#include <sys/ioctl.h>
+#endif
+
+int
+main (void)
+{
+
+#ifdef TIOCGSIZE
+ struct ttysize win; /* SunOS 3.0... */
+ int y = win.ts_lines = 2;
+ int x = win.ts_cols = 1;
+ (void)y;
+ (void)x;
+#else
+#ifdef TIOCGWINSZ
+ struct winsize win; /* everything else */
+ int y = win.ws_row = 2;
+ int x = win.ws_col = 1;
+ (void)y;
+ (void)x;
+#else
+ no TIOCGSIZE or TIOCGWINSZ
+#endif /* TIOCGWINSZ */
+#endif /* TIOCGSIZE */
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:49381: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:49384: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:49387: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:49390: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_sizechange=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_sizechange=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+ CPPFLAGS="$cf_save_CPPFLAGS"
+ if test "$cf_cv_sizechange" = yes ; then
+ echo "size-change succeeded ($cf_opts)" >&5
+ test -n "$cf_opts" && cf_cv_sizechange="$cf_opts"
+ break
+ fi
+done
+
+fi
+echo "$as_me:49409: result: $cf_cv_sizechange" >&5
+echo "${ECHO_T}$cf_cv_sizechange" >&6
+if test "$cf_cv_sizechange" != no ; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_SIZECHANGE 1
+EOF
+
+ case "$cf_cv_sizechange" in
+ (NEED*)
+ cat >>confdefs.h <<EOF
+#define $cf_cv_sizechange 1
+EOF
+
+ ;;
+ esac
+fi
+
+echo "$as_me:49427: checking if ttytype is declared in curses library" >&5
+echo $ECHO_N "checking if ttytype is declared in curses library... $ECHO_C" >&6
+if test "${cf_cv_have_ttytype+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 49434 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+char *x = &ttytype[1]; *x = 1
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:49446: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:49449: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:49452: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:49455: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_have_ttytype=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_have_ttytype=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+
+echo "$as_me:49467: result: $cf_cv_have_ttytype" >&5
+echo "${ECHO_T}$cf_cv_have_ttytype" >&6
+test "$cf_cv_have_ttytype" = yes &&
+cat >>confdefs.h <<\EOF
+#define HAVE_TTYTYPE 1
+EOF
+
+ if test "$use_wide_curses" = yes ; then
+
+echo "$as_me:49476: checking if curses supports wide characters" >&5
+echo $ECHO_N "checking if curses supports wide characters... $ECHO_C" >&6
+if test "${cf_cv_widec_curses+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 49483 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+
+ wchar_t temp[2];
+ wchar_t wch = 'A';
+ temp[0] = wch;
+ waddnwstr(stdscr, temp, 1);
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:49502: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:49505: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:49508: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:49511: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_widec_curses=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_widec_curses=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:49522: result: $cf_cv_widec_curses" >&5
+echo "${ECHO_T}$cf_cv_widec_curses" >&6
+
+if test "$cf_cv_widec_curses" = yes ; then
+
+cat >>confdefs.h <<\EOF
+#define WIDEC_CURSES 1
+EOF
+
+ # This is needed on Tru64 5.0 to declare mbstate_t
+ echo "$as_me:49532: checking if we must include wchar.h to declare mbstate_t" >&5
+echo $ECHO_N "checking if we must include wchar.h to declare mbstate_t... $ECHO_C" >&6
+if test "${cf_cv_widec_mbstate+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 49539 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+mbstate_t state; (void)state
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:49553: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:49556: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:49559: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:49562: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_widec_mbstate=no
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 49569 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <wchar.h>
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+mbstate_t state; (void)state
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:49584: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:49587: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:49590: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:49593: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_widec_mbstate=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_widec_mbstate=unknown
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:49605: result: $cf_cv_widec_mbstate" >&5
+echo "${ECHO_T}$cf_cv_widec_mbstate" >&6
+
+if test "$cf_cv_widec_mbstate" = yes ; then
+
+cat >>confdefs.h <<\EOF
+#define NEED_WCHAR_H 1
+EOF
+
+fi
+
+if test "$cf_cv_widec_mbstate" != unknown ; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_MBSTATE_T 1
+EOF
+
+fi
+
+fi
+
+ fi
+
+echo "$as_me:49628: checking definition to turn on extended curses functions" >&5
+echo $ECHO_N "checking definition to turn on extended curses functions... $ECHO_C" >&6
+if test "${cf_cv_need_xopen_extension+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cf_cv_need_xopen_extension=unknown
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 49636 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+
+#if defined(NCURSES_VERSION_PATCH)
+#if (NCURSES_VERSION_PATCH < 20100501) && (NCURSES_VERSION_PATCH >= 20100403)
+ make an error
+#endif
+#endif
+#ifdef NCURSES_WIDECHAR
+make an error /* prefer to fall-through on the second checks */
+#endif
+ cchar_t check;
+ int check2 = curs_set((int)sizeof(check));
+ long x = winnstr(stdscr, "", 0);
+ int x1, y1;
+ (void)check2;
+ getbegyx(stdscr, y1, x1);
+ (void)x;
+ (void)y1;
+ (void)x1;
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:49668: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:49671: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:49674: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:49677: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_need_xopen_extension=none
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+ for cf_try_xopen_extension in _XOPEN_SOURCE_EXTENDED NCURSES_WIDECHAR
+ do
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 49687 "configure"
+#include "confdefs.h"
+
+#define $cf_try_xopen_extension 1
+#include <stdlib.h>
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+
+ cchar_t check;
+ int check2 = curs_set((int)sizeof(check));
+ long x = winnstr(stdscr, "", 0);
+ int x1, y1;
+ getbegyx(stdscr, y1, x1);
+ (void)check2;
+ (void)x;
+ (void)y1;
+ (void)x1;
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:49712: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:49715: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:49718: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:49721: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_need_xopen_extension=$cf_try_xopen_extension; break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+ done
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:49735: result: $cf_cv_need_xopen_extension" >&5
+echo "${ECHO_T}$cf_cv_need_xopen_extension" >&6
+
+case "$cf_cv_need_xopen_extension" in
+(*_*)
+
+ test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+ CPPFLAGS="${CPPFLAGS}-D$cf_cv_need_xopen_extension"
+
+ ;;
+esac
+
+echo "$as_me:49747: checking for term.h" >&5
+echo $ECHO_N "checking for term.h... $ECHO_C" >&6
+if test "${cf_cv_term_header+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+# If we found <ncurses/curses.h>, look for <ncurses/term.h>, but always look
+# for <term.h> if we do not find the variant.
+
+cf_header_list="term.h ncurses/term.h ncursesw/term.h"
+
+case "${cf_cv_ncurses_header:-curses.h}" in
+(*/*)
+ cf_header_item=`echo "${cf_cv_ncurses_header:-curses.h}" | sed -e 's%\..*%%' -e 's%/.*%/%'`term.h
+ cf_header_list="$cf_header_item $cf_header_list"
+ ;;
+esac
+
+for cf_header in $cf_header_list
+do
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 49768 "configure"
+#include "confdefs.h"
+
+#include <${cf_cv_ncurses_header:-curses.h}>
+#include <${cf_header}>
+int
+main (void)
+{
+WINDOW *x; (void)x
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:49782: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:49785: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:49788: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:49791: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_term_header=$cf_header
+ break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_term_header=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+done
+
+case "$cf_cv_term_header" in
+(no)
+ # If curses is ncurses, some packagers still mess it up by trying to make
+ # us use GNU termcap. This handles the most common case.
+ for cf_header in ncurses/term.h ncursesw/term.h
+ do
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 49810 "configure"
+#include "confdefs.h"
+
+#include <${cf_cv_ncurses_header:-curses.h}>
+#ifdef NCURSES_VERSION
+#include <${cf_header}>
+#else
+make an error
+#endif
+int
+main (void)
+{
+WINDOW *x; (void)x
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:49828: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:49831: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:49834: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:49837: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_term_header=$cf_header
+ break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_term_header=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ done
+ ;;
+esac
+
+fi
+echo "$as_me:49852: result: $cf_cv_term_header" >&5
+echo "${ECHO_T}$cf_cv_term_header" >&6
+
+case "$cf_cv_term_header" in
+(term.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_TERM_H 1
+EOF
+
+ ;;
+(ncurses/term.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSES_TERM_H 1
+EOF
+
+ ;;
+(ncursesw/term.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSESW_TERM_H 1
+EOF
+
+ ;;
+esac
+
+echo "$as_me:49879: checking for unctrl.h" >&5
+echo $ECHO_N "checking for unctrl.h... $ECHO_C" >&6
+if test "${cf_cv_unctrl_header+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+# If we found <ncurses/curses.h>, look for <ncurses/unctrl.h>, but always look
+# for <unctrl.h> if we do not find the variant.
+
+cf_header_list="unctrl.h ncurses/unctrl.h ncursesw/unctrl.h"
+
+case "${cf_cv_ncurses_header:-curses.h}" in
+(*/*)
+ cf_header_item=`echo "${cf_cv_ncurses_header:-curses.h}" | sed -e 's%\..*%%' -e 's%/.*%/%'`unctrl.h
+ cf_header_list="$cf_header_item $cf_header_list"
+ ;;
+esac
+
+for cf_header in $cf_header_list
+do
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 49900 "configure"
+#include "confdefs.h"
+
+#include <${cf_cv_ncurses_header:-curses.h}>
+#include <${cf_header}>
+int
+main (void)
+{
+WINDOW *x; (void)x
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:49914: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:49917: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest.$ac_objext"'
+ { (eval echo "$as_me:49920: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:49923: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_cv_unctrl_header=$cf_header
+ break
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_unctrl_header=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+done
+
+fi
+echo "$as_me:49936: result: $cf_cv_unctrl_header" >&5
+echo "${ECHO_T}$cf_cv_unctrl_header" >&6
+
+case "$cf_cv_unctrl_header" in
+(no)
+ { echo "$as_me:49941: WARNING: unctrl.h header not found" >&5
+echo "$as_me: WARNING: unctrl.h header not found" >&2;}
+ ;;
+esac
+
+case "$cf_cv_unctrl_header" in
+(unctrl.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_UNCTRL_H 1
+EOF
+
+ ;;
+(ncurses/unctrl.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSES_UNCTRL_H 1
+EOF
+
+ ;;
+(ncursesw/unctrl.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSESW_UNCTRL_H 1
+EOF
+
+ ;;
+esac
+
+for cf_func in \
+ assume_default_colors \
+ cbreak \
+ define_key \
+ delscreen \
+ getattrs \
+ getbegx \
+ getbegy \
+ keypad \
+ napms \
+ newpad \
+ newterm \
+ pnoutrefresh \
+ resizeterm \
+ touchline \
+ touchwin \
+ use_default_colors \
+ use_legacy_coding \
+ wattr_get \
+ wborder \
+ wredrawln \
+ wresize \
+
+do
+
+cf_tr_func=`echo "$cf_func" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+ echo "$as_me:49997: checking for ${cf_func}" >&5
+echo $ECHO_N "checking for ${cf_func}... $ECHO_C" >&6
+
+echo "${as_me:-configure}:50000: testing ${cf_func} ..." 1>&5
+
+ if eval "test \"\${cf_cv_func_$cf_func+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ eval cf_result='$ac_cv_func_'$cf_func
+ if test ".$cf_result" != ".no"; then
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 50009 "configure"
+#include "confdefs.h"
+
+#ifdef HAVE_XCURSES
+#include <xcurses.h>
+char * XCursesProgramName = "test";
+#else
+#include <${cf_cv_ncurses_header:-curses.h}>
+#if defined(NCURSES_VERSION) && defined(HAVE_NCURSESW_TERM_H)
+#include <ncursesw/term.h>
+#elif defined(NCURSES_VERSION) && defined(HAVE_NCURSES_TERM_H)
+#include <ncurses/term.h>
+#elif defined(HAVE_TERM_H)
+#include <term.h>
+#endif
+#endif
+
+int
+main (void)
+{
+
+#ifndef ${cf_func}
+long foo = (long)(&${cf_func});
+fprintf(stderr, "testing linkage of $cf_func:%p\\n", (void *)foo);
+if (foo + 1234L > 5678L)
+ ${cf_cv_main_return:-return}(foo != 0);
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:50042: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:50045: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:50048: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:50051: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_result=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_result=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+ fi
+ eval 'cf_cv_func_'$cf_func'="$cf_result"'
+
+fi
+
+ # use the computed/retrieved cache-value:
+ eval 'cf_result=$cf_cv_func_'$cf_func
+ echo "$as_me:50067: result: $cf_result" >&5
+echo "${ECHO_T}$cf_result" >&6
+ if test "$cf_result" != no; then
+ cat >>confdefs.h <<EOF
+#define HAVE_${cf_tr_func} 1
+EOF
+
+ fi
+done
+
+for ac_func in \
+ curses_exit \
+ _nc_free_and_exit \
+ _nc_freeall \
+
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:50084: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >"conftest.$ac_ext" <<_ACEOF
+#line 50090 "configure"
+#include "confdefs.h"
+#define $ac_func autoconf_temporary
+#include <limits.h> /* least-intrusive standard header which defines gcc2 __stub macros */
+#undef $ac_func
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+#error found stub for $ac_func
+#endif
+
+ return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:50121: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:50124: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:50127: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:50130: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+eval "$as_ac_var=no"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:50140: result: `eval echo '${'"$as_ac_var"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_var"'}'`" >&6
+if test "`eval echo '${'"$as_ac_var"'}'`" = yes; then
+ cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+fi
+
+if test "$use_color_style" != no ; then
+ if test .$cf_cv_color_curses != .yes ; then
+ { { echo "$as_me:50154: error: Configuration does not support color-styles" >&5
+echo "$as_me: error: Configuration does not support color-styles" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+ if test "$cf_cv_screen" = slang ; then
+ { { echo "$as_me:50159: error: Configuration does not support color-styles" >&5
+echo "$as_me: error: Configuration does not support color-styles" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+fi
+
+if test "$use_scrollbar" != no ; then
+ if test .$cf_cv_fancy_curses != .yes ; then
+ { echo "$as_me:50167: WARNING: Configuration does not support ACS_xxx definitions" >&5
+echo "$as_me: WARNING: Configuration does not support ACS_xxx definitions" >&2;}
+ else
+
+cat >>confdefs.h <<\EOF
+#define USE_SCROLLBAR 1
+EOF
+
+ fi
+fi
+
+# use rpath for libraries in unusual places
+
+echo "$as_me:50180: checking if rpath-hack should be disabled" >&5
+echo $ECHO_N "checking if rpath-hack should be disabled... $ECHO_C" >&6
+
+# Check whether --enable-rpath-hack or --disable-rpath-hack was given.
+if test "${enable_rpath_hack+set}" = set; then
+ enableval="$enable_rpath_hack"
+ test "$enableval" != no && enableval=yes
+ if test "$enableval" != "yes" ; then
+ enable_rpath_hack=no
+ else
+ enable_rpath_hack=yes
+ fi
+else
+ enableval=yes
+ enable_rpath_hack=yes
+
+fi;
+if test "x$enable_rpath_hack" = xno; then cf_disable_rpath_hack=yes; else cf_disable_rpath_hack=no; fi
+echo "$as_me:50198: result: $cf_disable_rpath_hack" >&5
+echo "${ECHO_T}$cf_disable_rpath_hack" >&6
+
+if test "$enable_rpath_hack" = yes ; then
+
+echo "$as_me:50203: checking for updated LDFLAGS" >&5
+echo $ECHO_N "checking for updated LDFLAGS... $ECHO_C" >&6
+if test -n "$LD_RPATH_OPT" ; then
+ echo "$as_me:50206: result: maybe" >&5
+echo "${ECHO_T}maybe" >&6
+
+ for ac_prog in ldd
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:50213: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_cf_ldd_prog+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$cf_ldd_prog"; then
+ ac_cv_prog_cf_ldd_prog="$cf_ldd_prog" # Let the user override the test.
+else
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_cf_ldd_prog="$ac_prog"
+echo "$as_me:50228: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+cf_ldd_prog=$ac_cv_prog_cf_ldd_prog
+if test -n "$cf_ldd_prog"; then
+ echo "$as_me:50236: result: $cf_ldd_prog" >&5
+echo "${ECHO_T}$cf_ldd_prog" >&6
+else
+ echo "$as_me:50239: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$cf_ldd_prog" && break
+done
+test -n "$cf_ldd_prog" || cf_ldd_prog="no"
+
+ cf_rpath_list="/usr/lib /lib"
+ if test "$cf_ldd_prog" != no
+ then
+ cf_rpath_oops=
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 50253 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello");
+ ;
+ return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:50265: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:50268: \$? = $ac_status" >&5
+ (exit "$ac_status"); } &&
+ { ac_try='test -s "conftest$ac_exeext"'
+ { (eval echo "$as_me:50271: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:50274: \$? = $ac_status" >&5
+ (exit "$ac_status"); }; }; then
+ cf_rpath_oops=`"$cf_ldd_prog" "conftest$ac_exeext" | ${FGREP-fgrep} ' not found' | sed -e 's% =>.*$%%' |sort | uniq`
+ cf_rpath_list=`"$cf_ldd_prog" "conftest$ac_exeext" | ${FGREP-fgrep} / | sed -e 's%^.*[ ]/%/%' -e 's%/[^/][^/]*$%%' |sort | uniq`
+else
+ echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+ # If we passed the link-test, but get a "not found" on a given library,
+ # this could be due to inept reconfiguration of gcc to make it only
+ # partly honor /usr/local/lib (or whatever). Sometimes this behavior
+ # is intentional, e.g., installing gcc in /usr/bin and suppressing the
+ # /usr/local libraries.
+ if test -n "$cf_rpath_oops"
+ then
+ for cf_rpath_src in $cf_rpath_oops
+ do
+ for cf_rpath_dir in \
+ /usr/local \
+ /usr/pkg \
+ /opt/sfw
+ do
+ if test -f "$cf_rpath_dir/lib/$cf_rpath_src"
+ then
+ test -n "$verbose" && echo " ...adding -L$cf_rpath_dir/lib to LDFLAGS for $cf_rpath_src" 1>&6
+
+echo "${as_me:-configure}:50302: testing ...adding -L$cf_rpath_dir/lib to LDFLAGS for $cf_rpath_src ..." 1>&5
+
+ LDFLAGS="$LDFLAGS -L$cf_rpath_dir/lib"
+ break
+ fi
+ done
+ done
+ fi
+ fi
+
+ test -n "$verbose" && echo " ...checking EXTRA_LDFLAGS $EXTRA_LDFLAGS" 1>&6
+
+echo "${as_me:-configure}:50314: testing ...checking EXTRA_LDFLAGS $EXTRA_LDFLAGS ..." 1>&5
+
+test -n "$verbose" && echo " ...checking LDFLAGS $LDFLAGS" 1>&6
+
+echo "${as_me:-configure}:50318: testing ...checking LDFLAGS $LDFLAGS ..." 1>&5
+
+cf_rpath_dst=
+for cf_rpath_src in $LDFLAGS
+do
+ case "$cf_rpath_src" in
+ (-L*)
+
+ # check if this refers to a directory which we will ignore
+ cf_rpath_skip=no
+ if test -n "$cf_rpath_list"
+ then
+ for cf_rpath_item in $cf_rpath_list
+ do
+ if test "x$cf_rpath_src" = "x-L$cf_rpath_item"
+ then
+ cf_rpath_skip=yes
+ break
+ fi
+ done
+ fi
+
+ if test "$cf_rpath_skip" = no
+ then
+ # transform the option
+ if test "$LD_RPATH_OPT" = "-R " ; then
+ cf_rpath_tmp=`echo "$cf_rpath_src" |sed -e "s%-L%-R %"`
+ else
+ cf_rpath_tmp=`echo "$cf_rpath_src" |sed -e "s%-L%$LD_RPATH_OPT%"`
+ fi
+
+ # if we have not already added this, add it now
+ cf_rpath_tst=`echo "$EXTRA_LDFLAGS" | sed -e "s%$cf_rpath_tmp %%"`
+ if test "x$cf_rpath_tst" = "x$EXTRA_LDFLAGS"
+ then
+ test -n "$verbose" && echo " ...Filter $cf_rpath_src ->$cf_rpath_tmp" 1>&6
+
+echo "${as_me:-configure}:50355: testing ...Filter $cf_rpath_src ->$cf_rpath_tmp ..." 1>&5
+
+ EXTRA_LDFLAGS="$cf_rpath_tmp $EXTRA_LDFLAGS"
+ fi
+ fi
+ ;;
+ esac
+ cf_rpath_dst="$cf_rpath_dst $cf_rpath_src"
+done
+LDFLAGS=$cf_rpath_dst
+
+test -n "$verbose" && echo " ...checked LDFLAGS $LDFLAGS" 1>&6
+
+echo "${as_me:-configure}:50368: testing ...checked LDFLAGS $LDFLAGS ..." 1>&5
+
+test -n "$verbose" && echo " ...checking LIBS $LIBS" 1>&6
+
+echo "${as_me:-configure}:50372: testing ...checking LIBS $LIBS ..." 1>&5
+
+cf_rpath_dst=
+for cf_rpath_src in $LIBS
+do
+ case "$cf_rpath_src" in
+ (-L*)
+
+ # check if this refers to a directory which we will ignore
+ cf_rpath_skip=no
+ if test -n "$cf_rpath_list"
+ then
+ for cf_rpath_item in $cf_rpath_list
+ do
+ if test "x$cf_rpath_src" = "x-L$cf_rpath_item"
+ then
+ cf_rpath_skip=yes
+ break
+ fi
+ done
+ fi
+
+ if test "$cf_rpath_skip" = no
+ then
+ # transform the option
+ if test "$LD_RPATH_OPT" = "-R " ; then
+ cf_rpath_tmp=`echo "$cf_rpath_src" |sed -e "s%-L%-R %"`
+ else
+ cf_rpath_tmp=`echo "$cf_rpath_src" |sed -e "s%-L%$LD_RPATH_OPT%"`
+ fi
+
+ # if we have not already added this, add it now
+ cf_rpath_tst=`echo "$EXTRA_LDFLAGS" | sed -e "s%$cf_rpath_tmp %%"`
+ if test "x$cf_rpath_tst" = "x$EXTRA_LDFLAGS"
+ then
+ test -n "$verbose" && echo " ...Filter $cf_rpath_src ->$cf_rpath_tmp" 1>&6
+
+echo "${as_me:-configure}:50409: testing ...Filter $cf_rpath_src ->$cf_rpath_tmp ..." 1>&5
+
+ EXTRA_LDFLAGS="$cf_rpath_tmp $EXTRA_LDFLAGS"
+ fi
+ fi
+ ;;
+ esac
+ cf_rpath_dst="$cf_rpath_dst $cf_rpath_src"
+done
+LIBS=$cf_rpath_dst
+
+test -n "$verbose" && echo " ...checked LIBS $LIBS" 1>&6
+
+echo "${as_me:-configure}:50422: testing ...checked LIBS $LIBS ..." 1>&5
+
+ test -n "$verbose" && echo " ...checked EXTRA_LDFLAGS $EXTRA_LDFLAGS" 1>&6
+
+echo "${as_me:-configure}:50426: testing ...checked EXTRA_LDFLAGS $EXTRA_LDFLAGS ..." 1>&5
+
+else
+ echo "$as_me:50429: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+
+if test "$GCC" = yes || test "$GXX" = yes
+then
+
+ test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+ CFLAGS="${CFLAGS}$EXTRA_CFLAGS"
+
+ EXTRA_CFLAGS=
+fi
+
+### Finally, build config.h and the makefiles
+test -z "$CONFIG_SHELL" && CONFIG_SHELL=/bin/sh
+
+srcdir="$srcdir"
+SRCDIR_CLEAN="#"
+if test -n "$srcdir" ; then
+ echo "srcdir is $srcdir"
+ mkdir -p WWW/Library/Implementation
+ mkdir -p src/chrtrans
+ test "$USE_INCLUDED_LIBINTL" = yes && mkdir -p intl
+ test "$srcdir" != "." && SRCDIR_CLEAN=""
+fi
+
+HOMEPAGE_URL="https://lynx.invisible-island.net/"
+
+cat >>confdefs.h <<EOF
+#define HOMEPAGE_URL "$HOMEPAGE_URL"
+EOF
+
+ac_config_files="$ac_config_files makefile WWW/Library/Implementation/makefile src/makefile src/chrtrans/makefile $SUB_MAKEFILE"
+ac_config_commands="$ac_config_commands default"
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems. If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overriden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+{
+ (set) 2>&1 |
+ case `(ac_space=' '; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ # `set' does not quote correctly, so add quotes (double-quote
+ # substitution turns \\\\ into \\, and sed turns \\ into \).
+ sed -n \
+ "s/'/'\\\\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+ ;;
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n \
+ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+ ;;
+ esac;
+} |
+ sed '
+ t clear
+ : clear
+ s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+ t end
+ /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+ : end' >>confcache
+if cmp -s $cache_file confcache; then :; else
+ if test -w $cache_file; then
+ test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file"
+ cat confcache >$cache_file
+ else
+ echo "not updating unwritable cache $cache_file"
+ fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=/{
+s/:*\$(srcdir):*/:/;
+s/:*\${srcdir}:*/:/;
+s/:*@srcdir@:*/:/;
+s/^\([^=]*=[ ]*\):*/\1/;
+s/:*$//;
+s/^[^=]*=[ ]*$//;
+}'
+fi
+
+DEFS=-DHAVE_CONFIG_H
+
+: "${CONFIG_STATUS=./config.status}"
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:50544: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >"$CONFIG_STATUS" <<_ACEOF
+#! $SHELL
+# Generated automatically by configure.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+me=\`echo "\$0" | sed -e 's,.*\\/,,'\`
+
+debug=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+ac_cs_invocation="\$0 \$@"
+
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+_ACEOF
+
+cat >>"$CONFIG_STATUS" <<\_ACEOF
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+ set -o posix
+fi
+
+# Name of the executable.
+as_me=`echo "$0" |sed 's,.*[\\/],,'`
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr="expr"
+else
+ as_expr="false"
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+ # We could just check for DJGPP; but this test a) works b) is more generic
+ # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+ if test -f conf$$.exe; then
+ # Don't use ln at all; we don't have any links
+ as_ln_s='cp -p'
+ else
+ as_ln_s='ln -s'
+ fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln'
+else
+ as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+as_executable_p="test -f"
+
+# Support unset when possible.
+if (FOO=FOO; unset FOO) >/dev/null 2>&1; then
+ as_unset="unset"
+else
+ as_unset="false"
+fi
+
+# NLS nuisances.
+$as_unset LANG || test "${LANG+set}" != set || { LANG=C; export LANG; }
+$as_unset LC_ALL || test "${LC_ALL+set}" != set || { LC_ALL=C; export LC_ALL; }
+$as_unset LC_TIME || test "${LC_TIME+set}" != set || { LC_TIME=C; export LC_TIME; }
+$as_unset LC_CTYPE || test "${LC_CTYPE+set}" != set || { LC_CTYPE=C; export LC_CTYPE; }
+$as_unset LANGUAGE || test "${LANGUAGE+set}" != set || { LANGUAGE=C; export LANGUAGE; }
+$as_unset LC_COLLATE || test "${LC_COLLATE+set}" != set || { LC_COLLATE=C; export LC_COLLATE; }
+$as_unset LC_NUMERIC || test "${LC_NUMERIC+set}" != set || { LC_NUMERIC=C; export LC_NUMERIC; }
+$as_unset LC_MESSAGES || test "${LC_MESSAGES+set}" != set || { LC_MESSAGES=C; export LC_MESSAGES; }
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" $as_nl"
+
+# CDPATH.
+$as_unset CDPATH || test "${CDPATH+set}" != set || { CDPATH=:; export CDPATH; }
+
+exec 6>&1
+
+_ACEOF
+
+# Files that config.status was made for.
+if test -n "$ac_config_files"; then
+ echo "config_files=\"$ac_config_files\"" >>"$CONFIG_STATUS"
+fi
+
+if test -n "$ac_config_headers"; then
+ echo "config_headers=\"$ac_config_headers\"" >>"$CONFIG_STATUS"
+fi
+
+if test -n "$ac_config_links"; then
+ echo "config_links=\"$ac_config_links\"" >>"$CONFIG_STATUS"
+fi
+
+if test -n "$ac_config_commands"; then
+ echo "config_commands=\"$ac_config_commands\"" >>"$CONFIG_STATUS"
+fi
+
+cat >>"$CONFIG_STATUS" <<\EOF
+
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+ -h, --help print this help, then exit
+ -V, --version print version number, then exit
+ -d, --debug don't remove temporary files
+ --recheck update $as_me by reconfiguring in the same conditions
+ --file=FILE[:TEMPLATE]
+ instantiate the configuration file FILE
+ --header=FILE[:TEMPLATE]
+ instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to <dickey@invisible-island.net>."
+EOF
+
+cat >>"$CONFIG_STATUS" <<EOF
+ac_cs_version="\\
+config.status
+configured by $0, generated by GNU Autoconf 2.52.20221202,
+ with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright 2003-2021,2022 Thomas E. Dickey
+Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001
+Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+srcdir="$srcdir"
+INSTALL="$INSTALL"
+EOF
+
+cat >>"$CONFIG_STATUS" <<\EOF
+# If no file are specified by the user, then we need to provide default
+# value. By we need to know if files were specified by the user.
+ac_need_defaults=:
+while test $# != 0
+do
+ case $1 in
+ --*=*)
+ ac_option=`expr "x$1" : 'x\([^=]*\)='`
+ ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
+ shift
+ set dummy "$ac_option" "$ac_optarg" ${1+"$@"}
+ shift
+ ;;
+ -*);;
+ *) # This is not an option, so the user has probably given explicit
+ # arguments.
+ ac_need_defaults=false;;
+ esac
+
+ case $1 in
+ # Handling of the options.
+EOF
+cat >>"$CONFIG_STATUS" <<EOF
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ echo "running $SHELL $0 " $ac_configure_args " --no-create --no-recursion"
+ exec $SHELL $0 $ac_configure_args --no-create --no-recursion ;;
+EOF
+cat >>"$CONFIG_STATUS" <<\EOF
+ --version | --vers* | -V )
+ echo "$ac_cs_version"; exit 0 ;;
+ --he | --h)
+ # Conflict between --help and --header
+ { { echo "$as_me:50725: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2;}
+ { (exit 1); exit 1; }; };;
+ --help | --hel | -h )
+ echo "$ac_cs_usage"; exit 0 ;;
+ --debug | --d* | -d )
+ debug=: ;;
+ --file | --fil | --fi | --f )
+ shift
+ CONFIG_FILES="$CONFIG_FILES $1"
+ ac_need_defaults=false;;
+ --header | --heade | --head | --hea )
+ shift
+ CONFIG_HEADERS="$CONFIG_HEADERS $1"
+ ac_need_defaults=false;;
+
+ # This is an error.
+ -*) { { echo "$as_me:50744: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2;}
+ { (exit 1); exit 1; }; } ;;
+
+ *) ac_config_targets="$ac_config_targets $1" ;;
+
+ esac
+ shift
+done
+
+exec 5>>config.log
+cat >&5 << _ACEOF
+
+## ----------------------- ##
+## Running config.status. ##
+## ----------------------- ##
+
+This file was extended by $as_me 2.52.20221202, executed with
+ CONFIG_FILES = $CONFIG_FILES
+ CONFIG_HEADERS = $CONFIG_HEADERS
+ CONFIG_LINKS = $CONFIG_LINKS
+ CONFIG_COMMANDS = $CONFIG_COMMANDS
+ > "$ac_cs_invocation"
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+
+_ACEOF
+EOF
+
+cat >>"$CONFIG_STATUS" <<EOF
+#
+# INIT-COMMANDS section.
+#
+
+ USE_NLS=$USE_NLS
+ use_our_messages=$use_our_messages
+
+EOF
+
+cat >>"$CONFIG_STATUS" <<\EOF
+for ac_config_target in $ac_config_targets
+do
+ case "$ac_config_target" in
+ # Handling of arguments.
+ "makefile" ) CONFIG_FILES="$CONFIG_FILES makefile" ;;
+ "WWW/Library/Implementation/makefile" ) CONFIG_FILES="$CONFIG_FILES WWW/Library/Implementation/makefile" ;;
+ "src/makefile" ) CONFIG_FILES="$CONFIG_FILES src/makefile" ;;
+ "src/chrtrans/makefile" ) CONFIG_FILES="$CONFIG_FILES src/chrtrans/makefile" ;;
+ "$SUB_MAKEFILE" ) CONFIG_FILES="$CONFIG_FILES $SUB_MAKEFILE" ;;
+ "default-1" ) CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;;
+ "default" ) CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;;
+ "$CONFIG_H" ) CONFIG_HEADERS="$CONFIG_HEADERS $CONFIG_H:config.hin" ;;
+ *) { { echo "$as_me:50797: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+ { (exit 1); exit 1; }; };;
+ esac
+done
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used. Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if "$ac_need_defaults"; then
+ test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+ test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+ test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Create a temporary directory, and hook for its removal unless debugging.
+$debug ||
+{
+ trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
+ trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+
+# Create a (secure) tmp directory for tmp files.
+: "${TMPDIR=/tmp}"
+{
+ tmp=`(umask 077 && mktemp -d -q "$TMPDIR/csXXXXXX") 2>/dev/null` &&
+ test -n "$tmp" && test -d "$tmp"
+} ||
+{
+ tmp=$TMPDIR/cs$$-$RANDOM
+ (umask 077 && mkdir "$tmp")
+} ||
+{
+ echo "$me: cannot create a temporary directory in $TMPDIR" >&2
+ { (exit 1); exit 1; }
+}
+
+EOF
+
+cat >>"$CONFIG_STATUS" <<EOF
+
+#
+# CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "\$CONFIG_FILES"; then
+ # Protect against being on the right side of a sed subst in config.status.
+ sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g;
+ s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >"\$tmp"/subs.sed <<\\CEOF
+s,@SHELL@,$SHELL,;t t
+s,@exec_prefix@,$exec_prefix,;t t
+s,@prefix@,$prefix,;t t
+s,@program_transform_name@,$program_transform_name,;t t
+s,@bindir@,$bindir,;t t
+s,@sbindir@,$sbindir,;t t
+s,@libexecdir@,$libexecdir,;t t
+s,@datarootdir@,$datarootdir,;t t
+s,@datadir@,$datadir,;t t
+s,@sysconfdir@,$sysconfdir,;t t
+s,@sharedstatedir@,$sharedstatedir,;t t
+s,@localstatedir@,$localstatedir,;t t
+s,@runstatedir@,$runstatedir,;t t
+s,@libdir@,$libdir,;t t
+s,@includedir@,$includedir,;t t
+s,@oldincludedir@,$oldincludedir,;t t
+s,@infodir@,$infodir,;t t
+s,@mandir@,$mandir,;t t
+s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t
+s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t
+s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t
+s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t
+s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t
+s,@build_alias@,$build_alias,;t t
+s,@host_alias@,$host_alias,;t t
+s,@target_alias@,$target_alias,;t t
+s,@ECHO_C@,$ECHO_C,;t t
+s,@ECHO_N@,$ECHO_N,;t t
+s,@ECHO_T@,$ECHO_T,;t t
+s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t
+s,@DEFS@,$DEFS,;t t
+s,@LIBS@,$LIBS,;t t
+s,@CONFIG_H@,$CONFIG_H,;t t
+s,@build@,$build,;t t
+s,@build_cpu@,$build_cpu,;t t
+s,@build_vendor@,$build_vendor,;t t
+s,@build_os@,$build_os,;t t
+s,@host@,$host,;t t
+s,@host_cpu@,$host_cpu,;t t
+s,@host_vendor@,$host_vendor,;t t
+s,@host_os@,$host_os,;t t
+s,@target@,$target,;t t
+s,@target_cpu@,$target_cpu,;t t
+s,@target_vendor@,$target_vendor,;t t
+s,@target_os@,$target_os,;t t
+s,@PACKAGE@,$PACKAGE,;t t
+s,@VERSION@,$VERSION,;t t
+s,@DESTDIR@,$DESTDIR,;t t
+s,@CC@,$CC,;t t
+s,@CFLAGS@,$CFLAGS,;t t
+s,@LDFLAGS@,$LDFLAGS,;t t
+s,@CPPFLAGS@,$CPPFLAGS,;t t
+s,@ac_ct_CC@,$ac_ct_CC,;t t
+s,@EXEEXT@,$EXEEXT,;t t
+s,@OBJEXT@,$OBJEXT,;t t
+s,@EXTRA_CPPFLAGS@,$EXTRA_CPPFLAGS,;t t
+s,@CPP@,$CPP,;t t
+s,@GREP@,$GREP,;t t
+s,@EGREP@,$EGREP,;t t
+s,@LN_S@,$LN_S,;t t
+s,@SET_MAKE@,$SET_MAKE,;t t
+s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t
+s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t
+s,@INSTALL_DATA@,$INSTALL_DATA,;t t
+s,@YACC@,$YACC,;t t
+s,@LINT@,$LINT,;t t
+s,@LINT_OPTS@,$LINT_OPTS,;t t
+s,@LINT_LIBS@,$LINT_LIBS,;t t
+s,@FGREP@,$FGREP,;t t
+s,@cf_cv_makeflags@,$cf_cv_makeflags,;t t
+s,@MAKE_NO_PHONY@,$MAKE_NO_PHONY,;t t
+s,@MAKE_PHONY@,$MAKE_PHONY,;t t
+s,@CTAGS@,$CTAGS,;t t
+s,@ETAGS@,$ETAGS,;t t
+s,@MAKE_LOWER_TAGS@,$MAKE_LOWER_TAGS,;t t
+s,@MAKE_UPPER_TAGS@,$MAKE_UPPER_TAGS,;t t
+s,@WINDRES@,$WINDRES,;t t
+s,@ac_pt_WINDRES@,$ac_pt_WINDRES,;t t
+s,@BUILD_CC@,$BUILD_CC,;t t
+s,@BUILD_CPP@,$BUILD_CPP,;t t
+s,@BUILD_CFLAGS@,$BUILD_CFLAGS,;t t
+s,@BUILD_CPPFLAGS@,$BUILD_CPPFLAGS,;t t
+s,@BUILD_LDFLAGS@,$BUILD_LDFLAGS,;t t
+s,@BUILD_LIBS@,$BUILD_LIBS,;t t
+s,@BUILD_EXEEXT@,$BUILD_EXEEXT,;t t
+s,@BUILD_OBJEXT@,$BUILD_OBJEXT,;t t
+s,@RANLIB@,$RANLIB,;t t
+s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t
+s,@AR@,$AR,;t t
+s,@ac_ct_AR@,$ac_ct_AR,;t t
+s,@ARFLAGS@,$ARFLAGS,;t t
+s,@ECHO_LT@,$ECHO_LT,;t t
+s,@ECHO_LD@,$ECHO_LD,;t t
+s,@RULE_CC@,$RULE_CC,;t t
+s,@SHOW_CC@,$SHOW_CC,;t t
+s,@ECHO_CC@,$ECHO_CC,;t t
+s,@DONT_ECHO_CC@,$DONT_ECHO_CC,;t t
+s,@X_CFLAGS@,$X_CFLAGS,;t t
+s,@X_PRE_LIBS@,$X_PRE_LIBS,;t t
+s,@X_LIBS@,$X_LIBS,;t t
+s,@X_EXTRA_LIBS@,$X_EXTRA_LIBS,;t t
+s,@EXTRA_CFLAGS@,$EXTRA_CFLAGS,;t t
+s,@HAVE_STDNORETURN_H@,$HAVE_STDNORETURN_H,;t t
+s,@STDC_NORETURN@,$STDC_NORETURN,;t t
+s,@MSGINIT@,$MSGINIT,;t t
+s,@ALLOCA@,$ALLOCA,;t t
+s,@GLIBC21@,$GLIBC21,;t t
+s,@LIBICONV@,$LIBICONV,;t t
+s,@USE_NLS@,$USE_NLS,;t t
+s,@MSGFMT@,$MSGFMT,;t t
+s,@GMSGFMT@,$GMSGFMT,;t t
+s,@XGETTEXT@,$XGETTEXT,;t t
+s,@INTL_YACC@,$INTL_YACC,;t t
+s,@BUILD_INCLUDED_LIBINTL@,$BUILD_INCLUDED_LIBINTL,;t t
+s,@USE_INCLUDED_LIBINTL@,$USE_INCLUDED_LIBINTL,;t t
+s,@CATALOGS@,$CATALOGS,;t t
+s,@CATOBJEXT@,$CATOBJEXT,;t t
+s,@GMOFILES@,$GMOFILES,;t t
+s,@INTLLIBS@,$INTLLIBS,;t t
+s,@INTLOBJS@,$INTLOBJS,;t t
+s,@POFILES@,$POFILES,;t t
+s,@POSUB@,$POSUB,;t t
+s,@DATADIRNAME@,$DATADIRNAME,;t t
+s,@INSTOBJEXT@,$INSTOBJEXT,;t t
+s,@GENCAT@,$GENCAT,;t t
+s,@INTL_LIBTOOL_SUFFIX_PREFIX@,$INTL_LIBTOOL_SUFFIX_PREFIX,;t t
+s,@NLS_TEXTDOMAIN@,$NLS_TEXTDOMAIN,;t t
+s,@MSG_DIR_MAKE@,$MSG_DIR_MAKE,;t t
+s,@SUB_MAKEFILE@,$SUB_MAKEFILE,;t t
+s,@INTLDIR_MAKE@,$INTLDIR_MAKE,;t t
+s,@GT_YES@,$GT_YES,;t t
+s,@GT_NO@,$GT_NO,;t t
+s,@INTLDIR_CPPFLAGS@,$INTLDIR_CPPFLAGS,;t t
+s,@NLS_DATADIR@,$NLS_DATADIR,;t t
+s,@PKG_CONFIG@,$PKG_CONFIG,;t t
+s,@ac_pt_PKG_CONFIG@,$ac_pt_PKG_CONFIG,;t t
+s,@NCURSES_CONFIG@,$NCURSES_CONFIG,;t t
+s,@ac_ct_NCURSES_CONFIG@,$ac_ct_NCURSES_CONFIG,;t t
+s,@LYNX_LSS_FILE@,$LYNX_LSS_FILE,;t t
+s,@INSTALL_LSS@,$INSTALL_LSS,;t t
+s,@LYNX_CFG_FILE@,$LYNX_CFG_FILE,;t t
+s,@LYNX_CFG_PATH@,$LYNX_CFG_PATH,;t t
+s,@LYNXCFG_MAKE@,$LYNXCFG_MAKE,;t t
+s,@LYNXCFG_NO_MAKE@,$LYNXCFG_NO_MAKE,;t t
+s,@LYNXDOC_MAKE@,$LYNXDOC_MAKE,;t t
+s,@MIME_LIBDIR@,$MIME_LIBDIR,;t t
+s,@CHARSET_DEFS@,$CHARSET_DEFS,;t t
+s,@LIBOBJS@,$LIBOBJS,;t t
+s,@EXTRA_OBJS@,$EXTRA_OBJS,;t t
+s,@SETFONT@,$SETFONT,;t t
+s,@MAKE_WAIS@,$MAKE_WAIS,;t t
+s,@TELNET@,$TELNET,;t t
+s,@TN3270@,$TN3270,;t t
+s,@RLOGIN@,$RLOGIN,;t t
+s,@MV@,$MV,;t t
+s,@GZIP@,$GZIP,;t t
+s,@UNCOMPRESS@,$UNCOMPRESS,;t t
+s,@UNZIP@,$UNZIP,;t t
+s,@BZIP2@,$BZIP2,;t t
+s,@BROTLI@,$BROTLI,;t t
+s,@TAR@,$TAR,;t t
+s,@TAR_UP_OPTIONS@,$TAR_UP_OPTIONS,;t t
+s,@TAR_DOWN_OPTIONS@,$TAR_DOWN_OPTIONS,;t t
+s,@TAR_FILE_OPTIONS@,$TAR_FILE_OPTIONS,;t t
+s,@TAR_PIPE_OPTIONS@,$TAR_PIPE_OPTIONS,;t t
+s,@COMPRESS@,$COMPRESS,;t t
+s,@RM@,$RM,;t t
+s,@UUDECODE@,$UUDECODE,;t t
+s,@ZCAT@,$ZCAT,;t t
+s,@ZIP@,$ZIP,;t t
+s,@INSTALL@,$INSTALL,;t t
+s,@COMPRESS_PROG@,$COMPRESS_PROG,;t t
+s,@COMPRESS_EXT@,$COMPRESS_EXT,;t t
+s,@XCURSES_CONFIG@,$XCURSES_CONFIG,;t t
+s,@ac_ct_XCURSES_CONFIG@,$ac_ct_XCURSES_CONFIG,;t t
+s,@cf_ldd_prog@,$cf_ldd_prog,;t t
+s,@EXTRA_LDFLAGS@,$EXTRA_LDFLAGS,;t t
+s,@CONFIG_SHELL@,$CONFIG_SHELL,;t t
+s,@HOMEPAGE_URL@,$HOMEPAGE_URL,;t t
+s,@SRCDIR_CLEAN@,$SRCDIR_CLEAN,;t t
+CEOF
+
+EOF
+
+ cat >>"$CONFIG_STATUS" <<\EOF
+ # Split the substitutions into bite-sized pieces for seds with
+ # small command number limits, like on Digital OSF/1 and HP-UX.
+ ac_max_sed_lines=48
+ ac_sed_frag=1 # Number of current file.
+ ac_beg=1 # First line for current file.
+ ac_end=$ac_max_sed_lines # Line after last line for current file.
+ ac_more_lines=:
+ ac_sed_cmds=
+ while "$ac_more_lines"; do
+ if test "$ac_beg" -gt 1; then
+ sed "1,${ac_beg}d; ${ac_end}q" "$tmp"/subs.sed >"$tmp"/subs.frag
+ else
+ sed "${ac_end}q" "$tmp"/subs.sed >"$tmp"/subs.frag
+ fi
+ if test ! -s "$tmp"/subs.frag; then
+ ac_more_lines=false
+ else
+ # The purpose of the label and of the branching condition is to
+ # speed up the sed processing (if there are no `@' at all, there
+ # is no need to browse any of the substitutions).
+ # These are the two extra sed commands mentioned above.
+ (echo ':t
+ /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat "$tmp"/subs.frag) >"$tmp"/subs-$ac_sed_frag.sed
+ # It is possible to make a multiline substitution using escaped newlines.
+ # Ensure that we do not split the substitution between script fragments.
+ ac_BEG=$ac_end
+ ac_END=`expr "$ac_end" + "$ac_max_sed_lines"`
+ sed "1,${ac_BEG}d; ${ac_END}p; q" "$tmp"/subs.sed >"$tmp"/subs.next
+ if test -s "$tmp"/subs.next; then
+ grep '^s,@[^@,][^@,]*@,.*\\$' "$tmp"/subs.next >"$tmp"/subs.edit
+ if test ! -s "$tmp"/subs.edit; then
+ grep "^s,@[^@,][^@,]*@,.*,;t t$" "$tmp"/subs.next >"$tmp"/subs.edit
+ if test ! -s "$tmp"/subs.edit; then
+ if test "$ac_beg" -gt 1; then
+ ac_end=`expr "$ac_end" - 1`
+ continue
+ fi
+ fi
+ fi
+ fi
+
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds="sed -f \"$tmp\"/subs-$ac_sed_frag.sed"
+ else
+ ac_sed_cmds="$ac_sed_cmds | sed -f \"$tmp\"/subs-$ac_sed_frag.sed"
+ fi
+ ac_sed_frag=`expr "$ac_sed_frag" + 1`
+ ac_beg=$ac_end
+ ac_end=`expr "$ac_end" + "$ac_max_sed_lines"`
+ fi
+ done
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds="cat"
+ fi
+fi # test -n "$CONFIG_FILES"
+
+EOF
+cat >>"$CONFIG_STATUS" <<\EOF
+for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case "$ac_file" in
+ - | *:- | *:-:* ) # input from stdin
+ cat >"$tmp"/stdin
+ ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ * ) ac_file_in=$ac_file.in ;;
+ esac
+
+ # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
+ ac_dir=`$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+ { case "$ac_dir" in
+ [\\/]* | ?:[\\/]* ) as_incr_dir=;;
+ *) as_incr_dir=.;;
+esac
+as_dummy="$ac_dir"
+for as_mkdir_dir in `IFS='/\\'; set X $as_dummy; shift; echo "$@"`; do
+ case $as_mkdir_dir in
+ # Skip DOS drivespec
+ ?:) as_incr_dir=$as_mkdir_dir ;;
+ *)
+ as_incr_dir=$as_incr_dir/$as_mkdir_dir
+ test -d "$as_incr_dir" || mkdir "$as_incr_dir"
+ ;;
+ esac
+done; }
+
+ ac_dir_suffix="/`echo "$ac_dir"|sed 's,^\./,,'`"
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_dots=`echo "$ac_dir_suffix" | sed 's,/[^/]*,../,g'`
+ else
+ ac_dir_suffix= ac_dots=
+ fi
+
+ case "$srcdir" in
+ .) ac_srcdir=.
+ if test -z "$ac_dots"; then
+ ac_top_srcdir=.
+ else
+ ac_top_srcdir=`echo "$ac_dots" | sed 's,/$,,'`
+ fi ;;
+ [\\/]* | ?:[\\/]* )
+ ac_srcdir="$srcdir$ac_dir_suffix";
+ ac_top_srcdir="$srcdir" ;;
+ *) # Relative path.
+ ac_srcdir="$ac_dots$srcdir$ac_dir_suffix"
+ ac_top_srcdir="$ac_dots$srcdir" ;;
+ esac
+
+ case $INSTALL in
+ [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+ *) ac_INSTALL=$ac_dots$INSTALL ;;
+ esac
+
+ if test x"$ac_file" != x-; then
+ { echo "$as_me:51161: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+ rm -f "$ac_file"
+ fi
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated automatically by config.status. */
+ configure_input="Generated automatically from `echo $ac_file_in |
+ sed 's,.*/,,'` by configure."
+
+ # First look for the input files in the build tree, otherwise in the
+ # src tree.
+ ac_file_inputs=`IFS=:
+ for f in $ac_file_in; do
+ case $f in
+ -) echo "$tmp"/stdin ;;
+ [\\/$]*)
+ # Absolute (can't be DOS-style, as IFS=:)
+ test -f "$f" || { { echo "$as_me:51179: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ echo "$f";;
+ *) # Relative
+ if test -f "$f"; then
+ # Build tree
+ echo "$f"
+ elif test -f "$srcdir/$f"; then
+ # Source tree
+ echo "$srcdir/$f"
+ else
+ # /dev/null tree
+ { { echo "$as_me:51192: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ fi;;
+ esac
+ done` || { (exit 1); exit 1; }
+EOF
+cat >>"$CONFIG_STATUS" <<\EOF
+ ac_warn_datarootdir=no
+ if test x"$ac_file" != x-; then
+ for ac_item in $ac_file_inputs
+ do
+ ac_seen=`grep '@\(datadir\|mandir\|infodir\)@' "$ac_item"`
+ if test -n "$ac_seen"; then
+ ac_used=`grep '@datarootdir@' "$ac_item"`
+ if test -z "$ac_used"; then
+ { echo "$as_me:51208: WARNING: datarootdir was used implicitly but not set:
+$ac_seen" >&5
+echo "$as_me: WARNING: datarootdir was used implicitly but not set:
+$ac_seen" >&2;}
+ ac_warn_datarootdir=yes
+ fi
+ fi
+ ac_seen=`grep '${datarootdir}' "$ac_item"`
+ if test -n "$ac_seen"; then
+ { echo "$as_me:51217: WARNING: datarootdir was used explicitly but not set:
+$ac_seen" >&5
+echo "$as_me: WARNING: datarootdir was used explicitly but not set:
+$ac_seen" >&2;}
+ ac_warn_datarootdir=yes
+ fi
+ done
+ fi
+
+if test "x$ac_warn_datarootdir" = xyes; then
+ ac_sed_cmds="$ac_sed_cmds | sed -e 's,@datarootdir@,\${prefix}/share,g' -e 's,\${datarootdir},\${prefix}/share,g'"
+fi
+
+EOF
+cat >>"$CONFIG_STATUS" <<EOF
+ sed "$ac_vpsub
+$extrasub
+EOF
+cat >>"$CONFIG_STATUS" <<\EOF
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s,@configure_input@,$configure_input,;t t
+s,@srcdir@,$ac_srcdir,;t t
+s,@top_srcdir@,$ac_top_srcdir,;t t
+s,@INSTALL@,$ac_INSTALL,;t t
+" $ac_file_inputs | (eval "$ac_sed_cmds") >"$tmp"/out
+ rm -f "$tmp"/stdin
+EOF
+: "${FGREP:=grep -F}"
+: "${EGREP:=grep -E}"
+cat >>"$CONFIG_STATUS" <<EOF
+ : "\${FGREP:=$FGREP}"
+ : "\${EGREP:=$EGREP}"
+EOF
+cat >>"$CONFIG_STATUS" <<\EOF
+ if test x"$ac_file" != x-; then
+ cp "$tmp/out" "$ac_file"
+
+ for ac_name in prefix exec_prefix datarootdir
+ do
+ ac_seen=`$FGREP -n '${'$ac_name'[:=].*}' "$ac_file"`
+ if test -n "$ac_seen"; then
+ ac_init=`$EGREP '[ ]*'$ac_name'[ ]*=' "$ac_file"`
+ if test -z "$ac_init"; then
+ ac_seen=`echo "$ac_seen" |sed -e 's,^,'"$ac_file"':,'`
+ { echo "$as_me:51262: WARNING: Variable $ac_name is used but was not set:
+$ac_seen" >&5
+echo "$as_me: WARNING: Variable $ac_name is used but was not set:
+$ac_seen" >&2;}
+ fi
+ fi
+ done
+ $EGREP -n '@[a-z_][a-z_0-9]+@' "$ac_file" >"$tmp"/out
+ $EGREP -n '@[A-Z_][A-Z_0-9]+@' "$ac_file" >>"$tmp"/out
+ if test -s "$tmp"/out; then
+ ac_seen=`sed -e 's,^,'"$ac_file"':,' < "$tmp"/out`
+ { echo "$as_me:51273: WARNING: Some variables may not be substituted:
+$ac_seen" >&5
+echo "$as_me: WARNING: Some variables may not be substituted:
+$ac_seen" >&2;}
+ fi
+ else
+ cat "$tmp"/out
+ fi
+ rm -f "$tmp"/out
+
+done
+EOF
+cat >>"$CONFIG_STATUS" <<\EOF
+
+#
+# CONFIG_HEADER section.
+#
+
+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+# NAME is the cpp macro being defined and VALUE is the value it is being given.
+#
+# ac_d sets the value in "#define NAME VALUE" lines.
+ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)'
+ac_dB='[ ].*$,\1#\2'
+ac_dC=' '
+ac_dD=',;t'
+# ac_i turns "#undef NAME" with trailing blanks into "#define NAME VALUE".
+ac_iA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
+ac_iB='\([ ]\),\1#\2define\3'
+ac_iC=' '
+ac_iD='\4,;t'
+# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
+ac_uB='$,\1#\2define\3'
+ac_uC=' '
+ac_uD=',;t'
+
+for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case "$ac_file" in
+ - | *:- | *:-:* ) # input from stdin
+ cat >"$tmp"/stdin
+ ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ * ) ac_file_in=$ac_file.in ;;
+ esac
+
+ test x"$ac_file" != x- && { echo "$as_me:51322: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+
+ # First look for the input files in the build tree, otherwise in the
+ # src tree.
+ ac_file_inputs=`IFS=:
+ for f in $ac_file_in; do
+ case $f in
+ -) echo "$tmp"/stdin ;;
+ [\\/$]*)
+ # Absolute (can't be DOS-style, as IFS=:)
+ test -f "$f" || { { echo "$as_me:51333: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ echo $f;;
+ *) # Relative
+ if test -f "$f"; then
+ # Build tree
+ echo $f
+ elif test -f "$srcdir/$f"; then
+ # Source tree
+ echo "$srcdir/$f"
+ else
+ # /dev/null tree
+ { { echo "$as_me:51346: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ fi;;
+ esac
+ done` || { (exit 1); exit 1; }
+ # Remove the trailing spaces.
+ sed 's/[ ]*$//' $ac_file_inputs >"$tmp"/in
+
+EOF
+
+# Transform confdefs.h into two sed scripts, `conftest.defines' and
+# `conftest.undefs', that substitutes the proper values into
+# config.h.in to produce config.h. The first handles `#define'
+# templates, and the second `#undef' templates.
+# And first: Protect against being on the right side of a sed subst in
+# config.status. Protect against being in an unquoted here document
+# in config.status.
+rm -f conftest.defines conftest.undefs
+# Using a here document instead of a string reduces the quoting nightmare.
+# Putting comments in sed scripts is not portable.
+#
+# `end' is used to avoid that the second main sed command (meant for
+# 0-ary CPP macros) applies to n-ary macro definitions.
+# See the Autoconf documentation for `clear'.
+cat >confdef2sed.sed <<\EOF
+s/[\\&,]/\\&/g
+s,[\\$`],\\&,g
+t clear
+: clear
+s,^[ ]*#[ ]*define[ ][ ]*\(\([^ (][^ (]*\)([^)]*)\)[ ]*\(.*\)$,${ac_dA}\2${ac_dB}\1${ac_dC}\3${ac_dD},gp
+t end
+s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp
+: end
+EOF
+# If some macros were called several times there might be several times
+# the same #defines, which is useless. Nevertheless, we may not want to
+# sort them, since we want the *last* AC-DEFINE to be honored.
+uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines
+sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs
+sed 's/ac_d/ac_i/g' conftest.defines >>conftest.undefs
+rm -f confdef2sed.sed
+
+# This sed command replaces #undef with comments. This is necessary, for
+# example, in the case of _POSIX_SOURCE, which is predefined and required
+# on some systems where configure will not decide to define it.
+cat >>conftest.undefs <<\EOF
+s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */,
+EOF
+
+# Break up conftest.defines because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
+echo ' # Handle all the #define templates only if necessary.' >>"$CONFIG_STATUS"
+echo ' if ${EGREP-grep -E} "^[ ]*#[ ]*define" "$tmp"/in >/dev/null; then' >>"$CONFIG_STATUS"
+echo ' # If there are no defines, we may have an empty if/fi' >>"$CONFIG_STATUS"
+echo ' :' >>"$CONFIG_STATUS"
+rm -f conftest.tail
+while grep . conftest.defines >/dev/null
+do
+ # Write a limited-size here document to "$tmp"/defines.sed.
+ echo ' cat >"$tmp"/defines.sed <<CEOF' >>"$CONFIG_STATUS"
+ # Speed up: don't consider the non `#define' lines.
+ echo '/^[ ]*#[ ]*define/!b' >>"$CONFIG_STATUS"
+ # Work around the forget-to-reset-the-flag bug.
+ echo 't clr' >>"$CONFIG_STATUS"
+ echo ': clr' >>"$CONFIG_STATUS"
+ sed "${ac_max_here_lines}q" conftest.defines >>"$CONFIG_STATUS"
+ echo 'CEOF
+ sed -f "$tmp"/defines.sed "$tmp"/in >"$tmp"/out
+ rm -f "$tmp"/in
+ mv "$tmp"/out "$tmp"/in
+' >>"$CONFIG_STATUS"
+ sed "1,${ac_max_here_lines}d" conftest.defines >conftest.tail
+ rm -f conftest.defines
+ mv conftest.tail conftest.defines
+done
+rm -f conftest.defines
+echo ' fi # grep' >>"$CONFIG_STATUS"
+echo >>"$CONFIG_STATUS"
+
+# Break up conftest.undefs because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
+echo ' # Handle all the #undef templates' >>"$CONFIG_STATUS"
+rm -f conftest.tail
+while grep . conftest.undefs >/dev/null
+do
+ # Write a limited-size here document to "$tmp"/undefs.sed.
+ echo ' cat >"$tmp"/undefs.sed <<CEOF' >>"$CONFIG_STATUS"
+ # Speed up: don't consider the non `#undef'
+ echo '/^[ ]*#[ ]*undef/!b' >>"$CONFIG_STATUS"
+ # Work around the forget-to-reset-the-flag bug.
+ echo 't clr' >>"$CONFIG_STATUS"
+ echo ': clr' >>"$CONFIG_STATUS"
+ sed "${ac_max_here_lines}q" conftest.undefs >>"$CONFIG_STATUS"
+ echo 'CEOF
+ sed -f "$tmp"/undefs.sed "$tmp"/in >"$tmp"/out
+ rm -f "$tmp"/in
+ mv "$tmp"/out "$tmp"/in
+' >>"$CONFIG_STATUS"
+ sed "1,${ac_max_here_lines}d" conftest.undefs >conftest.tail
+ rm -f conftest.undefs
+ mv conftest.tail conftest.undefs
+done
+rm -f conftest.undefs
+
+cat >>"$CONFIG_STATUS" <<\EOF
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated automatically by config.status. */
+ if test x"$ac_file" = x-; then
+ echo "/* Generated automatically by configure. */" >"$tmp"/config.h
+ else
+ echo "/* $ac_file. Generated automatically by configure. */" >"$tmp"/config.h
+ fi
+ cat "$tmp"/in >>"$tmp"/config.h
+ rm -f "$tmp"/in
+ if test x"$ac_file" != x-; then
+ if cmp -s "$ac_file" "$tmp/config.h" 2>/dev/null; then
+ { echo "$as_me:51464: $ac_file is unchanged" >&5
+echo "$as_me: $ac_file is unchanged" >&6;}
+ else
+ ac_dir=`$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+ { case "$ac_dir" in
+ [\\/]* | ?:[\\/]* ) as_incr_dir=;;
+ *) as_incr_dir=.;;
+esac
+as_dummy="$ac_dir"
+for as_mkdir_dir in `IFS='/\\'; set X $as_dummy; shift; echo "$@"`; do
+ case $as_mkdir_dir in
+ # Skip DOS drivespec
+ ?:) as_incr_dir=$as_mkdir_dir ;;
+ *)
+ as_incr_dir=$as_incr_dir/$as_mkdir_dir
+ test -d "$as_incr_dir" || mkdir "$as_incr_dir"
+ ;;
+ esac
+done; }
+
+ fi
+ rm -f "$ac_file"
+ mv "$tmp/config.h" "$ac_file"
+ fi
+ else
+ cat "$tmp"/config.h
+ rm -f "$tmp"/config.h
+ fi
+done
+EOF
+cat >>"$CONFIG_STATUS" <<\EOF
+#
+# CONFIG_COMMANDS section.
+#
+for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue
+ ac_dest=`echo "$ac_file" | sed 's,:.*,,'`
+ ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'`
+
+ case "$ac_dest" in
+ default-1 ) for ac_file in $CONFIG_FILES; do
+
+ # Support "outfile[:infile[:infile...]]"
+ case "$ac_file" in
+ (*:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ esac
+
+ # PO directories have a Makefile.in generated from Makefile.inn.
+ case "$ac_file" in
+ (*/[Mm]akefile.in)
+ # Adjust a relative srcdir.
+ ac_dir="`echo "$ac_file"|sed 's%/[^/][^/]*$%%'`"
+ ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`"
+ ac_dots="`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'`"
+ ac_base="`basename $ac_file .in`"
+ # In autoconf-2.13 it is called $ac_given_srcdir.
+ # In autoconf-2.50 it is called $srcdir.
+ test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir"
+
+ case "$ac_given_srcdir" in
+ (.) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;;
+ (/*) top_srcdir="$ac_given_srcdir" ;;
+ (*) top_srcdir="$ac_dots$ac_given_srcdir" ;;
+ esac
+
+ if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then
+ rm -f "$ac_dir/POTFILES"
+ test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES"
+ sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," -e "\$s/\(.*\) \\\\/\1/" < "$ac_given_srcdir/$ac_dir/POTFILES.in" > "$ac_dir/POTFILES"
+ test -n "$as_me" && echo "$as_me: creating $ac_dir/$ac_base" || echo "creating $ac_dir/$ac_base"
+ sed -e "/POTFILES =/r $ac_dir/POTFILES" "$ac_dir/$ac_base.in" > "$ac_dir/$ac_base"
+ fi
+ ;;
+ esac
+ done ;;
+ default )
+ if test "$USE_NLS" = yes ; then
+ if test "$use_our_messages" = yes ; then
+ echo "creating po/makefile"
+ rm -f po/temp$$
+ sed -e 's%^.*LYMessages.c% ../LYMessages.c%' \
+ -e '$s/\\//' po/POTFILES >po/temp$$
+ sed -e "/POTFILES =/r po/temp$$" \
+ po/makefile.in > po/makefile
+ rm -f po/temp$$
+ fi
+ fi
+ ;;
+ esac
+done
+EOF
+
+cat >>"$CONFIG_STATUS" <<\EOF
+
+{ (exit 0); exit 0; }
+EOF
+chmod +x "$CONFIG_STATUS"
+ac_clean_files=$ac_clean_files_save
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded. So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status. When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+ ac_cs_success=:
+ exec 5>/dev/null
+ $SHELL "$CONFIG_STATUS" || ac_cs_success=false
+ exec 5>>config.log
+ # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+ # would make configure fail if this is the last instruction.
+ "$ac_cs_success" || { (exit 1); exit 1; }
+fi
+
diff --git a/configure.in b/configure.in
new file mode 100644
index 0000000..8f4bcae
--- /dev/null
+++ b/configure.in
@@ -0,0 +1,1637 @@
+dnl $LynxId: configure.in,v 1.345 2023/01/08 14:06:03 tom Exp $
+dnl
+dnl Process this file with autoconf to produce a configure script.
+dnl
+dnl created jan/1997
+dnl by T.E.Dickey <dickey@invisible-island.net>
+dnl and Jim Spath <jspath@mail.bcpl.lib.md.us>
+dnl
+dnl ---------------------------------------------------------------------------
+dnl Copyright 1997-2022,2023 by Thomas E. Dickey
+dnl
+dnl Permission to use, copy, modify, and distribute this software and its
+dnl documentation for any purpose and without fee is hereby granted,
+dnl provided that the above copyright notice appear in all copies and that
+dnl both that copyright notice and this permission notice appear in
+dnl supporting documentation, and that the name of the above listed
+dnl copyright holder(s) not be used in advertising or publicity pertaining
+dnl to distribution of the software without specific, written prior
+dnl permission.
+dnl
+dnl THE ABOVE LISTED COPYRIGHT HOLDER(S) DISCLAIM ALL WARRANTIES WITH REGARD
+dnl TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+dnl AND FITNESS, IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE
+dnl LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+dnl WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+dnl ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+dnl OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+dnl ---------------------------------------------------------------------------
+dnl
+dnl ask PRCS to plug-in the project-version for the configure-script.
+dnl $Format: "AC_REVISION($ProjectVersion$)"$
+AC_REVISION(2.9.0dev.12)
+
+# Save the original $CFLAGS so we can distinguish whether the user set those
+# in the environment, or whether autoconf added -O and -g options:
+ORIGINAL_CFLAGS="$CFLAGS"
+
+# For autoconf 2.13, make sure we have no cache file at the beginning of this
+# script. That fixes problems with tests whose cached values change from one
+# run to the next, as well as with tests that are order-dependent.
+rm -f config.cache
+
+AC_PREREQ(2.25.20210105)
+AC_INIT(userdefs.h)
+
+# autoconf 2.5x defaults to no cache file; we need the cache file's information
+# for building the config page. But start with it empty to avoid confusion by
+# people who don't do a "make distclean" after applying patches.
+cache_file=config.cache
+rm -f config.cache; touch config.cache
+
+CONFIG_H=lynx_cfg.h
+AC_CONFIG_HEADER($CONFIG_H:config.hin)
+AC_SUBST(CONFIG_H)
+
+CF_CHECK_CACHE([AC_CANONICAL_SYSTEM])
+AC_ARG_WITH(system-type,
+[ --with-system-type=XXX test: override derived host system-type],
+[AC_MSG_WARN(overriding system type $host_os to $withval)
+ host_os=$withval])
+
+AC_ARG_PROGRAM
+
+PACKAGE=lynx
+dnl ask PRCS to plug-in the project-version for the packages.
+# $Format: "VERSION=$ProjectVersion$"$
+VERSION=2.9.0dev.12
+
+AC_SUBST(PACKAGE)
+AC_SUBST(VERSION)
+
+AC_MSG_CHECKING(for DESTDIR)
+CF_WITH_PATH(destdir,
+[ --with-destdir=XXX set DESTDIR destination for install],
+DESTDIR,
+[$DESTDIR],
+[$DESTDIR])
+AC_MSG_RESULT($DESTDIR)
+
+AC_PREFIX_DEFAULT(/usr/local)
+
+dnl --------------------------------------------------------------------------
+dnl Checks for location of programs
+dnl --------------------------------------------------------------------------
+
+dnl Only add to this case statement when a system has a compiler that is not
+dnl detected by AC_PROG_CC.
+case "$host_os" in
+(openedition)
+ : ${CFLAGS="-D_ALL_SOURCE -Wl,EDIT=NO"}
+ : ${CC=c89}
+ ;;
+esac
+
+CF_PROG_CC
+CF_PROG_CPP_COMMENTS
+AC_PROG_LN_S
+case "$host_os" in
+(mingw*)
+LN_S="cp -p"
+AC_MSG_RESULT(Override: No symbolic links in mingw.)
+ ;;
+(*)
+ ;;
+esac
+AC_PROG_MAKE_SET
+AC_PROG_INSTALL
+AC_PROG_YACC
+AC_PROG_EGREP
+CF_PROG_LINT
+CF_MAKEFLAGS
+CF_MAKE_PHONY
+CF_MAKE_TAGS
+
+CF_ACVERSION_CHECK(2.52,
+ [AC_PATH_TOOL(WINDRES, windres, none)],
+ [AC_PATH_PROG(WINDRES, windres, none)])
+
+CF_BUILD_CC([#],[])
+
+CF_PROG_RANLIB
+CF_AR_FLAGS
+
+dnl --------------------------------------------------------------------------
+dnl Debug/development/test
+dnl --------------------------------------------------------------------------
+
+CF_HELP_MESSAGE(
+Development Options:)
+
+CF_DISABLE_ECHO
+
+# special case for WWW/*
+if test -n "$ECHO_CC" ; then
+ DONT_ECHO_CC="$SHOW_CC ;"
+else
+ DONT_ECHO_CC=''
+fi
+AC_SUBST(DONT_ECHO_CC)
+
+AC_MSG_CHECKING(if you want to check memory-leaks)
+CF_ARG_ENABLE(find-leaks,
+ [ --enable-find-leaks logic for testing memory leaks],
+ [with_leak_checks=yes],
+ [with_leak_checks=no])
+AC_MSG_RESULT($with_leak_checks)
+test "$with_leak_checks" = "yes" && AC_DEFINE(LY_FIND_LEAKS,1,[Define to 1 if you want to check memory-leaks])
+
+# The comment about adding -g to $CFLAGS is unclear. Autoconf tries to add
+# a -g flag; we remove it if the user's $CFLAGS was not set and debugging is
+# disabled.
+AC_MSG_CHECKING(if you want to enable debug-code)
+CF_ARG_ENABLE(debug,
+ [ --enable-debug compile w/ debugging (if \$CFLAGS is set, add -g there, too)],
+ [with_debug=yes],
+ [with_debug=no])
+AC_MSG_RESULT($with_debug)
+if test "$with_debug" = "yes" ; then
+ case "$host_os" in
+ (ultrix*|osf*)
+ test -z "$ORIGINAL_CFLAGS" && CF_STRIP_O_OPT(CFLAGS)
+ if test -z "$GCC" ; then
+ CFLAGS="$CFLAGS -g3"
+ fi
+ ;;
+ esac
+else
+ case "$host_os" in
+ (osf*)
+ test -z "$GCC" && CFLAGS="$CFLAGS -std1"
+ test -z "$ORIGINAL_CFLAGS" && CF_STRIP_G_OPT(CFLAGS)
+ ;;
+ (*)
+ test -z "$ORIGINAL_CFLAGS" && CF_STRIP_G_OPT(CFLAGS)
+ ;;
+ esac
+fi
+
+AC_MSG_CHECKING(if you want to enable lynx trace code *recommended* )
+CF_ARG_DISABLE(trace,
+ [ --disable-trace disable logic for trace code],
+ [with_trace=$enableval],
+ [with_trace=yes])
+AC_MSG_RESULT($with_trace)
+test "$with_trace" = no && AC_DEFINE(NO_LYNX_TRACE,1,[Define to 1 if you want to enable lynx trace code])
+
+AC_MSG_CHECKING(if you want verbose trace code)
+CF_ARG_ENABLE(vertrace,
+ [ --enable-vertrace verbose trace code],
+ [with_vertrace=yes],
+ [with_vertrace=no])
+AC_MSG_RESULT($with_vertrace)
+test "$with_vertrace" = yes && AC_DEFINE(LY_TRACELINE,__LINE__,[Define to __LINE__ if you want verbose trace code])
+
+CF_WITH_SCREEN_PDCURSES
+CF_ENABLE_WARNINGS
+CF_WITH_DBMALLOC
+CF_WITH_DMALLOC
+
+dnl --------------------------------------------------------------------------
+dnl Checks for compiler & standard-library characteristics
+dnl --------------------------------------------------------------------------
+
+dnl If we're able to run this script, this is true!
+AC_DEFINE(UNIX,1,[Define to 1 if we can run a configure script])
+
+dnl Only add to this case statement things that we cannot design tests for.
+TRY_CFLAGS=
+case "$host_os" in
+(aix4*)
+ TRY_CFLAGS="$TRY_CFLAGS -DAIX4 -D_BSD=44 -D_AIX"
+ LIBS="$LIBS -lbsd"
+ ;;
+(aix*)
+ TRY_CFLAGS="$TRY_CFLAGS -D_ACS_COMPAT_CODE"
+ LIBS="$LIBS -lbsd"
+ ;;
+(apollo*)
+ TRY_CFLAGS="$TRY_CFLAGS -D_BUILTINS -W0,-opt,4"
+ ;;
+(bsdi*)
+ TRY_CFLAGS="$TRY_CFLAGS -DBSDI"
+ ;;
+(clix*)
+ # Tested on CLIX 3.1 (T.Dickey). The original makefile entry
+ # contributed by Alex Matulich (matuli_a@marlin.navsea.navy.mil) also
+ # references -lmalloc and -lbsd.
+ AC_CHECK_LIB(c_s,strcmp)
+ ;;
+(convex*)
+ TRY_CFLAGS="$TRY_CFLAGS -D__STDC__ -Dunix"
+ ;;
+(cygwin*)
+ TRY_CFLAGS="$TRY_CFLAGS -DWIN_EX -D_WINDOWS_NSL"
+ LIBS="$LIBS -luser32"
+ ;;
+(hpux*)
+ TRY_CFLAGS="$TRY_CFLAGS -D_XOPEN_SOURCE_EXTENDED"
+ test -z "$GCC" && TRY_CFLAGS="$TRY_CFLAGS -Wp,-H600000 -DSYS_HPUX"
+ ;;
+(isc*)
+ # -DPOSIX_JC is necessary, else LYBookmark.c never finds out what a mode_t is.
+ TRY_CFLAGS="$TRY_CFLAGS -DISC -DPOSIX_JC"
+ LIBS="$LIBS -linet -lnsl_s -lcposix"
+ ;;
+(irix6.*)
+ TRY_CFLAGS="$TRY_CFLAGS -DSYS_IRIX64"
+ ;;
+(irix*)
+ # The original makefile used the $CFLAGS option -cckr for some form
+ # of K&R compatibility. However, this causes compilation warnings for
+ # varargs on IRIX 5.2, and does not appear to be needed.
+ ;;
+(linux*)
+ TRY_CFLAGS="$TRY_CFLAGS -DLINUX"
+ ;;
+(mingw*)
+ # put these directly in CPPFLAGS since they will not work in lynx_cfg.h
+ CF_ADD_CFLAGS(\
+ -DDOSPATH \
+ -DNOSIGHUP \
+ -DNOUSERS \
+ -DWIN32_LEAN_AND_MEAN \
+ -DWIN_EX \
+ -D_CONSOLE \
+ -D_GNU_SOURCE \
+ -D_MBCS \
+ -D_WINDOWS \
+ -D_WIN_CC \
+ -D__WIN32__ \
+ )
+ EXTRA_OBJS="$EXTRA_OBJS Xsystem\$o"
+ ;;
+(msdosdjgpp*)
+ LIBS="$LIBS -lwatt"
+ TRY_CFLAGS="$TRY_CFLAGS -DDOSPATH -DNOUSERS"
+ ;;
+(next*)
+ TRY_CFLAGS="$TRY_CFLAGS -DNEXT"
+ ;;
+(osf4*)
+ # The -Olimit flag (see below) is no longer available with
+ # Digital C 5.2, which is bundled with Digital UNIX 4.0.
+ TRY_CFLAGS="$TRY_CFLAGS -DDSYS5 -DSYS_TRU64"
+ ;;
+(osf*)
+ # Increase the maximum size of functions that will be optimized.
+ test -z "$GCC" && TRY_CFLAGS="$TRY_CFLAGS -O -Olimit 4000"
+ TRY_CFLAGS="$TRY_CFLAGS -DDSYS5 -DSYS_TRU64"
+ ;;
+(sco3.2v5*)
+ test "$ac_cv_prog_gcc" != yes && TRY_CFLAGS="$TRY_CFLAGS -belf"
+ ;;
+(sco*)
+ LIBS="$LIBS -lmalloc"
+ # It's a little late to do much, but try to warn user if he's using
+ # SCO's cc (which is reported to have broken const/volatile).
+ case "$CC" in
+ (cc|*/cc)
+ AC_MSG_WARN(You should consider using gcc or rcc if available)
+ unset ac_cv_prog_CC
+ AC_CHECK_PROGS(CC,gcc rcc,$CC)
+ ;;
+ esac
+ ;;
+(sequent-ptx)
+ TRY_CFLAGS="$TRY_CFLAGS -DSVR4_BSDSELECT -DNO_IOCTL -DUSE_FCNTL"
+ ;;
+(sequent-ptx2)
+ TRY_CFLAGS="$TRY_CFLAGS -DSVR4_BSDSELECT"
+ ;;
+(sony-newsos*)
+ TRY_CFLAGS="$TRY_CFLAGS -I/usr/sony/include"
+ AC_CHECK_HEADERS(jcurses.h)
+ ;;
+(svr4)
+ TRY_CFLAGS="$TRY_CFLAGS -DSVR4_BSDSELECT -DSVR4"
+ ;;
+(sunos3*)
+ TRY_CFLAGS="$TRY_CFLAGS -DSUN"
+ ;;
+(sunos4*)
+ TRY_CFLAGS="$TRY_CFLAGS -DSUN -DSUN4"
+ ;;
+(ultrix*)
+ # Increase the maximum size of functions that will be optimized.
+ test -z "$GCC" && TRY_CFLAGS="$TRY_CFLAGS -O -Olimit 600 -G 7"
+ TRY_CFLAGS="$TRY_CFLAGS -DULTRIX"
+ AC_CHECK_HEADERS(cursesX.h,
+ [AC_DEFINE(HAVE_CURSESX_H,1,[Define to 1 if we have cursesX.h])
+ cf_cv_ncurses_header=cursesX.h])
+ ;;
+esac
+
+case "$host_os" in
+(mingw*)
+ EXTRA_OBJS="$EXTRA_OBJS LYIcon\$o"
+ ;;
+esac
+
+CF_ANSI_CC_REQD
+
+dnl --------------------------------------------------------------------------
+dnl --------------------------------------------------------------------------
+
+CF_HELP_MESSAGE(
+Basic Configuration Options:)
+
+CF_LARGEFILE
+
+dnl --------------------------------------------------------------------------
+dnl internationalization macros
+dnl --------------------------------------------------------------------------
+
+dnl Set of available languages (based on source distribution)
+if test -z "$ALL_LINGUAS" ; then
+ ALL_LINGUAS=`test -d "$srcdir/po" && cd "$srcdir/po" && echo *.po|sed -e 's/\.po//g' -e 's/*//'`
+ AM_PATH_PROG_WITH_TEST(MSGINIT, msginit,
+ ["$ac_dir/$ac_word" --no-translator --version /dev/null >/dev/null 2>&1], :)
+ if test "$MSGINIT" != ":" ; then
+ CF_VERBOSE(adding en.po)
+ ALL_LINGUAS="$ALL_LINGUAS en"
+ fi
+fi
+
+CF_BUNDLED_INTL(makefile,disable)
+
+INTLDIR_CPPFLAGS="#"
+if test -z "$INTLDIR_MAKE" ; then
+ INTLDIR_CPPFLAGS=
+fi
+
+AC_SUBST(INTLDIR_CPPFLAGS)
+
+CF_WITH_PATH(nls-datadir,
+[ --with-nls-datadir=DIR NLS data, parent of locale],
+NLS_DATADIR,
+[PREFIX/DATADIR],
+[$prefix/$DATADIRNAME])
+
+dnl --------------------------------------------------------------------------
+AC_MSG_CHECKING(if you want full utility pathnames)
+CF_ARG_DISABLE(full-paths,
+ [ --disable-full-paths control whether full utility pathnames are used],
+ [with_full_paths=no],
+ [with_full_paths=yes])
+AC_MSG_RESULT($with_full_paths)
+test "$with_full_paths" = no && AC_DEFINE(USE_EXECVP,1,[Define to 1 if you want full utility pathnames])
+
+CF_DEFINE_PROG(system mailer, SYSTEM_MAIL,
+ /usr/mmdf/bin/submit \
+ /usr/sbin/sendmail \
+ /usr/lib/sendmail \
+ )
+CF_SYSTEM_MAIL_FLAGS
+if test -n "$SYSTEM_MAIL" ; then
+if test "$with_full_paths" = no ; then
+ SYSTEM_MAIL=`basename "$SYSTEM_MAIL"`
+fi
+fi
+
+dnl --------------------------------------------------------------------------
+CF_XOPEN_SOURCE(500,199506L)
+CF_SIGWINCH
+
+dnl Collect tests for compiler options into one place
+if test -n "$TRY_CFLAGS" ; then
+ CF_CHECK_CFLAGS($TRY_CFLAGS)
+fi
+
+dnl --------------------------------------------------------------------------
+dnl Checks for library configuration (added right-to-left)
+dnl --------------------------------------------------------------------------
+
+### Look for network libraries first, since some functions (such as gethostname)
+### are used in a lot of places.
+AC_CACHE_CHECK(if you want NSS compatible SSL libraries,cf_cv_use_libnss_compat,[
+AC_ARG_WITH(nss-compat,
+ [ --with-nss-compat{=path} link with nss_compat library if available],
+ [cf_cv_use_libnss_compat=$withval],
+ [cf_cv_use_libnss_compat=no])
+])
+
+AC_CACHE_CHECK(if you want ssl library,cf_cv_use_libssl,[
+AC_ARG_WITH(ssl,
+ [ --with-ssl{=path} link with ssl library if available],
+ [cf_cv_use_libssl=$withval],
+ [cf_cv_use_libssl=no])
+])
+
+AC_CACHE_CHECK(if you want gnutls support,cf_cv_use_libgnutls,[
+AC_ARG_WITH(gnutls,
+ [ --with-gnutls{=path} link with gnutls support],
+ [cf_cv_use_libgnutls=$withval],
+ [cf_cv_use_libgnutls=no])
+])
+
+# this option is mainly for comparing with/without Lynx's wrapper for GNUTLS.
+AC_CACHE_CHECK(if you want gnutls-openssl compat,cf_cv_gnutls_compat,[
+AC_ARG_ENABLE(gnutls-compat,
+ [ --enable-gnutls-compat link with gnutls-openssl compat],
+ [cf_cv_gnutls_compat=$enableval],
+ [cf_cv_gnutls_compat=no])
+])
+
+AC_CACHE_CHECK(if you want socks library,cf_cv_use_libsocks,[
+AC_ARG_WITH(socks,
+ [ --with-socks{=path} link with socks library if available],
+ [cf_cv_use_libsocks=$withval],
+ [cf_cv_use_libsocks=no])
+])
+
+AC_CACHE_CHECK(if you want socks5 library,cf_cv_use_libsocks5,[
+AC_ARG_WITH(socks5,
+ [ --with-socks5{=path} link with socks5 library if available],
+ [cf_cv_use_libsocks5=$withval],
+ [cf_cv_use_libsocks5=no])
+])
+
+if test "x$cf_cv_use_libsocks" != xno ; then
+ CF_SOCKS($cf_cv_use_libsocks)
+elif test "x$cf_cv_use_libsocks5" != xno ; then
+ CF_SOCKS5($cf_cv_use_libsocks5)
+else
+ CF_NETLIBS
+fi
+
+CF_INET_ADDR
+
+CF_PKG_CONFIG
+
+if test "x$cf_cv_use_libssl" != xno ; then
+ CF_SSL($cf_cv_use_libssl)
+elif test "x$cf_cv_use_libgnutls" != xno ; then
+ if test "x$cf_cv_gnutls_compat" = xno ; then
+ CF_GNUTLS($cf_cv_use_libgnutls,tidy_tls\$o)
+ else
+ CF_GNUTLS($cf_cv_use_libgnutls)
+ fi
+elif test "x$cf_cv_use_libnss_compat" != xno ; then
+ CF_NSS_COMPAT($cf_cv_use_libnss_compat)
+fi
+
+dnl --------------------------------------------------------------------------
+### check for ipv6 support
+AC_MSG_CHECKING([whether to enable ipv6])
+CF_ARG_ENABLE(ipv6,
+[ --enable-ipv6 use ipv6 (with ipv4) support],
+ [AC_DEFINE(ENABLE_IPV6,1,[Define to 1 if we should enable ipv6])])
+AC_MSG_RESULT($enableval)
+if test "$enableval" = "yes"; then
+ CF_CHECK_IPV6
+fi
+dnl AC_REPLACE_FUNCS(getaddrinfo getnameinfo)
+
+dnl --------------------------------------------------------------------------
+dnl This has to be cached, since there's a lot of interdependent tests.
+AC_CACHE_CHECK(for screen type, cf_cv_screen,[
+AC_ARG_WITH(screen,
+[ --with-screen=XXX select screen type (XXX is curses (default),
+ ncurses, ncursesw, pdcurses or slang)],
+ [
+case "$withval" in
+(curses|ncurses*|pdcurses|slang)
+ cf_cv_screen=$withval
+ ;;
+(*) AC_ERROR(Unexpected value $withval)
+ ;;
+esac],
+ [cf_cv_screen=curses])])
+
+case "$cf_cv_screen" in
+(curses|ncurses*)
+ CF_WITH_CURSES_DIR
+ ;;
+esac
+
+cf_wide_curses=no
+dft_color_style=yes
+case "$cf_cv_screen" in
+(curses)
+ CF_CURSES_CONFIG
+ CF_CURS_PERFORMANCE
+ CF_CURS_TOUCHLINE
+ ;;
+(ncursesw*)
+ CF_UTF8_LIB
+ CF_NCURSES_CONFIG($cf_cv_screen)
+ cf_wide_curses=yes
+ ;;
+(ncurses*)
+ CF_NCURSES_CONFIG($cf_cv_screen)
+ ;;
+(pdcurses)
+ case "$host_os" in
+ (mingw*)
+ cf_cv_ncurses_header=curses.h
+ ;;
+ (*)
+ cf_cv_ncurses_header=xcurses.h
+ # do this last, since it changes definition of main: CF_PDCURSES_X11
+ ;;
+ esac
+ ;;
+(slang)
+ CF_SLANG_UNIX_DEFS
+ dft_color_style=no
+ ;;
+esac
+
+CF_TRY_RPATH
+
+CF_CURSES_CHTYPE
+
+AC_MSG_CHECKING(if you want the wide-curses features)
+CF_ARG_ENABLE(widec,
+[ --enable-widec enable wide-curses features],
+ [use_wide_curses=$enableval],
+ [use_wide_curses=$cf_wide_curses])
+AC_MSG_RESULT($use_wide_curses)
+
+AC_MSG_CHECKING(if color-style code should be used)
+CF_ARG_DISABLE(color-style,
+[ --disable-color-style use color style (ncurses/curses)],
+ [use_color_style=$enableval],
+ [use_color_style=$dft_color_style])
+
+case "$use_color_style" in
+(no)
+ AC_MSG_RESULT(no)
+ INSTALL_LSS=
+ ;;
+(*)
+ AC_DEFINE(USE_COLOR_STYLE,1,[Define to 1 if we should enable color-style])
+ AC_MSG_RESULT(yes)
+
+ AC_MSG_CHECKING(for location of style-sheet file)
+
+CF_WITH_PATH(lss-file,
+[ --with-lss-file{=path} specify the default style-sheet file
+ ],
+LYNX_LSS_FILE,
+SYSCONFDIR/lynx.lss,
+$sysconfdir/lynx.lss)
+
+ AC_MSG_RESULT($LYNX_LSS_FILE)
+
+ test "$LYNX_LSS_FILE" = no && LYNX_LSS_FILE=
+ AC_DEFINE_UNQUOTED(LYNX_LSS_FILE,"$LYNX_LSS_FILE",[Define to default path for Lynx lss-file])
+
+ INSTALL_LSS=install-lss
+ ;;
+esac
+AC_SUBST(INSTALL_LSS)
+
+dnl --------------------------------------------------------------------------
+
+AC_MSG_CHECKING(for the default configuration-file)
+
+CF_WITH_PATH(cfg-file,
+[ --with-cfg-file{=path} specify the default configuration file
+ ],
+LYNX_CFG_FILE,
+SYSCONFDIR/lynx.cfg,
+$sysconfdir/lynx.cfg)
+
+AC_MSG_RESULT($LYNX_CFG_FILE)
+
+test "$LYNX_CFG_FILE" = no && LYNX_CFG_FILE=
+AC_DEFINE_UNQUOTED(LYNX_CFG_FILE,"$LYNX_CFG_FILE",[Define to default path for Lynx cfg-file])
+
+dnl --------------------------------------------------------------------------
+
+AC_MSG_CHECKING(for the default configuration-path)
+
+CF_WITH_PATH(cfg-path,
+[ --with-cfg-path{=path} specify the default configuration directories
+ ],
+LYNX_CFG_PATH,
+SYSCONFDIR,
+$sysconfdir)
+
+AC_MSG_RESULT($LYNX_CFG_PATH)
+
+test -z "$LYNX_CFG_PATH" && LYNX_CFG_PATH="`echo "$LYNX_CFG_FILE" | sed -e 's%/[[^/]]*$%%'`"
+test "x$LYNX_CFG_PATH" = xno && LYNX_CFG_PATH=
+AC_DEFINE_UNQUOTED(LYNX_CFG_PATH,"$LYNX_CFG_PATH",[Define to default path for Lynx config-files])
+
+dnl --------------------------------------------------------------------------
+AC_MSG_CHECKING(if htmlized lynx.cfg should be built)
+CF_ARG_ENABLE(htmlized-cfg,
+[ --enable-htmlized-cfg build htmlized lynx.cfg],
+ [use_htmlized_cfg=$enableval],
+ [use_htmlized_cfg=no])
+AC_MSG_RESULT($use_htmlized_cfg)
+
+LYNXCFG_MAKE=''
+LYNXCFG_NO_MAKE=''
+if test "$use_htmlized_cfg" = no ; then
+ LYNXCFG_MAKE='#'
+else
+ LYNXCFG_NO_MAKE='#'
+fi
+AC_SUBST(LYNXCFG_MAKE)
+AC_SUBST(LYNXCFG_NO_MAKE)
+
+dnl --------------------------------------------------------------------------
+AC_MSG_CHECKING(if local doc directory should be linked to help page)
+CF_ARG_ENABLE(local-docs,
+[ --enable-local-docs link local doc-directory to help-page],
+ [use_local_docs=$enableval],
+ [use_local_docs=no])
+AC_MSG_RESULT($use_local_docs)
+
+LYNXDOC_MAKE=''
+if test "$use_local_docs" = no ; then
+ LYNXDOC_MAKE='#'
+fi
+AC_SUBST(LYNXDOC_MAKE)
+
+dnl --------------------------------------------------------------------------
+
+AC_MSG_CHECKING(for MIME library directory)
+CF_WITH_PATH(mime-libdir,
+[ --with-mime-libdir=DIR MIME data, mime.types and mailcap],
+MIME_LIBDIR,
+[/etc])
+AC_MSG_RESULT($MIME_LIBDIR)
+MIME_LIBDIR=`echo "$MIME_LIBDIR" | sed -e 's,/$,,' -e 's,$,/,'`
+AC_DEFINE_UNQUOTED(MIME_LIBDIR,"$MIME_LIBDIR",[Define to default path for MIME library])
+
+dnl --------------------------------------------------------------------------
+AC_MSG_CHECKING(if locale-charset selection logic should be used)
+CF_ARG_DISABLE(locale-charset,
+[ --disable-locale-charset use locale-charset selection logic],
+ [use_locale_charset=$enableval],
+ [use_locale_charset=yes])
+AC_MSG_RESULT($use_locale_charset)
+test "$use_locale_charset" != no && AC_DEFINE(USE_LOCALE_CHARSET,1,[Define to 1 if locale-charset selection logic should be used])
+
+dnl --------------------------------------------------------------------------
+dnl Check for subsets of compiled-in tables.
+dnl --------------------------------------------------------------------------
+CHARSET_DEFS=
+AC_SUBST(CHARSET_DEFS)
+
+AC_MSG_CHECKING(if you want only a few charsets)
+AC_ARG_WITH(charsets,
+[ --with-charsets=list limit charsets to given list of MIME names],
+[cf_charsets=$withval],
+[cf_charsets=])
+
+if test -n "$cf_charsets" ; then
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(ALL_CHARSETS,0,[Define to 0 if xxx])
+ cf_min_charsets=us-ascii,iso-8859-1,utf-8
+ if test "$cf_charsets" = "no" ; then
+ cf_charsets=minimal
+ fi
+ if test "$cf_charsets" = "minimal" ; then
+ CF_VERBOSE(using minimal list of charsets: $cf_min_charsets)
+ fi
+ cf_charsets=`echo "$cf_charsets" | sed -e "s/minimal/$cf_min_charsets/g" -e 's/,/ /g'`
+ for cf_charset in $cf_charsets
+ do
+ cf_def_charset=`echo "$cf_charset" | sed -e 's/+/_/g' -e 's/-/_/g'`
+ cf_use_charset=no
+ # check charsets that are defined via .tbl files
+ if ( ${EGREP-egrep} '^M'"$cf_charset"'$' "$srcdir"/src/chrtrans/*.tbl 2>/dev/null >/dev/null )
+ then
+ cf_use_charset=yes
+ # check charsets that are "built-in"
+ else
+ for cf_tst_charset in big5 euc_cn euc_jp euc_kr shift_jis x_transparent
+ do
+ if test "$cf_tst_charset" = "$cf_def_charset"
+ then
+ cf_use_charset=yes
+ break
+ fi
+ done
+ fi
+ if test "$cf_use_charset" = yes
+ then
+ CF_VERBOSE(found $cf_charset)
+ CHARSET_DEFS="-DNO_CHARSET_${cf_def_charset}=0 $CHARSET_DEFS"
+ else
+ CF_VERBOSE(not found $cf_charset)
+ fi
+ done
+else
+ AC_MSG_RESULT(no)
+fi
+
+dnl --------------------------------------------------------------------------
+dnl Checks for standard headers
+dnl --------------------------------------------------------------------------
+
+AC_CHECK_DECL(exit)
+AC_HEADER_TIME
+AC_HEADER_DIRENT
+dnl Don't check for sys/wait.h here since it is covered by another test.
+AC_CHECK_HEADERS( \
+ arpa/inet.h \
+ fcntl.h \
+ limits.h \
+ sys/fcntl.h \
+ sys/filio.h \
+ sys/ioctl.h \
+ sys/param.h \
+ sys/timeb.h \
+ sys/time.h \
+ syslog.h \
+ termio.h \
+ termios.h \
+ vfork.h \
+ wchar.h \
+)
+CF_TERMIO_AND_TERMIOS
+CF_FUNC_SIGACTION
+CF_FUNC_WAIT
+AC_TYPE_GETGROUPS
+AC_TYPE_OFF_T
+AC_TYPE_PID_T
+AC_TYPE_UID_T
+AC_TYPE_MODE_T
+CF_CHECK_TYPE(ssize_t, int)
+CF_CHECK_TYPE(socklen_t, int, [
+#include <sys/types.h>
+#include <sys/socket.h>
+])
+CF_TYPE_LONG_LONG
+CF_TM_GMTOFF
+
+CF_CHECK_SIZEOF(int,4)
+CF_CHECK_SIZEOF(long,4)
+CF_CHECK_SIZEOF(off_t,4)
+CF_CHECK_SIZEOF(size_t,4)
+CF_CHECK_SIZEOF(time_t,4)
+AC_CHECK_TYPE(intptr_t, long)
+
+dnl --------------------------------------------------------------------------
+dnl Checks for library units
+dnl --------------------------------------------------------------------------
+
+AC_FUNC_ALLOCA
+AC_FUNC_VFORK
+CF_FIONBIO
+CF_REMOVE_BROKEN
+CF_FUNC_LSTAT
+CF_FUNC_VASPRINTF
+AC_CHECK_FUNCS( \
+ atoll \
+ ctermid \
+ cuserid \
+ ftime \
+ getcwd \
+ getgroups \
+ gettimeofday \
+ getuid \
+ popen \
+ putenv \
+ readdir \
+ setuid \
+ truncate \
+ ttyname \
+ unsetenv \
+ sleep \
+ usleep \
+ waitpid \
+)
+AC_CHECK_FUNCS( \
+ mkdtemp,,[AC_CHECK_FUNCS(mktemp)]
+)
+AC_REPLACE_FUNCS( \
+ mktime \
+ strstr \
+ wcwidth \
+)
+
+CF_SRAND(lynx_)
+CF_CHECK_FUNCDECLS([
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+], sleep)
+CF_CHECK_FUNCDECLS([#include <string.h>], strstr)
+CF_CHECK_FUNCDECLS([
+#include <stdio.h>
+#include <grp.h>], getgrgid getgrnam)
+
+dnl --------------------------------------------------------------------------
+dnl Checks for external-data
+dnl --------------------------------------------------------------------------
+
+CF_BOOL_DEFS
+CF_ERRNO
+CF_SET_ERRNO
+CF_LOCALE
+CF_NGROUPS
+AC_CHECK_FUNCS(strerror,,[CF_SYS_ERRLIST])
+CF_UTMP
+CF_CHECK_EXTERN_DATA(h_errno,int)
+
+AC_SUBST(EXTRA_OBJS)
+
+dnl --------------------------------------------------------------------------
+dnl Experimental options that don't need to test system features
+dnl --------------------------------------------------------------------------
+
+CF_HELP_MESSAGE(
+Experimental Options:)
+
+dnl --------------------------------------------------------------------------
+AC_MSG_CHECKING(if bibp: URLs should be supported)
+CF_ARG_DISABLE(bibp-urls,
+[ --disable-bibp-urls disable support for bibp: URLs],
+ [use_bibp_urls=$enableval],
+ [use_bibp_urls=yes])
+AC_MSG_RESULT($use_bibp_urls)
+test "$use_bibp_urls" = no && AC_DEFINE(DISABLE_BIBP,1,[Define to 1 if bibp: URLs should be supported])
+
+dnl --------------------------------------------------------------------------
+AC_MSG_CHECKING(if configuration info should be browsable)
+CF_ARG_DISABLE(config-info,
+[ --disable-config-info disable browsable configuration-info],
+ [use_config_info=$enableval],
+ [use_config_info=yes])
+AC_MSG_RESULT($use_config_info)
+test "$use_config_info" = no && AC_DEFINE(NO_CONFIG_INFO,1,[Define to 1 if configuration info should be browsable])
+
+dnl --------------------------------------------------------------------------
+AC_MSG_CHECKING(if new-style forms-based options screen should be used)
+CF_ARG_DISABLE(forms-options,
+[ --disable-forms-options disable forms-based options],
+ [use_forms_options=$enableval],
+ [use_forms_options=yes])
+AC_MSG_RESULT($use_forms_options)
+test "$use_forms_options" = no && AC_DEFINE(NO_OPTION_FORMS,1,[Define to 1 if new-style forms-based options screen should be used])
+
+dnl --------------------------------------------------------------------------
+AC_MSG_CHECKING(if old-style options menu should be used)
+CF_ARG_DISABLE(menu-options,
+[ --disable-menu-options disable old-style option menu],
+ [use_menu_options=$enableval],
+ [use_menu_options=yes])
+AC_MSG_RESULT($use_menu_options)
+test "$use_menu_options" = no && AC_DEFINE(NO_OPTION_MENU,1,[Define to 1 if old-style options menu should be used])
+
+dnl --------------------------------------------------------------------------
+AC_MSG_CHECKING(if sessions code should be used)
+CF_ARG_DISABLE(sessions,
+[ --disable-sessions use sessions code],
+ [use_sessions=$enableval],
+ [use_sessions=yes])
+AC_MSG_RESULT($use_sessions)
+if test "$use_sessions" != no ; then
+ AC_DEFINE(USE_SESSIONS,1,[Define to 1 if sessions code should be used])
+ EXTRA_OBJS="$EXTRA_OBJS LYSession\$o"
+fi
+
+dnl --------------------------------------------------------------------------
+AC_MSG_CHECKING(if session-caching code should be used)
+CF_ARG_DISABLE(session-cache,
+[ --disable-session-cache use session-caching code],
+ [use_session_cache=$enableval],
+ [use_session_cache=yes])
+AC_MSG_RESULT($use_session_cache)
+if test "$use_session_cache" != no ; then
+ AC_DEFINE(USE_CACHEJAR,1,[Define to 1 if session-caching code should be used])
+fi
+
+dnl --------------------------------------------------------------------------
+AC_MSG_CHECKING(if address-list page should be used)
+CF_ARG_DISABLE(addrlist-page,
+[ --disable-addrlist-page disable address-list page],
+ [use_addrlist_page=$enableval],
+ [use_addrlist_page=yes])
+AC_MSG_RESULT($use_addrlist_page)
+test "$use_addrlist_page" != no && AC_DEFINE(USE_ADDRLIST_PAGE,1,[Define to 1 if address-list page should be used])
+
+dnl --------------------------------------------------------------------------
+AC_MSG_CHECKING(if support for CJK should be used)
+CF_ARG_DISABLE(cjk,
+[ --disable-cjk do not use CJK logic],
+ [use_cjk=$enableval],
+ [use_cjk=yes])
+AC_MSG_RESULT($use_cjk)
+test "$use_cjk" != no && AC_DEFINE(CJK_EX,1,[Define to 1 if CJK logic should be used])
+
+use_cjk_utf8=no
+
+AM_ICONV
+if test "x$am_cv_func_iconv" = "xyes"
+then
+
+dnl --------------------------------------------------------------------------
+AC_MSG_CHECKING(if experimental support for Chinese UTF-8 should be used)
+CF_ARG_ENABLE(chinese-utf8,
+[ --enable-chinese-utf8 use Chinese UTF-8 logic],
+ [use_cn_utf8=$enableval],
+ [use_cn_utf8=yes])
+AC_MSG_RESULT($use_cn_utf8)
+if test "$use_cn_utf8" != no ; then
+ AC_DEFINE(EXP_CHINESEUTF8_SUPPORT,1,[Define to 1 if Chinese UTF-8 logic should be used])
+ use_cjk_utf8=yes
+fi
+
+dnl --------------------------------------------------------------------------
+AC_MSG_CHECKING(if support for Japanese UTF-8 should be used)
+CF_ARG_DISABLE(japanese-utf8,
+[ --disable-japanese-utf8 do not use Japanese UTF-8 logic],
+ [use_ja_utf8=$enableval],
+ [use_ja_utf8=yes])
+AC_MSG_RESULT($use_ja_utf8)
+if test "$use_ja_utf8" != no ; then
+ AC_DEFINE(USE_JAPANESEUTF8_SUPPORT,1,[Define to 1 if Japanese UTF-8 logic should be used])
+ use_cjk_utf8=yes
+fi
+
+dnl --------------------------------------------------------------------------
+if test $use_cjk_utf8 = yes
+then
+ if test "$USE_NLS" != yes ; then
+ LIBS="$LIBICONV $LIBS"
+ fi
+fi
+
+else
+ CF_VERBOSE(skipping CJK features which depend on iconv)
+fi
+
+dnl --------------------------------------------------------------------------
+AC_MSG_CHECKING(if experimental wcwidth/UTF-8 logic should be used)
+CF_ARG_ENABLE(wcwidth-support,
+[ --enable-wcwidth-support use experimental wcwidth/UTF-8 logic],
+ [use_wcwidth=$enableval],
+ [use_wcwidth=no])
+AC_MSG_RESULT($use_wcwidth)
+test "$use_wcwidth" != no && AC_DEFINE(EXP_WCWIDTH_SUPPORT,1,[Define to 1 if experimental wcwidth/UTF-8 logic should be used])
+
+dnl --------------------------------------------------------------------------
+use_dft_colors=no
+case "$cf_cv_screen" in
+(curses|slang|ncurses*)
+ use_dft_colors=maybe
+ ;;
+esac
+
+if test "$use_dft_colors" != no ; then
+AC_MSG_CHECKING(if you want to use default-colors)
+CF_ARG_ENABLE(default-colors,
+[ --enable-default-colors enable use of default-colors (ncurses/slang)],
+ [use_dft_colors=yes],
+ [use_dft_colors=no])
+AC_MSG_RESULT($use_dft_colors)
+test "$use_dft_colors" = "yes" && AC_DEFINE(USE_DEFAULT_COLORS,1,[Define to 1 if you want to use default-colors])
+fi
+
+dnl --------------------------------------------------------------------------
+AC_MSG_CHECKING(if experimental keyboard-layout logic should be used)
+CF_ARG_ENABLE(kbd-layout,
+[ --enable-kbd-layout use experimental keyboard-layout support],
+ [use_kbd_layout=$enableval],
+ [use_kbd_layout=no])
+AC_MSG_RESULT($use_kbd_layout)
+test "$use_kbd_layout" != no && AC_DEFINE(EXP_KEYBOARD_LAYOUT,1,[Define to 1 if experimental keyboard-layout logic should be used])
+
+dnl --------------------------------------------------------------------------
+AC_MSG_CHECKING(if experimental nested-table logic should be used)
+CF_ARG_ENABLE(nested-tables,
+[ --enable-nested-tables use experimental nested-table support],
+ [use_nested_tables=$enableval],
+ [use_nested_tables=no])
+AC_MSG_RESULT($use_nested_tables)
+test "$use_nested_tables" != no && AC_DEFINE(EXP_NESTED_TABLES,1,[Define to 1 if experimental nested-table logic should be used])
+
+dnl --------------------------------------------------------------------------
+dnl Miscellaneous options that don't need to test system features
+dnl --------------------------------------------------------------------------
+
+CF_HELP_MESSAGE(
+Miscellaneous Options:)
+
+dnl --------------------------------------------------------------------------
+AC_MSG_CHECKING(if alternative line-edit bindings should be used)
+CF_ARG_DISABLE(alt-bindings,
+[ --disable-alt-bindings disable alternative line-edit bindings],
+ [use_alt_bindings=$enableval],
+ [use_alt_bindings=yes])
+AC_MSG_RESULT($use_alt_bindings)
+test "$use_alt_bindings" != no && AC_DEFINE(USE_ALT_BINDINGS,1,[Define to 1 if alternative line-edit bindings should be used])
+
+dnl --------------------------------------------------------------------------
+AC_MSG_CHECKING(if ascii case-conversion should be used)
+CF_ARG_DISABLE(ascii-ctypes,
+[ --disable-ascii-ctypes disable use of ascii case-conversion],
+ [use_ascii_ctypes=$enableval],
+ [use_ascii_ctypes=yes])
+AC_MSG_RESULT($use_ascii_ctypes)
+test "$use_ascii_ctypes" != no && AC_DEFINE(USE_ASCII_CTYPES,1,[Define to 1 if ascii case-conversion should be used])
+
+dnl --------------------------------------------------------------------------
+AC_MSG_CHECKING(if you want to use extended HTML DTD logic)
+CF_ARG_DISABLE(extended-dtd,
+[ --disable-extended-dtd disable extended HTML DTD logic],
+ [use_ext_htmldtd=no],
+ [use_ext_htmldtd=yes])
+AC_MSG_RESULT($use_ext_htmldtd)
+test "$use_ext_htmldtd" = "no" && AC_DEFINE(NO_EXTENDED_HTMLDTD,1,[Define to 1 if you want to use extended HTML DTD logic])
+
+dnl --------------------------------------------------------------------------
+AC_MSG_CHECKING(if file-upload logic should be used)
+CF_ARG_DISABLE(file-upload,
+[ --disable-file-upload disable file-upload support],
+ [use_file_upload=$enableval],
+ [use_file_upload=yes])
+AC_MSG_RESULT($use_file_upload)
+test "$use_file_upload" != no && AC_DEFINE(USE_FILE_UPLOAD,1,[Define to 1 if file-upload logic should be used])
+
+dnl --------------------------------------------------------------------------
+AC_MSG_CHECKING(if IDNA support should be used)
+CF_ARG_DISABLE(idna,
+[ --disable-idna disable IDNA support],
+ [use_idna=$enableval],
+ [use_idna=yes])
+AC_MSG_RESULT($use_idna)
+
+if test "$use_idna" = yes ; then
+ CF_WITH_IDNA($use_idna)
+fi
+
+dnl --------------------------------------------------------------------------
+AC_MSG_CHECKING(if element-justification logic should be used)
+CF_ARG_DISABLE(justify-elts,
+[ --disable-justify-elts disable element-justification logic],
+ [use_justify_elts=$enableval],
+ [use_justify_elts=yes])
+AC_MSG_RESULT($use_justify_elts)
+test "$use_justify_elts" != no && AC_DEFINE(USE_JUSTIFY_ELTS,1,[Define to 1 if element-justification logic should be used])
+
+dnl --------------------------------------------------------------------------
+AC_MSG_CHECKING(if partial-display should be used)
+CF_ARG_DISABLE(partial,
+[ --disable-partial disable partial-display logic],
+ [use_partial_display=$enableval],
+ [use_partial_display=yes])
+AC_MSG_RESULT($use_partial_display)
+test "$use_partial_display" != no && AC_DEFINE(DISP_PARTIAL,1,[Define to 1 if partial-display should be used])
+
+dnl --------------------------------------------------------------------------
+AC_MSG_CHECKING(if persistent-cookie logic should be used)
+CF_ARG_DISABLE(persistent-cookies,
+[ --disable-persistent-cookies disable persistent-cookie support],
+ [use_filed_cookies=$enableval],
+ [use_filed_cookies=yes])
+AC_MSG_RESULT($use_filed_cookies)
+test "$use_filed_cookies" != no && AC_DEFINE(USE_PERSISTENT_COOKIES,1,[Define to 1 if persistent-cookie logic should be used])
+
+dnl --------------------------------------------------------------------------
+AC_MSG_CHECKING(if html source should be colorized)
+CF_ARG_DISABLE(prettysrc,
+[ --disable-prettysrc disable colorization of HTML source],
+ [use_prettysrc=$enableval],
+ [use_prettysrc=yes])
+AC_MSG_RESULT($use_prettysrc)
+test "$use_prettysrc" != no && AC_DEFINE(USE_PRETTYSRC,1,[Define to 1 if html source should be colorized])
+
+dnl --------------------------------------------------------------------------
+AC_MSG_CHECKING(if progress-bar code should be used)
+CF_ARG_DISABLE(progressbar,
+[ --disable-progressbar disable progress-bar],
+ [use_progressbar=$enableval],
+ [use_progressbar=yes])
+AC_MSG_RESULT($use_progressbar)
+test "$use_progressbar" != no && AC_DEFINE(USE_PROGRESSBAR,1,[Define to 1 if progress-bar code should be used])
+
+dnl --------------------------------------------------------------------------
+AC_MSG_CHECKING(if read-progress message should show ETA)
+CF_ARG_DISABLE(read-eta,
+[ --disable-read-eta disable read-progress message shows ETA],
+ [use_read_eta=$enableval],
+ [use_read_eta=yes])
+AC_MSG_RESULT($use_read_eta)
+test "$use_read_eta" != no && AC_DEFINE(USE_READPROGRESS,1,[Define to 1 if read-progress message should show ETA])
+
+dnl --------------------------------------------------------------------------
+AC_MSG_CHECKING(if source caching should be used)
+CF_ARG_DISABLE(source-cache,
+[ --disable-source-cache do not cache HTML source for parse mode changes],
+ [use_source_cache=$enableval],
+ [use_source_cache=yes])
+AC_MSG_RESULT($use_source_cache)
+test "$use_source_cache" != no && AC_DEFINE(USE_SOURCE_CACHE,1,[Define to 1 if source caching should be used])
+
+dnl --------------------------------------------------------------------------
+AC_MSG_CHECKING(if scrollbar code should be used)
+CF_ARG_DISABLE(scrollbar,
+[ --disable-scrollbar disable scrollbar with mouse],
+ [use_scrollbar=$enableval],
+ [use_scrollbar=yes])
+AC_MSG_RESULT($use_scrollbar)
+
+dnl --------------------------------------------------------------------------
+AC_MSG_CHECKING(if charset-selection logic should be used)
+CF_ARG_ENABLE(charset-choice,
+[ --enable-charset-choice use charset-selection logic],
+ [use_charset_choice=$enableval],
+ [use_charset_choice=no])
+AC_MSG_RESULT($use_charset_choice)
+test "$use_charset_choice" != no && AC_DEFINE(USE_CHARSET_CHOICE,1,[Define to 1 if charset-selection logic should be used])
+
+dnl --------------------------------------------------------------------------
+AC_MSG_CHECKING(if you want to use external commands)
+CF_ARG_ENABLE(externs,
+[ --enable-externs use external commands],
+ [use_externs=yes],
+ [use_externs=no])
+AC_MSG_RESULT($use_externs)
+if test "$use_externs" != "no" ; then
+ AC_DEFINE(USE_EXTERNALS,1,[Define to 1 if you want to use external commands])
+ EXTRA_OBJS="$EXTRA_OBJS LYExtern\$o"
+fi
+
+dnl --------------------------------------------------------------------------
+AC_MSG_CHECKING(if you want to use setfont support)
+CF_ARG_ENABLE(font-switch,
+[ --enable-font-switch use Linux setfont for character-translation],
+ [use_setfont=yes],
+ [use_setfont=no])
+AC_MSG_RESULT($use_setfont)
+if test "$use_setfont" = yes ; then
+ case "$host_os" in
+ (linux*)
+ CF_PATH_PROG(SETFONT, consolechars, setfont)
+ ;;
+ (os2*)
+ SETFONT=built-in
+ CF_VERBOSE(Assume $host_os has font-switching)
+ ;;
+ (*)
+ SETFONT=unknown
+ CF_VERBOSE(Assume $host_os has no font-switching)
+ ;;
+ esac
+ if test -z "$SETFONT" ; then
+ AC_MSG_WARN(Cannot find a font-setting program)
+ elif test "$SETFONT" != unknown ; then
+ AC_DEFINE(EXP_CHARTRANS_AUTOSWITCH,1,[Define to 1 if you want to use setfont support])
+ fi
+fi
+
+dnl --------------------------------------------------------------------------
+AC_MSG_CHECKING(if you want cgi-link support)
+CF_ARG_ENABLE(cgi-links,
+[ --enable-cgi-links support cgi links w/o a http daemon],
+ [AC_DEFINE(LYNXCGI_LINKS,1,[Define to 1 if you want cgi-link support])])
+AC_MSG_RESULT($enableval)
+
+dnl --------------------------------------------------------------------------
+AC_MSG_CHECKING(if you want change-exec support)
+CF_ARG_ENABLE(change-exec,
+[ --enable-change-exec allow users to change exec options],
+ [use_change_exec=yes],
+ [use_change_exec=no])
+AC_MSG_RESULT($use_change_exec)
+test "$use_change_exec" = yes && AC_DEFINE(ENABLE_OPTS_CHANGE_EXEC,1,[Define to 1 if you want change-exec support])
+
+dnl --------------------------------------------------------------------------
+AC_MSG_CHECKING(if you want exec-links support)
+CF_ARG_OPTION(exec-links,
+[ --enable-exec-links allow lynx to execute programs accessed via a link],
+ [use_exec_links=$enableval],
+ [use_exec_links=$enableval],
+ [$use_change_exec])
+AC_MSG_RESULT($use_exec_links)
+test "$use_exec_links" = yes && AC_DEFINE(EXEC_LINKS,1,[Define to 1 if you want exec-links support])
+
+dnl --------------------------------------------------------------------------
+AC_MSG_CHECKING(if you want exec-scripts support)
+CF_ARG_OPTION(exec-scripts,
+[ --enable-exec-scripts allow lynx to execute programs inferred from a link],
+ [use_exec_scripts=$enableval],
+ [use_exec_scripts=$enableval],
+ [$use_change_exec])
+AC_MSG_RESULT($use_exec_scripts)
+test "$use_exec_scripts" = yes && AC_DEFINE(EXEC_SCRIPTS,1,[Define to 1 if you want exec-scripts support])
+
+dnl --------------------------------------------------------------------------
+AC_MSG_CHECKING(if you want internal-links feature)
+CF_ARG_ENABLE(internal-links,
+[ --enable-internal-links handle following links to same doc differently],
+ [use_internal_links=yes],
+ [use_internal_links=no])
+AC_MSG_RESULT($use_internal_links)
+test "$use_internal_links" = yes && AC_DEFINE(TRACK_INTERNAL_LINKS,1,[Define to 1 if you want internal-links feature])
+
+dnl --------------------------------------------------------------------------
+AC_MSG_CHECKING(if you want to fork NSL requests)
+CF_ARG_ENABLE(nsl-fork,
+[ --enable-nsl-fork fork NSL requests, allowing them to be aborted],
+ [use_nsl_fork=yes],
+ [use_nsl_fork=no])
+AC_MSG_RESULT($use_nsl_fork)
+if test "$use_nsl_fork" = yes ; then
+ case "$host_os" in
+ (mingw*)
+ AC_DEFINE(_WINDOWS_NSL,1,[Define to 1 if we want NSL-fork with Windows])
+ ;;
+ (*)
+ AC_DEFINE(NSL_FORK,1,[Define to 1 if we want NSL-fork])
+ ;;
+ esac
+fi
+
+dnl --------------------------------------------------------------------------
+AC_MSG_CHECKING(if you want to log URL requests via syslog)
+CF_ARG_ENABLE(syslog,
+[ --enable-syslog log URL requests via syslog],
+ [use_syslog=yes],
+ [use_syslog=no])
+AC_MSG_RESULT($use_syslog)
+test "$use_syslog" = yes && AC_DEFINE(SYSLOG_REQUESTED_URLS,1,[Define to 1 if you want to log URL requests via syslog])
+
+dnl --------------------------------------------------------------------------
+AC_MSG_CHECKING(if you want to underline links)
+CF_ARG_ENABLE(underlines,
+[ --enable-underlines underline links rather than using boldface],
+ [use_underline=yes],
+ [use_underline=no])
+AC_MSG_RESULT($use_underline)
+test "$use_underline" = yes && AC_DEFINE(UNDERLINE_LINKS,1,[Define to 1 if xxx])
+test "$use_underline" = no && AC_DEFINE(UNDERLINE_LINKS,0,[Define to 0 if xxx])
+
+dnl --------------------------------------------------------------------------
+AC_MSG_CHECKING(if help files should be gzip'ed)
+CF_ARG_ENABLE(gzip-help,
+[ --enable-gzip-help install gzip'ed help files],
+ [use_gzip_help=$enableval],
+ [use_gzip_help=no])
+AC_MSG_RESULT($use_gzip_help)
+
+dnl --------------------------------------------------------------------------
+AC_MSG_CHECKING(if you want to use libbz2 for decompression of some bzip2 files)
+AC_ARG_WITH(bzlib,
+[ --with-bzlib use libbz2 for decompression of some bzip2 files],
+ [use_bzlib=$withval],
+ [use_bzlib=no])
+AC_MSG_RESULT($use_bzlib)
+
+if test ".$use_bzlib" != ".no" ; then
+ CF_WITH_BZLIB($use_bzlib)
+ test "x$cf_cv_find_linkage_bz2" = "xyes" && AC_DEFINE(USE_BZLIB,1,[Define to 1 if you want to use libbz2 for decompression of some bzip2 files])
+fi
+
+dnl --------------------------------------------------------------------------
+AC_MSG_CHECKING(if you want to use zlib for decompression of some gzip files)
+AC_ARG_WITH(zlib,
+[ --with-zlib use zlib for decompression of some gzip files],
+ [use_zlib=$withval],
+ [use_zlib=no])
+AC_MSG_RESULT($use_zlib)
+
+if test ".$use_zlib" != ".no" ; then
+ CF_WITH_ZLIB($use_zlib)
+ test "x$cf_cv_find_linkage_z" = "xyes" && AC_DEFINE(USE_ZLIB,1,[Define to 1 if you want to use zlib for decompression of some gzip files])
+fi
+
+dnl --------------------------------------------------------------------------
+AC_MSG_CHECKING(if you want to use brotli decompression)
+AC_ARG_WITH(brotli,
+[ --with-brotli use brotli decompression],
+ [use_brotli=$withval],
+ [use_brotli=no])
+AC_MSG_RESULT($use_brotli)
+
+if test ".$use_brotli" != ".no" ; then
+ CF_WITH_BROTLI($use_brotli)
+ test "x$cf_cv_find_linkage_brotlidec" = "xyes" && AC_DEFINE(USE_BROTLI,1,[Define to 1 if you want to use libbrotli decompression])
+fi
+
+dnl --------------------------------------------------------------------------
+CF_HELP_MESSAGE(
+Other Network Services:)
+
+dnl --------------------------------------------------------------------------
+AC_MSG_CHECKING(if you want to exclude FINGER code)
+CF_ARG_DISABLE(finger,
+[ --disable-finger disable FINGER logic],
+ [use_finger=yes],
+ [use_finger=no])
+AC_MSG_RESULT($use_finger)
+test "$use_finger" != "no" && AC_DEFINE(DISABLE_FINGER,1,[Define to 1 if you want to exclude FINGER code])
+
+dnl --------------------------------------------------------------------------
+AC_MSG_CHECKING(if you want to exclude GOPHER code)
+CF_ARG_DISABLE(gopher,
+[ --disable-gopher disable GOPHER logic],
+ [use_gopher=yes],
+ [use_gopher=no])
+AC_MSG_RESULT($use_gopher)
+test "$use_gopher" != "no" && AC_DEFINE(DISABLE_GOPHER,1,[Define to 1 if you want to exclude GOPHER code])
+
+dnl --------------------------------------------------------------------------
+AC_MSG_CHECKING(if you want to exclude NEWS code)
+CF_ARG_DISABLE(news,
+[ --disable-news disable NEWS logic],
+ [use_news=yes],
+ [use_news=no])
+AC_MSG_RESULT($use_news)
+test "$use_news" != "no" && AC_DEFINE(DISABLE_NEWS,1,[Define to 1 if you want to exclude NEWS code])
+
+dnl --------------------------------------------------------------------------
+AC_MSG_CHECKING(if you want to exclude FTP code)
+CF_ARG_DISABLE(ftp,
+[ --disable-ftp disable FTP logic],
+ [use_ftp=yes],
+ [use_ftp=no])
+AC_MSG_RESULT($use_ftp)
+test "$use_ftp" != "no" && AC_DEFINE(DISABLE_FTP,1,[Define to 1 if you want to exclude FTP code])
+
+dnl --------------------------------------------------------------------------
+AC_MSG_CHECKING(if you want to include WAIS code)
+CF_ARG_ENABLE(wais,
+[ --enable-wais enable WAIS logic],
+ [use_wais=yes],
+ [use_wais=no])
+AC_MSG_RESULT($use_wais)
+
+MAKE_WAIS="#"
+if test "$use_wais" != "no"
+then
+ AC_CHECK_LIB(wais,fs_free,[
+ CF_MATH_LIB
+ CF_ADD_LIB(wais)
+ AC_CHECK_HEADERS(wais.h)
+ MAKE_WAIS=
+ ],[AC_MSG_WARN(could not find WAIS library)])
+fi
+AC_SUBST(MAKE_WAIS)
+
+dnl --------------------------------------------------------------------------
+dnl DirEd (directory-editor) options
+dnl --------------------------------------------------------------------------
+
+CF_HELP_MESSAGE(
+Directory Editor Options:)
+
+# All DirEd functions that were enabled on compilation can be disabled
+# or modified at run time via DIRED_MENU symbols in lynx.cfg.
+AC_MSG_CHECKING(if directory-editor code should be used)
+CF_ARG_DISABLE(dired,
+[ --disable-dired disable optional directory-editor, DirEd],
+ [use_dired=$enableval],
+ [use_dired=yes])
+AC_MSG_RESULT($use_dired)
+
+if test ".$use_dired" != ".no" ; then
+ EXTRA_OBJS="$EXTRA_OBJS LYLocal\$o"
+ AC_DEFINE(DIRED_SUPPORT,1,[Define to 1 if we want dired support])
+
+ AC_MSG_CHECKING(if you wish to allow extracting from archives via DirEd)
+ CF_ARG_DISABLE(dired-dearchive,
+ [ --disable-dired-dearchive disable dearchiving commands],[AC_DEFINE(ARCHIVE_ONLY,1,[Define to 1 if you wish to allow extracting from archives via DirEd])])
+ AC_MSG_RESULT($enableval)
+
+ AC_MSG_CHECKING(if DirEd mode should override keys)
+ CF_ARG_DISABLE(dired-override,
+ [ --disable-dired-override disable DirEd override keymap],,[AC_DEFINE(OK_OVERRIDE,1,[Define to 1 if DirEd mode should override keys])])
+ AC_MSG_RESULT($enableval)
+
+ AC_MSG_CHECKING(if you wish to allow permissions commands via DirEd)
+ CF_ARG_DISABLE(dired-permit,
+ [ --disable-dired-permit disable chmod/attrib commands],,[AC_DEFINE(OK_PERMIT,1,[Define to 1 if you wish to allow permissions commands via DirEd])])
+ AC_MSG_RESULT($enableval)
+
+ AC_MSG_CHECKING(if you wish to allow executable-permission commands via DirEd)
+ CF_ARG_DISABLE(dired-xpermit,
+ [ --disable-dired-xpermit disable chmod/attrib commands],[AC_DEFINE(NO_CHANGE_EXECUTE_PERMS,1,[Define to 1 if you wish to allow executable-permission commands via DirEd])])
+ AC_MSG_RESULT($enableval)
+
+ AC_MSG_CHECKING(if you wish to allow "tar" commands from DirEd)
+ CF_ARG_DISABLE(dired-tar,
+ [ --disable-dired-tar disable "tar" command],,[AC_DEFINE(OK_TAR,1,[Define to 1 if if you wish to allow "tar" commands from DirEd])])
+ AC_MSG_RESULT($enableval)
+
+ AC_MSG_CHECKING(if you wish to allow "uudecode" commands from DirEd)
+ CF_ARG_DISABLE(dired-uudecode,
+ [ --disable-dired-uudecode disable "uudecode" command],,[AC_DEFINE(OK_UUDECODE,1,[Define to 1 if you wish to allow "uudecode" commands from DirEd])])
+ AC_MSG_RESULT($enableval)
+
+ AC_MSG_CHECKING(if you wish to allow "zip" and "unzip" commands from DirEd)
+ CF_ARG_DISABLE(dired-zip,
+ [ --disable-dired-zip disable "zip", "unzip" commands],,[AC_DEFINE(OK_ZIP,1,[Define to 1 if you wish to allow "zip" and "unzip" commands from DirEd])])
+ AC_MSG_RESULT($enableval)
+
+ AC_MSG_CHECKING(if you wish to allow "gzip" and "gunzip" commands from DirEd)
+ CF_ARG_DISABLE(dired-gzip,
+ [ --disable-dired-gzip disable "gzip", "gunzip" commands],,[AC_DEFINE(OK_GZIP,1,[Define to 1 if you wish to allow "gzip" and "gunzip" commands from DirEd])])
+ AC_MSG_RESULT($enableval)
+fi
+
+dnl --------------------------------------------------------------------------
+AC_MSG_CHECKING(if you want long-directory listings)
+CF_ARG_DISABLE(long-list,
+[ --disable-long-list disable long "ls -l" directory listings],,
+ [AC_DEFINE(LONG_LIST,1,[Define to 1 if you want long-directory listings])])
+AC_MSG_RESULT($enableval)
+
+dnl --------------------------------------------------------------------------
+AC_MSG_CHECKING(if parent-directory references are permitted)
+CF_ARG_DISABLE(parent-dir-refs,
+[ --disable-parent-dir-refs
+ disable "Up-to" links in directory listings],
+ [AC_DEFINE(NO_PARENT_DIR_REFERENCE,1,[Define to 1 if parent-directory references are permitted])])
+AC_MSG_RESULT($enableval)
+
+dnl --------------------------------------------------------------------------
+CF_PATH_PROG(TELNET, telnet)
+CF_PATH_PROG(TN3270, tn3270)
+CF_PATH_PROG(RLOGIN, rlogin)
+
+CF_PATH_PROG(MV, mv)
+
+CF_PATH_PROG(GZIP, gzip)
+CF_PATH_PROG(UNCOMPRESS,gunzip)
+CF_PATH_PROG(UNZIP, unzip)
+CF_PATH_PROG(BZIP2, bzip2)
+CF_PATH_PROG(BROTLI, brotli)
+
+CF_PATH_PROG(TAR, tar, pax gtar gnutar bsdtar star)
+CF_TAR_OPTIONS($TAR)
+AC_DEFINE_UNQUOTED(TAR_UP_OPTIONS, "$TAR_UP_OPTIONS",[Define to command for tar'ing up files])
+AC_DEFINE_UNQUOTED(TAR_DOWN_OPTIONS, "$TAR_DOWN_OPTIONS",[Define to command for untar'ing files])
+AC_DEFINE_UNQUOTED(TAR_FILE_OPTIONS, "$TAR_FILE_OPTIONS",[Define to options for tar to work with files])
+AC_DEFINE_UNQUOTED(TAR_PIPE_OPTIONS, "$TAR_PIPE_OPTIONS",[Define to options for tar to work with pipes])
+
+dnl --------------------------------------------------------------------------
+dnl Test features that rely on configure-definitions
+dnl --------------------------------------------------------------------------
+if test ".$use_dired" != ".no" ; then
+
+CF_PATH_PROG(COMPRESS, compress)
+CF_PATH_PROG(RM, rm)
+CF_PATH_PROG(UUDECODE, uudecode)
+CF_PATH_PROG(ZCAT, zcat)
+CF_PATH_PROG(ZIP, zip)
+
+dnl 'INSTALL' is a special case, since the configure script has to find a
+dnl BSD-compatible one so the build/install works properly.
+case "$INSTALL" in
+($srcdir*)
+ AC_DEFINE_UNQUOTED(INSTALL_PATH,"install")
+ ;;
+(*)
+ cf_save_INSTALL="$INSTALL"
+ CF_PATH_PROG(INSTALL, install)
+ INSTALL="$cf_save_INSTALL"
+ ;;
+esac
+fi
+
+COMPRESS_PROG=
+COMPRESS_EXT=
+if test "$use_gzip_help" = yes ; then
+ COMPRESS_PROG="$ac_cv_path_GZIP -9 -n"
+ COMPRESS_EXT=.gz
+fi
+AC_SUBST(COMPRESS_PROG)
+AC_SUBST(COMPRESS_EXT)
+
+if test "$cf_cv_screen" = pdcurses ; then
+ CF_HELP_MESSAGE(Special Libraries for PDCurses X11:)
+ case "$host_os" in
+ (mingw*)
+ CF_PDCURSES_W32
+ ;;
+ (*)
+ CF_PDCURSES_X11
+ ;;
+ esac
+else
+ CF_TERMIO_AND_CURSES(LYCurses.h,lynx_cfg.h)
+fi
+
+### These tests must be run after establishing the curses library.
+if test "$cf_cv_screen" != slang ; then
+ if test "$cf_cv_screen" != pdcurses ; then
+ AC_CHECK_HEADERS($cf_cv_screen/term.h term.h)
+ fi
+ CF_ALT_CHAR_SET
+ CF_FANCY_CURSES
+ CF_FUNC_CURSES_VERSION
+ CF_NCURSES_BROKEN
+ CF_COLOR_CURSES
+ CF_SIZECHANGE
+ CF_TTYTYPE
+ if test "$use_wide_curses" = yes ; then
+ CF_WIDEC_CURSES
+ fi
+ CF_CURSES_FUNCS( \
+ assume_default_colors \
+ cbreak \
+ define_key \
+ delscreen \
+ getattrs \
+ getbegx \
+ getbegy \
+ keypad \
+ napms \
+ newpad \
+ newterm \
+ pnoutrefresh \
+ resizeterm \
+ touchline \
+ touchwin \
+ use_default_colors \
+ use_legacy_coding \
+ wattr_get \
+ wborder \
+ wredrawln \
+ wresize \
+ )
+ AC_CHECK_FUNCS( \
+ curses_exit \
+ _nc_free_and_exit \
+ _nc_freeall \
+ )
+fi
+
+if test "$use_color_style" != no ; then
+ if test .$cf_cv_color_curses != .yes ; then
+ AC_ERROR(Configuration does not support color-styles)
+ fi
+ if test "$cf_cv_screen" = slang ; then
+ AC_ERROR(Configuration does not support color-styles)
+ fi
+fi
+
+if test "$use_scrollbar" != no ; then
+ if test .$cf_cv_fancy_curses != .yes ; then
+ AC_MSG_WARN(Configuration does not support ACS_xxx definitions)
+ else
+ AC_DEFINE(USE_SCROLLBAR,1,[Define to 1 if configuration supports ACS_xxx definitions])
+ fi
+fi
+
+# use rpath for libraries in unusual places
+CF_DISABLE_RPATH_HACK
+
+CF_MERGE_EXTRA_CFLAGS
+
+### Finally, build config.h and the makefiles
+test -z "$CONFIG_SHELL" && CONFIG_SHELL=/bin/sh
+AC_SUBST(CONFIG_SHELL)
+
+srcdir="$srcdir"
+SRCDIR_CLEAN="#"
+if test -n "$srcdir" ; then
+ echo "srcdir is $srcdir"
+ mkdir -p WWW/Library/Implementation
+ mkdir -p src/chrtrans
+ test "$USE_INCLUDED_LIBINTL" = yes && mkdir -p intl
+ test "$srcdir" != "." && SRCDIR_CLEAN=""
+fi
+
+HOMEPAGE_URL="https://lynx.invisible-island.net/"
+AC_DEFINE_UNQUOTED(HOMEPAGE_URL,"$HOMEPAGE_URL",[Define to Lynx homepage URL])
+AC_SUBST(HOMEPAGE_URL)
+
+AC_SUBST(SRCDIR_CLEAN)
+AC_OUTPUT(
+ [makefile \
+ WWW/Library/Implementation/makefile \
+ src/makefile \
+ src/chrtrans/makefile \
+ $SUB_MAKEFILE
+ ],[
+ if test "$USE_NLS" = yes ; then
+ if test "$use_our_messages" = yes ; then
+ echo "creating po/makefile"
+ rm -f po/temp$$
+ sed -e 's%^.*LYMessages.c% ../LYMessages.c%' \
+ -e '$s/\\//' po/POTFILES >po/temp$$
+ sed -e "/POTFILES =/r po/temp$$" \
+ po/makefile.in > po/makefile
+ rm -f po/temp$$
+ fi
+ fi
+ ],[
+ USE_NLS=$USE_NLS
+ use_our_messages=$use_our_messages
+ ]
+)
diff --git a/descrip.mms b/descrip.mms
new file mode 100644
index 0000000..51614bd
--- /dev/null
+++ b/descrip.mms
@@ -0,0 +1,123 @@
+! Make LYNX hypertext browser under VMS
+! =====================================
+!
+! NOTE: Use [.SRC.CHRTRANS]BUILD-CHRTRANS.COM to create the
+! chrtrans header files before using this descrip.mms.
+!
+! History:
+! 01/01/93 creation at KU (Lou montulli@ukanaix.cc.ukans.edu).
+! 04/12/93 (seb@lns61.tn.cornell.edu)
+! modified to support either UCX or MULTINET
+! 12/13/93 (macrides@sci.wfeb.edu)
+! Added conditional compilations for VAXC vs. DECC
+! (dependencies not yet specified; this is just a
+! "starter", should anyone want to do it well).
+! 10/26/94 (dyson@IowaSP.Physics.UIowa.EDU) RLD
+! Updated for AXP/VMS v6.1 and VAX/VMS v5.5-1
+! 12/07/94 (macrides@sci.wfeb.edu)
+! Updated for DECC/VAX, VAXC/VAX and DECC/AXP
+! 02/17/95 (macrides@sci.wfeb.edu)
+! Updated for v2.3-FM
+! 03/23/95 (macrides@sci.wfeb.edu)
+! Replaced references to v2.3.8 or v2.3.9 with v2.3-FM to
+! avoid any confusion with official releases at UKans.
+! 07/29/95 (macrides@sci.wfeb.edu)
+! Added support for GNUC.
+! 15 Sep 06 (TD) Cleanup...
+!
+! Instructions:
+! Use the correct command line for your TCP/IP implementation:
+!
+! $ MMS /Macro = (MULTINET=1) for VAXC - MultiNet
+! $ MMS /Macro = (WIN_TCP=1) for VAXC - Wollongong TCP/IP
+! $ MMS /Macro = (UCX=1) for VAXC - UCX
+! $ MMS /Macro = (CMU_TCP=1) for VAXC - OpenCMU TCP/IP
+! $ MMS /Macro = (SOCKETSHR_TCP=1) for VAXC - SOCKETSHR/NETLIB
+! $ MMS /Macro = (TCPWARE=1) for VAXC - TCPWare TCP/IP
+! $ MMS /Macro = (DECNET=1) for VAXC - socket emulation over DECnet
+!
+! $ MMS /Macro = (MULTINET=1, DEC_C=1) for DECC - MultiNet
+! $ MMS /Macro = (WIN_TCP=1, DEC_C=1) for DECC - Wollongong TCP/IP
+! $ MMS /Macro = (UCX=1, DEC_C=1) for DECC - UCX
+! $ MMS /Macro = (CMU_TCP=1, DEC_C=1) for DECC - OpenCMU TCP/IP
+! $ MMS /Macro = (SOCKETSHR_TCP=1,DEC_C=1) for DECC - SOCKETSHR/NETLIB
+! $ MMS /Macro = (TCPWARE=1, DEC_C=1) for DECC - TCPWare TCP/IP
+! $ MMS /Macro = (DECNET=1, DEC_C=1) for DECC - socket emulation over DECnet
+!
+! $ MMS /Macro = (MULTINET=1, GNU_C=1) for GNUC - MultiNet
+! $ MMS /Macro = (WIN_TCP=1, GNU_C=1) for GNUC - Wollongong TCP/IP
+! $ MMS /Macro = (UCX=1, GNU_C=1) for GNUC - UCX
+! $ MMS /Macro = (CMU_TCP=1, GNU_C=1) for GNUC - OpenCMU TCP/IP
+! $ MMS /Macro = (SOCKETSHR_TCP=1,GNU_C=1) for GNUC - SOCKETSHR/NETLIB
+! $ MMS /Macro = (TCPWARE=1, GNU_C=1) for GNUC - TCPWare TCP/IP
+! $ MMS /Macro = (DECNET=1, GNU_C=1) for GNUC - socket emulation over DECnet
+
+.ifdef DEC_C
+COMPILE_DEF = DEC_C
+.else
+.ifdef GNU_C
+COMPILE_DEF = GNU_C
+.else
+COMPILE_DEF = VAX_C
+.endif
+.endif
+
+.ifdef SLANG
+SCREEN_DEF = SLANG
+.else
+SCREEN_DEF = VMS_CURSES
+.endif
+
+.ifdef WIN_TCP
+NETWORK_DEF = WIN_TCP
+.else
+.ifdef CMU_TCP
+NETWORK_DEF = CMU_TCP
+.else
+.ifdef SOCKETSHR_TCP
+NETWORK_DEF = SOCKETSHR_TCP
+.else
+.ifdef UCX
+NETWORK_DEF = UCX
+.else
+.ifdef TCPWARE
+NETWORK_DEF = TCPWARE
+.else
+.ifdef DECnet
+NETWORK_DEF = DECNET
+.else ! Default to MultiNet
+NETWORK_DEF = MULTINET
+.endif ! DECnet
+.endif ! TCPWARE
+.endif ! UCX
+.endif ! SOCKETSHR_TCP
+.endif ! CMU_TCP
+.endif ! WIN_TCP
+
+RECURS_DEFS = /Macro=($(NETWORK_DEF)=1, $(SCREEN_DEF)=1, $(COMPILE_DEF)=1)
+
+lynx : lynx.exe
+ ! Finished Building LYNX for VMS!!!
+
+lynx.exe : library exe
+ @ Continue
+
+library :
+ Set Default [.www.library.implementation]
+ $(MMS) $(MMSQUALIFIERS) /Description = [-.VMS]DESCRIP.MMS $(RECURS_DEFS) Library
+ Set Default [---]
+
+exe :
+ Set Default [.src]
+ $(MMS) $(MMSQUALIFIERS) $(RECURS_DEFS) Lynx
+ Copy /NoLog /NoConfirm lynx.exe [-];
+ Set Default [-]
+
+clean :
+ Set Default [.www.library.implementation]
+ $(MMS) $(MMSQUALIFIERS) /Description = [-.VMS]DESCRIP.MMS clean
+ Set Default [---]
+ Set Default [.src]
+ $(MMS) $(MMSQUALIFIERS) clean
+ Set Default [-]
+ - Purge /NoLog /NoConfirm
diff --git a/docs/CHANGES2.3 b/docs/CHANGES2.3
new file mode 100644
index 0000000..574ea29
--- /dev/null
+++ b/docs/CHANGES2.3
@@ -0,0 +1,458 @@
+--- RELEASE of 2.3 (19-May-1994) ---
+5-19-94
+* Better memory allocation routines used for some VMS systems.
+5-19-94
+* Non-interactive (-source) access to documents requiring access authorization
+ not allowed to avoid crashes.
+3-30-94
+* Lynx exports the environment variable LYNX_VERSION on UNIX systems
+ with the current version number as the value.
+3-29-94
+* added "action=" handling to ISINDEX tags. (Is that in the spec?)
+3-27-94
+* fixed Telnet security problem
+3-19-94
+* added .mailcap and mailcap support as well as mime.types support
+ for the configuration of viewers and extension mappings.
+ The test command is now implemented so that viewers can be conditionally
+ setup.
+3-17-94
+* Revamped the FTP code to recognize different server types and to parse
+ full directory listings (LIST output). File types, sizes and dates
+ are displayed when possible.
+3-16-94
+* added transparent support for mosaic bookmark files. Just point
+ Lynx at your existing default mosaic bookmark file and Lynx will
+ handle the rest. Viewing, addition, and removal are supported.
+3-15-94
+* added second line of reverse video to show multiline links better.
+3-10-94
+* added configurable MIME types and viewers to lynx.cfg. MIME types
+ and VIEWERS can be configured by following the instructions within
+ the newest lynx.cfg file.
+3-?-94
+* added second %s argument to PRINTER and DOWNLOADER definitions.
+ If a second %s is present in the command definition it will be
+ filled in by a suggested filename which is derived from the URL
+ of the document. See lynx.cfg for more details.
+3-?-94
+* got code from CERN to fix HTBTree FTP bug. Large ftp lists should
+ not crash anymore.
+3-9-94
+* added no_proxy environment variable. set it to a comma delimited list
+ of domains or hosts that should not be proxyed. (Thanks CERN :)
+ USAGE: (UNIX)
+ setenv no_proxy "domain1.dom, domain2.dom, domain3, etc"
+3-?-94
+* Fixed Referer: field handling so that it doesn't crash on really
+ long URL's
+3-?-94
+* True popup menus are now supported for non-multiple SELECT lists.
+2-28-94
+* fixed the delete-a-bookmark command and bound it to 'r' for remove.
+ (thanks to David Trueman for the fix)
+
+---------- RELEASE of 2.2 ------------------
+2-9-94
+* added 'd' for download current link. Can be used to force a download
+ of any file.
+* 'r' removed as a comment key. Use 'c' or reconfigure your keys to
+ add 'r' back in. (I would like to use 'r' in the future to mean
+ remove current bookmark link)
+* Found the bug in the HTTP redirection code that was causing it
+ not to work. So HTTP redirection appears to work now!
+* Added Referer: header to HTTP requests to list the URL of
+ the document listing the requested URL. Here's an extract from CERN:
+ This optional header field allows the client to specify,
+ for the server's benefit, the address ( URI ) of the document
+ (or element within the document) from which the URI in the
+ request was obtained.
+
+ This allows a server to generate lists of back-links to documents,
+ for interest, logging, etc. It allows bad links to be traced
+ for maintenance.
+
+2-8-94
+* changed novice line to be displayed on bottom two lines with the
+ status line moved up two lines.
+1-27-94
+* Made configurable keymappings a reality. Keys can be remapped in
+ the lynx.cfg file. (diffs from David Trueman)
+* Got code from Foteos to make 'a' work for VMS connection interrupts.
+1-24-94
+* Moving closer towards configurable keymappings. New keyhandleing
+ code will make it very easy to implement. (diffs from David Trueman)
+1-14-94
+* Lynx FTP now supports PASV code. (fixes to CERN (Dave Raggert?) PASV code
+ from John Ellson) It is not enabled by default. Line 43 in
+ WWW/Library/Implementation/HTFTP must be commented out for
+ PASV code to be used. This was done because not all FTP sites
+ can support PASV FTP.
+1-13-94
+* slight change in forms user interface. For the better, I hope you will
+ agree. Text input fields are now active as soon as the cursor pointer
+ is over them. Therefore you may begin typing into the text field
+ as soon as you come to it. Tab, and up and down arrow keys will
+ move off of the text input field. The only problem with this is as
+ follows. If you are in the habit of using the number keys (keypad)
+ the or h,j,k,l vi keys, as soon as you move over the text link
+ you will begin seeing numbers or hjk or l show up in the text field.
+ In other words, your movement commands are now broken :( You must
+ use true arrow keys or the tab key to move off of the text field.
+ I've tried this out and it seems to work alright. I don't think
+ that users unfamiliar with this will have too hard a time figureing
+ it out. Once you see numbers or letter appearing it becomes fairly
+ obvious what's going on. I'll put a message at the bottom of the
+ screen saying "use tab or arrow keys to move off of link."
+* added mods by David Trueman to implement -restrictions commandline
+ option. -restrictions allows a list of services to be disabled
+ selectively. -restrictions takes the form of
+ "lynx -restrictions=[default],[all],[inside_telnet],[outside_telnet],[shell],\
+ [editor],[bookmark],[option_save],[print],[file_url],[download],[exec]"
+
+ all restricts all options.
+ default same as commandline option -anonymous. Disables
+ default services for anonymous users. Currently set to,
+ all restricted except for: inside_telnet, outside_telnet, and
+ goto. Defaults settable within userdefs.h
+ inside_telnet disallow telnets for people coming from inside your
+ domain.
+ outside_telnet disallow telnets for people coming from outside your
+ domain.
+ shell disallow shell escapes
+ editor disallow editing
+ bookmark disallow changing the location of the bookmark file.
+ options_save disallow saving options in .lynxrc
+ print disallow most print options
+ goto disable the 'g' (goto) command.
+ file_url disallow using G)oto to go to file: URL's
+ download disallow saving binary files to disk in the download menu.
+ exec disable execution scripts
+ exec_frozen disallow the user from changing the execution link
+ setting in the O)ptions menu.
+1-12-93
+* added new more informative messages for form links.
+1-11-93
+* fixed -dump and -source options so that they work for
+ binary files now.
+* Interruptible I/0 now completely works for UNIX systems.
+ VMS is next. Just hit an 'a' for abort anytime during a
+ transfer to abort. If there is a partial file to show, it
+ will be shown.
+* Added command line option -show_cursor. If enabled the cursor
+ will not be hidden in the right hand corner but will instead
+ be positioned at the start of the currently selected link.
+ show cursor is the default for systems without FANCY_CURSES
+ capabilities, and the default configuration can be changed in
+ userdefs.h
+1-9-93
+* Added NNTP posting capabilities. Currently uses external inews
+ program which will be included in the utils directory.
+ Would someone like to patch in some freeware inews code, or
+ send me some?
+1-7-93
+* fixed bug in password handling which caused it to be displayed
+ accidentally :( (Danny Mayer)
+1-6-94
+* bold and emphasis now use curses underlining to represent
+ emphasized text. The use of _underline_ chars before and after
+ the text is now removed.
+1-5-94
+* Added configurable download menu so that binary files may
+ be downloaded using any protocol. Download menu is displayed
+ after selecting a non-displayable file.
+* Added exec links. 4 types currently defined:
+ files ending in: .csh, .ksh, .sh, (for UNIX) and .com (for VMS);
+ Use exec link controls to turn on and off exec links.
+* Gopher menus are now within PRE so that spaces are not
+ collapsed in menu entries.
+* added configurable character sets. Can be set in lynx.cfg
+ by the user in the options screen or in the users .lynxrc file
+ current sets are: ISO Latin I, IBM PC Character set, & 7 bit
+ approximations. New sets can be added to src/LYCharSets.c
+
+----------RELEASE of Lynx 2.1 and 2.1.1----------------------
+-grey area-
+* Ability to FTP to VMS systems. (Foteos Macrides)
+* Fixed lots of display and interrupt problems (Foteos Macrides)
+* The Lynx Bookmark file is now interpreted as an HTML document.
+ Old Lynx bookmark files must be converted using the lynx2html
+ program or deleted.
+* HTML+ forms as implemented by XMosaic now work.
+ fill in the empty spaces and press the submit button to
+ submit the form.
+* The TEXTAREA tag isn't done yet. It will currently only
+ give a one line text area. The next version of Lynx will
+ include a true textarea implementation once I figure out a
+ reasonable interface.
+* Incorporated WWWlib 2.14 and fixed up the descrip.mms files.
+ Foteos Macrides made VMS port changes and wrote a really nice
+ build.com script to make compilation on VMS systems really easy.
+ Foteos also ported Lynx to OpenVMS for alpha axp systems.
+* 's' now means search a searchable indexed document through the
+ server, and can no longer be used to search for strings within
+ the displayed document.
+* '/' now only searches through the current displayed document for
+ strings and can not be used for searchable index documents.
+* Capital 'Q' now quits without asking for confirmation.
+* 'm' for Main Menu now asks for confirmation and does NOT clear
+ the history stack.
+* Blockquote style changed slightly.
+* fixed bug with A and other tags messing up formatting
+ within PRE segments.
+* Verbose Gopher option removed, verbose gopher functionality
+ is now set permanently on.
+* Default editor is now configurable in the lynx.cfg file.
+* Default bookmark file is now configurable in the lynx.cfg file.
+
+12-15-93
+* ownership is no longer inherited.
+* link rev="owner" href="mailto:ADDRESS" now accepted as well as
+ link rev="made" href="mailto:ADDRESS" to define the URL of the
+ owner or person responsible for the info.
+* 's' now only searches ISINDEX server documents.
+* '/' always means search within the document.
+
+-grey area-
+* still doing massive rewrite. Debugging!!
+
+11-30-93
+* anonymous users cannot change the bookmark page! (thanks to Jyrki Kuoppal for
+ pointing out a security hole)
+
+-grey area-
+* massive rewrite. Removed all Lynx internal format code and
+ restructured all the source files.
+
+11-8-93
+* added &nbsp; (non-breaking space), &ensp; and &emsp;
+
+---------- RELEASE of 2.0.12 -----------------
+11-1-93
+* Change HTInit.c so that unsupported types are not sent out
+ in accept parameters. For non X screen only text/html and
+ application/octet-stream are sent.
+
+10-26-93
+* descriptive title added to files mailed from lynx
+
+10-25-93
+* disabled FTP connection caching to help fix multiple FTP problems
+
+10-23-93
+* added preliminary level 1 forms support.
+
+10-20-93
+* fixed a bunch of gopher holes
+* gopher lists are turned into URL's now instead of lynx
+ internal format document links
+* local documents ending in .html can now be referenced with
+ just a filename and/or path from the command line.
+
+10-19-93
+* Added preloaded searches to gopher URL's. They previously
+ didn't work. This is readily apparent as preloaded CSO
+ searches, which a lot of people wanted.
+* removed old hytelnet compatibility code which looked in
+ multiple directories to find the correct file. If you still
+ need this capability talk to me.
+
+10-12-93
+* The users specified editor is now spawned for mail messages.
+ If no editor is defined or if the user is anonymous, the built-in
+ lynx mail sender is used.
+
+10-11-93
+* changed all static data structures to be dynamic
+ This was a pretty major change of code which may add several
+ bugs.
+* rewrote parse_links routine to make it more efficient and to
+ work with dynamic structures.
+
+10-6-93
+* added progress messages to HTTP transfers.
+
+10-5-93
+* added -cache=# command line option to specify the number
+ of WWW documents cached in memory.
+
+9-28-93
+* added VMS port fixes from Foteos Macrides. Lynx now
+ compiles and works on VMS!
+* fixed ftp bug in WWWlib that didn't de-escape URL's before
+ sending request to FTP server.
+
+9-21-93
+* fixed coredump bug for some files with no links.
+
+9-3-93
+* Moved many configuration options including printer setup to
+ lynx.cfg file. The default placement of the lynx.cfg file
+ will be /usr/local/lib & sys$public
+
+9-1-93
+* Removed STARTDIR variable from userdefs.h STARTDIR is now inferred
+ from the STARTFILE.
+
+8-30-93
+* Fixed bug with only one link selectable out of many on the last line
+ of the display.
+* Ported to SVR4 courtesy of Nickolay Saukh (from Russia, Wow this is
+ really getting around!)
+* Uneditable documents don't get refetched. (Nickolay Saukh)
+* National language support through LOCALE
+ (instead of ISOLATIN1), protected by #ifdef LOCALE (Nickolay Saukh)
+
+------Release of Lynx 2.0.11--------------------------------
+8-27-93
+* Caused major international incident when a large bug was discovered after
+ release. :)
+* Fixed internal document hypertext references with URL's. '#selector'
+ strings now work again.
+
+8-24-93
+* When files come through on pre HTTP/1.0 servers they are now
+ recognized by their file extensions
+
+8-23-93
+* Lynx can now speak to old NCSA pre HTTP/1.0 servers
+* fixed ALT bug that had to do with style changes not
+ happening before the alt was printed.
+
+8-21-93
+* updated the man file lynx.1.
+
+8-19-93
+* updated help and converted it to HTML. Made a new help location and
+ server. The new default help file is
+ http://kufacts.cc.ukans.edu/lynx_help/lynx_help_main.html
+
+8-15-93
+* changed '\' to toggle between source and no source. When you press
+ '\' while viewing a rendered HTML document you will get the HTML source
+ when you press '\' while viewing HTML source you will get the
+ rendered HTML.
+* Added ALT attribute to IMG tag. When ALT is available the contents
+ are displayed. When ALT is missing [IMAGE] is displayed. When
+ ALT="" nothing is displayed.
+
+8-14-93
+* Added document reload command. CTRL-R when pressed will reload
+ the document into memory and redisplay it, clearing the screen.
+ This is very useful when editing documents, outside of Lynx while
+ using Lynx for rendering.
+* Added source view mode. '\' when pressed will reload the document
+ and display the HTML source. (doesn't work for gopher directoryies right
+ now, but gopher isn't HTML anyways)
+* fixed bug in LibWWW that caused it not to be able to convert to
+ www/source.
+* fixed bug in LibWWW that caused most binary file transfers to fail
+* added binary file transfer ability. When binary files are selected
+ the user is prompted for a file name to save to. The default directory
+ is the one the user started in.
+* Lynx now reloads local HTML files and re-renders them after editing.
+
+??-??-??
+* At some point I added the ability to edit HTML files on the local
+ machine.
+
+8-12-93
+* Added Nested Lists, up to six levels, with different bullets
+ for each level.
+* Due to the fact that nearly everyone seems to use P to mean
+ two returns within the same style, and Mosaic has been kind
+ enough to support this meaning, :( :( :( I have changed
+ the P tag to reflect this interpretation. P can be used
+ anywhere and will mean insert two returns. (i.e., two BR tags)
+
+8-11-93
+* Made the default Mime type for unknown file types on ftp servers
+ to be text/plain. Previously the WWWLibrary had the default
+ as application/octet-stream which meant that most files could not
+ be viewed.
+* Changed the ADDRESS style to be more like XMosaic
+ Left flush, newline top and bottom
+* The Statusline now displays the URL when retrieving files.
+* added BR (linebreak) tag!
+ The BR tag inserts a line break and maintains the current style!
+ The BR tag may be used anywhere.
+* added HR (horizontal rule tag!)
+ The HR tag puts a horizontal line separating two bodies of text.
+ The HR tag may be used anywhere.
+
+8-8-93
+* All spaces, tabs and returns are now collapsed down do one
+ space.
+* fixed bug whiched caused certain links beginning at the
+ beginning of a line to be bad.
+* added '*' (stars) to unordered lists and numbers to ordered
+ lists.
+* changed dir lists to be more like menu lists.
+* all emphasis, physical and symantic, now have _underlines_
+ around them to show emphasis.
+
+
+RELEASE OF VER 2.0.10 -----------------------------------------------
+
+7-8-93
+Added [IMAGE] in all places where IMG tags appear.
+added WWW_HOME environment variable support.
+fixed searching in WWW.
+removed tildas from mail messages for security reasons.
+added emacs-like key defs.
+changed gopher dir routines and Verbose format of directories
+
+6-30-93
+Forgot to put all kinds of bug fixes and stuff in here during the
+past month. I have been working on upgrading to the 2.X WWWlibrary
+Today I changed 'g' to mean goto a url, and 'v' to be view the
+bookmark page.
+
+5-30-93
+Fixed problem with ftp: URL not being recognized and not working.
+
+5-28-93
+Tried to remove the use of tabs and replace them with appropriate
+spaces. This was done to support brain dead curses packages that
+don't handle tabs. (like linux)
+
+5-20-93
+Fixed socket problem which was causing a problem with telnet's
+connecting
+
+5-18-93
+Fixed SUN curses problem, now works with the /usr/5lib routines
+
+4-9-93
+Added an option to turn on link numbering
+
+4-7-93
+Fixed read_rc() bug which caused .lynxrc files to be read incorrectly
+Fixed file caching bug which only allowed searching to be performed
+once. (it cached the answer and displayed that each time a new
+search was requested)
+
+4-2-93
+Fixed VMS I/O bug and TCP routines.
+
+4-1-93
+Ported 2.0 to VMS
+
+3-17-93
+Fixed a bug: Multiply defined procedure async_abort in
+the files get_file and get_bin_file
+
+3-16-93
+Optimized Gopher TCP routines, increased speed by a factor of 10!
+
+3-9-93
+Added WWW support by integrating the WWWlib1.4
+
+2-10-93
+Added home page support and append features.
+
+12-22-92
+Added support for Image types using xloadimage for X-terminals.
+
+12-1-92
+Added gopher binary file types
diff --git a/docs/CHANGES2.4 b/docs/CHANGES2.4
new file mode 100644
index 0000000..9d3e4f4
--- /dev/null
+++ b/docs/CHANGES2.4
@@ -0,0 +1,891 @@
+--- Rename of Lynx2-3-FM and release as Lynx2-4 (08-June-1995) ---
+==============================================================================
+06-08-95
+* All of the changes from lynx2-3-FM are now located at ftp2.cc.ukans.edu.
+ We will call this version lynx2-4 and all new changes will be added here.
+ - JP
+06-05-95
+* Added isc support based on post to lynx-dev from Ami Fischman
+ (a540ami@pic.ucla.edu). - FM
+06-04-95
+* Initialize t1->name before the StrAllocCopy() in LYMainLoop.c for
+ DIRED_SUPPORT tagging. - Rick Mallett (rmallett@ccs.carleton.ca)
+* Don't bother creating a /tmp copy of local files for downloading
+ under the DIRED_SUPPORT, and don't include "Save to disk" in the
+ download menu for such files. - RM
+* Deal with any newlines or tabs in statusline messages, along lines
+ in patch from Peter Marquardt. - FM
+* Various fixes to ensure terminations of strings, along lines suggested
+ by PM. - FM
+* Made HTAlert messages more readable in trace mode.
+* Replaced info.cern.ch with www.w3.org in userdefs.h and lynx.cfg. - GL
+* Allow definition of the global configuration file (lynx.cfg) path and
+ name via a "LYNX_CFG" VMS logical or Unix environment variable. Will
+ override the "LYNX_CFG_FILE" definition in userdefs.h. The -cfg command
+ line switch will override those. SYS$LOGIN (VMS) or '~' (Unix) can be
+ used in the path to treat the global configuration file as a personal
+ configuration file ($HOME will be substituted for '~'). Meets objective
+ in patch posted by Danny Meyer (mayer@ljsrv2.enet.dec.com) but does
+ not seek lynx.cfg in the user's HOME directory without an explicit
+ directive to do so. Issue a screen message and then exit if the
+ configuration file is not readable (rather than continuing as if
+ one had been found and read). - FM
+* Added protections from NAMEless INPUT or TEXTAREA tags. - FM
+05-29-95
+* Changed close(*s) typo in HTTCP.c to NETCLOSE(*s). Caused tight loops if
+ on error *s became stdin. - Peter_Marquardt (wwwutz@cha01.tfh-berlin.de)
+05-20-95
+* Mods of proxying/gatewaying code, replace obsolete info.cern.ch default
+ URL addresses with www.w3.org, and add option to use the new www.w3.org
+ wais search gateway in cover page for wais searches. - FM
+05-10-95
+* If a startfile specified on the command line maps to a MIME type
+ which invokes an alternate display device, allow -homepage, if also
+ specified, to be substituted for startfile on quitting from the display
+ device, rather than forcing an exit due to the original startfile having
+ been neither text/html nor text/plain. Based on a patch from GL, with
+ protections against possible infinite getfile() loops added. - FM
+* Include -t switch when pico is the editor for reply_by_mail() in
+ LYMail.c. - GL
+05-04-95
+* Oops. Had zipped the wrong LYReadCFG.c in yesterday's mods. - FM
+05-03-95
+* Do not override any external proxy and no_proxy variables with those
+ in lynx.cfg. Bug fixes in code for setting proxy variables on Unix,
+ based on patches from Roman Czyborra (czyborra@cs.tu-berlin.de). - FM
+* Fixes for tagging when Lynx jumps to another screen and then comes back,
+ and deal with possibility of screen outputs from compress/decompress
+ utilities. - GL
+* Added support for Sequent's DYNIX/ptx operating system, and bug fixes
+ in HTTCP.c's BSDselect(). - Rodney Barnett (RBarnett@us.teltech.com)
+* Increased limits in select() loops to 5000 tries. - FM
+* Specify /nomember for compilations with DECC. It's not the default
+ on AXP and the code assumes byte alignment. - FM
+04-19-95
+* Added Alan Hirsh's script (LynxDir:VMSPrint.com) for dealing with busy
+ VMS print queues such that Lynx might otherwise delete the temporary
+ file before it has been queued for printing. - FM
+* Added lots of type casting to the mathematical operations in GridText.c
+ to minimize possible sizing/alignment problems for DECC/AXP (and any
+ Unix flavors that use the Alpha chip). - FM
+04-17-95
+* Use test=test -z "$LYNX_VERSION" like test=test -n "$LYNX_VERSION"
+ in mailcap files simply as flags for non-LYNX versus LYNX environment,
+ without actually bothering to execute a test. - FM
+* Issue "** Bad HTML!!! Use -trace to diagnose. **" statusline messages
+ when bad HTML is encountered, and suppress those statusline messages in
+ favor of the TRACE messages when -trace is used. - FM
+* Fixed anchor deletion problem in yesterday's ISMAP mods. - FM
+* Removed -ltermcap from AIX makes (AIX doesn't use it). - FM
+04-16-95
+* Send a 0,0 coordinate pair if a user clicks on an ISMAP link, so that
+ it's handled equivalently to clicks on an ISMAP submit button, and
+ (typically) will return the server's default. Note that the default
+ often is the parent document, and if so, the current document will
+ be returned via redirection (pointlessly 8-). However, this mod
+ allows the WebMaster to use a pure-text document as the default for
+ Lynx. - FM
+* Protections against crashes for inappropriately positioned form tags. - FM
+* Fixes in handling of configurable INEWS path. - FM
+* Support for VT500 series terminals. - George Cook (cook@wvnvaxa.wvnet.edu)
+04-12-95
+* Makefile tweaks for bsdi and aix4. - FM
+04-11-95
+* Mods for building with BSD Interactive (bsdi). - FM
+04-08-95
+* Added translation of HTML entities and decimal escaping for the
+ VALUEs of INPUT and OPTION tags. - FM
+* For TYPE="image" INPUT tags, use "[IMAGE]-Submit" as a pseudo-ALT
+ string, and submit a 0,0 coordinate pair if it's clicked, which
+ typically will invoke the server's default (I guess something is
+ better than nothing. 8-). - FM
+* Handle (possibly multiple) angle brackets in bookmark and showinfo
+ link names. - FM
+* Fixed typo in for-ultrix code in LYMain.c. - FM
+04-04-95
+* Added ability to set proxy environment variables via lynx.cfg. - FM
+04-01-95
+* Added handling of the HTML 3.0 attributes for ISINDEX tags:
+ ISINDEX HREF="reference" PROMPT="string"
+ The ACTION attribute didn't make it into HTML 2.0. For now, we'll keep
+ supporting it in Lynx by treating it as a synonym for HREF. - FM
+03-31-95
+* Mods for AIX v4.1.1 and addition of make aix4. - FM
+* Added prototype and extern declarations for BSDselect(). - FM
+* Fixed bugs in form_getstr() that could clobber the stack. - GL
+* Fixes for symlink handling. - GL
+* Made LYShowInfo.c aware of the setuid, setgid and sticky file modes,
+ and nicer mode display if the file doesn't have the read bit set. - GL
+03-30-95
+* Fixed glitch in BASE tag handling. - FM
+03-29-95
+* Initialize pointers in add_trusted() of LYGetFile.c before the
+ StrAllocCopy() calls. - FM
+03-26-95
+* Miscellaneous TRACE and related messaging tweaks. - FM
+03-24-95
+* Handle defaulted localhost in file BASE tags, and related tweaks of
+ defaulted localhost handling in file URLs. - FM
+* Use RM_PATH for both file and directory deletions with the DIRED_SUPPORT
+ remove function. - GL
+--- STARTING 2.3-FM ---
+==============================================================================
+03-23-95
+* Designate this code set as lynx2-3-FM to avoid any confusion with the
+ official releases at UKans. - FM
+* Tweaks of code for defaulted localhost in file URLs. Don't require
+ any host field marker in such URLs - FM
+03-21-95
+* Added handling of defaulted localhost in file URLs. - FM
+* More protections against bad HTML. - FM
+* SYSLOGing enhancements. - GL
+* Suspend curses during my_spawn()'s, and fixes of code for the child
+ and error return detection. - GL
+03-20-95
+* More protections against potentially infinite loops. - FM
+03-16-95
+* Enhancements of 'c'omment and mailto handling. - FM
+* Mods to build.com for enabling submission to BATCH. - FM
+* Ultrix terminal-handling fix. - Roman Czyborra (czyborra@cs.tu-berlin.de)
+03-15-95
+* Fixed bug in for-Unix directory listing code to screen out inaccessible
+ parent directories. Was also being applied to ftp listings. - FM
+* Made bolding of H1 through H7 headers a lynx.cfg option, with the
+ non-bolding as the compilation default. - FM
+03-13-95
+* Fixed bug in setting link[].lname elements to empty strings for form
+ INPUT_ANCHORs. Was causing showinfo() to report the links from the
+ previous document (yet another memory leak bites the dust 8-). - FM
+* Numerous fixups of bold and underline handling. - FM
+03-09-95
+* Increased the while() loop limit for select() tries in HTTCP.c to 500. - FM
+* Memory allocation/free fixes in HTAccess.c. - FM
+* Makefile and documentation tweaks. - FM
+03-07-95
+* Implemented HT_BOLD when specified for headers in DefaultStyle.c. H1 is
+ now uppercase, bold, and centered. H2 - H7 are lower or mixed case, bold,
+ and progressively indented. - FM
+* Miscellaneous enhancements of menu displays. - FM
+* Allow tabs and '$' in lynxexec commands. - FM
+* More TOUPPER/TOLOWER fixes. - FM
+03-06-95
+* Added ability to set the INEWS path in lynx.cfg. - FM
+03-05-95
+* Separated the newspost URL into newspost versus newsreply, and modified
+ LYNews.c to behave more rationally for new versus followup posting. - FM
+* Added "mode reader" command for news list and article requests. - FM
+* Enabled saving of list_dir_style settings in the user's RC file. - FM
+* Don't restrict rearming SIGINT in LYClean.c for IGNORE_CTRL_C to just
+ SVR4. - FM
+* Added numerous protections against core_dumps/ACCVIOs in HTML.c for bad
+ HTML. Should also help reduce likelihood of infinite while() loops and
+ a runaway CPU if binary files are mistyped and rendering is attempted. - FM
+* Added (unsigned char) type casts in addch() calls for proper handling of
+ high value ISOLATIN1 characters. - FM
+* Limited the while() loop for select()'s in HTTCP.c to 50 tries, to help
+ reduce likelihood of a runaway CPU on undetected terminal disconnects. - FM
+* Fixed typo in build.com. - FM
+* Added Craig's lynx_help and about_lynx files for the lynx2-3-7 distribution,
+ updated for lynx2-3-9 BETA. - FM
+--- STARTING 2.3.9 BETA ---
+==============================================================================
+02-20-95
+* Updated doc files and passed on to UKans for archiving on the
+ ftp2.cc.ukans.edu server as 2.3.8 BETA. - FM
+02-17-95
+* Further updates of building procedures for VMS. - FM
+* Further updates of lynx.man, lynx.hlp and documentation. Indicate
+ that the inside_foo and outside_foo restrictions are not selective
+ on systems which lack utmp. - FM
+* Changed yesterday's DGUX define to DGUX_OLD, because only older
+ Data General systems need it. - FM
+02-16-95
+* Added Jeff's updates of lynx.man and lynx.hlp, further updated for
+ v2.3.8 - FM
+* Fixed typos in LYMail.c and HTTPC.c. - FM
+* Cleaned up #ifdef'ing for -DIGNORE_CTRL_C. - FM
+* Added -DDGUX for using inet_addr(host).s_addr instead of inet_addr(host)
+ in HTParseInet() of HTTCP.c (Data General may need it). - FM
+* Don't report "-help" as an invalid option. - FM
+02-15-95
+* Handle HTML entities and decimal escaping in ALT strings. - FM
+* Build fixups for TCPWARE. - FM
+02-14-95
+* Added transmission of Accept-Language headers. A default preferred
+ language is defined in userdefs.h. It can be overridden via lynx.cfg.
+ Users can change that via the 'o'ptions menu and save their preference
+ in their RC file. - FM
+* Tweak of FIXED record handling on VMS. - FM
+* Defined Unix ZIP_PATH and UNZIP_PATH in userdefs.h. - FM
+02-12-95
+* Added -localhost switch for restricting access to files and servers
+ on the local host. - FM
+* Added -nobrowse switch for disabling directory browsing. - FM
+* Added -selective switch for requiring a .www_browsable file in
+ each directory for browsing access to it. The enabling files
+ are not included in the directory listings. - FM
+* Fixed up displaying of README files in directory listings on
+ VMS. - FM
+* Replaced all tolower() and toupper() calls with the TOUPPER() and
+ TOLOWER() macros in HTUtils.h (should help deal with some of the
+ strange behavior reported for some flavors of Unix; see header of
+ HTUtils.h). - FM
+Worked in mods from David Trueman (david@cs.dal.ca) - FM:
+* Don't issue the ../ link in Unix local directory listings if the parent
+ directory is not readable (was already dealt with on VMS - FM).
+* Include an Organization: header in Unix news postings, if possible
+ (was already dealt with on VMS - FM).
+* Don't allow the editing of Unix mail headers because that is error
+ prone (no change on VMS; editable pseudo-headers are included for
+ informational purposes, but the real headers are those of the
+ account running Lynx - FM).
+* Don't hardcode the Unix mv command; use MV_PATH define in userdefs.h.
+* Moved the Unix COPY_COMAND define to userdefs.h as COPY_PATH.
+* Completed the Unix ZIP support.
+02-10-95
+* Added code for converting the headers of downloaded binaries on VMS
+ to indicate FIXED 512 record format. See the documentation in
+ userdefs.h, lynx.cfg and FIXED512.COM for more information. - FM
+02-08-95
+* Fixed glitch in HTInit.c which mis-casted the default MIME type for
+ files with a .sh extension, causing the EXEC_SCRIPT function to be
+ dysfunctional. - FM
+* I think I finally have Lynx showing "(p# of N)" properly in the title
+ lines (we'll see if perfection has really been achieved 8-). - FM
+* Extended directory browsing on VMS to the -homepage specification,
+ if included on the command line, e.g., lynx -homepage=sys$login
+ will start up Lynx with the default startfile, but the 'm'ain menu
+ command will yield listings of the home directory. - FM
+* Added -fileversions switch on VMS for including all versions of files
+ in directory browser listings (otherwise, only the highest version is
+ listed, with no version numbers displayed). - FM
+* Modified LYEdit.c to use fopen(filename,"a") instead of access(filename,2)
+ to verify write access for editing files (checking "append" access appears
+ to be a more reliable way to do it across platforms/flavors). - FM
+02-07-95
+* Implemented directory browsing for VMS. - FM
+* Fixed printer command handling to actually prompt for and use a second
+ filename argument if two "%s" strings are in the command map. - FM
+* Added anti-Unix-shell-spoofing code for all of the filename argument
+ handling. - FM
+* Fixed glitch in getenv(DISPLAY) calls on VMS.
+02-04-95
+* Fixed a glitch in BASE support. Should now work properly when both
+ standard and Lynx-specific hrefs are in the document. - FM
+02-03-95
+* Added support for posting to newsgroups from Lynx on VMS via the
+ ANU-NEWS software. - FM
+* Numerous href parsing enhancements. - FM
+* Enhancements and bug fixes of news displays. - FM
+* Enabled display of Linknames with angle brackets (as for news URLs)
+ in the showinfo page. - FM
+* Ensured that a file URL which is really an ftp URL will yield an
+ "FTP is Disabled" statusline message when it's disabled. - FM
+02-01-95
+* Defined out the LYK_VERSION code and made Control-V a dead key again,
+ since including the Lynx name and version strings in the showinfo ('=')
+ and 'o'ptions displays is adequate, and people on different platforms
+ or flavors associate Control-V with other functions. - FM
+01-31-95
+* Beefed up the BASE support. - FM
+* Made all WWWLib cover pages and menus HTTP/1.0 compliant (to ensure
+ resetting of any BASE tags) and gave them more pizzaz. - FM
+* Trim terminal slashes in ftp paths if not the Welcome directory, so
+ we'll get "Up to" links. Terminal slashes in file paths still force
+ that directory to be treated as the Welcome directory. For example,
+ ftp://host/blah/foo/ will have an "Up to blah" link listed, but
+ file://host/blah/foo/ will treat /blah/foo/ as "Welcome" (both ftp
+ and file "Up to" links are blocked by -DNO_PARENT_DIR_REFERENCE). - FM
+* The VMS SOCKETSHR_TCP support can't yet handle telnet, tn3270 or
+ rlogin URL's (Andy Harper is working on it; be patient 8-). Modified
+ HTTelnet.c to compile properly and behave rationally when such URL's
+ aren't supported. - FM
+* Corrected doc files based on Larry Virden's (lvirden@cas.org) careful
+ (or is it carefull) proof-reading. Thanks Larry! - FM
+* More type casts for ANSI C compliance. - FM
+01-30-95
+* Added numerous type casts for ANSI C compliance. - FM
+01-29-95
+* Prototyped HTHostName() for yesterday's mods in HTAccess.c. - FM
+* Updated lynx.cfg. - FM
+01-28-95
+* Added lynx name and version to the showinfo page and options menu. - FM
+* Tweaked Danny's news proxying mods for selective no_proxy directives
+ with a port field (119) for news, and added equivalent code for wais
+ (port 210). - FM
+* Updated the INSTALLATION file (I hope people read it 8-). - FM
+* Hadn't included last night's typo fix in the archived fileset. - FM
+01-27-95
+* Added Danny Mayer's (mayer@ljo.dec.com) mods for proper handling of
+ no_proxy directives for news (NNTPSERVER) hosts. - FM
+* Worked in Ari Luotonen's (luotonen@dxcern.cern.ch) mods for sending
+ a "Pragma: no-cache" header for use by a proxy server in conjunction
+ with the RELOAD command. - FM
+* Fixed to handle file URL's appropriately in conjunction with proxying
+ of ftp URL's. For file URL's on the local host, direct access is
+ attempted, with no ftp attempt if that fails, whether or not proxying
+ is in effect, and whether or not no_proxy directives have been set.
+ Both ftp URL's, and file URL's on a remote host, are sought via ftp
+ without a direct access attempt. File URL's for remote hosts are
+ converted to ftp URL's before submission to a proxy server, so no
+ special procedure need be implemented to induce the proxy server to
+ act on them (You shouldn't continue using file URL's when you intend
+ ftp, but Lynx will handle such URL's properly when encountered in
+ old documents that use file when ftp is intended.) - FM
+* Fixed typo in yesterday's "psychotherapy". - FM
+01-26-95
+* Escaping of ISINDEX queries needed more tweaks to work properly with
+ high value IsoLatin1 characters. - FM
+* Applied psychotherapy to the schizophrenic behavior that was exhibited
+ when download, upload, print, history or showinfo commands were used
+ during displays of each other's menus or temporary files. - FM
+* Enabled downloading of links from the history page. - FM
+01-25-95
+* Added LYK_VERSION command (^V) for showing version of Lynx. - FM
+* Include file fixes for TCPWARE. - FM
+* Fixed bug in showinfo() which caused core dumps when invoked while
+ positioned on any form field which has a "linkname" but a NULL
+ "filename". - FM
+* Fixed glitch in 'p'rint menu. - FM
+01-24-95
+* Enabled SOCKSification for any Unix flavor via the SITE-LYDEFS,
+ SITE-DEFS and SOCKSLIB definitions in the top-level Makefile. Added
+ info in INSTALLATION on how to do it for VMS. Included notes that you
+ are better off building Lynx normally, and instead using a SOCKSified
+ proxy server to get through a firewall. - FM
+* Added instructions in INSTALLATION for setting up proxy service. - FM
+* Fixed multiple submit button handling to distinguish which button was
+ activated when they have the same name, and include only that button's
+ name/value pair in the submission. - FM
+* Figured out how to apply all security and restrictions checks for
+ redirecting URLs returned by ISINDEX searches, and accordingly lifted
+ the bypasses for the previously insecure access types. - FM
+* Added option to use Jerry Whelan's (guru@bradley.edu) BSDselect() for
+ SVR4 systems with the "type any key" problem. - FM
+01-23-95
+* Fixed up escaping of queries in HTSearch(). - FM
+* Updated the sample jumps files. - FM
+* Worked in socksification mods from Reese Ferry (reesef@VNET.IBM.COM) - FM
+* Enabled use of LOCALE for international characters with any Unix flavor
+ (not just sun) via a define in the top level Makefile. - FM
+01-22-95
+* Updated the lynx.cfg configuration file. - FM
+* Implemented BASE handling. - FM
+01-21-95
+* Fixed -cfg switch handling so that the specified, alternate configuration
+ file properly is read instead of the default system file specified in
+ userdefs.h. - FM
+* Made 'p'rint, 'd'ownload and 'u'pload menu lists single spaced. - FM
+* Fixed HTFileFormat() in HTFile.c so that it properly processes the
+ suffix-to-MIME-type mappings when version numbers are in local file
+ URLs on VMS. We therefore no longer trim off the version number if
+ if was included, and Lynx will now access and process that version
+ rather than only the highest version. - FM
+01-18-95
+* Makefile fixes for convex and linux. - FM
+01-17-95
+* More Makefile fixes. - FM
+01-14-95
+* Fixes for FreeBSD. - FM
+01-12-95
+* Made the "ls -l" emulation in local directory listings a compilation
+ option (see the top level Makefile). - FM
+* Made inclusion of "Up to" parent links in local directory listings a
+ compilation option (see top level Makefile). - FM
+* Message fix for checkmail on Unix. - FM
+* Fixes for SCO with gcc. - FM
+01-11-95
+* Restored original hash table function in HTAnchor.c without (hopefully 8-)
+ reviving anchor deletion problems. - FM
+* Fixed typo in HTAccess.c. - FM
+* Added code in HTFile.c from Timothy Newsham (newsham@aloha.net) for
+ generating long style Unix listings (ls -l). - FM
+01-10-95
+* Escape dashes in lynx.man. - FM
+* Added NetBSD support from Bryan T. Vold (btv@wiley.HealthPartners.COM). - FM
+* Made anchor searches in hash tables case-sensitive (so paths which
+ differ only in their case can be distinguished, as people using the
+ DIRED support kept requesting) without (hopefully 8-) reviving anchor
+ deletion problems. - FM
+01-09-95
+* More Makefile and code fixes for building properly with various systems
+ and compilers. - FM
+01-06-95
+* Numerous fixes for handling signals (e.g., SIGWINCH) received during
+ keystroke fetches, without (hopefully 8-) reviving the problem of
+ runaway CPU's on undetected terminal disconnects. - FM
+* More Makefile and code fixes for building properly with various systems
+ and compilers. - FM
+01-05-95
+* Changed define for syslog() logging to SYSLOG_REQUESTED_URLS and picked up
+ logging of ISINDEX search requests that don't go through getfile(). - FM
+* More fixes for redirection returned via ISINDEX searches. - FM
+* Fixed missing newline character at end of last .lynxrc entry. - FM
+* More Makefile tweaks. - FM
+* More additions in LYCurses.h for compilers which fail to check whether TRUE
+ and FALSE are already defined before defining them in curses.h. - FM
+01-03-95
+* Fix for redirection returned via ISINDEX searches. - FM
+12-29-94
+* Yet more top level Makefile tweaks. - FM
+* Fix bcopy problem for UCX. - Martin Zinser (zinser@vscn.gsi.de)
+* Fix ioctl() problem for UCX. - MZ
+12-27-94
+* More top level Makefile tweaks. - FM
+12-26-94
+* Added Lou Montulli's procedure for PURIFY to the top level Makefile. - FM
+12-23-94
+* Added Lou Montulli's memory leak fixes. - FM
+* Fixed HTLoadedDocumentTitle() call in LYGetFile.c. - FM
+--- RELEASE of 2.3.8 BETA ---
+12-22-94
+* The WFEB code as of 12-15-94 has been archived at UKans as lynx2-3-7,
+ so we'll make this lynx2-3-8 to avoid confusion. - FM
+* Added bookmark_exec restriction for disallowing use of lynxexec URL's
+ in the user's bookmark file or converted Mosaic hotlist. - FM
+* Enable any lynxexec URL in JUMPFILE if EXEC_LINKS has been defined.
+ This allows you to set both LOCAL_EXECUTION_LINKS_ON_BUT_NOT_REMOTE
+ to TRUE and a single TRUSTED_EXEC rule that will always fail (e.g.,
+ TRUSTED_EXEC:none), so that *ONLY* the lynxexec URL's in the jumps
+ file will be acted upon. - FM
+* Disallow lynxexec URL's in G)oto if no_shell is set or if
+ LOCAL_EXECUTION_LINKS_ON_BUT_NOT_REMOTE is TRUE. - FM
+12-21-94
+* Include LYFLAGS in the BSDI_Makefile. - FM
+* Numerous mods based on patches from David Trueman - FM:
+* Changed SUN4 ifdef for implementing the "reverse clear screen hack" to
+ REVERSE_CLEAR_SCREEN_PROBLEM since not all sun4 systems experience this
+ problem.
+* Changed a few messages to use key_for_func() instead of a hard-coded
+ key mapping.
+* Allow control-C as well as control-G to abort or cancel on Unix (as
+ already on VMS). On VMS, control-C and control-Y evoke a "Do you really
+ want to quit?" prompt, and a 'n'o reply gets handled as if control-G
+ has been entered in the first place. On Unix, control-C is treated
+ simply as a synonym for control-G, and control-Y is not an interrupt
+ signal. This seems the best way to handle those control signals, based
+ on what VMSers versus Unixites would expect them to do.
+* Added code to disallow the writing of files beginning with a dot if
+ NO_DOT_FILES is set TRUE in userdefs.h and/or lynx.cfg.
+* Added possibility of logging URL access via syslog() on Unix (ifdef'd
+ with LOGGING).
+* Improved and made more flexible the security for lynxexec URL's. The
+ default behaviour is the same as now, but source locations and the path
+ (Unix) or name (VMS) of programs to be executed can be restricted via
+ TRUSTED_EXEC rules in the lynx.cfg file.
+* Convert ~ in lynxexec paths to $HOME on Unix.
+* Several changes in DIRED support. Tidied and consolidated code. Changed
+ the way tags are freed (fixing a bug where they did not always get cleared
+ properly). Changed all programs to *_PATH defines. Changed the display
+ of tags so they work with numbered links.
+* Added another restriction to disallow telnet port specifications in
+ G)oto URL's.
+* A bit of special case code in jump handling. If key mapping is G, allow it
+ to be typed as "go target".
+* Change strncmp in remap() to strcmp() (bug fix).
+* Report offending bad option in main().
+* In mainloop(), make \r same as \t and \n.
+* Combine LYK_REMOVE code with LYK_DEL_BOOKMARK so that they can share the
+ same key map.
+* If show_cursor is true, position cursor 1 position before the link, which
+ makes it less likely that the link is obscured in defective terminal
+ programs
+12-15-94
+* More fixes in LYno_attr_char_case_strstr() and LYno_attr_char_strstr() - FM
+* People didn't like having to erase the default WHEREIS ('/') search string
+ when it wasn't what they wanted in a new document (though most didn't know
+ that it can be done easily via ^U), and Lynx doesn't have real editing via
+ LYgetstr() (just deletion from the end of the string), so I got rid of the
+ the editing offer. The previous search string is still buffered across
+ document fetches, and can be used across documents via NEXT ('n'). You
+ also can use WHEREIS without a search string entry to turn off highlighting
+ within the current document, and then NEXT to restore it. If control-G is
+ used instead of a blank string to cancel a WHEREIS command, it does not
+ turn off the highlighting. So everything everyone asked for is now
+ possible (once you figure out how to do it 8-). - FM
+12-14-94
+* Oops! Fixes in tcp.h for MULTINET with DECC/VAX had left SOCKET_ERRNO
+ undefined for all the other VMS TCPIP packages. That's what I get for
+ working on this stuff too late at night. - FM
+* Additional ANSI compliance fixes in HTTCP.c for builds with DECC/VAX and
+ non-MULTINET VMS TCPIP packages. - FM
+12-13-94
+* Modified searches for strings within the currently displayed document
+ ('/', as opposed to 's' for ISINDEX searches) so that the highlighting of
+ the search string is not retained when the current document is changed,
+ and added recall buffering of the search string so that it's offered as
+ the default for editing or reuse on subsequent '/' commands. Also, we
+ now force redraws on invocations of such searches so that hits will be
+ highlighted even if they occur on the current page. Links with hits such
+ that they have embedded highlighting of the search strings will not have
+ the embedded highlighting restored when the cursor is moved onto and then
+ off of them (helps to distinguished whether it's intended or the due to
+ the search), but will be restored whenever the page is redrawn. All
+ embedded highlighting also is restored when the 'n'ext command is used to
+ repeat the search in the current document, even if the returned hits do not
+ cause a page change. Note that these searches first search only the links,
+ and position you on the first link with a hit occurring after the current
+ link. If there were no hits in the links, then the text is searched and
+ the first hit occurring after the current link is positioned at the top of
+ the page. They never did, and still do not, search both the link and text
+ portions of the document simultaneously. Also note that ISINDEX searches
+ never have and still do not yield highlighting of the query string(s) in
+ the returned document.
+* Fixed LYno_attr_char_case_strstr() and LYno_attr_char_strstr() in
+ HTStrings.c so that they properly ignore any attribute characters in
+ the comparison string and return a pointer to the correct location
+ of a match with the target string. - FM
+12-12-94
+* Modified FTP gateway to display 230- as well as 250- information/help
+ messages, and on non-Unix as well as Unix systems. - FM
+--- RELEASE of 2.3.7 BETA ---
+12-11-94
+* Further tweaked explanatory comments in the configuration and samples
+ files, and updated the instruction files. - FM
+12-09-94
+* Modified PassesTest() in HTInit.c to avoid the overhead of system() calls
+ by using getenv() when test -n "$DISPLAY" and test -z "$DISPLAY"
+ commands are encountered in the mailcap file. Otherwise, needlessly
+ expensive system() calls potentially could be made for virtually every
+ viewer mapping in that file!. For Lynx, those two strings in the mailcap
+ file now are equivalent to the :XWINDOWS and :NON_XWINDOWS flags,
+ respectively, for VIEWER: assignments in lynx.cfg. - FM
+* Also modified PassesTest() so that it simply treats test -n "LYNX_VERSION"
+ as success. Why spawn a system() command to see if Lynx is running, when
+ it obviously is!. However, that string can be included in the mailcap
+ file for assignments that should be restricted to Lynx if other software
+ also uses the file. - FM
+* The above two mods make it unnecessary to actually use a "test" script for
+ differentially setting viewers in XWINDOWS versus NON_XWINDOWS environments,
+ so VMSers also can use the mailcap files for differential assignments of
+ viewers, without those DCL error messages about "test" which have been
+ mystifying so many people. However, yesterday's mods do make it possible
+ for VMSers to use a "test" script for checking other environment or system
+ features, and thereby setting viewer switches differentially, analogously
+ to the command line switches for Lynx itself. - FM
+* Modified comments in samples/mailcap to indicate these enhancements. - FM
+* Modified comments in userdefs.h to describe correctly what the Lynx code
+ does as of v2.3: Any SUFFIX or VIEWER mappings in lynx.cfg will be
+ overridden in src/HTInit.c if they also appear there. Then, any mappings
+ in mime.type or mailcap will override those from lynx.cfg and src/HTInit.c.
+ The XLOADIMAGE definition is used in src/HTIinit.c, and you can use
+ mailcap, but not lynx.cfg, to override it. - FM
+* Modified comments in lynx.cfg and samples/lynx.cfg to indicate what Lynx
+ really does, and the use of mailcap files to do what lynx.cfg had claimed
+ it could do but doesn't. - FM
+* Fully implemented multiple submit button support for both POST and GET
+ forms. - FM
+* Added LYK_RESUBMIT keymap (with default binding to 'x' and 'X') for forcing
+ submissions of forms to servers (i.e., never use cache). LYK_ACTIVATE
+ (with default binding to right-arrow and RETURN) still fetches from cache
+ if available. Statusline help describes these commands when positioned
+ on a submit button. - FM
+12-08-94
+* Fixed HText_submitForm() in GridText.c to handle submitting INPUT types
+ (e.g., type="image") which have name/value pairs. - FM
+* Modified DCLspawn to recognize -1 on failure and 0 or 1 on success as
+ return or exit values of scripts, and report -1 or 0 as it's own return
+ value. If a "test" script is used on VMS in conjunction with .mailcap
+ for setting viewers, it should return -1 if the test fails and 0 or 1 if
+ it passes (the "test" script can be DCL or an exectutable, and should be
+ defined as a foreign command). If you don't have a "test" script, don't
+ include that instruction in .mailcap. - FM
+* The tmpaddress pointer in do_www_search() of GridText.c needed to be
+ initialized to NULL. - FM
+12-07-94
+* Made sufficiently ANSI compliant to build with DECC on VMS without using
+ the /stand=vaxc qualifier, and further modified so that Lynx will build
+ and run (extremely well 8-) with DECC/VAX. Whooh, that took some doing!
+ These mods are also desirable for builds on Unix. - FM
+12-02-94
+* Fixed the query recall buffer in do_www_search() of GridText.c to restore
+ the +'s to spaces and unescape properly. - FM
+* Include file and define fix ups, for SOCKETSHR/NETLIB support and convex
+ builds, in tcp.h, LYShowInfo.c and top level Makefile. - FM
+11-27-94
+* Fixed bugs associated with failure to check the post_data element in
+ addition to the address element when making push/pop decisions for the
+ history stack, and when checking whether a requested document has been
+ loaded successfully. The address element is insufficient for documents
+ returned by POST'ed forms. - FM
+* Check -trace switch earlier in LYMain.c so that trace messages associated
+ with setting up the Lynx configuration will actually be displayed. - GL
+11-23-94
+* More fix ups for the SOCKETSHR/NETLIB support. Close to "all set" but needs
+ more field testing with the full range of TCPIP packages for VMS. - FM
+* Added HP_TERMINAL define for the DIM workaround to the REVERSE problem with
+ HP terminals. If not defined, SNAKE builds will not make that substitution
+ (would be better to do this in a way that checks the terminal at run time,
+ but we'll hold off on that for now). - FM
+--- RELEASE of 2.3.6 BETA ---
+11-21-94
+* Replaced ucx$inetdef.h with socketshr_library:ioctl.h for the
+ SOCKETSHR_TCP builds. Note that the ioctl.h is not presently included
+ in the binary distribution of SOCKETSHR/NETLIB. You have to get it from
+ the sources distribution. - FM
+11-18-94
+* Added Andy Harper's (A.Harper@bay.cc.kcl.ac.uk) "first round" support for
+ SOCKETSHR/NETLIB (see SOCKETSHR.ANNOUNCE). Note that it is presently
+ including ucx$inetdef.h which is not provided with SOCKETSHR or NETLIB
+ source sets, and may not be available to non-UCX sites. We're checking
+ into how to deal with that. - FM
+* Made recall buffering of shortcuts for the 'J'ump command a configuration
+ file option (in userdefs.h and/or lynx.cfg). - FM
+* Added clearerr() before the GetChar() in LYStrings.c. - FM
+* Made the optional novice help lines conform to the "standard default"
+ key bindings. Edit them appropriately in userdefs.h if you plan to use
+ other bindings with that feature.
+* Added George Lindholm's (lindholm@ucs.ubc.ca) Makefile patch for making it
+ just a tad easier to set up local compile options. - FM
+* Eliminated serial free() in LYSanctify() of LYGetFile.c. - FM
+* Restricted all "hack to fix reverse clear screen problem" code to
+ SUN4 (had missed one 8-). - FM
+11-15-94
+* Eliminated separate list and atexit deletions of redirecting anchors. - FM
+* Added Rick Dyson's (Dyson@IowaSP.Physics.UIowa.EDU) updates of the
+ descrip.mms files. - FM
+11-12-94
+* Worked in Malcolm MacArthur's (mcscs2mm@zippy.dct.ac.uk) mods for reading
+ a printer's page length from the configuration file and calculating the
+ correct number of pages for the statusline query on whether to continue
+ if the document is longer than 4 printer pages. Further modified that
+ code to use the current LYlines for the computation when the built in
+ "print to screen" option is selected. See the comments concerning
+ "PRINTER:" definitions in lynx.cfg for more information. - FM
+* Fixed HTInetStatus() in HTTCP.c to use SOCKET_ERRNO instead of errno,
+ based on the platform/transport-specific definitions in tcp.h. Thanks
+ to Danny Mayer (mayer@ljo.dec.com) for tracking down this glitch. - FM
+11-10-94
+* Added David Trueman's latest clever enhancement: The command line option
+ -homepage=URL separates the notion of a home page (or main screen) from
+ the start file. So, lynx -homepage=URL1 URL2 will start up with URL2
+ but the MAIN_MENU key will take the user to URL1 rather than URL2. This
+ is useful for public accounts that start up with an information page or
+ form, that then leads the user to a URL for the actual home page. The
+ MAIN_MENU key can thereafter be used whenever the user wishes to return
+ to the actual home page. - FM
+* Enlarged string buffer in LYEdit.c to handle large paths. - FM
+* Made 'K'eymap title and descriptions easier to edit for alternate languages
+ (e.g., Dutch or Greek) as required by Dick Wesseling (but, alas, the editing
+ still has to be done in LYKeymap.c, because it's too much to move into
+ userdefs.h; someday Lynx will have real internationalization code 8-) - FM
+* Added titles to tops of jumps files so that the nesting level will be reset
+ on reloads. - FM
+11-09-94
+* More prototyping and include file fixes in LYJump.c and LYMainLoop.c - FM
+11-08-94
+* Prototyping fix in LYJump.c. - FM
+* Miscellaneous fixes in src/descrip.mms. - FM
+* Hadn't included patch for latest LYUtils.c in lynx2-3-5.patches. - FM
+11-07-94
+* At popular request (already 8-), changed the "Jump to:" query to work
+ exactly like the "goto:" query. The previous entry is recalled, a '?'
+ must be entered explicitly to fetch the shortcut list (with an instruction
+ about that added to the prompt), and a blank entry or Control-G returns
+ the user to the current document. - FM
+--- RELEASE of 2.3.5 BETA ---
+11-05-94
+* Numerous wonderful enhancements based on patches from David Trueman, and
+ extensions of those mods. Briefly:
+* Implemented 'K'eymap command for showing all of the key bindings currently
+ in effect, with a description of their functions. This is faster and
+ more helpful than the online help's description of the default key
+ bindings. Must be uppercase 'K' if VI keys are ON, otherwise the command
+ is case-insensitive. Try it, you'll love it! - FM
+* Implemented 'J'ump command for using "shortcut" names to access URL's in a
+ local "jumps.html" file that has a sorted DL list which maps each target
+ (shortcut) DT to it's full URL DD (see the sample jumps files added to
+ the distribution). The URL's could be local or remote resources, or
+ lynxexec or launch file URL's for system utilities (e.g., the shortcut
+ "news" could invoke the news reader, "mail" the mail utility, "swing" the
+ VMS File/Directory Management Utility, etc.). This feature is enabled by
+ defining JUMPFILE in userdefs.h or lynx.cfg, and can be disabled via at
+ run time via -restrictions=jump as a commandline switch. Must be uppercase
+ 'J' if VI keys are ON, otherwise the command is case-insensitive. Try it,
+ you'll love this too! - FM
+* Added a CHECKMAIL symbol which if set TRUE in userdefs.h or lynx.cfg will
+ report the existence of unread mail at Lynx startup, and arrivals of new
+ mail, via statusline messages. VMSers can block unsoliticed system NEWMAIL
+ screen broadcasts ($ SET BROADCAST/NOMAIL) when using this feature. It
+ can be disabled at run time via the -restrictions=mail switch, which also
+ disables standard mail functions in Lynx, but still allows 'J'umps via a
+ "mail" shortcut to a lynxexec URL for a script which could perform security
+ functions before permitting or rejecting access to the mail utility. The
+ hackers will really love this! - FM
+* Added ability to toggle the novice help line to show all of the principle
+ commands. - FM
+* Miscelleanous bugs and memory leaks found and fixed in conjunction with
+ adding and enhancing the above features. - FM
+* The code may need some tweaking to build and run properly on some flavors
+ of Unix (appears to be all set for VMS). - FM
+11-01-94
+* Fixed bug if editor is dereferenced. - David Trueman (david@cs.dal.ca)
+* Enable alternate boxing of popup windows via defines for BOXVERT and
+ BOXHORI in userdefs.h - Dick Wesseling (ftu@fi.ruu.nl)
+* Check for LYCursesON before making any Curses calls in cleanup() - DW
+10-31-94
+* Looks like the last of the problems deleting anchors has been solved
+ by Dick Wasseling, so the bypass is lifted again. - FM
+* If CANT_EDIT_UNWRITABLE_FILES is defined on Unix, write access is
+ required to edit files (write and delete access are always required
+ on VMS). - Alex Whittaker (alex@biu.icnet.uk)
+* Moved "Press RETURN ..." text to userdefs.h. - AW
+10-28-94
+* Uncache documents or bookmark file before reloads (via Control-R or
+ 'r'emove command) in LYMainLoop.c. - FM
+* Uncache showinfo display or print, download, option, etc, menus before
+ reloading those in GridText.c. - Dick Wesseling (ftu@fi.ruu.nl)
+* Above two fixes still don't completely solve the anchor deletion problem,
+ so we're still bypassing.
+* Enable iso entity translations inside TITLEs - DW
+10-26-94
+* Problems when deleting anchors have been reported, apparently for
+ documents which have been (re)loaded with LYforce_no_cache. So,
+ we'll restore the bypass until that problem is tracked down. - FM
+10-25-94
+* Added coded for disabling mail for -anonymous via CAN_ANONYMOUS_MAIL in
+ userdefs.h, and via -restrictions=mail (default is enabled). - FM
+10-21-94
+* Added Danny Mayer's (mayer@ljo.dec.com) samples/lynx.com - FM
+10-05-94
+* Modified tcp.h to deal with conflicting typedefing in the MultiNet
+ types.h and time.h versus those for DECC. - FM
+* Define FANCY_CURSES for linux-ncurses. - FM
+09-30-94
+* -restrictions help list in LYMain.c should indicate "option_save" (not
+ "options_save") for disabling the saving of options in .lynxrc. - FM
+09-29-94
+Mods based on patches from George Lindholm (lindholm@ucs.ubc.ca) - FM:
+* Fixed problem when IGNORE_CTRL_C is defined, that was created by the
+ fix for runaway processes on Unix when undetected terminal disconnects
+ occurred.
+* Added options to disable rlogin and/or ftp access.
+09-28-94
+* Use "hack to fix reverse clear screen problem" in GridText.c if SUN4 is
+ defined (still need clarification on the exact nature of the problem
+ to decide if this is the best way to handle it; it bothers me to have
+ this kind of hack in the code 8-) - FM
+Mods based on patches from George Lindholm (lindholm@ucs.ubc.ca) - FM:
+* Move the "quit" text to userdefs.h from LYMainLoop.c for easier
+ customization.
+* Typo fix for buttons submit value in GridText.c
+* Reenable SIGINT signal for SVR4 machines if control-c is to be ignored
+ when editing.
+* Solaris fixes for LYCurses.h.
+* Recognize pico as a special editor.
+* Fix -restrictions help text.
+* Fix -telnet and -news options so that they actually do something.
+* Fix upload code so that you can have more than one uploader option,
+ and fix for freeing a static variable.
+* Various prototype fixes.
+* -editor command line option signals that the editor can't be changed.
+* Added a SYSTEM_EDITOR option to lynx.cfg for a locked editor.
+--- RELEASE of 2.3.4 BETA ---
+09-27-94
+* Alas! I think I've tracked down and fixed all the bugs that were causing
+ ACCVIOs/CoreDumps if anchors were deleted/freed when freeing the cached
+ documents. So now we do delete/free them. This plugs a major memory
+ leak in Lynx (which we knew about, but heretofore had to live with). - FM
+* Added Danny Mayer's (mayer@ljo.dec.com) fix so that MIME types are handled
+ case-insensitively. - FM
+* Restored text/html (WWW_HTML) as the default MIME type when an HTTP/1.0
+ server fails to send it in the headers. This happens because it's the
+ default in Mosaic and developers using that don't realize their server or
+ script code is failing to send it (other MIME types will be caught as an
+ error, and the code will be fixed by the developers). Garrett's change to
+ application/octet-stream (WWW_UNKNOWN) was technically correct. You can
+ change it back to that where indicated in HTMIME.c if you prefer that Lynx
+ be technically correct but functionally wrong when dealing with this
+ situation. - FM
+--- RELEASE of 2.3.3 BETA ---
+09-22-94
+* Finished up redirection handling. Will now handle serial redirections
+ across multiple sites (with an arbitrary limit of 10, to prevent the
+ possibilily of an infinite loop of circular redirections), works properly
+ with redirections via the VALUE fields of OPTION tags, and no longer alters
+ any anchor addresses, avoiding all the problems that caused in the hash
+ table. - FM
+* Worked in Rick Mallett's (rmallett@ccs.carleton.ca) fix for runaway
+ processes on Unix when undetected terminal disconnects occur. - FM
+* Added Eric Jon Rostetter's (ERIC@uoft02.utoledo.edu) code for proper
+ keyboard handling with DEC eightbit terminals. - FM
+* Added David Greer's (david_greer@robelle.com) mods for curses on
+ HP terminals. - FM
+--- RELEASE of 2.3.2 BETA ---
+09-17-94
+* More fix ups of forms structure handling, freeing and redirecting. - FM
+* Fixed problem with free's of startfile, thanks to Dick Wesseling
+ ftu@fi.ruu.nl - FM
+09-14-94
+* More memory leak and redirection fix ups (still not perfect). - FM
+* Various mods to speed up memory management with VAXC on VAXen (still
+ slow compared to DECC on AXPen). - FM
+09-13-94
+* If an ISINDEX document is one returned by a previous search, the 's'
+ command puts up the query which returned it, for editing as a new query
+ (use Control-U to erase, Control-G to abort) Otherwise, no string is
+ offered in the prompt for a database query. If the previous query is
+ submitted without modification, a message to use Control-R to resubmit
+ the same query is display (so that the search will not be repeated
+ inadvertently). - FM
+09-12-94
+* Fixed failure to load the popped menu properly when a gopher search was
+ selected and a NULL string, Control-G, or arrow key is entered to cancel
+ the prompt for a query. - FM
+* Hit lists/documents returned by ISINDEX searches are now always displayed
+ at their tops. They no longer inherit, inappropriately, the page and link
+ numbers of the previous list/document. - FM
+09-11-94
+* Fixed redirection handling so that the hash tables are updated and the
+ history stack works properly, including with forms that have VALUE
+ fields in OPTION tags that return Location: URL's for searches (e.g.,
+ the CUSI forms at Nexor). Whew, that took some doing! - FM
+09-05-94
+* Fixed up remaining problems with OPTION VALUE="foo" handling and the
+ associated popup window positioning and scrolling. - FM
+* Fixed bugs and several inadequacies in the history structure and code
+ (still needs some redesigning to deal more effectively with all aspects
+ of documents returned by forms and/or redirection). - FM
+* Now deals properly with anchors in a single document returned by
+ a form. - FM
+* Command line file specs on VMS can now be any valid explicit, wildcarded,
+ partial, or relative VMS specification, and will be converted to a valid
+ file://localhost/ URL, so that partial or relative URL's within the file
+ also will be interpreted properly. - FM
+* Now trims trailing white space and won't get tripped up by '=' characters
+ when reading configuration files. - FM
+* Miscellaneous bug fixes and enhancements. - FM
+* Tracked down and eliminated more memory leaks. - FM
+--- RELEASE of 2.3.1 BETA ---
+7-08-94
+* Correction handling of OPTION VALUE="" implemented.
+* Miscellaneous bugs corrected.
+6-17-94
+* Option to log memory leaks at exit by defining LY_FIND_LEAKS at compilation.
+6-17-94
+* Check amount of allocated memory, rather than just number of documents
+ cached, before deciding to remove the oldest document (implemented for
+ VMS with VAXC, not yet for Unix or VMS with DECC).
+6-16-94
+* VMS bookmark file version numbers are reset on additions of bookmarks.
+6-16-94
+* Gopher URL's with /hGET%20/ are converted to http URL's, as in the UMN
+ Unix/VMS gopher+ client.
+6-16-94
+* Added DIRECT_WAIS support for VMS
+6-16-94
+* Added build support for VMS TCPWare TCP/IP
+5-28-94
+* Increased nesting of HTML elements from 40 to 400. Hopefully this will limit
+ won't be encountered often.
+5-28-94
+* Modified for handling of Telnet URLs with spaces/other characters in the
+ username.
+5-26-94
+* Began terminating memory leaks with extreme predjudice.
+5-24-94
+* WAIS searches will now work when they are of type "www/present" as opposed
+ to only viewing the source.
+5-23-94
+* Added VMS CMU TCP/IP support, thanks to Andy Harper.
+--- RELEASE of 2.3 (19-May-1994, see CHANGES2-3) ---
diff --git a/docs/CHANGES2.5 b/docs/CHANGES2.5
new file mode 100644
index 0000000..4982534
--- /dev/null
+++ b/docs/CHANGES2.5
@@ -0,0 +1,1696 @@
+--- Rename of Lynx2-4-FM and release as Lynx2-5 (02-May-1996) ---
+==============================================================================
+05-02-96 ---- Release of Lynx2-5 ----
+* Modified documentation, help, and example files based on feedback for
+ yesterday's Lynx2-5 pre-release. - FM
+* Include ";q=0.001" whenever "iso8859-1" or "us-ascii" are autoappended
+ to Accept-charset headers. - FM
+* Added SITE_LIBS symbol in Makefile for convenient linking to any
+ site-specific libraries associated with any site-specific patches. - FM
+* Fixed an unsigned char typecast in GridText.c - FM
+* Eliminated statusline and TRACE warnings about possibly strange formatting
+ when TABLEs are in a document. - FM
+05-01-96
+* Renamed Lynx2-4-FM for pre-release as Lynx2-5
+04-30-96
+* Modified the fatal error messages such that they direct the user to
+ the local system administrator to confirm a bug before reporting it
+ to lynx-dev, and started updated the help and about files for the
+ switch to lynx-dev@sig.net as the primary list server. - FM
+04-28-96
+* Made use of ordered versus unordered lists and inclusion of article dates
+ in listings for news groups compilation and configuration options in
+ userdefs.h and lynx.cfg. - FM
+04-27-96
+* Added -realm switch for restricting URLs to the realm of the startfile.
+ The bookmark and jumps files are always considered as part of the realm.
+ Any execution links or form ACTIONs are permitted if obtained from
+ documents in the realm, but any switches that restrict bookmark operations
+ will still apply. For example, -book -realm will use the bookmark file
+ as the startfile, and restrict URLs to files in the user's account. Adding
+ -restrictions=bookmark_exec will block execution links in the bookmark
+ file, but not in other files within the realm (i.e., in the user's
+ account). If the startfile is an http URL, the realm will be equivalent
+ to that in http authorization procedures. Can be used with -traversal
+ for restricting the traversal to documents within the starting realm
+ for an http server. - FM
+* Fixed bug in form structure which could cause POST to be treated as
+ GET. - FM
+04-25-96
+* Added code to send Host: headers as described in the 23-Apr-96 HTTP/1.1
+ draft. - FM
+04-23-96
+* Modified HTMIME.c to pass documents with an ISO-8859-3 through -9, EUC-KR,
+ or ISO-2022-KR charset specified in the Content-Type header, to set the
+ flag for not doing 8-bit reverse translations, and to issue a statusline
+ message about the charset instead of forcing a download offer. Will have
+ garbage in the displays of 8-bit characters if one doesn't have the
+ corresponding charset installed for the terminal, but no harm should be
+ done, and those who do can get the files displayed instead of just being
+ up the creek without a paddle. Korean escape sequences will still be
+ trashed, since be have no translation functions as for Japanese, and we
+ still force a download offer if there is a mismatch for the supported
+ character sets, so the user can cancel and then modify the terminal setup
+ and charset choice appropriately. - FM
+* Increased the maximum number of attributes for tags (was too small for
+ OBJECT), updated the DTD for SCRIPT, and added the STYLE attribute for
+ all tags which presently, or might someday, accept it. - FM
+04-21-96
+* Modified the news gateway to use an ordered list with the numbers and
+ dates of the articles indicated in newsgroup listings. - FM
+* Fixed the checking and passing of the mailto argument in LYMainLoop.c
+ to mailmsg() in LYMail.c. - FM
+04-20-96
+* Fixed bugs in parsing of nntp and snews partial HREFs, and in the
+ parsing of NNTP message headers for creation of mailto and newspost
+ or newsrepy links. - FM
+04-19-96
+* Added OBJECT and BODYTEXT to the DTD, based on the 12-Apr-96 W3C draft.
+ The code for INSERT is still there, and should be remove if OBJECT
+ becomes a stable replacement. Code to handle data URLs for OBJECTs
+ not yet attempted. - FM
+* More tweaks for Japanese character handling. - FM
+04-18-96
+* If LINKS_ARE_NUMBERED is on, include the list of references in the
+ outputs of 'p'rint menu options, analogously to the output with
+ -dump. - FM
+04-14-96
+* Mods to report the content of SCRIPT, STYLE and ALIAS blocks in trace
+ mode. - FM
+* Made &die;, &macr; and &trade; synonyms for &uml;, &hibar; and &reg;,
+ respectively. - FM
+* Fixed typo in second line link highlighting code for slang. - ES
+04-13-96
+* More tweaks of Japanese character handling. - FM
+* Reinitialize timeout values after select() calls in LYUtils.c. - ES
+04-12-96
+* More tweaks of Japanese character handling. - FM
+* Tweak of target line and link setting when toggling to image_links mode
+ in LYMainLoop.c. - FM
+* Tweaks of circular buffer handling based on analyses from Mike Castle
+ (mcastle@umr.edu) and Bryan T. Vold (btv@ldl.HealthPartners.COM). - FM
+* Fixed typo for NeXT in tcp.h, based on feedback from LWV - FM
+* Reinitialize timeout values after select() calls in HTTCP.c. - Erik
+ Sundkvist (ess@lysator.liu.se)
+04-11-96
+* More tweaks of Japanese character handling. - FM
+* Added code for handling charset mappings for file and ftp URLs. - FM
+ You can set the mappings via lynx.cfg (or mime.types), e.g.:
+ SUFFIX:.html8R:text/html; charset=KOI8-R
+ SUFFIX:.txt8R:text/plain; charset=KOI8-R
+* Tweak of charset handling in HTMIME.c - FM
+04-09-96
+* Modified news gateway to handle split header lines. - FM
+* Tweaks of authorization header handling to make failures due to bad
+ headers from the http server clear to the Lynx user. - FM
+04-08-96
+* Yet more tweaks of memory management. - FM
+04-07-96
+* Tweaks for handling Japanese received via gateways. - FM
+04-06-96
+* More memory management tweaks. - FM
+04-05-96
+* Updated lynx.man, lynx.hlp and the online help files. - FM
+* Tweaks of INPUT, TEXTAREA and SELECT popup OPTION handling when
+ Japanese character translations are on. - FM
+04-04-96
+* Created new zip. Yesterday's appears to have been bad. - FM
+04-03-96
+* More optimizations and bug fixes based on patches from JED. - FM
+* More mods for handling keyboard input via SLANG library functions,
+ based on patches from JED. Note that the code for IGNORE_CTRL_C
+ has been bypassed in those mods, as they presently stand. - FM
+04-02-96
+* Added "first pass" handling of P end tags. - FM
+* Mods of HTCheckForInterrupt() for SLANG, based on patches from JED.
+ Note that the for-SLANG code is not taking possible SOCKSification of
+ Lynx into account. - FM
+* Use 3 for ^C instead of 7 for ^G as the argument for the slang abort
+ key in calls to SLang_init_tty(). - JED
+* Tweaks of make for clix. - AM
+03-31-96
+* More tweaks of memory management. - FM
+03-30-96
+* Added support for Japanese translations of text/plain in addition to
+ text/html documents, and for ALTs and form fields (see 03-26-96 mods).
+ Needs checking. Also added an LYK_JPN_TOGGLE, mapped to '@' by default,
+ for toggling JAPANESE mode ON and OFF, and code to indicate the situation
+ in the 'o'ptions menu. - FM
+* Added make for ultrix-slang and decstation-slang, and tweaks of LYCgi.c
+ for ultrix. - Alvian Tam (atm@newt.phys.unsw.edu.au)
+* Found and fixed some typos in yesterday's mods. - FM
+03-29-96
+* Added build-slang.com for building Lynx with the SLANG library instead
+ of curses on VMS. - FM
+* Mod to treat an EOF with errno of EINTR when GetChar() is defined as
+ getchar() in LYgetch() as due to a Ctrl-Z suspend, and invoke another
+ character fetch instead of exit on error. Based on patch from Gregory
+ Neil Shapiro (gshapiro@WPI.EDU). - FM
+* Numerous optimizations and bug fixes based on patches from JED. - FM
+03-28-96
+* More tweaks of SLANG support. - FM
+* Yet more tweaks of the HTList functions and macros, and their associated
+ memory management. - FM
+03-27-96
+* Fixed bug which could cause a crash if links are numbered and you
+ activate a link via a number when there are no links on the currently
+ displayed page. - FM
+* Tweaks of Content-Encoding header handling, and more detailed messages
+ about it in trace mode. - FM
+03-26-96
+* Added code in HTMIME.c for taking into account Content-Encoding headers,
+ so that compressed text/html or text/plain files are not displayed
+ inappropriately based on their Content-Type. - FM
+* Added "first pass" support for Japanese character translations, based on
+ patches for Lynx2-4-1 by Takuya Asada (asada@icsd6.tj.chiba-u.ac.jp). Is
+ to be checked out by Nelson Henry Eric (nelsonhe@ews07.nara.kindai.ac.jp)
+ because I have no way to check it here. Translations can be made the
+ default behavior by setting JAPANESE to TRUE in userdefs.h and/or
+ lynx.cfg. The default can be toggled via a "-jpn" command line switch.
+ If made TRUE by any means, the value of KANJI_CODE set in userdefs.h
+ and or lynx.cfg (EUC, SJIS, or NONE) will be applied, and can be changed
+ via "-euc", "-sjis" or "-ascii" command line switches, for setting Kanji
+ code translations to EUC, Shift JIS, or disabling it, respectively. Note
+ that Japanese translations are not yet performed in the line editor
+ (LYgetstr() of LYStrings.c and form_getstr() of LYForms.c), for form
+ field values, or for gateways (let's first see if what I've done so far
+ works right 8-) - FM
+* Added "LY" prefix for pop(), pop_num() and push() function names to
+ avoid possible conflicts with the ncurses library functions, and fixed
+ continuation line typo in solaris2 make, based on feedback from PN. - FM
+03-23-96
+* Tweaks of memory management in the CSO/PH gateway. - FM
+* Tweaks of wait() versus waitpid() handling for NeXT, aix4 and mips,
+ based on feedback from PN. - FM
+03-22-96
+* Tweaks of SLANG support for Unix, and finished up code support for it on
+ VMS (but tested only with OpenVMS/AXP). Haven't yet decided how to add
+ VMS build support for it in the COM and MMS files. Get the SLANG library
+ code from ftp://space.mit.edu/pub/davis and then add USE_SLANG in the
+ DEFINE list and the path to it's headers in the INCLUDE list for the
+ compilation, and [path]slang.olb/lib in the link list immediately before
+ the OPT file. We still need the curses library in the OPT file, because
+ that's not just curses functions on VMS and we're using ones not replaced
+ by the SLANG library (Try it, you'll like it! 8-). - FM
+* Tweaks for NeXT, based on feedback from Paul Nevai
+ (nevai@ops.mps.ohio-state.edu). - FM
+03-20-96
+* Tweaks of code for sorting directory listings by date (take into account
+ the 6-month-old time versus year rule on Unix). - FM
+* Tweaks of memory management for HTList-based buffers (use internal
+ allocations, instead of the libwww macros). - FM
+* Added solaris2-slang to Makefile, and tweaks of the sun4 makes. - LWV
+03-19-96
+* Tweak of MAP handling so that the ordered lists are displayed exactly
+ in the order of the resolved AREA tags.
+03-18-96
+* Added SLANG support (for colorized Lynx) based on patches from JED.
+ The make support is for linux and sun4, but it should be portable to
+ other Unix flavors. I have it working on VMS, but the SLANG interrupt
+ and exit handlers are incompatible with the current ones for VMS in
+ Lynx (and with the VMS debugger), so I haven't yet included SLANG
+ support in build.com or the MMS files. - FM
+03-17-96
+* Tweaks of 'd'ownload menu handling on returns to it from a DOWNLOADER
+ action. - FM
+* Added various anti-crash protections and cleaner code from John E. Davis
+ (davis@space.mit.edu) for trimming trailing white space and finding
+ unescaped colons in LYReadCFG.c, and cleaned up and more fully commented
+ the functions and subfunctions in that and the LYMainLoop.c modules. - FM
+03-16-96
+* Fixed routine which sorts directory listings by date (based on 'o'ptions
+ menu setting) to do it accurately and in reverse chronological order. - FM
+03-15-96
+* Added code to create links for likely URLs in results returned by
+ the CSO/PH and finger gateways. Try:
+ gopher://ns.bradley.edu:105/2 or:
+ cso://ns.bradley.edu/ and search for David Henderson.
+ Also try:
+ gopher://cegt201.bradley.edu:79/0/w%20davidh or:
+ finger://cegt201.bradley.edu/w/davidh as URL.s - FM
+* Added LYK_INTERRUPT handling for the CSO/PH and finger gateways, and
+ made their memory management more efficient. - FM
+* Made the my_spawn() function in LYLocal.c more portable by using
+ waitpid() instead of wait(). - FM
+* Restored the Lynx2-3 behavior of seeking the current position and link
+ on return from 'e'dit. May be wrong if the file was modified, but it
+ might be in the right ball park, and nothing really bad will happen if
+ it's far off. - FM
+03-14-96
+* Added -reload switch for instructing Lynx to send "Pragma: no-cache" and
+ "Cache-Control: no-cache" headers when requesting the startfile from an
+ http server (doesn't apply to subsequent fetches, or to non-http startfile
+ URLs). - Peter Ekberg (peda@lysator.liu.se)
+* Put the correct LYMain.c, which declares no_change_exec_perms, in the zip
+ (second try, hope I really did 8-). - FM
+03-13-96
+* Yet more tweaks of the CSO/PH gateway. - FM
+* Yet more tweaks of the finger gateway. - FM
+03-12-96
+* Made the URL and command buffering in the finger gateway secure from stack
+ modifications, beautified the HTLoadFinger() and response() functions, and
+ added support for the following URL formats for sending a "", "/w",
+ "username", or "/w username" command to the finger server:
+ finger://host finger://@host
+ finger://host/ finger://@host/
+ finger://host/%2fw finger://@host/w
+ finger://host/w finger://host/w/
+ finger://host/username[@host] finger://username@host
+ finger://host/username[@host]/ finger://username@host/
+ finger://host/w/username[@host] finger://username@host/w
+ finger://host/%2fw%20username[@host] finger://host/username[@host]/w
+* Replaced the _tolower macro in the CSO/PH gateway with TOLOWER. - FM
+* Tweaks of DIRED_SUPPORT. Added NO_CHANGE_EXECUTE_PERMS compilation
+ symbol and change_exec_perms restrictions switch for restricting
+ changes of the eXecute permissions to directories, and not files,
+ when OK_PERMIT has been set. - Earl Fogel (fogel@duke.usask.ca) & FM
+* Added make support for Intergraph CLIX (note that some online help files
+ must be edited and renamed to meet this Unix flavor's 14 character file
+ name limit). - Alex Matulich (matuli_a@marlin.navsea.navy.mil)
+03-11-96
+* Added support for using finger://host/w/username to send "/w username"
+ to finger (port 79) servers. - FM
+* Tweaks of alignment handling to deal with (illegally) embedded CENTER
+ containers (typically due to omission of an end tag for the first
+ CENTER of the pair; ugh!). - FM
+03-10-96
+* Added form-based CSO/PH (port 105) gateway. Can be invoked via a
+ cso://host[:port]/ or gopher://host[:port]/2 URL. If the gopher
+ format is used and a query token is appended (?[query]), the old
+ ISINDEX-based gateway will be used. - FM
+03-07-96
+* Added NO_FROM_HEADER configuration symbol in lynx.cfg, and -nofrom
+ command line switch, for blocking all transmissions of From headers
+ by Lynx. - FM
+* Added NO_REFERER_HEADER configuration symbol in lynx.cfg, and -noreferer
+ command line switch, for blocking all transmissions of Referer headers
+ by Lynx. - FM
+* Enhancements of the 'o'ptions menu. - FM
+03-06-96
+* Restored the Lynx2-3 behavior of seeking the current document position
+ and link on (^R)eloads. Will be wrong if the document is actually a
+ changing script output, or SSI with changes in the sizes of inserts,
+ and any form entries will be lost with no warning about that if no
+ form links are in the currently displayed page (and there may be other
+ glitches I don't remember any more). However, it's correct, and more
+ convenient, most of the time, and nothing really bad will happen if
+ it's wrong. - FM
+03-05-96
+* Added SAVE_SPACE configuration symbol in lynx.cfg, and LYNX_SAVE_SPACE
+ environment variable (Unix) or logical (VMS) for setting a default path
+ prefix in suggested filenames in Save to Disk operations of the 'p'rint
+ and 'd'ownload menus. If not set, only a filename will be suggested,
+ for saving in the current default directory. See the INSTALLATION file
+ and lynx.cfg for more information. - FM
+03-02-96
+* If an IMG tag has both ISMAP and USEMAP attributes, create links for
+ both, and use the ALT string, if present, for the USEMAP link. The
+ server-side script might have a content-rich default set up for non-GUI
+ clients, so we may as well be able to try it, and still have our own
+ USEMAP listing available if it's a site unconcerned about text and
+ braille clients, or GUI clients with image loading turned off. - FM
+* Tweaks of MAP code to maximize efficiency of fetching and processing
+ MAPs from a different document. - FM
+* Make sure the traversal code doesn't get tripped up by any HREFs
+ which contain newline characters due to misparsing (e.g., because a
+ close-double-quote wasn't present where required, and soft_dquotes
+ wasn't toggled ON, or invalid comments were present, and minimal or
+ historical comment parsing weren't toggled ON). - FM
+* Renamed LYK_RESUBMIT ('x' or 'X') to LYK_NOCACHE and modified it's code
+ so that it applies to normal links as well as form submit buttons. If
+ used instead of LYK_ACTIVATE, any HText cache from a previous submission
+ or request will be dumped, and the submission or request will be made
+ with the "Pragma: no-cache" and "Cache-Control: no-cache" headers
+ included, to ensure that a proxy/cache server also will not return a
+ cached copy (assuming it respects either of those headers). - FM
+03-01-96
+* Converted the client-side image MAP code to a protocol which returns
+ a stream, rather than using a temporary file. This allows saving
+ the link as a bookmark, for fetching the MAP and creating a listing
+ without need to fetch and render the original document. Also enabled
+ direct downloading of the MAP listing. - FM
+02-29-96
+* Added handling of client-side image MAPs. If both USEMAP and ISMAP
+ attributes are present, the client-side MAP is used instead of the
+ the server-side script. The MAPs can be in the same or different
+ documents. The HREFs of the AREA tags are presented as a list,
+ with their ALTs (if present, otherwise their HREFs) as the link names
+ in the list. Added a TITLE attribute for MAPs, which will be ignored
+ by GUI clients, but if present will be used by Lynx as an H1 for the
+ list (MAP NAME="welcomemap" TITLE="Welcome Map"). Otherwise, the
+ IMG's ALT (if present, otherwise "[USEMAP]") will be used as an H1
+ in the list. The MAP's resolved URL also is shown in the list, since
+ the URL for the list is a temporary file. - FM
+02-25-96
+* Added a MINIMAL_COMMENTS configuration symbol, which if set TRUE in
+ lynx.cfg will emulate the Netscape v2.0 comment parsing bug of seeking
+ only a '-->' terminator, and not interpreting '--' pairs as serial
+ comments within the overall comment element. The compilation default
+ is FALSE, but we'll set it TRUE in lynx.cfg until Netscape gets its
+ comment parsing right, and "decorative" dashes in comment elements
+ cease to be so common in "Enhance for Netscape" pages. Also added
+ a '-minimal' command line switch for toggling the Minimal or Valid
+ configuration setting, and an LYK_MINIMAL command key toggle (mapped
+ by default to backquote). Note that setting Historical comments on
+ will override the Minimal or Valid setting (i.e., any '>' will be
+ treated as the terminator of a comment element). A statusline
+ message indicates whether Historical, Minimal or Valid comment
+ parsing has gone into effect when the LYK_MINIMAL or LYK_HISTORICAL
+ command key toggles are used (i.e., those two toggles in effect are
+ a "troggle"). - FM
+02-22-96
+* Tweak of HTList manipulations. - FM
+* Additions to the online help. - FM
+* Unescape any hex escaped username and/or password in ftp URLs. - FM
+02-20-96
+* Handle timeout disconnects of cached NNTP connections. - FM
+* Allow head or tail match specifications (e.g., comp.infosystems.*
+ or *.unix) in news, nntp and snews URLs (That's illegal, so don't
+ use it in public documents.). - FM
+* Tweak of bookmark handling. - Ismael Cordeiro (ismael@CAM.ORG)
+02-16-96
+* Tweak of the new code for setting a default CHECKED radio button. - FM
+02-15-96
+* Issue a sensible exit message if a non-http URL is used as the startfile
+ with -traversal. - FM
+* Tweaks of bookmark handling. - FM
+* Tweaks of Home_Dir() type casting. - FM
+02-14-96 Happy Valentine's Day!!!
+* Tweaks of charset conversions. - FM
+02-12-96
+* Made inclusion of Unix DIRED_SUPPORT the compilation default, and
+ its refinement easier to understand and set in the Makefile. - Will
+ Mengarini (seldon@eskimo.com) & FM
+* Changed (X) and ( ) to [X] and [ ] for indicating checked or unchecked
+ checkboxes. For radio buttons, we still use (*) and ( ). - FM
+02-11-96
+* Distinguish checkboxes from radio buttons in the Lynx display by using
+ (X) versus (*), respectively, when they are checked or selected. - FM
+* Make the first radio button in a series with the same NAME checked by
+ default if none of them had CHECKED specified. - FM
+02-09-96
+* Added LYK_HISTORICAL and LYK_SOFT_DQUOTES, mapped by default to the
+ the single- and double-quote keys, respectively, for toggling valid
+ versus "historical" comment parsing, and valid versus "old Mosaic-
+ and Netscape-like" double-quote parsing. - FM
+* Added SCRIPT to the DTD and code to ensure that bad comments in its
+ content don't generate garbage in the display. - FM
+* Added -DSVR4 to the make for solaris2. - KH
+* Use copy instead of rename in descrip.mms for putting lynx.exe in the
+ top directory, as in build.com. - FM
+* Added TITLE attribute to FORM, and code to use it for the Subject in
+ mailto ACTIONs. It's not in the spec, but better to offer it than
+ to settle into Netscape's ?subject=foo tack-on kludge which breaks
+ mailto for clients which haven't added code to cope with it. - FM
+02-08-96
+* Added -book switch for using the bookmark page as the startfile. The
+ default or command line startfile will still be set for the 'm'ain screen
+ command, and be used as the startfile if the bookmark page is unavailable
+ or blank. - FM
+* Fixed glitch for Unix in yesterday's LYMail.c mods. - FM
+* Try graceful alternatives if getenv("HOME") returns NULL. - Kenneth Herron
+ (kherron@campus.mci.net) & FM
+02-07-96
+* Added support for the ?subject=foo tack-on kludge to specify the Subject
+ in mailto ACTIONs and HREFs. - FM
+* Convert Explorer's semi-colon Internet address separators to commas
+ before acting on mailto address lists on Unix or VMS. - FM
+* Made EMBED empty again (the W3C container version has been replaced
+ by INSERT, and Netscape still has it empty). - FM
+02-06-96
+* Tweaks of descrip.mms files for VMS. - FM
+02-04-96
+* Fixed caching of news/nntp connections so that we access the correct host
+ when more than one has been specified. - FM
+02-03-96
+* Added ndash and mdash to the entities conversion tables. The W3C's
+ DTD specifies those, whereas the text descriptions say endash and
+ emdash, so we'll cover all the bases by supporting all four. - FM
+* Reduced the "en" metric for TAB to 2 per column. Was 12, to be
+ compatible with UdiWWW, but that's pixels. You can change the enval
+ initialization in HTML.c from 2 to 12 if you want the old behavior. - FM
+* Force use of DECC in build.com if that compiler is installed on VMS,
+ and make sure external logicals don't defeat a choice of DECC via
+ descrip.mms. - FM
+02-02-96
+* Mods to handle lone CRs as newlines when displaying text/plain files
+ from MAC servers. Note that they'll stay CRs when downloading, or
+ fetching with -source, but be handled as newlines when the '\' source
+ toggle is used for text/html files and their source is displayed as
+ text/plain. - FM
+01-31-96
+* Added dummy initializers in LYCharSets.c and LYEditmap.c to ensure the
+ modules are linked if the external model is common block and they are
+ placed in a library. - FM
+01-30-96
+* For submissions of forms with a mailto ACTION, allow the user to edit
+ the default Subject string (the TITLE of the document containing the
+ form) via a statusline prompt, or to cancel the submission via Ctrl-G
+ at the prompt, analogously to 'c'omments or for anchors with a mailto
+ HREF. - FM
+01-29-96
+* Typo fixes in HTML.c, LYJump.c and LYGetFile.c. - PM
+01-28-96
+* Tweaks of redirection handling. - FM
+01-27-96
+* Support use of the TITLE attribute for setting the Subject in LINKs with
+ REV="made" or REV="owner" and a mailto HREF, equivalently to its use
+ with anchors in the BODY. - FM
+* Always use the parent document's URL for X-URL in mailto anchors, but
+ still use mailto:address if it was entered as a 'g'oto. - FM
+* Improvements of the code in LYMainLoop.c for checking the types of
+ links (first make sure that there are links to check 8-). - FM
+01-26-96
+* Made LYCharSets.c an object module instead of header for HTML.c, and
+ created LYCharUtils.c with character-related functions from HTML.c,
+ to reduce the size of HTML.c (got a report of memory exhaustion when
+ trying to compile HTML.c). - FM
+* Added BGSOUND to the DTD and code for creating a link to the source
+ when clickable_images is set. - FM
+01-24-96
+* Tweak of URL resolving when http servers return the obsolete file URL
+ format for what are actually ftp URLs (as DEC's servers are doing). - FM
+* Added LYE_LOWER and LYE_UPPER for lower or upper casing lines with the
+ line editor. Default bindings are Ctrl-K and Ctrl-T, respectively (not
+ "intuitive" but they're the only "safe" non-printing keys left 8-). - FM
+01-23-96
+* Yet more tweaks aimed at getting Lynx to compile across versions of
+ MultiNet through v3.5A and DECC through v5.2 or VAXC. Pat Rankin
+ is trying to cope with this mess for compilations with MultiNet and
+ his VMS port of GNUC (cross your fingers 8-). - FM
+* Updates of the help and about files. - FM
+* Tweak of sendmail path for BSDI. - Bennett Todd (bet@ritz.mordor.com)
+01-22-96
+* More tweaks for dealing with header conflicts in MultiNet v3.5A with
+ DECC v5.2. - FM
+* Tweak of our kludge to append a 0,0 coordinate pair for ISMAP URLs. - FM
+* Tweaks of base handling in HTML.c. - FM
+01-20-96
+* Mods for builds with NetBSD, or MultiNet v3.5A with DECC v5.2 (they
+ have conficting headers). FM & PR
+01-18-96
+* Improved and corrected the fatal error messages. - FM
+01-17-96
+* Added ability to set the NNTPSERVER environment variable via lynx.cfg if
+ it has not been set externally (analogously to the proxy variables). - FM
+* Tweaks of proxy handling. - FM
+* Modified the "Accept-Language: " header handling so that it uses the
+ "preferred document lang(G)uage" string without any modifications.
+ This allows the user to specify a comma-separated string with quality
+ values included, exactly to his/her requirements. - FM
+01-16-96
+* Modified the traversal code so that it always outputs to an error file if
+ requests fail or unknown statuses are received from the http server. - FM
+* Added target "sun4-ncurses" to the Makefile. - Bennett E. Todd
+ (bet@nyc.fcmc.com)
+* Tweaks of "preferred document lan(G)uage" and "preferred document c(H)arset"
+ 'o'ptions handling. Send only the preference or comma-separated list of
+ preferences in the "Accept-Language: " and "Accept-Charset: " headers.
+ Append ", en" if "en" isn't present, and ", ISO-8859-1" and/or ", US-ASCII"
+ if those aren't present, rather than relying on servers to honor defaults,
+ but still don't send an "Accept-Charset: " header at all if no preference
+ has been specified by the user. - FM
+* Fixed typos in the about and help files. - FM
+01-15-96
+* Tweaks of bold and underline setting in split_line() of GritText.c. - FM
+* Fixed handling of FORM start tags with no ACTION specified. - FM
+* Tweaks of "IBM PC character set" and added "IBM PC codepage 850"
+ (ISO8859-1, see IBMPC-charsets.announce). - Mike Brown (mike@hyperreal.com)
+* Check in userdefs.h whether LYNX_CGF_FILE has been defined via the
+ Makefile, build.com or descrip.mms. - PG
+* Created CHANGES2-3 with changes through release of Lynx2-3 on 04-19-94,
+ and CHANGES2-4 with subsequent changes through the rename of lynx2-3-FM
+ to Lynx2-4 and its release on 06-18-95, and deleted those sections from
+ this file. - FM
+* Added the new Copyright and links to it in about_lynx.html. - FM
+01-11-96
+* Tweaks of HTWAIS.c for compatibility across versions of FreeWAIS. - FM
+* Unescape any hex escaped percents in mailto URLs and ACTIONs. - FM
+01-10-96
+* Added an LYCheckForProxyURL() function, and a PROXY_URL_TYPE return value
+ for is_url(), so that Lynx can proxy URLs with an unknown scheme if a
+ proxy for the scheme has been set, e.g., if "foo_proxy" has been set
+ to "http://host/", then "foo:blah", where "blah" may or may not begin
+ with a slash, will be handled as "http://host/foo:blah". Components of
+ "blah" will be checked versus "no_proxy", if set, but since we don't
+ know the default port for scheme "foo", the checks for any ports
+ associated with the no_proxy values may not be reliable (but if we
+ don't proxy, nor know the scheme, nor find "foo:blah" as a local file,
+ the URL would fail, anyway) - FM
+* Fixed typo in VMSPrint.com. - Paul Farnham (farnham@pasco.wednet.edu)
+01-06-96
+* Tweak of traversal code. - FM
+01-04-96
+* Tweak of dynamic SOCKS mods. - TZ
+01-03-96
+* Added circular recall buffers for JUMP shortcuts. If multiple jumps
+ files are installed, each has it's own recall buffer. If Lynx was built
+ with PERMIT_GOTO_FROM_JUMP defined, any random URLs accessed via the JUMP
+ command are placed in the goto circular buffer, not that for shortcuts,
+ and a JUMP entry of the single character ':' for the target is treated
+ as a command to invoke the circular buffer of previously resolved goto
+ URLs (as if 'g'oto followed by Up-Arrow were used). - FM
+* Added GOTOBUFFER, homologous to JUMPBUFFER, for specifying via userdefs.h
+ and/or lynx.cfg whether to offer the previous goto URL, if any, for
+ reuse or editing whenever the 'g'oto command is entered, or simply rely
+ on invoking the circular buffer via the Up-Arrow and Down-Arrow keys for
+ accessing previously resolved goto URLs. - FM
+* Tweak of 'g'oto recall buffering loop in LYMainLoop.c. - AH
+01-02-96
+* Added circular recall buffering for 'g'oto URLs. Is invoked (if previous
+ URLs have been entered) via Up-Arrow or Down-Arrow after entering the
+ 'g'oto command. - FM
+* Added circular recall buffering for WHEREIS queries. Buffer is shared with
+ that for ISINDEX queries, and invoked via Up-Arrow or Down-Arrow following
+ the WHEREIS ('/') command. The 'n'ext command still uses the last WHEREIS
+ query, not necessarily the last entry in the recall buffer, which might
+ have been entered via a 's'earch command for an ISINDEX document. - FM
+* Extended treatment of FORMs which have only one INPUT (TYPE="text") field
+ for user entries as SUBMITting on press of RETURN in that field, so that
+ this behavior is retained if INPUT TYPE="hidden" fields are present. - FM
+* Tweaks of bookmark deletion sanity checks. - DT
+01-01-96 (Happy New Year!!!!)
+* Added circular recall buffer for ISINDEX queries. Up-Arrow will cycle
+ you from the most current query in the list to previous ones, and roll
+ from the oldest to the most current. Down-Arrow will cycle from the
+ oldest query to subsequent ones, and roll from the most current to the
+ oldest. If a previous query is reused, it is removed from the recall
+ buffer and reinserted as the most current.- FM
+* Plugged memory leaks in LYUtils.c and LYJump.c. - FM
+12-30-95
+* Added LOCALHOST_ALIAS symbols for lynx.cfg which can be set to local
+ host aliases or to trusted hosts at other sites which will be accepted
+ as "local" when the -localhost switch is set. - FM
+* Added the endash and emdash entities. - FM
+12-29-95
+* Use exit(0) versus exit(-1) more consistently for normal versus abnormal
+ exits, respectively. - FM
+12-26-95
+* Tweak of RELOAD handling for lynxcgi URLs. - FM
+* More anti-crash protections for bad HTML. - FM
+* Tweak of dynamic SOCKS mods. - TZ
+12-23-95
+* Tweaks of directory building on VMS. - FM
+* Tweaks of log file declarations for direct wais builds. - FM
+* Tweak of DIRED_SUPPORT mods so that non-TAG entries don't show up when
+ there are tagged files. - DT
+12-22-95
+* Added HTMake_VMS_name() to HTFTP.c for use by Unix as well as VMS with
+ VMS ftp servers. - FM
+* Added INSERT and ALIAS to the DTD, updated PARAM and OVERLAY, and made
+ FIG a paragraphing block, all as described in the 12-21-95 W3C working
+ draft for INSERT. In contrast to FIG, the INSERT and "heritage" EMBED
+ and APPLET elements invoke paragraphing only if their content displayed
+ by Lynx dictates it. The rules for resolving the sources for INSERTs or
+ for handling its ISMAP attribute are extremely complicated, and are not
+ implemented. Let's wait to see how people in the "real world" try to
+ make sense of them and actually use INSERT (if they do 8-). We still
+ create source links in "clickable_image" mode for the "heritage" versions
+ of FIG, OVERLAY, EMBED and APPLET markup, and send a 0,0 cooridinate pair
+ for IMG with the ISMAP attribute. See comments in HTML.c - FM
+12-21-95
+* Fixed bug in yesterday's ftp password-handling mods that could cause a
+ crash, and handle ftp://user:@host/path as specified in RFC 1738. - FM
+* Added protection against crashes for SELECT tags without the (required)
+ NAME attribute. - FM
+* Added code in HTFTP.c for recognizing MS Windows (Chameleon NEWT) servers
+ and parsing their LIST output (tested on ftp://emoryi.jpl.nasa.gov/) - FM
+* Another typo fix for VMS GNUC in HTFinger.c. - FM
+* Modified HTFTP.c to use personal_mail_address, if available, for the
+ password with anonymous FTP. It will still use "user@" (trim off the
+ host) if the host does not contain a dot and thus could not be a fully
+ qualified domain name, so it will work with Unix servers such as
+ ftp.uu.net (see get_connection() in HTFTP.c), but this will cause it
+ to fail with MS Windows servers. - FM
+* Added lots more info to the trace output for the ftp gateway. - FM
+12-20-95
+* Modified HTFTP.c to handle a hex escaped slash (%2F) following the
+ "punctuation" slash according to the strict provisions of RFC 1738
+ when connected to VMS ftp servers, so that a device can be in the
+ path and not be mishandled as a subdirectory, e.g., the URL
+ ftp://user:password@host/%2Fsys$common/syshlp
+ will create a directory listing for sys$common:[syshlp]. - FM
+* Fixed typo for VMS GNUC in HTFinger.c. - FM
+12-19-95
+* Enhancements of Unix DIRED_SUPPORT (see header of LYLocal.c). - DT
+12-18-95
+* Tweaks of element and entity structure alignments. - FM
+12-17-95
+* Tweaks of APPLET CODEBASE attribute resolving. - FM
+* Added support for a -nosocks command line switch to turn off SOCKS proxy
+ usage if Lynx was SOCKSified. - Thomas Zerucha (tz@execpc.com)
+12-16-95
+* Added the APPLET element and attributes to the DTD, and code for
+ creating links to the Applet code via image_links - FM
+* Added code to handle password fields in telnet URLs. - FM
+* Expanded EMBED as an "attribute soup" (for compatibility with
+ old versions of Netscape). - FM
+12-15-95
+* Added PARAM, and its attributes in the W3C draft for EMBED, to the DTD,
+ and code in HTML.c to minimize the possibility of an INPUT belonging to
+ an EMBED being misassociated with a standard FORM container. - FM
+* Added "first pass" EMBED handling. Should be OK with both the W3C
+ container version and the Netscape "attribute soup" version (we'll
+ see 8-). The clickable_image switch and toggle ('*') are now misnomers.
+ They will cause creation of links to the EMBED SRCs whether they are
+ images or not. - FM
+* Enhancements of Unix uploading (see header of LYUpload.c). - GL
+12-14-95
+* Modified LYUnEscapeEntities() and LYExpandString() in HTML.c to make
+ it more likely that they'll be handled correctly across flavors of
+ compilers. - FM
+* Changed NETSCAPE_QUOTES and -netscape_quotes to SOFT_DQUOTES and
+ -soft_dquotes. - FM
+* Added '&' to the exclusion list for VMS suggested file names. - FM
+12-13-95
+* Added CAN_ANONYMOUS_GOTO_TELNET_PORT symbol which if set TRUE in
+ userdefs.h will allow anonymous users to specify a port in 'g'oto
+ commands for telnet URLs. - FM
+* Added NETSCAPE_QUOTES symbol which if set TRUE in lynx.cfg will cause
+ Lynx to emulate the Netscape bug of treating '>' as a co-terminator
+ of a double-quoted attribute value and the tag which contains it. - FM
+* Forgot to define FORM_LINK_RESUBMIT_MESSAGE in the distribution's
+ userdefs.h for yesterday's mods. - FM
+* Forgot to put the HTFile.c with the LIST_FORMAT mods into the
+ distribution (maybe I should just concentrate on Christmas 8-). - FM
+12-12-95
+* Changed handling of the no-cache META directive so that it applies to
+ the document which contains the META tag, rather than to any form submit
+ buttons within it. The form's CGI script should return a stream which
+ contains the directive to force resubmissions, and any (e.g., ISINDEX)
+ script or (e.g., foo.shtml) document can include the directive to
+ force reloading by Lynx. - FM
+* Added ALWAYS_RESUBMIT_FORMS symbol in userdefs.h and lynx.cfg for setting
+ forced resubmissions of forms, and a -resubmit_forms command line switch
+ for toggling the default. - FM
+12-11-95
+* Moved values of LYStrings.h function key definitions from 0x80 - 0x8D to
+ 0x100 - 0x10D and modified all the structures and functions in LYKeymap.c
+ and LYEditmap.c accordingly. - FM
+* Added the KOI8-R (Russian) character set. - Andrey A. Chernov
+ (ache@astral.msk.su).
+* Replace gets() with fgets() for the Unix setup() in LYCurses.c - AAC
+* Tweaks for building with FreeBSD. - AAC & FM
+* Added handling of META directives for ISO-8859-2 and KOI8-R if the
+ document is text/html and a server header didn't already set the
+ charset. - AAC & FM
+12-10-95
+* Tweaks of memory management. - FM
+* Made the LONG_LIST parameters for Unix local directory listings
+ configurable via userdefs.h and lynx.cfg - DT
+12-09-95
+* Added code for re-computing and retaining the current link if it is still
+ on the page when using the LYK_UP_TWO and LYK_DOWN_TWO commands. - FM
+* Added support for nested emphasis tags (they're all still displayed as
+ HT_UNDERLINE, but no longer terminated prematurely). - FM
+12-08-95
+* Added more suffix maps in HTInit.c. - FM
+* Tweak of META attribute definitions. - FM
+12-06-95
+* Don't reject LYNXKEYMAP and lynxcgi URLs with the -localhost switch. - FM
+12-05-95
+* Made the loaded_texts list in GridText.c functionally "circular", so
+ that returning to a cached document causes it to be treated as the most
+ current, and dumps of cache, when necessary to load a new document, are
+ done for the least recently viewed rather than least recently fetched
+ document. - FM
+* Show the METHOD and ACTION in showinfo() of LYShowInfo.c if invoked when
+ the cursor is positioned on a submit button. - FM
+* If the user mode is advanced, keep showing the URL in the statusline
+ when Lynx is in forms mode but the link is not a form field. - FM
+12-03-95
+* Tweaks of code for submissions of forms with only a single INPUT
+ (TYPE="text") field. - FM
+12-02-95
+* Treat any META directives with a NAME or HTTP-EQUIV value of "Pragma"
+ or "Cache-Control" and a CONTROL value of "no-cache" as an instruction
+ always to resubmit any form(s) in the document. - FM
+* Added parsing of META directives. Functions can be added where indicated
+ in HTML.c. - FM
+* Include the HTTP/1.1 "Cache-Control: no-cache" header together with the
+ HTTP/1.0 "Pragma: no-cache" header for reload or resubmit requests. - FM
+* Fixed bug in the check for an all-space ALT in IMG when creating a
+ link for its SRC. - FM
+* Fixed parsing of square-bracketted DOCTYPE fields. - FM
+12-01-95
+* Improvements of logic for indentations within lists. - FM
+11-30-95
+* For resiliency, treat upper case letters as equivalent to lower case in
+ scheme names (e.g., allow "HTTP" as well as "http"), by converting them
+ to the appropriate case before entering them into the anchor hash table
+ or otherwise acting on them. - FM
+* Added ability to change the default reply to the "really quit" prompt
+ from "[Y]" to "[N]" via a compilation symbol in userdefs.h. - DT
+11-29-95
+* Added ALIGN attribute for HR (default is "center"). - FM
+11-28-95
+* If a form has a single field, and it's INPUT TYPE="text", treat
+ RETURN as a submit command for it. - FM
+* Added START as a synonym for the SEQNUM attribute in OL. - FM
+11-27-95
+* Enhancements of the wais gateway. - FM
+11-26-95
+* Fixed up HREF, ACTION and SRC resolving to be conformant with RFC 1808
+ (except that we don't yet support a ";params" field). - FM
+11-25-95
+* Tweaks of yesterday's jumps file mods. - FM
+11-24-95
+* Enhancements of 'J'umps file handling, including ability to install
+ multiple jumps files mapped to different keys and associated with
+ different statusline prompts and recall buffers. - DT & FM
+* Deal with ALTs that have only spaces when in clickable_image mode. - FM
+* Worked in WM's mods to make the REVERSE_CLEAR_SCREEN_PROBLEM workaround
+ a configuration option via ENABLE_SCROLLBACK in lynx.cfg and a command
+ line toggle (-enable_scrollback), for use with comm programs which have
+ screen display buffers that can be accessed for review independently
+ of the Lynx commands (see comments in lynx.cfg). - FM
+11-23-95
+* Use the BASE, if present, instead of the original document URL, as the
+ default ACTION for forms. - FM
+* Tweaks of paragraph alignment handling. - FM
+* Make sure we don't realloc() a NULL env pointer in LYCgi.c. - DT
+* Cancel bookmark deletion if the line does not have a complete link or if
+ there is more than one link on the line. - DT
+11-21-95
+* Fixed bad logic in the setting of bold and/or underline starting points
+ in new lines created via split_line() of GridText.c. - FM
+* Added case KEY_BACKSPACE in LYgetch() of LYStrings.c. - GL
+11-19-95
+* Fixed problem of SELECT causing all immediately following white space
+ to be ignored. - FM
+* More tweaks of paragraphing, and handling of labeled blocks within
+ PRE blocks. - FM
+11-18-95
+* Added INFOSECS, MESSAGESECS and ALERTSECS symbols in userdefs.h and
+ lynx.cfg for setting the durations of statusline pauses (important when
+ using Lynx with a braille-based access). See comments in userdefs.h and
+ lynx.cfg for more information. - FM
+* More tweaks of paragraph handling. - FM
+* Include the Reference lists is crawl output files if the -number_links
+ switch was included and the -nolist switch wasn't. - FM
+11-17-95
+* Tweaks of finger and telnet gateways. - FM
+* Added handling of MARQUEE equivalently to BANNER. - FM
+* Various tweaks of 8-bit character and related HTML handling (OLs
+ or ULs without attributes or some wrong combinations were crashing
+ Lynx). - FM
+11-16-95
+* Implemented the ID attribute for TAB, and the TO and INDENT attributes
+ when its ALIGN attribute is "left" (the default) and the style's
+ alignment is HT_LEFT (the default). If these conditions don't apply,
+ or if the TAB target is outside the current margins or would overlap
+ prior text, a collapsible space is inserted instead of TABing. The
+ INDENT values are in "en" units, treated as 12 per column. Added
+ tabtest.html in the test subdirectory to illustrate TABing. - FM
+11-15-95
+* Added the HTML 3.0 DTD structures and definitions for SPOT, and fully
+ implemented it (use SPOT ID="foo" as SGML_EMPTY instead of named anchors
+ with no content). - FM
+* Added the HTML 3.0 DTD structures and definitions for TAB. For now, it
+ simply puts a collapsible space in the text stream if the TO attribute
+ is present. - FM
+* Added the top-level HTML 3.0 DTD structures and definitions for MATH, and
+ implemented it's ID attribute. The markup is captured as HTML_LITTERAL,
+ and until we have a processor, is output as is, in brackets to alert the
+ user about the situation. - FM
+11-14-95
+* Tweaks of LYK_UP_LINK and LYK_DOWN_LINK handling, and added them to the
+ default mapping as '<' and '>'. - FM
+* Tweaks of LYK_TOOLBAR handling. - FM
+11-13-95
+* Added LYK_TOOLBAR (mapped by default to '#') for jumping up to the pseudo
+ Toolbar or Banner if present in the current document. Using '#' instead
+ of Home to jump there allows you to Left-Arrow back to where you were in
+ the current document. Set up a BANNER in about_lynx-dev.html to serve
+ as an example of this feature. - FM
+* Added the HTML 3.0 DTD structures and definitions for BANNER, implemented
+ its ID attribute, and set it up to act as a pseudo Toolbar if one hasn't
+ been set up already via REL attributes of LINKs. - FM
+* Tweaks of paragraphing for CAPTION, CREDIT, FOOTNOTE, and NOTE. - FM
+11-12-95
+* Handle (i.e., ignore) any P that immediately follows an LI, DT or DD. - FM
+* Cancel any file fetch and viewer spawn or launch during traverals. - FM
+11-11-95
+* Added finger gateway (finger://host[/request]) based on patches from
+ Martin Hamilton (martin@mrrl.lut.ac.uk). - FM
+* Added LYE_TAB for mapping keys to act as LYE_ENTER, but return '\t' so
+ that the behavior of TAB is emulated in TEXTAREAs, and mapped Do to
+ LYE_TAB in the default binding. - FM
+* Fixed glitch in handling of DEC extended characters which contain two
+ digits (affected Do and Find). - FM
+* Better documented that disabling access to hidden (dot) files also
+ disables ability to create such files via Lynx. - FM
+11-10-95
+* Added handling of mailto as a form ACTION. See http://www.q-d.com/swc.htm
+ for software to extract and unescape the mailed content. - FM
+* Added lynxprog URL handling, which is identical to lynxexec URL handling
+ except that the user is not prompted to enter RETURN before returning
+ to Lynx. Use lynxprog for scripts or programs such as mail which do not
+ need an enforced pause to let the user read the screen output. - FM
+* Removed code in HTFile.c for treating ',' as a synonym of '.' for
+ hidden files (nobody seems to know why that was being done 8-). - FM
+* Moved inclusions from LYBookmark to tcp.h. - FM
+11-08-95
+* Extend optional hidden (dot) file/directory support to Unix, and embellished
+ it on VMS and Unix with regulation via a command line switch and 'o'ptions
+ menu setting. See userdefs.h and lynx.cfg for more information. - GL & FM
+* Added support on Unix for straight tar files and a compile time option that
+ disables the ability to extract files from an archive file (since there is
+ no control over the files extracted). - GL
+11-07-95
+* More tweaks of 8-bit character handling. - FM
+* Added "Macintosh (8 bit)" character set. - Neil K. Guy
+ (nkg@freenet.vancouver.bc.ca)
+* Added "Example Lynx Optimized User Home Page" to the online 'h'elp. - FM
+11-05-95
+* Fixed Cc: header handling for email on Unix. - FM
+11-04-95
+* Reference the current character set for any raw 8-bit characters in
+ text/plain streams (but don't translate named or decimal escaped
+ entities, since that's specific for text/html). - FM
+* Block any illegal control or escape characters in text/plain streams,
+ to avoid problems if a binary ftp or local file was mistyped and sent
+ to the screen as that Content-type. - FM
+* Eliminated mod in SGML.c which emulated Netscape's bug of treating '>'
+ as both a close-double-quote and close-tag (Netscape v2.0 fixed its
+ bug, so hopefully the bad HTML with it will go away. 8-). - FM
+11-02-95
+* Assume an ISO-8859-1 character set for all local files. If it's
+ actually ISO-8859-2 and the terminal is using that, set the Lynx
+ CharSet option to "ISO Latin 1" so that 8-bit characters will be
+ sent raw to the terminal. - FM
+* Added Martin Ramsch's iso8859-1.html to the test subdirectory.
+ Use it to complete the conversion tables in LYCharSets.c. - FM
+* Don't block insertion of a lead space for INPUTs in PRE blocks, so
+ alignments will be compatible with those of graphic clients. - FM
+* Don't block all access to the 'p'rint menu for the print restriction
+ (should still offer printer options which have the TRUE flag set;
+ all access is still blocked for -validate). - FM
+* Replaced the STDfoo_FILENO symbols in LYCgi.c with the more portable
+ fileno(stdfoo). - WM
+* Added NCURSESINCDIR compilation symbol for setting the path to the
+ NCURSES header file in LYCurses.h to that of the latest version. - GL
+* Tweaks of interrupt handling on VMS.
+10-31-95
+* Added more suffix maps in HTInit.c. - FM
+* Mods in LYCgi.c which hopefully makes the code more portable across
+ Unix flavors. - FM
+10-28-95
+* Tweaks of global flag initializations and resets in HTML.c. - FM
+* Added RESOLVLIB symbol in the top Makefile for including -lresolv
+ in the LIBS= list, if needed, for SUN 3 or 4 OS, and comments about
+ that in the Makefile, and INSTALLATION and PROBLEMS files based on an
+ explanation from Will Mengarini (seldon@eskimo.com). - FM
+10-27-95
+* Mods of top level Makefile: Added NOPORT compilation symbol for forcing
+ use of PASV in ftp URLs. Added NO_S_IFSOCK compilation symbol for Unix
+ flavors which lack an S_IFSOCK definition for lstat(). - FM
+* Reload the current document whenever the character set is changed. - FM
+* Don't reference entities for raw (or decimal escaped) 8-bit characters
+ if the document is not text/html, or for any local files if the charset
+ is Latin. - FM
+* Made Ctrl-H a synonym for DELETE instead of Left-Arrow in the line
+ editor. - FM
+10-25-95
+* Handle all characters in strings for the new line editor as unsigned
+ so they don't go negative if 8-bit. - DW
+* Restored proper handling of the MAXLENGTH attribute in INPUTs for
+ strings entered with the new line editor. - FM
+10-24-95
+* Deal with all non-printing characters when setting up the SELECT
+ pop-up window strings. - FM
+* Handle raw 8-bit characters via reference to the ISO-LATIN1 named
+ entities so they in turn can be referenced to the currently selected
+ character set. - FM
+* Yet more tweaks of non-breaking space handling. - FM
+10-22-95
+* Improved treatment of the startpage URL with -traversal so that it only
+ blocks traversals of links on other servers. Any links on the same
+ http server which shouldn't be traversed may be blocked via explicit
+ and/or wildcarded entries in REJECT.DAT. Updated CRAWL.announce to
+ make this more clear. - FM
+* Typo fixes in top-level Makefile. - Steve Jeske (jeske@pa.dec.com)
+10-21-95
+* Handle decimal escaped entities via reference to the ISO-LATIN1 named
+ entities so they in turn can be referenced to the currently selected
+ character set. - FM
+10-20-95
+* Tweaks of formatting for LONG_LIST directory lists and README file
+ inclusions in HTFile.c and HTVMSUtils.c. - FM
+* Tweaks of decimal escaped non-breaking space handling in HTML.c. - FM
+* Force unescaping of hidden VALUEs for INPUTs as ISO-LATIN1. - FM
+* Added ".shtml" and ".htmlx" as text/html extensions in HTInit.c. - FM
+10-18-95
+* Made parsing of the name and address out of the NNTP From: header more
+ reliable in HTNews.c. - FM
+* Added "LYNX_TEMP_SPACE" environment variable (Unix) or VMS logical,
+ which if present at run time will be used instead of the the TEMP_SPACE
+ definition in userdefs.h as the path prefix for temporary files. - FM
+10-17-95
+* Added TYPE attritute for OL, and coordinated it with the SEQNUM and
+ CONTINUE attributes. The default TYPE is "1" (Arabic numbers), and
+ SEQNUM values for it can range from -29997 to the system's maximum
+ integer. The Alphabetic TYPEs are "A" (upper case) and "a" (lower
+ case), and can range from 1 (" A." or " a.") to 18278 ("ZZZ." or
+ "zzz."). The Roman TYPES are "I" (upper case) and "i" (lower case),
+ and can range from 1 (" I." or " i.") to 3000 ("MMM." or "mmm.").
+ SEQNUM values should always be Arabic, and will be converted to
+ other types (e.g., SEQNUM="27" TYPE="a" will yield "aa." for the
+ next LI). The CONTINUE attribute will cause the sequence and TYPE
+ of the preceding OL to be continued for LIs in the current OL. - FM
+10-16-95
+* Treat a value of "*" for "no_proxy" as a global override of any
+ existing proxy variables. - FM
+10-15-95
+* Deal with raw or decimal escaped non-breaking space characters in
+ SGML_character() of SGML.c and LYUnEscapeEntities() of HTML.c. - FM
+10-14-95
+* Updated info about lynx-dev in lynx.man and lynx.hlp. - FM
+* Don't force LINKS_ARE_NUMBERED in dumps if -nolist was included. - FM
+* Output the References list for dumps with OL-style numbering. - FM
+* More tweaks of "anti-spoof" handling for telnet URLs. - FM
+10-13-95
+* Block direct access to the telnet prompt for telnet URLs entered without
+ a host field. - FM
+* Include the TRUSTED flag in spawns for OpenVMS/AXP v6.1 or greater. - FM
+10-12-95
+* Convert any strings in news articles that look like URLs into links. - FM
+* Use the Followup header in news articles, if present, for followups.
+ Otherwise, use the Newsgroups header. - FM
+* Ignore any invalid ISO 646 7-bit control characters or ISO 8859 8-bit
+ control characters in SGML_character() of SGML.c. - FM
+10-11-95
+* Typo fix in HTTCP.c for non-MULTINET VMS builds. - Gary Chow (garyc@mrs.com)
+10-09-95
+* Assume the root as path in HTParse() of HTParse.c if the access and host
+ but no path are given, and the access is http, https, or ftp. - FM
+10-05-95
+* Make sure the FREE(x) macro gets defined for HTTCP.c. - FM
+10-04-95
+* Mods in HTTCP.c to prevent string buffer overruns. - FM
+* Prevent possible string buffer underrun for terminal white space trims
+ in GridText.c. - Renato Buda (renato@peoplebank.co.uk)
+10-01-95
+* Updated the listserv and archive addresses in the about and help files. - FM
+09-30-95
+* Added support for Windows_NT FTP servers. - FM
+* Added ability to send a self copy of mail via a Cc: header on Unix
+ (sending of self copies is set via the mail software itself on VMS). - FM
+* Tweaks of SOCKET_ERRNO handling in HTTCP.C. - FM
+* Include unistd.h more consistently on Unix (via tcp.h) if NO_UNISTD_H
+ is not defined. - FM
+* Modified the FreeBSD and NetBSD libwww Makefiles to use the
+ CommonMakefile. - FM
+* Makefile addition (snake3) for the HP-UX purchased compiler. - Andy
+ Finkenstadt (genie@panix.com)
+09-29-95
+* Deal with HTAlert.c function calls to LYgetstr(), e.g., for a password,
+ when doing a -dump or -source non-interactive fetch. - FM
+* Output HTAlert() messages to both stderr and stdout in TRACE mode. - FM
+09-28-95
+* Added a description of the line editor's default key bindings to the
+ help file set. - FM
+* Tweaks of the line editor. - FM
+* Declare DCLspawn_exception() in LYCurses.c as unsigned int only for
+ DECC (otherwise as int, for VAXC and GNUC). - FM
+09-27-95
+* Added common line editor for forms and prompted queries, with configurable
+ line editor key bindings. See LYStrings.h and LYEditmap.c for the default
+ configuration. - DW & FM
+* Tweaks of build.com's symbol assignments when in batch mode. - MM
+09-22-95
+* Added ISO-8859-2 CharSet, and mods for Accept-Charsets handling based
+ on patches from Mark Martinec (Mark.Martinec@nsc.ijs.si). - FM
+09-19-95
+* Tweaks of OL attribute handling. Allow negative SEQNUM values. Keep
+ better track of CONTINUE versus non-CONTINUE OL sequences within nests.
+ Allow CONTINUE in the first OL of a new nest, set to the last LI count
+ of the previous nest (at any depth in that previous nest). - FM
+09-17-95
+* Tweak of LYUnEscapeEntities() in HTML.c. - DW & FM
+* Another tweak of groupid handling in LYShowInfo.c. - DW
+* More fixes of 7-bit character approximations. - DW
+* More help and about file tweaks. - DSL
+09-16-95
+* Added the HTML 3.0 DTD structures and definitions for DIV, and implemented
+ its ALIGN and ID attributes. I think I have it behaving rationally if it
+ is used together with CENTER, LEFT and/or RIGHT (Though they're all treated
+ as DIVs by Lynx, and shouldn't be embedded in each other, somebody will do
+ that anyway!. 8-). - FM
+* Added the HTML 3.0 DTD structures and definitions for FN (Footnote). It
+ should be handled as a popup window, but for now, it's implemented as a
+ labelled block and has the same style and behavior as a NOTE with an ID
+ attribute. - FM
+* Some compilers can't handle the continuation line in yesterday's
+ LYCurses.h. Made it one long line. - FM
+09-16-95
+* Further enhanced the online help and about files. - FM
+* Added -DNO_FILIO_H to Makefile for SCO. - FM
+* Worked in stuff from 14-Sep-95 lynx2-4-2 upgrade. - FM:
+--------------------------------------------------------
+ 09-06-95
+ * Added patch to compile Lynx on BSDI with Ncurses package. -RK
+ 09-06-95
+ * Ported Lynx to DG-UX. - RK
+--------------------------------------------------------
+09-12-95
+* Further modified HTNews.c so that it returns unmodified news messages
+ when the display is toggled to source ('\') or when downloading them,
+ so uuencoded messages always can be saved without corruption, and so
+ I also changed the SCAN_FOR_BURIED_NEWS_REFS compilation default to
+ TRUE. - FM
+* Simplified a compound if() in HTParse.c which may have been giving the
+ AIX v4.1 compiler a headache. - FM
+09-11-95
+* Eliminated distinct style sheets for CAPTION and CREDIT so their content
+ will inherit the current style, and added HTML_EnsureDoubleSpace() and
+ HTML_ResetParagraphAlignment() in HTML.c for coping with the absence of
+ distinct style sheets for those elements, and for FIG.
+09-10-95
+* Added SCAN_FOR_BURIED_NEWS_REFS configuration symbol in lynx.cfg, with
+ a compilation default of FALSE, and a -buried_news switch for toggling
+ the default. When TRUE, Lynx scans the bodies of news articles for
+ references and converts them to news links, but creates false news
+ links if any email addresses are enclosed in angle brackets, and can
+ trash uuencoded messages. - FM
+* Eliminated distinct style sheet for FIG so its content will inherit the
+ current style and display appropriately within lists. Should be OK if
+ people use valid HTML 3.0 in it's content for non-graphic clients. - FM
+* Added links for the W3C HTML 2.0 and 3.0 specifications and for the
+ HAL HTML validation service to the Lynx help file set.
+* Made the BOLD_NAME_ANCHORS compilation symbols FALSE by default. Most
+ documents now include emphasis tags for NAME (ID) anchors if it's desired,
+ because the most common graphic clients don't emphasize them by default,
+ so we should adjust to that in Lynx as well (IMHO 8-). Added emphasis
+ tags for the NAME anchors in the Lynx help files. - FM
+* Eliminated forced uppercasing of H1 headers. Most documents have mixed
+ casing and we should preserve it (IMHO 8-). Added a BOLD_H1 configuration
+ symbol, set FALSE by default, for making H1 headers bold even if BOLD_HEADERS
+ is FALSE. Modify the two configuration symbols in lynx.cfg for the pattern
+ or header emphasis which pleases you. - FM
+* Tweak of list paragraphing. Added HText_PeviousLineSize() in GridText.c
+ for determining if the previous line had only non-printing characters. - FM
+09-09-95
+* Implemented true paragraphing and the P ALIGN attribute within lists (UL,
+ OL and DL blocks) and within ADDRESS blocks. Paragraphs within lists have
+ one blank line inserted. Within ADDRESS blocks, a newline will be created
+ if needed, but no blank lines are inserted. Use BR, not P, to force extra
+ newlines within blocks. Do not place a P immediately following the LI or
+ DD tags. Alignments of P blocks are done with respect to the "second line"
+ margins of LI or DD elements. - FM
+09-08-95
+* Convert '~' to getenv("HOME") in file URLs whether or not DIRED_SUPPORT
+ is defined. - FM
+* Tweak of TR and more tweaks of HR handling. Added HText_LastLineSize()
+ and HText_TrueLineSize() functions in GridText.c for determining if
+ lines have only non-printing characters in decisions on whether to
+ insert additional newlines. - FM
+09-07-95
+* Act on Page-Up, Page-Down, Home, End, Find and Select in the form_getstr()
+ editor (hoping they have their default mappings 8-). Also act on Remove
+ and Control-D as delete keys in that line editor (as in the LYgetstr()
+ line editor). - FM
+* Tweak of HR handling. - FM
+* Mods to prevent creating multiple copies of temporary printer files. - FM
+* More fixes for NeXT. Temporary files for VIEWER, DOWNLOADER or PRINTER
+ commands on NeXT all have the ".html" default suffix replaced with ones
+ indicative of the Content-type. - FM
+09-06-95
+* Mods to prevent creating multiple copies of temporary viewer or downloader
+ files. - FM
+* Fixes for NeXT. - FM
+09-05-95
+* Enabled the -help switch when no configuration file is available and
+ Lynx would otherwise exit (i.e., it now outputs the help message before
+ it exits). - FM
+* Documented the -child switch. - FM
+* Fixed and documented the -nolog switch. - FM
+* Changed the -linknums switch to -number_links, fixed the code to work,
+ and documented the switch. - FM
+* Made handling of escaped colons (\:) in VIEWER commands reliable. - FM
+09-04-95
+* Implemented the PLAIN attribute for UL, and the SEQNUM and CONTINUE
+ attributes for OL. - FM
+* Updated the DTD structures and definitions for DD, DL, DT, LI, OL and UL
+ to HTML 3.0, added LH, and implemented full HTML 3.0 ID handling for those,
+ and B, BLINK, BR, CENTER, CITE, CODE, DFN, DIR, EM, FORM, KBD, I, LEFT,
+ LISTING, MENU, PLAINTEXT, PRE, RIGHT, SAMP, STRONG, TT, U, VAR and XMP
+ (some of which are obsoleted in HTML 3.0, but what the heck 8-). - FM
+09-03-95
+* Made bolding of NAME (ID) anchor contents configurable in lynx.cfg. - FM
+09-02-95
+* Tweaks of FIG and OVERLAY handling: Only put up [FIGURE] (and +[OVERLAY])
+ links if clickable_images is set. Assume P ALIGN="left" if contained
+ text does not begin with an explicit tag that sets an alignment. - FM
+* Implemented full HTML 3.0 ID handling for IMG. - FM
+* Tweaks for FreeBSD. - Masafumi NAKANE (t94303mn@sfc.keio.ac.jp)
+08-31-95
+* Added support for using a TITLE attribute as the subject in anchors with a
+ mailto HREF (A HREF="mailto:address" TITLE="RE: subject"). - FM
+08-30-95
+* Implemented full HTML 3.0 ID handling for A, ADDRESS, BLOCKQUOTE, BQ,
+ CAPTION, CREDIT, FIG, H1 - H6, HR, INPUT, NOTE, OPTION, P, SELECT, TABLE,
+ TD, TEXTAREA, TH and TR. - FM
+* Updated the DTD structures and definitions for ADDRESS to HTML 3.0. - FM
+* Block insertion of any escape sequence characters or substitutes when
+ editing form INPUTs or TEXTAREAs. - FM
+08-29-95
+* Tweak of ALIGN attribute handling in paragraphs. - FM
+* Protect against hanging on escape sequences if received (illegally) in
+ documents typed as text/plain or text/html. - FM
+08-28-95
+* Declared DCLspawn_exception() as an unsigned int to keep DECC happy. - FM
+08-27-95
+* Give LYUpload() a return value (because LYLocal.c has been testing for
+ one all these years 8-). - FM
+* Force reload on return from 'o'ptions menu if HTfileSortMethod or
+ keypad_mode are changed. - FM
+* Force no cache of keymap display whenever vi_keys or emacs_keys are
+ changed. - FM
+* Added Remove and Control-D as Delete synonyms for removing characters to
+ the left of the cursor in the LYgetstr() line editor, and Control-F as
+ Right-arrow synonym for moving the cursor to the right. - FM
+08-24-95
+* Modified prompted string editing via LYgetstr() along lines in patch
+ from PM (editing of form INPUT and TEXTAREA strings is unchanged).
+ Here's how the prompted string editing works: Left-arrow and Backspace
+ (Control-H) move the cursor to the left, and Right-arrow to the right,
+ within the string. Characters are INSERTed at the cursor position.
+ Delete removes characters to the left of the cursor. Home, Find and
+ Control-A move the cursor to the beginning of the string. End, Select
+ and Control-E move the cursor to the end. Control-U erases the string.
+ Control-G cancels at any time. Return accepts if a string is present,
+ or cancels if it was fully erased or never entered. A right-curley
+ brace appears in the right-most column when the string has segment(s)
+ scrolled off screen, and if left scrolled, the cursor sits on it for
+ further editing with the above command keys (or acceptance via Return).
+ Long strings scroll both left and right between the prompt string and
+ right-curley brace. Had to modify 17 files to make this line editor
+ crash safe (I hope people like it! 8-). - FM
+08-22-95
+* Use a macro in parse_arg() of LYMain.c to ensure proper handling of
+ switches which take a value and might have a space instead of an '='
+ between the name and value. - DW
+* Insulate any system RTL's getline() from the one in HTInit.c. - DW
+* Enabled editing of titles when adding bookmarks. - FM
+08-21-95
+* Fixed the IBM PC character set in LYCharSets.c (Note: The PC-set has the
+ currency symbol but it is a control character - ^O - so there is a chance
+ that curses or the user's terminal may discard it. Did not fix the
+ Icelandic characters). - DW
+* Check whether getpwuid() and getgrid() have returned NULL pointers in
+ LYShowInfo.c. - DW
+* Break up the too elaborate, compound assignment statements in LYList.c
+ so no compilers get tripped up by evaluation order effects. - DW
+* Worked in mods from DW to cope with CR, CRLF or LF all as EOL in HTML.c
+ and GridText.c (not sure if they take into account all of the consequences
+ of Lou's "big cheat" in GridText.c, but they appear to, so far). - FM
+* Explicitly preserve the Lynx bookmark file mode on Unix. - DSL
+08-20-95
+* More documentation and help updates. - FM
+08-19-95
+* Updated INSTALLATION and comments in userdefs.h and lynx.cfg. - FM
+* If save to disk was done via the download menu, and a VMS rename() attempt
+ succeeded so we don't spawn a COPY, we no longer can access the file via
+ the download menu, so pop in that situation. - FM
+* Worked in stuff from 16-Aug-95 lynx2-4-2 upgrade. Most had already been
+ added to lynx2-4-FM. This is the new stuff. - FM:
+---------------------------------------------------
+ 08-16-95
+ * Applied patch from Peter van Heusden (pch@ucthpx.uct.ac.za) to fix
+ a bug when lynx encounters an OPTION tag before the style is
+ ever updated. - CL
+ 08-09-95
+ * Added some tweaks to Makefile and LYCurses.h to get lynx to properly
+ compile on ISC. Thanks to Robert Salter (salter1@master.nsbf.nasa.gov).
+---------------------------------------------------
+08-18-95
+* Added a -validate switch for turning off everything except http URLs,
+ helpfiles, and secure menus in Lynx. Can be used with -dump in CGI
+ scripts, but is intended for use with anonymous telnet logins. In the
+ latter case, the user can start with his/her server's or userdir homepage,
+ and validate everything, while able to manipulate the display features
+ (e.g., whether or not links are numbered) and turn on trace (Control-T,
+ then Control-R to reload) when a "Bad HTML" document is encountered. The
+ telnet approach is particularly useful when used with the 'l'ist feature.
+ When used with -dump, compare it with versus without -nolist. - FM
+* Added a missing curley brace in EF's (08-16-95) patches. - FM
+08-17-95
+* Added HISTORICAL_COMMENTS symbol which if set TRUE in lynx.cfg will cause
+ Lynx to revert to the "historical" behavior of treating any '>' as a
+ comment terminator instead of (a valid) '-->', and a -historical switch
+ for toggling the default behavior. - FM
+* Added a -nolist switch for turning off the link list feature in dumps. - FM
+* Modified SGML.c so that it still substitutes the expected end tag if a
+ different one is encountered (e.g, due to a document having interdigitated
+ instead of validly embedded tags), but doesn't do a wind down of the
+ element stack. This gives it a better chance of recovering from bad
+ HTML, and the sanity checks I've added thus far in HTML.c appear to still
+ be adequate for avoiding crashes (we'll see 8-). - FM
+08-16-95
+* Mods to support within-document anchors in documents returned via
+ lynxcgi scripts. - FM
+* Worked in EF's patches to handle changes of keymaps under DIRED_SUPPORT
+ with OK_OVERRIDE, and to give the user some feedback during an Install
+ command. - FM
+08-15-95
+* Don't include a Referer header for 'g'oto URLs. - FM
+* Added patches from PR for compilations with VMS port of GNUC: Modified
+ several prototypes to avoid GNUC warnings about conflicts with ones in
+ lib$routines.h, and added code in HTVMS_WaisUI.c to deal with an obscure
+ glitch for GNUC v2.6.[123] and v2.7.0 (not present in v2.6.0 or earlier,
+ and fixed in v2.7.1). - FM
+* Worked in code from PR as LYVMS_FixedLengthRecords() in HTFWriter.c to
+ change attributes of binary files on VMS from Stream_LF to FIXED 512,
+ no implied carriage control, best try contiguous. Replaces the spawn
+ to execute FIXED512.COM. - FM
+08-14-95
+* Modified TEXTAREA handling to succeed or fail on bad HTML equivalently
+ to Netscape. - FM
+08-12-95
+* Mods to avoid crashes and to do something reasonable with OPTION strings
+ that are wider than the available popup window width. Truncation is
+ indicated by omission of a terminating ']' in the window link, and the
+ window, when popped up, is made equal to the screen width (but we can't
+ wrap the strings within the window, so they're truncated if they still
+ don't fit). - FM
+* Mods to handle INPUT fields that are packaged in PRE and would extend past
+ the wrap column. No way to make that perfect without a major redesign,
+ but it's better now. - FM
+08-10-95
+* Handle 'g'oto entries equivalently to STARTFILE and HOMEPAGE, i.e., if
+ the user's entry isn't a URL, convert it to a file URL if it's a file
+ or directory on the local system, otherwise convert it to an http URL.
+ For example, "~/" will be converted to a file URL for listing the HOME
+ directory (on both Unix and VMS), and "www.netscape.com" will become
+ "http://www.netscape.com". - FM
+* Fix LYCurses.h to deal with definitions of TRUE and FALSE in cursesX.h
+ on ultrix. - Brian Exelbierd (bex@ncsu.edu)
+* Made SYSTEM_MAIL, and MAIL_ADRS on VMS, configurable in lynx.cfg. - FM
+08-08-95
+* Fixed two initialization problems that could account for reports of
+ inappropriate HEAD requests in pops of cached documents. - FM
+* More tweaks for coping with bad HTML. - FM
+* Fixed bug in code for bypassing bad SUFFIX: or VIEWER: entries. - FM
+08-06-95
+* Added code in GridText.c to deal with syntactically OK but symantically
+ nonsensical uses of ALT="" in IMG tags (i.e., when the IMG is structured
+ to provide the anchor for a link, and so the anchor ends up with nothing
+ but nonprinting characters for bolding), and removed the forcing of an
+ "[ISMAP]" pseudo-ALT in HTML.c. The show_anchor element in TextAnchor
+ structures is now set to NO whenever an anchor does not have any
+ printing characters. - FM
+* Modified HTML.c to issue only one "Bad HTML" statusline message per
+ document (unless it's one of those unbelievably bad CGI script outputs
+ that are functionally multiple, concatenated documents 8-), and similarly
+ for "Table in Form" and "Form in Table" informational messages. - FM
+* Don't bother prompting whether to send a HEAD request for the current
+ document if there are no links on the page (but still prompt if the user
+ makes a HEAD request when positioned on an inappropriate form link). - FM
+08-05-95
+* Added code in SGML.c for storing Identifiers (e.g., !DOCTYPE) and Comments
+ (i.e., tags beginning with !--) and for reporting them in trace mode.
+ Serves as a model for actually using them someday (i.e, functions for
+ analyzing them could be called where we presently just invoke a trace
+ output to stderr). - FM
+08-03-95
+* Modified SGML.c to handle comments as in the current specs, and put
+ Paul Gilmartin's (pg@sweng.stortek.com) TestComment.html in the
+ test subdirectory. - FM
+* Added binary extensions in HTInit.c that were giving people problems
+ on FTP servers. - FM
+08-02-95
+* Added explicit check for CMU in telnet support with SOCKETSHR-built
+ images. - SB
+* Added -link switch for setting the count in lnk#.dat files with -crawl
+ (needed if you interrupt a traversal and want to pick up again where
+ you left off). - DM
+* More tweaks of -traversal code and Makefile. All known bugs appear to
+ have been dealt with at this point. Updated lynx.man, lynx.hlp and
+ help files to include the -traversal and -crawl switches. - FM
+08-01-95
+* Changed the SEQUENT compilation sympbol to PTX2 and added a ptx2 procedure
+ to the Makefile for Sequent Symmetry DYNIX/ptx v2, because more current
+ versions reportedly have solved the problems which the conditional
+ compilation attempted to address. - FM
+* Force in the "[ISMAP]" pseudo-ALT if someone uses ALT="" for an IMG tag
+ that has ISMAP specified. - FM
+* Tweaks of the -traversal code (still experimental). - DM & FM
+07-31-95
+* Worked in code from David Mathog (mathog@seqaxp.bio.caltech.edu) for
+ implementing the TRAVERSAL function from old versions of Lynx, but via
+ a command line switch (-traversal) instead of in a separately compiled
+ executable, and for a CRAWL function, invoked via a command line switch
+ (-crawl), which allows Lynx to be used as the front end for a Web Crawler.
+ See CRAWL.announce for more information. - FM
+* More tweaks of LYCurses.c and LYCgi.c for GNUC on VMS. - SB
+* More tweaks of src/Makefile. - DSL
+07-30-95
+* Tweaks of yesterday's Makefile and descrip.mms files. - FM
+07-29-95
+* Tweak in HTFTP.c to ensure that Lynx doesn't sit around waiting for an
+ FTP server's good-bye message if the server closes the connection itself
+ and doesn't send one. - FM
+* Added GNUC support to the VMS descrip.mms files. - FM
+* Tweaks of HTWAIS.c socket handling on VMS (I can't reproduce a reported
+ problem with SOCKETSHR/NetLIB, but these tweaks might help). - FM
+* Added my guesses at code for HTTelnet.c to implement telnet, tn3270 and
+ rlogin support, if available, when building with SOCKETSHR/NetLIB on
+ VMS. - FM
+07-28-95
+* Mods for Sequent Symmetry DYNIX/ptx - Mark Kolmar (mkolmar@ccs.nslsilus.org)
+* Added GL's lynxcgi patches posted to lynx-dev, plus some tweaks. - FM
+* Worked in GL's lynxcgi mods as in Lynx2-4-2:
+ --------------------------------------------
+ Added George Lindholm's LYNXCGI feature. This allows lynx to bypass
+ http daemons to run local CGI scripts using a URL of the form
+ "lynxcgi:/path/cgi-script". To implement in Lynx, LYNXCGI_LINKS
+ must be uncommented in userdefs.h and TRUSTED_LYNXCGI must be fixed
+ in lynx.cfg. It doesn't handle redirection or mime-types and
+ scripts should probably generate partial URLs when referring back to
+ itself. If the file you're going after isn't an executable then it
+ will be loaded as regular file. This makes it possible to go back
+ and forth between cgi-scripts and .html files.
+ I changed the way TRUSTED_LYNXCGIs are recorded because they don't
+ work quite the same as TRUSTED_EXECs do. Also, George says it works
+ fine on SunOS and Solaris, and it seems to work fine on Linux. - CL
+ --------------------------------------------
+* Don't block access to the download menu when both no_download and
+ no_disk_save are set if any of the download commands have always_enabled
+ set (ie. present a reduced menu, with those still available). - FM
+* More tweaks of help and html files. - DSL
+07-26-95
+* Added support for GNUC in the VMS .com files. Should now compile and link
+ automatically for GNUC via build.com, but that needs testing. - FM
+* Reorganized VMS option files into ones for the transport and ones for the
+ compiler, with corresponding updates of the .com and .mms files. - FM
+* Tweaks of mods for GNUC on VMS, based on further discussions with
+ SB. - FM
+* Tweaks of -help output. - Daniel S. Lewart (d-lewart@uiuc.edu)
+07-25-95
+* Ugh!! Blew it for Unix when setting up the GLOBALDEF/GLOBALREF definitions
+ in tcp.h for VAXC vs. DECC vs. GNUC on VMS this morning (I'm a night
+ person 8-). - FM
+* Worked in code for compiling with the VMS port of GNUC, based on patches
+ from Sterling Bjorndahl (bjorndahl@augustana.ab.ca) and advice from
+ Pat Rankin (rankin@eql.caltech.edu). Needs testing, and the linking
+ procedure still needs to be addressed explicitly. - FM
+* Prevent possibility of a null pointer dereference if an ISMAP anchor
+ fetch fails. - David Trueman (david@cs.dal.ca)
+07-21-95
+* Added LYK_HEAD (mapped by default to ']') to send HEAD requests for the
+ current document or link (always sent with LYforce_no_cache). - FM
+* More lynx.man, lynx.hlp, help file and documentation updates. - FM
+07-19-95
+* Put back "-mime_headers" with mods like those in lynx2-4-2, i.e., so that
+ a source dump is forced. Both "-mine_headers" and "-head" show the status
+ line as well as the MIME headers. - FM
+* Modified "-error_file" to show the complete status line, as well as the
+ URL and METHOD, and to concatenate entries instead of creating separate
+ files for each request. - FM
+* Updated the lynx.man, lynx.hlp and lynx_help files. - FM
+07-18-95
+* Changed "-mime_headers" to "-head" and implemented it as a HEAD request
+ for fetching the MIME headers as text/plain. - FM
+07-17-95
+* Removed 00DIFFERENT from this distribution. - FM
+* Made use of _underline_ format in dumps optional via SUBSTITUTE_UNDERSCORES
+ definitions in userdefs.h and/or lynx.cfg, and added a "-underscore"
+ command line switch for toggling the default on or off. - FM
+* Use system("exec $SHELL") for spawning the default shell on Unix. - Paul
+ Gilmartin (pg@sweng.stortek.com)
+* Fixed typo in check for news vs. nntp URLs in HTNews.c. - Wilson Cheung
+ (wcheung@netcom.com)
+* Added code to the VMS setup() for dealing with curses conflicts if someone
+ used -post_data or -get_data without specifying -dump under conditions
+ which require it, so it's not forced in LYMain.c as on Unix. If fact,
+ -get_data and -post_data are very useful in interactive invocations. - FM
+* Fixed memory leak in the -post_data and -get_data handling. - FM
+* Added LYNX_HOST_NAME in userdefs.h and lynx.cfg for defining an alias
+ which will be treated equivalently to "localhost" and HTHostName (the
+ fully qualified domain name of the system running Lynx) in checks for
+ URLs on the local host (e.g., when the -localhost switch is set). - FM
+* Added in or improved descriptions for the new switches in the Lynx
+ command line help and Lynx_users_guide.html. - FM
+07-16-95
+* Tweaks of yesterday's startfile and -homepage mods, and added treatment
+ of '~' as SYS$LOGIN when used as the lead character on VMS (e.g., on
+ VMS as on Unix, lynx ~/ will create a listing of the login directory
+ for the account running lynx). - FM
+* Worked in stuff from 13-Jul-95 lynx2-4-1 upgrade. Most had already been
+ added to lynx2-4-FM. This is the new stuff. - FM:
+---------------------------------------------------
+ 07-13-95
+* Added some command line patches from Peter Brooks - CL:
+ (pbrooks@micromind.com). The new command lines are:
+ -post_data, -get_data = send form data from stdin and dumps results.
+ -auth=ID:PASSWD = sets authorization stuff at startup.
+ -mime_header = prints mime header with -source.
+ -noredir = prevents automatic redirection
+ -error_file=file = prints HTTP status code to file. (Not sure of
+ his motivation on this one, something to do with SlipKnot,
+ I think.)
+ (Replaced Peter's strdup()'s with more portable code. - FM)
+ 07-11-95
+* Added Erik Olson's (olson@phys.washngton.edu) patch to use the
+ _underline_ format when using the -dump option. - CL
+ (Kept the old code, #ifdef'ed out, to make this optional someday. - FM)
+ 07-07-95
+* Fixed a bug in local_dired. Specifically, a pointer to a fixed array
+ was being fed into StrAllocCopy as the destination. Linux was choking
+ on this although OSF/1 and AIX seemed to handle it better. - CL
+---------------------------------------------------
+07-15-95
+* If a command line "startfile" and/or -homepage is not a URL, and can't
+ be located as a file or directory on the local system, treat it as an
+ http URL, e.g., www.wfeb.edu will be treated as http://www.wfeb.edu - FM
+07-13-95
+* Added nntp URL handling (nntp://news_host[:port]/path). Made it read
+ access only (use news URLs for both read and post access). - FM
+07-12-95
+* Added code for proxying https and snews URLs. The Netsite proxy server
+ can proxy them without need for SSL code in the clients themselves, i.e.,
+ for Lynx as publicly distributed (need client-resident SSL code and
+ tunneling for the CERN proxy server, sorry). - FM
+* Added the CONNECT protocol to our local code, so that SSL URLs can be
+ tunneled through proxy servers, and reorganized some code so that patches
+ for the SSL hooks can be applied easily if NSA regulations are relaxed. - FM
+07-11-95
+* More tweaks of alignment code. - FM
+* Fixed bad code for removing trailing white space in GridText.c, LYrcFile.c,
+ LYReadCFG.c and LYUtils.c. - FM
+* Added snews and nttp protocols, which simply inform the user that they
+ aren't implemented. - FM
+* The claim is that even mere hooks to the RSA and SSL libraries are
+ objectionable to the NSA, so I removed then from the public distribution,
+ but left in the https protocol, which simply informs the user that it
+ isn't implemented. - FM
+07-08-95
+* Worked in Lou Montulli's (montulli@netscape.com) code for https URL
+ handling into the Common Library. To actually use it, you have to
+ get the RSA and SSL libraries, which are restricted to US citizens
+ (it works if you are and do 8-). I can't include those in this
+ distribution, because by US law that would in turn restrict it to
+ US citizens. - FM
+* Tweaks of paragraph alignment code. - FM
+07-07-95
+* If we are not allowed to change the status of the "lynxexec
+ execution of links" from the option screen then we shouldn't be
+ allowed to change it from the .lynxrc file either. - GL
+* Added George Lindholm's patch to add uudecode support to Lynx's file
+ manager. Unfortunately, uudecode puts the uudecoded file in the
+ current working directory, namely the directory where lynx is started.
+ I haven't thought of a workaround yet, so I made lynx print a
+ statusline message informing the user. - CL
+07-06-95
+* Modified redirection-handling code in HTTP.c to ensure that we get all of
+ the headers before trying to track down the Location: header. - FM
+* For move's or rename's in the local DIRED code, don't write the new file
+ name into the same buffer as the old. - Earl Fogel (fogel@duke.usask.ca)
+07-05-95
+* Added GL's mods to use a stream-based procedure for displaying the
+ current Lynx keymap. Faster and more efficient than the temporary
+ file-based procedure. - FM
+07-04-95 (Enjoy the fireworks!!! 8-)
+* More mods of SGML/HTML parsing to help recover from bad HTML. - FM
+* Fixed some cryptic initialization problems in the Common Library's
+ centering and right alignment code, that we're now using, by changing
+ the malloc's in HTChunk.c to calloc's. - FM
+* Secured some unsafe code in the LYstrncpy() function. - FM
+* Increased the connect() and select() while()-looping limit in HTTCP.c
+ to 30,000 tries. - FM
+* Tweak of HR WIDTH attribute handling. - FM
+07-03-95
+* Updated the DTD structures and definitions for HR to HTML 3.0, plus
+ its Netscape WIDTH and SIZE attributes, and implemented WIDTH, e.g.,
+ HR WIDTH="50%" yields a centered horizontal rule half the width
+ between the current left and right margins. - FM
+* Fixed problem of header end tags not yielding line breaks when embedded
+ in CENTER, LEFT or RIGHT tags. - FM
+07-02-95
+* Added MAKE_PSEUDO_ALTS_FOR_INLINES in userdefs.h and lynx.cfg which can
+ be defined FALSE to treat inlines without an ALT string as having ALT=""
+ instead of inserting the pseudo-ALT string "[INLINE]" into the document.
+ The configuration file default can be toggled via a -pseudo_inlines
+ command line switch, and the user can toggle the inclusion of pseudo-ALT
+ strings on or off at run time via LYK_INLINE_TOGGLE (mapped by default
+ to '['). - FM
+* Made the -image_links command line switch a toggle for the configuration
+ file default setting. - FM
+* Enabled processing of forms that use TABLE for formatting. I don't see any
+ risk of crashes, and they might end up usable. Messages warn the user that
+ the display of the form may be strange. - FM
+* Relaxed anti-crash protections for forms with bad HTML (usually due
+ to interdigitated instead of embedded tags, written by providers with
+ Netscape or Mosaic clients, which are insensitive to such fundamentally
+ bad HTML). I got the code to still work with several bad forms on the
+ Net, and if a crash should occur, the user has been tipped off via the
+ statusline or trace message about the nature of the problem. - FM
+07-01-95
+* Restored the meaning of the P element to be the beginning of a paragraph,
+ updated its structures and definitions in the DTD to HTML 3.0, and
+ implemented its ALIGN attribute (left, center, right). Note that it
+ no longer forces double spacing (you'll get the spacing defined in
+ the stylesheet for the current element, which may or may not be
+ double) and empty paragraphs (serial Ps) will not yield additional
+ newlines (use serial BRs for that). - FM
+* If both download options and disk saves are restricted, don't fetch
+ binary files with a download offer when their links are activated
+ (just issue a statusline message that the file can't be displayed),
+ and issue a "disabled" statusline message for any overt 'd'ownload
+ attempts. - FM
+* For disk saves in LYDownload.c, on VMS attempt a rename() first, and then
+ a spawned DCL copy if that fails. - FM
+* Added memory exhaustion checks for all mallocs, reallocs and callocs in
+ the LYfoo modules. - FM
+* Added CL's realloc() substitute for AIX and ultrix in GridText.c. - FM
+* Map extensions .html3 and .ht3 to text/html in HTInit.c. - FM
+06-29-95
+* Added code to enable creation of links for all images. Can be made the
+ default by setting MAKE_LINKS_FOR_ALL_IMAGES to TRUE in userdefs.h and/or
+ lynx.cfg (not advised). Can be implemented for the session via a command
+ line switch, -image_links, e.g., use lynx -dump -image_links to get links
+ for all images, as well as standard links, listed in the output. Can be
+ toggled on and off at run time via LYK_IMAGE_TOGGLE (mapped by default to
+ '*'). Use that in conjunction with the LYK_LIST command to get a list of
+ links that includes all images, e.g., for adding them as bookmarks. The
+ toggle also invokes a reload, so that the change will be implemented for
+ the current and any future documents, but if you return to cached
+ documents, those will need to be reloaded explicitly. See comments in
+ userdefs.h and lynx.cfg for more information. - FM
+* Don't restrict use of Control-T for toggling trace mode to advanced
+ usermode (i.e., make it available in all usermodes, so people might
+ follow the instructions in "BAD HTML" statusline messages to check
+ the document in trace mode). - FM
+* Modified LYList.c to indicate the anchor NAME/ID, if present, following
+ the TITLE, if known, in interactive 'l'ists.
+* Modified SGML.c to treat '>' as both a close-double-quote and close-tag.
+ Now Lynx acts like Netscape, in that respect, so all that bad HTML
+ Netscape users are generating will not bother Lynx. - FM
+06-28-95
+* Oops, missed an initialization in this morning's centering and right
+ alignment mods. - FM
+* Fixed up HTML.c to bypass HTML 3.0 attribute checks for start tags generated
+ by the Common Library's non-http access types (gopher, ftp, news, wais)
+ Could crash, otherwise. - FM
+* Fixed up GridText.c code to take non-printing control characters properly
+ into account when formatting centered or right-aligned text. - FM
+* Mods to improve appropriate carryover or cancelling of alignment attributes
+ across successive elements. - FM
+* Implemented Netscape LEFT and RIGHT extensions, homologously to CENTER. - FM
+* Implemented Netscape BLINK extension as HT_UNDERLINE. - FM
+06-26-95
+* Updated the DTD structures and definitions for H1 - H6 to HTML 3.0 and
+ implemented their ALIGN attribute (left, right and center). - FM
+* Implemented the Netscape CENTER extension. - FM
+06-25-95
+* Updated the DTD structures and definitions for FORM, INPUT, TEXTAREA,
+ SELECT and OPTION to HTML 3.0. - FM
+* Implemented the HTML 3.0 DISABLED attribute for FORM elements. - FM
+* INPUT type "scribble" implemented as "text" according to the HTML 3.0
+ recommendation for non-GUI clients. - FM
+* Added protections against problems with INPUT types "range" and "file"
+ until they're implemented (will be tricky, but do-able 8-). - FM
+06-23-95
+* Added all ISO8859-1 entities to the DTD. - FM
+06-22-95
+* Updated the DTD structures and definitions for A and IMG to HTML 3.0, and
+ implemented their ID attribute. - FM
+* Tweaks of FIG handling. - FM
+* It is somehow inappropriate to teach our users to write correct HTML and
+ to tell them to always check it before publishing, when Lynx's on-line
+ help gives such a bad example :-} (not to mention versions from a couple
+ of months back). Better now. - Mark Martinec (Mark.Martinec@nsc.ijs.si)
+06-20-95
+* Made the DTD structures and definitions for the HTML 3.0 elements
+ BQ, CAPTION, CREDIT, FIG, NOTE and OVERLAY complete, and added
+ those for STYLE, TABLE, TD, TH and TR.
+* Tweaks of yesterday's HTML 3.0 additions (still just "first pass"). - FM
+* Added code for avoiding potential problems with stylesheets and tables
+ in HTML 3.0 documents. - FM
+06-19-95
+* Added "first pass" handling of HTML 3.0 elements BQ, CAPTION, CREDIT,
+ FIG, NOTE and OVERLAY. - FM
+06-17-95
+* Close the configuration file on completion of the big while() in
+ LYReadCFG.c. - PM
+* Added 00DIFFERENT to keep track of files in this code set which
+ presently differ from those in the latest development code set
+ at UKans (currently, lynx2-4-1.zip of 15-Jun-95). - FM
+* Tweak of the pseudo-toolbar code. The 'l'ist command now displays the
+ TITLE (or RelValue, if TITLE is defaulted) of those links if they have
+ never been accessed, or their actual HTML titles if accessed, at the
+ top of the links list, so you can use that command instead of LYK_HOME
+ to reach the toolbar links at any time, and then left-arrow to where
+ you were in the current document instead of having to page back down
+ to that location. - FM
+06-16-95
+* Added LINK REL="RelValue" HREF="foo" TITLE="TitleValue" HTML 3.0
+ handling (as in http://www.hpl.hp.co.uk/people/dsr/html3/dochead.html
+ of 28-Mar-95). The HREF and REL values are required (the LINK will be
+ ignored if either is missing or has a zero-length value). TITLE is
+ optional, i.e., the RelValue will be used as the link name if TITLE
+ is omitted. Currently registered toolbar RelValues are: Home, ToC,
+ Index, Glossary, Copyright, Up, Next, Previous, Help, and Bookmark.
+ The Bookmark links are intended to have TITLEs (e.g., "Order Form").
+ The others have RelValues that yield self-evident link names. The LINKs
+ should be placed in the HEAD section, so they'll be displayed in a manner
+ simulating a toolbar (but not a real one, since we don't have Windows and
+ mouse support; use your LYK_HOME command to access it at any time 8-).
+ The BODY should have a line-breaking element (e.g, H1) to set them off.
+ For now, the Banner RelValue is treated like another toolbar element.
+ The StyleSheet RelValue is ignored, since we don't yet have loadable
+ stylesheet handling. - FM
+* Fixed up the 06-13-95 NO_ANONYMOUS_EMAIL patch to be appropriate for
+ VMS - FM.
+06-14-95
+* Added LYK_LIST command ('l' or 'L'; must be uppercase if VI keys are on)
+ for creating an ACTIVATEable list of references (links) in the current
+ document. If LINKS_ARE_NUMBERED is on, it's a UL, otherwise it's an
+ OL. Visited links have the TITLE displayed, otherwise the HREF is
+ displayed. - FM
+* Added code to append a list of references (links), if present in the
+ document, when -dump is used. Dumps are done with LINKS_ARE_NUMBERED
+ turned on. The reference list is numbered, and always shows the HREFs,
+ so that they can be referenced to the links in the document. - FM
+* Updated help files. - FM
+--- lynx2-4-1 on ftp2.cc.ukans.edu (added to lynx2-4-FM on 06-16-95)
+06-13-95
+* Added George Lindholm's patch to add -r (recurse) to the zip call in DIRED.
+ - JP
+06-12-95
+* Added George Lindholm's new file permission patch. Here's his description:
+ "Here is a rewamped version of my earlier file permission patch. This version
+ uses a html page to prompt for user input (rather than having the user
+ enter a obscure unix chmod string) using checkboxes." - JP
+* Added George Lindholm's addition of a compiler flag (NO_ANONYMOUS_EMAIL).
+ If NO_ANONYMOUS_EMAIL is set the user will not be able to add their own
+ from header. This will only work if the mail package being used will
+ add this information. - JP
+--- lynx2-4-1 on ftp2.cc.ukans.edu
+06-09-95
+* Replaced info.cern.ch with www.w3.org in html and make files. Designated
+ this code as 2.4-FM, for local use. - FM
+--- STARTING 2.4-FM ---
+--- Rename of Lynx2-3-FM and release as Lynx2-4 (08-June-1995) ---
+ (see CHANGES2-4 and CHANGES2-3)
diff --git a/docs/CHANGES2.6 b/docs/CHANGES2.6
new file mode 100644
index 0000000..1e7cfce
--- /dev/null
+++ b/docs/CHANGES2.6
@@ -0,0 +1,732 @@
+--- Rename of Lynx2-5FM and release as Lynx2-6 (02-Sep-1996) ---
+==============================================================================
+09-02-96 ---- Release of Lynx2-6 ----
+* More expansions of the online 'h'elp files. - FM
+* Updated the PROBLEMS file. - FM
+09-01-96
+* More expansions of the online 'h'elp files. - FM
+* Tweaks of list handling. - FM
+* Miscellaneous code cleanups and annotations. - FM
+08-31-96
+* Further updates and expansions of the online 'h'elp files. - FM
+* Tweaks of alignment handling with bad HTML. - FM
+* Added JIS X 0201 Japanese Kana string support. - TA & FM
+08-30-96
+* Further updates and expansions of the online 'h'elp files. - FM
+* Typo fixes in the help and doc files. - LWV
+* Tweaks of ENCTYPE handling for FORM submissions. - FM
+08-29-96
+* Today's distribution is a pre-release of v2.6. The projected official
+ release date is 09-02-96.
+* Tweaks of numeric character reference handling. - FM
+* Typo fix in LYShowInfo.c. - IC
+08-28-96
+* Added handling of ENCTYPE="application/sgml-form-urlencoded" in FORMs
+ as a directive to use semi-colons instead of ampersands as name=value
+ separators, and to indicate that as the Content-Type for POSTs. - FM
+* Convert ampersands in addresses and link names, and angle-brackets in
+ link names, to SGML entities when creating bookmarks and showinfo ('=')
+ link 'l'ist, client-side-image-map, and history list text/html streams
+ or temporary files. - FM
+* More SGML compliance mods for the handling of attribute values which
+ represent URLs or URL components. - FM
+* Tweaks of form INPUT, TEXTAREA, SELECT and OPTION handling. - FM
+* Check EAGAIN on socket connect or select attempts for all platforms and
+ flavors. - FM
+* Include both <time.h> and <sys/time.h> in tcp.h for AIX.
+* Adding warning and info in the INSTALLATION file and userdefs.h on how
+ to cope with telnetd environment variable spamming for anonymous accounts
+ running Lynx captively. - FM
+08-24-96
+* Enhancements of the History List handling. Show each link's actual address
+ in addition to the titles, since the actual addresses can't be determined
+ via showinfo or the 'l'ist display, and links in the History List derived
+ from searches can have the same titles but different searchparts or hidden
+ content appended. If a link in the History List is activated, is still
+ cached, has POST content, and ALWAYS_RESUBMIT_POSTS was configured off (as
+ recommended) and wasn't toggled on via -resubmit_posts, prompt the user
+ whether to resubmit the form (versus retrieve the cached rendition from
+ the previous submission). We don't bother prompting on PREV_DOC ("back")
+ fetches, and still resubmit forms with POST content whenever their submit
+ buttons are activated, i.e., regardless of whether ALWAYS_RESUBMIT_POSTS
+ has been configured or toggled on. - FM
+* If a user attempts to add a bookmark while viewing a document returned
+ via a form submission with POST content, and it contains links, offer
+ the current link with it's link name for editing. Otherwise, display
+ a statusline message that documents from forms with POST content cannot
+ be saved as bookmarks. - FM
+08-23-96
+* Added UP_HALF and DOWN_HALF commands, mapped by default to '(' and ')',
+ for going back or forward half a page in the document. These are
+ complementary to UP_TWO and DOWN_TWO, for going back or forward two
+ lines (remember to use the 'K'eymap command for a list of all of the
+ keystroke command bindings currently in effect, since they may have
+ been changed via lynx.cfg from the defaults described in the online
+ 'H'elp). - FM
+* Made the Control-A and Control-E keys default synonyms for HOME and END,
+ complementary to their use for going to the beginning or end of the line
+ when using the line editor. - FM
+* Don't lose track of source versus present mode on returns from temporary
+ menu files to documents derived from forms with method POST. - FM
+* Ugh, I had deleted one too many lines from HTTP.c when stripping out my
+ SSL hooks for the distribution copy (no wonder the Authorization mods
+ worked fine for me but nobody else 8-). - FM
+08-22-96
+* Added handling of named entities and numeric character references in
+ the values of most of the non-URL attributes (we don't waste overhead
+ doing that for the values of simple attributes, like ALIGN, which have
+ designated strings). - FM
+08-21-96
+* Safely handle named entities and numeric character references in the values
+ of BASE, LINK, HREF, SRC, ACTION, DATA, CODEBASE and CODE attributes, and
+ in the URL field for the CONTENT of META with a "Refresh" HTTP-EQUIV or
+ NAME. They are converted in relation to the "ISO Latin 1" Character Set
+ array regardless of the selected Character Set (except that nbsp and shy
+ remain 160 and 173), then 8-bit translations are hex escaped (as they
+ should have been in the markup 8-), and ESC is hex escaped or omitted
+ depending on whether a CJK character set has been selected. There's no
+ way to do it such that the resolved URL always will be valid no matter
+ what yoyos or CGI scripts put in document instances, but this strategy
+ maximizes the chances while making sure no "dangerous" characters, based
+ on the selected Character Set, are ever sent to the screen (it used to be
+ HyperText Markup Language, not HyperGraphic Markup Language 8-)- FM
+* Allow Control-G or a zero-length username or password to act as a cancel
+ of the request (and restoration of the current document) when an http
+ server invokes prompting for Authorization. - FM
+* When using a proxy server, report the target host instead of the proxy
+ in prompts for Authorization. - FM
+* Show MIME types of files, if known, whenever a download offer is forced,
+ regardless of why it was forced (i.e, not only for mismatches between
+ the document's charset and the selected character set). - FM
+08-20-96
+* Yet more tweaks of MIME header parsing. - FM
+08-19-96
+* Enhancements of the news gateway. - FM
+* Tweaks of Content-Type and charset handling. - FM
+* Tweaks of MIME header parsing. - FM
+08-18-96
+* Tweaks of the news gateway and its documentation. - FM
+08-17-96
+* Added overt (rational 8-) handling of all status codes that might be
+ returned (appropriately or inappropriately 8-) from HTTP/1.1 http
+ servers, and massively annotated the code in HTTP.c. - FM
+* Added parsing in HTMIME.c, and at least trace mode reporting, for all
+ http server reply and entity headers as in the 08-12-96 HTTP/1.1 draft.
+ We should not get many of them, unless we declare ourselves as an HTTP/1.1
+ client and send the appropriate request headers, but they're all available
+ now for use as more HTTP/1.1 features are added. - FM
+08-16-96
+* Added handling of "Pragma: no-cache" or "Cache-Control: no-cache" headers
+ from http servers, and polished up the code for handling them via META
+ directives. - FM
+08-15-96
+* Modified form handling so that Lynx always resubmits forms if their method
+ is POST, even if their content was not changed, when their submit buttons
+ or submitting text input are activated. Changed the ALWAYS_RESUBMIT_FORMS
+ compilation and configuration definitions, and -resubmit_forms command
+ line toggle, to ALWAYS_RESUBMIT_POSTS, and -resubmit_posts. When FALSE,
+ you still get the previously returned document from a POSTed form if that
+ document had links which you activated, and then go back with the PREV_DOC
+ command or via the history list. If set TRUE, the form will be resubmitted
+ under those circumstances as well. Documents returned by forms with method
+ GET still require use of the RESUBMIT command to resubmit if the forms'
+ content was not changed, and forms with a mailto action still always mail
+ the content on activation of the submit button or submitting text input
+ (no document is returned, so the PREV_DOC command and history list behaviors
+ are irrelevant). - FM
+* Use space to plus conversions for values of submitted form content (Ugh,
+ Lynx has been using %20 all these years! It worked because they are
+ unescaped to space, anyway. 8-). - FM
+* Polished up and massively annotated the redirection handling code. If
+ a user approves redirection of a form with POST content, it will not be
+ freed and the submission will not be converted to a contentless GET request
+ unless the status was 303 (See Other). For 300 (Multiple Choices), the
+ returned document is offered, which should include links with descriptions
+ of their media types. The returned document (if any) is now displayed for
+ any redirection status code if no Location: header was present, and for
+ unknown 3xx codes (i.e., greater than 305). If Lynx gets an inappropriate
+ 304 (Not Modified), it switches to HEAD mode and displays the status line,
+ and anything else returned by the server, as text/plain. A 301 (Moved
+ Permanently) will be treated as 302 (Moved Temporarily) for form submissions
+ with POST content. Otherwise, Lynx will use the new URL for the remainder
+ of the current session (users will have to do a 'r'emove and 'a'dd for their
+ bookmarks themselves, for now). A 305 (Use Proxy) will not be honored if
+ Lynx is already using a proxy, and instead the returned document will be
+ displayed. The limit on serial redirections was dropped from the current
+ 10 to 5, as recommended in the August 10, 1996 HTTP/1.1 draft. - FM
+08-13-96
+* Mods to accommodate the HTTP/1.1 300 - 305 Redirection status codes, and
+ to require user confirmation for any redirection of POST content. - FM
+* Tweaks of OBJECT handling. - FM
+08-12-96
+* Implemented all aspects of OBJECT that make sense for a text client.
+ Will descend though nested OBJECTs. Can be used for presenting PRE
+ formatted character-cell versions of images, and appears to handle
+ all likely uses of the SHAPES and USEMAP attributes in OBJECTs. The
+ pseudo-ALTs for links to non-script DATA values (i.e, the for-GUI
+ sources) when offered as links (e.g., in clickable_images mode), if
+ not a markup-specified string (e.g., based on a TITLE attribute),
+ are (IMAGE) or (OBJECT), based on whether the nature of the source
+ can be inferred from the context, or an explicit TYPE attribute in
+ the OBJECT start tag. The use of parens instead of square-brackets
+ indicates that the links are for OBJECTs as opposed to IMGs. - FM
+* Tweaks of SELECT and OPTION handling. - FM
+08-09-96
+* Lots more stuff added to the online help files. - FM
+* Added state code in SGML.c to avoid getting tripped up by any single or
+ double quotes in CJK escape sequences that are within single or double
+ quoted attribute values. - TA
+* Restrict resetting the Kanji code flag on white space to Japanese
+ (i.e., not also Chinese, Taipai, or Korean). - TA
+* Added handling of EPLF lines (with local time) for the FTP gateway. -
+ D. J. Bernstein (djb@koobera.math.uic.edu)
+08-08-96
+* Added code for handling captured OBJECT content with the SHAPES
+ attribute equivalently to our handling of FIG, and with USEMAP and/or
+ ISMAP content equivalently to our handling of IMG.
+* Added code for capturing potentially nested container elements that
+ require pre-processing, e.g., OBJECT, and for passing the processed
+ markup back to the SGML parser to be inserted within the ongoing HTML
+ stream.
+* Added CHECK_EAGAIN Makefile definition for non-SVR4 Unix flavors which
+ might need it for socket connect() and select() calls. - FM
+* Tweaks of keyboard input with slang when LYCursesON is FALSE. - FM
+08-06-96
+* Terminate and start a new Accept: header line if the current one will
+ exceed 1 KB (shouldn't be necessary, but otherwise the long lines cause
+ an error for WebSitePro and crash Netscape servers, and perhaps have
+ adversed effects on some other http servers with ill designed code for
+ content negotiation). - FM
+* Give temporary files suffixes matched to the Content-Type for all flavors
+ of Unix and for VMS, not just for NeXT. - FM
+* Tweak of Location: header parsing in HTTP.c (trim all lead spaces). - FM
+08-05-96
+* More help and documentation updates. - FM
+08-04-96
+* Updated the online help files. - FM
+08-03-96
+* Mods of "user (A)gent" 'o'ption handling. Also added a "useragent"
+ -restriction, included in the defaults for anonymous accounts. See
+ the "Lynx options menu" section of the "Lynx Users Guide" via the
+ online 'h'elp for more information. - FM
+* Tweaks of messaging for unsupported URLs. - FM
+* Tweaks of interrupt handling on VMS. - FM
+08-02-96
+* Added handling of Refresh in META tags. The URL is presented as a link
+ pointed to by a "REFRESH(n sec):" label, where "n" is the seconds
+ parameter from the META tag, and you must activate it yourself, which
+ should enable people using Lynx via a braille interface to examine
+ the initial document before it is refreshed. The META format is:
+ <META HTTP-EQUIV=refresh CONTENT="n; URL=url"> where "n" can be "0" or
+ a positive integer, and the "; URL=url" field is optional, defaulting
+ to the document's own address. Netscape's docs say that "url" should
+ be a complete URL, but their client doesn't require it, and so it's
+ users don't reliably use complete URLs. Lynx therefore resolves "url"
+ versus the document's own address if it is not complete. - FM
+08-01-96
+* Added handling of ENCTYPE="text/plain" for FORMs with a mailto ACTION.
+ The name=value pairs are not hex escaped, and physical newlines instead
+ of '&' separate the pairs, so that the content is readable directly. - FM
+* Added SUBJECT attribute as synonym for TITLE in FORMs (Some clients
+ are using it instead of TITLE for mailto ACTIONs, ugh!). - FM
+* Tweaks of DEL, S, STRIKE, and INS handling. - FM
+* Handle any newline characters in quoted INPUT values. - FM
+* Added news-ncurses and news-slang Makefile targets, and tweaks of headers
+ for sony_news. - Makoto MATSUSHITA (matusita@ics.es.osaka-u.ac.jp)
+07-30-96
+* Finished and incorporated lynx_url_support.html in the online help,
+ and updated lynx_help_main.html. - FM
+* Tweaks of ID attribute handling. - FM
+* Tweaks of the gopher gateway. - FM
+* Updated IBMPC-charsets.announce. - MB
+07-26-96
+* Set the default anonymous account restrictions if Lynx is invoked in
+ the account pointed to by ANONYMOUS_USER, or with the -anonymous switch,
+ before processing any additional command line restrictions, so that any
+ greater restrictions will not drop back to the compilation defaults.
+ Note that the full set of -validate restrictions always are enforced for
+ that switch, i.e., no matter what other switches or compilation options
+ are used, and whether or not the account is anonymous. - FM
+* Implemented handling of the ANONYMOUS_USER definition on VMS (equivalently
+ to it's implementation on Unix). - FM
+* Tweaks of mailto URL handling and setting of the default subject via
+ TITLE attributes. - FM
+* Tweak of the news gateway's handling of the author (From:) field. - FM
+07-25-96
+* If a server returns redirection without a complete URL indicated, resolve
+ it relative to the original request instead of issuing an error message
+ (this is incorrect behavior, but that's another trashed standard, and
+ Lynx may as well handle the situation as standard-less clients do). - FM
+* Move the NO_JUMPFILE and JUMP_PROMPT definitions to LYMessages_en.h - FM
+* Added code for selective disabling of goto by scheme in anonymous accounts,
+ along lines of patch from Doug Lawson (dlawson@epfl2.epflbalto.org). - FM
+* Ignore any viewer mappings for text/html or text/plain in mailcap
+ files. - FM
+07-22-96
+* Updated ptx target and added ptx-slang. - Alan Coopersmith
+ (alanc@CSUA.Berkeley.EDU)
+* Added all the new elements and attributes from the July 12 HTML 3.2/Cougar
+ DTD, and implemented the new IMG TITLE attribute for use with USEMAP.
+* Added a -startfile_ok switch for allowing a non-http startfile or homepage
+ with -validate, and restored the behavior of not allowing *any* non-http
+ URLs by default.
+07-19-96
+* Treat PLAIN and TYPE="plain" as equivalent in UL tags. - FM
+* Fixed the mispositioning of thinsp in HTMLDTD.c. - FM
+07-18-96
+* Moved the statusline prompt, message, and warning string definitions
+ out of userdefs.h into an LYMessages_en.h header. See the comments
+ in userdefs.h and LYMessages_en.h for more information. - FM
+* Removed the -lc from the LIBS= list of the snake3 and snake3-slang
+ targets, added a description of the HP/UX 10.10 select() problems
+ and reported (but not yet satisfactory) workarounds in the PROBLEMS
+ file, and a note in the Makefile to read the PROBLEMS file. - FM
+07-17-96
+* Numerous typecasts added for optimized compilations. - FM
+* Tweaks for ISC. - WS
+* Changed make to $(MAKE) and -g to -O for Unix targets (may need
+ tweaking for some flavors 8-). - FM
+* Added news target for SONY NEWS-OS 4.2.1R based on patch from
+ Kazuya 'Sharl' Masuda (masuda@sp.hudson.co.jp) and TA. - FM
+* Fixed typo in LYList.c from yesterday's mods. - FM
+07-16-96
+* Plugged memory leaks associated with temporary file names. - FM
+* Finally figured out what was creating orphan child anchors, and plugged
+ that memory leak in HTAnchor_delete(). - FM
+* Replace <sys/select.h> with <sys/timeb.h> for SCO in tcp.h. - BL
+* Mods to avoid warning about redefinition of signal when building on
+ VMS with old versions of SOCKETSHR (irrelevant, but might worry
+ people who don't know that the warning can be ignored). - FM
+07-15-96
+* Plugged various memory leaks in FORM handling code. - FM
+07-13-96
+* Add the startfile, and homepage if different, to the 'g'oto recall
+ buffer so that they are available for editing in addition to any
+ overtly entered 'g'oto URLs. - FM
+* Changed TRUSTED_URL to ALWAYS_TRUSTED_EXEC for clarity, and plugged
+ memory leaks and some security holes in that code. - FM
+* Fixed typo in code for handling Z compressed files. - FM
+07-12-96
+* Added handling of &thinsp; (&#8201;), and handling of &#8194; as &ensp;,
+ &#8195; as &emsp;, &#8211; as &ndash; or &endash;, &#8212; as &mdash; or
+ &emdash;, and &#8482; as &trade; (treated as &reg; &#174;), based on the
+ Cougar DTD. - FM
+* Increased the line buffer size in HTLoadHTTP() and limited the deflt string
+ length in HTPrompt() to avoid possibilities of buffer overruns. - FM
+07-11-96
+* Block access to file: URLs via network served files or bookmarks in
+ addition to 'g'oto entries when -restrictions=file_url is set (one of
+ the default restrictions for -anonymous). - FM
+* Extended compressed file handling to the ftp gateway and local files.
+ If you ACTIVATE the link instead of overtly invoking a 'd'ownload, and
+ the path with the gz or Z stripped maps to a displayable Content-Type or
+ one for which you have a viewer or helper app, the file will be treated
+ as if it had a Content-Encoding: header indicating the compression (i.e.,
+ uncompressed and displayed or passed to the viewer or helper app). - FM
+* Mods to send http servers an Accept-Encoding: header indicating gzip and
+ compress, and to block inclusion of our new, internal www/compressed MIME
+ type in the Accept: header list. - FM
+* Changed the names of the lex_buffer and lex_lines globals to HTlex_buffer
+ and HTlex_lines in case name conflicts are causing segmentation faults on
+ linux for long usernames in authorization requests, and changed all
+ malloc()'s to calloc()'s in that code in case there's an initialization
+ glitch I don't yet see. - FM
+07-09-96
+* Use the username and password of an -auth= command line argument only
+ for the first realm that requests authorization, so they don't preclude
+ access to other realms later in any interactive session that might have
+ a different username and/or password, and handle inclusion of only a
+ username or only a password in the -auth= argument. - FM
+* Tweaks of memory leak plugs in authorization handling functions (hopefully
+ now avoiding segmentation faults on linux 8-). - FM
+* Include -lc in the first position of the LIBS= list for snake3 targets.
+ - Donald S. Teiser <dsteis01@homer.louisville.edu)
+* Enhancements of Makefile. - LWV
+07-07-96
+* Tweaks of code for uncompressing on the fly. Will now force a download
+ offer without uncompressing if there is no presentation mapping for the
+ Content-Type. - FM
+* Retain blank lines within TEXTAREA content (but not trailing blanks). - DT
+07-07-96
+* Added functions for uncompressing and handling documents which have
+ Content-Encoding headers that indicate "x-gzip", "gzip", "x-compress",
+ or "compress" (instead of forcing a download offer). The files are
+ not uncompressed if they were fetched via the 'd'ownload command.
+ Note, however, that if you activate a link for a compressed image or
+ other binary file, and don't have a viewer or helper app mapped for it,
+ it will already have been uncompressed before a D)ownload or C)ancel
+ offer can be made, so use the 'd'ownload command directly if it is
+ your intention to download such files. Note also that on VMS "gzip -d"
+ is used for both gz and Z uncompression. See the INSTALLATION file for
+ info on getting the VMS port of gzip. - FM
+07-06-96
+* Allow any startfile and homepage in -validate mode even if they are not
+ http URLs. - FM
+* Made all the 'o'ptions menu statusline prompts and informational messages
+ strings that can be defined in userdefs.h for different languages. - FM
+* Mods to send one Accept header as a comma-separated list instead of a
+ series of individual Accept header statements. - FM
+07-05-96
+* Added NO_FILE_REFERER configuration symbol and -nofilereferer switch
+ for disabling transmissions of Referer headers for any file URLs (is
+ a subset of what NO_REFERER_HEADER and -noreferer disable). - FM
+* Tweaks to facilitate additions of security-related patches. - FM
+07-04-96
+* Added NEWS_CHUNK_SIZE and NEWS_MAX_CHUNK configuration symbols and
+ -newschunksize and -newsmaxchunk switches for regulating the chunking
+ of news article listings. See comments in lynx.cfg for explanation. - FM
+07-02-96
+* Tweaks of URL_DOMAIN_PREFIXES and URL_DOMAIN_SUFFIXES handling (was
+ doing double scheme prefixing under some circumstances). - FM
+* Fixed problem of potential crashes with bad HTML which lacks any
+ OPTION tags in SELECT containers (Yes, HTML that bad is really out
+ there! 8-). - FM
+* Fixed problem of potential infinite loop in HText_endAppend() for documents
+ that contain nothing but SCRIPTs and empty OBJECT containers (as in the
+ Microsoft ActiveX demos). -FM
+07-01-96
+* Added circular recall buffer for paths used as the second argument in
+ 'd'ownload and 'p'rint menu commands. Use the up- and down-arrow keys
+ to access then at the statusline prompt, equivalently to the recalls for
+ previous 'g'oto URLs, 'j'ump shortcuts, and ISINDEX or WHEREIS search
+ queries. - FM
+* Modified the LYMail.c functions to work as intended with both curses
+ and slang (through v0.9-33) on both Unix and VMS. - FM
+06-30-96
+* Changed yesterday's symbols to URL_DOMAIN_PREFIXES and URL_DOMAIN_SUFFIXES
+ and added code to guess the scheme based on the first field of the domain
+ name (e.g., gopher.wfbr.edu will become gopher://gopher.wfbr.edu instead
+ an http://host URL). Note also that a partial host string can contain a
+ dot within it and still be tested with prefixes and suffixes if the DNS
+ lookup fails with the host string as entered (e.g., cc.ukans will become
+ http://www.cc.ukans.edu), and only dots at the end or beginning of the
+ partial host string will block prepending or appending, respectively, of
+ items from the prefix or suffix lists (e.g., ftp.foo. will block use of
+ items from the prefix list, but permit tests from the suffix list, and
+ will become ftp://ftp.foo.dom if the ftp.foo.dom lookup succeeds). - FM
+06-29-96
+* Added HTTP_DOMAIN_PREFIXES and HTTP_DOMAIN_SUFFIXES in userdefs.h and
+ lynx.cfg for defining lists and setting the order of domain name prefixes
+ and suffixes to use when creating http:// URLs from command line and
+ 'g'oto arguments which are not already URLs and cannot be opened via a
+ file://localhost URL (see 05-30-96 entry). - FM
+06-28-96
+* Tweaks of MIME header handling. - FM
+06-27-96
+* Do not send a referer header for links obtained from the history list,
+ bookmark file, or jumps file. - FM
+* Made sorts by name case-sensitive in ftp and file listings. - FM
+* Added osf-slang make target. - FM
+* Enable ^C (SIGINT) interrupts during spawns on Unix (^C and ^Y interrupts
+ were already being enabled for VMS ). - FM
+* Fixed glitch in WHEREIS search handling. - Michael Barabanov
+ (baraban@luz.cs.nmt.edu)
+06-26-96
+* Tweaks of ftp gateway for VM/CMS servers based on feedback from PG. - FM
+* More tweaks of 'o'ptions menu and DISPLAY handling. - FM
+* Tweaks for builds with WIN_TCP on VMS. - FM
+06-24-96
+* Modified 'o'ptions menu handling to allow NULLing of strings which were
+ set at startup. Note that if you NULL (or set) the DISPLAY variable,
+ Lynx configured itself for X/Motif or not based on whether it was set
+ (or NULL) at startup, and you need to restart Lynx to really change the
+ configuration for 'd'ownload forces versus X/Motif viewer spawns. - FM
+* More tweaks of language code, to make the HTCJK enum checks more
+ portable. - FM
+06-23-96
+* Set up handling of nested DIV tags with ALIGN attributes (and CENTER,
+ which is treated as DIV ALIGN="center"). - FM
+* Removed INSERT, ALIAS and MH from the DTD, and their associated code
+ from HTML.c and GridText.c. - FM
+06-22-96
+* Tweaks of character set handling. - FM
+* Added function for graphic boxing of popups with curses on VMS. - FM
+06-21-96
+* Mods to translate CJK escape sequences and take Kanji into account when
+ handling statusline() messages. That's in effect if a CJK character set
+ is selected, and regardless of the raw or CJK mode setting, because the
+ strings are coming from definitions in userdefs.h, not the document that
+ is being rendered or displayed. - FM
+* Added more statusline() string definitions in userdefs.h. - FM
+* Ignore a server's Content-Encoding header if it inappropriately indicates
+ "8bit" or "7bit" (should be indicated a compression scheme). - FM
+* Mods to use charset strings as in the 07-Jun-1996 HTTP/1.1 draft, and to
+ check for those as well as their common synonyms. - FM
+* Mods to revive clearok() functionality with the slang 0.99-33 library
+ (need it for Kanji handling and for VMS), and to deal with the definition
+ conflicts for the (poorly added) TRUE and FALSE definitions in the new
+ slang library's SLcurses.h. - FM
+06-20-96
+* Added handling of the SFS file system on VM ftp servers, tested on
+ ftp://ubvm.cc.buffalo.edu/ (be sure to escape the colons if you use SFS
+ paths, e.g., ftp://ubvm.cc.buffalo.edu/vmsysu%3alistserv.webshare) - FM
+* More memory management enhancements and leak plugs. - FM
+* Added -DUNIX and -DSCO to the sco and sco5 libwww targets. - BL
+06-17-96
+* Added handling of &shy;, &#173;, and 8-bit 173 for ISO-Latin-1 documents,
+ as a soft hyphen for all of the character sets. - FM
+* Polished up and massively annotated the new character set handling
+ code. - FM
+* Made all the dummy libwww headers in WWW/Library/Implementation
+ compatible with the new, actually used, headers in /src. - FM
+* Fixed some bad ifdef-ing for statusline string definitions which
+ were added to userdefs.h. - FM
+06-15-96
+* Added many more userdefs.h definitions for statusline() and HTAlert()
+ messages. - FM
+* Tweaks of ALT string handling when they are used as forced link names
+ for USEMAP, AREA, IMG, EMBED or APPLET sources. - FM
+* Oops, hadn't put the new HTML.h in the zip. - FM
+* Fixed casing typo for HTCJK.h inclusion in HTMIME.c. - LWV
+06-14-96
+* Updated the help files, lynx.man and lynx.hlp concerning the character
+ set handling. - FM
+* Changed the -jpn switch to a generic -raw switch, and the LYK_JPN_TOGGLE
+ ('@') to a generic LYK_RAW_TOGGLE. The toggling also can be done via
+ the 'o'ptions menu, in conjunction with selecting character sets. See
+ the comments about CHARACTER_SET in userdefs.h and lynx.cfg for more
+ information. The toggle determines whether raw 8-bit characters in the
+ document are assumed to be ISO-8859-1, and therefore translated for the
+ non-"ISO Latin 1" character sets based on their LYCharSets.c arrays, or
+ are assumed to match the character set (e.g, 8-bit ISO-8859-2 when the
+ "ISO Latin 2" set is selected, or Kanji when a CJK set is selected) and
+ therefore processed raw. Use raw or CJK mode when you know the charset
+ of the document is a match to your selected character set, but no header
+ or suffix has indicated that the charset is not ISO-8859-1. Be careful
+ about this when "Other ISO Latin" is selected, since the document could
+ be, e.g., ISO-8859-3, but you are using, e.g., ISO-8859-5. - FM
+* Added "Other ISO Latin", "Chinese", "Japanese (EUC)", "Japanese (SJIS)",
+ "Korean", and "Taipei (Big5)", character sets, which presently translate
+ 8-bit ISO-8859-1 named and numeric entities to 7-bit approximations, and
+ added a default "CHARACTER_SET" definition in userdefs.h, complementary
+ to that in lynx.cfg. - FM
+* Worked in the expanded CJK (Chinese, Japanese, Korean) escape sequence and
+ Kanji handling from Takuya ASADA's June 11, 1996 Lynx2-5CJK (available in
+ ftp://ftp.three-a.co.jp/pub/www/lynx). - FM
+06-11-96
+* Tweak of the ftp gateway to handle Reflection Unix emulation servers. - FM
+* Made lynx_version_putenv_command a global so we can free it at exit
+ via free_lynx_globals() in LYMain.c. - FM
+06-10-96
+* Convert a 0xFFFF value from slang in LYgetch() to 7 (^G) to cancel
+ whatever called it, instead of exiting on error. - FM
+* Tweaks of Makefile to use symbolic, $(include) and $(lib) paths with
+ ncurses for convex, NeXT and sun4, and for SOCKSLIB. - LWV
+* Tweaks of mail editor handling based on patch from Arne Riiber
+ (riiber@systek.no). - FM
+06-09-96
+* Had overdone it plugging memory leaks and was freeing the proxy, news
+ server, and lynx version variables too soon. - FM
+06-07-96
+* Moved the Kanji handling variables into HText structure elements to make
+ the GridText.c functions reentrant for them, and added code for regulating
+ them via charset parameters in server headers or META tags. The recognized
+ parameters are EUC-JP, Shift-JIS, ISO-2022-JP, ISO-2022-JP-2, and EUC-KR.
+ E.g., a META with:
+ HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Shift-JIS"
+ will set up handling of the document as Shift-JIS. - FM
+* Made handling of Kanji more reliable when SJIS is the default, based
+ on the strategy in Takuya ASADA's Japanized Lynx2-4-2. - FM
+* K&Rized the Ichikawa ISO-2022-JP MIME header handling functions and added
+ them to HTMIME.c, together with Takuya ASADA's (asada@three-a.co.jp)
+ function for guessing whether an escape has been lost and filling it in,
+ and use them for checking news headers. - FM
+* Retry DCL spawns without the TRUSTED flag if it was included and we
+ got back an INVARG status. - Robert C. Gray (gray@cyberodyssey.com)
+06-06-96
+* Plugged lots of memory leaks. - FM
+* Handle colons in code for expanding host names and prepending http://
+ (e.g., wfbr:8002 will become http://www.wfbr.edu:8002/). - FM
+* More tweaks of character conversions. - FM
+* Block crashes if illegal markup such as Anchors are present in the
+ OPTION strings for SELECT. - FM
+06-04-96
+* Mods of entity and end tag handling in SGML.c and LYCharUtils.c. - FM
+* Tweaks of make target for sun4-slang. - NHE
+06-03-96
+* More tweaks of the ftp gateway. - FM
+* More anti-crash protections for bad HTML. - FM
+* Tweaks of LYCharUtils.c and SGML.c. - KW
+* Enclose the username for rlogin URLs in double-quotes on VMS to preserve
+ mixed casing if present. - Robert C. Gray (gray@cyberodyssey.com)
+06-02-96
+* Made DEFAULT_CACHE_SIZE and DEFAULT_VIRTUAL_MEMORY_SIZE configurable via
+ lynx.cfg. - FM
+* Added comments in HTFTP.c to make more clear some of the counterintuitive
+ things being done, and why. - FM
+* Oops, had left my ISSPACE() debugging macro in HTFTP.c yesterday. Is
+ now back to isspace(). - FM
+06-01-96
+* Added support for ;type=I (or A or D) to specify Image or ASCII transfer
+ modes, or a Directory, in ftp URLs. - FM
+* Added support for VM/CMS ftp servers. Note that 'd'ownloaded text files
+ will have CRLF as line terminators, due to their use of ASCII records
+ (tested on ftp://pucc.princeton.edu/anonymou.376). - FM
+* Added support for use of a tilde on Unix ftp servers to indicate that you
+ want a listing of the user's login directory instead of the root (i.e.,
+ ftp://user@host/~ or ftp://user@host/~username will cause Lynx to attempt
+ a listing of the translated ~ or ~username). Paths can be appended (e.g.,
+ ftp://user@host/~/subdirectory). This should not be used with anonymous
+ ftp, or in public documents. It yields the behavior on Unix or Unix-like
+ ftp servers which should occur without the tilde, based on RFC 1738. Note
+ that the valid behavior involving use of %2f is implemented for VMS (see
+ the 12-20-95 entry, below), but the behavior for Unix and Unix-like ftp
+ servers emulates Lynx's Unix DIRED_SUPPORT. - FM
+* Mods of CSO/PH gateway to deal with discontinuous field name tokens
+ (e.g., "NYU fax" instead of "NYU_fax"). - FM
+* More fixes for the putenv_command pointer in LYMain.c. - CC
+* Add curly braces to the current hack for minimizing reversals of
+ trace messages with slang. - KW
+05-30-96
+* Modified the http:// prepending code to try expanded host names if the
+ the first (or only) element does not contain a dot and is not a known
+ host name. Will first try it as www.host.com, then www.host.edu, then
+ www.host.net, then www.host.org, e.g., wfbr/dir/lynx will become an
+ http://www.wfbr.edu/dir/lynx URL. - FM
+* Added handling of MSDOS_SERVER ftp server type (tested on ftp.hayes.com)
+ and corrected WINDOWS_NT_SERVER handling (tested on ftp.boca.org). - FM
+* Reset any modified, non-HT-LEFT styles in HTML_free() if they were not
+ reset in HTML_end_element() due to missing end tags. - FM
+* Initialize the putenv_command pointer in LYMain.c. - Christophe Colle
+ (colle@krtkg1.rug.ac.be)
+* Include LYLocal.h in LYCgi.c. - Carl Hansen (hansen@best.com)
+05-28-96
+* Made all mainloop() statusline() message strings definitions in userdefs.h
+ for easier modification to other languages (we'll move them to a catalog
+ someday 8-). - FM
+* Added string definitions in userdefs.h for statusline messages identifying
+ active or DISABLED radio buttons. - FM
+* More tweaks of character conversions. Note that numeric entities with
+ values greater than 255 are displayed as text, until we are able to
+ handle them as Unicode. - FM
+* Implemented ID handling for BDO. - FM
+05-27-96
+* Added nested handling of Q, so that it alternates between double-quotes
+ and single-quotes, with directionality of start and end single-quotes
+ (should someday check the LANG and DIR attributes, and character set,
+ to use other quoting conventions if appropriate). - FM
+* Use [DEL: ... :DEL] labeling to indicate DEL content, and [INS: ... :INS]
+ labeling to indicate INS, S, and STRIKE content. - FM
+* Added ID handling for ABBREV, ACRONYM, AU, AUTHOR, BIG, DEL, INS, Q, S,
+ SMALL, SUB, SUP and SPAN. - FM
+* Added code to clear the screen of any trace messages directed to the
+ screen, once the full page has been created. - FM
+* Added code to minimize slang's casting of trace messages as reverse when
+ directed to the screen instead of a file. - FM
+05-26-96
+* More tweaks of character conversions. - FM
+* Added submit_enctype elements to the forms structures as will be needed to
+ implement INPUTS with TYPE="file" (someday 8-), and set disabled for FORM
+ fields if the ENCTYPE is multipart/form-data, until we can handle that
+ (someday 8-), so the user won't fill out the FORM pointlessly. - FM
+* Made the third argument of SLang_init_tty() 1 so that '\n' will be treated
+ as CRLF when trace messages are sent to the screen instead of to a file.
+ Might cause problems with the slang screen management functions, but
+ doesn't seem to according to KW. - FM
+05-25-96
+* Mods to pass 8-bit control characters entered via the line editor. They
+ should be assumed to be valid if the user entered them, and could indeed
+ be valid for Japanese and Russian. - FM
+* Check for a NULL return value from initscr() on Unix. - Geert Jan de Groot
+ (GeertJan.deGroot@ripe.net)
+* Tweaks of character conversions, and of 8-bit character handling with
+ slang. - Klaus Weide (kweide@tezcat.com)
+* Added TRUSTED_URL for specifying lynxexec and lynxprog URLs which always
+ are permitted, based on patches from David Drum (david@more.net). - FM
+05-21-96
+* Made the LOCAL_DOMAIN symbol configurable via lynx.cfg. - FM
+* Added descriptions of the quality (q=) and maxbytes (mxb=) parameters
+ in the sample mailcap file. - FM
+* Added a maxbytes element to the libwww presentation and converter
+ structures, and code for specifying a maximum for mailcap entries via
+ a semi-colon-separated mxb=value field, where "value" is a positive
+ integer (e.g., ; mxb=1000000). The default is 0, meaning no maximum.
+ If the value exceeds 0, a maxbytes parameter will be appended in the
+ Accept: header for the Content-Type. - FM
+05-20-96
+* Added code for specifying a quality parameter for mailcap entries via
+ a semi-colon-separated q=value field, where "value" is a floating point
+ number (e.g., ; q=0.002), and for appending the quality parameters in
+ Accept: headers if the values are less than 1.0. - FM
+* Treat screen width as 80 for the startup page when doing traversals with
+ a slang-build Lynx to prevent a crash. - FM
+05-19-96
+* Mods in HTML.c to make resolving of local file URLs more efficient. - FM
+* Tweaks of Makefile for slang. - Ed Doolittle (dolittle@math.toronto.edu)
+05-18-96
+* Added FRAME elements and attributes to the DTD, and code for creating
+ links to the SRCs. - FM
+* Added numerous sanity checks for valid but inappropriate combinations
+ of attributes based on the HTML 3.2 DTD.
+05-17-96
+* Added support for TYPE and VALUE attributes of LIs in OLs. TYPEs
+ are equivalent to those for OL, and VALUE is equivalent to START
+ or SEQNUM for OL. See the 11-28-95, 10-17-95, 09-19-95 and 09-04-95
+ entries in this file. If a TYPE is changed via an LI, the change
+ persists for subsequent LIs of that OL. The VALUE set for an LI
+ similarly increments for subsequent LIs in that OL. - FM
+05-16-96
+* Made SGML_character() in SGML.c fully reentrant. - FM
+* Set up capturing of marked sections, and DOCTYPE, ELEMENT, ATTLIST and
+ ENTITY declarations in SGML.c. Lynx doesn't do anything with them yet,
+ besides reporting them in trace mode, but they at least won't create
+ garbage in the display if they start being used for the "next generation"
+ of clients. - FM
+* Set up base code for CSIs (Client Side Includes, homologous to SSIs).
+ See the comments for LYDoCSI() in LYUtils.c. It should be moved to a
+ separate module if someone wants to work on CSIs seriously. LYDoCSI()
+ is called from SGML.c if the document was obtained via a file URL on
+ the local host and has comments that begin with "!--#". - FM
+05-15-96
+* Add a MIME charset parameter to POST Content-Type headers if it's not
+ ISO-8859-1 or US-ASCII and the server included the parameter when it
+ sent the form (but don't do it simply on the basis of the user's current
+ character set, because if the server didn't include the parameter, it's
+ CGI script probably won't parse the client header either, and will return
+ an error instead of processing the form submission). - FM
+05-14-96
+* Tweaks for Unixware and addition of a unixware-slang Makefile target based
+ on patches from Thanh Ma (tma@encore.com). - FM
+* Tweaks for SCO and addition of an sco5 Makefile target based on patches
+ from Bela Lubkin (filbo@armory.com). - FM
+* Include ;q=0.001 for the wildcard (*/*) Accept header. - FM
+05-13-96
+* Added support for a host field in news URLs, analogous to that for nntp
+ URLs. Though illegal according to the current RFCs, discussions with a
+ W3C member about this Netscapism indicate that Lynx may as well support
+ it now, rather than continue failing when it is encountered. - FM
+05-12-96
+* Added an explicit GetYX definition for slang in LYForms.c. - FM
+05-11-96
+* Eliminated the NCURSESINCDIR compilation symbol and added NCURSESHEADER,
+ so the default now is to seek ncurses/curses.h and -DNCURSESHEADER invokes
+ a seek for the (now obsolete 8-) ncurses.h. - FM
+* Added an explicit GetYX definition for slang in LYStrings.c (now avoids
+ reference to stdscr). - FM
+* Mods in tcp.h for TCPWARE builds on VMS with DECC. - FM
+05-08-96
+* Fixed typo in Makefile entry for linux. - LWV
+05-07-96
+* Added LYPassHighCTRL boolean for passing normally illegal 8-bit control
+ characters, and set it TRUE when the KOI8-R character set is selected
+ (note that they also are passed when Japanese character support is
+ toggled ON). - FM
+05-06-96
+* Mods in SGML.c to handle "<URL:" as text instead of an unknown tag. - FM
+05-05-96
+* Added typecasts of the third arguments for the getsockname() and
+ accept() calls in HTFTP.c to void pointers, to avoid conflicts with
+ their declarations as int versus unsigned int across platforms and
+ flavors. - FM
+* Renamed the for-VMS opendir(), readdir() and closedir() to HTVMSopendir(),
+ HTVMSreaddir() and HTVMSclosedir(), and the for-UCX ioctl() to HTioctl(),
+ to avoid possible conflicts with their additions to newer versions of
+ VMS and UCX. - FM
+05-04-96
+* Fixed typo which was placing a space instead of a slash between the
+ User-Agent name and version. - Tim Rowley (tor@cs.brown.edu)
+
+--- STARTING 2.5FM ---
+--- Rename of Lynx2-4-FM and release as Lynx2-5 (02-May-1996) ---
+ (see CHANGES2-5, CHANGES2-4 and CHANGES2-3)
+==============================================================================
diff --git a/docs/CHANGES2.7 b/docs/CHANGES2.7
new file mode 100644
index 0000000..d6bb667
--- /dev/null
+++ b/docs/CHANGES2.7
@@ -0,0 +1,831 @@
+=======================================================================
+--- Release of Lynx2-6FM as Lynx v2.7 (February 15, 1997) ---
+=======================================================================
+1997-02-15
+* Release of Lynx2-6FM as Lynx v2.7. - FM
+* Included -Ae when compiling the Implementation modules for the snake3
+ target. - FM
+1997-02-14
+* Mods to issue an alert about a BASE tag not having an absolute URL only
+ once per document. - FM
+* Added code for appending LYNX_SIG_FILE to email messages as well as to
+ news posts or followups, and updated the Users Guide accordingly. - FM
+* Updated build-slang.com. - FM
+1997-02-12
+* Fixed some problems in the code for using a hookless Lynx image with
+ snew_proxy, snewspost_proxy, and snewsreply_proxy set to
+ "nntp://host:port/" so that it uses Tom Zerucha's (tz@execpc.com)
+ daemon which handles the SSL communications on behalf of the Lynx
+ image. Also polished up all of the news gateway code, and added
+ comments for the benefit of new developers. - FM
+* Added an ECGOTO command mapped by default to 'G', complementary to the
+ GOTO command (default 'g'), to edit the current document's URL and then
+ go to it. Using case-sensitive letters with different command definitions
+ ensures that both will appear with their brief explanations in the 'k'eymap
+ listing. For ECGOTO, Control-G, failure to modify the URL, or complete
+ deletion of it, all act as a cancel. If the current document has POST
+ content associated with it, a warning will be issued before offering the
+ URL to edit. The POST content is retained if the modification merely
+ involves a change in fragment for the URL. Otherwise, the modified URL
+ (if it has an http scheme) will be submitted with method GET and no POST
+ content. If the ECGOTO command is not cancelled, or not simply a fragment
+ change, the modified URL will be added to the 'g'oto buffer, and can be
+ re-accessed, to edit further, via the GOTO command. See the updated online
+ 'h'elp for more information. - FM
+1997-02-10
+* Amplified the comments concerning deletion of prototypes for MultiNet
+ socket library functions as they get added to MultiNet's own headers
+ in newer versions of it's socket library. - FM
+* Added a missing fclose() in post_article() of HTNews.c, and added code
+ to delete the temporary file there, so it's gone as soon as we're done
+ with it. - FM
+02-09-97
+* Enhanced the Set-Cookie header parser to handle values that contain
+ spaces but were not enclosed in double-quotes, and to use such
+ quoting or not when sending Cookie headers, depending on whether
+ this was done in the Set-Cookie header. Also added anti-crash
+ checks should the parser's efforts to handle both historical (a.k.a.
+ original Netscape) cookies and Version 1 cookies go awry (does deal
+ successfully now with all the cookies which had been reported as
+ problematic). - FM
+* Mods of the screen handling in LYNews.c for cleaning up any screen
+ trash created by the external editor. - FM
+* Tracked down an uninitialized pointer in LYNews.c that probably was
+ behind reports of crashes when posting to newsgroups. - FM
+* Plugged a memory leak in LYMainLoop.c. - TJC
+* Added posting ability to the news gateway, in lieu of the previous,
+ variably reliable, use of a spawned news client for posting. The
+ news, nntp, and snews URLs now all return links for posting new
+ messages or followups (replies) to the server from which a newsgroup
+ listing or news article was retrieved, unless the server indicates
+ that it does not accept posts from the site at which Lynx is running.
+ See the updated INSTALLATION, userdefs.h, and lynx.cfg files, the
+ "USENET News posting" section of the Users Guide, and "Supported URLs"
+ page of the online 'h'elp for more information.
+* Fixed typo for e-dieresis in the KOI8-R charset. - AJF
+* Replaced an inappropriate _user_message() call in HTConfirmCookie()
+ of HTAlert.c with a _statusline() call. The original code could
+ cause crashes with some cookie values. - FM
+02-06-97
+* Added support for both hex escaped and unescaped white characters
+ in lynxexec and lynxprog URLs. Normally, Lynx strips out any white
+ characters that are not hex escaped in attribute values that are
+ to be resolved as URLs, on the assumption that they were derived
+ from wrapping in the markup. Any serial white characters in
+ lynxexec and lynxprog URLs are condensed to one space (' '), and
+ any lead or trailing white characters are trimmed. Note that we
+ still require hex escaping of spaces in mailto URLs, e.g,
+ HREF="mailto:lynx-dev@sig.net%20(I%20found%20a%20bug.)". - FM
+* Removed the 'e' switch from tar commands in LYLocal.c for greater
+ portability across all supported Unix flavors. - FM
+* Expanded the information in the PROBLEMS file on how to deal with
+ DECC and MultiNet header incompatibilites for different combinations
+ of the VMS compiler and socket library versions. - FM
+* Added TRACE message of the edit command created for the system()
+ call in LYEdit.c. - LWV
+* Fixed a typo in the userdefs.h comments. - NHE
+02-04-97
+* Mod in LYMainLoop.c to bypass mailing "not found" messages when
+ MAIL_SYSTEM_ERROR_LOGGING was set TRUE (which it should NOT be,
+ indescriminately) if the document's owner is the lynx-dev list. - FM
+* Added crash protection checks for the actual presence of anchors
+ in all HText structure anchor scans in GridText.c, based on a crash
+ report and suggested fix for one of them from Jonathan Sergent
+ (sergent@hillres55-129.cc.purdue.edu). - FM
+* Eliminated the typecast for ttytype (apparently varies across flavors,
+ and each flavor should know it's own typing; we'll see) in LYCurses.c,
+ and moved VMS system definitions with non-ANSI conformant tokens to a
+ separate header for VMS (LYVMSdef.h). - BL
+* Made the description of HISTORY in the 'k'eymap page more clear that
+ it invokes a list of the "suspended" documents currently held in the
+ history stack. - DC
+* Typo fixes in the help files and lynx.cfg. - LWV
+02-03-97
+* Today's distribution is a pre-release of v2.7. The projected official
+ release date is 02-15-97. All header, help and documentation files,
+ and the top directory name, have been updated for v2.7. - FM
+* Made xli, which is freeware, the default XLOADIMAGE_COMMAND for Unix
+ in userdefs.h (still xv on VMS, since its port is freeware), and
+ expanded the "self-documentation" to indicate where to get this
+ freeware. Added XLOADIMAGE_COMMAND as a configuration symbol in
+ lynx.cfg, so that the compilation default can be overridden on
+ systems which have and prefer xv (all users can override the default
+ mappings for image helper apps via their mailcap files) - FM
+* Added a -base command line switch which can be used with -source or
+ -mime_header to prepend the request URL as a comment, and a BASE tag
+ (which may or may not be the same as the request URL, depending on
+ HTTP/1.1 headers) for text/html documents, equivalent to the prepend
+ kludge for 'd'ownloads (see 09-20-96 mods). - FM
+* Added a check for an "ORGANIZATION" environment variable for inclusion
+ as a news post header on Unix (all system logicals intended for news
+ post headers automatically are included on VMS), and a sleep() before
+ restoring curses mode after the post, to allow reading of any error
+ messages from the news software. - FM
+* Fixed bug which yielded a "[LINK]" instead of "[INLINE]" pseduo-ALT
+ for ALT-less IMG tags used as the content for NAME-ed Anchors without
+ an HREF. - FM
+* Portability tweaks for the mini inews utility. - FM
+* Fixed an old and irrelevant typo in HTWriter.c. - JS
+01-29-97
+* Added more REL tokens that are acceptable for banner links. - FM
+* Ifdef'ed the standard foo_PATH definitions for FreeBSD at the bottom of
+ userdefs.h, based on a patch from AAC, and assuming they also apply for
+ NetBSD, BSDI, and Linux (we'll see 8-). - FM
+* Added make freebsd-slang target. - AAC
+01-28-97
+* Mods of LYSetCookie() to ensure setting of 443 as the default port for
+ https URLs, and force the secure flag on for https URLs whether or not
+ the Set-Cookie header had a secure parameter (too many Version 0
+ cookies don't, when they should). - FM
+* Removed -ltermcap from make for all ncurses targets. - FM
+* Tweaks of make for FreeBSD. - AAC
+* Use SLtt_get_screen_size() instead of the apparently less portable
+ code for slang in size_change() of LYUtils.c. - JED
+01-27-97
+* Made ALT a synonym for VALUE in INPUTs with TYPE="image" to cooperate
+ with well-intentioned (though misinformed) providers who use ALT instead
+ of VALUE for the benefit of text clients or GUIs with image handling
+ turned off. - FM
+* Modified the code for submission of form content with TYPE="image" NAME-ed
+ INPUTs that have a VALUE (or ALT) to "fake" a 0,0 coordinate pair, as when
+ a VALUE (or ALT) is absent, instead of sending a single name=value pair.
+ Requests that using a name=value pair in such cases to indicate that the
+ submission was from a text client or GUI with image handling turned off
+ be included in the HTML specifications keep falling on deaf ears, so we
+ may as well "fake" something closer to what the CGI scripts are expecting,
+ and hope that the script interprets 0,0 as an indicator that the user did
+ not see the image and make a conscious choice within it.
+* Added code to offer a link for the SRC of the image in INPUTs with
+ TYPE="image", distinct from the submit button, when clickable images
+ is on. - FM
+* Updated the "HTML Forms" section of the Users Guide. - FM
+* Fixed a typo in the parsing of Cache-Control MIME headers and META
+ directives. - FM
+01-25-97
+* Updated lynx_help_main.html, about_lynx.html and about_lynx-dev.html. - FM
+* Mods to indicate a toolbar by a '#' preceding its first link when the
+ toolbar is being displayed, and to indicate the availability of a toolbar
+ by a '#' in the top, left-hand corner of the screen when the toolbar is
+ not being displayed. Added explanation of this in the online 'h'elp. - FM
+* Indicate the 'allow' setting (always, never, or via prompt) for each
+ domain in the Cookie Jar Page. - AK
+* Don't delete cookie-less domains silently during garbage collections if
+ they have their 'allow' set to always or never. - AK & FM
+* Added ability to change the 'allow' settings for domains via the Cookie
+ Jar Page. - FM
+* Added basic protection against "denial of service attacks" by limiting
+ a domain to 50 cookies, the total number of stored cookies to 500, and
+ the maximum processed size of a cookie to 4096 bytes. - FM
+* SGML escape any ampersands or angle brackets in the cookie names, values,
+ parameters, and comments when creating the HTML stream for the Cookie
+ Jar Page, and only include entries for comments if they were present in
+ the servers' Set-Cookie headers. - FM
+* Updated the online 'h'elp for cookies. - FM
+* Removed -DNO_KEYPAD from all ncurses targets in the Makefile. - FM
+01-23-97
+* Added a "Lynx State Management (Me want cookie!)" section to the Lynx
+ Users Guide, and a cross-linked cookie_help.html file for the Cookie
+ Jar Page. - FM
+* Added prompting for whether to show the body of a 401 status reply or
+ simply return to the current document when an activated link requires
+ authentication via a username and password, and the user has none for
+ that realm, or forgot them. - FM
+01-22-97
+* Added handling of expires attribute values in Version 0 (a.k.a. Netscape)
+ Set-Cookie MIME headers or META tags, and added "Maximum Gobble Date"
+ entries in the Cookie Jar Page which indicate the maximum intended age
+ for each cookie based on the Version 0 expires or Version 1 max-age
+ attribute values. - FM
+* Added an LYmktime() function in LYUtils.c which accepts strings in the
+ format "Day, dd-Mon-yy hh:mm:ss GMT" or "Day, dd Mon yyyy hh:mm:ss GMT",
+ parses and converts them to time_t format (seconds since 00:00:00 Jan 1
+ 1970), and returns the time_t value, or zero if the date is in the
+ past. It is used for handling Expires headers or attribute values. - FM
+* Added parsing of Cache-Control and Expires MIME headers and META tags
+ sufficient to determine whether the no_cache element should be set in
+ the document's structures. - FM
+* Eliminated the "; $Path=foo; $Domain=blah" attr=value pairs when sending
+ Version 0 (a.k.a. Netscape) cookies in request headers, because too may
+ CGI scripts in the real world have brain-dead parsers and fail when they
+ are included. - FM
+* Added handling of Set-Cookie directives in META tags. - AK
+01-20-97
+* Added confirmation prompts for deletions from the Cookie Jar, expanded
+ the garbage collecting for expired cookies, debugged and implemented the
+ code for security checks based on lead and embedded dots in domain values
+ and host prefixes as described in Section 4.3.2 of the -05 State Management
+ draft, added requirement for https URLs (direct, or via proxy) to include
+ cookies which have the secure flag set in request headers, and extensively
+ annotated the cookie support code for ease of further development. - FM
+* Added ability to set SHOW_CURSOR in lynx.cfg, to override the compilation
+ setting in userdefs.h, and made the -show_cursor command line switch a
+ toggle for the compilation or configuration default. - FM
+01-18-97
+* Bug fixes and memory leak plugs for the cookie support. Added ability
+ to delete individual cookies or entire domains via the Cookie Jar Page
+ (Ctrl-K). The domains and cookies are displayed as DL/DT/DD blocks,
+ with links for each domain and cookies name. The deletions are done
+ by activating those links, which can be numbered, so it should be OK
+ for blind users. - FM
+* Tweaks of the news/nntp/snews gateway. - FM
+* Tweaks of paragraphing if ADDRESS, BANNER, BLOCKQUOTE, BQ, FN, MARQUEE
+ or NOTE blocks are nested (note that nesting does not yield progressive
+ indentations of these blocks). - FM
+01-16-97
+* Added "first pass" cookie support based on patches from Andrew Kuchling
+ (amk@magnet.com). Still needs work (see comments at top of LYCookie.c).
+ A SET_COOKIE symbol in userdefs.h and lynx.cfg determines whether cookie
+ support will be on or off by default, and the default can be toggled
+ via a -cookies command line switch. When on, Set-Cookie headers invoke
+ confirmations with possible replies of 'Y'es or 'N'o for that cookie,
+ 'A'lways, to accept all cookies from that domain, or ne'V'er to never
+ accept cookies from that domain. The Cookie Jar can be examined via
+ the COOKIE_JAR keystroke command, mapped by default to Ctrl-K. The
+ Cookie Jar, and any 'A'lways or ne'V'er settings, do not presently
+ outlast the Lynx session. - FM
+01-14-97
+* Added use of DEFAULT_INDEX_FILE or the URL from an -index=URL command
+ line switch as the the HREF for a banner LINK with REL="Index" and no
+ HREF of its own (see the 01-01-97 mods and the HTML Banners section of
+ the Lynx Users Guide). - FM
+01-13-97
+* Tweaks of the news gateway. - FM
+* Added "Negotiate: trans" header for GET and HEAD requests. Shouldn't
+ be necessary to get 300 instead of 406 replies when nothing matches
+ the Accept and Accept-foo request headers, but some HTTP/1.1 servers
+ apparently want it when the UA declares itself as HTTP/1.0, as Lynx
+ still does. - FM
+01-12-97
+* More updates of the online 'h'elp files. - FM
+* Simplified the code for checking whether a startfile is a bookmark file
+ entered as a URL instead of invoked via the -book switch. The previous
+ code was tripping up some versions of the osf and linux compilers. - FM
+01-10-97
+* Replaced the realloc() in split_line() of GridText.c with a calloc(),
+ memcpy(), FREE() sequence for all systems, not just AIX and ultrix,
+ based on analysis of memory wastage by Hans Reiser
+ (dl9rdz@cip.e-technik.uni-erlangen.de). - FM
+* Tweaks of the body= handling in mailto URLs. - FM
+* Tweaks of the ftp gateway. - FM
+* Restored inheritance when resolving versus a base with the same scheme,
+ because the RFC1808 and Fielding Draft behavior of not doing so yields
+ too many failures in the real world (sigh...). - FM
+01-09-97
+* Ugh! The distribution zip still had the Nov 4, 1996 HTTCP.c instead of
+ the one I modified on Christmas. No wonder people were still reporting
+ the wrong messaging with -DNSL_FORK. The right HTTCP.c is in there
+ now. - FM
+* Mods to resolve the HREFs for LINKs with REV="made" or REV="owner"
+ versus the base (a many, many year old bug finally caught 8-). - FM
+* Added HTAlert messages about BASE HREF values, Location header values,
+ and Refresh URL values that were not received as absolute URLs. We
+ still resolve them versus the RequestURI, since that's invariably
+ what is intended, and thus the optimum "error recovery" strategy. - FM
+* Added handling of cc= and body= fields in ?searchpart strings of mailto
+ URLs. They are described in draft-hoffman-mailto-url-00.txt recently
+ posted to the URI-WG list. This draft ignores the objections which have
+ been filed about changing the semantics of mailto and breaking clients
+ which are fully conformant with the mailto specs in RFC1738, instead of
+ using a new scheme name (e.g., smtp:) for URLs with mail headers, and it
+ extends the ill-advised use of '&' as puctuation in URLs instead of
+ honoring the previous IETF effort to seek it's replacement by ';' as the
+ URL name=value separator and, in effect, treating them as parameters
+ without need to worry about confusions with entities when the URLs are
+ attribute values in text/html. However, the chairman of the URI-WG is
+ a co-author of this draft, so, sigh... As far as this Lynx code is
+ concerned, the mods are more "error recovery" to cope with the sad things
+ which have afflicted the Web during the past 2-3 years, and use of a
+ ?searchpart in mailto URLs is still DISadvised. Lynx uses only subject=,
+ cc=, and body= fields from a ?searchpart, using it's own "safe" rules for
+ other mail headers, and ignoring ones other than those three in the
+ ?searchpart as "unsafe". The cc= values in a ?searchpart are added to
+ the primary address as a comma-separated list for the mail agent, and
+ Lynx's own Cc: is that entered, optionally, by the user. Any body= field
+ is passed to the external editor, if one has been defined, for review and
+ possible modification. Otherwise, it is scrolled for review. The mailing
+ can be cancelled at any time (via Ctrl-G), and via a statusline prompt
+ after everything has been reviewed, if the user judges the body and/or
+ addresses to be unsafe or inappropriate. - FM
+* Moved information and prompt strings in LYMail.c to installer-modifiable
+ symbols in LYMessages_en.h. - FM
+01-07-97
+* Eliminated forced exits for keyboard input buffer overruns on VMS.
+ There's no perfect way to deal with it, but Lynx should recover
+ gracefully most of the time now, and do nothing bad if ungraceful. - FM
+* Added handling of Content-Base and Content-Location MIME headers when
+ 'd'ownloading, 'p'rinting, or mailing HTML source. For this, as
+ for rendered HTML streams (see 01-06-97 mods) the base is determined
+ according to HTTP/1.1 rules: If a Content-Base header was received,
+ that's the base. Otherwise, if a Content-Location header was received
+ and it's an absolute URL, that's the base. Otherwise, the URL used
+ to retrieve the document is the base. When actually rendering, any
+ BASE tag in the document overrides the base derived from headers.
+ When 'd'ownloading, or outputting HTML source for a 'p'rint option,
+ an X-URL comment with the URL used to retrieve the document and a
+ BASE tag with the header or URL-derived base are inserted at the top
+ of the document. These should be moved down into the actual HEAD
+ section to make the HTML fully legal, but will work as is if the
+ output is used in conjunction with automatic invocation of Lynx or
+ Netscape as a text/html helper application. When mailing with an
+ SMTP-conformant mailer, the actual URL used to retrieve the document
+ is indicated via an X-URL header, and for HTML source, a Content-Base
+ and a Content-Location header are included, set to what was actually
+ received by Lynx via MIME headers, or to the retrieval URL. - FM
+01-06-97
+* More updates of the online 'h'elp. The Visited Links Page ('V'),
+ multi-bookmark file support, REL/REV and META enhancements, and new
+ switches are now all fully documented in the 'h'elp. - FM
+* Added handling of Content-Base and Content-Location MIME headers for
+ rendered HTML streams (still using the document's URL in the 'd'ownload
+ and 'p'rint (and mailing) BASE prepending kludge). - FM
+* Added code to avoid getting tripped up by double-quoted header values
+ in HTMIME.c. We still need more sophisticated parsing of possibly
+ compound HTTP/1.1 headers, but we don't yet use any of those. - FM
+* Tweak of the efficiency mods for command line parsing in LYMain.c. - FM
+* Simplified some code in LYMainLoop.c that was tripping up the AIX32
+ compiler. - FM
+01-04-97
+* More updates of the online 'h'elp. - FM
+* Added DIRED_MENU support for .tgz files as for .tar.gz files. - FM
+01-03-97
+* Made the command line parsing in LYMain.c more efficient. - FM
+* Added -nopause switch for setting InfoSecs, MessageSecs, and AlertSecs
+ to zero. Can be used to eliminate forced statusline pauses during
+ traversals. - FM
+* Mods to allow absolute zero quality values for Accept headers, so that
+ in mailcap files users can do things like map image/* to a helper app
+ but exclude particular image subtypes which the app can't handle by
+ assigning q=0 for that subtype. HTTP/1.1 still specifies 4 significant
+ figures for quality values, so if the value is non-zero, Lynx still
+ forces a minimum of q=0.001. - FM
+* Typo fixes in lynx.cfg. - LWV
+01-02-97
+* Updates of the online 'h'elp files. - FM
+* Made the parsing of lynx.cfg in LYReadCFG.c more efficient. - FM
+01-01-97 -- Happy New Year!
+* More partial/relative HREF resolving enhancements. Everything is now
+ handled as recommended in Larry Masinter's -03 revision of Roy Fielding's
+ -02 URL ID, except file and ftp URLs (which Lynx handles as described
+ in the online 'h'elp ). Note, though, that Lynx handles known schemes
+ on a scheme-by-scheme basis, and for schemes that involve substitutions
+ of "/" for a NULL/zero-length path, Lynx inserts the "/" at the resolving
+ stage, so those slashes are present where the Fielding test suite doesn't
+ indicate them, but the actual requests sent to servers (or bad URL message
+ if it's a scheme that requires a host field and doesn't have a default)
+ will be the same. Note, also, that Lynx sends only the path<?searchpart>
+ ("absolute path") in it's direct http requests and indicates the host of
+ the URL in the Host: header, i.e., sends the absolute URL only to proxies.
+ Note, as well, that Lynx treats a zero-length attribute value for an HREF,
+ SRC, etc. as a reference to the currently displayed document, but still
+ uses the base (which might not be the current document's address) as the
+ default for FORMs without an ACTION specified, or ISINDEX tags without
+ an HREF or ACTION specified. - FM
+* Expanded REL/REV handling. All of the REL values in the (expired) Maloney
+ and Quin draft-ietf-relrev-00.txt ID which make sense for banner links in
+ Lynx have been added. For REL="Help" without an HREF in the LINK, Lynx
+ uses its helpfile URL. For REL="Home" without an HREF in the LINK, it
+ uses the configuration startfile or WWW_HOME URL (i.e., not a startfile
+ specified on the command line), or the command line homepage, if it was
+ specified. - FM
+* Added handling of fragments in conjunction with URL expansion guessing for
+ startfile, homepage and 'g'oto strings. Note that any '#' that is not a
+ fragment delimiter should be hex escaped (%23), and ideally all reserved
+ or unsafe characters will be hex escaped in the user-entered string, though
+ you can get away with not using the hex codes for most others, depending on
+ their positions in the string. Also note that on VMS if you include the
+ version for local files it must precede the fragment (e.g., foo.html;3#frag)
+ as for parameters. - FM
+12-26-96
+* Mods of HREF resolving to be more consistent with the latest IETF draft
+ (http://www.ics.uci.edu/pub/ietf/uri/draft-fielding-url-syntax-02.txt).
+ Most importantly, lone fragments (HREF="#fragment") are resolved versus
+ the current document's URL, and no longer versus the BASE, if present.
+ There are a few things in the draft which are at odds with what virtually
+ all currently deployed browsers do, and so I stuck with the "deployed"
+ behavior. Try the tests in http://www.ics.uci.edu/~fielding/url/ to
+ see where Lynx still differs from the draft. - FM
+* Tweaks of 'z'ap handling. - FM
+12-24-96
+* Tweaks of DIRED_SUPPORT and make for osf. - FM
+12-23-96
+* Added code to check if the startfile has BOOKMARK_TITLE as its title,
+ and if so, and it's in the bookmark file list, add the bookmark element
+ and reload to have it treated as if it were invoked with -book. - FM
+12-21-96
+* Added code for the DIRED_MENU command ('f' and 'F' by default) to invoke
+ CSwing on VMS if CSWING_PATH is defined, as explained in userdefs.h and
+ lynx.cfg . - FM
+12-20-96
+* More improvements in the fatal error and memory exhaustion handling, and
+ plugging of memory leaks. - FM
+* Changed "newline" to "Newline" in LYMainLoop.c to deal with another
+ reported, ill-advised, macro in the AIX 4.2 curses.h. - FM
+* More tweaks of lynx.cfg. - FM
+12-19-96
+* Improvements in the messaging and cleanups for aborts on fatal errors
+ and exits on memory exhaustion. - FM
+* Worked v2.1 of lpansi.c into the distribution. - FM
+* Modified lynx.cfg to reflect the compilation defaults consistently, and
+ changed the compilation default for SUBSTITUTE_UNDERSCORES to FALSE. - FM
+* Changed the "lines" element to "Lines" in the HText structure and the
+ "tab" structure name to "Tab" to cope with some unwise employee reportedly
+ using all lower case "lines" and "tab" strings as macros in the AIX 4.2
+ curses.h. - FM
+12-17-96
+* Restored use of the -l format in the parent links of local Unix directory
+ listings if LONG_LIST is defined, without the v2.6 bug of creating strange,
+ trailing relative or escaped strings. As far as I can tell from exercising
+ them, the DIRED_SUPPORT and LONG_LIST handling are now fully debugged
+ (famous last words... 8-). - FM
+12-16-96
+* Don't reiterate parent links in local directory listings. They are
+ offered only in the top, up to parent link if NO_PARENT_DIR_REFERENCE
+ is not defined. - FM
+* Moved more HTML.c functions to LYCharUtils.c. - FM
+* Tweak of META handling, which was causing crashes (due to freeing an
+ anchor structure prematurely in the 12-13-96 mods for moving HTML.c
+ code to LYCharUtils.c). - FM
+* Block Unix relative path strings in lynxexec and lynxprog URLs. - DT
+12-14-96
+* Added a COLLAPSE_BR_TAGS compilation and configuration symbol for
+ determining whether Lynx collapses serial BR tags. Note that the
+ valid way to create extra blank lines in HTML is with PRE blocks that
+ contain only newlines. - FM
+* Fixed a longstanding glitch in the alignment handling which could
+ cause a Paragraph's ALIGN value to cross embedded blocks, rather than
+ restoring the appropriate alignment for the outer division or block
+ on close of the embedded block. - FM
+* Modified HR handling so that it inserts the same before and after
+ spacing regardless of whether P end and/or start tags are present
+ before and/or after the HR. - FM
+* Don't insert the bookmark file description and filepath if multiple
+ bookmark file support has been turned off, and this is the default
+ bookmark file (but they will still be inserted if it's not the default,
+ e.g., if it's another bookmark file viewed before the support was
+ turned off, and retrieved as a previous document). - FM
+12-13-96
+* Added parsing of Content-Disposition in META tags and setting the
+ suggested file name if file; filename=name.suffix is in the value
+ of the Content attribute and we don't already have that via a server
+ header. - FM
+* Incorporated almost all globals related to stream parsing and page
+ display in HTML.c and GridText.c into the HTML object structure and
+ HText structure to make the parsing and display functions more nearly
+ re-entrant, and moved several functions from HTML.c to LYCharUtils.c
+ to reduce the size of HTML.c. - FM
+* Added -cckr to the libwww Makefile compiler options for SGI. - Carl
+ Buxbaum (crb@world.std.com)
+* Fixed typo in LYMainLoop.c that affected the 'd'ownload command when
+ DIRED_SUPPORT is enabled. - FM
+12-10-96
+* Implemented Safe header handling and prompting about resubmissions of
+ forms with method POST along the lines described in the 24-Nov-96 IETF
+ ID: http://gewis.win.tue.nl/~koen/draft-holtman-http-safe-01.txt
+ Lynx prompts for confirmation whenever it detects that a resubmission
+ would occur, unless the previous reply included "Safe: yes". Prompts
+ always will occur if the -resubmit_post toggle is on (since resubmission
+ always would occur; not advised). If not toggled on, resubmissions
+ would occur when no_cache is set or the previous reply has been dumped
+ from the cache. When using the PREV_DOC command or History Page, if
+ confirmation is not obtained, Lynx will skip to the yet earlier document,
+ or cancel, as appropriate. - FM
+* Added parsing of the Safe header in HTMIME.c, and added a safe element
+ to the anchor and document structures. Will be FALSE unless a Safe
+ header is received that specifies "YES" or "TRUE" (case-insensitive,
+ only "YES" is in the specs), and applies only to replies from form
+ submissions with the POST method. - FM
+* Cleanup of code in HTAccess.c. May correct problem of crashes for
+ ISINDEX searches on some systems, though I couldn't reproduce that
+ problem here. - FM
+12-09-96
+* Added an HTSetPresentation() for image/x-xbitmap in HTInit.c when DISPLAY
+ is set. - FM
+* Added an LYOutOfMemory boolean that is set by the outofmem() macro, and
+ code in the Unix FatalProblem() and VMS exit handler for reporting the
+ memory exhaustion instead of the misleading "bug" message when they are
+ invoked due to memory exhaustion. May not be reported reliably for
+ linux, because for some reason I don't understand, the SIGBUS trapping
+ is ifdef'ed out for linux in LYMain.c. - FM
+* Fixed typo in the new LYAddVisitedLink() in LYHistory.c of yesterday's
+ mods. - KW
+12-08-96
+* Added a VLINKS command, mapped by default to upper case 'V', and code
+ for creating a list of all links 'V'isited during the current Lynx session
+ in order of recency (most recent highest in the list). Lower case 'v' is
+ still mapped to VIEW_BOOKMARKS. The VLINKS listing is complementary to
+ the History Page listing, and formatted similarly. It excludes POST
+ replies, and bookmark, menu and list files (use the History Page or
+ direct keystroke commands for those). It includes any links that were
+ downloaded, or passed to a helper app (except mailto and newsreply or
+ newsfollowup links, since those require activation in the original
+ document for proper inclusion of it in the email message or news
+ post). You can print the Visited Links Page, or 'd'ownload it via
+ the History Page. - FM
+* Added reporting of the Charset parameter, if present in a server reply
+ header, META tag, or by virtue of a suffix map, to the showinfo ('=')
+ display. - FM
+12-07-96
+* Added 'p'rint menu support for the History Page. - FM
+* Added a content_length element to the anchor structure and use that,
+ if a Content-Length header has been received, to indicate the total
+ bytes in the statusline when receiving the stream. - FM
+* Include HTTP_ACCEPT_LANGUAGE in the lynxcgi environment. - David Trueman
+ (david@cs.dal.ca).
+12-06-96
+* Many more cleanups and commenting of the code for the benefit of new
+ developers. - FM
+* Tweaks of URL parsing and path simplifications. Added simplification
+ of the file://localhost paths from startup and 'g'oto guesses. - FM
+* More anti-crash protections for bad HTML in SELECT blocks. - FM
+* Usability enhancement for DIRED's 'F' menu: list number and names of
+ (some of) the tagged items, and provide a way to untag all items. - KW
+* Force screen refresh after a DIRED system command has failed. - KW
+* Modified HTFile.c to handle relative and "Up to parent" links more
+ effectively. - KW
+* Added KEYGEN to the DTD (but no code to do anything with it yet). - FM
+12-05-96
+* Fixed typo in the for-Unix section of LYAddPathToHome() that was added
+ yesterday in LYUtils.c. - James Troup (J.J.Troup@comp.brad.ac.uk)
+12-04-96
+* Numerous cleanups and commenting of the LYfoo.c and LYfoo.h modules,
+ for the benefit of new Lynx developers. - FM
+* More security-related enhancements and polishing up of the multiple
+ bookmark file support. - FM
+* Increased the sizes of MAXHIST and MAXLINKS, added statusline messages
+ should they ever be exceeded (not likely now 8-), and code for freeing
+ all excess pointers on each page draw instead of letting them grow and
+ freeing them on exit (should help for memory-limited systems 8-). - FM
+* Tweaks of DIRED_SUPPORT. - KW
+12-02-96
+* Show nntp server status messages in group listings when not 221 (normal
+ reply to HEAD request), so the user will know that the articles are
+ not available from the server, rather than a bug in Lynx. - FM
+* Tweaks of BASE resolving. - FM
+* Added "trick" to send hostname guesses to stdout when the startfile or
+ homepage are not URLs, as we send to the statusline for 'g'oto guesses
+ (but don't use stdout if we are not interactive and the desired output
+ is going to stdout). If the DNS lookup stalls, one thus can Control-C
+ out, instead of wondering why Lynx is taking so long to start up. - FM
+* Cleaned up the read_rc() and save_rc() functions in LYrcFile.c. - FM
+* Eliminated all printw() calls to avoid problems with non-ASCII and/or
+ multibyte/CJK characters. - FM
+* Numerous additional bug fixes and enhancements of the multiple bookmark
+ file support. - FM
+* Got rid of the ADVANCED_MULTI_BOOKMARKS symbol now that the choice can
+ be made in the 'o'ptions menu and saved in the .lynxrc file. - FM
+11-30-96
+* Added the ability to set the advanced mode for multiple bookmarks from
+ the options menu and save the defaults in the .lynxrc file - HL
+* Various typo corrections including one which kept LYMainLoop.c from
+ compiling under Unix when DIRED_SUPPORT was defined. - HL
+11-29-96
+* Numerous additional refinements and enhancements of the multiple bookmark
+ support. Added support for REFRESH and PREV_DOC in the options and bookmark
+ menus, and NEXT_PAGE, PREV_PAGE, and ACTIVATE in the bookmark menus or
+ prompts. Expanded the anchor and document structures to keep track of
+ different bookmark files in conjunction with VIEW_BOOKMARK, ADD_BOOKMARK,
+ and DEL_BOOKMARK commands, to restore the proper bookmark files on reloads
+ (overt, or because the cache was dumped for subsequent documents accessed
+ via bookmark links), and in conjunction with security-related restrictions.
+ Multiple bookmark support can be regulated via MULTI_BOOKMARK_SUPPORT,
+ BLOCK_MULTI_BOOKMARKS and ADVANCED_MULTI_BOOKMARKS symbols in userdefs.h
+ (or as SITE_DEFS in the Makefile) and lynx.cfg. The multiple bookmark
+ support can be blocked via a -restrictions=multibook command line switch,
+ which is also set for -anonymous and -validate. Prompting or display of
+ the bookmark file selection menu occurs only if bookmark files in addition
+ to the startup default have been defined (via the B)ookmark command in the
+ 'o'ptions menu, if mu(L)ti bookmarks has been turned on; the setting and
+ definitions can be saved in the .lynxrc file). Plugged memory leaks in
+ the previous implementation of multiple bookmark support. Added code for
+ inserting the current description and filepath for each bookmark file
+ dynamically during rendering. - FM
+* Another tweak of attribute order in HTMLDTD.c. - KW
+11-28-96
+* Tweaked multiple bookmark support to fix an error which was causing a
+ crash on some systems and incorrect behavior on others - HL
+* Tweaked editing of multiple bookmark filenames to correct shifting of
+ screen between multiple pages - HL
+11-26-96
+* Added support for setting the rendering of SELECT OPTIONs as popup menus
+ versus radio button lists via the 'o'ptions menu, and saving the default
+ in the RC file. Changed NO_SELECT_POPUPS to USE_SELECT_POPUPS in lynx.cfg
+ and userdefs.h. The -popup switch still overrides everything. - FM
+* Added multiple bookmark support along the lines of the patch from Filip M.
+ Gieszczykiewicz (filipg@paranoia.com), plus numerous enhancements of the
+ 'o'ptions menu and bookmark handling. - FM
+* Tweaks of attribute orders in HTMLDTD.h and HTMLDTD.c. - KW
+11-25-96
+* Updated the "Lynx Enhanced Pages" links to the new "Lynx links"
+ (http://www.crl.com/~subir/lynx.html) throughout the help, docs,
+ and code. - FM
+11-24-96
+* Modified the ENCTYPE="multipart/form-data" handling to indicate the
+ Content-Type with charset parameter, when known, within each part
+ rather than in the main Content-Type header. - FM
+* Corrected typo in HTNews.c. - FM
+* Added support for setting the suggested filename in 'd'ownload and
+ 'p'rint options based on the Content-Disposition header if it included
+ the string file; filename=name.suffix in its value. Can be used by
+ CGI scripts to set the suggested filename for saves to disk, downloads
+ or mailings of the script's reply body, so it won't be the last symbolic
+ element in the path field of the form's ACTION (which is normally the
+ the script, itself, or a PATH_INFO element, and thus misleading). - FM
+* Tweaks of change_sug_filename() in LYUtils.c for better handling of
+ gzipped files on VMS. - FM
+11-23-96
+* Added reporting of the Server, Date and Last-Modified headers, if present
+ in server replies, to the showinfo ('=') display. - FM
+* Added the ability to store the NO_SELECT_POPUPS in the .lynxrc, but the
+ .lynxrc must be edited manually until the options handling is converted
+ to a form-like interface that accommodates more options. For now, select
+ 'O'ptions and write out the options with '>' to create a block in .lynxrc
+ with an explanation of the switch. The switch is "select_popups" and
+ can have the values of "on", "off", or nothing. If nothing, the default
+ set in userdefs.h or lynx.cfg will persist. Otherwise, "on" will set use
+ of popups and "off" will set use of radio buttons as the default. The
+ startup default always can be toggled via the -popup switch. - HL & FM
+* Corrected a couple of typos in the help files. - HL
+11-22-96
+* Added support for WHEREIS ('/') and 'n'ext searches within SELECT popups.
+ The buffering for 'n'ext is separate from that in the main loop (i.e.,
+ for non-form field document searches), but all previously entered search
+ strings are still combined into a circular buffer and can be accessed via
+ the up-arrow or down-arrow keys at the prompt for a search string. The
+ searches within popup menus do not yield highlighting of the search string,
+ but simply positioning of the cursor on successive options which contain
+ the search string. - FM
+* Added support for all of the navigation commands within SELECT popup
+ windows, including HOME, END, UP_TWO, DOWN_TWO, UP_HALF and DOWN_HALF,
+ in addition to the single line and paging navigation commands. - FM
+* Added support for the REFRESH command within SELECT popup windows. - FM
+* Tweak of hookless snews handling. - FM
+11-21-96
+* Added handling of forms with ENCTYPE="multipart/form-data". Note that
+ we still don't support INPUTs with TYPE="file" or TYPE="range", and
+ thus still set the DISABLED attribute for all fields in the form if
+ either of those two TYPEs are present in it. - FM
+* Tweak of -mime_header handling. - FM
+* Typo fixes of comments in HTML.c. - Albert S Woodhull
+ (aswNS@hamp.hampshire.edu)
+11-20-96
+* Added a NO_SELECT_POPUPS compilation (userdefs.h) and configuration
+ (lynx.cfg) definition, normally set FALSE. If set TRUE, single-choice
+ SELECT blocks (i.e., ones without the MULTIPLE attribute) will be handled
+ as a list of radio buttons instead of via a popup window. Also added a
+ -popup command line switch for toggling the compilation or configuration
+ setting. - FM
+11-18-96
+* Tweak of LYFindEndOfComment() in LYCharUtils.c. - Brian Borowski
+ (brianb@braille.uwo.ca)
+11-17-96
+* Added links to the lynx-dev hypertext archive at FLORA in the online
+ 'h'elp. - FM
+* Tweaks of my_spawn() in LYLocal.c. - KW
+11-16-96
+* Added support for use of the 'd'ownload command on TYPE="submit" and
+ TYPE="image" submit buttons. You still must use the History Page for
+ TYPE="text" INPUT fields that also act as submit buttons by virtue of
+ being the only non-hidden field, because the 'd'ownload command key
+ could be a text entry into the field, and thus must be treated as
+ such. - FM
+11-15-96
+* Mods of HTFormat.c and HTTP.c for better handling of unexpected server
+ disconnects. - FM
+11-13-96
+* Wind down the element stack on EOF if any unclosed tags were received. - FM
+* Fixed typos in the HTMLDTD.c BODYTEXT definitions. - FM
+11-10-96
+* More tweaks of hook-less snews handling. - FM
+* Changed the default STARTFILE to http://lynx.browser.org/ and the default
+ HELPFILE to the v2.6 set at NYU in userdefs.h and lynx.cfg. - FM
+* New function HTUnEscapeSome() in HTParse.c for unescaping selected
+ characters in a string.. - KW
+* Numerous changes to make DIRED_SUPPORT work as intended, to use the
+ library's HTList functions and macros for managing the list of tagged
+ file URLs, and to keep track of proper levels of URL escaping so that
+ unusual filenames which contain #% etc. are handled properly. Can now
+ edit, move, etc. Abc%25252525def.html, #xy#~, etc. - KW
+11-09-96
+* Treat 301 or 302 redirection of a POST as 303 when the Lynx process is
+ non-interactive, rather than rejecting the redirection, since 303 is
+ still most likely what the CGI script actually intends (will still
+ prompt if the process is interactive). - FM
+* Added parsing and trace mode reporting of Content-Disposition headers
+ in HTMIME.c (should be used, someday, to set the suggested file name
+ for disk saves and downloads based on any filename=foo.blah field). - FM
+* Further mods of HTNews.c to facilitate use of Lynx without SSL-hooks
+ in conjunction with an SSL-capable daemon/proxy for snews URLs that
+ returns NNTP streams for Lynx itself to convert into HTML, instead
+ of already converted streams as from a standard proxy. - TZ & FM
+11-08-96
+* Changed information returned by "-version" in LYMain.c to point to
+ lynx.browser.org and added a date to the copyright info. - HL
+11-07-96
+* Mods of HTNews.c to facilitate use of Lynx without SSL-hooks in
+ conjunction with an SSL-capable daemon/proxy for snews URLs. - TZ
+11-05-96
+* Typo fixes in HTMIME.c. - KW
+* Tweak of NSL_FORK mods. - FM
+11-04-96
+* Tweaks of host parsing when a password and/or username is present
+ in override_proxy() of HTAccess.c. - FM
+* Tweaks of the UNDERSCORES and STARS macro setup and usage to avoid
+ possible crashes for FORMs with long values. - FM
+* Worked in Tom Zerucha's (tz@execpc.com) code for fork-based name
+ server lookups that can be 'z'apped. May not yet be portable to
+ all flavors of Unix. Add -DNSL_FORK to your SITE_LYDEFS to try
+ it. - FM
+11-02-96
+* Fixed typo in HTAlert.h. - FM
+* Cleaned up HTTCP.c code, simplified some of its spaghetti
+ ifdef'ing, and worked in mods to bypass connection confirmations
+ when Lynx is SOCKSified and the socks_flag is set. - FM
+* Added recognition and acceptance of text/x-sgml and text/sgml
+ MIME types (all that I've encountered thus far work fine with
+ Lynx, though it doesn't yet interpret marked sections). - FM
+* Added socket function prototypes for MultiNet in tcp.h. - FM
+* Mods to facilitate application of the SSL patches (after some
+ corrections in the patches to keep HTLoadHTTP re-entrant, make
+ CONNECT work as intended again, and eliminate memory leaks in
+ the SSLeay adaption) - FM
+* Adding info about -DNO_TTYTYPE in top level Makefile. - FM
+* Use clrtoeol() in LYOptions.c to ensure that no terminals which use
+ reverse video for standout() will have trailing reverse fields on
+ edits of option values. - DK
+* Offer user@host instead of WebMaster@host for the 'c'omment command
+ if the path for the URL begins with a tilde and there is no
+ LINK REV="made" present. - FM
+* Tweaks of inews Makefile and clientlib.c. - Christopher R. Maden
+ (crm@ebt.com)
+* Check nhist before attempting a DIRED_SUPPORT directory listing in
+ LYShowInfo.c. - KW
+10-21-96
+* Offer WebMaster@host for the 'c'omment command if no LINK REV="made"
+ was present in a text/html document, and save a known owner URL when
+ toggling to source ('\') so that the 'c'omment command can still be
+ used with that owner's (mailto or homepage) URL, but the source can
+ be included in the comment, as would be desirable (instead of a bad
+ rendering) when sending a comment about bad HTML in the document. - FM
+10-20-96
+* Added code for traversing the pseudo-documents created for client-side
+ image MAPs. See the updated CRAWL.announce for more information. - FM
+10-19-96
+* Added definitions in LYCurses.h relating curses function calls to slang
+ functions or emulations for compatibility with new versions of slang,
+ based on patch from John E. Davis (davis@space.mit.edu). - FM
+* Added unescaping of the full address fields in mailto URLs or ACTIONs,
+ and improved the reliability of the parsing of the subject header from
+ the ?searchpart Netscapism when present. - FM
+* Give user option to use 303-like conversion of POST to GET in confirmation
+ requests for redirection of POSTs, base on patches from Drazen Kacar
+ (dave@fly.cc.fer.hr). - FM
+* Tweaks of POST content submissions in HTTP.c, based on patch from
+ KW. - FM
+* Fixed EOF checks in HTAAFile.c, HTGroup.c and HTPasswd.c, and improved
+ host address parsing in HTTCP.c, based on patches from Larry Schwimmer
+ (schwim@cyclone.stanford.edu) and Klaus Weide (kweide@tezcat.com). - FM
+* Added targets for umaxv and umaxv-slang for Encore's UMAXV - Thanh Ma
+ (tma@encore.com)
+10-16-96
+* Send the rendering of decompressed files to stdout with -dump, don't
+ spawn a viewer under any circumstances if -dump was used instead of
+ -source for Content-Types that are not text/html, and remove the
+ temporary decompressed files before exiting with -dump or -source. - FM
+* Properly handle TYPE="radio" versus TYPE="checkbox" INPUTs with NULL
+ or zero-length VALUEs. - FM
+* Added a continuation line token for the netbsd-ncurses target - HL
+* Fixed a typo in HTMIME.c in the trace output - HL
+* Block predictable buffer overrun in GridText.c if a page has more
+ than MAXLINKS links in it. - FM
+10-01-96
+* Add a Mime-Version header to the other headers in LYPrint.c so that the
+ 09-20-96 mods for mailing source do what they were intended to do. :) -
+ Hamish MacEwan (macewanh@diatp.dia.govt.nz)
+09-20-96
+* Add a BASE tag to the tops of HTML source files, a la Netscape, when
+ mailing or downloading, and don't worry, for now, if that creates
+ technically invalid HTML (since Lynx copes with it as of the 09-15-96
+ mods 8-). - FM
+* Include Content-Type, Content-Location and Content-Base headers when
+ mailing HTML source on Unix. - FM
+* Use .txt versus .html suffixes when submitting rendered versus HTML source
+ temporary files to VMS MAIL, so that transports such as PMDF will indicate
+ the appropriate Content-Type. - FM
+09-17-96
+* Handle illegally positioned BASE tags. - FM
+* Tweak of Q nesting level checks. - Pawel Wiecek
+ (coven@i17linuxb.ists.pwr.wroc.pl)
+* Fixed typo in HTMIME.c for parsing of Pragma header. - Wilson Cheung
+ (wcheung@netcom.com)
+* Added parsing of Set-Cookie header in HTMIME.c (see IETF ID
+ http://www.ics.uci.edu/pub/ietf/http/draft-ietf-http-state-mgmt-03.txt
+ for info on how to implement it's use). - FM
+* Fixed typo in LYMainLoop.c for display of error message when up arrow is
+ pressed at the top of a document. - Hiram Lester, Jr. (hwlester@pobox.com)
+09-16-96
+* Use standard ls -l parsing of LIST output for Windows_NT ftp servers in
+ Lynx v2.6 as in v2.5. - FM
+
+--- Rename of Lynx2-5FM and release as Lynx2-6 (02-Sep-1996) ---
+ (see CHANGES2-6, CHANGES2-5, CHANGES2-4 and CHANGES2-3)
+==============================================================================
diff --git a/docs/CHANGES2.8 b/docs/CHANGES2.8
new file mode 100644
index 0000000..030062d
--- /dev/null
+++ b/docs/CHANGES2.8
@@ -0,0 +1,3399 @@
+=======================================================================
+--- Release of Lynx v2.8 (March 10, 1998) ---
+=======================================================================
+
+1998-03-10
+* omit platform-specifics about release (recommended by HN). - TD
+* drop samples/lynx.cfg since it is redundant (recommended by HN). - TD
+* modify makefile.in so that "make install-cfg" does not edit lynx.cfg
+ to point at local helpfiles, while "make install-help" will now do
+ that (reported by LP). - TD
+1998-03-07
+* move ifdef's for EXP_8BIT_TOUPPER inside UPPER8 function to allow
+ check for DOS/WINDOWS display charsets. - LP
+1998-03-06
+* clarify relationship between the configure script and userdefs.h with
+ respect to the LYNX_CFG_FILE definition. - TD
+* newer CF_FIND_LIBRARY autoconf macro, to allow ncurses library in /lib
+ only, needed for SUSE Linux. - TD
+* add casts to UPPER8 function's comparison for equality of parameters, and
+ to TOUPPER macro to guard against sign-extension due to prototype. - AAC
+* correct spelling of -lcur_colr library in aclocal.m4, change order of
+ tests to put -lHcurses second on HP-UX (patch by Jonathan Sergent).
+* restore simple zmodem downloader script, displaced by recent undocumented
+ change (there are some concerns about security or permissions with the
+ alternate script). - DK
+* DOSPATH localfile patch: corrected display of file://localhost/c:/,
+ which was displayed as file://localhost/c%3A/ (tweak LYConvertToUrl() in
+ LYUtils.c). Now we may start "lynx c:" or 'go' c: and not see these
+ strange letters. On the other hand, if % and # symbols found in local
+ path it will be escaped as before (note that #fragment is not supposed here
+ to be used from command line...) - LP
+* workaround error in vendor's terminfo description of 'dtterm' by ensuring
+ we limit color pair-number accordingly. - TD
+1998-03-04
+* strip -g compiler option if not otherwise specified, for debugging (note
+ that autoconf 2.12 does not try to use -O option due to concerns about
+ compiler optimization). - TD
+* correct value of $host_os used in CF_CURSES_LIBS for special-case of
+ HP's -lHcurses (Jonathan Sergent <sergent@ecn.purdue.edu>).
+* correct def7_uni.tbl for Greek letters, note about UPPER8 assumption
+ added to chrtrans/README.format. - LP
+* few comments corrected. - LP
+1998-02-28
+* create new PRCS revision (2.8pre) for pre-release testing of Lynx 2.8 -TD
+* remove RELEASE_STATEMENT, merging it into README as per HN's
+ recommendation - TD
+* comments/minor changes to HTDOS.c, HTDOS.h, LYUtils.c - LP
+* document recent fix for RAW_DOS_KEY_HACK in lynx.cfg - DK
+* rename CHANGES.new to docs/CHANGES2.8 - TD
+* undo last minor change to UPPER8 - LP
+1998-02-27
+* add RELEASE_STATEMENT file. - TD
+* modify slang configuration to add fake 'scrollok()' - JED
+* modify LYmktime() so that 2-digit years must be greater/equal to 70 to be in
+ 1900's (patch by Bela Lubkin). Also adjust parse_windows_nt_dir_entry() and
+ parse_cms_dir_entry() as noted by Bela - TD
+* comment-out entries in cp1252_uni.tbl which correspond to nonprinting
+ control-characters - LP
+* add logic in SGML.c to correspond with 2.7.2 logic for codes used by
+ Microsoft FrontPage. - LP
+* remove unneeded code for nbsp, ensp, emsp, thinsp and shy from handle_entity()
+ in SGML.c - LP
+* ifdef UPPER8 function with EXP_8BIT_TOUPPER,
+ add configure option --enable-8bit-toupper to allow testing. - TD
+* case-insensitive search and 8bit letters: It was realized that
+ information about upper/lower mapping got from TOUPPER which depends on
+ locale in its 8bit and usually fails on non-UNIX systems. We introduce
+ UPPER8 and strcasecomp8 to implement 8-bit aware case-independent search
+ using one simple assumption: 8bit upper/lower case letters have their
+ "7bit approximation" images in def7_uni.tbl matched case-insensitively
+ (7bit). The cost of this assumption is that several differently accented
+ letters may be interpreted as equal but this is negligible if the search
+ string is more than one character long. (LYStrings.c, also HTString.c
+ and LYMainLoop.c). - LP, TD
+* add SunOS 4.x-specific ifdef to quiet redefinition warnings for sys/ioctl.h
+ vs sys/termios.h - TD
+* convert usage/options messages into arrays to simplify maintenance. - TD
+* add "-useragent" command-line option to set "User-Agent" (request by Merlin
+ Mathesius <merlin_mathesius@swissbank.com>). - LP
+* tweak HTML in LYDownload.c, LYPrint.c to restore some double-spacing effects
+ altered in 'collapsible spaces' change 1998-01-25 (reported by James Elkinton
+ <zio@blueneptune.com>). - LP
+* use strncasecomp/strcasecomp consistently throughout to avoid library
+ dependency on strncasecmp/strcasecmp. - TD
+* correct lengths in several strncasecmp calls for command-line options
+ (though -w is still an abbreviation for -width). - TD
+* test-build with BSD curses on OS/2 EMX (does not display properly), and
+ with ncurses -TD
+* add configure check CF_FUNC_LSTAT -TD
+* modify CF_CHECK_ERRNO so that configure script on OS/2 EMX finds
+ sys_errlist[] -TD
+* reset styles[] and styleSheet list in DefaultStyle.c, HTML.c so that when
+ a user reloads a page with ^R, we undo changes to those data structures
+ (reported by Larry Virden). - TD
+* remove extra copy of HTML.h from Implementation directory. - TD
+* add CF_GCC_ATTRIBUTES to configure script, to use in flushing out unused
+ parameter warnings (and later, to support prototypes for logging). - TD
+* rename 'extra_entities' to 'unicode_entities' (recommended by LP) - TD
+* add configure option --use-default-colors, to allow background color to use
+ default value (request by SUNAGAWA Keiki <Keiki_Sunagawa@yokogawa.co.jp>) -TD
+* change default for --disable-internal-links so it is normally-off - TD
+1998-02-19
+* add configure test CF_FIONBIO, some ifdef's (e.g., S_IFLNK) to support
+ build on OS/2 EMX. - TD
+* add configure option --disable-extended-dtd, for testing - TD
+* split-out entities.h from HTMLDTD.c - TD
+* remove obsolete mapping in "private" e000 area of mnem_suni.tbl,
+ mnem2_suni.tbl, rfc_suni.tbl - LP
+* remove unused function HTMLGetLatinOneValue() - LP
+* remove logic that would attempt lookup of Unicode entities by index into the
+ unicode_entities.put_entity method (e.g., of HTML_dtd), in HTML.c
+ (HTML_put_entity) and HTMLGen.c (HTMLGen_put_entity) - LP
+* tweaks to HTPlain.c, LYCharUtils.c and SGML.c, remove extra checks for
+ Unicode mdash, ndash, trade, as well as "iso-8859-2", "koi8-r", since they
+ are done in the chartrans tables - LP
+* add an alias 'H' for F1 when using RAWDOSKEYHACK (LYStrings.c) - DK
+* restore -DRAWDOSKEYHACK to src/makefile.dos, reported by DK - TD
+* correct a typo in CF_CURSES_LIBS configure macro, which caused the configure
+ script to not add termcap library to the list - TD
+* correct --disable-internal-links, by adding DONT_TRACK_INTERNAL_LINKS to
+ config.hin - TD
+1998-02-13
+* use size_t in SGML_dtd. - TD
+* remove extra trademark symbol and quotes from chrtrans/*.tbl, since
+ they are in the default def7_uni.tbl - LP
+* New item to lynx.cfg added: PREPEND_CHARSET_TO_SOURCE (similar to BASE), we
+ need it to resolve charset for downloaded/printed HTML sources which became
+ local. This is really useful because downloaded and printed texts may
+ happened to have different charsets so assume_local_charset fails. For
+ downloaded source meta charset added from HTTP charset header (if and only if
+ present). For printed source meta charset added from display_charset (real
+ charset after chrtrans). If the original source has its own meta charset
+ and we add the second on top - Lynx currently use those on top and ignore
+ others (old) value (that is correct, although non standard like BASE on top).
+ The compilation default is FALSE (compatibility). - LP
+* modify ncurses mouse behavior to match slang (use button 3 rather than
+ button 2 for "previous document" (reported by Michael Ritzert) - TD
+* use case-independent comparison for tail-only comparison in override_proxy
+ (patch by pg@sweng.stortek.com) - TD
+* remove unneeded definitions of ALT_CHAR_SET, NCURSES_VERSION in
+ src/makefile.dos - DK
+* correct syntax for the RAW_DOS_KEY_HACK in lynx.cfg, add a little information
+ on how to compile this. Also patched makefile.dos to make compilation of the
+ raw dos key hack the default when compiling in DOS. - DK
+* change back to boolean since the logic was unused: UCCanTranslateFromTo(),
+ UCCanTranslateUniTo(), and UCCanUniTranslateFrom(). - TD
+* Mods of SGML.c and LYCharUtils.c to improve handling of entities,
+ obsolete stuff removed (not all yet). - LP
+* -localhost mode: disable interpreting BASE HREF= if local_host_only
+ to resolve local html files with BASE (Lynx add base to downloaded
+ sources and this may affect links if looking them with -localhost).
+ (tweak in html.c). - LP
+* Modify HTMLGetEntityUCValue in LYCharSets.c:
+ we begin to move from old style entities[] to unicode-based. - LP
+* added a few comments. - LP
+1998-02-07
+* Fixed a bug in HTTP.c which could cause trashing of authorization info
+ for an origin HTTP(s) server if the request is being proxied. - FM
+* Tweak in HTTP.c so that the reloading variable is not reset until
+ after any resubmissions due to authorization challenges. - FM
+* Tweaks of userdefs.h, lynx.cfg, LYMessages_en.h, LYMain.c, LYMainLoop.c,
+ LYClean.c, LYReadCFG.c, and LYGlobalDefs.h so that the QUIT_DEFAULT_YES
+ compilation symbol can be overridden in lynx.cfg, in keeping with
+ the principle that only strict security-related compilation symbols
+ cannot be overridden at run time. - FM
+1998-02-05
+* adjust formatting, comments & some messages in WWW files to simplify
+ comparison with 2.7.2 version. (I have preserved some chunks of difference,
+ ifdef'd NOTUSED_FOTEMODS or NOTDEFINED for ease of comparison -- these may be
+ removed at a later time, when we are done absorbing changes from 2.7.2) - TD
+* Update SGML entity to Unicode table in HTMLDTD.c from ftp.unicode.org -
+ lots of new entities, iso-latin-1 now included there.
+ See also new files in test/ directory: sgml.html and unicode.html.
+ Tweak a few typos in test/*.html according to sgml.html.
+ Add a few new entries in def7_uni.tbl according to sgml.html - LP
+* Cleanup iso01-iso09, cp866 tables against ones found at ftp.unicode.org -LP
+* Strip the fat from LYCharSets.c - unnecessary obsoleted tables removed
+ and redirected to SevenBitApproximation table (ones which have unicode tables
+ override it anyway, those for CJK had exactly the same tables as
+ SevenBit..). - LP
+* Remove obsolete "Other ISO Latin" charset, which works _exactly_ the same
+ as "7 bit approximation" (See the note on 06-14-96 where it comes from) -LP
+* Sort the list of charsets in Options according to 2.7.2 for 1997-10-15,
+ see the comments in UCinit at the bottom of UCDomap.c - LP
+* add ifdef to HTFile.c to workaround conflicting S_IFIFO vs S_IFSOCK
+ (e.g., on Apollo, from a report by Dave Eaton <dwe@arde.com>) - TD
+* updated INSTALLATION (patch by HN) - TD
+* modify DOS handling of CTL-C and CTL-BREAK handling for DOS to allow
+ exiting via SIGINT when pressing CTL-C or CTL-BREAK regardless of the
+ BREAK setting in DOS. This leaves the BREAK setting unchanged unless
+ CTL-C or CTL-BREAK is actually pressed (in which case it leaves BREAK
+ ON) - DK
+* add note about Lynx vs frames to User's Guide (from Al Gilman) - TD
+1998-01-27
+* correct lynx.man to reference section "1" (one), not "l", since it is
+ not installed in the latter (reported by Jason Castonguay
+ <jcast@ntplx.net>) - TD
+* fix for VMS declarations of mainloop() and from_hex() (reported by FM) - TD
+* add to include-paths in libmake.com, build.com (reported by FM, citing
+ Brian Tillman) - TD
+* revert HTML.c to use LYHandleSELECT() - TD
+* align cases for function keys in LYStrings.c with 2.7.2 - TD
+* remove EXP_CHARTRANS ifdef's - TD
+* remove symbol USE_SIZECHANGEHACK -TD
+* adjust formatting, comments & some messages in most remaining ./src files to
+ simplify comparison with 2.7.2 version. - TD
+1998-01-25
+* Changed the utf-8 Display Character Set string to "UNICODE UTF-8"
+ (i.e., added the hyphen between UTF and 8), and fixed typos in
+ the comments about iso-8859-5. -LP, FM
+* Modified HTML.c to add collapsible spaces before and after IMG ALT
+ strings or pseudo-ALTs whether or not the IMG element is within
+ Anchor content. The occasional absence of such spaces due to poor
+ HTML was problematic for blind users. Note that markup which uses
+ an image for a fancy letter with the ASCII letter as an ALT will
+ have that letter separated from the rest of the word. Also note
+ that these spaces will not be collapsed in PRE blocks, but IMG is
+ invalid in PRE blocks. The spaces could be omitted when IMG is
+ used invalidly in PRE blocks, but that would revive the problem
+ for blind users that they might not be present at all, so it seems
+ better to suffer extra spaces in such cases. - FM
+1998-01-24
+* Tweak in HTAccess.c to reset the title element in anchors on forced
+ reloads. - FM
+1998-01-22
+* Tweaks in HTML.c to prevent collapsing of blank lines within TEXTAREA
+ default values. Note that we still strip any leading or trailing
+ blank lines (reported by Edward S. Marshall <emarshal@xnet.com>). - FM
+* Tweaks of LYCurses.c, LYMain.c, LYOptions.c, LYReadCFG.c, LYUtils.c
+ and LYAuto.c to ensure properly setting, with internal buffering, and
+ avoid memory leaks for the display and homedir values (reported by
+ pg@sweng.stortek.com). - FM
+* include userdefs.h in LYCurses.h to address redefinition warnings for
+ curses-related configuration. - TD
+* adjust formatting, comments & some messages in recently-modified files to
+ simplify comparison with 2.7.2 version. - TD
+* remove obsolete logic from UCCanTranslateFromTo, (recommended by LP). - TD
+* make character set names (e.g., cp437, cp850, next) consistent in lynx.cfg,
+ userdefs.h (reported by LP). - TD
+* change configure script to check for termcap library before curses, in case
+ it is dependent. - TD
+* More corrections in the Russian Cyrillic area of def7_uni.tbl. - LP
+1998-01-17
+* correct logic for no_color_video by ensuring that if not defined, it
+ doesn't disable underline with color. - TD
+* remove NSL_CLONE - didn't build. - TD
+1998-01-16
+* eliminate gcc "shadowed variable", "nested declaration", "no previous
+ prototype" warnings. - TD
+* add --disable-internal-links configure option. - TD
+* remove W3C gateway (patch by DK, based on email from Gerald Oskoboiny
+ <gerald@w3.org>). - TD
+* documentation updates (patch by JS). - TD
+* add CONTENT_TYPE to environment of lynxcgi POST documents (reported by
+ Ty Sarna <tsarna@endicor.com> & FM). - TD
+* add NSL_CLONE ifdef that enables use of the Linux clone() call instead of
+ fork() for the gethostbyname() calls in HTTCP.c. (patch by Ryan Nielsen
+ <ran@haxor.com>). - TD
+from the lynx code. I think the following patch does this.
+1998-01-15
+* Tweak of the NSL_FORK code in HTTCP.c to prevent zombie processes from
+ being created when gethostbyname() is interrupted. - RN
+* Corrected the Russian Cyrillic area of the def7_uni.tbl Unicode to
+ 7-bit approximations conversion table. - LP
+* Mods of UCAux.c, LYCharUtils.c, SGML.c and HTPlain.c to use 7-bit
+ approximations instead of 8th bit stripping when the document charset
+ is koi8-r and the Display Character Set does not have the corresponding
+ characters. - FM
+* Tweaks in HTML.c to ignore a newline character immediately following
+ a PRE start tag more consistently. When PRE blocks are used to create
+ blank lines, you should get only as many as are actually included in
+ the PRE block, unless you include less than the number specified for
+ "before" the block to which you return, in which case you'll get the
+ latter number of blank lines. - FM
+1998-01-13
+* Fixed a typo in the HTParse() code of HTParse.c for checking whether
+ a colon in the host field indeed delimits a port number. - FM
+* Changed the internal MIME names for all Microsoft Windows codepages
+ from cp#### to windows-####, since the latter is used more commonly
+ as the charset value in META elements and/or Content-Type headers,
+ and most of them have been registered that way with IANA. Note,
+ however, that Microsoft uses cp instead of windows- prefixes in the
+ charset names for the Unicode conversion tables submitted to the
+ Unicode Consortium. Also note that we still treat cp, cp-, and ibm
+ prefixes as synonyms for the windows- prefix. - FM
+1998-01-06
+* work around for 'keypad()' function w/o corresponding key defines
+ (reported by Francisco A. Tomei Torres for NeXTstep 4.0). - TD
+* quote message in install rule, just in case (from HN). - TD
+* correct expression to supply default value of .cfg file's pathname
+ (reported by LE & Ambrose Li <acli@acli.interlog.com>). - TD
+* correct dependency of .cfg files upon $(libdir) in makefile.in - TD
+1998-01-04
+* correct temporary filename for -traversal -crawl (patch by Doug Kaufman). - TD
+* correct redefinition of SYSTEM_MAIL_FLAGS. (reported by Doug Kaufman). - TD
+* uncache current document when character set may have changed (patch
+ by Andrey A. Chernov) - TD
+* modify Linux setfont code to restore the original font on exit - TD
+* correct missing backslash (again) in makefile.in
+ (reported by Mark Mentovai - again) - TD
+1998-01-02
+* workaround for sed expression when rerunning configure with config.cache
+ for slang libraries (reported by Hynek Med). - TD
+* fix indicated by Laura Eaves (LE) for LYUCFullyTranslateString_1() - TD
+* modify SPAWNING_MSG for DOSPATH configuration, avoid unnecessary use
+ of clear-screen in shell (patch by Doug Kaufman). - TD
+* remove install-help from list for install rule, adding message to
+ indicate how to install it. - TD
+* install lynx.lss only if color-style is configured. - TD
+* correct filemode for DJGPP when processing config-file, patch by
+ Doug Kaufman). - TD
+* add LYNX_LSS_FILE to config.hin, reported by Ambrose Li
+ <acli@acli.interlog.com>. - TD
+* new copy of INSTALLATION file from HN. - TD
+* add COPY* to install rule. - TD
+* simplify includes in UCdomap.c by using include-path in makefiles. - TD
+* build configure script with patched autoconf to workaround limited
+ environment space on CLIX 3.1 - TD
+* rename mnemonic_suni.tbl to mnem2_suni.tbl to accommodate 'make' on
+ older system with 14-character name-limit. - TD
+* sorted some lists (e.g., character sets) which were unreadable. - TD
+* incorporate most of FM's changes from 971124 to 971230 (see below). - TD
+ (Note: don't try to use fflush(stdin) -- it's an FAQ -- nonstandard,
+ dumps core on some platforms).
+1997-12-30
+* Added Unicode translation support for "DosBaltRim (cp775)" and
+ "WinBaltRim (cp1257)". - FM
+1997-12-29
+* Fixed bug in the order of re-initializations for the 1997-12-22
+ get_connection() mods. - FM
+* Fixed typos in some LYCharUtils.c comment. - FM
+* Fixed typo in LYrcFile.c comments concerning the NO_FROM_HEADER
+ symbol. - DK
+1997-12-24
+* resolve conflict between autoconf $INSTALL and lynx's INSTALL_PATH
+ (reported by Scott McGee). - TD
+* modify CF_CHECK_FUNCDECL to work with non-gcc compilers. - TD
+* add <stdio.h> to prototype test for getgrgid getgrnam, needed on SVr3. - TD
+* add install-lss to makefile.in. - TD
+* modify order of includes in LYKeymap.c so that USE_EXTERNALS is defined
+ if it comes from userdefs.h (inferred from a report by Larry Virden). - TD
+* correct spelling of USE_EXTERNALS which prevented --enable-externs from
+ working. - TD
+* move assignment to stderr from VMSexit to cleanup function (reported
+ by Brian Tillman & FM). - TD
+* modify UCChangeTerminalCodepage() to not use stderr, disentangling it
+ from stderr/logfile hack. - TD
+* rename docs/CHANGES2-* files to docs/CHANGES2.* (reported by
+ Doug Kaufman). - TD
+* add start_color() call to DOSPATH version of start_curses() to
+ fix problem reported by Doug Kaufman - TD
+* correct typo in ColorCode() function (reported by Doug Kaufman) - TD
+* modify comments in makefile.in (patch by HN) - TD
+* minor fixes for CF_CHECK_ERRNO, CF_SIZECHANGE, CF_SLANG_CPPFLAGS
+ macros. - TD
+* add configure option --enable-nsl-fork to turn on code defined by
+ NSL_FORK. - TD
+* add configure option --enable-links to turn on code defined by
+ UNDERLINE_LINKS. - TD
+* add configure option --enable-font-switch, to turn on code defined by
+ EXP_CHARTRANS_AUTOSWITCH. - TD
+* modify configure CF_CURSES_LIBS test to look also for ncurses,
+ since some systems do not have a "curses" library (reported by
+ Michael Ritzert). - TD
+1997-12-22
+* Reworked -width=NUMBER command line switch for specifying the screen
+ width for formatting of dumps (default is 80; forced wraps occur at one
+ column less than the screen width, i.e., at 79 by default). - FM
+* Tweak of get_connection() in HTFTP.c to re-initialize the elements of
+ the connection structure when using a previously allocated connection
+ object. -DW, FM
+* Mods of LYexit.c, LYClean.c, LYMain.c and LYMainLoop.c to fflush() all
+ standard file descriptors in conjunction with all fopen() and fclose()
+ operations on the TRACE log and redirections of stderr via equality
+ statements (see 1997-12-16, 1997-12-13 and 1997-07-18 mods). - FM
+1997-12-18
+* forgotten last } UN-inserted (John Line) - WB
+* few commented messages corrected according to RFC2068 (HTTP1.1)
+ (Leonid Pauzner) - WB
+1997-12-17
+* Changed all %i tokens to %d or %ld in functions that always get decimal
+ values in their arguments. - FM
+1997-12-17 (all patches by Leonid Pauzner)
+* open text mode while writing lynx.rc and bookmarks files
+ LYrcFile.c and LYBookmark.c (forgotten last } inserted). - WB
+* add a comment about binary mode in LYMain.c and pile them
+ in one ifdef - WB
+* few misprinted characters (in comments) corrected in
+ \chrtrans\cp850_uni.tbl - WB
+1997-12-16
+* Further mods in LYClean.c (see 1997-12-13 mods) do block the
+ *stderr = LYOrigStderr; statement in cleanup() for VMS with VAXC. - FM
+* Added an ELGOTO keystroke command, mapped by default to upper case 'E'
+ (lower case 'e' still invokes the editor for the current document, if
+ it is a local file), for passing the URL (or ACTION) of the current
+ link to the line editor for editing as a goto URL. Works like the
+ ECGOTO ('G') keystroke command for editing the URL of the current
+ document as a goto URL, i.e., if the URL is not modified, is set to
+ a zero-length string, or ^G is entered, the command is cancelled. - FM
+* Mods of LYMainLoop.c to disallow ECGOTO or ELGOTO commands for File
+ Management (DIRED_SUPPORT) menu URLs. - FM
+1997-12-15
+* Added reporting of the Discard value (YES or NO), in the Cookie Jar Page
+ (note that until we have code for storing cookies beyond the current
+ session, Lynx behaves as if Discard were set, whether or not it was set
+ by the server, but we still report the server's instructions, as we do
+ for the Maximum Gobble Date). - FM
+1997-12-14
+* added a lynx.cfg switch to turn on/off extended dos translations for keys.
+ -WB
+* added minor DOS tweaks by Doug Kaufman and myself. - WB
+* fixed windows binary mode piping. - WB
+1997-12-13
+* Tweaks in LYList.c to make the link numbers correspond with those in
+ the current document when LINKS_AND_FORM_FIELDS_ARE_NUMBERED in on,
+ and to show the current document's URL in the display. - FM
+* Mods in HTTP.c to show the body of a 305 return status instead of ever
+ acting on it. A number of security/privacy problems with this status
+ are being discussed in the HTTP-WG, and it's likely to be dropped or
+ deprecated in the next revision of the HTTP/1.1 specs. - FM
+* Restored the v2.7.1 HTmmdecode() that's specific for iso-2022-jp in
+ HTMIME.c. We still only call it when HTCJK == JAPANESE, and the
+ generalized version reportedly has problems. - FM
+* Removed the *stderr = LYOrigStderr; statement from VMSexit() in LYCurses.c
+ and added it to the if() claused section which closes the TRACE log file,
+ if opened, in cleanup() of LYClean.c. This is just a stab in the dark
+ for dealing with reported problems on exit with VAXC on VAXen. We may
+ need to use freopen() for redirecting TRACE messages to a file for VAXC
+ or VAXen (there's no apparent problem with the current code with DECC
+ on VMS/AXP). - FM
+* Added more function key cases to the keypad() mode switch() in LYgetch()
+ of LYStrings.c. We don't need them with this code set, but they may as
+ well be there for completeness. - FM
+* check for and use ncurses default-color extension, use to make the
+ color-style configuration usable on xterm with white background. - TD
+* add cases in LYgetch() for remaining VT220-compatible codes, reported
+ by Michael Ritzert and FM. - TD
+* add configure test to see if slang can be linked without curses or
+ termcap libraries, request by John Davis. - TD
+* set umask in mkdirs.sh script to work around users who have set root's
+ umask to 077. - TD
+* split up install rule to install-bin, install-cfg, install-man and
+ install-help. - TD
+* suppress suffixes in top-level makefile so 'make' won't try to create
+ a file named "install" from install.sh - TD
+* make $(CPPFLAGS) inherit consistently from top-level makefile. - TD
+ (reported by Mark Mentovai)
+* add configure option --enable-externs, to turn on USE_EXTERNS. - TD
+* use explicit comparison for enum values, fix compile problem with VAX C
+ for UCAux functions (reported by Brian Tillman). - TD
+1997-12-03
+* Remove CHANGES.configure, since it is redundant. - TD
+* Make -g3 option check for OSF/1 3.2 consistent with -Olimit check. - TD
+* Use 'result' rather than 'time' in mktime.c to avoid shadowing. - TD
+* Use wborder only if configure finds it, not ifdef FANCY_CURSES. - PHDM
+* List of systems having strerror replaced by configure test. - PHDM
+* Beautifying of mktime.c (`now' was misleading). - PHDM
+1997-12-02
+* Mods in LYCookie.c to prompt whether to accept (or reject) cookies with
+ an invalid domain value which yields a hostname prefix with a dot (as
+ specified in section 4.3.2 of the IETF cookie drafts and RFC), rather
+ than rejecting it silently. Note that it is rejected in non-interactive
+ (-dump or -source) mode, because the user can't be prompted. - FM
+1997-11-27
+* Added a PREPEND_BASE_TO_SOURCE configuration symbol in lynx.cfg which
+ can be set FALSE to suppress prepending of a Request URL comment and
+ BASE element to text/html sources retrieved for 'd'ownloading or passed
+ to 'p'rint functions. Note that this prepending is not done for -source
+ dumps unless the -base switch also was included on the command line, and
+ the latter switch overrides the setting of the PREPEND_BASE_TO_SOURCE
+ configuration variable. - FM
+1997-11-25
+* Mods in LYMail.c and LYPrint.c to handle to=address(es), cc=address(es),
+ subject=string, keywords=word_list, and body=message fields in the
+ ?searchpart of mailto URLs as specified in the 1997-11-16 draft:
+ ftp://ftp.isi.edu/internet-drafts/draft-hoffman-mailto-url-03.txt
+ The cc=address(es) values are now handled as a Cc: header, and a self
+ copy, if confirmed on prompt, is added to the Cc: header. Note that
+ the draft now allows mailto:?to=address(es)[&foo=blah] as a format,
+ i.e., without an address before the ?searchpart. The Netscape
+ ?searchpart tack-on broke all pre-existing implementations of mailto,
+ and this breaks Lynx's support through v2.7.1. Though it's now
+ supported in this code set, don't use it. Complaints and formal
+ requests to provide this functionality via a new scheme (e.g.,
+ mail: or smtp:) without breaking existing implementation of mailto:,
+ including from TimBL (HimSelf :), thus far have fallen on deaf ears.
+ You can send email to those deaf ears via:
+ mailto:masinter@parc.xerox.com%20(Larry%20Masinter)
+ Don't allow the IETF backward compatibility principle to go down
+ the drain. - FM
+* Mods to support use of the PMDF SEND command on VMS in conjunction with
+ a temporary header file, so that all headers specified in the ?searchpart
+ of mailto URLs can be included in the mailing, and made that the compilation
+ default in userdefs.h to go with the default MAIL_ADRS mask for PMDF (If
+ the "generic" VMS MAIL utility is used, not all of the headers can be
+ specified on the command line, as it requires). Look at the code in
+ LYMail.c and LYPrint.c that is used when isPMDF is TRUE as a model of how
+ to do this with other header-file-capable VMS mailers (but I don't have
+ any besides PMDF, and can't do it for you :). - FM
+* Tweak of the 1997-11-17 URL parsing mods so that relative symbolic
+ elements immediately preceding a ?searchpart are handled identically
+ to when a ?searchpart is not present. - FM
+* Added support for setting both SYSTEM_MAIL and SYSTEM_MAIL_FLAGS in
+ both userdefs.h and lynx.cfg. - FM
+1997-11-23
+* integrate PHDM's patch. - TD
+* Check for existence of sys/wait.h. - PHDM
+* Do not include sys/stat.h twice. - PHDM
+* New autoconf-macros to check if a function is declared after including a
+ specific set of files. - PHDM
+* Declare strstr if it is not declared by string.h. - PHDM
+* Declare getgrgid and getgrnam if not declared by grp.h. - PHDM
+* Provide strstr and mktime implementations, and use them if needed. - PHDM
+* Always include sys/types.h in HTUtils.h. - PHDM
+* define NO_GROUPS if we do not have getgroups. - PHDM
+* define NEED_REMOVE also if test yields unknown. - PHDM
+* define mode_t if not done by system include files. - PHDM (phdm@macqel.be)
+* change CF_UNION_WAIT to use compile+link rather than compile, to ensure
+ that we pick up the wait-macros rather than an implied function, which
+ should fix configure problems on NeXT for Francisco A. Tomei Torres
+ <fatomei2@mail.unm.edu>. - TD
+* spelling nit from Larry Virden. - TD
+* add osf3.0 to special case compiler options using -g3 in place of
+ -O -g, from Harsh Kumar <harsh@krcl.ernet.in>. - TD
+* remove redundant "-c" option from $(installbin) in makefile.in, reported
+ by Michael Warner <warner@wsu.edu>, for OSF/1 4.0. - TD
+* if configure --srcdir is not used, comment-out rmdir's in "make distclean"
+ rule. - TD
+* modify recent erase/clear change so that it applies only to FANCY_CURSES,
+ since BSD curses does not otherwise clear the screen when restoring after
+ popup. - TD
+* modify change for boxes so this builds with BSD curses, which has no
+ wborder() function. - TD
+* reverse ifdef for NO_SIZECHANGEHACK to USE_SIZECHANGEHACK, which is
+ normally off, since this code did not work with BSD 4.4 curses, SVr4
+ curses, or ncurses 4.1 with xterm. (Will make a configure test if anyone
+ can identify a configuration that works). - TD
+1997-11-21
+* Changed LYE_LINKN to LYE_LKCMD (still mapped by default to Ctrl-V; may
+ need to be entered twice for some systems) for invoking a prompt to
+ enter any Lynx keystroke command when in form text fields. - FM
+1997-11-20
+* Added an LYK_CLEAR_AUTH command, mapped to underscore ('_') by default,
+ which clears all authorization info for the current session. This is
+ recommended for the situation when one leaves one's terminal but doesn't
+ want to end the browser session, nor want others to be able to retrieve
+ protected documents with previously entered username and password info.
+ Note that we don't yet have a way to block access to any protected
+ documents which are still in cache. - FM
+1997-11-19
+* Tweak of HTTP.c to ensure closing of the connection when interrupted
+ ('z'apped) on the first socket read. - FM
+1997-11-18
+* Mods to use the explicit label "Bad HTML:" in trace messages corresponding
+ to BAD_HTML_USE_TRACE messages. - FM, KW
+* Tweak of the restored TABLE-in-PRE block handling to deal with the
+ case when it's encased in a CENTER or DIV with ALIGN="center". - FM
+* Changed docs/README.defines to refer to INSTALLATION file - HN
+1997-11-17
+* Changed the default ASCII BOXVERT and BOXHORI definitions from '*' to
+ to '|' and '-', and new function LYbox() for non-VMS (n)curses. - FM
+* Use explicitly specified characters for drawing the corners of popup
+ boxes with non-VMS (n)curses if we have also specified characters for
+ vertical and horizontal lines. - KW
+* Mods in HTTP.c to trim any "LYNXIMGMAP:" leader from Referer header
+ values and strip the #fragment when making http(s) requests via links
+ in the pseudo-documents constructed for MAP elements. - FM, KW
+* Mods of SGML parsing to better handle SELECT blocks with invalid markup,
+ in effect for both TagSoup and SortaSGML parsing (for the latter just
+ in case it doesn't already prevent invalid markup from being passed on).
+ Only OPTION elements are accepted in SELECT blocks.
+ Otherwise, if the element is a form-related start tag, the
+ SELECT block is closed and the new form-related element is started.
+ All other elements are ignored. A FORM end or start tag ends any open
+ SELECT block and the current FORM (before starting another FORM if
+ it is a start tag). Note that we now support SELECT blocks outside
+ of FORM blocks, which some providers are using for "informational"
+ popups, but no Lynx user would do anything that awful, right? - FM
+* Tweak in LYMainLoop.c to override an LYresubmit_posts flag if we are
+ reloading a popped document due to a NOT_FOUND or NULLFILE return
+ value from getfile(). - FM
+ (But if the document that would be loaded after such a failure has POST
+ data and is not in memory, still jump to the PREV_DOC code, see entry
+ for 1997-11-03. - KW)
+* Worked in a variant of AJL's suggestion of setting LINES and COLUMNS
+ artificially high before the initscr() call with Unix curses, then
+ using a dummy call to size_change() for setting LYlines and LYcols
+ to the actual screen dimensions, so that increases in the screen size
+ during the Lynx session, and not just decreases, can be handled.
+ Note that one still needs to do a RELOAD (^R) overtly to create a
+ new HText structure based on the current screen size. - FM
+ (The new code can be disabled by defining NO_SIZECHANGEHACK, in case
+ some curses version or terminal cannot deal with it. - KW)
+* Tweaks of the chartrans code. - FM, KW
+* Change in HTNews.c to ignore very long bogus newsgroup names when listing
+ available groups. - KW
+* Tweaks in code for highlighting search text in anchors, to better deal with
+ terminals in UTF-8 mode. - KW
+* Mods to ignore anything past a '?' character when simplifying URL paths,
+ as is now more clearly specified in the Fielding URL draft. Note that
+ we still assume a ';' is not in fact a parameter delimiter, or won't
+ have a value with characters that could be misinterpreted as relative
+ path specs. - FM
+* Increased the redirection limit to the original Lynx's value of 10,
+ because the HTTP/1.1 draft no longer will restrict it to 5, but instead
+ will leave it to the discretion of the browser (and I like 10, as a
+ reminder of the "good old days" :). - FM
+1997-11-15
+* Mods of parsing in HTML.c to restore support for the TABLE-in-PRE-block
+ HTML kludge described in http://ppewww.ph.gla.ac.uk/~flavell/tablejob.html,
+ which stopped working in conjunction with the 1997-05-21 mods (see below)
+ for treating TABLEs as DIVisions to support ALIGNment attributes in TABLE
+ markup. The PRE-in-TABLE-block HTML kludge was not affected by those mods
+ but works only with the TagSoup parsing mode. - FM, KW
+1997-11-12
+* Made handling of the 'x' in hexadecimal character references (&#xH;)
+ case insensitive, as for the "alphabetic digits" (a-f, A-F). - FM
+* Added a LINKN command key in the line editor, mapped to Ctrl-V, for
+ invoking the F_LINK_NUM prompt when in form text fields. Ctrl-V is
+ still a dead key under other circumstances in the line editor. - FM
+* remove options --with-lss-file and --with-cfg-file, since the corresponding
+ files will always be installed under $(libdir), reported by Henry Eric
+ Nelson (HN). - TD
+* modify configure script and makefile templates to permit builds with the
+ --srcdir option, noted by Philippe De Muyter. - TD
+1997-11-08
+* Added Unicode support for "DosArabic (cp864)", "WinArabic (cp1256)",
+ "DosGreek (cp737)", "DosGreek2 (cp869)", "WinGreek (cp1253)",
+ "DosHebrew (cp862)", and "WinHebrew (cp1255)". Note that we still
+ have no code for taking DIR attributes, or directionality in general,
+ into account. - FM
+* Mods to handle "cp-#" charset names as synonyms for "cp#", and some
+ cp# names as synonyms for "windows-#". -FM, KW
+1997-11-07
+* Change of LY_SLrefresh() in LYCurses.c as suggested by JED - FM
+* add logic to make install-directories as needed. - TD
+* remove --disable-char-trans option (ifdef's still remain). - TD
+* correct type used in first compile-test for union wait. - TD
+* correct order of deletions in "make distclean" rule. - TD
+* new versions of macros used to check for ncurses version. - TD
+* don't suppress -I/usr/local/include when checking -I/usr/local/include/*,
+ to accommodate older versions of gcc. - TD
+1997-11-06
+* Use erase() instead of clear() in some places, to avoid unnecessary full
+ screen repainting even for UNIX (and similar) curses. Renamed LY_SLclear
+ to LY_SLerase, but it is used for erase() and clear() now, so there should
+ be no change in behavior for slang introduced by this. - KW
+* Added new format for lines in chartrans .tbl files: U+NNNN "a string" where
+ the string can have C backslash-escaped characters. This allows to write
+ replacement strings with 8-bit characters that won't be garbled when the
+ .tbl files are transferred in some non-binary way. Note there is no ':'
+ between the Unicode value and the beginning quote character. - KW
+* Changes to HTMLDTD.c (for SortaSGML parsing) and HTML.c (second line of
+ defense) for dealing with invalid SELECT tags. Also tolerate SELECT
+ outside of forms. - KW
+* Change in HTLocalName for DOSPATH so that it doesn't depend on whether
+ HTDOS_name returns a pointer to static memory or not. - KW
+* Started new file docs/README.defines. Renamed CHANGES to CHANGES2-7,
+ removed duplicate 2-7-1 entries. Minor changes to INSTALLATION, other
+ files. CHANGES.chartrans is gone. - KW
+* Tweaked color style stuff again. Statusline may behave better. - KW
+* Don't use memmove for HEAD in HTNews.c. - KW
+* For UNIX, use normal umask permissions, instead of the extra-cautious temp
+ file permissions, for files saved to disk by the default actions for PRINT
+ and DOWNLOAD. - KW
+* Changes (untested) in the code dealing with reading of compressed files in
+ HTFile.c, in parallel to the code for other systems. - KW
+* Mods to avoid va_start redefinition warnings when building with slang. - FM
+1997-11-05
+* Change in LYForms.c to avoid full screen repaint after popup is retracted
+ for slang. - KW, FM
+1997-11-03
+* Internal links code revised. Some details follow, but first a summary
+ of the basic premises. Links in a document given as href="#fragment" or
+ href="" (empty, but href attribute is present) mean something different
+ from href="url#fragment" or href="url" (where url is a non-empty absolute
+ or relative URL not including a fragment), they are internal links pointing
+ to an element or a location within the same copy of the document (or to the
+ document itself, for href=""). In contrast, a URL-Reference with a non-
+ empty URL refers to a (generally...) external resource. If the "url"
+ happens to coincide with (or, if it is relative, resolve to) the URL from
+ which the current document was retrieved, the current document is a
+ representation of the resource, but not the same thing. In most such cases
+ we can treat href="#fragment" and href="url#fragment" the same way, i.e.
+ activating such a link is interpreted as a request to reposition within
+ the current document; we are using the current document as a cache copy
+ of the resource (like we would other documents in the memory cache). But
+ if we have marked our copy as no-cache, it seems more consistent to treat
+ activation of a href="url#fragment" link as a request for retrieving a
+ new copy and _then_ locating #fragment in it, as we do for "any-other-url
+ #fragment" if we have cached a document which represents "any-other-url"
+ and which is marked no-cache. Following a href="" link should just result
+ in repositioning to the start of the document, not in a new retrieval for
+ no-cache documents.
+ If the current document is the result of a POST submission, there is in
+ general no way to refer to its underlying resource with a URL, since there
+ is no URL notation for "url+post_data". Internal links can be used within
+ the context of this document, but there is no way to hyperlink to it or
+ parts of it from "outside". A link to a href="url" or href="url#fragment"
+ target should always imply a GET retrieval, whether it occurs within a
+ document from a POST submission or not, for consistency.
+ This understanding also applies to other than <A href=..> uses of URL-
+ References in documents, for example the link implied between a USEMAP
+ attribute and a MAP element; but not to all uses, for example a FORM's
+ ACTION requires an external resource and not an internal reference, so
+ ACTION="" is resolved to an absolute URL (using a base URL if one is
+ given).
+ The semantics for URL-less URL-References are given in Internet Draft
+ <http://www.ics.uci.edu/~fielding/url/draft-fielding-url-syntax-09.txt>,
+ including that "Traversal of such a reference should not result in an
+ additional retrieval action." No comparable prescriptions are made for
+ references which have a URL, in particular it is not stated that they
+ should be treated as equivalent when the URL coincides with or resolves
+ to the current document's retrieval URL.
+ The changes to the Lynx code attempt to implement what is outlined above,
+ by keeping track of how a link destination was originally specified. href=
+ "#fragment" and href="" links are still "resolved" into a "url#fragment"
+ and "url" form, for use internally, and if an explicit NOCACHE action is
+ requested, and for generating lists of links etc., and in general for use
+ outside of the context of the current document.
+ To the best of my knowledge they do not lead to unwanted (or misdirected)
+ resubmission of POST content without prompting the user for confirmation
+ (although the prompt texts probably need improvement). - KW
+* The notion of the context of the "current document" is extended, so that
+ auxiliary LYNXIMGMAP documents generated by Lynx are within the scope of
+ the underlying document, i.e., the document containing the MAP and AREA
+ elements. Although they are treated as separate documents for display
+ and internal handling, following links between the underlying document
+ and its LYNXIMGMAP documents will result in display from cached data
+ (if available) even for no-cache documents, if a fragment-only (or empty)
+ URL-Reference was used in the HTML. This includes the link generated for
+ pointing from the IMG to the LYNXIMGMAP if the USEMAP attribute value was
+ was fragment-only; the LYNXIMGMAP is normally regenerated from the list
+ of MAP and AREA elements kept internally when a link to it is activated.
+ (Note that a LYNXIMGMAP screen is still not reloaded from external sources
+ even when RELOAD or NOCACHE keys are used, if data for the MAP is found
+ in the internal list; but that reloading the underlying document will
+ refresh the internal lists.) - KW
+* List Page screens are also in the context of the underlying document, so
+ that internal links in the underlying document can be listed and activated
+ from the List Page. When following an internal link from a List Page, it
+ is not pushed on the history stack (similar to the History List Page), to
+ reduce the chance of confusion when walking back through history. - KW
+* LYNXIMGMAP and List Page auxiliary documents can now be associated with
+ POST data. This does not mean that the data is posted to a "LYNXIMGMAP:"
+ or "file:" URL, which is impossible; but that the underlying document is
+ associated with the POST data. This way these aux documents can still
+ have links regarded as "internal" pointing to the document of which they
+ are logically a part, keeping track of what POST data are applicable if
+ several form submissions have occurred. Normally the underlying document
+ should be in the document cache when such a link is activated, so that
+ resubmission of the POST can be overridden. If it is not found,
+ resubmission may happen after user confirmation. Although the POST data
+ content is not shown on such aux pages, it can be inspected with the INFO
+ ('=') command. Note that the association of LYNXIMGMAPs and List Pages
+ with POST data automatically excludes them from various operations which
+ may otherwise be possible, such as bookmarking or inclusion in the
+ 'V'isited Links Page. Note also that such aux pages are treated internally
+ as different documents from their POST-free counterparts with the same
+ address, which might be generated for example after typing the address
+ at a 'g'oto prompt while viewing a different text. It may be possible to
+ generate confusing situations, but regenerating the displayed data (by
+ invoking 'L'IST again, or by following a LYNXIMGMAP: link) will always
+ show the currently applicable information.
+ For image maps, the change implements link-following capabilities which
+ come naturally to graphical UAs, which can handle IMG USEMAP and the
+ corresponding MAP elements from the same data stream as objects within
+ the same document instance. - KW
+* To implement the above, MAP and AREA information from a POST response is
+ not kept in the global list shared by all other documents, but in a separate
+ list specific to the underlying (containing) document and the POST data.
+ The specific lists are managed with the underlying document's anchor
+ structure so that they can automatically expire after the anchor is removed
+ from memory and will not stay around and accumulate until session end. - KW
+* POST data is kept in mainloop when following an internal link, but is now
+ always dropped for links that were given with a URL. This removes the
+ limitation by which a link in a POST response to the URL of the POST
+ submission script would be inappropriately converted to a resubmission of
+ the POST data. (example: search form from <http://www.marshall.edu/htbin/
+ calendar>) - KW
+* Changes to the PREV_DOC handling in mainloop. When encountering documents
+ that may need to be reloaded while walking back in history, because they
+ have POST data associated and are not marked "safe" and are either not found
+ in the memory cache or -resubmit_posts has been set, the user is prompted
+ for confirmation as before; if the reply is 'n' the document will be skipped
+ but if the user cancels with ^G the walkback operation is cancelled and the
+ currently viewed document remains loaded. Some of the aux documents which
+ can new be associated with POST data may be automatically skipped if their
+ document structures are not any more in memory. - KW
+* When following a link marked internal from a List Page and confirmation is
+ required, ^G may also have the different effect of cancelling the operation
+ while responding 'n' may attempt to follow the link as a GET request (i.e.
+ with POST data dropped). - KW
+* In some situations, automatic popping from the history stack in mainloop
+ after getfile fails to load a new document could lead to resubmission of
+ a previous POST request without prompting. This is now avoided by jumping
+ to the code handling PREV_DOC. - KW
+* Use new LYinternal_flag variable for propagating info to HTAccess, rather
+ than overloading LYoverride_no_cache. - KW
+* Tweaks for bad form tag soup with crashes on unclosed SELECT. Changes in
+ HTML.c and GridText.c to prevent memory leaks resulting from insanely
+ placed or unclosed form field tags, hopefully not introducing other
+ problems... - KW
+1997-11-02
+* Changes in HTParse's scan to leave additional '#' characters alone after
+ the first has been found when scanning (from left) for fragments, and
+ to apply the "don't treat '#' as start of a fragment for some kinds of
+ URLs" hack only when the '#' will become part of what has been scanned
+ as a path. NNTP articles with more than '#' in the message-id are now
+ accessible with the "news:" or "nntp:" schemes. We should actually always
+ escape when generating URLs and unescape when parsing them instead. - KW
+* Changed HTUnEscape to leave '%' alone if not followed by two valid hex
+ digits. - KW
+* Allow the HEAD key and -head and -mime_header flags for "lynxcgi:" URLs
+ and for "news:" and "nntp:" URLs that specify a single news article. - KW
+* Change to writing of POST data in LYCgi.c, to close file descriptor after
+ done writing and before reading as suggested by mhw@bcs.org.uk (Mark
+ H. Wilkinson), and to check status from the write() call and retry if
+ needed. Note that the code is not appropriate for handling large
+ amounts of POST data, since it still first does all the writing and
+ then all the reading. - KW
+1997-11-01
+* Added support for presentation of text/plain files in SOURCE ('\') mode,
+ homologously to text/html files, rather than treating the command as a
+ synonym for 'd'ownload when viewing a text/plain file. Note that if the
+ text/plain file has no long lines, the display of it will not change,
+ but otherwise, the long lines will not be wrapped in SOURCE mode, and
+ thus can be 'p'rinted without line wrapping. One still should use
+ 'd'ownload for a faithful copy of the file, i.e., without charset
+ conversions and expansions of TABs. - FM
+1997-10-30
+* Get numbering of links on List Page right, by faking hidden links for
+ form fields which get counted but are not selectable. - KW
+* Allow LYNXHIST: links in List Page since the History Page may get
+ 'L'isted... - KW
+* Mods of HTML.c parsing to close any open Anchor or emphasis elements
+ at the starts of TABLE elements, as the Big Two's TABLE handlers appear
+ to do now. - FM
+* Tweaks of charset handling via META elements and CHARSET attributes. - FM
+1997-10-29
+* Tweak of SortaSGML DTD for insane HTML with FORM start before HEAD. - KW
+* Prevent memory leaks from HTChunks for option and textarea with very
+ bad markup, added TRACE and BAD_HTML_USE_TRACE warnings for those. - KW
+* Don't call tigetnum("ncv") for _WINDOWS - BD
+* Added Unicode tables for the "DEC Multinational", "Macintosh (8 bit)",
+ and "NeXT character set" display character sets. - FM
+1997-10-28
+* Disable setting of the `reloading' flag in HTLoadDocument which would
+ generate no-cache headers for request where this is not appropriate. - KW
+* Memory leak for first OPTION in SELECT removed. - KW
+* Changed HTDOS_name to not return pointer to static area. - Binh Do
+ <bdo@mailman.epnet.com>
+* Changes to INSTALLATION file. - HN
+* Fix in HTMIME.c to recognize Content-location. - KW
+1997-10-27
+* Don't disable FORMs that have INPUTs with TYPE="file" or TYPE="range"
+ since those fields may be optional and the rest of the FORM may be
+ valid to submit. - FM
+* Updated links to www.w3.org in help files. - KW
+* Some changes for DOS compilation. - DK
+* Changes to INSTALLATION file. - HN
+* Tweaks of internal links stuff. - KW
+* Allow HEAD on URLs starting with LYNXIMGMAP:http by stripping the
+ prefix. - KW
+* Reverted LYCheckForCSI() to previous incarnation. - KW
+1997-10-26
+* If compiled with -DDONT_TRACK_INTERNAL_LINKS, behavior with respect to
+ internal links as in FM's code. - KW
+* Some chartrans tweaks. - KW
+1997-10-25
+* Changes to INSTALLATION file. - HN
+* Make temp file names conform to 8+3 naming convention for DOS, and
+ give LYNX_TEMP_SPACE priority over TEMP and TMP for DOS. - DK
+* Create temp file names with '-' char as separator between pid and
+ sequential number for non-8+3 systems, to prevent (unlikely)
+ collision. - KW
+1997-10-24
+* Change in HTML.c to use the base (rather than current document, if the
+ base differs) in all cases for form ACTIONs (i.e., if the ACTION is
+ empty, or has a lone fragment, or an ACTION attribute is not included)
+ as specified in the -07 to -09 Fielding URL drafts. - FM
+1997-10-23
+* Fixed a few typos and glued together a few URLs to make it easier for
+ folk to cut and paste them, in the new INSTALLATION file. - LV
+1997-10-22
+* Many locations of files changed, about_lynx/ directory and references to
+ aboutfilepath removed, userdefs.h reorganized, changed README, new
+ INSTALLATION file, doc changes, some doc files removed. - HN
+ (Removed paragraph in README which doesn't apply yet, some files still
+ not done - KW)
+* Patch to WWW/Library/djgpp/makefile - WS
+* Added entity names from HTML 4.0 draft to extra entities in HTMLDTD.c - KW
+* Understand lists in ACCEPT-CHARSET attributes. Added a list of forms
+ to GridText structure (currently underused). - KW
+* Don't try to use box drawing chars in UTF-8 display mode. - KW
+* Changed chartrans mechanism (UCdomap.c, makeuctb.c) so that the "default"
+ translation table is now used as a fallback for other translation tables.
+ This also applies to display character sets which do not have a chartrans
+ table file but are listed in LYCharSets.c. Changed syntax of table files
+ (see src/chrtrans/README.format), added a keyword to disable using the
+ fallback. Currently def7_uni (corresponding to "7 bit approximations"
+ and the MIME charset "us-ascii") is used as default table, as before;
+ but previously the default table didn't have any real meaning.
+ Conceptually every translation table (unless it disables fallback) is
+ extended as if it included all the replacements from the default table.
+ Note that mappings for some characters in the default table file still
+ differ from the old mappings given in LYCharSets.c, and what is displayed
+ e.g., for umlaut characters may not be consistent, this still has to be
+ sorted out. It may just have become more visible now. - KW
+* Tweaks to some replacement strings in def7_uni.tbl; contributions of
+ more useful strings would be welcome... - KW
+* Removed mappings for invalid chars from some chartrans files, removed
+ Ethiopic chars from iso01_uni.tbl. - KW
+* Some other corrections and tweaks for chartrans mechanisms. - KW
+1997-10-21
+* Fixed handling of Control-D (delete character under the cursor) in the
+ line editor when the cursor is at the end of the line instead of on a
+ character in the string being edited. - FM
+* revised tests for wait/waitpid/union-wait. - TD
+* correct/update handling of default prefix in CF_WITH_PATH macro, used for
+ parsing --with-cfg-file and --with-lss-file options. - TD
+* add uninstall target to top-level makefile. - TD
+* remove redundant install options from $(INSTALL_DATA). - TD
+* add configure --with-lss-file option - TD
+* minor cleanup of gcc warnings, ifdefs. - TD
+1997-10-20
+* Mods in the CSO/PH gateway to set the anchor's safe flag to TRUE so the
+ user need not be bothered with confirmation prompts on resubmissions of
+ the search form. - FM
+* Tweaked the break point setting code in GridText.c for CJK di-bytes
+ so that one is set after a recognized "ESC(" ISO 2022 escape sequence
+ has been found. - FM
+1997-10-16
+* Tweaks to recognition of Japanese (better recognize x-euc-*), and to
+ the mechanism in GridText.c keeping track of which encoding is used for
+ Japanese. The state for this is now reset on explicit '\n' and '\r'
+ received by the HText object in addition to space chars. - KW
+* Tweaks in HTTP.c to avoid access to uninitialized memory and pacify
+ paranoid dbx. - KW
+* Try to more consistently remember the charset in effect for a document
+ when going to SOURCE view, using new LYUC{Push,Pop}Assumed functions.
+ Note that this is only in effect immediately when switching to SOURCE
+ view; any later reloading while within SOURCE view (including those
+ caused by RELOAD, RAW_TOGGLE and other keys, or by Options Screen changes)
+ may still revert to the usual assumption about charset, which means a
+ charset specified in a META tag may be forgotten at that point; this may
+ be considered a feature... - KW
+* Refer to TagSoup and SortaSGML parsing (coined by FM), rather than "old"
+ and "new" DTD. - KW
+* Made some of the changes concerning and removal and location changes of
+ files proposed by HN. - KW
+* Restored LYCheckForCSI example function to its previous form, with a check
+ added and comments added. - KW
+1997-10-15
+* Changed the order of display character set entries for the options menu
+ popup. "ISO Latin 1" and its "DosLatin1 (cp850)" and "WinLatin1 (cp1252)"
+ equivalents come first, then the system-based charsets (note that I
+ changed "IBM PC character set" to "DosLatinUS (cp437)"), then the CJK
+ and Vietnamese charsets, then "Other ISO Latin" (probably don't need
+ that one any more), then the known ISO 8859-# charsets with their
+ homologs (e.g, Dos and Win Cyrillic and KOI8-R) in groups, then
+ "UNICODE UTF 8" and the Unicode mnemonic charsets. - FM
+* Various fixes for color style code, should prevent memory corruption. - KW
+* Some LYCharUtils.c cleanup. - KW
+* Added some of the changes from fotemods to SGML.c, especially handling of
+ &zwnj; as allowing a line break, and conversion to UNICODE UTF-8. - KW
+* Mods in code handling mailcap lines, to avoid access to invalid memory. - KW
+1997-10-12
+* Added LYLeakSACopy and LYLeakSACat to LYLeaks.c. Running Lynx compiled
+ with LY_FIND_LEAKS defined will now give the source locations where
+ StrAllocCopy and StrAllocCat are used, if those create leaks. Added
+ missing include of LYLeaks.h in LYCookie.c. - KW
+* More heavy tweaks in LYCharUtils.c. Associated changes in HTChunk.c
+ (new functions), small change for -raw (in connection with attribute
+ values) in SGML_character. LYCharUtils.c is still a work in
+ progress... - KW
+* Tweaks to allow some chars as data input (0x97, 0x9b, 0xa0) if the
+ current display character set seems to have those values as printable
+ characters (by testing LYlowest_eightbit[]). - KW
+1997-10-11
+* Mods in HTFTP.c to recognize NetPresenz server (variation of AppleShare
+ claiming to be Peter Lewis server?, try current ftp://www.unicode.org/),
+ and to show server's identification from initial greeting on info
+ screen for FTP URLs. Other cosmetic changes in HTFTP.c. - KW
+* Fixed various memory leaks. - KW
+* Some more minor cleanup tweaks for color style code. - KW
+* Avoid unnecessary pauses if TRACE is on and a Trace Log file is in use. - KW
+1997-10-10
+* Renamed lynx_help/keystroke_commands/ directory to lynx_help/keystrokes/
+ for the benefit of DOS, and changed references accordingly. - KW
+* Changed parsing of command line options for -lss file, it should now
+ be used and override the default from userdefs.h or environment variables
+ as advertised. - KW
+* More tweaks and cleanup in HText_SubmitForm. - KW
+* Code to recover from memory exhaustion, sometimes. The requests for
+ dynamic memory which heuristically most often fail for lack of memory
+ when rendering large documents are the calloc() calls in split_line.
+ They are replaced by LY_check_calloc() which has the same calling
+ conventions as calloc() but additionally checks if "enough" memory is
+ available for the requested amount plus some margin and tries some
+ remedial action if this is not the case. The additional safety margins
+ are required to make it likely that other allocation requests in other
+ places of the program won't fail before the next check. The actions
+ which may be taken in order to avoid exiting if low memory is detected:
+ (1) Try to unload cached documents (other than the one currently being
+ loaded), until we seem to have enough memory. (2) If that fails (or
+ there are no other documents cached in memory), try to fake a 'Z' key
+ interruption; this will have the same effect as if the user had pressed
+ 'Z' so it will only detected if some other part of the program tests
+ HTCheckForInterrupt() and acts on it. (3) If this seems not to be
+ sufficient to stop loading, halt appending of normal text data to the
+ document structure (A warning *** MEMORY EXHAUSTED *** is appended
+ instead). - KW
+* A tweak of color style memory allocation. - KW
+1997-10-09
+* Some more tweaks from FM for VMS build - KW
+* For DJGPP compilation, src/chrtrans/makefile.dos - WS (Bill Schiavo
+ <Wschiavo@concentric.net>)
+* Some cleanup in Hext_SubmitForm (needs more). Start using ACCEPT-CHARSET
+ (doesn't recognize list yet, only recognized if on the INPUT field that
+ causes submission). - KW
+* Added two test files for iso-8859-2 charset. - KW
+* Tweaks in LYMainLoop.c for various keys that page up, to better preserve
+ keep the current link selected if possible and to correct a glitch with
+ UP_LINK. - KW
+* Reorder text/html and text/plain to the beginning of HTPresentations list,
+ so they will be found more quickly and will appear at the beginning of
+ Accept request header fields. - KW
+1997-10-08
+* add logic to implement mouse button 2 "previous document" for
+ ncurses configuration. - TD
+* add dependencies on 'lynx' to top-level 'all' and 'install' rules
+ in makefile.in - TD
+* add osf4.0 to special case compiler options using -g3 in place of
+ -O -g, for Heikki Kantola <hezu@iki.fi>. - TD
+* correct some of the uninitialized-variable warnings. - TD
+* Removed the compilation of the old libwww-FM HTAlert.c module for VMS,
+ as previously removed for Unix. - FM
+* Added comments and tweaks of build.com, build-slang.com and libmake.com,
+ (and a complementary tweak of tcp.h) to make more clear how compiler
+ definitions and compiler and linker options can be added. - FM
+1997-10-07
+* Changed PROBLEMS file for ^Z and for "forgetting emphasis of link text"
+ problem (which shouldn't occur any more). - KW
+1997-10-05
+* Changed SGML.c parsing of unrecognized and invalid start tags. If the
+ '<' character in HTML is followed by a 7-bit letter character, we now
+ do tag parsing even if the element name is not recognized, instead of
+ going to 'S_junk_tag' mode, so that a '>' embedded in an attribute value
+ (which may also be part of a CJK character's encoding) will not
+ prematurely end the tag. (But "soft double-quotes parsing" mode is
+ recognized.) Treat a '<' followed by most other 7-bit chars as data,
+ i.e., recover it and the following char. - KW
+1997-10-04
+* Corrected check for empty string at beginning of LYUnEscapeEntities. - KW
+* Squeezed option for "Assume charset if unknown:" into Options screen.
+ It is selected with a control char (^A), is only available in Advanced User
+ mode, and the value is currently not saved into .lynxrc with '>', i.e.
+ for a persistent change lynx.cfg has to be modified (or use an alias or,
+ for DOS, a batch file to call lynx with -assume_charset=...). The
+ interaction with the Raw M(O)de setting may be confusing (or confused :) ),
+ and it is possible to set nonsensical values that have no effect. - KW
+* Changed order and criteria of transformation attempts in HTPlain.c to
+ be more like SGML.c. For plain text KOI8-R would use 8-bit stripping
+ to early. HTPlain_write still is too different from SGML_character... - KW
+* Reinstate the slash after special interpretation of /~ at beginning of
+ file URL path for DOSPATH - DK
+* Changed SGML_character to not try to convert attribute values to UTF-8
+ if HTCJK is in effect (arrggh!) - KW
+* Changed effect of -raw / '@' for CJK display character sets: it now toggles
+ the effective charset assumption between that specified with ASSUME_CHARSET
+ or -assume_charset (or iso-8859-1 if none given) and the charset that
+ corresponds to the selected display character set, as for non-CJK. An
+ exception is made if both charsets are CJK charsets, so that the toggle
+ will still have the function of toggling CJK mode on and off. Explicitly
+ specifying a CJK charset as assumed is currently not very useful, since we
+ cannot translate from that to other character sets. - KW
+* Oh, by the way: compilation without defining EXP_CHARTRANS won't work any
+ more. Regard #ifdef EXP_CHARTRANS as some strange kind of comment for
+ now, until it goes away. - KW
+* Write comment at top of .lynxrc file to make clear that it is different
+ from lynx.cfg, suggested by LV. - KW
+1997-09-30
+* Changed order of display character sets on options screen a bit, and
+ corrected charset listings in lynx.cfg and userdefs.h files - KW
+* Added comment on lynx.lss in userdefs.h, moved it. - KW
+1997-09-27
+* Made TRACE messages which correspond to BAD_HTML_USE_TRACE warnings stand
+ out more by decorating them with ***** characters, so that users who
+ follow the BAD_HTML_USE_TRACE advice can more easily find the relevant
+ messages. - KW
+* Reworked LYUnEscapeEntities() while loop into a (hopefully) more
+ understandable and consistent state-based switch, and integrated
+ LYUnEscapeToLatinOne functionality. - KW
+* Non-ASCII characters in URLs and similar strings encountered in the HTML.c
+ processing (previously handled by LYUnEscapeToLatinOne) are now generally
+ URL-encoded, instead of doing this just for 8-bit characters which are
+ the result of entity expansion. There is no clear standard definition what
+ non-ASCII characters in URLs in HTML attributes (HREF etc.) actually mean,
+ especially if the transmission character encoding is something else than
+ iso-8859-1. Leaving them as the raw byte values as received runs against
+ the HTML i18n view that the transmission encoding is distinct from the
+ document character set and has to be (conceptually at least) decoded before
+ SGML parsing. It also won't work in general for entities that expand to
+ to Unicode characters which cannot be expressed at all in the currently
+ effective (or assumed) charset, and would lead to problems with displaying
+ URLs on the statusline or representing them in auxiliary screens or bookmark
+ files. So now we try to first transform to the document charset "as usual"
+ (undo the transmission encoding), then translate the Unicode value into a
+ sequence of (one or more) byte values which are then URL-encoded. Since
+ character values > 255 cannot be expressed in a byte, always use UTF-8
+ for them. It may not be what the author intended, but should be at least
+ consistent between internal (fragment) HREFs and NAME (or ID) attributes
+ in the same document or set of documents. Since this is dealing with
+ bytes currently disallowed in URLs, it falls under error recovery. But
+ the handling should be roughly in line with current Internet Drafts
+ (draft-masinter-url-i18n-00.txt, draft-duerst-query-i18n-00.txt,
+ draft-ietf-ftpext-intl-ftp-02.txt).
+ For character values < 256 (but > 127) this isn't currently consistently
+ done, we may still be URL-escaping the byte value without UTF-8 encoding -KW
+1997-09-25
+* Integrated the attribute and form field translation stuff from separate
+ code line. This is still a rough attempt. Needs testing and refinement,
+ for various character set situations, expect glitches and bugs. - KW
+1997-09-24
+* Removed the compilations of the old libwww-FM HTInit.c and HTFWriter.c
+ modules for VMS, as previously removed for Unix. - FM
+* Added other changes from FM's feedback for VMS. - KW
+* Fixed a bug in the SGML unescaping of OPTION values. - FM
+* Fixed a bug in the SGML unescaping of TEXTAREA text. - KW
+1997-09-23
+* Fixed file 'E'dit command from dired directory listing, which I had
+ broken in 2.7.1ac-0.69. - KW
+* Added -width=NUMBER option to specify line width for non-interactive
+ formatting (-dump output). Also used by -preparsed source mode. - KW
+* Changed suffix mapping mechanism to deal with "real" content-encoding
+ parameters (gzip, compress) in addition to 7bit, 8bit, and binary. Added
+ a new field for brief descriptive text, so that the MIME type doesn't have
+ to be abused for this purpose, but left most settings in HTInit.c unchanged
+ for now. - KW
+* Changes in HTFWriter.c and HTFile.c so that we don't forget the file type
+ and encoding information we already have for a compressed file when passing
+ control to HTLoadFile (possibly after uncompression). - KW
+* Introduced FNAMES_8_3 symbol (for DOS 8+3 file system), and HTML_SUFFIX
+ which should be defined as ".htm" for DOS and ".html" otherwise. Various
+ tweaks to deal with systems with 8+3 restricted filenames, in general and
+ in connection with uncompression. - KW
+* Applied diffs from FM for VMS, compared with recent fotemods. - KW
+1997-09-21
+* Use 0.01 rather than 0.001 as the q value for inserted iso-8859-1 and
+ us-ascii charset parameters in Accept-Charset headers. - FM
+* Added internal buffering of I.value elements in HTML_start_element()
+ of HTML.c. - FM
+1997-09-20
+* Show HTTP header for all 2xx status codes (including 204-206) if requested
+ with HEAD or -head. - KW
+1997-09-19
+* Modified the Unix "strange character" filter in exec_ok() of LYGetFile.c
+ to allow '+', '&' and '=' characters. - FM
+* minor ifdef/declaration fixes required to build on IRIX 6.2,
+ SunOS (K&R) and VAX C. - TD
+1997-09-18
+* Try again after interrupted waitpid() in LYLoadCGI(), as in LYExecv() - KW
+* Tweak in LYKeymap.c to bypass the isalpha() test for non-ASCII values,
+ including values > 255 mapped to arrow keys, etc., when generating the
+ 'k'eymap display. - KW
+* Changes to prevent many (but not all) compiler warnings about `const'.
+ Not that this is different from TD's recent changes. Also some other minor
+ tweaks relating to (gcc) compiler warnings. - KW
+1997-09-17
+* Mods in GridText.c to use HTEscapeSP() for space-to-plus conversions of
+ name fields, and not just value fields, in submitted form content. Note
+ that some CGI scripts may still be doing plus-to-space restorations only
+ for value fields, and only hex unescaping for name fields, while others
+ may not be hex unescaping the name fields, so we may as well follow the
+ specs fully (and cross our fingers :). - KW, FM
+* merge symbols 'has_color' and 'lynx_has_color' to simplify ifdef's,
+ and correct a problem building color-style configuration. - TD
+* add configure symbol for ifdef'ing presence of waitpid, which
+ was stopping build on HP-UX. - TD
+* correct the symbol that is defined by CF_SIZECHANGE test, noted
+ by failure to build SCO version after making an include for
+ <sys/ioctl.h> ifdef'd according to configure test. - TD
+* corrected check for broken (pre-1.9.9g) ncurses versions so that
+ they can build with color support. - TD
+* cache state of CF_NETLIBS so that rerunning configure will yield
+ the same results for network libraries. - TD
+* Add configure test for HP-UX -lHcurses library. - TD
+* Minor adjustments to names of configure-script variables, to make
+ them the same as other programs (e.g., tin-unoff). - TD
+1997-09-16
+* Added code to JKT's and KW's mods in LYPrint.c to also handle VMS, i.e.,
+ set the document's title as a logical on VMS (can be accessed via
+ f$trnlnm("LYNX_PRINT_TITLE") in scripts). - FM
+* Smaller cleanups here and there - FM, KW
+1997-09-15
+* Recover from bad sequence "<=" in SGML.c by outputting those characters
+ literally. - KW
+* Try again after interrupted waitpid() in LYExecv(). - JED
+* Some tweaks in new DTD, some doc typo corrections. - KW
+1997-09-13
+* Changes in LYConvertToURL() for better handling of the case when the
+ pathname of the current directory (when Lynx is invoked) contains
+ unusual, URL-reserved characters (especially '#') and we test for
+ a relative but URL-encoded path. (no change for VMS) - KW
+1997-09-13
+* Changes in LYStrings.c to enable keypad() processing for non-NCURSES
+ if HAVE_KEYPAD is defined. - KW
+1997-09-12
+* Correct mismatch/omission of HAVE_TYPE_UNIONWAIT symbol from
+ change for wait vs waitpid. - TD
+1997-09-11
+* Tweaks in HTMLGen.c for display of special characters and line breaking
+ with -preparsed. - KW
+* Got rid of use of underlining together with reverse for non-current
+ links for (n)curses if color is not used. - KW
+* Small HTMLDTD.c changes for new parsing. - KW
+* Change in SGML.c to always recognize SOFT HYPHEN when given as &#173. - KW
+1997-09-10
+* Modify CF_WITH_PATH to allow substitution of --libdir and other
+ configure options pathnames, e.g., for --with-cfg-file. - TD
+* Include lynx_cfg.h in userdefs.h to resolve redefinition reported by
+ AAC. - TD
+* Remove Ultrix/sony_news -specific ifdef's for curses headers,
+ replace with configure-tests. - TD
+* Remove AIX/NeXT/sony_news -specific ifdef's for wait vs waitpid,
+ replace with configure-tests. - TD
+* Add/use CF_HELP_MESSAGE macro to visually break down the very long
+ help message into sections. - TD
+* Move the development options to the beginning of the configure script,
+ to facilitate adjustment of compiler options (especially for Ultrix)
+ to reduce the number of spurious warnings from miscombining -g/-O
+ options. - TD
+* Correct misplaced assignment to cf_cv_ncurses_header in configure.in,
+ which caused misconfigure against vendor curses, reported by Hynek Med
+ (Ultrix) and Roger Hill (HP-UX 10.x). - TD
+1997-09-09
+* Added arguments to the multinet_htons() and multinet_ntohs() declarations
+ in tcp.h. - FM
+* Tweak of the this_MIMEcharset[] and this_LYNXcharset[] checks in
+ makeuctb.c. - FM
+* Replaced the index() and bcopy() with strchr() and memcpy() in the
+ putenv() for NeXT in LYUtils.c. - FM
+1997-09-08
+* Added a -preparsed flag, to be used with -source or with SOURCE view.
+ When invoked with this flag, show HTML text as it is output from the SGML
+ parsing stage, regenerated via HTMLGen.c functions, rather than the usual
+ more raw rendering (in SOURCE view) or the original byte stream (as with
+ the -source flag, possibly with BASE information prepended). Lynx will
+ attempt to wrap the text to screen width (or 80 cols for the -source flag),
+ but will not always succeed. Unrecognized tags and attributes as well as
+ comments are dropped, attributes reordered, missing end tags supplied,
+ abd other changes made, showing how Lynx internally treats the document's
+ structure. This is probably most useful for debugging (of either Lynx's
+ parsing or of HTML documents, although a real validator should be used for
+ the latter!). It can also be instructive to switch the DTD parsing mode
+ (with the ^V key) while viewing preparsed source.
+ Note that this doesn't work so well now with character translations and
+ entity expansion don't work well now, showing some of the same problems
+ which appear for rendered documents and dropping some characters. Making
+ those problems of parsing more directly visible was one of the motivations
+ for this flag. Also note that META tags which may contain charset info
+ are never interpreted when using -source (with or without the -preparsed
+ flag), but when interactively switching to SOURCE view, Lynx MAY remember
+ that charset info from the previous non-SOURCE full parsing (again this
+ applies with or without -preparsed); the INFO screen should always show
+ the assumption currently in effect. - KW
+* Updated some HTMLGenerator functions to use line wrapping logic found in
+ newer libwww versions, and further mods in HTMLGen.c. - KW
+* Tweaks to use of chartrans stages, should now better preserve charset
+ info from META tags even in compressed HTML files. - KW
+* Fixed a problem with LYCheckForCSI which could lead to crashes. - KW
+1997-09-06
+* Modifications to allow the Lynx lynxcgi feature to process
+ PATH_INFO in addition to QUERY_STRINGS in URLs. DOCUMENT_ROOT
+ may be set by the user in lynx.cfg and is then passed as well.
+ If DOCUMENT_ROOT is set, then PATH_TRANSLATED is calculated and
+ passed as well. - JKT (J Kevin Ternes <jkternes@mindspring.com>)
+* Changes to LYPrint.c to put the variable LYNX_PRINT_TITLE
+ into the system()'ed environment for use by post-Lynx, pre-lp
+ formatting scripts. LYNX_PRINT_TITLE is simply generated by
+ calling HText_GetTitle(). - JKT
+* Corrections to JKT's mods (to avoid memory leaks etc.). Avoid
+ unnecessary stat() calls. Other fixes in LYCgi.c. Make
+ setting of HTTP_ACCEPT_CHARSET actually work. Now URL-unescape
+ the path in lynxcgi URLs before doing anything with it.
+ Better logic for when to check for restrictions, the previous checking
+ for !reloading could be easily circumvented. Also check whether
+ the full path including a possible PATH_INFO passes the restrictions
+ test by exec_ok(), to catch "../" segments. Don't try to handle
+ a non-executable lynxcgi URL as a file URL if there was a PATH_INFO
+ part, it gets too confusing. Strip '#' fragments from the lynxcgi
+ path, but leave the interpretation of '#' characters after a '?' as
+ before so that they are still regarded as part of the query or search
+ string. If PATHINFO is present, unescaped '#' characters in it will
+ still be rejected by exec_ok(). - KW
+* added a bit of text about running ./configure to INSTALLATION
+ file - David Combs (<dkcombs@netcom.com>), KW
+* Added a translation table for Vietnamese (VISCII), and associated code
+ changes. See the file viscii_uni.tbl. - KW
+1997-09-05
+* Mods in LYGetFile.c to retain a fragment on redirection if the redirection
+ URL does not include a fragment. - FM
+1997-09-04
+* Correct ifdef'ing for getbkgd function calls. - TD
+* Correct ifdef'ing for remaining inline chmod calls. - TD
+* Consolidate various logic for opening secure files into utility
+ functions, correcting portability problems as well. - TD
+* Add configure option --with-cfg-file to override default location of
+ Lynx configuration file (requested by Laura Eaves). - TD
+* Strip -g option from CFLAGS for the non-debug version of Ultrix
+ configuration (requested by Hynek Med). - TD
+* Add configure test for HP "color" curses (noting that this cannot
+ possibly comply with XPG4 due to naming conventions, we'll expect
+ other problems with it). - TD
+* Add checks to configure test for COLOR_CURSES to work around bug
+ report for HP-UX. - TD
+* Don't cache configure options except where essential (e.g., the
+ setting of 'screen'). - TD
+* Change some configure options to disable/enable for consistency. - TD
+1997-09-03
+* Tweaks in HTML_put_string() and LYUnEscapeEntities() to deal with line-
+ breaks within attributes more consistently, and more independently of
+ which convention is used (CRLF, CR, or LF). - KW
+* Tweaks to prevent a few compiler warnings. - KW
+* Tweaks of the iso06_uni.tbl and iso08_uni.tbl files now compiled in.
+ Note that a replacement character or string to replace invalid or
+ unrecognized characters can be defined by mapping the Unicode value
+ U+FFFD, which is done here (for testing, and because these two charsets
+ have a lot of undefined code points). Also some mods in default 7-bit
+ table for some Hebrew characters and points. - KW
+1997-09-02
+* Mods to include "ISO 8859-6 Arabic" and "ISO 8859-8 Hebrew" in the display
+ character set options (Note, though, that Lynx presently has no code to
+ deal overtly with non-Latin directionalities.). - DK, FM
+1997-08-31
+* Mod of HTMIME.c to ignore any Content-Encoding header with a value of
+ "identity" (case insensitive). Shouldn't happen, but better safe than
+ sorry. - FM
+1997-08-28
+* Correct a quoting error in CF_RECHECK_FUNC macro. - TD
+1997-08-27
+* Further refine/correct configure macros for finding network and curses
+ libraries, adding CF_RECHECK_FUNC to simplify CF_NETLIBS. - TD
+* Rename #define for NCURSESHEADER to HAVE_NCURSES_H, for consistency. - TD
+* Add-back test for -lm to support slang shared libraries. - TD
+* Modify test for disentangling ncurses library from mytinfo on FreeBSD
+ to workaround linker limitation. - AAC
+1997-08-22
+* Fixed typo in LYReadCFG.c when checking for a NOVICE mode default. - JN
+ (Note that this and other lynx.cfg defaults which have 'o'ptions settings
+ are overridden when the 'o'ptions are saved to the RC file. - FM)
+1997-08-21
+* Tweak to LYHistory.c to better remember last position on page. - KW
+* Eliminated two more MIME types (application/html and text/x-sgml) from
+ the Accept header generated by default by setting the q-value to 2.0,
+ since there are more standard alternatives for these names. - KW
+* Lower maximum length for generated Accept header lines from 1000 to 252,
+ to accommodate an incompetent Windows HTTP server. - KW
+* Changed order of some functions in LYCharUtils.c (no other change there
+ yet). - KW
+1997-08-20
+* Modify top-level install rule to depend on 'all'. - TD
+* Suppress check for ANSI compiler when we are using gcc. - TD
+* Use -g3 option in place of -O -g for Ultrix compiler --debug configuration
+ (request by Hynek Med). - TD
+* Drop "-lm" library from slang configuration, since it does not seem to
+ be used. - TD
+* Add configure --includedir and --oldincludedir values to header search
+ path for ncurses and slang. - TD
+* Modify configure checks for ncurses and slang libraries to generate
+ -L options as required, using new macros CF_FIND_LIBRARY and
+ CF_LIBRARY_PATH. - TD
+* Add substitution for CPP in src/makefile.in so that .c.i rule works. - TD
+* Add configure test for lint program. - TD
+* Add "make depend" target to generated makefiles. This is intended only
+ for use in editing/developing, since many of the header dependencies in
+ chrtrans are generated during the build process and cannot be determined
+ by makedepend in advance. - TD
+* Add configure option --with-zlib. - TD
+1997-08-19
+* Tweak of highlight() in LYUtils.c to ensure that split link names with a
+ soft hyphen are handled identically for slang, VMS curses and Unix curses
+ when such links are made current. - FM
+1997-08-17
+* Use 0.01 rather than 0.001 as the q value for the global wildcard in
+ Accept headers. - FM
+* Put up correct makefile for dos port (oops) - WB
+1997-08-16
+* Mini tweaks for the win-dos ports. One fix for the pull down boxes
+ and the rest mostly maintenance. - WB
+* Fixed a bug in LYNews.c which caused overwriting of the first three
+ characters in the Subject for a followup. - FM
+1997-08-15
+* Hack in highlight() to preserve a '-' character at the end of line
+ within anchor text, which can result from splitting at the position
+ of a &shy; or <SHY> or SOFT HYPHEN character. - KW
+* Tweaks in print_wwwfile_to_fd print_crawl_to_fd to output a soft hyphen
+ character if it is present at the end of a line. For -dump, a raw
+ ISO 8859 SOFT HYPHEN character may be written if the Display Character
+ Set (default from lynx.cfg or saved value in .lynxrc) is an ISO 8859
+ character set, but this may be overridden with the -raw toggle.
+ Otherwise represent soft hyphen with '-' as usual. - KW
+* Modified the news gateway to try XGTITLE for wildcarded lists of
+ available newsgroups (e.g., news:bionet.* for the bionet hierarchy,
+ or news:* for all of its served newsgroups). If that fails, Lynx
+ retries with the old behavior of using LIST NEWSGROUPS and parsing
+ the reply itself for the desired groups. Note that LIST NEWSGROUPS
+ can take a wildcarded argument for some nntp servers, but not all,
+ so we don't risk it. - FM
+* Fixed a bug in HTHandleAuthInfo() of yesterday's HTNews.c which could
+ yield an infinite while() loop. - FM
+* Various tweaks in HTNews.c to HTHandleAuthInfo() and elsewhere, to
+ keep connections open more often in some common cases of non-fatal
+ errors, and also avoid trying to use the network socket after some
+ recognized case of closing by the server. Only based on some testing
+ with INN's nnrpd, not on any written specs. - KW
+1997-08-14
+* Added nntp authorization (AUTHINFO) handling to the news gateway. - FM
+* Added a "Loading cfg file '%s'." trace message in LYMain.c to indicate
+ the absolute path of the configuration (lynx.cfg) file which was used
+ at startup (if Lynx is invoked with the -trace command line switch). - FM
+* Added code in HTFWriter.c to avoid calling HTLoadFile() on the temporary
+ file which results from decompression of a temporary file created by
+ HTCompressed(), if this would just result in making a copy of the file
+ and then invoking an external viewer. Instead the viewer command is
+ now invoked directly from the HTFWriter_free of the HTCompressed()
+ stream after decompression. - KW
+* Added code in HTFWriter.c, HTFile.c, and HTFormat.c to support reading
+ of gzipped local files directly, using functions from the zlib library.
+ Note that gzipped files from remote servers are still first copied to
+ a temporary file before lynx can process them further, and an external
+ GZIP_PATH command is still needed at least for passing such files to an
+ external viewer, as well as for various DIRED_SUPPORT File menu functions.
+ To activate this code, the symbol USE_ZLIB has to be defined, it is
+ currently not set by the auto-config script. The zlib library may be
+ already installed on your system (probably called libz.a or libz.so.1
+ or similar, the required header files are zlib.h and zconf.h), otherwise
+ it is available through <http://www.cdrom.com/pub/infozip/zlib/>, it
+ appears to support all platforms for which lynx is available (including
+ VMS, DOS, MS Win32). Note that this library would probably also be
+ needed if in the future support for the HTTP/1.1 "deflate" content-coding
+ is added. - KW
+* Don't send MIME types in Accept headers whose q values are outside of the
+ allowed range 0.0 <= q <= 1.0 - KW
+* Tweaks in HTInit.c to use the official names for image/png and image/tiff,
+ but still support the image/x-* forms. - KW
+1997-08-13
+* Tweaks of LYConvertToURL() in LYUtils.c and HTParseInet() in HTTCP.c
+ to deal more coherently with 'z'ap attempts during gethostbyname()
+ calls. - FM
+* Tweaks of split_line() and HText_endAppend() in GridText.c to handle
+ trimming of spaces from the tails of link names more effectively. - FM
+* Expanded the OL nesting depth and type counters to track up to 12 list
+ depths before punting to the lowest negative number. Note that the
+ indentations still are limited to 6 nested depths, so use the TYPE
+ attribute to distinguish OLs with deeper nestings. - FM
+1997-08-12
+* Mods of LYMainLoop.c to maintain treatment of a local startfile as
+ text/html source when it does not have a suffix mapped to that MIME
+ type and the -force_html switch was used. - FM
+* Added .phtml to the default suffix mappings for text/html. - FM
+* Mods of LYCurses.c to avoid using /dev/tty arbitrarily for stdin on
+ Unix when compiling with slang versions greater than 0.99-35, based
+ on JED's suggestion to lynx-dev. - FM
+* Tweaks of HTCheckFnameForCompression() in GridText.c to avoid warnings
+ from some compilers. - FM
+1997-08-09
+* Changed the code of 1997-08-06 which modifies suggested filenames for a
+ 'D'ownload to be more cautious: don't remove a '.gz', '.Z' etc. suffix
+ if there is no header indication that we have a compressed file. Not
+ all servers and gateways (including the internal FTP gateway) detect
+ and label compressed content reliably. - KW
+1997-08-08
+* Mods of HTTP.c so that download requests are converted to presentation
+ requests for interactive users, and traversal requests are converted to
+ cancels, when servers return non-success statuses with bodies which
+ should be displayed to interactive users. - FM
+* Added the "DosCyrillic (cp866)" display character set to the chartrans
+ support, and tweaked the other Cyrillic charset tables. - AAC, KW
+* Tweaked MULTI_SUFFIX support in HTFile.c, so that it now somewhat
+ works. Dunno whether it's useful for anybody. - KW
+1997-08-07
+* Tweaks of yesterdays mods in GridText.c. - FM
+* Correct storage class of variables in UCMap.h, from -warn-common linker
+ option. - TD
+* Refine configure tests for acs_map, ttytype to accommodate broken linker
+ on FreeBSD 2.1.5 - TD
+* Modify README.configure to indicate the associated definitions for
+ each configure option, as suggested by Klaus Weide. - TD
+* Correct duplicate declaration of Current_Attr, which Linux linker ignores
+ (reported by Hynek Med). - TD
+* Add -G7 option to Ultrix compiler options (request by Hynek Med
+ <xmedh02@lada.vse.cz>). - TD
+* Add include for <sys/types.h> to utmp configure test (reported by Andrey
+ A. Chernov). - TD
+* Add check for FreeBSD library mytinfo (reported by Andrey A. Chernov
+ <ache@null.net>). - TD
+* Modify ./makefile.in so that 'all', the default target, will build the
+ Lynx executable. The old 'all' target is retained as "make help". - TD
+* Modify src/makefile.in to allow development compiles within the src
+ directory. - TD
+* Mask spaces in the bkgd (background attribute) calls for color curses to
+ make the color-style code work better with SVr4 curses. - TD
+* Change workaround for 8-bit acs characters by adding to the initialization
+ a loop forcing the entries of acs_map[] to 8-bits. - TD
+* Many minor tweaks for the DJGPP version by DK - WB
+* A rename of about_lynx_dev.html to lynx_dev.html for 8.3 systems - WB
+1997-08-06
+* Modified HTMIME.c and LYCharUtils.c so that setting of suggested filenames
+ via a filename=value pair in Content-Disposition headers and META elements
+ is not restricted to the file disposition type. - FM
+* Mods in GridText.c, LYGetFile.c and HTAnchor.c so that suggested filenames
+ will have appropriate suffixes when 'd'ownloading, based on whether or not
+ the file is gzipped or Unix compressed. - FM
+1997-08-05
+* Mods of the lead relative symbolic element stripping for http/https
+ URLs in cases for which they would persist when resolved to an
+ absolute URL. The latest URL draft is ambiguous about whether this
+ should be considered an error, and leaves the handling of it up to the
+ UA. So we now get rid of all lead relative symbolic elements from the
+ resolved http/https URLs, but no others, and still issue a Bad Partial
+ Reference statusline message. - FM
+* Tweaks of title handling in LYMainLoop.c and LYShowInfo.c so that the
+ known title, or link name associated with ACTIVATE-ion, form submission,
+ or a HEAD request, will be used in the INFO ('=') display. - FM, KW
+1997-08-04
+* Fixed header parsing in HTMIME.c so that "Safe:" is recognized. - KW
+* Changed confirmation prompts for HEAD (']') commands acting on a POST
+ document, to reflect the fact that the POST request body will not
+ actually be submitted in a HEAD request. - KW
+* Reset LYCancelDownload to FALSE at top of getfile(), to prevent delayed
+ effect which can otherwise occur. - KW
+* Block URLs with port numbers outside the range of valid numbers in
+ getfile(). - KW
+1997-08-03
+* Changed the NSL_FORK code in HTTCP.c so that the gethostbyname() call
+ is retried without forking if the child process exits without returning
+ enough data. Also added trace output, to show whether something
+ unusual has happened to the child process. - KW
+* The IETF has indicated intent to adopt KW's "status 307" proposal for
+ dealing with the status 302 problems, so HTTP.c and HTAlert.c implement
+ that now. The 302 status is "General (temporary) Redirection" which
+ can be handled as 303 at the UA's discretion, so we do that in all cases,
+ rather than prompting the user whether to do that when the 302 is for
+ a POST submission. The 307 (and 305) for POST submissions invokes a
+ prompt whether to P)roceed or C)ancel, without the Use G)ET option.
+ The 301 is treated as permanent, normally, but for POST submissions
+ still is treated as temporary and invokes a prompt which includes the
+ Use G)ET option, because scripts written to empirical behavior may
+ still be expecting that (it's virtually never encountered in redirections
+ of POSTs, though, because the document containing the form typically
+ is redirected, so the user only sees the form if a local copy has been
+ made, and it would be best to C)ancel and get a new local copy of the
+ document from the correct http/https URL, to serve as a BASE for the
+ form's ACTION). - FM
+* Changed the typedef for HTCoord in HTStyle.h from float to int, for
+ significant speedup of rendering on machines without floating-point
+ hardware based on DW's, KW's, BL's analyses. Note that this should
+ be taken into account when/if external style sheet support is added
+ for page formatting (e.g., for optimum handling by speech synthesizers
+ and braille interfaces), beyond the current emphasis on colorizing. - FM
+1997-08-02
+* The cookie pre-draft has been adopted as an IETF ID, see
+ ftp://ds.internic.net/internet-drafts/draft-ietf-http-state-man-mec-03.txt
+ so the code for combining Set-Cookie and Set-Cookie2 headers has been
+ eliminated in LYCookie.c (see mods for 1997-07-31). - FM
+1997-08-01
+* Fixed typos in LYCookie.c. - FM
+1997-07-31
+* Mods of the cookie handling based on the latest pre-draft. Add a
+ Cookie2: $Version="1" header in any requests that use historical
+ cookies in the Cookie: request header, so that modern servers will
+ use Set-Cookie2 headers with modern cookies in their subsequent
+ replies. Limit the scheme for commentURLs to http or https, not
+ just to network servers (e.g., gopher is now barred too). Include
+ a $Port attribute in modern Cookie request headers if it was set
+ via a server's reply header. The pre-draft indicates intention
+ to drop the requirement to combine Set-Cookie2 and Set-Cookie
+ headers if both types were received. We're still combining them,
+ but based on bona fide one-to-one correspondence checks (which were
+ not specified in the earlier draft), so that's OK, and we'll get
+ rid of that needless overhead if the current pre-draft holds up
+ and becomes an official IETF draft. - FM
+* Added a -nocc command line switch for disabling the Cc: prompt
+ for self copies of mailings. Note that this does not disable
+ any CCs that have been incorporated within a mailto URL or form
+ ACTION. - FM
+* Added a NO_FORCED_CORE_DUMP compilation (userdefs.h) and configuration
+ (lynx.cfg) symbol, normally set FALSE, which if changed to TRUE will
+ block forced core dumps on Unix via abort() calls on fatal errors or
+ assert() calls on potentially fatal error checks. Also added a -core
+ command line switch for toggling the default. - FM
+* Updated the documentation and 'h'elp concerning the new symbol and
+ switches. - FM
+1997-07-30
+* Added workaround for curses with broken handling of 8-bit acs characters
+ (which may be used for drawing of popup boxes) to LYCurses.h. This fixes
+ box characters and attributes/colors for solaris curses used with linux
+ console as terminal. Currently it is not automatically enabled or
+ configured, but can be enabled by -DBROKEN_CURSES_8BIT_ACS. - KW
+* Mod in HTFWriter.c to change the statusline appropriately when an
+ uncompression has completed. - FM
+* Fixed code in LYOptions.c for the case when NEVER_ALLOW_REMOTE_EXEC was
+ not defined and ALLOW_USERS_TO_CHANGE_EXEC_WITHIN_OPTIONS was defined. - KW
+1997-07-28
+* Avoid traversing the full list of anchors each time when HText_endAnchor()
+ is called with a non-zero anchor number, if that number corresponds to
+ the last anchor added to the HText structure. It is is the most common case
+ that HText_endAnchor() refers to the last anchor, and the only case that
+ could be handled correctly before FM's changes of 1997-05-13. Avoiding
+ the loop over the list of anchor can improve loading time significantly,
+ especially for large files with thousands of anchors. - KW
+* Add progress display and 'z'appability for loading of local files.
+ They are activated only after a few hundred k bytes have been read.
+ Added define for HT_PARTIAL_CONTENT to HTUtils.h, used in above.
+ (The WWW Library 5.x uses HTTP-ish status codes like this throughout.
+ I find it much less confusing than -29998 and so on, and there's no
+ conflict in this case. - KW
+* Minor LYUtils.c tweaks. - KW
+1997-07-27
+* Changed code for checks in LYGetFile.c for URL schemes which should
+ be rejected when received as redirections, added checks for more
+ schemes. - FM
+* Rename top-level Makefile to Makefile.old (it's obsolete) - TD
+* Reduce top-level targets to one, 'lynx' - TD
+* Move comments describing DirEd to README.configure from makefile.in,
+ leaving only the definitions that haven't been integrated yet. - TD
+* Add configure options to enable/disable DirEd and its associated modes. - TD
+* Add configure option to enable/disable char-trans support. - TD
+* Correct sense of autoconf'd symbol for size-change. - TD
+* Accommodate systems with obsolete ncurses.h in configure tests. - TD
+1997-07-26
+* Changed the variable hline in LYUtils.c to hLine, so as not to conflict
+ with a curses function or macro. - FM
+* Fixed an esoteric glitch in highlight() of LYUtils.c which could cause
+ the last character of a current link to receive WHEREIS search target
+ emphasis if it happened to be the first character of the target (though
+ perfection is unattainable, we should strive to achieve it :). - FM
+* Changed the default value for STRIP_DOTDOT_URLS (lynx.cfg) to TRUE. - KW
+* Made some of the additional checks introduced yesterday in LYMainLoop.c
+ for invalid links to internal dired URLs more strict, as they probably
+ were intended. - KW
+* Added checks for some internal URL types, which should be rejected
+ if received in a server redirection, to LYGetFile.c. Maybe more types
+ should be added to the list. - KW
+1997-07-25
+* Map charsets of the form "ibmNNN<...>" to "cpNNN<...>" in UCdomap.c
+ if not already recognized. Also recognize "windows-1252". - KW
+* Compared the handling of 4-way "show color (&)" in the 'o'ptions menu
+ against FM's implementation, and made some changes (mostly in formatting,
+ variable and constant names and usage, ordering of statements) to aid
+ further comparison. The logic is still messy and needs further cleanup
+ and simplification, but seems to do what it should. Note that this
+ also handles color-curses, in a (hopefully) reasonable way. Command
+ line flags -nocolor and (if using slang) -color override a preference
+ found in the RC file. See updated "Lynx Users Guide" file and the
+ comments written to the RC file.
+ Documentation changes adapted from FM's changes. - KW
+* Mods of the DIRED_SUPPORT to check the actual URLs of temporary files
+ rather than just their titles when filtering for spoofing attempts via
+ external files with internal URLs. Also recast the PRIVATE my_spawn()
+ to a PUBLIC LYExecv(), so that it can be used by any module (though
+ presently it's still used only by LYLocal.c functions). - FM
+* Tweaks of LYCharUtils.c to handle Set-Cookie HTTP-EQUIVs in META elements
+ without risking crashes in LYCookie.c or HTParse.c. - FM
+1997-07-24
+* Made "show color" option a 4-way choice, if compiled with color support
+ and if saving of options to a .lynxrc file is allowed. - KW
+* Made changing file permissions with DIRED_SUPPORT work again; one of
+ the recently added checks in LYMainLoop.c was too restrictive.
+ Added protection to permit_location in LYLocal.c, similar to the changes
+ of 1997-06-24 to LYDownload.c. - KW
+* Generate CANCELLED message when editing of a string value on the Options
+ Screen has been cancelled (typically with ^G), instead of an
+ inappropriate VALUE_ACCEPTED statusline. - KW
+1997-07-23
+* Tweaks of the strtok() calls for textarea values in HTML.c, so that they
+ will never be repeated after NULL has been returned, and thus won't cause
+ linux-alpha to crash. - FM
+* Make -nocolor command line flag work if compiled with slang. Note that
+ -nocolor is strong, it overrides all other reasons that might otherwise
+ turn color on. - KW
+* Tweaks in LYCurses.c to ensure that slang library and Lynx flags for
+ whether color support is on stay in register. - FM
+* Change the default in userdefs.h for SHOW_COLOR to FALSE for USE_SLANG.
+ Because of the different logic used for LYShowColor in the curses code
+ vs. slang code, setting SHOW_COLOR to TRUE makes it difficult to invoke
+ a binary compiled with slang so that color is not used on startup
+ (except by using -nocolor).
+ Note that reading show_color from .lynxrc is still commented out. - KW
+* There is now a "trailing comment" handler in LYReadCFG.c. It treats '#'
+ as a comment token only if it is somewhere after the last colon for the
+ lynx.cfg entry and is preceded by a space or tab. - FM
+* Added TT to the Utterly Tag and Attribute Soup group of HTML elements. - FM
+ (applies only to "old" DTD in this code set, as usual - KW)
+1997-07-22
+* Modify curses popups in LYForms.c and LYOptions.c to use background color
+ from main window - TD
+* Ifdef'd out the logic that saves "show color" to .lynxrc, since it is
+ deemed to be confusing to users - TD
+* Merged FM's changes to the "show color (&)" toggle to save to .lynxrc,
+ support slang, update online documentation - TD
+* Add error message to show actual context in error-checking for color
+ parsing suggested by Filip M Gieszczykiewicz - TD
+* Check for/suppress duplicate -lsocket in network library configure - TD
+* Remove HP-UX snake2/snake3 targets from makefile.in - TD
+* Add configure script case for 'sequent', drop ptx, ptx2 targets from
+ makefile.in - TD
+* Add logic to configure script handling of slang to suppress spurious
+ -Ipredefined when header location is given in $CFLAGS - TD
+1997-07-21
+* Check for lynx_uses_color and LYShowColor in lynx_start_status_color()
+ and lynx_stop_status_color() of LYCurses.c so that the statusline
+ will appear reverse (or otherwise highlighted if the terminal doesn't
+ support reverse), if color support is compiled in but not currently
+ used. - KW
+* Added comments on color usage to lynx.cfg. - KW
+1997-07-20
+* Added command-line option "-nocolor" to disable color on terminals that
+ would otherwise support it. Added options toggle for colors, tested
+ with ncurses. - TD
+* Remove option value from configure option "--with-color-styles". - TD
+* Correct background of popups in LYOptions.c - TD
+* Add configure check for compiler options to enable prototypes - TD
+* Remove IRIX "-cckr" compiler flags. - TD
+* Correct whitespace as per LPS: LYCurses.c, LYOptions.c - TD
+* Tweaks of LYMainLoop.c in the code controlling how the document is reloaded
+ due to any changes in the 'o'ption menu which require a new rendering of
+ the document (but still without forcing a proxy cache refresh when that is
+ inappropriate; see the 1997-05-26 mods). - FM
+1997-07-18
+* Mods in LYexit.c and LYCurses.c to ensure restoration of stderr (if it
+ was changed for output to the trace log) on all exits. - BL, FM
+* Include an unsigned char typecast in the HASH_FUNCTION definition for
+ HTAtom.c - CK
+* Modified change to is_url() of 1997-07-13 to check for the slash after
+ stripping any lead space characters. - FM
+1997-07-16
+* Added the Windows Cyrillic display character set. - AAC
+ (Andrey A. Chernov <ache@null.net>)
+1997-07-15
+* Added support for a commentURL attribute in cookies. This attribute is
+ under discussion in the HTTP-WG and not presently in the draft (see the
+ 1997-07-09 mods for the draft's URL), but would be extremely advantageous
+ for multi-lingual and non-English-speaking sites because the comment
+ attribute can have only ASCII characters in its value, whereas a request
+ for the comment via a URL in turn allows use of charset and language
+ negotiation for what the server returns. The value of the commentURL is
+ resolved and retained only if it's scheme points to a server (i.e., file
+ and special lynx URLs are rejected), and if it is retained, is included
+ as a link in the Cookie Jar Page. If commentURL is not ultimately
+ included in the revised State Management RFC, sites which wish to use
+ it could do a User-Agent check for Lynx (and any other browsers which
+ implement it). - FM
+* Fixed a typo in HTCompressed() of HTFWriter.c so that the last dot in a
+ tentative temporary filename is sought via strrchr(), as is done for
+ HTSaveAndExecute() and HTSaveToFile(). - KW
+1997-07-14
+* Yet more tweaks of the cookie support. We include $PATH and/or $DOMAIN
+ attribute/value pairs in Cookie request headers only when their values
+ were set explicitly via a server's Set-Cookie and/or Set-Cookie2 reply
+ headers (and the cookies are $VERSION="1" or greater). - FM
+* Added support for IFRAME homologous (but not identical) to that for FRAME.
+ It is handled as a block with a blank line before and after style, and
+ with margins and default alignment inherited from the containing block,
+ division, or span. The IFRAME rendition always begins with an emphasized
+ "IFRAME: " label followed by the NAME attribute's value, if present, or
+ the URL for the SRC attribute, serving as a link for the SRC, followed
+ on a new line by any rendered IFRAME content. - FM
+* Added handling of LEGEND elements. The content is rendered in place,
+ as for CAPTION elements, since we don't have multiple pass inlining
+ capabilities. Hopefully, if the LEGEND is intended to be ALIGN-ed at
+ the "top" or "bottom" of the associated insert, the author will place
+ the LEGEND element above or below it, respectively. Note that LABEL
+ elements similarly are rendered in place, and will be displayed
+ interpretably only if the INPUT to which the LABEL's "for" attribute
+ refers, immediately follows the LABEL element. - FM
+* Added recognition of BUTTON elements, and handling of them (sorta :)
+ when they are TYPE="submit" or TYPE="reset" in forms. The default
+ "submit" or "reset" string, or the value of a VALUE attribute, if
+ present, is embedded in parentheses and used for the link, and the
+ content is simply rendered and displayed in place. Until we see what
+ kind of markup the real world puts in such elements, it's too risky
+ to try to use that rendition as the link. Also, the W3C's HTML 4.0
+ draft presently is very fuzzy about whether, and if so, when, an IMG
+ element in the BUTTON content should be treated as an image map, so
+ the present code doesn't try to cast any submitted BUTTON name/value
+ pairs into the format for INPUTs with TYPE="image". When the BUTTON
+ is a script control rather than submit or reset button, a "[BUTTON]"
+ pseudo-ALT is inserted to warn users of its presence, but the form
+ is not disabled. The W3C's HTML 4.0 draft makes scripting intrinsic,
+ with no SGML-based fallbacks if it is not available or is disabled by
+ security-conscious sites. Dave Raggett of the W3C replied to criticisms
+ of this in www-html@w3c.org by saying that he wished it have been
+ otherwise, but "market forces" prevailed (Sigh...) - FM
+1997-07-13
+* Changed is_url() to return immediately if the string to check starts with
+ a slash character. This prevents some false positives if the string
+ contains ':' characters. - KW
+* Added support for "MACOS AppleShare IP FTP Server" to HTFTP.c.
+ Only based on and tested with (the current incarnation of)
+ <ftp://www.unicode.org/>. - KW
+1997-07-12
+* Correct some build issues with the merge (ifdefs for the curses modules)
+ as well as minor fix for makefile distclean rule. - TD
+* More refinements of the cookie support in relation to recent discussions
+ in the HTTP-WG, and for more fully effective protection against denial
+ of service attacks. If the same attribute appears more than once for
+ the same cookie, ensure that the first instance will be used. Limit
+ the total number of cookies across Set-Cookie and Set-Cookie2 headers
+ to 50 per server reply, and each cookie to a maximum of 4096 bytes. - FM
+1997-07-11
+* Added support for hexadecimal character references (&#xH;) as proposed
+ in the W3C HTML 4.0 draft. - FM
+1997-07-10
+* Synchronized the development code against the fotemods patches up to
+ 1997-07-06 (relevant changes listed below, as usual). Note that FM
+ has now included the chartrans code, but has eliminated conditional
+ compilation of it; however, in this code set setting "-DEXP_CHARTRANS"
+ at compile time is still necessary (but compilation without it has not
+ been tested). - KW
+* Fixed character counting logic in display_line() for lines where
+ soft hyphens (&shy; or <SHY> or a soft-hyphen character) are used
+ for their intended purpose. - KW
+ NOTE: The W3C HTML 4.0 draft explicitly specifies handling of &shy;,
+ &#173; (and now also &#xAD;) in the manner long implemented by Lynx
+ (i.e., as a truly soft hyphen), and not in the brain-dead manner
+ implemented by Netscape and MSIE. - FM
+* Various tweaks of the cookie support to handle likely (based on past
+ experience in the real world :) abuses of Set-Cookie and Set-Cookie2
+ headers from servers. Most importantly, apply sanity checks to the
+ values of port attributes so that any unquoted port list will not be
+ misinterpreted as the start of a new cookie within the port list.
+ Also added code to fold (CR LF TAB) Cookie request headers if they
+ contain a long sequence of cookies which would exceed 1024 bytes on
+ one line, since some servers suffer buffer overruns and crash in such
+ cases. - FM
+* Modified HTNews.c to use HTmmdecode() and HTrjis() for the Subject and
+ Author strings in listings of news articles when using a Japanese display
+ character set. - HN
+1997-07-09
+* Massive updating and revamping of the cookie support in accordance with
+ http://www.ics.uci.edu/pub/ietf/http/draft-ietf-http-state-man-mec-02.txt
+ which is scheduled to replace RFC 2109 on July 15, 1997. Noteworthy
+ changes are that (1) the blanket port restriction is now lifted, and
+ sharing of cookies among servers with matching domains but different
+ ports is blocked only if a port attribute was included in the
+ Set-Cookie2 header (or Set-Cookie header, though it's not expected
+ there), with a value which defaults to the request's port, but can
+ be a comma separated list of ports, and (2) the blanket restriction
+ on sharing of SSL-encrypted (https) cookies with http servers is
+ lifted, and normally depends on the Set-Cookie or Set-Cookie2 header
+ having included a secure attribute. However, a configuration option
+ (see lynx.cfg) to FORCE_SSL_COOKIES_SECURE is now available, and the
+ compilation or configuration default can be toggled via a -force_secure
+ command line switch. - FM
+* Make NOCACHE ('x' key) work as expected from history list for internal
+ links. - KW
+* Removed bogus checking for a config file in home directory which had
+ been introduced into the development code. - KW
+1997-07-08
+* Synchronized the development code against the fotemods patches up to
+ 1997-06-24 - TD, KW
+1997-07-06
+* Implemented popup windows for the 'o'ptions menu, homologous to those
+ for SELECT blocks in forms. They are implemented when select_popups
+ is on, and include WHEREIS search and 123[g,p] features (very useful
+ for navigating the choice list of 28 display character sets :). Use
+ the F_LINK_NUM command ('0') to invoke the prompt for a choice list
+ number when in NUMBERS_AS_ARROWS mode. The popups are not invoked for
+ the simple, binary choice options. Also modified the options menu so
+ that the cursor is positioned to the left of choices when show_curser
+ is on (but it is still positioned initially at the endings of strings
+ when the line editor is invoked for options that have user-entered
+ values). - FM
+1997-07-04 (KaBoom! :)
+* Mods of HTMIME.c and HTFile.c to ignore Content-Type parameters other
+ than charset when charset is not present, as we do when it is present
+ and we know we can handle it. - FM
+* Fixed bug in LYNews.c which could cause Lynx to crash when posting or
+ sending followups to news groups and the Organization header was
+ obtained from the /etc/organization file. - FM
+* Fixed bug in LYEdit.c which could cause Lynx to crash when an editor
+ to which a line number is passed as an argument is used and there are
+ no links on the current page of the document to be edited. - FM
+* Added information about the new $USER feature to the comments about
+ TEMP_SPACE in userdefs.h. - FM
+1997-07-03
+* Tweaks of change_sug_filename() in LYUtils.c to make protections against
+ buffer overruns explicit within the function. - FM
+* Tweaks of the #ifdef'ing in HTTCP.c. - FM
+1997-07-02
+* Mods in LYDownload.c and LYPrint.c to treat a suggested output file
+ entry of "/dev/null" on Unix, and "nl:" or "/nl/" paths on VMS (case
+ insensitive), as a cancel (^G). - FM
+* Mods in LYGetFile.c to include URLs with content from a form submission
+ with method GET in the group for which Referer headers are never sent,
+ because the content might include private (e.g., password or credit
+ card) information which should not be visible in Referer logs. - FM
+* Added -G 7 to the LYFLAGS and MCFLAGS for the ultrix and ultrix-slang
+ Makefile targets when using the native ultrix compiler. - HM
+* Added -DNSL_FORK to the LYFLAGS for all of the solaris2 and Linux
+ targets in Makefile. - FM
+* The above two changes don't affect the makefile used by auto-config - KW
+1997-06-30
+* Removed a redundant declaration in UCdomap.c which was causing some
+ compilers to balk. - FM
+* Fixed typos in SGML.c which could cause echoing of numeric character
+ references for some of the display character sets. - FM
+1997-06-29
+* Updated lynx.hlp, lynx.man and the online 'h'elp concerning the chartrans
+ support. - FM
+1997-06-26
+* Tweak of the "tag and attribute soup" parsing mods in HTML.c so that the
+ PLAIN attribute works for UL blocks again. - FM
+* More tweaks of LYMainLoop.c to issue informative statusline messages
+ about attempts to ACTIVATE, DOWNLOAD, or submit URLs or ACTIONs which
+ are disallowed in the current context and destined to fail, rather than
+ acting on them and generating actual failures. - FM
+* Mods of LYmktime() in LYUtils.c to support dd-mm-yyyy format for expires
+ headers and cookie attributes. - FM
+* Oops, hadn't included checks for whether there are links on the page
+ in this morning's LYMainLoop.c mods to ensure appropriate statusline
+ messages for attempts to bookmark special URLs that can't be bookmarked,
+ which could yield a crash it there aren't any. The checks are in there
+ now. - FM
+* Added ability to bookmark links from the Lynx List Page, as from the
+ Visited Links Page, but not for those pages, themselves, since they
+ are temporary files. Note that Lynx List Page links will not have
+ the documents' titles, as do those in the Visited Links Page, unless
+ you've visited them before invoking the Lynx List Page. - FM
+* Added explicit protections against buffer overruns in the LYDownload.c
+ handling of suggested filenames. - FM
+* Changes in LYCurses.c, GridText.c, HTML.c, and LYUtils.c, and smaller
+ changes to some other files, to fix problems with RP's style code.
+ Color leaking should now be at least much reduced, and some possible
+ crashes avoided. - KW
+1997-06-24
+* Mods in LYDownload.c to check whether the File= field in a LYNXDOWNLOAD
+ URL has the value that was inserted into the URL via the most recent
+ download options menu. This prevents spoofing with arbitrary LYNXDOWNLOAD
+ URLs entered via the 'g'oto or ECGOTO commands, or ACTIVATE-ed in a file
+ other than the most recent download options menu which was created by
+ Lynx internally. - FM
+* Mods in LYMainLoop.c to ignore LYNXCOOKIE, LYNXDIRED, LYNXDOWNLOAD, and
+ LYNXPRINT URLs if entered via a 'g'oto or ECGOTO command, and to issue
+ a statusline message explaining that the special URL is not allowed as a
+ goto. This is just for informational purposes, and the above anti-spoof
+ mod is not dependent on it. - FM
+1997-06-23
+* remove "Styles" identifier from Lynx version string in userdefs.h
+ since it causes "patch-o-matic" to choke. - JES
+1997-06-20
+* Now that we add or subtract attributes for Unix FANCY_CURSES, as for VMS
+ curses and slang, the 1997-05-30 mods based on LE's patch for keeping track
+ of whether links occur in an underlining context, and if so, restoring it
+ when a current link is made non-current, should be extended to FANCY_CURSES
+ as well. So they are extended, now, in highlight() of LYUtils.c. - FM
+* Added code in LYNewsPost() of LYNews.c for converting any EUC or SJIS to
+ JIS (ISO-2022-JP) in posts or followups to Usenet news groups if the
+ display character set is "Japanese (EUC)" or "Japanese (SJIS)". The mods
+ need testing by Japanese users, because the TO_JIS() function I added
+ long ago in SGML.c has not actually been used before. - FM
+* Modified the hack in LYPrint.c for mailing HTML source so that it never
+ appends a charset parameter to the "text/html" value of the Content-Type
+ header if compiled without chartrans enabled. - FM, KW
+1997-06-18
+* Added a check for nonsense LINES and COLS values in setup() of LYCurses.c,
+ homologous to the check in size_change() of LYUtils.c, and set LYlines and
+ LYcols to the 80x24 default if they're nonsense. The slang library and
+ most curses implementations do the equivalent themselves, but we may as
+ well make sure it's done. - FM
+* Tweaks of the anti-spoof mods in HTFWriter.c for additional protection
+ against extra %s entries in viewer command mappings. - FM
+1997-06-17
+* Came up with a low overhead way to restore the emphasis for WHEREIS
+ search targets when links are made current or non-current and the
+ target string starts before and/or extends past the end of the link
+ name (hightext or hightext2) string (see 1997-06-14 mods), so the
+ restoration works in that case as well, now. - FM
+1997-06-14
+* Fixed a longstanding bug in highlight() of LYUtils.c which caused seeking
+ of a column position less than 0 and strange behavior when a link is made
+ current, if show_cursor is on and the link begins at column 0 (as can
+ happen in PRE blocks). We now position the cursor on the first character
+ of such links, so the current link will remain clear for those with speech
+ or braille interfaces. - FM
+* Added functions in LYCurses.c, along the lines of those in the development
+ code, so that the [w]start_foo() and [w]stop_foo() functions no longer
+ just replace character attributes for Unix FANCY_CURSES, but now add or
+ subtract them as for VMS curses and slang. - FM
+* More mods in GridText.c and LYUtils.c so that the handling of WHEREIS
+ search target emphasis when links are made current and non-current is the
+ full equivalent for Unix FANCY_CURSES of that for VMS curses and slang.
+ Note that the restoration of search target emphasis does not succeed if
+ the hit started before or extends beyond the link name (hightext or
+ hightext2 string). What it would take to succeed in that case as well
+ doesn't seem worth the overhead, but I'm still thinking about it. Also
+ note that we still do not emphasize search target hits, but only do link
+ or page re-positioning, for Unix curses when only standout() and standin()
+ are supported. In that case, standout() is being used for all links,
+ including the current (with the latter indicated via cursor position by
+ turning show_cursor on), so we don't want to create a totally confusing
+ situation by using standout() for search target hits as well. The code
+ is still designed to degrade gracefully when the terminal does not have
+ the capabilities of the curses or slang with which Lynx was built. - FM
+1997-06-13
+* Tweak of yesterday's LYGetFile.c mods. Lost a lynx_edit_mode = FALSE
+ statement that is still needed when DIRED_SUPPORT is defined. - FM
+* Mods in LYForms.c so that the cursor is positioned at the left of the
+ current option in select popup windows when show_cursor is on, as when
+ the cursor is used to indicate the current link in the main document.
+ This is important when Lynx is used with a speech or braille interface,
+ or a terminal which does not respond to the highlighting/color for the
+ current option. When show_cursor is off, the cursor is still positioned
+ to the right of the current option for curses, and is fully "hidden" in
+ the lower right corner for slang, so that the highlighting or color of
+ the current option can be used without the distraction of a blinking
+ cursor in the left-to-right reading field. - FM
+* Added ability to change the show_cursor setting via the 'o'ptions menu
+ and to save that as the default in the RC file (otherwise, the default
+ is still that set in userdefs.h or lynx.cfg). The -show_cursor command
+ line switch toggles the default, however obtained, homologously to the
+ -popup toggle. Updated the online 'h'elp accordingly (option_help.html
+ and Lynx_users_guide.html). - FM
+1997-06-12
+* Tweaks of the 1997-06-04 mods for restoring emphasis of WHEREIS search
+ targets in link names when they are changed to the current link or again
+ made non-current. When the link is made current, the first and last
+ characters of the link name never are emphasized, so they'll retain the
+ attributes/color for the current link, and the user can see (if sighted)
+ that the link was made current. With this change, the restoration of
+ emphasis also is interpretable with Unix FANCY_CURSES, so the block for
+ that is lifted. Note that I figured out why the bold+reverse+underline
+ combination doesn't work for that. The vanilla and this Lynx code are
+ not adding or subtracting attributes for their start_foo() and stop_foo()
+ functions (as is done for slang and VMS curses), but are replacing them,
+ so you always end up with the last attribute in a series of start_foo()
+ calls (underlining for the search target emphasis). I don't know if
+ ability to sum attributes applies to all Unix curses flavors for which
+ FANCY_CURSES is defined in the Makefile, so I left the Unix, non-slang
+ start_foo() and stop_foo() functions the way they are, for now. - FM
+* Mods in LYGetFile.c so that any '~' in file URLs is handled as when in
+ startfile, home page, or 'g'oto commands. Only the first '~' is converted
+ to Home_Dir(), and only for the first symbolic element in the URL, and if
+ it is followed by a username, that username is stripped (so that the
+ "~username" becomes a reference to the home of the account running Lynx,
+ as if only '~' had been used, and can't be used as a reference for an
+ arbitrary home). Note that we don't do this stripping for ftp URLs,
+ because the ftp server should decide, itself, whether to grant access to
+ arbitrary homes, based on the username and password that were used to
+ log in. Note, also, that if the account running Lynx is allowed access
+ to the root of the file system for its home, then access to any arbitrary
+ home in that file system can be gained from there. Access to the root
+ never is allowed for file URLs in the for-VMS code, but depends on the
+ root's protection in the for-Unix code. Also, any arbitrary path in file
+ URLs will be attempted if it is specified as an absolute path. The
+ stripping of the username from "~username" in most cases on Unix only
+ protects against probing for homes in other file systems, without the
+ user knowing the corresponding absolute path. - FM
+1997-06-11
+* Mods in HTAABrow.c, HTTP.c and HTAlert.c so that auth_proxy is no
+ longer a module wide global, and the structures which handle/create
+ authentication/authorization headers maintain separate setup trees
+ for proxy authentication/authorization versus for protected limbs of
+ http/https data trees (realms) on the same server. This ensures that
+ each proxy's template, which is the global '*' for all paths (that are
+ in fact full URLs) in its proxying requests, are kept distinct from
+ the templates for true paths of the protected limbs on the same saver,
+ even if the user fails to include that proxy in the no_proxy list, or
+ the server's WebMaster fails to do the equivalent configuration for
+ the server, and the realm names overlap. Also modified the prompt
+ strings for the username and password to be encrypted for protected
+ document requests versus for proxy access so that they indicate
+ explicitly whether the user's entries will be used for one or the
+ other. - FM
+* Added a -pauth=id:pw switch for proxy servers, homologous to the
+ -auth=id:pw switch for protected documents, along the lines of AJL's
+ patch. Note that the -pauth value is used only for authorization
+ headers to the first protected proxy server encountered, and the -auth
+ value is used only for the authorization headers in document requests
+ for the first protected limb encountered. Now that we have an explicit
+ switch for proxy authentication, it should be used explicitly for that,
+ instead of still allowing use of the -auth=id:pw switch for either
+ (IMHO). Also, there's no serious need to make inclusion of the code
+ for handling these switches a compilation option, because they are only
+ available to users with shell access. Updated the help files concerning
+ these switches, and included advice to make sure any script files which
+ use these switches have restricted access. - FM
+1997-06-09
+* More refinements of the code in GridText.c, HTML.c and LYCharUtils.c
+ for handling visible versus hidden links, blank lines, stripping of
+ the numbered brackets for links, and the interactions of these things
+ with soft hyphens. - FM
+1997-06-06
+* Fixed typos in LYrcFile.c which caused failure to start two comments
+ on new lines when writing to the RC file. - FM
+* Fixed a typo in the lead dot pair stripping code in LYLegitimizeHREF()
+ of LYCharUtils.c. - FM
+* Tweak of code in GridText.c for handling soft hyphens so that we don't
+ display a hyphen if it's the first character in the line, or is preceded
+ by a space, even if it is followed by a newline. - FM
+* Mods of the hidden link handling and numbered bracket stripping code in
+ GridText.c so that it succeeds no matter how many blank lines are in
+ the anchor content. - FM
+1997-06-04
+* Mods in LYLegitimizeHREF() of LYCharUtils.c for dealing more effectively
+ with fragments which have illegal characters, as is becoming common due
+ to authoring tools such as Microsoft's Frontpage and Netscape's HTML
+ editor. The actual URL-reference is still handled so as to yield a
+ fully legitimate absolute URL, without any unescaped spaces, but the
+ fragment is checked only for problem characters such as tab or newline,
+ and otherwise is unmodified. (Try the vanilla versus modified code with
+ the http://www.cnib.org/library/ww_flw96.htm atrocity, brought to you
+ discourtesy of Frontpage. :) - FM
+* Worked into the fotemods code use of bold+reverse+underline highlighting
+ of WHEREIS search hits for VMS curses, and slang on both VMS and Unix (with
+ or without the color mode on), and added code in highlight() of LYUtils.c
+ for restoring that highlighting when links are made current or non-current
+ if the string for the hit was contained within the string for the link (won't
+ be restored if the hit's string starts before or extends past the link's
+ string). Couldn't get any of this to work with curses and the solaris2
+ target, so for Unix curses the hit string still is just underlined and
+ not restored when links are made current or non-current. - FM
+* Fixed typo in the 1997-06-01 LYOptions.c mods. - FM
+1997-06-03
+* Mods in LYList.c to skip setting up a list block for visible links if
+ the document has only hidden links, and in HTML.c to include a notice
+ about this with a suggestion to use the 'l'ist command. Try it with
+ the http://www.sony.com/ atrocity. - FM
+* Tweak in LYMainLoop.c to fix a longstanding bug which would cause the
+ curdoc.line and curdoc.link numbers to be mishandled, and thus cause
+ the wrong page and current link to be restored on return to the document
+ via PREV_DOC or the History Page, if the document was fetched originally
+ with a fragment and a link on its first page had been activated. - FM
+* Tweaks in GridText.c so that returns from image map menus to parent
+ documents are not treated as if a different document is being sought,
+ and thus any no-cache directives associated with the parent will be
+ ignored unless another fetch is initiated within the parent or via
+ another, externally existing document. - FM
+* Added SEEK_FRAG_MAP_IN_CUR and SEEK_FRAG_AREA_IN_CUR configuration
+ (lynx.cfg) options for how to resolve USEMAP attribute values in
+ IMG or OBJECT tags and HREF attribute values in AREA tags when they
+ consist solely of a fragment (USEMAP="#frag" or HREF="#frag"). The
+ compilation default is TRUE, i.e., they are resolved with respect
+ to the current document's URL, even if the base is different, as is
+ being done for the HREF attribute values of Anchors and LINKs. The
+ compilation default seems to be working out, even though most of the
+ currently deployed browsers still use the base. - FM
+1997-06-02
+* Mods in LYMain.c so as not to require that a lone "-" argument for
+ invoking input of command line arguments from stdin be the only
+ argument on the actual command line. That requirement preluded use
+ of this feature when the command for invoking Lynx was aliased so
+ as to include arguments, because the lone "-" then could not be the
+ only argument. Also tweaked the code so that any stdin-derived
+ arguments which need to be processed early in main() are so processed.
+ The vanilla code had severely flawed logic in this respect. The
+ security considerations associated with switch handling have gotten
+ hairy beyond reasonable bounds, but I think I've thought it all through
+ (we'll see :), and have plugged some holes in the vanilla code for
+ this feature. Redirection of stdout and/or stderr to a file now also
+ works reliably in conjunction with this feature. - FM
+* Added an explanation in the PROBLEMS file of the bad getsockname() and
+ getpeername() functions within SOCKETSHR 0.9D which affect the ftp
+ gateway, and the URLs for Andy Harper's (A.HARPER@kcl.ac.uk) fixes of
+ the SOCKETSHR 0.9D sources. - FM
+* Cast LYLocal.c into the Lynx programming style. - FM
+1997-06-01
+* Added support for numbered form fields, and options in SELECT popups,
+ based on LE's patch. The LINKS_AND_FORM_FIELDS_ARE_NUMBERED keypad
+ mode can be defined in userdefs.h and via the 'o'ptions menu. When
+ in SELECT popups, the F_LINK_NUM ('0') command can be used in any mode
+ to invoke a "Select option (or page) number:" prompt, which can take
+ 'g' or 'p' suffixes, homologously to the
+ "Follow link (or goto link or page) number:"
+ prompt in the main document with popups retracted. Note that when in
+ the main document, the F_LINK_NUM command has an implied 'g' suffix
+ for form links (i.e., will position you on the form link, not, for
+ example, ACTIVATE a submit button), but *not* in popup windows (i.e.,
+ without a 'g' suffix, the option corresponding to the number will be
+ selected, and the popup will be retracted, as if you had pressed
+ ACTIVATE when positioned on that option). The 123p feature is quite
+ useful in popups with a very large number of options, and supplements
+ the HOME, END and WHEREIS functions for seeking positions in the list
+ (again, regardless of keypad mode, if F_LINK_NUM is used to invoke
+ the prompt). A "page" is defined as the number of lines within the
+ vertical dimension of the popup box. - FM
+* Mods in LYEdit.c to seek the current page and line when the editor
+ is sedt on VMS. - FM
+* Updated the online 'h'elp concerning the "Follow link (or page) number:"
+ and "Select option (or page) number:" features (Lynx_users_guide.html,
+ follow_help.html, keystroke_help.html and other_help.html). - FM
+* changes to help files to reflect the different prompt string. - KW
+1997-05-30
+* Worked in LE's patch for keeping track of whether links occur in an
+ underlining context, and if so, restore it when slang color is on and
+ a current link is made non-current, thereby actually dealing with the
+ longstanding bug discussed in the 1997-05-27 mods (This is just a hobby,
+ and I always reserve the right to change my mind! :). - FM
+* Mods of LYForms.c and LYStrings.c to deal with form field values too
+ long to fit in the line editor's buffer (such as long TEXTAREA values
+ which have no newlines in them). As much of the tail as fits in the
+ buffer is offered for editing, with statusline messages explaining the
+ situation. If the tail is modified, it is combined with the unmodified
+ head when the form field is made non-current. The result can be edited
+ further by making the form field current again. If the form has a
+ Reset button, it can be used to restore the original value. The
+ vanilla code would crash on buffer overflow (Ugh! A potential
+ security hole.). - FM
+1997-05-29
+* Restored underlining in conjunction with reversing for the current link
+ with slang when colors are being used, but not otherwise. - FM
+* The 1997-05-26 mods to bypass screen redraws on retractions of SELECT
+ popups when the selected OPTION was not changed worked properly only
+ for VMS curses. Tweaked the for-slang code so that it now works like
+ VMS curses (though not as efficiently). However, with Unix curses,
+ the delwin() - refresh() sequence does not restore what was there
+ before the popup was invoked, and none of the tweaks I tried got that
+ to work, so the poor Unix folks using Unix curses are now stuck again
+ with screen redraws for every popup retraction. - FM
+1997-05-27
+* Eliminated in the fotemods code underlining in conjunction with reversing
+ for the current link with slang, to avoid the longstanding bug of
+ underlining being lost (and distracting color changes occurring) when that
+ link ceases to be current and it was embedded in an underlined region of
+ text. The attributes of the current link can be better handled in the
+ development code based on configurable style sheets, so there's no
+ point letting this bug ride, nor trying to deal with it through
+ temporary internal mods, in the fotemods code set. - FM
+1997-05-26
+* Mods of display_title() in GridText.c to eliminate the "format"
+ mask as in KW's 1997-05-14 development code mods, and to make the
+ memory management more efficient. - FM
+* Mods of change_form_link() in LYForms.c to bypass the screen redraw
+ on retraction of a SELECT popup if the SELECT block is DISABLE-ed
+ or the selected OPTION was not changed. Note that the complete
+ elimination of the screen redraw in the 1997-05-20 development code
+ mods, i.e., even when the selected OPTION was changed, results in
+ the change not being made evident to the user in the retracted popup
+ unless the screen is redrawn fortuitously (e.g., due to subsequent
+ paging). - FM
+* Modified the caching-related changes of 1997-05-15 to LYMainLoop.c,
+ handling automatic reloading after a change of the User-Agent string
+ like after comparable other option changes.
+ We force a reload if "preferred document lan(G)uage"
+ or "preferred document c(H)arset" are changed via the 'o'ptions menu,
+ and to set the "reloading" flag for forcing a proxy cache refresh if
+ those or "user (A)gent" are changed and the current document has an
+ http, https or lynxcgi scheme, but not force a proxy cache refresh if
+ we're reloading due to an INLINE_TOGGLE, IMAGE_TOGGLE, or RAW_TOGGLE
+ command. - KW, FM
+1997-05-25
+* Mods in LYMain.c to convert $USER if present in the TEMP_SPACE
+ definition or LYNX_TEMP_SPACE environment variable to the string
+ returned by getenv("USER"). - FM
+* Fixed two typos for me->inFONT settings in HTML.c - TD
+* Added chmod(file, 0600) calls for most files created by Lynx. - FM
+1997-05-24
+* integrate patch JED's mods which support mouse for slang as well as add
+ new functions to encapsulate differences between slang/curses. - TD
+1997-05-21
+* Mods in HTML.c and LYCharUtils.c so that TABLE blocks are treated
+ as divisions in the DIV nest, with a default alignment of HT_LEFT
+ if the TABLE start tag lacks an ALIGN attribute, and otherwise,
+ that attribute's value. Nested TABLEs extend the DIV nest. This
+ avoids the problem in the vanilla code of TABLE content inheriting
+ the alignment of a containing CENTER or DIV which is intended for
+ alignment of the TABLE as a whole. Also added support for ALIGN
+ attributes in TR elements. If the TR has no ALIGN attribute, it
+ inherits that of the current division, which should be that of the
+ current TABLE. This, of course, still does not yield true TABLEs
+ for truly tabular content, but makes TABLEs used for formatting
+ more readable. - FM
+1997-05-20
+* correct 2 occurrences of "me->inFONT == TRUE;" in HTML.c - TD
+* add configure --with-color-style option to merge RP's alpha changes for
+ color styles (this works only with ncurses, since it does not initialize
+ the window background, leaving it null, thereby exploiting a bug in
+ ncurses which sets null backgrounds to a space). Also some whitespace
+ (and renamed CS to make this build w/o ncurses) - TD
+* test-built with ncurses 1.8.7, 1.9.4, 1.9.9e and 4.0, as well as bsd 4.4
+ curses and slang - TD
+* Tweak of HTFWriter.c so that it does the anti-spoof tests normally
+ done by tempname() (see the 1997-05-19 mods) in all cases for which
+ it changes the temporary file suffix from any of those checked by
+ tempname() itself. At this point, every way I've thought of for
+ trying to spoof Lynx via links for temporary files is blocked, but
+ people should beat on today's code to see if there's any spoofing
+ strategy I haven't yet blocked. - FM
+* Modified the Lynx Trace Log handling so that it doesn't use actual
+ redirection of stderr via freopen() calls, and restores the original
+ value of stderr during any escape to shell. This avoids the problem
+ on Unix that sh and ksh send their prompt strings to stderr, and that
+ bash sends both its prompt and command line echo to stderr, so they
+ end up in the log instead of being visible. I had tested the initial
+ design on VMS and with csh on Unix, and thus didn't notice this
+ foolishness for the other Unix shells. Anyway, it's OK for all of
+ them now. - FM
+* Tweaked SIGTSTP interrupt handler in the USE_SLANG for-unix code, so
+ that it gets set to SIG_DFL when stop_curses() is called, to prevent
+ strange interferences experienced when ^Z is used while a helper
+ process is in the foreground. - KW
+* Change in LYForms.c to prevent forced screen refresh after selection
+ from a popup box. - KW
+1997-05-19
+* Recognize Linux console F1 key in LYgetch() (applies if "-DNO_KEYPAD"
+ is in effect, as for all binaries built with slang). - KW
+* Protect LYgetch() against returning raw values of keypad() symbols
+ which are invalid when used later as an index into keymap[],
+ override[], etc. - KW
+* in the USE_SLANG for-unix start_curses(), honor the no_suspend flag
+ if set. This implements -restrictions=suspend handling for slang
+ (although it was intended for curses implementations which have
+ problems with ^Z within Lynx; see the PROBLEMS file).
+ Note that the no_suspend flag cannot be suspected to have
+ the desired effect if lynx is executed from a shell script, unless
+ the shell process forked for the script also ignores the SIGTSTP
+ signal generated (usually) by the ^Z key. Also if the user is
+ allowed to execute any helper process (VIEWER, PRINTER, etc.) which
+ does allow suspending while no_suspend is in effect for the Lynx
+ parent process (by overriding the SIG_IGN setting done by Lynx or by
+ other means), then suspending may still be possible, in addition to
+ strange effects either immediately or when the process or process group
+ is continued (wrong tty and screen state, zombie processes, total
+ hang of the session without any way to interrupt - you get the idea...).
+ Trying to use the suspend restriction in order to prevent users from
+ getting a shell prompt doesn't make much sense anyway when they are
+ allowed access to execute commands which may be interrupted or allow
+ escaping to a shell... - KW
+* Tweak of HTFile.c so that we no longer lose an LYforce_HTML_mode
+ directive if the file is gzipped or compressed and the uncompressed
+ suffix is not mapped to text/html. - FM
+* Modified tempname() in LYUtils.c so that it checks whether files
+ with the current PID and target count already exist, and if so,
+ increments the count until a name for a non-existing file has been
+ created. - FM
+1997-05-18
+* Mods in LYMainLoop.c and LYClean.c so that Control-G is treated as
+ a synonym for 'n'o in quit confirmation prompts. - FM
+* Mods in LYPrint.c to strip any gzip or compress suffix from the
+ suggested filename, on the assumption that we're deal with a text/html
+ or text/plain file that had a corresponding Content-Encoding and no
+ Content-Disposition: file; filename=name.suffix header indicating
+ the appropriate filename after uncompression. This assumption does
+ apply for our current ftp gateway, and for most present-day http
+ servers. This mod in turn ensures that text/html files which are
+ not being printed as source will have their uncompressed suffixes
+ converted to .txt, indicated that they are rendered. - FM
+1997-05-17
+* Fixed long-standing bug in display_page() of GridText.c. When it
+ was updating the links structures, it wasn't re-initializing the
+ form element if the links structure is not for a form field. - FM
+* Mods in HTML.c to deal more effectively with H# headers used instead
+ of LH in lists. We now, in effect, treat them fully as if they were
+ LH, so that their left indentations are in register with the current
+ list nesting depth, and we apply better error recovery in cases where
+ the author is mis-using H# for a FONT change rather than as an actual
+ header. - FM
+1997-05-16
+* Changed the line where a WHEREIS search target should preferably be
+ displayed to the 4th line (not counting the title line). This can
+ be changed by redefining SEARCH_GOAL_LINE in userdefs.h.
+ SEARCH_GOAL_LINE can also be a simple expression in terms of the
+ variable display_lines, e.g., `#define SEARCH_GOAL_LINE (display_lines/3)',
+ this should then automatically adapt to screen size changes (provided the
+ display system can deal with that...)
+ Note that this this goal line will normally not be used if the next
+ target, according to the algorithm Lynx uses, is already on the displayed
+ screen. Also, when the displayed page changes to show a search result,
+ there is no guarantee that it will end up on the line set by
+ SEARCH_GOAL_LINE. It should rather be regarded as a maximum.
+ For example the presence of anchors on the line with the target or on
+ the preceding lines will change the positioning. - KW
+* The SEARCH_GOAL_LINE line will also be used for "going to" a link with
+ 'g' suffix at the "Follow link ..." prompt, although the algorithm is
+ quite different. As for a search target, this only applies when Lynx
+ has to position to a different page of the document, and then is only
+ a maximum. - KW
+* Enabled the no-cache setting for the pseudo document Lynx creates for
+ a client-side image map in LYMap.c, for now. - KW
+* Minor typo fix for the proxy authentication mods. - FM
+* Tweak of PRE block handling in HTML.c to ensure an implied paragraph
+ after the block if it is in a list and not followed by an LI. - FM
+* Tweaks of SGML.c and LYCharUtils.c to allow any non-digit to terminate
+ a numeric character reference once at least one digit has been found in
+ the reference. - FM
+* Change in LYUnEscapeToLatinOne() to use isdigit() instead of isalnum()
+ for recognizing numeric character references like LYUnEscapeEntities()
+ does. - KW
+1997-05-15
+* Worked in JED's mods for taking a suspend into account during select()
+ calls. - FM
+* Mods in LYMainLoop.c to not force a cache refresh on a proxy any more
+ when INLINE_TOGGLE, IMAGE_TOGGLE, RAW_TOGGLE are used. On the other
+ hand, do force a proxy cache refresh after one of the variables relevant
+ for content negotiation `language' or `pref_charset' has been changed
+ from the Options screen, if the current document is from a http, https, or
+ lynxcgi resource. - KW
+* Set HTTP_ACCEPT_CHARSET environment variable for the child process in
+ LYCgi.c if pref_charset is not NULL. - KW
+* (chartrans) Write a META tag with the current display character sets to
+ the files generated for Bookmarks, List, Info, History, and Visited Links
+ pages, so title strings contained in those files will (hopefully) not
+ get erroneously translated again. Use new function LYaddMETAcharsetToFD()
+ in LUCharUtils for this purpose. - KW
+* (chartrans) makeuctb now sets RawUni to UCT_ENC_8BIT if not otherwise set
+ and if there are char values above 127. - KW
+* (chartrans) Change in HTuncache_current_document() to prevent caching of
+ UCStages info which should be discarded. Still allow caching for this
+ in the node_anchor for source display, so that a META tag in the parsed
+ HTML can influence the display after using the SOURCE '\' key. - KW
+1997-05-14
+* Don't use title in showlist() if it is empty, to prevent "hidden links"
+ on the List Page itself caused by documents with <TITLE></TITLE>. - KW
+* Changed display_title() in GridText.c to not rely on sprintf() to get
+ the number of blanks right. - KW
+* (chartrans) Added new lynx.cfg symbols ASSUME_CHARSET,
+ ASSUME_LOCAL_CHARSET, and ASSUME_UNREC_CHARSET. They are only
+ recognized if compiled with -DEXP_CHARTRANS. They correspond to the
+ command line options -assume_charset, -assume_local_charset, and
+ -assume_unrec_charset.
+ The default for ASSUME_CHARSET is iso-8859-1 (corresponding to display
+ character set "ISO Latin 1"). If no ASSUME_LOCAL_CHARSET is set,
+ the explicit or default value for ASSUME_CHARSET will also be used for
+ local files. ASSUME_UNREC_CHARSET has no default. See added text
+ in lynx.cfg. - KW
+* (chartrans) Changes in LYCharSets.c to HTMLSetCharacterHandling() and
+ HTMLSetUseDefaultRawMode() to support (hopefully) more consistent
+ and user-friendly handling of raw mode and its default.
+ Note that the following description does not apply if the display
+ character set is one of the CJK settings. In that case, -raw and
+ the corresponding Options setting is used as a CJK toggle as before.
+ Note that the -raw flag is a toggle. It changes the "raw mode"
+ setting from the default. The current setting of "raw mode" can be
+ seen on the Options screen, and is also shown in a statusline message
+ when the RAW_TOGGLE key (normally '@') is used.
+ The default depends on the display character set (as previously)
+ but now also on the ASSUME_CHARSET setting (as determined by a setting
+ in lynx.cfg, possibly overridden by -assume_charset on the command
+ line, or the default iso-8859-1). When the display character set
+ corresponds to the ASSUME_CHARSET, the default for "raw mode" is ON,
+ otherwise it is OFF.
+ The effect of "raw mode" on the interpretation of documents which have
+ no explicit charset label (from HTTP headers, a META tag, or otherwise)
+ is as follows. There is an internal "assume charset" which may differ
+ from the user-specified ASSUME_CHARSET value. When "raw mode" is set
+ ON, the internal variable is set to correspond to the display character
+ set. When "raw mode" is set OFF, the internal variable changes to
+ the user-specified ASSUME_CHARSET or, if that also corresponds to the
+ display character set (so that otherwise there would be no change),
+ reverts back to the iso-8859-1 Web default.
+ Raw mode doesn't imply total rawness. HTML character entities may
+ be expanded and translated with either setting, 8-bit characters which
+ are inappropriate for the display character set will not be sent to
+ the terminal. For a "more raw" setting, try the "Transparent" pseudo
+ display character set. - KW
+1997-05-13
+* Changed the compilation default in userdefs.h for USE_TRACE_LOG
+ to FALSE, for now. - KW
+* Code for "fixing" of relative http and https URLs which start with a
+ ../ segment from FM added, but it has to be enabled with the new
+ lynx.cfg symbol STRIP_DOTDOT_URLS (default currently set to FALSE).
+ See FM's description under 1997-04-23. - KW
+* Changed the test for dot segment fixing in LYLegitimizeHREF() so
+ that now (if enabled) it also applies when the http or https base URL
+ in effect does have a non-empty path but without any slashes in it
+ (beyond the initial one between host and path). The test was too narrow
+ before and did not recognize this case, so that an unmodified URL with
+ ../ in it would still be sent to the server and without generating a
+ statusline message. - KW
+* Tweak of case LYK_REFRESH: in LYMainLoop.c so that the REFRESH command
+ still invokes an obligatory, complete refresh of the screen for slang
+ on Unix with the new LY_SLclear() function (see 1997-05-09 mods),
+ by using scrollok() if USE_SLANG is defined. - FM
+* Changed the local variable name, lines, in follow_link_number() of
+ LYGetFile.c to nlines, to deal with the AIX 4.2 bug of treating lines
+ as a macro. Also changed the variable name, pages, to npages for
+ logical complementarity (they both refer to the total number). - FM
+* Mods in HTML.c, LYCharUtils.c and GridText.c to deal with links for
+ positioning, specified via NAME or ID attributes, when they are embedded
+ in Anchors which have an HREF, so that they now don't force premature
+ closing of those Anchors. Also tweaked the code for creating links for
+ the sources of images or other for-GUI embedded objects when clickable
+ images ('*') is toggled on, so they use those mods as well, when
+ possible. Note, however, that the clickable images feature is creating
+ Anchors with HREFs which aren't actually there, and still can create
+ technically invalid markup, on occasion, when the non-doctored markup
+ actually is valid. The latter mods still need some improvements in the
+ formatting, but are OK to use for now, and my brain hurts from trying
+ to think through all the possible markup we might encounter. - FM
+* Tweaks of the Lynx Trace Log handling to deal with reloads when the
+ HText structure for the log has been dumped. Made the first letter
+ of the filename uppercase (Lynx.trace), complementary to Lynx.leaks.
+ Eliminated the log from the Visited Links Page so it can't be sought
+ there as a forward link. Use the History Page if you want to 'd'ownload
+ the log, or use the 'p'rint option while viewing the log. Note that
+ suffix maps do tail matching, and thus the so-called suffixes need not
+ begin with a dot. If you want to use an external viewer for the log,
+ you can put:
+ SUFFIX:Lynx.trace:application/x-LynxTrace
+ VIEWER:application/x-LynxTrace:most +s %s
+ in your lynx.cfg, or their equivalents in your mime.types and mailcap
+ files. - FM
+* Tweaks in LYMainLoop.c to set newdoc.title for various special pages
+ generated by Lynx (History Page, Info Page, etc.) and when following
+ a link. - FM
+* Small change to the heuristics for New_DTD in start_element()
+ in SGML.c (try a bit more to close containing element if it's the
+ same tag) - KW
+1997-05-12
+* Added support for proxy authentication. - AJL, FM
+* Updated follow_help.html to indicate that 0 is the universal
+ F_LINK_NUM mapping for invoking the "Follow link (or ...) number:"
+ prompt. - FM
+1997-05-11
+* Tweaks in LYMainLoop.c to ensure that the LYforce_HTML_mode flag is
+ reset reliably, so it doesn't carry over to requests for text/plain
+ documents, as it was doing under some circumstances in the vanilla
+ code, e.g., when a bookmark file was used as the startfile via a
+ file://localhost/path URL rather than via the -book switch. - FM
+* Very minor change in Lynx_users_guide.html, added two words - KW
+1997-05-10
+* Fixed a typo in statusline() of LYUtils.c. The check for whether
+ the string is zero length before bothering to convert CJK multi-bytes
+ was checking a holding buffer instead of the string. - FM
+* Fixed a bug in LYHandleMETA() of LYCharUtils.c. The check for a
+ URL following the SECONDS value in REFRESH directives was not
+ taking into account that an EOL might follow the digits for the
+ SECONDS value. - FM
+* Changed the behavior of boolean_choice() in LYOptions.c so that the
+ cursor is positioned immediately at the option display line instead
+ of staying at the statusline instructions until an initial entry is
+ made, and modified the statusline instructions accordingly. - LE, FM
+* Added a check for a NULL pointer in the LYCookie.c code for blocking
+ sharing of SSL encrypted cookies with http servers, based on a patch
+ from RT, and added a comment on why code for a block based on the
+ scheme is there, despite its being redundant with the current blanket
+ restriction based of the ports. - FM
+* Mapped 0 to F_LINK_NUM (as suggested by KW), so that 0 invokes the
+ "Follow link (or goto link or page) number:" prompt under all
+ circumstances (but with the 0 not treated as the first digit of
+ the number entry). That's a better way
+ to do it, because then the F_LINK_NUM command and explanation always
+ appears in the "Current Key Map" display, and only the mappings of
+ numbers to functions drop out when going from NUMBERS_AS_ARROWS to
+ LINKS_ARE_NUMBERS mode (as they should, 'cuz the numbers no longer
+ are mapped to functions; though maybe they should stay mapped to
+ functions now that we have an explicit command key for invoking the
+ prompt; something to think about...). - FM
+* Updated the PROBLEMS file to indicate that you should try changing
+ -lresolve to -lbind if you have upgraded to the bind-8.1 or later
+ library on a Sun system and keep getting the message "Alert!: Unable
+ to connect to remote host". - FM
+1997-05-09
+* Typo fix in follow_help.html. - FM
+* Added an LY_SLclear() function in LYCurses.c as a more efficient
+ substitute for slang of the curses clear(), based on a patch from
+ JED. - FM
+* Added a USE_TRACE_LOG compilation (userdefs.h) symbol and -tlog command
+ line toggle of the compilation default (normally TRUE), for directing
+ syserr messages to a lynx.trace file in the user's home directory when
+ TRACE mode has been turned on (either via the -trace command line switch,
+ or the TOGGLE_TRACE (Control-T) command. Also added a TRACE_LOG command
+ (normally ';') for viewing the "Lynx Trace Log" (lynx.trace) at any time,
+ if one has been initiated during the current session. The trace log
+ feature is disabled automatically in anonymous or validation accounts,
+ and should not be used in any account which could have different users
+ simultaneously. The mods work well to the extent I've exercised them
+ thus far on VMS and for the solaris2 target, but possibly need more
+ refinements, depending on the behavior for other Unix flavors of
+ freopen(), which is used for redirecting stderr to the log. Updated
+ lynx.man, lynx.hlp, and the online 'h'elp to describe these new
+ features. - FM
+1997-05-08
+* Made the handling of hidden links dependent on a new command line
+ option. With -hiddenlinks=listonly hidden links are only shown on
+ 'l'ist screens and listings generated by -dump or from the 'p'rint
+ menu, but appear separately at the end of those lists.
+ With -hiddenlinks=ignore they don't appear even in listings.
+ With -hiddenlinks=merge hidden links are treated as before,
+ i.e., they show up as bracketed numbers if LINKS_ARE_NUMBERED is on,
+ and are numbered together with other links in the sequence of their
+ occurrence in the document. The default is -hiddenlinks=listonly.
+ Changed the new follow_help.html file accordingly.
+ This may help obviate an apparent need to call something a bug which
+ others regard as a feature... - KW
+* Function HText_AreDifferent() updated as in FM's code, but still
+ unused. - KW
+1997-05-07
+* Added another argument in follow_link_number() of LYGetFile.c for
+ returning the number entered at the "Follow link (or page) number:"
+ prompt to the mainloop(), and modified the statusline error messages
+ that may be issued from the mainloop() in conjunction the with 'g' or
+ 'p' suffixes so that they report that number when appropriate. - FM
+* Changed the prompt to "Follow link (or goto link or page) number:" - KW
+* Tweaked case HTML_DD: in HTML.c so that it checks whether a wrap
+ has just occurred naturally before imposing a newline for DD start
+ tags. Without that check, seemingly random, extra newlines could
+ occur in the DL/DT/DD blocks. - FM
+* Created a follow_help.html for the keystroke_commands subdirectory
+ of the online 'h'elp, describing the "Follow link (or page) number:"
+ features, and added links to it in Lynx_users_guide.html and
+ keystroke_help.html. - FM
+* Changed the help description according to what is implemented here - KW
+1997-05-06
+* Further tweaked KW's mainloop() tweak (see yesterday's entry), so that
+ newdoc.link is reinitialized properly when we're going to, but not
+ ACTIVATE-ing, a link in the current page due to a 'g' suffix for a
+ "Follow link (or page) number:" entry. Otherwise, if the number with
+ a 'g' suffix was used to make the last link on the current page the
+ current link, and then a NEXT_LINK command was used, one could end
+ up on a link beyond the first one in the next page. Also added a
+ statusline message if the 'g' suffix is used with a number which
+ corresponds to a link that already is current. - FM
+* Tweaked yesterday's LYList.c mods so that an OL with the CONTINUE
+ attribute is used when a "Hidden links:" list is appended to a
+ "Visible links:" list and NUMBERS_AS_ARROWS mode is on. This allows
+ you to see the number to enter at "Follow link (or page) number:"
+ prompts, as when LINKS_ARE_NUMBERED mode is on. - FM
+* Mods in HTML.c for LI and LH handling so that a pointless wrap will not
+ occur at the spacer following the bullet in UL blocks or the Arabic
+ number, Roman numeral, or upper- or lowercase letter in OL blocks if
+ the subsequent text has no spaces, itself, up to the right margin.
+ In such cases, that text now stays on the initial LI or LH line, and
+ wraps at the right margin to the left indentation for a second or
+ greater line in the LI or LH. - FM
+* Changes to avoid memory leaks in LYCookie.c - KW
+* Escape '<' and '>' characters (using the LYEntify functions) in URL
+ strings written to the temporary files for LIST and INFO screens, to
+ avoid invalid HTML and corrupted display as a result of URLs which
+ contain these characters (although they shouldn't) and have not been
+ escaped earlier. - KW
+* Changed the label for the currently selected link from "Filename:"
+ to "URL:", and fixed an alignment glitch for the 9th item on the
+ History and Visited Links pages. - KW
+* Changed an "8-bit" occurring in HtInit.c to "8bit", tweaked LYKeymap.c
+ comments. - KW
+1997-05-05
+* Added HText_AddHiddenLink(), HText_HiddenLinkCount(), and
+ HText_HiddenLinkAt() functions in GridText.c for keeping track of the
+ addresses (URL, plus fragment if present) for links that were converted
+ to hidden by HText_endAnchor() due to their having no visible link name,
+ and modified showlist() and printlist() in LYList.c so that if any hidden
+ links were create during the rendition, the "References in this document:"
+ menu for the 'l'ist command or appendix on dumps segregates and clearly
+ labels the visible versus hidden links. - FM
+* Plugged a memory leak in LYEntify() of LYCharUtils.c. - FM
+* Modified experimental DTD info to not close anchors when an invalid
+ P, H1-H6, or ADDRESS start tag is encountered, and to change error
+ recovery for P and MAP. - KW
+* Modified experimental DTD info and HTML.c to not close PRE when
+ an invalid FORM start tag is encountered, and to use the appropriate
+ handling for preformatted text if PRE is in effect but is not the top
+ element on HTML.c's stack. The HTStyle structure's freeFormat (which
+ wasn't used anywhere before) is now used as one test whether we are
+ within preformatted text, also corrected the style setting of freeFormat
+ for PRE in DefaultStyle.c. - KW
+* Changed internal gateways (in HTNews.c, HTFile.c, HTWAIS.c, HTWSRC.c)
+ to end LI, DT, and DD elements if they are not declared SGML_EMPTY,
+ so that HTML.c's stack won't get overloaded in this case. - KW
+* Tweaks in mainloop() handling of DO_GOTOLINK_STUFF and DO_GOTOPAGE_STUFF.
+ Going to a link with the 'g' suffix and then immediately ACTIVATing that
+ link could previously show the wrong page of the new document, since
+ newdoc.line was not being reset. - KW
+1997-05-03
+* (chartrans) Now always check for LYlowest_eightbit[current_char_set]
+ near the top of HText_appendCharacter(), to prevent writing C1 control
+ chars to the terminal if they are not valid as displayable characters
+ according to the selected "display character set" Option.
+ All this should be handled earlier in processing, and this check may
+ disappear again for testing, but somebody asked for it... - KW
+* (chartrans) Small changes to README files. - KW
+* In the section of HTUtils.h for non-autoconf builds, don't set
+ HAVE_KEYPAD or HAVE_TTYTYPE if USE_SLANG is defined. - KW
+* Modified HText_LinksInLines() to not count hidden form fields. - KW
+* Added support for setting an anchor's no_cache element based on a
+ comparison between Expires and Date headers if both were received
+ and we didn't set it based on a Cache-Control directive. Also
+ added equivalent support for a comparison between an Expires value
+ from a META tag and a Date header. We still compare Expires header
+ or META values versus the system time if no Date header was received,
+ and still do not accept Date values from META tags because they are
+ unlikely to be reliable. - FM
+1997-05-02
+* Fixed a bug in LYAddImageMap() of LYMap.c which could cause multiple
+ insertions of the same MAP into the LynxMaps structure, and crashes
+ on some systems due to the consequent multiple FREE()'s at exit. - FM
+1997-05-01
+* More mods in HTML.c, LYCharUtils.c and GridText.c for rational handling
+ of potentially wrapped form fields in PRE blocks. We now artificially
+ wrap the line if the form field would start within 6 columns from the
+ right margin. This makes sure that editing windows and the highlighted
+ segments of submit or reset buttons will not ever be ridiculously short,
+ and is homologous to our use of a collapsible space before input fields
+ and buttons when not in PRE blocks to promote a wrap there instead of
+ within the fields or buttons. - FM
+* Expanded the WHEREIS query support so that it also locates the values
+ of form fields within the current document and repositions or pages
+ accordingly, as for normal (Anchor) links and for text strings. Note
+ that if the hit was for an OPTION value in a retracted SELECT popup,
+ you are positioned on the retracted window, and must pop it up and
+ search again to be positioned on the OPTION value with the hit, unless
+ it already is the selected OPTION. The mods are hairy enough without
+ trying to do the latter automatically, at least for now. - FM
+1997-04-30
+* Quote the URL for external command (not for VMS or DOS or Windows)
+ to avoid dangerous chars and shell spoofing. - KW
+* Escape characters properly when constructing URLs from filenames
+ in LYConvertToURL. If a string given for startfile, home page, or
+ a goto command which does not already have the form of an absolute
+ URL starting with an URL scheme and which does not start with '~'
+ (but may start with '/') specifies an existing file or directory in
+ valid Unix-like format for the native filesystem, i.e., without using
+ escaping, it gets URL-escaped, otherwise it is assumed to already
+ be URL-escaped. - KW
+1997-04-29
+* Updated RP Styles 0.2 code, don't allow comma as separator between
+ fg and bg colors after all, fix the LYNX_VERSION string generation
+ in userdefs.h to have `-Styles' appended *within* the quoted string. - KW
+* Added support for a 'p' suffix, like the 'g' suffix for making a link
+ number the current link rather than ACTIVATE-ing it,
+ but for displaying the page indicated by the number preceding the
+ 'p' suffix entered at the "follow link (or goto link or page) number:"
+ prompt. [...] If the number
+ entered at the prompt is '1' or less followed by the 'p' suffix, or only
+ 'p' is entered, you get the same behavior as for the HOME command. If
+ the number is equal to or greater than the number of pages, you get the
+ last page displayed as you would if you had used successive PAGE_DOWN
+ commands from the HOME position to reach it. This differs from the END
+ command, which fills the screen with lines from the end of the document
+ if you are not already displaying the end of the document. Note that if
+ you enter a number without a suffix (to ACTIVATE the link with that number)
+ or with the 'g' suffix (to make the link with that number the current link)
+ it must correspond to a valid link number or an error statusline message
+ will be issued, in contrast to the 'p' suffix for which an out of range
+ number is treated as a request to display the first or last actual page in
+ the current document. - FM
+* Fixed some typos in lynx.man. - LV
+* More modifications of the anchor counting code for HTGetLinkInfo() in
+ GridText.c so that it properly skips hidden form fields and anchors
+ without selectable text. - KW
+* More modifications in GridText.c and HTML.c so that it deals rationally
+ with submit or reset button values, and the underscore placeholders for
+ other form fields, when in versus not in PRE blocks. The entire submit
+ or reset button values are now always displayed, whether or not a portion
+ of it was wrapped, but we still can only highlight the portion before the
+ wrap to indicate a link for submission of the form or for resetting the
+ form field values. - FM
+* Undid some mysterious changes in SIGHUP setting (SIG_IGN vs. SIG_DFL)
+ which had sneaked in in connection with adding the NOSIGHUP
+ conditional. - KW
+* Tweaks to New DTD's extra info for CENTER and H1..H6 - KW
+* New function HText_AreDifferent() from FM added to GridText.c, but
+ not used yet. - KW
+* Tweaks to WB's additions for external command: use strncasecomp, add
+ LYExtern.o to src/makefile.in, changed test for empty command. - KW
+* Changed LYKeymap.h and LYKeymap.c so they agree about the symbols
+ assigned to the new keys (SWITCH_DTD, EXTERN). - KW
+* correct minor syntax err that caused SCO 3.x to fail make-include
+ autoconf test. also, eliminate whitespace before '#' that causes
+ compile-fail on K&R compilers. - TD
+1997-04-28
+* Updated lynx_url_support.html so as to make clear that the offer to
+ include the currently displayed document with right-angle-bracket
+ prefixing for mailto, newsreply, and snewsreply URLs is made only if
+ the user has defined an external editor via the Options Menu, and that
+ the user is expected to edit this inclusion so that it retains only
+ those passages relevant to the email or followup message which the
+ user will add. - FM
+* Tweak of INPUT handling in HTML.c so that we use nbsp instead of any
+ spaces when loading a submit or reset button's actual value instead
+ of a series of underscores into the HText structure, so that we
+ still promote a wrap, if needed, at the space we ensured would be
+ present before each INPUT. - FM
+* Made first_option a structure member rather than a static variable
+ in HTML.c - KW
+1997-04-27
+* Tweak of Control-C and Control-G handling for popup_options() in
+ LYForms.c. They were being sought improperly as command keys rather
+ than as raw keyboard entries. Note that only Control-G should be
+ used as "cancel" within popup windows on Unix, because Control-C
+ is not being trapped to a handler as on VMS. - LE, FM
+* Tweak of the anchor counting code for HTGetLinkInfo() in GridText.c
+ so that it takes form fields into account when making a link current
+ based on a "Follow link number" entry with the 'g' suffix.
+ Also added comments to that code. - KW
+1997-04-25
+* Added information in the "Lynx bookmarks" section of the Users Guide
+ about appropriate versus unsupported modifications when editing the
+ bookmark files. - FM
+* RP Styles 0.2 fixed a bit and brought up to current experimental code
+ level (no autoconfig or simple-curses, only older version of Wayne's
+ mods, maybe something else is missing, too). No documentation, no
+ detailed checking, no real cleanup. Makefile slightly adapted,
+ but still needs changing for new systems - see comments there. - KW
+1997-04-24
+* Tweaks for enhanced mouse support in Win32 and hooks for 386 which
+ doesn't have mouse support yet. - WB
+* External command added. See LYExtern.* in src and lynx.cfg.
+ You need to define USE_EXTERNALS to compile this in. - WB
+1997-04-23
+* Modified LYCharUtils.c, HTML.c and LYMessages_en.h so that if a
+ partial reference (HREF or SRC value) would be resolved to an http
+ or https URL which has only two dots as the first symbolic element in
+ the path (e.g., http://host/../foo.html), such that the server would
+ reject the request, that element is excluded from the resultant URL,
+ but a statusline message is issued (once per document) about a bad
+ partial reference, as immediate feedback which might lead to the
+ document provider correcting the bad partial reference(s). We still
+ retain that first symbolic element, in compliance with the IETF RFCs
+ and IDs for resolving URLs, with other URL schemes (e.g., ftp). - FM
+* Added a skip_stack int to the HTML.h struct _HTStructured, to use
+ for flagging that the next call to HTML_start_element or
+ HTML_end_element is an internal shortcut and should skip pushing
+ or popping the HTML.c paragraph style stack even for elements
+ that are not declared SGML_EMPTY. Added a SET_SKIP_STACK macro
+ to HTML.c to set the flag, use it. - KW
+* Changes to HTML.c to better deal with a number of elements which may
+ or may not have been declared SGML_EMPTY in HTMLDTD.c:
+ if the last stacked element is HTML_OPTION, treat text as for
+ HTML_SELECT in HTML_put_character and HTML_put_character and
+ HTML_put_string. Added handling code for </P> to HTML_end_element
+ (similar but not identical to that for P in HTML_start_element).
+ Added check whether a SELECT is still open to FORM handling in
+ HTML_end_element. Added check whether a FORM is open to SELECT
+ handling in HTML_end_element. Added cases for end tags of
+ TABLE-related elements (TR, THEAD, TFOOT, TBODY, COLGROUP, TH, TD)
+ and of DT, DD, LH, LI, FONT, OVERLAY to the switch in
+ HTML_end_element, currently just break from the switch. - KW
+* Some tweaks and corrections to the additional element info and
+ to the content types used with New_DTD, in HTMLDTD.c. Made
+ OPTION non-empty. - KW
+* Now changed the tags_old[] in HTMLDTD.c, which is used with the
+ switchable "old" SGML parsing, to follow the changes for A, B,
+ BLINK, CITE, EM, FONT, I, STRONG, and U mentioned in the entry
+ of 1997-04-15. These, together with FORM and P, are all declared
+ as SGML_EMPTY now when the "old" SGML parsing is in effect, but
+ not with new parsing. - KW
+* Changes to LYMail.c and LYPrint.c to send Content-Transfer-Encoding
+ headers and/or a charset parameter when mailing, based on idea from
+ Hynek Med. Don't use charset if we only have 7-bit characters
+ anyway. If compiled with EXP_CHARTRANS, use MIME name corresponding
+ to display character set if it looks valid (not "x-"), otherwise
+ only an explicitly given document charset. In the chartrans case,
+ don't send charset parameter for CJK since it may be wrong... - KW
+* Added TRACE output to UCAuto.c - HM
+1997-04-22
+* refined check for slang libraries/headers by checking if $CFLAGS has been
+ set so that slang.h is in the search path - TD
+* add check to allow use of broken ncurses 1.9.9e's color - TD
+* add check for NGROUPS, TRUE, FALSE macro definitions - TD
+* remove top-level makefile.in targets that can be combined with the generic
+ target (more work required on the remaining ones) - TD
+* Plugged memory leak in deleteLinks() of HTAnchor.c. - KW
+* When dumping or outputting a rendered document via the 'p'rint menu,
+ Lynx would use the underscore placeholders for submit/image/reset
+ buttons as for other INPUT fields. We now load the values of
+ submit/image/reset buttons instead of placeholders into the HText
+ structure, so the values will be seen when dumping or outputting
+ via the 'p'rint menu. See the comments under case HTML_INPUT: in
+ HTML.c for the still less than optimal things that happen if a
+ wrap occurs within the INPUT value or placeholder strings, as might
+ happen in PRE blocks, or for strings wider than the screen. - LE, FM
+* SGML_abort() did not free memory used by the SGML.c parser stack.
+ Now it does, but still doesn't call HTML_end_element() for the
+ stacked elements (it's an abort after all...) - KW
+1997-04-21
+* Tweaks of the 1997-04-11 and 1997-04-09 mods in HText_endAnchor() of
+ GridText.c so as to take possible wrapping of Anchor content into
+ account when deciding whether or not to implement the Anchor as an
+ ACTIVATE-able link. - FM
+* New SGML.c parser, and new HTMLDTD.c with additional element info.
+ Extra content information for each tag is now included in the
+ HTTag structure, and given in an extended tags_new[] table in
+ HTMLDTD.c. Modified start_element() and end_element() in SGML.c
+ to perform some heuristic wind-downs of the parsing stack, based
+ on the extra element info. - KW
+* Revert treatment of some tags which were treated as SGML_EMPTY
+ before to their "natural" content model. No changes made to
+ HTML.c to accommodate this change, so results may differ where
+ HTML.c relies on previous hacks or has now handling code for
+ end tags of elements which were previously SGML_EMPTY. - KW
+* Made SGML parsing switchable between old and new HTMLDTD info
+ and SGML.c code, controlled by a New_DTD global variable and
+ LYK_SWITCH_DTD toggle key. Use (temporarily?) ^V for the toggle key.
+ This is not yet changeable via command line, lynx.cfg, etc., and the
+ default is New_DTD==YES (so that it gets tested :-) ). - KW
+* Made some of the error messages before exit in LYMainLoop.c and
+ LYMain.c go to stderr instead of stdout, but only for UNIX and,
+ in the case of the LYMainLoop.c messages, only if
+ dump_output_immediately was in effect. - KW
+1997-04-20
+* Tweaks in LYCharUtils.c to bind META CONTENT to a header value only
+ via an HTTP-EQUIV attribute (i.e., not via a NAME attribute). - FM
+* Mod in HTAccess.c to ignore the anchor's no_cache element if we're
+ seeking a position in the currently loaded document. - FM
+* Commented out the above change in HTAccess.c. There's a more complete
+ mechanism for it already in this code... - KW
+* Fixed a typo in the bookmark file lead text. - DK (Doug Kaufman
+ <dkaufman@rahul.net>)
+1997-04-19
+* Changed the inappropriate StrAllocCat() to StrAllocCopy() for
+ loading the XLOADIMAGE_COMMAND in LYReadCFG.c. - PC
+1997-04-18
+* Based on recent discussions in www-html@w3.org, added HY and SHY
+ to the DTD (treated as synonyms; one or the other is most likely
+ to be used in future HTML specs, so for now, we support both), as
+ markup equivalent to the named entity &shy; and numeric character
+ reference &#173; (soft hyphen). Note that Lynx implements soft
+ hyphens as specified in IETF RFC 2070 (link "HTML i18n" in the
+ Users Guide). Use of a tag instead of entity is preferable for
+ a soft hyphen because browsers which do not support soft hyphen
+ will ignore it as an "unknown tag" instead of inappropriately
+ inserting a hyphen or displaying the raw entity. Also added WBR,
+ which is handled like soft hyphen (indicating a permissible wrap
+ point), but does not insert a hyphen at the wrap. - FM
+1997-04-17
+* Mods in HTML.c, HTML.h, and LYMessages_en.h to issue an HTML stack
+ overrun message only once per document, and as a statusline message
+ if not in TRACE mode, and to check in HTML_end_element() for
+ correspondence between the SGML and HTML stacks if an overrun should
+ occur. - FM
+* Corrections in HTML.c for the bounds checks associated with DIV and
+ CENTER nesting levels, and for an HTML stack underrun. - KW
+* Plugged a memory leak under case HTML_IMG: of HTML_start_element() in
+ HTML.c, and removed an inappropriate if(){} in HText_endAnchor() of
+ GridText.c. - FM, KW
+* Modified the lead text created for bookmark files in LYBookmark.c so
+ that it indicates that an editor can be used to delete or reorder
+ the links, but that the format within lines should not be changed,
+ nor other HTML markup added. Note that the new lead text will be
+ used only when new bookmark files are created via the 'a'dd bookmark
+ link command. A new bookmark file is not created if the one being
+ sought already exists, so existing ones will still have the old
+ lead text. - FM
+1997-04-16
+* Extensive changes to try to keep track of whether a document (or
+ a location within it) was reached by an internal (fragment-only)
+ URL reference or not. The basic idea is to be serious about I-D
+ (currently) draft-fielding-url-syntax-04.txt.
+ URL references starting with '#' are always to the current
+ document (from which the reference is made). This leads to a
+ lot of hackery in HTML.c, LYMainLoop.c, LYHistory.c, etc. etc...
+ to distinguish a doc that was reached by an "internal" reference
+ from others. But it seems necessary to keep track of how the
+ reference to a fragment was specified, whether with a non-empty
+ "real" URL (possibly relative) preceding the '#' or without it,
+ all the way way from the HTML parsing to the mainloop. Only then
+ can the mainloop decide to not start a new retrieval for an internal
+ reference without skipping a new retrieval if a full URL reference
+ with fragment is made to a location in the same document (which
+ may be non-cachable or the result of a POST)...
+ This code prevents unnecessary/inappropriate POST form resubmissions
+ on following an internal link in a POST response, as they are
+ present for example in WebTechs validation results. - KW
+* A "Goto numbered link" feature. The user interface could be improved...
+ Start typing the link number, then add 'g' before hitting enter - KW
+* Some improvements to WHEREIS search. Will not always position
+ found string on first line (details depend on whether anchors are
+ present, usually will position in top third of screen), and avoid
+ some unnecessary screen updates. - KW
+1997-04-15
+* Miscellaneous additional tweaks in HTML.c for more robust error recovery
+ from bad HTML involving emphasis or style elements (B, BLINK, CITE, EM,
+ FONT, I, STRONG, and U), or HREF-less NAME-ed Anchors without matching
+ end tags. - FM
+* Modified the declarations in HTMLDTD.c and code in SGML.C, HTML.c, and
+ GridText.c to handle A, B, BLINK, CITE, EM, FONT, I, STRONG, and U
+ container elements homologously to the modified handling of FORM (see
+ 1997-04-05 mods) so that if they are invalidly interdigitated or have
+ spurious end tags in the markup, substitutions of the "expected" end
+ tags by the SGML.c stack-based parser will not be made, and without
+ messing up the HTML.c stack-based parser. Appears to work reliably
+ for all of the elements, and to be reasonably crash safe (hopefully
+ as safe as the vanilla v2.7.1), but there are no guarantees. - FM
+* Only *some* (most?) of the changes described in the above two
+ entries are used, as far as they change HTML.c. Not yet using the
+ changes to HTMLDTD.c and SGML.c. - KW
+* refined logic of SVr4 curses color support to test the no_color_video
+ attribute - TD
+* ifdef'd NCURSES_MOUSE_VERSION logic to allow build with ncurses 1.9.4 - TD
+* ifdef'd wgetbkgd misspelling to allow build with ncurses prior to 1.9.9g - TD
+* document USE_MOUSE configuration-option - TD
+* modify configure script and makefile.in templates to make BSDI_Makefile
+ obsolete - TD
+* rename config.h to lynx_cfg.h to minimize conflict when configuring against
+ ncurses or slang in nonstandard locations - TD
+* new autoconf macro CF_HEADER_PATH is used to make header-search for slang
+ the same as ncurses - TD
+* modify CF_CURSES_LIBS, CF_NCURSES_LIBS and CF_SLANG_LIBS to accommodate
+ predefinition of $LIBS variable - TD
+* corrected autoconf'd compiler flags for Ultrix - TD
+* add config.guess & config.sub to allow specialized host-type checks - TD
+* guard against redefinition of NO_FILIO_H - TD
+* use new autoconf macro CF_SYSTEM_MAIL_FLAGS -JES
+1997-04-14
+* Tweaked LYAddImageMap() in LYMap.c so that it removes all pre-existing
+ AREA element entries when updating MAP element content, and set the
+ no_cache anchor element in LYLoadIMGmap() so that the updated MAPs
+ always will be used when rendering. - FM
+* Not using the no_cache change from last entry, until further
+ investigation. - KW
+* Removed two spurious lines under case LYK_PRINT: in LYMainLoop.c
+ (from an old cut and paste from case LYK_HISTORY: done too late
+ at night 8-). - FM
+1997-04-13
+* Modified the handling of BASE for resolving HREFs in relation to MAP
+ and AREA elements, and USEMAPs in IMG and OBJECT elements. The
+ formally released code was treating such links equivalently to the
+ handling of fragments for positioning the display to ID-ed elements
+ or NAME-ed Anchors, and assuming they're in the same document if the
+ associated HREF value begins with a '#', rather than resolving versus
+ the BASE, and was always resolving versus the BASE for MAP ID or NAME
+ attributes, and for the AREA HREFs in MAP content. We now always
+ resolve the MAP ID or NAME attributes versus the current stream's
+ address (since the MAP must be in it or we wouldn't be handling it)
+ [...] According to the
+ original draft and the current HTML 3.2 Proposed Standard,
+ MAPs need not be in the same document as the IMG or OBJECT elements
+ which specify links to the MAPs. Because MAPs are "deferred objects",
+ they logically should be placed above any IMG or OBJECT elements which
+ reference them in the same document (as is done for SCRIPTs), but this
+ isn't stated in the specs, nor always done in practice. [...]
+ ([A]uthors who place the MAPs further down in the same document should be
+ informed about "deferred objects" and encouraged to move them up 8-). - FM
+* Use logical extension of the rules for HREF references also for
+ USEMAP references to MAPs: relative URL references are resolved with
+ respect to a BASE element if one is present in the document where they
+ occur, unless they are URL references without a URL, i.e., only a
+ fragment starting with '#'. In the latter case they are taken as
+ internal references referring to a MAP in the same document where
+ the USEMAP occurs, whether the MAP occurs before the USEMAP (as it
+ should, according to previous entry) or after the USEMAP.
+ HREF's in AREA elements follow the same rules. - KW
+* Fixed bug in HTML_free() for the case when LYMapsOnly is set. We
+ didn't create an HText structure for the stream (just scanned it for
+ MAPs and processed them into LYMap.c's LynxMaps structure), nor do
+ we want to create a blank one (as was being done) since we didn't
+ render the stream, nor would we have a me->target set. So we just
+ free any me elements that might still be allocated (though they
+ should have been freed already), and return rather than continuing
+ through the rest of the HTML_free() code. - FM
+1997-04-11
+* Fixed bugs in Gridtext.c and HTML.c which could cause mishandling
+ of anchors in LINKS_ARE_NUMBERS mode if a line wrap occurred in
+ the numbered bracket or the anchor content following the bracket,
+ and failures to suppress the numbered bracket if the anchor content
+ was empty due to ALT="" in an IMG tag, or if Lynx was configured or
+ toggled to suppress the link for the server-side image map if both
+ ISMAP and USEMAP attributes were present in the IMG tag. - FM
+* Only using the number-removing code under additional conditions:
+ ISMAPs which appear together with USEMAPs and which are suppressed
+ with LYNoISMAPifUSEMAP in LINKS_ARE_NUMBERS mode. - KW
+* Extended the disk_save restriction to the print menu as well as
+ the download menu, and accordingly updated lynx.hlp, lynx.man, and
+ Lynx_users_guide.html. - HN, FM
+1997-04-09
+* Many changes to further the Win32 and 386 ports. An emulation of
+ the HTVMS_ calls was used to try and cover all the DOS'izms.
+ A specialized ifdef for pdcurses color mapping added. Some keypad
+ tweaks. More generalized process spawning. .lynxrc is lynx.rc for 386 - WB
+* Tweak to ensure that a newline isn't inserted by virtue of a
+ FORM start tag if it's in the first line of a list element and
+ no text precedes it other than a UL's bullet or OL's number
+ on that line. - FM
+* Added pauses for the "Bad HTML" statusline messages under cases
+ HTML_HTML and HTML_BODY in HTML_end_element(), and eliminated
+ their checks for an unclosed FORM because we no longer expect
+ that to cause a serious problem. - LE, FM
+* Added a NO_ISMAP_IF_USEMAP configuration symbol and -ismap
+ command line toggle for suppressing inclusion of a link for the
+ server-side-image-map if an IMG or OBJECT element has both ISMAP
+ and USEMAP attributes such that a client-side-image-map link is
+ created. Updated lynx.man, lynx.hlp and Lynx_users_guide.html
+ accordingly. - FM
+* Fixed a glitch in HText_endAnchor() of Gridtext.c which could
+ cause dangling Anchors in LINKS_ARE_NUMBERED mode if the Anchor's
+ content was handled in a manner which caused it to become zero
+ length. - FM
+* Moved handling for NEWS_POSTING in LYReadCFG.c to the right place,
+ so that it can actually have an effect. - LV
+* Typo fixes for the comment concerning NO_ANONYMOUS_EMAIL in
+ userdefs.h - HN, FM
+1997-04-08
+* New translation table koi8r_uni for KOI8-R charset. Lynx can now
+ translate between iso-8859-5 and KOI8-R, at least for the Cyrillic
+ characters present in both. - KW
+* New translation table def7_uni with default 7-bit mappings
+ (replacement representation). Based on RFC1345 and mnemonic,ds
+ from ftp://dkuug.dk/i18n/ and previous Lynx replacements
+ in LYCharSets.c and IPA FAQ convention and stuff for Ethiopic and
+ KOI8-R. It maps many of the accented Latin characters present in
+ Unicode to their unaccented counterparts. This table is now
+ used for the "7 bit approximations" display "character set". - KW
+* Entities for Latin2 characters added to HTMLDTD.c These also
+ include many entity names for ASCII characters, and characters
+ which are in both iso-8859-1 and iso-8859-2. - Hynek Med
+* Changes to the non-chartrans translation tables in LYCharSets.c
+ for &Dstrok;, &ETH;, and &eth;. Treat &Dstrok; more like
+ an entity for the (Latin-2) Unicode character U+0110, since
+ that seems to be SGML standard usage. - KW
+* Added mappings for some "smart quote" characters to several
+ translation tables. - KW
+* Make makeuctb slightly more flexible (accept unicode range for
+ mapping to single code point). - KW
+1997-04-07
+* Took out special-case handling in the curses-color code for underlining
+ when lynx is running under Linux using the linux console with color.
+ The code was introduced on 1997-03-12 and would ignore "smul" capability
+ info from terminfo or termcap under those circumstances, always using
+ bold instead of underline. - KW
+* Slightly modified the FORM handling patch of 1997-04-05, as follows:
+ Use a generic test for a non-SGML_EMPTY element for bypassing the
+ stack pop in HTML_end_element() of HTML.c instead of an explicit
+ test for HTML_FORM. - KW
+1997-04-06
+* Patch for IMG elements which have both ISMAP and USEMAP in effect.
+ In HTML_start_element() don't generate the "[ISMAP]-" string for
+ output in this case, unless clickable_images is set TRUE. - KW
+1997-04-05
+* Patch for Lynx v2.7.1 to handle invalidly interdigitated container
+ elements or spurious container end tags without substitutions of
+ "expected" FORM end tags by the SGML.c stack-based parser, and
+ without messing up the HTML.c stack-based parser. Reliably succeeds
+ in not closing FORMs before all of the FORM elements, including
+ submit buttons, have been processed. Should be reasonably crash
+ safe (hopefully as safe as the vanilla v2.7.1), but there are no
+ guarantees. - FM
+1997-04-04
+============================================================================
+--- Release of Lynx2-7 + BUGFIXES as Lynx v2.7.1 (April 4, 1997) by FM ---
+============================================================================
+* Note that 2.7.1 was not a release from this code set, but all 2.7 -> 2.7.1
+ bugfixes and other changes are also included in this code set, in either
+ identical or equivalent form. Therefore the entries below this point
+ comprise the 2.7 -> 2.7.1 changes, and additionally other changes made to
+ the development code set during that time. - KW
+1997-04-02
+* add Andrew Kuchling's patch to support mouse-clicks with ncurses. - TD
+* refine tests that address porting problems to SCO (detecting struct winsize,
+ workaround for misdefinition of 'remove') - TD
+* refine CF_COLOR_CURSES test to avoid ncurses 1.9.9e bugs. - TD
+* refine CF_PATH_PROG to allow for machines that haven't the given programs,
+ by using only the program name and added configure option
+ --disable-full-paths to enforce this behavior. - TD
+* fixes for some gcc compiler warnings (missing prototypes, unused variables,
+ uninitialized variables, shadowed variables). - TD
+* Fixed typos in LYHistory.c, LYMail.c and LYMain.c which caused
+ failures of flag setting in the distributed code. - TD
+* correct cast in HTFWriter.c that may break if atoi() is not prototyped. - TD
+* add top-level makefile target 'maintainer-clean', use this to remove
+ Lynx.prj - TD
+1997-03-31
+* Added a missing check for whether the fragment token is NULL in
+ LYConvertToURL() of LYUtils.c. Without the check, the for-Unix code
+ could crash if a local file spec was entered as a startfile or goto
+ with escaped characters. - KW
+* Mod in HTML.c to retain "[INLINE]" as the default ALT string if an
+ IMG element has an ISMAP attribute but is not in Anchor content such
+ that it could not in fact function as a server-side image map. - FM
+1997-03-27
+* In mainloop(), after the call to HText_pageDisplay() following a change
+ of the document view, ensure that curdoc.link does not remain set to -1
+ if there are any links on the screen. This would otherwise happen if
+ a document is pushed to the history stack while there are no links, and
+ later popped (and refreshed) after one or more links have been created.
+ This change prevents segmentation faults which occurred after creation
+ of a new file in a previously empty directory via the DIRED menu. The
+ access to invalid memory only occurred if the screen showing the empty
+ directory did not have a parent dir reference link (which is always the
+ case if NO_PARENT_DIR_REFERENCE was specified at compilation time). - KW
+* In LYLocal.c, modified the code handling DIRED_MENU to do more careful
+ checking of the selected file. In addition to "TAG", "FILE", and "DIR",
+ DIRED_MENU definitions in lynx.cfg now also recognize LINK as a type.
+ DIRED_MENU definitions with a type field of "LINK" are only used if the
+ current selection is a symbolic link ("FILE" and "DIR" definitions are
+ not used in that case). The default menu definitions have been updated
+ to reflect this change, and to avoid the showing of menu items whose
+ action would always fail - KW
+* Some cleanup to eliminate compiler warnings, remove some unused
+ variables - KW
+* Fixed a typo and added comments for the code in LYMainLoop.c which
+ decides whether to load the URLs for homepage and/or startfile into
+ the goto buffer at startup. The typo in the distributed code caused
+ the startfile URL always to be added to the goto buffer, even if
+ it had POST content such that it could be resent inappropriately
+ as a GET request via the goto buffer. - FM
+* Added a bsdi-slang target to the Makefile. - Laura Eaves
+1997-03-26
+* Changed highlighting of strings found by a WHEREIS ('/') search.
+ Now uses Christmas tree attribute combination ("all bits are on"),
+ which with color support translates to COLOR:7. - KW
+* Modified the HTStream structure and associated code in src/HTFWriter.c
+ so that we save and use the relevant content of the associated
+ HTPresentation structure as two HTFormat elements rather than via a
+ pointer to the HTPresentation structure itself, because the latter
+ structure might not be valid under some circumstances when
+ HTFWriter_free() is called. The distributed code might indirectly
+ result in segmentation faults during downloading on Linux and some
+ other flavors of Unix (though they don't occur for most flavors, or
+ on VMS). - KW
+1997-03-23
+* Further reduction of top-level makefile.in by moving definitions out of
+ WWW/Implementation/*/Makefile, so only one is needed for autoconfigured
+ build (i.e., WWW/Implementation/unix/Makefile). This highlights the
+ remaining differences between the top-level targets - TD
+* Make configure script generate Unix makefiles in subdirectories, a step
+ toward being able to run make from any directory, for development - TD
+* Add autoconf tests for paths of programs, including sendmail vs mmdf - TD
+* Add configure script options for development (--disable-echo, --enable-debug,
+ --enable-find-leaks, --enable-warnings) - TD
+* Allow user to override search path for ncurses header by setting $CFLAGS or
+ $CPPFLAGS - TD
+* Correct array limit in LYCurses.c for SVr4 color support - TD
+* Use addstr rather than printw in popup-forms to address concern about 8-bit
+ characters - TD
+1997-03-21
+* Changes in auto config handling of ncurses header location, function
+ used for reading terminal input, some other system dependent tweaks
+ (including SCO broken remove, time.h) - TD
+* Fix for popup handling with late ncurses versions (uses wprintw
+ instead of waddstr in LYForms.c) - TD
+* Mods in LYPrint.c to use ".txt" as the output file extension for
+ all rendered text/html files regardless of their original extension.
+ The distributed code was doing this only for ones with an extension
+ of ".html". The original extension still is retained if the file
+ is being output as source. - FM
+* Added protection against passing a NULL pointer for path_url to
+ render_item() from dired_options() in LYLocal.c. - GN
+1997-03-20
+* Tweaked the protection against URLs directed to port 19 or port 25 so
+ that it can't be circumvented via lead zeros in the port numbers. - FM
+* Changed the compilation default so as not to send From MIME headers to
+ http or https servers. The default can still be changed via lynx.cfg.
+ Replaced the -nofrom disabling switch to a -from switch for toggling
+ the compilation or configuration default. Sending the From header
+ has become widely regarded as an invasion of privacy risk, particularly
+ in conjunction with cookie support. - FM
+* Corrected a typo in the lynx.cfg comments concerning TRUSTED_LYNXCGI
+ rules. - KW
+1997-03-17
+* Mods of LYNews.c and LYMail.c to prepend a "-- " separator before
+ appending the LYNX_SIG_FILE signature file to news and email
+ messages. - FM
+* Made the installation mode 755 in the top-level Makefile. The
+ distributed code used 555, and some install commands were unable
+ to do the strip. - LV
+1997-03-14
+* Corrected typos and expanded the comments concerning lynxcgi symbols
+ in userdefs.h and lynx.cfg. - FM
+* Modified SGML.c to handle the numeric character reference &#8482; as
+ the named entity &trade; also in the non-chartrans case. The
+ trademark character (given by &#8482; or &trade;) will be shown as
+ "(TM)" as the ASCII substitution unless the current display character
+ has a code point for the trademark character or unless overridden by a
+ chartrans translation table. The code of 1997-02-25 prevented showing
+ the trademark sign as "(R)" but did not work in all non-chartrans
+ cases. - KW
+* Include time.h via tcp.h for SVR4 systems. The tcp.h header does include
+ sys/time.h for Unix systems, but this apparently doesn't get struct tm
+ and extern char * ctime() declared for SVR4. - FM
+1997-03-13
+* Added protection in LYGetFile.c against connections to the port 25
+ ESMTP service. - FM
+1997-03-12
+* (chartrans) Make compilation in src/chrtrans less verbose, no more
+ generating automatic *.h_old backup copies. - KW
+* Refinement to the SVr4 (ncurses) color support, allowing it
+ to more closely model the slang support. - TD
+1997-03-11
+* Tweak for command line parsing of files with no URL in LYUtils.c.
+ Also added ability to pass partial domain names in the DJGPP version. - WB
+* Added the closing function for Win32 TCP in LYExit.c (did anyone see a
+ difference?!). - WB
+* Altered LYCurses.c so that the DJGPP version could spawn other programs
+ without certain death. - WB
+* Ignoring the whole ~/lynx.cfg problem (expanding '~') entirely for the
+ Win32 version for now. - WB
+* Some other tweaks for Win32 and DJGPP - WB
+* Added protection in LYGetFile.c against denial of service attacks via
+ the port 19 CHARGEN service. The distributed code left Lynx or proxies
+ vulnerable to such attacks via direct or redirection URLs. - FM
+1997-03-10
+* Fixed error in the handling of numeric character references with values
+ greater than 255 in SGML.c. The distributed code was breaking after
+ substitutions instead of falling through to reset the string chunk and
+ recycle the terminator if not a semi-colon. - FM
+1997-03-09
+* Integrated (simple) color, auto-configure patches with 2.7 following
+ chrtrans patch - TD (T.Dickey), JES (J.Spath)
+1997-03-08
+* Fixed error in the switch positioning of checks for XLOADIMAGE_COMMAND
+ and wais_proxy in LYReadCFG.c. The distributed code had them reversed
+ under case 'W' versus case 'X'. - PDS
+* Expanded the copyright and licensing statements in the -version
+ output. - FM
+1997-03-04
+* Corrected the offset computation in textsearch() of LYSearch.c so that
+ WHEREIS searches repeated on a page with no links seek the target
+ starting at the line immediately following the last displayed. The
+ distributed code was setting a greater offset. - JES
+1997-03-02
+* Don't entify post content for the showinfo display, now that we are
+ making it an XMP block in that display to handle all of the supported
+ enctypes. - FM
+* Patches to fix mail and FTP for Win32 (LYMail.c, HTFile.c). - WB
+* Makefiles to compile chartrans code for Win32. - WB
+* (chartrans) Minor cleanups (makeuctb.c, chrtrans/Makefile, HTPlain.c)
+ to enable successful compilation on Win32. - KW
+1997-02-28
+* Changed all references to "image/*" to just "image" in the userdefs.h
+ and lynx.cfg comments about XLOADIMAGE_COMMAND. The "/*" within the
+ userdefs.h comments was generating warnings from some compilers. - FM
+* Added a snake-slang target to the Makefile, and added -DUNIX to the
+ LYFLAGS for the snake3 and snake3-slang targets (HP-UX apparently does
+ not define "unix" itself with the -Ae switch, and thus needs to have
+ that definition forced via -DUNIX). - HL
+* Merged with patches and makefiles from Wayne Buttles
+ (buttles@wsb.champlain.edu) to enable compilation in two new environments:
+ Win32 (95/NT) with Borland C++ 4.52 compiler, and 386 DOS with DJGPP
+ compiler. To add ports for Win32 (95/NT) and 386 DOS computers with a
+ packet driver, four new defines were created: _WINDOWS (Defined for Win32
+ specific code - Mostly TCP related), DJGPP (Defined for 386 specific code -
+ Mostly TCP related), DOSPATH (Defined for any DOS'ish computer), and
+ NOSIGHUP (Defined for computers not supporting sighup signal calls).
+ Separate utility programs needed for compiling and running Lynx on those
+ platforms are available from Wayne at
+ <http://www.fdisk.com/doslynx/wlynx/>. - WB, KW
+* Fixed Telnet for Win32 - WB
+* (chartrans) Small correction in SGML.c (set_chartrans_handling) - KW
+1997-02-26
+* Close both descriptors of the pipe() for the NSL_FORK enabled code
+ in HTTCP.c. The distributed code was closing only one of them on
+ completed gethostbyname() calls, and neither on 'z'aps. - FM
+* Changed the HREF for the "Lynx FAQ" link in the online 'h'elp to
+ its new URL (http://www.slcc.edu/lynx/faq.html). - FM
+1997-02-25
+* More reverse engineering to cope with Netscape's bogus cookie header
+ parsing. The parser must not require an '=' between the expires
+ attribute name and value, because Set-Cookie headers are being
+ transmitted without it (e.g., by http://law.agps.gov.au). So Lynx
+ now treats that as another special case. - FM
+* Cope with invalid use of expires attributes in Version 1 cookies.
+ An -06 State Management draft recommends that for "backward
+ compatibility", and has been severely criticized in the HTTP-WG,
+ but it would be foolish not to assume Netscape will do that. See the
+ expanded comments in LYSetCookie() of LYCookie.c for more information.
+ Note that "expires" thus cannot be used as a Version 1 cookie name, but
+ a provider would be foolish to use that, anyway. Note also that the
+ possibility of using different header names for Version 1 versus
+ Version 0 (a.k.a., "Netscape") cookies is being discussed in the
+ HTTP-WG, which might have been better to do in the first place, but
+ the -05 draft has been approved as RFC 2109:
+ http://info.internet.isi.edu/in-notes/rfc/files/rfc2109.txt
+ so it would be a while before that were done, if ever. - FM
+* chartrans code for translation of character sets, handling of Unicode,
+ and i18n updated for Lynx 2.7. Support for CHARSET attribute on A
+ tags. New directory src/chrtrans with table files. Compilation flags
+ -DEXP_CHARTRANS, -DEXP_CHARTRANS_AUTOSWITCH (for Linux),
+ -DSLANG_MBCS_HACK (for raw unicode console).
+ New command line options when compiled with -DEXP_CHARTRANS, i.e.,
+ "-assume_charset", "-assume_local_charset", "-assume_unrec_charset".
+ See README.chartrans and README files in src/chrtrans for more info.
+ INFO screen shows of effective charset even if not given explicitly.
+ Translation routines in LYCharUtils.c not chartrans-ified at this point - KW
+* No showing of &trade; or &#8482; as (R) any more, use (TM) instead. - KW
+* Prefer HTTP-EQUIV over NAME in META tags. - KW
+1997-02-22
+* Fixed a memory management glitch which could cause a crash if the
+ MIME type of a reply to a FORM submission with METHOD=POST caused a
+ download offer to be invoked. - FM
+* Don't simplify ftp URLs by trimming trailing slashes if the URL is
+ being proxied. The Netscape proxy server for some unknown reason
+ can return redirection for ftp URLs with the slash appended, and
+ trimming it can result in a redirection loop. Based on a posted
+ patch from KW. - FM
+* Fixed two typos in the checks for HTPassHighCtrlRaw in LYExpandString()
+ of LYCharUtils.c. - KW
+* Fixed typo in the equality check on line 1553 in HTGopher.c. - FM
+1997-02-19
+* Reset the host string after an '@', if present, when trimming default
+ ":port" fields in the new code aimed at compliance with the Masinter
+ and Fielding URL drafts, expected to replace RFCs 1738 and 1808. The
+ distributed code neglected to do that, and was ending up on a ":password"
+ field, if present, instead of on the ":port" field, causing the username
+ to be treated as the host name. - FM
+* Expand the default port trimming so as to include all of the registered
+ URL schemes which support a port field in the v2.7 release. - FM
+* Correctly uncache the current directory listing when invoking an 'u'pload,
+ so that it will be updated to include the uploaded file if placed in the
+ current directory. The released code attempted to do this in a manner
+ which prevented a pop, so that the directory listing couldn't be restored
+ on return from the uploader menu. - FM
+* Recognize a bookmark file used as the startfile, whether it resides in the
+ home directory or in a subdirectory off home. The released code failed if
+ the file was in home, and not in a subdirectory, unless the -book switch
+ was used instead of a startfile entry or WWW_HOME variable. - FM
diff --git a/docs/CRAWL.announce b/docs/CRAWL.announce
new file mode 100644
index 0000000..b38be12
--- /dev/null
+++ b/docs/CRAWL.announce
@@ -0,0 +1,131 @@
+The TRAVERSAL code from old versions of Lynx has been upgraded by David
+Mathog (mathog@seqaxp.bio.caltech.edu) so that it works again, can be
+implemented via a command line switch (-traversal) instead of via a
+compilation symbol for creating a separate Lynx executable as in those
+previous versions, and can be used in conjunction with a -crawl switch
+to make Lynx a front end for a Web Crawler.
+
+
+Usage:
+
+ lynx [-traversal] [-realm] [-crawl] ["startpage"]
+
+
+Added switches are:
+
+ -traversal Follow all http links derived from startpage that are
+ on the same server as startpage. If startpage isn't
+ specified then the traversal begins with the default
+ startfile or WWW_HOME.
+
+ -realm Further restrict http links to ones in the same realm
+ (having a matching base URI) as the startpage (e.g.,
+ http://host/~user/ will restrict the traversal to that
+ user's public html tree).
+
+ -crawl With [-traversal] outputs each unique hypertext page
+ as an lnk###########.dat file in the format specified
+ below. With [-dump] outputs only the startpage, in
+ the same format, to stdout.
+
+
+Note on startpage:
+
+ If a startpage is specified and contains any uppercase
+ characters, on VMS it should be enclosed in double-quotes.
+ The code that extracts the access and host fields from
+ startpage for comparisons with links to ensure they are
+ not on another server, and the comparisons with already
+ traversed links, are case sensitive, and the startpage
+ will go to all lowercase on VMS if no double-quotes are
+ supplied, such that it might be treated as a new link if
+ encountered with uppercase letters.
+
+
+Files created and/or used with the -traversal switch, based on definitions
+in userdefs.h:
+
+TRAVERSE_FILE (traverse.dat):
+ Contains a list of all URLs that were traversed. Note
+ that if a URL appears in this file it will not be
+ traversed again (important if runs are started and
+ stopped). Placing an entry in this file BEFORE the
+ run will block traversal of that URL. Unlike reject.dat
+ a final * has no effect (see below). Note that Lynx
+ internal client-side image MAP URLs will be included in
+ this file (e.g., LYNXIMGMAP:http://server/foo.html#map1),
+ in addition to the "real" (external) http URLs.
+
+TRAVERSE_FOUND_FILE (traverse2.dat):
+ Contains a list of all URLs that were traversed, in the
+ order encountered or re-encountered (but not re-travered)
+ during a traversal run, and the TITLEs of the documents
+ (separated from the URLs by TABs) A URL and TITLE may be
+ present in this list many times. To simplify the list,
+ on VMS use: sort/nodups traverse2.dat;1 ;2
+ Note that the URLs and TITLEs of the Lynx internal
+ client-side image MAP pseudo-documents will not be
+ included in this file, though "traversed", but only the
+ http URLs and TITLEs derived from the MAP's AREA tag
+ HREFs that were traversed.
+
+TRAVERSE_REJECT_FILE (reject.dat):
+ Contains a list of URLs that have been rejected from the
+ traversal. Once a URL has been entered in this list, it
+ will not be traversed. URLs that end in a * will cause
+ rejection of all URLs that match up to the character before
+ the *. So for instance, to reject all htbin references on a
+ site put this line in the reject.dat file BEFORE starting
+ the run: http://www.site.wherever:8000/htbin*
+
+TRAVERSE_ERRORS (traverse.errors):
+ A list of links that could not be accessed or had an
+ unknown status returned by the http server. If the
+ owner of the document containing the link is know via
+ a LINK REV="made" HREF="mailto:foo" in it and the
+ MAIL_SYSTEM_ERROR_LOGGING was set true in userdefs.h
+ or lynx.cfg (not recommended!!!), a message about the
+ problem will be mailed to the owner as well.
+
+
+Files created during traversals if the -crawl switch is included with the
+-traversal switch:
+
+lnk########.dat Numbered output files containing the contents of traversed
+ hypertext documents in text format. All hypertext links
+ within the document have been stripped, and the URL and
+ TITLE of the document are recorded as the first two lines,
+ e.g., for the seqaxp.bio.caltech.edu home page the first
+ two lines will be:
+
+ THE_URL:http://seqaxp.bio.caltech.edu:8000/
+ THE_TITLE:SAF Web server home page
+
+ The VMSIndex software is being adapted to use this
+ information to extract the corresponding URL and TITLE
+ for use in indexing the lnk########.dat files, e.g.:
+
+ $ build_index -
+ /url=(text="THE_URL:") -
+ /topic=(text="THE_TITLE:",EXCLUDE) -
+ /output=INDEX_NAME -
+ lnk*.dat
+
+ A clever person should be able to figure out a way to
+ index the lnk########.dat files on Unix as well.
+
+ If you want the hypertext links in the document to be
+ numbered, include the -number_links switch. By default,
+ this will cause the list of References (URLs for the
+ numbered links) to be appended as well. If you want
+ numbered links but not the References list, include the
+ -nolist switch as well.
+
+ Note that any client-side image MAP pseudo documents
+ that were "traversed" will not have lnk########.dat
+ output files created for them, but output files will
+ be created for "real" documents that were traversed
+ based on the HREFs of the MAP's AREA tags.
+
+This functionality is still under development. Feedback and suggestions
+are welcome.
diff --git a/docs/FM.announce b/docs/FM.announce
new file mode 100644
index 0000000..0b2652b
--- /dev/null
+++ b/docs/FM.announce
@@ -0,0 +1,72 @@
+LYNX FILE MANAGEMENT SUPPORT
+
+New facilities have been added since Lynx 2-3 to provide support
+for managing files on the local filesystem. These facilities allow
+the user to delete, rename, and re-locate files and/or directories and
+to create and/or upload new files and directories. This will mainly
+be of interest to systems administrators who are interested in running
+lynx as a restricted shell in order to provide controlled access to a
+range of services (as in a freenet). It may also be of use at sites
+where some of the users are experiencing difficulty with the raw Unix
+interface.
+
+Support for the new facilities is enabled at compile time by defining
+the variable `DIRED_SUPPORT' in the `MCFLAGS' list in the Lynx
+Makefile, and in the WWW makefile `CommonMakefile'. Runtime support
+for disabling the facilities is provided by way of the restriction
+`dired_support' which can be set on the command line for a particular
+session.
+
+The Makefile also provides additional compile time flags for
+controlling the extent and application of the file management
+facilities; specifically, `OK_TAR' which enables support for creating
+and expanding tar archives, `OK_GZIP' which enables use of gzip to
+compress and decompress files, and `OK_OVERRIDE' which allows access
+to the file management facilities directly from the keyboard in
+addition to access by way of a file management menu.
+
+There are two possible modes of operation; the first in which a single
+file management menu is invoked via the `f', or `F' key; the second,
+in which the more often used facilities are made available directly
+from the keyboard in addition to access via the menu. The second
+method provides a much better user interface but requires re-mapping
+some of the keys from their standard lynx interpretation, temporarily
+when file management mode is in effect. For example, if OK_OVERRIDE is
+defined at compile-time, then the line at the bottom of the screen, in
+novice mode, will be
+
+ C)reate D)ownload E)dit F)ull menu M)odify R)emove T)ag U)pload
+
+rather than the standard second noviceline,
+
+ H)elp O)ptions P)rint G)o M)ain screen Q)uit /=search [delete]=history list
+
+when the user is browsing part of the file system. If OK_OVERRIDE is not
+defined then all access to file management functionality must be by way
+of the menu. The only exception is that the facility to tag files for
+subsequent removal and/or re-location is always available directly from
+the keyboard using `t', and `T'.
+
+This is a first release of the file management enhancements and suggestions
+for improvements are welcome. Among the enhancements which are currently
+being considered are facilities for changing file access attributes, and
+a facility for listing and extracting part of an archive.
+
+In order to use the file management facilities you may either point
+the program at a directory on the command line or point the program at
+an html file which contains a link of the following form:
+
+ <a href="file://localhost/~/"> Manage Personal Directory ? </a>
+
+where the anchor `file://localhost/~/' implies a reference to
+/home/username. Because the `~/' in a file URL is converted to
+`/home/username' regardless of origin, these facilities also work when
+the anchor shown above is served from an http server as well. In
+either case the reference is to files on the local system and not
+files in the domain of the server.
+
+By default the file listing is in standard Unix mixed format, but you
+may use the Options menu to select WWW `directories first' format, or
+`files first' format if you prefer.
+
+Rick Mallett, Carleton University, Ottawa Canada. (rmallett@ccs.carleton.ca)
diff --git a/docs/IBMPC-charsets.announce b/docs/IBMPC-charsets.announce
new file mode 100644
index 0000000..1431cdf
--- /dev/null
+++ b/docs/IBMPC-charsets.announce
@@ -0,0 +1,74 @@
+
+Summary
+=======
+This document is primarily for people who will be using Lynx
+on a remote UNIX or VMS system via an MS-DOS based terminal program.
+
+
+General Information
+===================
+Lynx comes with built-in translation tables to map the 8-bit character codes or
+character entities coming in from an HTML document to their equivalent codes,
+where possible, for various character sets.
+
+IMPORTANT: you should choose display character set in Lynx Options Menu
+according to your font installed locally. Probably it would be cpXXX. Please
+contact lynx-dev mailing list if you want any new codepage not listed there.
+
+Note that all points of the connection between the display at your end and Lynx
+at the remote end must be 8-bit clean. If the high bit is being stripped at
+any point in between, the only character set you can use (effectively) in Lynx
+will be "7 bit approximations". More on that later.
+
+
+MS-DOS character set weirdness
+==============================
+MS-DOS uses a bass-ackwards character set in which half the normal characters
+have been replaced by pseudo-graphic line and box-drawing characters, and in
+which almost all of the international characters are mapped to nonstandard
+numbers. It also contains Greek letters.
+
+Further confusing matters, there is more than one MS-DOS character set. The
+character sets are referred to as "codepages," each of which has a unique
+number. IBM PCs and compatibles come with one hardware-based default codepage
+and a keyboard to match. In the US market the hardware codepage is 437. PCs
+destined for other regions of the world often have a different default codepage
+which contains characters for other languages and keyboards. Under MS-DOS, one
+can load different codepages into memory and use one of them instead of the
+hardware default.
+
+If you are using Lynx through an MS-DOS based terminal program or telnet
+client, you should use an appropriate DOS codepage in Lynx and you need not any
+translation within terminal program (this is different from old-style behavior
+and works better because of superior Lynx translation support).
+
+Check your display by accessing Martin Ramsch's ISO-8859-1 table
+(iso8859-1.html in the Lynx distribution's test subdirectory).
+
+Ramsch's table describes each entity and shows examples of each. It should be
+immediately obvious that you are either seeing what you are supposed to, or
+you're not. If you see box and line-drawing characters and mismatched letters
+and so on, you are likely displaying 7 bit data, not 8. Ensure that all points
+of your connection are 8-bit clean:
+
+ On any remote UNIX systems you must pass through, do
+ 'stty cs8 -istrip' or 'stty pass8'. 'stty -a' should list
+ your settings.
+ On any remote VMS systems, do 'set terminal /eightbit'.
+ Make sure your terminal program or telnet client is not filtering
+ 8-bit data. You may found the choice between "VT-100 strict"
+ and "VT-100 relaxed" emulation mode - use relaxed.
+ Note: Procomm for DOS has a confusing "Use 7 bit or 8 bit
+ ANSI" setting -- this has to do with ANSI sequences. If set to
+ 8 bit, some 8-bit character sequences, including those passed
+ by Lynx as well as those which are for your terminal type
+ (vt100, etc.) will be processed by Procomm as ANSI screen
+ control codes and will most likely result in a garbled display.
+ Set it to 7 bit.
+ If going through a dialup terminal server, you may have to set the
+ terminal server itself to pass 8 bit data. How to do this
+ varies with the make of the server, and in some cases only a
+ system admin in charge of the box will have the authorization
+ to do that.
+ SLIP or PPP connections should already be 8-bit clean.
+
diff --git a/docs/OS-390.announce b/docs/OS-390.announce
new file mode 100644
index 0000000..923d2a3
--- /dev/null
+++ b/docs/OS-390.announce
@@ -0,0 +1,93 @@
+This document suggests steps to install Lynx on OS/390 systems.
+
+========================================================================
+o Download the archive file lynx2-8-6.tar.Z in BINARY from the site
+ where you found this announcement or from a site listed at
+ https://lynx.invisible-island.net/
+
+o Unpack with:
+
+ uncompress <lynx2-8-6.tar.Z | pax -rv -o to=IBM-1047
+
+ The "-o to=IBM-1047" is needed to convert the ASCII archive
+ to EBCDIC. You must not download as a text file; the conversion
+ must be performed after the uncompress.
+
+========================================================================
+o Alternatively, download the PKZIPped archive lynx2-8-6.zip in BINARY.
+
+o Unpack with:
+
+ unzip -aa lynx2-8-6.zip
+
+ The "-aa" is needed to convert the ASCII archive
+ to EBCDIC. (unzip is not shipped with OS/390. You can
+ obtain it from:
+
+ Linkname: OS/390 UNIX - Tools and Toys
+ URL: http://www.s390.ibm.com/unix/bpxa1ty1.html
+
+ Linkname: Info-ZIP zip and unzip
+ URL: http://www.s390.ibm.com/ftp/os390/oe/port/infozip-os390.tar.Z
+ )
+
+========================================================================
+o Run the configure script:
+
+ mkdir -p ./OS390/.
+ cd ./OS390
+ rm -f config.cache
+ CC=c89 CFLAGS="-D_XOPEN_SOURCE_EXTENDED=1 -D_ALL_SOURCE" \
+ ../lynx2-8-6/configure
+
+ The definitions select the ANSI C compiler (c89) and options
+ to select the right header file directories. You may also
+ find it useful to set the installation directories with
+ the --prefix=, --sysconfdir=, and --exec_prefix= options.
+
+========================================================================
+o Build Lynx
+
+ gmake
+
+ (I have been unable to build Lynx with IBM's make. gmake is not
+ shipped with OS/390. You may obtain gmake from:
+
+ Linkname: Mortice Kern Systems (MKS) Inc. - S/390 ®
+ OpenEdition--GNU Utilities
+ URL: http://www.mks.com/s390/gnu/index.htm
+
+ Linkname: Other
+ URL: http://www.mks.com/s390/gnu/register.htm
+ )
+
+========================================================================
+o Test Lynx:
+
+ ./lynx -cfg=../lynx2-8-6/lynx.cfg \
+ ../lynx2-8-6/lynx_help/lynx_help_main.html
+
+========================================================================
+o Install Lynx:
+
+ gmake install
+ gmake install-help
+ gmake install-doc
+
+========================================================================
+REMAINING PROBLEMS:
+
+ 3270-type terminals are not supported. This is probably a
+ permanent restriction since curses support for 3270s is
+ unlikely to appear.
+
+ URL schemes other than HTTP:, FTP:, and FILE: are untested
+ and likely not to work.
+
+ Some character entities are not rendered correctly.
+
+ The Download command converts binary files from ASCII to EBCDIC.
+ This can be undone by a download filter in lynx.cfg.
+
+Paul Gilmartin
+pg@sweng.stortek.com
diff --git a/docs/README.TRST b/docs/README.TRST
new file mode 100644
index 0000000..68b27af
--- /dev/null
+++ b/docs/README.TRST
@@ -0,0 +1,158 @@
+Tabular Support for Simple Tables
+=================================
+Some definitions first:
+
+* NO table support
+ What it says. :) Table related tags are treated like other
+ completely unrecognized tags.
+ Only listed for completeness, this does not describe Lynx.
+
+* MINIMAL table support
+ Table related tags are recognized, and are used to separate
+ the contents of different cells (by at least a space) and rows
+ (by a line break) visibly from each other.
+
+* LYNX minimal table support (LMTS)
+ The minimal table support as implemented by Lynx up to this point,
+ also includes the way ALIGN attributes are handled on TABLE, TR
+ and other specific tweaks (e.g. handle TABLE within PRE specially).
+ LMTS formatting is briefly described in the Lynx User Guide, see
+ the section "Lynx and HTML Tables" there. (The Users Guide has not
+ yet been updated for tabular support.)
+
+* TABULAR support for tables
+ Support for tables that really arranges table cells in tabular form.
+
+* Tabular Rendering for SIMPLE Tables (TRST)
+ Tabular support for some tables that are 'simple' enough; what this
+ code change provides.
+
+One basic idea behind providing TRST is that correct tabular support
+for all tables is complex, doesn't fit well into the overwhelmingly
+one-pass way in which Lynx does things, and may in the end not give
+pleasant results anyway for pages that (ab-)use more complex table
+structures for display formatting purposes (especially in view of Lynx
+limitations such as fixed character cell size and lack of horizontal
+scrolling; see also emacs w3 mode). Full table support within Lynx
+hasn't happened so far, and continues to seem unlikely to happen in the
+near future.
+
+The other basic idea is the observation that for simple tables, as
+used mostly for data that are really tabular in nature, LMTS rendering
+can be transformed into TRST rendering, after parsing the TABLE element,
+by two simple transformations applied line by line:
+- Insert spaces in the right places.
+- Shift the line as a whole.
+
+And that's exactly what TRST does. An implementation based on the
+simple observation above is relatively straightforward, for simple
+tables. On encountering the start of a TABLE element, Lynx generates
+output as usual for LMTS. But it also keeps track of cell positions
+and lengths in parallel. If all goes well, that additional information
+is used to fix up the already formatted output lines when the TABLE
+ends. If not all goes well, the table was not 'simple' enough, the
+additional processing is canceled. One advantage is that we always
+have a 'safe' fallback to well-understood traditional LMTS formatting:
+TRST won't make more complex tables look worse than before.
+
+What are 'simple' tables? A table is simple enough if each of its TR
+rows translates into at most one display line in LMTS formatting (excluding
+leading and trailing line breaks), and the width required by each row
+(before as well as after fixup) does not exceed the available screen size.
+Note that this excludes all tables where some of the cells are marked up as
+block elements ('paragraphs'). Tables that include nested TABLE elements
+are always specifically excluded, but the inner tables may be subject to
+TRST handling. Also excluded are some constructs that indicate that markup
+was already optimized for Lynx (or other browsers with no or minimal table
+support): TABLE in PRE, use of TAB.
+
+The description so far isn't completely accurate. In many cases, tables are
+not simple enough according to the last paragraph, but parts of each TR row
+can still benefit from some TRST treatment. Some partial treatment is done
+for some tables in this grey zone, which may or may not help to a better
+display, depending on how the table is used. This is an area where tweaks
+in the future are most expected, and where the code's behavior is currently
+not well defined.
+
+One possible approach:
+- The table is 'simple' according to all criteria set out in the previous
+ paragraph, except that some cells at the beginning and/or end of TR rows
+ may contain block elements (or other markup that results in formatting
+ like separate paragraphs).
+- There is at most one range of (non-empty) table cells in each row whose
+ contents is not paragraph-formatted, and who are rendered on one line
+ together by LMTS, separate from the paragraph-formatted cells. Let's
+ call these cells the 'core' of a row.
+Fixups are then only applied to the text lines showing the 'core' cells.
+The paragraph-formatted cells are effectively pulled out before/after
+their row (no horizontal space is allocated to them for the purpose of
+determining column widths for core line formatting).
+
+This is expected to be most useful for tables that are mostly
+simple tabular data cells, but with the occasional longer
+text thrown in. For example, a table with intended rendering:
+
+ --------------------------------------------------------
+ | date | item no. | price | remarks |
+ |--------|--------------|---------|----------------------|
+ | date-1 | item #1 | $0.00 | |
+ |--------|--------------|---------|----------------------|
+ | date-2 | item #2 | $101.99 | A longer annotation |
+ | | | | marked up as a block |
+ | | | | of text. |
+ |--------|--------------|---------|----------------------|
+ | date-3 | long item #3 | $99.00 | |
+ --------------------------------------------------------
+
+It may now be shown by Lynx as
+
+ .................................................
+
+ date item no. price remarks
+ date-1 item #1 $0.00
+ date-2 item #2 $101.99
+
+ A longer annotation marked up as a block of
+ text.
+
+ date-3 long item #3 $99.00
+
+ .................................................
+
+As can be seen, this is still quite far from the intended rendering,
+but it is better than without any tabular support.
+
+Whether the code does something sensible with "grey area" tables is up
+for testing. Most of the typical tables in typical Web pages aren't
+used in a way that can benefit from the TRST approach. Parts of such
+tables may still end up getting shifted left or right by the TRST code
+when that doesn't improve anything, but I haven't seen it make things
+really worse so far (with the current code).
+
+TRST and Partial Display
+------------------------
+[ Partial display mode is the feature which allows viewing and scrolling
+of pages while they are loaded, without having to wait for a complete
+transfer. ] During partial display rendering, table lines can sometimes
+be shown in the original formatting, i.e. with horizontal fixups not yet
+applied. This is more likely for longer tables, and depends on the state
+in which partial display 'catches' the TRST code. Sometimes the display
+may flicker: first the preliminary rendering of table lines is shown, then
+after loading is finished it is replaced by the fixed-up version. I do
+not consider this a serious problem: if you have partial display mode
+enabled, presumably you want to be able to see as much data as possible,
+and scroll up and down through it, as early as possible. In fact, the
+approach taken keeps Lynx free from a problem that may graphical browsers
+have: they often cannot render a table at all until it is received in full.
+
+------------------------------------------------------------------------
+
+To summarize:
+ - TRST is a solution that works in many cases where lack of tabular support
+ was most annoying.
+ - TRST doesn't implement a full table model, and it is extremely unlikely
+ that it will ever be the basis for that. Keep on exploring external
+ solutions, or perhaps waiting for (better: working on) a more fundamental
+ redesign of Lynx's rendering engine.
+
+Klaus Weide - kweide@enteract.com 1999-10-13
diff --git a/docs/README.chartrans b/docs/README.chartrans
new file mode 100644
index 0000000..a13ef36
--- /dev/null
+++ b/docs/README.chartrans
@@ -0,0 +1,164 @@
+Lynx CHARTRANS
+
+ Features (in addition to those which Lynx 2.7.1 already has):
+
+ - Can (attempt to) translate from any document charset to any display
+ character set, *IF* the document charset is known by a translation
+ table (compiled in at installation).
+
+ - New method to define character sets: used for input charset as well
+ as display character set, translation tables compiled in from
+ separate files (one per charset). One table is designated as default
+ and can be used for fallback translation to 7-bit replacements for
+ display.
+
+ - New method for specifying translations of SGML entities.
+
+ - Unicode (UTF-8) support: can (attempt to) decode and translate UTF-8 to
+ display character set, or pass through UTF to display (if terminal
+ or console understands UTF-8). [raw display of UTF only tested with Slang
+ so far, does not always position everything correctly on screen]
+
+ - Support for CHARSET attribute on A tag (and sometimes LINK), as in HTML
+ i18n RFC 2070 and W3C HTML 4.0 drafts. A link can suggest the target's
+ charset in this way.
+
+ - Support for ACCEPT-CHARSET attribute of FORM tags.
+
+ - EXPERIMENTAL, currently enabled only for Linux console:
+ can (attempt to) automatically switch terminal mode and load new
+ code pages on change of display character set.
+
+ - some minor changes: sometimes invalid characters were displayed in a hex
+ notation Uxxxx (helps debugging, but I also regard it as at least not
+ worse than showing the wrong char without warning), now they are not
+ displayed to reduce garbage.
+
+Additions/changes to user interface:
+
+ - many new Display Character Sets are available on O)ptions screen.
+ (One can use arrow keys, HOME, END etc. for cycling through the list
+ or use selection from popup box, as for other options.)
+
+ - new command line flags:
+ -assume_charset=... assume this as charset for documents that don't
+ specify a charset parameter in HTTP headers
+ -assume_local_charset=... assume this as charset of local file
+ -assume_unrec_charset=... in case a charset parameter is not recognized;
+ docs also available as ASSUME_CHARSET etc. in lynx.cfg
+ In "Advanced User" mode, ASSUME_CHARSET can be changed during a session
+ from the Options Screen.
+
+ - The "Raw" toggle (from -raw flag, '@' key, or Options screen)
+ o toggles the assumption "Default remote charset is same as Display
+ Character Set" on or off.
+ Toggling of the assumed charset is between Display Character Set and
+ the specified ASSUME_CHARSET or, if they are the same, between the
+ specified ASSUME_CHARSET and ISO-8859-1.
+ o The default for raw mode now depends on the Display Character Set as
+ well as on the specified ASSUME_CHARSET value.
+ o should work as before for CJK charsets (turning CJK-mode on or off).
+ o If the effective ASSUME_CHARSET and the Display Character Set are
+ unchanged from the ISO-8859-1 default, toggling "Raw" may have some
+ additional effect for characters that can't be translated.
+ (Try the "Transparent" Display Character Set for more "rawness".)
+
+
+Requirements: same as for Lynx in general :)
+
+The chartrans code is now merged with Wayne Buttle's changes for
+32-bit MS Windows and DOS/DJGPP, with Thomas Dickey's and Jim Spath's
+emerging auto-configure mechanism, and with BUGFIXES from Foteos
+Macrides. See the accompanying file CHANGES for the current
+status.
+
+
+A warning:
+In some cases undisplayable bytes may still get sent to the terminal
+which are then interpreted as control chars, there is no protection
+against if strange things are defined in the table files.
+
+
+HOW TO INSTALL:
+
+(4) before compiling:
+
+ Check top level makefile or Makefile and userdefs.h as usual.
+
+ NOTE that there is a new "#define" in userdefs.h for MAX_CHARSETS
+ near the end (in "Section 3.").
+
+(5) Building Lynx:
+
+ Compiling the chartrans code is now integrated into the normal
+ installation procedures for UNIX (configure script) and other
+ platforms.
+
+ What's supposed to happen (in addition to the usual things when
+ building Lynx): in the new subdirectory src/chrtrans, make should
+ first compile the auxiliary program `makeuctb', then invoke that
+ program to create xxxxx_yyy.h files from the provided xxxxx_yyy.tab
+ translation table files. (See README.* files in src/chrtrans for
+ more info.)
+
+ If all goes well, just invoking make from the top-level Lynx dir
+ as usual should do everything automatically. If not, the makefiles
+ may need some tweaking... or:
+
+(6) Some things to look at if compilation fails:
+
+ In src/chrtrans/UCkd.h there is a typedef for an unsigned 16bit
+ numeric type which may need to be changed for your system.
+ See comment near top there.
+
+ For recompiling Lynx, `make clean' should not be necessary if only
+ files in src/chrtrans have been changed. On the other hand
+ may not propagate to the src/chrtrans directory (depending how things
+ are going with auto-config), you may have to cd to that directory
+ and `make clean' there to really clean up there.
+
+(7) To customize (add/change translation tables etc.):
+
+ See README.* files in src/chrtrans.
+ Make the necessary changes there, then recompile.
+ (A general `make clean' should not be necessary, but make sure
+ the ...uni.h file in src/chrtrans gets regenerated.)
+
+ Note that definition of new character entities (if e.g., you want
+ Lynx to recognize &Zcaron;) are not covered by these table files,
+ they have to be listed in entities.h.
+
+ _If you are on a Linux system_ and using Lynx on the console (i.e.
+ not xterm, not a dialup *into* the Linux box), you can compile
+ with -DEXP_CHARTRANS_AUTOSWITCH. This is very useful for testing
+ the various Display Character Sets, Lynx will try to automatically
+ change the console state. You need to have the Linux kbd package
+ installed, with a working `setfont' command executable by the user,
+ and the right font files - check the source in src/UCAuto.c for
+ the files used and/or to change them!
+ NOTE that with this enabled,
+ - Lynx currently will not clean up the console state at exit,
+ it will probably left like the last Display Character Set you used.
+ - Loading a font is global across _all_ virtual text consoles, so
+ using Lynx (compiled with this flag) may change the appearance of
+ text on other consoles (if that text contains characters
+ beyond US-ASCII).
+
+(8) Some suggested Web pages for testing:
+
+ <URL: http://www.tezcat.com/~kweide/lynx-chartrans/test/>
+
+ <URL: http://www.isoc.org:8080/>,
+ especially
+ <URL: http://www.isoc.org:8080/liste_ml.htm>.
+
+ <URL: http://www.accentsoft.com/un/un-all.htm>
+
+(9) Please report bugs, unexpected behavior, etc.
+ to <lynx-dev@nongnu.org>.
+
+ Suggestions for improvement would be welcome, as well as
+ contributed translation tables (for stuff that is not available
+ at ftp://dkuug.dk or ftp://ftp.unicode.org).
+
+KW 1997-11-06
diff --git a/docs/README.cookies b/docs/README.cookies
new file mode 100644
index 0000000..af044f9
--- /dev/null
+++ b/docs/README.cookies
@@ -0,0 +1,60 @@
+README.cookies
+
+Cookie handling when using the lynx browser:
+
+General Usage on a unix system:
+
+Cookie handling may be set so that you read them in on session start up from a
+saved file, and to restore all cookies to that file on session close.
+
+Warning and Disclaimer:
+
+The lynx browser provides great opportunity to examine and make decisions about
+cookies by default, but some users just want the speed benefits of the lynx
+browser without the prompting for a decision to accept or reject the cookie.
+Should you think that this is your situation, please read this:
+
+There are a number of privacy issues with accepting all cookies blindly, not
+the least of which is that you are storing evidence of your browsing activity
+into a regular disk file.
+
+You have been warned. There are many resources available that will provide you
+with more information about making informed choices about this subject.
+
+With that in mind, here is how to accept all cookies transparently and rapidly:
+
+The following .lynxrc or lynx.cfg settings provide the user with the ability
+to by default accept all cookies transparently.
+
+SET_COOKIES:TRUE
+ACCEPT_ALL_COOKIES:TRUE
+PERSISTENT_COOKIES:TRUE
+COOKIE_FILE:/path/to/directory/.lynx_cookies
+COOKIE_SAVE_FILE:/path/to/directory/.lynx_cookies
+COOKIE_LOOSE_INVALID_DOMAINS:sports.espn.go.com,espn.go.com,.go.com,
+FORCE_SSL_COOKIES_SECURE:FALSE
+
+You must have a "cookie save file" that you own and for which you have
+read/write permission; cookies are flushed out to that disk location when you
+exit lynx, and are read in for use at the start of a lynx session from there.
+Cookies do not persist unless this happens.
+
+If you wish to see for yourself that this actually happens, please use the
+-trace command line option and then read the resulting file "Lynx.trace".
+It will show the cookies being read in at the start of a session, and being
+written out at the conclusion of a session.
+
+FORCE_SSL_COOKIES_SECURE is for ebay and the like, or they won't remember you;
+(their login is secure but everything else isn't, like a lot of big sites).
+If lynx attempts to transmit the ebay cookie securely, it's not taken.
+This doesn't affect cookie acceptance but it's a functionality issue for users.
+
+The COOKIE_LOOSE_INVALID_DOMAINS is for botched cookies from sites you read a
+lot. This causes a great deal of prompting and if you are a frequent site user
+you may want to convenience yourself with a set of loose invalid domains.
+
+
+Stef Caunter
+http://caunter.ca/contact.html
+http://caunter.ca/README.cookies
+
diff --git a/docs/README.defines b/docs/README.defines
new file mode 100644
index 0000000..5dabb53
--- /dev/null
+++ b/docs/README.defines
@@ -0,0 +1,147 @@
+-- $LynxId: README.defines,v 1.20 2019/07/31 23:06:09 tom Exp $
+
+This file lists preprocessor macros (symbols) which are tested in the
+code (typically with ifdef).
+
+Does not include
+- symbols defined and documented in userdefs.h
+- symbols expected to be set by compiler to indicate system type or
+ compiler features
+- many symbols set and used only in connection with the ./configure
+ mechanism - the full and current list can be found in config.hin
+ (as a template) or, after running ./configure, in lynx_cfg.h.
+- most symbols and macros defined in the source code
+
+***Not complete.***
+
+A. Symbols primarily to enable compilation on specific systems
+==============================================================
+See also under B for things needed by some systems.
+
+# if you have an SVR4 system with the "type any key" problem, try defining
+#
+# -DSVR4_BSDSELECT
+
+---
+Ports have been added for Win32 (95/NT) and 386 DOS computers with a
+packet driver. I created four new defines to accomplish this.
+ _WINDOWS Defined for Win32 specific code (Mostly TCP related)
+ DJGPP Defined for 386 specific code (Mostly TCP related)
+ DOSPATH Defined for any DOS'ish computer
+ NOSIGHUP Defined for computers not supporting sighup signal calls.
+-- Wayne Buttles lynx-port@fdisk.com
+
+Added for 8+3 filesystems (DOS):
+ FNAMES_8_3 also defined in userdefs.h if __DJGPP__
+
+* incorporate changes for win32 by Hiroyuki Senshu <senshu@shonai-cit.ac.jp>
+ (SH) from
+ ftp://crab.it.osha.sut.ac.jp/pub/Win32/develope/senshu/Lynx/
+ Most changes are ifdef'd
+ #define _WIN_CC= .... for Windows C Compiler
+ #define CJK_EX .... CJK EXtension
+ #define SH_EX .... Senshu Hiroyuki EXtension
+ #define WIN_EX .... Windows EXtension
+
+
+B. Symbols to enable or disable specific features, mostly
+=========================================================
+Note that some of these may be only usable on some system types,
+most were originally for UNIX.
+
+Network related, specific protocols
+-----------------------------------
+# -DSOCKS For making a SOCKSified lynx.
+ see comments in makefile.in
+
+Related to DirEd code - probably only usable for UNIX or similar
+----------------------------------------------------------------
+# -DDIRED_SUPPORT (see INSTALLATION, Section II-1c)
+# -DOK_GZIP (see INSTALLATION, Section II-1c)
+# -DOK_OVERRIDE (see INSTALLATION, Section II-1c)
+# -DOK_PERMIT (see INSTALLATION, Section II-1c)
+# -DOK_TAR (see INSTALLATION, Section II-1c)
+# -DOK_UUDECODE (see INSTALLATION, Section II-1c)
+# -DOK_ZIP (see INSTALLATION, Section II-1c)
+# -DOK_INSTALL to enable dired menu "Install" function
+# -DARCHIVE_ONLY (see INSTALLATION, Section II-1c)
+# -DNO_CHANGE_EXECUTE_PERMS (see INSTALLATION, Section II-1c)
+# -DCANT_EDIT_UNWRITABLE_FILES (see LYEdit.c - always in effect for VMS)
+
+Related to formatting of local directory listings
+-------------------------------------------------
+# -DLONG_LIST (see INSTALLATION, Section II-1c)
+# -DNO_PARENT_DIR_REFERENCE (see INSTALLATION, Section II-1c)
+
+Related to screen display
+-------------------------
+Using curses or ncurses library:
+# -DNCURSES (see INSTALLATION, Section II-1c)
+# -DFANCY_CURSES whether curses lib supports more than very basic stuff
+ for UNIX handled by ./configure, for VMS defined in code
+# -DNO_KEYPAD (old) or HAVE_KEYPAD (new) whether curses lib uses keypad().
+ for UNIX handled by ./configure, may be set in HTUtils.h
+# -DCOLOR_CURSES whether curses lib supports color (in the right way).
+ for UNIX handled by ./configure
+# -DUSE_COLOR_STYLE (see INSTALLATION, Section II-1c) needs SVr4 curses
+# -DUNDERLINE_LINKS Define if you want links underlined instead of bold.
+# -DNO_SIZECHANGE (old) or HAVE_SIZECHANGE (new) whether using code to detect
+ new size after size changes of the terminal (window).
+ for UNIX handled by ./configure, may be set in HTUtils.h
+# -DUSE_SCROLLBAR supports scrollbar when built with ncurses
+# -DWIDEC_CURSES whether curses lib supports wide/multibyte characters.
+
+Using slang library:
+# -DUSE_SLANG (see INSTALLATION, Section II-1c)
+
+Other general
+-------------
+# -DIGNORE_CTRL_C Define if Control-C shouldn't exit lynx.
+# -DINACTIVE_INPUT_STYLE_VH Different style for showing inactive text fields
+# -DNO_DUMP_WITH_BACKSPACES Disables -with_backspaces code
+# -DNO_RULES Disables code for CERN-style rules files
+
+Untested
+--------
+# -DNO_EXTENDED_HTMLDTD Disable some "SortaSGML" code, see SGML.c
+# -DWIND_DOWN_STACK Aggressive handling of end tags for "TagSoup", SGML.c
+
+C. Secondary symbols
+====================
+Some macros that are not primary, i.e. they are normally automatically
+set or unset in the code based on other macros (including those from
+./configure), but it may be sometimes useful to set them differently.
+They may directly affect several source files. Filenames show where
+they are set. Normally installers shouldn't have to care about these
+symbols.
+
+COOKIE_FILE LYMain.c default cookie file in HOME dir
+SHOW_WHEREIS_TARGETS LYCurses.h whereis search highlighting
+USE_KEYMAPS LYCurses.h use of .lynx-keymaps files
+
+D. Symbols defined locally to modify some behavior
+==================================================
+Defined in the source files to which they apply. Only filenames are listed,
+the files would have to be read and edited anyway to change the definition.
+Normally installers shouldn't have to care about any of these symbols.
+
+ADVANCED_INFO LYShowInfo.c
+ALLOW_PROXY_HEAD LYUtils.c
+CHECK_FREE_MEM GridText.c
+CLEAN_URLS HTParse.c
+DEBUG_HOSTENT HTTCP.c
+DEBUG_HOSTENT_CHILD HTTCP.c
+DEFAULT_INVCHECK_BV LYCookie.c
+DUPLICATE_ANCHOR_NAME_WORKAROUND HTAnchor.c
+EXTENDED_OPTION_LOGIC LYMain.c
+EXTENDED_STARTFILE_RECALL LYMain.c
+OPTNAME_ALLOW_DASHES LYMain.c
+OVERLAP HTNews.c
+RESTRICT_NM_ALLOW_DASHES LYUtils.c
+SOCKET_DEBUG_TRACE HTTCP.c
+TRADITIONAL_SUFFIXES HTInit.c
+USE_XHDR HTNews.c
+max_cookies_buffer LYCookie.c
+max_cookies_domain LYCookie.c
+max_cookies_global LYCookie.c
+reverse_mailcap HTInit.c
diff --git a/docs/README.jp b/docs/README.jp
new file mode 100644
index 0000000..c44d35a
--- /dev/null
+++ b/docs/README.jp
@@ -0,0 +1,130 @@
+README for Japanese
+===================
+
+This document shows some supplements for Japanese in Japanese.
+¤³¤Îʸ½ñ¤Ç¤ÏÆüËܸì¤Ç¸æÍøÍѤÎÊý¤Î¤¿¤á¤ÎÊä­»ö¹à¤¬µ­½Ò¤µ¤ì¤Æ¤¤¤Þ¤¹¡£
+
+1. ³µÍ×
+
+Lynx Version 2.8.3 (¤È¶²¤é¤¯¤½¤ì°Ê¹ß¤Î Lynx) ¤Ç¤Ï¡¢2.8.2 °ÊÁ°¤Î
+¤â¤Î¤ÈÆüËܸì¤Îʸ»ú¥³¡¼¥É¤Î°·¤¤¤¬°Û¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£¤³¤Îʸ½ñ¤Ç¤Ï
+Lynx ¤òÆüËܸì´Ä¶­¤ÇÍøÍѤµ¤ì¤ë¾ì¹ç¤Î¸ÇÍ­¤ÎÀßÄê¤ò´Êñ¤ËÀâÌÀ¤·¤Þ¤¹¡£
+
+ÆÃ¤Ë ASSUME_CHARSET ¤Î°·¤¤¤¬Êѹ¹¤µ¤ì¤¿´Ø·¸¾å¡¢°ÊÁ°¤ÈƱ¤¸ÀßÄê¤ÇÍøÍÑ
+¤·¤Æ¤¤¤ë¤È½¾Íèʸ»ú²½¤±¤·¤Æ¤¤¤Ê¤«¤Ã¤¿Ê¸¾Ï¤¬Ê¸»ú²½¤±¤·¤Æ¤·¤Þ¤¦²ÄǽÀ­¤¬
+¤¢¤ê¤Þ¤¹¤Î¤Ç¸æÃí°Õ¤¯¤À¤µ¤¤¡£¤³¤ÎÅÀ¤Ë´Ø¤·¤Æ¤Ï¡¢¤³¤Îʸ½ñ¤Î
+¡Ö4. lynx.cfg ¤ÎÀßÄê¡×¤Î¾Ï¤ò¸æ»²¾È¤¯¤À¤µ¤¤¡£
+
+
+2. ÆüËܸì¤Îʸ½ñ¤Î¿·¤·¤¤½èÍýÊýË¡
+
+(1) ÆüËܸì¤Çµ­½Ò¤µ¤ì¤¿ HTML ʸ½ñ¤Îʸ»ú¥³¡¼¥É (Character-Set) ¤¬¡¢
+ META Í×ÁÇ¡¢¤â¤·¤¯¤Ï HTTP ¤Î±þÅú¤Ç»ØÄꤵ¤ì¤Æ¤¤¤¿¾ì¹ç¡¢Ê¸½ñ¤¬
+ ¤½¤Îʸ»ú¥³¡¼¥É¤Çµ­½Ò¤µ¤ì¤Æ¤¤¤ë¤È²¾Äꤷ¤Æ½èÍý¤·¤Þ¤¹¡£
+
+(2) (1) °Ê³°¤Î¾ì¹ç¤Ç¡¢ASSUME_CHARSET ¤¬ shift_jis ¤â¤·¤¯¤Ï euc_jp ¤Ë
+ ÀßÄꤵ¤ì¤Æ¤¤¤¿¾ì¹ç¡¢Ê¸½ñ¤¬¤½¤Îʸ»ú¥³¡¼¥É¤Çµ­½Ò¤µ¤ì¤Æ¤¤¤ë¤È²¾Äꤷ¤Æ
+ ½èÍý¤·¤Þ¤¹¡£
+
+(3) (1) ¤ª¤è¤Ó (2) °Ê³°¤Î¾ì¹ç¡¢Ê£¿ô¤Îʸ»ú¥³¡¼¥É¤òÍѤ¤¤Æ¤Ò¤È¤Ä¤Îʸ½ñ¤¬
+ ½ñ¤«¤ì¤Æ¤¤¤Ê¤¤¤È²¾Äꤷ¤Æ½èÍý¤·¤Þ¤¹¡£
+
+
+3. ¥¤¥ó¥¹¥È¡¼¥ë
+
+¥¤¥ó¥¹¥È¡¼¥ë»þ¤Ë¤ª¤±¤ëÆüËܸì¸ÇÍ­¤ÎÀßÄê¤Ë¤Ï°Ê²¼¤Î¤â¤Î¤¬¤¢¤ê¤Þ¤¹¡£
+ɬÍפ˱þ¤¸¤ÆÀßÄê¤òÊѹ¹¤·¤Æ¥¤¥ó¥¹¥È¡¼¥ë¤·¤Æ¤¯¤À¤µ¤¤¡£
+
+configure ¥ª¥×¥·¥ç¥ó
+ ¡¦enable-cjk
+ À齩»á¤Ë¤è¤ë¼ç¤ËÆüËܸì¤Î½èÍý¤Ë¤«¤«¤ï¤ë³ÈÄ¥¤òÍ­¸ú¤Ë¤¹¤ë¤¿¤á¤Î
+ ¥ª¥×¥·¥ç¥ó¤Ç¤¹¡£¤³¤ì¤é¤Î³ÈÄ¥¤Ïº£¸åɸ½à¤ÇÁȤ߹þ¤Þ¤ì¤ë¤«¡¢Â¾¤Î
+ ¥ª¥×¥·¥ç¥ó¤Ë¤è¤êÍ­¸ú¤Ë¤¹¤ëÊý¿Ë¤Î¤¿¤á¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¾­Íè
+ Çѻߤµ¤ì¤ë¤È»×¤ï¤ì¤Þ¤¹¡£
+
+¥Þ¥¯¥í
+ ¡¦USE_TH_JP_AUTO_DETECT
+ Á°¾Ï (3) ¤Î½èÍý¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£
+ ¤³¤Î¥Þ¥¯¥í¤Ï userdefs.h ¤Ë¤ª¤¤¤Æɸ½à¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£
+
+ ¡¦KANJI_CODE_OVERRIDE
+ ʸ½ñ¤Îʸ»ú¥³¡¼¥É¤ò¥æ¡¼¥¶¤¬»ØÄê¤Ç¤­¤ë¤è¤¦¤Ë¤¹¤ë½èÍý¤òÍ­¸ú¤Ë
+ ¤·¤Þ¤¹¡£¤³¤Î»ØÄê¤Ï¡¢META Í×ÁÇ¡¢HTTP ¤Î±þÅú¡¢ASSUME_CHARSET
+ ¤Ç»ØÄꤵ¤ì¤¿Ê¸»ú¥³¡¼¥É¤è¤ê¤âÍ¥À褵¤ì¤Þ¤¹¡£¼ç¤Ëʸ½ñ¤¬´Ö°ã¤Ã¤¿
+ ʸ»ú¥³¡¼¥É¤ò»ØÄꤷ¤Æ¤¤¤¿¾ì¹ç¤ËÍ­¸ú¤Ç¤¹¡£Ê¸»ú¥³¡¼¥É¤Ï ^L ¤Ë¤è¤ê
+ ÀÚ¤êÂؤ¨¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤¿¤À¤·¡¢Â¿¤¯¤Î¥±¡¼¥¹¤Ç¤ÏÉÔÍפǤ¹¡£
+ ¤³¤Î¥Þ¥¯¥í¤Ïɸ½à¤ÇÄêµÁ *¤µ¤ì¤Þ¤»¤ó*¡£
+
+ ¡¦SH_EX
+ À齩»á¤Ë¤è¤ë°ìÈÌŪ¤Ê³ÈÄ¥¤òÍ­¸ú¤Ë¤¹¤ë¤¿¤á¤Î¥Þ¥¯¥í¤Ç¤¹¡£
+ ¤³¤Î¥Þ¥¯¥í¤òÀßÄꤹ¤ë¤È¡¢¾åµ­ KANJI_CODE_OVERRIDE ¤òÍ­¸ú¤Ë
+ ¤·¤¿¾ì¹ç¤Îʸ»ú¥³¡¼¥É¤¬²èÌ̾åÉô¤Ë¾ï¤Ëɽ¼¨¤µ¤ì¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£
+ ¤³¤Î¥Þ¥¯¥í¤Ïɸ½à¤ÇÄêµÁ *¤µ¤ì¤Þ¤»¤ó*¡£
+
+
+4. lynx.cfg ¤ÎÀßÄê
+
+******************** ½Å Í× ********************
+lynx.cfg ¤Ç¤Ï ASSUME_CHARSET¡¢ASSUME_LOCAL_CHARSET¡¢
+ASSUME_UNREC_CHARSET ¤òÀßÄꤷ¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£
+******************** ½Å Í× ********************
+
+Lynx Version 2.8.3 °Ê¹ß¤Ç¤Ï¡¢ÆüËܸì¤Çµ­½Ò¤µ¤ì¤¿ HTML ʸ½ñ¤Îʸ»ú¥³¡¼¥É
+¤¬ÌÀ¼¨Åª¤Ë»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ç¡¢ASSUME_CHARSET ¤¬ shift_jis ¤â¤·¤¯¤Ï
+euc_jp ¤ËÀßÄꤵ¤ì¤Æ¤¤¤¿¾ì¹ç¡¢Ê¸½ñ¤¬¤½¤Îʸ»ú¥³¡¼¥É¤Çµ­½Ò¤µ¤ì¤Æ¤¤¤ë¤È
+²¾Äꤷ¤Æ½èÍý¤¹¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤·¤¿¡£
+
+¤¿¤À¤·¡¢ASSUME_CHARSET ¤ò»ØÄꤷ¤Ê¤¯¤Æ¤âÆüËܸì¤Îʸ»ú¥³¡¼¥É¤Ï¼«Æ°Åª¤Ë
+ȽÊ̤µ¤ì¡¢Â¿¤¯¤Î¥±¡¼¥¹¤Ç¤ÏŬÀڤ˽èÍý¤µ¤ì¤Þ¤¹¡£¤à¤·¤í¡¢ASSUME_CHARSET
+¤ò shift_jis ¤ä euc_jp ¤Ë»ØÄꤷ¤Æ¤¤¤ë¤È¡¢¤½¤ì¤¾¤ì EUC¡¢SJIS ¤Ç½ñ¤«¤ì¤¿
+ʸ½ñ¤¬Ê¸»ú²½¤±¤¹¤ë¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£
+
+½¾¤Ã¤Æ¡¢lynx.cfg Æâ¤Ë¡¢
+
+-------------------- ¤³¤³¤«¤é --------------------
+ASSUME_CHARSET:euc-jp
+-------------------- ¤³¤³¤Þ¤Ç --------------------
+
+¤Î¤è¤¦¤Ëµ­½Ò¤µ¤ì¤Æ¤¤¤ë¤Èʸ»ú²½¤±¤Î¸¶°ø¤Ë¤Ê¤ê¤Þ¤¹¤Î¤Ç¡¢ÆäËÍýͳ¤¬¤Ê¤¤
+¸Â¤ê¡¢°Ê²¼¤Î¤è¤¦¤Ë¥³¥á¥ó¥È¥¢¥¦¥È¤¹¤ë¤Ê¤É¤·¤Æ ASSUME_CHARSET ¤¬ÀßÄê
+¤µ¤ì¤Ê¤¤¤è¤¦¤Ë¤·¤Æ¤¯¤À¤µ¤¤ (ASSUME_LOCAL_CHARSET¡¢ASSUME_UNREC_CHARSET
+¤Ë¤Ä¤¤¤Æ¤âƱÍÍ)¡£
+
+-------------------- ¤³¤³¤«¤é --------------------
+#ASSUME_CHARSET:euc-jp
+-------------------- ¤³¤³¤Þ¤Ç --------------------
+
+ɬÍפǤ¢¤ì¤Ð ASSUME_CHARSET ¤Ï¥ª¥×¥·¥ç¥ó¥á¥Ë¥å¡¼¡¢¤â¤·¤¯¤Ï
+¥³¥Þ¥ó¥É¥é¥¤¥ó¥ª¥×¥·¥ç¥ó¤«¤éÊѹ¹¤·¤Æ²¼¤µ¤¤¡£
+
+Êä­:
+ASSUME_LOCAL_CHARSET ¤Ï Lynx Version 2.8.3 ¤Ç¤Ï»²¾È¤·¤Æ¤¤¤Ê¤¤¤«¤â
+¤·¤ì¤Þ¤»¤ó¤¬¡¢¾­Í軲¾È¤¹¤ë¤è¤¦¤Ë¤Ê¤ë¤«¤â¤·¤ì¤Þ¤»¤ó¤Î¤Ç¡¢¤ä¤Ï¤êÀßÄê
+¤·¤Ê¤¤Êý¤¬¤¤¤¤¤È»×¤¤¤Þ¤¹¡£
+
+
+5. ÆüËܸ줬ʸ»ú²½¤±¤·¤¿¤é
+
+¤¹¤Ù¤Æ¤ÎÆüËܸì¤Ç½ñ¤«¤ì¤¿Ê¸½ñ¤¬Ê¸»ú²½¤±¤¹¤ë¤Ê¤é¡¢¥ª¥×¥·¥ç¥ó¥á¥Ë¥å¡¼¤Ç
+¡ÖDisplay Character Set¡×¤ò¡ÖJapanese (EUC-JP)¡×¡¢¤â¤·¤¯¤Ï
+¡ÖJapanese (Shift_JIS)¡×¤ËÊѹ¹¤·¤Æ¡¢Êѹ¹¤òÊݸ¤·¤Æ¤¯¤À¤µ¤¤¡£
+¤â¤·¤¯¤Ï lynx.cfg Æâ¤Ç CHARACTER_SET ¤ò euc-jp ¤â¤·¤¯¤Ï shift_jis ¤Ë
+ÀßÄꤷ¤Æ¤¯¤À¤µ¤¤¡£
+
+°ìÉô¤ÎÆüËܸì¤Ç½ñ¤«¤ì¤¿Ê¸½ñ¤¬Ê¸»ú²½¤±¤¹¤ë¤Ê¤é¡¢Á°¾Ï¡Ö4. lynx.cfg ¤ÎÀßÄê¡×
+¤ò»²¾È¤·¡¢ASSUME_CHARSET ¤òÀßÄꤷ¤Ê¤¤¤è¤¦¤Ë¤¹¤ë¤«¡¢¤â¤·¤¯¤Ï¥ª¥×¥·¥ç¥ó
+¥á¥Ë¥å¡¼¤Ç¡Öassumed document character set¡×¤ÎÉôʬ¤ò»²¾È¤·¡¢shift_jis
+¤ä euc-jp ¤Ë¤Ê¤Ã¤Æ¤¤¤Ê¤¤¤«³Îǧ¤·¡¢¤â¤·¤Ê¤Ã¤Æ¤¤¤¿¤é iso-8859-1 Åù¤ËÊѹ¹
+¤·¤Æ¡¢Lynx ¤¬ÆüËܸì¤Îʸ»ú¥³¡¼¥É¤ò¼«Æ°È½Ê̤¹¤ë¤è¤¦¤Ë¤·¤Æ¤¯¤À¤µ¤¤¡£
+
+¤½¤ì¤Ç¤âʸ»ú²½¤±¤¹¤ë¾ì¹ç¤Ï¡¢
+ ¡¦META Í×ÁÇ¡¢¤â¤·¤¯¤Ï HTTP ¤Î±þÅú¤Ç»ØÄꤵ¤ì¤Æ¤ëʸ»ú¥³¡¼¥É¤È¤Ï°Û¤Ê¤ë
+ ʸ»ú¥³¡¼¥É¤Çʸ½ñ¤¬µ­½Ò¤µ¤ì¤Æ¤¤¤ë
+¤â¤·¤¯¤Ï
+ ¡¦¤Ò¤È¤Ä¤Îʸ½ñÃæ¤ËÊ£¿ô¤Îʸ»ú¥³¡¼¥É¤Ç½ñ¤«¤ì¤¿Ê¸»ú¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë
+¤È»×¤ï¤ì¤Þ¤¹¡£Á°¼Ô¤Î¾ì¹ç¤Ïʸ½ñ¤Î´ÉÍý¼Ô¤Ë²þÁ±¤ò°ÍÍꤹ¤ë¤«¡¢
+KANJI_CODE_OVERRIDE ¤òÄêµÁ¤·¤Æ¥³¥ó¥Ñ¥¤¥ë¤·¤¿ Lynx ¤ò¤ª»È¤¤¤¯¤À¤µ¤¤¡£
+¸å¼Ô¤Î¾ì¹ç¤Ï»ÄÇ°¤Ç¤¹¤¬¤¢¤­¤é¤á¤Æ¤¯¤À¤µ¤¤¡£
+----
+2000/3/28 Takeshi Hataguchi <patakuti@t3.rim.or.jp>
+---- $LynxId: README.jp,v 1.2 2011/06/06 00:35:13 tom Exp $
diff --git a/docs/README.metrics b/docs/README.metrics
new file mode 100644
index 0000000..bdfdf3f
--- /dev/null
+++ b/docs/README.metrics
@@ -0,0 +1,283 @@
+-- $LynxId: README.metrics,v 1.17 2018/07/08 16:43:30 tom Exp $
+
+This is a short summary of code metrics showing how lynx has grown from
+release to release. It also shows how the original codebase has
+been almost completely replaced by contributors after the release of
+lynx 2.4.2 in 1996. The numbers shown are for lines of text, to keep
+the presentation simple.
+
+Release Current Original
+-------------------------------------------------------------------------------
+ Text C-code Text C-code % Text % Code
+-------------------------------------------------------------------------------
+2.4.2 77210 63463 77210 63463 100 100
+2.6 112970 92869 58859 49665 52 53
+2.7.1 125723 103489 54121 45111 43 43
+2.7.2 162228 123130 48979 40655 30 33
+2.8.1 191738 133778 37286 33582 19 25
+2.8.2 227160 147485 32227 29004 14 19
+2.8.3 248646 166833 29035 26346 11 15
+2.8.4 310436 168108 28364 25751 9 15
+2.8.5 362834 167358 26900 24355 7 14
+2.8.6 395894 170006 25866 23880 6.5 14.0
+ 15573 13587 3.9 8.0
+2.8.7 441453 180674 25064 23101 5.7 12.8
+ 15436 13473 3.5 7.5
+2.8.8 465971 185375 24513 22293 5.3 12.0
+ 15094 12874 3.2 6.9
+2.8.9 478344 186103 24314 22116 5.1 11.9
+ 14931 12733 3.1 6.8
+
+Beginning with 2.8.6, the percentage of the remaining original codebase is
+shown on two lines (i.e., comparing against 2.4.2 indented to use the current
+coding style, or using only the original source). Comparisons using the
+original source give lower estimates of untouched code, though either must be
+viewed taking into account insignificant similarities (such as blank lines).
+
+Starting in 2.8.6dev.3, all C source code has been routinely indented using
+the lnx-indent script from
+ https://invisible-island.net/cindent/
+
+Current lynx releases contain a large amount of text other than C code.
+That includes plain text, html, message libraries, custom and generated
+scripts.
+
+-------------------------------------------------------------------------------
+
+Here is a count of contributions (from CHANGES and docs/CHANGES2.8) since the
+start of the 2.8 series:
+
+ 0.5 AJL
+ 3 Al Gilman
+ 1 Al Walker
+ 1 Alexei Anatski
+ 2 Alexey Dobriyan
+ 2 Andreas Metzler
+ 2 Andrew Belov
+ 3.5 Andrey A Chernov
+ 1 Arkadiusz Miskiewicz
+ 1 Arnaud Giersch
+ 2 Atsuhito Kohda
+ 2 Axel Beckert
+ 1 Bake Timmons
+ 25.5 Bela Lubkin
+ 1 Bill Nottingham
+ 3.5 Bill Schiavo
+ 2 Binh Do
+ 1 Brett Lymn
+ 46.3 Brian J Pardy
+ 1 Carlton Anderson
+ 1 Charles Karney
+ 1 Chris Adams
+ 1 Christian Hudon
+ 1 Christian Jensen
+ 3 Christian Weisgerber
+ 1 Christoph J Gartmann
+ 1 Chuck Houpt
+ 1 Crouton
+ 1 Dan Jacobson
+ 1 Daniel Dickman
+ 1 David Combs
+ 1 David Henderson
+ 0.5 David Woolley
+ 1 Dick Wesseling
+ 1 Diego Elio Petteno
+ 129.7 Doug Kaufman
+ 1 Duncan Simpson
+ 2.5 Eduardo Chappa
+ 1 Elliot Thomas
+ 2 Emanuele Giaquinta
+ 1 Eric Brun
+ 70 External
+ 1 Fabian Fingerle
+ 280.5 Foteos Macrides
+ 2 Frank Heckenbach
+ 4.3 Frederic L W Meunier
+ 1 Frederick P Herrmann
+ 1 Georg Drenkhahn
+ 1 George Lindholm
+ 27 Gisle Vanem
+ 1 Glenn Nielsen
+ 1 Hans Wurst
+ 28.5 Hataguchi Takeshi
+ 1 Heikki Kantola
+ 0.5 Helen Sommer
+ 23 Henry Nelson
+ 1 Hiram Lester Jr
+ 8.5 Hiroyuki Senshu
+ 3 Hynek Med
+ 0.3 Igor B Poretsky
+ 84.8 Ilya Zakharevich
+ 6.5 Ismael Cordeiro
+ 2 J Kevin Ternes
+ 1 Jacob Poon
+ 27.5 James E Spath
+ 1 Jamie Strandboge
+ 1 Jan Hlavacek
+ 2.5 Jason F McBrayer
+ 1 Jean-Yves Levesque
+ 1 Jeffrey C Honig
+ 1 Jens Schmalzing
+ 1 Jens Seidel
+ 1 Jerome Lauret
+ 2 Joey Schulze
+ 0.3 Johannes Hromadka
+ 35 John Bley
+ 6 John E Davis
+ 1 John Hawkinson
+ 1 John Nowlin
+ 2 Jonathan Sergent
+ 1 Josef Sontgen
+ 2 Julian Coleman
+ 2 Kamil Dudka
+ 3 Karl Eichwalder
+ 1 Karl-Andre Skevik
+ 4 Kihara Hideto
+ 29.3 Kim DeVaughn
+ 706.3 Klaus Weide
+ 1 Lalo Martins
+ 1 Larry Hynes
+ 1 Larry Virden
+ 15.8 Larry W Virden
+ 11 Laura Eaves
+ 342.3 Leonid Pauzner
+ 1 Liam Davis
+ 1 Marc Huber
+ 0.3 Marek Kubita
+ 1 Martijn Dekker
+ 2 Masashi Fujita
+ 1 Masayasu Ishikawa
+ 1 Masayuki Hatta
+ 1 Matt Kraal
+ 1 Michael Sobolev
+ 6.5 Michael Warner
+ 1 Michel Such
+ 1 Mike Castle
+ 2 Munechika Sumikawa
+ 1 Nigel Horne
+ 0.5 Nikos Chantziaras
+ 1 OpenBSD CVS
+ 1 Owen Leibman
+ 1 Pat Walsh
+ 13.5 Paul B Mahol
+ 1 Paul D Smith
+ 52.5 Paul Gilmartin
+ 1 Peter Backes
+ 1 Peter Canning
+ 1 Phil Pennock
+ 27.3 Philip Webb
+ 14 Philippe De Muyter
+ 1 Quentin Minster
+ 5.5 Rado Smiljanic
+ 2 Ralph Babel
+ 1 Randall
+ 1 Reiner Hermann
+ 1 Risto Widenius
+ 1 Rob Cameron
+ 1 Ruda Moura
+ 1 Ryan Nielsen
+ 2 Scott Bigham
+ 1 Sergej Kvachonok
+ 6 Sergey Svishchev
+ 1 Serhii Hlodin
+ 2 Simon Kainz
+ 15 Sinan Kaan Yerli
+ 7.8 Stefan Caunter
+ 1 Stepan Kasal
+ 1 Tadayoshi Okuma
+ 1 Takao Fujiwara
+ 1 Taketo Kabe
+ 1 Thomas Braun
+ 2188.3 Thomas E Dickey
+ 1.5 Thomas Klausner
+ 1 Thomas Petazzoni
+ 1 Thomas Viehmann
+ 21 Thorsten Glaser
+ 1 Tim Chase
+ 4 Tim Larson
+ 1 Timur Birsh
+ 2 Tomas Vanhala
+ 1.5 Ulf Harnhammar
+ 6.5 Victor Schneider
+ 2 Ville Herva
+ 86 Vlad Harchev
+ 37.5 Wayne Buttles
+ 1 Wesley Morgan
+ 1 Zdenek Prikryl
+ 1.5 nsh@horae.dti.ne.jp
+ 4563 Total
+
+-------------------------------------------------------------------------------
+
+Older attributions are problematic for several reasons:
+ + some contributors were not credited,
+ + some changes were not recorded,
+ + the level of importance of changes in the older logs differs noticeably
+ from the newer logs.
+There is neither a source repository nor a mailing-list archive to consult to
+resolve these issues.
+
+However, some information can be gleaned from the existing change-logs
+to show the principal contributors for each release (i.e., not listing those
+with less than 1%):
+
+** credits from CHANGES docs/CHANGES2.8 (4492.6 changes)
+ 1.0 Brian J Pardy
+ 2.9 Doug Kaufman
+ 6.2 Foteos Macrides
+ 1.9 Ilya Zakharevich
+ 15.7 Klaus Weide
+ 7.6 Leonid Pauzner
+ 1.2 Paul Gilmartin
+ 48.7 Thomas E Dickey
+ 1.9 Vlad Harchev
+** credits from CHANGES docs/CHANGES* (5959.6 changes)
+ 2.2 Doug Kaufman
+ 23.0 Foteos Macrides
+ 1.4 Ilya Zakharevich
+ 12.1 Klaus Weide
+ 5.7 Leonid Pauzner
+ 36.7 Thomas E Dickey
+ 1.4 Vlad Harchev
+ 3.5 unknown
+** credits from CHANGES (3572.6 changes)
+ 1.3 Brian J Pardy
+ 3.3 Doug Kaufman
+ 2.4 Ilya Zakharevich
+ 12.3 Klaus Weide
+ 8.8 Leonid Pauzner
+ 1.5 Paul Gilmartin
+ 54.2 Thomas E Dickey
+ 2.4 Vlad Harchev
+** credits from docs/CHANGES2.8 (920 changes)
+ 1.2 Doug Kaufman
+ 30.5 Foteos Macrides
+ 29.0 Klaus Weide
+ 3.2 Leonid Pauzner
+ 1.4 Philippe De Muyter
+ 27.4 Thomas E Dickey
+ 2.6 Wayne Buttles
+** credits from docs/CHANGES2.7 (233 changes)
+ 77.3 Foteos Macrides
+ 3.4 Hiram Lester Jr
+ 5.2 Klaus Weide
+ 1.3 LWV
+ 3.4 unknown
+** credits from docs/CHANGES2.6 (240 changes)
+ 83.8 Foteos Macrides
+ 1.2 Klaus Weide
+ 2.1 LWV
+ 5.8 unknown
+** credits from docs/CHANGES2.5 (554 changes)
+ 1.3 DT
+ 1.4 David Woolley
+ 82.3 Foteos Macrides
+ 4.7 unknown
+** credits from docs/CHANGES2.4 (328 changes)
+ 75.9 Foteos Macrides
+ 3.0 GL
+ 16.2 unknown
+** credits from docs/CHANGES2.3 (112 changes)
+ 1.8 David Trueman
+ 1.8 Foteos Macrides
+ 94.6 unknown
diff --git a/docs/README.options b/docs/README.options
new file mode 100644
index 0000000..b388d4c
--- /dev/null
+++ b/docs/README.options
@@ -0,0 +1,81 @@
+README.options
+
+Using the lynx browser [O]ptions configuration tool.
+
+General Usage on a unix system:
+
+Press "O" at any time in your lynx session to access this utility page.
+This is one of several custom "system" URLs that cause lynx to self-configure.
+
+Please note:
+Ensure and confirm that your [O]ptions session is flushed to disk, by selecting:
+
+Save options to disk: [_] before selecting "Accept Changes".
+
+This freshens your .lynxrc file, which is your default "personal" configuration
+for the lynx browser. Otherwise you will only affect settings for your
+individual session; they aren't remembered next time you use lynx, (since you
+actually did not tell lynx to remember them).
+
+This disk write to .lynxrc is not default behaviour for [O]ptions
+configurations. The lynx browser tends to tread lightly at first. Note that
+you must first have permission on your system to create, write to and read
+from a .lynxrc file in your home directory.
+
+Using some of the menu items:
+
+User mode controls the amount of "on screen" help at the bottom of the screen.
+You get the familiar view of the link target you are on when you use ADVANCED
+user mode, and this also gives you the most top to bottom screen area.
+ADVANCED user mode also allows for sub bookmark functionality (see below).
+
+The (for now) command line only option --nomargins provides the largest
+readable left to right screen coverage.
+
+Editor is for jumping to vi or whatever you prefer during local file edits
+and for textarea editing with ^Xe if you are filling out a form while browsing.
+
+Please see README.cookies for a brief cookie handling discussion.
+
+Multi-bookmarks allows several files to be your bookmarks; it will introduce
+a browse list of them if they are defined as below.
+
+Once the Multi-bookmarks setup on Options is done and has been written out to
+your .lynxrc (remember to Accept Changes and to Save Changes to disk),
+in .lynxrc you will see a list of 25 possible "other" bookmark files
+(26 letters minus "A") - you need to then associate some of them with
+(meaningful) filenames to get the Multi-bookmark menu.
+
+Note that the files must be relative to your home directory.
+
+The best way to create and manage them is by using the MultiBookmarkMenu (MBM)
+configuration tool selectable from the [O]ptions menu.
+
+The MBM allows you to describe the sub bookmark, and name a file relative
+to your home directory that will contain the html for the saved links.
+You populate one of the lettered sub bookmarks, describe it, and provide a
+filename. ">" saves the edits, and ^G cancels edits.
+
+The sub bookmarks will be accessible by pressing the associated key from a
+menu when invoking the bookmark choice (lynx -book, or 'V' in a session), or
+when saving new bookmarks. You can directly access your sub bookmarks by letter
+key alone by defining sub_bookmarks=ADVANCED in .lynxrc or lynx.cfg, if you
+have ADVANCED general user mode selected as well.
+The Multi-bookmark submenu can still be seen in ADVANCED by pressing "=", and
+is always seen in STANDARD mode.
+
+They are seen in your .lynxrc like so:
+
+multi_bookmarkB=cars,Cars
+multi_bookmarkC=news,News
+multi_bookmarkD=sports,Sports
+
+Filename precedes description in .lynxrc, whereas in the MBM configuration
+utility, the description is the left column, and the filename is in the right
+column displayed.
+
+
+Stef Caunter
+http://caunter.ca/contact.html
+http://caunter.ca/README.options
+
diff --git a/docs/README.release b/docs/README.release
new file mode 100644
index 0000000..a5dbd80
--- /dev/null
+++ b/docs/README.release
@@ -0,0 +1,14 @@
+-- $LynxId: README.release,v 1.1 2009/09/06 13:57:02 tom Exp $
+
+The version number with dots appears in, e.g.,
+ README
+ docs/README.metrics
+ lynx.hlp
+ lynx.man
+ lynx_help/Lynx_users_guide.html
+
+The version number with dashes appears in several places, e.g.,
+ lynx.cfg
+ lynx_help/lynx_help_main.html
+ makefile.in
+ userdefs.h
diff --git a/docs/README.rootcerts b/docs/README.rootcerts
new file mode 100644
index 0000000..67fb641
--- /dev/null
+++ b/docs/README.rootcerts
@@ -0,0 +1,308 @@
+ DOS/Windows-oriented notes on Root Certificates
+
+To use certificates or a cert bundle within an SSL enabled
+application such as lynx you must place your certificate
+files into a known directory, and set the environment
+variables to a proper value (e.g. in CONFIG.SYS file).
+
+ set SSL_CERT_DIR=x:/usr/local/ssl/certs
+ set SSL_CERT_FILE=x:/usr/local/ssl/cert.pem
+
+(See "What are root certificates" below.)
+
+
+Q. Why would I want to install openssl.exe?
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+openssl.exe is used to manage certificates. (See "What are root certificates"
+below.)
+
+Q. How to install openssl.exe?
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Put openssl.exe in a directory in your PATH and the DLLs to a directory
+in your LIBPATH.
+
+Copy conf\openssl.cnf.demoCA to a directory of your
+choice, rename it to openssl.conf and set the environment variable
+OPENSSL_CONF by putting
+
+SET OPENSSL_CONF=<your-directory>\openssl.cnf
+
+into CONFIG.SYS.
+
+
+Q. Why is this document so paranoid?
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+If you want to use OpenSSL, then probably your Internet transactions have
+*real* monetary value embedded in them. And as usual, the security is as good
+as the weakest link. This document unravels only the tip of the iceberg
+of what can go wrong with improperly established "secure" connections. And
+given the monetary value involved, "bad guys" have a high incentive to exploit
+the weakest links. As experience shows, do not underestimate the intelligence
+of bad guys...
+
+Really, with security, a little knowledge is a dangerous thing; one can
+suspect that many people, if they really understood the trust structures
+associated with SSL, would be rather careful about checking the details
+of certificates.
+
+Q. What are root certificates?
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Making a secure connection is like sending your valuables (for storage or
+consumption) to somebody who agreed to be at a prearranged place. To
+guard the valuables on the way there, you can ask for a police escort; this is
+what https:// connections are about. However, it does not make any sense to
+have an escort if the goods are transferred to a random person who happens to
+be at this place; one needs to certify the identity of the receiver as well.
+
+The certification process is a chain; when site A wants to certify that it is
+actually what it claims, it actually says "Check this certificate with site B";
+to proceed, one needs to certify that site B is what it claims, so B may
+redirect to site C etc. For this process to stop, some sites claim
+"You must know my certificate, check it yourself". These certificates are
+"root certificates"; one cannot verify such a site unless one has the
+certificate for the "end of its certification chain". If you don't have the
+relevant root certificate in your local certificates file, it means that
+you don't trust anyone to vouch for the authenticity of the site.
+
+So one should have a collection of known certificates from several well-known
+sites known as "Root Certification Authorities". Most sites for large-scale
+businesses have certificates which will eventually resolve to these places.
+Such certificates represent people like Verisign that are in the business of
+confirming the identity of servers, etc.
+
+Additionally, since having yourself certified through another site costs,
+some sites avoid this cost via presenting "end-of-chain certificates".
+One should have a way to obtain these certificates via other means than
+insecure Internet connection (e.g., one can walk into the office and copy
+the certificate file to a floppy). These are so-called "Self-signed
+certificates"; they are "root certificates" as well. The locally-installed
+securely obtained copies of such certificates are referred to as
+"local certificates". (See 'What is "Snake Oil Ltd."' below.)
+
+If you are presented with a locally-unresolvable root certificate, and you
+*believe* that you are really talking to the site, and not someone
+in between (who is either completely simulating the site or relaying
+your requests onto the real site - called a "man in the middle" attack),
+you will still have an encrypted connection. Otherwise, you should act
+as though the site was an impostor, unless and until you manage to get
+a root certificate from a trustworthy source, and that root certificate
+represents someone that you would trust to have vetted the site you
+want to connect to.
+
+Local certificates are stored in SSL_CERT_FILE (this "cert bundle", usually
+named cert.pem, contains several signatures for "Root Certification
+Authorities") and SSL_CERT_DIR (which has a signature per file, and usually
+contain local copies of self-signed certificates).
+
+There are three crucial considerations to be added to this picture:
+
+ a) While there are ways to ensure that the receivers are who they claim,
+ there is absolutely no technological way to verify how *trustworthy*
+ the receiving party is. It does not make sense to secure-send your
+ valuables to a certified receiver if this receiver is a crook (or will
+ just keep them later in a publicly accessible place).
+
+ b) "VeriSign Syndrome". For the above scheme of "a chain of trust" to work,
+ the "Root Certification Authorities" should be *very* trustworthy
+ high-integrity entities. Unfortunately, there are certain doubts that
+ this is so. E.g., fall 2003, VeriSign started an attack on DNS scheme
+ which could disrupt the whole architecture of Internet (hijacking *all*
+ unclaimed Internet addresses and redirecting them to a promotional site;
+ google for VeriSign DNS hijack).
+
+ One major company even issued a Microsoft certificate to a company
+ other than Microsoft, and there had to be a Windows critical update
+ to block that certificate.
+
+ c) Keep in mind that the "big 2 browsers" are adding an increasing
+ number of root certificates, and most users fail to realise that they
+ are putting a trust in the supply chain for the browser to give them
+ the certificates of reliable organisations (the browser suppliers could
+ make bad choices, or the browser could have been hacked before you got
+ it).
+
+ Incidentally, standard browsers come with certificates representing
+ very different levels of identity verification, but most people accept
+ all of those supplied with the big 2 as equally valid.
+
+Q. How to obtain root certificates?
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Certificate files, such as cert.pem, are security critical; you have to
+trust whoever supplies it to you; all your certification process is no more
+trustworthy than the site you downloaded cert.pem from. So you shouldn't just
+accept any offer.
+
+One way is to copy them from a machine which already obtained them in a secure
+way. Another one is to extract them from a web browser which was itself
+obtained in a secure way (see "How to extract certificates from Internet
+Explorer" below). If anything else fails, obtaining a privately-generated
+bundle from third-parties, such as
+
+ http://www.kfu.com/~nsayer/encryption/ca-bundle.crt.text
+
+is *not* much better than no certificates at all, but may avoid some warnings
+from applications. One of the places which has a bundle is the mod_ssl site.
+
+Q. Should you trust this distribution system?
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+It is very hard to imagine a situation when the answer is different from
+"Absolutely not!".
+
+Indeed, obtaining the certificates is only half of the problem.
+The certificates are going to be checked by the SSL library. Can you trust
+these executables (DLLs)? Did you obtain the library via a secure connection?
+Are you sure that the place you obtained it from has reasonable security
+practice, so that the archive could not be tampered with? The latter place
+most probably did not build the DLLs themselves; chances are they just
+store what a fourth-party supplied them. Was *that* file transfer done via
+secure channels? Can you trust this fourth-party so that it did not insert
+Trojans?
+
+Chances are that all of these questions are answered "No". There are still
+major problems with bootstrapping security via the Internet...
+
+What about the application which uses these DLLs? Do you have any reason to
+trust it? What about the OS itself? Did it come from a trustworthy source
+via trustworthy channels? Are you sure it was not tampered with?
+
+Q. How to compile and link with OpenSSL libraries?
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Put the files from include and lib to your emx directory,
+or directories on C_INCLUDE_PATH and LIBRARY_PATH.
+Note that openssl should become a subdirectory of your include directory.
+If you need .lib files you can create them using emxomf.
+
+The supplied library files link against the new renamed dlls open_ssl and
+cryptsll.
+
+See the doc directory for some information and visit
+http://www.columbia.edu/~ariel/ssleay/ for more infos.
+
+
+Q. Why do you need your own keys and certificates?
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+There are several situations: having a server which accepts secure connections;
+authenticating yourself to a server by means other than login/password,
+sending S-Mime crypto-mail, authenticating from a client browser to a server.
+In each of these situations one needs keys.
+
+The following sites may be useful:
+
+ http://www.pseudonym.org/ssl/ssl_cook.html#environment
+ http://the.earth.li/~sgtatham/putty/0.53b/htmldoc/Chapter8.html#8.2
+
+Q. How to generate your own keys and certificates?
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+There are many ways. A good solution is to use sslRexx. It provides everything
+you need. PuTTYgen is a key generator that will work.
+
+Below is a short description of how I made my own Certification Authority,
+a Server Key for Apache and a client Key/Certificate for me, signed by my
+own CA.
+
+
+Q. Howto: Root CA (needed to self-sign all certificates)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Generate a CA-Key and store it in sub-directory private:
+
+ openssl genrsa -des3 -out private/MyOwnCA.pem 2048
+
+Make a selfsigned certificate based on above key.
+
+ openssl req -new -x509 -days 730 -key private/CAkey.pem -out CAcert.pem
+
+This certificate will expire in 2 years.
+
+Optional: generate text output of this certificate:
+
+ openssl x509 -in ./CAcert.pem -text > CAcert.txt
+
+Now you have a key and certificate for your own CA which can be used
+to sign user and server keys. The CAcert is also needed to configure
+Apache and Netscape. You can/should give away the CA certificate but
+never give the CA key to anybody.
+
+
+Q. Howto: Your Client Certificate/Key
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Generate a private key
+----------------------
+
+ openssl genrsa -des3 -out hrom-key.pem 2048
+
+
+Create a signing request (same command again)
+------------------------
+
+ openssl req -new -key hrom-key.pem -out hrom-req.pem
+
+Let the CA sign it (same command again)
+------------------
+
+ openssl ca -in hrom-req.pem -out hrom-cert.pem -outdir MyOwnCA/newcerts
+
+After you get back the certificate from the CA, combine it with
+your private key and store the result as p12 file. This file can
+be imported into your browser. The browser will use this file to present
+to a server requiring it for access.
+
+ openssl pkcs12 -export -name Hromadka -in hrom-cert.pem -inkey hrom-key.pem -out hrom.p12
+
+
+Security Notes: Never give your private key to a CA, they only need the
+signing request. Never give away your p12 file. Always secure your private
+keys with a passphrase.
+
+
+Q. How to use c_rehash?
+~~~~~~~~~~~~~~~~~~~~~~
+
+One needs a working port of Perl and cp.exe to run this. Set OPENSSL to the
+full name of openssl executable. One may also need to change some ':' to
+$Config{path_sep}. c_rehash finds certs from environment variables and allows
+them to be recognized by openssl.
+
+Q. How to extract certificates from Internet Explorer?
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+To make your own file of certificates, go to the
+"Tools/Internet Options/Content/Certificates/Trusted Root Certificates"
+section of IE. Select all the certificates, then "export" to a file.
+It will be saved as a PKCS#7 file, with suffix ".p7b". You can call
+it "ca_bundle.p7b". Then use openssl to convert it with the command:
+"openssl pkcs7 -inform DER -in ca_bundle.p7b -print_certs -text -out cert.pem".
+Ask your system administrator to put the file "cert.pem" in the openssl
+directory and c_rehash it. Then lynx can check the certificates against the
+set of certificates that you (or Microsoft) trusts, and you won't get the
+warning message any more.
+
+Q. How to install a self-signed certificate?
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+When you would like to trust a self-signed (non-commercial) certificate you will
+need to get hold of the actual file. If it's a cert local to your network you
+can ask the sysadmin to make it available for download as a link on a webpage.
+
+If such file is not human-readable it's probably DER formatted and will need to
+be converted to PEM format to allow openssl to use it.
+
+To convert DER formatted certificates into something openssl can deal with:
+
+Save the cert as site_name.crt in a directory. In that directory, type:
+
+ openssl x509 -inform DER -in site_name.crt -outform PEM -out site_name.pem
+
+You can now copy this individual cert into the directory for that and hash the
+cert by running c_rehash. A complete discussion of this procedure for unix is
+in the document README.sslcerts.
diff --git a/docs/README.ssl b/docs/README.ssl
new file mode 100644
index 0000000..c9d1c79
--- /dev/null
+++ b/docs/README.ssl
@@ -0,0 +1,69 @@
+SSL support for Lynx 2.8.5pre.1
+-- adapted from http://www.mentovai.com/lynx/
+
+Lynx, in its unmodified form, will not allow you to make secure socket layer
+(SSL) connections. SSL is used for the secure transfer of information over the
+Internet. Many sites are now requiring SSL to ensure security for themselves
+and their users. With a version of Lynx modified to support SSL, Lynx users
+can now visit these sites with ease as well.
+
+The SSL configure option (--with-ssl) for Lynx provides the ability to make use
+of SSL over HTTP for secure access to web sites (HTTPS) and over NNTP for
+secure access to news servers (SNEWS). SSL is handled transparently, allowing
+users to continue accessing web sites and news services from within Lynx
+through the same interface for both secure and standard transfers.
+
+This is based on, and requires, the OpenSSL library. OpenSSL's distribution
+and use may be restricted by licenses and laws. For information on obtaining
+OpenSSL, as well as information on its distribution, see
+
+ http://www.openssl.org/
+
+The main distribution site is at
+
+ ftp://ftp.openssl.org/source/
+
+Lynx also has experimental support for GnuTLS (configure option --with-gnutls).
+For information on GnuTLS, see
+
+ http://www.gnu.org/software/gnutls/
+
+To test your version of Lynx for SSL support, try it out with an SSL site.
+Below are secure (https) pages which will load if your browser contains SSL
+support and you accept their certificates; they give you some information about
+the connection.
+
+ https://www.gnutls.org:5555/
+ https://www2.ggn.net/cgi-bin/ssl
+
+Lynx will complain about the certificate, since the certificate presented is
+untrusted. You may accept this certificate to test your configuration, since
+it is a test, but it is a bad idea to blindly accept certificates from unknown
+websites if you are transmitting form data or files.
+
+You should review the document README.sslcerts for a detailed discussion of
+correct certificate handling possibilities and procedures in lynx.
+
+Users are reminded to check the laws and regulations about encryption software
+in their own countries.
+
+Here is the URL for US notification rules:
+
+ http://www.bxa.doc.gov/Encryption/PubAvailEncSourceCodeNofify.html
+
+Note that that isn't a typo; it really is "Nofify". The site contains
+links to the full EAR regulations.
+
+Lynx is GPL'd, for our own use it falls under the regulations in EAR section
+740.13(e)(1):
+
+ (1) Encryption source code controlled under 5D002, which would be
+ considered publicly available under section 734.3(b)(3) and
+ which is not subject an express agreement for the payment a
+ licensing fee or royalty for commercial production or sale of
+ any product developed with the source code, is released from
+ EI controls and may be exported or reexported without review
+ under License Exception TSU, provided you have submitted
+ written notification to BXA of the Internet location (e.g.,
+ URL or Internet address) or a copy of source code by the time
+ of export.
diff --git a/docs/README.sslcerts b/docs/README.sslcerts
new file mode 100644
index 0000000..39c3dcd
--- /dev/null
+++ b/docs/README.sslcerts
@@ -0,0 +1,265 @@
+ Lynx SSL support for certificates - README.sslcerts file
+
+BACKGROUND:
+
+The original README.ssl document for lynx stated:
+
+ Note that the server... may not have a valid certificate. Lynx will not
+ complain, as it does not yet support certificates...
+
+Such lack of support is no longer the case. Lynx now features excellent
+certificate management through the openssl project. There is almost no
+online documentation available regarding how to use openssl's certificate
+management with other programs, so this will accompany lynx and hopefully
+encourage good practical security for unix clients.
+
+Lynx relies on openssl to not only encrypt connections over https, but also to
+determine whether it should even accept a certificate and establish a secure
+connection with a remote host. Because of this reliance upon openssl by lynx,
+most of this tutorial deals with how to use openssl to "install" both
+vendor-provided CA cert bundles as well as self-signed certs from trusted sources
+and, most importantly, how to get them recognized by lynx.
+
+While lynx on many systems will transparently accept valid certificates, not
+all systems enjoy such functionality. Further, as noted above, older versions
+of lynx do not perform any validity checks on a certificate.
+
+There is also the common case of wanting to trust, use and install a
+self-signed certificate from a known server source and have it be trusted by
+client programs.
+
+Briefly, the procedure will involve confirming the default system location for
+certificates, setting values for SSL_CERT_DIR and SSL_CERT_FILE in
+the environment, and converting and hashing the certificates using openssl
+utilities to enable recognition.
+
+THE CURRENT SITUATION:
+
+Prior to lynx2.8.5dev9, lynx did not check at all for certificate validity.
+
+Since lynx2.8.5.dev9, lynx has reported this openssl error:
+
+SSL error:unable to get local issuer certificate-Continue? (y)
+
+whenever an https connection was initiated and the certificate could not be
+found, for whatever reason, by openssl, and therefore lynx.
+
+This checking for a certificate is an enhancement to security, but rather
+tediously generates errors at each https browser request.
+
+The ability to turn off reporting of this error to the user was added to
+lynx2.8.5dev16 as the FORCE_SSL_PROMPT setting in lynx.cfg as noted in the
+CHANGELOG:
+
+ This lets the user decide whether to ignore prompting for questionable
+ aspects of an SSL connection.
+
+While this is a convenient setting to employ when using lynx to script
+https -dumps, it by definition ignores the issue of certificate validity
+altogether. Those concerned with proper certificate management and
+the maintenance of a store of updated CA certificates will be uncomfortable
+with this relaxed security setting.
+
+The ability to accept a 'wildcard' certificate, where the first character
+is a '*' was added to lynx2.8.6dev18.
+
+PRELIMINARY PROCEDURES:
+
+It is assumed that openssl has been installed correctly, that the default
+cert directory is /usr/local/ssl/certs, (it's often /etc/ssl/certs, but we
+need a point of departure for the discussion) and that lynx has been compiled
+--with-ssl.
+
+The default location for certs on your system may be different, or there may not
+be one. You will have to substitute that location for /usr/local/ssl/certs in
+the following instructions, and/or set environment variables.
+
+To determine the default location for certs on your system you may run the
+following command:
+
+strings libcrypto.a | grep -in cert | less
+
+Look in this output for SSL_CERT_DIR and SSL_CERT_FILE, and the lines just
+above them. This is your default location, respectively, for certificates,
+and the CA cert bundle, cert.pem. You will need to know where libcrypto.a is
+found of course.
+
+Example output:
+
+<snip>
+7490:/etc/ssl/certs
+7491:/etc/ssl/cert.pem
+7492:SSL_CERT_DIR
+7493:SSL_CERT_FILE
+<snip>
+
+Other possible example output:
+
+<snip>
+31555:/usr/local/ssl/certs
+31556:/usr/local/ssl/cert.pem
+31557:SSL_CERT_DIR
+31558:SSL_CERT_FILE
+<snip>
+
+Note that when OpenSSL is installed, the c_rehash utility is installed in a
+bin directory (default /usr/local/ssl/bin). You will need to know where it
+is on your system. The command:
+
+whereis c_rehash
+
+will probably give useful results.
+
+Note also that there is no CA cert bundle distributed with OpenSSL. The
+OpenSSL team specifically decided NOT to do that. Getting a set of trusted
+certificates is left up to the installer.
+
+It is no longer a fairly trivial procedure to pull the bundle of trusted root certs out
+of a recent version of Internet Explorer. Multiple certificates are no longer
+exportable as a DER formatted file; extraction of a single certificate is the only
+export for DER, and DER is what converts to PEM.
+
+Users with access to Apple OS X can export all certificates from Keychain Access System Roots as
+a .pem file. Place this in SSL_CERT_DIR and hash it and you're done.
+
+The MirOS BSD project also provides them. The procedure to convert and install them
+is detailed later in this document, and if you simply need to have commercially provided
+certificates trusted by lynx, you can skip down a few lines to the INSTALLING OR UPDATING
+THE CA BUNDLE section.
+
+Extracted Mozilla cert bundles are available for download from the curl project,
+http://curl.haxx.se/docs/caextract.html along with a script to extract from Mozilla
+source.
+
+
+INSTALLING A SELF-SIGNED CERTIFICATE:
+
+When you would like to trust a self-signed (non-commercial) certificate you will
+need to get hold of the actual file. If it's a cert local to your network you
+can ask the sysadmin to make it available for download as a link on a webpage.
+
+If such file is not human-readable it's probably DER formatted and will need to
+be converted to PEM format to allow openssl to use it.
+
+To convert DER formatted certificates into something openssl can deal with:
+
+Save the cert as site_name.crt in a directory. In that directory, type:
+
+openssl x509 -inform DER -in site_name.crt -outform PEM -out site_name.pem
+
+You can now copy this individual cert into the directory for that, usually
+/usr/local/ssl/certs. The alternative is to concatenate the individual certs
+to the cert.pem bundle in /usr/local/ssl. (Please see INSTALLING OR UPDATING
+THE CA BUNDLE below).
+
+The cert file will now be in an acceptable format to openssl, PEM encoded.
+However, openssl, and by extension lynx, will not know about it until that
+cert is symbolically linked to a file named after the hash value of that cert,
+in the default directory /usr/local/ssl/certs.
+
+So the next thing to do is to hash the cert using c_rehash.
+
+INSTALLING OR UPDATING THE CA BUNDLE:
+
+Now would be a good time to check to see if you have the bundle of CA certs
+/usr/local/ssl/cert.pem, or to update them.
+
+CA bundles are available in various places, such as the MirOS BSD distribution,
+for those who want to take that route, or you can extract the current bundle
+from a current version of Internet Explorer (export them all from IE and
+transfer it onto your system).
+
+From MirOS, a cert bundle is available at
+
+http://caunter.ca/ssl.certs.shar
+
+It includes the cacert.org certificate. Download the latest revision; read the
+file to see how to get the certs out.
+
+No hashing is necessary with this set of certs; it is already done; ignore
+the c_rehash usage below for this bundle. Simply run `sh ssl.certs.shar`
+in SSL_CERT_DIR.
+
+From IE 5.x certs extract as a PKCS7 file and need to be converted with something
+like:
+
+openssl pkcs7 -inform DER -in bundle.crt -outform PEM -out cert.pem \
+-print_certs -text
+
+The resulting cert.pem file should be copied to the default directory for
+bundles (usually /usr/local/ssl) and renamed to "cert.pem", assuming that is
+the SSL_CERT_FILE.
+
+Individual certs can also process if added and hashed in /usr/local/ssl/certs.
+
+We now have all of the individual certs we wish to trust in our certs
+directory, and the most recent bundle of CA certs as well.
+
+Confirm that you have the script c_rehash (See PRELIMINARY PROCEDURES; if it is
+not found, a copy is usually located in the tools directory of the openssl
+source tree. If you use this copy, it needs the execute bit set or it will not
+run).
+
+Run:
+
+./c_rehash
+
+The c_rehash utility is a perl script that runs openssl commands which creates
+the files named after the hash values of the certs in the default directory
+for certs.
+
+Its output looks like this:
+
+Doing /usr/local/ssl/certs
+vsignss.pem => f73e89fd.0
+vsign3.pem => 7651b327.0
+...more output
+<snip>
+
+All pem encoded certs in /usr/local/ssl/certs will now be recognized.
+
+SETTING AND EXPORTING ENVIRONMENT VARIABLES:
+
+If lynx is still not recognizing certs, environment variables need
+to be set; if on a sh type shell, the variables also need to be exported.
+
+The environment variables SSL_CERT_DIR and SSL_CERT_FILE need to be set
+if a non-default location is used for certificates, or if certs just can't be
+found by lynx. They may be set as follows in /etc/profile, or a shell
+initialization .profile or .*shrc, if we run a non csh type shell, according
+to the results of the search for the default location for certs procedure
+(See PRELIMINARY PROCEDURES):
+
+SSL_CERT_DIR="/usr/local/ssl/certs"
+SSL_CERT_FILE="/usr/local/ssl/cert.pem"
+export SSL_CERT_DIR SSL_CERT_FILE
+
+On csh type shells, you can use:
+setenv SSL_CERT_DIR "/usr/local/ssl/certs"
+setenv SSL_CERT_FILE "/usr/local/ssl/cert.pem"
+
+Note that the environment variable SSL_CERT_FILE applies to the cert-bundle
+if used outside of the default location (/usr/local/ssl/cert.pem) compiled
+into OpenSSL. There are issues with SSL_CERT_FILE in 0.9.6x versions of openssl.
+
+The configuration file lynx.cfg allows a system SSL_CERT_FILE variable to be set
+which can simplify matters.
+
+SSL_CERT_FILE:/etc/ssl/certs/ca-certificates.crt
+
+Make sure you have FORCE_SSL_PROMPT set to PROMPT in lynx.cfg like so:
+
+FORCE_SSL_PROMPT:PROMPT
+
+You will now connect without error to https servers with trusted certs, but
+will still get this error for untrusted certs:
+
+SSL error:self signed certificate-Continue? (y)
+
+A quick check confirms that these procedures have the same effect with ssl
+errors in the pine program.
+
+2003 updated 2009
+Stefan Caunter <stefan.caunter@mohawkcollege.ca>
+Mohawk College Department of Computer Science
+Hamilton Ontario Canada
diff --git a/docs/SOCKETSHR.announce b/docs/SOCKETSHR.announce
new file mode 100644
index 0000000..4c08a01
--- /dev/null
+++ b/docs/SOCKETSHR.announce
@@ -0,0 +1,67 @@
+LYNX SUPPORT FOR SOCKETSHR/NETLIB 28-AUG-1996
+---------------------------------
+
+
+What is SocketShr?
+------------------
+
+SOCKETSHR is Eckhart Meyer's socket library interface to the MadGoat NETLIB
+package, which provides a vendor-independent interface to the VMS TCP/IP
+transports. Using this, the same image will run over any of the available
+packages, including UCX, Multinet, CMU, Pathway access and TCPWARE.
+
+SocketShr and NETLIB are separately available libraries that MUST be installed
+before LYNX can use them.
+
+
+How to get NETLIB and SOCKETSHR
+-------------------------------
+
+FTP:
+
+ ftp://ftp.kcl.ac.uk/default/socketshr.*
+ ftp://ftp.wku.edu/fileserv/socketshr.zip
+ ftp://ftp.spc.edu/macro32/savesets/socketshr.zip
+
+ ftp://ftp.kcl.ac.uk/madgoat/netlib.*
+ ftp://ftp.wku.edu/madgoat/netlib017.zip
+ ftp://ftp.spc.edu/macro32/savesets/netlib017.zip
+
+
+By E-Mail:
+ send the following commands in a mail message:
+
+ SEND SOCKETSHR.PACKAGE
+ SEND NETLIB.PACKAGE
+
+ To:
+ vmsserv @ kcl.ac.uk
+
+Other server's may also contain these packages.
+
+NETLIB is copyright of MadGoat Software; SOCKETSHR is copyright of Eckhart
+meyer.
+
+
+Preliminary Setup of SOCKETSHR
+------------------------------
+
+Once SOCKETSHR has been installed, TWO logical names should be defined:
+
+ SOCKETSHR Point to the appropriate shareable image
+ SOCKETSHR_LIBRARY Point to the directory containing SOCKETSHR.H
+ and IOCTL.H
+
+Both should be defined /system /exec
+
+
+Building LYNX
+-------------
+
+Run the BUILD.COM procedures and select the SOCKETSHR_TCP option. This will
+build an image that will run over the SOCKETSHR/NETLIB routines.
+
+
+Andy Harper
+Kings College London
+A.Harper@bay.cc.kcl.ac.uk
diff --git a/docs/TCPWARE.announce b/docs/TCPWARE.announce
new file mode 100644
index 0000000..899a460
--- /dev/null
+++ b/docs/TCPWARE.announce
@@ -0,0 +1,30 @@
+ 03-Jun-1994
+
+ The bug associated with using non-blocking socket handling with
+TCPWare's UCX emulation has been traced by Bernie Votz of Process Software
+to their TCPDRIVER.EXE, and has been fixed. The kit is on FTP.PROCESS.COM
+and is called DRIVERS_V405B.INC (it is only valid for TCPware for OpenVMS
+Version 4.0-5, which is the current version at the time of this announcement).
+The fix will be included in the next TCPWare upgrade. If you have problems,
+contact:
+
+ Bernie Volz
+ Process Software Corporation
+ VOLZ@PROCESS.COM
+
+ If you have an old version of TCPWare, and no current Process
+Software support, modify [.WWW.Library.VMS]libmake.com to include NO_IOCTL in
+the $ cc := cc/define=(...) list. You will not be able to interrupt stalled
+connects (i.e., you'll have to wait for those to time out), but you still will
+we able to interrupt long or stalled document transfers via the 'z' command.
+
+ To build for TCPWare, enter @BUILD TCPWARE or just @BUILD
+and then answer the prompt with the appropriate number for that TCPIP
+package.
+
+ Fote
+
+=========================================================================
+ Foteos Macrides Worcester Foundation for Experimental Biology
+ MACRIDES@SCI.WFEB.EDU 222 Maple Avenue, Shrewsbury, MA 01545
+=========================================================================
diff --git a/docs/VMSWAIS.announce b/docs/VMSWAIS.announce
new file mode 100644
index 0000000..50133f7
--- /dev/null
+++ b/docs/VMSWAIS.announce
@@ -0,0 +1,28 @@
+ 03-Jun-1994
+
+ I have added DIRECT_WAIS support for VMS to Lynx. It uses highly
+modified freeWAIS modules, collected into HTVMS_WaisUI.c, HTVMS_WaisUI.h,
+HTVMS_WaisProt.c, and HTVMS_WaisProt.h, interfaced to HTWAIS.c and HTWSRC.c
+of the WWWLib. The socket reads and writes use the code for VMS in the Lynx
+version of the WWWLib, and thus are non-blocking (interruptible via the 'z'
+command), and "already" ported to all the VMS TCPIP packages supported by
+Lynx. All messaging associated with WAIS searches and document fetches go to
+the Lynx statusline as Progress() or Alarm() reports.
+
+ I also prettied up the HTWAIS.c and HTWSRC.c screen displays for both
+VMS and Unix. I've been trying to build in recursive FORM-based interfaces,
+instead of the present iSINDEX-based interfaces, but haven't succeeded ;(.
+
+ The DIRECT_WAIS support is automatic for VMS (i.e., is implemented
+via the BUILD.COM and LIBMAKE.COM procedures, without need to specify anything
+but your TCPIP package, as in the previous, standard VMS builds). Simply
+enter @BUILD <TCPIP package> or enter @BUILD and then the number of
+your TCPIP package in response to the prompt, and you'll have DIRECT_WAIS
+support along with every other wonderful thing in Lynx 8-).
+
+ Fote
+
+=========================================================================
+ Foteos Macrides Worcester Foundation for Experimental Biology
+ MACRIDES@SCI.WFEB.EDU 222 Maple Avenue, Shrewsbury, MA 01545
+=========================================================================
diff --git a/docs/djgpp.key b/docs/djgpp.key
new file mode 100644
index 0000000..0ce8631
--- /dev/null
+++ b/docs/djgpp.key
@@ -0,0 +1,214 @@
+ DJGPP Keyhandler Keymaps
+
+Control_A 0x001
+Control_B 0x002
+Control_C 0x003
+Control_D 0x004
+Control_E 0x005
+Control_F 0x006
+Control_G 0x007
+BackSpace 0x008
+Control_H 0x008
+Tab 0x009
+Control_I 0x009
+LineFeed 0x00a
+Control_J 0x00a
+Control_K 0x00b
+Control_L 0x00c
+Return 0x00d
+Control_M 0x00d
+Control_N 0x00e
+Control_O 0x00f
+Control_P 0x010
+Control_Q 0x011
+Control_R 0x012
+Control_S 0x013
+Control_T 0x014
+Control_U 0x015
+Control_V 0x016
+Control_W 0x017
+Control_X 0x018
+Control_Y 0x019
+Control_Z 0x01a
+Control_LBracket 0x01b
+Escape 0x01b
+Control_BackSlash 0x01c
+Control_RBracket 0x01d
+Control_Caret 0x01e
+Control_Underscore 0x01f
+Space 0x020
+ExclamationPoint 0x021
+DoubleQuote 0x022
+Hash 0x023
+Dollar 0x024
+Percent 0x025
+Ampersand 0x026
+Quote 0x027
+LParen 0x028
+RParen 0x029
+Star 0x02a
+Plus 0x02b
+Comma 0x02c
+Dash 0x02d
+Period 0x02e
+Slash 0x02f
+Colon 0x03a
+SemiColon 0x03b
+LAngle 0x03c
+Equals 0x03d
+RAngle 0x03e
+QuestionMark 0x03f
+At 0x040
+LBracket 0x05b
+BackSlash 0x05c
+RBracket 0x05d
+Caret 0x05e
+UnderScore 0x05f
+BackQuote 0x060
+LBrace 0x07b
+Pipe 0x07c
+RBrace 0x07d
+Tilde 0x07e
+Control_Backspace 0x07f
+BackTab 0x10f
+Alt_Q 0x110
+Alt_W 0x111
+Alt_E 0x112
+Alt_R 0x113
+Alt_T 0x114
+Alt_Y 0x115
+Alt_U 0x116
+Alt_I 0x117
+Alt_O 0x118
+Alt_P 0x119
+Alt_LBracket 0x11a
+Alt_RBracket 0x11b
+Alt_Return 0x11c
+Alt_A 0x11e
+Alt_S 0x11f
+Alt_D 0x120
+Alt_F 0x121
+Alt_G 0x122
+Alt_H 0x123
+Alt_J 0x124
+Alt_K 0x125
+Alt_L 0x126
+Alt_Semicolon 0x127
+Alt_Quote 0x128
+Alt_Backquote 0x129
+Alt_Backslash 0x12b
+Alt_Z 0x12c
+Alt_X 0x12d
+Alt_C 0x12e
+Alt_V 0x12f
+Alt_B 0x130
+Alt_N 0x131
+Alt_M 0x132
+Alt_Comma 0x133
+Alt_Period 0x134
+Alt_Slash 0x135
+Alt_KPStar 0x137
+F2 0x13c
+F3 0x13d
+F4 0x13e
+F5 0x13f
+F6 0x140
+F7 0x141
+F8 0x142
+F9 0x143
+F10 0x144
+Alt_KPMinus 0x14a
+Center 0x14c
+Alt_KPPlus 0x14e
+Shift_F1 0x154
+Shift_F2 0x155
+Shift_F3 0x156
+Shift_F4 0x157
+Shift_F5 0x158
+Shift_F6 0x159
+Shift_F7 0x15a
+Shift_F8 0x15b
+Shift_F9 0x15c
+Shift_F10 0x15d
+Control_F1 0x15e
+Control_F2 0x15f
+Control_F3 0x160
+Control_F4 0x161
+Control_F5 0x162
+Control_F6 0x163
+Control_F7 0x164
+Control_F8 0x165
+Control_F9 0x166
+Control_F10 0x167
+Alt_F1 0x168
+Alt_F2 0x169
+Alt_F3 0x16a
+Alt_F4 0x16b
+Alt_F5 0x16c
+Alt_F6 0x16d
+Alt_F7 0x16e
+Alt_F8 0x16f
+Alt_F9 0x170
+Alt_F10 0x171
+Control_Print 0x172
+Control_Left 0x173
+Control_Right 0x174
+Control_End 0x175
+Control_PageDown 0x176
+Control_Home 0x177
+Alt_1 0x178
+Alt_2 0x179
+Alt_3 0x17a
+Alt_4 0x17b
+Alt_5 0x17c
+Alt_6 0x17d
+Alt_7 0x17e
+Alt_8 0x17f
+Alt_9 0x180
+Alt_0 0x181
+Alt_Dash 0x182
+Alt_Equals 0x183
+Control_PageUp 0x184
+F11 0x185
+F12 0x186
+Shift_F11 0x187
+Shift_F12 0x188
+Control_F11 0x189
+Control_F12 0x18a
+Alt_F11 0x18b
+Alt_F12 0x18c
+Control_Up 0x18d
+Control_KPDash 0x18e
+Control_Center 0x18f
+Control_KPPlus 0x190
+Control_Down 0x191
+Control_Insert 0x192
+Control_Delete 0x193
+Control_KPSlash 0x195
+Control_KPStar 0x196
+Alt_EHome 0x197
+Alt_EUp 0x198
+Alt_EPageUp 0x199
+Alt_ELeft 0x19b
+Alt_ERight 0x19d
+Alt_EEnd 0x19f
+Alt_EDown 0x1a0
+Alt_EPageDown 0x1a1
+Alt_EInsert 0x1a2
+Alt_EDelete 0x1a3
+Alt_KPSlash 0x1a4
+Alt_Tab 0x1a5
+Alt_Enter 0x1a6
+Alt_Escape 0x1a7
+Control_At 0x1a8
+Alt_Backspace 0x1a9
+Control_ELeft 0x273
+Control_ERight 0x274
+Control_EEnd 0x275
+Control_EPageDown 0x276
+Control_EHome 0x277
+Control_EPageUp 0x284
+Control_EUp 0x28d
+Control_EDown 0x291
+Control_EInsert 0x292
+Control_EDelete 0x293
diff --git a/docs/pdcurses.key b/docs/pdcurses.key
new file mode 100644
index 0000000..5e383aa
--- /dev/null
+++ b/docs/pdcurses.key
@@ -0,0 +1,123 @@
+ PDCurses Keymaps
+
+KEY_F2 0x213 /* F2 */
+KEY_F3 0x214 /* F3 */
+KEY_F4 0x215 /* F4 */
+KEY_F5 0x216 /* F5 */
+KEY_F6 0x217 /* F6 */
+KEY_F7 0x218 /* F7 */
+KEY_F(n) (0x108+(n)) /* If n>7 (9 keys are reserved) */
+ALT_0 0x197 /* Alt-0 */
+ALT_1 0x198 /* Alt-1 */
+ALT_2 0x199 /* Alt-2 */
+ALT_3 0x19a /* Alt-3 */
+ALT_4 0x19b /* Alt-4 */
+ALT_5 0x19c /* Alt-5 */
+ALT_6 0x19d /* Alt-6 */
+ALT_7 0x19e /* Alt-7 */
+ALT_8 0x19f /* Alt-8 */
+ALT_9 0x1a0 /* Alt-9 */
+ALT_A 0x1a1 /* Alt-A */
+ALT_B 0x1a2 /* Alt-B */
+ALT_C 0x1a3 /* Alt-C */
+ALT_D 0x1a4 /* Alt-D */
+ALT_E 0x1a5 /* Alt-E */
+ALT_F 0x1a6 /* Alt-F */
+ALT_G 0x1a7 /* Alt-G */
+ALT_H 0x1a8 /* Alt-H */
+ALT_I 0x1a9 /* Alt-I */
+ALT_J 0x1aa /* Alt-J */
+ALT_K 0x1ab /* Alt-K */
+ALT_L 0x1ac /* Alt-L */
+ALT_M 0x1ad /* Alt-M */
+ALT_N 0x1ae /* Alt-N */
+ALT_O 0x1af /* Alt-O */
+ALT_P 0x1b0 /* Alt-P */
+ALT_Q 0x1b1 /* Alt-Q */
+ALT_R 0x1b2 /* Alt-R */
+ALT_S 0x1b3 /* Alt-S */
+ALT_T 0x1b4 /* Alt-T */
+ALT_U 0x1b5 /* Alt-U */
+ALT_V 0x1b6 /* Alt-V */
+ALT_W 0x1b7 /* Alt-W */
+ALT_X 0x1b8 /* Alt-X */
+ALT_Y 0x1b9 /* Alt-Y */
+ALT_Z 0x1ba /* Alt-Z */
+CTL_LEFT 0x1bb /* Control-Left-Arrow */
+CTL_RIGHT 0x1bc /* Control-Right-Arrow */
+CTL_PGUP 0x1bd /* Control-PgUp */
+CTL_PGDN 0x1be /* Control-PgDn */
+CTL_HOME 0x1bf /* Control-Home */
+CTL_END 0x1c0 /* Control-End */
+KEY_B2 0x1c5 /* center on Virt. keypad */
+PADSLASH 0x1ca /* slash on keypad */
+CTL_PADENTER 0x1cc /* ctl-enter on keypad */
+ALT_PADENTER 0x1cd /* alt-enter on keypad */
+PADSTOP 0x1ce /* stop on keypad */
+PADSTAR 0x1cf /* star on keypad */
+PADMINUS 0x1d0 /* minus on keypad */
+PADPLUS 0x1d1 /* plus on keypad */
+CTL_PADSTOP 0x1d2 /* ctl-stop on keypad */
+CTL_PADCENTER 0x1d3 /* ctl-enter on keypad */
+CTL_PADPLUS 0x1d4 /* ctl-plus on keypad */
+CTL_PADMINUS 0x1d5 /* ctl-minus on keypad */
+CTL_PADSLASH 0x1d6 /* ctl-slash on keypad */
+CTL_PADSTAR 0x1d7 /* ctl-star on keypad */
+ALT_PADPLUS 0x1d8 /* alt-plus on keypad */
+ALT_PADMINUS 0x1d9 /* alt-minus on keypad */
+ALT_PADSLASH 0x1da /* alt-slash on keypad */
+ALT_PADSTAR 0x1db /* alt-star on keypad */
+ALT_PADSTOP 0x1dc /* alt-star on keypad */
+CTL_INS 0x1dd /* ctl-insert */
+ALT_DEL 0x1de /* alt-delete */
+ALT_INS 0x1df /* alt-insert */
+CTL_UP 0x1e0 /* ctl-up arrow */
+CTL_DOWN 0x1e1 /* ctl-down arrow */
+CTL_TAB 0x1e2 /* ctl-tab */
+ALT_TAB 0x1e3 /* alt-tab */
+ALT_MINUS 0x1e4 /* alt-minus */
+ALT_EQUAL 0x1e5 /* alt-equal */
+ALT_HOME 0x1e6 /* alt-home */
+ALT_PGUP 0x1e7 /* alt-pgup */
+ALT_PGDN 0x1e8 /* alt-pgdn */
+ALT_END 0x1e9 /* alt-end */
+ALT_UP 0x1ea /* alt-up arrow */
+ALT_DOWN 0x1eb /* alt-down arrow */
+ALT_RIGHT 0x1ec /* alt-right arrow */
+ALT_LEFT 0x1ed /* alt-left arrow */
+ALT_ENTER 0x1ee /* alt-enter */
+ALT_ESC 0x1ef /* alt-escape */
+ALT_BQUOTE 0x1f0 /* alt-back quote */
+ALT_LBRACKET 0x1f1 /* alt-left bracket */
+ALT_RBRACKET 0x1f2 /* alt-right bracket */
+ALT_SEMICOLON 0x1f3 /* alt-semi-colon */
+ALT_FQUOTE 0x1f4 /* alt-forward quote */
+ALT_COMMA 0x1f5 /* alt-comma */
+ALT_STOP 0x1f6 /* alt-stop */
+ALT_FSLASH 0x1f7 /* alt-forward slash */
+ALT_BKSP 0x1f8 /* alt-backspace */
+CTL_BKSP 0x1f9 /* ctl-backspace */
+PAD0 0x1fa /* ctl-keypad 0 */
+CTL_PAD0 0x1fb /* ctl-keypad 0 */
+CTL_PAD1 0x1fc /* ctl-keypad 1 */
+CTL_PAD2 0x1fd /* ctl-keypad 2 */
+CTL_PAD3 0x1fe /* ctl-keypad 3 */
+CTL_PAD4 0x1ff /* ctl-keypad 4 */
+CTL_PAD5 0x200 /* ctl-keypad 5 */
+CTL_PAD6 0x201 /* ctl-keypad 6 */
+CTL_PAD7 0x202 /* ctl-keypad 7 */
+CTL_PAD8 0x203 /* ctl-keypad 8 */
+CTL_PAD9 0x204 /* ctl-keypad 9 */
+ALT_PAD0 0x205 /* ctl-keypad 0 */
+ALT_PAD1 0x206 /* ctl-keypad 1 */
+ALT_PAD2 0x207 /* ctl-keypad 2 */
+ALT_PAD3 0x208 /* ctl-keypad 3 */
+ALT_PAD4 0x209 /* ctl-keypad 4 */
+ALT_PAD5 0x20a /* ctl-keypad 5 */
+ALT_PAD6 0x20b /* ctl-keypad 6 */
+ALT_PAD7 0x20c /* ctl-keypad 7 */
+ALT_PAD8 0x20d /* ctl-keypad 8 */
+ALT_PAD9 0x20e /* ctl-keypad 9 */
+CTL_DEL 0x20f /* clt-delete */
+ALT_BSLASH 0x210 /* alt-back slash */
+CTL_ENTER 0x211 /* ctl-enter */
diff --git a/docs/slang.key b/docs/slang.key
new file mode 100644
index 0000000..7310880
--- /dev/null
+++ b/docs/slang.key
@@ -0,0 +1,4 @@
+ S-Lang Keymaps for DOS
+
+F0 0x200
+F(X) (SL_KEY_F0 + X) /* If X>1 */
diff --git a/docs/win-386.announce b/docs/win-386.announce
new file mode 100644
index 0000000..128cb7f
--- /dev/null
+++ b/docs/win-386.announce
@@ -0,0 +1,40 @@
+Ports have been added for Win32 (95/NT) and 386 DOS computers with a
+packet driver. I created four new defines to accomplish this.
+
+_WINDOWS Defined for Win32 specific code (Mostly TCP related)
+DJGPP Defined for 386 specific code (Mostly TCP related)
+DOSPATH Defined for any DOS'ish computer
+NOSIGHUP Defined for computers not supporting sighup signal calls.
+
+To make the Win32 version you need Borland C++ 4.52 or complete
+compatible and the win32.zip package unzipped into the lynx directory.
+This code expects you to have BC make in your path at the console
+prompt and also to be able to compile from the console as well.
+I can provide an IDE if needed but did not want to force on into the
+standard Lynx package. Text mode compiling is much faster anyhow (IMHO).
+The current default configuration is to have the Character Translation
+code linked in. For this to be successful you need to go into
+src\chrtrans and run makew32. After that you can come back to the
+Lynx root and run make -f makefile.w32.
+
+The DJGPP version is a little screwy. You need DJGPP 2.0, the djgpp.zip
+package unzipped into the lynx directory and some patience. I kludged it
+to compile with long filenames under Win95 so some fooling around may be
+required. To compile, run djgpp.bat that was extracted from the zip
+file. There is currently a problem with compiling HTML.c and I have
+contacted the author of DJGPP for help with getting this port further.
+
+Wayne Buttles
+lynx-port@fdisk.com
+
+
+
+Win32 port was further extended by Hiroyuki Senshu <senshu@shonai-cit.ac.jp>
+ftp://crab.it.osha.sut.ac.jp/pub/Win32/develope/senshu/Lynx/
+ Most changes are ifdef'd
+ #define _WIN_CC= .... for Windows C Compiler
+ #define CJK_EX .... CJK EXtension
+ #define SH_EX .... Senshu Hiroyuki EXtension
+ #define WIN_EX .... Windows EXtension
+
+Lynx now builds with C++ Builder, Borland C++, Visual C++, and Cygwin.
diff --git a/fixed512.com b/fixed512.com
new file mode 100644
index 0000000..50b50fd
--- /dev/null
+++ b/fixed512.com
@@ -0,0 +1,54 @@
+$! v = 'f$verify(0)'
+$!
+$! FIXED512.COM: Uses the FILE utility or SET FILE/ATTR
+$! to convert binary stream_LF file headers
+$! to FIXED 512.
+$!
+$! Author: F.Macrides (macrides@sci.wfeb.edu)
+$!
+$! Usage: @Lynx_Dir:FIXED512 <stream_LF file that's actually binary>
+$!
+$! Lynx performs the conversion via internal code if the file is
+$! recognized as binary. This command procedure can be used externally
+$! if that detection failed, e.g., for binary files downloaded from FTP
+$! servers with extensions that hadn't been mapped to a binary MIME
+$! type in the Lynx configuration files.
+$!
+$!===========================================================================
+$!
+$! Get and build Joe Meadow's FILE utility for VAX and AXP:
+$! ftp://ftp.wku.edu/vms/fileserv/file.zip
+$! and define it here, or system-wide, as a foreign command.
+$!
+$! FILE := $device:[directory]FILE.EXE
+$!-----------------------------------------------------------
+$!
+$! Just exit and leave the file stream_LF if we didn't get
+$! the filename as P1, or if it's not a valid file spec.
+$!
+$ IF P1 .EQS. "" THEN EXIT
+$ IF F$SEARCH(P1) .EQS. "" THEN EXIT
+$!-----------------------------------------------------------
+$!
+$! If we have FILE installed, use it.
+$!
+$ If f$type(FILE) .eqs. "STRING"
+$ Then
+$ FILE 'P1'-
+ /TYPE=FIXED -
+ /ATTRIBUTES=NOIMPLIEDCC -
+ /CHARACTERISTICS=BEST_TRY_CONTIGUOUS -
+ /RECORD_SIZE=512 -
+ /MAXIMUM_RECORD_SIZE=512
+$ EXIT
+$ EndIf
+$!-----------------------------------------------------------
+$!
+$! If we get to here, and we're VMS v6+,
+$! we'll use SET FILE/ATTR to do it.
+$!
+$ If f$extract(1,1,f$getsyi("VERSION")) .ge. 6
+$ Then
+$ SET FILE/ATTR=(RFM:FIX,LRL:512,MRS:512,RAT:NONE) 'P1'
+$ EndIf
+$ EXIT
diff --git a/install-sh b/install-sh
new file mode 100755
index 0000000..ec298b5
--- /dev/null
+++ b/install-sh
@@ -0,0 +1,541 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2020-11-14.01; # UTC
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# 'make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.
+
+tab=' '
+nl='
+'
+IFS=" $tab$nl"
+
+# Set DOITPROG to "echo" to test this script.
+
+doit=${DOITPROG-}
+doit_exec=${doit:-exec}
+
+# Put in absolute file names if you don't have them in your path;
+# or use environment vars.
+
+chgrpprog=${CHGRPPROG-chgrp}
+chmodprog=${CHMODPROG-chmod}
+chownprog=${CHOWNPROG-chown}
+cmpprog=${CMPPROG-cmp}
+cpprog=${CPPROG-cp}
+mkdirprog=${MKDIRPROG-mkdir}
+mvprog=${MVPROG-mv}
+rmprog=${RMPROG-rm}
+stripprog=${STRIPPROG-strip}
+
+posix_mkdir=
+
+# Desired mode of installed file.
+mode=0755
+
+# Create dirs (including intermediate dirs) using mode 755.
+# This is like GNU 'install' as of coreutils 8.32 (2020).
+mkdir_umask=22
+
+backupsuffix=
+chgrpcmd=
+chmodcmd=$chmodprog
+chowncmd=
+mvcmd=$mvprog
+rmcmd="$rmprog -f"
+stripcmd=
+
+src=
+dst=
+dir_arg=
+dst_arg=
+
+copy_on_change=false
+is_target_a_directory=possibly
+
+usage="\
+Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+ or: $0 [OPTION]... SRCFILES... DIRECTORY
+ or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+ or: $0 [OPTION]... -d DIRECTORIES...
+
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
+
+Options:
+ --help display this help and exit.
+ --version display version info and exit.
+
+ -c (ignored)
+ -C install only if different (preserve data modification time)
+ -d create directories instead of installing files.
+ -g GROUP $chgrpprog installed files to GROUP.
+ -m MODE $chmodprog installed files to MODE.
+ -o USER $chownprog installed files to USER.
+ -p pass -p to $cpprog.
+ -s $stripprog installed files.
+ -S SUFFIX attempt to back up existing files, with suffix SUFFIX.
+ -t DIRECTORY install into DIRECTORY.
+ -T report an error if DSTFILE is a directory.
+
+Environment variables override the default commands:
+ CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
+ RMPROG STRIPPROG
+
+By default, rm is invoked with -f; when overridden with RMPROG,
+it's up to you to specify -f if you want it.
+
+If -S is not specified, no backups are attempted.
+
+Email bug reports to bug-automake@gnu.org.
+Automake home page: https://www.gnu.org/software/automake/
+"
+
+while test $# -ne 0; do
+ case $1 in
+ -c) ;;
+
+ -C) copy_on_change=true;;
+
+ -d) dir_arg=true;;
+
+ -g) chgrpcmd="$chgrpprog $2"
+ shift;;
+
+ --help) echo "$usage"; exit $?;;
+
+ -m) mode=$2
+ case $mode in
+ *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
+ echo "$0: invalid mode: $mode" >&2
+ exit 1;;
+ esac
+ shift;;
+
+ -o) chowncmd="$chownprog $2"
+ shift;;
+
+ -p) cpprog="$cpprog -p";;
+
+ -s) stripcmd=$stripprog;;
+
+ -S) backupsuffix="$2"
+ shift;;
+
+ -t)
+ is_target_a_directory=always
+ dst_arg=$2
+ # Protect names problematic for 'test' and other utilities.
+ case $dst_arg in
+ -* | [=\(\)!]) dst_arg=./$dst_arg;;
+ esac
+ shift;;
+
+ -T) is_target_a_directory=never;;
+
+ --version) echo "$0 $scriptversion"; exit $?;;
+
+ --) shift
+ break;;
+
+ -*) echo "$0: invalid option: $1" >&2
+ exit 1;;
+
+ *) break;;
+ esac
+ shift
+done
+
+# We allow the use of options -d and -T together, by making -d
+# take the precedence; this is for compatibility with GNU install.
+
+if test -n "$dir_arg"; then
+ if test -n "$dst_arg"; then
+ echo "$0: target directory not allowed when installing a directory." >&2
+ exit 1
+ fi
+fi
+
+if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
+ # When -d is used, all remaining arguments are directories to create.
+ # When -t is used, the destination is already specified.
+ # Otherwise, the last argument is the destination. Remove it from $@.
+ for arg
+ do
+ if test -n "$dst_arg"; then
+ # $@ is not empty: it contains at least $arg.
+ set fnord "$@" "$dst_arg"
+ shift # fnord
+ fi
+ shift # arg
+ dst_arg=$arg
+ # Protect names problematic for 'test' and other utilities.
+ case $dst_arg in
+ -* | [=\(\)!]) dst_arg=./$dst_arg;;
+ esac
+ done
+fi
+
+if test $# -eq 0; then
+ if test -z "$dir_arg"; then
+ echo "$0: no input file specified." >&2
+ exit 1
+ fi
+ # It's OK to call 'install-sh -d' without argument.
+ # This can happen when creating conditional directories.
+ exit 0
+fi
+
+if test -z "$dir_arg"; then
+ if test $# -gt 1 || test "$is_target_a_directory" = always; then
+ if test ! -d "$dst_arg"; then
+ echo "$0: $dst_arg: Is not a directory." >&2
+ exit 1
+ fi
+ fi
+fi
+
+if test -z "$dir_arg"; then
+ do_exit='(exit $ret); exit $ret'
+ trap "ret=129; $do_exit" 1
+ trap "ret=130; $do_exit" 2
+ trap "ret=141; $do_exit" 13
+ trap "ret=143; $do_exit" 15
+
+ # Set umask so as not to create temps with too-generous modes.
+ # However, 'strip' requires both read and write access to temps.
+ case $mode in
+ # Optimize common cases.
+ *644) cp_umask=133;;
+ *755) cp_umask=22;;
+
+ *[0-7])
+ if test -z "$stripcmd"; then
+ u_plus_rw=
+ else
+ u_plus_rw='% 200'
+ fi
+ cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
+ *)
+ if test -z "$stripcmd"; then
+ u_plus_rw=
+ else
+ u_plus_rw=,u+rw
+ fi
+ cp_umask=$mode$u_plus_rw;;
+ esac
+fi
+
+for src
+do
+ # Protect names problematic for 'test' and other utilities.
+ case $src in
+ -* | [=\(\)!]) src=./$src;;
+ esac
+
+ if test -n "$dir_arg"; then
+ dst=$src
+ dstdir=$dst
+ test -d "$dstdir"
+ dstdir_status=$?
+ # Don't chown directories that already exist.
+ if test $dstdir_status = 0; then
+ chowncmd=""
+ fi
+ else
+
+ # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+ # might cause directories to be created, which would be especially bad
+ # if $src (and thus $dsttmp) contains '*'.
+ if test ! -f "$src" && test ! -d "$src"; then
+ echo "$0: $src does not exist." >&2
+ exit 1
+ fi
+
+ if test -z "$dst_arg"; then
+ echo "$0: no destination specified." >&2
+ exit 1
+ fi
+ dst=$dst_arg
+
+ # If destination is a directory, append the input filename.
+ if test -d "$dst"; then
+ if test "$is_target_a_directory" = never; then
+ echo "$0: $dst_arg: Is a directory" >&2
+ exit 1
+ fi
+ dstdir=$dst
+ dstbase=`basename "$src"`
+ case $dst in
+ */) dst=$dst$dstbase;;
+ *) dst=$dst/$dstbase;;
+ esac
+ dstdir_status=0
+ else
+ dstdir=`dirname "$dst"`
+ test -d "$dstdir"
+ dstdir_status=$?
+ fi
+ fi
+
+ case $dstdir in
+ */) dstdirslash=$dstdir;;
+ *) dstdirslash=$dstdir/;;
+ esac
+
+ obsolete_mkdir_used=false
+
+ if test $dstdir_status != 0; then
+ case $posix_mkdir in
+ '')
+ # With -d, create the new directory with the user-specified mode.
+ # Otherwise, rely on $mkdir_umask.
+ if test -n "$dir_arg"; then
+ mkdir_mode=-m$mode
+ else
+ mkdir_mode=
+ fi
+
+ posix_mkdir=false
+ # The $RANDOM variable is not portable (e.g., dash). Use it
+ # here however when possible just to lower collision chance.
+ tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+
+ trap '
+ ret=$?
+ rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null
+ exit $ret
+ ' 0
+
+ # Because "mkdir -p" follows existing symlinks and we likely work
+ # directly in world-writeable /tmp, make sure that the '$tmpdir'
+ # directory is successfully created first before we actually test
+ # 'mkdir -p'.
+ if (umask $mkdir_umask &&
+ $mkdirprog $mkdir_mode "$tmpdir" &&
+ exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
+ then
+ if test -z "$dir_arg" || {
+ # Check for POSIX incompatibilities with -m.
+ # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+ # other-writable bit of parent directory when it shouldn't.
+ # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+ test_tmpdir="$tmpdir/a"
+ ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
+ case $ls_ld_tmpdir in
+ d????-?r-*) different_mode=700;;
+ d????-?--*) different_mode=755;;
+ *) false;;
+ esac &&
+ $mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
+ ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
+ test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+ }
+ }
+ then posix_mkdir=:
+ fi
+ rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
+ else
+ # Remove any dirs left behind by ancient mkdir implementations.
+ rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
+ fi
+ trap '' 0;;
+ esac
+
+ if
+ $posix_mkdir && (
+ umask $mkdir_umask &&
+ $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+ )
+ then :
+ else
+
+ # mkdir does not conform to POSIX,
+ # or it failed possibly due to a race condition. Create the
+ # directory the slow way, step by step, checking for races as we go.
+
+ case $dstdir in
+ /*) prefix='/';;
+ [-=\(\)!]*) prefix='./';;
+ *) prefix='';;
+ esac
+
+ oIFS=$IFS
+ IFS=/
+ set -f
+ set fnord $dstdir
+ shift
+ set +f
+ IFS=$oIFS
+
+ prefixes=
+
+ for d
+ do
+ test X"$d" = X && continue
+
+ prefix=$prefix$d
+ if test -d "$prefix"; then
+ prefixes=
+ else
+ if $posix_mkdir; then
+ (umask $mkdir_umask &&
+ $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+ # Don't fail if two instances are running concurrently.
+ test -d "$prefix" || exit 1
+ else
+ case $prefix in
+ *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+ *) qprefix=$prefix;;
+ esac
+ prefixes="$prefixes '$qprefix'"
+ fi
+ fi
+ prefix=$prefix/
+ done
+
+ if test -n "$prefixes"; then
+ # Don't fail if two instances are running concurrently.
+ (umask $mkdir_umask &&
+ eval "\$doit_exec \$mkdirprog $prefixes") ||
+ test -d "$dstdir" || exit 1
+ obsolete_mkdir_used=true
+ fi
+ fi
+ fi
+
+ if test -n "$dir_arg"; then
+ { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
+ { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
+ { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
+ test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
+ else
+
+ # Make a couple of temp file names in the proper directory.
+ dsttmp=${dstdirslash}_inst.$$_
+ rmtmp=${dstdirslash}_rm.$$_
+
+ # Trap to clean up those temp files at exit.
+ trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+
+ # Copy the file name to the temp name.
+ (umask $cp_umask &&
+ { test -z "$stripcmd" || {
+ # Create $dsttmp read-write so that cp doesn't create it read-only,
+ # which would cause strip to fail.
+ if test -z "$doit"; then
+ : >"$dsttmp" # No need to fork-exec 'touch'.
+ else
+ $doit touch "$dsttmp"
+ fi
+ }
+ } &&
+ $doit_exec $cpprog "$src" "$dsttmp") &&
+
+ # and set any options; do chmod last to preserve setuid bits.
+ #
+ # If any of these fail, we abort the whole thing. If we want to
+ # ignore errors from any of these, just make sure not to ignore
+ # errors from the above "$doit $cpprog $src $dsttmp" command.
+ #
+ { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
+ { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
+ { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
+ { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
+
+ # If -C, don't bother to copy if it wouldn't change the file.
+ if $copy_on_change &&
+ old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
+ new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
+ set -f &&
+ set X $old && old=:$2:$4:$5:$6 &&
+ set X $new && new=:$2:$4:$5:$6 &&
+ set +f &&
+ test "$old" = "$new" &&
+ $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
+ then
+ rm -f "$dsttmp"
+ else
+ # If $backupsuffix is set, and the file being installed
+ # already exists, attempt a backup. Don't worry if it fails,
+ # e.g., if mv doesn't support -f.
+ if test -n "$backupsuffix" && test -f "$dst"; then
+ $doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null
+ fi
+
+ # Rename the file to the real destination.
+ $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
+
+ # The rename failed, perhaps because mv can't rename something else
+ # to itself, or perhaps because mv is so ancient that it does not
+ # support -f.
+ {
+ # Now remove or move aside any old file at destination location.
+ # We try this two ways since rm can't unlink itself on some
+ # systems and the destination file might be busy for other
+ # reasons. In this case, the final cleanup might fail but the new
+ # file should still install successfully.
+ {
+ test ! -f "$dst" ||
+ $doit $rmcmd "$dst" 2>/dev/null ||
+ { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+ { $doit $rmcmd "$rmtmp" 2>/dev/null; :; }
+ } ||
+ { echo "$0: cannot unlink or rename $dst" >&2
+ (exit 1); exit 1
+ }
+ } &&
+
+ # Now rename the file to the real destination.
+ $doit $mvcmd "$dsttmp" "$dst"
+ }
+ fi || exit 1
+
+ trap '' 0
+ fi
+done
+
+# Local variables:
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/lib/dirent.c b/lib/dirent.c
new file mode 100644
index 0000000..373ba31
--- /dev/null
+++ b/lib/dirent.c
@@ -0,0 +1,293 @@
+/*
+ * $LynxId: dirent.c,v 1.7 2018/02/17 17:52:45 tom Exp $
+ *
+ * dir.c for MS-DOS by Samuel Lam <skl@van-bc.UUCP>, June/87
+ */
+
+/* #ifdef WIN32 */
+/*
+ * @(#)dir.c 1.4 87/11/06 Public Domain.
+ *
+ * A public domain implementation of BSD directory routines for
+ * MS-DOS. Written by Michael Rendell ({uunet,utai}michael@garfield),
+ * August 1897
+ * Ported to OS/2 by Kai Uwe Rommel
+ * December 1989, February 1990
+ * Ported to Windows NT 22 May 91
+ * other mods Summer '92 brianmo@microsoft.com
+ * opendirx() was horribly written, very inefficient, and did not take care
+ * of all cases. It is still not too clean, but it is far more efficient.
+ * Changes made by Gordon Chaffee (chaffee@bugs-bunny.cs.berkeley.edu)
+ */
+
+/*Includes:
+ * crt
+ */
+#ifdef HAVE_CONFIG_H
+#include "lynx_cfg.h"
+#endif
+
+#ifndef __GNUC__
+#pragma warning (disable : 4100) /* unreferenced formal parameter */
+#pragma warning (disable : 4127) /* conditional expression is constant */
+#pragma warning (disable : 4201) /* nameless struct/union */
+#pragma warning (disable : 4214) /* bit field types other than int */
+#pragma warning (disable : 4310) /* cast truncates constant value */
+#pragma warning (disable : 4514) /* unreferenced inline function has been removed */
+#pragma warning (disable : 4996) /* This function or variable may be unsafe. ... */
+#endif
+
+#include <windows.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys\types.h>
+#include <sys\stat.h>
+
+#include "dirent.h"
+
+#define stat _stat
+
+/*
+ * NT specific
+ */
+#include <stdio.h>
+
+/*
+ * random typedefs
+ */
+#define HDIR HANDLE
+#define HFILE HANDLE
+#define PHFILE PHANDLE
+
+#ifndef INVALID_HANDLE_VALUE
+#define INVALID_HANDLE_VALUE ((HDIR) 0xffffffff)
+#endif
+
+/*
+ * local functions
+ */
+static char *getdirent(char *);
+static void free_dircontents(struct _dircontents *);
+
+static HDIR FindHandle;
+static WIN32_FIND_DATA FileFindData;
+
+static struct dirent dp;
+
+DIR *opendirx(char *name, char *pattern)
+{
+ struct stat statb;
+ DIR *dirp;
+ char c;
+ char *s;
+ struct _dircontents *dp;
+ int len;
+ int unc;
+ char path[OFS_MAXPATHNAME];
+ register char *ip, *op;
+
+ for (ip = name, op = path;; op++, ip++) {
+ *op = *ip;
+ if (*ip == '\0') {
+ break;
+ }
+ }
+ len = (int) (ip - name);
+ if (len > 0) {
+ unc = ((path[0] == '\\' || path[0] == '/') &&
+ (path[1] == '\\' || path[1] == '/'));
+ c = path[len - 1];
+ if (unc) {
+ if (c != '\\' && c != '/') {
+ path[len] = '/';
+ len++;
+ path[len] = '\0';
+ }
+ } else {
+ if ((c == '\\' || c == '/') && (len > 1)) {
+ len--;
+ path[len] = '\0';
+
+ if (path[len - 1] == ':') {
+ path[len] = '/';
+ len++;
+ path[len] = '.';
+ len++;
+ path[len] = '\0';
+ }
+ } else if (c == ':') {
+ path[len] = '.';
+ len++;
+ path[len] = '\0';
+ }
+ }
+ } else {
+ unc = 0;
+ path[0] = '.';
+ path[1] = '\0';
+ len = 1;
+ }
+
+ if (stat(path, &statb) < 0 || (statb.st_mode & S_IFMT) != S_IFDIR) {
+ return NULL;
+ }
+ dirp = malloc(sizeof(DIR));
+
+ if (dirp == NULL) {
+ return dirp;
+ }
+ c = path[len - 1];
+ if (c == '.') {
+ if (len == 1) {
+ len--;
+ } else {
+ c = path[len - 2];
+ if (c == '\\' || c == ':') {
+ len--;
+ } else {
+ path[len] = '/';
+ len++;
+ }
+ }
+ } else if (!unc && ((len != 1) || (c != '\\' && c != '/'))) {
+ path[len] = '/';
+ len++;
+ }
+ strcpy(path + len, pattern);
+
+ dirp->dd_loc = 0;
+ dirp->dd_contents = dirp->dd_cp = NULL;
+
+ if ((s = getdirent(path)) == NULL) {
+ return dirp;
+ }
+ do {
+ if (((dp = malloc(sizeof(struct _dircontents))) == NULL) ||
+ ((dp->_d_entry = malloc(strlen(s) + 1)) == NULL)) {
+ if (dp)
+ free(dp);
+ free_dircontents(dirp->dd_contents);
+
+ return NULL;
+ }
+ if (dirp->dd_contents)
+ dirp->dd_cp = dirp->dd_cp->_d_next = dp;
+ else
+ dirp->dd_contents = dirp->dd_cp = dp;
+
+ strcpy(dp->_d_entry, s);
+ dp->_d_next = NULL;
+
+ }
+ while ((s = getdirent(NULL)) != NULL);
+
+ dirp->dd_cp = dirp->dd_contents;
+ return dirp;
+}
+
+DIR *opendir(char *name)
+{
+ return opendirx(name, "*");
+}
+
+void closedir(DIR *dirp)
+{
+ free_dircontents(dirp->dd_contents);
+ free(dirp);
+}
+
+struct dirent *readdir(DIR *dirp)
+{
+ /* static struct dirent dp; */
+ if (dirp->dd_cp == NULL)
+ return NULL;
+
+ /*strcpy(dp.d_name,dirp->dd_cp->_d_entry); */
+
+ dp.d_name = dirp->dd_cp->_d_entry;
+
+ dp.d_namlen = dp.d_reclen =
+ (int) strlen(dp.d_name);
+
+ dp.d_ino = (ino_t) (dirp->dd_loc + 1); /* fake the inode */
+
+ dirp->dd_cp = dirp->dd_cp->_d_next;
+ dirp->dd_loc++;
+
+ return &dp;
+}
+
+void seekdir(DIR *dirp, long off)
+{
+ long i = off;
+ struct _dircontents *dp;
+
+ if (off >= 0) {
+ for (dp = dirp->dd_contents; --i >= 0 && dp; dp = dp->_d_next) ;
+
+ dirp->dd_loc = off - (i + 1);
+ dirp->dd_cp = dp;
+ }
+}
+
+long telldir(DIR *dirp)
+{
+ return dirp->dd_loc;
+}
+
+static void free_dircontents(struct _dircontents *dp)
+{
+ struct _dircontents *odp;
+
+ while (dp) {
+ if (dp->_d_entry)
+ free(dp->_d_entry);
+
+ dp = (odp = dp)->_d_next;
+ free(odp);
+ }
+}
+/* end of "free_dircontents" */
+
+static char *getdirent(char *dir)
+{
+ int got_dirent;
+
+ if (dir != NULL) { /* get first entry */
+ if ((FindHandle = FindFirstFile(dir, &FileFindData))
+ == INVALID_HANDLE_VALUE) {
+ return NULL;
+ }
+ got_dirent = 1;
+ } else /* get next entry */
+ got_dirent = FindNextFile(FindHandle, &FileFindData);
+
+ if (got_dirent)
+ return FileFindData.cFileName;
+ else {
+ FindClose(FindHandle);
+ return NULL;
+ }
+}
+/* end of getdirent() */
+
+struct passwd *_cdecl getpwnam(char *name)
+{
+ return NULL;
+}
+
+struct passwd *_cdecl getpwuid(int uid)
+{
+ return NULL;
+}
+
+int getuid()
+{
+ return 0;
+}
+
+void _cdecl endpwent(void)
+{
+}
+
+/* #endif */
diff --git a/lib/dirent.h b/lib/dirent.h
new file mode 100644
index 0000000..db59849
--- /dev/null
+++ b/lib/dirent.h
@@ -0,0 +1,53 @@
+/*
+ * @(#) dirent.h 2.0 17 Jun 91 Public Domain.
+ *
+ * A public domain implementation of BSD directory routines for
+ * MS-DOS. Written by Michael Rendell ({uunet,utai}michael@garfield),
+ * August 1987
+ *
+ * Enhanced and ported to OS/2 by Kai Uwe Rommel; added scandir() prototype
+ * December 1989, February 1990
+ * Change of MAXPATHLEN for HPFS, October 1990
+ *
+ * Unenhanced and ported to Windows NT by Bill Gallagher
+ * 17 Jun 91
+ * changed d_name to char * instead of array, removed non-std extensions
+ *
+ * Cleanup, other hackery, Summer '92, Brian Moran , brianmo@microsoft.com
+ */
+
+#ifndef _DIRENT
+#define _DIRENT
+
+#include <direct.h>
+
+struct dirent {
+ ino_t d_ino; /* a bit of a farce */
+ short d_reclen; /* more farce */
+ short d_namlen; /* length of d_name */
+ char *d_name;
+};
+
+struct _dircontents {
+ char *_d_entry;
+ struct _dircontents *_d_next;
+};
+
+typedef struct _dirdesc {
+ int dd_id; /* uniquely identify each open directory */
+ long dd_loc; /* where we are in directory entry */
+ struct _dircontents *dd_contents; /* pointer to contents of dir */
+ struct _dircontents *dd_cp; /* pointer to current position */
+} DIR;
+
+extern DIR *opendir(char *);
+extern struct dirent *readdir(DIR *);
+extern void seekdir(DIR *, long);
+extern long telldir(DIR *);
+extern void closedir(DIR *);
+
+#define rewinddir(dirp) seekdir(dirp, 0L)
+
+#endif /* _DIRENT */
+
+/* end of dirent.h */
diff --git a/lynx.cfg b/lynx.cfg
new file mode 100644
index 0000000..61afe8b
--- /dev/null
+++ b/lynx.cfg
@@ -0,0 +1,3865 @@
+# $LynxId: lynx.cfg,v 1.330 2023/01/02 23:50:09 tom Exp $
+# lynx.cfg file.
+# The default placement for this file is /usr/local/lib/lynx.cfg (Unix)
+# or Lynx_Dir:lynx.cfg (VMS)
+#
+# $Format: "#PRCS LYNX_VERSION \"$ProjectVersion$\""$
+#PRCS LYNX_VERSION "2.9.0dev.12"
+#
+# $Format: "#PRCS LYNX_DATE \"$ProjectDate$\""$
+#PRCS LYNX_DATE "Mon, 02 Jan 2023 18:47:08 -0500"
+#
+# Definition pairs (configuration settings) are of the form
+# VARIABLE:DEFINITION
+# NO spaces are allowed around the colon ":" between the pair items.
+#
+# If you do not have write access to /usr/local/lib you may change
+# the default location of this file in the userdefs.h file and recompile,
+# or specify its location on the command line with the "-cfg"
+# command line option.
+#
+# Items may be commented out by putting a '#' as the FIRST char of the line
+# (Any line beginning with punctuation is ignored). Leading blanks on each
+# line are ignored; trailing blanks may be significant depending on the option.
+
+# In most cases, a definition can be overridden by another later in the
+# file, or in an including configuration file. You can see the effect of
+# definitions (and redefinitions) in the trace file Lynx.log by using the
+# "-trace" and "-trace-mask" options, e.g.,
+# lynx -trace -trace-mask=8
+
+# As a documentation aid, the default values for each setting are shown
+# commented-out. By convention, these default value comments have no space
+# after the "#", e.g.,
+# #HTTP_PROTOCOL:1.0
+
+# An HTML'ized description of all settings (based on comments in this file,
+# with alphabetical table of settings and with table of settings by category)
+# is available at https://lynx.invisible-island.net/release/breakout/lynx_help/cattoc.html
+#
+### The conversion is done via the scripts/cfg2html.pl script.
+### Several directives beginning with '.' are used for this purpose.
+
+.h1 Auxiliary Facilities
+# These settings control the auxiliary navigating facilities of lynx, e.g.,
+# jumpfiles, bookmarks, default URLs.
+
+.h2 INCLUDE
+# Starting with Lynx 2.8.1, the lynx.cfg file has a crude "include"
+# facility. This means that you can take advantage of the global lynx.cfg
+# while also supplying your own tweaks.
+#
+# You can use a command-line argument (-cfg /where/is/lynx.cfg) or an
+# environment variable (LYNX_CFG=/where/is/lynx.cfg).
+# For instance, put in your .profile or .login:
+#
+# LYNX_CFG=~/lynx.cfg; export LYNX_CFG # in .profile for sh/ksh/bash/etc.
+# setenv LYNX_CFG ~/lynx.cfg # in .login for [t]csh
+#
+# Then in ~/lynx.cfg:
+#
+# INCLUDE:/usr/local/lib/lynx.cfg
+# ^^^^^^^^^^^^^^^^^^^^^^^ or whatever is appropriate on your system
+# and now your own tweaks. If you omit the directory name, e.g.,
+#
+# INCLUDE:lynx.cfg
+#
+# then lynx first checks if it is in any of the directories listed in the
+# environment variable LYNX_CFG_PATH, then tries the directory of the default
+# config-file.
+#
+# You can also suppress all but specific settings that will be read from
+# included files. This allows sysadmins to provide users the ability to
+# customize lynx with options that normally do not affect security, such as
+# COLOR, VIEWER, KEYMAP.
+#
+# The syntax is
+#
+# INCLUDE:filename for <space-separated-list-of-allowed-settings>
+#
+# sample:
+.ex
+#INCLUDE:~/lynx.cfg for COLOR VIEWER KEYMAP
+# only one space character should surround the word 'for'. On Unix systems ':'
+# is also accepted as separator. In that case, the example can be written as
+.ex
+#INCLUDE:~/lynx.cfg:COLOR VIEWER KEYMAP
+# In the example, only the settings COLOR, VIEWER and KEYMAP are accepted by
+# lynx. Other settings are ignored. Note: INCLUDE is also treated as a
+# setting, so to allow an included file to include other files, put INCLUDE in
+# the list of allowed settings.
+#
+# If you allow an included file to include other files, and if a list of
+# allowed settings is specified for that file with the INCLUDE command, nested
+# files are only allowed to include the list of settings that is the set AND of
+# settings allowed for the included file and settings allowed by nested INCLUDE
+# commands. In short, there is no security hole introduced by including a
+# user-defined configuration file if the original list of allowed settings is
+# secure.
+
+.h2 STARTFILE
+# STARTFILE is the default starting URL if none is specified
+# on the command line or via a WWW_HOME environment variable;
+# Lynx will refuse to start without a starting URL of some kind.
+# STARTFILE can be remote, e.g. http://www.w3.org/default.html ,
+# or local, e.g. file://localhost/PATH_TO/FILENAME ,
+# where PATH_TO is replaced with the complete path to FILENAME
+# using Unix shell syntax and including the device on VMS.
+#
+# Normally we expect you will connect to a remote site, e.g., the Lynx starting
+# site:
+STARTFILE:https://lynx.invisible-island.net/
+#
+# As an alternative, you may want to use a local URL. A good choice for this is
+# the user's home directory:
+.ex
+#STARTFILE:file://localhost/~/
+#
+# Your choice of STARTFILE should reflect your site's needs, and be a URL that
+# you can connect to reliably. Otherwise users will become confused and think
+# that they cannot run Lynx.
+
+.h2 HELPFILE
+# HELPFILE must be defined as a URL and must have a
+# complete path if local:
+# file://localhost/PATH_TO/lynx_help/lynx_help_main.html
+# Replace PATH_TO with the path to the lynx_help subdirectory
+# for this distribution (use SHELL syntax including the device
+# on VMS systems).
+# The default HELPFILE is:
+.url https://lynx.invisible-island.net/lynx_help/lynx_help_main.html
+# This should be changed to the local path.
+# This definition will be overridden if the "LYNX_HELPFILE" environment
+# variable has been set.
+#
+HELPFILE:https://lynx.invisible-island.net/lynx_help/lynx_help_main.html
+.ex
+#HELPFILE:file://localhost/PATH_TO/lynx_help/lynx_help_main.html
+
+.h2 DEFAULT_INDEX_FILE
+# DEFAULT_INDEX_FILE is the default file retrieved when the
+# user presses the 'I' key when viewing any document.
+# An index to your CWIS can be placed here or a document containing
+# pointers to lots of interesting places on the web.
+#
+DEFAULT_INDEX_FILE:http://scout.wisc.edu/
+
+.h1 Interaction
+
+.h2 GOTOBUFFER
+# Set GOTOBUFFER to TRUE if you want to have the previous goto URL,
+# if any, offered for reuse or editing when using the 'g'oto command.
+# The default is defined in userdefs.h. If left FALSE, the circular
+# buffer of previously entered goto URLs can still be invoked via the
+# Up-Arrow or Down-Arrow keys after entering the 'g'oto command.
+#
+#GOTOBUFFER:FALSE
+
+.h2 JUMP_PROMPT
+# JUMP_PROMPT is the default statusline prompt for selecting a jumps file
+# shortcut. (see below).
+# You can change the prompt here from that defined in userdefs.h. Any
+# trailing white space will be trimmed, and a single space is added by Lynx
+# following the last non-white character. You must set the default prompt
+# before setting the default jumps file (below). If a default jumps file
+# was set via userdefs.h, and you change the prompt here, you must set the
+# default jumps file again (below) for the change to be implemented.
+#
+#JUMP_PROMPT:Jump to (use '?' for list):
+
+.h1 Auxiliary Facilities
+
+.h2 JUMPFILE
+# JUMPFILE is the local file checked for short-cut names for URLs when
+# the user presses the 'j' (JUMP) key. The file contains an HTML
+# definition list (DL). The definition titles (DT) are used as
+# short-cut name; the definition data (DD) are URLs.
+#
+# There is an example jumps file in the samples subdirectory.
+#
+# After pressing 'j', the user will be prompted to enter a short-cut
+# name for an URL, which Lynx will then follow in a similar manner to
+# 'g'oto; alternatively, s/he can enter '?' to view the full JUMPFILE
+# list of short-cuts with associated URLs.
+#
+# If the URL contains one or more "%s" markers, Lynx will prompt the user
+# for text to fill in for each marker. If no text is given, the jump is
+# cancelled.
+#
+# If not defined here or in userdefs.h, the JUMP command will invoke the
+# NO_JUMPFILE statusline message (see LYMessages_en.h ).
+#
+# To allow '?' to work, include in the JUMPFILE
+# a short-cut to the JUMPFILE itself, e.g.
+# <dt>?<dd><a href="file://localhost/path/jumps.html">This Shortcut List</a>
+#
+# On VMS, use Unix SHELL syntax (including a lead slash) to define it.
+#
+# Alternate jumps files can be defined and mapped to keys here. If the
+# keys have already been mapped, then those mappings will be replaced,
+# but you should leave at least one key mapped to the default jumps
+# file. You optionally may include a statusline prompt string for the
+# mapping. You must map upper and lowercase keys separately (beware of
+# mappings to keys which the user can further remap via the 'o'ptions
+# menu). The format is:
+#
+# JUMPFILE:path:key[:prompt]
+#
+# where path should begin with a '/' (i.e., not include file://localhost).
+# Any white space following a prompt string will be trimmed, and a single
+# space will be added by Lynx.
+#
+# In the following line, include the actual full local path to JUMPFILE,
+# but do not include 'file://localhost' in the line.
+#JUMPFILE:/FULL_LOCAL_PATH/jumps.html
+.ex
+#JUMPFILE:/Lynx_Dir/ips.html:i:IP or Interest group (? for list):
+
+.h2 JUMPBUFFER
+# Set JUMPBUFFER to TRUE if you want to have the previous jump target,
+# if any, offered for reuse or editing when using the 'J'ump command.
+# The default is defined in userdefs.h. If left FALSE, the circular
+# buffer of previously entered targets (shortcuts) can still be invoked
+# via the Up-Arrow or Down-Arrow keys after entering the 'J'ump command.
+# If multiple jumps files are installed, the recalls of shortcuts will
+# be specific to each file. If Lynx was built with PERMIT_GOTO_FROM_JUMP
+# defined, any random URLs used instead of shortcuts will be stored in the
+# goto URL buffer, not in the shortcuts buffer(s), and the single character
+# ':' can be used as a target to invoke the goto URL buffer (as if 'g'oto
+# followed by Up-Arrow had been entered).
+#
+#JUMPBUFFER:FALSE
+
+.h1 Internal Behavior
+
+.h2 SAVE_SPACE
+# If SAVE_SPACE is defined, it will be used as a path prefix for the
+# suggested filename in "Save to Disk" operations from the 'p'rint or
+# 'd'ownload menus. On VMS, you can use either VMS (e.g., "SYS$LOGIN:")
+# or Unix syntax (including '~' for the HOME directory). On Unix, you
+# must use Unix syntax. If the symbol is not defined, or is zero-length
+# (""), no prefix will be used, and only a filename for saving in the
+# current default directory will be suggested.
+# This definition will be overridden if a "LYNX_SAVE_SPACE" environment
+# variable has been set on Unix, or logical has been defined on VMS.
+#
+#SAVE_SPACE:~/foo/
+
+.h2 REUSE_TEMPFILES
+# Lynx uses temporary files for (among other purposes) the content of
+# various user interface pages. REUSE_TEMPFILES changes the behavior
+# for some of these temp files, among them pages shown for HISTORY,
+# VLINKS, OPTIONS, INFO, PRINT, DOWNLOAD commands.
+# If set to TRUE, the same file can be used multiple times for the same
+# purpose. If set to FALSE, a new filename is generated each time before
+# rewriting such a page. With TRUE, repeated invocation of these commands
+# is less likely to push previous documents out of the cache of rendered
+# texts (see also DEFAULT_CACHE_SIZE). This is especially useful with
+# intermittent (dialup) network connections, when it is desirable to
+# continue browsing through the cached documents after disconnecting.
+# With the default setting of FALSE, there can be more than one incarnation
+# of e.g. the VLINKS page cached in memory (but still only the most recently
+# generated one is kept as a file), resulting in sometimes less surprising
+# behaviour when returning to such a page via HISTORY or PREV_DOC functions
+# (most users will not encounter and notice this difference).
+#
+#REUSE_TEMPFILES:FALSE
+
+.h2 LYNX_HOST_NAME
+# If LYNX_HOST_NAME is defined here or in userdefs.h, it will be
+# treated as an alias for the local host name in checks for URLs on
+# the local host (e.g., when the -localhost switch is set), and this
+# host name, "localhost", and HTHostName (the fully qualified domain
+# name of the system on which Lynx is running) will all be passed as
+# local. A different definition here will override that in userdefs.h.
+#
+#LYNX_HOST_NAME:www.cc.ukans.edu
+
+.h2 LOCALHOST_ALIAS
+# localhost aliases
+# Any LOCALHOST_ALIAS definitions also will be accepted as local when
+# the -localhost switch is set. These need not actually be local, i.e.,
+# in contrast to LYNX_HOST_NAME, you can define them to trusted hosts at
+# other Internet sites.
+#
+.ex 2
+#LOCALHOST_ALIAS:gopher.server.domain
+#LOCALHOST_ALIAS:news.server.domain
+
+.h2 LOCAL_DOMAIN
+# LOCAL_DOMAIN is used for a tail match with the ut_host element of
+# the utmp or utmpx structure on systems with utmp capabilities, to
+# determine if a user is local to your campus or organization when
+# handling -restrictions=inside_foo or outside_foo settings for ftp,
+# news, telnet/tn3270 and rlogin URLs. An "inside" user is assumed
+# if your system does not have utmp capabilities. CHANGE THIS here
+# if it was not changed in userdefs.h at compilation time.
+#
+#LOCAL_DOMAIN:ukans.edu
+
+.h1 Session support
+
+.h2 AUTO_SESSION
+# If AUTO_SESSION is TRUE lynx will save/restore useful information about
+# your browsing history when closing/starting current lynx session if
+# no command-line session switches override this setting.
+# This setting is useful only if SESSION_FILE is defined here or in the user's
+# .lynxrc file.
+#
+#AUTO_SESSION:FALSE
+
+.h2 SESSION_FILE
+# SESSION_FILE defines the file name where lynx will store user sessions.
+# This setting is used only when AUTO_SESSION is true.
+# Note: the default setting will store/resume each session in a different
+# folder under same file name (if that is allowed by operating system)
+# when lynx is invoked from different directories.
+# (The current working directory may be changed inside lynx)
+#
+# If you want to use the same session file wherever you invoke Lynx,
+# enter the full path below, eg '/home/<username>/.lynx_session'.
+#
+# If you do not want this feature, leave the setting commented.
+# Users can still customize SESSION_FILE and AUTO_SESSION via
+# their .lynxrc file.
+#
+#SESSION_FILE:lynx_session
+
+.h2 SESSION_LIMIT
+# SESSION_LIMIT defines maximum number of: searched strings, goto URLs,
+# visited links and history entries which will be saved in session file. The
+# minimum allowed is 1, the maximum is 10000.
+#
+# For instance, if SESSION_LIMIT is 250, a per-session limit of 250 entries of
+# searched strings, goto URLs, visited links and history entries will be saved
+# in the session file.
+#
+# There is no fixed limit on the number of entries which can be restored;
+# It is limited only by available memory.
+#
+#SESSION_LIMIT:250
+
+.h1 Character Sets
+
+.h2 CHARACTER_SET
+# CHARACTER_SET defines the display character set, i.e., assumed to be
+# installed on the user's terminal. It determines which characters or strings
+# will be used to represent 8-bit character entities within HTML. New
+# character sets may be defined as explained in the README files of the
+# src/chrtrans directory in the Lynx source code distribution. For Asian (CJK)
+# character sets, it also determines how Kanji code will be handled. The
+# default is defined in userdefs.h and can be changed here or via the
+# 'o'ptions menu. The 'o'ptions menu setting will be stored in the user's RC
+# file whenever those settings are saved, and thereafter will be used as the
+# default. For Lynx a "character set" has two names: a MIME name (for
+# recognizing properly labeled charset parameters in HTTP headers etc.), and a
+# human-readable string for the 'O'ptions Menu (so you may find info about
+# language or group of languages besides MIME name). Not all 'human-readable'
+# names correspond to exactly one valid MIME charset (example is "Chinese");
+# in that case an appropriate valid (and more specific) MIME name should be
+# used where required. Well-known synonyms are also processed in the code.
+#
+# Raw (CJK) mode
+#
+# Lynx normally translates characters from a document's charset to display
+# charset, using ASSUME_CHARSET value (see below) if the document's charset
+# is not specified explicitly. Raw (CJK) mode is OFF for this case.
+# When the document charset is specified explicitly, that charset
+# overrides any assumption like ASSUME_CHARSET or raw (CJK) mode.
+#
+# For the Asian (CJK) display character sets, the corresponding charset is
+# assumed in documents, i.e., raw (CJK) mode is ON by default. In raw CJK
+# mode, 8-bit characters are not reverse translated in relation to the entity
+# conversion arrays, i.e., they are assumed to be appropriate for the display
+# character set. The mode should be toggled OFF when an Asian (CJK) display
+# character set is selected but the document is not CJK and its charset not
+# specified explicitly.
+#
+# Raw (CJK) mode may be toggled by user via '@' (LYK_RAW_TOGGLE) key,
+# the -raw command line switch or from the 'o'ptions menu.
+#
+# Raw (CJK) mode effectively changes the charset assumption about unlabeled
+# documents. You can toggle raw mode ON if you believe the document has a
+# charset which does correspond to your Display Character Set. On the other
+# hand, if you set ASSUME_CHARSET the same as Display Character Set you get raw
+# mode ON by default (but you get assume_charset=iso-8859-1 if you try raw mode
+# OFF after it).
+#
+# Note that "raw" does not mean that every byte will be passed to the screen.
+# HTML character entities may get expanded and translated, inappropriate
+# control characters filtered out, etc. There is a "Transparent" pseudo
+# character set for more "rawness".
+#
+# Since Lynx now supports a wide range of platforms it may be useful to note
+# the cpXXX codepages used by IBM PC compatible computers, and windows-xxxx
+# used by native MS-Windows apps. We also note that cpXXX pages rarely are
+# found on Internet, but are mostly for local needs on DOS.
+#
+# Recognized character sets include:
+#
+.nf
+# string for 'O'ptions Menu MIME name
+# =========================== =========
+# 7 bit approximations (US-ASCII) us-ascii
+# Western (ISO-8859-1) iso-8859-1
+# Western (ISO-8859-15) iso-8859-15
+# Western (cp850) cp850
+# Western (windows-1252) windows-1252
+# IBM PC US codepage (cp437) cp437
+# DEC Multinational dec-mcs
+# Macintosh (8 bit) macintosh
+# NeXT character set next
+# HP Roman8 hp-roman8
+# Chinese euc-cn
+# Japanese (EUC-JP) euc-jp
+# Japanese (Shift_JIS) shift_jis
+# Korean euc-kr
+# Taipei (Big5) big5
+# Vietnamese (VISCII) viscii
+# Eastern European (ISO-8859-2) iso-8859-2
+# Eastern European (cp852) cp852
+# Eastern European (windows-1250) windows-1250
+# Latin 3 (ISO-8859-3) iso-8859-3
+# Latin 4 (ISO-8859-4) iso-8859-4
+# Baltic Rim (ISO-8859-13) iso-8859-13
+# Baltic Rim (cp775) cp775
+# Baltic Rim (windows-1257) windows-1257
+# Celtic (ISO-8859-14) iso-8859-14
+# Cyrillic (ISO-8859-5) iso-8859-5
+# Cyrillic (cp866) cp866
+# Cyrillic (windows-1251) windows-1251
+# Cyrillic (KOI8-R) koi8-r
+# Arabic (ISO-8859-6) iso-8859-6
+# Arabic (cp864) cp864
+# Arabic (windows-1256) windows-1256
+# Greek (ISO-8859-7) iso-8859-7
+# Greek (cp737) cp737
+# Greek2 (cp869) cp869
+# Greek (windows-1253) windows-1253
+# Hebrew (ISO-8859-8) iso-8859-8
+# Hebrew (cp862) cp862
+# Hebrew (windows-1255) windows-1255
+# Turkish (ISO-8859-9) iso-8859-9
+# North European (ISO-8859-10) iso-8859-10
+# Ukrainian Cyrillic (cp866u) cp866u
+# Ukrainian Cyrillic (KOI8-U) koi8-u
+# UNICODE (UTF-8) utf-8
+# RFC 1345 w/o Intro mnemonic+ascii+0
+# RFC 1345 Mnemonic mnemonic
+# Transparent x-transparent
+.fi
+#
+# The value should be the MIME name of a character set recognized by
+# Lynx (case insensitive).
+# Find RFC 1345 at
+.url http://tools.ietf.org/html/rfc1345
+#
+#CHARACTER_SET:iso-8859-1
+
+.h2 LOCALE_CHARSET
+# LOCALE_CHARSET overrides CHARACTER_SET if true, using the current locale to
+# lookup a MIME name that corresponds, and use that as the display charset.
+#
+# It also modifies the default value for ASSUME_CHARSET; it does not override
+# that setting.
+#
+# Note that while nl_langinfo(CODESET) itself is standardized, the return
+# values and their relationship to the locale value is not. GNU libiconv
+# happens to give useful values, but other implementations are not guaranteed
+# to do this.
+#LOCALE_CHARSET:FALSE
+
+.h2 HTML5_CHARSETS
+# HTML5_CHARSETS is an alternative to ASSUME_CHARSET and ASSUME_LOCAL_CHARSET.
+# Those assume by default that the character set of an HTML document is (as is
+# standard in HTML4) ISO-8859-1, in the absence of locale information.
+#
+# HTML5 introduces a "compatibility" (sic) feature which assumes that the
+# default is Windows 1252. In the same way, it equates ISO-8859-4 and Windows
+# 1254. Finally, it also makes recommendations which selectively reinterpret
+# the locale encoding.
+#
+# This option currently implements only the equating of ISO-8859-1 and Windows
+# 1252.
+#
+#HTML5_CHARSETS:FALSE
+
+.h2 ASSUME_CHARSET
+# ASSUME_CHARSET changes the handling of documents which do not
+# explicitly specify a charset. Normally Lynx assumes that 8-bit
+# characters in those documents are encoded according to iso-8859-1
+# (the official default for the HTTP protocol). When ASSUME_CHARSET
+# is defined here or by an -assume_charset command line flag is in effect,
+# Lynx will treat documents as if they were encoded accordingly.
+# See above on how this interacts with "raw mode" and the Display
+# Character Set.
+# ASSUME_CHARSET can also be changed via the 'o'ptions menu but will
+# not be saved as permanent value in user's .lynxrc file to avoid more chaos.
+#
+#ASSUME_CHARSET:iso-8859-1
+
+.h2 ASSUMED_DOC_CHARSET_CHOICE
+.h2 DISPLAY_CHARSET_CHOICE
+# It is possible to reduce the number of charset choices in the 'O'ptions menu
+# for "display charset" and "assumed document charset" fields via
+# DISPLAY_CHARSET_CHOICE and ASSUMED_DOC_CHARSET_CHOICE settings correspondingly.
+# Each of these settings can be used several times to define the set of possible
+# choices for corresponding field. The syntax for the values is
+#
+# string | prefix* | *
+#
+# where
+#
+# 'string' is either the MIME name of charset or it's full name (listed
+# either in the left or in the right column of table of
+# recognized charsets), case-insensitive - e.g. 'Koi8-R' or
+# 'Cyrillic (KOI8-R)' (both without quotes),
+#
+# 'prefix' is any string, and such value will select all charsets having
+# the name with prefix matching given (case insensitive), i.e.,
+# for the charsets listed in the table of recognized charsets,
+#
+.ex
+# ASSUMED_DOC_CHARSET_CHOICE:cyrillic*
+# will be equal to specifying
+.ex 4
+# ASSUMED_DOC_CHARSET_CHOICE:cp866
+# ASSUMED_DOC_CHARSET_CHOICE:windows-1251
+# ASSUMED_DOC_CHARSET_CHOICE:koi8-r
+# ASSUMED_DOC_CHARSET_CHOICE:iso-8859-5
+# or lines with full names of charsets.
+#
+# literal string '*' (without quotes) will enable all charset choices
+# in corresponding field. This is useful for overriding site
+# defaults in private pieces of lynx.cfg included via INCLUDE
+# directive.
+#
+# Default values for both settings are '*', but any occurrence of settings
+# with values that denote any charsets will make only listed choices available
+# for corresponding field.
+#ASSUMED_DOC_CHARSET_CHOICE:*
+#DISPLAY_CHARSET_CHOICE:*
+
+.h2 ASSUME_LOCAL_CHARSET
+# ASSUME_LOCAL_CHARSET is like ASSUME_CHARSET but only applies to local
+# files. If no setting is given here or by an -assume_local_charset
+# command line option, the value for ASSUME_CHARSET or -assume_charset
+# is used. It works for both text/plain and text/html files.
+# This option will ignore "raw mode" toggling when local files are viewed
+# (it is "stronger" than "assume_charset" or the effective change
+# of the charset assumption caused by changing "raw mode"),
+# so only use when necessary.
+#
+#ASSUME_LOCAL_CHARSET:iso-8859-1
+
+.h2 PREPEND_CHARSET_TO_SOURCE
+# PREPEND_CHARSET_TO_SOURCE:TRUE tells Lynx to prepend a META CHARSET line
+# to text/html source files when they are retrieved for 'd'ownloading
+# or passed to 'p'rint functions, so HTTP headers will not be lost.
+# This is necessary for resolving charset for local html files,
+# while the assume_local_charset is just an assumption.
+# For the 'd'ownload option, a META CHARSET will be added only if the HTTP
+# charset is present. The compilation default is TRUE.
+# It is generally desirable to have charset information for every local
+# html file, but META CHARSET string potentially could cause
+# compatibility problems with other browsers, see also PREPEND_BASE_TO_SOURCE.
+# Note that the prepending is not done for -source dumps.
+#
+#PREPEND_CHARSET_TO_SOURCE:TRUE
+
+.h2 NCR_IN_BOOKMARKS
+# NCR_IN_BOOKMARKS:TRUE allows you to save 8-bit characters in bookmark titles
+# in the unicode format (NCR). This may be useful if you need to switch
+# display charsets frequently. This is the case when you use Lynx on different
+# platforms, e.g., on UNIX and from a remote PC, and want to keep the bookmarks
+# file persistent.
+# Another aspect is compatibility: NCR is part of I18N and HTML4.0
+# specifications supported starting with Lynx 2.7.2, Netscape 4.0 and MSIE 4.0.
+# Older browser versions will fail so keep NCR_IN_BOOKMARKS:FALSE if you
+# plan to use them.
+#
+#NCR_IN_BOOKMARKS:FALSE
+
+.h2 FORCE_8BIT_TOUPPER
+# FORCE_8BIT_TOUPPER overrides locale settings and uses internal 8-bit
+# case-conversion mechanism for case-insensitive searches in non-ASCII display
+# character sets. It is FALSE by default and should not be changed unless
+# you encounter problems with case-insensitive searches.
+#
+#FORCE_8BIT_TOUPPER:FALSE
+
+.h2 OUTGOING_MAIL_CHARSET
+# While Lynx supports different platforms and display character sets
+# we need to limit the charset in outgoing mail to reduce
+# trouble for remote recipients who may not recognize our charset.
+# You may try US-ASCII as the safest value (7 bit), any other MIME name,
+# or leave this field blank (default) to use the display character set.
+# Charset translations currently are implemented for mail "subjects= " only.
+#
+#OUTGOING_MAIL_CHARSET:
+
+.h2 ASSUME_UNREC_CHARSET
+# If Lynx encounters a charset parameter it doesn't recognize, it will
+# replace the value given by ASSUME_UNREC_CHARSET (or a corresponding
+# -assume_unrec_charset command line option) for it. This can be used
+# to deal with charsets unknown to Lynx, if they are "sufficiently
+# similar" to one that Lynx does know about, by forcing the same
+# treatment. There is no default, and you probably should leave this
+# undefined unless necessary.
+#
+#ASSUME_UNREC_CHARSET:iso-8859-1
+
+.h2 PREFERRED_LANGUAGE
+# PREFERRED_LANGUAGE is the language in MIME notation (e.g., "en",
+# "fr") which will be indicated by Lynx in its Accept-Language headers
+# as the preferred language. If available, the document will be
+# transmitted in that language. Users can override this setting via
+# the 'o'ptions menu and save that preference in their RC file.
+# This may be a comma-separated list of languages in decreasing preference.
+#
+#PREFERRED_LANGUAGE:en
+
+.h2 PREFERRED_CHARSET
+# PREFERRED_CHARSET specifies the character set in MIME notation (e.g.,
+# "ISO-8859-2", "ISO-8859-5") which Lynx will indicate you prefer in
+# requests to http servers using an Accept-Charsets header. Users can
+# change it via the 'o'ptions menu and save that preference in their RC file.
+# The value should NOT include "ISO-8859-1" or "US-ASCII",
+# since those values are always assumed by default.
+# If a file in that character set is available, the server will send it.
+# If no Accept-Charset header is present, the default is that any
+# character set is acceptable. If an Accept-Charset header is present,
+# and if the server cannot send a response which is acceptable
+# according to the Accept-Charset header, then the server SHOULD send
+# an error response with the 406 (not acceptable) status code, though
+# the sending of an unacceptable response is also allowed. See RFC 2068
+.url http://tools.ietf.org/html/rfc2068
+#
+#PREFERRED_CHARSET:
+
+.h2 CHARSETS_DIRECTORY
+# CHARSETS_DIRECTORY specifies the directory with the fonts (glyph data)
+# used by Lynx to switch the display-font to a font best suited for the
+# given document. The font should be in a format understood by the
+# platforms TTY-display-font-switching API. Currently supported on OS/2 only.
+#
+# Lynx expects the glyphs for the charset CHARSET with character cell
+# size HHHxWWW to be stored in a file HHHxWWW/CHARSET.fnt inside the directory
+# specified by CHARSETS_DIRECTORY. E.g., the font for koi8-r sized 14x9
+# should be in the file 14x9/koi8-r.fnt.
+#
+#CHARSETS_DIRECTORY:
+
+.h2 CHARSET_SWITCH_RULES
+# CHARSET_SWITCH_RULES hints lynx on how to choose the best display font given
+# the document encoding. This string is a sequence of chunks, each chunk
+# having the following form:
+#
+# IN_CHARSET1 IN_CHARSET2 ... IN_CHARSET5 :OUT_CHARSET
+#
+# For readability, one may insert arbitrary additional punctuation (anything
+# but : is ignored). E.g., if lynx is able to switch only to display charsets
+# cp866, cp850, cp852, and cp862, then the following setting may be useful
+# (split for readability):
+#
+# CHARSET_SWITCH_RULES: koi8-r ISO-8859-5 windows-1251 cp866u KOI8-U :cp866,
+# iso-8859-1 windows-1252 ISO-8859-15 :cp850,
+# ISO-8859-2 windows-1250 :cp852,
+# ISO-8859-8 windows-1255 :cp862
+#
+#CHARSET_SWITCH_RULES:
+
+.h1 Interaction
+
+.h2 URL_DOMAIN_PREFIXES
+.h2 URL_DOMAIN_SUFFIXES
+# URL_DOMAIN_PREFIXES and URL_DOMAIN_SUFFIXES are strings which will be
+# prepended (together with a scheme://) and appended to the first element
+# of command line or 'g'oto arguments which are not complete URLs and
+# cannot be opened as a local file (file://localhost/string). Both
+# can be comma-separated lists. Each prefix must end with a dot, each
+# suffix must begin with a dot, and either may contain other dots (e.g.,
+# .com.jp). The default lists are defined in userdefs.h and can be
+# replaced here. Each prefix will be used with each suffix, in order,
+# until a valid Internet host is created, based on a successful DNS
+# lookup (e.g., foo will be tested as www.foo.com and then www.foo.edu
+# etc.). The first element can include a :port and/or /path which will
+# be restored with the expanded host (e.g., wfbr:8002/dir/lynx will
+# become http://www.wfbr.edu:8002/dir/lynx). The prefixes will not be
+# used if the first element ends in a dot (or has a dot before the
+# :port or /path), and similarly the suffixes will not be used if the
+# the first element begins with a dot (e.g., .nyu.edu will become
+# http://www.nyu.edu without testing www.nyu.com). Lynx will try to
+# guess the scheme based on the first field of the expanded host name,
+# and use "http://" as the default (e.g., gopher.wfbr.edu or gopher.wfbr.
+# will be made gopher://gopher.wfbr.edu).
+#
+#URL_DOMAIN_PREFIXES:www.
+#URL_DOMAIN_SUFFIXES:.com,.edu,.net,.org
+
+.h2 FORMS_OPTIONS
+# Toggle whether the Options Menu is key-based or form-based;
+# the key-based version is available only if specified at compile time.
+#FORMS_OPTIONS:TRUE
+
+.h2 PARTIAL
+# Display partial pages while downloading
+#PARTIAL:TRUE
+
+.h2 PARTIAL_THRES
+# Set the threshold # of lines Lynx must render before it
+# redraws the screen in PARTIAL mode. Anything < 0 implies
+# use of the screen size.
+#PARTIAL_THRES:-1
+
+.h2 SHOW_KB_RATE
+# While getting large files, Lynx shows the approximate rate of transfer.
+# Set this to change the units shown. "Kilobytes" denotes 1024 bytes:
+# NONE to disable the display of transfer rate altogether.
+# TRUE or KB for Kilobytes/second.
+# FALSE or BYTES for bytes/second.
+# KB,ETA to show Kilobytes/second with estimated completion time.
+# BYTES,ETA to show BYTES/second with estimated completion time.
+# KB2,ETA to show Kilobytes/second with estimated completion time using 2-digits.
+# BYTES2,ETA to show BYTES/second with estimated completion time using 2-digits.
+# Note that the "ETA" values are available if USE_READPROGRESS was defined.
+#SHOW_KB_RATE:TRUE
+
+.h2 SHOW_KB_NAME
+# Set the abbreviation for Kilobytes (1024).
+# Quoting from
+.url http://www.romulus2.com/articles/guides/misc/bitsbytes.shtml
+# In December 1998, the International Electrotechnical Commission (IEC)
+# approved a new IEC International Standard. Instead of using the metric
+# prefixes for multiples in binary code, the new IEC standard invented specific
+# prefixes for binary multiples made up of only the first two letters of the
+# metric prefixes and adding the first two letters of the word "binary". Thus,
+# for instance, instead of Kilobyte (KB) or Gigabyte (GB), the new terms would
+# be kibibyte (KiB) or gibibyte (GiB).
+#
+# If you prefer using the conventional (and more common) "KB", modify this
+# setting.
+#SHOW_KB_NAME:KiB
+
+.h1 Timeouts
+
+.h2 INFOSECS
+.h2 MESSAGESECS
+.h2 ALERTSECS
+.h2 NO_PAUSE
+# The following definitions set the number of seconds for
+# pauses following statusline messages that would otherwise be
+# replaced immediately, and are more important than the unpaused
+# progress messages. Those set by INFOSECS are also basically
+# progress messages (e.g., that a prompted input has been canceled)
+# and should have the shortest pause. Those set by MESSAGESECS are
+# informational (e.g., that a function is disabled) and should have
+# a pause of intermediate duration. Those set by ALERTSECS typically
+# report a serious problem and should be paused long enough to read
+# whenever they appear (typically unexpectedly). The default values
+# are defined in userdefs.h, and can be modified here should longer
+# pauses be desired for braille-based access to Lynx.
+#
+# SVr4-curses implementations support time delays in milliseconds,
+# hence the value may be given shorter, e.g., 0.5
+#
+# Use the NO_PAUSE option (like the command-line -nopause) to override
+# all of the delay times.
+#
+#INFOSECS:1
+#MESSAGESECS:2
+#ALERTSECS:3
+#NO_PAUSE:FALSE
+
+.h2 DEBUGSECS
+# Set DEBUGSECS to a nonzero value to slow down progress messages
+# (see "-delay" option).
+#DEBUGSECS:0
+
+.h2 REPLAYSECS
+# Set REPLAYSECS to a nonzero value to allow for slow replaying of
+# command scripts (see "-cmd_script" option).
+#REPLAYSECS:0
+
+.h1 Appearance
+# These settings control the appearance of Lynx's screen and the way
+# Lynx renders some tags.
+
+.h2 USE_SELECT_POPUPS
+# If USE_SELECT_POPUPS is set FALSE, Lynx will present a vertical list of
+# radio buttons for the OPTIONs in SELECT blocks which lack the MULTIPLE
+# attribute, instead of using a popup menu. Note that if the MULTIPLE
+# attribute is present in the SELECT start tag, Lynx always will create a
+# vertical list of checkboxes for the OPTIONs.
+# The default defined here or in userdefs.h can be changed via the 'o'ptions
+# menu and saved in the RC file, and always can be toggled via the -popup
+# command line switch.
+#
+#USE_SELECT_POPUPS:TRUE
+
+.h2 SHOW_CURSOR
+# SHOW_CURSOR controls whether or not the cursor is hidden or appears
+# over the current link in documents or the current option in popups.
+# Showing the cursor is handy if you are a sighted user with a poor
+# terminal that can't do bold and reverse video at the same time or
+# at all. It also can be useful to blind users, as an alternative
+# or supplement to setting LINKS_AND_FIELDS_ARE_NUMBERED or
+# LINKS_ARE_NUMBERED.
+# The default defined here or in userdefs.h can be changed via the
+# 'o'ptions menu and saved in the RC file, and always can be toggled
+# via the -show_cursor command line switch.
+#
+#SHOW_CURSOR:FALSE
+
+.h2 UNDERLINE_LINKS
+# UNDERLINE_LINKS controls whether links are underlined by default, or shown
+# in bold. Normally this default is set from the configure script.
+#
+#UNDERLINE_LINKS:FALSE
+
+.h2 BOLD_HEADERS
+# If BOLD_HEADERS is set to TRUE the HT_BOLD default style will be acted
+# upon for <H1> through <H6> headers. The compilation default is FALSE
+# (only the indentation styles are acted upon, but see BOLD_H1, below).
+# On Unix, compilation with -DUNDERLINE_LINKS also will apply to the
+# HT_BOLD style for headers when BOLD_HEADERS is TRUE.
+#
+#BOLD_HEADERS:FALSE
+
+.h2 BOLD_H1
+# If BOLD_H1 is set to TRUE the HT_BOLD default style will be acted
+# upon for <H1> headers even if BOLD_HEADERS is FALSE. The compilation
+# default is FALSE. On Unix, compilation with -DUNDERLINE_LINKS also
+# will apply to the HT_BOLD style for headers when BOLD_H1 is TRUE.
+#
+#BOLD_H1:FALSE
+
+.h2 BOLD_NAME_ANCHORS
+# If BOLD_NAME_ANCHORS is set to TRUE the content of anchors without
+# an HREF attribute, (i.e., anchors with a NAME or ID attribute) will
+# have the HT_BOLD default style. The compilation default is FALSE.
+# On Unix, compilation with -DUNDERLINE_LINKS also will apply to the
+# HT_BOLD style for NAME (ID) anchors when BOLD_NAME_ANCHORS is TRUE.
+#
+#BOLD_NAME_ANCHORS:FALSE
+
+.h1 Internal Behavior
+
+.h2 DEFAULT_CACHE_SIZE
+.h2 DEFAULT_VIRTUAL_MEMORY_SIZE
+# The DEFAULT_CACHE_SIZE specifies the number of WWW documents to be
+# cached in memory at one time.
+#
+# This so-called cache size (actually, number) is defined in userdefs.h and
+# may be modified here and/or with the command line argument -cache=NUMBER
+# The minimum allowed value is 2, for the current document and at least one
+# to fetch, and there is no absolute maximum number of cached documents.
+# On Unix, and VMS not compiled with VAXC, whenever the number is exceeded
+# the least recently displayed document will be removed from memory.
+#
+# On VMS compiled with VAXC, the DEFAULT_VIRTUAL_MEMORY_SIZE specifies the
+# amount (bytes) of virtual memory that can be allocated and not yet be freed
+# before previous documents are removed from memory. If the values for both
+# the DEFAULT_CACHE_SIZE and DEFAULT_VIRTUAL_MEMORY_SIZE are exceeded, then
+# the least recently displayed documents will be freed until one or the other
+# value is no longer exceeded. The default value is defined in userdefs.h.
+#
+# The Unix and VMS (but not VAXC) implementations use the C library malloc's
+# and calloc's for memory allocation, but procedures for taking the actual
+# amount of cache into account still need to be developed. They use only
+# the DEFAULT_CACHE_SIZE value, and that specifies the absolute maximum
+# number of documents to cache (rather than the maximum number only if
+# DEFAULT_VIRTUAL_MEMORY_SIZE has been exceeded, as with VAXC/VAX).
+#
+#DEFAULT_CACHE_SIZE:10
+#DEFAULT_VIRTUAL_MEMORY_SIZE:512000
+
+.h2 SOURCE_CACHE
+# SOURCE_CACHE sets the source caching behavior for Lynx:
+#
+# FILE causes Lynx to keep a temporary file for each cached document
+# containing the HTML source of the document, which it uses to regenerate
+# the document when certain settings are changed (for instance,
+# historical vs. minimal vs. valid comment parsing) instead of reloading
+# the source from the network.
+#
+# MEMORY is like FILE, except the document source is kept in memory. You
+# may wish to adjust DEFAULT_CACHE_SIZE and DEFAULT_VIRTUAL_MEMORY_SIZE
+# accordingly.
+#
+# NONE is the default; the document source is not cached, and is reloaded
+# from the network when needed.
+#
+#SOURCE_CACHE:NONE
+
+.h2 SOURCE_CACHE_FOR_ABORTED
+# This setting controls what will happen with cached source for the document
+# being fetched from the net if fetching was aborted (either user pressed
+# 'z' or network went down). If set to KEEP, the source fetched so far will
+# be preserved (and used as cache), if set to DROP lynx will drop the
+# source cache for that document (i.e. only completely downloaded documents
+# will be cached in that case).
+#SOURCE_CACHE_FOR_ABORTED:DROP
+
+.h2 ALWAYS_RESUBMIT_POSTS
+# If ALWAYS_RESUBMIT_POSTS is set TRUE, Lynx always will resubmit forms
+# with method POST, dumping any cache from a previous submission of the
+# form, including when the document returned by that form is sought with
+# the PREV_DOC command or via the history list. Lynx always resubmits
+# forms with method POST when a submit button or a submitting text input
+# is activated, but normally retrieves the previously returned document
+# if it had links which you activated, and then go back with the PREV_DOC
+# command or via the history list.
+#
+# The default defined here or in userdefs.h can be toggled via
+# the -resubmit_forms command line switch.
+#
+#ALWAYS_RESUBMIT_POSTS:FALSE
+
+.h2 TRIM_INPUT_FIELDS
+# If TRIM_INPUT_FIELDS is set TRUE, Lynx will trim trailing whitespace (e.g.,
+# space, tab, carriage return, line feed and form feed) from the text entered
+# into form text and textarea fields. Older versions of Lynx do this trimming
+# unconditionally, but other browsers do not, which would yield different
+# behavior for CGI scripts.
+#TRIM_INPUT_FIELDS:FALSE
+
+.h1 HTML Parsing
+
+.h2 NO_ISMAP_IF_USEMAP
+# If NO_ISMAP_IF_USEMAP is set TRUE, Lynx will not include a link to the
+# server-side image map if both a server-side and client-side map for the
+# same image is indicated in the HTML markup. The compilation default is
+# FALSE, such that a link with "[ISMAP]" as the link name, followed by a
+# hyphen, will be prepended to the ALT string or "[USEMAP]" pseudo-ALT for
+# accessing Lynx's text-based rendition of the client-side map (based on
+# the content of the associated MAP element). If the "[ISMAP]" link is
+# activated, Lynx will send a 0,0 coordinate pair to the server, which
+# Lynx-friendly sites can map to a for-text-client document, homologous
+# to what is intended for the content of a FIG element.
+#
+# The compilation default, or default defined here, can be toggled via
+# the "-ismap" command line switch.
+#
+#NO_ISMAP_IF_USEMAP:FALSE
+
+.h2 SEEK_FRAG_MAP_IN_CUR
+# If SEEK_FRAG_MAP_IN_CUR is set FALSE, then USEMAP attribute values
+# (in IMG or OBJECT tags) consisting of only a fragment (USEMAP="#foo")
+# will be resolved with respect to the current document's base, which
+# might not be the same as the current document's URL.
+# The compilation default is to use the current document's URL in all
+# cases (i.e., assume the MAP is present below, if it wasn't present
+# above the point in the HTML stream where the USEMAP attribute was
+# detected). Lynx's present "single pass" rendering engine precludes
+# checking below before making the decision on how to resolve a USEMAP
+# reference consisting solely of a fragment.
+#
+#SEEK_FRAG_MAP_IN_CUR:TRUE
+
+.h2 SEEK_FRAG_AREA_IN_CUR
+# If SEEK_FRAG_AREA_IN_CUR is set FALSE, then HREF attribute values
+# in AREA tags consisting of only a fragment (HREF="#foo") will be
+# resolved with respect to the current document's base, which might
+# not be the same as the current document's URL. The compilation
+# default is to use the current document's URL, as is done for the
+# HREF attribute values of Anchors and LINKs that consist solely of
+# a fragment.
+#
+#SEEK_FRAG_AREA_IN_CUR:TRUE
+
+.h1 CGI scripts
+# These settings control Lynx's ability to execute various types of scripts.
+
+.h2 LOCAL_EXECUTION_LINKS_ALWAYS_ON
+.h2 LOCAL_EXECUTION_LINKS_ON_BUT_NOT_REMOTE
+# Local execution links and scripts are by default completely disabled,
+# unless a change is made to the userdefs.h file to enable them or
+# the configure script is used with the corresponding options
+# (-enable-exec-links and -enable-exec-scripts).
+# See the Lynx source code distribution and the userdefs.h
+# file for more detail on enabling execution links and scripts.
+#
+# If you have enabled execution links or scripts the following
+# two variables control Lynx's action when an execution link
+# or script is encountered.
+#
+# If LOCAL_EXECUTION_LINKS_ALWAYS_ON is set to TRUE any execution
+# link or script will be executed no matter where it came from.
+# This is EXTREMELY dangerous. Since Lynx can access files from
+# anywhere in the world, you may encounter links or scripts that
+# will cause damage or compromise the security of your system.
+#
+# If LOCAL_EXECUTION_LINKS_ON_BUT_NOT_REMOTE is set to TRUE only
+# links or scripts that reside on the local machine and are
+# referenced with a URL beginning with "file://localhost/" or meet
+# TRUSTED_EXEC or ALWAYS_TRUSTED_EXEC rules (see below) will be
+# executed. This is much less dangerous than enabling all execution
+# links, but can still be dangerous.
+#
+#LOCAL_EXECUTION_LINKS_ALWAYS_ON:FALSE
+#LOCAL_EXECUTION_LINKS_ON_BUT_NOT_REMOTE:FALSE
+
+.h2 TRUSTED_EXEC
+# If LOCAL_EXECUTION_LINK_ON_BUT_NOT_REMOTE is TRUE, and no TRUSTED_EXEC
+# rule is defined, it defaults to "file://localhost/" and any lynxexec
+# or lynxprog command will be permitted if it was referenced from within
+# a document whose URL begins with that string. If you wish to restrict the
+# referencing URLs further, you can extend the string to include a trusted
+# path. You also can specify a trusted directory for http URLs, which will
+# then be treated as if they were local rather than remote. For example:
+#
+# TRUSTED_EXEC:file://localhost/trusted/
+# TRUSTED_EXEC:http://www.wfbr.edu/trusted/
+#
+# If you also wish to restrict the commands which can be executed, create
+# a series of rules with the path (Unix) or command name (VMS) following
+# the string, separated by a tab. For example:
+#
+# Unix:
+# ====
+# TRUSTED_EXEC:file://localhost/<tab>/bin/cp
+# TRUSTED_EXEC:file://localhost/<tab>/bin/rm
+# VMS:
+# ===
+# TRUSTED_EXEC:file://localhost/<tab>copy
+# TRUSTED_EXEC:file://localhost/<tab>delete
+#
+# Once you specify a TRUSTED_EXEC referencing string, the default is
+# replaced, and all the referencing strings you desire must be specified
+# as a series. Similarly, if you associate a command with the referencing
+# string, you must specify all of the allowable commands as a series of
+# TRUSTED_EXEC rules for that string. If you specify ALWAYS_TRUSTED_EXEC
+# rules below, you need not repeat them as TRUSTED_EXEC rules.
+#
+# If EXEC_LINKS and JUMPFILE have been defined, any lynxexec or lynxprog
+# URLs in that file will be permitted, regardless of other settings. If
+# you also set LOCAL_EXECUTION_LINKS_ON_BUT_NOT_REMOTE:TRUE and a single
+# TRUSTED_EXEC rule that will always fail (e.g., "none"), then *ONLY* the
+# lynxexec or lynxprog URLs in JUMPFILE (and any ALWAYS_TRUSTED_EXEC rules,
+# see below) will be allowed. Note, however, that if Lynx was compiled with
+# CAN_ANONYMOUS_JUMP set to FALSE (default is TRUE), or -restrictions=jump
+# is included with the -anonymous switch at run time, then users of an
+# anonymous account will not be able to access the jumps file or enter
+# 'j'ump shortcuts, and this selective execution feature will be overridden
+# as well (i.e., they will only be able to access lynxexec or lynxprog
+# URLs which meet any ALWAYS_TRUSTED_EXEC rules).
+#
+#TRUSTED_EXEC:none
+
+.h2 ALWAYS_TRUSTED_EXEC
+# If EXEC_LINKS was defined, any lynxexec or lynxprog URL can be made
+# always enabled by an ALWAYS_TRUSTED_EXEC rule for it. This is useful for
+# anonymous accounts in which you have disabled execution links generally,
+# and may also have disabled jumps file links, but still want to allow
+# execution of particular utility scripts or programs. The format is
+# like that for TRUSTED_EXEC. For example:
+#
+# Unix:
+# ====
+# ALWAYS_TRUSTED_EXEC:file://localhost/<tab>/usr/local/kinetic/bin/usertime
+# ALWAYS_TRUSTED_EXEC:http://www.more.net/<tab>/usr/local/kinetic/bin/who.sh
+# VMS:
+# ===
+# ALWAYS_TRUSTED_EXEC:file://localhost/<tab>usertime
+# ALWAYS_TRUSTED_EXEC:http://www.more.net/<tab>show users
+#
+# The default ALWAYS_TRUSTED_EXEC rule is "none".
+#
+#ALWAYS_TRUSTED_EXEC:none
+
+.h2 TRUSTED_LYNXCGI
+# Unix:
+# =====
+# TRUSTED_LYNXCGI rules define the permitted sources and/or paths for
+# lynxcgi links (if LYNXCGI_LINKS is defined in userdefs.h). The format
+# is the same as for TRUSTED_EXEC rules (see above). Example rules:
+#
+# TRUSTED_LYNXCGI:file://localhost/
+# TRUSTED_LYNXCGI:<tab>/usr/local/etc/httpd/cgi-bin/
+# TRUSTED_LYNXCGI:file://localhost/<tab>/usr/local/www/cgi-bin/
+#
+# VMS:
+# ====
+# Do not define this.
+#
+# The default TRUSTED_LYNXCGI rule is "none".
+#
+#TRUSTED_LYNXCGI:none
+
+.h2 LYNXCGI_ENVIRONMENT
+# Unix:
+# =====
+# LYNXCGI_ENVIRONMENT adds the current value of the specified
+# environment variable to the list of environment variables passed on to the
+# lynxcgi script. Useful variables are HOME, USER, etc... If proxies
+# are in use, and the script invokes another copy of lynx (or a program like
+# wget) in a subsidiary role, it can be useful to add http_proxy and other
+# *_proxy variables.
+#
+# VMS:
+# ====
+# Do not define this.
+#
+#LYNXCGI_ENVIRONMENT:
+
+.h2 LYNXCGI_DOCUMENT_ROOT
+# Unix:
+# =====
+# LYNXCGI_DOCUMENT_ROOT is the value of DOCUMENT_ROOT that will be passed
+# to lynxcgi scripts. If set and the URL has PATH_INFO data, then
+# PATH_TRANSLATED will also be generated. Examples:
+# LYNXCGI_DOCUMENT_ROOT:/usr/local/etc/httpd/htdocs
+# LYNXCGI_DOCUMENT_ROOT:/data/htdocs/
+#
+# VMS:
+# ====
+# Do not define this.
+#
+#LYNXCGI_DOCUMENT_ROOT:
+
+.h1 Cookies
+
+.h2 FORCE_SSL_COOKIES_SECURE
+# If FORCE_SSL_COOKIES_SECURE is set to TRUE, then SSL encrypted cookies
+# received from https servers never will be sent unencrypted to http
+# servers. The compilation default is to impose this block only if the
+# https server included a secure attribute for the cookie. The normal
+# default or that defined here can be toggled via the -force_secure
+# command line switch.
+#
+#FORCE_SSL_COOKIES_SECURE:FALSE
+
+.h1 Internal Behavior
+
+.h2 MAIL_SYSTEM_ERROR_LOGGING
+# MAIL_SYSTEM_ERROR_LOGGING will send a message to the owner of
+# the information, or ALERTMAIL if there is no owner, every time
+# that a document cannot be accessed!
+#
+# NOTE: This can generate A LOT of mail, be warned.
+#
+#MAIL_SYSTEM_ERROR_LOGGING:FALSE
+
+.h2 CHECKMAIL
+# If CHECKMAIL is set to TRUE, the user will be informed (via a statusline
+# message) about the existence of any unread mail at startup of Lynx, and
+# will get statusline messages if subsequent new mail arrives. If a jumps
+# file with a lynxprog URL for invoking mail is available, or your html
+# pages include an mail launch file URL, the user thereby can access mail
+# and read the messages. The checks and statusline reports will not be
+# performed if Lynx has been invoked with the -restrictions=mail switch.
+#
+# VMS USERS !!!
+# =============
+# New mail is normally broadcast as it arrives, via "unsolicited screen
+# broadcasts", which can be "wiped" from the Lynx display via the Ctrl-W
+# command. You may prefer to disable the broadcasts and use CHECKMAIL
+# instead (e.g., in a public account which will be used by people who
+# are ignorant about VMS).
+#
+#CHECKMAIL:FALSE
+
+.h1 News-groups
+
+.h2 NNTPSERVER
+# To enable news reading ability via Lynx, the environment variable NNTPSERVER
+# must be set so that it points to your site's NNTP server
+# (see Lynx Users Guide on environment variables).
+# Lynx respects RFC 1738
+.url http://tools.ietf.org/html/rfc1738
+# and does not accept a host field in news URLs (use nntp: instead of news: for
+# the scheme if you wish to specify an NNTP host in a URL, as explained in the
+# RFC). If you have not set the variable externally, you can set it at run
+# time via this configuration file. It will not override an external setting.
+# Note that on VMS it is set as a process logical rather than symbol, and will
+# outlive the Lynx image.
+# The news reading facility in Lynx is quite limited. Lynx does not provide a
+# full featured news reader with elaborate error checking and safety features.
+#
+#NNTPSERVER:news.server.dom
+
+.h2 LIST_NEWS_NUMBERS
+# If LIST_NEWS_NUMBERS is set TRUE, Lynx will use an ordered list and include
+# the numbers of articles in news listings, instead of using an unordered
+# list. The default is defined in userdefs.h, and can be overridden here.
+#
+#LIST_NEWS_NUMBERS:FALSE
+
+.h2 LIST_NEWS_DATES
+# If LIST_NEWS_DATES is set TRUE, Lynx will include the dates of articles in
+# news listings. The dates always are included in the articles, themselves.
+# The default is defined in userdefs.h, and can be overridden here.
+#
+#LIST_NEWS_DATES:FALSE
+
+.h2 NEWS_CHUNK_SIZE
+.h2 NEWS_MAX_CHUNK
+# NEWS_CHUNK_SIZE and NEWS_MAX_CHUNK regulate the chunking of news article
+# listings with inclusion of links for listing earlier and/or later articles.
+# The defaults are defined in HTNews.c as 30 and 40, respectively. If the
+# news group contains more than NEWS_MAX_CHUNK articles, they will be listed
+# in NEWS_CHUNK_SIZE chunks. You can change the defaults here, and/or on
+# the command line via -newschunksize=NUMBER and/or -newsmaxchunk=NUMBER
+# switches. Note that if the chunk size is increased, here or on the command
+# line, to a value greater than the current maximum, the maximum will be
+# increased to that number. Conversely, if the maximum is set to a number
+# less than the current chunk size, the chunk size will be reduced to that
+# number. Thus, you need use only one of the two switches on the command
+# line, based on the direction of intended change relative to the compilation
+# or configuration defaults. The compilation defaults ensure that there will
+# be at least 10 earlier articles before bothering to chunk and create a link
+# for earlier articles.
+#
+#NEWS_CHUNK_SIZE:30
+#NEWS_MAX_CHUNK:40
+
+.h2 NEWS_POSTING
+# Set NEWS_POSTING to FALSE if you do not want to support posting to
+# news groups via Lynx. If left TRUE, Lynx will use its news gateway to
+# post new messages or followups to news groups, using the URL schemes
+# described in the "Supported URLs" section of the online 'h'elp. The
+# posts will be attempted via the nntp server specified in the URL, or
+# if none was specified, via the NNTPSERVER configuration or environment
+# variable. Links with these URLs for posting or sending followups are
+# created by the news gateway when reading group listings or articles
+# from nntp servers if the server indicates that it permits posting.
+# The compilation default set in userdefs.h can be changed here. If
+# the default is TRUE, posting can still be disallowed via the
+# -restrictions command line switch.
+# The posting facility in Lynx is quite limited. Lynx does not provide a
+# full featured news poster with elaborate error checking and safety features.
+#
+#NEWS_POSTING:TRUE
+
+.h2 LYNX_SIG_FILE
+# LYNX_SIG_FILE defines the name of a file containing a signature which
+# can be appended to email messages and news postings or followups. The
+# user will be prompted whether to append it. It is sought in the home
+# directory. If it is in a subdirectory, begin it with a dot-slash
+# (e.g., ./lynx/.lynxsig). The definition is set in userdefs.h and can
+# be changed here.
+#
+#LYNX_SIG_FILE:.lynxsig
+
+.h1 Bibliographic Protocol (bibp scheme)
+
+.h2 BIBP_GLOBAL_SERVER
+# BIBP_GLOBAL_SERVER is the default global server for bibp: links, used
+# when a local bibhost or document-specified citehost is unavailable.
+# Set in userdefs.h and can be changed here.
+#BIBP_GLOBAL_SERVER:http://usin.org/
+
+.h2 BIBP_BIBHOST
+# BIBP_BIBHOST is the URL at which local bibp service may be found, if
+# it exists. Defaults to http://bibhost/ for protocol conformance, but
+# may be overridden here or via -bibhost parameter.
+#BIBP_BIBHOST:http://bibhost/
+
+.h1 Interaction
+# These settings control interaction of the user with lynx.
+
+.h2 SCROLLBAR
+# If SCROLLBAR is set TRUE, Lynx will show scrollbar on windows. With mouse
+# enabled, the scrollbar strip outside the bar is clickable, and scrolls the
+# window by pages. The appearance of the scrollbar can be changed from
+# LYNX_LSS file: define attributes scroll.bar, scroll.back (for the bar, and
+# for the strip along which the scrollbar moves).
+#SCROLLBAR:FALSE
+
+.h2 SCROLLBAR_ARROW
+# If SCROLLBAR_ARROW is set TRUE, Lynx's scrollbar will have arrows at the
+# ends. With mouse enabled, the arrows are clickable, and scroll the window by
+# 2 lines. The appearance of the scrollbar arrows can be changed from LYNX_LSS
+# file: define attributes scroll.arrow, scroll.noarrow (for enabled-arrows,
+# and disabled arrows). An arrow is "disabled" if the bar is at this end of
+# the strip.
+#SCROLLBAR_ARROW:TRUE
+
+.h2 USE_MOUSE
+# If Lynx is configured with ncurses, PDcurses or slang & USE_MOUSE is TRUE,
+# users can perform commands by left-clicking certain parts of the screen:
+# on a link = `g'oto + ACTIVATE (i.e., move highlight & follow the link);
+# on the top/bottom lines = PREV/NEXT_PAGE (i.e., go up/down 1 page);
+# on the top/bottom left corners = PREV/NEXT_DOC (i.e., go to the previous
+# document / undo goto previous document);
+# on the top/bottom right corners = HISTORY/VLINKS (i.e., call up the history
+# page or visited links page if on history page).
+# NB if the mouse is defined in this way, it will not be available
+# for copy/paste operations using the clipboard of a desktop manager:
+# for flexibility instead, use the command-line switch -use_mouse .
+#
+# ncurses and slang have built-in support for the xterm mouse protocol. In
+# addition, ncurses can be linked with the gpm mouse library, to automatically
+# provide support for this interface in applications such as Lynx. (Please
+# read the ncurses faq to work around broken gpm configurations packaged by
+# some distributors). PDCurses implements mouse support for win32 console
+# windows, as does slang.
+#USE_MOUSE:FALSE
+
+.h1 HTML Parsing
+# These settings control the way Lynx parses invalid HTML
+# and how it may resolve such issues.
+
+.h2 COLLAPSE_BR_TAGS
+# If COLLAPSE_BR_TAGS is set FALSE, Lynx will not collapse serial BR tags.
+# If set TRUE, two or more concurrent BRs will be collapsed into a single
+# line break. Note that the valid way to insert extra blank lines in HTML
+# is via a PRE block with only newlines in the block.
+#
+#COLLAPSE_BR_TAGS:TRUE
+
+.h2 TRIM_BLANK_LINES
+# If TRIM_BLANK_LINES is set FALSE, Lynx will not trim trailing blank lines
+# from the document. Also, Lynx will not collapse BR-tags onto the previous
+# line when it happens to be empty.
+#TRIM_BLANK_LINES:TRUE
+
+.h2 TAGSOUP
+# If TAGSOUP is set, Lynx uses the "Tag Soup DTD" rather than "SortaSGML".
+# The two approaches differ by the style of error detection and recovery.
+# Tag Soup DTD allows for improperly nested tags; SortaSGML is stricter.
+#TAGSOUP:FALSE
+
+.h1 Cookies
+
+.h2 COOKIE_VERSION
+# Select the RFC cookie version using the RFC number. Most users will not
+# need to change this, but because RFC 6265 makes incompatible changes versus
+# the older RFCs, it is interesting to compare behavior.
+#
+# For reference:
+.url http://tools.ietf.org/html/rfc6265
+.url http://tools.ietf.org/html/rfc2965
+.url http://tools.ietf.org/html/rfc2109
+#COOKIE_VERSION:RFC-6265
+
+.h2 SET_COOKIES
+# If SET_COOKIES is set FALSE, Lynx will ignore Set-Cookie headers
+# in http server replies. Note that if a COOKIE_FILE is in use (see
+# below) that contains cookies at startup, Lynx will still send those
+# persistent cookies in requests as appropriate. Setting SET_COOKIES
+# to FALSE just prevents accepting any new cookies from servers. To
+# prevent all cookie processing (sending *and* receiving) in a session,
+# make sure that PERSISTENT_COOKIES is not TRUE or that COOKIE_FILE does
+# not point to a file with cookies, in addition to setting SET_COOKIES
+# to FALSE.
+# The default is defined in userdefs.h, and can be overridden here,
+# and/or toggled via the -cookies command line switch.
+#
+#SET_COOKIES:TRUE
+
+.h2 ACCEPT_ALL_COOKIES
+# If ACCEPT_ALL_COOKIES is set TRUE, Lynx will accept cookies from all
+# domains with no user interaction. This is equivalent to automatically
+# replying to all cookie 'Allow?' prompts with 'A'lways. Note that it
+# does not preempt validity checking, which has to be controlled separately
+# (see below).
+# The default is defined in userdefs.h and can be overridden here, or
+# in the .lynxrc file via an o(ptions) screen setting. It may also be
+# toggled via the -accept_all_cookies command line switch.
+#
+#ACCEPT_ALL_COOKIES:FALSE
+
+.h2 COOKIE_ACCEPT_DOMAINS
+.h2 COOKIE_REJECT_DOMAINS
+# COOKIE_ACCEPT_DOMAINS and COOKIE_REJECT_DOMAINS are comma-delimited lists
+# of domains from which Lynx should automatically accept or reject cookies
+# without asking for confirmation. If the same domain is specified in both
+# lists, rejection will take precedence.
+# Note that in order to match cookies, domains have to be spelled out exactly
+# in the form in which they would appear on the Cookie Jar page (case is
+# insignificant). They are not wildcards. Domains that apply to more than
+# one host have a leading '.', but have to match *the cookie's* domain
+# exactly.
+#
+#COOKIE_ACCEPT_DOMAINS:
+#COOKIE_REJECT_DOMAINS:
+
+.h2 COOKIE_LOOSE_INVALID_DOMAINS
+.h2 COOKIE_STRICT_INVALID_DOMAINS
+.h2 COOKIE_QUERY_INVALID_DOMAINS
+# COOKIE_LOOSE_INVALID_DOMAINS, COOKIE_STRICT_INVALID_DOMAINS, and
+# COOKIE_QUERY_INVALID_DOMAINS are comma-delimited lists of domains.
+# They control the degree of validity checking that is applied to cookies
+# for the specified domains.
+# Note that in order to match cookies, domains have to be spelled out exactly
+# in the form in which they would appear on the Cookie Jar page (case is
+# insignificant). They are not wildcards. Domains that apply to more than
+# one host have a leading '.', but have to match *the cookie's* domain
+# exactly.
+# If a domain is set to strict checking, strict conformance to RFC 2109 will
+# be applied. A domain with loose checking will be allowed to set cookies
+# with an invalid path or domain attribute. All domains will default to
+# asking the user for confirmation in case of an invalid path or domain.
+# Cookie validity checking takes place as a separate step before the
+# final decision to accept or reject (see previous options), therefore
+# a cookie that passes validity checking may still be automatically
+# rejected or cause another prompt.
+#
+#COOKIE_LOOSE_INVALID_DOMAINS:
+#COOKIE_STRICT_INVALID_DOMAINS:
+#COOKIE_QUERY_INVALID_DOMAINS:
+
+.h2 MAX_COOKIES_DOMAIN
+.h2 MAX_COOKIES_GLOBAL
+.h2 MAX_COOKIES_BUFFER
+# MAX_COOKIES_DOMAIN,
+# MAX_COOKIES_GLOBAL and
+# MAX_COOKIES_BUFFER are limits on the total number of cookies for each domain,
+# globally, and the per-cookie buffer size. These limits are by default large
+# enough for reasonable usage; if they are very high, some sites may present
+# undue performance waste.
+#
+#MAX_COOKIES_DOMAIN:50
+#MAX_COOKIES_GLOBAL:500
+#MAX_COOKIES_BUFFER:4096
+
+.h2 PERSISTENT_COOKIES
+# PERSISTENT_COOKIES indicates that cookies should be read at startup from
+# the COOKIE_FILE, and saved at exit for storage between Lynx sessions.
+# It is not used if Lynx was compiled without USE_PERSISTENT_COOKIES.
+# The default is FALSE, so that the feature needs to be enabled here
+# explicitly if you want it.
+#
+#PERSISTENT_COOKIES:FALSE
+
+.h2 COOKIE_FILE
+# COOKIE_FILE is the default file from which persistent cookies are read
+# at startup (if the file exists), if Lynx was compiled with
+# USE_PERSISTENT_COOKIES and the PERSISTENT_COOKIES option is enabled.
+# The cookie file can also be specified in .lynxrc or on the command line.
+#
+#COOKIE_FILE:~/.lynx_cookies
+
+.h2 COOKIE_SAVE_FILE
+# COOKIE_SAVE_FILE is the default file in which persistent cookies are
+# stored at exit, if Lynx was compiled with USE_PERSISTENT_COOKIES and the
+# PERSISTENT_COOKIES option is enabled. The cookie save file can also be
+# specified on the command line.
+#
+# With an interactive Lynx session, COOKIE_SAVE_FILE will default to
+# COOKIE_FILE if it is not set. With a non-interactive Lynx session (e.g.,
+# -dump), cookies will only be saved to file if COOKIE_SAVE_FILE is set.
+#
+#COOKIE_SAVE_FILE:~/.lynx_cookies
+
+.h1 Mail-related
+
+.h2 SYSTEM_MAIL
+.h2 SYSTEM_MAIL_FLAGS
+# VMS:
+# ===
+# The mail command and qualifiers are defined in userdefs.h. Lynx
+# will spawn a subprocess to send replies and error messages. The
+# command, and qualifiers (if any), can be re-defined here. If
+# you use PMDF then headers will we passed via a header file.
+# If you use "generic" VMS MAIL, the subject will be passed on the
+# command line via a /subject="SUBJECT" qualifier, and inclusion
+# of other relevant headers may not be possible.
+# If your mailer uses another syntax, some hacking of the mailform()
+# mailmsg() and reply_by_mail() functions in LYMail.c, and send_file_to_mail()
+# function in LYPrint.c, may be required.
+#
+.ex 2
+#SYSTEM_MAIL:PMDF SEND
+#SYSTEM_MAIL_FLAGS:/headers
+#
+.ex 2
+#SYSTEM_MAIL:MAIL
+#SYSTEM_MAIL_FLAGS:
+#
+# Unix:
+#======
+# The mail path and flags normally are defined for sendmail (or submit
+# with MMDF) in userdefs.h. You can change them here, but should first
+# read the zillions of CERT advisories about security problems with Unix
+# mailers.
+#
+.ex 2
+#SYSTEM_MAIL:/usr/mmdf/bin/submit
+#SYSTEM_MAIL_FLAGS:-mlruxto,cc\*
+#
+.ex 2
+#SYSTEM_MAIL:/usr/sbin/sendmail
+#SYSTEM_MAIL_FLAGS:-t -oi
+#
+.ex 2
+#SYSTEM_MAIL:/usr/lib/sendmail
+#SYSTEM_MAIL_FLAGS:-t -oi
+#
+# Win32:
+#=======
+# The Win32 port assumes that the mailer cannot read via a pipe. That is, it
+# must read all information from files. The "sendmail" utility in the 2.8.1
+# release is able to work with that assumption. There is no way to tell the
+# Win32 port of Lynx to send its information to the sendmail utility via a
+# pipe.
+#
+# Please read sendmail.txt in the LYNX_W32.ZIP distribution
+.url https://invisible-island.net/archives/lynx/tarballs/lynx2.8.1_w32.zip
+.url https://invisible-mirror.net/archives/lynx/tarballs/lynx2.8.1_w32.zip
+#
+# As an alternative, the newer "sendmail for windows" may be useful:
+.url http://glob.com.au/sendmail/
+#
+# See also BLAT_MAIL and ALT_BLAT_MAIL flags.
+#
+#SYSTEM_MAIL:sendmail -f me@my.host -h my.host -r my.smtp.mailer -m SMTP
+
+.h2 MAIL_ADRS
+# VMS ONLY:
+# ========
+# MAIL_ADRS is defined in userdefs.h and normally is structured for PMDF's
+# IN%"INTERNET_ADDRESS" scheme. The %s is replaced with the address given
+# by the user. If you are using a different Internet mail transport, change
+# the IN appropriately (e.g., to SMTP, MX, or WINS).
+#
+#MAIL_ADRS:"IN%%""%s"""
+
+.h2 USE_FIXED_RECORDS
+# VMS ONLY:
+# ========
+# If USE_FIXED_RECORDS is set to TRUE here or in userdefs.h, Lynx will
+# convert 'd'ownloaded binary files to FIXED 512 record format before saving
+# them to disk or acting on a DOWNLOADER option. If set to FALSE, the
+# headers of such files will indicate that they are Stream_LF with Implied
+# Carriage Control, which is incorrect, and can cause downloading software
+# to get confused and unhappy. If you do set it FALSE, you can use the
+# FIXED512.COM command file, which is included in this distribution, to do
+# the conversion externally.
+#
+#USE_FIXED_RECORDS:TRUE
+
+.h1 Keyboard Input
+# These settings control the way Lynx interprets user input.
+
+.h2 VI_KEYS_ALWAYS_ON
+.h2 EMACS_KEYS_ALWAYS_ON
+# Vi or Emacs movement keys, i.e. familiar hjkl or ^N^P^F^B .
+# These are defaults, which can be changed in the Options Menu or .lynxrc .
+#VI_KEYS_ALWAYS_ON:FALSE
+#EMACS_KEYS_ALWAYS_ON:FALSE
+
+.h2 DEFAULT_KEYPAD_MODE
+# DEFAULT_KEYPAD_MODE may be set to NUMBERS_AS_ARROWS
+# or LINKS_ARE_NOT_NUMBERED (the same)
+# or LINKS_ARE_NUMBERED
+# or LINKS_AND_FIELDS_ARE_NUMBERED
+# or FIELDS_ARE_NUMBERED
+# to specify whether numbers (e.g. [10]) appear next to all links,
+# allowing immediate access by entering the number on the keyboard,
+# or numbers on the numeric key-pad work like arrows;
+# the "FIELDS" options cause form fields also to be numbered.
+# This may be overridden by the keypad_mode setting in .lynxrc,
+# and can also be changed via the Options Menu.
+#
+#DEFAULT_KEYPAD_MODE:NUMBERS_AS_ARROWS
+
+.h2 NUMBER_LINKS_ON_LEFT
+.h2 NUMBER_FIELDS_ON_LEFT
+# Denotes the position for link- and field-numbers (whether it is on the left
+# or right of the anchor). These are subject to DEFAULT_KEYPAD_MODE, which
+# determines whether numbers are shown.
+#NUMBER_LINKS_ON_LEFT:TRUE
+#NUMBER_FIELDS_ON_LEFT:TRUE
+
+.h2 DEFAULT_KEYPAD_MODE_IS_NUMBERS_AS_ARROWS
+# Obsolete form of DEFAULT_KEYPAD_MODE,
+# numbers work like arrows or numbered links.
+# Set to TRUE, indicates numbers act as arrows,
+# and set to FALSE indicates numbers refer to numbered links on the page.
+# LINKS_AND_FIELDS_ARE_NUMBERED cannot be set by this option because
+# it allows only two values (true and false).
+#
+#DEFAULT_KEYPAD_MODE_IS_NUMBERS_AS_ARROWS:TRUE
+
+.h2 CASE_SENSITIVE_ALWAYS_ON
+# The default search type.
+# This is a default that can be overridden by the user!
+#
+#CASE_SENSITIVE_ALWAYS_ON:FALSE
+
+.h1 Auxiliary Facilities
+
+.h2 DEFAULT_BOOKMARK_FILE
+# DEFAULT_BOOKMARK_FILE is the filename used for storing personal bookmarks.
+# It will be prepended by the user's home directory.
+# NOTE that a file ending in .html or other suffix mapped to text/html
+# should be used to ensure its treatment as HTML. The built-in default
+# is lynx_bookmarks.html. On both Unix and VMS, if a subdirectory off of
+# the HOME directory is desired, the path should begin with "./" (e.g.,
+# ./BM/lynx_bookmarks.html), but the subdirectory must already exist.
+# Lynx will create the bookmark file, if it does not already exist, on
+# the first ADD_BOOKMARK attempt if the HOME directory is indicated
+# (i.e., if the definition is just filename.html without any slashes),
+# but requires a pre-existing subdirectory to create the file there.
+# The user can re-define the default bookmark file, as well as a set
+# of sub-bookmark files if multiple bookmark file support is enabled
+# (see below), via the 'o'ptions menu, and can save those definitions
+# in the .lynxrc file.
+#
+#DEFAULT_BOOKMARK_FILE:lynx_bookmarks.html
+
+.h2 MULTI_BOOKMARK_SUPPORT
+# If MULTI_BOOKMARK_SUPPORT is set TRUE, and BLOCK_MULTI_BOOKMARKS (see
+# below) is FALSE, and sub-bookmarks exist, all bookmark operations will
+# first prompt the user to select an active sub-bookmark file or the
+# default bookmark file. FALSE is the default so that one (the default)
+# bookmark file will be available initially. The definition here will
+# override that in userdefs.h. The user can turn on multiple bookmark
+# support via the 'o'ptions menu, and can save that choice as the startup
+# default via the .lynxrc file. When on, the setting can be STANDARD or
+# ADVANCED. If SUPPORT is set to the latter, and the user mode also is
+# ADVANCED, the VIEW_BOOKMARK command will invoke a statusline prompt at
+# which the user can enter the letter token (A - Z) of the desired bookmark,
+# or '=' to get a menu of available bookmark files. The menu always is
+# presented in NOVICE or INTERMEDIATE mode, or if the SUPPORT is set to
+# STANDARD. No prompting or menu display occurs if only one (the startup
+# default) bookmark file has been defined (define additional ones via the
+# 'o'ptions menu). The startup default, however set, can be overridden on
+# the command line via the -restrictions=multibook or the -anonymous or
+# -validate switches.
+#
+#MULTI_BOOKMARK_SUPPORT:FALSE
+
+.h2 BLOCK_MULTI_BOOKMARKS
+# If BLOCK_MULTI_BOOKMARKS is set TRUE, multiple bookmark support will
+# be forced off, and cannot to toggled on via the 'o'ptions menu. The
+# compilation setting is normally FALSE, and can be overridden here.
+# It can also be set via the -restrictions=multibook or the -anonymous
+# or -validate command line switches.
+#
+#BLOCK_MULTI_BOOKMARKS:FALSE
+
+.h1 Interaction
+
+.h2 DEFAULT_USER_MODE
+# DEFAULT_USER_MODE sets the default user mode for Lynx users.
+# NOVICE shows a three line help message at the bottom of the screen.
+# INTERMEDIATE shows normal amount of help (one line).
+# ADVANCED help is replaced by the URL of the current link.
+#
+#DEFAULT_USER_MODE:NOVICE
+
+.h1 External Programs
+
+.h2 DEFAULT_EDITOR
+# If DEFAULT_EDITOR is defined, users may edit local documents with it
+# & it will also be used for sending mail messages.
+# If no editor is defined here or by the user,
+# the user will not be able to edit local documents
+# and a primitive line-oriented mail-input mode will be used.
+#
+# For sysadmins: do not define a default editor
+# unless you know EVERY user will know how to use it;
+# users can easily define their own editor in the Options Menu.
+#
+#DEFAULT_EDITOR:
+
+.h2 SYSTEM_EDITOR
+# SYSTEM_EDITOR behaves the same as DEFAULT_EDITOR,
+# except that it can't be changed by users.
+#
+#SYSTEM_EDITOR:
+
+.h3 POSITIONABLE_EDITOR
+# If POSITIONABLE_EDITOR is defined once or multiple times and if the same
+# editor is used as editor in lynx, lynx will use its features, i.e., adding an
+# option to set the initial line-position, when editing files and textarea.
+# The commented editors below are already known; there is no need to uncomment
+# them.
+#
+#POSITIONABLE_EDITOR:emacs
+#POSITIONABLE_EDITOR:jed
+#POSITIONABLE_EDITOR:jmacs
+#POSITIONABLE_EDITOR:joe
+#POSITIONABLE_EDITOR:jove
+#POSITIONABLE_EDITOR:jpico
+#POSITIONABLE_EDITOR:jstar
+#POSITIONABLE_EDITOR:nano
+#POSITIONABLE_EDITOR:pico
+#POSITIONABLE_EDITOR:rjoe
+#POSITIONABLE_EDITOR:vi
+
+.h1 Proxy
+
+.h2 HTTP_PROXY
+.h2 HTTPS_PROXY
+.h2 FTP_PROXY
+.h2 GOPHER_PROXY
+.h2 NEWSPOST_PROXY
+.h2 NEWSREPLY_PROXY
+.h2 NEWS_PROXY
+.h2 NNTP_PROXY
+.h2 SNEWSPOST_PROXY
+.h2 SNEWSREPLY_PROXY
+.h2 SNEWS_PROXY
+.h2 WAIS_PROXY
+.h2 FINGER_PROXY
+.h2 CSO_PROXY
+# Lynx version 2.2 and beyond supports the use of proxy servers that can act as
+# firewall gateways and caching servers. They are preferable to the older
+# gateway servers. Each protocol used by Lynx can be mapped separately using
+# PROTOCOL_proxy environment variables (see Lynx Users Guide). If you have not set
+# them externally, you can set them at run time via this configuration file.
+# They will not override external settings. The no_proxy variable can be used
+# to inhibit proxying to selected regions of the Web (see below). Note that on
+# VMS these proxy variables are set as process logicals rather than symbols, to
+# preserve lowercasing, and will outlive the Lynx image.
+#
+.ex 15
+#http_proxy:http://some.server.dom:port/
+#https_proxy:http://some.server.dom:port/
+#ftp_proxy:http://some.server.dom:port/
+#gopher_proxy:http://some.server.dom:port/
+#news_proxy:http://some.server.dom:port/
+#newspost_proxy:http://some.server.dom:port/
+#newsreply_proxy:http://some.server.dom:port/
+#snews_proxy:http://some.server.dom:port/
+#snewspost_proxy:http://some.server.dom:port/
+#snewsreply_proxy:http://some.server.dom:port/
+#nntp_proxy:http://some.server.dom:port/
+#wais_proxy:http://some.server.dom:port/
+#finger_proxy:http://some.server.dom:port/
+#cso_proxy:http://some.server.dom:port/
+#no_proxy:host.domain.dom
+
+.h2 NO_PROXY
+# The no_proxy variable can be a comma-separated list of strings defining
+# no-proxy zones in the DNS domain name space. If a tail substring of the
+# domain-path for a host matches one of these strings, transactions with that
+# node will not be proxied.
+.ex
+#no_proxy:domain.path1,path2
+#
+# A single asterisk as an entry will override all proxy variables and no
+# transactions will be proxied.
+.ex
+#no_proxy:*
+# This is the only allowed use of * in no_proxy.
+#
+# Warning: Note that setting 'il' as an entry in this list will block proxying
+# for the .mil domain as well as the .il domain. If the entry is '.il' this
+# will not happen.
+
+.h1 External Programs
+
+.h2 PRINTER
+.h2 DOWNLOADER
+.h2 UPLOADER
+# PRINTER, DOWNLOADER & UPLOADER DEFINITIONS:
+# Lynx has 4 pre-defined print options & 1 pre-defined download option,
+# which are called up on-screen when `p' or `d' are entered;
+# any number of options can be added by the user, as explained below.
+# Uploaders can be defined only for UNIX with DIRED_SUPPORT:
+# see the Makefile in the top directory & the header of src/LYUpload.c .
+#
+# For `p' pre-defined options are: `Save to local file', `E-mail the file',
+# `Print to screen' and `Print to local printer attached to vt100'.
+# `Print to screen' allows file transfers in the absence of alternatives
+# and is often the only option allowed here for anonymous users;
+# the 3rd & 4th options are not pre-defined for DOS/WINDOWS versions of Lynx.
+# For `d' the pre-defined option is: `Download to local file'.
+#
+# To define your own print or download option use the following formats:
+#
+# PRINTER:<name>:<command>:<option>:<lines/page>[:<environment>]
+#
+# DOWNLOADER:<name>:<command>:<option>[:<environment>]
+#
+# <name> is what you will see on the print/download screen.
+#
+# <command> is the command your system will execute:
+# the 1st %s in the command will be replaced
+# by the temporary filename used by Lynx;
+# a 2nd %s will be replaced by a filename of your choice,
+# for which Lynx will prompt, offering a suggestion.
+# On Unix, which has pipes, you may use a '|' as the first
+# character of the command, and Lynx will open a pipe to
+# the command.
+# If the command format of your printer/downloader requires
+# a different layout, you will need to use a script
+# (see the last 2 download examples below).
+#
+# <option> TRUE : the printer/downloader will always be ENABLED,
+# except that downloading is disabled when -validate is used;
+# FALSE : both will be DISABLED for anonymous users
+# and printing will be disabled when -noprint is used.
+#
+# <lines/page> (printers: optional) the number of lines/page (default 66):
+# used to compute the approximate output size
+# and prompt if the document is > 4 printer pages;
+# it uses current screen length for the computation
+# when `Print to screen' is selected.
+#
+# [:<environment>]
+# optional, if XWINDOWS then printer/downloader will be
+# enabled if DISPLAY environment variable IS defined and
+# disabled otherwise, if environment is NON_XWINDOWS
+# then printer/downloader will be enabled if DISPLAY
+# environment variable IS NOT defined and disabled otherwise,
+# for anything else or if environment is not specified
+# printer/downloader is always enabled.
+#
+# You must put the whole definition on one line;
+# if you use a colon, precede it with a backslash.
+#
+# `Printer' can be any file-handling program you find useful,
+# even if it does not physically print anything.
+#
+# Usually, down/up-loading involves the use of (e.g.) Ckermit or ZModem
+# to transfer files to a user's local machine over a serial link,
+# but download options do not have to be download-protocol programs.
+#
+# Printer examples:
+.ex 3
+#PRINTER:Computer Center printer:lpr -Pccprt %s:FALSE
+#PRINTER:Office printer:lpr -POffprt %s:TRUE
+#PRINTER:VMS printer:print /queue=cc$print %s:FALSE:58
+# If you have a very busy VMS print queue
+# and Lynx deletes the temporary files before they have been queued,
+# use the VMSPrint.com included in the distribution:
+.ex
+#PRINTER:Busy VMS printer:@Lynx_Dir\:VMSPrint sys$print %s:FALSE:58
+# To specify a print option at run-time:
+# NBB if you have ANONYMOUS users, DO NOT allow this option!
+.ex
+#PRINTER:Specify at run-time:echo -n "Enter a print command\: "; read word; sh -c "$word %s":FALSE
+# To pass to a sophisticated file viewer: -k suppresses invocation
+# of hex display mode if 8-bit or control characters are present;
+# +s invokes secure mode (see ftp://space.mit.edu/pub/davis/most):
+.ex
+#PRINTER:Use Most to view:most -k +s %s:TRUE:23
+#
+# Downloader examples:
+# in Kermit, -s %s is the filename sent, -a %s the filename on arrival
+# (if they are given in reverse order here, the command will fail):
+.ex
+#DOWNLOADER:Use Kermit to download to the terminal:kermit -i -s %s -a %s:TRUE
+# NB don't use -k with Most, so that binaries will invoke hexadecimal mode:
+.ex
+#DOWNLOADER:Use Most to view:most +s %s:TRUE
+# The following example gives wrong filenames
+# (`sz' doesn't support a suggested filename parameter):
+.ex
+#DOWNLOADER:Use Zmodem to download to the local terminal:sz %s:TRUE
+# The following example returns correct filenames
+# by using a script to make a subdirectory in /tmp,
+# but may conflict with very strong security or permissions restrictions:
+.ex
+#DOWNLOADER:Use Zmodem to download to the local terminal:set %s %s;td=/tmp/Lsz$$;mkdir $td;ln -s $1 $td/"$2";sz $td/"$2";rm -r $td:TRUE
+.ex 2
+#UPLOADER:Use Kermit to upload from your computer: kermit -i -r -a %s:TRUE
+#UPLOADER:Use Zmodem to upload from your computer: rz %s:TRUE
+#
+# Note for OS/390: /* S/390 -- gil -- 1464 */
+# The following is strongly recommended to undo ASCII->EBCDIC conversion.
+.ex
+#DOWNLOADER:Save OS/390 binary file: iconv -f IBM-1047 -t ISO8859-1 %s >%s:FALSE
+
+.h1 Interaction
+
+.h2 NO_DOT_FILES
+# If NO_DOT_FILES is TRUE (normal default via userdefs.h), the user will not
+# be allowed to specify files beginning with a dot in reply to output filename
+# prompts, and files beginning with a dot (e.g., file://localhost/path/.lynxrc)
+# will not be included in the directory browser's listings. If set FALSE, you
+# can force it to be treated as TRUE via -restrictions=dotfiles. If set FALSE
+# and not forced TRUE, the user can regulate it via the 'o'ptions menu (and
+# may save the preference in the RC file).
+#
+#NO_DOT_FILES:TRUE
+
+.h1 Internal Behavior
+
+.h2 NO_FROM_HEADER
+# If NO_FROM_HEADER is set FALSE, From headers will be sent in transmissions
+# to http or https servers if the personal_mail_address has been defined via
+# the 'o'ptions menu. The compilation default is TRUE (no From header is
+# sent) and the default can be changed here. The default can be toggled at
+# run time via the -from switch. Note that transmissions of From headers
+# have become widely considered to create an invasion of privacy risk.
+#
+#NO_FROM_HEADER:TRUE
+
+.h2 NO_REFERER_HEADER
+# If NO_REFERER_HEADER is TRUE, Referer headers never will be sent in
+# transmissions to servers. Lynx normally sends the URL of the document
+# from which the link was derived, but not for startfile URLs, 'g'oto
+# URLs, 'j'ump shortcuts, bookmark file links, history list links, or
+# URLs that include the content from form submissions with method GET.
+# If left FALSE here, it can be set TRUE at run time via the -noreferer
+# switch.
+#
+#NO_REFERER_HEADER:FALSE
+
+.h1 Internal Behavior
+
+.h2 NO_FILE_REFERER
+# If NO_FILE_REFERER is TRUE, Referer headers never will be sent in
+# transmissions to servers for links or actions derived from documents
+# or forms with file URLs. This ensures that paths associated with
+# the local file system are never indicated to servers, even if
+# NO_REFERER_HEADER is FALSE. If set to FALSE here, it can still be
+# set TRUE at run time via the -nofilereferer switch.
+#
+#NO_FILE_REFERER:TRUE
+
+.h2 REFERER_WITH_QUERY
+# REFERER_WITH_QUERY controls what happens when the URL in a Referer
+# header to be sent would contain a query part in the form of a '?'
+# character followed by one or more attribute=value pairs. Query parts
+# often contain sensitive or personal information resulting from filling
+# out forms, or other info that allows tracking of a user's browsing path
+# through a site, an thus should not be put in a Referer header (which may
+# get sent to an unrelated third-party site). On the other hand, some
+# sites (improperly) rely on browsers sending Referer headers, even when
+# the user is coming from a page whose URL has a query part.
+#
+# If REFERER_WITH_QUERY is SEND, full Referer headers will be sent
+# including the query part (unless sending of Referer is disabled in
+# general, see NO_REFERER_HEADER above). If REFERER_WITH_QUERY is
+# PARTIAL, the Referer header will contain a partial URL, with the query
+# part stripped off. This is not strictly correct, but should satisfy
+# those sites that check only whether the user arrived at a page from an
+# "outside" link. If REFERER_WITH_QUERY is set to DROP (or anything else
+# unrecognized), the default, no Referer header is sent at all in this
+# situation.
+#
+#REFERER_WITH_QUERY:DROP
+
+.h1 Appearance
+
+.h2 VERBOSE_IMAGES
+# VERBOSE_IMAGES controls whether Lynx replaces [LINK], [INLINE] and [IMAGE]
+# (for images without ALT) with filenames of these images.
+# This can be useful in determining what images are important
+# and which are mere decorations, e.g. button.gif, line.gif,
+# provided the author uses meaningful names.
+#
+# The definition here will override the setting in userdefs.h.
+#
+#VERBOSE_IMAGES:TRUE
+
+.h2 MAKE_LINKS_FOR_ALL_IMAGES
+# If MAKE_LINKS_FOR_ALL_IMAGES is TRUE, all images will be given links
+# which can be ACTIVATEd. For inlines, the ALT or pseudo-ALT ("[INLINE]")
+# strings will be links for the resolved SRC rather than just text.
+# For ISMAP or other graphic links, ALT or pseudo-ALT ("[ISMAP]" or "[LINK]")
+# will have '-' and a link labeled "[IMAGE]" for the resolved SRC appended.
+# See also VERBOSE_IMAGES flag.
+#
+# The definition here will override that in userdefs.h
+# and can be toggled via an "-image_links" command-line switch.
+# The user can also use the LYK_IMAGE_TOGGLE key (default `*')
+# or `Show Images' in the Form-based Options Menu.
+#
+#MAKE_LINKS_FOR_ALL_IMAGES:FALSE
+
+.h2 MAKE_PSEUDO_ALTS_FOR_INLINES
+# If MAKE_PSEUDO_ALTS_FOR_INLINES is FALSE, inline images which don't specify
+# an ALT string will not have "[INLINE]" inserted as a pseudo-ALT,
+# i.e. they'll be treated as having ALT="".
+# Otherwise (if TRUE), pseudo-ALTs will be created for inlines,
+# so that they can be used as links to the SRCs.
+# See also VERBOSE_IMAGES flag.
+#
+# The definition here will override that in userdefs.h
+# and can be toggled via a "-pseudo_inlines" command-line switch.
+# The user can also use the LYK_INLINE_TOGGLE key (default `[')
+# or `Show Images' in the Form-based Options Menu.
+#
+#MAKE_PSEUDO_ALTS_FOR_INLINES:TRUE
+
+.h2 SUBSTITUTE_UNDERSCORES
+# If SUBSTITUTE_UNDERSCORES is TRUE, the _underline_ format will be used
+# for emphasis tags in dumps.
+#
+# The default defined here will override that in userdefs.h, and the user
+# can toggle the default via a "-underscore" command line switch.
+#
+#SUBSTITUTE_UNDERSCORES:FALSE
+
+.h1 Interaction
+
+.h2 QUIT_DEFAULT_YES
+# If QUIT_DEFAULT_YES is TRUE then when the QUIT command is entered, any
+# response other than n or N will confirm. It should be FALSE if you
+# prefer the more conservative action of requiring an explicit Y or y to
+# confirm. The default defined here will override that in userdefs.h.
+#
+#QUIT_DEFAULT_YES:TRUE
+
+.h1 HTML Parsing
+
+.h2 HISTORICAL_COMMENTS
+# If HISTORICAL_COMMENTS is TRUE, Lynx will revert to the "Historical"
+# behavior of treating any '>' as a terminator for comments, instead of
+# seeking a valid '-->' terminator (note that white space can be present
+# between the '--' and '>' in valid terminators). The compilation default
+# is FALSE.
+#
+# The compilation default, or default defined here, can be toggled via a
+# "-historical" command line switch, and via the LYK_HISTORICAL command key.
+#
+#HISTORICAL_COMMENTS:FALSE
+
+.h2 MINIMAL_COMMENTS
+# If MINIMAL_COMMENTS is TRUE, Lynx will not use Valid comment parsing
+# of '--' pairs as serial comments within an overall comment element,
+# and instead will seek only a '-->' terminator for the overall comment
+# element. This emulates the Netscape v2.0 comment parsing bug, and
+# will help Lynx cope with the use of dashes as "decorations", which
+# consequently has become common in so-called "Enhanced for Netscape"
+# pages. Note that setting Historical comments on will override the
+# Minimal or Valid setting.
+#
+# The compilation default for MINIMAL_COMMENTS is FALSE, but we'll
+# set it TRUE here, until Netscape gets its comment parsing right,
+# and "decorative" dashes cease to be so common.
+#
+# The compilation default, or default defined here, can be toggled via a
+# "-minimal" command line switch, and via the LYK_MINIMAL command key.
+#
+MINIMAL_COMMENTS:TRUE
+
+.h2 SOFT_DQUOTES
+# If SOFT_DQUOTES is TRUE, Lynx will emulate the invalid behavior of
+# treating '>' as a co-terminator of a double-quoted attribute value
+# and the tag which contains it, as was done in old versions of Netscape
+# and Mosaic. The compilation default is FALSE.
+#
+# The compilation default, or default defined here, can be toggled via
+# a "-soft_dquotes" command line switch.
+#
+#SOFT_DQUOTES:FALSE
+
+.h2 STRIP_DOTDOT_URLS
+# If STRIP_DOTDOT_URLS is TRUE, Lynx emulates the invalid behavior of many
+# browsers to strip a leading "../" segment from relative URLs in HTML
+# documents with a http or https base URL, if this would otherwise lead to
+# an absolute URLs with those characters still in it. Such URLs are normally
+# erroneous and not what is intended by page authors. Lynx will issue
+# a warning message when this occurs.
+#
+# If STRIP_DOTDOT_URLS is FALSE, Lynx will use those URLs for requests
+# without taking any special actions or issuing Warnings, in most cases
+# this will result in an error response from the server.
+#
+# Note that Lynx never tries to fix similar URLs for protocols other than
+# http and https, since they are less common and may actually be valid in
+# some cases.
+#
+#STRIP_DOTDOT_URLS:TRUE
+
+.h1 Appearance
+
+.h2 ENABLE_SCROLLBACK
+# If ENABLE_SCROLLBACK is TRUE, Lynx will clear the entire screen before
+# displaying each new screenful of text. Though less efficient for normal
+# use, this allows programs that maintain a buffer of previously-displayed
+# text to recognize the continuity of what has been displayed, so that
+# previous screenfuls can be reviewed by whatever method the program uses
+# to scroll back through previous text. For example, the PC comm program
+# QModem has a key that can be pressed to scroll back; if ENABLE_SCROLLBACK
+# is TRUE, pressing the scrollback key will access previous screenfuls which
+# will have been stored on the local PC and will therefore be displayed
+# instantaneously, instead of needing to be retransmitted by Lynx at the
+# speed of the comm connection (but Lynx will not know about the change,
+# so you must restore the last screen before resuming with Lynx commands).
+#
+# The default compilation or configuration setting can be toggled via an
+# "-enable_scrollback" command line switch.
+#
+#ENABLE_SCROLLBACK:FALSE
+
+.h2 SCAN_FOR_BURIED_NEWS_REFS
+# If SCAN_FOR_BURIED_NEWS_REFS is set to TRUE, Lynx will scan the bodies
+# of news articles for buried article and URL references and convert them
+# to links. The compilation default is TRUE, but some email addresses
+# enclosed in angle brackets ("<user@address>") might be converted to false
+# news links, and uuencoded messages might be corrupted. The conversion is
+# not done when the display is toggled to source or when 'd'ownloading, so
+# uuencoded articles can be saved intact regardless of these settings.
+#
+# The default setting can be toggled via a "-buried_news" command line
+# switch.
+#
+#SCAN_FOR_BURIED_NEWS_REFS:TRUE
+
+.h2 PREPEND_BASE_TO_SOURCE
+# If PREPEND_BASE_TO_SOURCE is set to FALSE, Lynx will not prepend a
+# Request URL comment and BASE element to text/html source files when
+# they are retrieved for 'd'ownloading or passed to 'p'rint functions.
+# The compilation default is TRUE. Note that this prepending is not
+# done for -source dumps, unless the -base switch also was included on
+# the command line, and the latter switch overrides the setting of the
+# PREPEND_BASE_TO_SOURCE configuration variable.
+#
+#PREPEND_BASE_TO_SOURCE:TRUE
+
+.h1 External Programs
+# MIME types and viewers!
+#
+# file extensions may be assigned to MIME types using
+# the SUFFIX: definition.
+#
+# NOTE: It is normally preferable to define new extension mappings in
+# EXTENSION_MAP files (see below) instead of here: Definitions
+# here are overridden by those in EXTENSION_MAP files and even by
+# some built-in defaults in src/HTInit.c. On the other hand,
+# definitions here allow some more fields that are not possible
+# in those files.
+#
+# Extension mappings have an effect mostly for ftp and local files,
+# they are NOT used to determine the type of content for URLs with
+# the http protocol. This is because HTTP servers already specify
+# the MIME type in the Content-Type header. [It may still be
+# necessary to set up an appropriate suffix for some MIME types,
+# even if they are accessed only via the HTTP protocol, if the viewer
+# (see below) for those MIME types requires a certain suffix for the
+# temporary file passed to it.]
+
+.h2 GLOBAL_EXTENSION_MAP
+.h2 PERSONAL_EXTENSION_MAP
+# The global and personal EXTENSION_MAP files allow you to assign extensions
+# to MIME types which will override any of the suffix maps in this (lynx.cfg)
+# configuration file, or in src/HTInit.c. See the example mime.types file
+# in the samples subdirectory.
+#
+# Unix:
+# ====
+#GLOBAL_EXTENSION_MAP:/usr/local/lib/mosaic/mime.types
+# VMS:
+# ===
+#GLOBAL_EXTENSION_MAP:Lynx_Dir:mime.types
+#
+# Unix (sought in user's home directory):
+#PERSONAL_EXTENSION_MAP:.mime.types
+# VMS (sought in user's sys$login directory):
+#PERSONAL_EXTENSION_MAP:mime.types
+
+.h2 SUFFIX_ORDER
+# With SUFFIX_ORDER the precedence of suffix mappings can be changed.
+# Two kinds of settings are recognized:
+#
+# PRECEDENCE_OTHER or PRECEDENCE_HERE
+# Suffix mappings can come from four sources: (1) SUFFIX rules
+# given here - see below, (2) built-in defaults (HTInit.c), and the
+# (3) GLOBAL_EXTENSION_MAP and (4) PERSONAL_EXTENSION_MAP files.
+# The order of precedence is normally as listed: (1) has the
+# *lowest*, (4) has the *highest* precedence if there are conflicts.
+# In other words, SUFFIX mappings here are overridden by conflicting
+# ones elsewhere. This default ordering is called PRECEDENCE_OTHER.
+# With PRECEDENCE_HERE, the order becomes (2) (3) (4) (1), i.e.
+# mappings here override others made elsewhere.
+#
+# NO_BUILTIN
+# This disables all built-in default rules. In other words, (2) in the
+# list above is skipped. Some recognition for compressed files (".gz",
+# ".Z") is still hardwired. A mapping for some basic types, at least
+# for text/html is probably necessary to get a usable configuration,
+# it can be given in a SUFFIX rule below or an extension map file.
+# Both kinds of settings can be combined, separated by comma as in
+# SUFFIX_ORDER:PRECEDENCE_HERE,NO_BUILTIN
+# Note: Using PRECEDENCE_HERE has only an effect on SUFFIX rules that follow.
+# Moreover, if GLOBAL_EXTENSION_MAP or PERSONAL_EXTENSION_MAP directives
+# are used, they should come *before* a SUFFIX_ORDER:PRECEDENCE_HERE.
+#
+#SUFFIX_ORDER:PRECEDENCE_OTHER
+
+.h2 SUFFIX
+# The SUFFIX definition takes the form of:
+#
+# SUFFIX:<file extension>:<mime type>:<encoding>:<quality>:<description>
+#
+# All fields after <mime type> are optional (including the separators
+# if no more fields follow).
+#
+# <file extension> trailing end of file name. This need not strictly
+# be a file extension as understood by the OS, a dot
+# has to be given explicitly if it is indented, for
+# some uses one could even match full filenames here.
+# In addition, two forms are special: "*.*" and "*"
+# refer to the defaults for otherwise unmatched files
+# (the first for filenames with a dot somewhere in
+# the name, the second without), these are currently
+# mapped to text/plain in the (HTInit.c) built-in code.
+# Lynx compares the file-extensions ignoring case.
+#
+# <mime type> a MIME content type. It can also contain a charset
+# parameter, see example below. This should be given in
+# all lowercase, use <description> for more fancy labels.
+# It can be left empty if an HTTP style encoding is given.
+#
+# Fields in addition to the usual ones are
+#
+# <encoding> either a mail style trivial encoding (7bit, 8bit, binary)
+# which could be used on some systems to determine how to
+# open local files (currently it isn't), and is used to
+# determine transfer mode for some FTP URLs; or a HTTP style
+# content encoding (gzip (equivalent to x-gzip), compress)
+#
+# <quality> a floating point quality factor, usually between 0.0 and 1.0
+# currently unused in most situations.
+#
+# <description> text that can appear in FTP directory listings, and in
+# local directory listings (see LIST_FORMAT, code %t)
+#
+# For instance the following definition maps the
+# extension ".gif" to the mime type "image/gif"
+.ex
+# SUFFIX:.gif:image/gif
+#
+# The following can be used if you have a convention to label
+# HTML files in some character set that differs from your local
+# default (see also ASSUME_LOCAL_CHARSET) with a different
+# extension, here ".html-u8". It also demonstrates use of the
+# description field, note extra separators for omitted fields:
+.ex
+# SUFFIX:.html-u8:text/html;charset=utf-8:::UTF-8 HTML
+#
+# The following shows how a suffix can indicate a combination
+# of MIME type and compression method. (The ending ".ps.gz" should
+# already be recognized by default; the form below could be used on
+# systems that don't allow more than one dot in filenames.)
+.ex
+# SUFFIX:.ps_gz:application/postscript:gzip::gzip'd Postscript
+#
+# The following is meant to match a full filename (but can match
+# any file ending in "core", so be careful):
+.ex
+# SUFFIX:core:application/x-core-file
+#
+# file suffixes are case INsensitive!
+#
+# The suffix definitions listed here in the default lynx.cfg file are
+# similar to those normally established via src/HTInit.c. You can change
+# the defaults by editing that file or disable them, or via the global or
+# personal mime.types files at run time (except for the additional fields).
+# Assignments made here are overridden by entries in those files
+# unless preceded with a SUFFIX_ORDER:PRECEDENCE_HERE.
+#
+.ex 29
+#SUFFIX:.ps:application/postscript
+#SUFFIX:.eps:application/postscript
+#SUFFIX:.ai:application/postscript
+#SUFFIX:.rtf:application/rtf
+#SUFFIX:.snd:audio/basic
+#SUFFIX:.gif:image/gif
+#SUFFIX:.rgb:image/x-rgb
+#SUFFIX:.png:image/png
+#SUFFIX:.xbm:image/x-xbitmap
+#SUFFIX:.tiff:image/tiff
+#SUFFIX:.jpg:image/jpeg
+#SUFFIX:.jpeg:image/jpeg
+#SUFFIX:.mpg:video/mpeg
+#SUFFIX:.mpeg:video/mpeg
+#SUFFIX:.mov:video/quicktime
+#SUFFIX:.hqx:application/mac-binhex40
+#SUFFIX:.bin:application/octet-stream
+#SUFFIX:.exe:application/octet-stream
+#SUFFIX:.tar:application/x-tar
+#SUFFIX:.tgz:application/x-tar:gzip
+#SUFFIX:.Z::compress
+#SUFFIX:.gz::gzip
+#SUFFIX:.bz2:application/x-bzip2
+#SUFFIX:.zip:application/zip
+#SUFFIX:.lzh:application/x-lzh
+#SUFFIX:.lha:application/x-lha
+#SUFFIX:.dms:application/x-dms
+#SUFFIX:.html:text/html
+#SUFFIX:.txt:text/plain
+
+.h2 XLOADIMAGE_COMMAND
+# VMS:
+# ====
+# XLOADIMAGE_COMMAND will be used as a default in src/HTInit.c
+# for viewing image content types when the DECW$DISPLAY logical
+# is set. Make it the foreign command for your system's X image
+# viewer (commonly, "xv"). It can be anything that will handle GIF,
+# TIFF and other popular image formats. Freeware ports of xv for
+# VMS were available in the ftp://ftp.wku.edu/vms/unsupported and
+# http://www.openvms.digital.com/cd/XV310A/ subdirectories. You
+# must also have a "%s" for the filename. The default is defined
+# in userdefs.h and can be overridden here, or via the global or
+# personal mailcap files (see below).
+#
+# Make this empty (but not commented out) if you don't have such a viewer or
+# want to disable the built-in default viewer mappings for image types.
+#
+#XLOADIMAGE_COMMAND:xv %s
+#
+# Unix:
+# =====
+# XLOADIMAGE_COMMAND will be used as a default in src/HTInit.c for
+# viewing image content types when the DISPLAY environment variable
+# is set. Make it the full path and name of the xli (also know as
+# xloadimage or xview) command, or other image viewer. It can be
+# anything that will handle GIF, TIFF and other popular image formats
+# (xli does). The freeware distribution of xli is available in the
+# ftp://ftp.x.org/contrib subdirectory. The shareware, xv, also is
+# suitable. You must also have a "%s" for the filename; "&" for
+# background is optional. The default is defined in userdefs.h and can be
+# overridden here, or via the global or personal mailcap files (see below).
+# Make this empty (but not commented out) if you don't have such a
+# viewer or don't want to disable the built-in default viewer
+# mappings for image types.
+# Note that open is used as the default for NeXT, instead of the
+# XLOADIMAGE_COMMAND definition.
+# If you use xli, you may want to add the -quiet flag.
+#
+#XLOADIMAGE_COMMAND:xli %s &
+
+.h2 VIEWER
+# MIME types may be assigned to external viewers using
+# the VIEWER definition.
+#
+# NOTE: if you do not define a viewer to a new MIME type
+# that you assigned above then it will be saved to
+# disk by default.
+# It is normally preferable to define new viewers in
+# MAILCAP files (see below) instead of here: Definitions
+# here are overridden by those in MAILCAP files and even
+# by some built-in defaults in src/HTInit.c.
+#
+# The VIEWER definition takes the form of:
+# VIEWER:<mime type>:<viewer command>[:<environment>]
+# where -mime type is the MIME content type of the file
+# -viewer command is a system command that can be
+# used to display the file where %s is replaced
+# within the command with the physical filename
+# (e.g., "ghostview %s" becomes "ghostview /tmp/temppsfile")
+# -environment is optional. The only valid keywords
+# are currently XWINDOWS and NON_XWINDOWS. If the XWINDOWS
+# environment is specified then the viewer will only be
+# defined when the user has the environment variable DISPLAY
+# (DECW$DISPLAY on VMS) defined. If the NON_XWINDOWS environment
+# is specified the specified viewer will only be defined when the
+# user DOES NOT have the environment variable DISPLAY defined.
+# examples:
+# VIEWER:image/gif:xli %s:XWINDOWS
+# VIEWER:image/gif:ascii-view %s:NON_XWINDOWS
+# VIEWER:application/start-elm:elm
+#
+# You must put the whole definition on one line.
+#
+# If you must use a colon in the viewer command, precede it with a backslash!
+#
+# The MIME_type:viewer:XWINDOWS definitions listed here in the lynx.cfg
+# file are among those established via src/HTInit.c. For the image types,
+# HTInit.c uses the XLOADIMAGE_COMMAND definition in userdefs.h or above
+# (open is used for NeXT). You can change any of these defaults via the
+# global or personal mailcap files. Assignments made here will be overridden
+# by entries in those files.
+#
+.ex 7
+#VIEWER:application/postscript:ghostview %s&:XWINDOWS
+#VIEWER:image/gif:xli %s&:XWINDOWS
+#VIEWER:image/x-xbm:xli %s&:XWINDOWS
+#VIEWER:image/png:xli %s&:XWINDOWS
+#VIEWER:image/tiff:xli %s&:XWINDOWS
+#VIEWER:image/jpeg:xli %s&:XWINDOWS
+#VIEWER:video/mpeg:mpeg_play %s &:XWINDOWS
+
+.h2 GLOBAL_MAILCAP
+.h2 PERSONAL_MAILCAP
+# The global and personal MAILCAP files allow you to specify external
+# viewers to be spawned when Lynx encounters different MIME types, which
+# will override any of the suffix maps in this (lynx.cfg) configuration
+# file, or in src/HTInit.c. See
+.url http://tools.ietf.org/html/rfc1524
+# and the example mailcap file in the samples subdirectory.
+#
+# Unix:
+# ====
+#GLOBAL_MAILCAP:/usr/local/lib/mosaic/mailcap
+# VMS:
+# ===
+#GLOBAL_MAILCAP:Lynx_Dir:mailcap
+#
+# Sought in user's home (Unix) or sys$login (VMS) directory.
+#PERSONAL_MAILCAP:.mailcap
+
+.h2 PREFERRED_MEDIA_TYPES
+# When doing a GET, lynx lists the MIME types which it knows how to present
+# (the "Accept:" string). Depending on your system configuration, the
+# mime.types or other data given by the GLOBAL_EXTENSION_MAP may include many
+# entries that lynx really does not handle. Use this option to select one
+# of the built-in subsets of the MIME types that lynx could list in the
+# Accept.
+#
+# Values for this option are keywords:
+# INTERNAL lynx's built-in types for internal conversions
+# CONFIGFILE adds lynx.cfg
+# USER adds PERSONAL_EXTENSION_MAP settings
+# SYSTEM adds GLOBAL_EXTENSION_MAP settings
+# ALL adds lynx's built-in types for external conversions
+#
+#PREFERRED_MEDIA_TYPES:internal
+
+.h2 PREFERRED_ENCODING
+# When doing a GET, lynx tells what types of compressed data it can decompress
+# (the "Accept-Encoding:" string). This is determined by compiled-in support
+# for decompression or external decompression programs.
+#
+# Values for this option are keywords:
+# NONE Do not request compressed data
+# GZIP For gzip
+# COMPRESS For compress
+# BZIP2 For bzip2
+# BROTLI For brotli
+# ALL All of the above.
+#PREFERRED_ENCODING:all
+
+.h2 PREFERRED_CONTENT_TYPE
+# When doing a GET, lynx expects the server to provide a Content-Type, i.e.,
+# the MIME name which tells it how to present data. When that is missing
+# lynx uses this value.
+#PREFERRED_CONTENT_TYPE: text/plain
+
+.h1 Keyboard Input
+
+.h2 KEYBOARD_LAYOUT
+# If your terminal (or terminal emulator, or operating system) does not
+# support 8-bit input (at all or in easy way), you can use Lynx to
+# generate 8-bit characters from 7-bit ones output by terminal.
+#
+# Currently available keyboard layouts:
+# ROT13'd keyboard layout
+# JCUKEN Cyrillic, for AT 101-key kbd
+# YAWERTY Cyrillic, for DEC LK201 kbd
+#
+# This feature is ifdef'd with EXP_KEYBOARD_LAYOUT.
+#KEYBOARD_LAYOUT:JCUKEN Cyrillic, for AT 101-key kbd
+
+.h2 KEYMAP
+# Key remapping definitions!
+#
+# You may redefine the keymapping of any function in Lynx by
+# using the KEYMAP option. The basic form of KEYMAP is:
+# KEYMAP:<KEYSTROKE>:<LYNX FUNCTION>
+# (See below for an extended format.)
+#
+# You must map upper and lowercase keys separately.
+#
+# A representative list of functions mapped to their default keys is
+# provided below. All of the mappings are commented out by default
+# since they just repeat the default mappings, except for TOGGLE_HELP
+# (see below). See LYKeymap.c for the complete key mapping. Use the
+# 'K'eymap command when running Lynx for a list of the _current_ keymappings.
+#
+# You can disable any of the default key-mappings by mapping the key to
+# "UNMAPPED".
+#
+# (However, in contrast to the output of 'K' command,
+# 'H'elp (lynx_help/*.html and lynx_help/keystrokes/*.html files) shows
+# the default mapping unless you change that files manually,
+# so you are responsible for possible deviations
+# when you are changing any KEYMAP below).
+#
+# Lynx accepts special keys either by name, or by lynx-specific codes. These
+# names and codes are listed below, with a brief description:
+.nf
+# UPARROW: 0x100 (Up Arrow)
+# DNARROW: 0x101 (Down Arrow)
+# RTARROW: 0x102 (Right Arrow)
+# LTARROW: 0x103 (Left Arrow)
+# PGDOWN: 0x104 (Page Down)
+# PGUP: 0x105 (Page Up)
+# HOME: 0x106 (Keypad Home)
+# END: 0x107 (Keypad End)
+# F1: 0x108 (VT220 Function-key 1, also Help Key)
+# DO_KEY: 0x109 (VT220 Function key 16, also "Do" Key)
+# FIND_KEY: 0x10A (VT220 key with label "Home" may be treated as Find)
+# SELECT_KEY: 0x10B (VT220 key with label "End" may be treated as Select)
+# INSERT_KEY: 0x10C (VT220 Insert Key)
+# REMOVE_KEY: 0x10D (VT220 Remove (DEL) Key)
+# DO_NOTHING: 0x10E (reserved for internal use, DO_NOTHING)
+# BACKTAB_KEY: 0x10F (Back Tab, e.g., using Shift)
+# F2: 0x110 (VT220 Function-key 2)
+# F3: 0x111 (VT220 Function-key 3)
+# F4: 0x112 (VT220 Function-key 4)
+# F5: 0x113 (VT220 Function-key 5)
+# F6: 0x114 (VT220 Function-key 6)
+# F7: 0x115 (VT220 Function-key 7)
+# F8: 0x116 (VT220 Function-key 8)
+# F9: 0x117 (VT220 Function-key 9)
+# F10: 0x118 (VT220 Function-key 10)
+# F11: 0x119 (VT220 Function-key 11)
+# F12: 0x11A (VT220 Function-key 12)
+# MOUSE: 0x11D (reserved for internal use with -use_mouse)
+.fi
+# Other codes not listed above may be available for additional keys,
+# depending on operating system and libraries used to compile Lynx.
+# On Unix-like systems, if compiled with slang or ncurses, an additional
+# level of key mapping is supported via an external ".lynx-keymaps" file.
+# This file, if found in the home directory at startup, will always be
+# used under those conditions; see lynx-keymaps distributed in the samples
+# subdirectory for further explanation. Note that mapping via
+# .lynx-keymaps, if applicable, is a step that logically comes before the
+# mappings done here: KEYMAP maps the result of that step (which still
+# represents a key) to a function (which represents an action that Lynx
+# should perform).
+.nf
+#
+#KEYMAP:0x5C:SOURCE # Toggle source viewing mode (show HTML source)
+#KEYMAP:^R:RELOAD # Reload the current document and redisplay
+#KEYMAP:^U:NEXT_DOC # Undo PREV_DOC)
+#KEYMAP:q:QUIT # Ask the user to quit
+#KEYMAP:Q:ABORT # Quit without verification
+#KEYMAP:0x20:NEXT_PAGE # Move down to next page
+#KEYMAP:-:PREV_PAGE # Move up to previous page
+#KEYMAP:^P:UP_TWO # Move display up two lines
+#KEYMAP:INSERT_KEY:UP_TWO # Function key Insert - Move display up two lines
+#KEYMAP:^N:DOWN_TWO # Move display down two lines
+#KEYMAP:REMOVE_KEY:DOWN_TWO # Function key Remove - Move display down two lines
+#KEYMAP:(:UP_HALF # Move display up half a page
+#KEYMAP:):DOWN_HALF # Move display down half a page
+#KEYMAP:^W:REFRESH # Refresh the screen
+#KEYMAP:^A:HOME # Go to top of current document
+#KEYMAP:HOME:HOME # Keypad Home - Go to top of current document
+#KEYMAP:FIND_KEY:HOME # Function key Find - Go to top of current document
+#KEYMAP:^E:END # Go to bottom of current document
+#KEYMAP:END:END # Keypad End - Go to bottom of current document
+#KEYMAP:SELECT_KEY:END # Function key Select - Go to bottom of current document
+#KEYMAP:UPARROW:PREV_LINK # Move to the previous link or page
+#KEYMAP:DNARROW:NEXT_LINK # Move to the next link or page
+#KEYMAP:BACKTAB_KEY:FASTBACKW_LINK # Back Tab - Move to previous link or text area
+#KEYMAP:^I:FASTFORW_LINK # Tab key - Move always to next link or text area
+#KEYMAP:^:FIRST_LINK # Move to the first link on line
+#KEYMAP:$:LAST_LINK # Move to the last link on line
+#KEYMAP:<:UP_LINK # Move to the link above
+#KEYMAP:>:DOWN_LINK # Move to the link below
+#KEYMAP:0x7F:HISTORY # Show the history list
+#KEYMAP:0x08:HISTORY # Show the history list
+#KEYMAP:LTARROW:PREV_DOC # Return to the previous document in history stack
+#KEYMAP:RTARROW:ACTIVATE # Select the current link
+#KEYMAP:DO_KEY:ACTIVATE # Function key Do - Select the current link
+#KEYMAP:g:GOTO # Goto a random URL
+#KEYMAP:G:ECGOTO # Edit the current document's URL and go to it
+#KEYMAP:H:HELP # Show default help screen
+#KEYMAP:F1:DWIMHELP # Function key Help - Show a help screen
+#KEYMAP:i:INDEX # Show default index
+#*** Edit FORM_LINK_* messages in LYMessages_en.h if you change NOCACHE ***
+#KEYMAP:x:NOCACHE # Force submission of form or link with no-cache
+#*** Do not change INTERRUPT from 'z' & 'Z' ***
+#KEYMAP:z:INTERRUPT # Interrupt network transmission
+#KEYMAP:m:MAIN_MENU # Return to the main menu
+#KEYMAP:o:OPTIONS # Show the options menu
+#KEYMAP:i:INDEX_SEARCH # Search a server based index
+#KEYMAP:/:WHEREIS # Find a string within the current document
+#KEYMAP:n:NEXT # Find next occurrence of string within document
+#KEYMAP:c:COMMENT # Comment to the author of the current document
+#KEYMAP:C:CHDIR # Change current directory
+#KEYMAP:e:EDIT # Edit current document or form's textarea (call: ^Ve)
+#KEYMAP:E:ELGOTO # Edit the current link's URL or ACTION and go to it
+#KEYMAP:=:INFO # Show info about current document
+#KEYMAP:p:PRINT # Show print options
+#KEYMAP:a:ADD_BOOKMARK # Add current document to bookmark list
+#KEYMAP:v:VIEW_BOOKMARK # View the bookmark list
+#KEYMAP:V:VLINKS # List links visited during the current Lynx session
+#KEYMAP:!:SHELL # Spawn default shell
+#KEYMAP:d:DOWNLOAD # Download current link
+#KEYMAP:j:JUMP # Jump to a predefined target
+#KEYMAP:k:KEYMAP # Display the current key map
+#KEYMAP:l:LIST # List the references (links) in the current document
+#KEYMAP:#:TOOLBAR # Go to the Toolbar or Banner in the current document
+#KEYMAP:^T:TRACE_TOGGLE # Toggle detailed tracing for debugging
+#KEYMAP:;:TRACE_LOG # View trace log if available for the current session
+#KEYMAP:*:IMAGE_TOGGLE # Toggle inclusion of links for all images
+#KEYMAP:[:INLINE_TOGGLE # Toggle pseudo-ALTs for inlines with no ALT string
+#KEYMAP:]:HEAD # Send a HEAD request for current document or link
+#*** Must be compiled with USE_EXTERNALS to enable EXTERN_LINK, EXTERN_PAGE ***
+#KEYMAP:,:EXTERN_PAGE # Run external program with current page
+#KEYMAP:.:EXTERN_LINK # Run external program with current link
+#*** Escaping from text input fields with ^V is independent from this: ***
+#KEYMAP:^V:SWITCH_DTD # Toggle between SortaSGML and TagSoup HTML parsing
+#KEYMAP:0x00:DO_NOTHING # Does nothing (ignore this key)
+#KEYMAP:DO_NOTHING:DO_NOTHING # Does nothing (ignore this key)
+#KEYMAP:{:SHIFT_LEFT # shift the screen left
+#KEYMAP:}:SHIFT_RIGHT # shift the screen right
+#KEYMAP:|:LINEWRAP_TOGGLE # toggle linewrap on/off, for shift-commands
+#KEYMAP:~:NESTED_TABLES # toggle nested-tables parsing on/off
+.fi
+# In addition to the bindings available by default, the following functions
+# are not directly mapped to any keys by default, although some of them may
+# be mapped in specific line-editor bindings (effective while in text input
+# fields):
+.nf
+#
+#KEYMAP:???:RIGHT_LINK # Move to the link to the right
+#KEYMAP:???:LEFT_LINK # Move to the link to the left
+#KEYMAP:???:LPOS_PREV_LINK # Like PREV_LINK, last column pos if form input
+#KEYMAP:???:LPOS_NEXT_LINK # Like NEXT_LINK, last column pos if form input
+#*** Only useful in form text fields , need PASS or prefixing with ^V: ***
+#KEYMAP:???:DWIMHELP # Display help page that may depend on context
+#KEYMAP:???:DWIMEDIT # Use external editor for context-dependent purpose
+#*** Only useful in a form textarea, need PASS or prefixing with ^V: ***
+#KEYMAP:???:EDITTEXTAREA # use external editor to edit a form textarea
+#KEYMAP:???:GROWTEXTAREA # Add some blank lines to bottom of textarea
+#KEYMAP:???:INSERTFILE # Insert file into a textarea (just above cursor)
+#*** Only useful with dired support and OK_INSTALL: ***
+#KEYMAP:???:INSTALL # install (i.e. copy) local files to new location
+.fi
+#
+# If TOGGLE_HELP is mapped, in novice mode the second help menu line
+# can be toggled among NOVICE_LINE_TWO_A, _B, and _C, as defined in
+# LYMessages_en.h Otherwise, it will be NOVICE_LINE_TWO.
+#
+#KEYMAP:O:TOGGLE_HELP # Show other commands in the novice help menu
+#
+# KEYMAP lines can have one or two additional fields. The extended format is
+# KEYMAP:<KEYSTROKE>:[<MAIN LYNX FUNCTION>]:<OTHER BINDING>[:<SELECT>]
+#
+# If the additional field OTHER BINDING specifies DIRED, then the function is
+# mapped in the override table used only in DIRED mode. This is only valid
+# if lynx was compiled with dired support and OK_OVERRIDE defined. A
+# MAIN LYNX FUNCTION must be given (it should of course be one that makes
+# sense in Dired mode), and SELECT is meaningless. Default built-in override
+# mappings are
+#
+#KEYMAP:^U:NEXT_DOC:DIRED # Undo going back to the previous document
+#KEYMAP:.:TAG_LINK:DIRED # Tag a file or directory for later action
+#KEYMAP:c:CREATE:DIRED # Create a new file or directory
+#KEYMAP:C:CHDIR:DIRED # change current directory
+#KEYMAP:f:DIRED_MENU:DIRED # Display a menu of file operations
+#KEYMAP:m:MODIFY:DIRED # Modify name or location of a file or directory
+#KEYMAP:r:REMOVE:DIRED # Remove files or directories
+#KEYMAP:t:TAG_LINK:DIRED # Tag a file or directory for later action
+#KEYMAP:u:UPLOAD:DIRED # Show menu of "Upload Options"
+#
+# If the OTHER BINDING field does not specify DIRED, then it is taken as a
+# line-editor action. It is possible to keep the MAIN LYNX FUNCTION field
+# empty in that case, for changing only the line-editing behavior.
+# If alternative line edit styles are compiled in, and modifying a key's
+# line-editor binding on a per style basis is possible, then SELECT can be
+# used to specify which styles are affected. By default, or if SELECT is
+# 0, all line edit styles are affected. If SELECT is a positive integer
+# number, only the binding for the numbered style is changed (numbering
+# is in the order in which styles are shown in the Options Menu, starting
+# with 1 for the Default style). If SELECT is negative (-n), all styles
+# except n are affected.
+.nf
+#
+# NOP # Do Nothing
+# ABORT # Input cancelled
+#
+# BOL # Go to begin of line
+# EOL # Go to end of line
+# FORW # Cursor forwards
+# FORW_RL # Cursor forwards or right link
+# BACK # Cursor backwards
+# FORWW # Word forward
+# BACKW # Word back
+# BACK_LL # Cursor backwards or left link
+#
+# DELN # Delete next/curr char
+# DELP # Delete prev char
+# DELNW # Delete next word
+# DELPW # Delete prev word
+# DELBL # Delete back to BOL
+# DELEL # Delete through EOL
+# ERASE # Erase the line
+# LOWER # Lower case the line
+# UPPER # Upper case the line
+#
+# LKCMD # In fields: Invoke key command prompt (default for ^V)
+# PASS # In fields: handle as non-lineedit key; in prompts: ignore
+#
+.fi
+# Modify following key (prefixing only works within line-editing, edit actions
+# of some resulting prefixed keys are built-in, see Line Editor help pages)
+# SETM1 # Set modifier 1 flag (default for ^X - key prefix)
+# SETM2 # Set modifier 2 flag (another key prefix - same effect)
+#
+# May not always be compiled in:
+.nf
+#
+# TPOS # Transpose characters
+# SETMARK # emacs-like set-mark-command
+# XPMARK # emacs-like exchange-point-and-mark
+# KILLREG # emacs-like kill-region
+# YANK # emacs-like yank
+# SWMAP # Switch input keymap
+# PASTE # ClipBoard to Lynx - Windows Extension
+#
+.fi
+# May work differently from expected if not bound to their expected keys:
+.nf
+#
+# CHAR # Insert printable char (default for all ASCII printable)
+# ENTER # Input complete, return char/lynxkeycode (for RETURN/ENTER)
+# TAB # Input complete, return TAB (for ASCII TAB char ^I)
+#
+.fi
+# Internal use, probably not useful for binding, listed for completeness:
+.nf
+#
+# UNMOD # Fall back to no-modifier command
+# AIX # Hex 97
+# C1CHAR # Insert C1 char if printable
+#
+.fi
+# If OTHER BINDING specifies PASS, then if the key is pressed in a text input
+# field it is passed by the built-in line-editor to normal KEYMAP handling,
+# i.e. this flag acts like an implied ^V escape (always overrides line-editor
+# behavior of the key). For example,
+#KEYMAP:INSERT_KEY:UP_TWO:PASS # Function key Insert - Move display up two lines
+#
+# Other examples (repeating built-in bindings)
+#KEYMAP:^V::LKCMD # set (only) line-edit action for ^V
+#KEYMAP:^V:SWITCH_DTD:LKCMD # set main lynxaction and line-edit action for ^V
+#KEYMAP:^U::ERASE:1 # set line-edit binding for ^U, for default style
+#KEYMAP:^[::SETM2:3 # use escape key as modifier - works only sometimes
+
+.h1 External Programs
+# These settings control the ability of Lynx to invoke various programs for
+# the user.
+
+.h2 CSWING_PATH
+# VMS ONLY:
+#==========
+# On VMS, CSwing (an XTree emulation for VTxxx terminals) is intended for
+# use as the Directory/File Manager (sources, objects, or executables were
+# available from ftp://narnia.memst.edu/). CSWING_PATH should be defined
+# here or in userdefs.h to your foreign command for CSwing, with any
+# regulatory switches you want included. If not defined, or defined as
+# a zero-length string ("") or "none" (case-insensitive), the support
+# will be disabled. It will also be disabled if the -nobrowse or
+# -selective switches are used, or if the file_url restriction is set.
+#
+# When enabled, the DIRED_MENU command (normally 'f' or 'F') will invoke
+# CSwing, normally with the current default directory as an argument to
+# position the user on that node of the directory tree. However, if the
+# current document is a local directory listing, or a local file and not
+# one of the temporary menu or list files, the associated directory will
+# be passed as an argument, to position the user on that node of the tree.
+#
+#CSWING_PATH:swing
+
+.h1 Internal Behavior
+
+.h2 AUTO_UNCACHE_DIRLISTS
+# AUTO_UNCACHE_DIRLISTS determines when local file directory listings are
+# automatically regenerated (by re-reading the actual directory from disk).
+# Set the value to 0 to avoid automatic regeneration in most cases. This is
+# useful for browsing large directories that take some time to read and format.
+# An update can still always be forced with the RELOAD key, and specific DIRED
+# actions may cause a refresh anyway. Set the value to 1 to force regeneration
+# after commands that usually change the directory or some files and would make
+# the displayed info stale, like EDIT and REMOVE. Set it to 2 (the default) or
+# greater to force regeneration even after leaving the displayed directory
+# listing by some action that usually causes no change, like GOTO or entering a
+# file with the ACTIVATE key. This option is only honored in DIRED mode (i.e.
+# when lynx is compiled with DIRED_SUPPORT and it is not disabled with a
+# -restriction). Local directories displayed without DIRED normally act as if
+# AUTO_UNCACHE_DIRLISTS:0 was in effect.
+#
+#AUTO_UNCACHE_DIRLISTS:2
+
+.h1 Appearance
+
+.h2 LIST_FORMAT
+# LIST_FORMAT defines the display for local files when Lynx has been
+# compiled with LONG_LIST defined in the Makefile. The default is set
+# in userdefs.h, normally to "ls -l" format, and can be changed here
+# by uncommenting the indicated lines, or adding a definition with a
+# modified parameter list.
+#
+# This feature is not available for VMS.
+#
+# The percent items in the list are interpreted as follows:
+.nf
+#
+# %p Unix-style permission bits
+# %l link count
+# %o owner of file
+# %g group of file
+# %d date of last modification
+# %a anchor pointing to file or directory
+# %A as above but don't show symbolic links
+# %t type of file (description derived from MIME type)
+# %T MIME type as known by Lynx (from mime.types or default)
+# %k size of file in Kilobytes
+# %K as above but omit size for directories
+# %s size of file in bytes
+#
+.fi
+# Anything between the percent and the letter is passed on to sprintf.
+# A double percent yields a literal percent on output. Other characters
+# are passed through literally.
+#
+# If you want only the filename:
+#
+.ex
+#LIST_FORMAT: %a
+#
+# If you want a brief output:
+#
+.ex
+#LIST_FORMAT: %4K %-12.12d %a
+#
+# If you want the Unix "ls -l" format:
+#
+.ex
+#LIST_FORMAT: %p %4l %-8.8o %-8.8g %7s %-12.12d %a
+
+.h1 External Programs
+
+.h2 DIRED_MENU
+# Unix ONLY:
+#===========
+# DIRED_MENU items are used to compose the F)ull menu list in DIRED mode
+# The behavior of the default configuration given here is much the same
+# as it was when this menu was hard-coded but these items can now be adjusted
+# to suit local needs. In particular, many of the LYNXDIRED actions can be
+# replaced with lynxexec, lynxprog and lynxcgi script references.
+#
+# NOTE that defining even one DIRED_MENU line overrides all the built-in
+# definitions, so a complete set must then be defined here.
+#
+# Each line consists of the following fields:
+.nf
+#
+# DIRED_MENU:type:suffix:link text:extra text:action
+#
+# type: TAG: list only when one or more files are tagged
+# FILE: list only when the current selection is a regular file
+# DIR: list only when the current selection is a directory
+# LINK: list only when the current selection is a symbolic link
+#
+# suffix: list only if the current selection ends in this pattern
+#
+# link text: the displayed text of the link
+#
+# extra text: the text displayed following the link
+#
+# action: the URL to be followed upon selection
+#
+# link text and action are scanned for % sequences that are expanded
+# at display time as follows:
+#
+# %p path of current selection
+# %f filename (last component) of current selection
+# %t tagged list (full paths)
+# %l list of tagged file names
+# %d the current directory
+#
+.fi
+#DIRED_MENU:::New File:(in current directory):LYNXDIRED://NEW_FILE%d
+#DIRED_MENU:::New Directory:(in current directory):LYNXDIRED://NEW_FOLDER%d
+#
+# Following depends on OK_INSTALL
+#DIRED_MENU:FILE::Install:selected file to new location:LYNXDIRED://INSTALL_SRC%p
+#DIRED_MENU:DIR::Install:selected directory to new location:LYNXDIRED://INSTALL_SRC%p
+#
+#DIRED_MENU:FILE::Modify File Name:(of current selection):LYNXDIRED://MODIFY_NAME%p
+#DIRED_MENU:DIR::Modify Directory Name:(of current selection):LYNXDIRED://MODIFY_NAME%p
+#DIRED_MENU:LINK::Modify Name:(of selected symbolic link):LYNXDIRED://MODIFY_NAME%p
+#
+# Following depends on OK_PERMIT
+#DIRED_MENU:FILE::Modify File Permissions:(of current selection):LYNXDIRED://PERMIT_SRC%p
+#DIRED_MENU:DIR::Modify Directory Permissions:(of current selection):LYNXDIRED://PERMIT_SRC%p
+#
+#DIRED_MENU:FILE::Change Location:(of selected file):LYNXDIRED://MODIFY_LOCATION%p
+#DIRED_MENU:DIR::Change Location:(of selected directory):LYNXDIRED://MODIFY_LOCATION%p
+#DIRED_MENU:LINK::Change Location:(of selected symbolic link):LYNXDIRED://MODIFY_LOCATION%p
+#DIRED_MENU:FILE::Remove File:(current selection):LYNXDIRED://REMOVE_SINGLE%p
+#DIRED_MENU:DIR::Remove Directory:(current selection):LYNXDIRED://REMOVE_SINGLE%p
+#DIRED_MENU:LINK::Remove Symbolic Link:(current selection):LYNXDIRED://REMOVE_SINGLE%p
+#
+# Following depends on OK_UUDECODE and !ARCHIVE_ONLY
+#DIRED_MENU:FILE::UUDecode:(current selection):LYNXDIRED://UUDECODE%p
+#
+# Following depends on OK_TAR and !ARCHIVE_ONLY
+#DIRED_MENU:FILE:.tar.Z:Expand:(current selection):LYNXDIRED://UNTAR_Z%p
+#
+# Following depend on OK_TAR and OK_GZIP and !ARCHIVE_ONLY
+#DIRED_MENU:FILE:.tar.gz:Expand:(current selection):LYNXDIRED://UNTAR_GZ%p
+#DIRED_MENU:FILE:.tgz:Expand:(current selection):LYNXDIRED://UNTAR_GZ%p
+#
+# Following depends on !ARCHIVE_ONLY
+#DIRED_MENU:FILE:.Z:Uncompress:(current selection):LYNXDIRED://DECOMPRESS%p
+#
+# Following depends on OK_GZIP and !ARCHIVE_ONLY
+#DIRED_MENU:FILE:.gz:Uncompress:(current selection):LYNXDIRED://UNGZIP%p
+#
+# Following depends on OK_ZIP and !ARCHIVE_ONLY
+#DIRED_MENU:FILE:.zip:Uncompress:(current selection):LYNXDIRED://UNZIP%p
+#
+# Following depends on OK_TAR and !ARCHIVE_ONLY
+#DIRED_MENU:FILE:.tar:UnTar:(current selection):LYNXDIRED://UNTAR%p
+#
+# Following depends on OK_TAR
+#DIRED_MENU:DIR::Tar:(current selection):LYNXDIRED://TAR%p
+#
+# Following depends on OK_TAR and OK_GZIP
+#DIRED_MENU:DIR::Tar and compress:(using GNU gzip):LYNXDIRED://TAR_GZ%p
+#
+# Following depends on OK_ZIP
+#DIRED_MENU:DIR::Package and compress:(using zip):LYNXDIRED://ZIP%p
+#
+#DIRED_MENU:FILE::Compress:(using Unix compress):LYNXDIRED://COMPRESS%p
+#
+# Following depends on OK_GZIP
+#DIRED_MENU:FILE::Compress:(using gzip):LYNXDIRED://GZIP%p
+#
+# Following depends on OK_ZIP
+#DIRED_MENU:FILE::Compress:(using zip):LYNXDIRED://ZIP%p
+#
+#DIRED_MENU:TAG::Move all tagged items to another location.::LYNXDIRED://MOVE_TAGGED%d
+#
+# Following depends on OK_INSTALL
+#DIRED_MENU:TAG::Install tagged files into another directory.::LYNXDIRED://INSTALL_SRC%00
+#
+#DIRED_MENU:TAG::Remove all tagged files and directories.::LYNXDIRED://REMOVE_TAGGED
+#DIRED_MENU:TAG::Untag all tagged items.::LYNXDIRED://CLEAR_TAGGED
+
+.h1 Internal Behavior
+
+.h2 NONRESTARTING_SIGWINCH
+# Some systems only:
+#===================
+# Lynx tries to detect window size changes with a signal handler for
+# SIGWINCH if supported. If NONRESTARTING_SIGWINCH is set to TRUE,
+# and the sigaction interface is available on the system, the handler
+# is installed as 'non-restarting'. On some systems (depending on the
+# library used for handling keyboard input, e.g. ncurses), this allows
+# more immediate notification of window size change events. If the value
+# is set to FALSE, the signal() interface is used; this normally makes
+# the handler 'restarting', with the effect that lynx can react to size
+# changes only after some key is pressed. The value can also be set to
+# XWINDOWS; this is equivalent to TRUE when the user has the environment
+# variable DISPLAY defined *at program start*, and equivalent to FALSE
+# otherwise. The non-restarting behavior can also be changed to TRUE
+# or FALSE with the -nonrestarting_sigwinch switch, which overrides the
+# value in this file.
+#
+# Note that Lynx never re-parses document text purely as a result of a
+# window size change, so text lines may appear truncated after narrowing
+# the window, until the document is reloaded with ^R or a similar key
+# or until a different text is loaded.
+#
+# The default is FALSE since there is a possibility that non-restarting
+# interrupts may be mis-interpreted as fatal input errors in some
+# configurations (leading to an abrupt program exit), and since this
+# option is useful mostly only for users running Lynx under xterm or a
+# similar X terminal emulator. On systems where the preconditions don't
+# apply this option is ignored.
+#
+#NONRESTARTING_SIGWINCH:FALSE
+
+.h2 NO_FORCED_CORE_DUMP
+# Unix ONLY:
+#===========
+# If NO_FORCED_CORE_DUMP is set to TRUE, Lynx will not force
+# core dumps via abort() calls on fatal errors or assert()
+# calls to check potentially fatal errors. The compilation
+# default normally is FALSE, and can be changed here. The
+# compilation or configuration default can be toggled via
+# the -core command line switch.
+# Note that this setting cannot be used to prevent core dumps
+# with certainty. If this is important, means provided by the
+# operating system or kernel should be used.
+#
+#NO_FORCED_CORE_DUMP:FALSE
+
+.h1 Appearance
+
+.h2 COLOR
+# COLORS are only available if compiled with SVr4 curses or slang. This is
+# the old color configuration. The COLOR_STYLE configuration is compiled-in
+# and can simulate this if the ".lss" filename is empty.
+#
+# The line must be of the form:
+#
+# COLOR:Integer:Foreground:Background
+.nf
+#
+# The Integer value is interpreted as follows:
+# 0 - normal - normal text
+# 1 - bold - hyperlinks, see also BOLD_* options above
+# 2 - reverse - statusline
+# 3 - bold + reverse (not used)
+# 4 - underline - text emphasis (EM, I, B tags etc.)
+# 5 - bold + underline - hyperlinks within text emphasis
+# 6 - reverse + underline - currently selected hyperlink
+# 7 - reverse + underline + bold - WHEREIS search hits
+#
+# Each Foreground and Background value must be one of:
+# black red green brown
+# blue magenta cyan lightgray
+# gray brightred brightgreen yellow
+# brightblue brightmagenta brightcyan white
+.fi
+# or (if you have configured using -enable-default-colors with ncurses or
+# slang), "default" may be used for foreground and background.
+#
+# Note that in most cases a white background is really "lightgray", since
+# terminals generally do not implement bright backgrounds.
+#
+# Uncomment and change any of the compilation defaults.
+#
+#COLOR:0:black:white
+#COLOR:1:blue:white
+#COLOR:2:yellow:blue
+#COLOR:3:green:white
+#COLOR:4:magenta:white
+#COLOR:5:blue:white
+#COLOR:6:red:white
+COLOR:6:brightred:black
+#COLOR:7:magenta:cyan
+
+.h2 COLOR_STYLE
+# Also known as "lss" (lynx style-sheet), the color-style file assigns color
+# combination to tags and combinations of tags. Normally a non-empty value
+# is compiled into lynx, and the user can override that using the -lss
+# command-line option. The configure script allows one to compile in an
+# empty string. If lynx finds no value for this setting, it simulates the
+# non-color-style assignments using the COLOR settings.
+#
+# If neither the command-line "-lss" or this COLOR_STYLE setting are given,
+# lynx tries the environment variables "LYNX_LSS" and "lynx_lss". If neither
+# is set, lynx uses the first compiled-in value (which as noted, may be empty).
+#
+# At startup, lynx remembers the name of the color-style file which was used,
+# and together with each file specified, provides those as choices in the
+# O)ptions menu.
+#
+#COLOR_STYLE: lynx.lss
+#COLOR_STYLE: blue-background.lss
+#COLOR_STYLE: bright-blue.lss
+#COLOR_STYLE: midnight.lss
+#COLOR_STYLE: mild-colors.lss
+#COLOR_STYLE: opaque.lss
+
+.h2 NESTED_TABLES
+# This is an experimental feature for improving table layout.
+# It is enabled by default when the COLOR_STYLE configuration is used,
+# and false otherwise.
+#
+#NESTED_TABLES: true
+
+.h2 NO_TABLE_CENTER
+# Normally table cells are centered on the table grid.
+# Set this option to true to disable centering.
+# The -center command-line option toggles this setting between true/false.
+#NO_TABLE_CENTER: false
+
+.h2 ASSUMED_COLOR
+# If built with a library that recognizes default colors (usually ncurses or
+# slang), and if the corresponding option is compiled into lynx, lynx
+# initializes it to assume the corresponding foreground and background colors.
+# Default colors are those that the terminal (emulator) itself is initialized
+# to. For instance, you might have an xterm running with black text on a white
+# background, and want lynx to display colored text on the white background,
+# but leave the possibility of using the same configuration to draw colored
+# text on a different xterm, this time using its background set to black.
+#
+# If built with conventional SVr3/SVr4 curses, tells lynx to use color pair 0
+# when the given colors match this setting. That gives a similar effect,
+# though not as flexible. You will get the best results by setting the
+# terminal's default colors to match the prevailing text and background colors
+# that you have setup with lynx, and then alter the ASSUMED_COLOR setting to
+# match that. If you do not alter the ASSUMED_COLOR setting, curses assumes
+# color pair 0's background is black, which implies that its foreground (text)
+# is white.
+#
+# The first value given is the foreground, the second is the background.
+#ASSUMED_COLOR:default:default
+
+.h2 DEFAULT_COLORS
+# If built with a library that recognizes default colors (usually ncurses or
+# slang), and if the corresponding option is compiled into lynx, lynx
+# initializes it to assume the corresponding foreground and background colors.
+# Default colors are those that the terminal (emulator) itself is initialized
+# to.
+#
+# Use this feature to disable the default-colors feature at runtime.
+# This is useful for constructing scripts which use the non-color-style
+# scheme, e.g., the oldlynx script.
+#
+# This should precede ASSUMED_COLOR settings.
+#DEFAULT_COLORS:true
+
+.h1 External Programs
+
+.h2 EXTERNAL
+# External application support. This feature allows Lynx to pass a given
+# URL to an external program. It was written for three reasons.
+#
+# 1) To overcome the deficiency of Lynx_386 not supporting ftp and news.
+# External programs can be used instead by passing the URL.
+#
+# 2) To allow for background transfers in multitasking systems.
+# I use wget for http and ftp transfers via the external command.
+#
+# 3) To allow for new URLs to be used through Lynx.
+# URLs can be made up such as mymail: to spawn desired applications
+# via the external command.
+#
+# Restrictions can be imposed using -restrictions=externals at the Lynx command
+# line. This will disallow all EXTERNAL lines in lynx.cfg that have FALSE in
+# the 3rd field (not counting the name of the setting). TRUE lines will still
+# function.
+#
+# The lynx.cfg line is as follows:
+#
+# EXTERNAL:<url>:<command> %s:<norestriction>:<allow_for_activate>[:environment]
+#
+# <url> Any given URL. This can be normal ones like ftp or http or it
+# can be one made up like mymail.
+#
+# <command> The command to run with %s being the URL that will be passed.
+# In Linux I use "wget -q %s &" (no quotes) to spawn a copy of wget for
+# downloading http and ftp files in the background. In Win95 I use
+# "start ncftp %s" to spawn ncftp in a new window.
+#
+# <norestriction> This complements the -restrictions=externals feature to allow
+# for certain externals to be enabled while restricting others. TRUE means
+# a command will still function while Lynx is restricted. WB
+#
+# <allow_for_activate> Setting this to TRUE allows the use of this command not
+# only when EXTERN key is pressed, but also when ACTIVATE command is invoked
+# (i.e., activating the link with the given prefix will be equivalent to
+# pressing EXTERN key on it). If this component of the line is absent, then
+# FALSE is assumed.
+#
+# [:environment] Optional, if XWINDOWS then command is allowed only if
+# $DISPLAY environment variable is set, else if NON_XWINDOWS then command
+# is allowed only if $DISPLAY environment variable is not set, if absent or
+# anything else command is always allowed.
+#
+# For invoking the command use the EXTERN_LINK or EXTERN_PAGE key. By default
+# EXTERN_LINK is mapped to '.', and EXTERN_PAGE to ',' (if the feature is
+# enabled), see the KEYMAP section above.
+#
+#EXTERNAL:ftp:wget %s &:TRUE
+
+.h2 EXTERNAL_MENU
+# Like EXTERNAL, but allows customizing the menu name.
+# Here is the syntax:
+.ex 1
+# EXTERNAL_MENU:<url>:<menu>:<command> %s:<norestriction>:<allow_for_activate>[:environment]
+
+.h1 Internal Behavior
+
+.h2 RULE
+.h2 RULESFILE
+# CERN-style rules, EXPERIMENTAL - URL-specific rules
+#
+# A CERN-style rules file can be given with RULESFILE. Use the system's
+# native format for filenames, on Unix '~' is also recognized. If a filename
+# is given, the file must exist.
+#
+# Single CERN-style rules can be specified with RULES.
+#
+# Both options can be repeated, rules accumulate in the order
+# given, they will be applied in first-to-last order. See cernrules.txt
+# in the samples subdirectory for further explanation.
+#
+# Examples:
+.ex 5
+# RULESFILE:/etc/lynx/cernrules
+# RULE:Fail gopher:* # reject by scheme
+# RULE:Pass finger://*@localhost/ # allow this,
+# RULE:Fail finger:* # but not others
+# RULE:Redirect http://old.server/* http://new.server/*
+
+.h1 Appearance
+
+.h2 PRETTYSRC
+# Enable pretty source view
+#PRETTYSRC:FALSE
+
+.h2 PRETTYSRC_SPEC
+# Pretty source view settings. These settings are in effect when -prettysrc
+# is specified.
+# The following lexical elements (lexemes) are recognized:
+# comment, tag, attribute, attribute value, generalized angle brackets (
+# '<' '>' '</' ), entity, hyperlink destination, entire file, bad sequence,
+# bad tag, bad attribute, sgml special.
+# The following group of option tells which styles will surround each
+# lexeme. The syntax of option in this group is:
+#PRETTYSRC_SPEC:<LEXEMENAME>:<TAGSPEC>:<TAGSPEC>
+# The first <TAGSPEC> specifies what tags will precede lexemes of that class
+# in the internal html markup. The second - what will be placed (internally)
+# after it.
+# TAGSPEC has the following syntax:
+# <TAGSPEC>:= [ (<TAGOPEN> | <TAGCLOSE>) <SPACE>+ ]*
+# <TAGOPEN>:= tagname[.classname]
+# <TAGCLOSE>:= !tagname
+#
+# The following table gives correspondence between lexeme and lexeme name
+.nf
+# Lexeme LEXEMENAME FURTHER EXPLANATION
+# =========================================================
+# comment COMM
+# tag TAG recognized tag name only
+# attribute ATTRIB
+# attribute value ATTRVAL
+# generalized brackets ABRACKET < > </
+# entity ENTITY
+# hyperlink destination HREF
+# entire file ENTIRE
+# bad sequence BADSEQ bad entity or invalid construct at text
+# level.
+# bad tag BADTAG Unrecognized construct in generalized
+# brackets.
+# bad attribute BADATTR The name of the attribute unknown to lynx
+# of the tag known to lynx. (i.e.,
+# attributes of unknown tags will have
+# markup of ATTRIB)
+# sgml special SGMLSPECIAL doctype, sgmlelt, sgmlele,
+# sgmlattlist, marked section, identifier
+.fi
+#
+# Notes:
+#
+# 1) The markup for HTML_ENTIRE will be emitted only once - it will surround
+# entire file source.
+#
+# 2) The tagnames specified by TAGSPEC should be valid html tag names.
+#
+# 3) If the tag/class combination given by TAGOPEN is not assigned a color
+# style in lss file (for lynx compiled with lss support), that tag/class
+# combination will be emitted anyway during internal html markup. Such
+# combinations will be also reported to the trace log.
+#
+# 4) Lexeme 'tag' means tag name only
+#
+# 5) Angle brackets of html specials won't be surrounded by markup for ABRACKET
+#
+.ex
+# PRETTYSRC_SPEC:COMM:B I:!I !B
+# HTML comments will be surrounded by <b><i> and </i></b> in the
+# internal html markup
+.ex
+# PRETTYSRC_SPEC:ATTRVAL: span.attrval : !span
+# Values of the attributes will be surrounded by the
+# <SPAN class=attrval> </SPAN>
+.ex
+# PRETTYSRC_SPEC:HREF::
+# No special html markup will surround hyperlink destinations (
+# this means that only default color style for hrefs will be applied
+# to them)
+#
+# For lynx compiled with lss support, the following settings are the default:
+#PRETTYSRC_SPEC:COMM:span.htmlsrc_comment:!span
+#PRETTYSRC_SPEC:TAG:span.htmlsrc_tag:!span
+#PRETTYSRC_SPEC:ATTRIB:span.htmlsrc_attrib:!span
+#PRETTYSRC_SPEC:ATTRVAL:span.htmlsrc_attrval:!span
+#PRETTYSRC_SPEC:ABRACKET:span.htmlsrc_abracket:!span
+#PRETTYSRC_SPEC:ENTITY:span.htmlsrc_entity:!span
+#PRETTYSRC_SPEC:HREF:span.htmlsrc_href:!span
+#PRETTYSRC_SPEC:ENTIRE:span.htmlsrc_entire:!span
+#PRETTYSRC_SPEC:BADSEQ:span.htmlsrc_badseq:!span
+#PRETTYSRC_SPEC:BADTAG:span.htmlsrc_badtag:!span
+#PRETTYSRC_SPEC:BADATTR:span.htmlsrc_badattr:!span
+#PRETTYSRC_SPEC:SGMLSPECIAL:span.htmlsrc_sgmlspecial:!span
+# the styles corresponding to them are present in sample .lss file.
+# For lynx compiled without lss support, the following settings are the default:
+#PRETTYSRC_SPEC:COMM:b:!b
+#PRETTYSRC_SPEC:TAG:b:!b
+#PRETTYSRC_SPEC:ATTRIB:b:!b
+#PRETTYSRC_SPEC:ATTRVAL::
+#PRETTYSRC_SPEC:ABRACKET:b:!b
+#PRETTYSRC_SPEC:ENTITY:b:!b
+#PRETTYSRC_SPEC:HREF::
+#PRETTYSRC_SPEC:ENTIRE::
+#PRETTYSRC_SPEC:BADSEQ:b:!b
+#PRETTYSRC_SPEC:BADTAG::
+#PRETTYSRC_SPEC:BADATTR::
+#PRETTYSRC_SPEC:SGMLSPECIAL:b:!b
+
+.h2 HTMLSRC_ATTRNAME_XFORM
+.h2 HTMLSRC_TAGNAME_XFORM
+# Options HTMLSRC_TAGNAME_XFORM and HTMLSRC_ATTRNAME_XFORM control the way the
+# names of tags and names of attributes are transformed correspondingly.
+# Possible values: 0 - lowercase, 1 - leave as is, 2 - uppercase.
+#HTMLSRC_TAGNAME_XFORM:2
+#HTMLSRC_ATTRNAME_XFORM:2
+
+.h2 PRETTYSRC_VIEW_NO_ANCHOR_NUMBERING
+# PRETTYSRC_VIEW_NO_ANCHOR_NUMBERING - pretty source view setting
+# If "keypad mode" in 'O'ptions screen is "Links are numbered" or
+# "Links and form fields are numbered", and PRETTYSRC_VIEW_NO_ANCHOR_NUMBERING is
+# TRUE, then links won't be numbered in psrc view and will be numbered
+# otherwise. Set this setting to TRUE if you prefer numbered links, but wish
+# to get valid HTML source when printing or mailing when in psrc view.
+# Default is FALSE.
+#PRETTYSRC_VIEW_NO_ANCHOR_NUMBERING:FALSE
+
+.h1 HTML Parsing
+
+.h2 FORCE_EMPTY_HREFLESS_A
+# FORCE_EMPTY_HREFLESS_A - HTML parsing
+# This option mirrors command-line option with the same name. Default is
+# FALSE. If true, then any 'A' element without HREF will be closed
+# immediately. This is useful when viewing documentation produced by broken
+# translator that doesn't emit balanced A elements. If lynx was compiled with
+# color styles, setting this option to TRUE will make lynx screen much more
+# reasonable (otherwise all text will probably have color corresponding to the
+# A element).
+#
+#FORCE_EMPTY_HREFLESS_A:FALSE
+
+.h2 HIDDEN_LINK_MARKER
+# HIDDEN_LINK_MARKER - HTML parsing
+# This option defines the string that will be used as title of hidden link (a
+# link that otherwise will have no label associated with it). Using an empty
+# string as the value will cause lynx to behave in the old way - hidden links
+# will be handled according to other settings (mostly the parameter of
+# -hiddenlinks command-line switch). If the value is non-empty string, hidden
+# link becomes non-hidden so it won't be handled as hidden link, e.g., listed
+# among hidden links on 'l'isting page.
+#
+#HIDDEN_LINK_MARKER:
+
+.h2 XHTML_PARSING
+# XHTML_PARSING - HTML parsing
+# When true, tells lynx that it can ignore certain tags which have no content
+# in an XHTML 1.0 document. For example
+# <p />
+# <a />
+# When the option is false, lynx will not treat the tag as an ending.
+#XHTML_PARSING:FALSE
+
+.h1 Appearance
+
+.h2 JUSTIFY
+# JUSTIFY - Appearance
+# This option mirrors command-line option with same name. Default is TRUE. If
+# true, most of text (except headers and like this) will be justified. This
+# has no influence on CJK text rendering.
+#
+# This option is only available if Lynx was compiled with USE_JUSTIFY_ELTS.
+#
+#JUSTIFY:FALSE
+
+.h2 JUSTIFY_MAX_VOID_PERCENT
+# JUSTIFY_MAX_VOID_PERCENT - Appearance
+# This option controls the maximum allowed value for ratio (in percents) of
+# 'the number of spaces to spread across the line to justify it' to
+# 'max line size for current style and nesting' when justification is allowed.
+# When that ratio exceeds the value specified, that particular line won't be
+# justified. I.e. the value 28 for this setting will mean maximum value for
+# that ratio is 0.28.
+#
+#JUSTIFY_MAX_VOID_PERCENT:35
+
+.h1 Interaction
+
+.h2 TEXTFIELDS_NEED_ACTIVATION
+# If TEXTFIELDS_NEED_ACTIVATION is set to TRUE, and lynx was compiled with
+# TEXTFIELDS_MAY_NEED_ACTIVATION defined, then text input form fields need
+# to be activated (by pressing the Enter key or similar) before the user
+# can enter or modify input. By default, input fields become automatically
+# activated when selected. Requiring explicit activation can be desired for
+# users who use alphanumeric keys for navigation (or other keys that have
+# special meaning in the line editor - ' ', 'b', INS, DEL, etc), and don't
+# want to 'get stuck' in form fields. Instead of setting the option here,
+# explicit activation can also be requested with the -tna command line
+# option.
+#
+#TEXTFIELDS_NEED_ACTIVATION:FALSE
+
+.h2 LEFTARROW_IN_TEXTFIELD_PROMPT
+# LEFTARROW_IN_TEXTFIELD_PROMPT
+# This option controls what happens when a Left Arrow key is pressed while
+# in the first position of an active text input field. By default, Lynx
+# asks for confirmation ("Do you want to go back to the previous document?")
+# only if the contents of the fields have been changed since entering it.
+# If set to TRUE, the confirmation prompt is always issued.
+#
+#LEFTARROW_IN_TEXTFIELD_PROMPT:FALSE
+
+.h1 Timeouts
+
+.h2 CONNECT_TIMEOUT
+# Specifies (in seconds) connect timeout. Default value is rather huge.
+#CONNECT_TIMEOUT:18000
+
+.h2 READ_TIMEOUT
+# Specifies (in seconds) read-timeout. Default value is rather huge.
+#READ_TIMEOUT:18000
+
+.h1 Internal Behavior
+# These settings control internal lynx behavior - the way it interacts with the
+# operating system and Internet. Modifying these settings will not change
+# the rendition of documents that you browse with lynx, but can change various
+# delays and resource utilization.
+
+.h2 FTP_PASSIVE
+# Set FTP_PASSIVE to TRUE if you want to use passive mode ftp transfers.
+# You might have to do this if you're behind a restrictive firewall.
+#FTP_PASSIVE:TRUE
+
+.h2 ENABLE_LYNXRC
+# The forms-based O'ptions menu shows a (!) marker beside items which are not
+# saved to ~/.lynxrc -- the reason for disabling some of these items is that
+# they are likely to cause confusion if they are read from the .lynxrc file for
+# each session. However, they can be enabled or disabled using the
+# ENABLE_LYNXRC settings. The default (compiled-in) settings are shown below.
+# The second column is the name by which a setting is saved to .lynxrc (which
+# is chosen where possible to correspond with lynx.cfg). Use "OFF" to disable
+# writing a setting, "ON" to enable it. Settings are read from .lynxrc after
+# the corresponding data from lynx.cfg, so they override lynx.cfg, which is
+# probably what users expect.
+#
+# Note that a few settings (Cookies and Show images) are comprised of more than
+# one lynx.cfg setting.
+.nf
+#ENABLE_LYNXRC:ACCEPT_ALL_COOKIES:ON
+#ENABLE_LYNXRC:ASSUME_CHARSET:OFF
+#ENABLE_LYNXRC:AUTO_SESSION:OFF
+#ENABLE_LYNXRC:BOOKMARK_FILE:ON
+#ENABLE_LYNXRC:CASE_SENSITIVE_SEARCHING:ON
+#ENABLE_LYNXRC:CHARACTER_SET:ON
+#ENABLE_LYNXRC:COLLAPSE_BR_TAGS:ON
+#ENABLE_LYNXRC:COOKIE_ACCEPT_DOMAINS:ON
+#ENABLE_LYNXRC:COOKIE_FILE:ON
+#ENABLE_LYNXRC:COOKIE_LOOSE_INVALID_DOMAINS:ON
+#ENABLE_LYNXRC:COOKIE_QUERY_INVALID_DOMAINS:ON
+#ENABLE_LYNXRC:COOKIE_REJECT_DOMAINS:ON
+#ENABLE_LYNXRC:COOKIE_STRICT_INVALID_DOMAIN:ON
+#ENABLE_LYNXRC:DIR_LIST_STYLE:ON
+#ENABLE_LYNXRC:DISPLAY:OFF
+#ENABLE_LYNXRC:EMACS_KEYS:ON
+#ENABLE_LYNXRC:FILE_EDITOR:ON
+#ENABLE_LYNXRC:FILE_SORTING_METHOD:ON
+#ENABLE_LYNXRC:FORCE_COOKIE_PROMPT:OFF
+#ENABLE_LYNXRC:FORCE_SSL_PROMPT:OFF
+#ENABLE_LYNXRC:FTP_PASSIVE:OFF
+#ENABLE_LYNXRC:HTML5_CHARSETS:OFF
+#ENABLE_LYNXRC:HTTP_PROTOCOL:1.0
+#ENABLE_LYNXRC:IDNA_MODE:TR46
+#ENABLE_LYNXRC:KBLAYOUT:ON
+#ENABLE_LYNXRC:KEYPAD_MODE:ON
+#ENABLE_LYNXRC:LINEEDIT_MODE:ON
+#ENABLE_LYNXRC:LOCALE_CHARSET:ON
+#ENABLE_LYNXRC:MAKE_LINKS_FOR_ALL_IMAGES:OFF
+#ENABLE_LYNXRC:MAKE_PSEUDO_ALTS_FOR_INLINES:OFF
+#ENABLE_LYNXRC:MULTI_BOOKMARK:ON
+#ENABLE_LYNXRC:NO_PAUSE:OFF
+#ENABLE_LYNXRC:PERSONAL_MAIL_ADDRESS:ON
+#ENABLE_LYNXRC:PREFERRED_CHARSET:ON
+#ENABLE_LYNXRC:PREFERRED_ENCODING:OFF
+#ENABLE_LYNXRC:PREFERRED_LANGUAGE:ON
+#ENABLE_LYNXRC:PREFERRED_MEDIA_TYPES:OFF
+#ENABLE_LYNXRC:RAW_MODE:OFF
+#ENABLE_LYNXRC:RUN_ALL_EXECUTION_LINKS:ON
+#ENABLE_LYNXRC:RUN_EXECUTION_LINKS_LOCAL:ON
+#ENABLE_LYNXRC:SCROLLBAR:OFF
+#ENABLE_LYNXRC:SELECT_POPUPS:ON
+#ENABLE_LYNXRC:SEND_USERAGENT:OFF
+#ENABLE_LYNXRC:SESSION_FILE:OFF
+#ENABLE_LYNXRC:SET_COOKIES:OFF
+#ENABLE_LYNXRC:SHOW_CURSOR:ON
+#ENABLE_LYNXRC:SHOW_KB_RATE:OFF
+#ENABLE_LYNXRC:SUB_BOOKMARKS:ON
+#ENABLE_LYNXRC:TAGSOUP:OFF
+#ENABLE_LYNXRC:UNDERLINE_LINKS:OFF
+#ENABLE_LYNXRC:USER_MODE:ON
+#ENABLE_LYNXRC:USERAGENT:OFF
+#ENABLE_LYNXRC:VERBOSE_IMAGES:ON
+#ENABLE_LYNXRC:VI_KEYS:ON
+#ENABLE_LYNXRC:VISITED_LINKS:ON
+.fi
+
+.h1 External Programs
+# Any of the compiled-in pathnames of external programs can be overridden
+# by specifying the corresponding xxx_PATH variable. If the variable is
+# given as an empty string, lynx will not use the program. For a few cases,
+# there are internal functions which can be used instead.
+
+.h2 BZIP2_PATH
+# This is the path used for DIRED mode and web connections to compress a file
+# to ".bz2", e.g., the Unix command "bzip2".
+
+.h2 CHMOD_PATH
+# This is the path used for DIRED mode to change file protection, e.g., the
+# Unix command "chmod".
+#
+# Setting this to an empty string will let lynx use a built-in version.
+
+.h2 COMPRESS_PATH
+# This is the path used for DIRED mode and web connections to compress a file
+# to ".Z", e.g., the Unix command "compress".
+
+.h2 COPY_PATH
+# This is the path used for DIRED mode to copy a file, e.g., the
+# Unix command "cp".
+#
+# Setting this to an empty string will let lynx use a built-in version.
+
+.h2 GZIP_PATH
+# This is the path used for DIRED mode and web connections to compress a file
+# to ".gz", e.g., the Unix command "gzip".
+
+.h2 INFLATE_PATH
+# This is the path used for web connections to compress a file using "inflate"
+# compression.
+
+.h2 INSTALL_PATH
+# This is the path used for DIRED mode to install files, e.g., the
+# Unix command "install".
+
+.h2 MKDIR_PATH
+# This is the path used for DIRED mode to create a directory, e.g., the
+# Unix command "mkdir".
+#
+# Setting this to an empty string will let lynx use a built-in version.
+
+.h2 MV_PATH
+# This is the path used for DIRED mode to move a file, e.g., the
+# Unix command "mv".
+#
+# Setting this to an empty string will let lynx use a built-in version.
+
+.h2 RLOGIN_PATH
+# This is the path used for DIRED mode to login remotely, e.g., the
+# Unix command "rlogin".
+
+.h2 RMDIR_PATH
+# This is the path used for DIRED mode to remove a directory, e.g., the
+# Unix command "rmdir".
+#
+# Setting this to an empty string will let lynx use a built-in version.
+
+.h2 RM_PATH
+# This is the path used for DIRED mode to remove a file, e.g., the
+# Unix command "rm".
+#
+# Setting this to an empty string will let lynx use a built-in version.
+
+.h2 SETFONT_PATH
+# This is the path used for a command which can be used to load a console font
+# for the experimental font-switch feature, e.g., the program "setfont".
+
+.h2 TAR_PATH
+# This is the path used for DIRED mode to create a tar archive from one or more
+# files.
+
+.h2 TELNET_PATH
+# This is the path for a program which can be used to make a "telnet" connection
+# to a remote host.
+
+.h2 TN3270_PATH
+# This is the path for a program which can be used to make an "IBM 3270"
+# connection to a remote host.
+
+.h2 TOUCH_PATH
+# This is the path used for DIRED mode to update the modification time of a
+# file to the current time,, e.g., the Unix command "touch".
+#
+# Setting this to an empty string will let lynx use a built-in version.
+
+.h2 UNCOMPRESS_PATH
+# This is the path used for DIRED mode and web connections to decompress a file
+# with ".Z" suffix, e.g., the Unix command "uncompress".
+
+.h2 UNZIP_PATH
+# This is the path used for DIRED mode to extract files from a zip-archive the
+# program "unzip".
+
+.h2 UUDECODE_PATH
+# This is the path used for DIRED mode to extract files from uuencoded files
+# e.g., the program "uudecode".
+
+.h2 ZCAT_PATH
+# This is the path used for DIRED mode to decompress files, writing the result
+# to a pipe as part of a shell command, e.g., the program "zcat".
+
+.h2 ZIP_PATH
+# This is the path used for DIRED mode to create a zip-archive from one or more
+# files, e.g., the program "unzip".
+
+.h1 Interaction
+
+.h2 FORCE_SSL_PROMPT
+# If FORCE_SSL_PROMPT is set to "yes", then questionable conditions, such as
+# self-signed certificates will be ignored. If set to "no", these will be
+# reported, but not attempted. The default "prompt" permits the user to make
+# this choice on a case-by-case basis.
+#
+#FORCE_SSL_PROMPT:PROMPT
+
+.h2 FORCE_COOKIE_PROMPT
+# If FORCE_COOKIE_PROMPT is set to "yes", then questionable conditions, such as
+# cookies with invalid syntax will be ignored. If set to "no", these will be
+# reported, but not attempted. The default "prompt" permits the user to make
+# this choice on a case-by-case basis.
+#
+#FORCE_COOKIE_PROMPT:PROMPT
+
+.h2 SSL_CERT_FILE
+# Set SSL_CERT_FILE to the file that contains all valid CA certificates lynx
+# should accept, in case the $SSL_CERT_FILE environment variable is not set,
+# e.g.,
+#
+#SSL_CERT_FILE:/etc/ssl/certs/ca-certificates.crt
+#SSL_CERT_FILE:NULL
+
+.h2 SSL_CLIENT_CERT_FILE
+# Set SSL_CLIENT_CERT_FILE to the file that contains a client certificate
+# (in PEM format) in case the $SSL_CLIENT_CERT_FILE environment variable is
+# not set, e.g.,
+#
+#SSL_CLIENT_CERT_FILE:/home/qux/certs/cert.crt
+#SSL_CLIENT_CERT_FILE:NULL
+
+.h2 SSL_CLIENT_KEY_FILE
+# Set SSL_CLIENT_KEY_FILE to the file that contains a client certificate
+# key (in PEM format), in case the $SSL_CLIENT_KEY_FILE environment variable
+# is not set, e.g.,
+#
+#SSL_CLIENT_KEY_FILE:/home/qux/certs/cert.key
+#SSL_CLIENT_KEY_FILE:NULL
+
+.h1 Appearance
+
+.h2 SCREEN_SIZE
+# For win32, allow the console window to be resized to the given values. This
+# requires PDCurses 2.5. The values given are width,height.
+#SCREEN_SIZE:80,24
+
+.h2 NO_MARGINS
+# Disable left/right margins in the default style sheet.
+# This is the same as the command-line "-nomargins" option.
+#NO_MARGINS:FALSE
+
+.h2 NO_TITLE
+# Disable title and blank line from top of page.
+# This is the same as the command-line "-notitle" option.
+#NO_TITLE:FALSE
+
+.h2 UPDATE_TERM_TITLE
+# Enables updating the title in terminal emulators.
+# If your terminal emulator supports that escape code,
+# you can set this to TRUE.
+# This is the same as the command-line "-update_term_title" option.
+#UPDATE_TERM_TITLE:FALSE
+
+.h1 External Programs
+
+.h2 SYSLOG_REQUESTED_URLS
+# Log the requested URLs using the syslog interface.
+#SYSLOG_REQUESTED_URLS:TRUE
+
+.h2 SYSLOG_TEXT
+# Add the given text to calls made to syslog, to distinguish Lynx from other
+# applications which use that interface.
+#SYSLOG_TEXT:
+
+.h1 Internal Behavior
+.h2 BROKEN_FTP_RETR
+# Some ftp servers are known to have a broken implementation of RETR. If asked
+# to retrieve a directory, they get confused and fails subsequent commands such
+# as CWD and LIST. Workaround: reconnect after a failed RETR, which is slow.
+#
+# Each BROKEN_FTP_RETR gives a string match for the reported FTP server version
+#BROKEN_FTP_RETR:ProFTPD 1.2.5
+#BROKEN_FTP_RETR:spftp/
+
+.h2 BROKEN_FTP_EPSV
+# Some ftp servers are known to have a broken implementation of EPSV. The
+# server will hang for a long time when we attempt to connect after issuing
+# this command. Workaround: do not use EPSV, just use PASV.
+#
+# Each BROKEN_FTP_EPSV gives a string match for the reported FTP server version
+#BROKEN_FTP_EPSV:(Version wu-2.6.2-12)
+
+.h1 Appearance
+.h2 FTP_FORMAT
+# FTP_FORMAT defines the display for remote files.
+# It uses the same "%" codes as LIST_FORMAT.
+#FTP_FORMAT:%d %-16.16t %a %K
+
+.h1 Internal Behavior
+
+.h2 STATUS_BUFFER_SIZE
+# STATUS_BUFFER_SIZE controls the size of the buffer used for the LYNXMESSAGES
+# special url.
+#
+# The default size is 40.
+#STATUS_BUFFER_SIZE:40
+
+.h2 MAX_URI_SIZE
+# MAX_URI_SIZE controls the size of the buffer used for parsing URIs, e.g., the
+# HREF value in an anchor.
+#
+# The default size is 8192.
+#MAX_URI_SIZE:8192
+
+.h1 Appearance
+.h2 UNIQUE_URLS
+# UNIQUE_URLS can be set to tell Lynx to check for duplicate link numbers in
+# the page and corresponding lists, and reusing the original link number.
+# This can be set via command-line "-unique-urls".
+#UNIQUE_URLS:FALSE
+
+.h1 Character Sets
+.h2 MESSAGE_LANGUAGE
+# MESSAGE_LANGUAGE can be set to set the LANG environment variable explicitly.
+# This is mainly useful in non-Unix environments, e.g., Windows, since normally
+# LC_ALL is set, overriding LANG (as well as the more apt LC_MESSAGES variable).
+#MESSAGE_LANGUAGE:
+
+.h2 CONV_JISX0201KANA
+# If CONV_JISX0201KANA is set, Lynx will convert JIS X0201 Kana to JIS X0208
+# Kana, i.e., convert half-width kana to full-width.
+#CONV_JISX0201KANA:TRUE
+
+.h1 External Programs
+.h2 WAIT_VIEWER_TERMINATION
+# The WAIT_VIEWER_TERMINATION is used in the Windows environment to tell Lynx
+# to wait until a viewer has terminated.
+#WAIT_VIEWER_TERMINATION:FALSE
+
+.h1 Mail-related
+.h2 BLAT_MAIL
+# BLAT_MAIL is used in the Win32 port. It tells Lynx whether to use the
+# "blat" mailer, or the "sendmail" utility. Normally the "blat" mailer is
+# used for Win32, because the sendmail look-alikes have fewer features.
+# This feature can also be set/reset via the command-line "-noblat" option.
+#
+# Blat is available from
+.url http://www.blat.net
+#
+# See also ALT_BLAT_MAIL and SYSTEM_MAIL flags.
+#BLAT_MAIL:TRUE
+
+.h2 ALT_BLAT_MAIL
+# BLAT_MAIL is used in the Win32 port. It tells Lynx whether to use the
+# "blat" mailer, or the "blatj" utility. This feature can also be set/reset
+# via the command-line "-altblat" option.
+#
+# Some users prefer blatj, which can handle Japanese characters. It is
+# available from
+.url http://www.piedey.co.jp/blatj/
+# (caution - the page is in Japanese).
+#
+# See also BLAT_MAIL and SYSTEM_MAIL flags.
+#ALT_BLAT_MAIL:FALSE
+
+.h1 Internal Behavior
+.h2 TRACK_INTERNAL_LINKS
+# With `internal links' (links within a document to a location within the same
+# document) enabled, Lynx will distinguish between, for example, `<A
+# HREF="foo#frag">' and `<A HREF="#frag">' within a document whose URL is
+# `foo'. It may handle such links differently, although practical differences
+# would appear only if the document containing them resulted from a POST
+# request or had a no-cache flag set. This feature attempts to interpret
+# URL-references as suggested by RFC 2396, and to prevent mistaken
+# resubmissions of form content with the POST method. An alternate opinion
+# asserts that the feature could actually result in inappropriate resubmission
+# of form content.
+#TRACK_INTERNAL_LINKS:FALSE
+
+.h1 HTML Parsing
+
+.h2 DONT_WRAP_PRE
+# Inhibit wrapping of text when -dump'ing and -crawl'ing, mark
+# wrapped lines of <pre> in interactive session.
+#DONT_WRAP_PRE:FALSE
+
+.h2 FORCE_HTML
+# When true, this forces the first document specified on the command-line
+# to be interpreted as HTML.
+#FORCE_HTML:FALSE
+
+.h2 HIDDENLINKS
+# Control the display of hidden links, using one of the following names:
+#
+# MERGE
+# hidden links show up as bracketed numbers and are numbered
+# together with other links in the sequence of their occurrence
+# in the document.
+#
+# LISTONLY
+# hidden links are shown only on L)ist screens and listings
+# generated by -dump or from the P)rint menu, but appear
+# separately at the end of those lists. This is the default
+# behavior.
+#
+# IGNORE
+# hidden links do not appear even in listings.
+#
+#HIDDENLINKS:LISTONLY
+
+.h1 Appearance
+.h2 SHORT_URL
+# If true, show very long URLs in the status line with "..." to represent the
+# portion which cannot be displayed. The beginning and end of the URL are
+# displayed, rather than suppressing the end.
+#SHORT_URL:FALSE
+
+.h1 Dump/Crawl
+.h2 LISTONLY
+# For -dump, show only the list of links.
+#LISTONLY:FALSE
+
+.h2 LIST_INLINE
+# For -dump, show the links inline with the text.
+#LIST_INLINE:FALSE
+
+.h2 LOCALHOST
+# When true, this disables URLs that point to remote hosts.
+#LOCALHOST:FALSE
+
+.h2 WITH_BACKSPACES
+# Emit backspaces in output if -dump'ing or -crawl'ing (like 'man' does).
+#WITH_BACKSPACES:FALSE
+
+.h1 Internal Behavior
+.h2 HTTP_PROTOCOL
+# Normally Lynx negotiates HTTP/1.0, because it does not support chunked
+# transfer (a requirement for all HTTP/1.1 clients), although it supports
+# several other features of HTTP/1.1. You may encounter a server which does
+# not support HTTP/1.0 which can be used by switching to the later protocol.
+#HTTP_PROTOCOL:1.0
+
+.h2 GUESS_SCHEME
+# When true, Lynx may fill in a missing "scheme" for URIs which you provide.
+# This is different from URL_DOMAIN_PREFIXES and URL_DOMAIN_SUFFIXES.
+#
+# If no "scheme" (such as "http:", "ftp:") is given in a URI, Lynx first checks
+# if there is a corresponding local file which can be accessed directly.
+# Failing that, Lynx may inspect the URI to see if it begins with a prefix
+# which implies a scheme.
+#
+# Lynx uses these schemes for the corresponding prefixes:
+#
+# cso:
+# "cso."
+# "ns."
+# "ph."
+# ftp:
+# "ftp."
+# gopher:
+# "gopher."
+# http:
+# "www".
+# news:
+# "news."
+# nntp:
+# "nntp."
+# wais:
+# "wais."
+#
+# The default value FALSE disables this guess, telling Lynx to just assume that
+# "http:" was intended.
+#GUESS_SCHEME:FALSE
+
+.h2 REDIRECTION_LIMIT
+# HTTP 1.0 suggested a redirection-limit of 5; lynx doubled that. Some users
+# believe they can improve their experience with a higher limit.
+#REDIRECTION_LIMIT:10
+
+.h1 Appearance
+.h2 LIST_DECODED
+# For -dump, show URL-encoded links decoded.
+#LIST_DECODED:TRUE
diff --git a/lynx.hlp b/lynx.hlp
new file mode 100644
index 0000000..3b16496
--- /dev/null
+++ b/lynx.hlp
@@ -0,0 +1,1236 @@
+1 LYNX
+2 Name
+ lynx - a general purpose distributed information browser for the World
+ Wide Web
+
+2 Synopsis
+ lynx [options] [optional paths or URLs]
+
+ lynx [options] [path or URL] -get_data
+ data
+ --
+
+ lynx [options] [path or URL] -post_data
+ data
+ --
+
+ Use "lynx -help" to display a complete list of current options.
+
+2 Description
+ Lynx is a fully-featured World Wide Web (WWW) client for users running
+ cursor-addressable, character-cell display devices (e.g., vt100
+ terminals, vt100 emulators running on Windows 95/NT/XP/7/8 or any POSIX
+ platform, or any other "curses-oriented" display). It will display
+ hypertext markup language (HTML) documents containing links to files
+ residing on the local system, as well as files residing on remote
+ systems running Gopher, HTTP, FTP, WAIS, and NNTP servers. Current
+ versions of Lynx run on Unix, VMS, Windows 95/NT/XP/7/8, DOS DJGPP and
+ OS/2.
+
+ Lynx can be used to access information on the World Wide Web, or to
+ build information systems intended primarily for local access. For
+ example, Lynx has been used to build several Campus Wide Information
+ Systems (CWIS). In addition, Lynx can be used to build systems
+ isolated within a single LAN.
+
+2 Options
+ At start up, Lynx will load any local file or remote URL specified at
+ the command line. For help with URLs, press "?" or "H" while running
+ Lynx. Then follow the link titled, "Help on URLs."
+
+ If more than one local file or remote URL is listed on the command
+ line, Lynx will open only the last interactively. All of the names
+ (local files and remote URLs) are added to the G)oto history.
+
+ Lynx uses only long option names. Option names can begin with double
+ dash "--" as well, underscores and dashes can be intermixed in option
+ names (in the reference below, options are shown with one dash "-"
+ before them, and with underscores "_").
+
+ Lynx provides many command-line options. Some options require a value
+ (string, number or keyword). These are noted in the reference below.
+ The other options set boolean values in the program. There are three
+ types of boolean options: set, unset and toggle. If no option value is
+ given, these have the obvious meaning: set (to true), unset (to false),
+ or toggle (between true/false). For any of these, an explicit value
+ can be given in different forms to allow for operating system
+ constraints, e.g.,
+
+ -center:off
+ -center=off
+ -center-
+
+ Lynx recognizes "1", "+", "on" and "true" for true values, and "0",
+ "-", "off" and "false" for false values. Other option-values are
+ ignored.
+
+ The default boolean, number and string option values that are compiled
+ into Lynx are displayed in the help-message provided by lynx -help.
+ Some of those may differ according to how Lynx was built; see the help
+ message itself for these values. The -help option is processed in the
+ third pass of options-processing, so any option which sets a value, as
+ well as runtime configuration values are reflected in the help-message.
+
+ - If the argument is only "-", then Lynx expects to receive the
+ arguments from the standard input. This is to allow for the
+ potentially very long command line that can be associated with
+ the -get_data or -post_data arguments (see below). It can also
+ be used to avoid having sensitive information in the invoking
+ command line (which would be visible to other processes on most
+ systems), especially when the -auth or -pauth options are used.
+
+ -accept_all_cookies
+ accept all cookies.
+
+ -anonymous
+ apply restrictions for anonymous account, see also
+ -restrictions.
+
+ -assume_charset=MIMEname
+ charset for documents that do not specify it.
+
+ -assume_local_charset=MIMEname
+ charset assumed for local files, i.e., files which Lynx creates
+ such as internal pages for the options menu.
+
+ -assume_unrec_charset=MIMEname
+ use this instead of unrecognized charsets.
+
+ -auth=ID:PASSWD
+ set authorization ID and password for protected documents at
+ startup. Be sure to protect any script files which use this
+ switch.
+
+ -base prepend a request URL comment and BASE tag to text/html outputs
+ for -source dumps.
+
+ -bibhost=URL
+ specify a local bibp server (default http://bibhost/).
+
+ -blink forces high intensity background colors for color mode, if
+ available and supported by the terminal. This applies to the
+ slang library (for a few terminal emulators), or to OS/2 EMX
+ with ncurses.
+
+ -book use the bookmark page as the startfile. The default or command
+ line startfile is still set for the Main screen command, and
+ will be used if the bookmark page is unavailable or blank.
+
+ -buried_news
+ toggles scanning of news articles for buried references, and
+ converts them to news links. Not recommended because email
+ addresses enclosed in angle brackets will be converted to false
+ news links, and uuencoded messages can be trashed.
+
+ -cache=NUMBER
+ set the NUMBER of documents cached in memory. The default is
+ 10.
+
+ -case enable case-sensitive string searching.
+
+ -center
+ toggles center alignment in HTML TABLE. Normally table cells
+ are centered on the table grid. Set this option "on" to disable
+ centering. The default is "off".
+
+ -cfg=FILENAME
+ specifies a Lynx configuration file other than the default
+ lynx.cfg.
+
+ -child exit on left-arrow in startfile, and disable save to disk and
+ associated print/mail options.
+
+ -child_relaxed
+ exit on left-arrow in startfile, but allow save to disk and
+ associated print/mail options.
+
+ -cmd_log=FILENAME
+ write keystroke commands and related information to the
+ specified file.
+
+ -cmd_script=FILENAME
+ read keystroke commands from the specified file. You can use
+ the data written using the -cmd_log option. Lynx will ignore
+ other information which the command-logging may have written to
+ the logfile. Each line of the command script contains either a
+ comment beginning with "#", or a keyword:
+
+ exit
+ causes the script to stop, and forces Lynx to exit
+ immediately.
+
+ key
+ the character value, in printable form. Cursor and other
+ special keys are given as names, e.g., "Down Arrow".
+ Printable 7-bit ASCII codes are given as-is, and hexadecimal
+ values represent other 8-bit codes.
+
+ set
+ followed by a "name=value" allows one to override values set
+ in the lynx.cfg or .lynxrc files. Lynx tries the cfg-file
+ setting first.
+
+ -collapse_br_tags
+ toggles collapsing of BR tags.
+
+ -color forces color mode on, if available. Default color control
+ sequences which work for many terminal types are assumed if the
+ terminal capability description does not specify how to handle
+ color. Lynx needs to be compiled with the slang library for
+ this flag, it is equivalent to setting the COLORTERM environment
+ variable. (If color support is instead provided by a color-
+ capable curses library like ncurses, Lynx relies completely on
+ the terminal description to determine whether color mode is
+ possible, and this flag is not needed and thus unavailable.) A
+ saved show_color=always setting found in a .lynxrc file at
+ startup has the same effect. A saved show_color=never found in
+ .lynxrc on startup is overridden by this flag.
+
+ -connect_timeout=N
+ Sets the connection timeout, where N is given in seconds.
+
+ -cookie_file=FILENAME
+ specifies a file to use to read cookies. If none is specified,
+ the default value is ~/.lynx_cookies for most systems, but
+ ~/cookies for MS-DOS.
+
+ -cookie_save_file=FILENAME
+ specifies a file to use to store cookies. If none is specified,
+ the value given by -cookie_file is used.
+
+ -cookies
+ toggles handling of Set-Cookie headers.
+
+ -core toggles forced core dumps on fatal errors. Turn this option off
+ to ask Lynx to force a core dump if a fatal error occurs.
+
+ -crawl with -traversal, output each page to a file. with -dump, format
+ output as with -traversal, but to the standard output.
+
+ -curses_pads
+ toggles the use of curses "pad" feature which supports
+ left/right scrolling of the display. The feature is normally
+ available for curses configurations, but inactive. To activate
+ it, use the "|" character or the LINEWRAP_TOGGLE command.
+ Toggling this option makes the feature altogether unavailable.
+
+ -debug_partial
+ separate incremental display stages with MessageSecs delay
+
+ -default_colors
+ toggles the default-colors feature which is normally set in the
+ lynx.cfg file.
+
+ -delay add DebugSecs delay after each progress-message
+
+ -display=DISPLAY
+ set the display variable for X rexec-ed programs.
+
+ -display_charset=MIMEname
+ set the charset for the terminal output.
+
+ -dont_wrap_pre
+ inhibit wrapping of text when -dump'ing and -crawl'ing, mark
+ wrapped lines of <pre> in interactive session.
+
+ -dump dumps the formatted output of the default document or those
+ specified on the command line to standard output. Unlike
+ interactive mode, all documents are processed. This can be used
+ in the following way:
+
+ lynx -dump http://www.subir.com/lynx.html
+
+ Files specified on the command line are formatted as HTML if
+ their names end with one of the standard web suffixes such as
+ ".htm" or ".html". Use the -force_html option to format files
+ whose names do not follow this convention.
+
+ -editor=EDITOR
+ enable external editing, using the specified EDITOR. (vi, ed,
+ emacs, etc.)
+
+ -emacskeys
+ enable emacs-like key movement.
+
+ -enable_scrollback
+ toggles compatibility with communication programs' scrollback
+ keys (may be incompatible with some curses packages).
+
+ -error_file=FILE
+ define a file where Lynx will report HTTP access codes.
+
+ -exec enable local program execution (normally not configured).
+
+ -fileversions
+ include all versions of files in local VMS directory listings.
+
+ -find_leaks
+ toggle memory leak-checking. Normally this is not compiled-into
+ your executable, but when it is, it can be disabled for a
+ session.
+
+ -force_empty_hrefless_a
+ force HREF-less "A" elements to be empty (close them as soon as
+ they are seen).
+
+ -force_html
+ forces the first document to be interpreted as HTML.
+
+ This is most useful when processing files specified on the
+ command line which have an unrecognized suffix (or the suffix is
+ associated with a non-HTML type, such as ".txt" for plain text
+ files).
+
+ Lynx recognizes these file suffixes as HTML:
+
+ ".ht3",
+ ".htm",
+ ".html3",
+ ".html",
+ ".htmlx",
+ ".php3",
+ ".php",
+ ".phtml",
+ ".sht", and
+ ".shtml".
+
+ -force_secure
+ toggles forcing of the secure flag for SSL cookies.
+
+ -forms_options
+ toggles whether the Options Menu is key-based or form-based.
+
+ -from toggles transmissions of From headers.
+
+ -ftp disable ftp access.
+
+ -get_data
+ properly formatted data for a get form are read in from the
+ standard input and passed to the form. Input is terminated by a
+ line that starts with "---".
+
+ Lynx issues an HTTP GET, sending the form to the path or URL
+ given on the command-line and prints the response of the server.
+ If no path or URL is given, Lynx sends the form to the start-
+ page.
+
+ -head send a HEAD request for the mime headers.
+
+ -help print the Lynx command syntax usage message, and exit.
+
+ -hiddenlinks=[option]
+ control the display of hidden links.
+
+ merge
+ hidden links show up as bracketed numbers and are numbered
+ together with other links in the sequence of their occurrence
+ in the document.
+
+ listonly
+ hidden links are shown only on L)ist screens and listings
+ generated by -dump or from the P)rint menu, but appear
+ separately at the end of those lists. This is the default
+ behavior.
+
+ ignore
+ hidden links do not appear even in listings.
+
+ -historical
+ toggles use of ">" or "-->" as a terminator for comments.
+
+ -homepage=URL
+ set homepage separate from start page.
+
+ -image_links
+ toggles inclusion of links for all images.
+
+ -index=URL
+ set the default index file to the specified URL.
+
+ -ismap toggles inclusion of ISMAP links when client-side MAPs are
+ present.
+
+ -justify
+ do justification of text.
+
+ -link=NUMBER
+ starting count for lnk#.dat files produced by -crawl.
+
+ -list_decoded
+ for -dump, show URL-encoded links decoded.
+
+ -list_inline
+ for -dump, show the links inline with the text.
+
+ -listonly
+ for -dump, show only the list of links.
+
+ -localhost
+ disable URLs that point to remote hosts.
+
+ -locexec
+ enable local program execution from local files only (if Lynx
+ was compiled with local execution enabled).
+
+ -lss=FILENAME
+ specify filename containing color-style information. The
+ default is lynx.lss. If you give an empty filename, Lynx uses a
+ built-in monochrome scheme which imitates the non-color-style
+ configuration.
+
+ -mime_header
+ prints the MIME header of a fetched document along with its
+ source.
+
+ -minimal
+ toggles minimal versus valid comment parsing.
+
+ -nested_tables
+ toggles nested-tables logic (for debugging).
+
+ -newschunksize=NUMBER
+ number of articles in chunked news listings.
+
+ -newsmaxchunk=NUMBER
+ maximum news articles in listings before chunking.
+
+ -nobold
+ disable bold video-attribute.
+
+ -nobrowse
+ disable directory browsing.
+
+ -nocc disable Cc: prompts for self copies of mailings. Note that this
+ does not disable any CCs which are incorporated within a mailto
+ URL or form ACTION.
+
+ -nocolor
+ force color mode off, overriding terminal capabilities and any
+ -color flags, COLORTERM variable, and saved .lynxrc settings.
+
+ -noexec
+ disable local program execution. (DEFAULT)
+
+ -nofilereferer
+ disable transmissions of Referer headers for file URLs.
+
+ -nolist
+ disable the link list feature in dumps.
+
+ -nolog disable mailing of error messages to document owners.
+
+ -nomargins
+ disable left/right margins in the default style sheet.
+
+ -nomore
+ disable -more- string in statusline messages.
+
+ -nonrestarting_sigwinch
+ This flag is not available on all systems, Lynx needs to be
+ compiled with HAVE_SIGACTION defined. If available, this flag
+ may cause Lynx to react more immediately to window changes when
+ run within an xterm.
+
+ -nonumbers
+ disable link- and field-numbering. This overrides
+ -number_fields and -number_links.
+
+ -nopause
+ disable forced pauses for statusline messages.
+
+ -noprint
+ disable most print functions.
+
+ -noredir
+ prevents automatic redirection and prints a message with a link
+ to the new URL.
+
+ -noreferer
+ disable transmissions of Referer headers.
+
+ -noreverse
+ disable reverse video-attribute.
+
+ -nosocks
+ disable SOCKS proxy usage by a SOCKSified Lynx.
+
+ -nostatus
+ disable the retrieval status messages.
+
+ -notitle
+ disable title and blank line from top of page.
+
+ -nounderline
+ disable underline video-attribute.
+
+ -number_fields
+ force numbering of links as well as form input fields
+
+ -number_links
+ force numbering of links.
+
+ -partial
+ toggles display partial pages while loading.
+
+ -partial_thres=NUMBER
+ number of lines to render before repainting display with
+ partial-display logic
+
+ -passive_ftp
+ toggles passive ftp connections.
+
+ -pauth=ID:PASSWD
+ set authorization ID and password for a protected proxy server
+ at startup. Be sure to protect any script files which use this
+ switch.
+
+ -popup toggles handling of single-choice SELECT options via popup
+ windows or as lists of radio buttons.
+
+ -post_data
+ properly formatted data for a post form are read in from the
+ standard input and passed to the form. Input is terminated by a
+ line that starts with "---".
+
+ Lynx issues an HTTP POST, sending the form to the path or URL
+ given on the command-line and prints the response of the server.
+ If no path or URL is given, Lynx sends the form to the start-
+ page.
+
+ -preparsed
+ show HTML source preparsed and reformatted when used with
+ -source or in source view.
+
+ -prettysrc
+ show HTML source view with lexical elements and tags in color.
+
+ -print enable print functions. (default)
+
+ -pseudo_inlines
+ toggles pseudo-ALTs for inline images with no ALT string.
+
+ -raw toggles default setting of 8-bit character translations or CJK
+ mode for the startup character set.
+
+ -realm restricts access to URLs in the starting realm.
+
+ -read_timeout=N
+ Sets the read-timeout, where N is given in seconds.
+
+ -reload
+ flushes the cache on a proxy server (only the first document
+ given on the command-line is affected).
+
+ -restrictions=[option][,option][,option]...
+ allows a list of services to be disabled selectively. Dashes
+ and underscores in option names can be intermixed. The
+ following list is printed if no options are specified.
+
+ all
+ restricts all options listed below.
+
+ bookmark
+ disallow changing the location of the bookmark file.
+
+ bookmark_exec
+ disallow execution links via the bookmark file.
+
+ change_exec_perms
+ disallow changing the eXecute permission on files (but still
+ allow it for directories) when local file management is
+ enabled.
+
+ default
+ same as command line option -anonymous. Disables default
+ services for anonymous users. Set to all restricted, except
+ for: inside_telnet, outside_telnet, inside_ftp, outside_ftp,
+ inside_rlogin, outside_rlogin, inside_news, outside_news,
+ telnet_port, jump, mail, print, exec, and goto. The settings
+ for these, as well as additional goto restrictions for
+ specific URL schemes that are also applied, are derived from
+ definitions within userdefs.h.
+
+ dired_support
+ disallow local file management.
+
+ disk_save
+ disallow saving to disk in the download and print menus.
+
+ dotfiles
+ disallow access to, or creation of, hidden (dot) files.
+
+ download
+ disallow some downloaders in the download menu (does not
+ imply disk_save restriction).
+
+ editor
+ disallow external editing.
+
+ exec
+ disable execution scripts.
+
+ exec_frozen
+ disallow the user from changing the local execution option.
+
+ externals
+ disallow some "EXTERNAL" configuration lines if support for
+ passing URLs to external applications (with the EXTERN
+ command) is compiled in.
+
+ file_url
+ disallow using G)oto, served links or bookmarks for file:
+ URLs.
+
+ goto
+ disable the "g" (goto) command.
+
+ inside_ftp
+ disallow ftps for people coming from inside your domain (utmp
+ required for selectivity).
+
+ inside_news
+ disallow USENET news posting for people coming from inside
+ your domain (utmp required for selectivity).
+
+ inside_rlogin
+ disallow rlogins for people coming from inside your domain
+ (utmp required for selectivity).
+
+ inside_telnet
+ disallow telnets for people coming from inside your domain
+ (utmp required for selectivity).
+
+ jump
+ disable the "j" (jump) command.
+
+ multibook
+ disallow multiple bookmarks.
+
+ mail
+ disallow mail.
+
+ news_post
+ disallow USENET News posting.
+
+ options_save
+ disallow saving options in .lynxrc.
+
+ outside_ftp
+ disallow ftps for people coming from outside your domain
+ (utmp required for selectivity).
+
+ outside_news
+ disallow USENET news reading and posting for people coming
+ from outside your domain (utmp required for selectivity).
+ This restriction applies to "news", "nntp", "newspost", and
+ "newsreply" URLs, but not to "snews", "snewspost", or
+ "snewsreply" in case they are supported.
+
+ outside_rlogin
+ disallow rlogins for people coming from outside your domain
+ (utmp required for selectivity).
+
+ outside_telnet
+ disallow telnets for people coming from outside your domain
+ (utmp required for selectivity).
+
+ print
+ disallow most print options.
+
+ shell
+ disallow shell escapes and lynxexec or lynxprog G)oto's.
+
+ suspend
+ disallow Unix Control-Z suspends with escape to shell.
+
+ telnet_port
+ disallow specifying a port in telnet G)oto's.
+
+ useragent
+ disallow modifications of the User-Agent header.
+
+ -resubmit_posts
+ toggles forced resubmissions (no-cache) of forms with method
+ POST when the documents they returned are sought with the
+ PREV_DOC command or from the History List.
+
+ -rlogin
+ disable recognition of rlogin commands.
+
+ -scrollbar
+ toggles showing scrollbar.
+
+ -scrollbar_arrow
+ toggles showing arrows at ends of the scrollbar.
+
+ -selective
+ require .www_browsable files to browse directories.
+
+ -session=FILENAME
+ resumes from specified file on startup and saves session to that
+ file on exit.
+
+ -sessionin=FILENAME
+ resumes session from specified file.
+
+ -sessionout=FILENAME
+ saves session to specified file.
+
+ -short_url
+ show very long URLs in the status line with "..." to represent
+ the portion which cannot be displayed. The beginning and end of
+ the URL are displayed, rather than suppressing the end.
+
+ -show_cfg
+ Print the configuration settings, e.g., as read from "lynx.cfg",
+ and exit.
+
+ -show_cursor
+ If enabled the cursor will not be hidden in the right hand
+ corner but will instead be positioned at the start of the
+ currently selected link. Show cursor is the default for systems
+ without FANCY_CURSES capabilities. The default configuration
+ can be changed in userdefs.h or lynx.cfg. The command line
+ switch toggles the default.
+
+ -show_rate
+ If enabled the transfer rate is shown in bytes/second. If
+ disabled, no transfer rate is shown. Use lynx.cfg or the
+ options menu to select KB/second and/or ETA.
+
+ -socks5_proxy=URL
+ (Via which) SOCKS5 proxy to connect: any network traffic,
+ including all DNS resolutions but the one for URL itself, will
+ be redirected through the SOCKS5 proxy. URL may be given as
+ "proxy.example.com", "proxy.example.com:1080", "192.168.0.1", or
+ "192.168.0.1:1080" (and IPv6 notation if so supported). A
+ SOCKS5 proxy may also be specified via the environment variable
+ SOCKS5_PROXY. This option controls the builtin SOCKS5 support,
+ which is unrelated to the option -nosocks.
+
+ -soft_dquotes
+ toggles emulation of the old Netscape and Mosaic bug which
+ treated ">" as a co-terminator for double-quotes and tags.
+
+ -source
+ works the same as dump but outputs HTML source instead of
+ formatted text. For example
+
+ lynx -source . >foo.html
+
+ generates HTML source listing the files in the current
+ directory. Each file is marked by an HREF relative to the
+ parent directory. Add a trailing slash to make the HREF's
+ relative to the current directory:
+
+ lynx -source ./ >foo.html
+
+ -stack_dump
+ disable SIGINT cleanup handler
+
+ -startfile_ok
+ allow non-http startfile and homepage with -validate.
+
+ -stderr
+ When dumping a document using -dump or -source, Lynx normally
+ does not display alert (error) messages that you see on the
+ screen in the status line. Use the -stderr option to tell Lynx
+ to write these messages to the standard error.
+
+ -stdin read the startfile from standard input (UNIX only).
+
+ -syslog=text
+ information for syslog call.
+
+ -syslog_urls
+ log requested URLs with syslog.
+
+ -tagsoup
+ initialize parser, using Tag Soup DTD rather than SortaSGML.
+
+ -telnet
+ disable recognition of telnet commands.
+
+ -term=TERM
+ tell Lynx what terminal type to assume it is talking to. (This
+ may be useful for remote execution, when, for example, Lynx
+ connects to a remote TCP/IP port that starts a script that, in
+ turn, starts another Lynx process.)
+
+ -timeout=N
+ For win32, sets the network read-timeout, where N is given in
+ seconds.
+
+ -tlog toggles between using a Lynx Trace Log and stderr for trace
+ output from the session.
+
+ -tna turns on "Textfields Need Activation" mode.
+
+ -trace turns on Lynx trace mode. Destination of trace output depends
+ on -tlog.
+
+ -trace_mask=value
+ turn on optional traces, which may result in very large trace
+ files. Logically OR the values to combine options:
+
+ 1 SGML character parsing states
+
+ 2 color-style
+
+ 4 TRST (table layout)
+
+ 8 configuration (lynx.cfg, .lynxrc, .lynx-keymaps, mime.types
+ and mailcap contents)
+
+ 16 binary string copy/append, used in form data construction.
+
+ 32 cookies
+
+ 64 character sets
+
+ 128
+ GridText parsing
+
+ 256
+ timing
+
+ 512
+ detailed URL parsing
+
+ -traversal
+ traverse all http links derived from startfile. When used with
+ -crawl, each link that begins with the same string as startfile
+ is output to a file, intended for indexing.
+
+ See CRAWL.announce for more information.
+
+ -trim_blank_lines
+ toggles trimming of trailing blank lines as well as the related
+ trimming of blank lines while collapsing BR tags.
+
+ -trim_input_fields
+ trim input text/textarea fields in forms.
+
+ -underline_links
+ toggles use of underline/bold attribute for links.
+
+ -underscore
+ toggles use of _underline_ format in dumps.
+
+ -unique_urls
+ check for duplicate link numbers in each page and corresponding
+ lists, and reuse the original link number.
+
+ -update_term_title
+ enables updating the title in terminal emulators. Use only if
+ your terminal emulator supports that escape code. Has no effect
+ when used with -notitle.
+
+ -use_mouse
+ turn on mouse support, if available. Clicking the left mouse
+ button on a link traverses it. Clicking the right mouse button
+ pops back. Click on the top line to scroll up. Click on the
+ bottom line to scroll down. The first few positions in the top
+ and bottom line may invoke additional functions. Lynx must be
+ compiled with ncurses or slang to support this feature. If
+ ncurses is used, clicking the middle mouse button pops up a
+ simple menu. Mouse clicks may only work reliably while Lynx is
+ idle waiting for input.
+
+ -useragent=Name
+ set alternate Lynx User-Agent header.
+
+ -validate
+ accept only http URLs (for validation). Complete security
+ restrictions also are implemented.
+
+ -verbose
+ toggle [LINK], [IMAGE] and [INLINE] comments with filenames of
+ these images.
+
+ -version
+ print version information, and exit.
+
+ -vikeys
+ enable vi-like key movement.
+
+ -wdebug
+ enable Waterloo tcp/ip packet debug (print to watt debugfile).
+ This applies only to DOS versions compiled with WATTCP or
+ WATT-32.
+
+ -width=NUMBER
+ number of columns for formatting of dumps, default is 80. This
+ is limited by the number of columns that Lynx could display,
+ typically 1024 (the MAX_LINE symbol).
+
+ -with_backspaces
+ emit backspaces in output if -dump'ing or -crawl'ing (like man
+ does)
+
+ -xhtml_parsing
+ tells Lynx that it can ignore certain tags which have no content
+ in an XHTML 1.0 document. For example "<p/>" will be discarded.
+
+2 Commands
+ More than one key can be mapped to a given command. Here are some of
+ the most useful:
+
+ * Use Up arrow and Down arrow to scroll through hypertext links.
+
+ * Right arrow or Return will follow a highlighted hypertext link.
+
+ * Left Arrow or "u" will retreat from a link.
+
+ * Type "H", "?", or F1 for online help and descriptions of key-stroke
+ commands.
+
+ * Type "k" or "K" for a list of the current key-stroke command
+ mappings.
+
+ If the same command is mapped to the same letter differing only by
+ upper/lowercase only the lowercase mapping is shown.
+
+ * Type Delete to view history list.
+
+2 Environment
+ In addition to various "standard" environment variables such as HOME,
+ PATH, USER, DISPLAY, TMPDIR, etc, Lynx utilizes several Lynx-specific
+ environment variables, if they exist.
+
+ Others may be created or modified by Lynx to pass data to an external
+ program, or for other reasons. These are listed separately below.
+
+ See also the sections on SIMULATED CGI SUPPORT and NATIVE LANGUAGE
+ SUPPORT, below.
+
+ Note: Not all environment variables apply to all types of platforms
+ supported by Lynx, though most do. Feedback on platform dependencies
+ is solicited.
+
+ Environment Variables Used By Lynx:
+
+ COLORTERM If set, color capability for the terminal is forced
+ on at startup time. The actual value assigned to
+ the variable is ignored. This variable is only
+ meaningful if Lynx was built using the slang
+ screen-handling library.
+
+ LYNX_CFG This variable, if set, will override the default
+ location and name of the global configuration file
+ (normally, lynx.cfg) that was defined by the
+ LYNX_CFG_FILE constant in the userdefs.h file,
+ during installation.
+
+ See the userdefs.h file for more information.
+
+ LYNX_CFG_PATH If set, this variable overrides the compiled-in
+ search-list of directories used to find the
+ configuration files, e.g., lynx.cfg and lynx.lss.
+ The list is delimited with ":" (or ";" for Windows)
+ like the PATH environment variable.
+
+ LYNX_HELPFILE If set, this variable overrides the compiled-in URL
+ and configuration file URL for the Lynx help file.
+
+ LYNX_LOCALEDIR If set, this variable overrides the compiled-in
+ location of the locale directory which contains
+ native language (NLS) message text.
+
+ LYNX_LSS This variable, if set, specifies the location of
+ the default Lynx character style sheet file.
+ [Currently only meaningful if Lynx was built using
+ curses color style support.]
+
+ LYNX_SAVE_SPACE This variable, if set, will override the default
+ path prefix for files saved to disk that is defined
+ in the lynx.cfg SAVE_SPACE: statement.
+
+ See the lynx.cfg file for more information.
+
+ LYNX_TEMP_SPACE This variable, if set, will override the default
+ path prefix for temporary files that was defined
+ during installation, as well as any value that may
+ be assigned to the TMPDIR variable.
+
+ MAIL This variable specifies the default inbox Lynx will
+ check for new mail, if such checking is enabled in
+ the lynx.cfg file.
+
+ NEWS_ORGANIZATION This variable, if set, provides the string used in
+ the Organization: header of USENET news postings.
+ It will override the setting of the ORGANIZATION
+ environment variable, if it is also set (and, on
+ UNIX, the contents of an /etc/organization file, if
+ present).
+
+ NNTPSERVER If set, this variable specifies the default NNTP
+ server that will be used for USENET news reading
+ and posting with Lynx, via news: URL's.
+
+ ORGANIZATION This variable, if set, provides the string used in
+ the Organization: header of USENET news postings.
+ On UNIX, it will override the contents of an
+ /etc/organization file, if present.
+
+ PROTOCOL_proxy Lynx supports the use of proxy servers that can act
+ as firewall gateways and caching servers. They are
+ preferable to the older gateway servers (see
+ WWW_access_GATEWAY, below).
+
+ Each protocol used by Lynx, (http, ftp, gopher,
+ etc), can be mapped separately by setting
+ environment variables of the form PROTOCOL_proxy.
+ Protocols are indicated in a URI by the name before
+ ":", e.g., "http" in "http://some.server.dom:port/"
+ for HTML.
+
+ Depending on your system configuration and
+ supported protocols, the environment variables
+ recognized by lynx may include
+
+ cso_proxy
+ finger_proxy
+ ftp_proxy
+ gopher_proxy
+ https_proxy
+ http_proxy
+ newspost_proxy
+ newsreply_proxy
+ news_proxy
+ nntp_proxy
+ no_proxy
+ snewspost_proxy
+ snewsreply_proxy
+ snews_proxy
+ wais_proxy
+
+ See Lynx Users Guide for additional details and
+ examples.
+
+ SOCKS5_PROXY Is inspected if -socks5_proxy has not been used
+ (for the same content).
+
+ SSL_CERT_DIR Set to the directory containing trusted
+ certificates.
+
+ SSL_CERT_FILE Set to the full path and filename for your file of
+ trusted certificates.
+
+ WWW_access_GATEWAY Lynx still supports use of gateway servers, with
+ the servers specified via "WWW_access_GATEWAY"
+ variables (where "access" is lower case and can be
+ "http", "ftp", "gopher" or "wais"). However most
+ gateway servers have been discontinued. Note that
+ you do not include a terminal "/" for gateways, but
+ do for proxies specified by PROTOCOL_proxy
+ environment variables.
+
+ See Lynx Users Guide for details.
+
+ WWW_HOME This variable, if set, will override the default
+ startup URL specified in any of the Lynx
+ configuration files.
+
+ Environment Variables Set or Modified By Lynx:
+
+ LYNX_PRINT_DATE This variable is set by the Lynx p(rint) function,
+ to the Date: string seen in the document's
+ "Information about" page (= cmd), if any. It is
+ created for use by an external program, as defined
+ in a lynx.cfg PRINTER: definition statement. If
+ the field does not exist for the document, the
+ variable is set to a null string under UNIX, or "No
+ Date" under VMS.
+
+ LYNX_PRINT_LASTMOD This variable is set by the Lynx p(rint) function,
+ to the Last Mod: string seen in the document's
+ "Information about" page (= cmd), if any. It is
+ created for use by an external program, as defined
+ in a lynx.cfg PRINTER: definition statement. If
+ the field does not exist for the document, the
+ variable is set to a null string under UNIX, or "No
+ LastMod" under VMS.
+
+ LYNX_PRINT_TITLE This variable is set by the Lynx p(rint) function,
+ to the Linkname: string seen in the document's
+ "Information about" page (= cmd), if any. It is
+ created for use by an external program, as defined
+ in a lynx.cfg PRINTER: definition statement. If
+ the field does not exist for the document, the
+ variable is set to a null string under UNIX, or "No
+ Title" under VMS.
+
+ LYNX_PRINT_URL This variable is set by the Lynx p(rint) function,
+ to the URL: string seen in the document's
+ "Information about" page (= cmd), if any. It is
+ created for use by an external program, as defined
+ in a lynx.cfg PRINTER: definition statement. If
+ the field does not exist for the document, the
+ variable is set to a null string under UNIX, or "No
+ URL" under VMS.
+
+ LYNX_TRACE If set, causes Lynx to write a trace file as if the
+ -trace option were supplied.
+
+ LYNX_TRACE_FILE If set, overrides the compiled-in name of the trace
+ file, which is either Lynx.trace or LY-TRACE.LOG
+ (the latter on the DOS/Windows platforms). The
+ trace file is in either case relative to the home
+ directory.
+
+ LYNX_VERSION This variable is always set by Lynx, and may be
+ used by an external program to determine if it was
+ invoked by Lynx.
+
+ See also the comments in the distribution's sample
+ mailcap file, for notes on usage in such a file.
+
+ TERM Normally, this variable is used by Lynx to
+ determine the terminal type being used to invoke
+ Lynx. If, however, it is unset at startup time (or
+ has the value "unknown"), or if the -term command-
+ line option is used (see OPTIONS section above),
+ Lynx will set or modify its value to the user
+ specified terminal type (for the Lynx execution
+ environment). Note: If set/modified by Lynx, the
+ values of the LINES and/or COLUMNS environment
+ variables may also be changed.
+
+2 Simulated Cgi Support
+ If built with the cgi-links option enabled, Lynx allows access to a cgi
+ script directly without the need for an http daemon.
+
+ When executing such "lynxcgi scripts" (if enabled), the following
+ variables may be set for simulating a CGI environment:
+
+ CONTENT_LENGTH
+
+ CONTENT_TYPE
+
+ DOCUMENT_ROOT
+
+ HTTP_ACCEPT_CHARSET
+
+ HTTP_ACCEPT_LANGUAGE
+
+ HTTP_USER_AGENT
+
+ PATH_INFO
+
+ PATH_TRANSLATED
+
+ QUERY_STRING
+
+ REMOTE_ADDR
+
+ REMOTE_HOST
+
+ REQUEST_METHOD
+
+ SERVER_SOFTWARE
+
+ Other environment variables are not inherited by the script, unless
+ they are provided via a LYNXCGI_ENVIRONMENT statement in the
+ configuration file. See the lynx.cfg file, and the (draft) CGI 1.1
+ Specification <http://Web.Golux.Com/coar/cgi/draft-coar-cgi-v11-00.txt>
+ for the definition and usage of these variables.
+
+ The CGI Specification, and other associated documentation, should be
+ consulted for general information on CGI script programming.
+
+2 Native Language Support
+ If configured and installed with Native Language Support, Lynx will
+ display status and other messages in your local language. See the file
+ ABOUT_NLS in the source distribution, or at your local GNU site, for
+ more information about internationalization.
+
+ The following environment variables may be used to alter default
+ settings:
+
+ LANG This variable, if set, will override the default
+ message language. It is an ISO 639 two-letter code
+ identifying the language. Language codes are NOT
+ the same as the country codes given in ISO 3166.
+
+ LANGUAGE This variable, if set, will override the default
+ message language. This is a GNU extension that has
+ higher priority for setting the message catalog
+ than LANG or LC_ALL.
+
+ LC_ALL and
+
+ LC_MESSAGES These variables, if set, specify the notion of
+ native language formatting style. They are POSIXly
+ correct.
+
+ LINGUAS This variable, if set prior to configuration,
+ limits the installed languages to specific values.
+ It is a space-separated list of two-letter codes.
+ Currently, it is hard-coded to a wish list.
+
+ NLSPATH This variable, if set, is used as the path prefix
+ for message catalogs.
+
+2 Notes
+ This is the manual for Lynx v2.9.0dev.5; development is in progress for
+ 2.9.0.
+
+ If you wish to contribute to the further development of Lynx, subscribe
+ to our mailing list. Send email to <lynx-dev-request@nongnu.org> with
+ "subscribe lynx-dev" as the only line in the body of your message.
+
+ Send bug reports, comments, suggestions to <lynx-dev@nongnu.org> after
+ subscribing.
+
+ Unsubscribe by sending email to <lynx-dev-request@nongnu.org> with
+ "unsubscribe lynx-dev" as the only line in the body of your message.
+ Do not send the unsubscribe message to the lynx-dev list, itself.
+
+2 See Also
+ catgets(3), curses(3), environ(7), execve(2), ftp(1), gettext(GNU),
+ localeconv(3), ncurses(3), setlocale(3), slang(?), termcap(5),
+ terminfo(5), wget(GNU)
+
+ Note that man page availability and section numbering is somewhat platform
+ dependent, and may vary from the above references.
+
+ A section shown as (GNU), is intended to denote that the topic may be
+ available via an info page, instead of a man page (i.e., try "info subject",
+ rather than "man subject").
+
+ A section shown as (?) denotes that documentation on the topic exists,
+ but is not part of an established documentation retrieval system (see
+ the distribution files associated with the topic, or contact your System
+ Administrator for further information).
+
+2 Acknowledgments
+ Lynx has incorporated code from a variety of sources along the way.
+ The earliest versions of Lynx included code from Earl Fogel of Comput-
+ ing Services at the University of Saskatchewan, who implemented HYPER-
+ REZ in the Unix environment. HYPERREZ was developed by Niel Larson of
+ Think.com and served as the model for the early versions of Lynx.
+ Those versions also incorporated libraries from the Unix Gopher clients
+ developed at the University of Minnesota, and the later versions of
+ Lynx rely on the WWW client library code developed by Tim Berners-Lee
+ and the WWW community. Also a special thanks to Foteos Macrides who
+ ported much of Lynx to VMS and did or organized most of its development
+ since the departures of Lou Montulli and Garrett Blythe from the Uni-
+ versity of Kansas in the summer of 1994 through the release of v2.7.2,
+ and to everyone on the net who has contributed to Lynx's development
+ either directly (through patches, comments or bug reports) or indirect-
+ ly (through inspiration and development of other systems).
+
+2 Authors
+ Lou Montulli, Garrett Blythe, Craig Lavender, Michael Grobe, Charles
+ Rezac
+ Academic Computing Services
+ University of Kansas
+ Lawrence, Kansas 66047
+
+ Foteos Macrides
+ Worcester Foundation for Biomedical Research
+ Shrewsbury, Massachusetts 01545
+
+ Thomas E. Dickey
+ <dickey@invisible-island.net>
diff --git a/lynx.man b/lynx.man
new file mode 100644
index 0000000..3b114ca
--- /dev/null
+++ b/lynx.man
@@ -0,0 +1,1404 @@
+.\" $LynxId: lynx.man,v 1.132 2021/03/14 20:42:46 tom Exp $
+.\" **************************************************************************
+.\" Escape single quotes in literal strings from groff's Unicode transform.
+.ie \n(.g .ds `` \(lq
+.el .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el .ds '' ''
+.de bP
+.ie n .IP \(bu 4
+.el .IP \(bu 2
+..
+.de NS
+.ie n .sp
+.el .sp .5
+.ie n .in +4
+.el .in +2
+.nf
+.ft C \" Courier
+..
+.de NE
+.fi
+.ft R
+.ie n .in -4
+.el .in -2
+..
+.\" **************************************************************************
+.TH LYNX 1
+.SH NAME
+lynx \- a general purpose distributed information browser for the World Wide Web
+.SH SYNOPSIS
+.B lynx \fI[options] [optional paths or URLs]
+.sp
+.B lynx \fI[options] [path or URL]\fP \fB\-get_data
+.br
+.I data
+.br
+.B \-\-
+.sp
+.B lynx \fI[options] [path or URL]\fP \fB\-post_data
+.br
+.I data
+.br
+.B \-\-
+.PP
+Use \*(``lynx \-help\*('' to display a complete list of current options.
+.SH DESCRIPTION
+.hy 0
+.I
+Lynx
+is a fully-featured World Wide Web (WWW) client for users
+running cursor-addressable, character-cell display devices
+(e.g., vt100 terminals,
+vt100 emulators running on Windows 95/NT/XP/7/8 or any POSIX platform,
+or any other \*(``curses-oriented\*('' display).
+It will display hypertext
+markup language (HTML) documents containing links to
+files residing on the local system, as well as files residing on
+remote systems running Gopher, HTTP, FTP, WAIS, and NNTP servers.
+Current versions of
+.I
+Lynx
+run on
+Unix, VMS, Windows 95/NT/XP/7/8, DOS DJGPP and OS/2.
+.PP
+.I
+Lynx
+can be used to access information on the World Wide Web, or
+to build information systems intended primarily for local access.
+For example,
+.I
+Lynx
+has been used to build several Campus Wide
+Information Systems (CWIS).
+In addition,
+.I
+Lynx
+can be used to
+build systems isolated within a single LAN.
+.SH OPTIONS
+At start up, \fILynx\fR will load any local
+file or remote URL specified at the command line.
+For help with URLs, press \*(``\fB?\fR\*(''
+or \*(``\fBH\fR\*('' while running \fILynx\fR.
+Then follow the link titled, \*(``Help on URLs.\*(''
+.PP
+If more than one local file or remote URL is listed on the command line,
+\fILynx\fP will open only the last interactively.
+All of the names (local files and remote URLs)
+are added to the \fBG)oto\fP history.
+.PP
+\fILynx\fR uses only long option names.
+Option names can begin with double dash \*(``\-\-\*('' as well,
+underscores and dashes can be intermixed in
+option names (in the reference below, options
+are shown
+with one dash \*(``\-\*('' before them, and
+with underscores \*(``_\*('').
+.PP
+\fILynx\fR provides many command-line options.
+Some options require a value (string, number or keyword).
+These are noted in the reference below.
+The other options set boolean values in the program.
+There are three types of boolean options: set, unset and toggle.
+If no option value is given, these have the obvious meaning:
+set (to true), unset (to false), or toggle (between true/false).
+For any of these, an explicit value can be given in different
+forms to allow for operating system constraints,
+e.g.,
+.NS
+\fB\-center:off\fP
+\fB\-center=off\fP
+\fB\-center\-\fP
+.NE
+.PP
+\fILynx\fR recognizes
+\*(``1\*('', \*(``+\*('', \*(``on\*('' and \*(``true\*('' for true values, and
+\*(``0\*('', \*(``\-\*('', \*(``off\*('' and \*(``false\*('' for false values.
+Other option-values are ignored.
+.PP
+The default boolean, number and string option values that are compiled
+into \fILynx\fP are displayed in the help-message provided by \fBlynx \-help\fP.
+Some of those may differ according to how \fILynx\fP was built;
+see the help message itself for these values.
+The \fB\-help\fP option is processed in the third pass of options-processing,
+so any option which sets a value,
+as well as runtime configuration values are reflected in the help-message.
+.TP 7
+.B \-
+If the argument is only \*(``\-\*('', then \fILynx\fP expects to receive
+the arguments from the standard input.
+This is to allow for the
+potentially very long command line that can be associated
+with the \fB\-get_data\fR or \fB\-post_data\fR arguments (see below).
+It can also be used to avoid having sensitive information
+in the invoking command line (which would be visible to
+other processes on most systems), especially when
+the \fB\-auth\fR or \fB\-pauth\fR options are used.
+.TP
+.B \-accept_all_cookies
+accept all cookies.
+.TP
+.B \-anonymous
+apply restrictions for anonymous account, see also \fB\-restrictions\fR.
+.TP
+.B \-assume_charset\fR=\fIMIMEname
+charset for documents that do not specify it.
+.TP
+.B \-assume_local_charset\fR=\fIMIMEname
+charset assumed for local files,
+i.e., files which \fILynx\fP creates such as
+internal pages for the options menu.
+.TP
+.B \-assume_unrec_charset\fR=\fIMIMEname
+use this instead of unrecognized charsets.
+.TP
+.B \-auth\fR=\fIID\fR:\fIPASSWD
+set authorization ID and password for protected documents at startup.
+Be sure to protect any script files which use
+this switch.
+.TP
+.B \-base
+prepend a request URL comment and BASE tag to text/html
+outputs for \fB\-source\fR dumps.
+.TP
+.B \-bibhost\fR=\fIURL
+specify a local bibp server (default http://bibhost/).
+.TP
+.B \-blink
+forces high intensity background colors for color mode, if available
+and supported by the terminal.
+This applies to the \fBslang\fR library (for a few terminal emulators),
+or to OS/2 EMX with \fBncurses\fR.
+.TP
+.B \-book
+use the bookmark page as the startfile.
+The default or command
+line startfile is still set for the Main screen command, and will
+be used if the bookmark page is unavailable or blank.
+.TP
+.B \-buried_news
+toggles scanning of news articles for buried references, and
+converts them to news links.
+Not recommended because email
+addresses enclosed in angle brackets will be converted to
+false news links, and uuencoded messages can be trashed.
+.TP
+.B \-cache\fR=\fINUMBER
+set the NUMBER of documents cached in memory.
+The default is 10.
+.TP
+.B \-case
+enable case-sensitive string searching.
+.TP
+.B \-center
+toggles center alignment in HTML TABLE.
+Normally table cells are centered on the table grid.
+Set this option \*(``on\*('' to disable centering.
+The default is \*(``off\*(''.
+.TP
+.B \-cfg\fR=\fIFILENAME
+specifies a \fILynx\fP configuration file other than the default
+lynx.cfg.
+.TP
+.B \-child
+exit on left-arrow in startfile, and disable save to disk and associated
+print/mail options.
+.TP
+.B \-child_relaxed
+exit on left-arrow in startfile, but allow save to disk and associated
+print/mail options.
+.TP
+.B \-cmd_log\fR=\fIFILENAME
+write keystroke commands and related information to the specified file.
+.TP
+.B \-cmd_script\fR=\fIFILENAME
+read keystroke commands from the specified file.
+You can use the data written using the \fB\-cmd_log\fR option.
+\fILynx\fP will ignore other information which the command-logging may have
+written to the logfile.
+Each line of the command script contains either
+a comment beginning with \*(``#\*('',
+or a keyword:
+.RS
+.TP 3
+.B exit
+causes the script to stop, and forces \fILynx\fP to exit immediately.
+.TP
+.B key
+the character value, in printable form.
+Cursor and other special keys are given as names, e.g., \*(``Down Arrow\*(''.
+Printable 7-bit ASCII codes are given as-is,
+and hexadecimal values represent other 8-bit codes.
+.TP
+.B set
+followed by a \*(``name=value\*('' allows one to override values set in the
+lynx.cfg or \&.lynxrc files.
+\fILynx\fP tries the cfg-file setting first.
+.RE
+.TP
+.B \-collapse_br_tags
+toggles collapsing of BR tags.
+.TP
+.B \-color
+forces color mode on, if available.
+Default color control sequences
+which work for many terminal types are assumed if the terminal
+capability description does not specify how to handle color.
+\fILynx\fP needs to be compiled with the \fBslang\fR library for this flag,
+it is equivalent to setting the \fBCOLORTERM\fR environment variable.
+(If color support is instead provided by a color-capable curses
+library like \fBncurses\fR, \fILynx\fP relies completely on the terminal
+description to determine whether color mode is possible, and
+this flag is not needed and thus unavailable.)
+A saved show_color=always setting found in a \&.lynxrc file at
+startup has the same effect.
+A saved show_color=never found
+in \&.lynxrc on startup is overridden by this flag.
+.TP
+.B \-connect_timeout\fR=\fIN
+Sets the connection timeout, where N is given in seconds.
+.TP
+.B \-cookie_file\fR=\fIFILENAME
+specifies a file to use to read cookies.
+If none is specified, the default value is ~/.lynx_cookies
+for most systems, but ~/cookies for MS-DOS.
+.TP
+.B \-cookie_save_file\fR=\fIFILENAME
+specifies a file to use to store cookies.
+If none is specified, the value given by
+\fB\-cookie_file\fR is used.
+.TP
+.B \-cookies
+toggles handling of Set-Cookie headers.
+.TP
+.B \-core
+toggles forced core dumps on fatal errors.
+Turn this option off to ask \fILynx\fP to force
+a core dump if a fatal error occurs.
+.TP
+.B \-crawl
+with \fB\-traversal,\fR output each page to a file.
+with \fB\-dump\fR, format output as with \fB\-traversal\fR,
+but to the standard output.
+.TP
+.B \-curses_pads
+toggles the use of curses \*(``pad\*('' feature which supports
+left/right scrolling of the display.
+The feature is normally available for curses configurations,
+but inactive.
+To activate it, use the \*(``|\*('' character or the LINEWRAP_TOGGLE command.
+Toggling this option makes the feature altogether unavailable.
+.TP
+.B \-debug_partial
+separate incremental display stages with MessageSecs delay
+.TP
+.B \-default_colors
+toggles the default-colors feature which is normally set in the lynx.cfg file.
+.TP
+.B \-delay
+add DebugSecs delay after each progress-message
+.TP
+.B \-display\fR=\fIDISPLAY
+set the display variable for X rexec-ed programs.
+.TP
+.B \-display_charset\fR=\fIMIMEname
+set the charset for the terminal output.
+.TP
+.B \-dont_wrap_pre
+inhibit wrapping of text when \fB\-dump\fR'ing and \fB\-crawl\fR'ing,
+mark wrapped lines of <pre> in interactive session.
+.TP
+.B \-dump
+dumps the formatted output of the default document or those
+specified on the command line to standard output.
+Unlike interactive mode, all documents are processed.
+This can be used in the following way:
+.NS
+lynx \fB\-dump\fR http://www.subir.com/lynx.html
+.NE
+.IP
+Files specified on the command line are formatted as HTML if
+their names end with one of the standard web suffixes such
+as \*(``.htm\*('' or \*(``.html\*(''.
+Use the \fB\-force_html\fP option to format files whose names do not follow
+this convention.
+.TP
+.B \-editor\fR=\fIEDITOR
+enable external editing, using the specified
+EDITOR.
+(vi, ed, emacs, etc.)
+.TP
+.B \-emacskeys
+enable emacs-like key movement.
+.TP
+.B \-enable_scrollback
+toggles compatibility with communication programs' scrollback keys
+(may be incompatible with some curses packages).
+.TP
+.B \-error_file\fR=\fIFILE
+define a file where \fILynx\fP will report HTTP access codes.
+.TP
+.B \-exec
+enable local program execution (normally not configured).
+.TP
+.B \-fileversions
+include all versions of files in local VMS directory listings.
+.TP
+.B \-find_leaks
+toggle memory leak-checking.
+Normally this
+is not compiled-into your executable, but when it is,
+it can be disabled for a session.
+.TP
+.B \-force_empty_hrefless_a
+force HREF-less \*(``A\*('' elements to be empty
+(close them as soon as they are seen).
+.TP
+.B \-force_html
+forces the first document to be interpreted as HTML.
+.IP
+This is most useful when processing files specified on the command line
+which have an unrecognized suffix (or the suffix is associated with a
+non-HTML type, such as \*(``.txt\*('' for plain text files).
+.IP
+\fILynx\fP recognizes these file suffixes as HTML:
+.NS
+\*(``.ht3\*('',
+\*(``.htm\*('',
+\*(``.html3\*('',
+\*(``.html\*('',
+\*(``.htmlx\*('',
+\*(``.php3\*('',
+\*(``.php\*('',
+\*(``.phtml\*('',
+\*(``.sht\*('', and
+\*(``.shtml\*(''.
+.NE
+.TP
+.B \-force_secure
+toggles forcing of the secure flag for SSL cookies.
+.TP
+.B \-forms_options
+toggles whether the Options Menu is key-based or form-based.
+.TP
+.B \-from
+toggles transmissions of From headers.
+.TP
+.B \-ftp
+disable ftp access.
+.TP
+.B \-get_data
+properly formatted data for a \fIget\fP form are read in from
+the standard input and passed to the form.
+Input is terminated by a line that starts with \*(``\-\-\-\*(''.
+.IP
+\fILynx\fP issues an HTTP \fBGET\fP,
+sending the form to the path or URL given on the
+command-line and prints the response of the server.
+If no path or URL is given, \fILynx\fP sends the form to the start-page.
+.TP
+.B \-head
+send a HEAD request for the mime headers.
+.TP
+.B \-help
+print the \fILynx\fP command syntax usage message, and exit.
+.TP
+.B \-hiddenlinks=[option]
+control the display of hidden links.
+.RS
+.TP 3
+.B merge
+hidden links show up as bracketed numbers
+and are numbered together with other links in the sequence of their
+occurrence in the document.
+.TP
+.B listonly
+hidden links are shown only on \fBL)ist\fP screens and listings generated by
+.B \-dump
+or from the \fBP)rint\fP menu, but appear separately at the end of those lists.
+This is the default behavior.
+.TP
+.B ignore
+hidden links do not appear even in listings.
+.RE
+.TP
+.B \-historical
+toggles use of \*(``>\*('' or \*(``\-\->\*('' as a terminator for comments.
+.TP
+.B \-homepage\fR=\fIURL
+set homepage separate from start page.
+.TP
+.B \-image_links
+toggles inclusion of links for all images.
+.TP
+.B \-index\fR=\fIURL
+set the default index file to the specified URL.
+.TP
+.B \-ismap
+toggles inclusion of ISMAP links when client-side
+MAPs are present.
+.TP
+.B \-justify
+do justification of text.
+.TP
+.B \-link\fR=\fINUMBER
+starting count for lnk#.dat files produced by \fB\-crawl\fR.
+.TP
+.B \-list_decoded
+for \fB\-dump\fR, show URL-encoded links decoded.
+.TP
+.B \-list_inline
+for \fB\-dump\fR, show the links inline with the text.
+.TP
+.B \-listonly
+for \fB\-dump\fR, show only the list of links.
+.TP
+.B \-localhost
+disable URLs that point to remote hosts.
+.TP
+.B \-locexec
+enable local program execution from local files only (if
+\fILynx\fP was compiled with local execution enabled).
+.TP
+.B \-lss\fR=\fIFILENAME
+specify filename containing color-style information.
+The default is lynx.lss.
+If you give an empty filename, \fILynx\fP uses a built-in monochrome
+scheme which imitates the non-color-style configuration.
+.TP
+.B \-mime_header
+prints the MIME header of a fetched document along with its
+source.
+.TP
+.B \-minimal
+toggles minimal versus valid comment parsing.
+.TP
+.B \-nested_tables
+toggles nested-tables logic (for debugging).
+.TP
+.B \-newschunksize\fR=\fINUMBER
+number of articles in chunked news listings.
+.TP
+.B \-newsmaxchunk\fR=\fINUMBER
+maximum news articles in listings before chunking.
+.TP
+.B \-nobold
+disable bold video-attribute.
+.TP
+.B \-nobrowse
+disable directory browsing.
+.TP
+.B \-nocc
+disable Cc: prompts for self copies of mailings.
+Note that this does not disable any CCs which are incorporated
+within a mailto URL or form ACTION.
+.TP
+.B \-nocolor
+force color mode off, overriding terminal capabilities and any
+\-color flags, COLORTERM variable, and saved \&.lynxrc settings.
+.TP
+.B \-noexec
+disable local program execution.
+(DEFAULT)
+.TP
+.B \-nofilereferer
+disable transmissions of Referer headers for file URLs.
+.TP
+.B \-nolist
+disable the link list feature in dumps.
+.TP
+.B \-nolog
+disable mailing of error messages to document owners.
+.TP
+.B \-nomargins
+disable left/right margins in the default style sheet.
+.TP
+.B \-nomore
+disable \-more\- string in statusline messages.
+.TP
+.B \-nonrestarting_sigwinch
+This flag is not available on all systems,
+\fILynx\fP needs to be compiled with HAVE_SIGACTION defined.
+If available, this flag \fImay\fR cause \fILynx\fP to react
+more immediately to window changes when run within
+an \fBxterm\fR.
+.TP
+.B \-nonumbers
+disable link- and field-numbering.
+This overrides \fB\-number_fields\fR and \fB\-number_links\fR.
+.TP
+.B \-nopause
+disable forced pauses for statusline messages.
+.TP
+.B \-noprint
+disable most print functions.
+.TP
+.B \-noredir
+prevents automatic redirection and prints a message with a
+link to the new URL.
+.TP
+.B \-noreferer
+disable transmissions of Referer headers.
+.TP
+.B \-noreverse
+disable reverse video-attribute.
+.TP
+.B \-nosocks
+disable SOCKS proxy usage by a SOCKSified \fILynx\fP.
+.TP
+.B \-nostatus
+disable the retrieval status messages.
+.TP
+.B \-notitle
+disable title and blank line from top of page.
+.TP
+.B \-nounderline
+disable underline video-attribute.
+.TP
+.B \-number_fields
+force numbering of links as well as form input fields
+.TP
+.B \-number_links
+force numbering of links.
+.TP
+.B \-partial
+toggles display partial pages while loading.
+.TP
+.B \-partial_thres\fR=\fINUMBER
+number of lines to render before repainting display
+with partial-display logic
+.TP
+.B \-passive_ftp
+toggles passive ftp connections.
+.TP
+.B \-pauth\fR=\fIID\fR:\fIPASSWD
+set authorization ID and password for a protected proxy server at startup.
+Be sure to protect any script files which use this switch.
+.TP
+.B \-popup
+toggles handling of single-choice SELECT options via
+popup windows or as lists of radio buttons.
+.TP
+.B \-post_data
+properly formatted data for a \fIpost\fP form are read in from
+the standard input and passed to the form.
+Input is terminated by a line that starts with \*(``\-\-\-\*(''.
+.IP
+\fILynx\fP issues an HTTP \fBPOST\fP,
+sending the form to the path or URL given on the
+command-line and prints the response of the server.
+If no path or URL is given, \fILynx\fP sends the form to the start-page.
+.TP
+.B \-preparsed
+show HTML source preparsed and reformatted when used with \fB\-source\fR
+or in source view.
+.TP
+.B \-prettysrc
+show HTML source view with lexical elements and tags in color.
+.TP
+.B \-print
+enable print functions.
+(default)
+.TP
+.B \-pseudo_inlines
+toggles pseudo-ALTs for inline images with no ALT string.
+.TP
+.B \-raw
+toggles default setting of 8-bit character translations
+or CJK mode for the startup character set.
+.TP
+.B \-realm
+restricts access to URLs in the starting realm.
+.TP
+.B \-read_timeout\fR=\fIN
+Sets the read-timeout, where N is given in seconds.
+.TP
+.B \-reload
+flushes the cache on a proxy server
+(only the first document given on the command-line is affected).
+.TP
+.B \-restrictions\fR=\fI[option][,option][,option]...
+allows a list of services to be disabled selectively.
+Dashes and underscores in option names can be intermixed.
+The following list is printed if no options are specified.
+.RS
+.TP 3
+.B all
+restricts all options listed below.
+.TP
+.B bookmark
+disallow changing the location of the bookmark
+file.
+.TP
+.B bookmark_exec
+disallow execution links via the bookmark file.
+.TP
+.B change_exec_perms
+disallow changing the eXecute permission on files
+(but still allow it for directories) when local file
+management is enabled.
+.TP
+.B default
+same as command line option \fB\-anonymous\fR.
+Disables default services for anonymous users.
+Set to all restricted, except for:
+inside_telnet, outside_telnet,
+inside_ftp, outside_ftp,
+inside_rlogin, outside_rlogin,
+inside_news, outside_news, telnet_port,
+jump, mail, print, exec, and goto.
+The settings for these,
+as well as additional goto restrictions for
+specific URL schemes that are also applied,
+are derived from definitions within userdefs.h.
+.TP
+.B dired_support
+disallow local file management.
+.TP
+.B disk_save
+disallow saving to disk in the download and
+print menus.
+.TP
+.B dotfiles
+disallow access to, or creation of, hidden (dot) files.
+.TP
+.B download
+disallow some downloaders in the download menu (does not
+imply disk_save restriction).
+.TP
+.B editor
+disallow external editing.
+.TP
+.B exec
+disable execution scripts.
+.TP
+.B exec_frozen
+disallow the user from changing the local
+execution option.
+.TP
+.B externals
+disallow some \*(``EXTERNAL\*('' configuration lines
+if support for passing URLs to external
+applications (with the EXTERN command) is
+compiled in.
+.TP
+.B file_url
+disallow using \fBG)oto\fP, served links or bookmarks for
+file: URLs.
+.TP
+.B goto
+disable the \*(``g\*('' (goto) command.
+.TP
+.B inside_ftp
+disallow ftps for people coming from inside your
+domain (utmp required for selectivity).
+.TP
+.B inside_news
+disallow USENET news posting for people coming
+from inside your domain (utmp required for selectivity).
+.TP
+.B inside_rlogin
+disallow rlogins for people coming from inside
+your domain (utmp required for selectivity).
+.TP
+.B inside_telnet
+disallow telnets for people coming from inside
+your domain (utmp required for selectivity).
+.TP
+.B jump
+disable the \*(``j\*('' (jump) command.
+.TP
+.B multibook
+disallow multiple bookmarks.
+.TP
+.B mail
+disallow mail.
+.TP
+.B news_post
+disallow USENET News posting.
+.TP
+.B options_save
+disallow saving options in \&.lynxrc.
+.TP
+.B outside_ftp
+disallow ftps for people coming from outside your
+domain (utmp required for selectivity).
+.TP
+.B outside_news
+disallow USENET news reading and posting for people coming
+from outside your domain (utmp required for selectivity).
+This restriction applies to
+\*(``news\*('',
+\*(``nntp\*('',
+\*(``newspost\*('', and
+\*(``newsreply\*('' URLs,
+but not to \*(``snews\*('', \*(``snewspost\*('',
+or \*(``snewsreply\*('' in case they are supported.
+.TP
+.B outside_rlogin
+disallow rlogins for people coming from outside
+your domain (utmp required for selectivity).
+.TP
+.B outside_telnet
+disallow telnets for people coming from
+outside your domain (utmp required for selectivity).
+.TP
+.B print
+disallow most print options.
+.TP
+.B shell
+disallow shell escapes and lynxexec or lynxprog \fBG)oto\fP's.
+.TP
+.B suspend
+disallow Unix Control-Z suspends with escape to shell.
+.TP
+.B telnet_port
+disallow specifying a port in telnet \fBG)oto\fP's.
+.TP
+.B useragent
+disallow modifications of the User-Agent header.
+.RE
+.TP
+.B \-resubmit_posts
+toggles forced resubmissions (no-cache) of forms with
+method POST when the documents they returned are sought
+with the PREV_DOC command or from the History List.
+.TP
+.B \-rlogin
+disable recognition of rlogin commands.
+.TP
+.B \-scrollbar
+toggles showing scrollbar.
+.TP
+.B \-scrollbar_arrow
+toggles showing arrows at ends of the scrollbar.
+.TP
+.B \-selective
+require \&.www_browsable files to browse directories.
+.TP
+.B \-session\fR=\fIFILENAME
+resumes from specified file on startup and saves session to that file on exit.
+.TP
+.B \-sessionin\fR=\fIFILENAME
+resumes session from specified file.
+.TP
+.B \-sessionout\fR=\fIFILENAME
+saves session to specified file.
+.TP
+.B \-short_url
+show very long URLs in the status line with \*(``...\*('' to represent the
+portion which cannot be displayed.
+The beginning and end of the URL are displayed, rather than suppressing the end.
+.TP
+.B \-show_cfg
+Print the configuration settings,
+e.g., as read from \*(``lynx.cfg\*('', and exit.
+.TP
+.B \-show_cursor
+If enabled the cursor will not be hidden in the right hand
+corner but will instead be positioned at the start of the
+currently selected link.
+Show cursor is the default for systems without FANCY_CURSES capabilities.
+The default configuration can be changed in userdefs.h or lynx.cfg.
+The command line switch toggles the default.
+.TP
+.B \-show_rate
+If enabled the transfer rate is shown in bytes/second.
+If disabled, no transfer rate is shown.
+Use lynx.cfg or the options menu to select KB/second and/or ETA.
+.TP
+.B \-socks5_proxy=URL
+(Via which) SOCKS5 proxy to connect: any network traffic, including all
+DNS resolutions but the one for URL itself, will be redirected through
+the SOCKS5 proxy.
+URL may be given as \*(``proxy.example.com\*('',
+\*(``proxy.example.com:1080\*('', \*(``192.168.0.1\*('', or
+\*(``192.168.0.1:1080\*('' (and IPv6 notation if so supported).
+A SOCKS5 proxy may also be specified via the environment variable
+.B SOCKS5_PROXY.
+This option controls the builtin SOCKS5 support, which is unrelated to
+the option \fB\-nosocks\fP.
+.TP
+.B \-soft_dquotes
+toggles emulation of the old Netscape and Mosaic bug which
+treated \*(``>\*('' as a co-terminator for double-quotes and tags.
+.TP
+.B \-source
+works the same as dump but outputs HTML source instead of
+formatted text.
+For example
+.NS
+lynx \-source\ .\ >foo.html
+.NE
+.IP
+generates HTML source listing the files in the current directory.
+Each file is marked by an HREF relative to the parent directory.
+Add a trailing slash to make the HREF's relative to the current directory:
+.NS
+lynx \-source ./ >foo.html
+.NE
+.TP
+.B \-stack_dump
+disable SIGINT cleanup handler
+.TP
+.B \-startfile_ok
+allow non-http startfile and homepage with \fB\-validate\fR.
+.TP
+.B \-stderr
+When dumping a document using \fB\-dump\fR or \fB\-source\fR,
+\fILynx\fP normally does not display alert (error)
+messages that you see on the screen in the status line.
+Use the \fB\-stderr\fR option to tell \fILynx\fP to write these messages
+to the standard error.
+.TP
+.B \-stdin
+read the startfile from standard input
+(UNIX only).
+.TP
+.B \-syslog\fR=\fItext
+information for syslog call.
+.TP
+.B \-syslog_urls
+log requested URLs with syslog.
+.TP
+.B \-tagsoup
+initialize parser, using Tag Soup DTD rather than SortaSGML.
+.TP
+.B \-telnet
+disable recognition of telnet commands.
+.TP
+.B \-term\fR=\fITERM
+tell \fILynx\fP what terminal type to assume it is talking to.
+(This may be useful for remote execution, when, for example,
+\fILynx\fP connects to a remote TCP/IP port that starts a script that,
+in turn, starts another \fILynx\fP process.)
+.TP
+.B \-timeout\fR=\fIN
+For win32, sets the network read-timeout, where N is given in seconds.
+.TP
+.B \-tlog
+toggles between using a \fILynx\fP Trace Log and stderr for trace output
+from the session.
+.TP
+.B \-tna
+turns on \*(``Textfields Need Activation\*('' mode.
+.TP
+.B \-trace
+turns on \fILynx\fP trace mode.
+Destination of trace output depends
+on \-tlog.
+.TP
+.B \-trace_mask\fR=\fIvalue
+turn on optional traces, which may result in very large trace files.
+Logically OR the values to combine options:
+.RS
+.TP 3
+.B 1
+SGML character parsing states
+.TP
+.B 2
+color-style
+.TP
+.B 4
+TRST (table layout)
+.TP
+.B 8
+configuration
+(lynx.cfg,
+\&.lynxrc,
+\&.lynx-keymaps,
+mime.types and
+mailcap contents)
+.TP
+.B 16
+binary string copy/append, used in form data construction.
+.TP
+.B 32
+cookies
+.TP
+.B 64
+character sets
+.TP
+.B 128
+GridText parsing
+.TP
+.B 256
+timing
+.TP
+.B 512
+detailed URL parsing
+.RE
+.TP
+.B \-traversal
+traverse all http links derived from startfile.
+When used with
+\fB\-crawl\fR, each link that begins with the same string as startfile
+is output to a file, intended for indexing.
+.IP
+See CRAWL.announce for more information.
+.TP
+.B \-trim_blank_lines
+toggles trimming of trailing blank lines as well as
+the related trimming of blank lines while collapsing BR tags.
+.TP
+.B \-trim_input_fields
+trim input text/textarea fields in forms.
+.TP
+.B \-underline_links
+toggles use of underline/bold attribute for links.
+.TP
+.B \-underscore
+toggles use of _underline_ format in dumps.
+.TP
+.B \-unique_urls
+check for duplicate link numbers in
+each page and corresponding lists,
+and reuse the original link number.
+.TP
+.B \-update_term_title
+enables updating the title in terminal emulators.
+Use only if your terminal emulator supports that escape code.
+Has no effect when used with \fB\-notitle\fP.
+.TP
+.B \-use_mouse
+turn on mouse support, if available.
+Clicking the left mouse button on a link traverses it.
+Clicking the right mouse button pops back.
+Click on the top line to scroll up.
+Click on the bottom line to scroll down.
+The first few positions in the top and bottom line may invoke
+additional functions.
+\fILynx\fP must be compiled with
+\fBncurses\fR or \fBslang\fR to support this feature.
+If \fBncurses\fR is used, clicking the middle mouse button pops up
+a simple menu.
+Mouse clicks may only work reliably while \fILynx\fP is
+idle waiting for input.
+.TP
+.B \-useragent=Name
+set alternate \fILynx\fP User-Agent header.
+.TP
+.B \-validate
+accept only http URLs (for validation).
+Complete security restrictions also are implemented.
+.TP
+.B \-verbose
+toggle [LINK], [IMAGE] and [INLINE] comments with filenames of these images.
+.TP
+.B \-version
+print version information, and exit.
+.TP
+.B \-vikeys
+enable vi-like key movement.
+.TP
+.B \-wdebug
+enable Waterloo tcp/ip packet debug (print to watt debugfile).
+This applies only to DOS versions compiled with WATTCP or WATT-32.
+.TP
+.B \-width\fR=\fINUMBER
+number of columns for formatting of dumps, default is 80.
+This is limited by the number of columns that \fILynx\fP could display,
+typically 1024 (the \fIMAX_LINE\fP symbol).
+.TP
+.B \-with_backspaces
+emit backspaces in output if \fB\-dump\fR'ing or \fB\-crawl\fR'ing
+(like \fBman\fP does)
+.TP
+.B \-xhtml_parsing
+tells \fILynx\fP that it can ignore certain tags which have no content
+in an XHTML 1.0 document.
+For example \*(``<p/>\*('' will be discarded.
+.SH COMMANDS
+More than one key can be mapped to a given command.
+Here are some of the most useful:
+.bP
+Use \fBUp arrow\fR and \fBDown arrow\fR to scroll through hypertext links.
+.bP
+\fBRight arrow\fR or \fBReturn\fR will follow a highlighted hypertext link.
+.bP
+\fBLeft Arrow\fR or \*(``\fBu\fR\*('' will retreat from a link.
+.bP
+Type \*(``\fBH\fR\*('', \*(``\fB?\fR\*('', or \fBF1\fR
+for online help and descriptions of key-stroke commands.
+.bP
+Type \*(``\fBk\fR\*('' or \*(``\fBK\fR\*('' for a list of the current key-stroke
+command mappings.
+.IP
+If the same command is mapped to the same letter differing only
+by upper/lowercase only the lowercase mapping is shown.
+.bP
+Type \fBDelete\fR to view history list.
+.SH ENVIRONMENT
+In addition to various \*(``standard\*('' environment variables such as
+\fBHOME\fR, \fBPATH\fR, \fBUSER\fR, \fBDISPLAY\fR, \fBTMPDIR\fR, \fBetc\fR,
+\fILynx\fR utilizes several \fILynx\fP-specific environment variables, if they
+exist.
+.PP
+Others may be created or modified by \fILynx\fR to pass data to an external
+program, or for other reasons.
+These are listed separately below.
+.PP
+See also the sections on \fBSIMULATED CGI SUPPORT\fR and
+\fBNATIVE LANGUAGE SUPPORT\fR, below.
+.PP
+Note: Not all environment variables apply to all types of platforms
+supported by \fILynx\fR, though most do.
+Feedback on platform dependencies is solicited.
+.PP
+Environment Variables Used By \fILynx\fR:
+.TP 20
+.B COLORTERM
+If set, color capability for the terminal is forced on at startup time.
+The actual value assigned to the variable is ignored.
+This variable is only meaningful if \fILynx\fR was built using the \fBslang\fR
+screen-handling library.
+.TP
+.B LYNX_CFG
+This variable, if set, will override the default location and name of
+the global configuration file (normally, \fBlynx.cfg\fR) that was defined
+by the LYNX_CFG_FILE constant in the userdefs.h file, during installation.
+.IP
+See the userdefs.h file for more information.
+.TP
+.B LYNX_CFG_PATH
+If set, this variable overrides the compiled-in search-list of directories
+used to find the configuration files, e.g., \fBlynx.cfg\fP and \fBlynx.lss\fP.
+The list is delimited with ":" (or ";" for Windows) like the \fBPATH\fP
+environment variable.
+.TP
+.B LYNX_HELPFILE
+If set, this variable overrides the compiled-in URL and configuration
+file URL for the \fILynx\fP help file.
+.TP
+.B LYNX_LOCALEDIR
+If set, this variable overrides the compiled-in location of the
+locale directory which contains native language (NLS) message text.
+.TP
+.B LYNX_LSS
+This variable, if set, specifies the location of the default \fILynx\fR
+character style sheet file.
+[Currently only meaningful if \fILynx\fR was
+built using curses color style support.]
+.TP
+.B LYNX_SAVE_SPACE
+This variable, if set, will override the default path prefix for files
+saved to disk that is defined in the \fBlynx.cfg SAVE_SPACE:\fR statement.
+.IP
+See the \fBlynx.cfg\fR file for more information.
+.TP
+.B LYNX_TEMP_SPACE
+This variable, if set, will override the default path prefix for temporary
+files that was defined during installation, as well as any value that may
+be assigned to the \fBTMPDIR\fR variable.
+.TP
+.B MAIL
+This variable specifies the default inbox \fILynx\fR will check for new
+mail, if such checking is enabled in the \fBlynx.cfg\fR file.
+.TP
+.B NEWS_ORGANIZATION
+This variable, if set, provides the string used in the \fBOrganization:\fR
+header of \fBUSENET\fR news postings.
+It will override the setting of the
+ORGANIZATION environment variable, if it is also set (and, on \fBUNIX\fR,
+the contents of an /etc/organization file, if present).
+.TP
+.B NNTPSERVER
+If set, this variable specifies the default NNTP server that will be used
+for \fBUSENET\fR news reading and posting with \fILynx\fR, via news: URL's.
+.TP
+.B ORGANIZATION
+This variable, if set, provides the string used in the \fBOrganization:\fR
+header of \fBUSENET\fR news postings.
+On \fBUNIX\fR, it will override the
+contents of an /etc/organization file, if present.
+.TP
+.I PROTOCOL\fB_proxy\fR
+\fILynx\fR supports the use of proxy servers that can act as firewall
+gateways and caching servers.
+They are preferable to the older gateway
+servers (see WWW_access_GATEWAY, below).
+.IP
+Each protocol used by \fILynx\fR,
+(http, ftp, gopher, etc), can be mapped separately by setting environment
+variables of the form \fIPROTOCOL\fP_proxy.
+Protocols are indicated in a URI by the name before \*(``:\*('', e.g.,
+\*(``http\*('' in
+\*(``http://some.server.dom:port/\*('' for HTML.
+.IP
+Depending on your system configuration and supported protocols,
+the environment variables recognized by \fIlynx\fP may include
+.NS
+cso_proxy
+finger_proxy
+ftp_proxy
+gopher_proxy
+https_proxy
+http_proxy
+newspost_proxy
+newsreply_proxy
+news_proxy
+nntp_proxy
+no_proxy
+snewspost_proxy
+snewsreply_proxy
+snews_proxy
+wais_proxy
+.NE
+.IP
+See \fBLynx Users Guide\fR for additional details and examples.
+.TP
+.B SOCKS5_PROXY
+Is inspected if
+.B \-socks5_proxy
+has not been used (for the same content).
+.TP
+.B SSL_CERT_DIR
+Set to the directory containing trusted certificates.
+.TP
+.B SSL_CERT_FILE
+Set to the full path and filename for your file of trusted certificates.
+.TP
+.B WWW_\fIaccess\fB_GATEWAY
+\fILynx\fR still supports use of gateway servers, with the servers specified
+via \*(``WWW_\fIaccess\fP_GATEWAY\*('' variables
+(where \*(``\fIaccess\fP\*('' is lower case and can be
+\*(``http\*('', \*(``ftp\*('', \*(``gopher\*('' or \*(``wais\*('').
+However most gateway servers have been discontinued.
+Note that you do not include a terminal \*(``/\*('' for gateways, but
+do for proxies specified by \fIPROTOCOL\fP_proxy environment variables.
+.IP
+See \fBLynx Users Guide\fR for details.
+.TP
+.B WWW_HOME
+This variable, if set, will override the default startup URL specified
+in any of the \fILynx\fR configuration files.
+.PP
+Environment Variables \fBSet\fR or \fBModified\fR By \fILynx\fR:
+.TP 20
+.B LYNX_PRINT_DATE
+This variable is set by the \fILynx\fR p(rint) function, to the
+\fBDate:\fR
+string seen in the document's \*(``\fBInformation about\fR\*('' page (= cmd),
+if any.
+It is created for use by an external program, as defined in a
+\fBlynx.cfg PRINTER:\fR definition statement.
+If the field does not exist for the document, the variable is set to a
+null string under \fBUNIX\fR, or \*(``No Date\*('' under \fBVMS\fR.
+.TP
+.B LYNX_PRINT_LASTMOD
+This variable is set by the \fILynx\fR p(rint) function, to the
+\fBLast Mod:\fR
+string seen in the document's \*(``\fBInformation about\fR\*('' page (= cmd),
+if any.
+It is created for use by an external program, as defined in a
+\fBlynx.cfg PRINTER:\fR definition statement.
+If the field does not exist for the document, the variable is set to a
+null string under \fBUNIX\fR, or \*(``No LastMod\*('' under \fBVMS\fR.
+.TP
+.B LYNX_PRINT_TITLE
+This variable is set by the \fILynx\fR p(rint) function, to the
+\fBLinkname:\fR
+string seen in the document's \*(``\fBInformation about\fR\*('' page (= cmd),
+if any.
+It is created for use by an external program, as defined in a
+\fBlynx.cfg PRINTER:\fR definition statement.
+If the field does not exist for the document, the variable is set to a
+null string under \fBUNIX\fR, or \*(``No Title\*('' under \fBVMS\fR.
+.TP
+.B LYNX_PRINT_URL
+This variable is set by the \fILynx\fR p(rint) function, to the
+\fBURL:\fR
+string seen in the document's \*(``\fBInformation about\fR\*('' page (= cmd),
+if any.
+It is created for use by an external program, as defined in a
+\fBlynx.cfg PRINTER:\fR definition statement.
+If the field does not exist for the document, the variable is set to a
+null string under \fBUNIX\fR, or \*(``No URL\*('' under \fBVMS\fR.
+.TP
+.B LYNX_TRACE
+If set, causes \fILynx\fR to write a trace file as if the \fB\-trace\fR
+option were supplied.
+.TP
+.B LYNX_TRACE_FILE
+If set, overrides the compiled-in name of the trace file,
+which is either \fBLynx.trace\fP or \fBLY\-TRACE.LOG\fP
+(the latter on the DOS/Windows platforms).
+The trace file is in either case relative to the home directory.
+.TP
+.B LYNX_VERSION
+This variable is always set by \fILynx\fR, and may be used by an external
+program to determine if it was invoked by \fILynx\fR.
+.IP
+See also the comments
+in the distribution's sample \fBmailcap\fR file, for notes on usage in such
+a file.
+.TP
+.B TERM
+Normally, this variable is used by \fILynx\fR to determine the terminal type
+being used to invoke \fILynx\fR.
+If, however, it is unset at startup time
+(or has the value \*(``unknown\*(''),
+or if the \fB\-term\fR command-line option is used (see \fBOPTIONS\fR section
+above), \fILynx\fR will set or modify its value to the user specified
+terminal type (for the \fILynx\fR execution environment).
+Note: If set/modified by \fILynx\fR, the values of the \fBLINES\fR and/or
+\fBCOLUMNS\fR environment variables may also be changed.
+.SH SIMULATED CGI SUPPORT
+If built with the \fBcgi-links\fR option enabled, \fILynx\fR allows access
+to a cgi script directly without the need for an http daemon.
+.PP
+When executing such \*(``lynxcgi scripts\*('' (if enabled),
+the following variables may be set for simulating a CGI environment:
+.PP
+.B CONTENT_LENGTH
+.PP
+.B CONTENT_TYPE
+.PP
+.B DOCUMENT_ROOT
+.PP
+.B HTTP_ACCEPT_CHARSET
+.PP
+.B HTTP_ACCEPT_LANGUAGE
+.PP
+.B HTTP_USER_AGENT
+.PP
+.B PATH_INFO
+.PP
+.B PATH_TRANSLATED
+.PP
+.B QUERY_STRING
+.PP
+.B REMOTE_ADDR
+.PP
+.B REMOTE_HOST
+.PP
+.B REQUEST_METHOD
+.PP
+.B SERVER_SOFTWARE
+.PP
+Other environment variables are not inherited by the script, unless they
+are provided via a LYNXCGI_ENVIRONMENT statement in the configuration file.
+See the \fBlynx.cfg\fR file, and the (draft) CGI 1.1 Specification
+<http://Web.Golux.Com/coar/cgi/draft\-coar\-cgi\-v11\-00.txt> for the
+definition and usage of these variables.
+.PP
+The CGI Specification, and other associated documentation, should be consulted
+for general information on CGI script programming.
+.SH NATIVE LANGUAGE SUPPORT
+If configured and installed with \fBNative Language Support\fR, \fILynx\fR
+will display status and other messages in your local language.
+See the
+file \fBABOUT_NLS\fR in the source distribution, or at your local \fBGNU\fR
+site, for more information about internationalization.
+.PP
+The following environment variables may be used to alter default settings:
+.TP 20
+.B LANG
+This variable, if set, will override the default message language.
+It is an \fBISO 639\fR two-letter code identifying the language.
+Language codes are \fBNOT\fR the same
+as the country codes given in \fBISO 3166\fR.
+.TP
+.B LANGUAGE
+This variable, if set, will override the default message language.
+This is a \fBGNU\fR extension that has higher priority for setting
+the message catalog than \fBLANG\fR or \fBLC_ALL\fR.
+.TP
+.B LC_ALL
+and
+.TP
+.B LC_MESSAGES
+These variables, if set, specify the notion of native language
+formatting style.
+They are \fBPOSIXly\fR correct.
+.TP
+.B LINGUAS
+This variable, if set prior to configuration, limits the installed
+languages to specific values.
+It is a space-separated list of two-letter codes.
+Currently, it is hard-coded to a wish list.
+.TP
+.B NLSPATH
+This variable, if set, is used as the path prefix for message catalogs.
+.SH NOTES
+This is the manual for \fILynx\fP v2.9.0dev.5;
+development is in progress for 2.9.0.
+.PP
+If you wish to contribute to the further development
+of \fILynx\fR, subscribe to our mailing list.
+Send email to
+<lynx\-dev\-request@nongnu.org>
+with \*(``subscribe lynx\-dev\*('' as the only line
+in the body of your message.
+.PP
+Send bug reports, comments, suggestions to <lynx\-dev@nongnu.org>
+after subscribing.
+.PP
+Unsubscribe by sending email to <lynx\-dev\-request@nongnu.org> with
+\*(``unsubscribe lynx\-dev\*('' as the only line in the body of your message.
+Do not send the unsubscribe message to the lynx\-dev list, itself.
+.SH SEE ALSO
+.hy 0
+\fBcatgets\fR(3),
+\fBcurses\fR(3),
+\fBenviron\fR(7),
+\fBexecve\fR(2),
+\fBftp\fR(1),
+\fBgettext\fR(GNU),
+\fBlocaleconv\fR(3),
+\fBncurses\fR(3),
+\fBsetlocale\fR(3),
+\fBslang\fR(?),
+\fBtermcap\fR(5),
+\fBterminfo\fR(5),
+\fBwget\fR(GNU)
+.hy 1
+.PP
+Note that man page availability and section numbering is somewhat
+platform dependent, and may vary from the above references.
+.PP
+A section shown as (GNU), is intended to denote that the topic
+may be available via an info page, instead of a man page (i.e., try
+\*(``info subject\*('', rather than \*(``man subject\*('').
+.PP
+A section shown as \fB(?)\fP denotes that documentation on the topic exists,
+but is not part of an established documentation retrieval system (see
+the distribution files associated with the topic, or contact your
+System Administrator for further information).
+.SH ACKNOWLEDGMENTS
+\fILynx\fP has incorporated code from a variety of sources along the way.
+The earliest versions of \fILynx\fP included code from Earl Fogel of Computing
+Services at the University of Saskatchewan, who implemented HYPERREZ
+in the Unix environment.
+HYPERREZ was developed by Niel Larson of
+Think.com and served as the model for the early versions of \fILynx\fP.
+Those versions also incorporated libraries from the Unix Gopher clients
+developed at the University of Minnesota, and the later versions of
+\fILynx\fP rely on the WWW client library code developed by Tim Berners-Lee
+and the WWW community.
+Also a special thanks to Foteos Macrides who ported
+much of \fILynx\fP to VMS and did or organized most of its development since the
+departures of Lou Montulli and Garrett Blythe from the University of Kansas
+in the summer of 1994 through the release of v2.7.2, and to everyone
+on the net who has contributed to \fILynx\fP's development either directly
+(through patches, comments or bug reports) or indirectly
+(through inspiration and development of other systems).
+.SH AUTHORS
+Lou Montulli, Garrett Blythe, Craig Lavender, Michael Grobe, Charles Rezac
+.br
+Academic Computing Services
+.br
+University of Kansas
+.br
+Lawrence, Kansas 66047
+.PP
+Foteos Macrides
+.br
+Worcester Foundation for Biomedical Research
+.br
+Shrewsbury, Massachusetts 01545
+.PP
+Thomas E.\& Dickey
+.br
+<dickey@invisible\-island.net>
diff --git a/lynx_help/Lynx_users_guide.html b/lynx_help/Lynx_users_guide.html
new file mode 100644
index 0000000..a5b270f
--- /dev/null
+++ b/lynx_help/Lynx_users_guide.html
@@ -0,0 +1,5729 @@
+<!-- $LynxId: Lynx_users_guide.html,v 1.157 2023/01/03 00:11:31 Jens.Schleusener Exp $ -->
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+ <meta name="generator" content=
+ "HTML Tidy for HTML5 for Linux version 5.6.0">
+ <title>Lynx Users Guide v2.8.9</title>
+ <link rev="made" href="mailto:lynx-dev@nongnu.org">
+ <meta http-equiv="Content-Type" content=
+ "text/html; charset=us-ascii">
+ <meta name="description" content=
+ "This is the user's guide to Lynx, giving detailed information on how to use the program, and how to change its configuration using the options menu.">
+</head>
+<body>
+ <h1>Lynx Users Guide v2.8.9</h1>
+
+ <p>Lynx is a fully-featured <em>World Wide Web</em>
+ (<em>WWW</em>) client for users running cursor-addressable,
+ character-cell display devices (e.g., vt100 terminals, vt100
+ emulators running on PCs or Macs, or any other character-cell
+ display). It will display <em>Hypertext Markup Language</em>
+ (<em>HTML</em>) documents containing links to files on the local
+ system, as well as files on remote systems running <em>http</em>,
+ <em>gopher</em>, <em>ftp</em>, <em>wais</em>, <em>nntp</em>,
+ <em>finger</em>, or <em>cso</em>/<em>ph</em>/<em>qi</em> servers,
+ and services accessible via logins to <em>telnet</em>,
+ <em>tn3270</em> or <em>rlogin</em> accounts (see <a href=
+ "lynx_url_support.html">URL Schemes Supported by Lynx</a>).
+ <a href="#Hist">Current</a> versions of Lynx run on Unix, VMS,
+ Windows3.x/9x/NT and later, 386DOS and OS/2 EMX.</p>
+
+ <p>Lynx can be used to access information on the <em>WWW</em>, or
+ to build information systems intended primarily for local access.
+ For example, Lynx has been used to build several <em>Campus Wide
+ Information Systems</em> (<em>CWIS</em>). In addition, Lynx can
+ be used to build systems isolated within a single LAN.</p>
+
+ <h2 id="TOC"><a name="Contents" id="Contents">Table of
+ Contents</a></h2>
+
+ <ul>
+ <li><a href="#Help" name="ToC-Help" id="ToC-Help">Lynx online
+ help</a></li>
+
+ <li><a href="#Local" name="ToC-Local" id="ToC-Local">Viewing
+ local files with Lynx</a></li>
+
+ <li><a href="#Leaving" name="ToC-Leaving" id=
+ "ToC-Leaving">Leaving Lynx</a></li>
+
+ <li><a href="#Remote" name="ToC-Remote" id=
+ "ToC-Remote">Starting Lynx with a Remote File</a></li>
+
+ <li><a href="#EnVar" name="ToC-EnVar" id="ToC-EnVar">Starting
+ Lynx with the WWW_HOME environment variable.</a></li>
+
+ <li><a href="#IntraDocNav" name="ToC-IntraDocNav" id=
+ "ToC-IntraDocNav">Navigating hypertext documents with Lynx</a></li>
+
+ <li><a href="#Disposing" name="ToC-Disposing" id=
+ "ToC-Disposing">Printing, Mailing, and Saving rendered files to
+ disk.</a></li>
+
+ <li><a href="#LocalSource" name="ToC-LocalSource" id=
+ "ToC-LocalSource">Viewing the HTML document source and editing
+ documents</a></li>
+
+ <li><a href="#RemoteSource" name="ToC-RemoteSource" id=
+ "ToC-RemoteSource">Downloading and Saving source files.</a></li>
+
+ <li><a href="#ReDo" name="ToC-ReDo" id="ToC-ReDo">Reloading
+ files and refreshing the display</a></li>
+
+ <li><a href="#Search" name="ToC-Search" id="ToC-Search">Lynx
+ searching commands</a></li>
+
+ <li><a href="#InteractiveOptions" name="ToC-InteractiveOptions"
+ id="ToC-InteractiveOptions">Lynx Options Menu</a></li>
+
+ <li><a href="#Mail" name="ToC-Mail" id="ToC-Mail">Comments and
+ mailto: links</a></li>
+
+ <li><a href="#News" name="ToC-News" id="ToC-News">USENET News
+ posting</a></li>
+
+ <li><a href="#Bookmarks" name="ToC-Bookmarks" id=
+ "ToC-Bookmarks">Lynx bookmarks</a></li>
+
+ <li><a href="#Jumps" name="ToC-Jumps" id="ToC-Jumps">Jump
+ command</a></li>
+
+ <li><a href="#DirEd" name="ToC-DirEd" id="ToC-DirEd">Directory
+ Editing</a></li>
+
+ <li><a href="#ColorMouse" name="ToC-ColorMouse" id=
+ "ToC-ColorMouse">Using Color &amp; the Mouse</a></li>
+
+ <li><a href="#MiscKeys" name="ToC-MiscKeys" id=
+ "ToC-MiscKeys">Scrolling and Other useful commands</a></li>
+
+ <li><a href="#Forms" name="ToC-Forms" id="ToC-Forms">Lynx and
+ HTML Forms</a> | <a href="#Images" name="ToC-Images" id=
+ "ToC-Images">Lynx and HTML Images</a></li>
+
+ <li><a href="#Tables" name="ToC-Tables" id="ToC-Tables">Lynx
+ and HTML Tables</a> | <a href="#Tabs" name="ToC-Tabs" id=
+ "ToC-Tabs">Lynx and HTML Tabs</a></li>
+
+ <li><a href="#Frames" name="ToC-Frames" id="ToC-Frames">Lynx
+ and HTML Frames</a> | <a href="#Banners" name="ToC-Banners" id=
+ "ToC-Banners">Lynx and HTML Banners</a></li>
+
+ <li><a href="#Footnotes" name="ToC-Footnotes" id=
+ "ToC-Footnotes">Lynx and HTML Footnotes</a> | <a href="#Notes"
+ name="ToC-Notes" id="ToC-Notes">Lynx and HTML Notes</a></li>
+
+ <li><a href="#Lists" name="ToC-Lists" id="ToC-Lists">Lynx and
+ HTML Lists</a></li>
+
+ <li><a href="#Quotes" name="ToC-Quotes" id="ToC-Quotes">Lynx
+ and HTML Quotes</a></li>
+
+ <li><a href="#Eightbit" name="ToC-Eightbit" id=
+ "ToC-Eightbit">Lynx and HTML Internationalization: 8bit,
+ UNICODE, etc.</a></li>
+
+ <li><a href="#USEMAP" name="ToC-USEMAP" id="ToC-USEMAP">Lynx
+ and Client-Side-Image-Maps</a></li>
+
+ <li><a href="#Refresh" name="ToC-Refresh" id="ToC-Refresh">Lynx
+ and Client-Side-Pull</a></li>
+
+ <li><a href="#Cookies" name="ToC-Cookies" id="ToC-Cookies">Lynx
+ and State Management</a> (Me want <em>cookie</em>!)</li>
+
+ <li><a href="#Cache" name="ToC-Cache" id="ToC-Cache">Lynx and
+ Cached Documents</a></li>
+
+ <li><a href="#Sessions" name="ToC-Sessions" id=
+ "ToC-Sessions">Lynx and Sessions</a></li>
+
+ <li><a href="#Invoking" name="ToC-Invoking" id=
+ "ToC-Invoking">The Lynx command line</a></li>
+
+ <li><a href="#Environment" name="ToC-Environment" id=
+ "ToC-Environment">Environment variables used by Lynx</a></li>
+
+ <li><a href="#lynx.cfg" name="ToC-lynx.cfg" id=
+ "ToC-lynx.cfg">Main configuration file lynx.cfg</a></li>
+
+ <li><a href="#Hist" name="ToC-Hist" id="ToC-Hist">Lynx
+ development history</a></li>
+ </ul>
+
+ <h2 id="id-Help"><a name="Help" id="Help">Lynx online help</a></h2>
+
+ <p>Online help is available while viewing any document. Press the
+ &ldquo;<samp>?</samp>&rdquo; or &ldquo;<samp>H</samp>&rdquo; key
+ (or the &ldquo;<samp>h</samp>&rdquo; key if vi-like key movement
+ is not on) to see a list of help topics. See the section titled
+ <a href="#IntraDocNav">Navigating hypertext documents with
+ Lynx</a> for information on navigating through the help
+ files.</p>
+
+ <p>In addition, a summary description of all the Lynx keystroke
+ commands and their key bindings is available by pressing the
+ &ldquo;<samp>K</samp>&rdquo; key (or the
+ &ldquo;<samp>k</samp>&rdquo; key if vi-like key movement is not
+ on).</p>
+
+ <p>If you want to recall recent status-line messages, you can do
+ so by entering the &ldquo;g&rdquo; command, followed by
+ &ldquo;LYNXMESSAGES:&rdquo;.</p>
+
+ <p>[<a href="#ToC-Help">ToC</a>]</p>
+
+ <h2 id="id-Local"><a name="Local" id="Local">Viewing local files
+ with Lynx</a></h2>
+
+ <p>Lynx can be started by entering the Lynx command along with
+ the name of a file to display. For example these commands could
+ all be used to display an arbitrary ASCII text or HTML file:</p>
+
+ <dl>
+ <dt>UNIX</dt>
+
+ <dd><code>lynx filename</code>
+ </dd>
+
+ <dd><code>lynx /home/my-dir/filename</code>
+ </dd>
+
+ <dd><code>lynx ~/filename</code>
+ </dd>
+
+ <dt>VMS</dt>
+
+ <dd><code>lynx filename</code>
+ </dd>
+
+ <dd><code>lynx dua5:[my-directory]filename</code>
+ </dd>
+
+ <dd><code>lynx /dua5/my-directory/filename</code>
+ </dd>
+
+ <dd><code>lynx ~/filename</code>
+ </dd>
+
+ <dd><code>lynx sys$login:filename</code>
+ </dd>
+
+ <dd><code>lynx /sys$login/filename</code>
+ </dd>
+
+ <dt>Win32/DOS</dt>
+
+ <dd><code>lynx file:///filename</code>
+ </dd>
+
+ <dd><code>lynx filename</code>
+ </dd>
+
+ <dd><code>lynx c:/dir/filename</code>
+ </dd>
+
+ <dd><code>lynx //n/dir/filename</code>
+ </dd>
+ </dl>
+
+ <p>When executed, Lynx will clear the screen and display as much
+ of the specified file as will fit on the screen. Pressing a
+ <em>down-arrow</em> will bring up the next screen, and pressing
+ an <em>up-arrow</em> will bring up the previous screen. If no
+ file is specified at startup, a default file will be displayed,
+ depending on settings e.g., in <em>lynx.cfg</em>.</p>
+
+ <p>Lynx will display local files written in the <em>HyperText
+ Markup Language</em> (<em>HTML</em>), if the file's name ends
+ with the characters <em>.html</em>, <em>.htm</em>,
+ <em>.shtml</em>, <em>.htmlx</em>, <em>.html3</em>, or
+ <em>.ht3</em>. HTML is a file format that allows users to create
+ a file that contains (among other things) hypertext links to
+ other files. Several files linked together may be described as a
+ <em>hypertext document</em>. If the filename does not have one of
+ the suffixes mapped by Lynx to HTML, the <em>-force_html</em>
+ command line option can be included to force treatment of the
+ file as hypertext.</p>
+
+ <p>When Lynx displays an HTML file, it shows links as "bold face"
+ text, except for one link, which is shown as "highlighted" text.
+ Whether "boldface" or "highlighted" text shows up as reverse
+ video, boldface type, or a color change, etc. depends on the
+ display device being used (and the way in which that device has
+ been configured). Lynx has no control over the exact presentation
+ of links.</p>
+
+ <p>The one link displayed as "highlighted" text is the currently
+ "selected" link. Lynx will display the file associated with the
+ selected link when a <em>right-arrow</em> or a <em>Return</em>
+ key is pressed. To select a particular link, press the
+ <em>up-arrow</em> or <em>down-arrow</em> keys until the desired
+ link becomes "highlighted," and then press the
+ <em>right-arrow</em> or <em>Return</em> key to view the linked
+ information. Information included in the HTML file tells Lynx
+ where to find the linked file and what kind of server will
+ provide it (i.e., HTTP, Gopher, etc.).</p>
+
+ <p>Lynx renders HTML files and saves the rendition (and the
+ source, if so configured in the <a href="#lynx.cfg">lynx.cfg</a>
+ file) for initial display and should you select the link again.
+ If you do select a link again and have reason to desire a new
+ fetch and rendering of the file, use the NOCACHE command,
+ normally mapped to &ldquo;<samp>x</samp>&rdquo; and
+ &ldquo;<samp>X</samp>&rdquo;, instead of the <em>right-arrow</em>
+ or <em>Return</em> key when positioned on the link. You also can
+ force a new fetch and rendering of the currently displayed
+ document via the RELOAD command, normally mapped to
+ <em>Control-R</em>.</p>
+
+ <p>When a binary file is encountered Lynx will ask the user if
+ he/she wishes to download the file or cancel. If the user selects
+ &ldquo;<samp>D</samp>&rdquo; for download, Lynx will transfer the
+ file into a temporary location and present the user with a list
+ of options. The only default option is <em>Save to disk</em>,
+ which is disabled if Lynx is running in anonymous mode.
+ Additional download methods may be defined in the <a href=
+ "#lynx.cfg">lynx.cfg</a> file. Programs like kermit, zmodem and
+ FTP are some possible options.</p>
+
+ <p>[<a href="#ToC-Local">ToC</a>]</p>
+
+ <h2 id="id-Leaving"><a name="Leaving" id="Leaving">Leaving
+ Lynx</a></h2>
+
+ <p>To exit Lynx use the &ldquo;<samp>q</samp>&rdquo; command. You
+ will be asked whether you really want to quit. Answering
+ &ldquo;<samp>y</samp>&rdquo; will exit and
+ &ldquo;<samp>n</samp>&rdquo; will return you to the current
+ document. Use &ldquo;<samp>Q</samp>&rdquo; or <em>Control-D</em>
+ to quit without verification.</p>
+
+ <p>[<a href="#ToC-Leaving">ToC</a>]</p>
+
+ <h2 id="id-Remote"><a name="Remote" id="Remote">Starting Lynx
+ with a Remote File</a></h2>
+
+ <p>If you wish to view a remote file (that is, a file residing on
+ some computer system other than the one upon which you are
+ running Lynx) without first viewing a local file, you must
+ identify that file by using a Uniform Resource Locator (URL).
+ URLs take the general form:</p>
+
+ <blockquote>
+ <p><code>PROTOCOL :// HOST / PATH</code>
+ </p>
+ </blockquote>
+
+ <p>where</p>
+
+ <dl>
+ <dt><code>PROTOCOL</code>
+ </dt>
+
+ <dd>
+ <p>identifies the communications protocol (<em>scheme</em>)
+ used by the server that will provide the file. As mentioned
+ earlier, Lynx (and any WWW client) can interact with a
+ variety of servers, each with its own protocol.</p>
+ </dd>
+
+ <dt><code>HOST</code>
+ </dt>
+
+ <dd>
+ <p>is the Internet address of the computer system on which
+ the server is running, and</p>
+ </dd>
+
+ <dt><code>PATH</code>
+ </dt>
+
+ <dd>
+ <p>is a scheme-specific field which for some schemes may
+ correspond to a directory path and/or filename.</p>
+ </dd>
+ </dl>
+
+ <p>Here are some sample URLs.</p>
+
+ <dl>
+ <dt>HTTP (HyperText Transfer Protocol)</dt>
+
+ <dd><code>https://invisible-island.net/lynx/</code>
+ </dd>
+
+ <dt>Gopher</dt>
+
+ <dd><code>gopher://gopher.micro.umn.edu/11/</code>
+ </dd>
+
+ <dt>FTP (File Transfer Protocol)</dt>
+
+ <dd><code>ftp://ftp2.cc.ukans.edu/pub/lynx/README</code>
+ </dd>
+
+ <dt>WAIS (Wide Area Information Service protocol)</dt>
+
+ <dd><code>wais://cnidr.org/directory-of-servers</code>
+ </dd>
+
+ <dt>A URL may be specified to Lynx on the command line, as
+ in:</dt>
+
+ <dd><code>lynx
+ http://kufacts.cc.ukans.edu/cwis/kufacts_start.html</code>
+ </dd>
+ </dl>
+
+ <p>Lynx also will attempt to create a complete URL if you include
+ adequate portions of it in the startfile argument. For
+ example:</p>
+
+ <pre>
+ <em>wfbr</em> will be expanded to:
+ <em>http://www.wfbr.edu/</em> and:
+ <em>ftp.more.net/pub</em> will be expanded to:
+ <em>ftp://ftp.more.net/pub</em>
+</pre>
+ <p>See <a href="lynx_url_support.html">URL Schemes Supported by
+ Lynx</a> for more detailed information.</p>
+
+ <p>[<a href="#ToC-Remote">ToC</a>]</p>
+
+ <h2 id="id-EnVar"><a name="EnVar" id="EnVar">Starting Lynx with
+ the WWW_HOME environment variable.</a></h2>
+
+ <p>You may also specify a starting file for Lynx using the
+ WWW_HOME environment variable,</p>
+
+ <dl>
+ <dt>UNIX</dt>
+
+ <dd>
+ <dl>
+ <dt>ksh</dt>
+
+ <dd><code>export WWW_HOME=http://www.w3.org/</code>
+ </dd>
+
+ <dt>csh</dt>
+
+ <dd><code>setenv WWW_HOME http://www.w3.org/</code>
+ </dd>
+ </dl>
+ </dd>
+
+ <dt>VMS</dt>
+
+ <dd><code>define "WWW_HOME" "http://www.w3.org/"</code>
+ </dd>
+
+ <dt>win32</dt>
+
+ <dd><code>WWW_HOME=http://www.w3.org/ [or in registry]</code>
+ </dd>
+ </dl>
+
+ <p>Note that on VMS the double-quoting <em>must</em> be included
+ to preserve casing.</p>
+
+ <p>[<a href="#ToC-EnVar">ToC</a>]</p>
+
+ <h2 id="id-IntraDocNav"><a name="IntraDocNav" id=
+ "IntraDocNav">Navigating hypertext documents with Lynx</a></h2>
+
+ <p>The process of moving within a hypertext web, selecting and
+ displaying links is known as "navigation." With Lynx almost all
+ navigation can be accomplished with the arrow keys and the
+ numeric keypad.</p>
+
+ <pre>
+ +-------+-------+-------+
+ | TOP | /|\ | Page |
+ arrow keys | of | | | UP |
+ | text 7| | 8| 9|
+ +---------+ +-------+-------+-------+
+ | SELECT | | | | |
+ | prev /|\| | &lt;--- | | ---&gt; |
+ | link | | | 4| 5| 6|
+ +---------+---------+---------+ +-------+-------+-------+
+ | BACK | SELECT | DISPLAY | | END | | | Page |
+ |&lt;-- prev | next | | sel. --&gt;| | of | | | DOWN |
+ | doc. | link \|/| link | | text 1| \|/ 2| 3|
+ +---------+---------+---------+ +-------+-------+-------+
+</pre>
+ <p>There are also a few other keyboard commands to aid in
+ navigation. The Control and Function keys used for navigation
+ within the current document are described in <a href=
+ "#MiscKeys"><em>Scrolling and Other useful commands</em></a>.</p>
+
+ <p>Some additional commands depend on the fact that Lynx keeps a
+ list of each link you visited to reach the current document,
+ called the <a href="keystrokes/history_help.html">History
+ Page</a>, and a list of all links visited during the current Lynx
+ session, called the <a href=
+ "keystrokes/visited_help.html">Visited Links Page</a>.</p>
+
+ <ul>
+ <li>
+ <p>The HISTORY keystroke command, normally mapped to
+ <em>Backspace</em> or <em>Delete</em>, will show you the
+ <em>History Page</em> of links leading to your access of the
+ current document. Any of the previous documents shown in the
+ list may be revisited by selecting them from the history
+ screen.</p>
+ </li>
+
+ <li>
+ <p>The VLINKS keystroke command, normally mapped to uppercase
+ &ldquo;<samp>V</samp>&rdquo;, will show the <em>Visited Links
+ Page</em>, and you similarly can select links in that
+ list.</p>
+ </li>
+
+ <li>
+ <p>The MAIN_MENU keystroke command, normally mapped to
+ &ldquo;<samp>m</samp>&rdquo; and
+ &ldquo;<samp>M</samp>&rdquo;, will take you back to the
+ starting document unless you specified the
+ <em>-homepage=URL</em> option at the command line.</p>
+ </li>
+
+ <li>
+ <p>Also, the LIST and ADDRLIST keystroke commands, normally
+ mapped to &ldquo;<samp>l</samp>&rdquo; and
+ &ldquo;<samp>A</samp>&rdquo; respectively, will create a
+ compact lists of all the links in the current document, and
+ they can be selected via those lists.</p>
+ </li>
+ </ul>
+
+ <p>The &ldquo;<samp>i</samp>&rdquo; key presents an index of
+ documents. The default index offered contains many useful links,
+ but can be changed in <em>lynx.cfg</em> or on the command line
+ using the <em>-index=URL</em> switch.</p>
+
+ <p>If you choose a link to a server with active access
+ authorization, Lynx will automatically prompt for a username and
+ a password. If you give the correct information, you will then be
+ served the requested information. Lynx will automatically send
+ your username and password to the same server if it is needed
+ again.</p>
+
+ <p>[<a href="#ToC-IntraDocNav">ToC</a>]</p>
+
+ <h2 id="id-Disposing"><a name="Disposing" id=
+ "Disposing">Printing, Mailing, and Saving rendered files to
+ disk.</a></h2>
+
+ <p>Rendered HTML documents, and plain text files, may be printed
+ using the &ldquo;<samp>p</samp>&rdquo; command while viewing the
+ document. After pressing the &ldquo;<samp>p</samp>&rdquo; key a
+ menu of <em>Print Options</em> will be displayed. The menu will
+ vary according to several factors. First, some sites set up
+ special accounts to let users run Lynx to access local
+ information systems. Typically these accounts require no
+ passwords and do not require users to identify themselves. As a
+ result such accounts are called "anonymous" accounts, and their
+ users are considered "anonymous" users. In most configurations,
+ all Lynx users (including anonymous users) are able to mail files
+ to themselves and print the entire file to the screen.</p>
+
+ <p>Additional print options are available for users who are using
+ Lynx from their own accounts (that is, so-called "non-anonymous
+ users"). In particular, the <em>Save to a local file</em> option
+ allows you to save the document into a file on your disk space.
+ Additional print options may also be available as configured in
+ the <a href="#lynx.cfg">lynx.cfg</a> file.</p>
+
+ <p>Some options, such as <em>Save to a local file</em>, involve
+ prompting for an output filename. All output filename entries are
+ saved in a circular buffer, and any previous entries can be
+ retrieved for re-use by pressing the <em>up-arrow</em> or
+ <em>down-arrow</em> keys at the prompt.</p>
+
+ <p>Note that if you want exact copies of text files without any
+ expansions of TAB characters to spaces you should use the
+ <a href="#RemoteSource">Download</a> options.</p>
+
+ <p>[<a href="#ToC-Disposing">ToC</a>]</p>
+
+ <h2 id="id-LocalSource"><a name="LocalSource" id=
+ "LocalSource">Viewing the HTML document source and editing
+ documents</a></h2>
+
+ <p>When viewing HTML documents it is possible to retrieve and
+ display the unrendered (i.e., the original HTML) source of the
+ document by pressing the &ldquo;<samp>\</samp>&rdquo; (backslash)
+ key. Lynx usually caches only the rendering of the document and
+ does not keep the source (unless it is configured to do so in the
+ <a href="#lynx.cfg">lynx.cfg</a> file), so to display the source
+ unrendered, Lynx must reload it from the server or disk. When
+ viewing unrendered documents you may print them as any normal
+ document.</p>
+
+ <p>Selecting the <em>Print to a local file</em> option from the
+ Print Menu, makes it possible to save the source of the document
+ to disk so that you may have a local copy of the document source,
+ but it is better to <a href="#RemoteSource">Download</a> the
+ source.</p>
+
+ <p>NOTE: When saving an HTML document it is important to name the
+ document with a <em>.html</em> or <em>.htm</em> extension, if you
+ want to read it with Lynx again later.</p>
+
+ <p id="FileEdit">Lynx can allow users to edit documents that
+ reside on the local system. To enable editing, documents must be
+ referenced using a "file:" URL or by specifying a plain filename
+ on the command line as in the following two examples:</p>
+
+ <dl>
+ <dt>Command</dt>
+
+ <dd><code>lynx file://localhost/FULL/PATH/FILENAME</code>
+ </dd>
+
+ <dd><code>lynx path/filename.html</code>
+ </dd>
+ </dl>
+
+ <p>In addition, the user must also specify an editor in the
+ <em>Options Menu</em> so that Lynx knows which editor to use. If
+ the file is specified correctly and an editor is defined, then
+ you may edit documents by using the &ldquo;<samp>e</samp>&rdquo;
+ command. When the &ldquo;<samp>e</samp>&rdquo; command is entered
+ your specified editor is spawned to edit the file. After changes
+ are completed, exit your editor and you will return to Lynx. Lynx
+ will reload and render the file so that changes can be
+ immediately examined.</p>
+
+ <p>[<a href="#ToC-LocalSource">ToC</a>]</p>
+
+ <h2 id="id-RemoteSource"><a name="RemoteSource" id=
+ "RemoteSource">Downloading and Saving source files.</a></h2>
+
+ <p>If the DOWNLOAD keystroke command
+ (&ldquo;<samp>d</samp>&rdquo; or &ldquo;<samp>D</samp>&rdquo;) is
+ used when positioned on a link for an HTML, plain text, or binary
+ file, Lynx will transfer the file, without rendering, into a
+ temporary location and present the user with a list of options,
+ just as it does when a link for a binary file of a type for which
+ no viewer has been mapped is activated.</p>
+
+ <p>There is a default <em>Download option</em> of <em>Save to
+ disk</em>. This is disabled if Lynx is running in anonymous mode.
+ Any number of download methods such as kermit and zmodem may be
+ defined in addition to this default in the <em>lynx.cfg</em>
+ file. Using the <em>Save to disk</em> option under the PRINT
+ command after viewing the source of an HTML with the VIEW SOURCE
+ (<samp>\</samp>) command will result in a file which differs from
+ the original source in various ways such as tab characters
+ expanded to spaces. Lynx formats the source presentation in this
+ mode. On the other hand, if the DOWNLOAD command is used, the
+ only change will be that Lynx optionally puts</p>
+
+ <blockquote>
+ <p>&lt;!--X-URL: http://www.site.foo/path/to/file.html
+ --&gt;<br>
+ &lt;BASE href="http://www.site.foo/path/to/file.html"&gt;</p>
+ </blockquote>
+
+ <p>at the start of the file so that relative URLs in the document
+ will still work. Even this modification can be prevented by
+ setting PREPEND_BASE_TO_SOURCE:FALSE in lynx.cfg.</p>
+
+ <p>Some options, such as <em>Save to disk</em>, involve prompting
+ for an output filename. All output filename entries are saved in
+ a circular buffer, and any previous entries can be retrieved for
+ re-use by pressing the <em>up-arrow</em> or <em>down-arrow</em>
+ keys at the prompt.</p>
+
+ <p>[<a href="#ToC-RemoteSource">ToC</a>]</p>
+
+ <h2 id="id-ReDo"><a name="ReDo" id="ReDo">Reloading files and
+ refreshing the display</a></h2>
+
+ <p>The RELOAD (<em>Control-R</em>) command will reload and
+ re-render the file that you are currently viewing. The REFRESH
+ (<em>Control-L</em> or <em>Control-W</em>) command will refresh
+ or wipe the screen to remove or correct any errors that may be
+ caused by operating system or other messages.</p>
+
+ <p>The NOCACHE (&ldquo;<samp>x</samp>&rdquo; or
+ &ldquo;<samp>X</samp>&rdquo;) command can be used in lieu of
+ ACTIVATE (<em>Return</em> or <em>right-arrow</em>) to request an
+ uncached copy and new rendition for the current link, or
+ resubmission of a FORM, if a cache from a previous request or
+ submission exits. The request or submission will include
+ <em>Pragma: no-cache</em> and <em>Cache-Control: no-cache</em> in
+ its headers. Note that FORMs with POST content will be
+ resubmitted regardless of whether the NOCACHE or ACTIVATE command
+ is used (see <a href="#Forms"><em>Lynx and HTML
+ Forms</em></a>).</p>
+
+ <p>[<a href="#ToC-ReDo">ToC</a>]</p>
+
+ <h2 id="id-Search"><a name="Search" id="Search">Lynx searching
+ commands</a></h2>
+
+ <p>Two commands activate searching in Lynx:
+ &ldquo;<samp>/</samp>&rdquo; and
+ &ldquo;<samp>s</samp>&rdquo;.</p>
+
+ <p>While viewing a normal document use the
+ &ldquo;<samp>/</samp>&rdquo; command to find a word or phrase
+ within the current document. The search type will depend on the
+ search option setting in the <a href=
+ "#InteractiveOptions">Options Menu</a>. The search options are
+ case sensitive and case insensitive. These searches are entirely
+ local to Lynx.</p>
+
+ <p>Some documents are designated <em>index documents</em> by
+ virtue of an ISINDEX element in their HEAD section. These
+ documents can be used to retrieve additional information based on
+ searches using words or phrases submitted to an index server. The
+ Lynx statusline will indicate that you are viewing such a
+ document, and if so, the &ldquo;<samp>s</samp>&rdquo; key will
+ invoke a statusline prompt to enter a query string. The prompt
+ can be specified via a PROMPT attribute in the ISINDEX element.
+ Otherwise, Lynx will use an internally configured prompt. The
+ address for submitting the search can be specified via an HREF or
+ ACTION attribute. Otherwise, Lynx will use the current document's
+ URL and append your query string as a <em>?searchpart</em> (see
+ <a href="lynx_url_support.html">Supported URLs</a>).</p>
+
+ <p>All search words or strings which you have entered during a
+ Lynx session are saved in a circular buffer, and can be retrieved
+ for re-use by pressing the <em>up-arrow</em> or
+ <em>down-arrow</em> keys at the prompt for a search word or
+ string. Also, you can use the &ldquo;<samp>n</samp>&rdquo;ext
+ command to repeat a search with the last-entered search word or
+ phrase, starting from the current position in the document. The
+ word or phrase matches will be highlighted throughout the
+ document, but such highlighting will not persist for new
+ documents, or if the current document is reloaded. The search
+ cycles to the top of the document if the word or phrase is not
+ located below your current position.</p>
+
+ <p>Although <a href="#Forms">HTML Forms</a> have largely replaced
+ index documents for searches via http servers, they are still
+ useful for performing searches directly via WAIS or Gopher
+ servers in conjunction with the internal gateways for such
+ servers. For example, an HTML index document can act as a
+ <em>cover page</em> describing a WAIS database and how to
+ formulate query strings for searching it, and include an element
+ such as:</p>
+
+ <pre>
+ <em>&lt;ISINDEX PROMPT="Enter WAIS query:"
+ HREF="wais://net.bio.net/biologists-addresses"&gt;</em>
+</pre>
+ <p>for submitting a search of the Biologist's Addresses database
+ directly to the net.bio.net WAIS server.</p>
+
+ <p>[<a href="#ToC-Search">ToC</a>]</p>
+
+ <h2 id="id-InteractiveOptions"><a name="InteractiveOptions" id=
+ "InteractiveOptions">Lynx Options Menu</a></h2>
+
+ <p>The Lynx <em>Options Menu</em> may be accessed by pressing the
+ &ldquo;<samp>o</samp>&rdquo; key. It allows you to change options
+ at runtime, if you need to. Most changes are read from &amp;
+ saved to your .lynxrc file; those which are not are marked (!) in
+ the form-based menu (as below). Many other options are stored in
+ the <a href="#lynx.cfg">lynx.cfg</a> file.</p>
+
+ <p>Lynx supports two styles of Options Menu:</p>
+
+ <ul>
+ <li><a name="item-form_based_options" href=
+ "#explain-form_based_options" id=
+ "item-form_based_options">form-based</a></li>
+
+ <li><a name="item-key_based_options" href=
+ "#explain-key_based_options" id=
+ "item-key_based_options">key-based</a></li>
+ </ul>
+
+ <p id="explain-form_based_options">The form-based menu shown
+ below is an HTML file generated at runtime, in which the user
+ fills in choices as in any ordinary HTML form.</p>
+
+ <pre>
+
+ <a href="#item-form_based_options" name=
+"example-form_based_options" id=
+"example-form_based_options">Options Menu (Lynx Version 2.9.0dev.7)</a>
+
+ Accept Changes - Reset Changes - Left Arrow cancels changes - HELP!
+
+ Save options to disk: [ ]
+ (options marked with (!) will not be saved)
+
+ General Preferences
+ User mode : <a href=
+"#optinfo-user_mode">[Advanced____]</a>
+ Editor : <a href=
+"#optinfo-editor">vile______________________________________</a>
+ Type of Search : <a href=
+"#optinfo-type_of_search">[Case insensitive]</a>
+
+ Security and Privacy
+ Cookies : <a href=
+"#optinfo-cookies">[ask user__]</a>
+ Invalid-Cookie Prompting (!) : <a href=
+"#optinfo-invalid_cookie_prompting">[prompt normally___]</a>
+ SSL Prompting (!) : <a href=
+"#optinfo-ssl_prompting">[prompt normally___]</a>
+
+ Keyboard Input
+ Keypad mode : <a href=
+"#optinfo-keypad_mode">[Numbers act as arrows_____________]</a>
+ Emacs keys : <a href=
+"#optinfo-emacs_keys">[OFF]</a>
+ VI keys : <a href=
+"#optinfo-vi_keys">[OFF]</a>
+ Line edit style : <a href=
+"#optinfo-line_edit_style">[Bash-like Bindings]</a>
+
+ Display and Character Set
+ Use locale-based character set : <a href=
+"#optinfo-locale_based_charset">[ON_]</a>
+ Use HTML5 charset replacements(!): <a href=
+"#optinfo-use_html5_charset">[OFF]</a>
+ Display character set : <a href=
+"#optinfo-display_charset">[UNICODE (UTF-8)________________]</a>
+ Assumed document character set(!): <a href=
+"#optinfo-assumed_document_charset">[iso-8859-1______]</a>
+ Internationalized domain names(!): <a href=
+"#optinfo-idna_mode">[IDNA TR46______]</a>
+ Raw 8-bit : <a href=
+"#optinfo-raw_8_bit">[OFF]</a>
+ X Display : <a href=
+"#optinfo-x_display">localhost:0.0_____________________________</a>
+
+ Document Appearance
+ Show color : <a href=
+"#optinfo-show_color">[ON____]</a>
+ Color style (!) : [lynx.lss___________]
+ Default colors (!) : [ON_]
+ Show cursor : <a href=
+"#optinfo-show_cursor">[OFF]</a>
+ Underline links (!) : <a href=
+"#optinfo-underline_links">[OFF]</a>
+ Show scrollbar : <a href=
+"#optinfo-show_scrollbar">[ON_]</a>
+ Popups for select fields : <a href=
+"#optinfo-popups_for_select">[ON_]</a>
+ HTML error recovery : <a href=
+"#optinfo-html_error_recovery">[strict (SortaSGML mode)]</a>
+ Bad HTML messages (!) : <a href=
+"#optinfo-bad_html_messages">[Warn, point to trace-file]</a>
+ Show images : <a href=
+"#optinfo-show_images">[ignore___]</a>
+ Verbose images : <a href=
+"#optinfo-verbose_images">[OFF__________]</a>
+ Collapse BR tags (!) : <a href=
+"#optinfo-collapse_br_tags">[OFF_____]</a>
+ Trim blank lines (!) : <a href=
+"#optinfo-trim_blank_lines">[trim-lines]</a>
+
+ Headers Transferred to Remote Servers
+ Personal mail address : <a href=
+"#optinfo-personal_mail_address">__________________________________________</a>
+ Personal name for mail : <a href=
+"#optinfo-personal_name_for_mail">__________________________________________</a>
+ Password for anonymous ftp : <a href=
+"#optinfo-password_for_anon_ftp">__________________________________________</a>
+ Preferred media type (!) : <a href=
+"#optinfo-preferred_media_type">[Accept lynx's internal types]</a>
+ Preferred encoding (!) : <a href=
+"#optinfo-preferred_encoding">[All_____]</a>
+ Preferred document character set : <a href=
+"#optinfo-preferred_doc_charset">_________________________________</a>
+ Preferred document language : <a href=
+"#optinfo-preferred_doc_language">en_______________________________</a>
+ HTTP protocol (!) : <a href=
+"#optinfo-http_protocol">[HTTP 1.0]</a>
+ Send User-Agent header (!) : <a href=
+"#optinfo-send_user_agent">[X]</a>
+ User-Agent header (!) : <a href=
+"#optinfo-user_agent">Lynx/2.8.9rel.1 libwww-FM/2.14 SSL-MM/1.4.</a>
+
+ Listing and Accessing Files
+ Use Passive FTP (!) : <a href=
+"#optinfo-use_passive_ftp">[ON_]</a>
+ FTP sort criteria : <a href=
+"#optinfo-ftp_sort_criteria">[By Date]</a>
+ Local directory sort criteria : <a href=
+"#optinfo-local_directory_sort_criteria">[Directories first]</a>
+ Local directory sort order : <a href=
+"#optinfo-local_directory_sort_order">[By Date_]</a>
+ Show dot files : <a href=
+"#optinfo-show_dot_files">[OFF]</a>
+ Pause when showing message (!) : <a href=
+"#optinfo-pause_when_showing_message">[ON_]</a>
+ Show transfer rate : <a href=
+"#optinfo-show_transfer_rate">[Show KiB/sec (2-digits), ETA__]</a>
+
+ Special Files and Screens
+ Multi-bookmarks : <a href=
+"#optinfo-multi_bookmarks">[ADVANCED]</a>
+ Review/edit Bookmarks files : Goto multi-bookmark menu
+ Auto Session (!) : <a href=
+"#optinfo-auto_session">[OFF]</a>
+ Session file (!) : <a href=
+"#optinfo-session_file">__________________________________________</a>
+ Visited Pages : <a href=
+"#optinfo-visited_pages">[By Last Visit Reversed_]</a>
+
+ View the file lynx.cfg.
+
+ Accept Changes - Reset Changes - Left Arrow cancels changes
+</pre>
+ <p id="explain-key_based_options">The key-based menu depends on
+ key-strokes to identify options which the user wants to change.
+ It is compiled into Lynx and is accessed by setting FORMS_OPTIONS
+ to TRUE in <code>lynx.cfg</code>.</p>
+
+ <pre>
+
+ <a href="#item-key_based_options" name=
+"example-key_based_options" id=
+"example-key_based_options">Options Menu (Lynx Version 2.9.0dev.7)</a>
+
+ <a href=
+"#optinfo-editor">(E)</a>ditor : emacs
+ <a href=
+"#optinfo-x_display">(D)</a>ISPLAY variable : aixtest.cc.ukans.edu:0.0
+ mu<a href=
+"#optinfo-multi_bookmarks">(L)</a>ti-bookmarks: OFF <a href=
+"#optinfo-bookmark_file">B)</a>ookmark file: lynx_bookmarks.html
+ <a href=
+"#optinfo-ftp_sort_criteria">(F)</a>TP sort criteria : By Filename
+ <a href=
+"#optinfo-personal_mail_address">(P)</a>ersonal mail address : montulli@netscape.com
+ <a href=
+"#optinfo-type_of_search">(S)</a>earching type : CASE INSENSITIVE
+ preferred document lan<a href=
+"#optinfo-preferred_doc_language">(G)</a>uage: en
+ preferred document c<a href=
+"#optinfo-preferred_doc_charset">(H)</a>arset : NONE
+ display <a href=
+"#optinfo-display_charset">(C)</a>haracter set : Western (ISO-8859-1)
+ raw 8-bit or CJK m<a href=
+"#optinfo-raw_8_bit">(O)</a>de : ON show color <a href=
+"#optinfo-show_color">(&amp;)</a> : OFF
+ <a href="#optinfo-vi_keys">(V)</a>I keys: OFF e<a href=
+"#optinfo-emacs_keys">(M)</a>acs keys: OFF sho<a href=
+"#optinfo-show_dot_files">(W)</a> dot files: OFF
+ popups for selec<a href=
+"#optinfo-popups_for_select">(T)</a> fields : ON show cursor <a href="#optinfo-show_cursor">(@)</a> : OFF
+ <a href=
+"#optinfo-keypad_mode">(K)</a>eypad mode : Numbers act as arrows
+ li<a href=
+"#optinfo-line_edit_style">(N)</a>e edit style : Default Binding
+ l<a href=
+"#optinfo-local_directory_sort_criteria">(I)</a>st directory style : Mixed style
+ <a href=
+"#optinfo-user_mode">(U)</a>ser mode : Advanced verbose images <a href="#optinfo-verbose_images">(!)</a> : ON
+ user <a href=
+"#optinfo-user_agent">(A)</a>gent : [User-Agent header]
+ local e<a href=
+"#optinfo-execution_links">(X)</a>ecution links : FOR LOCAL FILES ONLY
+</pre>
+ <p>An option can be changed by entering the capital letter or
+ character in parentheses for the option you wish to change (e.g.,
+ &ldquo;<samp>E</samp>&rdquo; for Editor or
+ &ldquo;<samp>@</samp>&rdquo; for show cursor). For fields where
+ text must be entered, simply enter the text by typing on the
+ keyboard. The <a href="keystrokes/edit_help.html">Line Editor</a>
+ can be used to correct mistakes, and <em>Control-U</em> can be
+ used to erase the line. When you are done entering a change press
+ the <em>Return</em> key to get back to the <em>Command?</em>
+ prompt.</p>
+
+ <p>For fields where you must choose one of two choices, press any
+ key to toggle the choices and press the <em>Return</em> key to
+ finish the change.</p>
+
+ <p>For fields where you potentially have more than two choices,
+ popup windows may be evoked which function homologously to those
+ for select fields in <a href="#Forms">HTML Forms</a>. The popup
+ windows will be invoked only if you have popups for select fields
+ set to ON (see below). Otherwise, your cursor will be positioned
+ at the current choice, and you can press any key to cycle through
+ the choices, then press the <em>Return</em> key to finish the
+ change.</p>
+
+ <p>When you are done changing options use the
+ &ldquo;<samp>r</samp>&rdquo; command to return to Lynx or the
+ &ldquo;<samp>&gt;</samp>&rdquo; command to save the options to a
+ <em>.lynxrc</em> file and return to Lynx.</p>
+
+ <p>The following table describes the options available on the
+ <em>Options Menu</em>:</p>
+
+ <dl>
+ <dt><a name="optinfo-assumed_document_charset" id=
+ "optinfo-assumed_document_charset">Assumed document character
+ set</a>
+ </dt>
+
+ <dd>
+ <p>This option changes the handling of documents which do not
+ explicitly specify a charset. Normally Lynx assumes that
+ 8-bit characters in those documents are encoded according to
+ iso-8859-1 (the official default for the HTTP protocol).
+ Unfortunately, many non-English web pages "forget" to include
+ proper charset info; this option helps you to browse those
+ broken pages if you know by some means what the charset
+ is.</p>
+
+ <p>When the value given here or by an -assume_charset command
+ line flag is in effect, Lynx will treat documents as if they
+ were encoded accordingly. This option active when &ldquo;Raw
+ 8-bit or CJK Mode&rdquo; is OFF.</p>
+ </dd>
+
+ <dt><a name="optinfo-auto_session" id=
+ "optinfo-auto_session">Auto Session</a>
+ </dt>
+
+ <dd>
+ <p>Lynx can save and restore useful information about your
+ browsing history. Use this setting to enable or disable the
+ feature.</p>
+ </dd>
+
+ <dt><a name="optinfo-bad_html_messages" id=
+ "optinfo-bad_html_messages">Bad HTML messages</a>
+ </dt>
+
+ <dd>
+ <p>Suppress or redirect Lynx's messages about "Bad HTML":</p>
+
+ <dl>
+ <dt>Ignore</dt>
+
+ <dd>
+ <p>do not warn; no details are written to the
+ trace-file.</p>
+ </dd>
+
+ <dt>Add to trace-file</dt>
+
+ <dd>
+ <p>add the detailed warning message to the
+ trace-file.</p>
+ </dd>
+
+ <dt>Add to LYNXMESSAGES</dt>
+
+ <dd>
+ <p>add the detailed warning message to the message page
+ at "LYNXMESSAGES:".</p>
+ </dd>
+
+ <dt>Warn, point to trace-file</dt>
+
+ <dd>
+ <p>show a warning message on the status line; the
+ complete message is written to the trace-file.</p>
+ </dd>
+ </dl>
+ </dd>
+
+ <dt><a name="optinfo-bookmark_file" id=
+ "optinfo-bookmark_file">Bookmark file</a>
+ </dt>
+
+ <dd>
+ <p>When multi-bookmarks is OFF, this is the filename and
+ location of your default personal bookmark file. Enter
+ &ldquo;<samp>B</samp>&rdquo; to modify the filename and/or
+ location via the <a href="keystrokes/edit_help.html">Line
+ Editor</a>. Bookmark files allow frequently traveled links to
+ be stored in personal easy to access files.</p>
+
+ <p>Using the &ldquo;<samp>a</samp>&rdquo;dd bookmark link
+ command (see <a href="#Bookmarks">Lynx bookmarks</a>) you may
+ save any link that does not have associated POST content into
+ a bookmark file. All bookmark files must be in or under your
+ account's home directory. If the location specified does not
+ begin with a dot-slash (./), its presence will still be
+ assumed, and referenced to the home directory.</p>
+
+ <p>When multi-bookmarks is STANDARD or ADVANCED, entering
+ &ldquo;<samp>B</samp>&rdquo; will invoke a menu of up to 26
+ bookmark files (associated with the letters of the English
+ alphabet), for editing their filenames and locations
+ (<em>filepath</em>), and descriptions.</p>
+
+ <p>Lynx will create bookmark files, if they do not already
+ exist, when you first &ldquo;<samp>a</samp>&rdquo;dd a
+ bookmark link to them. However, if you've specified a
+ subdirectory (e.g., ./BM/lynx_bookmarks.html), that
+ subdirectory must already exist. Note that on VMS you should
+ use the URL syntax for the filepath (e.g., <em>not</em>
+ [.BM]lynx_bookmarks.html).</p>
+ </dd>
+
+ <dt><a name="optinfo-collapse_br_tags" id=
+ "optinfo-collapse_br_tags">Collapse BR tags</a>
+ </dt>
+
+ <dd>
+ <p>If <em>Collapse BR tags</em> is turned off, Lynx will not
+ collapse serial <code>BR</code> tags. If turned on, i.e.,
+ &ldquo;collapse&rdquo;, two or more concurrent
+ <code>BR</code>s will be collapsed into a single line break.
+ Note that the valid way to insert extra blank lines in HTML
+ is via a <code>PRE</code> block with only newlines in the
+ block.</p>
+ </dd>
+
+ <dt><a name="optinfo-cookies" id="optinfo-cookies">Cookies</a>
+ </dt>
+
+ <dd>
+ <p>This option allows you to tell how to handle cookies:
+ <em>ignore</em>, prompt (<em>ask user</em>) or <em>accept
+ all</em>.</p>
+ </dd>
+
+ <dt><a name="optinfo-display_charset" id=
+ "optinfo-display_charset">Display Character set</a>
+ </dt>
+
+ <dd>
+ <p>This option allows you to set up the default character set
+ for your specific terminal. The display character set
+ provides a mapping from the character encodings of viewed
+ documents and from HTML entities into viewable characters. It
+ should be set according to your terminal's character set so
+ that characters other than 7-bit ASCII can be displayed
+ correctly, using approximations if necessary. You must have
+ the selected character set installed on your terminal. (Since
+ Lynx supports a wide range of platforms it may be useful to
+ note that cpXXX codepages used within IBM PC computers, and
+ windows-xxxx within native MS-Windows apps.)</p>
+ </dd>
+
+ <dt><a name="optinfo-editor" id="optinfo-editor">Editor</a>
+ </dt>
+
+ <dd>
+ <p>The editor to be invoked when editing browsable files,
+ when sending mail or comments, when preparing a news article
+ for posting, and for external TEXTAREA editing. The full
+ pathname of the editor command should be specified when
+ possible.</p>
+
+ <p>If a full pathname is given, this helps Lynx provide for
+ detecting if options were also provided in this field. In
+ this case, it will also quote the pathname, allowing for
+ embedded blanks and other special characters that might
+ confuse the shell which starts the editor program.</p>
+ </dd>
+
+ <dt><a name="optinfo-emacs_keys" id="optinfo-emacs_keys">Emacs
+ keys</a>
+ </dt>
+
+ <dd>
+ <p>If set to ON then the CTRL-P, CTRL-N, CTRL-F, and CTRL-B
+ keys will be mapped to up-arrow, down-arrow, right-arrow, and
+ left-arrow, respectively. Otherwise, they remain mapped to
+ their configured bindings (normally UP_TWO lines, DOWN_TWO
+ lines, NEXT_PAGE, and PREV_PAGE, respectively).</p>
+
+ <p>Note: this has no direct effect on the line-editor's key
+ bindings.</p>
+ </dd>
+
+ <dt><a name="optinfo-execution_links" id=
+ "optinfo-execution_links">Execution links</a>
+ </dt>
+
+ <dd>
+ <p>This deals with execution of local scripts or links. Local
+ execution is activated when Lynx is first set up. If it has
+ not been activated you will not see this option in the
+ <em>Options Menu</em>.</p>
+
+ <p>When a local execution script is encountered Lynx checks
+ the users options to see whether the script can be executed.
+ Users have the following options:</p>
+
+ <dl>
+ <dt>Always off</dt>
+
+ <dd>
+ <p>Local execution scripts will never be executed</p>
+ </dd>
+
+ <dt>For Local files only</dt>
+
+ <dd>
+ <p>Local execution scripts will only be executed if the
+ script to be executed resides on the local machine, and
+ is referenced by a URL that begins with
+ <em>file://localhost</em></p>
+ </dd>
+
+ <dt>Always on</dt>
+
+ <dd>
+ <p>All local execution scripts will be executed</p>
+ </dd>
+ </dl>
+ </dd>
+
+ <dd>
+ <p>If the users options permit the script to be executed Lynx
+ will spawn a shell and run the script. If the script cannot
+ be executed Lynx will show the script within the Lynx window
+ and inform the user that the script is not allowed to be
+ executed and will ask the user to check his/her options.</p>
+ </dd>
+
+ <dt><a name="optinfo-ftp_sort_criteria" id=
+ "optinfo-ftp_sort_criteria">FTP sort criteria</a>
+ </dt>
+
+ <dd>
+ <p>This option allows you to specify how files will be sorted
+ within FTP listings. The current options include "<code>By
+ Filename</code>", "<code>By Size</code>", "<code>By
+ Type</code>", and "<code>By Date</code>".</p>
+ </dd>
+
+ <dt><a name="optinfo-html_error_recovery" id=
+ "optinfo-html_error_recovery">HTML error recovery</a>
+ </dt>
+
+ <dd>
+ <p>Select the <a href=
+ "keystrokes/option_help.html#tagsoup">recovery mode</a> used
+ by Lynx.</p>
+ </dd>
+
+ <dt><a name="optinfo-http_protocol" id=
+ "optinfo-http_protocol">HTTP protocol</a>
+ </dt>
+
+ <dd>
+ <p>Normally Lynx negotiates HTTP/1.0, because it does not
+ support chunked transfer (a requirement for all HTTP/1.1
+ clients), although it supports several other features of
+ HTTP/1.1. You may encounter a server which does not support
+ HTTP/1.0 which can be used by switching to the later
+ protocol.</p>
+ </dd>
+
+ <dt><a name="optinfo-idna_mode" id=
+ "optinfo-idna_mode">Internationalized domain names</a>
+ </dt>
+
+ <dd>
+ Convert internationalized domain names to and from ASCII.
+ <dl>
+ <dt>IDNA 2003</dt>
+
+ <dd>Convert using the older &ldquo;transitional&rdquo;
+ scheme.</dd>
+
+ <dt>IDNA 2008</dt>
+
+ <dd>Convert using the newer &ldquo;non-transitional&rdquo;
+ scheme.</dd>
+
+ <dt>IDNA TR46</dt>
+
+ <dd>Use IDNA 2008 with the amendments from Unicode <a href=
+ "http://www.unicode.org/reports/tr46">Technical Report
+ 46</a>.</dd>
+
+ <dt>IDNA Compatible</dt>
+
+ <dd>First try converting using IDNA 2008, and if
+ unsuccessful, try IDNA 2003.</dd>
+ </dl>
+ </dd>
+
+ <dt><a name="optinfo-invalid_cookie_prompting" id=
+ "optinfo-invalid_cookie_prompting">Invalid-Cookie Prompting</a>
+ </dt>
+
+ <dd>
+ <p>This allows you to tell how to handle invalid cookies:
+ <em>prompt normally</em> to prompt for each cookie, <em>force
+ yes-response</em> to reply "yes" to each prompt, <em>force
+ no-response</em> to reply "no" to each prompt.</p>
+ </dd>
+
+ <dt><a name="optinfo-keypad_mode" id=
+ "optinfo-keypad_mode">Keypad mode</a>
+ </dt>
+
+ <dd>
+ <p>This option gives the choice among navigating with the
+ arrow keys, or having every link numbered so that the links
+ may be selected or made current by numbers as well as using
+ the arrow keys, or having every link as well as every form
+ field numbered so that they can be selected or sought by
+ numbers. See the<br>
+ &nbsp;&nbsp;<a href="keystrokes/follow_help.html">Follow link
+ (or page) number:</a> and<br>
+ &nbsp;&nbsp;<a href=
+ "keystrokes/follow_help.html#select-option">Select option (or
+ page) number:</a><br>
+ help for more information.</p>
+ </dd>
+
+ <dt><a name="optinfo-line_edit_style" id=
+ "optinfo-line_edit_style">Line edit style</a>
+ </dt>
+
+ <dd>
+ <p>This option allows you to set alternative key bindings for
+ the built-in line editor, if alternative line-edit bindings
+ have been compiled in. Otherwise, Lynx uses the <a href=
+ "keystrokes/edit_help.html">Default Binding</a>.</p>
+ </dd>
+
+ <dt><a name="optinfo-local_directory_sort_criteria" id=
+ "optinfo-local_directory_sort_criteria">Local directory sort
+ criteria</a>
+ </dt>
+
+ <dd>
+ <p>This applies to directory editing. Files and directories
+ can be presented in the following ways:</p>
+
+ <dl>
+ <dt>Mixed style</dt>
+
+ <dd>
+ <p>Files and directories are listed together in
+ alphabetical order.</p>
+ </dd>
+
+ <dt>Directories first</dt>
+
+ <dd>
+ <p>Files and directories are separated into two
+ alphabetical lists. Directories are listed first.</p>
+ </dd>
+
+ <dt>Files first</dt>
+
+ <dd>
+ <p>Files and directories are separated into two
+ alphabetical lists. Files are listed first.</p>
+ </dd>
+ </dl>
+ </dd>
+
+ <dt><a name="optinfo-local_directory_sort_order" id=
+ "optinfo-local_directory_sort_order">Local directory sort
+ order</a>
+ </dt>
+
+ <dd>
+ <p>The Options Form also allows you to sort by the file
+ attributes.</p>
+
+ <dl>
+ <dt>By name</dt>
+
+ <dd>
+ <p>by filename (the default)</p>
+ </dd>
+
+ <dt>By size</dt>
+
+ <dd>
+ <p>by file size, in descending order</p>
+ </dd>
+
+ <dt>By date</dt>
+
+ <dd>
+ <p>by file modification time, in descending order</p>
+ </dd>
+
+ <dt>By mode</dt>
+
+ <dd>
+ <p>by file protection</p>
+ </dd>
+
+ <dt>By type</dt>
+
+ <dd>
+ <p>by filename suffix, e.g., the text beginning with
+ &ldquo;.&rdquo;</p>
+ </dd>
+
+ <dt>By user</dt>
+
+ <dd>
+ <p>by file owner's user-id</p>
+ </dd>
+
+ <dt>By group</dt>
+
+ <dd>
+ <p>by file owner's group-id</p>
+ </dd>
+ </dl>
+ </dd>
+
+ <dt><a name="optinfo-multi_bookmarks" id=
+ "optinfo-multi_bookmarks">Multi-bookmarks</a>
+ </dt>
+
+ <dd>
+ <p>Lynx supports a default bookmark file, and up to 26 total
+ bookmark files (see below). When multi-bookmarks is OFF, the
+ default bookmark file is used for the
+ &ldquo;<samp>v</samp>&rdquo;iew bookmarks and
+ &ldquo;<samp>a</samp>&rdquo;dd bookmark link commands. If
+ multi-bookmark support is available in your account, the
+ setting can be changed to STANDARD or ADVANCED. In STANDARD
+ mode, a menu of available bookmarks always is invoked when
+ you seek to view a bookmark file or add a link, and you
+ select the bookmark file by its letter token (see
+ <em>Bookmark file</em>, below) in that menu. In ADVANCED
+ mode, you instead are prompted for the letter of the desired
+ bookmark file, but can enter &ldquo;<samp>=</samp>&rdquo; to
+ invoke the STANDARD selection menu, or <em>RETURN</em> for
+ the default bookmark file.</p>
+ </dd>
+
+ <dt><a name="optinfo-password_for_anon_ftp" id=
+ "optinfo-password_for_anon_ftp">Password for anonymous ftp</a>
+ </dt>
+
+ <dd>
+ <p>If this is blank, Lynx will use your personal mail address
+ as the anonymous ftp password. Though that is the convention,
+ some users prefer to use some other string which provides
+ less information. If the given value lacks a "@", Lynx also
+ will use your computer's hostname as part of the password. If
+ both this field and the personal mail address are blank, Lynx
+ will use your $USER environment variable, or "WWWuser" if
+ even the environment variable is unset.</p>
+ </dd>
+
+ <dt><a name="optinfo-pause_when_showing_message" id=
+ "optinfo-pause_when_showing_message">Pause when showing
+ message</a>
+ </dt>
+
+ <dd>
+ <p>If set to "off", this overrides the INFOSECS setting in
+ lynx.cfg, to eliminate pauses when displaying informational
+ messages, like the "-nopause" command line option.</p>
+ </dd>
+
+ <dt><a name="optinfo-personal_mail_address" id=
+ "optinfo-personal_mail_address">Personal mail address</a>
+ </dt>
+
+ <dd>
+ <p>This mail address will be used to help you send files to
+ yourself and will be included as the From: address in any
+ mail or comments that you send. It will also be sent as the
+ From: field in HTTP or HTTPS requests if inclusion of that
+ header has been enabled via the NO_FROM_HEADER definition in
+ <a href="#lynx.cfg">lynx.cfg</a> (the compilation default is
+ not to send the header), or via the <em>-from</em> command
+ line toggle.</p>
+ </dd>
+
+ <dt><a name="optinfo-personal_name_for_mail" id=
+ "optinfo-personal_name_for_mail">Personal mail name</a>
+ </dt>
+
+ <dd>
+ <p>This mail name will be included as the "X-Personal_Name"
+ field in any mail or comments that you send if that header
+ has not been disabled via the NO_ANONYMOUS_EMAIL definition
+ in <a href="#lynx.cfg">lynx.cfg</a>.</p>
+ </dd>
+
+ <dt><a name="optinfo-popups_for_select" id=
+ "optinfo-popups_for_select">Popups for select fields</a>
+ </dt>
+
+ <dd>
+ <p>Lynx normally uses a popup window for the OPTIONs in form
+ SELECT fields when the field does not have the MULTIPLE
+ attribute specified, and thus only one OPTION can be
+ selected. The use of popup windows can be disabled by
+ changing this setting to OFF, in which case the OPTIONs will
+ be rendered as a list of radio buttons. Note that if the
+ SELECT field does have the MULTIPLE attribute specified, the
+ OPTIONs always are rendered as a list of checkboxes.</p>
+ </dd>
+
+ <dt><a name="optinfo-preferred_doc_language" id=
+ "optinfo-preferred_doc_language">Preferred document
+ language</a>
+ </dt>
+
+ <dd>
+ <p>The language you prefer if multi-language files are
+ available from servers. Use RFC 1766 abbreviations, e.g., en
+ for English, fr for French, etc. Can be a comma-separated
+ list, which may be interpreted by servers as descending order
+ of preferences. You can also make your order of preference
+ explicit by using q factors as defined by the HTTP protocol,
+ for servers which understand it, for example:
+ da,&nbsp;en-gb;q=0.8,&nbsp;en;q=0.7</p>
+ </dd>
+
+ <dt><a name="optinfo-preferred_doc_charset" id=
+ "optinfo-preferred_doc_charset">Preferred document charset</a>
+ </dt>
+
+ <dd>
+ <p>The character set you prefer if sets in addition to
+ ISO-8859-1 and US-ASCII are available from servers. Use MIME
+ notation (e.g., ISO-8859-2) and do not include ISO-8859-1 or
+ US-ASCII, since those values are always assumed by default.
+ Can be a comma-separated list, which may be interpreted by
+ servers as descending order of preferences. You can also make
+ your order of preference explicit by using q factors as
+ defined by the HTTP protocol, for servers which understand
+ it, for example: iso-8859-5,&nbsp;utf-8;q=0.8</p>
+ </dd>
+
+ <dt><a name="optinfo-preferred_encoding" id=
+ "optinfo-preferred_encoding">Preferred encoding</a>
+ </dt>
+
+ <dd>
+ <p>When doing a GET, lynx tells what types of compressed data
+ it can decompress (the "Accept-Encoding:" string). This is
+ determined by compiled-in support for decompression or
+ external decompression programs. Use this option to select
+ none, one or all of the supported decompression types.</p>
+ </dd>
+
+ <dt><a name="optinfo-preferred_media_type" id=
+ "optinfo-preferred_media_type">Preferred media type</a>
+ </dt>
+
+ <dd>
+ <p>When doing a GET, lynx lists the MIME types which it knows
+ how to present (the "Accept:" string). Depending on your
+ system configuration, the mime.types or other data given by
+ the GLOBAL_EXTENSION_MAP may include many entries that lynx
+ really does not handle. Use this option to select one of the
+ built-in subsets of the MIME types that lynx could list in
+ the Accept.</p>
+
+ <dl>
+ <dt>Accept lynx's internal types</dt>
+
+ <dd>
+ <p>list only the types that are compiled into lynx.</p>
+ </dd>
+
+ <dt>Also accept lynx.cfg's types</dt>
+
+ <dd>
+ <p>lists types defined in lynx.cfg, e.g., the VIEWER and
+ Cern RULE or RULESFILE settings.</p>
+ </dd>
+
+ <dt>Also accept user's types</dt>
+
+ <dd>
+ <p>lists types from the PERSONAL_EXTENSION_MAP setting in
+ lynx.cfg</p>
+ </dd>
+
+ <dt>Also accept system's types</dt>
+
+ <dd>
+ <p>lists types from the GLOBAL_EXTENSION_MAP setting in
+ lynx.cfg</p>
+ </dd>
+
+ <dt>Accept all types</dt>
+
+ <dd>
+ <p>adds the types that are in lynx's built-in tables for
+ external programs that may be used to present a
+ document.</p>
+ </dd>
+ </dl>
+ </dd>
+
+ <dt><a name="optinfo-raw_8_bit" id="optinfo-raw_8_bit">Raw
+ 8-bit or CJK Mode</a>
+ </dt>
+
+ <dd>
+ <p>Tells Lynx whether 8-bit characters are assumed to
+ correspond with the display character set and therefore are
+ processed without translation via the chartrans conversion
+ tables:</p>
+
+ <ul>
+ <li>Should be ON by default when the display character set
+ is one of the Asian (CJK) sets and the 8-bit characters are
+ Kanji multibytes.</li>
+
+ <li>Should be OFF for the other display character sets, but
+ can be turned ON when the document's charset is unknown
+ (e.g., is not ISO-8859-1 and no charset parameter was
+ specified in a reply header from an HTTP server to indicate
+ what it is) but you know by some means that you have the
+ matching display character set selected.</li>
+
+ <li>Should be OFF when an Asian (CJK) set is selected but
+ the document is ISO-8859-1 or another &ldquo;assumed
+ document character set&rdquo;.</li>
+ </ul>
+
+ <p>The setting also can be toggled via the RAW_TOGGLE
+ command, normally mapped to &ldquo;<samp>@</samp>&rdquo;, and
+ at startup via the <em>-raw</em> switch.</p>
+ </dd>
+
+ <dt><a name="optinfo-send_user_agent" id=
+ "optinfo-send_user_agent">Send User-Agent header</a>
+ </dt>
+
+ <dd>
+ <p>Controls whether the user-agent string will be sent.</p>
+ </dd>
+
+ <dt><a name="optinfo-session_file" id=
+ "optinfo-session_file">Session file</a>
+ </dt>
+
+ <dd>
+ <p>Define the file name where lynx will store user sessions.
+ This setting is used only when <em>Auto Session</em> is
+ enabled.</p>
+ </dd>
+
+ <dt><a name="optinfo-show_color" id="optinfo-show_color">Show
+ color</a>
+ </dt>
+
+ <dd>
+ <p>This option will be present if color support is available.
+ If set to ON or ALWAYS, color mode will be forced on if
+ possible. If (n)curses color support is available but cannot
+ be used for the current terminal type, selecting ON is
+ rejected with a message. If set to OFF or NEVER, color mode
+ will be turned off.</p>
+
+ <p>ALWAYS and NEVER are not offered in anonymous accounts. If
+ saved to a <em>.lynxrc</em> file in non-anonymous accounts,
+ ALWAYS will cause Lynx to set color mode on at startup if
+ supported. If Lynx is built with the slang library, this is
+ equivalent to having included the <em>-color</em> command
+ line switch or having the <em>COLORTERM</em> environment
+ variable set. If color support is provided by curses or
+ ncurses, this is equivalent to the default behavior of using
+ color when the terminal type supports it. If (n)curses color
+ support is available but cannot be used for the current
+ terminal type, the preference can still be saved but will
+ have no effect.</p>
+
+ <p>A saved value of NEVER will cause Lynx to assume a
+ monochrome terminal at startup. It is similar to the
+ <em>-nocolor</em> switch, but (when the slang library is
+ used) can be overridden with the <em>-color</em> switch.</p>
+
+ <p>If the setting is OFF or ON when the current options are
+ saved to a <em>.lynxrc</em> file, the default startup
+ behavior is retained, such that color mode will be turned on
+ at startup only if the terminal info indicates that you have
+ a color-capable terminal, or (when the slang library is used)
+ if forced on via the <em>-color</em> switch or
+ <em>COLORTERM</em> variable. This default behavior always is
+ used in anonymous accounts, or if the <em>option_save</em>
+ restriction is set explicitly. If for any reason the startup
+ color mode is incorrect for your terminal, set it
+ appropriately on or off via this option.</p>
+ </dd>
+
+ <dt><a name="optinfo-show_cursor" id="optinfo-show_cursor">Show
+ cursor</a>
+ </dt>
+
+ <dd>
+ <p>Lynx normally hides the cursor by positioning it to the
+ right and if possible the very bottom of the screen, so that
+ the current link or OPTION is indicated solely by its
+ highlighting or color. If show cursor is set to ON, the
+ cursor will be positioned at the left of the current link or
+ OPTION. This is helpful when Lynx is being used with a speech
+ or braille interface. It also is useful for sighted users
+ when the terminal cannot distinguish the character attributes
+ used to distinguish the current link or OPTION from the
+ others in the screen display.</p>
+ </dd>
+
+ <dt><a name="optinfo-show_dot_files" id=
+ "optinfo-show_dot_files">Show dot files</a>
+ </dt>
+
+ <dd>
+ <p>If display/creation of hidden (dot) files/directories is
+ enabled, you can turn the feature on or off via this
+ setting.</p>
+ </dd>
+
+ <dt><a name="optinfo-show_images" id="optinfo-show_images">Show
+ images</a>
+ </dt>
+
+ <dd>
+ <p>This allows you to select the way in which Lynx shows
+ image links. These are the available selections:</p>
+
+ <ul>
+ <li><em>ignore</em> to suppress the links altogether,</li>
+
+ <li><em>as labels</em> to show the descriptive text for the
+ link</li>
+
+ <li><em>as links</em>, which allows you to use an external
+ viewer</li>
+ </ul>
+ <br>
+ </dd>
+
+ <dt><a name="optinfo-show_scrollbar" id=
+ "optinfo-show_scrollbar">Show scrollbar</a>
+ </dt>
+
+ <dd>
+ <p>This allows you to enable (show) or disable (hide) the
+ scrollbar on the right-margin of the display. This feature is
+ available with ncurses or slang libraries.</p>
+ </dd>
+
+ <dt><a name="optinfo-show_transfer_rate" id=
+ "optinfo-show_transfer_rate">Show transfer rate</a>
+ </dt>
+
+ <dd>
+ <p>This allows you to select the way in which Lynx shows its
+ progress in downloading large pages. It displays its progress
+ in the status line. These are the available selections:</p>
+
+ <ul>
+ <li>Do not show rate</li>
+
+ <li>Local directory sort order</li>
+
+ <li>Show dot files</li>
+
+ <li>Execution links</li>
+
+ <li>Pause when showing message</li>
+
+ <li>Show transfer rate</li>
+ </ul>
+ <br>
+ </dd>
+
+ <dt><a name="optinfo-ssl_prompting" id=
+ "optinfo-ssl_prompting">SSL Prompting</a>
+ </dt>
+
+ <dd>
+ <p>This allows you to tell how to handle errors detected in
+ SSL connections <em>prompt normally</em> to prompt for each
+ cookie, <em>force yes-response</em> to reply "yes" to each
+ prompt, <em>force no-response</em> to reply "no" to each
+ prompt.</p>
+ </dd>
+
+ <dt><a name="optinfo-trim_blank_lines" id=
+ "optinfo-trim_blank_lines">Trim blank lines</a>
+ </dt>
+
+ <dd>
+ <p>If <em>Trim blank lines</em> is turned off, Lynx will not
+ trim trailing blank lines from the document. Also, Lynx will
+ not collapse <code>BR</code>-tags onto the previous line when
+ it happens to be empty as part of the <em>Collapse BR
+ tags</em> feature.</p>
+ </dd>
+
+ <dt><a name="optinfo-type_of_search" id=
+ "optinfo-type_of_search">Type of Search</a>
+ </dt>
+
+ <dd>
+ <p>Searching type has two possible values: CASE INSENSITIVE
+ (default) and CASE SENSITIVE. The searching type effects
+ inter-document searches only, and determines whether searches
+ for words within documents will be done in a case-sensitive
+ or case-insensitive manner.</p>
+ </dd>
+
+ <dt><a name="optinfo-use_html5_charset" id=
+ "optinfo-use_html5_charset">Use HTML5 charset replacements</a>
+ </dt>
+
+ <dd>
+ <p>This option allows lynx to treat pages with ISO-8859-1
+ (Latin1) or ASCII encoding as if they were Windows 1252. That
+ allows a few punctuation characters to be shown.</p>
+ </dd>
+
+ <dt><a name="optinfo-locale_based_charset" id=
+ "optinfo-locale_based_charset">Use locale-based character
+ set</a>
+ </dt>
+
+ <dd>
+ <p>This option allows you to request lynx to obtain a MIME
+ name from the operating system which corresponds to your
+ locale setting. If successful, it overrides the normal
+ setting of the display character set.</p>
+ </dd>
+
+ <dt><a name="optinfo-underline_links" id=
+ "optinfo-underline_links">Underline links</a>
+ </dt>
+
+ <dd>
+ <p>Use underline-attribute rather than bold for links.</p>
+ </dd>
+
+ <dt><a name="optinfo-use_passive_ftp" id=
+ "optinfo-use_passive_ftp">Use Passive FTP</a>
+ </dt>
+
+ <dd>
+ <p>This allows you to change whether Lynx uses passive ftp
+ connections.</p>
+ </dd>
+
+ <dt><a name="optinfo-user_agent" id=
+ "optinfo-user_agent">User-Agent header</a>
+ </dt>
+
+ <dd>
+ <p>The header string which Lynx sends to HTTP servers to
+ indicate the User-Agent is displayed here. Changes may be
+ disallowed via the <em>-restrictions</em> switch. Otherwise,
+ the header can be changed temporarily to a string such as
+ <em>L_y_n_x/2.8.9</em> for access to sites which discriminate
+ against Lynx based on checks for the presence of "Lynx" in
+ the header. If the User-Agent header has been changed, it can
+ be restored to the built-in default value by deleting the
+ modified string in the Options Menu. Whenever the User-Agent
+ header is changed, the current document is reloaded, with the
+ no-cache flags set, on exit from the Options Menu. Changes of
+ the header are not saved in the RC file.</p>
+ </dd>
+
+ <dd>
+ <p><em id="noteUA">NOTE:</em> Some sites may regard
+ misrepresenting the browser as fraudulent deception, or as
+ gaining unauthorized access, if it is used to circumvent
+ blocking that was intentionally put in place. Some browser
+ manufacturers may find the transmission of their product's
+ name objectionable. If you change the User-Agent string, it
+ is your responsibility. The Options Menu issues a reminder
+ whenever the header is changed to one which does not include
+ "Lynx" or "L_y_n_x".</p>
+ </dd>
+
+ <dt><a name="optinfo-user_mode" id="optinfo-user_mode">User
+ Mode</a>
+ </dt>
+
+ <dd>
+ <p>There are four possible choices: Novice, Intermediate,
+ Advanced, and Minimal.</p>
+
+ <dl>
+ <dt>Novice</dt>
+
+ <dd>
+ <p>In Novice mode two lines of help are displayed at the
+ bottom of the screen.</p>
+ </dd>
+
+ <dt>Intermediate</dt>
+
+ <dd>
+ <p>Intermediate mode turns off the help lines.</p>
+ </dd>
+
+ <dt>Advanced</dt>
+
+ <dd>
+ <p>Advanced mode displays the URL of the currently
+ selected link at the bottom of the screen.</p>
+ </dd>
+
+ <dt>Minimal</dt>
+
+ <dd>
+ <p>Minimal mode eliminates the URL on the bottom line,
+ the forward/backward indicator in the upper left, and
+ most status-line messages.</p>
+ </dd>
+ </dl>
+ </dd>
+
+ <dt><a name="optinfo-verbose_images" id=
+ "optinfo-verbose_images">Verbose Images</a>
+ </dt>
+
+ <dd>
+ <p>Controls whether or not Lynx replaces the [LINK], [INLINE]
+ and [IMAGE] comments (for images without ALT) with filenames
+ of these images. This is extremely useful because now we can
+ determine immediately what images are just decorations
+ (button.gif, line.gif) and what images are important. This
+ setting can also be toggled on startup via the
+ <em>-verbose</em> switch.</p>
+ </dd>
+
+ <dt><a name="optinfo-vi_keys" id="optinfo-vi_keys">VI keys</a>
+ </dt>
+
+ <dd>
+ <p>If set to ON then the lowercase h, j, k, and l keys will
+ be mapped to left, down, up, and right arrow, respectively.
+ The uppercase H, J, K, and L keys remain mapped to their
+ configured bindings (normally HELP, JUMP, KEYMAP, and LIST,
+ respectively).</p>
+
+ <p>Note: this has no effect on the line-editor's key
+ bindings.</p>
+ </dd>
+
+ <dt><a name="optinfo-visited_pages" id=
+ "optinfo-visited_pages">Visited Pages</a>
+ </dt>
+
+ <dd>
+ <p>Enable several different views of the visited links:</p>
+
+ <dl>
+ <dt>By First Visit</dt>
+
+ <dt>By First Visit Reversed</dt>
+
+ <dt>As Visit Tree</dt>
+
+ <dt>By Last Visit</dt>
+
+ <dt>By Last Visit Reversed</dt>
+ </dl>
+ <br>
+ </dd>
+
+ <dt><a name="optinfo-x_display" id="optinfo-x_display">X
+ Display</a>
+ </dt>
+
+ <dd>
+ <p>This option is only relevant to X Window users. The
+ DISPLAY (Unix) or DECW$DISPLAY (VMS) variable is picked up
+ automatically from the environment if it has been previously
+ set.</p>
+ </dd>
+ </dl>
+
+ <p>[<a href="#ToC-InteractiveOptions">ToC</a>]</p>
+
+ <h2 id="id-Mail"><a name="Mail" id="Mail">Comments and mailto:
+ links</a></h2>
+
+ <p>At any time while viewing documents within Lynx, you may use
+ the &ldquo;<samp>c</samp>&rdquo; command to send a mail message
+ to the owner of the current document if the author of the
+ document has specified ownership. (Note to authors: if you want
+ to assign the ownership to your document, you need to add into
+ HEAD section a LINK element with appropriate value for REV
+ attribute. Two values are recognized: <em>owner</em> and
+ <em>made</em> (these are case insensitive). For example,</p>
+
+ <pre>
+&lt;HEAD&gt;
+ &hellip;
+ &lt;LINK REV="made" HREF="mailto:user@somedomain.com"&gt;
+ &hellip;
+&lt;/HEAD&gt;
+</pre>
+ <p>You may also add a TITLE attribute with, for example, the name
+ of your page) If no ownership is specified then comments are
+ disabled. Certain links called <a href=
+ "lynx_url_support.html#mailto_url">mailto:</a> links will also
+ allow you to send mail to other people. Using the mail features
+ within Lynx is straightforward.</p>
+
+ <p>Once you have decided to send a comment or have selected a
+ <em>mailto:</em> link a new screen will appear showing you to
+ whom you are sending the message. Lynx will ask for your name,
+ your e-mail address, and the subject of the message. If you have
+ filled in the "personal mail address" field in the <em>Options
+ Menu</em>, your e-mail address will be filled in automatically.
+ After entering the above information, if you have an editor
+ defined in the <em>Options Menu</em> and you are not an anonymous
+ user then your specified editor will be spawned for you so that
+ you can enter your message. If you do not have an editor defined
+ or you are an anonymous user, a simple line mode input scheme
+ will allow you to enter your message.</p>
+
+ <p>To finish sending the message, exit your spawned editor or, if
+ you are using the simple line mode input scheme, type a
+ &ldquo;<samp>.</samp>&rdquo; (period) on a line by itself. You
+ will be asked a final time whether to send the message. If you
+ press &ldquo;<samp>y</samp>&rdquo;, you will be prompted whether
+ to append your signature file if one was defined in <a href=
+ "#lynx.cfg">lynx.cfg</a> and is accessible, and then the message
+ will be sent, whereas if you press &ldquo;<samp>n</samp>&rdquo;
+ the message will be deleted. Entering Control-G in response to
+ any prompts also will cancel the mailing.</p>
+
+ <p>[<a href="#ToC-Mail">ToC</a>]</p>
+
+ <h2 id="id-News"><a name="News" id="News">USENET News posting</a></h2>
+
+ <p>While reading <a href=
+ "http://www.w3.org/LineMode/User/AboutNewsServers.html">news</a>
+ articles with Lynx you should see a link that says <em>Reply to:
+ user@host</em> and, if the nntp server from which you received
+ the article supports posting from your site, a link that says
+ <em>Followup to: newsgroup(s)</em></p>
+
+ <dl>
+ <dt>Reply to user@host</dt>
+
+ <dd>
+ <p>user@host will correspond to the mail address of the
+ person who posted the news article. Selecting the link will
+ allow you to send a message to the person who wrote the
+ message you are currently viewing. You will be given the
+ option of including the original message in your reply.</p>
+ </dd>
+
+ <dt>Followup to newsgroup(s)</dt>
+
+ <dd>
+ <p>Selecting this link will allow you to post back to the
+ newsgroup that you are currently reading and any newsgroups
+ to which the message was cross-posted. You will be given the
+ option of including the original message in your reply. Once
+ you have typed in your message, you will be asked for
+ confirmation of whether to proceed with the posting, and
+ whether to append your signature file if one was defined in
+ <a href="#lynx.cfg">lynx.cfg</a> and is accessible. See
+ <a href="lynx_url_support.html">Supported URLs</a> for more
+ information about the URL schemes for posting or sending
+ followups (replies) to nntp servers with Lynx. [<a href=
+ "#ToC-News">ToC</a>]</p>
+ </dd>
+ </dl>
+
+ <p>See also <a href=
+ "http://www.w3.org/Protocols/rfc977/rfc977">RFC 977</a>.</p>
+
+ <h2 id="id-Bookmarks"><a name="Bookmarks" id="Bookmarks">Lynx
+ bookmarks</a></h2>
+
+ <p>Bookmarks are entries in your <em>bookmark file</em>, which
+ record the URL of a document you may want to return to easily,
+ with a name of your choice to identify the document. To use
+ bookmarks you must first have specified a name for your bookmark
+ file in <a href="#lynx.cfg">lynx.cfg</a> or via the <em>Options
+ Menu</em>.</p>
+
+ <p>To save a bookmark to the document you wish to place in the
+ bookmark file press the &ldquo;<samp>a</samp>&rdquo; key and you
+ will be asked:</p>
+
+ <blockquote>
+ <p>Save D)ocument or L)ink to bookmark file or C)ancel?
+ (d,l,c):</p>
+ </blockquote>
+
+ <p>Answer &ldquo;<samp>d</samp>&rdquo; to save a link to the
+ document you are currently viewing or
+ &ldquo;<samp>l</samp>&rdquo; to save the link that is currently
+ selected on the page. Selecting &ldquo;<samp>c</samp>&rdquo; will
+ cancel without saving anything to your bookmark file.</p>
+
+ <p>A bookmark file will be created in conjunction with acting on
+ the &ldquo;<samp>a</samp>&rdquo;dd command if it does not already
+ exist. Otherwise, the link will be added to the bottom of the
+ pre-existing bookmark file. You must have created a bookmark file
+ via the &ldquo;<samp>a</samp>&rdquo;dd command before you can
+ view it.</p>
+
+ <p>Use the &ldquo;<samp>v</samp>&rdquo; command to view the list
+ of bookmarks you have saved. While viewing the bookmark list you
+ may select a bookmark as you would any other link.</p>
+
+ <p>You can remove a link from the bookmark list by pressing the
+ &ldquo;<samp>r</samp>&rdquo; key when positioned on that link.
+ You also can use a standard text editor (e.g., via the
+ &ldquo;<samp>e</samp>&rdquo;dit command while viewing a bookmark
+ file, if an external editor has been defined via the <em>Options
+ menu</em>) to delete or re-order links in the bookmark file, or
+ to modify a link name by editing the content of the
+ <em>A</em>nchor element for the link, but you should not change
+ the format within the line for the link, consisting of an
+ <em>LI</em> element followed by the <em>A</em>nchor element, nor
+ cause the line to become wrapped to a second line. You similarly
+ can change the link destination by editing the double-quoted
+ value for the <em>HREF</em> attribute in the <em>A</em>nchor
+ start tag, but you should not otherwise change the spacing within
+ the start tag, nor add other attributes. You can add a new link
+ while editing by copying an existing line for a link, to ensure
+ the proper format, and then modifying its <em>HREF</em> value and
+ <em>A</em>nchor content, but you should not add any other HTML
+ markup to the bookmark file. If the format and spacing (other
+ than the <em>A</em>nchor content or <em>HREF</em> value) within
+ lines is changed or other HTML markup is added, the
+ &ldquo;<samp>a</samp>&rdquo;dd and
+ &ldquo;<samp>r</samp>&rdquo;emove commands may not work
+ properly.</p>
+
+ <p>When multi-bookmarks (see <a href=
+ "#InteractiveOptions">Options Menu</a>) is OFF, you will always
+ view or add links to the default bookmark file. When it is
+ STANDARD, a menu of up to 26 bookmark files will be invoked, and
+ you select the bookmark file by entering its letter token. When
+ it is ADVANCED, you will be prompted for the letter token, but
+ can enter &ldquo;<samp>=</samp>&rdquo; to invoke the STANDARD
+ selection menu, or <em>RETURN</em> for the default bookmark file.
+ [<a href="#ToC-Bookmarks">ToC</a>]</p>
+
+ <h2 id="id-Jumps"><a name="Jumps" id="Jumps">Jump Command</a></h2>
+
+ <p>Similar to the bookmarks file is the jumps file: for an
+ example, look in the <em>samples</em> subdirectory in the
+ distribution package. To use the jumps command, create a
+ <em>jumps file</em> with the same format as the sample file, but
+ containing your own URLs &amp; short-cut names. Once you have
+ done that, typing &ldquo;<samp>j</samp>&rdquo; prompts you to
+ enter a short-cut name, which will take you straight to the URL
+ associated with the short-cut in the jumps file, much like using
+ &ldquo;<samp>g</samp>&rdquo;. If you want to check which
+ short-cuts are available, type &ldquo;<samp>?</samp>&rdquo; at
+ the jump prompt for the full list.</p>
+
+ <p>You can set up a jumps file which makes Lynx prompt for
+ parameters, e.g., as part of a search. Do this by putting a "%s"
+ marker in the URL at each point where you want Lynx to fill in
+ text. When you activate the corresponding jump, Lynx will prompt
+ you for the parameters, one by one.</p>
+
+ <p>All jump short-cuts you have entered are saved in a circular
+ buffer in the same way as with &ldquo;<samp>g</samp>&rdquo; and
+ &ldquo;<samp>/</samp>&gt;&rdquo; (search):</p>
+
+ <p>previous entries can be retrieved with <em>up-arrow</em> or
+ <em>down-arrow</em>.</p>
+
+ <p>The jumps feature is especially useful for system
+ administrators who have unsophisticated users to care for, but
+ ordinary Lynx users who have a number of URLs they regularly
+ visit while browsing may find using the jumps command speeds
+ their movements.</p>
+
+ <p>For more advice how to set up the jumps command on your system
+ and how to define short-cut names, read <a href=
+ "#lynx.cfg">lynx.cfg</a> .</p>
+
+ <p>[<a href="#ToC-Jumps">ToC</a>]</p>
+
+ <h2 id="id-DirEd"><a name="DirEd" id="DirEd">Directory
+ Editing</a></h2>
+
+ <p>Lynx offers extended DIRED support on Unix (on VMS the more
+ powerful CSwing program is recommended for character cell
+ terminals, and can be offered via Lynx as a jump shortcut or
+ execution link). When a local directory is accessed using a URL
+ of the form <em>file://localhost/path/</em>, a new set of
+ commands is available. With DIRED support you can create, edit,
+ delete, copy, and move files on your local system. The commands
+ available in DIRED mode are</p>
+
+ <dl>
+ <dt><code>C)reate</code>
+ </dt>
+
+ <dd>
+ <p>Type &ldquo;<samp>c</samp>&rdquo; to create a new file.
+ New file will be empty.</p>
+ </dd>
+
+ <dt><code>D)ownload</code>
+ </dt>
+
+ <dd>
+ <p>Type &ldquo;<samp>d</samp>&rdquo; to download using one of
+ the pre-defined options.</p>
+ </dd>
+
+ <dt><code>E)dit</code>
+ </dt>
+
+ <dd>
+ <p>Type &ldquo;<samp>e</samp>&rdquo; to spawn the editor
+ defined in <em>Options Menu</em> and load a selected file for
+ editing.</p>
+ </dd>
+
+ <dt><code>F)ull Menu</code>
+ </dt>
+
+ <dd>
+ <p>Type &ldquo;<samp>f</samp>&rdquo; to show full menu of
+ options available for selection. Menu may vary according to
+ type of file selected and compression facilities available.
+ <!-- List of full menu options --></p>
+ </dd>
+
+ <dt><code>M)odify</code>
+ </dt>
+
+ <dd>
+ <p>Type &ldquo;<samp>m</samp>&rdquo; to modify the name or
+ location of file. Then type &ldquo;<samp>n</samp>&rdquo; to
+ rename the file or &ldquo;<samp>l</samp>&rdquo; to move the
+ file to a different location.</p>
+ </dd>
+
+ <dt><code>R)emove</code>
+ </dt>
+
+ <dd>
+ <p>Type &ldquo;<samp>r</samp>&rdquo; to remove the selected
+ file or directory.</p>
+ </dd>
+
+ <dt><code>T)ag</code>
+ </dt>
+
+ <dd>
+ <p>Type &ldquo;<samp>t</samp>&rdquo; to tag highlighted file.
+ Further operations will be performed on tagged files instead
+ of highlighted ones.</p>
+ </dd>
+
+ <dt><code>U)pload</code>
+ </dt>
+
+ <dd>
+ <p>Type &ldquo;<samp>u</samp>&rdquo; to upload a file to the
+ present directory. An uploading method must have been
+ pre-defined in <a href="#lynx.cfg">lynx.cfg</a> .</p>
+ </dd>
+ </dl>
+
+ <p>[<a href="#ToC-DirEd">ToC</a>]</p>
+
+ <h2 id="id-ColorMouse"><a name="ColorMouse" id="ColorMouse">Using
+ Color &amp; the Mouse</a></h2>
+
+ <p>A limited range of colors &amp; mouse commands are available,
+ if the user chooses: see <em>lynx.cfg</em> for details. [<a href=
+ "#ToC-ColorMouse">ToC</a>]</p>
+
+ <h2 id="id-MiscKeys"><a name="MiscKeys" id="MiscKeys">Scrolling
+ and Other useful commands</a></h2>
+
+ <p>A summary of all the keystroke commands and their key bindings
+ can be invoked via the KEYMAP command, normally mapped to
+ &ldquo;<samp>k</samp>&rdquo; and &ldquo;<samp>K</samp>&rdquo;.
+ The following describes some of the most commonly used
+ commands.</p>
+
+ <dl>
+ <dt><strong><em>^A</em></strong>
+ </dt>
+
+ <dd>
+ <p><em>Control-A</em> jumps you to the beginning of the
+ current document. It is a synonym for the Keypad
+ <em>Home</em> key, and can be used also when <em>Links are
+ numbered</em> mode is on. The <em>Find</em> Function key also
+ is a synonym, and ideally the latter has been mapped to the
+ Function key labeled <em>Home</em> if you are using an IBM
+ Enhanced Keyboard.</p>
+ </dd>
+
+ <dt><strong><em>^E</em></strong>
+ </dt>
+
+ <dd>
+ <p><em>Control-E</em> jumps you to the end of the current
+ document. It is a synonym for the Keypad <em>End</em> key,
+ and can be used also when <em>Links are numbered</em> mode is
+ on. The <em>Select</em> Function key also is a synonym, and
+ ideally the latter has been mapped to the Function key
+ labeled <em>End</em> if you are using an IBM Enhanced
+ Keyboard.</p>
+ </dd>
+
+ <dt><strong><em>^B</em></strong>
+ </dt>
+
+ <dd>
+ <p><em>Control-B</em> normally jumps you to the previous page
+ of the current document, and thus is a synonym for the Keypad
+ and Function <em>Page-Up</em> keys. However,
+ <em>Control-B</em> acts as <em>right-arrow</em> when
+ emacs-like key movement is enabled (see <a href=
+ "#InteractiveOptions">Lynx Options Menu</a>).</p>
+ </dd>
+
+ <dt><strong><em>^F</em></strong>
+ </dt>
+
+ <dd>
+ <p><em>Control-F</em> normally jumps you to the next page of
+ the current document, and thus is a synonym for the Keypad
+ and Function <em>Page-Down</em> keys. However,
+ <em>Control-F</em> becomes <em>right-arrow</em> when
+ emacs-like key movement is enabled.</p>
+ </dd>
+
+ <dt><strong><em>^N</em></strong>
+ </dt>
+
+ <dd>
+ <p><em>Control-N</em> normally jumps you forward two lines in
+ the current document. The VT220 <em>Remove</em> Function key
+ (labeled <em>Delete</em> on IBM Enhanced keyboards, and
+ distinct from their <em>Backspace</em> key) is a synonym.
+ <em>Control-N</em> becomes <em>down-arrow</em> when
+ emacs-like key movement is enabled.</p>
+ </dd>
+
+ <dt><strong><em>^P</em></strong>
+ </dt>
+
+ <dd>
+ <p><em>Control-P</em> normally jumps you back two lines in
+ the current document. The <em>Insert</em> Function key is a
+ synonym. <em>Control-P</em> becomes <em>up-arrow</em> when
+ emacs-like key movement is enabled.</p>
+ </dd>
+
+ <dt><strong><em>^K</em></strong>
+ </dt>
+
+ <dd>
+ <p><em>Control-K</em> invokes the <a href=
+ "keystrokes/cookie_help.html">Cookie Jar Page</a> if it
+ contains cookies.</p>
+ </dd>
+
+ <dt><strong><em>^T</em></strong>
+ </dt>
+
+ <dd>
+ <p><em>Control-T</em> toggles Lynx trace mode on and off.
+ This is useful for diagnosing bad html. If you get a <em>Bad
+ HTML</em> statusline message when loading a document, enter
+ <em>Control-T</em> and then <em>Control-R</em> to reload the
+ document in trace mode. You may then examine the <em>Lynx
+ Trace Log</em> file with the <samp>;</samp> command if
+ enabled (see below), watch out especially for lines marked
+ with a number of asterisks &ldquo;<code>*****</code>&rdquo;.
+ You also can submit the document for validation via links in
+ the online help menu. If you are able to diagnose the
+ problem, send a message about it to the document's
+ author.</p>
+ </dd>
+
+ <dt><strong><em>^X</em></strong>
+ </dt>
+
+ <dd>
+ <p><em>Control-X</em> invokes the <a href="#Cache">Cache Jar
+ Page</a> if it contains cached documents.</p>
+ </dd>
+
+ <dt><strong><samp>E</samp></strong>
+ </dt>
+
+ <dd>
+ <p>The &ldquo;<samp>E</samp>&rdquo; command allows you to
+ edit the URL (or ACTION) of the current link and then use
+ that as a goto URL. Pressing the &ldquo;<samp>E</samp>&rdquo;
+ command will bring up a prompt asking you to edit the current
+ link's URL. If you do not modify it, or completely delete it,
+ or enter Control-G, the command will be cancelled. Otherwise,
+ the request for the &ldquo;E&rdquo;dited URL will be sent
+ with method GET, and will be entered into the circular buffer
+ for goto URLs so that it can be accessed for further
+ modification via the &ldquo;<samp>g</samp>&rdquo; command.
+ Note that lower case &ldquo;e&rdquo; invokes the external
+ editor for the current document.</p>
+ </dd>
+
+ <dt><strong><samp>g</samp></strong>
+ </dt>
+
+ <dd>
+ <p>The &ldquo;<samp>g</samp>&rdquo; command allows any URL to
+ be viewed. Pressing the &ldquo;<samp>g</samp>&rdquo; command
+ will bring up a prompt asking for a URL. Type in the URL that
+ you wish to view. All previously entered goto URLs are saved
+ in a circular buffer, and can be accessed at the prompt by
+ pressing the <em>up-arrow</em> or <em>down-arrow</em>
+ keys.</p>
+ </dd>
+
+ <dt><strong><samp>G</samp></strong>
+ </dt>
+
+ <dd>
+ <p>The &ldquo;<samp>G</samp>&rdquo; command allows you to
+ edit the URL of the current document and then use that as a
+ goto URL. Pressing the &ldquo;<samp>G</samp>&rdquo; command
+ will bring up a prompt asking you to edit the current
+ document's URL. If you do not modify it, or completely delete
+ it, or enter Control-G, the command will be cancelled. If the
+ current document has POST content associated with it, an
+ Alert will be issued. If you do edit that URL, and it does
+ not simply involve a fragment change (for seeking a position
+ in the current document), the modified URL will be submitted
+ with method GET and no POST content. If a modification of the
+ current document's URL results in a submission, that modified
+ URL will be entered into the circular buffer for goto URLs,
+ and can be accessed for further modification via the
+ &ldquo;<samp>g</samp>&rdquo; command.</p>
+ </dd>
+
+ <dt><strong><samp>z</samp></strong>
+ </dt>
+
+ <dd>
+ <p>Lynx supports completely interruptible I/O processes.
+ Press the &ldquo;<samp>z</samp>&rdquo; key at any time during
+ a connect or transfer process and the process will be halted.
+ If any data was transferred before the interrupt, it will be
+ displayed.</p>
+ </dd>
+
+ <dt><strong><samp>)</samp></strong>
+ </dt>
+
+ <dd>
+ <p>The <samp>)</samp> command jumps you forward half a page
+ in the current document.</p>
+ </dd>
+
+ <dt><strong><samp>(</samp></strong>
+ </dt>
+
+ <dd>
+ <p>The <samp>(</samp> command jumps you back half a page in
+ the current document.</p>
+ </dd>
+
+ <dt><strong><samp>#</samp></strong>
+ </dt>
+
+ <dd>
+ <p>The &ldquo;<samp>#</samp>&rdquo; command jumps you to the
+ pseudo Toolbar or Banner if present in the current document.
+ Use <em>left-arrow</em> to return from there to your previous
+ position in the document.</p>
+ </dd>
+
+ <dt><strong><samp>!</samp></strong>
+ </dt>
+
+ <dd>
+ <p>When &ldquo;<samp>!</samp>&rdquo; is pressed your default
+ shell will be spawned. When you quit or exit the shell you
+ will return to Lynx (usually <em>exit</em> under Unix and
+ <em>logout</em> under VMS). This command is usually disabled
+ for anonymous users. On VMS, &ldquo;<samp>$</samp>&rdquo;
+ normally is a synonym.</p>
+ </dd>
+
+ <dt><strong><samp>=</samp></strong>
+ </dt>
+
+ <dd>
+ <p>The &ldquo;<samp>=</samp>&rdquo; command shows information
+ about the current document and the currently selected link if
+ there is one. The number of lines in the file, URL, title,
+ owner, and type are shown.</p>
+
+ <p>Normally the information is shown formatted (with margins)
+ for readability. You can make Lynx show the URL wrapped
+ without margins, e.g., making it convenient for select/paste,
+ by doing this:</p>
+
+ <ul>
+ <li>toggle line-wrapping off using
+ &ldquo;<samp>|</samp>&rdquo;</li>
+
+ <li>when line-wrapping is off, use the
+ &ldquo;<samp>=</samp>&rdquo; command</li>
+ </ul>
+ </dd>
+
+ <dt><strong><samp>;</samp></strong>
+ </dt>
+
+ <dd>
+ <p>The <samp>;</samp> command shows the <em>Lynx Trace
+ Log</em> (<em>Lynx.trace</em> in the home directory) if one
+ has been started for the current session. If a log has not
+ been started, any trace messages will be sent to the screen
+ (and will disturb the normal display) unless the system
+ supports piping and that was used to redirect stderr messages
+ to a file. The log is started when Lynx trace mode is turned
+ on via the <em>-trace</em> command line switch, or via the
+ <em>Control-T</em> toggle, if Lynx has been compiled to log
+ the trace and other stderr messages by default. If not,
+ ability to create a log can be toggled on with the
+ <em>-tlog</em> switch. Note that this ability is probably
+ disabled in anonymous or validation accounts.</p>
+ </dd>
+
+ <dt><a name="asterisk-key" id=
+ "asterisk-key"><strong><samp>*</samp></strong></a>
+ </dt>
+
+ <dd>
+ <p>The &ldquo;<samp>*</samp>&rdquo; command toggles
+ image_links mode on and off. When on, links will be created
+ for all images, including inline images. If you have an image
+ viewer mapped to the image's MIME type, you can activate such
+ links to view an inline image. You should normally have this
+ mode toggled off.</p>
+ </dd>
+
+ <dt><strong><samp>@</samp></strong>
+ </dt>
+
+ <dd>
+ <p>The &ldquo;<samp>@</samp>&rdquo; command toggles raw 8-bit
+ or CJK mode on and off. When on, the charset is assumed to
+ match the selected character set and 8-bit characters are not
+ reverse translated with respect to the ISO-8859-1 conversion
+ tables.</p>
+ </dd>
+
+ <dt><a name="lbracket-key" id=
+ "lbracket-key"><strong><samp>[</samp></strong></a>
+ </dt>
+
+ <dd>
+ <p>The &ldquo;<samp>[</samp>&rdquo; command toggles
+ pseudo_inlines mode on and off. When on, inline images which
+ have no ALT string specified will have an <em>[INLINE]</em>
+ pseudo-ALT string inserted in the Lynx display. When off,
+ they will be treated as having ALT="" (i.e., they will be
+ ignored). If image_links mode is toggled on, the pseudo-ALT
+ strings will be restored, to serve as links to the inline
+ images' sources.</p>
+ </dd>
+
+ <dt><strong><samp>]</samp></strong>
+ </dt>
+
+ <dd>
+ <p>The &ldquo;<samp>]</samp>&rdquo; command is used to send
+ HEAD requests for the current document or link. It applies
+ only to documents or links (or form submit buttons) of http
+ servers. A statusline message will notify you if the context
+ for this command was inappropriate. The HEAD requests always
+ are sent to the http server, i.e., Lynx does not retrieve any
+ previous server replies from its cache. Note that for form
+ submissions, http servers vary in whether they'll treat HEAD
+ requests as valid and return the CGI script's headers, or
+ treat it as invalid and return an error message.</p>
+ </dd>
+
+ <dt><strong><samp>{</samp></strong>
+ </dt>
+
+ <dd>
+ <p>If the line-wrapping margin is wider than the terminal's
+ display, scroll left by half of the display's width.</p>
+
+ <p>This feature is not available when Lynx is built using the
+ slang library.</p>
+ </dd>
+
+ <dt><strong><samp>|</samp></strong>
+ </dt>
+
+ <dd>
+ <p>&ldquo;<samp>|</samp>&rdquo; toggles Lynx line-wrapping
+ on/off. Normally Lynx fits text onto the screen, wrapping
+ lines. With this feature, Lynx provides the ability to
+ eliminate line-wrapping (up to an internal line-limit of 1000
+ characters). Lynx uses the curses &ldquo;pad&rdquo; feature
+ to support left/right scrolling. You can scroll left and
+ right in the screen to view the wide lines.</p>
+
+ <p>The popup menu for the command shows the other choices
+ which extend the wrapping margin:</p>
+
+ <blockquote>
+ <pre>
+/----------------------------------\
+| Try to fit screen width |
+| No line wrap in columns |
+| Wrap columns at screen width |
+| Wrap columns at 3/4 screen width |
+| Wrap columns at 2/3 screen width |
+| Wrap columns at 1/2 screen width |
+| Wrap columns at 1/3 screen width |
+| Wrap columns at 1/4 screen width |
+\----------------------------------/
+</pre>
+ </blockquote>
+
+ <p>This feature is not available when Lynx is built using the
+ slang library.</p>
+ </dd>
+
+ <dt><strong><samp>}</samp></strong>
+ </dt>
+
+ <dd>
+ <p>If the line-wrapping margin is wider than the terminal's
+ display, scroll right by half of the display's width.</p>
+
+ <p>This feature is not available when Lynx is built using the
+ slang library.</p>
+ </dd>
+
+ <dt><em>numbers</em>
+ </dt>
+
+ <dd>
+ <p>Lynx offers other, advanced navigation features when
+ numbers are used to invoke the <a href=
+ "keystrokes/follow_help.html">Follow Link (or goto link or
+ page) number:</a> or <a href=
+ "keystrokes/follow_help.html#select-option">Select Pop-up
+ Option Number:</a> prompts.</p>
+ </dd>
+ </dl>
+
+ <p>[<a href="#ToC-MiscKeys">ToC</a>]</p>
+
+ <h2 id="id-Forms"><a name="Forms" id="Forms">Lynx and HTML
+ Forms</a></h2>
+
+ <p>This section describes the Lynx Forms Interface. HTML gives
+ document providers the ability to create on-line forms which may
+ be filled out when the document is viewed. When a form is
+ submitted the information on the form can be used to search a
+ database or complete a survey.</p>
+
+ <p>An HTML Form provides for the use of buttons to perform an
+ action (such as <em>submit</em>), checkboxes, radio buttons or
+ popups to select options from a list, and fields for entering
+ text.</p>
+
+ <dl>
+ <dt>Buttons:</dt>
+
+ <dd>
+ <p>Buttons are displayed in the same way that Lynx displays
+ links in a document. To "push" the button press the
+ <em>right-arrow</em> or <em>Return</em> key. If it is a form
+ submission button, you also can use the NOCACHE
+ (&ldquo;<samp>x</samp>&rdquo;) or DOWNLOAD
+ (&ldquo;<samp>d</samp>&rdquo;) keystroke commands to "push"
+ the button (see below).</p>
+ </dd>
+
+ <dt>Checkboxes and Radio buttons</dt>
+
+ <dd>
+ <p>Checkboxes are displayed as square brackets:
+ <em>[&nbsp;]</em> and radio buttons are displayed as
+ parenthesis: <em>(&nbsp;)</em>. When a box is checked or a
+ button selected, an <samp>x</samp> appears in the brackets:
+ <em>[x]</em> or an asterisk appears within the parenthesis:
+ <em>(*)</em>. To check a box or select a radio button press
+ the <em>right-arrow</em> or <em>Return</em> key.</p>
+ </dd>
+
+ <dt>Selection Fields</dt>
+
+ <dd>
+ <p>Selection fields are displayed as brackets with the
+ default option displayed between them: <em>[default__]</em>.
+ To select an option press the <em>right-arrow</em> or
+ <em>Return</em> key. A box with a border of asterisks (or
+ line-drawing characters) will pop up with the list of
+ possible options listed within the box. Use the
+ <em>up-arrow</em>, <em>down-arrow</em>, <em>page-up</em>,
+ <em>page-down</em>, and other navigation keys to move the
+ cursor among options, and the <em>right-arrow</em> or
+ <em>Return</em> key to select an option. You also can use the
+ &ldquo;<samp>/</samp>&rdquo; and
+ &ldquo;<samp>n</samp>&rdquo;ext <a href=
+ "#Search">searching</a> commands for navigating to options
+ which contain particular strings. <em>NOTE</em> that the
+ popup menu feature can be disabled via compilation and/or
+ configuration options, or via the <a href=
+ "#InteractiveOptions">Options Menu</a>, in which case the
+ selection field options will be converted to a list of radio
+ buttons. The default setting for use of popups or radio
+ button lists can be toggled via the <em>-popup</em> command
+ line switch.</p>
+ </dd>
+
+ <dt>Text Entry Fields</dt>
+
+ <dd>
+ <p>Text entry (INPUT) fields are displayed as a row of
+ underscores the length of the entry field: <em>_______</em>.
+ You may enter text directly by typing at the keyboard. Use
+ the <a href="keystrokes/edit_help.html">Line Editor</a> keys
+ to correct errors. If you try to input more text than the
+ field can hold, the line editor will not accept the
+ additional characters. If you fill a text field the cursor
+ will not move off the field but remain at the last field
+ position. Use the <em>up-arrow</em>, and <em>down-arrow</em>,
+ <em>TAB</em> or <em>Return</em> keys to move up, or down from
+ the text entry field. NOTE, however, that <em>Return</em>
+ also will <a href="#submit">submit</a> the form if the text
+ entry field is the only non-hidden field in the form. If
+ <a name="tna" id="tna">"Textfields Need Activation"</a> mode
+ is turned on (with the <kbd>-tna</kbd> command-line option or
+ in <a href="#lynx.cfg">lynx.cfg</a>), then text entry fields
+ do not become active immediately upon being selected, as
+ normally. Keystrokes have their normal command meaning unless
+ the Line Editor gets activated with <em>Return</em> or
+ <em>Right Arrow</em>. This mode can be used to avoid "getting
+ stuck" in input fields, especially by users who rarely fill
+ out forms.</p>
+
+ <p><a name="CtrlVNote" id="CtrlVNote">NOTE:</a> If you have a
+ text input field selected you will not have access to most of
+ the Lynx keystroke commands, because they are interpreted by
+ the <a href="keystrokes/edit_help.html">Line Editor</a> as
+ either text entries or editing commands. Select a button or
+ box when you want to use Lynx keystrokes; or prefix your
+ keystroke with <em>^V</em> to temporarily escape from line
+ editing.</p>
+
+ <p>Some flavors of UNIX, shells &amp; terminal settings
+ require that you enter <em>^V^Ve</em> in order to start the
+ external editor, as they also use <em>^V</em> as default
+ command-line quote key (called &ldquo;lnext&rdquo; in stty
+ man pages and &ldquo;stty -a&rdquo; output); to avoid this,
+ you can put &ldquo;stty lnext undef&rdquo; in your .cshrc
+ file (or .profile or .bashrc, depending on what shell you
+ use), or invoke Lynx with a wrapper script, e.g.</p>
+
+ <p><code>&nbsp;&nbsp;#!/bin/sh<br>
+ &nbsp;&nbsp;stty lnext undef<br>
+ &nbsp;&nbsp;$HOME/bin/lynx "$@"<br>
+ &nbsp;&nbsp;stty lnext ^V<br>
+ &nbsp;&nbsp;exit</code>
+ </p>
+
+ <p>NB when NOT in the Line Editor, <em>^V</em> is by default
+ bound to the command to switch between SortaSGML and TagSoup
+ HTML parsing (i.e., SWITCH_DTD). To avoid confusion, either
+ of these separate functions could be changed (mapped away)
+ with a KEYMAP directive in <em>lynx.cfg</em>. For
+ example,</p>
+
+ <p>&nbsp;&nbsp;KEYMAP:^V:DO_NOTHING<br>
+ &nbsp;&nbsp;KEYMAP:#:SWITCH_DTD</p>
+
+ <p>would map SWITCH_DTD away from <em>^V</em> to
+ <samp>#</samp>, while leaving its default Line Editor
+ function as a command escape in place. On the other hand,</p>
+
+ <p>&nbsp;&nbsp;KEYMAP:^V::NOP:1<br>
+ &nbsp;&nbsp;KEYMAP:^_::LKCMD:1</p>
+
+ <p>would move <em>^V</em>'s Line Editor binding as command
+ escape to <em>^_</em> for the first Line Edit style, letting
+ <em>^V</em> still act as SWITCH_DTD outside of text input
+ fields.</p>
+ </dd>
+
+ <dt>TEXTAREA Fields</dt>
+
+ <dd>
+ <p>TEXTAREA fields are for most purposes handled as if they
+ were a series of text entry (INPUT) fields for which
+ successive lines imply a newline at the end of the preceding
+ line. You enter text on each line to construct the overall
+ message. Any blank lines at the bottom of the TEXTAREA field
+ will be eliminated from the submission. The
+ <em>up-arrow</em>, and <em>down-arrow</em> or <em>Return</em>
+ keys move you to the preceding, or next line of the overall
+ message, as for INPUT fields. The <em>TAB</em> key will move
+ you down beyond the bottom of the TEXTAREA field, and
+ <em>Back Tab</em> (if available, e.g., as Shift-Tab, and
+ correctly mapped in the terminal description) will move
+ backward to a link or field before the TEXTAREA.</p>
+ </dd>
+
+ <dt>Editing TEXTAREA Fields and Special TEXTAREA Functions</dt>
+
+ <dd>
+ <p>TEXTAREA fields can be edited using an external editor.
+ The statusline should tell you when this is possible and what
+ key to use, it might for example say</p>
+
+ <pre>
+ <strong>(Textarea) Enter text. </strong>[ ..... ]<strong> (^Xe for editor).</strong>
+</pre>
+ <p>An external editor has to be defined, for example in the
+ <a href="#InteractiveOptions">Options Menu</a>, before you
+ can start using this function.</p>
+
+ <p>A key to invoke external TEXTAREA editing is normally
+ provided by the <a href=
+ "keystrokes/edit_help.html">Line-Editor Key</a> Bindings. A
+ KEYMAP directive in <em>lynx.cfg</em> can also be used to
+ make a different key invoke external editing; it will then
+ normally be necessary to prefix that key with <em>^V</em> to
+ "escape" from line-editing. Two variants exist,<br>
+ &nbsp;&nbsp;KEYMAP:e:EDITTEXTAREA<br>
+ or<br>
+ &nbsp;&nbsp;KEYMAP:e:DWIMEDIT<br>
+ (the first is only functional for TEXTAREA editing, while the
+ second allows to use the same key for normal <a href=
+ "#FileEdit">file editing</a> <em>as long as both functions do
+ not conflict</em>).</p>
+
+ <p>Please see the <a href="#CtrlVNote">note above</a> for
+ details about <em>^V</em> behavior.</p>
+ You can also use two other special TEXTAREA functions. Again,
+ these are already bound to key sequences in the <a href=
+ "keystrokes/edit_help.html#TASpecial">Line-Editor
+ Bindings</a>, by default <em>^Xg</em> and <em>^Xi</em>. You
+ can use different keys by adding KEYMAP bindings to your
+ <em>lynx.cfg</em> file, e.g.
+ <p>&nbsp;&nbsp;KEYMAP:$:GROWTEXTAREA<br>
+ &nbsp;&nbsp;KEYMAP:#:INSERTFILE</p>
+
+ <p>With these bindings, (in a TEXTAREA only) <em>^V$</em>
+ would add 5 lines to the TEXTAREA and <em>^V#</em> would
+ prompt for the name of an existing file to be inserted into
+ the TEXTAREA (above the cursorline). An automatic variation
+ of GROWTEXTAREA is normally compiled in, so that hitting
+ <em>Enter</em> with the cursor on the last line adds a new
+ line to the TEXTAREA, with the cursor on it.</p>
+
+ <p>If you have some single keys (or control keys) to spare
+ that you do not need for their normal purposes, you can
+ dedicate those keys to invoke the special functions (without
+ requiring a prefix key). For example, to use the <em>^E</em>
+ key for the DWIMEDIT action, and the <em>Insert</em> key for
+ the INSERTFILE action, use<br>
+ &nbsp;&nbsp;KEYMAP:^E:DWIMEDIT:PASS<br>
+ &nbsp;&nbsp;KEYMAP:0x10C:INSERTFILE:PASS<br>
+ (see lynx.cfg for other keystroke codes to use).</p>
+
+ <p>Note that the default bindings that use <em>^X</em> as a
+ prefix key <em>may</em> also work by substituting the
+ <kbd>Escape</kbd> key for ^X. If your keyboard has a modifier
+ (Meta) key that gets transmitted as an ESC prefix, for
+ example <kbd>Alt</kbd>, you can then even use <em>Alt-e</em>
+ instead of <em>^Xe</em>, <em>Alt-g</em> instead of
+ <em>^Xg</em>, and so on. But this does not work reliably
+ everywhere (it depends on the way Lynx is compiled, including
+ which libraries are used, and behavior of the connection and
+ terminal type).</p>
+ </dd>
+ </dl>
+
+ <p>In general, you can move around the form using the standard
+ Lynx navigation keys. The <em>up-arrow</em> and
+ <em>down-arrow</em> keys, respectively, select the previous or
+ next field, box, or button. The <em>TAB</em> key selects the next
+ field, box, or button.</p>
+
+ <p>To <a name="submit" id="submit"><em>submit</em></a> the form
+ press <em>right-arrow</em> or <em>Return</em> when positioned on
+ the form's submit button. If you've submitted the form previously
+ during the Lynx session, have not changed any of the form
+ content, and the METHOD was <em>GET</em>, Lynx will retrieve from
+ its cache what was returned from the previous submission. If you
+ wish to resubmit that form to the server with the same content as
+ previously, use the NOCACHE command
+ (&ldquo;<samp>x</samp>&rdquo;) when positioned on the submit
+ button. The <em>right-arrow</em> and <em>Return</em> keys also
+ will invoke a no-cache resubmission if the reply from a form
+ submission included a META element with a no-cache Pragma or
+ Cache-Control directive:</p>
+
+ <pre>
+ <em>&lt;META HTTP-EQUIV="Pragma" CONTENT="no-cache"&gt;</em>
+ <em>&lt;META HTTP-EQUIV="Cache-Control" CONTENT="no-cache"&gt;</em>
+</pre>
+ <p>or the server sent a "Pragma" or "Cache-Control" MIME header
+ with a no-cache directive.</p>
+
+ <p>You also can use the DOWNLOAD (&ldquo;<samp>d</samp>&rdquo;)
+ keystroke command when positioned on a form submit button if you
+ wish to download the server's reply to the submission instead of
+ having Lynx render and display it.</p>
+
+ <p>Forms which have <em>POST</em> as the METHOD, or a <a href=
+ "lynx_url_support.html#mailto_url">mailto:</a> URL as the ACTION,
+ are always resubmitted, even if the content has not changed, when
+ you activate the <em>submit</em> button. Lynx normally will not
+ resubmit a form which has <em>POST</em> as the METHOD if the
+ document returned by the form has links which you activated, and
+ then you go back via the PREV_DOC (<em>left-arrow</em>) command
+ or via the <a href="keystrokes/history_help.html">History
+ Page</a>. Lynx can be compiled so that it resubmits the form in
+ those cases as well, and the default can be changed via <a href=
+ "#lynx.cfg">lynx.cfg</a>, and toggled via the
+ <em>-resubmit_posts</em> command line switch.</p>
+
+ <p>If the form has one <em>text entry</em> field and no other
+ fields except, possibly, hidden INPUT fields not included in the
+ display, then that field also serves as a <em>submit</em> button,
+ and pressing <em>right-arrow</em> or <em>Return</em> on that
+ field will invoke submission of the form. Be sure to use
+ <em>up-arrow</em>, <em>down-arrow</em> or <em>TAB</em> to move
+ off the text entry field, in such cases, if it is not your
+ intention to submit the form (or to retrieve what was returned
+ from an earlier submission if the content was not changed and the
+ METHOD was <em>GET</em>).</p>
+
+ <p>Forms can have multiple <em>submit</em> buttons, if they have
+ been assigned NAMEs in the markup. In such cases, information
+ about which one of the buttons was used to submit the form is
+ included in the form content.</p>
+
+ <p>Inlined images can be used as submit buttons in forms: If such
+ buttons are assigned NAMEs in the markup, for graphic clients
+ they can also serve as <a href="#USEMAP">image maps</a>, and the
+ x,y coordinates of the graphic client's cursor position in the
+ image when it was <em>clicked</em> are included in the form
+ content. Since Lynx cannot inline the image, and the user could
+ not have moved a cursor from the origin for the image, if no
+ alternatives are made available in the markup Lynx sends a 0,0
+ coordinate pair in the form content.</p>
+
+ <p>Document authors who use images as submit buttons, but have at
+ least some concern for text clients and sight-challenged
+ Webizens, should include VALUEs for the buttons in such markup.
+ Lynx will then display the string assigned to the VALUE, as it
+ would for a normal submit button.</p>
+
+ <ul>
+ <li>
+ <p>Some document authors incorrectly use an ALT instead of
+ VALUE attribute for this purpose. Lynx "cooperates" by
+ treating ALT as a synonym for VALUE when present in an INPUT
+ tag with TYPE="image".</p>
+ </li>
+
+ <li>
+ <p>If neither a VALUE nor an ALT attribute is present, Lynx
+ displays "[IMAGE]-Submit" as the string for such buttons.</p>
+ </li>
+
+ <li>
+ <p>If clickable images is set, the "[IMAGE]" portion of the
+ string is a link for the image, and the "Submit" portion is
+ the button for submitting the form.</p>
+
+ <p>Otherwise, the entire string is treated as a submit
+ button. If a VALUE or ALT attribute is present and clickable
+ images is set, Lynx prepends "[IMAGE]" as a link for the
+ image, followed by &ldquo;-&rdquo; and then the attribute's
+ value as the displayed string for the submit button.</p>
+ </li>
+ </ul>
+
+ <p>Early versions of Lynx would send a name=value pair instead of
+ a 0,0 coordinate pair if a TYPE="image" submit button was
+ NAME-ed, had a VALUE attribute in the INPUT tag, and was used to
+ submit the form. The script which analyzes the form content thus
+ could be made aware whether the submission was by a user with a
+ graphic client and had image loading turned on, or by a user who
+ did not see the image nor make a conscious choice within it.
+ However, requests that this be included in HTML specifications
+ consistently have fallen on deaf ears, and thus Lynx now "fakes"
+ a 0,0 coordinate pair whether or not a VALUE or ALT attribute is
+ present in the INPUT tag. Ideally, the script which analyzes the
+ submitted content will treat the 0,0 coordinate pair as an
+ indicator that the user did not see the image and make a
+ conscious choice within it.</p>
+
+ <p>Forms can have <em>hidden</em> INPUT fields, which are not
+ displayed, but have NAMEs and VALUEs included in the content.
+ These often are used to keep track of information across a series
+ of related form submissions, but have the potential for including
+ information about the user that might be considered to represent
+ an invasion of privacy. NOTE, in this regard, that Lynx has
+ implemented the <a href="http://www.w3.org/Markup/html3/">HTML
+ 3.0</a> <em>DISABLED</em> attribute for <em>all</em> of its form
+ fields. These can be used to keep track of information across
+ submissions, and to cast it unmodifiable in the current form, but
+ keep the user aware that it will be included in the
+ submission.</p>
+
+ <p>Forms most commonly are submitted to http servers with the
+ content encoded as
+ <em>ENCTYPE="application/x-www-form-urlencoded"</em> for analysis
+ by a script, and Lynx treats that as the default if no ENCTYPE is
+ specified in the FORM start tag. However, you can specify a
+ <a href="lynx_url_support.html#mailto_url">mailto</a> URL as the
+ form's ACTION to have the form content sent, instead, to an email
+ address. In such cases, you may wish to specify
+ <em>ENCTYPE="text/plain"</em> in the form markup, so that the
+ content will not be encoded, but remain readable as plain
+ text.</p>
+
+ <p>Lynx also supports
+ <em>ENCTYPE="application/sgml-form-urlencoded"</em> for which all
+ reserved characters in the content will be hex escaped, as with
+ <em>application/x-www-form-urlencoded</em>, but semicolons
+ (&ldquo;<samp>;</samp>&rdquo;) instead of ampersands
+ (&ldquo;<samp>&amp;</samp>&rdquo;) will be used as the separator
+ for name=value pairs in the form content. The use of semicolons
+ is preferred for forms with the <em>GET</em> METHOD, because the
+ <em>GET</em> METHOD causes the encoded form content to be
+ appended as a <em>?searchpart</em> for the form's ACTION, and if
+ such URLs are used in <em>text/html</em> documents or bookmark
+ files without conversion of the ampersands to SGML character
+ references (<em>&amp;amp;</em> or <em>&amp;#38;</em>), their
+ being followed by form field NAMEs which might correspond to SGML
+ entities could lead to corruption of the intended URL.</p>
+
+ <p>NOTE, in this regard, that Lynx converts ampersands to
+ <em>&amp;amp;</em> when creating bookmarks, and thus the bookmark
+ links will not be vulnerable to such corruptions. Also NOTE that
+ Lynx allows you to save links in your bookmark file for documents
+ returned by forms with the <em>GET</em> METHOD, and which thus
+ have the content appended as a <em>?searchpart</em>, but not if
+ the METHOD was <em>POST</em>, because the content would be lost
+ and the link thus would be invalid.</p>
+
+ <p>Lynx supports <em>ENCTYPE="multipart/form-data"</em> for
+ sending form content with name=value pairs encoded as multipart
+ sections with individual MIME headers and boundaries. However,
+ Lynx does not yet support INPUTs with <em>TYPE="file"</em> or
+ <em>TYPE="range"</em> and will set the <em>DISABLED</em>
+ attribute for all of the form's fields if any INPUTs with either
+ of those two TYPEs are present, so that the form cannot be
+ submitted. Otherwise, Lynx will submit the form with the
+ multipart ENCTYPE.</p>
+
+ <p>A
+ <em>Content-Disposition:&nbsp;file;&nbsp;filename=name.suffix</em>
+ header can be used by CGI scripts to set the suggested filename
+ offered by Lynx for &ldquo;<samp>d</samp>&rdquo;ownload and
+ &ldquo;<samp>p</samp>&rdquo;rint menu options to save or mail the
+ body returned by the script following submission of a FORM.
+ Otherwise, Lynx uses the last symbolic element in the path for
+ the FORM's ACTION, which is normally the script, itself, or a
+ PATH_INFO field, and thus might be misleading. This also can be
+ done via a META element in any document:</p>
+
+ <pre>
+ <em>&lt;META HTTP-EQUIV="Content-Disposition"
+ CONTENT="file; filename=name.suffix"&gt;</em>
+</pre>
+ <p>[<a href="#ToC-Forms">ToC</a>]</p>
+
+ <h2 id="id-Images"><a name="Images" id="Images">Lynx and HTML
+ Images</a></h2>
+
+ <p>As a text browser, Lynx does not display images as such -- you
+ need to define a viewer in <em>lynx.cfg</em>: see there -- , but
+ users can choose a number of ways of showing their presence.</p>
+
+ <p>There are 3 choices in <em>lynx.cfg</em>, with 2 corresponding
+ keys:</p>
+
+ <pre>
+ MAKE_LINKS_FOR_ALL_IMAGES * IMAGE_TOGGLE
+ MAKE_PSEUDO_ALTS_FOR_INLINES [ INLINE_TOGGLE
+ VERBOSE_IMAGES no corresponding key
+</pre>
+ <p>You can also use the <em>Options Menu</em>, as outlined
+ below:</p>
+
+ <pre>
+ key lynx.cfg FM KM .lynxrc variable in source
+
+ * MAKE_LINKS_ Y N N clickable_images
+ [ MAKE_PSEUDO_ Y N N pseudo_inline_alts
+ VERBOSE_ Y Y Y verbose_img
+
+FM = Form-based Menu ; KM = Key-based Menu ;
+in .lynxrc , VERBOSE_IMAGES is called &ldquo;verbose_images&rdquo;:
+the other two cannot be saved between sessions.
+</pre>
+ <p>In the Form-based Menu, the 3-way &ldquo;Show images&rdquo;
+ selection combines the effects of the &ldquo;*&rdquo; &amp;
+ &ldquo;[&rdquo; keys, as follows:</p>
+
+ <pre>
+ Ignore clickable_images = FALSE, pseudo_inline_alts = FALSE
+ As labels clickable_images = FALSE, pseudo_inline_alts = TRUE
+ As links clickable_images = TRUE, pseudo_inline_alts = unchanged
+</pre>
+ <h2 id="id-Tables"><a name="Tables" id="Tables">Lynx and HTML
+ Tables</a></h2>
+
+ <p>HTML includes markup for creating <em>tables</em> structured
+ as arrays of cells aligned by columns and rows on the displayed
+ page.</p>
+
+ <p>Lynx recognizes the TABLE element and all of its associated
+ elements as described in <a href=
+ "http://www.faqs.org/rfcs/rfc1942.html">RFC 1942</a> and will
+ process any ID attributes in the start tags for handling as
+ NAME-ed anchors, but does not create actual <em>tables</em>.
+ Instead, it treats the TR start tag as a collapsible BR (line
+ break), and inserts a collapsible space before the content of
+ each TH and TD start tag. This generally makes all of the content
+ of the <em>table</em> readable, preserves most of the intra-cell
+ organization, and makes all of the links in the <em>table</em>
+ accessible, but any information critically dependent on the
+ column and row alignments intended for the <em>table</em> will be
+ missed.</p>
+
+ <p>If inherently tabular data must be presented with Lynx, one
+ can use PRE formatted content, or, if the <em>table</em> includes
+ markup not allowed for PRE content, construct the <em>table</em>
+ using <a href="#Tabs">HTML Tabs</a>. An example <em>table</em>
+ using <em>TAB</em> elements is included in the test subdirectory
+ of the Lynx distribution.</p>
+
+ <div id="TRST">
+ <p>Starting with version 2.8.3, Lynx renders some tables in
+ tabular form. This tabular representation for <em>simple</em>
+ tables (<dfn>TRST</dfn>) does not attempt to implement full
+ support for any table model. Limitations are:</p>
+
+ <ul>
+ <li>All data constituting a table row generally has to fit
+ within the display width without inserting line breaks.</li>
+
+ <li>Cell contents have to be simple. In general, only inline
+ markup is acceptable, no <code>&lt;P&gt;</code>,
+ <code>&lt;BR&gt;</code> etc. (although
+ <code>&lt;BR&gt;</code> may be ignored at the beginning of
+ the first cell or at the end of the last cell of a row).</li>
+
+ <li>When tables are nested, only the innermost level is a
+ candidate for tabular representation.</li>
+
+ <li>Most attributes are ignored, including borders,
+ <code>WIDTH</code>, vertical alignment.</li>
+ </ul>
+
+ <p>Horizontal alignments (<code>LEFT</code>,
+ <code>CENTER</code>, <code>RIGHT</code>), <code>COLSPAN</code>,
+ and <code>ROWSPAN</code> are interpreted according to HTML
+ 4.01. (<code>ROWSPAN</code> can only reserve empty space in
+ subsequent rows, because of the limitations above.) When TRST
+ fails because a table is not "simple" enough, the
+ representation falls back to the minimal handling described
+ earlier. Many (but, unfortunately, by no means all) tables that
+ represent inherently tabular material will thus be shown with
+ correct tabular formatting. Where table markup is used only for
+ layout purposes (containing whole blocks of text and list
+ within table cells) and not essential for understanding the
+ textual contents, it remains basically ignored. Some more
+ information on details is available in the file
+ <kbd>README.TRST</kbd> of the source distribution.</p>
+ </div>
+
+ <p>For tabular display of more complex tables, Lynx users can
+ make use of external scripts or programs. The normal Lynx
+ distribution currently does not provide such scripts, but they
+ can be written locally or downloaded from several sources. It is
+ suggested to use one of Lynx's facilities for invoking external
+ programs (see <kbd>DOWNLOADER</kbd>, <kbd>PRINTER</kbd>,
+ <kbd>EXTERNAL</kbd>, <kbd>TRUSTED_LYNXCGI</kbd> in <a href=
+ "#lynx.cfg">lynx.cfg</a> and <a href=
+ "lynx_url_support.html#cgi_url"><code>lynxcgi:</code></a> in
+ <em>Supported URLs</em> for information on various ways for
+ setting this up).</p>
+
+ <p>[<a href="#ToC-Tables">ToC</a>]</p>
+
+ <h2 id="id-Tabs"><a name="Tabs" id="Tabs">Lynx and HTML Tabs</a></h2>
+
+ <p>Lynx implements the <a href=
+ "http://www.w3.org/MarkUp/html3/Contents.html">HTML 3.0</a> TAB
+ element only when LEFT alignment is in effect. If the alignment
+ is CENTER or RIGHT (JUSTIFY is not yet implemented in Lynx, and
+ is treated as a synonym for LEFT), or if the TAB element
+ indicates a position to the left of the current position on the
+ screen, it is treated as a collapsible space. For purposes of
+ implementing TAB, Lynx treats <em>en</em> units as half a
+ character cell width when specified by the INDENT attribute, and
+ rounds up for odd values (e.g., a value of either 5 or 6 will be
+ treated as three spaces, each the width of a character cell). See
+ the example <em>table</em> using TAB elements in the test
+ subdirectory of the Lynx distribution as a model for using this
+ functionality.</p>
+
+ <p>Note that this <em>Users Guide</em> and the <a href=
+ "lynx_url_support.html">Supported URLs</a> page include TAB
+ markup in a manner which <em>degrades gracefully</em> for WWW
+ browsers which do not support it. Toggle to display of <a href=
+ "#LocalSource">source</a> and <a href="#Search">search</a> for
+ <em>&lt;tab</em> to examine the use of TAB markup in these
+ documents.</p>
+
+ <p>[<a href="#ToC-Tabs">ToC</a>]</p>
+
+ <h2 id="id-Frames"><a name="Frames" id="Frames">Lynx and HTML
+ Frames</a></h2>
+
+ <p>Some implementations of HTML include markup, primarily
+ designed for graphic clients, that is intended to create an array
+ of simultaneously displayed, independently scrolling windows.
+ Such windows have been termed <em>frames</em>.</p>
+
+ <p>Lynx recognizes the Netscape and Microsoft Explorer FRAME,
+ FRAMESET, and NOFRAMES elements, but is not capable of windowing
+ to create the intended positioning of <em>frames</em>. Instead,
+ Lynx creates labeled links to the <em>frame</em> sources,
+ typically positioned in the upper left corner of the display, and
+ renders the NOFRAMES section. If the document provider has
+ disregard for text clients and sight-challenged Webizens, and
+ thus does not include substantive content in the NOFRAMES section
+ or a link in it to a document suitable for text clients, you can
+ usually guess from the labeling of the <em>frame</em> links which
+ one has the substantive material (if there is any), or you can
+ try each of those links to see if anything worthwhile is
+ returned.</p>
+
+ <p>[<a href="#ToC-Frames">ToC</a>]</p>
+
+ <p>Some sites -- in ignorance of Lynx capabilities -- may tell
+ you (for example) "to view this page you need Netscape
+ Navigator". You can simply ignore such warnings and access the
+ frames via the Lynx-generated links as above.</p>
+
+ <h2 id="id-Banners"><a name="Banners" id="Banners">Lynx and HTML
+ Banners</a></h2>
+
+ <p>Some implementations of HTML markup include provisions for
+ creating a non-scrolling window to be positioned at the top of
+ each page, containing links with brief, descriptive link names,
+ analogous to a Windows toolbar. Such windows have been termed
+ <em>banners</em>.</p>
+
+ <p>Lynx recognizes and processes all of the <a href=
+ "http://www.w3.org/MarkUp/html3/Contents.html">HTML 3.0</a> REL
+ attribute tokens in LINK elements for creating a <em>banner</em>,
+ and a number of others which have subsequently been proposed.
+ These <em>banner</em> tokens are <em>Home</em>, <em>ToC</em>,
+ <em>Contents</em>, <em>Index</em>, <em>Glossary</em>,
+ <em>Copyright</em>, <em>Up</em>, <em>Next</em>,
+ <em>Previous</em>, <em>Prev</em>, <em>Help</em>, <em>Search</em>,
+ <em>Top</em>, <em>Origin</em>, <em>Navigator</em>,
+ <em>Child</em>, <em>Disclaimer</em>, <em>Sibling</em>,
+ <em>Parent</em>, <em>Author</em>, <em>Editor</em>,
+ <em>Publisher</em>, <em>Trademark</em>, <em>Meta</em>,
+ <em>URC</em>, <em>Hotlist</em>, <em>Begin</em>, <em>First</em>,
+ <em>End</em>, <em>Last</em>, <em>Pointer</em>,
+ <em>Translation</em>, <em>Definition</em>, <em>Chapter</em>,
+ <em>Section</em>, <em>Subsection</em>, <em>Alternate</em>,
+ <em>Documentation</em>, <em>Biblioentry</em>,
+ <em>Bibliography</em>, <em>Start</em>, <em>Appendix</em>,
+ <em>Bookmark</em> and <em>Banner</em>. Any LINK elements with
+ those tokens as the REL attribute value, and an HREF attribute
+ value in the LINK, will invoke creation of a <em>banner</em> at
+ the top of the first page, with the element's HREF as the link,
+ and the token as the default link name. If a TITLE attribute is
+ included in the LINK, its value will be used as the link name
+ instead of the default. <em>Bookmark</em> and <em>Banner</em> are
+ intended to be accompanied by a TITLE attribute, which in effect
+ makes the namespace for REL <em>banner</em> tokens infinite.</p>
+
+ <p>If the special token <em>Help</em> is used as the REL value
+ and no HREF is included in the LINK, Lynx will use it own
+ <em>HELPFILE</em> URL for that link. For the special token
+ <em>Home</em> without an HREF, Lynx will use the default
+ <em>STARTFILE</em> (i.e., derived from the configuration files or
+ the WWW_HOME environment variable, <em>not</em> the command line
+ <em>startfile</em> if one was used). However, if a
+ <em>-homepage=URL</em> was specified on the command line, its URL
+ will be used as the HREF. For the special token <em>Index</em>
+ without an HREF, Lynx will use the <em>DEFAULT_INDEX_FILE</em>
+ derived from the configuration files, or if an
+ <em>-index=URL</em> was specified on the command line, its URL
+ will be used as the HREF.</p>
+
+ <p>Lynx does not waste screen real estate maintaining the
+ <em>banner</em> at the top of every page, but the Lynx TOOLBAR
+ keystroke command (&ldquo;<samp>#</samp>&rdquo;) will, any time
+ it is pressed, position you on the <em>banner</em> so that any of
+ its links can be activated, and pressing the <em>left-arrow</em>
+ when in the <em>banner</em> will return you to where you were in
+ the current document. The toolbar is indicated by a
+ &ldquo;<samp>#</samp>&rdquo; preceding its first link when
+ present on the screen, that is, when the first page of the
+ document is being displayed. The availability of a toolbar is
+ indicated by a &ldquo;<samp>#</samp>&rdquo; at the top, left-hand
+ corner of the screen when the second or subsequent pages of the
+ document are being displayed.</p>
+
+ <p>Lynx also recognizes the <a href=
+ "http://www.w3.org/MarkUp/html3/Contents.html">HTML 3.0</a>
+ BANNER container element, and will create a <em>banner</em> based
+ on its content if one has not already been created based on LINK
+ elements. Lynx treats the Microsoft MARQUEE element as a synonym
+ for BANNER (i.e., presenting its markup as a static
+ <em>banner</em>, without any horizontal scrolling of its
+ content). Lynx does not prefix the BANNER or MARQUEE content with
+ a &ldquo;<samp>#</samp>&rdquo; because the content need not be
+ only a series of links with brief, descriptive links names, but
+ does add a &ldquo;<samp>#</samp>&rdquo; at the top, left-hand
+ corner of the screen when the content is not being displayed, to
+ indicate its accessibility via the TOOLBAR keystroke command.</p>
+
+ <p>[<a href="#ToC-Banners">ToC</a>]</p>
+
+ <h2 id="id-Footnotes"><a name="Footnotes" id="Footnotes">Lynx and
+ HTML Footnotes</a></h2>
+
+ <p>Lynx implements the <a href=
+ "http://www.w3.org/MarkUp/html3/Contents.html">HTML 3.0</a> FN
+ element similarly to a named <em>A</em>nchor within the current
+ document, and assumes that the footnotes will be positioned at
+ the bottom of the document. However, in contrast to named
+ <em>A</em>nchors, the FN container element is treated as a block
+ (i.e., as if a new paragraph were indicated whether or not that
+ is indicated in its content) with greater than normal left and
+ right margins, and the block will begin with a <em>FOOTNOTE:</em>
+ label. For example, if the document contains:</p>
+
+ <pre>
+ See the <em>&lt;A HREF="#fn1"&gt;</em><a href=
+"#an1">footnote</a><em>&lt;/A&gt;</em>.
+</pre>
+ <p>activating that link will take you to the labeled rendering
+ of:</p>
+
+ <pre>
+ <em>&lt;FN ID="fn1"&gt;</em>&lt;p&gt;<a name="an1" id=
+"an1">Lynx does not use popups for FN blocks.</a>&lt;/p&gt;<em>&lt;/FN&gt;</em>
+</pre>
+ <p>i.e., position it at the top of the page. Then, upon reading
+ the footnote, you can return to your previous position in the
+ document by pressing the <em>left-arrow</em> key. The content of
+ an FN element can be any HTML markup that is valid in the BODY of
+ the document.</p>
+
+ <p>[<a href="#ToC-Footnotes">ToC</a>]</p>
+
+ <h2 id="id-Notes"><a name="Notes" id="Notes">Lynx and HTML
+ Notes</a></h2>
+
+ <p>Lynx implements the <a href=
+ "http://www.w3.org/MarkUp/html3/Contents.html">HTML 3.0</a> NOTE
+ element (<em>Admonishment</em>) as a labeled block, i.e., as if a
+ new paragraph were indicated whether or not paragraphing markup
+ is included in its content, with greater than normal left and
+ right margins, and with the type of note indicated by an
+ emphasized label based on the value of its CLASS or ROLE
+ attribute. If no CLASS or ROLE attribute is included, the default
+ label <em>NOTE:</em> will be used. Lynx recognizes the values
+ <em>caution</em> and <em>warning</em>, for which, respectively,
+ the labels <em>CAUTION:</em> or <em>WARNING:</em> will be used.
+ The NOTE element can have an ID attribute, which will be treated
+ as a named <em>A</em>nchor, as for <a href="#Footnotes">HTML
+ Footnotes</a>, but the NOTE block need not be placed at the
+ bottom of the document. The content of a NOTE block can be any
+ HTML markup that is valid in the BODY of the document. This is an
+ example:</p>
+
+ <pre>
+ <em>&lt;NOTE CLASS="warning" ID="too-bad"&gt;
+ &lt;p&gt;The W3C vendors did not retain NOTE in the HTML 3.2 draft.&lt;/p&gt;
+ &lt;/NOTE&gt;</em>
+</pre>
+ <p>It will <em>degrade gracefully</em> for WWW browsers which do
+ not support NOTE, except for recognition of the ID attribute as a
+ named <em>A</em>nchor.</p>
+
+ <p>[<a href="#ToC-Notes">ToC</a>]</p>
+
+ <h2 id="id-Lists"><a name="Lists" id="Lists">Lynx and HTML
+ Lists</a></h2>
+
+ <p>Lynx implements the <a href=
+ "http://www.w3.org/MarkUp/html3/Contents.html">HTML 3.0</a> list
+ elements UL (<em>Unordered List</em>), OL (<em>Ordered
+ List</em>), and DL (<em>Definition List</em>), and their
+ associated attributes, and elements (LH, LI, DT, and DD) for the
+ most part as described in that specification. The lists can be
+ nested, yielding progressively greater indentation, up to six
+ levels. The <a href=
+ "http://www.w3.org/MarkUp/html-spec/html-spec_toc.html">HTML
+ 2.0</a> MENU and DIR elements <em>both</em> are treated as
+ synonyms for UL with the PLAIN attribute (no <em>bullets</em>,
+ see below). Note, thus, that neither DIR nor MENU yields a series
+ of columns with 24-character spacing. A single nesting index is
+ maintained, so that different types of List elements can be used
+ for different levels within the nest. Also, the <a href=
+ "http://www.w3.org/MarkUp/html3/Contents.html">HTML 3.0</a> FIG,
+ CAPTION and CREDIT elements are treated as valid within list
+ blocks. They will be rendered with indentation appropriate for
+ the current nesting depth, and the CAPTION or CREDIT elements
+ will have a <em>CAPTION:</em> or <em>CREDIT:</em> label beginning
+ the first line of their content. The content of any APPLET or
+ OBJECT elements in the lists also will be indented appropriately
+ for the current nesting depth, but those will not invoke line
+ breaks unless indicated by their content, and it should not
+ include markup which is inappropriate within the list.</p>
+
+ <p>Lynx also supports the TYPE attribute for OL elements, which
+ can have values of <em>1</em> for Arabic numbers, <em>I</em> or
+ <em>i</em> for uppercase or lowercase Roman numerals, or
+ <em>A</em> or <em>a</em> for uppercase or lowercase letters, that
+ increment for successive LI elements in the list block. The
+ CONTINUE attribute can be used to continue the ordering from the
+ preceding list block when the nesting depth is changed.</p>
+
+ <p>Lynx treats the OL attributes START and SEQNUM as synonyms for
+ specifying the ordering value for the first LI element in the
+ block. The values should be specified as Arabic numbers, but will
+ be displayed as Arabic, Roman, or alphabetical depending on the
+ TYPE for the block. The values can range from <em>-29997</em> to
+ the system's maximum positive integer for Arabic numbers. For
+ Roman numerals, they can range from <em>1</em> (<em>I</em> or
+ <em>i</em>) to <em>3000</em> (<em>MMM</em> or <em>mmm.</em>). For
+ alphabetical orders, the values can range from <em>1</em>
+ (<em>A</em> or <em>a</em>) to <em>18278</em> (<em>ZZZ</em> or
+ <em>zzz</em>). If the CONTINUE attribute is used, you do not need
+ to specify a START or SEQNUM attribute to extend the ordering
+ from a previous block, and you can include a TYPE attribute to
+ change among Arabic, Roman, or alphabetical ordering styles, or
+ their casing, without disrupting the sequence. If you do not
+ include a START, SEQNUM or CONTINUE attribute, the first LI
+ element of each OL block will default to <em>1</em>, and if you
+ do not include a TYPE attribute, Lynx defaults to Arabic
+ numbers.</p>
+
+ <p>For UL blocks without the PLAIN attribute, Lynx uses
+ <em>*</em>, <em>+</em>, <em>o</em>, <em>#</em>, <em>@</em> and
+ <em>-</em> as <em>bullets</em> to indicate, progressively, the
+ depth within the six nesting levels.</p>
+
+ <p>Lynx treats UL, OL, DIR, and MENU blocks as having the COMPACT
+ attribute by default, i.e., single spaces between LH and LI
+ elements within those blocks. For DL blocks, double spacing will
+ be used to separate the DT and DD elements unless the COMPACT
+ attribute has been specified.</p>
+
+ <p>[<a href="#ToC-Lists">ToC</a>]</p>
+
+ <h2 id="id-Quotes"><a name="Quotes" id="Quotes">Lynx and HTML
+ Quotes</a></h2>
+
+ <p>The <a href=
+ "http://www.w3.org/MarkUp/html3/Contents.html">HTML 3.0</a> and
+ later specifications provide for two classes of quotation in HTML
+ documents. Block quotes, designated by the BLOCKQUOTE element (or
+ its abbreviated synonym BQ in HTML 3.0), have implied paragraph
+ breaks preceding and following the start and end tags for the
+ block. Character level quotes, designated by the Q element, in
+ contrast are simply directives in the markup to insert an
+ appropriate quotation mark.</p>
+
+ <p>Lynx renders block quotes with a greater than normal left and
+ right indentation. Lynx does not support italics, and normally
+ substitutes underlining, but does not underline block quotes so
+ as not to obscure any explicit emphasis elements within the
+ quotation. The BLOCKQUOTE or BQ block can include a CREDIT
+ container element, whose content will be rendered as an implied
+ new paragraph with a <em>CREDIT:</em> label at the beginning of
+ its first line.</p>
+
+ <p>Lynx respects nested Q start and end tags, and will use ASCII
+ double-quotes (<samp>"</samp>) versus grave accent
+ (<samp>`</samp>) and apostrophe (<samp>'</samp>), respectively,
+ for even versus odd depths in the nest.</p>
+
+ <p>Any ID attributes in BLOCKQUOTE, BQ or Q elements can be the
+ target of a hyperlink in the form URL#id. It is treated just like
+ the NAME in <em>A</em>nchors.</p>
+
+ <p>[<a href="#ToC-Quotes">ToC</a>]</p>
+
+ <h2 id="id-Eightbit"><a name="Eightbit" id="Eightbit">Lynx and
+ HTML Internationalization: 8bit, UNICODE, etc.</a></h2>
+
+ <p>Lynx has superior support for HTML 4.0/I18N
+ internationalization issues. However, to see the characters other
+ than 7bit properly you <em>should</em> set your <a href=
+ "keystrokes/option_help.html#DC">display character set</a> from
+ Option Menu and save its value, this is a Frequently Asked
+ Question. Fine-turning is also available from <a href=
+ "#lynx.cfg">lynx.cfg</a></p>
+
+ <p>[<a href="#ToC-Eightbit">ToC</a>]</p>
+
+ <h2 id="id-USEMAP"><a name="USEMAP" id="USEMAP">Lynx and
+ Client-Side-Image-Maps</a></h2>
+
+ <p>HTML includes markup, designed primarily for graphic clients,
+ that treats inlined images as maps, such that areas of the image
+ within which a mouse cursor was positioned when the mouse was
+ <em>clicked</em> can correspond to URLs which should be
+ retrieved. The original implementations were based on the client
+ sending an http server the x,y coordinates associated with the
+ <em>click</em>, for handling by a script invoked by the server,
+ and have been termed <em>server-side-image-maps</em>. Lynx has no
+ rational way of coping with such a procedure, and thus simply
+ sends a 0,0 coordinate pair, which some server scripts treat as
+ an instruction to return a document suitable for a text
+ client.</p>
+
+ <p>Newer HTML markup provides bases for the client to determine
+ the URLs associated with areas in the image map, and/or for a
+ text client to process alternative markup and allow the user to
+ make choices based on textual information. These have been termed
+ <em>client-side-image-maps</em>.</p>
+
+ <p>Lynx recognizes and processes the MAP container element and
+ its AREA elements, and will create a menu of links for the HREF
+ of each AREA when the link created for the IMG element with a
+ USEMAP attribute is activated. The menu uses the ALT attributes
+ of the AREA elements as the link names, or, if the document's
+ author has disregard for text clients and sight-challenged
+ Webizens, and thus did not include ALT attributes, Lynx uses the
+ resolved URLs pointed to by the HREF attributes as the link
+ names. Lynx uses the TITLE attribute of the IMG element, or the
+ TITLE attribute of the MAP, if either was present in the markup,
+ as the title and main header of the menu. Otherwise, it uses the
+ ALT attribute of the IMG element. If neither TITLE nor ALT
+ attributes were present in the markup, Lynx creates and uses a
+ <em>[USEMAP]</em> pseudo-ALT. The MAPs need not be in the same
+ document as the IMG elements. If not in the same document, Lynx
+ will fetch the document which contains the referenced MAP, and
+ locate it based on its NAME or ID attribute. All MAPs encountered
+ in documents during a Lynx session are cached, so that they need
+ not be retrieved repeatedly when referenced in different
+ documents.</p>
+
+ <p>If the IMG element also indicates a
+ <em>server-side-image-map</em> via an ISMAP attribute, Lynx
+ normally will create a link for that as well, using an
+ <em>[ISMAP]</em> pseudo-ALT (followed by a hyphen to indicate its
+ association with the <em>client-side-image-map</em>) rather than
+ ignoring it, and will submit a 0,0 coordinate pair if that link
+ is activated. Although, the <em>client-side-image-map</em> may be
+ more useful for a client such as Lynx, because all of the URLs
+ associated with the image map can be accessed, and their nature
+ indicated via ALT attributes, Lynx-friendly sites can map 0,0
+ such that the server returns a for-text-client document
+ homologous to the content of FIG elements (see below). Inclusion
+ of such a link for submissions to the server can be disabled by
+ default via the configuration file (<a href=
+ "#lynx.cfg">lynx.cfg</a>), and the default can be toggled via the
+ <em>-ismap</em> command line switch.</p>
+
+ <p>Lynx also recognizes the <a href=
+ "http://www.w3.org/MarkUp/html3/Contents.html">HTML 3.0</a> FIG
+ and OVERLAY elements, and will handle them as intended for text
+ clients. These are the ideal way to handle
+ <em>client-side-image-maps</em>, because the FIG content provides
+ complete alternative markup, rather than relying on the client to
+ construct a relatively meager list of links with link names based
+ on ALT strings.</p>
+
+ <p>The presently experimental OBJECT element encompasses much of
+ the functionality of the FIG element for
+ <em>client-side-image-maps</em>. Lynx will render and display the
+ content of OBJECT elements which have the SHAPES attribute
+ equivalently to its handling of FIG. Lynx also handles OBJECT
+ elements with the USEMAP and/or ISMAP attributes equivalently to
+ its handling of IMG elements with <em>client-side-image-maps</em>
+ and/or <em>server-side-image-maps</em>.</p>
+
+ <p>[<a href="#ToC-USEMAP">ToC</a>]</p>
+
+ <h2 id="id-Refresh"><a name="Refresh" id="Refresh">Lynx and
+ Client-Side-Pull</a></h2>
+
+ <p>HTML includes provision for passing instructions to clients
+ via directives in META elements, and one such instruction, via
+ the token <em>Refresh</em>, should invoke reloading of the
+ document, fetched from a server with the same URL or a new URL,
+ at a specified number of seconds following receipt of the current
+ document. This procedure has been termed
+ <em>client-side-pull</em>. An example of such an element is:</p>
+
+ <pre>
+ <em>&lt;META HTTP-EQUIV="Refresh" CONTENT="3; URL=http://host/path"&gt;</em>
+</pre>
+ <p>which instructs a client to fetch the indicated URL in 3
+ seconds after receiving the current document. If the
+ <em>URL=</em> field is omitted, the URL defaults to that of the
+ current document. A <em>no-cache</em> directive is implied when
+ the <em>Refresh</em> if for the same URL.</p>
+
+ <p>Lynx recognizes and processes <em>Refresh</em> directives in
+ META elements, but puts up a labeled link, typically in the upper
+ left corner of the display, indicating the number of seconds
+ intended before a refresh, and the URL for the refresh, instead
+ of making the request automatically after the indicated number of
+ seconds. This allows people using a braille interface any amount
+ of time to examine the current document before activating the
+ link for the next URL. In general, if the number of seconds
+ indicated is short, the timing is not critical and you can
+ activate the link whenever you like. If it is long (e.g., 60
+ seconds), a server process may be generating new documents or
+ images at that interval, and you would be wasting bandwidth by
+ activating the link at a shorter interval.</p>
+
+ <p>[<a href="#ToC-Refresh">ToC</a>]</p>
+
+ <h2 id="id-Cookies"><a name="Cookies" id="Cookies">Lynx State
+ Management</a> (Me want <em>cookie</em>!)</h2>
+
+ <p>HTTP provides a means to carry state information across
+ successive connections between a browser and an http server.
+ Normally, http servers respond to each browser request without
+ relating that request to previous or subsequent requests. Though
+ the inclusion of INPUT fields with TYPE="hidden" can be used as a
+ sort of state management by <a href="#Forms">HTML Forms</a>, a
+ more general approach involves exchanges of MIME headers between
+ the server and browser. When replying to a request, the server
+ can send a <em>Set-Cookie</em> MIME header which contains
+ information (<em>cookies</em>) relevant to the browser's request,
+ and in subsequent requests the browser can send a <em>Cookie</em>
+ MIME header with information derived from previously received
+ cookies.</p>
+
+ <p>State Management via cookie exchanges originally was
+ implemented by Netscape, and such cookies are now designated as
+ <em>Version 0</em>. A more elaborate format for cookies,
+ designated as <em>Version 1</em>, was standardized by the IETF
+ (Internet Engineering Task Force) as <a href=
+ "https://www.ietf.org/rfc/rfc2109.txt">RFC&nbsp;2109</a>. Lynx
+ supports both <em>Version 0</em> and <em>Version 1</em> cookie
+ exchanges. This support can be disabled by default via the
+ SET_COOKIES symbol in the compilation (<em>userdefs.h</em>)
+ and/or run time (<a href="#lynx.cfg">lynx.cfg</a>) configuration
+ files, and that default setting can be toggled via the
+ <em>-cookies</em> command line switch. The SET_COOKIES symbol can
+ be further modified by the ACCEPT_ALL_COOKIES mode. If
+ ACCEPT_ALL_COOKIES is set TRUE, and SET_COOKIES is TRUE, Lynx
+ will accept all cookies. Additionally, the cookies that are
+ automatically accepted or rejected by Lynx can be further
+ modified with the COOKIE_ACCEPT_DOMAINS and COOKIE_REJECT_DOMAINS
+ options in your .lynxrc file, each of which is a comma-separated
+ list of domains to perform the desired action. The domain listed
+ in these options must be identical to the domain the cookie comes
+ from, there is no wildcard matching. If a domain is specific in
+ both COOKIE_ACCEPT_DOMAINS and COOKIE_REJECT_DOMAINS, rejection
+ will take precedence.</p>
+
+ <p>When cookie support is enabled, <em>Set-Cookie</em> MIME
+ headers received from an http server invoke confirmation prompts
+ with possible replies of &ldquo;<samp>Y</samp>&rdquo;es or
+ &ldquo;<samp>N</samp>&rdquo;o for acceptance of the cookie,
+ &ldquo;<samp>A</samp>&rdquo;lways to accept the cookie and to
+ allow all subsequent cookies from that <em>domain</em> (server's
+ Fully Qualified Domain Name, or site-identifying portion of the
+ FQDN) without further confirmation prompts, or
+ ne&ldquo;<strong>V</strong>&rdquo;er to never allow cookies from
+ that <em>domain</em> to be accepted (silently ignore its
+ <em>Set-Cookie</em> MIME headers). All unexpired cookies are held
+ in a hypothetical <em>Cookie Jar</em> which can be examined via
+ the COOKIE_JAR keystroke command, normally mapped to
+ <em>Ctrl-K</em>, for invoking the <a href=
+ "keystrokes/cookie_help.html">Cookie Jar Page</a>. If Lynx has
+ been compiled with the --enable-persistent-cookies flag, then
+ unexpired cookies will be stored between sessions in the filename
+ set with the COOKIE_FILE option in your .lynxrc.</p>
+
+ <p>A common use of cookies by http servers is simply to track the
+ documents visited by individual users. Though this can be useful
+ to the site's WebMaster for evaluating and improving the
+ organization of links in the various documents of the site, if
+ the user has configured Lynx to include a <em>From</em> MIME
+ header with the user's email address in http requests, or has
+ passed personal information to the server via a form submission,
+ the tracking might be used to draw inferences, possibly
+ incorrect, about that user, and may be considered by some as an
+ invasion of privacy.</p>
+
+ <p>An example of worthwhile State Management via cookies is the
+ setting of personal preferences, typically via a form submission
+ to the site, which will then apply to all documents visited at
+ that site.</p>
+
+ <p>If you accept cookies when accessing a site, but are given no
+ indication about how they will be used in subsequent requests to
+ that site, nor can infer how they will be used, you can
+ <em>Gobble</em> (delete) the cookies and/or change the
+ &ldquo;allow&rdquo; setting for its <em>domain</em> via the
+ <a href="keystrokes/cookie_help.html">Cookie Jar Page</a>.</p>
+
+ <p>[<a href="#ToC-Cookies">ToC</a>]</p>
+
+ <h2 id="id-Cache"><a name="Cache" id="Cache">Cached Documents</a></h2>
+
+ <p>A list of documents which are in lynx's internal cache is
+ accessible through hypothetical <em>Cache Jar</em> which can be
+ examined via the CACHE_JAR keystroke command, normally mapped to
+ <em>Ctrl-X</em>.</p>
+
+ <p>Entries in the <em>Cache Jar</em> are ordered from oldest (at
+ the top) to newest. The user can easily access any document which
+ is in the cache, especially those which may be soon removed due
+ to configurable limits on the maximum number of cached documents,
+ as well as the maximum amount of memory used by the cache.</p>
+
+ <p>The structure of <em>Cache Jar</em> is simple:</p>
+
+ <ul>
+ <li>Each entry starts with its ordinal number (within the
+ session), recently added documents in cache have a smaller
+ number than documents which are added before, and are
+ positioned at the end of <em>Cache Jar</em></li>
+
+ <li>Following its ordinal number is the document title, which
+ is also a link. On activating this link, the user is prompted
+ if they want to delete the document from <em>Cache Jar</em>.
+ The document's address (also a link) follows the title. It is
+ distinguished by a <code>URL:</code> label preceding the link.
+ Activating this link, lynx displays the corresponding cached
+ document.</li>
+
+ <li>Below each cached document URL lynx shows the document
+ properties which include:
+ <ul>
+ <li>Lines,</li>
+
+ <li>Size,</li>
+
+ <li>File-Cache,</li>
+
+ <li>Content-Type,</li>
+
+ <li>Content-Language,</li>
+
+ <li>Content-Encoding,</li>
+
+ <li>Content-Location,</li>
+
+ <li>Subject,</li>
+
+ <li>Owner,</li>
+
+ <li>Date,</li>
+
+ <li>Expires,</li>
+
+ <li>Last-Modified,</li>
+
+ <li>ETag,</li>
+
+ <li>Server, and</li>
+
+ <li>Source-Cache-File.</li>
+ </ul>
+ </li>
+ </ul>
+
+ <p>This feature can be enabled by default using the USE_CACHEJAR
+ symbol in the compilation (<code>userdefs.h</code>), as well as
+ enabled in lynx.cfg</p>
+
+ <p>[<a href="#ToC-Cache">ToC</a>]</p>
+
+ <h2 id="id-Sessions"><a name="Sessions" id=
+ "Sessions"><em>Sessions</em></a></h2>
+
+ <p>Lynx's current state (all information about the user's current
+ activity with lynx) is called a session. Sessions are useful in
+ particular if you are in the middle of exploring something on the
+ web and you were forced to stop abruptly, losing any trace of
+ your current work.</p>
+
+ <p>A session can be automatically restored as lynx starts after a
+ clean exit. The session data is saved if lynx is invoked with the
+ <em>-session=FILENAME</em> switch. The <em>FILENAME</em> is the
+ name of the file where the session will be stored.</p>
+
+ <p>There are also switches for only restoring:
+ <em>-sessionin=FILENAME</em> and for only saving:
+ <em>-sessionout=FILENAME</em> sessions:</p>
+
+ <p>If you do not want to specify these options at each lynx
+ startup, there is an option in <em>lynx.cfg</em> to enable
+ automatic saving/restoring of session. To keep lynx startup/exit
+ reasonable fast there is also an option in <em>lynx.cfg</em>
+ specifying how much information about the current lynx session
+ will be stored in file.</p>
+
+ <p>The syntax of the session file is simple. You can use a text
+ editor to modify, add new entries, or remove URLs you no longer
+ want.</p>
+
+ <p>[<a href="#ToC-Sessions">ToC</a>]</p>
+
+ <h2 id="id-Invoking"><a name="Invoking" id="Invoking">The Lynx
+ command line</a></h2>
+
+ <p>A summary of the Lynx command line options (switches) is
+ returned to stdout if Lynx is invoked with the <em>-help</em>
+ switch. A description of the options also should be available via
+ the system man (Unix) pages or help (VMS) libraries. On Win32,
+ typing lynx -help in a DOS window should display similarly. The
+ basic syntax of the Lynx command line can be represented as one
+ of the following:</p>
+
+ <dl>
+ <dt><code>Command</code>
+ </dt>
+
+ <dd><code>lynx [options]</code>
+ </dd>
+
+ <dd><code>lynx [options] startfile</code>
+ </dd>
+ </dl>
+
+ <p>where</p>
+
+ <dl>
+ <dt><code>startfile</code>
+ </dt>
+
+ <dd>
+ <p>is the file or URL that Lynx will load at start-up.</p>
+
+ <ul>
+ <li>If startfile is not specified, Lynx will use a default
+ starting file and base directory determined during
+ installation.</li>
+
+ <li>If a specified file is local (i.e., not a URL) Lynx
+ displays that file and uses the directory in which that
+ file resides as the base directory.</li>
+
+ <li>If a URL is specified, the file will be retrieved, and
+ only the server base directory will be relevant to further
+ accesses.</li>
+
+ <li>If more than one local file or remote URL is listed on
+ the command line, Lynx will open only the last
+ interactively. All of the names (local files and remote
+ URLs) are added to the G)oto history.</li>
+ </ul>
+ </dd>
+
+ <dt><code>options</code>
+ </dt>
+
+ <dd>
+ <p>Lynx uses only long option names. Option names can begin
+ with double dash as well, underscores and dashes can be
+ intermixed in option names (in the reference below options
+ are with one dash before them and with underscores).</p>
+
+ <p>Lynx provides many command-line options. Some options
+ require a value (string, number or keyword). These are noted
+ in the reference below. The other options set boolean values
+ in the program. There are three types of boolean options:
+ set, unset and toggle. If no option value is given, these
+ have the obvious meaning: set (to true), unset (to false), or
+ toggle (between true/false). For any of these, an explicit
+ value can be given in different forms to allow for operating
+ system constraints, e.g.,</p>
+
+ <blockquote>
+ <pre>
+-center:off
+-center=off
+-center-
+</pre>
+ </blockquote>
+
+ <p>Lynx recognizes "1", "+", "on" and "true" for true values,
+ and "0", "-", "off" and "false" for false values. Other
+ option-values are ignored.</p>
+
+ <p>The default boolean, number and string option values that
+ are compiled into lynx are displayed in the help-message
+ provided by lynx -help. Some of those may differ according to
+ how lynx was built; see the help message itself for these
+ values. The -help option is processed before any option,
+ including those that control reading from the lynx.cfg file.
+ Therefore runtime configuration values are not reflected in
+ the help-message.</p>
+
+ <p>Capitalized items in the option summary indicate that a
+ substitution must be made. These are the options:</p>
+
+ <dl>
+ <dt><code><strong>-</strong></code>
+ </dt>
+
+ <dd>
+ <p>If the argument is only
+ &ldquo;<code><strong>-</strong></code>&rdquo; (dash),
+ then Lynx expects to receive the arguments from stdin.
+ This is to allow for the potentially very long command
+ line that can be associated with the <em>-get_data</em>
+ or <em>-post_data</em> arguments (see below). It can also
+ be used to avoid having sensitive information in the
+ invoking command line (which would be visible to other
+ processes on most systems), especially when the
+ <em>-auth</em> or <em>-pauth</em> options are used. On
+ VMS, the dash must be encased in double-quotes ("-") and
+ the keyboard input terminated with <em>Control-Z</em> or
+ the command file input terminated by a line that begins
+ with &ldquo;<samp>$</samp>&rdquo;. On Unix, the keyboard
+ input terminator is <em>Control-D</em>. On Win32,
+ [???].</p>
+ </dd>
+
+ <dt><code><strong>-accept_all_cookies</strong></code>
+ </dt>
+
+ <dd>
+ <p>accept all cookies.</p>
+ </dd>
+
+ <dt><code><strong>-anonymous</strong></code>
+ </dt>
+
+ <dd>
+ <p>apply restrictions appropriate for an anonymous
+ account, see <em>-restrictions</em> below for some
+ details.</p>
+ </dd>
+
+ <dt>
+ <code><strong>-assume_charset=</strong><em>MIMENAME</em></code>
+ </dt>
+
+ <dd>
+ <p>charset for documents that do not specify it.</p>
+ </dd>
+
+ <dt>
+ <code><strong>-assume_local_charset=</strong><em>MIMENAME</em></code>
+ </dt>
+
+ <dd>
+ <p>charset assumed for local files, i.e., files which
+ lynx creates such as internal pages for the options
+ menu.</p>
+ </dd>
+
+ <dt>
+ <code><strong>-assume_unrec_charset=</strong><em>MIMENAME</em></code>
+ </dt>
+
+ <dd>
+ <p>use this instead of unrecognized charsets.</p>
+ </dd>
+
+ <dt><code><strong>-auth=</strong><em>ID:PW</em></code>
+ </dt>
+
+ <dd>
+ <p>set authorization <em>identifier</em> and
+ <em>password</em> for protected documents at startup. Be
+ sure to protect any script files which use this
+ switch.</p>
+ </dd>
+
+ <dt><code><strong>-base</strong></code>
+ </dt>
+
+ <dd>
+ <p>prepend a request URL comment and BASE tag to
+ text/html outputs for -source dumps.</p>
+ </dd>
+
+ <dt><code><strong>-bibp=</strong><em>URL</em></code>
+ </dt>
+
+ <dd>
+ <p>specify a local bibp server (default
+ http://bibhost/).</p>
+ </dd>
+
+ <dt><code><strong>-blink</strong></code>
+ </dt>
+
+ <dd>
+ <p>forces high intensity background colors for color
+ mode, if available and supported by the terminal. This
+ applies to the slang library (for a few terminal
+ emulators), or to OS/2 EMX with ncurses.</p>
+ </dd>
+
+ <dt><code><strong>-book</strong></code>
+ </dt>
+
+ <dd>
+ <p>use the bookmark page as the startfile. The default or
+ command line startfile is still set for the Main screen
+ command, and will be used if the bookmark page is
+ unavailable or blank.</p>
+ </dd>
+
+ <dt><code><strong>-buried_news</strong></code>
+ </dt>
+
+ <dd>
+ <p>toggles scanning of news articles for buried
+ references, and converts them to news links. Not
+ recommended because email addresses enclosed in angle
+ brackets will be converted to false news links, and
+ uuencoded messages can be trashed.</p>
+ </dd>
+
+ <dt><code><strong>-cache=</strong><em>NUMBER</em></code>
+ </dt>
+
+ <dd>
+ <p>set the <em>NUMBER</em> of documents cached in memory.
+ The default is 10.</p>
+ </dd>
+
+ <dt><code><strong>-center</strong></code>
+ </dt>
+
+ <dd>
+ <p>Toggle center alignment in HTML TABLE.</p>
+ </dd>
+
+ <dt><code><strong>-case</strong></code>
+ </dt>
+
+ <dd>
+ <p>enable case-sensitive string searching.</p>
+ </dd>
+
+ <dt><code><strong>-cfg=</strong><em>FILENAME</em></code>
+ </dt>
+
+ <dd>
+ <p>specifies a Lynx configuration file other than the
+ default <a href="#lynx.cfg">lynx.cfg</a>.</p>
+ </dd>
+
+ <dt><code><strong>-child</strong></code>
+ </dt>
+
+ <dd>
+ <p>exit on left-arrow in startfile, and disable save to
+ disk.</p>
+ </dd>
+
+ <dt><code><strong>-child_relaxed</strong></code>
+ </dt>
+
+ <dd>
+ <p>exit on left-arrow in startfile, but allow save to
+ disk and associated print/mail options.</p>
+ </dd>
+
+ <dt>
+ <code><strong>-cmd_log=</strong><em>FILENAME</em></code>
+ </dt>
+
+ <dd>
+ <p>write keystroke commands and related information to
+ the specified file.</p>
+ </dd>
+
+ <dt>
+ <code><strong>-cmd_script=</strong><em>FILENAME</em></code>
+ </dt>
+
+ <dd>
+ <p>read keystroke commands from the specified file. You
+ can use the data written using the <em>-cmd_log</em>
+ option. Lynx will ignore other information which the
+ command-logging may have written to the log- file. Each
+ line of the command script contains either a comment
+ beginning with "#", or a keyword:</p>
+
+ <dl>
+ <dt><code><strong>exit</strong></code>
+ </dt>
+
+ <dd>
+ <p>causes the script to stop, and forces lynx to exit
+ immediately.</p>
+ </dd>
+
+ <dt><code><strong>key</strong></code>
+ </dt>
+
+ <dd>
+ <p>the character value, in printable form. Cursor and
+ other special keys are given as names, e.g.,
+ <code><strong>Down Arrow</strong></code>. Printable
+ 7-bit ASCII codes are given as-is, and hexadecimal
+ values represent other 8-bit codes.</p>
+ </dd>
+
+ <dt><code><strong>set</strong></code>
+ </dt>
+
+ <dd>
+ <p>followed by a "name=value" allows one to override
+ values set in the lynx.cfg file.</p>
+ </dd>
+ </dl>
+ </dd>
+
+ <dt><code><strong>-color</strong></code>
+ </dt>
+
+ <dd>
+ <p>forces color mode on. This feature is only available
+ if Lynx is built using the slang library. The slang
+ library will send ANSI color sequences without regard to
+ the type of terminal which is being used.</p>
+
+ <p>If color support is instead provided by a
+ color-capable curses library such as ncurses, Lynx relies
+ completely on the terminal description to determine
+ whether color mode is possible, and this flag is not
+ needed and thus unavailable.</p>
+
+ <p>A saved <samp>show_color=always</samp> setting found
+ in a .lynxrc file at startup has the same effect, but the
+ setting read from .lynxrc on startup is overridden by
+ this flag.</p>
+ </dd>
+
+ <dt>
+ <code><strong>-connect_timeout</strong>=<em>N</em></code>
+ </dt>
+
+ <dd>
+ <p>Sets the connection timeout, where <em>N</em> is given
+ in seconds.</p>
+ </dd>
+
+ <dt>
+ <code><strong>-cookie_file=</strong><em>FILENAME</em></code>
+ </dt>
+
+ <dd>
+ <p>specifies a file to use to read cookies. If none is
+ specified, the default value is ~/.lynx_cookies for most
+ systems, but ~/cookies for MS-DOS.</p>
+ </dd>
+
+ <dt>
+ <code><strong>-cookie_save_file=</strong><em>FILENAME</em></code>
+ </dt>
+
+ <dd>
+ <p>specifies a file to use to store cookies. If none is
+ specified, the value given by
+ <code><strong>-cookie_file</strong></code> is used.</p>
+ </dd>
+
+ <dt><code><strong>-cookies</strong></code>
+ </dt>
+
+ <dd>
+ <p>toggles handling of Set-Cookie headers.</p>
+ </dd>
+
+ <dt><code><strong>-core</strong></code>
+ </dt>
+
+ <dd>
+ <p>toggles forced core dumps on fatal errors. (Unix
+ only)</p>
+ </dd>
+
+ <dt><code><strong>-crawl</strong></code>
+ </dt>
+
+ <dd>
+ <p>with <em>-traversal</em>, output each page to a
+ file.</p>
+
+ <p>with <em>-dump</em>, format output as with
+ <em>-traversal</em>, but to stdout.</p>
+ </dd>
+
+ <dt><code><strong>-curses_pads</strong></code>
+ </dt>
+
+ <dd>
+ <p>toggles the use of curses "pad" feature which supports
+ left/right scrolling of the display.</p>
+ </dd>
+
+ <dt><code><strong>-debug_partial</strong></code>
+ </dt>
+
+ <dd>
+ <p>separate incremental display stages with MessageSecs
+ delay</p>
+ </dd>
+
+ <dt><code><strong>-display=</strong><em>DISPLAY</em></code>
+ </dt>
+
+ <dd>
+ <p>set the display variable for X rexe-ced programs.</p>
+ </dd>
+
+ <dt>
+ <code><strong>-display_charset=</strong><em>MIMEname</em></code>
+ </dt>
+
+ <dd>
+ <p>set the charset for the terminal output.</p>
+ </dd>
+
+ <dt><code><strong>-dont_wrap_pre</strong></code>
+ </dt>
+
+ <dd>
+ <p>inhibit wrapping of text in &lt;pre&gt; when -dump'ing
+ and -crawl'ing, mark wrapped lines in interactive
+ session.</p>
+ </dd>
+
+ <dt><code><strong>-dump</strong></code>
+ </dt>
+
+ <dd>
+ <p>dumps the formatted output of the default document or
+ one specified on the command line to standard out. This
+ can be used in the following way:</p>
+
+ <blockquote>
+ <p><em>lynx -dump http://www.w3.org/</em>
+ </p>
+ </blockquote>
+ </dd>
+
+ <dt><code><strong>-editor=</strong><em>EDITOR</em></code>
+ </dt>
+
+ <dd>
+ <p>enable external editing using the specified
+ <em>EDITOR</em>. (vi, ed, emacs, etc.)</p>
+ </dd>
+
+ <dt><code><strong>-emacskeys</strong></code>
+ </dt>
+
+ <dd>
+ <p>enable emacs-like key movement.</p>
+ </dd>
+
+ <dt><code><strong>-enable_scrollback</strong></code>
+ </dt>
+
+ <dd>
+ <p>toggles behavior compatible with the scrollback keys
+ in some communications software (may be incompatible with
+ some curses packages).</p>
+ </dd>
+
+ <dt>
+ <code><strong>-error_file=</strong><em>FILENAME</em></code>
+ </dt>
+
+ <dd>
+ <p>the status code from the HTTP request is placed in
+ this file.</p>
+ </dd>
+
+ <dt><code><strong>-exec</strong></code>
+ </dt>
+
+ <dd>
+ <p>enable local program execution (normally not
+ configured).</p>
+ </dd>
+
+ <dt><code><strong>-fileversions</strong></code>
+ </dt>
+
+ <dd>
+ <p>include all versions of files in local VMS directory
+ listings.</p>
+ </dd>
+
+ <dt><code><strong>-find_leaks</strong></code>
+ </dt>
+
+ <dd>
+ <p>toggles the memory leak checking off. Normally this is
+ not compiled-into your executable, but when it is, it can
+ be disabled for a session.</p>
+ </dd>
+
+ <dt><code><strong>-force_empty_hrefless_a</strong></code>
+ </dt>
+
+ <dd>
+ <p>force HREF-less &ldquo;A&rdquo; elements to be empty
+ (close them as soon as they are seen).</p>
+ </dd>
+
+ <dt><code><strong>-force_html</strong></code>
+ </dt>
+
+ <dd>
+ <p>forces the first document to be interpreted as
+ HTML.</p>
+ </dd>
+
+ <dt><code><strong>-force_secure</strong></code>
+ </dt>
+
+ <dd>
+ <p>toggles forcing of the secure flag for SSL
+ cookies.</p>
+ </dd>
+
+ <dt><code><strong>-forms_options</strong></code>
+ </dt>
+
+ <dd>
+ <p>toggles whether the Options Menu is key-based or
+ form-based.</p>
+ </dd>
+
+ <dt><code><strong>-from</strong></code>
+ </dt>
+
+ <dd>
+ <p>toggles transmissions of From headers to HTTP or HTTPS
+ servers.</p>
+ </dd>
+
+ <dt><code><strong>-ftp</strong></code>
+ </dt>
+
+ <dd>
+ <p>disable ftp access.</p>
+ </dd>
+
+ <dt><code><strong>-get_data</strong></code>
+ </dt>
+
+ <dd>
+ <p>properly formatted data for a get form are read in
+ from stdin and passed to the form. Input is terminated by
+ a line that starts with &ldquo;---&rdquo;.</p>
+ </dd>
+
+ <dt><code><strong>-head</strong></code>
+ </dt>
+
+ <dd>
+ <p>send a HEAD request for the mime headers.</p>
+ </dd>
+
+ <dt><code><strong>-help</strong></code>
+ </dt>
+
+ <dd>
+ <p>print this Lynx command syntax usage message.</p>
+ </dd>
+
+ <dt>
+ <code><strong>-hiddenlinks=</strong><em>option</em></code>
+ </dt>
+
+ <dd>
+ <p>control the display of hidden links. Option values
+ are:</p>
+
+ <dl>
+ <dt><code><strong>merge</strong></code>
+ </dt>
+
+ <dd>
+ <p>hidden links show up as bracketed numbers and are
+ numbered together with other links in the sequence of
+ their occurrence in the document.</p>
+ </dd>
+
+ <dt><code><strong>listonly</strong></code>
+ </dt>
+
+ <dd>
+ <p>hidden links are shown only on <em>L</em>ist
+ screens and listings generated by
+ <code><strong>-dump</strong></code> or from the
+ <em>P</em>rint menu, but appear separately at the end
+ of those lists. This is the default behavior.</p>
+ </dd>
+
+ <dt><code><strong>ignore</strong></code>
+ </dt>
+
+ <dd>
+ <p>hidden links do not appear even in listings.</p>
+ </dd>
+ </dl>
+ </dd>
+
+ <dt><code><strong>-historical</strong></code>
+ </dt>
+
+ <dd>
+ <p>toggles use of &ldquo;&gt;&rdquo; or
+ &ldquo;--&gt;&rdquo; as a terminator for comments.</p>
+ </dd>
+
+ <dt><code><strong>-homepage=</strong><em>URL</em></code>
+ </dt>
+
+ <dd>
+ <p>set homepage separate from start page. Will be used if
+ a fetch of the start page fails or if it is a script
+ which does not return a document, and as the
+ <code><em>URL</em></code> for the
+ &ldquo;<samp>m</samp>&rdquo;ain menu command.</p>
+ </dd>
+
+ <dt><code><strong>-image_links</strong></code>
+ </dt>
+
+ <dd>
+ <p>toggles inclusion of links for all images.</p>
+ </dd>
+
+ <dt><code><strong>-ismap</strong></code>
+ </dt>
+
+ <dd>
+ <p>toggles inclusion of ISMAP links when client-side MAPs
+ are present.</p>
+ </dd>
+
+ <dt><code><strong>-index=</strong><em>URL</em></code>
+ </dt>
+
+ <dd>
+ <p>set the default index file to the specified
+ <em>URL</em></p>
+ </dd>
+
+ <dt><code><strong>-justify</strong></code>
+ </dt>
+
+ <dd>
+ <p>do justification of text.</p>
+ </dd>
+
+ <dt><code><strong>-link=</strong><em>NUMBER</em></code>
+ </dt>
+
+ <dd>
+ <p>starting count for lnk#.dat files produced by
+ <em>-crawl</em>.</p>
+ </dd>
+
+ <dt><code><strong>-localhost</strong></code>
+ </dt>
+
+ <dd>
+ <p>disable URLs that point to remote hosts.</p>
+ </dd>
+
+ <dt><code><strong>-locexec</strong></code>
+ </dt>
+
+ <dd>
+ <p>enable local program execution from local files only
+ (if lynx was compiled with local execution enabled).</p>
+ </dd>
+
+ <dt><code><strong>-lss=</strong><em>FILENAME</em></code>
+ </dt>
+
+ <dd>
+ <p>specify filename containing color-style information.
+ The default is lynx.lss.</p>
+ </dd>
+
+ <dt><code><strong>-mime_header</strong></code>
+ </dt>
+
+ <dd>
+ <p>include mime headers and force source dump.</p>
+ </dd>
+
+ <dt><code><strong>-minimal</strong></code>
+ </dt>
+
+ <dd>
+ <p>toggles minimal versus valid comment parsing. When
+ minimal, any &ldquo;--&gt;&rdquo; serves as a terminator
+ for a comment element. When valid, pairs of
+ &ldquo;--&rdquo; are treated as delimiters for series of
+ comments within the overall comment element. If
+ historical is set, that overrides minimal or valid
+ comment parsing.</p>
+ </dd>
+
+ <dt><code><strong>-nested_tables</strong></code>
+ </dt>
+
+ <dd>
+ <p>toggles nested-tables logic (for debugging).</p>
+ </dd>
+
+ <dt>
+ <code><strong>-newschunksize=</strong><em>NUMBER</em></code>
+ </dt>
+
+ <dd>
+ <p>number of articles in chunked news listings.</p>
+ </dd>
+
+ <dt>
+ <code><strong>-newsmaxchunk=</strong><em>NUMBER</em></code>
+ </dt>
+
+ <dd>
+ <p>maximum news articles in listings before chunking.</p>
+ </dd>
+
+ <dt><code><strong>-nobold</strong></code>
+ </dt>
+
+ <dd>
+ <p>disable bold video-attribute.</p>
+ </dd>
+
+ <dt><code><strong>-nobrowse</strong></code>
+ </dt>
+
+ <dd>
+ <p>disable directory browsing.</p>
+ </dd>
+
+ <dt><code><strong>-nocc</strong></code>
+ </dt>
+
+ <dd>
+ <p>disable Cc: prompts for self copies of mailings. Note
+ that this does not disable any CCs which are incorporated
+ within a mailto URL or form ACTION.</p>
+ </dd>
+
+ <dt><code><strong>-nocolor</strong></code>
+ </dt>
+
+ <dd>
+ <p>force color mode off, overriding terminal capabilities
+ and any <em>-color</em> flags, <em>COLORTERM</em>
+ variable, and saved .lynxrc settings.</p>
+ </dd>
+
+ <dt><code><strong>-noexec</strong></code>
+ </dt>
+
+ <dd>
+ <p>disable local program execution. (DEFAULT)</p>
+ </dd>
+
+ <dt><code><strong>-nofilereferer</strong></code>
+ </dt>
+
+ <dd>
+ <p>disable transmissions of Referer headers for file
+ URLs.</p>
+ </dd>
+
+ <dt><code><strong>-nolist</strong></code>
+ </dt>
+
+ <dd>
+ <p>disable the link list feature in dumps.</p>
+ </dd>
+
+ <dt><code><strong>-nolog</strong></code>
+ </dt>
+
+ <dd>
+ <p>disable mailing of error messages to document
+ owners.</p>
+ </dd>
+
+ <dt><code><strong>-nomargins</strong></code>
+ </dt>
+
+ <dd>
+ <p>disable left/right margins in the default style
+ sheet.</p>
+ </dd>
+
+ <dt><code><strong>-nomore</strong></code>
+ </dt>
+
+ <dd>
+ <p>disable -more- string in statusline messages.</p>
+ </dd>
+
+ <dt><code><strong>-nonrestarting_sigwinch</strong></code>
+ </dt>
+
+ <dd>
+ <p>make window size change handler non-restarting. This
+ flag is not available on all systems, Lynx needs to be
+ compiled with HAVE_SIGACTION defined. If available, this
+ flag <em>may</em> cause Lynx to react more immediately to
+ window changes when run within an xterm.</p>
+ </dd>
+
+ <dt><code><strong>-nopause</strong></code>
+ </dt>
+
+ <dd>
+ <p>disable forced pauses for statusline messages.</p>
+ </dd>
+
+ <dt><code><strong>-noprint</strong></code>
+ </dt>
+
+ <dd>
+ <p>disable most print functions.</p>
+ </dd>
+
+ <dt><code><strong>-noredir</strong></code>
+ </dt>
+
+ <dd>
+ <p>do not follow URL redirections</p>
+ </dd>
+
+ <dt><code><strong>-noreferer</strong></code>
+ </dt>
+
+ <dd>
+ <p>disable transmissions of Referer headers.</p>
+ </dd>
+
+ <dt><code><strong>-noreverse</strong></code>
+ </dt>
+
+ <dd>
+ <p>disable reverse video-attribute.</p>
+ </dd>
+
+ <dt><code><strong>-nosocks</strong></code>
+ </dt>
+
+ <dd>
+ <p>disable SOCKS proxy usage by a SOCKSified Lynx.</p>
+ </dd>
+
+ <dt><code><strong>-nostatus</strong></code>
+ </dt>
+
+ <dd>
+ <p>disable the retrieval status messages.</p>
+ </dd>
+
+ <dt><code><strong>-notitle</strong></code>
+ </dt>
+
+ <dd>
+ <p>disable title and blank line from top of page.</p>
+ </dd>
+
+ <dt><code><strong>-nounderline</strong></code>
+ </dt>
+
+ <dd>
+ <p>disable underline video-attribute.</p>
+ </dd>
+
+ <dt><code><strong>-number_fields</strong></code>
+ </dt>
+
+ <dd>
+ <p>force numbering of links as well as form input
+ fields.</p>
+ </dd>
+
+ <dt><code><strong>-number_links</strong></code>
+ </dt>
+
+ <dd>
+ <p>force numbering of links.</p>
+ </dd>
+
+ <dt><code><strong>-partial</strong></code>
+ </dt>
+
+ <dd>
+ <p>toggles displaying of partial pages while loading.</p>
+ </dd>
+
+ <dt>
+ <code><strong>-partial_thres=</strong><em>NUMBER</em></code>
+ </dt>
+
+ <dd>
+ <p>number of lines to render before repainting display
+ with partial-display logic.</p>
+ </dd>
+
+ <dt><code><strong>-pauth=</strong><em>ID:PW</em></code>
+ </dt>
+
+ <dd>
+ <p>set authorization <em>identifier</em> and
+ <em>password</em> for a protected proxy server at
+ startup. Be sure to protect any script files which use
+ this switch.</p>
+ </dd>
+
+ <dt><code><strong>-popup</strong></code>
+ </dt>
+
+ <dd>
+ <p>toggles handling of single-choice SELECT options via
+ popup windows or as lists of radio buttons. The default
+ configuration can be changed in userdefs.h or <a href=
+ "#lynx.cfg">lynx.cfg</a>. It also can be set and saved
+ via the &ldquo;o&rdquo;ptions menu. The command line
+ switch toggles the default.</p>
+ </dd>
+
+ <dt><code><strong>-post_data</strong></code>
+ </dt>
+
+ <dd>
+ <p>properly formatted data for a post form are read in
+ from stdin and passed to the form. Input is terminated by
+ a line that starts with &ldquo;---&rdquo;.</p>
+ </dd>
+
+ <dt><code><strong>-preparsed</strong></code>
+ </dt>
+
+ <dd>
+ <p>show source preparsed and reformatted when used with
+ -source or in source view (&ldquo;<samp>\</samp>&rdquo;).
+ May be useful for debugging of broken HTML markup to
+ visualize the difference between SortaSGML and TagSoup
+ <a href="keystrokes/option_help.html#tagsoup">recovery
+ modes</a>, switched by &ldquo;<samp>^V</samp>&rdquo;.</p>
+ </dd>
+
+ <dt><code><strong>-prettysrc</strong></code>
+ </dt>
+
+ <dd>
+ <p>do syntax highlighting and hyperlink handling in
+ source view.</p>
+ </dd>
+
+ <dt><code><strong>-print</strong></code>
+ </dt>
+
+ <dd>
+ <p>enable print functions. (default)</p>
+ </dd>
+
+ <dt><code><strong>-pseudo_inlines</strong></code>
+ </dt>
+
+ <dd>
+ <p>toggles pseudo-ALTs for inline images with no ALT
+ string.</p>
+ </dd>
+
+ <dt><code><strong>-raw</strong></code>
+ </dt>
+
+ <dd>
+ <p>toggles default setting of 8-bit character
+ translations or CJK mode for the startup character
+ set.</p>
+ </dd>
+
+ <dt><code><strong>-realm</strong></code>
+ </dt>
+
+ <dd>
+ <p>restricts access to URLs in the starting realm.</p>
+ </dd>
+
+ <dt><code><strong>-reload</strong></code>
+ </dt>
+
+ <dd>
+ <p>flushes the cache on a proxy server (only the first
+ document affected).</p>
+ </dd>
+
+ <dt><code><strong>-restrictions</strong></code>
+ </dt>
+
+ <dd>
+ <p>allows a list of services to be disabled selectively
+ and takes the following form:</p>
+ </dd>
+
+ <dd>
+ <p><em>lynx
+ -restrictions=[option][,option][,option]...</em>
+ </p>
+ </dd>
+
+ <dd>
+ <p>The list of recognized options is printed if none are
+ specified.</p>
+
+ <dl>
+ <dt><strong><samp>?</samp></strong>
+ </dt>
+
+ <dd>
+ <p>if used alone, lists restrictions in effect.</p>
+ </dd>
+
+ <dt><strong><samp>all</samp></strong>
+ </dt>
+
+ <dd>
+ <p>restricts all options listed below.</p>
+ </dd>
+
+ <dt><strong><samp>bookmark</samp></strong>
+ </dt>
+
+ <dd>
+ <p>disallow changing the location of the bookmark
+ file.</p>
+ </dd>
+
+ <dt><strong><samp>bookmark_exec</samp></strong>
+ </dt>
+
+ <dd>
+ <p>disallow execution links via the bookmark
+ file.</p>
+ </dd>
+
+ <dt><strong><samp>change_exec_perms</samp></strong>
+ </dt>
+
+ <dd>
+ <p>disallow changing the eXecute permission on files
+ (but still allow it for directories) when local file
+ management is enabled.</p>
+ </dd>
+
+ <dt><strong><samp>chdir</samp></strong>
+ </dt>
+
+ <dd>
+ <p>disallow command which changes Lynx's working
+ directory.</p>
+ </dd>
+
+ <dt><strong><samp>default</samp></strong>
+ </dt>
+
+ <dd>
+ <p>same as command line option <em>-anonymous</em>.
+ Set default restrictions for anonymous users. All
+ specific services listed are always restricted,
+ except for: inside_telnet, outside_telnet,
+ inside_ftp, outside_ftp, inside_rlogin,
+ outside_rlogin, inside_news, outside_news,
+ telnet_port, jump, mail, print, exec, and goto. The
+ settings for these, as well as additional goto
+ restrictions for specific URL schemes that are also
+ applied, are derived from definitions within
+ userdefs.h.</p>
+
+ <p>Note that this is the only option value that may
+ have the effect of <em>removing</em> some
+ restrictions, if they have been set by other options,
+ namely for those services that <em>are</em> allowed
+ by default according to userdefs.h. However, if the
+ separate command line option form
+ (<em>-anonymous</em>) is used, Lynx takes care to set
+ the default restrictions before handling additional
+ <em>-restrictions=</em> options (even if they precede
+ the <em>anonymous</em> option), so that this cannot
+ happen.</p>
+ </dd>
+
+ <dt><strong><samp>dired_support</samp></strong>
+ </dt>
+
+ <dd>
+ <p>disallow local file management.</p>
+ </dd>
+
+ <dt><strong><samp>disk_save</samp></strong>
+ </dt>
+
+ <dd>
+ <p>disallow saving to disk in the download and print
+ menus.</p>
+ </dd>
+
+ <dt><strong><samp>dotfiles</samp></strong>
+ </dt>
+
+ <dd>
+ <p>disallow access to, or creation of, hidden (dot)
+ files.</p>
+ </dd>
+
+ <dt><strong><samp>download</samp></strong>
+ </dt>
+
+ <dd>
+ <p>disallow some downloaders in the download menu.
+ This does <em>not</em> imply the disk_save
+ restriction. It also does not disable the DOWNLOAD
+ command, and does not prevent "Download or Cancel"
+ offers when a MIME type cannot otherwise be handled.
+ Those are only disabled if additionally the disk_save
+ restriction is in effect <em>and</em> no download
+ methods are defined in a <a href="#lynx.cfg">Lynx
+ configuration file</a> that are marked as "always
+ ENABLED" (or, alternatively, if the -validate switch
+ is used).</p>
+ </dd>
+
+ <dt><strong><samp>editor</samp></strong>
+ </dt>
+
+ <dd>
+ <p>disallow external editing.</p>
+ </dd>
+
+ <dt><strong><samp>exec</samp></strong>
+ </dt>
+
+ <dd>
+ <p>disable execution scripts.</p>
+ </dd>
+
+ <dt><strong><samp>exec_frozen</samp></strong>
+ </dt>
+
+ <dd>
+ <p>disallow the user from changing the local
+ execution option.</p>
+ </dd>
+
+ <dt><strong><samp>externals</samp></strong>
+ </dt>
+
+ <dd>
+ <p>disallow some "EXTERNAL" configuration lines, if
+ support for passing URLs to external applications
+ (with the EXTERN_LINK or EXTERN_PAGE command) is
+ compiled in.</p>
+ </dd>
+
+ <dt><strong><samp>file_url</samp></strong>
+ </dt>
+
+ <dd>
+ <p>disallow using G)oto, served links or bookmarks
+ for file: URLs.</p>
+ </dd>
+
+ <dt><strong><samp>goto</samp></strong>
+ </dt>
+
+ <dd>
+ <p>disable the &ldquo;<samp>g</samp>&rdquo; (goto)
+ command.</p>
+ </dd>
+
+ <dt><strong><samp>inside_ftp</samp></strong>
+ </dt>
+
+ <dd>
+ <p>disallow ftps for people coming from inside your
+ domain.</p>
+ </dd>
+
+ <dt><strong><samp>inside_news</samp></strong>
+ </dt>
+
+ <dd>
+ <p>disallow USENET news reading and posting for
+ people coming from inside you domain. This applies to
+ "news", "nntp", "newspost", and "newsreply" URLs, but
+ not to "snews", "snewspost", or "snewsreply" in case
+ they are supported.</p>
+ </dd>
+
+ <dt><strong><samp>inside_rlogin</samp></strong>
+ </dt>
+
+ <dd>
+ <p>disallow rlogins for people coming from inside
+ your domain.</p>
+ </dd>
+
+ <dt><strong><samp>inside_telnet</samp></strong>
+ </dt>
+
+ <dd>
+ <p>disallow telnets for people coming from inside
+ your domain.</p>
+ </dd>
+
+ <dt><strong><samp>jump</samp></strong>
+ </dt>
+
+ <dd>
+ <p>disable the &ldquo;<samp>j</samp>&rdquo; (jump)
+ command.</p>
+ </dd>
+
+ <dt><strong><samp>lynxcgi</samp></strong>
+ </dt>
+
+ <dd>
+ <p>disallow execution of Lynx CGI URLs.</p>
+ </dd>
+
+ <dt><strong><samp>mail</samp></strong>
+ </dt>
+
+ <dd>
+ <p>disallow mailing feature.</p>
+ </dd>
+
+ <dt><strong><samp>multibook</samp></strong>
+ </dt>
+
+ <dd>
+ <p>disallow multiple bookmarks.</p>
+ </dd>
+
+ <dt><strong><samp>news_post</samp></strong>
+ </dt>
+
+ <dd>
+ <p>disallow USENET News posting,</p>
+ </dd>
+
+ <dt><strong><samp>options_save</samp></strong>
+ </dt>
+
+ <dd>
+ <p>disallow saving options in .lynxrc.</p>
+ </dd>
+
+ <dt><strong><samp>outside_ftp</samp></strong>
+ </dt>
+
+ <dd>
+ <p>disallow ftps for people coming from outside your
+ domain.</p>
+ </dd>
+
+ <dt><strong><samp>outside_news</samp></strong>
+ </dt>
+
+ <dd>
+ <p>disallow USENET news reading and posting for
+ people coming from outside you domain. This applies
+ to "news", "nntp", "newspost", and "newsreply" URLs,
+ but not to "snews", "snewspost", or "snewsreply" in
+ case they are supported.</p>
+ </dd>
+
+ <dt><strong><samp>outside_rlogin</samp></strong>
+ </dt>
+
+ <dd>
+ <p>disallow rlogins for people coming from outside
+ your domain.</p>
+ </dd>
+
+ <dt><strong><samp>outside_telnet</samp></strong>
+ </dt>
+
+ <dd>
+ <p>disallow telnets for people coming from outside
+ your domain.</p>
+ </dd>
+
+ <dt><strong><samp>print</samp></strong>
+ </dt>
+
+ <dd>
+ <p>disallow most print options.</p>
+ </dd>
+
+ <dt><strong><samp>shell</samp></strong>
+ </dt>
+
+ <dd>
+ <p>disallow shell escapes.</p>
+ </dd>
+
+ <dt><strong><samp>suspend</samp></strong>
+ </dt>
+
+ <dd>
+ <p>disallow <em>Control-Z</em> suspends with escape
+ to shell on Unix.</p>
+ </dd>
+
+ <dt><strong><samp>telnet_port</samp></strong>
+ </dt>
+
+ <dd>
+ <p>disallow specifying a port in telnet G)oto's.</p>
+ </dd>
+
+ <dt><strong><samp>useragent</samp></strong>
+ </dt>
+
+ <dd>
+ <p>disallow modifications of the User-Agent
+ header.</p>
+ </dd>
+ </dl>
+ </dd>
+
+ <dt><code><strong>-resubmit_posts</strong></code>
+ </dt>
+
+ <dd>
+ <p>toggles forced resubmissions (no-cache) of forms with
+ method POST when the documents they returned are sought
+ with the PREV_DOC (<em>left-arrow</em>) command or from
+ the <em>History Page</em>.</p>
+ </dd>
+
+ <dt><code><strong>-rlogin</strong></code>
+ </dt>
+
+ <dd>
+ <p>disable recognition of rlogin commands.</p>
+ </dd>
+
+ <dt><code><strong>-scrollbar</strong></code>
+ </dt>
+
+ <dd>
+ <p>toggles showing scrollbar.</p>
+ </dd>
+
+ <dt><code><strong>-scrollbar_arrow</strong></code>
+ </dt>
+
+ <dd>
+ <p>toggles showing arrows at ends of the scrollbar.</p>
+ </dd>
+
+ <dt><code><strong>-selective</strong></code>
+ </dt>
+
+ <dd>
+ <p>require .www_browsable files to browse
+ directories.</p>
+ </dd>
+
+ <dt>
+ <code><strong>-session=</strong><em>FILENAME</em></code>
+ </dt>
+
+ <dd>
+ <p>resumes from specified file on startup and saves
+ session to that file on exit.</p>
+ </dd>
+
+ <dt>
+ <code><strong>-sessionin=</strong><em>FILENAME</em></code>
+ </dt>
+
+ <dd>
+ <p>resumes session from specified file.</p>
+ </dd>
+
+ <dt>
+ <code><strong>-sessionout=</strong><em>FILENAME</em></code>
+ </dt>
+
+ <dd>
+ <p>saves session to specified file.</p>
+ </dd>
+
+ <dt><code><strong>-short_url</strong></code>
+ </dt>
+
+ <dd>
+ <p>show very long URLs in the status line with "..." to
+ represent the portion which cannot be displayed. The
+ beginning and end of the URL are displayed, rather than
+ suppressing the end.</p>
+ </dd>
+
+ <dt><code><strong>-show_cursor</strong></code>
+ </dt>
+
+ <dd>
+ <p>If enabled the cursor will not be hidden in the right
+ hand corner but will instead be positioned at the start
+ of the currently selected link. Show cursor is the
+ default for systems without FANCY_CURSES capabilities.
+ The default configuration can be changed in userdefs.h or
+ <a href="#lynx.cfg">lynx.cfg</a>. It also can be set and
+ saved via the &ldquo;o&rdquo;ptions menu. The command
+ line switch toggles the default.</p>
+ </dd>
+
+ <dt><code><strong>-show_rate</strong></code>
+ </dt>
+
+ <dd>
+ <p>If enabled the transfer rate is shown in bytes/second.
+ If disabled, no transfer rate is shown. Use lynx.cfg or
+ the options menu to select KiB/second and/or ETA.</p>
+ </dd>
+
+ <dt><code><strong>-soft_dquotes</strong></code>
+ </dt>
+
+ <dd>
+ <p>toggles emulation of the old Netscape and Mosaic bug
+ which treated &ldquo;<samp>&gt;</samp>&rdquo; as a
+ co-terminator for double-quotes and tags.</p>
+ </dd>
+
+ <dt><code><strong>-source</strong></code>
+ </dt>
+
+ <dd>
+ <p>works the same as dump but outputs HTML source instead
+ of formatted text. For example</p>
+
+ <blockquote>
+ <pre>
+lynx -source . &gt;foo.html
+</pre>
+ </blockquote>
+
+ <p>generates HTML source listing the files in the current
+ directory. Each file is marked by an HREF relative to the
+ parent directory. Add a trailing slash to make the HREF's
+ relative to the current directory:</p>
+
+ <blockquote>
+ <pre>
+lynx -source ./ &gt;foo.html
+</pre>
+ </blockquote>
+ </dd>
+
+ <dt><code><strong>-stack_dump</strong></code>
+ </dt>
+
+ <dd>
+ <p>disable SIGINT cleanup handler.</p>
+ </dd>
+
+ <dt><code><strong>-startfile_ok</strong></code>
+ </dt>
+
+ <dd>
+ <p>allow non-http startfile and homepage with
+ <em>-validate</em>.</p>
+ </dd>
+
+ <dt><code><strong>-stderr</strong></code>
+ </dt>
+
+ <dd>
+ <p>When dumping a document using
+ <code><strong>-dump</strong></code> or
+ <code><strong>-source</strong></code>, Lynx normally does
+ not display alert (error) messages that you see on the
+ screen in the status line. Use the
+ <code><strong>-stderr</strong></code> option to tell Lynx
+ to write these messages to the standard error.</p>
+ </dd>
+
+ <dt><code><strong>-stdin</strong></code>
+ </dt>
+
+ <dd>
+ <p>read the startfile from standard input (UNIX
+ only).</p>
+ </dd>
+
+ <dt><code><strong>-syslog=</strong><em>text</em></code>
+ </dt>
+
+ <dd>
+ <p>information for syslog call.</p>
+ </dd>
+
+ <dt><code><strong>-syslog-urls</strong></code>
+ </dt>
+
+ <dd>
+ <p>log requested URLs with syslog.</p>
+ </dd>
+
+ <dt><code><strong>-tagsoup</strong></code>
+ </dt>
+
+ <dd>
+ <p>initialize DTD with "TagSoup" tables, <a href=
+ "keystrokes/option_help.html#tagsoup">more
+ details</a>.</p>
+ </dd>
+
+ <dt><code><strong>-telnet</strong></code>
+ </dt>
+
+ <dd>
+ <p>disable recognition of telnet commands.</p>
+ </dd>
+
+ <dt><code><strong>-term=</strong><em>TERM</em></code>
+ </dt>
+
+ <dd>
+ <p>tell Lynx what terminal type to assume it is talking
+ to. (This may be useful for remote execution, when, for
+ example, Lynx connects to a remote TCP/IP port that
+ starts a script that, in turn, starts another Lynx
+ process.)</p>
+ </dd>
+
+ <dt><code><strong>-timeout=</strong><em>N</em></code>
+ </dt>
+
+ <dd>
+ <p>For win32, sets the network read-timeout, where
+ <em>N</em> is given in seconds.</p>
+ </dd>
+
+ <dt><code><strong>-tlog</strong></code>
+ </dt>
+
+ <dd>
+ <p>toggles use of a <em>Lynx Trace Log</em> for the
+ session. The log is named <em>Lynx.trace</em> and is
+ created in the home directory when Lynx trace mode is
+ turned on via the <em>-trace</em> command line switch
+ (see below), or via the TRACE_TOGGLE (<em>Control-T</em>)
+ keystroke command. Once a log is started for the session,
+ all trace and other stderr messages are written to the
+ log. The contents of the log can be examined during the
+ session via the TRACE_LOG (normally,
+ &ldquo;<samp>;</samp>&rdquo;) keystroke command. If use
+ of a Lynx Trace Log is turned off, any trace output will
+ go to the standard error stream.</p>
+ </dd>
+
+ <dt><code><strong>-tna</strong></code>
+ </dt>
+
+ <dd>
+ <p>turns on <a href="#tna">"Textfields Need
+ Activation"</a> mode.</p>
+ </dd>
+
+ <dt><code><strong>-trace</strong></code>
+ </dt>
+
+ <dd>
+ <p>turns on Lynx trace mode. If a Lynx Trace Log
+ (<em>Lynx.trace</em> in the home directory) has been
+ started for the current session, all trace messages are
+ written to that log, and can be examined during the
+ session via the TRACE_LOG (normally,
+ &ldquo;<samp>;</samp>&rdquo;) command. If no Trace Log
+ file is in use, trace messages go to stderr.</p>
+ </dd>
+
+ <dt>
+ <code><strong>-trace_mask=</strong><em>value</em></code>
+ </dt>
+
+ <dd>
+ <p>turn on optional traces, which may result in very
+ large trace files. Logically OR the values to combine
+ options:</p>
+
+ <dl>
+ <dt>1</dt>
+
+ <dd>
+ <p>SGML character parsing states</p>
+ </dd>
+
+ <dt>2</dt>
+
+ <dd>
+ <p>color-style</p>
+ </dd>
+
+ <dt>4</dt>
+
+ <dd>
+ <p>TRST (table layout)</p>
+ </dd>
+
+ <dt>8</dt>
+
+ <dd>
+ <p>config (lynx.cfg and .lynxrc contents)</p>
+ </dd>
+
+ <dt>16</dt>
+
+ <dd>
+ <p>binary string copy/append, used in form data
+ construction.</p>
+ </dd>
+ </dl>
+ </dd>
+
+ <dt><code><strong>-traversal</strong></code>
+ </dt>
+
+ <dd>
+ <p>traverse all http links derived from startfile. When
+ used with <em>-crawl</em>, each link that begins with the
+ same string as startfile is output to a file, intended
+ for indexing. See CRAWL.announce for more
+ information.</p>
+ </dd>
+
+ <dt><code><strong>-trim_input_fields</strong></code>
+ </dt>
+
+ <dd>
+ <p>trim input text/textarea fields in forms.</p>
+ </dd>
+
+ <dt><code><strong>-underscore</strong></code>
+ </dt>
+
+ <dd>
+ <p>toggles use of _underline_ format in dumps.</p>
+ </dd>
+
+ <dt><code><strong>-update_term_title</strong></code>
+ </dt>
+
+ <dd>
+ <p>enables updating the title in terminal emulators. Use
+ only if your terminal emulator supports that escape code.
+ Has no effect when used with -notitle.</p>
+ </dd>
+
+ <dt><code><strong>-use_mouse</strong></code>
+ </dt>
+
+ <dd>
+ <p>turn on mouse support, if available.</p>
+ </dd>
+
+ <dt>
+ <code><strong>-useragent=</strong><em>STRING</em></code>
+ </dt>
+
+ <dd>
+ <p>set different Lynx User-Agent header. Lynx produces a
+ warning on startup if the <em>STRING</em> does not
+ contain "Lynx" or "L_y_n_x", see the <a href=
+ "#noteUA">note</a> in the Options Menu section for
+ rationale.</p>
+ </dd>
+
+ <dt><code><strong>-validate</strong></code>
+ </dt>
+
+ <dd>
+ <p>accept only http URLs (meant for validation).</p>
+ </dd>
+
+ <dd>
+ <p>This flag implies security restrictions generally more
+ severe than <em>-anonymous</em>: restriction options as
+ for <em>-restrictions=all</em>, with the notable
+ exception that goto remains enabled for http and https
+ URLs; in addition, the PRINT and DOWNLOAD commands are
+ completely disabled, and use of a Trace Log file is
+ forced off.</p>
+ </dd>
+
+ <dd>
+ <p>Any relaxing of restriction that might be implied by
+ an also present (or implied) <em>-anonymous</em> flag is
+ overridden, the only way to possibly relax <em>some</em>
+ of the restrictions to the level applicable for
+ "anonymous" accounts is with an explicit
+ <em>-restrictions=default</em>.</p>
+ </dd>
+
+ <dt><code><strong>-verbose</strong></code>
+ </dt>
+
+ <dd>
+ <p>toggles [LINK], [IMAGE] and [INLINE] comments with
+ filenames of these images.</p>
+ </dd>
+
+ <dt><code><strong>-version</strong></code>
+ </dt>
+
+ <dd>
+ <p>print version information.</p>
+ </dd>
+
+ <dt><code><strong>-vikeys</strong></code>
+ </dt>
+
+ <dd>
+ <p>enable vi-like key movement.</p>
+ </dd>
+
+ <dt><code><strong>-wdebug</strong></code>
+ </dt>
+
+ <dd>
+ <p>enable Waterloo tcp/ip packet debug (print to watt
+ debugfile). This applies only to DOS versions compiled
+ with WATTCP or WATT-32.</p>
+ </dd>
+
+ <dt><code><strong>-width=</strong><em>NUMBER</em></code>
+ </dt>
+
+ <dd>
+ <p>number of columns for formatting of dumps, default is
+ 80.</p>
+ </dd>
+
+ <dt><code><strong>-with_backspaces</strong></code>
+ </dt>
+
+ <dd>
+ <p>emit backspaces in output if -dumping or -crawling
+ (like <code>man</code> does).</p>
+ </dd>
+ </dl>
+ </dd>
+ </dl>
+
+ <p>No options are required, nor is a startfile argument required.
+ White space can be used in place of equal sign separators
+ (&ldquo;<samp>=</samp>&rdquo;) appearing in the option list
+ above. It can not be used in place of the equal signs in forms
+ like "-option=on" and "-option=off" for simple switches and
+ toggles, for which "-option" alone (without a value) is
+ valid.</p>
+
+ <p>[<a href="#ToC-Invoking">ToC</a>]</p>
+
+ <h2 id="Environments"><a name="Environment" id=
+ "Environment"><em>Environment variables used by Lynx</em></a></h2>
+
+ <p>Lynx uses certain environment variables and sets a few of
+ them. Please visit a <a href=
+ "keystrokes/environments.html">separate page</a> for this rather
+ technical information.</p>
+
+ <p>[<a href="#ToC-Environment">ToC</a>]</p>
+
+ <h2 id="id-lynx.cfg"><a name="lynx.cfg" id="lynx.cfg">Main
+ configuration file lynx.cfg</a></h2>
+
+ <p>Lynx has several levels of customization: from the Options
+ Menu (accessible on-line, and possibly stored in your local
+ .lynxrc file), via command-line switches on startup (mainly for
+ batch processing). The most important and numerous default
+ settings are stored in the Lynx configuration file
+ <em>lynx.cfg</em>.</p>
+
+ <p>If you are on a UNIX system you should have appropriate
+ permissions to make changes there or ask your system
+ administrator to modify lynx.cfg for your needs. This file
+ provides default settings for all accounts on your system. It may
+ be copied to your shell account and included with -cfg command
+ line switch or via an environment variable LYNX_CFG (if you have
+ shell access). Starting with version 2.8.1 Lynx has an include
+ facility so you can load the system-wide configuration file and
+ easily add one or more settings from your local add-on
+ configuration file. It is really cool to read lynx.cfg with its
+ comments for hundreds of options, most of them commented out
+ because they are built-in defaults. You may visit an index of
+ options: <a href=
+ "https://lynx.invisible-island.net/release/lynx_help/cattoc.html">
+ by category</a> or <a href=
+ "https://lynx.invisible-island.net/release/lynx_help/alphatoc.html">
+ by alphabet</a>.</p>
+
+ <p>To view your current configuration derived from lynx.cfg and
+ any included configuration files, press <em>&ldquo;g&rdquo;</em>
+ and type in &ldquo;<samp>lynxcfg:</samp>&rdquo;. If you are using
+ the forms-based <em>Options Menu</em>, you may press
+ <em>&ldquo;o&rdquo;</em> for the Options Menu and follow the
+ <em>Check your lynx.cfg</em>'s link near the bottom.</p>
+
+ <p>However, for those who have a restricted account many Lynx
+ features may be disabled by the system administrator, you
+ probably will not see your lynx.cfg.</p>
+
+ <p>[<a href="#ToC-lynx.cfg">ToC</a>]</p>
+
+ <h2 id="id-Hist"><a name="Hist" id="Hist">Lynx development
+ history</a></h2>
+
+ <p>Lynx grew out of efforts to build a campus-wide information
+ system at The University of Kansas. The earliest versions of Lynx
+ provided a user-friendly, distributed hypertext interface for
+ users connected to multiuser (Unix and VMS) systems via
+ curses-oriented display devices. A custom hypertext format was
+ developed to support hypertext links to local files and files on
+ remote Gopher servers. Using Gopher servers for distributed file
+ service allowed information providers to publish information from
+ a wide variety of platforms (including Unix, VMS, VM/CMS and
+ Macintosh). In addition, Lynx became the most user-friendly
+ Gopher client, although that was only an ancillary
+ capability.</p>
+
+ <p>This distributed approach let providers retain complete
+ control over their information, but it made communication between
+ users and providers somewhat more difficult. Following the lead
+ of Neal Erdwien, of Kansas State University, the Lynx hypertext
+ format was extended to include links for including ownership
+ information with each file. This information made it possible for
+ users running Lynx clients to send comments and suggestions via
+ e-mail to the providers.</p>
+
+ <p>This early version of Lynx was also augmented to support
+ hypertext links to programs running on remote systems. It
+ included the ability to open a Telnet connection, as well as the
+ ability to start programs via rexec, inetd, or by direct socket
+ connects. These capabilities were included to allow users to
+ access databases or custom program interfaces.</p>
+
+ <p>A subsequent version of Lynx incorporated the World Wide Web
+ libraries to allow access to the full list of WWW servers, along
+ with the option to build hypertext documents in HTML, rather than
+ the native Lynx format. HTML has become far more widely used, and
+ the native format has been phased out. With the addition of the
+ WWW libraries, Lynx became a fully-featured WWW client, limited
+ only by the display capabilities offered in the curses
+ environment.</p>
+
+ <p>Lynx was designed by Lou Montulli, Charles Rezac and Michael
+ Grobe of Academic Computing Services at The University of Kansas.
+ Lynx was implemented by Lou Montulli and maintained by Garrett
+ Arch Blythe and Craig Lavender.</p>
+
+ <p><em>Foteos Macrides</em> and members of the <a href=
+ "lynx-dev.html">lynx-dev</a> list have developed and supported
+ Lynx since release of v2.3 in May 1994.<br>
+ The Lynx2-3FM code set was released as v2.4 in June 1995.<br>
+ The Lynx2-4FM code set was released as v2.5 in May 1996.<br>
+ The Lynx2-5FM code set was released as v2.6 in September
+ 1996.<br>
+ The Lynx2-6FM code set was released as v2.7 in February 1997.<br>
+ The v2-7FM code set was released as v2.7.1 in April 1997.<br>
+ The v2-7-1FM code set was released as v2.7.2 in January 1998.<br>
+ The 2.7.1 development set was released as v2.8 in March 1998.<br>
+ The 2.8 development set was released as v2.8.1 in October
+ 1998.<br>
+ The 2.8.1 development set was released as v2.8.2 in June
+ 1999.<br>
+ The 2.8.2 development set was released as v2.8.3 in April
+ 2000.<br>
+ The 2.8.3 development set was released as v2.8.4 in July
+ 2001.<br>
+ The 2.8.4 development set was released as v2.8.5 in February
+ 2004.<br>
+ The 2.8.5 development set was released as v2.8.6 in October
+ 2006.<br>
+ The 2.8.6 development set was released as v2.8.7 in July
+ 2009.<br>
+ The 2.8.7 development set was released as v2.8.8 in February
+ 2014.<br>
+ The 2.8.8 development set was released as v2.8.9 in July
+ 2018.<br></p>
+
+ <p>Since early 1997, the Lynx code has expanded into
+ autoconfigure and PC versions. The branching of the Lynx source
+ base from a single source into two sources (FM/Foteos Macrides
+ and ac/autoconfigure) should be considered a healthy synergism
+ among groups of computer professionals acting in their spare time
+ out of a common goal.</p>
+
+ <p>Lynx has incorporated code from a variety of sources along the
+ way. The earliest versions of Lynx included code from Earl Fogel
+ of Computing Services at the University of Saskatchewan, who
+ implemented HYPERREZ in the Unix environment. Those versions also
+ incorporated libraries from the Unix Gopher clients developed at
+ the University of Minnesota, and the later versions of Lynx rely
+ on the WWW client library code developed by Tim Berners-Lee (and
+ others) and the WWW community.</p>
+
+ <p>Contributors have generally been acknowledged in the CHANGES
+ file. Earlier CHANGES file can be found in the docs/ subdirectory
+ of this distribution.</p>
+
+ <p>Information on obtaining the most current version of Lynx is
+ available at <a href=
+ "https://lynx.invisible-island.net/current/index.html">the
+ current distribution page</a>.</p>
+
+ <p>[<a href="#Contents">ToC</a>]</p>
+</body>
+</html>
diff --git a/lynx_help/about_lynx.html b/lynx_help/about_lynx.html
new file mode 100644
index 0000000..f4a875b
--- /dev/null
+++ b/lynx_help/about_lynx.html
@@ -0,0 +1,113 @@
+<!-- $LynxId: about_lynx.html,v 1.24 2021/07/01 21:02:17 tom Exp $ -->
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+ <meta name="generator" content=
+ "HTML Tidy for HTML5 for Linux version 5.6.0">
+ <title>About Lynx &ndash; Who, What, and When &ndash; Where it is
+ now</title>
+ <link rev="made" href="mailto:lynx-dev@nongnu.org">
+ <meta http-equiv="Content-Type" content=
+ "text/html; charset=us-ascii">
+ <meta name="description" content=
+ "Give a little history of Lynx, by whom and where it was originally developed, and add some of its current contact information.">
+</head>
+<body>
+ <blockquote>
+ <p>[ <a href="lynx-dev.html">About Lynx-Dev</a> | <a href=
+ "http://mail.gnu.org/mailman/listinfo/lynx-dev/">Lynx-Dev
+ Archives</a> ]</p>
+ </blockquote>
+
+ <h2>About Lynx</h2>
+
+ <p><strong>Lynx</strong> is a fully-featured <em>World Wide
+ Web</em> (<em>WWW</em>) browser for users on Unix, VMS, and other
+ platforms running cursor-addressable, character-cell terminals or
+ emulators. That includes vt100 terminals, other character-cell
+ displays, and vt100 emulators such as Kermit or Procomm running
+ on PCs or Macs.</p>
+
+ <p>For information on how to use <strong>Lynx</strong> see the
+ <a href="Lynx_users_guide.html">Lynx User's Guide</a>, or the
+ <a href="lynx_help_main.html">Lynx help files</a>.</p>
+
+ <h2>Credits and Copyright</h2>
+
+ <p><strong>Lynx</strong> was a product of the Distributed
+ Computing Group within Academic Computing Services of <a href=
+ "http://web.archive.org/web/19971210163627/http://www.cc.ukans.edu/">
+ The University of Kansas</a>.</p>
+
+ <p><strong>Lynx</strong> was originally developed by <a href=
+ "http://web.archive.org/web/20040309105337/http://www.cc.ukans.edu/cwis/people/Lou.Montulli.html">
+ Lou Montulli</a>, <a href=
+ "http://condor.cc.ku.edu/~grobe/">Michael Grobe</a>, and <a href=
+ "http://web.archive.org/web/20040412210202/http://www.cc.ukans.edu/cwis/people/Charles.Rezac.html">
+ Charles Rezac</a>. <a href=
+ "http://web.archive.org/web/20040412210651/http://www.cc.ukans.edu/cwis/people/Garrett/Garrett_Arch_Blythe.html">
+ Garrett Blythe</a> created <a href=
+ "http://web.archive.org/web/20040812204015/http://www.cc.ukans.edu/about_doslynx/doslynx.html">
+ DosLynx</a> and later joined the <strong>Lynx</strong> effort as
+ well. Following the departures of Lou and Garrett for positions
+ at Netscape in the summer of 1994, <em>Craig Lavender</em>
+ provided support services for <strong>Lynx</strong>, and
+ <em>Ravikumar Kolli</em> for DosLynx.</p>
+
+ <p><strong>Lynx</strong> is maintained and supported by members
+ of the Internet community coordinated via the <a href=
+ "#lynx-dev_list"><em>lynx-dev mailing list</em></a>.</p>
+
+ <p><strong>Lynx</strong> is derived from material copyrighted by
+ the University of Kansas. However most of the release (and
+ corresponding copyright) is the work of developers on the
+ <a href="#lynx-dev_list"><em>lynx-dev mailing list</em></a>. It
+ is distributed <a href="COPYHEADER">without restrictions on usage
+ or redistribution</a> under the <a href="COPYING">GNU General
+ Public License (Version 2)</a>.</p>
+
+ <p><strong>Lynx</strong> was built over an early version of the
+ Common Code Library developed by the CERN WWW Project. That code
+ is copyrighted by CERN. <strong>Lynx</strong> contains other
+ sections of code that are copyrighted by other institutions or
+ individuals. The <strong>Lynx</strong> copyright does not
+ override or invalidate those copyrights.</p>
+
+ <p>Thanks to <a name="note13" href=
+ "http://www.w3.org/People/Berners-Lee/" id="note13">Tim
+ Berners-Lee</a> and the other <a name="note14" href=
+ "http://www.w3.org/People.html" id="note14">CERN World Wide Web
+ wizards</a> for the WWW client library code and all of their
+ other work on the WWW project, NCSA and the <a href=
+ "http://archive.ncsa.uiuc.edu/SDG/Software/Mosaic/NCSAMosaicHome.html">
+ Mosaic</a> developers, and to everyone out in netland who has
+ contributed to <strong>Lynx</strong>'s development either
+ directly (through comments or bug reports) or indirectly (through
+ inspiration and development of other systems).</p>
+
+ <p>Also, special thanks go to <em>Foteos Macrides</em> who ported
+ much of <strong>Lynx</strong> to VMS and did much of its
+ development following Lou Montulli's and Garrett Blythe's
+ departures from the University of Kansas, and to <em>Earl
+ Fogel</em> of the University of Saskatchewan. Earl implemented
+ the hypertext engine HYPERREZ in the Unix environment. HYPERREZ
+ was developed by Niel Larson of Think.com and served as the model
+ for the early versions of <strong>Lynx</strong> which did not use
+ the WWW libraries and had their own hypertext format.</p>
+
+ <h2><a name="availability" id="availability">Availability</a></h2>
+
+ <p>Information on obtaining the most current version of
+ <strong>Lynx</strong> is available via the <a href=
+ "https://lynx.invisible-island.net">Lynx homepage</a>.</p>
+
+ <h2><a name="lynx-dev_list" id="lynx-dev_list">Mailing List</a></h2>
+
+ <p>We have a mailing list for <strong>Lynx</strong> development
+ discussion. If you are interested in joining the list, follow
+ this <a href="lynx-dev.html">link</a>. There also are links to
+ <a href=
+ "http://mail.gnu.org/mailman/listinfo/lynx-dev/">archives</a> in
+ html format for this mailing list.</p>
+</body>
+</html>
diff --git a/lynx_help/help_files.txt b/lynx_help/help_files.txt
new file mode 100644
index 0000000..326ddbd
--- /dev/null
+++ b/lynx_help/help_files.txt
@@ -0,0 +1,38 @@
+# $LynxId: help_files.txt,v 1.12 2012/01/31 10:52:22 tom Exp $
+#
+# Format:
+# KEYWORD=<filename>.html
+# No space is allowed.
+#
+# Usage:
+# ... href="@KEYWORD@">whatever keyword says</a>
+# ... href="@KEYWORD@#section>...</a>
+# ... href="../@KEYWORD#section>...</a>
+#
+# Help files which are used in Lynx's help directory.
+# Each filename has to end with '.html' otherwise install-help will fail.
+#
+ABOUT_LYNX=about_lynx.html
+ALT_EDIT_HELP=alt_edit_help.html
+BASHLIKE_EDIT_HELP=bashlike_edit_help.html
+BOOKMARK_HELP=bookmark_help.html
+COOKIE_HELP=cookie_help.html
+DIRED_HELP=dired_help.html
+EDIT_HELP=edit_help.html
+ENVIRONMENTS=environments.html
+FOLLOW_HELP=follow_help.html
+GOPHER_TYPES_HELP=gopher_types_help.html
+HISTORY_HELP=history_help.html
+KEYSTROKE_HELP=keystroke_help.html
+LYNX_HELP_MAIN=lynx_help_main.html
+LYNX_URL_SUPPORT=lynx_url_support.html
+LYNX_USERS_GUIDE=Lynx_users_guide.html
+MOVEMENT_HELP=movement_help.html
+OPTION_HELP=option_help.html
+OTHER_HELP=other_help.html
+PRINT_HELP=print_help.html
+SCROLLING_HELP=scrolling_help.html
+TEST_DISPLAY=test_display.html
+VISITED_HELP=visited_help.html
+XTERM_HELP=xterm_help.html
+LYNX_DEV=lynx-dev.html
diff --git a/lynx_help/keystrokes/alt_edit_help.html b/lynx_help/keystrokes/alt_edit_help.html
new file mode 100644
index 0000000..63f1044
--- /dev/null
+++ b/lynx_help/keystrokes/alt_edit_help.html
@@ -0,0 +1,128 @@
+<!-- $LynxId: alt_edit_help.html,v 1.21 2021/07/01 21:02:38 tom Exp $ -->
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+ <meta name="generator" content=
+ "HTML Tidy for HTML5 for Linux version 5.6.0">
+ <title>Lynx Line Editor Alternative Key Binding</title>
+ <link rev="made" href="mailto:lynx-dev@nongnu.org">
+ <link rel="Sibling" title="Default Binding" href=
+ "edit_help.html">
+ <link rel="Sibling" title="Bash-Like Binding" href=
+ "bashlike_edit_help.html">
+ <meta http-equiv="Content-Type" content=
+ "text/html; charset=us-ascii">
+ <meta name="description" content=
+ "Describes an alternative set of line editor bindings for Lynx. This is one of the alternate bindings normally compiled-in">
+</head>
+<body>
+ <div class="nav">
+ <ul>
+ <li><a href="#overview">Overview</a></li>
+
+ <li><a href="#alternate_bindings">Table of key-bindings</a></li>
+
+ <li><a href="#notes">Notes</a></li>
+ </ul>
+ </div>
+
+ <h2><a name="overview" id="overview">Overview</a></h2>
+
+ <p><strong>Lynx</strong> invokes a built-in <a href=
+ "edit_help.html">Line Editor</a> for entering strings in response
+ to prompts, in forms, and for email messages if an external
+ editor has not been defined. Additional alternative key-bindings
+ can be offered by configuring with
+ <code>--enable-alt-bindings</code> or by adding them in
+ LYEditmap.c before compiling <strong>Lynx</strong>. If available,
+ they may be selected via the &ldquo;o&rdquo;ptions menu, or by
+ editing lineedit_mode in the &ldquo;.lynxrc&rdquo; file.</p>
+
+ <p><strong><em>Note:</em></strong> setting emacs/vi keys ON has
+ no direct effect on line-editor bindings.</p>
+
+ <h2><a name="alternate_bindings" id="alternate_bindings">Table of
+ key-bindings</a></h2>
+
+ <p>This is the <em>Alternative Binding</em> keymap.</p>
+
+ <pre>
+ ENTER Input complete - RETURN
+ TAB Input complete - TAB, Do
+ ABORT Input cancelled - Ctrl-G, Ctrl-O, (Ctrl-C on some systems)
+ ERASE Erase the line - Ctrl-U
+
+ BACK Cursor back char - Left-Arrow, Ctrl-B
+ FORW Cursor forward char - Right-Arrow, Ctrl-F
+ BACKW Cursor back word - Ctrl-P
+ FORWW Cursor forward word - Ctrl-N
+ BOL Go to begin of line - Ctrl-A, Home, Find
+ EOL Go to end of line - Ctrl-E, End, Select
+
+ DELP Delete prev char - Backspace, Delete, Remove
+ DELN Delete next char - Ctrl-D (<em><a href=
+"#note_1">see note 1</a></em>)
+ DELPW Delete prev word - Ctrl-R
+ DELNW Delete next word - Ctrl-T
+ DELEL Delete to end of line - Ctrl-K
+
+ UPPER Upper case the line - Ctrl-^
+ LOWER Lower case the line - Ctrl-_
+
+ LKCMD Invoke cmd prompt - Ctrl-V (in form text fields, only) (<em><a href="#note_2">see note 2</a></em>)
+
+<a name="TASpecial" id=
+"TASpecial">Special commands for use only in textarea fields</a> (<em><a href="#note_3">see note 3</a></em>):
+
+ Textarea external edit - Ctrl-X e
+ Insert file in textarea - Ctrl-X i
+ Grow textarea - Ctrl-X g
+</pre>
+ <h2><a name="emacs_bindings" id="emacs_bindings">Emacs-like
+ commands</a></h2>
+
+ <pre>
+ TPOS Transpose characters - Ctrl-t
+ SETMARK Set mark at current position in line - Ctrl-@
+ XPMARK Exchange current position with mark - Ctrl-x Ctrl-x
+ KILLREG Kill region between mark and position - Ctrl-x Ctrl-w (<em><a href="#note_3">see note 3</a></em>)
+ YANK Insert text last killed (with KILLREG) - Ctrl-y
+</pre>
+ <h2><a name="examples" id="examples">Try it yourself</a></h2>
+
+ <p>Here is a little textarea for practice:</p>
+
+ <form action="">
+ <p>
+ <textarea name="practice" cols="40" rows=
+ "5">This text cannot be submitted. Normally lines like
+these would be part of a form that is filled out and
+then submitted. You can move around here and delete
+or add text as you like, using the Line-Editor keys.
+</textarea><input type="reset" value="[reset content]">
+ </p>
+ </form>
+
+ <h2><a name="special_keys" id="special_keys">Special keys</a></h2>
+
+ <p>See the <em><a href="edit_help.html#special_keys">Lynx Line
+ Editor</a></em> page for an explanation of terminology and
+ key-names.</p>
+
+ <h2><a name="notes" id="notes">Notes</a></h2>
+
+ <ol>
+ <li id="note_1">"next" means the character "under" a box or
+ underline style cursor; it means "to the immediate right of" an
+ I-beam (between characters) type cursor.</li>
+
+ <li id="note_2">Follow Ctrl-V with any recognized key command,
+ to "escape" from a text input field.</li>
+
+ <li id="note_3">For other key combinations using Ctrl-X as a
+ prefix key, see the Help page for the <a rel="Sibling" title=
+ "Bash-Like Binding" href=
+ "bashlike_edit_help.html">Bash-Like</a> Binding.</li>
+ </ol>
+</body>
+</html>
diff --git a/lynx_help/keystrokes/bashlike_edit_help.html b/lynx_help/keystrokes/bashlike_edit_help.html
new file mode 100644
index 0000000..621e3e0
--- /dev/null
+++ b/lynx_help/keystrokes/bashlike_edit_help.html
@@ -0,0 +1,277 @@
+<!-- $LynxId: bashlike_edit_help.html,v 1.22 2021/07/01 21:02:38 tom Exp $ -->
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+ <meta name="generator" content=
+ "HTML Tidy for HTML5 for Linux version 5.6.0">
+ <title>Lynx Line Editor Bash-Like Key Binding</title>
+ <link rev="made" href="mailto:lynx-dev@nongnu.org">
+ <link rel="Sibling" title="Default Binding" href=
+ "edit_help.html">
+ <link rel="Sibling" title="Alternative Binding" href=
+ "alt_edit_help.html">
+ <meta http-equiv="Content-Type" content=
+ "text/html; charset=us-ascii">
+ <meta name="description" content=
+ "Describes the bash-like line editor bindings for Lynx. This is one of the alternate bindings normally compiled-in">
+</head>
+<body>
+ <div class="nav">
+ <ul>
+ <li><a href="#overview">Overview</a></li>
+
+ <li><a href="#bash_bindings">Bash-like bindings</a></li>
+
+ <li><a href="#examples">Try it yourself</a></li>
+
+ <li><a href="#emacs_bindings">Emacs-like commands</a></li>
+
+ <li><a href="#special_keys">Comments on special keys</a></li>
+
+ <li><a href="#notes">Notes</a></li>
+
+ <li><a href="#miscellaneous">Additional details</a></li>
+ </ul>
+ </div>
+
+ <h2><a name="overview" id="overview">Overview</a></h2>
+
+ <p><strong>Lynx</strong> invokes a built-in <a href=
+ "edit_help.html">Line Editor</a> for entering strings in response
+ to prompts, in forms, and for email messages if an external
+ editor has not been defined. Alternative key bindings are
+ normally available (unless <strong>Lynx</strong> was configured
+ with <code>--disable-alt-bindings</code>). If available, they may
+ be selected via the &ldquo;o&rdquo;ptions menu, or by editing
+ lineedit_mode in the &ldquo;.lynxrc&rdquo; file.</p>
+
+ <p>You can always see the current set of key-bindings in
+ <strong>Lynx</strong> by opening the special URL <a href=
+ "LYNXEDITMAP:">LYNXEDITMAP:</a>. This page is provided for those
+ not using Lynx.</p>
+
+ <p><strong><em>Note:</em></strong> setting emacs/vi keys ON has
+ no direct effect on line-editor bindings.</p>
+
+ <h2><a name="bash_bindings" id="bash_bindings">Bash-like
+ bindings</a></h2>
+
+ <p>This is the <em>Bash-like Binding</em> keymap.</p>
+
+ <pre>
+ ENTER Input complete - Enter, RETURN
+ TAB Completion / Next - TAB, Do (<em><a href=
+"#note_2">see note 2</a></em>)
+ ABORT Cancel / Undo Change - Ctrl-g, Ctrl-_
+ ERASE Erase the line - M-k, Ctrl-x k
+
+ BACK Cursor back char - Left-Arrow, Ctrl-b
+ FORW Cursor forward char - Right-Arrow, Ctrl-f
+ BACKW Cursor back word - M-b, Ctrl-r
+ FORWW Cursor forward word - M-f, Ctrl-s (<em><a href=
+"#note_5">see note 5</a></em>)
+ BOL Go to begin of line - Ctrl-a, Home, Find
+ EOL Go to end of line - Ctrl-e, End, Select (<em><a href="#note_4">see note 4</a></em>)
+
+ DELP Delete prev char - Backspace
+ DELN Delete next char - Ctrl-d, Delete, Remove (<em><a href="#note_1">see note 1</a></em>)
+ DELPW Delete prev word - Ctrl-w, M-Backspace, M-Delete (<em><a href="#note_3">see note 3</a></em>)
+ DELNW Delete next word - M-d
+ DELBL Delete to beg of line - Ctrl-u
+ DELEL Delete to end of line - Ctrl-k (<em><a href=
+"#note_4">see note 4</a></em>)
+
+ UPPER Upper case the line - M-u
+ LOWER Lower case the line - M-l
+
+ LKCMD Invoke cmd prompt - Ctrl-v [FORM] (<em><a href=
+"#note_6">see note 6</a></em>)
+ SWMAP Switch input keymap - Ctrl-^ (if compiled in)
+
+<a name="TASpecial" id=
+"TASpecial">Special commands for use in textarea fields</a> [FORM]:
+
+ PASS! Textarea external edit - Ctrl-e Ctrl-e, Ctrl-x e (<em><a href="#note_4">see note 4</a></em>)
+ PASS! Insert file in textarea - Ctrl-x i
+ PASS! Grow textarea - Ctrl-x g
+</pre>
+ <h2><a name="examples" id="examples">Try it yourself</a></h2>
+
+ <p>Here is a little textarea for practice:</p>
+
+ <form action="">
+ <p>
+ <textarea name="practice" cols="40" rows=
+ "5">This text cannot be submitted. Normally lines like
+these would be part of a form that is filled out and
+then submitted. You can move around here and delete
+or add text as you like, using the Line-Editor keys.
+</textarea><input type="reset" value="[reset content]">
+ </p>
+ </form>
+
+ <h2><a name="emacs_bindings" id="emacs_bindings">Emacs-like
+ commands</a></h2>
+
+ <pre>
+ TPOS Transpose characters - Ctrl-t
+ SETMARK Set mark at current position in line - Ctrl-@
+ XPMARK Exchange current position with mark - Ctrl-x Ctrl-x
+ KILLREG Kill region between mark and position - Ctrl-x Ctrl-w (<em><a href="#note_3">see note 3</a></em>)
+ YANK Insert text last killed (with KILLREG) - Ctrl-y
+</pre>
+ <h2><a name="special_keys" id="special_keys">Special keys</a></h2>
+
+ <p>See the <em><a href="edit_help.html#special_keys">Lynx Line
+ Editor</a></em> page for an explanation of terminology and
+ key-names.</p>
+
+ <h2><a name="notes" id="notes">Notes</a></h2>
+
+ <ol>
+ <li id="note_1">"next" means the character "under" a box or
+ underline style cursor; it means "to the immediate right of" an
+ I-beam (between characters) type cursor.</li>
+
+ <li id="note_2">For entering strings in response to prompts
+ (that is, when not editing form text fields), some keys have
+ different actions: TAB tries to complete input based on
+ previous response; Up-Arrow and Down-Arrow may offer previous
+ response and next response, respectively, from recall buffer
+ for some prompts.</li>
+
+ <li id="note_3">Ctrl-w can only be used for editing functions
+ if its default KEYMAP to REFRESH is changed. This can be done
+ in the lynx.cfg file, for example with the line
+ "KEYMAP:^W:DO_NOTHING". This also applies for other keys: as
+ long as the key's action is mapped to REFRESH, either with an
+ explicit KEYMAP in lynx.cfg or by default, the key's Line
+ Editor binding is disabled.</li>
+
+ <li id="note_4">These keys invoke special behavior when pressed
+ twice in a row: Ctrl-e Ctrl-e calls the external editor for
+ changing the text in a textarea (if available). Ctrl-k Ctrl-k
+ will move to the next link, so that all lines in a textarea can
+ be conveniently cleared by repeating Ctrl-k.</li>
+
+ <li id="note_5">Key is likely unavailable for
+ <strong>Lynx</strong>, because it is interpreted by operating
+ system, comm program, or curses library, or swallowed as part
+ of escape sequence recognition. Binding is provided for the
+ benefit of those where this does not apply.</li>
+
+ <li id="note_6">where <strong>[FORM]</strong> is marked,
+ indicates that the binding is effective only in form text
+ fields. It is ignored by Line Editor elsewhere.</li>
+ </ol>
+
+ <p>When a text input field, including a textarea line, is
+ selected, the Line Editor functions get a first grab at the keys
+ entered. If a key has no function defined in the Line Editor
+ binding, it can either be ignored, or passed on for normal key
+ command handling, where modifiers like Ctrl-x or Meta currently
+ have no effect (see the <a href="LYNXKEYMAP:">Key Map Page</a>
+ accessible with the key <kbd>K</kbd> for current
+ information).</p>
+
+ <h2><a name="miscellaneous" id="miscellaneous">Additional
+ details</a></h2>
+
+ <p>Here are some additional details on other keys, for the
+ curious (very much subject to change)</p>
+
+ <pre>
+Normal key action when used in form fields, subject to remapping
+with KEYMAP: [FORM (except Up-Arrow, Down-Arrow)]
+ Ctrl-l (<em><a href="#note_3">see note 3</a></em>)
+ Ctrl-o, Ctrl-z, Ctrl-\, Ctrl-] (<em><a href=
+"#note_5">see note 5</a></em>)
+ Ctrl-n [emacskey], Ctrl-p [emacskey]
+ Up-Arrow, Down-Arrow (<em><a href=
+"#note_2">see note 2</a></em>)
+ Page-Up, Page-Down, F1, Back-Tab
+
+Normal key command with Meta modifier ignored when used in form fields,
+subject to remapping with KEYMAP: [FORM (except Up-Arrow, Down-Arrow)]
+ M-Ctrl-l (<em><a href=
+"#note_3">see note 3</a></em>) M-Ctrl-o <a href="#no_meta">[!]</a>,
+ M-Ctrl-z, M-Ctrl-\, M-Ctrl-] (<em><a href=
+"#note_5">see note 5</a></em>)
+ M-Ctrl-u, M-/, M-n
+ M-Up-Arrow <a href=
+"#no_meta">[!]</a>, M-Down-Arrow <a href=
+"#no_meta">[!]</a> (<em><a href="#note_2">see note 2</a></em>)
+ M-Page-Up <a href=
+"#no_meta">[!]</a>, M-Page-Down <a href=
+"#no_meta">[!]</a>, M-Home, M-End
+
+Passed as specific command:
+ lynx action duplicates by default
+ ----------- ---------------------
+ M-Ctrl-d NEXT_LINK Down-Arrow
+ M-Ctrl-e EDITTEXTAREA Ctrl-e Ctrl-e
+ M-Ctrl-k LPOS_NEXT_LINK (none, Down-Arrow suggested)
+ M-e EDITTEXTAREA Ctrl-e Ctrl-e
+ M-g GROWTEXTAREA (none, Ctrl-v $ suggested?)
+ M-i INSERTFILE (none, Ctrl-v # suggested?)
+ M-&lt; HOME M-Home
+ M-&gt; END M-End
+ M-F1 DWIMHELP F1
+ M-Find WHEREIS Ctrl-v /
+ M-Select NEXT Ctrl-v n
+
+Duplicates function of other key(s):
+ edit action duplicates
+ ----------- ----------
+ M-Ctrl-b BACKW M-b, Ctrl-r
+ M-Ctrl-f FORWW M-f
+ M-Ctrl-n FORWW M-f
+ M-Ctrl-p BACKW M-b, Ctrl-r
+ M-Ctrl-r BACKW M-b, Ctrl-r
+ M-a BOL Ctrl-a, Home, ...
+
+Modifier ignored, and duplicates function of other key(s):
+ edit action duplicates
+ ----------- ----------
+ M-Ctrl-a BOL Ctrl-a, Home, ...
+ M-Ctrl-g ABORT Ctrl-g, ...
+ M-TAB TAB Ctrl-i <a href=
+"#no_meta">[!]</a>
+ M-Ctrl-j ENTER Ctrl-m, Ctrl-j, Enter / RETURN
+ M-RETURN ENTER Ctrl-m, Ctrl-j, Enter / RETURN
+ M-Ctrl-y YANK Ctrl-y <a href=
+"#no_meta">[!]</a>
+ M-Ctrl-^ SWMAP Ctrl-^ <a href=
+"#no_meta">[!]</a> (if compiled in)
+ M-Right-Arrow FORW Right-Arrow <a href=
+"#no_meta">[!]</a>, Ctrl-f
+ M-Left-Arrow BACK Left-Arrow <a href=
+"#no_meta">[!]</a>, Ctrl-b
+ M-Do TAB Ctrl-i <a href=
+"#no_meta">[!]</a>
+
+Key completely ignored:
+ Ctrl-q, Insert
+ M-Ctrl-q, M-Ctrl-s, M-Ctrl-t, M-Ctrl-v, M-ESC (<em><a href="#note_5">see note 5</a></em>)
+ M-Ctrl-@, M-Ctrl-_, M-Remove, M-Insert <a href=
+"#no_meta">[!]</a>
+
+Meta + other (mostly, printable character) keys:
+ Modifier ignored, or sequence swallowed (<em><a href=
+"#note_5">see note 5</a></em>).
+ M-@, M-E...M-Z, M-\, M-^, M-_ attempt to interpret
+ as 7-bit escape representation for character in 8-bit
+ control (C1) range if appropriate according to
+ Display Character Set.
+
+[emacskey] Normal key action subject to emacs_keys setting.
+
+<a name="no_meta" id=
+"no_meta">[!]</a> Action of key with Meta modifier follows action of key without
+ Meta. If you manage to enter the Meta key while Line-Editor
+ Binding is not set to Bash-Like, and the unmodified binding
+ is different from that listed here, M-&lt;<var>key</var>&gt; will act
+ like &lt;<var>key</var>&gt;.
+</pre>
+</body>
+</html>
diff --git a/lynx_help/keystrokes/bookmark_help.html b/lynx_help/keystrokes/bookmark_help.html
new file mode 100644
index 0000000..87d8591
--- /dev/null
+++ b/lynx_help/keystrokes/bookmark_help.html
@@ -0,0 +1,58 @@
+<!-- $LynxId: bookmark_help.html,v 1.11 2021/07/01 21:02:38 tom Exp $ -->
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+ <meta name="generator" content=
+ "HTML Tidy for HTML5 for Linux version 5.6.0">
+ <title>Lynx Bookmark Help Summary</title>
+ <link rev="made" href="mailto:lynx-dev@nongnu.org">
+ <meta http-equiv="Content-Type" content=
+ "text/html; charset=us-ascii">
+ <meta name="description" content=
+ "Lynx stores Bookmark files on your local machine. You can update these from within Lynx, or with a text editor">
+</head>
+<body>
+ <div class="nav">
+ <ul>
+ <li><a href="#overview">Bookmark files</a></li>
+
+ <li><a href="#internal_edit">Updating within Lynx</a></li>
+
+ <li><a href="#external_edit">Updating with a text editor</a></li>
+ </ul>
+ </div>
+
+ <h2><a name="overview" id="overview">Bookmark files</a></h2>
+
+ <p><strong>Lynx</strong> stores <em>Bookmark files</em> on your
+ local machine. You can update these from within
+ <strong>Lynx</strong>, or with a text editor:</p>
+
+ <h2><a name="internal_edit" id="internal_edit">Updating within
+ Lynx</a></h2>
+
+ <ul>
+ <li>The append feature, invoked by pressing an
+ &ldquo;<em>a</em>&rdquo; while viewing a document will add the
+ current document or the currently highlighted link to your
+ default <em>Bookmark file</em>, or to one you select if
+ multiple bookmarks are enabled.</li>
+
+ <li>The remove feature, invoked by pressing an
+ &ldquo;<em>r</em>&rdquo; when a <em>Bookmark file</em> is being
+ displayed, will remove the currently highlighted link.</li>
+
+ <li>You may set and modify the paths and names of your
+ <em>Bookmark files</em> and enable or disable multiple
+ bookmarks in the <a href="option_help.html">Options
+ Menu</a>.</li>
+ </ul>
+
+ <h2><a name="external_edit" id="external_edit">Updating with a
+ text editor</a></h2>
+
+ <p>Lynx stores its bookmarks as an HTML file, using an unordered
+ list (<em>UL</em> and <em>LI</em> tags). It expects the list
+ items to be one per line, without wrapping.</p>
+</body>
+</html>
diff --git a/lynx_help/keystrokes/cookie_help.html b/lynx_help/keystrokes/cookie_help.html
new file mode 100644
index 0000000..80e01d6
--- /dev/null
+++ b/lynx_help/keystrokes/cookie_help.html
@@ -0,0 +1,76 @@
+<!-- $LynxId: cookie_help.html,v 1.12 2021/07/01 21:02:38 tom Exp $ -->
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+ <meta name="generator" content=
+ "HTML Tidy for HTML5 for Linux version 5.6.0">
+ <title>Help on the Cookie Jar Page</title>
+ <link rev="made" href="mailto:lynx-dev@nongnu.org">
+ <meta http-equiv="Content-Type" content=
+ "text/html; charset=us-ascii">
+ <meta name="description" content=
+ "Lynx provides a page show shows information about all of the unexpired cookies, including their fully qualified domain name, expiration time and name/value pairs.">
+</head>
+<body>
+ <div class="nav">
+ <ul>
+ <li><a href="#overview">Overview</a></li>
+
+ <li><a href="#showing_cookies">Cookie Details Shown</a></li>
+
+ <li><a href="#removing_cookies">Removing Cookies</a></li>
+ </ul>
+ </div>
+
+ <h2><a name="overview" id="overview">Overview</a></h2>
+
+ <p><strong>Lynx</strong>'s <em>Cookie Jar Page</em> displays all
+ of the unexpired cookies you have accumulated in the hypothetical
+ <em>Cookie Jar</em>. The cookies are obtained via
+ <em>Set-Cookie</em> MIME headers in replies from http servers,
+ and are used for <a href="../Lynx_users_guide.html#Cookies">State
+ Management</a> across successive requests to the servers.</p>
+
+ <p>The cookies are listed by <em>domain</em> (server's Fully
+ Qualified Domain Name, or site-identifying portion of the FQDN),
+ and in order of decreasing specificity (number of slash-separated
+ symbolic elements in the <em>path</em> attribute of the cookie).
+ When <strong>Lynx</strong> sends requests to an http server whose
+ address tail-matches a <em>domain</em> in the <em>Cookie
+ Jar</em>, all its cookies with a <em>path</em> which head-matches
+ the path in the URL for that request are included as a
+ <em>Cookie</em> MIME header. The &ldquo;allow&rdquo; setting for
+ accepting cookies from each domain (always, never, or via prompt)
+ also is indicated in the listing.</p>
+
+ <h2><a name="showing_cookies" id="showing_cookies">Cookie Details
+ Shown</a></h2>
+
+ <p>The listing also shows the <em>port</em> (normally 80) of the
+ URL for the request which caused the cookie to be sent, and
+ whether the <em>secure</em> flag is set for the cookie, in which
+ case it will be sent only via secure connections (presently, only
+ SSL). The <em>Maximum Gobble Date</em>, i.e., when the cookie is
+ intended to expire, also is indicated. Also, a server may change
+ the expiration date, or cause the cookie to be deleted, in its
+ replies to subsequent requests from <strong>Lynx</strong>. If the
+ server included any explanatory comments in its
+ <em>Set-Cookie</em> MIME headers, those also are displayed in the
+ listing.</p>
+
+ <h2><a name="removing_cookies" id="removing_cookies">Removing
+ Cookies</a></h2>
+
+ <p>The <em>domain</em>=value pairs, and each cookie's name=value,
+ are links in the listing. Activating a <em>domain</em>=value link
+ will invoke a prompt asking whether all cookies in that
+ <em>domain</em> should be <em>Gobbled</em> (deleted from the
+ <em>Cookie Jar</em>), and/or whether the <em>domain</em> entry
+ should be <em>Gobbled</em> if all of its cookies have been
+ <em>Gobbled</em>, or whether to change the &ldquo;allow&rdquo;
+ setting for that <em>domain</em>. Activating a cookie's
+ name=value link will cause that particular cookie to be
+ <em>Gobbled</em>. You will be prompted for confirmations of
+ deletions, to avoid any accidental <em>Gobbling</em>.</p>
+</body>
+</html>
diff --git a/lynx_help/keystrokes/dired_help.html b/lynx_help/keystrokes/dired_help.html
new file mode 100644
index 0000000..f3e7e05
--- /dev/null
+++ b/lynx_help/keystrokes/dired_help.html
@@ -0,0 +1,90 @@
+<!-- $LynxId: dired_help.html,v 1.12 2021/07/01 21:02:38 tom Exp $ -->
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+ <meta name="generator" content=
+ "HTML Tidy for HTML5 for Linux version 5.6.0">
+ <title>Lynx Dired-mode Key Bindings</title>
+ <link rev="made" href="mailto:lynx-dev@nongnu.org">
+ <meta http-equiv="Content-Type" content=
+ "text/html; charset=us-ascii">
+ <meta name="description" content=
+ "Lynx's dired-mode allows you to browse for file-URLs. This describes the key-bindings for dired-mode.">
+</head>
+<body>
+ <div class="nav">
+ <ul>
+ <li><a href="#overview">Overview</a></li>
+
+ <li><a href="#dired_bindings">Dired Key bindings</a></li>
+
+ <li><a href="#other_bindings">Other Key bindings</a></li>
+
+ <li><a href="#notes">Notes</a></li>
+ </ul>
+ </div>
+
+ <h2><a name="overview" id="overview">Overview</a></h2>
+
+ <p><strong>Lynx</strong> changes into <em>Dired mode</em> when
+ you use a URL of the type <em>file://localhost/path/</em>.</p>
+
+ <h2><a name="dired_bindings" id="dired_bindings">Dired Key
+ bindings</a></h2>
+
+ <p>While in Dired mode, some keys are remapped to do the
+ following functions:</p>
+
+ <blockquote>
+ <pre>
+
+ C)reate - Create a new, empty file in the current
+ directory. You will be prompted to enter
+ a name for the file.
+
+ F)ull menu - Show a full menu of commands for currently
+ selected file or directory.
+
+ M)odify - Modify the name or location of selection. If
+ multiple files have been selected, you will
+ only be able to change the location. Choose
+ between changing the name or location and then
+ enter a new filename or path.
+
+ R)emove - Delete currently selected files.
+
+ T)ag - Tag the highlighted file. Multiple files may
+ be tagged and all other commands except "Create"
+ will be performed on tagged files instead of the
+ one highlighted. Press &ldquo;<em>t</em>&rdquo; again to untag
+ a file.
+
+ U)pload - Upload a file to the current directory using
+ one of the options listed in the upload screen.
+</pre>
+ </blockquote>
+
+ <h2><a name="other_bindings" id="other_bindings">Other Key
+ bindings</a></h2>
+
+ <p>Some other keys useful in <em>Dired mode</em>:</p>
+
+ <blockquote>
+ <pre>
+ D)ownload - Download selection using options listed in
+ the download options screen.
+
+ E)dit - Spawn the editor defined in the <a href=
+"option_help.html">Options Menu</a>
+ and load selection for editing.
+</pre>
+ </blockquote>
+
+ <h2><a name="notes" id="notes">Notes</a></h2>
+
+ <p><em>Dired mode</em> must be activated at compile time.
+ Otherwise, the above commands will not be available and
+ <strong>Lynx</strong> will treat a directory listing as an HTML
+ file.</p>
+</body>
+</html>
diff --git a/lynx_help/keystrokes/edit_help.html b/lynx_help/keystrokes/edit_help.html
new file mode 100644
index 0000000..42d3e8a
--- /dev/null
+++ b/lynx_help/keystrokes/edit_help.html
@@ -0,0 +1,191 @@
+<!-- $LynxId: edit_help.html,v 1.30 2021/07/01 21:02:38 tom Exp $ -->
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+ <meta name="generator" content=
+ "HTML Tidy for HTML5 for Linux version 5.6.0">
+ <title>Lynx Line Editor Default Key Binding</title>
+ <link rev="made" href="mailto:lynx-dev@nongnu.org">
+ <meta http-equiv="Content-Type" content=
+ "text/html; charset=us-ascii">
+ <meta name="description" content=
+ "Describes Lynx's built-in line-editor, when it is used, and the keys used for the default binding. There are alternate and special bindings.">
+</head>
+<body>
+ <div class="nav">
+ <ul>
+ <li><a href="#overview">Overview</a></li>
+
+ <li><a href="#regular_keymap">Regular Keymap</a></li>
+
+ <li><a href="#editing_keymap">Editing Keymap</a></li>
+
+ <li><a href="#examples">Try it yourself</a></li>
+
+ <li><a href="#notes">Notes</a></li>
+ </ul>
+ </div>
+
+ <h2><a name="overview" id="overview">Overview</a></h2>
+
+ <p><strong>Lynx</strong> invokes a built-in <em>Line Editor</em>
+ for entering strings in response to prompts, in forms, and for
+ email messages if an external editor has not been defined.
+ Alternative key bindings are normally available (unless
+ <strong>Lynx</strong> was configured with
+ <code>--disable-alt-bindings</code>). If available, they may be
+ selected via the &ldquo;o&rdquo;ptions menu, or by editing
+ lineedit_mode in the &ldquo;.lynxrc&rdquo; file.</p>
+
+ <p>Two such alternative key bindings, which may be available on
+ your system, are the</p>
+
+ <ul>
+ <li><a href="alt_edit_help.html">Alternative Binding</a> keymap
+ and the</li>
+
+ <li><a href="bashlike_edit_help.html">Bash-like Binding</a>
+ keymap.</li>
+ </ul>
+
+ <p>You can always see the current set of key-bindings in
+ <strong>Lynx</strong> by opening the special URL <a href=
+ "LYNXEDITMAP:">LYNXEDITMAP:</a>. This page is provided for those
+ not using Lynx.</p>
+
+ <p><strong><em>Note:</em></strong> setting emacs/vi keys ON has
+ no effect on line-editor bindings.</p>
+
+ <h2><a name="regular_keymap" id="regular_keymap">Regular
+ Keymap</a></h2>
+
+ <p>This is the <em>Default Binding</em> keymap:</p>
+
+ <pre>
+ ENTER Input complete - RETURN
+ TAB Input complete - TAB, Do
+ ABORT Input cancelled - Ctrl-G, Ctrl-O, (Ctrl-C on some systems)
+ ERASE Erase the line - Ctrl-U
+
+ BACK Cursor back char - Left-Arrow
+ FORW Cursor forward char - Right-Arrow
+ BACKW Cursor back word - Ctrl-P
+ FORWW Cursor forward word - Ctrl-N
+ BOL Go to begin of line - Ctrl-A, Home, Find
+ EOL Go to end of line - Ctrl-E, End, Select
+
+ DELP Delete prev char - Backspace, Delete, Remove
+ DELN Delete next char - Ctrl-D, Ctrl-R (<em><a href=
+"#note_1">see note 1</a></em>)
+ DELPW Delete prev word - Ctrl-B
+ DELNW Delete next word - Ctrl-F
+ DELEL Delete to end of line - Ctrl-_
+
+ UPPER Upper case the line - Ctrl-T
+ LOWER Lower case the line - Ctrl-K
+
+ LKCMD Invoke cmd prompt - Ctrl-V (in form text fields, only) (<em><a href="#note_2">see note 2</a></em>)
+ SWMAP Switch input keymap - Ctrl-^ (if compiled in)
+</pre>
+ <h2><a name="editing_keymap" id="editing_keymap">Editing
+ Keymap</a></h2>
+
+ <p><a name="TASpecial" id="TASpecial">These are special commands
+ for use only in textarea fields</a> (<em><a href="#note_3">see
+ note 3</a></em>):</p>
+
+ <pre>
+ Textarea external edit - Ctrl-X e
+ Insert file in textarea - Ctrl-X i
+ Grow textarea - Ctrl-X g
+</pre>
+ <h2><a name="emacs_bindings" id="emacs_bindings">Emacs-like
+ commands</a></h2>
+
+ <pre>
+ TPOS Transpose characters - Ctrl-t
+ SETMARK Set mark at current position in line - Ctrl-@
+ XPMARK Exchange current position with mark - Ctrl-x Ctrl-x
+ KILLREG Kill region between mark and position - Ctrl-x Ctrl-w (<em><a href="#note_3">see note 3</a></em>)
+ YANK Insert text last killed (with KILLREG) - Ctrl-y
+</pre>
+ <h2><a name="examples" id="examples">Try it yourself</a></h2>
+
+ <p>Here is a little textarea for practice:</p>
+
+ <form action="">
+ <p>
+ <textarea name="practice" cols="40" rows=
+ "5">This text cannot be submitted. Normally lines like
+these would be part of a form that is filled out and
+then submitted. You can move around here and delete
+or add text as you like, using the Line-Editor keys.
+</textarea><input type="reset" value="[reset content]">
+ </p>
+ </form>
+
+ <h2><a name="special_keys" id="special_keys">Special keys</a></h2>
+
+ <p><samp><dfn>Ctrl-</dfn><strong>key</strong> means
+ Control+<strong><kbd>key</kbd></strong>.
+ <dfn><code>Ctrl-x</code></dfn> <strong>key</strong> means first
+ Control+<kbd>x</kbd>, then <strong><kbd>key</kbd></strong>.
+ <dfn>M-</dfn>key means Meta+<strong><kbd>key</kbd></strong>,
+ where Meta is a modifier that can be entered in a variety of
+ ways:</samp>
+ </p>
+
+ <ul>
+ <li>First ESC, then the <strong><kbd>key</kbd></strong>. This
+ does not work with all systems or on all connections, and if it
+ does may not work for some keys (because the ESC character is
+ also part of code sequences for "normal" function keys).</li>
+
+ <li>Alt+<strong><kbd>key</kbd></strong>. This works if the
+ terminal, console, or comm program is set up to interpret Alt
+ as a modifier to send ESC. The Linux console acts like that by
+ default for most keys; Kermit can be set up to do it, xterm can
+ be for some keys, and so on. But the same caveats as for the
+ previous item apply. This Alt mapping may also be possible,
+ independent of the ESC character, for some keys in
+ <strong>Lynx</strong> for DOS/i386 or for Win32.</li>
+
+ <li>Ctrl-x <strong><kbd>key</kbd></strong>. Actually, currently
+ the same internal table is used for Meta and the Ctrl-x prefix.
+ Therefore all M-<strong><kbd>key</kbd></strong> combinations
+ can also be typed as Ctrl-x <strong><kbd>key</kbd></strong>,
+ and vice versa.</li>
+ </ul>
+
+ <p>A few key names may be less familiar now than when
+ <strong>Lynx</strong> was first written: <em>Find</em>,
+ <em>Select</em> and <em>Remove</em>. The <a href=
+ "https://invisible-island.net/xterm/xterm.faq.html#xterm_keypad">XTerm
+ FAQ</a> shows some typical keypad layouts of emulators for VT220
+ and other DEC terminals.</p>
+
+ <p>The VT220 did not have a &ldquo;backspace&rdquo; key but
+ <strong>Lynx</strong>'s default bindings mention it. Both ASCII
+ <samp>BS</samp> (backspace) and <samp>DEL</samp> are bound by
+ default to the same functions. <samp>DEL</samp> (occasionally
+ referred to as <samp>RUBOUT</samp>) is not the same as
+ <samp>Delete</samp>: the former is a single character while the
+ latter is usually a sequence of characters.</p>
+
+ <h2><a name="notes" id="notes">Notes</a></h2>
+
+ <ol>
+ <li id="note_1">"next" means the character "under" a box or
+ underline style cursor; it means "to the immediate right of" an
+ I-beam (between characters) type cursor.</li>
+
+ <li id="note_2">Follow Ctrl-V with any recognized key command,
+ to "escape" from a text input field.</li>
+
+ <li id="note_3">For other key combinations using Ctrl-X as a
+ prefix key, see the Help page for the <a rel="Sibling" title=
+ "Bash-Like Binding" href=
+ "bashlike_edit_help.html">Bash-Like</a> Binding.</li>
+ </ol>
+</body>
+</html>
diff --git a/lynx_help/keystrokes/environments.html b/lynx_help/keystrokes/environments.html
new file mode 100644
index 0000000..1d7245a
--- /dev/null
+++ b/lynx_help/keystrokes/environments.html
@@ -0,0 +1,558 @@
+<!-- $LynxId: environments.html,v 1.22 2021/07/01 21:02:38 tom Exp $ -->
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+ <meta name="generator" content=
+ "HTML Tidy for HTML5 for Linux version 5.6.0">
+ <title>Help on Lynx's Environment variables</title>
+ <link rev="made" href="mailto:lynx-dev@nongnu.org">
+ <meta http-equiv="Content-Type" content=
+ "text/html; charset=us-ascii">
+ <meta name="description" content=
+ "Describes environment variables used by Lynx. Some are specific to Lynx, others are common with similar programs.">
+</head>
+<body>
+ <div class="nav">
+ <ul>
+ <li><a href="#overview">Environment Variables</a></li>
+
+ <li><a href="#env">Variables Used By Lynx</a></li>
+
+ <li><a href="#setenv">Variables Set or Modified By Lynx</a></li>
+
+ <li><a href="#cgi">Simulated CGI Support</a></li>
+
+ <li><a href="#language">Native Language Support</a></li>
+
+ <li><a href="#proxy">Proxy details and examples</a></li>
+
+ <li><a href="#dos">Win32 (95/NT) and 386 DOS</a></li>
+ </ul>
+ </div>
+
+ <h2><a name="overview" id="overview">Environment Variables</a></h2>
+
+ <pre>
+ In addition to various &ldquo;standard&rdquo; environment variables
+ such as HOME, PATH, USER, DISPLAY, TMPDIR, etc, <strong>Lynx</strong> utilizes
+ several <strong>Lynx</strong>-specific environment variables, <a href="#env">if they exist</a>.
+
+ Others may be created or modified by <strong>Lynx</strong> to pass data to
+ an external program, or for other reasons. These are
+ listed separately <a href="#setenv">below</a>.
+
+ See also the sections on <a href=
+"#cgi">Simulated CGI Support</a> and
+ <a href="#language">Native Language Support</a>, below.
+
+ Note: Not all environment variables apply to all types of
+ platforms supported by <strong>Lynx</strong>, though most do. Feedback on
+ platform dependencies is solicited. See also <a href=
+"#dos">win32/dos</a> specific
+ variables.
+</pre>
+ <h2><a name="env" id="env">Variables Used By Lynx</a></h2>
+
+ <pre>
+ COLORTERM
+ If set, color capability for the terminal
+ is forced on at startup time. The actual
+ value assigned to the variable is ignored.
+ This variable is only meaningful if <strong>Lynx</strong>
+ was built using the slang screen-handling
+ library.
+
+ LYNX_CFG
+ This variable, if set, will override
+ the default location and name of the
+ global configuration file (normally,
+ lynx.cfg) that was defined by the
+ LYNX_CFG_FILE constant in the
+ userdefs.h file, during installation.
+ See the userdefs.h file for more
+ information.
+
+ LYNX_HELPFILE
+ If set, this variable overrides the
+ compiled-in URL and configuration file
+ URL for the <strong>Lynx</strong> help file.
+
+ LYNX_LOCALEDIR
+ If set, this variable overrides the
+ compiled-in location of the locale
+ directory which contains native lan-
+ guage (NLS) message text.
+
+ LYNX_LSS
+ This variable, if set, specifies the
+ location of the default <strong>Lynx</strong> character
+ style sheet file. [Currently only
+ meaningful if <strong>Lynx</strong> was built using
+ experimental color style support.]
+
+ LYNX_SAVE_SPACE
+ This variable, if set, will override
+ the default path prefix for files
+ saved to disk that is defined in the
+ lynx.cfg SAVE_SPACE: statement. See
+ the lynx.cfg file for more information.
+
+ LYNX_TEMP_SPACE
+ This variable, if set, will override
+ the default path prefix for temporary
+ files that was defined during installation,
+ as well as any value that may
+ be assigned to the TMPDIR variable.
+
+ LYNX_TRACE
+ If set, causes <strong>Lynx</strong> to write a trace
+ file as if the -trace option were sup-
+ plied.
+
+ LYNX_TRACE_FILE
+ If set, overrides the compiled-in name
+ of the trace file, which is either
+ Lynx.trace or LY-TRACE.LOG (the latter
+ on the DOS platform). The trace file
+ is in either case relative to the home
+ directory.
+
+ MAIL
+ This variable specifies the default
+ inbox <strong>Lynx</strong> will check for new mail, if
+ such checking is enabled in the
+ lynx.cfg file.
+
+ NEWS_ORGANIZATION
+ This variable, if set, provides the
+ string used in the Organization:
+ header of USENET news postings. It will
+ override the setting of the ORGANIZATION
+ environment variable, if it is also set
+ (and, on UNIX, the contents of an
+ /etc/organization file, if present).
+
+ NNTPSERVER
+ If set, this variable specifies the
+ default NNTP server that will be used
+ for USENET news reading and posting
+ with <strong>Lynx</strong>, via news: URL's.
+
+ ORGANIZATION
+ This variable, if set, provides the
+ string used in the Organization:
+ header of USENET news postings. On
+ UNIX, it will override the contents of
+ an /etc/organization file, if present.
+
+ <em>PROTOCOL</em>_proxy
+ <strong>Lynx</strong> supports the use of proxy servers
+ that can act as firewall gateways and
+ caching servers. They are preferable
+ to the older gateway servers (see
+ WWW_access_GATEWAY, below).
+ Each protocol used by <strong>Lynx</strong> (http, ftp,
+ gopher, etc), can be mapped separately
+ by setting environment variables of
+ the form <em>PROTOCOL</em>_proxy (literally:
+ http_proxy, ftp_proxy, gopher_proxy,
+ etc), to &ldquo;http://some.server.dom:port/&rdquo;.
+ See <a href=
+"#proxy">Proxy details and examples</a>.
+
+ WWW_<em>access</em>_GATEWAY
+ <strong>Lynx</strong> still supports use of gateway
+ servers, with the servers specified
+ via &ldquo;WWW_<em>access</em>_GATEWAY&rdquo; variables
+ (where &ldquo;access&rdquo; is lower case and can
+ be &ldquo;http&rdquo;, &ldquo;ftp&rdquo;, &ldquo;gopher&rdquo; or &ldquo;wais&rdquo;),
+ however most gateway servers have been
+ discontinued. Note that you do not
+ include a terminal &ldquo;/&rdquo; for gateways,
+ but do for proxies specified by <em>PROTOCOL</em>_proxy
+ environment variables. See <a href=
+"#proxy">Proxy details</a>.
+
+ WWW_HOME
+ This variable, if set, will override
+ the default startup URL specified in
+ any of the <strong>Lynx</strong> configuration files.
+</pre>
+ <h2><a name="setenv" id="setenv">Variables Set or Modified By
+ Lynx</a></h2>
+
+ <pre>
+ LYNX_PRINT_DATE This variable is set by the <strong>Lynx</strong>
+ p(rint) function, to the &ldquo;Date:&rdquo; string
+ seen in the document's &ldquo;Information
+ about&rdquo; page (= cmd), if any. It is
+ created for use by an external program,
+ as defined in a lynx.cfg
+ PRINTER: definition statement. If the
+ field does not exist for the document,
+ the variable is set to a null string
+ under UNIX, or &ldquo;No Date&rdquo; under VMS.
+
+ LYNX_PRINT_LASTMOD This variable is set by the <strong>Lynx</strong>
+ p(rint) function, to the Last Mod:
+ string seen in the document's &ldquo;Information
+ about&rdquo; page (= cmd), if any.
+ It is created for use by an external
+ program, as defined in a lynx.cfg
+ PRINTER: definition statement. If the
+ field does not exist for the document,
+ the variable is set to a null string
+ under UNIX, or &ldquo;No LastMod&rdquo; under VMS.
+
+ LYNX_PRINT_TITLE This variable is set by the <strong>Lynx</strong>
+ p(rint) function, to the Linkname:
+ string seen in the document's &ldquo;Information
+ about&rdquo; page (= cmd), if any.
+ It is created for use by an external
+ program, as defined in a lynx.cfg
+ PRINTER: definition statement. If the
+ field does not exist for the document,
+ the variable is set to a null string
+ under UNIX, or &ldquo;No Title&rdquo; under VMS.
+
+ LYNX_PRINT_URL This variable is set by the <strong>Lynx</strong>
+ p(rint) function, to the URL: string
+ seen in the document's &ldquo;Information
+ about&rdquo; page (= cmd), if any. It is
+ created for use by an external program,
+ as defined in a lynx.cfg
+ PRINTER: definition statement. If the
+ field does not exist for the document,
+ the variable is set to a null string
+ under UNIX, or &ldquo;No URL&rdquo; under VMS.
+
+ LYNX_VERSION This variable is always set by <strong>Lynx</strong>,
+ and may be used by an external program
+ to determine if it was invoked by
+ <strong>Lynx</strong>. See also the comments in the
+ distribution's sample mailcap file,
+ for notes on usage in such a file.
+
+ SSL_CERT_DIR Set to the directory containing trusted
+ certificates.
+
+ SSL_CERT_FILE Set to the full path and filename for
+ your file of trusted certificates.
+
+ TERM Normally, this variable is used by
+ <strong>Lynx</strong> to determine the terminal type
+ being used to invoke <strong>Lynx</strong>. If, however,
+ it is unset at startup time (or
+ has the value &ldquo;unknown&rdquo;), or if the
+ -term command-line option is used,
+ <strong>Lynx</strong> will set or modify its value
+ to the user specified terminal type
+ (for the <strong>Lynx</strong> execution environment).
+ Note: If set/modified by <strong>Lynx</strong>, the values of
+ the LINES and/or COLUMNS environment
+ variables may also be changed.
+</pre>
+ <h2><a name="cgi" id="cgi">Simulated CGI Support</a></h2>
+
+ <p>If built with the cgi-links option enabled,
+ <strong>Lynx</strong> allows access to a cgi script directly
+ without the need for an http daemon.</p>
+
+ <p>When executing such &ldquo;lynxcgi scripts&rdquo; (if
+ enabled), the following variables may be set for simulating a CGI
+ environment:</p>
+
+ <pre>
+ CONTENT_LENGTH
+
+ CONTENT_TYPE
+
+ DOCUMENT_ROOT
+
+ HTTP_ACCEPT_CHARSET
+
+ HTTP_ACCEPT_LANGUAGE
+
+ HTTP_USER_AGENT
+
+ PATH_INFO
+
+ PATH_TRANSLATED
+
+ QUERY_STRING
+
+ REMOTE_ADDR
+
+ REMOTE_HOST
+
+ REQUEST_METHOD
+
+ SERVER_SOFTWARE
+</pre>
+ <p>Other environment variables are not inherited by the script,
+ unless they are provided via a LYNXCGI_ENVIRONMENT statement in
+ the configuration file. See the lynx.cfg file, and the (draft)
+ CGI 1.1 Specification
+ &lt;http://Web.Golux.Com/coar/cgi/draft-coar-cgi-v11-00.txt&gt;
+ for the definition and usage of these variables.</p>
+
+ <p>The CGI Specification, and other associated documentation,
+ should be consulted for general information on CGI script
+ programming.</p>
+
+ <h2><a name="language" id="language">Native Language Support</a></h2>
+
+ <p>If configured and installed with Native Language Support,
+ <strong>Lynx</strong> will display status and other messages in
+ your local language. See the file ABOUT_NLS in the source
+ distribution, or at your local GNU site, for more information
+ about internationalization.</p>
+
+ <p>The following environment variables may be used to alter
+ default settings:</p>
+
+ <pre>
+ LANG This variable, if set, will override
+ the default message language. It is
+ an ISO 639 two-letter code identifying
+ the language. Language codes are NOT
+ the same as the country codes given in
+ ISO 3166.
+
+ LANGUAGE This variable, if set, will override
+ the default message language. This is a
+ GNU extension that has higher priority for
+ setting the message catalog than LANG or
+ LC_ALL.
+
+ LC_ALL and
+
+ LC_MESSAGES These variables, if set, specify the
+ notion of native language formatting
+ style. They are POSIXly correct.
+
+ LINGUAS This variable, if set prior to configuration,
+ limits the installed languages to specific values.
+ It is a space-separated list of two-letter codes.
+ Currently, it is hard-coded to a wish list.
+
+ NLSPATH This variable, if set, is used as the
+ path prefix for message catalogs.
+</pre>
+ <h2><a name="proxy" id="proxy">Proxy details and examples</a></h2>
+
+ <p>To set your site's NTTP server as the default host for news
+ reading and posting via <strong>Lynx</strong>, set the
+ environment variable NNTPSERVER so that it points to its Internet
+ address. The variable &ldquo;NNTPSERVER&rdquo; is used to specify
+ the host which will be used as the default for news URLs.</p>
+
+ <dl>
+ <dt>UNIX</dt>
+
+ <dd>
+ <pre>
+setenv NNTPSERVER "news.server.dom"
+</pre>
+ </dd>
+
+ <dt>VMS</dt>
+
+ <dd>
+ <pre>
+define/system NNTPSERVER "news.server.dom"
+</pre>
+ </dd>
+ </dl>
+
+ <p><strong>Lynx</strong> still supports use of gateway servers,
+ with the servers specified via the variables
+ &ldquo;WWW_access_GATEWAY&rdquo;, where &ldquo;access&rdquo; is
+ lower case and can be &ldquo;http&rdquo;, &ldquo;ftp&rdquo;,
+ &ldquo;gopher&rdquo; or &ldquo;wais&rdquo;. Most of the gateway
+ servers have been discontinued, but
+ &ldquo;http://www.w3.org:8001&rdquo; is available for wais
+ searches (note that you do not include a terminal &ldquo;/&rdquo;
+ for gateways, but do for proxies; see below).</p>
+
+ <p><strong>Lynx</strong> version 2.2 and beyond supports the use
+ of proxy servers that can act as firewall gateways and caching
+ servers. They are preferable to the older gateway servers. Each
+ protocol used by <strong>Lynx</strong> can be mapped separately
+ using <em>PROTOCOL</em>_proxy environment variables as shown
+ below:</p>
+
+ <dl>
+ <dt>UNIX</dt>
+
+ <dd>
+ <blockquote>
+ <pre>
+setenv http_proxy "http://some.server.dom:port/"
+setenv https_proxy "http://some.server.dom:port/"
+setenv ftp_proxy "http://some.server.dom:port/"
+setenv gopher_proxy "http://some.server.dom:port/"
+setenv news_proxy "http://some.server.dom:port/"
+setenv newspost_proxy "http://some.server.dom:port/"
+setenv newsreply_proxy "http://some.server.dom:port/"
+setenv snews_proxy "http://some.server.dom:port/"
+setenv snewspost_proxy "http://some.server.dom:port/"
+setenv snewsreply_proxy "http://some.server.dom:port/"
+setenv nntp_proxy "http://some.server.dom:port/"
+setenv wais_proxy "http://some.server.dom:port/"
+setenv finger_proxy "http://some.server.dom:port/"
+setenv cso_proxy "http://some.server.dom:port/"
+</pre>
+ </blockquote>
+ </dd>
+
+ <dt>VMS</dt>
+
+ <dd>
+ <blockquote>
+ <pre>
+define "http_proxy" "http://some.server.dom:port/"
+define "https_proxy" "http://some.server.dom:port/"
+define "ftp_proxy" "http://some.server.dom:port/"
+define "gopher_proxy" "http://some.server.dom:port/"
+define "news_proxy" "http://some.server.dom:port/"
+define "newspost_proxy" "http://some.server.dom:port/"
+define "newsreply_proxy" "http://some.server.dom:port/"
+define "snews_proxy" "http://some.server.dom:port/"
+define "snewspost_proxy" "http://some.server.dom:port/"
+define "snewsreply_proxy" "http://some.server.dom:port/"
+define "nntp_proxy" "http://some.server.dom:port/"
+define "wais_proxy" "http://some.server.dom:port/"
+define "finger_proxy" "http://some.server.dom:port/"
+define "cso_proxy" "http://some.server.dom:port/"
+</pre>
+ </blockquote>
+
+ <p>(Encase *BOTH* strings in double-quotes to maintain lower
+ case for the <em>PROTOCOL</em>_proxy variable and for the
+ http access type; include /system if you want proxying for
+ all clients on your system.)</p>
+ </dd>
+ </dl>
+
+ <p>If you wish to override the use of a proxy server for specific
+ hosts or entire domains you may use the &ldquo;no_proxy&rdquo;
+ environment variable. The no_proxy variable can be a
+ comma-separated list of strings defining no-proxy zones in the
+ DNS domain name space. If a tail substring of the domain-path for
+ a host matches one of these strings, transactions with that node
+ will not be proxied. Here is an example use of
+ &ldquo;no_proxy&rdquo;:</p>
+
+ <dl>
+ <dt>UNIX</dt>
+
+ <dd>
+ <pre>
+setenv no_proxy "host.domain.dom, domain1.dom, domain2"
+</pre>
+ </dd>
+
+ <dt>VMS</dt>
+
+ <dd>
+ <pre>
+define "no_proxy" "host.domain.dom, domain1.dom, domain2"
+</pre>
+ </dd>
+ </dl>
+
+ <p>You can include a port number in the no_proxy list to override
+ use of a proxy server for the host accessed via that port, but
+ not via other ports. For example, if you use
+ &ldquo;host.domain.dom:119&rdquo; and/or
+ &ldquo;host.domain.dom:210&rdquo;, then news (port 119) URLs
+ and/or any wais (port 210) searches on that host would be
+ excluded, but http, ftp, and gopher services (if normally
+ proxied) would still be included, as would any news or wais
+ services on other hosts.</p>
+
+ <p>Warning: Note that setting &ldquo;il&rdquo; as an entry in
+ this list will block proxying for the .mil domain as well as the
+ .il domain. If the entry is &ldquo;.il&rdquo; this will not
+ happen.</p>
+
+ <p>If you wish to override the use of a proxy server completely
+ (i.e., globally override any existing proxy variables), set the
+ value of &ldquo;no_proxy&rdquo; to &ldquo;*&rdquo;. This is the
+ only allowed use of * in no_proxy.</p>
+
+ <p>Note that <strong>Lynx</strong> treats file URLs on the local
+ host as requests for direct access to the file, and does not
+ attempt ftp if that fails. It treats both ftp URLs and file URLs
+ on remote hosts as ftp URLs, and does not attempt direct file
+ access for either. If ftp URLs are being proxied, file URLs on a
+ remote host will be converted to ftp URLs before submission by
+ <strong>Lynx</strong> to the proxy server, so no special
+ procedure for inducing the proxy server to handle them is
+ required. Other WWW clients may require that the http server's
+ configuration file have &ldquo;Map file:* ftp:*&rdquo; in it to
+ perform that conversion.</p>
+
+ <p>If you have not set NNTPSERVER, proxy or no_proxy environment
+ variables you can set them at run time via the configuration file
+ lynx.cfg (this will not override external settings).</p>
+
+ <h2><a name="dos" id="dos">Win32 (95/NT) and 386 DOS</a></h2>
+
+ <p>(adapted from &ldquo;readme.txt&rdquo; by Wayne Buttles<br>
+ and &ldquo;readme.dos&rdquo; by Doug Kaufman)</p>
+
+ <p>Here are some environment variables that should be set,
+ usually in a batch file that runs the <strong>Lynx</strong>
+ executable. Make sure that you have enough room left in your
+ environment. You may need to change your &ldquo;SHELL=&rdquo;
+ setting in config.sys. In addition, <strong>Lynx</strong> looks
+ for a &ldquo;SHELL&rdquo; environment variable when shelling to
+ DOS. If you wish to preserve the environment space when shelling,
+ put a line like this in your AUTOEXEC.BAT file also &ldquo;SET
+ SHELL=C:\COMMAND.COM /E:2048&rdquo;. It should match
+ CONFIG.SYS.</p>
+
+ <pre>
+ HOME Where to keep the bookmark file and personal config files.
+ TEMP or TMP Bookmarks are kept here with no HOME. Temp files here.
+ USER Set to your login name
+ LYNX_CFG Set to the full path and filename for lynx.cfg
+</pre>
+ <p>386 version only:<br></p>
+
+ <pre>
+ WATTCP.CFG Set to the full path for the WATTCP.CFG directory
+</pre>
+ <p>(Depending on how you compiled libtcp.a, you may have to use
+ WATCONF.)</p>
+
+ <p>Define these in your batch file for running
+ <strong>Lynx</strong>. For example, if your application line is
+ &ldquo;D:\win32\lynx.bat&rdquo;, lynx.bat for Win32 may look
+ like:</p>
+
+ <pre>
+ @ECHO OFF
+ set home=d:\win32
+ set temp=d:\tmp
+ set lynx_cfg=d:\win32\lynx.cfg
+ d:\win32\lynx.exe %1 %2 %3 %4 %5
+</pre>
+ <p>In lynx_386, a typical batch file might look like:</p>
+
+ <pre>
+ @echo off
+ set HOME=f:/lynx2-8
+ set USER=your_login_name
+ set LYNX_CFG=%HOME%/lynx.cfg
+ set WATTCP.CFG=%HOME%
+ f:\lynx2-8\lynx %1 %2 %3 %4 %5 %6 %7 %8 %9
+</pre>
+ <p>You will also need to make sure that the WATTCP.CFG file has
+ the correct information for IP number, Gateway, Netmask, and
+ Domain Name Server. This can also be automated in the batch
+ file.</p>
+</body>
+</html>
diff --git a/lynx_help/keystrokes/follow_help.html b/lynx_help/keystrokes/follow_help.html
new file mode 100644
index 0000000..1c9ca08
--- /dev/null
+++ b/lynx_help/keystrokes/follow_help.html
@@ -0,0 +1,286 @@
+<!-- $LynxId: follow_help.html,v 1.17 2021/07/01 21:02:38 tom Exp $ -->
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+ <meta name="generator" content=
+ "HTML Tidy for HTML5 for Linux version 5.6.0">
+ <title>Help on the Follow link (or page) number feature</title>
+ <link rev="made" href="mailto:lynx-dev@nongnu.org">
+ <meta http-equiv="Content-Type" content=
+ "text/html; charset=us-ascii">
+ <meta name="description" content=
+ "Lynx allows the user to select a link using a single-digit shortcut. There are several configuration choices which apply to this feature.">
+</head>
+<body>
+ <div class="nav">
+ <ul>
+ <li><a href="#overview">Overview</a></li>
+
+ <li><a href="#numbering">Zero and other digits</a></li>
+
+ <li><a href="#suffixes">Suffixes</a></li>
+
+ <li><a href="#form_fields">Specifics for Form Fields</a></li>
+
+ <li><a href="#hidden_links">Hidden Links</a></li>
+
+ <li><a href="#goto_hidden_link">Navigating to Hidden
+ Links</a></li>
+ </ul>
+ </div>
+
+ <h2><a name="overview" id="overview">Overview</a></h2>
+
+ <p>If a user has set one of these modes, (as the default or for
+ the current session via the <em>Options menu</em>) then hypertext
+ links (and form fields, depending on the keypad mode) are
+ prefixed with numbers in square brackets:</p>
+
+ <ul>
+ <li><em>Keypad mode</em> to <em>Links are numbered</em>,
+ or</li>
+
+ <li><em>Form fields are numbered</em>, or</li>
+
+ <li><em>Links and form fields are numbered</em>
+ </li>
+ </ul>
+
+ <p>Entering a keyboard or keypad number is treated as an
+ <em>F_LINK_NUM</em> command, and should invoke the <em>Follow
+ link (or goto link or page) number:</em> statusline prompt for a
+ potentially multiple digit number corresponding to an indicated
+ link number.</p>
+
+ <h2><a name="numbering" id="numbering">Zero and other digits</a></h2>
+
+ <p>The prompt can be invoked via typing a zero (<em>0</em>), but
+ it will not be treated as the lead digit for the number entry,
+ whereas digits 1 through 9 both invoke the prompt and are treated
+ as the first digit.</p>
+
+ <p>In <em>Form fields are numbered</em> or <em>Links and form
+ fields are numbered</em> mode, if the number corresponds to a
+ form field you will be positioned on that field, but if it is a
+ submit button it will not be ACTIVATE-ed.</p>
+
+ <p>If the user has set <em>Keypad mode</em> to <em>Numbers act as
+ arrows</em>, then only a zero digit will be treated as an
+ <em>F_LINK_NUM</em> command for invoking the <em>Follow link (or
+ goto link or page) number:</em> prompt.</p>
+
+ <h2><a name="suffixes" id="suffixes">Suffixes</a></h2>
+
+ <p>After accepting a number at the prompt, <strong>Lynx</strong>
+ accepts an optional suffix:</p>
+
+ <dl>
+ <dt><em>RETURN</em> (activate)</dt>
+
+ <dd>Without a suffix, e.g., If <em>RETURN</em> is pressed to
+ terminate the number entry (e.g., <em>123</em>) and it
+ corresponds to a hypertext link, <strong>Lynx</strong> will
+ retrieve the document for that link as if you had paged or used
+ other navigation commands to make it the current link and then
+ ACTIVATE-ed it.</dd>
+
+ <dt><code><strong>g</strong></code> (go)</dt>
+
+ <dd>
+ <p>If the number entered at the prompt has a
+ &ldquo;<em>g</em>&rdquo; suffix (e.g., <em>123g</em>), then
+ <strong>Lynx</strong> will make the link corresponding to
+ that number the current link, paging as appropriate if the
+ link does not appear in the currently displayed page. The
+ &ldquo;<em>g</em>&rdquo; suffix is inferred (need not be
+ entered) for form fields in <em>Form fields are numbered</em>
+ or <em>Links and form fields are numbered</em> mode.</p>
+ </dd>
+
+ <dt><code><strong>p</strong></code> (page)</dt>
+
+ <dd>
+ <p>Alternatively, if the number is given a
+ &ldquo;<em>p</em>&rdquo; suffix (e.g., <em>123p</em>),
+ <strong>Lynx</strong> will make the page corresponding to
+ that number the currently displayed page, and the first link
+ on that page, if any, the current link. The
+ &ldquo;<em>g</em>&rdquo; and &ldquo;<em>p</em>&rdquo;
+ suffixes thus convert the <em>Follow link (or goto link or
+ page) number:</em> feature to an advanced navigation aid.</p>
+ </dd>
+
+ <dt><code><strong>+</strong></code> or
+ <code><strong>-</strong></code> (jump)</dt>
+
+ <dd>
+ <p>Finally, a user may add a <em>+</em> or <em>-</em> suffix
+ to a number command to indicate jumping forward or back
+ relative to the current link or page. For example, typing
+ <em>1g+</em> followed by RETURN will move the current link to
+ the next numbered link, skipping any intervening pages or
+ unnumbered links; <em>1g-</em> goes to the preceding numbered
+ link. On a page without links, <em>3g+</em> goes to the 3rd
+ link <em>following</em> the page. <em>5p+</em> skips ahead 5
+ pages, and so on. You can also enter <em>5+</em> or
+ <em>5-</em>, which will activate the 5th link ahead/behind
+ where you are currently positioned. Note that typing
+ <em>1g+</em> is different from typing a down arrow in that
+ <em>1g+</em> skips pages containing no links, or intervening
+ non-numbered links, such as form fields when form fields are
+ not numbered. It also differs from the <em>&lt;tab&gt;</em>
+ command in that <em>1g+</em> does not skip over whole
+ textareas, unless form fields are not numbered.</p>
+
+ <p><em>NOTE:</em> <em>1+g 1-g 1+p 1-p</em> are all recognized
+ as equivalent to <em>1g+ 1g- 1p+ 1p-</em> . Any other
+ (mistyped) characters end the formula: e.g. <em>1gh+</em> is
+ treated as <em>1g</em>.</p>
+ </dd>
+ </dl>
+
+ <h2><a name="form_fields" id="form_fields">Specifics for Form
+ Fields</a></h2>
+
+ <p>Numbers are associated with form fields only when</p>
+
+ <ul>
+ <li><em>Form fields are numbered</em> or</li>
+
+ <li><em>Links and form fields are numbered</em> mode has been
+ selected.</li>
+ </ul>
+
+ <p>If you have selected <em>Numbers act as arrows</em> or
+ <em>Links are numbered</em> mode, you can seek form fields in the
+ document via WHEREIS searches for strings in their displayed
+ values. If they are INPUT or TEXTAREA fields with no values as
+ yet, you can use two or more underscores as the search string,
+ because underscores are used as placeholders for form fields in
+ the displayed document.</p>
+
+ <p id="select-option">When you have invoked a popup window for a
+ list of OPTIONs in a form's SELECT block:</p>
+
+ <ul>
+ <li>each OPTION is associated with a number, and that number
+ will be displayed in <em>Form fields are numbered</em> or
+ <em>Links and form fields are numbered</em> mode.</li>
+
+ <li>In any keypad mode, the <em>F_LINK_NUM</em>
+ (&ldquo;<em>0</em>&rdquo;) command will invoke a <em>Select
+ option (or page) number:</em> prompt, and you can enter a
+ number, and optionally a &ldquo;<em>g</em>&rdquo; or
+ &ldquo;<em>p</em>&rdquo; suffix, to select or seek an OPTION in
+ that list.</li>
+
+ <li>If only a number is entered at the prompt, the
+ corresponding OPTION will be selected and the popup will be
+ retracted.</li>
+
+ <li>If the &ldquo;<em>g</em>&rdquo; suffix is included, then
+ you will be positioned on the corresponding OPTION in the list,
+ paging through the list if necessary, but it will not be
+ treated as selected unless you enter the ACTIVATE (RETURN or
+ right-arrow) command when positioned on the OPTION.</li>
+
+ <li>For purposes of paging (e.g., in conjunction with the
+ &ldquo;<em>p</em>&rdquo; suffix), a <em>page</em> is defined as
+ the number of OPTIONs displayed within the vertical dimension
+ of the popup window.</li>
+
+ <li>Finally, the <em>+</em> and <em>-</em> suffixes can be used
+ to move forward or back from the current option or page in a
+ popup menu, similarly to the way they are used for links.</li>
+ </ul>
+
+ <p>For example, while viewing a popup window, the user can type
+ <em>3p+</em> and RETURN to skip ahead 3 pages, and <em>50g-</em>
+ will move the current selection back 50 options. This will work
+ whether or not <em>keypad mode</em> is <em>Form fields are
+ numbered</em> or <em>Links and form fields are numbered</em>
+ since options are numbered internally. If form field numbering is
+ turned off, the option numbers will not appear on screen, but the
+ user can still navigate using these commands.</p>
+
+ <h2><a name="hidden_links" id="hidden_links">Hidden Links</a></h2>
+
+ <p>HTML can be structured so that it includes <em>hidden
+ links</em>, i.e., without a visible link name intended for
+ ACTIVATE-ing the link. Such links may be created, for example,
+ by</p>
+
+ <ul>
+ <li>making an IMG element the sole content of an Anchor
+ element, and including an ALT="" attribute name/value pair to
+ suppress access to the link when the browser does not have
+ support for image handling available.</li>
+
+ <li>having truly empty Anchor content, in cases for which the
+ value of an Anchor's HREF attribute is intended as a navigation
+ aid for robots (typically indexers) and not as content for a
+ browser's rendition of the document.</li>
+
+ <li>using the <em>-ismap</em> command line switch, which makes
+ <strong>Lynx</strong> additionally treat a link to a
+ server-side image maps as hidden if there also is a client-side
+ map for the same image.</li>
+
+ <li>bad HTML, which may produce <em>hidden links</em>.</li>
+ </ul>
+
+ <p><em>Hidden links</em> differ from Anchors that have only a
+ NAME or ID attribute name/value pair (intended as positioning
+ targets from other links which do have HREF attributes and values
+ that include a fragment).</p>
+
+ <p><strong>Lynx</strong> respects instructions for <em>hidden
+ links</em> and normally does not include them in the rendition of
+ the document. However, if the command line switch
+ <em>-hiddenlinks=merge</em> is used, such links will still be
+ numbered in sequence with other links which are not hidden, and
+ if <em>Links are numbered</em> mode is also on, link numbers will
+ appear for them in the displayed text (except for links to image
+ maps which are hidden because of <em>-ismap</em>). If
+ <em>-hiddenlinks=listonly</em> or <em>-hiddenlinks=ignore</em> is
+ in effect, <em>hidden links</em> will not be shown in the text
+ even in <em>links are numbered</em> mode. Not using a
+ <em>-hiddenlinks</em> flag at all is equivalent to
+ <em>-hiddenlinks=listonly</em>.</p>
+
+ <h2><a name="goto_hidden_link" id="goto_hidden_link">Navigating
+ to Hidden Links</a></h2>
+
+ <p>If a document includes <em>hidden links</em>, they will be
+ reported, with appropriate labeling, in the menus created for the
+ LIST (&ldquo;<em>l</em>&rdquo;) or ADDRLIST
+ (&ldquo;<em>A</em>&rdquo;) commands, unless
+ <em>-hiddenlinks=ignore</em> is used. They can then be
+ ACTIVATE-ed via those menus.</p>
+
+ <p>If a link was hidden because of an ALT attribute in an IMG
+ element, it will be converted to a <em>visible link</em> whenever
+ the IMAGE_TOGGLE (&ldquo;<em>*</em>&rdquo;) command is used to
+ create links for SRC attribute values of IMG elements, because
+ this indicates that the user does have some form of image
+ handling enabled via a helper application, or wishes to download
+ files for subsequent use with a graphic browser or other suitable
+ software.</p>
+
+ <p>HTML forms may have fields with a HIDDEN attribute, indicating
+ that a name/value pair for the fields should be included in the
+ content submitted for the form, but the value should not be
+ displayed in the rendered form. <strong>Lynx</strong> respects
+ this attribute as well, and neither displays the HIDDEN field,
+ nor assigns it a number for the F_LINK_NUM
+ (&ldquo;<em>0</em>&rdquo;) command and <em>Form fields are
+ numbered</em> or <em>Links and form fields are numbered</em>
+ keypad mode handling, nor includes an entry for it in the menus
+ created for the LIST (&ldquo;<em>l</em>&rdquo;) or ADDRLIST
+ (&ldquo;<em>A</em>&rdquo;) commands. However, the HIDDEN
+ name/value pairs are included in any displays of submitted form
+ content in the <em>Information about the current document</em>
+ that is invoked by the INFO (&ldquo;<em>=</em>&rdquo;)
+ command.</p>
+</body>
+</html>
diff --git a/lynx_help/keystrokes/gopher_types_help.html b/lynx_help/keystrokes/gopher_types_help.html
new file mode 100644
index 0000000..ac6b090
--- /dev/null
+++ b/lynx_help/keystrokes/gopher_types_help.html
@@ -0,0 +1,87 @@
+<!-- $LynxId: gopher_types_help.html,v 1.13 2021/07/01 21:02:38 tom Exp $ -->
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+ <meta name="generator" content=
+ "HTML Tidy for HTML5 for Linux version 5.6.0">
+ <title>Listing of Gopher types</title>
+ <link rev="made" href="mailto:lynx-dev@nongnu.org">
+ <meta http-equiv="Content-Type" content=
+ "text/html; charset=us-ascii">
+ <meta name="description" content=
+ "This is a list of the file-types which are known to Lynx in its gopher interface.">
+</head>
+<body>
+ <div class="nav">
+ <ul>
+ <li><a href="#overview">Listing of Gopher types</a></li>
+ </ul>
+ </div>
+
+ <h2><a name="overview" id="overview">Listing of Gopher types</a></h2>
+
+ <dl>
+ <dt>(FILE)</dt>
+
+ <dd>An ASCII file</dd>
+
+ <dt>(DIR)</dt>
+
+ <dd>A directory listing</dd>
+
+ <dt>(CSO)</dt>
+
+ <dd>The Computing Services Organizations nameserver
+ interface</dd>
+
+ <dt>(BIN)</dt>
+
+ <dd>
+ A binary file with one of the following meanings
+ <ul>
+ <li>A Binary file with PC extensions</li>
+
+ <li>A Binary file with UNIX extensions</li>
+ </ul>
+ </dd>
+
+ <dt>(HQX)</dt>
+
+ <dd>A Macintosh file that has been BinHexed</dd>
+
+ <dt>(?)</dt>
+
+ <dd>A searchable database</dd>
+
+ <dt>(IMG)</dt>
+
+ <dd>An unknown image type<br>
+ You must have an <a href="xterm_help.html">X terminal</a> to
+ view images</dd>
+
+ <dt>(GIF)</dt>
+
+ <dd>An image in Graphics Interchange Format<br>
+ You must have an <a href="xterm_help.html">X terminal</a> to
+ view images</dd>
+
+ <dt>(HTML)</dt>
+
+ <dd>A World Wide Web hypertext file</dd>
+
+ <dt>(TEL)</dt>
+
+ <dd>The link will open a connection to another host using
+ telnet</dd>
+
+ <dt>(3270)</dt>
+
+ <dd>The link will open a connection to another host using
+ tn3270</dd>
+
+ <dt>(UKN)</dt>
+
+ <dd>An unknown or unsupported type</dd>
+ </dl>
+</body>
+</html>
diff --git a/lynx_help/keystrokes/history_help.html b/lynx_help/keystrokes/history_help.html
new file mode 100644
index 0000000..62f45df
--- /dev/null
+++ b/lynx_help/keystrokes/history_help.html
@@ -0,0 +1,58 @@
+<!-- $LynxId: history_help.html,v 1.10 2021/07/01 21:02:38 tom Exp $ -->
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+ <meta name="generator" content=
+ "HTML Tidy for HTML5 for Linux version 5.6.0">
+ <title>Help on the History Page</title>
+ <link rev="made" href="mailto:lynx-dev@nongnu.org">
+ <meta http-equiv="Content-Type" content=
+ "text/html; charset=us-ascii">
+ <meta name="description" content=
+ "Lynx provides a history page, showing all of the links which have been traversed to reach the current point. The user can revisit any of these links.">
+</head>
+<body>
+ <div class="nav">
+ <ul>
+ <li><a href="#overview">Overview</a></li>
+
+ <li><a href="#navigation">Navigation</a></li>
+ </ul>
+ </div>
+
+ <h2><a name="overview" id="overview">Overview</a></h2>
+
+ <p><strong>Lynx</strong>'s History Page displays all of the links
+ that you have traveled through to reach your current point,
+ including any temporary menu or list files that included links,
+ bookmark files, and any documents associated with POST content.
+ If you entered a document and then left it by using the
+ <em>left-arrow</em> key, it will <em>not</em> be in the history
+ stack. If you entered a document and left it by selecting another
+ link within that document, it <em>will</em> be in the history
+ stack.</p>
+
+ <h2><a name="navigation" id="navigation">Navigation</a></h2>
+
+ <p>You may <a href="movement_help.html">select</a> any link on
+ the History Page to review a document that you have previously
+ visited. That link, and any subsequent to it, will not be removed
+ from the history stack if you return to it via the History Page.
+ You thus should use a History Page link, rather than the
+ <em>left-arrow</em> key, if you wish to review previous documents
+ without needing to remember and repeat the series of selections
+ for reaching your currently displayed document.</p>
+
+ <p>Upon using <em>left-arrow</em> in the document selected via
+ the History Page, you will be returned to the document from which
+ you initially went to the History Page.</p>
+
+ <p>If a previously visited link has been removed from the history
+ stack, and it was not a temporary menu or list file, bookmark
+ file, or document associated with POST content, it can still be
+ selected conveniently via the <a href="visited_help.html">Visited
+ Links Page</a>. The latter also will include links which were
+ &ldquo;<em>d</em>&rdquo;ownloaded or passed to a helper
+ application, and thus were not included in the history stack.</p>
+</body>
+</html>
diff --git a/lynx_help/keystrokes/keystroke_help.html b/lynx_help/keystrokes/keystroke_help.html
new file mode 100644
index 0000000..68043ff
--- /dev/null
+++ b/lynx_help/keystrokes/keystroke_help.html
@@ -0,0 +1,177 @@
+<!-- $LynxId: keystroke_help.html,v 1.22 2021/07/01 21:02:38 tom Exp $ -->
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+ <meta name="generator" content=
+ "HTML Tidy for HTML5 for Linux version 5.6.0">
+ <title>Help on Lynx Keystroke Commands</title>
+ <link rev="made" href="mailto:lynx-dev@nongnu.org">
+ <meta http-equiv="Content-Type" content=
+ "text/html; charset=us-ascii">
+ <meta name="description" content=
+ "Lynx recognizes many single-character commands. This is an overview to their default bindings, with links to more detailed documentation.">
+</head>
+<body>
+ <div class="nav">
+ <ul>
+ <li><a href="#overview">Overview</a></li>
+
+ <li><a href="#movement">Movement</a></li>
+
+ <li><a href="#scrolling">Scrolling</a></li>
+
+ <li><a href="#dired">Dired</a></li>
+
+ <li><a href="#other">Other</a></li>
+ </ul>
+ </div>
+
+ <h2><a name="overview" id="overview">Overview</a></h2>
+
+ <p><strong>Lynx</strong> recognizes many single-character
+ commands. This is an overview to their default bindings, with
+ links to more detailed documentation.</p>
+
+ <h2><a name="movement" href="movement_help.html" id=
+ "movement">Movement</a></h2>
+
+ <pre>
+ Down arrow - Highlight next topic
+ Up arrow - Highlight previous topic
+ Right arrow, - Jump to highlighted topic
+ Return, Enter - Follow selected link
+ Left arrow - Return to previous topic
+</pre>
+ <h2><a name="scrolling" href="scrolling_help.html" id=
+ "scrolling">Scrolling</a></h2>
+
+ <pre>
+ + - Scroll down to next page (Page-Down)
+ - - Scroll up to previous page (Page-Up)
+ SPACE - Scroll down to next page (Page-Down)
+ b - Scroll up to previous page (Page-Up)
+ CTRL-A - Go to first page of the current document (Home)
+ CTRL-E - Go to last page of the current document (End)
+ CTRL-B - Scroll up to previous page (Page-Up)
+ CTRL-F - Scroll down to next page (Page-Down)
+ CTRL-N - Go forward two lines in the current document
+ CTRL-P - Go back two lines in the current document
+ ) - Go forward half a page in the current document
+ ( - Go back half a page in the current document
+ ^ - Go to the first link on the current line
+ $ - Go to the last link on the current line
+ &lt; - Go to the previous link in the current column
+ &gt; - Go to the next link in the current column
+ # - Go to Toolbar or Banner in the current document
+</pre>
+ <h2><a name="dired" href="dired_help.html" id="dired">Dired</a></h2>
+
+ <pre>
+ c - Create a new file
+ d - Download selected file
+ e - Edit selected file
+ f - Show a full menu of options for current file
+ m - Modify the name or location of selected file
+ r - Remove selected file
+ t - Tag highlighted file
+ u - Upload a file into the current directory
+</pre>
+ <h2><a name="other" href="other_help.html" id="other">Other</a></h2>
+
+ <pre>
+ ? (or h) - Help (this screen)
+ a - Add the current link to a bookmark file
+ c - Send a comment to the document owner
+ d - Download the current link
+ e - Edit the current file
+ E - Edit the current link's URL (or ACTION) and
+ use that as a goto URL.
+ g - Goto a user specified <a href=
+"../lynx_url_support.html">URL</a> or file
+ G - Edit the current document's URL and use that
+ as a goto URL.
+ i - Show an index of documents
+ j - Execute a jump operation
+ k - Show list of actual key mappings
+ l - List references (links) in current document
+ m - Return to main screen
+ o - Set your <a href=
+"option_help.html">options</a>
+ p - <a href=
+"print_help.html">Print</a> to a file, mail, printers, or other
+ q - Quit (Capital &ldquo;Q&rdquo; for quick quit)
+ / - Search for a string within the current document
+ s - Enter a search string for an external search
+ n - Go to the next search string
+ N - Go to the previous search string
+ v - View a <a href=
+"bookmark_help.html">bookmark file</a>
+ V - Go to the <a href=
+"visited_help.html">Visited Links Page</a>
+ x - Force submission of form or link with no-cache
+ z - Cancel transfer in progress
+ [backspace] - Go to the <a href=
+"history_help.html">History Page</a>
+ = - Show info about current document, URL and link
+ \ - Toggle document source/rendered view
+ ! - Spawn your default shell
+ ' - Toggle "historical" vs minimal or valid comment
+ parsing
+ _ - Clear all authorization info for this session
+ ` - Toggle minimal or valid comment parsing
+ * - Toggle image_links mode on and off
+ @ - Toggle raw 8-bit translations or CJK mode
+ on or off
+ . - Run external program on the current link.
+ , - Run external program on the current document.
+ { - Shift the screen left.
+ } - Shift the screen right.
+ | - Toggle line-wrap mode. When line-wrap is
+ off, you may use { and } to shift the screen
+ left/right. The screen width is set to 999.
+ ~ - Toggle parsing of nested tables (experimental).
+ [ - Toggle pseudo_inlines mode on and off
+ ] - Send a HEAD request for the current doc or link
+ " - Toggle valid or "soft" double-quote parsing
+ CTRL-R - Reload current file and refresh the screen
+ CTRL-L - Refresh the screen
+
+ CTRL-V - Outside of a text input line or field,
+ switch to <a href=
+"option_help.html#tagsoup">alternative parsing</a> of HTML.
+ - In a form text input field,
+ CTRL-V prompts for a key command (allows
+ <a href=
+"../Lynx_users_guide.html#CtrlVNote">escaping</a> from the field).
+
+ Note that on most UNIX hosts, CTRL-V is bound
+ via stty to the lnext (literal-next) code but
+ the exact behavior of that is implementation
+ specific. On Solaris you must type CTRL-V
+ twice to use it, since it quotes the following
+ keystroke.
+
+ CTRL-U - Inside text input line or field,
+ erase input line (<a href=
+"edit_help.html">more input line commands</a>)
+ - Outside of text input or field,
+ undo returning to previous topic.
+
+ CTRL-G - Cancel input or transfer
+
+ CTRL-T - Toggle trace mode on and off
+ ; - View the Lynx Trace Log for the current session
+ CTRL-K - Invoke the <a href=
+"cookie_help.html">Cookie Jar Page</a>
+ CTRL-X - Invoke the <a href=
+"../Lynx_users_guide.html#Cache">Cache Jar Page</a>
+ <em>numbers</em> - Invoke the prompt
+ <a href=
+"follow_help.html">Follow link (or goto link or page) number:</a>
+ or the
+ <a href=
+"follow_help.html#select-option">Select option (or page) number:</a>
+ prompt
+</pre>
+</body>
+</html>
diff --git a/lynx_help/keystrokes/movement_help.html b/lynx_help/keystrokes/movement_help.html
new file mode 100644
index 0000000..1ba648e
--- /dev/null
+++ b/lynx_help/keystrokes/movement_help.html
@@ -0,0 +1,78 @@
+<!-- $LynxId: movement_help.html,v 1.11 2021/07/01 21:02:38 tom Exp $ -->
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+ <meta name="generator" content=
+ "HTML Tidy for HTML5 for Linux version 5.6.0">
+ <title>Help on Lynx Movement commands</title>
+ <link rev="made" href="mailto:lynx-dev@nongnu.org">
+ <meta http-equiv="Content-Type" content=
+ "text/html; charset=us-ascii">
+ <meta name="description" content=
+ "These are the Lynx keystroke-movement commands which are usable in all non-editing contexts, for traversing links.">
+</head>
+<body>
+ <div class="nav">
+ <ul>
+ <li><a href="#overview">Overview</a></li>
+
+ <li><a href="#notes">Notes</a></li>
+ </ul>
+ </div>
+
+ <h2><a name="overview" id="overview">Overview</a></h2>
+
+ <p>These are the Lynx <a href=
+ "keystroke_help.html#movement">keystroke-movement</a> commands
+ which are usable in all non-editing contexts, for traversing
+ links.</p>
+
+ <pre>
+ Down arrow, - Move to the next hypertext link,
+ TAB or scroll down if there are no more
+ links on the page to move to.
+
+ Up arrow - Move to the previous hypertext link,
+ or scroll up if there are no links
+ above the current one, and there are
+ previous pages to move to.
+
+ Right arrow, - select the link that the cursor is
+ Return, Enter positioned on.
+
+ Left arrow - Retreat from a link. Go back to the
+ previous topic.
+</pre>
+ <h2><a name="notes" id="notes">Notes</a></h2>
+
+ <ol>
+ <li>If <em>VI Keys</em> are enabled from the options menu or
+ from the <code>.lynxrc</code> file, lowercase h,j,k,l will move
+ left, down, up, and right, respectively.</li>
+
+ <li>If <em>Emacs Keys</em> are enabled from the options menu or
+ from the <code>.lynxrc</code> file, Ctrl-B, Ctrl-N, Ctrl-P,
+ Ctrl-F will move left, down, up, and right, respectively.</li>
+
+ <li>If the <em>Num Lock</em> on your keyboard is on,
+ <strong>Lynx</strong> will translate the numbers of your keypad
+ into movement commands. The translation corresponds with the
+ labels on numeric keypad, but can be used from the main
+ keyboard. It is as follows.</li>
+ </ol>
+
+ <blockquote>
+ <pre>
+ 9 - page up
+ 8 - up arrow
+ 7 8 9 7 - moves to the top of a document
+ \|/ 6 - right arrow
+ 4 - 5 - 6 5 - nothing
+ /|\ 4 - left arrow
+ 1 2 3 3 - page down
+ 2 - down arrow
+ 1 - moves to the end of a document
+</pre>
+ </blockquote>
+</body>
+</html>
diff --git a/lynx_help/keystrokes/option_help.html b/lynx_help/keystrokes/option_help.html
new file mode 100644
index 0000000..3138572
--- /dev/null
+++ b/lynx_help/keystrokes/option_help.html
@@ -0,0 +1,823 @@
+<!-- $LynxId: option_help.html,v 1.34 2021/07/01 21:02:38 tom Exp $ -->
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+ <meta name="generator" content=
+ "HTML Tidy for HTML5 for Linux version 5.6.0">
+ <title>Form-based Options Menu : Help</title>
+ <link rev="made" href="mailto:lynx-dev@nongnu.org">
+ <meta http-equiv="Content-Type" content=
+ "text/html; charset=us-ascii">
+ <meta name="description" content=
+ "Lynx's options menu allows you to set and modify many features. Some features persist only during the current session unless specially enabled in lynx.cfg">
+</head>
+<body>
+ <h2><a name="overview" id="overview">Options Menu</a></h2>
+
+ <p>The <em>Options Menu</em> allows you to set and modify many
+ Lynx features.<br>
+ <strong>Lynx</strong>'s <em>Options Menu</em> is grouped visually
+ (by skipping a line) into sections. This description follows the
+ same arrangement. Some options appear on the screen only if they
+ have been compiled in or chosen in
+ <code><strong>lynx.cfg</strong></code>.</p>
+
+ <div class="nav">
+ <ul>
+ <li><a href="#overview">Options Menu</a></li>
+
+ <li>
+ <a href="#GP">General Preferences</a>
+ <ul>
+ <li><a href="#UM">User Mode</a></li>
+
+ <li><a href="#ED">Editor</a></li>
+
+ <li><a href="#ST">Type of Search</a></li>
+ </ul>
+ </li>
+
+ <li>
+ <a href="#SP">Security and Privacy</a>
+ <ul>
+ <li><a href="#CK">Cookies</a></li>
+
+ <li><a href="#IK">Invalid-Cookie Prompting</a></li>
+
+ <li><a href="#SK">SSL Prompting</a></li>
+ </ul>
+ </li>
+
+ <li>
+ <a href="#KI">Keyboard Input</a>
+ <ul>
+ <li><a href="#KM">Keypad mode</a></li>
+
+ <li><a href="#EM">Emacs keys</a></li>
+
+ <li><a href="#VI">VI keys</a></li>
+
+ <li><a href="#LE">Line edit style</a></li>
+ </ul>
+ </li>
+
+ <li>
+ <a href="#DP">Display and Character Set</a>
+ <ul>
+ <li><a href="#LC">Use locale-based character set</a></li>
+
+ <li><a href="#H5">Use HTML5 charset replacements</a></li>
+
+ <li><a href="#DC">Display Character set</a></li>
+
+ <li><a href="#AD">Assumed document character set</a></li>
+
+ <li><a href="#JK">Raw 8-bit or CJK mode</a></li>
+
+ <li><a href="#DV">X DISPLAY variable</a></li>
+ </ul>
+ </li>
+
+ <li>
+ <a href="#AP">Document Appearance</a>
+ <ul>
+ <li><a href="#SC">Show color</a></li>
+
+ <li><a href="#CS">Color style</a></li>
+
+ <li><a href="#C0">Default colors</a></li>
+
+ <li><a href="#CL">Show cursor for current link or
+ option</a></li>
+
+ <li><a href="#UK">Underline links</a></li>
+
+ <li><a href="#SS">Show scrollbar</a></li>
+
+ <li><a href="#PU">Pop-ups for select fields</a></li>
+
+ <li><a href="#tagsoup">HTML error recovery</a></li>
+
+ <li><a href="#BH">Bad HTML messages</a></li>
+
+ <li><a href="#SI">Show Images</a></li>
+
+ <li><a href="#VB">Verbose Images</a></li>
+ </ul>
+ </li>
+
+ <li>
+ <a href="#HP">Headers Transferred to Remote Servers</a>
+ <ul>
+ <li><a href="#PM">Personal mail address</a></li>
+
+ <li><a href="#PN">Personal name for mail</a></li>
+
+ <li><a href="#PW">Password for anonymous ftp</a></li>
+
+ <li><a href="#PT">Preferred media type</a></li>
+
+ <li><a href="#PE">Preferred encoding</a></li>
+
+ <li><a href="#PC">Preferred Document Charset</a></li>
+
+ <li><a href="#PL">Preferred Document Language</a></li>
+
+ <li><a href="#SA">Send User-Agent header</a></li>
+
+ <li><a href="#UA">User Agent</a></li>
+ </ul>
+ </li>
+
+ <li>
+ <a href="#LP">Listing and Accessing Files</a>
+ <ul>
+ <li><a href="#PF">Use Passive FTP</a></li>
+
+ <li><a href="#FT">FTP sort criteria</a></li>
+
+ <li><a href="#LD">Local directory sort criteria</a></li>
+
+ <li><a href="#LO">Local directory sort order</a></li>
+
+ <li><a href="#DF">Show dot files</a></li>
+
+ <li><a href="#PZ">Pause when showing message</a></li>
+
+ <li><a href="#LL">Execution links</a></li>
+
+ <li><a href="#TX">Show transfer rate</a></li>
+ </ul>
+ </li>
+
+ <li>Special Files and Screens
+ <ul>
+ <li><a href="#MB">Multi-bookmarks</a></li>
+
+ <li><a href="#BF">Bookmark file</a></li>
+
+ <li><a href="#AZ">Auto Session</a></li>
+
+ <li><a href="#SZ">Session file</a></li>
+
+ <li><a href="#VP">Visited Pages</a></li>
+ </ul>
+ </li>
+ </ul>
+ </div>
+
+ <h2><a name="GP" id="GP">General Preferences</a></h2>
+
+ <h3><a name="UM" id="UM">User Mode</a></h3>
+
+ <dl>
+ <dt><em>Novice</em>: Shows 2 extra lines of help at the bottom
+ of the screen for beginners.</dt>
+
+ <dt><em>Intermediate (normal)</em>: Normal status-line messages
+ appear.</dt>
+
+ <dt><em>Advanced</em>: The URL is shown on the status
+ line.</dt>
+ </dl>
+
+ <h3><a name="ED" id="ED">Editor</a></h3>
+
+ <p>This is the editor to be invoked when editing browsable files,
+ sending mail or comments, or filling form's textarea (multiline
+ input field). The full pathname of the editor command should be
+ specified when possible. It is assumed the text editor supports
+ the same character set you have for "display character set" in
+ Lynx.</p>
+
+ <h3><a name="ST" id="ST">Type of Search</a></h3>
+
+ <p>This allows you to tell Lynx whether to search the current
+ document ignoring case (case insensitive) or not.</p>
+
+ <h2><a name="SP" id="SP">Security and Privacy</a></h2>
+
+ <h3><a name="CK" id="CK">Cookies</a></h3>
+
+ <p>This can be set to accept or reject all cookies or to ask each
+ time. See the Users Guide for details of <a href=
+ "../Lynx_users_guide.html#Cookies">cookie usage</a>.</p>
+
+ <h3><a name="IK" id="IK">Invalid-Cookie Prompting</a></h3>
+
+ <p>This allows you to tell how to handle invalid cookies:</p>
+
+ <ul>
+ <li><em>prompt normally</em> to prompt for each cookie</li>
+
+ <li><em>force yes-response</em> to reply "yes" to each
+ prompt</li>
+
+ <li><em>force no-response</em> to reply "no" to each
+ prompt.</li>
+ </ul>
+
+ <h3><a name="SK" id="SK">SSL Prompting</a></h3>
+
+ <p>This allows you to tell how to handle errors detected in SSL
+ connections:</p>
+
+ <ul>
+ <li><em>prompt normally</em> to prompt for each cookie</li>
+
+ <li><em>force yes-response</em> to reply "yes" to each
+ prompt</li>
+
+ <li><em>force no-response</em> to reply "no" to each
+ prompt.</li>
+ </ul>
+
+ <h2><a name="KI" id="KI">Keyboard Input</a></h2>
+
+ <h3><a name="KM" id="KM">Keypad mode</a></h3>
+
+ <p>This gives the choice between navigating with the keypad (as
+ arrows; see Lynx Navigation) and having every link numbered
+ (numbered links) so that the links may be selected by numbers
+ instead of moving to them with the arrow keys. You can also
+ number form fields.</p>
+
+ <h3><a name="EM" id="EM">Emacs keys</a></h3>
+
+ <p>If set to &ldquo;ON&rdquo; then the CTRL-P, CTRL-N, CTRL-F and
+ CTRL-B keys will be mapped to up-arrow, down-arrow, right-arrow
+ and left-arrow respectively. Otherwise, they remain mapped to
+ their configured bindings (normally UP_TWO lines, DOWN_TWO lines,
+ NEXT_PAGE and PREV_PAGE respectively).</p>
+
+ <p>Note: setting emacs keys does not affect the line-editor
+ bindings.</p>
+
+ <h3><a name="VI" id="VI">VI keys</a></h3>
+
+ <p>If set to &ldquo;ON&rdquo; then the lowercase h, j, k and l
+ keys will be mapped to left-arrow, down-arrow, up-arrow and
+ right-arrow respectively.</p>
+
+ <p>The uppercase H, J, K, and L keys remain mapped to their
+ configured bindings (normally HELP, JUMP, KEYMAP and LIST,
+ respectively).</p>
+
+ <p>Note: setting vi keys does not affect the line-editor
+ bindings.</p>
+
+ <h3><a name="LE" id="LE">Line edit style</a></h3>
+
+ <p>This allows you to set alternate key bindings for the built-in
+ line editor, if <a href="alt_edit_help.html">Alternate
+ Bindings</a> have been installed. Otherwise, Lynx uses the
+ <a href="edit_help.html">Default Binding</a>.</p>
+
+ <h2><a name="DP" id="DP">Display and Character Set</a></h2>
+
+ <h3><a name="LC" id="LC">Use locale-based character set</a></h3>
+
+ <p>This option allows you to request lynx to obtain a MIME name
+ from the operating system which corresponds to your locale
+ setting. If successful, it overrides the normal setting of the
+ display character set.</p>
+
+ <h3><a name="H5" id="H5">Use HTML5 charset replacements</a></h3>
+
+ <p>This option allows lynx to treat pages with ISO-8859-1
+ (Latin1) or ASCII encoding as if they were Windows 1252. That
+ allows a few punctuation characters to be shown.</p>
+
+ <h3><a name="DC" id="DC">Display Character set</a></h3>
+
+ <p>This allows you to set up the default character set for your
+ specific terminal. The display character set provides a mapping
+ from the character encodings of viewed documents and from HTML
+ entities into viewable characters. It should be set according to
+ your terminal's character set so that characters other than 7-bit
+ ASCII can be displayed correctly, using approximations if
+ necessary, <a href="test_display.html">try the test here</a>.</p>
+
+ <h3><a name="AD" id="AD">Assumed document character set</a></h3>
+
+ <p>This changes the handling of documents which do not explicitly
+ specify a charset. Normally Lynx assumes that 8-bit characters in
+ those documents are encoded according to iso-8859-1 (the official
+ default for HTTP protocol). Unfortunately, many non-English web
+ pages forget to include proper charset info; this option helps
+ you browse those broken pages if you know somehow what the
+ charset is. When the value given here or by an -assume_charset
+ command-line flag is in effect, Lynx will treat documents as if
+ they were encoded accordingly. Option is active when &ldquo;Raw
+ 8-bit or CJK Mode&rdquo; is OFF.</p>
+
+ <h3><a name="JK" id="JK">Raw 8-bit or CJK mode</a></h3>
+
+ <p>This is set automatically, but can be toggled manually in
+ certain cases: it toggles whether 8-bit characters are assumed to
+ correspond with the display character set and therefore are
+ processed without translation via the chartrans conversion
+ tables. ON by default when the display character set is one of
+ the Asian (CJK) sets and the 8-bit characters are Kanji
+ multibytes. OFF for the other display character sets, but can be
+ turned ON when the document's charset is unknown (e.g., is not
+ ISO-8859-1 and no charset parameter was specified in a reply
+ header from an HTTP server to indicate what it is), but you have
+ no better idea than viewing it as from display character set (see
+ &ldquo;assumed document character set&rdquo; for best choice).
+ Should be OFF when an Asian (CJK) set is selected but the
+ document is ISO-8859-1 or another &ldquo;assumed document
+ character set&rdquo;. The setting can also be toggled via the
+ RAW_TOGGLE command, normally mapped to &ldquo;@&rdquo;, and at
+ startup via the -raw switch.</p>
+
+ <h3><a name="DV" id="DV">X DISPLAY variable</a></h3>
+
+ <p>This option is only relevant to X Window users. It specifies
+ the DISPLAY (Unix) or DECW$DISPLAY (VMS) variable. It is picked
+ up automatically from the environment if it has been previously
+ set.</p>
+
+ <h2><a name="AP" id="AP">Document Appearance</a></h2>
+
+ <h3><a name="SC" id="SC">Show color</a></h3>
+
+ <p>This will be present if color support is available.</p>
+
+ <ul>
+ <li>If set to ON or ALWAYS, color mode will be forced on if
+ possible. If (n)curses color support is available but cannot be
+ used for the current terminal type, selecting ON is rejected
+ with a message.</li>
+
+ <li>If set to OFF or NEVER, color mode will be turned off.</li>
+
+ <li>ALWAYS and NEVER are not offered in anonymous accounts. If
+ saved to a &ldquo;.lynxrc&rdquo; file in non-anonymous
+ accounts, ALWAYS will cause Lynx to set color mode on at
+ startup if supported.</li>
+ </ul>
+
+ <p>If Lynx is built with slang, this is equivalent to having
+ included the -color command line switch or having the COLORTERM
+ environment variable set. If color support is provided by curses
+ or ncurses, this is equivalent to the default behavior of using
+ color when the terminal type supports it. If (n)curses color
+ support is available but cannot be used for the current terminal
+ type, the preference can still be saved but will have no
+ effect.</p>
+
+ <p>A saved value of NEVER will cause Lynx to assume a monochrome
+ terminal at start-up. It is similar to the -nocolor switch, but
+ (when the slang library is used) can be overridden with the
+ -color switch. If the setting is OFF or ON when the current
+ options are saved to a &ldquo;.lynxrc&rdquo; file, the default
+ start-up behavior is retained, such that color mode will be
+ turned on at startup only if the terminal info indicates that you
+ have a color-capable terminal, or (when slang is used) if forced
+ on via the -color switch or COLORTERM variable. This default
+ behavior always is used in anonymous accounts, or if the
+ &ldquo;option&rdquo;_save restriction is set explicitly. If for
+ any reason the start-up color mode is incorrect for your
+ terminal, set it appropriately on or off via this option.</p>
+
+ <h3><a name="CS" id="CS">Color style</a></h3>
+
+ <p>At startup, Lynx identifies the available color-style
+ configuration files in the same directory as its default ".lss"
+ file. At runtime, you can switch between these files using this
+ options-menu feature.</p>
+
+ <h3><a name="C0" id="C0">Default colors</a></h3>
+
+ <p>Depending on the default foreground and background colors
+ which your terminal uses, some color-styles would look better if
+ Lynx did not use those in combination with the style for the
+ background. Use this option to enable/disable the default-color
+ feature.</p>
+
+ <h3><a name="CL" id="CL">Show cursor for current link or
+ option</a></h3>
+
+ <p>Lynx normally hides the cursor by positioning it to the right
+ and if possible the very bottom of the screen, so that the
+ current link or OPTION is indicated solely by its highlighting or
+ color. If show cursor is set to ON, the cursor will be positioned
+ at the left of the current link or OPTION. This is helpful when
+ Lynx is being used with a speech or braille interface. It is also
+ useful for sighted users when the terminal cannot distinguish the
+ character attributes used to distinguish the current link or
+ OPTION from the others in the display.</p>
+
+ <h3><a name="UK" id="UK">Underline links</a></h3>
+
+ <p>Use underline-attribute rather than bold for links.</p>
+
+ <h3><a name="SS" id="SS">Show scrollbar</a></h3>
+
+ <p>This allows you to enable (show) or disable (hide) the
+ scrollbar on the right-margin of the display. This feature is
+ available with ncurses or slang libraries.</p>
+
+ <h3><a name="PU" id="PU">Pop-ups for select fields</a></h3>
+
+ <p>Lynx normally uses a pop-up window for the OPTIONs in form
+ SELECT fields when the field does not have the MULTIPLE attribute
+ specified, and thus only one OPTION can be selected. The use of
+ pop-up windows can be disabled by changing this setting to OFF,
+ in which case the OPTIONs will be rendered as a list of radio
+ buttons. Note that if the SELECT field does have the MULTIPLE
+ attribute specified, the OPTIONs always are rendered as a list of
+ checkboxes.</p>
+
+ <h3><a name="tagsoup" id="tagsoup">HTML error recovery</a></h3>
+
+ <p>Lynx often has to deal with invalid HTML markup. It always
+ tries to recover from errors, but there is no universally correct
+ way for doing this. As a result, there are two parsing modes:
+ "<dfn>SortaSGML</dfn>" attempts to enforce valid nesting of most
+ tags at an earlier stage of processing, while
+ "<dfn>TagSoup</dfn>" relies more on the HTML rendering stage to
+ mimic the behavior of some other browsers. You can also switch
+ between these modes with the CTRL-V key, and the default can be
+ changed in lynx.cfg or with the -tagsoup command line switch.</p>
+
+ <p>The "SortaSGML" mode will often appear to be more strict, and
+ makes some errors apparent that are otherwise unnoticeable. One
+ particular difference is the handling of block elements or
+ &lt;li&gt;..&lt;/li&gt; inside &lt;a
+ HREF="some.url"&gt;..&lt;/a&gt;. Invalid nesting like this may
+ turn anchors into hidden links which cannot be easily followed,
+ this is avoided in "TagSoup" mode. See the <a href=
+ "follow_help.html">help on following links by number</a> for more
+ information on hidden links. Often pages may be more readable in
+ "TagSoup" mode, but sometimes the opposite is true. Most
+ documents with valid HTML, and documents with only minor errors,
+ should be rendered the same way in both modes.</p>
+
+ <p>If you are curious about what goes on behind the scenes, but
+ find that the information from the -trace switch is just too
+ much, Lynx can be started with the -preparsed switch; going into
+ SOURCE mode (&ldquo;\&rdquo; key) and toggling the parsing mode
+ (with CTRL-V) should then show some of the differences.</p>
+
+ <h3><a name="BH" id="BH">Bad HTML messages</a></h3>
+
+ <p>Suppress or redirect Lynx's messages about "Bad HTML":</p>
+
+ <dl>
+ <dt>Ignore</dt>
+
+ <dd>do not warn; no details are written to the trace-file.</dd>
+
+ <dt>Add to trace-file</dt>
+
+ <dd>add the detailed warning message to the trace-file.</dd>
+
+ <dt>Add to LYNXMESSAGES</dt>
+
+ <dd>add the detailed warning message to the message page at
+ "LYNXMESSAGES:".</dd>
+
+ <dt>Warn, point to trace-file</dt>
+
+ <dd>show a warning message on the status line; the complete
+ message is written to the trace-file.</dd>
+ </dl>
+
+ <h3><a name="SI" id="SI">Show Images</a></h3>
+
+ <p>This option combines the effects of the &ldquo;*&rdquo; &amp;
+ &ldquo;[&rdquo; keys as follows:</p>
+
+ <pre>
+ <em>ignore</em> all images which lack an ALT= text string,
+ <em>show labels</em>, e.g. [INLINE] &mdash; see &ldquo;Verbose Images&rdquo; below &mdash; ,
+ <em>use links</em> for every image, enabling downloading.
+</pre>
+ <p>This option setting cannot be saved between sessions. See
+ <a href="../Lynx_users_guide.html#Images">Users Guide</a> &amp;
+ <em>lynx.cfg</em> for more details.</p>
+
+ <h3><a name="VB" id="VB">Verbose Images</a></h3>
+
+ <p>This allows you to replace [LINK], [INLINE] and [IMAGE]
+ &mdash; for images without ALT &mdash; with filenames: this can
+ be helpful by revealing which images are important &amp; which
+ are merely decoration, e.g. <em>button.gif</em>,
+ <em>line.gif</em>. See <a href=
+ "../Lynx_users_guide.html#Images">Users Guide</a> &amp;
+ <em>lynx.cfg</em> for more details.</p>
+
+ <h2><a name="HP" id="HP">Headers Transferred to Remote
+ Servers</a></h2>
+
+ <h3><a name="PM" id="PM">Personal Mail Address</a></h3>
+
+ <p>You may set your mail address here so that when mailing
+ messages to other people or mailing files to yourself, your email
+ address can be automatically filled in. Your email address will
+ also be sent to HTTP servers in a &ldquo;from:&rdquo; field.</p>
+
+ <h3><a name="PN" id="PN">Personal mail name</a></h3>
+
+ <p>This mail name will be included as the "X-Personal_Name" field
+ in any mail or comments that you send if that header has not been
+ disabled via the NO_ANONYMOUS_EMAIL definition in
+ <em>lynx.cfg</em>.</p>
+
+ <h3><a name="PW" id="PW">Password for anonymous ftp</a></h3>
+
+ <p>If this is blank, Lynx will use your personal mail address as
+ the anonymous ftp password. Though that is the convention, some
+ users prefer to use some other string which provides less
+ information. If the given value lacks a "@", Lynx also will use
+ your computer's hostname as part of the password. If both this
+ field and the personal mail address are blank, Lynx will use your
+ $USER environment variable, or "WWWuser" if even the environment
+ variable is unset.</p>
+
+ <h3><a name="PT" id="PT">Preferred media type</a></h3>
+
+ <p>When doing a GET, lynx lists the MIME types which it knows how
+ to present (the "Accept:" string). Depending on your system
+ configuration, the mime.types or other data given by the
+ GLOBAL_EXTENSION_MAP may include many entries that lynx really
+ does not handle. Use this option to select one of the built-in
+ subsets of the MIME types that lynx could list in the Accept.</p>
+
+ <dl>
+ <dt>Accept lynx's internal types</dt>
+
+ <dd>list only the types that are compiled into lynx.</dd>
+
+ <dt>Also accept lynx.cfg's types</dt>
+
+ <dd>lists types defined in lynx.cfg, e.g., the VIEWER and Cern
+ RULE or RULESFILE settings.</dd>
+
+ <dt>Also accept user's types</dt>
+
+ <dd>lists types from the PERSONAL_EXTENSION_MAP setting in
+ lynx.cfg</dd>
+
+ <dt>Also accept system's types</dt>
+
+ <dd>lists types from the GLOBAL_EXTENSION_MAP setting in
+ lynx.cfg</dd>
+
+ <dt>Accept all types</dt>
+
+ <dd>adds the types that are in lynx's built-in tables for
+ external programs that may be used to present a document.</dd>
+ </dl>
+
+ <h3><a name="PE" id="PE">Preferred encoding</a></h3>
+
+ <p>When doing a GET, lynx tells what types of compressed data it
+ can decompress (the "Accept-Encoding:" string). This is
+ determined by compiled-in support for decompression or external
+ decompression programs. Use this option to select none, one or
+ all of the supported decompression types.</p>
+
+ <h3><a name="PC" id="PC">Preferred Document Charset</a></h3>
+
+ <p>The character set you prefer if sets in addition to ISO-8859-1
+ and US-ASCII are available from servers. Use MIME notation (e.g.,
+ ISO-8859-2) and do not include ISO-8859-1 or US-ASCII, since
+ those values are always assumed by default. Can be a
+ comma-separated list, which may be interpreted by servers as
+ descending order of preferences; you can make your order of
+ preference explicit by using &ldquo;q factors&rdquo; as defined
+ by the HTTP protocol, for servers which understand it: e.g.,
+ <kbd>iso-8859-5, utf-8;q=0.8</kbd>.</p>
+
+ <h3><a name="PL" id="PL">Preferred Document Language</a></h3>
+
+ <p>The language you prefer if multi-language files are available
+ from servers. Use RFC 1766 tags, e.g., &ldquo;en&rdquo; English,
+ &ldquo;fr&rdquo; French. Can be a comma-separated list, and you
+ can use &ldquo;q factors&rdquo; (see previous help item): e.g.,
+ <kbd>da, en-gb;q=0.8, en;q=0.7</kbd> .</p>
+
+ <h3><a name="SA" id="SA">Send User-Agent header</a></h3>
+
+ <p>This controls whether the user-agent string will be sent.</p>
+
+ <h3><a name="UA" id="UA">User Agent header</a></h3>
+
+ <p>The header string which Lynx sends to servers to indicate the
+ User-Agent is displayed here. Changes may be disallowed via the
+ -restrictions switch. Otherwise, the header can be changed
+ temporarily to e.g., L_y_n_x/2.8.3 for access to sites which
+ discriminate against Lynx based on checks for the presence of
+ &ldquo;Lynx&rdquo; in the header. If changed during a Lynx
+ session, the default User-Agent header can be restored by
+ deleting the modified string in the Options Menu. Whenever the
+ User-Agent header is changed, the current document is reloaded,
+ with the no-cache flags set, on exit from Options Menu. Changes
+ of the header are not saved in the .lynxrc file.</p>
+
+ <p>Caveat: Netscape Communications Corp. (for example) claimed
+ that false transmissions of &ldquo;Mozilla&rdquo; as the
+ User-Agent are a copyright infringement, which would be
+ prosecuted. The <em>Options Menu</em> issues a warning about
+ possible copyright infringement whenever the header is changed to
+ one which does not include <strong>Lynx</strong> or
+ <strong>lynx</strong>.</p>
+
+ <h2><a name="LP" id="LP">Listing and Accessing Files</a></h2>
+
+ <h3><a name="PF" id="PF">Use Passive FTP</a></h3>
+
+ <p>This allows you to change whether Lynx uses passive ftp
+ connections.</p>
+
+ <h3><a name="FT" id="FT">FTP sort criteria</a></h3>
+
+ <p>This allows you to specify how files will be sorted within FTP
+ listings. The current options include
+ &ldquo;By&nbsp;Filename&rdquo;, &ldquo;By&nbsp;Size&rdquo;,
+ &ldquo;By&nbsp;Type&rdquo;, &ldquo;By&nbsp;Date&rdquo;.</p>
+
+ <h3><a name="LD" id="LD">List directory style</a></h3>
+
+ <p>Applies to Directory Editing. Files and directories can be
+ presented in the following ways:</p>
+
+ <dl>
+ <dt><em>Mixed style</em>: Files and directories are listed
+ together in alphabetical order.</dt>
+
+ <dt><em>Directories first</em>: Files and directories are
+ separated into 2 alphabetical lists: directories are listed
+ first.</dt>
+
+ <dt><em>Files first</em>: Files and directories are separated
+ into 2 alphabetical lists: files are listed first.</dt>
+ </dl>
+
+ <h3><a name="LO" id="LO">Local directory sort order</a></h3>
+
+ <p>Lynx also allows you to sort by the file attributes:</p>
+
+ <dl>
+ <dt>By name</dt>
+
+ <dd>by filename (the default)</dd>
+
+ <dt>By size</dt>
+
+ <dd>by file size, in descending order</dd>
+
+ <dt>By date</dt>
+
+ <dd>by file modification time, in descending order</dd>
+
+ <dt>By mode</dt>
+
+ <dd>by file protection</dd>
+
+ <dt>By type</dt>
+
+ <dd>by filename suffix, e.g., the text beginning with
+ &ldquo;.&rdquo;</dd>
+
+ <dt>By user</dt>
+
+ <dd>by file owner's user-id</dd>
+
+ <dt>By group</dt>
+
+ <dd>by file owner's group-id</dd>
+ </dl>
+
+ <h3><a name="DF" id="DF">Show dot files</a></h3>
+
+ <p>If display/creation of hidden (dot) files/directories is
+ enabled, you can turn the feature on or off via this setting.</p>
+
+ <h3><a name="PZ" id="PZ">Pause when showing message</a></h3>
+
+ <p>If set to "off", this overrides the INFOSECS setting in
+ lynx.cfg, to eliminate pauses when displaying informational
+ messages, like the "-nopause" command line option.</p>
+
+ <h3><a name="LL" id="LL">Execution links</a></h3>
+
+ <p>If set to &ldquo;ALWAYS ON&rdquo;, Lynx will locally execute
+ commands contained inside any links. This can be <strong>HIGHLY
+ DANGEROUS</strong>, so it is recommended that they remain
+ &ldquo;ALWAYS OFF&rdquo; or &ldquo;FOR LOCAL FILES
+ ONLY&rdquo;.</p>
+
+ <h3><a name="TX" id="TX">Show transfer rate</a></h3>
+
+ <p>This allows you to select the way in which Lynx shows its
+ progress in downloading large pages. It displays its progress in
+ the status line. These are the available selections:</p>
+
+ <ul>
+ <li>Do not show rate</li>
+
+ <li>Local directory sort order</li>
+
+ <li>Show dot files</li>
+
+ <li>Execution links</li>
+
+ <li>Pause when showing message</li>
+
+ <li>Show transfer rate</li>
+ </ul>
+
+ <h3><a name="MB" id="MB">Multi-bookmarks</a></h3>
+
+ <p>Manage multiple bookmark files:</p>
+
+ <ul>
+ <li>When OFF, the default bookmark file is used for the
+ &ldquo;v&rdquo;iew-bookmarks and &ldquo;a&rdquo;dd-bookmark
+ link commands.</li>
+
+ <li>If set to STANDARD, a menu of available bookmarks is always
+ invoked when you seek to view a bookmark file or add a link,
+ and you select the bookmark file by its letter token in that
+ menu.</li>
+
+ <li>If set to ADVANCED, you are instead prompted for the letter
+ of the desired bookmark file, but can enter &ldquo;=&rdquo; to
+ invoke the STANDARD selection menu, or RETURN for the default
+ bookmark file.</li>
+ </ul>
+
+ <h3><a name="BF" id="BF">Bookmark file</a></h3>
+
+ <p>Manage the default bookmark file:</p>
+
+ <ul>
+ <li>If non-empty and multi-bookmarks is OFF, it specifies your
+ default &ldquo;<a href="bookmark_help.html">Bookmark
+ file</a>&rdquo;.</li>
+
+ <li>If multi-bookmarks is STANDARD or ADVANCED, entering
+ &ldquo;B&rdquo; will invoke a menu in which you can specify
+ filepaths and descriptions of up to 26 bookmark files.</li>
+ </ul>
+
+ <p>The filepaths must be from your home directory and begin with
+ &ldquo;./&rdquo; if subdirectories are included (e.g.,
+ &ldquo;./BM/lynx_bookmarks.html&rdquo;).</p>
+
+ <p>Lynx will create bookmark files when you first
+ &ldquo;a&rdquo;dd a link, but any subdirectories in the filepath
+ must already exist.</p>
+
+ <h3><a name="AZ" id="AZ">Auto Session</a></h3>
+
+ <p>Lynx can save and restore useful information about your
+ browsing history. Use this setting to enable or disable the
+ feature.</p>
+
+ <h3><a name="SZ" id="SZ">Session file</a></h3>
+
+ <p>Define the file name where lynx will store user sessions. This
+ setting is used only when <em>Auto Session</em> is enabled.</p>
+
+ <h3><a name="VP" id="VP">Visited Pages</a></h3>
+
+ <p>This allows you to change the appearance of the <a href=
+ "visited_help.html">Visited Links Page</a> Normally it shows a
+ list, in reverse order of the pages visited. The popup menu
+ allows you these choices:</p>
+
+ <dl>
+ <dt><em>By First Visit</em>: The default appearance, shows the
+ pages based on when they were first visited. The list is shown
+ in reverse order, to make the current page (usually) at the top
+ of the list.</dt>
+
+ <dt><em>By First Visit Reversed</em> The default appearance,
+ shows the pages based on when they were first visited. The list
+ is shown in order, to make the current page (usually) at the
+ bottom of the list.</dt>
+
+ <dt><em>As Visit Tree</em> Combines the first/last visited
+ information, showing the list in order of the first visit, but
+ using the indentation level of the page immediately previous to
+ determine indentation of new entries. That gives a clue to the
+ order of visiting pages when moving around in the History or
+ Visited Pages lists.</dt>
+
+ <dt><em>By Last Visit</em> The default appearance, shows the
+ pages based on when they were last visited. The list is shown
+ in reverse order, to make the current page (usually) at the top
+ of the list.</dt>
+
+ <dt><em>By Last Visit Reversed</em> The default appearance,
+ shows the pages based on when they were last visited. The list
+ is shown in order, to make the current page (usually) at the
+ bottom of the list.</dt>
+ </dl>
+</body>
+</html>
diff --git a/lynx_help/keystrokes/other_help.html b/lynx_help/keystrokes/other_help.html
new file mode 100644
index 0000000..8202bd3
--- /dev/null
+++ b/lynx_help/keystrokes/other_help.html
@@ -0,0 +1,196 @@
+<!-- $LynxId: other_help.html,v 1.19 2021/07/01 21:02:38 tom Exp $ -->
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+ <meta name="generator" content=
+ "HTML Tidy for HTML5 for Linux version 5.6.0">
+ <title>Help on Miscellaneous Lynx Commands</title>
+ <link rev="made" href="mailto:lynx-dev@nongnu.org">
+ <meta http-equiv="Content-Type" content=
+ "text/html; charset=us-ascii">
+ <meta name="description" content=
+ "This is a table listing with brief descriptions miscellaneous Lynx commands, along with links to related topics">
+</head>
+<body>
+ <div class="nav">
+ <ul>
+ <li><a href="#command_list">Summary of Commands</a></li>
+ </ul>
+ </div>
+
+ <h2><a name="command_list" id="command_list">Summary of
+ Commands</a></h2>
+
+ <pre>
+ a - Places the link that you are currently positioned
+ on into a personal <a href=
+"bookmark_help.html">bookmark file</a>.
+
+ c - Allows you to send a mail message to the owner
+ or maintainer of the data that you are currently
+ viewing. In the case that no owner is known,
+ you cannot send a comment.
+
+ d - Downloads the file pointed to by the current link
+ and displays an option menu allowing the file to
+ be saved or transferred by configurable options.
+ Can also be used when positioned on a form SUBMIT
+ button to download the reply to a form submission.
+
+ e - Allows you to edit the current document if it is a
+ local file.
+
+ E - Allows you to edit the current link's URL (or ACTION) and
+ use that as a <em>goto</em> URL.
+
+ g - Allows you to enter any <a href=
+"http://www.ietf.org/rfc/rfc1738.txt">URL</a> or filename that
+ you wish to view, and then <em>goto</em> it.
+
+ G - Allows you to edit the current document's URL and use that
+ as a <em>goto</em> URL.
+
+ ? or H - Hypertext help to explain how to navigate in
+ <strong>Lynx</strong> and use its features.
+
+ i - Shows an index of files or subjects,
+ which may be changed in <em>lynx.cfg</em>.
+
+ j - Allows you to enter a short name to goto an URL,
+ if a jumps file has been defined. Press "?"
+ and ENTER to see the list of defined jump commands.
+
+ k - Shows a list of key mappings. Keys remapped in
+ "lynx.cfg" show up in this list.
+
+ l - Brings up a list of references (links) in the current
+ document, which can be used for rapid access to the
+ links in large documents.
+
+ m - Returns to the first screen and empties the
+ history stack.
+
+ p - Brings up a list of <a href=
+"print_help.html">print commands</a>.
+
+ o - Brings up a list of settable <a href=
+"option_help.html">options</a>.
+
+ q - Quits <strong>Lynx</strong>. (&ldquo;Q&rdquo; quits without asking)
+
+ / - Search for a string of characters in the current document
+ (case insensitive or case sensitive
+ depending on the <a href=
+"option_help.html">options</a> set).
+
+ s - Search through an external searchable indexed document.
+
+ n - Move to the next instance of a search string if you
+ have searched previously.
+
+ v - View a <a href=
+"bookmark_help.html">Bookmark file</a>.
+
+ V - Go to the <a href=
+"visited_help.html">Visited Links Page</a>
+
+ x - Force submission of form or link with no-cache.
+
+ z - Abort a network transfer in progress. If any partial
+ data has been transferred it will be displayed.
+
+ &lt;backspace&gt; - displays the <a href=
+"history_help.html">History Page</a>.
+
+ = - Show information about the file and link that you
+ are currently viewing.
+
+ \ - Toggles between viewing the HTML source of a
+ document and the rendered version of the document.
+
+ ! - Spawns your default operating system shell.
+
+ ' - Toggles "historical" vs minimal or valid comment parsing.
+ When historical, any close-angle-bracket will be treated
+ as a comment terminator, emulating the parsing bug in old
+ versions of Mosaic and Netscape, rather than validly
+ requiring pairs of two successive dashes to delimit
+ comments within the angle-brackets.
+
+ _ - Clears all authorization info for the current session. Can
+ be used when leaving one's terminal without ending the <strong>Lynx</strong>
+ session, to guard against someone else retrieving protected
+ documents with previously entered username/password info.
+ Note that any protected documents that are still in cache
+ can still be accessed.
+
+ ` - Toggles minimal or valid comment parsing. When minimal, any
+ two successive dashes followed by a close-angle-bracket will
+ be treated as a comment terminator, emulating the parsing bug
+ in Netscape v2.0. If historical comment parsing is set, that
+ will override minimal or valid comment parsing.
+
+ * - Toggles image_links mode on and off. When on, links will
+ be created for all images, including inlines.
+
+ @ - Toggles raw 8-bit translations or CJK mode on and off, only
+ for documents which does not specify character set explicitly.
+ Should be on when the document's charset matches the
+ display character set, and otherwise off so that 8-bit
+ characters will be translated by <strong>Lynx</strong> with respect to the
+ Assumed document charset, using approximations if necessary
+ (see <a href="option_help.html">options</a>).
+
+ [ - Toggles pseudo_inlines mode on and off. When on, inline
+ images which have no ALT string specified will have an
+ "[INLINE]" pseudo-ALT string inserted in the <strong>Lynx</strong> display.
+ When off, they will be treated as having ALT="" (i.e.,
+ they will be ignored). If image_links mode is toggled on,
+ the pseudo-ALT strings will be restored, to serve as links
+ to the inline images' sources.
+
+ ] - Sends a HEAD request for the current document or link. It
+ applies only to documents or links (or form submit buttons)
+ of http servers. A statusline message will notify you if
+ the context for this command was inappropriate. The HEAD
+ requests always are sent to the http server, i.e., <strong>Lynx</strong>
+ does not retrieve any previous server replies from its
+ cache. Note that for form submissions, http servers vary
+ in whether they will treat HEAD requests as valid and return
+ the CGI script's headers, or treat it as invalid and return
+ an error message.
+
+ " - Toggles valid or "soft" double-quote parsing. When soft,
+ a close-angle-bracket will serve as both a close-double-
+ quote and close-tag, emulating the parsing bug in old
+ versions of Mosaic and Netscape.
+
+ CTRL-R - Reloads the current document and resets the display.
+
+ CTRL-V - Switches to an alternative way of parsing HTML documents.
+ This may help to get a more readable rendering of some
+ documents with invalidly placed HTML tags, <a href=
+"option_help.html#tagsoup">more details</a>.
+
+ CTRL-W - Resets or cleans up the display.
+
+ CTRL-U - Clears text from an input field or prompt.
+
+ CTRL-G - Cancels any input prompt, mail message or data transfer.
+
+ CTRL-T - Toggles trace mode on and off.
+
+ ; - Views the <em>Lynx Trace Log</em> for the current session.
+
+ CTRL-K - Invokes the Cookie Jar Page.
+
+ numbers - <strong>Lynx</strong> offers other, advanced navigation features when
+ numbers are used to invoke the
+ <a href=
+"follow_help.html">Follow link (or goto link or page) number:</a> or
+ <a href=
+"follow_help.html#select-option">Select option (or page) number:</a>
+ prompts.
+</pre>
+</body>
+</html>
diff --git a/lynx_help/keystrokes/print_help.html b/lynx_help/keystrokes/print_help.html
new file mode 100644
index 0000000..fb7738e
--- /dev/null
+++ b/lynx_help/keystrokes/print_help.html
@@ -0,0 +1,62 @@
+<!-- $LynxId: print_help.html,v 1.10 2021/07/01 21:02:38 tom Exp $ -->
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+ <meta name="generator" content=
+ "HTML Tidy for HTML5 for Linux version 5.6.0">
+ <title>Lynx Print Help and Configuration Summary</title>
+ <link rev="made" href="mailto:lynx-dev@nongnu.org">
+ <meta http-equiv="Content-Type" content=
+ "text/html; charset=us-ascii">
+ <meta name="description" content=
+ "Describe Lynx's print command, showing the different ways that a document's content can be saved as plain text, e.g., mail, local-file, user-defined.">
+</head>
+<body>
+ <div class="nav">
+ <ul>
+ <li><a href="#overview">Overview</a></li>
+
+ <li><a href="#command_options">Print-command Options</a></li>
+ </ul>
+ </div>
+
+ <h2><a name="overview" id="overview">Overview</a></h2>
+
+ <p>After entering the <code><strong>p</strong></code> command you
+ will be presented with a list of print options. In all cases the
+ file will be printed in ASCII format with the hypertext links
+ removed. The number of options depends on the level of printing
+ that your system allows.</p>
+
+ <h2><a name="command_options" id="command_options">Print-command
+ Options</a></h2>
+
+ <p>The following print options may be available:</p>
+
+ <dl>
+ <dt>Print to a local file:</dt>
+
+ <dd>This allows you to save the current file as ASCII text to
+ your local disk. You will be asked for a path and filename to
+ save the file to. If no path is given, the file will be saved
+ to the directory that you were in when you began
+ <strong>Lynx</strong>.</dd>
+
+ <dt>Print to the screen:</dt>
+
+ <dd>This option simply scrolls the entire document up the
+ screen and is intended for those who wish to capture the
+ document with their terminal.</dd>
+
+ <dt>Mail the file to yourself:</dt>
+
+ <dd>This option allows you to mail the file, in ASCII form, to
+ any valid e-mail address.</dd>
+
+ <dt>Custom print options:</dt>
+
+ <dd>Any number of custom print options may be defined in
+ <em>lynx.cfg</em>.</dd>
+ </dl>
+</body>
+</html>
diff --git a/lynx_help/keystrokes/scrolling_help.html b/lynx_help/keystrokes/scrolling_help.html
new file mode 100644
index 0000000..b6f086b
--- /dev/null
+++ b/lynx_help/keystrokes/scrolling_help.html
@@ -0,0 +1,117 @@
+<!-- $LynxId: scrolling_help.html,v 1.13 2021/07/01 21:02:38 tom Exp $ -->
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+ <meta name="generator" content=
+ "HTML Tidy for HTML5 for Linux version 5.6.0">
+ <title>Lynx Scrolling/Paging Help Summary</title>
+ <link rev="made" href="mailto:lynx-dev@nongnu.org">
+ <meta http-equiv="Content-Type" content=
+ "text/html; charset=us-ascii">
+ <meta name="description" content=
+ "This gives an overview and some details on Lynx's scrolling/paging commands. A diagram shows keypad shortcuts.">
+</head>
+<body>
+ <div class="nav">
+ <ul>
+ <li><a href="#overview">Overview</a></li>
+
+ <li><a href="#paging_keys">Paging shortcuts</a></li>
+
+ <li><a href="#keypad_keys">Keypad shortcuts</a></li>
+
+ <li><a href="#control_keys">Control-characters</a></li>
+
+ <li><a href="#other_keys">Ordinary characters</a></li>
+ </ul>
+ </div>
+
+ <h2><a name="overview" id="overview">Overview</a></h2>
+
+ <p>This gives an overview and some details on Lynx's
+ scrolling/paging commands. A diagram shows keypad shortcuts.</p>
+
+ <h2><a name="paging_keys" id="paging_keys">Paging shortcuts</a></h2>
+
+ <blockquote>
+ <pre>
+ + (or SPACE, - If the bottom of the screen informs you
+ or CTRL-F) that there is &ldquo;more&rdquo; to see, you may
+ move to the next page (Page-Down).
+
+ - (or b, - If you have moved down in a document, this
+ or CTRL-B) will bring you back up one page (Page-Up).
+</pre>
+ </blockquote>
+
+ <h2><a name="keypad_keys" id="keypad_keys">Keypad shortcuts</a></h2>
+
+ <p><strong>Lynx</strong> can use the digits 0-9 as movement
+ shortcuts. They are designed to work best when the <em>Num
+ Lock</em> on your keyboard is on, so that <strong>Lynx</strong>
+ can translate the numbers of your keypad into <a href=
+ "movement_help.html">movement commands</a>:</p>
+
+ <blockquote>
+ <pre>
+ 9 - page up
+ 8 - up arrow
+ 7 8 9 7 - moves to the top of a document
+ \|/ 6 - right arrow
+ 4 - 5 - 6 5 - nothing
+ /|\ 4 - left arrow
+ 1 2 3 3 - page down
+ 2 - down arrow
+ 1 - moves to the end of a document
+</pre>
+ </blockquote>
+
+ <h2><a name="control_keys" id=
+ "control_keys">Control-characters</a></h2>
+
+ <blockquote>
+ <pre>
+ CTRL-A (or Find) - This Control key, and Function key synonym,
+ brings you back to the first page of the
+ current document (Home).
+
+ CTRL-E (or Select) - This Control key, and Function key synonym,
+ takes you to the last page of the current
+ document (End).
+
+ CTRL-N (or Remove) - This Control key, and Function key synonym,
+ moves you forward two lines in the current
+ document (Down-Two).
+
+ CTRL-P (or Insert) - This Control key, and Function key synonym,
+ moves you back two lines in the current
+ document (Up-Two).
+</pre>
+ </blockquote>
+
+ <h2><a name="other_keys" id="other_keys">Ordinary characters</a></h2>
+
+ <blockquote>
+ <pre>
+ ) - Moves you forward half a page in the current
+ document (Down-Half).
+
+ ( - Moves you back half a page in the current
+ document (Up-Half).
+
+ ^ - Go to the first link on the current line.
+
+ $ - Go to the last link on the current line.
+
+ &lt; - Go to the previous link in the current column.
+
+ &gt; - Go to the next link in the current column.
+
+ # - Jumps you to the pseudo Toolbar or Banner if
+ present in the current document. Use left-arrow
+ to return from there to your previous position
+ in the document.
+</pre>
+ </blockquote>
+</body>
+</html>
diff --git a/lynx_help/keystrokes/test_display.html b/lynx_help/keystrokes/test_display.html
new file mode 100644
index 0000000..adbe3ef
--- /dev/null
+++ b/lynx_help/keystrokes/test_display.html
@@ -0,0 +1,82 @@
+<!-- $LynxId: test_display.html,v 1.12 2021/07/01 21:02:38 tom Exp $ -->
+<!-- do not use tidy for this page -->
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+ <meta name="generator" content=
+ "HTML Tidy for HTML5 for Linux version 5.6.0">
+ <title>Quick test for identifying display character set</title>
+ <link rev="made" href="mailto:lynx-dev@nongnu.org">
+ <meta http-equiv="Content-Type" content=
+ "text/html; charset=us-ascii">
+ <meta name="description" content=
+ "Display a test-page for common problems with Lynx's display character set and/or locale problems.">
+</head>
+<body>
+ <div class="nav">
+ <ul>
+ <li><a href="#overview">Overview</a></li>
+
+ <li><a href="#configuration">Configuration</a></li>
+
+ <li><a href="#test_screen">Test-screen</a></li>
+ </ul>
+ </div>
+
+ <h2><a name="overview" id="overview">Overview</a></h2>
+
+ <p>Display a test-page for common problems with Lynx's display
+ character set and/or locale problems.</p>
+
+ <h2><a name="configuration" id="configuration">Configuration</a></h2>
+
+ <p>If you see several letters instead of a single &ndash; your
+ promised display charset does not support this character so "7
+ bit approximation" is in effect. If you see any single letter
+ which is unexpected, you have incorrect <strong>Lynx</strong>
+ settings.</p>
+
+ <blockquote>
+ <p><em>Press &ldquo;o&rdquo; for Options menu and change
+ "Display character set"</em>.<br>
+ Try again if necessary.</p>
+ </blockquote>
+
+ <p>When you are satisfied save your changes in Options menu,
+ thanks.</p>
+
+ <h2><a name="test_screen" id="test_screen">Test-screen</a></h2>
+
+ <p>This is only a quick test to see obvious problems.</p>
+
+ <pre>
+
+0x00A9 &copy; # COPYRIGHT SIGN
+
+0x00C7 &Ccedil; # LATIN CAPITAL LETTER C WITH CEDILLA
+
+0x00DC &Uuml; # LATIN CAPITAL LETTER U WITH DIAERESIS
+
+0x00D1 &Ntilde; # LATIN CAPITAL LETTER N WITH TILDE
+
+0x0107 &#263; # LATIN SMALL LETTER C WITH ACUTE
+0x0108 &#264; # LATIN CAPITAL LETTER C WITH CIRCUMFLEX
+0x010C &#268; # LATIN CAPITAL LETTER C WITH CARON
+
+0x03BB &lambda; # GREEK SMALL LETTER LAMDA
+
+0x041B &#1051; # CYRILLIC CAPITAL LETTER EL
+0x042E &#1070; # CYRILLIC CAPITAL LETTER YU
+0x043B &#1083; # CYRILLIC SMALL LETTER EL
+0x044E &#1102; # CYRILLIC SMALL LETTER YU
+
+0x2026 &hellip; # HORIZONTAL ELLIPSIS
+0x2122 &trade; # TRADE MARK SIGN
+
+0x255D &#9565; # BOX DRAWINGS DOUBLE UP AND LEFT
+0x255E &#9566; # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+
+0xFB01 &#64257; # LATIN SMALL LIGATURE FI
+</pre>
+</body>
+</html>
diff --git a/lynx_help/keystrokes/visited_help.html b/lynx_help/keystrokes/visited_help.html
new file mode 100644
index 0000000..14a83c1
--- /dev/null
+++ b/lynx_help/keystrokes/visited_help.html
@@ -0,0 +1,63 @@
+<!-- $LynxId: visited_help.html,v 1.12 2021/07/01 21:02:38 tom Exp $ -->
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+ <meta name="generator" content=
+ "HTML Tidy for HTML5 for Linux version 5.6.0">
+ <title>Help on the Visited Links Page</title>
+ <link rev="made" href="mailto:lynx-dev@nongnu.org">
+ <meta http-equiv="Content-Type" content=
+ "text/html; charset=us-ascii">
+ <meta name="description" content=
+ "Lynx provides an alternative to its history page, the visited-links page which highlights those which are of most interest.">
+</head>
+<body>
+ <div class="nav">
+ <ul>
+ <li><a href="#overview">Overview</a></li>
+
+ <li><a href="#navigation">Navigation</a></li>
+
+ <li><a href="#configuration">Configuration</a></li>
+ </ul>
+ </div>
+
+ <h2><a name="overview" id="overview">Overview</a></h2>
+
+ <p><strong>Lynx</strong>'s <em>Visited Links Page</em> displays
+ all of the links that you have traveled through during the
+ current Lynx session, except for any temporary menu or list
+ files, bookmark files, or any documents associated with POST
+ content. The VLINKS keystroke command for invoking this page
+ normally is mapped to uppercase &ldquo;<em>V</em>&rdquo;. The
+ list of Visited Links is normally in order of recency (most
+ recently visited links first), without repetitions in the list if
+ a link was visited more than once during the session (unless the
+ URLs differ due to appended fragments), and is supplementary to
+ the <a href="history_help.html">History Page</a>.</p>
+
+ <h2><a name="navigation" id="navigation">Navigation</a></h2>
+
+ <p>You may <a href="movement_help.html">select</a> any link on
+ the Visited Links Page to retrieve a document that you had
+ previously visited, or you can use this list to save such links
+ in your <a href="bookmark_help.html">bookmark files</a>, or to
+ <a href="../Lynx_users_guide.html#RemoteSource">Download</a>
+ them.</p>
+
+ <p>In contrast to the History Page, the Visited Links Page
+ includes any links which were retrieved for
+ &ldquo;<em>d</em>&rdquo;ownloading or were passed to helper
+ applications, i.e., not just the links that were rendered and
+ displayed by Lynx, itself.</p>
+
+ <h2><a name="configuration" id="configuration">Configuration</a></h2>
+
+ <p>You may change the appearance of the Visited Links Page via a
+ popup menu on that page (which also appears on the <a href=
+ "option_help.html#VP">Options Menu</a>). The menu allows you to
+ choose whether to view the list ordered by the first or last
+ visit, forward or reversed &ndash; or a mixture (a tree
+ structure).</p>
+</body>
+</html>
diff --git a/lynx_help/keystrokes/xterm_help.html b/lynx_help/keystrokes/xterm_help.html
new file mode 100644
index 0000000..84ac3df
--- /dev/null
+++ b/lynx_help/keystrokes/xterm_help.html
@@ -0,0 +1,52 @@
+<!-- $LynxId: xterm_help.html,v 1.11 2021/07/01 21:02:38 tom Exp $ -->
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+ <meta name="generator" content=
+ "HTML Tidy for HTML5 for Linux version 5.6.0">
+ <title>X Terminal Help</title>
+ <link rev="made" href="mailto:lynx-dev@nongnu.org">
+ <meta http-equiv="Content-Type" content=
+ "text/html; charset=us-ascii">
+ <meta name="description" content=
+ "This outlines what is meant by an X terminal, for gopher support, i.e., something which can display images">
+</head>
+<body>
+ <div class="nav">
+ <ul>
+ <li>X Terminal Help</li>
+
+ <li>Notes</li>
+ </ul>
+ </div>
+
+ <h2>X Terminal Help</h2>
+
+ <p>An X terminal is an electronic display terminal that
+ communicates with a host computer system using the X Window
+ protocol developed at the Massachusetts Institute of
+ Technology.</p>
+
+ <p>The X Window protocol allows a program running on the host
+ computer system to display both formatted text and graphics on
+ the X terminal. Since the X Window protocol is defined to work
+ over any TCP/IP network, X terminals connected to the Internet
+ can be connected to hosts located anywhere on the Internet.</p>
+
+ <p>Personal computers (including both PCs and Macintoshes) can
+ execute programs, usually called X servers, that make them act
+ like X Window terminals and are frequently used as X
+ terminals.</p>
+
+ <h2>Notes</h2>
+
+ <dl>
+ <dt>Terminology</dt>
+
+ <dd>The terminology used to describe processes associated with
+ X terminals can be confusing. An X terminal is also known as an
+ "X display server," and the program running on the host
+ computer is usually known as the "X client."</dd>
+ </dl>
+</body>
+</html>
diff --git a/lynx_help/lynx-dev.html b/lynx_help/lynx-dev.html
new file mode 100644
index 0000000..ebf417c
--- /dev/null
+++ b/lynx_help/lynx-dev.html
@@ -0,0 +1,101 @@
+<!-- $LynxId: lynx-dev.html,v 1.20 2021/07/01 21:02:17 tom Exp $ -->
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+ <meta name="generator" content=
+ "HTML Tidy for HTML5 for Linux version 5.6.0">
+ <title>Lynx-Dev Discussion List</title>
+ <link rev="made" href="mailto:lynx-dev@nongnu.org">
+ <meta http-equiv="Content-Type" content=
+ "text/html; charset=us-ascii">
+ <meta name="description" content=
+ "Summarizes the Lynx development, provides links to the development site and mailing list. The mailing list is moderated and archived.">
+</head>
+<body>
+ <blockquote>
+ <p>[ <a href=
+ "http://mail.gnu.org/mailman/listinfo/lynx-dev/">Lynx-Dev
+ Archive</a> | <a href="about_lynx.html">About Lynx</a> ]</p>
+ </blockquote>
+
+ <h2>The Lynx Development Process</h2>
+
+ <p><strong>Lynx</strong> is maintained and improved by an
+ international co-operative of volunteers. Newcomers are welcome
+ to join the group: you need not be a super programmer, but you
+ should be prepared to listen and learn, as well as to contribute
+ patches if you can. Since everyone is a volunteer, you will
+ usually be expected to try to implement any suggestions you
+ make.</p>
+
+ <h2>Lynx-Dev Discussion List</h2>
+
+ <p>The developers communicate through a mailing list &mdash; see
+ below for details &mdash; which is open to interested users as
+ well as programmers. Topics include fixing bugs, increasing
+ <strong>Lynx</strong>'s tools and powers, meeting the
+ ever-changing demands of the Internet and porting
+ <strong>Lynx</strong> to new systems.</p>
+
+ <p>Anyone may read what has been said on the list by visiting
+ <a href="http://mail.gnu.org/mailman/listinfo/lynx-dev/">the
+ Archive</a>.</p>
+
+ <h2>Development Versions of Lynx</h2>
+
+ <p>Besides <em>releases</em>, which are stable versions of
+ <strong>Lynx</strong> which come out once or twice a year and can
+ be obtained from <a href=
+ "https://lynx.invisible-island.net/release/">the release
+ site</a>, there are <em>development</em> versions, which are
+ experimental &mdash; though usually stable enough to use &mdash;
+ and appear every few weeks, depending on current activity.</p>
+
+ <p>You can find the latest <em>development</em> version of
+ <strong>Lynx</strong> by visiting <a href=
+ "https://lynx.invisible-island.net/current/">the development
+ site</a>.</p>
+
+ <h2>Subscribing to Lynx-Dev</h2>
+
+ <p>If you are interested in joining the <strong>Lynx</strong>
+ mailing list, send e-mail to <a href=
+ "mailto:lynx-dev-request@nongnu.org?subject=subscribe">&nbsp;lynx-dev-request@nongnu.org</a>
+ with "subscribe" as the subject line.</p>
+
+ <p>You will need to answer one follow-up question to confirm you
+ want to subscribe. Mailman will then enroll you and send all
+ messages which you address to <em>lynx-dev@nongnu.org</em> to all
+ subscribers; you will also receive all messages sent by other
+ subscribers.</p>
+
+ <h2>Unsubscribing from Lynx-Dev</h2>
+
+ <p>To <em>unsubscribe</em>, send an e-mail to <a href=
+ "mailto:lynx-dev-request@nongnu.org?subject=unsubscribe">&nbsp;lynx-dev-request@nongnu.org</a>
+ with "unsubscribe" as the subject line.</p>
+
+ <h2>Casual Inquiries</h2>
+
+ <p>Anyone may ask a question or offer a comment by sending e-mail
+ to <a href="mailto:lynx-dev@nongnu.org">&nbsp;the list</a>. Since
+ all subscribers are volunteers, you depend on their goodwill and
+ will be more likely to get a response if you give the e-mail a
+ meaningful &ldquo;Subject&rdquo; and include details of your
+ version of <strong>Lynx</strong>, hardware and software. You can
+ check the Archive to find any responses.</p>
+
+ <p>Messages from non-subscribers are not immediately distributed
+ to avoid spam. Usually, if your message appears genuine, it will
+ be retrieved from the pile headed for the wastebasket within a
+ day or so and distributed to the list. For best results,
+ subscribe as described above.</p>
+
+ <h2>The Lynx-Dev Archive</h2>
+
+ <p>Messages posted to lynx-dev are archived in html format so
+ that you can view them using <strong>Lynx</strong>: go to the
+ <a href="http://mail.gnu.org/mailman/listinfo/lynx-dev/">Mail
+ Archive</a>.</p>
+</body>
+</html>
diff --git a/lynx_help/lynx_help_main.html b/lynx_help/lynx_help_main.html
new file mode 100644
index 0000000..f24878e
--- /dev/null
+++ b/lynx_help/lynx_help_main.html
@@ -0,0 +1,180 @@
+<!-- $LynxId: lynx_help_main.html,v 1.56 2021/07/01 21:02:17 tom Exp $ -->
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+ <meta name="generator" content=
+ "HTML Tidy for HTML5 for Linux version 5.6.0">
+ <title>The Lynx Help Page &ndash; quick-links and detailed
+ documentation</title>
+ <link rev="made" href="mailto:lynx-dev@nongnu.org">
+ <meta http-equiv="Content-Type" content=
+ "text/html; charset=us-ascii">
+ <meta name="description" content=
+ "This is the top-level page for Lynx's help-files, quick links, external resources and detailed user-documentation.">
+</head>
+<body>
+ <h2>Lynx help files (usually in your local directories):</h2>
+
+ <p>These <strong>Lynx</strong> documents are part of your local
+ configuration:</p>
+
+ <ul>
+ <li><a href="Lynx_users_guide.html">Lynx Users Guide</a>
+ &mdash; complete account of all Lynx features</li>
+
+ <li><a href="keystrokes/keystroke_help.html">Key-stroke
+ Commands</a> &mdash; quick outline of what various keys do</li>
+
+ <li><a href="keystrokes/edit_help.html">Line Editor</a> &mdash;
+ when entering URLs etc</li>
+
+ <li><a href="lynx_url_support.html">Supported URLs</a> &mdash;
+ how Lynx handles various types of URL</li>
+
+ <li><a href="about_lynx.html">About Lynx</a> &mdash; credits,
+ copyright etc</li>
+
+ <li><a href="lynx-dev.html">About Lynx-Dev</a> &mdash; the
+ developers &amp; how to contact them</li>
+ </ul>
+
+ <h2>Other sources of Lynx help:</h2>
+
+ <p>The <strong>Lynx</strong> configuration guide may also be
+ local.</p>
+
+ <ul>
+ <li><a href=
+ "https://lynx.invisible-island.net/release/breakout/lynx_help/cattoc.html">
+ lynx.cfg options</a> &mdash; a reference for advanced
+ configurations</li>
+
+ <li><a href=
+ "https://lynx.invisible-island.net/release/breakout/docs/">lynx
+ documentation</a> &mdash; supplementary documentation</li>
+
+ <li><a href=
+ "http://www.chass.utoronto.ca/%7Epurslow/lhfb.html">Lynx Help
+ for Beginners</a> &mdash; quick help on many common
+ problems</li>
+
+ <li><a href="http://leb.net/blinux/blynx/">Blynx</a> &mdash;
+ Speech-Friendly Help for the visually impaired</li>
+ </ul>
+
+ <h2>World Wide Web Consortium documents:</h2>
+
+ <ul>
+ <li>HTML &mdash; <a href="http://www.w3.org/TR/html51/">5.1</a>
+ &mdash; <a href="http://www.w3.org/TR/REC-html40/">4.0</a>
+ &mdash; <a href="http://www.w3.org/TR/REC-html32">3.2</a>
+ &mdash; <a href=
+ "http://www.w3.org/MarkUp/html3/Contents.html">3.0</a> &mdash;
+ <a href=
+ "http://www.w3.org/MarkUp/html-spec/html-spec_toc.html">2.0</a></li>
+
+ <li>HTTP &mdash; <a href="http://www.w3.org/Protocols/">1.1</a>
+ &mdash; <a href=
+ "http://www.isi.edu/in-notes/rfc1945.txt">1.0</a></li>
+
+ <li>XHTML &mdash; <a href=
+ "http://www.w3.org/TR/xhtml1/">1.0</a></li>
+
+ <li><a href="http://www.w3.org/Addressing/">Web Naming &amp;
+ Addressing Overview: URIs, URLs etc</a></li>
+
+ <li><a href="http://www.w3.org/International/">HTML
+ Internationalization</a></li>
+
+ <li><a href="http://www.w3.org/">WWW Consortium: home page</a></li>
+ </ul>
+
+ <h2>Help with HTML:</h2>
+
+ <ul>
+ <li><a href="http://www.htmlhelp.com/reference/html40/">HTML
+ 4.0 Reference</a></li>
+
+ <li><a href=
+ "http://www.w3schools.com/html/default.asp">W3Schools</a></li>
+
+ <li><a href="http://www.htmlgoodies.com/primers/html/">HTML
+ Goodies</a></li>
+
+ <li><a href="http://www.htmlcodetutorial.com/">HTML Code
+ Tutorial</a></li>
+
+ <li><a href=
+ "http://www.simplehtmlguide.com/cheatsheet.php">HTML Cheat
+ Sheet &ndash; A Simple Guide to HTML</a></li>
+ </ul>
+
+ <h2>HTML validation services:</h2>
+
+ <ul>
+ <li><a href="http://validator.w3.org/">W3C HTML Validation
+ Service</a></li>
+
+ <li><a href="http://www.htmlhelp.com/tools/validator/">WDG HTML
+ Validator</a></li>
+ </ul>
+
+ <h2>Other browsing software:</h2>
+
+ <ul>
+ <li><a href="http://wget.addictivecode.org/">GNU wget</a>
+ &mdash; powerful &amp; flexible non-interactive downloader</li>
+
+ <li><a href="http://www.pavuk.org/">Pavuk</a> &mdash; powerful
+ &amp; an even more-featured downloader</li>
+
+ <li><a href="http://curl.haxx.se/">cURL</a> &mdash;
+ non-interactive downloader which supports HTTPS</li>
+
+ <li><a href="http://www.xach.com/snarf/">snarf</a> &mdash;
+ small simple 1-file non-interactive downloader</li>
+ </ul>
+
+ <h2>Historical interest</h2>
+
+ <ul>
+ <li><a href=
+ "http://web.archive.org/web/2005050785333/http://archive.ncsa.uiuc.edu/SDG/Software/Mosaic/MetaIndex.html">
+ NCSA Mosaic</a></li>
+ </ul>
+
+ <h2>Search engines:</h2>
+
+ <p>These work with <strong>Lynx</strong> as of 2014/01/10:</p>
+
+ <ul>
+ <li><a href="http://www.ask.com/">Ask.com</a></li>
+
+ <li><a href="http://www.baidu.com/">Baidu</a> (Chinese)</li>
+
+ <li><a href="http://www.bing.com/">Bing</a></li>
+
+ <li><a href="http://www.dogpile.com/">Dogpile</a></li>
+
+ <li><a href="http://labs.goo.ne.jp/">goo</a> (Japanese)</li>
+
+ <li><a href="http://www.google.com/">Google</a></li>
+
+ <li><a href="http://hakia.com/">Hakia</a></li>
+
+ <li><a href="http://www.icerocket.com/">IceRocket</a></li>
+
+ <li><a href="http://www.indeed.com/">Indeed</a></li>
+
+ <li><a href="http://www.lexxe.com/">Lexxe</a></li>
+
+ <li><a href="http://www.rambler.ru/">Rambler</a> (Russian)</li>
+
+ <li><a href="http://www.search.com/">Search.com</a></li>
+
+ <li><a href="http://www.webcrawler.com/">WebCrawler</a></li>
+
+ <li><a href="http://www.yahoo.com/">Yahoo!</a></li>
+ </ul>
+</body>
+</html>
diff --git a/lynx_help/lynx_url_support.html b/lynx_help/lynx_url_support.html
new file mode 100644
index 0000000..52ba2fb
--- /dev/null
+++ b/lynx_help/lynx_url_support.html
@@ -0,0 +1,796 @@
+<!-- $LynxId: lynx_url_support.html,v 1.37 2021/07/01 21:02:17 tom Exp $ -->
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+ <meta name="generator" content=
+ "HTML Tidy for HTML5 for Linux version 5.6.0">
+ <title>URL Schemes Supported in Lynx</title>
+ <link rev="made" href="mailto:lynx-dev@nongnu.org">
+ <meta http-equiv="Content-Type" content=
+ "text/html; charset=us-ascii">
+ <meta name="description" content=
+ "Enumerate, describe and provide examples of Lynx's URL support on Unix and VMS. Lynx supports both Web standards and extensions.">
+</head>
+<body>
+ <blockquote>
+ <p><em>[</em><a href="#http_url">http, https</a> <em>|</em>
+ <a href="#telnet_url">telnet, tn3270, rlogin</a> <em>|</em>
+ <a href="#gopher_url">gopher</a> <em>|</em> <a href=
+ "#file_url">file</a> <em>|</em> <a href="#ftp_url">ftp</a>
+ <em>|</em> <a href="#wais_url">wais</a> <em>|</em> <a href=
+ "#news_url">news, nntp, snews</a> <em>|</em> <a href=
+ "#newspost_url">newspost, newsreply, snewspost, snewsreply</a>
+ <em>|</em> <a href="#mailto_url">mailto</a> <em>|</em> <a href=
+ "#finger_url">finger</a> <em>|</em> <a href="#cso_url">cso</a>
+ <em>|</em> <a href="#bibp_url">bibp</a> <em>|</em> <a href=
+ "#exec_url">lynxexec, lynxprog</a> <em>|</em> <a href=
+ "#cgi_url">lynxcgi</a><em>|</em> <a href="#ncftp_url">NcFTP</a>
+ <em>|</em> <a href="#internal_url">internal</a><em>]</em></p>
+ </blockquote>
+
+ <h1><em>URL Schemes Supported in Lynx</em>
+ </h1>
+
+ <p><strong>Lynx</strong> handles a number of URL types, that are
+ enumerated below. For more details about URLs (Uniform Resource
+ Locators) see <em>RFC1738</em>:</p>
+
+ <ul>
+ <li><a href=
+ "http://www.w3.org/Addressing/rfc1738.txt">http://www.w3.org/Addressing/rfc1738.txt</a></li>
+
+ <li><a href=
+ "ftp://ftp.rfc-editor.org/in-notes/rfc1738.txt">ftp://ftp.rfc-editor.org/in-notes/rfc1738.txt</a></li>
+ </ul>
+
+ <p><strong>Lynx</strong> resolves partial or relative URLs in
+ documents with respect to the BASE if one was specified,
+ otherwise with respect to the document's absolute URL, using the
+ rules described in <em>RFC1808</em>:</p>
+
+ <ul>
+ <li><a href=
+ "http://www.w3.org/Addressing/rfc1808.txt">http://www.w3.org/Addressing/rfc1808.txt</a></li>
+
+ <li><a href=
+ "ftp://ftp.rfc-editor.org/in-notes/rfc1808.txt">ftp://ftp.rfc-editor.org/in-notes/rfc1808.txt</a></li>
+ </ul>
+
+ <p>and in subsequent drafts of the <em>IETF</em>:</p>
+
+ <ul>
+ <li><a href=
+ "https://web.archive.org/web/20130116065936/http://ftp.ics.uci.edu/pub/ietf/uri/">
+ Uniform Resource Identifiers (URI) Working Group</a></li>
+ </ul>
+
+ <p>When entering a URL on the command line to be used as the
+ <em>startfile</em>, or at the prompt for a
+ &ldquo;<em>g</em>&rdquo;oto entry, a partial host field can be
+ used and the scheme field can be omitted if the scheme and fully
+ qualified domain name can be constructed internally by using the
+ URL_DOMAIN_PREFIXES and URL_DOMAIN_SUFFIXES definitions in the
+ <strong>Lynx</strong> configuration file. See the explanation of
+ those definitions and their use in your <em>lynx.cfg</em>.</p>
+
+ <p>For example, <em>wfbr</em> will be treated as
+ <em>http://www.wfbr.edu/</em>, and <em>wfbr/dir/lynx</em> will be
+ treated as <em>http://www.wfbr.edu/dir/lynx</em>, but
+ <em>gopher.wfbr.edu/11/_fileserv/_lynx</em> will be treated as
+ <em>gopher://gopher.wfbr.edu/11/_fileserv/_lynx</em>.</p>
+
+ <p>For files or directories on the local host, a tilde
+ (<em>~</em>) is expanded to the path of the account's login
+ directory, e.g., <em>~/foo</em> will be expanded to
+ <em>file://localhost/your/login/directory/foo</em>. The tilde
+ expansion is done homologously on Unix and VMS.</p>
+
+ <p>On VMS, <strong>Lynx</strong> also will expand any file or
+ directory spec recognizable to DCL into a valid URL, e.g.,
+ <em>[]</em> will be expanded to
+ <em>file://localhost/current/default/directory</em>.</p>
+
+ <p>These expansions are <em>SOLELY</em> for <em>startfile</em> or
+ &ldquo;<em>g</em>&rdquo;oto entries! Any partial or relative URLs
+ within HTML documents are resolved according to the rules
+ specified in RFC1808 and subsequent IETF drafts.</p>
+
+ <hr>
+
+ <h2><a name="http_url" id="http_url">The <em>http</em> and
+ <em>https</em> URLs:</a></h2>
+
+ <p><strong>Lynx</strong> handles http URLs exactly as specified
+ in RFC1738. The format is:</p>
+
+ <pre>
+ <em>http://host:port/path?searchpart#fragment</em>
+</pre>
+ <p>where <em>:port</em> is optional and defaults to <em>:80</em>,
+ <em>/path</em> if present is a slash-separated series of symbolic
+ elements, and <em>?searchpart</em> if present is the query for an
+ ISINDEX search or the content of a FORM with METHOD="GET". The
+ <em>#fragment</em> field if present indicates a location in the
+ document to seek for display, based on a NAME-ed anchor or an ID
+ attribute within the document, and is technically an instruction
+ rather than part of the URL. <strong>Lynx</strong> will treat ID
+ attributes as NAME-ed anchors for all tags in the BODY of a
+ document which can correspond to positions in the rendering of
+ the document.</p>
+
+ <p>The https URL has the same format, but the default port is
+ <em>:443</em>.</p>
+
+ <p><strong>Lynx</strong> relies for https support on external
+ libraries (OpenSSL or GnuTLS) whose capabilities have evolved
+ over time. In turn, those libraries may depend upon external
+ resources for verifying SSL certificates. For instance,
+ certification revocation may be provided via the Online
+ Certificate Status Protocol (OCSP) which is an external service.
+ Without this facility, <strong>Lynx</strong> may not warn about
+ websites using revoked SSL certificates.</p>
+
+ <hr>
+
+ <h2><a name="telnet_url" id="telnet_url">The <em>telnet</em>,
+ <em>tn3270</em>, and <em>rlogin</em> URLs:</a></h2>
+
+ <p>A <em>telnet</em> URL generally results in
+ <strong>Lynx</strong> spawning a telnet session.
+ <strong>Lynx</strong> implements the complete telnet URL scheme,
+ i.e.:</p>
+
+ <pre>
+ <em>telnet://user:password@host:port</em>
+</pre>
+ <p>The <em>user</em> and/or <em>:password</em> fields may be
+ omitted, and the <em>@</em> should be omitted if neither is
+ present. The port defaults to <em>:23</em> when omitted in the
+ URL.</p>
+
+ <p>A <em>tn3270</em> or <em>rlogin</em> URL is specified
+ equivalently, and similarly spawns a tn3270 or rlogin session.
+ The actual behavior is dependent on the TCP-IP software installed
+ on the local and target hosts.</p>
+
+ <p>It is unwise to include the <em>:password</em> field except
+ for URLs which point to anonymous or other public access
+ accounts, and for most TCP-IP software you will be prompted for a
+ password whether or not one was included in the URL.</p>
+
+ <hr>
+
+ <h2><a name="gopher_url" id="gopher_url">The <em>gopher</em>
+ URL:</a></h2>
+
+ <p>The gopher URL takes the form:</p>
+
+ <pre>
+ <em>gopher://host:port/gopher-path</em>
+</pre>
+ <p>where <em>:port</em> is optional and defaults to <em>:70</em>,
+ and the <em>/gopher-path</em> is opaque (not fully equivalent to
+ the slash-separated series of symbolic elements of http paths) as
+ explained in RFC1738. Typically, the gopher-path consists of a
+ <a href=
+ "keystrokes/gopher_types_help.html"><em>gophertype</em></a>
+ indicating the file or service type (e.g., <em>0</em> or
+ <em>I</em> for plain text or an image, respectively, <em>7</em>
+ for a search, or <em>1</em> for a directory), followed by a
+ platform-specific <em>selector</em>. Any reserved characters in
+ the selector should be hex escaped (<em>%hh</em>), including
+ slashes, although hex escaping of slashes is not required by
+ <strong>Lynx</strong> in gopher URLs.</p>
+
+ <p><strong>Lynx</strong> does not overtly support the gopher+
+ protocol, and does not represent itself as gopher+ capable when
+ communicating with gopher servers. <strong>Lynx</strong> might
+ transmit any (hex-escaped-tab-separated) extended gopher+ fields
+ in a URL if an author included them in a document, but is likely
+ to mishandle what the gopher server returns in such cases, and
+ would not generate and transmit them itself. For pre-formed URLs
+ to submit gopher searches, it may be better to use a <em>?</em>
+ rather than hex-escaped tab (<em>%09</em>) as the separator for
+ the <em>searchpart</em> in the <em>selector</em>, e.g.:<br>
+ <em>gopher://gopher.wfbr.edu/77/_shell/search.shell%20/_shell/walker?lynx*</em>
+ <strong>Lynx</strong> will handle the <em>%09</em> if you use
+ that instead of <em>?</em>, but other WWW clients may mishandle
+ it.</p>
+
+ <p>For the <em>gophertype</em> which signifies HTML (<em>h</em>),
+ if the <em>selector</em> begins with <em>GET%20/</em>
+ <strong>Lynx</strong> will convert the gopher URL to an http URL,
+ e.g.:<br></p>
+
+ <pre>
+<em>gopher://www.wfbr.edu:80/hGET%20/</em>
+</pre>
+ <p>will become:<br></p>
+
+ <pre>
+<em>http://www.wfbr.edu/</em>
+</pre>
+ <p>The port field will be retained if it is not <em>:80</em>, and
+ will default to <em>:70</em> if it was defaulted originally.
+ These conventions were adopted during development of the
+ University of Minnesota gopher software to facilitate the
+ offering of links to MIME-capable http servers in the listings
+ returned by gopher servers, but should be considered Lynxisms and
+ UMN Gopherisms.</p>
+
+ <hr>
+
+ <h2><a name="file_url" id="file_url">The <em>file</em> URL:</a></h2>
+
+ <p>The file URL is used to retrieve files or generate a directory
+ listing on the local host. The host field can be
+ <em>localhost</em> or a domain name for the local host:<br></p>
+
+ <pre>
+<em>file://localhost/path</em>
+</pre>
+ <p>If you do not use <em>localhost</em> or a domain name for the
+ local host, <strong>Lynx</strong> will substitute <em>ftp://</em>
+ for <em>file://</em> and treat it as an ftp URL.</p>
+
+ <p>The <em>/path</em> is treated as originating at the root,
+ unless you include a tilde (<em>~</em>), e.g.:</p>
+
+ <pre>
+ <em>file://localhost/~/foo</em> will be converted to:
+ <em>file://localhost/your/login/directory/foo</em>
+</pre>
+ <p>The latter feature is a Lynxism, is done homologously on Unix
+ and VMS, and should be used ONLY in local documents intended for
+ <strong>Lynx</strong>.</p>
+
+ <p>On VMS, the first element of the path, if not a tilde, is
+ assumed to be a device, e.g.:</p>
+
+ <pre>
+ <em>file://localhost/www_root/directory/filename.suffix</em>
+</pre>
+ <p>should be used for:
+ <em>www_root:[directory]filename.suffix</em><br>
+ If you are unsure how to specify a file URL in local documents on
+ VMS, invoke <strong>Lynx</strong> with the desired file or
+ directory as the <em>startfile</em> using any spec acceptable to
+ DCL, and then use the <em>showinfo</em> command (<em>=</em>) to
+ see the file URL which <strong>Lynx</strong> created for it.</p>
+
+ <hr>
+
+ <h2><a name="ftp_url" id="ftp_url">The <em>ftp</em> URL:</a></h2>
+
+ <p>The ftp URL has the general format:</p>
+
+ <pre>
+ <em>ftp://host:port/path;type=[D,I, or A]</em>
+ <em>ftp://username@host:port/path;type=[D,I, or A]</em>
+</pre>
+ <p>The default port is <em>:21</em> and the default
+ <em>username</em> is <em>anonymous</em>. If <em>username</em> is
+ included, <strong>Lynx</strong> will prompt you for the password.
+ For anonymous ftp, <strong>Lynx</strong> uses your
+ <em>personal_mail_address</em> (user@host) as the
+ <em>password</em> if it has been defined via the
+ &ldquo;<em>o</em>&rdquo;ptions menu. Otherwise,
+ <strong>Lynx</strong> uses the dummy password <em>WWWUser</em>.
+ (A password can also be embedded in the URL, by replacing
+ <em>username</em> with <em>username:password</em>. This is
+ strongly discouraged for &ldquo;real&rdquo; passwords that must
+ be kept secret, since URLs with the completely unencrypted
+ <em>password</em> may show up on the screen, in HISTORY and LIST
+ pages etc., and may even become visible to remote sites for
+ example through Referer headers.) Do not include the <em>@</em>
+ if neither <em>username</em> nor <em>:password</em> is
+ included.</p>
+
+ <p>The <em>;type=</em> parameter can be used with value
+ <em>D</em>, <em>I</em>, or <em>A</em> to force handling of the
+ URL as, respectively, a directory listing, binary file, or ASCII
+ file. The <strong>Lynx</strong> ftp gateway normally determines
+ this itself, but the parameter can be used if the internal
+ procedure draws an incorrect inference about the nature of the
+ ftp URL.</p>
+
+ <p>The <em>/path</em> is treated according to RFC1738 for VMS and
+ VM/CMS ftp servers. The lead slash (<em>/</em>) is treated purely
+ as a separator, not as a designator for the root, and the
+ <em>path</em> string if present is treated as in or under the
+ login directory. For VMS ftp servers, if you wish to have the
+ first element treated as a device rather than file or
+ subdirectory name, begin it with a hex-escaped slash
+ (<em>%2f</em>), e.g.:</p>
+
+ <pre>
+ <em>ftp://user@myhost/%2fsys$common/syshlp</em>
+</pre>
+ <p>can be used for a listing of sys$common:[syshlp]<br>
+ Also, on VM/CMS ftp servers, if the <em>path</em> string begins
+ with <em>vmsysu%3a</em> it receives special handling as an SFS
+ path, e.g.:</p>
+
+ <pre>
+ <em>ftp://ubvm.cc.buffalo.edu/vmsysu%3alistserv.webshare</em>
+</pre>
+ <p>For Unix and Unix-emulation ftp servers, RFC1738 is not
+ respected and the lead slash is treated as the root, i.e., the
+ <em>/path</em> is handled equivalently to that in file URLs. The
+ distinction is irrelevant for anonymous ftp, but matters when
+ using ftp for non-anonymous accounts. If you are using ftp with a
+ Unix server and do wish to get a listing of the login directory
+ or have the <em>path</em> string treated as a file or path under
+ the login directory, include a tilde (<em>~</em>) as for <a href=
+ "#file_url">file</a> URLs, e.g.:</p>
+
+ <pre>
+ <em>ftp://user@myhost/~</em>
+</pre>
+
+ <hr>
+
+ <h2><a name="wais_url" id="wais_url">The <em>wais</em> URL:</a></h2>
+
+ <p>The wais URL is used to retrieve resources using the Wide Area
+ Information System protocol. The format is:</p>
+
+ <pre>
+ <em>wais://host:port/database</em>
+ <em>wais://host:port/database?wais_query</em>
+ <em>wais://host:port/database/wais_type/wais_path</em>
+</pre>
+ <p>where <em>:port</em> defaults to <em>:210</em></p>
+
+ <p>Direct wais support is built into <strong>Lynx</strong> for
+ VMS, and can be compiled into <strong>Lynx</strong> on Unix.</p>
+
+ <p>If only a <em>database</em> is indicated in the URL,
+ <strong>Lynx</strong> returns an ISINDEX cover page for searching
+ that <em>database</em>, and will submit your search with the
+ <em>wais_query</em> appended. <strong>Lynx</strong> will convert
+ the server's reply into a hit list with URLs that include the
+ <em>wais_type</em> and <em>wais_path</em> for retrieving items
+ from the hit list.</p>
+
+ <hr>
+
+ <h2><a name="news_url" id="news_url">The <em>news</em>,
+ <em>nntp</em>, and <em>snews</em> URLs:</a></h2>
+
+ <p>The news and nntp URLs are handled by <strong>Lynx</strong> as
+ specified in RFC1738, but for compatibility with other clients,
+ <strong>Lynx</strong> allows inclusion of host and port fields in
+ news URLs, which properly should be used <em>only</em> in nntp
+ and snews URLs. If not included in news URLs,
+ <strong>Lynx</strong> will use the nntp server pointed to by the
+ NNTPSERVER environment variable or configuration symbol (see
+ lynx.cfg), with default port <em>:119</em>. A host field must be
+ included in nntp URLs, and the port field is optional with the
+ same default.</p>
+
+ <p>If the URL requires authentication, <strong>Lynx</strong> will
+ prompt you for the username and password. These are cached during
+ a session, for reuse on the same host. If $HOME/.newsauth exists,
+ <strong>Lynx</strong> initializes its cache from this file. The
+ .newsauth file contents are one line per entry: hostname,
+ password and username (in that order) separated by a space.</p>
+
+ <p>The formats are:<br></p>
+
+ <pre>
+ <em>news:newsgroup</em> (retrieves list of messages in newsgroup)
+ <em>news:messageID</em> (retrieves the message)
+ <em>news:*</em> (retrieves list of all available newsgroups)
+ <em>nntp://host:port/newsgroup</em>
+ <em>nntp://host:port/messageID</em>
+ <em>nntp://host:port/*</em>
+</pre>
+ <p>(snews same as nntp, but the default port is
+ <em>:563</em>)</p>
+
+ <p>The <em>messageID</em> is the message's unique identifier,
+ consisting of an identification string and the host of origin for
+ the message (<em>ident_string@origin_host</em>).</p>
+
+ <p><strong>Lynx</strong> also supports wildcarding via an
+ asterisk for listings of news hierarchies or sub-hierarchies,
+ e.g.:</p>
+
+ <pre>
+ <em>news:comp.infosystems.*</em>
+ <em>nntp://host:port/comp.infosystems.*</em>
+</pre>
+ <p>(snews same as nntp, but the default port is
+ <em>:563</em>)<br>
+ This is not in RFC1738 and may not be supported by all other
+ clients.</p>
+
+ <p><strong>Lynx</strong> allows you both to <em>reply</em> to the
+ author of a news message via email, and, if news posting has been
+ enabled, to send a <em>followup</em> message to the newsgroup
+ (see <a href="#newspost_url">newspost, newsreply, snewspost,
+ snewsreply</a>).</p>
+
+ <p><strong>Lynx</strong> converts any strings in news messages
+ which appear to be a URL with a supported scheme into a link for
+ accessing that URL.</p>
+
+ <p><strong>Lynx</strong> also supports the newsgroup and message
+ number URL scheme:<br></p>
+
+ <pre>
+ <em>news:newsgroup/startNo-endNo</em> (lists message range in newsgroup)
+ <em>news:newsgroup/messageNo</em> (retrieves the message by number)
+ <em>nntp://host:port/newsgroup/startNo-endNo</em>
+ <em>nntp://host:port/newsgroup/messageNo</em>
+</pre>
+ <p>(snews same as nntp, but the default port is
+ <em>:563</em>)<br>
+ Use of this scheme is not recommended, because the message
+ numbers are specific to each nntp server, unlike the unique
+ identifiers for news messages.</p>
+
+ <hr>
+
+ <h2><a name="newspost_url" id="newspost_url">The
+ <em>newspost</em>, <em>newsreply</em>, <em>snewspost</em>, and
+ <em>snewsreply</em> URLs:</a></h2>
+
+ <p>When <strong>Lynx</strong> receives group listings or articles
+ via <em>news</em>, <em>nntp</em> or <em>snews</em> URLs, it also
+ checks whether the nntp server supports posting from the
+ <strong>Lynx</strong> user's site, and if so, includes links for
+ posting new messages to that server, or for posting followups
+ (replies) to previously posted messages. RFC1738, and IETF URL
+ drafts through this release of <strong>Lynx</strong>, do not
+ include any schemes for posting to news groups.
+ <strong>Lynx</strong> has long supported newspost and newreply
+ URL schemes for posting new messages or sending followups,
+ respectively, to standard nntp servers, with default port
+ <em>:119</em>. <strong>Lynx</strong> now also supports homologous
+ snewspost and snewsreply URLs for use with SSL capable nntp
+ servers.</p>
+
+ <p>The formats are:</p>
+
+ <pre>
+ <em>newspost://host:port/newsgroup(s)</em> (post a new message)
+ <em>newsreply://host:port/newsgroup(s)</em> (post a followup message)
+</pre>
+ <p>(snewspost and snewsreply have the same formats, but the
+ default port is <em>:563</em>)</p>
+
+ <p>If the host field is omitted, it defaults to that pointed to
+ by the NNTPSERVER configuration or environmental variable.
+ Inclusion of at least one newsgroup in the URL is required, and
+ additional groups can be specified as a comma-separated list.
+ Wildcarding of newsgroup names is not supported for these URLs.
+ For newsreply and snewsreply URLs, if an external editor has been
+ defined via the <em>Options Menu</em>, the user is offered an
+ option to include the currently displayed document, which
+ presumably is a news article with a <em>followup</em> link that
+ was activated, and if confirmed, each line of that document is
+ prefixed with a right-angle-bracket. The user is expected to edit
+ such an inclusion so that only the passages relevant to the
+ followup message are retained.</p>
+
+ <p>These URLs can be used as command line startfiles (in which
+ case, <strong>Lynx</strong> will exit after posting the message,
+ and the newreply or snewsreply URLs degrade to newspost or
+ snewpost URLs, respectively). They also can be used as HREF
+ attribute values in any HTML document homologously to <a href=
+ "#mailto_url">mailto</a> URLs, with the qualification that they
+ presently are supported only by <strong>Lynx</strong>.</p>
+
+ <hr>
+
+ <h2><a name="mailto_url" id="mailto_url">The <em>mailto</em>
+ URL:</a></h2>
+
+ <p>The mailto URL is used to provide links that when activated
+ can be used to send a comment or the content of a FORM to an
+ Internet email address (user@host). The format is:</p>
+
+ <pre>
+ <em>mailto:user@host</em>
+</pre>
+ <p>The description of the mailto URL in RFC1738 has been
+ interpreted by some as allowing only a single recipient, but
+ <strong>Lynx</strong> invented the mailto URL, has always
+ supported a series of user@host addresses as a comma-separated
+ list, and still does. For compatibility with Explorer,
+ <strong>Lynx</strong> also accepts a semi-colon-separated
+ list.</p>
+
+ <p>For compatibility with Netscape, <strong>Lynx</strong> parses
+ any <em>?subject=The%20Subject</em> appended to the URL, trims
+ the URL at the <em>?</em>, and uses the value as the default
+ Subject: for the message or FORM content mailing. This is not
+ recommended practice. The preferred way to indicate the default
+ Subject: for a LINK or Anchor with a mailto HREF, or a FORM with
+ a mailto ACTION, is via a TITLE attribute with the subject string
+ as its value, e.g.:</p>
+
+ <pre>
+ <em>&lt;LINK REV="made"
+ HREF="mailto:me@myhost,her@herhost" TITLE="The Subject"&gt;</em>
+
+ <em>&lt;A HREF="mailto:user@host" TITLE="The Subject"&gt;...&lt;/A&gt;</em>
+
+ <em>&lt;FORM METHOD="post" ENCTYPE="text/plain"
+ ACTION="mailto:WebMaster@host" TITLE="The Subject"&gt;
+ ...
+ &lt;/FORM&gt;</em>
+</pre>
+ <p>Note that a TITLE attribute for FORM is now included in the
+ HTML specifications. Some clients use a SUBJECT attribute for
+ this purpose in FORM tags, and <strong>Lynx</strong> recognizes
+ that as a synonym for TITLE.</p>
+
+ <p><strong>Lynx</strong> also will process any
+ <em>to=address(es)</em>, <em>cc=address(es)</em>,
+ <em>keywords=word_list</em> and/or <em>body=message</em> fields
+ in <em>?searchpart</em> tack-ons to mailto URLs. The <em>to</em>
+ and/or <em>cc</em> values can be single addresses, or comma- or
+ semi-colon-separated lists of addresses. All addresses, and any
+ <em>body</em> values, will be offered for approval by the user
+ before proceeding with a mailing. Any other name=value pairs in
+ the <em>?searchpart</em> will be ignored. Also, if the mailto URL
+ is the ACTION for a FORM, any <em>body</em> in a
+ <em>?searchpart</em> tack-on will be ignored, because the body of
+ the mailing must be constructed solely from the the FORM's
+ content. <strong>Lynx</strong> expects multiple name=value pairs
+ in a <em>?searchpart</em> tack-on to be separated by ampersands,
+ as in the original Netscape implementation, and in an equally
+ ill-advised IETF draft of that implementation (<a href=
+ "ftp://ftp.isi.edu/internet-drafts/draft-hoffman-mailto-url-03.txt">draft-hoffman-mailto-url-03.txt</a>).
+ These should be represented as entities (<em>&amp;amp;</em>) in
+ the HTML markup. This functionality is generally desired, but the
+ IETF backward compatibility principal normally would lead to a
+ new scheme being used (e.g., <em>mail:</em>, or <em>smtp:</em>),
+ rather than breaking <em>mailto:</em> implementations.</p>
+
+ <p>If <em>ENCTYPE="text/plain"</em> is specified for a FORM with
+ a mailto ACTION, <strong>Lynx</strong> will not hex escape the
+ name=value pairs of the FORM's content, and will use physical
+ newlines instead of &ldquo;<em>&amp;</em>&rdquo; or
+ &ldquo;<em>;</em>&rdquo; to separate the pairs, so that the
+ content will be readable directly. Otherwise,
+ <strong>Lynx</strong> will mail the content with the default:</p>
+
+ <pre>
+ <em>ENCTYPE="application/x-www-form-urlencoded"</em> (&ldquo;<em>&amp;</em>&rdquo; separates pairs)
+</pre>
+ <p>or:</p>
+
+ <pre>
+ <em>ENCTYPE="application/sgml-form-urlencoded"</em> (&ldquo;<em>;</em>&rdquo; separates pairs)
+</pre>
+ <p>if the latter was indicated.</p>
+
+ <p>Note that when mailing FORM content <strong>Lynx</strong>
+ wraps any lines longer than 78 characters, to avoid buffer
+ overflows in mail software and to ensure reliable transmission
+ across gateways. If the ENCTYPE was not <em>text/plain</em>, any
+ script which decodes the mailed content should ignore the
+ physical newlines and recognize only hex escaped newline
+ characters as intended to be present in the decoded content.</p>
+
+ <p>If the mailto URL is not the ACTION for a FORM, and if an
+ external editor has been defined via the <em>Options Menu</em>,
+ the user is offered an option to include the currently displayed
+ document. If this option is accepted, each line of that document
+ is prefixed with a right-angle-bracket, and the prefixed
+ inclusion should be trimmed by the user to just those passages
+ relevant to the message which will be sent.</p>
+
+ <hr>
+
+ <h2><a name="finger_url" id="finger_url">The <em>finger</em>
+ URL:</a></h2>
+
+ <p><strong>Lynx</strong> has full support for the finger
+ protocol, but a format for finger URLs has not yet been adopted
+ by the IETF. The formats supported by <strong>Lynx</strong>
+ therefore include every possibility not inconsistent with
+ RFC1738, including:</p>
+
+ <pre>
+ finger://host finger://@host
+ finger://host/ finger://@host/
+ finger://host/%2fw finger://@host/w
+ finger://host/w finger://host/w/
+ finger://host/username[@host] finger://username@host
+ finger://host/username[@host]/ finger://username@host/
+ finger://host/w/username[@host] finger://username@host/w
+ finger://host/%2fw%20username[@host] finger://host/username[@host]/w
+ finger://host/w/username
+</pre>
+ <p>Activating a finger URL will send a request to the finger
+ server via port 79 on the host specified. You can include
+ <em>:79</em> in the URL, but no other value is allowed. The
+ <em>/w</em> or <em>/%2fw</em> is used to request a full report
+ for finger servers which support it, and is not case sensitive
+ (i.e., can be <em>/W</em> or <em>/%2fW</em>). Any strings in the
+ report which appear to be a URL with a supported scheme will be
+ converted into a link for accessing that URL.</p>
+
+ <p>An alternative way to access finger servers is via gopher URLs
+ with port 79 and the plain text (<em>0</em>) <em>gophertype</em>
+ specified:<br>
+ <em>gopher://host:79/0</em><br>
+ <strong>Lynx</strong> will handle such URLs equivalently to overt
+ finger URLs, including creation of links for any strings which
+ appear to be supported URLs.</p>
+
+ <hr>
+
+ <h2><a name="cso_url" id="cso_url">The <em>cso</em> URL:</a></h2>
+
+ <p>The cso URL is intended to provide a gateway to CSO/PH (QI)
+ servers. The requests are made on port 105 by default
+ (<em>:105</em>), with the following overt cso URL format:<br></p>
+
+ <pre>
+ <em>cso://host</em>
+</pre>
+ <p>You also can use a gopher URL format with port 105 and the CSO
+ (<em>2</em>) <em>gophertype</em> specified:</p>
+
+ <pre>
+ <em>gopher://host:105/2</em>
+</pre>
+ <p><strong>Lynx</strong> will parse the stream returned by the
+ server for the above URLs and create a FORM for submitting
+ additional requests (searches) to the server. Any strings in the
+ reports returned for these requests (searches) which appear to be
+ a URL with a supported scheme will be converted into a link for
+ accessing that URL.</p>
+
+ <hr>
+
+ <h2><a name="bibp_url" id="bibp_url">The <em>bibp</em> URL:</a></h2>
+
+ <p><strong>Lynx</strong> provides built-in support for
+ bibliographic protocol (BibP). BibP links are links to published
+ works such as books or journal articles, without a predefined
+ server. BibP links are intended for resolution by a local bibhost
+ server (http://bibhost/) if it exists. Otherwise, resolution is
+ performed by a document-specified server or a known global
+ server.</p>
+
+ <h2><a name="exec_url" id="exec_url">The <em>lynxexec</em> and
+ <em>lynxprog</em> URLs:</a></h2>
+
+ <p>If execution of spawned commands has been enabled in your
+ <strong>Lynx</strong> image, the lynxexec and lynxprog URLs can
+ be used to execute arbitrary system commands or invoke system
+ utilities. Any system command and associated switches or
+ qualifiers can be used, with the syntax appropriate for a shell
+ running <strong>Lynx</strong> on Unix, or for DCL on VMS,
+ e.g.:</p>
+
+ <pre>
+ <em>lynxexec:dir/date/size foo:[blah]</em> (VMS)
+ <em>lynxexec:ls -l /foo/blah</em> (Unix)
+ <em>lynxprog:news</em>
+</pre>
+ <p>(Note, however, that restrictions on acceptable commands or
+ utilities may be imposed by the system administrator.)</p>
+
+ <p>You optionally can include <em>//localhost/</em> in the URL,
+ between the scheme field and the command, but that is always
+ implied. The lynxexec and lynxprog URLs differ only in that with
+ lynxexec you are prompted to enter <em>RETURN</em> before
+ <strong>Lynx</strong> clears the screen and restores the
+ previously displayed document, so that you can read any screen
+ output generated by the spawned command, whereas no such pause is
+ imposed upon exit from the utility invoked via lynxprog.</p>
+
+ <p>These are Lynxisms and should be used only in local documents
+ intended solely for <strong>Lynx</strong>.</p>
+
+ <hr>
+
+ <h2><a name="cgi_url" id="cgi_url">The <em>lynxcgi</em> URL:</a></h2>
+
+ <p>The lynxcgi URL is implemented only on Unix, can be used as
+ the ACTION for a FORM, and if enabled in your
+ <strong>Lynx</strong> image has the format:</p>
+
+ <pre>
+ <em>lynxcgi://localhost/path_to_CGI_script</em>
+</pre>
+ <p>where <em>//localhost</em> is optional and always implied; the
+ full path should be specified, as &ldquo;~&rdquo; is not
+ recognized; if the script is in the directory
+ <strong>Lynx</strong> was started from, the simple file name is
+ adequate. The output of the script should be text/html and is
+ rendered and displayed by <strong>Lynx</strong>. Restrictions on
+ use of lynxcgi and on acceptable paths can be imposed in
+ <em>userdefs.h</em> and <em>lynx.cfg</em>, qv.</p>
+
+ <p>This is a Lynxism and should be used only in local documents
+ intended solely for <strong>Lynx</strong>, or for limited local
+ testing of CGI scripts without an http server.</p>
+
+ <hr>
+
+ <h2><a name="ncftp_url" id="ncftp_url">The <em>NcFTP</em>
+ URL:</a></h2>
+
+ <p><strong>Lynx</strong> recognizes the NcFTP-style ftp URL,
+ e.g.,</p>
+
+ <pre>
+ <cite>ftpHost</cite>:<cite>fileSpecification</cite>
+</pre>
+ <p>for example</p>
+
+ <pre>
+<code>
+ ftp.gnu.org:/pub/gnu
+</code>
+</pre>
+
+ <hr>
+
+ <h2><a name="internal_url" id="internal_url">The <em>LYNXfoo</em>
+ internal URLs:</a></h2>
+
+ <p><strong>Lynx</strong> uses a variety of private URL schemes
+ for communication among its internal modules. They start with
+ uppercase letters <code>LYNX</code> by convention, although, as
+ input, URL schemes are recognized in a case-insensitive
+ manner.</p>
+
+ <p>As you discover what they are, and are tempted to use them
+ externally in documents, you should <em>resist</em> that
+ temptation:</p>
+
+ <ul>
+ <li>There already is too much browser-specific markup
+ around...</li>
+
+ <li>The schemes, or their meanings, may change between
+ <strong>Lynx</strong> versions.</li>
+
+ <li>Even if a scheme stays the same, some aspect of its
+ behavior may be modified without notice, or the context in
+ which it is allowed may change.</li>
+
+ <li>If it does not work as expected when used outside of the
+ intended purpose, do not expect anyone to "fix" it.</li>
+ </ul>
+
+ <p>For example, tempting though it might be, do not use
+ these:</p>
+
+ <pre>
+ <em>Return to your &lt;A HREF="LYNXHIST:0"&gt;Startfile&lt;/A&gt;</em>
+ <em>Review your &lt;A HREF="LYNXKEYMAP:"&gt;Keymap&lt;/A&gt;</em>
+</pre>
+ <p>(No, they will not do any harm. Yes, they work. But do not
+ rely on it.)</p>
+
+ <p>If you must try one, the second is OK from the command
+ line:<br></p>
+
+ <pre>
+ <em>lynx LYNXKEYMAP:</em>
+</pre>
+ <p>But within <strong>Lynx</strong>, use the
+ &ldquo;<em>K</em>&rdquo; keystroke command. Sometimes it may be
+ convenient to use a private scheme with
+ &ldquo;<em>g</em>&rdquo;oto, as in:</p>
+
+ <pre>
+ <em>g LYNXMESSAGES:</em>
+ <em>g LYNXCOMPILEOPTS:</em>
+ <em>g LYNXCFG:</em>
+</pre>
+ <p>But again, there usually is a way in which those special pages
+ are meant to be reached that is more convenient.</p>
+</body>
+</html>
diff --git a/make-msc.bat b/make-msc.bat
new file mode 100644
index 0000000..6853590
--- /dev/null
+++ b/make-msc.bat
@@ -0,0 +1,9 @@
+@echo off
+setlocal
+if "x%TARGET_ARCH"=="x" set TARGET_ARCH=x86
+rem Build with Visual C++
+cd src\chrtrans
+nmake -f makefile.msc MACHINE=%TARGET_ARCH% %1 %2 %3 %4 %5 %6 %7 %8 %9
+cd ..\..
+nmake -f makefile.msc MACHINE=%TARGET_ARCH% %1 %2 %3 %4 %5 %6 %7 %8 %9
+endlocal
diff --git a/makefile.bcb b/makefile.bcb
new file mode 100644
index 0000000..8ae1443
--- /dev/null
+++ b/makefile.bcb
@@ -0,0 +1,708 @@
+# $LynxId: makefile.bcb,v 1.21 2021/06/29 22:01:12 tom Exp $
+#
+# Borland C++ / C++ builder
+# 1997/11/08 (Sat) 10:45:37
+#
+.AUTODEPEND
+
+#
+# Borland C++ tools
+#
+IMPLIB = Implib
+BCC32 = Bcc32 +BccW32.cfg
+TLINK32 = TLink32
+TLIB = TLib
+BRC32 = Brc32
+TASM32 = Tasm32
+#
+# macros
+#
+BCB = $(MAKEDIR)/..
+BCC_INC = $(BCB)/INCLUDE
+WWW_LIB = WWW/Library/Implementation
+
+# "GW32_ROOT" is the location of the GnuWin32 binaries and header files.
+# Aside from the Borland files, it holds all of the external libraries
+# needed by Lynx. It can/should be an environment variable (see makew32.bat).
+ETC_INC = $(GW32_ROOT)\include
+ETC_LIB = $(GW32_ROOT)\bcblibs
+
+#
+# Options
+#
+#
+DEBUG=
+#DEBUG=-v -y -vG
+#DEBUG=-v -y
+
+# Uncomment the CS_DEFS and CS_OBJS lines if you wish to build the color-style
+# configuration.
+#CS_DEFS = /DCHAR_BIT=8 /DUSE_COLOR_STYLE
+#CS_OBJS = LYHash.obj LYStyle.obj
+
+# Uncomment SOCK_DEFS if you wish to build with winsock2.
+#SOCK_DEFS = /DUSE_WINSOCK2_H /D_WIN32_WINNT=0x0400
+
+# Uncomment these lines if you wish to build with openssl
+#SSL_DEFS = -DUSE_SSL -DUSE_X509_SUPPORT
+#SSL_LIBS = $(ETC_LIB)\libeay32.lib $(ETC_LIB)\libssl32.lib
+
+# Uncomment these lines if you wish to build with iconv
+#I18N_DEFS = -DHAVE_GETTEXT -DHAVE_LIBINTL_H -DICONV_CONST=const -DUSE_JAPANESEUTF8_SUPPORT
+#I18N_LIBS = $(ETC_LIB)\libiconv2.lib $(ETC_LIB)\libintl3.lib
+
+CC_FLAGS = $(DEBUG) $(CS_DEFS) $(SOCK_DEFS) $(SSL_DEFS) $(I18N_DEFS) \
+-I./;$(ETC_INC);$(ETC_INC)/openssl;SRC;$(WWW_LIB);$(BCC_INC);SRC/CHRTRANS \
+-DACCESS_AUTH \
+-DCJK_EX \
+-DCOLOR_CURSES \
+-DDIRED_SUPPORT \
+-DDISP_PARTIAL \
+-DDONT_HAVE_TM_GMTOFF \
+-DDOSPATH \
+-DUSE_ALT_BINDINGS \
+-DEXP_NESTED_TABLES \
+-DFANCY_CURSES \
+-DHAVE_DIRENT_H=1 \
+-DHAVE_KEYPAD \
+-DLONG_LIST \
+-DLY_MAXPATH=1024 \
+-DNOSIGHUP \
+-DNOUSERS \
+-DNO_CONFIG_INFO \
+-DNO_CUSERID \
+-DNO_FILIO_H \
+-DNO_TTYTYPE \
+-DNO_UNISTD_H \
+-DNO_UTMP \
+-DPDCURSES \
+-DSH_EX \
+-DUSE_CMD_LOGGING \
+-DUSE_EXTERNALS \
+-DUSE_JUSTIFY_ELTS \
+-DUSE_MULTIBYTE_CURSES \
+-DENABLE_NLS \
+-DUSE_PERSISTENT_COOKIES \
+-DUSE_PRETTYSRC \
+-DUSE_READPROGRESS \
+-DUSE_SOURCE_CACHE \
+-DUSE_ZLIB \
+-DVC="2.14FM" \
+-D_MSC_VER=0 \
+-DWIN_EX \
+-D_WINDOWS \
+-D_WIN_CC=1 \
+-DUSE_PROGRAM_DIR
+
+# Note: setting _MSC_VER=0 is needed to work around a problem in the BCC55
+# header files that makes it try to include varargs.h
+#
+# Dependency List
+#
+Dep_lynx = lynx.exe
+
+lynx : BccW32.cfg $(Dep_lynx)
+ echo MakeNode
+
+clean :
+ -del lynx.rsp
+ -del *.tds
+ -del *.map
+ -del *.obj
+ -del BccW32.cfg
+ -del /f/s/q *.i
+
+LYNX_LIBS = $(SSL_LIBS) $(I18N_LIBS) \
+ $(ETC_LIB)/zlib1.lib\
+ $(ETC_LIB)/curses2.lib
+
+LYNX_OBJS = \
+ DefaultStyle.obj\
+ GridText.obj\
+ HTAABrow.obj\
+ HTAAProt.obj\
+ HTAAUtil.obj\
+ HTAccess.obj\
+ HTAlert.obj\
+ HTAnchor.obj\
+ HTAssoc.obj\
+ HTAtom.obj\
+ HTBtree.obj\
+ HTChunk.obj\
+ HTDOS.obj\
+ HTFile.obj\
+ HTFinger.obj\
+ HTFormat.obj\
+ HTFtp.obj\
+ HTFwriter.obj\
+ HTGopher.obj\
+ HTGroup.obj\
+ HTInit.obj\
+ HTLex.obj\
+ HTList.obj\
+ HTMIME.obj\
+ HTML.obj\
+ HTMLDTD.obj\
+ HTMLGen.obj\
+ HTNews.obj\
+ HTParse.obj\
+ HTPlain.obj\
+ HTRules.obj\
+ HTString.obj\
+ HTStyle.obj\
+ HTTP.obj\
+ HTTcp.obj\
+ HTTelnet.obj\
+ HTUU.obj\
+ HTWSRC.obj\
+ LYBookmark.obj\
+ LYCgi.obj\
+ LYCharSets.obj\
+ LYCharUtils.obj\
+ LYClean.obj\
+ LYCookie.obj\
+ LYCurses.obj\
+ LYDownload.obj\
+ LYEdit.obj\
+ LYEditmap.obj\
+ LYExit.obj\
+ LYExtern.obj\
+ LYForms.obj\
+ LYGetFile.obj\
+ LYHistory.obj\
+ LYJump.obj\
+ LYKeymap.obj\
+ LYLeaks.obj\
+ LYList.obj\
+ LYLocal.obj\
+ LYMail.obj\
+ LYMain.obj\
+ LYMainLoop.obj\
+ LYMap.obj\
+ LYNews.obj\
+ LYOptions.obj\
+ LYPrettySrc.obj\
+ LYPrint.obj\
+ LYReadCFG.obj\
+ LYSearch.obj\
+ LYSession.obj\
+ LYShowInfo.obj\
+ LYStrings.obj\
+ LYTraversal.obj\
+ LYUpload.obj\
+ LYUtils.obj\
+ LYmktime.obj\
+ LYrcFile.obj\
+ parsdate.obj\
+ SGML.obj\
+ TRSTable.obj\
+ UCAuto.obj\
+ UCAux.obj\
+ UCdomap.obj\
+ Xsystem.obj $(CS_OBJS)
+
+Dep_lynxdexe = $(LYNX_LIBS) $(LYNX_OBJS) $(CS_OBJS)
+
+lynx.rsp : BccW32.cfg $(LYNX_OBJS)
+ dir /b *.obj >$@
+ FOR %p IN ($(LYNX_LIBS)) DO echo %p >>$@
+
+lynx.exe : $(Dep_lynxdexe) lynx.rsp
+# $(BCC32) $(DEBUG) -lOS -elynx.exe @lynx_dbg.rsp
+ $(BCC32) $(DEBUG) -lOS -elynx.exe $(CS_OBJS) -L$(ETC_LIB) @lynx.rsp
+#
+###
+
+HTDOS.obj : $(WWW_LIB)/HTDOS.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ $(WWW_LIB)/HTDOS.c
+|
+
+UCAuto.obj : src/UCAuto.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ src/UCAuto.c
+|
+
+UCAux.obj : src/UCAux.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ src/UCAux.c
+|
+
+UCdomap.obj : src/UCdomap.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ src/UCdomap.c
+|
+
+HTAlert.obj : src/HTAlert.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ src/HTAlert.c
+|
+
+HTFwriter.obj : src/HTFwriter.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ src/HTFwriter.c
+|
+
+HTInit.obj : src/HTInit.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ src/HTInit.c
+|
+
+HTTcp.obj : $(WWW_LIB)/HTTcp.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ $(WWW_LIB)/HTTcp.c
+|
+
+HTAABrow.obj : $(WWW_LIB)/HTAABrow.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ $(WWW_LIB)/HTAABrow.c
+|
+
+HTAAProt.obj : $(WWW_LIB)/HTAAProt.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ $(WWW_LIB)/HTAAProt.c
+|
+
+HTAAUtil.obj : $(WWW_LIB)/HTAAUtil.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ $(WWW_LIB)/HTAAUtil.c
+|
+
+HTAccess.obj : $(WWW_LIB)/HTAccess.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ $(WWW_LIB)/HTAccess.c
+|
+
+HTAnchor.obj : $(WWW_LIB)/HTAnchor.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ $(WWW_LIB)/HTAnchor.c
+|
+
+HTAssoc.obj : $(WWW_LIB)/HTAssoc.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ $(WWW_LIB)/HTAssoc.c
+|
+
+HTAtom.obj : $(WWW_LIB)/HTAtom.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ $(WWW_LIB)/HTAtom.c
+|
+
+HTBtree.obj : $(WWW_LIB)/HTBtree.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ $(WWW_LIB)/HTBtree.c
+|
+
+HTChunk.obj : $(WWW_LIB)/HTChunk.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ $(WWW_LIB)/HTChunk.c
+|
+
+HTFile.obj : $(WWW_LIB)/HTFile.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ $(WWW_LIB)/HTFile.c
+|
+
+HTFinger.obj : $(WWW_LIB)/HTFinger.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ $(WWW_LIB)/HTFinger.c
+|
+
+HTFormat.obj : $(WWW_LIB)/HTFormat.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ $(WWW_LIB)/HTFormat.c
+|
+
+HTFtp.obj : $(WWW_LIB)/HTFtp.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ $(WWW_LIB)/HTFtp.c
+|
+
+HTGopher.obj : $(WWW_LIB)/HTGopher.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ $(WWW_LIB)/HTGopher.c
+|
+
+HTGroup.obj : $(WWW_LIB)/HTGroup.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ $(WWW_LIB)/HTGroup.c
+|
+
+HTLex.obj : $(WWW_LIB)/HTLex.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ $(WWW_LIB)/HTLex.c
+|
+
+HTList.obj : $(WWW_LIB)/HTList.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ $(WWW_LIB)/HTList.c
+|
+
+HTMIME.obj : $(WWW_LIB)/HTMIME.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ $(WWW_LIB)/HTMIME.c
+|
+
+HTMLDTD.obj : $(WWW_LIB)/HTMLDTD.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ $(WWW_LIB)/HTMLDTD.c
+|
+
+HTMLGen.obj : $(WWW_LIB)/HTMLGen.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ $(WWW_LIB)/HTMLGen.c
+|
+
+HTNews.obj : $(WWW_LIB)/HTNews.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ $(WWW_LIB)/HTNews.c
+|
+
+HTParse.obj : $(WWW_LIB)/HTParse.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ $(WWW_LIB)/HTParse.c
+|
+
+HTPlain.obj : $(WWW_LIB)/HTPlain.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ $(WWW_LIB)/HTPlain.c
+|
+
+HTRules.obj : $(WWW_LIB)/HTRules.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ $(WWW_LIB)/HTRules.c
+|
+
+HTString.obj : $(WWW_LIB)/HTString.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ $(WWW_LIB)/HTString.c
+|
+
+HTStyle.obj : $(WWW_LIB)/HTStyle.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ $(WWW_LIB)/HTStyle.c
+|
+
+HTTelnet.obj : $(WWW_LIB)/HTTelnet.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ $(WWW_LIB)/HTTelnet.c
+|
+
+HTTP.obj : $(WWW_LIB)/HTTP.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ $(WWW_LIB)/HTTP.c
+|
+
+HTUU.obj : $(WWW_LIB)/HTUU.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ $(WWW_LIB)/HTUU.c
+|
+
+HTWSRC.obj : $(WWW_LIB)/HTWSRC.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ $(WWW_LIB)/HTWSRC.c
+|
+
+SGML.obj : $(WWW_LIB)/SGML.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ $(WWW_LIB)/SGML.c
+|
+
+DefaultStyle.obj : src/DefaultStyle.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ src/DefaultStyle.c
+|
+
+GridText.obj : src/GridText.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ src/GridText.c
+|
+
+HTML.obj : src/HTML.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ src/HTML.c
+|
+
+LYBookmark.obj : src/LYBookmark.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ src/LYBookmark.c
+|
+
+LYCgi.obj : src/LYCgi.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ src/LYCgi.c
+|
+
+LYCharSets.obj : src/LYCharSets.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ src/LYCharSets.c
+|
+
+LYCharUtils.obj : src/LYCharUtils.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ src/LYCharUtils.c
+|
+
+LYClean.obj : src/LYClean.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ src/LYClean.c
+|
+
+LYCookie.obj : src/LYCookie.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ src/LYCookie.c
+|
+
+LYCurses.obj : src/LYCurses.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ src/LYCurses.c
+|
+
+LYDownload.obj : src/LYDownload.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ src/LYDownload.c
+|
+
+LYEdit.obj : src/LYEdit.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ src/LYEdit.c
+|
+
+LYEditmap.obj : src/LYEditmap.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ src/LYEditmap.c
+|
+
+LYExit.obj : src/LYExit.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ src/LYExit.c
+|
+
+LYExtern.obj : src/LYExtern.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ src/LYExtern.c
+|
+
+LYForms.obj : src/LYForms.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ src/LYForms.c
+|
+
+LYGetFile.obj : src/LYGetFile.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ src/LYGetFile.c
+|
+
+LYHash.obj : src/LYHash.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ src/LYHash.c
+|
+
+LYHistory.obj : src/LYHistory.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ src/LYHistory.c
+|
+
+LYJump.obj : src/LYJump.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ src/LYJump.c
+|
+
+LYKeymap.obj : src/LYKeymap.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ src/LYKeymap.c
+|
+
+LYLeaks.obj : src/LYLeaks.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ src/LYLeaks.c
+|
+
+LYList.obj : src/LYList.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ src/LYList.c
+|
+
+LYLocal.obj : src/LYLocal.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ src/LYLocal.c
+|
+
+LYMail.obj : src/LYMail.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ src/LYMail.c
+|
+
+LYMain.obj : src/LYMain.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ src/LYMain.c
+|
+
+LYMainLoop.obj : src/LYMainLoop.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ src/LYMainLoop.c
+|
+
+LYMap.obj : src/LYMap.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ src/LYMap.c
+|
+
+LYNews.obj : src/LYNews.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ src/LYNews.c
+|
+
+LYOptions.obj : src/LYOptions.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ src/LYOptions.c
+|
+
+LYPrint.obj : src/LYPrint.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ src/LYPrint.c
+|
+
+LYPrettySrc.obj : src/LYPrettySrc.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ src/LYPrettySrc.c
+|
+
+LYmktime.obj : src/LYmktime.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ src/LYmktime.c
+|
+
+LYrcFile.obj : src/LYrcFile.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ src/LYrcFile.c
+|
+
+LYReadCFG.obj : src/LYReadCFG.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ src/LYReadCFG.c
+|
+
+LYSearch.obj : src/LYSearch.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ src/LYSearch.c
+|
+
+LYSession.obj : src/LYSession.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ src/LYSession.c
+|
+
+LYShowInfo.obj : src/LYShowInfo.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ src/LYShowInfo.c
+|
+
+LYStrings.obj : src/LYStrings.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ src/LYStrings.c
+|
+
+LYStyle.obj : src/LYStyle.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ src/LYStyle.c
+|
+
+LYTraversal.obj : src/LYTraversal.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ src/LYTraversal.c
+|
+
+LYUpload.obj : src/LYUpload.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ src/LYUpload.c
+|
+
+LYUtils.obj : src/LYUtils.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ src/LYUtils.c
+|
+
+parsdate.obj : src/parsdate.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ src/parsdate.c
+|
+
+TRSTable.obj : src/TRSTable.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ src/TRSTable.c
+|
+
+Xsystem.obj : src/Xsystem.c
+ $(BCC32) -P- -c @&&|
+ $(CEAT_lynxdexe) $(CC_FLAGS) -o$@ src/Xsystem.c
+|
+
+# Compiler configuration file
+BccW32.cfg :
+ Copy &&|
+-R
+-vi
+-w
+-A-
+-tWM
+-wcpt
+-wrpt
+-wrng
+-w-voi
+-w-ret
+-w-sus
+-w-dup
+-w-big
+-w-ext
+-w-zdi
+-w-bei
+-w-obi
+-w-ofp
+-w-eas
+-w-hid
+-w-ncf
+-w-ibc
+-w-dsz
+-w-nst
+-w-mpc
+-w-mpd
+-w-ntd
+-w-nvf
+-w-hch
+-w-inl
+-w-lin
+-w-lvc
+-w-pia
+-w-def
+-w-nod
+-w-pro
+-w-rvl
+-wccc
+-w-aus
+-w-par
+-w-rch
+-w-eff
+-w-ill
+-w-ias
+-w-msg
+-O2
+-5
+-d
+-K
+-a4
+-r
+-w-stu
+-wbbf
+-w-dpu
+-wcln
+-wsig
+-wucp
+-g255
+-H-
+-v-
+-WC
+-WM
+-wamb
+| $@
+
diff --git a/makefile.in b/makefile.in
new file mode 100644
index 0000000..ede88c0
--- /dev/null
+++ b/makefile.in
@@ -0,0 +1,505 @@
+# $LynxId: makefile.in,v 1.193 2023/01/02 23:47:08 tom Exp $
+##makefile for lynx
+
+SHELL = @CONFIG_SHELL@
+CDPATH = .
+
+.SUFFIXES:
+@SET_MAKE@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+top_srcdir = @top_srcdir@
+srcdir = @srcdir@
+builddir = .
+VPATH = $(srcdir)
+
+CC = @CC@
+CFLAGS = @CFLAGS@ @EXTRA_CFLAGS@
+DEFS = @DEFS@
+CPPFLAGS = @CPPFLAGS@
+LINT = @LINT@
+ETAGS = @ETAGS@
+EGREP = @EGREP@
+FGREP = @FGREP@
+
+BUILD_CC = @BUILD_CC@
+BUILD_CPP = @BUILD_CPP@
+BUILD_CFLAGS = @BUILD_CFLAGS@
+BUILD_CPPFLAGS = @BUILD_CPPFLAGS@ @DEFS@
+BUILD_EXEEXT = @BUILD_EXEEXT@
+BUILD_LDFLAGS = @BUILD_LDFLAGS@
+BUILD_LIBS = @BUILD_LIBS@
+
+x = @EXEEXT@
+o = .@OBJEXT@
+
+LDFLAGS = @EXTRA_LDFLAGS@ @LDFLAGS@
+LIBS = @LIBS@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_DATA = @INSTALL_DATA@
+
+LN_S = @LN_S@
+
+TAR = @TAR@
+TAR_UP = $(TAR) @TAR_UP_OPTIONS@ @TAR_PIPE_OPTIONS@
+TAR_DOWN = $(TAR) @TAR_DOWN_OPTIONS@ @TAR_PIPE_OPTIONS@
+
+# $Format: "LYNX_VERSION = $ProjectVersion$"$
+LYNX_VERSION = 2.9.0dev.12
+
+## This is the version which we are developing (or, upon release, make this
+## the same). Use no dots in the name, since it must work on VMS and MS-DOS.
+VERSION = 2-8-9
+
+##this is the name of the directory the lynx source code is in.
+##(e.g., lynx2-8-9, not the full path)
+lynxdir= lynx$(VERSION)
+lynxname= lynx$(VERSION)
+
+## The 'DESTDIR' variable allows you to install the program into a different
+## location, e.g., for packaging, without affecting the compiled-in pathnames.
+DESTDIR= @DESTDIR@
+
+## Where you want lynx installed
+bindir= @bindir@
+BINDIR= $(DESTDIR)$(bindir)
+
+## Where you want the lynx man file installed
+mandir= @mandir@/man1
+MANDIR= $(DESTDIR)$(mandir)
+
+## Where you want the lynx.cfg file installed
+sysconfdir= @sysconfdir@
+SYSCONFDIR= $(DESTDIR)$(sysconfdir)
+
+## Where you want the doc-files installed
+datarootdir= @datarootdir@
+docdir = @datadir@/lynx_doc
+DOCDIR = $(DESTDIR)$(docdir)
+
+## Where you want the help-files installed
+helpdir = @datadir@/lynx_help
+HELPDIR = $(DESTDIR)$(helpdir)
+
+##set the relative location of the WWW library Implementation directory,
+##from this directory
+##do not set this to be an absolute path!!!
+WWW_DIR = $(builddir)/WWW/Library/Implementation
+
+##set the relative location of the message-file directory
+##do not set this to be an absolute path!!!
+PO_DIR = $(builddir)/po
+PO_SRCDIR = $(srcdir)/po
+
+##set the relative location of the main source-directory
+##do not set this to be an absolute path!!!
+SRC_DIR = $(builddir)/src
+
+##set the relative location of the character-translation data directory
+##do not set this to be an absolute path!!!
+CHR_DIR = $(SRC_DIR)/chrtrans
+
+## Path to gzip that will compress the help files.
+## It will be used when --enable-gzip-help is set by configure.
+## Leave *both* empty if you don't want to gzip help files.
+COMPRESS_PROG=@COMPRESS_PROG@
+COMPRESS_EXT=@COMPRESS_EXT@
+
+# Path of scripts directory
+scripts_dir=$(srcdir)/scripts
+
+MAKE_RECUR = $(MAKE) @cf_cv_makeflags@ DESTDIR="$(DESTDIR)" CC="$(CC)"
+
+@LYNXCFG_MAKE@CFG2HTML = alphatoc.html body.html cattoc.html
+
+# !!!!!!!!!!! SUN resolv LIBRARY !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+# To include resolv in the LIBS="" list for SUN 3, 4 or Solaris OS,
+# point RESOLVLIB to that library. You need this if you get the message
+# "Alert!: Unable to connect to remote host" whenever you try to
+# access a host other than localhost and have made Lynx without it.
+# See the PROBLEMS file for more information.
+#RESOLVLIB= -lresolv
+
+# !!!!!!!!!!!!! DIRECT WAIS ACCESS !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+# If you are adding direct wais access you must fill in the
+# location of wais.a, client.a and the standard math library, libm.a.
+# You can pick up the most current freeWAIS sources from
+# ftp://ftp.cnidr.org/pub/NIDR.tools/freewais
+# If you are using freeWAIS-0.202 or older, include -DDECLARE_WAIS_LOGFILES
+# in your SITE_DEFS.
+# Please put an ABSOLUTE address here if you want it to work!
+#WAISLIB= ../../freeWAIS-0.202/bin/client.a ../../freeWAIS-0.202/bin/wais.a /usr/lib/libm.a
+
+# !!!!!!!!!!!!! SLANG Support (For color version of Lynx). !!!!!!!!!!!!!!!!
+# The slang library is an alternative to curses, developed by John E. Davis
+# (davis@space.mit.edu). Version 0.99-27 or higher is available from
+# ftp://space.mit.edu/pub/davis
+# It provides color support for Lynx.
+
+# !!!!!!!!!!!!! NCURSES Support (For color version of Lynx). !!!!!!!!!!!!!!
+# If you need ncurses, the latest version can always be found
+# in https://invisible-island.net/ncurses/
+# or https://ftp.gnu.org/pub/gnu/
+
+# Also be sure to check out the compilation symbols in userdefs.h
+# before building Lynx!
+
+# If you apply patches which require linking to site-specific libraries, set
+# SITE_LIBS to those libraries.
+SITE_LIBS= # Your libraries here
+
+# Set SITE_LYDEFS to one or more of the defines for the WWW Library:
+SITE_LYDEFS = # Your defines here
+
+# Set SITE_DEFS to one or more of the defines for lynx below:
+SITE_DEFS = # Your defines here
+
+# defines for which there are no configure options:
+# -DIGNORE_CTRL_C Define if Control-C shouldn't exit lynx.
+# -DNO_RULES Disables CERN-style access rules (see lynx.cfg).
+#
+# if you are linking to freeWAIS-0.202 or older, you should define this
+# in SITE_DEFS
+#
+# -DDECLARE_WAIS_LOGFILES
+#
+# if you have an SVR4 system with the "type any key" problem, try defining
+# this in LYFLAGS (SITE_LYDEFS) and SITE_DEFS
+#
+# -DSVR4_BSDSELECT
+#
+# Many other defines have configure options (see INSTALLATION, Section II-1c.):
+#
+# for installation of local execution links, please see the file userdefs.h
+
+WWW_CFLAGS = \
+ LY_CFLAGS="$(CFLAGS)" \
+ CPPFLAGS="$(CPPFLAGS)" \
+ LYFLAGS="$(SITE_LYDEFS)"
+
+CHR_CFLAGS = \
+ SITE_DEFS="$(SITE_DEFS)" \
+ BUILD_CFLAGS="$(BUILD_CFLAGS)" \
+ BUILD_CPPFLAGS="$(BUILD_CPPFLAGS)" \
+ BUILD_LDFLAGS="$(BUILD_LDFLAGS)" \
+ BUILD_LIBS="$(BUILD_LIBS)" \
+ BUILD_CC="$(BUILD_CC)"
+
+SRC_CFLAGS = \
+ CFLAGS="$(CFLAGS)" \
+ CPPFLAGS="$(CPPFLAGS)" \
+ LDFLAGS="$(LDFLAGS)" \
+ LIBS="$(LIBS) $(RESOLVLIB) $(WAISLIB) $(SITE_LIBS)" \
+ SITE_DEFS="$(SITE_DEFS)" \
+ WWWINC=$(WWW_DIR) \
+ WWWLIB="../$(WWW_DIR)/libwww.a"
+
+actual_PROG = `echo lynx|sed '@program_transform_name@'`
+binary_PROG = $(actual_PROG)$x
+
+all lynx$x: cfg_defs.h LYHelp.h
+@MSG_DIR_MAKE@ $(SHELL) $(scripts_dir)/fixtext.sh $(srcdir)/LYMessages_en.h >LYMessages.c
+@MSG_DIR_MAKE@ ( cd $(PO_DIR) && $(MAKE_RECUR) )
+ ( cd $(WWW_DIR) && $(MAKE_RECUR) $(WWW_CFLAGS) )
+ ( cd $(CHR_DIR) && $(MAKE_RECUR) all $(CHR_CFLAGS) )
+ ( cd $(SRC_DIR) && $(MAKE_RECUR) all $(SRC_CFLAGS) )
+
+lint:
+ ( cd $(WWW_DIR) && $(MAKE_RECUR) LINT="$(LINT)" $(WWW_CFLAGS) $@ )
+ ( cd $(SRC_DIR) && $(MAKE_RECUR) LINT="$(LINT)" $(SRC_CFLAGS) $@ )
+ ( cd $(CHR_DIR) && $(MAKE_RECUR) LINT="$(LINT)" $@ )
+
+tags:
+ ( cd $(WWW_DIR) && $(MAKE_RECUR) $(WWW_CFLAGS) $@ )
+ ( cd $(SRC_DIR) && $(MAKE_RECUR) $(SRC_CFLAGS) $@ )
+ ( cd $(CHR_DIR) && $(MAKE_RECUR) $@ )
+
+etags:
+ $(ETAGS) *.[ch] */*.[ch] */*/*.[ch] */*/*/*.[ch]
+
+check:
+ @echo "There is no batch test for this program"
+
+help:
+ @echo
+ @echo "Please run make with one of the following arguments"
+ @echo "all -- to make the executable, put it in this directory"
+ @echo "clean -- removes all '$o' and 'core' files"
+ @echo "distclean -- removes all generated files"
+ @echo "depend -- use makedepend to generate header-dependencies"
+ @echo
+
+##Miscellaneous actions
+clean:
+ rm -f WWW/Library/*/*.[aoib]
+ rm -f WWW/Library/*/.created
+ ( cd $(WWW_DIR) && $(MAKE_RECUR) $@ )
+ ( cd $(SRC_DIR) && $(MAKE_RECUR) $@ )
+@MSG_DIR_MAKE@ rm -f LYMessages.c
+@MSG_DIR_MAKE@ ( cd $(PO_DIR) && $(MAKE_RECUR) $@ )
+ rm -f *.b $(SRC_DIR)/lynx$x *.leaks cfg_defs.h LYHelp.h lint.*
+@LYNXCFG_MAKE@ -rm -f $(CFG2HTML)
+ rm -f help_files.sed
+ rm -f core *.core
+
+depend: cfg_defs.h LYHelp.h
+ ( cd $(WWW_DIR) && $(MAKE_RECUR) $@ )
+ ( cd $(SRC_DIR) && $(MAKE_RECUR) $@ )
+
+distclean: clean
+ -rm -f WWW/Library/*/*~
+ -rm -f WWW/Library/*/*.bak
+ -rm -rf $(SRC_DIR)/obsolete
+ -( cd $(WWW_DIR) && $(MAKE_RECUR) $@ )
+ -( cd $(SRC_DIR) && $(MAKE_RECUR) $@ )
+ -( cd $(CHR_DIR) && $(MAKE_RECUR) $@ )
+@MSG_DIR_MAKE@ -( cd $(PO_DIR) && $(MAKE_RECUR) $@ )
+@MSG_DIR_MAKE@ -rmdir $(PO_DIR)
+ -rm -f *~ *.bak *.sav tags TAGS
+ -rm -f $(WWW_DIR)/makefile $(SRC_DIR)/makefile $(CHR_DIR)/makefile
+@SRCDIR_CLEAN@ -rmdir $(WWW_DIR) && rmdir WWW/Library && rmdir WWW
+@SRCDIR_CLEAN@ -rmdir $(CHR_DIR) && rmdir $(SRC_DIR)
+ -rm -f makefile lynx_cfg.h config.status config.log config.cache
+ -rm -f lynx$x
+
+maintainer-clean: distclean
+ -find . -type f -name '*.rej' -exec rm -f {} \;
+ -find . -type f -name '*.orig' -exec rm -f {} \;
+ -rm -rf WWW/Library/*/obsolete
+ -rm -f Lynx.prj .*_aux
+
+# Directory containing reference source for patch generation,
+# either absolute or relative to $(top_srcdir)/..
+REFDIR=orig/$(lynxdir)
+
+lynx.patch: $(top_srcdir) $(top_srcdir)/CHANGES
+ -( cd $(top_srcdir)/.. && cd $(REFDIR) && { rm -f \
+ config.log \
+ config.status \
+ lynx_cfg.h \
+ ; \
+ for I in . $(SRC_DIR) $(WWW_DIR); do ( set +e; \
+ ( set -x; cd $$I && rm -f *.orig *.rej makefile ); : ); \
+ done; } )
+ ( cd $(top_srcdir)/..; echo "%%% Created `date` by target $@. %%%"; \
+ if diff -bru /dev/null /dev/null; \
+ then diff -bru $(REFDIR) $(lynxdir); \
+ else diff -brc $(REFDIR) $(lynxdir); fi ) \
+ | grep -v '^Common' \
+ | grep -v '^Binary files ' \
+ | grep -v '^Only ' | tee $@ | egrep '^\-\-\- .*$(lynxdir)'
+
+install: install-bin install-man install-cfg @INSTALL_LSS@
+ @echo
+ @echo "Use $(MAKE) install-help to install the help-files"
+ @echo "Use $(MAKE) install-doc to install extra documentation files"
+ @echo
+
+install-full: install install-help install-doc
+ @echo "Full installation complete."
+
+install-bin: $(BINDIR) lynx$x
+@MSG_DIR_MAKE@ ( cd $(PO_DIR) && $(MAKE_RECUR) install )
+ @ECHO_CC@$(SHELL) -c "P=$(binary_PROG); \
+ if test -f $(BINDIR)/$$P ; then \
+ mv -f $(BINDIR)/$$P $(BINDIR)/$$P.old; fi"; \
+ $(INSTALL_PROGRAM) lynx$x $(BINDIR)/$(binary_PROG)
+
+install-man : $(MANDIR)
+ $(INSTALL_DATA) $(srcdir)/lynx.man $(MANDIR)/$(actual_PROG).1
+
+install-doc : $(DOCDIR) $(HELPDIR)
+ @echo "Copying sample files";\
+ $(SHELL) -c 'set -x; \
+ ( umask 022; \
+ cd $(srcdir) && \
+ $(TAR_UP) C[HO]* PROBLEMS README docs samples test ) | \
+ ( umask 022; \
+ cd $(DOCDIR) && \
+ chmod -R u+w . && $(TAR_DOWN) )';\
+ $(SHELL) -c 'if test "$(COMPRESS_PROG)" != "" ; then \
+ (cd $(DOCDIR) && $(COMPRESS_PROG) -f docs/CHANGES*.[0-9] docs/*.announce ) \
+ fi';\
+ $(SHELL) -c 'set -x; \
+ for name in COPYING COPYHEADER; do \
+ cd $(HELPDIR) && rm -f $$name ;\
+ r= ;\
+ test "$(LN_S)" = "ln -s" || r=`echo $(helpdir)|sed -e "s%[^/]\+%..%g" -e "s%^.%%"`; \
+ cd $(HELPDIR) && ( $(LN_S) $$r$(docdir)/$$name . || cp $(DOCDIR)/$$name . );\
+ done';\
+ $(SHELL) -c 'set -x; \
+ case `id|sed -e "s/(.*//"` in \
+ uid=0) \
+ chown -R root $(DOCDIR);; \
+ esac'
+
+# HPUX 'sed' does not seem to like '=' as pattern delimiter.
+# We cannot use '%' because it may appear in a URL.
+# Andrew filesystem uses '@'.
+# So we limit sed delimiters to '!' and '%', depending on the expected text.
+FIX_SED = tr '=' '"'
+
+LYNX_URL='@HOMEPAGE_URL@release/breakout'
+LYNXDOCS_URL='$(LYNX_URL)/docs/'
+LYNXHELP_URL='$(LYNX_URL)/lynx_help/'
+
+@LYNXCFG_NO_MAKE@htmlized_cfg:
+@LYNXCFG_MAKE@@MAKE_NO_PHONY@htmlized_cfg: $(CFG2HTML)
+@LYNXCFG_MAKE@@MAKE_NO_PHONY@$(CFG2HTML):
+@LYNXCFG_MAKE@@MAKE_PHONY@.PHONY: htmlized_cfg
+@LYNXCFG_MAKE@@MAKE_PHONY@$(CFG2HTML): htmlized_cfg
+@LYNXCFG_MAKE@@MAKE_PHONY@htmlized_cfg:
+@LYNXCFG_MAKE@ @echo "Making htmlized lynx.cfg"
+@LYNXCFG_MAKE@ ( cd $(SRC_DIR) && $(MAKE_RECUR) LYReadCFG.i )
+@LYNXCFG_MAKE@ @-rm -f $(CFG2HTML)
+@LYNXCFG_MAKE@ sed -n -e '/Config_Type *Config_Table/,/{0, *0, *0}/ p' $(SRC_DIR)/LYReadCFG.i | \
+@LYNXCFG_MAKE@ sed -e 's/ *{ *"\([^"]*\)".*/\1/' | \
+@LYNXCFG_MAKE@ perl $(scripts_dir)/cfg2html.pl -ams $(srcdir)/lynx.cfg
+@LYNXCFG_MAKE@ -rm -f $(SRC_DIR)/LYReadCFG.i
+
+help_files.sed : makefile $(srcdir)/lynx_help/help_files.txt
+ @echo "Constructing sed-script $@"
+ @-rm -f $@ help_files.tmp
+ @cat $(srcdir)/lynx_help/help_files.txt > help_files.tmp
+@LYNXDOC_MAKE@ @ECHO_CC@echo 's!$(LYNXDOCS_URL)!file://$(docdir)/!g' >> help_files.tmp
+@LYNXCFG_MAKE@ @ECHO_CC@echo 's!$(LYNXHELP_URL)alphatoc.html!alphatoc.html!g' >> help_files.tmp
+@LYNXCFG_MAKE@ @ECHO_CC@echo 's!$(LYNXHELP_URL)cattoc.html!cattoc.html!g' >> help_files.tmp
+@LYNXCFG_MAKE@ @ECHO_CC@echo 's!alphatoc\.html!alphatoc.html$(COMPRESS_EXT)!g' >> help_files.tmp
+@LYNXCFG_MAKE@ @ECHO_CC@echo 's!cattoc\.html!cattoc.html$(COMPRESS_EXT)!g' >> help_files.tmp
+@LYNXCFG_MAKE@ @ECHO_CC@echo 's!body\.html!body.html$(COMPRESS_EXT)!g' >> help_files.tmp
+ @ECHO_CC@sed -e '/^#/d' -e '/^$$/d' \
+ -e 's%\(.*\)=\(.*\@.*\)$$%s=@\1@=\2=g%' \
+ -e 's%\(.*\)=\(http:.*\)$$%s=@\1@=\2=g%' \
+ -e 's%\(.*\)=\(ftp:.*\)$$%s=@\1@=\2=g%' \
+ -e 's%\(.*\)=\(.*\.html\)$$%s=@\1@=\2$(COMPRESS_EXT)=g%' \
+ help_files.tmp | $(FIX_SED) > $@
+ @echo Appending interim-fix for existing html files to $@
+ @ECHO_CC@sed -e '/^#/d' -e '/[:@]/d' -e '/^$$/d' \
+ -e 's%\(.*\)=\(.*\.html\)$$%s=\2=\2$(COMPRESS_EXT)=g%' \
+ -e 's%\.html=%\\.html=%' \
+ help_files.tmp | $(FIX_SED) >> $@
+ @ECHO_CC@if test -n "$(COMPRESS_EXT)"; then echo "s%\\(\$(COMPRESS_EXT)\\)*\$(COMPRESS_EXT)%$(COMPRESS_EXT)%g" >> $@; fi
+ @-rm -f help_files.tmp
+
+install-help : htmlized_cfg help_files.sed $(HELPDIR) $(SYSCONFDIR)
+ -$(SHELL) -c 'if cd "$(HELPDIR)" ; then \
+ WD=`pwd` ; \
+ TAIL=`basename "$(helpdir)"` ; \
+ HEAD=`echo "$$WD"|sed -e "s,/$${TAIL}$$,,"` ; \
+ test "x$$WD" != "x$$HEAD" && rm -fr * ; \
+ fi';\
+ test -d $(HELPDIR)/keystrokes || mkdir $(HELPDIR)/keystrokes
+ @echo "Translating/copying html files"
+@LYNXCFG_MAKE@ @$(SHELL) -c 'for f in $(CFG2HTML) ; do \
+@LYNXCFG_MAKE@ sed -f help_files.sed $$f > $(HELPDIR)/$$f ; \
+@LYNXCFG_MAKE@ done'
+ @ECHO_CC@$(SHELL) -c 'sed_prog=`pwd`/help_files.sed && \
+ cd $(srcdir)/lynx_help && \
+ dirs=keystrokes && \
+ files="*.html */*.html" && \
+ for f in $$files ; do \
+ sed -f $$sed_prog $$f > $(HELPDIR)/$$f ; \
+ done && \
+ if test "$(COMPRESS_PROG)" != "" ; then \
+ (cd $(HELPDIR) && $(COMPRESS_PROG) $$files ) \
+ fi'
+ @echo "Updating $(sysconfdir)/lynx.cfg"
+ @ECHO_CC@$(SHELL) -c \
+ 'if test -f $(SYSCONFDIR)/lynx.cfg ; then \
+ mv $(SYSCONFDIR)/lynx.cfg $(SYSCONFDIR)/lynx.tmp ; \
+ else \
+ cp $(srcdir)/lynx.cfg $(SYSCONFDIR)/lynx.tmp ; \
+ fi'
+ @echo "Updating $(sysconfdir)/lynx.cfg to point to installed help-files"
+ @ECHO_CC@sed -e '/^HELPFILE:http/s!^!#!' \
+ -e '/^#HELPFILE:file/s!#!!' \
+ $(SYSCONFDIR)/lynx.tmp | \
+ $(SHELL) $(scripts_dir)/cfg_path.sh lynx_help $(helpdir) | \
+ $(SHELL) $(scripts_dir)/cfg_path.sh lynx_doc $(helpdir) | \
+ sed -e '/^HELPFILE:file/s!$$!$(COMPRESS_EXT)!' \
+ -e '/^HELPFILE:file/s!$(COMPRESS_EXT)$(COMPRESS_EXT)$$!$(COMPRESS_EXT)!' \
+ >$(SYSCONFDIR)/lynx.cfg ;\
+ chmod 644 $(SYSCONFDIR)/lynx.cfg ;\
+ rm -f $(SYSCONFDIR)/lynx.tmp
+
+LYHelp.h : help_files.sed $(srcdir)/LYHelp.hin
+ @echo "Creating $@"
+ @sed -f help_files.sed $(srcdir)/LYHelp.hin > $@
+ @echo '**********************************************'
+ @echo
+ @$(SHELL) -c 'if test "$(COMPRESS_PROG)" = "" ; then \
+ echo " Help files will NOT be gzipped."; \
+ else \
+ echo " Help links point to compressed files"; \
+ echo " To access them properly you have to type"; \
+ echo " make install-help"; \
+ fi'
+ @echo
+ @echo '**********************************************'
+
+cfg_defs.h : $(scripts_dir)/cfg_defs.sh $(scripts_dir)/cfg_edit.sh config.cache lynx_cfg.h
+ @rm -f $@
+ @$(SHELL) -c 'SHELL=$(SHELL) FGREP="$(FGREP)" $(SHELL) $(scripts_dir)/cfg_defs.sh $(srcdir)'
+
+install-cfg : $(SYSCONFDIR)
+ @$(SHELL) -c 'SHELL=$(SHELL) EGREP="$(EGREP)" FGREP="$(FGREP)" $(SHELL) $(scripts_dir)/install-cfg.sh "$(INSTALL_DATA)" $(srcdir)/lynx.cfg $(SYSCONFDIR)/lynx.cfg'
+
+install-lss : $(SYSCONFDIR)
+ @$(SHELL) $(scripts_dir)/install-lss.sh "$(INSTALL_DATA)" $(srcdir)/samples/lynx.lss $(SYSCONFDIR)/lynx.lss
+
+uninstall ::
+@MSG_DIR_MAKE@ ( cd $(PO_DIR) && $(MAKE_RECUR) uninstall )
+ -rm -f $(BINDIR)/$(binary_PROG) ;\
+ rm -f $(MANDIR)/$(actual_PROG).1 ;\
+ rm -f $(SYSCONFDIR)/lynx.cfg ;\
+ rm -f $(SYSCONFDIR)/lynx.lss
+
+uninstall \
+uninstall-help ::
+ -$(SHELL) -c 'if test -d "$(HELPDIR)" ; then \
+ WD=`cd "$(HELPDIR)" && pwd` ; \
+ TAIL=`basename "$(helpdir)"` ; \
+ HEAD=`echo "$$WD"|sed -e "s,/$${TAIL}$$,,"` ; \
+ test "x$$WD" != "x$$HEAD" && rm -rf "$(HELPDIR)"; \
+ fi'
+
+uninstall \
+uninstall-doc ::
+ -$(SHELL) -c 'if test -d "$(DOCDIR)" ; then \
+ WD=`cd "$(DOCDIR)" && pwd` ; \
+ TAIL=`basename "$(docdir)"` ; \
+ HEAD=`echo "$$WD"|sed -e "s,/$${TAIL}$$,,"` ; \
+ test "x$$WD" != "x$$HEAD" && rm -rf "$(DOCDIR)"; \
+ fi' ;\
+ $(SHELL) -c 'if test -d "$(HELPDIR)" ; then \
+ WD=`cd "$(HELPDIR)" && pwd` ; \
+ TAIL=`basename "$(helpdir)"` ; \
+ HEAD=`echo "$$WD"|sed -e "s,/'$${TAIL}'$$,,"` ; \
+ test "x$$WD" != "x$$HEAD" ; \
+ cd "$(HELPDIR)" && rm -f COPYING COPYHEADER ; \
+ fi'
+
+update-po:
+ rsync -Lrtvz translationproject.org::tp/latest/lynx/ $(PO_SRCDIR) ;\
+ ( test -f $(PO_SRCDIR)/makefile && cd $(PO_SRCDIR) && $(MAKE_RECUR) $@ )
+
+preinstall :
+ @ echo '' ;\
+ echo '** Configuration summary for LYNX $(LYNX_VERSION):' ;\
+ echo '' ;\
+ echo ' program name: '$(actual_PROG) ;\
+ echo '' ;\
+ echo ' bin directory: '$(BINDIR) ;\
+ echo ' config directory: '$(SYSCONFDIR) ;\
+ echo ' man directory: '$(MANDIR) ;\
+ echo ' help directory: '$(HELPDIR) ;\
+ echo ' doc directory: '$(DOCDIR)
+
+$(BINDIR) \
+$(MANDIR) \
+$(SYSCONFDIR) \
+$(HELPDIR) \
+$(DOCDIR) :
+ mkdir -p $@
diff --git a/makefile.msc b/makefile.msc
new file mode 100644
index 0000000..19eb022
--- /dev/null
+++ b/makefile.msc
@@ -0,0 +1,515 @@
+# $LynxId: makefile.msc,v 1.31 2018/02/17 17:17:38 tom Exp $
+#
+# Makefile for `Lynx' browser for Microsoft Visual C++ 4.2 or later
+#
+
+###############################################################################
+# These are the symbols that you may wish to set on the command line:
+# DEBUG - nonempty for debugging
+# ETC_LIB - the directory containing PDCurses and ZLib (libraries and headers)
+# OPT_CS - nonempty to use color-style
+# OPT_SOCK - nonempty to build with winsock2
+# OPT_SSL - nonempty to build with OpenSSL
+# SSL_DIR - directory containing OpenSSL
+# SCREEN - name of screen-library (pdcurses)
+# PROGNAME - name of executable (lynx.exe)
+###############################################################################
+
+CC = cl
+LD = link
+
+SRC_DIR = src
+WWW_DIR = WWW\Library\Implementation
+
+# pdcurses.lib panel.lib dirent.obj curses.h panel.h dirent.h
+!if "$(ETC_LIB)" == ""
+ETC_LIB = lib
+!endif
+
+# Select a screen-library
+!if "$(SCREEN)" == ""
+SCREEN = pdcurses
+!endif
+
+# Enable the CS_DEFS and CS_OBJS lines if you wish to build the color-style
+# configuration.
+!if "$(OPT_CS)" != ""
+CS_DEFS = /D "CHAR_BIT=8" /D "USE_COLOR_STYLE"
+CS_OBJS = "LYHash.obj" "LYStyle.obj"
+!endif
+
+# Enable SOCK_DEFS if you wish to build with winsock2.
+!if "$(OPT_SOCK)" != ""
+SOCK_DEFS = /D "USE_WINSOCK2_H" /D "_WIN32_WINNT=0x0400"
+!endif
+
+# Enable these to build with OpenSSL, overriding SSL_DIR, etc., as needed.
+!if "$(OPT_SSL)" != ""
+!if "$(SSL_DIR)" == ""
+SSL_DIR = C:\OpenSSL
+!endif
+!if "$(SSL_DEFS)" == ""
+SSL_DEFS = /D "USE_SSL" -I "$(SSL_DIR)\include" -I"$(SSL_DIR)\include\openssl"
+!endif
+!if "$(SSL_LIBS)" == ""
+SSL_LIBS = "$(SSL_DIR)\lib\ssleay32.lib" "$(SSL_DIR)\lib\libeay32.lib"
+!endif
+!endif
+
+!if "$(SCREEN)" == "pdcurses"
+SCREEN_DEFS = /D "PDCURSES" /D "COLOR_CURSES" /D "FANCY_CURSES" /D "WIDE_CURSES"
+SCREEN_LIB = pdcurses
+!else
+SCREEN_DEFS = /D "USE_SLANG"
+# FIXME /D "SLANG_DLL"
+SCREEN_LIB = wslang32
+!endif
+
+INCLUDES = \
+ /I "." \
+ /I "$(SRC_DIR)" \
+ /I "$(SRC_DIR)\chrtrans" \
+ /I "$(WWW_DIR)" \
+ /I "$(ETC_LIB)"
+DEFS = /D "WIN32_LEAN_AND_MEAN" $(CS_DEFS) $(SOCK_DEFS) $(SSL_DEFS) $(SCREEN_DEFS) \
+ /D "ACCESS_AUTH" \
+ /D "CJK_EX" \
+ /D "DIRED_SUPPORT" \
+ /D "DISP_PARTIAL" \
+ /D "DONT_HAVE_TM_GMTOFF" \
+ /D "DOSPATH" \
+ /D "USE_ALT_BINDINGS" \
+ /D "EXP_NESTED_TABLES" \
+ /D "HAVE_KEYPAD" \
+ /D "LONG_LIST" \
+ /D "NDEBUG" \
+ /D "NOSIGHUP" \
+ /D "NOUSERS" \
+ /D "NO_CONFIG_INFO" \
+ /D "NO_CUSERID" \
+ /D "NO_FILIO_H" \
+ /D "NO_TTYTYPE" \
+ /D "NO_UNISTD_H" \
+ /D "NO_UTMP" \
+ /D "OK_OVERRIDE" \
+ /D "SH_EX" \
+ /D "USE_CMD_LOGGING" \
+ /D "USE_EXTERNALS" \
+ /D "USE_FILE_UPLOAD" \
+ /D "USE_JUSTIFY_ELTS" \
+ /D "USE_MULTIBYTE_CURSES" \
+ /D "USE_PERSISTENT_COOKIES" \
+ /D "USE_PRETTYSRC" \
+ /D "USE_READPROGRESS" \
+ /D "USE_SCROLLBAR" \
+ /D "USE_SOURCE_CACHE" \
+ /D "USE_BZLIB" \
+ /D "USE_ZLIB" \
+ /D "WIN32" \
+ /D "WIN_EX" \
+ /D "_CONSOLE" \
+ /D "_MBCS" \
+ /D "_WINDOWS" \
+ /D "__WIN32__" \
+ /D LY_MAXPATH="1024" \
+ /D _WIN_CC="1" \
+ /D VC="2.14FM"
+
+# /GX == /EHsc ==
+# /EHs enable C++ EH (no SEH exceptions) /EHa enable C++ EH (w/ SEH exceptions)
+# /EHc extern "C" defaults to nothrow
+MACHINE = i386
+!if "$(DEBUG)" == ""
+CFLAGS = /nologo /MT /W3 /EHsc /O2 /c
+LDFLAGS = /nologo /subsystem:console /incremental:no /machine:$(MACHINE)
+!else
+CFLAGS = /nologo /MT /W3 /EHsc /Zi /c
+LDFLAGS = /debug /nologo /subsystem:console /incremental:no /machine:$(MACHINE)
+!endif
+
+LIBS = kernel32.lib user32.lib wsock32.lib advapi32.lib /NODEFAULTLIB:libc\
+ $(ETC_LIB)\$(SCREEN_LIB).lib $(ETC_LIB)\libbz2.lib $(ETC_LIB)\zlib.lib dirent.obj $(SSL_LIBS)
+
+COMPILE = $(CC) $(CFLAGS) $(INCLUDES) $(DEFS)
+LINK = $(LD) $(LDFLAGS) /map:lynx.map /out:$@
+
+OBJS = $(CS_OBJS) \
+ "DefaultStyle.obj" \
+ "GridText.obj" \
+ "HTAABrow.obj" \
+ "HTAAProt.obj" \
+ "HTAAUtil.obj" \
+ "HTAccess.obj" \
+ "HTAlert.obj" \
+ "HTAnchor.obj" \
+ "HTAssoc.obj" \
+ "HTAtom.obj" \
+ "HTBTree.obj" \
+ "HTChunk.obj" \
+ "HTDOS.obj" \
+ "HTFTP.obj" \
+ "HTFWriter.obj" \
+ "HTFile.obj" \
+ "HTFinger.obj" \
+ "HTFormat.obj" \
+ "HTGopher.obj" \
+ "HTGroup.obj" \
+ "HTInit.obj" \
+ "HTLex.obj" \
+ "HTList.obj" \
+ "HTMIME.obj" \
+ "HTML.obj" \
+ "HTMLDTD.obj" \
+ "HTMLGen.obj" \
+ "HTNews.obj" \
+ "HTParse.obj" \
+ "HTPlain.obj" \
+ "HTRules.obj" \
+ "HTString.obj" \
+ "HTStyle.obj" \
+ "HTTCP.obj" \
+ "HTTP.obj" \
+ "HTTelnet.obj" \
+ "HTUU.obj" \
+ "HTWSRC.obj" \
+ "LYBookmark.obj" \
+ "LYCgi.obj" \
+ "LYCharSets.obj" \
+ "LYCharUtils.obj" \
+ "LYClean.obj" \
+ "LYCookie.obj" \
+ "LYCurses.obj" \
+ "LYDownload.obj" \
+ "LYEdit.obj" \
+ "LYEditmap.obj" \
+ "LYExtern.obj" \
+ "LYForms.obj" \
+ "LYGetFile.obj" \
+ "LYHistory.obj" \
+ "LYJump.obj" \
+ "LYKeymap.obj" \
+ "LYLeaks.obj" \
+ "LYList.obj" \
+ "LYLocal.obj" \
+ "LYMail.obj" \
+ "LYMain.obj" \
+ "LYMainLoop.obj" \
+ "LYMap.obj" \
+ "LYNews.obj" \
+ "LYOptions.obj" \
+ "LYPrettySrc.obj" \
+ "LYPrint.obj" \
+ "LYReadCFG.obj" \
+ "LYSearch.obj" \
+ "LYSession.obj" \
+ "LYShowInfo.obj" \
+ "LYStrings.obj" \
+ "LYTraversal.obj" \
+ "LYUpload.obj" \
+ "LYUtils.obj" \
+ "parsdate.obj" \
+ "LYexit.obj" \
+ "LYmktime.obj" \
+ "LYrcFile.obj" \
+ "SGML.obj" \
+ "TRSTable.obj" \
+ "UCAuto.obj" \
+ "UCAux.obj" \
+ "UCdomap.obj" \
+ "Xsystem.obj" \
+ "LYIcon.obj"
+
+
+# Dependencies for building
+
+.SUFFIXES : .i
+.c.i :
+ $(CC) $(INCLUDES) $(DEFS) /P $<
+
+!if "$(PROGNAME)" == ""
+PROGNAME = lynx.exe
+!endif
+
+all : $(PROGNAME)
+
+clean :
+ -del *.map
+ -del *.obj
+ -del *.res
+ -del/f/s/q *.i
+
+$(PROGNAME) : $(OBJS) dirent.obj
+ $(LINK) $(OBJS) $(LIBS)
+
+DefaultStyle.obj : $(SRC_DIR)\DefaultStyle.c
+ $(COMPILE) $(SRC_DIR)\DefaultStyle.c
+
+GridText.obj : $(SRC_DIR)\GridText.c
+ $(COMPILE) $(SRC_DIR)\GridText.c
+
+HTAlert.obj : $(SRC_DIR)\HTAlert.c
+ $(COMPILE) $(SRC_DIR)\HTAlert.c
+
+HTFWriter.obj : $(SRC_DIR)\HTFWriter.c
+ $(COMPILE) $(SRC_DIR)\HTFWriter.c
+
+HTInit.obj : $(SRC_DIR)\HTInit.c
+ $(COMPILE) $(SRC_DIR)\HTInit.c
+
+HTML.obj : $(SRC_DIR)\HTML.c
+ $(COMPILE) $(SRC_DIR)\HTML.c
+
+LYBookmark.obj : $(SRC_DIR)\LYBookmark.c
+ $(COMPILE) $(SRC_DIR)\LYBookmark.c
+
+LYCgi.obj : $(SRC_DIR)\LYCgi.c
+ $(COMPILE) $(SRC_DIR)\LYCgi.c
+
+LYCharSets.obj : $(SRC_DIR)\LYCharSets.c
+ $(COMPILE) $(SRC_DIR)\LYCharSets.c
+
+LYCharUtils.obj : $(SRC_DIR)\LYCharUtils.c
+ $(COMPILE) $(SRC_DIR)\LYCharUtils.c
+
+LYClean.obj : $(SRC_DIR)\LYClean.c
+ $(COMPILE) $(SRC_DIR)\LYClean.c
+
+LYCookie.obj : $(SRC_DIR)\LYCookie.c
+ $(COMPILE) $(SRC_DIR)\LYCookie.c
+
+LYCurses.obj : $(SRC_DIR)\LYCurses.c
+ $(COMPILE) $(SRC_DIR)\LYCurses.c
+
+LYDownload.obj : $(SRC_DIR)\LYDownload.c
+ $(COMPILE) $(SRC_DIR)\LYDownload.c
+
+LYEdit.obj : $(SRC_DIR)\LYEdit.c
+ $(COMPILE) $(SRC_DIR)\LYEdit.c
+
+LYEditmap.obj : $(SRC_DIR)\LYEditmap.c
+ $(COMPILE) $(SRC_DIR)\LYEditmap.c
+
+LYexit.obj : $(SRC_DIR)\LYexit.c
+ $(COMPILE) $(SRC_DIR)\LYexit.c
+
+LYExtern.obj : $(SRC_DIR)\LYExtern.c
+ $(COMPILE) $(SRC_DIR)\LYExtern.c
+
+LYForms.obj : $(SRC_DIR)\LYForms.c
+ $(COMPILE) $(SRC_DIR)\LYForms.c
+
+LYGetFile.obj : $(SRC_DIR)\LYGetFile.c
+ $(COMPILE) $(SRC_DIR)\LYGetFile.c
+
+LYHash.obj : $(SRC_DIR)\LYHash.c
+ $(COMPILE) $(SRC_DIR)\LYHash.c
+
+LYHistory.obj : $(SRC_DIR)\LYHistory.c
+ $(COMPILE) $(SRC_DIR)\LYHistory.c
+
+LYJump.obj : $(SRC_DIR)\LYJump.c
+ $(COMPILE) $(SRC_DIR)\LYJump.c
+
+LYKeymap.obj : $(SRC_DIR)\LYKeymap.c
+ $(COMPILE) $(SRC_DIR)\LYKeymap.c
+
+LYLeaks.obj : $(SRC_DIR)\LYLeaks.c
+ $(COMPILE) $(SRC_DIR)\LYLeaks.c
+
+LYList.obj : $(SRC_DIR)\LYList.c
+ $(COMPILE) $(SRC_DIR)\LYList.c
+
+LYLocal.obj : $(SRC_DIR)\LYLocal.c
+ $(COMPILE) $(SRC_DIR)\LYLocal.c
+
+LYMail.obj : $(SRC_DIR)\LYMail.c
+ $(COMPILE) $(SRC_DIR)\LYMail.c
+
+LYMain.obj : $(SRC_DIR)\LYMain.c
+ $(COMPILE) $(SRC_DIR)\LYMain.c
+
+LYMainLoop.obj : $(SRC_DIR)\LYMainLoop.c
+ $(COMPILE) $(SRC_DIR)\LYMainLoop.c
+
+LYMap.obj : $(SRC_DIR)\LYMap.c
+ $(COMPILE) $(SRC_DIR)\LYMap.c
+
+LYNews.obj : $(SRC_DIR)\LYNews.c
+ $(COMPILE) $(SRC_DIR)\LYNews.c
+
+LYOptions.obj : $(SRC_DIR)\LYOptions.c
+ $(COMPILE) $(SRC_DIR)\LYOptions.c
+
+LYPrettySrc.obj : $(SRC_DIR)\LYPrettySrc.c
+ $(COMPILE) $(SRC_DIR)\LYPrettySrc.c
+
+LYPrint.obj : $(SRC_DIR)\LYPrint.c
+ $(COMPILE) $(SRC_DIR)\LYPrint.c
+
+LYmktime.obj : $(SRC_DIR)\LYmktime.c
+ $(COMPILE) $(SRC_DIR)\LYmktime.c
+
+LYrcFile.obj : $(SRC_DIR)\LYrcFile.c
+ $(COMPILE) $(SRC_DIR)\LYrcFile.c
+
+LYReadCFG.obj : $(SRC_DIR)\LYReadCFG.c
+ $(COMPILE) $(SRC_DIR)\LYReadCFG.c
+
+LYSearch.obj : $(SRC_DIR)\LYSearch.c
+ $(COMPILE) $(SRC_DIR)\LYSearch.c
+
+LYSession.obj : $(SRC_DIR)\LYSession.c
+ $(COMPILE) $(SRC_DIR)\LYSession.c
+
+LYShowInfo.obj : $(SRC_DIR)\LYShowInfo.c
+ $(COMPILE) $(SRC_DIR)\LYShowInfo.c
+
+LYStrings.obj : $(SRC_DIR)\LYStrings.c
+ $(COMPILE) $(SRC_DIR)\LYStrings.c
+
+LYStyle.obj : $(SRC_DIR)\LYStyle.c
+ $(COMPILE) $(SRC_DIR)\LYStyle.c
+
+LYTraversal.obj : $(SRC_DIR)\LYTraversal.c
+ $(COMPILE) $(SRC_DIR)\LYTraversal.c
+
+LYUpload.obj : $(SRC_DIR)\LYUpload.c
+ $(COMPILE) $(SRC_DIR)\LYUpload.c
+
+LYUtils.obj : $(SRC_DIR)\LYUtils.c
+ $(COMPILE) $(SRC_DIR)\LYUtils.c
+
+parsdate.obj : $(SRC_DIR)\parsdate.c
+ $(COMPILE) $(SRC_DIR)\parsdate.c
+
+TRSTable.obj : $(SRC_DIR)\TRSTable.c
+ $(COMPILE) $(SRC_DIR)\TRSTable.c
+
+mktime.obj : $(SRC_DIR)\mktime.c
+ $(COMPILE) $(SRC_DIR)\mktime.c
+
+strstr.obj : $(SRC_DIR)\strstr.c
+ $(COMPILE) $(SRC_DIR)\strstr.c
+
+UCAuto.obj : $(SRC_DIR)\UCAuto.c
+ $(COMPILE) $(SRC_DIR)\UCAuto.c
+
+UCAux.obj : $(SRC_DIR)\UCAux.c
+ $(COMPILE) $(SRC_DIR)\UCAux.c
+
+UCdomap.obj : $(SRC_DIR)\UCdomap.c
+ $(COMPILE) $(SRC_DIR)\UCdomap.c
+
+Xsystem.obj : $(SRC_DIR)\Xsystem.c
+ $(COMPILE) $(SRC_DIR)\Xsystem.c
+
+LYIcon.obj : $(SRC_DIR)\LYIcon.rc
+ cd $(SRC_DIR)
+ $(RC) /r /fo ..\LYIcon.res LYIcon.rc
+ cd ..
+ cvtres /verbose /machine:$(MACHINE) LYIcon.res
+
+dirent.obj : $(ETC_LIB)\dirent.c
+ $(COMPILE) $(ETC_LIB)\dirent.c
+
+HTAABrow.obj : $(WWW_DIR)\HTAABrow.c
+ $(COMPILE) $(WWW_DIR)\HTAABrow.c
+
+HTAAFile.obj : $(WWW_DIR)\HTAAFile.c
+ $(COMPILE) $(WWW_DIR)\HTAAFile.c
+
+HTAAProt.obj : $(WWW_DIR)\HTAAProt.c
+ $(COMPILE) $(WWW_DIR)\HTAAProt.c
+
+HTAAUtil.obj : $(WWW_DIR)\HTAAUtil.c
+ $(COMPILE) $(WWW_DIR)\HTAAUtil.c
+
+HTAccess.obj : $(WWW_DIR)\HTAccess.c
+ $(COMPILE) $(WWW_DIR)\HTAccess.c
+
+HTAnchor.obj : $(WWW_DIR)\HTAnchor.c
+ $(COMPILE) $(WWW_DIR)\HTAnchor.c
+
+HTAssoc.obj : $(WWW_DIR)\HTAssoc.c
+ $(COMPILE) $(WWW_DIR)\HTAssoc.c
+
+HTAtom.obj : $(WWW_DIR)\HTAtom.c
+ $(COMPILE) $(WWW_DIR)\HTAtom.c
+
+HTBTree.obj : $(WWW_DIR)\HTBTree.c
+ $(COMPILE) $(WWW_DIR)\HTBTree.c
+
+HTChunk.obj : $(WWW_DIR)\HTChunk.c
+ $(COMPILE) $(WWW_DIR)\HTChunk.c
+
+HTDOS.obj : $(WWW_DIR)\HTDOS.c
+ $(COMPILE) $(WWW_DIR)\HTDOS.c
+
+HTFile.obj : $(WWW_DIR)\HTFile.c
+ $(COMPILE) $(WWW_DIR)\HTFile.c
+
+HTFinger.obj : $(WWW_DIR)\HTFinger.c
+ $(COMPILE) $(WWW_DIR)\HTFinger.c
+
+HTFormat.obj : $(WWW_DIR)\HTFormat.c
+ $(COMPILE) $(WWW_DIR)\HTFormat.c
+
+HTFTP.obj : $(WWW_DIR)\HTFTP.c
+ $(COMPILE) $(WWW_DIR)\HTFTP.c
+
+HTGopher.obj : $(WWW_DIR)\HTGopher.c
+ $(COMPILE) $(WWW_DIR)\HTGopher.c
+
+HTGroup.obj : $(WWW_DIR)\HTGroup.c
+ $(COMPILE) $(WWW_DIR)\HTGroup.c
+
+HTLex.obj : $(WWW_DIR)\HTLex.c
+ $(COMPILE) $(WWW_DIR)\HTLex.c
+
+HTList.obj : $(WWW_DIR)\HTList.c
+ $(COMPILE) $(WWW_DIR)\HTList.c
+
+HTMIME.obj : $(WWW_DIR)\HTMIME.c
+ $(COMPILE) $(WWW_DIR)\HTMIME.c
+
+HTMLDTD.obj : $(WWW_DIR)\HTMLDTD.c
+ $(COMPILE) $(WWW_DIR)\HTMLDTD.c
+
+HTMLGen.obj : $(WWW_DIR)\HTMLGen.c
+ $(COMPILE) $(WWW_DIR)\HTMLGen.c
+
+HTNews.obj : $(WWW_DIR)\HTNews.c
+ $(COMPILE) $(WWW_DIR)\HTNews.c
+
+HTParse.obj : $(WWW_DIR)\HTParse.c
+ $(COMPILE) $(WWW_DIR)\HTParse.c
+
+HTPlain.obj : $(WWW_DIR)\HTPlain.c
+ $(COMPILE) $(WWW_DIR)\HTPlain.c
+
+HTRules.obj : $(WWW_DIR)\HTRules.c
+ $(COMPILE) $(WWW_DIR)\HTRules.c
+
+HTString.obj : $(WWW_DIR)\HTString.c
+ $(COMPILE) $(WWW_DIR)\HTString.c
+
+HTStyle.obj : $(WWW_DIR)\HTStyle.c
+ $(COMPILE) $(WWW_DIR)\HTStyle.c
+
+HTTCP.obj : $(WWW_DIR)\HTTCP.c
+ $(COMPILE) $(WWW_DIR)\HTTCP.c
+
+HTTelnet.obj : $(WWW_DIR)\HTTelnet.c
+ $(COMPILE) $(WWW_DIR)\HTTelnet.c
+
+HTTP.obj : $(WWW_DIR)\HTTP.c
+ $(COMPILE) $(WWW_DIR)\HTTP.c
+
+HTUU.obj : $(WWW_DIR)\HTUU.c
+ $(COMPILE) $(WWW_DIR)\HTUU.c
+
+HTWSRC.obj : $(WWW_DIR)\HTWSRC.c
+ $(COMPILE) $(WWW_DIR)\HTWSRC.c
+
+SGML.obj : $(WWW_DIR)\SGML.c
+ $(COMPILE) $(WWW_DIR)\SGML.c
diff --git a/makelynx.bat b/makelynx.bat
new file mode 100644
index 0000000..9c1d0ee
--- /dev/null
+++ b/makelynx.bat
@@ -0,0 +1,352 @@
+@echo off
+@rem $LynxId: makelynx.bat,v 1.16 2011/06/04 00:59:22 tom Exp $
+@echo Windows/Dos batch makefile for MingW32 and lynx.exe
+@echo Remember to precede this by "command /E:8192" for Windows prior to
+@echo W2000 and "cmd.exe /E:8192" for subsequent Window versions and to
+@echo set the MingW32 C_INCLUDE_PATH and %C_INCLUDE_PATH%..\..\bin paths
+@echo.
+@echo Usage: makelynx [option]
+@echo Default option: all
+@echo Specifying "src" causes the libwww code to be skipped.
+@echo Specifying "link" causes the batch file to skip to the final
+@echo linking phase.
+@echo.
+@echo Note that you have to edit early versions of i386-mingw32\include\stdlib.h
+@echo to put an "#ifndef WIN_EX" around the declaration for `sleep', or the
+@echo compile won't work. There is also an "#ifndef PDCURSES" around
+@echo the declaration for `beep' for the same reason.
+@echo.
+@echo To change the console library from libpdcurses to libslang,
+@echo put a "rem" before the `SET LIBRARY' line below.
+@echo.
+@echo If you don't have libz.a, either compile it
+@echo or put a "rem" in front of the following USE_ZLIB line.
+@echo This will cause the gzip.exe version of lynx
+@echo to be compiled. It doesn't work well at present:
+
+SET LIBRARY=PDCURSES
+SET USE_ZLIB=YES
+
+rem Uncomment these lines if the slang/curses headers and libraries
+rem are in the top-level lib directory:
+rem set C_INCLUDE_PATH=..\lib;..\..\..\lib;%C_INCLUDE_PATH%
+rem set LIBRARY_PATH=..\lib;..\..\..\lib;%LIBRARY_PATH%
+
+echo Your compiler may not support -march=pentiumpro.
+echo In that case, replace -march=pentiumpro with -mpentium or -m486 or nothing:
+
+if "%OS%" == "Windows_NT" goto then0
+rem command.com doesn't handle the 'a=b' option
+set CC=gcc -mpentium
+goto else0
+:then0
+rem assumes a cmd.exe, rather than command.com, environment
+set CC=gcc -march=pentiumpro -mthreads
+:else0
+
+
+rem These definitions come from the Microsoft.msc makefile, with some
+rem modification. Note that -Dx=y didn't work in older versions
+rem of Windows batch files, only -Dx, so a lynx_cfg.h was needed as
+rem a workaround.
+echo /* Generated lynx_cfg.h file in the lynx directory: */ > lynx_cfg.h
+echo. >> lynx_cfg.h
+echo. >> lynx_cfg.h
+echo #define ANSI_VARARGS 1 >> lynx_cfg.h
+echo #define BOXHORI 0 >> lynx_cfg.h
+echo #define BOXVERT 0 >> lynx_cfg.h
+echo #define CAN_PIPE_TO_MAILER 0 >> lynx_cfg.h
+echo #define HAVE_GETCWD 1 >> lynx_cfg.h
+echo #define HAVE_STRERROR 1 >> lynx_cfg.h
+echo #define LYNX_CFG_FILE "./lynx.cfg" >> lynx_cfg.h
+echo #define LY_MAXPATH 1024 >> lynx_cfg.h
+echo #define USE_BLAT_MAILER 1 >> lynx_cfg.h
+echo #define VC 2.14FM >> lynx_cfg.h
+echo #define _WIN_CC 1 >> lynx_cfg.h
+rem echo #define USE_SCROLLBAR 1 >> lynx_cfg.h
+
+SET DEFINES=-DCJK_EX
+SET DEFINES=%DEFINES% -DUSE_ALT_BINDINGS
+SET DEFINES=%DEFINES% -DEXP_NESTED_TABLES
+SET DEFINES=%DEFINES% -DUSE_JUSTIFY_ELTS
+SET DEFINES=%DEFINES% -DUSE_PERSISTENT_COOKIES
+SET DEFINES=%DEFINES% -DUSE_READPROGRESS
+if not "%OS%" == "Windows_NT" goto next11
+SET DEFINES=%DEFINES% -DLY_MAXPATH=1024
+rem The following is unnecessary and causes the
+rem compile to fail:
+rem SET DEFINES=%DEFINES% -DUSE_WINSOCK2_H
+:next11
+SET DEFINES=%DEFINES% -DACCESS_AUTH
+SET DEFINES=%DEFINES% -DDIRED_SUPPORT
+SET DEFINES=%DEFINES% -DDISP_PARTIAL
+SET DEFINES=%DEFINES% -DDOSPATH
+SET DEFINES=%DEFINES% -DHAVE_DIRENT_H
+SET DEFINES=%DEFINES% -DHAVE_KEYPAD
+SET DEFINES=%DEFINES% -DLONG_LIST
+SET DEFINES=%DEFINES% -DNOSIGHUP
+SET DEFINES=%DEFINES% -DNOUSERS
+SET DEFINES=%DEFINES% -DNO_CONFIG_INFO
+SET DEFINES=%DEFINES% -DNO_CUSERID
+SET DEFINES=%DEFINES% -DNO_FILIO_H
+SET DEFINES=%DEFINES% -DNO_TTYTYPE
+SET DEFINES=%DEFINES% -DNO_UNISTD_H
+SET DEFINES=%DEFINES% -DNO_UTMP
+SET DEFINES=%DEFINES% -DSH_EX
+SET DEFINES=%DEFINES% -DUSE_EXTERNALS
+SET DEFINES=%DEFINES% -DUSE_PRETTYSRC
+SET DEFINES=%DEFINES% -DUSE_SOURCE_CACHE
+SET DEFINES=%DEFINES% -DWIN32
+SET DEFINES=%DEFINES% -DWIN_EX
+SET DEFINES=%DEFINES% -D_WINDOWS
+if not "%USE_ZLIB%" == "YES" goto next1
+SET DEFINES=%DEFINES% -DUSE_ZLIB
+:next1
+if "%LIBRARY%" == "PDCURSES" goto else1
+SET DEFINES=%DEFINES% -DUSE_SLANG
+goto endif1
+:else1
+SET DEFINES=%DEFINES% -DFANCY_CURSES
+SET DEFINES=%DEFINES% -DCOLOR_CURSES
+SET DEFINES=%DEFINES% -DPDCURSES
+SET DEFINES=%DEFINES% -DUSE_MULTIBYTE_CURSES
+:endif1
+
+if not "%1" == "src" goto else
+ cd src
+ goto src
+:else
+if not "%1" == "link" goto endif
+ cd src
+ goto link
+:endif
+
+SET INCLUDES=-I. -I..\..\.. -I..\..\..\src
+
+set CFLAGS=-O3 %INCLUDES% %DEFINES%
+set COMPILE_CMD=%CC% -c %CFLAGS%
+
+cd WWW\Library\Implementation
+erase *.o
+
+%COMPILE_CMD% HTAABrow.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTAAProt.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTAAUtil.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTAccess.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTAnchor.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTAssoc.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTAtom.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTBTree.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTChunk.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTDOS.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTFile.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTFinger.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTFormat.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTFTP.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTFWriter.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTGopher.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTGroup.c
+if errorlevel 1 PAUSE
+
+%COMPILE_CMD% HTLex.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTList.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTMIME.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTMLDTD.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTMLGen.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTNews.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTParse.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTPlain.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTRules.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTString.c
+if errorlevel 1 PAUSE
+
+%COMPILE_CMD% HTStyle.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTTCP.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTTelnet.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTTP.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTUU.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTWSRC.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% SGML.c
+if errorlevel 1 PAUSE
+
+ar crv libwww.a *.o
+
+if errorlevel 1 PAUSE
+
+cd ..\..\..\src\chrtrans
+erase *.o
+
+SET INCLUDES=-I. -I.. -I..\.. -I..\..\WWW\Library\Implementation
+SET CFLAGS=-O3 %INCLUDES% %DEFINES%
+SET COMPILE_CMD=%CC% -c %CFLAGS%
+
+%COMPILE_CMD% makeuctb.c
+if errorlevel 1 PAUSE
+%CC% -o makeuctb.exe makeuctb.o
+if errorlevel 1 PAUSE
+
+call makew32.bat
+if errorlevel 1 PAUSE
+cd ..\
+
+:src
+SET INCLUDES=-I. -I.. -I.\chrtrans -I..\WWW\Library\Implementation
+SET CFLAGS=-O3 %INCLUDES% %DEFINES%
+SET COMPILE_CMD=%CC% -c %CFLAGS%
+SET PATH=..\WWW\Library\Implementation;%PATH%
+erase *.o
+
+%COMPILE_CMD% DefaultStyle.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% GridText.c
+if errorlevel 1 PAUSE
+if not exist TRSTable.c goto notrstable
+%COMPILE_CMD% TRSTable.c
+if errorlevel 1 PAUSE
+:notrstable
+if not exist Xsystem.c goto noxsystem
+%COMPILE_CMD% Xsystem.c
+if errorlevel 1 PAUSE
+:noxsystem
+%COMPILE_CMD% HTAlert.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTFWriter.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTInit.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% HTML.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYBookmark.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYCgi.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYCharSets.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYCharUtils.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYClean.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYCookie.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYCurses.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYDownload.c
+if errorlevel 1 PAUSE
+
+%COMPILE_CMD% LYEdit.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYEditmap.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYexit.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYExtern.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYForms.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYGetFile.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYHash.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYHistory.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYJump.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYKeymap.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYLeaks.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYList.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYLocal.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYMail.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYMain.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYMainLoop.c
+if errorlevel 1 PAUSE
+
+%COMPILE_CMD% LYMap.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYNews.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYOptions.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYPrettySrc.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYPrint.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYrcFile.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYReadCFG.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYSearch.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYSession.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYShowInfo.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYStrings.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYStyle.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYTraversal.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYUpload.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% LYUtils.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% UCAuto.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% UCAux.c
+if errorlevel 1 PAUSE
+%COMPILE_CMD% UCdomap.c
+if errorlevel 1 PAUSE
+
+:link
+if not "%LIBRARY%" == "PDCURSES" goto else2
+SET LIBS=-L..\WWW\Library\Implementation -lwww -lpdcurses
+goto endif2
+:else2
+SET LIBS=-L..\WWW\Library\Implementation -lwww -lslang
+:endif2
+
+SET LIBS=%LIBS% -lwsock32 -luser32
+
+if not "%USE_ZLIB%" == "YES" goto else4
+SET LIBS=%LIBS% -lz
+:else4
+
+%CC% -s -o lynx *.o %LIBS%
+if exist lynx.exe ECHO "Welcome to lynx!"
diff --git a/makew32.bat b/makew32.bat
new file mode 100644
index 0000000..86fdd8a
--- /dev/null
+++ b/makew32.bat
@@ -0,0 +1,28 @@
+@echo off
+rem $LynxId: makew32.bat,v 1.5 2012/07/05 23:34:52 tom Exp $
+setlocal
+
+rem Check if GW32_ROOT is defined, and if not, fill in a default value.
+
+ if not "x%GW32_ROOT%"=="x" goto exists
+ set GW32_ROOT=c:\app\gnuwin32
+:exists
+
+ if exist "%GW32_ROOT%" goto doit
+ echo ? %GW32_ROOT% does not exist
+ goto finish
+
+:doit
+rem if exist %GW32_ROOT%\bcblibs set PATH=%PATH%;%GW32_ROOT%\bcblibs
+rem if not exist %GW32_ROOT%\bcblibs set PATH=%PATH%;%GW32_ROOT%\bin
+ set PATH=%PATH%;%GW32_ROOT%\bin
+
+rem Borland C
+rem -m Displays the date and time stamp of each file
+rem -c Caches auto-dependency information
+make.exe -m -c -f makefile.bcb %1 %2
+REM make.exe -m -c -f makefile.deb
+REM make.exe -f makefile.win
+
+:finish
+endlocal
diff --git a/po/POTFILES.in b/po/POTFILES.in
new file mode 100644
index 0000000..b4d8b97
--- /dev/null
+++ b/po/POTFILES.in
@@ -0,0 +1,44 @@
+# List of source files containing translatable strings.
+
+# Package source files (use 'gettext()' function).
+
+LYMessages.c
+WWW/Library/Implementation/HTAABrow.c
+WWW/Library/Implementation/HTAccess.c
+WWW/Library/Implementation/HTFTP.c
+WWW/Library/Implementation/HTFinger.c
+WWW/Library/Implementation/HTNews.c
+WWW/Library/Implementation/HTTCP.c
+WWW/Library/Implementation/HTTP.c
+WWW/Library/Implementation/HTTelnet.c
+WWW/Library/Implementation/HTWAIS.c
+WWW/Library/Implementation/HTWSRC.c
+src/GridText.c
+src/HTAlert.c
+src/HTML.c
+src/LYBookmark.c
+src/LYCgi.c
+src/LYClean.c
+src/LYCookie.c
+src/LYCurses.c
+src/LYEdit.c
+src/LYDownload.c
+src/LYHistory.c
+src/LYLeaks.c
+src/LYList.c
+src/LYLocal.c
+src/LYMail.c
+src/LYMain.c
+src/LYMainLoop.c
+src/LYNews.c
+src/LYOptions.c
+src/LYPrint.c
+src/LYReadCFG.c
+src/LYShowInfo.c
+src/LYStyle.c
+src/LYTraversal.c
+src/LYUpload.c
+src/LYUtils.c
+src/LYrcFile.c
+
+# end of file POTFILE.in
diff --git a/po/ca.po b/po/ca.po
new file mode 100644
index 0000000..c6faabb
--- /dev/null
+++ b/po/ca.po
@@ -0,0 +1,6243 @@
+# Catalan translation of the Lynx browser message catalog
+# Copyright (C) 2002 Free Software Foundation, Inc.
+# This file is distributed under the same license as the lynx package.
+# Walter Garcia-fontes <walter.garci@upf.edu>, 2015,2016
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: lynx 2.8.9-dev7\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-12-14 20:39-0500\n"
+"PO-Revision-Date: 2016-12-23 08:45+0100\n"
+"Last-Translator: Walter Garcia-Fontes <walter.garcia@upf.edu>\n"
+"Language-Team: Catalan <ca@dodds.net>\n"
+"Language: ca\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+
+#. ******************************************************************
+#. * The following definitions are for status line prompts, messages, or
+#. * warnings issued by Lynx during program execution. You can modify
+#. * them to make them more appropriate for your site. We recommend that
+#. * you extend these definitions to other languages using the gettext
+#. * library. There are also scattered uses of 'gettext()' throughout the
+#. * Lynx source, covering all but those messages which (a) are used for
+#. * debugging (CTRACE) or (b) are constants used in interaction with
+#. * other programs.
+#. *
+#. * See ABOUT-NLS and po/readme for details and location of contributed
+#. * translations. When no translation is available, the English default is
+#. * used.
+#.
+#: LYMessages.c:28
+#, c-format
+msgid "Alert!: %s"
+msgstr "Alerta!: %s"
+
+#: LYMessages.c:29
+msgid "Welcome"
+msgstr "Benvinguts"
+
+#: LYMessages.c:30
+msgid "Are you sure you want to quit?"
+msgstr "Esteu segur/a que voleu eixir?"
+
+#: LYMessages.c:32
+msgid "Really exit from Lynx?"
+msgstr "Esteu segur/a que voleu eixir de Lynx?"
+
+#: LYMessages.c:34
+msgid "Connection interrupted."
+msgstr "Connexió interrompuda."
+
+#: LYMessages.c:35
+msgid "Data transfer interrupted."
+msgstr "Transferència de dades interrompuda"
+
+#: LYMessages.c:36
+msgid "Cancelled!!!"
+msgstr "Cancel·lat!!"
+
+#: LYMessages.c:37
+msgid "Cancelling!"
+msgstr "Cancel·lació!"
+
+#: LYMessages.c:38
+msgid "Excellent!!!"
+msgstr "Excel·lent!!"
+
+#: LYMessages.c:39
+msgid "OK"
+msgstr "D'acord"
+
+#: LYMessages.c:40
+msgid "Done!"
+msgstr "Fet!"
+
+#: LYMessages.c:41
+msgid "Bad request!"
+msgstr "Sol·licitud incorrecta!"
+
+#: LYMessages.c:42
+msgid "previous"
+msgstr "anterior"
+
+#: LYMessages.c:43
+msgid "next screen"
+msgstr "següent pantalla"
+
+#: LYMessages.c:44
+msgid "HELP!"
+msgstr "AJUDA!"
+
+#: LYMessages.c:45
+msgid ", help on "
+msgstr ", ajuda sobre "
+
+#. #define HELP
+#: LYMessages.c:47
+msgid "Commands: Use arrow keys to move, '?' for help, 'q' to quit, '<-' to go back."
+msgstr "Useu les fletxes per a moure-us, '?' ajuda, 'q' eixir, '<-' torna enrere."
+
+#. #define MOREHELP
+#: LYMessages.c:49
+msgid "-- press space for more, use arrow keys to move, '?' for help, 'q' to quit."
+msgstr "Useu <espai> per a continuar, fletxes per a moure-us, '?' ajuda, 'q' eixir."
+
+#: LYMessages.c:50
+msgid "-- press space for next page --"
+msgstr "-- premeu <espai> per passar a la següent pàgina --"
+
+#: LYMessages.c:51
+msgid "URL too long"
+msgstr "La URL especificada és massa llarga"
+
+#. Inactive input fields, messages used with -tna option - kw
+#. #define FORM_LINK_TEXT_ADV_MSG_INA
+#: LYMessages.c:57
+#, c-format
+msgid "(Textfield \"%s\"); Inactive. Press <return> to activate."
+msgstr "(Camp d'entrada de text «%s»); Inactiu. Premeu <intro> per activar-lo."
+
+#. #define FORM_LINK_TEXT_MESSAGE_INA
+#: LYMessages.c:59
+msgid "(Text entry field) Inactive. Press <return> to activate."
+msgstr "(Camp d'entrada de text) Inactiu. Premeu <intro> per activar-lo."
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG_INA
+#: LYMessages.c:61
+#, c-format
+msgid "(Textarea \"%s\"); Inactive. Press <return> to activate."
+msgstr "(Àrea de text «%s»); Inactiva. Premeu <intro> per activar-la."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_INA
+#: LYMessages.c:63
+msgid "(Textarea) Inactive. Press <return> to activate."
+msgstr "(Àrea de text) Inactiva. Premeu <intro> per activar-la."
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG_INA_E
+#: LYMessages.c:65
+#, c-format
+msgid "(Textarea \"%s\"); Inactive. Press <return> to activate (%s for editor)."
+msgstr "(Àrea de text Reconciled «%s»); Inactiva. Premeu <intro> per activar-la (%s per a l'editor)."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_INA_E
+#: LYMessages.c:67
+#, c-format
+msgid "(Textarea) Inactive. Press <return> to activate (%s for editor)."
+msgstr "(Àrea de text) Inactiva. Premeu <intro> per activar-la (%s per a l'editor)."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE_INA
+#: LYMessages.c:69
+msgid "(Form field) Inactive. Use <return> to edit."
+msgstr "(Camp de formulari) Inactiu. Useu <intro> per a editar."
+
+#. #define FORM_TEXT_SUBMIT_MESSAGE_INA_X
+#: LYMessages.c:71
+#, c-format
+msgid "(Form field) Inactive. Use <return> to edit (%s to submit with no cache)."
+msgstr "(Camp form.) Inactiu. <intro> per a editar (%s per a enviar sense mem. cau)."
+
+#. #define FORM_TEXT_RESUBMIT_MESSAGE_INA
+#: LYMessages.c:73
+msgid "(Form field) Inactive. Press <return> to edit, press <return> twice to submit."
+msgstr "(Camp form.) Inactiu. <intro> per a editar, <intro> dues vegades per a enviar."
+
+#. #define FORM_TEXT_SUBMIT_MAILTO_MSG_INA
+#: LYMessages.c:75
+msgid "(mailto form field) Inactive. Press <return> to change."
+msgstr "(Camp de formulari de correu) Inactiu. Premeu <intro> per a canviar-ho."
+
+#. #define FORM_LINK_PASSWORD_MESSAGE_INA
+#: LYMessages.c:77
+msgid "(Password entry field) Inactive. Press <return> to activate."
+msgstr "(Camp de contrasenya) Inactiu. Premeu <intro> per activar-lo."
+
+#. #define FORM_LINK_FILE_UNM_MSG
+#: LYMessages.c:80
+msgid "UNMODIFIABLE file entry field. Use UP or DOWN arrows or tab to move off."
+msgstr "Camp de fitxer IMMODIFICABLE. Useu les fletxes o <tab> per a eixir-ne."
+
+#. #define FORM_LINK_FILE_MESSAGE
+#: LYMessages.c:82
+msgid "(File entry field) Enter filename. Use UP or DOWN arrows or tab to move off."
+msgstr "(Camp de fitxer) Introduïu el nom de l'arxiu. Fletxes o <tab> per a eixir-ne."
+
+#. #define FORM_LINK_TEXT_ADV_MSG
+#. #define FORM_LINK_TEXT_MESSAGE
+#: LYMessages.c:84 LYMessages.c:86
+#, c-format
+msgid "(Textfield \"%s\"); Enter text. Use UP or DOWN arrows or tab to move off."
+msgstr "(Camp de text «%s»); Introduïu text. Useu les fletxes o <tab> per a eixir-ne."
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG
+#: LYMessages.c:88
+#, c-format
+msgid "(Textarea \"%s\"); Enter text. Use UP/DOWN arrows or TAB to move off."
+msgstr "(Àrea de text «%s»); Introduïu text. Fletxes o <tab> per a eixir-ne."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE
+#: LYMessages.c:90
+msgid "(Textarea) Enter text. Use UP/DOWN arrows or TAB to move off."
+msgstr "(Àrea de text) Introduïu text. Fletxes o <tab> per a eixir-ne."
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG_E
+#: LYMessages.c:92
+#, c-format
+msgid "(Textarea \"%s\"); Enter text. Use UP/DOWN arrows or TAB to move off (%s for editor)."
+msgstr "(Àrea de text «%s»); Introduïu text. Fletxes o <tab> per a eixir-ne (%s per a l'editor)."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_E
+#: LYMessages.c:94
+#, c-format
+msgid "(Textarea) Enter text. Use UP/DOWN arrows or TAB to move off (%s for editor)."
+msgstr "(À. text) Introduïu text. Fletxes o <tab> per a eixir-ne (%s per a l'editor)."
+
+#. #define FORM_LINK_TEXT_UNM_MSG
+#: LYMessages.c:96
+msgid "UNMODIFIABLE form text field. Use UP or DOWN arrows or tab to move off."
+msgstr "Camp de text IMMODIFICABLE. Useu les fletxes o <tab> per a eixir-ne."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE
+#: LYMessages.c:98
+msgid "(Form field) Enter text. Use <return> to submit."
+msgstr "(Camp de formulari) Introduïu text. Useu <intro> per a enviar."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE_X
+#: LYMessages.c:100
+#, c-format
+msgid "(Form field) Enter text. Use <return> to submit (%s for no cache)."
+msgstr "(Camp de formulari) Introduïu text. <intro> per a enviar (%s sensemem. cau)."
+
+#. #define FORM_LINK_TEXT_RESUBMIT_MESSAGE
+#: LYMessages.c:102
+msgid "(Form field) Enter text. Use <return> to submit, arrows or tab to move off."
+msgstr "(C. form.) Introduïu text. <intro> per a enviar, fletxes o tab per eixir-ne."
+
+#. #define FORM_LINK_TEXT_SUBMIT_UNM_MSG
+#: LYMessages.c:104
+msgid "UNMODIFIABLE form field. Use UP or DOWN arrows or tab to move off."
+msgstr "Camp IMMODIFICABLE. Useu les fletxes o el tabulador per a eixir-ne."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MAILTO_MSG
+#: LYMessages.c:106
+msgid "(mailto form field) Enter text. Use <return> to submit, arrows to move off."
+msgstr "(correu) Introduïu text. <intro> per enviar-lo, amb les fletxes n'eixireu."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MAILTO_DIS_MSG
+#: LYMessages.c:108
+msgid "(mailto form field) Mail is disallowed so you cannot submit."
+msgstr "(Camp form. correu) El correu no està permés: no podeu enviar-ne."
+
+#. #define FORM_LINK_PASSWORD_MESSAGE
+#: LYMessages.c:110
+msgid "(Password entry field) Enter text. Use UP or DOWN arrows or tab to move off."
+msgstr "(Contrasenya) Introduïu text. Useu les fletxes o <tab> per a eixir-ne."
+
+#. #define FORM_LINK_PASSWORD_UNM_MSG
+#: LYMessages.c:112
+msgid "UNMODIFIABLE form password. Use UP or DOWN arrows or tab to move off."
+msgstr "Camp de contrasenya IMMODIFICABLE. Fletxes o <tab> per a eixir-ne."
+
+#. #define FORM_LINK_CHECKBOX_ADV_MSG
+#: LYMessages.c:114
+#, c-format
+msgid "(Checkbox \"%s\"); Use right-arrow or <return> to toggle."
+msgstr "(Camp de verificació «%s») Useu fletxa dreta o <intro> per a canviar."
+
+#. #define FORM_LINK_CHECKBOX_MESSAGE
+#: LYMessages.c:116
+msgid "(Checkbox Field) Use right-arrow or <return> to toggle."
+msgstr "(Camp de verificació) Useu '->' o <intro> per a canviar."
+
+#. #define FORM_LINK_CHECKBOX_UNM_MSG
+#: LYMessages.c:118
+msgid "UNMODIFIABLE form checkbox. Use UP or DOWN arrows or tab to move off."
+msgstr "Quadre de verificació IMMODIFICABLE. Useu les fletxes per a eixir-ne."
+
+#. #define FORM_LINK_RADIO_ADV_MSG
+#: LYMessages.c:120
+#, c-format
+msgid "(Radio Button \"%s\"); Use right-arrow or <return> to toggle."
+msgstr "(Botó d'opció «%s»); Useu fletxa-dreta o <intro> per commutar."
+
+#. #define FORM_LINK_RADIO_MESSAGE
+#: LYMessages.c:122
+msgid "(Radio Button) Use right-arrow or <return> to toggle."
+msgstr "(Botó d'opció) Useu fletxa-dreta o <intro> per commutar."
+
+#. #define FORM_LINK_RADIO_UNM_MSG
+#: LYMessages.c:124
+msgid "UNMODIFIABLE form radio button. Use UP or DOWN arrows or tab to move off."
+msgstr "Botó de grup IMMODIFICABLE. Useu fletxes o <tab> per a eixir-ne."
+
+#. #define FORM_LINK_SUBMIT_PREFIX
+#: LYMessages.c:126
+msgid "Submit ('x' for no cache) to "
+msgstr "Enviar a ('x' sense mem. cau) "
+
+#. #define FORM_LINK_RESUBMIT_PREFIX
+#: LYMessages.c:128
+msgid "Submit to "
+msgstr "Enviar a "
+
+#. #define FORM_LINK_SUBMIT_MESSAGE
+#: LYMessages.c:130
+msgid "(Form submit button) Use right-arrow or <return> to submit ('x' for no cache)."
+msgstr "(Botó d'enviament) Useu '->' o <intro> per a enviar ('x' sense mem. cau)."
+
+#. #define FORM_LINK_RESUBMIT_MESSAGE
+#: LYMessages.c:132
+msgid "(Form submit button) Use right-arrow or <return> to submit."
+msgstr "(Botó d'enviament) Useu '->' o <intro> per a enviar."
+
+#. #define FORM_LINK_SUBMIT_DIS_MSG
+#: LYMessages.c:134
+msgid "DISABLED form submit button. Use UP or DOWN arrows or tab to move off."
+msgstr "Botó d'enviament DESACTIVAT. Useu les fletxes o <tab> per a eixir-ne."
+
+#. #define FORM_LINK_SUBMIT_MAILTO_PREFIX
+#: LYMessages.c:136
+msgid "Submit mailto form to "
+msgstr "Enviar correu a "
+
+#. #define FORM_LINK_SUBMIT_MAILTO_MSG
+#: LYMessages.c:138
+msgid "(mailto form submit button) Use right-arrow or <return> to submit."
+msgstr "(Botó d'enviament de correu) Useu '->' o <intro> per a enviar-lo."
+
+#. #define FORM_LINK_SUBMIT_MAILTO_DIS_MSG
+#: LYMessages.c:140
+msgid "(mailto form submit button) Mail is disallowed so you cannot submit."
+msgstr "(Botó d'enviament de correu) El correu no està permés: no podeuenviar-ne."
+
+#. #define FORM_LINK_RESET_MESSAGE
+#: LYMessages.c:142
+msgid "(Form reset button) Use right-arrow or <return> to reset form to defaults."
+msgstr "(Botó de reinici) Useu '->' o <intro> per a tornar als valors predeterminats."
+
+#. #define FORM_LINK_RESET_DIS_MSG
+#: LYMessages.c:144
+msgid "DISABLED form reset button. Use UP or DOWN arrows or tab to move off."
+msgstr "Botó de reinici DESACTIVAT. Useu les fletxes o <tab> per a eixir-ne."
+
+#. #define FORM_LINK_BUTTON_MESSAGE
+#: LYMessages.c:146
+msgid "(Script button) Use UP or DOWN arrows or tab to move off."
+msgstr "(Botó d'script) Useu les fletxes cap amunt o cap avall o el tabulador per eixir-ne."
+
+#. #define FORM_LINK_BUTTON_ADV_MSG
+#: LYMessages.c:148
+#, c-format
+msgid "(Script button \"%s\"); Use UP or DOWN arrows or tab to move off."
+msgstr "(Botó d'script «%s»); Useu les fletxes cap amunt o cap avall o el tabulador per eixir-ne."
+
+#. #define FORM_LINK_BUTTON_DIS_MSG
+#: LYMessages.c:150
+msgid "DISABLED Script button. Use UP or DOWN arrows or tab to move off."
+msgstr "Botó d'script DESACTIVAT. Useu les fletxes cap amunt o cap avall o el tabulador per eixir-ne."
+
+#. #define FORM_LINK_OPTION_LIST_ADV_MSG
+#: LYMessages.c:152
+#, c-format
+msgid "(Option list \"%s\"); Hit return to select option."
+msgstr "(Llista d'opcions «%s»); Premeu <intro> per a triar una opció."
+
+#. #define FORM_LINK_OPTION_LIST_MESSAGE
+#: LYMessages.c:154
+msgid "(Option list) Hit return and use arrow keys and return to select option."
+msgstr "(Opcions) Premeu <intro> i useu les fletxes i <intro> per a triar-ne una."
+
+#. #define CHOICE_LIST_ADV_MSG
+#: LYMessages.c:156
+#, c-format
+msgid "(Choice entry \"%s\"); Use arrow keys and return to select option."
+msgstr "(Trieu l'entrada «%s»); Useu les tecles de fletxes i intro per triar una opció."
+
+#. #define CHOICE_LIST_MESSAGE
+#: LYMessages.c:158
+msgid "(Choice list) Hit return and use arrow keys and return to select option."
+msgstr "(Tria) Premeu <intro>; useu les fletxes i <intro> per a triar una opció."
+
+#. #define MOUSE_CHOICE_MESSAGE
+#: LYMessages.c:160
+msgid "Left mouse button or return to select, arrow keys to scroll."
+msgstr "Botó esquerre del ratolí o intro per triar, tecles de fletxes pel desplaçament."
+
+#. #define FORM_LINK_OPTION_LIST_UNM_MSG
+#: LYMessages.c:162
+msgid "UNMODIFIABLE option list. Use return or arrow keys to review or leave."
+msgstr "Llista IMMODIFICABLE. <intro> per a revisar-la o fletxes per aeixir-ne."
+
+#. #define CHOICE_LIST_UNM_MSG
+#: LYMessages.c:164
+msgid "UNMODIFIABLE choice list. Use return or arrow keys to review or leave."
+msgstr "Llista IMMODIFICABLE. <intro> per a revisar-la o les fletxes per aeixir-ne."
+
+#: LYMessages.c:165
+msgid "Submitting form..."
+msgstr "Enviant..."
+
+#: LYMessages.c:166
+msgid "Resetting form..."
+msgstr "Restablint els valors inicials del formulari..."
+
+#. #define RELOADING_FORM
+#: LYMessages.c:168
+msgid "Reloading document. Any form entries will be lost!"
+msgstr "Recarregant document. Qualsevol entrada anterior es perdrà!"
+
+#. #define LINK_NOT_IN_FORM
+#: LYMessages.c:170
+msgid "The current link is not in a FORM"
+msgstr "L'enllaça actual no està a un FORMULARI"
+
+#: LYMessages.c:171
+#, c-format
+msgid "Warning: Cannot transcode form data to charset %s!"
+msgstr "Alerta: No es poden convertir les dades al joc de caràcters %s!"
+
+#. #define NORMAL_LINK_MESSAGE
+#: LYMessages.c:174
+msgid "(NORMAL LINK) Use right-arrow or <return> to activate."
+msgstr "(ENLLAÇ NORMAL) Useu la fletxa a la dreta o <return> per a seguir-lo."
+
+#: LYMessages.c:175
+msgid "The resource requested is not available at this time."
+msgstr "El recurs sol·licitat no està disponible a hores d'ara."
+
+#: LYMessages.c:176
+msgid "Enter Lynx keystroke command: "
+msgstr "Introduïu la combinació de tecles: "
+
+#: LYMessages.c:177
+msgid "Looking up "
+msgstr "Buscant "
+
+#: LYMessages.c:178
+#, c-format
+msgid "Getting %s"
+msgstr "Rebent %s"
+
+#: LYMessages.c:179
+#, c-format
+msgid "Skipping %s"
+msgstr "Saltant-se %s"
+
+#: LYMessages.c:180
+#, c-format
+msgid "Using %s"
+msgstr "Usant %s"
+
+#: LYMessages.c:181
+#, c-format
+msgid "Illegal URL: %s"
+msgstr "Adreça il·legal: %s"
+
+#: LYMessages.c:182
+#, c-format
+msgid "Badly formed address %s"
+msgstr "Adreça mal formada: %s"
+
+#: LYMessages.c:183
+#, c-format
+msgid "URL: %s"
+msgstr "URL: %s"
+
+#: LYMessages.c:184
+msgid "Unable to access WWW file!!!"
+msgstr "No ha estat possible accedir a l'arxiu!!"
+
+#: LYMessages.c:185
+#, c-format
+msgid "This is a searchable index. Use %s to search."
+msgstr "Índex de recerca. Useu %s per a buscar."
+
+#. #define WWW_INDEX_MORE_MESSAGE
+#: LYMessages.c:187
+#, c-format
+msgid "--More-- This is a searchable index. Use %s to search."
+msgstr "--Més-- Índex de recerca. Useu %s per a buscar."
+
+#: LYMessages.c:188
+msgid "You have entered an invalid link number."
+msgstr "Heu introduït un número d'enllaç incorrecte."
+
+#. #define SOURCE_HELP
+#: LYMessages.c:190
+msgid "Currently viewing document source. Press '\\' to return to rendered version."
+msgstr "Aquest és el document font. Premeu '\\' per tornar a la versió interpretada."
+
+#. #define NOVICE_LINE_ONE
+#: LYMessages.c:192
+msgid " Arrow keys: Up and Down to move. Right to follow a link; Left to go back. \n"
+msgstr "Fletxes amunt i avall per a moure-us. '->' segueix l'enllaç; '<-' tornaenrere\n"
+
+#. #define NOVICE_LINE_TWO
+#: LYMessages.c:194
+msgid " H)elp O)ptions P)rint G)o M)ain screen Q)uit /=search [delete]=history list \n"
+msgstr "H ajuda O)pcions im(P)rimir G anar M principal Q ix / buscar [del] història\n"
+
+#. #define NOVICE_LINE_TWO_A
+#: LYMessages.c:196
+msgid " O)ther cmds H)elp K)eymap G)oto P)rint M)ain screen o)ptions Q)uit \n"
+msgstr "O altres H ajuda K tecles G anar im(P)rimir M principal o)pcions Q ix \n"
+
+#. #define NOVICE_LINE_TWO_B
+#: LYMessages.c:198
+msgid " O)ther cmds B)ack E)dit D)ownload ^R)eload ^W)ipe screen search doc: / \n"
+msgstr "O altres B enrere E)ditar D)escarregar ^R)ecarregar ^W refrescar / buscar \n"
+
+#. #define NOVICE_LINE_TWO_C
+#: LYMessages.c:200
+msgid "O)ther cmds C)omment History: <backspace> Bookmarks: V)iew, A)dd, R)emove \n"
+msgstr "O altres C)omentari [del] història llibreta: V)eure, A)fegir, R eliminar\n"
+
+#. #define FORM_NOVICELINE_ONE
+#: LYMessages.c:202
+msgid " Enter text into the field by typing on the keyboard "
+msgstr " Useu el teclat per a introduir text en el camp "
+
+#. #define FORM_NOVICELINE_TWO
+#: LYMessages.c:204
+msgid " Ctrl-U to delete all text in field, [Backspace] to delete a character "
+msgstr " Ctrl-U esborra tot el text, [Backspace] esborra només un caràcter "
+
+#. #define FORM_NOVICELINE_TWO_DELBL
+#: LYMessages.c:206
+msgid " Ctrl-U to delete text in field, [Backspace] to delete a character "
+msgstr " Ctrl-U esborra el text, [Backspace] esborra només un caràcter "
+
+#. #define FORM_NOVICELINE_TWO_VAR
+#: LYMessages.c:208
+#, c-format
+msgid " %s to delete all text in field, [Backspace] to delete a character "
+msgstr " %s esborra tot el text, [Backspace] esborra només un caràcter "
+
+#. #define FORM_NOVICELINE_TWO_DELBL_VAR
+#: LYMessages.c:210
+#, c-format
+msgid " %s to delete text in field, [Backspace] to delete a character "
+msgstr " %s esborra el text, [Backspace] esborra només un caràcter "
+
+#. mailto
+#: LYMessages.c:213
+msgid "Malformed mailto form submission! Cancelled!"
+msgstr "Formulari d'enviament de correu mal format! Anul·lació!"
+
+#: LYMessages.c:214
+msgid "Warning! Control codes in mail address replaced by ?"
+msgstr "Alerta! Codis de control en l'adreça de correu substituïts per \"?\""
+
+#: LYMessages.c:215
+msgid "Mail disallowed! Cannot submit."
+msgstr "El correu no està permés! No s'ha pogut enviar."
+
+#: LYMessages.c:216
+msgid "Mailto form submission failed!"
+msgstr "El formulari d'enviament de correu ha fallat!"
+
+#: LYMessages.c:217
+msgid "Mailto form submission Cancelled!!!"
+msgstr "Enviament cancel·lat!!"
+
+#: LYMessages.c:218
+msgid "Sending form content..."
+msgstr "Enviant el contingut del formulari..."
+
+#: LYMessages.c:219
+msgid "No email address is present in mailto URL!"
+msgstr "No hi ha cap adreça de correu en aquesta URL!"
+
+#. #define MAILTO_URL_TEMPOPEN_FAILED
+#: LYMessages.c:221
+msgid "Unable to open temporary file for mailto URL!"
+msgstr "Ha estat impossible obrir el fitxer temporal per a enviar correu a URL!"
+
+#. #define INC_ORIG_MSG_PROMPT
+#: LYMessages.c:223
+msgid "Do you wish to include the original message?"
+msgstr "Voleu incloure-hi el missatge original?"
+
+#. #define INC_PREPARSED_MSG_PROMPT
+#: LYMessages.c:225
+msgid "Do you wish to include the preparsed source?"
+msgstr "Voleu incloure-hi la font preanalitzada?"
+
+#. #define SPAWNING_EDITOR_FOR_MAIL
+#: LYMessages.c:227
+msgid "Spawning your selected editor to edit mail message"
+msgstr "Obrint l'editor seleccionat per a editar el missatge de correu"
+
+#. #define ERROR_SPAWNING_EDITOR
+#: LYMessages.c:229
+msgid "Error spawning editor, check your editor definition in the options menu"
+msgstr "No s'ha pogut obrir l'editor, comproveu-ne la definició en el menúd'opcions"
+
+#: LYMessages.c:230
+msgid "Send this comment?"
+msgstr "Enviar aquest comentari?"
+
+#: LYMessages.c:231
+msgid "Send this message?"
+msgstr "Enviar aquest missatge?"
+
+#: LYMessages.c:232
+msgid "Sending your message..."
+msgstr "Enviant el missatge..."
+
+#: LYMessages.c:233
+msgid "Sending your comment:"
+msgstr "Enviant el comentari:"
+
+#. textarea
+#: LYMessages.c:236
+msgid "Not in a TEXTAREA; cannot use external editor."
+msgstr "No és una àrea de text; no hi podeu usar l'editor extern."
+
+#: LYMessages.c:237
+msgid "Not in a TEXTAREA; cannot use command."
+msgstr "No és una àrea de text; no s'hi pot usar l'ordre indicada."
+
+#: LYMessages.c:239
+msgid "file: ACTIONs are disallowed!"
+msgstr "fitxer: les accions (ACTIONS) no estan permeses!"
+
+#. #define FILE_SERVED_LINKS_DISALLOWED
+#: LYMessages.c:241
+msgid "file: URLs via served links are disallowed!"
+msgstr "fitxer: no estan permesos els URL proveïts per un enllaç servit"
+
+#: LYMessages.c:242
+msgid "Access to local files denied."
+msgstr "Accés als arxius locals denegat."
+
+#: LYMessages.c:243
+msgid "file: URLs via bookmarks are disallowed!"
+msgstr "fitxer: les URLs del fitxer d'adreces d'interés no estan permeses!"
+
+#. #define SPECIAL_VIA_EXTERNAL_DISALLOWED
+#: LYMessages.c:245
+msgid "This special URL is not allowed in external documents!"
+msgstr "No es permet aquesta URL especial en documents externs!"
+
+#: LYMessages.c:246
+msgid "Press <return> to return to Lynx."
+msgstr "Premeu <return> per tornar a Lynx."
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:249
+msgid "Spawning DCL subprocess. Use 'logout' to return to Lynx.\n"
+msgstr "S'està engendrant el subprocés DCL. Useu «logout» per tornar al Lynx.\n"
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:253
+msgid "Type EXIT to return to Lynx.\n"
+msgstr "Escriviu 'exit' per a tornar a Lynx.\n"
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:256
+msgid "Spawning your default shell. Use 'exit' to return to Lynx.\n"
+msgstr "Obrint la shell predeterminada. Useu \"exit\" per a tornar a Lynx.\n"
+
+#: LYMessages.c:259
+msgid "Spawning is currently disabled."
+msgstr "Actualment no està habilitat engendrar."
+
+#: LYMessages.c:260
+msgid "The 'd'ownload command is currently disabled."
+msgstr "Actualment l'opció de (d)escàrrega no està activa."
+
+#: LYMessages.c:261
+msgid "You cannot download an input field."
+msgstr "No és possible descarregar un camp d'entrada de dades."
+
+#: LYMessages.c:262
+msgid "Form has a mailto action! Cannot download."
+msgstr "El formulari té una acció mailto. No es pot descarregar."
+
+#: LYMessages.c:263
+msgid "You cannot download a mailto: link."
+msgstr "No es pot descarregar un enllaç a una adreça de correu."
+
+#: LYMessages.c:264
+msgid "You cannot download cookies."
+msgstr "Les cookies es poden descarregar."
+
+#: LYMessages.c:265
+msgid "You cannot download a printing option."
+msgstr "No es poden descarregar les opcions d'impressió."
+
+#: LYMessages.c:266
+msgid "You cannot download an upload option."
+msgstr "No es poden descarregar les opcions de càrrega."
+
+#: LYMessages.c:267
+msgid "You cannot download an permit option."
+msgstr "No podeu descarregar una opció de permís."
+
+#: LYMessages.c:268
+msgid "This special URL cannot be downloaded!"
+msgstr "Aquesta URL especial no es pot descarregar!"
+
+#: LYMessages.c:269
+msgid "Nothing to download."
+msgstr "No hi ha res per descarregar."
+
+#: LYMessages.c:270
+msgid "Trace ON!"
+msgstr "Rastreig activat! (Trace ON!)"
+
+#: LYMessages.c:271
+msgid "Trace OFF!"
+msgstr "Rastreig desactivat! (Trace OFF!)"
+
+#. #define CLICKABLE_IMAGES_ON
+#: LYMessages.c:273
+msgid "Links will be included for all images! Reloading..."
+msgstr "S'hi inclouran els enllaços a totes les imatges! Recarregant..."
+
+#. #define CLICKABLE_IMAGES_OFF
+#: LYMessages.c:275
+msgid "Standard image handling restored! Reloading..."
+msgstr "Manejament estàndar d'imatges restaurat! Recarregant..."
+
+#. #define PSEUDO_INLINE_ALTS_ON
+#: LYMessages.c:277
+msgid "Pseudo_ALTs will be inserted for inlines without ALT strings! Reloading..."
+msgstr "S'inseriran pseudo-ALTs per a les imatges sense cadena ALT! Recarrega..."
+
+#. #define PSEUDO_INLINE_ALTS_OFF
+#: LYMessages.c:279
+msgid "Inlines without an ALT string specified will be ignored! Reloading..."
+msgstr "S'ignoraran les imatges sense cadena alternativa ("
+
+#: LYMessages.c:280
+msgid "Raw 8-bit or CJK mode toggled OFF! Reloading..."
+msgstr "Mode 8-bits cru o CJK activat! Recàrrega..."
+
+#: LYMessages.c:281
+msgid "Raw 8-bit or CJK mode toggled ON! Reloading..."
+msgstr "Mode 8-bits cru o CJK desactivat! Recàrrega..."
+
+#. #define HEAD_D_L_OR_CANCEL
+#: LYMessages.c:283
+msgid "Send HEAD request for D)ocument or L)ink, or C)ancel? (d,l,c): "
+msgstr "Voleu enviar una sol·licitud HEAD per al D)ocument o l'en(L)laç, or C)ancel·lar? (d,l,c):"
+
+#. #define HEAD_D_OR_CANCEL
+#: LYMessages.c:285
+msgid "Send HEAD request for D)ocument, or C)ancel? (d,c): "
+msgstr "Voleu enviar una sol·licitud HEAD per al D)ocument o C)ancel·lar? (d,c):"
+
+#: LYMessages.c:286
+msgid "Sorry, the document is not an http URL."
+msgstr "El document no és una URL http."
+
+#: LYMessages.c:287
+msgid "Sorry, the link is not an http URL."
+msgstr "L'enllaç no és una URL http."
+
+#: LYMessages.c:288
+msgid "Sorry, the ACTION for this form is disabled."
+msgstr "L'ACCIÓ del formulari no està disponible."
+
+#. #define FORM_ACTION_NOT_HTTP_URL
+#: LYMessages.c:290
+msgid "Sorry, the ACTION for this form is not an http URL."
+msgstr "L'ACCIÓ del formulari no és una adreça de http."
+
+#: LYMessages.c:291
+msgid "Not an http URL or form ACTION!"
+msgstr "No és una URL http ni una ACCIO de formulari!"
+
+#: LYMessages.c:292
+msgid "This special URL cannot be a form ACTION!"
+msgstr "Aquesta URL especial no pot ser una ACCIO de formulari!"
+
+#: LYMessages.c:293
+msgid "URL is not in starting realm!"
+msgstr "La URL no està en el domini inicial!"
+
+#: LYMessages.c:294
+msgid "News posting is disabled!"
+msgstr "L'enviament de missatges als fòrums de discusió està desactivada!"
+
+#: LYMessages.c:295
+msgid "File management support is disabled!"
+msgstr "L'administració de fitxers està desactivada!"
+
+#: LYMessages.c:296
+msgid "No jump file is currently available."
+msgstr "No hi ha cap fitxer de salts disponible."
+
+#: LYMessages.c:297
+msgid "Jump to (use '?' for list): "
+msgstr "Saltar a (premeu '?' per veure la llista): "
+
+#: LYMessages.c:298
+msgid "Jumping to a shortcut URL is disallowed!"
+msgstr "El salt a una URL de drecera esta deshabilitat!"
+
+#: LYMessages.c:299
+msgid "Random URL is disallowed! Use a shortcut."
+msgstr "Les adreces aleatòries estan desactivades. Useu una drecera."
+
+#: LYMessages.c:300
+msgid "No random URLs have been used thus far."
+msgstr "Fins ara no s'han usat URLs aleatòries."
+
+#: LYMessages.c:301
+msgid "Bookmark features are currently disabled."
+msgstr "Els \"favorits\" estan desactivats."
+
+#: LYMessages.c:302
+msgid "Execution via bookmarks is disabled."
+msgstr "L'execució a través del fitxer d'adreces està desactivada."
+
+#. #define BOOKMARK_FILE_NOT_DEFINED
+#: LYMessages.c:304
+#, c-format
+msgid "Bookmark file is not defined. Use %s to see options."
+msgstr "El fitxer de favorits no està definit. Useu %s per a veure les opcions."
+
+#. #define NO_TEMP_FOR_HOTLIST
+#: LYMessages.c:306
+msgid "Unable to open tempfile for X Mosaic hotlist conversion."
+msgstr "No ha estat possible obrir el fitxer temporal per a convertir el fitxer d'adreces de Mosaic."
+
+#: LYMessages.c:307
+msgid "ERROR - unable to open bookmark file."
+msgstr "ERROR: ha estat impossible obrir l'arxiu d'adreces"
+
+#. #define BOOKMARK_OPEN_FAILED_FOR_DEL
+#: LYMessages.c:309
+msgid "Unable to open bookmark file for deletion of link."
+msgstr "No ha estat possible obrir l'arxiu d'adreces per esborrar l'enllaç."
+
+#. #define BOOKSCRA_OPEN_FAILED_FOR_DEL
+#: LYMessages.c:311
+msgid "Unable to open scratch file for deletion of link."
+msgstr "No s'ha pogut obrir el fitxer de treball per a l'esborrament de l'enllaç"
+
+#: LYMessages.c:313
+msgid "Error renaming scratch file."
+msgstr "S'ha produït un error en reanomenar el fitxer de treball."
+
+#: LYMessages.c:315
+msgid "Error renaming temporary file."
+msgstr "Error quan s'intentava reanomenar un arxiu temporal."
+
+#. #define BOOKTEMP_COPY_FAIL
+#: LYMessages.c:317
+msgid "Unable to copy temporary file for deletion of link."
+msgstr "No s'ha pogut copiar el fitxer temporari per l'esborrament de l'enllaç."
+
+#. #define BOOKTEMP_REOPEN_FAIL_FOR_DEL
+#: LYMessages.c:319
+msgid "Unable to reopen temporary file for deletion of link."
+msgstr "No s'ha pogut reobrir el fitxer temporari per l'esborrament de l'enllaç.<"
+
+#. #define BOOKMARK_LINK_NOT_ONE_LINE
+#: LYMessages.c:322
+msgid "Link is not by itself all on one line in bookmark file."
+msgstr "Hi ha d'haver un "
+
+#: LYMessages.c:323
+msgid "Bookmark deletion failed."
+msgstr "Ha fallat l'esborrament del marcador."
+
+#. #define BOOKMARKS_NOT_TRAVERSED
+#: LYMessages.c:325
+msgid "Bookmark files cannot be traversed (only http URLs)."
+msgstr "Els fitxers de marcadors no es poden recórrer (sols el URL d'http)."
+
+#. #define BOOKMARKS_NOT_OPEN
+#: LYMessages.c:327
+msgid "Unable to open bookmark file, use 'a' to save a link first"
+msgstr "Impossible obrir el fitxer d'adreces, useu 'a' per a guardar-neuna primer."
+
+#: LYMessages.c:328
+msgid "There are no links in this bookmark file!"
+msgstr "No hi ha enllaços en aquest fitxer d'adreces!"
+
+#. #define CACHE_D_OR_CANCEL
+#: LYMessages.c:330
+msgid "D)elete cached document or C)ancel? (d,c): "
+msgstr "D)ocument a la memòria cau s'ha d'esborrar o C)ancel·la? (d,c): "
+
+#. #define BOOK_D_L_OR_CANCEL
+#: LYMessages.c:332
+msgid "Save D)ocument or L)ink to bookmark file or C)ancel? (d,l,c): "
+msgstr "Guardar com a adreça d'interés D)ocument o en(L)laç,o C)ancel·lar? (d,l,c): "
+
+#: LYMessages.c:333
+msgid "Save D)ocument to bookmark file or C)ancel? (d,c): "
+msgstr "Guardar D)ocument en l'arxiu d'adreces d'interéso C)ancel·lar? (d, c): "
+
+#: LYMessages.c:334
+msgid "Save L)ink to bookmark file or C)ancel? (l,c): "
+msgstr "Guardar en(L)laç en l'arxiu d'adreces d'interéso C)ancel·lar? (l, c): "
+
+#. #define NOBOOK_POST_FORM
+#: LYMessages.c:336
+msgid "Documents from forms with POST content cannot be saved as bookmarks."
+msgstr "No es pot guardar al fitxer d'adreces documents procedents de formularis POST."
+
+#: LYMessages.c:337
+msgid "Cannot save form fields/links"
+msgstr "No es poden desar el camps dels formularis/enllaços"
+
+#. #define NOBOOK_HSML
+#: LYMessages.c:339
+msgid "History, showinfo, menu and list files cannot be saved as bookmarks."
+msgstr "Els fitxers historial, informació, menú i lista no es poden guardar al fitxer d'adreces."
+
+#. #define CONFIRM_BOOKMARK_DELETE
+#: LYMessages.c:341
+msgid "Do you really want to delete this link from your bookmark file?"
+msgstr "Esteu segurs que voleu esborrar aquest enllaç de l'arxiu d'adreces?"
+
+#: LYMessages.c:342
+msgid "Malformed address."
+msgstr "Adreça mal formada."
+
+#. #define HISTORICAL_ON_MINIMAL_OFF
+#: LYMessages.c:344
+msgid "Historical comment parsing ON (Minimal is overridden)!"
+msgstr "L'analitzador dels comentaris històrics està activada (El mínim està anul·lat)!"
+
+#. #define HISTORICAL_OFF_MINIMAL_ON
+#: LYMessages.c:346
+msgid "Historical comment parsing OFF (Minimal is in effect)!"
+msgstr "L'analitzador dels comentaris històrics està desactivada (El mínim està en efecte)!"
+
+#. #define HISTORICAL_ON_VALID_OFF
+#: LYMessages.c:348
+msgid "Historical comment parsing ON (Valid is overridden)!"
+msgstr "L'analitzador dels comentaris històrics està activada (Vàlid està anul·lat)!"
+
+#. #define HISTORICAL_OFF_VALID_ON
+#: LYMessages.c:350
+msgid "Historical comment parsing OFF (Valid is in effect)!"
+msgstr "L'analitzador dels comentaris històrics està desactivada (Vàlid està en efecte)!<"
+
+#. #define MINIMAL_ON_IN_EFFECT
+#: LYMessages.c:352
+msgid "Minimal comment parsing ON (and in effect)!"
+msgstr "L'analitzador del comentari mínim esta activat (i en efecte)!"
+
+#. #define MINIMAL_OFF_VALID_ON
+#: LYMessages.c:354
+msgid "Minimal comment parsing OFF (Valid is in effect)!"
+msgstr "L'analitzador del comentari mínim esta desactivat (Vàlid està en efecte)!<"
+
+#. #define MINIMAL_ON_BUT_HISTORICAL
+#: LYMessages.c:356
+msgid "Minimal comment parsing ON (but Historical is in effect)!"
+msgstr "L'analitzador del comentari mínim esta activat (però Històric està en efecte)!"
+
+#. #define MINIMAL_OFF_HISTORICAL_ON
+#: LYMessages.c:358
+msgid "Minimal comment parsing OFF (Historical is in effect)!"
+msgstr "L'analitzador del comentari mínim esta desactivat (Històric està en efecte)!<"
+
+#: LYMessages.c:359
+msgid "Soft double-quote parsing ON!"
+msgstr "L'analitzador cometes doble suau està activat!"
+
+#: LYMessages.c:360
+msgid "Soft double-quote parsing OFF!"
+msgstr "L'analitzador cometes doble suau està activat!<"
+
+#: LYMessages.c:361
+msgid "Now using TagSoup parsing of HTML."
+msgstr "Utilitzant l'analitzador d'HTML TagSoup."
+
+#: LYMessages.c:362
+msgid "Now using SortaSGML parsing of HTML!"
+msgstr "Utilitzant l'analitzador d'HTML SortaSGML!"
+
+#: LYMessages.c:363
+msgid "You are already at the end of this document."
+msgstr "És açò, el final del document."
+
+#: LYMessages.c:364
+msgid "You are already at the beginning of this document."
+msgstr "És ací, el principi del document."
+
+#: LYMessages.c:365
+#, c-format
+msgid "You are already at page %d of this document."
+msgstr "És aquesta, la %da pàgina del document."
+
+#: LYMessages.c:366
+#, c-format
+msgid "Link number %d already is current."
+msgstr "És aquest, l'enllaç número %d."
+
+#: LYMessages.c:367
+msgid "You are already at the first document"
+msgstr "Aquest és el primer document"
+
+#: LYMessages.c:368
+msgid "There are no links above this line of the document."
+msgstr "No hi ha enllaços per damunt d'aquesta línia."
+
+#: LYMessages.c:369
+msgid "There are no links below this line of the document."
+msgstr "No hi ha enllaços per sota d'aquesta línia."
+
+#. #define MAXLEN_REACHED_DEL_OR_MOV
+#: LYMessages.c:371
+msgid "Maximum length reached! Delete text or move off field."
+msgstr "S'ha assolit la longitud màxima! Esborreu text o eixiu del camp."
+
+#. #define NOT_ON_SUBMIT_OR_LINK
+#: LYMessages.c:373
+msgid "You are not on a form submission button or normal link."
+msgstr "No és ni un botó d'enviament ni un enllaç normal."
+
+#. #define NEED_CHECKED_RADIO_BUTTON
+#: LYMessages.c:375
+msgid "One radio button must be checked at all times!"
+msgstr "Sempre s'ha de triar una opció!"
+
+#: LYMessages.c:376
+msgid "No submit button for this form, submit single text field?"
+msgstr "No hi ha cap botó d'enviament, enviar simplemtent el camp de text?"
+
+#: LYMessages.c:377
+msgid "Do you want to go back to the previous document?"
+msgstr "Voleu tornar al document anterior?"
+
+#: LYMessages.c:378
+msgid "Use arrows or tab to move off of field."
+msgstr "Useu les fletxes o <tab> per a eixir-ne."
+
+#. #define ENTER_TEXT_ARROWS_OR_TAB
+#: LYMessages.c:380
+msgid "Enter text. Use arrows or tab to move off of field."
+msgstr "Introduïu text. Useu les fletxes o el tabulador per a eixir-ne."
+
+#: LYMessages.c:381
+msgid "** Bad HTML!! No form action defined. **"
+msgstr "** Codi HTML incorrecte!! No hi ha cap acció definida. **"
+
+#: LYMessages.c:382
+msgid "Bad HTML!! Unable to create popup window!"
+msgstr "Codi HTML incorrecte! Ha estat impossible crear la finestra emergent!"
+
+#: LYMessages.c:383
+msgid "Unable to create popup window!"
+msgstr "Ha estat impossible crear la finestra emergent!"
+
+#: LYMessages.c:384
+msgid "Goto a random URL is disallowed!"
+msgstr "El salt a una URL aleatòria està desactivat!"
+
+#: LYMessages.c:385
+msgid "Goto a non-http URL is disallowed!"
+msgstr "L'accés a URLs que no compleixen el protocol http no està permés!"
+
+#: LYMessages.c:386
+#, c-format
+msgid "You are not allowed to goto \"%s\" URLs"
+msgstr "No teniu permís per a anar a URLs \"%s\""
+
+#: LYMessages.c:387
+msgid "URL to open: "
+msgstr "Anar a: "
+
+#: LYMessages.c:388
+msgid "Edit the current Goto URL: "
+msgstr "Editar l'adreça actual: "
+
+#: LYMessages.c:389
+msgid "Edit the previous Goto URL: "
+msgstr "Editar l'adreça anterior: "
+
+#: LYMessages.c:390
+msgid "Edit a previous Goto URL: "
+msgstr "Editar adreces anteriors: "
+
+#: LYMessages.c:391
+msgid "Current document has POST data."
+msgstr "El document actual conté dades POST."
+
+#: LYMessages.c:392
+msgid "Edit this document's URL: "
+msgstr "Editar l'adreça d'aquest document: "
+
+#: LYMessages.c:393
+msgid "Edit the current link's URL: "
+msgstr "Editar l'adreça de l'enllaç actual: "
+
+#: LYMessages.c:394
+msgid "Edit the form's submit-URL: "
+msgstr "Edita el formulari submit-URL: "
+
+#: LYMessages.c:395
+msgid "You cannot edit File Management URLs"
+msgstr "No es poden editar les URLs del gestor de fitxers."
+
+#: LYMessages.c:396
+msgid "Enter a database query: "
+msgstr "Introduïu una consulta a la base de dades: "
+
+#: LYMessages.c:397
+msgid "Enter a whereis query: "
+msgstr "Introduïu la paraula que voleu trobar: "
+
+#: LYMessages.c:398
+msgid "Edit the current query: "
+msgstr "Editar la consulta: "
+
+#: LYMessages.c:399
+msgid "Edit the previous query: "
+msgstr "Editar la consulta anterior: "
+
+#: LYMessages.c:400
+msgid "Edit a previous query: "
+msgstr "Editar una consulta anterior: "
+
+#. #define USE_C_R_TO_RESUB_CUR_QUERY
+#: LYMessages.c:402
+msgid "Use Control-R to resubmit the current query."
+msgstr "Useu Ctrl-R per a reenviar la consulta actual."
+
+#: LYMessages.c:403
+msgid "Edit the current shortcut: "
+msgstr "Editar la drecera actual: "
+
+#: LYMessages.c:404
+msgid "Edit the previous shortcut: "
+msgstr "Editar la drecera anterior: "
+
+#: LYMessages.c:405
+msgid "Edit a previous shortcut: "
+msgstr "Editar una drecera anterior: "
+
+#: LYMessages.c:406
+#, c-format
+msgid "Key '%c' is not mapped to a jump file!"
+msgstr "La tecla '%c' no està assignada a cap fitxer de salt!"
+
+#: LYMessages.c:407
+msgid "Cannot locate jump file!"
+msgstr "No s'ha pogut trobar el fitxer de salts!"
+
+#: LYMessages.c:408
+msgid "Cannot open jump file!"
+msgstr "No s'ha pogut obrir el fitxer de salts!"
+
+#: LYMessages.c:409
+msgid "Error reading jump file!"
+msgstr "Error de lectura en el fitxer de salts!"
+
+#: LYMessages.c:410
+msgid "Out of memory reading jump file!"
+msgstr "Memòria exhaurida durant la lectura del fitxer de salts!"
+
+#: LYMessages.c:411
+msgid "Out of memory reading jump table!"
+msgstr "Memòria exhaurida durant la lectura de la taula de salts!"
+
+#: LYMessages.c:412
+msgid "No index is currently available."
+msgstr "No hi ha cap índex disponible."
+
+#. #define CONFIRM_MAIN_SCREEN
+#: LYMessages.c:414
+msgid "Do you really want to go to the Main screen?"
+msgstr "Esteu segur de voler anar a la pàgina principal?"
+
+#: LYMessages.c:415
+msgid "You are already at main screen!"
+msgstr "És aquesta, la pàgina principal!"
+
+#. #define NOT_ISINDEX
+#: LYMessages.c:417
+msgid "Not a searchable indexed document -- press '/' to search for a text string"
+msgstr "No és un document indexat: premeu '/' per a buscar una cadena de text"
+
+#. #define NO_OWNER
+#: LYMessages.c:419
+msgid "No owner is defined for this file so you cannot send a comment"
+msgstr "No consta el propietari de l'arxiu: no podeu enviar-li cap comentari"
+
+#: LYMessages.c:420
+#, c-format
+msgid "No owner is defined. Use %s?"
+msgstr "No consta el propietari. Usar %s?"
+
+#: LYMessages.c:421
+msgid "Do you wish to send a comment?"
+msgstr "Voleu enviar un comentari?"
+
+#: LYMessages.c:422
+msgid "Mail is disallowed so you cannot send a comment"
+msgstr "El correu no està permés; per tant, no podeu enviar comentaris."
+
+#: LYMessages.c:423
+msgid "The 'e'dit command is currently disabled."
+msgstr "L'ordre Editar està desactivada."
+
+#: LYMessages.c:424
+msgid "External editing is currently disabled."
+msgstr "L'edició externa està desactivada."
+
+#: LYMessages.c:425
+msgid "System error - failure to get status."
+msgstr "Error del sistema: no s'ha pogut obtenir l'estat."
+
+#: LYMessages.c:426
+msgid "No editor is defined!"
+msgstr "No hi ha cap editor definit!"
+
+#: LYMessages.c:427
+msgid "The 'p'rint command is currently disabled."
+msgstr "L'ordre imPrimir està desactivada."
+
+#: LYMessages.c:428
+msgid "Document has no Toolbar links or Banner."
+msgstr "El document no té barra d'enllaços ni banner."
+
+#: LYMessages.c:429
+msgid "Unable to open traversal file."
+msgstr "No s'ha pogut obrir el fitxer de travessada"
+
+#: LYMessages.c:430
+msgid "Unable to open traversal found file."
+msgstr "No s'ha pogut obrir el fitxer trobat de travessada<"
+
+#: LYMessages.c:431
+msgid "Unable to open reject file."
+msgstr "No s'ha pogut obrir el fitxer de rebuig."
+
+#: LYMessages.c:432
+msgid "Unable to open traversal errors output file"
+msgstr "No s'ha pogut obrir el fitxer de sortida d'errors de travessada"
+
+#: LYMessages.c:433
+msgid "TRAVERSAL WAS INTERRUPTED"
+msgstr "LA TRAVESSADA S'HA INTERROMPUT"
+
+#: LYMessages.c:434
+msgid "Follow link (or goto link or page) number: "
+msgstr "Seguir l'enllaç (o anar a la pàgina) número: "
+
+#: LYMessages.c:435
+msgid "Select option (or page) number: "
+msgstr "Triar opció (o pàgina) número: "
+
+#: LYMessages.c:436
+#, c-format
+msgid "Option number %d already is current."
+msgstr "És aquesta, l'opció número %d."
+
+#. #define ALREADY_AT_OPTION_END
+#: LYMessages.c:438
+msgid "You are already at the end of this option list."
+msgstr "És ací, el final de la llista d'opcions."
+
+#. #define ALREADY_AT_OPTION_BEGIN
+#: LYMessages.c:440
+msgid "You are already at the beginning of this option list."
+msgstr "És ací, el començament de la llista d'opcions."
+
+#. #define ALREADY_AT_OPTION_PAGE
+#: LYMessages.c:442
+#, c-format
+msgid "You are already at page %d of this option list."
+msgstr "És aquesta, la pàgina %d de la llista d'opcions."
+
+#: LYMessages.c:443
+msgid "You have entered an invalid option number."
+msgstr "Heu introduït un número d'opció que no és vàlid."
+
+#: LYMessages.c:444
+msgid "** Bad HTML!! Use -trace to diagnose. **"
+msgstr "** HTML erroni!! Useu l'opció -trace per a obtenir un diagnòstic. **"
+
+#: LYMessages.c:445
+msgid "Give name of file to save in"
+msgstr "Cal un nom per a l'arxiu."
+
+#: LYMessages.c:446
+msgid "Can't save data to file -- please run WWW locally"
+msgstr "No s'ha pogut guardar les dades al fitxer: executeu WWW localment."
+
+#: LYMessages.c:447
+msgid "Can't open temporary file!"
+msgstr "No ha estat possible obrir l'arxiu temporal!"
+
+#: LYMessages.c:448
+msgid "Can't open output file! Cancelling!"
+msgstr "No ha estat possible obrir l'arxiu d'eixida! Anul·lat!"
+
+#: LYMessages.c:449
+msgid "Execution is disabled."
+msgstr "L'execució no està activada."
+
+#. #define EXECUTION_DISABLED_FOR_FILE
+#: LYMessages.c:451
+#, c-format
+msgid "Execution is not enabled for this file. See the Options menu (use %s)."
+msgstr "L'execució no està activada. Vegeu el menú d'opcions (useu %s)."
+
+#. #define EXECUTION_NOT_COMPILED
+#: LYMessages.c:453
+msgid "Execution capabilities are not compiled into this version."
+msgstr "La capacitat d'executar programes no s'ha compilat en aquesta versió."
+
+#: LYMessages.c:454
+msgid "This file cannot be displayed on this terminal."
+msgstr "El fitxer no es pot mostrar en aquest terminal."
+
+#. #define CANNOT_DISPLAY_FILE_D_OR_C
+#: LYMessages.c:456
+msgid "This file cannot be displayed on this terminal: D)ownload, or C)ancel"
+msgstr "El fitxer no es pot mostrar en aquest terminal: D)escarregar oC)ancel·lar."
+
+#: LYMessages.c:457
+#, c-format
+msgid "%s D)ownload, or C)ancel"
+msgstr "%s D)escarregar o C)ancel·lar"
+
+#: LYMessages.c:458
+msgid "Cancelling file."
+msgstr "Cancel·lant."
+
+#: LYMessages.c:459
+msgid "Retrieving file. - PLEASE WAIT -"
+msgstr "Descarregant fitxer. - ESPEREU, PER FAVOR -"
+
+#: LYMessages.c:460
+msgid "Enter a filename: "
+msgstr "Introduïu un nom per a l'arxiu: "
+
+#: LYMessages.c:461
+msgid "Edit the previous filename: "
+msgstr "Editar el nom anterior: "
+
+#: LYMessages.c:462
+msgid "Edit a previous filename: "
+msgstr "Editar els noms anteriors: "
+
+#: LYMessages.c:463
+msgid "Enter a new filename: "
+msgstr "Introduïu un nom nou: "
+
+#: LYMessages.c:464
+msgid "File name may not begin with a dot."
+msgstr "Els noms d'arxiu no poden començar amb punt."
+
+#: LYMessages.c:466
+msgid "File exists. Create higher version?"
+msgstr "El fitxer existeix. Voleu crear una versió més alta?"
+
+#: LYMessages.c:468
+msgid "File exists. Overwrite?"
+msgstr "L'arxiu existeix. Voleu sobreescriure'l?"
+
+#: LYMessages.c:470
+msgid "Cannot write to file."
+msgstr "No es pot escriure en el fitxer."
+
+#: LYMessages.c:471
+msgid "ERROR! - download command is misconfigured."
+msgstr "ERROR: l'ordre _descarregar_ està mal configurada."
+
+#: LYMessages.c:472
+msgid "Unable to download file."
+msgstr "Ha estat impossible descarregar el fitxer."
+
+#: LYMessages.c:473
+msgid "Reading directory..."
+msgstr "Llegint directori..."
+
+#: LYMessages.c:474
+msgid "Building directory listing..."
+msgstr "Construint la llista del directori..."
+
+#: LYMessages.c:475
+msgid "Saving..."
+msgstr "Gravant..."
+
+#: LYMessages.c:476
+#, c-format
+msgid "Could not edit file '%s'."
+msgstr "No ha estat possible editar el fitxer '%s'."
+
+#: LYMessages.c:477
+msgid "Unable to access document!"
+msgstr "No ha estat possible accedir al document!"
+
+#: LYMessages.c:478
+msgid "Could not access file."
+msgstr "No ha estat possible accedir a l'arxiu."
+
+#: LYMessages.c:479
+msgid "Could not access directory."
+msgstr "No ha estat possible accedir al directori."
+
+#: LYMessages.c:480
+msgid "Could not load data."
+msgstr "No ha estat possible carregar les dades."
+
+#. #define CANNOT_EDIT_REMOTE_FILES
+#: LYMessages.c:482
+msgid "Lynx cannot currently (e)dit remote WWW files."
+msgstr "Lynx no pot editar fitxers WWW remots."
+
+#. #define CANNOT_EDIT_FIELD
+#: LYMessages.c:484
+msgid "This field cannot be (e)dited with an external editor."
+msgstr "Aquest camp no es pot editar amb un editor extern."
+
+#: LYMessages.c:485
+msgid "Bad rule"
+msgstr "Regla incorrecta"
+
+#: LYMessages.c:486
+msgid "Insufficient operands:"
+msgstr "Nombre d'operands insuficient:"
+
+#: LYMessages.c:487
+msgid "You are not authorized to edit this file."
+msgstr "No teniu autorització per a editar aquest arxiu."
+
+#: LYMessages.c:488
+msgid "Title: "
+msgstr "Títol: "
+
+#: LYMessages.c:489
+msgid "Subject: "
+msgstr "Tema: "
+
+#: LYMessages.c:490
+msgid "Username: "
+msgstr "Nom d'usuari: "
+
+#: LYMessages.c:491
+msgid "Password: "
+msgstr "Contrassenya: "
+
+#: LYMessages.c:492
+msgid "lynx: Username and Password required!!!"
+msgstr "lynx: fa falta el nom d'usuari i la contrasenya!!"
+
+#: LYMessages.c:493
+msgid "lynx: Password required!!!"
+msgstr "lynx: fa falta la contrasenya!!"
+
+#: LYMessages.c:494
+msgid "Clear all authorization info for this session?"
+msgstr "Esborrar tota la informació sobre autorització d'aquesta sessió?"
+
+#: LYMessages.c:495
+msgid "Authorization info cleared."
+msgstr "Informació esborrada."
+
+#: LYMessages.c:496
+msgid "Authorization failed. Retry?"
+msgstr "Autorització fallida. Reintentar?"
+
+#: LYMessages.c:497
+msgid "cgi support has been disabled."
+msgstr "s'ha desactivat el suport per a CGI."
+
+#. #define CGI_NOT_COMPILED
+#: LYMessages.c:499
+msgid "Lynxcgi capabilities are not compiled into this version."
+msgstr "La capacitat d'usar CGI no ha estat compilada en aquesta versió."
+
+#: LYMessages.c:500
+#, c-format
+msgid "Sorry, no known way of converting %s to %s."
+msgstr "Em sap greu, no sé com convertir %s a %s."
+
+#: LYMessages.c:501
+msgid "Unable to set up connection."
+msgstr "Ha estat impossible establir la connexió."
+
+#: LYMessages.c:502
+msgid "Unable to make connection"
+msgstr "Ha estat impossible fer la connexió."
+
+#. #define MALFORMED_EXEC_REQUEST
+#: LYMessages.c:504
+msgid "Executable link rejected due to malformed request."
+msgstr "Enllaç executable rebutjat a causa d'una sol·licitud mal formada."
+
+#. #define BADCHAR_IN_EXEC_LINK
+#: LYMessages.c:506
+#, c-format
+msgid "Executable link rejected due to `%c' character."
+msgstr "Enllaç executable rebutjat a causa del caràcter \"%c\"."
+
+#. #define RELPATH_IN_EXEC_LINK
+#: LYMessages.c:508
+msgid "Executable link rejected due to relative path string ('../')."
+msgstr "Enllaç executable rebutjat a causa d'un camí relatiu (\"../\")."
+
+#. #define BADLOCPATH_IN_EXEC_LINK
+#: LYMessages.c:510
+msgid "Executable link rejected due to location or path."
+msgstr "Enllaç executable rebutjat a causa de la localització o la ruta."
+
+#: LYMessages.c:511
+msgid "Mail access is disabled!"
+msgstr "L'accés a correu no està activat!"
+
+#. #define ACCESS_ONLY_LOCALHOST
+#: LYMessages.c:513
+msgid "Only files and servers on the local host can be accessed."
+msgstr "Només podeu accedir a fitxers i servidors en la màquina local."
+
+#: LYMessages.c:514
+msgid "Telnet access is disabled!"
+msgstr "L'accés a telnet no està activat"
+
+#. #define TELNET_PORT_SPECS_DISABLED
+#: LYMessages.c:516
+msgid "Telnet port specifications are disabled."
+msgstr "Les especificacions del port telnet estan desactivades."
+
+#: LYMessages.c:517
+msgid "USENET news access is disabled!"
+msgstr "L'accés als fòrums de discusió (USENET) no està activat!"
+
+#: LYMessages.c:518
+msgid "Rlogin access is disabled!"
+msgstr "L'accés a través de rlogin està desactivat!"
+
+#: LYMessages.c:519
+msgid "Ftp access is disabled!"
+msgstr "L'accés a ftp no està activat!"
+
+#: LYMessages.c:520
+msgid "There are no references from this document."
+msgstr "No hi ha referències d'aquest document."
+
+#: LYMessages.c:521
+msgid "There are only hidden links from this document."
+msgstr "En aquest document només hi ha enllaços ocults."
+
+#: LYMessages.c:523
+msgid "Unable to open command file."
+msgstr "No ha estat possible obrir el fitxer d'ordres."
+
+#: LYMessages.c:525
+msgid "News Post Cancelled!!!"
+msgstr "Missatge cancel·lat!!"
+
+#. #define SPAWNING_EDITOR_FOR_NEWS
+#: LYMessages.c:527
+msgid "Spawning your selected editor to edit news message"
+msgstr "Creant el procés fill que obri l'editor per a editar el missatge"
+
+#: LYMessages.c:528
+msgid "Post this message?"
+msgstr "Esteu segur que voleu enviar aquest missatge?"
+
+#: LYMessages.c:529
+#, c-format
+msgid "Append '%s'?"
+msgstr "Afegir \"%s\"?"
+
+#: LYMessages.c:530
+msgid "Posting to newsgroup(s)..."
+msgstr "Enviant al(s) fòrum(s)..."
+
+#: LYMessages.c:532
+msgid "*** You have unread mail. ***"
+msgstr "*** Teniu correu pendent. ***"
+
+#: LYMessages.c:534
+msgid "*** You have mail. ***"
+msgstr "*** Teniu correu. ***"
+
+#: LYMessages.c:536
+msgid "*** You have new mail. ***"
+msgstr "*** Teniu correu nou. ***"
+
+#: LYMessages.c:537
+msgid "File insert cancelled!!!"
+msgstr "Inserció del fitxer cancel·lada!!"
+
+#: LYMessages.c:538
+msgid "Not enough memory for file!"
+msgstr "No hi ha prou memòria per al fitxer!"
+
+#: LYMessages.c:539
+msgid "Can't open file for reading."
+msgstr "No ha estat possible llegir l'arxiu."
+
+#: LYMessages.c:540
+msgid "File does not exist."
+msgstr "L'arxiu no existeix."
+
+#: LYMessages.c:541
+msgid "File does not exist - reenter or cancel:"
+msgstr "L'arxiu no existeix. Reescriviu-ne el nom o cancel·leu:"
+
+#: LYMessages.c:542
+msgid "File is not readable."
+msgstr "L'arxiu no es pot llegir."
+
+#: LYMessages.c:543
+msgid "File is not readable - reenter or cancel:"
+msgstr "L'arxiu no es pot llegir. Reescriviu-ne el nom o cancel·leu:"
+
+#: LYMessages.c:544
+msgid "Nothing to insert - file is 0-length."
+msgstr "No hi ha res per a inserir: el fitxer té longitud 0."
+
+#: LYMessages.c:545
+msgid "Save request cancelled!!!"
+msgstr "(Gravar) Operació cancel·lada!!"
+
+#: LYMessages.c:546
+msgid "Mail request cancelled!!!"
+msgstr "Sol·licitud de correu cancel·lada!!"
+
+#. #define CONFIRM_MAIL_SOURCE_PREPARSED
+#: LYMessages.c:548
+msgid "Viewing preparsed source. Are you sure you want to mail it?"
+msgstr "Font preanalitzada. Segur que voleu enviar-la?"
+
+#: LYMessages.c:549
+msgid "Please wait..."
+msgstr "Per favor, espereu..."
+
+#: LYMessages.c:550
+msgid "Mailing file. Please wait..."
+msgstr "Enviant arxiu. Per favor, espereu..."
+
+#: LYMessages.c:551
+msgid "ERROR - Unable to mail file"
+msgstr "ERROR: ha estat impossible enviar l'arxiu"
+
+#. #define CONFIRM_LONG_SCREEN_PRINT
+#: LYMessages.c:553
+#, c-format
+msgid "File is %d screens long. Are you sure you want to print?"
+msgstr "L'arxiu ocupa %d pantalles. Esteu segur que voleu imprimir-lo?"
+
+#: LYMessages.c:554
+msgid "Print request cancelled!!!"
+msgstr "Impressió cancel·lada!!"
+
+#: LYMessages.c:555
+msgid "Press <return> to begin: "
+msgstr "Premeu <return> per començar: "
+
+#: LYMessages.c:556
+msgid "Press <return> to finish: "
+msgstr "Premeu <return> per finalitzar: "
+
+#. #define CONFIRM_LONG_PAGE_PRINT
+#: LYMessages.c:558
+#, c-format
+msgid "File is %d pages long. Are you sure you want to print?"
+msgstr "L'arxiu ocupa %d pàgines. Esteu segur que voleu imprimir-lo?"
+
+#. #define CHECK_PRINTER
+#: LYMessages.c:560
+msgid "Be sure your printer is on-line. Press <return> to start printing:"
+msgstr "Assegureu-vos que la impressora està connectada. Premeu <intro>per començar:"
+
+#: LYMessages.c:561
+msgid "ERROR - Unable to allocate file space!!!"
+msgstr "ERROR - No s'ha pogut assignar espai per a fitxers!!!"
+
+#: LYMessages.c:562
+msgid "Unable to open tempfile"
+msgstr "No ha estat possible obrir l'arxiu temporal"
+
+#: LYMessages.c:563
+msgid "Unable to open print options file"
+msgstr "No ha estat possible obrir l'arxiu d'opcions d'impressió"
+
+#: LYMessages.c:564
+msgid "Printing file. Please wait..."
+msgstr "Imprimint l'arxiu. Per favor, espereu..."
+
+#: LYMessages.c:565
+msgid "Please enter a valid internet mail address: "
+msgstr "Per favor, introduïu una adreça de correu vàlida: "
+
+#: LYMessages.c:566
+msgid "ERROR! - printer is misconfigured!"
+msgstr "ERROR: la impressora no està ben configurada!"
+
+#: LYMessages.c:567
+msgid "Image map from POST response not available!"
+msgstr "El mapa d'imatge de la resposta POST no està disponible!"
+
+#: LYMessages.c:568
+msgid "Misdirected client-side image MAP request!"
+msgstr "Demanda de MAPA d'imatge del costat de client mal dirigida"
+
+#: LYMessages.c:569
+msgid "Client-side image MAP is not accessible!"
+msgstr "El MAPA d'imatge del costat del client no està accessible!"
+
+#: LYMessages.c:570
+msgid "No client-side image MAPs are available!"
+msgstr "No ha MAPES d'imatge del costat de client disponibles!"
+
+#: LYMessages.c:571
+msgid "Client-side image MAP is not available!"
+msgstr "El MAPA d'imatge de costat de clients no està disponible!"
+
+#. #define OPTION_SCREEN_NEEDS_24
+#: LYMessages.c:574
+msgid "Screen height must be at least 24 lines for the Options menu!"
+msgstr "La pantalla ha de tenir si més no 24 línies per al menú d'opcions!"
+
+#. #define OPTION_SCREEN_NEEDS_23
+#: LYMessages.c:576
+msgid "Screen height must be at least 23 lines for the Options menu!"
+msgstr "La pantalla ha de tenir si més no 23 línies per al menú d'opcions"
+
+#. #define OPTION_SCREEN_NEEDS_22
+#: LYMessages.c:578
+msgid "Screen height must be at least 22 lines for the Options menu!"
+msgstr "La pantalla ha de tenir si més no 22 línies per al menú d'opcions"
+
+#: LYMessages.c:580
+msgid "That key requires Advanced User mode."
+msgstr "Per a usar aquesta tecla cal activar el mode d'usuari avançat"
+
+#: LYMessages.c:581
+#, c-format
+msgid "Content-type: %s"
+msgstr "Tipus de contingut: %s"
+
+#: LYMessages.c:582
+msgid "Command: "
+msgstr "Ordre: "
+
+#: LYMessages.c:583
+msgid "Unknown or ambiguous command"
+msgstr "Ordre desconeguda o ambigua"
+
+#: LYMessages.c:584
+msgid " Version "
+msgstr " Versió "
+
+#: LYMessages.c:585
+msgid " first"
+msgstr " primer"
+
+#: LYMessages.c:586
+msgid ", guessing..."
+msgstr ", provant..."
+
+#: LYMessages.c:587
+msgid "Permissions for "
+msgstr "Permisos per a "
+
+#: LYMessages.c:588
+msgid "Select "
+msgstr "Seleccioneu"
+
+#: LYMessages.c:589
+msgid "capital letter"
+msgstr "la lletra majúscula"
+
+#: LYMessages.c:590
+msgid " of option line,"
+msgstr "de la línia d'opcions"
+
+#: LYMessages.c:591
+msgid " to save,"
+msgstr "per desar"
+
+#: LYMessages.c:592
+msgid " to "
+msgstr "a"
+
+#: LYMessages.c:593
+msgid " or "
+msgstr " o "
+
+#: LYMessages.c:594
+msgid " index"
+msgstr " índex"
+
+#: LYMessages.c:595
+msgid " to return to Lynx."
+msgstr " per a tornar a Lynx."
+
+#: LYMessages.c:596
+msgid "Accept Changes"
+msgstr "Acceptar els canvis"
+
+#: LYMessages.c:597
+msgid "Reset Changes"
+msgstr "Anul·lar els canvis"
+
+#: LYMessages.c:598
+msgid "Left Arrow cancels changes"
+msgstr "'<-' cancel·la els canvis"
+
+#: LYMessages.c:599
+msgid "Save options to disk"
+msgstr "Gravar les opcions al disc"
+
+#: LYMessages.c:600
+msgid "Hit RETURN to accept entered data."
+msgstr "Premeu <return> per acceptar les dades introduïdes."
+
+#. #define ACCEPT_DATA_OR_DEFAULT
+#: LYMessages.c:602
+msgid "Hit RETURN to accept entered data. Delete data to invoke the default."
+msgstr "<intro> accepta les dades. Esborreu-les si voleu els valors preestablerts"
+
+#: LYMessages.c:603
+msgid "Value accepted!"
+msgstr "Valor acceptat!"
+
+#. #define VALUE_ACCEPTED_WARNING_X
+#: LYMessages.c:605
+msgid "Value accepted! -- WARNING: Lynx is configured for XWINDOWS!"
+msgstr "Valor acceptat! ALERTA: Lynx està configurat per a XWINDOWS!"
+
+#. #define VALUE_ACCEPTED_WARNING_NONX
+#: LYMessages.c:607
+msgid "Value accepted! -- WARNING: Lynx is NOT configured for XWINDOWS!"
+msgstr "Valor acceptat! ALERTA: Lynx no està configurat per a XWINDOWS!"
+
+#: LYMessages.c:608
+msgid "You are not allowed to change which editor to use!"
+msgstr "No teniu permís per a canviar l'editor!"
+
+#: LYMessages.c:609
+msgid "Failed to set DISPLAY variable!"
+msgstr "Ha estat impossible especificar el nou valor de la variable DISPLAY!"
+
+#: LYMessages.c:610
+msgid "Failed to clear DISPLAY variable!"
+msgstr "Ha estat impossible eliminar el valor de la variable DISPLAY!"
+
+#. #define BOOKMARK_CHANGE_DISALLOWED
+#: LYMessages.c:612
+msgid "You are not allowed to change the bookmark file!"
+msgstr "No teniu permís per a canviar l'arxiu d'adreces!"
+
+#: LYMessages.c:613
+msgid "Terminal does not support color"
+msgstr "El terminal no pot mostrar colors"
+
+#: LYMessages.c:614
+#, c-format
+msgid "Your '%s' terminal does not support color."
+msgstr "El terminal '%s' no pot mostrar colors."
+
+#: LYMessages.c:615
+msgid "Access to dot files is disabled!"
+msgstr "L'accés als arxius que comencen amb un punt no està activat!"
+
+#. #define UA_NO_LYNX_WARNING
+#: LYMessages.c:617
+msgid "User-Agent string does not contain \"Lynx\" or \"L_y_n_x\""
+msgstr "La cadena que identifica el navegador no conté ni \"Lynx\" ni \"L_y_n_x\""
+
+#. #define UA_PLEASE_USE_LYNX
+#: LYMessages.c:619
+msgid "Use \"L_y_n_x\" or \"Lynx\" in User-Agent, or it looks like intentional deception!"
+msgstr "Useu \"L_y_n_x\" o \"Lynx\" en l'identificador o semblareu desertors!"
+
+#. #define UA_CHANGE_DISABLED
+#: LYMessages.c:621
+msgid "Changing of the User-Agent string is disabled!"
+msgstr "El canvi de la cadena identificadora del navegador està desactivat!"
+
+#. #define CHANGE_OF_SETTING_DISALLOWED
+#: LYMessages.c:623
+msgid "You are not allowed to change this setting."
+msgstr "No teniu permís per a canviar aquesta opció."
+
+#: LYMessages.c:624
+msgid "Saving Options..."
+msgstr "Gravant les opcions..."
+
+#: LYMessages.c:625
+msgid "Options saved!"
+msgstr "Opcions gravades!"
+
+#: LYMessages.c:626
+msgid "Unable to save Options!"
+msgstr "No ha estat possible gravar les opcions!"
+
+#: LYMessages.c:627
+msgid " 'r' to return to Lynx "
+msgstr " 'r' per tornar a Lynx "
+
+#: LYMessages.c:628
+msgid " '>' to save, or 'r' to return to Lynx "
+msgstr " '>' per gravar, 'r' per tornar a Lynx "
+
+#. #define ANY_KEY_CHANGE_RET_ACCEPT
+#: LYMessages.c:630
+msgid "Hit any key to change value; RETURN to accept."
+msgstr "Premeu qualsevol tecla per canviar el valor; <intro> per acceptar."
+
+#: LYMessages.c:631
+msgid "Error uncompressing temporary file!"
+msgstr "Error descomprimint l'arxiu temporal!"
+
+#: LYMessages.c:632
+msgid "Unsupported URL scheme!"
+msgstr "URL no suportada!"
+
+#: LYMessages.c:633
+msgid "Unsupported data: URL! Use SHOWINFO, for now."
+msgstr "Dades no suportades: URL! Useu SHOWINFO, per ara."
+
+#: LYMessages.c:634
+msgid "Redirection limit of 10 URL's reached."
+msgstr "S'ha assolit el límit de redireccions: 10 URLs."
+
+#: LYMessages.c:635
+msgid "Illegal redirection URL received from server!"
+msgstr "S'ha rebut del servidor una URL de redirecció il·legal!"
+
+#. #define SERVER_ASKED_FOR_REDIRECTION
+#: LYMessages.c:637
+#, c-format
+msgid "Server asked for %d redirection of POST content to"
+msgstr "El servidor ha demanat una redirecció %d per a contingut POST a"
+
+#: LYMessages.c:640
+msgid "P)roceed, use G)ET or C)ancel "
+msgstr "P)rocedir, usar G)ET o C)ancel·lar "
+
+#: LYMessages.c:641
+msgid "P)roceed, or C)ancel "
+msgstr "P)rocedir o C)ancel·lar "
+
+#. #define ADVANCED_POST_GET_REDIRECT
+#: LYMessages.c:643
+msgid "Redirection of POST content. P)roceed, see U)RL, use G)ET or C)ancel"
+msgstr "Redirecció de contingut POST. P)rocedeix, vegeu U)RL, usa G)ET o C)ancel·la"
+
+#. #define ADVANCED_POST_REDIRECT
+#: LYMessages.c:645
+msgid "Redirection of POST content. P)roceed, see U)RL, or C)ancel"
+msgstr "Redirecció de contingut POST. P)rocedeix, vegeu U)RL, o C)ancel·la<"
+
+#. #define CONFIRM_POST_RESUBMISSION
+#: LYMessages.c:647
+msgid "Document from Form with POST content. Resubmit?"
+msgstr "El document procedeix d'un formulari amb contingut POST. Reenviar?"
+
+#. #define CONFIRM_POST_RESUBMISSION_TO
+#: LYMessages.c:649
+#, c-format
+msgid "Resubmit POST content to %s ?"
+msgstr "Reenviar el contingut del POST a %s?"
+
+#. #define CONFIRM_POST_LIST_RELOAD
+#: LYMessages.c:651
+#, c-format
+msgid "List from document with POST data. Reload %s ?"
+msgstr "La llista prové d'un document amb dades POST. Voleu recarregar %s?"
+
+#. #define CONFIRM_POST_DOC_HEAD
+#: LYMessages.c:653
+msgid "Document from POST action, HEAD may not be understood. Proceed?"
+msgstr "Document de l'acció POST, potser HEAD no s'entén. Voleu procedir?"
+
+#. #define CONFIRM_POST_LINK_HEAD
+#: LYMessages.c:655
+msgid "Form submit action is POST, HEAD may not be understood. Proceed?"
+msgstr "L'acció de lliurament del formulari és POST, potser HEAD no s'entén. Voleu procedir?"
+
+#: LYMessages.c:656
+msgid "Proceed without a username and password?"
+msgstr "Continuar sense nom d'usuari i sense contrasenya?"
+
+#: LYMessages.c:657
+#, c-format
+msgid "Proceed (%s)?"
+msgstr "Continuar (%s)?"
+
+#: LYMessages.c:658
+msgid "Cannot POST to this host."
+msgstr "No es pot fer POST a aquest amfritió."
+
+#: LYMessages.c:659
+msgid "POST not supported for this URL - ignoring POST data!"
+msgstr "POST no està suportat per a aquesta URL - s'ignoraran les dades POST!"
+
+#: LYMessages.c:660
+msgid "Discarding POST data..."
+msgstr "Descartant les dades del POST..."
+
+#: LYMessages.c:661
+msgid "Document will not be reloaded!"
+msgstr "No es recarregarà el document!"
+
+#: LYMessages.c:662
+msgid "Location: "
+msgstr "Ubicació: "
+
+#: LYMessages.c:663
+#, c-format
+msgid "'%s' not found!"
+msgstr "no s'ha trobat \"%s\""
+
+#: LYMessages.c:664
+msgid "Default Bookmark File"
+msgstr "Fitxer de favorits predeterminat"
+
+#: LYMessages.c:665
+msgid "Screen too small! (8x35 min)"
+msgstr "Pantalla massa xicoteta! (8x35 min)"
+
+#: LYMessages.c:666
+msgid "Select destination or ^G to Cancel: "
+msgstr "Trieu destinació o ^G per cancel·lar: "
+
+#. #define MULTIBOOKMARKS_SELECT
+#: LYMessages.c:668
+msgid "Select subbookmark, '=' for menu, or ^G to cancel: "
+msgstr "Trieu fitxer de favorits, \"=\" mostra el menú i ^G cancel·la: "
+
+#. #define MULTIBOOKMARKS_SELF
+#: LYMessages.c:670
+msgid "Reproduce L)ink in this bookmark file or C)ancel? (l,c): "
+msgstr "Reproduir l'en(L)laç en aquest fitxer de favorits o C)ancel·lar? (l,c):"
+
+#: LYMessages.c:671
+msgid "Multiple bookmark support is not available."
+msgstr "El suport per a més d'un fitxer d'adreces no està activat."
+
+#: LYMessages.c:672
+#, c-format
+msgid " Select Bookmark (screen %d of %d)"
+msgstr " Trieu el fitxer de favorits (pantalla %d de %d)"
+
+#: LYMessages.c:673
+msgid " Select Bookmark"
+msgstr " Trieu fitxer de favorits"
+
+#. #define MULTIBOOKMARKS_EHEAD_MASK
+#: LYMessages.c:675
+#, c-format
+msgid "Editing Bookmark DESCRIPTION and FILEPATH (%d of 2)"
+msgstr "Edició de la descripció i del camí del fitxer d'adreces interessants (%d de 2)"
+
+#. #define MULTIBOOKMARKS_EHEAD
+#: LYMessages.c:677
+msgid " Editing Bookmark DESCRIPTION and FILEPATH"
+msgstr "Edició de la descripció i el camí del fitxer d'adreces d'interés"
+
+#: LYMessages.c:678
+msgid "Letter: "
+msgstr "Lletra: "
+
+#. #define USE_PATH_OFF_HOME
+#: LYMessages.c:681
+msgid "Use a filepath off your login directory in SHELL syntax!"
+msgstr "Useu un camí per al fitxers fora del vostre directori d'inici a la sintaxi de l'intèrpret d'ordres "
+
+#: LYMessages.c:683
+msgid "Use a filepath off your home directory!"
+msgstr "Useu un camí que no pertanga al vostre directori!"
+
+#. #define MAXLINKS_REACHED
+#: LYMessages.c:686
+msgid "Maximum links per page exceeded! Use half-page or two-line scrolling."
+msgstr "Superat el nre. d'enllaços/pàg.! Useu mitja pàg. o desplaçament de dues línies."
+
+#: LYMessages.c:687
+msgid "No previously visited links available!"
+msgstr "No hi ha disponible cap enllaç anterior!"
+
+#: LYMessages.c:688
+msgid "Memory exhausted! Program aborted!"
+msgstr "Memòria exhaurida! Programa vortat!"
+
+#: LYMessages.c:689
+msgid "Memory exhausted! Aborting..."
+msgstr "Memòria exhaurida! Avortant..."
+
+#: LYMessages.c:690
+msgid "Not enough memory!"
+msgstr "No hi ha prou memòria!"
+
+#: LYMessages.c:691
+msgid "Directory/File Manager not available"
+msgstr "No hi ha cap administrador de fitxers disponible"
+
+#: LYMessages.c:692
+msgid "HREF in BASE tag is not an absolute URL."
+msgstr "La referència (HREF) en l'etiqueta BASE no és una URL absoluta."
+
+#: LYMessages.c:693
+msgid "Location URL is not absolute."
+msgstr "La URL no és absoluta."
+
+#: LYMessages.c:694
+msgid "Refresh URL is not absolute."
+msgstr "La URL de refresc no és absoluta."
+
+#. #define SENDING_MESSAGE_WITH_BODY_TO
+#: LYMessages.c:696
+msgid ""
+"You are sending a message with body to:\n"
+" "
+msgstr ""
+"Esteu enviant un missatge no buit a:\n"
+" "
+
+#: LYMessages.c:697
+msgid ""
+"You are sending a comment to:\n"
+" "
+msgstr ""
+"Esteu enviant un comentari a:\n"
+" "
+
+#: LYMessages.c:698
+msgid ""
+"\n"
+" With copy to:\n"
+" "
+msgstr ""
+"\n"
+" Amb còpia a:\n"
+" "
+
+#: LYMessages.c:699
+msgid ""
+"\n"
+" With copies to:\n"
+" "
+msgstr ""
+"\n"
+" Amb còpies a:\n"
+" "
+
+#. #define CTRL_G_TO_CANCEL_SEND
+#: LYMessages.c:701
+msgid ""
+"\n"
+"\n"
+"Use Ctrl-G to cancel if you do not want to send a message\n"
+msgstr ""
+"\n"
+"\n"
+"Useu Ctrl-G per a cancel·lar si no voleu enviar el missatge\n"
+
+#. #define ENTER_NAME_OR_BLANK
+#: LYMessages.c:703
+msgid ""
+"\n"
+" Please enter your name, or leave it blank to remain anonymous\n"
+msgstr ""
+"\n"
+" Escriviu el vostre nom o deixeu l'espai en blanc si voleu que siga anònim\n"
+
+#. #define ENTER_MAIL_ADDRESS_OR_OTHER
+#: LYMessages.c:705
+msgid ""
+"\n"
+" Please enter a mail address or some other\n"
+msgstr ""
+"\n"
+" Introduïu una adreça de correu o alguna altra\n"
+
+#. #define MEANS_TO_CONTACT_FOR_RESPONSE
+#: LYMessages.c:707
+msgid " means to contact you, if you desire a response.\n"
+msgstr " forma de contactar, si voleu resposta.\n"
+
+#: LYMessages.c:708
+msgid ""
+"\n"
+" Please enter a subject line.\n"
+msgstr ""
+"\n"
+" Introduïu l'assumpte.\n"
+
+#. #define ENTER_ADDRESS_FOR_CC
+#: LYMessages.c:710
+msgid ""
+"\n"
+" Enter a mail address for a CC of your message.\n"
+msgstr ""
+"\n"
+" Escriviu l'adreça a què voleu enviar una còpia del missatge.\n"
+
+#: LYMessages.c:711
+msgid " (Leave blank if you don't want a copy.)\n"
+msgstr " (Deixeu la línia en blanc si no en voleu enviar còpia.)\n"
+
+#: LYMessages.c:712
+msgid ""
+"\n"
+" Please review the message body:\n"
+"\n"
+msgstr ""
+"\n"
+" Per favor, reviseu el cos del missatge:\n"
+"\n"
+
+#: LYMessages.c:713
+msgid ""
+"\n"
+"Press RETURN to continue: "
+msgstr ""
+"\n"
+"Premeu <intro> per continuar: "
+
+#: LYMessages.c:714
+msgid ""
+"\n"
+"Press RETURN to clean up: "
+msgstr ""
+"\n"
+"Premeu <intro> per esborrar: "
+
+#: LYMessages.c:715
+msgid " Use Control-U to erase the default.\n"
+msgstr " Premeu Ctrl-U per esborrar el valor suggerit.\n"
+
+#: LYMessages.c:716
+msgid ""
+"\n"
+" Please enter your message below."
+msgstr ""
+"\n"
+" Escriviu el missatge a partir d'ací."
+
+#. #define ENTER_PERIOD_WHEN_DONE_A
+#: LYMessages.c:718 src/LYNews.c:360
+msgid ""
+"\n"
+" When you are done, press enter and put a single period (.)"
+msgstr ""
+"\n"
+" Quan acabeu, premeu <intro> i escriviu només un punt (.)"
+
+#. #define ENTER_PERIOD_WHEN_DONE_B
+#: LYMessages.c:720 src/LYNews.c:361
+msgid ""
+"\n"
+" on a line and press enter again."
+msgstr ""
+"\n"
+" al començament de la línia i torneu a prémer <intro>."
+
+#. Cookies messages
+#. #define ADVANCED_COOKIE_CONFIRMATION
+#: LYMessages.c:724
+#, c-format
+msgid "%s cookie: %.*s=%.*s Allow? (Y/N/Always/neVer)"
+msgstr "Cookie de %s: %.*s=%.*s Admetre-la? (S/N/semPre/Mai)"
+
+#. #define INVALID_COOKIE_DOMAIN_CONFIRMATION
+#: LYMessages.c:726
+#, c-format
+msgid "Accept invalid cookie domain=%s for '%s'?"
+msgstr "Voleu acceptar la cookie amb el domini invàlid %s en comptes de '%s'?"
+
+#. #define INVALID_COOKIE_PATH_CONFIRMATION
+#: LYMessages.c:728
+#, c-format
+msgid "Accept invalid cookie path=%s as a prefix of '%s'?"
+msgstr "Accepteu la cookie amb el camí (no vàlid) %s com a prefix de '%s'?"
+
+#: LYMessages.c:729
+msgid "Allowing this cookie."
+msgstr "Tolerant aquesta cookie."
+
+#: LYMessages.c:730
+msgid "Rejecting this cookie."
+msgstr "Rebutjant aquesta cookie."
+
+#: LYMessages.c:731
+msgid "The Cookie Jar is empty."
+msgstr "El recipient de les cookies és buit."
+
+#: LYMessages.c:732
+msgid "The Cache Jar is empty."
+msgstr "El recipient de memòria cau és buit."
+
+#. #define ACTIVATE_TO_GOBBLE
+#: LYMessages.c:734
+msgid "Activate links to gobble up cookies or entire domains,"
+msgstr "Seguiu els enllaços per eliminar les cookies o els dominis,"
+
+#: LYMessages.c:735
+msgid "or to change a domain's 'allow' setting."
+msgstr "o per a canviar l\"índex de tolerància\"."
+
+#: LYMessages.c:736
+msgid "(Cookies never allowed.)"
+msgstr "(Cookies sempre prohibides)"
+
+#: LYMessages.c:737
+msgid "(Cookies always allowed.)"
+msgstr "(Cookies sempre tolerades)"
+
+#: LYMessages.c:738
+msgid "(Cookies allowed via prompt.)"
+msgstr "(Es pregunta abans d'acceptar cookies)"
+
+#: LYMessages.c:739
+msgid "(Persistent Cookies.)"
+msgstr "(Cookies persistents)"
+
+#: LYMessages.c:740
+msgid "(No title.)"
+msgstr "(Sense títol)"
+
+#: LYMessages.c:741
+msgid "(No name.)"
+msgstr "(Sense nom)"
+
+#: LYMessages.c:742
+msgid "(No value.)"
+msgstr "(Sense valor)"
+
+#: LYMessages.c:743 src/LYOptions.c:2424
+msgid "None"
+msgstr "Cap"
+
+#: LYMessages.c:744
+msgid "(End of session.)"
+msgstr "(Fi de la sessió)"
+
+#: LYMessages.c:745
+msgid "Delete this cookie?"
+msgstr "Esborrar aquesta cookie?"
+
+#: LYMessages.c:746
+msgid "The cookie has been eaten!"
+msgstr "La cookie ha estat esborrada!"
+
+#: LYMessages.c:747
+msgid "Delete this empty domain?"
+msgstr "Esborrar aquest domini buit?"
+
+#: LYMessages.c:748
+msgid "The domain has been eaten!"
+msgstr "El domini ha estat esborrat!"
+
+#. #define DELETE_COOKIES_SET_ALLOW_OR_CANCEL
+#: LYMessages.c:750
+msgid "D)elete domain's cookies, set allow A)lways/P)rompt/neV)er, or C)ancel? "
+msgstr "D esborrar el domini, admetre A sempre/P)reguntar/V mai, o C)ancel·lar? "
+
+#. #define DELETE_DOMAIN_SET_ALLOW_OR_CANCEL
+#: LYMessages.c:752
+msgid "D)elete domain, set allow A)lways/P)rompt/neV)er, or C)ancel? "
+msgstr "D esborrar domini, admetre A sempre/P)reguntar/V mai, o C)ancel·lar?"
+
+#: LYMessages.c:753
+msgid "All cookies in the domain have been eaten!"
+msgstr "Totes les cookies del domini han estat esborrades!"
+
+#: LYMessages.c:754
+#, c-format
+msgid "'A'lways allowing from domain '%s'."
+msgstr "Toler(A)r-les sempre que provinguen del domini '%s'."
+
+#: LYMessages.c:755
+#, c-format
+msgid "ne'V'er allowing from domain '%s'."
+msgstr "Rebutjar-les sempre que provinguen del domini '%s'."
+
+#: LYMessages.c:756
+#, c-format
+msgid "'P'rompting to allow from domain '%s'."
+msgstr "(P)reguntar sempre que provinguen del domini '%s'."
+
+#: LYMessages.c:757
+msgid "Delete all cookies in this domain?"
+msgstr "Esborrar totes les cookies del domini?"
+
+#: LYMessages.c:758
+msgid "All of the cookies in the jar have been eaten!"
+msgstr "Totes les cookies han estat esborrades!"
+
+#: LYMessages.c:760
+msgid "Port 19 not permitted in URLs."
+msgstr "El port 19 no està permés en les URLs."
+
+#: LYMessages.c:761
+msgid "Port 25 not permitted in URLs."
+msgstr "El port 25 no està permés en les URLs."
+
+#: LYMessages.c:762
+#, c-format
+msgid "Port %lu not permitted in URLs."
+msgstr "El port %lu no està permés en les URLs."
+
+#: LYMessages.c:763
+msgid "URL has a bad port field."
+msgstr "L'URL té un camp incorrecte de port."
+
+#: LYMessages.c:764
+msgid "Maximum nesting of HTML elements exceeded."
+msgstr "S'ha excedit el màxim nombre d'anidaments permés per a l'HTML."
+
+#: LYMessages.c:765
+msgid "Bad partial reference! Stripping lead dots."
+msgstr "Referència parcial incorrecta! S'esborraran els punts inicials."
+
+#: LYMessages.c:766
+msgid "Trace Log open failed. Trace off!"
+msgstr "No s'ha pogut obrir el fitxer de rastreig. Rastreig desactivat!"
+
+#: LYMessages.c:767
+msgid "Lynx Trace Log"
+msgstr "Rastreig (Lynx Trace Log)"
+
+#: LYMessages.c:768
+msgid "No trace log has been started for this session."
+msgstr "No s'ha iniciat el rastreig en aquesta sessió."
+
+#. #define MAX_TEMPCOUNT_REACHED
+#: LYMessages.c:770
+msgid "The maximum temporary file count has been reached!"
+msgstr "S'ha assolit el nombre màxim de fitxers temporals!"
+
+#. #define FORM_VALUE_TOO_LONG
+#: LYMessages.c:772
+msgid "Form field value exceeds buffer length! Trim the tail."
+msgstr "El valor del camp excedeix la longitud de la memòria intermèdia! Es tallarà."
+
+#. #define FORM_TAIL_COMBINED_WITH_HEAD
+#: LYMessages.c:774
+msgid "Modified tail combined with head of form field value."
+msgstr "Es combina la cua modificada amb la capçalera del valor del camp del formulari."
+
+#. HTFile.c
+#: LYMessages.c:777
+msgid "Directory"
+msgstr "Directori"
+
+#: LYMessages.c:778
+msgid "Directory browsing is not allowed."
+msgstr "La navegació pel directori està prohibida."
+
+#: LYMessages.c:779
+msgid "Selective access is not enabled for this directory"
+msgstr "No està habilitat l'accés selectiu a aquest directori"
+
+#: LYMessages.c:780
+msgid "Multiformat: directory scan failed."
+msgstr "Format múltiple: l'escaneig del directori ha fallat."
+
+#: LYMessages.c:781
+msgid "This directory is not readable."
+msgstr "No es pot llegir el directori."
+
+#: LYMessages.c:782
+msgid "Can't access requested file."
+msgstr "No es pot accedir al fitxer sol·licitat."
+
+#: LYMessages.c:783
+msgid "Could not find suitable representation for transmission."
+msgstr "No s'ha pogut trobar una representació adequada per a la transmissió."
+
+#: LYMessages.c:784
+msgid "Could not open file for decompression!"
+msgstr "No s'ha pogut obrir el fitxer per a descomprimir-lo!"
+
+#: LYMessages.c:785
+msgid "Files:"
+msgstr "Arxius:"
+
+#: LYMessages.c:786
+msgid "Subdirectories:"
+msgstr "Subdirectoris:"
+
+#: LYMessages.c:787
+msgid " directory"
+msgstr " directori"
+
+#: LYMessages.c:788
+msgid "Up to "
+msgstr "De "
+
+#: LYMessages.c:789
+msgid "Current directory is "
+msgstr "El directori actual és "
+
+#. HTFTP.c
+#: LYMessages.c:792
+msgid "Symbolic Link"
+msgstr "Enllaç simbòlic"
+
+#. HTGopher.c
+#: LYMessages.c:795
+msgid "No response from server!"
+msgstr "El servidor no respon!"
+
+#: LYMessages.c:796
+msgid "CSO index"
+msgstr "Índex CSO"
+
+#: LYMessages.c:797
+msgid ""
+"\n"
+"This is a searchable index of a CSO database.\n"
+msgstr "\n"
+
+#: LYMessages.c:798
+msgid "CSO Search Results"
+msgstr "Resultats de la recerca CSO"
+
+#: LYMessages.c:799
+#, c-format
+msgid "Seek fail on %s\n"
+msgstr "Ha fallat la cerca sobre %s\n"
+
+#: LYMessages.c:800
+msgid ""
+"\n"
+"Press the 's' key and enter search keywords.\n"
+msgstr ""
+"\n"
+"Premeu 's' i introduïu els mots que voleu cercar.\n"
+
+#: LYMessages.c:801
+msgid ""
+"\n"
+"This is a searchable Gopher index.\n"
+msgstr "\n"
+
+#: LYMessages.c:802
+msgid "Gopher index"
+msgstr "Í"
+
+#: LYMessages.c:803
+msgid "Gopher Menu"
+msgstr "Menú gopher"
+
+#: LYMessages.c:804
+msgid " Search Results"
+msgstr " Resultats de la recerca"
+
+#: LYMessages.c:805
+msgid "Sending CSO/PH request."
+msgstr "S'està enviant una sol·licitud CSO/PH."
+
+#: LYMessages.c:806
+msgid "Sending Gopher request."
+msgstr "S'està enviant la sol·licitud gopher"
+
+#: LYMessages.c:807
+msgid "CSO/PH request sent; waiting for response."
+msgstr "Sol·licitud COS/PH enviada; s'està esperant resposta."
+
+#: LYMessages.c:808
+msgid "Gopher request sent; waiting for response."
+msgstr "S'ha enviat la sol·licitud gopher; s'està esperant resposta."
+
+#: LYMessages.c:809
+msgid ""
+"\n"
+"Please enter search keywords.\n"
+msgstr ""
+"\n"
+"Per favor, introduïu els mots que voleu cercar.\n"
+
+#: LYMessages.c:810
+msgid ""
+"\n"
+"The keywords that you enter will allow you to search on a"
+msgstr ""
+"\n"
+"Els mots que heu introduït us permetran cercar en un"
+
+#: LYMessages.c:811
+msgid " person's name in the database.\n"
+msgstr " nom de persona en una base de dades.\n"
+
+#. HTNews.c
+#: LYMessages.c:814
+msgid "Connection closed ???"
+msgstr "Connexió tancada ??"
+
+#: LYMessages.c:815
+msgid "Cannot open temporary file for news POST."
+msgstr "No ha estat possible obrir el fitxer temporal per enviar el missatge."
+
+#: LYMessages.c:816
+msgid "This client does not contain support for posting to news with SSL."
+msgstr "Aquest client no pot enviar missatges als fòrums amb SSL."
+
+#. HTStyle.c
+#: LYMessages.c:819
+#, c-format
+msgid "Style %d `%s' SGML:%s. Font %s %.1f point.\n"
+msgstr "Estil %d `%s' SGML:%s. Font %s %.1f punt.\n"
+
+#: LYMessages.c:821
+#, c-format
+msgid "\tAlign=%d, %d tabs. (%.0f before, %.0f after)\n"
+msgstr "\tAlinea=%d, %d tabulacions. (%.0f abans, %.0f després)\n"
+
+#: LYMessages.c:822
+#, c-format
+msgid "\t\tTab kind=%d at %.0f\n"
+msgstr "\t\tTipus de tabulació=%d a %.0f\n"
+
+#. HTTP.c
+#: LYMessages.c:825
+msgid "Can't proceed without a username and password."
+msgstr "No es pot continuar sense un nom d'usuari i una contrasenya."
+
+#: LYMessages.c:826
+msgid "Can't retry with authorization! Contact the server's WebMaster."
+msgstr "No es pot reintentar sense autorització! Poseu-vos en contacte amb el webmestre."
+
+#: LYMessages.c:827
+msgid "Can't retry with proxy authorization! Contact the server's WebMaster."
+msgstr "No es pot reintentar sense autorització del proxy! Poseu-vos en contacte amb el webmestre."
+
+#: LYMessages.c:828
+msgid "Retrying with proxy authorization information."
+msgstr "Reintent amb la informació de autorització del servidor intermediari (proxy)."
+
+#: LYMessages.c:829
+#, c-format
+msgid "SSL error:%s-Continue?"
+msgstr "Error SSL:%s-Voleu continuar?"
+
+#. HTWAIS.c
+#: LYMessages.c:832
+msgid "HTWAIS: Return message too large."
+msgstr "HTWAIS: El missatge de retorn és massa llarg."
+
+#: LYMessages.c:833
+msgid "Enter WAIS query: "
+msgstr "Introduïu la consulta de tipus WAIS:"
+
+#. Miscellaneous status
+#: LYMessages.c:836
+msgid "Retrying as HTTP0 request."
+msgstr "Reintentant com a sol·licitud HTTP0."
+
+#: LYMessages.c:837
+#, c-format
+msgid "Transferred %d bytes"
+msgstr "%d bytes transferits"
+
+#: LYMessages.c:838
+msgid "Data transfer complete"
+msgstr "Transferència completa"
+
+#: LYMessages.c:839
+#, c-format
+msgid "Error processing line %d of %s\n"
+msgstr "Error mentre es processava la línia %d de %s\n"
+
+#. Lynx internal page titles
+#: LYMessages.c:842
+msgid "Address List Page"
+msgstr "Pàgina d'adreces"
+
+#: LYMessages.c:843
+msgid "Bookmark file"
+msgstr "Agenda d'adreces d'interés"
+
+#: LYMessages.c:844
+msgid "Configuration Definitions"
+msgstr "Configuració"
+
+#: LYMessages.c:845
+msgid "Cookie Jar"
+msgstr "Pot de les galetes (cookie jar) :-)"
+
+#: LYMessages.c:846
+msgid "Current Edit-Key Map"
+msgstr "Mapa actual de tecles d'edició"
+
+#: LYMessages.c:847
+msgid "Current Key Map"
+msgstr "Combinacions de tecles actual"
+
+#: LYMessages.c:848
+msgid "File Management Options"
+msgstr "Opcions d'administració de fitxers"
+
+#: LYMessages.c:849
+msgid "Download Options"
+msgstr "Opcions de descàrrega"
+
+#: LYMessages.c:850
+msgid "History Page"
+msgstr "Historial"
+
+#: LYMessages.c:851
+msgid "Cache Jar"
+msgstr "Jar en memòria cau"
+
+#: LYMessages.c:852
+msgid "List Page"
+msgstr "Pàgina de llista"
+
+#: LYMessages.c:853
+msgid "Lynx.cfg Information"
+msgstr "Informació del fitxer lynx.cfg"
+
+#: LYMessages.c:854
+msgid "Converted Mosaic Hotlist"
+msgstr "Fitxer d'adreces d'interés de Mosaic convertit"
+
+#: LYMessages.c:855
+msgid "Options Menu"
+msgstr "Menú d'opcions"
+
+#: LYMessages.c:856
+msgid "File Permission Options"
+msgstr "Opcions dels permissos dels fitxers"
+
+#: LYMessages.c:857
+msgid "Printing Options"
+msgstr "Opcions d'impressió"
+
+#: LYMessages.c:858
+msgid "Information about the current document"
+msgstr "Informació del document actual"
+
+#: LYMessages.c:859
+msgid "Your recent statusline messages"
+msgstr "Missatges recents apareguts en la línia d'estat"
+
+#: LYMessages.c:860
+msgid "Upload Options"
+msgstr "Opcions de càrrega"
+
+#: LYMessages.c:861
+msgid "Visited Links Page"
+msgstr "Pàgina dels enllaços visitats"
+
+#. CONFIG_DEF_TITLE subtitles
+#: LYMessages.c:864
+msgid "See also"
+msgstr "Vegeu també"
+
+#: LYMessages.c:865
+msgid "your"
+msgstr "el vostre"
+
+#: LYMessages.c:866
+msgid "for runtime options"
+msgstr "opcions en temps d'execució"
+
+#: LYMessages.c:867
+msgid "compile time options"
+msgstr "opcions en temps de compilació"
+
+#: LYMessages.c:868
+msgid "color-style configuration"
+msgstr "configuració d'estil de colors"
+
+#: LYMessages.c:869
+msgid "latest release"
+msgstr "última versió"
+
+#: LYMessages.c:870
+msgid "pre-release version"
+msgstr "versió de prova"
+
+#: LYMessages.c:871
+msgid "development version"
+msgstr "versió de desenvolupament"
+
+#. #define AUTOCONF_CONFIG_CACHE
+#: LYMessages.c:873
+msgid ""
+"The following data were derived during the automatic configuration/build\n"
+"process of this copy of Lynx. When reporting a bug, please include a copy\n"
+"of this page."
+msgstr ""
+"Les dades següents es van generar durant el procés de configuració i\n"
+"compilació automàtiques d'aquesta còpia de Lynx. Quan informeu d'un error,\n"
+"per favor, incloeu una còpia d'aquesta pàgina."
+
+#. #define AUTOCONF_LYNXCFG_H
+#: LYMessages.c:877
+msgid ""
+"The following data were used as automatically-configured compile-time\n"
+"definitions when this copy of Lynx was built."
+msgstr ""
+"Les dades següents es van usar com a definicions configurades automàticament\n"
+"quan es va compilar aquesta còpia de Lynx."
+
+#. #define DIRED_NOVICELINE
+#: LYMessages.c:882
+msgid " C)reate D)ownload E)dit F)ull menu M)odify R)emove T)ag U)pload \n"
+msgstr " C)rea D)escarrega E)dita M)enú complet C)anvia R)emou S)enyalado P)uja \n"
+
+#: LYMessages.c:883
+msgid "Failed to obtain status of current link!"
+msgstr "Ha estat impossible obtenir l'estat de l'enllaç actual!"
+
+#. #define INVALID_PERMIT_URL
+#: LYMessages.c:886
+msgid "Special URL only valid from current File Permission menu!"
+msgstr "URL especial que només és vàlida des del menú permisos de fitxer actual!"
+
+#: LYMessages.c:890
+msgid "External support is currently disabled."
+msgstr "El suport extern està deshabilitat actualment."
+
+#. new with 2.8.4dev.21
+#: LYMessages.c:894
+msgid "Changing working-directory is currently disabled."
+msgstr "El canvi de directori de treball està desactivat."
+
+#: LYMessages.c:895
+msgid "Linewrap OFF!"
+msgstr "Salt de línia automàtic desactivat!"
+
+#: LYMessages.c:896
+msgid "Linewrap ON!"
+msgstr "Salt de línia automàtic activat!"
+
+#: LYMessages.c:897
+msgid "Parsing nested-tables toggled OFF! Reloading..."
+msgstr "Anàlisi de taules imbricades desactivat! Recàrrega..."
+
+#: LYMessages.c:898
+msgid "Parsing nested-tables toggled ON! Reloading..."
+msgstr "Analisi de taules imbricades activat! Recàrrega..."
+
+#: LYMessages.c:899
+msgid "Shifting is disabled while line-wrap is in effect"
+msgstr "El desplaçament està deshabilitat mentre l'ajustament de línies està en efecte"
+
+#: LYMessages.c:900
+msgid "Trace not supported"
+msgstr "Rastreig no suportat"
+
+#: LYMessages.c:820
+#, c-format
+msgid "\tIndents: first=%.0f others=%.0f, Height=%.1f Desc=%.1f\n"
+msgstr "\tSagnats: primer=%.0f altres=%.0f, Alçada=%.1f Desc=%.1f\n"
+
+#.
+#. * Set up the message for the username prompt, and then issue the
+#. * prompt. The default username is included in the call to the
+#. * prompting function, but the password is NULL-ed and always replaced.
+#. * - FM
+#.
+#: WWW/Library/Implementation/HTAABrow.c:634
+#, c-format
+msgid "Username for '%s' at %s '%s%s':"
+msgstr "Nom d'usuari per a '%s' en %s '%s%s':"
+
+#: WWW/Library/Implementation/HTAABrow.c:904
+msgid "This client doesn't know how to compose proxy authorization information for scheme"
+msgstr "Aquest client no sap com composar la informació d'autorització del servidor intermediari per a l'esquema"
+
+#: WWW/Library/Implementation/HTAABrow.c:983
+msgid "This client doesn't know how to compose authorization information for scheme"
+msgstr "Aquest client no sap com composar la informació d'autorització per a l'esquema"
+
+#: WWW/Library/Implementation/HTAABrow.c:1094
+#, c-format
+msgid "Invalid header '%s%s%s%s%s'"
+msgstr "Capçalera invàlida '%s%s%s%s%s'"
+
+#: WWW/Library/Implementation/HTAABrow.c:1200
+msgid "Proxy authorization required -- retrying"
+msgstr "Cal autorizació del proxy: reintentant"
+
+#: WWW/Library/Implementation/HTAABrow.c:1256
+msgid "Access without authorization denied -- retrying"
+msgstr "Accés sense autorització denegat: reintentant"
+
+#: WWW/Library/Implementation/HTAccess.c:698
+msgid "Access forbidden by rule"
+msgstr "Accés prohibit per una regla"
+
+#: WWW/Library/Implementation/HTAccess.c:793
+msgid "Document with POST content not found in cache. Resubmit?"
+msgstr "El document amb contingut POST no s'ha trobat en la memòria cau. Reenviar?"
+
+#: WWW/Library/Implementation/HTAccess.c:947
+msgid "Loading failed, use a previous copy."
+msgstr "Ha fallat la càrrega, useu un còpia prèvia."
+
+#: WWW/Library/Implementation/HTAccess.c:1056 src/GridText.c:8875
+msgid "Loading incomplete."
+msgstr "Càrrega incompleta."
+
+#: WWW/Library/Implementation/HTAccess.c:1087
+#, c-format
+msgid "**** HTAccess: socket or file number returned by obsolete load routine!\n"
+msgstr "**** HTAccess: s'ha retornat un sòcol o un número de fitxer per una rutina de càrrega obsoleta!\n"
+
+#: WWW/Library/Implementation/HTAccess.c:1089
+#, c-format
+msgid "**** HTAccess: Internal software error. Please mail lynx-dev@nongnu.org!\n"
+msgstr ""
+"**** HTAccess: Error intern de programari. Si us plau escriviu a lynx-dev@nongnu.org!\n"
+"\n"
+
+#: WWW/Library/Implementation/HTAccess.c:1090
+#, c-format
+msgid "**** HTAccess: Status returned was: %d\n"
+msgstr "**** HTAccess: L'estat retornat ha estat: %d\n"
+
+#.
+#. * hack: if we fail in HTAccess.c
+#. * avoid duplicating URL, oh.
+#.
+#: WWW/Library/Implementation/HTAccess.c:1096 src/LYMainLoop.c:8074
+msgid "Can't Access"
+msgstr "No ha estat possible accedir-hi"
+
+#: WWW/Library/Implementation/HTAccess.c:1104
+msgid "Unable to access document."
+msgstr "No ha estat possible accedir al document."
+
+#: WWW/Library/Implementation/HTFTP.c:875
+#, c-format
+msgid "Enter password for user %s@%s:"
+msgstr "Contrasenya de l'usuari %s@%s:"
+
+#: WWW/Library/Implementation/HTFTP.c:903
+msgid "Unable to connect to FTP host."
+msgstr "No ha estat possible connectar amb el servidor FTP"
+
+#: WWW/Library/Implementation/HTFTP.c:1142
+msgid "close master socket"
+msgstr "tanca el sòcol mestre"
+
+#: WWW/Library/Implementation/HTFTP.c:1204
+msgid "socket for master socket"
+msgstr "sòcol per al sòcol mestre"
+
+#: WWW/Library/Implementation/HTFTP.c:2952
+msgid "Receiving FTP directory."
+msgstr "Rebent directori d'FTP"
+
+#: WWW/Library/Implementation/HTFTP.c:3090
+#, c-format
+msgid "Transferred %d bytes (%5d)"
+msgstr "%d (%5d) bytes transferits"
+
+#: WWW/Library/Implementation/HTFTP.c:3448
+msgid "connect for data"
+msgstr "connecta per a dades"
+
+#: WWW/Library/Implementation/HTFTP.c:4120
+msgid "Receiving FTP file."
+msgstr "Rebent arxiu d'FTP"
+
+#: WWW/Library/Implementation/HTFinger.c:274
+msgid "Could not set up finger connection."
+msgstr "No ha estat possible establir la connexió finger"
+
+#: WWW/Library/Implementation/HTFinger.c:321
+msgid "Could not load data (no sitename in finger URL)"
+msgstr "No s'han pogut carregar les dades (no hi ha un nom de lloc al URL del finger)"
+
+#: WWW/Library/Implementation/HTFinger.c:325
+msgid "Invalid port number - will only use port 79!"
+msgstr "Número de port invàlid: s'usarà únicament el port 79!"
+
+#: WWW/Library/Implementation/HTFinger.c:391
+msgid "Could not access finger host."
+msgstr "No ha estat possible accedir al servidor finger."
+
+#: WWW/Library/Implementation/HTFinger.c:399
+msgid "No response from finger server."
+msgstr "El servidor finger no respon."
+
+#: WWW/Library/Implementation/HTNews.c:421
+#, c-format
+msgid "Username for news host '%s':"
+msgstr "Nom d'usuari per al servidor de notícies \"%s\":"
+
+#: WWW/Library/Implementation/HTNews.c:474
+msgid "Change username?"
+msgstr "Canviar el nom d'usuari?"
+
+#: WWW/Library/Implementation/HTNews.c:478
+msgid "Username:"
+msgstr "Nom d'usuari:"
+
+#: WWW/Library/Implementation/HTNews.c:503
+#, c-format
+msgid "Password for news host '%s':"
+msgstr "Contrasenya per al servidor de notícies '%s':"
+
+#: WWW/Library/Implementation/HTNews.c:586
+msgid "Change password?"
+msgstr "Canviar contrasenya?"
+
+#: WWW/Library/Implementation/HTNews.c:1707
+#, c-format
+msgid "No matches for: %s"
+msgstr "Cap coincidència amb: %s"
+
+#: WWW/Library/Implementation/HTNews.c:1757
+msgid ""
+"\n"
+"No articles in this group.\n"
+msgstr ""
+"\n"
+"No hi ha articles en aquest fòrum.\n"
+
+#: WWW/Library/Implementation/HTNews.c:1769
+msgid ""
+"\n"
+"No articles in this range.\n"
+msgstr ""
+"\n"
+"No hi ha cap article en aquest rang.\n"
+
+#.
+#. * Set window title.
+#.
+#: WWW/Library/Implementation/HTNews.c:1782
+#, c-format
+msgid "%s, Articles %d-%d"
+msgstr "%s, articles %d-%d"
+
+#: WWW/Library/Implementation/HTNews.c:1805
+msgid "Earlier articles"
+msgstr "Articles anteriors"
+
+#: WWW/Library/Implementation/HTNews.c:1818
+#, c-format
+msgid ""
+"\n"
+"There are about %d articles currently available in %s, IDs as follows:\n"
+"\n"
+msgstr ""
+"\n"
+"Hi ha %d articles disponibles actualment en %s, \n"
+
+#: WWW/Library/Implementation/HTNews.c:1880
+msgid "All available articles in "
+msgstr "Tots els articles disponibles en "
+
+#: WWW/Library/Implementation/HTNews.c:2094
+msgid "Later articles"
+msgstr "Articles recents"
+
+#: WWW/Library/Implementation/HTNews.c:2117
+msgid "Post to "
+msgstr "Enviar a "
+
+#: WWW/Library/Implementation/HTNews.c:2338
+msgid "This client does not contain support for SNEWS URLs."
+msgstr "Aquest client no té suport per a URLs de SNEWS."
+
+#: WWW/Library/Implementation/HTNews.c:2545
+msgid "No target for raw text!"
+msgstr "No hi ha un destí per al text en brut!"
+
+#: WWW/Library/Implementation/HTNews.c:2575
+msgid "Connecting to NewsHost ..."
+msgstr "Connectant amb el servidor ..."
+
+#: WWW/Library/Implementation/HTNews.c:2627
+#, c-format
+msgid "Could not access %s."
+msgstr "No ha estat possible accedir a %s."
+
+#: WWW/Library/Implementation/HTNews.c:2733
+#, c-format
+msgid "Can't read news info. News host %.20s responded: %.200s"
+msgstr "No s'ha pogut llegir la news info. El servidor %.20s ha respost: %.200s"
+
+#: WWW/Library/Implementation/HTNews.c:2737
+#, c-format
+msgid "Can't read news info, empty response from host %s"
+msgstr "No s'ha pogut llegir la news info, resposta buida del servidor %s"
+
+#.
+#. * List available newsgroups. - FM
+#.
+#: WWW/Library/Implementation/HTNews.c:2941
+msgid "Reading list of available newsgroups."
+msgstr "Llegint la llista dels fòrums disponibles."
+
+#: WWW/Library/Implementation/HTNews.c:2962
+msgid "Reading list of articles in newsgroup."
+msgstr "Llegint la llista d'articles del fòrum."
+
+#.
+#. * Get an article from a news group. - FM
+#.
+#: WWW/Library/Implementation/HTNews.c:2968
+msgid "Reading news article."
+msgstr "Llegint article."
+
+#: WWW/Library/Implementation/HTNews.c:2998
+msgid "Sorry, could not load requested news."
+msgstr "No ha estat possible carregar els missatges sol·licitats."
+
+#: WWW/Library/Implementation/HTTCP.c:1323
+msgid "Address has invalid port"
+msgstr "L'adreça conté un port que no és vàlid"
+
+#: WWW/Library/Implementation/HTTCP.c:1397
+msgid "Address length looks invalid"
+msgstr "La longitud de l'adreça sembla invàlida"
+
+#: WWW/Library/Implementation/HTTCP.c:1845
+#: WWW/Library/Implementation/HTTCP.c:1863
+#, c-format
+msgid "Unable to locate remote host %s."
+msgstr "Ha estat impossible trobar el servidor %s."
+
+#. Not HTProgress, so warning won't be overwritten immediately;
+#. * but not HTAlert, because typically there will be other
+#. * alerts from the callers. - kw
+#.
+#: WWW/Library/Implementation/HTTCP.c:1860
+#: WWW/Library/Implementation/HTTelnet.c:115
+#, c-format
+msgid "Invalid hostname %s"
+msgstr "Servidor %s no vàlid"
+
+#: WWW/Library/Implementation/HTTCP.c:1874
+#, c-format
+msgid "Making %s connection to %s"
+msgstr "Establint una connexió %s amb %s"
+
+#: WWW/Library/Implementation/HTTCP.c:1885
+msgid "socket failed."
+msgstr "ha fallat el sòcol."
+
+#: WWW/Library/Implementation/HTTCP.c:1899
+#, c-format
+msgid "socket failed: family %d addr %s port %s."
+msgstr "ha fallat el sòcol: família %d addr %s port %s."
+
+#: WWW/Library/Implementation/HTTCP.c:1923
+msgid "Could not make connection non-blocking."
+msgstr "No s'ha pogut fer que la connexió no sigui bloquejadora."
+
+#: WWW/Library/Implementation/HTTCP.c:1991
+msgid "Connection failed (too many retries)."
+msgstr "La connexió ha fallat (massa reintents)."
+
+#: WWW/Library/Implementation/HTTCP.c:2180
+msgid "Could not restore socket to blocking."
+msgstr "No s'ha pogut restaurar el sòcol perquè sigui bloquejador."
+
+#: WWW/Library/Implementation/HTTCP.c:2248
+msgid "Socket read failed (too many tries)."
+msgstr "La lectura del sòcol ha fallat (massa intents)."
+
+#: WWW/Library/Implementation/HTTP.c:136
+#, c-format
+msgid "SSL callback:%s, preverify_ok=%d, ssl_okay=%d"
+msgstr "Crida de retorn SSL:%s, preverify_ok=%d, ssl_okay=%d"
+
+#: WWW/Library/Implementation/HTTP.c:516
+#, c-format
+msgid "Address contains a username: %s"
+msgstr "L'adreça conté un nom d'usuari: %s"
+
+#: WWW/Library/Implementation/HTTP.c:570
+#, c-format
+msgid "Certificate issued by: %s"
+msgstr "El certificat ha estat expedit per: %s"
+
+#: WWW/Library/Implementation/HTTP.c:757
+msgid "This client does not contain support for HTTPS URLs."
+msgstr "Aquest client no admet adreces HTTPS."
+
+#: WWW/Library/Implementation/HTTP.c:782
+msgid "Unable to connect to remote host."
+msgstr "No ha estat possible connectar amb el servidor."
+
+#: WWW/Library/Implementation/HTTP.c:825
+msgid "Retrying connection without TLS."
+msgstr "S'està reintentant la connexió sense TLS."
+
+#: WWW/Library/Implementation/HTTP.c:877
+msgid "GnuTLS error when trying to verify certificate."
+msgstr "S'ha produït un error GnuTLS quan s'estava intentant verificar el certificat"
+
+#: WWW/Library/Implementation/HTTP.c:889
+msgid "the certificate has no known issuer"
+msgstr "el certificat no té un emissor conegut"
+
+#: WWW/Library/Implementation/HTTP.c:891
+msgid "no issuer was found"
+msgstr "no s'ha trobat cap emissor"
+
+#: WWW/Library/Implementation/HTTP.c:893
+msgid "issuer is not a CA"
+msgstr "l'emissor no és un CA"
+
+#: WWW/Library/Implementation/HTTP.c:895
+msgid "the certificate has been revoked"
+msgstr "el certificat ha estat revocat"
+
+#: WWW/Library/Implementation/HTTP.c:897
+msgid "the certificate is not trusted"
+msgstr "el certificat no és de confiança"
+
+#: WWW/Library/Implementation/HTTP.c:972
+#, c-format
+msgid "Verified connection to %s (cert=%s)"
+msgstr "Connexió verificada a %s (cert=%s)"
+
+#: WWW/Library/Implementation/HTTP.c:1022
+#: WWW/Library/Implementation/HTTP.c:1064
+#, c-format
+msgid "Verified connection to %s (subj=%s)"
+msgstr "Connexió verificada a %s (subj=%s)"
+
+#: WWW/Library/Implementation/HTTP.c:1094
+msgid "Can't find common name in certificate"
+msgstr "No es pot trobar el nom comú al certificat"
+
+#: WWW/Library/Implementation/HTTP.c:1097
+#, c-format
+msgid "SSL error:host(%s)!=cert(%s)-Continue?"
+msgstr "Error SSL: servidor(%s)!=cert(%s). Voleu continuar?"
+
+#: WWW/Library/Implementation/HTTP.c:1104
+msgid "SSL error"
+msgstr "Error de SSL"
+
+#: WWW/Library/Implementation/HTTP.c:1112
+#, c-format
+msgid "UNVERIFIED connection to %s (cert=%s)"
+msgstr "Connexió NO VERIFICADA a %s (cert=%s)"
+
+#: WWW/Library/Implementation/HTTP.c:1121
+#, c-format
+msgid "Secure %d-bit %s (%s) HTTP connection"
+msgstr "%d-bit %s segur (%s) connexió HTTP"
+
+#: WWW/Library/Implementation/HTTP.c:1584
+msgid "Sending HTTP request."
+msgstr "Enviant sol·licitud HTTP."
+
+#: WWW/Library/Implementation/HTTP.c:1626
+msgid "Unexpected network write error; connection aborted."
+msgstr "Error inesperat d'escriptura "
+
+#: WWW/Library/Implementation/HTTP.c:1632
+msgid "HTTP request sent; waiting for response."
+msgstr "Sol·licitud HTTP enviada; esperant resposta."
+
+#: WWW/Library/Implementation/HTTP.c:1705
+#: WWW/Library/Implementation/HTTP.c:1715
+msgid "Unexpected network read error; connection aborted."
+msgstr "Error inesperat de lectura en la xarxa; s'ha avortat la connexió."
+
+#.
+#. * HTTP/1.1 Informational statuses.
+#. * 100 Continue.
+#. * 101 Switching Protocols.
+#. * > 101 is unknown.
+#. * We should never get these, and they have only the status
+#. * line and possibly other headers, so we'll deal with them by
+#. * showing the full header to the user as text/plain. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:1917
+msgid "Got unexpected Informational Status."
+msgstr "S'ha obtingut un estat d'informació no esperat"
+
+#.
+#. * Reset Content. The server has fulfilled the request but
+#. * nothing is returned and we should reset any form
+#. * content. We'll instruct the user to do that, and
+#. * restore the current document. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:1951
+msgid "Request fulfilled. Reset Content."
+msgstr "S'ha completat la demanda. Restablaix el contingut."
+
+#. Not Modified
+#.
+#. * We didn't send an "If-Modified-Since" header, so this
+#. * status is inappropriate. We'll deal with it by showing
+#. * the full header to the user as text/plain. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2066
+msgid "Got unexpected 304 Not Modified status."
+msgstr "S'ha obtingut un codi 304 Not Modified inesperat (el document no ha estat modificat)."
+
+#: WWW/Library/Implementation/HTTP.c:2129
+msgid "Redirection of POST content requires user approval."
+msgstr "La redirecció del contingut POST requereix l'aprovació de l'usuari."
+
+#: WWW/Library/Implementation/HTTP.c:2144
+msgid "Have POST content. Treating Permanent Redirection as Temporary.\n"
+msgstr "Hi ha un contingut POST. Es tractarà la redirecció permanent com a temporària.\n"
+
+#: WWW/Library/Implementation/HTTP.c:2188
+msgid "Retrying with access authorization information."
+msgstr "Estic reintentant amb la informació d'accés."
+
+#: WWW/Library/Implementation/HTTP.c:2200
+msgid "Show the 401 message body?"
+msgstr "Mostrar el cos del missatge d'error 401?"
+
+#: WWW/Library/Implementation/HTTP.c:2244
+msgid "Show the 407 message body?"
+msgstr "Mostrar el cos del missatge d'error 407?"
+
+#.
+#. * Bad or unknown server_status number. Take a chance and hope
+#. * there is something to display. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2344
+msgid "Unknown status reply from server!"
+msgstr "Resposta desconeguda del servidor!"
+
+#: WWW/Library/Implementation/HTTelnet.c:113
+#, c-format
+msgid "remote %s session:"
+msgstr "sessió %s remota:"
+
+#: WWW/Library/Implementation/HTWAIS.c:163
+msgid "Could not connect to WAIS server."
+msgstr "No ha estat possible connectar al servidor WAIS."
+
+#: WWW/Library/Implementation/HTWAIS.c:171
+msgid "Could not open WAIS connection for reading."
+msgstr "No s'ha pogut obrir cap connexió WAIS (per a lectura)."
+
+#: WWW/Library/Implementation/HTWAIS.c:193
+msgid "Diagnostic code is "
+msgstr "El codi de diagnòstic és "
+
+#: WWW/Library/Implementation/HTWAIS.c:460
+msgid "Index "
+msgstr "Índex "
+
+#: WWW/Library/Implementation/HTWAIS.c:464
+#, c-format
+msgid " contains the following %d item%s relevant to \""
+msgstr " conté els següents %d ítem%s relevant per a \""
+
+#: WWW/Library/Implementation/HTWAIS.c:472
+msgid "The first figure after each entry is its relative score, "
+msgstr "La primera xifra després de cada entrada és la puntuació relativa, "
+
+#: WWW/Library/Implementation/HTWAIS.c:473
+msgid "the second is the number of lines in the item."
+msgstr "la segona és el nombre de línies."
+
+#: WWW/Library/Implementation/HTWAIS.c:515
+msgid " (bad file name)"
+msgstr " (nom de fitxer incorrecte)"
+
+#: WWW/Library/Implementation/HTWAIS.c:541
+msgid "(bad doc id)"
+msgstr " (identificador de document incorrecte)"
+
+#: WWW/Library/Implementation/HTWAIS.c:557
+msgid "(Short Header record, can't display)"
+msgstr "(Registre curt de capçalera, no es pot mostrar)"
+
+#: WWW/Library/Implementation/HTWAIS.c:564
+msgid ""
+"\n"
+"Long Header record, can't display\n"
+msgstr ""
+"\n"
+"Registre llarg de capçalera, no es pot mostrar\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:571
+msgid ""
+"\n"
+"Text record\n"
+msgstr ""
+"\n"
+"Registre de text\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:580
+msgid ""
+"\n"
+"Headline record, can't display\n"
+msgstr ""
+"\n"
+"Registre d'encapçalament, no es pot mostrar\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:588
+msgid ""
+"\n"
+"Code record, can't display\n"
+msgstr ""
+"\n"
+"Registre de codi, no es pot mostrar\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:692
+msgid "Syntax error in WAIS URL"
+msgstr "Error sintàctic en la URL WAIS"
+
+#: WWW/Library/Implementation/HTWAIS.c:764
+msgid " (WAIS Index)"
+msgstr " (Índex WAIS)"
+
+#: WWW/Library/Implementation/HTWAIS.c:771
+msgid "WAIS Index: "
+msgstr "Índex WAIS: "
+
+#: WWW/Library/Implementation/HTWAIS.c:777
+msgid "This is a link for searching the "
+msgstr "Aquest és un enllaç per a cercar en "
+
+#: WWW/Library/Implementation/HTWAIS.c:781
+msgid " WAIS Index.\n"
+msgstr " l'índex WAIS.\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:810
+msgid ""
+"\n"
+"Enter the 's'earch command and then specify search words.\n"
+msgstr ""
+"\n"
+"Introduïu l'ordre de recerca ('s') i especifiqueu els mots que voleu cercar.\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:832
+msgid " (in "
+msgstr " (a "
+
+#: WWW/Library/Implementation/HTWAIS.c:841
+msgid "WAIS Search of \""
+msgstr "Cerca WAIS de "
+
+#: WWW/Library/Implementation/HTWAIS.c:845
+msgid "\" in: "
+msgstr "\" a: "
+
+#: WWW/Library/Implementation/HTWAIS.c:860
+msgid "HTWAIS: Request too large."
+msgstr "HTWAIS: Sol·licitud massa gran."
+
+#: WWW/Library/Implementation/HTWAIS.c:869
+msgid "Searching WAIS database..."
+msgstr "Cercant en la base de dades WAIS..."
+
+#: WWW/Library/Implementation/HTWAIS.c:879
+msgid "Search interrupted."
+msgstr "Recerca interrompuda."
+
+#: WWW/Library/Implementation/HTWAIS.c:930
+msgid "Can't convert format of WAIS document"
+msgstr "No es pot convertir el format del document WAIS"
+
+#: WWW/Library/Implementation/HTWAIS.c:974
+msgid "HTWAIS: Request too long."
+msgstr "HTWAIS: Sol·licitud massa llarga."
+
+#.
+#. * Actually do the transaction given by request_message.
+#.
+#: WWW/Library/Implementation/HTWAIS.c:988
+msgid "Fetching WAIS document..."
+msgstr "Descarregant el document WAIS..."
+
+#. display_search_response(target, retrieval_response,
+#. wais_database, keywords);
+#: WWW/Library/Implementation/HTWAIS.c:1027
+msgid "No text was returned!\n"
+msgstr "No s'ha tornat cap text!\n"
+
+#: WWW/Library/Implementation/HTWSRC.c:302
+msgid " NOT GIVEN in source file; "
+msgstr " NO S'HA DONAT al fitxer font; "
+
+#: WWW/Library/Implementation/HTWSRC.c:325
+msgid " WAIS source file"
+msgstr "fitxer font WAIS"
+
+#: WWW/Library/Implementation/HTWSRC.c:332
+msgid " description"
+msgstr "descripció"
+
+#: WWW/Library/Implementation/HTWSRC.c:342
+msgid "Access links"
+msgstr "Enllaços d'accés"
+
+#: WWW/Library/Implementation/HTWSRC.c:363
+msgid "Direct access"
+msgstr "Accés directe"
+
+#. * Proxy will be used if defined, so let user know that - FM *
+#: WWW/Library/Implementation/HTWSRC.c:366
+msgid " (or via proxy server, if defined)"
+msgstr " (o a través d'un proxy, si està definit així)"
+
+#: WWW/Library/Implementation/HTWSRC.c:381
+msgid "Maintainer"
+msgstr "Mantenidor"
+
+#: WWW/Library/Implementation/HTWSRC.c:389
+msgid "Host"
+msgstr "Servidor"
+
+#: src/GridText.c:691
+msgid "Memory exhausted, display interrupted!"
+msgstr "Memòria exhaurida, visualització interrompuda!"
+
+#: src/GridText.c:696
+msgid "Memory exhausted, will interrupt transfer!"
+msgstr "Memòria exhaurida, la transferència s'interromprà!"
+
+#: src/GridText.c:3674
+msgid " *** MEMORY EXHAUSTED ***"
+msgstr " *** MEMÔRIA EXHAURIDA ***"
+
+#: src/GridText.c:6152
+msgid "text entry field"
+msgstr "camp de text"
+
+#: src/GridText.c:6155
+msgid "password entry field"
+msgstr "camp de contrasenya"
+
+#: src/GridText.c:6158
+msgid "checkbox"
+msgstr "quadre de verificació"
+
+#: src/GridText.c:6161
+msgid "radio button"
+msgstr "botó de grup"
+
+#: src/GridText.c:6164
+msgid "submit button"
+msgstr "botó d'enviament"
+
+#: src/GridText.c:6167
+msgid "reset button"
+msgstr "botó de reinici"
+
+#: src/GridText.c:6170
+msgid "script button"
+msgstr "botó d'script"
+
+#: src/GridText.c:6173
+msgid "popup menu"
+msgstr "menú emergent"
+
+#: src/GridText.c:6176
+msgid "hidden form field"
+msgstr "camp de formulari ocult"
+
+#: src/GridText.c:6179
+msgid "text entry area"
+msgstr "àrea de text"
+
+#: src/GridText.c:6182
+msgid "range entry field"
+msgstr "camp d'entrada d'interval"
+
+#: src/GridText.c:6185
+msgid "file entry field"
+msgstr "camp de fitxer"
+
+#: src/GridText.c:6188
+msgid "text-submit field"
+msgstr "camp d'enviament de text"
+
+#: src/GridText.c:6191
+msgid "image-submit button"
+msgstr "botó d'enviament d'imatges"
+
+#: src/GridText.c:6194
+msgid "keygen field"
+msgstr "camp keygen"
+
+#: src/GridText.c:6197
+msgid "unknown form field"
+msgstr "camp de formulari desconegut"
+
+#: src/GridText.c:6217 src/GridText.c:6224 src/LYList.c:249
+msgid "unknown field or link"
+msgstr "camp o enllaç desconegut"
+
+#: src/GridText.c:10650
+msgid "Can't open file for uploading"
+msgstr "No ha estat possible obrir el fitxer que voleu carregar."
+
+#: src/GridText.c:11843
+#, c-format
+msgid "Submitting %s"
+msgstr "Enviant %s"
+
+#. ugliness has happened; inform user and do the best we can
+#: src/GridText.c:12919
+msgid "Hang Detect: TextAnchor struct corrupted - suggest aborting!"
+msgstr "S'ha detectat un bloqueig: l'struct TextAnchor està corrupte - es suggereix avortar!"
+
+#. don't show previous state
+#: src/GridText.c:13083
+msgid "Wrap lines to fit displayed area?"
+msgstr "Trencar les línies per a ajustar a l'espai disponible?"
+
+#: src/GridText.c:13719
+msgid "Very long lines have been truncated!"
+msgstr "Les línies molt llargues han estat truncades!"
+
+#: src/HTAlert.c:164 src/LYShowInfo.c:386 src/LYShowInfo.c:390
+msgid "bytes"
+msgstr "bytes"
+
+#.
+#. * If we know the total size of the file, we can compute
+#. * a percentage, and show a corresponding progress bar.
+#.
+#: src/HTAlert.c:328 src/HTAlert.c:354
+#, c-format
+msgid "Read %s of data"
+msgstr "Llegits %s"
+
+#: src/HTAlert.c:351
+#, c-format
+msgid "Read %s of %s of data"
+msgstr "Llegits %s de %s."
+
+#: src/HTAlert.c:360
+#, c-format
+msgid ", %s/sec"
+msgstr ", %s/sec"
+
+#: src/HTAlert.c:374
+#, c-format
+msgid " (stalled for %s)"
+msgstr " (aturat durant %s)"
+
+#: src/HTAlert.c:378
+#, c-format
+msgid ", ETA %s"
+msgstr ", ETA %s"
+
+#: src/HTAlert.c:400
+msgid " (Press 'z' to abort)"
+msgstr " (Premeu 'z' per avortar)"
+
+#. Meta-note: don't move the following note from its place right
+#. in front of the first gettext(). As it is now, it should
+#. automatically appear in generated lynx.pot files. - kw
+#.
+#. NOTE TO TRANSLATORS: If you provide a translation for "yes", lynx
+#. * will take the first byte of the translation as a positive response
+#. * to Yes/No questions. If you provide a translation for "no", lynx
+#. * will take the first byte of the translation as a negative response
+#. * to Yes/No questions. For both, lynx will also try to show the
+#. * first byte in the prompt as a character, instead of (y) or (n),
+#. * respectively. This will not work right for multibyte charsets!
+#. * Don't translate "yes" and "no" for CJK character sets (or translate
+#. * them to "yes" and "no"). For a translation using UTF-8, don't
+#. * translate if the translation would begin with anything but a 7-bit
+#. * (US_ASCII) character. That also means do not translate if the
+#. * translation would begin with anything but a 7-bit character, if
+#. * you use a single-byte character encoding (a charset like ISO-8859-n)
+#. * but anticipate that the message catalog may be used re-encoded in
+#. * UTF-8 form.
+#. * For translations using other character sets, you may also wish to
+#. * leave "yes" and "no" untranslated, if using (y) and (n) is the
+#. * preferred behavior.
+#. * Lynx will also accept y Y n N as responses unless there is a conflict
+#. * with the first letter of the "yes" or "no" translation.
+#.
+#: src/HTAlert.c:438 src/HTAlert.c:486
+msgid "yes"
+msgstr "sí"
+
+#: src/HTAlert.c:441 src/HTAlert.c:487
+msgid "no"
+msgstr "no"
+
+#.
+#. * Special-purpose workaround for gettext support (we should do
+#. * this in a more general way) -TD
+#. *
+#. * NOTE TO TRANSLATORS: If the prompt has been rendered into
+#. * another language, and if yes/no are distinct, assume the
+#. * translator can make an ordered list in parentheses with one
+#. * capital letter for each as we assumed in HTConfirmDefault().
+#. * The list has to be in the same order as in the original message,
+#. * and the four capital letters chosen to not match those in the
+#. * original unless they have the same position.
+#. *
+#. * Example:
+#. * (Y/N/Always/neVer) - English (original)
+#. * (O/N/Toujours/Jamais) - French
+#.
+#: src/HTAlert.c:940
+msgid "Y/N/A/V"
+msgstr "S/N/P/M"
+
+#: src/HTML.c:5931
+msgid "Description:"
+msgstr "Descripció:"
+
+#: src/HTML.c:5936
+msgid "(none)"
+msgstr "(cap)"
+
+#: src/HTML.c:5940
+msgid "Filepath:"
+msgstr "Camí:"
+
+#: src/HTML.c:5946
+msgid "(unknown)"
+msgstr "(desconegut)"
+
+#: src/HTML.c:7386
+msgid "Document has only hidden links. Use the 'l'ist command."
+msgstr "El document només conté enllaços ocults. Useu el comand L)ist."
+
+#: src/HTML.c:7885
+msgid "Source cache error - disk full?"
+msgstr "Source cache error: disc ple?"
+
+#: src/HTML.c:7898
+msgid "Source cache error - not enough memory!"
+msgstr "Source cache error: no hi ha prou memòria!"
+
+#: src/LYBookmark.c:167
+msgid ""
+" This file is an HTML representation of the X Mosaic hotlist file.\n"
+" Outdated or invalid links may be removed by using the\n"
+" remove bookmark command, it is usually the 'R' key but may have\n"
+" been remapped by you or your system administrator."
+msgstr ""
+" Aquest fitxer és una representació en HTML de la llista d'adreces de l'X \n"
+" Mosaic. Els enllaços obsolets es poden eliminar amb l'ordre \"eliminar adreça\", que normalment s'executa prement la tecla R però l'usuari o\n"
+" l'administrador del sistema pot haver-la remapat."
+
+#: src/LYBookmark.c:378
+#, c-format
+msgid ""
+" You can delete links by the 'R' key<br>\n"
+"<ol>\n"
+msgstr ""
+" Podeu esborrar enllaços amb la tecla 'R'<br>\n"
+"<ol>\n"
+
+#: src/LYBookmark.c:381
+msgid ""
+" You can delete links using the remove bookmark command. It is usually\n"
+" the 'R' key but may have been remapped by you or your system\n"
+" administrator."
+msgstr ""
+" Es poden esborrar enllaços usant l'ordre \"eliminar adreça\". Normalment\n"
+" correspon a la tecla R, però pot ser remapada per l'usuari o l'administrador\n"
+" del sistema."
+
+#: src/LYBookmark.c:385
+msgid ""
+" This file also may be edited with a standard text editor to delete\n"
+" outdated or invalid links, or to change their order."
+msgstr ""
+" També es pot editar aquest fitxer amb un editor estàndard per esborrar\n"
+" enllaços obsolets o invàlids, o per canviar-ne l'ordre."
+
+#: src/LYBookmark.c:388
+msgid ""
+"Note: if you edit this file manually\n"
+" you should not change the format within the lines\n"
+" or add other HTML markup.\n"
+" Make sure any bookmark link is saved as a single line."
+msgstr ""
+"Nota: si editeu aquest fitxer manualment\n"
+" no canvieu el format entre les línies\n"
+" ni afegiu cap altra etiqueta d'HTML.\n"
+" Assegureu-vos de que cada enllaç es guarda en una sola línia."
+
+#: src/LYBookmark.c:684
+#, c-format
+msgid "File may be recoverable from %s during this session"
+msgstr "El fitxer es podrà recuperar des de %s durant aquesta sessió"
+
+#: src/LYCgi.c:162
+#, c-format
+msgid "Do you want to execute \"%s\"?"
+msgstr "Voleu executar «%s»?"
+
+#.
+#. * Neither the path as given nor any components examined by backing up
+#. * were stat()able. - kw
+#.
+#: src/LYCgi.c:277
+msgid "Unable to access cgi script"
+msgstr "Ha estat impossible d'accedir al script cgi"
+
+#: src/LYCgi.c:711 src/LYCgi.c:714
+msgid "Good Advice"
+msgstr "Bon consell"
+
+#: src/LYCgi.c:718
+msgid "An excellent http server for VMS is available via"
+msgstr "Un servidor http excel·lent per a VMS està disponible "
+
+#: src/LYCgi.c:725
+msgid "this link"
+msgstr "ací"
+
+#: src/LYCgi.c:729
+msgid "It provides state of the art CGI script support.\n"
+msgstr "Dóna informació del estat actual del suport per a scripts CGI.\n"
+
+#: src/LYClean.c:115
+msgid "Exiting via interrupt:"
+msgstr "Eixint a causa de la interrupció:"
+
+#: src/LYCookie.c:2541
+msgid "(from a previous session)"
+msgstr "(d'una sessió anterior)"
+
+#: src/LYCookie.c:2602
+msgid "Maximum Gobble Date:"
+msgstr "Data límit d'eliminació:"
+
+#: src/LYCookie.c:2641
+msgid "Internal"
+msgstr "Intern"
+
+#: src/LYCookie.c:2642
+msgid "cookie_domain_flag_set error, aborting program"
+msgstr "error cookie_domain_flag_see, s'avortarà el programa"
+
+#: src/LYCurses.c:1170
+msgid "Terminal reinitialisation failed - unknown terminal type?"
+msgstr "Ha fallat la reinicialització del terminal: és un tipus de terminal desconegut?"
+
+#: src/LYCurses.c:1377
+msgid "Terminal initialisation failed - unknown terminal type?"
+msgstr "Ha fallat la inicialització del terminal: potser és un tipus de terminal desconegut."
+
+#: src/LYCurses.c:1863
+msgid "Terminal ="
+msgstr "Terminal ="
+
+#: src/LYCurses.c:1867
+msgid "You must use a vt100, 200, etc. terminal with this program."
+msgstr "Heu d'usar un terminal vt100, 300, etc. amb aquest programa."
+
+#: src/LYCurses.c:1916
+msgid "Your Terminal type is unknown!"
+msgstr "El terminal especificat és desconegut!"
+
+#: src/LYCurses.c:1917
+msgid "Enter a terminal type:"
+msgstr "Introduïu un tipus de terminal:"
+
+#: src/LYCurses.c:1931
+msgid "TERMINAL TYPE IS SET TO"
+msgstr "EL TIPUS DE TERMINAL ESTÀ FIXAT A"
+
+#: src/LYCurses.c:2483
+#, c-format
+msgid ""
+"\n"
+"A Fatal error has occurred in %s Ver. %s\n"
+msgstr ""
+"\n"
+"S'ha produït un error fatal en %s Ver. %s\n"
+
+#: src/LYCurses.c:2486
+#, c-format
+msgid ""
+"\n"
+"Please notify your system administrator to confirm a bug, and if\n"
+"confirmed, to notify the lynx-dev list. Bug reports should have concise\n"
+"descriptions of the command and/or URL which causes the problem, the\n"
+"operating system name with version number, the TCPIP implementation, the\n"
+"TRACEBACK if it can be captured, and any other relevant information.\n"
+msgstr ""
+"\n"
+"Per favor poseu-vos en contacte amb l'administrador per confirmar l'error i,\n"
+"si escau, per \n"
+
+#: src/LYEdit.c:272
+#, c-format
+msgid "Error starting editor, %s"
+msgstr "Érror mentre s'iniciava l'editor, %s"
+
+#: src/LYEdit.c:275
+msgid "Editor killed by signal"
+msgstr "Editor mort pel senyal"
+
+#: src/LYEdit.c:280
+#, c-format
+msgid "Editor returned with error status %s"
+msgstr "L'editor ha retornat l'estat d'error %s"
+
+#: src/LYDownload.c:509
+msgid "Downloaded link:"
+msgstr "Heu descarregat:"
+
+#: src/LYDownload.c:514
+msgid "Suggested file name:"
+msgstr "Nom de l'arxiu suggerit:"
+
+#: src/LYDownload.c:519
+msgid "Standard download options:"
+msgstr "Opcions estàndard per a descàrregues:"
+
+#: src/LYDownload.c:520
+msgid "Download options:"
+msgstr "Opcions per a les descàrregues:"
+
+#: src/LYDownload.c:536
+msgid "Save to disk"
+msgstr "Guardar al disc"
+
+#: src/LYDownload.c:550
+msgid "View temporary file"
+msgstr "Visualitza el fitxer temporari"
+
+#: src/LYDownload.c:557
+msgid "Save to disk disabled."
+msgstr "La gravació en disc està desactivada."
+
+#: src/LYDownload.c:561 src/LYPrint.c:1330
+msgid "Local additions:"
+msgstr "Addicions locals:"
+
+#: src/LYDownload.c:572 src/LYUpload.c:206
+msgid "No Name Given"
+msgstr "No heu donat cap nom"
+
+#: src/LYHistory.c:680
+msgid "You selected:"
+msgstr "Heu triat:"
+
+#: src/LYHistory.c:704 src/LYHistory.c:933
+msgid "(no address)"
+msgstr "(cap adreça)"
+
+#: src/LYHistory.c:708
+msgid " (internal)"
+msgstr " (intern)"
+
+#: src/LYHistory.c:710
+msgid " (was internal)"
+msgstr " (era intern)"
+
+#: src/LYHistory.c:808
+msgid " (From History)"
+msgstr " (De l'historial)"
+
+#: src/LYHistory.c:853
+msgid "You visited (POSTs, bookmark, menu and list files excluded):"
+msgstr "Heu visitat (excepte POSTs, adreces d'interés, fitxers del menúi de la llista:"
+
+#: src/LYHistory.c:1155
+msgid "(No messages yet)"
+msgstr "(Cap missatge encara)"
+
+#: src/LYLeaks.c:222
+msgid "Invalid pointer detected."
+msgstr "S'ha detectat un punter invàlid."
+
+#: src/LYLeaks.c:224 src/LYLeaks.c:262
+msgid "Sequence:"
+msgstr "Seqüència:"
+
+#: src/LYLeaks.c:227 src/LYLeaks.c:265
+msgid "Pointer:"
+msgstr "Punter:"
+
+#: src/LYLeaks.c:236 src/LYLeaks.c:243 src/LYLeaks.c:284
+msgid "FileName:"
+msgstr "Nom del fitxer:"
+
+#: src/LYLeaks.c:239 src/LYLeaks.c:246 src/LYLeaks.c:287 src/LYLeaks.c:298
+msgid "LineCount:"
+msgstr "Línia:"
+
+#: src/LYLeaks.c:260
+msgid "Memory leak detected."
+msgstr "S'ha detectat una pèrdua de memòria."
+
+#: src/LYLeaks.c:268
+msgid "Contains:"
+msgstr "Conté:"
+
+#: src/LYLeaks.c:281
+msgid "ByteSize:"
+msgstr "Mida en bytes:"
+
+#: src/LYLeaks.c:295
+msgid "realloced:"
+msgstr "reassignat:"
+
+#: src/LYLeaks.c:316
+msgid "Total memory leakage this run:"
+msgstr "Pèrdua de memòria (en total) en aquesta execució:"
+
+#: src/LYLeaks.c:320
+msgid "Peak allocation"
+msgstr "Assignació de pic"
+
+#: src/LYLeaks.c:322
+msgid "Bytes allocated"
+msgstr "Bytes assignats"
+
+#: src/LYLeaks.c:324
+msgid "Total mallocs"
+msgstr "Mallocs totals"
+
+#: src/LYLeaks.c:326
+msgid "Total frees"
+msgstr "Lliures totals"
+
+#: src/LYList.c:89
+msgid "References in "
+msgstr "Referències en "
+
+#: src/LYList.c:92
+msgid "this document:"
+msgstr "aquest document:"
+
+#: src/LYList.c:98
+msgid "Visible links:"
+msgstr "Enllaços visibles:"
+
+#: src/LYList.c:202 src/LYList.c:321
+msgid "Hidden links:"
+msgstr "Enllaços ocults:"
+
+#: src/LYList.c:358
+msgid "References"
+msgstr "Referències"
+
+#: src/LYList.c:362
+msgid "Visible links"
+msgstr "Enllaços visibles"
+
+#: src/LYLocal.c:289
+#, c-format
+msgid "Unable to get status of '%s'."
+msgstr "Ha estat impossible obtenir l'estat de \"%s\"."
+
+#: src/LYLocal.c:354
+msgid "The selected item is not a file or a directory! Request ignored."
+msgstr "L'element triat no és ni un fitxer ni un directori! Sol·licitud ignorada."
+
+#: src/LYLocal.c:456
+#, c-format
+msgid "Unable to %s due to system error!"
+msgstr "Ha estat impossible %s a causa d'un error del sistema!"
+
+#: src/LYLocal.c:490
+#, c-format
+msgid "Probable failure to %s due to system error!"
+msgstr "Fallada probable a %s degut a un error de sistema!"
+
+#: src/LYLocal.c:555 src/LYLocal.c:578
+#, c-format
+msgid "remove %s"
+msgstr "eliminar %s"
+
+#: src/LYLocal.c:598
+#, c-format
+msgid "touch %s"
+msgstr "fes touch a %s"
+
+#: src/LYLocal.c:628
+#, c-format
+msgid "move %s to %s"
+msgstr "moure %s a %s"
+
+#: src/LYLocal.c:676
+msgid "There is already a directory with that name! Request ignored."
+msgstr "Ja existeig un directori amb aqueix nom! Sol·licitud ignorada."
+
+#: src/LYLocal.c:678
+msgid "There is already a file with that name! Request ignored."
+msgstr "Ja existeix un fitxer amb aqueix nom! Sol·licitud ignorada."
+
+#: src/LYLocal.c:680
+msgid "The specified name is already in use! Request ignored."
+msgstr "El nom especificat ja s'està usant! Sol·licitud ignorada. "
+
+#: src/LYLocal.c:692
+msgid "Destination has different owner! Request denied."
+msgstr "La destinació té un propietari diferent! Sol·licitud denegada."
+
+#: src/LYLocal.c:695
+msgid "Destination is not a valid directory! Request denied."
+msgstr "La destinació no és un directori vàlid! Sol·licitud denegada."
+
+#: src/LYLocal.c:711
+msgid "Source and destination are the same location! Request ignored!"
+msgstr "L'origen i la destinació coincideixen! Sol·licitud ignorada!"
+
+#: src/LYLocal.c:735
+msgid "Remove all tagged files and directories?"
+msgstr "Esborrar tots els fitxers i directoris indicats?"
+
+#: src/LYLocal.c:808
+msgid "Enter new location for tagged items: "
+msgstr "Introduïu la nova ubicació per als elements indicats: "
+
+#: src/LYLocal.c:906
+msgid "Enter new name for directory: "
+msgstr "Introduïu el nou nom del directori: "
+
+#: src/LYLocal.c:908
+msgid "Enter new name for file: "
+msgstr "Introduïu el nou nom del directori: "
+
+#: src/LYLocal.c:920
+msgid "Illegal character (path-separator) found! Request ignored."
+msgstr "S'ha trobat un caràcter il·legal (separador de camí). Sol·licitudignorada"
+
+#: src/LYLocal.c:970
+msgid "Enter new location for directory: "
+msgstr "Introduïu la nova ubicació per al directori: "
+
+#: src/LYLocal.c:972
+msgid "Enter new location for file: "
+msgstr "Introduïu la nova ubicació per al fitxer: "
+
+#: src/LYLocal.c:999
+msgid "Unexpected failure - unable to find trailing path separator"
+msgstr "Error inesperat: ha estat impossible trobar el separador de camí"
+
+#: src/LYLocal.c:1061
+msgid "Modify name, location, or permission (n, l, or p): "
+msgstr "Modificar nom, ubicació o permisos (n, l, p): "
+
+#: src/LYLocal.c:1063
+msgid "Modify name or location (n or l): "
+msgstr "Modificar nom o ubicació (n, l): "
+
+#.
+#. * Code for changing ownership needed here.
+#.
+#: src/LYLocal.c:1092
+msgid "This feature not yet implemented!"
+msgstr "Aquesta característica no està encara disponible!"
+
+#: src/LYLocal.c:1113
+msgid "Enter name of file to create: "
+msgstr "Introduïu el nom del fitxer que voleu crear: "
+
+#: src/LYLocal.c:1116 src/LYLocal.c:1153
+msgid "Illegal redirection \"//\" found! Request ignored."
+msgstr "S'ha trobat una redirecció il·legal \"//\"! Sol·licitud ignorada."
+
+#: src/LYLocal.c:1150
+msgid "Enter name for new directory: "
+msgstr "Introduïu el nom del nou directori: "
+
+#: src/LYLocal.c:1191
+msgid "Create file or directory (f or d): "
+msgstr "Crear un fitxer o un directori (f, d): "
+
+#: src/LYLocal.c:1233
+#, c-format
+msgid "Remove directory '%s'?"
+msgstr "Voleu eliminar el directori «%s»?"
+
+#: src/LYLocal.c:1236
+msgid "Remove directory?"
+msgstr "Voleu eliminar el directori?"
+
+#: src/LYLocal.c:1241
+#, c-format
+msgid "Remove file '%s'?"
+msgstr "Voleu eliminar l'arxiu '%s'?"
+
+#: src/LYLocal.c:1243
+msgid "Remove file?"
+msgstr "Voleu eliminar l'arxiu?"
+
+#: src/LYLocal.c:1248
+#, c-format
+msgid "Remove symbolic link '%s'?"
+msgstr "Voleu eliminar l'enllaç simbòlic '%s'?"
+
+#: src/LYLocal.c:1250
+msgid "Remove symbolic link?"
+msgstr "Voleu eliminar l'enllaç simbòlic?"
+
+#: src/LYLocal.c:1348
+msgid "Sorry, don't know how to permit non-UNIX files yet."
+msgstr "Lynx, de moment, no pot gestionar els permisos de fitxers no-UNIX."
+
+#: src/LYLocal.c:1377
+msgid "Unable to open permit options file"
+msgstr "No s'ha pogut obrir el fitxer d'opcions de permisos"
+
+#: src/LYLocal.c:1405
+msgid "Specify permissions below:"
+msgstr "Especifiqueu els permisos:"
+
+#: src/LYLocal.c:1406 src/LYShowInfo.c:287
+msgid "Owner:"
+msgstr "Propietari:"
+
+#: src/LYLocal.c:1422
+msgid "Group"
+msgstr "Grup"
+
+#: src/LYLocal.c:1438
+msgid "Others:"
+msgstr "Altres:"
+
+#: src/LYLocal.c:1456
+msgid "form to permit"
+msgstr "formulari a permís"
+
+#: src/LYLocal.c:1552
+msgid "Invalid mode format."
+msgstr "Format invàlid."
+
+#: src/LYLocal.c:1556
+msgid "Invalid syntax format."
+msgstr "Sintaxi incorrecta."
+
+#: src/LYLocal.c:1743
+msgid "Warning! UUDecoded file will exist in the directory you started Lynx."
+msgstr "Advertiment! El fitxer tractat amb l'UUDecode existirà al directori on heu iniciat el Lynx."
+
+#: src/LYLocal.c:1933
+msgid "NULL URL pointer"
+msgstr "Punter URL NULL"
+
+#: src/LYLocal.c:2015
+#, c-format
+msgid "Executing %s "
+msgstr "Executant %s "
+
+#: src/LYLocal.c:2018
+msgid "Executing system command. This might take a while."
+msgstr "Executant una ordre del sistema. Pot tardar una mica."
+
+#: src/LYLocal.c:2092
+msgid "Current directory:"
+msgstr "Directori actual:"
+
+#: src/LYLocal.c:2095 src/LYLocal.c:2113
+msgid "Current selection:"
+msgstr "Selecció actual:"
+
+#: src/LYLocal.c:2099
+msgid "Nothing currently selected."
+msgstr "Actualment no hi ha res seleccionat."
+
+#: src/LYLocal.c:2115
+msgid "tagged item:"
+msgstr "element marcat:"
+
+#: src/LYLocal.c:2116
+msgid "tagged items:"
+msgstr "elements marcats:"
+
+#: src/LYLocal.c:2216 src/LYLocal.c:2225
+msgid "Illegal filename; request ignored."
+msgstr "Nom de fitxer il·legal; sol·licitud ignorada."
+
+#. directory not writable
+#: src/LYLocal.c:2323 src/LYLocal.c:2382
+msgid "Install in the selected directory not permitted."
+msgstr "Està prohibida la instal·lació en el directori que heu triat."
+
+#: src/LYLocal.c:2378
+msgid "The selected item is not a directory! Request ignored."
+msgstr "L'element que heu triat no és un directori! Solicitud ignorada."
+
+#: src/LYLocal.c:2387
+msgid "Just a moment, ..."
+msgstr "Un moment..."
+
+#: src/LYLocal.c:2404
+msgid "Error building install args"
+msgstr "S'ha produït un error quan s'estaven construint els arguments d'instal·lació"
+
+#: src/LYLocal.c:2419 src/LYLocal.c:2450
+#, c-format
+msgid "Source and target are the same: %s"
+msgstr "L'origen i la destinació són el mateix: %s"
+
+#: src/LYLocal.c:2426 src/LYLocal.c:2457
+#, c-format
+msgid "Already in target directory: %s"
+msgstr "És aquest, el directori de destinació: %s"
+
+#: src/LYLocal.c:2475
+msgid "Installation complete"
+msgstr "Instal·lació completada"
+
+#: src/LYLocal.c:2680
+msgid "Temporary URL or list would be too long."
+msgstr "La URL temporal o la llista serien massa llargues."
+
+#: src/LYMail.c:566
+msgid "Sending"
+msgstr "Enviant"
+
+#: src/LYMail.c:1050
+#, c-format
+msgid "The link %s :?: %s \n"
+msgstr "L'enllaç %s :?: %s \n"
+
+#: src/LYMail.c:1052
+#, c-format
+msgid "called \"%s\"\n"
+msgstr "s'ha cridat «%s»\n"
+
+#: src/LYMail.c:1053
+#, c-format
+msgid "in the file \"%s\" called \"%s\"\n"
+msgstr "al fitxer «%s» s'ha cridat «%s»\n"
+
+#: src/LYMail.c:1054
+msgid "was requested but was not available."
+msgstr "s'ha demanat però no estava disponible."
+
+#: src/LYMail.c:1055
+msgid "Thought you might want to know."
+msgstr "Potser ho volieu saber."
+
+#: src/LYMail.c:1057
+msgid "This message was automatically generated by"
+msgstr "Aquest missatge va ser generat automàticament per"
+
+#: src/LYMail.c:1770
+msgid "No system mailer configured"
+msgstr "No hi ha cap servidor de correu de sistema configurat"
+
+#: src/LYMain.c:1071
+msgid "No Winsock found, sorry."
+msgstr "No s'ha trobat Winsock."
+
+#: src/LYMain.c:1262
+msgid "You MUST define a valid TMP or TEMP area!"
+msgstr "Heu de definir una àrea TMP o TEMP vàlida!"
+
+#: src/LYMain.c:1315 src/LYMainLoop.c:5283
+msgid "No such directory"
+msgstr "No existeix el directori"
+
+#: src/LYMain.c:1509
+#, c-format
+msgid ""
+"\n"
+"Configuration file \"%s\" is not available.\n"
+"\n"
+msgstr ""
+"\n"
+"El fitxer de configuració «%s» no està disponible\n"
+"\n"
+
+#: src/LYMain.c:1519
+#, c-format
+msgid ""
+"\n"
+"Lynx character sets not declared.\n"
+"\n"
+msgstr ""
+"\n"
+"Els jocs de caràcters no estan declarats.\n"
+
+#: src/LYMain.c:1675
+#, c-format
+msgid "Ignored %d characters from standard input.\n"
+msgstr "S'han ignorat %d caràcters de l'entrada estàndard.\n"
+
+#: src/LYMain.c:1677
+#, c-format
+msgid "Use \"-stdin\" or \"-\" to tell how to handle piped input.\n"
+msgstr "Useu «-stdin» o «-» per especificar com gestionar l'entrada canalitzada.\n"
+
+#: src/LYMain.c:1835
+msgid "Warning:"
+msgstr "Alerta:"
+
+#: src/LYMain.c:2405
+msgid "persistent cookies state will be changed in next session only."
+msgstr "l'estat de les cookies persistents no es canviarà fins la següent sessió"
+
+#: src/LYMain.c:2642 src/LYMain.c:2687
+#, c-format
+msgid "Lynx: ignoring unrecognized charset=%s\n"
+msgstr "Lynx: joc de caràcters %s no reconegut. S'ignorarà.\n"
+
+#: src/LYMain.c:3206
+#, c-format
+msgid "%s Version %s (%s)"
+msgstr "%s Versió %s (%s)"
+
+#: src/LYMain.c:3247
+#, c-format
+msgid "Built on %s%s.\n"
+msgstr "Compilat el %s a les %s.\n"
+
+#: src/LYMain.c:3261
+msgid "Copyrights held by the Lynx Developers Group,"
+msgstr "Els Copyright els manté el Lynx Developers Group."
+
+#: src/LYMain.c:3262
+msgid "the University of Kansas, CERN, and other contributors."
+msgstr "la Universitat de Kansas, el CERN i altres contribuïdors."
+
+#: src/LYMain.c:3263
+msgid "Distributed under the GNU General Public License (Version 2)."
+msgstr "Distribuït sota la Llicència Pública General GNU (Versió 2)."
+
+#: src/LYMain.c:3264
+msgid "See http://lynx.invisible-island.net/ and the online help for more information."
+msgstr "Vegeu http://lynx.invisible-island.net/ i l'ajuda en línia per a més informació."
+
+#: src/LYMain.c:4107
+#, c-format
+msgid "USAGE: %s [options] [file]\n"
+msgstr "UTILITZACIÓ: %s [opcions] [arxiu]\n"
+
+#: src/LYMain.c:4108
+#, c-format
+msgid "Options are:\n"
+msgstr "Les opcions són:\n"
+
+#: src/LYMain.c:4411
+#, c-format
+msgid "%s: Invalid Option: %s\n"
+msgstr "%s: l'opció no és vàlida: %s\n"
+
+#: src/LYMainLoop.c:572
+#, c-format
+msgid "Internal error: Invalid mouse link %d!"
+msgstr "Error intern: l'enllaç del ratolí no és vàlid: %d!"
+
+#: src/LYMainLoop.c:693 src/LYMainLoop.c:5305
+msgid "A URL specified by the user"
+msgstr "Una URL especificada per l'usuari"
+
+#: src/LYMainLoop.c:1142
+msgid "Enctype multipart/form-data not yet supported! Cannot submit."
+msgstr "Les dades de formulari de múltiples parts i format enctype encara no estan suportades."
+
+#.
+#. * Make a name for this help file.
+#.
+#: src/LYMainLoop.c:3196
+msgid "Help Screen"
+msgstr "Pantalla d'ajuda"
+
+#: src/LYMainLoop.c:3327
+msgid "System Index"
+msgstr "Índex del sistema"
+
+#: src/LYMainLoop.c:3575
+#, c-format
+msgid "Query parameter %d: "
+msgstr "Demana el parametre %d: "
+
+#: src/LYMainLoop.c:3804 src/LYMainLoop.c:5581
+msgid "Entry into main screen"
+msgstr "Entrar en la pantalla principal"
+
+#: src/LYMainLoop.c:4062
+msgid "No next document present"
+msgstr "No hi ha cap document més"
+
+#: src/LYMainLoop.c:4357
+msgid "charset for this document specified explicitly, sorry..."
+msgstr "el joc de caràcters per a aquest document està especificat explicitament"
+
+#: src/LYMainLoop.c:5263
+msgid "cd to:"
+msgstr "canvia al directori:"
+
+#: src/LYMainLoop.c:5286
+msgid "A component of path is not a directory"
+msgstr "Un component del camí no és un directori"
+
+#: src/LYMainLoop.c:5289
+msgid "failed to change directory"
+msgstr "no ha estat possible canviar de directori"
+
+#: src/LYMainLoop.c:6515
+msgid "Reparsing document under current settings..."
+msgstr "Tornant a analitzar el document amb les opcions actuals..."
+
+#: src/LYMainLoop.c:6809
+#, c-format
+msgid "Fatal error - could not open output file %s\n"
+msgstr "Error fatal: no s'ha pogut obrir el fitxer d'eixida %s\n"
+
+#: src/LYMainLoop.c:7151
+msgid "TABLE center enable."
+msgstr "Habilita el centrat de la taula."
+
+#: src/LYMainLoop.c:7154
+msgid "TABLE center disable."
+msgstr "Deshabilita el centrat de la taula."
+
+#: src/LYMainLoop.c:7234
+msgid "Current URL is empty."
+msgstr "La URL actual és buida."
+
+#: src/LYMainLoop.c:7236 src/LYUtils.c:1917
+msgid "Copy to clipboard failed."
+msgstr "No s'ha pogut copiar al porta-retalls."
+
+#: src/LYMainLoop.c:7238
+msgid "Document URL put to clipboard."
+msgstr "La URL del document s'ha copiat al porta-retalls."
+
+#: src/LYMainLoop.c:7240
+msgid "Link URL put to clipboard."
+msgstr "La URL de l'enllaç s'ha copiat al porta-retalls."
+
+#: src/LYMainLoop.c:7267
+msgid "No URL in the clipboard."
+msgstr "No hi ha cap URL al porta-retalls."
+
+#: src/LYMainLoop.c:7960 src/LYMainLoop.c:8131
+msgid "-index-"
+msgstr "-índex-"
+
+#: src/LYMainLoop.c:8069
+msgid "lynx: Can't access startfile"
+msgstr "lynx: No s'ha pogut accedir al fitxer inicial"
+
+#: src/LYMainLoop.c:8081
+msgid "lynx: Start file could not be found or is not text/html or text/plain"
+msgstr "lynx: No s'ha trobat el fitxer o no és text/html ni text/plain"
+
+#: src/LYMainLoop.c:8082
+msgid " Exiting..."
+msgstr " Eixint..."
+
+#: src/LYMainLoop.c:8125
+msgid "-more-"
+msgstr "-més-"
+
+#. Enable scrolling.
+#: src/LYNews.c:186
+msgid "You will be posting to:"
+msgstr "Estareu publicant a:"
+
+#.
+#. * Get the mail address for the From header, offering personal_mail_address
+#. * as default.
+#.
+#: src/LYNews.c:195
+msgid ""
+"\n"
+"\n"
+" Please provide your mail address for the From: header\n"
+msgstr ""
+"\n"
+"\n"
+" Per favor, indiqueu la vostra adreça per al remit (capçalera De:)\n"
+
+#.
+#. * Get the Subject header, offering the current document's title as the
+#. * default if this is a followup rather than a new post. - FM
+#.
+#: src/LYNews.c:212
+msgid ""
+"\n"
+"\n"
+" Please provide or edit the Subject: header\n"
+msgstr ""
+"\n"
+"\n"
+" Per favor indiqueu o editeu l'assumpte\n"
+
+#: src/LYNews.c:302
+msgid ""
+"\n"
+"\n"
+" Please provide or edit the Organization: header\n"
+msgstr ""
+"\n"
+"\n"
+" Per favor indiqueu o editeu la capçalera Organització:\n"
+
+#.
+#. * Use the built in line editior.
+#.
+#: src/LYNews.c:359
+msgid ""
+"\n"
+"\n"
+" Please enter your message below."
+msgstr ""
+"\n"
+"\n"
+" Per favor, introduïu el missatge."
+
+#: src/LYNews.c:405
+msgid "Message has no original text!"
+msgstr "El missatge no conté text original!"
+
+#: src/LYOptions.c:774
+msgid "review/edit B)ookmarks files"
+msgstr "B revisar/editar fixers de favorits"
+
+#: src/LYOptions.c:776
+msgid "B)ookmark file: "
+msgstr "B fitxer de favorits:"
+
+#: src/LYOptions.c:2123 src/LYOptions.c:2130
+msgid "ON"
+msgstr "Activat"
+
+#. verbose_img variable
+#: src/LYOptions.c:2124 src/LYOptions.c:2129 src/LYOptions.c:2302
+#: src/LYOptions.c:2313
+msgid "OFF"
+msgstr "Desactivat"
+
+#: src/LYOptions.c:2125
+msgid "NEVER"
+msgstr "Mai"
+
+#: src/LYOptions.c:2126
+msgid "ALWAYS"
+msgstr "Sempre"
+
+#: src/LYOptions.c:2142 src/LYOptions.c:2294
+msgid "ignore"
+msgstr "ignora"
+
+#: src/LYOptions.c:2143
+msgid "ask user"
+msgstr "pregunta l'usuari"
+
+#: src/LYOptions.c:2144
+msgid "accept all"
+msgstr "accepta tot"
+
+#: src/LYOptions.c:2156
+msgid "ALWAYS OFF"
+msgstr "sempre desactivat"
+
+#: src/LYOptions.c:2157
+msgid "FOR LOCAL FILES ONLY"
+msgstr "sols per fitxers locals"
+
+#: src/LYOptions.c:2159
+msgid "ALWAYS ON"
+msgstr "sempre activat"
+
+#: src/LYOptions.c:2171
+msgid "Numbers act as arrows"
+msgstr "Els números actuen com a fletxes"
+
+#: src/LYOptions.c:2173
+msgid "Links are numbered"
+msgstr "Els enllaços estan numerats"
+
+#: src/LYOptions.c:2176
+msgid "Links and form fields are numbered"
+msgstr "Els enllaços i els camps de formulari estan numerats"
+
+#: src/LYOptions.c:2179
+msgid "Form fields are numbered"
+msgstr "Els camps de formulari estan numerats"
+
+#: src/LYOptions.c:2194
+msgid "Case insensitive"
+msgstr "Insensible a majúscules/minúscules"
+
+#: src/LYOptions.c:2195
+msgid "Case sensitive"
+msgstr "Sensible a majúscules/minúscules<"
+
+#: src/LYOptions.c:2229
+msgid "prompt normally"
+msgstr "pregunta normalment"
+
+#: src/LYOptions.c:2230
+msgid "force yes-response"
+msgstr "força una resposta afirmativa"
+
+#: src/LYOptions.c:2231
+msgid "force no-response"
+msgstr "força una resposta negativa"
+
+#: src/LYOptions.c:2249
+msgid "Novice"
+msgstr "Novat"
+
+#: src/LYOptions.c:2250
+msgid "Intermediate"
+msgstr "Intermedi"
+
+#: src/LYOptions.c:2251
+msgid "Advanced"
+msgstr "Avançat"
+
+#: src/LYOptions.c:2260
+msgid "By First Visit"
+msgstr "Per primer visita"
+
+#: src/LYOptions.c:2262
+msgid "By First Visit Reversed"
+msgstr "Per primera vista en sentit invers"
+
+#: src/LYOptions.c:2263
+msgid "As Visit Tree"
+msgstr "Com a arbre de visites"
+
+#: src/LYOptions.c:2264
+msgid "By Last Visit"
+msgstr "Per l'última visita"
+
+#: src/LYOptions.c:2266
+msgid "By Last Visit Reversed"
+msgstr "Per l'última visita en sentit invers"
+
+#. Old_DTD variable
+#: src/LYOptions.c:2277
+msgid "relaxed (TagSoup mode)"
+msgstr "relaxat (mode TagSoup)"
+
+#: src/LYOptions.c:2278
+msgid "strict (SortaSGML mode)"
+msgstr "estricte (mode SortaSGML)"
+
+#: src/LYOptions.c:2285
+msgid "Ignore"
+msgstr "Ignora"
+
+#: src/LYOptions.c:2286
+msgid "Add to trace-file"
+msgstr "Afegeix al fitxer de traça"
+
+#: src/LYOptions.c:2287
+msgid "Add to LYNXMESSAGES"
+msgstr "Afegeix a LYNXMESSAGES"
+
+#: src/LYOptions.c:2288
+msgid "Warn, point to trace-file"
+msgstr "Adverteix, apunta al fitxer de rastre"
+
+#: src/LYOptions.c:2295
+msgid "as labels"
+msgstr "com a etiquetes"
+
+#: src/LYOptions.c:2296
+msgid "as links"
+msgstr "com a enllaços"
+
+#: src/LYOptions.c:2303
+msgid "show filename"
+msgstr "mostra el nom del fitxer"
+
+#: src/LYOptions.c:2314
+msgid "STANDARD"
+msgstr "ESTANDARD"
+
+#: src/LYOptions.c:2315
+msgid "ADVANCED"
+msgstr "AVANÇAT"
+
+#: src/LYOptions.c:2349
+msgid "Directories first"
+msgstr "Primer els directoris"
+
+#: src/LYOptions.c:2350
+msgid "Files first"
+msgstr "Primer els fitxers"
+
+#: src/LYOptions.c:2351
+msgid "Mixed style"
+msgstr "Estile barrejat"
+
+#: src/LYOptions.c:2359 src/LYOptions.c:2379
+msgid "By Name"
+msgstr "Per nom"
+
+#: src/LYOptions.c:2360 src/LYOptions.c:2380
+msgid "By Type"
+msgstr "Per tipus"
+
+#: src/LYOptions.c:2361 src/LYOptions.c:2381
+msgid "By Size"
+msgstr "Per Mida"
+
+#: src/LYOptions.c:2362 src/LYOptions.c:2382
+msgid "By Date"
+msgstr "Per data"
+
+#: src/LYOptions.c:2363
+msgid "By Mode"
+msgstr "Per mode"
+
+#: src/LYOptions.c:2365
+msgid "By User"
+msgstr "Per usuari"
+
+#: src/LYOptions.c:2366
+msgid "By Group"
+msgstr "Per grup"
+
+#: src/LYOptions.c:2391
+msgid "Do not show rate"
+msgstr "No mostris la taxa"
+
+#: src/LYOptions.c:2392 src/LYOptions.c:2393
+#, c-format
+msgid "Show %s/sec rate"
+msgstr "Mostra la taxa de %s/segons"
+
+#: src/LYOptions.c:2395 src/LYOptions.c:2396
+#, c-format
+msgid "Show %s/sec, ETA"
+msgstr "Mostra %s/segons, ETA"
+
+#: src/LYOptions.c:2397 src/LYOptions.c:2398
+#, c-format
+msgid "Show %s/sec (2-digits), ETA"
+msgstr "Mostra %s/segons (2-dígits), ETA"
+
+#: src/LYOptions.c:2401
+msgid "Show progressbar"
+msgstr "Mostrar la barra de progrés"
+
+#: src/LYOptions.c:2413
+msgid "Accept lynx's internal types"
+msgstr "Accpta els tipus interns del Lynx"
+
+#: src/LYOptions.c:2414
+msgid "Also accept lynx.cfg's types"
+msgstr "Accepta també els tipus de lynx.cfg"
+
+#: src/LYOptions.c:2415
+msgid "Also accept user's types"
+msgstr "Accepta també els tipus de l'usuari"
+
+#: src/LYOptions.c:2416
+msgid "Also accept system's types"
+msgstr "Accepta també els tipus del sistema"
+
+#: src/LYOptions.c:2417
+msgid "Accept all types"
+msgstr "Accepta tots els tipus"
+
+#: src/LYOptions.c:2426
+msgid "gzip"
+msgstr "gzip"
+
+#: src/LYOptions.c:2427
+msgid "deflate"
+msgstr "deflacta"
+
+#: src/LYOptions.c:2430
+msgid "compress"
+msgstr "comprimeix"
+
+#: src/LYOptions.c:2433
+msgid "bzip2"
+msgstr "bzip2"
+
+#: src/LYOptions.c:2435
+msgid "All"
+msgstr "Tot"
+
+#: src/LYOptions.c:2801 src/LYOptions.c:2830
+#, c-format
+msgid "Use %s to invoke the Options menu!"
+msgstr "Useu %s per a invocar el menú d'opcions"
+
+#: src/LYOptions.c:3688
+msgid "(options marked with (!) will not be saved)"
+msgstr "(les opcions marcades amb (!) no es desen)"
+
+#: src/LYOptions.c:3696
+msgid "General Preferences"
+msgstr "Preferències generals"
+
+#. ***************************************************************
+#. User Mode: SELECT
+#: src/LYOptions.c:3700
+msgid "User mode"
+msgstr "Tipus d'usuari"
+
+#. Editor: INPUT
+#: src/LYOptions.c:3706
+msgid "Editor"
+msgstr "Editor"
+
+#. Search Type: SELECT
+#: src/LYOptions.c:3711
+msgid "Type of Search"
+msgstr "Tipus de recerca"
+
+#: src/LYOptions.c:3716
+msgid "Security and Privacy"
+msgstr "Seguretat i privacitat"
+
+#. ***************************************************************
+#. Cookies: SELECT
+#: src/LYOptions.c:3720
+msgid "Cookies"
+msgstr "Cookies"
+
+#. Cookie Prompting: SELECT
+#: src/LYOptions.c:3734
+msgid "Invalid-Cookie Prompting"
+msgstr "Demanda de cookie no vàlida"
+
+#. SSL Prompting: SELECT
+#: src/LYOptions.c:3741
+msgid "SSL Prompting"
+msgstr "Demanda de SSL"
+
+#: src/LYOptions.c:3746
+msgid "SSL client certificate file"
+msgstr "Fitxer de certificat de client SSL"
+
+#: src/LYOptions.c:3750
+msgid "SSL client key file"
+msgstr "Fitxer de clau de client SSL"
+
+#: src/LYOptions.c:3756
+msgid "Keyboard Input"
+msgstr "Teclat"
+
+#. ***************************************************************
+#. Keypad Mode: SELECT
+#: src/LYOptions.c:3760
+msgid "Keypad mode"
+msgstr "Mode del teclat"
+
+#. Emacs keys: ON/OFF
+#: src/LYOptions.c:3766
+msgid "Emacs keys"
+msgstr "Tecles d'emacs"
+
+#. VI Keys: ON/OFF
+#: src/LYOptions.c:3772
+msgid "VI keys"
+msgstr "Tecles de VI"
+
+#. Line edit style: SELECT
+#. well, at least 2 line edit styles available
+#: src/LYOptions.c:3779
+msgid "Line edit style"
+msgstr "Estil d'edició de la línia"
+
+#. Keyboard layout: SELECT
+#: src/LYOptions.c:3791
+msgid "Keyboard layout"
+msgstr "Configuració del teclat"
+
+#.
+#. * Display and Character Set
+#.
+#: src/LYOptions.c:3805
+msgid "Display and Character Set"
+msgstr "Pantalla i joc de caràcters"
+
+#. Use locale-based character set: ON/OFF
+#: src/LYOptions.c:3810
+msgid "Use locale-based character set"
+msgstr "Usa el conjunt de caràcters basats en el locale"
+
+#: src/LYOptions.c:3817
+msgid "Use HTML5 charset replacements"
+msgstr "Usa reemplaçaments del conjunt de caràcters de l'HTML5"
+
+#. Display Character Set: SELECT
+#: src/LYOptions.c:3823
+msgid "Display character set"
+msgstr "Joc de caràcters"
+
+#: src/LYOptions.c:3854
+msgid "Assumed document character set"
+msgstr "Joc de caràcters predeterminat"
+
+#.
+#. * Since CJK people hardly mixed with other world
+#. * we split the header to make it more readable:
+#. * "CJK mode" for CJK display charsets, and "Raw 8-bit" for others.
+#.
+#: src/LYOptions.c:3874
+msgid "CJK mode"
+msgstr "mode CJK"
+
+#: src/LYOptions.c:3876
+msgid "Raw 8-bit"
+msgstr "8-bits cru"
+
+#. X Display: INPUT
+#: src/LYOptions.c:3884
+msgid "X Display"
+msgstr "Pantalla X"
+
+#.
+#. * Document Appearance
+#.
+#: src/LYOptions.c:3890
+msgid "Document Appearance"
+msgstr "Apariència dels documents"
+
+#: src/LYOptions.c:3896
+msgid "Show color"
+msgstr "En color"
+
+#. Color style: ON/OFF
+#: src/LYOptions.c:3921
+msgid "Color style"
+msgstr "Estil de color"
+
+#: src/LYOptions.c:3930
+msgid "Default colors"
+msgstr "Color predeterminats"
+
+#. Show cursor: ON/OFF
+#: src/LYOptions.c:3938
+msgid "Show cursor"
+msgstr "Mostrar cursor"
+
+#. Underline links: ON/OFF
+#: src/LYOptions.c:3944
+msgid "Underline links"
+msgstr "Subratlla els enllaços"
+
+#. Show scrollbar: ON/OFF
+#: src/LYOptions.c:3951
+msgid "Show scrollbar"
+msgstr "Mostrar la barra de desplaçament"
+
+#. Select Popups: ON/OFF
+#: src/LYOptions.c:3958
+msgid "Popups for select fields"
+msgstr "Finestres emergents per a camps de selecció"
+
+#. HTML error recovery: SELECT
+#: src/LYOptions.c:3964
+msgid "HTML error recovery"
+msgstr "Recuperació d'errors de HTML"
+
+#. Bad HTML messages: SELECT
+#: src/LYOptions.c:3970
+msgid "Bad HTML messages"
+msgstr "Missatges incorrectes d'HTML"
+
+#. Show Images: SELECT
+#: src/LYOptions.c:3976
+msgid "Show images"
+msgstr "Mostra les imatges"
+
+#. Verbose Images: ON/OFF
+#: src/LYOptions.c:3990
+msgid "Verbose images"
+msgstr "Detalls sobre imatges"
+
+#.
+#. * Headers Transferred to Remote Servers
+#.
+#: src/LYOptions.c:3998
+msgid "Headers Transferred to Remote Servers"
+msgstr "Capçaleres que es transmeten als servidors remots"
+
+#. ***************************************************************
+#. Mail Address: INPUT
+#: src/LYOptions.c:4002
+msgid "Personal mail address"
+msgstr "Adreça electrònica personal"
+
+#: src/LYOptions.c:4007
+msgid "Personal name for mail"
+msgstr "Adreça personal del correu electrònic"
+
+#: src/LYOptions.c:4014
+msgid "Password for anonymous ftp"
+msgstr "Contrasenya per al ftp anònimo"
+
+#. Preferred media type: SELECT
+#: src/LYOptions.c:4020
+msgid "Preferred media type"
+msgstr "Tipus de suport preferit"
+
+#. Preferred encoding: SELECT
+#: src/LYOptions.c:4026
+msgid "Preferred encoding"
+msgstr "Codificació preferida"
+
+#. Preferred Document Character Set: INPUT
+#: src/LYOptions.c:4032
+msgid "Preferred document character set"
+msgstr "Joc de caràcters preferit"
+
+#. Preferred Document Language: INPUT
+#: src/LYOptions.c:4037
+msgid "Preferred document language"
+msgstr "Idioma preferit"
+
+#: src/LYOptions.c:4043
+msgid "Send User-Agent header"
+msgstr "Envia la capçalera de l'agent d'usuari"
+
+#: src/LYOptions.c:4045
+msgid "User-Agent header"
+msgstr "Identificació del navegador"
+
+#.
+#. * Listing and Accessing Files
+#.
+#: src/LYOptions.c:4053
+msgid "Listing and Accessing Files"
+msgstr "Fitxers: llistat i accés"
+
+#. FTP sort: SELECT
+#: src/LYOptions.c:4058
+msgid "Use Passive FTP"
+msgstr "Usa el FTP passiu"
+
+#. FTP sort: SELECT
+#: src/LYOptions.c:4064
+msgid "FTP sort criteria"
+msgstr "Criteri d'ordenació per a FTP"
+
+#. Local Directory Sort: SELECT
+#: src/LYOptions.c:4072
+msgid "Local directory sort criteria"
+msgstr "Criteri d'ordenació local"
+
+#. Local Directory Order: SELECT
+#: src/LYOptions.c:4078
+msgid "Local directory sort order"
+msgstr "Criteri d'ordenació de directoris locals"
+
+#: src/LYOptions.c:4087
+msgid "Show dot files"
+msgstr "Mostrar fitxers .*"
+
+#: src/LYOptions.c:4095
+msgid "Execution links"
+msgstr "Enllaços d'execució"
+
+#: src/LYOptions.c:4113
+msgid "Pause when showing message"
+msgstr "Pausa quan s'estiguin mostrant els missatges"
+
+#. Show transfer rate: SELECT
+#: src/LYOptions.c:4120
+msgid "Show transfer rate"
+msgstr "Mostrar taxa de transferència"
+
+#.
+#. * Special Files and Screens
+#.
+#: src/LYOptions.c:4140
+msgid "Special Files and Screens"
+msgstr "Fitxers i pantalles especials"
+
+#: src/LYOptions.c:4145
+msgid "Multi-bookmarks"
+msgstr "Marcadors multiples"
+
+#: src/LYOptions.c:4153
+msgid "Review/edit Bookmarks files"
+msgstr "Editar fitxers de favorits"
+
+#: src/LYOptions.c:4156
+msgid "Goto multi-bookmark menu"
+msgstr "Veure el menú de múltiples fitxers d'adreces"
+
+#: src/LYOptions.c:4158
+msgid "Bookmarks file"
+msgstr "Fitxer de favorits"
+
+#. Auto Session: ON/OFF
+#: src/LYOptions.c:4165
+msgid "Auto Session"
+msgstr "Sessió automàtica"
+
+#. Session File Menu: INPUT
+#: src/LYOptions.c:4171
+msgid "Session file"
+msgstr "Fitxer de sessió"
+
+#. Visited Pages: SELECT
+#: src/LYOptions.c:4177
+msgid "Visited Pages"
+msgstr "Pàgines visitades"
+
+#: src/LYOptions.c:4182
+msgid "View the file "
+msgstr "Veure el fitxer"
+
+#: src/LYPrint.c:955
+#, c-format
+msgid " Print job complete.\n"
+msgstr " Imprimir treball complet.\n"
+
+#: src/LYPrint.c:1282
+msgid "Document:"
+msgstr "Document:"
+
+#: src/LYPrint.c:1283
+msgid "Number of lines:"
+msgstr "Nombre de línies:"
+
+#: src/LYPrint.c:1284
+msgid "Number of pages:"
+msgstr "Nombre de pàgines:"
+
+#: src/LYPrint.c:1285
+msgid "pages"
+msgstr "pàgines"
+
+#: src/LYPrint.c:1285
+msgid "page"
+msgstr "pàgina"
+
+#: src/LYPrint.c:1286
+msgid "(approximately)"
+msgstr "(aproximadament)"
+
+#: src/LYPrint.c:1293
+msgid "Some print functions have been disabled!"
+msgstr "Algunes funcions d'impressió han estat desactivades!"
+
+#: src/LYPrint.c:1297
+msgid "Standard print options:"
+msgstr "Opcions estàndard d'impressió:"
+
+#: src/LYPrint.c:1298
+msgid "Print options:"
+msgstr "Opcions d'impressió:"
+
+#: src/LYPrint.c:1305
+msgid "Save to a local file"
+msgstr "Gravar en un arxiu local"
+
+#: src/LYPrint.c:1307
+msgid "Save to disk disabled"
+msgstr "Gravar en disc està desactivat"
+
+#: src/LYPrint.c:1314
+msgid "Mail the file"
+msgstr "Enviar l'arxiu per correu"
+
+#: src/LYPrint.c:1321
+msgid "Print to the screen"
+msgstr "Imprimir en pantalla"
+
+#: src/LYPrint.c:1326
+msgid "Print out on a printer attached to your vt100 terminal"
+msgstr "Imprimir en una impressora connectada al vostre terminal"
+
+#: src/LYReadCFG.c:441
+#, c-format
+msgid ""
+"Syntax Error parsing COLOR in configuration file:\n"
+"The line must be of the form:\n"
+"COLOR:INTEGER:FOREGROUND:BACKGROUND\n"
+"\n"
+"Here FOREGROUND and BACKGROUND must be one of:\n"
+"The special strings 'nocolor' or 'default', or\n"
+msgstr ""
+"S'ha trobat un error sintàctic mentre s'analitzava\n"
+"la variable COLOR en el fitxer de configuració:\n"
+"La línia ha de ser de la forma:\n"
+"COLOR:NOMBRE_ENTER:PRIMER_PLA:FONS\n"
+"\n"
+"Ací PRIMER_PLA i FONS han de ser:\n"
+"Les cadenes especials \"nocolor\" o \"default\", o\n"
+
+#: src/LYReadCFG.c:454
+msgid "Offending line:"
+msgstr "Línia incorrecta:"
+
+#: src/LYReadCFG.c:769
+#, c-format
+msgid "key remapping of %s to %s for %s failed\n"
+msgstr "el remapatge de %s a %s per a %s ha fallat\n"
+
+#: src/LYReadCFG.c:776
+#, c-format
+msgid "key remapping of %s to %s failed\n"
+msgstr "el remapatge de %s a %s ha fallat\n"
+
+#: src/LYReadCFG.c:797
+#, c-format
+msgid "invalid line-editor selection %s for key %s, selecting all\n"
+msgstr "selecció no vàlida de editor de línies %s per a la clau %s, se seleccionarà tot\n"
+
+#: src/LYReadCFG.c:822 src/LYReadCFG.c:834
+#, c-format
+msgid "setting of line-editor binding for key %s (0x%x) to 0x%x for %s failed\n"
+msgstr "establiment del vincle de l'editor de línies per a la clau %s (0x%x) a 0x%x per a %s ha fallat\n"
+
+#: src/LYReadCFG.c:838
+#, c-format
+msgid "setting of line-editor binding for key %s (0x%x) for %s failed\n"
+msgstr "establiment del vincle de l'editor de línies per a la clau %s (0x%x) per a %s ha fallat\n"
+
+#: src/LYReadCFG.c:934
+#, c-format
+msgid "Lynx: cannot start, CERN rules file %s is not available\n"
+msgstr "Lynx: impossible iniciar, el fitxer de regles del CERN %s no estàdisponible\n"
+
+#: src/LYReadCFG.c:935
+msgid "(no name)"
+msgstr "(sense nom)"
+
+#: src/LYReadCFG.c:2075
+#, c-format
+msgid "More than %d nested lynx.cfg includes -- perhaps there is a loop?!?\n"
+msgstr "Més de %d includes imbricats en lynx.cfg: potser hi ha un bucle?\n"
+
+#: src/LYReadCFG.c:2077
+#, c-format
+msgid "Last attempted include was '%s',\n"
+msgstr "L'últim include ha estat \"%s\", \n"
+
+#: src/LYReadCFG.c:2078
+#, c-format
+msgid "included from '%s'.\n"
+msgstr "inclós des de \"%s\".\n"
+
+#: src/LYReadCFG.c:2481 src/LYReadCFG.c:2494 src/LYReadCFG.c:2552
+msgid "The following is read from your lynx.cfg file."
+msgstr "Les dades següents s'han llegit del vostre fitxer lynx.cfg."
+
+#: src/LYReadCFG.c:2482 src/LYReadCFG.c:2495
+msgid "Please read the distribution"
+msgstr "Per favor, llegiu "
+
+#: src/LYReadCFG.c:2488 src/LYReadCFG.c:2498
+msgid "for more comments."
+msgstr "si necessiteu més informació."
+
+#: src/LYReadCFG.c:2534
+msgid "RELOAD THE CHANGES"
+msgstr "RECARREGAR ELS CANVIS"
+
+#: src/LYReadCFG.c:2542
+msgid "Your primary configuration"
+msgstr "Configuració primària"
+
+#: src/LYShowInfo.c:111
+msgid "URL:"
+msgstr "URL:"
+
+#: src/LYShowInfo.c:196
+msgid "Directory that you are currently viewing"
+msgstr "Directori que veieu actualment"
+
+#: src/LYShowInfo.c:199
+msgid "Name:"
+msgstr "Nom:"
+
+#: src/LYShowInfo.c:216
+msgid "Directory that you have currently selected"
+msgstr "Directori triat"
+
+#: src/LYShowInfo.c:218
+msgid "File that you have currently selected"
+msgstr "Arxiu triat"
+
+#: src/LYShowInfo.c:221
+msgid "Symbolic link that you have currently selected"
+msgstr "Enllaç simbòlic que heu triat"
+
+#: src/LYShowInfo.c:224
+msgid "Item that you have currently selected"
+msgstr "Element que heu triat"
+
+#: src/LYShowInfo.c:226
+msgid "Full name:"
+msgstr "Nom complet:"
+
+#: src/LYShowInfo.c:239
+msgid "Unable to follow link"
+msgstr "Ha estat impossible seguir l'enllaç"
+
+#: src/LYShowInfo.c:241
+msgid "Points to file:"
+msgstr "Apunta al fitxer:"
+
+#: src/LYShowInfo.c:246
+msgid "Name of owner:"
+msgstr "Nom del propietari:"
+
+#: src/LYShowInfo.c:249
+msgid "Group name:"
+msgstr "Nom del grup:"
+
+#: src/LYShowInfo.c:251
+msgid "File size:"
+msgstr "Grandària:"
+
+#: src/LYShowInfo.c:253
+msgid "(bytes)"
+msgstr "(bytes)"
+
+#.
+#. * Include date and time information.
+#.
+#: src/LYShowInfo.c:258
+msgid "Creation date:"
+msgstr "Data de creació:"
+
+#: src/LYShowInfo.c:261
+msgid "Last modified:"
+msgstr "Última modificació:"
+
+#: src/LYShowInfo.c:264
+msgid "Last accessed:"
+msgstr "Últim accés:"
+
+#: src/LYShowInfo.c:270
+msgid "Access Permissions"
+msgstr "Permisos d'accés"
+
+#: src/LYShowInfo.c:305
+msgid "Group:"
+msgstr "Grup:"
+
+#: src/LYShowInfo.c:325
+msgid "World:"
+msgstr "Món:"
+
+#: src/LYShowInfo.c:332
+msgid "File that you are currently viewing"
+msgstr "Fitxer que veieu actualment"
+
+#: src/LYShowInfo.c:340 src/LYShowInfo.c:444
+msgid "Linkname:"
+msgstr "Nom:"
+
+#: src/LYShowInfo.c:346 src/LYShowInfo.c:361
+msgid "Charset:"
+msgstr "Joc de caràcters:"
+
+#: src/LYShowInfo.c:360
+msgid "(assumed)"
+msgstr "(suposat)"
+
+#: src/LYShowInfo.c:367
+msgid "Server:"
+msgstr "Servidor:"
+
+#: src/LYShowInfo.c:370
+msgid "Date:"
+msgstr "Data:"
+
+#: src/LYShowInfo.c:373
+msgid "Last Mod:"
+msgstr "Últ. mod.:"
+
+#: src/LYShowInfo.c:378
+msgid "Expires:"
+msgstr "Expira:"
+
+#: src/LYShowInfo.c:381
+msgid "Cache-Control:"
+msgstr "Control-del-cau:"
+
+#: src/LYShowInfo.c:384
+msgid "Content-Length:"
+msgstr "Longitud-del-contingut:"
+
+#: src/LYShowInfo.c:388
+msgid "Length:"
+msgstr "Longitud:"
+
+#: src/LYShowInfo.c:393
+msgid "Language:"
+msgstr "Idioma:"
+
+#: src/LYShowInfo.c:400
+msgid "Post Data:"
+msgstr "Data de publicació:"
+
+#: src/LYShowInfo.c:403
+msgid "Post Content Type:"
+msgstr "Tipus de contingut de publicació:"
+
+#: src/LYShowInfo.c:406
+msgid "Owner(s):"
+msgstr "Propietari(s):"
+
+#: src/LYShowInfo.c:411
+msgid "size:"
+msgstr "grandària:"
+
+#: src/LYShowInfo.c:413
+msgid "lines"
+msgstr "línies"
+
+#: src/LYShowInfo.c:417
+msgid "forms mode"
+msgstr "mode de formularis"
+
+#: src/LYShowInfo.c:419
+msgid "source"
+msgstr "font"
+
+#: src/LYShowInfo.c:420
+msgid "normal"
+msgstr "normal"
+
+#: src/LYShowInfo.c:422
+msgid ", safe"
+msgstr ", segur"
+
+#: src/LYShowInfo.c:424
+msgid ", via internal link"
+msgstr ", a través de l'enllaç intern"
+
+#: src/LYShowInfo.c:429
+msgid ", no-cache"
+msgstr ", no-cau"
+
+#: src/LYShowInfo.c:431
+msgid ", ISMAP script"
+msgstr ", script ISMAP"
+
+#: src/LYShowInfo.c:433
+msgid ", bookmark file"
+msgstr ", fitxer de marcadors"
+
+#: src/LYShowInfo.c:437
+msgid "mode:"
+msgstr "mode:"
+
+#: src/LYShowInfo.c:443
+msgid "Link that you currently have selected"
+msgstr "Enllaç triat"
+
+#: src/LYShowInfo.c:452
+msgid "Method:"
+msgstr "Mètode:"
+
+#: src/LYShowInfo.c:456
+msgid "Enctype:"
+msgstr "Enctype:"
+
+#: src/LYShowInfo.c:462
+msgid "Action:"
+msgstr "Acció:"
+
+#: src/LYShowInfo.c:468
+msgid "(Form field)"
+msgstr "(Camp de formulari)"
+
+#: src/LYShowInfo.c:478
+msgid "No Links on the current page"
+msgstr "No hi ha enllaços en aquesta pàgina"
+
+#: src/LYShowInfo.c:484
+msgid "Server Headers:"
+msgstr "Capçaleres del servidor:"
+
+#: src/LYStyle.c:338
+#, c-format
+msgid ""
+"Syntax Error parsing style in lss file:\n"
+"[%s]\n"
+"The line must be of the form:\n"
+"OBJECT:MONO:COLOR (ie em:bold:brightblue:white)\n"
+"where OBJECT is one of EM,STRONG,B,I,U,BLINK etc.\n"
+"\n"
+msgstr ""
+"Error de sintaxi quan s'estava analitzant l'estil al fitxer lss:\n"
+"[%s]\n"
+"La línia ha de ser de la forma:\n"
+"OBJECTE:MONO:COLOR (per exemple em:bold:brightblue:white)\n"
+"on OBJECTE és un de EM,STRONG,B,I,U,BLINK, etc.\n"
+"\n"
+
+#: src/LYStyle.c:933
+#, c-format
+msgid ""
+"\n"
+"Lynx file \"%s\" is not available.\n"
+"\n"
+msgstr ""
+"\n"
+"El fitxer «%s» de Lynx no està disponible.\n"
+"\n"
+
+#: src/LYTraversal.c:111
+msgid "here is a list of the history stack so that you may rebuild"
+msgstr "aquí hi ha una llista de la pila d'històries de manera que podeu reconstruir"
+
+#: src/LYUpload.c:77
+msgid "ERROR! - upload command is misconfigured"
+msgstr "ERROR! La instrucció de càrrega no està ben configurada"
+
+#: src/LYUpload.c:98
+msgid "Illegal redirection \"../\" found! Request ignored."
+msgstr "S'ha trobat la redirecció il·legal \"../\"! Sol·licitud ignorada."
+
+#: src/LYUpload.c:101
+msgid "Illegal character \"/\" found! Request ignored."
+msgstr "S'ha trobat un caràcter no vàlid \"/\"! Sol·licitud ignorada."
+
+#: src/LYUpload.c:104
+msgid "Illegal redirection using \"~\" found! Request ignored."
+msgstr "Redirecció il·legal amb \"~\"! Sol·licitud ignorada."
+
+#: src/LYUpload.c:157
+msgid "Unable to upload file."
+msgstr "Ha estat impossible carregar el fitxer."
+
+#: src/LYUpload.c:196
+msgid "Upload To:"
+msgstr "Carregar a:"
+
+#: src/LYUpload.c:197
+msgid "Upload options:"
+msgstr "Opcions de càrrega:"
+
+#: src/LYUtils.c:1919
+msgid "Download document URL put to clipboard."
+msgstr "Descarrega l'URL del document que es va posar al portar-etalls"
+
+#: src/LYUtils.c:2666
+msgid "Unexpected access protocol for this URL scheme."
+msgstr "Protocol inesperat d'accés per a aquest esquema URL."
+
+#: src/LYUtils.c:3571
+msgid "Too many tempfiles"
+msgstr "Massa fitxers temporals"
+
+#: src/LYUtils.c:3871
+msgid "unknown restriction"
+msgstr "restricció desconeguda"
+
+#: src/LYUtils.c:3902
+#, c-format
+msgid "No restrictions set.\n"
+msgstr "No s'hi han establert restriccions.\n"
+
+#: src/LYUtils.c:3905
+#, c-format
+msgid "Restrictions set:\n"
+msgstr "Restriccions:\n"
+
+#: src/LYUtils.c:5279
+msgid "Cannot find HOME directory"
+msgstr "No s'ha trobat el directori d'inici (HOME)"
+
+#: src/LYrcFile.c:16
+msgid "Normally disabled. See ENABLE_LYNXRC in lynx.cfg\n"
+msgstr "Normalment desactivat. Veieu ENABLE_LYNXRC en lynx.cfg\n"
+
+#: src/LYrcFile.c:327
+msgid ""
+"accept_all_cookies allows the user to tell Lynx to automatically\n"
+"accept all cookies if desired. The default is \"FALSE\" which will\n"
+"prompt for each cookie. Set accept_all_cookies to \"TRUE\" to accept\n"
+"all cookies.\n"
+msgstr ""
+"accept_all_cookies permet l'usuari que indique a Lynx que accepte totes\n"
+"les cookies automàticament. El valor predeterminat és \"FALSE\" de forma\n"
+"que el programa preguntarà abans d'acceptar cap cookie. Doneu a \n"
+"accept_all_cookies el valor \"TRUE\" per acceptar qualsevol cookie.\n"
+
+#: src/LYrcFile.c:335
+msgid ""
+"anonftp_password allows the user to tell Lynx to use the personal\n"
+"email address as the password for anonymous ftp. If no value is given,\n"
+"Lynx will use the personal email address. Set anonftp_password\n"
+"to a different value if you choose.\n"
+msgstr ""
+"anonftp_password permet l'usuari dir-li al Lynx que usi l'adreça de correu\n"
+"electrònic personal com la contrasenya per al ftp anònim. Si no es dóna cap valor,\n"
+"lynx usarà l'adreça de correu electrònic persona. Establiu anonftp_password a un \n"
+"altre valor si així ho voleu.\n"
+
+#: src/LYrcFile.c:344
+msgid ""
+"bookmark_file specifies the name and location of the default bookmark\n"
+"file into which the user can paste links for easy access at a later\n"
+"date.\n"
+msgstr ""
+"bookmark_file especifica el nom i la ubicació del fitxer d'adreces\n"
+"d'interés predeterminat, en el qual l'usuari pot enganxar enllaços\n"
+"per accedir-hi posteriorment amb facilitat.\n"
+
+#: src/LYrcFile.c:349
+msgid ""
+"If case_sensitive_searching is \"on\" then when the user invokes a search\n"
+"using the 's' or '/' keys, the search performed will be case sensitive\n"
+"instead of case INsensitive. The default is usually \"off\".\n"
+msgstr ""
+"Si el valor de case_sensitive_searching és \"on\", quan l'usuari realitze\n"
+"una recerca usant les tecles \"s\" o \"/\" les lletres majúscules i\n"
+"minúscules seran considerades lletres diferents. El valor predeterminat\n"
+"és \"off\".\n"
+
+#: src/LYrcFile.c:354
+msgid ""
+"The character_set definition controls the representation of 8 bit\n"
+"characters for your terminal. If 8 bit characters do not show up\n"
+"correctly on your screen you may try changing to a different 8 bit\n"
+"set or using the 7 bit character approximations.\n"
+"Current valid characters sets are:\n"
+msgstr ""
+"La definició de character_set (joc de caràcters) controla la\n"
+"representació de caràcters de 8 bits en el vostre terminal. Si no hi\n"
+"apareixen correctament proveu de canviar-ne a un altre\n"
+
+#: src/LYrcFile.c:361
+msgid ""
+"cookie_accept_domains and cookie_reject_domains are comma-delimited\n"
+"lists of domains from which Lynx should automatically accept or reject\n"
+"all cookies. If a domain is specified in both options, rejection will\n"
+"take precedence. The accept_all_cookies parameter will override any\n"
+"settings made here.\n"
+msgstr ""
+"cookie_accept_domains i cookie_reject_domains són llistes de dominis\n"
+"delimitats per comues dels quals Lynx acceptarà o rebutjarà (respectivament)\n"
+"totes les cookies. Si s'especifica un domini en totes dues llistes\n"
+
+#: src/LYrcFile.c:369
+msgid ""
+"cookie_file specifies the file from which to read persistent cookies.\n"
+"The default is ~/"
+msgstr ""
+"cookie_file especifica el fitxer del qual es llegeixen les cookies\n"
+"persistents. Per omissió és ~/"
+
+#: src/LYrcFile.c:374
+msgid ""
+"cookie_loose_invalid_domains, cookie_strict_invalid_domains, and\n"
+"cookie_query_invalid_domains are comma-delimited lists of which domains\n"
+"should be subjected to varying degrees of validity checking. If a\n"
+"domain is set to strict checking, strict conformance to RFC2109 will\n"
+"be applied. A domain with loose checking will be allowed to set cookies\n"
+"with an invalid path or domain attribute. All domains will default to\n"
+"querying the user for an invalid path or domain.\n"
+msgstr ""
+"cookie_loose_invalid_domains, cookie_strict_invalid_domains i \n"
+"cookie_query_invalid_domains són llistes separades per comes els\n"
+"dominis de les quals se sotmeten a diversos graus de comprovació\n"
+"de validesa. Si un domini \n"
+
+#: src/LYrcFile.c:388
+msgid ""
+"dir_list_order specifies the directory list order under DIRED_SUPPORT\n"
+"(if implemented). The default is \"ORDER_BY_NAME\"\n"
+msgstr ""
+"dir_list_order^indica^l'ordre^en^què^s'ha^de^llistar^el^directori^sota\n"
+"DIRED_SUPPORT (si està disponible). Per omissió és \"ORDER_BY_NAME\".\n"
+
+#: src/LYrcFile.c:393
+msgid ""
+"dir_list_styles specifies the directory list style under DIRED_SUPPORT\n"
+"(if implemented). The default is \"MIXED_STYLE\", which sorts both\n"
+"files and directories together. \"FILES_FIRST\" lists files first and\n"
+"\"DIRECTORIES_FIRST\" lists directories first.\n"
+msgstr ""
+"dir_list_styles^indica^com^s'ha^de^mostrar^el^directori^sota^DIRED_SUPPORT\n"
+"(si^està^disponible).^Per^omissió^és^\"MIXED_STYLE\",^que^ordena^els^fitxers\n"
+"i^els^directoris^indistintament.^\"FILES_FIRST\"^llista^primer^els^fitxers^i\n"
+"\"DIRECTORIES_FIRST\" llista primer els directoris.\n"
+
+#: src/LYrcFile.c:401
+msgid ""
+"If emacs_keys is to \"on\" then the normal EMACS movement keys:\n"
+" ^N = down ^P = up\n"
+" ^B = left ^F = right\n"
+"will be enabled.\n"
+msgstr ""
+"Si emacs_keys té el valor \"on\", les tecles de moviment seran les\n"
+"habituals a l'EMACS:\n"
+" ^N = avall ^P = amunt\n"
+" ^B = esquerra ^F = dreta\n"
+
+#: src/LYrcFile.c:407
+msgid ""
+"file_editor specifies the editor to be invoked when editing local files\n"
+"or sending mail. If no editor is specified, then file editing is disabled\n"
+"unless it is activated from the command line, and the built-in line editor\n"
+"will be used for sending mail.\n"
+msgstr ""
+"file_editor indica quin editor s'usarà per a editar fitxers locals o per a\n"
+"enviar correu. Si no se n'especifica cap l'edició de fitxers quedarà\n"
+"desactivada (tret que s'active des de la línia d'ordres) i s'usarà l'editor\n"
+
+#: src/LYrcFile.c:414
+msgid ""
+"The file_sorting_method specifies which value to sort on when viewing\n"
+"file lists such as FTP directories. The options are:\n"
+" BY_FILENAME -- sorts on the name of the file\n"
+" BY_TYPE -- sorts on the type of the file\n"
+" BY_SIZE -- sorts on the size of the file\n"
+" BY_DATE -- sorts on the date of the file\n"
+msgstr ""
+"file_sorting_method^indica^com^s'ha^de^realitzar^l'ordenació^quan^es\n"
+"visualitzen^llistes^de^fitxers^com^ara^directoris^FTP.^Les^opcions^són:\n"
+"^^^BY_FILENAME\n"
+
+#: src/LYrcFile.c:437
+msgid ""
+"lineedit_mode specifies the key binding used for inputting strings in\n"
+"prompts and forms. If lineedit_mode is set to \"Default Binding\" then\n"
+"the following control characters are used for moving and deleting:\n"
+"\n"
+" Prev Next Enter = Accept input\n"
+" Move char: <- -> ^G = Cancel input\n"
+" Move word: ^P ^N ^U = Erase line\n"
+" Delete char: ^H ^R ^A = Beginning of line\n"
+" Delete word: ^B ^F ^E = End of line\n"
+"\n"
+"Current lineedit modes are:\n"
+msgstr "lineedit_mode especifica \n"
+
+#: src/LYrcFile.c:455
+msgid ""
+"The following allow you to define sub-bookmark files and descriptions.\n"
+"The format is multi_bookmark<capital_letter>=<filename>,<description>\n"
+"Up to 26 bookmark files (for the English capital letters) are allowed.\n"
+"We start with \"multi_bookmarkB\" since 'A' is the default (see above).\n"
+msgstr ""
+"El que segueix us permet definir fitxers de submarcadors i descripcions.\n"
+"El format és multi_bookmark<majúscula>=<fitxer>,<descripció>\n"
+"Es permeten fins a 26 fitxers de marcadors (per a les majúscules de l'anglès).\n"
+"Comencem amb «multi_bookmarkB» atès que «A» és el valor predeterminat (vegeu a dalt).\n"
+
+#: src/LYrcFile.c:461
+msgid ""
+"personal_mail_address specifies your personal mail address. The\n"
+"address will be sent during HTTP file transfers for authorization and\n"
+"logging purposes, and for mailed comments.\n"
+"If you do not want this information given out, set the NO_FROM_HEADER\n"
+"to TRUE in lynx.cfg, or use the -nofrom command line switch. You also\n"
+"could leave this field blank, but then you won't have it included in\n"
+"your mailed comments.\n"
+msgstr ""
+"personal_mail_address especifica la vostra adreça de correu. L'adreça\n"
+"s'enviarà durant les transferències de fitxers HTTP per autoritzación i \n"
+"registre, i per a comentaris enviats per correu electrònic.\n"
+"Si no voleu que es doni aquesta informació, establiur NO_FROM_HEADER a \n"
+"TRUE a lynx.cfg, o useu l'opció -nofrom a la línia d'ordres. També podríeu\n"
+"deixar aquest camp en blanc, però aleshores no el tindreu inclòs als vostres\n"
+"comentaris enviats per correu electrònic.\n"
+
+#: src/LYrcFile.c:470
+msgid ""
+"personal_mail_name specifies your personal name, for mail. The\n"
+"name is sent for mailed comments. Lynx will prompt for this,\n"
+"showing the configured value as a default when sending mail.\n"
+"This is not necessarily the same as a name provided as part of the\n"
+"personal_mail_address.\n"
+"Lynx does not save your changes to that default value as a side-effect\n"
+"of sending email. To update the default value, you must use the options\n"
+"menu, or modify this file directly.\n"
+msgstr ""
+"personal_mail_name especifica el vostre nom personal. El nom s'envia\n"
+"per als comentaris enviats per correu electrònic. El Lynx us demanarà\n"
+"això, mostrant el valor configurat com a predeterminat quan s'estigui \n"
+"enviant el correu. Això no és necessàriament el mateix que un nom\n"
+"proveït com a part de personal_mail_adress.\n"
+"El Lynx no desa els vostres canvis a aquest valor predeterminat com un \n"
+"efecte secundari d'enviar correu. Per actualitzar el valor predeterminat,\n"
+"heu d'usar el menú d'opcions, o modificar aquest fitxer directament.\n"
+
+#: src/LYrcFile.c:480
+msgid ""
+"preferred_charset specifies the character set in MIME notation (e.g.,\n"
+"ISO-8859-2, ISO-8859-5) which Lynx will indicate you prefer in requests\n"
+"to http servers using an Accept-Charset header. The value should NOT\n"
+"include ISO-8859-1 or US-ASCII, since those values are always assumed\n"
+"by default. May be a comma-separated list.\n"
+"If a file in that character set is available, the server will send it.\n"
+"If no Accept-Charset header is present, the default is that any\n"
+"character set is acceptable. If an Accept-Charset header is present,\n"
+"and if the server cannot send a response which is acceptable\n"
+"according to the Accept-Charset header, then the server SHOULD send\n"
+"an error response, though the sending of an unacceptable response\n"
+"is also allowed.\n"
+msgstr ""
+"preferred_charset especifica el joc de caràcters en notació MIME\n"
+"(p. ex.: ISO-8859-2) que Lynx indicarà que preferiu quan faça\n"
+"sol·licituds a servidors que usen la capçalera Accept-Charset. El\n"
+"valor NO ha de ser ni ISO-8859-1 ni US-ASCII atés que aquests són\n"
+"els valors per omissió. Podeu posar-hi una llista separada per comes.\n"
+"Si hi ha cap fitxer amb el joc de caràcters triat, el servidor l'envia.\n"
+"Si la capçalera Accept-Charset no està present, es considera que \n"
+"qualsevol joc de car\n"
+
+#: src/LYrcFile.c:496
+msgid ""
+"preferred_language specifies the language in MIME notation (e.g., en,\n"
+"fr, may be a comma-separated list in decreasing preference)\n"
+"which Lynx will indicate you prefer in requests to http servers.\n"
+"If a file in that language is available, the server will send it.\n"
+"Otherwise, the server will send the file in its default language.\n"
+msgstr ""
+"preferred_language especifica l'idioma en notació MIME (p. ex.: ca,\n"
+"en; pot ser una llista separada per comes per ordre de preferència)\n"
+"que el programa indicarà com a preferit en les sol·licituds als \n"
+"servidors. Si està disponible el servidor l'usarà; si no, usarà\n"
+"l'idioma que tinga establert per omissió.\n"
+
+#: src/LYrcFile.c:507
+msgid ""
+"If run_all_execution_links is set \"on\" then all local execution links\n"
+"will be executed when they are selected.\n"
+"\n"
+"WARNING - This is potentially VERY dangerous. Since you may view\n"
+" information that is written by unknown and untrusted sources\n"
+" there exists the possibility that Trojan horse links could be\n"
+" written. Trojan horse links could be written to erase files\n"
+" or compromise security. This should only be set to \"on\" if\n"
+" you are viewing trusted source information.\n"
+msgstr ""
+"Si run_all_execution_links està activat els enllaços d'execució \n"
+"s'executen \n"
+
+#: src/LYrcFile.c:518
+msgid ""
+"If run_execution_links_on_local_files is set \"on\" then all local\n"
+"execution links that are found in LOCAL files will be executed when they\n"
+"are selected. This is different from run_all_execution_links in that\n"
+"only files that reside on the local system will have execution link\n"
+"permissions.\n"
+"\n"
+"WARNING - This is potentially dangerous. Since you may view\n"
+" information that is written by unknown and untrusted sources\n"
+" there exists the possibility that Trojan horse links could be\n"
+" written. Trojan horse links could be written to erase files\n"
+" or compromise security. This should only be set to \"on\" if\n"
+" you are viewing trusted source information.\n"
+msgstr ""
+"Si run_all_execution_links_on_local_files està activat els enllaços\n"
+"d'execució que es troben en fitxers locals s'executen quan se\n"
+"seleccionen. Aquesta opció és diferent de run_all_execution_links\n"
+"en el fet que només es poden executar fitxers que es troben en \n"
+"l'ordinador local que tinguen permisos d'execució.\n"
+"\n"
+"ALERTA: Açò pot ser perillós. Atés que es possible veure\n"
+" informació escrita per fonts desconegudes, existeix la\n"
+" possibilitat de crear enllaços troians. Els enllaços\n"
+" troians poden esborrar fitxers o comprometre la seguretat\n"
+" del sistema. Aquesta opció només hauria d'activar-se si\n"
+" veieu informació de confiança.\n"
+
+#: src/LYrcFile.c:536
+msgid ""
+"select_popups specifies whether the OPTIONs in a SELECT block which\n"
+"lacks a MULTIPLE attribute are presented as a vertical list of radio\n"
+"buttons or via a popup menu. Note that if the MULTIPLE attribute is\n"
+"present in the SELECT start tag, Lynx always will create a vertical list\n"
+"of checkboxes for the OPTIONs. A value of \"on\" will set popup menus\n"
+"as the default while a value of \"off\" will set use of radio boxes.\n"
+"The default can be overridden via the -popup command line toggle.\n"
+msgstr ""
+"select_popups especifica si les línies OPTION a un block SELECT al qual \n"
+"li falta un atribut MULTIPLE es presenten com a una llista vertical de \n"
+"botons opcions o com a un menú emergent. Noteu que si l'atribut MULTIPLE\n"
+"és present a una etiqueta d'inici de SELECT el Lynx sempre crearà una \n"
+"llista vertical de caselles de selecció per a les línis OPTION. Un valor \n"
+"d'«activat» establirà l'ús de botons d'opcions. El valor predeterminat\n"
+"pot anul·lar-se mitjançant l'opció -popup de línia d'ordres.\n"
+
+#: src/LYrcFile.c:547
+msgid ""
+"show_color specifies how to set the color mode at startup. A value of\n"
+"\"never\" will force color mode off (treat the terminal as monochrome)\n"
+"at startup even if the terminal appears to be color capable. A value of\n"
+"\"always\" will force color mode on even if the terminal appears to be\n"
+"monochrome, if this is supported by the library used to build lynx.\n"
+"A value of \"default\" will yield the behavior of assuming\n"
+"a monochrome terminal unless color capability is inferred at startup\n"
+"based on the terminal type, or the -color command line switch is used, or\n"
+"the COLORTERM environment variable is set. The default behavior always is\n"
+"used in anonymous accounts or if the \"option_save\" restriction is set.\n"
+"The effect of the saved value can be overridden via\n"
+"the -color and -nocolor command line switches.\n"
+"The mode set at startup can be changed via the \"show color\" option in\n"
+"the 'o'ptions menu. If the option settings are saved, the \"on\" and\n"
+"\"off\" \"show color\" settings will be treated as \"default\".\n"
+msgstr ""
+"show_color especifica com establir el mode de color a l'inici. Un valor de\n"
+"«mai» forçarà la desactivació el mode de color (tracta la terminal com a \n"
+"monocrom) a l'inici tot i que la terminal sembli tenir capacitat de color.\n"
+"Un valor de «sempre» forçarà el mode de color a activat tot i que el terminal\n"
+"sembli ser monocrom, si això se suporta per la llibreria usat per compilar \n"
+"lynx. Un valor de «predeterminat» implicarà el comportament d'assumir un \n"
+"terminal monocrom a no ser que la capacitat de color s'infereixi a l'inici\n"
+"basat en el tipus de terminal, o s'usi l'opció -color de la línia d'ordres, o\n"
+"s'estableixi la variable d'entorn COLORTERM. El comportament predeterminat \n"
+"sempre s'usa a comptes anònims o si s'estableix la restricció «option_save».\n"
+"L'efecte del valor desat es pot anul·lar mitjançant les opcions -color i \n"
+"-nocolor de línia d'ordres.\n"
+"El mode establert a l'inici es pot canviar mitjançant l'opció «mostra color» \n"
+"al menú 'o'pcions. Si es desa la configuració d'opcions, els paràmetres\n"
+"«activa», «desactiva» i «mostra color» es tractaran com a «predeterminat».\n"
+
+#: src/LYrcFile.c:564
+msgid ""
+"show_cursor specifies whether to 'hide' the cursor to the right (and\n"
+"bottom, if possible) of the screen, or to place it to the left of the\n"
+"current link in documents, or current option in select popup windows.\n"
+"Positioning the cursor to the left of the current link or option is\n"
+"helpful for speech or braille interfaces, and when the terminal is\n"
+"one which does not distinguish the current link based on highlighting\n"
+"or color. A value of \"on\" will set positioning to the left as the\n"
+"default while a value of \"off\" will set 'hiding' of the cursor.\n"
+"The default can be overridden via the -show_cursor command line toggle.\n"
+msgstr ""
+"show_cursor indica si s'ha d'\"amagar\" el cursor a la dreta de la\n"
+"pantalla (i avall si és possible), o si s'ha de col·locar a l'esquerra\n"
+"de l'enllaç actual en els documents o de l'opció actual en les finestres\n"
+"de sel\n"
+
+#: src/LYrcFile.c:575
+msgid ""
+"show_dotfiles specifies that the directory listing should include\n"
+"\"hidden\" (dot) files/directories. If set \"on\", this will be\n"
+"honored only if enabled via userdefs.h and/or lynx.cfg, and not\n"
+"restricted via a command line switch. If display of hidden files\n"
+"is disabled, creation of such files via Lynx also is disabled.\n"
+msgstr "L'opció show_dotfiles indica que s'han d'incloure els \n"
+
+#: src/LYrcFile.c:586
+msgid ""
+"If sub_bookmarks is not turned \"off\", and multiple bookmarks have\n"
+"been defined (see below), then all bookmark operations will first\n"
+"prompt the user to select an active sub-bookmark file. If the default\n"
+"Lynx bookmark_file is defined (see above), it will be used as the\n"
+"default selection. When this option is set to \"advanced\", and the\n"
+"user mode is advanced, the 'v'iew bookmark command will invoke a\n"
+"statusline prompt instead of the menu seen in novice and intermediate\n"
+"user modes. When this option is set to \"standard\", the menu will be\n"
+"presented regardless of user mode.\n"
+msgstr ""
+"Si sub_bookmarks no s'estableix a «desactiva», i s'han definit marcadors\n"
+"múltiples (vegeu més avall), llavors totes les operacions de marcadors \n"
+"primer demanarà a l'usuari que seleccioni un fitxer actiu de submarcadors.\n"
+"Si es defineix el lynx_bookmark_file predeterminat (vegeu més amunt), s'usarà\n"
+"com a la selecció predeterminada. Si s'estableix aquesta opció a «avançada», \n"
+"i el mode d'usuari és avançat, l'ordre 'v'isualitza el marcador invocarà \n"
+"un diàleg a la línia d'estat en canvi al menú que es veu en modes d'usuari\n"
+"de principiant i intermedi. Quan s'estableix aquesta opció a «estàndard», el \n"
+"menú es presentarà independentment del mode d'usuari.\n"
+"\n"
+"\n"
+
+#: src/LYrcFile.c:600
+msgid ""
+"user_mode specifies the users level of knowledge with Lynx. The\n"
+"default is \"NOVICE\" which displays two extra lines of help at the\n"
+"bottom of the screen to aid the user in learning the basic Lynx\n"
+"commands. Set user_mode to \"INTERMEDIATE\" to turn off the extra info.\n"
+"Use \"ADVANCED\" to see the URL of the currently selected link at the\n"
+"bottom of the screen.\n"
+msgstr ""
+"user_mode especifica el nivell d'experiència que té l'usuari amb Lynx.\n"
+"Per omissió és \"NOVICE\"\n"
+
+#: src/LYrcFile.c:609
+msgid ""
+"If verbose_images is \"on\", lynx will print the name of the image\n"
+"source file in place of [INLINE], [LINK] or [IMAGE]\n"
+"See also VERBOSE_IMAGES in lynx.cfg\n"
+msgstr ""
+"Si el valor de verbose_images és \"on\", lynx mostrarà el nom del fitxer\n"
+"de la imatge en lloc de [INLINE], [LINK] o [IMAGE]\n"
+"Vegeu també VERBOSE_IMAGES en el fitxer lynx.cfg\n"
+
+#: src/LYrcFile.c:614
+msgid ""
+"If vi_keys is set to \"on\", then the normal VI movement keys:\n"
+" j = down k = up\n"
+" h = left l = right\n"
+"will be enabled. These keys are only lower case.\n"
+"Capital 'H', 'J' and 'K will still activate help, jump shortcuts,\n"
+"and the keymap display, respectively.\n"
+msgstr ""
+"Si vi_keys es posa a \"on\", podreu usar les tecles de moviment de VI\n"
+" j = avall k = amunt\n"
+" h = esquerra l = dreta\n"
+"Només en minúscula. L\n"
+
+#: src/LYrcFile.c:622
+msgid ""
+"The visited_links setting controls how Lynx organizes the information\n"
+"in the Visited Links Page.\n"
+msgstr ""
+"La variable visited_links controla la forma en què Lynx organitza la\n"
+"informació en la pàgina d'enllaços visitats.\n"
+
+#: src/LYrcFile.c:863
+msgid ""
+"If keypad_mode is set to \"NUMBERS_AS_ARROWS\", then the numbers on\n"
+"your keypad when the numlock is on will act as arrow keys:\n"
+" 8 = Up Arrow\n"
+" 4 = Left Arrow 6 = Right Arrow\n"
+" 2 = Down Arrow\n"
+"and the corresponding keyboard numbers will act as arrow keys,\n"
+"regardless of whether numlock is on.\n"
+msgstr "Si poseu keypad_mode \n"
+
+#: src/LYrcFile.c:872
+msgid ""
+"If keypad_mode is set to \"LINKS_ARE_NUMBERED\", then numbers will\n"
+"appear next to each link and numbers are used to select links.\n"
+msgstr ""
+"Si el valor de keypad_mode és \"LINKS_ARE_NUMBERED\" (enllaços numerats),\n"
+"aleshores apareixerà un número al costat de cada enllaç i podreu triar\n"
+"l'enllaç desitjat prement la tecla del número corresponent.\n"
+
+#: src/LYrcFile.c:876
+msgid ""
+"If keypad_mode is set to \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\", then\n"
+"numbers will appear next to each link and visible form input field.\n"
+"Numbers are used to select links, or to move the \"current link\" to a\n"
+"form input field or button. In addition, options in popup menus are\n"
+"indexed so that the user may type an option number to select an option in\n"
+"a popup menu, even if the option isn't visible on the screen. Reference\n"
+"lists and output from the list command also enumerate form inputs.\n"
+msgstr ""
+"Si s'estableix keypad_mode a «LINKS_AND_FORM_FIELDS_ARE_NUMBERED», llavors\n"
+"el apareixeran números al costat de cada enllaç i cada camp visible de \n"
+"formulari. Els números permeten seleccionar enllaços, o moure l'«enllaç \n"
+"actual» a un camp d'entrada d'un formulari o un botó. Addicionalment, les\n"
+"opcions de menús emergents s'indexen perquè l'usuari pugui escriure un número\n"
+"d'opció per seleccionar una opció a un menú emergent, tot i que l'opció no \n"
+"sigui visible a la pantalla. Les llistes de referències i la sortida de l'ordre\n"
+"de llista també enumeren les entrades dels formularis.\n"
+"\n"
+
+#: src/LYrcFile.c:885
+msgid ""
+"NOTE: Some fixed format documents may look disfigured when\n"
+"\"LINKS_ARE_NUMBERED\" or \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\" are\n"
+"enabled.\n"
+msgstr ""
+"NOTA: Alguns documents amb format fix poden aparéixer desfigurats quan\n"
+"trieu els valors \"LINKS_ARE_NUMBERED\" (enllaços numerats) o\n"
+"\"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\" (enllaços i camps de formulari\n"
+"numerats.\n"
+
+#: src/LYrcFile.c:917
+msgid ""
+"Lynx User Defaults File\n"
+"\n"
+msgstr "Fitxer dels valors predeterminats d'usuari del Lynx\n"
+
+#: src/LYrcFile.c:926
+msgid ""
+"This file contains options saved from the Lynx Options Screen (normally\n"
+"with the 'o' key). To save options with that screen, you must select the\n"
+"checkbox:\n"
+msgstr ""
+"Aquest fitxer conté opcions desades de la pantalla d'opcions del Lynx (normalment\n"
+"amb la tecla «o»). Per desar opcions amb aquesta pantalla, heu de seleccionar\n"
+"la casella de selecció:\n"
+
+#: src/LYrcFile.c:933
+msgid ""
+"You must then save the settings using the link on the line above the\n"
+"checkbox:\n"
+msgstr ""
+"Heu de desar els paràmetres usant l'enllaç a la línia a sobre de\n"
+"la casella de selecció:\n"
+
+#: src/LYrcFile.c:940
+msgid ""
+"You may also use the command-line option \"-forms_options\", which displays\n"
+"the simpler Options Menu instead. Save options with that using the '>' key.\n"
+"\n"
+msgstr ""
+"També podeu usar l'opció de línia d'ordres «-form-opctions», que mostra \n"
+"el menú més simple de Menú d'Opcions. Deseu les opcions amb això usant la tecla\n"
+"«>».\n"
+
+#: src/LYrcFile.c:947
+msgid ""
+"This file contains options saved from the Lynx Options Screen (normally\n"
+"with the '>' key).\n"
+"\n"
+msgstr ""
+"Aquest fitxer conté opcions desada de la Pantalla d'Opcions del Lynx (normalment\n"
+"amb la tecla «>»)\n"
+
+#: src/LYrcFile.c:954
+msgid ""
+"There is normally no need to edit this file manually, since the defaults\n"
+"here can be controlled from the Options Screen, and the next time options\n"
+"are saved from the Options Screen this file will be completely rewritten.\n"
+"You have been warned...\n"
+"\n"
+"If you are looking for the general configuration file - it is normally\n"
+"called \"lynx.cfg\". It has different content and a different format.\n"
+"It is not this file.\n"
+msgstr ""
+"Normalment no cal editar aquest fitxer manualment, atès que els valors per \n"
+"omissió es poden canviar des de la pantalla d'opcions i la propera vegada \n"
+"que deseu les opcions aquest fitxer serà completament reescrit. Ja ho sabeu...\n"
+"\n"
+"Si busqueu el fitxer de configuració: normalment s'anomena lynx.cfg i\n"
+"té format i contingut diferents.\n"
+"No és aquest fitxer.\n"
+
+#~ msgid "History List maximum reached! Document not pushed."
+#~ msgstr "L'historial ha assolit el màxim! Aquest document no s'hi afegirà."
+
+#~ msgid "Very long lines have been wrapped!"
+#~ msgstr "Les línies molt llargues han estat tallades!"
+
+#~ msgid "KB"
+#~ msgstr "KB"
+
+#~ msgid "reason unknown."
+#~ msgstr "per raons desconegudes."
+
+#~ msgid "Path too long"
+#~ msgstr "Camí massa llarg"
+
+#~ msgid "Source and destination are the same location - request ignored!"
+#~ msgstr "L'origen i la destinació coincideixen: sol·licitud ignorada!"
+
+#~ msgid "Remove '%s' and all of its contents?"
+#~ msgstr "Voleu eliminar \"%s\" i tot el seu contingut?"
+
+#~ msgid "Remove directory and all of its contents?"
+#~ msgstr "Voleu eliminar el directori i tot el seu contingut?"
+
+#~ msgid "create %s"
+#~ msgstr "crear %s"
+
+#~ msgid "Unable to open file management menu file."
+#~ msgstr "Ha estat impossible obrir el fitxer del menú de gestió de fitxers."
diff --git a/po/cs.po b/po/cs.po
new file mode 100644
index 0000000..85e595e
--- /dev/null
+++ b/po/cs.po
@@ -0,0 +1,6481 @@
+# Czech translation of the lynx.
+# Copyright (C) 1998 Free Software Foundation, Inc.
+# This file is distributed under the same license as the lynx package.
+# Jiří Pavlovský <pavlovsk@ff.cuni.cz>, 1998, 2000.
+# Branislav Makúch <makuch@disroot.org>, 2020.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: lynx 2.9.0-dev3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2019-08-23 19:59-0400\n"
+"PO-Revision-Date: 2020-06-15 09:32+0200\n"
+"Last-Translator: Branislav Makúch <makuch@disroot.org>\n"
+"Language-Team: Czech <translation-team-cs@lists.sourceforge.net>\n"
+"Language: cs\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+
+#. ******************************************************************
+#. * The following definitions are for status line prompts, messages, or
+#. * warnings issued by Lynx during program execution. You can modify
+#. * them to make them more appropriate for your site. We recommend that
+#. * you extend these definitions to other languages using the gettext
+#. * library. There are also scattered uses of 'gettext()' throughout the
+#. * Lynx source, covering all but those messages which (a) are used for
+#. * debugging (CTRACE) or (b) are constants used in interaction with
+#. * other programs.
+#. *
+#. * See ABOUT-NLS and po/readme for details and location of contributed
+#. * translations. When no translation is available, the English default is
+#. * used.
+#.
+#: LYMessages.c:28
+#, c-format
+msgid "Alert!: %s"
+msgstr "Pozor!: %s"
+
+#: LYMessages.c:29
+msgid "Welcome"
+msgstr "Vítejte"
+
+#: LYMessages.c:30
+msgid "Are you sure you want to quit?"
+msgstr "Opravdu chcete ukonÄit program?"
+
+#: LYMessages.c:32
+msgid "Really exit from Lynx?"
+msgstr "Opravdu chcete ukonÄit Lynx?"
+
+#: LYMessages.c:34
+msgid "Connection interrupted."
+msgstr "Spojení bylo přerušeno."
+
+#: LYMessages.c:35
+msgid "Data transfer interrupted."
+msgstr "Přenos dat byl přerušen."
+
+#: LYMessages.c:36
+msgid "Cancelled!!!"
+msgstr "Zrušeno!!!"
+
+#: LYMessages.c:37
+msgid "Cancelling!"
+msgstr "Ruším!"
+
+#: LYMessages.c:38
+msgid "Excellent!!!"
+msgstr "Výborně!!!"
+
+#: LYMessages.c:39
+msgid "OK"
+msgstr "OK"
+
+#: LYMessages.c:40
+msgid "Done!"
+msgstr "Hotovo!"
+
+#: LYMessages.c:41
+msgid "Bad request!"
+msgstr "Chybný požadavek!"
+
+#: LYMessages.c:42
+msgid "previous"
+msgstr "předchozí"
+
+#: LYMessages.c:43
+msgid "next screen"
+msgstr "následující obrazovka"
+
+#: LYMessages.c:44
+msgid "HELP!"
+msgstr "NÃPOVÄšDA!"
+
+#: LYMessages.c:45
+msgid ", help on "
+msgstr ", nápověda pro "
+
+#. #define HELP
+#: LYMessages.c:47
+msgid "Commands: Use arrow keys to move, '?' for help, 'q' to quit, '<-' to go back."
+msgstr "Příkazy: Použijte Å¡ipky propohyb, '?' pro nápovÄ›du, 'q' pro ukonÄení, '<-' pro návrat zpÄ›t."
+
+#. #define MOREHELP
+#: LYMessages.c:49
+msgid "-- press space for more, use arrow keys to move, '?' for help, 'q' to quit."
+msgstr "-- zmáÄknÄ›te mezerník pro další stranu, Å¡ipky pro pohyb, '?' pro nápovÄ›du. 'q' pro ukonÄení."
+
+#: LYMessages.c:50
+msgid "-- press space for next page --"
+msgstr "-- pro další stranu zmáÄknÄ›te mezerník --"
+
+#: LYMessages.c:51
+msgid "URL too long"
+msgstr "URL je příliš dlouhé"
+
+#. Inactive input fields, messages used with -tna option - kw
+#. #define FORM_LINK_TEXT_ADV_MSG_INA
+#: LYMessages.c:57
+#, c-format
+msgid "(Textfield \"%s\"); Inactive. Press <return> to activate."
+msgstr "(Textové pole \"%s\"); Vypnuto. Zapnutí pomocí <return>."
+
+#. #define FORM_LINK_TEXT_MESSAGE_INA
+#: LYMessages.c:59
+msgid "(Text entry field) Inactive. Press <return> to activate."
+msgstr "(Pole pro textový vstup) Vypnuto. Zapnutí pomocí <return>."
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG_INA
+#: LYMessages.c:61
+#, c-format
+msgid "(Textarea \"%s\"); Inactive. Press <return> to activate."
+msgstr "(Textová oblast \"%s\"); Vypnuto. Zapnutí pomocí <return>."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_INA
+#: LYMessages.c:63
+msgid "(Textarea) Inactive. Press <return> to activate."
+msgstr "(Textová oblast) Vypnuto. Zapnutí pomocí <return>."
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG_INA_E
+#: LYMessages.c:65
+#, c-format
+msgid "(Textarea \"%s\"); Inactive. Press <return> to activate (%s for editor)."
+msgstr "(Textová oblast \"%s\"); Vypnuto. Zapnutí pomocí <return> (%s pro editor)."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_INA_E
+#: LYMessages.c:67
+#, c-format
+msgid "(Textarea) Inactive. Press <return> to activate (%s for editor)."
+msgstr "(Textová oblast) Vypnuto. Zapnutí pomocí <return> (%s pro editor)."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE_INA
+#: LYMessages.c:69
+msgid "(Form field) Inactive. Use <return> to edit."
+msgstr "(Pole formuláře) Vypnuto. <return> pro editaci."
+
+#. #define FORM_TEXT_SUBMIT_MESSAGE_INA_X
+#: LYMessages.c:71
+#, c-format
+msgid "(Form field) Inactive. Use <return> to edit (%s to submit with no cache)."
+msgstr "(Pole formuláře) Vypnuto. <return> pro editaci (%s pro 'NO CACHE')."
+
+#. #define FORM_TEXT_RESUBMIT_MESSAGE_INA
+#: LYMessages.c:73
+msgid "(Form field) Inactive. Press <return> to edit, press <return> twice to submit."
+msgstr "(Pole formuláře) Vypnuto. <return> pro editaci, 2x <return> pro odeslání."
+
+#. #define FORM_TEXT_SUBMIT_MAILTO_MSG_INA
+#: LYMessages.c:75
+msgid "(mailto form field) Inactive. Press <return> to change."
+msgstr "('mailto' pole formuláře) Vypnuto. <return> pro změnu."
+
+#. #define FORM_LINK_PASSWORD_MESSAGE_INA
+#: LYMessages.c:77
+msgid "(Password entry field) Inactive. Press <return> to activate."
+msgstr "(Pole pro zadání hesla) Vypnuto. Zapnutí pomocí <return>."
+
+#. #define FORM_LINK_FILE_UNM_MSG
+#: LYMessages.c:80
+msgid "UNMODIFIABLE file entry field. Use UP or DOWN arrows or tab to move off."
+msgstr "NEMODIFIKOVATELNÉ pole pro výbÄ›r souboru. NAHORU/DOLÅ® Äi tab pro odchod."
+
+#. #define FORM_LINK_FILE_MESSAGE
+#: LYMessages.c:82
+msgid "(File entry field) Enter filename. Use UP or DOWN arrows or tab to move off."
+msgstr "(Pole pro výbÄ›r souboru) Vyberte soubor. NAHORU/DOLÅ® Äi tab pro odchod."
+
+#. #define FORM_LINK_TEXT_ADV_MSG
+#. #define FORM_LINK_TEXT_MESSAGE
+#: LYMessages.c:84 LYMessages.c:86
+#, c-format
+msgid "(Textfield \"%s\"); Enter text. Use UP or DOWN arrows or tab to move off."
+msgstr "(Textové pole \"%s\"); Zadejte text. NAHORU/DOLÅ® Äi TAB pro odchod."
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG
+#: LYMessages.c:88
+#, c-format
+msgid "(Textarea \"%s\"); Enter text. Use UP/DOWN arrows or TAB to move off."
+msgstr "(Textová oblast \"%s\"); Zadejte text. NAHORU/DOLÅ® Äi TAB pro odchod."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE
+#: LYMessages.c:90
+msgid "(Textarea) Enter text. Use UP/DOWN arrows or TAB to move off."
+msgstr "(Textová oblast) Zadejte text. NAHORU/DOLÅ® Äi TAB pro odchod."
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG_E
+#: LYMessages.c:92
+#, c-format
+msgid "(Textarea \"%s\"); Enter text. Use UP/DOWN arrows or TAB to move off (%s for editor)."
+msgstr "(Textová oblast \"%s\"); Zadejte text. NAHORU/DOLÅ® Äi TAB pro odchod (%s pro editor)."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_E
+#: LYMessages.c:94
+#, c-format
+msgid "(Textarea) Enter text. Use UP/DOWN arrows or TAB to move off (%s for editor)."
+msgstr "(Textová oblast) Zadejte text. NAHORU/DOLÅ® Äi TAB pro odchod (%s pro editor)."
+
+#. #define FORM_LINK_TEXT_UNM_MSG
+#: LYMessages.c:96
+msgid "UNMODIFIABLE form text field. Use UP or DOWN arrows or tab to move off."
+msgstr "NEMODIFIKOVATELNÉ textové pole formuláře. NAHORU/DOLÅ® Äi tab pro odchod."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE
+#: LYMessages.c:98
+msgid "(Form field) Enter text. Use <return> to submit."
+msgstr "(Pole formuláře) Zadejte text. <return> pro odeslání."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE_X
+#: LYMessages.c:100
+#, c-format
+msgid "(Form field) Enter text. Use <return> to submit (%s for no cache)."
+msgstr "(Pole formuláře) Zadejte text. <return> odešle (%s pro 'NO CACHE')."
+
+#. #define FORM_LINK_TEXT_RESUBMIT_MESSAGE
+#: LYMessages.c:102
+msgid "(Form field) Enter text. Use <return> to submit, arrows or tab to move off."
+msgstr "(Pole formuláře) Zadejte text. <return> odeÅ¡le, Å¡ipky Äi TAB pro odchod."
+
+#. #define FORM_LINK_TEXT_SUBMIT_UNM_MSG
+#: LYMessages.c:104
+msgid "UNMODIFIABLE form field. Use UP or DOWN arrows or tab to move off."
+msgstr "NEMODIFIKOVATELNÉ pole formuláře. NAHORU/DOLÅ® Äi TAB pro odchod."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MAILTO_MSG
+#: LYMessages.c:106
+msgid "(mailto form field) Enter text. Use <return> to submit, arrows to move off."
+msgstr "('mailto' pole formuláře) Zadejte text. <return> odešle, šipky pro odchod."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MAILTO_DIS_MSG
+#: LYMessages.c:108
+msgid "(mailto form field) Mail is disallowed so you cannot submit."
+msgstr "('mailto' pole formuláře) Pošta je vypnuta, tudíž nemůžete nic poslat."
+
+#. #define FORM_LINK_PASSWORD_MESSAGE
+#: LYMessages.c:110
+msgid "(Password entry field) Enter text. Use UP or DOWN arrows or tab to move off."
+msgstr "(Pole pro zadání hesla) Zadejte text. NAHORU/DOLÅ® Äi tab pro odchod."
+
+#. #define FORM_LINK_PASSWORD_UNM_MSG
+#: LYMessages.c:112
+msgid "UNMODIFIABLE form password. Use UP or DOWN arrows or tab to move off."
+msgstr "NEMODIFIKOVATELNÉ heslo formuláře. NAHORU/DOLÅ® Äi tab pro odchod."
+
+#. #define FORM_LINK_CHECKBOX_ADV_MSG
+#: LYMessages.c:114
+#, c-format
+msgid "(Checkbox \"%s\"); Use right-arrow or <return> to toggle."
+msgstr "(ZaÅ¡krtávací pole \"%s\"); Å ipka vpravo Äi <return> pro pÅ™epnutí."
+
+#. #define FORM_LINK_CHECKBOX_MESSAGE
+#: LYMessages.c:116
+msgid "(Checkbox Field) Use right-arrow or <return> to toggle."
+msgstr "(ZaÅ¡krtávací pole). Å ipka vpravo Äi <return> pro pÅ™epnutí."
+
+#. #define FORM_LINK_CHECKBOX_UNM_MSG
+#: LYMessages.c:118
+msgid "UNMODIFIABLE form checkbox. Use UP or DOWN arrows or tab to move off."
+msgstr "NEMODIFIKOVATELNÉ zaÅ¡krtávací pole formuláře. NAHORU/DOLÅ® Äi tab pro odchod."
+
+#. #define FORM_LINK_RADIO_ADV_MSG
+#: LYMessages.c:120
+#, c-format
+msgid "(Radio Button \"%s\"); Use right-arrow or <return> to toggle."
+msgstr "(PÅ™epínací tlaÄítko \"%s\"); Å ipka vpravo Äi <return> pro pÅ™epnutí."
+
+#. #define FORM_LINK_RADIO_MESSAGE
+#: LYMessages.c:122
+msgid "(Radio Button) Use right-arrow or <return> to toggle."
+msgstr "(PÅ™epínací tlaÄítko) Å ipka vpravo Äi <return> pro pÅ™epnutí."
+
+#. #define FORM_LINK_RADIO_UNM_MSG
+#: LYMessages.c:124
+msgid "UNMODIFIABLE form radio button. Use UP or DOWN arrows or tab to move off."
+msgstr "NEMODIFIKOVATELNÉ pÅ™epínací tlaÄítko formuláře. NAHORU/DOLÅ® Äi tab pro odchod."
+
+#. #define FORM_LINK_SUBMIT_PREFIX
+#: LYMessages.c:126
+msgid "Submit ('x' for no cache) to "
+msgstr "Odeslat ('x' pro 'NO CACHE') na "
+
+#. #define FORM_LINK_RESUBMIT_PREFIX
+#: LYMessages.c:128
+msgid "Submit to "
+msgstr "Odeslat na "
+
+#. #define FORM_LINK_SUBMIT_MESSAGE
+#: LYMessages.c:130
+msgid "(Form submit button) Use right-arrow or <return> to submit ('x' for no cache)."
+msgstr "(TlaÄítko pro odeslání formuláře) Å ipka vpravo Äi <return> pro odeslání (x pro 'NO CACHE')"
+
+#. #define FORM_LINK_RESUBMIT_MESSAGE
+#: LYMessages.c:132
+msgid "(Form submit button) Use right-arrow or <return> to submit."
+msgstr "(TlaÄítko pro odeslání formuláře) Å ipka vpravo Äi <return> pro odeslání."
+
+#. #define FORM_LINK_SUBMIT_DIS_MSG
+#: LYMessages.c:134
+msgid "DISABLED form submit button. Use UP or DOWN arrows or tab to move off."
+msgstr "(VYPNUTÉ tlaÄítko pro odeslání formuláře). NAHORU/DOLÅ® Äi tab pro odchod."
+
+#. #define FORM_LINK_SUBMIT_MAILTO_PREFIX
+#: LYMessages.c:136
+msgid "Submit mailto form to "
+msgstr "Odeslat 'mailto' formulář na "
+
+#. #define FORM_LINK_SUBMIT_MAILTO_MSG
+#: LYMessages.c:138
+msgid "(mailto form submit button) Use right-arrow or <return> to submit."
+msgstr "('mailto' tlaÄítko pro odeslání formuláře) Å ipka vpravo Äi <return> pro odeslání."
+
+#. #define FORM_LINK_SUBMIT_MAILTO_DIS_MSG
+#: LYMessages.c:140
+msgid "(mailto form submit button) Mail is disallowed so you cannot submit."
+msgstr "('mailto' tlaÄítko pro odeslání formuláře) PoÅ¡ta je zakázána, tudíž nemůžete nic odeslat."
+
+#. #define FORM_LINK_RESET_MESSAGE
+#: LYMessages.c:142
+msgid "(Form reset button) Use right-arrow or <return> to reset form to defaults."
+msgstr "(TlaÄítko pro smazání formuláře) Å ipka vpravo Äi <return> pro smazání vložených údajů."
+
+#. #define FORM_LINK_RESET_DIS_MSG
+#: LYMessages.c:144
+msgid "DISABLED form reset button. Use UP or DOWN arrows or tab to move off."
+msgstr "(VYPNUTÉ tlaÄítko pro smazání). NAHORU/DOLÅ® Äi tab pro odchod."
+
+#. #define FORM_LINK_BUTTON_MESSAGE
+#: LYMessages.c:146
+msgid "(Script button) Use UP or DOWN arrows or tab to move off."
+msgstr "(TlaÄítko skriptu) NAHORU/DOLÅ® Äi tab pro odchod."
+
+#. #define FORM_LINK_BUTTON_ADV_MSG
+#: LYMessages.c:148
+#, c-format
+msgid "(Script button \"%s\"); Use UP or DOWN arrows or tab to move off."
+msgstr "(TlaÄítko skriptu \"%s\"); NAHORU/DOLÅ® Äi tab pro odchod."
+
+#. #define FORM_LINK_BUTTON_DIS_MSG
+#: LYMessages.c:150
+msgid "DISABLED Script button. Use UP or DOWN arrows or tab to move off."
+msgstr "VYPNUTÉ tlaÄítko skriptu. NAHORU/DOLÅ® Äi tab pro odchod."
+
+#. #define FORM_LINK_OPTION_LIST_ADV_MSG
+#: LYMessages.c:152
+#, c-format
+msgid "(Option list \"%s\"); Hit return to select option."
+msgstr "(Seznam voleb \"%s\"); ZmáÄknÄ›te return pro výbÄ›r volby."
+
+#. #define FORM_LINK_OPTION_LIST_MESSAGE
+#: LYMessages.c:154
+msgid "(Option list) Hit return and use arrow keys and return to select option."
+msgstr "(Seznam voleb) ZmáÄknÄ›te return, Å¡ipkami vyberte volbu a return pro potvrzení."
+
+#. #define CHOICE_LIST_ADV_MSG
+#: LYMessages.c:156
+#, c-format
+msgid "(Choice entry \"%s\"); Use arrow keys and return to select option."
+msgstr "(Výběr možnosti \"%s\"); Použijte šipky a return pro zvolení."
+
+#. #define CHOICE_LIST_MESSAGE
+#: LYMessages.c:158
+msgid "(Choice list) Hit return and use arrow keys and return to select option."
+msgstr "(Nabídka možností) ZmáÄknÄ›te return, Å¡ipkami vyberte možnost a return pro zvolení."
+
+#. #define MOUSE_CHOICE_MESSAGE
+#: LYMessages.c:160
+msgid "Left mouse button or return to select, arrow keys to scroll."
+msgstr "Levé tlaÄítko myÅ¡i Äi return pro vybrání, Å¡ipky pro posun."
+
+#. #define FORM_LINK_OPTION_LIST_UNM_MSG
+#: LYMessages.c:162
+msgid "UNMODIFIABLE option list. Use return or arrow keys to review or leave."
+msgstr "NEMODIFIKOVATELNà seznam voleb. ZmáÄknÄ›te return Äi Å¡ipky pro prohlížení Äi odchod"
+
+#. #define CHOICE_LIST_UNM_MSG
+#: LYMessages.c:164
+msgid "UNMODIFIABLE choice list. Use return or arrow keys to review or leave."
+msgstr "NEMODIFIKOVATELNà nabídka možností. ZmáÄknÄ›te return Äi Å¡ipky pro prohlížení Äi odchod."
+
+#: LYMessages.c:165
+msgid "Submitting form..."
+msgstr "Odesílám formulář..."
+
+#: LYMessages.c:166
+msgid "Resetting form..."
+msgstr "Mažu obsah formuláře..."
+
+#. #define RELOADING_FORM
+#: LYMessages.c:168
+msgid "Reloading document. Any form entries will be lost!"
+msgstr "Znovu nahrávám dokument. Všechny údaje zapsané do formulářů budou ztraceny!"
+
+#. #define LINK_NOT_IN_FORM
+#: LYMessages.c:170
+msgid "The current link is not in a FORM"
+msgstr "Tento odkaz není FORM"
+
+#: LYMessages.c:171
+#, c-format
+msgid "Warning: Cannot transcode form data to charset %s!"
+msgstr "Varování: Data formuláře nelze převést do znakové sady %s!"
+
+#. #define NORMAL_LINK_MESSAGE
+#: LYMessages.c:174
+msgid "(NORMAL LINK) Use right-arrow or <return> to activate."
+msgstr "(BĚŽNà ODKAZ) Použijte Å¡ipku vpravo Äi <return> pro aktivaci."
+
+#: LYMessages.c:175
+msgid "The resource requested is not available at this time."
+msgstr "Požadovaný zdroj není v tuto chvíli přístupný."
+
+#: LYMessages.c:176
+msgid "Enter Lynx keystroke command: "
+msgstr "Stiskněte příkazovou klávesu Lynxu: "
+
+#: LYMessages.c:177
+msgid "Looking up "
+msgstr "Vyhledávám "
+
+#: LYMessages.c:178
+#, c-format
+msgid "Getting %s"
+msgstr "Získávám %s"
+
+#: LYMessages.c:179
+#, c-format
+msgid "Skipping %s"
+msgstr "Přeskakuji %s"
+
+#: LYMessages.c:180
+#, c-format
+msgid "Using %s"
+msgstr "Používám %s"
+
+#: LYMessages.c:181
+#, c-format
+msgid "Illegal URL: %s"
+msgstr "Chybné URL %s"
+
+#: LYMessages.c:182
+#, c-format
+msgid "Badly formed address %s"
+msgstr "Adresa %s je chybně utvořená"
+
+#: LYMessages.c:183
+#, c-format
+msgid "URL: %s"
+msgstr "URL: %s"
+
+#: LYMessages.c:184
+msgid "Unable to access WWW file!!!"
+msgstr "Přístup k WWW souboru nelze získat!!!"
+
+#: LYMessages.c:185
+#, c-format
+msgid "This is a searchable index. Use %s to search."
+msgstr "Toto je prohledávatelný rejstřík. Použijte %s pro hledání."
+
+#. #define WWW_INDEX_MORE_MESSAGE
+#: LYMessages.c:187
+#, c-format
+msgid "--More-- This is a searchable index. Use %s to search."
+msgstr "--Více-- Toto je prohledávatelný rejstřík. Použijte %s pro hledání."
+
+#: LYMessages.c:188
+msgid "You have entered an invalid link number."
+msgstr "Zadané Äíslo odkazu je chybné."
+
+#. #define SOURCE_HELP
+#: LYMessages.c:190
+msgid "Currently viewing document source. Press '\\' to return to rendered version."
+msgstr "Zobrazuji zdrojový kód. Stiskněte '\\' pro návrat k interpretované verzi."
+
+#. #define NOVICE_LINE_ONE
+#: LYMessages.c:192
+msgid " Arrow keys: Up and Down to move. Right to follow a link; Left to go back. \n"
+msgstr " Šipky: Nahoru/Dolů pro pohyb. Vpravo následuje odkaz; Vlevo se vrátí zpět. \n"
+
+#. #define NOVICE_LINE_TWO
+#: LYMessages.c:194
+msgid " H)elp O)ptions P)rint G)o M)ain screen Q)uit /=search [delete]=history list \n"
+msgstr " H)Nápověda O)Volby P)Tisk G)Jdi M)Hlavní obrazovka Q)Konec /=hledej [delete]=historie \n"
+
+#. #define NOVICE_LINE_TWO_A
+#: LYMessages.c:196
+msgid " O)ther cmds H)elp K)eymap G)oto P)rint M)ain screen o)ptions Q)uit \n"
+msgstr " O)statní přík. H)Nápověda K)lávesová mapa G)Jdi_na P)Tisk M)Hlavní obrazovka o)volby Q)Konec \n"
+
+#. #define NOVICE_LINE_TWO_B
+#: LYMessages.c:198
+msgid " O)ther cmds B)ack E)dit D)ownload ^R)eload ^W)ipe screen search doc: / \n"
+msgstr " O)statní přík. B)Zpět E)ditovat D)Stáhnout ^R)Znovu nahrát ^W)Smazat obraz hledat v dokumentu: / \n"
+
+#. #define NOVICE_LINE_TWO_C
+#: LYMessages.c:200
+msgid "O)ther cmds C)omment History: <backspace> Bookmarks: V)iew, A)dd, R)emove \n"
+msgstr "O)Ostatní přík. C)Komentář Historie: <backspace> Záložky: V)Zobrazit, A)Nová, R)Smazat \n"
+
+#. #define FORM_NOVICELINE_ONE
+#: LYMessages.c:202
+msgid " Enter text into the field by typing on the keyboard "
+msgstr " Pomocí klávesnice vložte text do pole "
+
+#. #define FORM_NOVICELINE_TWO
+#: LYMessages.c:204
+msgid " Ctrl-U to delete all text in field, [Backspace] to delete a character "
+msgstr " Ctrl-U vymaže veškerý text v poli, [Backspace] smaže jeden znak "
+
+#. #define FORM_NOVICELINE_TWO_DELBL
+#: LYMessages.c:206
+msgid " Ctrl-U to delete text in field, [Backspace] to delete a character "
+msgstr " Ctrl-U vymaže text v poli, [Backspace] smaže jeden znak "
+
+#. #define FORM_NOVICELINE_TWO_VAR
+#: LYMessages.c:208
+#, c-format
+msgid " %s to delete all text in field, [Backspace] to delete a character "
+msgstr " %s vymaže veškerý text v poli, [Backspace] smaže jeden znak "
+
+#. #define FORM_NOVICELINE_TWO_DELBL_VAR
+#: LYMessages.c:210
+#, c-format
+msgid " %s to delete text in field, [Backspace] to delete a character "
+msgstr " %s vymaže text v poli, [Backspace] smaže jeden znak "
+
+#. mailto
+#: LYMessages.c:213
+msgid "Malformed mailto form submission! Cancelled!"
+msgstr "Pokus o odeslání chybného 'mailto' formuláře! Zrušeno!"
+
+#: LYMessages.c:214
+msgid "Warning! Control codes in mail address replaced by ?"
+msgstr "Varování! Řídící znaky v poštovní adrese byly nahrazeny ?"
+
+#: LYMessages.c:215
+msgid "Mail disallowed! Cannot submit."
+msgstr "Pošta je zakázána! Nelze nic poslat."
+
+#: LYMessages.c:216
+msgid "Mailto form submission failed!"
+msgstr "Odeslání 'mailto' formuláře se nezdařilo!"
+
+#: LYMessages.c:217
+msgid "Mailto form submission Cancelled!!!"
+msgstr "Odeslání 'mailto' formuláře Zrušeno!!!"
+
+#: LYMessages.c:218
+msgid "Sending form content..."
+msgstr "Posílám obsah formuláře..."
+
+#: LYMessages.c:219
+msgid "No email address is present in mailto URL!"
+msgstr "'Mailto' URL neobsahuje poštovní adresu!"
+
+#. #define MAILTO_URL_TEMPOPEN_FAILED
+#: LYMessages.c:221
+msgid "Unable to open temporary file for mailto URL!"
+msgstr "DoÄasný soubor pro 'mailto' URL nelze otevřít!"
+
+#. #define INC_ORIG_MSG_PROMPT
+#: LYMessages.c:223
+msgid "Do you wish to include the original message?"
+msgstr "Chcete zařadit text původní zprávy?"
+
+#. #define INC_PREPARSED_MSG_PROMPT
+#: LYMessages.c:225
+msgid "Do you wish to include the preparsed source?"
+msgstr "Chcete zařadit předzpracovaný zdrojový text?"
+
+#. #define SPAWNING_EDITOR_FOR_MAIL
+#: LYMessages.c:227
+msgid "Spawning your selected editor to edit mail message"
+msgstr "Spouštím vámi zvolený textový editor pro editaci zprávy"
+
+#. #define ERROR_SPAWNING_EDITOR
+#: LYMessages.c:229
+msgid "Error spawning editor, check your editor definition in the options menu"
+msgstr "Chyba pÅ™i startu editoru, zkontrolujte nastavení editoru v konfiguraÄním menu"
+
+#: LYMessages.c:230
+msgid "Send this comment?"
+msgstr "Odeslat tento komentář?"
+
+#: LYMessages.c:231
+msgid "Send this message?"
+msgstr "Odeslat tuto zprávu?"
+
+#: LYMessages.c:232
+msgid "Sending your message..."
+msgstr "Odesílám vaši zprávu..."
+
+#: LYMessages.c:233
+msgid "Sending your comment:"
+msgstr "Odesílám váš komentář:"
+
+#. textarea
+#: LYMessages.c:236
+msgid "Not in a TEXTAREA; cannot use external editor."
+msgstr "Toto není textová oblast; externí editor nelze použít."
+
+#: LYMessages.c:237
+msgid "Not in a TEXTAREA; cannot use command."
+msgstr "Toto není textová oblast; příkaz nelze použít."
+
+#: LYMessages.c:239
+msgid "file: ACTIONs are disallowed!"
+msgstr "file: AKCE jsou zakázány!"
+
+#. #define FILE_SERVED_LINKS_DISALLOWED
+#: LYMessages.c:241
+msgid "file: URLs via served links are disallowed!"
+msgstr "file: Odkazy ze vzdálených dokumentů pro lokální soubory jsou zakázány!"
+
+#: LYMessages.c:242
+msgid "Access to local files denied."
+msgstr "Přístup k místním souborům je zakázán."
+
+#: LYMessages.c:243
+msgid "file: URLs via bookmarks are disallowed!"
+msgstr "file: Používání URL pomocí záložek je zakázáno!"
+
+#. #define SPECIAL_VIA_EXTERNAL_DISALLOWED
+#: LYMessages.c:245
+msgid "This special URL is not allowed in external documents!"
+msgstr "Toto zvláštní URL není v externích dokumentech povoleno!"
+
+#: LYMessages.c:246
+msgid "Press <return> to return to Lynx."
+msgstr "Stiskněte <return> pro návrat do programu Lynx."
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:249
+msgid "Spawning DCL subprocess. Use 'logout' to return to Lynx.\n"
+msgstr "Spouštím DCL podproces. Použijte 'logout' pro návrat do programu Lynx.\n"
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:253
+msgid "Type EXIT to return to Lynx.\n"
+msgstr "Napište EXIT pro návrat do programu Lynx.\n"
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:256
+msgid "Spawning your default shell. Use 'exit' to return to Lynx.\n"
+msgstr "Spouštím implicitní shell. Použijte 'exit' pro návrat do programu Lynx.\n"
+
+#: LYMessages.c:259
+msgid "Spawning is currently disabled."
+msgstr "Spouštění je nyní vypnuto."
+
+#: LYMessages.c:260
+msgid "The 'd'ownload command is currently disabled."
+msgstr "Příkaz 'd'(stahování) je nyní vypnut."
+
+#: LYMessages.c:261
+msgid "You cannot download an input field."
+msgstr "Nemůžete stahovat vstupní pole."
+
+#: LYMessages.c:262
+msgid "Form has a mailto action! Cannot download."
+msgstr "Formulář obsahuje 'mailto' akci! Nelze stáhnout."
+
+#: LYMessages.c:263
+msgid "You cannot download a mailto: link."
+msgstr "Nemůžete stáhnout 'mailto:' odkaz."
+
+#: LYMessages.c:264
+msgid "You cannot download cookies."
+msgstr "Nemůžete stahovat cookies."
+
+#: LYMessages.c:265
+msgid "You cannot download a printing option."
+msgstr "Položku z menu voleb tisku nelze stáhnout."
+
+#: LYMessages.c:266
+msgid "You cannot download an upload option."
+msgstr "Položku z menu voleb posílání (upload) nelze stáhnout."
+
+#: LYMessages.c:267
+msgid "You cannot download an permit option."
+msgstr "Položku z menu nastavení práv souborů nelze stáhnout."
+
+#: LYMessages.c:268
+msgid "This special URL cannot be downloaded!"
+msgstr "Toto zvláštní URL nemůže být staženo!"
+
+#: LYMessages.c:269
+msgid "Nothing to download."
+msgstr "Není co stáhnout."
+
+#: LYMessages.c:270
+msgid "Trace ON!"
+msgstr "Sledování ZAPNUTO!"
+
+#: LYMessages.c:271
+msgid "Trace OFF!"
+msgstr "Sledování VYPNUTO!"
+
+#. #define CLICKABLE_IMAGES_ON
+#: LYMessages.c:273
+msgid "Links will be included for all images! Reloading..."
+msgstr "Budou zaÅ™azeny odkazy na vÅ¡echny obrázky! Znovu naÄítám..."
+
+#. #define CLICKABLE_IMAGES_OFF
+#: LYMessages.c:275
+msgid "Standard image handling restored! Reloading..."
+msgstr "Implicitní zpracování obrázků obnoveno! Znovu naÄítám..."
+
+#. #define PSEUDO_INLINE_ALTS_ON
+#: LYMessages.c:277
+msgid "Pseudo_ALTs will be inserted for inlines without ALT strings! Reloading..."
+msgstr "Zobrazuji pseudo-popisy pro vložené obrázky bez popisu! Znovu naÄítám..."
+
+#. #define PSEUDO_INLINE_ALTS_OFF
+#: LYMessages.c:279
+msgid "Inlines without an ALT string specified will be ignored! Reloading..."
+msgstr "Vložené obrázky bez popisu budou ignorovány! Znovu naÄítám..."
+
+#: LYMessages.c:280
+msgid "Raw 8-bit or CJK mode toggled OFF! Reloading..."
+msgstr "Přímý 8bitový Äi CJK režim VYPNUT! Znovu naÄítám..."
+
+#: LYMessages.c:281
+msgid "Raw 8-bit or CJK mode toggled ON! Reloading..."
+msgstr "Přímý 8bitový Äi CJK režim ZAPNUT! Znovu naÄítám..."
+
+#. #define HEAD_D_L_OR_CANCEL
+#: LYMessages.c:283
+msgid "Send HEAD request for D)ocument or L)ink, or C)ancel? (d,l,c): "
+msgstr "Poslat HEAD požadavek pro D) Dokument, L)Odkaz Äi C)ZruÅ¡it? (d,l,c): "
+
+#. #define HEAD_D_OR_CANCEL
+#: LYMessages.c:285
+msgid "Send HEAD request for D)ocument, or C)ancel? (d,c): "
+msgstr "Poslat HEAD požadavek pro D)Dokument Äi C)ZruÅ¡it? (d,c): "
+
+#: LYMessages.c:286
+msgid "Sorry, the document is not an http URL."
+msgstr "Lituji, dokument není http URL."
+
+#: LYMessages.c:287
+msgid "Sorry, the link is not an http URL."
+msgstr "Lituji, odkaz není http URL."
+
+#: LYMessages.c:288
+msgid "Sorry, the ACTION for this form is disabled."
+msgstr "Liruji, AKCE tohoto formuláře je vypnuta."
+
+#. #define FORM_ACTION_NOT_HTTP_URL
+#: LYMessages.c:290
+msgid "Sorry, the ACTION for this form is not an http URL."
+msgstr "Lituji, AKCE tohoto formuláře není http URL."
+
+#: LYMessages.c:291
+msgid "Not an http URL or form ACTION!"
+msgstr "Toto není http URL ani AKCE formuláře!"
+
+#: LYMessages.c:292
+msgid "This special URL cannot be a form ACTION!"
+msgstr "Toto zvláštní URL nemůže být AKCà formuláře!"
+
+#: LYMessages.c:293
+msgid "URL is not in starting realm!"
+msgstr "URL není ve startovní oblasti!"
+
+#: LYMessages.c:294
+msgid "News posting is disabled!"
+msgstr "Odesílání příspěvků do diskuzních skupin je zakázáno!"
+
+#: LYMessages.c:295
+msgid "File management support is disabled!"
+msgstr "Správce souborů je zakázán!"
+
+#: LYMessages.c:296
+msgid "No jump file is currently available."
+msgstr "Žádný soubor zkratek není dostupný."
+
+#: LYMessages.c:297
+msgid "Jump to (use '?' for list): "
+msgstr "SkoÄit na ('?' pro seznam): "
+
+#: LYMessages.c:298
+msgid "Jumping to a shortcut URL is disallowed!"
+msgstr "Není povoleno přeskakovat na zkrácená URL!"
+
+#: LYMessages.c:299
+msgid "Random URL is disallowed! Use a shortcut."
+msgstr "Náhodná URL jsou zakázána! Použijte zkratku."
+
+#: LYMessages.c:300
+msgid "No random URLs have been used thus far."
+msgstr "Doposud nebyla použita žádná náhodná URL."
+
+#: LYMessages.c:301
+msgid "Bookmark features are currently disabled."
+msgstr "Používání záložek je nyní zakázáno."
+
+#: LYMessages.c:302
+msgid "Execution via bookmarks is disabled."
+msgstr "Spouštění programů přes soubory záložek je zakázáno."
+
+#. #define BOOKMARK_FILE_NOT_DEFINED
+#: LYMessages.c:304
+#, c-format
+msgid "Bookmark file is not defined. Use %s to see options."
+msgstr "Soubor se záložkami není zadán. Použijte %s pro zobrazení možností."
+
+#. #define NO_TEMP_FOR_HOTLIST
+#: LYMessages.c:306
+msgid "Unable to open tempfile for X Mosaic hotlist conversion."
+msgstr "DoÄasný soubor pro konverzi X Mosaic 'hotlistu' nelze otevřít."
+
+#: LYMessages.c:307
+msgid "ERROR - unable to open bookmark file."
+msgstr "CHYBA - soubor záložek nelze otevřít."
+
+#. #define BOOKMARK_OPEN_FAILED_FOR_DEL
+#: LYMessages.c:309
+msgid "Unable to open bookmark file for deletion of link."
+msgstr "Záložku nelze smazat: soubor záložek nelze otevřít."
+
+#. #define BOOKSCRA_OPEN_FAILED_FOR_DEL
+#: LYMessages.c:311
+msgid "Unable to open scratch file for deletion of link."
+msgstr "Záložku nelze smazat: doÄasný soubor typu scratch nelze otevřít."
+
+#: LYMessages.c:313
+msgid "Error renaming scratch file."
+msgstr "Chyba pÅ™i pÅ™ejmenovávání doÄasného souboru typu scratch."
+
+#: LYMessages.c:315
+msgid "Error renaming temporary file."
+msgstr "Chyba pÅ™i pÅ™ejmenovávání doÄasného souboru."
+
+#. #define BOOKTEMP_COPY_FAIL
+#: LYMessages.c:317
+msgid "Unable to copy temporary file for deletion of link."
+msgstr "Záložku nelze smazat: doÄasný soubor nelze kopírovat."
+
+#. #define BOOKTEMP_REOPEN_FAIL_FOR_DEL
+#: LYMessages.c:319
+msgid "Unable to reopen temporary file for deletion of link."
+msgstr "Záložku nelze smazat: doÄasný soubor nelze znovu otevřít."
+
+#. #define BOOKMARK_LINK_NOT_ONE_LINE
+#: LYMessages.c:322
+msgid "Link is not by itself all on one line in bookmark file."
+msgstr "Odkaz záložky je delší než jeden řádek."
+
+#: LYMessages.c:323
+msgid "Bookmark deletion failed."
+msgstr "Odstranění záložky se nezdařilo."
+
+#. #define BOOKMARKS_NOT_TRAVERSED
+#: LYMessages.c:325
+msgid "Bookmark files cannot be traversed (only http URLs)."
+msgstr "Soubory se záložkami nelze křížit (traverse) (pouze http URL)."
+
+#. #define BOOKMARKS_NOT_OPEN
+#: LYMessages.c:327
+msgid "Unable to open bookmark file, use 'a' to save a link first"
+msgstr "Soubor se záložkami nelze otevřít, klávesou 'a' nejprve uložte odkaz"
+
+#: LYMessages.c:328
+msgid "There are no links in this bookmark file!"
+msgstr "Tento soubor záložek je prázdný!"
+
+#. #define CACHE_D_OR_CANCEL
+#: LYMessages.c:330
+msgid "D)elete cached document or C)ancel? (d,c): "
+msgstr "D)Smazat dokument ve vyrovnávací paměti, nebo C)Zrušit? (d,c): "
+
+#. #define BOOK_D_L_OR_CANCEL
+#: LYMessages.c:332
+msgid "Save D)ocument or L)ink to bookmark file or C)ancel? (d,l,c): "
+msgstr "Uložit do souboru se záložkami D)Dokument, L)Odkaz Äi C)ZruÅ¡it? (d,l,c): "
+
+#: LYMessages.c:333
+msgid "Save D)ocument to bookmark file or C)ancel? (d,c): "
+msgstr "Uložit do souboru se záložkami D)Dokument Äi C)ZruÅ¡it? (d,c): "
+
+#: LYMessages.c:334
+msgid "Save L)ink to bookmark file or C)ancel? (l,c): "
+msgstr "Uložit do souboru se záložkami L)Odkaz Äi C)ZruÅ¡it? (l,c): "
+
+#. #define NOBOOK_POST_FORM
+#: LYMessages.c:336
+msgid "Documents from forms with POST content cannot be saved as bookmarks."
+msgstr "Dokumenty z formulářů s POST obsahem nelze uložit jako záložku."
+
+#: LYMessages.c:337
+msgid "Cannot save form fields/links"
+msgstr "Formulářová pole/odkazy nelze uložit"
+
+#. #define NOBOOK_HSML
+#: LYMessages.c:339
+msgid "History, showinfo, menu and list files cannot be saved as bookmarks."
+msgstr "Soubory historie, showinfo, menu a seznamů nelze ukládat jako záložky."
+
+#. #define CONFIRM_BOOKMARK_DELETE
+#: LYMessages.c:341
+msgid "Do you really want to delete this link from your bookmark file?"
+msgstr "Opravdu chcete vymazat tento odkaz z vašeho souboru se záložkami?"
+
+#: LYMessages.c:342
+msgid "Malformed address."
+msgstr "Chybná adresa."
+
+#. #define HISTORICAL_ON_MINIMAL_OFF
+#: LYMessages.c:344
+msgid "Historical comment parsing ON (Minimal is overridden)!"
+msgstr "Historické komentáře ZAPNUTO (minimální komentáře potlaÄeny)!"
+
+#. #define HISTORICAL_OFF_MINIMAL_ON
+#: LYMessages.c:346
+msgid "Historical comment parsing OFF (Minimal is in effect)!"
+msgstr "Historické komentáře VYPNUTO (minimální komentáře aktivní)!"
+
+#. #define HISTORICAL_ON_VALID_OFF
+#: LYMessages.c:348
+msgid "Historical comment parsing ON (Valid is overridden)!"
+msgstr "Historické komentáře ZAPNUTO (platné komentáře potlaÄeny)!"
+
+#. #define HISTORICAL_OFF_VALID_ON
+#: LYMessages.c:350
+msgid "Historical comment parsing OFF (Valid is in effect)!"
+msgstr "Historické komentáře VYPNUTO (platné komentáře aktivní)!"
+
+#. #define MINIMAL_ON_IN_EFFECT
+#: LYMessages.c:352
+msgid "Minimal comment parsing ON (and in effect)!"
+msgstr "Používání minimálních komentářů ZAPNUTO (a aktivní)!"
+
+#. #define MINIMAL_OFF_VALID_ON
+#: LYMessages.c:354
+msgid "Minimal comment parsing OFF (Valid is in effect)!"
+msgstr "Používání minimálních komentářů VYPNUTO (platné komentáře aktivní)!"
+
+#. #define MINIMAL_ON_BUT_HISTORICAL
+#: LYMessages.c:356
+msgid "Minimal comment parsing ON (but Historical is in effect)!"
+msgstr "Používání minimálních komentářů ZAPNUTO (ale aktivní jsou historické komentáře)!"
+
+#. #define MINIMAL_OFF_HISTORICAL_ON
+#: LYMessages.c:358
+msgid "Minimal comment parsing OFF (Historical is in effect)!"
+msgstr "Používání minimálních komentářů VYPNUTO (historické komentáře aktivní)!"
+
+#: LYMessages.c:359
+msgid "Soft double-quote parsing ON!"
+msgstr "Metoda jednoduchého zpracování uvozovek ZAPNUTO!"
+
+#: LYMessages.c:360
+msgid "Soft double-quote parsing OFF!"
+msgstr "Metoda jednoduchého zpracování uvozovek VYPNUTO!"
+
+#: LYMessages.c:361
+msgid "Now using TagSoup parsing of HTML."
+msgstr "Používám 'TagSoup' metodu zpracování HTML."
+
+#: LYMessages.c:362
+msgid "Now using SortaSGML parsing of HTML!"
+msgstr "Používám 'SortaSGML' metodu zpracování HTML!"
+
+#: LYMessages.c:363
+msgid "You are already at the end of this document."
+msgstr "Již jste na konci dokumentu."
+
+#: LYMessages.c:364
+msgid "You are already at the beginning of this document."
+msgstr "Již jste na zaÄátku dokumentu."
+
+#: LYMessages.c:365
+#, c-format
+msgid "You are already at page %d of this document."
+msgstr "Již jste na straně %d."
+
+#: LYMessages.c:366
+#, c-format
+msgid "Link number %d already is current."
+msgstr "Odkaz Äíslo %d je právÄ› zvolen."
+
+#: LYMessages.c:367
+msgid "You are already at the first document"
+msgstr "Již jste na prvním dokumentu"
+
+#: LYMessages.c:368
+msgid "There are no links above this line of the document."
+msgstr "Nad tímto řádkem již nejsou žádné odkazy."
+
+#: LYMessages.c:369
+msgid "There are no links below this line of the document."
+msgstr "Pod tímto řádkem již nejsou žádné odkazy."
+
+#. #define MAXLEN_REACHED_DEL_OR_MOV
+#: LYMessages.c:371
+msgid "Maximum length reached! Delete text or move off field."
+msgstr "Maximální délka dosažena! Smažte text, nebo se přesuňte mimo pole."
+
+#. #define NOT_ON_SUBMIT_OR_LINK
+#: LYMessages.c:373
+msgid "You are not on a form submission button or normal link."
+msgstr "Toto není běžný odkaz ani tlaÄítko na odeslání formuláře."
+
+#. #define NEED_CHECKED_RADIO_BUTTON
+#: LYMessages.c:375
+msgid "One radio button must be checked at all times!"
+msgstr "Vždy musí být vybráno alespoň jedno z pÅ™epínacích tlaÄítek!"
+
+#: LYMessages.c:376
+msgid "No submit button for this form, submit single text field?"
+msgstr "Tento formulář nemá tlaÄítko pro odeslání dat, odeslat jediné textové pole?"
+
+#: LYMessages.c:377
+msgid "Do you want to go back to the previous document?"
+msgstr "Chcete se vrátit k předchozímu dokumentu?"
+
+#: LYMessages.c:378
+msgid "Use arrows or tab to move off of field."
+msgstr "Použijte Å¡ipky Äi tab pro pÅ™esun mimo pole."
+
+#. #define ENTER_TEXT_ARROWS_OR_TAB
+#: LYMessages.c:380
+msgid "Enter text. Use arrows or tab to move off of field."
+msgstr "Vložte text. Použijte Å¡ipky Äi tab pro pÅ™esun mimo pole."
+
+#: LYMessages.c:381
+msgid "** Bad HTML!! No form action defined. **"
+msgstr "** Chybné HTML!! Formulář nemá definovánu žádnou akci. **"
+
+#: LYMessages.c:382
+msgid "Bad HTML!! Unable to create popup window!"
+msgstr "Chybné HTML!! Nelze vytvořit vyskakovací okno!"
+
+#: LYMessages.c:383
+msgid "Unable to create popup window!"
+msgstr "Nelze vytvořit vyskakovací okno!"
+
+#: LYMessages.c:384
+msgid "Goto a random URL is disallowed!"
+msgstr "Náhodná URL je zakázáno použít jako cíl!"
+
+#: LYMessages.c:385
+msgid "Goto a non-http URL is disallowed!"
+msgstr "URL, která nejsou http je zakázáno použít jako cíl!"
+
+#: LYMessages.c:386
+#, c-format
+msgid "You are not allowed to goto \"%s\" URLs"
+msgstr "Je zakázáno používat jako cíl \"%s\" URL"
+
+#: LYMessages.c:387
+msgid "URL to open: "
+msgstr "Cílové URL: "
+
+#: LYMessages.c:388
+msgid "Edit the current Goto URL: "
+msgstr "Editace aktuálního cílového URL: "
+
+#: LYMessages.c:389
+msgid "Edit the previous Goto URL: "
+msgstr "Editace předchozího cílového URL: "
+
+#: LYMessages.c:390
+msgid "Edit a previous Goto URL: "
+msgstr "Editace předchozího cílového URL: "
+
+#: LYMessages.c:391
+msgid "Current document has POST data."
+msgstr "Aktuální dokument obsahuje POST data."
+
+#: LYMessages.c:392
+msgid "Edit this document's URL: "
+msgstr "Editace URL tohoto dokumentu: "
+
+#: LYMessages.c:393
+msgid "Edit the current link's URL: "
+msgstr "Editace URL aktuálního odkazu: "
+
+#: LYMessages.c:394
+msgid "Edit the form's submit-URL: "
+msgstr "Editace URL pro poslání formuláře: "
+
+#: LYMessages.c:395
+msgid "You cannot edit File Management URLs"
+msgstr "Nemůžete editovat URL Správce souborů"
+
+#: LYMessages.c:396
+msgid "Enter a database query: "
+msgstr "Zadejte dotaz na databázi: "
+
+#: LYMessages.c:397
+msgid "Enter a whereis query: "
+msgstr "Zadejte hledaný řetězec: "
+
+#: LYMessages.c:398
+msgid "Edit the current query: "
+msgstr "Editace aktuálního dotazu: "
+
+#: LYMessages.c:399
+msgid "Edit the previous query: "
+msgstr "Editace předchozího dotazu: "
+
+#: LYMessages.c:400
+msgid "Edit a previous query: "
+msgstr "Editace předchozího dotazu: "
+
+#. #define USE_C_R_TO_RESUB_CUR_QUERY
+#: LYMessages.c:402
+msgid "Use Control-R to resubmit the current query."
+msgstr "Použijte Control-R pro opětovné odeslání dotazu."
+
+#: LYMessages.c:403
+msgid "Edit the current shortcut: "
+msgstr "Editovat aktuální zkratku: "
+
+#: LYMessages.c:404
+msgid "Edit the previous shortcut: "
+msgstr "Editovat předchozí zkratku: "
+
+#: LYMessages.c:405
+msgid "Edit a previous shortcut: "
+msgstr "Editovat předchozí zkratku: "
+
+#: LYMessages.c:406
+#, c-format
+msgid "Key '%c' is not mapped to a jump file!"
+msgstr "Klávesa '%c' není svázána se souborem zkratek!"
+
+#: LYMessages.c:407
+msgid "Cannot locate jump file!"
+msgstr "Soubor zkratek nelze nalézt!"
+
+#: LYMessages.c:408
+msgid "Cannot open jump file!"
+msgstr "Soubor zkratek nelze otevřít!"
+
+#: LYMessages.c:409
+msgid "Error reading jump file!"
+msgstr "Chyba pÅ™i Ätení souboru zkratek!"
+
+#: LYMessages.c:410
+msgid "Out of memory reading jump file!"
+msgstr "PÅ™i Ätení souboru zkratek doÅ¡la paměť!"
+
+#: LYMessages.c:411
+msgid "Out of memory reading jump table!"
+msgstr "PÅ™i Ätení tabulky zkratek doÅ¡la paměť!"
+
+#: LYMessages.c:412
+msgid "No index is currently available."
+msgstr "Není dostupný žádný rejstřík."
+
+#. #define CONFIRM_MAIN_SCREEN
+#: LYMessages.c:414
+msgid "Do you really want to go to the Main screen?"
+msgstr "Opravdu chcete přejít na Hlavní obrazovku?"
+
+#: LYMessages.c:415
+msgid "You are already at main screen!"
+msgstr "Již jste na Hlavní obrazovce!"
+
+#. #define NOT_ISINDEX
+#: LYMessages.c:417
+msgid "Not a searchable indexed document -- press '/' to search for a text string"
+msgstr "Toto není prohledávatelný rejstřík -- použijte '/' pro vyhledání řetězce"
+
+#. #define NO_OWNER
+#: LYMessages.c:419
+msgid "No owner is defined for this file so you cannot send a comment"
+msgstr "Není udán vlastník tohoto dokumentu, tudíž nemůžete zaslat komentář"
+
+#: LYMessages.c:420
+#, c-format
+msgid "No owner is defined. Use %s?"
+msgstr "Není udán vlastník. Použít %s?"
+
+#: LYMessages.c:421
+msgid "Do you wish to send a comment?"
+msgstr "Chcete zaslat komentář?"
+
+#: LYMessages.c:422
+msgid "Mail is disallowed so you cannot send a comment"
+msgstr "Pošta je zakázána, tudíž nemůžete zaslat komentář"
+
+#: LYMessages.c:423
+msgid "The 'e'dit command is currently disabled."
+msgstr "Použití příkazu 'e'(editovat) je nyní zakázáno."
+
+#: LYMessages.c:424
+msgid "External editing is currently disabled."
+msgstr "Používání externího editoru je nyní zakázáno."
+
+#: LYMessages.c:425
+msgid "System error - failure to get status."
+msgstr "Systémová chyba - status nelze zjistit."
+
+#: LYMessages.c:426
+msgid "No editor is defined!"
+msgstr "Není zadán žádný editor!"
+
+#: LYMessages.c:427
+msgid "The 'p'rint command is currently disabled."
+msgstr "Použití příkazu 'p'(tisknout) je nyní zakázáno."
+
+#: LYMessages.c:428
+msgid "Document has no Toolbar links or Banner."
+msgstr "Dokument nemá žádnou Nástrojovou lištu ani Reklamní banner."
+
+#: LYMessages.c:429
+msgid "Unable to open traversal file."
+msgstr "Nelze otevřít 'traverse' soubor."
+
+#: LYMessages.c:430
+msgid "Unable to open traversal found file."
+msgstr "Nelze otevřít 'traverse_found' soubor."
+
+#: LYMessages.c:431
+msgid "Unable to open reject file."
+msgstr "Nelze otevřít 'traverse_reject' soubor."
+
+#: LYMessages.c:432
+msgid "Unable to open traversal errors output file"
+msgstr "Nelze otevřít 'traverse_errors' soubor"
+
+#: LYMessages.c:433
+msgid "TRAVERSAL WAS INTERRUPTED"
+msgstr "KŘÃŽENà (TRAVERSE) BYLO PŘERUÅ ENO"
+
+#: LYMessages.c:434
+msgid "Follow link (or goto link or page) number: "
+msgstr "Následovat odkaz (Äi jít na odkaz nebo stránku) Äíslo: "
+
+#: LYMessages.c:435
+msgid "Select option (or page) number: "
+msgstr "Zvolte Äíslo volby (Äi strany): "
+
+#: LYMessages.c:436
+#, c-format
+msgid "Option number %d already is current."
+msgstr "Volba Äíslo %d je právÄ› aktivní."
+
+#. #define ALREADY_AT_OPTION_END
+#: LYMessages.c:438
+msgid "You are already at the end of this option list."
+msgstr "Již jste na konci seznamu voleb."
+
+#. #define ALREADY_AT_OPTION_BEGIN
+#: LYMessages.c:440
+msgid "You are already at the beginning of this option list."
+msgstr "Již jste na zaÄátku seznamu voleb."
+
+#. #define ALREADY_AT_OPTION_PAGE
+#: LYMessages.c:442
+#, c-format
+msgid "You are already at page %d of this option list."
+msgstr "Již jste na straně %d nabídky."
+
+#: LYMessages.c:443
+msgid "You have entered an invalid option number."
+msgstr "Bylo zadáno chybné Äíslo volby."
+
+#: LYMessages.c:444
+msgid "** Bad HTML!! Use -trace to diagnose. **"
+msgstr "** Chybné HTML!! Použijte -trace pro diagnostiku. **"
+
+#: LYMessages.c:445
+msgid "Give name of file to save in"
+msgstr "Zadejte jméno souboru, do kterého mám uložit"
+
+#: LYMessages.c:446
+msgid "Can't save data to file -- please run WWW locally"
+msgstr "Data nelze do souboru uložit -- spusťte WWW místně"
+
+#: LYMessages.c:447
+msgid "Can't open temporary file!"
+msgstr "DoÄasný soubor nelze otevřít!"
+
+#: LYMessages.c:448
+msgid "Can't open output file! Cancelling!"
+msgstr "Výstupní soubor nelze otevřít! Ruším!"
+
+#: LYMessages.c:449
+msgid "Execution is disabled."
+msgstr "Spouštění programů je zakázáno."
+
+#. #define EXECUTION_DISABLED_FOR_FILE
+#: LYMessages.c:451
+#, c-format
+msgid "Execution is not enabled for this file. See the Options menu (use %s)."
+msgstr "Tento soubor nelze spustit. Viz KonfiguraÄní menu (použijte %s)."
+
+#. #define EXECUTION_NOT_COMPILED
+#: LYMessages.c:453
+msgid "Execution capabilities are not compiled into this version."
+msgstr "Podpora pro spouštění programů byla vypnuta při sestavení programu."
+
+#: LYMessages.c:454
+msgid "This file cannot be displayed on this terminal."
+msgstr "Tento soubor nelze na tomto terminálu zobrazit."
+
+#. #define CANNOT_DISPLAY_FILE_D_OR_C
+#: LYMessages.c:456
+msgid "This file cannot be displayed on this terminal: D)ownload, or C)ancel"
+msgstr "Tento soubor nelze na tomto terminálu zobrazit: D)Stáhnout Äi C)ZruÅ¡it"
+
+#: LYMessages.c:457
+#, c-format
+msgid "%s D)ownload, or C)ancel"
+msgstr "%s D)Stáhnout Äi C)ZruÅ¡it"
+
+#: LYMessages.c:458
+msgid "Cancelling file."
+msgstr "Zrušeno."
+
+#: LYMessages.c:459
+msgid "Retrieving file. - PLEASE WAIT -"
+msgstr "Stahuji soubor. - POÄŒKEJTE, PROSÃM -"
+
+#: LYMessages.c:460
+msgid "Enter a filename: "
+msgstr "Zadejte jméno souboru: "
+
+#: LYMessages.c:461
+msgid "Edit the previous filename: "
+msgstr "Editace předchozího jména souboru: "
+
+#: LYMessages.c:462
+msgid "Edit a previous filename: "
+msgstr "Editace předchozího jména souboru: "
+
+#: LYMessages.c:463
+msgid "Enter a new filename: "
+msgstr "Zadejte nové jméno souboru: "
+
+#: LYMessages.c:464
+msgid "File name may not begin with a dot."
+msgstr "Jméno souboru nesmí zaÄínat teÄkou."
+
+#: LYMessages.c:466
+msgid "File exists. Create higher version?"
+msgstr "Soubor již existuje. Vytvořit jeho novou verzi?"
+
+#: LYMessages.c:468
+msgid "File exists. Overwrite?"
+msgstr "Soubor již existuje. Přepsat?"
+
+#: LYMessages.c:470
+msgid "Cannot write to file."
+msgstr "Do souboru nelze zapisovat."
+
+#: LYMessages.c:471
+msgid "ERROR! - download command is misconfigured."
+msgstr "CHYBA! - příkaz pro stahování je chybný."
+
+#: LYMessages.c:472
+msgid "Unable to download file."
+msgstr "Soubor nelze stáhnout."
+
+#: LYMessages.c:473
+msgid "Reading directory..."
+msgstr "Čtu adresář..."
+
+#: LYMessages.c:474
+msgid "Building directory listing..."
+msgstr "Sestavuji výpis adresáře..."
+
+#: LYMessages.c:475
+msgid "Saving..."
+msgstr "Ukládám..."
+
+#: LYMessages.c:476
+#, c-format
+msgid "Could not edit file '%s'."
+msgstr "Soubor '%s' nelze editovat."
+
+#: LYMessages.c:477
+msgid "Unable to access document!"
+msgstr "Přístup k dokumentu nelze získat!"
+
+#: LYMessages.c:478
+msgid "Could not access file."
+msgstr "Soubor není dostupný."
+
+#: LYMessages.c:479
+msgid "Could not access directory."
+msgstr "Adresář není dostupný."
+
+#: LYMessages.c:480
+msgid "Could not load data."
+msgstr "Nelze naÄíst data."
+
+#. #define CANNOT_EDIT_REMOTE_FILES
+#: LYMessages.c:482
+msgid "Lynx cannot currently (e)dit remote WWW files."
+msgstr "Lynx v souÄasné dobÄ› nemůže 'e'(editovat) vzdálené WWW dokumenty."
+
+#. #define CANNOT_EDIT_FIELD
+#: LYMessages.c:484
+msgid "This field cannot be (e)dited with an external editor."
+msgstr "Toto pole nemůže být 'e'(editováno) pomocí externího editoru."
+
+#: LYMessages.c:485
+msgid "Bad rule"
+msgstr "Chybné pravidlo"
+
+#: LYMessages.c:486
+msgid "Insufficient operands:"
+msgstr "Chybí operandy:"
+
+#: LYMessages.c:487
+msgid "You are not authorized to edit this file."
+msgstr "Nejste oprávněn editovat tento soubor."
+
+#: LYMessages.c:488
+msgid "Title: "
+msgstr "Titulek: "
+
+#: LYMessages.c:489
+msgid "Subject: "
+msgstr "Předmět: "
+
+#: LYMessages.c:490
+msgid "Username: "
+msgstr "Uživatelské jméno: "
+
+#: LYMessages.c:491
+msgid "Password: "
+msgstr "Heslo: "
+
+#: LYMessages.c:492
+msgid "lynx: Username and Password required!!!"
+msgstr "lynx: Je vyžadováno uživatelské jméno a heslo!!!"
+
+#: LYMessages.c:493
+msgid "lynx: Password required!!!"
+msgstr "lynx: Je vyžadováno heslo!!!"
+
+#: LYMessages.c:494
+msgid "Clear all authorization info for this session?"
+msgstr "Smazat vÅ¡echny autorizaÄní informace pro toto sezení?"
+
+#: LYMessages.c:495
+msgid "Authorization info cleared."
+msgstr "AutorizaÄní informace smazány."
+
+#: LYMessages.c:496
+msgid "Authorization failed. Retry?"
+msgstr "Autorizace se nezdařila. Nový pokus?"
+
+#: LYMessages.c:497
+msgid "cgi support has been disabled."
+msgstr "podpora cgi byla vypnuta."
+
+#. #define CGI_NOT_COMPILED
+#: LYMessages.c:499
+msgid "Lynxcgi capabilities are not compiled into this version."
+msgstr "Podpora pro spouštění Lynxcgi byla vypnuta při sestavení programu."
+
+#: LYMessages.c:500
+#, c-format
+msgid "Sorry, no known way of converting %s to %s."
+msgstr "Lituji, není znám způsob jak převést %s na %s."
+
+#: LYMessages.c:501
+msgid "Unable to set up connection."
+msgstr "Spojení nelze nastavit."
+
+#: LYMessages.c:502
+msgid "Unable to make connection"
+msgstr "Spojení nelze navázat"
+
+#. #define MALFORMED_EXEC_REQUEST
+#: LYMessages.c:504
+msgid "Executable link rejected due to malformed request."
+msgstr "Chybný požadavek na spuštění programu."
+
+#. #define BADCHAR_IN_EXEC_LINK
+#: LYMessages.c:506
+#, c-format
+msgid "Executable link rejected due to `%c' character."
+msgstr "Odkaz na program obsahuje chybný znak `%c'."
+
+#. #define RELPATH_IN_EXEC_LINK
+#: LYMessages.c:508
+msgid "Executable link rejected due to relative path string ('../')."
+msgstr "Odkaz na program nesmí být relativní ('../')'."
+
+#. #define BADLOCPATH_IN_EXEC_LINK
+#: LYMessages.c:510
+msgid "Executable link rejected due to location or path."
+msgstr "Odkaz na program odmítnut kvůli umístÄ›ní Äi názvu cesty."
+
+#: LYMessages.c:511
+msgid "Mail access is disabled!"
+msgstr "Pošta je zakázána!"
+
+#. #define ACCESS_ONLY_LOCALHOST
+#: LYMessages.c:513
+msgid "Only files and servers on the local host can be accessed."
+msgstr "Přístup je povolen pouze k místním souborům a službám."
+
+#: LYMessages.c:514
+msgid "Telnet access is disabled!"
+msgstr "Použití telnetu je zakázáno!"
+
+#. #define TELNET_PORT_SPECS_DISABLED
+#: LYMessages.c:516
+msgid "Telnet port specifications are disabled."
+msgstr "Je zakázáno uvádět port u telnetu."
+
+#: LYMessages.c:517
+msgid "USENET news access is disabled!"
+msgstr "Přístup do diskuzních skupin USENET je zakázán!"
+
+#: LYMessages.c:518
+msgid "Rlogin access is disabled!"
+msgstr "Použití rlogin je zakázáno!"
+
+#: LYMessages.c:519
+msgid "Ftp access is disabled!"
+msgstr "Použití FTP je zakázáno!"
+
+#: LYMessages.c:520
+msgid "There are no references from this document."
+msgstr "Tento dokument neobsahuje žádné odkazy."
+
+#: LYMessages.c:521
+msgid "There are only hidden links from this document."
+msgstr "Tento dokument obsahuje pouze skryté odkazy."
+
+#: LYMessages.c:523
+msgid "Unable to open command file."
+msgstr "Soubor s příkazy nelze otevřít."
+
+#: LYMessages.c:525
+msgid "News Post Cancelled!!!"
+msgstr "Odeslání příspěvku do diskuzních skupin Zrušeno!!!"
+
+#. #define SPAWNING_EDITOR_FOR_NEWS
+#: LYMessages.c:527
+msgid "Spawning your selected editor to edit news message"
+msgstr "Spouštím editor pro editaci diskuzního příspěvku"
+
+#: LYMessages.c:528
+msgid "Post this message?"
+msgstr "Odeslat tuto zprávu?"
+
+#: LYMessages.c:529
+#, c-format
+msgid "Append '%s'?"
+msgstr "Připojit '%s'?"
+
+#: LYMessages.c:530
+msgid "Posting to newsgroup(s)..."
+msgstr "Zasílám do diskuzních skupin..."
+
+#: LYMessages.c:532
+msgid "*** You have unread mail. ***"
+msgstr "*** Máte nepÅ™eÄtenou poÅ¡tu. ***"
+
+#: LYMessages.c:534
+msgid "*** You have mail. ***"
+msgstr "*** Máte poštu. ***"
+
+#: LYMessages.c:536
+msgid "*** You have new mail. ***"
+msgstr "*** Máte novou poštu. ***"
+
+#: LYMessages.c:537
+msgid "File insert cancelled!!!"
+msgstr "Požadavek na vložení souboru byl zrušen!!!"
+
+#: LYMessages.c:538
+msgid "Not enough memory for file!"
+msgstr "Pro soubor není dostatek paměti!"
+
+#: LYMessages.c:539
+msgid "Can't open file for reading."
+msgstr "Soubor nelze otevřít pro Ätení."
+
+#: LYMessages.c:540
+msgid "File does not exist."
+msgstr "Soubor neexistuje."
+
+#: LYMessages.c:541
+msgid "File does not exist - reenter or cancel:"
+msgstr "Soubor neexistuje - zadejte znovu, Äi zruÅ¡te:"
+
+#: LYMessages.c:542
+msgid "File is not readable."
+msgstr "Soubor je neÄitelný."
+
+#: LYMessages.c:543
+msgid "File is not readable - reenter or cancel:"
+msgstr "Soubor je neÄitelný - zadejte znovu, Äi zruÅ¡te:"
+
+#: LYMessages.c:544
+msgid "Nothing to insert - file is 0-length."
+msgstr "Není co vložit - soubor má nulovou délku."
+
+#: LYMessages.c:545
+msgid "Save request cancelled!!!"
+msgstr "Požadavek na uložení byl zrušen!!!"
+
+#: LYMessages.c:546
+msgid "Mail request cancelled!!!"
+msgstr "Požadavek na odeslání pošty byl zrušen!!!"
+
+#. #define CONFIRM_MAIL_SOURCE_PREPARSED
+#: LYMessages.c:548
+msgid "Viewing preparsed source. Are you sure you want to mail it?"
+msgstr "Zobrazuji předzpracovaný zdrojový kód. Opravdu jej chcete poslat poštou?"
+
+#: LYMessages.c:549
+msgid "Please wait..."
+msgstr "Okamžik, prosím..."
+
+#: LYMessages.c:550
+msgid "Mailing file. Please wait..."
+msgstr "Posílám soubor poštou. Okamžik, prosím..."
+
+#: LYMessages.c:551
+msgid "ERROR - Unable to mail file"
+msgstr "CHYBA - Soubor nelze poštou odeslat"
+
+#. #define CONFIRM_LONG_SCREEN_PRINT
+#: LYMessages.c:553
+#, c-format
+msgid "File is %d screens long. Are you sure you want to print?"
+msgstr "Délka souboru v obrazovkách je %d. Opravdu jej chcete vytisknout?"
+
+#: LYMessages.c:554
+msgid "Print request cancelled!!!"
+msgstr "Požadavek na tisk byl zrušen!!!"
+
+#: LYMessages.c:555
+msgid "Press <return> to begin: "
+msgstr "Zahajte stisknutím <return>: "
+
+#: LYMessages.c:556
+msgid "Press <return> to finish: "
+msgstr "UkonÄete stisknutím <return>: "
+
+#. #define CONFIRM_LONG_PAGE_PRINT
+#: LYMessages.c:558
+#, c-format
+msgid "File is %d pages long. Are you sure you want to print?"
+msgstr "Délka souboru ve stranách je %d. Opravdu jej chcete vytisknout?"
+
+#. #define CHECK_PRINTER
+#: LYMessages.c:560
+msgid "Be sure your printer is on-line. Press <return> to start printing:"
+msgstr "Ujistěte se, že tiskárna je zapnuta. Tisk zahajte stisknutím <return>:"
+
+#: LYMessages.c:561
+msgid "ERROR - Unable to allocate file space!!!"
+msgstr "CHYBA - není dostatek místa pro soubor!!!"
+
+#: LYMessages.c:562
+msgid "Unable to open tempfile"
+msgstr "DoÄasný soubor nelze otevřít"
+
+#: LYMessages.c:563
+msgid "Unable to open print options file"
+msgstr "Soubor s menu voleb tisku nelze otevřít"
+
+#: LYMessages.c:564
+msgid "Printing file. Please wait..."
+msgstr "Tisknu soubor. Okamžik, prosím..."
+
+#: LYMessages.c:565
+msgid "Please enter a valid internet mail address: "
+msgstr "Zadejte platnou adresu elektronické pošty: "
+
+#: LYMessages.c:566
+msgid "ERROR! - printer is misconfigured!"
+msgstr "CHYBA! - tiskárna je špatně nastavena!"
+
+#: LYMessages.c:567
+msgid "Image map from POST response not available!"
+msgstr "Klikací mapa z odpovědi na POST není dostupná!"
+
+#: LYMessages.c:568
+msgid "Misdirected client-side image MAP request!"
+msgstr "Chybně cílený požadavek z klikací mapy!"
+
+#: LYMessages.c:569
+msgid "Client-side image MAP is not accessible!"
+msgstr "Klientská klikací mapa není přístupná!"
+
+#: LYMessages.c:570
+msgid "No client-side image MAPs are available!"
+msgstr "Není dostupná žádná klientská klikací mapa!"
+
+#: LYMessages.c:571
+msgid "Client-side image MAP is not available!"
+msgstr "Klientská klikací mapa není dostupná!"
+
+#. #define OPTION_SCREEN_NEEDS_24
+#: LYMessages.c:574
+msgid "Screen height must be at least 24 lines for the Options menu!"
+msgstr "KonfiguraÄní menu potÅ™ebuje obrazovku o alespoň 24 řádcích!"
+
+#. #define OPTION_SCREEN_NEEDS_23
+#: LYMessages.c:576
+msgid "Screen height must be at least 23 lines for the Options menu!"
+msgstr "KonfiguraÄní menu potÅ™ebuje obrazovku o alespoň 23 řádcích!"
+
+#. #define OPTION_SCREEN_NEEDS_22
+#: LYMessages.c:578
+msgid "Screen height must be at least 22 lines for the Options menu!"
+msgstr "KonfiguraÄní menu potÅ™ebuje obrazovku o alespoň 22 řádcích!"
+
+#: LYMessages.c:580
+msgid "That key requires Advanced User mode."
+msgstr "Tato klávesa funguje pouze v režimu pro pokroÄilé uživatele."
+
+#: LYMessages.c:581
+#, c-format
+msgid "Content-type: %s"
+msgstr "Typ obsahu: %s"
+
+#: LYMessages.c:582
+msgid "Command: "
+msgstr "Příkaz: "
+
+#: LYMessages.c:583
+msgid "Unknown or ambiguous command"
+msgstr "Neznámý, Äi nejasný příkaz"
+
+#: LYMessages.c:584
+msgid " Version "
+msgstr " Verze "
+
+#: LYMessages.c:585
+msgid " first"
+msgstr " jako první"
+
+#: LYMessages.c:586
+msgid ", guessing..."
+msgstr ", hádám..."
+
+#: LYMessages.c:587
+msgid "Permissions for "
+msgstr "Přístupová práva pro "
+
+#: LYMessages.c:588
+msgid "Select "
+msgstr "Zvolte "
+
+#: LYMessages.c:589
+msgid "capital letter"
+msgstr "velké písmeno"
+
+#: LYMessages.c:590
+msgid " of option line,"
+msgstr " z volby,"
+
+#: LYMessages.c:591
+msgid " to save,"
+msgstr " pro uložení,"
+
+#: LYMessages.c:592
+msgid " to "
+msgstr " do "
+
+#: LYMessages.c:593
+msgid " or "
+msgstr " Äi "
+
+#: LYMessages.c:594
+msgid " index"
+msgstr " rejstřík"
+
+#: LYMessages.c:595
+msgid " to return to Lynx."
+msgstr " pro návrat do programu Lynx."
+
+#: LYMessages.c:596
+msgid "Accept Changes"
+msgstr "Přijmout změny"
+
+#: LYMessages.c:597
+msgid "Reset Changes"
+msgstr "Zrušit změny"
+
+#: LYMessages.c:598
+msgid "Left Arrow cancels changes"
+msgstr "Šipka vlevo zruší změny"
+
+#: LYMessages.c:599
+msgid "Save options to disk"
+msgstr "Uložit konfiguraci na disk"
+
+#: LYMessages.c:600
+msgid "Hit RETURN to accept entered data."
+msgstr "Stiskněte RETURN pro přijetí údajů."
+
+#. #define ACCEPT_DATA_OR_DEFAULT
+#: LYMessages.c:602
+msgid "Hit RETURN to accept entered data. Delete data to invoke the default."
+msgstr "Stiskněte RETURN pro přijetí údajů. Smazáním vyvoláte implicitní nastavení."
+
+#: LYMessages.c:603
+msgid "Value accepted!"
+msgstr "Hodnota přijmuta!"
+
+#. #define VALUE_ACCEPTED_WARNING_X
+#: LYMessages.c:605
+msgid "Value accepted! -- WARNING: Lynx is configured for XWINDOWS!"
+msgstr "Hodnota pÅ™ijmuta! -- VAROVÃNÃ: Lynx je nastaven pro XWINDOWS!"
+
+#. #define VALUE_ACCEPTED_WARNING_NONX
+#: LYMessages.c:607
+msgid "Value accepted! -- WARNING: Lynx is NOT configured for XWINDOWS!"
+msgstr "Hodnota pÅ™ijmuta! -- VAROVÃNÃ: Lynx není nastaven pro XWINDOWS!"
+
+#: LYMessages.c:608
+msgid "You are not allowed to change which editor to use!"
+msgstr "Nemáte oprávnění měnit editor!"
+
+#: LYMessages.c:609
+msgid "Failed to set DISPLAY variable!"
+msgstr "Proměnnou DISPLAY se nepodařilo nastavit!"
+
+#: LYMessages.c:610
+msgid "Failed to clear DISPLAY variable!"
+msgstr "Proměnnou DISPLAY se nepodařilo vynulovat!"
+
+#. #define BOOKMARK_CHANGE_DISALLOWED
+#: LYMessages.c:612
+msgid "You are not allowed to change the bookmark file!"
+msgstr "Nemáte oprávnění měnit soubor záložek!"
+
+#: LYMessages.c:613
+msgid "Terminal does not support color"
+msgstr "Terminál nepodporuje barvy"
+
+#: LYMessages.c:614
+#, c-format
+msgid "Your '%s' terminal does not support color."
+msgstr "Terminál '%s' nepodporuje barvy."
+
+#: LYMessages.c:615
+msgid "Access to dot files is disabled!"
+msgstr "Přístup k teÄkovým souborům je zakázán!"
+
+#. #define UA_NO_LYNX_WARNING
+#: LYMessages.c:617
+msgid "User-Agent string does not contain \"Lynx\" or \"L_y_n_x\""
+msgstr "HlaviÄka User-Agent neobsahuje \"Lynx\" Äi \"L_y_n_x\""
+
+#. #define UA_PLEASE_USE_LYNX
+#: LYMessages.c:619
+msgid "Use \"L_y_n_x\" or \"Lynx\" in User-Agent, or it looks like intentional deception!"
+msgstr "V User-Agent použijte \"L_y_n_x\" Äi \"Lynx\", jinak to vypadá jako zámÄ›rný podvod!"
+
+#. #define UA_CHANGE_DISABLED
+#: LYMessages.c:621
+msgid "Changing of the User-Agent string is disabled!"
+msgstr "MÄ›nit hodnotu hlaviÄky User-Agent je zakázáno!"
+
+#. #define CHANGE_OF_SETTING_DISALLOWED
+#: LYMessages.c:623
+msgid "You are not allowed to change this setting."
+msgstr "Nemáte oprávnění měnit tuto volbu."
+
+#: LYMessages.c:624
+msgid "Saving Options..."
+msgstr "Ukládám konfiguraci..."
+
+#: LYMessages.c:625
+msgid "Options saved!"
+msgstr "Konfigurace uložena!"
+
+#: LYMessages.c:626
+msgid "Unable to save Options!"
+msgstr "Konfiguraci nelze uložit!"
+
+#: LYMessages.c:627
+msgid " 'r' to return to Lynx "
+msgstr " 'r' pro návrat do programu Lynx "
+
+#: LYMessages.c:628
+msgid " '>' to save, or 'r' to return to Lynx "
+msgstr " '>' pro uložení Äi 'r' pro návrat do programu Lynx "
+
+#. #define ANY_KEY_CHANGE_RET_ACCEPT
+#: LYMessages.c:630
+msgid "Hit any key to change value; RETURN to accept."
+msgstr "Stiskněte jakoukoli klávesu pro změnu hodnoty; RETURN pro její přijetí."
+
+#: LYMessages.c:631
+msgid "Error uncompressing temporary file!"
+msgstr "Chyba pÅ™i dekompresi doÄasného souboru!"
+
+#: LYMessages.c:632
+msgid "Unsupported URL scheme!"
+msgstr "Nepodporovaný typ URL!"
+
+#: LYMessages.c:633
+msgid "Unsupported data: URL! Use SHOWINFO, for now."
+msgstr "Nepodporovaná 'data:' URL! Použijte SHOWINFO."
+
+#: LYMessages.c:634
+#, c-format
+msgid "Redirection limit of %d URL's reached."
+msgstr "Maximální poÄet pÅ™esmÄ›rování %d URL byl dosažen."
+
+#: LYMessages.c:635
+msgid "Illegal redirection URL received from server!"
+msgstr "Server zaslal chybné URL pro přesměrování!"
+
+#. #define SERVER_ASKED_FOR_REDIRECTION
+#: LYMessages.c:637
+#, c-format
+msgid "Server asked for %d redirection of POST content to"
+msgstr "Server požaduje %d přesměrování POST obsahu na"
+
+#: LYMessages.c:640
+msgid "P)roceed, use G)ET or C)ancel "
+msgstr "P)PokraÄovat, použít G)Získat Äi C)ZruÅ¡it "
+
+#: LYMessages.c:641
+msgid "P)roceed, or C)ancel "
+msgstr "P)PokraÄovat Äi C)ZruÅ¡it "
+
+#. #define ADVANCED_POST_GET_REDIRECT
+#: LYMessages.c:643
+msgid "Redirection of POST content. P)roceed, see U)RL, use G)ET or C)ancel"
+msgstr "PÅ™esmÄ›rování POST obsahu. P)PokraÄovat, zobrazit U)RL, použít G)Získat Äi C)ZruÅ¡it"
+
+#. #define ADVANCED_POST_REDIRECT
+#: LYMessages.c:645
+msgid "Redirection of POST content. P)roceed, see U)RL, or C)ancel"
+msgstr "PÅ™esmÄ›rování POST obsahu. P)PokraÄovat, zobrazit U)RL Äi C)ZruÅ¡it"
+
+#. #define CONFIRM_POST_RESUBMISSION
+#: LYMessages.c:647
+msgid "Document from Form with POST content. Resubmit?"
+msgstr "Dokument z formuláře s POST obsahem? Odeslat znovu?"
+
+#. #define CONFIRM_POST_RESUBMISSION_TO
+#: LYMessages.c:649
+#, c-format
+msgid "Resubmit POST content to %s ?"
+msgstr "Odeslat znovu POST obsah na %s?"
+
+#. #define CONFIRM_POST_LIST_RELOAD
+#: LYMessages.c:651
+#, c-format
+msgid "List from document with POST data. Reload %s ?"
+msgstr "Seznam z dokumentu s POST obsahem? NaÄíst %s znovu?"
+
+#. #define CONFIRM_POST_DOC_HEAD
+#: LYMessages.c:653
+msgid "Document from POST action, HEAD may not be understood. Proceed?"
+msgstr "Dokument vznikl z POST akce. HlaviÄka nemusí být správnÄ› zpracována. PokraÄovat?"
+
+#. #define CONFIRM_POST_LINK_HEAD
+#: LYMessages.c:655
+msgid "Form submit action is POST, HEAD may not be understood. Proceed?"
+msgstr "Akce formuláře používá POST, hlaviÄka nemusí být správnÄ› zpracována. PokraÄovat?"
+
+#: LYMessages.c:656
+msgid "Proceed without a username and password?"
+msgstr "PokraÄovat bez ověření uživatelským jménem a heslem?"
+
+#: LYMessages.c:657
+#, c-format
+msgid "Proceed (%s)?"
+msgstr "PokraÄovat (%s)?"
+
+#: LYMessages.c:658
+msgid "Cannot POST to this host."
+msgstr "Na tento poÄítaÄ nelze data metodou POST odeslat."
+
+#: LYMessages.c:659
+msgid "POST not supported for this URL - ignoring POST data!"
+msgstr "Pro toto URL není metoda POST podporována - ignoruji POST data!"
+
+#: LYMessages.c:660
+msgid "Discarding POST data..."
+msgstr "Zahazuji POST data..."
+
+#: LYMessages.c:661
+msgid "Document will not be reloaded!"
+msgstr "Dokument nebude znovu naÄten!"
+
+#: LYMessages.c:662
+msgid "Location: "
+msgstr "Umístění: "
+
+#: LYMessages.c:663
+#, c-format
+msgid "'%s' not found!"
+msgstr "'%s' nebylo nalezeno!"
+
+#: LYMessages.c:664
+msgid "Default Bookmark File"
+msgstr "Implicitní soubor záložek"
+
+#: LYMessages.c:665
+msgid "Screen too small! (8x35 min)"
+msgstr "Obrazovka je příliš malá! (alespoň 8x35)"
+
+#: LYMessages.c:666
+msgid "Select destination or ^G to Cancel: "
+msgstr "Zvolte cíl Äi zruÅ¡te pomocí ^G: "
+
+#. #define MULTIBOOKMARKS_SELECT
+#: LYMessages.c:668
+msgid "Select subbookmark, '=' for menu, or ^G to cancel: "
+msgstr "Zvolte podzáložku, '=' pro menu Äi ^G pro zruÅ¡ení: "
+
+#. #define MULTIBOOKMARKS_SELF
+#: LYMessages.c:670
+msgid "Reproduce L)ink in this bookmark file or C)ancel? (l,c): "
+msgstr "L)Duplikovat záložku v tomto souboru Äi C)ZruÅ¡it? (l,c): "
+
+#: LYMessages.c:671
+msgid "Multiple bookmark support is not available."
+msgstr "Dělené záložky nejsou podporovány."
+
+#: LYMessages.c:672
+#, c-format
+msgid " Select Bookmark (screen %d of %d)"
+msgstr " Zvolte záložku (obrazovka %d z %d)"
+
+#: LYMessages.c:673
+msgid " Select Bookmark"
+msgstr " Zvolte záložku"
+
+#. #define MULTIBOOKMARKS_EHEAD_MASK
+#: LYMessages.c:675
+#, c-format
+msgid "Editing Bookmark DESCRIPTION and FILEPATH (%d of 2)"
+msgstr "Nastavení CESTY SOUBORU záložek a jejich POPISU (%d ze 2)"
+
+#. #define MULTIBOOKMARKS_EHEAD
+#: LYMessages.c:677
+msgid " Editing Bookmark DESCRIPTION and FILEPATH"
+msgstr " Nastavení CESTY SOUBORU záložek a jejich POPISU"
+
+#: LYMessages.c:678
+msgid "Letter: "
+msgstr "Písmeno: "
+
+#. #define USE_PATH_OFF_HOME
+#: LYMessages.c:681
+msgid "Use a filepath off your login directory in SHELL syntax!"
+msgstr "Použijte jméno cesty z přihlašovacího adresáře a v syntaxi SHELLU!"
+
+#: LYMessages.c:683
+msgid "Use a filepath off your home directory!"
+msgstr "Použijte jméno cesty z domácího adresáře!"
+
+#. #define MAXLINKS_REACHED
+#: LYMessages.c:686
+msgid "Maximum links per page exceeded! Use half-page or two-line scrolling."
+msgstr "Maximální poÄet odkazů na stránku dosažen! Použijte posun o 1/2 strany Äi o dva řádky."
+
+#: LYMessages.c:687
+msgid "No previously visited links available!"
+msgstr "Žádné navštívené odkazy nejsou k dispozici!"
+
+#: LYMessages.c:688
+msgid "Memory exhausted! Program aborted!"
+msgstr "Došla paměť! Program přerušen!"
+
+#: LYMessages.c:689
+msgid "Memory exhausted! Aborting..."
+msgstr "Došla paměť! Přerušuji..."
+
+#: LYMessages.c:690
+msgid "Not enough memory!"
+msgstr "Došla paměť!"
+
+#: LYMessages.c:691
+msgid "Directory/File Manager not available"
+msgstr "Správce souborů není k dispozici"
+
+#: LYMessages.c:692
+msgid "Location URL is not absolute."
+msgstr "URL není absolutní."
+
+#: LYMessages.c:693
+msgid "Refresh URL is not absolute."
+msgstr "Obnovovací URL není absolutní."
+
+#. #define SENDING_MESSAGE_WITH_BODY_TO
+#: LYMessages.c:695
+msgid ""
+"You are sending a message with body to:\n"
+" "
+msgstr ""
+"Posíláte zprávu na:\n"
+" "
+
+#: LYMessages.c:696
+msgid ""
+"You are sending a comment to:\n"
+" "
+msgstr ""
+"Posíláte komentář na:\n"
+" "
+
+#: LYMessages.c:697
+msgid ""
+"\n"
+" With copy to:\n"
+" "
+msgstr ""
+"\n"
+" S kopií na:\n"
+" "
+
+#: LYMessages.c:698
+msgid ""
+"\n"
+" With copies to:\n"
+" "
+msgstr ""
+"\n"
+" S kopiemi na:\n"
+" "
+
+#. #define CTRL_G_TO_CANCEL_SEND
+#: LYMessages.c:700
+msgid ""
+"\n"
+"\n"
+"Use Ctrl-G to cancel if you do not want to send a message\n"
+msgstr ""
+"\n"
+"\n"
+"Odeslání zprávy můžete zrušit pomocí Ctrl-G.\n"
+
+#. #define ENTER_NAME_OR_BLANK
+#: LYMessages.c:702
+msgid ""
+"\n"
+" Please enter your name, or leave it blank to remain anonymous\n"
+msgstr ""
+"\n"
+" Zadejte vaše jméno, nebo ponechte prázdné, aby jste zůstal v anonymitě.\n"
+
+#. #define ENTER_MAIL_ADDRESS_OR_OTHER
+#: LYMessages.c:704
+msgid ""
+"\n"
+" Please enter a mail address or some other\n"
+msgstr ""
+"\n"
+"Pokud chcete dostat odpovÄ›Ä, udejte adresu\n"
+
+#. #define MEANS_TO_CONTACT_FOR_RESPONSE
+#: LYMessages.c:706
+msgid " means to contact you, if you desire a response.\n"
+msgstr " elektronické poÅ¡ty Äi jiný kontakt na vás.\n"
+
+#: LYMessages.c:707
+msgid ""
+"\n"
+" Please enter a subject line.\n"
+msgstr ""
+"\n"
+" Zadejte předmět.\n"
+
+#. #define ENTER_ADDRESS_FOR_CC
+#: LYMessages.c:709
+msgid ""
+"\n"
+" Enter a mail address for a CC of your message.\n"
+msgstr ""
+"\n"
+" Zadejte adresu pro odeslání kopie této zprávy.\n"
+
+#: LYMessages.c:710
+msgid " (Leave blank if you don't want a copy.)\n"
+msgstr " (Ponechte prázdné, pokud kopie nechcete poslat.)\n"
+
+#: LYMessages.c:711
+msgid ""
+"\n"
+" Please review the message body:\n"
+"\n"
+msgstr ""
+"\n"
+" Zkontrolujte tělo zprávy:\n"
+"\n"
+
+#: LYMessages.c:712
+msgid ""
+"\n"
+"Press RETURN to continue: "
+msgstr ""
+"\n"
+"StisknÄ›te RETURN pro pokraÄování: "
+
+#: LYMessages.c:713
+msgid ""
+"\n"
+"Press RETURN to clean up: "
+msgstr ""
+"\n"
+"Stiskněte RETURN pro úklid: "
+
+#: LYMessages.c:714
+msgid " Use Control-U to erase the default.\n"
+msgstr " Použijte Control-U pro smazání implicitních hodnot.\n"
+
+#: LYMessages.c:715
+msgid ""
+"\n"
+" Please enter your message below."
+msgstr ""
+"\n"
+" Zadejte text vaší zprávy níže."
+
+#. #define ENTER_PERIOD_WHEN_DONE_A
+#: LYMessages.c:717 src/LYNews.c:360
+msgid ""
+"\n"
+" When you are done, press enter and put a single period (.)"
+msgstr ""
+"\n"
+" Až budete hotov, stisknÄ›te enter a napiÅ¡te jednu teÄku (.)"
+
+#. #define ENTER_PERIOD_WHEN_DONE_B
+#: LYMessages.c:719 src/LYNews.c:361
+msgid ""
+"\n"
+" on a line and press enter again."
+msgstr ""
+"\n"
+" na zaÄátek řádku a stisknÄ›te opÄ›t enter."
+
+#. Cookies messages
+#. #define ADVANCED_COOKIE_CONFIRMATION
+#: LYMessages.c:723
+#, c-format
+msgid "%s cookie: %.*s=%.*s Allow? (Y/N/Always/neVer)"
+msgstr "%s cookie: %.*s=%.*s Přijmout? Y)Ano, N)Ne, A)Vždy, V)Nikdy"
+
+#. #define INVALID_COOKIE_DOMAIN_CONFIRMATION
+#: LYMessages.c:725
+#, c-format
+msgid "Accept invalid cookie domain=%s for '%s'?"
+msgstr "Přijmout chybnou cookie doménu (%s) pro '%s'?"
+
+#. #define INVALID_COOKIE_PATH_CONFIRMATION
+#: LYMessages.c:727
+#, c-format
+msgid "Accept invalid cookie path=%s as a prefix of '%s'?"
+msgstr "Přijmout chybnou cookie cestu (%s) jako prefix '%s'?"
+
+#: LYMessages.c:728
+msgid "Allowing this cookie."
+msgstr "Cookie přijmuto."
+
+#: LYMessages.c:729
+msgid "Rejecting this cookie."
+msgstr "Cookie zamítnuto."
+
+#: LYMessages.c:730
+msgid "The Cookie Jar is empty."
+msgstr "Sklad cookies je prázdný."
+
+#: LYMessages.c:731
+msgid "The Cache Jar is empty."
+msgstr "Sklad cache je prázdný."
+
+#. #define ACTIVATE_TO_GOBBLE
+#: LYMessages.c:733
+msgid "Activate links to gobble up cookies or entire domains,"
+msgstr "Aktivovat odkazy pro hromadné přijmutí cookies, nebo"
+
+#: LYMessages.c:734
+msgid "or to change a domain's 'allow' setting."
+msgstr "celých domén, Äi zmÄ›nit nastavení domény."
+
+#: LYMessages.c:735
+msgid "(Cookies never allowed.)"
+msgstr "(Cookies zakázány)"
+
+#: LYMessages.c:736
+msgid "(Cookies always allowed.)"
+msgstr "(Cookies vždy povoleny)"
+
+#: LYMessages.c:737
+msgid "(Cookies allowed via prompt.)"
+msgstr "(Přijetí cookies musí potvrdit uživatel.)"
+
+#: LYMessages.c:738
+msgid "(Persistent Cookies.)"
+msgstr "(Trvalé cookies)"
+
+#: LYMessages.c:739
+msgid "(No title.)"
+msgstr "(Žádný titulek)"
+
+#: LYMessages.c:740
+msgid "(No name.)"
+msgstr "(Žádné jméno)"
+
+#: LYMessages.c:741
+msgid "(No value.)"
+msgstr "(Žádná hodnota)"
+
+#: LYMessages.c:742 src/LYOptions.c:2470
+msgid "None"
+msgstr "Nic"
+
+#: LYMessages.c:743
+msgid "(End of session.)"
+msgstr "(Konec sezení)"
+
+#: LYMessages.c:744
+msgid "Delete this cookie?"
+msgstr "Smazat toto cookie?"
+
+#: LYMessages.c:745
+msgid "The cookie has been eaten!"
+msgstr "Cookie bylo smazáno!"
+
+#: LYMessages.c:746
+msgid "Delete this empty domain?"
+msgstr "Smazat tuto prázdnou doménu?"
+
+#: LYMessages.c:747
+msgid "The domain has been eaten!"
+msgstr "Doména byla smazána!"
+
+#. #define DELETE_COOKIES_SET_ALLOW_OR_CANCEL
+#: LYMessages.c:749
+msgid "D)elete domain's cookies, set allow A)lways/P)rompt/neV)er, or C)ancel? "
+msgstr "D)Smazat cookies z domény, pÅ™ijmout A)Vždy/P)o potvrzení/V)Nikdy Äi C)ZruÅ¡it? "
+
+#. #define DELETE_DOMAIN_SET_ALLOW_OR_CANCEL
+#: LYMessages.c:751
+msgid "D)elete domain, set allow A)lways/P)rompt/neV)er, or C)ancel? "
+msgstr "D)Smazat doménu, pÅ™ijmout A)Vždy/P)o potvrzení/V)Nikdy Äi C)ZruÅ¡it? "
+
+#: LYMessages.c:752
+msgid "All cookies in the domain have been eaten!"
+msgstr "Všechna cookie v této doméně byly smazána!"
+
+#: LYMessages.c:753
+#, c-format
+msgid "'A'lways allowing from domain '%s'."
+msgstr "A)Vždy přijímám z domény '%s'."
+
+#: LYMessages.c:754
+#, c-format
+msgid "ne'V'er allowing from domain '%s'."
+msgstr "V)Nikdy nepřijímám z domény '%s'."
+
+#: LYMessages.c:755
+#, c-format
+msgid "'P'rompting to allow from domain '%s'."
+msgstr "Přijetí z domény '%s' musíte P)otvrdit."
+
+#: LYMessages.c:756
+msgid "Delete all cookies in this domain?"
+msgstr "Smazat všechny cookies v této doméně?"
+
+#: LYMessages.c:757
+msgid "All of the cookies in the jar have been eaten!"
+msgstr "Ůložna cookies byla vyprázdněna!"
+
+#: LYMessages.c:759
+msgid "Port 19 not permitted in URLs."
+msgstr "URL nesmí obsahovat port 19."
+
+#: LYMessages.c:760
+msgid "Port 25 not permitted in URLs."
+msgstr "URL nesmí obsahovat port 25."
+
+#: LYMessages.c:761
+#, c-format
+msgid "Port %lu not permitted in URLs."
+msgstr "URL nesmí obsahovat port %lu."
+
+#: LYMessages.c:762
+msgid "URL has a bad port field."
+msgstr "URL obsahuje chybný port."
+
+#: LYMessages.c:763
+msgid "Maximum nesting of HTML elements exceeded."
+msgstr "Maximální povolený poÄet vnoÅ™ení HTML prvků pÅ™ekroÄen."
+
+#: LYMessages.c:764
+msgid "Bad partial reference! Stripping lead dots."
+msgstr "Chybný relativní odkaz! Odtrhuji úvodní teÄky."
+
+#: LYMessages.c:765
+msgid "Trace Log open failed. Trace off!"
+msgstr "NepodaÅ™ilo se otevřít soubor pro záznam Äinnosti. Sledování vypnuto!"
+
+#: LYMessages.c:766
+msgid "Lynx Trace Log"
+msgstr "Záznam Äinnosti programu Lynx"
+
+#: LYMessages.c:767
+msgid "No trace log has been started for this session."
+msgstr "Pro toto sezení nebylo sledování spuštěno."
+
+#. #define MAX_TEMPCOUNT_REACHED
+#: LYMessages.c:769
+msgid "The maximum temporary file count has been reached!"
+msgstr "Maximální povolený poÄet doÄasných souborů pÅ™ekroÄen!"
+
+#. #define FORM_VALUE_TOO_LONG
+#: LYMessages.c:771
+msgid "Form field value exceeds buffer length! Trim the tail."
+msgstr "Hodnota pole formuláře přesahuje délku bufferu! Zkraťte ji."
+
+#. #define FORM_TAIL_COMBINED_WITH_HEAD
+#: LYMessages.c:773
+msgid "Modified tail combined with head of form field value."
+msgstr "ZmÄ›nÄ›ný konec hodnoty pole formuláře byl spojen s jejím zaÄátkem."
+
+#. HTFile.c
+#: LYMessages.c:776
+msgid "Directory"
+msgstr "Adresář"
+
+#: LYMessages.c:777
+msgid "Directory browsing is not allowed."
+msgstr "Procházení adresářů je zakázáno."
+
+#: LYMessages.c:778
+msgid "Selective access is not enabled for this directory"
+msgstr "Selektivní přístup k tomuto adresáři není zapnut"
+
+#: LYMessages.c:779
+msgid "Multiformat: directory scan failed."
+msgstr "Multiformat: volání scandir pro adresář se nezdařilo."
+
+#: LYMessages.c:780
+msgid "This directory is not readable."
+msgstr "Tento adresář nelze Äíst."
+
+#: LYMessages.c:781
+msgid "Can't access requested file."
+msgstr "Přístup k požadovanému souboru nelze získat."
+
+#: LYMessages.c:782
+msgid "Could not find suitable representation for transmission."
+msgstr "Nelze nalézt vhodný formát dat pro přenos."
+
+#: LYMessages.c:783
+msgid "Could not open file for decompression!"
+msgstr "Soubor pro dekompresi nelze otevřít!"
+
+#: LYMessages.c:784
+msgid "Files:"
+msgstr "Soubory:"
+
+#: LYMessages.c:785
+msgid "Subdirectories:"
+msgstr "Podadresáře:"
+
+#: LYMessages.c:786
+msgid " directory"
+msgstr " adresář"
+
+#: LYMessages.c:787
+msgid "Up to "
+msgstr "O úroveň výše do "
+
+#: LYMessages.c:788
+msgid "Current directory is "
+msgstr "Aktuální adresář je "
+
+#. HTFTP.c
+#: LYMessages.c:791
+msgid "Symbolic Link"
+msgstr "Symbol. odkaz"
+
+#. HTGopher.c
+#: LYMessages.c:794
+msgid "No response from server!"
+msgstr "Od serveru nepÅ™iÅ¡la odpovÄ›Ä!"
+
+#: LYMessages.c:795
+msgid "CSO index"
+msgstr "CSO rejstřík"
+
+#: LYMessages.c:796
+msgid ""
+"\n"
+"This is a searchable index of a CSO database.\n"
+msgstr ""
+"\n"
+"Toto je prohledávatelný rejstřík CSO databáze.\n"
+
+#: LYMessages.c:797
+msgid "CSO Search Results"
+msgstr "Výsledky prohledávání CSO"
+
+#: LYMessages.c:798
+#, c-format
+msgid "Seek fail on %s\n"
+msgstr "Posun ukazovátka pro %s selhal\n"
+
+#: LYMessages.c:799
+msgid ""
+"\n"
+"Press the 's' key and enter search keywords.\n"
+msgstr ""
+"\n"
+"StisknÄ›te klávesu 's' a zadejte hledaná klíÄová slova.\n"
+
+#: LYMessages.c:800
+msgid ""
+"\n"
+"This is a searchable Gopher index.\n"
+msgstr ""
+"\n"
+"Toto je prohledávatelný Gopher rejstřík.\n"
+
+#: LYMessages.c:801
+msgid "Gopher index"
+msgstr "Gopher rejstřík"
+
+#: LYMessages.c:802
+msgid "Gopher Menu"
+msgstr "Gopher Menu"
+
+#: LYMessages.c:803
+msgid " Search Results"
+msgstr " Výsledky hledání"
+
+#: LYMessages.c:804
+msgid "Sending CSO/PH request."
+msgstr "Posílám CSO/PH požadavek."
+
+#: LYMessages.c:805
+msgid "Sending Gopher request."
+msgstr "Posílám Gopher požadavek."
+
+#: LYMessages.c:806
+msgid "CSO/PH request sent; waiting for response."
+msgstr "CSO/PH požadavek poslán; Äekám na odpovÄ›Ä."
+
+#: LYMessages.c:807
+msgid "Gopher request sent; waiting for response."
+msgstr "Gopher požadavek poslán; Äekám na odpovÄ›Ä."
+
+#: LYMessages.c:808
+msgid ""
+"\n"
+"Please enter search keywords.\n"
+msgstr ""
+"\n"
+"Zadejte hledaná klíÄová slova.\n"
+
+#: LYMessages.c:809
+msgid ""
+"\n"
+"The keywords that you enter will allow you to search on a"
+msgstr ""
+"\n"
+"KlíÄová slova, která zadáte, vám umožní hledat"
+
+#: LYMessages.c:810
+msgid " person's name in the database.\n"
+msgstr " jméno osoby v databázi.\n"
+
+#. HTNews.c
+#: LYMessages.c:813
+msgid "Connection closed ???"
+msgstr "Spojení uzavřeno ???"
+
+#: LYMessages.c:814
+msgid "Cannot open temporary file for news POST."
+msgstr "Nelze otevřít doÄasný soubor pro odeslání diskuzního příspÄ›vku."
+
+#: LYMessages.c:815
+msgid "This client does not contain support for posting to news with SSL."
+msgstr "Tento klient nepodporuje zasílání zpráv do diskuzních skupin přes SSL."
+
+#. HTStyle.c
+#: LYMessages.c:818
+#, c-format
+msgid "Style %d `%s' SGML:%s. Font %s %.1f point.\n"
+msgstr "Styl %d `%s' SGML:%s. Písmo %s %.1f bodů.\n"
+
+#: LYMessages.c:820
+#, c-format
+msgid "\tAlign=%d, %d tabs. (%.0f before, %.0f after)\n"
+msgstr "\tZarovnání=%d, %d tabů. (%.0f před, %.0f za)\n"
+
+#: LYMessages.c:821
+#, c-format
+msgid "\t\tTab kind=%d at %.0f\n"
+msgstr "\t\tDruh tabů=%d na %.0f\n"
+
+#. HTTP.c
+#: LYMessages.c:824
+msgid "Can't proceed without a username and password."
+msgstr "Bez uživatelského jména a hesla nelze pokraÄovat."
+
+#: LYMessages.c:825
+msgid "Can't retry with authorization! Contact the server's WebMaster."
+msgstr "Další pokus s autorizací není možný! Kontaktujte příslušného webmastera."
+
+#: LYMessages.c:826
+msgid "Can't retry with proxy authorization! Contact the server's WebMaster."
+msgstr "S proxy autorizací není další pokus možný! Kontaktujte příslušného webmastera."
+
+#: LYMessages.c:827
+msgid "Retrying with proxy authorization information."
+msgstr "Zkouším znovu s proxy autorizací."
+
+#: LYMessages.c:828
+#, c-format
+msgid "SSL error:%s-Continue?"
+msgstr "SSL chyba:%s-PokraÄovat?"
+
+#. HTWAIS.c
+#: LYMessages.c:831
+msgid "HTWAIS: Return message too large."
+msgstr "HTWAIS: OdpovÄ›Ä je příliÅ¡ veliká."
+
+#: LYMessages.c:832
+msgid "Enter WAIS query: "
+msgstr "Zadejte WAIS dotaz: "
+
+#. Miscellaneous status
+#: LYMessages.c:835
+msgid "Retrying as HTTP0 request."
+msgstr "Posílám znovu jako HTTP0 požadavek."
+
+#: LYMessages.c:836
+#, c-format
+msgid "Transferred %d bytes"
+msgstr "Přeneseno bajtů: %d"
+
+#: LYMessages.c:837
+msgid "Data transfer complete"
+msgstr "PÅ™enos dat dokonÄen"
+
+#: LYMessages.c:838
+#, c-format
+msgid "Error processing line %d of %s\n"
+msgstr "Chyba při zpracování %d. řádku souboru%s\n"
+
+#. Lynx internal page titles
+#: LYMessages.c:841
+msgid "Address List Page"
+msgstr "Seznam adres"
+
+#: LYMessages.c:842
+msgid "Bookmark file"
+msgstr "Soubor se záložkami"
+
+#: LYMessages.c:843
+msgid "Configuration Definitions"
+msgstr "Konfigurace"
+
+#: LYMessages.c:844
+msgid "Cookie Jar"
+msgstr "Sklad cookies"
+
+#: LYMessages.c:845
+msgid "Current Edit-Key Map"
+msgstr "Aktuální editovaná klávesová mapa"
+
+#: LYMessages.c:846
+msgid "Current Key Map"
+msgstr "Aktuální klávesová mapa"
+
+#: LYMessages.c:847
+msgid "File Management Options"
+msgstr "Nabídka správce souborů"
+
+#: LYMessages.c:848
+msgid "Download Options"
+msgstr "Možnosti stahování"
+
+#: LYMessages.c:849
+msgid "History Page"
+msgstr "Historie"
+
+#: LYMessages.c:850
+msgid "Cache Jar"
+msgstr "Sklad cache"
+
+#: LYMessages.c:851
+msgid "List Page"
+msgstr "Seznam odkazů"
+
+#: LYMessages.c:852
+msgid "Lynx.cfg Information"
+msgstr "Lynx.cfg Informace"
+
+#: LYMessages.c:853
+msgid "Converted Mosaic Hotlist"
+msgstr "Převedený 'Hotlist' Mosaicu"
+
+#: LYMessages.c:854
+msgid "Options Menu"
+msgstr "KonfiguraÄní menu"
+
+#: LYMessages.c:855
+msgid "File Permission Options"
+msgstr "Menu nastavení práv souboru"
+
+#: LYMessages.c:856
+msgid "Printing Options"
+msgstr "Menu voleb tisku"
+
+#: LYMessages.c:857
+msgid "Information about the current document"
+msgstr "Informace o aktuálním dokumentu"
+
+#: LYMessages.c:858
+msgid "Your recent statusline messages"
+msgstr "Zprávy stavové řádky"
+
+#: LYMessages.c:859
+msgid "Upload Options"
+msgstr "Menu voleb posílání (uploadu)"
+
+#: LYMessages.c:860
+msgid "Visited Links Page"
+msgstr "Navštívené odkazy"
+
+#. CONFIG_DEF_TITLE subtitles
+#: LYMessages.c:863
+msgid "See also"
+msgstr "Viz též"
+
+#: LYMessages.c:864
+msgid "your"
+msgstr "váš"
+
+#: LYMessages.c:865
+msgid "for runtime options"
+msgstr "pro aktuální konfiguraci"
+
+#: LYMessages.c:866
+msgid "compile time options"
+msgstr "volby zadané při sestavování"
+
+#: LYMessages.c:867
+msgid "color-style configuration"
+msgstr "konfigurace barevného stylu"
+
+#: LYMessages.c:868
+msgid "latest release"
+msgstr "poslední verze"
+
+#: LYMessages.c:869
+msgid "pre-release version"
+msgstr "vývojová verze (pre-release)"
+
+#: LYMessages.c:870
+msgid "development version"
+msgstr "vývojová verze"
+
+#. #define AUTOCONF_CONFIG_CACHE
+#: LYMessages.c:872
+msgid ""
+"The following data were derived during the automatic configuration/build\n"
+"process of this copy of Lynx. When reporting a bug, please include a copy\n"
+"of this page."
+msgstr ""
+"Následující údaje byly získány při automatické konfiguraci a sestavéní této\n"
+"kopie programu Lynx. Při oznamování chyby přiložte kopii této stránky."
+
+#. #define AUTOCONF_LYNXCFG_H
+#: LYMessages.c:876
+msgid ""
+"The following data were used as automatically-configured compile-time\n"
+"definitions when this copy of Lynx was built."
+msgstr ""
+"Následující údaje byly získány při automatické konfiguraci a použity při\n"
+"sestavení této kopie programu Lynx."
+
+#. #define DIRED_NOVICELINE
+#: LYMessages.c:881
+msgid " C)reate D)ownload E)dit F)ull menu M)odify R)emove T)ag U)pload \n"
+msgstr " C)VytvoÅ™it D)Stáhnout E)ditovat F)Úplné menu R)Smazat T)OznaÄit U)Poslat \n"
+
+#: LYMessages.c:882
+msgid "Failed to obtain status of current link!"
+msgstr "Nepodařilo se zjistit status aktuálního odkazu!"
+
+#. #define INVALID_PERMIT_URL
+#: LYMessages.c:885
+msgid "Special URL only valid from current File Permission menu!"
+msgstr "Zvláštní URL je platné pouze z aktuálního menu nastavení práv souboru!"
+
+#: LYMessages.c:889
+msgid "External support is currently disabled."
+msgstr "Spouštění externích programů je nyní zakázáno."
+
+#. new with 2.8.4dev.21
+#: LYMessages.c:893
+msgid "Changing working-directory is currently disabled."
+msgstr "Možnost změny pracovního adresáře je nyní vypnuta."
+
+#: LYMessages.c:894
+msgid "Linewrap OFF!"
+msgstr "Zalamování řádků VYPNUTO!"
+
+#: LYMessages.c:895
+msgid "Linewrap ON!"
+msgstr "Zalamování řádků ZAPNUTO!"
+
+#: LYMessages.c:896
+msgid "Parsing nested-tables toggled OFF! Reloading..."
+msgstr "Zpracování vnoÅ™ených tabulek VYPNUTO! Znovu naÄítám..."
+
+#: LYMessages.c:897
+msgid "Parsing nested-tables toggled ON! Reloading..."
+msgstr "Zpracování vnoÅ™ených tabulek ZAPNUTO! Znovu naÄítám..."
+
+#: LYMessages.c:898
+msgid "Shifting is disabled while line-wrap is in effect"
+msgstr "Posouvání je vypnuto, pokud funguje zalamování řádků"
+
+#: LYMessages.c:899
+msgid "Trace not supported"
+msgstr "Sledování není povoleno"
+
+#: LYMessages.c:819
+#, c-format
+msgid "\tIndents: first=%.0f others=%.0f, Height=%.1f Desc=%.1f\n"
+msgstr "\tOdsazení: první=%.0f další=%.0f, Výška=%.1f Popis=%.1f\n"
+
+#: WWW/Library/Implementation/HTAABrow.c:575
+#, c-format
+msgid "username for realm %s changed from %s to %s"
+msgstr "Uživatelské jméno pro server %s změněno z %s na %s"
+
+#: WWW/Library/Implementation/HTAABrow.c:591
+#, c-format
+msgid "password for realm %s user %s changed"
+msgstr "heslo pro server %s uživatele %s změněno"
+
+#: WWW/Library/Implementation/HTAABrow.c:703
+#, c-format
+msgid "Username for '%s' at %s '%s%s':"
+msgstr "Uživatelské jméno pro '%s' na %s '%s%s':"
+
+#: WWW/Library/Implementation/HTAABrow.c:976
+msgid "This client doesn't know how to compose proxy authorization information for scheme"
+msgstr "Tento klient neumí vytvoÅ™it proxy autorizaÄní informace pro schéma"
+
+#: WWW/Library/Implementation/HTAABrow.c:1053
+msgid "This client doesn't know how to compose authorization information for scheme"
+msgstr "Tento klient neumí vytvoÅ™it autorizaÄní informace pro schéma"
+
+#: WWW/Library/Implementation/HTAABrow.c:1162
+#, c-format
+msgid "Invalid header '%s%s%s%s%s'"
+msgstr "Chybná hlaviÄka '%s%s%s%s%s'"
+
+#: WWW/Library/Implementation/HTAABrow.c:1266
+msgid "Proxy authorization required -- retrying"
+msgstr "Proxy vyžaduje autorizaci -- zkouším znovu"
+
+#: WWW/Library/Implementation/HTAABrow.c:1322
+msgid "Access without authorization denied -- retrying"
+msgstr "Přístup není bez autorizace povolen -- zkouším znovu"
+
+#: WWW/Library/Implementation/HTAccess.c:698
+msgid "Access forbidden by rule"
+msgstr "Přístup odmítnut implicitním pravidlem"
+
+#: WWW/Library/Implementation/HTAccess.c:800
+msgid "Document with POST content not found in cache. Resubmit?"
+msgstr "Dokument s POST obsahem nenalezen v cache. Odeslat znovu?"
+
+#: WWW/Library/Implementation/HTAccess.c:953
+msgid "Loading failed, use a previous copy."
+msgstr "NaÄítání selhalo, použijte dřívÄ›jší kopii."
+
+#: WWW/Library/Implementation/HTAccess.c:1062 src/GridText.c:8928
+msgid "Loading incomplete."
+msgstr "NaÄítání nedokonÄeno."
+
+#: WWW/Library/Implementation/HTAccess.c:1093
+#, c-format
+msgid "**** HTAccess: socket or file number returned by obsolete load routine!\n"
+msgstr "**** HTAccess: soket Äi Äíslo souboru vráceno zastaralou load funkcí!\n"
+
+#: WWW/Library/Implementation/HTAccess.c:1095
+#, c-format
+msgid "**** HTAccess: Internal software error. Please mail lynx-dev@nongnu.org!\n"
+msgstr "**** HTAccess: Vnitřní chyba programu. Zašlete oznámení na lynx-dev@nongnu.org!\n"
+
+#: WWW/Library/Implementation/HTAccess.c:1096
+#, c-format
+msgid "**** HTAccess: Status returned was: %d\n"
+msgstr "**** HTAccess: Návratový status: %d\n"
+
+#.
+#. * hack: if we fail in HTAccess.c
+#. * avoid duplicating URL, oh.
+#.
+#: WWW/Library/Implementation/HTAccess.c:1102 src/LYMainLoop.c:8076
+msgid "Can't Access"
+msgstr "Nelze získat přístup"
+
+#: WWW/Library/Implementation/HTAccess.c:1110
+msgid "Unable to access document."
+msgstr "Nelze získat přístup k dokumentu."
+
+#: WWW/Library/Implementation/HTFTP.c:870
+#, c-format
+msgid "Enter password for user %s@%s:"
+msgstr "Zadejte heslo pro uživatele %s@%s:"
+
+#: WWW/Library/Implementation/HTFTP.c:898
+msgid "Unable to connect to FTP host."
+msgstr "Nelze navázat spojení s FTP serverem."
+
+#: WWW/Library/Implementation/HTFTP.c:1137
+msgid "close master socket"
+msgstr "zavřít hlavní soket"
+
+#: WWW/Library/Implementation/HTFTP.c:1194
+msgid "socket for master socket"
+msgstr "hlavní soket"
+
+#: WWW/Library/Implementation/HTFTP.c:2922
+msgid "Receiving FTP directory."
+msgstr "Stahuji výpis FTP adresáře."
+
+#: WWW/Library/Implementation/HTFTP.c:3060
+#, c-format
+msgid "Transferred %d bytes (%5d)"
+msgstr "Přeneseno bajtů: %d (%5d)"
+
+#: WWW/Library/Implementation/HTFTP.c:3417
+msgid "connect for data"
+msgstr "datové spojení"
+
+#: WWW/Library/Implementation/HTFTP.c:4094
+msgid "Receiving FTP file."
+msgstr "Stahuji FTP soubor."
+
+#: WWW/Library/Implementation/HTFinger.c:274
+msgid "Could not set up finger connection."
+msgstr "Spojení s finger serverem nelze navázat."
+
+#: WWW/Library/Implementation/HTFinger.c:321
+msgid "Could not load data (no sitename in finger URL)"
+msgstr "Nemohu naÄíst data (finger URL neobsahuje jméno serveru)"
+
+#: WWW/Library/Implementation/HTFinger.c:325
+msgid "Invalid port number - will only use port 79!"
+msgstr "Chybné Äíslo portu - používám pouze port 79!"
+
+#: WWW/Library/Implementation/HTFinger.c:391
+msgid "Could not access finger host."
+msgstr "Spojení s finger serverem nelze navázat."
+
+#: WWW/Library/Implementation/HTFinger.c:399
+msgid "No response from finger server."
+msgstr "Od finger serveru nepÅ™iÅ¡la žádná odpovÄ›Ä."
+
+#: WWW/Library/Implementation/HTNews.c:439
+#, c-format
+msgid "Username for news host '%s':"
+msgstr "Uživatelské jméno na news serveru '%s':"
+
+#: WWW/Library/Implementation/HTNews.c:492
+msgid "Change username?"
+msgstr "Změnit uživatelské jméno?"
+
+#: WWW/Library/Implementation/HTNews.c:496
+msgid "Username:"
+msgstr "Uživatelské jméno:"
+
+#: WWW/Library/Implementation/HTNews.c:521
+#, c-format
+msgid "Password for news host '%s':"
+msgstr "Heslo na news serveru '%s':"
+
+#: WWW/Library/Implementation/HTNews.c:604
+msgid "Change password?"
+msgstr "Změnit heslo?"
+
+#: WWW/Library/Implementation/HTNews.c:1725
+#, c-format
+msgid "No matches for: %s"
+msgstr "%s nic nevyhovuje"
+
+#: WWW/Library/Implementation/HTNews.c:1775
+msgid ""
+"\n"
+"No articles in this group.\n"
+msgstr ""
+"\n"
+"Tato skupina neobsahuje žádné příspěvky.\n"
+
+#: WWW/Library/Implementation/HTNews.c:1787
+msgid ""
+"\n"
+"No articles in this range.\n"
+msgstr ""
+"\n"
+"V zadaném intervalu se nenacházejí žádné příspěvky.\n"
+
+#.
+#. * Set window title.
+#.
+#: WWW/Library/Implementation/HTNews.c:1800
+#, c-format
+msgid "%s, Articles %d-%d"
+msgstr "%s, Příspěvky %d-%d"
+
+#: WWW/Library/Implementation/HTNews.c:1823
+msgid "Earlier articles"
+msgstr "Předchozí příspěvky"
+
+#: WWW/Library/Implementation/HTNews.c:1836
+#, c-format
+msgid ""
+"\n"
+"There are about %d articles currently available in %s, IDs as follows:\n"
+"\n"
+msgstr ""
+"\n"
+"PoÄet Älánků v %2$s: %1$d. ID jsou následující:\n"
+"\n"
+
+#: WWW/Library/Implementation/HTNews.c:1898
+msgid "All available articles in "
+msgstr "Všechny dostupné příspěvky v "
+
+#: WWW/Library/Implementation/HTNews.c:2112
+msgid "Later articles"
+msgstr "Pozdější příspěvky"
+
+#: WWW/Library/Implementation/HTNews.c:2135
+msgid "Post to "
+msgstr "Poslat do "
+
+#: WWW/Library/Implementation/HTNews.c:2356
+msgid "This client does not contain support for SNEWS URLs."
+msgstr "Tento klient nepodporuje SNEWS URL."
+
+#: WWW/Library/Implementation/HTNews.c:2563
+msgid "No target for raw text!"
+msgstr "Žádný cíl pro prostý text!"
+
+#: WWW/Library/Implementation/HTNews.c:2593
+msgid "Connecting to NewsHost ..."
+msgstr "Navazuji spojení s news serverem..."
+
+#: WWW/Library/Implementation/HTNews.c:2645
+#, c-format
+msgid "Could not access %s."
+msgstr "S %s nelze navázat spojení."
+
+#: WWW/Library/Implementation/HTNews.c:2751
+#, c-format
+msgid "Can't read news info. News host %.20s responded: %.200s"
+msgstr "Informace o diskuzních skupinách nelze získat. News server %.20s odpověděl %.200s"
+
+#: WWW/Library/Implementation/HTNews.c:2755
+#, c-format
+msgid "Can't read news info, empty response from host %s"
+msgstr "Informace o diskuzních skupinách nelze získat, prázdná odpovÄ›Ä od serveru %s"
+
+#.
+#. * List available newsgroups. - FM
+#.
+#: WWW/Library/Implementation/HTNews.c:2959
+msgid "Reading list of available newsgroups."
+msgstr "Čtu seznam dostupných diskuzních skupin."
+
+#: WWW/Library/Implementation/HTNews.c:2980
+msgid "Reading list of articles in newsgroup."
+msgstr "ÄŒtu seznam Älánků v diskuzní skupinÄ›."
+
+#.
+#. * Get an article from a news group. - FM
+#.
+#: WWW/Library/Implementation/HTNews.c:2986
+msgid "Reading news article."
+msgstr "Čtu příspěvek z diskuzní skupiny."
+
+#: WWW/Library/Implementation/HTNews.c:3016
+msgid "Sorry, could not load requested news."
+msgstr "Lituji, požadované diskuzní příspěvky nelze stáhnout."
+
+#: WWW/Library/Implementation/HTTCP.c:1339
+msgid "Address has invalid port"
+msgstr "Adresa má chybný port"
+
+#: WWW/Library/Implementation/HTTCP.c:1410
+msgid "Address length looks invalid"
+msgstr "Délka adresy se zdá být chybnou"
+
+#: WWW/Library/Implementation/HTTCP.c:1862
+#: WWW/Library/Implementation/HTTCP.c:1880
+#, c-format
+msgid "Unable to locate remote host %s."
+msgstr "Adresu poÄítaÄe %s nelze zjistit."
+
+#. Not HTProgress, so warning won't be overwritten immediately;
+#. * but not HTAlert, because typically there will be other
+#. * alerts from the callers. - kw
+#.
+#: WWW/Library/Implementation/HTTCP.c:1877
+#: WWW/Library/Implementation/HTTelnet.c:115
+#, c-format
+msgid "Invalid hostname %s"
+msgstr "Jméno poÄítaÄe %s je chybné"
+
+#: WWW/Library/Implementation/HTTCP.c:1891
+#, c-format
+msgid "Making %s connection to %s"
+msgstr "Navazuji %s spojení s %s"
+
+#: WWW/Library/Implementation/HTTCP.c:1902
+msgid "socket failed."
+msgstr "chyba soketu."
+
+#: WWW/Library/Implementation/HTTCP.c:1916
+#, c-format
+msgid "socket failed: family %d addr %s port %s."
+msgstr "chyba soketu: rodina %d adresa %s port %s."
+
+#: WWW/Library/Implementation/HTTCP.c:1940
+msgid "Could not make connection non-blocking."
+msgstr "Soket nelze nastavit jako neblokující."
+
+#: WWW/Library/Implementation/HTTCP.c:2006
+msgid "Connection failed (too many retries)."
+msgstr "Spojení se nepodařilo navázat (příliš mnoho pokusů)."
+
+#: WWW/Library/Implementation/HTTCP.c:2201
+msgid "Could not restore socket to blocking."
+msgstr "Soket nelze nastavit jako blokující."
+
+#: WWW/Library/Implementation/HTTCP.c:2271
+msgid "Socket read failed (too many tries)."
+msgstr "NepodaÅ™ilo se pÅ™eÄíst soket (příliÅ¡ mnoho pokusů)."
+
+#: WWW/Library/Implementation/HTTP.c:165
+#, c-format
+msgid "SSL callback:%s, preverify_ok=%d, ssl_okay=%d"
+msgstr "SSL odezva:%s, preverify_ok=%d, ssl_okay=%d"
+
+#: WWW/Library/Implementation/HTTP.c:668
+#, c-format
+msgid "User/password contains only punctuation: %s"
+msgstr "Uživatel/heslo obsahuje pouze interpunkci: %s"
+
+#: WWW/Library/Implementation/HTTP.c:672
+#, c-format
+msgid "User/password may be confused with hostname: '%s' (e.g, '%s')"
+msgstr "Uživatel/heslo by mohlo být zamÄ›nÄ›no se jménem poÄítaÄe: '%s' (napÅ™. '%s')"
+
+#: WWW/Library/Implementation/HTTP.c:733
+#, c-format
+msgid "Certificate issued by: %s"
+msgstr "Certifikát vydán: %s"
+
+#: WWW/Library/Implementation/HTTP.c:920
+msgid "This client does not contain support for HTTPS URLs."
+msgstr "Tento klient nepodporuje HTTPS URL."
+
+#: WWW/Library/Implementation/HTTP.c:945
+msgid "Unable to connect to remote host."
+msgstr "Spojení se vzdáleným poÄítaÄem nelze navázat."
+
+#: WWW/Library/Implementation/HTTP.c:988
+msgid "Retrying connection without TLS."
+msgstr "Opětovně navazuji spojení bez TLS."
+
+#: WWW/Library/Implementation/HTTP.c:1040
+msgid "GnuTLS error when trying to verify certificate."
+msgstr "Chyba GnuTLS při ověřování certifikátu."
+
+#: WWW/Library/Implementation/HTTP.c:1053
+msgid "the certificate has no known issuer"
+msgstr "certifikát nemá žádného známého vydavatele"
+
+#: WWW/Library/Implementation/HTTP.c:1055
+msgid "no issuer was found"
+msgstr "žádný vydavatel nebyl nalezen"
+
+#: WWW/Library/Implementation/HTTP.c:1057
+msgid "issuer is not a CA"
+msgstr "vydavatel není CA"
+
+#: WWW/Library/Implementation/HTTP.c:1059
+msgid "the certificate has been revoked"
+msgstr "certifikát byl anulován"
+
+#: WWW/Library/Implementation/HTTP.c:1061
+msgid "the certificate is not trusted"
+msgstr "certifikát není důvěryhodný"
+
+#: WWW/Library/Implementation/HTTP.c:1136
+#, c-format
+msgid "Verified connection to %s (cert=%s)"
+msgstr "Ověřené připojení k %s (cert=%s)"
+
+#: WWW/Library/Implementation/HTTP.c:1186
+#: WWW/Library/Implementation/HTTP.c:1228
+#, c-format
+msgid "Verified connection to %s (subj=%s)"
+msgstr "Ověřené připojení k %s (subj=%s)"
+
+#: WWW/Library/Implementation/HTTP.c:1258
+msgid "Can't find common name in certificate"
+msgstr "V certifikátu nelze nalézt spoleÄné jméno"
+
+#: WWW/Library/Implementation/HTTP.c:1261
+#, c-format
+msgid "SSL error:host(%s)!=cert(%s)-Continue?"
+msgstr "SSL chyba:poÄítaÄ(%s)!=cert(%s)-PokraÄovat?"
+
+#: WWW/Library/Implementation/HTTP.c:1268
+msgid "SSL error"
+msgstr "SSL chyba"
+
+#: WWW/Library/Implementation/HTTP.c:1276
+#, c-format
+msgid "UNVERIFIED connection to %s (cert=%s)"
+msgstr "NEOVĚŘENÉ připojení k %s (cert=%s)"
+
+#: WWW/Library/Implementation/HTTP.c:1285
+#, c-format
+msgid "Secure %d-bit %s (%s) HTTP connection"
+msgstr "ZabezpeÄené %d-bitové %s (%s) HTTP pÅ™ipojení."
+
+#: WWW/Library/Implementation/HTTP.c:1755
+msgid "Sending HTTP request."
+msgstr "Odesílám HTTP požadavek."
+
+#: WWW/Library/Implementation/HTTP.c:1797
+msgid "Unexpected network write error; connection aborted."
+msgstr "NeoÄekávaná chyba pÅ™i zápisu na soket; spojení uzavÅ™eno."
+
+#: WWW/Library/Implementation/HTTP.c:1803
+msgid "HTTP request sent; waiting for response."
+msgstr "HTTP požadavek odeslán; Äekám na odpovÄ›Ä."
+
+#: WWW/Library/Implementation/HTTP.c:1876
+#: WWW/Library/Implementation/HTTP.c:1886
+msgid "Unexpected network read error; connection aborted."
+msgstr "NeoÄekávaná chyba pÅ™i Ätení ze soketu; spojení uzavÅ™eno."
+
+#.
+#. * HTTP/1.1 Informational statuses.
+#. * 100 Continue.
+#. * 101 Switching Protocols.
+#. * > 101 is unknown.
+#. * We should never get these, and they have only the status
+#. * line and possibly other headers, so we'll deal with them by
+#. * showing the full header to the user as text/plain. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2089
+msgid "Got unexpected Informational Status."
+msgstr "NeoÄekávané InformaÄní hlášení."
+
+#.
+#. * Reset Content. The server has fulfilled the request but
+#. * nothing is returned and we should reset any form
+#. * content. We'll instruct the user to do that, and
+#. * restore the current document. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2123
+msgid "Request fulfilled. Reset Content."
+msgstr "Požadavek vyřízen. Obsah formuláře smazán."
+
+#. Not Modified
+#.
+#. * We didn't send an "If-Modified-Since" header, so this
+#. * status is inappropriate. We'll deal with it by showing
+#. * the full header to the user as text/plain. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2240
+msgid "Got unexpected 304 Not Modified status."
+msgstr "NeoÄekávané hlášení: 304 Not Modified."
+
+#: WWW/Library/Implementation/HTTP.c:2303
+msgid "Redirection of POST content requires user approval."
+msgstr "Přesměrování POST obsahu vyžaduje souhlas uživatele."
+
+#: WWW/Library/Implementation/HTTP.c:2318
+msgid "Have POST content. Treating Permanent Redirection as Temporary.\n"
+msgstr "Obsahuje POST data. Trvalé pÅ™esmÄ›rování používám pouze jako doÄasné.\n"
+
+#: WWW/Library/Implementation/HTTP.c:2364
+msgid "Retrying with access authorization information."
+msgstr "Zkouším to znovu s proxy autorizací."
+
+#: WWW/Library/Implementation/HTTP.c:2376
+msgid "Show the 401 message body?"
+msgstr "Zobrazit tělo 401 hlášení?"
+
+#: WWW/Library/Implementation/HTTP.c:2420
+msgid "Show the 407 message body?"
+msgstr "Zobrazit tělo 407 hlášení?"
+
+#.
+#. * Bad or unknown server_status number. Take a chance and hope
+#. * there is something to display. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2520
+msgid "Unknown status reply from server!"
+msgstr "Neznámé hlášení od serveru!"
+
+#: WWW/Library/Implementation/HTTelnet.c:113
+#, c-format
+msgid "remote %s session:"
+msgstr "vzdálené %s sezení:"
+
+#: WWW/Library/Implementation/HTWAIS.c:163
+msgid "Could not connect to WAIS server."
+msgstr "Spojení s WAIS serverem nelze navázat."
+
+#: WWW/Library/Implementation/HTWAIS.c:171
+msgid "Could not open WAIS connection for reading."
+msgstr "WAIS nelze pro Ätení otevřít."
+
+#: WWW/Library/Implementation/HTWAIS.c:193
+msgid "Diagnostic code is "
+msgstr "Diagnostický kód je "
+
+#: WWW/Library/Implementation/HTWAIS.c:460
+msgid "Index "
+msgstr "Rejstřík "
+
+#: WWW/Library/Implementation/HTWAIS.c:464
+#, c-format
+msgid " contains the following %d item%s relevant to \""
+msgstr " obsahuje %d následujících položek%s vztahujících se k \""
+
+#: WWW/Library/Implementation/HTWAIS.c:472
+msgid "The first figure after each entry is its relative score, "
+msgstr "Za každou položkou následuje nejprve její bodové ohodnocení "
+
+#: WWW/Library/Implementation/HTWAIS.c:473
+msgid "the second is the number of lines in the item."
+msgstr "a poté poÄet řádků."
+
+#: WWW/Library/Implementation/HTWAIS.c:515
+msgid " (bad file name)"
+msgstr " (chybné jméno souboru)"
+
+#: WWW/Library/Implementation/HTWAIS.c:541
+msgid "(bad doc id)"
+msgstr "(chybné id dokumentu)"
+
+#: WWW/Library/Implementation/HTWAIS.c:557
+msgid "(Short Header record, can't display)"
+msgstr "('Short Header' záznam, nelze zobrazit)"
+
+#: WWW/Library/Implementation/HTWAIS.c:564
+msgid ""
+"\n"
+"Long Header record, can't display\n"
+msgstr ""
+"\n"
+"'Long Header' záznam, nelze zobrazit\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:571
+msgid ""
+"\n"
+"Text record\n"
+msgstr ""
+"\n"
+"Textový záznam\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:580
+msgid ""
+"\n"
+"Headline record, can't display\n"
+msgstr ""
+"\n"
+"'Headline' záznam, nelze zobrazit\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:588
+msgid ""
+"\n"
+"Code record, can't display\n"
+msgstr ""
+"\n"
+"'Code' záznam, nelze zobrazit\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:692
+msgid "Syntax error in WAIS URL"
+msgstr "Syntaktická chyba ve WAIS URL"
+
+#: WWW/Library/Implementation/HTWAIS.c:764
+msgid " (WAIS Index)"
+msgstr " (WAIS rejstřík)"
+
+#: WWW/Library/Implementation/HTWAIS.c:771
+msgid "WAIS Index: "
+msgstr "WAIS rejstřík: "
+
+#: WWW/Library/Implementation/HTWAIS.c:777
+msgid "This is a link for searching the "
+msgstr "Tento odkaz ukazuje na prohledávaÄ "
+
+#: WWW/Library/Implementation/HTWAIS.c:781
+msgid " WAIS Index.\n"
+msgstr " WAIS rejstříku.\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:810
+msgid ""
+"\n"
+"Enter the 's'earch command and then specify search words.\n"
+msgstr ""
+"\n"
+"Stiskněte 's' pro hledání a pak zadejte hledaná slova.\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:832
+msgid " (in "
+msgstr " (v "
+
+#: WWW/Library/Implementation/HTWAIS.c:841
+msgid "WAIS Search of \""
+msgstr "WAIS hledání \""
+
+#: WWW/Library/Implementation/HTWAIS.c:845
+msgid "\" in: "
+msgstr "\" v: "
+
+#: WWW/Library/Implementation/HTWAIS.c:860
+msgid "HTWAIS: Request too large."
+msgstr "HTWAIS: požadavek příliš dlouhý."
+
+#: WWW/Library/Implementation/HTWAIS.c:869
+msgid "Searching WAIS database..."
+msgstr "Prohledávám WAIS databázi..."
+
+#: WWW/Library/Implementation/HTWAIS.c:879
+msgid "Search interrupted."
+msgstr "Hledání přerušeno."
+
+#: WWW/Library/Implementation/HTWAIS.c:930
+msgid "Can't convert format of WAIS document"
+msgstr "Formát WAIS dokumentu nelze převést"
+
+#: WWW/Library/Implementation/HTWAIS.c:974
+msgid "HTWAIS: Request too long."
+msgstr "HTWAIS: požadavek příliš dlouhý."
+
+#.
+#. * Actually do the transaction given by request_message.
+#.
+#: WWW/Library/Implementation/HTWAIS.c:988
+msgid "Fetching WAIS document..."
+msgstr "Stahuji WAIS dokument..."
+
+#. display_search_response(target, retrieval_response,
+#. wais_database, keywords);
+#: WWW/Library/Implementation/HTWAIS.c:1027
+msgid "No text was returned!\n"
+msgstr "Žádná odpovÄ›Ä!\n"
+
+#: WWW/Library/Implementation/HTWSRC.c:302
+msgid " NOT GIVEN in source file; "
+msgstr " NENACHÃZà se ve zdrojovém souboru; "
+
+#: WWW/Library/Implementation/HTWSRC.c:325
+msgid " WAIS source file"
+msgstr " zdrojový soubor WAIS"
+
+#: WWW/Library/Implementation/HTWSRC.c:332
+msgid " description"
+msgstr " popis"
+
+#: WWW/Library/Implementation/HTWSRC.c:342
+msgid "Access links"
+msgstr "Odkazy"
+
+#: WWW/Library/Implementation/HTWSRC.c:363
+msgid "Direct access"
+msgstr "Přímý přístup"
+
+#. * Proxy will be used if defined, so let user know that - FM *
+#: WWW/Library/Implementation/HTWSRC.c:366
+msgid " (or via proxy server, if defined)"
+msgstr " (Äi, pokud je definován, pÅ™es proxy server)"
+
+#: WWW/Library/Implementation/HTWSRC.c:381
+msgid "Maintainer"
+msgstr "Správce"
+
+#: WWW/Library/Implementation/HTWSRC.c:389
+msgid "Host"
+msgstr "PoÄítaÄ"
+
+#: src/GridText.c:723
+msgid "Memory exhausted, display interrupted!"
+msgstr "Došla paměť, zobrazení přerušeno!"
+
+#: src/GridText.c:728
+msgid "Memory exhausted, will interrupt transfer!"
+msgstr "Došla paměť, přenos přerušen!"
+
+#: src/GridText.c:1719
+#, c-format
+msgid " (l%d of %d)"
+msgstr " (l%d z %d)"
+
+#: src/GridText.c:1728
+#, c-format
+msgid " (p%d of %d)"
+msgstr " (s%d z %d)"
+
+#: src/GridText.c:3713
+msgid " *** MEMORY EXHAUSTED ***"
+msgstr " *** DOŠLA PAMĚŤ ***"
+
+#: src/GridText.c:6211
+msgid "text entry field"
+msgstr "textové vstupní pole"
+
+#: src/GridText.c:6214
+msgid "password entry field"
+msgstr "vstupní pole pro heslo"
+
+#: src/GridText.c:6217
+msgid "checkbox"
+msgstr "zaÅ¡krtávací políÄko"
+
+#: src/GridText.c:6220
+msgid "radio button"
+msgstr "pÅ™epínací tlaÄítko"
+
+#: src/GridText.c:6223
+msgid "submit button"
+msgstr "tlaÄítko pro odeslání dat serveru"
+
+#: src/GridText.c:6226
+msgid "reset button"
+msgstr "tlaÄítko pro obnovení implicitních hodnot"
+
+#: src/GridText.c:6229
+msgid "script button"
+msgstr "skriptové tlaÄítko"
+
+#: src/GridText.c:6232
+msgid "popup menu"
+msgstr "vyskakovací menu"
+
+#: src/GridText.c:6235
+msgid "hidden form field"
+msgstr "skryté pole formuláře"
+
+#: src/GridText.c:6238
+msgid "text entry area"
+msgstr "textová vstupní oblast"
+
+#: src/GridText.c:6241
+msgid "range entry field"
+msgstr "vstupní pole pro interval"
+
+#: src/GridText.c:6244
+msgid "file entry field"
+msgstr "pole pro výběr souboru"
+
+#: src/GridText.c:6247
+msgid "text-submit field"
+msgstr "pole pro odeslání textu"
+
+#: src/GridText.c:6250
+msgid "image-submit button"
+msgstr "tlaÄítko pro odeslání obrázku"
+
+#: src/GridText.c:6253
+msgid "keygen field"
+msgstr "pole pro vytvoÅ™ení klíÄe"
+
+#: src/GridText.c:6256
+msgid "unknown form field"
+msgstr "neznámé pole formuláře"
+
+#: src/GridText.c:6276 src/GridText.c:6283 src/LYList.c:249
+msgid "unknown field or link"
+msgstr "neznámé pole Äi odkaz"
+
+#: src/GridText.c:10711
+msgid "Can't open file for uploading"
+msgstr "Soubor nelze otevřít pro nahrání (upload)"
+
+#: src/GridText.c:11899
+#, c-format
+msgid "Submitting %s"
+msgstr "Odesílám %s"
+
+#. ugliness has happened; inform user and do the best we can
+#: src/GridText.c:12969
+msgid "Hang Detect: TextAnchor struct corrupted - suggest aborting!"
+msgstr "ZjiÅ¡tÄ›no zablokování: struktura TextAnchor poÅ¡kozená - doporuÄuji ukonÄit!"
+
+#. don't show previous state
+#: src/GridText.c:13128
+msgid "Wrap lines to fit displayed area?"
+msgstr "Zalamovat dlouhé řádky, aby se vešly na obrazovku?"
+
+#: src/GridText.c:13758
+msgid "Very long lines have been truncated!"
+msgstr "Příliš dlouhé řádky byly ořezány!"
+
+#: src/HTAlert.c:164 src/LYShowInfo.c:389 src/LYShowInfo.c:393
+msgid "bytes"
+msgstr "bajtů"
+
+#.
+#. * If we know the total size of the file, we can compute
+#. * a percentage, and show a corresponding progress bar.
+#.
+#: src/HTAlert.c:328 src/HTAlert.c:354
+#, c-format
+msgid "Read %s of data"
+msgstr "Množství přenesených dat: %s"
+
+#: src/HTAlert.c:351
+#, c-format
+msgid "Read %s of %s of data"
+msgstr "Množství přenesených dat: %s/%s"
+
+#: src/HTAlert.c:360
+#, c-format
+msgid ", %s/sec"
+msgstr ", %s/s"
+
+#: src/HTAlert.c:374
+#, c-format
+msgid " (stalled for %s)"
+msgstr " (zamrznut %s)"
+
+#: src/HTAlert.c:378
+#, c-format
+msgid ", ETA %s"
+msgstr ", zbývá %s"
+
+#: src/HTAlert.c:400
+msgid " (Press 'z' to abort)"
+msgstr " (StisknÄ›te 'z' pro ukonÄení)"
+
+#. Meta-note: don't move the following note from its place right
+#. in front of the first gettext(). As it is now, it should
+#. automatically appear in generated lynx.pot files. - kw
+#.
+#. NOTE TO TRANSLATORS: If you provide a translation for "yes", lynx
+#. * will take the first byte of the translation as a positive response
+#. * to Yes/No questions. If you provide a translation for "no", lynx
+#. * will take the first byte of the translation as a negative response
+#. * to Yes/No questions. For both, lynx will also try to show the
+#. * first byte in the prompt as a character, instead of (y) or (n),
+#. * respectively. This will not work right for multibyte charsets!
+#. * Don't translate "yes" and "no" for CJK character sets (or translate
+#. * them to "yes" and "no"). For a translation using UTF-8, don't
+#. * translate if the translation would begin with anything but a 7-bit
+#. * (US_ASCII) character. That also means do not translate if the
+#. * translation would begin with anything but a 7-bit character, if
+#. * you use a single-byte character encoding (a charset like ISO-8859-n)
+#. * but anticipate that the message catalog may be used re-encoded in
+#. * UTF-8 form.
+#. * For translations using other character sets, you may also wish to
+#. * leave "yes" and "no" untranslated, if using (y) and (n) is the
+#. * preferred behavior.
+#. * Lynx will also accept y Y n N as responses unless there is a conflict
+#. * with the first letter of the "yes" or "no" translation.
+#.
+#: src/HTAlert.c:438 src/HTAlert.c:486
+msgid "yes"
+msgstr "ano"
+
+#: src/HTAlert.c:441 src/HTAlert.c:487
+msgid "no"
+msgstr "ne"
+
+#.
+#. * Special-purpose workaround for gettext support (we should do
+#. * this in a more general way) -TD
+#. *
+#. * NOTE TO TRANSLATORS: If the prompt has been rendered into
+#. * another language, and if yes/no are distinct, assume the
+#. * translator can make an ordered list in parentheses with one
+#. * capital letter for each as we assumed in HTConfirmDefault().
+#. * The list has to be in the same order as in the original message,
+#. * and the four capital letters chosen to not match those in the
+#. * original unless they have the same position.
+#. *
+#. * Example:
+#. * (Y/N/Always/neVer) - English (original)
+#. * (O/N/Toujours/Jamais) - French
+#.
+#: src/HTAlert.c:938
+msgid "Y/N/A/V"
+msgstr "A/N/V/K"
+
+#: src/HTML.c:5767
+msgid "Description:"
+msgstr "Popis:"
+
+#: src/HTML.c:5772
+msgid "(none)"
+msgstr "(žádný)"
+
+#: src/HTML.c:5776
+msgid "Filepath:"
+msgstr "Cesta:"
+
+#: src/HTML.c:5782
+msgid "(unknown)"
+msgstr "(neznámá)"
+
+#: src/HTML.c:7220
+msgid "Document has only hidden links. Use the 'l'ist command."
+msgstr "Dokument obsahuje pouze skryté odkazy. Použijte 'l' pro jejich vypsání."
+
+#: src/HTML.c:7721
+msgid "Source cache error - disk full?"
+msgstr "Chyba při práci s vyrovnávací pamětí pro dokumenty - došlo místo na disku?"
+
+#: src/HTML.c:7734
+msgid "Source cache error - not enough memory!"
+msgstr "Chyba při práci s vyrovnávací pamětí pro dokumenty - došla paměť!"
+
+#: src/LYBookmark.c:167
+msgid ""
+" This file is an HTML representation of the X Mosaic hotlist file.\n"
+" Outdated or invalid links may be removed by using the\n"
+" remove bookmark command, it is usually the 'R' key but may have\n"
+" been remapped by you or your system administrator."
+msgstr ""
+" Tento soubor je HTML obdobou 'hotlistu' programu 'X Mosaic'. Zastaralé\n"
+" Äi chybné odkazy mohou být smazány pomocí klávesy 'R'. Správce\n"
+" systému ale mohl tuto funkci svázat s jinou klávesou."
+
+#: src/LYBookmark.c:380
+#, c-format
+msgid ""
+" You can delete links by the 'R' key<br>\n"
+"<ol>\n"
+msgstr ""
+" Klávesou 'R' můžete mazat odkazy<br>\n"
+"<ol>\n"
+
+#: src/LYBookmark.c:383
+msgid ""
+" You can delete links using the remove bookmark command. It is usually\n"
+" the 'R' key but may have been remapped by you or your system\n"
+" administrator."
+msgstr ""
+" Odkazy mohou být smazány pomocí klávesy 'R'. Správce\n"
+" systému ale mohl tuto funkci svázat s jinou klávesou."
+
+#: src/LYBookmark.c:387
+msgid ""
+" This file also may be edited with a standard text editor to delete\n"
+" outdated or invalid links, or to change their order."
+msgstr ""
+" Mazání odkazů Äi zmÄ›na jejich poÅ™adí může být provedena i pomocí úprav\n"
+" tohoto souboru běžným textovým editorem."
+
+#: src/LYBookmark.c:390
+msgid ""
+"Note: if you edit this file manually\n"
+" you should not change the format within the lines\n"
+" or add other HTML markup.\n"
+" Make sure any bookmark link is saved as a single line."
+msgstr ""
+"Poznámka: pokud budete upravovat tento soubor ruÄnÄ›, nemÄ›l byste\n"
+" mÄ›nit jeho formát, Äi pÅ™idávat další HTML znaÄky.\n"
+" Žádná záložka nesmí zabírat více než jeden řádek."
+
+#: src/LYBookmark.c:686
+#, c-format
+msgid "File may be recoverable from %s during this session"
+msgstr "Během tohoto sezení lze soubor obnovit z %s"
+
+#: src/LYCgi.c:161
+#, c-format
+msgid "Do you want to execute \"%s\"?"
+msgstr "Chcete spustit \"%s\"?"
+
+#.
+#. * Neither the path as given nor any components examined by backing up
+#. * were stat()able. - kw
+#.
+#: src/LYCgi.c:276
+msgid "Unable to access cgi script"
+msgstr "Nelze získat přístup k cgi skriptu"
+
+#: src/LYCgi.c:709 src/LYCgi.c:712
+msgid "Good Advice"
+msgstr "Dobrá rada"
+
+#: src/LYCgi.c:716
+msgid "An excellent http server for VMS is available via"
+msgstr "Vynikající http server pro VMS je dostupný přes"
+
+#: src/LYCgi.c:723
+msgid "this link"
+msgstr "tento odkaz"
+
+#: src/LYCgi.c:727
+msgid "It provides state of the art CGI script support.\n"
+msgstr "Poskytuje výbornou podporu pro cgi skripty.\n"
+
+#: src/LYClean.c:115
+msgid "Exiting via interrupt:"
+msgstr "KonÄím kvůli pÅ™eruÅ¡ení:"
+
+#: src/LYCookie.c:2651
+msgid "(from a previous session)"
+msgstr "(z předchozího sezení)"
+
+#: src/LYCookie.c:2712
+msgid "Maximum Gobble Date:"
+msgstr "Maximální hromadné přijmutí:"
+
+#: src/LYCookie.c:2751
+msgid "Internal"
+msgstr "Vnitřní"
+
+#: src/LYCookie.c:2752
+msgid "cookie_domain_flag_set error, aborting program"
+msgstr "chyba cookie_domain_flag_set, ukonÄuji program"
+
+#: src/LYCurses.c:1127
+msgid "Terminal reinitialisation failed - unknown terminal type?"
+msgstr "Opetovná inicializace terminálu se nezdařila - neznámý typ terminálu?"
+
+#: src/LYCurses.c:1334
+msgid "Terminal initialisation failed - unknown terminal type?"
+msgstr "Inicializace terminálu se nezdařila - neznámý typ terminálu?"
+
+#: src/LYCurses.c:1828
+msgid "Terminal ="
+msgstr "Terminál ="
+
+#: src/LYCurses.c:1832
+msgid "You must use a vt100, 200, etc. terminal with this program."
+msgstr "Tento program vyžaduje terminál typu vt100, 200 etc."
+
+#: src/LYCurses.c:1881
+msgid "Your Terminal type is unknown!"
+msgstr "Typ vašeho terminálu je neznámý!"
+
+#: src/LYCurses.c:1882
+msgid "Enter a terminal type:"
+msgstr "Zadejte typ terminálu:"
+
+#: src/LYCurses.c:1896
+msgid "TERMINAL TYPE IS SET TO"
+msgstr "TYP TERMINÃLU JE NASTAVEN NA"
+
+#: src/LYCurses.c:2455
+#, c-format
+msgid ""
+"\n"
+"A Fatal error has occurred in %s Ver. %s\n"
+msgstr ""
+"\n"
+"V programu %s verze %s nastala fatální chyba.\n"
+
+#: src/LYCurses.c:2458
+#, c-format
+msgid ""
+"\n"
+"Please notify your system administrator to confirm a bug, and if\n"
+"confirmed, to notify the lynx-dev list. Bug reports should have concise\n"
+"descriptions of the command and/or URL which causes the problem, the\n"
+"operating system name with version number, the TCPIP implementation, the\n"
+"TRACEBACK if it can be captured, and any other relevant information.\n"
+msgstr ""
+"\n"
+"Zeptejte se vašeho správce systému, zda se vskutku jedná o chybu a pokud ano,\n"
+"uvÄ›domte o ní úÄastníky konference lynx-dev. Chybová hlášení by mÄ›la obsahovat\n"
+"struÄný popis příkazu a/nebo URL, který chybu způsobil, jméno a verzi operaÄního\n"
+"systému, TCPIP implementaci, TRACEBACK a všechny další relevantní informace.\n"
+
+#: src/LYEdit.c:272
+#, c-format
+msgid "Error starting editor, %s"
+msgstr "Chyba při spouštění editoru, %s"
+
+#: src/LYEdit.c:275
+msgid "Editor killed by signal"
+msgstr "Editor ukonÄen signálem"
+
+#: src/LYEdit.c:280
+#, c-format
+msgid "Editor returned with error status %s"
+msgstr "Editor skonÄil s chybovým návratovým statusem %s"
+
+#: src/LYDownload.c:511
+msgid "Downloaded link:"
+msgstr "Stažený odkaz:"
+
+#: src/LYDownload.c:516
+msgid "Suggested file name:"
+msgstr "DoporuÄené jméno souboru:"
+
+#: src/LYDownload.c:521
+msgid "Standard download options:"
+msgstr "Standardní menu nabídek pro stahování:"
+
+#: src/LYDownload.c:522
+msgid "Download options:"
+msgstr "Menu nabídek pro stahování:"
+
+#: src/LYDownload.c:538
+msgid "Save to disk"
+msgstr "Uložit na disk"
+
+#: src/LYDownload.c:552
+msgid "View temporary file"
+msgstr "Zobrazit doÄasný soubor"
+
+#: src/LYDownload.c:559
+msgid "Save to disk disabled."
+msgstr "Ukládání na disk je zakázáno."
+
+#: src/LYDownload.c:563 src/LYPrint.c:1331
+msgid "Local additions:"
+msgstr "Místní rozšíření:"
+
+#: src/LYDownload.c:574 src/LYUpload.c:206
+msgid "No Name Given"
+msgstr "Nebylo zadáno žádné jméno"
+
+#: src/LYHistory.c:676
+msgid "You selected:"
+msgstr "Vybráno:"
+
+#: src/LYHistory.c:700 src/LYHistory.c:929
+msgid "(no address)"
+msgstr "(žádná adresa)"
+
+#: src/LYHistory.c:704
+msgid " (internal)"
+msgstr " (vnitřní)"
+
+#: src/LYHistory.c:706
+msgid " (was internal)"
+msgstr " (původně vnitřní)"
+
+#: src/LYHistory.c:804
+msgid " (From History)"
+msgstr " (z historie)"
+
+#: src/LYHistory.c:849
+msgid "You visited (POSTs, bookmark, menu and list files excluded):"
+msgstr "Navštívené odkazy (POST, záložky, menu a seznamy odkazů vynechány):"
+
+#: src/LYHistory.c:1151
+msgid "(No messages yet)"
+msgstr "(Zatím žádné zprávy)"
+
+#: src/LYLeaks.c:222
+msgid "Invalid pointer detected."
+msgstr "Nalezen chybný ukazatel."
+
+#: src/LYLeaks.c:224 src/LYLeaks.c:262
+msgid "Sequence:"
+msgstr "Sekvence:"
+
+#: src/LYLeaks.c:227 src/LYLeaks.c:265
+msgid "Pointer:"
+msgstr "Ukazatel:"
+
+#: src/LYLeaks.c:236 src/LYLeaks.c:243 src/LYLeaks.c:284
+msgid "FileName:"
+msgstr "Jméno souboru:"
+
+#: src/LYLeaks.c:239 src/LYLeaks.c:246 src/LYLeaks.c:287 src/LYLeaks.c:298
+msgid "LineCount:"
+msgstr "Řádek:"
+
+#: src/LYLeaks.c:260
+msgid "Memory leak detected."
+msgstr "Zjištěn problém s pamětí."
+
+#: src/LYLeaks.c:268
+msgid "Contains:"
+msgstr "Obsahuje:"
+
+#: src/LYLeaks.c:281
+msgid "ByteSize:"
+msgstr "Velikost v bajtech:"
+
+#: src/LYLeaks.c:295
+msgid "realloced:"
+msgstr "realokováno:"
+
+#: src/LYLeaks.c:316
+msgid "Total memory leakage this run:"
+msgstr "Celkový poÄet problémů s pamÄ›tí:"
+
+#: src/LYLeaks.c:320
+msgid "Peak allocation"
+msgstr "Největší alokace"
+
+#: src/LYLeaks.c:322
+msgid "Bytes allocated"
+msgstr "Alokováno bytů"
+
+#: src/LYLeaks.c:324
+msgid "Total mallocs"
+msgstr "Celkem špatně alokovaných"
+
+#: src/LYLeaks.c:326
+msgid "Total frees"
+msgstr "Celkem volných"
+
+#: src/LYList.c:89
+msgid "References in "
+msgstr "Odkazy v "
+
+#: src/LYList.c:92
+msgid "this document:"
+msgstr "v tomto dokumentu:"
+
+#: src/LYList.c:98 src/LYList.c:362
+msgid "Visible links:"
+msgstr "Viditelné odkazy:"
+
+#: src/LYList.c:202 src/LYList.c:321
+msgid "Hidden links:"
+msgstr "Skryté odkazy:"
+
+#: src/LYList.c:358
+msgid "References"
+msgstr "Reference"
+
+#: src/LYLocal.c:289
+#, c-format
+msgid "Unable to get status of '%s'."
+msgstr "Status '%s' nelze zjistit."
+
+#: src/LYLocal.c:354
+msgid "The selected item is not a file or a directory! Request ignored."
+msgstr "Vybraný předmět není souborem ani adresářem! Požadavek ignorován."
+
+#: src/LYLocal.c:456
+#, c-format
+msgid "Unable to %s due to system error!"
+msgstr "%s selhalo kvůli systémové chybě!"
+
+#: src/LYLocal.c:490
+#, c-format
+msgid "Probable failure to %s due to system error!"
+msgstr "%s pravděpodobně selhalo kvůli systémové chybě!"
+
+#: src/LYLocal.c:555 src/LYLocal.c:578
+#, c-format
+msgid "remove %s"
+msgstr "smazat %s"
+
+#: src/LYLocal.c:598
+#, c-format
+msgid "touch %s"
+msgstr "změnit datum poslední změny souboru %s na dnes"
+
+#: src/LYLocal.c:628
+#, c-format
+msgid "move %s to %s"
+msgstr "přesunout %s do %s"
+
+#: src/LYLocal.c:676
+msgid "There is already a directory with that name! Request ignored."
+msgstr "Byl nalezen adresář stejného jména! Požadavek ignorován."
+
+#: src/LYLocal.c:678
+msgid "There is already a file with that name! Request ignored."
+msgstr "Byl nalezen soubor stejného jména! Požadavek ignorován."
+
+#: src/LYLocal.c:680
+msgid "The specified name is already in use! Request ignored."
+msgstr "Zadané jméno je již používáno! Požadavek ignorován."
+
+#: src/LYLocal.c:692
+msgid "Destination has different owner! Request denied."
+msgstr "Cíl má jiného vlastníka! Požadavek zamítnut."
+
+#: src/LYLocal.c:695
+msgid "Destination is not a valid directory! Request denied."
+msgstr "Cíl není platným adresářem! Požadavek zamítnut."
+
+#: src/LYLocal.c:711
+msgid "Source and destination are the same location! Request ignored!"
+msgstr "Zdroj a cíl oznaÄují jedno a to samé místo! Požadavek zamítnut!"
+
+#: src/LYLocal.c:735
+msgid "Remove all tagged files and directories?"
+msgstr "Smazat vÅ¡echny oznaÄené soubory a adresáře?"
+
+#: src/LYLocal.c:808
+msgid "Enter new location for tagged items: "
+msgstr "Zadejte nové místo urÄení pro oznaÄené pÅ™edmÄ›ty: "
+
+#: src/LYLocal.c:906
+msgid "Enter new name for directory: "
+msgstr "Zadejte nové jméno adresáře: "
+
+#: src/LYLocal.c:908
+msgid "Enter new name for file: "
+msgstr "Zadejte nové jméno souboru: "
+
+#: src/LYLocal.c:920
+msgid "Illegal character (path-separator) found! Request ignored."
+msgstr "Nalezen chybný znak (oddÄ›lovaÄ cesty)! Požadavek ignorován."
+
+#: src/LYLocal.c:970
+msgid "Enter new location for directory: "
+msgstr "Zadejte nové místo urÄení pro adresář: "
+
+#: src/LYLocal.c:972
+msgid "Enter new location for file: "
+msgstr "Zadejte nové místo urÄení pro soubor: "
+
+#: src/LYLocal.c:999
+msgid "Unexpected failure - unable to find trailing path separator"
+msgstr "NeoÄekávaná chyba - koncový oddÄ›lovaÄ cesty nelze nalézt"
+
+#: src/LYLocal.c:1061
+msgid "Modify name, location, or permission (n, l, or p): "
+msgstr "ZmÄ›nit jméno (n), umístÄ›ní (l) Äi přístupová práva (p)? (n,l Äi p): "
+
+#: src/LYLocal.c:1063
+msgid "Modify name or location (n or l): "
+msgstr "ZmÄ›nit jméno (n) Äi umístÄ›ní (l) (n Äi l): "
+
+#.
+#. * Code for changing ownership needed here.
+#.
+#: src/LYLocal.c:1092
+msgid "This feature not yet implemented!"
+msgstr "Tato funkce zatím nebyla implementována!"
+
+#: src/LYLocal.c:1113
+msgid "Enter name of file to create: "
+msgstr "Zadejte jméno souboru, který mám vytvořit: "
+
+#: src/LYLocal.c:1116 src/LYLocal.c:1153
+msgid "Illegal redirection \"//\" found! Request ignored."
+msgstr "Nalezeno chybné přesměrování \"//\"! Požadavek ignorován."
+
+#: src/LYLocal.c:1150
+msgid "Enter name for new directory: "
+msgstr "Zadejte nové jméno adresáře: "
+
+#: src/LYLocal.c:1191
+msgid "Create file or directory (f or d): "
+msgstr "VytvoÅ™it soubor(f) Äi adresář(d)? (f Äi d):"
+
+#: src/LYLocal.c:1233
+#, c-format
+msgid "Remove directory '%s'?"
+msgstr "Smazat adresář '%s'?"
+
+#: src/LYLocal.c:1236
+msgid "Remove directory?"
+msgstr "Smazat adresář?"
+
+#: src/LYLocal.c:1241
+#, c-format
+msgid "Remove file '%s'?"
+msgstr "Smazat soubor '%s'?"
+
+#: src/LYLocal.c:1243
+msgid "Remove file?"
+msgstr "Smazat soubor?"
+
+#: src/LYLocal.c:1248
+#, c-format
+msgid "Remove symbolic link '%s'?"
+msgstr "Smazat symbolický odkaz '%s'?"
+
+#: src/LYLocal.c:1250
+msgid "Remove symbolic link?"
+msgstr "Smazat symbolický odkaz?"
+
+#: src/LYLocal.c:1348
+msgid "Sorry, don't know how to permit non-UNIX files yet."
+msgstr "Nevím jak nastavit přístupová práva na ne-UNIXOVÉM systému souborů."
+
+#: src/LYLocal.c:1377
+msgid "Unable to open permit options file"
+msgstr "Soubor s menu nastavení práv souborů nelze otevřít"
+
+#: src/LYLocal.c:1405
+msgid "Specify permissions below:"
+msgstr "Zadejte přístupová práva:"
+
+#: src/LYLocal.c:1406 src/LYShowInfo.c:291
+msgid "Owner:"
+msgstr "Vlastník:"
+
+#: src/LYLocal.c:1422
+msgid "Group"
+msgstr "Skupina"
+
+#: src/LYLocal.c:1438
+msgid "Others:"
+msgstr "Ostatní:"
+
+#: src/LYLocal.c:1456
+msgid "form to permit"
+msgstr "formulář ke schávlení"
+
+#: src/LYLocal.c:1552
+msgid "Invalid mode format."
+msgstr "Chybný formát."
+
+#: src/LYLocal.c:1556
+msgid "Invalid syntax format."
+msgstr "Chybná syntaxe."
+
+#: src/LYLocal.c:1743
+msgid "Warning! UUDecoded file will exist in the directory you started Lynx."
+msgstr "Varování! UUdekódovaný soubor bude vytvořen v adresáři, ze kterého byl Lynx spuštěn."
+
+#: src/LYLocal.c:1933
+msgid "NULL URL pointer"
+msgstr "NULOVÃ URL ukazatel"
+
+#: src/LYLocal.c:2015
+#, c-format
+msgid "Executing %s "
+msgstr "Spouštím %s "
+
+#: src/LYLocal.c:2018
+msgid "Executing system command. This might take a while."
+msgstr "Spouští se systémový příkaz. Okamžik, prosím."
+
+#: src/LYLocal.c:2092
+msgid "Current directory:"
+msgstr "Aktuální adresář:"
+
+#: src/LYLocal.c:2095 src/LYLocal.c:2113
+msgid "Current selection:"
+msgstr "Zvolené položky:"
+
+#: src/LYLocal.c:2099
+msgid "Nothing currently selected."
+msgstr "Žádné položky nejsou zvoleny."
+
+#: src/LYLocal.c:2115
+msgid "tagged item:"
+msgstr "oznaÄena položka:"
+
+#: src/LYLocal.c:2116
+msgid "tagged items:"
+msgstr "oznaÄené položky:"
+
+#: src/LYLocal.c:2216 src/LYLocal.c:2225
+msgid "Illegal filename; request ignored."
+msgstr "Chybné jméno souboru; požadavek ignorován."
+
+#. directory not writable
+#: src/LYLocal.c:2323 src/LYLocal.c:2382
+msgid "Install in the selected directory not permitted."
+msgstr "Instalace do zvoleného adresáře není povolena."
+
+#: src/LYLocal.c:2378
+msgid "The selected item is not a directory! Request ignored."
+msgstr "Zvolená položka není adresářem! Požadavek ignorován."
+
+#: src/LYLocal.c:2387
+msgid "Just a moment, ..."
+msgstr "Okamžik, prosím ..."
+
+#: src/LYLocal.c:2404
+msgid "Error building install args"
+msgstr "Chyba pÅ™i sestavování instalaÄních argumentů"
+
+#: src/LYLocal.c:2419 src/LYLocal.c:2450
+#, c-format
+msgid "Source and target are the same: %s"
+msgstr "Zdroj je totožný s cílem: %s"
+
+#: src/LYLocal.c:2426 src/LYLocal.c:2457
+#, c-format
+msgid "Already in target directory: %s"
+msgstr "Cílový adresář %s je totožný s aktuálním"
+
+#: src/LYLocal.c:2475
+msgid "Installation complete"
+msgstr "Instalace dokonÄena"
+
+#: src/LYLocal.c:2678
+msgid "Temporary URL or list would be too long."
+msgstr "DoÄasné URL nebo seznam by bylo příliÅ¡ dlouhé."
+
+#: src/LYMail.c:566
+msgid "Sending"
+msgstr "Posílám"
+
+#: src/LYMail.c:1050
+#, c-format
+msgid "The link %s :?: %s \n"
+msgstr "Odkaz %s :?: %s \n"
+
+#: src/LYMail.c:1052
+#, c-format
+msgid "called \"%s\"\n"
+msgstr "volaný \"%s\"\n"
+
+#: src/LYMail.c:1053
+#, c-format
+msgid "in the file \"%s\" called \"%s\"\n"
+msgstr "v souboru \"%s\" se jménem \"%s\"\n"
+
+#: src/LYMail.c:1054
+msgid "was requested but was not available."
+msgstr "byl požadován, ale nebyl dostupný."
+
+#: src/LYMail.c:1055
+msgid "Thought you might want to know."
+msgstr "Chtěli jsme Vám to dát vědět."
+
+#: src/LYMail.c:1057
+msgid "This message was automatically generated by"
+msgstr "Tato zpráva byla vytvořena automaticky programem"
+
+#: src/LYMail.c:1770
+msgid "No system mailer configured"
+msgstr "Není nakonfigurován žádný systémový mailer"
+
+#: src/LYMain.c:1088
+msgid "No Winsock found, sorry."
+msgstr "Winsock nenalezen. lituji."
+
+#: src/LYMain.c:1278
+msgid "You MUST define a valid TMP or TEMP area!"
+msgstr "MUSÃTE zadat platný TMP Äi TEMP prostor!"
+
+#: src/LYMain.c:1331 src/LYMainLoop.c:5285
+msgid "No such directory"
+msgstr "Adresář neexistuje"
+
+#: src/LYMain.c:1525
+#, c-format
+msgid ""
+"\n"
+"Configuration file \"%s\" is not available.\n"
+"\n"
+msgstr ""
+"\n"
+"KonfiguraÄní soubor %s je nedostupný.\n"
+"\n"
+
+#: src/LYMain.c:1535
+#, c-format
+msgid ""
+"\n"
+"Lynx character sets not declared.\n"
+"\n"
+msgstr ""
+"\n"
+"Znakové sady Lynxu nejsou deklarovány.\n"
+"\n"
+
+#: src/LYMain.c:1691
+#, c-format
+msgid "Ignored %d characters from standard input.\n"
+msgstr "Ignorováno %d znaků z obecného vstupu.\n"
+
+#: src/LYMain.c:1693
+#, c-format
+msgid "Use \"-stdin\" or \"-\" to tell how to handle piped input.\n"
+msgstr "Použijte \"-stdin\" nebo \"-\" k urÄení, jak má být zpracován vstup.\n"
+
+#: src/LYMain.c:1851
+msgid "Warning:"
+msgstr "Varování:"
+
+#: src/LYMain.c:2419
+msgid "persistent cookies state will be changed in next session only."
+msgstr "stav trvalých cookies bude změněn až při příštím sezení."
+
+#: src/LYMain.c:2654 src/LYMain.c:2698
+#, c-format
+msgid "Lynx: ignoring unrecognized charset=%s\n"
+msgstr "Lynx: Ignoruji neznámou znakovou sadu=%s\n"
+
+#: src/LYMain.c:3215
+#, c-format
+msgid "%s Version %s (%s)"
+msgstr "%s Verze %s (%s)"
+
+#: src/LYMain.c:3256
+#, c-format
+msgid "Built on %s%s.\n"
+msgstr "Sestaven na %s%s.\n"
+
+#: src/LYMain.c:3270
+msgid "Copyrights held by the Lynx Developers Group,"
+msgstr "Autorská práva patří Lynx Developers Group,"
+
+#: src/LYMain.c:3271
+msgid "the University of Kansas, CERN, and other contributors."
+msgstr "Kansaské univerzitě, CERN a ostatním autorům."
+
+#: src/LYMain.c:3272
+msgid "Distributed under the GNU General Public License (Version 2)."
+msgstr "Šířeno podle podmínek Obecné veřejné licence GNU (2. verze)."
+
+#: src/LYMain.c:3273
+msgid "See https://lynx.invisible-island.net/ and the online help for more information."
+msgstr "Podrobnější informace získáte na https://lynx.invisible-island.net/ a z nápovědy k programu."
+
+#: src/LYMain.c:4120
+#, c-format
+msgid "USAGE: %s [options] [file]\n"
+msgstr "Použití: %s [pÅ™epínaÄe] [soubor]\n"
+
+#: src/LYMain.c:4121
+#, c-format
+msgid "Options are:\n"
+msgstr "PÅ™epínaÄe:\n"
+
+#: src/LYMain.c:4424
+#, c-format
+msgid "%s: Invalid Option: %s\n"
+msgstr "%s: Chybný pÅ™epínaÄ: %s\n"
+
+#: src/LYMainLoop.c:572
+#, c-format
+msgid "Internal error: Invalid mouse link %d!"
+msgstr "Vnitřní chyba: chybný myší odkaz %d!"
+
+#: src/LYMainLoop.c:693 src/LYMainLoop.c:5307
+msgid "A URL specified by the user"
+msgstr "URL zadané uživatelem"
+
+#: src/LYMainLoop.c:1142
+msgid "Enctype multipart/form-data not yet supported! Cannot submit."
+msgstr "Kódování multipart/form-data není zatím podporováno. Nelze odeslat."
+
+#.
+#. * Make a name for this help file.
+#.
+#: src/LYMainLoop.c:3197
+msgid "Help Screen"
+msgstr "Nápověda"
+
+#: src/LYMainLoop.c:3328
+msgid "System Index"
+msgstr "Systémový index"
+
+#: src/LYMainLoop.c:3577
+#, c-format
+msgid "Query parameter %d: "
+msgstr "Parametr dotazu %d:"
+
+#: src/LYMainLoop.c:3806 src/LYMainLoop.c:5583
+msgid "Entry into main screen"
+msgstr "Vstup na hlavní obrazovku"
+
+#: src/LYMainLoop.c:4064
+msgid "No next document present"
+msgstr "Žádný další dokument není přítomen"
+
+#: src/LYMainLoop.c:4359
+msgid "charset for this document specified explicitly, sorry..."
+msgstr "znaková sada tohoto dokumentu je explicitně zadána, lituji..."
+
+#: src/LYMainLoop.c:5265
+msgid "cd to:"
+msgstr "změn adresář na:"
+
+#: src/LYMainLoop.c:5288
+msgid "A component of path is not a directory"
+msgstr "SouÄást cesty není adresář"
+
+#: src/LYMainLoop.c:5291
+msgid "failed to change directory"
+msgstr "chyba při změně adresáře"
+
+#: src/LYMainLoop.c:6517
+msgid "Reparsing document under current settings..."
+msgstr "Znovu zpracovávám dokument za použití nových nastavení..."
+
+#: src/LYMainLoop.c:6811
+#, c-format
+msgid "Fatal error - could not open output file %s\n"
+msgstr "Fatální chyba - výstupní soubor %s nelze otevřít\n"
+
+#: src/LYMainLoop.c:7153
+msgid "TABLE center enable."
+msgstr "Vystředění TABULKY zapnuto."
+
+#: src/LYMainLoop.c:7156
+msgid "TABLE center disable."
+msgstr "Vystředění TABULKY vypnuto."
+
+#: src/LYMainLoop.c:7236
+msgid "Current URL is empty."
+msgstr "Aktuální URL je prázdná."
+
+#: src/LYMainLoop.c:7238 src/LYUtils.c:1909
+msgid "Copy to clipboard failed."
+msgstr "Kopírování do schránky selhalo."
+
+#: src/LYMainLoop.c:7240
+msgid "Document URL put to clipboard."
+msgstr "Dokument URL, který má být vložen do schránky."
+
+#: src/LYMainLoop.c:7242
+msgid "Link URL put to clipboard."
+msgstr "Link URL, který má být vložen do schránky."
+
+#: src/LYMainLoop.c:7269
+msgid "No URL in the clipboard."
+msgstr "Ve schránce není žádné URL."
+
+#: src/LYMainLoop.c:7962 src/LYMainLoop.c:8133
+msgid "-index-"
+msgstr "-rejstřík-"
+
+#: src/LYMainLoop.c:8071
+msgid "lynx: Can't access startfile"
+msgstr "lynx: startovní soubor nelze otevřít"
+
+#: src/LYMainLoop.c:8083
+msgid "lynx: Start file could not be found or is not text/html or text/plain"
+msgstr "lynx: startovní soubor nelze nalézt, nebo není ani typu text/html ani text/plain"
+
+#: src/LYMainLoop.c:8084
+msgid " Exiting..."
+msgstr " KonÄím..."
+
+#: src/LYMainLoop.c:8127
+msgid "-more-"
+msgstr "-pokraÄování-"
+
+#. Enable scrolling.
+#: src/LYNews.c:186
+msgid "You will be posting to:"
+msgstr "Budete posílat na:"
+
+#.
+#. * Get the mail address for the From header, offering personal_mail_address
+#. * as default.
+#.
+#: src/LYNews.c:195
+msgid ""
+"\n"
+"\n"
+" Please provide your mail address for the From: header\n"
+msgstr ""
+"\n"
+"\n"
+"Zadejte adresu pro hlaviÄku From:\n"
+
+#.
+#. * Get the Subject header, offering the current document's title as the
+#. * default if this is a followup rather than a new post. - FM
+#.
+#: src/LYNews.c:212
+msgid ""
+"\n"
+"\n"
+" Please provide or edit the Subject: header\n"
+msgstr ""
+"\n"
+"\n"
+"Zadejte předmět zprávy\n"
+
+#: src/LYNews.c:302
+msgid ""
+"\n"
+"\n"
+" Please provide or edit the Organization: header\n"
+msgstr ""
+"\n"
+"\n"
+"Zadejte hodnotu pro hlaviÄku Organization:\n"
+
+#.
+#. * Use the built in line editior.
+#.
+#: src/LYNews.c:359
+msgid ""
+"\n"
+"\n"
+" Please enter your message below."
+msgstr ""
+"\n"
+"\n"
+"Zadejte text zprávy."
+
+#: src/LYNews.c:405
+msgid "Message has no original text!"
+msgstr "Zpráva neobsahuje žádný původní text!"
+
+#: src/LYOptions.c:774
+msgid "review/edit B)ookmarks files"
+msgstr "zobrazit/editovat soubory se záložkami (B)"
+
+#: src/LYOptions.c:776
+msgid "B)ookmark file: "
+msgstr "Soubor se záložkami (B):"
+
+#: src/LYOptions.c:2131 src/LYOptions.c:2138
+msgid "ON"
+msgstr "ZAPNUTO"
+
+#. verbose_img variable
+#. LYCollapseBRs variable
+#. LYtrimBlankLines variable
+#: src/LYOptions.c:2132 src/LYOptions.c:2137 src/LYOptions.c:2321
+#: src/LYOptions.c:2330 src/LYOptions.c:2339 src/LYOptions.c:2350
+msgid "OFF"
+msgstr "VYPNUTO"
+
+#: src/LYOptions.c:2133
+msgid "NEVER"
+msgstr "NIDKY"
+
+#: src/LYOptions.c:2134
+msgid "ALWAYS"
+msgstr "VŽDY"
+
+#: src/LYOptions.c:2150 src/LYOptions.c:2313
+msgid "ignore"
+msgstr "ignorovat"
+
+#: src/LYOptions.c:2151
+msgid "ask user"
+msgstr "zeptat se uživatele"
+
+#: src/LYOptions.c:2152
+msgid "accept all"
+msgstr "přijmout vše"
+
+#: src/LYOptions.c:2164
+msgid "ALWAYS OFF"
+msgstr "VŽDY VYPNUTO"
+
+#: src/LYOptions.c:2165
+msgid "FOR LOCAL FILES ONLY"
+msgstr "POUZE PRO MÃSTNÃ SOUBORY"
+
+#: src/LYOptions.c:2167
+msgid "ALWAYS ON"
+msgstr "VŽDY ZAPNUTO"
+
+#: src/LYOptions.c:2179
+msgid "Numbers act as arrows"
+msgstr "Čísla se chovají jako šipky"
+
+#: src/LYOptions.c:2181
+msgid "Links are numbered"
+msgstr "Odkazy jsou oÄíslovány"
+
+#: src/LYOptions.c:2184
+msgid "Links and form fields are numbered"
+msgstr "Odkazy a pole formulářů jsou oÄíslovány"
+
+#: src/LYOptions.c:2187
+msgid "Form fields are numbered"
+msgstr "Pole formulářů jsou oÄíslovány"
+
+#: src/LYOptions.c:2202
+msgid "Case insensitive"
+msgstr "Nezáleží na velkých písmenech"
+
+#: src/LYOptions.c:2203
+msgid "Case sensitive"
+msgstr "Záleží na velkých písmenech"
+
+#: src/LYOptions.c:2237
+msgid "prompt normally"
+msgstr "příkazový řádek se chová normálně"
+
+#: src/LYOptions.c:2238
+msgid "force yes-response"
+msgstr "vždy odpovídat \"ano\""
+
+#: src/LYOptions.c:2239
+msgid "force no-response"
+msgstr "vždy odpovídat \"ne\""
+
+#: src/LYOptions.c:2249
+msgid "RFC 2109"
+msgstr "RFC 2109"
+
+#: src/LYOptions.c:2250
+msgid "RFC 2965"
+msgstr "RFC 2965"
+
+#: src/LYOptions.c:2251
+msgid "RFC 6265"
+msgstr "RFC 6265"
+
+#: src/LYOptions.c:2268
+msgid "Novice"
+msgstr "ZaÄáteÄník"
+
+#: src/LYOptions.c:2269
+msgid "Intermediate"
+msgstr "PokroÄilý"
+
+#: src/LYOptions.c:2270
+msgid "Advanced"
+msgstr "Profesionál"
+
+#: src/LYOptions.c:2279
+msgid "By First Visit"
+msgstr "Podle Prvního Zobrazení"
+
+#: src/LYOptions.c:2281
+msgid "By First Visit Reversed"
+msgstr "Porlde Prvního Zobrazení Obráceně"
+
+#: src/LYOptions.c:2282
+msgid "As Visit Tree"
+msgstr "Jako Strom Zobrazení"
+
+#: src/LYOptions.c:2283
+msgid "By Last Visit"
+msgstr "Podle Poslední Zobrazení"
+
+#: src/LYOptions.c:2285
+msgid "By Last Visit Reversed"
+msgstr "Podle Poslední Zobrazení Obráceně"
+
+#. Old_DTD variable
+#: src/LYOptions.c:2296
+msgid "relaxed (TagSoup mode)"
+msgstr "volné (TagSoup mód)"
+
+#: src/LYOptions.c:2297
+msgid "strict (SortaSGML mode)"
+msgstr "přísné (SortaSGML mód)"
+
+#: src/LYOptions.c:2304
+msgid "Ignore"
+msgstr "Ignorovat"
+
+#: src/LYOptions.c:2305
+msgid "Add to trace-file"
+msgstr "Přidat do trasovacího souboru"
+
+#: src/LYOptions.c:2306
+msgid "Add to LYNXMESSAGES"
+msgstr "Přidat do LYNXMESSAGES"
+
+#: src/LYOptions.c:2307
+msgid "Warn, point to trace-file"
+msgstr "Upozorni, směřuj do trasovacího souboru"
+
+#: src/LYOptions.c:2314
+msgid "as labels"
+msgstr "jako štítky"
+
+#: src/LYOptions.c:2315
+msgid "as links"
+msgstr "jako odkazy"
+
+#: src/LYOptions.c:2322
+msgid "show filename"
+msgstr "zobrazit jméno souboru"
+
+#: src/LYOptions.c:2331
+msgid "collapse"
+msgstr "složit"
+
+#: src/LYOptions.c:2340
+msgid "trim-lines"
+msgstr "oÅ™ezové Äáry"
+
+#: src/LYOptions.c:2351
+msgid "STANDARD"
+msgstr "STANDARTNÃ"
+
+#: src/LYOptions.c:2352
+msgid "ADVANCED"
+msgstr "POKROÄŒILÃ"
+
+#: src/LYOptions.c:2386
+msgid "Directories first"
+msgstr "Nejdřív adresáře"
+
+#: src/LYOptions.c:2387
+msgid "Files first"
+msgstr "Nejdřív soubory"
+
+#: src/LYOptions.c:2388
+msgid "Mixed style"
+msgstr "SpoleÄnÄ›"
+
+#: src/LYOptions.c:2396 src/LYOptions.c:2416
+msgid "By Name"
+msgstr "Podle Jména"
+
+#: src/LYOptions.c:2397 src/LYOptions.c:2417
+msgid "By Type"
+msgstr "Podle Typu"
+
+#: src/LYOptions.c:2398 src/LYOptions.c:2418
+msgid "By Size"
+msgstr "Podle Velikosti"
+
+#: src/LYOptions.c:2399 src/LYOptions.c:2419
+msgid "By Date"
+msgstr "Podle Data"
+
+#: src/LYOptions.c:2400
+msgid "By Mode"
+msgstr "Podle Módu"
+
+#: src/LYOptions.c:2402
+msgid "By User"
+msgstr "Podle Uživatele"
+
+#: src/LYOptions.c:2403
+msgid "By Group"
+msgstr "Podle Skupiny"
+
+#: src/LYOptions.c:2428
+msgid "Do not show rate"
+msgstr "Nezobrazuj hodnotu přenosu dat"
+
+#: src/LYOptions.c:2429 src/LYOptions.c:2430
+#, c-format
+msgid "Show %s/sec rate"
+msgstr "Zobrazuj %s/sec hodnotu přenosu dat"
+
+#: src/LYOptions.c:2432 src/LYOptions.c:2433
+#, c-format
+msgid "Show %s/sec, ETA"
+msgstr "Zobrazuj %s/sec, doba do skonÄení"
+
+#: src/LYOptions.c:2434 src/LYOptions.c:2435
+#, c-format
+msgid "Show %s/sec (2-digits), ETA"
+msgstr "Zobrazuj %s/sec (2-ÄíselnÄ›), doba do skonÄení"
+
+#: src/LYOptions.c:2438
+msgid "Show progressbar"
+msgstr "Zobrazuj ukazatel průběhu"
+
+#: src/LYOptions.c:2459
+msgid "Accept lynx's internal types"
+msgstr "Přijímat vnitřní typy lynxu"
+
+#: src/LYOptions.c:2460
+msgid "Also accept lynx.cfg's types"
+msgstr "Také přijímat typy lynx.cfg"
+
+#: src/LYOptions.c:2461
+msgid "Also accept user's types"
+msgstr "Také přijímat uživatelské typy"
+
+#: src/LYOptions.c:2462
+msgid "Also accept system's types"
+msgstr "Také přijímat systémové typy"
+
+#: src/LYOptions.c:2463
+msgid "Accept all types"
+msgstr "Přijímat všechny typy"
+
+#: src/LYOptions.c:2472
+msgid "gzip"
+msgstr "gzip"
+
+#: src/LYOptions.c:2473
+msgid "deflate"
+msgstr "bezztrátová komprese"
+
+#: src/LYOptions.c:2476
+msgid "compress"
+msgstr "komprese"
+
+#: src/LYOptions.c:2479
+msgid "bzip2"
+msgstr "bzip2"
+
+#: src/LYOptions.c:2481
+msgid "All"
+msgstr "VÅ¡e"
+
+#: src/LYOptions.c:2491
+msgid "HTTP 1.0"
+msgstr "HTTP 1.0"
+
+#: src/LYOptions.c:2492
+msgid "HTTP 1.1"
+msgstr "HTTP 1.1"
+
+#: src/LYOptions.c:2851 src/LYOptions.c:2880
+#, c-format
+msgid "Use %s to invoke the Options menu!"
+msgstr "Pomocí %s můžete aktivovat KonfiguraÄní menu!"
+
+#: src/LYOptions.c:3772
+msgid "(options marked with (!) will not be saved)"
+msgstr "(volby oznaÄené (!) nebudou uloženy)"
+
+#: src/LYOptions.c:3780
+msgid "General Preferences"
+msgstr "Všeobecná nastavení"
+
+#. ***************************************************************
+#. User Mode: SELECT
+#: src/LYOptions.c:3784
+msgid "User mode"
+msgstr "Uživatelský režim"
+
+#. Editor: INPUT
+#: src/LYOptions.c:3790
+msgid "Editor"
+msgstr "Editor"
+
+#. Search Type: SELECT
+#: src/LYOptions.c:3795
+msgid "Type of Search"
+msgstr "Druh hledání"
+
+#: src/LYOptions.c:3800
+msgid "Security and Privacy"
+msgstr "BezpeÄnost a Soukromí"
+
+#. ***************************************************************
+#. Cookies: SELECT
+#: src/LYOptions.c:3804
+msgid "Cookies"
+msgstr "Cookies"
+
+#. Cookie Version: SELECT
+#: src/LYOptions.c:3818
+msgid "Cookie RFC-version"
+msgstr "RFC verze cookie"
+
+#. Cookie Prompting: SELECT
+#: src/LYOptions.c:3824
+msgid "Invalid-Cookie Prompting"
+msgstr "Přijimání chybného cookie"
+
+#. SSL Prompting: SELECT
+#: src/LYOptions.c:3831
+msgid "SSL Prompting"
+msgstr "Přijímání SSL"
+
+#: src/LYOptions.c:3836
+msgid "SSL client certificate file"
+msgstr "Soubor certifikátu SSL klienta"
+
+#: src/LYOptions.c:3840
+msgid "SSL client key file"
+msgstr "Soubor klíÄe SSL klienta"
+
+#: src/LYOptions.c:3846
+msgid "Keyboard Input"
+msgstr "Nastavení klávesnice"
+
+#. ***************************************************************
+#. Keypad Mode: SELECT
+#: src/LYOptions.c:3850
+msgid "Keypad mode"
+msgstr "Režim numerické klávesnice"
+
+#. Emacs keys: ON/OFF
+#: src/LYOptions.c:3856
+msgid "Emacs keys"
+msgstr "Emacs klávesy"
+
+#. VI Keys: ON/OFF
+#: src/LYOptions.c:3862
+msgid "VI keys"
+msgstr "VI klávesy"
+
+#. Line edit style: SELECT
+#. well, at least 2 line edit styles available
+#: src/LYOptions.c:3869
+msgid "Line edit style"
+msgstr "Styl úpravy řádků"
+
+#. Keyboard layout: SELECT
+#: src/LYOptions.c:3881
+msgid "Keyboard layout"
+msgstr "Rozložení klávesnice"
+
+#.
+#. * Display and Character Set
+#.
+#: src/LYOptions.c:3895
+msgid "Display and Character Set"
+msgstr "Displej a Znaková sada"
+
+#. Use locale-based character set: ON/OFF
+#: src/LYOptions.c:3900
+msgid "Use locale-based character set"
+msgstr "Použít místní znakovou sadu (locale)"
+
+#: src/LYOptions.c:3907
+msgid "Use HTML5 charset replacements"
+msgstr "Použít HTML5 náhrady znakové sady"
+
+#. Display Character Set: SELECT
+#: src/LYOptions.c:3913
+msgid "Display character set"
+msgstr "Místní znaková sada"
+
+#: src/LYOptions.c:3944
+msgid "Assumed document character set"
+msgstr "Předpokládaná znaková sada"
+
+#.
+#. * Since CJK people hardly mixed with other world
+#. * we split the header to make it more readable:
+#. * "CJK mode" for CJK display charsets, and "Raw 8-bit" for others.
+#.
+#: src/LYOptions.c:3964
+msgid "CJK mode"
+msgstr "CJK režim"
+
+#: src/LYOptions.c:3966
+msgid "Raw 8-bit"
+msgstr "Přímý 8bitový režim"
+
+#. X Display: INPUT
+#: src/LYOptions.c:3974
+msgid "X Display"
+msgstr "X Display"
+
+#.
+#. * Document Appearance
+#.
+#: src/LYOptions.c:3980
+msgid "Document Appearance"
+msgstr "Vzhled dokumentu"
+
+#: src/LYOptions.c:3986
+msgid "Show color"
+msgstr "Zobrazovat barvy"
+
+#: src/LYOptions.c:4012
+msgid "Color style"
+msgstr "Styl barev"
+
+#: src/LYOptions.c:4022
+msgid "Default colors"
+msgstr "Implicitní barvy"
+
+#. Show cursor: ON/OFF
+#: src/LYOptions.c:4030
+msgid "Show cursor"
+msgstr "Zobrazovat kurzor"
+
+#. Underline links: ON/OFF
+#: src/LYOptions.c:4036
+msgid "Underline links"
+msgstr "Podtrhávat odkazy"
+
+#. Show scrollbar: ON/OFF
+#: src/LYOptions.c:4043
+msgid "Show scrollbar"
+msgstr "Zobrazovat posuvník"
+
+#. Select Popups: ON/OFF
+#: src/LYOptions.c:4050
+msgid "Popups for select fields"
+msgstr "Vyskakovací menu pro zvolená pole"
+
+#. HTML error recovery: SELECT
+#: src/LYOptions.c:4056
+msgid "HTML error recovery"
+msgstr "Zotavení po chybách HTML"
+
+#. Bad HTML messages: SELECT
+#: src/LYOptions.c:4062
+msgid "Bad HTML messages"
+msgstr "Chybné HTML zprávy"
+
+#. Show Images: SELECT
+#: src/LYOptions.c:4068
+msgid "Show images"
+msgstr "Zobrazovat obrázky"
+
+#. Verbose Images: ON/OFF
+#: src/LYOptions.c:4082
+msgid "Verbose images"
+msgstr "Doslovné obrázky"
+
+#. Collapse BR Tags: ON/OFF
+#: src/LYOptions.c:4088
+msgid "Collapse BR tags"
+msgstr "Složit BR tagy"
+
+#. Trim blank lines: ON/OFF
+#: src/LYOptions.c:4094
+msgid "Trim blank lines"
+msgstr "Zkracovat prázdné řádky"
+
+#.
+#. * Headers Transferred to Remote Servers
+#.
+#: src/LYOptions.c:4102
+msgid "Headers Transferred to Remote Servers"
+msgstr "HlaviÄky pÅ™enášené na Vzdálené Servery"
+
+#. ***************************************************************
+#. Mail Address: INPUT
+#: src/LYOptions.c:4106
+msgid "Personal mail address"
+msgstr "Osobní adresa elektronické pošty"
+
+#: src/LYOptions.c:4111
+msgid "Personal name for mail"
+msgstr "Osobní jméno pro email"
+
+#: src/LYOptions.c:4118
+msgid "Password for anonymous ftp"
+msgstr "Heslo pro anonymní ftp"
+
+#. Preferred content type: SELECT
+#: src/LYOptions.c:4124
+msgid "Preferred content type"
+msgstr "Upřednostńovaný typ obsahu"
+
+#. Preferred media type: SELECT
+#: src/LYOptions.c:4130
+msgid "Preferred media type"
+msgstr "Upřednostňovaný typ médií"
+
+#. Preferred encoding: SELECT
+#: src/LYOptions.c:4136
+msgid "Preferred encoding"
+msgstr "Upřednostňované kódování"
+
+#. Preferred Document Character Set: INPUT
+#: src/LYOptions.c:4142
+msgid "Preferred document character set"
+msgstr "Upřednostňovaná znaková sada"
+
+#. Preferred Document Language: INPUT
+#: src/LYOptions.c:4147
+msgid "Preferred document language"
+msgstr "Upřednostňovaný jazyk dokumentu"
+
+#. HTTP protocol SELECT
+#: src/LYOptions.c:4152
+msgid "HTTP protocol"
+msgstr "HTTP protokol"
+
+#: src/LYOptions.c:4159
+msgid "Send User-Agent header"
+msgstr "Poslat hlaviÄku 'User-Agent'"
+
+#: src/LYOptions.c:4161
+msgid "User-Agent header"
+msgstr "HlaviÄka 'User-Agent'"
+
+#.
+#. * Listing and Accessing Files
+#.
+#: src/LYOptions.c:4169
+msgid "Listing and Accessing Files"
+msgstr "Zobrazování adresářů a přístup k souborům"
+
+#. FTP sort: SELECT
+#: src/LYOptions.c:4174
+msgid "Use Passive FTP"
+msgstr "Použít Pasivní FTP"
+
+#. FTP sort: SELECT
+#: src/LYOptions.c:4180
+msgid "FTP sort criteria"
+msgstr "Řazení FTP adresářů"
+
+#. Local Directory Sort: SELECT
+#: src/LYOptions.c:4188
+msgid "Local directory sort criteria"
+msgstr "Kritérium řazení lokálních adresářů"
+
+#. Local Directory Order: SELECT
+#: src/LYOptions.c:4194
+msgid "Local directory sort order"
+msgstr "Pořadí řazení lokálních adresářů"
+
+#: src/LYOptions.c:4203
+msgid "Show dot files"
+msgstr "Zobrazovat teÄkové soubory"
+
+#: src/LYOptions.c:4211
+msgid "Execution links"
+msgstr "Spustitelné odkazy"
+
+#: src/LYOptions.c:4229
+msgid "Pause when showing message"
+msgstr "Pozastavit, když zobrazuji oznámení"
+
+#. Show transfer rate: SELECT
+#: src/LYOptions.c:4236
+msgid "Show transfer rate"
+msgstr "Zobrazit hodnotu přenosu dat"
+
+#.
+#. * Special Files and Screens
+#.
+#: src/LYOptions.c:4256
+msgid "Special Files and Screens"
+msgstr "Zvláštní soubory a stránky"
+
+#: src/LYOptions.c:4261
+msgid "Multi-bookmarks"
+msgstr "Dělené záložky"
+
+#: src/LYOptions.c:4269
+msgid "Review/edit Bookmarks files"
+msgstr "Editace souborů se záložkami"
+
+#: src/LYOptions.c:4272
+msgid "Goto multi-bookmark menu"
+msgstr "Menu dělených záložek"
+
+#: src/LYOptions.c:4274
+msgid "Bookmarks file"
+msgstr "Soubor se záložkami"
+
+#. Auto Session: ON/OFF
+#: src/LYOptions.c:4281
+msgid "Auto Session"
+msgstr "Automatické Sezení"
+
+#. Session File Menu: INPUT
+#: src/LYOptions.c:4287
+msgid "Session file"
+msgstr "Soubor sezení"
+
+#. Visited Pages: SELECT
+#: src/LYOptions.c:4293
+msgid "Visited Pages"
+msgstr "Navštívené Stránky"
+
+#: src/LYOptions.c:4298
+msgid "View the file "
+msgstr "Zobrazit soubor "
+
+#: src/LYPrint.c:956
+#, c-format
+msgid " Print job complete.\n"
+msgstr " Tisk dokonÄen.\n"
+
+#: src/LYPrint.c:1283
+msgid "Document:"
+msgstr "Dokument:"
+
+#: src/LYPrint.c:1284
+msgid "Number of lines:"
+msgstr "PoÄet řádků:"
+
+#: src/LYPrint.c:1285
+msgid "Number of pages:"
+msgstr "PoÄet stran:"
+
+#: src/LYPrint.c:1286
+msgid "pages"
+msgstr "stran(y)"
+
+#: src/LYPrint.c:1286
+msgid "page"
+msgstr "strana"
+
+#: src/LYPrint.c:1287
+msgid "(approximately)"
+msgstr "(přibližně)"
+
+#: src/LYPrint.c:1294
+msgid "Some print functions have been disabled!"
+msgstr "Některé funkce tisku byly vypnuty!"
+
+#: src/LYPrint.c:1298
+msgid "Standard print options:"
+msgstr "Standardní menu voleb tisku:"
+
+#: src/LYPrint.c:1299
+msgid "Print options:"
+msgstr "Menu voleb tisku:"
+
+#: src/LYPrint.c:1306
+msgid "Save to a local file"
+msgstr "Uložit do místního souboru"
+
+#: src/LYPrint.c:1308
+msgid "Save to disk disabled"
+msgstr "Ukládání na disk je vypnuto"
+
+#: src/LYPrint.c:1315
+msgid "Mail the file"
+msgstr "Poslat soubor poštou"
+
+#: src/LYPrint.c:1322
+msgid "Print to the screen"
+msgstr "Vytisknout na obrazovku"
+
+#: src/LYPrint.c:1327
+msgid "Print out on a printer attached to your vt100 terminal"
+msgstr "Vytisknout na tiskárnu připojenou k vašemu vt100 terminálu"
+
+#: src/LYReadCFG.c:437
+#, c-format
+msgid ""
+"Syntax Error parsing COLOR in configuration file:\n"
+"The line must be of the form:\n"
+"COLOR:INTEGER:FOREGROUND:BACKGROUND\n"
+"\n"
+"Here FOREGROUND and BACKGROUND must be one of:\n"
+"The special strings 'nocolor' or 'default', or\n"
+msgstr ""
+"Byla nalezena syntaktická chyba pÅ™i zpracování COLOR v konfiguraÄním souboru:\n"
+"Řádek musí být ve formátu:\n"
+"COLOR:CELÉ ÄŒÃSLO:POPŘEDÃ:POZADÃ\n"
+"\n"
+"Zde POPŘEDà a POZADà musí být jedno z:\n"
+"Zvláštní řetězec 'nocolor' nebo 'default', nebo\n"
+
+#: src/LYReadCFG.c:450
+msgid "Offending line:"
+msgstr "Kritický řádek:"
+
+#: src/LYReadCFG.c:764
+#, c-format
+msgid "key remapping of %s to %s for %s failed\n"
+msgstr "chyba při přemapovávání klávesy %1$s pro %3$s na %2$s\n"
+
+#: src/LYReadCFG.c:771
+#, c-format
+msgid "key remapping of %s to %s failed\n"
+msgstr "chyba při přemapovávání klávesy %s na %s\n"
+
+#: src/LYReadCFG.c:792
+#, c-format
+msgid "invalid line-editor selection %s for key %s, selecting all\n"
+msgstr "volba %s řádkového editoru pro klávesu %s je chybná, volím vše\n"
+
+#: src/LYReadCFG.c:817 src/LYReadCFG.c:829
+#, c-format
+msgid "setting of line-editor binding for key %s (0x%x) to 0x%x for %s failed\n"
+msgstr "klávesu %1$s (0x%2$x) se s funkcí %4$s (0x%3$x) řádkového editoru nepodařilo svázat\n"
+
+#: src/LYReadCFG.c:833
+#, c-format
+msgid "setting of line-editor binding for key %s (0x%x) for %s failed\n"
+msgstr "klávesu %s (0x%x) se s funkcí %s řádkového editoru nepodařilo svázat\n"
+
+#: src/LYReadCFG.c:929
+#, c-format
+msgid "Lynx: cannot start, CERN rules file %s is not available\n"
+msgstr "Lynx: nelze spustit, soubor %s s pravidly CERN není dostupný\n"
+
+#: src/LYReadCFG.c:930
+msgid "(no name)"
+msgstr "(žádné jméno)"
+
+#: src/LYReadCFG.c:2076
+#, c-format
+msgid "More than %d nested lynx.cfg includes -- perhaps there is a loop?!?\n"
+msgstr "Více než %d vnoÅ™ených vložení z lynx.cfg -- nejedná se o nekoneÄnou smyÄku?!?\n"
+
+#: src/LYReadCFG.c:2078
+#, c-format
+msgid "Last attempted include was '%s',\n"
+msgstr "Poslední vložený soubor je '%s'.\n"
+
+#: src/LYReadCFG.c:2079
+#, c-format
+msgid "included from '%s'.\n"
+msgstr "vložený z '%s'.\n"
+
+#: src/LYReadCFG.c:2490 src/LYReadCFG.c:2503 src/LYReadCFG.c:2561
+msgid "The following is read from your lynx.cfg file."
+msgstr "Následující údaje jsou Äteny z vaÅ¡eho lynx.cfg."
+
+#: src/LYReadCFG.c:2491 src/LYReadCFG.c:2504
+msgid "Please read the distribution"
+msgstr "PÅ™eÄtÄ›te si implicitní dodávaný s distribucí"
+
+#: src/LYReadCFG.c:2497 src/LYReadCFG.c:2507
+msgid "for more comments."
+msgstr "pro více informací."
+
+#: src/LYReadCFG.c:2543
+msgid "RELOAD THE CHANGES"
+msgstr "NAÄŒÃST ZMÄšNY"
+
+#: src/LYReadCFG.c:2551
+msgid "Your primary configuration"
+msgstr "Vaše primární konfigurace"
+
+#: src/LYShowInfo.c:116
+msgid "URL:"
+msgstr "URL:"
+
+#: src/LYShowInfo.c:200
+msgid "Directory that you are currently viewing"
+msgstr "Adresář, který právě prohlížíte"
+
+#: src/LYShowInfo.c:203
+msgid "Name:"
+msgstr "Jméno:"
+
+#: src/LYShowInfo.c:220
+msgid "Directory that you have currently selected"
+msgstr "Adresář, který jste právě zvolil"
+
+#: src/LYShowInfo.c:222
+msgid "File that you have currently selected"
+msgstr "Soubor, který jste právě zvolil"
+
+#: src/LYShowInfo.c:225
+msgid "Symbolic link that you have currently selected"
+msgstr "Symbolický odkaz, který jste právě zvolil"
+
+#: src/LYShowInfo.c:228
+msgid "Item that you have currently selected"
+msgstr "Položka, kterou jste právě zvolil"
+
+#: src/LYShowInfo.c:230
+msgid "Full name:"
+msgstr "Celé jméno:"
+
+#: src/LYShowInfo.c:243
+msgid "Unable to follow link"
+msgstr "Odkaz nelze následovat"
+
+#: src/LYShowInfo.c:245
+msgid "Points to file:"
+msgstr "Odkazuje do souboru:"
+
+#: src/LYShowInfo.c:250
+msgid "Name of owner:"
+msgstr "Jméno vlastníka:"
+
+#: src/LYShowInfo.c:253
+msgid "Group name:"
+msgstr "Jméno skupiny:"
+
+#: src/LYShowInfo.c:255
+msgid "File size:"
+msgstr "Velikost souboru:"
+
+#: src/LYShowInfo.c:257
+msgid "(bytes)"
+msgstr "(bajtů)"
+
+#.
+#. * Include date and time information.
+#.
+#: src/LYShowInfo.c:262
+msgid "Creation date:"
+msgstr "Datum vytvoření:"
+
+#: src/LYShowInfo.c:265
+msgid "Last modified:"
+msgstr "Poslední změna:"
+
+#: src/LYShowInfo.c:268
+msgid "Last accessed:"
+msgstr "Poslední přístup:"
+
+#: src/LYShowInfo.c:274
+msgid "Access Permissions"
+msgstr "Přístupová práva"
+
+#: src/LYShowInfo.c:309
+msgid "Group:"
+msgstr "Skupina:"
+
+#: src/LYShowInfo.c:329
+msgid "World:"
+msgstr "Svět:"
+
+#: src/LYShowInfo.c:336
+msgid "File that you are currently viewing"
+msgstr "Soubor, který si právě prohlížíte"
+
+#: src/LYShowInfo.c:344 src/LYShowInfo.c:444
+msgid "Linkname:"
+msgstr "Jméno odkazu:"
+
+#: src/LYShowInfo.c:350 src/LYShowInfo.c:365
+msgid "Charset:"
+msgstr "Znaková sada:"
+
+#: src/LYShowInfo.c:364
+msgid "(assumed)"
+msgstr "(předpokládá se)"
+
+#: src/LYShowInfo.c:371
+msgid "Server:"
+msgstr "Server:"
+
+#: src/LYShowInfo.c:374
+msgid "Date:"
+msgstr "Datum:"
+
+#: src/LYShowInfo.c:377
+msgid "Last Mod:"
+msgstr "Poslední modifikace:"
+
+#: src/LYShowInfo.c:381
+msgid "Expires:"
+msgstr "Expiruje:"
+
+#: src/LYShowInfo.c:384
+msgid "Cache-Control:"
+msgstr "Kontrola Vyrovnávací Paměti:"
+
+#: src/LYShowInfo.c:387
+msgid "Content-Length:"
+msgstr "Délka Obsahu:"
+
+#: src/LYShowInfo.c:391
+msgid "Length:"
+msgstr "Délka:"
+
+#: src/LYShowInfo.c:396
+msgid "Language:"
+msgstr "Jazyk:"
+
+#: src/LYShowInfo.c:402
+msgid "Post Data:"
+msgstr "Post Data:"
+
+#: src/LYShowInfo.c:405
+msgid "Post Content Type:"
+msgstr "Typ Obsahu Post:"
+
+#: src/LYShowInfo.c:408
+msgid "Owner(s):"
+msgstr "Vlastníci:"
+
+#: src/LYShowInfo.c:413
+msgid "size:"
+msgstr "velikost:"
+
+#: src/LYShowInfo.c:415
+msgid "lines"
+msgstr "řádky"
+
+#: src/LYShowInfo.c:419
+msgid "forms mode"
+msgstr "formulářový režim"
+
+#: src/LYShowInfo.c:421
+msgid "source"
+msgstr "zdroj"
+
+#: src/LYShowInfo.c:422
+msgid "normal"
+msgstr "běžný"
+
+#: src/LYShowInfo.c:424
+msgid ", safe"
+msgstr ", bezpeÄný"
+
+#: src/LYShowInfo.c:426
+msgid ", via internal link"
+msgstr ", přes vnitřní odkaz"
+
+#: src/LYShowInfo.c:430
+msgid ", no-cache"
+msgstr ", žádná vyrovnávací paměť"
+
+#: src/LYShowInfo.c:432
+msgid ", ISMAP script"
+msgstr ", ISMAP skript"
+
+#: src/LYShowInfo.c:434
+msgid ", bookmark file"
+msgstr ", soubor záložek"
+
+#: src/LYShowInfo.c:437
+msgid "mode:"
+msgstr "režim:"
+
+#: src/LYShowInfo.c:443
+msgid "Link that you currently have selected"
+msgstr "Odkaz, který jste právě zvolil"
+
+#: src/LYShowInfo.c:452
+msgid "Method:"
+msgstr "Metoda:"
+
+#: src/LYShowInfo.c:456
+msgid "Enctype:"
+msgstr "Typ kódování:"
+
+#: src/LYShowInfo.c:462
+msgid "Action:"
+msgstr "Akce:"
+
+#: src/LYShowInfo.c:468
+msgid "(Form field)"
+msgstr "(Pole formuláře)"
+
+#: src/LYShowInfo.c:478
+msgid "No Links on the current page"
+msgstr "Aktuální stránka neobsahuje žádné odkazy"
+
+#: src/LYShowInfo.c:483
+msgid "Server Headers:"
+msgstr "HlaviÄky serveru:"
+
+#: src/LYStyle.c:332
+#, c-format
+msgid ""
+"Syntax Error parsing style in lss file:\n"
+"[%s]\n"
+"The line must be of the form:\n"
+"OBJECT:MONO:COLOR (ie em:bold:brightblue:white)\n"
+"where OBJECT is one of EM,STRONG,B,I,U,BLINK etc.\n"
+"\n"
+msgstr ""
+"Syntaktická chyba při zpracování stylu v lss souboru:\n"
+"[%s]\n"
+"Řádek musí mít formát:\n"
+"OBJEKT:MONO:BARVA (t.j. em:bold:brightblue:white)\n"
+"kde OBJEKT je jedno z EM,STRONG,B,I,U,BLINK etc.\n"
+"\n"
+
+#: src/LYStyle.c:939
+#, c-format
+msgid ""
+"\n"
+"Lynx file \"%s\" is not available.\n"
+"\n"
+msgstr ""
+"\n"
+"Soubor lynxu \"%s\" není dostupný.\n"
+"\n"
+
+#: src/LYTraversal.c:111
+msgid "here is a list of the history stack so that you may rebuild"
+msgstr "zde je výpis historie zásobníku pro případ opětovného sestavení"
+
+#: src/LYUpload.c:77
+msgid "ERROR! - upload command is misconfigured"
+msgstr "CHYBA! - příkaz pro nahrání (upload) je špatně nakonfigurovaný"
+
+#: src/LYUpload.c:98
+msgid "Illegal redirection \"../\" found! Request ignored."
+msgstr "Chybné přesměrování obsahuje \"../\"! Požadavek ignorován."
+
+#: src/LYUpload.c:101
+msgid "Illegal character \"/\" found! Request ignored."
+msgstr "Nalezen chybný znak \"/\"! Požadavek ignorován."
+
+#: src/LYUpload.c:104
+msgid "Illegal redirection using \"~\" found! Request ignored."
+msgstr "Cyhbné přesměrování obsahuje \"~\"! Požadavek ignorován."
+
+#: src/LYUpload.c:157
+msgid "Unable to upload file."
+msgstr "Soubor nelze nahrát (upload)."
+
+#: src/LYUpload.c:196
+msgid "Upload To:"
+msgstr "Nahrát (upload) na:"
+
+#: src/LYUpload.c:197
+msgid "Upload options:"
+msgstr "Menu voleb nahrání (upload):"
+
+#: src/LYUtils.c:1911
+msgid "Download document URL put to clipboard."
+msgstr "Stáhnout dokument URL, který je ve schránce."
+
+#: src/LYUtils.c:2658
+msgid "Unexpected access protocol for this URL scheme."
+msgstr "NeoÄekávaný protokol pro tento typ URL."
+
+#: src/LYUtils.c:3571
+msgid "Too many tempfiles"
+msgstr "PříliÅ¡ mnoho doÄasných souborů"
+
+#: src/LYUtils.c:3871
+msgid "unknown restriction"
+msgstr "neznámé omezení"
+
+#: src/LYUtils.c:3902
+#, c-format
+msgid "No restrictions set.\n"
+msgstr "Žádná omezení.\n"
+
+#: src/LYUtils.c:3905
+#, c-format
+msgid "Restrictions set:\n"
+msgstr "Zapnutá omezení:\n"
+
+#: src/LYUtils.c:5202
+msgid "Cannot find HOME directory"
+msgstr "Nemohu nalézt DOMOVSKà adresář"
+
+#: src/LYrcFile.c:16
+msgid "Normally disabled. See ENABLE_LYNXRC in lynx.cfg\n"
+msgstr "Implicitně vypnuté. Viz ENABLE_LYNXRC v lynx.cfg\n"
+
+#: src/LYrcFile.c:363
+msgid ""
+"accept_all_cookies allows the user to tell Lynx to automatically\n"
+"accept all cookies if desired. The default is \"FALSE\" which will\n"
+"prompt for each cookie. Set accept_all_cookies to \"TRUE\" to accept\n"
+"all cookies.\n"
+msgstr ""
+"accept_all_cookies říká Lynxu, aby automaticky přijímal všechna cookie.\n"
+"Implicitní nastavení je \"FALSE\", při kterém budete muset potvrdit přijetí\n"
+"každého cookie. Přijetí každého cookie zapnete nastavením accept_all_cookies\n"
+"na \"TRUE\".\n"
+
+#: src/LYrcFile.c:371
+msgid ""
+"anonftp_password allows the user to tell Lynx to use the personal\n"
+"email address as the password for anonymous ftp. If no value is given,\n"
+"Lynx will use the personal email address. Set anonftp_password\n"
+"to a different value if you choose.\n"
+msgstr ""
+"anonftp_password umožní uživatel Lynxu použít osobní\n"
+"emailovou adresu jako heslo pro anonymní ftp. Pokud není nastavena\n"
+"žádná hodnota, Lynx použije osobní emailovou adresu. Nastavte\n"
+"anonftp_password na libovolnou hodnotu.\n"
+"\n"
+
+#: src/LYrcFile.c:380
+msgid ""
+"bookmark_file specifies the name and location of the default bookmark\n"
+"file into which the user can paste links for easy access at a later\n"
+"date.\n"
+msgstr ""
+"bookmark_file udává jméno implicitního souboru se záložkami,\n"
+"do kterého si uživatel může ukládat odkazy pro pozdější použití.\n"
+
+#: src/LYrcFile.c:385
+msgid ""
+"If case_sensitive_searching is \"on\" then when the user invokes a search\n"
+"using the 's' or '/' keys, the search performed will be case sensitive\n"
+"instead of case INsensitive. The default is usually \"off\".\n"
+msgstr ""
+"Pokud je volba case_sensitive_searching zapnuta (\"on\"), uživatel při vyhledávání,\n"
+"které spustí klávesou 's' Äi '/' , bude toto brát ohled na velikost písmen.\n"
+"Tato volba je implicitnÄ› vypnuta (\"off\").\n"
+
+#: src/LYrcFile.c:390
+msgid ""
+"The character_set definition controls the representation of 8 bit\n"
+"characters for your terminal. If 8 bit characters do not show up\n"
+"correctly on your screen you may try changing to a different 8 bit\n"
+"set or using the 7 bit character approximations.\n"
+"Current valid characters sets are:\n"
+msgstr ""
+"Volba character_set definuje způsob zobrazení 8bitových znaků na vašem\n"
+"terminálu. Pokud se na vaší obrazovce 8bitové znaky nezobrazují správně,\n"
+"můžete zkusit jiné 8bitové kódování, Äi použít 7bitové aproximace.\n"
+"Možné znakové sady:\n"
+
+#: src/LYrcFile.c:398
+msgid ""
+"cookie_accept_domains and cookie_reject_domains are comma-delimited\n"
+"lists of domains from which Lynx should automatically accept or reject\n"
+"all cookies. If a domain is specified in both options, rejection will\n"
+"take precedence. The accept_all_cookies parameter will override any\n"
+"settings made here.\n"
+msgstr ""
+"cookie_accept_domains a cookie_reject_domains jsou dvojteÄkou oddÄ›lený seznam\n"
+"domén, z kterých Lynx automaticky pÅ™ijme, Äi odmítne jakékoliv cookie. Pokud\n"
+"je doména uvedena v obou seznamech, má cookie_reject_domains přednost. Volba\n"
+"accept_all_cookies má vyšší prioritu, než obě tyto volby.\n"
+
+#: src/LYrcFile.c:406
+msgid ""
+"cookie_file specifies the file from which to read persistent cookies.\n"
+"The default is ~/"
+msgstr ""
+"cookie_file udává soubor, ve kterém se ukládají trvalé cookies.\n"
+"Implicitním hodnotou je ~/"
+
+#: src/LYrcFile.c:411
+msgid ""
+"cookie_loose_invalid_domains, cookie_strict_invalid_domains, and\n"
+"cookie_query_invalid_domains are comma-delimited lists of which domains\n"
+"should be subjected to varying degrees of validity checking. If a\n"
+"domain is set to strict checking, strict conformance to RFC2109 will\n"
+"be applied. A domain with loose checking will be allowed to set cookies\n"
+"with an invalid path or domain attribute. All domains will default to\n"
+"querying the user for an invalid path or domain.\n"
+msgstr ""
+"cookie_loose_invalid_domains, cookie_strict_invalid_domains a\n"
+"cookie_query_invalid_domains jsou dvojteÄkou oddÄ›lený seznam domén,\n"
+"které by měly být podrobeny nejrůznějším stupňům ověřování. Pokud je\n"
+"doména nastavena na 'strict' ověřování, bude postupováno přesně dle RFC2109.\n"
+"Doména s 'loose' ověřováním bude moci nastavovat cookies s chybnou cestou\n"
+"Äi doménovým atributem (implicitním nastavením je zeptat se uživatele - query).\n"
+
+#: src/LYrcFile.c:425
+msgid ""
+"dir_list_order specifies the directory list order under DIRED_SUPPORT\n"
+"(if implemented). The default is \"ORDER_BY_NAME\"\n"
+msgstr ""
+"dir_list_order specifikuje seznamd adresářů pod DIRED_SUPPORT\n"
+"(pokud je podporováno). Implicitně je nastaveno \"ORDER_BY_NAME\",\n"
+"které seřadí adresáře podle jména\n"
+
+#: src/LYrcFile.c:430
+msgid ""
+"dir_list_styles specifies the directory list style under DIRED_SUPPORT\n"
+"(if implemented). The default is \"MIXED_STYLE\", which sorts both\n"
+"files and directories together. \"FILES_FIRST\" lists files first and\n"
+"\"DIRECTORIES_FIRST\" lists directories first.\n"
+msgstr ""
+"dir_list_styles udává použitý styl pro výpis adresářů pod DIRED_SUPPORT\n"
+"(pokud je podporováno). Implicitní nastavení je \"MIXED_STYLE\", které způsobí\n"
+"vzájemné promíchání souborů s adresáři. \"FILES_FIRST\" vypíše jako první\n"
+"soubory a \"DIRED_SUPPORT\" adresáře.\n"
+
+#: src/LYrcFile.c:438
+msgid ""
+"If emacs_keys is to \"on\" then the normal EMACS movement keys:\n"
+" ^N = down ^P = up\n"
+" ^B = left ^F = right\n"
+"will be enabled.\n"
+msgstr ""
+"Pokud je volba emacs_keys nastavena na \"on\", pak jsou běžné EMACS klávesy pro pohyb:\n"
+" ^N = dolů ^P = nahoru\n"
+" ^B = vlevo ^F = vpravo\n"
+"zapnuty.\n"
+
+#: src/LYrcFile.c:444
+msgid ""
+"file_editor specifies the editor to be invoked when editing local files\n"
+"or sending mail. If no editor is specified, then file editing is disabled\n"
+"unless it is activated from the command line, and the built-in line editor\n"
+"will be used for sending mail.\n"
+msgstr ""
+"file_editor udává, který editor bude použit k úpravám místních souborů\n"
+"a psaní mailů. Jestliže není specifikován žádný editor, tak, pokud nejsou\n"
+"povoleny z příkazové řádky, jsou úpravy souborů zakázány. Pro psaní mailů\n"
+"bude použit vestavěný editor.\n"
+
+#: src/LYrcFile.c:451
+msgid ""
+"The file_sorting_method specifies which value to sort on when viewing\n"
+"file lists such as FTP directories. The options are:\n"
+" BY_FILENAME -- sorts on the name of the file\n"
+" BY_TYPE -- sorts on the type of the file\n"
+" BY_SIZE -- sorts on the size of the file\n"
+" BY_DATE -- sorts on the date of the file\n"
+msgstr ""
+"Metoda Å™azení souborů udává klíÄ, dle kterého budou Å™azeny seznamy souborů,\n"
+"jako jsou například FTP adresáře. Možné volby jsou:\n"
+" BY_FILENAME -- řadí dle jména souboru\n"
+" BY_TYPE -- řadí dle typu souboru\n"
+" BY_SIZE -- řadí dle velikosti souboru\n"
+" BY_DATE -- řadí dle data souboru\n"
+
+#: src/LYrcFile.c:478
+msgid ""
+"lineedit_mode specifies the key binding used for inputting strings in\n"
+"prompts and forms. If lineedit_mode is set to \"Default Binding\" then\n"
+"the following control characters are used for moving and deleting:\n"
+"\n"
+" Prev Next Enter = Accept input\n"
+" Move char: <- -> ^G = Cancel input\n"
+" Move word: ^P ^N ^U = Erase line\n"
+" Delete char: ^H ^R ^A = Beginning of line\n"
+" Delete word: ^B ^F ^E = End of line\n"
+"\n"
+"Current lineedit modes are:\n"
+msgstr ""
+"lineedit_mode specifikuje funkce kláves pro řádkový editor a formuláře.\n"
+"Pokud je tato volba nastavena na \"Default Binding\", pak jsou pro posun\n"
+"kurzoru a mazání textu použity následující klávesy:\n"
+"\n"
+" Prev Next Enter = Přijme zadaný text\n"
+" Posun o znak: <- -> ^G = Zruší zadávání\n"
+" Posun o slovo: ^P ^N ^U = Smaže řádek\n"
+" Smaže znak: ^H ^R ^A = ZaÄátek řádku\n"
+" Smaže slovo: ^B ^F ^E = Konec řádku\n"
+"\n"
+"Možné režimy řádkového editoru:\n"
+
+#: src/LYrcFile.c:496
+msgid ""
+"The following allow you to define sub-bookmark files and descriptions.\n"
+"The format is multi_bookmark<capital_letter>=<filename>,<description>\n"
+"Up to 26 bookmark files (for the English capital letters) are allowed.\n"
+"We start with \"multi_bookmarkB\" since 'A' is the default (see above).\n"
+msgstr ""
+"Zde můžete nastavit jména podsouborů záložek a jejich popisy. Formát je:\n"
+"multi_bookmark<velké_písmeno>=<jméno souboru>,<popis>. Může být zadáno až 26\n"
+"podsouborů záložek (každý odpovídá jednomu velkému písmenu anglické abecedy).\n"
+"ZaÄíná se s \"multi_bookmarkB\", protože 'A' je implicitní (viz výše).\n"
+
+#: src/LYrcFile.c:502
+msgid ""
+"personal_mail_address specifies your personal mail address. The\n"
+"address will be sent during HTTP file transfers for authorization and\n"
+"logging purposes, and for mailed comments.\n"
+"If you do not want this information given out, set the NO_FROM_HEADER\n"
+"to TRUE in lynx.cfg, or use the -nofrom command line switch. You also\n"
+"could leave this field blank, but then you won't have it included in\n"
+"your mailed comments.\n"
+msgstr ""
+"personal_mail_address udává vaši osobní adresu elektronické pošty. Bude\n"
+"použita pÅ™i HTTP pÅ™enosech souborů pro autorizaci a záznam Äinnosti a pÅ™i\n"
+"zasílání komentářů.\n"
+"Pokud chcete, aby tato informace zůstala důvÄ›rnou, nastavte v konfiguraÄním\n"
+"souboru lynx.cfg volbu NO_FROM_HEADER na TRUE, Äi použijte pÅ™epínaÄ -nofrom\n"
+"z příkazového řádku. Je možné nechat toto pole prázdné, ale pak by nebylo\n"
+"zaÄlenÄ›no do vámi odeslaných komentářů.\n"
+
+#: src/LYrcFile.c:511
+msgid ""
+"personal_mail_name specifies your personal name, for mail. The\n"
+"name is sent for mailed comments. Lynx will prompt for this,\n"
+"showing the configured value as a default when sending mail.\n"
+"This is not necessarily the same as a name provided as part of the\n"
+"personal_mail_address.\n"
+"Lynx does not save your changes to that default value as a side-effect\n"
+"of sending email. To update the default value, you must use the options\n"
+"menu, or modify this file directly.\n"
+msgstr ""
+"personal_mail_name specifikuje vaše osobní jméno pro email. Jméno\n"
+"je posíláno s komentáři. Při posílání emailu se Lynx vždy zeptá a nabídne\n"
+"nakonfigurované jméno jako implicitní možnost. Nemusí to být stejné jako\n"
+"jméno použité při osobní emailové adrese.\n"
+
+#: src/LYrcFile.c:521
+msgid ""
+"preferred_charset specifies the character set in MIME notation (e.g.,\n"
+"ISO-8859-2, ISO-8859-5) which Lynx will indicate you prefer in requests\n"
+"to http servers using an Accept-Charset header. The value should NOT\n"
+"include ISO-8859-1 or US-ASCII, since those values are always assumed\n"
+"by default. May be a comma-separated list.\n"
+"If a file in that character set is available, the server will send it.\n"
+"If no Accept-Charset header is present, the default is that any\n"
+"character set is acceptable. If an Accept-Charset header is present,\n"
+"and if the server cannot send a response which is acceptable\n"
+"according to the Accept-Charset header, then the server SHOULD send\n"
+"an error response, though the sending of an unacceptable response\n"
+"is also allowed.\n"
+msgstr ""
+"preferred_charset udává, ve kterých znakových sadách bude Lynx přednostně\n"
+"požadovat dokumenty od http serverů. Znaková sada musí být zadána v MIME notaci\n"
+"(ISO-8859-2, ISO-8859-5). Sady ISO-8859-1 a US-ASCII by NEMĚLY být použity,\n"
+"neboť tyto znakové sady jsou vždy implicitně předpokládány. Znakových sad\n"
+"může být uvedeno více a musí být oddÄ›leny Äárkou.\n"
+"Pokud je dokument v této znakové sadě k dispozici, server jej zašle. V případě,\n"
+"že hlaviÄka Accept-Charset není přítomna, se implicitnÄ› pÅ™edpokládá, že bude\n"
+"akceptována jakákoli znaková sada. Jestliže je hlaviÄka Accept-Charset přítomna\n"
+"a server nemůže zaslat dokument v pořadované znakové sadě, MĚL BY zaslat\n"
+"chybovou hlášku. Může však také poslat dokument v jiné, než požadované\n"
+"znakové sadě.\n"
+
+#: src/LYrcFile.c:539
+msgid ""
+"preferred_language specifies the language in MIME notation (e.g., en,\n"
+"fr, may be a comma-separated list in decreasing preference)\n"
+"which Lynx will indicate you prefer in requests to http servers.\n"
+"If a file in that language is available, the server will send it.\n"
+"Otherwise, the server will send the file in its default language.\n"
+msgstr ""
+"preferred_language udává, v kterých jazycích bude Lynx přednostně\n"
+"požadovat dokumenty od http serverů. Jazyk musí být zadán v MIME notaci (např.\n"
+"en, fr; může jich být zadáno více oddÄ›lených Äárkou v sestupném poÅ™adí dle\n"
+"preference). Pokud bude dokument v tomto jazyce k dispozici, server jej zašle.\n"
+"V opaÄném případÄ› jej zaÅ¡le ve svém implicitním jazyce.\n"
+
+#: src/LYrcFile.c:550
+msgid ""
+"If run_all_execution_links is set \"on\" then all local execution links\n"
+"will be executed when they are selected.\n"
+"\n"
+"WARNING - This is potentially VERY dangerous. Since you may view\n"
+" information that is written by unknown and untrusted sources\n"
+" there exists the possibility that Trojan horse links could be\n"
+" written. Trojan horse links could be written to erase files\n"
+" or compromise security. This should only be set to \"on\" if\n"
+" you are viewing trusted source information.\n"
+msgstr ""
+"Pokud je volba run_all_execution_links zapnuta (\"on\"), pak všechny programy\n"
+"budou při zvolení odkazu na tento program spuštěny.\n"
+"\n"
+"VAROVÃNà - Tato volba je VELICE nebezpeÄná. Jelikož si můžete prohlížet\n"
+" informace, které pocházejí z neznámých a nedůvěryhodných zdrojů,\n"
+" existuje možnost, že některé odkazy vedou k programům typu 'trojský\n"
+" kůň'. ÚÄelem odkazů na 'trojské konÄ›' může být smazání souborů Äi\n"
+" naruÅ¡ení bezpeÄnosti systému. Tato volba by mÄ›la být zapnuta pouze\n"
+" tehdy, jestliže soubory, které prohlížíte, pocházejí z důvěryhodných\n"
+" zdrojů.\n"
+
+#: src/LYrcFile.c:561
+msgid ""
+"If run_execution_links_on_local_files is set \"on\" then all local\n"
+"execution links that are found in LOCAL files will be executed when they\n"
+"are selected. This is different from run_all_execution_links in that\n"
+"only files that reside on the local system will have execution link\n"
+"permissions.\n"
+"\n"
+"WARNING - This is potentially dangerous. Since you may view\n"
+" information that is written by unknown and untrusted sources\n"
+" there exists the possibility that Trojan horse links could be\n"
+" written. Trojan horse links could be written to erase files\n"
+" or compromise security. This should only be set to \"on\" if\n"
+" you are viewing trusted source information.\n"
+msgstr ""
+"Pokud je volba run_execution_links_on_local_files zapnuta (\"on\"), pak\n"
+"vÅ¡echny místní programy, na které je odkaz v MÃSTNÃCH souborech, budou pÅ™i\n"
+"zvolení tohoto odkazu spuštěny. Tato volba se od volby run_all_execution_links\n"
+"odlišuje v tom, že povoluje spouštění pouze těch programů, na něž vedou odkazy\n"
+"z MÃSTNÃCH souborů.\n"
+"\n"
+"VAROVÃNà - Tato volba je potenciálnÄ› nebezpeÄná. Jelikož si můžete prohlížet\n"
+" informace, které pocházejí z neznámých a nedůvěryhodných zdrojů,\n"
+" existuje možnost, že některé odkazy vedou k programům typu 'trojský\n"
+" kůň'. ÚÄelem odkazů na 'trojské konÄ›' může být smazání souborů Äi\n"
+" naruÅ¡ení bezpeÄnosti systému. Tato volba by mÄ›la být zapnuta pouze\n"
+" tehdy, jestliže soubory, které prohlížíte, pocházejí z důvěryhodných\n"
+" zdrojů.\n"
+
+#: src/LYrcFile.c:579
+msgid ""
+"select_popups specifies whether the OPTIONs in a SELECT block which\n"
+"lacks a MULTIPLE attribute are presented as a vertical list of radio\n"
+"buttons or via a popup menu. Note that if the MULTIPLE attribute is\n"
+"present in the SELECT start tag, Lynx always will create a vertical list\n"
+"of checkboxes for the OPTIONs. A value of \"on\" will set popup menus\n"
+"as the default while a value of \"off\" will set use of radio boxes.\n"
+"The default can be overridden via the -popup command line toggle.\n"
+msgstr ""
+"select_popups udává, zda volby (OPTION) uvnitř prvku SELECT, který\n"
+"nemá specifikován atribut MULTIPLE, budou zobrazeny jako vertikální seznam\n"
+"pÅ™epínacích tlaÄítek Äi jako vyskakovací menu. Pokud je atribut MULTIPLE\n"
+"specifikován, pak Lynx vždy vytvoří vertikální seznam zaškrtávacích polí.\n"
+"Nastavení této volby na \"on\" zapne používání vyskakovacích menu. Nastavení\n"
+"na \"off\" zapne používání pÅ™epínacích tlaÄítek. Implicitní nastavení může být\n"
+"potlaÄeno pÅ™epínaÄem -popup.\n"
+
+#: src/LYrcFile.c:590
+msgid ""
+"show_color specifies how to set the color mode at startup. A value of\n"
+"\"never\" will force color mode off (treat the terminal as monochrome)\n"
+"at startup even if the terminal appears to be color capable. A value of\n"
+"\"always\" will force color mode on even if the terminal appears to be\n"
+"monochrome, if this is supported by the library used to build lynx.\n"
+"A value of \"default\" will yield the behavior of assuming\n"
+"a monochrome terminal unless color capability is inferred at startup\n"
+"based on the terminal type, or the -color command line switch is used, or\n"
+"the COLORTERM environment variable is set. The default behavior always is\n"
+"used in anonymous accounts or if the \"option_save\" restriction is set.\n"
+"The effect of the saved value can be overridden via\n"
+"the -color and -nocolor command line switches.\n"
+"The mode set at startup can be changed via the \"show color\" option in\n"
+"the 'o'ptions menu. If the option settings are saved, the \"on\" and\n"
+"\"off\" \"show color\" settings will be treated as \"default\".\n"
+msgstr ""
+"show_color udává, jak bude nastaven barevný režim po spuštění programu.\n"
+"Hodnota \"never\" znamená, že terminál bude chápán jako monochromatický\n"
+"(i kdyby podporoval barvy). Hodnota \"always\" zapne barevný režim i když se\n"
+"terminál zdá být monochromatickým. Barvy musí být podporovány knihovnou, se\n"
+"kterou byl Lynx přeložen. Hodnota \"default\" znamená, že pokud bude splněna\n"
+"jedna z následujících podmínek, bude terminál považován za barevný, jinak za\n"
+"monochromatický: terminál podporuje barvy, byl použit pÅ™epínaÄ -color Äi je\n"
+"nastavena proměnná COLORTERM. Implicitní chování je vždy použito pro anonymní\n"
+"úÄty, nebo pokud je nastaveno omezení \"option_save\".\n"
+"Nastavení této volby může být potlaÄeno pÅ™epínaÄi -color Äi -nocolor.\n"
+"Režim nastavený při startu může být změněn pomocí volby \"show color\"\n"
+"v konfiguraÄním menu (do nÄ›j vstoupíte klávesou 'o'). Pokud je hodnota volby\n"
+"\"show color\" uložena, je považována za implicitní nastavení.\n"
+
+#: src/LYrcFile.c:607
+msgid ""
+"show_cursor specifies whether to 'hide' the cursor to the right (and\n"
+"bottom, if possible) of the screen, or to place it to the left of the\n"
+"current link in documents, or current option in select popup windows.\n"
+"Positioning the cursor to the left of the current link or option is\n"
+"helpful for speech or braille interfaces, and when the terminal is\n"
+"one which does not distinguish the current link based on highlighting\n"
+"or color. A value of \"on\" will set positioning to the left as the\n"
+"default while a value of \"off\" will set 'hiding' of the cursor.\n"
+"The default can be overridden via the -show_cursor command line toggle.\n"
+msgstr ""
+"show_cursor udává, zda 'schovat' kurzor k pravému (a pokud možno\n"
+"i dolnímu) kraji obrazovky, Äi zda jej umístit vlevo k aktuálnímu odkazu\n"
+"(v dokumentech) nebo volbě (ve vyskakovacích menu). Zobrazení kurzoru vlevo\n"
+"od aktuálního odkazu je užiteÄné pro braille terminály a pro terminály, které\n"
+"neumí zvýraznit aktuální odkaz zvýraznÄ›ním Äi barvou.\n"
+"Nastavení této volby na \"on\" způsobí zobrazování kurzoru vlevo od aktuálního\n"
+"odkazu. Nastavení na \"off\" zapne 'schovávání' kurzoru. Implicitní nastavení\n"
+"může být potlaÄeno pÅ™epínaÄem -show_cursor.\n"
+
+#: src/LYrcFile.c:618
+msgid ""
+"show_dotfiles specifies that the directory listing should include\n"
+"\"hidden\" (dot) files/directories. If set \"on\", this will be\n"
+"honored only if enabled via userdefs.h and/or lynx.cfg, and not\n"
+"restricted via a command line switch. If display of hidden files\n"
+"is disabled, creation of such files via Lynx also is disabled.\n"
+msgstr ""
+"show_dotfiles říká, že výpisy obsahu adresářů by měly zahrnovat\n"
+"\"skryté\" (teÄkou zaÄínající) soubory/adresáře. Na zapnutí této volby (nastavení\n"
+"na \"on\"), bude brán zřetel pouze tehdy, jestliže je zapnuta také v lynx.cfg\n"
+"a/nebo v userdefs.h a zároveň není vypnuta z příkazové řádky. Pokud je\n"
+"zobrazování skrytých souborů vypnuto, nebude je možné z Lynxu ani vytvářet.\n"
+
+#: src/LYrcFile.c:629
+msgid ""
+"If sub_bookmarks is not turned \"off\", and multiple bookmarks have\n"
+"been defined (see below), then all bookmark operations will first\n"
+"prompt the user to select an active sub-bookmark file. If the default\n"
+"Lynx bookmark_file is defined (see above), it will be used as the\n"
+"default selection. When this option is set to \"advanced\", and the\n"
+"user mode is advanced, the 'v'iew bookmark command will invoke a\n"
+"statusline prompt instead of the menu seen in novice and intermediate\n"
+"user modes. When this option is set to \"standard\", the menu will be\n"
+"presented regardless of user mode.\n"
+msgstr ""
+"Pokud není volba sub_bookmarks vypnuta (\"off\") a bylo specifikováno více\n"
+"souborů se záložkami (viz níže), pak při všech operacích se záložkami bude\n"
+"uživatel nejprve vyzván, aby vybral některý ze souborů. Jestliže je nastavena\n"
+"volba bookmark_file, pak bude implicitně použita její hodnota.\n"
+"Jestliže je sub_bookmarks nastaveno na \"advanced\" a uživatelský režim je také\n"
+"\"advanced\", tak příkaz pro zobrazení záložek ('v') vyvolá místo menu\n"
+"prompt. Nastavení této volby na \"standard\" způsobí zobrazení menu bez\n"
+"ohledu na uživatelský režim.\n"
+
+#: src/LYrcFile.c:644
+msgid ""
+"user_mode specifies the users level of knowledge with Lynx. The\n"
+"default is \"NOVICE\" which displays two extra lines of help at the\n"
+"bottom of the screen to aid the user in learning the basic Lynx\n"
+"commands. Set user_mode to \"INTERMEDIATE\" to turn off the extra info.\n"
+"Use \"ADVANCED\" to see the URL of the currently selected link at the\n"
+"bottom of the screen.\n"
+msgstr ""
+"user_mode udává úroveň znalostí uživatele o programu Lynx. Implicitní\n"
+"nastavení je \"NOVICE\", které způsobí zobrazení 2 řádek s nápovědou v dolní\n"
+"Äásti obrazovky. Nastavení \"INTERMEDIATE\" vypne tuto nápovÄ›du a nastavení\n"
+"\"ADVANCED\" způsobí vypsání URL aktuálního odkazu v dolní Äásti obrazovky.\n"
+
+#: src/LYrcFile.c:653
+msgid ""
+"If verbose_images is \"on\", lynx will print the name of the image\n"
+"source file in place of [INLINE], [LINK] or [IMAGE]\n"
+"See also VERBOSE_IMAGES in lynx.cfg\n"
+msgstr ""
+"Pokud je volba verbose_images zapnuta (\"on\"), lynx bude zobrazovat jména\n"
+"souborů s obrázky místo [INLINE], [LINK] Äi [IMAGE].\n"
+"Viz též volbu VERBOSE_IMAGES v lynx.cfg.\n"
+
+#: src/LYrcFile.c:658
+msgid ""
+"If vi_keys is set to \"on\", then the normal VI movement keys:\n"
+" j = down k = up\n"
+" h = left l = right\n"
+"will be enabled. These keys are only lower case.\n"
+"Capital 'H', 'J' and 'K will still activate help, jump shortcuts,\n"
+"and the keymap display, respectively.\n"
+msgstr ""
+"Pokud je volba vi_keys nastavena na \"on\", pak jsou běžné VI klávesy pro pohyb:\n"
+" j = dolů k = nahoru\n"
+" h = vlevo l = vpravo\n"
+"zapnuty. Fungují pouze malá písmena.\n"
+"Velké 'H', 'J' a 'K zapínají nápovědu, zkrácená URL a výpis klávesové mapy.\n"
+
+#: src/LYrcFile.c:666
+msgid ""
+"The visited_links setting controls how Lynx organizes the information\n"
+"in the Visited Links Page.\n"
+msgstr ""
+"Volba visited_links urÄuje uspořádání informací na stránce\n"
+"Navštívených odkazů\n"
+
+#: src/LYrcFile.c:910
+msgid ""
+"If keypad_mode is set to \"NUMBERS_AS_ARROWS\", then the numbers on\n"
+"your keypad when the numlock is on will act as arrow keys:\n"
+" 8 = Up Arrow\n"
+" 4 = Left Arrow 6 = Right Arrow\n"
+" 2 = Down Arrow\n"
+"and the corresponding keyboard numbers will act as arrow keys,\n"
+"regardless of whether numlock is on.\n"
+msgstr ""
+"Pokud je volba keypad_mode nastavena na \"NUMBERS_AS_ARROWS\", pak se Äísla na\n"
+"numerické klávesnici při zapnutém numlock budou chovat jako kurzorové klávesy:\n"
+" 8 = Nahoru\n"
+" 4 = Vlevo 6 = Vpravo\n"
+" 2 = Dolů\n"
+"Čísla na hlavní klávesnici se budou chovat jako kurzorové klávesy bez ohledu\n"
+"na stav numlock.\n"
+
+#: src/LYrcFile.c:919
+msgid ""
+"If keypad_mode is set to \"LINKS_ARE_NUMBERED\", then numbers will\n"
+"appear next to each link and numbers are used to select links.\n"
+msgstr ""
+"Pokud je volba keypad_mode nastavena na \"LINKS_ARE_NUMBERED\", pak všechny\n"
+"odkazy budou viditelnÄ› oÄíslovány a Äísla budou použita ke zvolení přísluÅ¡ného odkazu.\n"
+
+#: src/LYrcFile.c:923
+msgid ""
+"If keypad_mode is set to \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\", then\n"
+"numbers will appear next to each link and visible form input field.\n"
+"Numbers are used to select links, or to move the \"current link\" to a\n"
+"form input field or button. In addition, options in popup menus are\n"
+"indexed so that the user may type an option number to select an option in\n"
+"a popup menu, even if the option isn't visible on the screen. Reference\n"
+"lists and output from the list command also enumerate form inputs.\n"
+msgstr ""
+"Pokud je volba keypad_mode nastavena na \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\",\n"
+"pak vÅ¡echny odkazy a viditelná pole formulářů budou viditelnÄ› oÄíslovány. Čísla\n"
+"budou použita ke zvolení přísluÅ¡ného odkazu Äi pÅ™esunu na vstupní pole formuláře\n"
+"Äi tlaÄítko. Volby vyskakovacích menu jsou indexovány, takže uživatel může\n"
+"zvolit položku napsáním jejího Äísla i když tato není viditelná na obrazovce.\n"
+"Seznamy odkazů a výstup příkazu 'list' jsou také Äíslovány.\n"
+
+#: src/LYrcFile.c:932
+msgid ""
+"NOTE: Some fixed format documents may look disfigured when\n"
+"\"LINKS_ARE_NUMBERED\" or \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\" are\n"
+"enabled.\n"
+msgstr ""
+"POZOR: Formát některých dokumentů s pevnou strukturou může při zapnutých volbách\n"
+"\"LINKS_ARE_NUMBERED\" a \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\" vypadat jako\n"
+"poškozený.\n"
+
+#: src/LYrcFile.c:964
+msgid ""
+"Lynx User Defaults File\n"
+"\n"
+msgstr ""
+"Soubor Implicitních Uživatelských Nastavení Lynxu\n"
+"\n"
+
+#: src/LYrcFile.c:973
+msgid ""
+"This file contains options saved from the Lynx Options Screen (normally\n"
+"with the 'o' key). To save options with that screen, you must select the\n"
+"checkbox:\n"
+msgstr ""
+"Tento soubor obsahuje nastavení z Obrazovky Nastavní Lynxu (obyÄejnÄ›\n"
+"dostupné klávesou 'o'). Aby se uložily nastavení z této obrazovky musíte\n"
+"zaÅ¡rktnout políÄko:\n"
+
+#: src/LYrcFile.c:980
+msgid ""
+"You must then save the settings using the link on the line above the\n"
+"checkbox:\n"
+msgstr ""
+"Poté musíte uložit natavení tím, že použijete odkaz na řádku nad\n"
+"zaÅ¡krtávacím políÄkem:\n"
+
+#: src/LYrcFile.c:987
+msgid ""
+"You may also use the command-line option \"-forms_options\", which displays\n"
+"the simpler Options Menu instead. Save options with that using the '>' key.\n"
+"\n"
+msgstr ""
+"Také můžete použít volbu příkazové řádky \"-forms_options\", která zobrazí\n"
+"jednodušší Menu Voleb. Uložte tyto volby tlaÄítkem '>' . \n"
+
+#: src/LYrcFile.c:994
+msgid ""
+"This file contains options saved from the Lynx Options Screen (normally\n"
+"with the '>' key).\n"
+"\n"
+msgstr ""
+"Tento soubor obsahuje možnosti uložené z Obrazovky Nastavení Lynx\n"
+"(obyÄejnÄ› dostupné klávesou '>' ).\n"
+"\n"
+
+#: src/LYrcFile.c:1001
+msgid ""
+"There is normally no need to edit this file manually, since the defaults\n"
+"here can be controlled from the Options Screen, and the next time options\n"
+"are saved from the Options Screen this file will be completely rewritten.\n"
+"You have been warned...\n"
+"\n"
+"If you are looking for the general configuration file - it is normally\n"
+"called \"lynx.cfg\". It has different content and a different format.\n"
+"It is not this file.\n"
+msgstr ""
+"Tento soubor není třeba upravovat přímo, jelikož implicitní nastavení\n"
+"mohou být zmÄ›nÄ›na z KonfiguraÄního menu a když jsou preference\n"
+" z KonfiguraÄního menu uloženy, tento soubor bude celý pÅ™epsán. \n"
+"Byl jste varován...\n"
+"\n"
+"VÅ¡eobecný konfiguraÄní soubor, který možná hledáte se normálnÄ› \n"
+"jmenuje lynx.cfg a má jiný obsah a jiný formát. Není to tento soubor.\n"
+
+#~ msgid "HREF in BASE tag is not an absolute URL."
+#~ msgstr "Cílové URL v BASE znaÄce není absolutní."
+
+#~ msgid "Visible links"
+#~ msgstr "Viditelné odkazy"
+
+#~ msgid ""
+#~ "\n"
+#~ "Lynx edit map not declared.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Editovací mapy Lynxu nejsou deklarovány.\n"
+#~ "\n"
+
+#~ msgid "Comment request cancelled!!!"
+#~ msgstr "Odeslání komentáře zrušeno!!!"
+
+#~ msgid "You are not allowed to goto \"file:\" URLs"
+#~ msgstr "\"file:\" URL nesmíte použít jako cíl!"
+
+#~ msgid "You are not allowed to goto \"finger:\" URLs"
+#~ msgstr "\"finger:\" URL nesmíte použít jako cíl!"
+
+#~ msgid "You are not allowed to goto \"ftp:\" URLs"
+#~ msgstr "\"ftp:\" URL nesmíte použít jako cíl!"
+
+#~ msgid "You are not allowed to goto \"gopher:\" URLs"
+#~ msgstr "\"gopher:\" URL nesmíte použít jako cíl!"
+
+#~ msgid "You are not allowed to goto \"http:\" URLs"
+#~ msgstr "\"http:\" URL nesmíte použít jako cíl!"
+
+#~ msgid "You are not allowed to goto \"https:\" URLs"
+#~ msgstr "\"https:\" URL nesmíte použít jako cíl!"
+
+#~ msgid "You are not allowed to goto \"lynxcgi:\" URLs"
+#~ msgstr "\"lynxcgi:\" URL nesmíte použít jako cíl!"
+
+#~ msgid "You are not allowed to goto \"lynxexec:\" URLs"
+#~ msgstr "\"lynxexec:\" URL nesmíte použít jako cíl!"
+
+#~ msgid "You are not allowed to goto \"lynxprog:\" URLs"
+#~ msgstr "\"lynxprog:\" URL nesmíte použít jako cíl!"
+
+#~ msgid "You are not allowed to goto \"mailto:\" URLs"
+#~ msgstr "\"mailto:\" URL nesmíte použít jako cíl!"
+
+#~ msgid "You are not allowed to goto \"news:\" URLs"
+#~ msgstr "\"news:\" URL nesmíte použít jako cíl!"
+
+#~ msgid "You are not allowed to goto \"nntp:\" URLs"
+#~ msgstr "\"nntp:\" URL nesmíte použít jako cíl!"
+
+#~ msgid "You are not allowed to goto \"rlogin:\" URLs"
+#~ msgstr "\"rlogin:\" URL nesmíte použít jako cíl!"
+
+#~ msgid "You are not allowed to goto \"snews:\" URLs"
+#~ msgstr "\"snews:\" URL nesmíte použít jako cíl!"
+
+#~ msgid "You are not allowed to goto \"telnet:\" URLs"
+#~ msgstr "\"telnet:\" URL nesmíte použít jako cíl!"
+
+#~ msgid "You are not allowed to goto \"tn3270:\" URLs"
+#~ msgstr "\"tn3270:\" URL nesmíte použít jako cíl!"
+
+#~ msgid "You are not allowed to goto \"wais:\" URLs"
+#~ msgstr "\"wais:\" URL nesmíte použít jako cíl!"
+
+#~ msgid "This special URL is not allowed as a goto!"
+#~ msgstr "Toto zvláštní URL nesmíte použít jako cíl!"
+
+#~ msgid "Option choice (or page) number: "
+#~ msgstr "Zvolte Äíslo možnosti (Äi strany): "
+
+#~ msgid "Choice number %d already is current."
+#~ msgstr "Možnost Äíslo %d je právÄ› aktivní."
+
+#~ msgid "You are already at the end of this choice list."
+#~ msgstr "Jste na konci seznamu možností."
+
+#~ msgid "You are already at the beginning of this choice list."
+#~ msgstr "Jste na zaÄátku seznamu možností."
+
+#~ msgid "You are already at page %d of this choice list."
+#~ msgstr "Již jste na straně %d seznamu možností."
+
+#~ msgid "You have entered an invalid choice number."
+#~ msgstr "Zadal jste chybné Äíslo možnosti."
+
+#~ msgid "History List maximum reached! Document not pushed."
+#~ msgstr "Maximální velikost seznamu historie dosažena! Dokument nebyl zaznamenán."
+
+#~ msgid "Socket read failed for 180,000 tries."
+#~ msgstr "180 000 neúspěšných pokusů Äíst ze soketu."
+
+#~ msgid "reason unknown."
+#~ msgstr "důvod není znám."
+
+#~ msgid "Very long lines have been wrapped!"
+#~ msgstr "Příliš dlouhé řádky byly zalomeny!"
+
+#~ msgid "KB"
+#~ msgstr "KB"
+
+#~ msgid "Read %ld of %ld %s of data"
+#~ msgstr "Množství přenesených dat: %ld/%ld %s"
+
+#~ msgid "Read %ld %s of data"
+#~ msgstr "Množství přenesených dat: %ld %s"
+
+#~ msgid ", %ld %s/sec."
+#~ msgstr ", %ld %s/s."
+
+#~ msgid "(From Cookie Jar)"
+#~ msgstr "(Ze skladu cookies)"
+
+#~ msgid "Path too long"
+#~ msgstr "Cesta je příliš dlouhá."
+
+#~ msgid "Source and destination are the same location - request ignored!"
+#~ msgstr "Zdroj a cíl oznaÄují jedno a to samé místo - požadavek zamítnut!"
+
+#~ msgid "create %s"
+#~ msgstr "vytvořit %s"
+
+#~ msgid "Remove '%s' and all of its contents?"
+#~ msgstr "Smazat '%s' a veškerý jeho obsah?"
+
+#~ msgid "Remove directory and all of its contents?"
+#~ msgstr "Smazat adresář a veškerý jeho obsah?"
+
+#~ msgid "Unable to open file management menu file."
+#~ msgstr "Nelze otevřít soubor s menu správce souborů."
+
+#~ msgid "Lynx ver. %s"
+#~ msgstr "Lynx ver. %s"
+
+#~ msgid "X_Personal_name: "
+#~ msgstr "X_Osobní jméno: "
+
+#~ msgid "Personal Name: "
+#~ msgstr "Osobní jméno: "
+
+#~ msgid "Inactive text input, activate to edit (e.g., press ENTER)"
+#~ msgstr "neaktivní textový vstup, aktivujte pro editaci (např. stiskněte ENTER)"
+
+#~ msgid "Ignoring invalid HOME"
+#~ msgstr "Ignoruji chybnou hodnotu HOME"
+
+#~ msgid ""
+#~ "partial_thres specifies the number of lines Lynx should download and render\n"
+#~ "before we redraw the screen in Partial Display logic\n"
+#~ "e.g., partial_thres=2\n"
+#~ "would have Lynx redraw every 2 lines that it renders\n"
+#~ "partial_thres=-1 would use the entire screensize\n"
+#~ msgstr ""
+#~ "Volba partial_thres udává poÄet řádků, které by Lynx mÄ›l stáhnout než bude,\n"
+#~ "vykreslena obrazovka. T.j. partial_thres=2 způsobí, že Lynx zobrazí\n"
+#~ "každé 2 řádky, které stáhne. partial_thres=-1 znamená celou obrazovku.\n"
diff --git a/po/da.po b/po/da.po
new file mode 100644
index 0000000..6229ddc
--- /dev/null
+++ b/po/da.po
@@ -0,0 +1,6349 @@
+# Danish translation of the Lynx browser message catalog
+# Copyright (C) 2015 Free Software Foundation, Inc.
+# This file is distributed under the same license as the lynx package.
+# Morten Bo Johansen <mbj@spamcop.net>, 2000-2006
+# Joe Hansen <joedalton2@yahoo.dk>, 2015, 2016, 2017.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: lynx 2.8.9-dev15\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2017-07-04 16:51-0400\n"
+"PO-Revision-Date: 2017-07-06 21:10+0200\n"
+"Last-Translator: Joe Hansen <joedalton2@yahoo.dk>\n"
+"Language-Team: Danish <dansk@dansk-gruppen.dk>\n"
+"Language: da\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+
+#. ******************************************************************
+#. * The following definitions are for status line prompts, messages, or
+#. * warnings issued by Lynx during program execution. You can modify
+#. * them to make them more appropriate for your site. We recommend that
+#. * you extend these definitions to other languages using the gettext
+#. * library. There are also scattered uses of 'gettext()' throughout the
+#. * Lynx source, covering all but those messages which (a) are used for
+#. * debugging (CTRACE) or (b) are constants used in interaction with
+#. * other programs.
+#. *
+#. * See ABOUT-NLS and po/readme for details and location of contributed
+#. * translations. When no translation is available, the English default is
+#. * used.
+#.
+#: LYMessages.c:28
+#, c-format
+msgid "Alert!: %s"
+msgstr "Advarsel!: %s"
+
+#: LYMessages.c:29
+msgid "Welcome"
+msgstr "Velkommen"
+
+#: LYMessages.c:30
+msgid "Are you sure you want to quit?"
+msgstr "Afslut?"
+
+#: LYMessages.c:32
+msgid "Really exit from Lynx?"
+msgstr "Afslut Lynx?"
+
+#: LYMessages.c:34
+msgid "Connection interrupted."
+msgstr "Forbindelse afbrudt."
+
+#: LYMessages.c:35
+msgid "Data transfer interrupted."
+msgstr "Dataoverførsel afbrudt."
+
+#: LYMessages.c:36
+msgid "Cancelled!!!"
+msgstr "Afbrudt!"
+
+#: LYMessages.c:37
+msgid "Cancelling!"
+msgstr "Afbryder!"
+
+#: LYMessages.c:38
+msgid "Excellent!!!"
+msgstr "Fortsætter ..."
+
+#: LYMessages.c:39
+msgid "OK"
+msgstr "O.k."
+
+#: LYMessages.c:40
+msgid "Done!"
+msgstr "Færdig!"
+
+#: LYMessages.c:41
+msgid "Bad request!"
+msgstr "Uforståelig forespørgsel!"
+
+#: LYMessages.c:42
+msgid "previous"
+msgstr "forrige"
+
+#: LYMessages.c:43
+msgid "next screen"
+msgstr "næste skærmbillede"
+
+#: LYMessages.c:44
+msgid "HELP!"
+msgstr "HJÆLP!"
+
+#: LYMessages.c:45
+msgid ", help on "
+msgstr ", hjælp til "
+
+#. #define HELP
+#: LYMessages.c:47
+msgid "Commands: Use arrow keys to move, '?' for help, 'q' to quit, '<-' to go back."
+msgstr "Piletaster navigerer, '?' for hjælp', 'q' afslutter, '<-' går tilbage."
+
+#. #define MOREHELP
+#: LYMessages.c:49
+msgid "-- press space for more, use arrow keys to move, '?' for help, 'q' to quit."
+msgstr "- tast mellemrum for mere, piletaster navigerer, '?' for hjælp, 'q' afslutter."
+
+#: LYMessages.c:50
+msgid "-- press space for next page --"
+msgstr "- tast mellemrum for næste side -"
+
+#: LYMessages.c:51
+msgid "URL too long"
+msgstr "Adresse for lang"
+
+#. Inactive input fields, messages used with -tna option - kw
+#. #define FORM_LINK_TEXT_ADV_MSG_INA
+#: LYMessages.c:57
+#, c-format
+msgid "(Textfield \"%s\"); Inactive. Press <return> to activate."
+msgstr "(Tekstfelt »%s«); inaktivt. Tast <retur> for at aktivere."
+
+#. #define FORM_LINK_TEXT_MESSAGE_INA
+#: LYMessages.c:59
+msgid "(Text entry field) Inactive. Press <return> to activate."
+msgstr "(Tekstindtastningsfelt) inaktivt. Tast <retur> for at aktivere."
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG_INA
+#: LYMessages.c:61
+#, c-format
+msgid "(Textarea \"%s\"); Inactive. Press <return> to activate."
+msgstr "(Tekstområde »%s«); inaktivt. Tast <retur> for at aktivere."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_INA
+#: LYMessages.c:63
+msgid "(Textarea) Inactive. Press <return> to activate."
+msgstr "(Tekstområde) inaktivt. Tast <retur> for at aktivere."
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG_INA_E
+#: LYMessages.c:65
+#, c-format
+msgid "(Textarea \"%s\"); Inactive. Press <return> to activate (%s for editor)."
+msgstr "(Tekstområde »%s«); inaktivt. Tast <retur> for at aktivere (%s for editor)."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_INA_E
+#: LYMessages.c:67
+#, c-format
+msgid "(Textarea) Inactive. Press <return> to activate (%s for editor)."
+msgstr "(Tekstområde) inaktivt. <Retur> aktiverer (%s for editor)."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE_INA
+#: LYMessages.c:69
+msgid "(Form field) Inactive. Use <return> to edit."
+msgstr "(Formularfelt) Inaktivt. Tast <retur> for at aktivere."
+
+#. #define FORM_TEXT_SUBMIT_MESSAGE_INA_X
+#: LYMessages.c:71
+#, c-format
+msgid "(Form field) Inactive. Use <return> to edit (%s to submit with no cache)."
+msgstr "(Formularfelt> Inaktivt. <retur> aktiverer (%s for at indsende udenom cache)."
+
+#. #define FORM_TEXT_RESUBMIT_MESSAGE_INA
+#: LYMessages.c:73
+msgid "(Form field) Inactive. Press <return> to edit, press <return> twice to submit."
+msgstr ""
+"(Formularfelt) Inaktivt. Tast <retur> for at aktivere, to gange <retur> \n"
+"sender."
+
+#. #define FORM_TEXT_SUBMIT_MAILTO_MSG_INA
+#: LYMessages.c:75
+msgid "(mailto form field) Inactive. Press <return> to change."
+msgstr "(e-postformularfelt) Inaktivt. Tast <retur> for at aktivere."
+
+#. #define FORM_LINK_PASSWORD_MESSAGE_INA
+#: LYMessages.c:77
+msgid "(Password entry field) Inactive. Press <return> to activate."
+msgstr "(Indtastningsfelt/adgangskode) Inaktivt. Tast <retur> for at aktivere."
+
+#. #define FORM_LINK_FILE_UNM_MSG
+#: LYMessages.c:80
+msgid "UNMODIFIABLE file entry field. Use UP or DOWN arrows or tab to move off."
+msgstr "SKRIVEBESKYTTET filindtastningssfelt. Brug pil OP/NED for at komme væk."
+
+#. #define FORM_LINK_FILE_MESSAGE
+#: LYMessages.c:82
+msgid "(File entry field) Enter filename. Use UP or DOWN arrows or tab to move off."
+msgstr "(Filindtastningsfelt) Anfør filnavn. Pil OP/NED el. TAB forlader feltet."
+
+#. #define FORM_LINK_TEXT_ADV_MSG
+#. #define FORM_LINK_TEXT_MESSAGE
+#: LYMessages.c:84 LYMessages.c:86
+#, c-format
+msgid "(Textfield \"%s\"); Enter text. Use UP or DOWN arrows or tab to move off."
+msgstr "(Tekstfelt »%s«); indtast tekst. Pil OP/NED el. TAB forlader feltet."
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG
+#: LYMessages.c:88
+#, c-format
+msgid "(Textarea \"%s\"); Enter text. Use UP/DOWN arrows or TAB to move off."
+msgstr "(Tekstområde »%s«); indtast tekst. Pil OP/NED el. TAB forlader området."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE
+#: LYMessages.c:90
+msgid "(Textarea) Enter text. Use UP/DOWN arrows or TAB to move off."
+msgstr "(Tekstområde) Indtast tekst. Pil OP/NED el. TAB forlader området."
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG_E
+#: LYMessages.c:92
+#, c-format
+msgid "(Textarea \"%s\"); Enter text. Use UP/DOWN arrows or TAB to move off (%s for editor)."
+msgstr "(Tekstområde »%s«); indtast tekst. Pil OP/NED el. TAB forlader området (%s for editor)."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_E
+#: LYMessages.c:94
+#, c-format
+msgid "(Textarea) Enter text. Use UP/DOWN arrows or TAB to move off (%s for editor)."
+msgstr "(Tekstområde) Indtast tekst. Pil OP/NED el. TAB forlader området (%s for editor)."
+
+#. #define FORM_LINK_TEXT_UNM_MSG
+#: LYMessages.c:96
+msgid "UNMODIFIABLE form text field. Use UP or DOWN arrows or tab to move off."
+msgstr "SKRIVEBESKYTTET formulartekstfelt. Pil OP/NED el. TAB forlader feltet."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE
+#: LYMessages.c:98
+msgid "(Form field) Enter text. Use <return> to submit."
+msgstr "(Formularfelt) Indtast tekst. Tast <retur> for at indsende."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE_X
+#: LYMessages.c:100
+#, c-format
+msgid "(Form field) Enter text. Use <return> to submit (%s for no cache)."
+msgstr "(Formularfelt) Anfør tekst. <Retur> indsender (%s sender udenom cache)"
+
+#. #define FORM_LINK_TEXT_RESUBMIT_MESSAGE
+#: LYMessages.c:102
+msgid "(Form field) Enter text. Use <return> to submit, arrows or tab to move off."
+msgstr "(Formularfelt) Indtast tekst. <Retur> indsender, pile/TAB forlader feltet."
+
+#. #define FORM_LINK_TEXT_SUBMIT_UNM_MSG
+#: LYMessages.c:104
+msgid "UNMODIFIABLE form field. Use UP or DOWN arrows or tab to move off."
+msgstr "SKRIVEBESKYTTET formularfelt. Pil OP/NED el. TAB forlader feltet."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MAILTO_MSG
+#: LYMessages.c:106
+msgid "(mailto form field) Enter text. Use <return> to submit, arrows to move off."
+msgstr "(e-postformularfelt) Anfør tekst. <Retur> indsender, piletaster forlader."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MAILTO_DIS_MSG
+#: LYMessages.c:108
+msgid "(mailto form field) Mail is disallowed so you cannot submit."
+msgstr "(e-postformularfelt) Postsystem spærret, så du kan ikke indsende."
+
+#. #define FORM_LINK_PASSWORD_MESSAGE
+#: LYMessages.c:110
+msgid "(Password entry field) Enter text. Use UP or DOWN arrows or tab to move off."
+msgstr "(Indtastningsfelt/adgangskode) Indtast kode. Pil OP/NED forlader feltet."
+
+#. #define FORM_LINK_PASSWORD_UNM_MSG
+#: LYMessages.c:112
+msgid "UNMODIFIABLE form password. Use UP or DOWN arrows or tab to move off."
+msgstr "SKRIVEBESKYTTET adgangskodeformular. Pil OP/NED el. TAB forlader felt."
+
+#. #define FORM_LINK_CHECKBOX_ADV_MSG
+#: LYMessages.c:114
+#, c-format
+msgid "(Checkbox \"%s\"); Use right-arrow or <return> to toggle."
+msgstr "(Afkrydsningsfelt »%s«); højrepil eller <retur> (de)aktiverer."
+
+#. #define FORM_LINK_CHECKBOX_MESSAGE
+#: LYMessages.c:116
+msgid "(Checkbox Field) Use right-arrow or <return> to toggle."
+msgstr "(Afkrydsningsfelt) Højrepil eller <retur> (de)aktiverer."
+
+#. #define FORM_LINK_CHECKBOX_UNM_MSG
+#: LYMessages.c:118
+msgid "UNMODIFIABLE form checkbox. Use UP or DOWN arrows or tab to move off."
+msgstr "SKRIVEBESKYTTET afkrydsningsfelt. Brug Pil OP/NED el. TAB forlader boks."
+
+#. #define FORM_LINK_RADIO_ADV_MSG
+#: LYMessages.c:120
+#, c-format
+msgid "(Radio Button \"%s\"); Use right-arrow or <return> to toggle."
+msgstr "(Radioknap »%s«); brug højrepil eller <retur> for at (de)aktivere."
+
+#. #define FORM_LINK_RADIO_MESSAGE
+#: LYMessages.c:122
+msgid "(Radio Button) Use right-arrow or <return> to toggle."
+msgstr "(Radioknap) Brug højrepil eller <retur> for at (de)aktivere."
+
+#. #define FORM_LINK_RADIO_UNM_MSG
+#: LYMessages.c:124
+msgid "UNMODIFIABLE form radio button. Use UP or DOWN arrows or tab to move off."
+msgstr "SKRIVEBESKYTTET formular-radioknap. Pil OP/NED el. TAB forlader knap."
+
+#. #define FORM_LINK_SUBMIT_PREFIX
+#: LYMessages.c:126
+msgid "Submit ('x' for no cache) to "
+msgstr "Indsend (\"x\" sender udenom cache) til "
+
+#. #define FORM_LINK_RESUBMIT_PREFIX
+#: LYMessages.c:128
+msgid "Submit to "
+msgstr "Indsend til "
+
+#. #define FORM_LINK_SUBMIT_MESSAGE
+#: LYMessages.c:130
+msgid "(Form submit button) Use right-arrow or <return> to submit ('x' for no cache)."
+msgstr "(Indsend formular) Højrepil eller <retur> sender (\"x\" sender udenom cache)."
+
+#. #define FORM_LINK_RESUBMIT_MESSAGE
+#: LYMessages.c:132
+msgid "(Form submit button) Use right-arrow or <return> to submit."
+msgstr "(Indsend formular) Brug højrepil eller <retur> for at indesende."
+
+#. #define FORM_LINK_SUBMIT_DIS_MSG
+#: LYMessages.c:134
+msgid "DISABLED form submit button. Use UP or DOWN arrows or tab to move off."
+msgstr "UVIRKSOM formularindelsesknap. Pil OP/NED el. TAB forlader knap."
+
+#. #define FORM_LINK_SUBMIT_MAILTO_PREFIX
+#: LYMessages.c:136
+msgid "Submit mailto form to "
+msgstr "Indsend e-postformular til "
+
+#. #define FORM_LINK_SUBMIT_MAILTO_MSG
+#: LYMessages.c:138
+msgid "(mailto form submit button) Use right-arrow or <return> to submit."
+msgstr "(indsend e-post-formular) Brug højrepil eller <retur> for at indsende."
+
+#. #define FORM_LINK_SUBMIT_MAILTO_DIS_MSG
+#: LYMessages.c:140
+msgid "(mailto form submit button) Mail is disallowed so you cannot submit."
+msgstr "(indsend e-post-formular) Postsystem spærret, så du kan ikke sende."
+
+#. #define FORM_LINK_RESET_MESSAGE
+#: LYMessages.c:142
+msgid "(Form reset button) Use right-arrow or <return> to reset form to defaults."
+msgstr "(Formular-nulstilling) Højrepil eller <retur> nulstiller formularindhold."
+
+#. #define FORM_LINK_RESET_DIS_MSG
+#: LYMessages.c:144
+msgid "DISABLED form reset button. Use UP or DOWN arrows or tab to move off."
+msgstr "UVIRKSOM formular-rydningsknap. Pil OP/NED el. TAB forlader knap."
+
+#. #define FORM_LINK_BUTTON_MESSAGE
+#: LYMessages.c:146
+msgid "(Script button) Use UP or DOWN arrows or tab to move off."
+msgstr "(Script-knap) Pil OP/NED eller tabulator forlader knap."
+
+#. #define FORM_LINK_BUTTON_ADV_MSG
+#: LYMessages.c:148
+#, c-format
+msgid "(Script button \"%s\"); Use UP or DOWN arrows or tab to move off."
+msgstr "(Script-knap »%s«); pil OP/NED eller tabulator forlader knap."
+
+#. #define FORM_LINK_BUTTON_DIS_MSG
+#: LYMessages.c:150
+msgid "DISABLED Script button. Use UP or DOWN arrows or tab to move off."
+msgstr "DEAKTIVERET Script-knap. PIL OP/NED eller tabulator forlader knap."
+
+#. #define FORM_LINK_OPTION_LIST_ADV_MSG
+#: LYMessages.c:152
+#, c-format
+msgid "(Option list \"%s\"); Hit return to select option."
+msgstr "(Valgmuligheder »%s«); tast retur for at vælge en indstilling."
+
+#. #define FORM_LINK_OPTION_LIST_MESSAGE
+#: LYMessages.c:154
+msgid "(Option list) Hit return and use arrow keys and return to select option."
+msgstr "(Valgmuligheder) Tast <retur> og brug pile for at vælge en indstilling."
+
+#. #define CHOICE_LIST_ADV_MSG
+#: LYMessages.c:156
+#, c-format
+msgid "(Choice entry \"%s\"); Use arrow keys and return to select option."
+msgstr "(Valgmuligheder »%s«); brug piletaster og retur for at vælge en indstilling."
+
+#. #define CHOICE_LIST_MESSAGE
+#: LYMessages.c:158
+msgid "(Choice list) Hit return and use arrow keys and return to select option."
+msgstr "(Valgmuligheder) Tast <retur> og brug pile for at vælge en indstilling."
+
+#. #define MOUSE_CHOICE_MESSAGE
+#: LYMessages.c:160
+msgid "Left mouse button or return to select, arrow keys to scroll."
+msgstr "Venstre museknap eller retur for at vælge, piletaster for at rulle."
+
+#. #define FORM_LINK_OPTION_LIST_UNM_MSG
+#: LYMessages.c:162
+msgid "UNMODIFIABLE option list. Use return or arrow keys to review or leave."
+msgstr "SKRIVEBESKYTTET valgmulighedsliste. Brug retur el. pile for at gennemse el. forlade."
+
+#. #define CHOICE_LIST_UNM_MSG
+#: LYMessages.c:164
+msgid "UNMODIFIABLE choice list. Use return or arrow keys to review or leave."
+msgstr "SKRIVEBESKYTTET Valgliste. Brug retur el. pile for at gennemse eller forlade."
+
+#: LYMessages.c:165
+msgid "Submitting form..."
+msgstr "Indsender formular ..."
+
+#: LYMessages.c:166
+msgid "Resetting form..."
+msgstr "Nulstiller formular ..."
+
+#. #define RELOADING_FORM
+#: LYMessages.c:168
+msgid "Reloading document. Any form entries will be lost!"
+msgstr "Genindlæser dokument. Alle formularens data går tabt!"
+
+#. #define LINK_NOT_IN_FORM
+#: LYMessages.c:170
+msgid "The current link is not in a FORM"
+msgstr "Den nuværende henvisning er ikke i en FORMULAR"
+
+#: LYMessages.c:171
+#, c-format
+msgid "Warning: Cannot transcode form data to charset %s!"
+msgstr "Advarsel: Kan ikke omkode formulardata til tegnsæt %s!"
+
+#. #define NORMAL_LINK_MESSAGE
+#: LYMessages.c:174
+msgid "(NORMAL LINK) Use right-arrow or <return> to activate."
+msgstr "(NORMALT LINK) Brug højrepil eller <retur> for at aktivere."
+
+#: LYMessages.c:175
+msgid "The resource requested is not available at this time."
+msgstr "Den ønskede facilitet er ikke tilgængelig i øjeblikket."
+
+#: LYMessages.c:176
+msgid "Enter Lynx keystroke command: "
+msgstr "Indtast Lynx-kommando: "
+
+#: LYMessages.c:177
+msgid "Looking up "
+msgstr "Kontakter "
+
+#: LYMessages.c:178
+#, c-format
+msgid "Getting %s"
+msgstr "Henter %s"
+
+#: LYMessages.c:179
+#, c-format
+msgid "Skipping %s"
+msgstr "Springer %s over"
+
+#: LYMessages.c:180
+#, c-format
+msgid "Using %s"
+msgstr "Bruger %s"
+
+#: LYMessages.c:181
+#, c-format
+msgid "Illegal URL: %s"
+msgstr "Ugyldig adresse: %s"
+
+#: LYMessages.c:182
+#, c-format
+msgid "Badly formed address %s"
+msgstr "Forkert udformet adresse %s"
+
+#: LYMessages.c:183
+#, c-format
+msgid "URL: %s"
+msgstr "Adresse: %s"
+
+#: LYMessages.c:184
+msgid "Unable to access WWW file!!!"
+msgstr "Webfilen er ikke tilgængelig!"
+
+#: LYMessages.c:185
+#, c-format
+msgid "This is a searchable index. Use %s to search."
+msgstr "Der kan søges i dette indeks. Brug %s for at søge."
+
+#. #define WWW_INDEX_MORE_MESSAGE
+#: LYMessages.c:187
+#, c-format
+msgid "--More-- This is a searchable index. Use %s to search."
+msgstr "--Mere-- Der kan søges i dette indeks. Brug %s for at søge."
+
+#: LYMessages.c:188
+msgid "You have entered an invalid link number."
+msgstr "Det indtastede linknummer er ugyldigt."
+
+#. #define SOURCE_HELP
+#: LYMessages.c:190
+msgid "Currently viewing document source. Press '\\' to return to rendered version."
+msgstr "Dokumentets kildetekst vises. '\\' returnerer til gengivet version."
+
+#. #define NOVICE_LINE_ONE
+#: LYMessages.c:192
+msgid " Arrow keys: Up and Down to move. Right to follow a link; Left to go back. \n"
+msgstr " Piletaster: op/ned navigerer, højre følger et link, venstre går tilbage. \n"
+
+#. #define NOVICE_LINE_TWO
+#: LYMessages.c:194
+msgid " H)elp O)ptions P)rint G)o M)ain screen Q)uit /=search [delete]=history list \n"
+msgstr " H=hjælp O=opsætning P=udskriv M=startskærm Q=afslut /=søg [backspace]=historik \n"
+
+#. #define NOVICE_LINE_TWO_A
+#: LYMessages.c:196
+msgid " O)ther cmds H)elp K)eymap G)oto P)rint M)ain screen o)ptions Q)uit \n"
+msgstr " O=øvr. kmd H=hjælp K=taster G=gå til P=print M=st.skærm O=opsætn. Q=afslut \n"
+
+#. #define NOVICE_LINE_TWO_B
+#: LYMessages.c:198
+msgid " O)ther cmds B)ack E)dit D)ownload ^R)eload ^W)ipe screen search doc: / \n"
+msgstr " O=øvr. kmd B=retur E=rediger D=hent ^R=genindlæs ^W=ryd skærm søg/dok: / \n"
+
+#. #define NOVICE_LINE_TWO_C
+#: LYMessages.c:200
+msgid "O)ther cmds C)omment History: <backspace> Bookmarks: V)iew, A)dd, R)emove \n"
+msgstr "O=øvr. kmd C=kommentar <backspace>=Hist. Bogmærker: V=vis, A=tilføj R=slet \n"
+
+#. #define FORM_NOVICELINE_ONE
+#: LYMessages.c:202
+msgid " Enter text into the field by typing on the keyboard "
+msgstr " Brug tastaturet til at indtaste tekst i feltet "
+
+#. #define FORM_NOVICELINE_TWO
+#: LYMessages.c:204
+msgid " Ctrl-U to delete all text in field, [Backspace] to delete a character "
+msgstr " Ctrl-U sletter al tekst i feltet. [Backspace] sletter et tegn "
+
+#. #define FORM_NOVICELINE_TWO_DELBL
+#: LYMessages.c:206
+msgid " Ctrl-U to delete text in field, [Backspace] to delete a character "
+msgstr " Ctrl-U sletter tekst i feltet, [Backspace] sletter et tegn "
+
+#. #define FORM_NOVICELINE_TWO_VAR
+#: LYMessages.c:208
+#, c-format
+msgid " %s to delete all text in field, [Backspace] to delete a character "
+msgstr " %s sletter al tekst i feltet, [Backspace] sletter et tegn "
+
+#. #define FORM_NOVICELINE_TWO_DELBL_VAR
+#: LYMessages.c:210
+#, c-format
+msgid " %s to delete text in field, [Backspace] to delete a character "
+msgstr " %s sletter tekst i feltet, [Backspace] sletter et tegn "
+
+#. mailto
+#: LYMessages.c:213
+msgid "Malformed mailto form submission! Cancelled!"
+msgstr "Formateringsfejl i e-post-formular under afsendelse! Afbryder!"
+
+#: LYMessages.c:214
+msgid "Warning! Control codes in mail address replaced by ?"
+msgstr "Advarsel! styrekoder i e-post-adressen erstattet af ?"
+
+#: LYMessages.c:215
+msgid "Mail disallowed! Cannot submit."
+msgstr "Sending ikke tilladt! Kan ikke sende."
+
+#: LYMessages.c:216
+msgid "Mailto form submission failed!"
+msgstr "Indsendelse af e-post-formular slog fejl."
+
+#: LYMessages.c:217
+msgid "Mailto form submission Cancelled!!!"
+msgstr "Indsendelse af e-post-formular afbrudt!!!"
+
+#: LYMessages.c:218
+msgid "Sending form content..."
+msgstr "Sender formularens indhold ..."
+
+#: LYMessages.c:219
+msgid "No email address is present in mailto URL!"
+msgstr "'mailto:-linket indeholder ingen e-post-adresse!"
+
+#. #define MAILTO_URL_TEMPOPEN_FAILED
+#: LYMessages.c:221
+msgid "Unable to open temporary file for mailto URL!"
+msgstr "Kan ikke åbne midlertidig fil til mailto:-adresse!"
+
+#. #define INC_ORIG_MSG_PROMPT
+#: LYMessages.c:223
+msgid "Do you wish to include the original message?"
+msgstr "Vil du medsende den omhandlede side?"
+
+#. #define INC_PREPARSED_MSG_PROMPT
+#: LYMessages.c:225
+msgid "Do you wish to include the preparsed source?"
+msgstr "Vil du medsende HTML-koden?"
+
+#. #define SPAWNING_EDITOR_FOR_MAIL
+#: LYMessages.c:227
+msgid "Spawning your selected editor to edit mail message"
+msgstr "Kalder din valgte editor for at skrive brev"
+
+#. #define ERROR_SPAWNING_EDITOR
+#: LYMessages.c:229
+msgid "Error spawning editor, check your editor definition in the options menu"
+msgstr "Fejl ved kald af editor, tjek valg af editor i (o)psætningsmenuen"
+
+#: LYMessages.c:230
+msgid "Send this comment?"
+msgstr "Send denne kommentar?"
+
+#: LYMessages.c:231
+msgid "Send this message?"
+msgstr "Send dette brev?"
+
+#: LYMessages.c:232
+msgid "Sending your message..."
+msgstr "Sender dit brev ..."
+
+#: LYMessages.c:233
+msgid "Sending your comment:"
+msgstr "Sender din kommentar:"
+
+#. textarea
+#: LYMessages.c:236
+msgid "Not in a TEXTAREA; cannot use external editor."
+msgstr "Ikke i et TEKSTOMRÃ…DE; kan ikke bruge en ekstern editor."
+
+#: LYMessages.c:237
+msgid "Not in a TEXTAREA; cannot use command."
+msgstr "Ikke i et TEKSTOMRÃ…DE; kan ikke anvende kommando."
+
+#: LYMessages.c:239
+msgid "file: ACTIONs are disallowed!"
+msgstr "file: ACTIONs er ikke tilladt!"
+
+#. #define FILE_SERVED_LINKS_DISALLOWED
+#: LYMessages.c:241
+msgid "file: URLs via served links are disallowed!"
+msgstr "file: adresser via betjente links er ikke tilladt!"
+
+#: LYMessages.c:242
+msgid "Access to local files denied."
+msgstr "Adgang til lokale filer nægtet."
+
+#: LYMessages.c:243
+msgid "file: URLs via bookmarks are disallowed!"
+msgstr "file: Adresser via bogmærker er ikke tilladt!"
+
+#. #define SPECIAL_VIA_EXTERNAL_DISALLOWED
+#: LYMessages.c:245
+msgid "This special URL is not allowed in external documents!"
+msgstr "Denne særlige adresse er ikke tilladt i eksterne dokumenter!"
+
+#: LYMessages.c:246
+msgid "Press <return> to return to Lynx."
+msgstr "Tast <retur> for at komme tilbage til Lynx."
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:249
+msgid "Spawning DCL subprocess. Use 'logout' to return to Lynx.\n"
+msgstr "Kalder DCL-delproces. Tast \"logout\" for at returnere til Lynx.\n"
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:253
+msgid "Type EXIT to return to Lynx.\n"
+msgstr "Tast EXIT for at returnere til Lynx.\n"
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:256
+msgid "Spawning your default shell. Use 'exit' to return to Lynx.\n"
+msgstr "Kalder din kommandoskal. Tast 'exit' for at returnere til Lynx.\n"
+
+#: LYMessages.c:259
+msgid "Spawning is currently disabled."
+msgstr "Åbning af eksterne programmer er ikke tilladt i øjeblikket."
+
+#: LYMessages.c:260
+msgid "The 'd'ownload command is currently disabled."
+msgstr "'d'ownload-kommandoen er deaktiveret i øjeblikket."
+
+#: LYMessages.c:261
+msgid "You cannot download an input field."
+msgstr "Kan ikke hente et indtastningsfelt."
+
+#: LYMessages.c:262
+msgid "Form has a mailto action! Cannot download."
+msgstr "Formular indeholder en mailto-action! Kan ikke hente."
+
+#: LYMessages.c:263
+msgid "You cannot download a mailto: link."
+msgstr "Kan ikke hente et mailto:-link."
+
+#: LYMessages.c:264
+msgid "You cannot download cookies."
+msgstr "Kan ikke hente cookier."
+
+#: LYMessages.c:265
+msgid "You cannot download a printing option."
+msgstr "Kan ikke hente en printervalgmulighed."
+
+#: LYMessages.c:266
+msgid "You cannot download an upload option."
+msgstr "Kan ikke hente en upload-valgmulighed."
+
+#: LYMessages.c:267
+msgid "You cannot download an permit option."
+msgstr "Kan ikke hente en rettigheds-valgmulighed."
+
+#: LYMessages.c:268
+msgid "This special URL cannot be downloaded!"
+msgstr "Denne særlige adresse kan ikke hentes!"
+
+#: LYMessages.c:269
+msgid "Nothing to download."
+msgstr "Der er intet at hente."
+
+#: LYMessages.c:270
+msgid "Trace ON!"
+msgstr "Sporing slået TIL!"
+
+#: LYMessages.c:271
+msgid "Trace OFF!"
+msgstr "Sporing slået FRA!"
+
+#. #define CLICKABLE_IMAGES_ON
+#: LYMessages.c:273
+msgid "Links will be included for all images! Reloading..."
+msgstr "Links vil blive vist for alle billeder! Genindlæser ..."
+
+#. #define CLICKABLE_IMAGES_OFF
+#: LYMessages.c:275
+msgid "Standard image handling restored! Reloading..."
+msgstr "Standardhåndtering af billeder genoprettet! Genindlæser ..."
+
+#. #define PSEUDO_INLINE_ALTS_ON
+#: LYMessages.c:277
+msgid "Pseudo_ALTs will be inserted for inlines without ALT strings! Reloading..."
+msgstr "Indlejrede billeder uden ALT-tekst gives Pseudo_ALTs! Genindlæser ..."
+
+#. #define PSEUDO_INLINE_ALTS_OFF
+#: LYMessages.c:279
+msgid "Inlines without an ALT string specified will be ignored! Reloading..."
+msgstr "Indlejrede billeder uden ALT-tekst ignoreres! Genindlæser ..."
+
+#: LYMessages.c:280
+msgid "Raw 8-bit or CJK mode toggled OFF! Reloading..."
+msgstr "Rå 8-bit eller CJK-tilstand slået FRA! Genindlæser ..."
+
+#: LYMessages.c:281
+msgid "Raw 8-bit or CJK mode toggled ON! Reloading..."
+msgstr "Rå 8-bit el. CJK-tilstand slået TIL! Genindlæser ..."
+
+#. #define HEAD_D_L_OR_CANCEL
+#: LYMessages.c:283
+msgid "Send HEAD request for D)ocument or L)ink, or C)ancel? (d,l,c): "
+msgstr "Send HEAD-forespørgsel for D)okument, L)ink eller A)fbryd? (d,l,a): "
+
+#. #define HEAD_D_OR_CANCEL
+#: LYMessages.c:285
+msgid "Send HEAD request for D)ocument, or C)ancel? (d,c): "
+msgstr "Send HEAD-forespørgsel for D)okument, eller A)fbryd? (d,a): "
+
+#: LYMessages.c:286
+msgid "Sorry, the document is not an http URL."
+msgstr "Beklager, dokumentet er ikke en HTTP-adresse."
+
+#: LYMessages.c:287
+msgid "Sorry, the link is not an http URL."
+msgstr "Beklager, linket er ikke en HTTP-adresse."
+
+#: LYMessages.c:288
+msgid "Sorry, the ACTION for this form is disabled."
+msgstr "Beklager, ACTION for denne formular er deaktiveret."
+
+#. #define FORM_ACTION_NOT_HTTP_URL
+#: LYMessages.c:290
+msgid "Sorry, the ACTION for this form is not an http URL."
+msgstr "Beklager, ACTION for denne formular er ikke en HTTP-adresse."
+
+#: LYMessages.c:291
+msgid "Not an http URL or form ACTION!"
+msgstr "Ikke en HTTP-adresse eller formular ACTION!"
+
+#: LYMessages.c:292
+msgid "This special URL cannot be a form ACTION!"
+msgstr "Denne særlige adresse kan ikke være en formular ACTION!"
+
+#: LYMessages.c:293
+msgid "URL is not in starting realm!"
+msgstr "Adresse befinder sig ikke i begyndelsesområde!"
+
+#: LYMessages.c:294
+msgid "News posting is disabled!"
+msgstr "Sending til nyhedsgrupper er slået fra!"
+
+#: LYMessages.c:295
+msgid "File management support is disabled!"
+msgstr "Filhåndteringsfunktioner er sat ud af kraft!"
+
+#: LYMessages.c:296
+msgid "No jump file is currently available."
+msgstr "Ingen genvejsfil er tilgængelig i øjeblikket."
+
+#: LYMessages.c:297
+msgid "Jump to (use '?' for list): "
+msgstr "Hop til (brug '?' for en liste): "
+
+#: LYMessages.c:298
+msgid "Jumping to a shortcut URL is disallowed!"
+msgstr "Hop til en genvejsadresse er ikke tilladt!"
+
+#: LYMessages.c:299
+msgid "Random URL is disallowed! Use a shortcut."
+msgstr "Tilfældig adresse er ikke tilladt! Brug en genvej."
+
+#: LYMessages.c:300
+msgid "No random URLs have been used thus far."
+msgstr "Ingen tilfældige adresser er blevet brugt indtil videre."
+
+#: LYMessages.c:301
+msgid "Bookmark features are currently disabled."
+msgstr "Bogmærkefaciliteter er slået fra p.t."
+
+#: LYMessages.c:302
+msgid "Execution via bookmarks is disabled."
+msgstr "Programafvikling via bogmærker er slået fra."
+
+#. #define BOOKMARK_FILE_NOT_DEFINED
+#: LYMessages.c:304
+#, c-format
+msgid "Bookmark file is not defined. Use %s to see options."
+msgstr "Bogmærkefil er ikke defineret. Brug %s for at se valgmuligheder."
+
+#. #define NO_TEMP_FOR_HOTLIST
+#: LYMessages.c:306
+msgid "Unable to open tempfile for X Mosaic hotlist conversion."
+msgstr "Kan ikke åbne midlertidig fil for at omdanne X-Mosaic-bogmærker."
+
+#: LYMessages.c:307
+msgid "ERROR - unable to open bookmark file."
+msgstr "FEJL - kan ikke åbne bogmærkefil."
+
+#. #define BOOKMARK_OPEN_FAILED_FOR_DEL
+#: LYMessages.c:309
+msgid "Unable to open bookmark file for deletion of link."
+msgstr "Kan ikke åbne bogmærkefil for at slette link."
+
+#. #define BOOKSCRA_OPEN_FAILED_FOR_DEL
+#: LYMessages.c:311
+msgid "Unable to open scratch file for deletion of link."
+msgstr "Kan ikke åbne kladdefil for at slette link."
+
+#: LYMessages.c:313
+msgid "Error renaming scratch file."
+msgstr "Fejl ved ny navngivning af kladdefil"
+
+#: LYMessages.c:315
+msgid "Error renaming temporary file."
+msgstr "Fejl ved ny navngivning af midlertidig fil."
+
+#. #define BOOKTEMP_COPY_FAIL
+#: LYMessages.c:317
+msgid "Unable to copy temporary file for deletion of link."
+msgstr "Kan ikke kopiere midlertidig fil for at slette link."
+
+#. #define BOOKTEMP_REOPEN_FAIL_FOR_DEL
+#: LYMessages.c:319
+msgid "Unable to reopen temporary file for deletion of link."
+msgstr "Kan ikke genåbne midlertidig fil for at slette link."
+
+#. #define BOOKMARK_LINK_NOT_ONE_LINE
+#: LYMessages.c:322
+msgid "Link is not by itself all on one line in bookmark file."
+msgstr "Link står ikke for sig selv på en enkelt linje i bogmærkefilen."
+
+#: LYMessages.c:323
+msgid "Bookmark deletion failed."
+msgstr "Kunne ikke slette bogmærke."
+
+#. #define BOOKMARKS_NOT_TRAVERSED
+#: LYMessages.c:325
+msgid "Bookmark files cannot be traversed (only http URLs)."
+msgstr "Bogmærkefiler kan ikke traverseres (kun HTTP-adresser)."
+
+#. #define BOOKMARKS_NOT_OPEN
+#: LYMessages.c:327
+msgid "Unable to open bookmark file, use 'a' to save a link first"
+msgstr "Kan ikke åbne bogmærkefil, brug 'a' for at gemme et link først."
+
+#: LYMessages.c:328
+msgid "There are no links in this bookmark file!"
+msgstr "Der er ingen links i denne bogmærkefil!"
+
+#. #define CACHE_D_OR_CANCEL
+#: LYMessages.c:330
+msgid "D)elete cached document or C)ancel? (d,c): "
+msgstr "S)let dokument fra cache eller A)fbryd? (s,a): "
+
+#. #define BOOK_D_L_OR_CANCEL
+#: LYMessages.c:332
+msgid "Save D)ocument or L)ink to bookmark file or C)ancel? (d,l,c): "
+msgstr "Gem D)okument eller L)ink i bogmærkefil eller A)fbryd? (d,l,a): "
+
+#: LYMessages.c:333
+msgid "Save D)ocument to bookmark file or C)ancel? (d,c): "
+msgstr "Gem D)okument i bogmærkefil eller A)fbryd? (d,a): "
+
+#: LYMessages.c:334
+msgid "Save L)ink to bookmark file or C)ancel? (l,c): "
+msgstr "Gem L)ink i bogmærkefil eller A)fbryd? (l,a): "
+
+#. #define NOBOOK_POST_FORM
+#: LYMessages.c:336
+msgid "Documents from forms with POST content cannot be saved as bookmarks."
+msgstr "Formulardokumenter med POST-indhold kan ikke gemmes som bogmærker."
+
+#: LYMessages.c:337
+msgid "Cannot save form fields/links"
+msgstr "Kan ikke gemme formularfelter/-links"
+
+#. #define NOBOOK_HSML
+#: LYMessages.c:339
+msgid "History, showinfo, menu and list files cannot be saved as bookmarks."
+msgstr "Historik-, informations-, menu- og listefiler kan ikke gemmes som bogmærker."
+
+#. #define CONFIRM_BOOKMARK_DELETE
+#: LYMessages.c:341
+msgid "Do you really want to delete this link from your bookmark file?"
+msgstr "Skal dette link virkelig slettes fra din bogmærkefil?"
+
+#: LYMessages.c:342
+msgid "Malformed address."
+msgstr "Forkert udformet adresse."
+
+# "Historisk kommentarfortolkning" betyder at Lynx opfatter tegnet ">" som
+# afsluttende tegn i en kommentar i stedet for det gyldige "-->"
+# At Lynx har en indstilling for dette er derfor vi elsker Lynx, ikk'? ;-)
+#. #define HISTORICAL_ON_MINIMAL_OFF
+#: LYMessages.c:344
+msgid "Historical comment parsing ON (Minimal is overridden)!"
+msgstr "\"Historisk\" kommentarfortolkning slået TIL (Minimal er tilsidesat)!"
+
+#. #define HISTORICAL_OFF_MINIMAL_ON
+#: LYMessages.c:346
+msgid "Historical comment parsing OFF (Minimal is in effect)!"
+msgstr "Historisk\" kommentarfortolkning slået FRA (Minimal er virksom)!"
+
+#. #define HISTORICAL_ON_VALID_OFF
+#: LYMessages.c:348
+msgid "Historical comment parsing ON (Valid is overridden)!"
+msgstr "Historisk\" kommentarfortolkning slået TIL (Gyldig er tilsidesat)!"
+
+#. #define HISTORICAL_OFF_VALID_ON
+#: LYMessages.c:350
+msgid "Historical comment parsing OFF (Valid is in effect)!"
+msgstr "Historisk\" kommentarfortolkning slået FRA (Gyldig er virksom)!"
+
+#. #define MINIMAL_ON_IN_EFFECT
+#: LYMessages.c:352
+msgid "Minimal comment parsing ON (and in effect)!"
+msgstr "Minimal kommentarfortolkning slået TIL (og er virksom)!"
+
+#. #define MINIMAL_OFF_VALID_ON
+#: LYMessages.c:354
+msgid "Minimal comment parsing OFF (Valid is in effect)!"
+msgstr "Minimal kommentarfortolkning slået FRA (Gyldig er virksom)!"
+
+#. #define MINIMAL_ON_BUT_HISTORICAL
+#: LYMessages.c:356
+msgid "Minimal comment parsing ON (but Historical is in effect)!"
+msgstr "Minimal kommentarfortolkning slået TIL (men \"historisk\" er virksom)!"
+
+#. #define MINIMAL_OFF_HISTORICAL_ON
+#: LYMessages.c:358
+msgid "Minimal comment parsing OFF (Historical is in effect)!"
+msgstr "Minimal kommentarfortolkning slået FRA (\"Historisk\" er virksom)!"
+
+#: LYMessages.c:359
+msgid "Soft double-quote parsing ON!"
+msgstr "\"Soft double-quote\"-analyse slået TIL!"
+
+#: LYMessages.c:360
+msgid "Soft double-quote parsing OFF!"
+msgstr "\"Soft double-quote\"-fortolkning slået FRA!"
+
+#: LYMessages.c:361
+msgid "Now using TagSoup parsing of HTML."
+msgstr "Bruger nu \"TagSoup\" til at fortolke HTML."
+
+#: LYMessages.c:362
+msgid "Now using SortaSGML parsing of HTML!"
+msgstr "Bruger nu \"SortaSGML\" til at fortolke HTML!"
+
+#: LYMessages.c:363
+msgid "You are already at the end of this document."
+msgstr "Slutningen af dette dokument er nået."
+
+#: LYMessages.c:364
+msgid "You are already at the beginning of this document."
+msgstr "Du er allerede ved begyndelsen af dette dokument."
+
+#: LYMessages.c:365
+#, c-format
+msgid "You are already at page %d of this document."
+msgstr "Du står allerede på side %d af dette dokument."
+
+#: LYMessages.c:366
+#, c-format
+msgid "Link number %d already is current."
+msgstr "Linknummer %d er allerede det aktuelle."
+
+#: LYMessages.c:367
+msgid "You are already at the first document"
+msgstr "Du står allerede på det første dokument"
+
+#: LYMessages.c:368
+msgid "There are no links above this line of the document."
+msgstr "Der er ingen links ovenover denne linje i dokumentet."
+
+#: LYMessages.c:369
+msgid "There are no links below this line of the document."
+msgstr "Der er ingen links under denne linje i dokumentet."
+
+#. #define MAXLEN_REACHED_DEL_OR_MOV
+#: LYMessages.c:371
+msgid "Maximum length reached! Delete text or move off field."
+msgstr "Største længde er nået! Slet tekst eller forlad feltet."
+
+#. #define NOT_ON_SUBMIT_OR_LINK
+#: LYMessages.c:373
+msgid "You are not on a form submission button or normal link."
+msgstr "Du står ikke på en formularindsendelsesknap eller et normalt link."
+
+#. #define NEED_CHECKED_RADIO_BUTTON
+#: LYMessages.c:375
+msgid "One radio button must be checked at all times!"
+msgstr "Mindst en radioknap skal altid være markeret!"
+
+#: LYMessages.c:376
+msgid "No submit button for this form, submit single text field?"
+msgstr "Ingen indsendelsesknap til denne formular, indsend et enkelt tekstfelt?"
+
+#: LYMessages.c:377
+msgid "Do you want to go back to the previous document?"
+msgstr "Vil du returnere til det forrige dokument?"
+
+#: LYMessages.c:378
+msgid "Use arrows or tab to move off of field."
+msgstr "Brug pile eller TAB for at forlade feltet."
+
+#. #define ENTER_TEXT_ARROWS_OR_TAB
+#: LYMessages.c:380
+msgid "Enter text. Use arrows or tab to move off of field."
+msgstr "Indtast tekst. Brug pile eller TAB for at forlade feltet."
+
+#: LYMessages.c:381
+msgid "** Bad HTML!! No form action defined. **"
+msgstr "** DÃ¥rlig HTML! Ingen 'form action' er defineret. **"
+
+#: LYMessages.c:382
+msgid "Bad HTML!! Unable to create popup window!"
+msgstr "DÃ¥rlig HTML!! Kan ikke lave et pop op-vindue!"
+
+#: LYMessages.c:383
+msgid "Unable to create popup window!"
+msgstr "Kan ikke lave et pop op-vindue!"
+
+#: LYMessages.c:384
+msgid "Goto a random URL is disallowed!"
+msgstr "Der er spærret for tilfældige adresser!"
+
+#: LYMessages.c:385
+msgid "Goto a non-http URL is disallowed!"
+msgstr "Der er spærret for ikke-HTTP-adresser!"
+
+#: LYMessages.c:386
+#, c-format
+msgid "You are not allowed to goto \"%s\" URLs"
+msgstr "Der er spærret for \"%s\"-adresser"
+
+#: LYMessages.c:387
+msgid "URL to open: "
+msgstr "Ã…bn en side: "
+
+#: LYMessages.c:388
+msgid "Edit the current Goto URL: "
+msgstr "Ret den aktuelle adresse: "
+
+#: LYMessages.c:389
+msgid "Edit the previous Goto URL: "
+msgstr "Ret den forrige adresse: "
+
+#: LYMessages.c:390
+msgid "Edit a previous Goto URL: "
+msgstr "Ret en foregående adresse: "
+
+#: LYMessages.c:391
+msgid "Current document has POST data."
+msgstr "Dette dokument har 'POST'-data."
+
+#: LYMessages.c:392
+msgid "Edit this document's URL: "
+msgstr "Ret dette dokuments adresse: "
+
+#: LYMessages.c:393
+msgid "Edit the current link's URL: "
+msgstr "Ret adresse på det aktuelle link: "
+
+#: LYMessages.c:394
+msgid "Edit the form's submit-URL: "
+msgstr "Rediger formularens indsendelsesadresse: "
+
+#: LYMessages.c:395
+msgid "You cannot edit File Management URLs"
+msgstr "Du kan ikke rette i adresser til filhåndtering"
+
+#: LYMessages.c:396
+msgid "Enter a database query: "
+msgstr "Indtast en databaseforespørgsel: "
+
+#: LYMessages.c:397
+msgid "Enter a whereis query: "
+msgstr "Søg efter: "
+
+#: LYMessages.c:398
+msgid "Edit the current query: "
+msgstr "Ret i søgemønster: "
+
+#: LYMessages.c:399
+msgid "Edit the previous query: "
+msgstr "Ret forrige søgemønster: "
+
+#: LYMessages.c:400
+msgid "Edit a previous query: "
+msgstr "Ret i et tidligere søgemønster: "
+
+#. #define USE_C_R_TO_RESUB_CUR_QUERY
+#: LYMessages.c:402
+msgid "Use Control-R to resubmit the current query."
+msgstr "Brug Control-R for at genaktivere den aktuelle søgning."
+
+#: LYMessages.c:403
+msgid "Edit the current shortcut: "
+msgstr "Rediger den aktuelle genvej: "
+
+#: LYMessages.c:404
+msgid "Edit the previous shortcut: "
+msgstr "Rediger den foregående genvej: "
+
+#: LYMessages.c:405
+msgid "Edit a previous shortcut: "
+msgstr "Rediger en foregående genvej: "
+
+#: LYMessages.c:406
+#, c-format
+msgid "Key '%c' is not mapped to a jump file!"
+msgstr "Tasten '%c' er ikke bundet til en genvejsfil!"
+
+#: LYMessages.c:407
+msgid "Cannot locate jump file!"
+msgstr "Kan ikke finde genvejsfilen!"
+
+#: LYMessages.c:408
+msgid "Cannot open jump file!"
+msgstr "Kan ikke åbne genvejsfilen!"
+
+#: LYMessages.c:409
+msgid "Error reading jump file!"
+msgstr "Fejl ved læsning af genvejsfil!"
+
+#: LYMessages.c:410
+msgid "Out of memory reading jump file!"
+msgstr "Ikke nok hukommelse til læsning af genvejsfil!"
+
+#: LYMessages.c:411
+msgid "Out of memory reading jump table!"
+msgstr "Ikke nok hukommelse til læsning af genvejstabel!"
+
+#: LYMessages.c:412
+msgid "No index is currently available."
+msgstr "Intet indeks er tilgængeligt i øjeblikket."
+
+#. #define CONFIRM_MAIN_SCREEN
+#: LYMessages.c:414
+msgid "Do you really want to go to the Main screen?"
+msgstr "Vil du virkelig gå til startskærmen?"
+
+#: LYMessages.c:415
+msgid "You are already at main screen!"
+msgstr "Du står allerede i startskærmen!"
+
+#. #define NOT_ISINDEX
+#: LYMessages.c:417
+msgid "Not a searchable indexed document -- press '/' to search for a text string"
+msgstr "Ikke et søgbart, indekseret dokument - tast '/' for at søge efter tekst"
+
+#. #define NO_OWNER
+#: LYMessages.c:419
+msgid "No owner is defined for this file so you cannot send a comment"
+msgstr "Denne fil har ingen ejer, så du kan ikke sende en kommentar"
+
+#: LYMessages.c:420
+#, c-format
+msgid "No owner is defined. Use %s?"
+msgstr "Ingen ejer er defineret. Brug %s?"
+
+#: LYMessages.c:421
+msgid "Do you wish to send a comment?"
+msgstr "Vil du gerne sende en kommentar?"
+
+#: LYMessages.c:422
+msgid "Mail is disallowed so you cannot send a comment"
+msgstr "Postsystemet er spærret, så du kan ikke sende en kommentar"
+
+#: LYMessages.c:423
+msgid "The 'e'dit command is currently disabled."
+msgstr "'e'dit-kommandoen er slået fra i øjeblikket."
+
+#: LYMessages.c:424
+msgid "External editing is currently disabled."
+msgstr "Ekstern redigering er slået fra i øjeblikket."
+
+#: LYMessages.c:425
+msgid "System error - failure to get status."
+msgstr "Systemfejl - indhentning af status slog fejl."
+
+#: LYMessages.c:426
+msgid "No editor is defined!"
+msgstr "Ingen editor er defineret!"
+
+#: LYMessages.c:427
+msgid "The 'p'rint command is currently disabled."
+msgstr "'p'rint-kommandoen er slået fra i øjeblikket."
+
+#: LYMessages.c:428
+msgid "Document has no Toolbar links or Banner."
+msgstr "Dokumentet har hverken værktøjsbjælke, links eller banner."
+
+#: LYMessages.c:429
+msgid "Unable to open traversal file."
+msgstr "Kan ikke åbne traverseringsfil."
+
+#: LYMessages.c:430
+msgid "Unable to open traversal found file."
+msgstr "Kan ikke åbne traversering-fundet-fil."
+
+#: LYMessages.c:431
+msgid "Unable to open reject file."
+msgstr "Kan ikke åbne afvisningsfil."
+
+#: LYMessages.c:432
+msgid "Unable to open traversal errors output file"
+msgstr "Kan ikke åbne fil med uddata fra traverseringsfejl"
+
+#: LYMessages.c:433
+msgid "TRAVERSAL WAS INTERRUPTED"
+msgstr "TRAVERSERING BLEV AFBRUDT"
+
+#: LYMessages.c:434
+msgid "Follow link (or goto link or page) number: "
+msgstr "Følg link, eller gå til link-/sidenummer: "
+
+#: LYMessages.c:435
+msgid "Select option (or page) number: "
+msgstr "Vælg valgmuligheds- eller sidenummer: "
+
+#: LYMessages.c:436
+#, c-format
+msgid "Option number %d already is current."
+msgstr "Valgmulighed nummer %d er allerede aktuelt."
+
+#. #define ALREADY_AT_OPTION_END
+#: LYMessages.c:438
+msgid "You are already at the end of this option list."
+msgstr "Ingen valgmuligheder herunder."
+
+#. #define ALREADY_AT_OPTION_BEGIN
+#: LYMessages.c:440
+msgid "You are already at the beginning of this option list."
+msgstr "Ingen valgmuligheder herover."
+
+#. #define ALREADY_AT_OPTION_PAGE
+#: LYMessages.c:442
+#, c-format
+msgid "You are already at page %d of this option list."
+msgstr "Du er allerede ved side %d af denne valgmulighedsliste."
+
+#: LYMessages.c:443
+msgid "You have entered an invalid option number."
+msgstr "Du har indtastet et ugyldigt nummer for valgmulighed."
+
+#: LYMessages.c:444
+msgid "** Bad HTML!! Use -trace to diagnose. **"
+msgstr "** DÃ¥rlig HTML!! Brug -trace (sporing) til diagnostik. **"
+
+#: LYMessages.c:445
+msgid "Give name of file to save in"
+msgstr "Giv filen der skal gemmes i et navn"
+
+#: LYMessages.c:446
+msgid "Can't save data to file -- please run WWW locally"
+msgstr "Kan ikke gemme data i fil -- kør venligst WWW lokalt"
+
+#: LYMessages.c:447
+msgid "Can't open temporary file!"
+msgstr "Kan ikke åbne midlertidig fil!"
+
+#: LYMessages.c:448
+msgid "Can't open output file! Cancelling!"
+msgstr "Kan ikke åbne uddatafil! Afbryder!"
+
+#: LYMessages.c:449
+msgid "Execution is disabled."
+msgstr "Programudførelse er deaktiveret."
+
+#. #define EXECUTION_DISABLED_FOR_FILE
+#: LYMessages.c:451
+#, c-format
+msgid "Execution is not enabled for this file. See the Options menu (use %s)."
+msgstr "Denne fil kan ikke eksekveres. Se opsætningsmenuen (brug %s)."
+
+#. #define EXECUTION_NOT_COMPILED
+#: LYMessages.c:453
+msgid "Execution capabilities are not compiled into this version."
+msgstr "Denne version er ikke oversat, så filer kan eksekveres."
+
+#: LYMessages.c:454
+msgid "This file cannot be displayed on this terminal."
+msgstr "Filen kan ikke vises på denne terminal."
+
+#. #define CANNOT_DISPLAY_FILE_D_OR_C
+#: LYMessages.c:456
+msgid "This file cannot be displayed on this terminal: D)ownload, or C)ancel"
+msgstr "Filen kan ikke vises på denne terminal: D=hent, eller C=afbryd"
+
+#: LYMessages.c:457
+#, c-format
+msgid "%s D)ownload, or C)ancel"
+msgstr "%s D=hent, eller C=afbryd"
+
+#: LYMessages.c:458
+msgid "Cancelling file."
+msgstr "Forkaster fil."
+
+#: LYMessages.c:459
+msgid "Retrieving file. - PLEASE WAIT -"
+msgstr "Henter fil - vent venligst ..."
+
+#: LYMessages.c:460
+msgid "Enter a filename: "
+msgstr "Indtast et filnavn: "
+
+#: LYMessages.c:461
+msgid "Edit the previous filename: "
+msgstr "Ret det foregående filnavn: "
+
+#: LYMessages.c:462
+msgid "Edit a previous filename: "
+msgstr "Ret et foregående filnavn: "
+
+#: LYMessages.c:463
+msgid "Enter a new filename: "
+msgstr "Indtast et nyt filnavn: "
+
+#: LYMessages.c:464
+msgid "File name may not begin with a dot."
+msgstr "Filnavn må ikke begynde med et punktum."
+
+#: LYMessages.c:466
+msgid "File exists. Create higher version?"
+msgstr "Fil eksisterer. Opret en nyere version?"
+
+#: LYMessages.c:468
+msgid "File exists. Overwrite?"
+msgstr "Fil eksisterer. Overskriv?"
+
+#: LYMessages.c:470
+msgid "Cannot write to file."
+msgstr "Kan ikke skrive til fil."
+
+#: LYMessages.c:471
+msgid "ERROR! - download command is misconfigured."
+msgstr "FEJL! - download-kommando er sat forkert op."
+
+#: LYMessages.c:472
+msgid "Unable to download file."
+msgstr "Kan ikke hente fil."
+
+#: LYMessages.c:473
+msgid "Reading directory..."
+msgstr "Læser filkatalog ..."
+
+#: LYMessages.c:474
+msgid "Building directory listing..."
+msgstr "Laver fortegnelse over filer i filkatalog ..."
+
+#: LYMessages.c:475
+msgid "Saving..."
+msgstr "Gemmer ..."
+
+#: LYMessages.c:476
+#, c-format
+msgid "Could not edit file '%s'."
+msgstr "Kunne ikke redigere filen '%s'."
+
+#: LYMessages.c:477
+msgid "Unable to access document!"
+msgstr "Kan ikke tilgå dokument!"
+
+#: LYMessages.c:478
+msgid "Could not access file."
+msgstr "Kunne ikke tilgå fil."
+
+#: LYMessages.c:479
+msgid "Could not access directory."
+msgstr "Kunne ikke tilgå filkatalog."
+
+#: LYMessages.c:480
+msgid "Could not load data."
+msgstr "Kunne ikke indlæse data."
+
+#. #define CANNOT_EDIT_REMOTE_FILES
+#: LYMessages.c:482
+msgid "Lynx cannot currently (e)dit remote WWW files."
+msgstr "Lynx kan ikke r(e)digere eksterne webfiler i øjeblikket."
+
+#. #define CANNOT_EDIT_FIELD
+#: LYMessages.c:484
+msgid "This field cannot be (e)dited with an external editor."
+msgstr "Dette felt kan ikke r(e)digeres med en ekstern editor."
+
+#: LYMessages.c:485
+msgid "Bad rule"
+msgstr "Forkert regel"
+
+#: LYMessages.c:486
+msgid "Insufficient operands:"
+msgstr "Ikke nok operander:"
+
+#: LYMessages.c:487
+msgid "You are not authorized to edit this file."
+msgstr "Du har ikke lov til at redigere denne fil."
+
+#: LYMessages.c:488
+msgid "Title: "
+msgstr "Titel: "
+
+#: LYMessages.c:489
+msgid "Subject: "
+msgstr "Emne: "
+
+#: LYMessages.c:490
+msgid "Username: "
+msgstr "Brugernavn: "
+
+#: LYMessages.c:491
+msgid "Password: "
+msgstr "Adgangskode: "
+
+#: LYMessages.c:492
+msgid "lynx: Username and Password required!!!"
+msgstr "lynx: Brugernavn og adgangskode er påkrævet!"
+
+#: LYMessages.c:493
+msgid "lynx: Password required!!!"
+msgstr "lynx: Adgangskode påkrævet!"
+
+#: LYMessages.c:494
+msgid "Clear all authorization info for this session?"
+msgstr "Slet al autorisationsinfo for denne session?"
+
+#: LYMessages.c:495
+msgid "Authorization info cleared."
+msgstr "Autorisationsinfo slettet."
+
+#: LYMessages.c:496
+msgid "Authorization failed. Retry?"
+msgstr "Autorisation slog fejl. Prøv igen?"
+
+#: LYMessages.c:497
+msgid "cgi support has been disabled."
+msgstr "cgi-understøttelse er slået fra."
+
+#. #define CGI_NOT_COMPILED
+#: LYMessages.c:499
+msgid "Lynxcgi capabilities are not compiled into this version."
+msgstr "Denne version er ikke oversat med lynxcgi."
+
+#: LYMessages.c:500
+#, c-format
+msgid "Sorry, no known way of converting %s to %s."
+msgstr "Beklager, ingen kendt metode til at omdanne %s til %s."
+
+#: LYMessages.c:501
+msgid "Unable to set up connection."
+msgstr "Kan ikke oprette forbindelse."
+
+#: LYMessages.c:502
+msgid "Unable to make connection"
+msgstr "Kan ikke oprette forbindelse"
+
+#. #define MALFORMED_EXEC_REQUEST
+#: LYMessages.c:504
+msgid "Executable link rejected due to malformed request."
+msgstr "Afviste at eksekvere link pga. af fejl i underliggende kommando."
+
+#. #define BADCHAR_IN_EXEC_LINK
+#: LYMessages.c:506
+#, c-format
+msgid "Executable link rejected due to `%c' character."
+msgstr "Eksekvering af link afvist pga. '%c'-tegn."
+
+#. #define RELPATH_IN_EXEC_LINK
+#: LYMessages.c:508
+msgid "Executable link rejected due to relative path string ('../')."
+msgstr "Eksekvering af link afvist, da stien er angivet relativt ('../')"
+
+#. #define BADLOCPATH_IN_EXEC_LINK
+#: LYMessages.c:510
+msgid "Executable link rejected due to location or path."
+msgstr "Eksekvering af link afvist pga. placering eller sti."
+
+#: LYMessages.c:511
+msgid "Mail access is disabled!"
+msgstr "Postsystemet er spærret!"
+
+#. #define ACCESS_ONLY_LOCALHOST
+#: LYMessages.c:513
+msgid "Only files and servers on the local host can be accessed."
+msgstr "Kun filer og servere på den lokale værtsmaskine kan tilgås."
+
+#: LYMessages.c:514
+msgid "Telnet access is disabled!"
+msgstr "Adgang til Telnet er spærret!"
+
+#. #define TELNET_PORT_SPECS_DISABLED
+#: LYMessages.c:516
+msgid "Telnet port specifications are disabled."
+msgstr "Mulighed for at angive portnumre til Telnet er spærret."
+
+#: LYMessages.c:517
+msgid "USENET news access is disabled!"
+msgstr "Adgang til USENET-nyhedsgrupper er spærret!"
+
+#: LYMessages.c:518
+msgid "Rlogin access is disabled!"
+msgstr "Der er spærret for Rlogin-adgang!"
+
+#: LYMessages.c:519
+msgid "Ftp access is disabled!"
+msgstr "Der er spærret for FTP-adgang!"
+
+#: LYMessages.c:520
+msgid "There are no references from this document."
+msgstr "Der er ingen links i dette dokument."
+
+#: LYMessages.c:521
+msgid "There are only hidden links from this document."
+msgstr "Der er kun skjulte links i dette dokument."
+
+#: LYMessages.c:523
+msgid "Unable to open command file."
+msgstr "Ude af stand til at åbne kommandofil."
+
+#: LYMessages.c:525
+msgid "News Post Cancelled!!!"
+msgstr "Sending til nyhedsgruppe afbrudt!"
+
+#. #define SPAWNING_EDITOR_FOR_NEWS
+#: LYMessages.c:527
+msgid "Spawning your selected editor to edit news message"
+msgstr "Skriver indlæg til nyhedsgruppe med din valgte editor"
+
+#: LYMessages.c:528
+msgid "Post this message?"
+msgstr "Send dette indlæg?"
+
+#: LYMessages.c:529
+#, c-format
+msgid "Append '%s'?"
+msgstr "Tilføj '%s'?"
+
+#: LYMessages.c:530
+msgid "Posting to newsgroup(s)..."
+msgstr "Sender til nyhedsgruppe(r) ..."
+
+#: LYMessages.c:532
+msgid "*** You have unread mail. ***"
+msgstr "*** Du har ulæst post. ***"
+
+#: LYMessages.c:534
+msgid "*** You have mail. ***"
+msgstr "*** Du har post. ***"
+
+#: LYMessages.c:536
+msgid "*** You have new mail. ***"
+msgstr "*** Du har ny post. ***"
+
+#: LYMessages.c:537
+msgid "File insert cancelled!!!"
+msgstr "Indsætning af fil afbrudt!"
+
+#: LYMessages.c:538
+msgid "Not enough memory for file!"
+msgstr "Ikke nok hukommelse til fil!"
+
+#: LYMessages.c:539
+msgid "Can't open file for reading."
+msgstr "Kan ikke åbne fil for læsning."
+
+#: LYMessages.c:540
+msgid "File does not exist."
+msgstr "Filen eksisterer ikke."
+
+#: LYMessages.c:541
+msgid "File does not exist - reenter or cancel:"
+msgstr "Fil eksisterer ikke - genindtast eller afbryd:"
+
+#: LYMessages.c:542
+msgid "File is not readable."
+msgstr "Filen kan ikke læses."
+
+#: LYMessages.c:543
+msgid "File is not readable - reenter or cancel:"
+msgstr "Fil kan ikke læses - genindtast eller afbryd:"
+
+#: LYMessages.c:544
+msgid "Nothing to insert - file is 0-length."
+msgstr "Intet at indsætte - filens længde er 0 (nul)."
+
+#: LYMessages.c:545
+msgid "Save request cancelled!!!"
+msgstr "Du ville ikke gemme alligevel!"
+
+#: LYMessages.c:546
+msgid "Mail request cancelled!!!"
+msgstr "Fortrød afsendelse af brev!"
+
+#. #define CONFIRM_MAIL_SOURCE_PREPARSED
+#: LYMessages.c:548
+msgid "Viewing preparsed source. Are you sure you want to mail it?"
+msgstr "Viser nu HTML-kode. Vil du gerne sende koden med post?"
+
+#: LYMessages.c:549
+msgid "Please wait..."
+msgstr "Vent venligst ..."
+
+#: LYMessages.c:550
+msgid "Mailing file. Please wait..."
+msgstr "Sender fil. Vent venligst ..."
+
+#: LYMessages.c:551
+msgid "ERROR - Unable to mail file"
+msgstr "FEJL - kan ikke sende fil"
+
+#. #define CONFIRM_LONG_SCREEN_PRINT
+#: LYMessages.c:553
+#, c-format
+msgid "File is %d screens long. Are you sure you want to print?"
+msgstr "Filen er %d skærmbilleder lang. Vil du gerne udskrive den?"
+
+#: LYMessages.c:554
+msgid "Print request cancelled!!!"
+msgstr "Fortrød udskrivning!"
+
+#: LYMessages.c:555
+msgid "Press <return> to begin: "
+msgstr "Tast <retur> for at begynde: "
+
+#: LYMessages.c:556
+msgid "Press <return> to finish: "
+msgstr "Tast <retur> for at afslutte: "
+
+#. #define CONFIRM_LONG_PAGE_PRINT
+#: LYMessages.c:558
+#, c-format
+msgid "File is %d pages long. Are you sure you want to print?"
+msgstr "Filen er %d sider lang. Er du sikker på at du vil udskrive den?"
+
+#. #define CHECK_PRINTER
+#: LYMessages.c:560
+msgid "Be sure your printer is on-line. Press <return> to start printing:"
+msgstr "Sørg for at din printer er tændt. Tast <retur> for at udskrive:"
+
+#: LYMessages.c:561
+msgid "ERROR - Unable to allocate file space!!!"
+msgstr "FEJL - kan ikke finde plads til fil!"
+
+#: LYMessages.c:562
+msgid "Unable to open tempfile"
+msgstr "Kan ikke åbne midlertidig fil"
+
+#: LYMessages.c:563
+msgid "Unable to open print options file"
+msgstr "Kan ikke åbne fil med printerindstillinger"
+
+#: LYMessages.c:564
+msgid "Printing file. Please wait..."
+msgstr "Udskriver fil. Vent venligst ..."
+
+#: LYMessages.c:565
+msgid "Please enter a valid internet mail address: "
+msgstr "Indtast venligst en gyldig e-post-adresse: "
+
+#: LYMessages.c:566
+msgid "ERROR! - printer is misconfigured!"
+msgstr "FEJL! - printeren er sat forkert op!"
+
+#: LYMessages.c:567
+msgid "Image map from POST response not available!"
+msgstr "Kortbillede fra 'POST'-svar ikke tilgængeligt!"
+
+#: LYMessages.c:568
+msgid "Misdirected client-side image MAP request!"
+msgstr "Fejldirigering på ønsket kortbillede fra klienten!"
+
+#: LYMessages.c:569
+msgid "Client-side image MAP is not accessible!"
+msgstr "Kortbillede fra klient er ikke tilgængeligt!"
+
+#: LYMessages.c:570
+msgid "No client-side image MAPs are available!"
+msgstr "Ingen kortbilleder fra klient er tilgængelige!"
+
+#: LYMessages.c:571
+msgid "Client-side image MAP is not available!"
+msgstr "Kortbillede fra klient er ikke tilgængeligt!"
+
+#. #define OPTION_SCREEN_NEEDS_24
+#: LYMessages.c:574
+msgid "Screen height must be at least 24 lines for the Options menu!"
+msgstr "Skærmen skal have mindst 24 linjer til opsætningsmenuen!"
+
+#. #define OPTION_SCREEN_NEEDS_23
+#: LYMessages.c:576
+msgid "Screen height must be at least 23 lines for the Options menu!"
+msgstr "Skærmen skal have mindst 23 linjer til opsætningsmenuen!"
+
+#. #define OPTION_SCREEN_NEEDS_22
+#: LYMessages.c:578
+msgid "Screen height must be at least 22 lines for the Options menu!"
+msgstr "Skærmen skal have mindst 22 linjer til opsætningsmenuen!"
+
+#: LYMessages.c:580
+msgid "That key requires Advanced User mode."
+msgstr "Brugertilstand skal stå som avanceret for at bruge denne taste."
+
+#: LYMessages.c:581
+#, c-format
+msgid "Content-type: %s"
+msgstr "Content-type: %s"
+
+#: LYMessages.c:582
+msgid "Command: "
+msgstr "Kommando: "
+
+#: LYMessages.c:583
+msgid "Unknown or ambiguous command"
+msgstr "Ukendt eller tvetydig kommando"
+
+#: LYMessages.c:584
+msgid " Version "
+msgstr " Version "
+
+#: LYMessages.c:585
+msgid " first"
+msgstr " første"
+
+#: LYMessages.c:586
+msgid ", guessing..."
+msgstr ", gætter ..."
+
+#: LYMessages.c:587
+msgid "Permissions for "
+msgstr "Rettigheder for "
+
+#: LYMessages.c:588
+msgid "Select "
+msgstr "Vælg "
+
+#: LYMessages.c:589
+msgid "capital letter"
+msgstr "stort bogstav"
+
+#: LYMessages.c:590
+msgid " of option line,"
+msgstr " på valgmulighedslinje."
+
+#: LYMessages.c:591
+msgid " to save,"
+msgstr " for at gemme,"
+
+#: LYMessages.c:592
+msgid " to "
+msgstr " til "
+
+#: LYMessages.c:593
+msgid " or "
+msgstr " eller "
+
+#: LYMessages.c:594
+msgid " index"
+msgstr " indeks"
+
+#: LYMessages.c:595
+msgid " to return to Lynx."
+msgstr " for at komme tilbage til Lynx."
+
+#: LYMessages.c:596
+msgid "Accept Changes"
+msgstr "Godkend"
+
+#: LYMessages.c:597
+msgid "Reset Changes"
+msgstr "Nulstil"
+
+#: LYMessages.c:598
+msgid "Left Arrow cancels changes"
+msgstr "Venstre pil annullerer ændringer"
+
+#: LYMessages.c:599
+msgid "Save options to disk"
+msgstr "Gem indstillinger på disk"
+
+#: LYMessages.c:600
+msgid "Hit RETURN to accept entered data."
+msgstr "Tast <retur> for at godkende indtastede data."
+
+#. #define ACCEPT_DATA_OR_DEFAULT
+#: LYMessages.c:602
+msgid "Hit RETURN to accept entered data. Delete data to invoke the default."
+msgstr "<Retur> godkender indtastninger. Slet data for at genskabe standarder."
+
+#: LYMessages.c:603
+msgid "Value accepted!"
+msgstr "Værdi godkendt!"
+
+#. #define VALUE_ACCEPTED_WARNING_X
+#: LYMessages.c:605
+msgid "Value accepted! -- WARNING: Lynx is configured for XWINDOWS!"
+msgstr "Værdi godkendt! -- ADVARSEL: Lynx er sat op til X WINDOW!"
+
+#. #define VALUE_ACCEPTED_WARNING_NONX
+#: LYMessages.c:607
+msgid "Value accepted! -- WARNING: Lynx is NOT configured for XWINDOWS!"
+msgstr "Værdi godkendt! -- ADVARSEL: Lynx er IKKE sat op til X WINDOW!"
+
+#: LYMessages.c:608
+msgid "You are not allowed to change which editor to use!"
+msgstr "Du har ikke lov til vælge en anden editor!"
+
+#: LYMessages.c:609
+msgid "Failed to set DISPLAY variable!"
+msgstr "Det lykkedes ikke at sætte DISPLAY-variablen!"
+
+#: LYMessages.c:610
+msgid "Failed to clear DISPLAY variable!"
+msgstr "Det lykkedes ikke at slette DISPLAY-variablen!"
+
+#. #define BOOKMARK_CHANGE_DISALLOWED
+#: LYMessages.c:612
+msgid "You are not allowed to change the bookmark file!"
+msgstr "Du har ikke lov til at ændre bogmærkefilen!"
+
+#: LYMessages.c:613
+msgid "Terminal does not support color"
+msgstr "Terminal understøtter ikke farve"
+
+#: LYMessages.c:614
+#, c-format
+msgid "Your '%s' terminal does not support color."
+msgstr "Din '%s' terminal understøtter ikke farver."
+
+#: LYMessages.c:615
+msgid "Access to dot files is disabled!"
+msgstr "Adgang til punktumfiler er spærret!"
+
+#. #define UA_NO_LYNX_WARNING
+#: LYMessages.c:617
+msgid "User-Agent string does not contain \"Lynx\" or \"L_y_n_x\""
+msgstr "User-Agent-linje indeholder ikke \"Lynx\" eller \"L_y_n_x"
+
+#. #define UA_PLEASE_USE_LYNX
+#: LYMessages.c:619
+msgid "Use \"L_y_n_x\" or \"Lynx\" in User-Agent, or it looks like intentional deception!"
+msgstr "Brug \"L_y_n_x\" eller \"Lynx\" i User-Agent-linjen. Ellers minder det om bevidst snyd!"
+
+#. #define UA_CHANGE_DISABLED
+#: LYMessages.c:621
+msgid "Changing of the User-Agent string is disabled!"
+msgstr "Der er ikke mulighed for at ændre værdien af User-Agent-variablen!"
+
+#. #define CHANGE_OF_SETTING_DISALLOWED
+#: LYMessages.c:623
+msgid "You are not allowed to change this setting."
+msgstr "Du har ikke lov til at ændre denne indstilling."
+
+#: LYMessages.c:624
+msgid "Saving Options..."
+msgstr "Gemmer indstillinger ..."
+
+#: LYMessages.c:625
+msgid "Options saved!"
+msgstr "Indstillinger gemt!"
+
+#: LYMessages.c:626
+msgid "Unable to save Options!"
+msgstr "Kan ikke gemme indstillinger!"
+
+#: LYMessages.c:627
+msgid " 'r' to return to Lynx "
+msgstr " 'r' for at returnere til Lynx "
+
+#: LYMessages.c:628
+msgid " '>' to save, or 'r' to return to Lynx "
+msgstr " '>' for at gemme, eller 'r' for at returnere til Lynx "
+
+#. #define ANY_KEY_CHANGE_RET_ACCEPT
+#: LYMessages.c:630
+msgid "Hit any key to change value; RETURN to accept."
+msgstr "Tryk enhver taste for at ændre værdi; <retur> accepterer."
+
+#: LYMessages.c:631
+msgid "Error uncompressing temporary file!"
+msgstr "Fejl ved dekomprimering af midlertidig fil!"
+
+#: LYMessages.c:632
+msgid "Unsupported URL scheme!"
+msgstr "Adressetype ikke understøttet!"
+
+#: LYMessages.c:633
+msgid "Unsupported data: URL! Use SHOWINFO, for now."
+msgstr "Data ikke understøttet: Adresse! Brug 'SHOWINFO' indtil videre."
+
+#: LYMessages.c:634
+msgid "Redirection limit of 10 URL's reached."
+msgstr "Grænse for omdirigering på 10 adresser er nået."
+
+#: LYMessages.c:635
+msgid "Illegal redirection URL received from server!"
+msgstr "Modtog ugyldig omdirigeringsadresse fra server!"
+
+#. #define SERVER_ASKED_FOR_REDIRECTION
+#: LYMessages.c:637
+#, c-format
+msgid "Server asked for %d redirection of POST content to"
+msgstr "Server spurgte efter %d omdirigering af POST-indhold til"
+
+#: LYMessages.c:640
+msgid "P)roceed, use G)ET or C)ancel "
+msgstr "P=fortsæt, brug G)et eller C=afbryd "
+
+#: LYMessages.c:641
+msgid "P)roceed, or C)ancel "
+msgstr "P=fortsæt eller C=afbryd "
+
+#. #define ADVANCED_POST_GET_REDIRECT
+#: LYMessages.c:643
+msgid "Redirection of POST content. P)roceed, see U)RL, use G)ET or C)ancel"
+msgstr "Omdirigering af POST-indhold: P=fortsæt, U=se URL, G=brug GET, C=afbryd"
+
+#. #define ADVANCED_POST_REDIRECT
+#: LYMessages.c:645
+msgid "Redirection of POST content. P)roceed, see U)RL, or C)ancel"
+msgstr "Omdirigering af POST-indhold: P=fortsæt, U=se URL, C=afbryd"
+
+#. #define CONFIRM_POST_RESUBMISSION
+#: LYMessages.c:647
+msgid "Document from Form with POST content. Resubmit?"
+msgstr "Dokument fra formular med POST-indhold. Genindsend?"
+
+#. #define CONFIRM_POST_RESUBMISSION_TO
+#: LYMessages.c:649
+#, c-format
+msgid "Resubmit POST content to %s ?"
+msgstr "Genindsend POST-indhold til %s ?"
+
+#. #define CONFIRM_POST_LIST_RELOAD
+#: LYMessages.c:651
+#, c-format
+msgid "List from document with POST data. Reload %s ?"
+msgstr "Liste fra dokument med POST-data. Genindlæs %s ?"
+
+#. #define CONFIRM_POST_DOC_HEAD
+#: LYMessages.c:653
+msgid "Document from POST action, HEAD may not be understood. Proceed?"
+msgstr "Dokument fra \"POST action\". HEAD-kommando forstås måske ikke. Fortsæt?"
+
+#. #define CONFIRM_POST_LINK_HEAD
+#: LYMessages.c:655
+msgid "Form submit action is POST, HEAD may not be understood. Proceed?"
+msgstr "Formularindsendelse sker med 'POST'. 'HEAD' forstås evt. ikke. Fortsæt?"
+
+#: LYMessages.c:656
+msgid "Proceed without a username and password?"
+msgstr "Fortsæt uden brugernavn og adgangskode?"
+
+#: LYMessages.c:657
+#, c-format
+msgid "Proceed (%s)?"
+msgstr "Fortsæt (%s)?"
+
+#: LYMessages.c:658
+msgid "Cannot POST to this host."
+msgstr "Kan ikke bruge POST-metode med denne vært."
+
+#: LYMessages.c:659
+msgid "POST not supported for this URL - ignoring POST data!"
+msgstr "POST kan ikke bruges med denne adresse - ignorerer POST-data!"
+
+#: LYMessages.c:660
+msgid "Discarding POST data..."
+msgstr "Forkaster POST-data ..."
+
+#: LYMessages.c:661
+msgid "Document will not be reloaded!"
+msgstr "Dokumentet vil ikke blive genindlæst!"
+
+#: LYMessages.c:662
+msgid "Location: "
+msgstr "Placering: "
+
+#: LYMessages.c:663
+#, c-format
+msgid "'%s' not found!"
+msgstr "'%s' ikke fundet!"
+
+#: LYMessages.c:664
+msgid "Default Bookmark File"
+msgstr "Standard bogmærkefil"
+
+#: LYMessages.c:665
+msgid "Screen too small! (8x35 min)"
+msgstr "Skærm for lille! (min. 8x35)"
+
+#: LYMessages.c:666
+msgid "Select destination or ^G to Cancel: "
+msgstr "Vælg bogmærkefil eller ^G for at afbryde: "
+
+#. #define MULTIBOOKMARKS_SELECT
+#: LYMessages.c:668
+msgid "Select subbookmark, '=' for menu, or ^G to cancel: "
+msgstr "Vælg bogmærkefil: '=' giver en menu. ^G afbryder: "
+
+#. #define MULTIBOOKMARKS_SELF
+#: LYMessages.c:670
+msgid "Reproduce L)ink in this bookmark file or C)ancel? (l,c): "
+msgstr "Genskab L)ink i denne bogmærkefil eller A)fbryd? (l,a): "
+
+#: LYMessages.c:671
+msgid "Multiple bookmark support is not available."
+msgstr "Der er ikke mulighed for flere bogmærkefiler."
+
+#: LYMessages.c:672
+#, c-format
+msgid " Select Bookmark (screen %d of %d)"
+msgstr " Vælg bogmærke (skærm %d af %d)"
+
+#: LYMessages.c:673
+msgid " Select Bookmark"
+msgstr " Vælg Bogmærke"
+
+#. #define MULTIBOOKMARKS_EHEAD_MASK
+#: LYMessages.c:675
+#, c-format
+msgid "Editing Bookmark DESCRIPTION and FILEPATH (%d of 2)"
+msgstr "Redigerer bogmærkefilers BESKRIVELSE og PLACERING (%d af 2)"
+
+#. #define MULTIBOOKMARKS_EHEAD
+#: LYMessages.c:677
+msgid " Editing Bookmark DESCRIPTION and FILEPATH"
+msgstr " Redigerer bogmærkefilers BESKRIVELSE og PLACERING"
+
+#: LYMessages.c:678
+msgid "Letter: "
+msgstr "Bogstav: "
+
+#. #define USE_PATH_OFF_HOME
+#: LYMessages.c:681
+msgid "Use a filepath off your login directory in SHELL syntax!"
+msgstr "Brug en filsti udenfor dit hjemmekatalog i kommandoskallens syntaks!"
+
+#: LYMessages.c:683
+msgid "Use a filepath off your home directory!"
+msgstr "Brug en filsti udenfor dit hjemmekatalog!"
+
+#. #define MAXLINKS_REACHED
+#: LYMessages.c:686
+msgid "Maximum links per page exceeded! Use half-page or two-line scrolling."
+msgstr "Max. links pr. side overskredet! Se en halv side eller 2 linjer ad gangen."
+
+#: LYMessages.c:687
+msgid "No previously visited links available!"
+msgstr "Side med tidligere besøgte links er ikke tilgængelig!"
+
+#: LYMessages.c:688
+msgid "Memory exhausted! Program aborted!"
+msgstr "Hukommelse opbrugt! Program afsluttedes!"
+
+#: LYMessages.c:689
+msgid "Memory exhausted! Aborting..."
+msgstr "Hukommelse opbrugt! Afslutter ..."
+
+#: LYMessages.c:690
+msgid "Not enough memory!"
+msgstr "Ikke nok hukommelse!"
+
+#: LYMessages.c:691
+msgid "Directory/File Manager not available"
+msgstr "Filkatalog/filhåndtering er ikke tilgængelig"
+
+#: LYMessages.c:692
+msgid "HREF in BASE tag is not an absolute URL."
+msgstr "HREF i BASE-mærke er ikke en absolut adresse."
+
+#: LYMessages.c:693
+msgid "Location URL is not absolute."
+msgstr "Adresse er ikke absolut."
+
+#: LYMessages.c:694
+msgid "Refresh URL is not absolute."
+msgstr "Adresse er ikke absolut."
+
+#. #define SENDING_MESSAGE_WITH_BODY_TO
+#: LYMessages.c:696
+msgid ""
+"You are sending a message with body to:\n"
+" "
+msgstr ""
+"Du sender en meddelelse med indhold til:\n"
+" "
+
+#: LYMessages.c:697
+msgid ""
+"You are sending a comment to:\n"
+" "
+msgstr ""
+"Du sender en kommentar til:\n"
+" "
+
+#: LYMessages.c:698
+msgid ""
+"\n"
+" With copy to:\n"
+" "
+msgstr ""
+"\n"
+"Med kopi til:\n"
+" "
+
+#: LYMessages.c:699
+msgid ""
+"\n"
+" With copies to:\n"
+" "
+msgstr ""
+"\n"
+"Med kopier til:\n"
+" "
+
+#. #define CTRL_G_TO_CANCEL_SEND
+#: LYMessages.c:701
+msgid ""
+"\n"
+"\n"
+"Use Ctrl-G to cancel if you do not want to send a message\n"
+msgstr ""
+"\n"
+"\n"
+"Brug Ctrl-G for at afbryde, hvis du ikke vil sende meddelelse\n"
+
+#. #define ENTER_NAME_OR_BLANK
+#: LYMessages.c:703
+msgid ""
+"\n"
+" Please enter your name, or leave it blank to remain anonymous\n"
+msgstr ""
+"\n"
+" Indtast venligst dit navn (eller lad være hvis du vil være anonym)\n"
+
+#. #define ENTER_MAIL_ADDRESS_OR_OTHER
+#: LYMessages.c:705
+msgid ""
+"\n"
+" Please enter a mail address or some other\n"
+msgstr ""
+"\n"
+" Anfør venligst en e-post-adresse eller en anden\n"
+
+#. #define MEANS_TO_CONTACT_FOR_RESPONSE
+#: LYMessages.c:707
+msgid " means to contact you, if you desire a response.\n"
+msgstr " måde at kontakte dig på, hvis du ønsker et svar.\n"
+
+#: LYMessages.c:708
+msgid ""
+"\n"
+" Please enter a subject line.\n"
+msgstr ""
+"\n"
+" Anfør venligst en emnelinje.\n"
+
+#. #define ENTER_ADDRESS_FOR_CC
+#: LYMessages.c:710
+msgid ""
+"\n"
+" Enter a mail address for a CC of your message.\n"
+msgstr ""
+"\n"
+" Anfør en e-post-adresse for en Cc af dit brev.\n"
+
+#: LYMessages.c:711
+msgid " (Leave blank if you don't want a copy.)\n"
+msgstr " (Undlad at udfylde, hvis du ikke vil have kopi.)\n"
+
+#: LYMessages.c:712
+msgid ""
+"\n"
+" Please review the message body:\n"
+"\n"
+msgstr ""
+"\n"
+" Gennemse venligst brevets indhold:\n"
+
+#: LYMessages.c:713
+msgid ""
+"\n"
+"Press RETURN to continue: "
+msgstr ""
+"\n"
+"Tast <retur> for at fortsætte: "
+
+#: LYMessages.c:714
+msgid ""
+"\n"
+"Press RETURN to clean up: "
+msgstr ""
+"\n"
+"Tast <retur> for at rydde op: "
+
+#: LYMessages.c:715
+msgid " Use Control-U to erase the default.\n"
+msgstr " Brug Control-U for at slette det forvalgte.\n"
+
+#: LYMessages.c:716
+msgid ""
+"\n"
+" Please enter your message below."
+msgstr ""
+"\n"
+" Skriv venligst dit brev nedenfor."
+
+#. #define ENTER_PERIOD_WHEN_DONE_A
+#: LYMessages.c:718 src/LYNews.c:360
+msgid ""
+"\n"
+" When you are done, press enter and put a single period (.)"
+msgstr ""
+"\n"
+" Når du er færdig, så tast <retur> og sæt et enkelt punktum (.)"
+
+#. #define ENTER_PERIOD_WHEN_DONE_B
+#: LYMessages.c:720 src/LYNews.c:361
+msgid ""
+"\n"
+" on a line and press enter again."
+msgstr ""
+"\n"
+" på en linje for sig selv og tast <retur> igen."
+
+# Jeg vil foreslå:
+# (Ja, Nej, Altid og aldrIg)
+# da endelsen -ig i aldrig er den benægtende del af "aldre-ingen" - altså
+# "tider ingen" = "ingen tider" = aldrig.
+#. Cookies messages
+#. #define ADVANCED_COOKIE_CONFIRMATION
+#: LYMessages.c:724
+#, c-format
+msgid "%s cookie: %.*s=%.*s Allow? (Y/N/Always/neVer)"
+msgstr "%s cookie: %.*s=%.*s Tillad? (J/N/Altid/aldrIg)"
+
+#. #define INVALID_COOKIE_DOMAIN_CONFIRMATION
+#: LYMessages.c:726
+#, c-format
+msgid "Accept invalid cookie domain=%s for '%s'?"
+msgstr "Godkend ugyldigt cookiedomæne=%s for '%s'?"
+
+#. #define INVALID_COOKIE_PATH_CONFIRMATION
+#: LYMessages.c:728
+#, c-format
+msgid "Accept invalid cookie path=%s as a prefix of '%s'?"
+msgstr "Godkend ugyldig cookiesti=%s som et præfiks for '%s'?"
+
+#: LYMessages.c:729
+msgid "Allowing this cookie."
+msgstr "Tillader denne cookie."
+
+#: LYMessages.c:730
+msgid "Rejecting this cookie."
+msgstr "Afviser denne cookie."
+
+#: LYMessages.c:731
+msgid "The Cookie Jar is empty."
+msgstr "Cookiebeholderen er tom."
+
+#: LYMessages.c:732
+msgid "The Cache Jar is empty."
+msgstr "Cachebeholderen er tom."
+
+#. #define ACTIVATE_TO_GOBBLE
+#: LYMessages.c:734
+msgid "Activate links to gobble up cookies or entire domains,"
+msgstr "Aktivér links for at slette cookier eller hele domæner,"
+
+#: LYMessages.c:735
+msgid "or to change a domain's 'allow' setting."
+msgstr "eller for at ændre et domænes status."
+
+#: LYMessages.c:736
+msgid "(Cookies never allowed.)"
+msgstr "(Cookier aldrig tilladt.)"
+
+#: LYMessages.c:737
+msgid "(Cookies always allowed.)"
+msgstr "(Cookier altid tilladt.)"
+
+#: LYMessages.c:738
+msgid "(Cookies allowed via prompt.)"
+msgstr "(Cookier tilladt via prompt.)"
+
+#: LYMessages.c:739
+msgid "(Persistent Cookies.)"
+msgstr "(Varige cookier.)"
+
+#: LYMessages.c:740
+msgid "(No title.)"
+msgstr "(Ingen titel.)"
+
+#: LYMessages.c:741
+msgid "(No name.)"
+msgstr "(Ingen navn.)"
+
+#: LYMessages.c:742
+msgid "(No value.)"
+msgstr "(Ingen værdi.)"
+
+#: LYMessages.c:743 src/LYOptions.c:2446
+msgid "None"
+msgstr "Ingen"
+
+#: LYMessages.c:744
+msgid "(End of session.)"
+msgstr "(Slut på session.)"
+
+#: LYMessages.c:745
+msgid "Delete this cookie?"
+msgstr "Slet denne cookie?"
+
+#: LYMessages.c:746
+msgid "The cookie has been eaten!"
+msgstr "Cookier er blevet slettet!"
+
+#: LYMessages.c:747
+msgid "Delete this empty domain?"
+msgstr "Slet dette tomme domæne?"
+
+#: LYMessages.c:748
+msgid "The domain has been eaten!"
+msgstr "Domænet er blevet slettet!"
+
+#. #define DELETE_COOKIES_SET_ALLOW_OR_CANCEL
+#: LYMessages.c:750
+msgid "D)elete domain's cookies, set allow A)lways/P)rompt/neV)er, or C)ancel? "
+msgstr "D=slet domænes cookier, tillad: A=altid P=spørg V=aldrig C=afbryd? "
+
+#. #define DELETE_DOMAIN_SET_ALLOW_OR_CANCEL
+#: LYMessages.c:752
+msgid "D)elete domain, set allow A)lways/P)rompt/neV)er, or C)ancel? "
+msgstr "D=slet domæne, tillad: A=altid P=spørg V=aldrig C=afbryd? "
+
+#: LYMessages.c:753
+msgid "All cookies in the domain have been eaten!"
+msgstr "Alle cookier i domænet er blevet slettet!"
+
+#: LYMessages.c:754
+#, c-format
+msgid "'A'lways allowing from domain '%s'."
+msgstr "Tillader 'A'ltid fra domæne '%s'."
+
+#: LYMessages.c:755
+#, c-format
+msgid "ne'V'er allowing from domain '%s'."
+msgstr "Tillader aldrig(V) fra domæne '%s'."
+
+#: LYMessages.c:756
+#, c-format
+msgid "'P'rompting to allow from domain '%s'."
+msgstr "'Spørger(P) om tilladelse fra domæne '%s'."
+
+#: LYMessages.c:757
+msgid "Delete all cookies in this domain?"
+msgstr "Slet alle cookier under dette domæne?"
+
+#: LYMessages.c:758
+msgid "All of the cookies in the jar have been eaten!"
+msgstr "Alle cookier i beholderen er blevet slettet!"
+
+#: LYMessages.c:760
+msgid "Port 19 not permitted in URLs."
+msgstr "Port 19 er ikke tilladt i adresser."
+
+#: LYMessages.c:761
+msgid "Port 25 not permitted in URLs."
+msgstr "Port 25 er ikke tilladt i adresser."
+
+#: LYMessages.c:762
+#, c-format
+msgid "Port %lu not permitted in URLs."
+msgstr "Port %lu er ikke tilladt i adresser."
+
+#: LYMessages.c:763
+msgid "URL has a bad port field."
+msgstr "Adresse har et forkert portfelt."
+
+#: LYMessages.c:764
+msgid "Maximum nesting of HTML elements exceeded."
+msgstr "Øvre grænse for indlejring af HTML-elementer er overskredet."
+
+#: LYMessages.c:765
+msgid "Bad partial reference! Stripping lead dots."
+msgstr "Forkert delreference! Fjerner forreste punktummer."
+
+#: LYMessages.c:766
+msgid "Trace Log open failed. Trace off!"
+msgstr "Åbning af sporingslogfil mislykkedes. Sporing slået fra!"
+
+#: LYMessages.c:767
+msgid "Lynx Trace Log"
+msgstr "Lynx sporingslog"
+
+#: LYMessages.c:768
+msgid "No trace log has been started for this session."
+msgstr "Ingen sporingslog er åbnet for denne session."
+
+#. #define MAX_TEMPCOUNT_REACHED
+#: LYMessages.c:770
+msgid "The maximum temporary file count has been reached!"
+msgstr "Det maksimale antal midlertidige filer er nået!"
+
+#. #define FORM_VALUE_TOO_LONG
+#: LYMessages.c:772
+msgid "Form field value exceeds buffer length! Trim the tail."
+msgstr "Formularfeltets værdi overstiger bufferlængde! Gør den kortere."
+
+#. #define FORM_TAIL_COMBINED_WITH_HEAD
+#: LYMessages.c:774
+msgid "Modified tail combined with head of form field value."
+msgstr "Ændret \"hale\" kombineret med \"hoved\" i værdi for formularfelt."
+
+#. HTFile.c
+#: LYMessages.c:777
+msgid "Directory"
+msgstr "Filkatalog"
+
+#: LYMessages.c:778
+msgid "Directory browsing is not allowed."
+msgstr "Gennemsyn af filkatalog er ikke tilladt."
+
+#: LYMessages.c:779
+msgid "Selective access is not enabled for this directory"
+msgstr "Selektiv adgang til dette filkatalog er ikke muliggjort"
+
+#: LYMessages.c:780
+msgid "Multiformat: directory scan failed."
+msgstr "Multiformat: Skanning af filkatalog mislykkedes."
+
+#: LYMessages.c:781
+msgid "This directory is not readable."
+msgstr "Dette filkatalog kan ikke læses."
+
+#: LYMessages.c:782
+msgid "Can't access requested file."
+msgstr "Kan ikke tilgå den ønskede fil."
+
+#: LYMessages.c:783
+msgid "Could not find suitable representation for transmission."
+msgstr "Kunne ikke finde en passende repræsentation for overførsel."
+
+#: LYMessages.c:784
+msgid "Could not open file for decompression!"
+msgstr "Kunne ikke åbne fil til dekomprimering!"
+
+#: LYMessages.c:785
+msgid "Files:"
+msgstr "Filer:"
+
+#: LYMessages.c:786
+msgid "Subdirectories:"
+msgstr "Underkataloger:"
+
+#: LYMessages.c:787
+msgid " directory"
+msgstr " filkatalog"
+
+#: LYMessages.c:788
+msgid "Up to "
+msgstr "Op til "
+
+#: LYMessages.c:789
+msgid "Current directory is "
+msgstr "Aktuelle filkatalog er "
+
+#. HTFTP.c
+#: LYMessages.c:792
+msgid "Symbolic Link"
+msgstr "Symbolsk link"
+
+#. HTGopher.c
+#: LYMessages.c:795
+msgid "No response from server!"
+msgstr "Serveren svarede ikke!"
+
+#: LYMessages.c:796
+msgid "CSO index"
+msgstr "CSO-indeks"
+
+#: LYMessages.c:797
+msgid ""
+"\n"
+"This is a searchable index of a CSO database.\n"
+msgstr ""
+"\n"
+"Dette er et søgbart indeks i en CSO-database.\n"
+
+#: LYMessages.c:798
+msgid "CSO Search Results"
+msgstr "CSO-søgeresultater"
+
+#: LYMessages.c:799
+#, c-format
+msgid "Seek fail on %s\n"
+msgstr "Søgning mislykkedes på %s\n"
+
+#: LYMessages.c:800
+msgid ""
+"\n"
+"Press the 's' key and enter search keywords.\n"
+msgstr ""
+"\n"
+"Tryk på 's'-tasten og indtast nøgleord for søgning.\n"
+
+#: LYMessages.c:801
+msgid ""
+"\n"
+"This is a searchable Gopher index.\n"
+msgstr ""
+"\n"
+"Dette er et søgbart Gopher-indeks.\n"
+
+#: LYMessages.c:802
+msgid "Gopher index"
+msgstr "Gopher-indeks"
+
+#: LYMessages.c:803
+msgid "Gopher Menu"
+msgstr "Gopher-menu"
+
+#: LYMessages.c:804
+msgid " Search Results"
+msgstr " Resultater af søgning"
+
+#: LYMessages.c:805
+msgid "Sending CSO/PH request."
+msgstr "Sender CSO/PH-anmodning."
+
+#: LYMessages.c:806
+msgid "Sending Gopher request."
+msgstr "Sender Gopher-anmodning."
+
+#: LYMessages.c:807
+msgid "CSO/PH request sent; waiting for response."
+msgstr "CSO/PH-anmodning sendt; venter på svar."
+
+#: LYMessages.c:808
+msgid "Gopher request sent; waiting for response."
+msgstr "Gopher-anmodning sendt; venter på svar."
+
+#: LYMessages.c:809
+msgid ""
+"\n"
+"Please enter search keywords.\n"
+msgstr ""
+"\n"
+"Indtast venligst nøgleord for søgning.\n"
+
+#: LYMessages.c:810
+msgid ""
+"\n"
+"The keywords that you enter will allow you to search on a"
+msgstr ""
+"\n"
+"De indtastede nøgleord vil lade dig søge på et"
+
+#: LYMessages.c:811
+msgid " person's name in the database.\n"
+msgstr " personnavn i databasen.\n"
+
+#. HTNews.c
+#: LYMessages.c:814
+msgid "Connection closed ???"
+msgstr "Forbindelsen lukket ???"
+
+#: LYMessages.c:815
+msgid "Cannot open temporary file for news POST."
+msgstr "Kan ikke åbne midlertidig fil for postning til nyhedsgruppe."
+
+#: LYMessages.c:816
+msgid "This client does not contain support for posting to news with SSL."
+msgstr "Postning til nyhedsgrupper med SSL kan ikke benyttes med denne klient."
+
+#. HTStyle.c
+#: LYMessages.c:819
+#, c-format
+msgid "Style %d `%s' SGML:%s. Font %s %.1f point.\n"
+msgstr "Stil %d '%s' SGML:%s. Font %s %.1f punkt.\n"
+
+#: LYMessages.c:821
+#, c-format
+msgid "\tAlign=%d, %d tabs. (%.0f before, %.0f after)\n"
+msgstr "\tJuster=%d, %d tabs. (%.0f foran, %.0f efter)\n"
+
+#: LYMessages.c:822
+#, c-format
+msgid "\t\tTab kind=%d at %.0f\n"
+msgstr "\t\tTab kind=%d ved %.0f\n"
+
+#. HTTP.c
+#: LYMessages.c:825
+msgid "Can't proceed without a username and password."
+msgstr "Kan ikke fortsætte uden et brugernavn og en adgangskode."
+
+#: LYMessages.c:826
+msgid "Can't retry with authorization! Contact the server's WebMaster."
+msgstr "Kan ikke prøve igen med godkendelse! Kontakt serverens WebMaster."
+
+#: LYMessages.c:827
+msgid "Can't retry with proxy authorization! Contact the server's WebMaster."
+msgstr "Kan ikke prøve igen med proxy-godkendelse! Kontakt serverens WebMaster."
+
+#: LYMessages.c:828
+msgid "Retrying with proxy authorization information."
+msgstr "Prøver igen med godkendelsesinformation fra proxyvært."
+
+#: LYMessages.c:829
+#, c-format
+msgid "SSL error:%s-Continue?"
+msgstr "SSL-fejl:%s - fortsæt?"
+
+#. HTWAIS.c
+#: LYMessages.c:832
+msgid "HTWAIS: Return message too large."
+msgstr "HTWAIS: Retur-meddelelse er for stor."
+
+#: LYMessages.c:833
+msgid "Enter WAIS query: "
+msgstr "Indtast WAIS-forespørgsel: "
+
+#. Miscellaneous status
+#: LYMessages.c:836
+msgid "Retrying as HTTP0 request."
+msgstr "Prøver igen med HTTP0 som forespørgsel."
+
+#: LYMessages.c:837
+#, c-format
+msgid "Transferred %d bytes"
+msgstr "Overført %d bytes"
+
+#: LYMessages.c:838
+msgid "Data transfer complete"
+msgstr "Dataoverførsel fuldført"
+
+#: LYMessages.c:839
+#, c-format
+msgid "Error processing line %d of %s\n"
+msgstr "Fejl ved behandling af linje %d af %s\n"
+
+#. Lynx internal page titles
+#: LYMessages.c:842
+msgid "Address List Page"
+msgstr "Side med adresseliste"
+
+#: LYMessages.c:843
+msgid "Bookmark file"
+msgstr "Bogmærkefil"
+
+#: LYMessages.c:844
+msgid "Configuration Definitions"
+msgstr "Opsætningsdefinitioner"
+
+#: LYMessages.c:845
+msgid "Cookie Jar"
+msgstr "Cookiebeholder"
+
+#: LYMessages.c:846
+msgid "Current Edit-Key Map"
+msgstr "Aktuelle redigeringstastebindinger"
+
+#: LYMessages.c:847
+msgid "Current Key Map"
+msgstr "Aktuelle tastebindinger"
+
+#: LYMessages.c:848
+msgid "File Management Options"
+msgstr "Valgmuligheder for filhåndtering"
+
+#: LYMessages.c:849
+msgid "Download Options"
+msgstr "Valgmuligheder for download af filer"
+
+#: LYMessages.c:850
+msgid "History Page"
+msgstr "Historikside"
+
+#: LYMessages.c:851
+msgid "Cache Jar"
+msgstr "Cachebeholder"
+
+#: LYMessages.c:852
+msgid "List Page"
+msgstr "Oversigtsside"
+
+#: LYMessages.c:853
+msgid "Lynx.cfg Information"
+msgstr "Information om lynx.cfg"
+
+#: LYMessages.c:854
+msgid "Converted Mosaic Hotlist"
+msgstr "Omdannet Mosaic-bogmærkefil"
+
+#: LYMessages.c:855
+msgid "Options Menu"
+msgstr "Opsætningsmenu"
+
+#: LYMessages.c:856
+msgid "File Permission Options"
+msgstr "Valgmuligheder for filrettigheder"
+
+#: LYMessages.c:857
+msgid "Printing Options"
+msgstr "Valgmuligheder ved udskrivning"
+
+#: LYMessages.c:858
+msgid "Information about the current document"
+msgstr "Oplysninger om det aktuelle dokument"
+
+#: LYMessages.c:859
+msgid "Your recent statusline messages"
+msgstr "De seneste meddelelser fra statuslinjen"
+
+#: LYMessages.c:860
+msgid "Upload Options"
+msgstr "Valgmuligheder for uploads"
+
+#: LYMessages.c:861
+msgid "Visited Links Page"
+msgstr "Oversigt over besøgte links"
+
+#. CONFIG_DEF_TITLE subtitles
+#: LYMessages.c:864
+msgid "See also"
+msgstr "Se også"
+
+#: LYMessages.c:865
+msgid "your"
+msgstr "din"
+
+#: LYMessages.c:866
+msgid "for runtime options"
+msgstr "Valgmuligheder ved opstart"
+
+#: LYMessages.c:867
+msgid "compile time options"
+msgstr "Valgmuligheder ved oversættelse (compile)"
+
+#: LYMessages.c:868
+msgid "color-style configuration"
+msgstr "Opsætning af color-style"
+
+#: LYMessages.c:869
+msgid "latest release"
+msgstr "seneste udgave"
+
+#: LYMessages.c:870
+msgid "pre-release version"
+msgstr "prøveversion"
+
+#: LYMessages.c:871
+msgid "development version"
+msgstr "udviklingsversion"
+
+#. #define AUTOCONF_CONFIG_CACHE
+#: LYMessages.c:873
+msgid ""
+"The following data were derived during the automatic configuration/build\n"
+"process of this copy of Lynx. When reporting a bug, please include a copy\n"
+"of this page."
+msgstr ""
+"Følgende data blev indhentet under den automatiske opsætningsproces\n"
+"af denne kopi af Lynx. Ved indrapportering af en programfejl, medsend da\n"
+"venligst en kopi af denne side."
+
+#. #define AUTOCONF_LYNXCFG_H
+#: LYMessages.c:877
+msgid ""
+"The following data were used as automatically-configured compile-time\n"
+"definitions when this copy of Lynx was built."
+msgstr ""
+"Følgende data blev brugt som forvalgte oversættelsesdefinitioner,\n"
+"da denne kopi af Lynx blev lavet."
+
+#. #define DIRED_NOVICELINE
+#: LYMessages.c:882
+msgid " C)reate D)ownload E)dit F)ull menu M)odify R)emove T)ag U)pload \n"
+msgstr " C=Opret D=Hent E=rediger F=fuld menu M=ret R=slet T=marker U=upload \n"
+
+#: LYMessages.c:883
+msgid "Failed to obtain status of current link!"
+msgstr "Kunne ikke hente status på aktuelle link!"
+
+#. #define INVALID_PERMIT_URL
+#: LYMessages.c:886
+msgid "Special URL only valid from current File Permission menu!"
+msgstr "Særlig adresse er kun gyldig fra menu over aktuelle filrettigheder!"
+
+#: LYMessages.c:890
+msgid "External support is currently disabled."
+msgstr "Ekstern understøttelse er slået fra i øjeblikket."
+
+#. new with 2.8.4dev.21
+#: LYMessages.c:894
+msgid "Changing working-directory is currently disabled."
+msgstr "Ændring af arbejdskatalog er sat ud af kraft i øjeblikket."
+
+#: LYMessages.c:895
+msgid "Linewrap OFF!"
+msgstr "Linjeombrydning slået FRA!"
+
+#: LYMessages.c:896
+msgid "Linewrap ON!"
+msgstr "Linjeombrydning slået TIL!"
+
+#: LYMessages.c:897
+msgid "Parsing nested-tables toggled OFF! Reloading..."
+msgstr "Indlejrede tabeller fortolkes IKKE! Genindlæser ..."
+
+#: LYMessages.c:898
+msgid "Parsing nested-tables toggled ON! Reloading..."
+msgstr "Indlejrede tabeller fortolkes! Genindlæser ..."
+
+#: LYMessages.c:899
+msgid "Shifting is disabled while line-wrap is in effect"
+msgstr "Panorering er slået fra når linjeombrydning er aktiveret"
+
+#: LYMessages.c:900
+msgid "Trace not supported"
+msgstr "Sporing ikke understøttet"
+
+#: LYMessages.c:820
+#, c-format
+msgid "\tIndents: first=%.0f others=%.0f, Height=%.1f Desc=%.1f\n"
+msgstr "\tIndryk: først=%.0f andre=%.0f, Højde=%.1f Beskr=%.1f\n"
+
+#: WWW/Library/Implementation/HTAABrow.c:569
+#, c-format
+msgid "username for realm %s changed from %s to %s"
+msgstr "Brugernavn for området %s ændret fra %s til %s"
+
+#: WWW/Library/Implementation/HTAABrow.c:585
+#, c-format
+msgid "password for realm %s user %s changed"
+msgstr "adgangskode for området %s bruger %s ændret"
+
+#: WWW/Library/Implementation/HTAABrow.c:697
+#, c-format
+msgid "Username for '%s' at %s '%s%s':"
+msgstr "Brugernavn for '%s' på %s '%s%s':"
+
+#: WWW/Library/Implementation/HTAABrow.c:970
+msgid "This client doesn't know how to compose proxy authorization information for scheme"
+msgstr "Denne klient kan ikke danne godkendelsesinformation til proxyvært"
+
+#: WWW/Library/Implementation/HTAABrow.c:1047
+msgid "This client doesn't know how to compose authorization information for scheme"
+msgstr "Denne klient kan ikke danne godkendelsesinformation til protokol"
+
+#: WWW/Library/Implementation/HTAABrow.c:1156
+#, c-format
+msgid "Invalid header '%s%s%s%s%s'"
+msgstr "Ugyldigt hoved '%s%s%s%s%s'"
+
+#: WWW/Library/Implementation/HTAABrow.c:1260
+msgid "Proxy authorization required -- retrying"
+msgstr "proxygodkendelse påkrævet - forsøger igen"
+
+#: WWW/Library/Implementation/HTAABrow.c:1316
+msgid "Access without authorization denied -- retrying"
+msgstr "Adgang uden godkendelse nægtet - forsøger igen"
+
+#: WWW/Library/Implementation/HTAccess.c:698
+msgid "Access forbidden by rule"
+msgstr "Adgang forbudt pr. regel"
+
+#: WWW/Library/Implementation/HTAccess.c:793
+msgid "Document with POST content not found in cache. Resubmit?"
+msgstr "Dokument med 'POST'-indhold ikke fundet i cache. Genindsend?"
+
+#: WWW/Library/Implementation/HTAccess.c:947
+msgid "Loading failed, use a previous copy."
+msgstr "Indlæsning slog fejl, brug en foregående kopi."
+
+#: WWW/Library/Implementation/HTAccess.c:1056 src/GridText.c:8865
+msgid "Loading incomplete."
+msgstr "Indlæsning ikke fuldført."
+
+#: WWW/Library/Implementation/HTAccess.c:1087
+#, c-format
+msgid "**** HTAccess: socket or file number returned by obsolete load routine!\n"
+msgstr "** HTAccess: sokkel- el. filnr. returneret af forældet indlæsningsmetode!\n"
+
+#: WWW/Library/Implementation/HTAccess.c:1089
+#, c-format
+msgid "**** HTAccess: Internal software error. Please mail lynx-dev@nongnu.org!\n"
+msgstr "**** HTAccess: Intern softwarefejl. Meld venligst til lynx-dev@nongnu.org!\n"
+
+#: WWW/Library/Implementation/HTAccess.c:1090
+#, c-format
+msgid "**** HTAccess: Status returned was: %d\n"
+msgstr "**** HTAccess: Statustilbagemelding var: %d\n"
+
+#.
+#. * hack: if we fail in HTAccess.c
+#. * avoid duplicating URL, oh.
+#.
+#: WWW/Library/Implementation/HTAccess.c:1096 src/LYMainLoop.c:8075
+msgid "Can't Access"
+msgstr "Kan ikke tilgå"
+
+#: WWW/Library/Implementation/HTAccess.c:1104
+msgid "Unable to access document."
+msgstr "Kan ikke tilgå dokument."
+
+#: WWW/Library/Implementation/HTFTP.c:870
+#, c-format
+msgid "Enter password for user %s@%s:"
+msgstr "Indtast adgangskode for bruger %s@%s:"
+
+#: WWW/Library/Implementation/HTFTP.c:898
+msgid "Unable to connect to FTP host."
+msgstr "Kan ikke kontakte FTP-vært."
+
+#: WWW/Library/Implementation/HTFTP.c:1137
+msgid "close master socket"
+msgstr "luk primær sokkel"
+
+#: WWW/Library/Implementation/HTFTP.c:1199
+msgid "socket for master socket"
+msgstr "sokkel til primær sokkel"
+
+#: WWW/Library/Implementation/HTFTP.c:2948
+msgid "Receiving FTP directory."
+msgstr "FTP-filkatalog indlæses."
+
+#: WWW/Library/Implementation/HTFTP.c:3086
+#, c-format
+msgid "Transferred %d bytes (%5d)"
+msgstr "Overført %d bytes (%5d)"
+
+#: WWW/Library/Implementation/HTFTP.c:3444
+msgid "connect for data"
+msgstr "dataforbindelse åben"
+
+#: WWW/Library/Implementation/HTFTP.c:4126
+msgid "Receiving FTP file."
+msgstr "Modtager FTP-fil."
+
+#: WWW/Library/Implementation/HTFinger.c:274
+msgid "Could not set up finger connection."
+msgstr "Kunne ikke oprette finger-forbindelse."
+
+#: WWW/Library/Implementation/HTFinger.c:321
+msgid "Could not load data (no sitename in finger URL)"
+msgstr "Kunne ikke indlæse data (intet sitenavn i finger-adresse)"
+
+#: WWW/Library/Implementation/HTFinger.c:325
+msgid "Invalid port number - will only use port 79!"
+msgstr "Ugyldigt portnummer - vil kun bruge port 79!"
+
+#: WWW/Library/Implementation/HTFinger.c:391
+msgid "Could not access finger host."
+msgstr "Kunne ikke få adgang til finger-vært."
+
+#: WWW/Library/Implementation/HTFinger.c:399
+msgid "No response from finger server."
+msgstr "Intet svar fra finger-server."
+
+#: WWW/Library/Implementation/HTNews.c:421
+#, c-format
+msgid "Username for news host '%s':"
+msgstr "Brugernavn for nyhedsvært '%s':"
+
+#: WWW/Library/Implementation/HTNews.c:474
+msgid "Change username?"
+msgstr "Skift brugernavn?"
+
+#: WWW/Library/Implementation/HTNews.c:478
+msgid "Username:"
+msgstr "Brugernavn:"
+
+#: WWW/Library/Implementation/HTNews.c:503
+#, c-format
+msgid "Password for news host '%s':"
+msgstr "Adgangskode for nyhedsvært (news) '%s':"
+
+#: WWW/Library/Implementation/HTNews.c:586
+msgid "Change password?"
+msgstr "Skift adgangskode?"
+
+#: WWW/Library/Implementation/HTNews.c:1707
+#, c-format
+msgid "No matches for: %s"
+msgstr "Ingen resultater for: %s"
+
+#: WWW/Library/Implementation/HTNews.c:1757
+msgid ""
+"\n"
+"No articles in this group.\n"
+msgstr ""
+"\n"
+"Ingen artikler i denne gruppe.\n"
+
+#: WWW/Library/Implementation/HTNews.c:1769
+msgid ""
+"\n"
+"No articles in this range.\n"
+msgstr ""
+"\n"
+"Ingen artikler i dette interval.\n"
+
+#.
+#. * Set window title.
+#.
+#: WWW/Library/Implementation/HTNews.c:1782
+#, c-format
+msgid "%s, Articles %d-%d"
+msgstr "%s, Artikler %d-%d"
+
+#: WWW/Library/Implementation/HTNews.c:1805
+msgid "Earlier articles"
+msgstr "Tidligere artikler"
+
+#: WWW/Library/Implementation/HTNews.c:1818
+#, c-format
+msgid ""
+"\n"
+"There are about %d articles currently available in %s, IDs as follows:\n"
+"\n"
+msgstr ""
+"\n"
+"Der er i øjeblikket ca. %d artikler i %s, ID'er som følger:\n"
+
+#: WWW/Library/Implementation/HTNews.c:1880
+msgid "All available articles in "
+msgstr "Alle tilgængelige artikler i "
+
+#: WWW/Library/Implementation/HTNews.c:2094
+msgid "Later articles"
+msgstr "Nyere artikler"
+
+#: WWW/Library/Implementation/HTNews.c:2117
+msgid "Post to "
+msgstr "Send til "
+
+#: WWW/Library/Implementation/HTNews.c:2338
+msgid "This client does not contain support for SNEWS URLs."
+msgstr "Denne klient kan ikke bruge SNEWS-adresser."
+
+#: WWW/Library/Implementation/HTNews.c:2545
+msgid "No target for raw text!"
+msgstr "Intet mål for rå tekst!"
+
+#: WWW/Library/Implementation/HTNews.c:2575
+msgid "Connecting to NewsHost ..."
+msgstr "Kontakter nyhedsvært ..."
+
+#: WWW/Library/Implementation/HTNews.c:2627
+#, c-format
+msgid "Could not access %s."
+msgstr "Kunne ikke tilgå %s."
+
+#: WWW/Library/Implementation/HTNews.c:2733
+#, c-format
+msgid "Can't read news info. News host %.20s responded: %.200s"
+msgstr "Kan ikke læse nyhedsinfo. Nyhedsvært %.20s svarede: %.200s"
+
+#: WWW/Library/Implementation/HTNews.c:2737
+#, c-format
+msgid "Can't read news info, empty response from host %s"
+msgstr "Kan ikke læse nyhedsinfo, tomt svar fra vært %s"
+
+#.
+#. * List available newsgroups. - FM
+#.
+#: WWW/Library/Implementation/HTNews.c:2941
+msgid "Reading list of available newsgroups."
+msgstr "Indlæser liste over tilgængelige nyhedsgrupper.."
+
+#: WWW/Library/Implementation/HTNews.c:2962
+msgid "Reading list of articles in newsgroup."
+msgstr "Indlæser liste over artikler i nyhedsgruppe.."
+
+#.
+#. * Get an article from a news group. - FM
+#.
+#: WWW/Library/Implementation/HTNews.c:2968
+msgid "Reading news article."
+msgstr "Læser nyhedsartikel.."
+
+#: WWW/Library/Implementation/HTNews.c:2998
+msgid "Sorry, could not load requested news."
+msgstr "Beklager, kunne ikke indlæse artikler."
+
+#: WWW/Library/Implementation/HTTCP.c:1323
+msgid "Address has invalid port"
+msgstr "Adresse har en ugyldig port"
+
+#: WWW/Library/Implementation/HTTCP.c:1397
+msgid "Address length looks invalid"
+msgstr "Adresselængde forekommer ugyldig"
+
+#: WWW/Library/Implementation/HTTCP.c:1839
+#: WWW/Library/Implementation/HTTCP.c:1857
+#, c-format
+msgid "Unable to locate remote host %s."
+msgstr "Ude af stand til at finde fremmed vært %s."
+
+#. Not HTProgress, so warning won't be overwritten immediately;
+#. * but not HTAlert, because typically there will be other
+#. * alerts from the callers. - kw
+#.
+#: WWW/Library/Implementation/HTTCP.c:1854
+#: WWW/Library/Implementation/HTTelnet.c:115
+#, c-format
+msgid "Invalid hostname %s"
+msgstr "Ugyldigt værtsnavn %s"
+
+#: WWW/Library/Implementation/HTTCP.c:1868
+#, c-format
+msgid "Making %s connection to %s"
+msgstr "Opretter %s-forbindelse til %s"
+
+#: WWW/Library/Implementation/HTTCP.c:1879
+msgid "socket failed."
+msgstr "sokkel fejlede."
+
+#: WWW/Library/Implementation/HTTCP.c:1893
+#, c-format
+msgid "socket failed: family %d addr %s port %s."
+msgstr "sokkel fejlede: familie %d adr. %s port %s."
+
+#: WWW/Library/Implementation/HTTCP.c:1917
+msgid "Could not make connection non-blocking."
+msgstr "Kunne ikke oprette en ikke-blokerende forbindelse."
+
+#: WWW/Library/Implementation/HTTCP.c:1985
+msgid "Connection failed (too many retries)."
+msgstr "Forbindelse opgivet (for mange forsøg)."
+
+#: WWW/Library/Implementation/HTTCP.c:2174
+msgid "Could not restore socket to blocking."
+msgstr "Kunne ikke få sokkel til at blokere."
+
+#: WWW/Library/Implementation/HTTCP.c:2242
+msgid "Socket read failed (too many tries)."
+msgstr "Sokkellæsning mislykkedes (for mange forsøg)."
+
+#: WWW/Library/Implementation/HTTP.c:134
+#, c-format
+msgid "SSL callback:%s, preverify_ok=%d, ssl_okay=%d"
+msgstr "SSL-tilbagekald:%s, preverify_ok=%d, ssl_okay=%d"
+
+#: WWW/Library/Implementation/HTTP.c:629
+#, c-format
+msgid "User/password contains only punctuation: %s"
+msgstr "Bruger/adgangskode indeholder kun tegnsætning: %s"
+
+#: WWW/Library/Implementation/HTTP.c:633
+#, c-format
+msgid "User/password may be confused with hostname: '%s' (e.g, '%s')"
+msgstr "Bruger/adgangskode kan forveksles med værtsnavn: »%s« (f.eks. »%s«)"
+
+#: WWW/Library/Implementation/HTTP.c:694
+#, c-format
+msgid "Certificate issued by: %s"
+msgstr "Certifikat udstedt af: %s"
+
+#: WWW/Library/Implementation/HTTP.c:881
+msgid "This client does not contain support for HTTPS URLs."
+msgstr "Denne klient kan ikke bruge HTTPS-adresser."
+
+#: WWW/Library/Implementation/HTTP.c:906
+msgid "Unable to connect to remote host."
+msgstr "Kan ikke forbinde til fremmed vært."
+
+#: WWW/Library/Implementation/HTTP.c:953
+msgid "Retrying connection without TLS."
+msgstr "Forsøger at genetablere forbindelsen uden TLS."
+
+#: WWW/Library/Implementation/HTTP.c:1005
+msgid "GnuTLS error when trying to verify certificate."
+msgstr "GnuTLS-fejl under forsøg på at verificere certifikat."
+
+#: WWW/Library/Implementation/HTTP.c:1018
+msgid "the certificate has no known issuer"
+msgstr "certifikatet har ingen kendt udsteder"
+
+#: WWW/Library/Implementation/HTTP.c:1020
+msgid "no issuer was found"
+msgstr "ingen udsteder fundet"
+
+# CA = Certification Authority
+#: WWW/Library/Implementation/HTTP.c:1022
+msgid "issuer is not a CA"
+msgstr "udsteder er ikke en certificeringsmyndighed"
+
+#: WWW/Library/Implementation/HTTP.c:1024
+msgid "the certificate has been revoked"
+msgstr "certifikatet er blevet tilbagekaldt"
+
+#: WWW/Library/Implementation/HTTP.c:1026
+msgid "the certificate is not trusted"
+msgstr "certifikatet er ikke troværdigt"
+
+#: WWW/Library/Implementation/HTTP.c:1101
+#, c-format
+msgid "Verified connection to %s (cert=%s)"
+msgstr "Verificerede forbindelse til %s (cert=%s)"
+
+#: WWW/Library/Implementation/HTTP.c:1151
+#: WWW/Library/Implementation/HTTP.c:1193
+#, c-format
+msgid "Verified connection to %s (subj=%s)"
+msgstr "Verificeret forbindelse til %s (subj=%s)"
+
+#: WWW/Library/Implementation/HTTP.c:1223
+msgid "Can't find common name in certificate"
+msgstr "Kan ikke finde fælles navn i certifikat"
+
+#: WWW/Library/Implementation/HTTP.c:1226
+#, c-format
+msgid "SSL error:host(%s)!=cert(%s)-Continue?"
+msgstr "SSL-fejl:vært(%s)!=cert(%s) - fortsæt?"
+
+#: WWW/Library/Implementation/HTTP.c:1233
+msgid "SSL error"
+msgstr "SSL-fejl"
+
+#: WWW/Library/Implementation/HTTP.c:1241
+#, c-format
+msgid "UNVERIFIED connection to %s (cert=%s)"
+msgstr "UVERIFICERET forbindelse til %s (cert=%s)"
+
+#: WWW/Library/Implementation/HTTP.c:1250
+#, c-format
+msgid "Secure %d-bit %s (%s) HTTP connection"
+msgstr "Sikker %d-bit %s (%s) HTTP-forbindelse"
+
+#: WWW/Library/Implementation/HTTP.c:1718
+msgid "Sending HTTP request."
+msgstr "Sender HTTP-anmodning."
+
+#: WWW/Library/Implementation/HTTP.c:1760
+msgid "Unexpected network write error; connection aborted."
+msgstr "Uventet skrivningsfejl i netværk; forbindelse afbrudt."
+
+#: WWW/Library/Implementation/HTTP.c:1766
+msgid "HTTP request sent; waiting for response."
+msgstr "HTTP-anmodning sendt; venter på svar."
+
+#: WWW/Library/Implementation/HTTP.c:1839
+#: WWW/Library/Implementation/HTTP.c:1849
+msgid "Unexpected network read error; connection aborted."
+msgstr "Uventet læsningsfejl i netværk; forbindelse afbrudt"
+
+#.
+#. * HTTP/1.1 Informational statuses.
+#. * 100 Continue.
+#. * 101 Switching Protocols.
+#. * > 101 is unknown.
+#. * We should never get these, and they have only the status
+#. * line and possibly other headers, so we'll deal with them by
+#. * showing the full header to the user as text/plain. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2051
+msgid "Got unexpected Informational Status."
+msgstr "Modtog uventet \"Informational Status\"."
+
+#.
+#. * Reset Content. The server has fulfilled the request but
+#. * nothing is returned and we should reset any form
+#. * content. We'll instruct the user to do that, and
+#. * restore the current document. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2085
+msgid "Request fulfilled. Reset Content."
+msgstr "Anmodning imødekommet. Nulstil indhold."
+
+#. Not Modified
+#.
+#. * We didn't send an "If-Modified-Since" header, so this
+#. * status is inappropriate. We'll deal with it by showing
+#. * the full header to the user as text/plain. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2202
+msgid "Got unexpected 304 Not Modified status."
+msgstr "Modtog uventet 304 \"Not Modified status\"."
+
+#: WWW/Library/Implementation/HTTP.c:2265
+msgid "Redirection of POST content requires user approval."
+msgstr "Omdirigering af POST-indhold kræver brugers godkendelse."
+
+#: WWW/Library/Implementation/HTTP.c:2280
+msgid "Have POST content. Treating Permanent Redirection as Temporary.\n"
+msgstr "Har POST-indhold. Behandler varig omdirigering som midlertidig.\n"
+
+#: WWW/Library/Implementation/HTTP.c:2326
+msgid "Retrying with access authorization information."
+msgstr "Prøver igen med oplysning om adgangstilladelse."
+
+#: WWW/Library/Implementation/HTTP.c:2338
+msgid "Show the 401 message body?"
+msgstr "Vis indhold af 401-meddelelse?"
+
+#: WWW/Library/Implementation/HTTP.c:2382
+msgid "Show the 407 message body?"
+msgstr "Vis indhold af 407-meddelelse?"
+
+#.
+#. * Bad or unknown server_status number. Take a chance and hope
+#. * there is something to display. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2482
+msgid "Unknown status reply from server!"
+msgstr "Ukendt statussvar fra server!"
+
+#: WWW/Library/Implementation/HTTelnet.c:113
+#, c-format
+msgid "remote %s session:"
+msgstr "fremmed %s session:"
+
+#: WWW/Library/Implementation/HTWAIS.c:163
+msgid "Could not connect to WAIS server."
+msgstr "Kunne ikke skabe forbindelse til WAIS-server."
+
+#: WWW/Library/Implementation/HTWAIS.c:171
+msgid "Could not open WAIS connection for reading."
+msgstr "Kunne ikke åbne WAIS-forbindelse for læsning."
+
+#: WWW/Library/Implementation/HTWAIS.c:193
+msgid "Diagnostic code is "
+msgstr "Diagnosticeringskode er "
+
+#: WWW/Library/Implementation/HTWAIS.c:460
+msgid "Index "
+msgstr "Indeks "
+
+#: WWW/Library/Implementation/HTWAIS.c:464
+#, c-format
+msgid " contains the following %d item%s relevant to \""
+msgstr " indeholder flg. %d enhed%s med relevans for \""
+
+#: WWW/Library/Implementation/HTWAIS.c:472
+msgid "The first figure after each entry is its relative score, "
+msgstr "Det første tal efter hver listning er dens relative score, "
+
+#: WWW/Library/Implementation/HTWAIS.c:473
+msgid "the second is the number of lines in the item."
+msgstr "det andet er antal linjer i enheden."
+
+#: WWW/Library/Implementation/HTWAIS.c:515
+msgid " (bad file name)"
+msgstr " (forkert filnavn)"
+
+#: WWW/Library/Implementation/HTWAIS.c:541
+msgid "(bad doc id)"
+msgstr "(forkert dok-id)"
+
+#: WWW/Library/Implementation/HTWAIS.c:557
+msgid "(Short Header record, can't display)"
+msgstr "(headerlinje for kort, kan ikke vise)"
+
+#: WWW/Library/Implementation/HTWAIS.c:564
+msgid ""
+"\n"
+"Long Header record, can't display\n"
+msgstr ""
+"\n"
+"(headerlinje for lang, kan ikke vise)\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:571
+msgid ""
+"\n"
+"Text record\n"
+msgstr ""
+"\n"
+"Tekstlinje\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:580
+msgid ""
+"\n"
+"Headline record, can't display\n"
+msgstr ""
+"\n"
+"Overskriftslinje, kan ikke vise\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:588
+msgid ""
+"\n"
+"Code record, can't display\n"
+msgstr ""
+"\n"
+"Kodelinje, kan ikke vise\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:692
+msgid "Syntax error in WAIS URL"
+msgstr "Syntaksfejl i WAIS-adresse"
+
+#: WWW/Library/Implementation/HTWAIS.c:764
+msgid " (WAIS Index)"
+msgstr " (WAIS-indeks)"
+
+#: WWW/Library/Implementation/HTWAIS.c:771
+msgid "WAIS Index: "
+msgstr "WAIS-indeks: "
+
+#: WWW/Library/Implementation/HTWAIS.c:777
+msgid "This is a link for searching the "
+msgstr "Dette er et link til søgning i "
+
+#: WWW/Library/Implementation/HTWAIS.c:781
+msgid " WAIS Index.\n"
+msgstr " WAIS-indekset.\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:810
+msgid ""
+"\n"
+"Enter the 's'earch command and then specify search words.\n"
+msgstr ""
+"\n"
+"Indtast 's'øgekommando og anfør så søgeordene.\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:832
+msgid " (in "
+msgstr " (i "
+
+#: WWW/Library/Implementation/HTWAIS.c:841
+msgid "WAIS Search of \""
+msgstr "WAIS-søgning efter \""
+
+#: WWW/Library/Implementation/HTWAIS.c:845
+msgid "\" in: "
+msgstr "\" i: "
+
+#: WWW/Library/Implementation/HTWAIS.c:860
+msgid "HTWAIS: Request too large."
+msgstr "HTWAIS: Forespørgsel for lang."
+
+#: WWW/Library/Implementation/HTWAIS.c:869
+msgid "Searching WAIS database..."
+msgstr "Søger i WAIS-database ..."
+
+#: WWW/Library/Implementation/HTWAIS.c:879
+msgid "Search interrupted."
+msgstr "Søgning afbrudt."
+
+#: WWW/Library/Implementation/HTWAIS.c:930
+msgid "Can't convert format of WAIS document"
+msgstr "Kan ikke omdanne WAIS-dokumentets format"
+
+#: WWW/Library/Implementation/HTWAIS.c:974
+msgid "HTWAIS: Request too long."
+msgstr "HTWAIS: Anmodning for lang."
+
+#.
+#. * Actually do the transaction given by request_message.
+#.
+#: WWW/Library/Implementation/HTWAIS.c:988
+msgid "Fetching WAIS document..."
+msgstr "Henter WAIS-dokument ..."
+
+#. display_search_response(target, retrieval_response,
+#. wais_database, keywords);
+#: WWW/Library/Implementation/HTWAIS.c:1027
+msgid "No text was returned!\n"
+msgstr "Ingen tekst blev returneret!\n"
+
+#: WWW/Library/Implementation/HTWSRC.c:302
+msgid " NOT GIVEN in source file; "
+msgstr " IKKE ANFØRT i kildefil; "
+
+#: WWW/Library/Implementation/HTWSRC.c:325
+msgid " WAIS source file"
+msgstr " WAIS-kildefil"
+
+#: WWW/Library/Implementation/HTWSRC.c:332
+msgid " description"
+msgstr " beskrivelse"
+
+#: WWW/Library/Implementation/HTWSRC.c:342
+msgid "Access links"
+msgstr "Adgangslinks"
+
+#: WWW/Library/Implementation/HTWSRC.c:363
+msgid "Direct access"
+msgstr "Direkte adgang"
+
+#. * Proxy will be used if defined, so let user know that - FM *
+#: WWW/Library/Implementation/HTWSRC.c:366
+msgid " (or via proxy server, if defined)"
+msgstr " (eller via proxy-server, hvis fastsat)"
+
+#: WWW/Library/Implementation/HTWSRC.c:381
+msgid "Maintainer"
+msgstr "Vedligeholder"
+
+#: WWW/Library/Implementation/HTWSRC.c:389
+msgid "Host"
+msgstr "Vært"
+
+#: src/GridText.c:691
+msgid "Memory exhausted, display interrupted!"
+msgstr "Hukommelse opbrugt, fremvisning afbrudt!"
+
+#: src/GridText.c:696
+msgid "Memory exhausted, will interrupt transfer!"
+msgstr "Hukommelse opbrugt, vil afbryde overførsel!"
+
+#: src/GridText.c:3666
+msgid " *** MEMORY EXHAUSTED ***"
+msgstr " *** HUKOMMELSE OPBRUGT ***"
+
+#: src/GridText.c:6144
+msgid "text entry field"
+msgstr "indtast tekst"
+
+#: src/GridText.c:6147
+msgid "password entry field"
+msgstr "indtast adgangskode"
+
+#: src/GridText.c:6150
+msgid "checkbox"
+msgstr "afkrydsningsfelt"
+
+#: src/GridText.c:6153
+msgid "radio button"
+msgstr "radioknap"
+
+#: src/GridText.c:6156
+msgid "submit button"
+msgstr "indsendelsesknap"
+
+#: src/GridText.c:6159
+msgid "reset button"
+msgstr "nulstillingsknap"
+
+#: src/GridText.c:6162
+msgid "script button"
+msgstr "script-knap"
+
+#: src/GridText.c:6165
+msgid "popup menu"
+msgstr "pop up-menu"
+
+#: src/GridText.c:6168
+msgid "hidden form field"
+msgstr "skjult formularfelt"
+
+#: src/GridText.c:6171
+msgid "text entry area"
+msgstr "indtast tekst"
+
+#: src/GridText.c:6174
+msgid "range entry field"
+msgstr "angiv interval"
+
+#: src/GridText.c:6177
+msgid "file entry field"
+msgstr "angiv fil"
+
+#: src/GridText.c:6180
+msgid "text-submit field"
+msgstr "tekstindsendelsesfelt"
+
+#: src/GridText.c:6183
+msgid "image-submit button"
+msgstr "Billedindsendelsesknap"
+
+#: src/GridText.c:6186
+msgid "keygen field"
+msgstr "nøglegen-felt"
+
+#: src/GridText.c:6189
+msgid "unknown form field"
+msgstr "ukendt formularfelt"
+
+#: src/GridText.c:6209 src/GridText.c:6216 src/LYList.c:249
+msgid "unknown field or link"
+msgstr "ukendt felt eller link"
+
+#: src/GridText.c:10633
+msgid "Can't open file for uploading"
+msgstr "Kan ikke åbne fil til upload"
+
+#: src/GridText.c:11821
+#, c-format
+msgid "Submitting %s"
+msgstr "Indsender %s"
+
+#. ugliness has happened; inform user and do the best we can
+#: src/GridText.c:12891
+msgid "Hang Detect: TextAnchor struct corrupted - suggest aborting!"
+msgstr "Program hænger: TextAnchor-struktur ødelagt - det er bedst at afbryde!"
+
+#. don't show previous state
+#: src/GridText.c:13050
+msgid "Wrap lines to fit displayed area?"
+msgstr "Ombryd linjer så de passer til det viste område?"
+
+#: src/GridText.c:13680
+msgid "Very long lines have been truncated!"
+msgstr "Meget lange linjer er blevet afkortet!"
+
+#: src/HTAlert.c:164 src/LYShowInfo.c:386 src/LYShowInfo.c:390
+msgid "bytes"
+msgstr "bytes"
+
+#.
+#. * If we know the total size of the file, we can compute
+#. * a percentage, and show a corresponding progress bar.
+#.
+#: src/HTAlert.c:328 src/HTAlert.c:354
+#, c-format
+msgid "Read %s of data"
+msgstr "Læst %s af data"
+
+#: src/HTAlert.c:351
+#, c-format
+msgid "Read %s of %s of data"
+msgstr "Læst %s af %s af data"
+
+#: src/HTAlert.c:360
+#, c-format
+msgid ", %s/sec"
+msgstr ", %s/sek"
+
+#: src/HTAlert.c:374
+#, c-format
+msgid " (stalled for %s)"
+msgstr " (gået i stå i %s)"
+
+#: src/HTAlert.c:378
+#, c-format
+msgid ", ETA %s"
+msgstr ", ETA %s"
+
+#: src/HTAlert.c:400
+msgid " (Press 'z' to abort)"
+msgstr " (Tast 'z' for at afbryde)"
+
+#. Meta-note: don't move the following note from its place right
+#. in front of the first gettext(). As it is now, it should
+#. automatically appear in generated lynx.pot files. - kw
+#.
+#. NOTE TO TRANSLATORS: If you provide a translation for "yes", lynx
+#. * will take the first byte of the translation as a positive response
+#. * to Yes/No questions. If you provide a translation for "no", lynx
+#. * will take the first byte of the translation as a negative response
+#. * to Yes/No questions. For both, lynx will also try to show the
+#. * first byte in the prompt as a character, instead of (y) or (n),
+#. * respectively. This will not work right for multibyte charsets!
+#. * Don't translate "yes" and "no" for CJK character sets (or translate
+#. * them to "yes" and "no"). For a translation using UTF-8, don't
+#. * translate if the translation would begin with anything but a 7-bit
+#. * (US_ASCII) character. That also means do not translate if the
+#. * translation would begin with anything but a 7-bit character, if
+#. * you use a single-byte character encoding (a charset like ISO-8859-n)
+#. * but anticipate that the message catalog may be used re-encoded in
+#. * UTF-8 form.
+#. * For translations using other character sets, you may also wish to
+#. * leave "yes" and "no" untranslated, if using (y) and (n) is the
+#. * preferred behavior.
+#. * Lynx will also accept y Y n N as responses unless there is a conflict
+#. * with the first letter of the "yes" or "no" translation.
+#.
+#: src/HTAlert.c:438 src/HTAlert.c:486
+msgid "yes"
+msgstr "ja"
+
+#: src/HTAlert.c:441 src/HTAlert.c:487
+msgid "no"
+msgstr "nej"
+
+#.
+#. * Special-purpose workaround for gettext support (we should do
+#. * this in a more general way) -TD
+#. *
+#. * NOTE TO TRANSLATORS: If the prompt has been rendered into
+#. * another language, and if yes/no are distinct, assume the
+#. * translator can make an ordered list in parentheses with one
+#. * capital letter for each as we assumed in HTConfirmDefault().
+#. * The list has to be in the same order as in the original message,
+#. * and the four capital letters chosen to not match those in the
+#. * original unless they have the same position.
+#. *
+#. * Example:
+#. * (Y/N/Always/neVer) - English (original)
+#. * (O/N/Toujours/Jamais) - French
+#.
+#: src/HTAlert.c:938
+msgid "Y/N/A/V"
+msgstr "J/N/A/I"
+
+#: src/HTML.c:5932
+msgid "Description:"
+msgstr "Beskrivelse:"
+
+#: src/HTML.c:5937
+msgid "(none)"
+msgstr "(ingen)"
+
+#: src/HTML.c:5941
+msgid "Filepath:"
+msgstr "Filsti:"
+
+#: src/HTML.c:5947
+msgid "(unknown)"
+msgstr "(ukendt)"
+
+#: src/HTML.c:7387
+msgid "Document has only hidden links. Use the 'l'ist command."
+msgstr "Dokument har kun skjulte links. Brug 'l'istekommandoen."
+
+#: src/HTML.c:7885
+msgid "Source cache error - disk full?"
+msgstr "Cache-fejl - diskplads opbrugt?"
+
+#: src/HTML.c:7898
+msgid "Source cache error - not enough memory!"
+msgstr "Cache-fejl - ikke nok hukommelse!"
+
+#: src/LYBookmark.c:167
+msgid ""
+" This file is an HTML representation of the X Mosaic hotlist file.\n"
+" Outdated or invalid links may be removed by using the\n"
+" remove bookmark command, it is usually the 'R' key but may have\n"
+" been remapped by you or your system administrator."
+msgstr ""
+" Denne fil er en HTML-udgave af X Mosaics bogmærkefil. Gamle eller\n"
+" ugyldige links kan slettes ved brug af kommandoen til at slette\n"
+" et bogmærke, det er normalt 'R'-tasten, men kan have fået en\n"
+" anden tildeling af din systemadministrator."
+
+#: src/LYBookmark.c:378
+#, c-format
+msgid ""
+" You can delete links by the 'R' key<br>\n"
+"<ol>\n"
+msgstr ""
+" Du kan slette links med 'R'-tasten<br>\n"
+"<ol>\n"
+
+#: src/LYBookmark.c:381
+msgid ""
+" You can delete links using the remove bookmark command. It is usually\n"
+" the 'R' key but may have been remapped by you or your system\n"
+" administrator."
+msgstr ""
+" Du kan slette links ved at bruge kommandoen til at slette et\n"
+" bogmærke. Det er normalt 'R'-tasten, men kan have fået en anden\n"
+" tildeling af din systemadministrator"
+
+#: src/LYBookmark.c:385
+msgid ""
+" This file also may be edited with a standard text editor to delete\n"
+" outdated or invalid links, or to change their order."
+msgstr ""
+" Denne fil kan også redigeres med en almindelig teksteditor for at\n"
+" slette gamle eller ugyldige links, eller for at ændre deres\n"
+" rækkefølge."
+
+#: src/LYBookmark.c:388
+msgid ""
+"Note: if you edit this file manually\n"
+" you should not change the format within the lines\n"
+" or add other HTML markup.\n"
+" Make sure any bookmark link is saved as a single line."
+msgstr ""
+"Bemærk: Hvis du redigerer denne fil manuelt,\n"
+" bør du ikke ændre linjeformatet\n"
+" eller tilføje anden HTML-kode.\n"
+" Sørg for at ethvert bogmærke er gemt på en enkelt linje."
+
+#: src/LYBookmark.c:684
+#, c-format
+msgid "File may be recoverable from %s during this session"
+msgstr "Fil kan måske genskabes fra %s under denne session"
+
+#: src/LYCgi.c:161
+#, c-format
+msgid "Do you want to execute \"%s\"?"
+msgstr "Vil du udføre \"%s\"?"
+
+#.
+#. * Neither the path as given nor any components examined by backing up
+#. * were stat()able. - kw
+#.
+#: src/LYCgi.c:276
+msgid "Unable to access cgi script"
+msgstr "Kan ikke få adgang til cgi-program"
+
+#: src/LYCgi.c:709 src/LYCgi.c:712
+msgid "Good Advice"
+msgstr "Godt råd"
+
+#: src/LYCgi.c:716
+msgid "An excellent http server for VMS is available via"
+msgstr "En fortrinlig HTTP-server for VMS kan findes via"
+
+#: src/LYCgi.c:723
+msgid "this link"
+msgstr "dette link"
+
+#: src/LYCgi.c:727
+msgid "It provides state of the art CGI script support.\n"
+msgstr "Den tilbyder upåklagelig understøttelse af CGI-programmer\n"
+
+#: src/LYClean.c:115
+msgid "Exiting via interrupt:"
+msgstr "Afslutter via interrupt:"
+
+#: src/LYCookie.c:2537
+msgid "(from a previous session)"
+msgstr "(fra en foregående session)"
+
+#: src/LYCookie.c:2598
+msgid "Maximum Gobble Date:"
+msgstr "Udløbsdato for cookie:"
+
+#: src/LYCookie.c:2637
+msgid "Internal"
+msgstr "Intern"
+
+#: src/LYCookie.c:2638
+msgid "cookie_domain_flag_set error, aborting program"
+msgstr "'cookie_domain_set_flag'-fejl, afbryder program"
+
+#: src/LYCurses.c:1170
+msgid "Terminal reinitialisation failed - unknown terminal type?"
+msgstr "Ny klargøring af terminal slog fejl - ukendt terminaltype?"
+
+#: src/LYCurses.c:1377
+msgid "Terminal initialisation failed - unknown terminal type?"
+msgstr "Klargøring af terminal slog fejl - ukendt terminaltype?"
+
+#: src/LYCurses.c:1869
+msgid "Terminal ="
+msgstr "Terminal ="
+
+#: src/LYCurses.c:1873
+msgid "You must use a vt100, 200, etc. terminal with this program."
+msgstr "Du skal bruge en vt100, 200, etc. terminal med dette program."
+
+#: src/LYCurses.c:1922
+msgid "Your Terminal type is unknown!"
+msgstr "Din terminaltype er ukendt!"
+
+#: src/LYCurses.c:1923
+msgid "Enter a terminal type:"
+msgstr "Anfør en terminaltype:"
+
+#: src/LYCurses.c:1937
+msgid "TERMINAL TYPE IS SET TO"
+msgstr "TERMINAL-TYPE SAT TIL"
+
+#: src/LYCurses.c:2491
+#, c-format
+msgid ""
+"\n"
+"A Fatal error has occurred in %s Ver. %s\n"
+msgstr ""
+"\n"
+"Der opstod en kritisk fejl i %s Ver. %s\n"
+
+#: src/LYCurses.c:2494
+#, c-format
+msgid ""
+"\n"
+"Please notify your system administrator to confirm a bug, and if\n"
+"confirmed, to notify the lynx-dev list. Bug reports should have concise\n"
+"descriptions of the command and/or URL which causes the problem, the\n"
+"operating system name with version number, the TCPIP implementation, the\n"
+"TRACEBACK if it can be captured, and any other relevant information.\n"
+msgstr ""
+"\n"
+"Underret venligst din systemadministrator for at få bekræftet en\n"
+"programfejl, og hvis den bekræftes, send da også en meddelelse til\n"
+"postlisten lynx-dev. Rapporter om programfejl bør indeholde en koncis\n"
+"beskrivelse af den kommando og/eller adresse som forårsagede problemet,\n"
+"styresystemets navn og versionsnummer, TCP/IP-implementeringen, en\n"
+"sporingslog (trace) hvis en sådan kan laves, samt enhver anden relevant\n"
+"information.\n"
+
+#: src/LYEdit.c:272
+#, c-format
+msgid "Error starting editor, %s"
+msgstr "Der opstod en fejl ved opstart af redigeringsprogrammet, %s"
+
+#: src/LYEdit.c:275
+msgid "Editor killed by signal"
+msgstr "Editor dræbt ved signal"
+
+#: src/LYEdit.c:280
+#, c-format
+msgid "Editor returned with error status %s"
+msgstr "Redigeringsprogrammet returnerede fejlstatus %s"
+
+#: src/LYDownload.c:509
+msgid "Downloaded link:"
+msgstr "Hentet link:"
+
+#: src/LYDownload.c:514
+msgid "Suggested file name:"
+msgstr "Foreslået filnavn:"
+
+#: src/LYDownload.c:519
+msgid "Standard download options:"
+msgstr "Gængse valgmuligheder ved hjemtagning af filer:"
+
+#: src/LYDownload.c:520
+msgid "Download options:"
+msgstr "Valgmuligheder ved download af filer:"
+
+#: src/LYDownload.c:536
+msgid "Save to disk"
+msgstr "Gem på disk"
+
+#: src/LYDownload.c:550
+msgid "View temporary file"
+msgstr "Vis midlertidig file"
+
+#: src/LYDownload.c:557
+msgid "Save to disk disabled."
+msgstr "Gem på disk deaktiveret."
+
+#: src/LYDownload.c:561 src/LYPrint.c:1330
+msgid "Local additions:"
+msgstr "Egne tilføjelser:"
+
+#: src/LYDownload.c:572 src/LYUpload.c:206
+msgid "No Name Given"
+msgstr "Intet navn givet"
+
+#: src/LYHistory.c:676
+msgid "You selected:"
+msgstr "Du valgte:"
+
+#: src/LYHistory.c:700 src/LYHistory.c:929
+msgid "(no address)"
+msgstr "(ingen adresse)"
+
+#: src/LYHistory.c:704
+msgid " (internal)"
+msgstr " (intern)"
+
+#: src/LYHistory.c:706
+msgid " (was internal)"
+msgstr " (var intern)"
+
+#: src/LYHistory.c:804
+msgid " (From History)"
+msgstr " (Fra historik)"
+
+#: src/LYHistory.c:849
+msgid "You visited (POSTs, bookmark, menu and list files excluded):"
+msgstr "Du har besøgt: ('POSTs', bogmærke-, menu- og listefiler undtaget)"
+
+#: src/LYHistory.c:1151
+msgid "(No messages yet)"
+msgstr "(Ingen meddelelser endnu)"
+
+#: src/LYLeaks.c:222
+msgid "Invalid pointer detected."
+msgstr "Ugyldig peger opdaget."
+
+#: src/LYLeaks.c:224 src/LYLeaks.c:262
+msgid "Sequence:"
+msgstr "Sekvens:"
+
+#: src/LYLeaks.c:227 src/LYLeaks.c:265
+msgid "Pointer:"
+msgstr "Peger:"
+
+#: src/LYLeaks.c:236 src/LYLeaks.c:243 src/LYLeaks.c:284
+msgid "FileName:"
+msgstr "FilNavn:"
+
+#: src/LYLeaks.c:239 src/LYLeaks.c:246 src/LYLeaks.c:287 src/LYLeaks.c:298
+msgid "LineCount:"
+msgstr "LinjeAntal:"
+
+#: src/LYLeaks.c:260
+msgid "Memory leak detected."
+msgstr "Hukommelseslæk opdaget."
+
+#: src/LYLeaks.c:268
+msgid "Contains:"
+msgstr "Indeholder:"
+
+#: src/LYLeaks.c:281
+msgid "ByteSize:"
+msgstr "ByteStr.:"
+
+#: src/LYLeaks.c:295
+msgid "realloced:"
+msgstr "gentildelt:"
+
+#: src/LYLeaks.c:316
+msgid "Total memory leakage this run:"
+msgstr "Total hukommelsesudsivning denne gang:"
+
+#: src/LYLeaks.c:320
+msgid "Peak allocation"
+msgstr "Tildeling ved spidsbelastning"
+
+#: src/LYLeaks.c:322
+msgid "Bytes allocated"
+msgstr "Antal tildelte byte"
+
+#: src/LYLeaks.c:324
+msgid "Total mallocs"
+msgstr "Totalt antal \"mallocs\""
+
+#: src/LYLeaks.c:326
+msgid "Total frees"
+msgstr "Totalt antal \"frees\""
+
+#: src/LYList.c:89
+msgid "References in "
+msgstr "Henvisninger i "
+
+#: src/LYList.c:92
+msgid "this document:"
+msgstr "dette dokument:"
+
+#: src/LYList.c:98
+msgid "Visible links:"
+msgstr "Synlige links:"
+
+#: src/LYList.c:202 src/LYList.c:321
+msgid "Hidden links:"
+msgstr "Skjulte links:"
+
+#: src/LYList.c:358
+msgid "References"
+msgstr "Henvisninger"
+
+#: src/LYList.c:362
+msgid "Visible links"
+msgstr "Synlige links"
+
+#: src/LYLocal.c:289
+#, c-format
+msgid "Unable to get status of '%s'."
+msgstr "Kan ikke indhente status på '%s'."
+
+#: src/LYLocal.c:354
+msgid "The selected item is not a file or a directory! Request ignored."
+msgstr "Valgte enhed er ikke en fil eller et filkatalog! Anmodning ignoreret."
+
+#: src/LYLocal.c:456
+#, c-format
+msgid "Unable to %s due to system error!"
+msgstr "Kan ikke %s pga. systemfejl!"
+
+#: src/LYLocal.c:490
+#, c-format
+msgid "Probable failure to %s due to system error!"
+msgstr "Sandsynlig fejl for %s skyldes en systemfejl!"
+
+#: src/LYLocal.c:555 src/LYLocal.c:578
+#, c-format
+msgid "remove %s"
+msgstr "slet %s"
+
+#: src/LYLocal.c:598
+#, c-format
+msgid "touch %s"
+msgstr "opret %s"
+
+#: src/LYLocal.c:628
+#, c-format
+msgid "move %s to %s"
+msgstr "flyt %s til %s"
+
+#: src/LYLocal.c:676
+msgid "There is already a directory with that name! Request ignored."
+msgstr "Der er allerede et filkatalog med dette navn! Anmodning ignoreret."
+
+#: src/LYLocal.c:678
+msgid "There is already a file with that name! Request ignored."
+msgstr "Der er allerede en fil med dette navn! Anmodning ignoreret."
+
+#: src/LYLocal.c:680
+msgid "The specified name is already in use! Request ignored."
+msgstr "Det anførte navn er allerede i brug! Anmodning ignoreret."
+
+#: src/LYLocal.c:692
+msgid "Destination has different owner! Request denied."
+msgstr "Mål har en anden ejer! Nægtet."
+
+#: src/LYLocal.c:695
+msgid "Destination is not a valid directory! Request denied."
+msgstr "Mål er ikke et gyldigt filkatalog! Nægtet."
+
+#: src/LYLocal.c:711
+msgid "Source and destination are the same location! Request ignored!"
+msgstr "Samme placering af kilde og mål! Anmodning ignoreret!"
+
+#: src/LYLocal.c:735
+msgid "Remove all tagged files and directories?"
+msgstr "Slet alle markerede filer og filkataloger?"
+
+#: src/LYLocal.c:808
+msgid "Enter new location for tagged items: "
+msgstr "Angiv en ny placering for de markerede filer: "
+
+#: src/LYLocal.c:906
+msgid "Enter new name for directory: "
+msgstr "Indtast nyt navn på filkatalog: "
+
+#: src/LYLocal.c:908
+msgid "Enter new name for file: "
+msgstr "Indtast et nyt navn på fil: "
+
+#: src/LYLocal.c:920
+msgid "Illegal character (path-separator) found! Request ignored."
+msgstr "Ugyldigt tegn (sti-separator) fundet! Anmodning ignoreret."
+
+#: src/LYLocal.c:970
+msgid "Enter new location for directory: "
+msgstr "Anfør ny placering af filkatalog: "
+
+#: src/LYLocal.c:972
+msgid "Enter new location for file: "
+msgstr "Anfør ny placering af fil: "
+
+#: src/LYLocal.c:999
+msgid "Unexpected failure - unable to find trailing path separator"
+msgstr "Uventet fejl - kan ikke finde afsluttende sti-separator"
+
+#: src/LYLocal.c:1061
+msgid "Modify name, location, or permission (n, l, or p): "
+msgstr "Ret n=navn, l=placering eller p=rettighed: "
+
+#: src/LYLocal.c:1063
+msgid "Modify name or location (n or l): "
+msgstr "Ret n=navn eller l=placering: "
+
+#.
+#. * Code for changing ownership needed here.
+#.
+#: src/LYLocal.c:1092
+msgid "This feature not yet implemented!"
+msgstr "Denne programfunktion er endnu ikke indarbejdet!"
+
+#: src/LYLocal.c:1113
+msgid "Enter name of file to create: "
+msgstr "Anfør navn på den fil som skal oprettes: "
+
+#: src/LYLocal.c:1116 src/LYLocal.c:1153
+msgid "Illegal redirection \"//\" found! Request ignored."
+msgstr "Ugyldig omdirigering \"//\" opdaget! Anmodning ignoreret."
+
+#: src/LYLocal.c:1150
+msgid "Enter name for new directory: "
+msgstr "Anfør navn på nyt filkatalog: "
+
+#: src/LYLocal.c:1191
+msgid "Create file or directory (f or d): "
+msgstr "Opret f=fil eller d=filkatalog: "
+
+#: src/LYLocal.c:1233
+#, c-format
+msgid "Remove directory '%s'?"
+msgstr "Slet filkatalog '%s'?"
+
+#: src/LYLocal.c:1236
+msgid "Remove directory?"
+msgstr "Slet filkatalog?"
+
+#: src/LYLocal.c:1241
+#, c-format
+msgid "Remove file '%s'?"
+msgstr "Slet fil '%s'?"
+
+#: src/LYLocal.c:1243
+msgid "Remove file?"
+msgstr "Slet fil?"
+
+#: src/LYLocal.c:1248
+#, c-format
+msgid "Remove symbolic link '%s'?"
+msgstr "Slet symbolsk link '%s'?"
+
+#: src/LYLocal.c:1250
+msgid "Remove symbolic link?"
+msgstr "Slet symbolsk link"
+
+#: src/LYLocal.c:1348
+msgid "Sorry, don't know how to permit non-UNIX files yet."
+msgstr "Beklager, kun UNIX-filer kan gives rettigheder indtil videre."
+
+#: src/LYLocal.c:1377
+msgid "Unable to open permit options file"
+msgstr "Ude af stand til at åbne fil med rettighedstilvalg."
+
+#: src/LYLocal.c:1405
+msgid "Specify permissions below:"
+msgstr "Anfør rettigheder nedenfor:"
+
+#: src/LYLocal.c:1406 src/LYShowInfo.c:287
+msgid "Owner:"
+msgstr "Ejer:"
+
+#: src/LYLocal.c:1422
+msgid "Group"
+msgstr "Gruppe"
+
+#: src/LYLocal.c:1438
+msgid "Others:"
+msgstr "Andre:"
+
+#: src/LYLocal.c:1456
+msgid "form to permit"
+msgstr "formular som skal tillades"
+
+#: src/LYLocal.c:1552
+msgid "Invalid mode format."
+msgstr "Ugyldigt tilstandsformat."
+
+#: src/LYLocal.c:1556
+msgid "Invalid syntax format."
+msgstr "Ugyldigt syntaksformat."
+
+#: src/LYLocal.c:1743
+msgid "Warning! UUDecoded file will exist in the directory you started Lynx."
+msgstr "Advarsel! UUDecodet fil lægges i filkatalog hvor du startede Lynx."
+
+#: src/LYLocal.c:1933
+msgid "NULL URL pointer"
+msgstr "NULL adressepeger"
+
+#: src/LYLocal.c:2015
+#, c-format
+msgid "Executing %s "
+msgstr "Udfører %s "
+
+#: src/LYLocal.c:2018
+msgid "Executing system command. This might take a while."
+msgstr "Udfører systemkommando. Dette kan tage et øjeblik."
+
+#: src/LYLocal.c:2092
+msgid "Current directory:"
+msgstr "Aktuelle filkatalog:"
+
+#: src/LYLocal.c:2095 src/LYLocal.c:2113
+msgid "Current selection:"
+msgstr "Aktuelle udvalg:"
+
+#: src/LYLocal.c:2099
+msgid "Nothing currently selected."
+msgstr "Intet er aktuelt udvalgt."
+
+#: src/LYLocal.c:2115
+msgid "tagged item:"
+msgstr "markeret enhed:"
+
+#: src/LYLocal.c:2116
+msgid "tagged items:"
+msgstr "markerede enheder:"
+
+#: src/LYLocal.c:2216 src/LYLocal.c:2225
+msgid "Illegal filename; request ignored."
+msgstr "Ugyldigt filnavn: anmodning ignoreret."
+
+#. directory not writable
+#: src/LYLocal.c:2323 src/LYLocal.c:2382
+msgid "Install in the selected directory not permitted."
+msgstr "Installering i det valgte filkatalog er ikke tilladt."
+
+#: src/LYLocal.c:2378
+msgid "The selected item is not a directory! Request ignored."
+msgstr "Den markerede enhed er ikke et filkatalog! Anmodning ignoreret."
+
+#: src/LYLocal.c:2387
+msgid "Just a moment, ..."
+msgstr "Vent et øjeblik, ..."
+
+#: src/LYLocal.c:2404
+msgid "Error building install args"
+msgstr "Kunne ikke danne installeringsparametre"
+
+#: src/LYLocal.c:2419 src/LYLocal.c:2450
+#, c-format
+msgid "Source and target are the same: %s"
+msgstr "Kilde og mål er det samme: %s"
+
+#: src/LYLocal.c:2426 src/LYLocal.c:2457
+#, c-format
+msgid "Already in target directory: %s"
+msgstr "Står allerede i målkataloget: %s"
+
+#: src/LYLocal.c:2475
+msgid "Installation complete"
+msgstr "Installering fuldført"
+
+#: src/LYLocal.c:2678
+msgid "Temporary URL or list would be too long."
+msgstr "Midlertidig adresse eller listen ville blive for lang."
+
+#: src/LYMail.c:566
+msgid "Sending"
+msgstr "Sender"
+
+#: src/LYMail.c:1050
+#, c-format
+msgid "The link %s :?: %s \n"
+msgstr "Linket %s :?: %s \n"
+
+#: src/LYMail.c:1052
+#, c-format
+msgid "called \"%s\"\n"
+msgstr "ved navn \"%s\"\n"
+
+#: src/LYMail.c:1053
+#, c-format
+msgid "in the file \"%s\" called \"%s\"\n"
+msgstr "i filen \"%s\" ved navn \"%s\"\n"
+
+#: src/LYMail.c:1054
+msgid "was requested but was not available."
+msgstr "blev der anmodet om, men den var ikke tilgængelig."
+
+#: src/LYMail.c:1055
+msgid "Thought you might want to know."
+msgstr "Du ville sikkert gerne vide dette."
+
+#: src/LYMail.c:1057
+msgid "This message was automatically generated by"
+msgstr "Denne meddelelse blev automatisk lavet af"
+
+#: src/LYMail.c:1770
+msgid "No system mailer configured"
+msgstr "Systemets postprogram er ikke sat op"
+
+#: src/LYMain.c:1074
+msgid "No Winsock found, sorry."
+msgstr "Ingen \"Winsock\" fundet, beklager."
+
+#: src/LYMain.c:1265
+msgid "You MUST define a valid TMP or TEMP area!"
+msgstr "Du SKAL definere et gyldigt TMP- eller TEMP-område!"
+
+#: src/LYMain.c:1318 src/LYMainLoop.c:5284
+msgid "No such directory"
+msgstr "Intet sådant filkatalog"
+
+#: src/LYMain.c:1512
+#, c-format
+msgid ""
+"\n"
+"Configuration file \"%s\" is not available.\n"
+"\n"
+msgstr ""
+"\n"
+"Opsætningsfil \"%s\" er ikke tilgængelig.\n"
+"\n"
+
+#: src/LYMain.c:1522
+#, c-format
+msgid ""
+"\n"
+"Lynx character sets not declared.\n"
+"\n"
+msgstr ""
+"\n"
+"Lynx' tegnsæt er ikke angivet.\n"
+"\n"
+
+#: src/LYMain.c:1678
+#, c-format
+msgid "Ignored %d characters from standard input.\n"
+msgstr "Ignorerede %d tegn fra standardind.\n"
+
+#: src/LYMain.c:1680
+#, c-format
+msgid "Use \"-stdin\" or \"-\" to tell how to handle piped input.\n"
+msgstr "Brug \"-stdin\" eller \"-\" til at fortælle hvordan inddata i datakanal skal håndteres.\n"
+
+#: src/LYMain.c:1838
+msgid "Warning:"
+msgstr "Advarsel:"
+
+#: src/LYMain.c:2408
+msgid "persistent cookies state will be changed in next session only."
+msgstr "Ændring for varige cookier vil kun gælde næste session."
+
+#: src/LYMain.c:2645 src/LYMain.c:2690
+#, c-format
+msgid "Lynx: ignoring unrecognized charset=%s\n"
+msgstr "Lynx: Ignorerer ukendt tegnsæt=%s\n"
+
+#: src/LYMain.c:3209
+#, c-format
+msgid "%s Version %s (%s)"
+msgstr "%s Version %s (%s)"
+
+# Vi ved ikke om det er dato, platform eller begge dele. Gerne "Bygget: %s%s"
+#: src/LYMain.c:3250
+#, c-format
+msgid "Built on %s%s.\n"
+msgstr "Bygget: %s%s.\n"
+
+#: src/LYMain.c:3264
+msgid "Copyrights held by the Lynx Developers Group,"
+msgstr "Ophavsret ejet af Lynx Developers Group,"
+
+#: src/LYMain.c:3265
+msgid "the University of Kansas, CERN, and other contributors."
+msgstr "Kansas' Universitet, CERN og andre bidragydere."
+
+#: src/LYMain.c:3266
+msgid "Distributed under the GNU General Public License (Version 2)."
+msgstr "Distribueret under GNU General Public License (version 2)."
+
+#: src/LYMain.c:3267
+msgid "See http://lynx.invisible-island.net/ and the online help for more information."
+msgstr "Se http://lynx.invisible-island.net/ og online-hjælpen for flere oplysninger."
+
+#: src/LYMain.c:4118
+#, c-format
+msgid "USAGE: %s [options] [file]\n"
+msgstr "BRUG: %s [valgmuligheder] [fil]\n"
+
+#: src/LYMain.c:4119
+#, c-format
+msgid "Options are:\n"
+msgstr "Valgmuligheder er:\n"
+
+#: src/LYMain.c:4422
+#, c-format
+msgid "%s: Invalid Option: %s\n"
+msgstr "%s: Ugyldig indstilling: %s\n"
+
+#: src/LYMainLoop.c:572
+#, c-format
+msgid "Internal error: Invalid mouse link %d!"
+msgstr "Intern fejl: Ugyldigt muselink %d!"
+
+#: src/LYMainLoop.c:693 src/LYMainLoop.c:5306
+msgid "A URL specified by the user"
+msgstr "En adresse angivet af brugeren"
+
+#: src/LYMainLoop.c:1142
+msgid "Enctype multipart/form-data not yet supported! Cannot submit."
+msgstr "Kodningstype \"multipart/form-data\" ej understøttet! Kan ikke indsende."
+
+#.
+#. * Make a name for this help file.
+#.
+#: src/LYMainLoop.c:3196
+msgid "Help Screen"
+msgstr "Hjælpeskærm"
+
+#: src/LYMainLoop.c:3327
+msgid "System Index"
+msgstr "Systemfortegnelse"
+
+#: src/LYMainLoop.c:3576
+#, c-format
+msgid "Query parameter %d: "
+msgstr "Forespørgselsparameter %d:"
+
+#: src/LYMainLoop.c:3805 src/LYMainLoop.c:5582
+msgid "Entry into main screen"
+msgstr "Indgang til hovedskærm"
+
+#: src/LYMainLoop.c:4063
+msgid "No next document present"
+msgstr "Ingen yderligere dokumenter"
+
+#: src/LYMainLoop.c:4358
+msgid "charset for this document specified explicitly, sorry..."
+msgstr "dette dokuments tegnsæt er udtrykkeligt angivet, beklager ..."
+
+#: src/LYMainLoop.c:5264
+msgid "cd to:"
+msgstr "cd til: "
+
+#: src/LYMainLoop.c:5287
+msgid "A component of path is not a directory"
+msgstr "En del af stien er ikke et filkatalog"
+
+#: src/LYMainLoop.c:5290
+msgid "failed to change directory"
+msgstr "kunne ikke skifte filkatalog."
+
+#: src/LYMainLoop.c:6516
+msgid "Reparsing document under current settings..."
+msgstr "Genfortolker dokument under nuværende indstillinger ..."
+
+#: src/LYMainLoop.c:6810
+#, c-format
+msgid "Fatal error - could not open output file %s\n"
+msgstr "Kritisk fejl - kunne ikke åbne uddatafil %s\n"
+
+#: src/LYMainLoop.c:7152
+msgid "TABLE center enable."
+msgstr "TABEL-centrering slået til."
+
+#: src/LYMainLoop.c:7155
+msgid "TABLE center disable."
+msgstr "TABEL-centrering slået fra."
+
+#: src/LYMainLoop.c:7235
+msgid "Current URL is empty."
+msgstr "Aktuelle adresse er tom."
+
+#: src/LYMainLoop.c:7237 src/LYUtils.c:1915
+msgid "Copy to clipboard failed."
+msgstr "Kopiering til klippebord slog fejl."
+
+#: src/LYMainLoop.c:7239
+msgid "Document URL put to clipboard."
+msgstr "Dokumentets adresse overført til klippebord."
+
+#: src/LYMainLoop.c:7241
+msgid "Link URL put to clipboard."
+msgstr "Linkets adresse overført til klippebord."
+
+#: src/LYMainLoop.c:7268
+msgid "No URL in the clipboard."
+msgstr "Ingen adresse ligger på klippebord."
+
+#: src/LYMainLoop.c:7961 src/LYMainLoop.c:8132
+msgid "-index-"
+msgstr "-indeks-"
+
+#: src/LYMainLoop.c:8070
+msgid "lynx: Can't access startfile"
+msgstr "lynx: Kan ikke få adgang til startfil"
+
+#: src/LYMainLoop.c:8082
+msgid "lynx: Start file could not be found or is not text/html or text/plain"
+msgstr "lynx: startfil fandtes ikke eller er ikke i text/html, text/plain format"
+
+#: src/LYMainLoop.c:8083
+msgid " Exiting..."
+msgstr " Afslutter ..."
+
+#: src/LYMainLoop.c:8126
+msgid "-more-"
+msgstr "-mere-"
+
+#. Enable scrolling.
+#: src/LYNews.c:186
+msgid "You will be posting to:"
+msgstr "Du vil sende til:"
+
+#.
+#. * Get the mail address for the From header, offering personal_mail_address
+#. * as default.
+#.
+#: src/LYNews.c:195
+msgid ""
+"\n"
+"\n"
+" Please provide your mail address for the From: header\n"
+msgstr ""
+"\n"
+"\n"
+" Angiv venligst afsenderadresse\n"
+
+#.
+#. * Get the Subject header, offering the current document's title as the
+#. * default if this is a followup rather than a new post. - FM
+#.
+#: src/LYNews.c:212
+msgid ""
+"\n"
+"\n"
+" Please provide or edit the Subject: header\n"
+msgstr ""
+"\n"
+"\n"
+" Indtast eller ret venligst emnelinjen\n"
+
+#: src/LYNews.c:302
+msgid ""
+"\n"
+"\n"
+" Please provide or edit the Organization: header\n"
+msgstr ""
+"\n"
+"\n"
+"Indtast eller ret venligst Organization:-linjen\n"
+
+#.
+#. * Use the built in line editior.
+#.
+#: src/LYNews.c:359
+msgid ""
+"\n"
+"\n"
+" Please enter your message below."
+msgstr ""
+"\n"
+"\n"
+" Skriv dit indlæg nedenfor."
+
+#: src/LYNews.c:405
+msgid "Message has no original text!"
+msgstr "Indlæg har ingen oprindelig tekst!"
+
+#: src/LYOptions.c:774
+msgid "review/edit B)ookmarks files"
+msgstr "gennemse/rediger B)ogmærkefiler"
+
+#: src/LYOptions.c:776
+msgid "B)ookmark file: "
+msgstr "B)ogmærkefil: "
+
+#: src/LYOptions.c:2127 src/LYOptions.c:2134
+msgid "ON"
+msgstr "SLÃ…ET TIL"
+
+#. verbose_img variable
+#. LYCollapseBRs variable
+#. LYtrimBlankLines variable
+#: src/LYOptions.c:2128 src/LYOptions.c:2133 src/LYOptions.c:2306
+#: src/LYOptions.c:2315 src/LYOptions.c:2324 src/LYOptions.c:2335
+msgid "OFF"
+msgstr "SLÃ…ET FRA"
+
+#: src/LYOptions.c:2129
+msgid "NEVER"
+msgstr "ALDRIG"
+
+#: src/LYOptions.c:2130
+msgid "ALWAYS"
+msgstr "ALTID"
+
+#: src/LYOptions.c:2146 src/LYOptions.c:2298
+msgid "ignore"
+msgstr "ignorér"
+
+#: src/LYOptions.c:2147
+msgid "ask user"
+msgstr "spørg bruger"
+
+#: src/LYOptions.c:2148
+msgid "accept all"
+msgstr "godtag alle"
+
+#: src/LYOptions.c:2160
+msgid "ALWAYS OFF"
+msgstr "ALTID SLÃ…ET FRA"
+
+#: src/LYOptions.c:2161
+msgid "FOR LOCAL FILES ONLY"
+msgstr "KUN FOR LOKALE FILER"
+
+#: src/LYOptions.c:2163
+msgid "ALWAYS ON"
+msgstr "ALTID SLÃ…ET TIL"
+
+#: src/LYOptions.c:2175
+msgid "Numbers act as arrows"
+msgstr "Pile på numerisk tastatur aktive"
+
+#: src/LYOptions.c:2177
+msgid "Links are numbered"
+msgstr "Links er nummererede"
+
+#: src/LYOptions.c:2180
+msgid "Links and form fields are numbered"
+msgstr "Links og formularfelter er nummererede"
+
+#: src/LYOptions.c:2183
+msgid "Form fields are numbered"
+msgstr "Formularfelter er nummererede"
+
+#: src/LYOptions.c:2198
+msgid "Case insensitive"
+msgstr "Ikke versalfølsom"
+
+#: src/LYOptions.c:2199
+msgid "Case sensitive"
+msgstr "Versalfølsom"
+
+#: src/LYOptions.c:2233
+msgid "prompt normally"
+msgstr "normal prompt"
+
+#: src/LYOptions.c:2234
+msgid "force yes-response"
+msgstr "gennemtving bekræftende svar"
+
+#: src/LYOptions.c:2235
+msgid "force no-response"
+msgstr "gennemtving benægtende svar"
+
+#: src/LYOptions.c:2253
+msgid "Novice"
+msgstr "Begynder"
+
+#: src/LYOptions.c:2254
+msgid "Intermediate"
+msgstr "Videregående"
+
+#: src/LYOptions.c:2255
+msgid "Advanced"
+msgstr "Avanceret"
+
+#: src/LYOptions.c:2264
+msgid "By First Visit"
+msgstr "Ved første besøg"
+
+#: src/LYOptions.c:2266
+msgid "By First Visit Reversed"
+msgstr "Ved første besøg, i omvendt orden"
+
+#: src/LYOptions.c:2267
+msgid "As Visit Tree"
+msgstr "Som træstruktur over besøg"
+
+#: src/LYOptions.c:2268
+msgid "By Last Visit"
+msgstr "Efter sidste besøg"
+
+#: src/LYOptions.c:2270
+msgid "By Last Visit Reversed"
+msgstr "Efter sidste besøg, i omvendt orden"
+
+#. Old_DTD variable
+#: src/LYOptions.c:2281
+msgid "relaxed (TagSoup mode)"
+msgstr "afslappet (TagSoup-tilstand)"
+
+#: src/LYOptions.c:2282
+msgid "strict (SortaSGML mode)"
+msgstr "striks (SortaSGML-tilstand)"
+
+#: src/LYOptions.c:2289
+msgid "Ignore"
+msgstr "Ignorér"
+
+#: src/LYOptions.c:2290
+msgid "Add to trace-file"
+msgstr "Tilføj til sporingsfil"
+
+#: src/LYOptions.c:2291
+msgid "Add to LYNXMESSAGES"
+msgstr "Tilføj til LYNXMESSAGES"
+
+#: src/LYOptions.c:2292
+msgid "Warn, point to trace-file"
+msgstr "Advar, peg på sporingsfil"
+
+#: src/LYOptions.c:2299
+msgid "as labels"
+msgstr "som etiketter"
+
+#: src/LYOptions.c:2300
+msgid "as links"
+msgstr "som links"
+
+#: src/LYOptions.c:2307
+msgid "show filename"
+msgstr "vis filnavn"
+
+#: src/LYOptions.c:2316
+msgid "collapse"
+msgstr "saml"
+
+#: src/LYOptions.c:2325
+msgid "trim-lines"
+msgstr "trim-linjer"
+
+#: src/LYOptions.c:2336
+msgid "STANDARD"
+msgstr "STANDARD"
+
+#: src/LYOptions.c:2337
+msgid "ADVANCED"
+msgstr "AVANCERET"
+
+#: src/LYOptions.c:2371
+msgid "Directories first"
+msgstr "Filkataloger først"
+
+#: src/LYOptions.c:2372
+msgid "Files first"
+msgstr "Filer først"
+
+#: src/LYOptions.c:2373
+msgid "Mixed style"
+msgstr "Blandet stil"
+
+#: src/LYOptions.c:2381 src/LYOptions.c:2401
+msgid "By Name"
+msgstr "Efter navn"
+
+#: src/LYOptions.c:2382 src/LYOptions.c:2402
+msgid "By Type"
+msgstr "Efter type"
+
+#: src/LYOptions.c:2383 src/LYOptions.c:2403
+msgid "By Size"
+msgstr "Efter størrelse"
+
+#: src/LYOptions.c:2384 src/LYOptions.c:2404
+msgid "By Date"
+msgstr "Efter dato"
+
+#: src/LYOptions.c:2385
+msgid "By Mode"
+msgstr "Efter tilstand"
+
+#: src/LYOptions.c:2387
+msgid "By User"
+msgstr "Efter bruger"
+
+#: src/LYOptions.c:2388
+msgid "By Group"
+msgstr "Efter gruppe"
+
+#: src/LYOptions.c:2413
+msgid "Do not show rate"
+msgstr "Vis ikke overførselshastighed"
+
+#: src/LYOptions.c:2414 src/LYOptions.c:2415
+#, c-format
+msgid "Show %s/sec rate"
+msgstr "Vis hastighed i %s/sek "
+
+#: src/LYOptions.c:2417 src/LYOptions.c:2418
+#, c-format
+msgid "Show %s/sec, ETA"
+msgstr "Vis %s/sek, ETA"
+
+#: src/LYOptions.c:2419 src/LYOptions.c:2420
+#, c-format
+msgid "Show %s/sec (2-digits), ETA"
+msgstr "Vis %s/sek (2-cifre), EAT"
+
+#: src/LYOptions.c:2423
+msgid "Show progressbar"
+msgstr "Vis statusbjælke"
+
+# types = mime-types
+#: src/LYOptions.c:2435
+msgid "Accept lynx's internal types"
+msgstr "Godtag Lynx' indbyggede MIME-typer"
+
+#: src/LYOptions.c:2436
+msgid "Also accept lynx.cfg's types"
+msgstr "Godtag også MIME-typer i lynx.cfg"
+
+#: src/LYOptions.c:2437
+msgid "Also accept user's types"
+msgstr "Godtag også brugerens MIME-typer"
+
+#: src/LYOptions.c:2438
+msgid "Also accept system's types"
+msgstr "Godtag også systemets MIME-typer"
+
+#: src/LYOptions.c:2439
+msgid "Accept all types"
+msgstr "Godtag alle MIME-typer"
+
+#: src/LYOptions.c:2448
+msgid "gzip"
+msgstr "gzip"
+
+#: src/LYOptions.c:2449
+msgid "deflate"
+msgstr "deflate"
+
+#: src/LYOptions.c:2452
+msgid "compress"
+msgstr "compress"
+
+#: src/LYOptions.c:2455
+msgid "bzip2"
+msgstr "bzip2"
+
+#: src/LYOptions.c:2457
+msgid "All"
+msgstr "Alle"
+
+#: src/LYOptions.c:2467
+msgid "HTTP 1.0"
+msgstr "HTTP 1.0"
+
+#: src/LYOptions.c:2468
+msgid "HTTP 1.1"
+msgstr "HTTP 1.1"
+
+#: src/LYOptions.c:2827 src/LYOptions.c:2856
+#, c-format
+msgid "Use %s to invoke the Options menu!"
+msgstr "Brug %s for at aktivere menu over valgmuligheder!"
+
+#: src/LYOptions.c:3739
+msgid "(options marked with (!) will not be saved)"
+msgstr "(indstillinger markeret med (!) vil ikke blive gemt)"
+
+#: src/LYOptions.c:3747
+msgid "General Preferences"
+msgstr "Generelle indstillinger"
+
+#. ***************************************************************
+#. User Mode: SELECT
+#: src/LYOptions.c:3751
+msgid "User mode"
+msgstr "Brugertilstand"
+
+#. Editor: INPUT
+#: src/LYOptions.c:3757
+msgid "Editor"
+msgstr "Editor"
+
+#. Search Type: SELECT
+#: src/LYOptions.c:3762
+msgid "Type of Search"
+msgstr "Søgningstype"
+
+#: src/LYOptions.c:3767
+msgid "Security and Privacy"
+msgstr "Sikkerhed og beskyttelse af persondata"
+
+#. ***************************************************************
+#. Cookies: SELECT
+#: src/LYOptions.c:3771
+msgid "Cookies"
+msgstr "Cookier"
+
+#. Cookie Prompting: SELECT
+#: src/LYOptions.c:3785
+msgid "Invalid-Cookie Prompting"
+msgstr "Prompt ved ugyldig cookie"
+
+#. SSL Prompting: SELECT
+#: src/LYOptions.c:3792
+msgid "SSL Prompting"
+msgstr "Prompt ved SSL"
+
+#: src/LYOptions.c:3797
+msgid "SSL client certificate file"
+msgstr "SSL-klientcertifikatfil"
+
+#: src/LYOptions.c:3801
+msgid "SSL client key file"
+msgstr "SSL-klientnøglefil"
+
+#: src/LYOptions.c:3807
+msgid "Keyboard Input"
+msgstr "Tastatur-inddata"
+
+#. ***************************************************************
+#. Keypad Mode: SELECT
+#: src/LYOptions.c:3811
+msgid "Keypad mode"
+msgstr "Numerisk tastaturtilstand"
+
+#. Emacs keys: ON/OFF
+#: src/LYOptions.c:3817
+msgid "Emacs keys"
+msgstr "Emacs-taster"
+
+#. VI Keys: ON/OFF
+#: src/LYOptions.c:3823
+msgid "VI keys"
+msgstr "VI-taster"
+
+#. Line edit style: SELECT
+#. well, at least 2 line edit styles available
+#: src/LYOptions.c:3830
+msgid "Line edit style"
+msgstr "Linjeredigeringsstil"
+
+#. Keyboard layout: SELECT
+#: src/LYOptions.c:3842
+msgid "Keyboard layout"
+msgstr "Tastaturudlægning"
+
+#.
+#. * Display and Character Set
+#.
+#: src/LYOptions.c:3856
+msgid "Display and Character Set"
+msgstr "Skærm og tegnsæt"
+
+#. Use locale-based character set: ON/OFF
+#: src/LYOptions.c:3861
+msgid "Use locale-based character set"
+msgstr "Brug tegnsæt baseret på lokaliseringsindstillinger"
+
+#: src/LYOptions.c:3868
+msgid "Use HTML5 charset replacements"
+msgstr "Brug erstatninger for HTML5-tegnsæt"
+
+#. Display Character Set: SELECT
+#: src/LYOptions.c:3874
+msgid "Display character set"
+msgstr "Skærmtegnsæt"
+
+#: src/LYOptions.c:3905
+msgid "Assumed document character set"
+msgstr "Formodet dokumenttegnsæt"
+
+#.
+#. * Since CJK people hardly mixed with other world
+#. * we split the header to make it more readable:
+#. * "CJK mode" for CJK display charsets, and "Raw 8-bit" for others.
+#.
+#: src/LYOptions.c:3925
+msgid "CJK mode"
+msgstr "CJK-tilstand"
+
+#: src/LYOptions.c:3927
+msgid "Raw 8-bit"
+msgstr "RÃ¥ 8-bit"
+
+#. X Display: INPUT
+#: src/LYOptions.c:3935
+msgid "X Display"
+msgstr "X-skærm"
+
+#.
+#. * Document Appearance
+#.
+#: src/LYOptions.c:3941
+msgid "Document Appearance"
+msgstr "Udseende af dokument"
+
+#: src/LYOptions.c:3947
+msgid "Show color"
+msgstr "Vis farver"
+
+#. Color style: ON/OFF
+#: src/LYOptions.c:3972
+msgid "Color style"
+msgstr "Farvestil"
+
+#: src/LYOptions.c:3981
+msgid "Default colors"
+msgstr "Standardfarver"
+
+#. Show cursor: ON/OFF
+#: src/LYOptions.c:3989
+msgid "Show cursor"
+msgstr "Vis markør"
+
+#. Underline links: ON/OFF
+#: src/LYOptions.c:3995
+msgid "Underline links"
+msgstr "Understreg links"
+
+#. Show scrollbar: ON/OFF
+#: src/LYOptions.c:4002
+msgid "Show scrollbar"
+msgstr "Vis rullebjælke"
+
+#. Select Popups: ON/OFF
+#: src/LYOptions.c:4009
+msgid "Popups for select fields"
+msgstr "Pop op-vinduer for valgte felter"
+
+#. HTML error recovery: SELECT
+#: src/LYOptions.c:4015
+msgid "HTML error recovery"
+msgstr "HTML-fejlgenopretning"
+
+#. Bad HTML messages: SELECT
+#: src/LYOptions.c:4021
+msgid "Bad HTML messages"
+msgstr "Ugyldige HTML-beskeder"
+
+#. Show Images: SELECT
+#: src/LYOptions.c:4027
+msgid "Show images"
+msgstr "Vis billeder"
+
+#. Verbose Images: ON/OFF
+#: src/LYOptions.c:4041
+msgid "Verbose images"
+msgstr "Billedtekst"
+
+#. Collapse BR Tags: ON/OFF
+#: src/LYOptions.c:4047
+msgid "Collapse BR tags"
+msgstr "Saml BR-angivelser"
+
+#. Trim blank lines: ON/OFF
+#: src/LYOptions.c:4053
+msgid "Trim blank lines"
+msgstr "Trim tomme linjer"
+
+#.
+#. * Headers Transferred to Remote Servers
+#.
+#: src/LYOptions.c:4061
+msgid "Headers Transferred to Remote Servers"
+msgstr "Information til fremmede servere"
+
+#. ***************************************************************
+#. Mail Address: INPUT
+#: src/LYOptions.c:4065
+msgid "Personal mail address"
+msgstr "Personlig e-post-adresse"
+
+#: src/LYOptions.c:4070
+msgid "Personal name for mail"
+msgstr "Personlig navn for post"
+
+#: src/LYOptions.c:4077
+msgid "Password for anonymous ftp"
+msgstr "Adgangskode til anonymous ftp"
+
+# media type refererer til content-type headeren, eks: image/xyz
+#. Preferred media type: SELECT
+#: src/LYOptions.c:4083
+msgid "Preferred media type"
+msgstr "Foretrukket medietype"
+
+#. Preferred encoding: SELECT
+#: src/LYOptions.c:4089
+msgid "Preferred encoding"
+msgstr "Foretrukket kodning"
+
+#. Preferred Document Character Set: INPUT
+#: src/LYOptions.c:4095
+msgid "Preferred document character set"
+msgstr "Foretrukket dokumenttegnsæt"
+
+#. Preferred Document Language: INPUT
+#: src/LYOptions.c:4100
+msgid "Preferred document language"
+msgstr "Foretrukket dokumentsprog"
+
+#. HTTP protocol SELECT
+#: src/LYOptions.c:4105
+msgid "HTTP protocol"
+msgstr "HTTP-protokol"
+
+#: src/LYOptions.c:4112
+msgid "Send User-Agent header"
+msgstr "Send User-Agent-teksthoved"
+
+#: src/LYOptions.c:4114
+msgid "User-Agent header"
+msgstr "User-Agent-linje"
+
+#.
+#. * Listing and Accessing Files
+#.
+#: src/LYOptions.c:4122
+msgid "Listing and Accessing Files"
+msgstr "Filoversigt og Filadgang"
+
+#. FTP sort: SELECT
+#: src/LYOptions.c:4127
+msgid "Use Passive FTP"
+msgstr "Brug passiv FTP"
+
+#. FTP sort: SELECT
+#: src/LYOptions.c:4133
+msgid "FTP sort criteria"
+msgstr "FTP-sorteringskriterie"
+
+#. Local Directory Sort: SELECT
+#: src/LYOptions.c:4141
+msgid "Local directory sort criteria"
+msgstr "Sortering af lokale filkataloger"
+
+#. Local Directory Order: SELECT
+#: src/LYOptions.c:4147
+msgid "Local directory sort order"
+msgstr "Sortering af lokale filkataloger"
+
+#: src/LYOptions.c:4156
+msgid "Show dot files"
+msgstr "Vis punktumfiler"
+
+#: src/LYOptions.c:4164
+msgid "Execution links"
+msgstr "Links til programafvikling"
+
+#: src/LYOptions.c:4182
+msgid "Pause when showing message"
+msgstr "Pause når besked vises"
+
+#. Show transfer rate: SELECT
+#: src/LYOptions.c:4189
+msgid "Show transfer rate"
+msgstr "Vis overførselshastighed"
+
+#.
+#. * Special Files and Screens
+#.
+#: src/LYOptions.c:4209
+msgid "Special Files and Screens"
+msgstr "Særlige filer og skærmbilleder"
+
+#: src/LYOptions.c:4214
+msgid "Multi-bookmarks"
+msgstr "Multi-bogmærker"
+
+#: src/LYOptions.c:4222
+msgid "Review/edit Bookmarks files"
+msgstr "Gennemse/ret bogmærkefiler"
+
+#: src/LYOptions.c:4225
+msgid "Goto multi-bookmark menu"
+msgstr "Gå til multi-bogmærkemenu"
+
+#: src/LYOptions.c:4227
+msgid "Bookmarks file"
+msgstr "Bogmærkefil"
+
+#. Auto Session: ON/OFF
+#: src/LYOptions.c:4234
+msgid "Auto Session"
+msgstr "Automatisk session"
+
+#. Session File Menu: INPUT
+#: src/LYOptions.c:4240
+msgid "Session file"
+msgstr "Sessionsfil"
+
+#. Visited Pages: SELECT
+#: src/LYOptions.c:4246
+msgid "Visited Pages"
+msgstr "Besøgte sider"
+
+#: src/LYOptions.c:4251
+msgid "View the file "
+msgstr "Vis filen "
+
+#: src/LYPrint.c:955
+#, c-format
+msgid " Print job complete.\n"
+msgstr " Udskrivningsjob fuldført.\n"
+
+#: src/LYPrint.c:1282
+msgid "Document:"
+msgstr "Dokument:"
+
+#: src/LYPrint.c:1283
+msgid "Number of lines:"
+msgstr "Antal linjer:"
+
+#: src/LYPrint.c:1284
+msgid "Number of pages:"
+msgstr "Antal sider:"
+
+#: src/LYPrint.c:1285
+msgid "pages"
+msgstr "sider"
+
+#: src/LYPrint.c:1285
+msgid "page"
+msgstr "side"
+
+#: src/LYPrint.c:1286
+msgid "(approximately)"
+msgstr "(cirka)"
+
+#: src/LYPrint.c:1293
+msgid "Some print functions have been disabled!"
+msgstr "Visse udskrivningsfunktioner er slået fra!"
+
+#: src/LYPrint.c:1297
+msgid "Standard print options:"
+msgstr "Forvalg for udskrivning:"
+
+#: src/LYPrint.c:1298
+msgid "Print options:"
+msgstr "Valgmuligheder for udskrivning:"
+
+#: src/LYPrint.c:1305
+msgid "Save to a local file"
+msgstr "Gem i lokal fil"
+
+#: src/LYPrint.c:1307
+msgid "Save to disk disabled"
+msgstr "Gem på disk er slået fra"
+
+#: src/LYPrint.c:1314
+msgid "Mail the file"
+msgstr "Send fil med post"
+
+#: src/LYPrint.c:1321
+msgid "Print to the screen"
+msgstr "Udskriv til skærm"
+
+#: src/LYPrint.c:1326
+msgid "Print out on a printer attached to your vt100 terminal"
+msgstr "Udskriv på printer tilknyttet en vt100-terminal"
+
+#: src/LYReadCFG.c:437
+#, c-format
+msgid ""
+"Syntax Error parsing COLOR in configuration file:\n"
+"The line must be of the form:\n"
+"COLOR:INTEGER:FOREGROUND:BACKGROUND\n"
+"\n"
+"Here FOREGROUND and BACKGROUND must be one of:\n"
+"The special strings 'nocolor' or 'default', or\n"
+msgstr ""
+"Syntaksfejl ved fortolkning af FARVE (COLOR) i opsætningsfil:\n"
+"Linjen skal have formen:\n"
+"FARVE:HELTAL:FORGRUND:BAGGRUND\n"
+"\n"
+"Her skal FORGRUND og BAGGRUND være en af:\n"
+"de særlige betegnelser 'nocolor' eller 'default', eller\n"
+
+#: src/LYReadCFG.c:450
+msgid "Offending line:"
+msgstr "Problemskabende linje:"
+
+#: src/LYReadCFG.c:764
+#, c-format
+msgid "key remapping of %s to %s for %s failed\n"
+msgstr "Omtildeling af tasten %s til %s i %s slog fejl\n"
+
+#: src/LYReadCFG.c:771
+#, c-format
+msgid "key remapping of %s to %s failed\n"
+msgstr "Omtildeling af tasten %s til %s slog fejl\n"
+
+#: src/LYReadCFG.c:792
+#, c-format
+msgid "invalid line-editor selection %s for key %s, selecting all\n"
+msgstr "ugyldigt linje-editorvalg %s for taste %s, vælger alle\n"
+
+#: src/LYReadCFG.c:817 src/LYReadCFG.c:829
+#, c-format
+msgid "setting of line-editor binding for key %s (0x%x) to 0x%x for %s failed\n"
+msgstr "tildeling af taste %s (0x%x) til 0x%x for %s i linje-editor slog fejl\n"
+
+#: src/LYReadCFG.c:833
+#, c-format
+msgid "setting of line-editor binding for key %s (0x%x) for %s failed\n"
+msgstr "tildeling af tasten %s (0x%x) til %s i linje-editor slog fejl\n"
+
+#: src/LYReadCFG.c:929
+#, c-format
+msgid "Lynx: cannot start, CERN rules file %s is not available\n"
+msgstr "Lynx: Kan ikke starte op, CERN-regelfil %s findes ikke\n"
+
+#: src/LYReadCFG.c:930
+msgid "(no name)"
+msgstr "(intet navn)"
+
+#: src/LYReadCFG.c:2070
+#, c-format
+msgid "More than %d nested lynx.cfg includes -- perhaps there is a loop?!?\n"
+msgstr "Flere end %d inkluderingsfiler i lynx.cfg - måske en sløjfe!?\n"
+
+#: src/LYReadCFG.c:2072
+#, c-format
+msgid "Last attempted include was '%s',\n"
+msgstr "Sidste inkluderingsfil der forsøgtes indlæst var '%s',\n"
+
+#: src/LYReadCFG.c:2073
+#, c-format
+msgid "included from '%s'.\n"
+msgstr "inkluderet fra '%s'.\n"
+
+#: src/LYReadCFG.c:2476 src/LYReadCFG.c:2489 src/LYReadCFG.c:2547
+msgid "The following is read from your lynx.cfg file."
+msgstr "Følgende er læst fra din lynx.cfg-fil."
+
+#: src/LYReadCFG.c:2477 src/LYReadCFG.c:2490
+msgid "Please read the distribution"
+msgstr "Læs venligst distributionen"
+
+#: src/LYReadCFG.c:2483 src/LYReadCFG.c:2493
+msgid "for more comments."
+msgstr "for flere kommentarer."
+
+#: src/LYReadCFG.c:2529
+msgid "RELOAD THE CHANGES"
+msgstr "GENINDLÆS ÆNDRINGERNE"
+
+#: src/LYReadCFG.c:2537
+msgid "Your primary configuration"
+msgstr "Din primære opsætning"
+
+#: src/LYShowInfo.c:111
+msgid "URL:"
+msgstr "Adresse:"
+
+#: src/LYShowInfo.c:196
+msgid "Directory that you are currently viewing"
+msgstr "Filkatalog som du kigger på i øjeblikket"
+
+#: src/LYShowInfo.c:199
+msgid "Name:"
+msgstr "Navn:"
+
+#: src/LYShowInfo.c:216
+msgid "Directory that you have currently selected"
+msgstr "Aktuelt valgte filkatalog"
+
+#: src/LYShowInfo.c:218
+msgid "File that you have currently selected"
+msgstr "Aktuelt valgte fil"
+
+#: src/LYShowInfo.c:221
+msgid "Symbolic link that you have currently selected"
+msgstr "Aktuelt valgte symbolske link"
+
+#: src/LYShowInfo.c:224
+msgid "Item that you have currently selected"
+msgstr "Aktuelt valgte enhed"
+
+#: src/LYShowInfo.c:226
+msgid "Full name:"
+msgstr "Fulde navn:"
+
+#: src/LYShowInfo.c:239
+msgid "Unable to follow link"
+msgstr "Ude af stand til at følge link"
+
+#: src/LYShowInfo.c:241
+msgid "Points to file:"
+msgstr "Peger til fil:"
+
+#: src/LYShowInfo.c:246
+msgid "Name of owner:"
+msgstr "Ejers navn:"
+
+#: src/LYShowInfo.c:249
+msgid "Group name:"
+msgstr "Gruppes navn:"
+
+#: src/LYShowInfo.c:251
+msgid "File size:"
+msgstr "Filstr.:"
+
+#: src/LYShowInfo.c:253
+msgid "(bytes)"
+msgstr "(bytes)"
+
+#.
+#. * Include date and time information.
+#.
+#: src/LYShowInfo.c:258
+msgid "Creation date:"
+msgstr "Oprettelsesdato:"
+
+#: src/LYShowInfo.c:261
+msgid "Last modified:"
+msgstr "Sidst rettet:"
+
+#: src/LYShowInfo.c:264
+msgid "Last accessed:"
+msgstr "Sidst tilgået:"
+
+#: src/LYShowInfo.c:270
+msgid "Access Permissions"
+msgstr "Adgangsrettigheder"
+
+#: src/LYShowInfo.c:305
+msgid "Group:"
+msgstr "Gruppe:"
+
+#: src/LYShowInfo.c:325
+msgid "World:"
+msgstr "Alle:"
+
+#: src/LYShowInfo.c:332
+msgid "File that you are currently viewing"
+msgstr "Oplysninger om det aktuelle dokument:"
+
+#: src/LYShowInfo.c:340 src/LYShowInfo.c:444
+msgid "Linkname:"
+msgstr "Linknavn:"
+
+#: src/LYShowInfo.c:346 src/LYShowInfo.c:361
+msgid "Charset:"
+msgstr "Tegnsæt:"
+
+#: src/LYShowInfo.c:360
+msgid "(assumed)"
+msgstr "(formodet)"
+
+#: src/LYShowInfo.c:367
+msgid "Server:"
+msgstr "Server:"
+
+#: src/LYShowInfo.c:370
+msgid "Date:"
+msgstr "Dato:"
+
+#: src/LYShowInfo.c:373
+msgid "Last Mod:"
+msgstr "Sidst ret:"
+
+#: src/LYShowInfo.c:378
+msgid "Expires:"
+msgstr "Udløber:"
+
+#: src/LYShowInfo.c:381
+msgid "Cache-Control:"
+msgstr "Cachestyring:"
+
+#: src/LYShowInfo.c:384
+msgid "Content-Length:"
+msgstr "'Content-Length':"
+
+#: src/LYShowInfo.c:388
+msgid "Length:"
+msgstr "Længde:"
+
+#: src/LYShowInfo.c:393
+msgid "Language:"
+msgstr "Sprog:"
+
+#: src/LYShowInfo.c:400
+msgid "Post Data:"
+msgstr "POST-data:"
+
+#: src/LYShowInfo.c:403
+msgid "Post Content Type:"
+msgstr "POST-indholdstype:"
+
+#: src/LYShowInfo.c:406
+msgid "Owner(s):"
+msgstr "Ejer(e):"
+
+#: src/LYShowInfo.c:411
+msgid "size:"
+msgstr "Str:"
+
+#: src/LYShowInfo.c:413
+msgid "lines"
+msgstr "linjer"
+
+#: src/LYShowInfo.c:417
+msgid "forms mode"
+msgstr "formulartilstand"
+
+#: src/LYShowInfo.c:419
+msgid "source"
+msgstr "kilde"
+
+#: src/LYShowInfo.c:420
+msgid "normal"
+msgstr "normal"
+
+#: src/LYShowInfo.c:422
+msgid ", safe"
+msgstr ", sikker"
+
+#: src/LYShowInfo.c:424
+msgid ", via internal link"
+msgstr ", via internt link"
+
+#: src/LYShowInfo.c:429
+msgid ", no-cache"
+msgstr ", no-cache"
+
+#: src/LYShowInfo.c:431
+msgid ", ISMAP script"
+msgstr ", ISMAP-script"
+
+#: src/LYShowInfo.c:433
+msgid ", bookmark file"
+msgstr ", bogmærkefil"
+
+#: src/LYShowInfo.c:437
+msgid "mode:"
+msgstr "Tilstand:"
+
+#: src/LYShowInfo.c:443
+msgid "Link that you currently have selected"
+msgstr "Aktuelt valgte link"
+
+#: src/LYShowInfo.c:452
+msgid "Method:"
+msgstr "Metode:"
+
+#: src/LYShowInfo.c:456
+msgid "Enctype:"
+msgstr "Kod.type:"
+
+#: src/LYShowInfo.c:462
+msgid "Action:"
+msgstr "Handling:"
+
+#: src/LYShowInfo.c:468
+msgid "(Form field)"
+msgstr "(Formularfelt)"
+
+#: src/LYShowInfo.c:478
+msgid "No Links on the current page"
+msgstr "Ingen links på denne side"
+
+#: src/LYShowInfo.c:484
+msgid "Server Headers:"
+msgstr "Server-info:"
+
+#: src/LYStyle.c:339
+#, c-format
+msgid ""
+"Syntax Error parsing style in lss file:\n"
+"[%s]\n"
+"The line must be of the form:\n"
+"OBJECT:MONO:COLOR (ie em:bold:brightblue:white)\n"
+"where OBJECT is one of EM,STRONG,B,I,U,BLINK etc.\n"
+"\n"
+msgstr ""
+"Syntaksfejl ved fortolkning af stil i lss-fil:\n"
+"[%s]\n"
+"Linjen skal være på formen:\n"
+"OBJECT:MONO:COLOR (ie em:bold:brightblue:white),\n"
+"hvor OBJECT er en af EM,STRONG,B,I,U,BLINK etc.\n"
+"\n"
+
+#: src/LYStyle.c:948
+#, c-format
+msgid ""
+"\n"
+"Lynx file \"%s\" is not available.\n"
+"\n"
+msgstr ""
+"\n"
+"Lynx-fil \"%s\" er ikke tilgængelig.\n"
+"\n"
+
+#: src/LYTraversal.c:111
+msgid "here is a list of the history stack so that you may rebuild"
+msgstr "her er en liste over historikstakken, så du kan genopbygge"
+
+#: src/LYUpload.c:77
+msgid "ERROR! - upload command is misconfigured"
+msgstr "FEJL! - upload-kommandoen er sat forkert op"
+
+#: src/LYUpload.c:98
+msgid "Illegal redirection \"../\" found! Request ignored."
+msgstr "Ulovlig omdirigering \"../\" opdaget! Anmodning ignoreret."
+
+#: src/LYUpload.c:101
+msgid "Illegal character \"/\" found! Request ignored."
+msgstr "Fandt ugyldigt tegn \"/\" ! Anmodning ignoreret."
+
+#: src/LYUpload.c:104
+msgid "Illegal redirection using \"~\" found! Request ignored."
+msgstr "Ulovlig omdirigering ved \"~\"! Anmodning ignoreret."
+
+#: src/LYUpload.c:157
+msgid "Unable to upload file."
+msgstr "Ude af stand til at uploade fil."
+
+#: src/LYUpload.c:196
+msgid "Upload To:"
+msgstr "Upload til:"
+
+#: src/LYUpload.c:197
+msgid "Upload options:"
+msgstr "Valgmuligheder for uploads:"
+
+#: src/LYUtils.c:1917
+msgid "Download document URL put to clipboard."
+msgstr "Hjemtag dokument fra adressen på klippebord."
+
+#: src/LYUtils.c:2664
+msgid "Unexpected access protocol for this URL scheme."
+msgstr "Uventet adgangsprotokol for denne adressetype."
+
+#: src/LYUtils.c:3569
+msgid "Too many tempfiles"
+msgstr "For mange midlertidige filer"
+
+#: src/LYUtils.c:3869
+msgid "unknown restriction"
+msgstr "ukendt begrænsning"
+
+#: src/LYUtils.c:3900
+#, c-format
+msgid "No restrictions set.\n"
+msgstr "Ingen begrænsninger sat.\n"
+
+#: src/LYUtils.c:3903
+#, c-format
+msgid "Restrictions set:\n"
+msgstr "Begrænsninger sat:\n"
+
+#: src/LYUtils.c:5278
+msgid "Cannot find HOME directory"
+msgstr "Kan ikke finde HOME-katalog"
+
+#: src/LYrcFile.c:16
+msgid "Normally disabled. See ENABLE_LYNXRC in lynx.cfg\n"
+msgstr "Normalt slået fra. Se ENABLE_LYNXRC i lynx.cfg\n"
+
+#: src/LYrcFile.c:349
+msgid ""
+"accept_all_cookies allows the user to tell Lynx to automatically\n"
+"accept all cookies if desired. The default is \"FALSE\" which will\n"
+"prompt for each cookie. Set accept_all_cookies to \"TRUE\" to accept\n"
+"all cookies.\n"
+msgstr ""
+"accept_all_cookies gør at Lynx automatisk vil acceptere alle cookier\n"
+"hvis dette ønskes. Standarden er \"FALSE\", hvilket vil lade hver cookie\n"
+"blive ledsaget af et spørgsmål om den skal accepteres eller ej. Sæt\n"
+"accept_all_cookies\" til \"TRUE\" for at acceptere alle cookier.\n"
+
+#: src/LYrcFile.c:357
+msgid ""
+"anonftp_password allows the user to tell Lynx to use the personal\n"
+"email address as the password for anonymous ftp. If no value is given,\n"
+"Lynx will use the personal email address. Set anonftp_password\n"
+"to a different value if you choose.\n"
+msgstr ""
+"anonftp_password lader brugeren instruere Lynx om at bruge den personlige\n"
+"e-post-adresse som adgangskode ved anonymous ftp. Hvis der ikke er angivet\n"
+"en værdi, vil Lynx bruge den personlige e-post-adresse. Sæt anonftp_password\n"
+"til en anden værdi hvis du ønsker det.\n"
+
+#: src/LYrcFile.c:366
+msgid ""
+"bookmark_file specifies the name and location of the default bookmark\n"
+"file into which the user can paste links for easy access at a later\n"
+"date.\n"
+msgstr ""
+"bookmark_file angiver navn og placering på standardbogmærkefilen\n"
+"hvori brugeren kan indsætte de links som der ønskes let adgang til\n"
+"på et senere tidspunkt.\n"
+
+#: src/LYrcFile.c:371
+msgid ""
+"If case_sensitive_searching is \"on\" then when the user invokes a search\n"
+"using the 's' or '/' keys, the search performed will be case sensitive\n"
+"instead of case INsensitive. The default is usually \"off\".\n"
+msgstr ""
+"Hvis case_sensitive_searching er sat til \"on\", vil der blive skelnet\n"
+"mellem store og små bogstaver ved søgninger afgivet med 's' og '/'\n"
+"tasterne. Det normale er \"off\".\n"
+
+#: src/LYrcFile.c:376
+msgid ""
+"The character_set definition controls the representation of 8 bit\n"
+"characters for your terminal. If 8 bit characters do not show up\n"
+"correctly on your screen you may try changing to a different 8 bit\n"
+"set or using the 7 bit character approximations.\n"
+"Current valid characters sets are:\n"
+msgstr ""
+"character_set styrer hvordan 8-bit-tegn vises på din terminal. Hvis\n"
+"8-bit-tegn ikke vises korrekt på din skærm, kan du forsøge at skifte til et\n"
+"andet 8-bit-tegnsæt eller bruge 7-bit tegntilnærmelser. Aktuelt gyldige\n"
+"tegnsæt er:\n"
+
+#: src/LYrcFile.c:384
+msgid ""
+"cookie_accept_domains and cookie_reject_domains are comma-delimited\n"
+"lists of domains from which Lynx should automatically accept or reject\n"
+"all cookies. If a domain is specified in both options, rejection will\n"
+"take precedence. The accept_all_cookies parameter will override any\n"
+"settings made here.\n"
+msgstr ""
+"cookie_accept_domains og cookie_reject_domains er en kommasepareret\n"
+"liste over domæner hvorfra Lynx automatisk skal godkende eller afvise\n"
+"alle cookier. Hvis et domæne er anført i begge indstillinger, vil\n"
+"afvisningen have forrang. Parameteren \"accept_all_cookies\" vil\n"
+"tilsidesætte begge disse indstillinger.\n"
+
+#: src/LYrcFile.c:392
+msgid ""
+"cookie_file specifies the file from which to read persistent cookies.\n"
+"The default is ~/"
+msgstr ""
+"cookie_file angiver den fil som varige cookier skal læses fra.\n"
+"Standarden er ~/"
+
+#: src/LYrcFile.c:397
+msgid ""
+"cookie_loose_invalid_domains, cookie_strict_invalid_domains, and\n"
+"cookie_query_invalid_domains are comma-delimited lists of which domains\n"
+"should be subjected to varying degrees of validity checking. If a\n"
+"domain is set to strict checking, strict conformance to RFC2109 will\n"
+"be applied. A domain with loose checking will be allowed to set cookies\n"
+"with an invalid path or domain attribute. All domains will default to\n"
+"querying the user for an invalid path or domain.\n"
+msgstr ""
+"cookie_loose_invalid_domains, cookie_strict_invalid_domains, og\n"
+"cookie_query_invalid_domains er en kommasepareret liste over hvilke\n"
+"domæner der skal underkastes varierende grader af gyldighedskontrol. hvis\n"
+"et domæne er sat til streng kontrol, vil en streng overholdelse af RFC2109\n"
+"blive krævet. Et domæne med et løs kontrol vil blive tilladt at sende\n"
+"cookier med en ugyldig sti eller domæneattribut. Alle domæner vil som\n"
+"standard spørge brugeren om en ugyldig sti eller domæne.\n"
+
+#: src/LYrcFile.c:411
+msgid ""
+"dir_list_order specifies the directory list order under DIRED_SUPPORT\n"
+"(if implemented). The default is \"ORDER_BY_NAME\"\n"
+msgstr ""
+"dir_list_order angiver katalogsortering under DIRED_SUPPORT\n"
+"(hvis implementeret). Standarden er \"ORDER_BY_NAME\"\n"
+
+#: src/LYrcFile.c:416
+msgid ""
+"dir_list_styles specifies the directory list style under DIRED_SUPPORT\n"
+"(if implemented). The default is \"MIXED_STYLE\", which sorts both\n"
+"files and directories together. \"FILES_FIRST\" lists files first and\n"
+"\"DIRECTORIES_FIRST\" lists directories first.\n"
+msgstr ""
+"dir_list_styles angiver stilen for visning af filkataloger under\n"
+"DIRED_SUPPORT\" (hvis indarbejdet). Standarden er \"MIXED_STYLE\"\n"
+"hvilket sorterer såvel filer som kataloger sammen. \"FILES_FIRST\"\n"
+"oplister filer først og \"DIRECTORIES_FIRST\" oplister filkataloger\n"
+"først.\n"
+
+#: src/LYrcFile.c:424
+msgid ""
+"If emacs_keys is to \"on\" then the normal EMACS movement keys:\n"
+" ^N = down ^P = up\n"
+" ^B = left ^F = right\n"
+"will be enabled.\n"
+msgstr ""
+"Hvis \"emac_keys\" er sat til \"on\", vil de normale EMACS-navigeringstaster:\n"
+" ^N = ned ^P = op\n"
+" ^B = venstre ^F = højre\n"
+"være aktive.\n"
+
+#: src/LYrcFile.c:430
+msgid ""
+"file_editor specifies the editor to be invoked when editing local files\n"
+"or sending mail. If no editor is specified, then file editing is disabled\n"
+"unless it is activated from the command line, and the built-in line editor\n"
+"will be used for sending mail.\n"
+msgstr ""
+"file_editor angiver den editor der skal bruges ved redigering af lokale\n"
+"filer eller ved afsendelse af post. Hvis ingen editor er angivet, vil der\n"
+"ikke være mulighed for at redigere filer, medmindre den er givet fra\n"
+"kommandolinjen. Den indbyggede linje-editor vil blive brugt ved afsendelse\n"
+"af post.\n"
+
+#: src/LYrcFile.c:437
+msgid ""
+"The file_sorting_method specifies which value to sort on when viewing\n"
+"file lists such as FTP directories. The options are:\n"
+" BY_FILENAME -- sorts on the name of the file\n"
+" BY_TYPE -- sorts on the type of the file\n"
+" BY_SIZE -- sorts on the size of the file\n"
+" BY_DATE -- sorts on the date of the file\n"
+msgstr ""
+"file_sorting_method angiver hvilken sorteringsmetode der anvendes ved\n"
+"visning af filoversigter som f.eks FTP-filkataloger. Mulighederne er:\n"
+" BY_FILENAME -- sorterer efter filnavn\n"
+" BY_TYPE -- sorterer efter filtype\n"
+" BY_SIZE -- sorterer efter filstørrelse\n"
+" BY_DATE -- sorterer efter fildato\n"
+
+#: src/LYrcFile.c:462
+msgid ""
+"lineedit_mode specifies the key binding used for inputting strings in\n"
+"prompts and forms. If lineedit_mode is set to \"Default Binding\" then\n"
+"the following control characters are used for moving and deleting:\n"
+"\n"
+" Prev Next Enter = Accept input\n"
+" Move char: <- -> ^G = Cancel input\n"
+" Move word: ^P ^N ^U = Erase line\n"
+" Delete char: ^H ^R ^A = Beginning of line\n"
+" Delete word: ^B ^F ^E = End of line\n"
+"\n"
+"Current lineedit modes are:\n"
+msgstr ""
+"lineedit_mode angiver de tastebindinger, der bruges for at indtaste\n"
+"tekststrenge ved prompter og i formularer. Hvis lineedit_mode er sat\n"
+"til \"Default Binding\", vil flg. kontroltegn blive brugt for flytning\n"
+"og sletning:\n"
+"\n"
+" Forr. Næste Retur = Godkend indtastning\n"
+" Flyt tegn: <- -> ^G = Afbryd indtastning\n"
+" Flyt ord: ^P ^N ^U = Slet linje\n"
+" Slet tegn: ^H ^R ^A = Begyndelse af linje\n"
+" Slet ord: ^B ^F ^E = Slutning af linje\n"
+"\n"
+"Aktuelle tilstande ved linjeredigering er:\n"
+
+#: src/LYrcFile.c:480
+msgid ""
+"The following allow you to define sub-bookmark files and descriptions.\n"
+"The format is multi_bookmark<capital_letter>=<filename>,<description>\n"
+"Up to 26 bookmark files (for the English capital letters) are allowed.\n"
+"We start with \"multi_bookmarkB\" since 'A' is the default (see above).\n"
+msgstr ""
+"Følgende giver dig mulighed for at definere under-bogmærkefiler med\n"
+"tilhørende beskrivelser. Formatet er \"multi_bookmark\"<stort bogstav>=\n"
+"<filnavn>,<beskrivelse>. Indtil 26 bogmærkefiler fra A-Z (store bogstaver)\n"
+"er tilladt. Vi begynder med \"multi_bookmarkB\", idet \"A\" er standard (se\n"
+"ovenfor).\n"
+
+#: src/LYrcFile.c:486
+msgid ""
+"personal_mail_address specifies your personal mail address. The\n"
+"address will be sent during HTTP file transfers for authorization and\n"
+"logging purposes, and for mailed comments.\n"
+"If you do not want this information given out, set the NO_FROM_HEADER\n"
+"to TRUE in lynx.cfg, or use the -nofrom command line switch. You also\n"
+"could leave this field blank, but then you won't have it included in\n"
+"your mailed comments.\n"
+msgstr ""
+"personal_mail_address angiver din personlige e-post-adresse. Denne\n"
+"adresse vil blive afsendt under HTTP-filoverførsler med henblik på\n"
+"brugergodkendelse og logning samt for afsendelse af kommentarer pr. post.\n"
+"Sæt NO_FROM_HEADER til TRUE i lynx.cfg, eller brug \"-nofrom\" kommando-\n"
+"linje parameteren, hvis du ikke ønsker denne oplysning viderebragt.\n"
+"Du kan også lade dette felt stå tomt, men så vil din e-post-adresse ikke\n"
+"blive medtaget i de kommentarer du sender i e-post.\n"
+
+#: src/LYrcFile.c:495
+msgid ""
+"personal_mail_name specifies your personal name, for mail. The\n"
+"name is sent for mailed comments. Lynx will prompt for this,\n"
+"showing the configured value as a default when sending mail.\n"
+"This is not necessarily the same as a name provided as part of the\n"
+"personal_mail_address.\n"
+"Lynx does not save your changes to that default value as a side-effect\n"
+"of sending email. To update the default value, you must use the options\n"
+"menu, or modify this file directly.\n"
+msgstr ""
+"personal_mail_name angiver dit personlige navn, for e-post. Navnet\n"
+"følger med sendte beskeder. Lynx vil spørge efter dette. Den\n"
+"konfigurerede værdi vises som en standard, når der sendes post.\n"
+"Dette er ikke nødvendigvis det samme navn som angivet som en del\n"
+"af personal_mail_address.\n"
+"Lynx gemmer ikke dine ændringer til denne standardværdi som en\n"
+"sideeffekt af at sende e-post. For at opdatere standardværdien, så\n"
+"skal du bruge opsætningsmenuen, eller ændre denne fil direkte.\n"
+
+#: src/LYrcFile.c:505
+msgid ""
+"preferred_charset specifies the character set in MIME notation (e.g.,\n"
+"ISO-8859-2, ISO-8859-5) which Lynx will indicate you prefer in requests\n"
+"to http servers using an Accept-Charset header. The value should NOT\n"
+"include ISO-8859-1 or US-ASCII, since those values are always assumed\n"
+"by default. May be a comma-separated list.\n"
+"If a file in that character set is available, the server will send it.\n"
+"If no Accept-Charset header is present, the default is that any\n"
+"character set is acceptable. If an Accept-Charset header is present,\n"
+"and if the server cannot send a response which is acceptable\n"
+"according to the Accept-Charset header, then the server SHOULD send\n"
+"an error response, though the sending of an unacceptable response\n"
+"is also allowed.\n"
+msgstr ""
+"preferred_charset angiver det tegnsæt i MIME-notation (f.eks.\n"
+"ISO-8859-2, ISO-8859-5), som Lynx vil tilkendegive er dit foretrukne,\n"
+"i forespørgsler til HTTP-servere og ved brug af en \"Accept-Charset\n"
+"header \". Værdien bør IKKE indbefatte ISO-8859-1 eller US-ASCII, idet\n"
+"disse altid er underforståede som standard. Værdierne kan anføres på\n"
+"en kommasepareret liste. Hvis en fil i dette tegnsæt er tilgængelig,\n"
+"vil serveren sende den. Hvis ingen \"Accept-Charset\" header er til\n"
+"stede, er standarden at ethvert tegnsæt er acceptabelt. Hvis en\n"
+"\"Accept-Charset\"-header er til stede, og hvis serveren ikke kan sende\n"
+"et acceptabelt svar i henhold til denne header, da BØR serveren sende\n"
+"en fejlmeddelelse, omend afgivelse af et ikke-acceptabelt svar også er\n"
+"tilladt.\n"
+
+#: src/LYrcFile.c:521
+msgid ""
+"preferred_language specifies the language in MIME notation (e.g., en,\n"
+"fr, may be a comma-separated list in decreasing preference)\n"
+"which Lynx will indicate you prefer in requests to http servers.\n"
+"If a file in that language is available, the server will send it.\n"
+"Otherwise, the server will send the file in its default language.\n"
+msgstr ""
+"preferred_language angiver det sprog i MIME-notation (f.eks. \"en\", eller\n"
+"\"da\") og kan være en kommasepareret liste af faldende præference som Lynx så\n"
+"vil bruge til at meddele sit foretrukne sprog i sine forespørgsler til\n"
+"HTTP-servere. Hvis en fil på dette sprog er tilgængelig, vil serveren\n"
+"returnere den. I modsat fald vil den returnere filen på sit standardsprog.\n"
+
+#: src/LYrcFile.c:532
+msgid ""
+"If run_all_execution_links is set \"on\" then all local execution links\n"
+"will be executed when they are selected.\n"
+"\n"
+"WARNING - This is potentially VERY dangerous. Since you may view\n"
+" information that is written by unknown and untrusted sources\n"
+" there exists the possibility that Trojan horse links could be\n"
+" written. Trojan horse links could be written to erase files\n"
+" or compromise security. This should only be set to \"on\" if\n"
+" you are viewing trusted source information.\n"
+msgstr ""
+"Hvis run_all_execution_links er sat til \"on\" vil alle lokale\n"
+"programafviklingslinks blive udført når disse er valgt.\n"
+"\n"
+"ADVARSEL - Dette kan være MEGET farligt, eftersom du kan betragte\n"
+" information, som er skrevet af ukendte og upålidelige\n"
+" kilder. Der er mulighed for at links med \"trojanske heste\"\n"
+" kan være skrevet med det formål at slette filer eller\n"
+" kompromittere sikkerheden. Denne indstilling skal kun\n"
+" sættes til \"on\", hvis du kigger på oplysninger fra kilder\n"
+" som du kan stole på.\n"
+
+#: src/LYrcFile.c:543
+msgid ""
+"If run_execution_links_on_local_files is set \"on\" then all local\n"
+"execution links that are found in LOCAL files will be executed when they\n"
+"are selected. This is different from run_all_execution_links in that\n"
+"only files that reside on the local system will have execution link\n"
+"permissions.\n"
+"\n"
+"WARNING - This is potentially dangerous. Since you may view\n"
+" information that is written by unknown and untrusted sources\n"
+" there exists the possibility that Trojan horse links could be\n"
+" written. Trojan horse links could be written to erase files\n"
+" or compromise security. This should only be set to \"on\" if\n"
+" you are viewing trusted source information.\n"
+msgstr ""
+"Hvis run_execution_links_on_local_files er sat til \"on\", vil alle\n"
+"lokale programafviklingslinks, som forefindes i LOKALE filer blive\n"
+"udført, når disse vælges. Dette er anderledes end\n"
+"\"run_all_execution_links\", i den forstand at alene filer som ligger på\n"
+"det lokale system vil have tilladelse til at blive eksekveret.\n"
+"\n"
+"ADVARSEL - Dette er potentielt MEGET farligt, eftersom du kan betragte\n"
+" information, som er skrevet af ukendte og upålidelige kilder.\n"
+" Der er mulighed for at links med \"trojanske heste\" kan \n"
+"skrives,\n"
+" med det formål at slette filer eller kompromittere sikkerheden.\n"
+" Denne indstilling skal kun sættes til \"on\", hvis du har fuld\n"
+" tillid til den kilde hvorfra informationen stammer.\n"
+
+#: src/LYrcFile.c:561
+msgid ""
+"select_popups specifies whether the OPTIONs in a SELECT block which\n"
+"lacks a MULTIPLE attribute are presented as a vertical list of radio\n"
+"buttons or via a popup menu. Note that if the MULTIPLE attribute is\n"
+"present in the SELECT start tag, Lynx always will create a vertical list\n"
+"of checkboxes for the OPTIONs. A value of \"on\" will set popup menus\n"
+"as the default while a value of \"off\" will set use of radio boxes.\n"
+"The default can be overridden via the -popup command line toggle.\n"
+msgstr ""
+"select_popups angiver om VALGMULIGHEDER i en \"SELECT\"-blok, som mangler en\n"
+"MULTIPLE\"-attribut bliver præsenteret som en lodret liste af radioknapper\n"
+"eller via en pop op-menu. Bemærk at hvis MULTIPLE\"-attributten er til stede\n"
+"i \"SELECT start tag\", vil Lynx altid oprette en lodret liste af\n"
+"afkrydsningsfelter for VALGMULIGHEDERne. En værdi af \"on\" vil sætte pop\n"
+"op-menuer som standard, medens en værdi af \"off\" vil sætte brugen af\n"
+"radiobokse. Den forvalgte værdi kan ændres med kommandolinje-parameteret\n"
+"-popup.\n"
+
+#: src/LYrcFile.c:572
+msgid ""
+"show_color specifies how to set the color mode at startup. A value of\n"
+"\"never\" will force color mode off (treat the terminal as monochrome)\n"
+"at startup even if the terminal appears to be color capable. A value of\n"
+"\"always\" will force color mode on even if the terminal appears to be\n"
+"monochrome, if this is supported by the library used to build lynx.\n"
+"A value of \"default\" will yield the behavior of assuming\n"
+"a monochrome terminal unless color capability is inferred at startup\n"
+"based on the terminal type, or the -color command line switch is used, or\n"
+"the COLORTERM environment variable is set. The default behavior always is\n"
+"used in anonymous accounts or if the \"option_save\" restriction is set.\n"
+"The effect of the saved value can be overridden via\n"
+"the -color and -nocolor command line switches.\n"
+"The mode set at startup can be changed via the \"show color\" option in\n"
+"the 'o'ptions menu. If the option settings are saved, the \"on\" and\n"
+"\"off\" \"show color\" settings will be treated as \"default\".\n"
+msgstr ""
+"show_color angiver hvorledes farveindstillingen skal være ved\n"
+"opstart. En værdi af \"never\" vil slå farver fra (som på en monokrom\n"
+"skærm) ved opstart, selvom der er tale om en farveskærm. En værdi af\n"
+"\"always\" vil slå farver til, selvom der er tale om en monokrom skærm,\n"
+"såfremt dette er understøttet af det terminalbibliotek, som Lynx er\n"
+"baseret på. En værdi af \"default\" vil medføre at en monokrom skærm\n"
+"forudsættes, medmindre farveegenskaber antydes ved opstart, enten ud fra\n"
+"skærmtypen, eller ved brug af kommandolinje-parameteret \"-color\",\n"
+"eller hvis miljøvariablen COLORTERM er sat. Indstillingen \"default\"\n"
+"bruges altid ved anonyme brugerkonti, eller hvis begræsningen \"option_save\"\n"
+"er virksom. Virkningen af den gemte værdi kan tilsidesættes med\n"
+"kommandolinje-parametrene -color og -nocolor. Startindstillingen\n"
+"kan ændres i punktet \"Vis farver\" i 'o'psætningsmenuen. Hvis\n"
+"indstillingerne er gemt, vil farveindstilingerne blive opfattet som\n"
+"\"default\".\n"
+
+#: src/LYrcFile.c:589
+msgid ""
+"show_cursor specifies whether to 'hide' the cursor to the right (and\n"
+"bottom, if possible) of the screen, or to place it to the left of the\n"
+"current link in documents, or current option in select popup windows.\n"
+"Positioning the cursor to the left of the current link or option is\n"
+"helpful for speech or braille interfaces, and when the terminal is\n"
+"one which does not distinguish the current link based on highlighting\n"
+"or color. A value of \"on\" will set positioning to the left as the\n"
+"default while a value of \"off\" will set 'hiding' of the cursor.\n"
+"The default can be overridden via the -show_cursor command line toggle.\n"
+msgstr ""
+"show_cursor angiver om markøren skal gemmes væk i skærmen højre side\n"
+"(og hvis muligt også skærmens bund), eller om den skal placeres til\n"
+"venstre for det aktuelle link i dokumenter hhv. ved den aktuelle\n"
+"valgmulighed i pop op-vinduer. Placering af markør til venstre for det\n"
+"aktuelle link eller valgmulighed er hensigtsmæssigt for tale- eller\n"
+"Braille-brugerflader, eller hvor skærmen er af en type som ikke kan\n"
+"skelne det aktuelle link på baggrund af lysmarkering eller farve. En\n"
+"værdi af \"on\" vil sætte placeringen til venstre som standard, medens\n"
+"en værdi af \"off\" vil skjule markøren. Standarden kan tilsidesættes\n"
+"med kommandolinje-parameteret \"-show-cursur\".\n"
+
+#: src/LYrcFile.c:600
+msgid ""
+"show_dotfiles specifies that the directory listing should include\n"
+"\"hidden\" (dot) files/directories. If set \"on\", this will be\n"
+"honored only if enabled via userdefs.h and/or lynx.cfg, and not\n"
+"restricted via a command line switch. If display of hidden files\n"
+"is disabled, creation of such files via Lynx also is disabled.\n"
+msgstr ""
+"show_dotfiles angiver, at \"skjulte\" punktumfiler/-kataloger vises i\n"
+"filoversigterne. Hvis sat til \"on\", vil det kun blive respekteret,\n"
+"såfremt det er aktiveret via userdefs.h og/eller lynx.cfg og ikke\n"
+"er slået fra via kommandolinjen. Hvis visning af skjulte filer er\n"
+"slået fra (off), vil man heller ikke kunne oprette sådanne skjulte filer\n"
+"eller filkataloger i Lynx.\n"
+
+#: src/LYrcFile.c:611
+msgid ""
+"If sub_bookmarks is not turned \"off\", and multiple bookmarks have\n"
+"been defined (see below), then all bookmark operations will first\n"
+"prompt the user to select an active sub-bookmark file. If the default\n"
+"Lynx bookmark_file is defined (see above), it will be used as the\n"
+"default selection. When this option is set to \"advanced\", and the\n"
+"user mode is advanced, the 'v'iew bookmark command will invoke a\n"
+"statusline prompt instead of the menu seen in novice and intermediate\n"
+"user modes. When this option is set to \"standard\", the menu will be\n"
+"presented regardless of user mode.\n"
+msgstr ""
+"Hvis sub_bookmarks ikke er sat til \"off\", og multi-bogmærker er defineret\n"
+"(se nedenfor), vil brugeren i forbindelse med alle bogmærke-operationer\n"
+"først blive bedt om at vælge en aktiv sekundær bogmærkefil. Hvis den gængse\n"
+"Lynx bookmark_file er defineret (se ovenfor), vil denne blive brugt som\n"
+"første valg. Når denne valgmulighed er sat til advanced og user_mode er\n"
+"sat til advanced, vil kommandoen (v)is bogmærke give en statuslinjeprompt,\n"
+"i stedet for den menu som fremkommer i brugertilstandene novice og\n"
+"intermediate. NÃ¥r denne indstilling er sat til default, vil menuen\n"
+"fremkomme uanset brugertilstand.\n"
+
+#: src/LYrcFile.c:626
+msgid ""
+"user_mode specifies the users level of knowledge with Lynx. The\n"
+"default is \"NOVICE\" which displays two extra lines of help at the\n"
+"bottom of the screen to aid the user in learning the basic Lynx\n"
+"commands. Set user_mode to \"INTERMEDIATE\" to turn off the extra info.\n"
+"Use \"ADVANCED\" to see the URL of the currently selected link at the\n"
+"bottom of the screen.\n"
+msgstr ""
+"user_mode angiver en brugers kompetanceniveau i Lynx. Standarden er\n"
+"NOVICE, hvilket betyder at to ekstra linjer med hjælpetekst bliver\n"
+"vist i bunden af skærmen for at hjælpe brugeren med at lære de basale\n"
+"Lynx-kommandoer. Sæt user_mode til INTERMEDIATE for at slå disse\n"
+"ekstra oplysninger fra, Brug ADVANCED for at se adressen på det\n"
+"aktuelt valgte link i bunden af skærmen.\n"
+
+#: src/LYrcFile.c:635
+msgid ""
+"If verbose_images is \"on\", lynx will print the name of the image\n"
+"source file in place of [INLINE], [LINK] or [IMAGE]\n"
+"See also VERBOSE_IMAGES in lynx.cfg\n"
+msgstr ""
+"Hvis verbose_images er sat til \"on\", vil Lynx printe navnet på et\n"
+"kildefilen til et billedlink i stedet for [INLINE], [LINK] eller [IMAGE].\n"
+"Se også VERBOSE_IMAGES i lynx.cfg\n"
+
+#: src/LYrcFile.c:640
+msgid ""
+"If vi_keys is set to \"on\", then the normal VI movement keys:\n"
+" j = down k = up\n"
+" h = left l = right\n"
+"will be enabled. These keys are only lower case.\n"
+"Capital 'H', 'J' and 'K will still activate help, jump shortcuts,\n"
+"and the keymap display, respectively.\n"
+msgstr ""
+"Hvis vi_keys er sat til \"on\", vil de normale VI-navigeringstaster:\n"
+" J = ned K = op\n"
+" h = venstre I = højre\n"
+"være slået til. Disse taster virker kun som små bogstaver.\n"
+"Stort H, J og K vil stadig aktivere henholdsvis hjælp,\n"
+"hop-genveje og oversigt over tastebindinger.\n"
+
+#: src/LYrcFile.c:648
+msgid ""
+"The visited_links setting controls how Lynx organizes the information\n"
+"in the Visited Links Page.\n"
+msgstr ""
+"visited_links styrer hvorledes Lynx organiserer oplysningerne i siden\n"
+"over besøgte links.\n"
+
+#: src/LYrcFile.c:890
+msgid ""
+"If keypad_mode is set to \"NUMBERS_AS_ARROWS\", then the numbers on\n"
+"your keypad when the numlock is on will act as arrow keys:\n"
+" 8 = Up Arrow\n"
+" 4 = Left Arrow 6 = Right Arrow\n"
+" 2 = Down Arrow\n"
+"and the corresponding keyboard numbers will act as arrow keys,\n"
+"regardless of whether numlock is on.\n"
+msgstr ""
+"Hvis keypad_mode er sat til NUMBERS_AS_ARROWS vil tasterne på det\n"
+"numeriske tastatur, med numlock slået, til virke som piletaster:\n"
+" 8 = pil op\n"
+" 4 = venstre pil 6 = højre pil\n"
+" 2 = pil ned\n"
+"og de tilsvarende numeriske taster på tastaturet vil virke som piletaster,\n"
+"uanset om numlock er slået til eller ej\n"
+
+#: src/LYrcFile.c:899
+msgid ""
+"If keypad_mode is set to \"LINKS_ARE_NUMBERED\", then numbers will\n"
+"appear next to each link and numbers are used to select links.\n"
+msgstr ""
+"Hvis keypad_mode er sat til LINKS_ARE_NUMBERED, vil ethvert link\n"
+"være ledsaget af et nummer som kan bruges til at aktivere linkene.\n"
+
+#: src/LYrcFile.c:903
+msgid ""
+"If keypad_mode is set to \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\", then\n"
+"numbers will appear next to each link and visible form input field.\n"
+"Numbers are used to select links, or to move the \"current link\" to a\n"
+"form input field or button. In addition, options in popup menus are\n"
+"indexed so that the user may type an option number to select an option in\n"
+"a popup menu, even if the option isn't visible on the screen. Reference\n"
+"lists and output from the list command also enumerate form inputs.\n"
+msgstr ""
+"Hvis keypad_mode er sat til LINKS_AND_FORM_FIELDS_ARE_NUMBERED, vil der\n"
+"komme til at stå et tal ved siden af ethvert link og synligt\n"
+"formularindtastningsfelt. Tallene bruges til at vælge linkene eller til at\n"
+"flytte det \"aktuelle link\" til et formularindtastningsfelt eller til en\n"
+"knap. Herudover er valgmuligheder i pop op-menuer indekserede således at\n"
+"brugeren kan indtaste et tal for at vælge en indstillingsmulighed i en pop\n"
+"op-menu selvom denne ikke er synlig på skærmen. Oversigter over links og\n"
+"uddata fra \"list\"-kommandoen bliver også nummererede.\n"
+
+#: src/LYrcFile.c:912
+msgid ""
+"NOTE: Some fixed format documents may look disfigured when\n"
+"\"LINKS_ARE_NUMBERED\" or \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\" are\n"
+"enabled.\n"
+msgstr ""
+"NB: Visse fastformaterede dokumenter kan se fejlformaterede ud når\n"
+"LINKS_ARE_NUMBERED eller LINKS_AND_FORM_FIELDS_ARE_NUMBERED er\n"
+"aktiveret.\n"
+
+#: src/LYrcFile.c:944
+msgid ""
+"Lynx User Defaults File\n"
+"\n"
+msgstr ""
+"Lynxfil for brugers standardindstilinger\n"
+"\n"
+
+#: src/LYrcFile.c:953
+msgid ""
+"This file contains options saved from the Lynx Options Screen (normally\n"
+"with the 'o' key). To save options with that screen, you must select the\n"
+"checkbox:\n"
+msgstr ""
+"Denne fil indeholder tilvalg gemt fra Lynx' opsætningsmenu (normalt gemt\n"
+"med tasten \"o\"). For at gemme opsætningen med den menu skal du vælge\n"
+"afkrydsningsfeltet:\n"
+
+#: src/LYrcFile.c:960
+msgid ""
+"You must then save the settings using the link on the line above the\n"
+"checkbox:\n"
+msgstr ""
+"Du skal så gemme opsætningen via henvisningen på linjen over\n"
+"afkrydsningsfeltet:\n"
+
+#: src/LYrcFile.c:967
+msgid ""
+"You may also use the command-line option \"-forms_options\", which displays\n"
+"the simpler Options Menu instead. Save options with that using the '>' key.\n"
+"\n"
+msgstr ""
+"Du kan også bruge kommandolinjetilvalget \"-forms_options\", som viser\n"
+"den mere simple opsætningsmenu i stedet for. Gem opsætningen med den via\n"
+"tasten \">\".\n"
+
+#: src/LYrcFile.c:974
+msgid ""
+"This file contains options saved from the Lynx Options Screen (normally\n"
+"with the '>' key).\n"
+"\n"
+msgstr ""
+"Denne fil indeholder opsætningen gemt fra Lynx' opsætningsmenu (normalt\n"
+"med tasten \">\").\n"
+
+#: src/LYrcFile.c:981
+msgid ""
+"There is normally no need to edit this file manually, since the defaults\n"
+"here can be controlled from the Options Screen, and the next time options\n"
+"are saved from the Options Screen this file will be completely rewritten.\n"
+"You have been warned...\n"
+"\n"
+"If you are looking for the general configuration file - it is normally\n"
+"called \"lynx.cfg\". It has different content and a different format.\n"
+"It is not this file.\n"
+msgstr ""
+"Der er normalt ingen grund til at redigere denne fil manuelt, eftersom\n"
+"standarderne heri kan styres fra opsætningsmenuen, og næste gang\n"
+"indstillingerne gemmes fra opsætningsmenuen vil denne fil blive\n"
+"fuldstændig omskrevet. Du er blevet advaret ...\n"
+"\n"
+"Hvis du er ude efter en almen opsætningsfil - så hedder den sædvanligvis\n"
+"lynx.cfg. Den har et andet indhold og format. Det er ikke denne fil.\n"
+
+#~ msgid "Address contains a username: %s"
+#~ msgstr "Adresse indeholder et brugernavn: %s"
+
+#~ msgid ""
+#~ "\n"
+#~ "Lynx edit map not declared.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Lynx \"edit map\" er ikke angivet.\n"
+#~ "\n"
diff --git a/po/de.po b/po/de.po
new file mode 100644
index 0000000..75e71e0
--- /dev/null
+++ b/po/de.po
@@ -0,0 +1,6588 @@
+# German translations for the `lynx' program.
+# This file is distributed under the same license as the lynx package.
+# But the TRANSLATIONS in this file are in the public domain.
+# This does not apply to the included original strings, which were
+# extracted from the Lynx source code by the xgettext program.
+#
+# Klaus Weide <kweide@enteract.com>, 1999.
+# Erwin Dieterich <bamse@gmx.de>, 2000.
+# Karl Eichwalder <ke@suse.de>, 2002-2004.
+# Fabian Fingerle <fabian@datensalat.eu>, 2008.
+# Roland Illig <roland.illig@gmx.de>, 2009.
+# Arun Persaud <arun@nubati.net>, 2012.
+# Roland Illig <roland.illig@gmx.de>, 2019, 2021.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: lynx 2.9.0-dev8\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-07-31 10:04-0400\n"
+"PO-Revision-Date: 2021-08-01 18:44+0200\n"
+"Last-Translator: Roland Illig <roland.illig@gmx.de>\n"
+"Language-Team: German <translation-team-de@lists.sourceforge.net>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"X-Generator: Poedit 3.0\n"
+
+#. ******************************************************************
+#. * The following definitions are for status line prompts, messages, or
+#. * warnings issued by Lynx during program execution. You can modify
+#. * them to make them more appropriate for your site. We recommend that
+#. * you extend these definitions to other languages using the gettext
+#. * library. There are also scattered uses of 'gettext()' throughout the
+#. * Lynx source, covering all but those messages which (a) are used for
+#. * debugging (CTRACE) or (b) are constants used in interaction with
+#. * other programs.
+#. *
+#. * See ABOUT-NLS and po/readme for details and location of contributed
+#. * translations. When no translation is available, the English default is
+#. * used.
+#.
+#: LYMessages.c:28
+#, c-format
+msgid "Alert!: %s"
+msgstr "Obacht: %s"
+
+#: LYMessages.c:29
+msgid "Welcome"
+msgstr "Willkommen"
+
+#: LYMessages.c:30
+msgid "Are you sure you want to quit?"
+msgstr "Programm wirklich beenden?"
+
+#: LYMessages.c:32
+msgid "Really exit from Lynx?"
+msgstr "Lynx wirklich beenden?"
+
+#: LYMessages.c:34
+msgid "Connection interrupted."
+msgstr "Verbindung unterbrochen."
+
+#: LYMessages.c:35
+msgid "Data transfer interrupted."
+msgstr "Datentransfer unterbrochen."
+
+#: LYMessages.c:36
+msgid "Cancelled!!!"
+msgstr "Abgebrochen!"
+
+#: LYMessages.c:37
+msgid "Cancelling!"
+msgstr "Wird abgebrochen!"
+
+#: LYMessages.c:38
+msgid "Excellent!!!"
+msgstr "Prima!"
+
+#: LYMessages.c:39
+msgid "OK"
+msgstr "OK"
+
+#: LYMessages.c:40
+msgid "Done!"
+msgstr "Fertig!"
+
+#: LYMessages.c:41
+msgid "Bad request!"
+msgstr "Fehlerhafter Request!"
+
+#: LYMessages.c:42
+msgid "previous"
+msgstr "vorhergehender"
+
+#: LYMessages.c:43
+msgid "next screen"
+msgstr "nächste Seite"
+
+#: LYMessages.c:44
+msgid "HELP!"
+msgstr "HILFE!"
+
+#: LYMessages.c:45
+msgid ", help on "
+msgstr ", Hilfe über "
+
+#. #define HELP
+#: LYMessages.c:47
+msgid "Commands: Use arrow keys to move, '?' for help, 'q' to quit, '<-' to go back."
+msgstr "Pfeiltasten zum Bewegen, »?«: Hilfe, »q«: Programmende, »<-«: zurück."
+
+#. #define MOREHELP
+#: LYMessages.c:49
+msgid "-- press space for more, use arrow keys to move, '?' for help, 'q' to quit."
+msgstr "-- Leertaste für mehr, Pfeiltasten zum Bewegen, '?': Hilfe, 'q': Programmende."
+
+#: LYMessages.c:50
+msgid "-- press space for next page --"
+msgstr "-- Leertaste für nächste Seite --"
+
+#: LYMessages.c:51
+msgid "URL too long"
+msgstr "URL zu lang"
+
+#. Inactive input fields, messages used with -tna option - kw
+#. #define FORM_LINK_TEXT_ADV_MSG_INA
+#: LYMessages.c:57
+#, c-format
+msgid "(Textfield \"%s\"); Inactive. Press <return> to activate."
+msgstr "(Texteingabefeld »%s«) nicht aktiv. Zum Aktivieren <Enter> eingeben."
+
+#. #define FORM_LINK_TEXT_MESSAGE_INA
+#: LYMessages.c:59
+msgid "(Text entry field) Inactive. Press <return> to activate."
+msgstr "(Texteingabefeld) nicht aktiv. Zum Aktivieren <Return> eingeben."
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG_INA
+#: LYMessages.c:61
+#, c-format
+msgid "(Textarea \"%s\"); Inactive. Press <return> to activate."
+msgstr "(Textbereich »%s«) nicht aktiv. Zum Aktivieren <Enter> eingeben."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_INA
+#: LYMessages.c:63
+msgid "(Textarea) Inactive. Press <return> to activate."
+msgstr "(Textbereich) nicht aktiv. Zum Aktivieren <Return> eingeben."
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG_INA_E
+#: LYMessages.c:65
+#, c-format
+msgid "(Textarea \"%s\"); Inactive. Press <return> to activate (%s for editor)."
+msgstr "(Textbereich »%s«) nicht aktiv. Zum Aktivieren <Enter> eingeben (%s für Editor)."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_INA_E
+#: LYMessages.c:67
+#, c-format
+msgid "(Textarea) Inactive. Press <return> to activate (%s for editor)."
+msgstr "(Textregion) nicht aktiv. Zum Aktivieren <Return> drücken (%s für Editor)."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE_INA
+#: LYMessages.c:69
+msgid "(Form field) Inactive. Use <return> to edit."
+msgstr "(Formfeld) nicht aktiv. <Return> zum Editieren."
+
+#. #define FORM_TEXT_SUBMIT_MESSAGE_INA_X
+#: LYMessages.c:71
+#, c-format
+msgid "(Form field) Inactive. Use <return> to edit (%s to submit with no cache)."
+msgstr "(Formfeld) nicht aktiv. <Return> zum Editieren (%s: Abschicken ohne Zwischenspeicher (Cache))."
+
+#. #define FORM_TEXT_RESUBMIT_MESSAGE_INA
+#: LYMessages.c:73
+msgid "(Form field) Inactive. Press <return> to edit, press <return> twice to submit."
+msgstr "(Formfeld) nicht aktiv. <return> zum Editieren, zweimal <return> zum Abschicken."
+
+#. #define FORM_TEXT_SUBMIT_MAILTO_MSG_INA
+#: LYMessages.c:75
+msgid "(mailto form field) Inactive. Press <return> to change."
+msgstr "(Mailto-Formfeld) nicht aktiv. Zum Ändern <return> dücken."
+
+#. #define FORM_LINK_PASSWORD_MESSAGE_INA
+#: LYMessages.c:77
+msgid "(Password entry field) Inactive. Press <return> to activate."
+msgstr "(Paßwort-Eingabefeld) nicht aktiv. Zum Aktivieren <return> dücken."
+
+#. #define FORM_LINK_FILE_UNM_MSG
+#: LYMessages.c:80
+msgid "UNMODIFIABLE file entry field. Use UP or DOWN arrows or tab to move off."
+msgstr "NICHTVERÄNDERBARES Formfeld. Verlassen mit Auf- oder Ab-Pfeiltaste oder TAB."
+
+#. #define FORM_LINK_FILE_MESSAGE
+#: LYMessages.c:82
+msgid "(File entry field) Enter filename. Use UP or DOWN arrows or tab to move off."
+msgstr "(Texteingabefeld) Text eingeben. Verlassen mit Auf- oder Ab-Pfeiltaste oder TAB."
+
+#. #define FORM_LINK_TEXT_ADV_MSG
+#. #define FORM_LINK_TEXT_MESSAGE
+#: LYMessages.c:84 LYMessages.c:86
+#, c-format
+msgid "(Textfield \"%s\"); Enter text. Use UP or DOWN arrows or tab to move off."
+msgstr "(Textbereich »%s«) Text eingeben. Verlassen mit Auf- oder Ab-Pfeiltaste oder Tab."
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG
+#: LYMessages.c:88
+#, c-format
+msgid "(Textarea \"%s\"); Enter text. Use UP/DOWN arrows or TAB to move off."
+msgstr "(Textbereich »%s«) Text eingeben. Verlassen mit Auf/Ab-Pfeiltaste oder Tab."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE
+#: LYMessages.c:90
+msgid "(Textarea) Enter text. Use UP/DOWN arrows or TAB to move off."
+msgstr "(Textregion) Text eingeben. Mit Auf/Ab-Pfeiltaste oder TAB verlassen."
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG_E
+#: LYMessages.c:92
+#, c-format
+msgid "(Textarea \"%s\"); Enter text. Use UP/DOWN arrows or TAB to move off (%s for editor)."
+msgstr "(Textbereich »%s«) Text eingeben. Verlassen mit Pfeiltasten oder Tab (%s für Editor)."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_E
+#: LYMessages.c:94
+#, c-format
+msgid "(Textarea) Enter text. Use UP/DOWN arrows or TAB to move off (%s for editor)."
+msgstr "(Textregion) Text eingeben. Verlassen mit Pfeiltasten oder TAB (%s für Editor)."
+
+#. #define FORM_LINK_TEXT_UNM_MSG
+#: LYMessages.c:96
+msgid "UNMODIFIABLE form text field. Use UP or DOWN arrows or tab to move off."
+msgstr "NICHTVERÄNDERBARES Form-Textfeld. Verlassen mit Auf- oder Ab-Pfeiltaste oder TAB."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE
+#: LYMessages.c:98
+msgid "(Form field) Enter text. Use <return> to submit."
+msgstr "(Formfeld) Text eingeben. <return> zum Abschicken."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE_X
+#: LYMessages.c:100
+#, c-format
+msgid "(Form field) Enter text. Use <return> to submit (%s for no cache)."
+msgstr "(Formfeld) Text eingeben. <return> zum Abschicken (%s: Cache umgehen)."
+
+#. #define FORM_LINK_TEXT_RESUBMIT_MESSAGE
+#: LYMessages.c:102
+msgid "(Form field) Enter text. Use <return> to submit, arrows or tab to move off."
+msgstr "(Formfeld) Text eingeben. <return> zum Abschicken, Pfeiltasten/TAB: Verlassen."
+
+#. #define FORM_LINK_TEXT_SUBMIT_UNM_MSG
+#: LYMessages.c:104
+msgid "UNMODIFIABLE form field. Use UP or DOWN arrows or tab to move off."
+msgstr "NICHTVERÄNDERBARES Formfeld. Verlassen mit Auf- oder Ab-Pfeiltaste."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MAILTO_MSG
+#: LYMessages.c:106
+msgid "(mailto form field) Enter text. Use <return> to submit, arrows to move off."
+msgstr "(Mailto-Formfeld) Text eingeben. <Enter>: Abschicken, Pfeiltasten: Verlassen."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MAILTO_DIS_MSG
+#: LYMessages.c:108
+msgid "(mailto form field) Mail is disallowed so you cannot submit."
+msgstr "(Mailto-Formfeld) Schicken nicht möglich, da Mail nicht erlaubt ist."
+
+#. #define FORM_LINK_PASSWORD_MESSAGE
+#: LYMessages.c:110
+msgid "(Password entry field) Enter text. Use UP or DOWN arrows or tab to move off."
+msgstr "(Paßwort-Eingabefeld) Text eingeben. Auf- oder Ab-Pfeiltasten oder Tab: Verlassen."
+
+#. #define FORM_LINK_PASSWORD_UNM_MSG
+#: LYMessages.c:112
+msgid "UNMODIFIABLE form password. Use UP or DOWN arrows or tab to move off."
+msgstr "NICHTVERÄNDERBARES Form-Passwort. Rauf- und Runter-Pfeiltasten zum Verlassen."
+
+#. #define FORM_LINK_CHECKBOX_ADV_MSG
+#: LYMessages.c:114
+#, c-format
+msgid "(Checkbox \"%s\"); Use right-arrow or <return> to toggle."
+msgstr "(Checkbox-Feld »%s«); Ein-/Ausschalten mit rechter Pfeiltaste oder <Enter>."
+
+#. #define FORM_LINK_CHECKBOX_MESSAGE
+#: LYMessages.c:116
+msgid "(Checkbox Field) Use right-arrow or <return> to toggle."
+msgstr "(Checkbox-Feld) Ein-/Ausschalten mit rechter Pfeiltaste oder <Enter>."
+
+#. #define FORM_LINK_CHECKBOX_UNM_MSG
+#: LYMessages.c:118
+msgid "UNMODIFIABLE form checkbox. Use UP or DOWN arrows or tab to move off."
+msgstr "NICHTVERÄNDERBARE Form-Checkbox. Auf- oder Ab-Pfeiltaste oder TAB zum Verlassen."
+
+#. #define FORM_LINK_RADIO_ADV_MSG
+#: LYMessages.c:120
+#, c-format
+msgid "(Radio Button \"%s\"); Use right-arrow or <return> to toggle."
+msgstr "(Radiotaste »%s«); Ein-/Ausschalten mit rechter Pfeiltaste oder <Enter>."
+
+#. #define FORM_LINK_RADIO_MESSAGE
+#: LYMessages.c:122
+msgid "(Radio Button) Use right-arrow or <return> to toggle."
+msgstr "(Radiotaste) Ein-/Ausschalten mit rechter Pfeiltaste oder <return>."
+
+#. #define FORM_LINK_RADIO_UNM_MSG
+#: LYMessages.c:124
+msgid "UNMODIFIABLE form radio button. Use UP or DOWN arrows or tab to move off."
+msgstr "NICHTVERÄNDERBARE Form-Radiotaste. Auf- oder Ab-Pfeiltaste oder TAB zum Verlassen."
+
+#. #define FORM_LINK_SUBMIT_PREFIX
+#: LYMessages.c:126
+msgid "Submit ('x' for no cache) to "
+msgstr "Eingabe: Schicken ('x': ohne Cache) zu "
+
+#. #define FORM_LINK_RESUBMIT_PREFIX
+#: LYMessages.c:128
+msgid "Submit to "
+msgstr "Eingabe: Schicken zu "
+
+#. #define FORM_LINK_SUBMIT_MESSAGE
+#: LYMessages.c:130
+msgid "(Form submit button) Use right-arrow or <return> to submit ('x' for no cache)."
+msgstr "(Form-Submit-Button) Rechter Pfeiltaste / <return>: Schicken ('x': ohne Cache)"
+
+#. #define FORM_LINK_RESUBMIT_MESSAGE
+#: LYMessages.c:132
+msgid "(Form submit button) Use right-arrow or <return> to submit."
+msgstr "(Formular-Abschick-Schaltfläche) Rechte Pfeiltaste oder <Enter> zum Abschicken."
+
+#. #define FORM_LINK_SUBMIT_DIS_MSG
+#: LYMessages.c:134
+msgid "DISABLED form submit button. Use UP or DOWN arrows or tab to move off."
+msgstr "\\AUSGESCHALTETER Form-Submit-Button. Rechter Pfeiltaste / <return> zum Verlassen."
+
+#. #define FORM_LINK_SUBMIT_MAILTO_PREFIX
+#: LYMessages.c:136
+msgid "Submit mailto form to "
+msgstr "Eingabe: Mailto-Form schicken an "
+
+#. #define FORM_LINK_SUBMIT_MAILTO_MSG
+#: LYMessages.c:138
+msgid "(mailto form submit button) Use right-arrow or <return> to submit."
+msgstr "(Mailto-Form-Submit-Button) Rechte Pfeiltaste oder <return>: Abschicken."
+
+#. #define FORM_LINK_SUBMIT_MAILTO_DIS_MSG
+#: LYMessages.c:140
+msgid "(mailto form submit button) Mail is disallowed so you cannot submit."
+msgstr "(Mailto-Form-Submit-Button) Schicken nicht möglich, da Mail nicht erlaubt ist."
+
+#. #define FORM_LINK_RESET_MESSAGE
+#: LYMessages.c:142
+msgid "(Form reset button) Use right-arrow or <return> to reset form to defaults."
+msgstr "(Form-Resetbutton) Rechter Pfeiltaste / <return>: zu Ausgangszustand zurücksetzen."
+
+#. #define FORM_LINK_RESET_DIS_MSG
+#: LYMessages.c:144
+msgid "DISABLED form reset button. Use UP or DOWN arrows or tab to move off."
+msgstr "AUSGESCHALTETER Form-Resetbutton. Auf- und Ab-Pfeiltasten oder TAB zum Verlassen."
+
+#. #define FORM_LINK_BUTTON_MESSAGE
+#: LYMessages.c:146
+msgid "(Script button) Use UP or DOWN arrows or tab to move off."
+msgstr "(Script-Button) Benutze Pfeiltaste nach oben/unte oder TAB um weiterzugehen."
+
+#. #define FORM_LINK_BUTTON_ADV_MSG
+#: LYMessages.c:148
+#, c-format
+msgid "(Script button \"%s\"); Use UP or DOWN arrows or tab to move off."
+msgstr "(Script-Button »%s«); Zum Verlassen Pfeil-Hoch, Pfeil-Runter oder Tab drücken."
+
+#. #define FORM_LINK_BUTTON_DIS_MSG
+#: LYMessages.c:150
+msgid "DISABLED Script button. Use UP or DOWN arrows or tab to move off."
+msgstr "AUSGESCHALTETER Script-Button; zum Verlassen Pfeil-Hoch, Pfeil-Runter oder Tab drücken."
+
+#. #define FORM_LINK_OPTION_LIST_ADV_MSG
+#: LYMessages.c:152
+#, c-format
+msgid "(Option list \"%s\"); Hit return to select option."
+msgstr "(Auswahlliste »%s«); zum Auswählen Enter drücken."
+
+#. #define FORM_LINK_OPTION_LIST_MESSAGE
+#: LYMessages.c:154
+msgid "(Option list) Hit return and use arrow keys and return to select option."
+msgstr "(Optionsliste) Eingabetaste drücken und Pfeiltasten zur Optionswahl werwenden."
+
+#. #define CHOICE_LIST_ADV_MSG
+#: LYMessages.c:156
+#, c-format
+msgid "(Choice entry \"%s\"); Use arrow keys and return to select option."
+msgstr "(Auswahlliste »%s«); zum Auswählen Pfeiltasten und Enter drücken."
+
+#. #define CHOICE_LIST_MESSAGE
+#: LYMessages.c:158
+msgid "(Choice list) Hit return and use arrow keys and return to select option."
+msgstr "(Auswahlliste) Eingabetaste drücken und Pfeiltasten zur Optionswahl werwenden."
+
+#. #define MOUSE_CHOICE_MESSAGE
+#: LYMessages.c:160
+msgid "Left mouse button or return to select, arrow keys to scroll."
+msgstr "RETURN oder linke Maustaste wählt aus, Pfeiltasten zum Auf- und Abbewegen."
+
+#. #define FORM_LINK_OPTION_LIST_UNM_MSG
+#: LYMessages.c:162
+msgid "UNMODIFIABLE option list. Use return or arrow keys to review or leave."
+msgstr "NICHTVERÄNDERBARE Optionsliste. Eingabetaste / Pfeile zum Ansehen / Verlassen."
+
+#. #define CHOICE_LIST_UNM_MSG
+#: LYMessages.c:164
+msgid "UNMODIFIABLE choice list. Use return or arrow keys to review or leave."
+msgstr "NICHTVERÄNDERBARE Auswahlliste. Eingabetaste / Pfeile zum Ansehen / Verlassen."
+
+#: LYMessages.c:165
+msgid "Submitting form..."
+msgstr "Form wird geschickt..."
+
+#: LYMessages.c:166
+msgid "Resetting form..."
+msgstr "Form wird zurückgesetzt..."
+
+#. #define RELOADING_FORM
+#: LYMessages.c:168
+msgid "Reloading document. Any form entries will be lost!"
+msgstr "Dokument wird nachgeladen. Alle Formeingaben gehen verloren!"
+
+#. #define LINK_NOT_IN_FORM
+#: LYMessages.c:170
+msgid "The current link is not in a FORM"
+msgstr "Der aktuelle Link ist nicht in einem Form"
+
+#: LYMessages.c:171
+#, c-format
+msgid "Warning: Cannot transcode form data to charset %s!"
+msgstr "Warnung: Formdaten können nicht in Zeichensatz %s übersetzt werden!"
+
+#. #define NORMAL_LINK_MESSAGE
+#: LYMessages.c:174
+msgid "(NORMAL LINK) Use right-arrow or <return> to activate."
+msgstr "(NORMALER LINK) Rechte Pfeiltaste oder <return> zum Aktivieren verwenden."
+
+#: LYMessages.c:175
+msgid "The resource requested is not available at this time."
+msgstr "Angeforderte Ressource ist zurzeit nicht verfügbar."
+
+#: LYMessages.c:176
+msgid "Enter Lynx keystroke command: "
+msgstr "Lynx-Tastenbefehl eingeben: "
+
+#: LYMessages.c:177
+msgid "Looking up "
+msgstr "Suche nach "
+
+#: LYMessages.c:178
+#, c-format
+msgid "Getting %s"
+msgstr "%s wird geholt"
+
+#: LYMessages.c:179
+#, c-format
+msgid "Skipping %s"
+msgstr "%s wird übersprungen"
+
+#: LYMessages.c:180
+#, c-format
+msgid "Using %s"
+msgstr "Umgeleitet nach %s"
+
+#: LYMessages.c:181
+#, c-format
+msgid "Illegal URL: %s"
+msgstr "Ungültiger URL: %s"
+
+#: LYMessages.c:182
+#, c-format
+msgid "Badly formed address %s"
+msgstr "Fehlgestaltete Adresse %s"
+
+#: LYMessages.c:183
+#, c-format
+msgid "URL: %s"
+msgstr "URL: %s"
+
+#: LYMessages.c:184
+msgid "Unable to access WWW file!!!"
+msgstr "Zugriff auf die WWW-Datei ist nicht möglich!"
+
+#: LYMessages.c:185
+#, c-format
+msgid "This is a searchable index. Use %s to search."
+msgstr "Abfragbarer Index. Suchbegriff kann mit %s eingegeben werden."
+
+#. #define WWW_INDEX_MORE_MESSAGE
+#: LYMessages.c:187
+#, c-format
+msgid "--More-- This is a searchable index. Use %s to search."
+msgstr "--Mehr -- Abfragbarer Index. Suchbegriff kann mit %s eingegeben werden."
+
+#: LYMessages.c:188
+msgid "You have entered an invalid link number."
+msgstr "Ungültige Link-Nummer."
+
+#. #define SOURCE_HELP
+#: LYMessages.c:190
+msgid "Currently viewing document source. Press '\\' to return to rendered version."
+msgstr "Quelltext des Dokuments wird gezeigt. Rückkehr zur Normaldarstellung mit '\\'."
+
+#. #define NOVICE_LINE_ONE
+#: LYMessages.c:192
+msgid " Arrow keys: Up and Down to move. Right to follow a link; Left to go back. \n"
+msgstr " Pfeiltasten: Auf/Ab: andere Seite im Text. Rechts: Verweis folgen; Links: zurück.\n"
+
+# Used if lynx.cfg does NOT contain KEYMAP for TOGGLE_HELP, default.
+#. #define NOVICE_LINE_TWO
+#: LYMessages.c:194
+msgid " H)elp O)ptions P)rint G)o M)ain screen Q)uit /=search [delete]=history list \n"
+msgstr " H)ilfe O)ptionen P) Druck G)ehe zu M) Hauptseite Q) Beenden [/]=Suche [Löschen]=Verlauf\n"
+
+# Only used if lynx.cfg contains KEYMAP for TOGGLE_HELP.
+#. #define NOVICE_LINE_TWO_A
+#: LYMessages.c:196
+msgid " O)ther cmds H)elp K)eymap G)oto P)rint M)ain screen o)ptions Q)uit \n"
+msgstr ""
+" O: andere Befehle H: Hilfe K: Tastenbelegung G: Gehe zu\n"
+" P: Drucken M: Hauptseite o: Optionen Q: Beenden\n"
+
+# Only used if lynx.cfg contains KEYMAP for TOGGLE_HELP.
+#. #define NOVICE_LINE_TWO_B
+#: LYMessages.c:198
+msgid " O)ther cmds B)ack E)dit D)ownload ^R)eload ^W)ipe screen search doc: / \n"
+msgstr ""
+" O: Andere Befehle B: Zurück E: Editieren D: Download\n"
+" ^R: Neu laden ^W: Auffrischen /: Suche im Text\n"
+
+# Only used if lynx.cfg contains KEYMAP for TOGGLE_HELP.
+#. #define NOVICE_LINE_TWO_C
+#: LYMessages.c:200
+msgid "O)ther cmds C)omment History: <backspace> Bookmarks: V)iew, A)dd, R)emove \n"
+msgstr ""
+"O: Andere Befehle C: Kommentar Entfernen: History\n"
+"Lesezeichen: V: Ansehen A: Hinzufügen R) Löschen\n"
+
+#. #define FORM_NOVICELINE_ONE
+#: LYMessages.c:202
+msgid " Enter text into the field by typing on the keyboard "
+msgstr " Normale Tasten für Texteingabe verwenden. "
+
+#. #define FORM_NOVICELINE_TWO
+#: LYMessages.c:204
+msgid " Ctrl-U to delete all text in field, [Backspace] to delete a character "
+msgstr " Ctrl-U zum Löschen des ganzen Texts in einem Feld, [Entf] um einen Buchstaben zu löschen "
+
+#. #define FORM_NOVICELINE_TWO_DELBL
+#: LYMessages.c:206
+msgid " Ctrl-U to delete text in field, [Backspace] to delete a character "
+msgstr " Ctrl-U zum Löschen von Text in einem Feld, [Entf] um einen Buchstaben zu löschen "
+
+#. #define FORM_NOVICELINE_TWO_VAR
+#: LYMessages.c:208
+#, c-format
+msgid " %s to delete all text in field, [Backspace] to delete a character "
+msgstr " %s zum Löschen des Textes in einem Feld, [Entf] um einen Buchstaben zu löschen "
+
+#. #define FORM_NOVICELINE_TWO_DELBL_VAR
+#: LYMessages.c:210
+#, c-format
+msgid " %s to delete text in field, [Backspace] to delete a character "
+msgstr " %s zum Löschen des Textes in einem Feld, [Entf] um einen Buchstaben zu löschen "
+
+#. mailto
+#: LYMessages.c:213
+msgid "Malformed mailto form submission! Cancelled!"
+msgstr "Fehlerhafte mailto-Form, kann nicht gesandt werden!"
+
+#: LYMessages.c:214
+msgid "Warning! Control codes in mail address replaced by ?"
+msgstr "Warnung! Steuerzeichen in Mailadresse durch ? ersetzt"
+
+#: LYMessages.c:215
+msgid "Mail disallowed! Cannot submit."
+msgstr "Mail ist nicht erlaubt! Kann nicht gesandt werden."
+
+#: LYMessages.c:216
+msgid "Mailto form submission failed!"
+msgstr "Senden der mailto-Formdaten fehlgeschlagen!"
+
+#: LYMessages.c:217
+msgid "Mailto form submission Cancelled!!!"
+msgstr "Senden der mailto-Form abgebrochen!!!"
+
+#: LYMessages.c:218
+msgid "Sending form content..."
+msgstr "Formdaten werden gesandt..."
+
+#: LYMessages.c:219
+msgid "No email address is present in mailto URL!"
+msgstr "Die mailto-URL enthält keine Mailadresse!"
+
+#. #define MAILTO_URL_TEMPOPEN_FAILED
+#: LYMessages.c:221
+msgid "Unable to open temporary file for mailto URL!"
+msgstr "Temporäre Datei für Mailto-URL konnte nicht geöffnet werden!"
+
+#. #define INC_ORIG_MSG_PROMPT
+#: LYMessages.c:223
+msgid "Do you wish to include the original message?"
+msgstr "Soll der Originaltext eingefügt werden?"
+
+#. #define INC_PREPARSED_MSG_PROMPT
+#: LYMessages.c:225
+msgid "Do you wish to include the preparsed source?"
+msgstr "Soll der vorverarbeitete Quelltext eingefügt werden?"
+
+#. #define SPAWNING_EDITOR_FOR_MAIL
+#: LYMessages.c:227
+msgid "Spawning your selected editor to edit mail message"
+msgstr "Der ausgewählte Editor wird zur Erstellen der E-Mail gestartet"
+
+#. #define ERROR_SPAWNING_EDITOR
+#: LYMessages.c:229
+msgid "Error spawning editor, check your editor definition in the options menu"
+msgstr "Editor nicht gestartet, bitte Einstellung im Options-Menü überprüfen"
+
+#: LYMessages.c:230
+msgid "Send this comment?"
+msgstr "Kommentar abschicken?"
+
+#: LYMessages.c:231
+msgid "Send this message?"
+msgstr "Mail abschicken?"
+
+#: LYMessages.c:232
+msgid "Sending your message..."
+msgstr "Mail wird gesandt..."
+
+#: LYMessages.c:233
+msgid "Sending your comment:"
+msgstr "Nachricht wird gesandt:"
+
+#. textarea
+#: LYMessages.c:236
+msgid "Not in a TEXTAREA; cannot use external editor."
+msgstr "Nicht in einem TEXTAREA-Bereich; externer Editor ist hier nicht möglich."
+
+#: LYMessages.c:237
+msgid "Not in a TEXTAREA; cannot use command."
+msgstr "Nicht in einem TEXTAREA-Bereich; Befehl ist hier nicht anwendbar."
+
+#: LYMessages.c:239
+msgid "file: ACTIONs are disallowed!"
+msgstr "\"file\"-URLs sind nicht als Form-ACTION erlaubt!"
+
+#. #define FILE_SERVED_LINKS_DISALLOWED
+#: LYMessages.c:241
+msgid "file: URLs via served links are disallowed!"
+msgstr "Aktivierung von \"file\"-URLs von externen Links aus ist nicht erlaubt!"
+
+#: LYMessages.c:242
+msgid "Access to local files denied."
+msgstr "Zugang zu lokalen Dateien nicht gestattet."
+
+#: LYMessages.c:243
+msgid "file: URLs via bookmarks are disallowed!"
+msgstr "\"file\"-URLs sind von Lesezeichen aus nicht erlaubt!"
+
+#. #define SPECIAL_VIA_EXTERNAL_DISALLOWED
+#: LYMessages.c:245
+msgid "This special URL is not allowed in external documents!"
+msgstr "Dieser spezielle URLs ist von externen Dokumenten aus nicht erlaubt!"
+
+#: LYMessages.c:246
+msgid "Press <return> to return to Lynx."
+msgstr "Zurück zu Lynx mit Eingabetaste."
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:249
+msgid "Spawning DCL subprocess. Use 'logout' to return to Lynx.\n"
+msgstr "DCL-Unterprozess wird gestartet. Rückkehr zu Lynx mit 'logout'.\n"
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:253
+msgid "Type EXIT to return to Lynx.\n"
+msgstr "Für Rückkehr zu Lynx EXIT eingeben.\n"
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:256
+msgid "Spawning your default shell. Use 'exit' to return to Lynx.\n"
+msgstr "Default Shell wird gestartet, für Rückkehr zu Lynx 'exit' eingeben.\n"
+
+#: LYMessages.c:259
+msgid "Spawning is currently disabled."
+msgstr "Starten von Unterprozessen zurzeit nicht ermöglicht."
+
+#: LYMessages.c:260
+msgid "The 'd'ownload command is currently disabled."
+msgstr "Das Kommando 'd'ownload ist zurzeit nicht gestattet."
+
+#: LYMessages.c:261
+msgid "You cannot download an input field."
+msgstr "Download von Eingabefeldern ist nicht möglich."
+
+#: LYMessages.c:262
+msgid "Form has a mailto action! Cannot download."
+msgstr "Diese Form verlangt eine mailto-Aktion! Download unmöglich."
+
+#: LYMessages.c:263
+msgid "You cannot download a mailto: link."
+msgstr "Download unmöglich für mailto-Link."
+
+#: LYMessages.c:264
+msgid "You cannot download cookies."
+msgstr "Download unmöglich für Kekse."
+
+#: LYMessages.c:265
+msgid "You cannot download a printing option."
+msgstr "Download unmöglich für Druckoption."
+
+#: LYMessages.c:266
+msgid "You cannot download an upload option."
+msgstr "Download unmöglich für Upload-Option."
+
+#: LYMessages.c:267
+msgid "You cannot download an permit option."
+msgstr "Download unmöglich für Berechtigungsoption."
+
+#: LYMessages.c:268
+msgid "This special URL cannot be downloaded!"
+msgstr "Download unmöglich für diesen speziellen URL!"
+
+#: LYMessages.c:269
+msgid "Nothing to download."
+msgstr "Nichts runterzuladen."
+
+#: LYMessages.c:270
+msgid "Trace ON!"
+msgstr "Trace EIN!"
+
+#: LYMessages.c:271
+msgid "Trace OFF!"
+msgstr "Trace AUS!"
+
+#. #define CLICKABLE_IMAGES_ON
+#: LYMessages.c:273
+msgid "Links will be included for all images! Reloading..."
+msgstr "Links für alle Bilder werden eingefügt! Neuladen..."
+
+#. #define CLICKABLE_IMAGES_OFF
+#: LYMessages.c:275
+msgid "Standard image handling restored! Reloading..."
+msgstr "Wiederaufnahme der normalen Bildbehandlung! Neuladen..."
+
+#. #define PSEUDO_INLINE_ALTS_ON
+#: LYMessages.c:277
+msgid "Pseudo_ALTs will be inserted for inlines without ALT strings! Reloading..."
+msgstr "Pseudo-ALTs werden für alle Inlinebilder ohne ALT-Attribut eingefügt! Neuladen..."
+
+#. #define PSEUDO_INLINE_ALTS_OFF
+#: LYMessages.c:279
+msgid "Inlines without an ALT string specified will be ignored! Reloading..."
+msgstr "Inlinebilder ohne ALT-Attribut werden jetzt ignoriert! Neuladen..."
+
+#: LYMessages.c:280
+msgid "Raw 8-bit or CJK mode toggled OFF! Reloading..."
+msgstr "Raw 8-bit or CJK mode eingeschaltet! Reloading..."
+
+#: LYMessages.c:281
+msgid "Raw 8-bit or CJK mode toggled ON! Reloading..."
+msgstr "Raw 8-bit or CJK mode ausgeschaltet! Reloading..."
+
+#. #define HEAD_D_L_OR_CANCEL
+#: LYMessages.c:283
+msgid "Send HEAD request for D)ocument or L)ink, or C)ancel? (d,l,c): "
+msgstr "HEAD-Anforderung für D)okument oder L)link senden, oder Abbrec)hen? (d,l,c): "
+
+#. #define HEAD_D_OR_CANCEL
+#: LYMessages.c:285
+msgid "Send HEAD request for D)ocument, or C)ancel? (d,c): "
+msgstr "HEAD-Anforderung für D)okument senden, oder Abbrec)hen? (d,c): "
+
+#: LYMessages.c:286
+msgid "Sorry, the document is not an http URL."
+msgstr "Sorry, das Dokument ist kein http-URL."
+
+#: LYMessages.c:287
+msgid "Sorry, the link is not an http URL."
+msgstr "Sorry, der Link ist kein http-URL."
+
+#: LYMessages.c:288
+msgid "Sorry, the ACTION for this form is disabled."
+msgstr "Sorry, die ACTION für diese Form ist \"disabled\"."
+
+#. #define FORM_ACTION_NOT_HTTP_URL
+#: LYMessages.c:290
+msgid "Sorry, the ACTION for this form is not an http URL."
+msgstr "Sorry, die ACTION für diese Form ist kein HTTP-URL."
+
+#: LYMessages.c:291
+msgid "Not an http URL or form ACTION!"
+msgstr "Dies ist weder ein http-URL noch eine Form-ACTION!"
+
+#: LYMessages.c:292
+msgid "This special URL cannot be a form ACTION!"
+msgstr "Dieser spezielle URL ist nicht möglich als Form-ACTION!"
+
+#: LYMessages.c:293
+msgid "URL is not in starting realm!"
+msgstr "URL ist nicht im erlaubten Start-Bereich!"
+
+#: LYMessages.c:294
+msgid "News posting is disabled!"
+msgstr "News-Posting nicht aktiviert!"
+
+#: LYMessages.c:295
+msgid "File management support is disabled!"
+msgstr "Dired-Unterstützung für Dateimanagement ist ausgeschaltet!"
+
+#: LYMessages.c:296
+msgid "No jump file is currently available."
+msgstr "Eine Sprungdatei (jump file) ist zurzeit nicht erhältlich."
+
+#: LYMessages.c:297
+msgid "Jump to (use '?' for list): "
+msgstr "Sprung zu URL ('?' für Auswahlliste): "
+
+#: LYMessages.c:298
+msgid "Jumping to a shortcut URL is disallowed!"
+msgstr "Abgekürzter URL-Sprung ist nicht erlaubt!"
+
+#: LYMessages.c:299
+msgid "Random URL is disallowed! Use a shortcut."
+msgstr "Eingabe von beliebigen URLs nicht erlaubt! Bitte URL-Sprung benutzen."
+
+#: LYMessages.c:300
+msgid "No random URLs have been used thus far."
+msgstr "\"Go\"-URLs noch nicht benutzt."
+
+#: LYMessages.c:301
+msgid "Bookmark features are currently disabled."
+msgstr "Lesezeichen zurzeit ausgeschaltet."
+
+#: LYMessages.c:302
+msgid "Execution via bookmarks is disabled."
+msgstr "Ausführen von Befehlen ist hier nicht erlaubt."
+
+#. #define BOOKMARK_FILE_NOT_DEFINED
+#: LYMessages.c:304
+#, c-format
+msgid "Bookmark file is not defined. Use %s to see options."
+msgstr "Lesezeichendatei nicht definiert. Siehe Optionseinstellungen (Taste %s)."
+
+#. #define NO_TEMP_FOR_HOTLIST
+#: LYMessages.c:306
+msgid "Unable to open tempfile for X Mosaic hotlist conversion."
+msgstr "Temporärdatei für Mosaic-Hotlistenumwandlung kann nicht geöffnet werden."
+
+#: LYMessages.c:307
+msgid "ERROR - unable to open bookmark file."
+msgstr "FEHLER - Lesemarken-Datei kann nicht geöffnet werden."
+
+#. #define BOOKMARK_OPEN_FAILED_FOR_DEL
+#: LYMessages.c:309
+msgid "Unable to open bookmark file for deletion of link."
+msgstr "Lesezeichendatei kann nicht zum Linkentfernen geöffnet werden."
+
+#. #define BOOKSCRA_OPEN_FAILED_FOR_DEL
+#: LYMessages.c:311
+msgid "Unable to open scratch file for deletion of link."
+msgstr "Scratchdatei kann nicht zum Linkentfernen geöffnet werden."
+
+#: LYMessages.c:313
+msgid "Error renaming scratch file."
+msgstr "Umbenennung einer Scratchdatei fehlgeschlagen."
+
+#: LYMessages.c:315
+msgid "Error renaming temporary file."
+msgstr "Umbenennung einer temporären Datei fehlgeschlagen."
+
+#. #define BOOKTEMP_COPY_FAIL
+#: LYMessages.c:317
+msgid "Unable to copy temporary file for deletion of link."
+msgstr "Temporäre Datei für das Linkentfernen kann nicht geöffnet werden."
+
+#. #define BOOKTEMP_REOPEN_FAIL_FOR_DEL
+#: LYMessages.c:319
+msgid "Unable to reopen temporary file for deletion of link."
+msgstr "Temporäre Datei für das Linkentfernen kann nicht wiedergeöffnet werden."
+
+#. #define BOOKMARK_LINK_NOT_ONE_LINE
+#: LYMessages.c:322
+msgid "Link is not by itself all on one line in bookmark file."
+msgstr "Link steht nicht allein in einer Zeile in der Lesezeichendatei."
+
+#: LYMessages.c:323
+msgid "Bookmark deletion failed."
+msgstr "Löschen des Lesezeicheneintrags fehlgeschlagen."
+
+#. #define BOOKMARKS_NOT_TRAVERSED
+#: LYMessages.c:325
+msgid "Bookmark files cannot be traversed (only http URLs)."
+msgstr "Traversal ist für Lesezeichendateien nicht erlaubt, nur für HTTP-URLs."
+
+#. #define BOOKMARKS_NOT_OPEN
+#: LYMessages.c:327
+msgid "Unable to open bookmark file, use 'a' to save a link first"
+msgstr "Lesezeichendatei kann nicht gelesen werden, erst mit 'a' einen Link speichern"
+
+#: LYMessages.c:328
+msgid "There are no links in this bookmark file!"
+msgstr "Diese Lesezeichendatei hat keine Einträge!"
+
+#. #define CACHE_D_OR_CANCEL
+#: LYMessages.c:330
+msgid "D)elete cached document or C)ancel? (d,c): "
+msgstr "Zwischengespeichertes Dokument löschen (D) oder Abbrechen (C): "
+
+#. #define BOOK_D_L_OR_CANCEL
+#: LYMessages.c:332
+msgid "Save D)ocument or L)ink to bookmark file or C)ancel? (d,l,c): "
+msgstr "Aktuelles D)okument oder L)ink als Lesezeichen speichern oder abbrec)hen? (d,l,c): "
+
+#: LYMessages.c:333
+msgid "Save D)ocument to bookmark file or C)ancel? (d,c): "
+msgstr "D)okument als Lesezeichen speichern oder abbreC)hen? (d,c): "
+
+#: LYMessages.c:334
+msgid "Save L)ink to bookmark file or C)ancel? (l,c): "
+msgstr "L)ink als Lesezeichen speichern oder abbre(C)hen? (l,c): "
+
+#. #define NOBOOK_POST_FORM
+#: LYMessages.c:336
+msgid "Documents from forms with POST content cannot be saved as bookmarks."
+msgstr "Anlegen von Lesezeichen für Dokumente mit POST-Formdaten nicht möglich."
+
+#: LYMessages.c:337
+msgid "Cannot save form fields/links"
+msgstr "Form-Eingabefelder können nicht gespeichert werden"
+
+#. #define NOBOOK_HSML
+#: LYMessages.c:339
+msgid "History, showinfo, menu and list files cannot be saved as bookmarks."
+msgstr "Lesezeichen für History-, Info-, Menü- und Listendateien nicht möglich."
+
+#. #define CONFIRM_BOOKMARK_DELETE
+#: LYMessages.c:341
+msgid "Do you really want to delete this link from your bookmark file?"
+msgstr "Diesen Link wirklich aus Lesezeichendatei entfernen?"
+
+#: LYMessages.c:342
+msgid "Malformed address."
+msgstr "Fehlgeformte Adresse."
+
+#. #define HISTORICAL_ON_MINIMAL_OFF
+#: LYMessages.c:344
+msgid "Historical comment parsing ON (Minimal is overridden)!"
+msgstr "Historische Kommentarerkennung EIN (Minimalmodus AUS)!"
+
+#. #define HISTORICAL_OFF_MINIMAL_ON
+#: LYMessages.c:346
+msgid "Historical comment parsing OFF (Minimal is in effect)!"
+msgstr "Historische Kommentarerkennung AUS (Minimalmodus EIN)!"
+
+#. #define HISTORICAL_ON_VALID_OFF
+#: LYMessages.c:348
+msgid "Historical comment parsing ON (Valid is overridden)!"
+msgstr "Historisches Kommentarparsing EIN (richtige Methode AUS)!"
+
+#. #define HISTORICAL_OFF_VALID_ON
+#: LYMessages.c:350
+msgid "Historical comment parsing OFF (Valid is in effect)!"
+msgstr "Historisches Kommentarparsing AUS (richtige Methode EIN)!"
+
+#. #define MINIMAL_ON_IN_EFFECT
+#: LYMessages.c:352
+msgid "Minimal comment parsing ON (and in effect)!"
+msgstr "Minimale Kommentarerkennung EIN (und in Effekt)!"
+
+#. #define MINIMAL_OFF_VALID_ON
+#: LYMessages.c:354
+msgid "Minimal comment parsing OFF (Valid is in effect)!"
+msgstr "Minimale Kommentarerkennung AUS (richtige Methode ist in Effekt)!"
+
+#. #define MINIMAL_ON_BUT_HISTORICAL
+#: LYMessages.c:356
+msgid "Minimal comment parsing ON (but Historical is in effect)!"
+msgstr "Minimale Kommentarerkennung EIN (aber geändert durch \"historisch\")!"
+
+#. #define MINIMAL_OFF_HISTORICAL_ON
+#: LYMessages.c:358
+msgid "Minimal comment parsing OFF (Historical is in effect)!"
+msgstr "Minimale Kommentarerkennung AUS (historische Methode ist in Effekt)!"
+
+#: LYMessages.c:359
+msgid "Soft double-quote parsing ON!"
+msgstr "Soft double-quote parsing EIN!"
+
+#: LYMessages.c:360
+msgid "Soft double-quote parsing OFF!"
+msgstr "Soft double-quote parsing AUS!"
+
+#: LYMessages.c:361
+msgid "Now using TagSoup parsing of HTML."
+msgstr "Von nun an \"TagSoup\"-Parsing für HTML."
+
+#: LYMessages.c:362
+msgid "Now using SortaSGML parsing of HTML!"
+msgstr "Von nun an \"SortaSGML\"-Parsing für HTML!"
+
+#: LYMessages.c:363
+msgid "You are already at the end of this document."
+msgstr "Schon am Ende."
+
+#: LYMessages.c:364
+msgid "You are already at the beginning of this document."
+msgstr "Schon am Anfang."
+
+#: LYMessages.c:365
+#, c-format
+msgid "You are already at page %d of this document."
+msgstr "Schon auf Seite %d in diesem Dokument."
+
+#: LYMessages.c:366
+#, c-format
+msgid "Link number %d already is current."
+msgstr "Schon auf Link-Nummer %d."
+
+#: LYMessages.c:367
+msgid "You are already at the first document"
+msgstr "Schon im ersten Dokument"
+
+#: LYMessages.c:368
+msgid "There are no links above this line of the document."
+msgstr "Keine Links mehr vor dieser Zeile."
+
+#: LYMessages.c:369
+msgid "There are no links below this line of the document."
+msgstr "Keine Links mehr nach dieser Zeile."
+
+#. #define MAXLEN_REACHED_DEL_OR_MOV
+#: LYMessages.c:371
+msgid "Maximum length reached! Delete text or move off field."
+msgstr "Maximale Länge erreicht! Text löschen oder Feld verlassen."
+
+#. #define NOT_ON_SUBMIT_OR_LINK
+#: LYMessages.c:373
+msgid "You are not on a form submission button or normal link."
+msgstr "Kein Formaktivierungsbutton oder normaler Link gewählt."
+
+#. #define NEED_CHECKED_RADIO_BUTTON
+#: LYMessages.c:375
+msgid "One radio button must be checked at all times!"
+msgstr "Eine von den Radiotasten muss immer markiert sein!"
+
+#: LYMessages.c:376
+msgid "No submit button for this form, submit single text field?"
+msgstr "Kein Abschicken-Knopf für dieses Formular, einzelnes Textfeld abschicken?"
+
+#: LYMessages.c:377
+msgid "Do you want to go back to the previous document?"
+msgstr "Zurück zum vorherigen Dokument?"
+
+#: LYMessages.c:378
+msgid "Use arrows or tab to move off of field."
+msgstr "Form-Eingabefelder können mit Pfeil- oder Tabulatortasten verlassen werden."
+
+#. #define ENTER_TEXT_ARROWS_OR_TAB
+#: LYMessages.c:380
+msgid "Enter text. Use arrows or tab to move off of field."
+msgstr "Text Eingeben, Feld kann mit Pfeil- or Tabulatortasten verlassen werden."
+
+#: LYMessages.c:381
+msgid "** Bad HTML!! No form action defined. **"
+msgstr "** Bad HTML!! Keine Form-Aktion definiert. **"
+
+#: LYMessages.c:382
+msgid "Bad HTML!! Unable to create popup window!"
+msgstr "Bad HTML!! Popup-Fenster kann nicht erzeugt werden!"
+
+#: LYMessages.c:383
+msgid "Unable to create popup window!"
+msgstr "Popup-Fenster kann nicht erzeugt werden!"
+
+#: LYMessages.c:384
+msgid "Goto a random URL is disallowed!"
+msgstr "Das Gehen zu beliebigen URLs ist nicht erlaubt!"
+
+#: LYMessages.c:385
+msgid "Goto a non-http URL is disallowed!"
+msgstr "Das Gehen zu anderen als http-URLs ist nicht erlaubt!"
+
+#: LYMessages.c:386
+#, c-format
+msgid "You are not allowed to goto \"%s\" URLs"
+msgstr "Das Gehen zu \"%s\"-URLs ist nicht erlaubt"
+
+#: LYMessages.c:387
+msgid "URL to open: "
+msgstr "Neuer URL: "
+
+#: LYMessages.c:388
+msgid "Edit the current Goto URL: "
+msgstr "Jetziger URL: "
+
+#: LYMessages.c:389
+msgid "Edit the previous Goto URL: "
+msgstr "Letzter URL: "
+
+#: LYMessages.c:390
+msgid "Edit a previous Goto URL: "
+msgstr "Früherer URL: "
+
+#: LYMessages.c:391
+msgid "Current document has POST data."
+msgstr "Das aktuelle Dokument ist mit POST-Daten verbunden."
+
+#: LYMessages.c:392
+msgid "Edit this document's URL: "
+msgstr "URL des gegenwärtigen Dokuments: "
+
+#: LYMessages.c:393
+msgid "Edit the current link's URL: "
+msgstr "URL dieses Links: "
+
+#: LYMessages.c:394
+msgid "Edit the form's submit-URL: "
+msgstr "Bearbeite die Form-Submit-URL:: "
+
+#: LYMessages.c:395
+msgid "You cannot edit File Management URLs"
+msgstr "Editieren von Dateimanagement-URLs (Dired-URLs) ist nicht möglich"
+
+#: LYMessages.c:396
+msgid "Enter a database query: "
+msgstr "Datenbankabfrage eingeben: "
+
+#: LYMessages.c:397
+msgid "Enter a whereis query: "
+msgstr "Suche in gegenwärtigen Dokument: "
+
+#: LYMessages.c:398
+msgid "Edit the current query: "
+msgstr "Suche ändern: "
+
+#: LYMessages.c:399
+msgid "Edit the previous query: "
+msgstr "Letzte Suche ändern: "
+
+#: LYMessages.c:400
+msgid "Edit a previous query: "
+msgstr "Vorherige Suche ändern: "
+
+#. #define USE_C_R_TO_RESUB_CUR_QUERY
+#: LYMessages.c:402
+msgid "Use Control-R to resubmit the current query."
+msgstr "Wiederholung der gegenwärtigen Abfrage kann mit ^R erzwungen werden."
+
+#: LYMessages.c:403
+msgid "Edit the current shortcut: "
+msgstr "Abgekürzter Sprung (Jump): "
+
+#: LYMessages.c:404
+msgid "Edit the previous shortcut: "
+msgstr "Letzter abgekürzter Sprung (Jump): "
+
+#: LYMessages.c:405
+msgid "Edit a previous shortcut: "
+msgstr "Vorheriger abgekürzter Sprung (Jump): "
+
+#: LYMessages.c:406
+#, c-format
+msgid "Key '%c' is not mapped to a jump file!"
+msgstr "Die Taste '%c' entspricht keiner Sprungdatei!"
+
+#: LYMessages.c:407
+msgid "Cannot locate jump file!"
+msgstr "Sprungdatei nicht gefunden!"
+
+#: LYMessages.c:408
+msgid "Cannot open jump file!"
+msgstr "Fehler beim Öffnen der Sprungdatei!"
+
+#: LYMessages.c:409
+msgid "Error reading jump file!"
+msgstr "Fehler beim Lesen der Sprungdatei!"
+
+#: LYMessages.c:410
+msgid "Out of memory reading jump file!"
+msgstr "Nicht genug Memory um Sprungdatei zu lesen!"
+
+#: LYMessages.c:411
+msgid "Out of memory reading jump table!"
+msgstr "Nicht genug Memory um Sprungtabelle zu lesen!"
+
+#: LYMessages.c:412
+msgid "No index is currently available."
+msgstr "Index zurzeit nicht verfügbar."
+
+#. #define CONFIRM_MAIN_SCREEN
+#: LYMessages.c:414
+msgid "Do you really want to go to the Main screen?"
+msgstr "Wirklich zur Hauptseite gehen?"
+
+#: LYMessages.c:415
+msgid "You are already at main screen!"
+msgstr "Schon auf der Hauptseite!"
+
+#. #define NOT_ISINDEX
+#: LYMessages.c:417
+msgid "Not a searchable indexed document -- press '/' to search for a text string"
+msgstr "Dies ist kein abfragbares Index-Dokument -- für Textsuche '/' drücken"
+
+#. #define NO_OWNER
+#: LYMessages.c:419
+msgid "No owner is defined for this file so you cannot send a comment"
+msgstr "Besitzer oder Autor unbekannt, Kommentar daher nicht möglich"
+
+#: LYMessages.c:420
+#, c-format
+msgid "No owner is defined. Use %s?"
+msgstr "Besitzeradresse nicht definiert. %s benutzen?"
+
+#: LYMessages.c:421
+msgid "Do you wish to send a comment?"
+msgstr "Kommentar schicken?"
+
+#: LYMessages.c:422
+msgid "Mail is disallowed so you cannot send a comment"
+msgstr "Mail ist nicht erlaubt, Kommentar daher nicht möglich"
+
+#: LYMessages.c:423
+msgid "The 'e'dit command is currently disabled."
+msgstr "Der Befehl 'E'dit ist zurzeit nicht erlaubt."
+
+#: LYMessages.c:424
+msgid "External editing is currently disabled."
+msgstr "Benutzung eines externen Editors ist zurzeit nicht erlaubt."
+
+#: LYMessages.c:425
+msgid "System error - failure to get status."
+msgstr "Systemfehler - Status konnte nicht bestimmt werden."
+
+#: LYMessages.c:426
+msgid "No editor is defined!"
+msgstr "Kein Editor ist definiert!"
+
+#: LYMessages.c:427
+msgid "The 'p'rint command is currently disabled."
+msgstr "Der Befehl 'P'rint ist zurzeit nicht erlaubt."
+
+#: LYMessages.c:428
+msgid "Document has no Toolbar links or Banner."
+msgstr "Dokument hat keine Toolbar-Links oder \"Banner\"."
+
+#: LYMessages.c:429
+msgid "Unable to open traversal file."
+msgstr "Traversal-Datei konnte nicht geöffnet werden."
+
+#: LYMessages.c:430
+msgid "Unable to open traversal found file."
+msgstr "Traversal-Gefunden-Datei konnte nicht geöffnet werden."
+
+#: LYMessages.c:431
+msgid "Unable to open reject file."
+msgstr "Reject-Datei konnte nicht geöffnet werden."
+
+#: LYMessages.c:432
+msgid "Unable to open traversal errors output file"
+msgstr "Traversal-Fehlerdatei konnte nicht geöffnet werden"
+
+#: LYMessages.c:433
+msgid "TRAVERSAL WAS INTERRUPTED"
+msgstr "TRAVERSAL UNTERBROCHEN"
+
+#: LYMessages.c:434
+msgid "Follow link (or goto link or page) number: "
+msgstr "Folge Link-Nummer (oder gehe zu Link oder Seite): "
+
+#: LYMessages.c:435
+msgid "Select option (or page) number: "
+msgstr "Optionsnummer (oder Seitennummer) wählen: "
+
+#: LYMessages.c:436
+#, c-format
+msgid "Option number %d already is current."
+msgstr "Aktuelle Option ist schon Nummer %d."
+
+#. #define ALREADY_AT_OPTION_END
+#: LYMessages.c:438
+msgid "You are already at the end of this option list."
+msgstr "Schon am Ende der Optionsliste."
+
+#. #define ALREADY_AT_OPTION_BEGIN
+#: LYMessages.c:440
+msgid "You are already at the beginning of this option list."
+msgstr "Schon am Anfang der Optionsliste."
+
+#. #define ALREADY_AT_OPTION_PAGE
+#: LYMessages.c:442
+#, c-format
+msgid "You are already at page %d of this option list."
+msgstr "Schon auf Seite %d der Optionsliste."
+
+#: LYMessages.c:443
+msgid "You have entered an invalid option number."
+msgstr "Ungültige Optionsnummer eingegeben."
+
+#: LYMessages.c:444
+msgid "** Bad HTML!! Use -trace to diagnose. **"
+msgstr "** Bad HTML!! ^T oder -trace Benutzen, um zu sehen was los ist. **"
+
+#: LYMessages.c:445
+msgid "Give name of file to save in"
+msgstr "Dateiname zum Speichern eingeben"
+
+#: LYMessages.c:446
+msgid "Can't save data to file -- please run WWW locally"
+msgstr "Daten können nicht in einer Datei gespeichert werden - bitte WWW lokal ausführen"
+
+#: LYMessages.c:447
+msgid "Can't open temporary file!"
+msgstr "Temporäre Datei kann nicht geöffnet werden!"
+
+#: LYMessages.c:448
+msgid "Can't open output file! Cancelling!"
+msgstr "Ausgabedatei kann nicht geöffnet werden! Abgebrochen!"
+
+#: LYMessages.c:449
+msgid "Execution is disabled."
+msgstr "Befehlsausführung nicht erlaubt."
+
+#. #define EXECUTION_DISABLED_FOR_FILE
+#: LYMessages.c:451
+#, c-format
+msgid "Execution is not enabled for this file. See the Options menu (use %s)."
+msgstr "Ausführung für diese Datei nicht ermöglicht. Siehe Options-Menü (Taste %s)."
+
+#. #define EXECUTION_NOT_COMPILED
+#: LYMessages.c:453
+msgid "Execution capabilities are not compiled into this version."
+msgstr "Diese Version wurde ohne die Fähigkeit zur Programmausführung kompiliert."
+
+#: LYMessages.c:454
+msgid "This file cannot be displayed on this terminal."
+msgstr "Diese Datei kann auf diesem Terminal nicht gezeigt werden."
+
+#. #define CANNOT_DISPLAY_FILE_D_OR_C
+#: LYMessages.c:456
+msgid "This file cannot be displayed on this terminal: D)ownload, or C)ancel"
+msgstr "Kann an diesem Terminal nicht gezeigt werden: D)ownload oder abbre(C)hen"
+
+#: LYMessages.c:457
+#, c-format
+msgid "%s D)ownload, or C)ancel"
+msgstr "%s D)ownload oder Abbru(c)h/(C)ancel"
+
+#: LYMessages.c:458
+msgid "Cancelling file."
+msgstr "Datei abgebrochen."
+
+#: LYMessages.c:459
+msgid "Retrieving file. - PLEASE WAIT -"
+msgstr "Datei wird geholt. - BITTE WARTEN -"
+
+#: LYMessages.c:460
+msgid "Enter a filename: "
+msgstr "Dateiname eingeben: "
+
+#: LYMessages.c:461
+msgid "Edit the previous filename: "
+msgstr "Letzter Dateiname: "
+
+#: LYMessages.c:462
+msgid "Edit a previous filename: "
+msgstr "Früherer Dateiname: "
+
+#: LYMessages.c:463
+msgid "Enter a new filename: "
+msgstr "Neuer Dateiname: "
+
+#: LYMessages.c:464
+msgid "File name may not begin with a dot."
+msgstr "Dateiname darf nicht mit einem Punkt beginnen."
+
+#: LYMessages.c:466
+msgid "File exists. Create higher version?"
+msgstr "Datei existiert schon. Höhere Versionsnummer erzeugen?"
+
+#: LYMessages.c:468
+msgid "File exists. Overwrite?"
+msgstr "Datei existiert schon. Ãœberschreiben?"
+
+#: LYMessages.c:470
+msgid "Cannot write to file."
+msgstr "Speichern in Datei nicht möglich."
+
+#: LYMessages.c:471
+msgid "ERROR! - download command is misconfigured."
+msgstr "FEHLER! - Der Befehl \"Download\" ist falsch konfiguriert."
+
+#: LYMessages.c:472
+msgid "Unable to download file."
+msgstr "Download der Datei nicht möglich."
+
+#: LYMessages.c:473
+msgid "Reading directory..."
+msgstr "Verzeichnis wird gelesen..."
+
+#: LYMessages.c:474
+msgid "Building directory listing..."
+msgstr "Verzeichnisliste wird erzeugt..."
+
+#: LYMessages.c:475
+msgid "Saving..."
+msgstr "Speichern..."
+
+# This seems unused - kw
+#: LYMessages.c:476
+#, c-format
+msgid "Could not edit file '%s'."
+msgstr "Datei '%s' konnte nicht editiert werden."
+
+#: LYMessages.c:477
+msgid "Unable to access document!"
+msgstr "Zugriff auf Dokument nicht möglich!"
+
+#: LYMessages.c:478
+msgid "Could not access file."
+msgstr "Zugriff auf Datei fehlgeschlagen."
+
+#: LYMessages.c:479
+msgid "Could not access directory."
+msgstr "Zugriff auf Verzeichnis fehlgeschlagen."
+
+#: LYMessages.c:480
+msgid "Could not load data."
+msgstr "Daten konnten nicht geladen werden."
+
+#. #define CANNOT_EDIT_REMOTE_FILES
+#: LYMessages.c:482
+msgid "Lynx cannot currently (e)dit remote WWW files."
+msgstr "Lynx hat noch keine Unterstützung fürs (E)ditieren externer WWW-Dateien."
+
+#. #define CANNOT_EDIT_FIELD
+#: LYMessages.c:484
+msgid "This field cannot be (e)dited with an external editor."
+msgstr "Externer Editor ist für dieses Feld nicht anwendbar."
+
+#: LYMessages.c:485
+msgid "Bad rule"
+msgstr "Ungültige Regel"
+
+#: LYMessages.c:486
+msgid "Insufficient operands:"
+msgstr "Nicht genug Operanden:"
+
+#: LYMessages.c:487
+msgid "You are not authorized to edit this file."
+msgstr "Erlaubnis zum Editieren dieser Datei verweigert."
+
+#: LYMessages.c:488
+msgid "Title: "
+msgstr "Titel: "
+
+#: LYMessages.c:489
+msgid "Subject: "
+msgstr "Betreff/Subject: "
+
+#: LYMessages.c:490
+msgid "Username: "
+msgstr "Username: "
+
+#: LYMessages.c:491
+msgid "Password: "
+msgstr "Paßwort: "
+
+#: LYMessages.c:492
+msgid "lynx: Username and Password required!!!"
+msgstr "lynx: Username und Paßwort notwendig!!!"
+
+#: LYMessages.c:493
+msgid "lynx: Password required!!!"
+msgstr "lynx: Paßwort notwendig!!!"
+
+#: LYMessages.c:494
+msgid "Clear all authorization info for this session?"
+msgstr "Alle Autorisationsdaten dieser Sitzung vergessen?"
+
+#: LYMessages.c:495
+msgid "Authorization info cleared."
+msgstr "Autorisationsdaten gelöscht."
+
+#: LYMessages.c:496
+msgid "Authorization failed. Retry?"
+msgstr "Noch nicht autorisiert. Noch mal versuchen?"
+
+#: LYMessages.c:497
+msgid "cgi support has been disabled."
+msgstr "Unterstützung für cgi ist ausgeschaltet."
+
+#. #define CGI_NOT_COMPILED
+#: LYMessages.c:499
+msgid "Lynxcgi capabilities are not compiled into this version."
+msgstr "LYNXCGI-Fähigkeit nicht eingebaut."
+
+#: LYMessages.c:500
+#, c-format
+msgid "Sorry, no known way of converting %s to %s."
+msgstr "Sorry, keine Methode bekannt um %s in %s umzuwandeln."
+
+#: LYMessages.c:501
+msgid "Unable to set up connection."
+msgstr "Vorbereitung der Verbindung fehlgeschlagen."
+
+#: LYMessages.c:502
+msgid "Unable to make connection"
+msgstr "Verbindung kann nicht hergestellt werden"
+
+#. #define MALFORMED_EXEC_REQUEST
+#: LYMessages.c:504
+msgid "Executable link rejected due to malformed request."
+msgstr "Fehlerhafte Anforderung: Ausführbarer Link wird zurückgewiesen."
+
+#. #define BADCHAR_IN_EXEC_LINK
+#: LYMessages.c:506
+#, c-format
+msgid "Executable link rejected due to `%c' character."
+msgstr "Ausführbarer Link wird zurückgewiesen, weil das Zeichen `%c' vorkommt."
+
+#. #define RELPATH_IN_EXEC_LINK
+#: LYMessages.c:508
+msgid "Executable link rejected due to relative path string ('../')."
+msgstr "Ausführbarer Link wird wegen der Zeichenfolge '../' zurückgewiesen."
+
+#. #define BADLOCPATH_IN_EXEC_LINK
+#: LYMessages.c:510
+msgid "Executable link rejected due to location or path."
+msgstr "Ausführbarer Link aufgrund des Ortes oder Dateipfades zurückgewiesen."
+
+#: LYMessages.c:511
+msgid "Mail access is disabled!"
+msgstr "Zugang zu Mail ist ausgeschaltet!"
+
+#. #define ACCESS_ONLY_LOCALHOST
+#: LYMessages.c:513
+msgid "Only files and servers on the local host can be accessed."
+msgstr "Zugang ist nur zu Dateien und Diensten der lokalen Machine gestattet."
+
+#: LYMessages.c:514
+msgid "Telnet access is disabled!"
+msgstr "Zugang zu Telnet ist ausgeschaltet!"
+
+#. #define TELNET_PORT_SPECS_DISABLED
+#: LYMessages.c:516
+msgid "Telnet port specifications are disabled."
+msgstr "Erlaubnis zur Angabe eines Ports für Telnet ist nicht eingeschaltet."
+
+#: LYMessages.c:517
+msgid "USENET news access is disabled!"
+msgstr "Zugang zu USENET news ist ausgeschaltet!"
+
+#: LYMessages.c:518
+msgid "Rlogin access is disabled!"
+msgstr "Zugang zu Rlogin ist ausgeschaltet!"
+
+#: LYMessages.c:519
+msgid "Ftp access is disabled!"
+msgstr "Zugang zu Ftp ist ausgeschaltet!"
+
+#: LYMessages.c:520
+msgid "There are no references from this document."
+msgstr "Dieses Dokument hat keine Links."
+
+#: LYMessages.c:521
+msgid "There are only hidden links from this document."
+msgstr "Dieses Dokument hat nur versteckte Links."
+
+#: LYMessages.c:523
+msgid "Unable to open command file."
+msgstr "Die Befehlsdatei kann nicht geöffnet werden."
+
+#: LYMessages.c:525
+msgid "News Post Cancelled!!!"
+msgstr "Wunsch zu drucken abgebrochen!!!"
+
+#. #define SPAWNING_EDITOR_FOR_NEWS
+#: LYMessages.c:527
+msgid "Spawning your selected editor to edit news message"
+msgstr "Ausgewählter Editor wird zum Erstellen der News-Nachricht gestartet"
+
+#: LYMessages.c:528
+msgid "Post this message?"
+msgstr "Message schicken?"
+
+#: LYMessages.c:529
+#, c-format
+msgid "Append '%s'?"
+msgstr "'%s' anhängen?"
+
+#: LYMessages.c:530
+msgid "Posting to newsgroup(s)..."
+msgstr "Posting zu Newsgroup(s)..."
+
+#: LYMessages.c:532
+msgid "*** You have unread mail. ***"
+msgstr "*** Du hast ungelesene Mail. ***"
+
+#: LYMessages.c:534
+msgid "*** You have mail. ***"
+msgstr "*** Du hast Mail. ***"
+
+#: LYMessages.c:536
+msgid "*** You have new mail. ***"
+msgstr "*** Du hast neue Mail. ***"
+
+#: LYMessages.c:537
+msgid "File insert cancelled!!!"
+msgstr "Dateieinfügung abgebrochen!!!"
+
+#: LYMessages.c:538
+msgid "Not enough memory for file!"
+msgstr "Nicht genug Memory für Datei!"
+
+#: LYMessages.c:539
+msgid "Can't open file for reading."
+msgstr "Die Datei kann nicht zum Lesen geöffnet werden."
+
+#: LYMessages.c:540
+msgid "File does not exist."
+msgstr "Datei nicht gefunden."
+
+#: LYMessages.c:541
+msgid "File does not exist - reenter or cancel:"
+msgstr "Datei nicht gefunden - Neueingabe oder Abbruch:"
+
+#: LYMessages.c:542
+msgid "File is not readable."
+msgstr "Datei nicht lesbar."
+
+#: LYMessages.c:543
+msgid "File is not readable - reenter or cancel:"
+msgstr "Datei nicht lesbar - Neueingabe oder Abbruch:"
+
+#: LYMessages.c:544
+msgid "Nothing to insert - file is 0-length."
+msgstr "Kein einfügbarer Text vorhanden - die Datei ist leer."
+
+#: LYMessages.c:545
+msgid "Save request cancelled!!!"
+msgstr "Wunsch zu speichern abgebrochen!!!"
+
+#: LYMessages.c:546
+msgid "Mail request cancelled!!!"
+msgstr "Wunsch Mail zu schicken abgebrochen!!!"
+
+#. #define CONFIRM_MAIL_SOURCE_PREPARSED
+#: LYMessages.c:548
+msgid "Viewing preparsed source. Are you sure you want to mail it?"
+msgstr "Quelltext ist vorverarbeitet. Wirklich schicken?"
+
+#: LYMessages.c:549
+msgid "Please wait..."
+msgstr "Bitte warten..."
+
+#: LYMessages.c:550
+msgid "Mailing file. Please wait..."
+msgstr "Datei wird als Mail geschickt. Bitte warten..."
+
+#: LYMessages.c:551
+msgid "ERROR - Unable to mail file"
+msgstr "FEHLER - Datei konnte nicht als Mail geschickt werden"
+
+#. #define CONFIRM_LONG_SCREEN_PRINT
+#: LYMessages.c:553
+#, c-format
+msgid "File is %d screens long. Are you sure you want to print?"
+msgstr "Datei ist %d Bildschirme lang. Wirklich drucken?"
+
+#: LYMessages.c:554
+msgid "Print request cancelled!!!"
+msgstr "Wunsch zu drucken abgebrochen!!!"
+
+#: LYMessages.c:555
+msgid "Press <return> to begin: "
+msgstr "Eingabetaste drücken um zu beginnen: "
+
+#: LYMessages.c:556
+msgid "Press <return> to finish: "
+msgstr "Eingabetaste drücken: "
+
+#. #define CONFIRM_LONG_PAGE_PRINT
+#: LYMessages.c:558
+#, c-format
+msgid "File is %d pages long. Are you sure you want to print?"
+msgstr "Datei ist %d Seiten lang. Wirklich drucken?"
+
+#. #define CHECK_PRINTER
+#: LYMessages.c:560
+msgid "Be sure your printer is on-line. Press <return> to start printing:"
+msgstr "Ist der Drucker auch on-line? Eingabetaste betätigen für Druckbeginn:"
+
+#: LYMessages.c:561
+msgid "ERROR - Unable to allocate file space!!!"
+msgstr "FEHLER - Nicht genug Speicherplatz für Datei!!!"
+
+#: LYMessages.c:562
+msgid "Unable to open tempfile"
+msgstr "Temporäre Datei konnte nicht geöffnet werden"
+
+#: LYMessages.c:563
+msgid "Unable to open print options file"
+msgstr "Temporäre Datei für Druckeroptionen konnte nicht geöffnet werden"
+
+#: LYMessages.c:564
+msgid "Printing file. Please wait..."
+msgstr "Datei wird gedruckt. Bitte warten..."
+
+#: LYMessages.c:565
+msgid "Please enter a valid internet mail address: "
+msgstr "Bitte gültige Internet-Mailadresse eingeben: "
+
+#: LYMessages.c:566
+msgid "ERROR! - printer is misconfigured!"
+msgstr "FEHLER! - Drucker ist falsch konfiguriert!"
+
+#: LYMessages.c:567
+msgid "Image map from POST response not available!"
+msgstr "Imagemap aus POST-Antwort nicht vorhanden!"
+
+#: LYMessages.c:568
+msgid "Misdirected client-side image MAP request!"
+msgstr "Fehlgeleitete Anforderung einer client-side Image-MAP!"
+
+#: LYMessages.c:569
+msgid "Client-side image MAP is not accessible!"
+msgstr "Client-side Image-MAP ist nicht zugänglich!"
+
+#: LYMessages.c:570
+msgid "No client-side image MAPs are available!"
+msgstr "Keinerlei client-side Image-MAPs verfügbar!"
+
+#: LYMessages.c:571
+msgid "Client-side image MAP is not available!"
+msgstr "Client-side Image-MAP ist nicht verfügbar!"
+
+#. #define OPTION_SCREEN_NEEDS_24
+#: LYMessages.c:574
+msgid "Screen height must be at least 24 lines for the Options menu!"
+msgstr "Das Options-Menü braucht mindestens 24 Bildschirmzeilen!"
+
+#. #define OPTION_SCREEN_NEEDS_23
+#: LYMessages.c:576
+msgid "Screen height must be at least 23 lines for the Options menu!"
+msgstr "Das Options-Menü braucht mindestens 23 Bildschirmzeilen!"
+
+#. #define OPTION_SCREEN_NEEDS_22
+#: LYMessages.c:578
+msgid "Screen height must be at least 22 lines for the Options menu!"
+msgstr "Das Options-Menü braucht mindestens 22 Bildschirmzeilen!"
+
+#: LYMessages.c:580
+msgid "That key requires Advanced User mode."
+msgstr "Die Taste funktioniert nur im \"fortgeschrittenen\" Benutzermodus."
+
+#: LYMessages.c:581
+#, c-format
+msgid "Content-type: %s"
+msgstr "Content-Type: %s"
+
+#: LYMessages.c:582
+msgid "Command: "
+msgstr "Befehl: "
+
+#: LYMessages.c:583
+msgid "Unknown or ambiguous command"
+msgstr "Unbekannter oder doppeldeutiger Befehl"
+
+#: LYMessages.c:584
+msgid " Version "
+msgstr " Version "
+
+#: LYMessages.c:585
+msgid " first"
+msgstr " erster"
+
+#: LYMessages.c:586
+msgid ", guessing..."
+msgstr " (Versuch zu raten...)"
+
+#: LYMessages.c:587
+msgid "Permissions for "
+msgstr "Zugriffsberechtigung für "
+
+#: LYMessages.c:588
+msgid "Select "
+msgstr "Wähle "
+
+#: LYMessages.c:589
+msgid "capital letter"
+msgstr "Großbuchstaben"
+
+#: LYMessages.c:590
+msgid " of option line,"
+msgstr " der Optionszeile,"
+
+#: LYMessages.c:591
+msgid " to save,"
+msgstr " um zu speichern,"
+
+#: LYMessages.c:592
+msgid " to "
+msgstr " um zu "
+
+#: LYMessages.c:593
+msgid " or "
+msgstr " oder "
+
+#: LYMessages.c:594
+msgid " index"
+msgstr " Index"
+
+#: LYMessages.c:595
+msgid " to return to Lynx."
+msgstr " für Rückkehr zu Lynx."
+
+#: LYMessages.c:596
+msgid "Accept Changes"
+msgstr "Änderungen akzeptieren"
+
+#: LYMessages.c:597
+msgid "Reset Changes"
+msgstr "Änderungen zurücknehmen"
+
+#: LYMessages.c:598
+msgid "Left Arrow cancels changes"
+msgstr "Linke Pfeiltaste nimmt zurück"
+
+#: LYMessages.c:599
+msgid "Save options to disk"
+msgstr "Optionen permanent speichern"
+
+#: LYMessages.c:600
+msgid "Hit RETURN to accept entered data."
+msgstr "RETURN (Eingabetaste) für Bestätigung."
+
+#. #define ACCEPT_DATA_OR_DEFAULT
+#: LYMessages.c:602
+msgid "Hit RETURN to accept entered data. Delete data to invoke the default."
+msgstr "RETURN (Eingabetaste) für Bestätigung, oder Feld leermachen für Vorgabewert."
+
+#: LYMessages.c:603
+msgid "Value accepted!"
+msgstr "Wert akzeptiert!"
+
+#. #define VALUE_ACCEPTED_WARNING_X
+#: LYMessages.c:605
+msgid "Value accepted! -- WARNING: Lynx is configured for XWINDOWS!"
+msgstr "Wert akzeptiert! -- WARNUNG: Lynx ist für X Window System konfiguriert!"
+
+#. #define VALUE_ACCEPTED_WARNING_NONX
+#: LYMessages.c:607
+msgid "Value accepted! -- WARNING: Lynx is NOT configured for XWINDOWS!"
+msgstr "Wert akzeptiert! -- WARNUNG: Lynx ist NICHT für X Window System konfiguriert!"
+
+#: LYMessages.c:608
+msgid "You are not allowed to change which editor to use!"
+msgstr "Es ist nicht erlaubt, die Auswahl des Editors zu ändern!"
+
+#: LYMessages.c:609
+msgid "Failed to set DISPLAY variable!"
+msgstr "DISPLAY-Variable konnte nicht gesetzt werden!"
+
+#: LYMessages.c:610
+msgid "Failed to clear DISPLAY variable!"
+msgstr "DISPLAY-Variable konnte nicht gelöscht werden!"
+
+#. #define BOOKMARK_CHANGE_DISALLOWED
+#: LYMessages.c:612
+msgid "You are not allowed to change the bookmark file!"
+msgstr "Änderung der Lesezeichendatei ist nicht erlaubt!"
+
+#: LYMessages.c:613
+msgid "Terminal does not support color"
+msgstr "Terminal hat keine Unterstützung für Farbe"
+
+#: LYMessages.c:614
+#, c-format
+msgid "Your '%s' terminal does not support color."
+msgstr "Das Terminal vom Typ '%s' hat keine Unterstützung für Farbe."
+
+#: LYMessages.c:615
+msgid "Access to dot files is disabled!"
+msgstr "Zugang zu Dateien, die mit Punkt beginnen, ist nicht erlaubt!"
+
+#. #define UA_NO_LYNX_WARNING
+#: LYMessages.c:617
+msgid "User-Agent string does not contain \"Lynx\" or \"L_y_n_x\""
+msgstr "Die Kennung des Benutzer-Agenten enthält weder \\\"Lynx\\\" noch \\\"L_y_n_x\\\""
+
+#. #define UA_PLEASE_USE_LYNX
+#: LYMessages.c:619
+msgid "Use \"L_y_n_x\" or \"Lynx\" in User-Agent, or it looks like intentional deception!"
+msgstr "Benutze \"L_y_n_x\" oder \"Lynx\" im Benutzer-Agenten, anderenfalls sieht es nach bewusster Täuschung aus!"
+
+#. #define UA_CHANGE_DISABLED
+#: LYMessages.c:621
+msgid "Changing of the User-Agent string is disabled!"
+msgstr "Ändern der Kennung des Benutzer-Agenten ist außer Betrieb!"
+
+#. #define CHANGE_OF_SETTING_DISALLOWED
+#: LYMessages.c:623
+msgid "You are not allowed to change this setting."
+msgstr "Das Ändern dieser Einstellung ist nicht erlaubt."
+
+#: LYMessages.c:624
+msgid "Saving Options..."
+msgstr "Optionen speichern..."
+
+#: LYMessages.c:625
+msgid "Options saved!"
+msgstr "Optionen gespeichert!"
+
+#: LYMessages.c:626
+msgid "Unable to save Options!"
+msgstr "Optionen konnten nicht gespeichert werten!"
+
+#: LYMessages.c:627
+msgid " 'r' to return to Lynx "
+msgstr " 'r' für Rückkehr zu Lynx "
+
+#: LYMessages.c:628
+msgid " '>' to save, or 'r' to return to Lynx "
+msgstr " '>' um zu speichern, oder 'r' für Rückkehr zu Lynx "
+
+#. #define ANY_KEY_CHANGE_RET_ACCEPT
+#: LYMessages.c:630
+msgid "Hit any key to change value; RETURN to accept."
+msgstr "Beliebige Taste drücken um Wert zu verändern; Eingabetaste zum Akzeptieren."
+
+#: LYMessages.c:631
+msgid "Error uncompressing temporary file!"
+msgstr "Temporäre Datei konnte nicht dekomprimiert werden!"
+
+#: LYMessages.c:632
+msgid "Unsupported URL scheme!"
+msgstr "Ununterstütztes URL-Schema!"
+
+#: LYMessages.c:633
+msgid "Unsupported data: URL! Use SHOWINFO, for now."
+msgstr "Der URL-Typ \"data:\" ist nicht unterstützt. Probier die '=' Taste."
+
+#: LYMessages.c:634
+#, c-format
+msgid "Redirection limit of %d URL's reached."
+msgstr "Weiterleitungs-Limit von %d URLs erreicht."
+
+#: LYMessages.c:635
+msgid "Illegal redirection URL received from server!"
+msgstr "Der Server hat einen ungültigen Redirection-URL geschickt!"
+
+#. #define SERVER_ASKED_FOR_REDIRECTION
+#: LYMessages.c:637
+#, c-format
+msgid "Server asked for %d redirection of POST content to"
+msgstr "Server verlangte mit Status %d Umleitung von POST-Daten zu"
+
+#: LYMessages.c:640
+msgid "P)roceed, use G)ET or C)ancel "
+msgstr "P)OST, in G)ET umwandeln oder Abbru(c)h/(C)ancel "
+
+#: LYMessages.c:641
+msgid "P)roceed, or C)ancel "
+msgstr "Weitermachen/(P)roceed oder Abbruch/(C)ancel "
+
+#. #define ADVANCED_POST_GET_REDIRECT
+#: LYMessages.c:643
+msgid "Redirection of POST content. P)roceed, see U)RL, use G)ET or C)ancel"
+msgstr "Umleitung von POST-Daten. P)OST, U)RL zeigen, G)ET, oder Abbre(C)hen"
+
+#. #define ADVANCED_POST_REDIRECT
+#: LYMessages.c:645
+msgid "Redirection of POST content. P)roceed, see U)RL, or C)ancel"
+msgstr "Umleitung von POST-Daten. Weiter/(P)roceed, U)RL zeigen oder Abbre(C)en"
+
+#. #define CONFIRM_POST_RESUBMISSION
+#: LYMessages.c:647
+msgid "Document from Form with POST content. Resubmit?"
+msgstr "Dokument hat POST-Daten, d.h. bereits gesandten Forminhalt. POST wiederholen?"
+
+#. #define CONFIRM_POST_RESUBMISSION_TO
+#: LYMessages.c:649
+#, c-format
+msgid "Resubmit POST content to %s ?"
+msgstr "POST-Daten neu senden zu %s ?"
+
+#. #define CONFIRM_POST_LIST_RELOAD
+#: LYMessages.c:651
+#, c-format
+msgid "List from document with POST data. Reload %s ?"
+msgstr "Liste für Dokuments mit Formdaten. %s neu laden?"
+
+#. #define CONFIRM_POST_DOC_HEAD
+#: LYMessages.c:653
+msgid "Document from POST action, HEAD may not be understood. Proceed?"
+msgstr "Dokument ist Ergebnis einer POST-Aktion, HEAD vielleicht unanwendbar. Weiter?"
+
+#. #define CONFIRM_POST_LINK_HEAD
+#: LYMessages.c:655
+msgid "Form submit action is POST, HEAD may not be understood. Proceed?"
+msgstr "Formzugriffsmethode ist POST, HEAD vielleicht unanwendbar. Weiter?"
+
+#: LYMessages.c:656
+msgid "Proceed without a username and password?"
+msgstr "Weitermachen ohne Username und Passwort?"
+
+#: LYMessages.c:657
+#, c-format
+msgid "Proceed (%s)?"
+msgstr "Weiter (%s)?"
+
+#: LYMessages.c:658
+msgid "Cannot POST to this host."
+msgstr "POST nicht möglich für diesen Host."
+
+#: LYMessages.c:659
+msgid "POST not supported for this URL - ignoring POST data!"
+msgstr "POST nicht möglich für diesen URL - POST-Daten werden ignoriert!"
+
+#: LYMessages.c:660
+msgid "Discarding POST data..."
+msgstr "POST-Daten weggeworfen..."
+
+#: LYMessages.c:661
+msgid "Document will not be reloaded!"
+msgstr "Dokument wird nicht zwangsgeladen!"
+
+#: LYMessages.c:662
+msgid "Location: "
+msgstr "Location: "
+
+#: LYMessages.c:663
+#, c-format
+msgid "'%s' not found!"
+msgstr "'%s' nicht gefunden!"
+
+#: LYMessages.c:664
+msgid "Default Bookmark File"
+msgstr "Lesezeichendatei wenn nicht angegeben"
+
+#: LYMessages.c:665
+msgid "Screen too small! (8x35 min)"
+msgstr "Fenster zu klein, 8x35 nötig"
+
+#: LYMessages.c:666
+msgid "Select destination or ^G to Cancel: "
+msgstr "Ziel eingeben, oder ^G für Abbruch: "
+
+#. #define MULTIBOOKMARKS_SELECT
+#: LYMessages.c:668
+msgid "Select subbookmark, '=' for menu, or ^G to cancel: "
+msgstr "Unterlesezeichendatei wählen, '=' für Menü oder ^G für Abbruch: "
+
+#. #define MULTIBOOKMARKS_SELF
+#: LYMessages.c:670
+msgid "Reproduce L)ink in this bookmark file or C)ancel? (l,c): "
+msgstr "L)ink in dieser Lesezeichendatei duplizieren oder abbre(C)hen? (l,c): "
+
+#: LYMessages.c:671
+msgid "Multiple bookmark support is not available."
+msgstr "Multi-Datei-Lesezeichen nicht verfügbar."
+
+#: LYMessages.c:672
+#, c-format
+msgid " Select Bookmark (screen %d of %d)"
+msgstr " Wähle Lesezeichensammlung (Seite %d von %d)"
+
+#: LYMessages.c:673
+msgid " Select Bookmark"
+msgstr " Wähle Lesezeichensammlung"
+
+#. #define MULTIBOOKMARKS_EHEAD_MASK
+#: LYMessages.c:675
+#, c-format
+msgid "Editing Bookmark DESCRIPTION and FILEPATH (%d of 2)"
+msgstr "BESCHREIBUNG und DATEIPFAD für Lesezeichen ändern (%d von 2)"
+
+#. #define MULTIBOOKMARKS_EHEAD
+#: LYMessages.c:677
+msgid " Editing Bookmark DESCRIPTION and FILEPATH"
+msgstr " BESCHREIBUNG und DATEIPFAD für Lesezeichen ändern"
+
+#: LYMessages.c:678
+msgid "Letter: "
+msgstr "Buchstabe: "
+
+#. #define USE_PATH_OFF_HOME
+#: LYMessages.c:681
+msgid "Use a filepath off your login directory in SHELL syntax!"
+msgstr "Dateipfad relativ zum Home-Verzeichnis in SHELL-Syntax angeben!"
+
+#: LYMessages.c:683
+msgid "Use a filepath off your home directory!"
+msgstr "Dateipfad relativ zum Home-Verzeichnis angeben!"
+
+#. #define MAXLINKS_REACHED
+#: LYMessages.c:686
+msgid "Maximum links per page exceeded! Use half-page or two-line scrolling."
+msgstr "Max. Links/Bildschirm erreicht! Probier Halbseiten- oder Zweizeilenbewegung."
+
+#: LYMessages.c:687
+msgid "No previously visited links available!"
+msgstr "Noch keine schon besuchten Links!"
+
+#: LYMessages.c:688
+msgid "Memory exhausted! Program aborted!"
+msgstr "Zu wenig Speicherplatz! Programm abgebrochen!"
+
+#: LYMessages.c:689
+msgid "Memory exhausted! Aborting..."
+msgstr "Zu wenig Speicherplatz! Programm bricht ab..."
+
+#: LYMessages.c:690
+msgid "Not enough memory!"
+msgstr "Nicht genug Speicher!"
+
+#: LYMessages.c:691
+msgid "Directory/File Manager not available"
+msgstr "Verzeichnis- und Dateimanager (Dired) nicht verfügbar"
+
+#: LYMessages.c:692
+msgid "Location URL is not absolute."
+msgstr "Location-URL ist nicht absolut."
+
+#: LYMessages.c:693
+msgid "Refresh URL is not absolute."
+msgstr "Refresh-URL ist nicht absolut."
+
+#. #define SENDING_MESSAGE_WITH_BODY_TO
+#: LYMessages.c:695
+msgid ""
+"You are sending a message with body to:\n"
+" "
+msgstr ""
+"Nachricht mit vergegebenem Inhalt wird geschickt an:\n"
+" "
+
+#: LYMessages.c:696
+msgid ""
+"You are sending a comment to:\n"
+" "
+msgstr ""
+"Kommentar wird geschickt an:\n"
+" "
+
+#: LYMessages.c:697
+msgid ""
+"\n"
+" With copy to:\n"
+" "
+msgstr ""
+"\n"
+" Mit Kopie an:\n"
+" "
+
+#: LYMessages.c:698
+msgid ""
+"\n"
+" With copies to:\n"
+" "
+msgstr ""
+"\n"
+" Mit Kopien an:\n"
+" "
+
+#. #define CTRL_G_TO_CANCEL_SEND
+#: LYMessages.c:700
+msgid ""
+"\n"
+"\n"
+"Use Ctrl-G to cancel if you do not want to send a message\n"
+msgstr ""
+"\n"
+"\n"
+"Ctrl-G zum Abbrechen verwenden, falls keine Nachricht geschickt werden soll.\n"
+
+#. #define ENTER_NAME_OR_BLANK
+#: LYMessages.c:702
+msgid ""
+"\n"
+" Please enter your name, or leave it blank to remain anonymous\n"
+msgstr ""
+"\n"
+" Bitte eigenen Namen eingeben, oder für Anonymität leerlassen\n"
+
+#. #define ENTER_MAIL_ADDRESS_OR_OTHER
+#: LYMessages.c:704
+msgid ""
+"\n"
+" Please enter a mail address or some other\n"
+msgstr ""
+"\n"
+"\n"
+" Bitte eigene Mailadresse oder ander Kontaktadresse\n"
+
+#. #define MEANS_TO_CONTACT_FOR_RESPONSE
+#: LYMessages.c:706
+msgid " means to contact you, if you desire a response.\n"
+msgstr " eingeben, fall eine Antwort gewünscht wird.\n"
+
+#: LYMessages.c:707
+msgid ""
+"\n"
+" Please enter a subject line.\n"
+msgstr ""
+"\n"
+" Bitte eine Zeile eingeben für Betreff/Subject.\n"
+
+#. #define ENTER_ADDRESS_FOR_CC
+#: LYMessages.c:709
+msgid ""
+"\n"
+" Enter a mail address for a CC of your message.\n"
+msgstr ""
+"\n"
+" Mailadresse für zusätztliche Kopie (CC) eingeben.\n"
+
+#: LYMessages.c:710
+msgid " (Leave blank if you don't want a copy.)\n"
+msgstr " (Kann leergelassen werden, falls keine Kopie erwünscht ist.)\n"
+
+#: LYMessages.c:711
+msgid ""
+"\n"
+" Please review the message body:\n"
+"\n"
+msgstr ""
+"\n"
+" Bitte den Inhalt der Nachricht überprüfen:\n"
+"\n"
+
+#: LYMessages.c:712
+msgid ""
+"\n"
+"Press RETURN to continue: "
+msgstr ""
+"\n"
+"RETURN (Eingabetaste) um weiterzumachen: "
+
+#: LYMessages.c:713
+msgid ""
+"\n"
+"Press RETURN to clean up: "
+msgstr ""
+"\n"
+"RETURN (Eingabetaste) um aufzuräumen: "
+
+#: LYMessages.c:714
+msgid " Use Control-U to erase the default.\n"
+msgstr " Die Vorgaben können mit ^U gelöscht werden.\n"
+
+#: LYMessages.c:715
+msgid ""
+"\n"
+" Please enter your message below."
+msgstr ""
+"\n"
+" Bitte Nachricht unten eingeben."
+
+#. #define ENTER_PERIOD_WHEN_DONE_A
+#: LYMessages.c:717 src/LYNews.c:360
+msgid ""
+"\n"
+" When you are done, press enter and put a single period (.)"
+msgstr ""
+"\n"
+" Wenn du fertig bist, Eingabetaste drücken und einen einzelnen Punkt (.)"
+
+#. #define ENTER_PERIOD_WHEN_DONE_B
+#: LYMessages.c:719 src/LYNews.c:361
+msgid ""
+"\n"
+" on a line and press enter again."
+msgstr ""
+"\n"
+" in neue Zeile schreiben, dann noch einmal Eingabetaste."
+
+#. Cookies messages
+#. #define ADVANCED_COOKIE_CONFIRMATION
+#: LYMessages.c:723
+#, c-format
+msgid "%s cookie: %.*s=%.*s Allow? (Y/N/Always/neVer)"
+msgstr "Keks von %s: %.*s=%.*s erlauben? (J/N/immer Akz./Verw.)"
+
+#. #define INVALID_COOKIE_DOMAIN_CONFIRMATION
+#: LYMessages.c:725
+#, c-format
+msgid "Accept invalid cookie domain=%s for '%s'?"
+msgstr "Schlechten Keks domain=%s von '%s' nehmen?"
+
+#. #define INVALID_COOKIE_PATH_CONFIRMATION
+#: LYMessages.c:727
+#, c-format
+msgid "Accept invalid cookie path=%s as a prefix of '%s'?"
+msgstr "Keks: path=%s als Präfix von '%s' akzeptieren?"
+
+#: LYMessages.c:728
+msgid "Allowing this cookie."
+msgstr "Dieser Keks wird erlaubt."
+
+#: LYMessages.c:729
+msgid "Rejecting this cookie."
+msgstr "Dieser Keks wird zurückgewiesen."
+
+#: LYMessages.c:730
+msgid "The Cookie Jar is empty."
+msgstr "Der Keksbeutel ist leer."
+
+#: LYMessages.c:731
+msgid "The Cache Jar is empty."
+msgstr "Der Cachebeutel ist leer."
+
+#. #define ACTIVATE_TO_GOBBLE
+#: LYMessages.c:733
+msgid "Activate links to gobble up cookies or entire domains,"
+msgstr "Links aktivieren um einzelne Kekse oder ganze Domains zu vernichten,"
+
+#: LYMessages.c:734
+msgid "or to change a domain's 'allow' setting."
+msgstr "oder um den 'erlaubt'-Zustand für eine Domain zu ändern."
+
+#: LYMessages.c:735
+msgid "(Cookies never allowed.)"
+msgstr "(Kekse nie erlaubt.)"
+
+#: LYMessages.c:736
+msgid "(Cookies always allowed.)"
+msgstr "(Kekse immer gern gesehen.)"
+
+#: LYMessages.c:737
+msgid "(Cookies allowed via prompt.)"
+msgstr "(Kekse erlaubt nach Bestätigung.)"
+
+# Not used any more in latest cookie code.
+#: LYMessages.c:738
+msgid "(Persistent Cookies.)"
+msgstr "(Beständige Kekse.)"
+
+#: LYMessages.c:739
+msgid "(No title.)"
+msgstr "(ohne Titel)"
+
+#: LYMessages.c:740
+msgid "(No name.)"
+msgstr "(kein Name.)"
+
+#: LYMessages.c:741
+msgid "(No value.)"
+msgstr "(kein Wert.)"
+
+#: LYMessages.c:742 src/LYOptions.c:2482
+msgid "None"
+msgstr "Keine"
+
+#: LYMessages.c:743
+msgid "(End of session.)"
+msgstr "(Ende der Session.)"
+
+#: LYMessages.c:744
+msgid "Delete this cookie?"
+msgstr "Diesen Keks wegschmeißen?"
+
+#: LYMessages.c:745
+msgid "The cookie has been eaten!"
+msgstr "Der Keks ist weg!"
+
+#: LYMessages.c:746
+msgid "Delete this empty domain?"
+msgstr "Leere Domain entfernen?"
+
+#: LYMessages.c:747
+msgid "The domain has been eaten!"
+msgstr "Fort ist sie!"
+
+#. #define DELETE_COOKIES_SET_ALLOW_OR_CANCEL
+#: LYMessages.c:749
+msgid "D)elete domain's cookies, set allow A)lways/P)rompt/neV)er, or C)ancel? "
+msgstr "D)iese Kekse weg, (immer)(A)kzept/ (P)rompt/ (immer)(V)erweig, oder Abbru(C)h? "
+
+#. #define DELETE_DOMAIN_SET_ALLOW_OR_CANCEL
+#: LYMessages.c:751
+msgid "D)elete domain, set allow A)lways/P)rompt/neV)er, or C)ancel? "
+msgstr "D)omain weg, (immer) (A)kzept. / (P)rompt / (immer)(V)erweig., oder Abbru(C)h? "
+
+#: LYMessages.c:752
+msgid "All cookies in the domain have been eaten!"
+msgstr "Keine Kekse mehr da!"
+
+#: LYMessages.c:753
+#, c-format
+msgid "'A'lways allowing from domain '%s'."
+msgstr "'A'lle Kekse für Domain '%s' erlaubt."
+
+#: LYMessages.c:754
+#, c-format
+msgid "ne'V'er allowing from domain '%s'."
+msgstr "Kekse 'V'erboten für Domain '%s'."
+
+#: LYMessages.c:755
+#, c-format
+msgid "'P'rompting to allow from domain '%s'."
+msgstr "'P'rompte Frage wenn Kekse kommen für Domain '%s'."
+
+#: LYMessages.c:756
+msgid "Delete all cookies in this domain?"
+msgstr "Alle Kekse für diese Domain wegwerfen?"
+
+#: LYMessages.c:757
+msgid "All of the cookies in the jar have been eaten!"
+msgstr "Der Keksbeutel ist total leer!"
+
+#: LYMessages.c:759
+msgid "Port 19 not permitted in URLs."
+msgstr "Port 19 nicht erlaubt in URLs."
+
+#: LYMessages.c:760
+msgid "Port 25 not permitted in URLs."
+msgstr "Port 25 nicht erlaubt in URLs."
+
+#: LYMessages.c:761
+#, c-format
+msgid "Port %lu not permitted in URLs."
+msgstr "Port %lu nicht erlaubt in URLs."
+
+#: LYMessages.c:762
+msgid "URL has a bad port field."
+msgstr "URL hat ungültigen Port."
+
+#: LYMessages.c:763
+msgid "Maximum nesting of HTML elements exceeded."
+msgstr "Maximale Schachtelungstiefe für HTML-Elemente überschritten."
+
+#: LYMessages.c:764
+msgid "Bad partial reference! Stripping lead dots."
+msgstr "Link mit schlechter partieller URL-Reference! '../' wird entfernt."
+
+#: LYMessages.c:765
+msgid "Trace Log open failed. Trace off!"
+msgstr "Fehler beim Öffnen der Trace-Logdatei. Trace AUS!"
+
+#: LYMessages.c:766
+msgid "Lynx Trace Log"
+msgstr "Lynx Trace Log"
+
+#: LYMessages.c:767
+msgid "No trace log has been started for this session."
+msgstr "Trace Log in dieser Session bislang nicht gestartet."
+
+#. #define MAX_TEMPCOUNT_REACHED
+#: LYMessages.c:769
+msgid "The maximum temporary file count has been reached!"
+msgstr "Die maximale Anzahl temporärer Dateien ist erreicht!"
+
+#. #define FORM_VALUE_TOO_LONG
+#: LYMessages.c:771
+msgid "Form field value exceeds buffer length! Trim the tail."
+msgstr "Wert des Formfeldes länger as Pufferspeicher! Schwanz ab."
+
+#. #define FORM_TAIL_COMBINED_WITH_HEAD
+#: LYMessages.c:773
+msgid "Modified tail combined with head of form field value."
+msgstr "Modifizierter Schwanz mit dem Kopf des Formfeldwertes kombiniert."
+
+#. HTFile.c
+#: LYMessages.c:776
+msgid "Directory"
+msgstr "Verzeichnis"
+
+#: LYMessages.c:777
+msgid "Directory browsing is not allowed."
+msgstr "Das Durchstöbern von Dateiverzeichnissen ist untersagt."
+
+#: LYMessages.c:778
+msgid "Selective access is not enabled for this directory"
+msgstr "Selektiver Zugriff ist für dieses Verzeichnis nicht möglich"
+
+#: LYMessages.c:779
+msgid "Multiformat: directory scan failed."
+msgstr "Multiformat: Suche im Verzeichnis fehlgeschlagen."
+
+#: LYMessages.c:780
+msgid "This directory is not readable."
+msgstr "Dieses Verzeichnis kann nicht gelesen werden."
+
+#: LYMessages.c:781
+msgid "Can't access requested file."
+msgstr "Die gewünschte Datei ist nicht zugänglich."
+
+#: LYMessages.c:782
+msgid "Could not find suitable representation for transmission."
+msgstr "Keine passende Datei von akzeptablem Typ gefunden."
+
+#: LYMessages.c:783
+msgid "Could not open file for decompression!"
+msgstr "Datei konnte nicht für Dekompression geöffnet werden!"
+
+#: LYMessages.c:784
+msgid "Files:"
+msgstr "Dateien:"
+
+#: LYMessages.c:785
+msgid "Subdirectories:"
+msgstr "Unterverzeichnisse:"
+
+#: LYMessages.c:786
+msgid " directory"
+msgstr " Verzeichnis"
+
+#: LYMessages.c:787
+msgid "Up to "
+msgstr "Rauf nach "
+
+#: LYMessages.c:788
+msgid "Current directory is "
+msgstr "Dies Verzeichnis ist "
+
+# This appears in FTP directory listings. "Symbolischer Link"
+# does not fit in the (default?) format. - kw
+#. HTFTP.c
+#: LYMessages.c:791
+msgid "Symbolic Link"
+msgstr "Symbolic Link"
+
+#. HTGopher.c
+#: LYMessages.c:794
+msgid "No response from server!"
+msgstr "Keine Antwort vom Server!"
+
+#: LYMessages.c:795
+msgid "CSO index"
+msgstr "CSO-index"
+
+#: LYMessages.c:796
+msgid ""
+"\n"
+"This is a searchable index of a CSO database.\n"
+msgstr ""
+"\n"
+"Dies ist ein abfragbarer Index einer CSO-Datenbank.\n"
+
+#: LYMessages.c:797
+msgid "CSO Search Results"
+msgstr "CSO-Suchresultate"
+
+#: LYMessages.c:798
+#, c-format
+msgid "Seek fail on %s\n"
+msgstr "Suchfehler auf %s\n"
+
+#: LYMessages.c:799
+msgid ""
+"\n"
+"Press the 's' key and enter search keywords.\n"
+msgstr ""
+"\n"
+"Drück die Taste 's' und dann gib Schbegriffe ein.\n"
+
+#: LYMessages.c:800
+msgid ""
+"\n"
+"This is a searchable Gopher index.\n"
+msgstr ""
+"\n"
+"Dies ist ein abfragbarer Gopher-Index.\n"
+
+#: LYMessages.c:801
+msgid "Gopher index"
+msgstr "Gopher-Index"
+
+#: LYMessages.c:802
+msgid "Gopher Menu"
+msgstr "Gophermenü"
+
+#: LYMessages.c:803
+msgid " Search Results"
+msgstr " Suchergebnisse"
+
+#: LYMessages.c:804
+msgid "Sending CSO/PH request."
+msgstr "CSO/PH-Request wird geschickt."
+
+#: LYMessages.c:805
+msgid "Sending Gopher request."
+msgstr "Gopher-Request wird geschickt."
+
+#: LYMessages.c:806
+msgid "CSO/PH request sent; waiting for response."
+msgstr "CSO/PH-Request geschickt; warten auf Antwort."
+
+#: LYMessages.c:807
+msgid "Gopher request sent; waiting for response."
+msgstr "Gopher-Request geschickt; warten auf Godot."
+
+#: LYMessages.c:808
+msgid ""
+"\n"
+"Please enter search keywords.\n"
+msgstr ""
+"\n"
+"Bitte Suchwörter eingeben.\n"
+
+#: LYMessages.c:809
+msgid ""
+"\n"
+"The keywords that you enter will allow you to search on a"
+msgstr ""
+"\n"
+"Die einzugebenden Wörter erlauben die Suche nach einem"
+
+#: LYMessages.c:810
+msgid " person's name in the database.\n"
+msgstr " Personennamen in der Datenbank.\n"
+
+#. HTNews.c
+#: LYMessages.c:813
+msgid "Connection closed ???"
+msgstr "Verbindung zugemacht ???"
+
+#: LYMessages.c:814
+msgid "Cannot open temporary file for news POST."
+msgstr "Temporäre Datei für das Posten der News-Message kann nicht geöffnet werden."
+
+#: LYMessages.c:815
+msgid "This client does not contain support for posting to news with SSL."
+msgstr "Dieses Clientprogramm hat keine Unterstützung für das News-Posten mit SSL."
+
+# These functions are never being called.
+#. HTStyle.c
+#: LYMessages.c:818
+#, c-format
+msgid "Style %d `%s' SGML:%s. Font %s %.1f point.\n"
+msgstr "Stil %d `%s' SGML:%s. Schrift %s %.1f point.\n"
+
+# These functions are never being called.
+#: LYMessages.c:820
+#, c-format
+msgid "\tAlign=%d, %d tabs. (%.0f before, %.0f after)\n"
+msgstr "\tAusrichten=%d, %d tabs. (%.0f vor, %.0f danach)\n"
+
+# These functions are never being called.
+#: LYMessages.c:821
+#, c-format
+msgid "\t\tTab kind=%d at %.0f\n"
+msgstr "\t\tTabulator-Art=%d bei %.0f\n"
+
+#. HTTP.c
+#: LYMessages.c:824
+msgid "Can't proceed without a username and password."
+msgstr "Weitermachen ohne Username und Passwort nicht möglich."
+
+#: LYMessages.c:825
+msgid "Can't retry with authorization! Contact the server's WebMaster."
+msgstr "Autorisierungversuche fehlgeschlagen! Webmaster kontaktieren."
+
+#: LYMessages.c:826
+msgid "Can't retry with proxy authorization! Contact the server's WebMaster."
+msgstr "Proxy-Autorisierungversuche fehlgeschlagen! Frag den Cachemaster oder so..."
+
+#: LYMessages.c:827
+msgid "Retrying with proxy authorization information."
+msgstr "Wir versuchen's noch einmal, mit Proxy-Autorisierungsinfo."
+
+#: LYMessages.c:828
+#, c-format
+msgid "SSL error:%s-Continue?"
+msgstr "SSL-Fehler:%s - Fortfahren?"
+
+#. HTWAIS.c
+#: LYMessages.c:831
+msgid "HTWAIS: Return message too large."
+msgstr "HTWAIS: Message zu lang."
+
+#: LYMessages.c:832
+msgid "Enter WAIS query: "
+msgstr "Gib WAIS-Frage ein: "
+
+#. Miscellaneous status
+#: LYMessages.c:835
+msgid "Retrying as HTTP0 request."
+msgstr "Wir versuchen's noch einmal, als HTTP0-Request."
+
+#: LYMessages.c:836
+#, c-format
+msgid "Transferred %d bytes"
+msgstr "%d bytes übertragen"
+
+#: LYMessages.c:837
+msgid "Data transfer complete"
+msgstr "Datenübertragung abgeschlossen"
+
+#: LYMessages.c:838
+#, c-format
+msgid "Error processing line %d of %s\n"
+msgstr "Fehler beim Verarbeiten von Zeile %d von %s\n"
+
+#. Lynx internal page titles
+#: LYMessages.c:841
+msgid "Address List Page"
+msgstr "Linkadressenliste"
+
+#: LYMessages.c:842
+msgid "Bookmark file"
+msgstr "Lesezeichendatei"
+
+#: LYMessages.c:843
+msgid "Configuration Definitions"
+msgstr "Konfiguration"
+
+#: LYMessages.c:844
+msgid "Cookie Jar"
+msgstr "Keksbeutel (Cookie Jar)"
+
+#: LYMessages.c:845
+msgid "Current Edit-Key Map"
+msgstr "Aktuelle Tastaturbelegung"
+
+#: LYMessages.c:846
+msgid "Current Key Map"
+msgstr "Aktuelle Tastaturbelegung"
+
+#: LYMessages.c:847
+msgid "File Management Options"
+msgstr "Dateimanagement-Menü"
+
+#: LYMessages.c:848
+msgid "Download Options"
+msgstr "Download-Menü"
+
+#: LYMessages.c:849
+msgid "History Page"
+msgstr "History- oder Geschichtsseite"
+
+#: LYMessages.c:850
+msgid "Cache Jar"
+msgstr "Cachebeutel (Cache Jar)"
+
+#: LYMessages.c:851
+msgid "List Page"
+msgstr "Linkliste"
+
+#: LYMessages.c:852
+msgid "Lynx.cfg Information"
+msgstr "Informationen über lynx.cfg"
+
+#: LYMessages.c:853
+msgid "Converted Mosaic Hotlist"
+msgstr "Konvertierte Mosaic-Hotlist"
+
+#: LYMessages.c:854
+msgid "Options Menu"
+msgstr "Menü der persönlichen Konfigurationsoptionen"
+
+#: LYMessages.c:855
+msgid "File Permission Options"
+msgstr "Dateizugriffserlaubnis Ändern"
+
+#: LYMessages.c:856
+msgid "Printing Options"
+msgstr "Druckeroptionen"
+
+#: LYMessages.c:857
+msgid "Information about the current document"
+msgstr "Informationen über das aktuelle Dokument"
+
+#: LYMessages.c:858
+msgid "Your recent statusline messages"
+msgstr "Letzte Meldungen von der Statuszeile"
+
+#: LYMessages.c:859
+msgid "Upload Options"
+msgstr "Upload-Optionen"
+
+#: LYMessages.c:860
+msgid "Visited Links Page"
+msgstr "Seite der besuchten Links"
+
+#. CONFIG_DEF_TITLE subtitles
+#: LYMessages.c:863
+msgid "See also"
+msgstr "Siehe auch"
+
+#: LYMessages.c:864
+msgid "your"
+msgstr "dein"
+
+#: LYMessages.c:865
+msgid "for runtime options"
+msgstr "für Runtime-Optionen"
+
+#: LYMessages.c:866
+msgid "compile time options"
+msgstr "Einkompilierte Optionen"
+
+#: LYMessages.c:867
+msgid "color-style configuration"
+msgstr "Farbstil-Konfiguration"
+
+#: LYMessages.c:868
+msgid "latest release"
+msgstr "letzte Fassung"
+
+#: LYMessages.c:869
+msgid "pre-release version"
+msgstr "Pre-Release-Version"
+
+#: LYMessages.c:870
+msgid "development version"
+msgstr "Development-Version"
+
+#. #define AUTOCONF_CONFIG_CACHE
+#: LYMessages.c:872
+msgid ""
+"The following data were derived during the automatic configuration/build\n"
+"process of this copy of Lynx. When reporting a bug, please include a copy\n"
+"of this page."
+msgstr ""
+"Die folgenden Informationen wurden beim Konfigurieren/Zusammenbau dieser\n"
+"Kopie von Lynx automatisch hergeleitet. Beim Melden eines Bugs bitte eine\n"
+"Kopie dieser Seite beifügen."
+
+#. #define AUTOCONF_LYNXCFG_H
+#: LYMessages.c:876
+msgid ""
+"The following data were used as automatically-configured compile-time\n"
+"definitions when this copy of Lynx was built."
+msgstr ""
+"Die folgenden automatisch erzeugten Daten wurden beim Bau\n"
+"dieser Programmkopie als Definitionen verwendet."
+
+#. #define DIRED_NOVICELINE
+#: LYMessages.c:881
+msgid " C)reate D)ownload E)dit F)ull menu M)odify R)emove T)ag U)pload \n"
+msgstr " C) Erzeugen D) Download E) Editieren F) Menü M) Ändern R) Löschen T) Markieren U) Upload\n"
+
+#: LYMessages.c:882
+msgid "Failed to obtain status of current link!"
+msgstr "Der Status des aktuellen Links konnte nicht bestimmt werden!"
+
+#. #define INVALID_PERMIT_URL
+#: LYMessages.c:885
+msgid "Special URL only valid from current File Permission menu!"
+msgstr "Dieser spezielle URL ist nur vom aktiven Zugriffsrechtemenü aus verwendbar!"
+
+#: LYMessages.c:889
+msgid "External support is currently disabled."
+msgstr "Unterstützung für EXTERNAL ist zurzeit ausgeschaltet."
+
+#. new with 2.8.4dev.21
+#: LYMessages.c:893
+msgid "Changing working-directory is currently disabled."
+msgstr "Wechseln des Arbeitsverzeichnisses ist zurzeit nicht aktiviert."
+
+#: LYMessages.c:894
+msgid "Linewrap OFF!"
+msgstr "Linewrap AUS!"
+
+#: LYMessages.c:895
+msgid "Linewrap ON!"
+msgstr "Linewrap AN!"
+
+#: LYMessages.c:896
+msgid "Parsing nested-tables toggled OFF! Reloading..."
+msgstr "Erkennung verschachtelter Tabellen ist AUSgeschaltet! Reloading..."
+
+#: LYMessages.c:897
+msgid "Parsing nested-tables toggled ON! Reloading..."
+msgstr "Erkennung verschachtelter Tabellen ist EINgeschaltet! Reloading..."
+
+#: LYMessages.c:898
+msgid "Shifting is disabled while line-wrap is in effect"
+msgstr "Versetzen ist ausgeschaltet, solange Zeilenumbruch aktiv ist"
+
+#: LYMessages.c:899
+msgid "Trace not supported"
+msgstr "Trace hat keine Unterstützung"
+
+# These functions are never being called.
+#: LYMessages.c:819
+#, c-format
+msgid "\tIndents: first=%.0f others=%.0f, Height=%.1f Desc=%.1f\n"
+msgstr "\tEinrückungen: Erste=%.0f, Andere=%.0f, Höhe=%.1f, Nachklapp=%.1f\n"
+
+#: WWW/Library/Implementation/HTAABrow.c:575
+#, c-format
+msgid "username for realm %s changed from %s to %s"
+msgstr "Benutzername für Bereich %s wurde von %s in %s geändert"
+
+#: WWW/Library/Implementation/HTAABrow.c:591
+#, c-format
+msgid "password for realm %s user %s changed"
+msgstr "Passwort für Bereich %s, Benutzer %s wurde geändert"
+
+#: WWW/Library/Implementation/HTAABrow.c:703
+#, c-format
+msgid "Username for '%s' at %s '%s%s':"
+msgstr "Username für '%s' auf %s '%s%s':"
+
+#: WWW/Library/Implementation/HTAABrow.c:976
+msgid "This client doesn't know how to compose proxy authorization information for scheme"
+msgstr "Dieses Programm kann nichts anfangen mit dem Schema für Proxy-Autorisierung"
+
+#: WWW/Library/Implementation/HTAABrow.c:1053
+msgid "This client doesn't know how to compose authorization information for scheme"
+msgstr "Dieses Programm weiß nichts anzufangen mit dem Autorisierungsschema"
+
+#: WWW/Library/Implementation/HTAABrow.c:1162
+#, c-format
+msgid "Invalid header '%s%s%s%s%s'"
+msgstr "Ungültiger Header '%s%s%s%s%s'"
+
+#: WWW/Library/Implementation/HTAABrow.c:1266
+msgid "Proxy authorization required -- retrying"
+msgstr "Proxy-Autorisierung verlangt -- wiederholter Versuch"
+
+#: WWW/Library/Implementation/HTAABrow.c:1322
+msgid "Access without authorization denied -- retrying"
+msgstr "Zugang ohne Autorisierung verweigert -- wiederholter Versuch"
+
+#: WWW/Library/Implementation/HTAccess.c:698
+msgid "Access forbidden by rule"
+msgstr "Zugang durch Konfigurationsregel verboten"
+
+#: WWW/Library/Implementation/HTAccess.c:800
+msgid "Document with POST content not found in cache. Resubmit?"
+msgstr "Dokument mit POST-Daten nicht im Seitencache gefunden. POST wiederholen?"
+
+#: WWW/Library/Implementation/HTAccess.c:953
+msgid "Loading failed, use a previous copy."
+msgstr "Laden fehlgeschalten, die vorherige Kopie wird verwendet."
+
+#: WWW/Library/Implementation/HTAccess.c:1062 src/GridText.c:8939
+msgid "Loading incomplete."
+msgstr "Unvollständig geladen."
+
+#: WWW/Library/Implementation/HTAccess.c:1093
+#, c-format
+msgid "**** HTAccess: socket or file number returned by obsolete load routine!\n"
+msgstr "**** HTAccess: Alte Laderoutine hat Socket- oder Dateinummer zurückgegeben!\n"
+
+#: WWW/Library/Implementation/HTAccess.c:1095
+#, c-format
+msgid "**** HTAccess: Internal software error. Please mail lynx-dev@nongnu.org!\n"
+msgstr "**** HTAccess: Interner Softwarefehler. Bitte lynx-dev@nongnu.org benachrichtigen!\n"
+
+#: WWW/Library/Implementation/HTAccess.c:1096
+#, c-format
+msgid "**** HTAccess: Status returned was: %d\n"
+msgstr "**** HTAccess: Der empfangene Statuscode war %d\n"
+
+#.
+#. * hack: if we fail in HTAccess.c
+#. * avoid duplicating URL, oh.
+#.
+#: WWW/Library/Implementation/HTAccess.c:1102 src/LYMainLoop.c:8076
+msgid "Can't Access"
+msgstr "Zugriff fehlgeschlagen"
+
+#: WWW/Library/Implementation/HTAccess.c:1110
+msgid "Unable to access document."
+msgstr "Zugriff auf Dokument nicht möglich."
+
+#: WWW/Library/Implementation/HTFTP.c:870
+#, c-format
+msgid "Enter password for user %s@%s:"
+msgstr "Passwort eingeben für User %s@%s:"
+
+#: WWW/Library/Implementation/HTFTP.c:898
+msgid "Unable to connect to FTP host."
+msgstr "Verbindung zum FTP-Host konnte nicht hergestellt werden."
+
+#: WWW/Library/Implementation/HTFTP.c:1137
+msgid "close master socket"
+msgstr "close master socket"
+
+#: WWW/Library/Implementation/HTFTP.c:1195
+msgid "socket for master socket"
+msgstr "socket for master socket"
+
+#: WWW/Library/Implementation/HTFTP.c:2925
+msgid "Receiving FTP directory."
+msgstr "FTP-Verzeichnis wird empfangen."
+
+#: WWW/Library/Implementation/HTFTP.c:3063
+#, c-format
+msgid "Transferred %d bytes (%5d)"
+msgstr "%d bytes übertragen (%5d)"
+
+#: WWW/Library/Implementation/HTFTP.c:3421
+msgid "connect for data"
+msgstr "connect for data"
+
+#: WWW/Library/Implementation/HTFTP.c:4098
+msgid "Receiving FTP file."
+msgstr "FTP-Datei wird empfangen."
+
+#: WWW/Library/Implementation/HTFinger.c:274
+msgid "Could not set up finger connection."
+msgstr "\"Finger\"-Verbindung konnte nicht hergestellt werden."
+
+#: WWW/Library/Implementation/HTFinger.c:321
+msgid "Could not load data (no sitename in finger URL)"
+msgstr "Nichts geladen (kein Site-Name im \"finger\"-URL)"
+
+#: WWW/Library/Implementation/HTFinger.c:325
+msgid "Invalid port number - will only use port 79!"
+msgstr "Ungültige Portnummer - Nur Port 79 kann benutzt werden!"
+
+#: WWW/Library/Implementation/HTFinger.c:391
+msgid "Could not access finger host."
+msgstr "Der \"finger\"-Host konnte nicht erreicht werden."
+
+#: WWW/Library/Implementation/HTFinger.c:399
+msgid "No response from finger server."
+msgstr "Keine Antwort vom \"finger\"-Server."
+
+#: WWW/Library/Implementation/HTNews.c:439
+#, c-format
+msgid "Username for news host '%s':"
+msgstr "Username für den News-Host '%s':"
+
+#: WWW/Library/Implementation/HTNews.c:492
+msgid "Change username?"
+msgstr "Username ändern?"
+
+#: WWW/Library/Implementation/HTNews.c:496
+msgid "Username:"
+msgstr "Username:"
+
+#: WWW/Library/Implementation/HTNews.c:521
+#, c-format
+msgid "Password for news host '%s':"
+msgstr "Passwort für den News-Host '%s':"
+
+#: WWW/Library/Implementation/HTNews.c:604
+msgid "Change password?"
+msgstr "Passwort ändern?"
+
+#: WWW/Library/Implementation/HTNews.c:1725
+#, c-format
+msgid "No matches for: %s"
+msgstr "Keine passenden Newsgroups für: %s"
+
+#: WWW/Library/Implementation/HTNews.c:1775
+msgid ""
+"\n"
+"No articles in this group.\n"
+msgstr ""
+"\n"
+"Keine Messages in dieser Newsgroup.\n"
+
+#: WWW/Library/Implementation/HTNews.c:1787
+msgid ""
+"\n"
+"No articles in this range.\n"
+msgstr ""
+"\n"
+"Keine Messages in diesem Bereich.\n"
+
+#.
+#. * Set window title.
+#.
+#: WWW/Library/Implementation/HTNews.c:1800
+#, c-format
+msgid "%s, Articles %d-%d"
+msgstr "%s, Messages %d-%d"
+
+#: WWW/Library/Implementation/HTNews.c:1823
+msgid "Earlier articles"
+msgstr "Frühere Messages"
+
+#: WWW/Library/Implementation/HTNews.c:1836
+#, c-format
+msgid ""
+"\n"
+"There are about %d articles currently available in %s, IDs as follows:\n"
+"\n"
+msgstr ""
+"\n"
+"Ungefähr %d Messages zurzeit vorhanden in %s, IDs wie folgt:\n"
+"\n"
+
+#: WWW/Library/Implementation/HTNews.c:1898
+msgid "All available articles in "
+msgstr "Alle zugänglichen Messages in "
+
+#: WWW/Library/Implementation/HTNews.c:2112
+msgid "Later articles"
+msgstr "Spätere Messages"
+
+#: WWW/Library/Implementation/HTNews.c:2135
+msgid "Post to "
+msgstr "Message hinterlassen (Post) in "
+
+#: WWW/Library/Implementation/HTNews.c:2356
+msgid "This client does not contain support for SNEWS URLs."
+msgstr "Dieses Programm hat keine Unterstützung für SNEWS URLs."
+
+#: WWW/Library/Implementation/HTNews.c:2565
+msgid "No target for raw text!"
+msgstr "Kein target für rohen Text!"
+
+#: WWW/Library/Implementation/HTNews.c:2595
+msgid "Connecting to NewsHost ..."
+msgstr "Verbindungserstellung zum News-Host ..."
+
+#: WWW/Library/Implementation/HTNews.c:2647
+#, c-format
+msgid "Could not access %s."
+msgstr "Kein Zugang zu %s."
+
+#: WWW/Library/Implementation/HTNews.c:2753
+#, c-format
+msgid "Can't read news info. News host %.20s responded: %.200s"
+msgstr "News-Info kann nicht gelesen werden. Server %.20s antwortet: %.200s"
+
+#: WWW/Library/Implementation/HTNews.c:2757
+#, c-format
+msgid "Can't read news info, empty response from host %s"
+msgstr "News-Info kann nicht gelesen werden. Leere Antwort von Server %s"
+
+#.
+#. * List available newsgroups. - FM
+#.
+#: WWW/Library/Implementation/HTNews.c:2961
+msgid "Reading list of available newsgroups."
+msgstr "Liste vorhandener Newsgroups wird geladen."
+
+#: WWW/Library/Implementation/HTNews.c:2982
+msgid "Reading list of articles in newsgroup."
+msgstr "Liste der vorhandenen Messages wird geladen."
+
+#.
+#. * Get an article from a news group. - FM
+#.
+#: WWW/Library/Implementation/HTNews.c:2988
+msgid "Reading news article."
+msgstr "News-Message wird geladen."
+
+#: WWW/Library/Implementation/HTNews.c:3018
+msgid "Sorry, could not load requested news."
+msgstr "Entschuldigung: konnte die angeforderten News nicht laden."
+
+#: WWW/Library/Implementation/HTTCP.c:1339
+msgid "Address has invalid port"
+msgstr "Adresslänge hat einen ungültigen port"
+
+#: WWW/Library/Implementation/HTTCP.c:1410
+msgid "Address length looks invalid"
+msgstr "Adresslänge scheint ungültig zu sein"
+
+#: WWW/Library/Implementation/HTTCP.c:1868
+msgid "SOCKS5: no hostname found."
+msgstr "SOCKS5: kein Hostname gefunden."
+
+#: WWW/Library/Implementation/HTTCP.c:1874
+msgid "SOCKS5: hostname too long."
+msgstr "SOCKS5: Hostname zu lang."
+
+#: WWW/Library/Implementation/HTTCP.c:1892
+#, c-format
+msgid "(for %s at %s) SOCKS5"
+msgstr "(für %s bei %s) SOCKS5"
+
+#: WWW/Library/Implementation/HTTCP.c:1919
+#: WWW/Library/Implementation/HTTCP.c:1936
+#, c-format
+msgid "Unable to locate remote host %s."
+msgstr "Remote Host %s nicht gefunden."
+
+#. Not HTProgress, so warning won't be overwritten immediately;
+#. * but not HTAlert, because typically there will be other
+#. * alerts from the callers. - kw
+#.
+#: WWW/Library/Implementation/HTTCP.c:1933
+#: WWW/Library/Implementation/HTTelnet.c:115
+#, c-format
+msgid "Invalid hostname %s"
+msgstr "Hostname ist ungültig: %s"
+
+#: WWW/Library/Implementation/HTTCP.c:1945
+#, c-format
+msgid "Making %s connection to %s"
+msgstr "%s-Verbindung zu %s wird aufgebaut"
+
+#: WWW/Library/Implementation/HTTCP.c:1955
+msgid "socket failed."
+msgstr "Socket-Fehler."
+
+#: WWW/Library/Implementation/HTTCP.c:1969
+#, c-format
+msgid "socket failed: family %d addr %s port %s."
+msgstr "Socketfehler: family %d addr %s port %s."
+
+#: WWW/Library/Implementation/HTTCP.c:1992
+msgid "Could not make connection non-blocking."
+msgstr "Verbindung konnte nicht non-blocking gemacht werden."
+
+#: WWW/Library/Implementation/HTTCP.c:2058
+msgid "Connection failed (too many retries)."
+msgstr "Verbindungsfehler (zu viele Versuche)."
+
+#: WWW/Library/Implementation/HTTCP.c:2253
+msgid "Could not restore socket to blocking."
+msgstr "Socket konnte nicht wieder blocking gemacht werden."
+
+#. RFC 1928: CONNECT request
+#: WWW/Library/Implementation/HTTCP.c:2285
+#, c-format
+msgid "SOCKS5: connecting to %s"
+msgstr "SOCKS5: Verbindung zu %s wird aufgebaut"
+
+#: WWW/Library/Implementation/HTTCP.c:2314
+msgid "SOCKS server failure"
+msgstr "Ausfall des SOCKS-Servers"
+
+#: WWW/Library/Implementation/HTTCP.c:2317
+msgid "connection not allowed by ruleset"
+msgstr "Verbindung durch Regelwerk nicht erlaubt"
+
+#: WWW/Library/Implementation/HTTCP.c:2320
+msgid "network unreachable"
+msgstr "Netzwerk unerreichbar"
+
+#: WWW/Library/Implementation/HTTCP.c:2323
+msgid "host unreachable"
+msgstr "Host unerreichbar"
+
+#: WWW/Library/Implementation/HTTCP.c:2326
+msgid "connection refused"
+msgstr "Verbindung verweigert"
+
+#: WWW/Library/Implementation/HTTCP.c:2329
+msgid "TTL expired"
+msgstr "TTL abgelaufen"
+
+#: WWW/Library/Implementation/HTTCP.c:2332
+msgid "command not supported"
+msgstr "Befehl nicht unterstützt"
+
+#: WWW/Library/Implementation/HTTCP.c:2335
+msgid "address type not supported"
+msgstr "Adresstyp nicht unterstützt"
+
+#: WWW/Library/Implementation/HTTCP.c:2338
+msgid "unknown SOCKS error code"
+msgstr "unbekannter SOCKS-Fehlercode"
+
+#: WWW/Library/Implementation/HTTCP.c:2383
+msgid "unexpected reply\n"
+msgstr "unerwartete Antwort\n"
+
+#: WWW/Library/Implementation/HTTCP.c:2460
+msgid "Socket read failed (too many tries)."
+msgstr "Lesefehler (zu viele Versuche)."
+
+#: WWW/Library/Implementation/HTTP.c:165
+#, c-format
+msgid "SSL callback:%s, preverify_ok=%d, ssl_okay=%d"
+msgstr "SSL callback:%s, preverify_ok=%d, ssl_okay=%d"
+
+#: WWW/Library/Implementation/HTTP.c:668
+#, c-format
+msgid "User/password contains only punctuation: %s"
+msgstr "Benutzername/Passwort enthält nur Satzzeichen: %s"
+
+#: WWW/Library/Implementation/HTTP.c:672
+#, c-format
+msgid "User/password may be confused with hostname: '%s' (e.g, '%s')"
+msgstr "Benutzer/Passwort könnte mit Rechnername verwechselt werden: »%s« (z. B. »%s«)"
+
+#: WWW/Library/Implementation/HTTP.c:733
+#, c-format
+msgid "Certificate issued by: %s"
+msgstr "Zertifikat herausgegeben von: %s"
+
+#: WWW/Library/Implementation/HTTP.c:922
+msgid "This client does not contain support for HTTPS URLs."
+msgstr "Dieses Programm hat keine Unterstützung für HTTPS-URLs."
+
+#: WWW/Library/Implementation/HTTP.c:947
+msgid "Unable to connect to remote host."
+msgstr "Verbindung zum remote Host konnte nicht hergestellt werden."
+
+#: WWW/Library/Implementation/HTTP.c:990
+msgid "Retrying connection without TLS."
+msgstr "Verbindung erneut versuchen, ohne TLS."
+
+#: WWW/Library/Implementation/HTTP.c:1042
+msgid "GnuTLS error when trying to verify certificate."
+msgstr "GnuTLS-Fehler beim Versuch, die Zertifikate zu verifizieren."
+
+#: WWW/Library/Implementation/HTTP.c:1055
+msgid "the certificate has no known issuer"
+msgstr "Das Zertifikat hat keinen bekannten Herausgeber"
+
+#: WWW/Library/Implementation/HTTP.c:1057
+msgid "no issuer was found"
+msgstr "Kein Herausgeber gefunden"
+
+#: WWW/Library/Implementation/HTTP.c:1059
+msgid "issuer is not a CA"
+msgstr "Herausgeber ist keine CA"
+
+#: WWW/Library/Implementation/HTTP.c:1061
+msgid "the certificate has been revoked"
+msgstr "Das Zertifikat wurde widerrufen"
+
+#: WWW/Library/Implementation/HTTP.c:1063
+msgid "the certificate is not trusted"
+msgstr "Dem Zertifikat wird nicht vertraut"
+
+#: WWW/Library/Implementation/HTTP.c:1138
+#, c-format
+msgid "Verified connection to %s (cert=%s)"
+msgstr "Verifizierte Verbindung zu %s (cert=%s)"
+
+#: WWW/Library/Implementation/HTTP.c:1188
+#: WWW/Library/Implementation/HTTP.c:1230
+#, c-format
+msgid "Verified connection to %s (subj=%s)"
+msgstr "Verifizierte Verbindung zu %s (subj=%s)"
+
+#: WWW/Library/Implementation/HTTP.c:1260
+msgid "Can't find common name in certificate"
+msgstr "Kann Allgemeinen Namen im Zertifikat nicht finden"
+
+#: WWW/Library/Implementation/HTTP.c:1263
+#, c-format
+msgid "SSL error:host(%s)!=cert(%s)-Continue?"
+msgstr "SSL-Fehler:host(%s)!=cert(%s) - Fortfahren?"
+
+#: WWW/Library/Implementation/HTTP.c:1270
+msgid "SSL error"
+msgstr "SSL-Fehler"
+
+#: WWW/Library/Implementation/HTTP.c:1278
+#, c-format
+msgid "UNVERIFIED connection to %s (cert=%s)"
+msgstr "UNVERIFIZIERTE Verbindung zu %s (cert=%s)"
+
+#: WWW/Library/Implementation/HTTP.c:1287
+#, c-format
+msgid "Secure %d-bit %s (%s) HTTP connection"
+msgstr "Sichere %d Bit %s (%s) HTTP-Verbindung"
+
+#: WWW/Library/Implementation/HTTP.c:1757
+msgid "Sending HTTP request."
+msgstr "HTTP Request wird geschickt."
+
+#: WWW/Library/Implementation/HTTP.c:1799
+msgid "Unexpected network write error; connection aborted."
+msgstr "Unerwarteter Netzschreibfehler; Verbindung abgebrochen."
+
+#: WWW/Library/Implementation/HTTP.c:1805
+msgid "HTTP request sent; waiting for response."
+msgstr "HTTP Request geschickt; warten auf Antwort."
+
+#: WWW/Library/Implementation/HTTP.c:1878
+#: WWW/Library/Implementation/HTTP.c:1888
+msgid "Unexpected network read error; connection aborted."
+msgstr "Unerwarteter Netzlesefehler; Verbindung abgebrochen."
+
+#.
+#. * HTTP/1.1 Informational statuses.
+#. * 100 Continue.
+#. * 101 Switching Protocols.
+#. * > 101 is unknown.
+#. * We should never get these, and they have only the status
+#. * line and possibly other headers, so we'll deal with them by
+#. * showing the full header to the user as text/plain. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2091
+msgid "Got unexpected Informational Status."
+msgstr "Unerwarteter Informations-Statuscode empfangen."
+
+#.
+#. * Reset Content. The server has fulfilled the request but
+#. * nothing is returned and we should reset any form
+#. * content. We'll instruct the user to do that, and
+#. * restore the current document. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2125
+msgid "Request fulfilled. Reset Content."
+msgstr "Request ausgeführt. Seiteninhalt zurücksetzen."
+
+#. Not Modified
+#.
+#. * We didn't send an "If-Modified-Since" header, so this
+#. * status is inappropriate. We'll deal with it by showing
+#. * the full header to the user as text/plain. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2242
+msgid "Got unexpected 304 Not Modified status."
+msgstr "Unerwarteter Status 304 \"Not Modified\"."
+
+#: WWW/Library/Implementation/HTTP.c:2305
+msgid "Redirection of POST content requires user approval."
+msgstr "Bestätigung ist erforderlich für Umleitung von POST-Daten."
+
+#: WWW/Library/Implementation/HTTP.c:2320
+msgid "Have POST content. Treating Permanent Redirection as Temporary.\n"
+msgstr "POST-Request. Permanente Umleitung wird als temporär behandelt.\n"
+
+#: WWW/Library/Implementation/HTTP.c:2366
+msgid "Retrying with access authorization information."
+msgstr "Wir versuchen's noch einmal mit Autorisierungsinfo."
+
+#: WWW/Library/Implementation/HTTP.c:2378
+msgid "Show the 401 message body?"
+msgstr "Inhalt der 401-Antwort zeigen?"
+
+#: WWW/Library/Implementation/HTTP.c:2422
+msgid "Show the 407 message body?"
+msgstr "Inhalt der 407-Antwort zeigen?"
+
+#.
+#. * Bad or unknown server_status number. Take a chance and hope
+#. * there is something to display. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2522
+msgid "Unknown status reply from server!"
+msgstr "Unbekannter Statuscode in Antwort vom Server!"
+
+#: WWW/Library/Implementation/HTTelnet.c:113
+#, c-format
+msgid "remote %s session:"
+msgstr "Entfernte %s Sitzung:"
+
+#: WWW/Library/Implementation/HTWAIS.c:163
+msgid "Could not connect to WAIS server."
+msgstr "Verbindungsaufnahme zum WAIS-Server fehlgeschlagen."
+
+#: WWW/Library/Implementation/HTWAIS.c:171
+msgid "Could not open WAIS connection for reading."
+msgstr "Verbindung zum WAIS Server konnte nicht fürs Lesen geöffnet werden."
+
+#: WWW/Library/Implementation/HTWAIS.c:193
+msgid "Diagnostic code is "
+msgstr "Codenummer für Dignose ist "
+
+#: WWW/Library/Implementation/HTWAIS.c:460
+msgid "Index "
+msgstr "Index "
+
+#: WWW/Library/Implementation/HTWAIS.c:464
+#, c-format
+msgid " contains the following %d item%s relevant to \""
+msgstr " enthält folgenden %d relevanten Item%s für \""
+
+#: WWW/Library/Implementation/HTWAIS.c:472
+msgid "The first figure after each entry is its relative score, "
+msgstr "Die erste Zahl nach jedem Eintrag ist die relative Bewertung, "
+
+#: WWW/Library/Implementation/HTWAIS.c:473
+msgid "the second is the number of lines in the item."
+msgstr "die zweite ist die Länge des Items in Zeilen."
+
+#: WWW/Library/Implementation/HTWAIS.c:515
+msgid " (bad file name)"
+msgstr "(falscher Dateiname)"
+
+#: WWW/Library/Implementation/HTWAIS.c:541
+msgid "(bad doc id)"
+msgstr "(schlechte Dokument-Identifizierungsnummer)"
+
+#: WWW/Library/Implementation/HTWAIS.c:557
+msgid "(Short Header record, can't display)"
+msgstr "(Kurzer Kopfeintrag, Anzeige nicht möglich)"
+
+#: WWW/Library/Implementation/HTWAIS.c:564
+msgid ""
+"\n"
+"Long Header record, can't display\n"
+msgstr ""
+"\n"
+"Langer Kopfeintrag, Anzeige nicht möglich\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:571
+msgid ""
+"\n"
+"Text record\n"
+msgstr ""
+"\n"
+"Texteintrag\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:580
+msgid ""
+"\n"
+"Headline record, can't display\n"
+msgstr ""
+"\n"
+"Überschriftseintrag, Anzeige nicht möglich\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:588
+msgid ""
+"\n"
+"Code record, can't display\n"
+msgstr ""
+"\n"
+"Codeeintrag, Anzeige nicht möglich\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:692
+msgid "Syntax error in WAIS URL"
+msgstr "Syntaxfehler in WAIS-URL"
+
+#: WWW/Library/Implementation/HTWAIS.c:764
+msgid " (WAIS Index)"
+msgstr " (WAIS-Index)"
+
+#: WWW/Library/Implementation/HTWAIS.c:771
+msgid "WAIS Index: "
+msgstr "WAIS-Index: "
+
+#: WWW/Library/Implementation/HTWAIS.c:777
+msgid "This is a link for searching the "
+msgstr "Dies ist ein Link zum Abfragen des "
+
+#: WWW/Library/Implementation/HTWAIS.c:781
+msgid " WAIS Index.\n"
+msgstr " WAIS-Index.\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:810
+msgid ""
+"\n"
+"Enter the 's'earch command and then specify search words.\n"
+msgstr ""
+"\n"
+" Tastenkommando 's' für Suche, dann Suchwörter eingeben.\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:832
+msgid " (in "
+msgstr " (in "
+
+#: WWW/Library/Implementation/HTWAIS.c:841
+msgid "WAIS Search of \""
+msgstr "WAIS-Suche von \""
+
+#: WWW/Library/Implementation/HTWAIS.c:845
+msgid "\" in: "
+msgstr "\" in: "
+
+#: WWW/Library/Implementation/HTWAIS.c:860
+msgid "HTWAIS: Request too large."
+msgstr "HTWAIS: Request zu lang."
+
+#: WWW/Library/Implementation/HTWAIS.c:869
+msgid "Searching WAIS database..."
+msgstr "WAIS-Datenbang wird abgefragt..."
+
+#: WWW/Library/Implementation/HTWAIS.c:879
+msgid "Search interrupted."
+msgstr "Suche unterbrochen."
+
+#: WWW/Library/Implementation/HTWAIS.c:930
+msgid "Can't convert format of WAIS document"
+msgstr "Format des WAIS-Dokuments kann nicht konvertiert werden"
+
+#: WWW/Library/Implementation/HTWAIS.c:974
+msgid "HTWAIS: Request too long."
+msgstr "HTWAIS: Request zu lang."
+
+#.
+#. * Actually do the transaction given by request_message.
+#.
+#: WWW/Library/Implementation/HTWAIS.c:988
+msgid "Fetching WAIS document..."
+msgstr "WAIS-Dokument wird geholt..."
+
+#. display_search_response(target, retrieval_response,
+#. wais_database, keywords);
+#: WWW/Library/Implementation/HTWAIS.c:1027
+msgid "No text was returned!\n"
+msgstr "Kein Text in Antwort!\n"
+
+#: WWW/Library/Implementation/HTWSRC.c:302
+msgid " NOT GIVEN in source file; "
+msgstr " NICHT VORHANDEN in Quelldatei; "
+
+#: WWW/Library/Implementation/HTWSRC.c:325
+msgid " WAIS source file"
+msgstr " WAIS-Quelldatei"
+
+#: WWW/Library/Implementation/HTWSRC.c:332
+msgid " description"
+msgstr " Beschreibungs"
+
+#: WWW/Library/Implementation/HTWSRC.c:342
+msgid "Access links"
+msgstr "Zugriffslinks"
+
+#: WWW/Library/Implementation/HTWSRC.c:363
+msgid "Direct access"
+msgstr "Direkter Zugriff"
+
+#. * Proxy will be used if defined, so let user know that - FM *
+#: WWW/Library/Implementation/HTWSRC.c:366
+msgid " (or via proxy server, if defined)"
+msgstr " (oder durch Proxyserver, falls definiert)"
+
+#: WWW/Library/Implementation/HTWSRC.c:381
+msgid "Maintainer"
+msgstr "Instandhalter"
+
+#: WWW/Library/Implementation/HTWSRC.c:389
+msgid "Host"
+msgstr "Host"
+
+#: src/GridText.c:723
+msgid "Memory exhausted, display interrupted!"
+msgstr "Speicher erschöpft, Anzeige unterbrochen!"
+
+#: src/GridText.c:728
+msgid "Memory exhausted, will interrupt transfer!"
+msgstr "Speicher erschöpft, Übertragung wird unterbrochen!"
+
+#: src/GridText.c:1719
+#, c-format
+msgid " (l%d of %d)"
+msgstr " (Z%d von %d)"
+
+#: src/GridText.c:1728
+#, c-format
+msgid " (p%d of %d)"
+msgstr " (S%d von %d)"
+
+#: src/GridText.c:3720
+msgid " *** MEMORY EXHAUSTED ***"
+msgstr " *** MEMORY ERSCHÖPFT ***"
+
+#: src/GridText.c:6220
+msgid "text entry field"
+msgstr "Texteingabefeld"
+
+#: src/GridText.c:6223
+msgid "password entry field"
+msgstr "Passwort-Eingabefeld"
+
+#: src/GridText.c:6226
+msgid "checkbox"
+msgstr "Checkbox"
+
+#: src/GridText.c:6229
+msgid "radio button"
+msgstr "Radiobutton"
+
+#: src/GridText.c:6232
+msgid "submit button"
+msgstr "Submit-Button"
+
+#: src/GridText.c:6235
+msgid "reset button"
+msgstr "Reset-Button"
+
+#: src/GridText.c:6238
+msgid "script button"
+msgstr "Script-Button"
+
+#: src/GridText.c:6241
+msgid "popup menu"
+msgstr "Popup-Menü"
+
+#: src/GridText.c:6244
+msgid "hidden form field"
+msgstr "verstecktes Formfeld"
+
+#: src/GridText.c:6247
+msgid "text entry area"
+msgstr "Texteingaberegion"
+
+#: src/GridText.c:6250
+msgid "range entry field"
+msgstr "Bereichseingabefeld"
+
+#: src/GridText.c:6253
+msgid "file entry field"
+msgstr "Dateieingabefeld"
+
+#: src/GridText.c:6256
+msgid "text-submit field"
+msgstr "Textsendefeld"
+
+#: src/GridText.c:6259
+msgid "image-submit button"
+msgstr "Image-Sendefeld"
+
+#: src/GridText.c:6262
+msgid "keygen field"
+msgstr "\"Keygen\"-Feld"
+
+#: src/GridText.c:6265
+msgid "unknown form field"
+msgstr "unbekanntes Formfeld"
+
+#: src/GridText.c:6285 src/GridText.c:6292 src/LYList.c:249
+msgid "unknown field or link"
+msgstr "unbekanntes Feld oder Link"
+
+#: src/GridText.c:10722
+msgid "Can't open file for uploading"
+msgstr "Datei kann zum Hochladen nicht geöffnet werden"
+
+#: src/GridText.c:11910
+#, c-format
+msgid "Submitting %s"
+msgstr "%s wird gesandt"
+
+#. ugliness has happened; inform user and do the best we can
+#: src/GridText.c:12980
+msgid "Hang Detect: TextAnchor struct corrupted - suggest aborting!"
+msgstr "Hänger festgestellt: TextAnchor-Konstruktion ist schadhaft - am besten abbrechen!"
+
+#. don't show previous state
+#: src/GridText.c:13139
+msgid "Wrap lines to fit displayed area?"
+msgstr "Zeilen umbrechen, um in den sichtbaren Bereich einzupassen?"
+
+#: src/GridText.c:13772
+msgid "Very long lines have been truncated!"
+msgstr "Sehr lange Zeilen wurden abgeschnitten!"
+
+#: src/HTAlert.c:164 src/LYShowInfo.c:389 src/LYShowInfo.c:393
+msgid "bytes"
+msgstr "bytes"
+
+#.
+#. * If we know the total size of the file, we can compute
+#. * a percentage, and show a corresponding progress bar.
+#.
+#: src/HTAlert.c:328 src/HTAlert.c:354
+#, c-format
+msgid "Read %s of data"
+msgstr "%s der Daten gelesen"
+
+#: src/HTAlert.c:351
+#, c-format
+msgid "Read %s of %s of data"
+msgstr "%s von %s der Daten gelesen"
+
+#: src/HTAlert.c:360
+#, c-format
+msgid ", %s/sec"
+msgstr ", %s/sec"
+
+#: src/HTAlert.c:374
+#, c-format
+msgid " (stalled for %s)"
+msgstr " (unterbrochen für %s)"
+
+#: src/HTAlert.c:378
+#, c-format
+msgid ", ETA %s"
+msgstr ", ETA %s"
+
+#: src/HTAlert.c:400
+msgid " (Press 'z' to abort)"
+msgstr " ('z' für Abbruch)"
+
+#. Meta-note: don't move the following note from its place right
+#. in front of the first gettext(). As it is now, it should
+#. automatically appear in generated lynx.pot files. - kw
+#.
+#. NOTE TO TRANSLATORS: If you provide a translation for "yes", lynx
+#. * will take the first byte of the translation as a positive response
+#. * to Yes/No questions. If you provide a translation for "no", lynx
+#. * will take the first byte of the translation as a negative response
+#. * to Yes/No questions. For both, lynx will also try to show the
+#. * first byte in the prompt as a character, instead of (y) or (n),
+#. * respectively. This will not work right for multibyte charsets!
+#. * Don't translate "yes" and "no" for CJK character sets (or translate
+#. * them to "yes" and "no"). For a translation using UTF-8, don't
+#. * translate if the translation would begin with anything but a 7-bit
+#. * (US_ASCII) character. That also means do not translate if the
+#. * translation would begin with anything but a 7-bit character, if
+#. * you use a single-byte character encoding (a charset like ISO-8859-n)
+#. * but anticipate that the message catalog may be used re-encoded in
+#. * UTF-8 form.
+#. * For translations using other character sets, you may also wish to
+#. * leave "yes" and "no" untranslated, if using (y) and (n) is the
+#. * preferred behavior.
+#. * Lynx will also accept y Y n N as responses unless there is a conflict
+#. * with the first letter of the "yes" or "no" translation.
+#.
+#: src/HTAlert.c:438 src/HTAlert.c:486
+msgid "yes"
+msgstr "ja"
+
+#: src/HTAlert.c:441 src/HTAlert.c:487
+msgid "no"
+msgstr "nein"
+
+#.
+#. * Special-purpose workaround for gettext support (we should do
+#. * this in a more general way) -TD
+#. *
+#. * NOTE TO TRANSLATORS: If the prompt has been rendered into
+#. * another language, and if yes/no are distinct, assume the
+#. * translator can make an ordered list in parentheses with one
+#. * capital letter for each as we assumed in HTConfirmDefault().
+#. * The list has to be in the same order as in the original message,
+#. * and the four capital letters chosen to not match those in the
+#. * original unless they have the same position.
+#. *
+#. * Example:
+#. * (Y/N/Always/neVer) - English (original)
+#. * (O/N/Toujours/Jamais) - French
+#.
+#: src/HTAlert.c:938
+msgid "Y/N/A/V"
+msgstr "J/N/A/V"
+
+#: src/HTML.c:5769
+msgid "Description:"
+msgstr "Beschreibung:"
+
+#: src/HTML.c:5774
+msgid "(none)"
+msgstr "(keine)"
+
+#: src/HTML.c:5778
+msgid "Filepath:"
+msgstr "Dateipfad:"
+
+#: src/HTML.c:5784
+msgid "(unknown)"
+msgstr "(unbekannt)"
+
+#: src/HTML.c:7224
+msgid "Document has only hidden links. Use the 'l'ist command."
+msgstr "Dokument hat nur versteckte Links. Tastenbefehl 'L' für Liste."
+
+#: src/HTML.c:7725
+msgid "Source cache error - disk full?"
+msgstr "Source Cache Fehler - Festplatte voll?"
+
+#: src/HTML.c:7738
+msgid "Source cache error - not enough memory!"
+msgstr "Source Cache Fehler - nicht genug Speicher!"
+
+#: src/LYBookmark.c:167
+msgid ""
+" This file is an HTML representation of the X Mosaic hotlist file.\n"
+" Outdated or invalid links may be removed by using the\n"
+" remove bookmark command, it is usually the 'R' key but may have\n"
+" been remapped by you or your system administrator."
+msgstr ""
+" Diese Datei ist eine HTML-Repräsentation der X-Mosaic-Hotlistdatei.\n"
+" Alte oder ungültige Links können mit dem Tastenbefehl für\n"
+" \"remove bookmark\" entfernt werden, das ist normalerweise der\n"
+" Buchstabe 'R', außer wenn die Tastenbelegung geändert worden ist."
+
+#: src/LYBookmark.c:380
+#, c-format
+msgid ""
+" You can delete links by the 'R' key<br>\n"
+"<ol>\n"
+msgstr ""
+" Sie können Links mit der Taste 'R' löschen<br>\n"
+"<ol>\n"
+
+#: src/LYBookmark.c:383
+msgid ""
+" You can delete links using the remove bookmark command. It is usually\n"
+" the 'R' key but may have been remapped by you or your system\n"
+" administrator."
+msgstr ""
+" Links können mit dem Tastenbefehl für \"remove bookmark\" entfernt werden.\n"
+" Das ist normalerweise der Buchstabe 'R', außer wenn die Tastenbelegung\n"
+" geändert worden ist."
+
+#: src/LYBookmark.c:387
+msgid ""
+" This file also may be edited with a standard text editor to delete\n"
+" outdated or invalid links, or to change their order."
+msgstr ""
+" Diese Datei kann auch mit einem Standard-Texteditor geändert werden,\n"
+" um alte oder ungültige Links zu entfernen, or um die Reihenfolge der\n"
+" Links zu modifizieren."
+
+#: src/LYBookmark.c:390
+msgid ""
+"Note: if you edit this file manually\n"
+" you should not change the format within the lines\n"
+" or add other HTML markup.\n"
+" Make sure any bookmark link is saved as a single line."
+msgstr ""
+"Achtung: Beim manuellen Editieren dieser Datei sollte\n"
+" das Format innerhalb der Zeilen nicht verändert\n"
+" werden. Zusätzliches HTML-Markup sollte nicht\n"
+" verwendet werden. Jeder einzelne Link muss vollständig\n"
+" in einer einzigen Zeile enthalten sein."
+
+#: src/LYBookmark.c:686
+#, c-format
+msgid "File may be recoverable from %s during this session"
+msgstr "Datei kann möglicherweise während dieser Session mit %s wieder rekonstruiert werden"
+
+#: src/LYCgi.c:161
+#, c-format
+msgid "Do you want to execute \"%s\"?"
+msgstr "Wollen Sie \"%s\" ausführen?"
+
+#.
+#. * Neither the path as given nor any components examined by backing up
+#. * were stat()able. - kw
+#.
+#: src/LYCgi.c:276
+msgid "Unable to access cgi script"
+msgstr "Zugang zu CGI-Script nicht möglich"
+
+#: src/LYCgi.c:709 src/LYCgi.c:712
+msgid "Good Advice"
+msgstr "Guter Rat"
+
+#: src/LYCgi.c:716
+msgid "An excellent http server for VMS is available via"
+msgstr "Ein exzellenter HTTP-Server für VMS ist durch"
+
+#: src/LYCgi.c:723
+msgid "this link"
+msgstr "diesen Link erhältlich"
+
+#: src/LYCgi.c:727
+msgid "It provides state of the art CGI script support.\n"
+msgstr "Er hat state of the art CGI-Unterstützung.\n"
+
+#: src/LYClean.c:115
+msgid "Exiting via interrupt:"
+msgstr "Programmende durch Interrupt:"
+
+#: src/LYCookie.c:2651
+msgid "(from a previous session)"
+msgstr "(von vorheriger Session)"
+
+#: src/LYCookie.c:2712
+msgid "Maximum Gobble Date:"
+msgstr "Verfallsdatum:"
+
+#: src/LYCookie.c:2751
+msgid "Internal"
+msgstr "Intern"
+
+#: src/LYCookie.c:2752
+msgid "cookie_domain_flag_set error, aborting program"
+msgstr "cookie_domain_flag_set-Fehler, beende das Programm"
+
+#: src/LYCurses.c:1136
+msgid "Terminal reinitialisation failed - unknown terminal type?"
+msgstr "Terminalneuinitialisierung fehlgeschlagen – unbekannter Terminaltyp?"
+
+#: src/LYCurses.c:1343
+msgid "Terminal initialisation failed - unknown terminal type?"
+msgstr "Terminalinitialisierung fehlgeschlagen - unbekannter Terminaltyp?"
+
+#: src/LYCurses.c:1837
+msgid "Terminal ="
+msgstr "Terminal ="
+
+#: src/LYCurses.c:1841
+msgid "You must use a vt100, 200, etc. terminal with this program."
+msgstr "Ein Textterminal wie VT100, VT200 usw. ist für dieses Programm notwendig."
+
+#: src/LYCurses.c:1890
+msgid "Your Terminal type is unknown!"
+msgstr "Terminaltyp ist unbekannt!"
+
+#: src/LYCurses.c:1891
+msgid "Enter a terminal type:"
+msgstr "Terminaltyp eingeben:"
+
+#: src/LYCurses.c:1905
+msgid "TERMINAL TYPE IS SET TO"
+msgstr "TERMINAL TYPE IS SET TO"
+
+#: src/LYCurses.c:2464
+#, c-format
+msgid ""
+"\n"
+"A Fatal error has occurred in %s Ver. %s\n"
+msgstr ""
+"\n"
+" Ein fataler Fehler passierte in %s Ver. %s\n"
+
+# Yes, this is incomplete... - kw
+#: src/LYCurses.c:2467
+#, c-format
+msgid ""
+"\n"
+"Please notify your system administrator to confirm a bug, and if\n"
+"confirmed, to notify the lynx-dev list. Bug reports should have concise\n"
+"descriptions of the command and/or URL which causes the problem, the\n"
+"operating system name with version number, the TCPIP implementation, the\n"
+"TRACEBACK if it can be captured, and any other relevant information.\n"
+msgstr ""
+"\n"
+" Bitte Systemverwalter benachrichtigen, um einen Bug zu bestätigen, und\n"
+"bei Bestätigung die lynx-dev Mailingliste benachrichtigen. Fehlermeldungen\n"
+"sollten eine knappe Beschreibung des Befehls oder der URL enthalten, die\n"
+"den Fehler verursacht haben, das Betriebssystem mit Versionsnummer,\n"
+"die TCPIP-Implementierung, den TRACEBACK (wenn er gewinnen werden\n"
+"konnte und andere relevante Information.\n"
+
+#: src/LYEdit.c:272
+#, c-format
+msgid "Error starting editor, %s"
+msgstr "Fehler beim Starten des Editors, %s"
+
+#: src/LYEdit.c:275
+msgid "Editor killed by signal"
+msgstr "Editor von Signal abgeschossen"
+
+#: src/LYEdit.c:280
+#, c-format
+msgid "Editor returned with error status %s"
+msgstr "Editor mit Fehler-Status %s beendet"
+
+#: src/LYDownload.c:511
+msgid "Downloaded link:"
+msgstr "Geladener Link:"
+
+#: src/LYDownload.c:516
+msgid "Suggested file name:"
+msgstr "Vorgeschlagener Dateiname:"
+
+#: src/LYDownload.c:521
+msgid "Standard download options:"
+msgstr "Normale Download-Optionen:"
+
+#: src/LYDownload.c:522
+msgid "Download options:"
+msgstr "Download-Optionen:"
+
+#: src/LYDownload.c:538
+msgid "Save to disk"
+msgstr "Speichern auf Disk"
+
+#: src/LYDownload.c:552
+msgid "View temporary file"
+msgstr "Temporäre Datei ansehen"
+
+#: src/LYDownload.c:559
+msgid "Save to disk disabled."
+msgstr "Speichern auf Disk nicht ermöglicht."
+
+#: src/LYDownload.c:563 src/LYPrint.c:1331
+msgid "Local additions:"
+msgstr "Lokale Zusätze:"
+
+#: src/LYDownload.c:574 src/LYUpload.c:206
+msgid "No Name Given"
+msgstr "Kein Name gegeben"
+
+#: src/LYHistory.c:673
+msgid "You selected:"
+msgstr "Abfolge der gewählten Links:"
+
+#: src/LYHistory.c:697 src/LYHistory.c:926
+msgid "(no address)"
+msgstr "(keine Adresse)"
+
+#: src/LYHistory.c:701
+msgid " (internal)"
+msgstr " (intern)"
+
+#: src/LYHistory.c:703
+msgid " (was internal)"
+msgstr " (ehemals intern)"
+
+#: src/LYHistory.c:801
+msgid " (From History)"
+msgstr " (Von History)"
+
+#: src/LYHistory.c:846
+msgid "You visited (POSTs, bookmark, menu and list files excluded):"
+msgstr "Besuchte Links (mit Ausnahme von POST, Lesezeichen, Menüs and Listen):"
+
+#: src/LYHistory.c:1148
+msgid "(No messages yet)"
+msgstr "(Bisher keine Nachrichten)"
+
+# The stuff in LYLeaks.c appears in a Lynx.leaks file, which is only
+# written if compiled with LY_FIND_LEAKS defined (--enable-find-leaks).
+# It's fairly technical, might have been better to leave these strings
+# untranslated. As it is, the spaces in some of the strings are
+# necessary so that things line up (formatting uses TAB chars). - kw
+#: src/LYLeaks.c:222
+msgid "Invalid pointer detected."
+msgstr "Ungültiger Zeiger gefunden."
+
+#: src/LYLeaks.c:224 src/LYLeaks.c:262
+msgid "Sequence:"
+msgstr "Abfolge:"
+
+#: src/LYLeaks.c:227 src/LYLeaks.c:265
+msgid "Pointer:"
+msgstr "Zeiger:"
+
+#: src/LYLeaks.c:236 src/LYLeaks.c:243 src/LYLeaks.c:284
+msgid "FileName:"
+msgstr "Quelle: "
+
+#: src/LYLeaks.c:239 src/LYLeaks.c:246 src/LYLeaks.c:287 src/LYLeaks.c:298
+msgid "LineCount:"
+msgstr "Zeile:"
+
+#: src/LYLeaks.c:260
+msgid "Memory leak detected."
+msgstr "Speicherleck gefunden."
+
+#: src/LYLeaks.c:268
+msgid "Contains:"
+msgstr "Inhalt:"
+
+#: src/LYLeaks.c:281
+msgid "ByteSize:"
+msgstr "Länge:"
+
+#: src/LYLeaks.c:295
+msgid "realloced:"
+msgstr "realloziert:"
+
+#: src/LYLeaks.c:316
+msgid "Total memory leakage this run:"
+msgstr "Summe der Speicherlecks in diesem Programmlauf:"
+
+#: src/LYLeaks.c:320
+msgid "Peak allocation"
+msgstr "Höchstallozierung"
+
+#: src/LYLeaks.c:322
+msgid "Bytes allocated"
+msgstr "Bytes alloziert"
+
+#: src/LYLeaks.c:324
+msgid "Total mallocs"
+msgstr "Speicherblöcke angefordert"
+
+#: src/LYLeaks.c:326
+msgid "Total frees"
+msgstr "Speicherblöcke freigegeben"
+
+#: src/LYList.c:89
+msgid "References in "
+msgstr "Verweise in "
+
+#: src/LYList.c:92
+msgid "this document:"
+msgstr "diesem Document:"
+
+#: src/LYList.c:98 src/LYList.c:363
+msgid "Visible links:"
+msgstr "Sichtbare Links:"
+
+#: src/LYList.c:202 src/LYList.c:322
+msgid "Hidden links:"
+msgstr "Versteckte Links:"
+
+#: src/LYList.c:359
+msgid "References"
+msgstr "Verweise"
+
+#: src/LYLocal.c:289
+#, c-format
+msgid "Unable to get status of '%s'."
+msgstr "Status von '%s' nicht zugänglich."
+
+#: src/LYLocal.c:354
+msgid "The selected item is not a file or a directory! Request ignored."
+msgstr "Das Ausgewählte ist weder eine Datei noch ein Verzeichnis! Befehl ignoriert."
+
+#: src/LYLocal.c:456
+#, c-format
+msgid "Unable to %s due to system error!"
+msgstr "%s unmöglich wegen eines Fehlers vom System!"
+
+#: src/LYLocal.c:490
+#, c-format
+msgid "Probable failure to %s due to system error!"
+msgstr "%s wahrscheinlich fehlgeschlagen, Fehler vom System!"
+
+#: src/LYLocal.c:555 src/LYLocal.c:578
+#, c-format
+msgid "remove %s"
+msgstr "Löschen von %s"
+
+#: src/LYLocal.c:598
+#, c-format
+msgid "touch %s"
+msgstr "\"Touchen\" von %s"
+
+#: src/LYLocal.c:628
+#, c-format
+msgid "move %s to %s"
+msgstr "Verschieben von %s nach %s"
+
+#: src/LYLocal.c:676
+msgid "There is already a directory with that name! Request ignored."
+msgstr "Es gibt schon ein Verzeichnis mit demselben Namen! Befehl ignoriert."
+
+#: src/LYLocal.c:678
+msgid "There is already a file with that name! Request ignored."
+msgstr "Es gibt schon eine Datei mit demselben Namen! Befehl ignoriert."
+
+#: src/LYLocal.c:680
+msgid "The specified name is already in use! Request ignored."
+msgstr "Der angegebene Name ist schon in Benutzung! Befehl ignoriert."
+
+#: src/LYLocal.c:692
+msgid "Destination has different owner! Request denied."
+msgstr "Ziel gehört jemand anderem! Befehl verweigert."
+
+#: src/LYLocal.c:695
+msgid "Destination is not a valid directory! Request denied."
+msgstr "Ziel ist kein gültiges Verzeichnis! Befehl verweigert."
+
+#: src/LYLocal.c:711
+msgid "Source and destination are the same location! Request ignored!"
+msgstr "Quelle und Ziel sind derselbe Ort! Befehl ignoriert!"
+
+#: src/LYLocal.c:735
+msgid "Remove all tagged files and directories?"
+msgstr "Alle markierten Dateien und Verzeichnisse löschen?"
+
+#: src/LYLocal.c:808
+msgid "Enter new location for tagged items: "
+msgstr "Neuer Ort für markierte Objekte: "
+
+#: src/LYLocal.c:906
+msgid "Enter new name for directory: "
+msgstr "Neuer Name für Verzeichnis: "
+
+#: src/LYLocal.c:908
+msgid "Enter new name for file: "
+msgstr "Neuer Name für Datei: "
+
+#: src/LYLocal.c:920
+msgid "Illegal character (path-separator) found! Request ignored."
+msgstr "Ungültiges Zeichen (path-separator) gefunden! Befehl ignoriert."
+
+#: src/LYLocal.c:970
+msgid "Enter new location for directory: "
+msgstr "Neuer Ort für Verzeichnis: "
+
+#: src/LYLocal.c:972
+msgid "Enter new location for file: "
+msgstr "Neuer Ort für Datei: "
+
+#: src/LYLocal.c:999
+msgid "Unexpected failure - unable to find trailing path separator"
+msgstr "Unerwarteter Fehler - kann den Pfadsperator am Ende nicht finden"
+
+#: src/LYLocal.c:1061
+msgid "Modify name, location, or permission (n, l, or p): "
+msgstr "Name(n), Ort(l) oder Zugriffsrechte(p) modifizieren? [nlp] "
+
+#: src/LYLocal.c:1063
+msgid "Modify name or location (n or l): "
+msgstr "Name(n) oder Ort(l) modifizieren? [nl] "
+
+#.
+#. * Code for changing ownership needed here.
+#.
+#: src/LYLocal.c:1092
+msgid "This feature not yet implemented!"
+msgstr "Noch nicht implementiert!"
+
+#: src/LYLocal.c:1113
+msgid "Enter name of file to create: "
+msgstr "Name der Datei, die erzeugt werden soll: "
+
+#: src/LYLocal.c:1116 src/LYLocal.c:1153
+msgid "Illegal redirection \"//\" found! Request ignored."
+msgstr "Unerlaubte Umleitung \"//\" gefunden! Befehl ignoriert."
+
+#: src/LYLocal.c:1150
+msgid "Enter name for new directory: "
+msgstr "Name für neues Verzeichnis: "
+
+#: src/LYLocal.c:1191
+msgid "Create file or directory (f or d): "
+msgstr "Datei(f) oder Verzeichnis(d) erzeugen? [fd] "
+
+#: src/LYLocal.c:1233
+#, c-format
+msgid "Remove directory '%s'?"
+msgstr "Verzeichnis '%s' entfernen?"
+
+#: src/LYLocal.c:1236
+msgid "Remove directory?"
+msgstr "Verzeichnis entfernen?"
+
+#: src/LYLocal.c:1241
+#, c-format
+msgid "Remove file '%s'?"
+msgstr "Datei '%s' entfernen?"
+
+#: src/LYLocal.c:1243
+msgid "Remove file?"
+msgstr "Datei entfernen?"
+
+#: src/LYLocal.c:1248
+#, c-format
+msgid "Remove symbolic link '%s'?"
+msgstr "Symbolischen Link '%s' entfernen?"
+
+#: src/LYLocal.c:1250
+msgid "Remove symbolic link?"
+msgstr "Symbolischen Link entfernen?"
+
+#: src/LYLocal.c:1348
+msgid "Sorry, don't know how to permit non-UNIX files yet."
+msgstr "Sorry, Dateizugriffsrechte für Systeme außer UNIX können nicht geändert werden."
+
+#: src/LYLocal.c:1377
+msgid "Unable to open permit options file"
+msgstr "Zugriffsrechte-Optionsdatei kann nicht geöffnet werden"
+
+#: src/LYLocal.c:1405
+msgid "Specify permissions below:"
+msgstr "Zugriffsrechte angeben:"
+
+#: src/LYLocal.c:1406 src/LYShowInfo.c:291
+msgid "Owner:"
+msgstr "Besitzer:"
+
+#: src/LYLocal.c:1422
+msgid "Group"
+msgstr "Gruppe"
+
+#: src/LYLocal.c:1438
+msgid "Others:"
+msgstr "Andere:"
+
+#: src/LYLocal.c:1456
+msgid "form to permit"
+msgstr "Form für Zugriffsrechte"
+
+#: src/LYLocal.c:1552
+msgid "Invalid mode format."
+msgstr "Ungültiges Format für mode."
+
+#: src/LYLocal.c:1556
+msgid "Invalid syntax format."
+msgstr "Ungültiges Format für Syntax."
+
+#: src/LYLocal.c:1743
+msgid "Warning! UUDecoded file will exist in the directory you started Lynx."
+msgstr "Warnung! UUDekodierte Dateien werden im Startverzeichnis abgelegt."
+
+#: src/LYLocal.c:1933
+msgid "NULL URL pointer"
+msgstr "Null-URL-Zeiger"
+
+#: src/LYLocal.c:2015
+#, c-format
+msgid "Executing %s "
+msgstr "Ausgeführt wird %s "
+
+#: src/LYLocal.c:2018
+msgid "Executing system command. This might take a while."
+msgstr "Systembefehl wird ausgeführt. Das kann eine Weile dauern."
+
+#: src/LYLocal.c:2092
+msgid "Current directory:"
+msgstr "Aktuelles Verzeichnis:"
+
+#: src/LYLocal.c:2095 src/LYLocal.c:2113
+msgid "Current selection:"
+msgstr "Aktuelle Auswahl:"
+
+#: src/LYLocal.c:2099
+msgid "Nothing currently selected."
+msgstr "Zurzeit nichts ausgewählt."
+
+#: src/LYLocal.c:2115
+msgid "tagged item:"
+msgstr "Markiertes Objekt:"
+
+#: src/LYLocal.c:2116
+msgid "tagged items:"
+msgstr "Markierte Objekte:"
+
+#: src/LYLocal.c:2216 src/LYLocal.c:2225
+msgid "Illegal filename; request ignored."
+msgstr "Ungültiger Dateiname; Befehl ignoriert."
+
+#. directory not writable
+#: src/LYLocal.c:2323 src/LYLocal.c:2382
+msgid "Install in the selected directory not permitted."
+msgstr "Installieren im ausgewählten Verzeichnis nicht gestattet."
+
+#: src/LYLocal.c:2378
+msgid "The selected item is not a directory! Request ignored."
+msgstr "Das ausgewählte Objekt ist kein Verzeichnis! Befehl ignoriert."
+
+#: src/LYLocal.c:2387
+msgid "Just a moment, ..."
+msgstr "Nur ein Weilchen, ..."
+
+#: src/LYLocal.c:2404
+msgid "Error building install args"
+msgstr "Fehler beim Zusammenstellen der Installations-Argumente"
+
+#: src/LYLocal.c:2419 src/LYLocal.c:2450
+#, c-format
+msgid "Source and target are the same: %s"
+msgstr "Quelle und Ziel sind gleich: %s"
+
+#: src/LYLocal.c:2426 src/LYLocal.c:2457
+#, c-format
+msgid "Already in target directory: %s"
+msgstr "Bereits im Zielverzeichis: %s"
+
+#: src/LYLocal.c:2475
+msgid "Installation complete"
+msgstr "Installation fertig"
+
+#: src/LYLocal.c:2678
+msgid "Temporary URL or list would be too long."
+msgstr "Temporarärer URL oder Liste wäre zu lang."
+
+#: src/LYMail.c:566
+msgid "Sending"
+msgstr "Mail wird gesandt"
+
+#: src/LYMail.c:1050
+#, c-format
+msgid "The link %s :?: %s \n"
+msgstr "Der Link %s :?: %s \n"
+
+#: src/LYMail.c:1052
+#, c-format
+msgid "called \"%s\"\n"
+msgstr "mit Namen \"%s\"\n"
+
+#: src/LYMail.c:1053
+#, c-format
+msgid "in the file \"%s\" called \"%s\"\n"
+msgstr "in der Datei \"%s\", genannt \"%s\",\n"
+
+#: src/LYMail.c:1054
+msgid "was requested but was not available."
+msgstr "wurde angefordert, und war nicht verfügbar."
+
+#: src/LYMail.c:1055
+msgid "Thought you might want to know."
+msgstr "Vielleicht wollten Sie das ja gerne wissen."
+
+#: src/LYMail.c:1057
+msgid "This message was automatically generated by"
+msgstr "Diese Nachricht wurde automatisch generiert von"
+
+#: src/LYMail.c:1770
+msgid "No system mailer configured"
+msgstr "Kein systemweiter Mailer konfiguriert"
+
+#: src/LYMain.c:1095
+msgid "No Winsock found, sorry."
+msgstr "Kein Winsock gefunden, sorry."
+
+#: src/LYMain.c:1285
+msgid "You MUST define a valid TMP or TEMP area!"
+msgstr "Es muß ein gültiger Bereich für TMP oder TEMP definiert sein!"
+
+#: src/LYMain.c:1338 src/LYMainLoop.c:5285
+msgid "No such directory"
+msgstr "Verzeichnis nicht vorhanden"
+
+#: src/LYMain.c:1532
+#, c-format
+msgid ""
+"\n"
+"Configuration file \"%s\" is not available.\n"
+"\n"
+msgstr ""
+"\n"
+"Konfigurationsdatei %s ist nicht zugänglich.\n"
+"\n"
+
+#: src/LYMain.c:1542
+#, c-format
+msgid ""
+"\n"
+"Lynx character sets not declared.\n"
+"\n"
+msgstr ""
+"\n"
+"Lynx-Zeichensätze nicht deklariert.\n"
+"\n"
+
+#: src/LYMain.c:1698
+#, c-format
+msgid "Ignored %d characters from standard input.\n"
+msgstr "%d Zeichen von der Standardeingabe ignoriert.\n"
+
+#: src/LYMain.c:1700
+#, c-format
+msgid "Use \"-stdin\" or \"-\" to tell how to handle piped input.\n"
+msgstr "Benutzen Sie \"-stdin\" oder \"-\", um festzulegen, wie die Eingabe behandelt wird.\n"
+
+#: src/LYMain.c:1858
+msgid "Warning:"
+msgstr "Warnung:"
+
+# No idea what this means. Seems highly experimental anyway. - kw
+#: src/LYMain.c:2426
+msgid "persistent cookies state will be changed in next session only."
+msgstr "Beständige Kekse werden erst beim nächsten Programmaufruf geändert."
+
+#: src/LYMain.c:2661 src/LYMain.c:2705
+#, c-format
+msgid "Lynx: ignoring unrecognized charset=%s\n"
+msgstr "Lynx: ignoriere unbekannte Codierung (charset)=%s\n"
+
+#: src/LYMain.c:3222
+#, c-format
+msgid "%s Version %s (%s)"
+msgstr "%s Version %s (%s)"
+
+#: src/LYMain.c:3263
+#, c-format
+msgid "Built on %s%s.\n"
+msgstr "Gebaut auf %s%s.\n"
+
+#: src/LYMain.c:3277
+msgid "Copyrights held by the Lynx Developers Group,"
+msgstr "Die Vervielfältigungsrechte liegen bei der Lynx Developers Group,"
+
+#: src/LYMain.c:3278
+msgid "the University of Kansas, CERN, and other contributors."
+msgstr "der Universität Kansas, dem CERN und anderen Beitragenden."
+
+#: src/LYMain.c:3279
+msgid "Distributed under the GNU General Public License (Version 2)."
+msgstr "Verbreitet unter den Bedingungen der GNU General Public License (Version 2)."
+
+#: src/LYMain.c:3280
+msgid "See https://lynx.invisible-island.net/ and the online help for more information."
+msgstr "Weitere Informationen: https://lynx.invisible-island.net/ und die Online-Hilfe."
+
+#: src/LYMain.c:4139
+#, c-format
+msgid "USAGE: %s [options] [file]\n"
+msgstr "AUFRUF: %s [optionen] [datei oder URL]\n"
+
+#: src/LYMain.c:4140
+#, c-format
+msgid "Options are:\n"
+msgstr "Optionen sind:\n"
+
+#: src/LYMain.c:4443
+#, c-format
+msgid "%s: Invalid Option: %s\n"
+msgstr "%s: Ungültige Option: %s\n"
+
+#: src/LYMainLoop.c:572
+#, c-format
+msgid "Internal error: Invalid mouse link %d!"
+msgstr "Interner Fehler: %d ist ungültig für mouse_link!"
+
+#: src/LYMainLoop.c:693 src/LYMainLoop.c:5307
+msgid "A URL specified by the user"
+msgstr "Ein vom Benutzer eingegegener URL"
+
+#: src/LYMainLoop.c:1142
+msgid "Enctype multipart/form-data not yet supported! Cannot submit."
+msgstr "Enctype multipart/form-data noch nicht unterstützt! Submission unmöglich."
+
+#.
+#. * Make a name for this help file.
+#.
+#: src/LYMainLoop.c:3197
+msgid "Help Screen"
+msgstr "Hilfe-Seite"
+
+#: src/LYMainLoop.c:3328
+msgid "System Index"
+msgstr "Systemindex"
+
+#: src/LYMainLoop.c:3577
+#, c-format
+msgid "Query parameter %d: "
+msgstr "Suchparameter %d: "
+
+#: src/LYMainLoop.c:3806 src/LYMainLoop.c:5583
+msgid "Entry into main screen"
+msgstr "Eingang zur Hauptseite"
+
+#: src/LYMainLoop.c:4064
+msgid "No next document present"
+msgstr "Es gibt kein nächstes Dokument"
+
+#: src/LYMainLoop.c:4359
+msgid "charset for this document specified explicitly, sorry..."
+msgstr "Charset für dieses Dokument ist schon explizit angegeben..."
+
+#: src/LYMainLoop.c:5265
+msgid "cd to:"
+msgstr "cd nach:"
+
+#: src/LYMainLoop.c:5288
+msgid "A component of path is not a directory"
+msgstr "Eine Pfadkomponente ist kein Verzeichnis"
+
+#: src/LYMainLoop.c:5291
+msgid "failed to change directory"
+msgstr "Fehler beim Verzeichniswechsel"
+
+# How does one translate reparsing anyway? - kw
+#: src/LYMainLoop.c:6517
+msgid "Reparsing document under current settings..."
+msgstr "Dokument wird mit jetzigen Einstellungen reinterpretiert..."
+
+#: src/LYMainLoop.c:6811
+#, c-format
+msgid "Fatal error - could not open output file %s\n"
+msgstr "Fataler Fehler - Ausgabedatei %s konnte nicht geöffnet werden\n"
+
+#: src/LYMainLoop.c:7153
+msgid "TABLE center enable."
+msgstr "TABLE-Zentrierung aktivieren."
+
+#: src/LYMainLoop.c:7156
+msgid "TABLE center disable."
+msgstr "TABLE-Zentrierung ausschalten."
+
+#: src/LYMainLoop.c:7236
+msgid "Current URL is empty."
+msgstr "Aktueller URL ist leer."
+
+#: src/LYMainLoop.c:7238 src/LYUtils.c:1909
+msgid "Copy to clipboard failed."
+msgstr "Kopieren in das Clipboard fehlgeschlagen."
+
+#: src/LYMainLoop.c:7240
+msgid "Document URL put to clipboard."
+msgstr "URL des Dokuments in das Clipboard gespeichert."
+
+#: src/LYMainLoop.c:7242
+msgid "Link URL put to clipboard."
+msgstr "URL des Links in das Clipboard gespeichert."
+
+#: src/LYMainLoop.c:7269
+msgid "No URL in the clipboard."
+msgstr "Kein URL in das Clipboard gespeichert."
+
+#: src/LYMainLoop.c:7962 src/LYMainLoop.c:8133
+msgid "-index-"
+msgstr "-Index"
+
+#: src/LYMainLoop.c:8071
+msgid "lynx: Can't access startfile"
+msgstr "lynx: Unzugängliche Startdatei"
+
+#: src/LYMainLoop.c:8083
+msgid "lynx: Start file could not be found or is not text/html or text/plain"
+msgstr "lynx: Startdatei nicht gefunden oder nicht text/html oder text/plain"
+
+#: src/LYMainLoop.c:8084
+msgid " Exiting..."
+msgstr " Ende..."
+
+#: src/LYMainLoop.c:8127
+msgid "-more-"
+msgstr "-mehr-"
+
+#. Enable scrolling.
+#: src/LYNews.c:186
+msgid "You will be posting to:"
+msgstr "Message wird hinterlegt werden in:"
+
+#.
+#. * Get the mail address for the From header, offering personal_mail_address
+#. * as default.
+#.
+#: src/LYNews.c:195
+msgid ""
+"\n"
+"\n"
+" Please provide your mail address for the From: header\n"
+msgstr ""
+"\n"
+"\n"
+" Bitte eigene Mailadresse für den From-Header angeben\n"
+
+#.
+#. * Get the Subject header, offering the current document's title as the
+#. * default if this is a followup rather than a new post. - FM
+#.
+#: src/LYNews.c:212
+msgid ""
+"\n"
+"\n"
+" Please provide or edit the Subject: header\n"
+msgstr ""
+"\n"
+"\n"
+" Bitte Betreff angeben oder ändern für den Subject-Header\n"
+
+#: src/LYNews.c:302
+msgid ""
+"\n"
+"\n"
+" Please provide or edit the Organization: header\n"
+msgstr ""
+"\n"
+"\n"
+" Bitte Inhalt angeben oder ändern für den Organization-Header\n"
+
+#.
+#. * Use the built in line editior.
+#.
+#: src/LYNews.c:359
+msgid ""
+"\n"
+"\n"
+" Please enter your message below."
+msgstr ""
+"\n"
+"\n"
+" Bitte Nachricht unten eingeben."
+
+#: src/LYNews.c:405
+msgid "Message has no original text!"
+msgstr "Die Message hat keinen neuen Text!"
+
+#: src/LYOptions.c:774
+msgid "review/edit B)ookmarks files"
+msgstr "Lesezeichendateien ((B)ookmark files) ansehen/ändern"
+
+#: src/LYOptions.c:776
+msgid "B)ookmark file: "
+msgstr "Lesezeichendatei/(B)ookmark file: "
+
+#: src/LYOptions.c:2131 src/LYOptions.c:2138
+msgid "ON"
+msgstr "AN"
+
+#. verbose_img variable
+#. LYCollapseBRs variable
+#. LYtrimBlankLines variable
+#: src/LYOptions.c:2132 src/LYOptions.c:2137 src/LYOptions.c:2321
+#: src/LYOptions.c:2330 src/LYOptions.c:2339 src/LYOptions.c:2350
+msgid "OFF"
+msgstr "AUS"
+
+#: src/LYOptions.c:2133
+msgid "NEVER"
+msgstr "NIE"
+
+#: src/LYOptions.c:2134
+msgid "ALWAYS"
+msgstr "IMMER"
+
+#: src/LYOptions.c:2150 src/LYOptions.c:2313
+msgid "ignore"
+msgstr "ignorieren"
+
+#: src/LYOptions.c:2151
+msgid "ask user"
+msgstr "Benutzer fragen"
+
+#: src/LYOptions.c:2152
+msgid "accept all"
+msgstr "alle akzeptieren"
+
+#: src/LYOptions.c:2164
+msgid "ALWAYS OFF"
+msgstr "IMMER AUS"
+
+#: src/LYOptions.c:2165
+msgid "FOR LOCAL FILES ONLY"
+msgstr "NUR FÃœR LOKALE DATEIEN"
+
+#: src/LYOptions.c:2167
+msgid "ALWAYS ON"
+msgstr "IMMER AN"
+
+#: src/LYOptions.c:2179
+msgid "Numbers act as arrows"
+msgstr "Zahlen als Pfeiltasten"
+
+#: src/LYOptions.c:2181
+msgid "Links are numbered"
+msgstr "Numerierte Links"
+
+#: src/LYOptions.c:2184
+msgid "Links and form fields are numbered"
+msgstr "Links und Formularfelder numerieren"
+
+#: src/LYOptions.c:2187
+msgid "Form fields are numbered"
+msgstr "Numerierte Formularfelder"
+
+#: src/LYOptions.c:2202
+msgid "Case insensitive"
+msgstr "Groß/klein nicht unterscheiden"
+
+#: src/LYOptions.c:2203
+msgid "Case sensitive"
+msgstr "Groß/klein unterscheiden<"
+
+#: src/LYOptions.c:2237
+msgid "prompt normally"
+msgstr "normal auffordern"
+
+#: src/LYOptions.c:2238
+msgid "force yes-response"
+msgstr "Ja-Antwort erzwingen"
+
+#: src/LYOptions.c:2239
+msgid "force no-response"
+msgstr "Nein-Antwort erzwingen"
+
+#: src/LYOptions.c:2249
+msgid "RFC 2109"
+msgstr "RFC 2109"
+
+#: src/LYOptions.c:2250
+msgid "RFC 2965"
+msgstr "RFC 2965"
+
+#: src/LYOptions.c:2251
+msgid "RFC 6265"
+msgstr "RFC 6265"
+
+#: src/LYOptions.c:2268
+msgid "Novice"
+msgstr "Neuling"
+
+#: src/LYOptions.c:2269
+msgid "Intermediate"
+msgstr "Mäßig Geübter"
+
+#: src/LYOptions.c:2270
+msgid "Advanced"
+msgstr "Fortgeschrittener"
+
+#: src/LYOptions.c:2279
+msgid "By First Visit"
+msgstr "Nach erstem Besuch"
+
+#: src/LYOptions.c:2281
+msgid "By First Visit Reversed"
+msgstr "Nach erstem Besuch (rückläufig)"
+
+#: src/LYOptions.c:2282
+msgid "As Visit Tree"
+msgstr "Als Besuchsbaum"
+
+#: src/LYOptions.c:2283
+msgid "By Last Visit"
+msgstr "Nach letztem Besuch"
+
+#: src/LYOptions.c:2285
+msgid "By Last Visit Reversed"
+msgstr "Nach letztem Besuch (rückläufig)"
+
+#. Old_DTD variable
+#: src/LYOptions.c:2296
+msgid "relaxed (TagSoup mode)"
+msgstr "lässig (TagSoup-Modus)"
+
+#: src/LYOptions.c:2297
+msgid "strict (SortaSGML mode)"
+msgstr "strikt (SortaSGML-Modus)"
+
+#: src/LYOptions.c:2304
+msgid "Ignore"
+msgstr "Ignorieren"
+
+#: src/LYOptions.c:2305
+msgid "Add to trace-file"
+msgstr "Zur Trace-Datei hinzufügen"
+
+#: src/LYOptions.c:2306
+msgid "Add to LYNXMESSAGES"
+msgstr "Zu LYNXNACHRICHTEN hinzufügen"
+
+#: src/LYOptions.c:2307
+msgid "Warn, point to trace-file"
+msgstr "Warne, zeige auf Trace-Datei"
+
+#: src/LYOptions.c:2314
+msgid "as labels"
+msgstr "als Label"
+
+#: src/LYOptions.c:2315
+msgid "as links"
+msgstr "als Links"
+
+#: src/LYOptions.c:2322
+msgid "show filename"
+msgstr "Dateiname anzeigen"
+
+#: src/LYOptions.c:2331
+msgid "collapse"
+msgstr "einklappen"
+
+#: src/LYOptions.c:2340
+msgid "trim-lines"
+msgstr "Leerzeilen-entfernen"
+
+#: src/LYOptions.c:2351
+msgid "STANDARD"
+msgstr "STANDARD"
+
+#: src/LYOptions.c:2352
+msgid "ADVANCED"
+msgstr "FORTGESCHRITTEN"
+
+#: src/LYOptions.c:2374
+msgid "IDNA 2003"
+msgstr "IDNA 2003"
+
+#: src/LYOptions.c:2375
+msgid "IDNA 2008"
+msgstr "IDNA 2008"
+
+#: src/LYOptions.c:2376
+msgid "IDNA TR46"
+msgstr "IDNA TR46"
+
+#: src/LYOptions.c:2377
+msgid "IDNA Compatible"
+msgstr "IDNA-kompatibel"
+
+#: src/LYOptions.c:2398
+msgid "Directories first"
+msgstr "Verzeichnisse zuerst"
+
+#: src/LYOptions.c:2399
+msgid "Files first"
+msgstr "Dateien zuerst"
+
+#: src/LYOptions.c:2400
+msgid "Mixed style"
+msgstr "Gemischter Stil"
+
+#: src/LYOptions.c:2408 src/LYOptions.c:2428
+msgid "By Name"
+msgstr "Nach Name"
+
+#: src/LYOptions.c:2409 src/LYOptions.c:2429
+msgid "By Type"
+msgstr "Nach Typus"
+
+#: src/LYOptions.c:2410 src/LYOptions.c:2430
+msgid "By Size"
+msgstr "Nach Länge"
+
+#: src/LYOptions.c:2411 src/LYOptions.c:2431
+msgid "By Date"
+msgstr "Nach Datum"
+
+#: src/LYOptions.c:2412
+msgid "By Mode"
+msgstr "Nach Modus"
+
+#: src/LYOptions.c:2414
+msgid "By User"
+msgstr "Nach Benutzer"
+
+#: src/LYOptions.c:2415
+msgid "By Group"
+msgstr "Nach Gruppe"
+
+#: src/LYOptions.c:2440
+msgid "Do not show rate"
+msgstr "Rate nicht anzeigen"
+
+#: src/LYOptions.c:2441 src/LYOptions.c:2442
+#, c-format
+msgid "Show %s/sec rate"
+msgstr "%s/sec Rate anzeigen"
+
+#: src/LYOptions.c:2444 src/LYOptions.c:2445
+#, c-format
+msgid "Show %s/sec, ETA"
+msgstr "%s/sec, ETA, anzeigen"
+
+#: src/LYOptions.c:2446 src/LYOptions.c:2447
+#, c-format
+msgid "Show %s/sec (2-digits), ETA"
+msgstr "%s/sec (2 Ziffern) und ETA anzeigen"
+
+#: src/LYOptions.c:2450
+msgid "Show progressbar"
+msgstr "Fortschrittsbalken zeigen"
+
+#: src/LYOptions.c:2471
+msgid "Accept lynx's internal types"
+msgstr "Interne Typen von Lynx akzeptieren"
+
+#: src/LYOptions.c:2472
+msgid "Also accept lynx.cfg's types"
+msgstr "Auch die Typen von lynx.cfg akzeptieren<"
+
+#: src/LYOptions.c:2473
+msgid "Also accept user's types"
+msgstr "Auch die Typen des Benutzers akzeptieren<"
+
+#: src/LYOptions.c:2474
+msgid "Also accept system's types"
+msgstr "Auch die Typen des Systems akzeptieren<"
+
+#: src/LYOptions.c:2475
+msgid "Accept all types"
+msgstr "Alle Typen akzeptieren"
+
+#: src/LYOptions.c:2484
+msgid "gzip"
+msgstr "gzip"
+
+#: src/LYOptions.c:2485
+msgid "deflate"
+msgstr "deflate"
+
+#: src/LYOptions.c:2488
+msgid "compress"
+msgstr "compress"
+
+#: src/LYOptions.c:2491
+msgid "bzip2"
+msgstr "bzip2"
+
+#: src/LYOptions.c:2493
+msgid "All"
+msgstr "Alle"
+
+#: src/LYOptions.c:2503
+msgid "HTTP 1.0"
+msgstr "HTTP 1.0"
+
+#: src/LYOptions.c:2504
+msgid "HTTP 1.1"
+msgstr "HTTP 1.1"
+
+#: src/LYOptions.c:2863 src/LYOptions.c:2892
+#, c-format
+msgid "Use %s to invoke the Options menu!"
+msgstr "%s benutzen, um das Options-Menü aufzurufen!"
+
+#: src/LYOptions.c:3789
+msgid "(options marked with (!) will not be saved)"
+msgstr "(mit (!) markierte Optionen werden nicht gespeichert)"
+
+#: src/LYOptions.c:3797
+msgid "General Preferences"
+msgstr "Allgmeine Präferenzen"
+
+#. ***************************************************************
+#. User Mode: SELECT
+#: src/LYOptions.c:3801
+msgid "User mode"
+msgstr "User mode"
+
+#. Editor: INPUT
+#: src/LYOptions.c:3807
+msgid "Editor"
+msgstr "Editor"
+
+#. Search Type: SELECT
+#: src/LYOptions.c:3812
+msgid "Type of Search"
+msgstr "Art der Suche"
+
+#: src/LYOptions.c:3817
+msgid "Security and Privacy"
+msgstr "Sicherheit und Datenschutz"
+
+#. ***************************************************************
+#. Cookies: SELECT
+#: src/LYOptions.c:3821
+msgid "Cookies"
+msgstr "Kekse (Cookies)"
+
+#. Cookie Version: SELECT
+#: src/LYOptions.c:3835
+msgid "Cookie RFC-version"
+msgstr "Cookie RFC-Version"
+
+#. Cookie Prompting: SELECT
+#: src/LYOptions.c:3841
+msgid "Invalid-Cookie Prompting"
+msgstr "Bei Invalid-Cookie nachfragen"
+
+#. SSL Prompting: SELECT
+#: src/LYOptions.c:3848
+msgid "SSL Prompting"
+msgstr "Bei SSL nachfragen"
+
+#: src/LYOptions.c:3853
+msgid "SSL client certificate file"
+msgstr "SSL-Client-Zertifikatdatei"
+
+#: src/LYOptions.c:3857
+msgid "SSL client key file"
+msgstr "SSL-Client-Schlüsseldatei"
+
+#: src/LYOptions.c:3863
+msgid "Keyboard Input"
+msgstr "Tastatureingabe"
+
+#. ***************************************************************
+#. Keypad Mode: SELECT
+#: src/LYOptions.c:3867
+msgid "Keypad mode"
+msgstr "Tastaturmodus/Keypad mode"
+
+#. Emacs keys: ON/OFF
+#: src/LYOptions.c:3873
+msgid "Emacs keys"
+msgstr "Emacstasten"
+
+#. VI Keys: ON/OFF
+#: src/LYOptions.c:3879
+msgid "VI keys"
+msgstr "VI-Tasten"
+
+#. Line edit style: SELECT
+#. well, at least 2 line edit styles available
+#: src/LYOptions.c:3886
+msgid "Line edit style"
+msgstr "Art für das Editieren von Zeilen"
+
+#. Keyboard layout: SELECT
+#: src/LYOptions.c:3898
+msgid "Keyboard layout"
+msgstr "Tastaturbelegung"
+
+#.
+#. * Display and Character Set
+#.
+#: src/LYOptions.c:3912
+msgid "Display and Character Set"
+msgstr "Display und Zeichensatz"
+
+#. Use locale-based character set: ON/OFF
+#: src/LYOptions.c:3917
+msgid "Use locale-based character set"
+msgstr "Locale-basierenden Zeichensatz verwenden"
+
+#: src/LYOptions.c:3924
+msgid "Use HTML5 charset replacements"
+msgstr "Benutze Zeichensatzersatz für HTML5"
+
+#. Display Character Set: SELECT
+#: src/LYOptions.c:3930
+msgid "Display character set"
+msgstr "Zeichensatz des Displays"
+
+#: src/LYOptions.c:3961
+msgid "Assumed document character set"
+msgstr "Angenommene Zeichensatzkodierung"
+
+#: src/LYOptions.c:3977
+msgid "Internationalized domain names"
+msgstr "Internationalisierte Domänennamen"
+
+#.
+#. * Since CJK people hardly mixed with other world
+#. * we split the header to make it more readable:
+#. * "CJK mode" for CJK display charsets, and "Raw 8-bit" for others.
+#.
+#: src/LYOptions.c:3995
+msgid "CJK mode"
+msgstr "CJK-Modus"
+
+#: src/LYOptions.c:3997
+msgid "Raw 8-bit"
+msgstr "Unkonvertiert (Raw 8-bit)"
+
+#. X Display: INPUT
+#: src/LYOptions.c:4005
+msgid "X Display"
+msgstr "X DISPLAY"
+
+#.
+#. * Document Appearance
+#.
+#: src/LYOptions.c:4011
+msgid "Document Appearance"
+msgstr "Aussehen des Dokuments"
+
+#: src/LYOptions.c:4017
+msgid "Show color"
+msgstr "Farbe zeigen/Show color"
+
+#: src/LYOptions.c:4043
+msgid "Color style"
+msgstr "Farbstil"
+
+#: src/LYOptions.c:4053
+msgid "Default colors"
+msgstr "Standardfarben"
+
+#. Show cursor: ON/OFF
+#: src/LYOptions.c:4061
+msgid "Show cursor"
+msgstr "Positionsmarke zeigen/Show cursor"
+
+#. Underline links: ON/OFF
+#: src/LYOptions.c:4067
+msgid "Underline links"
+msgstr "Links unterstreichen"
+
+#. Show scrollbar: ON/OFF
+#: src/LYOptions.c:4074
+msgid "Show scrollbar"
+msgstr "Scrollbar zeigen"
+
+#. Select Popups: ON/OFF
+#: src/LYOptions.c:4081
+msgid "Popups for select fields"
+msgstr "Popups für Select-Felder"
+
+#. HTML error recovery: SELECT
+#: src/LYOptions.c:4087
+msgid "HTML error recovery"
+msgstr "HTML-Fehlerbehandlung"
+
+#. Bad HTML messages: SELECT
+#: src/LYOptions.c:4093
+msgid "Bad HTML messages"
+msgstr "Schlechte HTML-Nachricht"
+
+#. Show Images: SELECT
+#: src/LYOptions.c:4099
+msgid "Show images"
+msgstr "Bilder zeigen"
+
+#. Verbose Images: ON/OFF
+#: src/LYOptions.c:4113
+msgid "Verbose images"
+msgstr "Detaillierte Bildinformation"
+
+#. Collapse BR Tags: ON/OFF
+#: src/LYOptions.c:4119
+msgid "Collapse BR tags"
+msgstr "BR-Tags einklappen"
+
+#. Trim blank lines: ON/OFF
+#: src/LYOptions.c:4125
+msgid "Trim blank lines"
+msgstr "Leerzeilen entfernen"
+
+#.
+#. * Headers Transferred to Remote Servers
+#.
+#: src/LYOptions.c:4133
+msgid "Headers Transferred to Remote Servers"
+msgstr "Einige Headers für Requests zu Remote Servern verschickt"
+
+#. ***************************************************************
+#. Mail Address: INPUT
+#: src/LYOptions.c:4137
+msgid "Personal mail address"
+msgstr "Persönliche Mailadresse"
+
+#: src/LYOptions.c:4142
+msgid "Personal name for mail"
+msgstr "Personenname für E-mail"
+
+#: src/LYOptions.c:4149
+msgid "Password for anonymous ftp"
+msgstr "Password für anonymen FTP"
+
+#. Preferred content type: SELECT
+#: src/LYOptions.c:4155
+msgid "Preferred content type"
+msgstr "Bevorzugter Inhaltstyp"
+
+#. Preferred media type: SELECT
+#: src/LYOptions.c:4161
+msgid "Preferred media type"
+msgstr "Erwünschter Medientyp"
+
+#. Preferred encoding: SELECT
+#: src/LYOptions.c:4167
+msgid "Preferred encoding"
+msgstr "Erwünschte Kodierung"
+
+#. Preferred Document Character Set: INPUT
+#: src/LYOptions.c:4173
+msgid "Preferred document character set"
+msgstr "Erwünschter Zeichensatz (Accept-Charset)"
+
+#. Preferred Document Language: INPUT
+#: src/LYOptions.c:4178
+msgid "Preferred document language"
+msgstr "Erwünschte Dokumentsprache (Accept-Language)"
+
+#. HTTP protocol SELECT
+#: src/LYOptions.c:4183
+msgid "HTTP protocol"
+msgstr "HTTP-Protokoll"
+
+#: src/LYOptions.c:4190
+msgid "Send User-Agent header"
+msgstr "Sende Browseridentifizierungsheader (User-Agent)"
+
+#: src/LYOptions.c:4192
+msgid "User-Agent header"
+msgstr "Browseridentifizierung (User-Agent)"
+
+#.
+#. * Listing and Accessing Files
+#.
+#: src/LYOptions.c:4200
+msgid "Listing and Accessing Files"
+msgstr "Dateiverzeichnisse anlegen und auf Dateien zugreifen"
+
+#. FTP sort: SELECT
+#: src/LYOptions.c:4205
+msgid "Use Passive FTP"
+msgstr "Passives FTP benutzen"
+
+#. FTP sort: SELECT
+#: src/LYOptions.c:4211
+msgid "FTP sort criteria"
+msgstr "Sortierung für FTP-Verzeichnisse"
+
+#. Local Directory Sort: SELECT
+#: src/LYOptions.c:4219
+msgid "Local directory sort criteria"
+msgstr "Sortierkriterien für lokale Verzeichnisse"
+
+#. Local Directory Order: SELECT
+#: src/LYOptions.c:4225
+msgid "Local directory sort order"
+msgstr "Sortierreihenfolge für lokale Verzeichnisse"
+
+#: src/LYOptions.c:4234
+msgid "Show dot files"
+msgstr "Dateien mit Punkt am Anfang sichtbar"
+
+#: src/LYOptions.c:4242
+msgid "Execution links"
+msgstr "Ausführbare Links/Execution links"
+
+#: src/LYOptions.c:4260
+msgid "Pause when showing message"
+msgstr "Pausiere, wenn eine Nachright angezeigt wird"
+
+#. Show transfer rate: SELECT
+#: src/LYOptions.c:4267
+msgid "Show transfer rate"
+msgstr "Ãœbertragungsrate anzeigen"
+
+#.
+#. * Special Files and Screens
+#.
+#: src/LYOptions.c:4287
+msgid "Special Files and Screens"
+msgstr "Besondere Dateien und Bildschirme"
+
+#: src/LYOptions.c:4292
+msgid "Multi-bookmarks"
+msgstr "Multi-Datei-Lesezeichen"
+
+#: src/LYOptions.c:4300
+msgid "Review/edit Bookmarks files"
+msgstr "Lesezeichendateien ansehen/bearbeiten"
+
+#: src/LYOptions.c:4303
+msgid "Goto multi-bookmark menu"
+msgstr "Zum Multi-Lesezeichenmenü"
+
+#: src/LYOptions.c:4305
+msgid "Bookmarks file"
+msgstr "Lesezeichendatei"
+
+#. Auto Session: ON/OFF
+#: src/LYOptions.c:4312
+msgid "Auto Session"
+msgstr "Auto-Session"
+
+#. Session File Menu: INPUT
+#: src/LYOptions.c:4318
+msgid "Session file"
+msgstr "Session-Datei"
+
+#. Visited Pages: SELECT
+#: src/LYOptions.c:4324
+msgid "Visited Pages"
+msgstr "Besuchte Seiten"
+
+#: src/LYOptions.c:4329
+msgid "View the file "
+msgstr "Die Datei ansehen "
+
+#: src/LYPrint.c:956
+#, c-format
+msgid " Print job complete.\n"
+msgstr "Druckauftrag abgeschlossen.\n"
+
+#: src/LYPrint.c:1283
+msgid "Document:"
+msgstr "Dokument:"
+
+#: src/LYPrint.c:1284
+msgid "Number of lines:"
+msgstr "Anzahl Zeilen:"
+
+#: src/LYPrint.c:1285
+msgid "Number of pages:"
+msgstr "Seiten:"
+
+#: src/LYPrint.c:1286
+msgid "pages"
+msgstr "Seiten"
+
+#: src/LYPrint.c:1286
+msgid "page"
+msgstr "Seite"
+
+#: src/LYPrint.c:1287
+msgid "(approximately)"
+msgstr "(geschätzt)"
+
+#: src/LYPrint.c:1294
+msgid "Some print functions have been disabled!"
+msgstr "Einige Druckfunktionen sind ausgeschaltet!"
+
+#: src/LYPrint.c:1298
+msgid "Standard print options:"
+msgstr "Normale Druckoptionen:"
+
+#: src/LYPrint.c:1299
+msgid "Print options:"
+msgstr "Druckoptionen:"
+
+#: src/LYPrint.c:1306
+msgid "Save to a local file"
+msgstr "In lokale Datei speichern"
+
+#: src/LYPrint.c:1308
+msgid "Save to disk disabled"
+msgstr "Speichern auf Disk nicht erlaubt"
+
+#: src/LYPrint.c:1315
+msgid "Mail the file"
+msgstr "Datei als Mail schicken"
+
+#: src/LYPrint.c:1322
+msgid "Print to the screen"
+msgstr "Druckausgabe auf Bildschirm"
+
+#: src/LYPrint.c:1327
+msgid "Print out on a printer attached to your vt100 terminal"
+msgstr "Ausgabe auf Drucker verbunden mit VT100-Terminal"
+
+#: src/LYReadCFG.c:437
+#, c-format
+msgid ""
+"Syntax Error parsing COLOR in configuration file:\n"
+"The line must be of the form:\n"
+"COLOR:INTEGER:FOREGROUND:BACKGROUND\n"
+"\n"
+"Here FOREGROUND and BACKGROUND must be one of:\n"
+"The special strings 'nocolor' or 'default', or\n"
+msgstr ""
+"Syntaxfehler beim Parsen von COLOR in Konfigurationsdatei:\n"
+"Die Zeile muss die folgende Form haben:\n"
+"COLOR:NUMMER:VORDERGRUND:HINTERGRUND\n"
+"\n"
+"Dabei müssen VORDERGRUND und HINTERGRUND eins der folgenden sein:\n"
+"Die speziellen Wörter 'nocolor' oder 'default', oder\n"
+
+#: src/LYReadCFG.c:450
+msgid "Offending line:"
+msgstr "Zeile mit Fehler:"
+
+#: src/LYReadCFG.c:764
+#, c-format
+msgid "key remapping of %s to %s for %s failed\n"
+msgstr "Remapping der Taste von %s zu %s für %s fehlgeschlagen\n"
+
+#: src/LYReadCFG.c:771
+#, c-format
+msgid "key remapping of %s to %s failed\n"
+msgstr "Umbelegung der Taste von %s zu %s fehlgeschlagen\n"
+
+#: src/LYReadCFG.c:792
+#, c-format
+msgid "invalid line-editor selection %s for key %s, selecting all\n"
+msgstr "ungültige Zeilen-Editor-Auswahl %s für Taste %s, wähle alle aus\n"
+
+#: src/LYReadCFG.c:817 src/LYReadCFG.c:832
+#, c-format
+msgid "setting of line-editor binding for key %s (0x%x) to 0x%x for %s failed\n"
+msgstr "Zeileneditor-Bindung der Taste %s (0x%x) an Wert 0x%x für %s ungültig\n"
+
+#: src/LYReadCFG.c:839
+#, c-format
+msgid "setting of line-editor binding for key %s (0x%x) for %s failed\n"
+msgstr "Zeileneditor-Bindung der Taste %s (0x%x) für %s ungültig\n"
+
+#: src/LYReadCFG.c:937
+#, c-format
+msgid "Lynx: cannot start, CERN rules file %s is not available\n"
+msgstr "Lynx: Programmstart verweigert, Regeldatei %s (CERN rules file) nicht verfügbar\n"
+
+#: src/LYReadCFG.c:938
+msgid "(no name)"
+msgstr "(ohne Namen)"
+
+#: src/LYReadCFG.c:2086
+#, c-format
+msgid "More than %d nested lynx.cfg includes -- perhaps there is a loop?!?\n"
+msgstr "Mehr als %d geschachtelte lynx.cfg-Includes -- wohl eine Schleife?!?\n"
+
+#: src/LYReadCFG.c:2088
+#, c-format
+msgid "Last attempted include was '%s',\n"
+msgstr "Letztes INCLUDE war '%s',\n"
+
+#: src/LYReadCFG.c:2089
+#, c-format
+msgid "included from '%s'.\n"
+msgstr "enthalten in '%s'.\n"
+
+#: src/LYReadCFG.c:2500 src/LYReadCFG.c:2513 src/LYReadCFG.c:2571
+msgid "The following is read from your lynx.cfg file."
+msgstr "Folgendes ist der aktuellen Konfigurationsdatei entnommen."
+
+#: src/LYReadCFG.c:2501 src/LYReadCFG.c:2514
+msgid "Please read the distribution"
+msgstr "Bitte die installierte Konfigurationsdatei"
+
+#: src/LYReadCFG.c:2507 src/LYReadCFG.c:2517
+msgid "for more comments."
+msgstr "für weitere Erläuterungen ansehen."
+
+#: src/LYReadCFG.c:2553
+msgid "RELOAD THE CHANGES"
+msgstr "ÄNDERUNGEN NEULADEN"
+
+#: src/LYReadCFG.c:2561
+msgid "Your primary configuration"
+msgstr "Ihre primäre Konfiguration"
+
+#: src/LYShowInfo.c:116
+msgid "URL:"
+msgstr "URL:"
+
+#: src/LYShowInfo.c:200
+msgid "Directory that you are currently viewing"
+msgstr "Zurzeit angeschautes Verzeichnis"
+
+#: src/LYShowInfo.c:203
+msgid "Name:"
+msgstr "Name:"
+
+#: src/LYShowInfo.c:220
+msgid "Directory that you have currently selected"
+msgstr "Zurzeit ausgewähltes Verzeichnis"
+
+#: src/LYShowInfo.c:222
+msgid "File that you have currently selected"
+msgstr "Zurzeit ausgewählte Datei"
+
+#: src/LYShowInfo.c:225
+msgid "Symbolic link that you have currently selected"
+msgstr "Zurzeit ausgewählter symbolischer Link"
+
+#: src/LYShowInfo.c:228
+msgid "Item that you have currently selected"
+msgstr "Zurzeit ausgewähltes Objekt"
+
+#: src/LYShowInfo.c:230
+msgid "Full name:"
+msgstr "Pfadname:"
+
+#: src/LYShowInfo.c:243
+msgid "Unable to follow link"
+msgstr "Kann dem Link nicht folgen"
+
+#: src/LYShowInfo.c:245
+msgid "Points to file:"
+msgstr "Zeigt auf Datei:"
+
+#: src/LYShowInfo.c:250
+msgid "Name of owner:"
+msgstr "Name des Besitzers:"
+
+#: src/LYShowInfo.c:253
+msgid "Group name:"
+msgstr "Gruppenname:"
+
+#: src/LYShowInfo.c:255
+msgid "File size:"
+msgstr "Dateilänge:"
+
+#: src/LYShowInfo.c:257
+msgid "(bytes)"
+msgstr "(Bytes)"
+
+#.
+#. * Include date and time information.
+#.
+#: src/LYShowInfo.c:262
+msgid "Creation date:"
+msgstr "Erzeugungsdatum:"
+
+#: src/LYShowInfo.c:265
+msgid "Last modified:"
+msgstr "Letzte Änderung:"
+
+#: src/LYShowInfo.c:268
+msgid "Last accessed:"
+msgstr "Letzter Zugriff:"
+
+#: src/LYShowInfo.c:274
+msgid "Access Permissions"
+msgstr "Zugriffsrechte"
+
+#: src/LYShowInfo.c:309
+msgid "Group:"
+msgstr "Gruppe:"
+
+#: src/LYShowInfo.c:329
+msgid "World:"
+msgstr "Welt:"
+
+#: src/LYShowInfo.c:336
+msgid "File that you are currently viewing"
+msgstr "Zurzeit angeschautes Dokument"
+
+#: src/LYShowInfo.c:344 src/LYShowInfo.c:444
+msgid "Linkname:"
+msgstr "Linkname:"
+
+# Some of the following stuff is highly technical, so leave as English
+# (or whatever the language of protocol elements is...) - kw
+#: src/LYShowInfo.c:350 src/LYShowInfo.c:365
+msgid "Charset:"
+msgstr "Charset:"
+
+#: src/LYShowInfo.c:364
+msgid "(assumed)"
+msgstr "(vermutet)"
+
+#: src/LYShowInfo.c:371
+msgid "Server:"
+msgstr "Server:"
+
+#: src/LYShowInfo.c:374
+msgid "Date:"
+msgstr "Datum:"
+
+#: src/LYShowInfo.c:377
+msgid "Last Mod:"
+msgstr "Geändert:"
+
+#: src/LYShowInfo.c:381
+msgid "Expires:"
+msgstr "Expires:"
+
+#: src/LYShowInfo.c:384
+msgid "Cache-Control:"
+msgstr "Cache-Control:"
+
+#: src/LYShowInfo.c:387
+msgid "Content-Length:"
+msgstr "Content-Length:"
+
+#: src/LYShowInfo.c:391
+msgid "Length:"
+msgstr "Länge:"
+
+#: src/LYShowInfo.c:396
+msgid "Language:"
+msgstr "Language:"
+
+#: src/LYShowInfo.c:402
+msgid "Post Data:"
+msgstr "POST-Daten:"
+
+#: src/LYShowInfo.c:405
+msgid "Post Content Type:"
+msgstr "POST-Content-Type:"
+
+#: src/LYShowInfo.c:408
+msgid "Owner(s):"
+msgstr "Besitzer:"
+
+#: src/LYShowInfo.c:413
+msgid "size:"
+msgstr "Länge:"
+
+#: src/LYShowInfo.c:415
+msgid "lines"
+msgstr "Zeilen"
+
+#: src/LYShowInfo.c:419
+msgid "forms mode"
+msgstr "Formmodus"
+
+#: src/LYShowInfo.c:421
+msgid "source"
+msgstr "Quelltext"
+
+#: src/LYShowInfo.c:422
+msgid "normal"
+msgstr "normal"
+
+#: src/LYShowInfo.c:424
+msgid ", safe"
+msgstr ", sicher"
+
+#: src/LYShowInfo.c:426
+msgid ", via internal link"
+msgstr ", durch internen Link"
+
+#: src/LYShowInfo.c:430
+msgid ", no-cache"
+msgstr ", no-cache"
+
+#: src/LYShowInfo.c:432
+msgid ", ISMAP script"
+msgstr ", ISMAP-Script"
+
+#: src/LYShowInfo.c:434
+msgid ", bookmark file"
+msgstr ", Lesezeichendatei"
+
+#: src/LYShowInfo.c:437
+msgid "mode:"
+msgstr "Modus:"
+
+#: src/LYShowInfo.c:443
+msgid "Link that you currently have selected"
+msgstr "Zurzeit ausgewählter Link"
+
+#: src/LYShowInfo.c:452
+msgid "Method:"
+msgstr "Methode:"
+
+#: src/LYShowInfo.c:456
+msgid "Enctype:"
+msgstr "Enctype:"
+
+#: src/LYShowInfo.c:462
+msgid "Action:"
+msgstr "Aktion:"
+
+#: src/LYShowInfo.c:468
+msgid "(Form field)"
+msgstr "(Formfeld)"
+
+#: src/LYShowInfo.c:478
+msgid "No Links on the current page"
+msgstr "Keine Links auf dieser Seite"
+
+#: src/LYShowInfo.c:483
+msgid "Server Headers:"
+msgstr "Server-Headers:"
+
+#: src/LYStyle.c:332
+#, c-format
+msgid ""
+"Syntax Error parsing style in lss file:\n"
+"[%s]\n"
+"The line must be of the form:\n"
+"OBJECT:MONO:COLOR (ie em:bold:brightblue:white)\n"
+"where OBJECT is one of EM,STRONG,B,I,U,BLINK etc.\n"
+"\n"
+msgstr ""
+"Syntaxfehler beim Parsen eines style's in lss-Datei:\n"
+"[%s]\n"
+"Die Zeile muss die folgende Form haben:\n"
+"OBJECT:MONO:COLOR (z.B. em:bold:brightblue:white)\n"
+"wobei OBJECT eins von EM,STRONG,B,I,U,BLINK usw. ist.\n"
+"\n"
+
+#: src/LYStyle.c:941
+#, c-format
+msgid ""
+"\n"
+"Lynx file \"%s\" is not available.\n"
+"\n"
+msgstr ""
+"\n"
+"Lynx-Datei %s ist nicht verfügbar.\n"
+"\n"
+
+#: src/LYTraversal.c:111
+msgid "here is a list of the history stack so that you may rebuild"
+msgstr "hier ist eine Auflistung des History-Stacks zur Rekonstruktion"
+
+#: src/LYUpload.c:77
+msgid "ERROR! - upload command is misconfigured"
+msgstr "FEHLER! - Upload-Befehl ist falsch konfiguriert"
+
+#: src/LYUpload.c:98
+msgid "Illegal redirection \"../\" found! Request ignored."
+msgstr "Unerlaubte Umleitung \"../\" gefunden! Befehl ignoriert."
+
+#: src/LYUpload.c:101
+msgid "Illegal character \"/\" found! Request ignored."
+msgstr "Ungültiges Zeichen \"/\" gefunden! Befehl ignoriert."
+
+#: src/LYUpload.c:104
+msgid "Illegal redirection using \"~\" found! Request ignored."
+msgstr "Unerlaubte Umleitung mit \"~\" gefunden! Befehl ignoriert."
+
+#: src/LYUpload.c:157
+msgid "Unable to upload file."
+msgstr "Upload für Datei nicht möglich."
+
+#: src/LYUpload.c:196
+msgid "Upload To:"
+msgstr "Upload - wohin:"
+
+#: src/LYUpload.c:197
+msgid "Upload options:"
+msgstr "Upload-Optionen:"
+
+#: src/LYUtils.c:1911
+msgid "Download document URL put to clipboard."
+msgstr "URL des Download-Dokuments in das Clipboard gespeichert."
+
+#: src/LYUtils.c:2658
+msgid "Unexpected access protocol for this URL scheme."
+msgstr "Unerwartetes Zugangsprotokoll für dieses URL-Schema."
+
+#: src/LYUtils.c:3571
+msgid "Too many tempfiles"
+msgstr "Zu viele temporäre Dateien"
+
+#: src/LYUtils.c:3871
+msgid "unknown restriction"
+msgstr "unbekannte Beschränkung"
+
+#: src/LYUtils.c:3902
+#, c-format
+msgid "No restrictions set.\n"
+msgstr "Keine Beschränkungen gesetzt.\n"
+
+#: src/LYUtils.c:3905
+#, c-format
+msgid "Restrictions set:\n"
+msgstr "Aktuelle Beschränkungen:\n"
+
+#: src/LYUtils.c:5202
+msgid "Cannot find HOME directory"
+msgstr "Das HOME-Verzeichnis ist nicht zu finden"
+
+#: src/LYrcFile.c:16
+msgid "Normally disabled. See ENABLE_LYNXRC in lynx.cfg\n"
+msgstr "Normalerweise nicht aktiviert. Siehe ENABLE_LYNXRC in lynx.cfg.\n"
+
+#: src/LYrcFile.c:373
+msgid ""
+"accept_all_cookies allows the user to tell Lynx to automatically\n"
+"accept all cookies if desired. The default is \"FALSE\" which will\n"
+"prompt for each cookie. Set accept_all_cookies to \"TRUE\" to accept\n"
+"all cookies.\n"
+msgstr ""
+"accept_all_cookies erlaubt es, Lynx zu sagen, dass alle Kekse (Cookies)\n"
+"akzeptiert werden sollen, falls dies Verhalten erwünscht ist.\n"
+"Die Normaleinstellung ist \"FALSE\", so dass normalerweise bei jedem Keks\n"
+"gefragt wird. Auf \"TRUE\" setzen, um alle Kekse zu akzeptieren.\n"
+
+#: src/LYrcFile.c:381
+msgid ""
+"anonftp_password allows the user to tell Lynx to use the personal\n"
+"email address as the password for anonymous ftp. If no value is given,\n"
+"Lynx will use the personal email address. Set anonftp_password\n"
+"to a different value if you choose.\n"
+msgstr ""
+"anonftp_password ermöglicht es dem Benutzer, Lynx zu sagen, dass\n"
+"es die persönliche Emailadresse als Passwort für anonymes FTP verwenden\n"
+"soll. Wenn kein Wert angegeben ist, benutzt Lynx die persönliche\n"
+"Emailadresse. Setzen Sie anonftp_password auf einen anderen Wert,\n"
+"wenn Sie wollen.\n"
+
+#: src/LYrcFile.c:390
+msgid ""
+"bookmark_file specifies the name and location of the default bookmark\n"
+"file into which the user can paste links for easy access at a later\n"
+"date.\n"
+msgstr ""
+"bookmark_file gibt Name und Ort der normalen Lesezeichendatei (default\n"
+"bookmark file) an. Der Benutzer kann die URLs von Links an die\n"
+"Lesezeichendatei anfügen, so dass Dokumente später leicht wiedergefunden\n"
+"werden können.\n"
+
+#: src/LYrcFile.c:395
+msgid ""
+"If case_sensitive_searching is \"on\" then when the user invokes a search\n"
+"using the 's' or '/' keys, the search performed will be case sensitive\n"
+"instead of case INsensitive. The default is usually \"off\".\n"
+msgstr ""
+"Wenn case_sensitive_searching auf \"on\" gesetzt ist, dann werden mit\n"
+"den Tasten 's' oder '/' gestartete Suchen mit Vergleichsoperationen\n"
+"durchgeführt, die groß-/kleinschreibungsempfindlich sind, statt\n"
+"Kapitalisierung zu ignorieren. Die übliche Einstellung ist \"off\".\n"
+
+#: src/LYrcFile.c:400
+msgid ""
+"The character_set definition controls the representation of 8 bit\n"
+"characters for your terminal. If 8 bit characters do not show up\n"
+"correctly on your screen you may try changing to a different 8 bit\n"
+"set or using the 7 bit character approximations.\n"
+"Current valid characters sets are:\n"
+msgstr ""
+"Die Definition von character_set bestimmt die Darstellung von 8-Bit-\n"
+"Zeichen auf dem Bildschirm. Falls 8-Bit-Zeichen nicht korrekt gezeigt\n"
+"werden, können Sie versuchen, zu einem anderen 8-Bit-Zeichensatz zu\n"
+"wechseln oder die \"7 bit approximations (US-ASCII)\" mit näherungs-\n"
+"weisen Ersatzdarstellungen zu verwenden.\n"
+"Zurzeit gültige Werte sind:\n"
+
+#: src/LYrcFile.c:408
+msgid ""
+"cookie_accept_domains and cookie_reject_domains are comma-delimited\n"
+"lists of domains from which Lynx should automatically accept or reject\n"
+"all cookies. If a domain is specified in both options, rejection will\n"
+"take precedence. The accept_all_cookies parameter will override any\n"
+"settings made here.\n"
+msgstr ""
+"cookie_accept_domains und cookie_reject_domains sind kommaseparierte\n"
+"Listen von Domains (mit führendem '.'), von denen alle Kekse automatisch\n"
+"akzeptiert oder verweigert werden sollen. Der Parameter accept_all_cookies\n"
+"parameter hat jedoch Vorrang über jedwede Einstellungen, die durch diese\n"
+"Listen gemacht werden. Wenn dieselbe Domain in cookie_accept_domains und\n"
+"in cookie_reject_domains erscheint, hat die Verweigerung vorrang.\n"
+
+#: src/LYrcFile.c:416
+msgid ""
+"cookie_file specifies the file from which to read persistent cookies.\n"
+"The default is ~/"
+msgstr ""
+"cookie_file gibt die Datei an, von der langlebige Kekse gelesen werden.\n"
+"Standardeinstellung ist ~/"
+
+#: src/LYrcFile.c:421
+msgid ""
+"cookie_loose_invalid_domains, cookie_strict_invalid_domains, and\n"
+"cookie_query_invalid_domains are comma-delimited lists of which domains\n"
+"should be subjected to varying degrees of validity checking. If a\n"
+"domain is set to strict checking, strict conformance to RFC2109 will\n"
+"be applied. A domain with loose checking will be allowed to set cookies\n"
+"with an invalid path or domain attribute. All domains will default to\n"
+"querying the user for an invalid path or domain.\n"
+msgstr ""
+"cookie_loose_invalid_domains, cookie_strict_invalid_domains und\n"
+"cookie_query_invalid_domains sind durch Kommas getrennte Listen von\n"
+"Internet-Domänen, die unterschiedlich strikten Gültigkeitstests\n"
+"unterzogen werden sollten. Wenn eine Domäne auf genaue Gültigkeit\n"
+"gesetzt ist, wird auf strikte Erfüllung von RFC2109 untersucht. Eine\n"
+"Domäne mit schwacher Gültigkeit kann Kekse mit einem ungültigen\n"
+"Pfad oder einem ungültigen Domänen-Attribut ablegen. Alle Domänen\n"
+"fragen grundsätzlich den Benutzer bei ungültigen Pfaden oder Domänen\n"
+
+#: src/LYrcFile.c:435
+msgid ""
+"dir_list_order specifies the directory list order under DIRED_SUPPORT\n"
+"(if implemented). The default is \"ORDER_BY_NAME\"\n"
+msgstr ""
+"dir_list_order bestimmt die Ordnung der Verzeichnislisten unter DIRED_SUPPORT\n"
+"(falls eingebaut). Die Vorgabe ist \"ORDER_BY_NAME\".\n"
+
+#: src/LYrcFile.c:440
+msgid ""
+"dir_list_styles specifies the directory list style under DIRED_SUPPORT\n"
+"(if implemented). The default is \"MIXED_STYLE\", which sorts both\n"
+"files and directories together. \"FILES_FIRST\" lists files first and\n"
+"\"DIRECTORIES_FIRST\" lists directories first.\n"
+msgstr ""
+"dir_list_styles bestimmt den Stil von Verzeichnislisten unter DIRED_SUPPORT\n"
+"(falls eingebaut). Die Normaleinstellung ist \"MIXED_STYLE\", d.h. sowohl\n"
+"Dateien als auch Verzeichnisse werden gemeinsam sortiert.\n"
+"Mit \"FILES_FIRST\" werde normale Dateien zuerst aufgelistet, und mit\n"
+"\"DIRECTORIES_FIRST\" kommen Verzeichnisse zuerst.\n"
+
+#: src/LYrcFile.c:448
+msgid ""
+"If emacs_keys is to \"on\" then the normal EMACS movement keys:\n"
+" ^N = down ^P = up\n"
+" ^B = left ^F = right\n"
+"will be enabled.\n"
+msgstr ""
+"Wenn emacs_keys auf \"on\" gesetzt ist, werden die im Editor EMACS\n"
+"üblichen Bewegungstasten aktiviert:\n"
+" ^N = down ^P = up\n"
+" ^B = left ^F = right\n"
+
+#: src/LYrcFile.c:454
+msgid ""
+"file_editor specifies the editor to be invoked when editing local files\n"
+"or sending mail. If no editor is specified, then file editing is disabled\n"
+"unless it is activated from the command line, and the built-in line editor\n"
+"will be used for sending mail.\n"
+msgstr ""
+"file_editor gibt das Programm an, das als Editor benutzt wird, wenn lokale\n"
+"Dateien geändert werden sollen oder wenn Mail geschickt werden soll.\n"
+"Wenn kein Editor angegeben ist, ist Editieren nicht möglich, außer wenn es\n"
+"von der Befehlszeile aus aktiviert wird, und der eingebaute Zeileneditor\n"
+"wird für das Schicken von Mail benutzt.\n"
+
+#: src/LYrcFile.c:461
+msgid ""
+"The file_sorting_method specifies which value to sort on when viewing\n"
+"file lists such as FTP directories. The options are:\n"
+" BY_FILENAME -- sorts on the name of the file\n"
+" BY_TYPE -- sorts on the type of the file\n"
+" BY_SIZE -- sorts on the size of the file\n"
+" BY_DATE -- sorts on the date of the file\n"
+msgstr ""
+"Die file_sorting_method gibt an, nach welchem Feld Dateilisten\n"
+"wie z.B. FTP-Verzeichnisse sortiert werden sollen.\n"
+"Die möglichen Optionen sind:\n"
+" BY_FILENAME -- sortiert nach Dateinamen\n"
+" BY_TYPE -- sortiert nach Dateityp\n"
+" BY_SIZE -- sortiert nach Dateilänge\n"
+" BY_DATE -- sortiert nach Änderungsdatum\n"
+
+#: src/LYrcFile.c:492
+msgid ""
+"lineedit_mode specifies the key binding used for inputting strings in\n"
+"prompts and forms. If lineedit_mode is set to \"Default Binding\" then\n"
+"the following control characters are used for moving and deleting:\n"
+"\n"
+" Prev Next Enter = Accept input\n"
+" Move char: <- -> ^G = Cancel input\n"
+" Move word: ^P ^N ^U = Erase line\n"
+" Delete char: ^H ^R ^A = Beginning of line\n"
+" Delete word: ^B ^F ^E = End of line\n"
+"\n"
+"Current lineedit modes are:\n"
+msgstr ""
+"lineedit_mode gibt an, welche Tastaturbindungen für die Zeicheneingabe\n"
+"in Prompts un Formfeldern verwendet werden. Wenn lineedit_mode auf\n"
+"\"Default Binding\" gesetzt ist, werden die folgenden Kontrollzeichen\n"
+"zum Bewegen und Löschen benutzt:\n"
+"\n"
+" rückwärts/vorwärts Enter = Eingabe = Accept input\n"
+"Einzelzeichen: <- -> ^G = Abbruch (Cancel input)\n"
+" ganzes Wort: ^P ^N ^U = Zeile Löschen (Erase line)\n"
+"Lösch Zeichen: ^H ^R ^A = Zeilenanfang (Beginning of line)\n"
+" Lösche Wort: ^B ^F ^E = Zeilenende (End of line)\n"
+"\n"
+"Zurzeit verfügbare Bindungen sind:\n"
+
+#: src/LYrcFile.c:510
+msgid ""
+"The following allow you to define sub-bookmark files and descriptions.\n"
+"The format is multi_bookmark<capital_letter>=<filename>,<description>\n"
+"Up to 26 bookmark files (for the English capital letters) are allowed.\n"
+"We start with \"multi_bookmarkB\" since 'A' is the default (see above).\n"
+msgstr ""
+"Im folgenden können Unterlesezeichendateien (sub-bookmark files)\n"
+"un ihre Beschreibungen definiert werden. Das Format ist\n"
+"multi_bookmark<capital_letter>=<filename>,<description>\n"
+"Bis zu 26 Lesezeichendateien (für die im Englischen verwendeten\n"
+"Großbuchstaben) sind erlaubt.\n"
+"Wir beginnen mit \"multi_bookmarkB\", da 'A' schon für normale\n"
+"Lesezeichen (siehe oben) benutzt wird.\n"
+
+#: src/LYrcFile.c:516
+msgid ""
+"personal_mail_address specifies your personal mail address. The\n"
+"address will be sent during HTTP file transfers for authorization and\n"
+"logging purposes, and for mailed comments.\n"
+"If you do not want this information given out, set the NO_FROM_HEADER\n"
+"to TRUE in lynx.cfg, or use the -nofrom command line switch. You also\n"
+"could leave this field blank, but then you won't have it included in\n"
+"your mailed comments.\n"
+msgstr ""
+"personal_mail_address gibt die persönliche Mailadresse des Benutzers an.\n"
+"Die Adresse wird für das Schicken von Kommentaren als Mail benutzt,\n"
+"und kann auch bei Zugriff zu einem HTTP-Server für Autorisierungs-\n"
+"und Logging-Zwecke in einem Header gesandt werden. Letztere Nutzung\n"
+"ist normalerweise ausgeschaltet um personenbezogene Daten zu schützen,\n"
+"kann aber durch Setzen von NO_FROM_HEADER in lynx.cfg oder durch den\n"
+"Switch -from in der Befehlszeile aktiviert werden.\n"
+"Dieses Feld könnte hier auch leergelassen werden, aber dann wird die\n"
+"Absenderadresse in Mail-Kommentaren fehlen.\n"
+
+#: src/LYrcFile.c:525
+msgid ""
+"personal_mail_name specifies your personal name, for mail. The\n"
+"name is sent for mailed comments. Lynx will prompt for this,\n"
+"showing the configured value as a default when sending mail.\n"
+"This is not necessarily the same as a name provided as part of the\n"
+"personal_mail_address.\n"
+"Lynx does not save your changes to that default value as a side-effect\n"
+"of sending email. To update the default value, you must use the options\n"
+"menu, or modify this file directly.\n"
+msgstr ""
+"personal_mail_name gibt deinen persönlichen Namen für E-mails an. Der\n"
+"Name wird beim Versenden von E-mailkommentaren verwendet. Lynx wird\n"
+"dich am Eingabeprompt danach fragen und den vorkonfigurierten Wert\n"
+"standardmässig benutzen. Dieser Wert muß nicht unbedingt mit dem Namen\n"
+"übereinstimmen, der als Teil von personal_mail_address definiert\n"
+"wurde. Lynx speichert die Änderungen des Standardwertes nicht. Um den\n"
+"Standardwert zu ändern, benutze bitte das Optionenmenü oder\n"
+"modifiziere die Konifugrationsdatei direkt.\n"
+
+#: src/LYrcFile.c:535
+msgid ""
+"preferred_charset specifies the character set in MIME notation (e.g.,\n"
+"ISO-8859-2, ISO-8859-5) which Lynx will indicate you prefer in requests\n"
+"to http servers using an Accept-Charset header. The value should NOT\n"
+"include ISO-8859-1 or US-ASCII, since those values are always assumed\n"
+"by default. May be a comma-separated list.\n"
+"If a file in that character set is available, the server will send it.\n"
+"If no Accept-Charset header is present, the default is that any\n"
+"character set is acceptable. If an Accept-Charset header is present,\n"
+"and if the server cannot send a response which is acceptable\n"
+"according to the Accept-Charset header, then the server SHOULD send\n"
+"an error response, though the sending of an unacceptable response\n"
+"is also allowed.\n"
+msgstr ""
+"preferred_charset gibt Zeichensatz und -kodierung (charset) in MIME-\n"
+"Notation an (z.B. ISO-8859-2, ISO-8859-5), Lynx benutzt diese Einstellung\n"
+"um einem HTTP-Server im Accept-Charset-Header mitzuteilen, welches der\n"
+"vorgezogene charset ist. Eine kommaseparierte Liste ist auch möglich.\n"
+"Die Werte ISO-8859-1 oder US-ASCII sollten NICHT explizit angegeben\n"
+"werden, da diese bereits als default vorausgesetzt werden.\n"
+"Falls eine Datei mit verlangtem charset vorhanden ist, sollte der Server\n"
+"sie dann schicken. (Bei Abwesenheit eines Accept-Charset-Headers im\n"
+"Request gilt jeder beliebige charset als akzeptabel.) Wenn der\n"
+"Accept-Charset-Header geschickt wird, der Server aber keine dem-\n"
+"entsprechend akzeptable Antwort schicken kann, dann sollte der Server\n"
+"mit einer Fehlermeldung antworten, das Senden einer Antwort mit\n"
+"nichtpassendem charset ist allerdings auch erlaubt.\n"
+
+#: src/LYrcFile.c:553
+msgid ""
+"preferred_language specifies the language in MIME notation (e.g., en,\n"
+"fr, may be a comma-separated list in decreasing preference)\n"
+"which Lynx will indicate you prefer in requests to http servers.\n"
+"If a file in that language is available, the server will send it.\n"
+"Otherwise, the server will send the file in its default language.\n"
+msgstr ""
+"preferred_language gibt eine Sprache oder mehrere Sprachen in MIME-\n"
+"Notation an (z.B. en oder fr, kann auch eine kommaseparierte, nach\n"
+"abnehmender Präferenz geordnete Liste sein).\n"
+"Lynx übermittelt die angegebene Sprachpräferenz in Requests zum\n"
+"HTTP-Server. Der Server sollte dann eine Datei in der vorgezogenen\n"
+"Sprache zurückschicken, falls vorhanden; andernfalls antwortet der\n"
+"Server in der für den Server (und die Datei) üblichen Sprache.\n"
+
+#: src/LYrcFile.c:564
+msgid ""
+"If run_all_execution_links is set \"on\" then all local execution links\n"
+"will be executed when they are selected.\n"
+"\n"
+"WARNING - This is potentially VERY dangerous. Since you may view\n"
+" information that is written by unknown and untrusted sources\n"
+" there exists the possibility that Trojan horse links could be\n"
+" written. Trojan horse links could be written to erase files\n"
+" or compromise security. This should only be set to \"on\" if\n"
+" you are viewing trusted source information.\n"
+msgstr ""
+"Wenn run_all_execution_links auf \"on\" gesetzt ist, werden alle \"local\n"
+"execution links\" ausgeführt, wenn sie aktiviert (ausgewählt) werden.\n"
+"\n"
+"WARNUNG - Dies ist potentiell SEHR gefährlich. Da Sie Dokumente ansehen\n"
+" können, die von unbekannten oder verdächtigen Quellen stammen,\n"
+" besteht die Möglichkeit, dass jemand Ihnen einen Link unterschiebt,\n"
+" der wie ein trojanisches Pferd unerwünschten Zugang gestattet.\n"
+" Solche trojanischen links könnten so geschrieben sein, dass sie\n"
+" Dateien löschen oder die Sicherheit kompromittieren.\n"
+" Die Einstellung sollte nur dann auf \"on\" gesetzt werden, wenn\n"
+" die angeschauten Dokumente von einer vertrauenswürdigen Quelle\n"
+" kommen.\n"
+
+#: src/LYrcFile.c:575
+msgid ""
+"If run_execution_links_on_local_files is set \"on\" then all local\n"
+"execution links that are found in LOCAL files will be executed when they\n"
+"are selected. This is different from run_all_execution_links in that\n"
+"only files that reside on the local system will have execution link\n"
+"permissions.\n"
+"\n"
+"WARNING - This is potentially dangerous. Since you may view\n"
+" information that is written by unknown and untrusted sources\n"
+" there exists the possibility that Trojan horse links could be\n"
+" written. Trojan horse links could be written to erase files\n"
+" or compromise security. This should only be set to \"on\" if\n"
+" you are viewing trusted source information.\n"
+msgstr ""
+"Wenn run_execution_links_on_local_files auf \"on\" gesetzt ist, dann werden\n"
+"alle \"local execution links\", die in LOKALEN Dateien gefunden wurden,\n"
+"ausgeführt, wenn sie aktiviert (ausgewählt) werden.\n"
+"Dies underscheidet sich von run_all_execution_links, insofern als nur\n"
+"für Dateien, die sich auf dem lokalen System befinden, Erlaubnis zur\n"
+"Ausführung gegeben wird.\n"
+"\n"
+"WARNUNG - Dies ist potentiell gefährlich. Da Sie Dokumente ansehen\n"
+" können, die von unbekannten oder verdächtigen Quellen stammen,\n"
+" besteht die Möglichkeit, dass jemand Ihnen einen Link unterschiebt,\n"
+" der wie ein trojanisches Pferd unerwünschten Zugang gestattet.\n"
+" Solche trojanischen links könnten so geschrieben sein, dass sie\n"
+" Dateien löschen oder die Sicherheit kompromittieren.\n"
+" Die Einstellung sollte nur dann auf \"on\" gesetzt werden, wenn\n"
+" die angeschauten Dokumente von einer vertrauenswürdigen Quelle\n"
+" kommen.\n"
+
+#: src/LYrcFile.c:593
+msgid ""
+"select_popups specifies whether the OPTIONs in a SELECT block which\n"
+"lacks a MULTIPLE attribute are presented as a vertical list of radio\n"
+"buttons or via a popup menu. Note that if the MULTIPLE attribute is\n"
+"present in the SELECT start tag, Lynx always will create a vertical list\n"
+"of checkboxes for the OPTIONs. A value of \"on\" will set popup menus\n"
+"as the default while a value of \"off\" will set use of radio boxes.\n"
+"The default can be overridden via the -popup command line toggle.\n"
+msgstr ""
+"select_popups bestimmt, ob OPTIONs in einem SELECT-Block ohne das\n"
+"Attribute MULTIPLE als eine vertikale Liste von Radio-Buttons oder\n"
+"als Popup-Menü präsentiert werden. Es sei bemerkt, dass Lynx immer eine\n"
+"vertikale Liste von Checkboxes erzeugt, wenn das Attribut MULTIPLE im\n"
+"Start-Tag SELECT vorhanden ist. Der Wert \"on\" macht Popup-Menüs zum\n"
+"Normalverhalten, während der Wert \"off\" die Benutzung von Radio-Buttons\n"
+"zum Normalverhalten macht. Die normale Einstellung kann durch den\n"
+"Toggle-Switch -popup in der Befehlszeile verändert werden.\n"
+
+#: src/LYrcFile.c:604
+msgid ""
+"show_color specifies how to set the color mode at startup. A value of\n"
+"\"never\" will force color mode off (treat the terminal as monochrome)\n"
+"at startup even if the terminal appears to be color capable. A value of\n"
+"\"always\" will force color mode on even if the terminal appears to be\n"
+"monochrome, if this is supported by the library used to build lynx.\n"
+"A value of \"default\" will yield the behavior of assuming\n"
+"a monochrome terminal unless color capability is inferred at startup\n"
+"based on the terminal type, or the -color command line switch is used, or\n"
+"the COLORTERM environment variable is set. The default behavior always is\n"
+"used in anonymous accounts or if the \"option_save\" restriction is set.\n"
+"The effect of the saved value can be overridden via\n"
+"the -color and -nocolor command line switches.\n"
+"The mode set at startup can be changed via the \"show color\" option in\n"
+"the 'o'ptions menu. If the option settings are saved, the \"on\" and\n"
+"\"off\" \"show color\" settings will be treated as \"default\".\n"
+msgstr ""
+"show_color gibt den Farbmodus bei Programmstart an. Die Einstellung\n"
+"\"never\" schaltet Farbunterstützung in Lynx aus (so dass das Terminal\n"
+"als Schwarzweißbildschirm behandelt wird), sogar wenn es scheint dass\n"
+"das Terminal farbfähig ist. Die Einstellung \"always\" erzwingt die\n"
+"Aktivierung des Farbmodus in Lynx, sogar wenn der Terminaltyp nicht\n"
+"farbfähig zu sein scheint, falls die Programmbibliothek, mit der Lynx\n"
+"kompiliert und gelinkt wurde, dies zulässt.\n"
+"Wenn die Einstellung als \"default\" gespeichert ist, ist das Verhalten\n"
+"wie folgt: Farbunterstützung im Terminal wird angenommen falls beim\n"
+"Programmstart die Beschreibung des Terminaltyps Farbfähigkeit anzeigt\n"
+"oder der Switch -color in der Befehlszeile verwendet wird oder die\n"
+"Umgebungsvariable COLORTERM gesetzt ist. Dieses \"default\"-Verhalten\n"
+"trifft außerdem für anomyme Acounts immer zu, und wenn die \"option_save\"\n"
+"Restriction gesetzt ist.\n"
+"Der Effekt der gespeicherten Einstellung kann durch -color oder -nocolor\n"
+"in der Befehlszeile aufgehoben werden.\n"
+"Der beim Programmstart gesetzte Modus kann mittels der Option \"show color\"\n"
+"im 'O'ptionsmenü geändert werden. Wenn die Optionseinstellungen gespei-\n"
+"chert werden, werden die Werte \"on\" und \"off\" für \"show color\" als\n"
+"\"default\" behandelt.\n"
+
+#: src/LYrcFile.c:621
+msgid ""
+"show_cursor specifies whether to 'hide' the cursor to the right (and\n"
+"bottom, if possible) of the screen, or to place it to the left of the\n"
+"current link in documents, or current option in select popup windows.\n"
+"Positioning the cursor to the left of the current link or option is\n"
+"helpful for speech or braille interfaces, and when the terminal is\n"
+"one which does not distinguish the current link based on highlighting\n"
+"or color. A value of \"on\" will set positioning to the left as the\n"
+"default while a value of \"off\" will set 'hiding' of the cursor.\n"
+"The default can be overridden via the -show_cursor command line toggle.\n"
+msgstr ""
+"show_cursor gibt an ob der Cursor (Schreibmarke) am rechten Bildschirmrand\n"
+"(und wennmöglich in der underen Ecke) 'versteckt' werden sollte, oder ob\n"
+"er links vom aktuellen Link oder der ausgewählten Option in Popup-Fenstern\n"
+"erscheinen soll. Die Plazierung links von ausgewähltem Link oder Option\n"
+"ist nützlich für Sprach- und Brailleschnittstellen, und wenn das Terminal\n"
+"eines ist, welches nicht durch Hervorhebung oder Farbe die Unterscheidung \n"
+"des ausgewählten Links zulässt. Der Wert \"on\" bewirkt, dass der Cursor links\n"
+"von Links erscheint, der Wert \"off\" bewirkt 'Verstecken' des Cursors.\n"
+"Die gewählte Einstellung kann durch den Toggle-Switch -show_cursor in\n"
+"der Befehlszeile geändert werden.\n"
+
+#: src/LYrcFile.c:632
+msgid ""
+"show_dotfiles specifies that the directory listing should include\n"
+"\"hidden\" (dot) files/directories. If set \"on\", this will be\n"
+"honored only if enabled via userdefs.h and/or lynx.cfg, and not\n"
+"restricted via a command line switch. If display of hidden files\n"
+"is disabled, creation of such files via Lynx also is disabled.\n"
+msgstr ""
+"show_dotfiles gibt an dass in der Auflistung von Verzeichnissen\n"
+"\"versteckte\" (dot-)Dateien und Verzeichnisse enthalten sein sollten.\n"
+"Die Einstellung \"on\" wird nur honoriert, wenn die durch userdefs.h\n"
+"und/oder lynx.cfg gegebenen Einstellungen dies erlauben und keine\n"
+"Restriktion von der Befehlszeile in Kraft ist. Wenn die Anzeige\n"
+"von versteckten Dateien ausgeschaltet ist, ist auch die Erzeugung\n"
+"solcher Dateien von Lynx aus nicht erlaubt.\n"
+
+#: src/LYrcFile.c:643
+msgid ""
+"If sub_bookmarks is not turned \"off\", and multiple bookmarks have\n"
+"been defined (see below), then all bookmark operations will first\n"
+"prompt the user to select an active sub-bookmark file. If the default\n"
+"Lynx bookmark_file is defined (see above), it will be used as the\n"
+"default selection. When this option is set to \"advanced\", and the\n"
+"user mode is advanced, the 'v'iew bookmark command will invoke a\n"
+"statusline prompt instead of the menu seen in novice and intermediate\n"
+"user modes. When this option is set to \"standard\", the menu will be\n"
+"presented regardless of user mode.\n"
+msgstr ""
+"Wenn sub_bookmarks nicht \"off\" ist und Multi-Datei-Lesezeichen (multiple\n"
+"bookmarks) definiert sind (siehe unten), dann werden alle Lesezeichen-\n"
+"operationen als ersten den Benutzer bitten, eine aktive Unterlesezeichen-\n"
+"datei auszuwählen. Das normale bookmark_file wird als Vorgabe vorge-\n"
+"schlagen, fall es definiert ist (siehe oben). Wenn diese Option auf\n"
+"\"advanced\" (= fortgeschritten) gesetzt ist und der Benutzermodus (user\n"
+"mode) auch advanced ist, dann führt der Tastenbefehl 'v'iew bookmark\n"
+"zu einer Statuszeilenfrage statt zu dem Menü, welches erscheint wenn\n"
+"der Benutzermodus novice oder intermediate ist. Wenn diese Option auf\n"
+"\"standard\" gesetzt ist, dann erscheint das letzgenannt Menü immer,\n"
+"unabhängig vom Benutzermodus.\n"
+
+#: src/LYrcFile.c:658
+msgid ""
+"user_mode specifies the users level of knowledge with Lynx. The\n"
+"default is \"NOVICE\" which displays two extra lines of help at the\n"
+"bottom of the screen to aid the user in learning the basic Lynx\n"
+"commands. Set user_mode to \"INTERMEDIATE\" to turn off the extra info.\n"
+"Use \"ADVANCED\" to see the URL of the currently selected link at the\n"
+"bottom of the screen.\n"
+msgstr ""
+"user_mode bestimmt den Benutzermodus, das Kenntnisniveau des Benutzers\n"
+"im Umgang mit Lynx. Wenn nicht anders angegeben, wird die Einstellung\n"
+"\"NOVICE\" verwendet. In diesem Modus werden zwei zusätzliche Zeilen mit\n"
+"Hilfsinformationen am unteren Bildschirmrand gezeigt, um dem Benutzer zu\n"
+"helfen, die grundlegenden Tastaturbefehle für Lynx zu lernen.\n"
+"Wenn user_mode auf \"INTERMEDIATE\" gesetzt wird, werden die Extrazeilen\n"
+"ausgeschaltet. Im Modus \"ADVANCED\" wird außerdem der URL des gerade\n"
+"ausgewählten Links am unteren Bildschirmrand angezeigt.\n"
+
+#: src/LYrcFile.c:667
+msgid ""
+"If verbose_images is \"on\", lynx will print the name of the image\n"
+"source file in place of [INLINE], [LINK] or [IMAGE]\n"
+"See also VERBOSE_IMAGES in lynx.cfg\n"
+msgstr ""
+"Wenn verbose_images auf \"on\" gesetzt ist, zeigt Lynx den Dateinamen\n"
+"der Bildquelle anstelle von [INLINE], [LINK] or [IMAGE] an.\n"
+"Siehe auch VERBOSE_IMAGES in lynx.cfg.\n"
+
+#: src/LYrcFile.c:672
+msgid ""
+"If vi_keys is set to \"on\", then the normal VI movement keys:\n"
+" j = down k = up\n"
+" h = left l = right\n"
+"will be enabled. These keys are only lower case.\n"
+"Capital 'H', 'J' and 'K will still activate help, jump shortcuts,\n"
+"and the keymap display, respectively.\n"
+msgstr ""
+"Wenn vi_keys auf \"on\" gesetzt ist, werden die im Editor VI üblichen\n"
+"Bewegungstasten aktiviert:\n"
+" j = down k = up\n"
+" h = left l = right\n"
+"Diese Einstellung wirkt sich nur auf die Kleinbuchstaben aus.\n"
+"Die Wirkung der Großbuchstaben 'H', 'J' and 'K' bleibt unverändert,\n"
+"diese können daher zur gleichen Zeit immer noch verwendet werden um\n"
+"die normalen Aktionen (activate help, jump shortcuts, keymap display)\n"
+"auszulösen.\n"
+
+#: src/LYrcFile.c:680
+msgid ""
+"The visited_links setting controls how Lynx organizes the information\n"
+"in the Visited Links Page.\n"
+msgstr ""
+"Die visited_links Einrichtung legt fest, wie Lynx die Informationen\n"
+"auf der Seite für besuchte Links organisiert.\n"
+
+#: src/LYrcFile.c:924
+msgid ""
+"If keypad_mode is set to \"NUMBERS_AS_ARROWS\", then the numbers on\n"
+"your keypad when the numlock is on will act as arrow keys:\n"
+" 8 = Up Arrow\n"
+" 4 = Left Arrow 6 = Right Arrow\n"
+" 2 = Down Arrow\n"
+"and the corresponding keyboard numbers will act as arrow keys,\n"
+"regardless of whether numlock is on.\n"
+msgstr ""
+"Wenn keypad_mode auf \"NUMBERS_AS_ARROWS\" gesetzt ist, dann werden die\n"
+"meisten Ziffern als entsprechende Bewegungstasten vom Ziffernblock\n"
+"der üblichen Tastatur behandelt. Dadurch können diese Tasten als\n"
+"Pfeiltasten verwendet werden, wenn \"Numlock\" aktiv ist.\n"
+"\n"
+" 8 = Up Arrow\n"
+" 4 = Left Arrow 6 = Right Arrow\n"
+" 2 = Down Arrow\n"
+"Die über den Buchstaben gelegenen Zifferntasten haben dann natürlich\n"
+"denselben Effekt, unabhängig vom \"Numlock\"-Zustand.\n"
+
+#: src/LYrcFile.c:933
+msgid ""
+"If keypad_mode is set to \"LINKS_ARE_NUMBERED\", then numbers will\n"
+"appear next to each link and numbers are used to select links.\n"
+msgstr ""
+"Wenn keypad_mode auf \"LINKS_ARE_NUMBERED\" gesetzt ist, dann werden\n"
+"Links mit einer sichtbaren Nummerierung versehen, und Zifferntasten\n"
+"können zur Auswahl von Links benutzt werden.\n"
+
+#: src/LYrcFile.c:937
+msgid ""
+"If keypad_mode is set to \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\", then\n"
+"numbers will appear next to each link and visible form input field.\n"
+"Numbers are used to select links, or to move the \"current link\" to a\n"
+"form input field or button. In addition, options in popup menus are\n"
+"indexed so that the user may type an option number to select an option in\n"
+"a popup menu, even if the option isn't visible on the screen. Reference\n"
+"lists and output from the list command also enumerate form inputs.\n"
+msgstr ""
+"Wenn keypad_mode auf \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\" gesetzt ist,\n"
+"dann werden Links und sichtbare Formfelder mit nebenstehend erscheinender\n"
+"Nummerierung versehen, und Zifferntasten können zur Auswahl von Links oder\n"
+"für Positionierung auf Formeingabefelder und -buttons verwendet werden. \n"
+"Zusätzlich werden auch Optionen in Popup-Menüs durchnummeriert, so dass\n"
+"eine Option durch Eingabe der entsprechenden Nummer ausgewählt werden\n"
+"kann (sogar wenn die gewünschte Option nicht im gerade auf dem Bildschirm\n"
+"sichtbaren Bereich des Popup-Menüs liegt). Außerdem werden Formfelder\n"
+"auch in Verweislisten und im Ergebnis des Tastenbefehls 'L'ist nummeriert\n"
+"aufgelistet.\n"
+
+#: src/LYrcFile.c:946
+msgid ""
+"NOTE: Some fixed format documents may look disfigured when\n"
+"\"LINKS_ARE_NUMBERED\" or \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\" are\n"
+"enabled.\n"
+msgstr ""
+"Warnung: Einige Dokumente mit fixem Format können unschön aussehen,\n"
+"wenn \"LINKS_ARE_NUMBERED\" or \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\"\n"
+"eingeschaltet ist.\n"
+
+#: src/LYrcFile.c:978
+msgid ""
+"Lynx User Defaults File\n"
+"\n"
+msgstr ""
+"Lynx-Benutzereinstellungs-Datei\n"
+"\n"
+
+#: src/LYrcFile.c:987
+msgid ""
+"This file contains options saved from the Lynx Options Screen (normally\n"
+"with the 'o' key). To save options with that screen, you must select the\n"
+"checkbox:\n"
+msgstr ""
+"Diese Datei enthält Optionen, die aus dem Lynx-Optionsschirm gespeichert\n"
+"wurden (normalerweise mit der Taste \"o\"). Um die Optionen mit diesem Schirm\n"
+"zu speichern, müssen Sie das Kästchen ankreuzen:\n"
+
+#: src/LYrcFile.c:994
+msgid ""
+"You must then save the settings using the link on the line above the\n"
+"checkbox:\n"
+msgstr ""
+"Danach müssen Sie die Einstellungen speichern, indem Sie dem Link in\n"
+"der Zeile über dem Ankreuzkästchen folgen:\n"
+
+#: src/LYrcFile.c:1001
+msgid ""
+"You may also use the command-line option \"-forms_options\", which displays\n"
+"the simpler Options Menu instead. Save options with that using the '>' key.\n"
+"\n"
+msgstr ""
+"Sie können auch die Kommandozeilenoption \"-forms_options\" benutzen, die\n"
+"ein einfachereres Menü anzeigt. Speichern Sie die Optionen damit, indem Sie\n"
+"die Taste \">\" drücken.\n"
+"\n"
+
+#: src/LYrcFile.c:1008
+msgid ""
+"This file contains options saved from the Lynx Options Screen (normally\n"
+"with the '>' key).\n"
+"\n"
+msgstr ""
+"Diese Datei enthält Optionen, die aus dem Lynx-Options-Bildschirm gespeichert\n"
+"wurden (normalerweise mit der Taste \">\").\n"
+"\n"
+
+#: src/LYrcFile.c:1015
+msgid ""
+"There is normally no need to edit this file manually, since the defaults\n"
+"here can be controlled from the Options Screen, and the next time options\n"
+"are saved from the Options Screen this file will be completely rewritten.\n"
+"You have been warned...\n"
+"\n"
+"If you are looking for the general configuration file - it is normally\n"
+"called \"lynx.cfg\". It has different content and a different format.\n"
+"It is not this file.\n"
+msgstr ""
+"Normalerweise braucht diese Datei nicht manuell editiert zu werden, da\n"
+"die Einstellungen hier von der Optionsseite kontrolliert werden können.\n"
+"Außerdem wird diese Datei das nächste Mal, wenn Optionen von der\n"
+"Optionsseite gespeichert werden, komplett überschrieben. Sie sind\n"
+"gewarnt worden...\n"
+"Wenn Sie nach der generellen Konfigurationsdatei suchen - da sind sie\n"
+"hier am falschen Ort. Die generelle Konfigurationsdatei wird üblicherweise\n"
+"lynx.cfg genannt, und ihr Inhalt und Format ist verschieden. Das hier ist\n"
+"sie jedenfalls nicht.\n"
+
+#~ msgid "HREF in BASE tag is not an absolute URL."
+#~ msgstr "HREF in BASE-Tag ist kein absoluter URL."
+
+#~ msgid "Visible links"
+#~ msgstr "Sichtbare Links"
+
+#~ msgid "Address contains a username: %s"
+#~ msgstr "Adresse mit einem Username: %s"
+
+#~ msgid ""
+#~ "\n"
+#~ "Lynx edit map not declared.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Lynx \"edit map\" nicht deklariert.\n"
+#~ "\n"
+
+#~ msgid "Very long lines have been wrapped!"
+#~ msgstr "Sehr lange Zeilen wurden umbrochen!"
+
+#~ msgid "Path too long"
+#~ msgstr "Pfad zu lang"
+
+#~ msgid "Source and destination are the same location - request ignored!"
+#~ msgstr "Quelle und Ziel sind derselbe Ort - Befehl ignoriert!"
+
+#~ msgid "Socket read failed for 180,000 tries."
+#~ msgstr "Lesefehler nach 180.000 Versuchen."
+
+#~ msgid "History List maximum reached! Document not pushed."
+#~ msgstr "Maximum für History-Liste erreicht! Dokument nicht auf Stapel abgelegt."
+
+#~ msgid "reason unknown."
+#~ msgstr "Grund nicht bekannt."
+
+#~ msgid "Remove '%s' and all of its contents?"
+#~ msgstr "'%s' mit gesamtem Inhalt entfernen?"
+
+#~ msgid "Remove directory and all of its contents?"
+#~ msgstr "Verzeichnis und gesamten Inhalt löschen?"
+
+#~ msgid "Short read from file, problem?"
+#~ msgstr "Datei unvollständig gelesen; gibt es ein Problem?"
+
+#~ msgid "Unable to open file management menu file."
+#~ msgstr "Dateimanagement-Menüdatei kann nicht geöffnet werden."
+
+#~ msgid "Ignoring invalid HOME"
+#~ msgstr "Ungültiger Wert für HOME wird ignoriert"
+
+#~ msgid "This special URL is not allowed as a goto!"
+#~ msgstr "Das Gehen zu diesem speziellen URL ist nicht erlaubt!"
+
+#~ msgid "Option choice (or page) number: "
+#~ msgstr "Optionswahl (oder Seite) Nummer: "
+
+#~ msgid "Choice number %d already is current."
+#~ msgstr "Aktuelle Wahl ist schon Nummer %d."
+
+#~ msgid "You are already at the end of this choice list."
+#~ msgstr "Schon am Ende der Auswahlliste."
+
+#~ msgid "You are already at the beginning of this choice list."
+#~ msgstr "Schon am Anfang der Auswahlliste."
+
+#~ msgid "You are already at page %d of this choice list."
+#~ msgstr "Schon auf Seite %d der Auswahlliste."
+
+#~ msgid "You have entered an invalid choice number."
+#~ msgstr "Ungültige Auswahlnummer eingegeben."
+
+#~ msgid "(From Cookie Jar)"
+#~ msgstr "(Aus Keksbeutel)"
+
+#~ msgid "Inactive text input, activate to edit (e.g., press ENTER)"
+#~ msgstr "Inaktive Texteingabe, für Eingabe erst aktivieren (z.B. ENTER drücken)"
diff --git a/po/eo.po b/po/eo.po
new file mode 100644
index 0000000..d076a92
--- /dev/null
+++ b/po/eo.po
@@ -0,0 +1,6422 @@
+# Esperanto translation of Lynx.
+# This file is distributed under the same license as the lynx package.
+# Translators:
+# Keith Bowes <zooplah@gmail.com>, 2011, 2014-2023.
+msgid ""
+msgstr ""
+"Project-Id-Version: lynx 2.9.0-dev8\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-07-31 10:04-0400\n"
+"PO-Revision-Date: 2023-01-01 10:27-0500\n"
+"Last-Translator: Keith Bowes <zooplah@gmail.com>\n"
+"Language-Team: Esperanto <translation-team-eo@lists.sourceforge.net>\n"
+"Language: eo\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. ******************************************************************
+#. * The following definitions are for status line prompts, messages, or
+#. * warnings issued by Lynx during program execution. You can modify
+#. * them to make them more appropriate for your site. We recommend that
+#. * you extend these definitions to other languages using the gettext
+#. * library. There are also scattered uses of 'gettext()' throughout the
+#. * Lynx source, covering all but those messages which (a) are used for
+#. * debugging (CTRACE) or (b) are constants used in interaction with
+#. * other programs.
+#. *
+#. * See ABOUT-NLS and po/readme for details and location of contributed
+#. * translations. When no translation is available, the English default is
+#. * used.
+#.
+#: LYMessages.c:28
+#, c-format
+msgid "Alert!: %s"
+msgstr "Averto!: %s"
+
+#: LYMessages.c:29
+msgid "Welcome"
+msgstr "Bonvenon"
+
+#: LYMessages.c:30
+msgid "Are you sure you want to quit?"
+msgstr "Ĉu vi certas, ke vi volas eliri?"
+
+#: LYMessages.c:32
+msgid "Really exit from Lynx?"
+msgstr "Ĉu efektive eliri el Lynx?"
+
+#: LYMessages.c:34
+msgid "Connection interrupted."
+msgstr "Konekto interrompita."
+
+#: LYMessages.c:35
+msgid "Data transfer interrupted."
+msgstr "Datumo-transigo interrompita."
+
+#: LYMessages.c:36
+msgid "Cancelled!!!"
+msgstr "Nuligita!"
+
+#: LYMessages.c:37
+msgid "Cancelling!"
+msgstr "Nuliganta!"
+
+#: LYMessages.c:38
+msgid "Excellent!!!"
+msgstr "Bonege!"
+
+#: LYMessages.c:39
+msgid "OK"
+msgstr "Bone"
+
+#: LYMessages.c:40
+msgid "Done!"
+msgstr "Finita!"
+
+#: LYMessages.c:41
+msgid "Bad request!"
+msgstr "FuÅan peton!"
+
+#: LYMessages.c:42
+msgid "previous"
+msgstr "antaÅ­a"
+
+#: LYMessages.c:43
+msgid "next screen"
+msgstr "sekva ekranpleno"
+
+# Ĉu komando al komputilo aŭ al uzanto?
+#: LYMessages.c:44
+msgid "HELP!"
+msgstr "Helpu al min!"
+
+#: LYMessages.c:45
+msgid ", help on "
+msgstr ", helpo pri "
+
+#. #define HELP
+#: LYMessages.c:47
+msgid "Commands: Use arrow keys to move, '?' for help, 'q' to quit, '<-' to go back."
+msgstr "Komandoj: Uzu la sagoklavojn por movi, '?' por la helpilo, 'q' por eliri, '<-' por retroiri."
+
+#. #define MOREHELP
+#: LYMessages.c:49
+msgid "-- press space for more, use arrow keys to move, '?' for help, 'q' to quit."
+msgstr "-- premu spacetklavon por la sekva ekranpleno, uzu sagoklavojn por movi, '?' por la helpilo, 'q' por eliri."
+
+#: LYMessages.c:50
+msgid "-- press space for next page --"
+msgstr "-- premu spacetklavon por la sekva ekranpleno --"
+
+#: LYMessages.c:51
+msgid "URL too long"
+msgstr "URL tro longas"
+
+#. Inactive input fields, messages used with -tna option - kw
+#. #define FORM_LINK_TEXT_ADV_MSG_INA
+#: LYMessages.c:57
+#, c-format
+msgid "(Textfield \"%s\"); Inactive. Press <return> to activate."
+msgstr "(Teksta kampo \"%s\") Neaktiva. Premu enen-klavon por aktivigi."
+
+#. #define FORM_LINK_TEXT_MESSAGE_INA
+#: LYMessages.c:59
+msgid "(Text entry field) Inactive. Press <return> to activate."
+msgstr "(Teksta kampo) Neaktiva. Premu enen-klavon por aktivigi."
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG_INA
+#: LYMessages.c:61
+#, c-format
+msgid "(Textarea \"%s\"); Inactive. Press <return> to activate."
+msgstr "(Tekstregiono \"%s\") Neaktiva. Premu enen-klavon por aktivigi."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_INA
+#: LYMessages.c:63
+msgid "(Textarea) Inactive. Press <return> to activate."
+msgstr "(Tekstregiono) Neaktiva. Premu enen-klavon por aktivigi."
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG_INA_E
+#: LYMessages.c:65
+#, c-format
+msgid "(Textarea \"%s\"); Inactive. Press <return> to activate (%s for editor)."
+msgstr "(Tekstregiono \"%s\") Neaktiva. Premu enen-klavon por aktivigi (%s por tekstoredaktilo)."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_INA_E
+#: LYMessages.c:67
+#, c-format
+msgid "(Textarea) Inactive. Press <return> to activate (%s for editor)."
+msgstr "(Tekstregiono) Neaktiva. Premu enen-klavon por aktivigi (%s por tekstoredaktilo)."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE_INA
+#: LYMessages.c:69
+msgid "(Form field) Inactive. Use <return> to edit."
+msgstr "(Formulara kampo) Neaktiva. Uzu enen-klavon por redakti."
+
+#. #define FORM_TEXT_SUBMIT_MESSAGE_INA_X
+#: LYMessages.c:71
+#, c-format
+msgid "(Form field) Inactive. Use <return> to edit (%s to submit with no cache)."
+msgstr "(Formulara kampo) Neaktiva. Uzu enen-klavon por redakti (%s por sendi ignorante la tenejon)."
+
+#. #define FORM_TEXT_RESUBMIT_MESSAGE_INA
+#: LYMessages.c:73
+msgid "(Form field) Inactive. Press <return> to edit, press <return> twice to submit."
+msgstr "(Formulara kampo) Neaktiva. Premu enen-klavon por redakti. Premu enen-klavon dufoje por sendi."
+
+#. #define FORM_TEXT_SUBMIT_MAILTO_MSG_INA
+#: LYMessages.c:75
+msgid "(mailto form field) Inactive. Press <return> to change."
+msgstr "(retpoÅta kampo) Neaktiva. Premu enen-klavon por ÅanÄi."
+
+#. #define FORM_LINK_PASSWORD_MESSAGE_INA
+#: LYMessages.c:77
+msgid "(Password entry field) Inactive. Press <return> to activate."
+msgstr "(Pasvorta kampo) Neaktiva. Premu enen-klavon por aktivigi."
+
+#. #define FORM_LINK_FILE_UNM_MSG
+#: LYMessages.c:80
+msgid "UNMODIFIABLE file entry field. Use UP or DOWN arrows or tab to move off."
+msgstr "NEÅœANÄœEBLA kampo. Uzu la supran aÅ­ malsupran sagoklavojn aÅ­ tabon por movi de Äi."
+
+#. #define FORM_LINK_FILE_MESSAGE
+#: LYMessages.c:82
+msgid "(File entry field) Enter filename. Use UP or DOWN arrows or tab to move off."
+msgstr "(Dosiera kampo) Enmetu dosiernomon. Uzu la supran aÅ­ malsupran sagoklavojn aÅ­ tabon por movi de Äi."
+
+#. #define FORM_LINK_TEXT_ADV_MSG
+#. #define FORM_LINK_TEXT_MESSAGE
+#: LYMessages.c:84 LYMessages.c:86
+#, c-format
+msgid "(Textfield \"%s\"); Enter text. Use UP or DOWN arrows or tab to move off."
+msgstr "(Teksta kampo \"%s\") Enmetu tekston. Uzu la supran aÅ­ malsupran sagoklavojn aÅ­ tabon por movi de Äi."
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG
+#: LYMessages.c:88
+#, c-format
+msgid "(Textarea \"%s\"); Enter text. Use UP/DOWN arrows or TAB to move off."
+msgstr "(Tekstregiono \"%s\") Enmetu tekston. Uzu la supran aÅ­ malsupran sagoklavojn aÅ­ tabon por movi de Äi."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE
+#: LYMessages.c:90
+msgid "(Textarea) Enter text. Use UP/DOWN arrows or TAB to move off."
+msgstr "(Tekstregiono) Enmetu tekston. Uzu la supran aÅ­ malsupran sagoklavojn aÅ­ tabon por movi de Äi."
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG_E
+#: LYMessages.c:92
+#, c-format
+msgid "(Textarea \"%s\"); Enter text. Use UP/DOWN arrows or TAB to move off (%s for editor)."
+msgstr "(Tekstregiono \"%s\") Enmetu tekston. Uzu la supran aÅ­ malsupran sagoklavojn aÅ­ tabon por movi de Äi (%s por tekstoredaktilo)."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_E
+#: LYMessages.c:94
+#, c-format
+msgid "(Textarea) Enter text. Use UP/DOWN arrows or TAB to move off (%s for editor)."
+msgstr "(Tekstregiono) Enmetu tekston. Uzu la supran aÅ­ malsupran sagoklavojn aÅ­ tabon por movi de Äi (%s por tekstoredaktilo)."
+
+#. #define FORM_LINK_TEXT_UNM_MSG
+#: LYMessages.c:96
+msgid "UNMODIFIABLE form text field. Use UP or DOWN arrows or tab to move off."
+msgstr "NEÅœANÄœEBLA teksta kampo. Uzu la supran aÅ­ malsupran sagoklavojn aÅ­ tabon por movi de Äi (%s por tekstoredaktilo)."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE
+#: LYMessages.c:98
+msgid "(Form field) Enter text. Use <return> to submit."
+msgstr "(Teksta kampo) Enmetu tekston. Uzu enen-klavon por sendi."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE_X
+#: LYMessages.c:100
+#, c-format
+msgid "(Form field) Enter text. Use <return> to submit (%s for no cache)."
+msgstr "(Formulara kampo) Enmetu tekston. Uzu enen-klavon por sendi (%s por neniu tenejo)."
+
+#. #define FORM_LINK_TEXT_RESUBMIT_MESSAGE
+#: LYMessages.c:102
+msgid "(Form field) Enter text. Use <return> to submit, arrows or tab to move off."
+msgstr "(Formulara kampo) Enmetu tekston. Uzu enen-klavon por sendi, sagoklavojn aÅ­ tabon por movi de Äi."
+
+#. #define FORM_LINK_TEXT_SUBMIT_UNM_MSG
+#: LYMessages.c:104
+msgid "UNMODIFIABLE form field. Use UP or DOWN arrows or tab to move off."
+msgstr "NEÅœANÄœEBLA formularia kampo. Uzu supran aÅ­ malsupran sagoklavojn por movi de Äi."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MAILTO_MSG
+#: LYMessages.c:106
+msgid "(mailto form field) Enter text. Use <return> to submit, arrows to move off."
+msgstr "(retpoÅta kampo) Enmetu tekston. Uzu enen-klavon por sendi, sagoklavojn por movi de Äi."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MAILTO_DIS_MSG
+#: LYMessages.c:108
+msgid "(mailto form field) Mail is disallowed so you cannot submit."
+msgstr "(retpoÅta kampo) RetpoÅto estas malaktiva. Vi ne rajtas sendi tion."
+
+#. #define FORM_LINK_PASSWORD_MESSAGE
+#: LYMessages.c:110
+msgid "(Password entry field) Enter text. Use UP or DOWN arrows or tab to move off."
+msgstr "(Pasvorta kampo) Enmetu tekston. Uzu supran aÅ­ malsupran sagoklavojn por movi de Äi."
+
+#. #define FORM_LINK_PASSWORD_UNM_MSG
+#: LYMessages.c:112
+msgid "UNMODIFIABLE form password. Use UP or DOWN arrows or tab to move off."
+msgstr "NEÅœANÄœEBLA pasvorto. Uzu supran aÅ­ malsupran sagoklavojn por movi de Äi."
+
+#. #define FORM_LINK_CHECKBOX_ADV_MSG
+#: LYMessages.c:114
+#, c-format
+msgid "(Checkbox \"%s\"); Use right-arrow or <return> to toggle."
+msgstr "(Markobutono \"%s\") Uzu la dekstran sagoklavon aÅ­ enen-klavon por inversigi."
+
+#. #define FORM_LINK_CHECKBOX_MESSAGE
+#: LYMessages.c:116
+msgid "(Checkbox Field) Use right-arrow or <return> to toggle."
+msgstr "(Markobutono) Uzu la dekstran sagoklavon aÅ­ enen-klavon por inversigi."
+
+#. #define FORM_LINK_CHECKBOX_UNM_MSG
+#: LYMessages.c:118
+msgid "UNMODIFIABLE form checkbox. Use UP or DOWN arrows or tab to move off."
+msgstr "NEÅœANÄœEBLA markobutono. Uzu supran aÅ­ malsupran sagoklavon aÅ­ tabon por movi de Äi."
+
+#. #define FORM_LINK_RADIO_ADV_MSG
+#: LYMessages.c:120
+#, c-format
+msgid "(Radio Button \"%s\"); Use right-arrow or <return> to toggle."
+msgstr "(Radiobutono \"%s\") Uzu la dekstran sagoklavon aÅ­ la enen-klavon por inversigi."
+
+#. #define FORM_LINK_RADIO_MESSAGE
+#: LYMessages.c:122
+msgid "(Radio Button) Use right-arrow or <return> to toggle."
+msgstr "(Radiobutono) Uzu la dekstran sagoklavon aÅ­ la enen-klavon por inversigi."
+
+#. #define FORM_LINK_RADIO_UNM_MSG
+#: LYMessages.c:124
+msgid "UNMODIFIABLE form radio button. Use UP or DOWN arrows or tab to move off."
+msgstr "NEÅœANÄœEBLA radiobutono. Uzu supran aÅ­ malsupran sagoklavojn por movi de Äi."
+
+#. #define FORM_LINK_SUBMIT_PREFIX
+#: LYMessages.c:126
+msgid "Submit ('x' for no cache) to "
+msgstr "Sendi ('x' por neniu konservado) al "
+
+#. #define FORM_LINK_RESUBMIT_PREFIX
+#: LYMessages.c:128
+msgid "Submit to "
+msgstr "Sendi al "
+
+#. #define FORM_LINK_SUBMIT_MESSAGE
+#: LYMessages.c:130
+msgid "(Form submit button) Use right-arrow or <return> to submit ('x' for no cache)."
+msgstr "(Sendobutono) Uzu la dekstran sagoklavon aÅ­ enen-klavon por sendi ('x' por neniu tenejo)."
+
+#. #define FORM_LINK_RESUBMIT_MESSAGE
+#: LYMessages.c:132
+msgid "(Form submit button) Use right-arrow or <return> to submit."
+msgstr "(Sendobutono) Uzu la dekstran sagoklavon aÅ­ enen-klavon por sendi."
+
+#. #define FORM_LINK_SUBMIT_DIS_MSG
+#: LYMessages.c:134
+msgid "DISABLED form submit button. Use UP or DOWN arrows or tab to move off."
+msgstr "MALAKTIVA sendobutono. Uzu supran aÅ­ malsupran sagoklavojn por movi de Äi."
+
+#. #define FORM_LINK_SUBMIT_MAILTO_PREFIX
+#: LYMessages.c:136
+msgid "Submit mailto form to "
+msgstr "Sendi retpoÅtan formularion al "
+
+#. #define FORM_LINK_SUBMIT_MAILTO_MSG
+#: LYMessages.c:138
+msgid "(mailto form submit button) Use right-arrow or <return> to submit."
+msgstr "(retpoÅta sendobutono) Uzu la dekstran sagoklavon aÅ­ enen-klavon por sendi."
+
+#. #define FORM_LINK_SUBMIT_MAILTO_DIS_MSG
+#: LYMessages.c:140
+msgid "(mailto form submit button) Mail is disallowed so you cannot submit."
+msgstr "(retpoÅta sendobutono) RetpoÅto estas malaktiva. Vi ne rajtas sendi tion."
+
+#. #define FORM_LINK_RESET_MESSAGE
+#: LYMessages.c:142
+msgid "(Form reset button) Use right-arrow or <return> to reset form to defaults."
+msgstr "(Restarigobutono) Uzu la dekstran sagoklavon aÅ­ enen-klavon por restarigi la kampojn."
+
+#. #define FORM_LINK_RESET_DIS_MSG
+#: LYMessages.c:144
+msgid "DISABLED form reset button. Use UP or DOWN arrows or tab to move off."
+msgstr "MALAKTIVA restarigobutono. Uzu supran aÅ­ malsupran sagoklavojn aÅ­ tabon por movi de Äi."
+
+#. #define FORM_LINK_BUTTON_MESSAGE
+#: LYMessages.c:146
+msgid "(Script button) Use UP or DOWN arrows or tab to move off."
+msgstr "(Skriptobutono) Uzu supran aÅ­ malsupran sagoklavojn aÅ­ tabon por movi de Äi."
+
+#. #define FORM_LINK_BUTTON_ADV_MSG
+#: LYMessages.c:148
+#, c-format
+msgid "(Script button \"%s\"); Use UP or DOWN arrows or tab to move off."
+msgstr "(Skriptobutono \"%s\") Uzu supran aÅ­ malsupran sagoklavojn aÅ­ tabon por movi de Äi."
+
+#. #define FORM_LINK_BUTTON_DIS_MSG
+#: LYMessages.c:150
+msgid "DISABLED Script button. Use UP or DOWN arrows or tab to move off."
+msgstr "MALAKTIVA skriptobutono. Uzu supran aÅ­ malsupran sagoklavojn aÅ­ tabon por movi de Äi."
+
+#. #define FORM_LINK_OPTION_LIST_ADV_MSG
+#: LYMessages.c:152
+#, c-format
+msgid "(Option list \"%s\"); Hit return to select option."
+msgstr "(Elekto-list \"%s\") Premu enen-klavon por elekti."
+
+#. #define FORM_LINK_OPTION_LIST_MESSAGE
+#: LYMessages.c:154
+msgid "(Option list) Hit return and use arrow keys and return to select option."
+msgstr "(Elekto-listo) Premu enen-klavon kaj uzu sagoklavojn kaj enen-klavon por elekti."
+
+#. #define CHOICE_LIST_ADV_MSG
+#: LYMessages.c:156
+#, c-format
+msgid "(Choice entry \"%s\"); Use arrow keys and return to select option."
+msgstr "(Elekto-listero \"%s\") Premu enen-klavon kaj uzu sagoklavojn kaj enen-klavon por elekti."
+
+#. #define CHOICE_LIST_MESSAGE
+#: LYMessages.c:158
+msgid "(Choice list) Hit return and use arrow keys and return to select option."
+msgstr "(Elekto-listo) Premu enen-klavon kaj uzu sagoklavojn kaj enen-klavon por elekti."
+
+#. #define MOUSE_CHOICE_MESSAGE
+#: LYMessages.c:160
+msgid "Left mouse button or return to select, arrow keys to scroll."
+msgstr "Maldekstra musbutono aÅ­ enen-klavo por elekti, sagoklavoj por rulumi."
+
+#. #define FORM_LINK_OPTION_LIST_UNM_MSG
+#: LYMessages.c:162
+msgid "UNMODIFIABLE option list. Use return or arrow keys to review or leave."
+msgstr "NEÅœANÄœEBLA elekto-listo. Uzu la enen-klavon aÅ­ sagoklavoj por kontroli aÅ­ forlasi."
+
+#. #define CHOICE_LIST_UNM_MSG
+#: LYMessages.c:164
+msgid "UNMODIFIABLE choice list. Use return or arrow keys to review or leave."
+msgstr "NEÅœANÄœEBLA elekto-listo. Uzu la enen-klavon aÅ­ sagoklavoj por kontroli aÅ­ foriri."
+
+#: LYMessages.c:165
+msgid "Submitting form..."
+msgstr "Sendante formularion..."
+
+#: LYMessages.c:166
+msgid "Resetting form..."
+msgstr "Restarigante formularion..."
+
+#. #define RELOADING_FORM
+#: LYMessages.c:168
+msgid "Reloading document. Any form entries will be lost!"
+msgstr "ReÅarganta dokumenton. Ĉiuj kampoj estos forviÅitaj!"
+
+#. #define LINK_NOT_IN_FORM
+#: LYMessages.c:170
+msgid "The current link is not in a FORM"
+msgstr "La nuna ligilo ne estas en formulario"
+
+#: LYMessages.c:171
+#, c-format
+msgid "Warning: Cannot transcode form data to charset %s!"
+msgstr "Averto: Ne eblas ÅanÄi la kodoprezenton de la formulario al %s!"
+
+#. #define NORMAL_LINK_MESSAGE
+#: LYMessages.c:174
+msgid "(NORMAL LINK) Use right-arrow or <return> to activate."
+msgstr "(Ordinara ligilo) Uzu la dekstran sagoklavon aÅ­ la enen-klavon por aktivigi."
+
+#: LYMessages.c:175
+msgid "The resource requested is not available at this time."
+msgstr "La risurco petita ne estas nune disponebla."
+
+#: LYMessages.c:176
+msgid "Enter Lynx keystroke command: "
+msgstr "Enmetu Lynx-klavan komandon:"
+
+#: LYMessages.c:177
+msgid "Looking up "
+msgstr "Serĉanta je "
+
+#: LYMessages.c:178
+#, c-format
+msgid "Getting %s"
+msgstr "Ricevanta je %s"
+
+#: LYMessages.c:179
+#, c-format
+msgid "Skipping %s"
+msgstr "Preterlasanta je %s"
+
+#: LYMessages.c:180
+#, c-format
+msgid "Using %s"
+msgstr "Uzanta je %s"
+
+#: LYMessages.c:181
+#, c-format
+msgid "Illegal URL: %s"
+msgstr "Nevalida URL: %s"
+
+#: LYMessages.c:182
+#, c-format
+msgid "Badly formed address %s"
+msgstr "Adreso %s havas fuÅan formon"
+
+#: LYMessages.c:183
+#, c-format
+msgid "URL: %s"
+msgstr "URL: %s"
+
+#: LYMessages.c:184
+msgid "Unable to access WWW file!!!"
+msgstr "Ne eblas atingi TTT-dosieron!"
+
+#: LYMessages.c:185
+#, c-format
+msgid "This is a searchable index. Use %s to search."
+msgstr "Ĉi tio estas serĉebla indekso. Uzu la klavon %s por serĉi."
+
+#. #define WWW_INDEX_MORE_MESSAGE
+#: LYMessages.c:187
+#, c-format
+msgid "--More-- This is a searchable index. Use %s to search."
+msgstr "--Plu-- Ĉi tio estas serĉebla indekso. Uzu la klavon %s por serĉi."
+
+#: LYMessages.c:188
+msgid "You have entered an invalid link number."
+msgstr "Vi enmetis nevalidan ligilan numeron."
+
+#. #define SOURCE_HELP
+#: LYMessages.c:190
+msgid "Currently viewing document source. Press '\\' to return to rendered version."
+msgstr "Nune vidatan dokumentan fontotekston. Premu la klavon '\\' por reveni al interpretita versio."
+
+#. #define NOVICE_LINE_ONE
+#: LYMessages.c:192
+msgid " Arrow keys: Up and Down to move. Right to follow a link; Left to go back. \n"
+msgstr "Sagoklavoj: Supra kaj malsupra por movi. Dekstra por sekvi ligilon. Maldekstra por retroiri.\n"
+
+#. #define NOVICE_LINE_TWO
+#: LYMessages.c:194
+msgid " H)elp O)ptions P)rint G)o M)ain screen Q)uit /=search [delete]=history list \n"
+msgstr "H)elpo O) Agordo P)rinti G) Iri M) Ĉefa fako Q) Eliri /=serĉi [retropaÅo]=historio \n"
+
+#. #define NOVICE_LINE_TWO_A
+#: LYMessages.c:196
+msgid " O)ther cmds H)elp K)eymap G)oto P)rint M)ain screen o)ptions Q)uit \n"
+msgstr "O) Aliaj komandoj H)elpo K)lavomapo G) Ŝalti P)rinti M) Ĉefa fako O) Agordaĵoj Q) Eliri \n"
+
+#. #define NOVICE_LINE_TWO_B
+#: LYMessages.c:198
+msgid " O)ther cmds B)ack E)dit D)ownload ^R)eload ^W)ipe screen search doc: / \n"
+msgstr " O) Aliaj komandoj B) RetropaÅi E) Redakti D) ElÅuti ^R)eÅargi ^W) ForviÅi ekranon serĉi en dokumento: / \n"
+
+#. #define NOVICE_LINE_TWO_C
+#: LYMessages.c:200
+msgid "O)ther cmds C)omment History: <backspace> Bookmarks: V)iew, A)dd, R)emove \n"
+msgstr "O) Aliaj komandoj C) Komenti Historio: <RetropaÅo> Legosignoj: V)idi, A)ldoni, R) Forigi \n"
+
+#. #define FORM_NOVICELINE_ONE
+#: LYMessages.c:202
+msgid " Enter text into the field by typing on the keyboard "
+msgstr " Enmetu tekston en la kampon per tajpado en la klavaro "
+
+#. #define FORM_NOVICELINE_TWO
+#: LYMessages.c:204
+msgid " Ctrl-U to delete all text in field, [Backspace] to delete a character "
+msgstr " ^U por forviÅi la kampon, [RetropaÅo] por forigi signon "
+
+#. #define FORM_NOVICELINE_TWO_DELBL
+#: LYMessages.c:206
+msgid " Ctrl-U to delete text in field, [Backspace] to delete a character "
+msgstr " ^U por forviÅi la kampon, [RetropaÅo] por forigi signon "
+
+#. #define FORM_NOVICELINE_TWO_VAR
+#: LYMessages.c:208
+#, c-format
+msgid " %s to delete all text in field, [Backspace] to delete a character "
+msgstr " %s por forviÅi la kampon, [RetropaÅo] por forigi signon "
+
+#. #define FORM_NOVICELINE_TWO_DELBL_VAR
+#: LYMessages.c:210
+#, c-format
+msgid " %s to delete text in field, [Backspace] to delete a character "
+msgstr " %s por forviÅi la kampon, [RetropaÅo] por forigi signon "
+
+#. mailto
+#: LYMessages.c:213
+msgid "Malformed mailto form submission! Cancelled!"
+msgstr "Misformita retpoÅta sendaĵo! Nuligita!"
+
+#: LYMessages.c:214
+msgid "Warning! Control codes in mail address replaced by ?"
+msgstr "Averto! Stirkodoj en retpoÅtadreso anstataÅ­iÄintaj per '?'"
+
+#: LYMessages.c:215
+msgid "Mail disallowed! Cannot submit."
+msgstr "RetpoÅto malpermesita! Ne eblas sendi."
+
+#: LYMessages.c:216
+msgid "Mailto form submission failed!"
+msgstr "RetpoÅta sendado malsukcesis!"
+
+#: LYMessages.c:217
+msgid "Mailto form submission Cancelled!!!"
+msgstr "RetpoÅta sendado nuligita!"
+
+#: LYMessages.c:218
+msgid "Sending form content..."
+msgstr "Sendante formularian enhavon..."
+
+#: LYMessages.c:219
+msgid "No email address is present in mailto URL!"
+msgstr "Neniu retpoÅtadreso ekzistas en la URL!"
+
+#. #define MAILTO_URL_TEMPOPEN_FAILED
+#: LYMessages.c:221
+msgid "Unable to open temporary file for mailto URL!"
+msgstr "Ne eblas malfermi provizoran dosieron por URL-on!"
+
+#. #define INC_ORIG_MSG_PROMPT
+#: LYMessages.c:223
+msgid "Do you wish to include the original message?"
+msgstr "Ĉu vi volas inkluzivi la fontan mesaÄon?"
+
+#. #define INC_PREPARSED_MSG_PROMPT
+#: LYMessages.c:225
+msgid "Do you wish to include the preparsed source?"
+msgstr "Ĉu vi volas inkluzivi la interpretitan fontotekston?"
+
+#. #define SPAWNING_EDITOR_FOR_MAIL
+#: LYMessages.c:227
+msgid "Spawning your selected editor to edit mail message"
+msgstr "Plenumiganta vian tekstoredaktilon por redakti retleteron"
+
+#. #define ERROR_SPAWNING_EDITOR
+#: LYMessages.c:229
+msgid "Error spawning editor, check your editor definition in the options menu"
+msgstr "Eraro dum plenumigi tekstoredaktilon. Kontrolu viajn agordaĵojn"
+
+#: LYMessages.c:230
+msgid "Send this comment?"
+msgstr "Ĉu sendi la komenton?"
+
+#: LYMessages.c:231
+msgid "Send this message?"
+msgstr "Ĉu sendi la mesaÄon?"
+
+#: LYMessages.c:232
+msgid "Sending your message..."
+msgstr "Sendante vian mesaÄon..."
+
+#: LYMessages.c:233
+msgid "Sending your comment:"
+msgstr "Sendante vian komenton:"
+
+#. textarea
+#: LYMessages.c:236
+msgid "Not in a TEXTAREA; cannot use external editor."
+msgstr "Ne en TEKSTREGIONO; ne eblas uzi eksteran tekstoredaktilon."
+
+#: LYMessages.c:237
+msgid "Not in a TEXTAREA; cannot use command."
+msgstr "Ne en TEKSTREGIONO; ne eblas uzi komandon."
+
+#: LYMessages.c:239
+msgid "file: ACTIONs are disallowed!"
+msgstr "Agoj ĉe lokaj dosieroj estas malpermesitaj!"
+
+#. #define FILE_SERVED_LINKS_DISALLOWED
+#: LYMessages.c:241
+msgid "file: URLs via served links are disallowed!"
+msgstr "Lokaj servintaj ligiloj estas malpermesitaj!"
+
+#: LYMessages.c:242
+msgid "Access to local files denied."
+msgstr "Atingo de lokaj dosieroj rifuzita."
+
+#: LYMessages.c:243
+msgid "file: URLs via bookmarks are disallowed!"
+msgstr "Lokaj dokumentoj en legosignoj estas malpermesitaj!"
+
+#. #define SPECIAL_VIA_EXTERNAL_DISALLOWED
+#: LYMessages.c:245
+msgid "This special URL is not allowed in external documents!"
+msgstr "Ĉi tiu speciala URL ne estas permesita en eksteraj dokumentoj!"
+
+#: LYMessages.c:246
+msgid "Press <return> to return to Lynx."
+msgstr "Premu enen-klavon por reiri al Lynx."
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:249
+msgid "Spawning DCL subprocess. Use 'logout' to return to Lynx.\n"
+msgstr "Kreante DCL-subprocezon. Uzu la komandon 'logout' por reiri al Lynx.\n"
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:253
+msgid "Type EXIT to return to Lynx.\n"
+msgstr "Tajpu la vorton EXIT por reiri al Lynx.\n"
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:256
+msgid "Spawning your default shell. Use 'exit' to return to Lynx.\n"
+msgstr "Kreante vian aprioran Åelon. Tajpu la vorton 'exit' por reiri al Lynx.\n"
+
+#: LYMessages.c:259
+msgid "Spawning is currently disabled."
+msgstr "Krei procezoj ne estas permesitaj."
+
+#: LYMessages.c:260
+msgid "The 'd'ownload command is currently disabled."
+msgstr "ElÅuti per la komando 'd' nune estas malaktivigita."
+
+#: LYMessages.c:261
+msgid "You cannot download an input field."
+msgstr "Vi ne rajtas elÅuti tekstan kampon."
+
+#: LYMessages.c:262
+msgid "Form has a mailto action! Cannot download."
+msgstr "Formularo havas retpoÅtan agon! Ne eblas elÅuti."
+
+#: LYMessages.c:263
+msgid "You cannot download a mailto: link."
+msgstr "vi ne eblas elÅuti retpoÅtan ligilon."
+
+#: LYMessages.c:264
+msgid "You cannot download cookies."
+msgstr "Vi ne rajtas elÅuti kuketojn."
+
+#: LYMessages.c:265
+msgid "You cannot download a printing option."
+msgstr "Vi ne rajtas elÅuti printan elekton."
+
+#: LYMessages.c:266
+msgid "You cannot download an upload option."
+msgstr "Vi ne rajtas elÅuti alÅutan elekton."
+
+#: LYMessages.c:267
+msgid "You cannot download an permit option."
+msgstr "Vi ne rajtas elÅuti permesan elekton."
+
+#: LYMessages.c:268
+msgid "This special URL cannot be downloaded!"
+msgstr "Ĉi tia speciala URL ne estas elÅutebla!"
+
+#: LYMessages.c:269
+msgid "Nothing to download."
+msgstr "Neniu por elÅuti."
+
+#: LYMessages.c:270
+msgid "Trace ON!"
+msgstr "Spurado ÅœALTITA!"
+
+#: LYMessages.c:271
+msgid "Trace OFF!"
+msgstr "Spurado MALÅœALTITA!"
+
+#. #define CLICKABLE_IMAGES_ON
+#: LYMessages.c:273
+msgid "Links will be included for all images! Reloading..."
+msgstr "LIGILOJ estos inkluzivitaj por ĉiuj bildoj! ReÅarganta..."
+
+#. #define CLICKABLE_IMAGES_OFF
+#: LYMessages.c:275
+msgid "Standard image handling restored! Reloading..."
+msgstr "Kutima bildo-traktado restarigita! ReÅarganta..."
+
+#. #define PSEUDO_INLINE_ALTS_ON
+#: LYMessages.c:277
+msgid "Pseudo_ALTs will be inserted for inlines without ALT strings! Reloading..."
+msgstr "Afabla anstataÅ­ teksto por bildoj estas enmetita kiam necesa! ReÅarganta..."
+
+#. #define PSEUDO_INLINE_ALTS_OFF
+#: LYMessages.c:279
+msgid "Inlines without an ALT string specified will be ignored! Reloading..."
+msgstr "Bildoj kiam anstataÅ­a teksto estos ignoritaj! ReÅarganta..."
+
+#: LYMessages.c:280
+msgid "Raw 8-bit or CJK mode toggled OFF! Reloading..."
+msgstr "Kruda 8-bita aÅ­ ĈJK-a reÄimo MALÅœALTITA. ReÅarganta..."
+
+#: LYMessages.c:281
+msgid "Raw 8-bit or CJK mode toggled ON! Reloading..."
+msgstr "Kruda 8-bita aÅ­ ĈJK-a reÄimo ÅœALTITA. ReÅarganta..."
+
+#. #define HEAD_D_L_OR_CANCEL
+#: LYMessages.c:283
+msgid "Send HEAD request for D)ocument or L)ink, or C)ancel? (d,l,c): "
+msgstr "Sendi kapo-peton por D)okumento aÅ­ L)igilo, aÅ­ C) Nuligi? (d,l,c): "
+
+#. #define HEAD_D_OR_CANCEL
+#: LYMessages.c:285
+msgid "Send HEAD request for D)ocument, or C)ancel? (d,c): "
+msgstr "Sendi kapo-peton por D)okumento, aÅ­ C) Nuligi? (d,c): "
+
+#: LYMessages.c:286
+msgid "Sorry, the document is not an http URL."
+msgstr "BedaÅ­rinde la URL ne estas HTTP-a."
+
+#: LYMessages.c:287
+msgid "Sorry, the link is not an http URL."
+msgstr "BedaÅ­rinde la ligilo ne estas HTTP-a."
+
+#: LYMessages.c:288
+msgid "Sorry, the ACTION for this form is disabled."
+msgstr "BedaÅ­rinde la AGO de la formulario estas malaktivigita."
+
+#. #define FORM_ACTION_NOT_HTTP_URL
+#: LYMessages.c:290
+msgid "Sorry, the ACTION for this form is not an http URL."
+msgstr "BedaÅ­rinde la AGO por la formulario ne estas HTTP-URL."
+
+#: LYMessages.c:291
+msgid "Not an http URL or form ACTION!"
+msgstr "Ne estas HTTP-URL aÅ­ formularia AGO!"
+
+#: LYMessages.c:292
+msgid "This special URL cannot be a form ACTION!"
+msgstr "Ĉi tia speciala URL ne eblas esti formularia AGO!"
+
+#: LYMessages.c:293
+msgid "URL is not in starting realm!"
+msgstr "URL ne estas en komenca regno!"
+
+#: LYMessages.c:294
+msgid "News posting is disabled!"
+msgstr "Ne eblas afiÅi al novaĵgrupoj"
+
+#: LYMessages.c:295
+msgid "File management support is disabled!"
+msgstr "Dosieradministrada regado estas malaktivigita!"
+
+#: LYMessages.c:296
+msgid "No jump file is currently available."
+msgstr "Neniu saltodosiero estas nune disponebla."
+
+#: LYMessages.c:297
+msgid "Jump to (use '?' for list): "
+msgstr "Salti al (uzu la klavon '?' por listo): "
+
+#: LYMessages.c:298
+msgid "Jumping to a shortcut URL is disallowed!"
+msgstr "Salti al mallonga URL estas malpermesita!"
+
+#: LYMessages.c:299
+msgid "Random URL is disallowed! Use a shortcut."
+msgstr "Hazarda URL estas malpermesita. Uzi mallongigo."
+
+#: LYMessages.c:300
+msgid "No random URLs have been used thus far."
+msgstr "AnkoraÅ­ neniuj hazardaj URL-oj estas uzitaj."
+
+#: LYMessages.c:301
+msgid "Bookmark features are currently disabled."
+msgstr "Legosignaj trajtoj nune estas malaktivigitaj."
+
+#: LYMessages.c:302
+msgid "Execution via bookmarks is disabled."
+msgstr "Plenumo per legosignoj estas malaktivigita."
+
+#. #define BOOKMARK_FILE_NOT_DEFINED
+#: LYMessages.c:304
+#, c-format
+msgid "Bookmark file is not defined. Use %s to see options."
+msgstr "Legosigna dosiero ne estas difinita. Uzu la klavon %s por vidi agordaĵojn."
+
+#. #define NO_TEMP_FOR_HOTLIST
+#: LYMessages.c:306
+msgid "Unable to open tempfile for X Mosaic hotlist conversion."
+msgstr "Ne eblas malfermi provizoran dosieron por konvertado de X-Mosaic legosignojn."
+
+#: LYMessages.c:307
+msgid "ERROR - unable to open bookmark file."
+msgstr "ERARO - ne eblas malfermi legosignan dosieron."
+
+#. #define BOOKMARK_OPEN_FAILED_FOR_DEL
+#: LYMessages.c:309
+msgid "Unable to open bookmark file for deletion of link."
+msgstr "Ne eblas malfermi legosignan dosieron por forigi de ligilo."
+
+#. #define BOOKSCRA_OPEN_FAILED_FOR_DEL
+#: LYMessages.c:311
+msgid "Unable to open scratch file for deletion of link."
+msgstr "Ne eblas malfermi provizoran dosieron por forigi ligilon."
+
+#: LYMessages.c:313
+msgid "Error renaming scratch file."
+msgstr "Eraro alinomanta provizoran dosieron."
+
+#: LYMessages.c:315
+msgid "Error renaming temporary file."
+msgstr "Eraro alinomanta provizoran dosieron."
+
+#. #define BOOKTEMP_COPY_FAIL
+#: LYMessages.c:317
+msgid "Unable to copy temporary file for deletion of link."
+msgstr "Ne eblas kopii provizoran dosieron por forigi ligilon."
+
+#. #define BOOKTEMP_REOPEN_FAIL_FOR_DEL
+#: LYMessages.c:319
+msgid "Unable to reopen temporary file for deletion of link."
+msgstr "Ne eblas remalfermi provizoran dosieron por forigi ligilon."
+
+#. #define BOOKMARK_LINK_NOT_ONE_LINE
+#: LYMessages.c:322
+msgid "Link is not by itself all on one line in bookmark file."
+msgstr "Ligilo ne estas sola en unuopa linio en legosigna dosiero."
+
+#: LYMessages.c:323
+msgid "Bookmark deletion failed."
+msgstr "Legosigna forigo malsukcesis"
+
+#. #define BOOKMARKS_NOT_TRAVERSED
+#: LYMessages.c:325
+msgid "Bookmark files cannot be traversed (only http URLs)."
+msgstr "Legosignaj dosieroj ne eblas esti travenitaj (nur HTTP-adresoj)."
+
+#. #define BOOKMARKS_NOT_OPEN
+#: LYMessages.c:327
+msgid "Unable to open bookmark file, use 'a' to save a link first"
+msgstr "Ne eblas malfermi legosignan dosieron. Uzu la klavon 'a' por konservi ligilon."
+
+#: LYMessages.c:328
+msgid "There are no links in this bookmark file!"
+msgstr "Ne ekzistas ligiloj en ĉi tiu legosigna dosiero!"
+
+#. #define CACHE_D_OR_CANCEL
+#: LYMessages.c:330
+msgid "D)elete cached document or C)ancel? (d,c): "
+msgstr "D)okumunton en la tenejo forigu aÅ­ C) Nuligi? (d,c)"
+
+#. #define BOOK_D_L_OR_CANCEL
+#: LYMessages.c:332
+msgid "Save D)ocument or L)ink to bookmark file or C)ancel? (d,l,c): "
+msgstr "Konservi D)okumenton aÅ­ L)igilon al legosigna dosiero aÅ­ C) Nuligi? (d, l, c): "
+
+#: LYMessages.c:333
+msgid "Save D)ocument to bookmark file or C)ancel? (d,c): "
+msgstr "Konservi D)okumenton al legosignan dosiero aÅ­ C) Nuligi? (d,c)"
+
+#: LYMessages.c:334
+msgid "Save L)ink to bookmark file or C)ancel? (l,c): "
+msgstr "Konservi L)igilon al legosigna dosiero aÅ­ C) Nuligi? (l,c)"
+
+#. #define NOBOOK_POST_FORM
+#: LYMessages.c:336
+msgid "Documents from forms with POST content cannot be saved as bookmarks."
+msgstr "Dokumentoj de formularioj kun kaÅita enhavo ne eblas esti konservitaj kiel legosignoj."
+
+#: LYMessages.c:337
+msgid "Cannot save form fields/links"
+msgstr "Ne eblas konservi formulariajn kampojn/ligilojn"
+
+#. #define NOBOOK_HSML
+#: LYMessages.c:339
+msgid "History, showinfo, menu and list files cannot be saved as bookmarks."
+msgstr "Historio, informoj, menuo kaj listoj ne eblas estis konservitaj kiel legosignoj."
+
+#. #define CONFIRM_BOOKMARK_DELETE
+#: LYMessages.c:341
+msgid "Do you really want to delete this link from your bookmark file?"
+msgstr "Ĉu vi efektive volas forigi ĉi tiun ligilon de via legosigna dosiero?"
+
+#: LYMessages.c:342
+msgid "Malformed address."
+msgstr "Malbone formita URL."
+
+#. #define HISTORICAL_ON_MINIMAL_OFF
+#: LYMessages.c:344
+msgid "Historical comment parsing ON (Minimal is overridden)!"
+msgstr "Historia komento-interpretado ÅœALTITA (Minimuma estas malaktiva)!"
+
+#. #define HISTORICAL_OFF_MINIMAL_ON
+#: LYMessages.c:346
+msgid "Historical comment parsing OFF (Minimal is in effect)!"
+msgstr "Historia komento-interpretado MALÅœALTITA (Minimuma estas aktiva)!"
+
+#. #define HISTORICAL_ON_VALID_OFF
+#: LYMessages.c:348
+msgid "Historical comment parsing ON (Valid is overridden)!"
+msgstr "Historia komento-interpretado ÅœALTITA (Valida estas malaktiva)!"
+
+#. #define HISTORICAL_OFF_VALID_ON
+#: LYMessages.c:350
+msgid "Historical comment parsing OFF (Valid is in effect)!"
+msgstr "Historia komento-interpretado MALÅœALTITA (Valida estas aktiva)!"
+
+#. #define MINIMAL_ON_IN_EFFECT
+#: LYMessages.c:352
+msgid "Minimal comment parsing ON (and in effect)!"
+msgstr "Minimuma komento-interpretado ÅœALTITA (kaj aktiva)!"
+
+#. #define MINIMAL_OFF_VALID_ON
+#: LYMessages.c:354
+msgid "Minimal comment parsing OFF (Valid is in effect)!"
+msgstr "Minimuma komento-interpretado MALÅœALTITA (Valida estas aktiva)!"
+
+#. #define MINIMAL_ON_BUT_HISTORICAL
+#: LYMessages.c:356
+msgid "Minimal comment parsing ON (but Historical is in effect)!"
+msgstr "Minimuma komento-interpretado ÅœALTITA (sed Historia estas aktiva)!"
+
+#. #define MINIMAL_OFF_HISTORICAL_ON
+#: LYMessages.c:358
+msgid "Minimal comment parsing OFF (Historical is in effect)!"
+msgstr "Minimuma komento-interpretado MALÅœALTITA (Historia estas aktiva)!"
+
+#: LYMessages.c:359
+msgid "Soft double-quote parsing ON!"
+msgstr "Molaj citiloj ÅœALTITA!"
+
+#: LYMessages.c:360
+msgid "Soft double-quote parsing OFF!"
+msgstr "Molaj citiloj MALÅœALTITA!"
+
+#: LYMessages.c:361
+msgid "Now using TagSoup parsing of HTML."
+msgstr "Uzanta malseveran interpretadon de HTML."
+
+#: LYMessages.c:362
+msgid "Now using SortaSGML parsing of HTML!"
+msgstr "Uzanta severan interpretadon de HTML."
+
+#: LYMessages.c:363
+msgid "You are already at the end of this document."
+msgstr "Vi jam estas je la fino de ĉi tiu dokumento."
+
+#: LYMessages.c:364
+msgid "You are already at the beginning of this document."
+msgstr "Vi jam estas je la komenco de ĉi tiu dokumento."
+
+#: LYMessages.c:365
+#, c-format
+msgid "You are already at page %d of this document."
+msgstr "Vi jam estas ĉe ekranpleno %d de ĉi tiu dokumento."
+
+#: LYMessages.c:366
+#, c-format
+msgid "Link number %d already is current."
+msgstr "Ligila numero %d jam estas nuna."
+
+#: LYMessages.c:367
+msgid "You are already at the first document"
+msgstr "Vi jam estas je la unua dokumento"
+
+#: LYMessages.c:368
+msgid "There are no links above this line of the document."
+msgstr "Ne estas ligiloj supra al ĉi tiu linio de la dokumento."
+
+#: LYMessages.c:369
+msgid "There are no links below this line of the document."
+msgstr "Ne estas ligiloj sube de ĉi tiu linio de la dokumento."
+
+#. #define MAXLEN_REACHED_DEL_OR_MOV
+#: LYMessages.c:371
+msgid "Maximum length reached! Delete text or move off field."
+msgstr "Maksimuma longo atingita. Forigi tekston aÅ­ movi de Äi."
+
+#. #define NOT_ON_SUBMIT_OR_LINK
+#: LYMessages.c:373
+msgid "You are not on a form submission button or normal link."
+msgstr "Vi ne estas en formularia sendobutono aÅ­ ordinara ligilo."
+
+#. #define NEED_CHECKED_RADIO_BUTTON
+#: LYMessages.c:375
+msgid "One radio button must be checked at all times!"
+msgstr "Unu radiobutono ĉiam devas markita!"
+
+#: LYMessages.c:376
+msgid "No submit button for this form, submit single text field?"
+msgstr "Neniu sendobutono por la formulario, ĉu sendi unuopan tekstan kampon?"
+
+#: LYMessages.c:377
+msgid "Do you want to go back to the previous document?"
+msgstr "Ĉu vi volas retroiri?"
+
+#: LYMessages.c:378
+msgid "Use arrows or tab to move off of field."
+msgstr "Uzu sagoklavojn aÅ­ tabon por movi de la kampon."
+
+#. #define ENTER_TEXT_ARROWS_OR_TAB
+#: LYMessages.c:380
+msgid "Enter text. Use arrows or tab to move off of field."
+msgstr "Enmetu tekston. Uzu sagoklavojn aÅ­ tabon por movi de la kampo."
+
+#: LYMessages.c:381
+msgid "** Bad HTML!! No form action defined. **"
+msgstr "** FuÅa HTML! Neniu formularia ago difinita. **"
+
+#: LYMessages.c:382
+msgid "Bad HTML!! Unable to create popup window!"
+msgstr "FuÅa HTML! Ne eblas krei Åprucaĵon."
+
+#: LYMessages.c:383
+msgid "Unable to create popup window!"
+msgstr "Ne eblas krei Åprucaĵon."
+
+#: LYMessages.c:384
+msgid "Goto a random URL is disallowed!"
+msgstr "Salti hazardan URL-on estas malpermesitaj!"
+
+#: LYMessages.c:385
+msgid "Goto a non-http URL is disallowed!"
+msgstr "Salti tian URL-on estas malpermesite."
+
+#: LYMessages.c:386
+#, c-format
+msgid "You are not allowed to goto \"%s\" URLs"
+msgstr "Vi ne rajtas iri al URL-oj de \"%s\""
+
+#: LYMessages.c:387
+msgid "URL to open: "
+msgstr "Ironta URL: "
+
+#: LYMessages.c:388
+msgid "Edit the current Goto URL: "
+msgstr "Redakti la nunan URL-on: "
+
+#: LYMessages.c:389
+msgid "Edit the previous Goto URL: "
+msgstr "Redakti la antaÅ­an irintan URL-on: "
+
+#: LYMessages.c:390
+msgid "Edit a previous Goto URL: "
+msgstr "Redakti antaÅ­an irintan URL-on: "
+
+#: LYMessages.c:391
+msgid "Current document has POST data."
+msgstr "Nuna dokumento havas kaÅitajn datumojn."
+
+#: LYMessages.c:392
+msgid "Edit this document's URL: "
+msgstr "ÅœanÄi la nunan URL-on: "
+
+#: LYMessages.c:393
+msgid "Edit the current link's URL: "
+msgstr "Redakti la URL-on de la nuna ligilo: "
+
+#: LYMessages.c:394
+msgid "Edit the form's submit-URL: "
+msgstr "ÅœanÄi la sendo-URL-on de la formulario: "
+
+#: LYMessages.c:395
+msgid "You cannot edit File Management URLs"
+msgstr "Vi ne rajtas redakti dosieradministradajn URL-ojn"
+
+#: LYMessages.c:396
+msgid "Enter a database query: "
+msgstr "Enmetu datumbazan mendon: "
+
+#: LYMessages.c:397
+msgid "Enter a whereis query: "
+msgstr "Serĉi en la vidata dokumento: "
+
+#: LYMessages.c:398
+msgid "Edit the current query: "
+msgstr "Redakti la nunan mendon:"
+
+#: LYMessages.c:399
+msgid "Edit the previous query: "
+msgstr "Redakti la antaÅ­an mendon: "
+
+#: LYMessages.c:400
+msgid "Edit a previous query: "
+msgstr "Redakti antaÅ­an mendon: "
+
+#. #define USE_C_R_TO_RESUB_CUR_QUERY
+#: LYMessages.c:402
+msgid "Use Control-R to resubmit the current query."
+msgstr "^R por resendi la nunan mendon."
+
+#: LYMessages.c:403
+msgid "Edit the current shortcut: "
+msgstr "Redakti la nunan mallongigon: "
+
+#: LYMessages.c:404
+msgid "Edit the previous shortcut: "
+msgstr "Redakti la antaÅ­an mallongigon: "
+
+#: LYMessages.c:405
+msgid "Edit a previous shortcut: "
+msgstr "Redakti antaÅ­an mallongigon: "
+
+#: LYMessages.c:406
+#, c-format
+msgid "Key '%c' is not mapped to a jump file!"
+msgstr "Klavo '%c' ne estas agordita al saltodosiero!"
+
+#: LYMessages.c:407
+msgid "Cannot locate jump file!"
+msgstr "Ne eblas loki saltodosieron!"
+
+#: LYMessages.c:408
+msgid "Cannot open jump file!"
+msgstr "Ne eblas malfermi saltodosieron!"
+
+#: LYMessages.c:409
+msgid "Error reading jump file!"
+msgstr "Eraro dum legado de saltodosiero!"
+
+#: LYMessages.c:410
+msgid "Out of memory reading jump file!"
+msgstr "La memoro eluziÄis dum legi saltodosieron."
+
+#: LYMessages.c:411
+msgid "Out of memory reading jump table!"
+msgstr "La memoro eluziÄis dum legi saltotabelon."
+
+#: LYMessages.c:412
+msgid "No index is currently available."
+msgstr "Neniu indekso nun disponeblas."
+
+#. #define CONFIRM_MAIN_SCREEN
+#: LYMessages.c:414
+msgid "Do you really want to go to the Main screen?"
+msgstr "Ĉu vi efektive volas iri al la ĉefa fako?"
+
+#: LYMessages.c:415
+msgid "You are already at main screen!"
+msgstr "Vi jam estas en la ĉefa fako!"
+
+#. #define NOT_ISINDEX
+#: LYMessages.c:417
+msgid "Not a searchable indexed document -- press '/' to search for a text string"
+msgstr "Ne serĉebla indicita dokumento. Prume la klavon '/' por serĉi tekstan ĉenon"
+
+#. #define NO_OWNER
+#: LYMessages.c:419
+msgid "No owner is defined for this file so you cannot send a comment"
+msgstr "Neniu estro estas difinita por ĉi tiu dosiero, do vi ne eblas sendi komenton."
+
+#: LYMessages.c:420
+#, c-format
+msgid "No owner is defined. Use %s?"
+msgstr "Neniu estro estas difinita. Ĉu uzu je %s?"
+
+#: LYMessages.c:421
+msgid "Do you wish to send a comment?"
+msgstr "Ĉu vi volas sendi komenton?"
+
+#: LYMessages.c:422
+msgid "Mail is disallowed so you cannot send a comment"
+msgstr "RetpoÅto estas malaktiva. Vi ne rajtas sendi komenton."
+
+#: LYMessages.c:423
+msgid "The 'e'dit command is currently disabled."
+msgstr "Redaktado nune estas malaktivigita."
+
+#: LYMessages.c:424
+msgid "External editing is currently disabled."
+msgstr "Ekstera redakto nune estas malaktivigita."
+
+#: LYMessages.c:425
+msgid "System error - failure to get status."
+msgstr "Sistema eraro - malsukceso atingi staton."
+
+#: LYMessages.c:426
+msgid "No editor is defined!"
+msgstr "Neniu tekstoredaktilo estas difinita!"
+
+#: LYMessages.c:427
+msgid "The 'p'rint command is currently disabled."
+msgstr "Printado nune estas malaktivigita."
+
+#: LYMessages.c:428
+msgid "Document has no Toolbar links or Banner."
+msgstr "Dokumento havas neniun ilobretajn ligilojn aÅ­ Åildon."
+
+#: LYMessages.c:429
+msgid "Unable to open traversal file."
+msgstr "Ne eblas malfermi trairan dosieron."
+
+#: LYMessages.c:430
+msgid "Unable to open traversal found file."
+msgstr "Ne eblas trovi dosieron."
+
+#: LYMessages.c:431
+msgid "Unable to open reject file."
+msgstr "Ne eblas malfermi la dosieron."
+
+#: LYMessages.c:432
+msgid "Unable to open traversal errors output file"
+msgstr "Ne eblas malfermi trairo-eraran dosieron"
+
+#: LYMessages.c:433
+msgid "TRAVERSAL WAS INTERRUPTED"
+msgstr "TRAIRO ESTIS INTERROMPITA"
+
+#: LYMessages.c:434
+msgid "Follow link (or goto link or page) number: "
+msgstr "Sekvi ligilan (aÅ­ iri al ligila aÅ­ paÄa) numeron: "
+
+#: LYMessages.c:435
+msgid "Select option (or page) number: "
+msgstr "Elekti elektan (aÅ­ paÄon) numeron: "
+
+#: LYMessages.c:436
+#, c-format
+msgid "Option number %d already is current."
+msgstr "Elekta numero %d jam estas nuna."
+
+#. #define ALREADY_AT_OPTION_END
+#: LYMessages.c:438
+msgid "You are already at the end of this option list."
+msgstr "Vi jam estas je la fino de la elekto-listo."
+
+#. #define ALREADY_AT_OPTION_BEGIN
+#: LYMessages.c:440
+msgid "You are already at the beginning of this option list."
+msgstr "Vi jam estas je la komencoo de la elekto-listo."
+
+#. #define ALREADY_AT_OPTION_PAGE
+#: LYMessages.c:442
+#, c-format
+msgid "You are already at page %d of this option list."
+msgstr "Vi jam estas je ekranpleno %d de la elekto-listo."
+
+#: LYMessages.c:443
+msgid "You have entered an invalid option number."
+msgstr "Vi enmetis nevalidan elektan numeron."
+
+#: LYMessages.c:444
+msgid "** Bad HTML!! Use -trace to diagnose. **"
+msgstr "** FuÅa HTML! Uzu la parametron -trace por diagnozi."
+
+#: LYMessages.c:445
+msgid "Give name of file to save in"
+msgstr "Donu nomon de dosiero en kiu konservi"
+
+#: LYMessages.c:446
+msgid "Can't save data to file -- please run WWW locally"
+msgstr "Ne eblas konservi datumojn al dosiero -- Bonvolu loke fari"
+
+#: LYMessages.c:447
+msgid "Can't open temporary file!"
+msgstr "Ne eblas malfermi provizoran dosieron!"
+
+#: LYMessages.c:448
+msgid "Can't open output file! Cancelling!"
+msgstr "Ne eblas malfermi eligan dosieron! Nuliganta!"
+
+#: LYMessages.c:449
+msgid "Execution is disabled."
+msgstr "Plenumo estas malaktivigita."
+
+#. #define EXECUTION_DISABLED_FOR_FILE
+#: LYMessages.c:451
+#, c-format
+msgid "Execution is not enabled for this file. See the Options menu (use %s)."
+msgstr "Plenumo ne estas ebla por ĉi tiu dosiero. Uzu la agordilon (klavo %s)."
+
+#. #define EXECUTION_NOT_COMPILED
+#: LYMessages.c:453
+msgid "Execution capabilities are not compiled into this version."
+msgstr "Plenumeblaj kapabloj ne estas en ĉi tiu versio."
+
+#: LYMessages.c:454
+msgid "This file cannot be displayed on this terminal."
+msgstr "La dosiero ne estas montrebla."
+
+#. #define CANNOT_DISPLAY_FILE_D_OR_C
+#: LYMessages.c:456
+msgid "This file cannot be displayed on this terminal: D)ownload, or C)ancel"
+msgstr "La dosiero ne estas montrebla. D) ElÅuti, aÅ­ C) Nuligi"
+
+#: LYMessages.c:457
+#, c-format
+msgid "%s D)ownload, or C)ancel"
+msgstr "%s D) ElÅuti, aÅ­ C) Nuligi"
+
+#: LYMessages.c:458
+msgid "Cancelling file."
+msgstr "Nuliganta dosieron."
+
+#: LYMessages.c:459
+msgid "Retrieving file. - PLEASE WAIT -"
+msgstr "Ricevanta dosieron. - BONVOLU ATENDI -"
+
+#: LYMessages.c:460
+msgid "Enter a filename: "
+msgstr "Enmetu dosiernomon: "
+
+#: LYMessages.c:461
+msgid "Edit the previous filename: "
+msgstr "Redakti antaÅ­an dosiernomon: "
+
+#: LYMessages.c:462
+msgid "Edit a previous filename: "
+msgstr "Redakti antaÅ­an dosiernomon: "
+
+#: LYMessages.c:463
+msgid "Enter a new filename: "
+msgstr "Enmetu novan dosiernomon:"
+
+#: LYMessages.c:464
+msgid "File name may not begin with a dot."
+msgstr "Dosiernome ne eblas komenci per punkto."
+
+#: LYMessages.c:466
+msgid "File exists. Create higher version?"
+msgstr "Dosiero ekzistas. Ĉu krei pli novan eldonon?"
+
+#: LYMessages.c:468
+msgid "File exists. Overwrite?"
+msgstr "Dosiero ekzistas. Ĉu anstataŭi?"
+
+#: LYMessages.c:470
+msgid "Cannot write to file."
+msgstr "Ne eblas skribi al dosiero."
+
+#: LYMessages.c:471
+msgid "ERROR! - download command is misconfigured."
+msgstr "ERARO! - Ne eblas elÅuti."
+
+#: LYMessages.c:472
+msgid "Unable to download file."
+msgstr "Ne eblas elÅuti dosieron."
+
+#: LYMessages.c:473
+msgid "Reading directory..."
+msgstr "Leganta dosierujon..."
+
+#: LYMessages.c:474
+msgid "Building directory listing..."
+msgstr "Munti dosierujan liston..."
+
+#: LYMessages.c:475
+msgid "Saving..."
+msgstr "Konservanta..."
+
+#: LYMessages.c:476
+#, c-format
+msgid "Could not edit file '%s'."
+msgstr "Ne povis redakti dosieron '%s'."
+
+#: LYMessages.c:477
+msgid "Unable to access document!"
+msgstr "Ne eblas atingi dokumenton!"
+
+#: LYMessages.c:478
+msgid "Could not access file."
+msgstr "Ne eblas atingi dosieron."
+
+#: LYMessages.c:479
+msgid "Could not access directory."
+msgstr "Ne povis atingi dosierujon."
+
+#: LYMessages.c:480
+msgid "Could not load data."
+msgstr "Ne eblas Åargi datumojn."
+
+#. #define CANNOT_EDIT_REMOTE_FILES
+#: LYMessages.c:482
+msgid "Lynx cannot currently (e)dit remote WWW files."
+msgstr "Lynx nune ne eblas redakti forajn TTT-dosierojn."
+
+#. #define CANNOT_EDIT_FIELD
+#: LYMessages.c:484
+msgid "This field cannot be (e)dited with an external editor."
+msgstr "La kampo ne eblas esti ekstere redaktita."
+
+#: LYMessages.c:485
+msgid "Bad rule"
+msgstr "FuÅa regulo"
+
+#: LYMessages.c:486
+msgid "Insufficient operands:"
+msgstr "FuÅaj operaciiloj:"
+
+#: LYMessages.c:487
+msgid "You are not authorized to edit this file."
+msgstr "Vi ne permesas redakti ĉi tiun doseron."
+
+#: LYMessages.c:488
+msgid "Title: "
+msgstr "Titolo: "
+
+#: LYMessages.c:489
+msgid "Subject: "
+msgstr "Temo: "
+
+#: LYMessages.c:490
+msgid "Username: "
+msgstr "Salutnomo: "
+
+#: LYMessages.c:491
+msgid "Password: "
+msgstr "Pasvorto: "
+
+#: LYMessages.c:492
+msgid "lynx: Username and Password required!!!"
+msgstr "Salutnomo kaj pasvorto necesaj!"
+
+#: LYMessages.c:493
+msgid "lynx: Password required!!!"
+msgstr "Pasvorto necesa!"
+
+#: LYMessages.c:494
+msgid "Clear all authorization info for this session?"
+msgstr "Ĉu forviÅi ĉiujn atestajn informojn por ĉi tiu seanco?"
+
+#: LYMessages.c:495
+msgid "Authorization info cleared."
+msgstr "Atestaj informoj forviÅitaj."
+
+#: LYMessages.c:496
+msgid "Authorization failed. Retry?"
+msgstr "Atestado malsukcesis. Ĉu reprovi?"
+
+#: LYMessages.c:497
+msgid "cgi support has been disabled."
+msgstr "CGI-regade estas malaktivigita."
+
+#. #define CGI_NOT_COMPILED
+#: LYMessages.c:499
+msgid "Lynxcgi capabilities are not compiled into this version."
+msgstr "CGI-kapabloj ne estas en ĉi tiu versio."
+
+#: LYMessages.c:500
+#, c-format
+msgid "Sorry, no known way of converting %s to %s."
+msgstr "Ne eblas konverti el %s al %s."
+
+#: LYMessages.c:501
+msgid "Unable to set up connection."
+msgstr "Ne eblas aranÄi konekton."
+
+#: LYMessages.c:502
+msgid "Unable to make connection"
+msgstr "Ne eblas starigi konekto"
+
+#. #define MALFORMED_EXEC_REQUEST
+#: LYMessages.c:504
+msgid "Executable link rejected due to malformed request."
+msgstr "Plenumebla ligilo rifuzita pro fuÅa peto."
+
+#. #define BADCHAR_IN_EXEC_LINK
+#: LYMessages.c:506
+#, c-format
+msgid "Executable link rejected due to `%c' character."
+msgstr "Plenumebla ligilo rifuzita pro signo '%c'."
+
+#. #define RELPATH_IN_EXEC_LINK
+#: LYMessages.c:508
+msgid "Executable link rejected due to relative path string ('../')."
+msgstr "Plenumebla ligilo rifuzita pro relativa voja ĉeno ('.../')."
+
+#. #define BADLOCPATH_IN_EXEC_LINK
+#: LYMessages.c:510
+msgid "Executable link rejected due to location or path."
+msgstr "Plenumebla ligilo rifuzita pro loko aÅ­ vojo."
+
+#: LYMessages.c:511
+msgid "Mail access is disabled!"
+msgstr "RetpoÅta atingo estas malaktivigita!"
+
+#. #define ACCESS_ONLY_LOCALHOST
+#: LYMessages.c:513
+msgid "Only files and servers on the local host can be accessed."
+msgstr "Nur dosieroj kaj serviloj en la loka komputilo estas atingeblaj."
+
+#: LYMessages.c:514
+msgid "Telnet access is disabled!"
+msgstr "Telnet-atingo malaktivigita!"
+
+#. #define TELNET_PORT_SPECS_DISABLED
+#: LYMessages.c:516
+msgid "Telnet port specifications are disabled."
+msgstr "Specifoj pri Telnet-pordoj estas malaktivigitaj."
+
+#: LYMessages.c:517
+msgid "USENET news access is disabled!"
+msgstr "USENET-atingo estas malaktivigita!"
+
+#: LYMessages.c:518
+msgid "Rlogin access is disabled!"
+msgstr "Rlogin-atingo estas malaktivigita!"
+
+#: LYMessages.c:519
+msgid "Ftp access is disabled!"
+msgstr "FTP-atingo estas malaktivigita!"
+
+#: LYMessages.c:520
+msgid "There are no references from this document."
+msgstr "Ne ekzistas referencoj de ĉi tiu dokumento."
+
+#: LYMessages.c:521
+msgid "There are only hidden links from this document."
+msgstr "Ekzistas nur kaÅitaj ligiloj de ĉi tiu dokumento."
+
+#: LYMessages.c:523
+msgid "Unable to open command file."
+msgstr "Ne eblas malfermi komandan dosieron."
+
+#: LYMessages.c:525
+msgid "News Post Cancelled!!!"
+msgstr "AfiÅo nuligita!"
+
+#. #define SPAWNING_EDITOR_FOR_NEWS
+#: LYMessages.c:527
+msgid "Spawning your selected editor to edit news message"
+msgstr "Plenumanta vian elektitan redaktilon por redakti la mesaÄon"
+
+#: LYMessages.c:528
+msgid "Post this message?"
+msgstr "Ĉu afiÅi ĉi tiun mesaÄon?"
+
+#: LYMessages.c:529
+#, c-format
+msgid "Append '%s'?"
+msgstr "Ĉu almeti je '%s'?"
+
+#: LYMessages.c:530
+msgid "Posting to newsgroup(s)..."
+msgstr "AfiÅanta al novaĵgrupo(j)..."
+
+#: LYMessages.c:532
+msgid "*** You have unread mail. ***"
+msgstr "*** Vi havas nelegitajn retmesaÄojn. ***"
+
+#: LYMessages.c:534
+msgid "*** You have mail. ***"
+msgstr "*** Vi havas retmesaÄojn. ***"
+
+#: LYMessages.c:536
+msgid "*** You have new mail. ***"
+msgstr "*** Vi havas novajn retmesaÄojn. ***"
+
+#: LYMessages.c:537
+msgid "File insert cancelled!!!"
+msgstr "Dosiera enmetado nuligita!"
+
+#: LYMessages.c:538
+msgid "Not enough memory for file!"
+msgstr "Nesufiĉa memoro por dosiero!"
+
+#: LYMessages.c:539
+msgid "Can't open file for reading."
+msgstr "Ne eblas malfermi dosieron por legado."
+
+#: LYMessages.c:540
+msgid "File does not exist."
+msgstr "Dosiero ne ekzistas."
+
+#: LYMessages.c:541
+msgid "File does not exist - reenter or cancel:"
+msgstr "Dosiero ne ekzistas - reeniri aÅ­ nuligi:"
+
+#: LYMessages.c:542
+msgid "File is not readable."
+msgstr "Dosiero nelegeblas."
+
+#: LYMessages.c:543
+msgid "File is not readable - reenter or cancel:"
+msgstr "Dosiero ne estas legebla - reeniri aÅ­ nuligi:"
+
+#: LYMessages.c:544
+msgid "Nothing to insert - file is 0-length."
+msgstr "Nenio por enmeti - dosiero estas vaka."
+
+#: LYMessages.c:545
+msgid "Save request cancelled!!!"
+msgstr "Konservado de pote nuligita!"
+
+#: LYMessages.c:546
+msgid "Mail request cancelled!!!"
+msgstr "RetpoÅta peto nuligita!"
+
+#. #define CONFIRM_MAIL_SOURCE_PREPARSED
+#: LYMessages.c:548
+msgid "Viewing preparsed source. Are you sure you want to mail it?"
+msgstr "Vidanta interpretitan fontotekston. Ĉu vi certas, ke vi volas sendi Äin per retpoÅto?"
+
+#: LYMessages.c:549
+msgid "Please wait..."
+msgstr "Bonvolu atendi..."
+
+#: LYMessages.c:550
+msgid "Mailing file. Please wait..."
+msgstr "Bonvolu atendi dum sendi la dosieron per retpoÅto..."
+
+#: LYMessages.c:551
+msgid "ERROR - Unable to mail file"
+msgstr "ERARO - Ne eblas sendi dosieron per retpoÅto"
+
+#. #define CONFIRM_LONG_SCREEN_PRINT
+#: LYMessages.c:553
+#, c-format
+msgid "File is %d screens long. Are you sure you want to print?"
+msgstr "Dosiero estas %d ekranplenoj. Ĉu vi certas, ke vi volas printi?"
+
+#: LYMessages.c:554
+msgid "Print request cancelled!!!"
+msgstr "Printa peto nuligita!"
+
+#: LYMessages.c:555
+msgid "Press <return> to begin: "
+msgstr "Premu enen-klavon por komenci: "
+
+#: LYMessages.c:556
+msgid "Press <return> to finish: "
+msgstr "Premu enen-klavon por fini: "
+
+#. #define CONFIRM_LONG_PAGE_PRINT
+#: LYMessages.c:558
+#, c-format
+msgid "File is %d pages long. Are you sure you want to print?"
+msgstr "Dosiero estas %d ekranplenoj. Ĉu vi certas, ke vi volas printi?"
+
+#. #define CHECK_PRINTER
+#: LYMessages.c:560
+msgid "Be sure your printer is on-line. Press <return> to start printing:"
+msgstr "Certigu, ke via printilo estas konektita. Premu enen-klavon por printi:"
+
+#: LYMessages.c:561
+msgid "ERROR - Unable to allocate file space!!!"
+msgstr "ERARO - Ne eblas akiri dosieran spacon!"
+
+#: LYMessages.c:562
+msgid "Unable to open tempfile"
+msgstr "Ne eblas malfermi provizoran dosieron"
+
+#: LYMessages.c:563
+msgid "Unable to open print options file"
+msgstr "Ne eblas malfermi printo-agordan dosieron"
+
+#: LYMessages.c:564
+msgid "Printing file. Please wait..."
+msgstr "Printanta dosieron. Bonvolu atendi..."
+
+#: LYMessages.c:565
+msgid "Please enter a valid internet mail address: "
+msgstr "Bonvolu enmeti validan retpoÅtadreson: "
+
+#: LYMessages.c:566
+msgid "ERROR! - printer is misconfigured!"
+msgstr "ERARO! - Printilo estas malÄuste agordita!"
+
+#: LYMessages.c:567
+msgid "Image map from POST response not available!"
+msgstr "Bildmapo de kaÅita respondo ne disponeblas!"
+
+#: LYMessages.c:568
+msgid "Misdirected client-side image MAP request!"
+msgstr "MalÄuste direktita enklienta bildmapa peto!"
+
+#: LYMessages.c:569
+msgid "Client-side image MAP is not accessible!"
+msgstr "Enklienta bildmapo ne atingeblas!"
+
+#: LYMessages.c:570
+msgid "No client-side image MAPs are available!"
+msgstr "Neniuj enklientaj bildmapoj disponeblas!"
+
+#: LYMessages.c:571
+msgid "Client-side image MAP is not available!"
+msgstr "Enklienta bildmapo ne disponeblas!"
+
+#. #define OPTION_SCREEN_NEEDS_24
+#: LYMessages.c:574
+msgid "Screen height must be at least 24 lines for the Options menu!"
+msgstr "Ekrana alto devas esti minimume 24 linioj por la agordilo!"
+
+#. #define OPTION_SCREEN_NEEDS_23
+#: LYMessages.c:576
+msgid "Screen height must be at least 23 lines for the Options menu!"
+msgstr "Ekrana alto devas esti minimume 23 linioj por la agordilo!"
+
+#. #define OPTION_SCREEN_NEEDS_22
+#: LYMessages.c:578
+msgid "Screen height must be at least 22 lines for the Options menu!"
+msgstr "Ekrana alto devas esti minimume 22 linioj por la agordilo!"
+
+#: LYMessages.c:580
+msgid "That key requires Advanced User mode."
+msgstr "Tiu klavo bezonas altnivelan uzantareÄimon."
+
+#: LYMessages.c:581
+#, c-format
+msgid "Content-type: %s"
+msgstr "Enhavtipo: %s"
+
+#: LYMessages.c:582
+msgid "Command: "
+msgstr "Komando"
+
+#: LYMessages.c:583
+msgid "Unknown or ambiguous command"
+msgstr "Nekonata aÅ­ neklara komando"
+
+#: LYMessages.c:584
+msgid " Version "
+msgstr " Versio "
+
+#: LYMessages.c:585
+msgid " first"
+msgstr " antaÅ­ aliaj"
+
+#: LYMessages.c:586
+msgid ", guessing..."
+msgstr ", provanta korekti..."
+
+#: LYMessages.c:587
+msgid "Permissions for "
+msgstr "Permesoj por"
+
+#: LYMessages.c:588
+msgid "Select "
+msgstr "Elekti"
+
+#: LYMessages.c:589
+msgid "capital letter"
+msgstr "Majusklo"
+
+#: LYMessages.c:590
+msgid " of option line,"
+msgstr " de agorda linio,"
+
+#: LYMessages.c:591
+msgid " to save,"
+msgstr " por konservi,"
+
+#: LYMessages.c:592
+msgid " to "
+msgstr " al"
+
+#: LYMessages.c:593
+msgid " or "
+msgstr " aÅ­"
+
+#: LYMessages.c:594
+msgid " index"
+msgstr " indekso"
+
+#: LYMessages.c:595
+msgid " to return to Lynx."
+msgstr " por reiri al Lynx."
+
+#: LYMessages.c:596
+msgid "Accept Changes"
+msgstr "Akcepti ÅanÄojn"
+
+#: LYMessages.c:597
+msgid "Reset Changes"
+msgstr "Restarigi ÅanÄojn"
+
+#: LYMessages.c:598
+msgid "Left Arrow cancels changes"
+msgstr "Maldekstra sagoklavo nuligas ÅanÄojn"
+
+#: LYMessages.c:599
+msgid "Save options to disk"
+msgstr "Konservi agordaĵojn al la disko"
+
+#: LYMessages.c:600
+msgid "Hit RETURN to accept entered data."
+msgstr "Premu enen-klavon por akcepti enmetitajn datumojn."
+
+#. #define ACCEPT_DATA_OR_DEFAULT
+#: LYMessages.c:602
+msgid "Hit RETURN to accept entered data. Delete data to invoke the default."
+msgstr "Enmetu enen-klavon por akcepti enmetitajn datumojn. Forigi datumojn por alvoki la aprioran."
+
+#: LYMessages.c:603
+msgid "Value accepted!"
+msgstr "Valoro akceptita!"
+
+#. #define VALUE_ACCEPTED_WARNING_X
+#: LYMessages.c:605
+msgid "Value accepted! -- WARNING: Lynx is configured for XWINDOWS!"
+msgstr "Valoro akceptita! -- AVERTO: Lynx estas agordita por la fenestrosistemo X"
+
+#. #define VALUE_ACCEPTED_WARNING_NONX
+#: LYMessages.c:607
+msgid "Value accepted! -- WARNING: Lynx is NOT configured for XWINDOWS!"
+msgstr "Valoro akceptita! -- AVERTO: Lynx NE estas agordita por la fenestrosistemo X"
+
+#: LYMessages.c:608
+msgid "You are not allowed to change which editor to use!"
+msgstr "Vi ne estas permesata ÅanÄi vian tekstoredaktilon!"
+
+#: LYMessages.c:609
+msgid "Failed to set DISPLAY variable!"
+msgstr "Malsukcesis valorizi medivariablon DISPLAY!"
+
+#: LYMessages.c:610
+msgid "Failed to clear DISPLAY variable!"
+msgstr "Malsukcesis forviÅi medivariablon DISPLAY!"
+
+#. #define BOOKMARK_CHANGE_DISALLOWED
+#: LYMessages.c:612
+msgid "You are not allowed to change the bookmark file!"
+msgstr "Vi ne estas permesita ÅanÄi la legosignan dosieron!"
+
+#: LYMessages.c:613
+msgid "Terminal does not support color"
+msgstr "Terminalo ne havas kolorojn"
+
+#: LYMessages.c:614
+#, c-format
+msgid "Your '%s' terminal does not support color."
+msgstr "Via terminalo '%s' ne havas kolorojn."
+
+#: LYMessages.c:615
+msgid "Access to dot files is disabled!"
+msgstr "Atingo al kaÅitaj dosieroj estas malaktivigita!"
+
+#. #define UA_NO_LYNX_WARNING
+#: LYMessages.c:617
+msgid "User-Agent string does not contain \"Lynx\" or \"L_y_n_x\""
+msgstr "Via TTT-legila ĉeno enhavas nek \"Lynx\" nek \"L_y_n_x\""
+
+#. #define UA_PLEASE_USE_LYNX
+#: LYMessages.c:619
+msgid "Use \"L_y_n_x\" or \"Lynx\" in User-Agent, or it looks like intentional deception!"
+msgstr "Uzu la ĉenojn \"L_y_n_x\" aŭ \"Lynx\" por identigi la TTT-legilon por eviti aspekti intence trompa."
+
+#. #define UA_CHANGE_DISABLED
+#: LYMessages.c:621
+msgid "Changing of the User-Agent string is disabled!"
+msgstr "ÅœanÄi la TTT-legilan identigon estas malaktivigite!"
+
+#. #define CHANGE_OF_SETTING_DISALLOWED
+#: LYMessages.c:623
+msgid "You are not allowed to change this setting."
+msgstr "Vi ne estas permesata ÅanÄi tiun agordaĵon."
+
+#: LYMessages.c:624
+msgid "Saving Options..."
+msgstr "Konservanta agordaĵojn..."
+
+#: LYMessages.c:625
+msgid "Options saved!"
+msgstr "Agordaĵoj konservitaj!"
+
+#: LYMessages.c:626
+msgid "Unable to save Options!"
+msgstr "Ne eblas konservi agordaĵojn!"
+
+#: LYMessages.c:627
+msgid " 'r' to return to Lynx "
+msgstr " 'r' por reiri al Lynx "
+
+#: LYMessages.c:628
+msgid " '>' to save, or 'r' to return to Lynx "
+msgstr " '>' por konservi, aÅ­ 'r' por reiri al Lynx "
+
+#. #define ANY_KEY_CHANGE_RET_ACCEPT
+#: LYMessages.c:630
+msgid "Hit any key to change value; RETURN to accept."
+msgstr "Premu iun klavon por ÅanÄi valoron; enen-klavon por akcepti"
+
+#: LYMessages.c:631
+msgid "Error uncompressing temporary file!"
+msgstr "Eraro dum malpaki provizoran dosieron!"
+
+#: LYMessages.c:632
+msgid "Unsupported URL scheme!"
+msgstr "Ne komprenas la URL-skemon!"
+
+#: LYMessages.c:633
+msgid "Unsupported data: URL! Use SHOWINFO, for now."
+msgstr "Ne komprenas la datuman URL-on. Uzu la komando SHOWINFO nune."
+
+#: LYMessages.c:634
+#, c-format
+msgid "Redirection limit of %d URL's reached."
+msgstr "Alidirektada limigo de %d URL-oj atingita."
+
+#: LYMessages.c:635
+msgid "Illegal redirection URL received from server!"
+msgstr "Nevalida alidirektada URL ricevita el servilo!"
+
+#. #define SERVER_ASKED_FOR_REDIRECTION
+#: LYMessages.c:637
+#, c-format
+msgid "Server asked for %d redirection of POST content to"
+msgstr "Servila petita por %d alidirektadoj de kaÅita enhavo al"
+
+#: LYMessages.c:640
+msgid "P)roceed, use G)ET or C)ancel "
+msgstr "P) DaÅ­rigi, G) MalkaÅi, aÅ­ C) Nuligi"
+
+#: LYMessages.c:641
+msgid "P)roceed, or C)ancel "
+msgstr "P) DaÅ­rigi, aÅ­ C) Nuligi"
+
+#. #define ADVANCED_POST_GET_REDIRECT
+#: LYMessages.c:643
+msgid "Redirection of POST content. P)roceed, see U)RL, use G)ET or C)ancel"
+msgstr "Alidirektado de kaÅita enhavo. P) DaÅ­rigi, U) vidi URL-on, G) MalkaÅi, aÅ­ C) Nuligi"
+
+#. #define ADVANCED_POST_REDIRECT
+#: LYMessages.c:645
+msgid "Redirection of POST content. P)roceed, see U)RL, or C)ancel"
+msgstr "Alidirektado de kaÅita enhavo. P) DaÅ­rigi, U) Vidi URL-on, aÅ­ C) Nuligi"
+
+#. #define CONFIRM_POST_RESUBMISSION
+#: LYMessages.c:647
+msgid "Document from Form with POST content. Resubmit?"
+msgstr "Dokumento kun kaÅita enhavo. Ĉu resendi?"
+
+#. #define CONFIRM_POST_RESUBMISSION_TO
+#: LYMessages.c:649
+#, c-format
+msgid "Resubmit POST content to %s ?"
+msgstr "Resendi kaÅitan enhavon al %s ?"
+
+#. #define CONFIRM_POST_LIST_RELOAD
+#: LYMessages.c:651
+#, c-format
+msgid "List from document with POST data. Reload %s ?"
+msgstr "Listo el dokumento kun kaÅitaj datumoj. Ĉu reÅargi je %s ?"
+
+#. #define CONFIRM_POST_DOC_HEAD
+#: LYMessages.c:653
+msgid "Document from POST action, HEAD may not be understood. Proceed?"
+msgstr "Dokumento kun kaÅita enhavo, ricevado de kapo eble ne kompreniÄos. Ĉu daÅ­ri?"
+
+#. #define CONFIRM_POST_LINK_HEAD
+#: LYMessages.c:655
+msgid "Form submit action is POST, HEAD may not be understood. Proceed?"
+msgstr "Formularo kun kaÅita enhavo, ricevado de kapo eble ne kompreniÄos. Ĉu daÅ­ri?"
+
+#: LYMessages.c:656
+msgid "Proceed without a username and password?"
+msgstr "Ĉu daŭri sen salutnomo kaj pasvorto?"
+
+#: LYMessages.c:657
+#, c-format
+msgid "Proceed (%s)?"
+msgstr "Ĉu daŭri (%s)?"
+
+#: LYMessages.c:658
+msgid "Cannot POST to this host."
+msgstr "Ne eblas sendi kaÅitajn datumojn al tiu retnodo."
+
+#: LYMessages.c:659
+msgid "POST not supported for this URL - ignoring POST data!"
+msgstr "Tiu URL ne komprenas kaÅitan enhavon - ignoranta!"
+
+#: LYMessages.c:660
+msgid "Discarding POST data..."
+msgstr "Forĵetanta kaÅitajn datumojn..."
+
+#: LYMessages.c:661
+msgid "Document will not be reloaded!"
+msgstr "Dokumento ne estos reÅargita!"
+
+#: LYMessages.c:662
+msgid "Location: "
+msgstr "Loko: "
+
+#: LYMessages.c:663
+#, c-format
+msgid "'%s' not found!"
+msgstr "'%s' ne trovita!"
+
+#: LYMessages.c:664
+msgid "Default Bookmark File"
+msgstr "Apriora legosigna dosiero"
+
+#: LYMessages.c:665
+msgid "Screen too small! (8x35 min)"
+msgstr "Ekrano tro malgranda! (minimume 8 de 35 rastrumeroj)"
+
+#: LYMessages.c:666
+msgid "Select destination or ^G to Cancel: "
+msgstr "Elektu celon aÅ­ ^G por nuligi: "
+
+#. #define MULTIBOOKMARKS_SELECT
+#: LYMessages.c:668
+msgid "Select subbookmark, '=' for menu, or ^G to cancel: "
+msgstr "Elekti sublegosignon, '=' por menuo, aÅ­ ^G por nuligi: "
+
+#. #define MULTIBOOKMARKS_SELF
+#: LYMessages.c:670
+msgid "Reproduce L)ink in this bookmark file or C)ancel? (l,c): "
+msgstr "Kloni L)igilon en ĉi tiu legosigna dosiero aŭ C) Nuligi? (l,c): "
+
+#: LYMessages.c:671
+msgid "Multiple bookmark support is not available."
+msgstr "Plurnivelaj legosignoj estas ne disponeblaj."
+
+#: LYMessages.c:672
+#, c-format
+msgid " Select Bookmark (screen %d of %d)"
+msgstr " Elektu legosignon (ekranpleno %d el %d)"
+
+#: LYMessages.c:673
+msgid " Select Bookmark"
+msgstr " Elekti legosignon"
+
+#. #define MULTIBOOKMARKS_EHEAD_MASK
+#: LYMessages.c:675
+#, c-format
+msgid "Editing Bookmark DESCRIPTION and FILEPATH (%d of 2)"
+msgstr "Redaktanta la priskribon kaj vojon de legosigno (%d el 2)"
+
+#. #define MULTIBOOKMARKS_EHEAD
+#: LYMessages.c:677
+msgid " Editing Bookmark DESCRIPTION and FILEPATH"
+msgstr " Redaktanta la priskribon kaj vojon de legosigno"
+
+#: LYMessages.c:678
+msgid "Letter: "
+msgstr "Litero: "
+
+#. #define USE_PATH_OFF_HOME
+#: LYMessages.c:681
+msgid "Use a filepath off your login directory in SHELL syntax!"
+msgstr "Uzu dosiervojon de via hejmdosierujo laÅ­ SHELL-sintakso!"
+
+#: LYMessages.c:683
+msgid "Use a filepath off your home directory!"
+msgstr "Uzu dosiervojon de via hejmdosierujo."
+
+#. #define MAXLINKS_REACHED
+#: LYMessages.c:686
+msgid "Maximum links per page exceeded! Use half-page or two-line scrolling."
+msgstr "Maksimumaj ligiloj je ĉiu ekranpleno preteriris! Uzu duonekranplenan aŭ dulinian rulumadon."
+
+#: LYMessages.c:687
+msgid "No previously visited links available!"
+msgstr "Neniuj antaÅ­e vizititaj ligiloj disponeblaj!"
+
+#: LYMessages.c:688
+msgid "Memory exhausted! Program aborted!"
+msgstr "Uzis la tuton de la memoro! Programo ĉesigita!"
+
+#: LYMessages.c:689
+msgid "Memory exhausted! Aborting..."
+msgstr "Uzis la tuton de la memoro! Ĉesiganta..."
+
+#: LYMessages.c:690
+msgid "Not enough memory!"
+msgstr "Ne sufiĉo da memoro!"
+
+#: LYMessages.c:691
+msgid "Directory/File Manager not available"
+msgstr "Dosieradministrilo ne disponeblas"
+
+#: LYMessages.c:692
+msgid "Location URL is not absolute."
+msgstr "Loko-URL ne estas absoluta."
+
+#: LYMessages.c:693
+msgid "Refresh URL is not absolute."
+msgstr "ReÅarga URL ne estas absoluta."
+
+#. #define SENDING_MESSAGE_WITH_BODY_TO
+#: LYMessages.c:695
+msgid ""
+"You are sending a message with body to:\n"
+" "
+msgstr ""
+"Vi sendas mesaÄon kun korpo al:\n"
+" "
+
+#: LYMessages.c:696
+msgid ""
+"You are sending a comment to:\n"
+" "
+msgstr ""
+"Vi sendas komenton al:\n"
+" "
+
+#: LYMessages.c:697
+msgid ""
+"\n"
+" With copy to:\n"
+" "
+msgstr ""
+"\n"
+" Kun kopio al:\n"
+" "
+
+#: LYMessages.c:698
+msgid ""
+"\n"
+" With copies to:\n"
+" "
+msgstr ""
+"\n"
+" Kun kopioj al:\n"
+" "
+
+#. #define CTRL_G_TO_CANCEL_SEND
+#: LYMessages.c:700
+msgid ""
+"\n"
+"\n"
+"Use Ctrl-G to cancel if you do not want to send a message\n"
+msgstr ""
+"\n"
+"\n"
+"^G por nuligi, se vi ne volas sendi mesaÄon\n"
+
+#. #define ENTER_NAME_OR_BLANK
+#: LYMessages.c:702
+msgid ""
+"\n"
+" Please enter your name, or leave it blank to remain anonymous\n"
+msgstr ""
+"\n"
+" Bonvolu enmeti vian nomon, aÅ­ restigi Äin vaka por resti sennoma\n"
+
+#. #define ENTER_MAIL_ADDRESS_OR_OTHER
+#: LYMessages.c:704
+msgid ""
+"\n"
+" Please enter a mail address or some other\n"
+msgstr ""
+"\n"
+" Bonvolu enmeti retpoÅtadreson aÅ­ iun alian\n"
+
+#. #define MEANS_TO_CONTACT_FOR_RESPONSE
+#: LYMessages.c:706
+msgid " means to contact you, if you desire a response.\n"
+msgstr " maniero por kontakti vin, se vi deziras respondon.\n"
+
+#: LYMessages.c:707
+msgid ""
+"\n"
+" Please enter a subject line.\n"
+msgstr ""
+"\n"
+" Bonvolu enmeti unulinian temon.\n"
+
+#. #define ENTER_ADDRESS_FOR_CC
+#: LYMessages.c:709
+msgid ""
+"\n"
+" Enter a mail address for a CC of your message.\n"
+msgstr ""
+"\n"
+" Enmetu retpoÅtadreson por kopio de la mesaÄo.\n"
+
+#: LYMessages.c:710
+msgid " (Leave blank if you don't want a copy.)\n"
+msgstr " (Restigu vaka, se vi ne volas kopion.)\n"
+
+#: LYMessages.c:711
+msgid ""
+"\n"
+" Please review the message body:\n"
+"\n"
+msgstr ""
+"\n"
+" Bonvolu kontroli la mesaÄan korpon:\n"
+"\n"
+
+#: LYMessages.c:712
+msgid ""
+"\n"
+"Press RETURN to continue: "
+msgstr ""
+"\n"
+"Premu enen-klavon por daÅ­ri: "
+
+#: LYMessages.c:713
+msgid ""
+"\n"
+"Press RETURN to clean up: "
+msgstr ""
+"\n"
+"Premu enen-klavon por purigi: "
+
+#: LYMessages.c:714
+msgid " Use Control-U to erase the default.\n"
+msgstr " Uzu la klavon ^U por forviÅi la jaman.\n"
+
+#: LYMessages.c:715
+msgid ""
+"\n"
+" Please enter your message below."
+msgstr ""
+"\n"
+"Bonvolu enmeti vian mesaÄon sube."
+
+#. #define ENTER_PERIOD_WHEN_DONE_A
+#: LYMessages.c:717 src/LYNews.c:360
+msgid ""
+"\n"
+" When you are done, press enter and put a single period (.)"
+msgstr ""
+"\n"
+" Kiam finita, premu la enen-klavon kaj klavu unuopan punkton (.)"
+
+#. #define ENTER_PERIOD_WHEN_DONE_B
+#: LYMessages.c:719 src/LYNews.c:361
+msgid ""
+"\n"
+" on a line and press enter again."
+msgstr ""
+"\n"
+" en unuopa linio kaj repremu la enen-klavon."
+
+#. Cookies messages
+#. #define ADVANCED_COOKIE_CONFIRMATION
+#: LYMessages.c:723
+#, c-format
+msgid "%s cookie: %.*s=%.*s Allow? (Y/N/Always/neVer)"
+msgstr "%s kuketo: %.*s=%.*s Ĉu Permesi? (J/N/ĉiAm/nEniam)"
+
+#. #define INVALID_COOKIE_DOMAIN_CONFIRMATION
+#: LYMessages.c:725
+#, c-format
+msgid "Accept invalid cookie domain=%s for '%s'?"
+msgstr "Ĉu akcepti nevalidan kuketon domajno=%s por '%s'?"
+
+#. #define INVALID_COOKIE_PATH_CONFIRMATION
+#: LYMessages.c:727
+#, c-format
+msgid "Accept invalid cookie path=%s as a prefix of '%s'?"
+msgstr "Ĉu akcepti nevalidan kuketon vojo=%s kiel prefikson de '%s'?"
+
+#: LYMessages.c:728
+msgid "Allowing this cookie."
+msgstr "Permesanta ĉi tiun kuketon."
+
+#: LYMessages.c:729
+msgid "Rejecting this cookie."
+msgstr "Rifuzanta ĉi tiun kuketon."
+
+#: LYMessages.c:730
+msgid "The Cookie Jar is empty."
+msgstr "La kuketo-skatolo estas vaka."
+
+#: LYMessages.c:731
+msgid "The Cache Jar is empty."
+msgstr "La tenejo-skatolo estas vaka."
+
+#. #define ACTIVATE_TO_GOBBLE
+#: LYMessages.c:733
+msgid "Activate links to gobble up cookies or entire domains,"
+msgstr "Aktivigi ligilojn por vori kuketojn aÅ­ tutajn domajnojn"
+
+#: LYMessages.c:734
+msgid "or to change a domain's 'allow' setting."
+msgstr "aÅ­ por ÅanÄi permeson de domajno."
+
+#: LYMessages.c:735
+msgid "(Cookies never allowed.)"
+msgstr "(Kuketoj neniam permesitaj.)"
+
+#: LYMessages.c:736
+msgid "(Cookies always allowed.)"
+msgstr "(Kuketoj ĉiam permesitaj.)"
+
+#: LYMessages.c:737
+msgid "(Cookies allowed via prompt.)"
+msgstr "(Kuketoj permesitaj per demandilo.)"
+
+#: LYMessages.c:738
+msgid "(Persistent Cookies.)"
+msgstr "(DaÅ­rantaj kuketoj.)"
+
+#: LYMessages.c:739
+msgid "(No title.)"
+msgstr "(Neniu titolo.)"
+
+#: LYMessages.c:740
+msgid "(No name.)"
+msgstr "(Neniu nomo.)"
+
+#: LYMessages.c:741
+msgid "(No value.)"
+msgstr "(Neniu valoro.)"
+
+#: LYMessages.c:742 src/LYOptions.c:2482
+msgid "None"
+msgstr "Neniu(j)"
+
+#: LYMessages.c:743
+msgid "(End of session.)"
+msgstr "(Fino de seanco.)"
+
+#: LYMessages.c:744
+msgid "Delete this cookie?"
+msgstr "Ĉu forigi ĉi tiun kuketon?"
+
+#: LYMessages.c:745
+msgid "The cookie has been eaten!"
+msgstr "La kuketo estas manÄita!"
+
+#: LYMessages.c:746
+msgid "Delete this empty domain?"
+msgstr "Ĉu forigi la vakan domajnon?"
+
+#: LYMessages.c:747
+msgid "The domain has been eaten!"
+msgstr "La domajno estis manÄita!"
+
+#. #define DELETE_COOKIES_SET_ALLOW_OR_CANCEL
+#: LYMessages.c:749
+msgid "D)elete domain's cookies, set allow A)lways/P)rompt/neV)er, or C)ancel? "
+msgstr "D)omajnan kuketon forigi, permesu A) Ĉiam/P) Demandi/V) Neniam, aŭ C) Nuligi?"
+
+#. #define DELETE_DOMAIN_SET_ALLOW_OR_CANCEL
+#: LYMessages.c:751
+msgid "D)elete domain, set allow A)lways/P)rompt/neV)er, or C)ancel? "
+msgstr "D)omajnon forigi, permesu A) Ĉiam/P) Demandi/V) Neniam, aŭ C) Nuligi?"
+
+#: LYMessages.c:752
+msgid "All cookies in the domain have been eaten!"
+msgstr "Ĉiuj kuketoj en la domajno estis manÄitaj!"
+
+#: LYMessages.c:753
+#, c-format
+msgid "'A'lways allowing from domain '%s'."
+msgstr "'A' por ĉiam permesi el la domajno '%s'."
+
+#: LYMessages.c:754
+#, c-format
+msgid "ne'V'er allowing from domain '%s'."
+msgstr "'V' por neniam permesi el la domajno '%s'."
+
+#: LYMessages.c:755
+#, c-format
+msgid "'P'rompting to allow from domain '%s'."
+msgstr "'P' por demandilo por domajno '%s'."
+
+#: LYMessages.c:756
+msgid "Delete all cookies in this domain?"
+msgstr "Ĉu forigi ĉiujn kuketojn en ĉi tiu domajno?"
+
+#: LYMessages.c:757
+msgid "All of the cookies in the jar have been eaten!"
+msgstr "Ĉiuj kuketoj en la skatolo estis manÄitaj!"
+
+#: LYMessages.c:759
+msgid "Port 19 not permitted in URLs."
+msgstr "Pordo 19 ne estas permesata en URL-oj."
+
+#: LYMessages.c:760
+msgid "Port 25 not permitted in URLs."
+msgstr "Pordo 19 ne estas permesata en URL-oj."
+
+#: LYMessages.c:761
+#, c-format
+msgid "Port %lu not permitted in URLs."
+msgstr "Pordo %lu ne estas permesata en URL-oj."
+
+#: LYMessages.c:762
+msgid "URL has a bad port field."
+msgstr "URL havas fuÅan pordon."
+
+#: LYMessages.c:763
+msgid "Maximum nesting of HTML elements exceeded."
+msgstr "Superfluis maksimuma nestado de HTML-elementoj."
+
+#: LYMessages.c:764
+msgid "Bad partial reference! Stripping lead dots."
+msgstr "FuÅa parta referenco! Foriganta komencajn punktoj."
+
+#: LYMessages.c:765
+msgid "Trace Log open failed. Trace off!"
+msgstr "Malsukcesis malfermi la spuran protokolon. MalÅaltita."
+
+#: LYMessages.c:766
+msgid "Lynx Trace Log"
+msgstr "Spura protokolo de Lynx"
+
+#: LYMessages.c:767
+msgid "No trace log has been started for this session."
+msgstr "Neniu spura protokolo estis komencita por ĉi tiu seanco."
+
+#. #define MAX_TEMPCOUNT_REACHED
+#: LYMessages.c:769
+msgid "The maximum temporary file count has been reached!"
+msgstr "La maksimuma nombro provizoraj dosieroj estis atingita!"
+
+#. #define FORM_VALUE_TOO_LONG
+#: LYMessages.c:771
+msgid "Form field value exceeds buffer length! Trim the tail."
+msgstr "Valoro de formularia kampo estas tro granda por la bufro. Tranĉu la voston!"
+
+#. #define FORM_TAIL_COMBINED_WITH_HEAD
+#: LYMessages.c:773
+msgid "Modified tail combined with head of form field value."
+msgstr "Modifita vosto kun kunigita kun kapo de formularia kampa valoro."
+
+#. HTFile.c
+#: LYMessages.c:776
+msgid "Directory"
+msgstr "Dosierujo"
+
+#: LYMessages.c:777
+msgid "Directory browsing is not allowed."
+msgstr "Dosieruja foliumado estas ne permesata."
+
+#: LYMessages.c:778
+msgid "Selective access is not enabled for this directory"
+msgstr "Elektebla atingo ne estas ebla por ĉi tiu dosierujo"
+
+#: LYMessages.c:779
+msgid "Multiformat: directory scan failed."
+msgstr "Multiformat: dosieruja skano malsukcesis."
+
+#: LYMessages.c:780
+msgid "This directory is not readable."
+msgstr "Ĉi tiu dosierujo ne legeblas."
+
+#: LYMessages.c:781
+msgid "Can't access requested file."
+msgstr "Ne eblas atingi petitan dosieron."
+
+#: LYMessages.c:782
+msgid "Could not find suitable representation for transmission."
+msgstr "Ne povis trovi taÅ­gan prezentadon por elsendi."
+
+#: LYMessages.c:783
+msgid "Could not open file for decompression!"
+msgstr "Ne povis malfermi malpakotan dosieron!"
+
+#: LYMessages.c:784
+msgid "Files:"
+msgstr "Dosieroj:"
+
+#: LYMessages.c:785
+msgid "Subdirectories:"
+msgstr "Subdosierujoj:"
+
+#: LYMessages.c:786
+msgid " directory"
+msgstr " dosierujo"
+
+#: LYMessages.c:787
+msgid "Up to "
+msgstr "Supren Äis "
+
+#: LYMessages.c:788
+msgid "Current directory is "
+msgstr "Nuna dosierujo estas "
+
+#. HTFTP.c
+#: LYMessages.c:791
+msgid "Symbolic Link"
+msgstr "Mola ligilo"
+
+#. HTGopher.c
+#: LYMessages.c:794
+msgid "No response from server!"
+msgstr "Neniu respondo el servilo!"
+
+#: LYMessages.c:795
+msgid "CSO index"
+msgstr "CSO-indekso"
+
+#: LYMessages.c:796
+msgid ""
+"\n"
+"This is a searchable index of a CSO database.\n"
+msgstr ""
+"\n"
+"Ĉi tiu estas serĉebla indekso de CSO-datumbazo.\n"
+
+#: LYMessages.c:797
+msgid "CSO Search Results"
+msgstr "CSO-serĉo-rezultoj"
+
+#: LYMessages.c:798
+#, c-format
+msgid "Seek fail on %s\n"
+msgstr "Malsukceso pri trovado je %s\n"
+
+#: LYMessages.c:799
+msgid ""
+"\n"
+"Press the 's' key and enter search keywords.\n"
+msgstr ""
+"\n"
+"Premu la klavon 's' kaj enmetu serĉo-Ålosilvortojn.\n"
+
+#: LYMessages.c:800
+msgid ""
+"\n"
+"This is a searchable Gopher index.\n"
+msgstr ""
+"\n"
+"Ĉi tio estas serĉebla Gopher-indekso.\n"
+
+#: LYMessages.c:801
+msgid "Gopher index"
+msgstr "Gopher-indekso"
+
+#: LYMessages.c:802
+msgid "Gopher Menu"
+msgstr "Gopher-menuo"
+
+#: LYMessages.c:803
+msgid " Search Results"
+msgstr " Serĉo-rezultoj"
+
+#: LYMessages.c:804
+msgid "Sending CSO/PH request."
+msgstr "Sendante CSO-peton."
+
+#: LYMessages.c:805
+msgid "Sending Gopher request."
+msgstr "Sendante Gopher-peton."
+
+#: LYMessages.c:806
+msgid "CSO/PH request sent; waiting for response."
+msgstr "CSO-peto sendita; atendanta respondon."
+
+#: LYMessages.c:807
+msgid "Gopher request sent; waiting for response."
+msgstr "Gopher-peto sendita; atendanta respondon."
+
+#: LYMessages.c:808
+msgid ""
+"\n"
+"Please enter search keywords.\n"
+msgstr ""
+"\n"
+"Bonvolu enmeti serĉo-Ålosilvortoj.\n"
+
+#: LYMessages.c:809
+msgid ""
+"\n"
+"The keywords that you enter will allow you to search on a"
+msgstr ""
+"\n"
+"La Ålosilvortoj, kiujn vi enmetas, permesos, ke vi serĉu pri"
+
+#: LYMessages.c:810
+msgid " person's name in the database.\n"
+msgstr " nomo de persono en la datumbazo.\n"
+
+#. HTNews.c
+#: LYMessages.c:813
+msgid "Connection closed ???"
+msgstr "Konekto fermita ?"
+
+#: LYMessages.c:814
+msgid "Cannot open temporary file for news POST."
+msgstr "Ne eblas malfermi provizoran dosieron por novaĵgrupa afiÅo."
+
+#: LYMessages.c:815
+msgid "This client does not contain support for posting to news with SSL."
+msgstr "Ĉi tiu kliento ne regas afiÅi al novaĵgrupaj serviloj kun SSL."
+
+#. HTStyle.c
+#: LYMessages.c:818
+#, c-format
+msgid "Style %d `%s' SGML:%s. Font %s %.1f point.\n"
+msgstr "Stilo %d '%s' SGML:%s. Tiparo %s %.lf punktoj.\n"
+
+#: LYMessages.c:820
+#, c-format
+msgid "\tAlign=%d, %d tabs. (%.0f before, %.0f after)\n"
+msgstr "\tAlign=%d, %d taboj. (%.0f antaÅ­e, %.0f poste)\n"
+
+#: LYMessages.c:821
+#, c-format
+msgid "\t\tTab kind=%d at %.0f\n"
+msgstr "\t\tTabspeco=%d je %.0f\n"
+
+#. HTTP.c
+#: LYMessages.c:824
+msgid "Can't proceed without a username and password."
+msgstr "Ne eblas daÅ­ri sen salutnomo kaj pasvorto."
+
+#: LYMessages.c:825
+msgid "Can't retry with authorization! Contact the server's WebMaster."
+msgstr "Ne eblas reprovi kun atestado! Kontakti la TTT-ejo-estron."
+
+#: LYMessages.c:826
+msgid "Can't retry with proxy authorization! Contact the server's WebMaster."
+msgstr "Ne eblas reprovi kun prokurila atestado! Kontakti la TTT-ejo-estron."
+
+#: LYMessages.c:827
+msgid "Retrying with proxy authorization information."
+msgstr "Reprovanta kun informoj pri prokurila atestado."
+
+#: LYMessages.c:828
+#, c-format
+msgid "SSL error:%s-Continue?"
+msgstr "SSL-eraro:%s-Ĉu daŭrigi?"
+
+#. HTWAIS.c
+#: LYMessages.c:831
+msgid "HTWAIS: Return message too large."
+msgstr "HTWAIS: Responda mesaÄo tro granda."
+
+#: LYMessages.c:832
+msgid "Enter WAIS query: "
+msgstr "Enmetu WAIS-mendon: "
+
+#. Miscellaneous status
+#: LYMessages.c:835
+msgid "Retrying as HTTP0 request."
+msgstr "Reprovanta kiel HTTP0-peton."
+
+#: LYMessages.c:836
+#, c-format
+msgid "Transferred %d bytes"
+msgstr "Transigis %d bajtojn"
+
+#: LYMessages.c:837
+msgid "Data transfer complete"
+msgstr "Datumo-transigo kompleta"
+
+#: LYMessages.c:838
+#, c-format
+msgid "Error processing line %d of %s\n"
+msgstr "Eraro traktanta linion %d de %s\n"
+
+#. Lynx internal page titles
+#: LYMessages.c:841
+msgid "Address List Page"
+msgstr "Adreslista paÄo"
+
+#: LYMessages.c:842
+msgid "Bookmark file"
+msgstr "Legosigna dosiero"
+
+#: LYMessages.c:843
+msgid "Configuration Definitions"
+msgstr "Agordaj difinoj"
+
+#: LYMessages.c:844
+msgid "Cookie Jar"
+msgstr "Kuketo-skatolo"
+
+#: LYMessages.c:845
+msgid "Current Edit-Key Map"
+msgstr "Nuna redaktoklavomapo"
+
+#: LYMessages.c:846
+msgid "Current Key Map"
+msgstr "Nuna klavomapo"
+
+#: LYMessages.c:847
+msgid "File Management Options"
+msgstr "Dosieradministradaj agordaĵoj"
+
+#: LYMessages.c:848
+msgid "Download Options"
+msgstr "ElÅutaj agordaĵoj"
+
+#: LYMessages.c:849
+msgid "History Page"
+msgstr "Historio-paÄo"
+
+#: LYMessages.c:850
+msgid "Cache Jar"
+msgstr "Tenejo-skatolo"
+
+#: LYMessages.c:851
+msgid "List Page"
+msgstr "Lista paÄo"
+
+#: LYMessages.c:852
+msgid "Lynx.cfg Information"
+msgstr "Lynk.cfg-informoj"
+
+#: LYMessages.c:853
+msgid "Converted Mosaic Hotlist"
+msgstr "Konvertis legosignojn de Mosaic"
+
+#: LYMessages.c:854
+msgid "Options Menu"
+msgstr "Menuo pri agordaĵoj"
+
+#: LYMessages.c:855
+msgid "File Permission Options"
+msgstr "Dosieratingaj agordaĵoj"
+
+#: LYMessages.c:856
+msgid "Printing Options"
+msgstr "Printaj agordaĵoj"
+
+#: LYMessages.c:857
+msgid "Information about the current document"
+msgstr "Informoj pri la nuna dokumento"
+
+#: LYMessages.c:858
+msgid "Your recent statusline messages"
+msgstr "FreÅaj statliniaj mesaÄoj"
+
+#: LYMessages.c:859
+msgid "Upload Options"
+msgstr "AlÅutaj agordaĵoj"
+
+#: LYMessages.c:860
+msgid "Visited Links Page"
+msgstr "PaÄo pri vizititaj ligiloj"
+
+#. CONFIG_DEF_TITLE subtitles
+#: LYMessages.c:863
+msgid "See also"
+msgstr "AnkaÅ­ vidu"
+
+#: LYMessages.c:864
+msgid "your"
+msgstr "vian"
+
+#: LYMessages.c:865
+msgid "for runtime options"
+msgstr "por plenumaj agordaĵoj"
+
+#: LYMessages.c:866
+msgid "compile time options"
+msgstr "tradukantaj agordaĵoj"
+
+#: LYMessages.c:867
+msgid "color-style configuration"
+msgstr "kolorstilaj agordaĵoj"
+
+#: LYMessages.c:868
+msgid "latest release"
+msgstr "plej freÅa eldono"
+
+#: LYMessages.c:869
+msgid "pre-release version"
+msgstr "beta eldono"
+
+#: LYMessages.c:870
+msgid "development version"
+msgstr "alfa eldono"
+
+#. #define AUTOCONF_CONFIG_CACHE
+#: LYMessages.c:872
+msgid ""
+"The following data were derived during the automatic configuration/build\n"
+"process of this copy of Lynx. When reporting a bug, please include a copy\n"
+"of this page."
+msgstr ""
+"La sekvaj datumoj estis derivitaj dum la aÅ­tomata muntada procezo\n"
+"de ĉi tiu ekzemplero de Lynx. Dum raportado de eraro, bonvolu inkluzivi ekzempleron\n"
+"de ĉi tiu paÄo."
+
+#. #define AUTOCONF_LYNXCFG_H
+#: LYMessages.c:876
+msgid ""
+"The following data were used as automatically-configured compile-time\n"
+"definitions when this copy of Lynx was built."
+msgstr ""
+"La sekvaj datumoj estis uzataj kiel difinoj dum tradukado\n"
+"de Lynx."
+
+#. #define DIRED_NOVICELINE
+#: LYMessages.c:881
+msgid " C)reate D)ownload E)dit F)ull menu M)odify R)emove T)ag U)pload \n"
+msgstr " C) Krei D) ElÅuti E) Redakti F) Plena menuo M)odifi R) Forigi T) Marki U) AlÅuti\n"
+
+#: LYMessages.c:882
+msgid "Failed to obtain status of current link!"
+msgstr "Malsukcesis atingi staton de nuna ligilo!"
+
+#. #define INVALID_PERMIT_URL
+#: LYMessages.c:885
+msgid "Special URL only valid from current File Permission menu!"
+msgstr "Speciala URL nur validas el menuo pri atingopermesoj!"
+
+#: LYMessages.c:889
+msgid "External support is currently disabled."
+msgstr "Ekstera subteno estas nune malaktivigita."
+
+#. new with 2.8.4dev.21
+#: LYMessages.c:893
+msgid "Changing working-directory is currently disabled."
+msgstr "ÅœanÄi labordosierujon nune estas malaktivigita."
+
+#: LYMessages.c:894
+msgid "Linewrap OFF!"
+msgstr "Linifaldo MALÅœALTITA!"
+
+#: LYMessages.c:895
+msgid "Linewrap ON!"
+msgstr "Linifaldo ÅœALTITA!"
+
+#: LYMessages.c:896
+msgid "Parsing nested-tables toggled OFF! Reloading..."
+msgstr "Interpretanta nestintajn tabelojn MALÅœALTITA! ReÅarganta..."
+
+#: LYMessages.c:897
+msgid "Parsing nested-tables toggled ON! Reloading..."
+msgstr "Interpretanta nestintajn tabelojn ÅœALTITA! ReÅarganta..."
+
+#: LYMessages.c:898
+msgid "Shifting is disabled while line-wrap is in effect"
+msgstr "Tio estas malaktivigita dum linifaldado."
+
+#: LYMessages.c:899
+msgid "Trace not supported"
+msgstr "Spurado ne komprenita"
+
+#: LYMessages.c:819
+#, c-format
+msgid "\tIndents: first=%.0f others=%.0f, Height=%.1f Desc=%.1f\n"
+msgstr "\tDeÅovoj: ununaj=%.0f aliaj=%.0f, Alto=%.lf Pri=%.lf\n"
+
+#: WWW/Library/Implementation/HTAABrow.c:575
+#, c-format
+msgid "username for realm %s changed from %s to %s"
+msgstr "salutnomo por regno %s ÅanÄiÄis de %s al %s"
+
+#: WWW/Library/Implementation/HTAABrow.c:591
+#, c-format
+msgid "password for realm %s user %s changed"
+msgstr "ÅanÄiÄis pasvorto por regno %s de uzanto %s"
+
+#: WWW/Library/Implementation/HTAABrow.c:703
+#, c-format
+msgid "Username for '%s' at %s '%s%s':"
+msgstr "Salutnomo por '%s' ĉe %s '%s%s':"
+
+#: WWW/Library/Implementation/HTAABrow.c:976
+msgid "This client doesn't know how to compose proxy authorization information for scheme"
+msgstr "Ĉi tiu kliento ne scias kiel komponi prokurilajn atesto-informojn por skemo"
+
+#: WWW/Library/Implementation/HTAABrow.c:1053
+msgid "This client doesn't know how to compose authorization information for scheme"
+msgstr "Ĉi tiu kliento ne scias kiel komponi atesto-informojn por skemo"
+
+#: WWW/Library/Implementation/HTAABrow.c:1162
+#, c-format
+msgid "Invalid header '%s%s%s%s%s'"
+msgstr "Nevalida kapo '%s%s%s%s%s'"
+
+#: WWW/Library/Implementation/HTAABrow.c:1266
+msgid "Proxy authorization required -- retrying"
+msgstr "Prokurila atestado bezonita -- reprovanta"
+
+#: WWW/Library/Implementation/HTAABrow.c:1322
+msgid "Access without authorization denied -- retrying"
+msgstr "Atingo sen atestado rifuzata -- reprovanta"
+
+#: WWW/Library/Implementation/HTAccess.c:698
+msgid "Access forbidden by rule"
+msgstr "Atingo malpermesita laÅ­ regulo"
+
+#: WWW/Library/Implementation/HTAccess.c:800
+msgid "Document with POST content not found in cache. Resubmit?"
+msgstr "Dokumento kun kaÅita enhavo ne trovita en tenejo. Resendi?"
+
+#: WWW/Library/Implementation/HTAccess.c:953
+msgid "Loading failed, use a previous copy."
+msgstr "Åœargo malsukcesis, uzu antaÅ­an ekzempleron."
+
+#: WWW/Library/Implementation/HTAccess.c:1062 src/GridText.c:8939
+msgid "Loading incomplete."
+msgstr "Åœargo nekompleta."
+
+#: WWW/Library/Implementation/HTAccess.c:1093
+#, c-format
+msgid "**** HTAccess: socket or file number returned by obsolete load routine!\n"
+msgstr "**** HTAccess: konektingo aÅ­ dosiernomo returnita de malaktuala Åargo-funkcio!\n"
+
+#: WWW/Library/Implementation/HTAccess.c:1095
+#, c-format
+msgid "**** HTAccess: Internal software error. Please mail lynx-dev@nongnu.org!\n"
+msgstr "**** HTAccess: Interna programa eraro. Bonvolu sendi retleteron al lynx-dev@nongnu.org!\n"
+
+#: WWW/Library/Implementation/HTAccess.c:1096
+#, c-format
+msgid "**** HTAccess: Status returned was: %d\n"
+msgstr "**** HTAccess: Statuso returnita estis: %d\n"
+
+#.
+#. * hack: if we fail in HTAccess.c
+#. * avoid duplicating URL, oh.
+#.
+#: WWW/Library/Implementation/HTAccess.c:1102 src/LYMainLoop.c:8076
+msgid "Can't Access"
+msgstr "Ne eblas atingi"
+
+#: WWW/Library/Implementation/HTAccess.c:1110
+msgid "Unable to access document."
+msgstr "Ne eblas atingi dokumenton."
+
+#: WWW/Library/Implementation/HTFTP.c:870
+#, c-format
+msgid "Enter password for user %s@%s:"
+msgstr "Enmetu pasvorton por uzanto %s@%s:"
+
+#: WWW/Library/Implementation/HTFTP.c:898
+msgid "Unable to connect to FTP host."
+msgstr "Ne eblas konektiÄi al FTP-retnodo."
+
+#: WWW/Library/Implementation/HTFTP.c:1137
+msgid "close master socket"
+msgstr "fermu estran konektingon"
+
+#: WWW/Library/Implementation/HTFTP.c:1195
+msgid "socket for master socket"
+msgstr "konektingo por estra konektingo"
+
+#: WWW/Library/Implementation/HTFTP.c:2925
+msgid "Receiving FTP directory."
+msgstr "Ricevanta FTP-dosierujon."
+
+#: WWW/Library/Implementation/HTFTP.c:3063
+#, c-format
+msgid "Transferred %d bytes (%5d)"
+msgstr "Transigis %d bajtojn (%5d)"
+
+#: WWW/Library/Implementation/HTFTP.c:3421
+msgid "connect for data"
+msgstr "konekti por datumoj"
+
+#: WWW/Library/Implementation/HTFTP.c:4098
+msgid "Receiving FTP file."
+msgstr "Ricevanta FTP-dosieron."
+
+#: WWW/Library/Implementation/HTFinger.c:274
+msgid "Could not set up finger connection."
+msgstr "Ne povis atingi finger-konekton."
+
+#: WWW/Library/Implementation/HTFinger.c:321
+msgid "Could not load data (no sitename in finger URL)"
+msgstr "Ne povis Åargi datumojn (neniu retnodonomo en finger-URL)"
+
+#: WWW/Library/Implementation/HTFinger.c:325
+msgid "Invalid port number - will only use port 79!"
+msgstr "Nevalida pordo-numero - sole uzos pordo 79!"
+
+#: WWW/Library/Implementation/HTFinger.c:391
+msgid "Could not access finger host."
+msgstr "Ne povis atingi finger-retnodon."
+
+#: WWW/Library/Implementation/HTFinger.c:399
+msgid "No response from finger server."
+msgstr "Neniu respondo de finger-servilo."
+
+#: WWW/Library/Implementation/HTNews.c:439
+#, c-format
+msgid "Username for news host '%s':"
+msgstr "Salutnomo por novaĵgrupa retnodo '%s':"
+
+#: WWW/Library/Implementation/HTNews.c:492
+msgid "Change username?"
+msgstr "Ĉu ÅanÄi salutnomon?"
+
+#: WWW/Library/Implementation/HTNews.c:496
+msgid "Username:"
+msgstr "Salutnomo:"
+
+#: WWW/Library/Implementation/HTNews.c:521
+#, c-format
+msgid "Password for news host '%s':"
+msgstr "Pasvorto por novaĵgrupa retnodo '%s':"
+
+#: WWW/Library/Implementation/HTNews.c:604
+msgid "Change password?"
+msgstr "Ĉu ÅanÄi pasvorton?"
+
+#: WWW/Library/Implementation/HTNews.c:1725
+#, c-format
+msgid "No matches for: %s"
+msgstr "Nenio kongruas kun %s"
+
+#: WWW/Library/Implementation/HTNews.c:1775
+msgid ""
+"\n"
+"No articles in this group.\n"
+msgstr ""
+"\n"
+"Neniuj artikoloj en ĉi tiu novaĵgrupo.\n"
+
+#: WWW/Library/Implementation/HTNews.c:1787
+msgid ""
+"\n"
+"No articles in this range.\n"
+msgstr ""
+"\n"
+"Neniuj artikoloj en ĉi tiu gamo.\n"
+
+#.
+#. * Set window title.
+#.
+#: WWW/Library/Implementation/HTNews.c:1800
+#, c-format
+msgid "%s, Articles %d-%d"
+msgstr "%s, Artikoloj %d–%d"
+
+#: WWW/Library/Implementation/HTNews.c:1823
+msgid "Earlier articles"
+msgstr "Pli fruaj artikoloj"
+
+#: WWW/Library/Implementation/HTNews.c:1836
+#, c-format
+msgid ""
+"\n"
+"There are about %d articles currently available in %s, IDs as follows:\n"
+"\n"
+msgstr ""
+"\n"
+"Ekzistas proksimume %d artikloj en %s, identigiloj sekvas:\n"
+"\n"
+
+#: WWW/Library/Implementation/HTNews.c:1898
+msgid "All available articles in "
+msgstr "Ĉiuj disponeblaj artikoloj en "
+
+#: WWW/Library/Implementation/HTNews.c:2112
+msgid "Later articles"
+msgstr "Pli malfruaj artikoloj"
+
+#: WWW/Library/Implementation/HTNews.c:2135
+msgid "Post to "
+msgstr "AfiÅi al "
+
+#: WWW/Library/Implementation/HTNews.c:2356
+msgid "This client does not contain support for SNEWS URLs."
+msgstr "Ĉi tiu kliento ne enhavas regon por URL-oj de SNEWS."
+
+#: WWW/Library/Implementation/HTNews.c:2565
+msgid "No target for raw text!"
+msgstr "Neniu celo por kruda teksto!"
+
+#: WWW/Library/Implementation/HTNews.c:2595
+msgid "Connecting to NewsHost ..."
+msgstr "Konektanta al novaĵgrupa retnodo..."
+
+#: WWW/Library/Implementation/HTNews.c:2647
+#, c-format
+msgid "Could not access %s."
+msgstr "Ne povis atingi servilon %s."
+
+#: WWW/Library/Implementation/HTNews.c:2753
+#, c-format
+msgid "Can't read news info. News host %.20s responded: %.200s"
+msgstr "Ne povis legi informojn. Gastiganto %.20s respondis: %.200s"
+
+#: WWW/Library/Implementation/HTNews.c:2757
+#, c-format
+msgid "Can't read news info, empty response from host %s"
+msgstr "Ne eblas legi informojn. Vaka respondo de retnodo %s"
+
+#.
+#. * List available newsgroups. - FM
+#.
+#: WWW/Library/Implementation/HTNews.c:2961
+msgid "Reading list of available newsgroups."
+msgstr "Leganta liston de disponeblaj novaĵgrupoj."
+
+#: WWW/Library/Implementation/HTNews.c:2982
+msgid "Reading list of articles in newsgroup."
+msgstr "Leganta liston de artikolojn en novaĵgrupo."
+
+#.
+#. * Get an article from a news group. - FM
+#.
+#: WWW/Library/Implementation/HTNews.c:2988
+msgid "Reading news article."
+msgstr "Leganta novaĵgrupan artiklon."
+
+#: WWW/Library/Implementation/HTNews.c:3018
+msgid "Sorry, could not load requested news."
+msgstr "BedaÅ­rinde ne povis ÅarÄi la peton."
+
+#: WWW/Library/Implementation/HTTCP.c:1339
+msgid "Address has invalid port"
+msgstr "URL havas nevalidan pordon"
+
+#: WWW/Library/Implementation/HTTCP.c:1410
+msgid "Address length looks invalid"
+msgstr "URL-longo Åajnas nevalida"
+
+#: WWW/Library/Implementation/HTTCP.c:1868
+msgid "SOCKS5: no hostname found."
+msgstr "SOCKS5: neniu retnodnomo troveblas."
+
+#: WWW/Library/Implementation/HTTCP.c:1874
+msgid "SOCKS5: hostname too long."
+msgstr "SOCKS5: retnodnomo tro longas."
+
+#: WWW/Library/Implementation/HTTCP.c:1892
+#, c-format
+msgid "(for %s at %s) SOCKS5"
+msgstr "(por %s ĉe %s) SOCKS5"
+
+#: WWW/Library/Implementation/HTTCP.c:1919
+#: WWW/Library/Implementation/HTTCP.c:1936
+#, c-format
+msgid "Unable to locate remote host %s."
+msgstr "Ne eblas loki foran retnodon %s."
+
+#. Not HTProgress, so warning won't be overwritten immediately;
+#. * but not HTAlert, because typically there will be other
+#. * alerts from the callers. - kw
+#.
+#: WWW/Library/Implementation/HTTCP.c:1933
+#: WWW/Library/Implementation/HTTelnet.c:115
+#, c-format
+msgid "Invalid hostname %s"
+msgstr "Nevalida retnodonomo %s"
+
+#: WWW/Library/Implementation/HTTCP.c:1945
+#, c-format
+msgid "Making %s connection to %s"
+msgstr "Faranta konekto-tipon %s al %s"
+
+#: WWW/Library/Implementation/HTTCP.c:1955
+msgid "socket failed."
+msgstr "konektingo malsukcesis."
+
+#: WWW/Library/Implementation/HTTCP.c:1969
+#, c-format
+msgid "socket failed: family %d addr %s port %s."
+msgstr "konektingo malsukcesis: familio %d adreso %s pordo %s."
+
+#: WWW/Library/Implementation/HTTCP.c:1992
+msgid "Could not make connection non-blocking."
+msgstr "Ne eblas fari konekton senbloka."
+
+#: WWW/Library/Implementation/HTTCP.c:2058
+msgid "Connection failed (too many retries)."
+msgstr "Konekto malsukcesis (tro da reprovoj.)"
+
+#: WWW/Library/Implementation/HTTCP.c:2253
+msgid "Could not restore socket to blocking."
+msgstr "Ne povis restarigi konektingon je bloka."
+
+#. RFC 1928: CONNECT request
+#: WWW/Library/Implementation/HTTCP.c:2285
+#, c-format
+msgid "SOCKS5: connecting to %s"
+msgstr "SOCKS5: konektiÄanta al %s"
+
+#: WWW/Library/Implementation/HTTCP.c:2314
+msgid "SOCKS server failure"
+msgstr "SOCKS-servila fiaskis"
+
+#: WWW/Library/Implementation/HTTCP.c:2317
+msgid "connection not allowed by ruleset"
+msgstr "konekto ne permesata per regularo"
+
+#: WWW/Library/Implementation/HTTCP.c:2320
+msgid "network unreachable"
+msgstr "reto neatingebla"
+
+#: WWW/Library/Implementation/HTTCP.c:2323
+msgid "host unreachable"
+msgstr "retnodo neatingebla"
+
+#: WWW/Library/Implementation/HTTCP.c:2326
+msgid "connection refused"
+msgstr "konekto malakceptita"
+
+#: WWW/Library/Implementation/HTTCP.c:2329
+msgid "TTL expired"
+msgstr "VivdaÅ­ro eksvalidiÄis"
+
+#: WWW/Library/Implementation/HTTCP.c:2332
+msgid "command not supported"
+msgstr "komando ne komprenita"
+
+#: WWW/Library/Implementation/HTTCP.c:2335
+msgid "address type not supported"
+msgstr "adreso-tipo ne komprenita"
+
+#: WWW/Library/Implementation/HTTCP.c:2338
+msgid "unknown SOCKS error code"
+msgstr "nekonata SOCKS-erarkodo"
+
+#: WWW/Library/Implementation/HTTCP.c:2383
+msgid "unexpected reply\n"
+msgstr "neatendita respondo\n"
+
+#: WWW/Library/Implementation/HTTCP.c:2460
+msgid "Socket read failed (too many tries)."
+msgstr "Legado de konektingo malsukcesis (tro da provoj)."
+
+#: WWW/Library/Implementation/HTTP.c:165
+#, c-format
+msgid "SSL callback:%s, preverify_ok=%d, ssl_okay=%d"
+msgstr "SSL-revoko: %s, prevarify_ok=%d, ssl_okay=%d"
+
+#: WWW/Library/Implementation/HTTP.c:668
+#, c-format
+msgid "User/password contains only punctuation: %s"
+msgstr "Salutnomo/pasvorto enhavas nur interpunkcion: %s"
+
+#: WWW/Library/Implementation/HTTP.c:672
+#, c-format
+msgid "User/password may be confused with hostname: '%s' (e.g, '%s')"
+msgstr "Salutnomo/pasvorton konfuzeblas kun retnodnomon: '%s' (ekz-e '%s')"
+
+#: WWW/Library/Implementation/HTTP.c:733
+#, c-format
+msgid "Certificate issued by: %s"
+msgstr "Atestilo eldonita de %s"
+
+#: WWW/Library/Implementation/HTTP.c:922
+msgid "This client does not contain support for HTTPS URLs."
+msgstr "Ĉi tiu kliento ne enhavas regon por URL-oj de HTTPS."
+
+#: WWW/Library/Implementation/HTTP.c:947
+msgid "Unable to connect to remote host."
+msgstr "Ne eblas konektiÄi al fora retnodo."
+
+#: WWW/Library/Implementation/HTTP.c:990
+msgid "Retrying connection without TLS."
+msgstr "Reprovanta konekton sen TLS."
+
+#: WWW/Library/Implementation/HTTP.c:1042
+msgid "GnuTLS error when trying to verify certificate."
+msgstr "GNUTLS-eraro dum provi kontroli atestilon."
+
+#: WWW/Library/Implementation/HTTP.c:1055
+msgid "the certificate has no known issuer"
+msgstr "la atestilo havas neniun konatan eldoninton"
+
+#: WWW/Library/Implementation/HTTP.c:1057
+msgid "no issuer was found"
+msgstr "neniu eldoninto troviÄis"
+
+#: WWW/Library/Implementation/HTTP.c:1059
+msgid "issuer is not a CA"
+msgstr "eldoninto ne oficiala"
+
+#: WWW/Library/Implementation/HTTP.c:1061
+msgid "the certificate has been revoked"
+msgstr "la atestilo estas forprenita"
+
+#: WWW/Library/Implementation/HTTP.c:1063
+msgid "the certificate is not trusted"
+msgstr "la atestilo ne estas fidinda"
+
+#: WWW/Library/Implementation/HTTP.c:1138
+#, c-format
+msgid "Verified connection to %s (cert=%s)"
+msgstr "Kontrolita konekto al %s (cert=%s)"
+
+#: WWW/Library/Implementation/HTTP.c:1188
+#: WWW/Library/Implementation/HTTP.c:1230
+#, c-format
+msgid "Verified connection to %s (subj=%s)"
+msgstr "Kontrolita konekto al %s (subj=%s)"
+
+#: WWW/Library/Implementation/HTTP.c:1260
+msgid "Can't find common name in certificate"
+msgstr "Ne eblas trovi komunan nomon en atestilo"
+
+#: WWW/Library/Implementation/HTTP.c:1263
+#, c-format
+msgid "SSL error:host(%s)!=cert(%s)-Continue?"
+msgstr "SSL-eraro:retnodo(%s)!=cert(%s)-Ĉu daŭri?"
+
+#: WWW/Library/Implementation/HTTP.c:1270
+msgid "SSL error"
+msgstr "SSL-eraro"
+
+#: WWW/Library/Implementation/HTTP.c:1278
+#, c-format
+msgid "UNVERIFIED connection to %s (cert=%s)"
+msgstr "NEKONTROLITA konekto al %s (cert=%s)"
+
+#: WWW/Library/Implementation/HTTP.c:1287
+#, c-format
+msgid "Secure %d-bit %s (%s) HTTP connection"
+msgstr "Sekura %d-bita HTTP-konekto de %s (%s)"
+
+#: WWW/Library/Implementation/HTTP.c:1757
+msgid "Sending HTTP request."
+msgstr "Sendante HTTP-peton."
+
+#: WWW/Library/Implementation/HTTP.c:1799
+msgid "Unexpected network write error; connection aborted."
+msgstr "Neatendita reta skriberaro; konekto ĉesigita."
+
+#: WWW/Library/Implementation/HTTP.c:1805
+msgid "HTTP request sent; waiting for response."
+msgstr "HTTP-peto sendita; atendanta respondon."
+
+#: WWW/Library/Implementation/HTTP.c:1878
+#: WWW/Library/Implementation/HTTP.c:1888
+msgid "Unexpected network read error; connection aborted."
+msgstr "Neatendita reta legeraro; konekto ĉesigita."
+
+#.
+#. * HTTP/1.1 Informational statuses.
+#. * 100 Continue.
+#. * 101 Switching Protocols.
+#. * > 101 is unknown.
+#. * We should never get these, and they have only the status
+#. * line and possibly other headers, so we'll deal with them by
+#. * showing the full header to the user as text/plain. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2091
+msgid "Got unexpected Informational Status."
+msgstr "Ricevis neatenditan informan staton."
+
+#.
+#. * Reset Content. The server has fulfilled the request but
+#. * nothing is returned and we should reset any form
+#. * content. We'll instruct the user to do that, and
+#. * restore the current document. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2125
+msgid "Request fulfilled. Reset Content."
+msgstr "Peto plenumita. Enhavo restarigita."
+
+#. Not Modified
+#.
+#. * We didn't send an "If-Modified-Since" header, so this
+#. * status is inappropriate. We'll deal with it by showing
+#. * the full header to the user as text/plain. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2242
+msgid "Got unexpected 304 Not Modified status."
+msgstr "Ricevis neatenditan staton 304 Ne Modifita"
+
+#: WWW/Library/Implementation/HTTP.c:2305
+msgid "Redirection of POST content requires user approval."
+msgstr "Alidirektado de kaÅita enhavo bezonas aprobon de uzanto."
+
+#: WWW/Library/Implementation/HTTP.c:2320
+msgid "Have POST content. Treating Permanent Redirection as Temporary.\n"
+msgstr "Havi kaÅitan enhavon. Traktanta ĉiaman alidirekton kiel provizoran.\n"
+
+#: WWW/Library/Implementation/HTTP.c:2366
+msgid "Retrying with access authorization information."
+msgstr "Reprovante kun atingo-atestadaj informoj."
+
+#: WWW/Library/Implementation/HTTP.c:2378
+msgid "Show the 401 message body?"
+msgstr "Ĉu montri la mesaÄan korpon?"
+
+#: WWW/Library/Implementation/HTTP.c:2422
+msgid "Show the 407 message body?"
+msgstr "Ĉu montri la mesaÄan korpon?"
+
+#.
+#. * Bad or unknown server_status number. Take a chance and hope
+#. * there is something to display. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2522
+msgid "Unknown status reply from server!"
+msgstr "Nekonata stata respondo el servilo!"
+
+#: WWW/Library/Implementation/HTTelnet.c:113
+#, c-format
+msgid "remote %s session:"
+msgstr "fora seanco %s:"
+
+#: WWW/Library/Implementation/HTWAIS.c:163
+msgid "Could not connect to WAIS server."
+msgstr "Ne povis konektiÄi al WAIS-servilo."
+
+#: WWW/Library/Implementation/HTWAIS.c:171
+msgid "Could not open WAIS connection for reading."
+msgstr "Ne eblas malfermi WAIS-konekton por legi."
+
+#: WWW/Library/Implementation/HTWAIS.c:193
+msgid "Diagnostic code is "
+msgstr "Diagnoza kodo estas "
+
+#: WWW/Library/Implementation/HTWAIS.c:460
+msgid "Index "
+msgstr "Indekso "
+
+#: WWW/Library/Implementation/HTWAIS.c:464
+#, c-format
+msgid " contains the following %d item%s relevant to \""
+msgstr " enhavas la jenajn %d erojn (%s) laÅ­tema al \""
+
+#: WWW/Library/Implementation/HTWAIS.c:472
+msgid "The first figure after each entry is its relative score, "
+msgstr "La unua figuraĵo post ĉiu ero estas Äia relativa totalo, "
+
+#: WWW/Library/Implementation/HTWAIS.c:473
+msgid "the second is the number of lines in the item."
+msgstr "la dua estas la nombro da linioj en la ero."
+
+#: WWW/Library/Implementation/HTWAIS.c:515
+msgid " (bad file name)"
+msgstr " (fuÅa dosiernomo)"
+
+#: WWW/Library/Implementation/HTWAIS.c:541
+msgid "(bad doc id)"
+msgstr "(fuÅa identigilo"
+
+#: WWW/Library/Implementation/HTWAIS.c:557
+msgid "(Short Header record, can't display)"
+msgstr "(Mallonga kapa rikordo, ne eblas montri)"
+
+#: WWW/Library/Implementation/HTWAIS.c:564
+msgid ""
+"\n"
+"Long Header record, can't display\n"
+msgstr ""
+"\n"
+"Longa kapa rikordo, ne eblas montri\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:571
+msgid ""
+"\n"
+"Text record\n"
+msgstr ""
+"\n"
+"Teksta rikordo\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:580
+msgid ""
+"\n"
+"Headline record, can't display\n"
+msgstr ""
+"\n"
+"Rubrika rikordo, ne eblas montri\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:588
+msgid ""
+"\n"
+"Code record, can't display\n"
+msgstr ""
+"\n"
+"Koda rikordo, ne eblas montri\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:692
+msgid "Syntax error in WAIS URL"
+msgstr "Sintaksa eraro en WAIS-URL"
+
+#: WWW/Library/Implementation/HTWAIS.c:764
+msgid " (WAIS Index)"
+msgstr " (WAIS-Indekso)"
+
+#: WWW/Library/Implementation/HTWAIS.c:771
+msgid "WAIS Index: "
+msgstr "WAIS-Indekso: "
+
+#: WWW/Library/Implementation/HTWAIS.c:777
+msgid "This is a link for searching the "
+msgstr "Ĉi tio estas ligilo por serĉi la "
+
+#: WWW/Library/Implementation/HTWAIS.c:781
+msgid " WAIS Index.\n"
+msgstr " WAIS-indekson.\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:810
+msgid ""
+"\n"
+"Enter the 's'earch command and then specify search words.\n"
+msgstr ""
+"\n"
+"Enmutu la 's'erĉan komandon kaj tiam specifu serĉajn vortojn.\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:832
+msgid " (in "
+msgstr " (en "
+
+#: WWW/Library/Implementation/HTWAIS.c:841
+msgid "WAIS Search of \""
+msgstr "WAIS-serĉo de \""
+
+#: WWW/Library/Implementation/HTWAIS.c:845
+msgid "\" in: "
+msgstr "\" en: "
+
+#: WWW/Library/Implementation/HTWAIS.c:860
+msgid "HTWAIS: Request too large."
+msgstr "HTWAIS: Petro tro granda."
+
+#: WWW/Library/Implementation/HTWAIS.c:869
+msgid "Searching WAIS database..."
+msgstr "Serĉanta WAIS-datumbazon..."
+
+#: WWW/Library/Implementation/HTWAIS.c:879
+msgid "Search interrupted."
+msgstr "Serĉo interrompita."
+
+#: WWW/Library/Implementation/HTWAIS.c:930
+msgid "Can't convert format of WAIS document"
+msgstr "Ne eblas konverti formaton de WAIS-dokumento"
+
+#: WWW/Library/Implementation/HTWAIS.c:974
+msgid "HTWAIS: Request too long."
+msgstr "HTWAIS: Peto tro longa."
+
+#.
+#. * Actually do the transaction given by request_message.
+#.
+#: WWW/Library/Implementation/HTWAIS.c:988
+msgid "Fetching WAIS document..."
+msgstr "Atinganta WAIS-dokumenton..."
+
+#. display_search_response(target, retrieval_response,
+#. wais_database, keywords);
+#: WWW/Library/Implementation/HTWAIS.c:1027
+msgid "No text was returned!\n"
+msgstr "Neniu teksto estis redonita!\n"
+
+#: WWW/Library/Implementation/HTWSRC.c:302
+msgid " NOT GIVEN in source file; "
+msgstr " NE DONITA en fontoteksta dosiero; "
+
+#: WWW/Library/Implementation/HTWSRC.c:325
+msgid " WAIS source file"
+msgstr "WAIS-a fontoteksta dosiero"
+
+#: WWW/Library/Implementation/HTWSRC.c:332
+msgid " description"
+msgstr " priskribo"
+
+#: WWW/Library/Implementation/HTWSRC.c:342
+msgid "Access links"
+msgstr "Atingaj ligiloj"
+
+#: WWW/Library/Implementation/HTWSRC.c:363
+msgid "Direct access"
+msgstr "Rekta atingo"
+
+#. * Proxy will be used if defined, so let user know that - FM *
+#: WWW/Library/Implementation/HTWSRC.c:366
+msgid " (or via proxy server, if defined)"
+msgstr " (aÅ­ per prokurilo, se difinita)"
+
+#: WWW/Library/Implementation/HTWSRC.c:381
+msgid "Maintainer"
+msgstr "Prizorganto"
+
+#: WWW/Library/Implementation/HTWSRC.c:389
+msgid "Host"
+msgstr "Gastiganto"
+
+#: src/GridText.c:723
+msgid "Memory exhausted, display interrupted!"
+msgstr "Memoro eluzita, montrado interrompita!"
+
+#: src/GridText.c:728
+msgid "Memory exhausted, will interrupt transfer!"
+msgstr "Memoro eluzita, interrompos transigon!"
+
+#: src/GridText.c:1719
+#, c-format
+msgid " (l%d of %d)"
+msgstr " (l%d el %d)"
+
+#: src/GridText.c:1728
+#, c-format
+msgid " (p%d of %d)"
+msgstr " (p%d el %d)"
+
+#: src/GridText.c:3720
+msgid " *** MEMORY EXHAUSTED ***"
+msgstr "*** MEMORO ELUZITA ***"
+
+#: src/GridText.c:6220
+msgid "text entry field"
+msgstr "teksta kampo"
+
+#: src/GridText.c:6223
+msgid "password entry field"
+msgstr "pasvorta kampo"
+
+#: src/GridText.c:6226
+msgid "checkbox"
+msgstr "markobutono"
+
+#: src/GridText.c:6229
+msgid "radio button"
+msgstr "radiobutono"
+
+#: src/GridText.c:6232
+msgid "submit button"
+msgstr "sendobutono"
+
+#: src/GridText.c:6235
+msgid "reset button"
+msgstr "restarigobutono"
+
+#: src/GridText.c:6238
+msgid "script button"
+msgstr "skripta butono"
+
+#: src/GridText.c:6241
+msgid "popup menu"
+msgstr "Åprucmenuo"
+
+#: src/GridText.c:6244
+msgid "hidden form field"
+msgstr "kaÅita kampo"
+
+#: src/GridText.c:6247
+msgid "text entry area"
+msgstr "tekstregiono"
+
+#: src/GridText.c:6250
+msgid "range entry field"
+msgstr "gama kampo"
+
+#: src/GridText.c:6253
+msgid "file entry field"
+msgstr "dosiera kampo"
+
+#: src/GridText.c:6256
+msgid "text-submit field"
+msgstr "teksta sendobutono"
+
+#: src/GridText.c:6259
+msgid "image-submit button"
+msgstr "bilda sendobutono"
+
+#: src/GridText.c:6262
+msgid "keygen field"
+msgstr "Ålosila kampo"
+
+#: src/GridText.c:6265
+msgid "unknown form field"
+msgstr "nekonata kampo"
+
+#: src/GridText.c:6285 src/GridText.c:6292 src/LYList.c:249
+msgid "unknown field or link"
+msgstr "nekonata kampo aÅ­ ligilo"
+
+#: src/GridText.c:10722
+msgid "Can't open file for uploading"
+msgstr "Ne eblas malfermi dosieron por alÅuti"
+
+#: src/GridText.c:11910
+#, c-format
+msgid "Submitting %s"
+msgstr "Sendante je %s"
+
+#. ugliness has happened; inform user and do the best we can
+#: src/GridText.c:12980
+msgid "Hang Detect: TextAnchor struct corrupted - suggest aborting!"
+msgstr "Eraro: rikordo TextAnchor fuÅita - proponas ĉesigi!"
+
+#. don't show previous state
+#: src/GridText.c:13139
+msgid "Wrap lines to fit displayed area?"
+msgstr "Ĉu linifaldi por plenigi montritan regionon?"
+
+#: src/GridText.c:13772
+msgid "Very long lines have been truncated!"
+msgstr "Tre longaj linioj estis mallongigitaj!"
+
+#: src/HTAlert.c:164 src/LYShowInfo.c:389 src/LYShowInfo.c:393
+msgid "bytes"
+msgstr "bajtoj"
+
+#.
+#. * If we know the total size of the file, we can compute
+#. * a percentage, and show a corresponding progress bar.
+#.
+#: src/HTAlert.c:328 src/HTAlert.c:354
+#, c-format
+msgid "Read %s of data"
+msgstr "Legita %s da datumo"
+
+#: src/HTAlert.c:351
+#, c-format
+msgid "Read %s of %s of data"
+msgstr "Legita %s el %s da datumo"
+
+#: src/HTAlert.c:360
+#, c-format
+msgid ", %s/sec"
+msgstr ", %s en sekundo"
+
+#: src/HTAlert.c:374
+#, c-format
+msgid " (stalled for %s)"
+msgstr " (paÅ­zanta dum %s)"
+
+#: src/HTAlert.c:378
+#, c-format
+msgid ", ETA %s"
+msgstr ", aproksimate je %s"
+
+#: src/HTAlert.c:400
+msgid " (Press 'z' to abort)"
+msgstr " (Premu 'z' por ĉesigi)"
+
+#. Meta-note: don't move the following note from its place right
+#. in front of the first gettext(). As it is now, it should
+#. automatically appear in generated lynx.pot files. - kw
+#.
+#. NOTE TO TRANSLATORS: If you provide a translation for "yes", lynx
+#. * will take the first byte of the translation as a positive response
+#. * to Yes/No questions. If you provide a translation for "no", lynx
+#. * will take the first byte of the translation as a negative response
+#. * to Yes/No questions. For both, lynx will also try to show the
+#. * first byte in the prompt as a character, instead of (y) or (n),
+#. * respectively. This will not work right for multibyte charsets!
+#. * Don't translate "yes" and "no" for CJK character sets (or translate
+#. * them to "yes" and "no"). For a translation using UTF-8, don't
+#. * translate if the translation would begin with anything but a 7-bit
+#. * (US_ASCII) character. That also means do not translate if the
+#. * translation would begin with anything but a 7-bit character, if
+#. * you use a single-byte character encoding (a charset like ISO-8859-n)
+#. * but anticipate that the message catalog may be used re-encoded in
+#. * UTF-8 form.
+#. * For translations using other character sets, you may also wish to
+#. * leave "yes" and "no" untranslated, if using (y) and (n) is the
+#. * preferred behavior.
+#. * Lynx will also accept y Y n N as responses unless there is a conflict
+#. * with the first letter of the "yes" or "no" translation.
+#.
+#: src/HTAlert.c:438 src/HTAlert.c:486
+msgid "yes"
+msgstr "jes"
+
+#: src/HTAlert.c:441 src/HTAlert.c:487
+msgid "no"
+msgstr "ne"
+
+#.
+#. * Special-purpose workaround for gettext support (we should do
+#. * this in a more general way) -TD
+#. *
+#. * NOTE TO TRANSLATORS: If the prompt has been rendered into
+#. * another language, and if yes/no are distinct, assume the
+#. * translator can make an ordered list in parentheses with one
+#. * capital letter for each as we assumed in HTConfirmDefault().
+#. * The list has to be in the same order as in the original message,
+#. * and the four capital letters chosen to not match those in the
+#. * original unless they have the same position.
+#. *
+#. * Example:
+#. * (Y/N/Always/neVer) - English (original)
+#. * (O/N/Toujours/Jamais) - French
+#.
+#: src/HTAlert.c:938
+msgid "Y/N/A/V"
+msgstr "J/N/A/E"
+
+#: src/HTML.c:5769
+msgid "Description:"
+msgstr "Priskribo:"
+
+#: src/HTML.c:5774
+msgid "(none)"
+msgstr "(neniu)"
+
+#: src/HTML.c:5778
+msgid "Filepath:"
+msgstr "Dosiervojo:"
+
+#: src/HTML.c:5784
+msgid "(unknown)"
+msgstr "(nekonata)"
+
+#: src/HTML.c:7224
+msgid "Document has only hidden links. Use the 'l'ist command."
+msgstr "Dokumento havas nur kaÅitajn ligilojn. Uzu la komandon 'l'istigi."
+
+#: src/HTML.c:7725
+msgid "Source cache error - disk full?"
+msgstr "Eraro ĉe fontoteksta tenejo - ĉu disko plenigita?"
+
+#: src/HTML.c:7738
+msgid "Source cache error - not enough memory!"
+msgstr "Eraro ĉe fontoteksta tenejo - ne sufiĉo da memoro"
+
+#: src/LYBookmark.c:167
+msgid ""
+" This file is an HTML representation of the X Mosaic hotlist file.\n"
+" Outdated or invalid links may be removed by using the\n"
+" remove bookmark command, it is usually the 'R' key but may have\n"
+" been remapped by you or your system administrator."
+msgstr ""
+" Ĉi tiu dosiero estas HTML-prezento de la legosignoj de X Mosaic.\n"
+" Malmodernaj aÅ­ nevalidaj ligiloj povas esti forigitaj per uzi la\n"
+" komandon 'forigi legosignon'. Ordinare Äi estas la klavo\n"
+" 'R', sed eble vi aÅ­ via sistemestro ÅanÄis Äin."
+
+#: src/LYBookmark.c:380
+#, c-format
+msgid ""
+" You can delete links by the 'R' key<br>\n"
+"<ol>\n"
+msgstr ""
+" Vi povas forigi ligilojn per la klavo 'R'<br>\n"
+"<ol>\n"
+
+#: src/LYBookmark.c:383
+msgid ""
+" You can delete links using the remove bookmark command. It is usually\n"
+" the 'R' key but may have been remapped by you or your system\n"
+" administrator."
+msgstr ""
+" Vi povas forigi ligilojn uzante la komandon 'forigi legosignon'. Äœi ordinare\n"
+" estas la klavo 'R', sed eble vi aÅ­ via sistemestro ÅanÄis Äin."
+
+#: src/LYBookmark.c:387
+msgid ""
+" This file also may be edited with a standard text editor to delete\n"
+" outdated or invalid links, or to change their order."
+msgstr ""
+" Oni povas ankaŭ redakti ĉi tiun dosieron per ordinara tekstoredaktilo por forigi\n"
+" malaktualajn aÅ­ nevalidajn ligilojn aÅ­ por ÅanÄi ilian ordon."
+
+#: src/LYBookmark.c:390
+msgid ""
+"Note: if you edit this file manually\n"
+" you should not change the format within the lines\n"
+" or add other HTML markup.\n"
+" Make sure any bookmark link is saved as a single line."
+msgstr ""
+"Noto: Se vi redaktus ĉi tiun dosieron permane\n"
+" vi devas ne ÅanÄi la aranÄon en la linioj\n"
+" aÅ­ aldoni aliajn HTML-markojn.\n"
+" Certigu, ke legosigna ligilo estas en precize unu linio."
+
+#: src/LYBookmark.c:686
+#, c-format
+msgid "File may be recoverable from %s during this session"
+msgstr "Dosiero eble ne restarigebla de %s dum ĉi tiu seanco"
+
+#: src/LYCgi.c:161
+#, c-format
+msgid "Do you want to execute \"%s\"?"
+msgstr "Ĉu vi volas plenumigi la programon \"%s\"?"
+
+#.
+#. * Neither the path as given nor any components examined by backing up
+#. * were stat()able. - kw
+#.
+#: src/LYCgi.c:276
+msgid "Unable to access cgi script"
+msgstr "Ne eblas atingi CGI-programeton."
+
+#: src/LYCgi.c:709 src/LYCgi.c:712
+msgid "Good Advice"
+msgstr "Bona konsilo"
+
+#: src/LYCgi.c:716
+msgid "An excellent http server for VMS is available via"
+msgstr "Bonega HTTP-servilo por VMS disponeblas per"
+
+#: src/LYCgi.c:723
+msgid "this link"
+msgstr "ĉi tiu ligilo"
+
+#: src/LYCgi.c:727
+msgid "It provides state of the art CGI script support.\n"
+msgstr "Äœi havigas nevenkeblan regadon de CGI-programetoj.\n"
+
+#: src/LYClean.c:115
+msgid "Exiting via interrupt:"
+msgstr "Eliranta per interrompo:"
+
+#: src/LYCookie.c:2651
+msgid "(from a previous session)"
+msgstr "(el eksa seanco)"
+
+#: src/LYCookie.c:2712
+msgid "Maximum Gobble Date:"
+msgstr "(maksimuma voranta dato:"
+
+#: src/LYCookie.c:2751
+msgid "Internal"
+msgstr "Interna"
+
+#: src/LYCookie.c:2752
+msgid "cookie_domain_flag_set error, aborting program"
+msgstr "eraro cookie_domain_flag_set, eliranta programon"
+
+#: src/LYCurses.c:1136
+msgid "Terminal reinitialisation failed - unknown terminal type?"
+msgstr "Terminala restartigo malsukcesis - ĉu nekonata terminala tipo?"
+
+#: src/LYCurses.c:1343
+msgid "Terminal initialisation failed - unknown terminal type?"
+msgstr "Terminala startigo malsukcesis - ĉu nekonata terminala tipo?"
+
+#: src/LYCurses.c:1837
+msgid "Terminal ="
+msgstr "Terminalo ="
+
+#: src/LYCurses.c:1841
+msgid "You must use a vt100, 200, etc. terminal with this program."
+msgstr "Vi devas uzi terminalon vt100, 200 ktp kun ĉi tiu programo."
+
+#: src/LYCurses.c:1890
+msgid "Your Terminal type is unknown!"
+msgstr "Via terminala tipo estas nekonata!"
+
+#: src/LYCurses.c:1891
+msgid "Enter a terminal type:"
+msgstr "Enmetu terminalan tipon:"
+
+#: src/LYCurses.c:1905
+msgid "TERMINAL TYPE IS SET TO"
+msgstr "TERMINALA TIPO ESTAS AGORDITA AL"
+
+#: src/LYCurses.c:2464
+#, c-format
+msgid ""
+"\n"
+"A Fatal error has occurred in %s Ver. %s\n"
+msgstr ""
+"\n"
+"Paneanta eraro okazis en %s Eldono %s\n"
+
+#: src/LYCurses.c:2467
+#, c-format
+msgid ""
+"\n"
+"Please notify your system administrator to confirm a bug, and if\n"
+"confirmed, to notify the lynx-dev list. Bug reports should have concise\n"
+"descriptions of the command and/or URL which causes the problem, the\n"
+"operating system name with version number, the TCPIP implementation, the\n"
+"TRACEBACK if it can be captured, and any other relevant information.\n"
+msgstr ""
+"\n"
+"Bonvolo sciigi vian sistemestron por konfirmi eraron, kaj se\n"
+"konfirmita, sciigi la dissendoliston lynx-dev. Eraraj raportoj havu koncizajn\n"
+"priskribojn de la komando kajaÅ­ URL, kio kaÅ­zis la problemon, la\n"
+"operaciuma nomo kaj eldonnumero, kaj aliaj koncernaj informoj.\n"
+
+#: src/LYEdit.c:272
+#, c-format
+msgid "Error starting editor, %s"
+msgstr "Eraro dum plenumigi tekstoredaktilon %s"
+
+#: src/LYEdit.c:275
+msgid "Editor killed by signal"
+msgstr "Tekstoredaktilo ĉesigita per signalo"
+
+#: src/LYEdit.c:280
+#, c-format
+msgid "Editor returned with error status %s"
+msgstr "Tekstoredaktilo redonis erarstaton %s"
+
+#: src/LYDownload.c:511
+msgid "Downloaded link:"
+msgstr "ElÅuta ligilo:"
+
+#: src/LYDownload.c:516
+msgid "Suggested file name:"
+msgstr "Proponita dosiernomo:"
+
+#: src/LYDownload.c:521
+msgid "Standard download options:"
+msgstr "Ordinaraj elÅutaj elektoj:"
+
+#: src/LYDownload.c:522
+msgid "Download options:"
+msgstr "ElÅutaj elektoj:"
+
+#: src/LYDownload.c:538
+msgid "Save to disk"
+msgstr "Konservi al disko"
+
+#: src/LYDownload.c:552
+msgid "View temporary file"
+msgstr "Vidi provizoran dosieron"
+
+#: src/LYDownload.c:559
+msgid "Save to disk disabled."
+msgstr "Konservado al disko malaktivigita."
+
+#: src/LYDownload.c:563 src/LYPrint.c:1331
+msgid "Local additions:"
+msgstr "Lokaj aldonoj:"
+
+#: src/LYDownload.c:574 src/LYUpload.c:206
+msgid "No Name Given"
+msgstr "Neniu nomo donita"
+
+#: src/LYHistory.c:673
+msgid "You selected:"
+msgstr "Vi elektis:"
+
+#: src/LYHistory.c:697 src/LYHistory.c:926
+msgid "(no address)"
+msgstr "(neniu adreso)"
+
+#: src/LYHistory.c:701
+msgid " (internal)"
+msgstr "(interna)"
+
+#: src/LYHistory.c:703
+msgid " (was internal)"
+msgstr " (estis interna)"
+
+#: src/LYHistory.c:801
+msgid " (From History)"
+msgstr "(El Historio)"
+
+#: src/LYHistory.c:846
+msgid "You visited (POSTs, bookmark, menu and list files excluded):"
+msgstr "Vi vizitis (kaÅaj petoj, legosigno, menuo kaj listoj ne estas inkluzivitaj):"
+
+#: src/LYHistory.c:1148
+msgid "(No messages yet)"
+msgstr "(AnkoraÅ­ neniuj mesaÄoj)"
+
+#: src/LYLeaks.c:222
+msgid "Invalid pointer detected."
+msgstr "Nevalida montrilo malkovrita."
+
+#: src/LYLeaks.c:224 src/LYLeaks.c:262
+msgid "Sequence:"
+msgstr "Sinsekvo:"
+
+#: src/LYLeaks.c:227 src/LYLeaks.c:265
+msgid "Pointer:"
+msgstr "Montrilo:"
+
+#: src/LYLeaks.c:236 src/LYLeaks.c:243 src/LYLeaks.c:284
+msgid "FileName:"
+msgstr "Dosiernomo:"
+
+#: src/LYLeaks.c:239 src/LYLeaks.c:246 src/LYLeaks.c:287 src/LYLeaks.c:298
+msgid "LineCount:"
+msgstr "Nombro da linioj:"
+
+#: src/LYLeaks.c:260
+msgid "Memory leak detected."
+msgstr "Memorliko malkovrita."
+
+#: src/LYLeaks.c:268
+msgid "Contains:"
+msgstr "Enhavas:"
+
+#: src/LYLeaks.c:281
+msgid "ByteSize:"
+msgstr "Bajta grando:"
+
+#: src/LYLeaks.c:295
+msgid "realloced:"
+msgstr "reokupita:"
+
+#: src/LYLeaks.c:316
+msgid "Total memory leakage this run:"
+msgstr "Totala memorlekado dum ĉi tiu plenumado:"
+
+#: src/LYLeaks.c:320
+msgid "Peak allocation"
+msgstr "Kulmina okupado"
+
+#: src/LYLeaks.c:322
+msgid "Bytes allocated"
+msgstr "Bajtoj okupitaj"
+
+#: src/LYLeaks.c:324
+msgid "Total mallocs"
+msgstr "Totalaj okupadoj"
+
+#: src/LYLeaks.c:326
+msgid "Total frees"
+msgstr "Totalaj malokupadoj"
+
+#: src/LYList.c:89
+msgid "References in "
+msgstr "Referencoj en "
+
+#: src/LYList.c:92
+msgid "this document:"
+msgstr "ĉi tiu dokumento:"
+
+#: src/LYList.c:98 src/LYList.c:363
+msgid "Visible links:"
+msgstr "Videblaj ligiloj:"
+
+#: src/LYList.c:202 src/LYList.c:322
+msgid "Hidden links:"
+msgstr "KaÅitaj ligiloj:"
+
+#: src/LYList.c:359
+msgid "References"
+msgstr "Referencoj"
+
+#: src/LYLocal.c:289
+#, c-format
+msgid "Unable to get status of '%s'."
+msgstr "Ne eblas atingi staton de '%s'."
+
+#: src/LYLocal.c:354
+msgid "The selected item is not a file or a directory! Request ignored."
+msgstr "La elektita ero ne estas dosiero aÅ­ dosierujo. Peto ignorita."
+
+#: src/LYLocal.c:456
+#, c-format
+msgid "Unable to %s due to system error!"
+msgstr "Ne eblas ĉe %s pro sistemaj eraroj!"
+
+#: src/LYLocal.c:490
+#, c-format
+msgid "Probable failure to %s due to system error!"
+msgstr "VerÅajna fiasko ĉe %s pro sistemaj eraroj!"
+
+#: src/LYLocal.c:555 src/LYLocal.c:578
+#, c-format
+msgid "remove %s"
+msgstr "forigi je %s"
+
+#: src/LYLocal.c:598
+#, c-format
+msgid "touch %s"
+msgstr "tuÅi je %s"
+
+#: src/LYLocal.c:628
+#, c-format
+msgid "move %s to %s"
+msgstr "movi je %s al %s"
+
+#: src/LYLocal.c:676
+msgid "There is already a directory with that name! Request ignored."
+msgstr "Jam ekzistas dosierujo kun tiu nomo. Peto ignorita."
+
+#: src/LYLocal.c:678
+msgid "There is already a file with that name! Request ignored."
+msgstr "Jam ekzistas dosiero kun tiu nomo! Peto ignorita"
+
+#: src/LYLocal.c:680
+msgid "The specified name is already in use! Request ignored."
+msgstr "La specifa nomo jam estas uzita! Peto ignorita."
+
+#: src/LYLocal.c:692
+msgid "Destination has different owner! Request denied."
+msgstr "Celo havas malsaman estron! Peto rifuzita."
+
+#: src/LYLocal.c:695
+msgid "Destination is not a valid directory! Request denied."
+msgstr "Celo ne estas valida dosierujo. Peto rifuzita."
+
+#: src/LYLocal.c:711
+msgid "Source and destination are the same location! Request ignored!"
+msgstr "Fonto kaj celo estas la sama loko! Peto ignorita!"
+
+#: src/LYLocal.c:735
+msgid "Remove all tagged files and directories?"
+msgstr "Ĉu forigi ĉiujn markitajn dosier(uj)ojn?"
+
+#: src/LYLocal.c:808
+msgid "Enter new location for tagged items: "
+msgstr "Enmetu novan lokon por markitaj eroj: "
+
+#: src/LYLocal.c:906
+msgid "Enter new name for directory: "
+msgstr "Enmetu nomon por nova dosierujo: "
+
+#: src/LYLocal.c:908
+msgid "Enter new name for file: "
+msgstr "Enmetu novan nomon por dosiero: "
+
+#: src/LYLocal.c:920
+msgid "Illegal character (path-separator) found! Request ignored."
+msgstr "Nevalida signo (voja apartigilo) trovita! Peto ignorita."
+
+#: src/LYLocal.c:970
+msgid "Enter new location for directory: "
+msgstr "Enmetu novan lokon por dosierujo: "
+
+#: src/LYLocal.c:972
+msgid "Enter new location for file: "
+msgstr "Enmetu novan lokon por dosiero: "
+
+#: src/LYLocal.c:999
+msgid "Unexpected failure - unable to find trailing path separator"
+msgstr "Neatendita fiasko - ne eblas trovi antaÅ­vojan apartigilon"
+
+#: src/LYLocal.c:1061
+msgid "Modify name, location, or permission (n, l, or p): "
+msgstr "Modifi nomon, lokon aÅ­ permeson (n,l,p): "
+
+#: src/LYLocal.c:1063
+msgid "Modify name or location (n or l): "
+msgstr "Modifi nomon aÅ­ lokon (n aÅ­ l): "
+
+#.
+#. * Code for changing ownership needed here.
+#.
+#: src/LYLocal.c:1092
+msgid "This feature not yet implemented!"
+msgstr "Tiu trajto ne jam estas realigita!"
+
+#: src/LYLocal.c:1113
+msgid "Enter name of file to create: "
+msgstr "Enmetu nomon de dosiero por krei: "
+
+#: src/LYLocal.c:1116 src/LYLocal.c:1153
+msgid "Illegal redirection \"//\" found! Request ignored."
+msgstr "Nevalida alidirektado \"//\" trovita! Peto ignorita."
+
+#: src/LYLocal.c:1150
+msgid "Enter name for new directory: "
+msgstr "Enmetu nomon por nova dosierujo: "
+
+#: src/LYLocal.c:1191
+msgid "Create file or directory (f or d): "
+msgstr "Krei dosieron aÅ­ dosierujon (f aÅ­ d): "
+
+#: src/LYLocal.c:1233
+#, c-format
+msgid "Remove directory '%s'?"
+msgstr "Ĉu forigi dosierujon '%s'?"
+
+#: src/LYLocal.c:1236
+msgid "Remove directory?"
+msgstr "Ĉu forigi dosierujon?"
+
+#: src/LYLocal.c:1241
+#, c-format
+msgid "Remove file '%s'?"
+msgstr "Ĉu forigi dosieron '%s'?"
+
+#: src/LYLocal.c:1243
+msgid "Remove file?"
+msgstr "Ĉu forigi dosieron?"
+
+#: src/LYLocal.c:1248
+#, c-format
+msgid "Remove symbolic link '%s'?"
+msgstr "Ĉu forigi molan ligilon '%s'?"
+
+#: src/LYLocal.c:1250
+msgid "Remove symbolic link?"
+msgstr "Ĉu forigi molan ligilon?"
+
+#: src/LYLocal.c:1348
+msgid "Sorry, don't know how to permit non-UNIX files yet."
+msgstr "BedaÅ­rinde ne scias kiel permesi dosierojn ekster Unikso."
+
+#: src/LYLocal.c:1377
+msgid "Unable to open permit options file"
+msgstr "Ne eblas malfermi permesan dosieron"
+
+#: src/LYLocal.c:1405
+msgid "Specify permissions below:"
+msgstr "Specifi permesojn sube:"
+
+#: src/LYLocal.c:1406 src/LYShowInfo.c:291
+msgid "Owner:"
+msgstr "Estro:"
+
+#: src/LYLocal.c:1422
+msgid "Group"
+msgstr "Grupo"
+
+#: src/LYLocal.c:1438
+msgid "Others:"
+msgstr "Aliaj:"
+
+#: src/LYLocal.c:1456
+msgid "form to permit"
+msgstr "formulario por permesi:"
+
+#: src/LYLocal.c:1552
+msgid "Invalid mode format."
+msgstr "Nevalida reÄima formato."
+
+#: src/LYLocal.c:1556
+msgid "Invalid syntax format."
+msgstr "Nevalida sintaksa formato."
+
+#: src/LYLocal.c:1743
+msgid "Warning! UUDecoded file will exist in the directory you started Lynx."
+msgstr "Averto! UUDecoded-dosiero ekzistos en la dosierujo en kiu vi plenumigis Lynx."
+
+#: src/LYLocal.c:1933
+msgid "NULL URL pointer"
+msgstr "Nula URL-montrilo"
+
+#: src/LYLocal.c:2015
+#, c-format
+msgid "Executing %s "
+msgstr "Plenumanta je %s "
+
+#: src/LYLocal.c:2018
+msgid "Executing system command. This might take a while."
+msgstr "Plenumanta sisteman komandon. Tio eble estos malrapida."
+
+#: src/LYLocal.c:2092
+msgid "Current directory:"
+msgstr "Nuna dosierujo:"
+
+#: src/LYLocal.c:2095 src/LYLocal.c:2113
+msgid "Current selection:"
+msgstr "Nuna elekto:"
+
+#: src/LYLocal.c:2099
+msgid "Nothing currently selected."
+msgstr "Nenio nune elektita."
+
+#: src/LYLocal.c:2115
+msgid "tagged item:"
+msgstr "markita ero:"
+
+#: src/LYLocal.c:2116
+msgid "tagged items:"
+msgstr "markitaj eroj:"
+
+#: src/LYLocal.c:2216 src/LYLocal.c:2225
+msgid "Illegal filename; request ignored."
+msgstr "Nevalida dosiernomo; peto ignorita."
+
+#. directory not writable
+#: src/LYLocal.c:2323 src/LYLocal.c:2382
+msgid "Install in the selected directory not permitted."
+msgstr "Instali en la elektitan dosierujon ne estas permesita."
+
+#: src/LYLocal.c:2378
+msgid "The selected item is not a directory! Request ignored."
+msgstr "La elektita ero ne estas dosiero. Peto ignorita."
+
+#: src/LYLocal.c:2387
+msgid "Just a moment, ..."
+msgstr " Nur momento"
+
+#: src/LYLocal.c:2404
+msgid "Error building install args"
+msgstr "Eraro dum munti instalajn parametrojn"
+
+#: src/LYLocal.c:2419 src/LYLocal.c:2450
+#, c-format
+msgid "Source and target are the same: %s"
+msgstr "Fonto kaj celo estas samaj: %s"
+
+#: src/LYLocal.c:2426 src/LYLocal.c:2457
+#, c-format
+msgid "Already in target directory: %s"
+msgstr "Jam en la cela dosierujo: %s"
+
+#: src/LYLocal.c:2475
+msgid "Installation complete"
+msgstr "Instalado kompleta"
+
+#: src/LYLocal.c:2678
+msgid "Temporary URL or list would be too long."
+msgstr "Provizora URL aÅ­ listo estus tro longa."
+
+#: src/LYMail.c:566
+msgid "Sending"
+msgstr "Sendante"
+
+#: src/LYMail.c:1050
+#, c-format
+msgid "The link %s :?: %s \n"
+msgstr "La ligilo %s :?: %s \n"
+
+#: src/LYMail.c:1052
+#, c-format
+msgid "called \"%s\"\n"
+msgstr ""
+"vokita \"%s\n"
+"\n"
+
+#: src/LYMail.c:1053
+#, c-format
+msgid "in the file \"%s\" called \"%s\"\n"
+msgstr "en la dosiero \"%s\" nomita \"%s\"\n"
+
+#: src/LYMail.c:1054
+msgid "was requested but was not available."
+msgstr "estis petita sed ne disponebla."
+
+#: src/LYMail.c:1055
+msgid "Thought you might want to know."
+msgstr "Pensis, ke vi eble volus scii."
+
+#: src/LYMail.c:1057
+msgid "This message was automatically generated by"
+msgstr "La mesaÄo estis aÅ­tomate generita per"
+
+#: src/LYMail.c:1770
+msgid "No system mailer configured"
+msgstr "Neniu sistema retpoÅto-servilo agordita"
+
+#: src/LYMain.c:1095
+msgid "No Winsock found, sorry."
+msgstr "BedaÅ­rinde neniu Winsock"
+
+#: src/LYMain.c:1285
+msgid "You MUST define a valid TMP or TEMP area!"
+msgstr "Vi devas difini validan provizoran dosierujon per la medivariabloj TMP aÅ­ TEMP!"
+
+#: src/LYMain.c:1338 src/LYMainLoop.c:5285
+msgid "No such directory"
+msgstr "Ne ekzistas tiu dosiero"
+
+#: src/LYMain.c:1532
+#, c-format
+msgid ""
+"\n"
+"Configuration file \"%s\" is not available.\n"
+"\n"
+msgstr ""
+"\n"
+"Agorda dosiero \"%s\" ne disponeblas.\n"
+"\n"
+
+#: src/LYMain.c:1542
+#, c-format
+msgid ""
+"\n"
+"Lynx character sets not declared.\n"
+"\n"
+msgstr ""
+"\n"
+"Lynx-kodoprezentoj ne deklaritaj.\n"
+"\n"
+
+#: src/LYMain.c:1698
+#, c-format
+msgid "Ignored %d characters from standard input.\n"
+msgstr "Ignoris %d signojn el la ĉefenigujo.\n"
+
+#: src/LYMain.c:1700
+#, c-format
+msgid "Use \"-stdin\" or \"-\" to tell how to handle piped input.\n"
+msgstr "Uzu parametrojn \"-stdin\" aÅ­ \"-\" por specifi, kiel trakti enigojn tubajn.\n"
+
+#: src/LYMain.c:1858
+msgid "Warning:"
+msgstr "Averto:"
+
+#: src/LYMain.c:2426
+msgid "persistent cookies state will be changed in next session only."
+msgstr "stato de daÅ­rantaj kuketoj ÅanÄiÄos nur en la sekva seanco."
+
+#: src/LYMain.c:2661 src/LYMain.c:2705
+#, c-format
+msgid "Lynx: ignoring unrecognized charset=%s\n"
+msgstr "Lynx: ignoranta nekonatan kodoprezenton=%s\n"
+
+#: src/LYMain.c:3222
+#, c-format
+msgid "%s Version %s (%s)"
+msgstr "%s Versio %s (%s)"
+
+#: src/LYMain.c:3263
+#, c-format
+msgid "Built on %s%s.\n"
+msgstr "Muntita je %s%s.\n"
+
+#: src/LYMain.c:3277
+msgid "Copyrights held by the Lynx Developers Group,"
+msgstr "Kopirajtoj estas tenataj de la Grupo pri Lynx-disvolvado,"
+
+#: src/LYMain.c:3278
+msgid "the University of Kansas, CERN, and other contributors."
+msgstr "la Universitato de Kansaso, CERN kaj aliaj kontribuintoj."
+
+#: src/LYMain.c:3279
+msgid "Distributed under the GNU General Public License (Version 2)."
+msgstr "Distribuita laÅ­ la GPL de GNU (Eldono 2)."
+
+#: src/LYMain.c:3280
+msgid "See https://lynx.invisible-island.net/ and the online help for more information."
+msgstr "Vidu al https://lynx.invisible-island.net/ kaj la enreta helpilo por pliaj informoj."
+
+#: src/LYMain.c:4139
+#, c-format
+msgid "USAGE: %s [options] [file]\n"
+msgstr "UZO: %s [parametroj] [dosiero]\n"
+
+#: src/LYMain.c:4140
+#, c-format
+msgid "Options are:\n"
+msgstr "Parametroj estas:\n"
+
+#: src/LYMain.c:4443
+#, c-format
+msgid "%s: Invalid Option: %s\n"
+msgstr "%s: Nevalida parametro: %s\n"
+
+#: src/LYMainLoop.c:572
+#, c-format
+msgid "Internal error: Invalid mouse link %d!"
+msgstr "Interna eraro: Nevalida musa ligilo %d!"
+
+#: src/LYMainLoop.c:693 src/LYMainLoop.c:5307
+msgid "A URL specified by the user"
+msgstr "URL specifita de la uzanto"
+
+#: src/LYMainLoop.c:1142
+msgid "Enctype multipart/form-data not yet supported! Cannot submit."
+msgstr "La ĉifro-tipo multipart/form-data ankoraŭ ne estas komprenata! Ne eblas sendi."
+
+#.
+#. * Make a name for this help file.
+#.
+#: src/LYMainLoop.c:3197
+msgid "Help Screen"
+msgstr "Helpo-fako"
+
+#: src/LYMainLoop.c:3328
+msgid "System Index"
+msgstr "Sistema indekso"
+
+#: src/LYMainLoop.c:3577
+#, c-format
+msgid "Query parameter %d: "
+msgstr "Menda parametro %d: "
+
+#: src/LYMainLoop.c:3806 src/LYMainLoop.c:5583
+msgid "Entry into main screen"
+msgstr "Eniro en ĉefan fakon"
+
+#: src/LYMainLoop.c:4064
+msgid "No next document present"
+msgstr "Neniu sekva dokumento ĉeesta"
+
+#: src/LYMainLoop.c:4359
+msgid "charset for this document specified explicitly, sorry..."
+msgstr "bedaŭrinde kodoprezento por ĉi tiu dokumento specifita aparte..."
+
+#: src/LYMainLoop.c:5265
+msgid "cd to:"
+msgstr "Åd al:"
+
+#: src/LYMainLoop.c:5288
+msgid "A component of path is not a directory"
+msgstr "Komponanto de vojo ne estas dosierujo"
+
+#: src/LYMainLoop.c:5291
+msgid "failed to change directory"
+msgstr "ÅanÄi dosierujon malsukcesis"
+
+#: src/LYMainLoop.c:6517
+msgid "Reparsing document under current settings..."
+msgstr "Reinterpretanta dokumenton laŭ nunaj agordaĵoj..."
+
+#: src/LYMainLoop.c:6811
+#, c-format
+msgid "Fatal error - could not open output file %s\n"
+msgstr "Paneanta eraro - ne povis malfermi eligan dosieron %s\n"
+
+#: src/LYMainLoop.c:7153
+msgid "TABLE center enable."
+msgstr "Aktivigi centrigon de tabeloj."
+
+#: src/LYMainLoop.c:7156
+msgid "TABLE center disable."
+msgstr "Malaktivigi centrigon de tabeloj."
+
+#: src/LYMainLoop.c:7236
+msgid "Current URL is empty."
+msgstr "Nuna URL estas vaka."
+
+#: src/LYMainLoop.c:7238 src/LYUtils.c:1909
+msgid "Copy to clipboard failed."
+msgstr "Malsukcesis kopii al poÅo."
+
+#: src/LYMainLoop.c:7240
+msgid "Document URL put to clipboard."
+msgstr "Dokumenta URL enpoÅigita."
+
+#: src/LYMainLoop.c:7242
+msgid "Link URL put to clipboard."
+msgstr "Ligila URL enpoÅigita."
+
+#: src/LYMainLoop.c:7269
+msgid "No URL in the clipboard."
+msgstr "Neniu URL en la poÅo."
+
+#: src/LYMainLoop.c:7962 src/LYMainLoop.c:8133
+msgid "-index-"
+msgstr "-indekso-"
+
+#: src/LYMainLoop.c:8071
+msgid "lynx: Can't access startfile"
+msgstr "Lynx: ne eblas atingi hejmdosieron"
+
+#: src/LYMainLoop.c:8083
+msgid "lynx: Start file could not be found or is not text/html or text/plain"
+msgstr "Lynx: Hejmdosiero ne estis trovita aÅ­ ne estas text/html aÅ­ text/plain"
+
+#: src/LYMainLoop.c:8084
+msgid " Exiting..."
+msgstr " Eliranta..."
+
+#: src/LYMainLoop.c:8127
+msgid "-more-"
+msgstr "-plu-"
+
+#. Enable scrolling.
+#: src/LYNews.c:186
+msgid "You will be posting to:"
+msgstr "Vi afiÅos al:"
+
+#.
+#. * Get the mail address for the From header, offering personal_mail_address
+#. * as default.
+#.
+#: src/LYNews.c:195
+msgid ""
+"\n"
+"\n"
+" Please provide your mail address for the From: header\n"
+msgstr ""
+"\n"
+"\n"
+"Bonvolu havigi vian retpoÅtadreson por la kapo From:\n"
+
+#.
+#. * Get the Subject header, offering the current document's title as the
+#. * default if this is a followup rather than a new post. - FM
+#.
+#: src/LYNews.c:212
+msgid ""
+"\n"
+"\n"
+" Please provide or edit the Subject: header\n"
+msgstr ""
+"\n"
+"\n"
+"Bonvolu havigi aÅ­ redakti la kapon Subject: (temo)\n"
+
+#: src/LYNews.c:302
+msgid ""
+"\n"
+"\n"
+" Please provide or edit the Organization: header\n"
+msgstr ""
+"\n"
+"\n"
+"Bonvolu havigi aŭ redakti la kapon Organization: (organizaĵo)\n"
+
+#.
+#. * Use the built in line editior.
+#.
+#: src/LYNews.c:359
+msgid ""
+"\n"
+"\n"
+" Please enter your message below."
+msgstr ""
+"\n"
+"\n"
+"Bonvolu enmetu vian mesaÄon sube."
+
+#: src/LYNews.c:405
+msgid "Message has no original text!"
+msgstr "MesaÄo havas neniun originalan tekston!"
+
+#: src/LYOptions.c:774
+msgid "review/edit B)ookmarks files"
+msgstr "kontroli/redakti B) legosignajn dosierojn"
+
+#: src/LYOptions.c:776
+msgid "B)ookmark file: "
+msgstr "B) Legosigna dosiero: "
+
+#: src/LYOptions.c:2131 src/LYOptions.c:2138
+msgid "ON"
+msgstr "Åœaltita"
+
+#. verbose_img variable
+#. LYCollapseBRs variable
+#. LYtrimBlankLines variable
+#: src/LYOptions.c:2132 src/LYOptions.c:2137 src/LYOptions.c:2321
+#: src/LYOptions.c:2330 src/LYOptions.c:2339 src/LYOptions.c:2350
+msgid "OFF"
+msgstr "MalÅaltita"
+
+#: src/LYOptions.c:2133
+msgid "NEVER"
+msgstr "Neniam"
+
+#: src/LYOptions.c:2134
+msgid "ALWAYS"
+msgstr "Ĉiam"
+
+#: src/LYOptions.c:2150 src/LYOptions.c:2313
+msgid "ignore"
+msgstr "ignoru"
+
+#: src/LYOptions.c:2151
+msgid "ask user"
+msgstr "demandu al uzanto"
+
+#: src/LYOptions.c:2152
+msgid "accept all"
+msgstr "akceptu ĉiujn"
+
+#: src/LYOptions.c:2164
+msgid "ALWAYS OFF"
+msgstr "Ĉiam malÅaltita"
+
+#: src/LYOptions.c:2165
+msgid "FOR LOCAL FILES ONLY"
+msgstr "Nur por lokaj dosieroj"
+
+#: src/LYOptions.c:2167
+msgid "ALWAYS ON"
+msgstr "Ĉiam Åaltita"
+
+#: src/LYOptions.c:2179
+msgid "Numbers act as arrows"
+msgstr "Nombroj kondutas kiel sagoj"
+
+#: src/LYOptions.c:2181
+msgid "Links are numbered"
+msgstr "Ligiloj estas nombritaj"
+
+#: src/LYOptions.c:2184
+msgid "Links and form fields are numbered"
+msgstr "Ligiloj kaj formulariaj kampoj estas nombritaj"
+
+#: src/LYOptions.c:2187
+msgid "Form fields are numbered"
+msgstr "Formularaj kampoj estas nombritaj"
+
+#: src/LYOptions.c:2202
+msgid "Case insensitive"
+msgstr "Uskleco ne gravas"
+
+#: src/LYOptions.c:2203
+msgid "Case sensitive"
+msgstr "Uskleco gravas"
+
+#: src/LYOptions.c:2237
+msgid "prompt normally"
+msgstr "demandu kiel ordinare"
+
+#: src/LYOptions.c:2238
+msgid "force yes-response"
+msgstr "devigu respondon jesan"
+
+#: src/LYOptions.c:2239
+msgid "force no-response"
+msgstr "devigu respondon nean"
+
+#: src/LYOptions.c:2249
+msgid "RFC 2109"
+msgstr "RFC 2109"
+
+#: src/LYOptions.c:2250
+msgid "RFC 2965"
+msgstr "RFC 2965"
+
+#: src/LYOptions.c:2251
+msgid "RFC 6265"
+msgstr "RFC 6265"
+
+#: src/LYOptions.c:2268
+msgid "Novice"
+msgstr "Novula"
+
+#: src/LYOptions.c:2269
+msgid "Intermediate"
+msgstr "Meznivela"
+
+#: src/LYOptions.c:2270
+msgid "Advanced"
+msgstr "Altnivela"
+
+#: src/LYOptions.c:2279
+msgid "By First Visit"
+msgstr "LaÅ­ unua vizito"
+
+#: src/LYOptions.c:2281
+msgid "By First Visit Reversed"
+msgstr "LaÅ­ unua vizito inversigita"
+
+#: src/LYOptions.c:2282
+msgid "As Visit Tree"
+msgstr "Kiel vizita arbo"
+
+#: src/LYOptions.c:2283
+msgid "By Last Visit"
+msgstr "LaÅ­ lasta vizito"
+
+#: src/LYOptions.c:2285
+msgid "By Last Visit Reversed"
+msgstr "LaÅ­ lasta vizito inversigita"
+
+#. Old_DTD variable
+#: src/LYOptions.c:2296
+msgid "relaxed (TagSoup mode)"
+msgstr "malsevera"
+
+#: src/LYOptions.c:2297
+msgid "strict (SortaSGML mode)"
+msgstr "severa"
+
+#: src/LYOptions.c:2304
+msgid "Ignore"
+msgstr "Ignoru"
+
+#: src/LYOptions.c:2305
+msgid "Add to trace-file"
+msgstr "Aldonu al spuro-dosiero"
+
+#: src/LYOptions.c:2306
+msgid "Add to LYNXMESSAGES"
+msgstr "Aldonu al LYNXMESSAGES"
+
+#: src/LYOptions.c:2307
+msgid "Warn, point to trace-file"
+msgstr "Avertu, almontru al spuro-dosiero"
+
+#: src/LYOptions.c:2314
+msgid "as labels"
+msgstr "kiel teksto"
+
+#: src/LYOptions.c:2315
+msgid "as links"
+msgstr "kiel ligiloj"
+
+#: src/LYOptions.c:2322
+msgid "show filename"
+msgstr "montru dosiernomon"
+
+#: src/LYOptions.c:2331
+msgid "collapse"
+msgstr "kolapsigu"
+
+#: src/LYOptions.c:2340
+msgid "trim-lines"
+msgstr "eltondu-liniojn"
+
+#: src/LYOptions.c:2351
+msgid "STANDARD"
+msgstr "ORDINARA"
+
+#: src/LYOptions.c:2352
+msgid "ADVANCED"
+msgstr "ALTNIVELA"
+
+#: src/LYOptions.c:2374
+msgid "IDNA 2003"
+msgstr "IDNA-2003"
+
+#: src/LYOptions.c:2375
+msgid "IDNA 2008"
+msgstr "IDNA-2008"
+
+#: src/LYOptions.c:2376
+msgid "IDNA TR46"
+msgstr "IDNA-TR46"
+
+#: src/LYOptions.c:2377
+msgid "IDNA Compatible"
+msgstr "IDNA-kongrua"
+
+#: src/LYOptions.c:2398
+msgid "Directories first"
+msgstr "Dosierujoj antaÅ­ dosieroj"
+
+#: src/LYOptions.c:2399
+msgid "Files first"
+msgstr "Dosieroj antaÅ­ dosierujoj"
+
+#: src/LYOptions.c:2400
+msgid "Mixed style"
+msgstr "Miksita ordo"
+
+#: src/LYOptions.c:2408 src/LYOptions.c:2428
+msgid "By Name"
+msgstr "LaÅ­ nomo"
+
+#: src/LYOptions.c:2409 src/LYOptions.c:2429
+msgid "By Type"
+msgstr "LaÅ­ tipo"
+
+#: src/LYOptions.c:2410 src/LYOptions.c:2430
+msgid "By Size"
+msgstr "LaÅ­ grando"
+
+#: src/LYOptions.c:2411 src/LYOptions.c:2431
+msgid "By Date"
+msgstr "LaÅ­ dato"
+
+#: src/LYOptions.c:2412
+msgid "By Mode"
+msgstr "LaÅ­ reÄimo"
+
+#: src/LYOptions.c:2414
+msgid "By User"
+msgstr "LaÅ­ uzanto"
+
+#: src/LYOptions.c:2415
+msgid "By Group"
+msgstr "LaÅ­ grupo"
+
+#: src/LYOptions.c:2440
+msgid "Do not show rate"
+msgstr "Ne montru rapidon"
+
+#: src/LYOptions.c:2441 src/LYOptions.c:2442
+#, c-format
+msgid "Show %s/sec rate"
+msgstr "Montru rapidon (%s en sekundo)"
+
+#: src/LYOptions.c:2444 src/LYOptions.c:2445
+#, c-format
+msgid "Show %s/sec, ETA"
+msgstr "Montru aproksimatan %sn en sekundo"
+
+#: src/LYOptions.c:2446 src/LYOptions.c:2447
+#, c-format
+msgid "Show %s/sec (2-digits), ETA"
+msgstr "Montru aproksimatan %sn en sekundo (duciferan)"
+
+#: src/LYOptions.c:2450
+msgid "Show progressbar"
+msgstr "Montru progresilon"
+
+#: src/LYOptions.c:2471
+msgid "Accept lynx's internal types"
+msgstr "Akceptu la internajn tipojn de Lynx"
+
+#: src/LYOptions.c:2472
+msgid "Also accept lynx.cfg's types"
+msgstr "AnkaÅ­ akceptu la tipojn de lynx.cfg"
+
+#: src/LYOptions.c:2473
+msgid "Also accept user's types"
+msgstr " AnkaÅ­ akceptu tipojn de uzantoj"
+
+#: src/LYOptions.c:2474
+msgid "Also accept system's types"
+msgstr "AnkaÅ­ akceptu tipojn el la sistemo"
+
+#: src/LYOptions.c:2475
+msgid "Accept all types"
+msgstr "Akceptu ĉiujn tipojn"
+
+#: src/LYOptions.c:2484
+msgid "gzip"
+msgstr "gzip"
+
+#: src/LYOptions.c:2485
+msgid "deflate"
+msgstr "deflate"
+
+#: src/LYOptions.c:2488
+msgid "compress"
+msgstr "compress"
+
+#: src/LYOptions.c:2491
+msgid "bzip2"
+msgstr "bzip2"
+
+#: src/LYOptions.c:2493
+msgid "All"
+msgstr "Ĉiuj"
+
+#: src/LYOptions.c:2503
+msgid "HTTP 1.0"
+msgstr "HTTP/1.0"
+
+#: src/LYOptions.c:2504
+msgid "HTTP 1.1"
+msgstr "HTTP/1.1"
+
+#: src/LYOptions.c:2863 src/LYOptions.c:2892
+#, c-format
+msgid "Use %s to invoke the Options menu!"
+msgstr "Uzu la klavon %s por la agorda menuo."
+
+#: src/LYOptions.c:3789
+msgid "(options marked with (!) will not be saved)"
+msgstr "(agordaĵoj markitaj kun (!) ne estos konservitaj)"
+
+#: src/LYOptions.c:3797
+msgid "General Preferences"
+msgstr "Äœeneralaj preferoj"
+
+#. ***************************************************************
+#. User Mode: SELECT
+#: src/LYOptions.c:3801
+msgid "User mode"
+msgstr "UzantoreÄimo"
+
+#. Editor: INPUT
+#: src/LYOptions.c:3807
+msgid "Editor"
+msgstr "Tekstoredaktilo"
+
+#. Search Type: SELECT
+#: src/LYOptions.c:3812
+msgid "Type of Search"
+msgstr "Serĉtipo"
+
+#: src/LYOptions.c:3817
+msgid "Security and Privacy"
+msgstr "Sekureco kaj privateco"
+
+#. ***************************************************************
+#. Cookies: SELECT
+#: src/LYOptions.c:3821
+msgid "Cookies"
+msgstr "Kuketoj"
+
+#. Cookie Version: SELECT
+#: src/LYOptions.c:3835
+msgid "Cookie RFC-version"
+msgstr "Normo por kuketoj"
+
+#. Cookie Prompting: SELECT
+#: src/LYOptions.c:3841
+msgid "Invalid-Cookie Prompting"
+msgstr "Demandoj pri nevalidaj kuketoj"
+
+#. SSL Prompting: SELECT
+#: src/LYOptions.c:3848
+msgid "SSL Prompting"
+msgstr "SSL-demandoj"
+
+#: src/LYOptions.c:3853
+msgid "SSL client certificate file"
+msgstr "SSL-klienta atesto-dosiero"
+
+#: src/LYOptions.c:3857
+msgid "SSL client key file"
+msgstr "SSL-klienta Ålosilo-dosiero"
+
+#: src/LYOptions.c:3863
+msgid "Keyboard Input"
+msgstr "Klavara enmeto"
+
+#. ***************************************************************
+#. Keypad Mode: SELECT
+#: src/LYOptions.c:3867
+msgid "Keypad mode"
+msgstr "Ciferklavara reÄimo"
+
+#. Emacs keys: ON/OFF
+#: src/LYOptions.c:3873
+msgid "Emacs keys"
+msgstr "Klavoj kiel Emakso"
+
+#. VI Keys: ON/OFF
+#: src/LYOptions.c:3879
+msgid "VI keys"
+msgstr "Klavoj kiel Vi"
+
+#. Line edit style: SELECT
+#. well, at least 2 line edit styles available
+#: src/LYOptions.c:3886
+msgid "Line edit style"
+msgstr "Linio-redaktila stilo"
+
+#. Keyboard layout: SELECT
+#: src/LYOptions.c:3898
+msgid "Keyboard layout"
+msgstr "KlavararanÄo"
+
+#.
+#. * Display and Character Set
+#.
+#: src/LYOptions.c:3912
+msgid "Display and Character Set"
+msgstr "Elmontrado kaj kodoprezento"
+
+#. Use locale-based character set: ON/OFF
+#: src/LYOptions.c:3917
+msgid "Use locale-based character set"
+msgstr "Uzi lokaĵaran kodoprezenton"
+
+#: src/LYOptions.c:3924
+msgid "Use HTML5 charset replacements"
+msgstr "AnstataÅ­igi signojn laÅ­ HTML5"
+
+#. Display Character Set: SELECT
+#: src/LYOptions.c:3930
+msgid "Display character set"
+msgstr "Elmontra kodoprezento"
+
+#: src/LYOptions.c:3961
+msgid "Assumed document character set"
+msgstr "Apriora dokumenta kodoprezento"
+
+#: src/LYOptions.c:3977
+msgid "Internationalized domain names"
+msgstr "Internaciigitaj domajnnomoj"
+
+#.
+#. * Since CJK people hardly mixed with other world
+#. * we split the header to make it more readable:
+#. * "CJK mode" for CJK display charsets, and "Raw 8-bit" for others.
+#.
+#: src/LYOptions.c:3995
+msgid "CJK mode"
+msgstr "Azia reÄimo"
+
+#: src/LYOptions.c:3997
+msgid "Raw 8-bit"
+msgstr "Kruda 8-bita"
+
+#. X Display: INPUT
+#: src/LYOptions.c:4005
+msgid "X Display"
+msgstr "X-servilo"
+
+#.
+#. * Document Appearance
+#.
+#: src/LYOptions.c:4011
+msgid "Document Appearance"
+msgstr "Dokumenta aspekto"
+
+#: src/LYOptions.c:4017
+msgid "Show color"
+msgstr "Montri kolorojn"
+
+#: src/LYOptions.c:4043
+msgid "Color style"
+msgstr "Kolora stilo"
+
+#: src/LYOptions.c:4053
+msgid "Default colors"
+msgstr "Aprioraj koloroj"
+
+#. Show cursor: ON/OFF
+#: src/LYOptions.c:4061
+msgid "Show cursor"
+msgstr "Montri kursoron"
+
+#. Underline links: ON/OFF
+#: src/LYOptions.c:4067
+msgid "Underline links"
+msgstr "Substreki ligilojn"
+
+#. Show scrollbar: ON/OFF
+#: src/LYOptions.c:4074
+msgid "Show scrollbar"
+msgstr "Montri rulumilon"
+
+#. Select Popups: ON/OFF
+#: src/LYOptions.c:4081
+msgid "Popups for select fields"
+msgstr "Åœprucmenuoj por iaj kampoj"
+
+#. HTML error recovery: SELECT
+#: src/LYOptions.c:4087
+msgid "HTML error recovery"
+msgstr "HTML-reÄimo"
+
+#. Bad HTML messages: SELECT
+#: src/LYOptions.c:4093
+msgid "Bad HTML messages"
+msgstr "MesaÄoj pri fuÅa HTML"
+
+#. Show Images: SELECT
+#: src/LYOptions.c:4099
+msgid "Show images"
+msgstr "Montri bildojn"
+
+#. Verbose Images: ON/OFF
+#: src/LYOptions.c:4113
+msgid "Verbose images"
+msgstr "Vortplenaj bildoj"
+
+#. Collapse BR Tags: ON/OFF
+#: src/LYOptions.c:4119
+msgid "Collapse BR tags"
+msgstr "Kolapsi BR-etikedojn"
+
+#. Trim blank lines: ON/OFF
+#: src/LYOptions.c:4125
+msgid "Trim blank lines"
+msgstr "Eltondi malplenajn liniojn"
+
+#.
+#. * Headers Transferred to Remote Servers
+#.
+#: src/LYOptions.c:4133
+msgid "Headers Transferred to Remote Servers"
+msgstr "Ĉapoj transigitaj al foraj serviloj"
+
+#. ***************************************************************
+#. Mail Address: INPUT
+#: src/LYOptions.c:4137
+msgid "Personal mail address"
+msgstr "Propra retpoÅtadreso"
+
+#: src/LYOptions.c:4142
+msgid "Personal name for mail"
+msgstr "Propra nomo por la retpoÅtadreso"
+
+#: src/LYOptions.c:4149
+msgid "Password for anonymous ftp"
+msgstr "Pasvorto por sennoma FTP"
+
+#. Preferred content type: SELECT
+#: src/LYOptions.c:4155
+msgid "Preferred content type"
+msgstr "Preferata enhavtipo"
+
+#. Preferred media type: SELECT
+#: src/LYOptions.c:4161
+msgid "Preferred media type"
+msgstr "Preferata enhavtipa traktado"
+
+#. Preferred encoding: SELECT
+#: src/LYOptions.c:4167
+msgid "Preferred encoding"
+msgstr "Preferata kunprema formato"
+
+#. Preferred Document Character Set: INPUT
+#: src/LYOptions.c:4173
+msgid "Preferred document character set"
+msgstr "Preferata dokumenta kodoprezento"
+
+#. Preferred Document Language: INPUT
+#: src/LYOptions.c:4178
+msgid "Preferred document language"
+msgstr "Preferata dokumenta lingvo"
+
+#. HTTP protocol SELECT
+#: src/LYOptions.c:4183
+msgid "HTTP protocol"
+msgstr "HTTP-protokolo"
+
+#: src/LYOptions.c:4190
+msgid "Send User-Agent header"
+msgstr "Konigi la TTT-legilon"
+
+#: src/LYOptions.c:4192
+msgid "User-Agent header"
+msgstr "TTT-legila identigilo"
+
+#.
+#. * Listing and Accessing Files
+#.
+#: src/LYOptions.c:4200
+msgid "Listing and Accessing Files"
+msgstr "Listigi kaj atingi dosierojn"
+
+#. FTP sort: SELECT
+#: src/LYOptions.c:4205
+msgid "Use Passive FTP"
+msgstr "Uzu pasivan FTP-on"
+
+#. FTP sort: SELECT
+#: src/LYOptions.c:4211
+msgid "FTP sort criteria"
+msgstr "FTP-ordigaj kriterioj"
+
+#. Local Directory Sort: SELECT
+#: src/LYOptions.c:4219
+msgid "Local directory sort criteria"
+msgstr "Ordigi lokajn dosierujojn kun"
+
+#. Local Directory Order: SELECT
+#: src/LYOptions.c:4225
+msgid "Local directory sort order"
+msgstr "Ordo por lokaj dosierujoj"
+
+#: src/LYOptions.c:4234
+msgid "Show dot files"
+msgstr "Montri punkto-dosierojn"
+
+#: src/LYOptions.c:4242
+msgid "Execution links"
+msgstr "Plenumeblaj ligiloj"
+
+#: src/LYOptions.c:4260
+msgid "Pause when showing message"
+msgstr "PaÅ­zu dum montri mesaÄojn"
+
+#. Show transfer rate: SELECT
+#: src/LYOptions.c:4267
+msgid "Show transfer rate"
+msgstr "Montri transigo-rapidon"
+
+#.
+#. * Special Files and Screens
+#.
+#: src/LYOptions.c:4287
+msgid "Special Files and Screens"
+msgstr "Specialaj dosieroj kaj ekranoj"
+
+#: src/LYOptions.c:4292
+msgid "Multi-bookmarks"
+msgstr "Plurnivelaj legosignoj"
+
+#: src/LYOptions.c:4300
+msgid "Review/edit Bookmarks files"
+msgstr "Kontroli/redakti legosignajn dosierojn"
+
+#: src/LYOptions.c:4303
+msgid "Goto multi-bookmark menu"
+msgstr "Iri al menuo pri plurnivelaj legosignoj"
+
+#: src/LYOptions.c:4305
+msgid "Bookmarks file"
+msgstr "Legosigna dosiero"
+
+#. Auto Session: ON/OFF
+#: src/LYOptions.c:4312
+msgid "Auto Session"
+msgstr "AÅ­tomata seanco"
+
+#. Session File Menu: INPUT
+#: src/LYOptions.c:4318
+msgid "Session file"
+msgstr "Seanco-dosiero"
+
+#. Visited Pages: SELECT
+#: src/LYOptions.c:4324
+msgid "Visited Pages"
+msgstr "Vizititaj paÄoj"
+
+#: src/LYOptions.c:4329
+msgid "View the file "
+msgstr "Vidi la dosierojn "
+
+#: src/LYPrint.c:956
+#, c-format
+msgid " Print job complete.\n"
+msgstr " Printo-tasko kompleta.\n"
+
+#: src/LYPrint.c:1283
+msgid "Document:"
+msgstr "Dokumento:"
+
+#: src/LYPrint.c:1284
+msgid "Number of lines:"
+msgstr "Nombro da linioj:"
+
+#: src/LYPrint.c:1285
+msgid "Number of pages:"
+msgstr "Nombro da paÄoj:"
+
+#: src/LYPrint.c:1286
+msgid "pages"
+msgstr "paÄoj"
+
+#: src/LYPrint.c:1286
+msgid "page"
+msgstr "paÄo"
+
+#: src/LYPrint.c:1287
+msgid "(approximately)"
+msgstr "(proksimume)"
+
+#: src/LYPrint.c:1294
+msgid "Some print functions have been disabled!"
+msgstr "Iuj printaj funkcioj estis malaktivigitaj!"
+
+#: src/LYPrint.c:1298
+msgid "Standard print options:"
+msgstr "Ordinaraj printaj agordaĵoj:"
+
+#: src/LYPrint.c:1299
+msgid "Print options:"
+msgstr "Printaj agordaĵoj"
+
+#: src/LYPrint.c:1306
+msgid "Save to a local file"
+msgstr "Konservi al loka dosiero"
+
+#: src/LYPrint.c:1308
+msgid "Save to disk disabled"
+msgstr "Konservado al disko malaktivigita"
+
+#: src/LYPrint.c:1315
+msgid "Mail the file"
+msgstr "Sendi la dosieron per retpoÅto"
+
+#: src/LYPrint.c:1322
+msgid "Print to the screen"
+msgstr "Printi la ekranon"
+
+#: src/LYPrint.c:1327
+msgid "Print out on a printer attached to your vt100 terminal"
+msgstr "Printi al printilo almetita al via terminalo vt100"
+
+#: src/LYReadCFG.c:437
+#, c-format
+msgid ""
+"Syntax Error parsing COLOR in configuration file:\n"
+"The line must be of the form:\n"
+"COLOR:INTEGER:FOREGROUND:BACKGROUND\n"
+"\n"
+"Here FOREGROUND and BACKGROUND must be one of:\n"
+"The special strings 'nocolor' or 'default', or\n"
+msgstr ""
+"Sintaksa eraro dum legi la Ålosilvorton COLOR en agorda dosiero:\n"
+"La linio devas esti laÅ­ la formo:\n"
+"COLOR:ENTJERO:MALFONO:FONO\n"
+"\n"
+"MALFONO kaj FONO devas esti unu el:\n"
+"La specialaj ĉenoj 'nocolor' (senkolora) aŭ 'default' (aŭtomata), aŭ\n"
+
+#: src/LYReadCFG.c:450
+msgid "Offending line:"
+msgstr "Ofenda linio:"
+
+#: src/LYReadCFG.c:764
+#, c-format
+msgid "key remapping of %s to %s for %s failed\n"
+msgstr "klavoÅanÄo de %s al %s por %s malsukcesis\n"
+
+#: src/LYReadCFG.c:771
+#, c-format
+msgid "key remapping of %s to %s failed\n"
+msgstr "klavoÅanÄo de %s al %s malsukcesis\n"
+
+#: src/LYReadCFG.c:792
+#, c-format
+msgid "invalid line-editor selection %s for key %s, selecting all\n"
+msgstr "nevalida linio-redaktila elekto %s por klavo %s, elektanta ĉion\n"
+
+#: src/LYReadCFG.c:817 src/LYReadCFG.c:832
+#, c-format
+msgid "setting of line-editor binding for key %s (0x%x) to 0x%x for %s failed\n"
+msgstr "agordi linio-redaktilan bindadon por klavo %s (0x%x) al 0x(%x) por %s malsukcesis\n"
+
+#: src/LYReadCFG.c:839
+#, c-format
+msgid "setting of line-editor binding for key %s (0x%x) for %s failed\n"
+msgstr "agordi linio-redaktilon bindadon por klavo %s (0x%x) por %s malsukcesis\n"
+
+#: src/LYReadCFG.c:937
+#, c-format
+msgid "Lynx: cannot start, CERN rules file %s is not available\n"
+msgstr "Lynx: ne eblas starti, CERN-regula dosiero %s ne disponeblas\n"
+
+#: src/LYReadCFG.c:938
+msgid "(no name)"
+msgstr "(neniu nomo)"
+
+#: src/LYReadCFG.c:2086
+#, c-format
+msgid "More than %d nested lynx.cfg includes -- perhaps there is a loop?!?\n"
+msgstr "Pli ol %d nestita inkludoj en lynx.cfg -- eble estas volvaĵo?\n"
+
+#: src/LYReadCFG.c:2088
+#, c-format
+msgid "Last attempted include was '%s',\n"
+msgstr "Lasta provita inkludo estis '%s',\n"
+
+#: src/LYReadCFG.c:2089
+#, c-format
+msgid "included from '%s'.\n"
+msgstr "inkluzivita el '%s'.\n"
+
+#: src/LYReadCFG.c:2500 src/LYReadCFG.c:2513 src/LYReadCFG.c:2571
+msgid "The following is read from your lynx.cfg file."
+msgstr "La jena estis legita el la dosiero lynx.cfg."
+
+#: src/LYReadCFG.c:2501 src/LYReadCFG.c:2514
+msgid "Please read the distribution"
+msgstr "Bonvolu legi la distribuaĵon"
+
+#: src/LYReadCFG.c:2507 src/LYReadCFG.c:2517
+msgid "for more comments."
+msgstr "por pliaj komentoj."
+
+#: src/LYReadCFG.c:2553
+msgid "RELOAD THE CHANGES"
+msgstr "REÅœARGU LA ÅœANÄœOJ"
+
+#: src/LYReadCFG.c:2561
+msgid "Your primary configuration"
+msgstr "Via ĉefa agordo"
+
+#: src/LYShowInfo.c:116
+msgid "URL:"
+msgstr "URL:"
+
+#: src/LYShowInfo.c:200
+msgid "Directory that you are currently viewing"
+msgstr "Dosierujo, kiun vi nune estas rigardanta"
+
+#: src/LYShowInfo.c:203
+msgid "Name:"
+msgstr "Nomo:"
+
+#: src/LYShowInfo.c:220
+msgid "Directory that you have currently selected"
+msgstr "Dosiero, kiu estas nune elektita"
+
+#: src/LYShowInfo.c:222
+msgid "File that you have currently selected"
+msgstr "Dosiero, kiu estas nune elektita"
+
+#: src/LYShowInfo.c:225
+msgid "Symbolic link that you have currently selected"
+msgstr "Mola ligilo, kiu estas nune elektita"
+
+#: src/LYShowInfo.c:228
+msgid "Item that you have currently selected"
+msgstr "Ero, kiu estas nune elektita"
+
+#: src/LYShowInfo.c:230
+msgid "Full name:"
+msgstr "Plena nomo:"
+
+#: src/LYShowInfo.c:243
+msgid "Unable to follow link"
+msgstr "Ne eblas sekvi ligilon"
+
+#: src/LYShowInfo.c:245
+msgid "Points to file:"
+msgstr "Almontras al dosiero:"
+
+#: src/LYShowInfo.c:250
+msgid "Name of owner:"
+msgstr "Nomo de estro:"
+
+#: src/LYShowInfo.c:253
+msgid "Group name:"
+msgstr "Grupnomo:"
+
+#: src/LYShowInfo.c:255
+msgid "File size:"
+msgstr "Dosiergrando"
+
+#: src/LYShowInfo.c:257
+msgid "(bytes)"
+msgstr "(bajtoj)"
+
+#.
+#. * Include date and time information.
+#.
+#: src/LYShowInfo.c:262
+msgid "Creation date:"
+msgstr "Krea dato:"
+
+#: src/LYShowInfo.c:265
+msgid "Last modified:"
+msgstr "Laste modifita:"
+
+#: src/LYShowInfo.c:268
+msgid "Last accessed:"
+msgstr "Laste atingita:"
+
+#: src/LYShowInfo.c:274
+msgid "Access Permissions"
+msgstr "Atingaj permesoj"
+
+#: src/LYShowInfo.c:309
+msgid "Group:"
+msgstr "Grupo:"
+
+#: src/LYShowInfo.c:329
+msgid "World:"
+msgstr "Mondo:"
+
+#: src/LYShowInfo.c:336
+msgid "File that you are currently viewing"
+msgstr "Dosiero, kiun vi estas nune rigardanta"
+
+#: src/LYShowInfo.c:344 src/LYShowInfo.c:444
+msgid "Linkname:"
+msgstr "Ligilnomo:"
+
+#: src/LYShowInfo.c:350 src/LYShowInfo.c:365
+msgid "Charset:"
+msgstr "Kodoprezento:"
+
+#: src/LYShowInfo.c:364
+msgid "(assumed)"
+msgstr "(supozita)"
+
+#: src/LYShowInfo.c:371
+msgid "Server:"
+msgstr "Servilo:"
+
+#: src/LYShowInfo.c:374
+msgid "Date:"
+msgstr "Dato:"
+
+#: src/LYShowInfo.c:377
+msgid "Last Mod:"
+msgstr "Lasta modifo:"
+
+#: src/LYShowInfo.c:381
+msgid "Expires:"
+msgstr "EksvalidiÄos:"
+
+#: src/LYShowInfo.c:384
+msgid "Cache-Control:"
+msgstr "Tenejo-Kontrolo:"
+
+#: src/LYShowInfo.c:387
+msgid "Content-Length:"
+msgstr "Enhavo-longo:"
+
+#: src/LYShowInfo.c:391
+msgid "Length:"
+msgstr "Longo:"
+
+#: src/LYShowInfo.c:396
+msgid "Language:"
+msgstr "Lingvo:"
+
+#: src/LYShowInfo.c:402
+msgid "Post Data:"
+msgstr "KaÅitaj datumoj"
+
+#: src/LYShowInfo.c:405
+msgid "Post Content Type:"
+msgstr "Enhavo-tipo de kaÅitaj datumoj:"
+
+#: src/LYShowInfo.c:408
+msgid "Owner(s):"
+msgstr "Estro(j):"
+
+#: src/LYShowInfo.c:413
+msgid "size:"
+msgstr "Grando:"
+
+#: src/LYShowInfo.c:415
+msgid "lines"
+msgstr "linioj"
+
+#: src/LYShowInfo.c:419
+msgid "forms mode"
+msgstr "formularia reÄimo"
+
+#: src/LYShowInfo.c:421
+msgid "source"
+msgstr "fontoteksto"
+
+#: src/LYShowInfo.c:422
+msgid "normal"
+msgstr "kutima"
+
+#: src/LYShowInfo.c:424
+msgid ", safe"
+msgstr ", sekura"
+
+#: src/LYShowInfo.c:426
+msgid ", via internal link"
+msgstr ", per interna ligilo"
+
+#: src/LYShowInfo.c:430
+msgid ", no-cache"
+msgstr ", sen tenejo"
+
+#: src/LYShowInfo.c:432
+msgid ", ISMAP script"
+msgstr ", ISMAP-programeto"
+
+#: src/LYShowInfo.c:434
+msgid ", bookmark file"
+msgstr ", legosigna dosiero"
+
+#: src/LYShowInfo.c:437
+msgid "mode:"
+msgstr "ReÄimo:"
+
+#: src/LYShowInfo.c:443
+msgid "Link that you currently have selected"
+msgstr "Ligilo, kiu estas nune elektita"
+
+#: src/LYShowInfo.c:452
+msgid "Method:"
+msgstr "Metodo:"
+
+#: src/LYShowInfo.c:456
+msgid "Enctype:"
+msgstr "Ĉifro-tipo:"
+
+#: src/LYShowInfo.c:462
+msgid "Action:"
+msgstr "Ago:"
+
+#: src/LYShowInfo.c:468
+msgid "(Form field)"
+msgstr "(Formulara kampo)"
+
+#: src/LYShowInfo.c:478
+msgid "No Links on the current page"
+msgstr "Neniuj ligiloj en la nuna paÄo"
+
+#: src/LYShowInfo.c:483
+msgid "Server Headers:"
+msgstr "Servilaj kapoj:"
+
+#: src/LYStyle.c:332
+#, c-format
+msgid ""
+"Syntax Error parsing style in lss file:\n"
+"[%s]\n"
+"The line must be of the form:\n"
+"OBJECT:MONO:COLOR (ie em:bold:brightblue:white)\n"
+"where OBJECT is one of EM,STRONG,B,I,U,BLINK etc.\n"
+"\n"
+msgstr ""
+"Sintaksa eraro en la stildosiero:\n"
+"[%s]\n"
+"La linio devas esti laÅ­ la formo:\n"
+"ELEMENTO:STILO:KOLORO (ekz-e em:bold:brightblue:white)\n"
+"ELEMENTO estas unu el EM,STRONG,I,U,BLINK ktp.\n"
+"\n"
+
+#: src/LYStyle.c:941
+#, c-format
+msgid ""
+"\n"
+"Lynx file \"%s\" is not available.\n"
+"\n"
+msgstr ""
+"\n"
+"Lynx-dosiero \"%s\" ne disponeblas.\n"
+"\n"
+
+#: src/LYTraversal.c:111
+msgid "here is a list of the history stack so that you may rebuild"
+msgstr "jen listo de la historio-stako por ke vi povu rekonstrui"
+
+#: src/LYUpload.c:77
+msgid "ERROR! - upload command is misconfigured"
+msgstr "ERARO! - alÅuta komando estas fuÅe agordita"
+
+#: src/LYUpload.c:98
+msgid "Illegal redirection \"../\" found! Request ignored."
+msgstr "Nevalida alidirektado \"../\" trovita! Peto ignorita."
+
+#: src/LYUpload.c:101
+msgid "Illegal character \"/\" found! Request ignored."
+msgstr "Nevalida signo \"/\" trovita! Peto ignorita."
+
+#: src/LYUpload.c:104
+msgid "Illegal redirection using \"~\" found! Request ignored."
+msgstr "Nevalida alidirektado per \"~\" trovita! Peto ignorita."
+
+#: src/LYUpload.c:157
+msgid "Unable to upload file."
+msgstr "Ne eblas alÅuti dosieron."
+
+#: src/LYUpload.c:196
+msgid "Upload To:"
+msgstr "AlÅuti al:"
+
+#: src/LYUpload.c:197
+msgid "Upload options:"
+msgstr "AlÅutaj elektoj:"
+
+#: src/LYUtils.c:1911
+msgid "Download document URL put to clipboard."
+msgstr "ElÅuti dokumentan URL-on en poÅo."
+
+#: src/LYUtils.c:2658
+msgid "Unexpected access protocol for this URL scheme."
+msgstr "Neatendita atingo-protokolo por tiu URL-skemo."
+
+#: src/LYUtils.c:3571
+msgid "Too many tempfiles"
+msgstr "Tro da provizoraj dosieroj"
+
+#: src/LYUtils.c:3871
+msgid "unknown restriction"
+msgstr "nekonata malhelpo"
+
+#: src/LYUtils.c:3902
+#, c-format
+msgid "No restrictions set.\n"
+msgstr "Neniuj malhelpoj elektitaj.\n"
+
+#: src/LYUtils.c:3905
+#, c-format
+msgid "Restrictions set:\n"
+msgstr "Malhelpoj elektitaj:\n"
+
+#: src/LYUtils.c:5202
+msgid "Cannot find HOME directory"
+msgstr "Ne eblas trovi la hejmdosierujon."
+
+#: src/LYrcFile.c:16
+msgid "Normally disabled. See ENABLE_LYNXRC in lynx.cfg\n"
+msgstr "Ordinare malaktivigite. ÅœanÄi la agordaĵon ENABLE_LYNXRC en lynx.cfg\n"
+
+#: src/LYrcFile.c:373
+msgid ""
+"accept_all_cookies allows the user to tell Lynx to automatically\n"
+"accept all cookies if desired. The default is \"FALSE\" which will\n"
+"prompt for each cookie. Set accept_all_cookies to \"TRUE\" to accept\n"
+"all cookies.\n"
+msgstr ""
+"accept_all_cookies permesas, ke uzanto specifu ĉu aŭtomate\n"
+"akcepti ĉiujn kuketojn aŭ ne. La aŭtomata estas \"FALSE\", kiu demandos\n"
+"pri ĉiu kuketo. Valoro \"TRUE\" akceptos\n"
+"ĉiujn kuketojn.\n"
+
+#: src/LYrcFile.c:381
+msgid ""
+"anonftp_password allows the user to tell Lynx to use the personal\n"
+"email address as the password for anonymous ftp. If no value is given,\n"
+"Lynx will use the personal email address. Set anonftp_password\n"
+"to a different value if you choose.\n"
+msgstr ""
+"anonftp_password permesas, ke uzanto specifu al Lynx propran\n"
+"retpoÅtadreson kiel la pasvorton por sennoma FTP. Se Äi havas\n"
+"neniun valoron, Lynx uzos la propran retpoÅtadreson. LaÅ­vole\n"
+"elektu alian valoron.\n"
+
+#: src/LYrcFile.c:390
+msgid ""
+"bookmark_file specifies the name and location of the default bookmark\n"
+"file into which the user can paste links for easy access at a later\n"
+"date.\n"
+msgstr ""
+"bookmark_file specifas la nomon kaj lokon de la apriora legosigna\n"
+"dosiero en kiu la uzanto povas alglui ligilojn por facila atingo\n"
+"pli malfrue.\n"
+
+#: src/LYrcFile.c:395
+msgid ""
+"If case_sensitive_searching is \"on\" then when the user invokes a search\n"
+"using the 's' or '/' keys, the search performed will be case sensitive\n"
+"instead of case INsensitive. The default is usually \"off\".\n"
+msgstr ""
+"Se case_sensitive_searching estas \"on\", kiam la uzanto startigas\n"
+"serĉo per la klavojn 's' aŭ '/', la serĉo plenumota ne ignoros la usklecon\n"
+"anstataÅ­ la ordinara konduto de ignori usklecon (valoro \"off\").\n"
+
+#: src/LYrcFile.c:400
+msgid ""
+"The character_set definition controls the representation of 8 bit\n"
+"characters for your terminal. If 8 bit characters do not show up\n"
+"correctly on your screen you may try changing to a different 8 bit\n"
+"set or using the 7 bit character approximations.\n"
+"Current valid characters sets are:\n"
+msgstr ""
+"La difino character_set regas la prezenton de 8-bitaj\n"
+"signoj por via terminalo. Se 8-bitaj signoj ne Äuste elmontriÄas\n"
+"ĉe via ekrano, vi provu malsaman 8-bitan kodoprezenton\n"
+"aŭ uzu la 7-bitajn kodoprezentajn aproksimaĵojn.\n"
+"Nune validaj kodoprezentoj estas:\n"
+
+#: src/LYrcFile.c:408
+msgid ""
+"cookie_accept_domains and cookie_reject_domains are comma-delimited\n"
+"lists of domains from which Lynx should automatically accept or reject\n"
+"all cookies. If a domain is specified in both options, rejection will\n"
+"take precedence. The accept_all_cookies parameter will override any\n"
+"settings made here.\n"
+msgstr ""
+"cookie_accept_domains kaj cookie_reject domains estas listoj de domajnoj\n"
+"el kiuj Lynx aŭtomate akceptu aŭ rifuzu (respektive) ĉiujn kuketojn,\n"
+"apartigita per komoj. Se domajno estas specifita en ambaŭ agordaĵoj, rifuzado\n"
+"regos. La parametro accept_all_cookies superregos ĉiujn\n"
+"agordaĵojn ĉi tie.\n"
+
+#: src/LYrcFile.c:416
+msgid ""
+"cookie_file specifies the file from which to read persistent cookies.\n"
+"The default is ~/"
+msgstr ""
+"cookie_file specifas la dosieron el kiu legi daÅ­rantajn kuketojn.\n"
+"La apriora estas ~/"
+
+#: src/LYrcFile.c:421
+msgid ""
+"cookie_loose_invalid_domains, cookie_strict_invalid_domains, and\n"
+"cookie_query_invalid_domains are comma-delimited lists of which domains\n"
+"should be subjected to varying degrees of validity checking. If a\n"
+"domain is set to strict checking, strict conformance to RFC2109 will\n"
+"be applied. A domain with loose checking will be allowed to set cookies\n"
+"with an invalid path or domain attribute. All domains will default to\n"
+"querying the user for an invalid path or domain.\n"
+msgstr ""
+"cookie_loose_invalid_domains, cookie_strict_invalid_domains, kaj\n"
+"cookie_query_invalid_domains estas listoj, apartigita per komoj, de kiuj domajnoj\n"
+"estu submetitaj al variantaj gradoj de kontrolado. Se vi specifas,\n"
+"ke domajno ricevos severan kontroladon, severa konformado al RFC2109\n"
+"aplikiÄos. Domajno kun malsevera kontrolado estos permesita doni al kuketoj\n"
+"kun nevalidaj atributoj vojon kaj domajnon. Ĉiuj domajnoj aŭtomate demandos\n"
+"al la uzanto pri nevalida vojo aÅ­ domajno.\n"
+
+#: src/LYrcFile.c:435
+msgid ""
+"dir_list_order specifies the directory list order under DIRED_SUPPORT\n"
+"(if implemented). The default is \"ORDER_BY_NAME\"\n"
+msgstr ""
+"dir_list_order specifas la dosierujlistan ordon de DIRED_SUPPORT\n"
+"(se realigita). La apriora estas \"ORDER_BY_NAME\"\n"
+
+#: src/LYrcFile.c:440
+msgid ""
+"dir_list_styles specifies the directory list style under DIRED_SUPPORT\n"
+"(if implemented). The default is \"MIXED_STYLE\", which sorts both\n"
+"files and directories together. \"FILES_FIRST\" lists files first and\n"
+"\"DIRECTORIES_FIRST\" lists directories first.\n"
+msgstr ""
+"dir_list_styles specifas la dosierujlistan stilon de DIRED_SUPPORT\n"
+"(se realigita). La apriora estas \"MIXED_STYLE\", kiu ordigas laÅ­ kaj\n"
+"dosieroj kaj dosierujoj. \"FILES_FIRST\" listigas dosierojn antaÅ­ aliaj\n"
+"kaj \"DIRECTORIES_FIRST\" listigas dosierujojn antaÅ­ aliaj.\n"
+
+#: src/LYrcFile.c:448
+msgid ""
+"If emacs_keys is to \"on\" then the normal EMACS movement keys:\n"
+" ^N = down ^P = up\n"
+" ^B = left ^F = right\n"
+"will be enabled.\n"
+msgstr ""
+"Se emacs_keys estas \"on\", la ordinaraj moviloj de Emakso:\n"
+" ^N = suben ^P = supren\n"
+" ^B = maldekstren ^F = dekstren\n"
+"estos aktivaj.\n"
+
+#: src/LYrcFile.c:454
+msgid ""
+"file_editor specifies the editor to be invoked when editing local files\n"
+"or sending mail. If no editor is specified, then file editing is disabled\n"
+"unless it is activated from the command line, and the built-in line editor\n"
+"will be used for sending mail.\n"
+msgstr ""
+"file_editor specifas la tekstoredaktilon plenumontan por redakti lokajn dosierojn\n"
+"aÅ­ sendi retleterojn. So neniu estas specifita, do redakti dosierojn estos malaktivigitaj\n"
+"se Äi ne estas aktivigita laÅ­ la komanda linio, kaj la integra liniredaktilo\n"
+"estos uzata por sendi retleterojn.\n"
+
+#: src/LYrcFile.c:461
+msgid ""
+"The file_sorting_method specifies which value to sort on when viewing\n"
+"file lists such as FTP directories. The options are:\n"
+" BY_FILENAME -- sorts on the name of the file\n"
+" BY_TYPE -- sorts on the type of the file\n"
+" BY_SIZE -- sorts on the size of the file\n"
+" BY_DATE -- sorts on the date of the file\n"
+msgstr ""
+"file_sorting_method specifas laÅ­ kiu valoro ordigi kiam oni vidas\n"
+"dosierlistojn kiajn FTP-dosierujojn. La elektoj estas:\n"
+" BY_FILENAME -- ordigas laÅ­ dosiernomo\n"
+" BY_TYPE -- ordigas laÅ­ dosiertipo\n"
+" BY_SIZE -- ordigas laÅ­ dosiergrando\n"
+" BY_DATE -- ordigas laÅ­ dosierdato\n"
+
+#: src/LYrcFile.c:492
+msgid ""
+"lineedit_mode specifies the key binding used for inputting strings in\n"
+"prompts and forms. If lineedit_mode is set to \"Default Binding\" then\n"
+"the following control characters are used for moving and deleting:\n"
+"\n"
+" Prev Next Enter = Accept input\n"
+" Move char: <- -> ^G = Cancel input\n"
+" Move word: ^P ^N ^U = Erase line\n"
+" Delete char: ^H ^R ^A = Beginning of line\n"
+" Delete word: ^B ^F ^E = End of line\n"
+"\n"
+"Current lineedit modes are:\n"
+msgstr ""
+"line_mode specifas la klavojn uzeblajn por enmeti ĉenojn en\n"
+"demandiloj kaj formularioj. Se linedit_mode estas \"Default Binding\",\n"
+"la jenaj stirsignoj estas uzeblaj por movi kaj forigi:\n"
+"\n"
+" AntaÅ­a Sekva Enen-klavon = Akcepti enmeton\n"
+" Movi signon: <- -> ^G = Nuligi enmeton\n"
+" Movi vorton: ^P ^N ^U = ForviÅi linion\n"
+" Forigi signon: ^H ^R ^A = Komenco de linio\n"
+" Forigi vorton: ^B ^F ^E = Fino de linio\n"
+"\n"
+"Nune reÄimoj linio-redaktantaj estas:\n"
+
+#: src/LYrcFile.c:510
+msgid ""
+"The following allow you to define sub-bookmark files and descriptions.\n"
+"The format is multi_bookmark<capital_letter>=<filename>,<description>\n"
+"Up to 26 bookmark files (for the English capital letters) are allowed.\n"
+"We start with \"multi_bookmarkB\" since 'A' is the default (see above).\n"
+msgstr ""
+"La sekvaj permesas, ke vi difinu sublegosignajn dosierojn kaj priskribojn.\n"
+"La formato estas multi_bookmark<majusklo>=<dosiernomo>,<priskribo>\n"
+"Maksimume 26 legosignaj dosieroj (por la askiaj ĉefliteroj) estas permesitaj.\n"
+"Oni komencas kun \"multi_bookmarkB\" pro tio, ke 'A' estas la ĉefa (vidu supran).\n"
+
+#: src/LYrcFile.c:516
+msgid ""
+"personal_mail_address specifies your personal mail address. The\n"
+"address will be sent during HTTP file transfers for authorization and\n"
+"logging purposes, and for mailed comments.\n"
+"If you do not want this information given out, set the NO_FROM_HEADER\n"
+"to TRUE in lynx.cfg, or use the -nofrom command line switch. You also\n"
+"could leave this field blank, but then you won't have it included in\n"
+"your mailed comments.\n"
+msgstr ""
+"personal_mail_address specifas vian propran retpoÅtadreson. La\n"
+"adreso estos sendita dum HTTP-aj dosiero-transigoj por atestado kaj\n"
+"protokolado, kaj por retleteroj.\n"
+"Se vi ne volas, ke ĉi tiu informo eldoniÄu, donu al NO_FROM_HEADER\n"
+"la valoron TRUE en lynx.cfg, aÅ­ uzu la komandlinian parametron -nofrom.\n"
+"Vi ankaŭ povas restigi ĉi tiun kampo vaka, sed se vi faras tion, via\n"
+"retpoÅtadreso ne aÅ­tomate uziÄos en viaj retleteroj.\n"
+
+#: src/LYrcFile.c:525
+msgid ""
+"personal_mail_name specifies your personal name, for mail. The\n"
+"name is sent for mailed comments. Lynx will prompt for this,\n"
+"showing the configured value as a default when sending mail.\n"
+"This is not necessarily the same as a name provided as part of the\n"
+"personal_mail_address.\n"
+"Lynx does not save your changes to that default value as a side-effect\n"
+"of sending email. To update the default value, you must use the options\n"
+"menu, or modify this file directly.\n"
+msgstr ""
+"personal_mail_name specifas vian propran nomon, por retpoÅto. La\n"
+"nomo estas sendita por retleteroj. Lynx demandos por tio,\n"
+"montrante la agorditan valoron aÅ­tomate dum sendi retleterojn.\n"
+"Ĉi tio ne estas nepre la sama kiel la nomo provizita kiel parto de la\n"
+"personal_mail_address.\n"
+"Lynx ne devos konservi viajn ÅanÄojn al tiu valoro kiel kromefiko\n"
+"de sendi retleterojn. Por Äisdatigi la aÅ­tomatan valorono, vi devas uzi la agordojn\n"
+"aŭ modifi ĉi tiun dosieron permane.\n"
+
+#: src/LYrcFile.c:535
+msgid ""
+"preferred_charset specifies the character set in MIME notation (e.g.,\n"
+"ISO-8859-2, ISO-8859-5) which Lynx will indicate you prefer in requests\n"
+"to http servers using an Accept-Charset header. The value should NOT\n"
+"include ISO-8859-1 or US-ASCII, since those values are always assumed\n"
+"by default. May be a comma-separated list.\n"
+"If a file in that character set is available, the server will send it.\n"
+"If no Accept-Charset header is present, the default is that any\n"
+"character set is acceptable. If an Accept-Charset header is present,\n"
+"and if the server cannot send a response which is acceptable\n"
+"according to the Accept-Charset header, then the server SHOULD send\n"
+"an error response, though the sending of an unacceptable response\n"
+"is also allowed.\n"
+msgstr ""
+"preferred_charset specifas la kodoprezenton laÅ­ MIME-notacio (ekzemple\n"
+"ISO-8859-2, ISO-8859-5), kion Lynx indikos preferita en petoj\n"
+"al HTTP-serviloj uzante la kapon Accept-Charset. La valoro ne inkluzivu\n"
+"la kodoprezentojn ISO-8859-1 aÅ­ US-ASCII pro tio, ke tiuj valoroj jam estas\n"
+"aÅ­tomate supozitaj. Povas esti listo apartigitaj per komoj.\n"
+"Se dosiero laÅ­ tiu kodoprezento estas disponebla, la servilo sendos Äin.\n"
+"Se neniu kapo Accept-Charset estas ĉeesta, la aŭtomata valoro estas ĉia\n"
+"kodoprezento aprobinda. Se kapo Accept-Charset ĉeestas,\n"
+"kaj se la servilo ne eblas sendi respondon, kiu estas aprobinda\n"
+"laÅ­ la kapo Accept-Charset, do la servilo sendu eraro-respondon\n"
+"kvankam sendi malaprobindan respondon\n"
+"ankaÅ­ estas permesata.\n"
+
+#: src/LYrcFile.c:553
+msgid ""
+"preferred_language specifies the language in MIME notation (e.g., en,\n"
+"fr, may be a comma-separated list in decreasing preference)\n"
+"which Lynx will indicate you prefer in requests to http servers.\n"
+"If a file in that language is available, the server will send it.\n"
+"Otherwise, the server will send the file in its default language.\n"
+msgstr ""
+"preferred_language specifas la lingvon laÅ­ MIME-notacio (ekzemple en,\n"
+"fr, povas esti listo, apartigita per komoj, laÅ­ prefero)\n"
+"kion Lynx indikos, ke vi preferas en petoj al HTTP-serviloj.\n"
+"Se dosiero en tiu lingvo estas disponebla, la servilo sendos Äin.\n"
+"Aliokaze la servilo sendos la dosieron en sia apriora lingvo.\n"
+
+#: src/LYrcFile.c:564
+msgid ""
+"If run_all_execution_links is set \"on\" then all local execution links\n"
+"will be executed when they are selected.\n"
+"\n"
+"WARNING - This is potentially VERY dangerous. Since you may view\n"
+" information that is written by unknown and untrusted sources\n"
+" there exists the possibility that Trojan horse links could be\n"
+" written. Trojan horse links could be written to erase files\n"
+" or compromise security. This should only be set to \"on\" if\n"
+" you are viewing trusted source information.\n"
+msgstr ""
+"Se run_all_execution_links havas la valoron \"on\", ĉiuj lokaj\n"
+"plenumeblaj ligiloj estos plenumigitaj kiam ili estas elektitaj.\n"
+"\n"
+"ATENTO - Tio estas eventuale TRE danÄera pro\n"
+"eventualaj nekonataj fontoj.\n"
+"Pro tio ekzistas eblecon de malica programo,\n"
+"kiun povus forigi dosierojn.\n"
+"aÅ­ kompromiti sekurecon. Nur elektu la valoron \"on\",\n"
+"se vi vidas informojn el tute fidindaj fontoj.\n"
+
+#: src/LYrcFile.c:575
+msgid ""
+"If run_execution_links_on_local_files is set \"on\" then all local\n"
+"execution links that are found in LOCAL files will be executed when they\n"
+"are selected. This is different from run_all_execution_links in that\n"
+"only files that reside on the local system will have execution link\n"
+"permissions.\n"
+"\n"
+"WARNING - This is potentially dangerous. Since you may view\n"
+" information that is written by unknown and untrusted sources\n"
+" there exists the possibility that Trojan horse links could be\n"
+" written. Trojan horse links could be written to erase files\n"
+" or compromise security. This should only be set to \"on\" if\n"
+" you are viewing trusted source information.\n"
+msgstr ""
+"Se run_execution_links_on_local_files havas la valoron \"on\",\n"
+"ĉiuj lokaj plenumeblaj ligiloj trovitaj en LOKAJ dosieroj\n"
+"estos plenumigitaj kiam ili estas elektitaj.\n"
+"Ĉi tio estas malsama de run_execution_links pro tio, ke nur dosieroj,\n"
+"kiuj estas en via loka komputilo estos plenumeblaj.\n"
+"\n"
+"ATENTO - Tio estas eventuale TRE danÄera pro\n"
+"eventualaj nekonataj fontoj.\n"
+"Pro tio ekzistas eblecon de malica programo,\n"
+"kiun povus forigi dosierojn.\n"
+"aÅ­ kompromiti sekurecon. Nur elektu la valoron \"on\",\n"
+"se vi vidas informojn el tute fidindaj fontoj.\n"
+
+#: src/LYrcFile.c:593
+msgid ""
+"select_popups specifies whether the OPTIONs in a SELECT block which\n"
+"lacks a MULTIPLE attribute are presented as a vertical list of radio\n"
+"buttons or via a popup menu. Note that if the MULTIPLE attribute is\n"
+"present in the SELECT start tag, Lynx always will create a vertical list\n"
+"of checkboxes for the OPTIONs. A value of \"on\" will set popup menus\n"
+"as the default while a value of \"off\" will set use of radio boxes.\n"
+"The default can be overridden via the -popup command line toggle.\n"
+msgstr ""
+"select_popups specifas ĉu la elektoj en elekto-listoj, kiuj\n"
+"povas havi nur unu elekton, estas prezentitaj kiel vertikala listo da\n"
+"radiobutonoj aÅ­ Åprucmenuo. Notu, ke se la elekto permesas plurajn elektojn,\n"
+"Lynx ĉiam kreos vertikalan liston de markobutonoj por la elektoj.\n"
+"Valoro de \"on\" specifas, ke aro da Åprucmenuoj estas preferataj.\n"
+"Valoro de \"off\" specifas, ke aro da radiobutonoj estas preferataj.\n"
+"La aÅ­tomatan valoron oni povas nuligi per la komandlinian parametron -popup.\n"
+
+#: src/LYrcFile.c:604
+msgid ""
+"show_color specifies how to set the color mode at startup. A value of\n"
+"\"never\" will force color mode off (treat the terminal as monochrome)\n"
+"at startup even if the terminal appears to be color capable. A value of\n"
+"\"always\" will force color mode on even if the terminal appears to be\n"
+"monochrome, if this is supported by the library used to build lynx.\n"
+"A value of \"default\" will yield the behavior of assuming\n"
+"a monochrome terminal unless color capability is inferred at startup\n"
+"based on the terminal type, or the -color command line switch is used, or\n"
+"the COLORTERM environment variable is set. The default behavior always is\n"
+"used in anonymous accounts or if the \"option_save\" restriction is set.\n"
+"The effect of the saved value can be overridden via\n"
+"the -color and -nocolor command line switches.\n"
+"The mode set at startup can be changed via the \"show color\" option in\n"
+"the 'o'ptions menu. If the option settings are saved, the \"on\" and\n"
+"\"off\" \"show color\" settings will be treated as \"default\".\n"
+msgstr ""
+"show_color specifas, kiel agordi kolorreÄimon dum plenumo. Valoro de\n"
+"\"never\" devigos kolorreÄimon malÅaltita (trakti la terminalon kiel unukoloran)\n"
+"dum plenumo, eĉ se la terminalo Åajnas esti plurkolora. Valoro de\n"
+"\"always\" devigos kolorreÄimon Åaltita eĉ se la terminalo Åajnas esti\n"
+"unuklora, se tio estas regata de la biblioteko uzata por munti Lynx-on.\n"
+"Valoro de \"default\" cedos la konduton de supozado\n"
+"unukolora terminalo se kolora kapablo ne estas decidita dum plenumo\n"
+"bazita sur la terminala tipo, aÅ­ la komandlinia parametro -color, aÅ­\n"
+"la medivariablo COLORTERM estas valorizita. La aŭtomata konduto ĉiam estas\n"
+"uzita en sennomaj kontoj aÅ­ se la limigo \"option_save\" estas valorizita.\n"
+"La efikon de la konservita voloro oni povas nuligi per\n"
+"la komandliniaj parametroj -color kaj -nocolor.\n"
+"La reÄimo aÅ­tomata je plenumo povos ÅanÄita per la agordaĵo \"montri kolorojn\" en\n"
+"la agordoj. Se la agordaĵoj estas konservitaj, la agordaĵoj \"on\" kaj \"off\"\n"
+"agordaĵoj de \"montri kolorojn\" estos traktitaj same al \"default\".\n"
+
+#: src/LYrcFile.c:621
+msgid ""
+"show_cursor specifies whether to 'hide' the cursor to the right (and\n"
+"bottom, if possible) of the screen, or to place it to the left of the\n"
+"current link in documents, or current option in select popup windows.\n"
+"Positioning the cursor to the left of the current link or option is\n"
+"helpful for speech or braille interfaces, and when the terminal is\n"
+"one which does not distinguish the current link based on highlighting\n"
+"or color. A value of \"on\" will set positioning to the left as the\n"
+"default while a value of \"off\" will set 'hiding' of the cursor.\n"
+"The default can be overridden via the -show_cursor command line toggle.\n"
+msgstr ""
+"show_cursor specifas ĉu 'kaÅi' la kursoron ĉe la dekstro (kaj\n"
+"subo, se eble) de la ekrano, aÅ­ meti Äin ĉe la maldekstro de la\n"
+"nuna ligilo en dokumentoj, aÅ­ nuna elekto en elekto-listo.\n"
+"Meti la kursoron ĉe la maldekstro de la nuna ligilo aŭ elekto estas\n"
+"helpa por parolaj kaj brajlaj fasadoj, kaj kiam la terminalo estas\n"
+"tia, kia ne distingas la nunan ligilon bazita sur prilumado\n"
+"aÅ­ koloro. Valoro de \"on\" metos Äin ĉe la maldekstro aÅ­tomate.\n"
+"La valoro de \"off\" metos la kursoron 'kaÅanta'.\n"
+"La aÅ­tomatan valoron oni povas nuligi per la komandlinia parametro -show_cursor.\n"
+
+#: src/LYrcFile.c:632
+msgid ""
+"show_dotfiles specifies that the directory listing should include\n"
+"\"hidden\" (dot) files/directories. If set \"on\", this will be\n"
+"honored only if enabled via userdefs.h and/or lynx.cfg, and not\n"
+"restricted via a command line switch. If display of hidden files\n"
+"is disabled, creation of such files via Lynx also is disabled.\n"
+msgstr ""
+"show_dotfiles specifas, ke la dosierujlisto inkluzivu\n"
+"\"kaÅatajn\" (punktajn) dosier(uj)ojn. Valoro de \"on\" estos\n"
+"obeataj nur se aktivigitaj per userdefs.h kajaÅ­ lynx.cfg, kaj ne\n"
+"malÅaltita per komandlinia parametro. Se montrado de kaÅataj dosieroj\n"
+"estas malaktivigita, kredado de tiaj dosieroj en Lynx ankaÅ­ estas malaktivigita.\n"
+
+#: src/LYrcFile.c:643
+msgid ""
+"If sub_bookmarks is not turned \"off\", and multiple bookmarks have\n"
+"been defined (see below), then all bookmark operations will first\n"
+"prompt the user to select an active sub-bookmark file. If the default\n"
+"Lynx bookmark_file is defined (see above), it will be used as the\n"
+"default selection. When this option is set to \"advanced\", and the\n"
+"user mode is advanced, the 'v'iew bookmark command will invoke a\n"
+"statusline prompt instead of the menu seen in novice and intermediate\n"
+"user modes. When this option is set to \"standard\", the menu will be\n"
+"presented regardless of user mode.\n"
+msgstr ""
+"Se sub_bookmarks ne havas valoron de \"off\", kaj pluraj legosignaj dosieroj\n"
+"estis difinitaj (vidu sube), do ĉiuj legosignaj operacioj unue demandos\n"
+"ke la uzanto elektu aktiva sublegosigna dosiero. Se la aÅ­tomata\n"
+"Lynx-bookmark_file estas difinita (vidu supre), Äi estos uzita kiel la\n"
+"aŭtomata elekto. Kiam la valoro de tiu agordaĵo estas \"advanced\", kaj la\n"
+"uzantoreÄimo estas altnivela, la komandon \"'v'idi legosignojn\" kreos\n"
+"statlinian demandilon anstataÅ­ la menuo vidata en la uzantoreÄimoj novula kaj meznivela\n"
+"Kiam tiu elekto estas \"standard\", la menuo estos\n"
+"prezentita senkonsidere de uzantoreÄimo.\n"
+
+#: src/LYrcFile.c:658
+msgid ""
+"user_mode specifies the users level of knowledge with Lynx. The\n"
+"default is \"NOVICE\" which displays two extra lines of help at the\n"
+"bottom of the screen to aid the user in learning the basic Lynx\n"
+"commands. Set user_mode to \"INTERMEDIATE\" to turn off the extra info.\n"
+"Use \"ADVANCED\" to see the URL of the currently selected link at the\n"
+"bottom of the screen.\n"
+msgstr ""
+"user_mode specifas la scinivelon de la uzanto. La aÅ­tomata valoro\n"
+"estas \"NOVICE\", kiu montras du aldonajn liniojn da helpo ĉe la\n"
+"malsupro de la ekrano por helpi al la uzanto lerni la fundamentajn\n"
+"komandoj de Lynx. Valoro de \"INTERMEDIATE\" malÅaltas la aldonajn\n"
+"informojn. \"Advanced\" montras la URL-on de la nuna ligilo ĉe la\n"
+"malsupro de la ekrano.\n"
+
+#: src/LYrcFile.c:667
+msgid ""
+"If verbose_images is \"on\", lynx will print the name of the image\n"
+"source file in place of [INLINE], [LINK] or [IMAGE]\n"
+"See also VERBOSE_IMAGES in lynx.cfg\n"
+msgstr ""
+"Se la valoro de verbose_images estas \"on\", Lynx montros la dosiernomon\n"
+"de la bildo anstataŭ ĉenon [INLINE], [LINK], aŭ [IMAGE]\n"
+
+#: src/LYrcFile.c:672
+msgid ""
+"If vi_keys is set to \"on\", then the normal VI movement keys:\n"
+" j = down k = up\n"
+" h = left l = right\n"
+"will be enabled. These keys are only lower case.\n"
+"Capital 'H', 'J' and 'K will still activate help, jump shortcuts,\n"
+"and the keymap display, respectively.\n"
+msgstr ""
+"Se la valoro de vi_keys estas \"on\", do la ordinaraj moviloj de Vi:\n"
+" j = suben k = supren\n"
+" h = maldekstren l = dekstren\n"
+"estos aktivigitaj. La klavoj nur estas minusklaj.\n"
+"Majusklaj 'H', 'J' kaj 'K' malgraÅ­e aktivigos la helpilon, saltojn,\n"
+"kaj la klavomapon, respektive.\n"
+
+#: src/LYrcFile.c:680
+msgid ""
+"The visited_links setting controls how Lynx organizes the information\n"
+"in the Visited Links Page.\n"
+msgstr ""
+"La agordaĵo visited_links regas, kiel Lynx organizas la informojn\n"
+"en la paÄo 'Vizititaj Ligiloj'.\n"
+
+#: src/LYrcFile.c:924
+msgid ""
+"If keypad_mode is set to \"NUMBERS_AS_ARROWS\", then the numbers on\n"
+"your keypad when the numlock is on will act as arrow keys:\n"
+" 8 = Up Arrow\n"
+" 4 = Left Arrow 6 = Right Arrow\n"
+" 2 = Down Arrow\n"
+"and the corresponding keyboard numbers will act as arrow keys,\n"
+"regardless of whether numlock is on.\n"
+msgstr ""
+"Se la valoro de keypad_mode estas \"NUMBERS_AS_ARROWS\", la ciferoj sur\n"
+"via cifera klavaro (kiam aktiva) kondutos kiel sagoklavoj:\n"
+" 8 = Supra\n"
+" 4 = Maldekstra 6 = Dekstra\n"
+" 2 = Malsupra\n"
+
+#: src/LYrcFile.c:933
+msgid ""
+"If keypad_mode is set to \"LINKS_ARE_NUMBERED\", then numbers will\n"
+"appear next to each link and numbers are used to select links.\n"
+msgstr ""
+"Se la valoro de keypad_mode estas \"LINKS_ARE_NUMBERED\", do ciferoj\n"
+"aperos apud ĉiu ligilo kaj ciferoj uziÄos por elekti ligilojn.\n"
+
+#: src/LYrcFile.c:937
+msgid ""
+"If keypad_mode is set to \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\", then\n"
+"numbers will appear next to each link and visible form input field.\n"
+"Numbers are used to select links, or to move the \"current link\" to a\n"
+"form input field or button. In addition, options in popup menus are\n"
+"indexed so that the user may type an option number to select an option in\n"
+"a popup menu, even if the option isn't visible on the screen. Reference\n"
+"lists and output from the list command also enumerate form inputs.\n"
+msgstr ""
+"Se la valoro de keypad_mode estas \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\",\n"
+"ciferoj aperos apud ĉiu ligilo kaj videbla formularia kampo.\n"
+"Ciferoj estas uzitaj por elekti ligilojn, aÅ­ movi la \"nunan ligilon\" al\n"
+"formularia kampo aÅ­ butono. Aldone elektoj en elekto-listoj estas indicitaj\n"
+"por ke la uzanto povu tajpi elektan ciferon por elekti elekton en\n"
+"Åprucmenuoj, eĉ se la elekto ne estas videbla sur la ekrano. Referencaj\n"
+"listoj kaj eligoj de la lista komando ankaŭ nombras formulariajn aĵojn.\n"
+
+#: src/LYrcFile.c:946
+msgid ""
+"NOTE: Some fixed format documents may look disfigured when\n"
+"\"LINKS_ARE_NUMBERED\" or \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\" are\n"
+"enabled.\n"
+msgstr ""
+"NOTO: Iuj fikse formatitaj dokumentoj eble aspektos fuÅformitaj kiam\n"
+"\"LINKS_ARE_NUMBERED\" aÅ­ \"LINKS_AND_FORM_FIELDS\" estas\n"
+"aktivaj.\n"
+
+#: src/LYrcFile.c:978
+msgid ""
+"Lynx User Defaults File\n"
+"\n"
+msgstr ""
+"Dosiero pri propraj agordaĵoj de Lynx-uzanto\n"
+"\n"
+
+#: src/LYrcFile.c:987
+msgid ""
+"This file contains options saved from the Lynx Options Screen (normally\n"
+"with the 'o' key). To save options with that screen, you must select the\n"
+"checkbox:\n"
+msgstr ""
+"Ĉi tiu dosiero enhavas agordaĵojn konservitajn de la agordilo de Lynx\n"
+"(ordinare per la klavo 'o'). Por konservi agordaĵojn en tio, oni devas elekti la\n"
+"markobutonon:\n"
+
+#: src/LYrcFile.c:994
+msgid ""
+"You must then save the settings using the link on the line above the\n"
+"checkbox:\n"
+msgstr ""
+"Vi devas poste konservi la agordaĵojn per la ligilo en la linio supra\n"
+"al la markobutono:\n"
+
+#: src/LYrcFile.c:1001
+msgid ""
+"You may also use the command-line option \"-forms_options\", which displays\n"
+"the simpler Options Menu instead. Save options with that using the '>' key.\n"
+"\n"
+msgstr ""
+"Vi povas ankaÅ­ uzi la komandlinian parametron \"-forms_options\", kiu anstataÅ­e\n"
+"montras la pli mallongan menuon. Konservi agordaĵojn per la klavo '>'.\n"
+"\n"
+
+#: src/LYrcFile.c:1008
+msgid ""
+"This file contains options saved from the Lynx Options Screen (normally\n"
+"with the '>' key).\n"
+"\n"
+msgstr ""
+"Ĉi tiu dosiero enhavas agordaĵojn konservitajn el la agordilo de Lynx\n"
+"(ordinare per la klavo '>').\n"
+"\n"
+
+#: src/LYrcFile.c:1015
+msgid ""
+"There is normally no need to edit this file manually, since the defaults\n"
+"here can be controlled from the Options Screen, and the next time options\n"
+"are saved from the Options Screen this file will be completely rewritten.\n"
+"You have been warned...\n"
+"\n"
+"If you are looking for the general configuration file - it is normally\n"
+"called \"lynx.cfg\". It has different content and a different format.\n"
+"It is not this file.\n"
+msgstr ""
+"Ordinare ekzistas neniu bezono por permane redakti ĉi tiun dosieron pro tio, ke la aŭtomataj valoroj\n"
+"en Äi povas esti regata de la agordilo, kaj je la sekva fojo, ke agordaĵoj\n"
+"estas konservitaj de la agordilo, ĉi tiu dosiero estos reskribita.\n"
+"Mi avertis vin...\n"
+"\n"
+"Se vi serĉas la Äeneralan agordo-dosieron - Äi ordinare\n"
+"nomiÄas \"lynx.cfg\". Äœi havas malsaman enhavon kaj formaton.\n"
+"Ĝi ne estas ĉi tiu dosiero.\n"
+
+#~ msgid "Minimal"
+#~ msgstr "Minimuma"
+
+#~ msgid "brotli"
+#~ msgstr "brotli"
diff --git a/po/et.po b/po/et.po
new file mode 100644
index 0000000..bddda85
--- /dev/null
+++ b/po/et.po
@@ -0,0 +1,6403 @@
+# This file is distributed under the same license as the lynx package.
+# Estonian translations for lynx
+# Copyright (C) 2001 Free Software Foundation, Inc.
+# Toomas Soome <tsoome@me.com>, 2021.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: lynx 2.9.0-dev8\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-07-31 10:04-0400\n"
+"PO-Revision-Date: 2021-08-01 19:53+0300\n"
+"Last-Translator: Toomas Soome <tsoome@me.com>\n"
+"Language-Team: Estonian <linux-ee@lists.eenet.ee>\n"
+"Language: et\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8-bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+
+#. ******************************************************************
+#. * The following definitions are for status line prompts, messages, or
+#. * warnings issued by Lynx during program execution. You can modify
+#. * them to make them more appropriate for your site. We recommend that
+#. * you extend these definitions to other languages using the gettext
+#. * library. There are also scattered uses of 'gettext()' throughout the
+#. * Lynx source, covering all but those messages which (a) are used for
+#. * debugging (CTRACE) or (b) are constants used in interaction with
+#. * other programs.
+#. *
+#. * See ABOUT-NLS and po/readme for details and location of contributed
+#. * translations. When no translation is available, the English default is
+#. * used.
+#.
+#: LYMessages.c:28
+#, c-format
+msgid "Alert!: %s"
+msgstr "Tähelepanu!: %s"
+
+#: LYMessages.c:29
+msgid "Welcome"
+msgstr "Tere tulemast"
+
+#: LYMessages.c:30
+msgid "Are you sure you want to quit?"
+msgstr "Olete kindel, et soovite väljuda?"
+
+#: LYMessages.c:32
+msgid "Really exit from Lynx?"
+msgstr "Soovite tõesti väljuda Lynxist?"
+
+#: LYMessages.c:34
+msgid "Connection interrupted."
+msgstr "Ãœhendus katkestati."
+
+#: LYMessages.c:35
+msgid "Data transfer interrupted."
+msgstr "Andmete ülekanne katkestati."
+
+#: LYMessages.c:36
+msgid "Cancelled!!!"
+msgstr "Katkestatud!!!"
+
+#: LYMessages.c:37
+msgid "Cancelling!"
+msgstr "Katkestan!!!"
+
+#: LYMessages.c:38
+msgid "Excellent!!!"
+msgstr "Suurepärane!!!"
+
+#: LYMessages.c:39
+msgid "OK"
+msgstr "OK"
+
+#: LYMessages.c:40
+msgid "Done!"
+msgstr "Valmis!"
+
+#: LYMessages.c:41
+msgid "Bad request!"
+msgstr "Halb päring!"
+
+#: LYMessages.c:42
+msgid "previous"
+msgstr "eelmine"
+
+#: LYMessages.c:43
+msgid "next screen"
+msgstr "järgmine ekraan"
+
+#: LYMessages.c:44
+msgid "HELP!"
+msgstr "APPI!"
+
+#: LYMessages.c:45
+msgid ", help on "
+msgstr ", abiinfo"
+
+#. #define HELP
+#: LYMessages.c:47
+msgid "Commands: Use arrow keys to move, '?' for help, 'q' to quit, '<-' to go back."
+msgstr "Käsud: Liikumiseks kasutage nooli, '?' abiinfo, 'q' väljumine, '<-' tagasi."
+
+#. #define MOREHELP
+#: LYMessages.c:49
+msgid "-- press space for more, use arrow keys to move, '?' for help, 'q' to quit."
+msgstr "-- edasi saate tühikuga, liikumiseks nooled, '?' annab abi. väljumiseks 'q'."
+
+#: LYMessages.c:50
+msgid "-- press space for next page --"
+msgstr "-- vajutage tühikut --"
+
+#: LYMessages.c:51
+msgid "URL too long"
+msgstr "URL on liiga pikk"
+
+#. Inactive input fields, messages used with -tna option - kw
+#. #define FORM_LINK_TEXT_ADV_MSG_INA
+#: LYMessages.c:57
+#, c-format
+msgid "(Textfield \"%s\"); Inactive. Press <return> to activate."
+msgstr "(Tekstiväli \"%s\"); Pole aktiivne. Aktiveerimiseks vajutage <return>."
+
+#. #define FORM_LINK_TEXT_MESSAGE_INA
+#: LYMessages.c:59
+msgid "(Text entry field) Inactive. Press <return> to activate."
+msgstr "(Tekstiväli) Pole aktiivne. Aktiveerimiseks vajutage <return>."
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG_INA
+#: LYMessages.c:61
+#, c-format
+msgid "(Textarea \"%s\"); Inactive. Press <return> to activate."
+msgstr "(Tekstiala \"%s\"); Pole aktiivne. Aktiveerimiseks vajutage <return>."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_INA
+#: LYMessages.c:63
+msgid "(Textarea) Inactive. Press <return> to activate."
+msgstr "(Tekstiala) Pole aktiivne. Aktiveerimiseks vajutage <return>."
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG_INA_E
+#: LYMessages.c:65
+#, c-format
+msgid "(Textarea \"%s\"); Inactive. Press <return> to activate (%s for editor)."
+msgstr "(Tekstiala \"%s\"); Pole aktiivne. Aktiveerimiseks vajutage <return> (%s toimeti)."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_INA_E
+#: LYMessages.c:67
+#, c-format
+msgid "(Textarea) Inactive. Press <return> to activate (%s for editor)."
+msgstr "(Tekstiala) Pole aktiivne. Aktiveerimiseks vajutage <return> (%s toimeti)."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE_INA
+#: LYMessages.c:69
+msgid "(Form field) Inactive. Use <return> to edit."
+msgstr "(Vormiväli) Pole aktiivne. Toimetamiseks vajutage <return>."
+
+#. #define FORM_TEXT_SUBMIT_MESSAGE_INA_X
+#: LYMessages.c:71
+#, c-format
+msgid "(Form field) Inactive. Use <return> to edit (%s to submit with no cache)."
+msgstr "(Vormiväli) Pole aktiivne. Toimetamiseks <return> (%s saada puhverdamata)."
+
+#. #define FORM_TEXT_RESUBMIT_MESSAGE_INA
+#: LYMessages.c:73
+msgid "(Form field) Inactive. Press <return> to edit, press <return> twice to submit."
+msgstr "(Vormiväli) Pole aktiivne. Toimetamiseks <return>, saatmiseks topelt."
+
+#. #define FORM_TEXT_SUBMIT_MAILTO_MSG_INA
+#: LYMessages.c:75
+msgid "(mailto form field) Inactive. Press <return> to change."
+msgstr "(mailto vormi väli) Pole aktiivne. Muutmiseks vajutage <return>."
+
+#. #define FORM_LINK_PASSWORD_MESSAGE_INA
+#: LYMessages.c:77
+msgid "(Password entry field) Inactive. Press <return> to activate."
+msgstr "(Parooliväli) Pole aktiivne. Aktiveerimiseks vajutage <return>."
+
+#. #define FORM_LINK_FILE_UNM_MSG
+#: LYMessages.c:80
+msgid "UNMODIFIABLE file entry field. Use UP or DOWN arrows or tab to move off."
+msgstr "MITTEMUUDETAV failiväli. Väljalt lahkumiseks kasutage ÜLES, ALLA või TAB."
+
+#. #define FORM_LINK_FILE_MESSAGE
+#: LYMessages.c:82
+msgid "(File entry field) Enter filename. Use UP or DOWN arrows or tab to move off."
+msgstr "(Failiväli) Sisestage faili nimi. Väljalt lahkumiseks ÜLES, ALLA või TAB."
+
+#. #define FORM_LINK_TEXT_ADV_MSG
+#. #define FORM_LINK_TEXT_MESSAGE
+#: LYMessages.c:84 LYMessages.c:86
+#, c-format
+msgid "(Textfield \"%s\"); Enter text. Use UP or DOWN arrows or tab to move off."
+msgstr "(Tekstiväli \"%s\"); Sisestage tekst. Väljalt lahkumiseks ÜLES, ALLA või TAB."
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG
+#: LYMessages.c:88
+#, c-format
+msgid "(Textarea \"%s\"); Enter text. Use UP/DOWN arrows or TAB to move off."
+msgstr "(Tekstiala \"%s\"); Sisestage tekst. Lahkumiseks kasutage ÜLES, ALLA või TAB."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE
+#: LYMessages.c:90
+msgid "(Textarea) Enter text. Use UP/DOWN arrows or TAB to move off."
+msgstr "(Tekstiala) Sisestage tekst. Lahkumiseks kasutage ÜLES, ALLA või TAB."
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG_E
+#: LYMessages.c:92
+#, c-format
+msgid "(Textarea \"%s\"); Enter text. Use UP/DOWN arrows or TAB to move off (%s for editor)."
+msgstr "(Tekstiala \"%s\"); Sisestage tekst. Lahkumiseks ÜLES, ALLA või TAB (%s toimeti)."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_E
+#: LYMessages.c:94
+#, c-format
+msgid "(Textarea) Enter text. Use UP/DOWN arrows or TAB to move off (%s for editor)."
+msgstr "(Tekstiala) Sisestage tekst. Lahkumiseks ÜLES, ALLA või TAB (%s toimeti)."
+
+#. #define FORM_LINK_TEXT_UNM_MSG
+#: LYMessages.c:96
+msgid "UNMODIFIABLE form text field. Use UP or DOWN arrows or tab to move off."
+msgstr "MITTEMUUDETAV vormi tekst. Väljalt lahkumiseks ÜLES, ALLA või TAB."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE
+#: LYMessages.c:98
+msgid "(Form field) Enter text. Use <return> to submit."
+msgstr "(Vormi väli) Sisestage tekst. Saatmiseks vajutage <return>."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE_X
+#: LYMessages.c:100
+#, c-format
+msgid "(Form field) Enter text. Use <return> to submit (%s for no cache)."
+msgstr "(Vormi väli) Sisestage tekst. Saatmiseks vajutage <return> (%s puhverdamata)."
+
+#. #define FORM_LINK_TEXT_RESUBMIT_MESSAGE
+#: LYMessages.c:102
+msgid "(Form field) Enter text. Use <return> to submit, arrows or tab to move off."
+msgstr "(Vormi väli) Sisestage tekst. Saatmiseks <return>, lahkumiseks nooled/tab."
+
+#. #define FORM_LINK_TEXT_SUBMIT_UNM_MSG
+#: LYMessages.c:104
+msgid "UNMODIFIABLE form field. Use UP or DOWN arrows or tab to move off."
+msgstr "MITTEMUUDETAV vormi väli. Lahkumiseks nooled või tab."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MAILTO_MSG
+#: LYMessages.c:106
+msgid "(mailto form field) Enter text. Use <return> to submit, arrows to move off."
+msgstr "(mailto vorm) Sisestage tekst. Postitamiseks <return>, lahkumiseks nooled."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MAILTO_DIS_MSG
+#: LYMessages.c:108
+msgid "(mailto form field) Mail is disallowed so you cannot submit."
+msgstr "(mailto vorm) E-post on blokeeritud, seega postitada ei saa."
+
+#. #define FORM_LINK_PASSWORD_MESSAGE
+#: LYMessages.c:110
+msgid "(Password entry field) Enter text. Use UP or DOWN arrows or tab to move off."
+msgstr "(Parooliväli) Sisestage tekst. Lahkumiseks nooled või tab."
+
+#. #define FORM_LINK_PASSWORD_UNM_MSG
+#: LYMessages.c:112
+msgid "UNMODIFIABLE form password. Use UP or DOWN arrows or tab to move off."
+msgstr "MITTEMUUDETAV vormi parool. Lahkumiseks nooled või tab."
+
+#. #define FORM_LINK_CHECKBOX_ADV_MSG
+#: LYMessages.c:114
+#, c-format
+msgid "(Checkbox \"%s\"); Use right-arrow or <return> to toggle."
+msgstr "(Märkeruut \"%s\"); Valimiseks kasutage nool paremale või <return>."
+
+#. #define FORM_LINK_CHECKBOX_MESSAGE
+#: LYMessages.c:116
+msgid "(Checkbox Field) Use right-arrow or <return> to toggle."
+msgstr "(Märkeruut) Valimiseks kasutage nool paremale või <return>."
+
+#. #define FORM_LINK_CHECKBOX_UNM_MSG
+#: LYMessages.c:118
+msgid "UNMODIFIABLE form checkbox. Use UP or DOWN arrows or tab to move off."
+msgstr "MITTEMUUDETAV märkeruut. Lahkumiseks nooled või tab."
+
+#. #define FORM_LINK_RADIO_ADV_MSG
+#: LYMessages.c:120
+#, c-format
+msgid "(Radio Button \"%s\"); Use right-arrow or <return> to toggle."
+msgstr "(Raadionupp \"%s\"); Valimiseks kasutage nool paremale või <return>."
+
+#. #define FORM_LINK_RADIO_MESSAGE
+#: LYMessages.c:122
+msgid "(Radio Button) Use right-arrow or <return> to toggle."
+msgstr "(Raadionupp) Valimiseks kasutage nool paremale või <return>."
+
+#. #define FORM_LINK_RADIO_UNM_MSG
+#: LYMessages.c:124
+msgid "UNMODIFIABLE form radio button. Use UP or DOWN arrows or tab to move off."
+msgstr "MITTEMUUDETAV raadionupp. Lahkumiseks nooled või tab."
+
+#. #define FORM_LINK_SUBMIT_PREFIX
+#: LYMessages.c:126
+msgid "Submit ('x' for no cache) to "
+msgstr "postita ('x' puhverdamata): "
+
+#. #define FORM_LINK_RESUBMIT_PREFIX
+#: LYMessages.c:128
+msgid "Submit to "
+msgstr "Postita: "
+
+#. #define FORM_LINK_SUBMIT_MESSAGE
+#: LYMessages.c:130
+msgid "(Form submit button) Use right-arrow or <return> to submit ('x' for no cache)."
+msgstr "(Vormi postitamine) Täitmiseks nool paremale või <return> ('x' ei puhverda)."
+
+#. #define FORM_LINK_RESUBMIT_MESSAGE
+#: LYMessages.c:132
+msgid "(Form submit button) Use right-arrow or <return> to submit."
+msgstr "(Vormi postitamine) Täitmiseks nool paremale või <return>."
+
+#. #define FORM_LINK_SUBMIT_DIS_MSG
+#: LYMessages.c:134
+msgid "DISABLED form submit button. Use UP or DOWN arrows or tab to move off."
+msgstr "BLOKEERITUD vormi postitamine. Kasutage tab või nool üles või alla."
+
+#. #define FORM_LINK_SUBMIT_MAILTO_PREFIX
+#: LYMessages.c:136
+msgid "Submit mailto form to "
+msgstr "Postita mailto vorm aadressil "
+
+#. #define FORM_LINK_SUBMIT_MAILTO_MSG
+#: LYMessages.c:138
+msgid "(mailto form submit button) Use right-arrow or <return> to submit."
+msgstr "(mailto vormi postitamine) Täitmiseks nool paremale või <return>."
+
+#. #define FORM_LINK_SUBMIT_MAILTO_DIS_MSG
+#: LYMessages.c:140
+msgid "(mailto form submit button) Mail is disallowed so you cannot submit."
+msgstr "(mailto vormi postitamine) E-post on keelatud, seda ei saa kasutada."
+
+#. #define FORM_LINK_RESET_MESSAGE
+#: LYMessages.c:142
+msgid "(Form reset button) Use right-arrow or <return> to reset form to defaults."
+msgstr "(Vormi algväärtustamise nupp) Nool paremale või <return> algväärtustab. "
+
+#. #define FORM_LINK_RESET_DIS_MSG
+#: LYMessages.c:144
+msgid "DISABLED form reset button. Use UP or DOWN arrows or tab to move off."
+msgstr "BLOKEERITUD vormi algväärtustamine) Kasutage tab või nool üles või alla."
+
+#. #define FORM_LINK_BUTTON_MESSAGE
+#: LYMessages.c:146
+msgid "(Script button) Use UP or DOWN arrows or tab to move off."
+msgstr "(Skripti nupp) Kasutage tab või nool üles või alla."
+
+#. #define FORM_LINK_BUTTON_ADV_MSG
+#: LYMessages.c:148
+#, c-format
+msgid "(Script button \"%s\"); Use UP or DOWN arrows or tab to move off."
+msgstr "(Skripti nupp \"%s\"); Kasutage tab või nool üles või alla."
+
+#. #define FORM_LINK_BUTTON_DIS_MSG
+#: LYMessages.c:150
+msgid "DISABLED Script button. Use UP or DOWN arrows or tab to move off."
+msgstr "BLOKEERITUD skripti nupp. Kasutage tab või nool üles või alla."
+
+#. #define FORM_LINK_OPTION_LIST_ADV_MSG
+#: LYMessages.c:152
+#, c-format
+msgid "(Option list \"%s\"); Hit return to select option."
+msgstr "(Seadete loend \"%s\"); Vajutage return ja valige noolte ja return klahviga seade."
+
+#. #define FORM_LINK_OPTION_LIST_MESSAGE
+#: LYMessages.c:154
+msgid "(Option list) Hit return and use arrow keys and return to select option."
+msgstr "(Seadete loend) Vajutage return ja valige noolte ja return klahviga seade."
+
+#. #define CHOICE_LIST_ADV_MSG
+#: LYMessages.c:156
+#, c-format
+msgid "(Choice entry \"%s\"); Use arrow keys and return to select option."
+msgstr "(Valiku loend \"%s\"); Vajutage return ja valige noolte ja return klahviga seade."
+
+#. #define CHOICE_LIST_MESSAGE
+#: LYMessages.c:158
+msgid "(Choice list) Hit return and use arrow keys and return to select option."
+msgstr "(Valiku loend) Vajutage return ja valige noolte ja return klahviga seade."
+
+#. #define MOUSE_CHOICE_MESSAGE
+#: LYMessages.c:160
+msgid "Left mouse button or return to select, arrow keys to scroll."
+msgstr "Vasak hiire nupp või reavahetus valimiseks, nooled kerivad."
+
+#. #define FORM_LINK_OPTION_LIST_UNM_MSG
+#: LYMessages.c:162
+msgid "UNMODIFIABLE option list. Use return or arrow keys to review or leave."
+msgstr "MITTEMUUDETAVAD seaded. Vaatamiseks või liikumiseks nooled või <return>."
+
+#. #define CHOICE_LIST_UNM_MSG
+#: LYMessages.c:164
+msgid "UNMODIFIABLE choice list. Use return or arrow keys to review or leave."
+msgstr "MITTEMUUDETAVAD valikud. Vaatamiseks või liikumiseks nooled või <return>."
+
+#: LYMessages.c:165
+msgid "Submitting form..."
+msgstr "Saadan vormi..."
+
+#: LYMessages.c:166
+msgid "Resetting form..."
+msgstr "Algväärtustan vormi..."
+
+#. #define RELOADING_FORM
+#: LYMessages.c:168
+msgid "Reloading document. Any form entries will be lost!"
+msgstr "Laen dokumendi uuesti. Kõik vormi väljad lähevad kaotsi!"
+
+#. #define LINK_NOT_IN_FORM
+#: LYMessages.c:170
+msgid "The current link is not in a FORM"
+msgstr "Praegune viide ei ole VORMIS"
+
+#: LYMessages.c:171
+#, c-format
+msgid "Warning: Cannot transcode form data to charset %s!"
+msgstr "Hoiatus: Vormi andmeid ei õnnestu teisendada kooditabelisse %s!"
+
+#. #define NORMAL_LINK_MESSAGE
+#: LYMessages.c:174
+msgid "(NORMAL LINK) Use right-arrow or <return> to activate."
+msgstr "(TAVALINE VIIDE) Aktiveerimiseks kasutage nool paremale või <return>."
+
+#: LYMessages.c:175
+msgid "The resource requested is not available at this time."
+msgstr "Ressurss, mida soovisite, ei ole hetkel kättesaadav."
+
+#: LYMessages.c:176
+msgid "Enter Lynx keystroke command: "
+msgstr "Sisestage Lynxi klahvikäsklus: "
+
+#: LYMessages.c:177
+msgid "Looking up "
+msgstr "Otsin serverit "
+
+#: LYMessages.c:178
+#, c-format
+msgid "Getting %s"
+msgstr "Laen %s"
+
+#: LYMessages.c:179
+#, c-format
+msgid "Skipping %s"
+msgstr "Jätan %s vahele"
+
+#: LYMessages.c:180
+#, c-format
+msgid "Using %s"
+msgstr "Kasutan %s"
+
+#: LYMessages.c:181
+#, c-format
+msgid "Illegal URL: %s"
+msgstr "Vigane URL: %s"
+
+#: LYMessages.c:182
+#, c-format
+msgid "Badly formed address %s"
+msgstr "Vigaselt vormitud aadress %s"
+
+#: LYMessages.c:183
+#, c-format
+msgid "URL: %s"
+msgstr "URL: %s"
+
+#: LYMessages.c:184
+msgid "Unable to access WWW file!!!"
+msgstr "WWW failile pole juurdepääsu!!!"
+
+#: LYMessages.c:185
+#, c-format
+msgid "This is a searchable index. Use %s to search."
+msgstr "See on otsitav indeks. Otsimiseks kasutage %s."
+
+#. #define WWW_INDEX_MORE_MESSAGE
+#: LYMessages.c:187
+#, c-format
+msgid "--More-- This is a searchable index. Use %s to search."
+msgstr "--Veel-- See on otsitav indeks. Otsimiseks kasutage %s."
+
+#: LYMessages.c:188
+msgid "You have entered an invalid link number."
+msgstr "Te sisestasite vigase viitenumbri."
+
+#. #define SOURCE_HELP
+#: LYMessages.c:190
+msgid "Currently viewing document source. Press '\\' to return to rendered version."
+msgstr "Dokumendi algtekst. Renderdatud versiooni vaatamiseks vajutage '\\'."
+
+#. #define NOVICE_LINE_ONE
+#: LYMessages.c:192
+msgid " Arrow keys: Up and Down to move. Right to follow a link; Left to go back. \n"
+msgstr " Nooleklahvid: liikumiseks üles ja alla. Parem järgib viidet, vasakuga tagasi.\n"
+
+#. #define NOVICE_LINE_TWO
+#: LYMessages.c:194
+msgid " H)elp O)ptions P)rint G)o M)ain screen Q)uit /=search [delete]=history list \n"
+msgstr " H=appi O=seaded P=trüki G=mine M=põhiaken Q=välju /=otsing [delete]=ajalugu\n"
+
+#. #define NOVICE_LINE_TWO_A
+#: LYMessages.c:196
+msgid " O)ther cmds H)elp K)eymap G)oto P)rint M)ain screen o)ptions Q)uit \n"
+msgstr "O=muud H=abiinfo K)lahvid G=mine P)rindi M=põhiekraan o=seaded Q=välju\n"
+
+#. #define NOVICE_LINE_TWO_B
+#: LYMessages.c:198
+msgid " O)ther cmds B)ack E)dit D)ownload ^R)eload ^W)ipe screen search doc: / \n"
+msgstr "O=muud B=tagasi toim'E'ta D=lae alla ^R=lae uuesti ^W=pühi ekraan /=otsing\n"
+
+#. #define NOVICE_LINE_TWO_C
+#: LYMessages.c:200
+msgid "O)ther cmds C)omment History: <backspace> Bookmarks: V)iew, A)dd, R)emove \n"
+msgstr "O=muud käsud C=kommentaar Ajalugu: <bsp> Järjed: V)aata, A=lisa, R=eemalda \n"
+
+#. #define FORM_NOVICELINE_ONE
+#: LYMessages.c:202
+msgid " Enter text into the field by typing on the keyboard "
+msgstr " Sisestage väljale tekst "
+
+#. #define FORM_NOVICELINE_TWO
+#: LYMessages.c:204
+msgid " Ctrl-U to delete all text in field, [Backspace] to delete a character "
+msgstr " Ctrl-U kustutab väljalt kogu teksti, [Backspace] kustutab sümboli "
+
+#. #define FORM_NOVICELINE_TWO_DELBL
+#: LYMessages.c:206
+msgid " Ctrl-U to delete text in field, [Backspace] to delete a character "
+msgstr " Ctrl-U kustutab väljalt teksti, [Backspace] kustutab sümboli "
+
+#. #define FORM_NOVICELINE_TWO_VAR
+#: LYMessages.c:208
+#, c-format
+msgid " %s to delete all text in field, [Backspace] to delete a character "
+msgstr " %s kustutab väljalt kogu teksti, [Backspace] kustutab sümboli "
+
+#. #define FORM_NOVICELINE_TWO_DELBL_VAR
+#: LYMessages.c:210
+#, c-format
+msgid " %s to delete text in field, [Backspace] to delete a character "
+msgstr " %s kustutab väljalt teksti, [Backspace] kustutab sümboli "
+
+#. mailto
+#: LYMessages.c:213
+msgid "Malformed mailto form submission! Cancelled!"
+msgstr "Vigane mailto vormi edastamine! Katkestasin!"
+
+#: LYMessages.c:214
+msgid "Warning! Control codes in mail address replaced by ?"
+msgstr "Hoiatus! Asendasin kontrollkoodid kirja aadressis küsimärkidega"
+
+#: LYMessages.c:215
+msgid "Mail disallowed! Cannot submit."
+msgstr "Kirjad ei ole lubatud! Ei saa postitada."
+
+#: LYMessages.c:216
+msgid "Mailto form submission failed!"
+msgstr "Mailto vormi andmete edastamine ebaõnnestus!"
+
+#: LYMessages.c:217
+msgid "Mailto form submission Cancelled!!!"
+msgstr "Mailto vormi andmete edastamine katkestati!!!"
+
+#: LYMessages.c:218
+msgid "Sending form content..."
+msgstr "Saadan vormi sisu..."
+
+#: LYMessages.c:219
+msgid "No email address is present in mailto URL!"
+msgstr "mailto URLis puudub e-posti aadress!"
+
+#. #define MAILTO_URL_TEMPOPEN_FAILED
+#: LYMessages.c:221
+msgid "Unable to open temporary file for mailto URL!"
+msgstr "mailto URLile ei õnnestu avada ajutist faili!"
+
+#. #define INC_ORIG_MSG_PROMPT
+#: LYMessages.c:223
+msgid "Do you wish to include the original message?"
+msgstr "Kas te soovite kaasata originaalteadet?"
+
+#. #define INC_PREPARSED_MSG_PROMPT
+#: LYMessages.c:225
+msgid "Do you wish to include the preparsed source?"
+msgstr "Kas soovite kaasata eelnevalt töödeldud teksti?"
+
+#. #define SPAWNING_EDITOR_FOR_MAIL
+#: LYMessages.c:227
+msgid "Spawning your selected editor to edit mail message"
+msgstr "Käivitan kirja toimetamiseks teie poolt valitud toimeti"
+
+#. #define ERROR_SPAWNING_EDITOR
+#: LYMessages.c:229
+msgid "Error spawning editor, check your editor definition in the options menu"
+msgstr "Viga toimeti käivitamisel, kontrollige toimeti definitsiooni seadete menüüs"
+
+#: LYMessages.c:230
+msgid "Send this comment?"
+msgstr "Saata teie kommentaar?"
+
+#: LYMessages.c:231
+msgid "Send this message?"
+msgstr "Saata teie teade?"
+
+#: LYMessages.c:232
+msgid "Sending your message..."
+msgstr "Saadan teie teadet..."
+
+#: LYMessages.c:233
+msgid "Sending your comment:"
+msgstr "Saadan teie kommentaari:"
+
+#. textarea
+#: LYMessages.c:236
+msgid "Not in a TEXTAREA; cannot use external editor."
+msgstr "Pole TEXTAREA, välist toimetit ei saa kasutada."
+
+#: LYMessages.c:237
+msgid "Not in a TEXTAREA; cannot use command."
+msgstr "Pole TEXTAREA, käsku ei saa kasutada."
+
+#: LYMessages.c:239
+msgid "file: ACTIONs are disallowed!"
+msgstr "file: TEGEVUSed ei ole lubatud!"
+
+#. #define FILE_SERVED_LINKS_DISALLOWED
+#: LYMessages.c:241
+msgid "file: URLs via served links are disallowed!"
+msgstr "file: URLid teeninduslikest viidetest ei ole lubatud! "
+
+#: LYMessages.c:242
+msgid "Access to local files denied."
+msgstr "Juurdepääs lokaalsetele failidele on keelatud."
+
+#: LYMessages.c:243
+msgid "file: URLs via bookmarks are disallowed!"
+msgstr "faile: URLE ei lubata järgedes kasutada!"
+
+#. #define SPECIAL_VIA_EXTERNAL_DISALLOWED
+#: LYMessages.c:245
+msgid "This special URL is not allowed in external documents!"
+msgstr "See spetsiaal URL ei ole välistes dokumentides lubatud!"
+
+#: LYMessages.c:246
+msgid "Press <return> to return to Lynx."
+msgstr "Lynxi tagasi pääsemiseks vajutage <return>."
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:249
+msgid "Spawning DCL subprocess. Use 'logout' to return to Lynx.\n"
+msgstr "Loon DCL alamprotsessi. Tagasi Lynxi saamiseks kasutage 'logout'.\n"
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:253
+msgid "Type EXIT to return to Lynx.\n"
+msgstr "Lynxi tagasi pääsemiseks sisestage exit.\n"
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:256
+msgid "Spawning your default shell. Use 'exit' to return to Lynx.\n"
+msgstr "Käivitan teie vaikimisi shelli. Tagasi Lynxi saamiseks kasutage 'exit'.\n"
+
+#: LYMessages.c:259
+msgid "Spawning is currently disabled."
+msgstr "Alamprotsessi loomine on hetkel blokeeritud."
+
+#: LYMessages.c:260
+msgid "The 'd'ownload command is currently disabled."
+msgstr "Allalaa'd'imise käsklus on praegu blokeeritud."
+
+#: LYMessages.c:261
+msgid "You cannot download an input field."
+msgstr "Sisendvälja ei saa alla laadida."
+
+#: LYMessages.c:262
+msgid "Form has a mailto action! Cannot download."
+msgstr "Vormil on mailto tegevus! Ei saa alla laadida."
+
+#: LYMessages.c:263
+msgid "You cannot download a mailto: link."
+msgstr "mailto: viidet ei saa alla laadida."
+
+#: LYMessages.c:264
+msgid "You cannot download cookies."
+msgstr "Präänikuid ei saa alla laadida."
+
+#: LYMessages.c:265
+msgid "You cannot download a printing option."
+msgstr "Trükkimise seadeid ei saa alla laadida."
+
+#: LYMessages.c:266
+msgid "You cannot download an upload option."
+msgstr "Ãœleslaadimise seadeid ei saa alla laadida."
+
+#: LYMessages.c:267
+msgid "You cannot download an permit option."
+msgstr "lubamise seadeid ei saa alla laadida."
+
+#: LYMessages.c:268
+msgid "This special URL cannot be downloaded!"
+msgstr "Seda spetsiaal URLi ei saa alla laadida!"
+
+#: LYMessages.c:269
+msgid "Nothing to download."
+msgstr "Pole midagi alla laadida."
+
+#: LYMessages.c:270
+msgid "Trace ON!"
+msgstr "Trasseerimine sees!"
+
+#: LYMessages.c:271
+msgid "Trace OFF!"
+msgstr "Trasseerimine väljas!"
+
+#. #define CLICKABLE_IMAGES_ON
+#: LYMessages.c:273
+msgid "Links will be included for all images! Reloading..."
+msgstr "Viiteid kasutatakse kõikide piltidega! Laen uuesti..."
+
+#. #define CLICKABLE_IMAGES_OFF
+#: LYMessages.c:275
+msgid "Standard image handling restored! Reloading..."
+msgstr "Standartne piltide käsitlemine taastatud! Laen uuesti..."
+
+#. #define PSEUDO_INLINE_ALTS_ON
+#: LYMessages.c:277
+msgid "Pseudo_ALTs will be inserted for inlines without ALT strings! Reloading..."
+msgstr "Lisan ALT sõnedeta piltidele pseudo_ALTid! Laen uuesti..."
+
+#. #define PSEUDO_INLINE_ALTS_OFF
+#: LYMessages.c:279
+msgid "Inlines without an ALT string specified will be ignored! Reloading..."
+msgstr "Ignoreerin ALT sõnedeta pilte! Laen uuesti..."
+
+#: LYMessages.c:280
+msgid "Raw 8-bit or CJK mode toggled OFF! Reloading..."
+msgstr "Puhas 8-bit või CJK mood on välja lülitatud! Laen uuesti..."
+
+#: LYMessages.c:281
+msgid "Raw 8-bit or CJK mode toggled ON! Reloading..."
+msgstr "Puhas 8-bit või CJK mood on sisse lülitatud! Laen uuesti..."
+
+#. #define HEAD_D_L_OR_CANCEL
+#: LYMessages.c:283
+msgid "Send HEAD request for D)ocument or L)ink, or C)ancel? (d,l,c): "
+msgstr "Saada HEAD päring D)okumendile või L=viitele või C=katkesta? (d,l,c): "
+
+#. #define HEAD_D_OR_CANCEL
+#: LYMessages.c:285
+msgid "Send HEAD request for D)ocument, or C)ancel? (d,c): "
+msgstr "Saada HEAD päring D)okumendile või C=katkesta? (d,c): "
+
+#: LYMessages.c:286
+msgid "Sorry, the document is not an http URL."
+msgstr "Vabandust, dokument ei ole http URL."
+
+#: LYMessages.c:287
+msgid "Sorry, the link is not an http URL."
+msgstr "Vabandust, viide ei ole http URL."
+
+#: LYMessages.c:288
+msgid "Sorry, the ACTION for this form is disabled."
+msgstr "Vabandust, sellel vormil on tegevus keelatud."
+
+#. #define FORM_ACTION_NOT_HTTP_URL
+#: LYMessages.c:290
+msgid "Sorry, the ACTION for this form is not an http URL."
+msgstr "Vabandust, selle vormi tegevus ei ole http URL."
+
+#: LYMessages.c:291
+msgid "Not an http URL or form ACTION!"
+msgstr "Ei ole http URL ega vormi tegevus!"
+
+#: LYMessages.c:292
+msgid "This special URL cannot be a form ACTION!"
+msgstr "Vormi tegevus ei saa olla see spetsiaal URL!"
+
+#: LYMessages.c:293
+msgid "URL is not in starting realm!"
+msgstr "URL ei ole startfailis!"
+
+#: LYMessages.c:294
+msgid "News posting is disabled!"
+msgstr "Artiklite postitamine on blokeeritud!"
+
+#: LYMessages.c:295
+msgid "File management support is disabled!"
+msgstr "Failide haldamine on blokeeritud!"
+
+#: LYMessages.c:296
+msgid "No jump file is currently available."
+msgstr "Hüpete fail ei ole praegu kasutatav."
+
+#: LYMessages.c:297
+msgid "Jump to (use '?' for list): "
+msgstr "Hüppa aadressil (nimekirjaks '?'): "
+
+#: LYMessages.c:298
+msgid "Jumping to a shortcut URL is disallowed!"
+msgstr "Lühiurlile hüppamine ei ole lubatud!"
+
+#: LYMessages.c:299
+msgid "Random URL is disallowed! Use a shortcut."
+msgstr "Juhuslik URL ei ole lubatud! Kasutage lühiurli."
+
+#: LYMessages.c:300
+msgid "No random URLs have been used thus far."
+msgstr "Seni ei ole juhuslikke urle kasutatud."
+
+#: LYMessages.c:301
+msgid "Bookmark features are currently disabled."
+msgstr "Järgede kasutamine on praegu blokeeritud."
+
+#: LYMessages.c:302
+msgid "Execution via bookmarks is disabled."
+msgstr "Järgede kaudu täitmine on blokeeritud."
+
+#. #define BOOKMARK_FILE_NOT_DEFINED
+#: LYMessages.c:304
+#, c-format
+msgid "Bookmark file is not defined. Use %s to see options."
+msgstr "Järgede faili ei ole defineeritud. Seadete vaatamiseks kasutage %s."
+
+#. #define NO_TEMP_FOR_HOTLIST
+#: LYMessages.c:306
+msgid "Unable to open tempfile for X Mosaic hotlist conversion."
+msgstr "X Mosaic hotlist teisendamiseks ei õnnestu avada ajutist faili."
+
+#: LYMessages.c:307
+msgid "ERROR - unable to open bookmark file."
+msgstr "VIGA - järgede faili ei saa avada."
+
+#. #define BOOKMARK_OPEN_FAILED_FOR_DEL
+#: LYMessages.c:309
+msgid "Unable to open bookmark file for deletion of link."
+msgstr "Järgede faili ei õnnestu viite kustutamiseks avada."
+
+#. #define BOOKSCRA_OPEN_FAILED_FOR_DEL
+#: LYMessages.c:311
+msgid "Unable to open scratch file for deletion of link."
+msgstr "Viite kustutamiseks ei õnnestu avada ajutist faili."
+
+#: LYMessages.c:313
+msgid "Error renaming scratch file."
+msgstr "Viga ajutise faili ümber nimetamisel."
+
+#: LYMessages.c:315
+msgid "Error renaming temporary file."
+msgstr "Viga ajutise faili ümbernimetamisel."
+
+#. #define BOOKTEMP_COPY_FAIL
+#: LYMessages.c:317
+msgid "Unable to copy temporary file for deletion of link."
+msgstr "Viite kustutamiseks ei õnnestu ajutist faili kopeerida."
+
+#. #define BOOKTEMP_REOPEN_FAIL_FOR_DEL
+#: LYMessages.c:319
+msgid "Unable to reopen temporary file for deletion of link."
+msgstr "Viite kustutamiseks ei õnnestu ajutist faili uuesti avada."
+
+#. #define BOOKMARK_LINK_NOT_ONE_LINE
+#: LYMessages.c:322
+msgid "Link is not by itself all on one line in bookmark file."
+msgstr "Viide järgede failis ei ole ühel real."
+
+#: LYMessages.c:323
+msgid "Bookmark deletion failed."
+msgstr "Järje kustutamine ebaõnnestus."
+
+#. #define BOOKMARKS_NOT_TRAVERSED
+#: LYMessages.c:325
+msgid "Bookmark files cannot be traversed (only http URLs)."
+msgstr "Järgede faile ei saa läbida (ainult http URLe)."
+
+#. #define BOOKMARKS_NOT_OPEN
+#: LYMessages.c:327
+msgid "Unable to open bookmark file, use 'a' to save a link first"
+msgstr "Järgede faili ei saa avada, salvestage viide kõigepealt käsuga 'a'"
+
+#: LYMessages.c:328
+msgid "There are no links in this bookmark file!"
+msgstr "Selles järgede failis pole viiteid!"
+
+#. #define CACHE_D_OR_CANCEL
+#: LYMessages.c:330
+msgid "D)elete cached document or C)ancel? (d,c): "
+msgstr "D=kustuta puhverdatud dokument või C=katkesta? (d,c): "
+
+#. #define BOOK_D_L_OR_CANCEL
+#: LYMessages.c:332
+msgid "Save D)ocument or L)ink to bookmark file or C)ancel? (d,l,c): "
+msgstr "Salvesta D)okument, L=viide järgede faili või C=katkesta? (d,l,c): "
+
+#: LYMessages.c:333
+msgid "Save D)ocument to bookmark file or C)ancel? (d,c): "
+msgstr "Salvesta D)okument järgede faili või C=katkesta? (d,c): "
+
+#: LYMessages.c:334
+msgid "Save L)ink to bookmark file or C)ancel? (l,c): "
+msgstr "Salvesta L=viide järgede faili või C=katkesta? (l,c): "
+
+#. #define NOBOOK_POST_FORM
+#: LYMessages.c:336
+msgid "Documents from forms with POST content cannot be saved as bookmarks."
+msgstr "Dokumente vormidelt POST sisuga ei saa järgedena salvestada."
+
+#: LYMessages.c:337
+msgid "Cannot save form fields/links"
+msgstr "Vormide välju/viiteid ei saa salvestada"
+
+#. #define NOBOOK_HSML
+#: LYMessages.c:339
+msgid "History, showinfo, menu and list files cannot be saved as bookmarks."
+msgstr "Ajaloo, info, menüü ja loendi faile ei saa järgedena salvestada."
+
+#. #define CONFIRM_BOOKMARK_DELETE
+#: LYMessages.c:341
+msgid "Do you really want to delete this link from your bookmark file?"
+msgstr "Kas te tõesti soovite kustutada seda viidet oma järgede failist?"
+
+#: LYMessages.c:342
+msgid "Malformed address."
+msgstr "Vigane aadress."
+
+#. #define HISTORICAL_ON_MINIMAL_OFF
+#: LYMessages.c:344
+msgid "Historical comment parsing ON (Minimal is overridden)!"
+msgstr "Ajalooline kommentaaride parsimine sees (minimaalne on kõrvale lükatud)!"
+
+#. #define HISTORICAL_OFF_MINIMAL_ON
+#: LYMessages.c:346
+msgid "Historical comment parsing OFF (Minimal is in effect)!"
+msgstr "Ajalooline kommentaaride parsimine väljas (kasutatakse minimaalset)!"
+
+#. #define HISTORICAL_ON_VALID_OFF
+#: LYMessages.c:348
+msgid "Historical comment parsing ON (Valid is overridden)!"
+msgstr "Ajalooline kommentaaride parsimine sees (kehtiv on kõrvale lükatud)!"
+
+#. #define HISTORICAL_OFF_VALID_ON
+#: LYMessages.c:350
+msgid "Historical comment parsing OFF (Valid is in effect)!"
+msgstr "Ajalooline kommentaaride parsimine väljas (kasutatakse kehtivat)!"
+
+#. #define MINIMAL_ON_IN_EFFECT
+#: LYMessages.c:352
+msgid "Minimal comment parsing ON (and in effect)!"
+msgstr "Minimaalne kommentaaride parsimine sees (kasutatakse kehtivat)!"
+
+#. #define MINIMAL_OFF_VALID_ON
+#: LYMessages.c:354
+msgid "Minimal comment parsing OFF (Valid is in effect)!"
+msgstr "Minimaalne kommentaaride parsimine väljas (kasutatakse kehtivat)!"
+
+#. #define MINIMAL_ON_BUT_HISTORICAL
+#: LYMessages.c:356
+msgid "Minimal comment parsing ON (but Historical is in effect)!"
+msgstr "Minimaalne kommentaaride parsimine sees (kasutatakse ajaloolist)!"
+
+#. #define MINIMAL_OFF_HISTORICAL_ON
+#: LYMessages.c:358
+msgid "Minimal comment parsing OFF (Historical is in effect)!"
+msgstr "Minimaalne kommentaaride parsimine väljas (kasutatakse ajaloolist)!"
+
+#: LYMessages.c:359
+msgid "Soft double-quote parsing ON!"
+msgstr "Pehme jutumärkide parsmine sees (ON)!"
+
+#: LYMessages.c:360
+msgid "Soft double-quote parsing OFF!"
+msgstr "Pehme jutumärkide parsmine väljas (OFF)!"
+
+#: LYMessages.c:361
+msgid "Now using TagSoup parsing of HTML."
+msgstr "Kasutan nüüd HTML TagSoup parsimist."
+
+#: LYMessages.c:362
+msgid "Now using SortaSGML parsing of HTML!"
+msgstr "Kasutan nüüd HTML SortaSGML parsimist!"
+
+#: LYMessages.c:363
+msgid "You are already at the end of this document."
+msgstr "Te olete juba selle dokumendi lõpus."
+
+#: LYMessages.c:364
+msgid "You are already at the beginning of this document."
+msgstr "Te olete juba selle dokumendi alguses."
+
+#: LYMessages.c:365
+#, c-format
+msgid "You are already at page %d of this document."
+msgstr "Te olete juba selle dokumendi leheküljel %d."
+
+#: LYMessages.c:366
+#, c-format
+msgid "Link number %d already is current."
+msgstr "Viide number %d on juba jooksev viide."
+
+#: LYMessages.c:367
+msgid "You are already at the first document"
+msgstr "Te vaatate juba esimest dokumenti"
+
+#: LYMessages.c:368
+msgid "There are no links above this line of the document."
+msgstr "Ãœlalpool seda rida ei ole dokumendis enam viiteid."
+
+#: LYMessages.c:369
+msgid "There are no links below this line of the document."
+msgstr "Allpool seda rida ei ole dokumendis enam viiteid."
+
+#. #define MAXLEN_REACHED_DEL_OR_MOV
+#: LYMessages.c:371
+msgid "Maximum length reached! Delete text or move off field."
+msgstr "Maksimaalne pikkus on saavutatud! Kustutage teksti või lahkuge väljalt."
+
+#. #define NOT_ON_SUBMIT_OR_LINK
+#: LYMessages.c:373
+msgid "You are not on a form submission button or normal link."
+msgstr "Te pole vormi postitamise nupul ega viitel."
+
+#. #define NEED_CHECKED_RADIO_BUTTON
+#: LYMessages.c:375
+msgid "One radio button must be checked at all times!"
+msgstr "Ãœks raadionupp peab olema valitud!"
+
+#: LYMessages.c:376
+msgid "No submit button for this form, submit single text field?"
+msgstr "Sellel vormil puudub postitamise nupp, postitan ühe tekstivälja?"
+
+#: LYMessages.c:377
+msgid "Do you want to go back to the previous document?"
+msgstr "Kas te soovite minna tagasi eelmisele dokumendile?"
+
+#: LYMessages.c:378
+msgid "Use arrows or tab to move off of field."
+msgstr "Väljalt lahkumiseks kasutage nooli või tabulaatorit."
+
+#. #define ENTER_TEXT_ARROWS_OR_TAB
+#: LYMessages.c:380
+msgid "Enter text. Use arrows or tab to move off of field."
+msgstr "Sisestage tekst. Väljalt lahkumiseks kasutage nooli või tabulaatorit."
+
+#: LYMessages.c:381
+msgid "** Bad HTML!! No form action defined. **"
+msgstr "** Vigane HTML!! Vormil pole tegevust defineeritud. **"
+
+#: LYMessages.c:382
+msgid "Bad HTML!! Unable to create popup window!"
+msgstr "Vigane HTML!! Ei saa luua hüpikakent!"
+
+#: LYMessages.c:383
+msgid "Unable to create popup window!"
+msgstr "Ei saa luua hüpikakent!"
+
+#: LYMessages.c:384
+msgid "Goto a random URL is disallowed!"
+msgstr "Juhuslikule URLile minek on blokeeritud!"
+
+#: LYMessages.c:385
+msgid "Goto a non-http URL is disallowed!"
+msgstr "Mitte-http URLile minek on blokeeritud!"
+
+#: LYMessages.c:386
+#, c-format
+msgid "You are not allowed to goto \"%s\" URLs"
+msgstr "Teil ei ole lubatud minna \"%s\" URLile"
+
+#: LYMessages.c:387
+msgid "URL to open: "
+msgstr "URL, mida avada: "
+
+#: LYMessages.c:388
+msgid "Edit the current Goto URL: "
+msgstr "Toimeta jooksvat Goto URLi: "
+
+#: LYMessages.c:389
+msgid "Edit the previous Goto URL: "
+msgstr "Toimeta eelmist Goto URLi: "
+
+#: LYMessages.c:390
+msgid "Edit a previous Goto URL: "
+msgstr "Toimeta eelmist Goto URLi: "
+
+#: LYMessages.c:391
+msgid "Current document has POST data."
+msgstr "Jooksev dokument sisaldab POST andmeid."
+
+#: LYMessages.c:392
+msgid "Edit this document's URL: "
+msgstr "Toimeta selle dokumendi URLi: "
+
+#: LYMessages.c:393
+msgid "Edit the current link's URL: "
+msgstr "Toimeta selle viite URLi: "
+
+#: LYMessages.c:394
+msgid "Edit the form's submit-URL: "
+msgstr "Toimeta selle vormi postitamise URLi: "
+
+#: LYMessages.c:395
+msgid "You cannot edit File Management URLs"
+msgstr "Failide haldamise URLe ei saa toimetada"
+
+#: LYMessages.c:396
+msgid "Enter a database query: "
+msgstr "Sisestage andmebaasi päring: "
+
+#: LYMessages.c:397
+msgid "Enter a whereis query: "
+msgstr "Sisestage kus-on päring: "
+
+#: LYMessages.c:398
+msgid "Edit the current query: "
+msgstr "Toimetage jooksvat päringut: "
+
+#: LYMessages.c:399
+msgid "Edit the previous query: "
+msgstr "Toimetage eelmist päringut: "
+
+#: LYMessages.c:400
+msgid "Edit a previous query: "
+msgstr "Toimetage eelmist päringut: "
+
+#. #define USE_C_R_TO_RESUB_CUR_QUERY
+#: LYMessages.c:402
+msgid "Use Control-R to resubmit the current query."
+msgstr "Päringu uuesti postitamiseks kasutage Control-R."
+
+#: LYMessages.c:403
+msgid "Edit the current shortcut: "
+msgstr "Toimeta jooksvat lühiurli: "
+
+#: LYMessages.c:404
+msgid "Edit the previous shortcut: "
+msgstr "Toimeta eelmist lühiurli: "
+
+#: LYMessages.c:405
+msgid "Edit a previous shortcut: "
+msgstr "Toimeta eelmist lühiurli: "
+
+#: LYMessages.c:406
+#, c-format
+msgid "Key '%c' is not mapped to a jump file!"
+msgstr "Klahv '%c' ei ole seotud hüpete failiga!"
+
+#: LYMessages.c:407
+msgid "Cannot locate jump file!"
+msgstr "Ei leia hüpete faili!"
+
+#: LYMessages.c:408
+msgid "Cannot open jump file!"
+msgstr "Hüpete faili ei saa avada!"
+
+#: LYMessages.c:409
+msgid "Error reading jump file!"
+msgstr "Viga hüpete failist lugemisel!"
+
+#: LYMessages.c:410
+msgid "Out of memory reading jump file!"
+msgstr "Hüpete failist lugemisel sai mälu otsa!"
+
+#: LYMessages.c:411
+msgid "Out of memory reading jump table!"
+msgstr "Hüpete tabeli lugemisel sai mälu otsa!"
+
+#: LYMessages.c:412
+msgid "No index is currently available."
+msgstr "Indeksid ei ole praegu kasutatavad."
+
+#. #define CONFIRM_MAIN_SCREEN
+#: LYMessages.c:414
+msgid "Do you really want to go to the Main screen?"
+msgstr "Kas te soovite tõesti minne põhiekraanile?"
+
+#: LYMessages.c:415
+msgid "You are already at main screen!"
+msgstr "Te olete juba põhiekraanil!"
+
+#. #define NOT_ISINDEX
+#: LYMessages.c:417
+msgid "Not a searchable indexed document -- press '/' to search for a text string"
+msgstr "Pole otsimiseks indekseeritud dokument -- teksti otsimiseks vajutage '/'"
+
+#. #define NO_OWNER
+#: LYMessages.c:419
+msgid "No owner is defined for this file so you cannot send a comment"
+msgstr "Sellel failil ei ole omanikku defineeritud, seega ei saa kommentaari saata"
+
+#: LYMessages.c:420
+#, c-format
+msgid "No owner is defined. Use %s?"
+msgstr "Omanikku ei ole defineeritud. Kasutan %s?"
+
+#: LYMessages.c:421
+msgid "Do you wish to send a comment?"
+msgstr "Kas te soovite saata kommentaari?"
+
+#: LYMessages.c:422
+msgid "Mail is disallowed so you cannot send a comment"
+msgstr "E-post pole lubatud, seega ei saa kommentaare saata"
+
+#: LYMessages.c:423
+msgid "The 'e'dit command is currently disabled."
+msgstr "Toim'e'ta käsklus on praegu blokeeritud."
+
+#: LYMessages.c:424
+msgid "External editing is currently disabled."
+msgstr "Väline toimeti on praegu blokeeritud."
+
+#: LYMessages.c:425
+msgid "System error - failure to get status."
+msgstr "Süsteemi viga - olekut ei õnnestu lugeda."
+
+#: LYMessages.c:426
+msgid "No editor is defined!"
+msgstr "Tekstitoimetit ei ole määratud!"
+
+#: LYMessages.c:427
+msgid "The 'p'rint command is currently disabled."
+msgstr "Trükkimise käsklus 'p' on praegu blokeeritud."
+
+#: LYMessages.c:428
+msgid "Document has no Toolbar links or Banner."
+msgstr "Dokumendis puuduvad Toolbar viited või Banner."
+
+#: LYMessages.c:429
+msgid "Unable to open traversal file."
+msgstr "Ei saa avada läbimise faili."
+
+#: LYMessages.c:430
+msgid "Unable to open traversal found file."
+msgstr "Ei saa avada läbimise leidude faili."
+
+#: LYMessages.c:431
+msgid "Unable to open reject file."
+msgstr "Ei saa avada keeldumiste faili."
+
+#: LYMessages.c:432
+msgid "Unable to open traversal errors output file"
+msgstr "Ei õnnestu avada läbimise vigade väljundfaili"
+
+#: LYMessages.c:433
+msgid "TRAVERSAL WAS INTERRUPTED"
+msgstr "LÄBIMINE KATKESTATI"
+
+#: LYMessages.c:434
+msgid "Follow link (or goto link or page) number: "
+msgstr "Järgne viitele (või mine viitele või lehele) number: "
+
+#: LYMessages.c:435
+msgid "Select option (or page) number: "
+msgstr "Valige seade (või lehe) number: "
+
+#: LYMessages.c:436
+#, c-format
+msgid "Option number %d already is current."
+msgstr "Seade numbriga %d on juba jooksev."
+
+#. #define ALREADY_AT_OPTION_END
+#: LYMessages.c:438
+msgid "You are already at the end of this option list."
+msgstr "Te olete juba nende seadete loendi lõpus."
+
+#. #define ALREADY_AT_OPTION_BEGIN
+#: LYMessages.c:440
+msgid "You are already at the beginning of this option list."
+msgstr "Te olete juba nende seadete loendi alguses."
+
+#. #define ALREADY_AT_OPTION_PAGE
+#: LYMessages.c:442
+#, c-format
+msgid "You are already at page %d of this option list."
+msgstr "Te olete juba nende seadete loendi lehel %d."
+
+#: LYMessages.c:443
+msgid "You have entered an invalid option number."
+msgstr "Te sisestasite vigase seade numbri."
+
+#: LYMessages.c:444
+msgid "** Bad HTML!! Use -trace to diagnose. **"
+msgstr "** Vigane HTML!! Diagnoosimiseks kasutage võtit -trace. **"
+
+#: LYMessages.c:445
+msgid "Give name of file to save in"
+msgstr "Andke faili nimi, kuhu salvestada"
+
+#: LYMessages.c:446
+msgid "Can't save data to file -- please run WWW locally"
+msgstr "Andmete salvestamine faili ebaõnnestus -- palun käivitage WWW lokaalselt"
+
+#: LYMessages.c:447
+msgid "Can't open temporary file!"
+msgstr "Ajutist faili ei saa avada!"
+
+#: LYMessages.c:448
+msgid "Can't open output file! Cancelling!"
+msgstr "Väljundfaili ei saa avada! katkestan!"
+
+#: LYMessages.c:449
+msgid "Execution is disabled."
+msgstr "Käivitamine ei ole lubatud."
+
+#. #define EXECUTION_DISABLED_FOR_FILE
+#: LYMessages.c:451
+#, c-format
+msgid "Execution is not enabled for this file. See the Options menu (use %s)."
+msgstr "Selle faili täitmine ei ole lubatud. Vaadake omaduste menüüd (kasutage %s)."
+
+#. #define EXECUTION_NOT_COMPILED
+#: LYMessages.c:453
+msgid "Execution capabilities are not compiled into this version."
+msgstr "Täitmise omadus ei ole selle sellesse versiooni kompileeritud."
+
+#: LYMessages.c:454
+msgid "This file cannot be displayed on this terminal."
+msgstr "Seda faili ei saa sellel terminalil näidata."
+
+#. #define CANNOT_DISPLAY_FILE_D_OR_C
+#: LYMessages.c:456
+msgid "This file cannot be displayed on this terminal: D)ownload, or C)ancel"
+msgstr "Seda faili ei saa sellel terminalil näidata: D=allalaadimine, C=katkesta"
+
+#: LYMessages.c:457
+#, c-format
+msgid "%s D)ownload, or C)ancel"
+msgstr "%s D=allalaadimine, C=katkesta"
+
+#: LYMessages.c:458
+msgid "Cancelling file."
+msgstr "Katkestan faili."
+
+#: LYMessages.c:459
+msgid "Retrieving file. - PLEASE WAIT -"
+msgstr "Laen faili. - PALUN OODAKE -"
+
+#: LYMessages.c:460
+msgid "Enter a filename: "
+msgstr "Sisestage failinimi: "
+
+#: LYMessages.c:461
+msgid "Edit the previous filename: "
+msgstr "Toimetage eelmist failinime: "
+
+#: LYMessages.c:462
+msgid "Edit a previous filename: "
+msgstr "Toimetage eelmist failinime: "
+
+#: LYMessages.c:463
+msgid "Enter a new filename: "
+msgstr "Sisestage uus failinimi: "
+
+#: LYMessages.c:464
+msgid "File name may not begin with a dot."
+msgstr "Faili nimi ei või alata punktiga."
+
+#: LYMessages.c:466
+msgid "File exists. Create higher version?"
+msgstr "Fail on olemas. Loon uuema versioni?"
+
+#: LYMessages.c:468
+msgid "File exists. Overwrite?"
+msgstr "Fail on olemas. Kirjutan üle?"
+
+#: LYMessages.c:470
+msgid "Cannot write to file."
+msgstr "Faili ei õnnestu kirjutada."
+
+#: LYMessages.c:471
+msgid "ERROR! - download command is misconfigured."
+msgstr "VIGA! - allalaadimise käsk on vigaste seadetega."
+
+#: LYMessages.c:472
+msgid "Unable to download file."
+msgstr "Faili ei saa alla laadida."
+
+#: LYMessages.c:473
+msgid "Reading directory..."
+msgstr "Loen kataloogi..."
+
+#: LYMessages.c:474
+msgid "Building directory listing..."
+msgstr "Ehitan kataloogi nimiekirja..."
+
+#: LYMessages.c:475
+msgid "Saving..."
+msgstr "Salvestan..."
+
+#: LYMessages.c:476
+#, c-format
+msgid "Could not edit file '%s'."
+msgstr "Faili '%s' ei saa toimetada."
+
+#: LYMessages.c:477
+msgid "Unable to access document!"
+msgstr "Dokumendi ei saa kasutada!"
+
+#: LYMessages.c:478
+msgid "Could not access file."
+msgstr "Faili kasutamiseks pole õiguseid."
+
+#: LYMessages.c:479
+msgid "Could not access directory."
+msgstr "Kataloogi kasutamiseks pole õiguseid."
+
+#: LYMessages.c:480
+msgid "Could not load data."
+msgstr "Andmeid ei õnnestu laadida."
+
+#. #define CANNOT_EDIT_REMOTE_FILES
+#: LYMessages.c:482
+msgid "Lynx cannot currently (e)dit remote WWW files."
+msgstr "Lynx ei saa praegu toim'e'tada faile WWW serveritel."
+
+#. #define CANNOT_EDIT_FIELD
+#: LYMessages.c:484
+msgid "This field cannot be (e)dited with an external editor."
+msgstr "Seda välja ei saa välise toimetiga toim'e'tada."
+
+#: LYMessages.c:485
+msgid "Bad rule"
+msgstr "Vigane reegel"
+
+#: LYMessages.c:486
+msgid "Insufficient operands:"
+msgstr "Puuduvad operandid: "
+
+#: LYMessages.c:487
+msgid "You are not authorized to edit this file."
+msgstr "Teil ei ole lubatud seda faili muuta."
+
+#: LYMessages.c:488
+msgid "Title: "
+msgstr "Tiitel: "
+
+#: LYMessages.c:489
+msgid "Subject: "
+msgstr "Teema: "
+
+#: LYMessages.c:490
+msgid "Username: "
+msgstr "Kasutaja: "
+
+#: LYMessages.c:491
+msgid "Password: "
+msgstr "Parool: "
+
+#: LYMessages.c:492
+msgid "lynx: Username and Password required!!!"
+msgstr "lynx: Nõutakse kasutajanime ja parooli!!!"
+
+#: LYMessages.c:493
+msgid "lynx: Password required!!!"
+msgstr "lynx: nõutakse parooli!!!"
+
+#: LYMessages.c:494
+msgid "Clear all authorization info for this session?"
+msgstr "Tühjendan selle sessiooni kogu autoriseerimise info?"
+
+#: LYMessages.c:495
+msgid "Authorization info cleared."
+msgstr "Autoriseerimisinfo eemaldatud."
+
+#: LYMessages.c:496
+msgid "Authorization failed. Retry?"
+msgstr "Autoriseerimine ebaõnnestus. Kordan?"
+
+#: LYMessages.c:497
+msgid "cgi support has been disabled."
+msgstr "cgi tugi on blokeeritud."
+
+#. #define CGI_NOT_COMPILED
+#: LYMessages.c:499
+msgid "Lynxcgi capabilities are not compiled into this version."
+msgstr "Lynxcgi võimalused ei ole sellesse versiooni kompileeritud."
+
+#: LYMessages.c:500
+#, c-format
+msgid "Sorry, no known way of converting %s to %s."
+msgstr "Kahjuks ei tunne ühtegi meetodit teisendamaks %s -> %s."
+
+#: LYMessages.c:501
+msgid "Unable to set up connection."
+msgstr "Ühendust ei õnnestu luua."
+
+#: LYMessages.c:502
+msgid "Unable to make connection"
+msgstr "Ühendust ei õnnestu tekitada"
+
+#. #define MALFORMED_EXEC_REQUEST
+#: LYMessages.c:504
+msgid "Executable link rejected due to malformed request."
+msgstr "Vigase päringu tõttu keeldutakse viidet täitmast."
+
+#. #define BADCHAR_IN_EXEC_LINK
+#: LYMessages.c:506
+#, c-format
+msgid "Executable link rejected due to `%c' character."
+msgstr "Sümboli `%c' tõttu keeldutakse viidet täitmast."
+
+#. #define RELPATH_IN_EXEC_LINK
+#: LYMessages.c:508
+msgid "Executable link rejected due to relative path string ('../')."
+msgstr "Suhtelise tee ('../') tõttu keeldutakse viidet täitmast."
+
+#. #define BADLOCPATH_IN_EXEC_LINK
+#: LYMessages.c:510
+msgid "Executable link rejected due to location or path."
+msgstr "Asukoha või tee tõttu keeldutakse viidet täitmast."
+
+#: LYMessages.c:511
+msgid "Mail access is disabled!"
+msgstr "E-posti kasutamine on blokeeritud!"
+
+#. #define ACCESS_ONLY_LOCALHOST
+#: LYMessages.c:513
+msgid "Only files and servers on the local host can be accessed."
+msgstr "Kasutada saab ainult lokaalse serveri faile või teenuseid."
+
+#: LYMessages.c:514
+msgid "Telnet access is disabled!"
+msgstr "Telneti kasutamine on blokeeritud!"
+
+#. #define TELNET_PORT_SPECS_DISABLED
+#: LYMessages.c:516
+msgid "Telnet port specifications are disabled."
+msgstr "Telneti pordi määramine on blokeeritud."
+
+#: LYMessages.c:517
+msgid "USENET news access is disabled!"
+msgstr "USENET uudisegruppide kasutamine on blokeeritud!"
+
+#: LYMessages.c:518
+msgid "Rlogin access is disabled!"
+msgstr "Rlogin kasutamine on blokeeritud!"
+
+#: LYMessages.c:519
+msgid "Ftp access is disabled!"
+msgstr "Ftp kasutamine on blokeeritud!"
+
+#: LYMessages.c:520
+msgid "There are no references from this document."
+msgstr "Sellest dokumendist ei ole viiteid."
+
+#: LYMessages.c:521
+msgid "There are only hidden links from this document."
+msgstr "Selles dokumendis on ainult peidetud viited."
+
+#: LYMessages.c:523
+msgid "Unable to open command file."
+msgstr "Käskude faili ei saa avada."
+
+#: LYMessages.c:525
+msgid "News Post Cancelled!!!"
+msgstr "Artikli postitamine katkestatud!!!"
+
+#. #define SPAWNING_EDITOR_FOR_NEWS
+#: LYMessages.c:527
+msgid "Spawning your selected editor to edit news message"
+msgstr "Käivitan uudise artikli toimetamiseks teie poolt valitud toimeti"
+
+#: LYMessages.c:528
+msgid "Post this message?"
+msgstr "Postitan selle teate?"
+
+#: LYMessages.c:529
+#, c-format
+msgid "Append '%s'?"
+msgstr "Lisan '%s'?"
+
+#: LYMessages.c:530
+msgid "Posting to newsgroup(s)..."
+msgstr "Postitan gruppi(desse)..."
+
+#: LYMessages.c:532
+msgid "*** You have unread mail. ***"
+msgstr "*** Teil on lugemata teateid. ***"
+
+#: LYMessages.c:534
+msgid "*** You have mail. ***"
+msgstr "*** Teil on kiri. ***"
+
+#: LYMessages.c:536
+msgid "*** You have new mail. ***"
+msgstr "*** Teil on uus kiri. ***"
+
+#: LYMessages.c:537
+msgid "File insert cancelled!!!"
+msgstr "Faili lisamine katkestati!!!"
+
+#: LYMessages.c:538
+msgid "Not enough memory for file!"
+msgstr "Faili jaoks napib mälu!"
+
+#: LYMessages.c:539
+msgid "Can't open file for reading."
+msgstr "Faili ei õnnestu lugemiseks avada."
+
+#: LYMessages.c:540
+msgid "File does not exist."
+msgstr "Faili ei ole."
+
+#: LYMessages.c:541
+msgid "File does not exist - reenter or cancel:"
+msgstr "Faili pole - sisestage uuesti või katkestage:"
+
+#: LYMessages.c:542
+msgid "File is not readable."
+msgstr "Fail ei ole loetav."
+
+#: LYMessages.c:543
+msgid "File is not readable - reenter or cancel:"
+msgstr "Fail pole loetav - sisestage uuesti või katkestage:"
+
+#: LYMessages.c:544
+msgid "Nothing to insert - file is 0-length."
+msgstr "Midagi pole lisada - fail on pikkusega null."
+
+#: LYMessages.c:545
+msgid "Save request cancelled!!!"
+msgstr "Salvestamine katkestati!!!"
+
+#: LYMessages.c:546
+msgid "Mail request cancelled!!!"
+msgstr "Postitamine katkestati!!!"
+
+#. #define CONFIRM_MAIL_SOURCE_PREPARSED
+#: LYMessages.c:548
+msgid "Viewing preparsed source. Are you sure you want to mail it?"
+msgstr "Vaatan eeltöödeldud lähteteksti. Olete kindel, et soovite seda postitada?"
+
+#: LYMessages.c:549
+msgid "Please wait..."
+msgstr "Palun oodake..."
+
+#: LYMessages.c:550
+msgid "Mailing file. Please wait..."
+msgstr "Saadan faili. Palun oodake..."
+
+#: LYMessages.c:551
+msgid "ERROR - Unable to mail file"
+msgstr "VIGA - Faili saatmine ebaõnnestus"
+
+#. #define CONFIRM_LONG_SCREEN_PRINT
+#: LYMessages.c:553
+#, c-format
+msgid "File is %d screens long. Are you sure you want to print?"
+msgstr "Faili pikkus on %d ekraanitäit. Olete kindel, et soovite seda trükkida?"
+
+#: LYMessages.c:554
+msgid "Print request cancelled!!!"
+msgstr "Trükkimise päring katkestati!!!"
+
+#: LYMessages.c:555
+msgid "Press <return> to begin: "
+msgstr "Vajutage alustamiseks <return>: "
+
+#: LYMessages.c:556
+msgid "Press <return> to finish: "
+msgstr "Vajutage lõpetamiseks <return>: "
+
+#. #define CONFIRM_LONG_PAGE_PRINT
+#: LYMessages.c:558
+#, c-format
+msgid "File is %d pages long. Are you sure you want to print?"
+msgstr "Faili pikkus on %d lehekülge. Olete kinde, et soovite seda trükkida?"
+
+#. #define CHECK_PRINTER
+#: LYMessages.c:560
+msgid "Be sure your printer is on-line. Press <return> to start printing:"
+msgstr "Kontrollige printerit. Trükkimise alustamiseks vajutage <return>:"
+
+#: LYMessages.c:561
+msgid "ERROR - Unable to allocate file space!!!"
+msgstr "VIGA - Ei õnnestu reserveerida faili ruumi!!!"
+
+#: LYMessages.c:562
+msgid "Unable to open tempfile"
+msgstr "Ajutist faili ei õnnestu avada"
+
+#: LYMessages.c:563
+msgid "Unable to open print options file"
+msgstr "Ei õnnestu avada trükiseadete faili"
+
+#: LYMessages.c:564
+msgid "Printing file. Please wait..."
+msgstr "Trükin faili. Palun oodake..."
+
+#: LYMessages.c:565
+msgid "Please enter a valid internet mail address: "
+msgstr "palun sisestage kehtiv interneti postiaadress: "
+
+#: LYMessages.c:566
+msgid "ERROR! - printer is misconfigured!"
+msgstr "VIGA! - trükkal on vigaselt seadistatud!"
+
+#: LYMessages.c:567
+msgid "Image map from POST response not available!"
+msgstr "Hüperpilt POST vastusest ei ole kasutatav!"
+
+#: LYMessages.c:568
+msgid "Misdirected client-side image MAP request!"
+msgstr "Vigaselt suunatud kliendi-poolse hüperpildi päring!"
+
+#: LYMessages.c:569
+msgid "Client-side image MAP is not accessible!"
+msgstr "Kliendi-poolne hüperpilt ei ole kasutatav!"
+
+#: LYMessages.c:570
+msgid "No client-side image MAPs are available!"
+msgstr "Kliendi-poolseid hüperpilte pole!"
+
+#: LYMessages.c:571
+msgid "Client-side image MAP is not available!"
+msgstr "Kliendi-poolne hüperpilt ei ole kätte saadav!"
+
+#. #define OPTION_SCREEN_NEEDS_24
+#: LYMessages.c:574
+msgid "Screen height must be at least 24 lines for the Options menu!"
+msgstr "Seadete menüü nõuab vähemalt 24 rida ekraanile!"
+
+#. #define OPTION_SCREEN_NEEDS_23
+#: LYMessages.c:576
+msgid "Screen height must be at least 23 lines for the Options menu!"
+msgstr "Seadete menüü nõuab vähemalt 23 rida ekraanile!"
+
+#. #define OPTION_SCREEN_NEEDS_22
+#: LYMessages.c:578
+msgid "Screen height must be at least 22 lines for the Options menu!"
+msgstr "Seadete menüü nõuab vähemalt 22 rida ekraanile!"
+
+#: LYMessages.c:580
+msgid "That key requires Advanced User mode."
+msgstr "See klahv nõuab \"advanced\" kasutaja moodi."
+
+#: LYMessages.c:581
+#, c-format
+msgid "Content-type: %s"
+msgstr "Sisu tüüp: %s"
+
+#: LYMessages.c:582
+msgid "Command: "
+msgstr "Käsk: "
+
+#: LYMessages.c:583
+msgid "Unknown or ambiguous command"
+msgstr "Tundmatu või segane käsklus"
+
+#: LYMessages.c:584
+msgid " Version "
+msgstr " Versioon "
+
+#: LYMessages.c:585
+msgid " first"
+msgstr " esimene"
+
+#: LYMessages.c:586
+msgid ", guessing..."
+msgstr ", arvan..."
+
+#: LYMessages.c:587
+msgid "Permissions for "
+msgstr "Õigused failile "
+
+#: LYMessages.c:588
+msgid "Select "
+msgstr "Valige "
+
+#: LYMessages.c:589
+msgid "capital letter"
+msgstr "suurtäht"
+
+#: LYMessages.c:590
+msgid " of option line,"
+msgstr " valiku rida,"
+
+#: LYMessages.c:591
+msgid " to save,"
+msgstr " salvestamiseks"
+
+#: LYMessages.c:592
+msgid " to "
+msgstr " et "
+
+#: LYMessages.c:593
+msgid " or "
+msgstr " või "
+
+#: LYMessages.c:594
+msgid " index"
+msgstr " indeks"
+
+#: LYMessages.c:595
+msgid " to return to Lynx."
+msgstr " viib tagasi Lynxi."
+
+#: LYMessages.c:596
+msgid "Accept Changes"
+msgstr "Arvesta muutuseid"
+
+#: LYMessages.c:597
+msgid "Reset Changes"
+msgstr "Algväärtusta"
+
+#: LYMessages.c:598
+msgid "Left Arrow cancels changes"
+msgstr "Nool vasakule tühistab muutused"
+
+#: LYMessages.c:599
+msgid "Save options to disk"
+msgstr "Salvesta seaded kettale"
+
+#: LYMessages.c:600
+msgid "Hit RETURN to accept entered data."
+msgstr "Sisestatud andmete kasutamiseks vajutage RETURN."
+
+#. #define ACCEPT_DATA_OR_DEFAULT
+#: LYMessages.c:602
+msgid "Hit RETURN to accept entered data. Delete data to invoke the default."
+msgstr "Andmete kasutamiseks vajutage RETURN. Kustutades andmed saate vaikeväärtuse."
+
+#: LYMessages.c:603
+msgid "Value accepted!"
+msgstr "Väärtus aktsepteeritud!"
+
+#. #define VALUE_ACCEPTED_WARNING_X
+#: LYMessages.c:605
+msgid "Value accepted! -- WARNING: Lynx is configured for XWINDOWS!"
+msgstr "Väärtus vastu võetud! -- HOIATUS: Lynx on seadistatud XWINDOWSi kasutamiseks!"
+
+#. #define VALUE_ACCEPTED_WARNING_NONX
+#: LYMessages.c:607
+msgid "Value accepted! -- WARNING: Lynx is NOT configured for XWINDOWS!"
+msgstr "Väärtus vastu võetud! -- HOIATUS: Lynx ei ole XWINDOWSi jaoks seadistatud!"
+
+#: LYMessages.c:608
+msgid "You are not allowed to change which editor to use!"
+msgstr "Teil ei ole lubatud toimetit vahetada!"
+
+#: LYMessages.c:609
+msgid "Failed to set DISPLAY variable!"
+msgstr "DISPLAY muutuja seadmine ebaõnnestus!"
+
+#: LYMessages.c:610
+msgid "Failed to clear DISPLAY variable!"
+msgstr "DISPLAY muutuja tühjendamine ebaõnnestus!"
+
+#. #define BOOKMARK_CHANGE_DISALLOWED
+#: LYMessages.c:612
+msgid "You are not allowed to change the bookmark file!"
+msgstr "Teil ei ole lubatud järgede faili muuta!"
+
+#: LYMessages.c:613
+msgid "Terminal does not support color"
+msgstr "Terminal ei toeta värve"
+
+#: LYMessages.c:614
+#, c-format
+msgid "Your '%s' terminal does not support color."
+msgstr "Teie '%s' terminal ei toeta värve."
+
+#: LYMessages.c:615
+msgid "Access to dot files is disabled!"
+msgstr "Punktiga algavaid faile ei ole lubatud kasutada!"
+
+#. #define UA_NO_LYNX_WARNING
+#: LYMessages.c:617
+msgid "User-Agent string does not contain \"Lynx\" or \"L_y_n_x\""
+msgstr "User-Agent sõne ei sisalda \"Lynx\" ega \"L_y_n_x\""
+
+#. #define UA_PLEASE_USE_LYNX
+#: LYMessages.c:619
+msgid "Use \"L_y_n_x\" or \"Lynx\" in User-Agent, or it looks like intentional deception!"
+msgstr "Kasutage User-Agent sees sõnu \"L_y_n_x\" või \"Lynx\", muidu paistab tegu olevat sihiliku pettusena!"
+
+#. #define UA_CHANGE_DISABLED
+#: LYMessages.c:621
+msgid "Changing of the User-Agent string is disabled!"
+msgstr "User-Agent väärtuse muutmine ei ole lubatud!"
+
+#. #define CHANGE_OF_SETTING_DISALLOWED
+#: LYMessages.c:623
+msgid "You are not allowed to change this setting."
+msgstr "Teil ei ole lubatud seda seadet muuta."
+
+#: LYMessages.c:624
+msgid "Saving Options..."
+msgstr "Salvestan seaded..."
+
+#: LYMessages.c:625
+msgid "Options saved!"
+msgstr "Seaded salvestatud!"
+
+#: LYMessages.c:626
+msgid "Unable to save Options!"
+msgstr "Seadeid ei õnnestu salvestada!"
+
+#: LYMessages.c:627
+msgid " 'r' to return to Lynx "
+msgstr " 'r' laseb Lynxi tagasi "
+
+#: LYMessages.c:628
+msgid " '>' to save, or 'r' to return to Lynx "
+msgstr " '>' salvestamiseks, 'r' laseb Lynxi tagasi "
+
+#. #define ANY_KEY_CHANGE_RET_ACCEPT
+#: LYMessages.c:630
+msgid "Hit any key to change value; RETURN to accept."
+msgstr "Väärtuse muutmiseks vajutage mõnd klahvi; RETURN aktsepteerimiseks."
+
+#: LYMessages.c:631
+msgid "Error uncompressing temporary file!"
+msgstr "Viga ajutise faili lahtipakkimisel!"
+
+#: LYMessages.c:632
+msgid "Unsupported URL scheme!"
+msgstr "Mittetoetatud URL skeem!"
+
+#: LYMessages.c:633
+msgid "Unsupported data: URL! Use SHOWINFO, for now."
+msgstr "Mittetoetatud andmed: URL! Kasutage praegu SHOWINFO."
+
+#: LYMessages.c:634
+#, c-format
+msgid "Redirection limit of %d URL's reached."
+msgstr "Saavutati ümbersuunamiste piirang, %d URLi."
+
+#: LYMessages.c:635
+msgid "Illegal redirection URL received from server!"
+msgstr "Server saatis vigase ümbersuunamise URLi!"
+
+#. #define SERVER_ASKED_FOR_REDIRECTION
+#: LYMessages.c:637
+#, c-format
+msgid "Server asked for %d redirection of POST content to"
+msgstr "Server palus %d POST sisu ümbersuunamist aadressil"
+
+#: LYMessages.c:640
+msgid "P)roceed, use G)ET or C)ancel "
+msgstr "P=jätka, kasuta G)ET või C=katkesta "
+
+#: LYMessages.c:641
+msgid "P)roceed, or C)ancel "
+msgstr "P=jätka või C=katkesta "
+
+#. #define ADVANCED_POST_GET_REDIRECT
+#: LYMessages.c:643
+msgid "Redirection of POST content. P)roceed, see U)RL, use G)ET or C)ancel"
+msgstr "POST sisu ümbersuunamine. P=jätka, vaata U)RL, kasuta G)ET või C=katkesta"
+
+#. #define ADVANCED_POST_REDIRECT
+#: LYMessages.c:645
+msgid "Redirection of POST content. P)roceed, see U)RL, or C)ancel"
+msgstr "POST sisu ümbersuunamine. P=jätka, vaata U)RL või C=katkesta"
+
+#. #define CONFIRM_POST_RESUBMISSION
+#: LYMessages.c:647
+msgid "Document from Form with POST content. Resubmit?"
+msgstr "Dokument vormist POST sisuga. Postitan uuesti?"
+
+#. #define CONFIRM_POST_RESUBMISSION_TO
+#: LYMessages.c:649
+#, c-format
+msgid "Resubmit POST content to %s ?"
+msgstr "Postitan uuesti POST sisu aadressil %s ?"
+
+#. #define CONFIRM_POST_LIST_RELOAD
+#: LYMessages.c:651
+#, c-format
+msgid "List from document with POST data. Reload %s ?"
+msgstr "Loend dokumendist POST andmetega. Laen %s uuesti?"
+
+#. #define CONFIRM_POST_DOC_HEAD
+#: LYMessages.c:653
+msgid "Document from POST action, HEAD may not be understood. Proceed?"
+msgstr "Dokument POST tegevusest, HEAD ei pruugi olla arusaadav. Jätkan?"
+
+#. #define CONFIRM_POST_LINK_HEAD
+#: LYMessages.c:655
+msgid "Form submit action is POST, HEAD may not be understood. Proceed?"
+msgstr "Vormi postitamise tegevus on POST, HEAD ei pruugi olla arusaadav. Jätkan?"
+
+#: LYMessages.c:656
+msgid "Proceed without a username and password?"
+msgstr "Jätkan kasutaja ja paroolita?"
+
+#: LYMessages.c:657
+#, c-format
+msgid "Proceed (%s)?"
+msgstr "Jätkan (%s)?"
+
+#: LYMessages.c:658
+msgid "Cannot POST to this host."
+msgstr "POST ei saa sellele serverile saata."
+
+#: LYMessages.c:659
+msgid "POST not supported for this URL - ignoring POST data!"
+msgstr "Selle URLiga POST ei toetata - ignoreerin POST andmeid!"
+
+#: LYMessages.c:660
+msgid "Discarding POST data..."
+msgstr "Loobun POST andmetest..."
+
+#: LYMessages.c:661
+msgid "Document will not be reloaded!"
+msgstr "Dokumenti ei laeta uuesti!"
+
+#: LYMessages.c:662
+msgid "Location: "
+msgstr "Asukoht: "
+
+#: LYMessages.c:663
+#, c-format
+msgid "'%s' not found!"
+msgstr "'%s' ei leidu!"
+
+#: LYMessages.c:664
+msgid "Default Bookmark File"
+msgstr "Vaikimisi järgede fail"
+
+#: LYMessages.c:665
+msgid "Screen too small! (8x35 min)"
+msgstr "Ekraan on liiga väike! (min on 8x35)"
+
+#: LYMessages.c:666
+msgid "Select destination or ^G to Cancel: "
+msgstr "Valige sihtkoht või katkestamiseks ^G: "
+
+#. #define MULTIBOOKMARKS_SELECT
+#: LYMessages.c:668
+msgid "Select subbookmark, '=' for menu, or ^G to cancel: "
+msgstr "Valige alamjärg, '=' annab menüü, ^G katkestab: "
+
+#. #define MULTIBOOKMARKS_SELF
+#: LYMessages.c:670
+msgid "Reproduce L)ink in this bookmark file or C)ancel? (l,c): "
+msgstr "L=Uuenda viide selles järgede failis või C=katkesta? (l,c): "
+
+#: LYMessages.c:671
+msgid "Multiple bookmark support is not available."
+msgstr "Mitut järgede faili ei toetata."
+
+#: LYMessages.c:672
+#, c-format
+msgid " Select Bookmark (screen %d of %d)"
+msgstr " Valige järg (ekraan %d/%d)"
+
+#: LYMessages.c:673
+msgid " Select Bookmark"
+msgstr " Valige järg"
+
+#. #define MULTIBOOKMARKS_EHEAD_MASK
+#: LYMessages.c:675
+#, c-format
+msgid "Editing Bookmark DESCRIPTION and FILEPATH (%d of 2)"
+msgstr "Järgede kirjelduste ja failiteede toimetamine (%d/2)"
+
+#. #define MULTIBOOKMARKS_EHEAD
+#: LYMessages.c:677
+msgid " Editing Bookmark DESCRIPTION and FILEPATH"
+msgstr " Järje kirjelduse ja failitee toimetamine"
+
+#: LYMessages.c:678
+msgid "Letter: "
+msgstr "Täht: "
+
+#. #define USE_PATH_OFF_HOME
+#: LYMessages.c:681
+msgid "Use a filepath off your login directory in SHELL syntax!"
+msgstr "Kasutage failiteed oma kodukataloogis ja shelli süntaksiga!"
+
+#: LYMessages.c:683
+msgid "Use a filepath off your home directory!"
+msgstr "Kasutage failiteed oma kodukataloogis!"
+
+#. #define MAXLINKS_REACHED
+#: LYMessages.c:686
+msgid "Maximum links per page exceeded! Use half-page or two-line scrolling."
+msgstr "Viidete maksimum lehel ületatud! Kasutage poolt lehte või kahe-rea skrolli."
+
+#: LYMessages.c:687
+msgid "No previously visited links available!"
+msgstr "Varem külastatud viiteid pole!"
+
+#: LYMessages.c:688
+msgid "Memory exhausted! Program aborted!"
+msgstr "Mälu on otsas! Programm katkestab töö!"
+
+#: LYMessages.c:689
+msgid "Memory exhausted! Aborting..."
+msgstr "Mälu on otsas! Katkestan töö..."
+
+#: LYMessages.c:690
+msgid "Not enough memory!"
+msgstr "Mälu on otsas!"
+
+#: LYMessages.c:691
+msgid "Directory/File Manager not available"
+msgstr "Kataloogi/faili haldur ei ole kasutatav"
+
+#: LYMessages.c:692
+msgid "Location URL is not absolute."
+msgstr "Asukoha URL ei ole absoluutne."
+
+#: LYMessages.c:693
+msgid "Refresh URL is not absolute."
+msgstr "Uuendatud URL ei ole absoluutne."
+
+#. #define SENDING_MESSAGE_WITH_BODY_TO
+#: LYMessages.c:695
+msgid ""
+"You are sending a message with body to:\n"
+" "
+msgstr ""
+"Te olete saatmas pikemat teadet aadressil:\n"
+" "
+
+#: LYMessages.c:696
+msgid ""
+"You are sending a comment to:\n"
+" "
+msgstr ""
+"Te olete saatmas kommentaari aadressil:\n"
+" "
+
+#: LYMessages.c:697
+msgid ""
+"\n"
+" With copy to:\n"
+" "
+msgstr ""
+"\n"
+"Koopia aadressile:\n"
+" "
+
+#: LYMessages.c:698
+msgid ""
+"\n"
+" With copies to:\n"
+" "
+msgstr ""
+"\n"
+"Koopiad aadressidele:\n"
+" "
+
+#. #define CTRL_G_TO_CANCEL_SEND
+#: LYMessages.c:700
+msgid ""
+"\n"
+"\n"
+"Use Ctrl-G to cancel if you do not want to send a message\n"
+msgstr ""
+"\n"
+"\n"
+"Kui te ei soovi teadet saata, vajutage katkestamiseks Ctrl-G\n"
+
+#. #define ENTER_NAME_OR_BLANK
+#: LYMessages.c:702
+msgid ""
+"\n"
+" Please enter your name, or leave it blank to remain anonymous\n"
+msgstr ""
+"\n"
+" Palun sisestage oma nimi või jätke tühjaks, kui soovite jääda anonüümseks\n"
+
+#. #define ENTER_MAIL_ADDRESS_OR_OTHER
+#: LYMessages.c:704
+msgid ""
+"\n"
+" Please enter a mail address or some other\n"
+msgstr ""
+"\n"
+" Kui soovite vastust, sisestage palun e-posti\n"
+
+#. #define MEANS_TO_CONTACT_FOR_RESPONSE
+#: LYMessages.c:706
+msgid " means to contact you, if you desire a response.\n"
+msgstr " aadress või muu kontakti info.\n"
+
+#: LYMessages.c:707
+msgid ""
+"\n"
+" Please enter a subject line.\n"
+msgstr ""
+"\n"
+" Palun sisestage teemarida.\n"
+
+#. #define ENTER_ADDRESS_FOR_CC
+#: LYMessages.c:709
+msgid ""
+"\n"
+" Enter a mail address for a CC of your message.\n"
+msgstr ""
+"\n"
+" Sisestage palun aadress, millele saata teate koopia.\n"
+
+#: LYMessages.c:710
+msgid " (Leave blank if you don't want a copy.)\n"
+msgstr " (Jätke tühjaks, kui te ei soovi koopiat.)\n"
+
+#: LYMessages.c:711
+msgid ""
+"\n"
+" Please review the message body:\n"
+"\n"
+msgstr ""
+"\n"
+" Palun vaadake teade üle:\n"
+"\n"
+
+#: LYMessages.c:712
+msgid ""
+"\n"
+"Press RETURN to continue: "
+msgstr ""
+"\n"
+"Jätkamiseks vajutage RETURN: "
+
+#: LYMessages.c:713
+msgid ""
+"\n"
+"Press RETURN to clean up: "
+msgstr ""
+"\n"
+"Puhastamiseks vajutage RETURN: "
+
+#: LYMessages.c:714
+msgid " Use Control-U to erase the default.\n"
+msgstr " Vaikeväärtuse kustutamiseks vajutage Control-U.\n"
+
+#: LYMessages.c:715
+msgid ""
+"\n"
+" Please enter your message below."
+msgstr ""
+"\n"
+" Palun sisestage all oma teade."
+
+#. #define ENTER_PERIOD_WHEN_DONE_A
+#: LYMessages.c:717 src/LYNews.c:360
+msgid ""
+"\n"
+" When you are done, press enter and put a single period (.)"
+msgstr ""
+"\n"
+"Kui te olete valmis, vajutage enter ja kirjutage punkt (.)"
+
+#. #define ENTER_PERIOD_WHEN_DONE_B
+#: LYMessages.c:719 src/LYNews.c:361
+msgid ""
+"\n"
+" on a line and press enter again."
+msgstr ""
+"\n"
+" ja vajutage uuesti enter klahvi."
+
+#. Cookies messages
+#. #define ADVANCED_COOKIE_CONFIRMATION
+#: LYMessages.c:723
+#, c-format
+msgid "%s cookie: %.*s=%.*s Allow? (Y/N/Always/neVer)"
+msgstr "%s präänik: %.*s=%.*s Luban? (J/E/Alati/Mitte kunagi)"
+
+#. #define INVALID_COOKIE_DOMAIN_CONFIRMATION
+#: LYMessages.c:725
+#, c-format
+msgid "Accept invalid cookie domain=%s for '%s'?"
+msgstr "Aktsepteerin vigast prääniku doomenit=%s, server '%s'?"
+
+#. #define INVALID_COOKIE_PATH_CONFIRMATION
+#: LYMessages.c:727
+#, c-format
+msgid "Accept invalid cookie path=%s as a prefix of '%s'?"
+msgstr "Aktsepteerin vigast prääniku teed=%s '%s' prefiksina?"
+
+#: LYMessages.c:728
+msgid "Allowing this cookie."
+msgstr "Luban seda präänikut."
+
+#: LYMessages.c:729
+msgid "Rejecting this cookie."
+msgstr "Keeldun sellest präänikust."
+
+#: LYMessages.c:730
+msgid "The Cookie Jar is empty."
+msgstr "Prääniku Jar on tühi."
+
+#: LYMessages.c:731
+msgid "The Cache Jar is empty."
+msgstr "Puhvri Jar on tühi."
+
+#. #define ACTIVATE_TO_GOBBLE
+#: LYMessages.c:733
+msgid "Activate links to gobble up cookies or entire domains,"
+msgstr "Präänikute või tervete doomenite neelamiseks aktiveerige viited "
+
+#: LYMessages.c:734
+msgid "or to change a domain's 'allow' setting."
+msgstr "või muutke doomeni 'allow' seadet."
+
+#: LYMessages.c:735
+msgid "(Cookies never allowed.)"
+msgstr "(Präänikuid ei lubata kunagi.)"
+
+#: LYMessages.c:736
+msgid "(Cookies always allowed.)"
+msgstr "(Präänikuid lubatakse alati.)"
+
+#: LYMessages.c:737
+msgid "(Cookies allowed via prompt.)"
+msgstr "(präänikute lubamist küsitakse.)"
+
+#: LYMessages.c:738
+msgid "(Persistent Cookies.)"
+msgstr "(Püsivad präänikud.)"
+
+#: LYMessages.c:739
+msgid "(No title.)"
+msgstr "(Tiitlita.)"
+
+#: LYMessages.c:740
+msgid "(No name.)"
+msgstr "(Nimeta.)"
+
+#: LYMessages.c:741
+msgid "(No value.)"
+msgstr "(Väärtuseta.)"
+
+#: LYMessages.c:742 src/LYOptions.c:2482
+msgid "None"
+msgstr "Puudub"
+
+#: LYMessages.c:743
+msgid "(End of session.)"
+msgstr "(Sessiooni lõpp.)"
+
+#: LYMessages.c:744
+msgid "Delete this cookie?"
+msgstr "Kustutan selle prääniku?"
+
+#: LYMessages.c:745
+msgid "The cookie has been eaten!"
+msgstr "Präänik on söödud!"
+
+#: LYMessages.c:746
+msgid "Delete this empty domain?"
+msgstr "Kustutan selle tühja doomeni?"
+
+#: LYMessages.c:747
+msgid "The domain has been eaten!"
+msgstr "Doomen on söödud!"
+
+#. #define DELETE_COOKIES_SET_ALLOW_OR_CANCEL
+#: LYMessages.c:749
+msgid "D)elete domain's cookies, set allow A)lways/P)rompt/neV)er, or C)ancel? "
+msgstr "D=kustuta doomeni präänikud, sea luba A)lati/P=küsi/V=ei või C=katkesta? "
+
+#. #define DELETE_DOMAIN_SET_ALLOW_OR_CANCEL
+#: LYMessages.c:751
+msgid "D)elete domain, set allow A)lways/P)rompt/neV)er, or C)ancel? "
+msgstr "D=Kustuta doomen, sea luba A)lati/P=küsi/V=ei või C=katkesta? "
+
+#: LYMessages.c:752
+msgid "All cookies in the domain have been eaten!"
+msgstr "Doomeni kõik präänikud on söödud!"
+
+#: LYMessages.c:753
+#, c-format
+msgid "'A'lways allowing from domain '%s'."
+msgstr "'A'lati luban doomenist '%s'."
+
+#: LYMessages.c:754
+#, c-format
+msgid "ne'V'er allowing from domain '%s'."
+msgstr "'V'=ei luba kunagi doomenist '%s'."
+
+#: LYMessages.c:755
+#, c-format
+msgid "'P'rompting to allow from domain '%s'."
+msgstr "'P'=küsi, et lubada doomenist '%s'."
+
+#: LYMessages.c:756
+msgid "Delete all cookies in this domain?"
+msgstr "Kustutan kõik selle doomeni präänikud?"
+
+#: LYMessages.c:757
+msgid "All of the cookies in the jar have been eaten!"
+msgstr "Kõik jari küpsised on söödud!"
+
+#: LYMessages.c:759
+msgid "Port 19 not permitted in URLs."
+msgstr "Porti 19 ei ole lubatud URLis kasutada."
+
+#: LYMessages.c:760
+msgid "Port 25 not permitted in URLs."
+msgstr "Porti 25 ei ole lubatud URLis kasutada."
+
+#: LYMessages.c:761
+#, c-format
+msgid "Port %lu not permitted in URLs."
+msgstr "Porti %lu ei ole lubatud URLis kasutada."
+
+#: LYMessages.c:762
+msgid "URL has a bad port field."
+msgstr "Port urlis on vigane."
+
+#: LYMessages.c:763
+msgid "Maximum nesting of HTML elements exceeded."
+msgstr "Üksteises sisalduvate HTML elementide maksimum ületatud."
+
+#: LYMessages.c:764
+msgid "Bad partial reference! Stripping lead dots."
+msgstr "Vigane osaline viide! Eemaldan esimesed punktid."
+
+#: LYMessages.c:765
+msgid "Trace Log open failed. Trace off!"
+msgstr "Trasseerimise logi avamine ebaõnnestus. Ei trasseeri!"
+
+#: LYMessages.c:766
+msgid "Lynx Trace Log"
+msgstr "Lynx trasseerimise logi"
+
+#: LYMessages.c:767
+msgid "No trace log has been started for this session."
+msgstr "Selle sessiooniga ei ole trasseerimist alustatud."
+
+#. #define MAX_TEMPCOUNT_REACHED
+#: LYMessages.c:769
+msgid "The maximum temporary file count has been reached!"
+msgstr "Maksimaalne ajutiste failide arv on ületatud!"
+
+#. #define FORM_VALUE_TOO_LONG
+#: LYMessages.c:771
+msgid "Form field value exceeds buffer length! Trim the tail."
+msgstr "Vormi väärtuse pikkus ületab puhvri pikkust! Eemaldan ülejäägi."
+
+#. #define FORM_TAIL_COMBINED_WITH_HEAD
+#: LYMessages.c:773
+msgid "Modified tail combined with head of form field value."
+msgstr "Muudetud lõpp kombineeriti vormi välja väärtuse päisega."
+
+#. HTFile.c
+#: LYMessages.c:776
+msgid "Directory"
+msgstr "Kataloog"
+
+#: LYMessages.c:777
+msgid "Directory browsing is not allowed."
+msgstr "Kataloogide prausimine ei ole lubatud."
+
+#: LYMessages.c:778
+msgid "Selective access is not enabled for this directory"
+msgstr "Valikuline lubamine ei ole selles kataloogis lubatud"
+
+#: LYMessages.c:779
+msgid "Multiformat: directory scan failed."
+msgstr "Multiformat: kataloogi skaneerimine ebaõnnestus."
+
+#: LYMessages.c:780
+msgid "This directory is not readable."
+msgstr "See kataloog ei ole loetav."
+
+#: LYMessages.c:781
+msgid "Can't access requested file."
+msgstr "Soovitud faili ei saa kasutada."
+
+#: LYMessages.c:782
+msgid "Could not find suitable representation for transmission."
+msgstr "Ei leia ülekandeks sobivat esitusviisi."
+
+#: LYMessages.c:783
+msgid "Could not open file for decompression!"
+msgstr "Faili ei õnnestu lahtipakkimiseks avada!"
+
+#: LYMessages.c:784
+msgid "Files:"
+msgstr "Failid:"
+
+#: LYMessages.c:785
+msgid "Subdirectories:"
+msgstr "Alamkataloogid:"
+
+#: LYMessages.c:786
+msgid " directory"
+msgstr " kataloog"
+
+#: LYMessages.c:787
+msgid "Up to "
+msgstr "Tagasi "
+
+#: LYMessages.c:788
+msgid "Current directory is "
+msgstr "Jooksev kataloog on "
+
+#. HTFTP.c
+#: LYMessages.c:791
+msgid "Symbolic Link"
+msgstr "Nimeviide"
+
+#. HTGopher.c
+#: LYMessages.c:794
+msgid "No response from server!"
+msgstr "Server ei vasta!"
+
+#: LYMessages.c:795
+msgid "CSO index"
+msgstr "CSO indeks"
+
+#: LYMessages.c:796
+msgid ""
+"\n"
+"This is a searchable index of a CSO database.\n"
+msgstr ""
+"\n"
+"See on CSO andmebaasi otsingu indeks.\n"
+
+#: LYMessages.c:797
+msgid "CSO Search Results"
+msgstr "CSO otsingu tulemused"
+
+#: LYMessages.c:798
+#, c-format
+msgid "Seek fail on %s\n"
+msgstr "%s positsioneerimine ebaõnnestus\n"
+
+#: LYMessages.c:799
+msgid ""
+"\n"
+"Press the 's' key and enter search keywords.\n"
+msgstr ""
+"\n"
+"Vajutage klahvi 's' ja sisestage otsingu võtmesõnad.\n"
+
+#: LYMessages.c:800
+msgid ""
+"\n"
+"This is a searchable Gopher index.\n"
+msgstr ""
+"\n"
+"See on Gopheri otsingu indeks.\n"
+
+#: LYMessages.c:801
+msgid "Gopher index"
+msgstr "Gopher indeks"
+
+#: LYMessages.c:802
+msgid "Gopher Menu"
+msgstr "Gopher Menüü"
+
+#: LYMessages.c:803
+msgid " Search Results"
+msgstr " Otsingu tulemused"
+
+#: LYMessages.c:804
+msgid "Sending CSO/PH request."
+msgstr "Saadan CSO/PH päringu."
+
+#: LYMessages.c:805
+msgid "Sending Gopher request."
+msgstr "Saadan Gopher päringu."
+
+#: LYMessages.c:806
+msgid "CSO/PH request sent; waiting for response."
+msgstr "CSO/PH päring saadetud; ootan vastust."
+
+#: LYMessages.c:807
+msgid "Gopher request sent; waiting for response."
+msgstr "Gopher päring saadetud; ootan vastust."
+
+#: LYMessages.c:808
+msgid ""
+"\n"
+"Please enter search keywords.\n"
+msgstr ""
+"\n"
+"Palun sisestage otsitavad võtmesõnad.\n"
+
+#: LYMessages.c:809
+msgid ""
+"\n"
+"The keywords that you enter will allow you to search on a"
+msgstr ""
+"\n"
+"Sisestatavate võtmesõnadega otsitakse"
+
+#: LYMessages.c:810
+msgid " person's name in the database.\n"
+msgstr " andmebaasist inimeste nimesid.\n"
+
+#. HTNews.c
+#: LYMessages.c:813
+msgid "Connection closed ???"
+msgstr "Ãœhendus suleti ???"
+
+#: LYMessages.c:814
+msgid "Cannot open temporary file for news POST."
+msgstr "Uudisegruppi postitamiseks ei õnnestu avada ajutist faili."
+
+#: LYMessages.c:815
+msgid "This client does not contain support for posting to news with SSL."
+msgstr "See klient ei toeta SSL vahendusel uudisegruppi postitamist."
+
+#. HTStyle.c
+#: LYMessages.c:818
+#, c-format
+msgid "Style %d `%s' SGML:%s. Font %s %.1f point.\n"
+msgstr "Stiil %d `%s' SGML:%s. Kiri %s %.1f punkti.\n"
+
+#: LYMessages.c:820
+#, c-format
+msgid "\tAlign=%d, %d tabs. (%.0f before, %.0f after)\n"
+msgstr "\tJoondus=%d, %d tab. (%.0f enen, %.0f peale)\n"
+
+#: LYMessages.c:821
+#, c-format
+msgid "\t\tTab kind=%d at %.0f\n"
+msgstr "\t\tTab tüüp=%d kohal %.0f\n"
+
+#. HTTP.c
+#: LYMessages.c:824
+msgid "Can't proceed without a username and password."
+msgstr "Kasutajanime ja paroolita ei saa jätkata."
+
+#: LYMessages.c:825
+msgid "Can't retry with authorization! Contact the server's WebMaster."
+msgstr "Autoriseerimisega ei õnnestu jätkata! Võtke ühendust serveri haldajaga."
+
+#: LYMessages.c:826
+msgid "Can't retry with proxy authorization! Contact the server's WebMaster."
+msgstr "Proksi autoriseerimisega ei õnnestu jätkata! Kontakteeruge serveri haldajaga."
+
+#: LYMessages.c:827
+msgid "Retrying with proxy authorization information."
+msgstr "Proovin uuesti proksi autoriseerimise infoga."
+
+#: LYMessages.c:828
+#, c-format
+msgid "SSL error:%s-Continue?"
+msgstr "SSL viga:%s-Jätkan?"
+
+#. HTWAIS.c
+#: LYMessages.c:831
+msgid "HTWAIS: Return message too large."
+msgstr "HTWAIS: Tagastatav teade on liiga pikk."
+
+#: LYMessages.c:832
+msgid "Enter WAIS query: "
+msgstr "Sisestage WAIS päring: "
+
+#. Miscellaneous status
+#: LYMessages.c:835
+msgid "Retrying as HTTP0 request."
+msgstr "Proovin uuesti HTTP0 päringuna."
+
+#: LYMessages.c:836
+#, c-format
+msgid "Transferred %d bytes"
+msgstr "Laetud %d baiti"
+
+#: LYMessages.c:837
+msgid "Data transfer complete"
+msgstr "Andmed laetud"
+
+#: LYMessages.c:838
+#, c-format
+msgid "Error processing line %d of %s\n"
+msgstr "Viga rea %d töötlemisel (%s)\n"
+
+#. Lynx internal page titles
+#: LYMessages.c:841
+msgid "Address List Page"
+msgstr "Aadressi loendi leht"
+
+#: LYMessages.c:842
+msgid "Bookmark file"
+msgstr "Järgede fail"
+
+#: LYMessages.c:843
+msgid "Configuration Definitions"
+msgstr "Seadete definitsioonid"
+
+#: LYMessages.c:844
+msgid "Cookie Jar"
+msgstr "Präänikute Jar"
+
+#: LYMessages.c:845
+msgid "Current Edit-Key Map"
+msgstr "Jooksev redigeerimise-klahvi tabel"
+
+#: LYMessages.c:846
+msgid "Current Key Map"
+msgstr "Jooksev klahvitabel"
+
+#: LYMessages.c:847
+msgid "File Management Options"
+msgstr "Failide haldamise seaded"
+
+#: LYMessages.c:848
+msgid "Download Options"
+msgstr "Allalaadimise võimalused"
+
+#: LYMessages.c:849
+msgid "History Page"
+msgstr "Ajaloo leht"
+
+#: LYMessages.c:850
+msgid "Cache Jar"
+msgstr "Puhvi Jar"
+
+#: LYMessages.c:851
+msgid "List Page"
+msgstr "Lehe info"
+
+#: LYMessages.c:852
+msgid "Lynx.cfg Information"
+msgstr "Lynx.cfg Informatsioon"
+
+#: LYMessages.c:853
+msgid "Converted Mosaic Hotlist"
+msgstr "Teisendatud Mosaic Hotlist"
+
+#: LYMessages.c:854
+msgid "Options Menu"
+msgstr "Omaduste menüü"
+
+#: LYMessages.c:855
+msgid "File Permission Options"
+msgstr "Failiõiguste seaded"
+
+#: LYMessages.c:856
+msgid "Printing Options"
+msgstr "Trükkimise võimalused"
+
+#: LYMessages.c:857
+msgid "Information about the current document"
+msgstr "Info jooksvast dokumendist"
+
+#: LYMessages.c:858
+msgid "Your recent statusline messages"
+msgstr "Viimased olekurea teated"
+
+#: LYMessages.c:859
+msgid "Upload Options"
+msgstr "Ãœleslaadimise seaded"
+
+#: LYMessages.c:860
+msgid "Visited Links Page"
+msgstr "Külastatud viidete leht"
+
+#. CONFIG_DEF_TITLE subtitles
+#: LYMessages.c:863
+msgid "See also"
+msgstr "Vaadake ka"
+
+#: LYMessages.c:864
+msgid "your"
+msgstr "teie"
+
+#: LYMessages.c:865
+msgid "for runtime options"
+msgstr "töö-aja seaded"
+
+#: LYMessages.c:866
+msgid "compile time options"
+msgstr "kompileerimise aegsed seaded"
+
+#: LYMessages.c:867
+msgid "color-style configuration"
+msgstr "värvistiili seaded"
+
+#: LYMessages.c:868
+msgid "latest release"
+msgstr "viimane versioon"
+
+#: LYMessages.c:869
+msgid "pre-release version"
+msgstr "eelversioon"
+
+#: LYMessages.c:870
+msgid "development version"
+msgstr "arendusversioon"
+
+#. #define AUTOCONF_CONFIG_CACHE
+#: LYMessages.c:872
+msgid ""
+"The following data were derived during the automatic configuration/build\n"
+"process of this copy of Lynx. When reporting a bug, please include a copy\n"
+"of this page."
+msgstr ""
+"Järgnevad andmed tuletati selle Lynxi automaatse seadistamise ja ehitamise\n"
+"protsessi käigus. Vearaportite saatmisel lisage palun koopia ka sellest\n"
+"lehest."
+
+#. #define AUTOCONF_LYNXCFG_H
+#: LYMessages.c:876
+msgid ""
+"The following data were used as automatically-configured compile-time\n"
+"definitions when this copy of Lynx was built."
+msgstr ""
+"Järgnevaid andmeid kasutati selle Lynxi ehitamisel automaatselt seadistatud\n"
+"kompileerimise aegsete definitsioonidena."
+
+#. #define DIRED_NOVICELINE
+#: LYMessages.c:881
+msgid " C)reate D)ownload E)dit F)ull menu M)odify R)emove T)ag U)pload \n"
+msgstr " C=loo D=lae alla E=toimeta F=kogu menüü M)uuda R=eemalda T=märgi U=lae üles\n"
+
+#: LYMessages.c:882
+msgid "Failed to obtain status of current link!"
+msgstr "Jooksva viite oleku lugemine ebaõnnestus!"
+
+#. #define INVALID_PERMIT_URL
+#: LYMessages.c:885
+msgid "Special URL only valid from current File Permission menu!"
+msgstr "Spetsiaal URL on lubatud ainult faili õiguste menüüs!"
+
+#: LYMessages.c:889
+msgid "External support is currently disabled."
+msgstr "Väline tugi on hetkel blokeeritud."
+
+#. new with 2.8.4dev.21
+#: LYMessages.c:893
+msgid "Changing working-directory is currently disabled."
+msgstr "Töökataloogi muutmine on hetkel blokeeritud."
+
+#: LYMessages.c:894
+msgid "Linewrap OFF!"
+msgstr "Reamurdmine väljas!"
+
+#: LYMessages.c:895
+msgid "Linewrap ON!"
+msgstr "Reamurdmine sees!"
+
+#: LYMessages.c:896
+msgid "Parsing nested-tables toggled OFF! Reloading..."
+msgstr "Tabelid tabelites töötlemine on välja lülitatud! Laen uuesti..."
+
+#: LYMessages.c:897
+msgid "Parsing nested-tables toggled ON! Reloading..."
+msgstr "Tabelid tabelites töötlemine on sisse lülitatud! Laen uuesti..."
+
+#: LYMessages.c:898
+msgid "Shifting is disabled while line-wrap is in effect"
+msgstr "Kui kasutatakse reamurdmist, on nihutamine blokeeritud"
+
+#: LYMessages.c:899
+msgid "Trace not supported"
+msgstr "Trasseerimine ei ole toetatud"
+
+#: LYMessages.c:819
+#, c-format
+msgid "\tIndents: first=%.0f others=%.0f, Height=%.1f Desc=%.1f\n"
+msgstr "\tTaanded: esimene=%.0f teised=%.0f, Kõrgus=%.1f Kirj=%.1f\n"
+
+#: WWW/Library/Implementation/HTAABrow.c:575
+#, c-format
+msgid "username for realm %s changed from %s to %s"
+msgstr "realmi %s kasutajanimi oli %s, uus on %s"
+
+#: WWW/Library/Implementation/HTAABrow.c:591
+#, c-format
+msgid "password for realm %s user %s changed"
+msgstr "realmi %s kasutaja %s parool on muudetud"
+
+#: WWW/Library/Implementation/HTAABrow.c:703
+#, c-format
+msgid "Username for '%s' at %s '%s%s':"
+msgstr "Kasutajanimi '%s' kasutamiseks, %s '%s%s':"
+
+#: WWW/Library/Implementation/HTAABrow.c:976
+msgid "This client doesn't know how to compose proxy authorization information for scheme"
+msgstr "See klient ei tea, kuidas koostada proksi autoriseerimise infot skeemile"
+
+#: WWW/Library/Implementation/HTAABrow.c:1053
+msgid "This client doesn't know how to compose authorization information for scheme"
+msgstr "See klient ei tea, kuidas koostada autoriseerimise infot skeemile"
+
+#: WWW/Library/Implementation/HTAABrow.c:1162
+#, c-format
+msgid "Invalid header '%s%s%s%s%s'"
+msgstr "Vigane päis '%s%s%s%s%s'"
+
+#: WWW/Library/Implementation/HTAABrow.c:1266
+msgid "Proxy authorization required -- retrying"
+msgstr "Nõutakse proksi autentimist -- proovin uuesti"
+
+#: WWW/Library/Implementation/HTAABrow.c:1322
+msgid "Access without authorization denied -- retrying"
+msgstr "Autoriseerimata ei lubata kasutada -- proovin uuesti"
+
+#: WWW/Library/Implementation/HTAccess.c:698
+msgid "Access forbidden by rule"
+msgstr "Reeglid piiravad juurdepääsu"
+
+#: WWW/Library/Implementation/HTAccess.c:800
+msgid "Document with POST content not found in cache. Resubmit?"
+msgstr "POST sisuga dokument puudub puhvrist. Postitan uuesti?"
+
+#: WWW/Library/Implementation/HTAccess.c:953
+msgid "Loading failed, use a previous copy."
+msgstr "laadimine ebaõnnestus, kasuta eelmist koopiat."
+
+#: WWW/Library/Implementation/HTAccess.c:1062 src/GridText.c:8939
+msgid "Loading incomplete."
+msgstr "Mittetäielik laadimine."
+
+#: WWW/Library/Implementation/HTAccess.c:1093
+#, c-format
+msgid "**** HTAccess: socket or file number returned by obsolete load routine!\n"
+msgstr "**** HTAccess: pistiku või faili numbri tagastas aegunud protseduur!\n"
+
+#: WWW/Library/Implementation/HTAccess.c:1095
+#, c-format
+msgid "**** HTAccess: Internal software error. Please mail lynx-dev@nongnu.org!\n"
+msgstr "**** HTAccess: Sisemine tarkvaraline viga. Teavitage palun lynx-dev@nongnu.org!\n"
+
+#: WWW/Library/Implementation/HTAccess.c:1096
+#, c-format
+msgid "**** HTAccess: Status returned was: %d\n"
+msgstr "**** HTAccess: Tagastatud olek oli: %d\n"
+
+#.
+#. * hack: if we fail in HTAccess.c
+#. * avoid duplicating URL, oh.
+#.
+#: WWW/Library/Implementation/HTAccess.c:1102 src/LYMainLoop.c:8076
+msgid "Can't Access"
+msgstr "Ei saa kasutada"
+
+#: WWW/Library/Implementation/HTAccess.c:1110
+msgid "Unable to access document."
+msgstr "Dokumenti ei saa kasutada."
+
+#: WWW/Library/Implementation/HTFTP.c:870
+#, c-format
+msgid "Enter password for user %s@%s:"
+msgstr "Sisestage kasutaja %s@%s parool:"
+
+#: WWW/Library/Implementation/HTFTP.c:898
+msgid "Unable to connect to FTP host."
+msgstr "Ei õnnestu luua ühendust FTP serveriga."
+
+#: WWW/Library/Implementation/HTFTP.c:1137
+msgid "close master socket"
+msgstr "ülem pistiku sulgemine"
+
+#: WWW/Library/Implementation/HTFTP.c:1195
+msgid "socket for master socket"
+msgstr "pistik ülem pistikule"
+
+#: WWW/Library/Implementation/HTFTP.c:2925
+msgid "Receiving FTP directory."
+msgstr "Laen FTP kataloogi."
+
+#: WWW/Library/Implementation/HTFTP.c:3063
+#, c-format
+msgid "Transferred %d bytes (%5d)"
+msgstr "Ãœle kantud %d baiti (%5d)"
+
+#: WWW/Library/Implementation/HTFTP.c:3421
+msgid "connect for data"
+msgstr "loon andmekanalit"
+
+#: WWW/Library/Implementation/HTFTP.c:4098
+msgid "Receiving FTP file."
+msgstr "Laen FTP faili."
+
+#: WWW/Library/Implementation/HTFinger.c:274
+msgid "Could not set up finger connection."
+msgstr "Ei õnnestu luua ühendust finger teenusega."
+
+#: WWW/Library/Implementation/HTFinger.c:321
+msgid "Could not load data (no sitename in finger URL)"
+msgstr "Ei õnnestu lugeda andmeid (finger URLis puudub serveri nimi)"
+
+#: WWW/Library/Implementation/HTFinger.c:325
+msgid "Invalid port number - will only use port 79!"
+msgstr "Vigane pordi number - kasutan ainult porti 79!"
+
+#: WWW/Library/Implementation/HTFinger.c:391
+msgid "Could not access finger host."
+msgstr "Finger serverit ei saa kasutada."
+
+#: WWW/Library/Implementation/HTFinger.c:399
+msgid "No response from finger server."
+msgstr "Finger server ei vasta."
+
+#: WWW/Library/Implementation/HTNews.c:439
+#, c-format
+msgid "Username for news host '%s':"
+msgstr "Kasutajanimi uudiseserverile '%s':"
+
+#: WWW/Library/Implementation/HTNews.c:492
+msgid "Change username?"
+msgstr "Muudan kasutajanime?"
+
+#: WWW/Library/Implementation/HTNews.c:496
+msgid "Username:"
+msgstr "Kasutajanimi:"
+
+#: WWW/Library/Implementation/HTNews.c:521
+#, c-format
+msgid "Password for news host '%s':"
+msgstr "Parool uudiseserverile '%s':"
+
+#: WWW/Library/Implementation/HTNews.c:604
+msgid "Change password?"
+msgstr "Muudan parooli?"
+
+#: WWW/Library/Implementation/HTNews.c:1725
+#, c-format
+msgid "No matches for: %s"
+msgstr "Ei leia: %s"
+
+#: WWW/Library/Implementation/HTNews.c:1775
+msgid ""
+"\n"
+"No articles in this group.\n"
+msgstr ""
+"\n"
+"Selles grupis ei ole artikleid.\n"
+
+#: WWW/Library/Implementation/HTNews.c:1787
+msgid ""
+"\n"
+"No articles in this range.\n"
+msgstr ""
+"\n"
+"Selles vahemikus artikleid ei ole.\n"
+
+#.
+#. * Set window title.
+#.
+#: WWW/Library/Implementation/HTNews.c:1800
+#, c-format
+msgid "%s, Articles %d-%d"
+msgstr "%s, Artiklid %d-%d"
+
+#: WWW/Library/Implementation/HTNews.c:1823
+msgid "Earlier articles"
+msgstr "Varasemad artiklid"
+
+#: WWW/Library/Implementation/HTNews.c:1836
+#, c-format
+msgid ""
+"\n"
+"There are about %d articles currently available in %s, IDs as follows:\n"
+"\n"
+msgstr ""
+"\n"
+"Leidsin umbes %d artiklit grupis %s, järgnevad artiklite ID:\n"
+"\n"
+
+#: WWW/Library/Implementation/HTNews.c:1898
+msgid "All available articles in "
+msgstr "Kõik kasutatavad artiklid grupis "
+
+#: WWW/Library/Implementation/HTNews.c:2112
+msgid "Later articles"
+msgstr "Hilisemad artiklid"
+
+#: WWW/Library/Implementation/HTNews.c:2135
+msgid "Post to "
+msgstr "Postita gruppi "
+
+#: WWW/Library/Implementation/HTNews.c:2356
+msgid "This client does not contain support for SNEWS URLs."
+msgstr "See klient ei toeta SNEWS URLe."
+
+#: WWW/Library/Implementation/HTNews.c:2565
+msgid "No target for raw text!"
+msgstr "Toore teksti jaoks pole kohta!"
+
+#: WWW/Library/Implementation/HTNews.c:2595
+msgid "Connecting to NewsHost ..."
+msgstr "Loon ühendust uudisegruppide serveriga ..."
+
+#: WWW/Library/Implementation/HTNews.c:2647
+#, c-format
+msgid "Could not access %s."
+msgstr "%s ei saa kasutada."
+
+#: WWW/Library/Implementation/HTNews.c:2753
+#, c-format
+msgid "Can't read news info. News host %.20s responded: %.200s"
+msgstr "Ei õnnestu lugeda uudiste infot. Server %.20s vastas: %.200s"
+
+#: WWW/Library/Implementation/HTNews.c:2757
+#, c-format
+msgid "Can't read news info, empty response from host %s"
+msgstr "Ei õnnestu lugeda uudiste infot, tühi vastus serverilt %s"
+
+#.
+#. * List available newsgroups. - FM
+#.
+#: WWW/Library/Implementation/HTNews.c:2961
+msgid "Reading list of available newsgroups."
+msgstr "Loen kasutatavate gruppide nimekirja."
+
+#: WWW/Library/Implementation/HTNews.c:2982
+msgid "Reading list of articles in newsgroup."
+msgstr "Loen artiklite nimekirja grupis."
+
+#.
+#. * Get an article from a news group. - FM
+#.
+#: WWW/Library/Implementation/HTNews.c:2988
+msgid "Reading news article."
+msgstr "Loen artiklit."
+
+#: WWW/Library/Implementation/HTNews.c:3018
+msgid "Sorry, could not load requested news."
+msgstr "Kahjuks ei õnnestunud soovitud uudiseid laadida."
+
+#: WWW/Library/Implementation/HTTCP.c:1339
+msgid "Address has invalid port"
+msgstr "Aadressis on vigane port"
+
+#: WWW/Library/Implementation/HTTCP.c:1410
+msgid "Address length looks invalid"
+msgstr "Aadressi pikkus tundub vigane"
+
+#: WWW/Library/Implementation/HTTCP.c:1868
+msgid "SOCKS5: no hostname found."
+msgstr "SOCKS5: hosti nime ei leita."
+
+#: WWW/Library/Implementation/HTTCP.c:1874
+msgid "SOCKS5: hostname too long."
+msgstr "SOCKS5: hosti nimi on liiga pikk."
+
+#: WWW/Library/Implementation/HTTCP.c:1892
+#, c-format
+msgid "(for %s at %s) SOCKS5"
+msgstr "(proto %s host %s) SOCKS5"
+
+#: WWW/Library/Implementation/HTTCP.c:1919
+#: WWW/Library/Implementation/HTTCP.c:1936
+#, c-format
+msgid "Unable to locate remote host %s."
+msgstr "Ei leia serverit %s."
+
+#. Not HTProgress, so warning won't be overwritten immediately;
+#. * but not HTAlert, because typically there will be other
+#. * alerts from the callers. - kw
+#.
+#: WWW/Library/Implementation/HTTCP.c:1933
+#: WWW/Library/Implementation/HTTelnet.c:115
+#, c-format
+msgid "Invalid hostname %s"
+msgstr "Vigane serveri nimi %s"
+
+#: WWW/Library/Implementation/HTTCP.c:1945
+#, c-format
+msgid "Making %s connection to %s"
+msgstr "Loon %s ühendust serveriga %s"
+
+#: WWW/Library/Implementation/HTTCP.c:1955
+msgid "socket failed."
+msgstr "socket ebaõnnestus."
+
+#: WWW/Library/Implementation/HTTCP.c:1969
+#, c-format
+msgid "socket failed: family %d addr %s port %s."
+msgstr "socket ebaõnnestus: perekond %d aadress %s port %s."
+
+#: WWW/Library/Implementation/HTTCP.c:1992
+msgid "Could not make connection non-blocking."
+msgstr "Ei õnnestu muuta ühendust mitte-blokeerivaks."
+
+#: WWW/Library/Implementation/HTTCP.c:2058
+msgid "Connection failed (too many retries)."
+msgstr "Ühendus ebaõnnestus (looga palju katseid)."
+
+#: WWW/Library/Implementation/HTTCP.c:2253
+msgid "Could not restore socket to blocking."
+msgstr "Pistikul ei õnnestu taastada blokeerivat moodi."
+
+#. RFC 1928: CONNECT request
+#: WWW/Library/Implementation/HTTCP.c:2285
+#, c-format
+msgid "SOCKS5: connecting to %s"
+msgstr "SOCKS5: loon ühendust serveriga %s"
+
+#: WWW/Library/Implementation/HTTCP.c:2314
+msgid "SOCKS server failure"
+msgstr "SOCKS serveri viga"
+
+#: WWW/Library/Implementation/HTTCP.c:2317
+msgid "connection not allowed by ruleset"
+msgstr "reeglistik ei luba seda ühendust"
+
+#: WWW/Library/Implementation/HTTCP.c:2320
+msgid "network unreachable"
+msgstr "võrk ei ole kättesaadav"
+
+#: WWW/Library/Implementation/HTTCP.c:2323
+msgid "host unreachable"
+msgstr "host ei ole kättesaadav"
+
+#: WWW/Library/Implementation/HTTCP.c:2326
+msgid "connection refused"
+msgstr "ühendusest keelduti"
+
+#: WWW/Library/Implementation/HTTCP.c:2329
+msgid "TTL expired"
+msgstr "TTL aegus"
+
+#: WWW/Library/Implementation/HTTCP.c:2332
+msgid "command not supported"
+msgstr "käsk ei ole toetatud"
+
+#: WWW/Library/Implementation/HTTCP.c:2335
+msgid "address type not supported"
+msgstr "aadressi tüüp ei ole toetatud"
+
+#: WWW/Library/Implementation/HTTCP.c:2338
+msgid "unknown SOCKS error code"
+msgstr "tundmatu SOCKS veakood"
+
+#: WWW/Library/Implementation/HTTCP.c:2383
+msgid "unexpected reply\n"
+msgstr "ootamatu vastus\n"
+
+#: WWW/Library/Implementation/HTTCP.c:2460
+msgid "Socket read failed (too many tries)."
+msgstr "Pistikust lugemine ebaõnnestus (liiga palju katseid)."
+
+#: WWW/Library/Implementation/HTTP.c:165
+#, c-format
+msgid "SSL callback:%s, preverify_ok=%d, ssl_okay=%d"
+msgstr "SSL callback:%s, preverify_ok=%d, ssl_okay=%d"
+
+#: WWW/Library/Implementation/HTTP.c:668
+#, c-format
+msgid "User/password contains only punctuation: %s"
+msgstr "Kasutaja/parool sisaldab ainult punktuatsioone: %s"
+
+#: WWW/Library/Implementation/HTTP.c:672
+#, c-format
+msgid "User/password may be confused with hostname: '%s' (e.g, '%s')"
+msgstr "Kasutaja/parool võib olla hosti nimega vahetuses: '%s' (n. '%s')"
+
+#: WWW/Library/Implementation/HTTP.c:733
+#, c-format
+msgid "Certificate issued by: %s"
+msgstr "Sertifikaadi väljastaja: %s"
+
+#: WWW/Library/Implementation/HTTP.c:922
+msgid "This client does not contain support for HTTPS URLs."
+msgstr "See klient ei toeta HTTPS URLe."
+
+#: WWW/Library/Implementation/HTTP.c:947
+msgid "Unable to connect to remote host."
+msgstr "Serveriga ühenduse loomine ebaõnnestus."
+
+#: WWW/Library/Implementation/HTTP.c:990
+msgid "Retrying connection without TLS."
+msgstr "Üritan ühendust uuesti luua TLS kasutamata."
+
+#: WWW/Library/Implementation/HTTP.c:1042
+msgid "GnuTLS error when trying to verify certificate."
+msgstr "GnuTLS viga sertifikaadi kontrollimisel."
+
+#: WWW/Library/Implementation/HTTP.c:1055
+msgid "the certificate has no known issuer"
+msgstr "sertifikaadil puudub tuntud väljaandja"
+
+#: WWW/Library/Implementation/HTTP.c:1057
+msgid "no issuer was found"
+msgstr "väljaandja puudub"
+
+#: WWW/Library/Implementation/HTTP.c:1059
+msgid "issuer is not a CA"
+msgstr "väljaandja pole CA"
+
+#: WWW/Library/Implementation/HTTP.c:1061
+msgid "the certificate has been revoked"
+msgstr "sertifikaat on kehtivuse kaotanud"
+
+#: WWW/Library/Implementation/HTTP.c:1063
+msgid "the certificate is not trusted"
+msgstr "sertifikaat pole usaldusväärne"
+
+#: WWW/Library/Implementation/HTTP.c:1138
+#, c-format
+msgid "Verified connection to %s (cert=%s)"
+msgstr "Kontrollitud ühendus serveriga %s (sertifikaat=%s)"
+
+#: WWW/Library/Implementation/HTTP.c:1188
+#: WWW/Library/Implementation/HTTP.c:1230
+#, c-format
+msgid "Verified connection to %s (subj=%s)"
+msgstr "Kontrollitud ühendus serveriga %s (subj=%s)"
+
+#: WWW/Library/Implementation/HTTP.c:1260
+msgid "Can't find common name in certificate"
+msgstr "Sertifikaadis puudub ühine nimi"
+
+#: WWW/Library/Implementation/HTTP.c:1263
+#, c-format
+msgid "SSL error:host(%s)!=cert(%s)-Continue?"
+msgstr "SSL viga:host(%s)!=sert(%s)-Jätkan?"
+
+#: WWW/Library/Implementation/HTTP.c:1270
+msgid "SSL error"
+msgstr "SSL viga"
+
+#: WWW/Library/Implementation/HTTP.c:1278
+#, c-format
+msgid "UNVERIFIED connection to %s (cert=%s)"
+msgstr "KONTROLLIMATA ühendus serveriga %s (sertifikaat=%s)"
+
+#: WWW/Library/Implementation/HTTP.c:1287
+#, c-format
+msgid "Secure %d-bit %s (%s) HTTP connection"
+msgstr "Turvaline %d-bitti %s (%s) HTTP ühendus"
+
+#: WWW/Library/Implementation/HTTP.c:1757
+msgid "Sending HTTP request."
+msgstr "Saadan HTTP päringu."
+
+#: WWW/Library/Implementation/HTTP.c:1799
+msgid "Unexpected network write error; connection aborted."
+msgstr "Ootamatu tõrge võrku kirjutamisel; ühendus katkestati."
+
+#: WWW/Library/Implementation/HTTP.c:1805
+msgid "HTTP request sent; waiting for response."
+msgstr "HTTP päring on saadetud; ootan vastust."
+
+#: WWW/Library/Implementation/HTTP.c:1878
+#: WWW/Library/Implementation/HTTP.c:1888
+msgid "Unexpected network read error; connection aborted."
+msgstr "Ootamatu tõrge võrgust lugemisel; ühendus katkestati."
+
+#.
+#. * HTTP/1.1 Informational statuses.
+#. * 100 Continue.
+#. * 101 Switching Protocols.
+#. * > 101 is unknown.
+#. * We should never get these, and they have only the status
+#. * line and possibly other headers, so we'll deal with them by
+#. * showing the full header to the user as text/plain. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2091
+msgid "Got unexpected Informational Status."
+msgstr "Sain ootamatu informatiivse oleku."
+
+#.
+#. * Reset Content. The server has fulfilled the request but
+#. * nothing is returned and we should reset any form
+#. * content. We'll instruct the user to do that, and
+#. * restore the current document. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2125
+msgid "Request fulfilled. Reset Content."
+msgstr "Päring täidetud. Algväärtusta sisu."
+
+#. Not Modified
+#.
+#. * We didn't send an "If-Modified-Since" header, so this
+#. * status is inappropriate. We'll deal with it by showing
+#. * the full header to the user as text/plain. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2242
+msgid "Got unexpected 304 Not Modified status."
+msgstr "Sain ootamatu oleku, 304 Pole muudetud."
+
+#: WWW/Library/Implementation/HTTP.c:2305
+msgid "Redirection of POST content requires user approval."
+msgstr "POST sisu ümbersuunamine nõuab kasutaja kinnitust."
+
+#: WWW/Library/Implementation/HTTP.c:2320
+msgid "Have POST content. Treating Permanent Redirection as Temporary.\n"
+msgstr "Oman POST sisu. Käsitlen püsivat ümbersuunamist ajutisena.\n"
+
+#: WWW/Library/Implementation/HTTP.c:2366
+msgid "Retrying with access authorization information."
+msgstr "Proovin uuesti kasutades autoriseerimise infot."
+
+#: WWW/Library/Implementation/HTTP.c:2378
+msgid "Show the 401 message body?"
+msgstr "Näitan teate 401 keha?"
+
+#: WWW/Library/Implementation/HTTP.c:2422
+msgid "Show the 407 message body?"
+msgstr "Näitan teate 407 keha?"
+
+#.
+#. * Bad or unknown server_status number. Take a chance and hope
+#. * there is something to display. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2522
+msgid "Unknown status reply from server!"
+msgstr "Tundmatu oleku vastus serverilt!"
+
+#: WWW/Library/Implementation/HTTelnet.c:113
+#, c-format
+msgid "remote %s session:"
+msgstr "%s sessioon:"
+
+#: WWW/Library/Implementation/HTWAIS.c:163
+msgid "Could not connect to WAIS server."
+msgstr "Ei õnnestu luua ühendust WAIS serveriga."
+
+#: WWW/Library/Implementation/HTWAIS.c:171
+msgid "Could not open WAIS connection for reading."
+msgstr "Ei õnnestu luua lugemiseks WAIS ühendust."
+
+#: WWW/Library/Implementation/HTWAIS.c:193
+msgid "Diagnostic code is "
+msgstr "Diagnostika kood on "
+
+#: WWW/Library/Implementation/HTWAIS.c:460
+msgid "Index "
+msgstr "Indeks "
+
+#: WWW/Library/Implementation/HTWAIS.c:464
+#, c-format
+msgid " contains the following %d item%s relevant to \""
+msgstr " sisaldab järgnevad asjasse puutuvas %d element%s \""
+
+#: WWW/Library/Implementation/HTWAIS.c:472
+msgid "The first figure after each entry is its relative score, "
+msgstr "Esimene number iga kirje järel on selle suhteline kaal, "
+
+#: WWW/Library/Implementation/HTWAIS.c:473
+msgid "the second is the number of lines in the item."
+msgstr "teine on ridade arv selles."
+
+#: WWW/Library/Implementation/HTWAIS.c:515
+msgid " (bad file name)"
+msgstr " (halb failinimi)"
+
+#: WWW/Library/Implementation/HTWAIS.c:541
+msgid "(bad doc id)"
+msgstr "(halb dokumendi id)"
+
+#: WWW/Library/Implementation/HTWAIS.c:557
+msgid "(Short Header record, can't display)"
+msgstr "(Lühike päise kirje, ei saa näidata)"
+
+#: WWW/Library/Implementation/HTWAIS.c:564
+msgid ""
+"\n"
+"Long Header record, can't display\n"
+msgstr ""
+"\n"
+"Pikk päise kirje, ei saa näidata\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:571
+msgid ""
+"\n"
+"Text record\n"
+msgstr ""
+"\n"
+"Tekstikirje\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:580
+msgid ""
+"\n"
+"Headline record, can't display\n"
+msgstr ""
+"\n"
+"Päisrea kirje, ei saa näidata\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:588
+msgid ""
+"\n"
+"Code record, can't display\n"
+msgstr ""
+"\n"
+"Koodi kirje, ei saa näidata\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:692
+msgid "Syntax error in WAIS URL"
+msgstr "Süntaksi viga WAIS URLis"
+
+#: WWW/Library/Implementation/HTWAIS.c:764
+msgid " (WAIS Index)"
+msgstr " (WAIS Indeks)"
+
+#: WWW/Library/Implementation/HTWAIS.c:771
+msgid "WAIS Index: "
+msgstr "WAIS Indeks: "
+
+#: WWW/Library/Implementation/HTWAIS.c:777
+msgid "This is a link for searching the "
+msgstr "See on viide otsimaks "
+
+#: WWW/Library/Implementation/HTWAIS.c:781
+msgid " WAIS Index.\n"
+msgstr " WAIS Indeks.\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:810
+msgid ""
+"\n"
+"Enter the 's'earch command and then specify search words.\n"
+msgstr ""
+"\n"
+"Andke ot's'ingu käsklus ja seejärel otsitavad sõnad.\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:832
+msgid " (in "
+msgstr " (baasis "
+
+#: WWW/Library/Implementation/HTWAIS.c:841
+msgid "WAIS Search of \""
+msgstr "WAIS Otsing \""
+
+#: WWW/Library/Implementation/HTWAIS.c:845
+msgid "\" in: "
+msgstr "\" baasis: "
+
+#: WWW/Library/Implementation/HTWAIS.c:860
+msgid "HTWAIS: Request too large."
+msgstr "HTWAIS: Päring on liiga suur."
+
+#: WWW/Library/Implementation/HTWAIS.c:869
+msgid "Searching WAIS database..."
+msgstr "Otsin WAIS andmebaasis..."
+
+#: WWW/Library/Implementation/HTWAIS.c:879
+msgid "Search interrupted."
+msgstr "Otsing katkestati."
+
+#: WWW/Library/Implementation/HTWAIS.c:930
+msgid "Can't convert format of WAIS document"
+msgstr "WAIS dokumendi vormingut ei õnnestu teisendada"
+
+#: WWW/Library/Implementation/HTWAIS.c:974
+msgid "HTWAIS: Request too long."
+msgstr "HTWAIS: Päring on liiga pikk."
+
+#.
+#. * Actually do the transaction given by request_message.
+#.
+#: WWW/Library/Implementation/HTWAIS.c:988
+msgid "Fetching WAIS document..."
+msgstr "Laen WAIS dokumenti..."
+
+#. display_search_response(target, retrieval_response,
+#. wais_database, keywords);
+#: WWW/Library/Implementation/HTWAIS.c:1027
+msgid "No text was returned!\n"
+msgstr "Teksti ei tagastatud!\n"
+
+#: WWW/Library/Implementation/HTWSRC.c:302
+msgid " NOT GIVEN in source file; "
+msgstr " EI ESITATUD lähtefailis; "
+
+#: WWW/Library/Implementation/HTWSRC.c:325
+msgid " WAIS source file"
+msgstr " WAIS lähtefail"
+
+#: WWW/Library/Implementation/HTWSRC.c:332
+msgid " description"
+msgstr " kirjeldus"
+
+#: WWW/Library/Implementation/HTWSRC.c:342
+msgid "Access links"
+msgstr "Kasutamise viited"
+
+#: WWW/Library/Implementation/HTWSRC.c:363
+msgid "Direct access"
+msgstr "Otsene kasutamine"
+
+#. * Proxy will be used if defined, so let user know that - FM *
+#: WWW/Library/Implementation/HTWSRC.c:366
+msgid " (or via proxy server, if defined)"
+msgstr " (või proksi serveri vahendusel, kui on defineeritud)"
+
+#: WWW/Library/Implementation/HTWSRC.c:381
+msgid "Maintainer"
+msgstr "Haldaja"
+
+#: WWW/Library/Implementation/HTWSRC.c:389
+msgid "Host"
+msgstr "Server"
+
+#: src/GridText.c:723
+msgid "Memory exhausted, display interrupted!"
+msgstr "Mälu on otsas, esitus katkestati!"
+
+#: src/GridText.c:728
+msgid "Memory exhausted, will interrupt transfer!"
+msgstr "Mälu on otsas, katkestan ülekande!"
+
+#: src/GridText.c:1719
+#, c-format
+msgid " (l%d of %d)"
+msgstr " (r%d/%d)"
+
+#: src/GridText.c:1728
+#, c-format
+msgid " (p%d of %d)"
+msgstr " (lk%d/%d)"
+
+#: src/GridText.c:3720
+msgid " *** MEMORY EXHAUSTED ***"
+msgstr " *** MÄLU ON OTSAS ***"
+
+#: src/GridText.c:6220
+msgid "text entry field"
+msgstr "teksti väli"
+
+#: src/GridText.c:6223
+msgid "password entry field"
+msgstr "parooli väli"
+
+#: src/GridText.c:6226
+msgid "checkbox"
+msgstr "märkeruut"
+
+#: src/GridText.c:6229
+msgid "radio button"
+msgstr "raadionupp"
+
+#: src/GridText.c:6232
+msgid "submit button"
+msgstr "postitamise nupp"
+
+#: src/GridText.c:6235
+msgid "reset button"
+msgstr "algväärtustamise nupp"
+
+#: src/GridText.c:6238
+msgid "script button"
+msgstr "skripti nupp"
+
+#: src/GridText.c:6241
+msgid "popup menu"
+msgstr "hüpikmenüü"
+
+#: src/GridText.c:6244
+msgid "hidden form field"
+msgstr "peidetud vormi väli"
+
+#: src/GridText.c:6247
+msgid "text entry area"
+msgstr "tekstiala"
+
+#: src/GridText.c:6250
+msgid "range entry field"
+msgstr "vahemiku väli"
+
+#: src/GridText.c:6253
+msgid "file entry field"
+msgstr "faili väli"
+
+#: src/GridText.c:6256
+msgid "text-submit field"
+msgstr "teksti postitamise väli"
+
+#: src/GridText.c:6259
+msgid "image-submit button"
+msgstr "pildi postitamise nupp"
+
+#: src/GridText.c:6262
+msgid "keygen field"
+msgstr "võtme loomise väli"
+
+#: src/GridText.c:6265
+msgid "unknown form field"
+msgstr "tundmatu vormi väli"
+
+#: src/GridText.c:6285 src/GridText.c:6292 src/LYList.c:249
+msgid "unknown field or link"
+msgstr "tundmatu väli või viide"
+
+#: src/GridText.c:10722
+msgid "Can't open file for uploading"
+msgstr "Faili ei õnnestu üleslaadimiseks avada"
+
+#: src/GridText.c:11910
+#, c-format
+msgid "Submitting %s"
+msgstr "Postitan %s"
+
+#. ugliness has happened; inform user and do the best we can
+#: src/GridText.c:12980
+msgid "Hang Detect: TextAnchor struct corrupted - suggest aborting!"
+msgstr "Tuvastati hangumine: TextAnchor struktuur on vigane - soovitan katkestada!"
+
+#. don't show previous state
+#: src/GridText.c:13139
+msgid "Wrap lines to fit displayed area?"
+msgstr "Murran read et mahtuda ekraanile?"
+
+#: src/GridText.c:13772
+msgid "Very long lines have been truncated!"
+msgstr "Väga pikad read on lõigatud!"
+
+#: src/HTAlert.c:164 src/LYShowInfo.c:389 src/LYShowInfo.c:393
+msgid "bytes"
+msgstr "baiti"
+
+#.
+#. * If we know the total size of the file, we can compute
+#. * a percentage, and show a corresponding progress bar.
+#.
+#: src/HTAlert.c:328 src/HTAlert.c:354
+#, c-format
+msgid "Read %s of data"
+msgstr "Loetud andmeid %s"
+
+#: src/HTAlert.c:351
+#, c-format
+msgid "Read %s of %s of data"
+msgstr "Loetud andmeid %s, kokku %s"
+
+#: src/HTAlert.c:360
+#, c-format
+msgid ", %s/sec"
+msgstr ", %s/sek"
+
+#: src/HTAlert.c:374
+#, c-format
+msgid " (stalled for %s)"
+msgstr " (peatunud %s)"
+
+#: src/HTAlert.c:378
+#, c-format
+msgid ", ETA %s"
+msgstr ", ELA %s"
+
+#: src/HTAlert.c:400
+msgid " (Press 'z' to abort)"
+msgstr " (Katkestamiseks vajutage 'z')"
+
+#. Meta-note: don't move the following note from its place right
+#. in front of the first gettext(). As it is now, it should
+#. automatically appear in generated lynx.pot files. - kw
+#.
+#. NOTE TO TRANSLATORS: If you provide a translation for "yes", lynx
+#. * will take the first byte of the translation as a positive response
+#. * to Yes/No questions. If you provide a translation for "no", lynx
+#. * will take the first byte of the translation as a negative response
+#. * to Yes/No questions. For both, lynx will also try to show the
+#. * first byte in the prompt as a character, instead of (y) or (n),
+#. * respectively. This will not work right for multibyte charsets!
+#. * Don't translate "yes" and "no" for CJK character sets (or translate
+#. * them to "yes" and "no"). For a translation using UTF-8, don't
+#. * translate if the translation would begin with anything but a 7-bit
+#. * (US_ASCII) character. That also means do not translate if the
+#. * translation would begin with anything but a 7-bit character, if
+#. * you use a single-byte character encoding (a charset like ISO-8859-n)
+#. * but anticipate that the message catalog may be used re-encoded in
+#. * UTF-8 form.
+#. * For translations using other character sets, you may also wish to
+#. * leave "yes" and "no" untranslated, if using (y) and (n) is the
+#. * preferred behavior.
+#. * Lynx will also accept y Y n N as responses unless there is a conflict
+#. * with the first letter of the "yes" or "no" translation.
+#.
+#: src/HTAlert.c:438 src/HTAlert.c:486
+msgid "yes"
+msgstr "jah"
+
+#: src/HTAlert.c:441 src/HTAlert.c:487
+msgid "no"
+msgstr "ei"
+
+#.
+#. * Special-purpose workaround for gettext support (we should do
+#. * this in a more general way) -TD
+#. *
+#. * NOTE TO TRANSLATORS: If the prompt has been rendered into
+#. * another language, and if yes/no are distinct, assume the
+#. * translator can make an ordered list in parentheses with one
+#. * capital letter for each as we assumed in HTConfirmDefault().
+#. * The list has to be in the same order as in the original message,
+#. * and the four capital letters chosen to not match those in the
+#. * original unless they have the same position.
+#. *
+#. * Example:
+#. * (Y/N/Always/neVer) - English (original)
+#. * (O/N/Toujours/Jamais) - French
+#.
+#: src/HTAlert.c:938
+msgid "Y/N/A/V"
+msgstr "J/E/A/M"
+
+#: src/HTML.c:5769
+msgid "Description:"
+msgstr "Kirjeldus:"
+
+#: src/HTML.c:5774
+msgid "(none)"
+msgstr "(puudub)"
+
+#: src/HTML.c:5778
+msgid "Filepath:"
+msgstr "Failitee:"
+
+#: src/HTML.c:5784
+msgid "(unknown)"
+msgstr "(tundmatu)"
+
+#: src/HTML.c:7224
+msgid "Document has only hidden links. Use the 'l'ist command."
+msgstr "Dokumendis on ainult peidetud viited. Kasuta käsklust 'l'ist."
+
+#: src/HTML.c:7725
+msgid "Source cache error - disk full?"
+msgstr "Lähtefaili puhvri viga - ketas on täis?"
+
+#: src/HTML.c:7738
+msgid "Source cache error - not enough memory!"
+msgstr "Lähtefaili puhvri viga - mälu on otsas?"
+
+#: src/LYBookmark.c:167
+msgid ""
+" This file is an HTML representation of the X Mosaic hotlist file.\n"
+" Outdated or invalid links may be removed by using the\n"
+" remove bookmark command, it is usually the 'R' key but may have\n"
+" been remapped by you or your system administrator."
+msgstr ""
+" See fail on HTML esitus X Mosaic hotlist failist. Aegunud või\n"
+" vigased viited saab eemaldada eemalda järg käsklusega, mis \n"
+" käivitatakse tavaliselt vajutades klahvile 'R'. 'R' võib olla\n"
+" ka teie süsteemi administraatori poolt ümber määratud."
+
+#: src/LYBookmark.c:380
+#, c-format
+msgid ""
+" You can delete links by the 'R' key<br>\n"
+"<ol>\n"
+msgstr ""
+" Viiteid saate kustutada klahviga 'R'<br>\n"
+"<ol>\n"
+
+#: src/LYBookmark.c:383
+msgid ""
+" You can delete links using the remove bookmark command. It is usually\n"
+" the 'R' key but may have been remapped by you or your system\n"
+" administrator."
+msgstr ""
+" Viiteid saate eemaldada kasutades eemalda järg käsklust. See on\n"
+" tavaliselt klahv 'R', aga võib olla ka ümber määratud teie enda\n"
+" või teie süsteemi administraatori poolt."
+
+#: src/LYBookmark.c:387
+msgid ""
+" This file also may be edited with a standard text editor to delete\n"
+" outdated or invalid links, or to change their order."
+msgstr ""
+" Selle faili muutmiseks, näiteks aegunud viidete eemaldamiseks\n"
+" või viidete järjekorra muutmiseks, võib kasutada ka tavalist\n"
+" tekstitoimetit."
+
+#: src/LYBookmark.c:390
+msgid ""
+"Note: if you edit this file manually\n"
+" you should not change the format within the lines\n"
+" or add other HTML markup.\n"
+" Make sure any bookmark link is saved as a single line."
+msgstr ""
+"Märkus: kui te muudate seda faili käsitsi, ei tohiks te\n"
+" muuta ridade vormingut ega lisada HTML konstruktsioone.\n"
+" Kontrollige, et järjed oleksid salvestatud ühe reana."
+
+#: src/LYBookmark.c:686
+#, c-format
+msgid "File may be recoverable from %s during this session"
+msgstr "Fail võib selle sessiooni jooksul olla taastatav failist %s"
+
+#: src/LYCgi.c:161
+#, c-format
+msgid "Do you want to execute \"%s\"?"
+msgstr "Kas soovite \"%s\" käivitada?"
+
+#.
+#. * Neither the path as given nor any components examined by backing up
+#. * were stat()able. - kw
+#.
+#: src/LYCgi.c:276
+msgid "Unable to access cgi script"
+msgstr "Cgi skripti ei saa kasutada"
+
+#: src/LYCgi.c:709 src/LYCgi.c:712
+msgid "Good Advice"
+msgstr "Hea soovitus"
+
+#: src/LYCgi.c:716
+msgid "An excellent http server for VMS is available via"
+msgstr "Suurepärane http server VMS süsteemile on saadav"
+
+#: src/LYCgi.c:723
+msgid "this link"
+msgstr "sellelt viitelt"
+
+#: src/LYCgi.c:727
+msgid "It provides state of the art CGI script support.\n"
+msgstr "See pakub korralikku CGI skriptide tuge.\n"
+
+#: src/LYClean.c:115
+msgid "Exiting via interrupt:"
+msgstr "Lõpetan katkestuse tõttu:"
+
+#: src/LYCookie.c:2651
+msgid "(from a previous session)"
+msgstr "(eelmisest sessioonist)"
+
+#: src/LYCookie.c:2712
+msgid "Maximum Gobble Date:"
+msgstr "Maksimaalne söömise aeg: "
+
+#: src/LYCookie.c:2751
+msgid "Internal"
+msgstr "Sisemine"
+
+#: src/LYCookie.c:2752
+msgid "cookie_domain_flag_set error, aborting program"
+msgstr "cookie_domain_flag_set viga, katkestan programmi töö"
+
+#: src/LYCurses.c:1136
+msgid "Terminal reinitialisation failed - unknown terminal type?"
+msgstr "Terminali uuesti initsialiseerimine ebaõnnestus - tundmatu terminali tüüp?"
+
+#: src/LYCurses.c:1343
+msgid "Terminal initialisation failed - unknown terminal type?"
+msgstr "Terminali initsialiseerimine ebaõnnestus - tundmatu terminali tüüp?"
+
+#: src/LYCurses.c:1837
+msgid "Terminal ="
+msgstr "Terminal ="
+
+#: src/LYCurses.c:1841
+msgid "You must use a vt100, 200, etc. terminal with this program."
+msgstr "Selle programmiga peate kasutama vt100, 200 vms terminali."
+
+#: src/LYCurses.c:1890
+msgid "Your Terminal type is unknown!"
+msgstr "Teie terminali tüüp on tundmatu!"
+
+#: src/LYCurses.c:1891
+msgid "Enter a terminal type:"
+msgstr "Sisestage terminali tüüp:"
+
+#: src/LYCurses.c:1905
+msgid "TERMINAL TYPE IS SET TO"
+msgstr "TERMINALI TÜÜBIKS ON SEATUD"
+
+#: src/LYCurses.c:2464
+#, c-format
+msgid ""
+"\n"
+"A Fatal error has occurred in %s Ver. %s\n"
+msgstr ""
+"\n"
+"Fataalne viga tekkis programmis %s Ver. %s\n"
+
+#: src/LYCurses.c:2467
+#, c-format
+msgid ""
+"\n"
+"Please notify your system administrator to confirm a bug, and if\n"
+"confirmed, to notify the lynx-dev list. Bug reports should have concise\n"
+"descriptions of the command and/or URL which causes the problem, the\n"
+"operating system name with version number, the TCPIP implementation, the\n"
+"TRACEBACK if it can be captured, and any other relevant information.\n"
+msgstr ""
+"\n"
+"Palun teavitage oma süsteemi administraatorit, et ta kinnitaks viga\n"
+"ja kui vea olemasolu on kindel, teavitaks lynx-dev postiloendit.\n"
+"Vearaport peab olema lakooniline kirjeldus käskidest ja/või URList,\n"
+"mis vea põhjustas, operatsioonisüsteemi nimi ja versiooni number,\n"
+"info TCPIP realisatsioonist ja muu asjakohane info.\n"
+
+#: src/LYEdit.c:272
+#, c-format
+msgid "Error starting editor, %s"
+msgstr "Viga tekstitoimeti käivitamisel, %s"
+
+#: src/LYEdit.c:275
+msgid "Editor killed by signal"
+msgstr "Toimeti tapeti signaaliga"
+
+#: src/LYEdit.c:280
+#, c-format
+msgid "Editor returned with error status %s"
+msgstr "Toimeti lõpetas veakoodiga %s"
+
+#: src/LYDownload.c:511
+msgid "Downloaded link:"
+msgstr "Laetud viide:"
+
+#: src/LYDownload.c:516
+msgid "Suggested file name:"
+msgstr "Soovitatav faili nimi:"
+
+#: src/LYDownload.c:521
+msgid "Standard download options:"
+msgstr "Standardsed allalaadimise võimalused:"
+
+#: src/LYDownload.c:522
+msgid "Download options:"
+msgstr "Allalaadimise võimalused:"
+
+#: src/LYDownload.c:538
+msgid "Save to disk"
+msgstr "Salvesta kettale"
+
+#: src/LYDownload.c:552
+msgid "View temporary file"
+msgstr "Vaata ajutist faili"
+
+#: src/LYDownload.c:559
+msgid "Save to disk disabled."
+msgstr "Kettale salvestamine blokeeritud"
+
+#: src/LYDownload.c:563 src/LYPrint.c:1331
+msgid "Local additions:"
+msgstr "Lokaalsed lisad:"
+
+#: src/LYDownload.c:574 src/LYUpload.c:206
+msgid "No Name Given"
+msgstr "Nimi puudub"
+
+#: src/LYHistory.c:673
+msgid "You selected:"
+msgstr "Teie valik:"
+
+#: src/LYHistory.c:697 src/LYHistory.c:926
+msgid "(no address)"
+msgstr "(aadress puudub)"
+
+#: src/LYHistory.c:701
+msgid " (internal)"
+msgstr " (sisemine)"
+
+#: src/LYHistory.c:703
+msgid " (was internal)"
+msgstr " (oli sisemine)"
+
+#: src/LYHistory.c:801
+msgid " (From History)"
+msgstr " (Ajaloost)"
+
+#: src/LYHistory.c:846
+msgid "You visited (POSTs, bookmark, menu and list files excluded):"
+msgstr "Teie külastused (v.a. POST, järjed, menüü ja listingu failid):"
+
+#: src/LYHistory.c:1148
+msgid "(No messages yet)"
+msgstr "(Teateid pole veel)"
+
+#: src/LYLeaks.c:222
+msgid "Invalid pointer detected."
+msgstr "Tuvastati vigane viit."
+
+#: src/LYLeaks.c:224 src/LYLeaks.c:262
+msgid "Sequence:"
+msgstr "Järjend:"
+
+#: src/LYLeaks.c:227 src/LYLeaks.c:265
+msgid "Pointer:"
+msgstr "Viit:"
+
+#: src/LYLeaks.c:236 src/LYLeaks.c:243 src/LYLeaks.c:284
+msgid "FileName:"
+msgstr "Failinimi:"
+
+#: src/LYLeaks.c:239 src/LYLeaks.c:246 src/LYLeaks.c:287 src/LYLeaks.c:298
+msgid "LineCount:"
+msgstr "Ridu:"
+
+#: src/LYLeaks.c:260
+msgid "Memory leak detected."
+msgstr "Tuvastasin mälulekke."
+
+#: src/LYLeaks.c:268
+msgid "Contains:"
+msgstr "Sisaldab:"
+
+#: src/LYLeaks.c:281
+msgid "ByteSize:"
+msgstr "Maht:"
+
+#: src/LYLeaks.c:295
+msgid "realloced:"
+msgstr "uuesti võetud:"
+
+#: src/LYLeaks.c:316
+msgid "Total memory leakage this run:"
+msgstr "Mälulekkeid selles sessioonis kokku:"
+
+#: src/LYLeaks.c:320
+msgid "Peak allocation"
+msgstr "Mäluhaaramiste tipp"
+
+#: src/LYLeaks.c:322
+msgid "Bytes allocated"
+msgstr "Baiti võetud"
+
+#: src/LYLeaks.c:324
+msgid "Total mallocs"
+msgstr "Kokku malloc kasutamisi"
+
+#: src/LYLeaks.c:326
+msgid "Total frees"
+msgstr "Vabastamisi kokku"
+
+#: src/LYList.c:89
+msgid "References in "
+msgstr "Viited lehel "
+
+#: src/LYList.c:92
+msgid "this document:"
+msgstr "see dokument:"
+
+#: src/LYList.c:98 src/LYList.c:363
+msgid "Visible links:"
+msgstr "Nähtavad viited:"
+
+#: src/LYList.c:202 src/LYList.c:322
+msgid "Hidden links:"
+msgstr "Peidetud viited:"
+
+#: src/LYList.c:359
+msgid "References"
+msgstr "Viited"
+
+#: src/LYLocal.c:289
+#, c-format
+msgid "Unable to get status of '%s'."
+msgstr "Ei õnnestu lugeda '%s' olekut."
+
+#: src/LYLocal.c:354
+msgid "The selected item is not a file or a directory! Request ignored."
+msgstr "Valik ei ole fail ega kataloog! Ignoreerin päringut."
+
+#: src/LYLocal.c:456
+#, c-format
+msgid "Unable to %s due to system error!"
+msgstr "Süsteemi vea tõttu ei õnnestu %s!"
+
+#: src/LYLocal.c:490
+#, c-format
+msgid "Probable failure to %s due to system error!"
+msgstr "Ilmselt %s viga süsteemi vea tõttu!"
+
+#: src/LYLocal.c:555 src/LYLocal.c:578
+#, c-format
+msgid "remove %s"
+msgstr "eemalda %s"
+
+#: src/LYLocal.c:598
+#, c-format
+msgid "touch %s"
+msgstr "puuduta %s"
+
+#: src/LYLocal.c:628
+#, c-format
+msgid "move %s to %s"
+msgstr "tõstan %s -> %s"
+
+#: src/LYLocal.c:676
+msgid "There is already a directory with that name! Request ignored."
+msgstr "Sellise nimega kataloog on juba olemas! Ignoreerin päringut."
+
+#: src/LYLocal.c:678
+msgid "There is already a file with that name! Request ignored."
+msgstr "Sellise nimega fail on juba olemas! Ignoreerin päringut."
+
+#: src/LYLocal.c:680
+msgid "The specified name is already in use! Request ignored."
+msgstr "Antud nimi on juba kasutusel! Ignoreerin päringut."
+
+#: src/LYLocal.c:692
+msgid "Destination has different owner! Request denied."
+msgstr "Sihtkohal on teine omanik! Keeldun päringut täitmast."
+
+#: src/LYLocal.c:695
+msgid "Destination is not a valid directory! Request denied."
+msgstr "Sihtkoht ei ole lubatud kataloog! Keeldun päringut täitmast."
+
+#: src/LYLocal.c:711
+msgid "Source and destination are the same location! Request ignored!"
+msgstr "Allikas ja sihtkoht on samad! Ignoreerin päringut!"
+
+#: src/LYLocal.c:735
+msgid "Remove all tagged files and directories?"
+msgstr "Eemaldan kõik märgitud failid ja kataloogid?"
+
+#: src/LYLocal.c:808
+msgid "Enter new location for tagged items: "
+msgstr "Sisestage valitud elementidele uus asukoht: "
+
+#: src/LYLocal.c:906
+msgid "Enter new name for directory: "
+msgstr "Sisestage kataloogi uus nimi: "
+
+#: src/LYLocal.c:908
+msgid "Enter new name for file: "
+msgstr "Sisestage faili uus nimi: "
+
+#: src/LYLocal.c:920
+msgid "Illegal character (path-separator) found! Request ignored."
+msgstr "Leiti lubamatu sümbol (tee eraldaja)! Päringut ignoreeritakse."
+
+#: src/LYLocal.c:970
+msgid "Enter new location for directory: "
+msgstr "Sisestage kataloogi uus asukoht: "
+
+#: src/LYLocal.c:972
+msgid "Enter new location for file: "
+msgstr "Sisestage faili uus asukoht: "
+
+#: src/LYLocal.c:999
+msgid "Unexpected failure - unable to find trailing path separator"
+msgstr "Ootamatu tõrge - ei leia lõpust tee eraldajat"
+
+#: src/LYLocal.c:1061
+msgid "Modify name, location, or permission (n, l, or p): "
+msgstr "Muuda nime, asukohta või õiguseid (n, l või p): "
+
+#: src/LYLocal.c:1063
+msgid "Modify name or location (n or l): "
+msgstr "Muuda nime või asukohta (n või l): "
+
+#.
+#. * Code for changing ownership needed here.
+#.
+#: src/LYLocal.c:1092
+msgid "This feature not yet implemented!"
+msgstr "Seda omadust ei ole veel realiseeritud!"
+
+#: src/LYLocal.c:1113
+msgid "Enter name of file to create: "
+msgstr "Sisestage loodavale failile nimi: "
+
+#: src/LYLocal.c:1116 src/LYLocal.c:1153
+msgid "Illegal redirection \"//\" found! Request ignored."
+msgstr "Leiti vigane ümbersuunamine \"//\"! Ignoreerin päringut."
+
+#: src/LYLocal.c:1150
+msgid "Enter name for new directory: "
+msgstr "Sisestage nimi uuele kataloogile: "
+
+#: src/LYLocal.c:1191
+msgid "Create file or directory (f or d): "
+msgstr "Luua fail või kataloog (f või d): "
+
+#: src/LYLocal.c:1233
+#, c-format
+msgid "Remove directory '%s'?"
+msgstr "Kustutan kataloogi '%s'?"
+
+#: src/LYLocal.c:1236
+msgid "Remove directory?"
+msgstr "Kustutan kataloogi?"
+
+#: src/LYLocal.c:1241
+#, c-format
+msgid "Remove file '%s'?"
+msgstr "Eemaldan faili '%s'?"
+
+#: src/LYLocal.c:1243
+msgid "Remove file?"
+msgstr "Eemaldan faili?"
+
+#: src/LYLocal.c:1248
+#, c-format
+msgid "Remove symbolic link '%s'?"
+msgstr "Eemaldan nimeviite '%s'?"
+
+#: src/LYLocal.c:1250
+msgid "Remove symbolic link?"
+msgstr "Eemaldan nimeviite?"
+
+#: src/LYLocal.c:1348
+msgid "Sorry, don't know how to permit non-UNIX files yet."
+msgstr "Vabandust, ma ei tea veel, kuidas sedada mitte-UNIX failide õiguseid."
+
+#: src/LYLocal.c:1377
+msgid "Unable to open permit options file"
+msgstr "Õiguste seadete faili avamine ebaõnnestus"
+
+#: src/LYLocal.c:1405
+msgid "Specify permissions below:"
+msgstr "Määrake õigused allpool:"
+
+#: src/LYLocal.c:1406 src/LYShowInfo.c:291
+msgid "Owner:"
+msgstr "Omanik:"
+
+#: src/LYLocal.c:1422
+msgid "Group"
+msgstr "Grupp:"
+
+#: src/LYLocal.c:1438
+msgid "Others:"
+msgstr "Ülejäänud:"
+
+#: src/LYLocal.c:1456
+msgid "form to permit"
+msgstr "vorm seadmaks õiguseid"
+
+#: src/LYLocal.c:1552
+msgid "Invalid mode format."
+msgstr "Vigane moodi formaat."
+
+#: src/LYLocal.c:1556
+msgid "Invalid syntax format."
+msgstr "Vigane süntaksi formaat."
+
+#: src/LYLocal.c:1743
+msgid "Warning! UUDecoded file will exist in the directory you started Lynx."
+msgstr "Hoiatus! UUdekodeeritud fail luuakse kataloogi, kus Lynx käivitati."
+
+#: src/LYLocal.c:1933
+msgid "NULL URL pointer"
+msgstr "NULL URL viit"
+
+#: src/LYLocal.c:2015
+#, c-format
+msgid "Executing %s "
+msgstr "Täidan %s "
+
+#: src/LYLocal.c:2018
+msgid "Executing system command. This might take a while."
+msgstr "Täidan süsteemse käsu. See võib kesta mõne aja."
+
+#: src/LYLocal.c:2092
+msgid "Current directory:"
+msgstr "Jooksev kataloog:"
+
+#: src/LYLocal.c:2095 src/LYLocal.c:2113
+msgid "Current selection:"
+msgstr "Praegune valik:"
+
+#: src/LYLocal.c:2099
+msgid "Nothing currently selected."
+msgstr "Midagi ei ole valitud."
+
+#: src/LYLocal.c:2115
+msgid "tagged item:"
+msgstr "märgitud element:"
+
+#: src/LYLocal.c:2116
+msgid "tagged items:"
+msgstr "märgitud elemendid:"
+
+#: src/LYLocal.c:2216 src/LYLocal.c:2225
+msgid "Illegal filename; request ignored."
+msgstr "Vigane failinimi; ignoreerin päringut."
+
+#. directory not writable
+#: src/LYLocal.c:2323 src/LYLocal.c:2382
+msgid "Install in the selected directory not permitted."
+msgstr "Valitud kataloogi ei ole lubatud installeerida."
+
+#: src/LYLocal.c:2378
+msgid "The selected item is not a directory! Request ignored."
+msgstr "Valik ei ole kataloog! Ignoreerin päringut."
+
+#: src/LYLocal.c:2387
+msgid "Just a moment, ..."
+msgstr "Ãœks hetk, ..."
+
+#: src/LYLocal.c:2404
+msgid "Error building install args"
+msgstr "Viga installi argumentide koostamisel"
+
+#: src/LYLocal.c:2419 src/LYLocal.c:2450
+#, c-format
+msgid "Source and target are the same: %s"
+msgstr "Lähte ja sihtkoht on samad: %s"
+
+#: src/LYLocal.c:2426 src/LYLocal.c:2457
+#, c-format
+msgid "Already in target directory: %s"
+msgstr "On juba sihtkataloogis: %s"
+
+#: src/LYLocal.c:2475
+msgid "Installation complete"
+msgstr "Installeerimine on valmis"
+
+#: src/LYLocal.c:2678
+msgid "Temporary URL or list would be too long."
+msgstr "Ajutine URL või loend oleks liiga pikk."
+
+#: src/LYMail.c:566
+msgid "Sending"
+msgstr "Saadan"
+
+#: src/LYMail.c:1050
+#, c-format
+msgid "The link %s :?: %s \n"
+msgstr "Viide %s :?: %s \n"
+
+#: src/LYMail.c:1052
+#, c-format
+msgid "called \"%s\"\n"
+msgstr "nimega \"%s\"\n"
+
+#: src/LYMail.c:1053
+#, c-format
+msgid "in the file \"%s\" called \"%s\"\n"
+msgstr "failis \"%s\" nimega \"%s\"\n"
+
+#: src/LYMail.c:1054
+msgid "was requested but was not available."
+msgstr "sooviti, aga ei ole kasutatav."
+
+#: src/LYMail.c:1055
+msgid "Thought you might want to know."
+msgstr "Ma arvasin, et te sooviksite seda teada."
+
+#: src/LYMail.c:1057
+msgid "This message was automatically generated by"
+msgstr "See teade on automaatselt loodud"
+
+#: src/LYMail.c:1770
+msgid "No system mailer configured"
+msgstr "Süsteemset e-posti programmi ei ole seadistatud"
+
+#: src/LYMain.c:1095
+msgid "No Winsock found, sorry."
+msgstr "Winsock puudub, kahju."
+
+#: src/LYMain.c:1285
+msgid "You MUST define a valid TMP or TEMP area!"
+msgstr "Te PEATE defineerima kehtiva TMP või TEMP piirkonna!"
+
+#: src/LYMain.c:1338 src/LYMainLoop.c:5285
+msgid "No such directory"
+msgstr "Sellist kataloogi ei ole"
+
+#: src/LYMain.c:1532
+#, c-format
+msgid ""
+"\n"
+"Configuration file \"%s\" is not available.\n"
+"\n"
+msgstr ""
+"\n"
+"Seadete faili \"%s\" ei ole.\n"
+"\n"
+
+#: src/LYMain.c:1542
+#, c-format
+msgid ""
+"\n"
+"Lynx character sets not declared.\n"
+"\n"
+msgstr ""
+"\n"
+"Lynx kooditabeleid ei ole deklareeritud.\n"
+"\n"
+
+#: src/LYMain.c:1698
+#, c-format
+msgid "Ignored %d characters from standard input.\n"
+msgstr "Ignoreerisin %d sümbolit standard sisendist.\n"
+
+#: src/LYMain.c:1700
+#, c-format
+msgid "Use \"-stdin\" or \"-\" to tell how to handle piped input.\n"
+msgstr "Toruga suunatud sisendi määramiseks kasutage \"-stdin\" või \"-\".\n"
+
+#: src/LYMain.c:1858
+msgid "Warning:"
+msgstr "Hoiatus:"
+
+#: src/LYMain.c:2426
+msgid "persistent cookies state will be changed in next session only."
+msgstr "püsivate präänikute olekut muudetakse alles järgmise sessiooniga."
+
+#: src/LYMain.c:2661 src/LYMain.c:2705
+#, c-format
+msgid "Lynx: ignoring unrecognized charset=%s\n"
+msgstr "Lynx: ignoreerin tundmatut kooditabelit %s\n"
+
+#: src/LYMain.c:3222
+#, c-format
+msgid "%s Version %s (%s)"
+msgstr "%s Versioon %s (%s)"
+
+#: src/LYMain.c:3263
+#, c-format
+msgid "Built on %s%s.\n"
+msgstr "Ehitatud %s%s.\n"
+
+#: src/LYMain.c:3277
+msgid "Copyrights held by the Lynx Developers Group,"
+msgstr "Autoriõiguseid hoiavad Lynx Developers Group,"
+
+#: src/LYMain.c:3278
+msgid "the University of Kansas, CERN, and other contributors."
+msgstr "University of Kansas, CERN ja teised."
+
+#: src/LYMain.c:3279
+msgid "Distributed under the GNU General Public License (Version 2)."
+msgstr "Levitatakse GNU üldise avaliku litsensiga (Versioon 2)."
+
+#: src/LYMain.c:3280
+msgid "See https://lynx.invisible-island.net/ and the online help for more information."
+msgstr "Abi ja muud infot leiate aadressil https://lynx.invisible-island.net/."
+
+#: src/LYMain.c:4139
+#, c-format
+msgid "USAGE: %s [options] [file]\n"
+msgstr "KASUTAMINE: %s [võtmed] [fail]\n"
+
+#: src/LYMain.c:4140
+#, c-format
+msgid "Options are:\n"
+msgstr "Võtmed on:\n"
+
+#: src/LYMain.c:4443
+#, c-format
+msgid "%s: Invalid Option: %s\n"
+msgstr "%s: Vigane võti: %s\n"
+
+#: src/LYMainLoop.c:572
+#, c-format
+msgid "Internal error: Invalid mouse link %d!"
+msgstr "Sisemine viga: Vigane hiire viide %d!"
+
+#: src/LYMainLoop.c:693 src/LYMainLoop.c:5307
+msgid "A URL specified by the user"
+msgstr "Kasutaja poolt antud URL"
+
+#: src/LYMainLoop.c:1142
+msgid "Enctype multipart/form-data not yet supported! Cannot submit."
+msgstr "multipart/form-data kodeering ei ole veel toetatud! Ei saa saata."
+
+#.
+#. * Make a name for this help file.
+#.
+#: src/LYMainLoop.c:3197
+msgid "Help Screen"
+msgstr "Abiinfo ekraan"
+
+#: src/LYMainLoop.c:3328
+msgid "System Index"
+msgstr "Süsteemi indeks"
+
+#: src/LYMainLoop.c:3577
+#, c-format
+msgid "Query parameter %d: "
+msgstr "Päringu parameeter %d: "
+
+#: src/LYMainLoop.c:3806 src/LYMainLoop.c:5583
+msgid "Entry into main screen"
+msgstr "Sisenemine põhiekraanile"
+
+#: src/LYMainLoop.c:4064
+msgid "No next document present"
+msgstr "Järgmist dokumenti pole"
+
+#: src/LYMainLoop.c:4359
+msgid "charset for this document specified explicitly, sorry..."
+msgstr "kahjuks on selle dokumendi kooditabel üheselt määratud..."
+
+#: src/LYMainLoop.c:5265
+msgid "cd to:"
+msgstr "mine kataloogi:"
+
+#: src/LYMainLoop.c:5288
+msgid "A component of path is not a directory"
+msgstr "Tee komponent ei ole kataloog"
+
+#: src/LYMainLoop.c:5291
+msgid "failed to change directory"
+msgstr "kataloogi ei õnnestu vahetada"
+
+#: src/LYMainLoop.c:6517
+msgid "Reparsing document under current settings..."
+msgstr "Parsin dokumendi uuesti jooksvate seadetega..."
+
+#: src/LYMainLoop.c:6811
+#, c-format
+msgid "Fatal error - could not open output file %s\n"
+msgstr "Fataalne viga - ei õnnestu avada väljundfaili %s\n"
+
+#: src/LYMainLoop.c:7153
+msgid "TABLE center enable."
+msgstr "TABELI tsentreerimine lubatud."
+
+#: src/LYMainLoop.c:7156
+msgid "TABLE center disable."
+msgstr "TABELI tsentreerimine blokeeritud."
+
+#: src/LYMainLoop.c:7236
+msgid "Current URL is empty."
+msgstr "Jooksev URL on tühi."
+
+#: src/LYMainLoop.c:7238 src/LYUtils.c:1909
+msgid "Copy to clipboard failed."
+msgstr "Lõikepuhvrisse kopeerimine ebaõnnestus."
+
+#: src/LYMainLoop.c:7240
+msgid "Document URL put to clipboard."
+msgstr "Panin dokumendi URLi lõikepuhvrisse."
+
+#: src/LYMainLoop.c:7242
+msgid "Link URL put to clipboard."
+msgstr "Panin viite URLi lõikepuhvrisse."
+
+#: src/LYMainLoop.c:7269
+msgid "No URL in the clipboard."
+msgstr "Lõikepuhvris URLe ei ole."
+
+#: src/LYMainLoop.c:7962 src/LYMainLoop.c:8133
+msgid "-index-"
+msgstr "-indeks-"
+
+#: src/LYMainLoop.c:8071
+msgid "lynx: Can't access startfile"
+msgstr "lynx: Ei õnnestu laadida esilehte"
+
+#: src/LYMainLoop.c:8083
+msgid "lynx: Start file could not be found or is not text/html or text/plain"
+msgstr "lynx: Esilehte pole või ei ole text/html ega text/plain tüüpi"
+
+#: src/LYMainLoop.c:8084
+msgid " Exiting..."
+msgstr " Lõpetan..."
+
+#: src/LYMainLoop.c:8127
+msgid "-more-"
+msgstr "-veel-"
+
+#. Enable scrolling.
+#: src/LYNews.c:186
+msgid "You will be posting to:"
+msgstr "Te postitate gruppi:"
+
+#.
+#. * Get the mail address for the From header, offering personal_mail_address
+#. * as default.
+#.
+#: src/LYNews.c:195
+msgid ""
+"\n"
+"\n"
+" Please provide your mail address for the From: header\n"
+msgstr ""
+"\n"
+"\n"
+" Palun teie aadress From: päisesse\n"
+
+#.
+#. * Get the Subject header, offering the current document's title as the
+#. * default if this is a followup rather than a new post. - FM
+#.
+#: src/LYNews.c:212
+msgid ""
+"\n"
+"\n"
+" Please provide or edit the Subject: header\n"
+msgstr ""
+"\n"
+"\n"
+" Palun lisage või muutke teema Subject: päises\n"
+
+#: src/LYNews.c:302
+msgid ""
+"\n"
+"\n"
+" Please provide or edit the Organization: header\n"
+msgstr ""
+"\n"
+"\n"
+" Palun lisage või muutke Organization: päises\n"
+
+#.
+#. * Use the built in line editior.
+#.
+#: src/LYNews.c:359
+msgid ""
+"\n"
+"\n"
+" Please enter your message below."
+msgstr ""
+"\n"
+"\n"
+" Palun sisestage oma teade."
+
+#: src/LYNews.c:405
+msgid "Message has no original text!"
+msgstr "Teatel puudub algne tekst!"
+
+#: src/LYOptions.c:774
+msgid "review/edit B)ookmarks files"
+msgstr "vaara/toimeta B=järgede faile"
+
+#: src/LYOptions.c:776
+msgid "B)ookmark file: "
+msgstr "B=järgede fail: "
+
+#: src/LYOptions.c:2131 src/LYOptions.c:2138
+msgid "ON"
+msgstr "SEES"
+
+#. verbose_img variable
+#. LYCollapseBRs variable
+#. LYtrimBlankLines variable
+#: src/LYOptions.c:2132 src/LYOptions.c:2137 src/LYOptions.c:2321
+#: src/LYOptions.c:2330 src/LYOptions.c:2339 src/LYOptions.c:2350
+msgid "OFF"
+msgstr "VÄLJAS"
+
+#: src/LYOptions.c:2133
+msgid "NEVER"
+msgstr "MITTE KUNAGI"
+
+#: src/LYOptions.c:2134
+msgid "ALWAYS"
+msgstr "ALATI"
+
+#: src/LYOptions.c:2150 src/LYOptions.c:2313
+msgid "ignore"
+msgstr "ignoreeri"
+
+#: src/LYOptions.c:2151
+msgid "ask user"
+msgstr "küsi kasutajalt"
+
+#: src/LYOptions.c:2152
+msgid "accept all"
+msgstr "luba kõik"
+
+#: src/LYOptions.c:2164
+msgid "ALWAYS OFF"
+msgstr "ALATI VÄLJAS"
+
+#: src/LYOptions.c:2165
+msgid "FOR LOCAL FILES ONLY"
+msgstr "AINULT KOHALIKELE FAILIDELE"
+
+#: src/LYOptions.c:2167
+msgid "ALWAYS ON"
+msgstr "ALATI SEES"
+
+#: src/LYOptions.c:2179
+msgid "Numbers act as arrows"
+msgstr "numbrid käituvad nooltena"
+
+#: src/LYOptions.c:2181
+msgid "Links are numbered"
+msgstr "Viited on nummerdatud"
+
+#: src/LYOptions.c:2184
+msgid "Links and form fields are numbered"
+msgstr "Viited ja vormide väljad on nummerdatud"
+
+#: src/LYOptions.c:2187
+msgid "Form fields are numbered"
+msgstr "Vormide väljad on nummerdatud"
+
+#: src/LYOptions.c:2202
+msgid "Case insensitive"
+msgstr "Tõstutundetu"
+
+#: src/LYOptions.c:2203
+msgid "Case sensitive"
+msgstr "Tõstutundlik"
+
+#: src/LYOptions.c:2237
+msgid "prompt normally"
+msgstr "küsi tavapäraselt"
+
+#: src/LYOptions.c:2238
+msgid "force yes-response"
+msgstr "paku jah-vastus"
+
+#: src/LYOptions.c:2239
+msgid "force no-response"
+msgstr "paku ei-vastus"
+
+#: src/LYOptions.c:2249
+msgid "RFC 2109"
+msgstr "RFC 2109"
+
+#: src/LYOptions.c:2250
+msgid "RFC 2965"
+msgstr "RFC 2965"
+
+#: src/LYOptions.c:2251
+msgid "RFC 6265"
+msgstr "RFC 6265"
+
+#: src/LYOptions.c:2268
+msgid "Novice"
+msgstr "Algaja"
+
+#: src/LYOptions.c:2269
+msgid "Intermediate"
+msgstr "Vahepealne"
+
+#: src/LYOptions.c:2270
+msgid "Advanced"
+msgstr "Edasijõudnud"
+
+#: src/LYOptions.c:2279
+msgid "By First Visit"
+msgstr "Esmase külastuse järgi"
+
+#: src/LYOptions.c:2281
+msgid "By First Visit Reversed"
+msgstr "Pööratud esmase külastuse järgi"
+
+#: src/LYOptions.c:2282
+msgid "As Visit Tree"
+msgstr "Külastuste puu"
+
+#: src/LYOptions.c:2283
+msgid "By Last Visit"
+msgstr "Viimase külastuse järgi"
+
+#: src/LYOptions.c:2285
+msgid "By Last Visit Reversed"
+msgstr "Pööratud viimase külastuse järgi"
+
+#. Old_DTD variable
+#: src/LYOptions.c:2296
+msgid "relaxed (TagSoup mode)"
+msgstr "lõtv (TagSoup mood)"
+
+#: src/LYOptions.c:2297
+msgid "strict (SortaSGML mode)"
+msgstr "range (SortaSGML mood)"
+
+#: src/LYOptions.c:2304
+msgid "Ignore"
+msgstr "Ignoreeri"
+
+#: src/LYOptions.c:2305
+msgid "Add to trace-file"
+msgstr "Lisa trasseerimise faili"
+
+#: src/LYOptions.c:2306
+msgid "Add to LYNXMESSAGES"
+msgstr "Lisa LYNXMESSAGES"
+
+#: src/LYOptions.c:2307
+msgid "Warn, point to trace-file"
+msgstr "Hoiatus, osutab trasserimise failile"
+
+#: src/LYOptions.c:2314
+msgid "as labels"
+msgstr "kui märgendid"
+
+#: src/LYOptions.c:2315
+msgid "as links"
+msgstr "kui viited"
+
+#: src/LYOptions.c:2322
+msgid "show filename"
+msgstr "näita failinime"
+
+#: src/LYOptions.c:2331
+msgid "collapse"
+msgstr "kollaps"
+
+#: src/LYOptions.c:2340
+msgid "trim-lines"
+msgstr "vähenda-ridu"
+
+#: src/LYOptions.c:2351
+msgid "STANDARD"
+msgstr "STANDARD"
+
+#: src/LYOptions.c:2352
+msgid "ADVANCED"
+msgstr "LAIENDATUD"
+
+#: src/LYOptions.c:2374
+msgid "IDNA 2003"
+msgstr "IDNA 2003"
+
+#: src/LYOptions.c:2375
+msgid "IDNA 2008"
+msgstr "IDNA 2008"
+
+#: src/LYOptions.c:2376
+msgid "IDNA TR46"
+msgstr "IDNA TR46"
+
+#: src/LYOptions.c:2377
+msgid "IDNA Compatible"
+msgstr "IDNA Ãœhilduv"
+
+#: src/LYOptions.c:2398
+msgid "Directories first"
+msgstr "Esmalt kataloogid"
+
+#: src/LYOptions.c:2399
+msgid "Files first"
+msgstr "Esimalt failid"
+
+#: src/LYOptions.c:2400
+msgid "Mixed style"
+msgstr "Segastiil"
+
+#: src/LYOptions.c:2408 src/LYOptions.c:2428
+msgid "By Name"
+msgstr "Nime järgi"
+
+#: src/LYOptions.c:2409 src/LYOptions.c:2429
+msgid "By Type"
+msgstr "Tüübi järgi"
+
+#: src/LYOptions.c:2410 src/LYOptions.c:2430
+msgid "By Size"
+msgstr "Mahu järgi"
+
+#: src/LYOptions.c:2411 src/LYOptions.c:2431
+msgid "By Date"
+msgstr "Kuupäeva järgi"
+
+#: src/LYOptions.c:2412
+msgid "By Mode"
+msgstr "moodi järgi"
+
+#: src/LYOptions.c:2414
+msgid "By User"
+msgstr "Kasutaja järgi"
+
+#: src/LYOptions.c:2415
+msgid "By Group"
+msgstr "Grupi järgi"
+
+#: src/LYOptions.c:2440
+msgid "Do not show rate"
+msgstr "Ära näita kiirust"
+
+#: src/LYOptions.c:2441 src/LYOptions.c:2442
+#, c-format
+msgid "Show %s/sec rate"
+msgstr "Näita %s/sek kiirust"
+
+#: src/LYOptions.c:2444 src/LYOptions.c:2445
+#, c-format
+msgid "Show %s/sec, ETA"
+msgstr "Näita %s/sek, ETA"
+
+#: src/LYOptions.c:2446 src/LYOptions.c:2447
+#, c-format
+msgid "Show %s/sec (2-digits), ETA"
+msgstr "Näita %s/sek (2-numbrit), ETA"
+
+#: src/LYOptions.c:2450
+msgid "Show progressbar"
+msgstr "Näita progressiriba"
+
+#: src/LYOptions.c:2471
+msgid "Accept lynx's internal types"
+msgstr "Luba lynxi sisemised tüübid"
+
+#: src/LYOptions.c:2472
+msgid "Also accept lynx.cfg's types"
+msgstr "Luba ka lynx.cfg tüübid"
+
+#: src/LYOptions.c:2473
+msgid "Also accept user's types"
+msgstr "Luba ka kasutaja tüübid"
+
+#: src/LYOptions.c:2474
+msgid "Also accept system's types"
+msgstr "Luba ka süsteemsed tüübid"
+
+#: src/LYOptions.c:2475
+msgid "Accept all types"
+msgstr "Luba kõik tüübid"
+
+#: src/LYOptions.c:2484
+msgid "gzip"
+msgstr "gzip"
+
+#: src/LYOptions.c:2485
+msgid "deflate"
+msgstr "kahanda"
+
+#: src/LYOptions.c:2488
+msgid "compress"
+msgstr "compress"
+
+#: src/LYOptions.c:2491
+msgid "bzip2"
+msgstr "bzip2"
+
+#: src/LYOptions.c:2493
+msgid "All"
+msgstr "Kõik"
+
+#: src/LYOptions.c:2503
+msgid "HTTP 1.0"
+msgstr "HTTP 1.0"
+
+#: src/LYOptions.c:2504
+msgid "HTTP 1.1"
+msgstr "HTTP 1.1"
+
+#: src/LYOptions.c:2863 src/LYOptions.c:2892
+#, c-format
+msgid "Use %s to invoke the Options menu!"
+msgstr "Seadete menüü saamiseks kasutage %s!"
+
+#: src/LYOptions.c:3789
+msgid "(options marked with (!) will not be saved)"
+msgstr "((!) märgitud seadeid ei salvestata)"
+
+#: src/LYOptions.c:3797
+msgid "General Preferences"
+msgstr "Ãœldised seaded"
+
+#. ***************************************************************
+#. User Mode: SELECT
+#: src/LYOptions.c:3801
+msgid "User mode"
+msgstr "Kasutaja mood"
+
+#. Editor: INPUT
+#: src/LYOptions.c:3807
+msgid "Editor"
+msgstr "Toimeti"
+
+#. Search Type: SELECT
+#: src/LYOptions.c:3812
+msgid "Type of Search"
+msgstr "Otsingutüüp"
+
+#: src/LYOptions.c:3817
+msgid "Security and Privacy"
+msgstr "Turvalisus ja privaatsus"
+
+#. ***************************************************************
+#. Cookies: SELECT
+#: src/LYOptions.c:3821
+msgid "Cookies"
+msgstr "Präänikud"
+
+#. Cookie Version: SELECT
+#: src/LYOptions.c:3835
+msgid "Cookie RFC-version"
+msgstr "Küpsise RFC-versioon"
+
+#. Cookie Prompting: SELECT
+#: src/LYOptions.c:3841
+msgid "Invalid-Cookie Prompting"
+msgstr "Vigase prääniku küsimine"
+
+#. SSL Prompting: SELECT
+#: src/LYOptions.c:3848
+msgid "SSL Prompting"
+msgstr "SSL küsimine"
+
+#: src/LYOptions.c:3853
+msgid "SSL client certificate file"
+msgstr "SSL kliendi sertifikaadi fail"
+
+#: src/LYOptions.c:3857
+msgid "SSL client key file"
+msgstr "SSL kliendi võtme fail"
+
+#: src/LYOptions.c:3863
+msgid "Keyboard Input"
+msgstr "Sisend klaviatuurilt"
+
+#. ***************************************************************
+#. Keypad Mode: SELECT
+#: src/LYOptions.c:3867
+msgid "Keypad mode"
+msgstr "Klahvistiku mood"
+
+#. Emacs keys: ON/OFF
+#: src/LYOptions.c:3873
+msgid "Emacs keys"
+msgstr "Emacs klahvid"
+
+#. VI Keys: ON/OFF
+#: src/LYOptions.c:3879
+msgid "VI keys"
+msgstr "VI klahvid"
+
+#. Line edit style: SELECT
+#. well, at least 2 line edit styles available
+#: src/LYOptions.c:3886
+msgid "Line edit style"
+msgstr "Reatoimeti mood"
+
+#. Keyboard layout: SELECT
+#: src/LYOptions.c:3898
+msgid "Keyboard layout"
+msgstr "Klaviatuuri asetus"
+
+#.
+#. * Display and Character Set
+#.
+#: src/LYOptions.c:3912
+msgid "Display and Character Set"
+msgstr "Ekraan ja kooditabel"
+
+#. Use locale-based character set: ON/OFF
+#: src/LYOptions.c:3917
+msgid "Use locale-based character set"
+msgstr "Kasuta lokaadi põhist kooditabelit"
+
+#: src/LYOptions.c:3924
+msgid "Use HTML5 charset replacements"
+msgstr "Kasuta HTML5 tähestiku asendusi"
+
+#. Display Character Set: SELECT
+#: src/LYOptions.c:3930
+msgid "Display character set"
+msgstr "Ekraani kooditabel"
+
+#: src/LYOptions.c:3961
+msgid "Assumed document character set"
+msgstr "Eeldatav dokumendi kooditabel"
+
+#: src/LYOptions.c:3977
+msgid "Internationalized domain names"
+msgstr "Rahvusvahelised doomeni nimed"
+
+#.
+#. * Since CJK people hardly mixed with other world
+#. * we split the header to make it more readable:
+#. * "CJK mode" for CJK display charsets, and "Raw 8-bit" for others.
+#.
+#: src/LYOptions.c:3995
+msgid "CJK mode"
+msgstr "CJK mood"
+
+#: src/LYOptions.c:3997
+msgid "Raw 8-bit"
+msgstr "Puhas 8-bitti"
+
+#. X Display: INPUT
+#: src/LYOptions.c:4005
+msgid "X Display"
+msgstr "X Ekraan"
+
+#.
+#. * Document Appearance
+#.
+#: src/LYOptions.c:4011
+msgid "Document Appearance"
+msgstr "Dokumendi esitamine"
+
+#: src/LYOptions.c:4017
+msgid "Show color"
+msgstr "Näita värve"
+
+#: src/LYOptions.c:4043
+msgid "Color style"
+msgstr "Värvi stiil"
+
+#: src/LYOptions.c:4053
+msgid "Default colors"
+msgstr "Vaikimisi värvid"
+
+#. Show cursor: ON/OFF
+#: src/LYOptions.c:4061
+msgid "Show cursor"
+msgstr "Näita kursorit"
+
+#. Underline links: ON/OFF
+#: src/LYOptions.c:4067
+msgid "Underline links"
+msgstr "Jooni viited"
+
+#. Show scrollbar: ON/OFF
+#: src/LYOptions.c:4074
+msgid "Show scrollbar"
+msgstr "Näita kerimisriba"
+
+#. Select Popups: ON/OFF
+#: src/LYOptions.c:4081
+msgid "Popups for select fields"
+msgstr "Hüpikud valikuväljadele"
+
+#. HTML error recovery: SELECT
+#: src/LYOptions.c:4087
+msgid "HTML error recovery"
+msgstr "HTML veatöötlus"
+
+#. Bad HTML messages: SELECT
+#: src/LYOptions.c:4093
+msgid "Bad HTML messages"
+msgstr "Halvad HTML teated"
+
+#. Show Images: SELECT
+#: src/LYOptions.c:4099
+msgid "Show images"
+msgstr "Näita pilte"
+
+#. Verbose Images: ON/OFF
+#: src/LYOptions.c:4113
+msgid "Verbose images"
+msgstr "Verbaalsed pildid"
+
+#. Collapse BR Tags: ON/OFF
+#: src/LYOptions.c:4119
+msgid "Collapse BR tags"
+msgstr "BR tagide kollaps"
+
+#. Trim blank lines: ON/OFF
+#: src/LYOptions.c:4125
+msgid "Trim blank lines"
+msgstr "Vähenda tühje ridu"
+
+#.
+#. * Headers Transferred to Remote Servers
+#.
+#: src/LYOptions.c:4133
+msgid "Headers Transferred to Remote Servers"
+msgstr "Serverile saadetavad päised"
+
+#. ***************************************************************
+#. Mail Address: INPUT
+#: src/LYOptions.c:4137
+msgid "Personal mail address"
+msgstr "Isiklik e-posti aadress"
+
+#: src/LYOptions.c:4142
+msgid "Personal name for mail"
+msgstr "Teie nimi e-postituses"
+
+#: src/LYOptions.c:4149
+msgid "Password for anonymous ftp"
+msgstr "Anonüümse ftp parool"
+
+#. Preferred content type: SELECT
+#: src/LYOptions.c:4155
+msgid "Preferred content type"
+msgstr "Eelistatud sisu tüüp"
+
+#. Preferred media type: SELECT
+#: src/LYOptions.c:4161
+msgid "Preferred media type"
+msgstr "Eelistatud meedia tüüp"
+
+#. Preferred encoding: SELECT
+#: src/LYOptions.c:4167
+msgid "Preferred encoding"
+msgstr "Eelistatud kodeering"
+
+#. Preferred Document Character Set: INPUT
+#: src/LYOptions.c:4173
+msgid "Preferred document character set"
+msgstr "Eelistatuim dokumendi kooditabel"
+
+#. Preferred Document Language: INPUT
+#: src/LYOptions.c:4178
+msgid "Preferred document language"
+msgstr "Eelistatuim dokumendi keel"
+
+#. HTTP protocol SELECT
+#: src/LYOptions.c:4183
+msgid "HTTP protocol"
+msgstr "HTTP protokoll"
+
+#: src/LYOptions.c:4190
+msgid "Send User-Agent header"
+msgstr "Saada User-Agent päis"
+
+#: src/LYOptions.c:4192
+msgid "User-Agent header"
+msgstr "User-Agent päis"
+
+#.
+#. * Listing and Accessing Files
+#.
+#: src/LYOptions.c:4200
+msgid "Listing and Accessing Files"
+msgstr "Failide näitamine ja kasutamine"
+
+#. FTP sort: SELECT
+#: src/LYOptions.c:4205
+msgid "Use Passive FTP"
+msgstr "Kasuta Passive FTP"
+
+#. FTP sort: SELECT
+#: src/LYOptions.c:4211
+msgid "FTP sort criteria"
+msgstr "FTP järjestamine"
+
+#. Local Directory Sort: SELECT
+#: src/LYOptions.c:4219
+msgid "Local directory sort criteria"
+msgstr "Lokaalse kataloogi järjestamine"
+
+#. Local Directory Order: SELECT
+#: src/LYOptions.c:4225
+msgid "Local directory sort order"
+msgstr "Lokaalse kataloogi järjestamine"
+
+#: src/LYOptions.c:4234
+msgid "Show dot files"
+msgstr "Näita punktiga faile"
+
+#: src/LYOptions.c:4242
+msgid "Execution links"
+msgstr "Täidetavad viited"
+
+#: src/LYOptions.c:4260
+msgid "Pause when showing message"
+msgstr "Peatu teate näitamisel"
+
+#. Show transfer rate: SELECT
+#: src/LYOptions.c:4267
+msgid "Show transfer rate"
+msgstr "Näita laadimise kiirust"
+
+#.
+#. * Special Files and Screens
+#.
+#: src/LYOptions.c:4287
+msgid "Special Files and Screens"
+msgstr "Spetsiaalfailid ja ekraanid"
+
+#: src/LYOptions.c:4292
+msgid "Multi-bookmarks"
+msgstr "Järgede failid"
+
+#: src/LYOptions.c:4300
+msgid "Review/edit Bookmarks files"
+msgstr "vaata/toimeta järgede faile"
+
+#: src/LYOptions.c:4303
+msgid "Goto multi-bookmark menu"
+msgstr "Mine mitme-järje menüüsse"
+
+#: src/LYOptions.c:4305
+msgid "Bookmarks file"
+msgstr "Järgede fail"
+
+#. Auto Session: ON/OFF
+#: src/LYOptions.c:4312
+msgid "Auto Session"
+msgstr "Auto Sessioon"
+
+#. Session File Menu: INPUT
+#: src/LYOptions.c:4318
+msgid "Session file"
+msgstr "Sessiooni fail"
+
+#. Visited Pages: SELECT
+#: src/LYOptions.c:4324
+msgid "Visited Pages"
+msgstr "Külastatud lehed"
+
+#: src/LYOptions.c:4329
+msgid "View the file "
+msgstr "Vaata faili"
+
+#: src/LYPrint.c:956
+#, c-format
+msgid " Print job complete.\n"
+msgstr " Trükitöö lõpetas.\n"
+
+#: src/LYPrint.c:1283
+msgid "Document:"
+msgstr "Dokument:"
+
+#: src/LYPrint.c:1284
+msgid "Number of lines:"
+msgstr "Ridu:"
+
+#: src/LYPrint.c:1285
+msgid "Number of pages:"
+msgstr "Lehekülgi:"
+
+#: src/LYPrint.c:1286
+msgid "pages"
+msgstr "lehekülge"
+
+#: src/LYPrint.c:1286
+msgid "page"
+msgstr "lehekülg"
+
+#: src/LYPrint.c:1287
+msgid "(approximately)"
+msgstr "(umbkaudu)"
+
+#: src/LYPrint.c:1294
+msgid "Some print functions have been disabled!"
+msgstr "Osad trükkimise funktsioonid on blokeeritud!"
+
+#: src/LYPrint.c:1298
+msgid "Standard print options:"
+msgstr "Standardsed trükkimise võimalused:"
+
+#: src/LYPrint.c:1299
+msgid "Print options:"
+msgstr "Trükkimise võimalused:"
+
+#: src/LYPrint.c:1306
+msgid "Save to a local file"
+msgstr "Salvesta lokaalsesse faili"
+
+#: src/LYPrint.c:1308
+msgid "Save to disk disabled"
+msgstr "Kettale salvestamine on blokeeritud"
+
+#: src/LYPrint.c:1315
+msgid "Mail the file"
+msgstr "Postita fail"
+
+#: src/LYPrint.c:1322
+msgid "Print to the screen"
+msgstr "Väljasta ekraanile"
+
+#: src/LYPrint.c:1327
+msgid "Print out on a printer attached to your vt100 terminal"
+msgstr "Trüki vt100 terminaliga ühendatud printerile"
+
+#: src/LYReadCFG.c:437
+#, c-format
+msgid ""
+"Syntax Error parsing COLOR in configuration file:\n"
+"The line must be of the form:\n"
+"COLOR:INTEGER:FOREGROUND:BACKGROUND\n"
+"\n"
+"Here FOREGROUND and BACKGROUND must be one of:\n"
+"The special strings 'nocolor' or 'default', or\n"
+msgstr ""
+"Süntaksi viga seadete failis COLOR parsimisel:\n"
+"Rida peab olema kujul:\n"
+"COLOR:TÄISARV:ESIPLAAN:TAUST\n"
+"\n"
+"ESIPLAAN ja TAUST peab olema üks järgnevaist:\n"
+"Sõne 'nocolor' või 'default', või\n"
+
+#: src/LYReadCFG.c:450
+msgid "Offending line:"
+msgstr "Vigane rida:"
+
+#: src/LYReadCFG.c:764
+#, c-format
+msgid "key remapping of %s to %s for %s failed\n"
+msgstr "klahvi %s -> %s ümbermääramine %s jaoks ebaõnnestus\n"
+
+#: src/LYReadCFG.c:771
+#, c-format
+msgid "key remapping of %s to %s failed\n"
+msgstr "klahvi %s -> %s ümbermääramine ebaõnnestus\n"
+
+#: src/LYReadCFG.c:792
+#, c-format
+msgid "invalid line-editor selection %s for key %s, selecting all\n"
+msgstr "vigane rea-toimeti valik %s klahvile %s, valik kõik\n"
+
+#: src/LYReadCFG.c:817 src/LYReadCFG.c:832
+#, c-format
+msgid "setting of line-editor binding for key %s (0x%x) to 0x%x for %s failed\n"
+msgstr "rea-toimeti klahviseose seadmine %s (0x%x) -> 0x%x %s jaoks ebaõnnestus\n"
+
+#: src/LYReadCFG.c:839
+#, c-format
+msgid "setting of line-editor binding for key %s (0x%x) for %s failed\n"
+msgstr "rea-toimeti klahviseose seadmine klahv %s (0x%x) %s jaoks ebaõnnestus\n"
+
+#: src/LYReadCFG.c:937
+#, c-format
+msgid "Lynx: cannot start, CERN rules file %s is not available\n"
+msgstr "Lynx: ei saa startida, CERN reeglite fail %s ei ole kasutatav\n"
+
+#: src/LYReadCFG.c:938
+msgid "(no name)"
+msgstr "(nimetu)"
+
+#: src/LYReadCFG.c:2086
+#, c-format
+msgid "More than %d nested lynx.cfg includes -- perhaps there is a loop?!?\n"
+msgstr "Rohkem kui %d lynx.cfg kaasamist -- vahest on tekkinud tsükkel?!?\n"
+
+#: src/LYReadCFG.c:2088
+#, c-format
+msgid "Last attempted include was '%s',\n"
+msgstr "Viimane kaasata üritatud fail oli '%s',\n"
+
+#: src/LYReadCFG.c:2089
+#, c-format
+msgid "included from '%s'.\n"
+msgstr "kaasatud failist '%s'.\n"
+
+#: src/LYReadCFG.c:2500 src/LYReadCFG.c:2513 src/LYReadCFG.c:2571
+msgid "The following is read from your lynx.cfg file."
+msgstr "Järgnev on loetud teie lynx.cfg failist."
+
+#: src/LYReadCFG.c:2501 src/LYReadCFG.c:2514
+msgid "Please read the distribution"
+msgstr "Lisainfo jaoks lugege palun"
+
+#: src/LYReadCFG.c:2507 src/LYReadCFG.c:2517
+msgid "for more comments."
+msgstr "paketis olevat faili."
+
+#: src/LYReadCFG.c:2553
+msgid "RELOAD THE CHANGES"
+msgstr "MUUTUSTE LAADIMINE"
+
+#: src/LYReadCFG.c:2561
+msgid "Your primary configuration"
+msgstr "Teie primaarsed seaded"
+
+#: src/LYShowInfo.c:116
+msgid "URL:"
+msgstr "URL:"
+
+#: src/LYShowInfo.c:200
+msgid "Directory that you are currently viewing"
+msgstr "Praegu vaadatav kataloog"
+
+#: src/LYShowInfo.c:203
+msgid "Name:"
+msgstr "Nimi:"
+
+#: src/LYShowInfo.c:220
+msgid "Directory that you have currently selected"
+msgstr "Praegu valitud kataloog"
+
+#: src/LYShowInfo.c:222
+msgid "File that you have currently selected"
+msgstr "Praegu valitud fail"
+
+#: src/LYShowInfo.c:225
+msgid "Symbolic link that you have currently selected"
+msgstr "Praegu valitud nimeviide"
+
+#: src/LYShowInfo.c:228
+msgid "Item that you have currently selected"
+msgstr "Praegu valitud element"
+
+#: src/LYShowInfo.c:230
+msgid "Full name:"
+msgstr "Täisnimi"
+
+#: src/LYShowInfo.c:243
+msgid "Unable to follow link"
+msgstr "Viidet ei õnnestu järgida"
+
+#: src/LYShowInfo.c:245
+msgid "Points to file:"
+msgstr "Osutab failile: "
+
+#: src/LYShowInfo.c:250
+msgid "Name of owner:"
+msgstr "Omaniku nimi"
+
+#: src/LYShowInfo.c:253
+msgid "Group name:"
+msgstr "Grupi nimi"
+
+#: src/LYShowInfo.c:255
+msgid "File size:"
+msgstr "Faili suurus"
+
+#: src/LYShowInfo.c:257
+msgid "(bytes)"
+msgstr "(baiti)"
+
+#.
+#. * Include date and time information.
+#.
+#: src/LYShowInfo.c:262
+msgid "Creation date:"
+msgstr "Loodud:"
+
+#: src/LYShowInfo.c:265
+msgid "Last modified:"
+msgstr "Viimati muudetud:"
+
+#: src/LYShowInfo.c:268
+msgid "Last accessed:"
+msgstr "Viimane kasutamine:"
+
+#: src/LYShowInfo.c:274
+msgid "Access Permissions"
+msgstr "Kasutamise õigused"
+
+#: src/LYShowInfo.c:309
+msgid "Group:"
+msgstr "Grupp:"
+
+#: src/LYShowInfo.c:329
+msgid "World:"
+msgstr "Ülejäänud:"
+
+#: src/LYShowInfo.c:336
+msgid "File that you are currently viewing"
+msgstr "Fail mida te parajasti vaatate"
+
+#: src/LYShowInfo.c:344 src/LYShowInfo.c:444
+msgid "Linkname:"
+msgstr "Viite nimi:"
+
+#: src/LYShowInfo.c:350 src/LYShowInfo.c:365
+msgid "Charset:"
+msgstr "Kooditabel:"
+
+#: src/LYShowInfo.c:364
+msgid "(assumed)"
+msgstr "(eeldatatkse)"
+
+#: src/LYShowInfo.c:371
+msgid "Server:"
+msgstr "Server:"
+
+#: src/LYShowInfo.c:374
+msgid "Date:"
+msgstr "Kuupäev:"
+
+#: src/LYShowInfo.c:377
+msgid "Last Mod:"
+msgstr "Viimane muutmine:"
+
+#: src/LYShowInfo.c:381
+msgid "Expires:"
+msgstr "Aegub:"
+
+#: src/LYShowInfo.c:384
+msgid "Cache-Control:"
+msgstr "Vahemälu-kontroll:"
+
+#: src/LYShowInfo.c:387
+msgid "Content-Length:"
+msgstr "Sisu-pikkus:"
+
+#: src/LYShowInfo.c:391
+msgid "Length:"
+msgstr "Pikkus:"
+
+#: src/LYShowInfo.c:396
+msgid "Language:"
+msgstr "Keel:"
+
+#: src/LYShowInfo.c:402
+msgid "Post Data:"
+msgstr "Post andmed:"
+
+#: src/LYShowInfo.c:405
+msgid "Post Content Type:"
+msgstr "Post sisu tüüp:"
+
+#: src/LYShowInfo.c:408
+msgid "Owner(s):"
+msgstr "Omanik(ud):"
+
+#: src/LYShowInfo.c:413
+msgid "size:"
+msgstr "maht:"
+
+#: src/LYShowInfo.c:415
+msgid "lines"
+msgstr "ridu"
+
+#: src/LYShowInfo.c:419
+msgid "forms mode"
+msgstr "vormide mood"
+
+#: src/LYShowInfo.c:421
+msgid "source"
+msgstr "lähtetekst"
+
+#: src/LYShowInfo.c:422
+msgid "normal"
+msgstr "normaalne"
+
+#: src/LYShowInfo.c:424
+msgid ", safe"
+msgstr ", turvaline"
+
+#: src/LYShowInfo.c:426
+msgid ", via internal link"
+msgstr ", sisemise viitega"
+
+#: src/LYShowInfo.c:430
+msgid ", no-cache"
+msgstr ", mitte-puhverdatav"
+
+#: src/LYShowInfo.c:432
+msgid ", ISMAP script"
+msgstr ", ISMAP skript"
+
+#: src/LYShowInfo.c:434
+msgid ", bookmark file"
+msgstr ", järgede fail"
+
+#: src/LYShowInfo.c:437
+msgid "mode:"
+msgstr "mood:"
+
+#: src/LYShowInfo.c:443
+msgid "Link that you currently have selected"
+msgstr "Praegu valitud viide"
+
+#: src/LYShowInfo.c:452
+msgid "Method:"
+msgstr "Meetod:"
+
+#: src/LYShowInfo.c:456
+msgid "Enctype:"
+msgstr "Kodeering:"
+
+#: src/LYShowInfo.c:462
+msgid "Action:"
+msgstr "Tegevus: "
+
+#: src/LYShowInfo.c:468
+msgid "(Form field)"
+msgstr "(Vormi väli)"
+
+#: src/LYShowInfo.c:478
+msgid "No Links on the current page"
+msgstr "Jooksval lehel ei ole viiteid"
+
+#: src/LYShowInfo.c:483
+msgid "Server Headers:"
+msgstr "Serveri päised:"
+
+#: src/LYStyle.c:332
+#, c-format
+msgid ""
+"Syntax Error parsing style in lss file:\n"
+"[%s]\n"
+"The line must be of the form:\n"
+"OBJECT:MONO:COLOR (ie em:bold:brightblue:white)\n"
+"where OBJECT is one of EM,STRONG,B,I,U,BLINK etc.\n"
+"\n"
+msgstr ""
+"Süntaksi viga lss failis stiili parsimisel:\n"
+"[%s]\n"
+"Rida peab olema kujul:\n"
+"OBJEKT:MONO:COLOR (n. em:bold:brightblue:white)\n"
+"kus OBJEKT on üks järgnevaist EM,STRONG,B,I,U,BLINK jne.\n"
+"\n"
+
+#: src/LYStyle.c:941
+#, c-format
+msgid ""
+"\n"
+"Lynx file \"%s\" is not available.\n"
+"\n"
+msgstr ""
+"\n"
+"Lynx fail \"%s\" ei ole kasutatav.\n"
+"\n"
+
+#: src/LYTraversal.c:111
+msgid "here is a list of the history stack so that you may rebuild"
+msgstr "siin on väljavõte ajaloo magasinist, saate vajadusel taastada"
+
+#: src/LYUpload.c:77
+msgid "ERROR! - upload command is misconfigured"
+msgstr "VIGA! - üleslaadimise käsklus on vigaselt seadistatud"
+
+#: src/LYUpload.c:98
+msgid "Illegal redirection \"../\" found! Request ignored."
+msgstr "Leidsin vigase ümbersuunamise \"../\"! Ignoreerin päringut."
+
+#: src/LYUpload.c:101
+msgid "Illegal character \"/\" found! Request ignored."
+msgstr "Leidsin lubamatu sümboli \"/\"! Ignoreerin päringut."
+
+#: src/LYUpload.c:104
+msgid "Illegal redirection using \"~\" found! Request ignored."
+msgstr "Leidsin lubamatu ümbersuunamine, mis kasutab \"~\"! Ignoreerin päringut."
+
+#: src/LYUpload.c:157
+msgid "Unable to upload file."
+msgstr "Faili ei õnnestu üles laadida."
+
+#: src/LYUpload.c:196
+msgid "Upload To:"
+msgstr "Lae üles:"
+
+#: src/LYUpload.c:197
+msgid "Upload options:"
+msgstr "Ãœleslaadimise seaded:"
+
+#: src/LYUtils.c:1911
+msgid "Download document URL put to clipboard."
+msgstr "Panin dokumendi allalaadimise URLi lõikepuhvrisse."
+
+#: src/LYUtils.c:2658
+msgid "Unexpected access protocol for this URL scheme."
+msgstr "Selle URL skeemiga kasutatakse ootamatut kasutamise protokolli."
+
+#: src/LYUtils.c:3571
+msgid "Too many tempfiles"
+msgstr "Liiga palju ajutisi faile"
+
+#: src/LYUtils.c:3871
+msgid "unknown restriction"
+msgstr "tundmatu piirang"
+
+#: src/LYUtils.c:3902
+#, c-format
+msgid "No restrictions set.\n"
+msgstr "Piiranguid pole.\n"
+
+#: src/LYUtils.c:3905
+#, c-format
+msgid "Restrictions set:\n"
+msgstr "Seatud piirangud:\n"
+
+#: src/LYUtils.c:5202
+msgid "Cannot find HOME directory"
+msgstr "Ei leie HOME kataloogi"
+
+#: src/LYrcFile.c:16
+msgid "Normally disabled. See ENABLE_LYNXRC in lynx.cfg\n"
+msgstr "Tavaliselt blokeeritud. Vaadake lynx.cfg failis ENABLE_LYNXRC kohta\n"
+
+#: src/LYrcFile.c:373
+msgid ""
+"accept_all_cookies allows the user to tell Lynx to automatically\n"
+"accept all cookies if desired. The default is \"FALSE\" which will\n"
+"prompt for each cookie. Set accept_all_cookies to \"TRUE\" to accept\n"
+"all cookies.\n"
+msgstr ""
+"accept_all_cookies võimaldab kasutajal paluda Lynxil automaatselt\n"
+"võtta vastu kõik pakutavad präänikud. Vaikeseade on \"FALSE\", mis\n"
+"tähendab, et iga prääniku korral küsitakse kasutaja nõusolekut.\n"
+"Kõikide präänikute vastu võtmiseks kasutage väärtust \"TRUE\".\n"
+
+#: src/LYrcFile.c:381
+msgid ""
+"anonftp_password allows the user to tell Lynx to use the personal\n"
+"email address as the password for anonymous ftp. If no value is given,\n"
+"Lynx will use the personal email address. Set anonftp_password\n"
+"to a different value if you choose.\n"
+msgstr ""
+"anonftp_password võimaldab kasutajal määrata anonüümse ftp parooliks\n"
+"isiklik e-posti aadress. Kui väärtust ei anta, kasutab Lynx isiklikku\n"
+"e-posti aadressi. Vajadusel saab kasutada ka mingit muud e-posti aadressi.\n"
+
+#: src/LYrcFile.c:390
+msgid ""
+"bookmark_file specifies the name and location of the default bookmark\n"
+"file into which the user can paste links for easy access at a later\n"
+"date.\n"
+msgstr ""
+"bookmark_file määrab vaikimisi järgede faili nime ja asukoha, kuhu\n"
+"kasutaja saab salvestada viiteid hilisemaks kasutamiseks.\n"
+
+#: src/LYrcFile.c:395
+msgid ""
+"If case_sensitive_searching is \"on\" then when the user invokes a search\n"
+"using the 's' or '/' keys, the search performed will be case sensitive\n"
+"instead of case INsensitive. The default is usually \"off\".\n"
+msgstr ""
+"Kui case_sensitive_searching väärtus on \"on\", siis teostatakse klahvidega\n"
+"'s' või '/' antud otsing tõstutundlikult. Väärtuse \"off\" korral on otsing\n"
+"tõstutundetu. Vaikimisi on tavaliselt \"off\".\n"
+
+#: src/LYrcFile.c:400
+msgid ""
+"The character_set definition controls the representation of 8 bit\n"
+"characters for your terminal. If 8 bit characters do not show up\n"
+"correctly on your screen you may try changing to a different 8 bit\n"
+"set or using the 7 bit character approximations.\n"
+"Current valid characters sets are:\n"
+msgstr ""
+"character_set definitsioon kontrollib teie ekraanil 8 bitiste sümbolite\n"
+"esitust. Kui 8 bitised sümbolid ei ole teie ekraanil esitatud korrektselt,\n"
+"võite proovida kasutada muud 8 bitist kooditabelit või kasutada 7 bitiseid\n"
+"lähendusi.\n"
+"Lubatud kooditabelid on:\n"
+
+#: src/LYrcFile.c:408
+msgid ""
+"cookie_accept_domains and cookie_reject_domains are comma-delimited\n"
+"lists of domains from which Lynx should automatically accept or reject\n"
+"all cookies. If a domain is specified in both options, rejection will\n"
+"take precedence. The accept_all_cookies parameter will override any\n"
+"settings made here.\n"
+msgstr ""
+"cookie_accept_domains ja cookie_reject_domains on komadega eraldatud\n"
+"loend doomenitest, mille pakutavad präänikud peaks Lynx automaatselt\n"
+"vastu võtma või tagasi lükkama. Kui doomen on esindatud mõlemas seades,\n"
+"eelistatakse tagasi lükkamist. accept_all_cookies parameeter käib\n"
+"siinsetest määrangutest üle.\n"
+
+#: src/LYrcFile.c:416
+msgid ""
+"cookie_file specifies the file from which to read persistent cookies.\n"
+"The default is ~/"
+msgstr ""
+"cookie_file määrab faili, millest loetakse püsivad präänikud.\n"
+"Vaikeväärtus on ~/"
+
+#: src/LYrcFile.c:421
+msgid ""
+"cookie_loose_invalid_domains, cookie_strict_invalid_domains, and\n"
+"cookie_query_invalid_domains are comma-delimited lists of which domains\n"
+"should be subjected to varying degrees of validity checking. If a\n"
+"domain is set to strict checking, strict conformance to RFC2109 will\n"
+"be applied. A domain with loose checking will be allowed to set cookies\n"
+"with an invalid path or domain attribute. All domains will default to\n"
+"querying the user for an invalid path or domain.\n"
+msgstr ""
+"cookie_loose_invalid_domains, cookie_strict_invalid_domains ja\n"
+"cookie_query_invalid_domains on komadega eraldatud loendid doomenitest,\n"
+"millele rakendatakse erinevaid kehtivuse piiranguid. \"strict\" kontrolli\n"
+"korral nõutakse ranget RFC2109 vastavust. \"loose\" kontrolli korral\n"
+"lubatakse seada vigase tee või doomeni atribuudiga präänikuid. Kõikide\n"
+"doomenite korral küsitakse vigase tee või doomeni korral luba kasutajalt.\n"
+
+#: src/LYrcFile.c:435
+msgid ""
+"dir_list_order specifies the directory list order under DIRED_SUPPORT\n"
+"(if implemented). The default is \"ORDER_BY_NAME\"\n"
+msgstr ""
+"dir_list_order määrab kataloogi esituse järjestuse DIRED_SUPPORT sees\n"
+"(kui on realiseeritud). Vaikimisi on \"ORDER_BY_NAME\"\n"
+
+#: src/LYrcFile.c:440
+msgid ""
+"dir_list_styles specifies the directory list style under DIRED_SUPPORT\n"
+"(if implemented). The default is \"MIXED_STYLE\", which sorts both\n"
+"files and directories together. \"FILES_FIRST\" lists files first and\n"
+"\"DIRECTORIES_FIRST\" lists directories first.\n"
+msgstr ""
+"dir_list_styles määraba karaloogi listingu stiili DIRED_SUPPORT\n"
+"keskkonnas (kui see on realiseeritud). Vaikeväärtus on \"MIXED_STYLE\",\n"
+"mis järjestab läbisegi nii failid, kui kataloogid. \"FILES_FIRST\"\n"
+"järjestab esimesteks failid ja \"DIRECTORIES_FIRST\" järjestab esimesteks\n"
+"kataloogid.\n"
+
+#: src/LYrcFile.c:448
+msgid ""
+"If emacs_keys is to \"on\" then the normal EMACS movement keys:\n"
+" ^N = down ^P = up\n"
+" ^B = left ^F = right\n"
+"will be enabled.\n"
+msgstr ""
+"Kui emacs_keys väärtus on \"on\", siis on lubatud tavalised EMACS stiilis\n"
+"liikumise klahvid:\n"
+" ^N = alla ^P = üles\n"
+" ^B = vasakule ^F = paremale\n"
+
+#: src/LYrcFile.c:454
+msgid ""
+"file_editor specifies the editor to be invoked when editing local files\n"
+"or sending mail. If no editor is specified, then file editing is disabled\n"
+"unless it is activated from the command line, and the built-in line editor\n"
+"will be used for sending mail.\n"
+msgstr ""
+"file_editor määrab toimeti, mida käivitatakse lokaalsete failide\n"
+"toimetamiseks või kirja saatmiseks. Kui toimetit ei ole määratud, siis\n"
+"failide toimetamine on blokeeritud, välja arvatud juhul, kui toimeti\n"
+"on määratud käsureal, ja kirjade saatmisel kasutatakse sisemist toimetit. \n"
+
+#: src/LYrcFile.c:461
+msgid ""
+"The file_sorting_method specifies which value to sort on when viewing\n"
+"file lists such as FTP directories. The options are:\n"
+" BY_FILENAME -- sorts on the name of the file\n"
+" BY_TYPE -- sorts on the type of the file\n"
+" BY_SIZE -- sorts on the size of the file\n"
+" BY_DATE -- sorts on the date of the file\n"
+msgstr ""
+"file_sorting_method määrab millise väärtuse järgi järjestada failide\n"
+"loendeid, nagu näiteks FTP katalooge. Valikud on:\n"
+" BY_FILENAME -- järjestab failide nimede järgi\n"
+" BY_TYPE -- järjestab failide tüüpide järgi\n"
+" BY_SIZE -- järjestab failide suuruste järgi\n"
+" BY_DATE -- järjestab failide aegade järgi\n"
+
+#: src/LYrcFile.c:492
+msgid ""
+"lineedit_mode specifies the key binding used for inputting strings in\n"
+"prompts and forms. If lineedit_mode is set to \"Default Binding\" then\n"
+"the following control characters are used for moving and deleting:\n"
+"\n"
+" Prev Next Enter = Accept input\n"
+" Move char: <- -> ^G = Cancel input\n"
+" Move word: ^P ^N ^U = Erase line\n"
+" Delete char: ^H ^R ^A = Beginning of line\n"
+" Delete word: ^B ^F ^E = End of line\n"
+"\n"
+"Current lineedit modes are:\n"
+msgstr ""
+"lineedit_mode määrab sisendteksti klahviseosed küsimustes ja\n"
+"vormides. Kui lineedit_mode väärtuseks on seatud \"Default Binding\",\n"
+"kasutatakse liikumiseks ja kustutamiseks järgnevaid seoseid:\n"
+"\n"
+" Eelm Järgm Enter = Nõustu sisendiga\n"
+" Sümbol haaval: <- -> ^G = katkesta sisend\n"
+" Sõna haaval: ^P ^N ^U = Kustuta rida\n"
+" Kustuta sümbol: ^H ^R ^A = Rea algus\n"
+" Kustuta sõna: ^B ^F ^E = Rea lõpp\n"
+"\n"
+"Current lineedit modes are:\n"
+
+#: src/LYrcFile.c:510
+msgid ""
+"The following allow you to define sub-bookmark files and descriptions.\n"
+"The format is multi_bookmark<capital_letter>=<filename>,<description>\n"
+"Up to 26 bookmark files (for the English capital letters) are allowed.\n"
+"We start with \"multi_bookmarkB\" since 'A' is the default (see above).\n"
+msgstr ""
+"Järgnev võimaldab teil defineerida alam-järgede faile ja kirjeldusi.\n"
+"Vorming on multi_bookmark<suurtäht>=<failinimi>,<kirjeldus>\n"
+"Lubatud on kuni 26 järgede faili (Inglise tähestiku suurtähtede arv).\n"
+"Alustatakse seadega \"multi_bookmarkB\", kuna 'A' on vaikeväärtus\n"
+"(vaadake ülaltpoolt).\n"
+
+#: src/LYrcFile.c:516
+msgid ""
+"personal_mail_address specifies your personal mail address. The\n"
+"address will be sent during HTTP file transfers for authorization and\n"
+"logging purposes, and for mailed comments.\n"
+"If you do not want this information given out, set the NO_FROM_HEADER\n"
+"to TRUE in lynx.cfg, or use the -nofrom command line switch. You also\n"
+"could leave this field blank, but then you won't have it included in\n"
+"your mailed comments.\n"
+msgstr ""
+"personal_mail_address seab teie isikliku e-posti aadressi. Aadressi\n"
+"kasutatakse HTTP failide ülekandmise autoriseerimiseks ja logimiseks\n"
+"ning kommentaaride saatmisel.\n"
+"Kui te ei soovi seda infot jagada, seadke lynx.cfg failis NO_FROM_HEADER\n"
+"väärtuseks TRUE või kasutage -nofrom käsurea võtit. Selle välja võib\n"
+"jätta ka tühjaks, kuid siis ei kasutata seda ka kommentaaride saatmisel.\n"
+
+#: src/LYrcFile.c:525
+msgid ""
+"personal_mail_name specifies your personal name, for mail. The\n"
+"name is sent for mailed comments. Lynx will prompt for this,\n"
+"showing the configured value as a default when sending mail.\n"
+"This is not necessarily the same as a name provided as part of the\n"
+"personal_mail_address.\n"
+"Lynx does not save your changes to that default value as a side-effect\n"
+"of sending email. To update the default value, you must use the options\n"
+"menu, or modify this file directly.\n"
+msgstr ""
+"personal_mail_name määrab eposti jaoks teie nime. Nimi saadetakse kui teie\n"
+"kommentaare saadetakse e-postiga. Lynx küsib seda postitamisel, näidates\n"
+"seadistatud nime vaikeväärtusena. Ei pea olema sama, kui personal_mail_address\n"
+"seadistuses.\n"
+"E-kirja saatmisel antud nime ei salvestata, nime muutmiseks tuleb seda teha kas\n"
+"seadistuste menüüs või siin failis.\n"
+
+#: src/LYrcFile.c:535
+msgid ""
+"preferred_charset specifies the character set in MIME notation (e.g.,\n"
+"ISO-8859-2, ISO-8859-5) which Lynx will indicate you prefer in requests\n"
+"to http servers using an Accept-Charset header. The value should NOT\n"
+"include ISO-8859-1 or US-ASCII, since those values are always assumed\n"
+"by default. May be a comma-separated list.\n"
+"If a file in that character set is available, the server will send it.\n"
+"If no Accept-Charset header is present, the default is that any\n"
+"character set is acceptable. If an Accept-Charset header is present,\n"
+"and if the server cannot send a response which is acceptable\n"
+"according to the Accept-Charset header, then the server SHOULD send\n"
+"an error response, though the sending of an unacceptable response\n"
+"is also allowed.\n"
+msgstr ""
+"preferred_charset määrab MIME notatsioonis (n. ISO-8859-15, ISO-8859-5)\n"
+"kooditabeli, mida Lynx esitab Accept-Charset päises http serveritele\n"
+"teie poolt eelistatuima kooditabelina. Väärtusena ei peaks kasutama\n"
+"ISO-8859-1 ega US-ASCII, kuna neid kasutatakse alati vaikimisi. Väärtus\n"
+"võib olla komadega eraldatud loend. Kui soovitud kooditabelit kasutav\n"
+"fail on olemas, saadab server selle. Kui Accept-Charset päist ei kasutata,\n"
+"aktsepteeritakse suvalise kooditabeliga. Kui Accept-Charset päis on olemas,\n"
+"aga soovitud kooditabelit kasutavad faili pole, peaks server vastama\n"
+"veateatega, lubatud on aga ka vastata mittesoovitud kooditabelit kasutava\n"
+"failiga.\n"
+
+#: src/LYrcFile.c:553
+msgid ""
+"preferred_language specifies the language in MIME notation (e.g., en,\n"
+"fr, may be a comma-separated list in decreasing preference)\n"
+"which Lynx will indicate you prefer in requests to http servers.\n"
+"If a file in that language is available, the server will send it.\n"
+"Otherwise, the server will send the file in its default language.\n"
+msgstr ""
+"preferred_language määrab keele MIME esituses (n., et, en võib\n"
+"olla ka komadega eraldatud kahaneva eelistusega loend),\n"
+"mida Lynx näitab teie eelistusena http serveritele.\n"
+"Kui fail antud keeles on olemas, server saadab selle. Kui pole,\n"
+"saadab faili oma vaikimisi keeles.\n"
+
+#: src/LYrcFile.c:564
+msgid ""
+"If run_all_execution_links is set \"on\" then all local execution links\n"
+"will be executed when they are selected.\n"
+"\n"
+"WARNING - This is potentially VERY dangerous. Since you may view\n"
+" information that is written by unknown and untrusted sources\n"
+" there exists the possibility that Trojan horse links could be\n"
+" written. Trojan horse links could be written to erase files\n"
+" or compromise security. This should only be set to \"on\" if\n"
+" you are viewing trusted source information.\n"
+msgstr ""
+"Kui run_all_execution_links väärtus on \"on\", täidetakse kõik valitud\n"
+"lokaalsed täidetavad viited.\n"
+"\n"
+"HOIATUS - See seade on VÄGA ohtlik. Kuna info võib olla loodud tundmatu\n"
+" ja kontrollimatu allika poolt, võib olla võimalik luua viiteid\n"
+" Trooja hobustele. Trooja hobune võib hävitada teie andmeid või\n"
+" ohustada teie süsteemi muul moel. Väärtust \"on\" võib kasutada\n"
+" ainult juhul, kui vaatate usaldatavatest allikatest pärit infot.\n"
+
+#: src/LYrcFile.c:575
+msgid ""
+"If run_execution_links_on_local_files is set \"on\" then all local\n"
+"execution links that are found in LOCAL files will be executed when they\n"
+"are selected. This is different from run_all_execution_links in that\n"
+"only files that reside on the local system will have execution link\n"
+"permissions.\n"
+"\n"
+"WARNING - This is potentially dangerous. Since you may view\n"
+" information that is written by unknown and untrusted sources\n"
+" there exists the possibility that Trojan horse links could be\n"
+" written. Trojan horse links could be written to erase files\n"
+" or compromise security. This should only be set to \"on\" if\n"
+" you are viewing trusted source information.\n"
+msgstr ""
+"Kui run_execution_links_on_local_files väärtus on \"on\", täidetakse kõik\n"
+"valitud lokaalsed täidetavad viited LOKAALSETEL failidel. Erinevus\n"
+"run_all_execution_links seadega on selles, et ainult lokaalse süsteemi\n"
+"failidel võib olla täidetavate viidete õigused.\n"
+"\n"
+"HOIATUS - See seade võib olla ohtlik. Kuna info võib olla loodud tundmatu\n"
+" ja kontrollimatu allika poolt, võib olla võimalik luua viiteid\n"
+" Trooja hobustele. Trooja hobune võib hävitada teie andmeid või\n"
+" ohustada teie süsteemi muul moel. Väärtust \"on\" võib kasutada\n"
+" ainult juhul, kui vaatate usaldatavatest allikatest pärit infot.\n"
+
+#: src/LYrcFile.c:593
+msgid ""
+"select_popups specifies whether the OPTIONs in a SELECT block which\n"
+"lacks a MULTIPLE attribute are presented as a vertical list of radio\n"
+"buttons or via a popup menu. Note that if the MULTIPLE attribute is\n"
+"present in the SELECT start tag, Lynx always will create a vertical list\n"
+"of checkboxes for the OPTIONs. A value of \"on\" will set popup menus\n"
+"as the default while a value of \"off\" will set use of radio boxes.\n"
+"The default can be overridden via the -popup command line toggle.\n"
+msgstr ""
+"select_popups määrab kas valikud valiku kastis millel puudub atribuut\n"
+"MULTIPLE esitatakse vertikaalse raadionuppude loendina või hüpikmenüüna.\n"
+"Kui atribuut MULTIPLE on SELECT alguslipikus olemas, loob Lynx valikute\n"
+"jaoks alati vertikaalse märkeruutude loendi. Väärtus \"on\" seab\n"
+"vaikeväärtuse hüpikmenüü ja väärtus \"off\" määrab raadionuppude loendi\n"
+"kasutamise. Vaikeväärtust saab üle määrata käsurea lülitiga -popup.\n"
+
+#: src/LYrcFile.c:604
+msgid ""
+"show_color specifies how to set the color mode at startup. A value of\n"
+"\"never\" will force color mode off (treat the terminal as monochrome)\n"
+"at startup even if the terminal appears to be color capable. A value of\n"
+"\"always\" will force color mode on even if the terminal appears to be\n"
+"monochrome, if this is supported by the library used to build lynx.\n"
+"A value of \"default\" will yield the behavior of assuming\n"
+"a monochrome terminal unless color capability is inferred at startup\n"
+"based on the terminal type, or the -color command line switch is used, or\n"
+"the COLORTERM environment variable is set. The default behavior always is\n"
+"used in anonymous accounts or if the \"option_save\" restriction is set.\n"
+"The effect of the saved value can be overridden via\n"
+"the -color and -nocolor command line switches.\n"
+"The mode set at startup can be changed via the \"show color\" option in\n"
+"the 'o'ptions menu. If the option settings are saved, the \"on\" and\n"
+"\"off\" \"show color\" settings will be treated as \"default\".\n"
+msgstr ""
+"show_color määrab värvide kasutamise programmi käivitamisel. Väärtus\n"
+"\"never\" lülitab värvide kasutamise välja (terminali käsitletakse\n"
+"ühevärvilisena) isegi kui terminal peaks suutma värve kasutada.\n"
+"Väärtus \"always\" lükutab värvide kasutamise sisse isegi kui terminal\n"
+"ei toeta värvide kasutamist, aga seda juhul, kui sellist värvide\n"
+"kasutamist toetab Lynx kompileerimisel kasutatud teek. Väärtus \"default\"\n"
+"lülitab käitumise, kus eeldatakse ühevärvilist terminali, välja arvatud\n"
+"juhul, kui värvide kasutamist on võimalik tuvastada terminali tüübist,\n"
+"kasutatakse käsurea võtit -color või on kasutatud keskkonna muutujat\n"
+"COLORTERM. Vaikimisi käitumist kasutatakse alati anonüümsete kasutajate\n"
+"korral või kui on seatud piirang \"option_save\". Salvestatud väärtust\n"
+"saab muuta käsurea võtmetega -color ja -nocolor.\n"
+"Käivitamisel seatud moodi saab muuta o=seadete menüü \"Näita värve\"\n"
+"seadega. Kui seaded salvestatakse, käsitletakse \"Näita värve\" omaduse\n"
+"väärtusi \"on\" ja \"off\" kui väärtust \"default\".\n"
+
+#: src/LYrcFile.c:621
+msgid ""
+"show_cursor specifies whether to 'hide' the cursor to the right (and\n"
+"bottom, if possible) of the screen, or to place it to the left of the\n"
+"current link in documents, or current option in select popup windows.\n"
+"Positioning the cursor to the left of the current link or option is\n"
+"helpful for speech or braille interfaces, and when the terminal is\n"
+"one which does not distinguish the current link based on highlighting\n"
+"or color. A value of \"on\" will set positioning to the left as the\n"
+"default while a value of \"off\" will set 'hiding' of the cursor.\n"
+"The default can be overridden via the -show_cursor command line toggle.\n"
+msgstr ""
+"show_cursor määrab kas 'peita' kursor ekraani paremasse (ja kui võimalik,\n"
+"alumisse) serva või asetada ta dokumendi jooksvast viitest või hüpikakna\n"
+"valikust vasakule. Kusrori positsioneerimine viitest vasemale aitab kõne\n"
+"või punktkirja liideseid ning juhul, kui terminal ei erista jooksvat\n"
+"viidet heleduse ega värviga. Väärtus \"on\" asetab kursori viidetest\n"
+"vasakule ja on vaikeväärtus ning \"off\" määrab kursori 'peitmise'.\n"
+"vaikeväärtust saab ümber määrata käsurea lülitiga -show_cursor.\n"
+
+#: src/LYrcFile.c:632
+msgid ""
+"show_dotfiles specifies that the directory listing should include\n"
+"\"hidden\" (dot) files/directories. If set \"on\", this will be\n"
+"honored only if enabled via userdefs.h and/or lynx.cfg, and not\n"
+"restricted via a command line switch. If display of hidden files\n"
+"is disabled, creation of such files via Lynx also is disabled.\n"
+msgstr ""
+"show_dotfiles määrab et kataloogi listingus peavad olema ka\n"
+"\"peidetud\" (punktiga algavad) failid ja kataloogid. Kui väärtus\n"
+"on \"on\", kasutatakse seda ainult, kui on nii seatud failis\n"
+"userdefs.h ja/või lynx.cfg, ning seda ei piirata käsurea võtmega.\n"
+"Kui punktiga algavate failide näitamine on keelatud, ei lubata neid\n"
+"ka Lynx vahenditega luua.\n"
+
+#: src/LYrcFile.c:643
+msgid ""
+"If sub_bookmarks is not turned \"off\", and multiple bookmarks have\n"
+"been defined (see below), then all bookmark operations will first\n"
+"prompt the user to select an active sub-bookmark file. If the default\n"
+"Lynx bookmark_file is defined (see above), it will be used as the\n"
+"default selection. When this option is set to \"advanced\", and the\n"
+"user mode is advanced, the 'v'iew bookmark command will invoke a\n"
+"statusline prompt instead of the menu seen in novice and intermediate\n"
+"user modes. When this option is set to \"standard\", the menu will be\n"
+"presented regardless of user mode.\n"
+msgstr ""
+"Kui sub_bookmarks väärtus ei ole \"off\" ja on defineeritud mitu järgede\n"
+"faili (vaadake allpool), siis paluvad kõik järgede operatsioonid määrata\n"
+"kasutajal kõigepealt kasutatab alam-järgede fail. Kui vaikimisi järgede\n"
+"fail on määratud (vaadake ülalpoolt), kasutatakse seda vaikimisi valikuna.\n"
+"Kui selle seade väärtus on \"advanced\" ja kasutaja mood on samuti \"advanced\",\n"
+"kasutab 'v'aata järgi käsklus menüü asemel olekurea viipa. Kui selle\n"
+"seade väärtus on \"standard\", näidatakse alati menüüd.\n"
+
+#: src/LYrcFile.c:658
+msgid ""
+"user_mode specifies the users level of knowledge with Lynx. The\n"
+"default is \"NOVICE\" which displays two extra lines of help at the\n"
+"bottom of the screen to aid the user in learning the basic Lynx\n"
+"commands. Set user_mode to \"INTERMEDIATE\" to turn off the extra info.\n"
+"Use \"ADVANCED\" to see the URL of the currently selected link at the\n"
+"bottom of the screen.\n"
+msgstr ""
+"user_mode näitab kui tuttav on kasutaja Lynx programmiga. Vaikeseade\n"
+"on \"NOVICE\", mille korral näidatakse kaht lisarida abiinfoga ekraani\n"
+"alaosas, et aidata kasutajal õppida Lynx põhikäske. Seades user_mode\n"
+"väärtuseks \"INTERMEDIATE\", lülitate selle lisainfo välja. Määrang\n"
+"\"ADVANCED\" korral näidatakse ekraani alaosas parajasti vaadeldava\n"
+"viite URLi.\n"
+
+#: src/LYrcFile.c:667
+msgid ""
+"If verbose_images is \"on\", lynx will print the name of the image\n"
+"source file in place of [INLINE], [LINK] or [IMAGE]\n"
+"See also VERBOSE_IMAGES in lynx.cfg\n"
+msgstr ""
+"Kui verbose_images väärtus on \"on\", trükib lynx pildi nime tekstide\n"
+"[INLINE], [LINK] või [IMAGE] asemel.\n"
+"Vaadake ka lynx.cfg failis VERBOSE_IMAGES seadet.\n"
+
+#: src/LYrcFile.c:672
+msgid ""
+"If vi_keys is set to \"on\", then the normal VI movement keys:\n"
+" j = down k = up\n"
+" h = left l = right\n"
+"will be enabled. These keys are only lower case.\n"
+"Capital 'H', 'J' and 'K will still activate help, jump shortcuts,\n"
+"and the keymap display, respectively.\n"
+msgstr ""
+"Kui vi_keys väärtus on \"on\", on lubatud tavalised VI liikumiskäsud:\n"
+" j = alla k = üles\n"
+" h = vasakule l = paremale\n"
+"Need käsud on ainult väiketähed.\n"
+"Suured 'H', 'J' ja 'K' aktiveerivad ikka vastavalt abiinfo, hüpped\n"
+"ja klahvitabeli ekraani.\n"
+
+#: src/LYrcFile.c:680
+msgid ""
+"The visited_links setting controls how Lynx organizes the information\n"
+"in the Visited Links Page.\n"
+msgstr ""
+"visited_links seade kontrollib, kuidas Lynx organiseerib infot külastatud\n"
+"viidete lehel.\n"
+
+#: src/LYrcFile.c:924
+msgid ""
+"If keypad_mode is set to \"NUMBERS_AS_ARROWS\", then the numbers on\n"
+"your keypad when the numlock is on will act as arrow keys:\n"
+" 8 = Up Arrow\n"
+" 4 = Left Arrow 6 = Right Arrow\n"
+" 2 = Down Arrow\n"
+"and the corresponding keyboard numbers will act as arrow keys,\n"
+"regardless of whether numlock is on.\n"
+msgstr ""
+"Kui keypad_mode väärtus on \"NUMBERS_AS_ARROWS\", toimivad numbrid \n"
+"teie klahvistikul nooltena ka siis, kui numlock on sisse lülitatud:\n"
+" 8 = Nool üles\n"
+" 4 = Nool vasakule 6 = Nool paremale\n"
+" 2 = Nool alla\n"
+"ning ka vastavad klaviatuuri numbrid toimivad nooltena sõltumata\n"
+"numlock seadest.\n"
+
+#: src/LYrcFile.c:933
+msgid ""
+"If keypad_mode is set to \"LINKS_ARE_NUMBERED\", then numbers will\n"
+"appear next to each link and numbers are used to select links.\n"
+msgstr ""
+"Kui keypad_mode väärtus on \"LINKS_ARE_NUMBERED\", ilmuvad iga viite\n"
+"kõrvale numbrid ja viidete valimiseks kasutatakse numbreid.\n"
+
+#: src/LYrcFile.c:937
+msgid ""
+"If keypad_mode is set to \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\", then\n"
+"numbers will appear next to each link and visible form input field.\n"
+"Numbers are used to select links, or to move the \"current link\" to a\n"
+"form input field or button. In addition, options in popup menus are\n"
+"indexed so that the user may type an option number to select an option in\n"
+"a popup menu, even if the option isn't visible on the screen. Reference\n"
+"lists and output from the list command also enumerate form inputs.\n"
+msgstr ""
+"Kui keypad_mode väärtus on \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\",\n"
+"ilmuvad numbrid iga nähtava viite ja nähtava vormi sisendvälja kõrvale.\n"
+"Numbreid kasutatakse viidete valimiseks või \"jooksva viite\" viimiseks\n"
+"vormi sisendväljale või nupule. Lisaks indekseeritakse valikud\n"
+"hüpikmenüüdes nii, et kasutaja saab valiku valida sisestades vastava\n"
+"hüpikmenüü valiku numbri, isegi kui valik ei ole hetkel ekraanil nähtav.\n"
+"Viidete nimekirjad ja loendikäskude väljundid nummerdavad samuti\n"
+"vormide sisendeid.\n"
+
+#: src/LYrcFile.c:946
+msgid ""
+"NOTE: Some fixed format documents may look disfigured when\n"
+"\"LINKS_ARE_NUMBERED\" or \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\" are\n"
+"enabled.\n"
+msgstr ""
+"MÄRKUS: Mõnede fikseeritud vormingus dokumentide esitus võib olla\n"
+"\"LINKS_ARE_NUMBERED\" või \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\"\n"
+"kasutamisel segane.\n"
+
+#: src/LYrcFile.c:978
+msgid ""
+"Lynx User Defaults File\n"
+"\n"
+msgstr ""
+"Lynx Kasutaja Seadete Fail\n"
+"\n"
+
+#: src/LYrcFile.c:987
+msgid ""
+"This file contains options saved from the Lynx Options Screen (normally\n"
+"with the 'o' key). To save options with that screen, you must select the\n"
+"checkbox:\n"
+msgstr ""
+"See fail sisaldab seadeid Lynx seadete ekraanilt (tavaliselt klahviga 'o').\n"
+"Selle ekraaniga määratud seadete salvestamiseks valige:\n"
+
+#: src/LYrcFile.c:994
+msgid ""
+"You must then save the settings using the link on the line above the\n"
+"checkbox:\n"
+msgstr "Seejärel peate salvestama seaded kasutades viidet valikukasti kohal:\n"
+
+#: src/LYrcFile.c:1001
+msgid ""
+"You may also use the command-line option \"-forms_options\", which displays\n"
+"the simpler Options Menu instead. Save options with that using the '>' key.\n"
+"\n"
+msgstr ""
+"Te võite samuti kasutada käsurea võtit \"-forms_options\", mis näitab lihtsamat\n"
+"seadete menüüd. Seadete salvestamiseks seal kasutage klahvi '>'.\n"
+"\n"
+
+#: src/LYrcFile.c:1008
+msgid ""
+"This file contains options saved from the Lynx Options Screen (normally\n"
+"with the '>' key).\n"
+"\n"
+msgstr ""
+"See fail sisaldab parameetreid Lynx seadete ekraanilt (tavaliselt\n"
+"salvestatud klahviga '>').\n"
+"\n"
+
+#: src/LYrcFile.c:1015
+msgid ""
+"There is normally no need to edit this file manually, since the defaults\n"
+"here can be controlled from the Options Screen, and the next time options\n"
+"are saved from the Options Screen this file will be completely rewritten.\n"
+"You have been warned...\n"
+"\n"
+"If you are looking for the general configuration file - it is normally\n"
+"called \"lynx.cfg\". It has different content and a different format.\n"
+"It is not this file.\n"
+msgstr ""
+"See fail sisaldab seadeid, mis on salvestatud Lynx omaduste ekraanil.\n"
+"Tavaliselt ei ole vajadust seda faili käsitsi muuta, kuna siinseid\n"
+"väärtusi saab muuta omaduste ekraanilt ning peale järgmist\n"
+"salvestamist kirjutatakse see fail täielikult üle.\n"
+"Teid on hoiatatud...\n"
+"\n"
+"Kui te otsite üldist seadete faili - selle nimi on tavaliselt \"lynx.cfg\"\n"
+"ja tal on erinev sisu ning vorming. See ei ole see fail.\n"
diff --git a/po/fi.po b/po/fi.po
new file mode 100644
index 0000000..9fb3880
--- /dev/null
+++ b/po/fi.po
@@ -0,0 +1,6086 @@
+# Finnish messages for Lynx
+# This file is distributed under the same license as the lynx package.
+# Copyright © 2015 The package's copyright holder
+#
+# Permission is granted to freely copy and distribute
+# this file and modified versions, provided, that this
+# header is not removed and modified versions are marked
+# as such.
+#
+# Tätä tiedostoa ja muutettuja versioita saa kopioida
+# ja levittää vapaasti edellyttäen, että tätä otsikkoa
+# ei poisteta, ja muutetut versiot merkitään muutetuiksi.
+#
+# Lauri Nurmi <lanurmi@iki.fi>, 1999, 2003, 2008.
+# Juhani Numminen <juhaninumminen0@gmail.com>, 2012, 2015.
+msgid ""
+msgstr ""
+"Project-Id-Version: lynx 2.8.9-dev7\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-12-14 20:39-0500\n"
+"PO-Revision-Date: 2015-12-27 17:35+0200\n"
+"Last-Translator: Juhani Numminen <juhaninumminen0@gmail.com>\n"
+"Language-Team: Finnish <translation-team-fi@lists.sourceforge.net>\n"
+"Language: fi\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Lokalize 2.0\n"
+
+#. ******************************************************************
+#. * The following definitions are for status line prompts, messages, or
+#. * warnings issued by Lynx during program execution. You can modify
+#. * them to make them more appropriate for your site. We recommend that
+#. * you extend these definitions to other languages using the gettext
+#. * library. There are also scattered uses of 'gettext()' throughout the
+#. * Lynx source, covering all but those messages which (a) are used for
+#. * debugging (CTRACE) or (b) are constants used in interaction with
+#. * other programs.
+#. *
+#. * See ABOUT-NLS and po/readme for details and location of contributed
+#. * translations. When no translation is available, the English default is
+#. * used.
+#.
+#: LYMessages.c:28
+#, c-format
+msgid "Alert!: %s"
+msgstr "Varoitus: %s"
+
+#: LYMessages.c:29
+msgid "Welcome"
+msgstr "Tervetuloa"
+
+#: LYMessages.c:30
+msgid "Are you sure you want to quit?"
+msgstr "Haluatko varmasti lopettaa?"
+
+#: LYMessages.c:32
+msgid "Really exit from Lynx?"
+msgstr "Haluatko varmasti poistua Lynxistä?"
+
+#: LYMessages.c:34
+msgid "Connection interrupted."
+msgstr "Yhteys keskeytetty."
+
+#: LYMessages.c:35
+msgid "Data transfer interrupted."
+msgstr "Tiedonsiirto keskeytetty."
+
+#: LYMessages.c:36
+msgid "Cancelled!!!"
+msgstr "Peruutettu!!!"
+
+#: LYMessages.c:37
+msgid "Cancelling!"
+msgstr "Peruutetaan!"
+
+#: LYMessages.c:38
+msgid "Excellent!!!"
+msgstr "Erinomaista!!!"
+
+#: LYMessages.c:39
+msgid "OK"
+msgstr "OK"
+
+#: LYMessages.c:40
+msgid "Done!"
+msgstr "Valmis!"
+
+#: LYMessages.c:41
+msgid "Bad request!"
+msgstr "Virheellinen pyyntö!"
+
+#: LYMessages.c:42
+msgid "previous"
+msgstr "edellinen"
+
+#: LYMessages.c:43
+msgid "next screen"
+msgstr "seuraava ruutu"
+
+#: LYMessages.c:44
+msgid "HELP!"
+msgstr "Opaste"
+
+#: LYMessages.c:45
+msgid ", help on "
+msgstr ", opaste aiheesta "
+
+#. #define HELP
+#: LYMessages.c:47
+msgid "Commands: Use arrow keys to move, '?' for help, 'q' to quit, '<-' to go back."
+msgstr "Komennot: Käytä nuolia liikkumiseen, â€?†opastaa, â€q†lopettaa, â€â†â€ palaa."
+
+#. #define MOREHELP
+#: LYMessages.c:49
+msgid "-- press space for more, use arrow keys to move, '?' for help, 'q' to quit."
+msgstr "-- välilyönnillä lisää, käytä nuolia liikkumiseen, â€?†opastaa, â€q†lopettaa."
+
+#: LYMessages.c:50
+msgid "-- press space for next page --"
+msgstr "-- välilyönnillä seuraava sivu --"
+
+#: LYMessages.c:51
+msgid "URL too long"
+msgstr "Liian pitkä URL"
+
+#. Inactive input fields, messages used with -tna option - kw
+#. #define FORM_LINK_TEXT_ADV_MSG_INA
+#: LYMessages.c:57
+#, c-format
+msgid "(Textfield \"%s\"); Inactive. Press <return> to activate."
+msgstr "(Tekstikenttä \"%s\"); Ei aktiivinen. <Return> aktivoi."
+
+#. #define FORM_LINK_TEXT_MESSAGE_INA
+#: LYMessages.c:59
+msgid "(Text entry field) Inactive. Press <return> to activate."
+msgstr "(Tekstikenttä) Ei aktiivinen. <Return> aktivoi."
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG_INA
+#: LYMessages.c:61
+#, c-format
+msgid "(Textarea \"%s\"); Inactive. Press <return> to activate."
+msgstr "(Tekstialue \"%s\"); Ei aktiivinen. <Return> aktivoi."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_INA
+#: LYMessages.c:63
+msgid "(Textarea) Inactive. Press <return> to activate."
+msgstr "(Tekstialue) Ei aktiivinen. <Return> aktivoi."
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG_INA_E
+#: LYMessages.c:65
+#, c-format
+msgid "(Textarea \"%s\"); Inactive. Press <return> to activate (%s for editor)."
+msgstr "(Tekstialue \"%s\"); Ei aktiivinen. <Return> aktivoi (%s muokkaimeen)."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_INA_E
+#: LYMessages.c:67
+#, c-format
+msgid "(Textarea) Inactive. Press <return> to activate (%s for editor)."
+msgstr "(Tekstialue) Ei aktiivinen. <Return> aktivoi (%s muokkaimeen)."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE_INA
+#: LYMessages.c:69
+msgid "(Form field) Inactive. Use <return> to edit."
+msgstr "(Lomakekenttä) Ei aktiivinen. <Return> muokkaa."
+
+#. #define FORM_TEXT_SUBMIT_MESSAGE_INA_X
+#: LYMessages.c:71
+#, c-format
+msgid "(Form field) Inactive. Use <return> to edit (%s to submit with no cache)."
+msgstr "(Lomakekenttä) Ei aktiivinen. <Return> muokkaa (%s lähettää välimuistitta)."
+
+#. #define FORM_TEXT_RESUBMIT_MESSAGE_INA
+#: LYMessages.c:73
+msgid "(Form field) Inactive. Press <return> to edit, press <return> twice to submit."
+msgstr "(Lomakekenttä) Ei aktiivinen. <Return> muokkaa, <return> kahdesti lähettää."
+
+#. #define FORM_TEXT_SUBMIT_MAILTO_MSG_INA
+#: LYMessages.c:75
+msgid "(mailto form field) Inactive. Press <return> to change."
+msgstr "(mailto-lomakekenttä) Ei aktiivinen. <Return> muuttaa."
+
+#. #define FORM_LINK_PASSWORD_MESSAGE_INA
+#: LYMessages.c:77
+msgid "(Password entry field) Inactive. Press <return> to activate."
+msgstr "(Salasanakenttä) Ei aktiivinen. <Return> aktivoi."
+
+#. #define FORM_LINK_FILE_UNM_MSG
+#: LYMessages.c:80
+msgid "UNMODIFIABLE file entry field. Use UP or DOWN arrows or tab to move off."
+msgstr "EI-MUUTETTAVA kenttä. Ylä-/alanuolella tai sarkaimella pois."
+
+#. #define FORM_LINK_FILE_MESSAGE
+#: LYMessages.c:82
+msgid "(File entry field) Enter filename. Use UP or DOWN arrows or tab to move off."
+msgstr "(Tiedostokenttä) Kirjoita tiedostonimi. Ylä-/alanuolella tai sarkaimella pois."
+
+#. #define FORM_LINK_TEXT_ADV_MSG
+#. #define FORM_LINK_TEXT_MESSAGE
+#: LYMessages.c:84 LYMessages.c:86
+#, c-format
+msgid "(Textfield \"%s\"); Enter text. Use UP or DOWN arrows or tab to move off."
+msgstr "(Tekstikenttä \"%s\"); Kirjoita tekstiä. Ylä-/alanuolella tai sarkaimella pois."
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG
+#: LYMessages.c:88
+#, c-format
+msgid "(Textarea \"%s\"); Enter text. Use UP/DOWN arrows or TAB to move off."
+msgstr "(Tekstialue \"%s\"); Kirjoita tekstiä. Ylä-/alanuolella tai sarkaimella pois."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE
+#: LYMessages.c:90
+msgid "(Textarea) Enter text. Use UP/DOWN arrows or TAB to move off."
+msgstr "(Tekstialue) Kirjoita tekstiä. Ylä-/alanuolella tai sarkaimella pois."
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG_E
+#: LYMessages.c:92
+#, c-format
+msgid "(Textarea \"%s\"); Enter text. Use UP/DOWN arrows or TAB to move off (%s for editor)."
+msgstr "(Tekstialue \"%s\"); Kirjoita tekstiä. Ylä-/alanuolella tai sarkaimella pois (%s muokkaimeen)."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_E
+#: LYMessages.c:94
+#, c-format
+msgid "(Textarea) Enter text. Use UP/DOWN arrows or TAB to move off (%s for editor)."
+msgstr "(Tekstialue) Kirjoita tekstiä. Ylä-/alanuolella tai sarkaimella pois (%s muokkaimeen)."
+
+#. #define FORM_LINK_TEXT_UNM_MSG
+#: LYMessages.c:96
+msgid "UNMODIFIABLE form text field. Use UP or DOWN arrows or tab to move off."
+msgstr "EI-MUUTETTAVA tekstikenttä. Ylä-/alanuolella tai sarkaimella pois."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE
+#: LYMessages.c:98
+msgid "(Form field) Enter text. Use <return> to submit."
+msgstr "(Lomakekenttä) Kirjoita tekstiä. <Return> lähettää."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE_X
+#: LYMessages.c:100
+#, c-format
+msgid "(Form field) Enter text. Use <return> to submit (%s for no cache)."
+msgstr "(Lomakekenttä) Kirjoita tekstiä. <Return> lähettää (%s välimuistitta)."
+
+#. #define FORM_LINK_TEXT_RESUBMIT_MESSAGE
+#: LYMessages.c:102
+msgid "(Form field) Enter text. Use <return> to submit, arrows or tab to move off."
+msgstr "(Lomakekenttä) Kirjoita tekstiä. <Return> lähettää, nuolilla tai sarkaimella pois."
+
+#. #define FORM_LINK_TEXT_SUBMIT_UNM_MSG
+#: LYMessages.c:104
+msgid "UNMODIFIABLE form field. Use UP or DOWN arrows or tab to move off."
+msgstr "EI-MUUTETTAVA kenttä. Ylä-/alanuolella tai sarkaimella pois."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MAILTO_MSG
+#: LYMessages.c:106
+msgid "(mailto form field) Enter text. Use <return> to submit, arrows to move off."
+msgstr "(mailto-lomakekenttä) Kirjoita tekstiä. <Return> lähettää, nuolilla pois."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MAILTO_DIS_MSG
+#: LYMessages.c:108
+msgid "(mailto form field) Mail is disallowed so you cannot submit."
+msgstr "(mailto-lomakekenttä) Posti ei ole sallittu, joten ei voida lähettää."
+
+#. #define FORM_LINK_PASSWORD_MESSAGE
+#: LYMessages.c:110
+msgid "(Password entry field) Enter text. Use UP or DOWN arrows or tab to move off."
+msgstr "(Salasanakenttä) Kirjoita tekstiä. Ylä-/alanuolella tai sarkaimella pois."
+
+#. #define FORM_LINK_PASSWORD_UNM_MSG
+#: LYMessages.c:112
+msgid "UNMODIFIABLE form password. Use UP or DOWN arrows or tab to move off."
+msgstr "EI-MUUTETTAVA salasana. Ylä-/alanuolella tai sarkaimella pois."
+
+#. #define FORM_LINK_CHECKBOX_ADV_MSG
+#: LYMessages.c:114
+#, c-format
+msgid "(Checkbox \"%s\"); Use right-arrow or <return> to toggle."
+msgstr "(Valintaruutu \"%s\"); Oikea nuoli tai <return> valitsee."
+
+#. #define FORM_LINK_CHECKBOX_MESSAGE
+#: LYMessages.c:116
+msgid "(Checkbox Field) Use right-arrow or <return> to toggle."
+msgstr "(Valintaruutu) Oikea nuoli tai <return> valitsee."
+
+#. #define FORM_LINK_CHECKBOX_UNM_MSG
+#: LYMessages.c:118
+msgid "UNMODIFIABLE form checkbox. Use UP or DOWN arrows or tab to move off."
+msgstr "EI-MUUTETTAVA valintaruutu. Ylä-/alanuolella tai sarkaimella pois."
+
+#. #define FORM_LINK_RADIO_ADV_MSG
+#: LYMessages.c:120
+#, c-format
+msgid "(Radio Button \"%s\"); Use right-arrow or <return> to toggle."
+msgstr "(Radiopainike \"%s\"); Oikea nuoli tai <return> valitsee."
+
+#. #define FORM_LINK_RADIO_MESSAGE
+#: LYMessages.c:122
+msgid "(Radio Button) Use right-arrow or <return> to toggle."
+msgstr "(Radiopainike) Oikea nuoli tai <return> valitsee."
+
+#. #define FORM_LINK_RADIO_UNM_MSG
+#: LYMessages.c:124
+msgid "UNMODIFIABLE form radio button. Use UP or DOWN arrows or tab to move off."
+msgstr "EI-MUUTETTAVA valintapainike. Ylä-/alanuolella tai sarkaimella pois."
+
+#. #define FORM_LINK_SUBMIT_PREFIX
+#: LYMessages.c:126
+msgid "Submit ('x' for no cache) to "
+msgstr "Lähetä (â€x†välimuistitta) kohteeseen "
+
+#. #define FORM_LINK_RESUBMIT_PREFIX
+#: LYMessages.c:128
+msgid "Submit to "
+msgstr "Lähetä kohteeseen "
+
+#. #define FORM_LINK_SUBMIT_MESSAGE
+#: LYMessages.c:130
+msgid "(Form submit button) Use right-arrow or <return> to submit ('x' for no cache)."
+msgstr "(Lomakkeenlähetyspainike) Oikea nuoli tai <return> lähettää (â€x†välimuistitta)."
+
+#. #define FORM_LINK_RESUBMIT_MESSAGE
+#: LYMessages.c:132
+msgid "(Form submit button) Use right-arrow or <return> to submit."
+msgstr "(Lomakkeenlähetyspainike) Oikea nuoli tai <return> lähettää."
+
+#. #define FORM_LINK_SUBMIT_DIS_MSG
+#: LYMessages.c:134
+msgid "DISABLED form submit button. Use UP or DOWN arrows or tab to move off."
+msgstr "KÄYTÖSTÄ POISTETTU lomakkeenlähetyspainike. Ylä-/alanuolella tai sarkaimella pois."
+
+#. #define FORM_LINK_SUBMIT_MAILTO_PREFIX
+#: LYMessages.c:136
+msgid "Submit mailto form to "
+msgstr "Lähetä mailto-lomake osoitteeseen "
+
+#. #define FORM_LINK_SUBMIT_MAILTO_MSG
+#: LYMessages.c:138
+msgid "(mailto form submit button) Use right-arrow or <return> to submit."
+msgstr "(mailto-lomakkeenlähetyspainike) Oikea nuoli tai <return> lähettää."
+
+#. #define FORM_LINK_SUBMIT_MAILTO_DIS_MSG
+#: LYMessages.c:140
+msgid "(mailto form submit button) Mail is disallowed so you cannot submit."
+msgstr "(mailto-lomakkeenlähetyspainike) Sähköposti on poistettu käytöstä, ei voida lähettää."
+
+#. #define FORM_LINK_RESET_MESSAGE
+#: LYMessages.c:142
+msgid "(Form reset button) Use right-arrow or <return> to reset form to defaults."
+msgstr "(Lomakkeen nollauspainike) Oikea nuoli tai <return> tyhjentää lomakkeen."
+
+#. #define FORM_LINK_RESET_DIS_MSG
+#: LYMessages.c:144
+msgid "DISABLED form reset button. Use UP or DOWN arrows or tab to move off."
+msgstr "KÄYTÖSTÄ POISTETTU lomakkeen nollauspainike. Ylä-/alanuolella tai sarkaimella pois."
+
+#. #define FORM_LINK_BUTTON_MESSAGE
+#: LYMessages.c:146
+msgid "(Script button) Use UP or DOWN arrows or tab to move off."
+msgstr "(Skriptipainike) Ylä-/alanuolella tai sarkaimella pois."
+
+#. #define FORM_LINK_BUTTON_ADV_MSG
+#: LYMessages.c:148
+#, c-format
+msgid "(Script button \"%s\"); Use UP or DOWN arrows or tab to move off."
+msgstr "(Skriptipainike \"%s\"); Ylä-/alanuolella tai sarkaimella pois."
+
+#. #define FORM_LINK_BUTTON_DIS_MSG
+#: LYMessages.c:150
+msgid "DISABLED Script button. Use UP or DOWN arrows or tab to move off."
+msgstr "KÄYTÖSTÄ POISTETTU skriptipainike. Ylä-/alanuolella tai sarkaimella pois."
+
+# Pudotusvalikko on aika vapaa suomennos option listille...
+# 17.08.2012: Vaihdoin sen "valintaluetteloksi".
+#. #define FORM_LINK_OPTION_LIST_ADV_MSG
+#: LYMessages.c:152
+#, c-format
+msgid "(Option list \"%s\"); Hit return to select option."
+msgstr "(Valintaluettelo \"%s\"); Valitse painamalla return."
+
+# Pudotusvalikko on aika vapaa suomennos option listille...
+# 17.08.2012: Vaihdoin sen "valintaluetteloksi".
+#. #define FORM_LINK_OPTION_LIST_MESSAGE
+#: LYMessages.c:154
+msgid "(Option list) Hit return and use arrow keys and return to select option."
+msgstr "(Valintaluettelo) Paina <return>, tee valinta nuolinäppäimillä ja valitse painamalla <return>."
+
+#. #define CHOICE_LIST_ADV_MSG
+#: LYMessages.c:156
+#, c-format
+msgid "(Choice entry \"%s\"); Use arrow keys and return to select option."
+msgstr "(Valintaluettelo \"%s\") Tee valinta nuolinäppäimillä ja valitse painamalla <return>."
+
+#. #define CHOICE_LIST_MESSAGE
+#: LYMessages.c:158
+msgid "(Choice list) Hit return and use arrow keys and return to select option."
+msgstr "(Valintaluettelo) Paina <return>, tee valinta nuolinäppäimillä ja valitse painamalla <return>."
+
+#. #define MOUSE_CHOICE_MESSAGE
+#: LYMessages.c:160
+msgid "Left mouse button or return to select, arrow keys to scroll."
+msgstr ""
+
+#. #define FORM_LINK_OPTION_LIST_UNM_MSG
+#: LYMessages.c:162
+msgid "UNMODIFIABLE option list. Use return or arrow keys to review or leave."
+msgstr "EI-MUOKATTAVA valintaluettelo. Returnillä tai nuolinäppäimillä tarkastelee tai poistuu."
+
+#. #define CHOICE_LIST_UNM_MSG
+#: LYMessages.c:164
+msgid "UNMODIFIABLE choice list. Use return or arrow keys to review or leave."
+msgstr "EI-MUOKATTAVA valintaluettelo. Returnillä tai nuolinäppäimillä tarkastelee tai poistuu."
+
+#: LYMessages.c:165
+msgid "Submitting form..."
+msgstr "Lähetetään lomaketta…"
+
+#: LYMessages.c:166
+msgid "Resetting form..."
+msgstr "Tyhjennetään lomaketta…"
+
+#. #define RELOADING_FORM
+#: LYMessages.c:168
+msgid "Reloading document. Any form entries will be lost!"
+msgstr "Sivu ladataan uudelleen. Kaikki lomaketiedot katoavat!"
+
+#. #define LINK_NOT_IN_FORM
+#: LYMessages.c:170
+msgid "The current link is not in a FORM"
+msgstr "Nykyinen linkki ei ole LOMAKKEESSA"
+
+#: LYMessages.c:171
+#, c-format
+msgid "Warning: Cannot transcode form data to charset %s!"
+msgstr "Varoitus: Ei voida muuntaa lomaketietoja merkistöön %s!"
+
+#. #define NORMAL_LINK_MESSAGE
+#: LYMessages.c:174
+msgid "(NORMAL LINK) Use right-arrow or <return> to activate."
+msgstr "(NORMAALI LINKKI) Oikea nuoli tai <return> valitsee."
+
+#: LYMessages.c:175
+msgid "The resource requested is not available at this time."
+msgstr "Pyydetty resurssi ei ole saatavissa tällä hetkellä."
+
+#: LYMessages.c:176
+msgid "Enter Lynx keystroke command: "
+msgstr "Kirjoita Lynxin näppäinkomento: "
+
+#: LYMessages.c:177
+msgid "Looking up "
+msgstr "Etsitään "
+
+#: LYMessages.c:178
+#, c-format
+msgid "Getting %s"
+msgstr "Haetaan %s"
+
+#: LYMessages.c:179
+#, c-format
+msgid "Skipping %s"
+msgstr "Ohitetaan %s"
+
+#: LYMessages.c:180
+#, c-format
+msgid "Using %s"
+msgstr "Käytetään %s"
+
+#: LYMessages.c:181
+#, c-format
+msgid "Illegal URL: %s"
+msgstr "Virheellinen URL: %s"
+
+#: LYMessages.c:182
+#, c-format
+msgid "Badly formed address %s"
+msgstr "Vääränmuotoinen osoite %s"
+
+#: LYMessages.c:183
+#, c-format
+msgid "URL: %s"
+msgstr "URL: %s"
+
+#: LYMessages.c:184
+msgid "Unable to access WWW file!!!"
+msgstr "WWW-tiedoston käyttö ei onnistu!!!"
+
+#: LYMessages.c:185
+#, c-format
+msgid "This is a searchable index. Use %s to search."
+msgstr "Tämä on etsittävä indeksi. %s etsii."
+
+#. #define WWW_INDEX_MORE_MESSAGE
+#: LYMessages.c:187
+#, c-format
+msgid "--More-- This is a searchable index. Use %s to search."
+msgstr "--Lisää-- Tämä on etsittävä indeksi. %s etsii."
+
+#: LYMessages.c:188
+msgid "You have entered an invalid link number."
+msgstr "Syötit virheellisen linkin numeron."
+
+#. #define SOURCE_HELP
+#: LYMessages.c:190
+msgid "Currently viewing document source. Press '\\' to return to rendered version."
+msgstr "Katsot asiakirjan lähdekoodia. Palaa tavalliseen versioon painamalla â€\\â€."
+
+#. #define NOVICE_LINE_ONE
+#: LYMessages.c:192
+msgid " Arrow keys: Up and Down to move. Right to follow a link; Left to go back. \n"
+msgstr " Nuolinapit: Ylös/alas liikkumiseen. Oikea seuraa linkkiä, vasen palaa. \n"
+
+#. #define NOVICE_LINE_TWO
+#: LYMessages.c:194
+msgid " H)elp O)ptions P)rint G)o M)ain screen Q)uit /=search [delete]=history list \n"
+msgstr " H) Ohje O) Asetukset P) Tulosta G) Mene M) Aloitussivu Q) Lopeta /=etsi [delete]=sivuhistoria\n"
+
+# [delete]=jotain
+#. #define NOVICE_LINE_TWO_A
+#: LYMessages.c:196
+msgid " O)ther cmds H)elp K)eymap G)oto P)rint M)ain screen o)ptions Q)uit \n"
+msgstr "O) Muut käskyt H) Ohje K) Näppäimet G) Mene M) Aloitussivu O) Asetukset Q) Lopeta\n"
+
+#. #define NOVICE_LINE_TWO_B
+#: LYMessages.c:198
+msgid " O)ther cmds B)ack E)dit D)ownload ^R)eload ^W)ipe screen search doc: / \n"
+msgstr "O) Muut käskyt B) Takaisin E) Muokkaa D) Imuroi ^R) Lataa uud. ^W) Tyhjennä etsi: /\n"
+
+#. #define NOVICE_LINE_TWO_C
+#: LYMessages.c:200
+msgid "O)ther cmds C)omment History: <backspace> Bookmarks: V)iew, A)dd, R)emove \n"
+msgstr "O) Muut käskyt C) Kommentti Historia: <askelpal.> Kirjanmerkit: V) Katso A) Lisää R) Poista\n"
+
+#. #define FORM_NOVICELINE_ONE
+#: LYMessages.c:202
+msgid " Enter text into the field by typing on the keyboard "
+msgstr " Kirjoita kenttään tekstiä näppäimistöä käyttäen "
+
+#. #define FORM_NOVICELINE_TWO
+#: LYMessages.c:204
+msgid " Ctrl-U to delete all text in field, [Backspace] to delete a character "
+msgstr " Ctrl-U tyhjentää kentän, [askelpalautin] poistaa merkin "
+
+#. #define FORM_NOVICELINE_TWO_DELBL
+#: LYMessages.c:206
+msgid " Ctrl-U to delete text in field, [Backspace] to delete a character "
+msgstr " Ctrl-U tyhjentää kentän, [askelpalautin] poistaa merkin "
+
+#. #define FORM_NOVICELINE_TWO_VAR
+#: LYMessages.c:208
+#, c-format
+msgid " %s to delete all text in field, [Backspace] to delete a character "
+msgstr " %s tyhjentää kentän, [askelpalautin] poistaa merkin "
+
+#. #define FORM_NOVICELINE_TWO_DELBL_VAR
+#: LYMessages.c:210
+#, c-format
+msgid " %s to delete text in field, [Backspace] to delete a character "
+msgstr " %s tyhjentää kentän, [askelpalautin] poistaa merkin "
+
+#. mailto
+#: LYMessages.c:213
+msgid "Malformed mailto form submission! Cancelled!"
+msgstr "Vääränmuotoinen mailto-lomakkeen lähetys! Peruutettu!"
+
+#: LYMessages.c:214
+msgid "Warning! Control codes in mail address replaced by ?"
+msgstr "Varoitus! Ohjauskoodit osoitteessa on korvattu merkillä ?"
+
+#: LYMessages.c:215
+msgid "Mail disallowed! Cannot submit."
+msgstr "Sähköposti ei sallittu! Ei voida lähettää."
+
+#: LYMessages.c:216
+msgid "Mailto form submission failed!"
+msgstr "Mailto-lomakkeen lähetys epäonnistui!"
+
+#: LYMessages.c:217
+msgid "Mailto form submission Cancelled!!!"
+msgstr "Mailto-lomakkeen lähetys peruutettu!"
+
+#: LYMessages.c:218
+msgid "Sending form content..."
+msgstr "Lähetetään lomakkeen sisältöä…"
+
+#: LYMessages.c:219
+msgid "No email address is present in mailto URL!"
+msgstr "Mailto-URL:ssa ei ole sähköpostiosoitetta!"
+
+#. #define MAILTO_URL_TEMPOPEN_FAILED
+#: LYMessages.c:221
+msgid "Unable to open temporary file for mailto URL!"
+msgstr "Ei voitu avata tilapäistiedostoa mailto-URL:lle!"
+
+#. #define INC_ORIG_MSG_PROMPT
+#: LYMessages.c:223
+msgid "Do you wish to include the original message?"
+msgstr "Haluatko sisällyttää alkuperäisen viestin?"
+
+#. #define INC_PREPARSED_MSG_PROMPT
+#: LYMessages.c:225
+msgid "Do you wish to include the preparsed source?"
+msgstr "Haluatko sisällyttää esijäsennellyn lähdekoodin?"
+
+#. #define SPAWNING_EDITOR_FOR_MAIL
+#: LYMessages.c:227
+msgid "Spawning your selected editor to edit mail message"
+msgstr "Käynnistetään valitsemasi muokkain viestin kirjoittamiseksi"
+
+#. #define ERROR_SPAWNING_EDITOR
+#: LYMessages.c:229
+msgid "Error spawning editor, check your editor definition in the options menu"
+msgstr "Virhe käynnistettäessä muokkainta, tarkista asetus valinnat-valikossa"
+
+#: LYMessages.c:230
+msgid "Send this comment?"
+msgstr "Lähetetäänkö tämä kommentti?"
+
+#: LYMessages.c:231
+msgid "Send this message?"
+msgstr "Lähetetäänkö tämä viesti?"
+
+#: LYMessages.c:232
+msgid "Sending your message..."
+msgstr "Lähetetään viestiäsi…"
+
+#: LYMessages.c:233
+msgid "Sending your comment:"
+msgstr "Lähetetään kommenttiasi:"
+
+#. textarea
+#: LYMessages.c:236
+msgid "Not in a TEXTAREA; cannot use external editor."
+msgstr "Ei TEKSTIALUEESSA; ulkoista muokkainta ei voi käyttää."
+
+#: LYMessages.c:237
+msgid "Not in a TEXTAREA; cannot use command."
+msgstr "Ei TEKSTIALUEESSA; komentoa ei voi käyttää."
+
+#: LYMessages.c:239
+msgid "file: ACTIONs are disallowed!"
+msgstr "file: TOIMINNOT eivät ole sallittuja!"
+
+#. #define FILE_SERVED_LINKS_DISALLOWED
+#: LYMessages.c:241
+msgid "file: URLs via served links are disallowed!"
+msgstr "file: URL:t linkeistä eivät ole sallittuja!"
+
+#: LYMessages.c:242
+msgid "Access to local files denied."
+msgstr "Pääsy paikallisiin tiedostoihin estetty."
+
+#: LYMessages.c:243
+msgid "file: URLs via bookmarks are disallowed!"
+msgstr "file: URL:t kirjanmerkeistä eivät ole sallittuja!"
+
+#. #define SPECIAL_VIA_EXTERNAL_DISALLOWED
+#: LYMessages.c:245
+msgid "This special URL is not allowed in external documents!"
+msgstr "Tämä erityisverkko-osoite ei ole sallittu ulkoisissa asiakirjoissa!"
+
+#: LYMessages.c:246
+msgid "Press <return> to return to Lynx."
+msgstr "Paina <return> palataksesi Lynxiin."
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:249
+msgid "Spawning DCL subprocess. Use 'logout' to return to Lynx.\n"
+msgstr "Käynnistetään DCL-aliprosessi. Palaa Lynxiin komennolla â€logoutâ€.\n"
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:253
+msgid "Type EXIT to return to Lynx.\n"
+msgstr "Kirjoita EXIT palataksesi Lynxiin.\n"
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:256
+msgid "Spawning your default shell. Use 'exit' to return to Lynx.\n"
+msgstr "Käynnistetään oletuskuori. Palaa Lynxiin komennolla â€exitâ€.\n"
+
+#: LYMessages.c:259
+msgid "Spawning is currently disabled."
+msgstr "Prosessien käynnistäminen poistettu käytöstä."
+
+#: LYMessages.c:260
+msgid "The 'd'ownload command is currently disabled."
+msgstr "â€D†lataa -komento on tällä hetkellä pois käytöstä."
+
+#: LYMessages.c:261
+msgid "You cannot download an input field."
+msgstr "Ei voida ladata syöttökenttää."
+
+#: LYMessages.c:262
+msgid "Form has a mailto action! Cannot download."
+msgstr "Lomakkeella on mailto-toiminto! Ei voida ladata."
+
+#: LYMessages.c:263
+msgid "You cannot download a mailto: link."
+msgstr "Ei voida ladata mailto-linkkiä."
+
+#: LYMessages.c:264
+msgid "You cannot download cookies."
+msgstr "Ei voida ladata evästeitä."
+
+#: LYMessages.c:265
+msgid "You cannot download a printing option."
+msgstr "Ei voida ladata tulostusvalintaa."
+
+#: LYMessages.c:266
+msgid "You cannot download an upload option."
+msgstr "Ei voida ladata lähetysvalintaa."
+
+#: LYMessages.c:267
+msgid "You cannot download an permit option."
+msgstr "Ei voida ladata sallimisvaihtoehtoa."
+
+#: LYMessages.c:268
+msgid "This special URL cannot be downloaded!"
+msgstr "Tätä erityis-URL:ia ei voi ladata!"
+
+#: LYMessages.c:269
+msgid "Nothing to download."
+msgstr "Ei mitään ladattavaa."
+
+#: LYMessages.c:270
+msgid "Trace ON!"
+msgstr "Jäljitys PÄÄLLÄ!"
+
+#: LYMessages.c:271
+msgid "Trace OFF!"
+msgstr "Jäljitys POIS!"
+
+#. #define CLICKABLE_IMAGES_ON
+#: LYMessages.c:273
+msgid "Links will be included for all images! Reloading..."
+msgstr "Linkit sisällytetään kaikille kuville! Ladataan uudelleen…"
+
+#. #define CLICKABLE_IMAGES_OFF
+#: LYMessages.c:275
+msgid "Standard image handling restored! Reloading..."
+msgstr "Peruskuvanhallinta palautettu! Ladataan uudelleen…"
+
+#. #define PSEUDO_INLINE_ALTS_ON
+#: LYMessages.c:277
+msgid "Pseudo_ALTs will be inserted for inlines without ALT strings! Reloading..."
+msgstr "Yhdelle riville sijoittuville kuville ilman vaihtoehtoista tekstiä lisätään pseudo- vaihtoehtoiset tekstit! Ladataan uudelleen…"
+
+#. #define PSEUDO_INLINE_ALTS_OFF
+#: LYMessages.c:279
+msgid "Inlines without an ALT string specified will be ignored! Reloading..."
+msgstr "Yhdelle riville sijoittuvat kuvat ilman vaihtoehtoista tekstiä ohitetaan! Ladataan uudelleen…"
+
+#: LYMessages.c:280
+msgid "Raw 8-bit or CJK mode toggled OFF! Reloading..."
+msgstr "Raaka 8-bittinen tai CJK-tila POIS PÄÄLTÄ! Ladataan uudelleen…"
+
+#: LYMessages.c:281
+msgid "Raw 8-bit or CJK mode toggled ON! Reloading..."
+msgstr "Raaka 8-bittinen tai CJK-tila PÄÄLLÄ! Ladataan uudelleen…"
+
+#. #define HEAD_D_L_OR_CANCEL
+#: LYMessages.c:283
+msgid "Send HEAD request for D)ocument or L)ink, or C)ancel? (d,l,c): "
+msgstr "Lähetä HEAD-pyyntö D)okumentille vai L)inkille vai C) peruuta (d,l,c):"
+
+#. #define HEAD_D_OR_CANCEL
+#: LYMessages.c:285
+msgid "Send HEAD request for D)ocument, or C)ancel? (d,c): "
+msgstr "Lähetä HEAD-pyyntö D)okumentille vai C) peruuta? (d,c): "
+
+#: LYMessages.c:286
+msgid "Sorry, the document is not an http URL."
+msgstr "Asiakirja ei ole http-URL."
+
+#: LYMessages.c:287
+msgid "Sorry, the link is not an http URL."
+msgstr "Linkki ei ole http-URL."
+
+#: LYMessages.c:288
+msgid "Sorry, the ACTION for this form is disabled."
+msgstr "Tämän lomakkeen ACTION on poistettu käytöstä."
+
+#. #define FORM_ACTION_NOT_HTTP_URL
+#: LYMessages.c:290
+msgid "Sorry, the ACTION for this form is not an http URL."
+msgstr "Tämän lomakkeen ACTION ei ole http-URL."
+
+#: LYMessages.c:291
+msgid "Not an http URL or form ACTION!"
+msgstr "Ei ole http-URL tai lomakkeen ACTION!"
+
+#: LYMessages.c:292
+msgid "This special URL cannot be a form ACTION!"
+msgstr "Tämä erityis-URL ei voi olla lomakkeen ACTION!"
+
+#: LYMessages.c:293
+msgid "URL is not in starting realm!"
+msgstr ""
+
+#: LYMessages.c:294
+msgid "News posting is disabled!"
+msgstr ""
+
+#: LYMessages.c:295
+msgid "File management support is disabled!"
+msgstr "Tiedostonhallintatuki ei käytössä!"
+
+#: LYMessages.c:296
+msgid "No jump file is currently available."
+msgstr "Hyppytiedostoa ei ole saatavilla."
+
+#: LYMessages.c:297
+msgid "Jump to (use '?' for list): "
+msgstr "Hyppää (�†listaan): "
+
+#: LYMessages.c:298
+msgid "Jumping to a shortcut URL is disallowed!"
+msgstr "Hyppääminen oikotie-URL:iin ei ole sallittu!"
+
+#: LYMessages.c:299
+msgid "Random URL is disallowed! Use a shortcut."
+msgstr "Satunnainen URL ei ole sallittu! Käytä oikotietä."
+
+#: LYMessages.c:300
+msgid "No random URLs have been used thus far."
+msgstr "Tähän mennessä satunnaisia URL-osoitteita ei ole käytetty."
+
+#: LYMessages.c:301
+msgid "Bookmark features are currently disabled."
+msgstr "Kirjanmerkkiominaisuudet eivät käytössä."
+
+#: LYMessages.c:302
+msgid "Execution via bookmarks is disabled."
+msgstr "Suoritus kirjanmerkkien kautta on pois käytöstä."
+
+#. #define BOOKMARK_FILE_NOT_DEFINED
+#: LYMessages.c:304
+#, c-format
+msgid "Bookmark file is not defined. Use %s to see options."
+msgstr "Kirjanmerkkitiedostoa ei ole määritelty. %s näyttää vaihtoehdot."
+
+#. #define NO_TEMP_FOR_HOTLIST
+#: LYMessages.c:306
+msgid "Unable to open tempfile for X Mosaic hotlist conversion."
+msgstr ""
+
+#: LYMessages.c:307
+msgid "ERROR - unable to open bookmark file."
+msgstr "VIRHE - kirjanmerkkitiedoston avaaminen epäonnistui."
+
+#. #define BOOKMARK_OPEN_FAILED_FOR_DEL
+#: LYMessages.c:309
+msgid "Unable to open bookmark file for deletion of link."
+msgstr "Kirjanmerkkitiedostoa ei voida avata linkin poistamista varten."
+
+#. #define BOOKSCRA_OPEN_FAILED_FOR_DEL
+#: LYMessages.c:311
+msgid "Unable to open scratch file for deletion of link."
+msgstr ""
+
+#: LYMessages.c:313
+msgid "Error renaming scratch file."
+msgstr ""
+
+#: LYMessages.c:315
+msgid "Error renaming temporary file."
+msgstr "Virhe tilapäistiedoston uudelleennimeämisessä."
+
+#. #define BOOKTEMP_COPY_FAIL
+#: LYMessages.c:317
+msgid "Unable to copy temporary file for deletion of link."
+msgstr ""
+
+#. #define BOOKTEMP_REOPEN_FAIL_FOR_DEL
+#: LYMessages.c:319
+msgid "Unable to reopen temporary file for deletion of link."
+msgstr ""
+
+#. #define BOOKMARK_LINK_NOT_ONE_LINE
+#: LYMessages.c:322
+msgid "Link is not by itself all on one line in bookmark file."
+msgstr ""
+
+#: LYMessages.c:323
+msgid "Bookmark deletion failed."
+msgstr "Kirjanmerkin poisto epäonnistui."
+
+#. #define BOOKMARKS_NOT_TRAVERSED
+#: LYMessages.c:325
+msgid "Bookmark files cannot be traversed (only http URLs)."
+msgstr ""
+
+#. #define BOOKMARKS_NOT_OPEN
+#: LYMessages.c:327
+msgid "Unable to open bookmark file, use 'a' to save a link first"
+msgstr "Kirjanmerkkitiedoston avaaminen ei onnistunut, tallenna linkki ensin näppäimellä â€aâ€."
+
+#: LYMessages.c:328
+msgid "There are no links in this bookmark file!"
+msgstr "Tässä kirjanmerkkitiedostossa ei ole linkkejä!"
+
+#. #define CACHE_D_OR_CANCEL
+#: LYMessages.c:330
+msgid "D)elete cached document or C)ancel? (d,c): "
+msgstr "D) Poista välimuistissa oleva asiakirja vai C) peruuta? (d,c):"
+
+#. #define BOOK_D_L_OR_CANCEL
+#: LYMessages.c:332
+msgid "Save D)ocument or L)ink to bookmark file or C)ancel? (d,l,c): "
+msgstr "Tallenna D) asiakirja, L)inkki kirjanmerkkeihin vai C) peruuta? (d,l,c): "
+
+#: LYMessages.c:333
+msgid "Save D)ocument to bookmark file or C)ancel? (d,c): "
+msgstr "Tallenna D) asiakirja kirjanmerkkeihin vai C) peruuta? (d,c)?"
+
+#: LYMessages.c:334
+msgid "Save L)ink to bookmark file or C)ancel? (l,c): "
+msgstr "Tallenna L)inkki kirjanmerkkeihin vai C) peruuta? (l,c):"
+
+#. #define NOBOOK_POST_FORM
+#: LYMessages.c:336
+msgid "Documents from forms with POST content cannot be saved as bookmarks."
+msgstr ""
+
+#: LYMessages.c:337
+msgid "Cannot save form fields/links"
+msgstr "Ei voida tallentaa lomakekenttiä/linkkejä"
+
+#. #define NOBOOK_HSML
+#: LYMessages.c:339
+msgid "History, showinfo, menu and list files cannot be saved as bookmarks."
+msgstr "Historia-, showinfo-, valikko- tai listatiedostoja ei voi tallentaa kirjanmerkkeinä."
+
+#. #define CONFIRM_BOOKMARK_DELETE
+#: LYMessages.c:341
+msgid "Do you really want to delete this link from your bookmark file?"
+msgstr "Poistetaanko tämä linkki kirjanmerkeistä?"
+
+#: LYMessages.c:342
+msgid "Malformed address."
+msgstr "Vääränmuotoinen osoite."
+
+#. #define HISTORICAL_ON_MINIMAL_OFF
+#: LYMessages.c:344
+msgid "Historical comment parsing ON (Minimal is overridden)!"
+msgstr "Historiallinen kommenttien jäsentely PÄÄLLÄ (minimaalinen on ohitettu)!"
+
+#. #define HISTORICAL_OFF_MINIMAL_ON
+#: LYMessages.c:346
+msgid "Historical comment parsing OFF (Minimal is in effect)!"
+msgstr "Historiallinen kommenttien jäsentely POIS PÄÄLTÄ (minimaalinen on käytössä)!"
+
+#. #define HISTORICAL_ON_VALID_OFF
+#: LYMessages.c:348
+msgid "Historical comment parsing ON (Valid is overridden)!"
+msgstr "Historiallinen kommenttien jäsentely PÄÄLLÄ (pätevä on ohitettu)!"
+
+#. #define HISTORICAL_OFF_VALID_ON
+#: LYMessages.c:350
+msgid "Historical comment parsing OFF (Valid is in effect)!"
+msgstr "Historiallinen kommenttien jäsentely POIS PÄÄLTÄ (pätevä on käytössä)!"
+
+#. #define MINIMAL_ON_IN_EFFECT
+#: LYMessages.c:352
+msgid "Minimal comment parsing ON (and in effect)!"
+msgstr "Minimaalinen kommenttien jäsentely PÄÄLLÄ (ja voimassa)!"
+
+#. #define MINIMAL_OFF_VALID_ON
+#: LYMessages.c:354
+msgid "Minimal comment parsing OFF (Valid is in effect)!"
+msgstr "Minimaalinen kommenttien jäsentely POIS PÄÄLTÄ (pätevä on voimassa)!"
+
+#. #define MINIMAL_ON_BUT_HISTORICAL
+#: LYMessages.c:356
+msgid "Minimal comment parsing ON (but Historical is in effect)!"
+msgstr "Minimaalinen kommenttien jäsentely PÄÄLLÄ (mutta historiallinen on voimassa)!"
+
+#. #define MINIMAL_OFF_HISTORICAL_ON
+#: LYMessages.c:358
+msgid "Minimal comment parsing OFF (Historical is in effect)!"
+msgstr "Minimaalinen kommenttien jäsentely POIS PÄÄLTÄ (historiallinen on voimassa)!"
+
+#: LYMessages.c:359
+msgid "Soft double-quote parsing ON!"
+msgstr "Pehmeä lainausmerkkien jäsentely PÄÄLLÄ!"
+
+#: LYMessages.c:360
+msgid "Soft double-quote parsing OFF!"
+msgstr "Pehmeä lainausmerkkien jäsentely POIS PÄÄLTÄ!"
+
+#: LYMessages.c:361
+msgid "Now using TagSoup parsing of HTML."
+msgstr "Käytetään TagSoup-HTML-jäsennystä."
+
+#: LYMessages.c:362
+msgid "Now using SortaSGML parsing of HTML!"
+msgstr "Käytetään SortaSGML-HTML-jäsennystä!"
+
+#: LYMessages.c:363
+msgid "You are already at the end of this document."
+msgstr "Olet jo asiakirjan lopussa."
+
+#: LYMessages.c:364
+msgid "You are already at the beginning of this document."
+msgstr "Olet jo asiakirjan alussa."
+
+#: LYMessages.c:365
+#, c-format
+msgid "You are already at page %d of this document."
+msgstr "Olet jo asiakirjan sivulla %d."
+
+#: LYMessages.c:366
+#, c-format
+msgid "Link number %d already is current."
+msgstr "Linkki numero %d on jo valittu."
+
+#: LYMessages.c:367
+msgid "You are already at the first document"
+msgstr "Olet jo ensimmäisessä asiakirjassa"
+
+#: LYMessages.c:368
+msgid "There are no links above this line of the document."
+msgstr "Sivulla ei ole linkkejä ennen tätä riviä."
+
+#: LYMessages.c:369
+msgid "There are no links below this line of the document."
+msgstr "Sivulla ei ole linkkejä tämän rivin jälkeen."
+
+#. #define MAXLEN_REACHED_DEL_OR_MOV
+#: LYMessages.c:371
+msgid "Maximum length reached! Delete text or move off field."
+msgstr "Suurin pituus saavutettu! Poista tekstiä tai siirry pois kentästä."
+
+#. #define NOT_ON_SUBMIT_OR_LINK
+#: LYMessages.c:373
+msgid "You are not on a form submission button or normal link."
+msgstr "Ei olla lomakkeenlähetyspainikkeessa tai tavallisessa linkissä."
+
+#. #define NEED_CHECKED_RADIO_BUTTON
+#: LYMessages.c:375
+msgid "One radio button must be checked at all times!"
+msgstr "Jonkun valintapainikkeen on oltava koko ajan valittuna!"
+
+#: LYMessages.c:376
+msgid "No submit button for this form, submit single text field?"
+msgstr ""
+
+#: LYMessages.c:377
+msgid "Do you want to go back to the previous document?"
+msgstr "Haluatko palata edelliseen asiakirjaan?"
+
+#: LYMessages.c:378
+msgid "Use arrows or tab to move off of field."
+msgstr "Nuolilla tai sarkaimella pois."
+
+#. #define ENTER_TEXT_ARROWS_OR_TAB
+#: LYMessages.c:380
+msgid "Enter text. Use arrows or tab to move off of field."
+msgstr "Kirjoita tekstiä. Nuolilla tai sarkaimella pois."
+
+#: LYMessages.c:381
+msgid "** Bad HTML!! No form action defined. **"
+msgstr "** Virheellistä HTML:ää!! Lomakkeen toimintoa ei ole määritetty. **"
+
+#: LYMessages.c:382
+msgid "Bad HTML!! Unable to create popup window!"
+msgstr "Virheellistä HTML:ää!! Ponnahdusikkunaa ei voida luoda!"
+
+#: LYMessages.c:383
+msgid "Unable to create popup window!"
+msgstr "Ponnahdusikkunaa ei voida luoda!"
+
+#: LYMessages.c:384
+msgid "Goto a random URL is disallowed!"
+msgstr "Ei voida siirtyä satunnaiseen osoitteeseen!"
+
+#: LYMessages.c:385
+msgid "Goto a non-http URL is disallowed!"
+msgstr "Ei voida siirtyä ei-HTTP-osoitteisiin!"
+
+#: LYMessages.c:386
+#, c-format
+msgid "You are not allowed to goto \"%s\" URLs"
+msgstr "Ei voida siirtyä â€%sâ€-osoitteisiin"
+
+#: LYMessages.c:387
+msgid "URL to open: "
+msgstr "Avattava URL: "
+
+#: LYMessages.c:388
+msgid "Edit the current Goto URL: "
+msgstr ""
+
+#: LYMessages.c:389
+msgid "Edit the previous Goto URL: "
+msgstr ""
+
+#: LYMessages.c:390
+msgid "Edit a previous Goto URL: "
+msgstr ""
+
+#: LYMessages.c:391
+msgid "Current document has POST data."
+msgstr ""
+
+#: LYMessages.c:392
+msgid "Edit this document's URL: "
+msgstr "Muokkaa asiakirjan URL:ää: "
+
+#: LYMessages.c:393
+msgid "Edit the current link's URL: "
+msgstr "Muokkaa linkin URL:ää:"
+
+#: LYMessages.c:394
+msgid "Edit the form's submit-URL: "
+msgstr "Muokkaa lomakkeen lähetys-URL:ää: "
+
+#: LYMessages.c:395
+msgid "You cannot edit File Management URLs"
+msgstr "Et voi muokata tiedostonhallinnan URL:iä"
+
+#: LYMessages.c:396
+msgid "Enter a database query: "
+msgstr "Syötä tietokantahaku: "
+
+#: LYMessages.c:397
+msgid "Enter a whereis query: "
+msgstr "Syötä whereis-haku: "
+
+#: LYMessages.c:398
+msgid "Edit the current query: "
+msgstr "Muokkaa nykyistä hakua: "
+
+#: LYMessages.c:399
+msgid "Edit the previous query: "
+msgstr "Muokkaa edellistä hakua: "
+
+#: LYMessages.c:400
+msgid "Edit a previous query: "
+msgstr "Muokkaa vanhempaa hakua: "
+
+#. #define USE_C_R_TO_RESUB_CUR_QUERY
+#: LYMessages.c:402
+msgid "Use Control-R to resubmit the current query."
+msgstr "Ctrl-R lähettää nykyisen haun uudelleen."
+
+#: LYMessages.c:403
+msgid "Edit the current shortcut: "
+msgstr "Muokkaa nykyistä oikotietä:"
+
+#: LYMessages.c:404
+msgid "Edit the previous shortcut: "
+msgstr "Muokkaa edellistä oikotietä:"
+
+#: LYMessages.c:405
+msgid "Edit a previous shortcut: "
+msgstr "Muokkaa vanhempaa oikotietä:"
+
+#: LYMessages.c:406
+#, c-format
+msgid "Key '%c' is not mapped to a jump file!"
+msgstr "Näppäintä â€%c†ei ole määritetty hyppytiedostoon!"
+
+#: LYMessages.c:407
+msgid "Cannot locate jump file!"
+msgstr "Hyppytiedostoa ei löydetä!"
+
+#: LYMessages.c:408
+msgid "Cannot open jump file!"
+msgstr "Hyppytiedostoa ei voida avata!"
+
+#: LYMessages.c:409
+msgid "Error reading jump file!"
+msgstr "Hyppytiedostoa luettaessa tapahtui virhe!"
+
+#: LYMessages.c:410
+msgid "Out of memory reading jump file!"
+msgstr "Muisti loppui hyppytiedostoa luettaessa!"
+
+#: LYMessages.c:411
+msgid "Out of memory reading jump table!"
+msgstr "Muisti loppui hyppytaulukkoa luettaessa!"
+
+#: LYMessages.c:412
+msgid "No index is currently available."
+msgstr "Indeksiä ei ole nyt saatavilla."
+
+#. #define CONFIRM_MAIN_SCREEN
+#: LYMessages.c:414
+msgid "Do you really want to go to the Main screen?"
+msgstr "Haluatko todella mennä aloitussivulle?"
+
+#: LYMessages.c:415
+msgid "You are already at main screen!"
+msgstr "Olet jo aloitussivulla!"
+
+#. #define NOT_ISINDEX
+#: LYMessages.c:417
+msgid "Not a searchable indexed document -- press '/' to search for a text string"
+msgstr "Tämä ei ole etsittävä indeksoitu asiakirja – â€/†etsii merkkijonoa"
+
+#. #define NO_OWNER
+#: LYMessages.c:419
+msgid "No owner is defined for this file so you cannot send a comment"
+msgstr "Tälle tiedostolle ei ole määritetty omistajaa, joten ei voida lähettää kommenttia"
+
+#: LYMessages.c:420
+#, c-format
+msgid "No owner is defined. Use %s?"
+msgstr "Omistajaa ei ole määritetty. Käytetäänkö %s:a?"
+
+#: LYMessages.c:421
+msgid "Do you wish to send a comment?"
+msgstr "Haluatko lähettää kommentin?"
+
+#: LYMessages.c:422
+msgid "Mail is disallowed so you cannot send a comment"
+msgstr "Sähköposti ei ole käytössä, joten kommentteja ei voi lähettää"
+
+#: LYMessages.c:423
+msgid "The 'e'dit command is currently disabled."
+msgstr "â€E†muokkaa -komento ei ole käytössä."
+
+#: LYMessages.c:424
+msgid "External editing is currently disabled."
+msgstr "Ulkoinen muokkaus ei ole käytössä."
+
+#: LYMessages.c:425
+msgid "System error - failure to get status."
+msgstr "Järjestelmävirhe – ei saatu tilaa."
+
+#: LYMessages.c:426
+msgid "No editor is defined!"
+msgstr "Muokkainta ei ole määritetty!"
+
+#: LYMessages.c:427
+msgid "The 'p'rint command is currently disabled."
+msgstr "â€P†tulosta -komento ei ole käytössä."
+
+#: LYMessages.c:428
+msgid "Document has no Toolbar links or Banner."
+msgstr ""
+
+#: LYMessages.c:429
+msgid "Unable to open traversal file."
+msgstr ""
+
+#: LYMessages.c:430
+msgid "Unable to open traversal found file."
+msgstr ""
+
+#: LYMessages.c:431
+msgid "Unable to open reject file."
+msgstr ""
+
+#: LYMessages.c:432
+msgid "Unable to open traversal errors output file"
+msgstr ""
+
+#: LYMessages.c:433
+msgid "TRAVERSAL WAS INTERRUPTED"
+msgstr ""
+
+#: LYMessages.c:434
+msgid "Follow link (or goto link or page) number: "
+msgstr ""
+
+#: LYMessages.c:435
+msgid "Select option (or page) number: "
+msgstr "Valitse valinnan (tai sivun) numero: "
+
+#: LYMessages.c:436
+#, c-format
+msgid "Option number %d already is current."
+msgstr "Valinta numero %d on jo valittu."
+
+#. #define ALREADY_AT_OPTION_END
+#: LYMessages.c:438
+msgid "You are already at the end of this option list."
+msgstr "Olet jo tämän valintaluettelon lopussa."
+
+#. #define ALREADY_AT_OPTION_BEGIN
+#: LYMessages.c:440
+msgid "You are already at the beginning of this option list."
+msgstr "Olet jo tämän valintaluettelon alussa."
+
+#. #define ALREADY_AT_OPTION_PAGE
+#: LYMessages.c:442
+#, c-format
+msgid "You are already at page %d of this option list."
+msgstr "Olet jo tämän valintaluettelon %d. sivulla."
+
+#: LYMessages.c:443
+msgid "You have entered an invalid option number."
+msgstr "Annoit virheellisen valinnan numeron."
+
+#: LYMessages.c:444
+msgid "** Bad HTML!! Use -trace to diagnose. **"
+msgstr "** Virheellistä HTML-koodia! Diagnosoi valitsimella -trace. **"
+
+#: LYMessages.c:445
+msgid "Give name of file to save in"
+msgstr "Anna sen tiedoston nimi, johon tallennetaan"
+
+#: LYMessages.c:446
+msgid "Can't save data to file -- please run WWW locally"
+msgstr ""
+
+#: LYMessages.c:447
+msgid "Can't open temporary file!"
+msgstr "Tilapäistiedostoa ei voida avata!"
+
+#: LYMessages.c:448
+msgid "Can't open output file! Cancelling!"
+msgstr "Tulostiedostoa ei voida avata! Peruutetaan!"
+
+#: LYMessages.c:449
+msgid "Execution is disabled."
+msgstr "Suorittaminen ei ole käytössä."
+
+#. #define EXECUTION_DISABLED_FOR_FILE
+#: LYMessages.c:451
+#, c-format
+msgid "Execution is not enabled for this file. See the Options menu (use %s)."
+msgstr "Suorittaminen ei ole käytössä tälle tiedostolle. Katso valinnat (%s)."
+
+#. #define EXECUTION_NOT_COMPILED
+#: LYMessages.c:453
+msgid "Execution capabilities are not compiled into this version."
+msgstr "Tähän versioon ei ole käännetty suoritusominaisuuksia."
+
+#: LYMessages.c:454
+msgid "This file cannot be displayed on this terminal."
+msgstr "Tätä tiedostoa ei voi näyttää tässä päätteessä."
+
+#. #define CANNOT_DISPLAY_FILE_D_OR_C
+#: LYMessages.c:456
+msgid "This file cannot be displayed on this terminal: D)ownload, or C)ancel"
+msgstr "Tätä tiedostoa ei voi näyttää tässä päätteessä: D) lataa vai C) peruuta"
+
+#: LYMessages.c:457
+#, c-format
+msgid "%s D)ownload, or C)ancel"
+msgstr "%s D) lataa vai C) peruuta"
+
+#: LYMessages.c:458
+msgid "Cancelling file."
+msgstr "Peruutetaan tiedosto."
+
+#: LYMessages.c:459
+msgid "Retrieving file. - PLEASE WAIT -"
+msgstr "Haetaan tiedostoa. - OLE HYVÄ JA ODOTA -"
+
+#: LYMessages.c:460
+msgid "Enter a filename: "
+msgstr "Anna tiedostonimi: "
+
+#: LYMessages.c:461
+msgid "Edit the previous filename: "
+msgstr "Muokkaa edellistä tiedostonimeä: "
+
+#: LYMessages.c:462
+msgid "Edit a previous filename: "
+msgstr "Muokkaa aikaisempaa tiedostonimeä: "
+
+#: LYMessages.c:463
+msgid "Enter a new filename: "
+msgstr "Anna uusi tiedostonimi: "
+
+#: LYMessages.c:464
+msgid "File name may not begin with a dot."
+msgstr "Tiedoston nimi ei voi alkaa pisteellä."
+
+#: LYMessages.c:466
+msgid "File exists. Create higher version?"
+msgstr "Tiedosto on olemassa. Luodaanko suurempi versio?"
+
+#: LYMessages.c:468
+msgid "File exists. Overwrite?"
+msgstr "Tiedosto on olemassa. Ylikirjoitetaanko?"
+
+#: LYMessages.c:470
+msgid "Cannot write to file."
+msgstr "Tiedostoon ei voi kirjoittaa."
+
+#: LYMessages.c:471
+msgid "ERROR! - download command is misconfigured."
+msgstr "VIRHE! - latauskomennon asetukset ovat väärin."
+
+#: LYMessages.c:472
+msgid "Unable to download file."
+msgstr "Tiedostoa ei voi ladata."
+
+#: LYMessages.c:473
+msgid "Reading directory..."
+msgstr "Luetaan kansiota…"
+
+#: LYMessages.c:474
+msgid "Building directory listing..."
+msgstr "Luodaan kansiolistausta…"
+
+#: LYMessages.c:475
+msgid "Saving..."
+msgstr "Tallennetaan…"
+
+#: LYMessages.c:476
+#, c-format
+msgid "Could not edit file '%s'."
+msgstr "Tiedostoa â€%s†ei voitu muokata."
+
+#: LYMessages.c:477
+msgid "Unable to access document!"
+msgstr "Asiakirjaan ei pääse!"
+
+#: LYMessages.c:478
+msgid "Could not access file."
+msgstr "Tiedostoon ei pääse."
+
+#: LYMessages.c:479
+msgid "Could not access directory."
+msgstr "Kansioon ei pääse."
+
+#: LYMessages.c:480
+msgid "Could not load data."
+msgstr "Ei voitu ladata dataa."
+
+#. #define CANNOT_EDIT_REMOTE_FILES
+#: LYMessages.c:482
+msgid "Lynx cannot currently (e)dit remote WWW files."
+msgstr "Lynx ei voi tällä hetkellä muokata (e) WWW-sivuja."
+
+#. #define CANNOT_EDIT_FIELD
+#: LYMessages.c:484
+msgid "This field cannot be (e)dited with an external editor."
+msgstr "Tämä viestiä ei muokata (e) ulkoisella muokkaimella."
+
+#: LYMessages.c:485
+msgid "Bad rule"
+msgstr "Virheellinen sääntö"
+
+#: LYMessages.c:486
+msgid "Insufficient operands:"
+msgstr "Puutteelliset operandit:"
+
+#: LYMessages.c:487
+msgid "You are not authorized to edit this file."
+msgstr "Sinulla ei ole oikeuksia muokata tätä tiedostoa."
+
+#: LYMessages.c:488
+msgid "Title: "
+msgstr "Otsikko: "
+
+#: LYMessages.c:489
+msgid "Subject: "
+msgstr "Aihe: "
+
+#: LYMessages.c:490
+msgid "Username: "
+msgstr "Käyttäjänimi: "
+
+#: LYMessages.c:491
+msgid "Password: "
+msgstr "Salasana: "
+
+#: LYMessages.c:492
+msgid "lynx: Username and Password required!!!"
+msgstr "lynx: Käyttäjänimi ja salasana vaaditaan!"
+
+#: LYMessages.c:493
+msgid "lynx: Password required!!!"
+msgstr "lynx: Salasana vaaditaan!"
+
+#: LYMessages.c:494
+msgid "Clear all authorization info for this session?"
+msgstr "Tyhjennetäänkö kaikki tämän istunnon tunnistautumistiedot?"
+
+#: LYMessages.c:495
+msgid "Authorization info cleared."
+msgstr "Tunnistautumistiedot tyhjennetty."
+
+#: LYMessages.c:496
+msgid "Authorization failed. Retry?"
+msgstr "Tunnistautuminen epäonnistui. Yritetäänkö uudelleen?"
+
+#: LYMessages.c:497
+msgid "cgi support has been disabled."
+msgstr "cgi-tuki on poistettu käytöstä."
+
+#. #define CGI_NOT_COMPILED
+#: LYMessages.c:499
+msgid "Lynxcgi capabilities are not compiled into this version."
+msgstr "Tässä versiossa ei ole lynxcgi-tukea"
+
+#: LYMessages.c:500
+#, c-format
+msgid "Sorry, no known way of converting %s to %s."
+msgstr "Ei tunnettua tapaa muuttaa %s %s:ksi."
+
+#: LYMessages.c:501
+msgid "Unable to set up connection."
+msgstr "Yhteyden asetusten tekeminen epäonnistui."
+
+#: LYMessages.c:502
+msgid "Unable to make connection"
+msgstr "Yhteyden ottaminen epäonnistui"
+
+#. #define MALFORMED_EXEC_REQUEST
+#: LYMessages.c:504
+msgid "Executable link rejected due to malformed request."
+msgstr "Suoritettava linkki hylätty vääränmuotoisen pyynnön takia."
+
+#. #define BADCHAR_IN_EXEC_LINK
+#: LYMessages.c:506
+#, c-format
+msgid "Executable link rejected due to `%c' character."
+msgstr "Suoritettava linkki hylätty merkin \"%c\" vuoksi."
+
+#. #define RELPATH_IN_EXEC_LINK
+#: LYMessages.c:508
+msgid "Executable link rejected due to relative path string ('../')."
+msgstr "Suoritettava linkki hylätty suhteellisen polun takia (\"../\")."
+
+#. #define BADLOCPATH_IN_EXEC_LINK
+#: LYMessages.c:510
+msgid "Executable link rejected due to location or path."
+msgstr "Suoritettava linkki hylätty sijainnin tai polun takia."
+
+#: LYMessages.c:511
+msgid "Mail access is disabled!"
+msgstr "Sähköpostiyhteydet on poistettu käytöstä!"
+
+#. #define ACCESS_ONLY_LOCALHOST
+#: LYMessages.c:513
+msgid "Only files and servers on the local host can be accessed."
+msgstr ""
+
+#: LYMessages.c:514
+msgid "Telnet access is disabled!"
+msgstr "Telnet-yhteydet on poistettu käytöstä!"
+
+#. #define TELNET_PORT_SPECS_DISABLED
+#: LYMessages.c:516
+msgid "Telnet port specifications are disabled."
+msgstr ""
+
+#: LYMessages.c:517
+msgid "USENET news access is disabled!"
+msgstr "USENET-uutisyhteydet on poistettu käytöstä!"
+
+#: LYMessages.c:518
+msgid "Rlogin access is disabled!"
+msgstr "Rlogin-yhteydet on poistettu käytöstä!"
+
+#: LYMessages.c:519
+msgid "Ftp access is disabled!"
+msgstr "Ftp-yhteydet on poistettu käytöstä!"
+
+#: LYMessages.c:520
+msgid "There are no references from this document."
+msgstr "Tästä asiakirjasta ei ole viittauksia."
+
+#: LYMessages.c:521
+msgid "There are only hidden links from this document."
+msgstr "Tästä asiakirjasta on vain piilotettuja linkkejä."
+
+#: LYMessages.c:523
+msgid "Unable to open command file."
+msgstr "Komentotiedostoa ei voitu avata."
+
+#: LYMessages.c:525
+msgid "News Post Cancelled!!!"
+msgstr ""
+
+#. #define SPAWNING_EDITOR_FOR_NEWS
+#: LYMessages.c:527
+msgid "Spawning your selected editor to edit news message"
+msgstr "Käynnistetään valitsemasi muokkain news-viestin muokkaamiseksi"
+
+#: LYMessages.c:528
+msgid "Post this message?"
+msgstr "Lähetetäänkö tämä viesti?"
+
+#: LYMessages.c:529
+#, c-format
+msgid "Append '%s'?"
+msgstr "Lisätäänkö \"%s\"?"
+
+#: LYMessages.c:530
+msgid "Posting to newsgroup(s)..."
+msgstr "Lähetetään uutisryhmiin..."
+
+#: LYMessages.c:532
+msgid "*** You have unread mail. ***"
+msgstr "*** Sinulla on lukematonta postia. ***"
+
+#: LYMessages.c:534
+msgid "*** You have mail. ***"
+msgstr "*** Sinulle on postia. ***"
+
+#: LYMessages.c:536
+msgid "*** You have new mail. ***"
+msgstr "*** Sinulle on uutta postia. ***"
+
+#: LYMessages.c:537
+msgid "File insert cancelled!!!"
+msgstr "Tiedoston lisäys peruutettu!"
+
+#: LYMessages.c:538
+msgid "Not enough memory for file!"
+msgstr "Ei tarpeeksi muistia tiedostolle!"
+
+#: LYMessages.c:539
+msgid "Can't open file for reading."
+msgstr "Tiedostoa ei voida avata lukemista varten."
+
+#: LYMessages.c:540
+msgid "File does not exist."
+msgstr "Tiedostoa ei ole."
+
+#: LYMessages.c:541
+msgid "File does not exist - reenter or cancel:"
+msgstr "Tiedostoa ei ole - kirjoita uusi tai peruuta:"
+
+#: LYMessages.c:542
+msgid "File is not readable."
+msgstr "Tiedostoa ei voi lukea."
+
+#: LYMessages.c:543
+msgid "File is not readable - reenter or cancel:"
+msgstr "Tiedostoa ei voi lukea - kirjoita uusi tai peruuta:"
+
+#: LYMessages.c:544
+msgid "Nothing to insert - file is 0-length."
+msgstr "Ei mitään lisättävää - tiedoston pituus on 0."
+
+#: LYMessages.c:545
+msgid "Save request cancelled!!!"
+msgstr "Tallennuspyyntö peruutettu!!!"
+
+#: LYMessages.c:546
+msgid "Mail request cancelled!!!"
+msgstr "Postipyyntö peruutettu!!!"
+
+#. #define CONFIRM_MAIL_SOURCE_PREPARSED
+#: LYMessages.c:548
+msgid "Viewing preparsed source. Are you sure you want to mail it?"
+msgstr "Katselet esijäsenneltyä lähdekoodia. Haluatko varmasti lähettää sen?"
+
+#: LYMessages.c:549
+msgid "Please wait..."
+msgstr "Odota…"
+
+#: LYMessages.c:550
+msgid "Mailing file. Please wait..."
+msgstr "Lähetetään tiedostoa. Ole hyvä ja odota…"
+
+#: LYMessages.c:551
+msgid "ERROR - Unable to mail file"
+msgstr "VIRHE - Tiedostoa ei voitu lähettää"
+
+#. #define CONFIRM_LONG_SCREEN_PRINT
+#: LYMessages.c:553
+#, c-format
+msgid "File is %d screens long. Are you sure you want to print?"
+msgstr "Tiedosto on %d ruudun pituinen. Haluatko varmasti tulostaa?"
+
+#: LYMessages.c:554
+msgid "Print request cancelled!!!"
+msgstr "Tulostuspyyntö peruutettu!!!"
+
+#: LYMessages.c:555
+msgid "Press <return> to begin: "
+msgstr "Paina <return> aloittaaksesi: "
+
+#: LYMessages.c:556
+msgid "Press <return> to finish: "
+msgstr "Paina <return> lopettaaksesi: "
+
+#. #define CONFIRM_LONG_PAGE_PRINT
+#: LYMessages.c:558
+#, c-format
+msgid "File is %d pages long. Are you sure you want to print?"
+msgstr "Tiedosto on %d sivun pituinen. Haluatko varmasti tulostaa?"
+
+#. #define CHECK_PRINTER
+#: LYMessages.c:560
+msgid "Be sure your printer is on-line. Press <return> to start printing:"
+msgstr "Varmista, että tulostin on päällä. <Return> aloittaa tulostamisen:"
+
+#: LYMessages.c:561
+msgid "ERROR - Unable to allocate file space!!!"
+msgstr "VIRHE – Tiedostotilan varaaminen ei onnistu!"
+
+#: LYMessages.c:562
+msgid "Unable to open tempfile"
+msgstr "Väliaikaistiedostoa ei voida avata"
+
+#: LYMessages.c:563
+msgid "Unable to open print options file"
+msgstr "Tulostinasetustiedostoa ei voida avata"
+
+#: LYMessages.c:564
+msgid "Printing file. Please wait..."
+msgstr "Tulostetaan tiedostoa. Ole hyvä ja odota…"
+
+#: LYMessages.c:565
+msgid "Please enter a valid internet mail address: "
+msgstr "Anna toimiva sähköpostiosoite: "
+
+#: LYMessages.c:566
+msgid "ERROR! - printer is misconfigured!"
+msgstr "VIRHE – Tulostimen asetukset ovat väärin!"
+
+#: LYMessages.c:567
+msgid "Image map from POST response not available!"
+msgstr ""
+
+#: LYMessages.c:568
+msgid "Misdirected client-side image MAP request!"
+msgstr ""
+
+#: LYMessages.c:569
+msgid "Client-side image MAP is not accessible!"
+msgstr ""
+
+#: LYMessages.c:570
+msgid "No client-side image MAPs are available!"
+msgstr ""
+
+#: LYMessages.c:571
+msgid "Client-side image MAP is not available!"
+msgstr ""
+
+#. #define OPTION_SCREEN_NEEDS_24
+#: LYMessages.c:574
+msgid "Screen height must be at least 24 lines for the Options menu!"
+msgstr ""
+
+#. #define OPTION_SCREEN_NEEDS_23
+#: LYMessages.c:576
+msgid "Screen height must be at least 23 lines for the Options menu!"
+msgstr ""
+
+#. #define OPTION_SCREEN_NEEDS_22
+#: LYMessages.c:578
+msgid "Screen height must be at least 22 lines for the Options menu!"
+msgstr ""
+
+#: LYMessages.c:580
+msgid "That key requires Advanced User mode."
+msgstr "Näppäin vaatii Edistynyt-tilan."
+
+#: LYMessages.c:581
+#, c-format
+msgid "Content-type: %s"
+msgstr "Sisällön tyyppi: %s"
+
+#: LYMessages.c:582
+msgid "Command: "
+msgstr "Komento: "
+
+#: LYMessages.c:583
+msgid "Unknown or ambiguous command"
+msgstr "Tuntematon tai epäselvä komento"
+
+#: LYMessages.c:584
+msgid " Version "
+msgstr " versio "
+
+#: LYMessages.c:585
+msgid " first"
+msgstr " ensin"
+
+#: LYMessages.c:586
+msgid ", guessing..."
+msgstr ", arvataan…"
+
+#: LYMessages.c:587
+msgid "Permissions for "
+msgstr "Oikeudet: "
+
+#: LYMessages.c:588
+msgid "Select "
+msgstr "Valitse "
+
+#: LYMessages.c:589
+msgid "capital letter"
+msgstr "iso kirjain"
+
+#: LYMessages.c:590
+msgid " of option line,"
+msgstr " valintarivillä,"
+
+#: LYMessages.c:591
+msgid " to save,"
+msgstr " tallentaaksesi,"
+
+#: LYMessages.c:592
+msgid " to "
+msgstr " kohteeseen "
+
+#: LYMessages.c:593
+msgid " or "
+msgstr " tai "
+
+#: LYMessages.c:594
+msgid " index"
+msgstr " indeksi"
+
+#: LYMessages.c:595
+msgid " to return to Lynx."
+msgstr " palataksesi Lynxiin."
+
+#: LYMessages.c:596
+msgid "Accept Changes"
+msgstr "Hyväksy muutokset"
+
+#: LYMessages.c:597
+msgid "Reset Changes"
+msgstr "Peruuta muutokset"
+
+#: LYMessages.c:598
+msgid "Left Arrow cancels changes"
+msgstr "Vasen nuoli peruuttaa muutokset"
+
+#: LYMessages.c:599
+msgid "Save options to disk"
+msgstr "Tallenna valinnat levylle"
+
+#: LYMessages.c:600
+msgid "Hit RETURN to accept entered data."
+msgstr "<Return> hyväksyy syötetyn datan."
+
+#. #define ACCEPT_DATA_OR_DEFAULT
+#: LYMessages.c:602
+msgid "Hit RETURN to accept entered data. Delete data to invoke the default."
+msgstr "<Return> hyväksyy syötetyn datan. Poista tiedot kutsuaksesi oletuksen."
+
+#: LYMessages.c:603
+msgid "Value accepted!"
+msgstr "Arvo hyväksytty!"
+
+#. #define VALUE_ACCEPTED_WARNING_X
+#: LYMessages.c:605
+msgid "Value accepted! -- WARNING: Lynx is configured for XWINDOWS!"
+msgstr "Arvo hyväksytty! – VAROITUS: Lynxin asetukset on tehty XWINDOWSIA varten!"
+
+#. #define VALUE_ACCEPTED_WARNING_NONX
+#: LYMessages.c:607
+msgid "Value accepted! -- WARNING: Lynx is NOT configured for XWINDOWS!"
+msgstr "Arvo hyväksytty! – VAROITUS: Lynxin asetuksia EI ole tehty XWINDOWSIA varten!"
+
+#: LYMessages.c:608
+msgid "You are not allowed to change which editor to use!"
+msgstr "Ei voi vaihtaa käytettävää muokkainta."
+
+#: LYMessages.c:609
+msgid "Failed to set DISPLAY variable!"
+msgstr "DISPLAY-muuttujan asettaminen epäonnistui!"
+
+#: LYMessages.c:610
+msgid "Failed to clear DISPLAY variable!"
+msgstr "DISPLAY-muuttujan tyhjentäminen epäonnistui!"
+
+#. #define BOOKMARK_CHANGE_DISALLOWED
+#: LYMessages.c:612
+msgid "You are not allowed to change the bookmark file!"
+msgstr "Et voi vaihtaa kirjanmerkkitiedostoa!"
+
+#: LYMessages.c:613
+msgid "Terminal does not support color"
+msgstr "Pääte ei tue värejä"
+
+#: LYMessages.c:614
+#, c-format
+msgid "Your '%s' terminal does not support color."
+msgstr "â€%sâ€-pääte ei tue värejä."
+
+#: LYMessages.c:615
+msgid "Access to dot files is disabled!"
+msgstr "Pääsy pistetiedostoihin on estetty."
+
+#. #define UA_NO_LYNX_WARNING
+#: LYMessages.c:617
+msgid "User-Agent string does not contain \"Lynx\" or \"L_y_n_x\""
+msgstr "User-Agent ei sisällä sanaa â€Lynx†tai â€L_y_n_xâ€"
+
+#. #define UA_PLEASE_USE_LYNX
+#: LYMessages.c:619
+msgid "Use \"L_y_n_x\" or \"Lynx\" in User-Agent, or it looks like intentional deception!"
+msgstr "Käytä sanaa â€L_y_n_x†tai â€Lynx†User-Agentissa, tai se näyttää tarkoitukselliselta harhauttamiselta!"
+
+#. #define UA_CHANGE_DISABLED
+#: LYMessages.c:621
+msgid "Changing of the User-Agent string is disabled!"
+msgstr "User-Agent -merkkijonon muttaminen ei käytössä!"
+
+#. #define CHANGE_OF_SETTING_DISALLOWED
+#: LYMessages.c:623
+msgid "You are not allowed to change this setting."
+msgstr "Et voi muokata tätä asetusta."
+
+#: LYMessages.c:624
+msgid "Saving Options..."
+msgstr "Tallennetaan valintoja…"
+
+#: LYMessages.c:625
+msgid "Options saved!"
+msgstr "Valinnat tallennettu!"
+
+#: LYMessages.c:626
+msgid "Unable to save Options!"
+msgstr "Ei voitu tallentaa valintoja!"
+
+#: LYMessages.c:627
+msgid " 'r' to return to Lynx "
+msgstr " â€r†palaa Lynxiin "
+
+#: LYMessages.c:628
+msgid " '>' to save, or 'r' to return to Lynx "
+msgstr " â€>†tallentaa, â€r†palaa Lynxiin "
+
+#. #define ANY_KEY_CHANGE_RET_ACCEPT
+#: LYMessages.c:630
+msgid "Hit any key to change value; RETURN to accept."
+msgstr "Muokkaa arvoa millä tahansa näppäimellä, <return> hyväksyy."
+
+#: LYMessages.c:631
+msgid "Error uncompressing temporary file!"
+msgstr "Tilapäistiedoston purkaminen epäonnistui!"
+
+#: LYMessages.c:632
+msgid "Unsupported URL scheme!"
+msgstr "Ei tuettu URL-skeema!"
+
+#: LYMessages.c:633
+msgid "Unsupported data: URL! Use SHOWINFO, for now."
+msgstr "Ei-tuettua dataa: URL! Käytä toistaseksi SHOWINFOa."
+
+#: LYMessages.c:634
+msgid "Redirection limit of 10 URL's reached."
+msgstr "10 URL:n ohjausraja saavutettu."
+
+#: LYMessages.c:635
+msgid "Illegal redirection URL received from server!"
+msgstr "Palvelimelta vastaanotettiin virheellinen ohjaus-URL!"
+
+#. #define SERVER_ASKED_FOR_REDIRECTION
+#: LYMessages.c:637
+#, c-format
+msgid "Server asked for %d redirection of POST content to"
+msgstr "Palvelin pyysi POST-sisällön %d-ohjausta kohteeseen"
+
+#: LYMessages.c:640
+msgid "P)roceed, use G)ET or C)ancel "
+msgstr "P) jatka, käytä G)ET:iä vai C) peruuta "
+
+#: LYMessages.c:641
+msgid "P)roceed, or C)ancel "
+msgstr "P) jatka vai C) peruuta "
+
+#. #define ADVANCED_POST_GET_REDIRECT
+#: LYMessages.c:643
+msgid "Redirection of POST content. P)roceed, see U)RL, use G)ET or C)ancel"
+msgstr "POST-sisällön uudelleenohjaus. P) jatka, katso U)RL, käytä G)ET:iä vai C) peruuta"
+
+#. #define ADVANCED_POST_REDIRECT
+#: LYMessages.c:645
+msgid "Redirection of POST content. P)roceed, see U)RL, or C)ancel"
+msgstr "POST-sisällön uudelleenohjaus. P) jatka, katso U)RL vai C) peruuta"
+
+#. #define CONFIRM_POST_RESUBMISSION
+#: LYMessages.c:647
+msgid "Document from Form with POST content. Resubmit?"
+msgstr ""
+
+#. #define CONFIRM_POST_RESUBMISSION_TO
+#: LYMessages.c:649
+#, c-format
+msgid "Resubmit POST content to %s ?"
+msgstr ""
+
+#. #define CONFIRM_POST_LIST_RELOAD
+#: LYMessages.c:651
+#, c-format
+msgid "List from document with POST data. Reload %s ?"
+msgstr ""
+
+#. #define CONFIRM_POST_DOC_HEAD
+#: LYMessages.c:653
+msgid "Document from POST action, HEAD may not be understood. Proceed?"
+msgstr ""
+
+#. #define CONFIRM_POST_LINK_HEAD
+#: LYMessages.c:655
+msgid "Form submit action is POST, HEAD may not be understood. Proceed?"
+msgstr ""
+
+#: LYMessages.c:656
+msgid "Proceed without a username and password?"
+msgstr "Jatka ilman käyttäjänimeä ja salasanaa?"
+
+#: LYMessages.c:657
+#, c-format
+msgid "Proceed (%s)?"
+msgstr "Jatketaanko (%s)?"
+
+#: LYMessages.c:658
+msgid "Cannot POST to this host."
+msgstr "Tähän palvelimeen ei voi POSTata."
+
+#: LYMessages.c:659
+msgid "POST not supported for this URL - ignoring POST data!"
+msgstr ""
+
+#: LYMessages.c:660
+msgid "Discarding POST data..."
+msgstr "Hylätään POST-data..."
+
+#: LYMessages.c:661
+msgid "Document will not be reloaded!"
+msgstr "Asiakirjaa ei ladata uudelleen!"
+
+#: LYMessages.c:662
+msgid "Location: "
+msgstr "Sijainti: "
+
+#: LYMessages.c:663
+#, c-format
+msgid "'%s' not found!"
+msgstr "â€%s†ei löytynyt!"
+
+#: LYMessages.c:664
+msgid "Default Bookmark File"
+msgstr "Oletusarvoinen kirjanmerkkitiedosto"
+
+#: LYMessages.c:665
+msgid "Screen too small! (8x35 min)"
+msgstr "Näyttö liian pieni! (min. 8x35)"
+
+#: LYMessages.c:666
+msgid "Select destination or ^G to Cancel: "
+msgstr "Valitse kohde, ^G peruuttaa:"
+
+#. #define MULTIBOOKMARKS_SELECT
+#: LYMessages.c:668
+msgid "Select subbookmark, '=' for menu, or ^G to cancel: "
+msgstr "Valitse alikirjanmerkki, â€=†valikkoon, ^G peruuttaa:"
+
+#. #define MULTIBOOKMARKS_SELF
+#: LYMessages.c:670
+msgid "Reproduce L)ink in this bookmark file or C)ancel? (l,c): "
+msgstr ""
+
+#: LYMessages.c:671
+msgid "Multiple bookmark support is not available."
+msgstr ""
+
+#: LYMessages.c:672
+#, c-format
+msgid " Select Bookmark (screen %d of %d)"
+msgstr ""
+
+#: LYMessages.c:673
+msgid " Select Bookmark"
+msgstr " Valitse kirjanmerkki"
+
+#. #define MULTIBOOKMARKS_EHEAD_MASK
+#: LYMessages.c:675
+#, c-format
+msgid "Editing Bookmark DESCRIPTION and FILEPATH (%d of 2)"
+msgstr ""
+
+#. #define MULTIBOOKMARKS_EHEAD
+#: LYMessages.c:677
+msgid " Editing Bookmark DESCRIPTION and FILEPATH"
+msgstr ""
+
+#: LYMessages.c:678
+msgid "Letter: "
+msgstr "Kirjain:"
+
+#. #define USE_PATH_OFF_HOME
+#: LYMessages.c:681
+msgid "Use a filepath off your login directory in SHELL syntax!"
+msgstr ""
+
+#: LYMessages.c:683
+msgid "Use a filepath off your home directory!"
+msgstr ""
+
+#. #define MAXLINKS_REACHED
+#: LYMessages.c:686
+msgid "Maximum links per page exceeded! Use half-page or two-line scrolling."
+msgstr ""
+
+#: LYMessages.c:687
+msgid "No previously visited links available!"
+msgstr ""
+
+#: LYMessages.c:688
+msgid "Memory exhausted! Program aborted!"
+msgstr "Muisti lopussa! Ohjelma keskeytetty!"
+
+#: LYMessages.c:689
+msgid "Memory exhausted! Aborting..."
+msgstr "Muisti lopussa! Keskeytetään…"
+
+#: LYMessages.c:690
+msgid "Not enough memory!"
+msgstr "Ei tarpeeksi muistia!"
+
+#: LYMessages.c:691
+msgid "Directory/File Manager not available"
+msgstr "Kansion-/tiedostonhallinta ei ole saatavilla"
+
+#: LYMessages.c:692
+msgid "HREF in BASE tag is not an absolute URL."
+msgstr "HREF-attribuutti BASE-tagissa ei ole absoluuttinen URL."
+
+#: LYMessages.c:693
+msgid "Location URL is not absolute."
+msgstr "Location-URL ei ole absoluuttinen."
+
+#: LYMessages.c:694
+msgid "Refresh URL is not absolute."
+msgstr "Refresh-URL ei ole absoluuttinen."
+
+#. #define SENDING_MESSAGE_WITH_BODY_TO
+#: LYMessages.c:696
+msgid ""
+"You are sending a message with body to:\n"
+" "
+msgstr ""
+
+#: LYMessages.c:697
+msgid ""
+"You are sending a comment to:\n"
+" "
+msgstr ""
+"Lähetät kommentin osoitteeseen:\n"
+" "
+
+#: LYMessages.c:698
+msgid ""
+"\n"
+" With copy to:\n"
+" "
+msgstr ""
+"\n"
+" Kopio osoitteeseen:\n"
+" "
+
+#: LYMessages.c:699
+msgid ""
+"\n"
+" With copies to:\n"
+" "
+msgstr ""
+"\n"
+" Kopiot osoitteisiin:\n"
+" "
+
+#. #define CTRL_G_TO_CANCEL_SEND
+#: LYMessages.c:701
+msgid ""
+"\n"
+"\n"
+"Use Ctrl-G to cancel if you do not want to send a message\n"
+msgstr ""
+"\n"
+"\n"
+"Peruuta painamalla Ctrl-G, jos et halua lähettää viestiä\n"
+
+#. #define ENTER_NAME_OR_BLANK
+#: LYMessages.c:703
+msgid ""
+"\n"
+" Please enter your name, or leave it blank to remain anonymous\n"
+msgstr ""
+"\n"
+"Kirjoita nimesi tai jätä tyhjäksi pysyäksesi nimettömänä\n"
+
+#. #define ENTER_MAIL_ADDRESS_OR_OTHER
+#: LYMessages.c:705
+msgid ""
+"\n"
+" Please enter a mail address or some other\n"
+msgstr ""
+"\n"
+"Ole hyvä ja kirjoita postiosoite tai joku muu\n"
+
+#. #define MEANS_TO_CONTACT_FOR_RESPONSE
+#: LYMessages.c:707
+msgid " means to contact you, if you desire a response.\n"
+msgstr " tapa yhteydenottoon, jos haluat vastauksen.\n"
+
+#: LYMessages.c:708
+msgid ""
+"\n"
+" Please enter a subject line.\n"
+msgstr ""
+"\n"
+" Anna otsikkorivi.\n"
+
+#. #define ENTER_ADDRESS_FOR_CC
+#: LYMessages.c:710
+msgid ""
+"\n"
+" Enter a mail address for a CC of your message.\n"
+msgstr ""
+"\n"
+" Anna postiosoite, johon lähetetään kopio.\n"
+
+#: LYMessages.c:711
+msgid " (Leave blank if you don't want a copy.)\n"
+msgstr " (Jätä tyhjäksi, jos et halua kopiota.)\n"
+
+#: LYMessages.c:712
+msgid ""
+"\n"
+" Please review the message body:\n"
+"\n"
+msgstr ""
+"\n"
+" Tarkasta vietin teksti:\n"
+
+#: LYMessages.c:713
+msgid ""
+"\n"
+"Press RETURN to continue: "
+msgstr ""
+"\n"
+"Jatka painamalla ENTER: "
+
+#: LYMessages.c:714
+msgid ""
+"\n"
+"Press RETURN to clean up: "
+msgstr ""
+"\n"
+"Puhdista painamalla ENTER: "
+
+#: LYMessages.c:715
+msgid " Use Control-U to erase the default.\n"
+msgstr " Control-U tyhjentää oletuksen.\n"
+
+#: LYMessages.c:716
+msgid ""
+"\n"
+" Please enter your message below."
+msgstr ""
+"\n"
+"Ole hyvä ja kirjoita viestisi alle."
+
+#. #define ENTER_PERIOD_WHEN_DONE_A
+#: LYMessages.c:718 src/LYNews.c:360
+msgid ""
+"\n"
+" When you are done, press enter and put a single period (.)"
+msgstr ""
+"\n"
+" Kun olet valmis, paina return, kirjoita yksi piste (.)"
+
+#. #define ENTER_PERIOD_WHEN_DONE_B
+#: LYMessages.c:720 src/LYNews.c:361
+msgid ""
+"\n"
+" on a line and press enter again."
+msgstr ""
+"\n"
+" riville ja paina return uudestaan."
+
+#. Cookies messages
+#. #define ADVANCED_COOKIE_CONFIRMATION
+#: LYMessages.c:724
+#, c-format
+msgid "%s cookie: %.*s=%.*s Allow? (Y/N/Always/neVer)"
+msgstr "Eväste: %s: %.*s=%.*s Sallitaanko? (K/E/Aina/ei koSkaan)"
+
+#. #define INVALID_COOKIE_DOMAIN_CONFIRMATION
+#: LYMessages.c:726
+#, c-format
+msgid "Accept invalid cookie domain=%s for '%s'?"
+msgstr "Hyväksytäänkö epäkelpo eväste verkkotunnus=%s tunnukselle â€%sâ€?"
+
+#. #define INVALID_COOKIE_PATH_CONFIRMATION
+#: LYMessages.c:728
+#, c-format
+msgid "Accept invalid cookie path=%s as a prefix of '%s'?"
+msgstr ""
+
+#: LYMessages.c:729
+msgid "Allowing this cookie."
+msgstr "Tämä eväste hyväksytään."
+
+#: LYMessages.c:730
+msgid "Rejecting this cookie."
+msgstr "Tämä eväste hylätään."
+
+#: LYMessages.c:731
+msgid "The Cookie Jar is empty."
+msgstr ""
+
+#: LYMessages.c:732
+msgid "The Cache Jar is empty."
+msgstr ""
+
+#. #define ACTIVATE_TO_GOBBLE
+#: LYMessages.c:734
+msgid "Activate links to gobble up cookies or entire domains,"
+msgstr ""
+
+#: LYMessages.c:735
+msgid "or to change a domain's 'allow' setting."
+msgstr ""
+
+#: LYMessages.c:736
+msgid "(Cookies never allowed.)"
+msgstr "(Evästeitä ei hyväksytä koskaan.)"
+
+#: LYMessages.c:737
+msgid "(Cookies always allowed.)"
+msgstr "(Evästeet hyväksytään aina.)"
+
+#: LYMessages.c:738
+msgid "(Cookies allowed via prompt.)"
+msgstr "(Evästeiden hyväksymisestä kysytään.)"
+
+#: LYMessages.c:739
+msgid "(Persistent Cookies.)"
+msgstr "(Pysyvät evästeet.)"
+
+#: LYMessages.c:740
+msgid "(No title.)"
+msgstr "(Ei otsikkoa.)"
+
+#: LYMessages.c:741
+msgid "(No name.)"
+msgstr "(Ei nimeä.)"
+
+#: LYMessages.c:742
+msgid "(No value.)"
+msgstr "(Ei arvoa.)"
+
+#: LYMessages.c:743 src/LYOptions.c:2424
+msgid "None"
+msgstr "Ei mitään"
+
+#: LYMessages.c:744
+msgid "(End of session.)"
+msgstr "(Istunnon loppu.)"
+
+#: LYMessages.c:745
+msgid "Delete this cookie?"
+msgstr "Poistetaanko tämä eväste?"
+
+#: LYMessages.c:746
+msgid "The cookie has been eaten!"
+msgstr "Eväste poistettu!"
+
+#: LYMessages.c:747
+msgid "Delete this empty domain?"
+msgstr "Poistetaanko tyhjä domain?"
+
+#: LYMessages.c:748
+msgid "The domain has been eaten!"
+msgstr "Domain poistettu!"
+
+#. #define DELETE_COOKIES_SET_ALLOW_OR_CANCEL
+#: LYMessages.c:750
+msgid "D)elete domain's cookies, set allow A)lways/P)rompt/neV)er, or C)ancel? "
+msgstr "D) poista verkkotunnuksen evästeet, aseta salli A)ina/P) kysy/V) ei koskaan, vai C) peruuta?"
+
+#. #define DELETE_DOMAIN_SET_ALLOW_OR_CANCEL
+#: LYMessages.c:752
+msgid "D)elete domain, set allow A)lways/P)rompt/neV)er, or C)ancel? "
+msgstr "D) poista verkkotunnus, aseta salli A)ina/P) kysy/V) ei koskaan, vai C) peruuta?"
+
+#: LYMessages.c:753
+msgid "All cookies in the domain have been eaten!"
+msgstr ""
+
+#: LYMessages.c:754
+#, c-format
+msgid "'A'lways allowing from domain '%s'."
+msgstr "Hyväksytään â€Aâ€ina evästeet verkkotunnuksesta â€%sâ€."
+
+#: LYMessages.c:755
+#, c-format
+msgid "ne'V'er allowing from domain '%s'."
+msgstr "â€V†ei koskaan hyväksytä evästeitä verkkotunnuksesta â€%sâ€."
+
+#: LYMessages.c:756
+#, c-format
+msgid "'P'rompting to allow from domain '%s'."
+msgstr "â€P†kysytään aina verkkotunnuksen â€%s†evästeistä."
+
+#: LYMessages.c:757
+msgid "Delete all cookies in this domain?"
+msgstr "Poistetaanko kaikki tämän verkkotunnuksen evästeet?"
+
+#: LYMessages.c:758
+msgid "All of the cookies in the jar have been eaten!"
+msgstr ""
+
+#: LYMessages.c:760
+msgid "Port 19 not permitted in URLs."
+msgstr "Portti 19 ei sallittu URL:ssa."
+
+#: LYMessages.c:761
+msgid "Port 25 not permitted in URLs."
+msgstr "Portti 25 ei sallittu URL:ssa."
+
+#: LYMessages.c:762
+#, c-format
+msgid "Port %lu not permitted in URLs."
+msgstr "Portti %lu ei sallittu URL:ssa."
+
+#: LYMessages.c:763
+msgid "URL has a bad port field."
+msgstr "URL:ssa on virheellinen portti-kenttä."
+
+#: LYMessages.c:764
+msgid "Maximum nesting of HTML elements exceeded."
+msgstr "Sisäkkäisten HTML-elementtien maksimimäärä ylitetty."
+
+#: LYMessages.c:765
+msgid "Bad partial reference! Stripping lead dots."
+msgstr "Vääränlainen osittainen viittaus! Poistetaan pisteet alusta."
+
+#: LYMessages.c:766
+msgid "Trace Log open failed. Trace off!"
+msgstr "Jäljityslokin avaaminen epäonnistui. Jäljitys pois päältä!"
+
+#: LYMessages.c:767
+msgid "Lynx Trace Log"
+msgstr "Lynxin jäljitysloki"
+
+#: LYMessages.c:768
+msgid "No trace log has been started for this session."
+msgstr "Tälle istunnolle ei ole aloitettu jäljityslokia."
+
+#. #define MAX_TEMPCOUNT_REACHED
+#: LYMessages.c:770
+msgid "The maximum temporary file count has been reached!"
+msgstr "Tilapäistiedostojen maksimimäärä saavutettu!"
+
+#. #define FORM_VALUE_TOO_LONG
+#: LYMessages.c:772
+msgid "Form field value exceeds buffer length! Trim the tail."
+msgstr ""
+
+#. #define FORM_TAIL_COMBINED_WITH_HEAD
+#: LYMessages.c:774
+msgid "Modified tail combined with head of form field value."
+msgstr ""
+
+#. HTFile.c
+#: LYMessages.c:777
+msgid "Directory"
+msgstr "Kansio"
+
+#: LYMessages.c:778
+msgid "Directory browsing is not allowed."
+msgstr "Kansioiden selaus ei ole sallittu."
+
+#: LYMessages.c:779
+msgid "Selective access is not enabled for this directory"
+msgstr ""
+
+#: LYMessages.c:780
+msgid "Multiformat: directory scan failed."
+msgstr ""
+
+#: LYMessages.c:781
+msgid "This directory is not readable."
+msgstr "Tätä kansiota ei voi lukea."
+
+#: LYMessages.c:782
+msgid "Can't access requested file."
+msgstr "Pyydettyä tiedostoa ei voida käyttää."
+
+#: LYMessages.c:783
+msgid "Could not find suitable representation for transmission."
+msgstr ""
+
+#: LYMessages.c:784
+msgid "Could not open file for decompression!"
+msgstr "Tiedoston avaaminen purkamista varten epäonnistui!"
+
+#: LYMessages.c:785
+msgid "Files:"
+msgstr "Tiedostot:"
+
+#: LYMessages.c:786
+msgid "Subdirectories:"
+msgstr "Alikansiot:"
+
+#: LYMessages.c:787
+msgid " directory"
+msgstr " kansio"
+
+#: LYMessages.c:788
+msgid "Up to "
+msgstr "Ylös "
+
+#: LYMessages.c:789
+msgid "Current directory is "
+msgstr "Kansio on "
+
+#. HTFTP.c
+#: LYMessages.c:792
+msgid "Symbolic Link"
+msgstr "Symbolinen linkki"
+
+#. HTGopher.c
+#: LYMessages.c:795
+msgid "No response from server!"
+msgstr "Ei vastausta palvelimelta!"
+
+#: LYMessages.c:796
+msgid "CSO index"
+msgstr "CSO-indeksi"
+
+#: LYMessages.c:797
+msgid ""
+"\n"
+"This is a searchable index of a CSO database.\n"
+msgstr ""
+"\n"
+"Tämä on CSO-tietokannan indeksi, josta voi etsiä.\n"
+
+#: LYMessages.c:798
+msgid "CSO Search Results"
+msgstr "CSO-hakutulokset"
+
+#: LYMessages.c:799
+#, c-format
+msgid "Seek fail on %s\n"
+msgstr "Hakuvirhe kohdassa %s\n"
+
+#: LYMessages.c:800
+msgid ""
+"\n"
+"Press the 's' key and enter search keywords.\n"
+msgstr ""
+"\n"
+"Paina näppäintä â€s†ja kirjoita hakusanat.\n"
+
+#: LYMessages.c:801
+msgid ""
+"\n"
+"This is a searchable Gopher index.\n"
+msgstr ""
+"\n"
+"Tämä on Gopher-indeksi, josta voi etsiä.\n"
+
+#: LYMessages.c:802
+msgid "Gopher index"
+msgstr "Gopher-indeksi"
+
+#: LYMessages.c:803
+msgid "Gopher Menu"
+msgstr "Gopher-valikko"
+
+#: LYMessages.c:804
+msgid " Search Results"
+msgstr " Hakutulokset"
+
+#: LYMessages.c:805
+msgid "Sending CSO/PH request."
+msgstr "Lähetetään CSO/PH-pyyntö."
+
+#: LYMessages.c:806
+msgid "Sending Gopher request."
+msgstr "Lähetetään Gopher-pyyntö."
+
+#: LYMessages.c:807
+msgid "CSO/PH request sent; waiting for response."
+msgstr "CSO/PH-pyyntö lähetetty, odotetaan vastausta."
+
+#: LYMessages.c:808
+msgid "Gopher request sent; waiting for response."
+msgstr "Gopher-pyyntö lähetetty, odotetaan vastausta."
+
+#: LYMessages.c:809
+msgid ""
+"\n"
+"Please enter search keywords.\n"
+msgstr ""
+"\n"
+"Kirjoita hakusanat.\n"
+
+#: LYMessages.c:810
+msgid ""
+"\n"
+"The keywords that you enter will allow you to search on a"
+msgstr ""
+"\n"
+"Syöttämilläsi hakusanoilla voit etsiä henkilön"
+
+#: LYMessages.c:811
+msgid " person's name in the database.\n"
+msgstr "nimeä tietokannasta.\n"
+
+#. HTNews.c
+#: LYMessages.c:814
+msgid "Connection closed ???"
+msgstr "Yhteys suljettu ???"
+
+#: LYMessages.c:815
+msgid "Cannot open temporary file for news POST."
+msgstr ""
+
+#: LYMessages.c:816
+msgid "This client does not contain support for posting to news with SSL."
+msgstr "Tämä asiakasohjelma ei tue SSL-lähettämistä uutisryhmiin."
+
+#. HTStyle.c
+#: LYMessages.c:819
+#, c-format
+msgid "Style %d `%s' SGML:%s. Font %s %.1f point.\n"
+msgstr "Tyyli %d â€%s†SGML: %s. Kirjasin %s %.1f pistettä.\n"
+
+#: LYMessages.c:821
+#, c-format
+msgid "\tAlign=%d, %d tabs. (%.0f before, %.0f after)\n"
+msgstr "\tKohdistus=%d, %d sarkainta. (%.0f ennen, %.0f jälkeen)\n"
+
+#: LYMessages.c:822
+#, c-format
+msgid "\t\tTab kind=%d at %.0f\n"
+msgstr "\t\tSarkaimen tyyppi=%d kohdassa %.0f\n"
+
+#. HTTP.c
+#: LYMessages.c:825
+msgid "Can't proceed without a username and password."
+msgstr "Ei voida jatkaa ilman käyttäjänimeä ja salasanaa."
+
+#: LYMessages.c:826
+msgid "Can't retry with authorization! Contact the server's WebMaster."
+msgstr ""
+
+#: LYMessages.c:827
+msgid "Can't retry with proxy authorization! Contact the server's WebMaster."
+msgstr ""
+
+#: LYMessages.c:828
+msgid "Retrying with proxy authorization information."
+msgstr ""
+
+#: LYMessages.c:829
+#, c-format
+msgid "SSL error:%s-Continue?"
+msgstr "SSL-virhe: %s – Jatketaanko?"
+
+#. HTWAIS.c
+#: LYMessages.c:832
+msgid "HTWAIS: Return message too large."
+msgstr "HTWAIS: Paluuviesti on liian suuri."
+
+#: LYMessages.c:833
+msgid "Enter WAIS query: "
+msgstr "Syötä WAIS-haku:"
+
+#. Miscellaneous status
+#: LYMessages.c:836
+msgid "Retrying as HTTP0 request."
+msgstr "Yritetään uudelleen HTTP0-pyyntönä."
+
+#: LYMessages.c:837
+#, c-format
+msgid "Transferred %d bytes"
+msgstr "Siirretty %d tavua"
+
+#: LYMessages.c:838
+msgid "Data transfer complete"
+msgstr "Tiedonsiirto valmis"
+
+#: LYMessages.c:839
+#, c-format
+msgid "Error processing line %d of %s\n"
+msgstr "Virhe käsiteltäessä %2$s:n riviä %1$d\n"
+
+#. Lynx internal page titles
+#: LYMessages.c:842
+msgid "Address List Page"
+msgstr "Osoitelistasivu"
+
+#: LYMessages.c:843
+msgid "Bookmark file"
+msgstr "Kirjanmerkkitiedosto"
+
+#: LYMessages.c:844
+msgid "Configuration Definitions"
+msgstr "Asetusmäärittelyt"
+
+#: LYMessages.c:845
+msgid "Cookie Jar"
+msgstr "Evästeet"
+
+#: LYMessages.c:846
+msgid "Current Edit-Key Map"
+msgstr "Nykyinen muokkausnäppäinkartta"
+
+#: LYMessages.c:847
+msgid "Current Key Map"
+msgstr "Nykyinen näppäinkartta"
+
+#: LYMessages.c:848
+msgid "File Management Options"
+msgstr "Tiedostonhallintavalinnat"
+
+#: LYMessages.c:849
+msgid "Download Options"
+msgstr "Latausasetukset"
+
+#: LYMessages.c:850
+msgid "History Page"
+msgstr "Historiasivu"
+
+#: LYMessages.c:851
+msgid "Cache Jar"
+msgstr "Välimuisti"
+
+#: LYMessages.c:852
+msgid "List Page"
+msgstr "Listasivu"
+
+#: LYMessages.c:853
+msgid "Lynx.cfg Information"
+msgstr "Lynx.cfg-asetustiedoston tiedot"
+
+#: LYMessages.c:854
+msgid "Converted Mosaic Hotlist"
+msgstr "Muunnettu Mosaic-lista"
+
+#: LYMessages.c:855
+msgid "Options Menu"
+msgstr "Valinnat"
+
+#: LYMessages.c:856
+msgid "File Permission Options"
+msgstr "Tiedosto-oikeuksien asetukset"
+
+#: LYMessages.c:857
+msgid "Printing Options"
+msgstr "Tulostusasetukset"
+
+#: LYMessages.c:858
+msgid "Information about the current document"
+msgstr "Tietoa nykyisestä sivusta"
+
+#: LYMessages.c:859
+msgid "Your recent statusline messages"
+msgstr "Viimeisimmät tilarivin viestit"
+
+#: LYMessages.c:860
+msgid "Upload Options"
+msgstr "Lähetysasetukset"
+
+#: LYMessages.c:861
+msgid "Visited Links Page"
+msgstr "Vieraillut linkit -sivu"
+
+#. CONFIG_DEF_TITLE subtitles
+#: LYMessages.c:864
+msgid "See also"
+msgstr "Katso myös"
+
+#: LYMessages.c:865
+msgid "your"
+msgstr "sinun"
+
+#: LYMessages.c:866
+msgid "for runtime options"
+msgstr "ajonaikaisia asetuksia varten"
+
+#: LYMessages.c:867
+msgid "compile time options"
+msgstr "käännöksen aikaiset asetukset"
+
+#: LYMessages.c:868
+msgid "color-style configuration"
+msgstr "väriasetukset"
+
+#: LYMessages.c:869
+msgid "latest release"
+msgstr "viimeisin julkaisu"
+
+#: LYMessages.c:870
+msgid "pre-release version"
+msgstr "esijulkaisuversio"
+
+#: LYMessages.c:871
+msgid "development version"
+msgstr "kehitysversio"
+
+#. #define AUTOCONF_CONFIG_CACHE
+#: LYMessages.c:873
+msgid ""
+"The following data were derived during the automatic configuration/build\n"
+"process of this copy of Lynx. When reporting a bug, please include a copy\n"
+"of this page."
+msgstr ""
+"Seuraavat tiedot on johdettu tämän Lynxin kopion automaattisessa\n"
+"asetus-/kääntövaiheessa. Sisällytä kopio tästä sivusta vikailmoituksia\n"
+"lähettäessä."
+
+#. #define AUTOCONF_LYNXCFG_H
+#: LYMessages.c:877
+msgid ""
+"The following data were used as automatically-configured compile-time\n"
+"definitions when this copy of Lynx was built."
+msgstr ""
+"Seuraavia tietoja käytettiin automaattisesti konfiguroituina käännöksen\n"
+"aikaisina määrittelyinä, kun tämä Lynxin kopio käännettiin."
+
+#. #define DIRED_NOVICELINE
+#: LYMessages.c:882
+msgid " C)reate D)ownload E)dit F)ull menu M)odify R)emove T)ag U)pload \n"
+msgstr " C) Luo D) Lataa E) Muokkaa F) Koko valikko M) Muokkaa R) Poista U) Lähetä \n"
+
+#: LYMessages.c:883
+msgid "Failed to obtain status of current link!"
+msgstr "Valitun linkin tilan hakeminen epäonnistui!"
+
+#. #define INVALID_PERMIT_URL
+#: LYMessages.c:886
+msgid "Special URL only valid from current File Permission menu!"
+msgstr ""
+
+#: LYMessages.c:890
+msgid "External support is currently disabled."
+msgstr "Ulkoinen tuki on pois käytöstä."
+
+#. new with 2.8.4dev.21
+#: LYMessages.c:894
+msgid "Changing working-directory is currently disabled."
+msgstr "Työkansion vaihtaminen on pois käytöstä."
+
+#: LYMessages.c:895
+msgid "Linewrap OFF!"
+msgstr "Rivitys POIS!"
+
+#: LYMessages.c:896
+msgid "Linewrap ON!"
+msgstr "Rivitys PÄÄLLÄ!"
+
+#: LYMessages.c:897
+msgid "Parsing nested-tables toggled OFF! Reloading..."
+msgstr ""
+
+#: LYMessages.c:898
+msgid "Parsing nested-tables toggled ON! Reloading..."
+msgstr ""
+
+#: LYMessages.c:899
+msgid "Shifting is disabled while line-wrap is in effect"
+msgstr ""
+
+#: LYMessages.c:900
+msgid "Trace not supported"
+msgstr "Jäljitys ei tuettu"
+
+#: LYMessages.c:820
+#, c-format
+msgid "\tIndents: first=%.0f others=%.0f, Height=%.1f Desc=%.1f\n"
+msgstr "\tSisennykset: ensimmäinen=%.0f muut=%.0f, korkeus=%.1f kuvaus=%.1f\n"
+
+#.
+#. * Set up the message for the username prompt, and then issue the
+#. * prompt. The default username is included in the call to the
+#. * prompting function, but the password is NULL-ed and always replaced.
+#. * - FM
+#.
+#: WWW/Library/Implementation/HTAABrow.c:634
+#, c-format
+msgid "Username for '%s' at %s '%s%s':"
+msgstr "Käyttäjänimi â€%s†kohteessa %s â€%s%sâ€:"
+
+#: WWW/Library/Implementation/HTAABrow.c:904
+msgid "This client doesn't know how to compose proxy authorization information for scheme"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAABrow.c:983
+msgid "This client doesn't know how to compose authorization information for scheme"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAABrow.c:1094
+#, c-format
+msgid "Invalid header '%s%s%s%s%s'"
+msgstr "Virheellinen otsake â€%s%s%s%s%sâ€"
+
+#: WWW/Library/Implementation/HTAABrow.c:1200
+msgid "Proxy authorization required -- retrying"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAABrow.c:1256
+msgid "Access without authorization denied -- retrying"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAccess.c:698
+msgid "Access forbidden by rule"
+msgstr "Käytön estää sääntö"
+
+#: WWW/Library/Implementation/HTAccess.c:793
+msgid "Document with POST content not found in cache. Resubmit?"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAccess.c:947
+msgid "Loading failed, use a previous copy."
+msgstr "Lataaminen epäonnistui, käytä edellistä kopiota."
+
+#: WWW/Library/Implementation/HTAccess.c:1056 src/GridText.c:8875
+msgid "Loading incomplete."
+msgstr "Lataaminen ei valmis."
+
+#: WWW/Library/Implementation/HTAccess.c:1087
+#, c-format
+msgid "**** HTAccess: socket or file number returned by obsolete load routine!\n"
+msgstr "**** HTAccess: pistokkeen tai tiedostonumeron palautti vanhentunut latausrutiini!\n"
+
+#: WWW/Library/Implementation/HTAccess.c:1089
+#, c-format
+msgid "**** HTAccess: Internal software error. Please mail lynx-dev@nongnu.org!\n"
+msgstr "**** HTAccess: Ohjelman sisäinen virhe. Lähetä postia: lynx-dev@nongnu.org!\n"
+
+#: WWW/Library/Implementation/HTAccess.c:1090
+#, c-format
+msgid "**** HTAccess: Status returned was: %d\n"
+msgstr "**** HTAccess: Palautettu tila oli: %d\n"
+
+#.
+#. * hack: if we fail in HTAccess.c
+#. * avoid duplicating URL, oh.
+#.
+#: WWW/Library/Implementation/HTAccess.c:1096 src/LYMainLoop.c:8074
+msgid "Can't Access"
+msgstr "Ei tavoiteta"
+
+#: WWW/Library/Implementation/HTAccess.c:1104
+msgid "Unable to access document."
+msgstr "Asiakirjaa ei voida tavoittaa."
+
+#: WWW/Library/Implementation/HTFTP.c:875
+#, c-format
+msgid "Enter password for user %s@%s:"
+msgstr "Kirjoita salasana käyttäjälle %s@%s:"
+
+#: WWW/Library/Implementation/HTFTP.c:903
+msgid "Unable to connect to FTP host."
+msgstr "FTP-palvelimeen yhdistäminen ei onnistu."
+
+#: WWW/Library/Implementation/HTFTP.c:1142
+msgid "close master socket"
+msgstr "sulje pääpistoke"
+
+#: WWW/Library/Implementation/HTFTP.c:1204
+msgid "socket for master socket"
+msgstr "pistoke pääpistokkeelle"
+
+#: WWW/Library/Implementation/HTFTP.c:2952
+msgid "Receiving FTP directory."
+msgstr "Vastaanotetaan FTP-kansiota."
+
+#: WWW/Library/Implementation/HTFTP.c:3090
+#, c-format
+msgid "Transferred %d bytes (%5d)"
+msgstr "Siiretty %d tavua (%5d)"
+
+#: WWW/Library/Implementation/HTFTP.c:3448
+msgid "connect for data"
+msgstr "yhdistä dataa varten"
+
+#: WWW/Library/Implementation/HTFTP.c:4120
+msgid "Receiving FTP file."
+msgstr "Vastaanotetaan FTP-tiedostoa."
+
+#: WWW/Library/Implementation/HTFinger.c:274
+msgid "Could not set up finger connection."
+msgstr "Finger-yhteyden muodostaminen epäonnistui."
+
+#: WWW/Library/Implementation/HTFinger.c:321
+msgid "Could not load data (no sitename in finger URL)"
+msgstr "Datan lataaminen epäonnistui (ei sivuston nimeä finger-osoitteessa)"
+
+#: WWW/Library/Implementation/HTFinger.c:325
+msgid "Invalid port number - will only use port 79!"
+msgstr "Virheellinen porttinumero - käytetään vain porttia 79!"
+
+#: WWW/Library/Implementation/HTFinger.c:391
+msgid "Could not access finger host."
+msgstr "Finger-palvelinta ei tavoiteta."
+
+#: WWW/Library/Implementation/HTFinger.c:399
+msgid "No response from finger server."
+msgstr "Ei vastausta finger-palvelimelta."
+
+#: WWW/Library/Implementation/HTNews.c:421
+#, c-format
+msgid "Username for news host '%s':"
+msgstr "Käyttäjänimi news-palvelimelle â€%sâ€:"
+
+#: WWW/Library/Implementation/HTNews.c:474
+msgid "Change username?"
+msgstr "Vaihdetaanko käyttäjänimeä?"
+
+#: WWW/Library/Implementation/HTNews.c:478
+msgid "Username:"
+msgstr "Käyttäjänimi:"
+
+#: WWW/Library/Implementation/HTNews.c:503
+#, c-format
+msgid "Password for news host '%s':"
+msgstr "Salasana news-palvelimelle â€%sâ€:"
+
+#: WWW/Library/Implementation/HTNews.c:586
+msgid "Change password?"
+msgstr "Vaihdetaanko salasanaa?"
+
+#: WWW/Library/Implementation/HTNews.c:1707
+#, c-format
+msgid "No matches for: %s"
+msgstr "Ei osumia: %s"
+
+#: WWW/Library/Implementation/HTNews.c:1757
+msgid ""
+"\n"
+"No articles in this group.\n"
+msgstr ""
+"\n"
+"Ei artikkeleita tässä ryhmässä.\n"
+
+#: WWW/Library/Implementation/HTNews.c:1769
+msgid ""
+"\n"
+"No articles in this range.\n"
+msgstr ""
+"\n"
+"Ei artikkeleita tässä valikoimassa.\n"
+
+#.
+#. * Set window title.
+#.
+#: WWW/Library/Implementation/HTNews.c:1782
+#, c-format
+msgid "%s, Articles %d-%d"
+msgstr "%s, artikkelit %d-%d"
+
+#: WWW/Library/Implementation/HTNews.c:1805
+msgid "Earlier articles"
+msgstr "Varhaisemmat artikkelit"
+
+#: WWW/Library/Implementation/HTNews.c:1818
+#, c-format
+msgid ""
+"\n"
+"There are about %d articles currently available in %s, IDs as follows:\n"
+"\n"
+msgstr ""
+"\n"
+"%2$s :ssa on noin %1$d artikkelia, tunnisteet seuraavasti:\n"
+
+#: WWW/Library/Implementation/HTNews.c:1880
+msgid "All available articles in "
+msgstr "Kaikki saatavilla olevat artikkelit kohteessa "
+
+#: WWW/Library/Implementation/HTNews.c:2094
+msgid "Later articles"
+msgstr "Myöhäisemmät artikkelit"
+
+#: WWW/Library/Implementation/HTNews.c:2117
+msgid "Post to "
+msgstr "Lähetä kohteeseen "
+
+#: WWW/Library/Implementation/HTNews.c:2338
+msgid "This client does not contain support for SNEWS URLs."
+msgstr "Tämä asiakasohjelma ei tue SNEWS-osoitteita."
+
+#: WWW/Library/Implementation/HTNews.c:2545
+msgid "No target for raw text!"
+msgstr "Ei kohdetta raakatekstille!"
+
+#: WWW/Library/Implementation/HTNews.c:2575
+msgid "Connecting to NewsHost ..."
+msgstr "Yhdistetään NewsHostiin…"
+
+#: WWW/Library/Implementation/HTNews.c:2627
+#, c-format
+msgid "Could not access %s."
+msgstr "Ei voitu tavoittaa: %s."
+
+#: WWW/Library/Implementation/HTNews.c:2733
+#, c-format
+msgid "Can't read news info. News host %.20s responded: %.200s"
+msgstr "Ei voida lukea news-tietoja. News-palvelin %.20s vastasi: %.200s"
+
+#: WWW/Library/Implementation/HTNews.c:2737
+#, c-format
+msgid "Can't read news info, empty response from host %s"
+msgstr "Ei voida lukea news-tietoja, tyhjä vastaus palvelimelta %s"
+
+#.
+#. * List available newsgroups. - FM
+#.
+#: WWW/Library/Implementation/HTNews.c:2941
+msgid "Reading list of available newsgroups."
+msgstr "Luetaan saatavilla olevien uutisryhmien listaa."
+
+#: WWW/Library/Implementation/HTNews.c:2962
+msgid "Reading list of articles in newsgroup."
+msgstr "Luetaan uutisryhmässä olevien artikkeleiden listaa."
+
+#.
+#. * Get an article from a news group. - FM
+#.
+#: WWW/Library/Implementation/HTNews.c:2968
+msgid "Reading news article."
+msgstr "Luetaan artikkelia uutisista."
+
+#: WWW/Library/Implementation/HTNews.c:2998
+msgid "Sorry, could not load requested news."
+msgstr "Valitettavasti pyydettyjen uutisten lataaminen epäonnistui."
+
+#: WWW/Library/Implementation/HTTCP.c:1323
+msgid "Address has invalid port"
+msgstr "Osoitteella on virheellinen portti"
+
+#: WWW/Library/Implementation/HTTCP.c:1397
+msgid "Address length looks invalid"
+msgstr "Osoitteen pituus vaikuttaa virheelliseltä"
+
+#: WWW/Library/Implementation/HTTCP.c:1845
+#: WWW/Library/Implementation/HTTCP.c:1863
+#, c-format
+msgid "Unable to locate remote host %s."
+msgstr "Palvelinta %s ei kyetä löytämään."
+
+#. Not HTProgress, so warning won't be overwritten immediately;
+#. * but not HTAlert, because typically there will be other
+#. * alerts from the callers. - kw
+#.
+#: WWW/Library/Implementation/HTTCP.c:1860
+#: WWW/Library/Implementation/HTTelnet.c:115
+#, c-format
+msgid "Invalid hostname %s"
+msgstr "Virheellinen konenimi %s"
+
+#: WWW/Library/Implementation/HTTCP.c:1874
+#, c-format
+msgid "Making %s connection to %s"
+msgstr "Muodostetaan %s-yhteyttä kohteeseen %s"
+
+#: WWW/Library/Implementation/HTTCP.c:1885
+msgid "socket failed."
+msgstr "pistoke epäonnistui."
+
+#: WWW/Library/Implementation/HTTCP.c:1899
+#, c-format
+msgid "socket failed: family %d addr %s port %s."
+msgstr "pistoke epäonnistui: perhe %d osoite %s portti %s."
+
+#: WWW/Library/Implementation/HTTCP.c:1923
+msgid "Could not make connection non-blocking."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:1991
+msgid "Connection failed (too many retries)."
+msgstr "Yhteys epäonnistui (liian monta uudelleenyritystä)."
+
+#: WWW/Library/Implementation/HTTCP.c:2180
+msgid "Could not restore socket to blocking."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:2248
+msgid "Socket read failed (too many tries)."
+msgstr "Pistokkeen luku epäonnistui (liian monta yritystä)."
+
+#: WWW/Library/Implementation/HTTP.c:136
+#, c-format
+msgid "SSL callback:%s, preverify_ok=%d, ssl_okay=%d"
+msgstr "SSL-kutsu: %s, esivarmistus_ok=%d, ssl_ok=%d"
+
+#: WWW/Library/Implementation/HTTP.c:516
+#, c-format
+msgid "Address contains a username: %s"
+msgstr "Osoitteessa on käyttäjänimi: %s"
+
+#: WWW/Library/Implementation/HTTP.c:570
+#, c-format
+msgid "Certificate issued by: %s"
+msgstr "Sertifikaatin myöntänyt: %s"
+
+#: WWW/Library/Implementation/HTTP.c:757
+msgid "This client does not contain support for HTTPS URLs."
+msgstr "Tämä asiakasohjelma ei tue HTTPS-osoitteita."
+
+#: WWW/Library/Implementation/HTTP.c:782
+msgid "Unable to connect to remote host."
+msgstr "Etäkoneeseen yhdistäminen epäonnistui."
+
+#: WWW/Library/Implementation/HTTP.c:825
+msgid "Retrying connection without TLS."
+msgstr "Yritetään yhteyttä uudelleen ilman TLS:ää."
+
+#: WWW/Library/Implementation/HTTP.c:877
+msgid "GnuTLS error when trying to verify certificate."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:889
+msgid "the certificate has no known issuer"
+msgstr "sertifikaatilla ei ole tunnettua myöntäjää"
+
+#: WWW/Library/Implementation/HTTP.c:891
+msgid "no issuer was found"
+msgstr "myöntäjää ei löytynyt"
+
+#: WWW/Library/Implementation/HTTP.c:893
+msgid "issuer is not a CA"
+msgstr "myöntäjä ei ole CA"
+
+#: WWW/Library/Implementation/HTTP.c:895
+msgid "the certificate has been revoked"
+msgstr "sertifikaatti on poistettu käytöstä"
+
+#: WWW/Library/Implementation/HTTP.c:897
+msgid "the certificate is not trusted"
+msgstr "sertifikaatti ei ole luotettu"
+
+#: WWW/Library/Implementation/HTTP.c:972
+#, c-format
+msgid "Verified connection to %s (cert=%s)"
+msgstr "Varmennettu yhteys %s:n (cert=%s)"
+
+#: WWW/Library/Implementation/HTTP.c:1022
+#: WWW/Library/Implementation/HTTP.c:1064
+#, c-format
+msgid "Verified connection to %s (subj=%s)"
+msgstr "Varmennettu yhteys %s:n (subj=%s)"
+
+#: WWW/Library/Implementation/HTTP.c:1094
+msgid "Can't find common name in certificate"
+msgstr "Ei löydetä yhteistä nimeä sertifikaatissa"
+
+#: WWW/Library/Implementation/HTTP.c:1097
+#, c-format
+msgid "SSL error:host(%s)!=cert(%s)-Continue?"
+msgstr "SSL-virhe: palvelin(%s)!=cert(%s) – Jatketaanko?"
+
+#: WWW/Library/Implementation/HTTP.c:1104
+msgid "SSL error"
+msgstr "SSL-virhe"
+
+#: WWW/Library/Implementation/HTTP.c:1112
+#, c-format
+msgid "UNVERIFIED connection to %s (cert=%s)"
+msgstr "VARMENTAMAMTON yhteys %s:n (cert=%s)"
+
+#: WWW/Library/Implementation/HTTP.c:1121
+#, c-format
+msgid "Secure %d-bit %s (%s) HTTP connection"
+msgstr "Turvallinen %d-bittinen %s (%s) -HTTP-yhteys"
+
+#: WWW/Library/Implementation/HTTP.c:1584
+msgid "Sending HTTP request."
+msgstr "Lähetetään HTTP-pyyntöä."
+
+#: WWW/Library/Implementation/HTTP.c:1626
+msgid "Unexpected network write error; connection aborted."
+msgstr "Odottamaton verkon kirjoitusvirhe, yhteys keskeytetty."
+
+#: WWW/Library/Implementation/HTTP.c:1632
+msgid "HTTP request sent; waiting for response."
+msgstr "HTTP-pyyntö lähetetty, odotetaan vastausta."
+
+#: WWW/Library/Implementation/HTTP.c:1705
+#: WWW/Library/Implementation/HTTP.c:1715
+msgid "Unexpected network read error; connection aborted."
+msgstr "Odottamaton verkon lukuvirhe, yhteys keskeytetty."
+
+#.
+#. * HTTP/1.1 Informational statuses.
+#. * 100 Continue.
+#. * 101 Switching Protocols.
+#. * > 101 is unknown.
+#. * We should never get these, and they have only the status
+#. * line and possibly other headers, so we'll deal with them by
+#. * showing the full header to the user as text/plain. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:1917
+msgid "Got unexpected Informational Status."
+msgstr "Vastaanotettiin odottamaton informatiivinen tila."
+
+#.
+#. * Reset Content. The server has fulfilled the request but
+#. * nothing is returned and we should reset any form
+#. * content. We'll instruct the user to do that, and
+#. * restore the current document. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:1951
+msgid "Request fulfilled. Reset Content."
+msgstr "Pyyntö täytetty. Tyhjennetään sisältö."
+
+#. Not Modified
+#.
+#. * We didn't send an "If-Modified-Since" header, so this
+#. * status is inappropriate. We'll deal with it by showing
+#. * the full header to the user as text/plain. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2066
+msgid "Got unexpected 304 Not Modified status."
+msgstr "Vastaanotettiin odottamaton 304 Ei muokattu -tila."
+
+#: WWW/Library/Implementation/HTTP.c:2129
+msgid "Redirection of POST content requires user approval."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:2144
+msgid "Have POST content. Treating Permanent Redirection as Temporary.\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:2188
+msgid "Retrying with access authorization information."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:2200
+msgid "Show the 401 message body?"
+msgstr "Näytetäänkö 401-viestin runko?"
+
+#: WWW/Library/Implementation/HTTP.c:2244
+msgid "Show the 407 message body?"
+msgstr "Näytetäänkö 407-viestin runko?"
+
+#.
+#. * Bad or unknown server_status number. Take a chance and hope
+#. * there is something to display. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2344
+msgid "Unknown status reply from server!"
+msgstr "Tuntematon vastaus palvelimelta!"
+
+#: WWW/Library/Implementation/HTTelnet.c:113
+#, c-format
+msgid "remote %s session:"
+msgstr "%s-etäistunto:"
+
+#: WWW/Library/Implementation/HTWAIS.c:163
+msgid "Could not connect to WAIS server."
+msgstr "WAIS-palvelimeen ei voitu yhdistää."
+
+#: WWW/Library/Implementation/HTWAIS.c:171
+msgid "Could not open WAIS connection for reading."
+msgstr "WAIS-yhteyttä ei voitu avata lukemista varten."
+
+#: WWW/Library/Implementation/HTWAIS.c:193
+msgid "Diagnostic code is "
+msgstr "Diagnostiikkakoodi on "
+
+#: WWW/Library/Implementation/HTWAIS.c:460
+msgid "Index "
+msgstr "Indeksi "
+
+#: WWW/Library/Implementation/HTWAIS.c:464
+#, c-format
+msgid " contains the following %d item%s relevant to \""
+msgstr " sisätää seuraavat %d kohdetta %s, jotka liittyvät â€"
+
+#: WWW/Library/Implementation/HTWAIS.c:472
+msgid "The first figure after each entry is its relative score, "
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:473
+msgid "the second is the number of lines in the item."
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:515
+msgid " (bad file name)"
+msgstr " (huono tiedostonimi)"
+
+#: WWW/Library/Implementation/HTWAIS.c:541
+msgid "(bad doc id)"
+msgstr "(huono doc-tunniste)"
+
+#: WWW/Library/Implementation/HTWAIS.c:557
+msgid "(Short Header record, can't display)"
+msgstr "(Lyhyt otsaketietue, ei voida näyttää)"
+
+#: WWW/Library/Implementation/HTWAIS.c:564
+msgid ""
+"\n"
+"Long Header record, can't display\n"
+msgstr ""
+"\n"
+"Pitkä otsaketietue, ei voida näyttää\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:571
+msgid ""
+"\n"
+"Text record\n"
+msgstr ""
+"\n"
+"Tekstitietue\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:580
+msgid ""
+"\n"
+"Headline record, can't display\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:588
+msgid ""
+"\n"
+"Code record, can't display\n"
+msgstr ""
+"\n"
+"Kooditietue, ei voida näyttää\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:692
+msgid "Syntax error in WAIS URL"
+msgstr "Syntaksivirhe WAIS-osoitteessa"
+
+#: WWW/Library/Implementation/HTWAIS.c:764
+msgid " (WAIS Index)"
+msgstr " (WAIS-indeksi)"
+
+#: WWW/Library/Implementation/HTWAIS.c:771
+msgid "WAIS Index: "
+msgstr "WAIS-indeksi:"
+
+#: WWW/Library/Implementation/HTWAIS.c:777
+msgid "This is a link for searching the "
+msgstr "Tällä linkillä etsitään "
+
+#: WWW/Library/Implementation/HTWAIS.c:781
+msgid " WAIS Index.\n"
+msgstr " WAIS-indeksistä.\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:810
+msgid ""
+"\n"
+"Enter the 's'earch command and then specify search words.\n"
+msgstr ""
+"\n"
+"Anna â€s†etsi-komento ja määritä sitten hakusanat.\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:832
+msgid " (in "
+msgstr " (kohteessa "
+
+#: WWW/Library/Implementation/HTWAIS.c:841
+msgid "WAIS Search of \""
+msgstr "WAIS-haku: â€"
+
+#: WWW/Library/Implementation/HTWAIS.c:845
+msgid "\" in: "
+msgstr "â€, kohteessa "
+
+#: WWW/Library/Implementation/HTWAIS.c:860
+msgid "HTWAIS: Request too large."
+msgstr "HTWAIS: Pyytö on liian suuri."
+
+#: WWW/Library/Implementation/HTWAIS.c:869
+msgid "Searching WAIS database..."
+msgstr "Etsitää WAIS-tietokannasta…"
+
+#: WWW/Library/Implementation/HTWAIS.c:879
+msgid "Search interrupted."
+msgstr "Etsintä keskeytetty."
+
+#: WWW/Library/Implementation/HTWAIS.c:930
+msgid "Can't convert format of WAIS document"
+msgstr "WAIS-asiakirjan muotoa ei voida muuntaa"
+
+#: WWW/Library/Implementation/HTWAIS.c:974
+msgid "HTWAIS: Request too long."
+msgstr "HTWAIS: Pyyntö on liian pitkä."
+
+#.
+#. * Actually do the transaction given by request_message.
+#.
+#: WWW/Library/Implementation/HTWAIS.c:988
+msgid "Fetching WAIS document..."
+msgstr "Haetaan WAIS-asiakirjaa…"
+
+#. display_search_response(target, retrieval_response,
+#. wais_database, keywords);
+#: WWW/Library/Implementation/HTWAIS.c:1027
+msgid "No text was returned!\n"
+msgstr "Tekstiä ei palautettu!\n"
+
+#: WWW/Library/Implementation/HTWSRC.c:302
+msgid " NOT GIVEN in source file; "
+msgstr " EI ANNETTU lähdekooditiedostossa;"
+
+#: WWW/Library/Implementation/HTWSRC.c:325
+msgid " WAIS source file"
+msgstr " WAIS-lähdekooditiedosto"
+
+#: WWW/Library/Implementation/HTWSRC.c:332
+msgid " description"
+msgstr " kuvaus"
+
+#: WWW/Library/Implementation/HTWSRC.c:342
+msgid "Access links"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWSRC.c:363
+msgid "Direct access"
+msgstr "Suora pääsy"
+
+#. * Proxy will be used if defined, so let user know that - FM *
+#: WWW/Library/Implementation/HTWSRC.c:366
+msgid " (or via proxy server, if defined)"
+msgstr " (tai välityspalvelimen kautta, jos määritelty)"
+
+#: WWW/Library/Implementation/HTWSRC.c:381
+msgid "Maintainer"
+msgstr "Ylläpitäjä"
+
+#: WWW/Library/Implementation/HTWSRC.c:389
+msgid "Host"
+msgstr "Isäntä"
+
+#: src/GridText.c:691
+msgid "Memory exhausted, display interrupted!"
+msgstr "Muisti lopussa, näyttö keskeytynyt!"
+
+#: src/GridText.c:696
+msgid "Memory exhausted, will interrupt transfer!"
+msgstr "Muisti lopussa, siirto keskeytetään!"
+
+#: src/GridText.c:3674
+msgid " *** MEMORY EXHAUSTED ***"
+msgstr " *** MUISTI LOPUSSA ***"
+
+#: src/GridText.c:6152
+msgid "text entry field"
+msgstr "tekstikenttä"
+
+#: src/GridText.c:6155
+msgid "password entry field"
+msgstr "salasanakenttä"
+
+#: src/GridText.c:6158
+msgid "checkbox"
+msgstr "valintaruutu"
+
+#: src/GridText.c:6161
+msgid "radio button"
+msgstr "valintapainike"
+
+#: src/GridText.c:6164
+msgid "submit button"
+msgstr "lähetä-painike"
+
+#: src/GridText.c:6167
+msgid "reset button"
+msgstr "nollauspainike"
+
+#: src/GridText.c:6170
+msgid "script button"
+msgstr "skriptipainike"
+
+#: src/GridText.c:6173
+msgid "popup menu"
+msgstr "ponnahdusvalikko"
+
+#: src/GridText.c:6176
+msgid "hidden form field"
+msgstr "piilotettu lomakekenttä"
+
+#: src/GridText.c:6179
+msgid "text entry area"
+msgstr "tekstialue"
+
+#: src/GridText.c:6182
+msgid "range entry field"
+msgstr ""
+
+#: src/GridText.c:6185
+msgid "file entry field"
+msgstr "tiedostokenttä"
+
+#: src/GridText.c:6188
+msgid "text-submit field"
+msgstr ""
+
+#: src/GridText.c:6191
+msgid "image-submit button"
+msgstr ""
+
+#: src/GridText.c:6194
+msgid "keygen field"
+msgstr ""
+
+#: src/GridText.c:6197
+msgid "unknown form field"
+msgstr "tuntematon lomakekenttä"
+
+#: src/GridText.c:6217 src/GridText.c:6224 src/LYList.c:249
+msgid "unknown field or link"
+msgstr "tuntematon kenttä tai linkki"
+
+#: src/GridText.c:10650
+msgid "Can't open file for uploading"
+msgstr "Tiedoston avaaminen lähetystä varten epäonnistui"
+
+#: src/GridText.c:11843
+#, c-format
+msgid "Submitting %s"
+msgstr "Lähetetään %s"
+
+#. ugliness has happened; inform user and do the best we can
+#: src/GridText.c:12919
+msgid "Hang Detect: TextAnchor struct corrupted - suggest aborting!"
+msgstr ""
+
+#. don't show previous state
+#: src/GridText.c:13083
+msgid "Wrap lines to fit displayed area?"
+msgstr "Rivitetäänkö teksti mahtumaan näyttöalueelle?"
+
+#: src/GridText.c:13719
+msgid "Very long lines have been truncated!"
+msgstr "Hyvin pitkät rivit on lyhennetty!"
+
+#: src/HTAlert.c:164 src/LYShowInfo.c:386 src/LYShowInfo.c:390
+msgid "bytes"
+msgstr "tavua"
+
+#.
+#. * If we know the total size of the file, we can compute
+#. * a percentage, and show a corresponding progress bar.
+#.
+#: src/HTAlert.c:328 src/HTAlert.c:354
+#, c-format
+msgid "Read %s of data"
+msgstr "Luettu %s dataa"
+
+#: src/HTAlert.c:351
+#, c-format
+msgid "Read %s of %s of data"
+msgstr "Luettu %s/%s dataa"
+
+#: src/HTAlert.c:360
+#, c-format
+msgid ", %s/sec"
+msgstr ", %s/s"
+
+#: src/HTAlert.c:374
+#, c-format
+msgid " (stalled for %s)"
+msgstr ""
+
+#: src/HTAlert.c:378
+#, c-format
+msgid ", ETA %s"
+msgstr ", jäljellä %s"
+
+#: src/HTAlert.c:400
+msgid " (Press 'z' to abort)"
+msgstr " (â€z†keskeyttää)"
+
+#. Meta-note: don't move the following note from its place right
+#. in front of the first gettext(). As it is now, it should
+#. automatically appear in generated lynx.pot files. - kw
+#.
+#. NOTE TO TRANSLATORS: If you provide a translation for "yes", lynx
+#. * will take the first byte of the translation as a positive response
+#. * to Yes/No questions. If you provide a translation for "no", lynx
+#. * will take the first byte of the translation as a negative response
+#. * to Yes/No questions. For both, lynx will also try to show the
+#. * first byte in the prompt as a character, instead of (y) or (n),
+#. * respectively. This will not work right for multibyte charsets!
+#. * Don't translate "yes" and "no" for CJK character sets (or translate
+#. * them to "yes" and "no"). For a translation using UTF-8, don't
+#. * translate if the translation would begin with anything but a 7-bit
+#. * (US_ASCII) character. That also means do not translate if the
+#. * translation would begin with anything but a 7-bit character, if
+#. * you use a single-byte character encoding (a charset like ISO-8859-n)
+#. * but anticipate that the message catalog may be used re-encoded in
+#. * UTF-8 form.
+#. * For translations using other character sets, you may also wish to
+#. * leave "yes" and "no" untranslated, if using (y) and (n) is the
+#. * preferred behavior.
+#. * Lynx will also accept y Y n N as responses unless there is a conflict
+#. * with the first letter of the "yes" or "no" translation.
+#.
+#: src/HTAlert.c:438 src/HTAlert.c:486
+msgid "yes"
+msgstr "kyllä"
+
+#: src/HTAlert.c:441 src/HTAlert.c:487
+msgid "no"
+msgstr "ei"
+
+#.
+#. * Special-purpose workaround for gettext support (we should do
+#. * this in a more general way) -TD
+#. *
+#. * NOTE TO TRANSLATORS: If the prompt has been rendered into
+#. * another language, and if yes/no are distinct, assume the
+#. * translator can make an ordered list in parentheses with one
+#. * capital letter for each as we assumed in HTConfirmDefault().
+#. * The list has to be in the same order as in the original message,
+#. * and the four capital letters chosen to not match those in the
+#. * original unless they have the same position.
+#. *
+#. * Example:
+#. * (Y/N/Always/neVer) - English (original)
+#. * (O/N/Toujours/Jamais) - French
+#.
+#: src/HTAlert.c:940
+msgid "Y/N/A/V"
+msgstr "K/E/A/S"
+
+#: src/HTML.c:5931
+msgid "Description:"
+msgstr "Kuvaus:"
+
+#: src/HTML.c:5936
+msgid "(none)"
+msgstr "(ei mitään)"
+
+#: src/HTML.c:5940
+msgid "Filepath:"
+msgstr "Tiedoston polku:"
+
+#: src/HTML.c:5946
+msgid "(unknown)"
+msgstr "(tuntematon)"
+
+#: src/HTML.c:7386
+msgid "Document has only hidden links. Use the 'l'ist command."
+msgstr "Sivulla on vain piilotettuja linkkejä. Käytä â€lâ€ista-komentoa."
+
+#: src/HTML.c:7885
+msgid "Source cache error - disk full?"
+msgstr "Lähdevälimuistivirhe – onko levy täynnä?"
+
+#: src/HTML.c:7898
+msgid "Source cache error - not enough memory!"
+msgstr ""
+
+#: src/LYBookmark.c:167
+msgid ""
+" This file is an HTML representation of the X Mosaic hotlist file.\n"
+" Outdated or invalid links may be removed by using the\n"
+" remove bookmark command, it is usually the 'R' key but may have\n"
+" been remapped by you or your system administrator."
+msgstr ""
+
+#: src/LYBookmark.c:378
+#, c-format
+msgid ""
+" You can delete links by the 'R' key<br>\n"
+"<ol>\n"
+msgstr ""
+" Linkkejä voi poistaa näppäimellä â€Râ€<br>\n"
+"<ol>\n"
+
+#: src/LYBookmark.c:381
+msgid ""
+" You can delete links using the remove bookmark command. It is usually\n"
+" the 'R' key but may have been remapped by you or your system\n"
+" administrator."
+msgstr ""
+
+#: src/LYBookmark.c:385
+msgid ""
+" This file also may be edited with a standard text editor to delete\n"
+" outdated or invalid links, or to change their order."
+msgstr ""
+
+#: src/LYBookmark.c:388
+msgid ""
+"Note: if you edit this file manually\n"
+" you should not change the format within the lines\n"
+" or add other HTML markup.\n"
+" Make sure any bookmark link is saved as a single line."
+msgstr ""
+
+#: src/LYBookmark.c:684
+#, c-format
+msgid "File may be recoverable from %s during this session"
+msgstr ""
+
+#: src/LYCgi.c:162
+#, c-format
+msgid "Do you want to execute \"%s\"?"
+msgstr "Haluatko suorittaa: â€%sâ€?"
+
+#.
+#. * Neither the path as given nor any components examined by backing up
+#. * were stat()able. - kw
+#.
+#: src/LYCgi.c:277
+msgid "Unable to access cgi script"
+msgstr ""
+
+#: src/LYCgi.c:711 src/LYCgi.c:714
+msgid "Good Advice"
+msgstr "Hyvä neuvo"
+
+#: src/LYCgi.c:718
+msgid "An excellent http server for VMS is available via"
+msgstr "Loistava http-palvelin VMS:lle on saatavilla"
+
+#: src/LYCgi.c:725
+msgid "this link"
+msgstr "tästä linkistä"
+
+#: src/LYCgi.c:729
+msgid "It provides state of the art CGI script support.\n"
+msgstr "Se tukee uusinta CGI-skriptiteknologiaa.\n"
+
+#: src/LYClean.c:115
+msgid "Exiting via interrupt:"
+msgstr "Poistutaan, keskeytys:"
+
+#: src/LYCookie.c:2541
+msgid "(from a previous session)"
+msgstr "(edellisestä istunnosta)"
+
+#: src/LYCookie.c:2602
+msgid "Maximum Gobble Date:"
+msgstr ""
+
+#: src/LYCookie.c:2641
+msgid "Internal"
+msgstr "Sisäinen"
+
+#: src/LYCookie.c:2642
+msgid "cookie_domain_flag_set error, aborting program"
+msgstr ""
+
+#: src/LYCurses.c:1170
+msgid "Terminal reinitialisation failed - unknown terminal type?"
+msgstr "Päätteen uudelleenalustus epäonnistui – tuntematon päätetyyppi?"
+
+#: src/LYCurses.c:1377
+msgid "Terminal initialisation failed - unknown terminal type?"
+msgstr "Päätteen alustus epäonnistui – tuntematon päätetyyppi?"
+
+#: src/LYCurses.c:1863
+msgid "Terminal ="
+msgstr "Pääte ="
+
+#: src/LYCurses.c:1867
+msgid "You must use a vt100, 200, etc. terminal with this program."
+msgstr "Tämän ohjelman kanssa on käytettävä vt100-, 200-, tms. päätettä."
+
+#: src/LYCurses.c:1916
+msgid "Your Terminal type is unknown!"
+msgstr "Päätetyyppi on tuntematon!"
+
+#: src/LYCurses.c:1917
+msgid "Enter a terminal type:"
+msgstr "Anna päätetyyppi:"
+
+#: src/LYCurses.c:1931
+msgid "TERMINAL TYPE IS SET TO"
+msgstr "PÄÄTETYYPPI ON NYT"
+
+#: src/LYCurses.c:2483
+#, c-format
+msgid ""
+"\n"
+"A Fatal error has occurred in %s Ver. %s\n"
+msgstr ""
+"\n"
+"Vakava virhe tapahtui %s versiossa %s\n"
+
+#: src/LYCurses.c:2486
+#, c-format
+msgid ""
+"\n"
+"Please notify your system administrator to confirm a bug, and if\n"
+"confirmed, to notify the lynx-dev list. Bug reports should have concise\n"
+"descriptions of the command and/or URL which causes the problem, the\n"
+"operating system name with version number, the TCPIP implementation, the\n"
+"TRACEBACK if it can be captured, and any other relevant information.\n"
+msgstr ""
+
+#: src/LYEdit.c:272
+#, c-format
+msgid "Error starting editor, %s"
+msgstr "Virhe käynnistettäessä muokkainta, %s"
+
+#: src/LYEdit.c:275
+msgid "Editor killed by signal"
+msgstr "Muokkaimen lopetti signaali"
+
+#: src/LYEdit.c:280
+#, c-format
+msgid "Editor returned with error status %s"
+msgstr "Muokkain palautti virhetilakoodin %s"
+
+#: src/LYDownload.c:509
+msgid "Downloaded link:"
+msgstr "Ladattu linkki:"
+
+#: src/LYDownload.c:514
+msgid "Suggested file name:"
+msgstr "Ehdotettu tiedostonimi:"
+
+#: src/LYDownload.c:519
+msgid "Standard download options:"
+msgstr "Yleiset latausvaihtoehdot:"
+
+#: src/LYDownload.c:520
+msgid "Download options:"
+msgstr "Latausvalinnat:"
+
+#: src/LYDownload.c:536
+msgid "Save to disk"
+msgstr "Tallenna levylle"
+
+#: src/LYDownload.c:550
+msgid "View temporary file"
+msgstr "Katso väliaikaistiedostoa"
+
+#: src/LYDownload.c:557
+msgid "Save to disk disabled."
+msgstr "Levylle tallennus pois käytöstä."
+
+#: src/LYDownload.c:561 src/LYPrint.c:1330
+msgid "Local additions:"
+msgstr "Paikalliset lisäykset:"
+
+#: src/LYDownload.c:572 src/LYUpload.c:206
+msgid "No Name Given"
+msgstr "Nimeä ei annettu"
+
+#: src/LYHistory.c:680
+msgid "You selected:"
+msgstr "Valitsit:"
+
+#: src/LYHistory.c:704 src/LYHistory.c:933
+msgid "(no address)"
+msgstr "(ei osoitetta)"
+
+#: src/LYHistory.c:708
+msgid " (internal)"
+msgstr " (sisäinen)"
+
+#: src/LYHistory.c:710
+msgid " (was internal)"
+msgstr " (oli sisäinen)"
+
+#: src/LYHistory.c:808
+msgid " (From History)"
+msgstr " (Historiasta)"
+
+#: src/LYHistory.c:853
+msgid "You visited (POSTs, bookmark, menu and list files excluded):"
+msgstr ""
+
+#: src/LYHistory.c:1155
+msgid "(No messages yet)"
+msgstr "(Ei vielä viestejä)"
+
+#: src/LYLeaks.c:222
+msgid "Invalid pointer detected."
+msgstr "Epäkelpo osoitin tunnistettu."
+
+#: src/LYLeaks.c:224 src/LYLeaks.c:262
+msgid "Sequence:"
+msgstr ""
+
+#: src/LYLeaks.c:227 src/LYLeaks.c:265
+msgid "Pointer:"
+msgstr "Osoitin:"
+
+#: src/LYLeaks.c:236 src/LYLeaks.c:243 src/LYLeaks.c:284
+msgid "FileName:"
+msgstr "Tiedostonimi:"
+
+#: src/LYLeaks.c:239 src/LYLeaks.c:246 src/LYLeaks.c:287 src/LYLeaks.c:298
+msgid "LineCount:"
+msgstr "Rivimäärä:"
+
+#: src/LYLeaks.c:260
+msgid "Memory leak detected."
+msgstr "Muistivuoto havaittu."
+
+#: src/LYLeaks.c:268
+msgid "Contains:"
+msgstr "Sisältää:"
+
+#: src/LYLeaks.c:281
+msgid "ByteSize:"
+msgstr "Tavukoko:"
+
+#: src/LYLeaks.c:295
+msgid "realloced:"
+msgstr "Uudelleen varattu:"
+
+#: src/LYLeaks.c:316
+msgid "Total memory leakage this run:"
+msgstr "Muistivuotoja yhteensä tällä suorituskerralla:"
+
+#: src/LYLeaks.c:320
+msgid "Peak allocation"
+msgstr "Hiuppuvaraus"
+
+#: src/LYLeaks.c:322
+msgid "Bytes allocated"
+msgstr "Tavuja varattu"
+
+#: src/LYLeaks.c:324
+msgid "Total mallocs"
+msgstr "Yhteensä malloc-kutsuja"
+
+#: src/LYLeaks.c:326
+msgid "Total frees"
+msgstr "Yhteensä free-kutsuja"
+
+#: src/LYList.c:89
+msgid "References in "
+msgstr "Viittaukset "
+
+#: src/LYList.c:92
+msgid "this document:"
+msgstr "tässä asiakirjassa:"
+
+#: src/LYList.c:98
+msgid "Visible links:"
+msgstr "Näkyvät linkit:"
+
+#: src/LYList.c:202 src/LYList.c:321
+msgid "Hidden links:"
+msgstr "Piilotetut linkit:"
+
+#: src/LYList.c:358
+msgid "References"
+msgstr "Viitteet"
+
+#: src/LYList.c:362
+msgid "Visible links"
+msgstr "Näkyvät linkit"
+
+#: src/LYLocal.c:289
+#, c-format
+msgid "Unable to get status of '%s'."
+msgstr "â€%sâ€:n tilan hakeminen epäonnistui."
+
+#: src/LYLocal.c:354
+msgid "The selected item is not a file or a directory! Request ignored."
+msgstr "Valittu kohde ei ole tiedosto eikä kansio! Pyyntö ohitettu."
+
+#: src/LYLocal.c:456
+#, c-format
+msgid "Unable to %s due to system error!"
+msgstr "Ei voitu suorittaa toimintoa %s järjestelmävirheen takia!"
+
+#: src/LYLocal.c:490
+#, c-format
+msgid "Probable failure to %s due to system error!"
+msgstr ""
+
+#: src/LYLocal.c:555 src/LYLocal.c:578
+#, c-format
+msgid "remove %s"
+msgstr "poista %s"
+
+#: src/LYLocal.c:598
+#, c-format
+msgid "touch %s"
+msgstr "touch %s"
+
+#: src/LYLocal.c:628
+#, c-format
+msgid "move %s to %s"
+msgstr "siirrä %s → %s"
+
+#: src/LYLocal.c:676
+msgid "There is already a directory with that name! Request ignored."
+msgstr "Sillä nimellä on jo kansio! Pyyntö ohitettu."
+
+#: src/LYLocal.c:678
+msgid "There is already a file with that name! Request ignored."
+msgstr "Sillä nimellä on jo tiedosto! Pyyntö ohitettu."
+
+#: src/LYLocal.c:680
+msgid "The specified name is already in use! Request ignored."
+msgstr "Määritelty nimi on jo käytössä! Pyyntö ohitettu."
+
+#: src/LYLocal.c:692
+msgid "Destination has different owner! Request denied."
+msgstr "Kohteella on eri omistaja! Pyyntö kielletty."
+
+#: src/LYLocal.c:695
+msgid "Destination is not a valid directory! Request denied."
+msgstr "Kohde ei ole kelpaava kansio! Pyyntö kielletty."
+
+#: src/LYLocal.c:711
+msgid "Source and destination are the same location! Request ignored!"
+msgstr "Lähde ja kohde ovat sama sijainti! Pyyntö ohitettu."
+
+#: src/LYLocal.c:735
+msgid "Remove all tagged files and directories?"
+msgstr ""
+
+#: src/LYLocal.c:808
+msgid "Enter new location for tagged items: "
+msgstr ""
+
+#: src/LYLocal.c:906
+msgid "Enter new name for directory: "
+msgstr "Kirjoita uusi nimi kansiolle:"
+
+#: src/LYLocal.c:908
+msgid "Enter new name for file: "
+msgstr "Kirjoita uusi nimi tiedostolle:"
+
+#: src/LYLocal.c:920
+msgid "Illegal character (path-separator) found! Request ignored."
+msgstr "Ei-sallittu merkki (polkuerotin) löydetty! Pyyntö ohitettu."
+
+#: src/LYLocal.c:970
+msgid "Enter new location for directory: "
+msgstr "Kirjoita uusi sijainti kansiolle:"
+
+#: src/LYLocal.c:972
+msgid "Enter new location for file: "
+msgstr "Kirjoita uusi sijainti tiedostolle:"
+
+#: src/LYLocal.c:999
+msgid "Unexpected failure - unable to find trailing path separator"
+msgstr ""
+
+#: src/LYLocal.c:1061
+msgid "Modify name, location, or permission (n, l, or p): "
+msgstr ""
+
+#: src/LYLocal.c:1063
+msgid "Modify name or location (n or l): "
+msgstr ""
+
+#.
+#. * Code for changing ownership needed here.
+#.
+#: src/LYLocal.c:1092
+msgid "This feature not yet implemented!"
+msgstr "Tätä ominaisuutta ei ole vielä toteutettu!"
+
+#: src/LYLocal.c:1113
+msgid "Enter name of file to create: "
+msgstr "Kirjoita luotavan tiedoston nimi:"
+
+#: src/LYLocal.c:1116 src/LYLocal.c:1153
+msgid "Illegal redirection \"//\" found! Request ignored."
+msgstr "Ei-sallittu ohjaus â€//†löydetty! Pyyntö ohitettu."
+
+#: src/LYLocal.c:1150
+msgid "Enter name for new directory: "
+msgstr "Kirjoita uuden kansion nimi:"
+
+#: src/LYLocal.c:1191
+msgid "Create file or directory (f or d): "
+msgstr "Luodaanko â€f†tiedosto vai â€d†kansio:"
+
+#: src/LYLocal.c:1233
+#, c-format
+msgid "Remove directory '%s'?"
+msgstr "Poistetaanko kansio â€%sâ€?"
+
+#: src/LYLocal.c:1236
+msgid "Remove directory?"
+msgstr "Poistetaanko kansio?"
+
+#: src/LYLocal.c:1241
+#, c-format
+msgid "Remove file '%s'?"
+msgstr "Poistetaanko tiedosto â€%sâ€?"
+
+#: src/LYLocal.c:1243
+msgid "Remove file?"
+msgstr "Poistetaanko tiedosto?"
+
+#: src/LYLocal.c:1248
+#, c-format
+msgid "Remove symbolic link '%s'?"
+msgstr "Poistetaanko symbolinen linkki â€%sâ€?"
+
+#: src/LYLocal.c:1250
+msgid "Remove symbolic link?"
+msgstr "Poistetaanko symbolinen linkki?"
+
+#: src/LYLocal.c:1348
+msgid "Sorry, don't know how to permit non-UNIX files yet."
+msgstr ""
+
+#: src/LYLocal.c:1377
+msgid "Unable to open permit options file"
+msgstr ""
+
+#: src/LYLocal.c:1405
+msgid "Specify permissions below:"
+msgstr "Määrittele oikeudet alle:"
+
+#: src/LYLocal.c:1406 src/LYShowInfo.c:287
+msgid "Owner:"
+msgstr "Omistaja"
+
+#: src/LYLocal.c:1422
+msgid "Group"
+msgstr "Ryhmä"
+
+#: src/LYLocal.c:1438
+msgid "Others:"
+msgstr "Muut:"
+
+#: src/LYLocal.c:1456
+msgid "form to permit"
+msgstr ""
+
+#: src/LYLocal.c:1552
+msgid "Invalid mode format."
+msgstr ""
+
+#: src/LYLocal.c:1556
+msgid "Invalid syntax format."
+msgstr ""
+
+#: src/LYLocal.c:1743
+msgid "Warning! UUDecoded file will exist in the directory you started Lynx."
+msgstr ""
+
+#: src/LYLocal.c:1933
+msgid "NULL URL pointer"
+msgstr ""
+
+#: src/LYLocal.c:2015
+#, c-format
+msgid "Executing %s "
+msgstr "Suoritetaan %s "
+
+#: src/LYLocal.c:2018
+msgid "Executing system command. This might take a while."
+msgstr "Suoritetaan järjestelmäkomento. Tässä saattaa kestää."
+
+#: src/LYLocal.c:2092
+msgid "Current directory:"
+msgstr "Kansio:"
+
+#: src/LYLocal.c:2095 src/LYLocal.c:2113
+msgid "Current selection:"
+msgstr "Valinta:"
+
+#: src/LYLocal.c:2099
+msgid "Nothing currently selected."
+msgstr "Mitään ei ole valittuna."
+
+#: src/LYLocal.c:2115
+msgid "tagged item:"
+msgstr ""
+
+#: src/LYLocal.c:2116
+msgid "tagged items:"
+msgstr ""
+
+#: src/LYLocal.c:2216 src/LYLocal.c:2225
+msgid "Illegal filename; request ignored."
+msgstr "Ei sallittu tiedostonimi, pyyntö ohitettu."
+
+#. directory not writable
+#: src/LYLocal.c:2323 src/LYLocal.c:2382
+msgid "Install in the selected directory not permitted."
+msgstr "Asennus valitussa kansiossa ei ole sallittu."
+
+#: src/LYLocal.c:2378
+msgid "The selected item is not a directory! Request ignored."
+msgstr ""
+
+#: src/LYLocal.c:2387
+msgid "Just a moment, ..."
+msgstr "Pieni hetki, …"
+
+#: src/LYLocal.c:2404
+msgid "Error building install args"
+msgstr ""
+
+#: src/LYLocal.c:2419 src/LYLocal.c:2450
+#, c-format
+msgid "Source and target are the same: %s"
+msgstr "Lähde ja kohde ovat sama: %s"
+
+#: src/LYLocal.c:2426 src/LYLocal.c:2457
+#, c-format
+msgid "Already in target directory: %s"
+msgstr "Ollaan jo kohdekansiossa: %s"
+
+#: src/LYLocal.c:2475
+msgid "Installation complete"
+msgstr "Asennus valmis"
+
+#: src/LYLocal.c:2680
+msgid "Temporary URL or list would be too long."
+msgstr "Tilapäis-URL-lista olisi liian pitkä."
+
+#: src/LYMail.c:566
+msgid "Sending"
+msgstr "Lähetetään"
+
+#: src/LYMail.c:1050
+#, c-format
+msgid "The link %s :?: %s \n"
+msgstr "Linkki %s :?: %s \n"
+
+#: src/LYMail.c:1052
+#, c-format
+msgid "called \"%s\"\n"
+msgstr "nimeltä â€%sâ€\n"
+
+#: src/LYMail.c:1053
+#, c-format
+msgid "in the file \"%s\" called \"%s\"\n"
+msgstr "tiedostossa â€%s†nimeltä â€%sâ€\n"
+
+#: src/LYMail.c:1054
+msgid "was requested but was not available."
+msgstr "pyydettiin, mutta ei ollut saatavilla."
+
+#: src/LYMail.c:1055
+msgid "Thought you might want to know."
+msgstr "Ajattelin, että saatat haluta tietää."
+
+#: src/LYMail.c:1057
+msgid "This message was automatically generated by"
+msgstr "Tämän viestin on automaattisesti luonut"
+
+#: src/LYMail.c:1770
+msgid "No system mailer configured"
+msgstr "Järjestelmän postitinta ei ole konfiguroitu!"
+
+#: src/LYMain.c:1071
+msgid "No Winsock found, sorry."
+msgstr "Winsockia ei löytynyt."
+
+#: src/LYMain.c:1262
+msgid "You MUST define a valid TMP or TEMP area!"
+msgstr "Kelpaava TMP- tai TEMP-alue TÄYTYY määritellä!"
+
+#: src/LYMain.c:1315 src/LYMainLoop.c:5283
+msgid "No such directory"
+msgstr "Kansiota ei ole"
+
+#: src/LYMain.c:1509
+#, c-format
+msgid ""
+"\n"
+"Configuration file \"%s\" is not available.\n"
+"\n"
+msgstr ""
+"\n"
+"Asetustiedosto â€%s†ei ole saatavilla.\n"
+"\n"
+
+#: src/LYMain.c:1519
+#, c-format
+msgid ""
+"\n"
+"Lynx character sets not declared.\n"
+"\n"
+msgstr ""
+"\n"
+"Lynxin merkistökoodauksia ei ole määritelty.\n"
+
+#: src/LYMain.c:1675
+#, c-format
+msgid "Ignored %d characters from standard input.\n"
+msgstr "Ohitettiin %d merkkiä standardista sisääntulosta.\n"
+
+#: src/LYMain.c:1677
+#, c-format
+msgid "Use \"-stdin\" or \"-\" to tell how to handle piped input.\n"
+msgstr ""
+
+#: src/LYMain.c:1835
+msgid "Warning:"
+msgstr "Varoitus:"
+
+#: src/LYMain.c:2405
+msgid "persistent cookies state will be changed in next session only."
+msgstr ""
+
+#: src/LYMain.c:2642 src/LYMain.c:2687
+#, c-format
+msgid "Lynx: ignoring unrecognized charset=%s\n"
+msgstr "Lynx: ohitetaan tunnistamaton merkistö=%s\n"
+
+#: src/LYMain.c:3206
+#, c-format
+msgid "%s Version %s (%s)"
+msgstr "%s versio %s (%s)"
+
+#: src/LYMain.c:3247
+#, c-format
+msgid "Built on %s%s.\n"
+msgstr "Käännetty %s%s.\n"
+
+#: src/LYMain.c:3261
+msgid "Copyrights held by the Lynx Developers Group,"
+msgstr "Tekijänoikeudet: Lynx-kehittäjien ryhmä,"
+
+#: src/LYMain.c:3262
+msgid "the University of Kansas, CERN, and other contributors."
+msgstr "Kansasin yliopisto, CERN ja muut avustajat."
+
+#: src/LYMain.c:3263
+msgid "Distributed under the GNU General Public License (Version 2)."
+msgstr "Jaellaan GNU General Public License (versio 2) -lisenssin ehdoilla."
+
+#: src/LYMain.c:3264
+msgid "See http://lynx.invisible-island.net/ and the online help for more information."
+msgstr "Lisätietoja: http://lynx.invisible-island.net/ ja verkko-opasteesta."
+
+#: src/LYMain.c:4107
+#, c-format
+msgid "USAGE: %s [options] [file]\n"
+msgstr "KÄYTTÖ: %s [valitsimet] [tiedosto]\n"
+
+#: src/LYMain.c:4108
+#, c-format
+msgid "Options are:\n"
+msgstr "Valitsimet ovat:\n"
+
+#: src/LYMain.c:4411
+#, c-format
+msgid "%s: Invalid Option: %s\n"
+msgstr "%s: Virheellinen valitsin: %s\n"
+
+#: src/LYMainLoop.c:572
+#, c-format
+msgid "Internal error: Invalid mouse link %d!"
+msgstr "Sisäinen virhe: Epäkelpo hiirilinkki %d!"
+
+#: src/LYMainLoop.c:693 src/LYMainLoop.c:5305
+msgid "A URL specified by the user"
+msgstr "Käyttäjän määrittelemä URL"
+
+#: src/LYMainLoop.c:1142
+msgid "Enctype multipart/form-data not yet supported! Cannot submit."
+msgstr ""
+
+#.
+#. * Make a name for this help file.
+#.
+#: src/LYMainLoop.c:3196
+msgid "Help Screen"
+msgstr "Opaste"
+
+#: src/LYMainLoop.c:3327
+msgid "System Index"
+msgstr "Järjestelmäindeksi"
+
+#: src/LYMainLoop.c:3575
+#, c-format
+msgid "Query parameter %d: "
+msgstr "Kyselyparametri %d:"
+
+#: src/LYMainLoop.c:3804 src/LYMainLoop.c:5581
+msgid "Entry into main screen"
+msgstr ""
+
+#: src/LYMainLoop.c:4062
+msgid "No next document present"
+msgstr "Seuraavaa asiakirjaa ei ole"
+
+#: src/LYMainLoop.c:4357
+msgid "charset for this document specified explicitly, sorry..."
+msgstr "tämän asiakirjan koodaus on määritelty..."
+
+#: src/LYMainLoop.c:5263
+msgid "cd to:"
+msgstr "cd:"
+
+#: src/LYMainLoop.c:5286
+msgid "A component of path is not a directory"
+msgstr ""
+
+#: src/LYMainLoop.c:5289
+msgid "failed to change directory"
+msgstr "kansion vaihtaminen epäonnistui"
+
+#: src/LYMainLoop.c:6515
+msgid "Reparsing document under current settings..."
+msgstr ""
+
+#: src/LYMainLoop.c:6809
+#, c-format
+msgid "Fatal error - could not open output file %s\n"
+msgstr ""
+
+#: src/LYMainLoop.c:7151
+msgid "TABLE center enable."
+msgstr ""
+
+#: src/LYMainLoop.c:7154
+msgid "TABLE center disable."
+msgstr ""
+
+#: src/LYMainLoop.c:7234
+msgid "Current URL is empty."
+msgstr "Nykyinen URL on tyhjä."
+
+#: src/LYMainLoop.c:7236 src/LYUtils.c:1917
+msgid "Copy to clipboard failed."
+msgstr "Leikepöydälle kopioiminen epäonnistui."
+
+#: src/LYMainLoop.c:7238
+msgid "Document URL put to clipboard."
+msgstr "Asiakirjan URL kopioitu leikepöydälle."
+
+#: src/LYMainLoop.c:7240
+msgid "Link URL put to clipboard."
+msgstr "Linkin URL kopioitu leikepöydälle."
+
+#: src/LYMainLoop.c:7267
+msgid "No URL in the clipboard."
+msgstr "Ei URL:ää leikepöydällä."
+
+#: src/LYMainLoop.c:7960 src/LYMainLoop.c:8131
+msgid "-index-"
+msgstr "-indeksi-"
+
+#: src/LYMainLoop.c:8069
+msgid "lynx: Can't access startfile"
+msgstr "lynx: Ei päästy käsiksi aloitustiedostoon"
+
+#: src/LYMainLoop.c:8081
+msgid "lynx: Start file could not be found or is not text/html or text/plain"
+msgstr "lynx: Aloitustiedostoa ei löytynyt tai se ei ole tyyppiä text/html tai text/plain"
+
+#: src/LYMainLoop.c:8082
+msgid " Exiting..."
+msgstr " Poistutaan…"
+
+#: src/LYMainLoop.c:8125
+msgid "-more-"
+msgstr "-lisää-"
+
+#. Enable scrolling.
+#: src/LYNews.c:186
+msgid "You will be posting to:"
+msgstr ""
+
+#.
+#. * Get the mail address for the From header, offering personal_mail_address
+#. * as default.
+#.
+#: src/LYNews.c:195
+msgid ""
+"\n"
+"\n"
+" Please provide your mail address for the From: header\n"
+msgstr ""
+"\n"
+"\n"
+"Anna sähköpostiosoitteesi From: -otsakkeessa\n"
+
+#.
+#. * Get the Subject header, offering the current document's title as the
+#. * default if this is a followup rather than a new post. - FM
+#.
+#: src/LYNews.c:212
+msgid ""
+"\n"
+"\n"
+" Please provide or edit the Subject: header\n"
+msgstr ""
+"\n"
+"\n"
+"Anna tai muokkaa Subject: -otsaketta\n"
+
+#: src/LYNews.c:302
+msgid ""
+"\n"
+"\n"
+" Please provide or edit the Organization: header\n"
+msgstr ""
+"\n"
+"\n"
+"Anna tai muokkaa Organization: -otsaketta\n"
+
+#.
+#. * Use the built in line editior.
+#.
+#: src/LYNews.c:359
+msgid ""
+"\n"
+"\n"
+" Please enter your message below."
+msgstr ""
+"\n"
+"\n"
+" Kirjoita viestisi alle."
+
+#: src/LYNews.c:405
+msgid "Message has no original text!"
+msgstr "Viestissä ei ole alkuperäistä tekstiä!"
+
+#: src/LYOptions.c:774
+msgid "review/edit B)ookmarks files"
+msgstr "B) katsele/muokkaa kirjanmerkkitiedostoja"
+
+#: src/LYOptions.c:776
+msgid "B)ookmark file: "
+msgstr "B) kirjanmerkkitiedosto:"
+
+#: src/LYOptions.c:2123 src/LYOptions.c:2130
+msgid "ON"
+msgstr "PÄÄLLÄ"
+
+#. verbose_img variable
+#: src/LYOptions.c:2124 src/LYOptions.c:2129 src/LYOptions.c:2302
+#: src/LYOptions.c:2313
+msgid "OFF"
+msgstr "POIS"
+
+#: src/LYOptions.c:2125
+msgid "NEVER"
+msgstr "EI KOSKAAN"
+
+#: src/LYOptions.c:2126
+msgid "ALWAYS"
+msgstr "AINA"
+
+#: src/LYOptions.c:2142 src/LYOptions.c:2294
+msgid "ignore"
+msgstr "ohita"
+
+#: src/LYOptions.c:2143
+msgid "ask user"
+msgstr "kysy"
+
+#: src/LYOptions.c:2144
+msgid "accept all"
+msgstr "hyväksy kaikki"
+
+#: src/LYOptions.c:2156
+msgid "ALWAYS OFF"
+msgstr "AINA POIS"
+
+#: src/LYOptions.c:2157
+msgid "FOR LOCAL FILES ONLY"
+msgstr "VAIN PAIKALLISILLE TIEDOSTOILLE"
+
+#: src/LYOptions.c:2159
+msgid "ALWAYS ON"
+msgstr "AINA PÄÄLLÄ"
+
+#: src/LYOptions.c:2171
+msgid "Numbers act as arrows"
+msgstr "Numerot toimivat nuolina"
+
+#: src/LYOptions.c:2173
+msgid "Links are numbered"
+msgstr "Linkit on numeroitu"
+
+#: src/LYOptions.c:2176
+msgid "Links and form fields are numbered"
+msgstr "Linkit ja lomakkeiden kentät on numeroitu"
+
+#: src/LYOptions.c:2179
+msgid "Form fields are numbered"
+msgstr "Lomakkeiden kentät on numeroitu"
+
+#: src/LYOptions.c:2194
+msgid "Case insensitive"
+msgstr "Kirjainkoolla ei merkitystä"
+
+#: src/LYOptions.c:2195
+msgid "Case sensitive"
+msgstr "Huomioi kirjainkoko"
+
+#: src/LYOptions.c:2229
+msgid "prompt normally"
+msgstr "kysy tavallisesti"
+
+#: src/LYOptions.c:2230
+msgid "force yes-response"
+msgstr "pakota kyllä-vastaus"
+
+#: src/LYOptions.c:2231
+msgid "force no-response"
+msgstr "pakota ei-vastaus"
+
+#: src/LYOptions.c:2249
+msgid "Novice"
+msgstr "Aloittelija"
+
+#: src/LYOptions.c:2250
+msgid "Intermediate"
+msgstr "Keskitaso"
+
+#: src/LYOptions.c:2251
+msgid "Advanced"
+msgstr "Edistynyt"
+
+#: src/LYOptions.c:2260
+msgid "By First Visit"
+msgstr "Ensimmäisen vierailukerran mukaan"
+
+#: src/LYOptions.c:2262
+msgid "By First Visit Reversed"
+msgstr "Ensimmäisen vierailukerran mukaan käänteinen"
+
+#: src/LYOptions.c:2263
+msgid "As Visit Tree"
+msgstr "Vierailupuuna"
+
+#: src/LYOptions.c:2264
+msgid "By Last Visit"
+msgstr "Viimeisimmän vierailukerran mukaan"
+
+#: src/LYOptions.c:2266
+msgid "By Last Visit Reversed"
+msgstr "Viimeisimmän vierailukerran mukaan käänteinen"
+
+#. Old_DTD variable
+#: src/LYOptions.c:2277
+msgid "relaxed (TagSoup mode)"
+msgstr "rento (TagSoup)"
+
+#: src/LYOptions.c:2278
+msgid "strict (SortaSGML mode)"
+msgstr "tiukka (SortaSGML)"
+
+#: src/LYOptions.c:2285
+msgid "Ignore"
+msgstr "Ohita"
+
+#: src/LYOptions.c:2286
+msgid "Add to trace-file"
+msgstr "Lisää jäljitystiedostoon"
+
+#: src/LYOptions.c:2287
+msgid "Add to LYNXMESSAGES"
+msgstr "Lisää LYNXMESSAGESiin"
+
+#: src/LYOptions.c:2288
+msgid "Warn, point to trace-file"
+msgstr "Varoita, osoita järljitystiedostoon"
+
+#: src/LYOptions.c:2295
+msgid "as labels"
+msgstr "nimiöinä"
+
+#: src/LYOptions.c:2296
+msgid "as links"
+msgstr "linkkeinä"
+
+#: src/LYOptions.c:2303
+msgid "show filename"
+msgstr "näytä tiedostonimi"
+
+#: src/LYOptions.c:2314
+msgid "STANDARD"
+msgstr "PERUS"
+
+#: src/LYOptions.c:2315
+msgid "ADVANCED"
+msgstr "EDISTYNYT"
+
+#: src/LYOptions.c:2349
+msgid "Directories first"
+msgstr "Kansiot ensin"
+
+#: src/LYOptions.c:2350
+msgid "Files first"
+msgstr "Tiedostot ensin"
+
+#: src/LYOptions.c:2351
+msgid "Mixed style"
+msgstr "Sekoitettu tyyli"
+
+#: src/LYOptions.c:2359 src/LYOptions.c:2379
+msgid "By Name"
+msgstr "Nimen mukaan"
+
+#: src/LYOptions.c:2360 src/LYOptions.c:2380
+msgid "By Type"
+msgstr "Tyypin mukaan"
+
+#: src/LYOptions.c:2361 src/LYOptions.c:2381
+msgid "By Size"
+msgstr "Koon mukaan"
+
+#: src/LYOptions.c:2362 src/LYOptions.c:2382
+msgid "By Date"
+msgstr "Pvm:n mukaan"
+
+#: src/LYOptions.c:2363
+msgid "By Mode"
+msgstr "Tilan mukaan"
+
+#: src/LYOptions.c:2365
+msgid "By User"
+msgstr "Käyttäjän mukaan"
+
+#: src/LYOptions.c:2366
+msgid "By Group"
+msgstr "Ryhmän mukaan"
+
+#: src/LYOptions.c:2391
+msgid "Do not show rate"
+msgstr "Älä näytä nopeutta"
+
+#: src/LYOptions.c:2392 src/LYOptions.c:2393
+#, c-format
+msgid "Show %s/sec rate"
+msgstr "Näytä %s/s -nopeus"
+
+#: src/LYOptions.c:2395 src/LYOptions.c:2396
+#, c-format
+msgid "Show %s/sec, ETA"
+msgstr "Näytä %s/s, jäljellä"
+
+#: src/LYOptions.c:2397 src/LYOptions.c:2398
+#, c-format
+msgid "Show %s/sec (2-digits), ETA"
+msgstr "Näytä %s/s (2 numeroa), jäljellä"
+
+#: src/LYOptions.c:2401
+msgid "Show progressbar"
+msgstr "Näytä edistymispalkki"
+
+#: src/LYOptions.c:2413
+msgid "Accept lynx's internal types"
+msgstr "Hyväksy Lynxin sisäiset tyypit"
+
+#: src/LYOptions.c:2414
+msgid "Also accept lynx.cfg's types"
+msgstr "Hyväksy myös lynx.cfg:n tyypit"
+
+#: src/LYOptions.c:2415
+msgid "Also accept user's types"
+msgstr "Hyväksy myös käyttäjän tyypit"
+
+#: src/LYOptions.c:2416
+msgid "Also accept system's types"
+msgstr "Hyväksy myös järjestelmän tyypit"
+
+#: src/LYOptions.c:2417
+msgid "Accept all types"
+msgstr "Hyväksy kaikki muutokset"
+
+#: src/LYOptions.c:2426
+msgid "gzip"
+msgstr "gzip"
+
+#: src/LYOptions.c:2427
+msgid "deflate"
+msgstr "deflate"
+
+#: src/LYOptions.c:2430
+msgid "compress"
+msgstr "compress"
+
+#: src/LYOptions.c:2433
+msgid "bzip2"
+msgstr "bzip2"
+
+#: src/LYOptions.c:2435
+msgid "All"
+msgstr "Kaikki"
+
+#: src/LYOptions.c:2801 src/LYOptions.c:2830
+#, c-format
+msgid "Use %s to invoke the Options menu!"
+msgstr "%s avaa Valitsimet-valikon"
+
+#: src/LYOptions.c:3688
+msgid "(options marked with (!) will not be saved)"
+msgstr "((!)-merkittyjä asetuksia ei tallenneta)"
+
+#: src/LYOptions.c:3696
+msgid "General Preferences"
+msgstr "Yleisasetukset"
+
+#. ***************************************************************
+#. User Mode: SELECT
+#: src/LYOptions.c:3700
+msgid "User mode"
+msgstr "Käyttäjän taso"
+
+#. Editor: INPUT
+#: src/LYOptions.c:3706
+msgid "Editor"
+msgstr "Muokkain"
+
+#. Search Type: SELECT
+#: src/LYOptions.c:3711
+msgid "Type of Search"
+msgstr "Haun toiminta"
+
+#: src/LYOptions.c:3716
+msgid "Security and Privacy"
+msgstr "Turvallisuus ja yksityisyys"
+
+#. ***************************************************************
+#. Cookies: SELECT
+#: src/LYOptions.c:3720
+msgid "Cookies"
+msgstr "Evästeet"
+
+#. Cookie Prompting: SELECT
+#: src/LYOptions.c:3734
+msgid "Invalid-Cookie Prompting"
+msgstr "Epäkelpo eväste -kysymykset"
+
+#. SSL Prompting: SELECT
+#: src/LYOptions.c:3741
+msgid "SSL Prompting"
+msgstr "SSL-kysymykset"
+
+#: src/LYOptions.c:3746
+msgid "SSL client certificate file"
+msgstr ""
+
+#: src/LYOptions.c:3750
+msgid "SSL client key file"
+msgstr ""
+
+#: src/LYOptions.c:3756
+msgid "Keyboard Input"
+msgstr "Näppäimistösyöte"
+
+#. ***************************************************************
+#. Keypad Mode: SELECT
+#: src/LYOptions.c:3760
+msgid "Keypad mode"
+msgstr "Näppäimistön tila"
+
+#. Emacs keys: ON/OFF
+#: src/LYOptions.c:3766
+msgid "Emacs keys"
+msgstr "Emacs-painikkeet"
+
+#. VI Keys: ON/OFF
+#: src/LYOptions.c:3772
+msgid "VI keys"
+msgstr "VI-painikkeet"
+
+#. Line edit style: SELECT
+#. well, at least 2 line edit styles available
+#: src/LYOptions.c:3779
+msgid "Line edit style"
+msgstr "Rivimuokkaustapa"
+
+#. Keyboard layout: SELECT
+#: src/LYOptions.c:3791
+msgid "Keyboard layout"
+msgstr "Näppäinasettelu"
+
+#.
+#. * Display and Character Set
+#.
+#: src/LYOptions.c:3805
+msgid "Display and Character Set"
+msgstr "Näyttö ja merkistökoodaus"
+
+#. Use locale-based character set: ON/OFF
+#: src/LYOptions.c:3810
+msgid "Use locale-based character set"
+msgstr "Käytä locale-pohjaista merkistöä"
+
+#: src/LYOptions.c:3817
+msgid "Use HTML5 charset replacements"
+msgstr "Käytä HTML5:n korvikemerkistöjä"
+
+#. Display Character Set: SELECT
+#: src/LYOptions.c:3823
+msgid "Display character set"
+msgstr "Näytä merkistökoodaus"
+
+#: src/LYOptions.c:3854
+msgid "Assumed document character set"
+msgstr "Oletettu asiakirjan merkistö"
+
+#.
+#. * Since CJK people hardly mixed with other world
+#. * we split the header to make it more readable:
+#. * "CJK mode" for CJK display charsets, and "Raw 8-bit" for others.
+#.
+#: src/LYOptions.c:3874
+msgid "CJK mode"
+msgstr "CJK-tila"
+
+#: src/LYOptions.c:3876
+msgid "Raw 8-bit"
+msgstr "Raaka 8-bittinen"
+
+#. X Display: INPUT
+#: src/LYOptions.c:3884
+msgid "X Display"
+msgstr "X-näyttö"
+
+#.
+#. * Document Appearance
+#.
+#: src/LYOptions.c:3890
+msgid "Document Appearance"
+msgstr "Asiakirjan ulkoasu"
+
+#: src/LYOptions.c:3896
+msgid "Show color"
+msgstr "Näytä väri"
+
+#. Color style: ON/OFF
+#: src/LYOptions.c:3921
+msgid "Color style"
+msgstr "Värityyli"
+
+#: src/LYOptions.c:3930
+msgid "Default colors"
+msgstr "Oletusvärit"
+
+#. Show cursor: ON/OFF
+#: src/LYOptions.c:3938
+msgid "Show cursor"
+msgstr "Näytä osoitin"
+
+#. Underline links: ON/OFF
+#: src/LYOptions.c:3944
+msgid "Underline links"
+msgstr "Alleviivaa linkit"
+
+#. Show scrollbar: ON/OFF
+#: src/LYOptions.c:3951
+msgid "Show scrollbar"
+msgstr "Näytä vierityspalkki"
+
+#. Select Popups: ON/OFF
+#: src/LYOptions.c:3958
+msgid "Popups for select fields"
+msgstr "Ponnahdusikkuna valintakentille"
+
+#. HTML error recovery: SELECT
+#: src/LYOptions.c:3964
+msgid "HTML error recovery"
+msgstr "HTML-virheistä toipuminen"
+
+#. Bad HTML messages: SELECT
+#: src/LYOptions.c:3970
+msgid "Bad HTML messages"
+msgstr "Huonoa HTML:ää -viestit"
+
+#. Show Images: SELECT
+#: src/LYOptions.c:3976
+msgid "Show images"
+msgstr "Näytä kuvat"
+
+#. Verbose Images: ON/OFF
+#: src/LYOptions.c:3990
+msgid "Verbose images"
+msgstr ""
+
+#.
+#. * Headers Transferred to Remote Servers
+#.
+#: src/LYOptions.c:3998
+msgid "Headers Transferred to Remote Servers"
+msgstr "Palvelimille välitetyt headerit"
+
+#. ***************************************************************
+#. Mail Address: INPUT
+#: src/LYOptions.c:4002
+msgid "Personal mail address"
+msgstr "Henkilökohtainen postiosoite"
+
+#: src/LYOptions.c:4007
+msgid "Personal name for mail"
+msgstr "Henkilökohtainen nimi postia varten"
+
+#: src/LYOptions.c:4014
+msgid "Password for anonymous ftp"
+msgstr "Salasana anonyymille FTP:lle"
+
+#. Preferred media type: SELECT
+#: src/LYOptions.c:4020
+msgid "Preferred media type"
+msgstr "Suosi mediatyyppiä"
+
+#. Preferred encoding: SELECT
+#: src/LYOptions.c:4026
+msgid "Preferred encoding"
+msgstr "Suosi koodausta"
+
+#. Preferred Document Character Set: INPUT
+#: src/LYOptions.c:4032
+msgid "Preferred document character set"
+msgstr "Suosi asiakirjan merkistökoodausta"
+
+#. Preferred Document Language: INPUT
+#: src/LYOptions.c:4037
+msgid "Preferred document language"
+msgstr "Suosi asiakirjan kieltä"
+
+#: src/LYOptions.c:4043
+msgid "Send User-Agent header"
+msgstr "Lähetä User-Agent -otsake"
+
+#: src/LYOptions.c:4045
+msgid "User-Agent header"
+msgstr "User-Agent -otsake"
+
+#.
+#. * Listing and Accessing Files
+#.
+#: src/LYOptions.c:4053
+msgid "Listing and Accessing Files"
+msgstr "Tiedostojen listaaminen ja hakeminen"
+
+#. FTP sort: SELECT
+#: src/LYOptions.c:4058
+msgid "Use Passive FTP"
+msgstr "Käytä passiivista FTP:tä"
+
+#. FTP sort: SELECT
+#: src/LYOptions.c:4064
+msgid "FTP sort criteria"
+msgstr "FTP-lajittelukriteerit"
+
+#. Local Directory Sort: SELECT
+#: src/LYOptions.c:4072
+msgid "Local directory sort criteria"
+msgstr "Paikallisen kansion lajittelukriteerit"
+
+#. Local Directory Order: SELECT
+#: src/LYOptions.c:4078
+msgid "Local directory sort order"
+msgstr "Paikallisen kansion lajittelujärjestys"
+
+#: src/LYOptions.c:4087
+msgid "Show dot files"
+msgstr "Näytä pistetiedostot"
+
+#: src/LYOptions.c:4095
+msgid "Execution links"
+msgstr "Suorituslinkit"
+
+#: src/LYOptions.c:4113
+msgid "Pause when showing message"
+msgstr "Pysähdy, kun näytetään viestiä"
+
+#. Show transfer rate: SELECT
+#: src/LYOptions.c:4120
+msgid "Show transfer rate"
+msgstr "Näytä latausnopeus"
+
+#.
+#. * Special Files and Screens
+#.
+#: src/LYOptions.c:4140
+msgid "Special Files and Screens"
+msgstr "Erityistiedostot ja näytöt"
+
+#: src/LYOptions.c:4145
+msgid "Multi-bookmarks"
+msgstr "Monikirjanmerkit"
+
+#: src/LYOptions.c:4153
+msgid "Review/edit Bookmarks files"
+msgstr ""
+
+#: src/LYOptions.c:4156
+msgid "Goto multi-bookmark menu"
+msgstr ""
+
+#: src/LYOptions.c:4158
+msgid "Bookmarks file"
+msgstr "Kirjanmerkkitiedosto"
+
+#. Auto Session: ON/OFF
+#: src/LYOptions.c:4165
+msgid "Auto Session"
+msgstr "Automaattinen istunto"
+
+#. Session File Menu: INPUT
+#: src/LYOptions.c:4171
+msgid "Session file"
+msgstr "Istuntotiedosto"
+
+#. Visited Pages: SELECT
+#: src/LYOptions.c:4177
+msgid "Visited Pages"
+msgstr "Vieraillut sivut"
+
+#: src/LYOptions.c:4182
+msgid "View the file "
+msgstr "Katsele tiedostoa "
+
+#: src/LYPrint.c:955
+#, c-format
+msgid " Print job complete.\n"
+msgstr " Tulostustyö valmis.\n"
+
+#: src/LYPrint.c:1282
+msgid "Document:"
+msgstr "Asiakirja:"
+
+#: src/LYPrint.c:1283
+msgid "Number of lines:"
+msgstr "Rivien määrä:"
+
+#: src/LYPrint.c:1284
+msgid "Number of pages:"
+msgstr "Sivujen määrä:"
+
+#: src/LYPrint.c:1285
+msgid "pages"
+msgstr "sivua"
+
+#: src/LYPrint.c:1285
+msgid "page"
+msgstr "sivu"
+
+#: src/LYPrint.c:1286
+msgid "(approximately)"
+msgstr "(arviolta)"
+
+#: src/LYPrint.c:1293
+msgid "Some print functions have been disabled!"
+msgstr "Jotkin tulostustoiminnot ovat pois käytöstä!"
+
+#: src/LYPrint.c:1297
+msgid "Standard print options:"
+msgstr "Standardit tulostusvalinnat:"
+
+#: src/LYPrint.c:1298
+msgid "Print options:"
+msgstr "Tulostusvalinnat:"
+
+#: src/LYPrint.c:1305
+msgid "Save to a local file"
+msgstr "Tallenna tiedostoon"
+
+#: src/LYPrint.c:1307
+msgid "Save to disk disabled"
+msgstr "Levylle tallennus ei käytössä"
+
+#: src/LYPrint.c:1314
+msgid "Mail the file"
+msgstr "Postita tiedosto"
+
+#: src/LYPrint.c:1321
+msgid "Print to the screen"
+msgstr "Tulosta näytölle"
+
+#: src/LYPrint.c:1326
+msgid "Print out on a printer attached to your vt100 terminal"
+msgstr "Tulosta vt100-päätteeseen liitetyllä tulostimella"
+
+#: src/LYReadCFG.c:441
+#, c-format
+msgid ""
+"Syntax Error parsing COLOR in configuration file:\n"
+"The line must be of the form:\n"
+"COLOR:INTEGER:FOREGROUND:BACKGROUND\n"
+"\n"
+"Here FOREGROUND and BACKGROUND must be one of:\n"
+"The special strings 'nocolor' or 'default', or\n"
+msgstr ""
+
+#: src/LYReadCFG.c:454
+msgid "Offending line:"
+msgstr "Rivi:"
+
+#: src/LYReadCFG.c:769
+#, c-format
+msgid "key remapping of %s to %s for %s failed\n"
+msgstr ""
+
+#: src/LYReadCFG.c:776
+#, c-format
+msgid "key remapping of %s to %s failed\n"
+msgstr ""
+
+#: src/LYReadCFG.c:797
+#, c-format
+msgid "invalid line-editor selection %s for key %s, selecting all\n"
+msgstr ""
+
+#: src/LYReadCFG.c:822 src/LYReadCFG.c:834
+#, c-format
+msgid "setting of line-editor binding for key %s (0x%x) to 0x%x for %s failed\n"
+msgstr ""
+
+#: src/LYReadCFG.c:838
+#, c-format
+msgid "setting of line-editor binding for key %s (0x%x) for %s failed\n"
+msgstr ""
+
+#: src/LYReadCFG.c:934
+#, c-format
+msgid "Lynx: cannot start, CERN rules file %s is not available\n"
+msgstr ""
+
+#: src/LYReadCFG.c:935
+msgid "(no name)"
+msgstr "(ei nimeä)"
+
+#: src/LYReadCFG.c:2075
+#, c-format
+msgid "More than %d nested lynx.cfg includes -- perhaps there is a loop?!?\n"
+msgstr "Enemmäin kuin %d sisäkkäistä lynx.cfg sisällytystä – silmukassa?\n"
+
+#: src/LYReadCFG.c:2077
+#, c-format
+msgid "Last attempted include was '%s',\n"
+msgstr "Viimeisin yritetty sisällytys oli â€%sâ€,\n"
+
+#: src/LYReadCFG.c:2078
+#, c-format
+msgid "included from '%s'.\n"
+msgstr "sisällytetty kohteesta â€%sâ€.\n"
+
+#: src/LYReadCFG.c:2481 src/LYReadCFG.c:2494 src/LYReadCFG.c:2552
+msgid "The following is read from your lynx.cfg file."
+msgstr "Seuraava on luettu lynx.cfg -asetustiedostostasi."
+
+#: src/LYReadCFG.c:2482 src/LYReadCFG.c:2495
+msgid "Please read the distribution"
+msgstr "Lue jakelun"
+
+#: src/LYReadCFG.c:2488 src/LYReadCFG.c:2498
+msgid "for more comments."
+msgstr "-lisäkommentit."
+
+#: src/LYReadCFG.c:2534
+msgid "RELOAD THE CHANGES"
+msgstr "LATAA MUUTOKSET UUDELLEEN"
+
+#: src/LYReadCFG.c:2542
+msgid "Your primary configuration"
+msgstr "Ensisijaiset asetuksesi"
+
+#: src/LYShowInfo.c:111
+msgid "URL:"
+msgstr "URL:"
+
+#: src/LYShowInfo.c:196
+msgid "Directory that you are currently viewing"
+msgstr "Kansio, jota nyt katsot"
+
+#: src/LYShowInfo.c:199
+msgid "Name:"
+msgstr "Nimi:"
+
+#: src/LYShowInfo.c:216
+msgid "Directory that you have currently selected"
+msgstr "Kansio, joka on nyt valittuna"
+
+#: src/LYShowInfo.c:218
+msgid "File that you have currently selected"
+msgstr "Tiedosto, joka on nyt valittuna"
+
+#: src/LYShowInfo.c:221
+msgid "Symbolic link that you have currently selected"
+msgstr "Symbolinen linkki, joka on nyt valittuna"
+
+#: src/LYShowInfo.c:224
+msgid "Item that you have currently selected"
+msgstr "Kohde, joka on nyt valittuna"
+
+#: src/LYShowInfo.c:226
+msgid "Full name:"
+msgstr "Koko nimi:"
+
+#: src/LYShowInfo.c:239
+msgid "Unable to follow link"
+msgstr "Linnkiä ei voida seurata"
+
+#: src/LYShowInfo.c:241
+msgid "Points to file:"
+msgstr "Osoittaa tiedostoon:"
+
+#: src/LYShowInfo.c:246
+msgid "Name of owner:"
+msgstr "Omistajan nimi:"
+
+#: src/LYShowInfo.c:249
+msgid "Group name:"
+msgstr "Ryhmän nimi:"
+
+#: src/LYShowInfo.c:251
+msgid "File size:"
+msgstr "Tiedoston koko:"
+
+#: src/LYShowInfo.c:253
+msgid "(bytes)"
+msgstr "(tavua)"
+
+#.
+#. * Include date and time information.
+#.
+#: src/LYShowInfo.c:258
+msgid "Creation date:"
+msgstr "Luontipäivä:"
+
+#: src/LYShowInfo.c:261
+msgid "Last modified:"
+msgstr "Muokattu:"
+
+#: src/LYShowInfo.c:264
+msgid "Last accessed:"
+msgstr "Viimeksi käytetty:"
+
+#: src/LYShowInfo.c:270
+msgid "Access Permissions"
+msgstr "Pääsyoikeudet"
+
+#: src/LYShowInfo.c:305
+msgid "Group:"
+msgstr "Ryhmä:"
+
+#: src/LYShowInfo.c:325
+msgid "World:"
+msgstr "Maailma:"
+
+#: src/LYShowInfo.c:332
+msgid "File that you are currently viewing"
+msgstr "Nyt katseltava tiedosto"
+
+#: src/LYShowInfo.c:340 src/LYShowInfo.c:444
+msgid "Linkname:"
+msgstr "Linkin nimi:"
+
+#: src/LYShowInfo.c:346 src/LYShowInfo.c:361
+msgid "Charset:"
+msgstr "Merkistökoodaus:"
+
+#: src/LYShowInfo.c:360
+msgid "(assumed)"
+msgstr "(oletettu)"
+
+#: src/LYShowInfo.c:367
+msgid "Server:"
+msgstr "Palvelin:"
+
+#: src/LYShowInfo.c:370
+msgid "Date:"
+msgstr "Päivä:"
+
+#: src/LYShowInfo.c:373
+msgid "Last Mod:"
+msgstr "Viim. muokattu:"
+
+#: src/LYShowInfo.c:378
+msgid "Expires:"
+msgstr "Vanhenee:"
+
+#: src/LYShowInfo.c:381
+msgid "Cache-Control:"
+msgstr "Cache-Control:"
+
+#: src/LYShowInfo.c:384
+msgid "Content-Length:"
+msgstr "Content-Length:"
+
+#: src/LYShowInfo.c:388
+msgid "Length:"
+msgstr "Pituus:"
+
+#: src/LYShowInfo.c:393
+msgid "Language:"
+msgstr "Kieli:"
+
+#: src/LYShowInfo.c:400
+msgid "Post Data:"
+msgstr "Post-data:"
+
+#: src/LYShowInfo.c:403
+msgid "Post Content Type:"
+msgstr "Post-sisältötyyppi:"
+
+#: src/LYShowInfo.c:406
+msgid "Owner(s):"
+msgstr "Omistajat(t):"
+
+#: src/LYShowInfo.c:411
+msgid "size:"
+msgstr "koko:"
+
+#: src/LYShowInfo.c:413
+msgid "lines"
+msgstr "riviä"
+
+#: src/LYShowInfo.c:417
+msgid "forms mode"
+msgstr ""
+
+#: src/LYShowInfo.c:419
+msgid "source"
+msgstr "lähde"
+
+#: src/LYShowInfo.c:420
+msgid "normal"
+msgstr "tavallinen"
+
+#: src/LYShowInfo.c:422
+msgid ", safe"
+msgstr ", turvallinen"
+
+#: src/LYShowInfo.c:424
+msgid ", via internal link"
+msgstr ", sisäisen linkin kautta"
+
+#: src/LYShowInfo.c:429
+msgid ", no-cache"
+msgstr ", ei vlimuistia"
+
+#: src/LYShowInfo.c:431
+msgid ", ISMAP script"
+msgstr ", ISMAP-komentosarja"
+
+#: src/LYShowInfo.c:433
+msgid ", bookmark file"
+msgstr ", kirjanmerkkitiedosto"
+
+#: src/LYShowInfo.c:437
+msgid "mode:"
+msgstr "tila:"
+
+#: src/LYShowInfo.c:443
+msgid "Link that you currently have selected"
+msgstr "Nyt valittu linkki"
+
+#: src/LYShowInfo.c:452
+msgid "Method:"
+msgstr "Tapa:"
+
+#: src/LYShowInfo.c:456
+msgid "Enctype:"
+msgstr "Koodaustyyppi:"
+
+#: src/LYShowInfo.c:462
+msgid "Action:"
+msgstr "Toiminto:"
+
+#: src/LYShowInfo.c:468
+msgid "(Form field)"
+msgstr "(Lomakekenttä)"
+
+#: src/LYShowInfo.c:478
+msgid "No Links on the current page"
+msgstr "Ei linkkejä tällä sivulla"
+
+#: src/LYShowInfo.c:484
+msgid "Server Headers:"
+msgstr "Palvelimen otsakkeet:"
+
+#: src/LYStyle.c:338
+#, c-format
+msgid ""
+"Syntax Error parsing style in lss file:\n"
+"[%s]\n"
+"The line must be of the form:\n"
+"OBJECT:MONO:COLOR (ie em:bold:brightblue:white)\n"
+"where OBJECT is one of EM,STRONG,B,I,U,BLINK etc.\n"
+"\n"
+msgstr ""
+"Kielioppivirhe lss-tiedoston tyyliä käsiteltäessä:\n"
+"[%s]\n"
+"Rivin täytyy olla muodossa\n"
+"OBJEKTI:MONO:VÄRI (esim. em:bold:brightblue:white),\n"
+"missä OBJEKTI on EM,STRONG,B,I,U,BLINK tms.\n"
+"\n"
+
+#: src/LYStyle.c:933
+#, c-format
+msgid ""
+"\n"
+"Lynx file \"%s\" is not available.\n"
+"\n"
+msgstr ""
+"\n"
+"Lynxin tiedosto â€%s†ei ole saatavilla.\n"
+
+#: src/LYTraversal.c:111
+msgid "here is a list of the history stack so that you may rebuild"
+msgstr ""
+
+#: src/LYUpload.c:77
+msgid "ERROR! - upload command is misconfigured"
+msgstr "VIRHE! - lähetyskomennon asetukset ovat väärin!"
+
+#: src/LYUpload.c:98
+msgid "Illegal redirection \"../\" found! Request ignored."
+msgstr "Ei-sallittu ohjaus â€../†löytyi! Pyyntö ohitettu."
+
+#: src/LYUpload.c:101
+msgid "Illegal character \"/\" found! Request ignored."
+msgstr "Ei-sallittu merkki â€/†löytyi! Pyyntö ohitettu."
+
+#: src/LYUpload.c:104
+msgid "Illegal redirection using \"~\" found! Request ignored."
+msgstr "Ei-sallittu merkkiä â€~†käyttävä ohjaus löytyi! Pyyntö ohitettu."
+
+#: src/LYUpload.c:157
+msgid "Unable to upload file."
+msgstr "Ei voitu lähettää tiedostoa."
+
+#: src/LYUpload.c:196
+msgid "Upload To:"
+msgstr "Lähetä kohteeseen:"
+
+#: src/LYUpload.c:197
+msgid "Upload options:"
+msgstr "Lähetysvalinnat:"
+
+#: src/LYUtils.c:1919
+msgid "Download document URL put to clipboard."
+msgstr "Asiakirjan lataus-URL kopioitu leikepöydälle."
+
+#: src/LYUtils.c:2666
+msgid "Unexpected access protocol for this URL scheme."
+msgstr ""
+
+#: src/LYUtils.c:3571
+msgid "Too many tempfiles"
+msgstr "Liian monta väliaikaistiedostoa"
+
+#: src/LYUtils.c:3871
+msgid "unknown restriction"
+msgstr "tuntematon rajoitus"
+
+#: src/LYUtils.c:3902
+#, c-format
+msgid "No restrictions set.\n"
+msgstr "Rajoituksia ei asetettu.\n"
+
+#: src/LYUtils.c:3905
+#, c-format
+msgid "Restrictions set:\n"
+msgstr "Rajoitukset asetettu:\n"
+
+#: src/LYUtils.c:5279
+msgid "Cannot find HOME directory"
+msgstr "Kotikansiota ei löydy"
+
+#: src/LYrcFile.c:16
+msgid "Normally disabled. See ENABLE_LYNXRC in lynx.cfg\n"
+msgstr "Yleensä pos käytöstä. Katso ENABLE_LYNXRC tiedostossa lynx.cfg\n"
+
+#: src/LYrcFile.c:327
+msgid ""
+"accept_all_cookies allows the user to tell Lynx to automatically\n"
+"accept all cookies if desired. The default is \"FALSE\" which will\n"
+"prompt for each cookie. Set accept_all_cookies to \"TRUE\" to accept\n"
+"all cookies.\n"
+msgstr ""
+"accept_all_cookies antaa määrätä Lynxin hyväksymään kaikki evästeet\n"
+"automaattisesti. Oletus on â€FALSEâ€, joka kysyy joka evästeestä erikseen.\n"
+"Aseta accept_all_cookies -kohdan arvoksi â€TRUEâ€, jos haluat hyväksyä\n"
+"kaikki evästeet.\n"
+
+#: src/LYrcFile.c:335
+msgid ""
+"anonftp_password allows the user to tell Lynx to use the personal\n"
+"email address as the password for anonymous ftp. If no value is given,\n"
+"Lynx will use the personal email address. Set anonftp_password\n"
+"to a different value if you choose.\n"
+msgstr ""
+"anonftp_password -kohdan avulla käyttäjä voi asettaa Lynxin käyttämään\n"
+"henkilökohtaista sähköpostiosoitetta salasanana nimettömälle FTP:lle. Jos\n"
+"arvoa ei ole annettu, Lynx käyttää henkilökohtaista sähköpostiosoitetta.\n"
+"Jos haluat voit vaihtaa tätä arvoa asettamalla kohdan anonftp_password\n"
+"jonkun muun.\n"
+
+#: src/LYrcFile.c:344
+msgid ""
+"bookmark_file specifies the name and location of the default bookmark\n"
+"file into which the user can paste links for easy access at a later\n"
+"date.\n"
+msgstr ""
+"bookmark_file määrittelee oletusarvoisen kirjanmerkkitiedoston nimen ja\n"
+"sijainnin. Siihen voi kopioida linkkejä helposti saataville myöhempää\n"
+"ajankohtaa varten.\n"
+
+#: src/LYrcFile.c:349
+msgid ""
+"If case_sensitive_searching is \"on\" then when the user invokes a search\n"
+"using the 's' or '/' keys, the search performed will be case sensitive\n"
+"instead of case INsensitive. The default is usually \"off\".\n"
+msgstr ""
+"Jos asetuksen case_sensitive_searching arvo on â€onâ€, etsintä (näppäimet\n"
+"â€s†tai â€/â€) huomioi kirjainkoon. Oletusarvo on yleensä â€offâ€.\n"
+
+#: src/LYrcFile.c:354
+msgid ""
+"The character_set definition controls the representation of 8 bit\n"
+"characters for your terminal. If 8 bit characters do not show up\n"
+"correctly on your screen you may try changing to a different 8 bit\n"
+"set or using the 7 bit character approximations.\n"
+"Current valid characters sets are:\n"
+msgstr ""
+"Määritys character_set määrittää 8-bittisten merkkien esityksen\n"
+"päätteessäsi. Jos 8-bittiset merkit eivät näy oikein näytölläsi,\n"
+"voit yrittää vaihtaa eri 8-bittiseen merkistöön tai 7-bittiseen\n"
+"merkin arviointiin.\n"
+"Sallitut merkistöt ovat:\n"
+
+#: src/LYrcFile.c:361
+msgid ""
+"cookie_accept_domains and cookie_reject_domains are comma-delimited\n"
+"lists of domains from which Lynx should automatically accept or reject\n"
+"all cookies. If a domain is specified in both options, rejection will\n"
+"take precedence. The accept_all_cookies parameter will override any\n"
+"settings made here.\n"
+msgstr ""
+
+#: src/LYrcFile.c:369
+msgid ""
+"cookie_file specifies the file from which to read persistent cookies.\n"
+"The default is ~/"
+msgstr ""
+"cookie_file määrittelee tiedoston, josta pysyvät evästeet luetaan.\n"
+"Oletus on ~/"
+
+#: src/LYrcFile.c:374
+msgid ""
+"cookie_loose_invalid_domains, cookie_strict_invalid_domains, and\n"
+"cookie_query_invalid_domains are comma-delimited lists of which domains\n"
+"should be subjected to varying degrees of validity checking. If a\n"
+"domain is set to strict checking, strict conformance to RFC2109 will\n"
+"be applied. A domain with loose checking will be allowed to set cookies\n"
+"with an invalid path or domain attribute. All domains will default to\n"
+"querying the user for an invalid path or domain.\n"
+msgstr ""
+
+#: src/LYrcFile.c:388
+msgid ""
+"dir_list_order specifies the directory list order under DIRED_SUPPORT\n"
+"(if implemented). The default is \"ORDER_BY_NAME\"\n"
+msgstr ""
+
+#: src/LYrcFile.c:393
+msgid ""
+"dir_list_styles specifies the directory list style under DIRED_SUPPORT\n"
+"(if implemented). The default is \"MIXED_STYLE\", which sorts both\n"
+"files and directories together. \"FILES_FIRST\" lists files first and\n"
+"\"DIRECTORIES_FIRST\" lists directories first.\n"
+msgstr ""
+
+#: src/LYrcFile.c:401
+msgid ""
+"If emacs_keys is to \"on\" then the normal EMACS movement keys:\n"
+" ^N = down ^P = up\n"
+" ^B = left ^F = right\n"
+"will be enabled.\n"
+msgstr ""
+"Jos avaimen emacs_keys arvo on â€onâ€, seuraavat EMACS-painikkeet\n"
+"otetaan käyttöön:\n"
+" ^N = alas ^P = ylös\n"
+" ^B = vasemmalle ^F = oikealle\n"
+
+#: src/LYrcFile.c:407
+msgid ""
+"file_editor specifies the editor to be invoked when editing local files\n"
+"or sending mail. If no editor is specified, then file editing is disabled\n"
+"unless it is activated from the command line, and the built-in line editor\n"
+"will be used for sending mail.\n"
+msgstr ""
+
+#: src/LYrcFile.c:414
+msgid ""
+"The file_sorting_method specifies which value to sort on when viewing\n"
+"file lists such as FTP directories. The options are:\n"
+" BY_FILENAME -- sorts on the name of the file\n"
+" BY_TYPE -- sorts on the type of the file\n"
+" BY_SIZE -- sorts on the size of the file\n"
+" BY_DATE -- sorts on the date of the file\n"
+msgstr ""
+"file_sorting_method määrittelee, minkä arvon perusteella tiedostolistat,\n"
+"kuten FTP-kansiot lajitellaan. Valinnat ovat:\n"
+" BY_FILENAME – tiedostonimen mukaan\n"
+" BY_TYPE – tiedostotyypin mukaan\n"
+" BY_SIZE – tiedoston koon mukaan\n"
+" BY_DATE – tiedoston päivämäärän mukaan\n"
+
+#: src/LYrcFile.c:437
+msgid ""
+"lineedit_mode specifies the key binding used for inputting strings in\n"
+"prompts and forms. If lineedit_mode is set to \"Default Binding\" then\n"
+"the following control characters are used for moving and deleting:\n"
+"\n"
+" Prev Next Enter = Accept input\n"
+" Move char: <- -> ^G = Cancel input\n"
+" Move word: ^P ^N ^U = Erase line\n"
+" Delete char: ^H ^R ^A = Beginning of line\n"
+" Delete word: ^B ^F ^E = End of line\n"
+"\n"
+"Current lineedit modes are:\n"
+msgstr ""
+
+#: src/LYrcFile.c:455
+msgid ""
+"The following allow you to define sub-bookmark files and descriptions.\n"
+"The format is multi_bookmark<capital_letter>=<filename>,<description>\n"
+"Up to 26 bookmark files (for the English capital letters) are allowed.\n"
+"We start with \"multi_bookmarkB\" since 'A' is the default (see above).\n"
+msgstr ""
+
+#: src/LYrcFile.c:461
+msgid ""
+"personal_mail_address specifies your personal mail address. The\n"
+"address will be sent during HTTP file transfers for authorization and\n"
+"logging purposes, and for mailed comments.\n"
+"If you do not want this information given out, set the NO_FROM_HEADER\n"
+"to TRUE in lynx.cfg, or use the -nofrom command line switch. You also\n"
+"could leave this field blank, but then you won't have it included in\n"
+"your mailed comments.\n"
+msgstr ""
+
+#: src/LYrcFile.c:470
+msgid ""
+"personal_mail_name specifies your personal name, for mail. The\n"
+"name is sent for mailed comments. Lynx will prompt for this,\n"
+"showing the configured value as a default when sending mail.\n"
+"This is not necessarily the same as a name provided as part of the\n"
+"personal_mail_address.\n"
+"Lynx does not save your changes to that default value as a side-effect\n"
+"of sending email. To update the default value, you must use the options\n"
+"menu, or modify this file directly.\n"
+msgstr ""
+
+#: src/LYrcFile.c:480
+msgid ""
+"preferred_charset specifies the character set in MIME notation (e.g.,\n"
+"ISO-8859-2, ISO-8859-5) which Lynx will indicate you prefer in requests\n"
+"to http servers using an Accept-Charset header. The value should NOT\n"
+"include ISO-8859-1 or US-ASCII, since those values are always assumed\n"
+"by default. May be a comma-separated list.\n"
+"If a file in that character set is available, the server will send it.\n"
+"If no Accept-Charset header is present, the default is that any\n"
+"character set is acceptable. If an Accept-Charset header is present,\n"
+"and if the server cannot send a response which is acceptable\n"
+"according to the Accept-Charset header, then the server SHOULD send\n"
+"an error response, though the sending of an unacceptable response\n"
+"is also allowed.\n"
+msgstr ""
+
+#: src/LYrcFile.c:496
+msgid ""
+"preferred_language specifies the language in MIME notation (e.g., en,\n"
+"fr, may be a comma-separated list in decreasing preference)\n"
+"which Lynx will indicate you prefer in requests to http servers.\n"
+"If a file in that language is available, the server will send it.\n"
+"Otherwise, the server will send the file in its default language.\n"
+msgstr ""
+
+#: src/LYrcFile.c:507
+msgid ""
+"If run_all_execution_links is set \"on\" then all local execution links\n"
+"will be executed when they are selected.\n"
+"\n"
+"WARNING - This is potentially VERY dangerous. Since you may view\n"
+" information that is written by unknown and untrusted sources\n"
+" there exists the possibility that Trojan horse links could be\n"
+" written. Trojan horse links could be written to erase files\n"
+" or compromise security. This should only be set to \"on\" if\n"
+" you are viewing trusted source information.\n"
+msgstr ""
+
+#: src/LYrcFile.c:518
+msgid ""
+"If run_execution_links_on_local_files is set \"on\" then all local\n"
+"execution links that are found in LOCAL files will be executed when they\n"
+"are selected. This is different from run_all_execution_links in that\n"
+"only files that reside on the local system will have execution link\n"
+"permissions.\n"
+"\n"
+"WARNING - This is potentially dangerous. Since you may view\n"
+" information that is written by unknown and untrusted sources\n"
+" there exists the possibility that Trojan horse links could be\n"
+" written. Trojan horse links could be written to erase files\n"
+" or compromise security. This should only be set to \"on\" if\n"
+" you are viewing trusted source information.\n"
+msgstr ""
+
+#: src/LYrcFile.c:536
+msgid ""
+"select_popups specifies whether the OPTIONs in a SELECT block which\n"
+"lacks a MULTIPLE attribute are presented as a vertical list of radio\n"
+"buttons or via a popup menu. Note that if the MULTIPLE attribute is\n"
+"present in the SELECT start tag, Lynx always will create a vertical list\n"
+"of checkboxes for the OPTIONs. A value of \"on\" will set popup menus\n"
+"as the default while a value of \"off\" will set use of radio boxes.\n"
+"The default can be overridden via the -popup command line toggle.\n"
+msgstr ""
+
+#: src/LYrcFile.c:547
+msgid ""
+"show_color specifies how to set the color mode at startup. A value of\n"
+"\"never\" will force color mode off (treat the terminal as monochrome)\n"
+"at startup even if the terminal appears to be color capable. A value of\n"
+"\"always\" will force color mode on even if the terminal appears to be\n"
+"monochrome, if this is supported by the library used to build lynx.\n"
+"A value of \"default\" will yield the behavior of assuming\n"
+"a monochrome terminal unless color capability is inferred at startup\n"
+"based on the terminal type, or the -color command line switch is used, or\n"
+"the COLORTERM environment variable is set. The default behavior always is\n"
+"used in anonymous accounts or if the \"option_save\" restriction is set.\n"
+"The effect of the saved value can be overridden via\n"
+"the -color and -nocolor command line switches.\n"
+"The mode set at startup can be changed via the \"show color\" option in\n"
+"the 'o'ptions menu. If the option settings are saved, the \"on\" and\n"
+"\"off\" \"show color\" settings will be treated as \"default\".\n"
+msgstr ""
+
+#: src/LYrcFile.c:564
+msgid ""
+"show_cursor specifies whether to 'hide' the cursor to the right (and\n"
+"bottom, if possible) of the screen, or to place it to the left of the\n"
+"current link in documents, or current option in select popup windows.\n"
+"Positioning the cursor to the left of the current link or option is\n"
+"helpful for speech or braille interfaces, and when the terminal is\n"
+"one which does not distinguish the current link based on highlighting\n"
+"or color. A value of \"on\" will set positioning to the left as the\n"
+"default while a value of \"off\" will set 'hiding' of the cursor.\n"
+"The default can be overridden via the -show_cursor command line toggle.\n"
+msgstr ""
+
+#: src/LYrcFile.c:575
+msgid ""
+"show_dotfiles specifies that the directory listing should include\n"
+"\"hidden\" (dot) files/directories. If set \"on\", this will be\n"
+"honored only if enabled via userdefs.h and/or lynx.cfg, and not\n"
+"restricted via a command line switch. If display of hidden files\n"
+"is disabled, creation of such files via Lynx also is disabled.\n"
+msgstr ""
+
+#: src/LYrcFile.c:586
+msgid ""
+"If sub_bookmarks is not turned \"off\", and multiple bookmarks have\n"
+"been defined (see below), then all bookmark operations will first\n"
+"prompt the user to select an active sub-bookmark file. If the default\n"
+"Lynx bookmark_file is defined (see above), it will be used as the\n"
+"default selection. When this option is set to \"advanced\", and the\n"
+"user mode is advanced, the 'v'iew bookmark command will invoke a\n"
+"statusline prompt instead of the menu seen in novice and intermediate\n"
+"user modes. When this option is set to \"standard\", the menu will be\n"
+"presented regardless of user mode.\n"
+msgstr ""
+
+#: src/LYrcFile.c:600
+msgid ""
+"user_mode specifies the users level of knowledge with Lynx. The\n"
+"default is \"NOVICE\" which displays two extra lines of help at the\n"
+"bottom of the screen to aid the user in learning the basic Lynx\n"
+"commands. Set user_mode to \"INTERMEDIATE\" to turn off the extra info.\n"
+"Use \"ADVANCED\" to see the URL of the currently selected link at the\n"
+"bottom of the screen.\n"
+msgstr ""
+
+#: src/LYrcFile.c:609
+msgid ""
+"If verbose_images is \"on\", lynx will print the name of the image\n"
+"source file in place of [INLINE], [LINK] or [IMAGE]\n"
+"See also VERBOSE_IMAGES in lynx.cfg\n"
+msgstr ""
+
+#: src/LYrcFile.c:614
+msgid ""
+"If vi_keys is set to \"on\", then the normal VI movement keys:\n"
+" j = down k = up\n"
+" h = left l = right\n"
+"will be enabled. These keys are only lower case.\n"
+"Capital 'H', 'J' and 'K will still activate help, jump shortcuts,\n"
+"and the keymap display, respectively.\n"
+msgstr ""
+"Jos avaimen vi_keys arvo on â€onâ€, seuraavat VI-painikkeet\n"
+"otetaan käyttöön:\n"
+" j = alas k = ylös\n"
+" h = vasemmalle l = oikealle\n"
+"Nämä painikkeet ovat vain pienikokoisia.\n"
+"Isot â€Hâ€, â€J†ja â€K†avaavat edelleen opasteen, hyppyoikotiet ja\n"
+"näppäimet.\n"
+
+#: src/LYrcFile.c:622
+msgid ""
+"The visited_links setting controls how Lynx organizes the information\n"
+"in the Visited Links Page.\n"
+msgstr ""
+"Asetus visited_links määrittää, miten Lynx järjestää Vieraillut linkit\n"
+"-sivun tiedot.\n"
+
+#: src/LYrcFile.c:863
+msgid ""
+"If keypad_mode is set to \"NUMBERS_AS_ARROWS\", then the numbers on\n"
+"your keypad when the numlock is on will act as arrow keys:\n"
+" 8 = Up Arrow\n"
+" 4 = Left Arrow 6 = Right Arrow\n"
+" 2 = Down Arrow\n"
+"and the corresponding keyboard numbers will act as arrow keys,\n"
+"regardless of whether numlock is on.\n"
+msgstr ""
+
+#: src/LYrcFile.c:872
+msgid ""
+"If keypad_mode is set to \"LINKS_ARE_NUMBERED\", then numbers will\n"
+"appear next to each link and numbers are used to select links.\n"
+msgstr ""
+
+#: src/LYrcFile.c:876
+msgid ""
+"If keypad_mode is set to \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\", then\n"
+"numbers will appear next to each link and visible form input field.\n"
+"Numbers are used to select links, or to move the \"current link\" to a\n"
+"form input field or button. In addition, options in popup menus are\n"
+"indexed so that the user may type an option number to select an option in\n"
+"a popup menu, even if the option isn't visible on the screen. Reference\n"
+"lists and output from the list command also enumerate form inputs.\n"
+msgstr ""
+
+#: src/LYrcFile.c:885
+msgid ""
+"NOTE: Some fixed format documents may look disfigured when\n"
+"\"LINKS_ARE_NUMBERED\" or \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\" are\n"
+"enabled.\n"
+msgstr ""
+
+#: src/LYrcFile.c:917
+msgid ""
+"Lynx User Defaults File\n"
+"\n"
+msgstr ""
+
+#: src/LYrcFile.c:926
+msgid ""
+"This file contains options saved from the Lynx Options Screen (normally\n"
+"with the 'o' key). To save options with that screen, you must select the\n"
+"checkbox:\n"
+msgstr ""
+
+#: src/LYrcFile.c:933
+msgid ""
+"You must then save the settings using the link on the line above the\n"
+"checkbox:\n"
+msgstr ""
+
+#: src/LYrcFile.c:940
+msgid ""
+"You may also use the command-line option \"-forms_options\", which displays\n"
+"the simpler Options Menu instead. Save options with that using the '>' key.\n"
+"\n"
+msgstr ""
+
+#: src/LYrcFile.c:947
+msgid ""
+"This file contains options saved from the Lynx Options Screen (normally\n"
+"with the '>' key).\n"
+"\n"
+msgstr ""
+
+#: src/LYrcFile.c:954
+msgid ""
+"There is normally no need to edit this file manually, since the defaults\n"
+"here can be controlled from the Options Screen, and the next time options\n"
+"are saved from the Options Screen this file will be completely rewritten.\n"
+"You have been warned...\n"
+"\n"
+"If you are looking for the general configuration file - it is normally\n"
+"called \"lynx.cfg\". It has different content and a different format.\n"
+"It is not this file.\n"
+msgstr ""
+
+#~ msgid ""
+#~ "\n"
+#~ "Lynx edit map not declared.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Lynxin muokkauskarttaa ei ole määritelty.\n"
+#~ "\n"
+
+#~ msgid "Looking up %s."
+#~ msgstr "Etsitään %s."
diff --git a/po/fr.po b/po/fr.po
new file mode 100644
index 0000000..46e32d7
--- /dev/null
+++ b/po/fr.po
@@ -0,0 +1,6503 @@
+# Lynx French translation text messages
+# Copyright (C) 2008 Free Software Foundation, Inc.
+# This file is distributed under the same license as the lynx package.
+# You may freely copy this file and add messages and translations
+# as long no comments are removed.
+# FIRST AUTHOR:
+# * * * * * * * * * *
+# The French translations for Lynx were created by the
+# Chebucto Project.
+# Contributors include:
+# Chris Maxwell (CM)
+# David Potter
+# David Trueman (NdT)
+#
+# * * * * * * * * * *
+#
+# relecture complète 09/2008 N. Provost
+#
+# started: Wed Sep 2 20:22:45 EDT 1998
+# J.E. Spath <jspath@bcpl.net> wedged this into Lynx, 1999.
+# Nicolas Provost <nprovost@quadriv.com>, since 2008.
+# Stéphane Aulery <lkppo@free.fr>, 2015, 2017, 2019, 2021
+#
+# 2019-08-27 : maj pour la version lynx 2.9.0-dev3
+# 2017-08-20 : maj pour la version lynx 2.8.9-dev15
+# 2015-03-21 : passage ISO-8859-1 à UTF-8, S.Aulery
+# 2015-04-13 : relecture complète et uniformisation, S. Aulery
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: lynx 2.9.0-dev8\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-07-31 10:04-0400\n"
+"PO-Revision-Date: 2021-08-19 23:06+0200\n"
+"Last-Translator: Stéphane Aulery <lkppo@free.fr>\n"
+"Language-Team: French <traduc@traduc.org>\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+
+#. ******************************************************************
+#. * The following definitions are for status line prompts, messages, or
+#. * warnings issued by Lynx during program execution. You can modify
+#. * them to make them more appropriate for your site. We recommend that
+#. * you extend these definitions to other languages using the gettext
+#. * library. There are also scattered uses of 'gettext()' throughout the
+#. * Lynx source, covering all but those messages which (a) are used for
+#. * debugging (CTRACE) or (b) are constants used in interaction with
+#. * other programs.
+#. *
+#. * See ABOUT-NLS and po/readme for details and location of contributed
+#. * translations. When no translation is available, the English default is
+#. * used.
+#.
+#: LYMessages.c:28
+#, c-format
+msgid "Alert!: %s"
+msgstr "Alerte ! : %s"
+
+# END of the file browser/F)ull menu
+# Following are from the File browser
+#: LYMessages.c:29
+msgid "Welcome"
+msgstr "Bienvenue"
+
+#: LYMessages.c:30
+msgid "Are you sure you want to quit?"
+msgstr "Désirez-vous vraiment quitter ?"
+
+#: LYMessages.c:32
+msgid "Really exit from Lynx?"
+msgstr "Voulez-vous vraiment quitter Lynx ?"
+
+#: LYMessages.c:34
+msgid "Connection interrupted."
+msgstr "Connexion interrompue."
+
+#: LYMessages.c:35
+msgid "Data transfer interrupted."
+msgstr "Transfert de données interrompu."
+
+#: LYMessages.c:36
+msgid "Cancelled!!!"
+msgstr "Annulé !"
+
+#: LYMessages.c:37
+msgid "Cancelling!"
+msgstr "Annulation !"
+
+#: LYMessages.c:38
+msgid "Excellent!!!"
+msgstr "Excellent !"
+
+#: LYMessages.c:39
+msgid "OK"
+msgstr "OK"
+
+#: LYMessages.c:40
+msgid "Done!"
+msgstr "Terminé !"
+
+#: LYMessages.c:41
+msgid "Bad request!"
+msgstr "Demande erronée !"
+
+#: LYMessages.c:42
+msgid "previous"
+msgstr "écran précédent"
+
+#: LYMessages.c:43
+msgid "next screen"
+msgstr "écran suivant"
+
+#: LYMessages.c:44
+msgid "HELP!"
+msgstr "Aide !"
+
+#: LYMessages.c:45
+msgid ", help on "
+msgstr ", aide activée "
+
+#. #define HELP
+#: LYMessages.c:47
+msgid "Commands: Use arrow keys to move, '?' for help, 'q' to quit, '<-' to go back."
+msgstr "Commandes : <flèches> se déplacer, <?> aide, <q> quitter, <â†> retour"
+
+#. #define MOREHELP
+#: LYMessages.c:49
+msgid "-- press space for more, use arrow keys to move, '?' for help, 'q' to quit."
+msgstr "-- Touches : <espace> page suivante, <flèches> se déplacer, <?> aide, <q> quitter"
+
+#: LYMessages.c:50
+msgid "-- press space for next page --"
+msgstr "-- appuyez sur la barre d’espace pour aller à la page suivante --"
+
+#: LYMessages.c:51
+msgid "URL too long"
+msgstr "URL trop longue"
+
+#. Inactive input fields, messages used with -tna option - kw
+#. #define FORM_LINK_TEXT_ADV_MSG_INA
+#: LYMessages.c:57
+#, c-format
+msgid "(Textfield \"%s\"); Inactive. Press <return> to activate."
+msgstr "(Champ texte « %s ») inactif. Appuyez sur <entrée> pour l’activer."
+
+#. #define FORM_LINK_TEXT_MESSAGE_INA
+#: LYMessages.c:59
+msgid "(Text entry field) Inactive. Press <return> to activate."
+msgstr "(Champ texte) inactif. Appuyez sur <entrée> pour l’activer."
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG_INA
+#: LYMessages.c:61
+#, c-format
+msgid "(Textarea \"%s\"); Inactive. Press <return> to activate."
+msgstr "(Zone de texte « %s ») inactive. Appuyez sur <entrée> pour l’activer."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_INA
+#: LYMessages.c:63
+msgid "(Textarea) Inactive. Press <return> to activate."
+msgstr "(Zone de texte) inactive. Appuyez sur <entrée> pour l’activer."
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG_INA_E
+#: LYMessages.c:65
+#, c-format
+msgid "(Textarea \"%s\"); Inactive. Press <return> to activate (%s for editor)."
+msgstr "(Zone de texte « %s ») inactive. Appuyez sur <entrée> pour l’activer (%s pour éditer)."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_INA_E
+#: LYMessages.c:67
+#, c-format
+msgid "(Textarea) Inactive. Press <return> to activate (%s for editor)."
+msgstr "(Zone de texte) Inactive. Appuyez sur <entrée> pour l’activer (%s pour éditer)."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE_INA
+#: LYMessages.c:69
+msgid "(Form field) Inactive. Use <return> to edit."
+msgstr "(Champ formulaire) inactif. <Entrée> pour éditer."
+
+#. #define FORM_TEXT_SUBMIT_MESSAGE_INA_X
+#: LYMessages.c:71
+#, c-format
+msgid "(Form field) Inactive. Use <return> to edit (%s to submit with no cache)."
+msgstr "(Champ formulaire) inactif. <Entrée> pour éditer (%s soumettre sans cache)."
+
+#. #define FORM_TEXT_RESUBMIT_MESSAGE_INA
+#: LYMessages.c:73
+msgid "(Form field) Inactive. Press <return> to edit, press <return> twice to submit."
+msgstr "(Champ formulaire) inactif. <Entrée> pour éditer, deux fois pour soumettre."
+
+#. #define FORM_TEXT_SUBMIT_MAILTO_MSG_INA
+#: LYMessages.c:75
+msgid "(mailto form field) Inactive. Press <return> to change."
+msgstr "(Champ mailto) inactif. <Entrée> pour modifier."
+
+#. #define FORM_LINK_PASSWORD_MESSAGE_INA
+#: LYMessages.c:77
+msgid "(Password entry field) Inactive. Press <return> to activate."
+msgstr "(Champ mot de passe) inactif. <Entrée> pour activer."
+
+#. #define FORM_LINK_FILE_UNM_MSG
+#: LYMessages.c:80
+msgid "UNMODIFIABLE file entry field. Use UP or DOWN arrows or tab to move off."
+msgstr "Champ fichier NON MODIFIABLE. Déplacez-vous avec <haut>, <bas>, <tab>."
+
+#. #define FORM_LINK_FILE_MESSAGE
+#: LYMessages.c:82
+msgid "(File entry field) Enter filename. Use UP or DOWN arrows or tab to move off."
+msgstr "(Champs fichier) Entrez le nom de fichier. Déplacez-vous avec <haut>, <bas>, <tab>."
+
+#. #define FORM_LINK_TEXT_ADV_MSG
+#. #define FORM_LINK_TEXT_MESSAGE
+#: LYMessages.c:84 LYMessages.c:86
+#, c-format
+msgid "(Textfield \"%s\"); Enter text. Use UP or DOWN arrows or tab to move off."
+msgstr "(Champ texte « %s ») Entrez le texte. Déplacez-vous avec <haut>, <bas>, <tab>."
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG
+#: LYMessages.c:88
+#, c-format
+msgid "(Textarea \"%s\"); Enter text. Use UP/DOWN arrows or TAB to move off."
+msgstr "(Zone texte « %s ») Entrez le texte. Déplacez-vous avec <haut>, <bas>, <tab>."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE
+#: LYMessages.c:90
+msgid "(Textarea) Enter text. Use UP/DOWN arrows or TAB to move off."
+msgstr "(Zone texte) Entrez le texte. Déplacez-vous avec <haut>, <bas>, <tab>."
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG_E
+#: LYMessages.c:92
+#, c-format
+msgid "(Textarea \"%s\"); Enter text. Use UP/DOWN arrows or TAB to move off (%s for editor)."
+msgstr "(Zone de texte « %s ») Entrez le texte. Déplacez-vous avec <haut>, <bas>, <tab> (%s pour éditeur)"
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_E
+#: LYMessages.c:94
+#, c-format
+msgid "(Textarea) Enter text. Use UP/DOWN arrows or TAB to move off (%s for editor)."
+msgstr "(Zone de texte) Entrez le texte. Déplacez-vous avec <haut>, <bas>, <tab> (%s pour éditeur)"
+
+#. #define FORM_LINK_TEXT_UNM_MSG
+#: LYMessages.c:96
+msgid "UNMODIFIABLE form text field. Use UP or DOWN arrows or tab to move off."
+msgstr "Champ texte NON MODIFIABLE. Déplacez-vous avec <haut>, <bas>, <tab>."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE
+#: LYMessages.c:98
+msgid "(Form field) Enter text. Use <return> to submit."
+msgstr "(Champ formulaire) Entrez le texte. <Entrée> pour soumettre."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE_X
+#: LYMessages.c:100
+#, c-format
+msgid "(Form field) Enter text. Use <return> to submit (%s for no cache)."
+msgstr "(Champ formulaire) Entrez le texte. <Entrée> pour confirmer (%s : nouvelle instance)."
+
+#. #define FORM_LINK_TEXT_RESUBMIT_MESSAGE
+#: LYMessages.c:102
+msgid "(Form field) Enter text. Use <return> to submit, arrows or tab to move off."
+msgstr "(Champ formulaire) Entrez le texte. <Entrée> pour confirmer, <flèches>, <tab> pour se déplacer."
+
+#. #define FORM_LINK_TEXT_SUBMIT_UNM_MSG
+#: LYMessages.c:104
+msgid "UNMODIFIABLE form field. Use UP or DOWN arrows or tab to move off."
+msgstr "Champ formulaire NON MODIFIABLE. Déplacez-vous avec <haut>, <bas>, <tab>."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MAILTO_MSG
+#: LYMessages.c:106
+msgid "(mailto form field) Enter text. Use <return> to submit, arrows to move off."
+msgstr "(Champ mailto) Entrez le texte. <Entrée> pour confirmer, <flèches> pour vous déplacer."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MAILTO_DIS_MSG
+#: LYMessages.c:108
+msgid "(mailto form field) Mail is disallowed so you cannot submit."
+msgstr "(champ mailto) Fonction de courrier invalidée ; impossible de soumettre l’envoi."
+
+#. #define FORM_LINK_PASSWORD_MESSAGE
+#: LYMessages.c:110
+msgid "(Password entry field) Enter text. Use UP or DOWN arrows or tab to move off."
+msgstr "(Champ mot de passe) Entrez le mot de passe. Déplacez-vous avec <haut>, <bas>, <tab>."
+
+#. #define FORM_LINK_PASSWORD_UNM_MSG
+#: LYMessages.c:112
+msgid "UNMODIFIABLE form password. Use UP or DOWN arrows or tab to move off."
+msgstr "Champ mot de passe NON MODIFIABLE. Déplacez-vous avec <haut>, <bas>, <tab>."
+
+#. #define FORM_LINK_CHECKBOX_ADV_MSG
+#: LYMessages.c:114
+#, c-format
+msgid "(Checkbox \"%s\"); Use right-arrow or <return> to toggle."
+msgstr "(Case à cocher « %s ») Touche <droite> ou <Entrée> pour changer d’option."
+
+#. #define FORM_LINK_CHECKBOX_MESSAGE
+#: LYMessages.c:116
+msgid "(Checkbox Field) Use right-arrow or <return> to toggle."
+msgstr "(Case à cocher) Touche <droite> ou <Entrée> pour changer d’option."
+
+#. #define FORM_LINK_CHECKBOX_UNM_MSG
+#: LYMessages.c:118
+msgid "UNMODIFIABLE form checkbox. Use UP or DOWN arrows or tab to move off."
+msgstr "Case à cocher NON MODIFIABLE. Déplacez-vous avec <haut>, <bas>, <tab>."
+
+#. #define FORM_LINK_RADIO_ADV_MSG
+#: LYMessages.c:120
+#, c-format
+msgid "(Radio Button \"%s\"); Use right-arrow or <return> to toggle."
+msgstr "(Bouton radio « %s ») Touche <droite> ou <Entrée> pour changer d’option."
+
+#. #define FORM_LINK_RADIO_MESSAGE
+#: LYMessages.c:122
+msgid "(Radio Button) Use right-arrow or <return> to toggle."
+msgstr "(Bouton radio) Touche <droite> ou <Entrée> pour changer d’option."
+
+#. #define FORM_LINK_RADIO_UNM_MSG
+#: LYMessages.c:124
+msgid "UNMODIFIABLE form radio button. Use UP or DOWN arrows or tab to move off."
+msgstr "Bouton radio NON MODIFIABLE. Déplacez-vous avec <haut>, <bas>, <tab>."
+
+#. #define FORM_LINK_SUBMIT_PREFIX
+#: LYMessages.c:126
+msgid "Submit ('x' for no cache) to "
+msgstr "Soumettre (<x> pour annuler le cache) à"
+
+#. #define FORM_LINK_RESUBMIT_PREFIX
+#: LYMessages.c:128
+msgid "Submit to "
+msgstr "Soumettre à"
+
+#. #define FORM_LINK_SUBMIT_MESSAGE
+#: LYMessages.c:130
+msgid "(Form submit button) Use right-arrow or <return> to submit ('x' for no cache)."
+msgstr "(Bouton d’envoi) Touche <droite> ou <Entrée> pour envoyer (<x> : nouvelle instance)."
+
+#. #define FORM_LINK_RESUBMIT_MESSAGE
+#: LYMessages.c:132
+msgid "(Form submit button) Use right-arrow or <return> to submit."
+msgstr "(Bouton d’envoi) Utilisez la touche <droite> ou <Entrée> pour confirmer."
+
+#. #define FORM_LINK_SUBMIT_DIS_MSG
+#: LYMessages.c:134
+msgid "DISABLED form submit button. Use UP or DOWN arrows or tab to move off."
+msgstr "Bouton d’envoi DÉSACTIVÉ. Déplacez-vous avec <haut>, <bas>, <tab>."
+
+#. #define FORM_LINK_SUBMIT_MAILTO_PREFIX
+#: LYMessages.c:136
+msgid "Submit mailto form to "
+msgstr "Soumettre le formulaire via mail à"
+
+#. #define FORM_LINK_SUBMIT_MAILTO_MSG
+#: LYMessages.c:138
+msgid "(mailto form submit button) Use right-arrow or <return> to submit."
+msgstr "(bouton de soumission mail) Utilisez la touche <droite> ou <Entrée> pour confirmer."
+
+#. #define FORM_LINK_SUBMIT_MAILTO_DIS_MSG
+#: LYMessages.c:140
+msgid "(mailto form submit button) Mail is disallowed so you cannot submit."
+msgstr "(bouton soumission mail) Fonction de courrier invalidée ; envoi impossible"
+
+#. #define FORM_LINK_RESET_MESSAGE
+#: LYMessages.c:142
+msgid "(Form reset button) Use right-arrow or <return> to reset form to defaults."
+msgstr "(Bouton de raz formulaire) Pressez <droite> ou <Entrée> pour réinitialiser le formulaire."
+
+#. #define FORM_LINK_RESET_DIS_MSG
+#: LYMessages.c:144
+msgid "DISABLED form reset button. Use UP or DOWN arrows or tab to move off."
+msgstr "Bouton de raz formulaire DÉSACTIVÉ. Déplacez-vous avec <haut>, <bas>, <tab>."
+
+#. #define FORM_LINK_BUTTON_MESSAGE
+#: LYMessages.c:146
+msgid "(Script button) Use UP or DOWN arrows or tab to move off."
+msgstr "(Bouton script). Déplacez-vous avec <haut>, <bas>, <tab>."
+
+#. #define FORM_LINK_BUTTON_ADV_MSG
+#: LYMessages.c:148
+#, c-format
+msgid "(Script button \"%s\"); Use UP or DOWN arrows or tab to move off."
+msgstr "(Bouton script « %s »). Déplacez-vous avec <haut>, <bas>, <tab>."
+
+#. #define FORM_LINK_BUTTON_DIS_MSG
+#: LYMessages.c:150
+msgid "DISABLED Script button. Use UP or DOWN arrows or tab to move off."
+msgstr "Bouton script DÉSACTIVÉ. Déplacez-vous avec <haut>, <bas>, <tab>."
+
+#. #define FORM_LINK_OPTION_LIST_ADV_MSG
+#: LYMessages.c:152
+#, c-format
+msgid "(Option list \"%s\"); Hit return to select option."
+msgstr "(Liste d’options « %s ») Pressez <Entrée> puis les <flèches> ; <Entrée> pour choisir une option."
+
+#. #define FORM_LINK_OPTION_LIST_MESSAGE
+#: LYMessages.c:154
+msgid "(Option list) Hit return and use arrow keys and return to select option."
+msgstr "(Liste d’options) Pressez <Entrée> puis les <flèches> ; <Entrée> pour choisir une option."
+
+# /maxwell/lynx2.7.1/LYMessages_en.h
+#. #define CHOICE_LIST_ADV_MSG
+#: LYMessages.c:156
+#, c-format
+msgid "(Choice entry \"%s\"); Use arrow keys and return to select option."
+msgstr "(Liste de choix « %s ») <Entrée>, puis <flèches> ; <Entrée> pour faire votre choix."
+
+# /maxwell/lynx2.7.1/LYMessages_en.h
+#. #define CHOICE_LIST_MESSAGE
+#: LYMessages.c:158
+msgid "(Choice list) Hit return and use arrow keys and return to select option."
+msgstr "(Liste de choix) <Entrée>, puis <flèches> ; <Entrée> pour faire votre choix."
+
+#. #define MOUSE_CHOICE_MESSAGE
+#: LYMessages.c:160
+msgid "Left mouse button or return to select, arrow keys to scroll."
+msgstr "Bouton gauche de la souris ou <entrée> pour sélectionner, les fléches pour défiler."
+
+#. #define FORM_LINK_OPTION_LIST_UNM_MSG
+#: LYMessages.c:162
+msgid "UNMODIFIABLE option list. Use return or arrow keys to review or leave."
+msgstr "Liste d’options NON MODIFIABLE. Pressez <Entrée> ou <flèches> pour revoir les options ou quitter."
+
+#. #define CHOICE_LIST_UNM_MSG
+#: LYMessages.c:164
+msgid "UNMODIFIABLE choice list. Use return or arrow keys to review or leave."
+msgstr "Liste de choix NON MODIFIABLE. Pressez <Entrée> ou <flèches> pour revoir ou quitter."
+
+#: LYMessages.c:165
+msgid "Submitting form..."
+msgstr "Envoi du formulaire…"
+
+#: LYMessages.c:166
+msgid "Resetting form..."
+msgstr "Réinitialisation du formulaire…"
+
+#. #define RELOADING_FORM
+#: LYMessages.c:168
+msgid "Reloading document. Any form entries will be lost!"
+msgstr "Rechargement du document. Toutes les entrées seront effacées !"
+
+#. #define LINK_NOT_IN_FORM
+#: LYMessages.c:170
+msgid "The current link is not in a FORM"
+msgstr "Le lien courant n’est pas dans un FORMULAIRE"
+
+#: LYMessages.c:171
+#, c-format
+msgid "Warning: Cannot transcode form data to charset %s!"
+msgstr "Impossible de coder les données du formulaire dans le jeu de caractères %s !"
+
+#. #define NORMAL_LINK_MESSAGE
+#: LYMessages.c:174
+msgid "(NORMAL LINK) Use right-arrow or <return> to activate."
+msgstr "(Lien normal) Pressez <droite> ou <Entrée> pour activer le lien."
+
+#: LYMessages.c:175
+msgid "The resource requested is not available at this time."
+msgstr "La ressource demandée n’est pas disponible en ce moment."
+
+#: LYMessages.c:176
+msgid "Enter Lynx keystroke command: "
+msgstr "Entrer la commande Lynx au clavier : "
+
+#: LYMessages.c:177
+msgid "Looking up "
+msgstr "Recherche "
+
+#: LYMessages.c:178
+#, c-format
+msgid "Getting %s"
+msgstr "Accès à %s"
+
+#: LYMessages.c:179
+#, c-format
+msgid "Skipping %s"
+msgstr "Ignoré %s"
+
+#: LYMessages.c:180
+#, c-format
+msgid "Using %s"
+msgstr "Utilisation de %s"
+
+#: LYMessages.c:181
+#, c-format
+msgid "Illegal URL: %s"
+msgstr "URL illégale : %s"
+
+#: LYMessages.c:182
+#, c-format
+msgid "Badly formed address %s"
+msgstr "Adresse mal formée %s"
+
+#: LYMessages.c:183
+#, c-format
+msgid "URL: %s"
+msgstr "URL : %s"
+
+#: LYMessages.c:184
+msgid "Unable to access WWW file!!!"
+msgstr "Impossible d’accéder au fichier WWW !"
+
+#: LYMessages.c:185
+#, c-format
+msgid "This is a searchable index. Use %s to search."
+msgstr "Ceci est un index consultable. Utilisez %s pour la recherche."
+
+#. #define WWW_INDEX_MORE_MESSAGE
+#: LYMessages.c:187
+#, c-format
+msgid "--More-- This is a searchable index. Use %s to search."
+msgstr "--Suite-- Ceci est un index consultable. Utilisez %s pour la recherche."
+
+#: LYMessages.c:188
+msgid "You have entered an invalid link number."
+msgstr "Vous avez saisi un numéro de lien non valide."
+
+#. #define SOURCE_HELP
+#: LYMessages.c:190
+msgid "Currently viewing document source. Press '\\' to return to rendered version."
+msgstr "Vous visualisez le code source. Faites « \\ » pour la version hypertexte."
+
+#. #define NOVICE_LINE_ONE
+#: LYMessages.c:192
+msgid " Arrow keys: Up and Down to move. Right to follow a link; Left to go back. \n"
+msgstr "<haut>/<bas>=se déplacer, <droite>=activer le lien, <gauche>=document précédent.\n"
+
+# Is the AIDE command correct? There is no online Help in Lynx.
+#. #define NOVICE_LINE_TWO
+#: LYMessages.c:194
+msgid " H)elp O)ptions P)rint G)o M)ain screen Q)uit /=search [delete]=history list \n"
+msgstr "H)Aide O)ptions P)Imprimer G)Aller à M)écran pal Q)uitter </>=chercher <retour>=Histor.\n"
+
+#. #define NOVICE_LINE_TWO_A
+#: LYMessages.c:196
+msgid " O)ther cmds H)elp K)eymap G)oto P)rint M)ain screen o)ptions Q)uit \n"
+msgstr "O)Autres comm. H)Aide K)Clavier G)Aller à P)Imprimer M)Ecran pal o)ptions Q)uitter\n"
+
+#. #define NOVICE_LINE_TWO_B
+#: LYMessages.c:198
+msgid " O)ther cmds B)ack E)dit D)ownload ^R)eload ^W)ipe screen search doc: / \n"
+msgstr "O)Autres comm. B)retour E)diter D)Télécharger ^R)echarger ^W)nettoyer écran </> chercher doc\n"
+
+# NOVICE_LINE_TWO_C
+#. #define NOVICE_LINE_TWO_C
+#: LYMessages.c:200
+msgid "O)ther cmds C)omment History: <backspace> Bookmarks: V)iew, A)dd, R)emove \n"
+msgstr "O)Autres comm. C)ommentaires <retour>=historique | Signets : V)oir, A)jouter, R)supprimer\n"
+
+# Z)ap Transfer missing from line, since it does nothing
+#. #define FORM_NOVICELINE_ONE
+#: LYMessages.c:202
+msgid " Enter text into the field by typing on the keyboard "
+msgstr " Entrez le texte dans la zone à partir du clavier "
+
+#. #define FORM_NOVICELINE_TWO
+#: LYMessages.c:204
+msgid " Ctrl-U to delete all text in field, [Backspace] to delete a character "
+msgstr " <Ctrl-U> pour supprimer tout le texte, <retour arr> pour effacer un caractère"
+
+#. #define FORM_NOVICELINE_TWO_DELBL
+#: LYMessages.c:206
+msgid " Ctrl-U to delete text in field, [Backspace] to delete a character "
+msgstr " <Ctrl-U> pour supprimer tout le texte, <retour arr> pour effacer un caractère"
+
+#. #define FORM_NOVICELINE_TWO_VAR
+#: LYMessages.c:208
+#, c-format
+msgid " %s to delete all text in field, [Backspace] to delete a character "
+msgstr " %s pour effacer tout le texte, <retour arr> pour effacer un caractère"
+
+#. #define FORM_NOVICELINE_TWO_DELBL_VAR
+#: LYMessages.c:210
+#, c-format
+msgid " %s to delete text in field, [Backspace] to delete a character "
+msgstr " %s pour effacer tout le texte, <retour arr> pour effacer un caractère"
+
+#. mailto
+#: LYMessages.c:213
+msgid "Malformed mailto form submission! Cancelled!"
+msgstr "Envoi de formulaire mailto incorrect. Annulé !"
+
+#: LYMessages.c:214
+msgid "Warning! Control codes in mail address replaced by ?"
+msgstr "Attention ! Les codes de contrôles de l’adresse mail ont été remplacés par ?"
+
+#: LYMessages.c:215
+msgid "Mail disallowed! Cannot submit."
+msgstr "Envoi de courrier interdit. Impossible de soumettre l’envoi !"
+
+#: LYMessages.c:216
+msgid "Mailto form submission failed!"
+msgstr "Impossible d’envoyer le formulaire par mail !"
+
+#: LYMessages.c:217
+msgid "Mailto form submission Cancelled!!!"
+msgstr "Envoi du formulaire par mail annulé !"
+
+#: LYMessages.c:218
+msgid "Sending form content..."
+msgstr "Envoi du contenu du formulaire…"
+
+#: LYMessages.c:219
+msgid "No email address is present in mailto URL!"
+msgstr "Aucune adresse de courriel ne figure dans l’URL d’envoi !"
+
+#. #define MAILTO_URL_TEMPOPEN_FAILED
+#: LYMessages.c:221
+msgid "Unable to open temporary file for mailto URL!"
+msgstr "Impossible d’ouvrir de fichier temporaire pour l’URL mailto !"
+
+#. #define INC_ORIG_MSG_PROMPT
+#: LYMessages.c:223
+msgid "Do you wish to include the original message?"
+msgstr "Voulez-vous inclure le message d’origine ?"
+
+#. #define INC_PREPARSED_MSG_PROMPT
+#: LYMessages.c:225
+msgid "Do you wish to include the preparsed source?"
+msgstr "Voulez-vous inclure la source pré-analysée ?"
+
+#. #define SPAWNING_EDITOR_FOR_MAIL
+#: LYMessages.c:227
+msgid "Spawning your selected editor to edit mail message"
+msgstr "Lancement de votre éditeur de choix pour l’édition du courriel"
+
+#. #define ERROR_SPAWNING_EDITOR
+#: LYMessages.c:229
+msgid "Error spawning editor, check your editor definition in the options menu"
+msgstr "Erreur de lancement de l’éditeur ; vérifier la configuration de l’éditeur (menu options)"
+
+#: LYMessages.c:230
+msgid "Send this comment?"
+msgstr "Envoyer ce commentaire ? "
+
+#: LYMessages.c:231
+msgid "Send this message?"
+msgstr "Envoyer ce message ? "
+
+#: LYMessages.c:232
+msgid "Sending your message..."
+msgstr "Envoi de votre message…"
+
+#: LYMessages.c:233
+msgid "Sending your comment:"
+msgstr "Envoi de votre commentaire :"
+
+#. textarea
+#: LYMessages.c:236
+msgid "Not in a TEXTAREA; cannot use external editor."
+msgstr "Ce n’est pas une zone de texte, impossible d’utiliser l’éditeur externe."
+
+#: LYMessages.c:237
+msgid "Not in a TEXTAREA; cannot use command."
+msgstr "Ce n’est pas une zone de texte, impossible d’utiliser cette commande."
+
+#: LYMessages.c:239
+msgid "file: ACTIONs are disallowed!"
+msgstr "URL de type « file: » ACTIONs non autorisée !"
+
+#. #define FILE_SERVED_LINKS_DISALLOWED
+#: LYMessages.c:241
+msgid "file: URLs via served links are disallowed!"
+msgstr "Une URL « file: » n’est pas admise dans les liens servis."
+
+#: LYMessages.c:242
+msgid "Access to local files denied."
+msgstr "L’accès aux fichiers locaux est refusé !"
+
+#: LYMessages.c:243
+msgid "file: URLs via bookmarks are disallowed!"
+msgstr "Une URL « file: » n’est pas autorisée dans les signets."
+
+#. #define SPECIAL_VIA_EXTERNAL_DISALLOWED
+#: LYMessages.c:245
+msgid "This special URL is not allowed in external documents!"
+msgstr "Cette URL spéciale n’est pas autorisée dans les documents externes !"
+
+#: LYMessages.c:246
+msgid "Press <return> to return to Lynx."
+msgstr "Pressez <Entrée> pour retourner à Lynx."
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:249
+msgid "Spawning DCL subprocess. Use 'logout' to return to Lynx.\n"
+msgstr "Sous-processus DCL lancé ; saisir « logout » pour retourner à Lynx.\n"
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:253
+msgid "Type EXIT to return to Lynx.\n"
+msgstr "Saisir EXIT pour retourner à Lynx.\n"
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:256
+msgid "Spawning your default shell. Use 'exit' to return to Lynx.\n"
+msgstr "Lancement du shell par défaut. Saisir « exit » pour retourner à Lynx.\n"
+
+#: LYMessages.c:259
+msgid "Spawning is currently disabled."
+msgstr "Le lancement est présentement désactivé."
+
+#: LYMessages.c:260
+msgid "The 'd'ownload command is currently disabled."
+msgstr "La commande <d> (télécharger) est présentement désactivée."
+
+#: LYMessages.c:261
+msgid "You cannot download an input field."
+msgstr "Vous ne pouvez pas télécharger un champ de formulaire."
+
+#: LYMessages.c:262
+msgid "Form has a mailto action! Cannot download."
+msgstr "Le formulaire contient une entité « mailto: ». Téléchargement impossible."
+
+#: LYMessages.c:263
+msgid "You cannot download a mailto: link."
+msgstr "Vous ne pouvez pas télécharger un lien mailto."
+
+#: LYMessages.c:264
+msgid "You cannot download cookies."
+msgstr "Vous ne pouvez pas télécharger les cookies."
+
+#: LYMessages.c:265
+msgid "You cannot download a printing option."
+msgstr "Impossible de télécharger une option d’impression."
+
+#: LYMessages.c:266
+msgid "You cannot download an upload option."
+msgstr "Impossible de télécharger une option de chargement."
+
+#: LYMessages.c:267
+msgid "You cannot download an permit option."
+msgstr "Impossible de télécharger une option de permission."
+
+#: LYMessages.c:268
+msgid "This special URL cannot be downloaded!"
+msgstr "Cette URL spéciale ne peut être téléchargée !"
+
+#: LYMessages.c:269
+msgid "Nothing to download."
+msgstr "Il n’y a rien à télécharger."
+
+#: LYMessages.c:270
+msgid "Trace ON!"
+msgstr "Traçage ACTIVÉ !"
+
+#: LYMessages.c:271
+msgid "Trace OFF!"
+msgstr "Traçage DÉSACTIVÉ !"
+
+#. #define CLICKABLE_IMAGES_ON
+#: LYMessages.c:273
+msgid "Links will be included for all images! Reloading..."
+msgstr "Les liens seront inclus pour toutes les images ! Chargement…"
+
+#. #define CLICKABLE_IMAGES_OFF
+#: LYMessages.c:275
+msgid "Standard image handling restored! Reloading..."
+msgstr "Traitement d’image standard restauré. Chargement…"
+
+#. #define PSEUDO_INLINE_ALTS_ON
+#: LYMessages.c:277
+msgid "Pseudo_ALTs will be inserted for inlines without ALT strings! Reloading..."
+msgstr "Des pseudos champs ALT seront assignées aux images sans ALT ! Chargement…"
+
+#. #define PSEUDO_INLINE_ALTS_OFF
+#: LYMessages.c:279
+msgid "Inlines without an ALT string specified will be ignored! Reloading..."
+msgstr "Les images incluses sans l’attribut ALT seront ignorées ! Chargement…"
+
+#: LYMessages.c:280
+msgid "Raw 8-bit or CJK mode toggled OFF! Reloading..."
+msgstr "Modes 8-bits « brut » ou CJK désactivés ! Chargement…"
+
+#: LYMessages.c:281
+msgid "Raw 8-bit or CJK mode toggled ON! Reloading..."
+msgstr "Modes 8-bits « brut » ou CJK activés ! Chargement…"
+
+#. #define HEAD_D_L_OR_CANCEL
+#: LYMessages.c:283
+msgid "Send HEAD request for D)ocument or L)ink, or C)ancel? (d,l,c): "
+msgstr "Envoyer requête HEAD pour D)ocument, L)ien ou C) Annuler ? (d, l, c) : "
+
+#. #define HEAD_D_OR_CANCEL
+#: LYMessages.c:285
+msgid "Send HEAD request for D)ocument, or C)ancel? (d,c): "
+msgstr "Envoyer requête HEAD pour D)ocument ou C) Annuler ? (d, c) : "
+
+#: LYMessages.c:286
+msgid "Sorry, the document is not an http URL."
+msgstr "Désolé, le document n’est pas une URL http."
+
+#: LYMessages.c:287
+msgid "Sorry, the link is not an http URL."
+msgstr "Désolé, le link n’est pas une URL http."
+
+#: LYMessages.c:288
+msgid "Sorry, the ACTION for this form is disabled."
+msgstr "Désolé, l’attribut ACTION est désactivé pour ce formulaire."
+
+#. #define FORM_ACTION_NOT_HTTP_URL
+#: LYMessages.c:290
+msgid "Sorry, the ACTION for this form is not an http URL."
+msgstr "Désolé, l’attribut ACTION de ce formulaire n’est pas une URL http."
+
+#: LYMessages.c:291
+msgid "Not an http URL or form ACTION!"
+msgstr "L’élément n’est ni une URL http ni un attribut ACTION !"
+
+#: LYMessages.c:292
+msgid "This special URL cannot be a form ACTION!"
+msgstr "Cette URL spéciale ne peut être un attribut ACTION !"
+
+#: LYMessages.c:293
+msgid "URL is not in starting realm!"
+msgstr "L’URL n’est pas dans la hiérarchie de départ !"
+
+#: LYMessages.c:294
+msgid "News posting is disabled!"
+msgstr "L’envoi d’articles Usenet est désactivé !"
+
+#: LYMessages.c:295
+msgid "File management support is disabled!"
+msgstr "Le support de la gestion de fichiers est désactivé !"
+
+#: LYMessages.c:296
+msgid "No jump file is currently available."
+msgstr "Aucun fichier-raccourci n’est présentement disponible."
+
+#: LYMessages.c:297
+msgid "Jump to (use '?' for list): "
+msgstr "Accès à (entrez <?> pour la liste des raccourcis) : "
+
+#: LYMessages.c:298
+msgid "Jumping to a shortcut URL is disallowed!"
+msgstr "L’accès à un raccourci URL est désactivé !"
+
+#: LYMessages.c:299
+msgid "Random URL is disallowed! Use a shortcut."
+msgstr "L’accès aléatoire URL est désactivé. Utilisez un raccourci."
+
+#: LYMessages.c:300
+msgid "No random URLs have been used thus far."
+msgstr "Aucune URL aléatoire n’a encore été utilisée."
+
+#: LYMessages.c:301
+msgid "Bookmark features are currently disabled."
+msgstr "Les fonctions de signets sont présentement désactivées."
+
+#: LYMessages.c:302
+msgid "Execution via bookmarks is disabled."
+msgstr "L’exécution à partir des signets est désactivée."
+
+#. #define BOOKMARK_FILE_NOT_DEFINED
+#: LYMessages.c:304
+#, c-format
+msgid "Bookmark file is not defined. Use %s to see options."
+msgstr "Le fichier de signets n’est pas défini. Utilisez %s pour voir les options."
+
+#. #define NO_TEMP_FOR_HOTLIST
+#: LYMessages.c:306
+msgid "Unable to open tempfile for X Mosaic hotlist conversion."
+msgstr "Impossible d’ouvrir le fichier temporaire pour convertir les favoris X Mosaic."
+
+#: LYMessages.c:307
+msgid "ERROR - unable to open bookmark file."
+msgstr "ERREUR - impossible d’ouvrir le fichier de signets."
+
+#. #define BOOKMARK_OPEN_FAILED_FOR_DEL
+#: LYMessages.c:309
+msgid "Unable to open bookmark file for deletion of link."
+msgstr "Impossible d’ouvrir le fichier de signets pour supprimer un lien."
+
+#. #define BOOKSCRA_OPEN_FAILED_FOR_DEL
+#: LYMessages.c:311
+msgid "Unable to open scratch file for deletion of link."
+msgstr "Impossible d’ouvrir le fichier de travail pour supprimer un lien."
+
+#: LYMessages.c:313
+msgid "Error renaming scratch file."
+msgstr "Erreur de renommage du fichier de travail."
+
+#: LYMessages.c:315
+msgid "Error renaming temporary file."
+msgstr "Erreur de renommage du fichier temporaire."
+
+#. #define BOOKTEMP_COPY_FAIL
+#: LYMessages.c:317
+msgid "Unable to copy temporary file for deletion of link."
+msgstr "Impossible de copier le fichier temporaire (pour l’effacement du lien)."
+
+#. #define BOOKTEMP_REOPEN_FAIL_FOR_DEL
+#: LYMessages.c:319
+msgid "Unable to reopen temporary file for deletion of link."
+msgstr "Impossible de réouvrir le fichier temporaire pour supprimer un lien."
+
+#. #define BOOKMARK_LINK_NOT_ONE_LINE
+#: LYMessages.c:322
+msgid "Link is not by itself all on one line in bookmark file."
+msgstr "Le lien ne tient pas sur une seule ligne dans le fichier de signets."
+
+#: LYMessages.c:323
+msgid "Bookmark deletion failed."
+msgstr "Impossible de supprimer le signet."
+
+#. #define BOOKMARKS_NOT_TRAVERSED
+#: LYMessages.c:325
+msgid "Bookmark files cannot be traversed (only http URLs)."
+msgstr "Les fichiers de signets ne peuvent être parcourus (URL http seulement)."
+
+#. #define BOOKMARKS_NOT_OPEN
+#: LYMessages.c:327
+msgid "Unable to open bookmark file, use 'a' to save a link first"
+msgstr "Impossible d’ouvrir les signets ; tapez <a> pour enregistrer un lien d’abord."
+
+#: LYMessages.c:328
+msgid "There are no links in this bookmark file!"
+msgstr "Il n’y a aucun signet dans ce fichier !"
+
+#. #define CACHE_D_OR_CANCEL
+#: LYMessages.c:330
+msgid "D)elete cached document or C)ancel? (d,c): "
+msgstr "D)supprimer le document du cache ou C)annuler (d, c) : "
+
+#. #define BOOK_D_L_OR_CANCEL
+#: LYMessages.c:332
+msgid "Save D)ocument or L)ink to bookmark file or C)ancel? (d,l,c): "
+msgstr "Enregistrer le D)ocument ou le L)ien comme signet ou C) Annuler ? (d, l, c) : "
+
+#: LYMessages.c:333
+msgid "Save D)ocument to bookmark file or C)ancel? (d,c): "
+msgstr "Enregistrer le D)ocument dans les signets ou C) Annuler ? (d, c) : "
+
+#: LYMessages.c:334
+msgid "Save L)ink to bookmark file or C)ancel? (l,c): "
+msgstr "Enregistrer le L)ien dans les signets ou C) Annuler ? (l, c) : "
+
+#. #define NOBOOK_POST_FORM
+#: LYMessages.c:336
+msgid "Documents from forms with POST content cannot be saved as bookmarks."
+msgstr "Les documents envoyés par POST ne peuvent être marqués d’un signet."
+
+#: LYMessages.c:337
+msgid "Cannot save form fields/links"
+msgstr "Impossible d’enregistrer les zones ou les liens d’un formulaire."
+
+#. #define NOBOOK_HSML
+#: LYMessages.c:339
+msgid "History, showinfo, menu and list files cannot be saved as bookmarks."
+msgstr "Historique, Information, Menu et Références ne peuvent être des signets."
+
+#. #define CONFIRM_BOOKMARK_DELETE
+#: LYMessages.c:341
+msgid "Do you really want to delete this link from your bookmark file?"
+msgstr "Voulez-vous vraiment supprimer ce lien de vos signets ?"
+
+#: LYMessages.c:342
+msgid "Malformed address."
+msgstr "Adresse incorrecte."
+
+#. #define HISTORICAL_ON_MINIMAL_OFF
+#: LYMessages.c:344
+msgid "Historical comment parsing ON (Minimal is overridden)!"
+msgstr "Analyse historique ACTIVÉE (analyse minimale annulée) !"
+
+#. #define HISTORICAL_OFF_MINIMAL_ON
+#: LYMessages.c:346
+msgid "Historical comment parsing OFF (Minimal is in effect)!"
+msgstr "Analyse historique DÉSACTIVÉE (analyse minimale activée) !"
+
+#. #define HISTORICAL_ON_VALID_OFF
+#: LYMessages.c:348
+msgid "Historical comment parsing ON (Valid is overridden)!"
+msgstr "Analyse historique ACTIVÉE (analyse de validation annulée) !"
+
+#. #define HISTORICAL_OFF_VALID_ON
+#: LYMessages.c:350
+msgid "Historical comment parsing OFF (Valid is in effect)!"
+msgstr "Analyse historique DÉSACTIVÉE (validation activée) !"
+
+#. #define MINIMAL_ON_IN_EFFECT
+#: LYMessages.c:352
+msgid "Minimal comment parsing ON (and in effect)!"
+msgstr "Analyse minimale ACTIVÉE (et en cours) !"
+
+#. #define MINIMAL_OFF_VALID_ON
+#: LYMessages.c:354
+msgid "Minimal comment parsing OFF (Valid is in effect)!"
+msgstr "Analyse minimale DÉSACTIVÉE (analyse de validation en cours) !"
+
+#. #define MINIMAL_ON_BUT_HISTORICAL
+#: LYMessages.c:356
+msgid "Minimal comment parsing ON (but Historical is in effect)!"
+msgstr "Analyse minimale ACTIVÉE (analyse historique en cours) !"
+
+#. #define MINIMAL_OFF_HISTORICAL_ON
+#: LYMessages.c:358
+msgid "Minimal comment parsing OFF (Historical is in effect)!"
+msgstr "Analyse minimale DÉSACTIVÉE (analyse historique en cours) !"
+
+#: LYMessages.c:359
+msgid "Soft double-quote parsing ON!"
+msgstr "Analyse tolérante sur les guillemets ACTIVÉE !"
+
+#: LYMessages.c:360
+msgid "Soft double-quote parsing OFF!"
+msgstr "Analyse tolérante sur les guillemets DÉSACTIVÉE !"
+
+#: LYMessages.c:361
+msgid "Now using TagSoup parsing of HTML."
+msgstr "Analyse du HTML à l’aide de TagSoup."
+
+#: LYMessages.c:362
+msgid "Now using SortaSGML parsing of HTML!"
+msgstr "Analyse du HTML à l’aide de SortaSGML."
+
+#: LYMessages.c:363
+msgid "You are already at the end of this document."
+msgstr "Vous êtes déjà à la fin du document."
+
+#: LYMessages.c:364
+msgid "You are already at the beginning of this document."
+msgstr "Vous êtes déjà au début du document."
+
+#: LYMessages.c:365
+#, c-format
+msgid "You are already at page %d of this document."
+msgstr "Vous êtes déjà à la page %d du document."
+
+# Needs context for LINK_ALREADY_CURRENT
+# Prints "Enter link number to follow: "
+# User enters 5
+# Their cursor was on the 5th link, so it says:
+# "Link number 5 already is current."
+#: LYMessages.c:366
+#, c-format
+msgid "Link number %d already is current."
+msgstr "Le lien %d est déjà le lien actif."
+
+#: LYMessages.c:367
+msgid "You are already at the first document"
+msgstr "Vous êtes déjà au premier document."
+
+#: LYMessages.c:368
+msgid "There are no links above this line of the document."
+msgstr "Il n’y a pas de lien au-dessus de cette ligne dans le document."
+
+#: LYMessages.c:369
+msgid "There are no links below this line of the document."
+msgstr "Il n’y a pas de lien en dessous de cette ligne dans le document."
+
+#. #define MAXLEN_REACHED_DEL_OR_MOV
+#: LYMessages.c:371
+msgid "Maximum length reached! Delete text or move off field."
+msgstr "Longueur maximale atteinte ; effacez du texte ou quittez le champ."
+
+#. #define NOT_ON_SUBMIT_OR_LINK
+#: LYMessages.c:373
+msgid "You are not on a form submission button or normal link."
+msgstr "Vous n’êtes pas sur un bouton Envoyer ou un lien normal."
+
+#. #define NEED_CHECKED_RADIO_BUTTON
+#: LYMessages.c:375
+msgid "One radio button must be checked at all times!"
+msgstr "Un seul bouton radio peut être coché à la fois."
+
+#: LYMessages.c:376
+msgid "No submit button for this form, submit single text field?"
+msgstr "Pas de bouton d’envoi pour ce formulaire, soumettre ce seul champ texte ?"
+
+#: LYMessages.c:377
+msgid "Do you want to go back to the previous document?"
+msgstr "Voulez-vous retourner au document précédent ?"
+
+#: LYMessages.c:378
+msgid "Use arrows or tab to move off of field."
+msgstr "Utilisez <flèches> ou <tab> pour quitter le champ."
+
+#. #define ENTER_TEXT_ARROWS_OR_TAB
+#: LYMessages.c:380
+msgid "Enter text. Use arrows or tab to move off of field."
+msgstr "Entrez le texte. Déplacez-vous avec <flèches> ou <tab>."
+
+#: LYMessages.c:381
+msgid "** Bad HTML!! No form action defined. **"
+msgstr "** Erreur HTML ! Aucune action définie pour le formulaire. **"
+
+#: LYMessages.c:382
+msgid "Bad HTML!! Unable to create popup window!"
+msgstr "Erreur de code HTML ! Impossible de créer de fenêtre popup."
+
+#: LYMessages.c:383
+msgid "Unable to create popup window!"
+msgstr "Impossible de créer de fenêtre popup."
+
+#: LYMessages.c:384
+msgid "Goto a random URL is disallowed!"
+msgstr "Accès à une URL aléatoire désactivé."
+
+#: LYMessages.c:385
+msgid "Goto a non-http URL is disallowed!"
+msgstr "Accès à une URL non http invalidé."
+
+#: LYMessages.c:386
+#, c-format
+msgid "You are not allowed to goto \"%s\" URLs"
+msgstr "Vous ne pouvez accéder aux URL « %s »"
+
+#: LYMessages.c:387
+msgid "URL to open: "
+msgstr "URL à ouvrir : "
+
+#: LYMessages.c:388
+msgid "Edit the current Goto URL: "
+msgstr "Éditer la commande « Aller à URL » en cours :"
+
+#: LYMessages.c:389
+msgid "Edit the previous Goto URL: "
+msgstr "Éditer la commande « Aller à URL » précédente :"
+
+#: LYMessages.c:390
+msgid "Edit a previous Goto URL: "
+msgstr "Éditer une commande « Aller à URL » précédente :"
+
+#: LYMessages.c:391
+msgid "Current document has POST data."
+msgstr "Le document en cours contient des données POST."
+
+#: LYMessages.c:392
+msgid "Edit this document's URL: "
+msgstr "Éditer l’URL de ce document :"
+
+#: LYMessages.c:393
+msgid "Edit the current link's URL: "
+msgstr "Éditer l’URL relative au lien courant : "
+
+#: LYMessages.c:394
+msgid "Edit the form's submit-URL: "
+msgstr "Éditer l’URL d’envoi de ce formulaire :"
+
+#: LYMessages.c:395
+msgid "You cannot edit File Management URLs"
+msgstr "Vous ne pouvez pas éditer les URL de gestion de fichier."
+
+#: LYMessages.c:396
+msgid "Enter a database query: "
+msgstr "Entrez une requête de base de données : "
+
+#: LYMessages.c:397
+msgid "Enter a whereis query: "
+msgstr "Entrez le mot à rechercher : "
+
+#: LYMessages.c:398
+msgid "Edit the current query: "
+msgstr "Éditer la recherche en cours :"
+
+#: LYMessages.c:399
+msgid "Edit the previous query: "
+msgstr "Éditer la recherche précédente :"
+
+#: LYMessages.c:400
+msgid "Edit a previous query: "
+msgstr "Éditer une recherche précédente :"
+
+#. #define USE_C_R_TO_RESUB_CUR_QUERY
+#: LYMessages.c:402
+msgid "Use Control-R to resubmit the current query."
+msgstr "Faites <Ctrl-R> pour soumettre de nouveau la demande."
+
+#: LYMessages.c:403
+msgid "Edit the current shortcut: "
+msgstr "Éditer le raccourci courant :"
+
+#: LYMessages.c:404
+msgid "Edit the previous shortcut: "
+msgstr "Éditer le raccourci précédent :"
+
+#: LYMessages.c:405
+msgid "Edit a previous shortcut: "
+msgstr "Éditer un raccourci précédent :"
+
+#: LYMessages.c:406
+#, c-format
+msgid "Key '%c' is not mapped to a jump file!"
+msgstr "Touche <%c> non configurée pour correspondre à un raccourci !"
+
+#: LYMessages.c:407
+msgid "Cannot locate jump file!"
+msgstr "Impossible de localiser le fichier-raccourci !"
+
+#: LYMessages.c:408
+msgid "Cannot open jump file!"
+msgstr "Impossible d’ouvrir le fichier-raccourci !"
+
+#: LYMessages.c:409
+msgid "Error reading jump file!"
+msgstr "Erreur de lecture du fichier-raccourci !"
+
+#: LYMessages.c:410
+msgid "Out of memory reading jump file!"
+msgstr "Mémoire insuffisante pour lire le fichier-raccourci !"
+
+#: LYMessages.c:411
+msgid "Out of memory reading jump table!"
+msgstr "Mémoire insuffisante pour lire les tables de raccourcis !"
+
+#: LYMessages.c:412
+msgid "No index is currently available."
+msgstr "Aucun index n’est présentement disponible."
+
+#. #define CONFIRM_MAIN_SCREEN
+#: LYMessages.c:414
+msgid "Do you really want to go to the Main screen?"
+msgstr "Voulez-vous vraiment aller à l’écran principal ?"
+
+#: LYMessages.c:415
+msgid "You are already at main screen!"
+msgstr "Vous êtes déjà à l’écran principal."
+
+#. #define NOT_ISINDEX
+#: LYMessages.c:417
+msgid "Not a searchable indexed document -- press '/' to search for a text string"
+msgstr "Document non indexé - faites </> pour chercher une séquence de texte."
+
+#. #define NO_OWNER
+#: LYMessages.c:419
+msgid "No owner is defined for this file so you cannot send a comment"
+msgstr "Aucun propriétaire pour ce fichier ; impossible d’envoyer un commentaire."
+
+#: LYMessages.c:420
+#, c-format
+msgid "No owner is defined. Use %s?"
+msgstr "Aucun propriétaire n’est défini. Utiliser %s ?"
+
+#: LYMessages.c:421
+msgid "Do you wish to send a comment?"
+msgstr "Voulez-vous envoyer un commentaire ?"
+
+#: LYMessages.c:422
+msgid "Mail is disallowed so you cannot send a comment"
+msgstr "Fonction de courrier désactivée ; impossible d’envoyer un commentaire"
+
+#: LYMessages.c:423
+msgid "The 'e'dit command is currently disabled."
+msgstr "La commande <e> (Éditer) est présentement désactivée."
+
+#: LYMessages.c:424
+msgid "External editing is currently disabled."
+msgstr "L’édition externe est désactivée."
+
+#: LYMessages.c:425
+msgid "System error - failure to get status."
+msgstr "Erreur système - impossible d’obtenir l’état."
+
+#: LYMessages.c:426
+msgid "No editor is defined!"
+msgstr "Aucun éditeur n’est défini."
+
+#: LYMessages.c:427
+msgid "The 'p'rint command is currently disabled."
+msgstr "La commande <p> (Imprimer) est désactivée."
+
+#: LYMessages.c:428
+msgid "Document has no Toolbar links or Banner."
+msgstr "Aucun lien vers une barre d’outil ou une bannière."
+
+#: LYMessages.c:429
+msgid "Unable to open traversal file."
+msgstr "Impossible d’ouvrir le fichier des URL parcourues."
+
+#: LYMessages.c:430
+msgid "Unable to open traversal found file."
+msgstr "Impossible d’ouvrir le fichier de parcours des URL trouvées."
+
+#: LYMessages.c:431
+msgid "Unable to open reject file."
+msgstr "Impossible d’ouvrir le fichier des URL rejetées."
+
+#: LYMessages.c:432
+msgid "Unable to open traversal errors output file"
+msgstr "Impossible d’ouvrir le fichier des URL parcourues erronées."
+
+#: LYMessages.c:433
+msgid "TRAVERSAL WAS INTERRUPTED"
+msgstr "PARCOURS INTERROMPU"
+
+#: LYMessages.c:434
+msgid "Follow link (or goto link or page) number: "
+msgstr "Suivre le lien (ou aller à la page) numéro : "
+
+#: LYMessages.c:435
+msgid "Select option (or page) number: "
+msgstr "Choisir le numéro d’option (ou de page) : "
+
+#: LYMessages.c:436
+#, c-format
+msgid "Option number %d already is current."
+msgstr "L’option %d est déjà l’option en cours."
+
+#. #define ALREADY_AT_OPTION_END
+#: LYMessages.c:438
+msgid "You are already at the end of this option list."
+msgstr "Vous êtes déjà à la fin de cette liste d’options."
+
+#. #define ALREADY_AT_OPTION_BEGIN
+#: LYMessages.c:440
+msgid "You are already at the beginning of this option list."
+msgstr "Vous êtes déjà au début de cette liste d’options."
+
+#. #define ALREADY_AT_OPTION_PAGE
+#: LYMessages.c:442
+#, c-format
+msgid "You are already at page %d of this option list."
+msgstr "Vous êtes déjà à la page %d de cette liste d’options."
+
+#: LYMessages.c:443
+msgid "You have entered an invalid option number."
+msgstr "Vous avez entré un numéro d’option invalide."
+
+#: LYMessages.c:444
+msgid "** Bad HTML!! Use -trace to diagnose. **"
+msgstr "** Erreur de code HTML ! Utiliser -trace pour le diagnostic. **"
+
+#: LYMessages.c:445
+msgid "Give name of file to save in"
+msgstr "Donnez le nom du fichier où sauvegarder."
+
+#: LYMessages.c:446
+msgid "Can't save data to file -- please run WWW locally"
+msgstr "Impossible d’enregistrer les données dans le fichier -- Merci d’utiliser WWW localement."
+
+#: LYMessages.c:447
+msgid "Can't open temporary file!"
+msgstr "Impossible d’ouvrir le fichier temporaire !"
+
+#: LYMessages.c:448
+msgid "Can't open output file! Cancelling!"
+msgstr "Impossible d’ouvrir le fichier de sortie ! Demande annulée."
+
+#: LYMessages.c:449
+msgid "Execution is disabled."
+msgstr "L’exécution est désactivée."
+
+#. #define EXECUTION_DISABLED_FOR_FILE
+#: LYMessages.c:451
+#, c-format
+msgid "Execution is not enabled for this file. See the Options menu (use %s)."
+msgstr "Exécution désactivée pour ce fichier. Voir les paramètres (use %s)."
+
+#. #define EXECUTION_NOT_COMPILED
+#: LYMessages.c:453
+msgid "Execution capabilities are not compiled into this version."
+msgstr "Capacités d’exécution non compilées dans cette version."
+
+#: LYMessages.c:454
+msgid "This file cannot be displayed on this terminal."
+msgstr "Ce fichier ne peut être affiché sur votre terminal."
+
+#. #define CANNOT_DISPLAY_FILE_D_OR_C
+#: LYMessages.c:456
+msgid "This file cannot be displayed on this terminal: D)ownload, or C)ancel"
+msgstr "Ne peut être affiché sur votre terminal : D) Télécharger ou C) Annuler"
+
+#: LYMessages.c:457
+#, c-format
+msgid "%s D)ownload, or C)ancel"
+msgstr "%s D) Télécharger ou C) Annuler"
+
+#: LYMessages.c:458
+msgid "Cancelling file."
+msgstr "Annulation."
+
+#: LYMessages.c:459
+msgid "Retrieving file. - PLEASE WAIT -"
+msgstr "Récupération du fichier. - VEUILLEZ ATTENDRE -"
+
+#: LYMessages.c:460
+msgid "Enter a filename: "
+msgstr "Entrez un nom de fichier : "
+
+#: LYMessages.c:461
+msgid "Edit the previous filename: "
+msgstr "Éditez le nom de fichier précédent : "
+
+#: LYMessages.c:462
+msgid "Edit a previous filename: "
+msgstr "Éditez un nom de fichier précédent : "
+
+#: LYMessages.c:463
+msgid "Enter a new filename: "
+msgstr "Entrez un nouveau nom de fichier : "
+
+#: LYMessages.c:464
+msgid "File name may not begin with a dot."
+msgstr "Le nom de fichier ne peut commencer avec un point."
+
+#: LYMessages.c:466
+msgid "File exists. Create higher version?"
+msgstr "Ce fichier existe déjà. Créer une nouvelle version ?"
+
+#: LYMessages.c:468
+msgid "File exists. Overwrite?"
+msgstr "Ce fichier existe déjà. Remplacer ?"
+
+#: LYMessages.c:470
+msgid "Cannot write to file."
+msgstr "Écriture non autorisée."
+
+#: LYMessages.c:471
+msgid "ERROR! - download command is misconfigured."
+msgstr "ERREUR - la commande de téléchargement est mal configurée."
+
+#: LYMessages.c:472
+msgid "Unable to download file."
+msgstr "Impossible de télécharger le fichier."
+
+#: LYMessages.c:473
+msgid "Reading directory..."
+msgstr "Lecture du répertoire…"
+
+#: LYMessages.c:474
+msgid "Building directory listing..."
+msgstr "Création des listes de répertoire…"
+
+#: LYMessages.c:475
+msgid "Saving..."
+msgstr "Enregistrement…"
+
+#: LYMessages.c:476
+#, c-format
+msgid "Could not edit file '%s'."
+msgstr "Impossible d’éditer le fichier « %s »."
+
+#: LYMessages.c:477
+msgid "Unable to access document!"
+msgstr "Impossible d’accéder au document !"
+
+#: LYMessages.c:478
+msgid "Could not access file."
+msgstr "Impossible d’accéder au fichier."
+
+#: LYMessages.c:479
+msgid "Could not access directory."
+msgstr "Impossible d’accéder au répertoire."
+
+#: LYMessages.c:480
+msgid "Could not load data."
+msgstr "Impossible de charger les données."
+
+#. #define CANNOT_EDIT_REMOTE_FILES
+#: LYMessages.c:482
+msgid "Lynx cannot currently (e)dit remote WWW files."
+msgstr "Lynx ne peut (e) éditer de fichiers WWW distants."
+
+#. #define CANNOT_EDIT_FIELD
+#: LYMessages.c:484
+msgid "This field cannot be (e)dited with an external editor."
+msgstr "Ce champ ne peut être (e) édité par un éditeur externe."
+
+#: LYMessages.c:485
+msgid "Bad rule"
+msgstr "Mauvaise règle."
+
+#: LYMessages.c:486
+msgid "Insufficient operands:"
+msgstr "Nombre d’opérandes insuffisant :"
+
+#: LYMessages.c:487
+msgid "You are not authorized to edit this file."
+msgstr "Vous n’êtes pas autorisé à éditer ce fichier."
+
+#: LYMessages.c:488
+msgid "Title: "
+msgstr "Titre : "
+
+#: LYMessages.c:489
+msgid "Subject: "
+msgstr "Objet : "
+
+#: LYMessages.c:490
+msgid "Username: "
+msgstr "Nom d’utilisateur : "
+
+#: LYMessages.c:491
+msgid "Password: "
+msgstr "Mot de passe : "
+
+#: LYMessages.c:492
+msgid "lynx: Username and Password required!!!"
+msgstr "lynx : nom d’utilisateur et mot de passe requis !"
+
+#: LYMessages.c:493
+msgid "lynx: Password required!!!"
+msgstr "lynx : mot de passe requis !"
+
+# LYMessages_en.h
+#: LYMessages.c:494
+msgid "Clear all authorization info for this session?"
+msgstr "Effacer les données d’autorisation de cette session ?"
+
+#: LYMessages.c:495
+msgid "Authorization info cleared."
+msgstr "Informations d’autorisation effacées."
+
+#: LYMessages.c:496
+msgid "Authorization failed. Retry?"
+msgstr "L’autorisation a échouée. Réessayer ?"
+
+#: LYMessages.c:497
+msgid "cgi support has been disabled."
+msgstr "support cgi désactivé."
+
+#. #define CGI_NOT_COMPILED
+#: LYMessages.c:499
+msgid "Lynxcgi capabilities are not compiled into this version."
+msgstr "Les fonctionnalités Lynxcgi ne sont pas compilées dans cette version"
+
+#: LYMessages.c:500
+#, c-format
+msgid "Sorry, no known way of converting %s to %s."
+msgstr "Désolé. Aucun moyen connu de convertir %s en %s."
+
+#: LYMessages.c:501
+msgid "Unable to set up connection."
+msgstr "Impossible d’initialiser la connexion."
+
+#: LYMessages.c:502
+msgid "Unable to make connection"
+msgstr "Impossible d’établir la connexion."
+
+#. #define MALFORMED_EXEC_REQUEST
+#: LYMessages.c:504
+msgid "Executable link rejected due to malformed request."
+msgstr "Lien exécutable rejeté dû à une demande erronée."
+
+#. #define BADCHAR_IN_EXEC_LINK
+#: LYMessages.c:506
+#, c-format
+msgid "Executable link rejected due to `%c' character."
+msgstr "Lien exécutable rejeté dû au caractère « %c »."
+
+#. #define RELPATH_IN_EXEC_LINK
+#: LYMessages.c:508
+msgid "Executable link rejected due to relative path string ('../')."
+msgstr "Lien exécutable rejeté dû à un chemin relatif (« ../ »)"
+
+#. #define BADLOCPATH_IN_EXEC_LINK
+#: LYMessages.c:510
+msgid "Executable link rejected due to location or path."
+msgstr "Lien exécutable rejeté dû à l’emplacement ou au chemin d’accès"
+
+#: LYMessages.c:511
+msgid "Mail access is disabled!"
+msgstr "L’accès au courrier est désactivé."
+
+#. #define ACCESS_ONLY_LOCALHOST
+#: LYMessages.c:513
+msgid "Only files and servers on the local host can be accessed."
+msgstr "Seuls les fichiers/serveurs hébergés sur l’hôte local sont accessibles."
+
+#: LYMessages.c:514
+msgid "Telnet access is disabled!"
+msgstr "L’accès Telnet est désactivé."
+
+#. #define TELNET_PORT_SPECS_DISABLED
+#: LYMessages.c:516
+msgid "Telnet port specifications are disabled."
+msgstr "Les spécifications de port Telnet sont désactivées."
+
+#: LYMessages.c:517
+msgid "USENET news access is disabled!"
+msgstr "L’accès aux articles USENET est désactivé."
+
+#: LYMessages.c:518
+msgid "Rlogin access is disabled!"
+msgstr "L’accès Rlogin est désactivé."
+
+#: LYMessages.c:519
+msgid "Ftp access is disabled!"
+msgstr "L’accès FTP est désactivé."
+
+#: LYMessages.c:520
+msgid "There are no references from this document."
+msgstr "Il n’y a aucune référence dans ce document."
+
+#: LYMessages.c:521
+msgid "There are only hidden links from this document."
+msgstr "Ce document ne renvoie qu’à des liens cachés."
+
+#: LYMessages.c:523
+msgid "Unable to open command file."
+msgstr "Impossible d’ouvrir le fichier de commande."
+
+#: LYMessages.c:525
+msgid "News Post Cancelled!!!"
+msgstr "Envoi des news annulé !"
+
+#. #define SPAWNING_EDITOR_FOR_NEWS
+#: LYMessages.c:527
+msgid "Spawning your selected editor to edit news message"
+msgstr "Lancement de votre éditeur pour éditer un message"
+
+#: LYMessages.c:528
+msgid "Post this message?"
+msgstr "Envoyer ce message ?"
+
+#: LYMessages.c:529
+#, c-format
+msgid "Append '%s'?"
+msgstr "Adjoindre « %s » ?"
+
+#: LYMessages.c:530
+msgid "Posting to newsgroup(s)..."
+msgstr "Envoi du message (news)…"
+
+#: LYMessages.c:532
+msgid "*** You have unread mail. ***"
+msgstr "*** Vous avez du courrier non lu. ***"
+
+#: LYMessages.c:534
+msgid "*** You have mail. ***"
+msgstr "*** Vous avez du courrier. ***"
+
+#: LYMessages.c:536
+msgid "*** You have new mail. ***"
+msgstr "*** Vous avez du nouveau courrier. ***"
+
+#: LYMessages.c:537
+msgid "File insert cancelled!!!"
+msgstr "Insertion de fichier annulée !"
+
+#: LYMessages.c:538
+msgid "Not enough memory for file!"
+msgstr "Mémoire insuffisante pour le fichier !"
+
+# WWW/Libary/Implementation/HTFile.c
+#: LYMessages.c:539
+msgid "Can't open file for reading."
+msgstr "Impossible d’ouvrir le fichier en lecture."
+
+#: LYMessages.c:540
+msgid "File does not exist."
+msgstr "Le fichier n’existe pas."
+
+#: LYMessages.c:541
+msgid "File does not exist - reenter or cancel:"
+msgstr "Le fichier n’existe pas - réessayer ou annuler :"
+
+#: LYMessages.c:542
+msgid "File is not readable."
+msgstr "Le fichier n’est pas lisible."
+
+#: LYMessages.c:543
+msgid "File is not readable - reenter or cancel:"
+msgstr "Le fichier n’est pas lisible - réessayer ou annuler :"
+
+#: LYMessages.c:544
+msgid "Nothing to insert - file is 0-length."
+msgstr "Rien à insérer - le fichier est vide."
+
+#: LYMessages.c:545
+msgid "Save request cancelled!!!"
+msgstr "Demande d’enregistrement annulée !"
+
+#: LYMessages.c:546
+msgid "Mail request cancelled!!!"
+msgstr "Demande de courrier annulée !"
+
+#. #define CONFIRM_MAIL_SOURCE_PREPARSED
+#: LYMessages.c:548
+msgid "Viewing preparsed source. Are you sure you want to mail it?"
+msgstr "Lecture de la source pré-analysée. Veuillez confirmer l’envoi par mail ?"
+
+#: LYMessages.c:549
+msgid "Please wait..."
+msgstr "Veuillez attendre…"
+
+#: LYMessages.c:550
+msgid "Mailing file. Please wait..."
+msgstr "Envoi du fichier (mail). Veuillez attendre…"
+
+#: LYMessages.c:551
+msgid "ERROR - Unable to mail file"
+msgstr "ERREUR - impossible d’envoyer le fichier."
+
+#. #define CONFIRM_LONG_SCREEN_PRINT
+#: LYMessages.c:553
+#, c-format
+msgid "File is %d screens long. Are you sure you want to print?"
+msgstr "Le fichier représente %d écrans. Voulez-vous l’imprimer ?"
+
+#: LYMessages.c:554
+msgid "Print request cancelled!!!"
+msgstr "Demande d’impression annulée !"
+
+#: LYMessages.c:555
+msgid "Press <return> to begin: "
+msgstr "Pressez <Entrée> pour commencer : "
+
+#: LYMessages.c:556
+msgid "Press <return> to finish: "
+msgstr "Pressez <Entrée> pour terminer : "
+
+#. #define CONFIRM_LONG_PAGE_PRINT
+#: LYMessages.c:558
+#, c-format
+msgid "File is %d pages long. Are you sure you want to print?"
+msgstr "Le fichier représente %d pages. Voulez-vous l’imprimer ?"
+
+#. #define CHECK_PRINTER
+#: LYMessages.c:560
+msgid "Be sure your printer is on-line. Press <return> to start printing:"
+msgstr "Assurez vous que votre imprimante est allumée. Pressez <Entrée> pour démarrer l’impression."
+
+#: LYMessages.c:561
+msgid "ERROR - Unable to allocate file space!!!"
+msgstr "ERREUR - impossible d’allouer de l’espace pour le fichier !"
+
+#: LYMessages.c:562
+msgid "Unable to open tempfile"
+msgstr "Impossible d’ouvrir le fichier temporaire."
+
+#: LYMessages.c:563
+msgid "Unable to open print options file"
+msgstr "Impossible d’ouvrir le fichier d’options d’impression."
+
+#: LYMessages.c:564
+msgid "Printing file. Please wait..."
+msgstr "Impression du fichier. Veuillez attendre…"
+
+#: LYMessages.c:565
+msgid "Please enter a valid internet mail address: "
+msgstr "Veuillez entrer une adresse de courriel valide : "
+
+#: LYMessages.c:566
+msgid "ERROR! - printer is misconfigured!"
+msgstr "ERREUR - l’imprimante est mal configurée."
+
+# src/LYMap.c
+#: LYMessages.c:567
+msgid "Image map from POST response not available!"
+msgstr "L’image réactive dans la réponse POST n’est pas disponible !"
+
+#: LYMessages.c:568
+msgid "Misdirected client-side image MAP request!"
+msgstr "Mauvaise requête d’image réactive (MAP) côté client !"
+
+#: LYMessages.c:569
+msgid "Client-side image MAP is not accessible!"
+msgstr "L’image réactive (MAP) côté client n’est pas accessible."
+
+#: LYMessages.c:570
+msgid "No client-side image MAPs are available!"
+msgstr "Aucune image réactive (MAP) disponible côté client."
+
+#: LYMessages.c:571
+msgid "Client-side image MAP is not available!"
+msgstr "Image réactive (MAP) non disponible côté client."
+
+#. #define OPTION_SCREEN_NEEDS_24
+#: LYMessages.c:574
+msgid "Screen height must be at least 24 lines for the Options menu!"
+msgstr "La hauteur d’écran doit être d’au moins 24 lignes pour le menu Options !"
+
+#. #define OPTION_SCREEN_NEEDS_23
+#: LYMessages.c:576
+msgid "Screen height must be at least 23 lines for the Options menu!"
+msgstr "La hauteur d’écran doit être d’au moins 23 lignes pour le menu Options !"
+
+#. #define OPTION_SCREEN_NEEDS_22
+#: LYMessages.c:578
+msgid "Screen height must be at least 22 lines for the Options menu!"
+msgstr "La hauteur d’écran doit être d’au moins 22 lignes pour le menu Options !"
+
+#: LYMessages.c:580
+msgid "That key requires Advanced User mode."
+msgstr "Cette touche n’est active qu’en mode utilisateur avancé."
+
+#: LYMessages.c:581
+#, c-format
+msgid "Content-type: %s"
+msgstr "Type de contenu : %s"
+
+#: LYMessages.c:582
+msgid "Command: "
+msgstr "Commande : "
+
+#: LYMessages.c:583
+msgid "Unknown or ambiguous command"
+msgstr "Commande inconnue ou ambiguë."
+
+#: LYMessages.c:584
+msgid " Version "
+msgstr " Version "
+
+#: LYMessages.c:585
+msgid " first"
+msgstr " premier"
+
+#: LYMessages.c:586
+msgid ", guessing..."
+msgstr ", analyse…"
+
+#: LYMessages.c:587
+msgid "Permissions for "
+msgstr "Permissions pour "
+
+#: LYMessages.c:588
+msgid "Select "
+msgstr "Choisir "
+
+#: LYMessages.c:589
+msgid "capital letter"
+msgstr "majuscule"
+
+#: LYMessages.c:590
+msgid " of option line,"
+msgstr " de la ligne d’option,"
+
+#: LYMessages.c:591
+msgid " to save,"
+msgstr " pour enregistrer,"
+
+#: LYMessages.c:592
+msgid " to "
+msgstr " à "
+
+#: LYMessages.c:593
+msgid " or "
+msgstr " ou "
+
+#: LYMessages.c:594
+msgid " index"
+msgstr " index"
+
+#: LYMessages.c:595
+msgid " to return to Lynx."
+msgstr " pour retourner à Lynx."
+
+#: LYMessages.c:596
+msgid "Accept Changes"
+msgstr "Accepter les changements"
+
+#: LYMessages.c:597
+msgid "Reset Changes"
+msgstr "Annuler les changements"
+
+#: LYMessages.c:598
+msgid "Left Arrow cancels changes"
+msgstr "<gauche> pour annuler les changements"
+
+#: LYMessages.c:599
+msgid "Save options to disk"
+msgstr "Enregistrer les options sur disque"
+
+#: LYMessages.c:600
+msgid "Hit RETURN to accept entered data."
+msgstr "Pressez <Entrée> pour valider les données saisies."
+
+#. #define ACCEPT_DATA_OR_DEFAULT
+#: LYMessages.c:602
+msgid "Hit RETURN to accept entered data. Delete data to invoke the default."
+msgstr "Pressez <Entrée> pour valider la saisie, <suppr> pour les valeurs par défaut."
+
+#: LYMessages.c:603
+msgid "Value accepted!"
+msgstr "Valeur acceptée !"
+
+#. #define VALUE_ACCEPTED_WARNING_X
+#: LYMessages.c:605
+msgid "Value accepted! -- WARNING: Lynx is configured for XWINDOWS!"
+msgstr "Valeur acceptée ! NB : Lynx est configuré pour XWINDOWS !"
+
+#. #define VALUE_ACCEPTED_WARNING_NONX
+#: LYMessages.c:607
+msgid "Value accepted! -- WARNING: Lynx is NOT configured for XWINDOWS!"
+msgstr "Valeur acceptée ! -- NB : Lynx n’est PAS configuré pour XWINDOWS !"
+
+#: LYMessages.c:608
+msgid "You are not allowed to change which editor to use!"
+msgstr "Vous ne pouvez pas choisir un autre éditeur !"
+
+#: LYMessages.c:609
+msgid "Failed to set DISPLAY variable!"
+msgstr "Impossible de régler la variable DISPLAY."
+
+#: LYMessages.c:610
+msgid "Failed to clear DISPLAY variable!"
+msgstr "Impossible d’effacer la variable DISPLAY."
+
+#. #define BOOKMARK_CHANGE_DISALLOWED
+#: LYMessages.c:612
+msgid "You are not allowed to change the bookmark file!"
+msgstr "Changement du fichier de signets non autorisé !"
+
+#: LYMessages.c:613
+msgid "Terminal does not support color"
+msgstr "Le terminal ne supporte pas l’affichage en couleur"
+
+#: LYMessages.c:614
+#, c-format
+msgid "Your '%s' terminal does not support color."
+msgstr "Votre terminal %s ne permet pas l’affichage couleur."
+
+#: LYMessages.c:615
+msgid "Access to dot files is disabled!"
+msgstr "Accès aux fichiers cachés désactivé."
+
+#. #define UA_NO_LYNX_WARNING
+#: LYMessages.c:617
+msgid "User-Agent string does not contain \"Lynx\" or \"L_y_n_x\""
+msgstr "La chaîne User-Agent ne contient ni « Lynx » ni « L_y_n_x »"
+
+#. #define UA_PLEASE_USE_LYNX
+#: LYMessages.c:619
+msgid "Use \"L_y_n_x\" or \"Lynx\" in User-Agent, or it looks like intentional deception!"
+msgstr "Utilisez « L_y_n_x » ou « Lynx » dans le champ User-Agent ou cela apparaîtra comme une erreur volontaire !"
+
+#. #define UA_CHANGE_DISABLED
+#: LYMessages.c:621
+msgid "Changing of the User-Agent string is disabled!"
+msgstr "La modification du champ User-Agent est interdite !"
+
+#. #define CHANGE_OF_SETTING_DISALLOWED
+#: LYMessages.c:623
+msgid "You are not allowed to change this setting."
+msgstr "Vous n’êtes pas autorisé à changer ce paramètre."
+
+#: LYMessages.c:624
+msgid "Saving Options..."
+msgstr "Enregistrement des options…"
+
+#: LYMessages.c:625
+msgid "Options saved!"
+msgstr "Options enregistrées"
+
+#: LYMessages.c:626
+msgid "Unable to save Options!"
+msgstr "Impossible d’enregistrer les options !"
+
+#: LYMessages.c:627
+msgid " 'r' to return to Lynx "
+msgstr "Pressez <r> pour retourner à Lynx "
+
+#: LYMessages.c:628
+msgid " '>' to save, or 'r' to return to Lynx "
+msgstr "<>> pour enregistrer, ou <r> pour retourner à Lynx "
+
+#. #define ANY_KEY_CHANGE_RET_ACCEPT
+#: LYMessages.c:630
+msgid "Hit any key to change value; RETURN to accept."
+msgstr "Touche quelconque pour changer la valeur, <Entrée> pour accepter."
+
+#: LYMessages.c:631
+msgid "Error uncompressing temporary file!"
+msgstr "Erreur de décompression du fichier temporaire !"
+
+#: LYMessages.c:632
+msgid "Unsupported URL scheme!"
+msgstr "Schèma d’URL non supporté !"
+
+#: LYMessages.c:633
+msgid "Unsupported data: URL! Use SHOWINFO, for now."
+msgstr "Données URL non reconnues, utilisez SHOWINFO pour l’instant."
+
+#: LYMessages.c:634
+#, c-format
+msgid "Redirection limit of %d URL's reached."
+msgstr "Limite des redirections de %d URL atteinte."
+
+#: LYMessages.c:635
+msgid "Illegal redirection URL received from server!"
+msgstr "URL de redirection illégale reçue du serveur !"
+
+#. #define SERVER_ASKED_FOR_REDIRECTION
+#: LYMessages.c:637
+#, c-format
+msgid "Server asked for %d redirection of POST content to"
+msgstr "Le serveur a demandé la redirection %d du contenu POST vers"
+
+#: LYMessages.c:640
+msgid "P)roceed, use G)ET or C)ancel "
+msgstr "P)rocéder, obtenir par G)ET ou C)Annuler "
+
+#: LYMessages.c:641
+msgid "P)roceed, or C)ancel "
+msgstr "P)rocéder ou C) Annuler "
+
+#. #define ADVANCED_POST_GET_REDIRECT
+#: LYMessages.c:643
+msgid "Redirection of POST content. P)roceed, see U)RL, use G)ET or C)ancel"
+msgstr "Redirection du contenu POST. P)rocéder, voir l’ U)RL, G)ET ou C) Annuler"
+
+#. #define ADVANCED_POST_REDIRECT
+#: LYMessages.c:645
+msgid "Redirection of POST content. P)roceed, see U)RL, or C)ancel"
+msgstr "Réacheminement du contenu POST. P)rocéder, voir l’ U)RL ou C) Annuler"
+
+#. #define CONFIRM_POST_RESUBMISSION
+#: LYMessages.c:647
+msgid "Document from Form with POST content. Resubmit?"
+msgstr "Document FORM avec contenu POST. Envoyer de nouveau ?"
+
+#. #define CONFIRM_POST_RESUBMISSION_TO
+#: LYMessages.c:649
+#, c-format
+msgid "Resubmit POST content to %s ?"
+msgstr "Renvoyer le contenu POST vers %s ?"
+
+#. #define CONFIRM_POST_LIST_RELOAD
+#: LYMessages.c:651
+#, c-format
+msgid "List from document with POST data. Reload %s ?"
+msgstr "Liste depuis un document avec données POST. Recharger %s ?"
+
+#. #define CONFIRM_POST_DOC_HEAD
+#: LYMessages.c:653
+msgid "Document from POST action, HEAD may not be understood. Proceed?"
+msgstr "Document de type POST, l’élément HEAD peut être mal compris. Procéder ?"
+
+#. #define CONFIRM_POST_LINK_HEAD
+#: LYMessages.c:655
+msgid "Form submit action is POST, HEAD may not be understood. Proceed?"
+msgstr "Envoi par méthode POST, l’élément HEAD peut être mal compris. Procéder ?"
+
+#: LYMessages.c:656
+msgid "Proceed without a username and password?"
+msgstr "Procéder sans identification de l’utilisateur par mot de passe ?"
+
+#: LYMessages.c:657
+#, c-format
+msgid "Proceed (%s)?"
+msgstr "Procéder (%s) ?"
+
+#: LYMessages.c:658
+msgid "Cannot POST to this host."
+msgstr "Impossible d’envoyer par POST vers cet hôte."
+
+# src/LYGetFile.c
+#: LYMessages.c:659
+msgid "POST not supported for this URL - ignoring POST data!"
+msgstr "Méthode POST non supportée pour cette URL - données POST ignorées."
+
+#: LYMessages.c:660
+msgid "Discarding POST data..."
+msgstr "Suppression des données POST…"
+
+#: LYMessages.c:661
+msgid "Document will not be reloaded!"
+msgstr "Le document ne sera pas rechargé !"
+
+#: LYMessages.c:662
+msgid "Location: "
+msgstr "Emplacement : "
+
+#: LYMessages.c:663
+#, c-format
+msgid "'%s' not found!"
+msgstr "« %s » non trouvé(e) !"
+
+#: LYMessages.c:664
+msgid "Default Bookmark File"
+msgstr "Fichier signets par défaut"
+
+#: LYMessages.c:665
+msgid "Screen too small! (8x35 min)"
+msgstr "L’écran est trop petit ! (8x35 min)"
+
+#: LYMessages.c:666
+msgid "Select destination or ^G to Cancel: "
+msgstr "Choisissez une destination ou entrez ^G pour annuler : "
+
+#. #define MULTIBOOKMARKS_SELECT
+#: LYMessages.c:668
+msgid "Select subbookmark, '=' for menu, or ^G to cancel: "
+msgstr "Choisir classeur de signets, <=> pour le menu ou <^G> pour annuler : "
+
+#. #define MULTIBOOKMARKS_SELF
+#: LYMessages.c:670
+msgid "Reproduce L)ink in this bookmark file or C)ancel? (l,c): "
+msgstr "Copier le L)ien dans ce fichier de signets ou C) Annuler ? (l, c) : "
+
+#: LYMessages.c:671
+msgid "Multiple bookmark support is not available."
+msgstr "Le support des signets multiples n’est pas disponible."
+
+#: LYMessages.c:672
+#, c-format
+msgid " Select Bookmark (screen %d of %d)"
+msgstr "Sélection de signets (écran %d de %d)"
+
+#: LYMessages.c:673
+msgid " Select Bookmark"
+msgstr " Sélection signets"
+
+#. #define MULTIBOOKMARKS_EHEAD_MASK
+#: LYMessages.c:675
+#, c-format
+msgid "Editing Bookmark DESCRIPTION and FILEPATH (%d of 2)"
+msgstr "Édition de signet : description, chemin de fichier (%d de 2)"
+
+# UNSURE
+#. #define MULTIBOOKMARKS_EHEAD
+#: LYMessages.c:677
+msgid " Editing Bookmark DESCRIPTION and FILEPATH"
+msgstr " Édition de signet : description et chemin"
+
+# UNSURE
+#: LYMessages.c:678
+msgid "Letter: "
+msgstr "Lettre : "
+
+#. #define USE_PATH_OFF_HOME
+#: LYMessages.c:681
+msgid "Use a filepath off your login directory in SHELL syntax!"
+msgstr "Utilisez un chemin de fichier hors de votre répertoire personnel (syntaxe du shell)"
+
+#: LYMessages.c:683
+msgid "Use a filepath off your home directory!"
+msgstr "Utilisez un chemin de fichier hors de votre répertoire personnel"
+
+#. #define MAXLINKS_REACHED
+#: LYMessages.c:686
+msgid "Maximum links per page exceeded! Use half-page or two-line scrolling."
+msgstr "Maximum de liens/page dépassé. Utilisez le défilement demi-page ou double lignes."
+
+#: LYMessages.c:687
+msgid "No previously visited links available!"
+msgstr "Aucun lien déjà visité n’est disponible."
+
+#: LYMessages.c:688
+msgid "Memory exhausted! Program aborted!"
+msgstr "Mémoire insuffisante ! Abandon !"
+
+#: LYMessages.c:689
+msgid "Memory exhausted! Aborting..."
+msgstr "Mémoire insuffisante ! Abandon…"
+
+#: LYMessages.c:690
+msgid "Not enough memory!"
+msgstr "Mémoire insuffisante !"
+
+#: LYMessages.c:691
+msgid "Directory/File Manager not available"
+msgstr "Gestionnaire de fichiers/répertoires non disponible"
+
+#: LYMessages.c:692
+msgid "Location URL is not absolute."
+msgstr "Il ne s’agit pas d’une URL absolue."
+
+#: LYMessages.c:693
+msgid "Refresh URL is not absolute."
+msgstr "Il ne s’agit pas d’une URL absolue."
+
+# NdT: This one is not clear...
+#. #define SENDING_MESSAGE_WITH_BODY_TO
+#: LYMessages.c:695
+msgid ""
+"You are sending a message with body to:\n"
+" "
+msgstr ""
+"Vous envoyez un message non vide à :\n"
+" "
+
+#: LYMessages.c:696
+msgid ""
+"You are sending a comment to:\n"
+" "
+msgstr ""
+"Vous envoyez un commentaire à :\n"
+" "
+
+#: LYMessages.c:697
+msgid ""
+"\n"
+" With copy to:\n"
+" "
+msgstr ""
+"\n"
+" En copie à :\n"
+" "
+
+#: LYMessages.c:698
+msgid ""
+"\n"
+" With copies to:\n"
+" "
+msgstr ""
+"\n"
+" En copies à :\n"
+" "
+
+#. #define CTRL_G_TO_CANCEL_SEND
+#: LYMessages.c:700
+msgid ""
+"\n"
+"\n"
+"Use Ctrl-G to cancel if you do not want to send a message\n"
+msgstr ""
+"\n"
+"\n"
+"Faites <Ctrl-G> pour annuler l’envoi du message\n"
+
+# The following two messages have been put together to make:
+#. #define ENTER_NAME_OR_BLANK
+#: LYMessages.c:702
+msgid ""
+"\n"
+" Please enter your name, or leave it blank to remain anonymous\n"
+msgstr ""
+"\n"
+" Entrez votre nom (ou laissez un blanc pour rester anonyme)\n"
+
+#. #define ENTER_MAIL_ADDRESS_OR_OTHER
+#: LYMessages.c:704
+msgid ""
+"\n"
+" Please enter a mail address or some other\n"
+msgstr ""
+"\n"
+" Entrez une adresse de courrier ou un autre moyen\n"
+
+#. #define MEANS_TO_CONTACT_FOR_RESPONSE
+#: LYMessages.c:706
+msgid " means to contact you, if you desire a response.\n"
+msgstr " moyen de vous joindre si vous désirez une réponse.\n"
+
+#: LYMessages.c:707
+msgid ""
+"\n"
+" Please enter a subject line.\n"
+msgstr ""
+"\n"
+" Veuillez entrer le sujet du message.\n"
+
+#. #define ENTER_ADDRESS_FOR_CC
+#: LYMessages.c:709
+msgid ""
+"\n"
+" Enter a mail address for a CC of your message.\n"
+msgstr ""
+"\n"
+" Entrez une adresse de courrier pour la copie conforme.\n"
+
+#: LYMessages.c:710
+msgid " (Leave blank if you don't want a copy.)\n"
+msgstr " (Laissez en blanc si vous ne voulez pas de copie.)\n"
+
+#: LYMessages.c:711
+msgid ""
+"\n"
+" Please review the message body:\n"
+"\n"
+msgstr ""
+"\n"
+" Veuillez relire le corps du message :\n"
+"\n"
+
+#: LYMessages.c:712
+msgid ""
+"\n"
+"Press RETURN to continue: "
+msgstr ""
+"\n"
+"Pressez <Entrée> pour continuer :"
+
+#: LYMessages.c:713
+msgid ""
+"\n"
+"Press RETURN to clean up: "
+msgstr ""
+"\n"
+"Pressez <Entrée> pour restaurer : "
+
+#: LYMessages.c:714
+msgid " Use Control-U to erase the default.\n"
+msgstr "Faites <Ctrl-U> pour effacer la valeur par défaut.\n"
+
+#: LYMessages.c:715
+msgid ""
+"\n"
+" Please enter your message below."
+msgstr ""
+"\n"
+" Veuillez entrer votre message ci-après."
+
+#. #define ENTER_PERIOD_WHEN_DONE_A
+#: LYMessages.c:717 src/LYNews.c:360
+msgid ""
+"\n"
+" When you are done, press enter and put a single period (.)"
+msgstr ""
+"\n"
+" Une fois terminé, faites <Entrée> et tapez un point (.)"
+
+#. #define ENTER_PERIOD_WHEN_DONE_B
+#: LYMessages.c:719 src/LYNews.c:361
+msgid ""
+"\n"
+" on a line and press enter again."
+msgstr ""
+"\n"
+" sur une ligne, puis faites <Entrée> de nouveau."
+
+# NOTE: I will have to get you an example text.
+#
+# Example:
+# csuite.chebucto.ns.ca cookie: Status=Active+Requests Allow? (Y/N/Always/neVer
+# ie <host> cookie: <key>=<value> Allow?
+# Ndt: Yes! The word order might be different...
+# NdT: Can you make the system accept the O, N, T, J commands?
+#. Cookies messages
+#. #define ADVANCED_COOKIE_CONFIRMATION
+#: LYMessages.c:723
+#, c-format
+msgid "%s cookie: %.*s=%.*s Allow? (Y/N/Always/neVer)"
+msgstr "cookie de %s : %.*s=%.*s Accepter ? (Oui/Non/Toujours/Jamais)"
+
+#. #define INVALID_COOKIE_DOMAIN_CONFIRMATION
+#: LYMessages.c:725
+#, c-format
+msgid "Accept invalid cookie domain=%s for '%s'?"
+msgstr "Accepter un cookie au domaine non valide=%s pour « %s » ?"
+
+#. #define INVALID_COOKIE_PATH_CONFIRMATION
+#: LYMessages.c:727
+#, c-format
+msgid "Accept invalid cookie path=%s as a prefix of '%s'?"
+msgstr "Accepter un chemin de cookie invalide=%s comme préfixe de « %s » ?"
+
+#: LYMessages.c:728
+msgid "Allowing this cookie."
+msgstr "Acceptation du cookie"
+
+#: LYMessages.c:729
+msgid "Rejecting this cookie."
+msgstr "Rejet du cookie"
+
+#: LYMessages.c:730
+msgid "The Cookie Jar is empty."
+msgstr "Le conteneur de cookies est vide."
+
+#: LYMessages.c:731
+msgid "The Cache Jar is empty."
+msgstr "Le cache mémoire est vide."
+
+# --------
+# Missed strings 97-12-07
+# LYMessages_en.h (LYCookie.c)
+# NdT: What do they mean by "gobble up an entire domain"?
+#. #define ACTIVATE_TO_GOBBLE
+#: LYMessages.c:733
+msgid "Activate links to gobble up cookies or entire domains,"
+msgstr "Activer les liens pour englober les cookies ou les domaines entiers,"
+
+#: LYMessages.c:734
+msgid "or to change a domain's 'allow' setting."
+msgstr "ou pour changer les paramètres de permission pour un domaine."
+
+#: LYMessages.c:735
+msgid "(Cookies never allowed.)"
+msgstr "(Cookies jamais acceptés)"
+
+#: LYMessages.c:736
+msgid "(Cookies always allowed.)"
+msgstr "(Cookies toujours acceptés)"
+
+#: LYMessages.c:737
+msgid "(Cookies allowed via prompt.)"
+msgstr "(Cookies acceptés sur demande)"
+
+#: LYMessages.c:738
+msgid "(Persistent Cookies.)"
+msgstr "(Cookies persistants)"
+
+#: LYMessages.c:739
+msgid "(No title.)"
+msgstr "(Pas de titre)"
+
+#: LYMessages.c:740
+msgid "(No name.)"
+msgstr "(Aucun nom)"
+
+#: LYMessages.c:741
+msgid "(No value.)"
+msgstr "(Aucune valeur)"
+
+#: LYMessages.c:742 src/LYOptions.c:2482
+msgid "None"
+msgstr "Aucun(e)"
+
+#: LYMessages.c:743
+msgid "(End of session.)"
+msgstr "(Fin de session)"
+
+#: LYMessages.c:744
+msgid "Delete this cookie?"
+msgstr "Supprimer ce cookie ?"
+
+#: LYMessages.c:745
+msgid "The cookie has been eaten!"
+msgstr "Le cookie a été supprimé !"
+
+#: LYMessages.c:746
+msgid "Delete this empty domain?"
+msgstr "Supprimer ce domaine vide ?"
+
+#: LYMessages.c:747
+msgid "The domain has been eaten!"
+msgstr "Le domaine a été supprimé !"
+
+# NdT: Does P)rompt trigger a confirmation screen?
+# NOTE: Option letters come from the capitalised letter in the option,
+# so if introducing a new option make sure it has a translation.
+#. #define DELETE_COOKIES_SET_ALLOW_OR_CANCEL
+#: LYMessages.c:749
+msgid "D)elete domain's cookies, set allow A)lways/P)rompt/neV)er, or C)ancel? "
+msgstr "D)Supprimer cookies du domaine ; régler permission : A)Toujours P)Demander V)Jamais C)Annuler ?"
+
+#. #define DELETE_DOMAIN_SET_ALLOW_OR_CANCEL
+#: LYMessages.c:751
+msgid "D)elete domain, set allow A)lways/P)rompt/neV)er, or C)ancel? "
+msgstr "D)Supprimer domaine ; régler permission : A)Toujours P)Demander V)Jamais C)Annuler ?"
+
+#: LYMessages.c:752
+msgid "All cookies in the domain have been eaten!"
+msgstr "Tous les cookies du domaine ont été supprimés !"
+
+#: LYMessages.c:753
+#, c-format
+msgid "'A'lways allowing from domain '%s'."
+msgstr "<A> Toujours accepter les cookies du domaine « %s »."
+
+#: LYMessages.c:754
+#, c-format
+msgid "ne'V'er allowing from domain '%s'."
+msgstr "<V> Ne jamais accepter les cookies du domaine « %s »."
+
+# NdT: What does happen exatly when you chose P)rompt?
+#: LYMessages.c:755
+#, c-format
+msgid "'P'rompting to allow from domain '%s'."
+msgstr "<P> Demander avant d’accepter les cookies du domaine « %s »."
+
+#: LYMessages.c:756
+msgid "Delete all cookies in this domain?"
+msgstr "Supprimer tous les cookies de ce domaine ?"
+
+#: LYMessages.c:757
+msgid "All of the cookies in the jar have been eaten!"
+msgstr "Tous les cookies ont été supprimés !"
+
+#: LYMessages.c:759
+msgid "Port 19 not permitted in URLs."
+msgstr "Le port 19 n’est pas permis dans les URL."
+
+#: LYMessages.c:760
+msgid "Port 25 not permitted in URLs."
+msgstr "Le port 25 n’est pas permis dans les URL."
+
+#: LYMessages.c:761
+#, c-format
+msgid "Port %lu not permitted in URLs."
+msgstr "Le port %lu n’est pas permis dans les URL."
+
+#: LYMessages.c:762
+msgid "URL has a bad port field."
+msgstr "Champ port dans l’URL erroné."
+
+#: LYMessages.c:763
+msgid "Maximum nesting of HTML elements exceeded."
+msgstr "Imbrication maximale d’éléments HTML atteinte."
+
+#: LYMessages.c:764
+msgid "Bad partial reference! Stripping lead dots."
+msgstr "Référence partielle erronée ! Suppression des points (../)."
+
+#: LYMessages.c:765
+msgid "Trace Log open failed. Trace off!"
+msgstr "Échec d’ouverture du journal. Journalisation désactivée."
+
+#: LYMessages.c:766
+msgid "Lynx Trace Log"
+msgstr "Journal d’activité Lynx"
+
+#: LYMessages.c:767
+msgid "No trace log has been started for this session."
+msgstr "Aucun journal d’activité n’a été lancé pour cette session."
+
+#. #define MAX_TEMPCOUNT_REACHED
+#: LYMessages.c:769
+msgid "The maximum temporary file count has been reached!"
+msgstr "Le nombre maximum de fichiers temporaires a été atteint."
+
+#. #define FORM_VALUE_TOO_LONG
+#: LYMessages.c:771
+msgid "Form field value exceeds buffer length! Trim the tail."
+msgstr "La valeur excède la taille du tampon ; réduire la fin."
+
+#. #define FORM_TAIL_COMBINED_WITH_HEAD
+#: LYMessages.c:773
+msgid "Modified tail combined with head of form field value."
+msgstr "Lignes finales modifiées combinées avec entête (champ de formulaire)"
+
+#. HTFile.c
+#: LYMessages.c:776
+msgid "Directory"
+msgstr "Répertoire"
+
+#: LYMessages.c:777
+msgid "Directory browsing is not allowed."
+msgstr "Le parcours du répertoire n’est pas permis."
+
+#: LYMessages.c:778
+msgid "Selective access is not enabled for this directory"
+msgstr "L’accès sélectif n’est pas activé pour ce répertoire."
+
+#: LYMessages.c:779
+msgid "Multiformat: directory scan failed."
+msgstr "Multiformat : l’analyse du répertoire a échoué."
+
+#: LYMessages.c:780
+msgid "This directory is not readable."
+msgstr "Ce répertoire ne peut être lu."
+
+#: LYMessages.c:781
+msgid "Can't access requested file."
+msgstr "Impossible d’accéder au fichier requis."
+
+#: LYMessages.c:782
+msgid "Could not find suitable representation for transmission."
+msgstr "Impossible de trouver une représentation correcte pour la transmission."
+
+# WWW/Libary/Implementation/HTFile.c
+#: LYMessages.c:783
+msgid "Could not open file for decompression!"
+msgstr "Impossible d’ouvrir le fichier pour décompression."
+
+#: LYMessages.c:784
+msgid "Files:"
+msgstr "Fichiers :"
+
+#: LYMessages.c:785
+msgid "Subdirectories:"
+msgstr "Sous-répertoires :"
+
+#: LYMessages.c:786
+msgid " directory"
+msgstr " répertoire"
+
+#: LYMessages.c:787
+msgid "Up to "
+msgstr "jusqu’à "
+
+#: LYMessages.c:788
+msgid "Current directory is "
+msgstr "Le répertoire courant est "
+
+#. HTFTP.c
+#: LYMessages.c:791
+msgid "Symbolic Link"
+msgstr "Lien symbolique"
+
+#. HTGopher.c
+#: LYMessages.c:794
+msgid "No response from server!"
+msgstr "Pas de réponse du serveur !"
+
+#: LYMessages.c:795
+msgid "CSO index"
+msgstr "index CSO"
+
+#: LYMessages.c:796
+msgid ""
+"\n"
+"This is a searchable index of a CSO database.\n"
+msgstr ""
+"\n"
+"Ceci est un index interrogeable d’une base de données CSO.\n"
+
+#: LYMessages.c:797
+msgid "CSO Search Results"
+msgstr "Résultats de recherche CSO"
+
+#: LYMessages.c:798
+#, c-format
+msgid "Seek fail on %s\n"
+msgstr "Échec de positionnement sur %s\n"
+
+#: LYMessages.c:799
+msgid ""
+"\n"
+"Press the 's' key and enter search keywords.\n"
+msgstr ""
+"\n"
+"Appuyez sur la touche <s> et entrez les mots clefs de recherche.\n"
+
+#: LYMessages.c:800
+msgid ""
+"\n"
+"This is a searchable Gopher index.\n"
+msgstr ""
+"\n"
+"Ceci est un index Gopher interrogeable.\n"
+
+#: LYMessages.c:801
+msgid "Gopher index"
+msgstr "Index Gopher"
+
+#: LYMessages.c:802
+msgid "Gopher Menu"
+msgstr "Menu Gopher"
+
+#: LYMessages.c:803
+msgid " Search Results"
+msgstr " Résultats de la recherche"
+
+#: LYMessages.c:804
+msgid "Sending CSO/PH request."
+msgstr "Envoi de la requête CSO/PH."
+
+#: LYMessages.c:805
+msgid "Sending Gopher request."
+msgstr "Envoi de la requête Gopher."
+
+#: LYMessages.c:806
+msgid "CSO/PH request sent; waiting for response."
+msgstr "Requête CSO/PH envoyée, attente de réponse."
+
+#: LYMessages.c:807
+msgid "Gopher request sent; waiting for response."
+msgstr "Requête Gopher envoyée, attente de réponse."
+
+#: LYMessages.c:808
+msgid ""
+"\n"
+"Please enter search keywords.\n"
+msgstr ""
+"\n"
+"Merci d’entrer les mots clefs à rechercher.\n"
+
+#: LYMessages.c:809
+msgid ""
+"\n"
+"The keywords that you enter will allow you to search on a"
+msgstr ""
+"\n"
+"Les mots clefs saisis vous permettront de faire une recherche sur un"
+
+#: LYMessages.c:810
+msgid " person's name in the database.\n"
+msgstr " nom de personne dans la base de donnée.\n"
+
+#. HTNews.c
+#: LYMessages.c:813
+msgid "Connection closed ???"
+msgstr "Connexion fermée ???"
+
+#: LYMessages.c:814
+msgid "Cannot open temporary file for news POST."
+msgstr "Impossible d’ouvrir un fichier temporaire pour les articles de forums."
+
+#: LYMessages.c:815
+msgid "This client does not contain support for posting to news with SSL."
+msgstr "Ce client ne permet pas l’envoi de news avec SSL"
+
+#. HTStyle.c
+#: LYMessages.c:818
+#, c-format
+msgid "Style %d `%s' SGML:%s. Font %s %.1f point.\n"
+msgstr "Style %d « %s » SGML : %s. Police %s %.1f point.\n"
+
+#: LYMessages.c:820
+#, c-format
+msgid "\tAlign=%d, %d tabs. (%.0f before, %.0f after)\n"
+msgstr "\tAlign = %d, %d tabs. (%.0f avant, %.0f après)\n"
+
+#: LYMessages.c:821
+#, c-format
+msgid "\t\tTab kind=%d at %.0f\n"
+msgstr "\t\tType Tab = %d à %.0f\n"
+
+#. HTTP.c
+#: LYMessages.c:824
+msgid "Can't proceed without a username and password."
+msgstr "Impossible de procéder sans identifient utilisateur et mot de passe."
+
+#: LYMessages.c:825
+msgid "Can't retry with authorization! Contact the server's WebMaster."
+msgstr "Impossible de rejouer l’autorisation ! Contactez le webmaster du serveur."
+
+#: LYMessages.c:826
+msgid "Can't retry with proxy authorization! Contact the server's WebMaster."
+msgstr "Impossible de redemander l’autorisation au mandataire (proxy) ; contacter le webmaster."
+
+#: LYMessages.c:827
+msgid "Retrying with proxy authorization information."
+msgstr "Nouvelle tentative d’envoi des informations d’autorisation au mandataire (proxy)."
+
+#: LYMessages.c:828
+#, c-format
+msgid "SSL error:%s-Continue?"
+msgstr "Erreur SSL : %s - Continuer ?"
+
+#. HTWAIS.c
+#: LYMessages.c:831
+msgid "HTWAIS: Return message too large."
+msgstr "HTWAIS : Message de retour trop grand."
+
+#: LYMessages.c:832
+msgid "Enter WAIS query: "
+msgstr "Entrez votre requête WAIS : "
+
+#. Miscellaneous status
+#: LYMessages.c:835
+msgid "Retrying as HTTP0 request."
+msgstr "Nouvel essai de requête HTTP0."
+
+#: LYMessages.c:836
+#, c-format
+msgid "Transferred %d bytes"
+msgstr "%d octets transférés"
+
+#: LYMessages.c:837
+msgid "Data transfer complete"
+msgstr "Transfert de données terminé"
+
+#: LYMessages.c:838
+#, c-format
+msgid "Error processing line %d of %s\n"
+msgstr "Erreur à la ligne %d de %s\n"
+
+#. Lynx internal page titles
+#: LYMessages.c:841
+msgid "Address List Page"
+msgstr "Page de liste d’adresses"
+
+#: LYMessages.c:842
+msgid "Bookmark file"
+msgstr "Fichier de signets"
+
+#: LYMessages.c:843
+msgid "Configuration Definitions"
+msgstr "Définitions de configuration"
+
+#: LYMessages.c:844
+msgid "Cookie Jar"
+msgstr "Cache des cookies"
+
+#: LYMessages.c:845
+msgid "Current Edit-Key Map"
+msgstr "Configuration des touches d’édition"
+
+#: LYMessages.c:846
+msgid "Current Key Map"
+msgstr "Configuration des touches"
+
+#: LYMessages.c:847
+msgid "File Management Options"
+msgstr "Options de gestion de fichier"
+
+#: LYMessages.c:848
+msgid "Download Options"
+msgstr "Options de téléchargement"
+
+#: LYMessages.c:849
+msgid "History Page"
+msgstr "Historique"
+
+#: LYMessages.c:850
+msgid "Cache Jar"
+msgstr "Mémoire cache"
+
+#: LYMessages.c:851
+msgid "List Page"
+msgstr "Page de la liste"
+
+#: LYMessages.c:852
+msgid "Lynx.cfg Information"
+msgstr "Informations sur Lynx.cfg"
+
+#: LYMessages.c:853
+msgid "Converted Mosaic Hotlist"
+msgstr "Liste de signets Mosaic convertie"
+
+#: LYMessages.c:854
+msgid "Options Menu"
+msgstr "Menu Options"
+
+#: LYMessages.c:855
+msgid "File Permission Options"
+msgstr "Options de permissions d’accès"
+
+#: LYMessages.c:856
+msgid "Printing Options"
+msgstr "Options d’impression"
+
+#: LYMessages.c:857
+msgid "Information about the current document"
+msgstr "Informations sur le document courant"
+
+#: LYMessages.c:858
+msgid "Your recent statusline messages"
+msgstr "Votre ligne d’état de messages récente"
+
+#: LYMessages.c:859
+msgid "Upload Options"
+msgstr "Options d’envoi de fichiers"
+
+#: LYMessages.c:860
+msgid "Visited Links Page"
+msgstr "Page des liens visités"
+
+#. CONFIG_DEF_TITLE subtitles
+#: LYMessages.c:863
+msgid "See also"
+msgstr "Voir aussi"
+
+#: LYMessages.c:864
+msgid "your"
+msgstr "votre"
+
+#: LYMessages.c:865
+msgid "for runtime options"
+msgstr "pour les options d’exécution"
+
+#: LYMessages.c:866
+msgid "compile time options"
+msgstr "options de compilation"
+
+#: LYMessages.c:867
+msgid "color-style configuration"
+msgstr "configuration en style coloré"
+
+#: LYMessages.c:868
+msgid "latest release"
+msgstr "dernière version"
+
+#: LYMessages.c:869
+msgid "pre-release version"
+msgstr "version pré finale"
+
+#: LYMessages.c:870
+msgid "development version"
+msgstr "version de développement"
+
+#. #define AUTOCONF_CONFIG_CACHE
+#: LYMessages.c:872
+msgid ""
+"The following data were derived during the automatic configuration/build\n"
+"process of this copy of Lynx. When reporting a bug, please include a copy\n"
+"of this page."
+msgstr ""
+"Les données suivantes ont été créées lors de la construction automatique\n"
+"de cette copie de lynx. Lorsque vous nous informez d’un bug, merci\n"
+"d’inclure une copie de cette page."
+
+#. #define AUTOCONF_LYNXCFG_H
+#: LYMessages.c:876
+msgid ""
+"The following data were used as automatically-configured compile-time\n"
+"definitions when this copy of Lynx was built."
+msgstr ""
+"Les données suivantes ont été utilisées comme des options de compilations\n"
+"configurées automatiquement lors de la compilation de cette version de Lynx."
+
+#. #define DIRED_NOVICELINE
+#: LYMessages.c:881
+msgid " C)reate D)ownload E)dit F)ull menu M)odify R)emove T)ag U)pload \n"
+msgstr "C)réer D)Télécharger E)Éditer F)Menu M)odifier R)Supprimer T)Marquer U)Envoyer\n"
+
+#: LYMessages.c:882
+msgid "Failed to obtain status of current link!"
+msgstr "Impossible d’obtenir l’état du lien courant !"
+
+#. #define INVALID_PERMIT_URL
+#: LYMessages.c:885
+msgid "Special URL only valid from current File Permission menu!"
+msgstr "URL spéciales validées uniquement dans le menu des permissions !"
+
+#: LYMessages.c:889
+msgid "External support is currently disabled."
+msgstr "Le support externe est désactivé."
+
+#. new with 2.8.4dev.21
+#: LYMessages.c:893
+msgid "Changing working-directory is currently disabled."
+msgstr "Le changement de répertoire de travail est désactivé."
+
+#: LYMessages.c:894
+msgid "Linewrap OFF!"
+msgstr "Coupure des lignes désactivée"
+
+#: LYMessages.c:895
+msgid "Linewrap ON!"
+msgstr "Coupure des lignes activée"
+
+#: LYMessages.c:896
+msgid "Parsing nested-tables toggled OFF! Reloading..."
+msgstr "Analyse des tables imbriquées activée. Rechargement…"
+
+#: LYMessages.c:897
+msgid "Parsing nested-tables toggled ON! Reloading..."
+msgstr "Analyse des tables imbriquées désactivée. Rechargement…"
+
+#: LYMessages.c:898
+msgid "Shifting is disabled while line-wrap is in effect"
+msgstr "Glissement de ligne désactivé (coupures de lignes activées)"
+
+#: LYMessages.c:899
+msgid "Trace not supported"
+msgstr "Traçage non supporté"
+
+#: LYMessages.c:819
+#, c-format
+msgid "\tIndents: first=%.0f others=%.0f, Height=%.1f Desc=%.1f\n"
+msgstr "\tIndentations : première=%.0f autres=%.0f, hauteur=%.1f desc=%.1f\n"
+
+#: WWW/Library/Implementation/HTAABrow.c:575
+#, c-format
+msgid "username for realm %s changed from %s to %s"
+msgstr "Le nom d’utilisateur pour la hiérarchie %s a changé de %s en %s"
+
+#: WWW/Library/Implementation/HTAABrow.c:591
+#, c-format
+msgid "password for realm %s user %s changed"
+msgstr "Le mot de passe a changé pour la hiérarchie %s et l’utilisateur %s"
+
+#: WWW/Library/Implementation/HTAABrow.c:703
+#, c-format
+msgid "Username for '%s' at %s '%s%s':"
+msgstr "Nom d’utilisateur pour « %s » à %s « %s%s » :"
+
+#: WWW/Library/Implementation/HTAABrow.c:976
+msgid "This client doesn't know how to compose proxy authorization information for scheme"
+msgstr "Ce client ne sait pas former les données d’autorisation du mandataire (proxy) dans ce schéma"
+
+#: WWW/Library/Implementation/HTAABrow.c:1053
+msgid "This client doesn't know how to compose authorization information for scheme"
+msgstr "Ce client ne sait pas former les données d’autorisation (proxy) pour le schéma"
+
+#: WWW/Library/Implementation/HTAABrow.c:1162
+#, c-format
+msgid "Invalid header '%s%s%s%s%s'"
+msgstr "Entête invalide « %s%s%s%s%s »"
+
+# WWW/Libary/Implementation/HTAABrow.c
+#: WWW/Library/Implementation/HTAABrow.c:1266
+msgid "Proxy authorization required -- retrying"
+msgstr "Autorisation du mandataire (proxy) requise - nouvelle tentative"
+
+#: WWW/Library/Implementation/HTAABrow.c:1322
+msgid "Access without authorization denied -- retrying"
+msgstr "Autorisation d’accès refusée - nouvelle tentative"
+
+#: WWW/Library/Implementation/HTAccess.c:698
+msgid "Access forbidden by rule"
+msgstr "Accès interdit par une règle"
+
+# WWW/Libary/Implementation/HTAccess.c
+#: WWW/Library/Implementation/HTAccess.c:800
+msgid "Document with POST content not found in cache. Resubmit?"
+msgstr "Document avec contenu POST non trouvé dans l’antémémoire. Réessayer ?"
+
+#: WWW/Library/Implementation/HTAccess.c:953
+msgid "Loading failed, use a previous copy."
+msgstr "Échec de chargement, utilisation d’une copie précédente."
+
+#: WWW/Library/Implementation/HTAccess.c:1062 src/GridText.c:8939
+msgid "Loading incomplete."
+msgstr "Chargement incomplet."
+
+#: WWW/Library/Implementation/HTAccess.c:1093
+#, c-format
+msgid "**** HTAccess: socket or file number returned by obsolete load routine!\n"
+msgstr "**** HTAccess : socket ou numéro de fichier renvoyé par une routine de chargement obsolète !\n"
+
+#: WWW/Library/Implementation/HTAccess.c:1095
+#, c-format
+msgid "**** HTAccess: Internal software error. Please mail lynx-dev@nongnu.org!\n"
+msgstr "**** HTAccess : Erreur interne. Merci de contacter lynx-dev@nongnu.org !\n"
+
+#: WWW/Library/Implementation/HTAccess.c:1096
+#, c-format
+msgid "**** HTAccess: Status returned was: %d\n"
+msgstr "**** HTAccess : L’état retourné était : %d\n"
+
+#.
+#. * hack: if we fail in HTAccess.c
+#. * avoid duplicating URL, oh.
+#.
+#: WWW/Library/Implementation/HTAccess.c:1102 src/LYMainLoop.c:8076
+msgid "Can't Access"
+msgstr "Accès impossible"
+
+#: WWW/Library/Implementation/HTAccess.c:1110
+msgid "Unable to access document."
+msgstr "Impossible d’accéder au document."
+
+#: WWW/Library/Implementation/HTFTP.c:870
+#, c-format
+msgid "Enter password for user %s@%s:"
+msgstr "Mot de passe de l’utilisateur %s@%s :"
+
+#: WWW/Library/Implementation/HTFTP.c:898
+msgid "Unable to connect to FTP host."
+msgstr "Impossible d’établir une connexion à l’hôte FTP."
+
+#: WWW/Library/Implementation/HTFTP.c:1137
+msgid "close master socket"
+msgstr "ferme le socket maître"
+
+#: WWW/Library/Implementation/HTFTP.c:1195
+msgid "socket for master socket"
+msgstr "slot pour le socket maître"
+
+#: WWW/Library/Implementation/HTFTP.c:2925
+msgid "Receiving FTP directory."
+msgstr "Réception du répertoire FTP."
+
+#: WWW/Library/Implementation/HTFTP.c:3063
+#, c-format
+msgid "Transferred %d bytes (%5d)"
+msgstr "%d octets transférés (%5d)"
+
+#: WWW/Library/Implementation/HTFTP.c:3421
+msgid "connect for data"
+msgstr "connection d’échange de données"
+
+#: WWW/Library/Implementation/HTFTP.c:4098
+msgid "Receiving FTP file."
+msgstr "Réception du fichier FTP."
+
+#: WWW/Library/Implementation/HTFinger.c:274
+msgid "Could not set up finger connection."
+msgstr "Impossible d’établir une connection finger."
+
+#: WWW/Library/Implementation/HTFinger.c:321
+msgid "Could not load data (no sitename in finger URL)"
+msgstr "Impossible de lire les données (pas de nom de site dans l’URL finger)"
+
+#: WWW/Library/Implementation/HTFinger.c:325
+msgid "Invalid port number - will only use port 79!"
+msgstr "Numéro de port invalide - seul le port 79 sera utilisé."
+
+#: WWW/Library/Implementation/HTFinger.c:391
+msgid "Could not access finger host."
+msgstr "Impossible d’atteindre l’hôte finger."
+
+#: WWW/Library/Implementation/HTFinger.c:399
+msgid "No response from finger server."
+msgstr "Pas de réponses du serveur finger."
+
+#: WWW/Library/Implementation/HTNews.c:439
+#, c-format
+msgid "Username for news host '%s':"
+msgstr "Nom d’utilisateur pour l’hôte de forums « %s » :"
+
+#: WWW/Library/Implementation/HTNews.c:492
+msgid "Change username?"
+msgstr "Modifier le nom d’utilisateur ?"
+
+#: WWW/Library/Implementation/HTNews.c:496
+msgid "Username:"
+msgstr "Nom d’utilisateur :"
+
+#: WWW/Library/Implementation/HTNews.c:521
+#, c-format
+msgid "Password for news host '%s':"
+msgstr "Mot de passe pour l’hôte de forums « %s » :"
+
+#: WWW/Library/Implementation/HTNews.c:604
+msgid "Change password?"
+msgstr "Changer le mot de passe ?"
+
+#: WWW/Library/Implementation/HTNews.c:1725
+#, c-format
+msgid "No matches for: %s"
+msgstr "Pas de correspondance pour %s"
+
+#: WWW/Library/Implementation/HTNews.c:1775
+msgid ""
+"\n"
+"No articles in this group.\n"
+msgstr ""
+"\n"
+"Par d’article dans ce groupe.\n"
+
+#: WWW/Library/Implementation/HTNews.c:1787
+msgid ""
+"\n"
+"No articles in this range.\n"
+msgstr ""
+"\n"
+"Pas d’article dans cet intervalle.\n"
+
+#.
+#. * Set window title.
+#.
+#: WWW/Library/Implementation/HTNews.c:1800
+#, c-format
+msgid "%s, Articles %d-%d"
+msgstr "%s, Articles %d-%d"
+
+#: WWW/Library/Implementation/HTNews.c:1823
+msgid "Earlier articles"
+msgstr "Articles anciens"
+
+#: WWW/Library/Implementation/HTNews.c:1836
+#, c-format
+msgid ""
+"\n"
+"There are about %d articles currently available in %s, IDs as follows:\n"
+"\n"
+msgstr ""
+"\n"
+"Il y a environ %d articles accessibles dans %s, les ID suivent :\n"
+"\n"
+
+#: WWW/Library/Implementation/HTNews.c:1898
+msgid "All available articles in "
+msgstr "Tout les articles accessibles dans "
+
+#: WWW/Library/Implementation/HTNews.c:2112
+msgid "Later articles"
+msgstr "Articles récents"
+
+#: WWW/Library/Implementation/HTNews.c:2135
+msgid "Post to "
+msgstr "Postez vers "
+
+#: WWW/Library/Implementation/HTNews.c:2356
+msgid "This client does not contain support for SNEWS URLs."
+msgstr "Ce client ne supporte pas les URLs SNEWS"
+
+#: WWW/Library/Implementation/HTNews.c:2565
+msgid "No target for raw text!"
+msgstr "Aucune cible pour du texte brut !"
+
+#: WWW/Library/Implementation/HTNews.c:2595
+msgid "Connecting to NewsHost ..."
+msgstr "Connection à l’hôte de forums…"
+
+#: WWW/Library/Implementation/HTNews.c:2647
+#, c-format
+msgid "Could not access %s."
+msgstr "Impossible d’accéder à %s."
+
+#: WWW/Library/Implementation/HTNews.c:2753
+#, c-format
+msgid "Can't read news info. News host %.20s responded: %.200s"
+msgstr "Impossible de lire les informations. Le serveur de nouvelles %.20s à répondu : %.200s"
+
+#: WWW/Library/Implementation/HTNews.c:2757
+#, c-format
+msgid "Can't read news info, empty response from host %s"
+msgstr "Impossible de lire les informations, réponse vide de l’hôte %s"
+
+#.
+#. * List available newsgroups. - FM
+#.
+#: WWW/Library/Implementation/HTNews.c:2961
+msgid "Reading list of available newsgroups."
+msgstr "Lecture de la liste des forums disponibles."
+
+#: WWW/Library/Implementation/HTNews.c:2982
+msgid "Reading list of articles in newsgroup."
+msgstr "Lecture de la liste des articles du forum."
+
+#.
+#. * Get an article from a news group. - FM
+#.
+#: WWW/Library/Implementation/HTNews.c:2988
+msgid "Reading news article."
+msgstr "Lecture d’articles de forums."
+
+#: WWW/Library/Implementation/HTNews.c:3018
+msgid "Sorry, could not load requested news."
+msgstr "Désolé, impossible de charger les nouvelles demandées."
+
+#: WWW/Library/Implementation/HTTCP.c:1339
+msgid "Address has invalid port"
+msgstr "L’adresse a un numéro de port non valide"
+
+#: WWW/Library/Implementation/HTTCP.c:1410
+msgid "Address length looks invalid"
+msgstr "La longueur de l’adresse semble invalide"
+
+#: WWW/Library/Implementation/HTTCP.c:1868
+msgid "SOCKS5: no hostname found."
+msgstr "SOCKS5 : pas de nom d'hôte trouvé"
+
+#: WWW/Library/Implementation/HTTCP.c:1874
+msgid "SOCKS5: hostname too long."
+msgstr "SOCKS5 : nom d'hôte trop long"
+
+#: WWW/Library/Implementation/HTTCP.c:1892
+#, c-format
+msgid "(for %s at %s) SOCKS5"
+msgstr "(pour %s à %s) SOCKS5"
+
+#: WWW/Library/Implementation/HTTCP.c:1919
+#: WWW/Library/Implementation/HTTCP.c:1936
+#, c-format
+msgid "Unable to locate remote host %s."
+msgstr "Impossible de localiser l’hôte distant %s."
+
+#. Not HTProgress, so warning won't be overwritten immediately;
+#. * but not HTAlert, because typically there will be other
+#. * alerts from the callers. - kw
+#.
+#: WWW/Library/Implementation/HTTCP.c:1933
+#: WWW/Library/Implementation/HTTelnet.c:115
+#, c-format
+msgid "Invalid hostname %s"
+msgstr "Nom d’hôte %s invalide"
+
+# First %s will be FTP, HTTP or other protocol and second %s will be hostname
+#: WWW/Library/Implementation/HTTCP.c:1945
+#, c-format
+msgid "Making %s connection to %s"
+msgstr "Connexion %s à %s"
+
+#: WWW/Library/Implementation/HTTCP.c:1955
+msgid "socket failed."
+msgstr "échec de socket."
+
+#: WWW/Library/Implementation/HTTCP.c:1969
+#, c-format
+msgid "socket failed: family %d addr %s port %s."
+msgstr "échec de socket : famille %d adresse %s port %s."
+
+#: WWW/Library/Implementation/HTTCP.c:1992
+msgid "Could not make connection non-blocking."
+msgstr "Impossible d’établir une connection non bloquante."
+
+#: WWW/Library/Implementation/HTTCP.c:2058
+msgid "Connection failed (too many retries)."
+msgstr "Échec de connection (trop d’essais successifs)"
+
+#: WWW/Library/Implementation/HTTCP.c:2253
+msgid "Could not restore socket to blocking."
+msgstr "Impossible de rétablir le mode bloquant sur le slot."
+
+# First %s will be FTP, HTTP or other protocol and second %s will be hostname
+#. RFC 1928: CONNECT request
+#: WWW/Library/Implementation/HTTCP.c:2285
+#, c-format
+msgid "SOCKS5: connecting to %s"
+msgstr "SOCKS5 : connexion à %s"
+
+#: WWW/Library/Implementation/HTTCP.c:2314
+msgid "SOCKS server failure"
+msgstr "échec du SOCKS serveur"
+
+#: WWW/Library/Implementation/HTTCP.c:2317
+msgid "connection not allowed by ruleset"
+msgstr "connexion interdit pas les règles"
+
+#: WWW/Library/Implementation/HTTCP.c:2320
+msgid "network unreachable"
+msgstr "réseau introuvable"
+
+#: WWW/Library/Implementation/HTTCP.c:2323
+msgid "host unreachable"
+msgstr "hôte introuvable"
+
+#: WWW/Library/Implementation/HTTCP.c:2326
+msgid "connection refused"
+msgstr "Connexion refusée"
+
+#: WWW/Library/Implementation/HTTCP.c:2329
+msgid "TTL expired"
+msgstr "TTL expiré"
+
+#: WWW/Library/Implementation/HTTCP.c:2332
+msgid "command not supported"
+msgstr "Commande non supporté"
+
+#: WWW/Library/Implementation/HTTCP.c:2335
+msgid "address type not supported"
+msgstr "type d'adresse non supporté"
+
+#: WWW/Library/Implementation/HTTCP.c:2338
+msgid "unknown SOCKS error code"
+msgstr "code d'erreur SOCKS inconnu"
+
+#: WWW/Library/Implementation/HTTCP.c:2383
+msgid "unexpected reply\n"
+msgstr "réponse inattendue\n"
+
+#: WWW/Library/Implementation/HTTCP.c:2460
+msgid "Socket read failed (too many tries)."
+msgstr "Échec de lecture réseau (trop d’essais)."
+
+#: WWW/Library/Implementation/HTTP.c:165
+#, c-format
+msgid "SSL callback:%s, preverify_ok=%d, ssl_okay=%d"
+msgstr "retour d’appel SSL : %s, preverify_ok=%d, ssl_okay=%d"
+
+#: WWW/Library/Implementation/HTTP.c:668
+#, c-format
+msgid "User/password contains only punctuation: %s"
+msgstr "L’utilisateur ou le mot de passe contient seulement la ponctuation : %s"
+
+#: WWW/Library/Implementation/HTTP.c:672
+#, c-format
+msgid "User/password may be confused with hostname: '%s' (e.g, '%s')"
+msgstr "L’utilisateur ou le mot de passe peut être confondu avec l’hôte : « %s » (par ex. « %s »)"
+
+#: WWW/Library/Implementation/HTTP.c:733
+#, c-format
+msgid "Certificate issued by: %s"
+msgstr "Certificat émis par: %s"
+
+#: WWW/Library/Implementation/HTTP.c:922
+msgid "This client does not contain support for HTTPS URLs."
+msgstr "Ce client n’est pas conçu pour traiter les URL HTTPS."
+
+#: WWW/Library/Implementation/HTTP.c:947
+msgid "Unable to connect to remote host."
+msgstr "Impossible d’établir une connexion à l’hôte distant."
+
+# First %s will be FTP, HTTP or other protocol and second %s will be hostname
+#: WWW/Library/Implementation/HTTP.c:990
+msgid "Retrying connection without TLS."
+msgstr "Tentative de reconnection sans TLS."
+
+#: WWW/Library/Implementation/HTTP.c:1042
+msgid "GnuTLS error when trying to verify certificate."
+msgstr "Erreur GnuTLS lors de la tentative de vérification du certificat."
+
+#: WWW/Library/Implementation/HTTP.c:1055
+msgid "the certificate has no known issuer"
+msgstr "le certificat n’a pas d’émetteur connu"
+
+#: WWW/Library/Implementation/HTTP.c:1057
+msgid "no issuer was found"
+msgstr "l’émetteur n’a pas été trouvé"
+
+#: WWW/Library/Implementation/HTTP.c:1059
+msgid "issuer is not a CA"
+msgstr "l’émetteur n’est pas une autorité CA"
+
+#: WWW/Library/Implementation/HTTP.c:1061
+msgid "the certificate has been revoked"
+msgstr "le certificat a été révoqué"
+
+#: WWW/Library/Implementation/HTTP.c:1063
+msgid "the certificate is not trusted"
+msgstr "le certificat n’est pas approuvé"
+
+#: WWW/Library/Implementation/HTTP.c:1138
+#, c-format
+msgid "Verified connection to %s (cert=%s)"
+msgstr "Connection vérifiée à %s (cert=%s)"
+
+#: WWW/Library/Implementation/HTTP.c:1188
+#: WWW/Library/Implementation/HTTP.c:1230
+#, c-format
+msgid "Verified connection to %s (subj=%s)"
+msgstr "Connection vérifiée à %s (sujet=%s)"
+
+#: WWW/Library/Implementation/HTTP.c:1260
+msgid "Can't find common name in certificate"
+msgstr "Impossible de trouver le nom usuel dans le certificat"
+
+#: WWW/Library/Implementation/HTTP.c:1263
+#, c-format
+msgid "SSL error:host(%s)!=cert(%s)-Continue?"
+msgstr "erreur SSL : hôte (%s) != cert(%s) - Continuer ?"
+
+#: WWW/Library/Implementation/HTTP.c:1270
+msgid "SSL error"
+msgstr "Erreur SSL"
+
+#: WWW/Library/Implementation/HTTP.c:1278
+#, c-format
+msgid "UNVERIFIED connection to %s (cert=%s)"
+msgstr "Connection NON vérifiée à %s (cert=%s)"
+
+#: WWW/Library/Implementation/HTTP.c:1287
+#, c-format
+msgid "Secure %d-bit %s (%s) HTTP connection"
+msgstr "Connection HTTP sécurisée %d-bit %s (%s)"
+
+#: WWW/Library/Implementation/HTTP.c:1757
+msgid "Sending HTTP request."
+msgstr "Envoi de la requête HTTP."
+
+#: WWW/Library/Implementation/HTTP.c:1799
+msgid "Unexpected network write error; connection aborted."
+msgstr "Erreur d’écriture réseau inattendue : connection interrompue."
+
+#: WWW/Library/Implementation/HTTP.c:1805
+msgid "HTTP request sent; waiting for response."
+msgstr "Requête HTTP envoyée. Attente de réponse."
+
+# END of Permit FORM
+# More progress strings follow
+#: WWW/Library/Implementation/HTTP.c:1878
+#: WWW/Library/Implementation/HTTP.c:1888
+msgid "Unexpected network read error; connection aborted."
+msgstr "Erreur de lecture inattendue ; connexion interrompue."
+
+#.
+#. * HTTP/1.1 Informational statuses.
+#. * 100 Continue.
+#. * 101 Switching Protocols.
+#. * > 101 is unknown.
+#. * We should never get these, and they have only the status
+#. * line and possibly other headers, so we'll deal with them by
+#. * showing the full header to the user as text/plain. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2091
+msgid "Got unexpected Informational Status."
+msgstr "Réception d’information de statut inattendue."
+
+#.
+#. * Reset Content. The server has fulfilled the request but
+#. * nothing is returned and we should reset any form
+#. * content. We'll instruct the user to do that, and
+#. * restore the current document. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2125
+msgid "Request fulfilled. Reset Content."
+msgstr "Requête complétée. Restauration du contenu."
+
+#. Not Modified
+#.
+#. * We didn't send an "If-Modified-Since" header, so this
+#. * status is inappropriate. We'll deal with it by showing
+#. * the full header to the user as text/plain. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2242
+msgid "Got unexpected 304 Not Modified status."
+msgstr "Réception inattendue : 304 État Non Modifié."
+
+#: WWW/Library/Implementation/HTTP.c:2305
+msgid "Redirection of POST content requires user approval."
+msgstr "La redirection d’un contenu POST nécessite l’accord de l’utilisateur."
+
+#: WWW/Library/Implementation/HTTP.c:2320
+msgid "Have POST content. Treating Permanent Redirection as Temporary.\n"
+msgstr "Contenu POST. La redirection permanente est traitée comme temporaire.\n"
+
+#: WWW/Library/Implementation/HTTP.c:2366
+msgid "Retrying with access authorization information."
+msgstr "Nouvel essai avec information d’autorisation d’accès."
+
+#: WWW/Library/Implementation/HTTP.c:2378
+msgid "Show the 401 message body?"
+msgstr "Visualiser le corps du message 401 ?"
+
+#: WWW/Library/Implementation/HTTP.c:2422
+msgid "Show the 407 message body?"
+msgstr "Afficher le corps du message 407 ?"
+
+#.
+#. * Bad or unknown server_status number. Take a chance and hope
+#. * there is something to display. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2522
+msgid "Unknown status reply from server!"
+msgstr "Réponse d’état inconnue reçue du serveur !"
+
+#: WWW/Library/Implementation/HTTelnet.c:113
+#, c-format
+msgid "remote %s session:"
+msgstr "session distante %s :"
+
+#: WWW/Library/Implementation/HTWAIS.c:163
+msgid "Could not connect to WAIS server."
+msgstr "Connection au serveur WAIS impossible."
+
+#: WWW/Library/Implementation/HTWAIS.c:171
+msgid "Could not open WAIS connection for reading."
+msgstr "Impossible d’ouvrir une connection WAIS en lecture."
+
+#: WWW/Library/Implementation/HTWAIS.c:193
+msgid "Diagnostic code is "
+msgstr "Le code de diagnostic est "
+
+#: WWW/Library/Implementation/HTWAIS.c:460
+msgid "Index "
+msgstr "Index "
+
+#: WWW/Library/Implementation/HTWAIS.c:464
+#, c-format
+msgid " contains the following %d item%s relevant to \""
+msgstr " contient les %d éléments suivants %s relatifs à \""
+
+#: WWW/Library/Implementation/HTWAIS.c:472
+msgid "The first figure after each entry is its relative score, "
+msgstr "La première mention après chaque entrée est son score relatif"
+
+#: WWW/Library/Implementation/HTWAIS.c:473
+msgid "the second is the number of lines in the item."
+msgstr "la seconde est le nombre de ligne dans l’élément."
+
+#: WWW/Library/Implementation/HTWAIS.c:515
+msgid " (bad file name)"
+msgstr "(mauvais nom de fichier)"
+
+#: WWW/Library/Implementation/HTWAIS.c:541
+msgid "(bad doc id)"
+msgstr "(mauvais id de doc)"
+
+#: WWW/Library/Implementation/HTWAIS.c:557
+msgid "(Short Header record, can't display)"
+msgstr "(enregistrement d’entête abrégé, impossible d’afficher)"
+
+#: WWW/Library/Implementation/HTWAIS.c:564
+msgid ""
+"\n"
+"Long Header record, can't display\n"
+msgstr ""
+"\n"
+"enregistrement d’entête long, impossible d’afficher\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:571
+msgid ""
+"\n"
+"Text record\n"
+msgstr ""
+"\n"
+"Enregistrement de texte\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:580
+msgid ""
+"\n"
+"Headline record, can't display\n"
+msgstr ""
+"\n"
+"Enregistrement d’entête, affichage impossible\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:588
+msgid ""
+"\n"
+"Code record, can't display\n"
+msgstr ""
+"\n"
+"Enregistrement du code, affichage impossible\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:692
+msgid "Syntax error in WAIS URL"
+msgstr "Erreur de syntaxe dans l’URL WAIS"
+
+#: WWW/Library/Implementation/HTWAIS.c:764
+msgid " (WAIS Index)"
+msgstr " (Index WAIS) "
+
+#: WWW/Library/Implementation/HTWAIS.c:771
+msgid "WAIS Index: "
+msgstr "Index WAIS : "
+
+#: WWW/Library/Implementation/HTWAIS.c:777
+msgid "This is a link for searching the "
+msgstr "Ceci est un lien pour chercher l’ "
+
+#: WWW/Library/Implementation/HTWAIS.c:781
+msgid " WAIS Index.\n"
+msgstr "index WAIS.\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:810
+msgid ""
+"\n"
+"Enter the 's'earch command and then specify search words.\n"
+msgstr ""
+"\n"
+"Entrez la commande de recherche <s> puis les mots à rechercher.\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:832
+msgid " (in "
+msgstr " (dans "
+
+#: WWW/Library/Implementation/HTWAIS.c:841
+msgid "WAIS Search of \""
+msgstr "Recherche WAIS de \""
+
+#: WWW/Library/Implementation/HTWAIS.c:845
+msgid "\" in: "
+msgstr "\" dans : "
+
+#: WWW/Library/Implementation/HTWAIS.c:860
+msgid "HTWAIS: Request too large."
+msgstr "HTWAIS : requête trop grande."
+
+#: WWW/Library/Implementation/HTWAIS.c:869
+msgid "Searching WAIS database..."
+msgstr "Recherche dans la base de donnée WAIS…"
+
+#: WWW/Library/Implementation/HTWAIS.c:879
+msgid "Search interrupted."
+msgstr "Recherche interrompue."
+
+#: WWW/Library/Implementation/HTWAIS.c:930
+msgid "Can't convert format of WAIS document"
+msgstr "Impossible de convertir le format du document WAIS"
+
+#: WWW/Library/Implementation/HTWAIS.c:974
+msgid "HTWAIS: Request too long."
+msgstr "HTWAIS : requête trop longue."
+
+#.
+#. * Actually do the transaction given by request_message.
+#.
+#: WWW/Library/Implementation/HTWAIS.c:988
+msgid "Fetching WAIS document..."
+msgstr "Rapatriement du document WAIS…"
+
+#. display_search_response(target, retrieval_response,
+#. wais_database, keywords);
+#: WWW/Library/Implementation/HTWAIS.c:1027
+msgid "No text was returned!\n"
+msgstr "Aucun texte n’a été retourné !\n"
+
+#: WWW/Library/Implementation/HTWSRC.c:302
+msgid " NOT GIVEN in source file; "
+msgstr "NON donné dans le fichier source ;"
+
+#: WWW/Library/Implementation/HTWSRC.c:325
+msgid " WAIS source file"
+msgstr "fichier source WAIS"
+
+#: WWW/Library/Implementation/HTWSRC.c:332
+msgid " description"
+msgstr " description"
+
+#: WWW/Library/Implementation/HTWSRC.c:342
+msgid "Access links"
+msgstr "Accès aux liens"
+
+#: WWW/Library/Implementation/HTWSRC.c:363
+msgid "Direct access"
+msgstr "Accès direct"
+
+#. * Proxy will be used if defined, so let user know that - FM *
+#: WWW/Library/Implementation/HTWSRC.c:366
+msgid " (or via proxy server, if defined)"
+msgstr " (ou via un serveur mandataire proxy, si défini)"
+
+#: WWW/Library/Implementation/HTWSRC.c:381
+msgid "Maintainer"
+msgstr "Mainteneur"
+
+#: WWW/Library/Implementation/HTWSRC.c:389
+msgid "Host"
+msgstr "Hôte"
+
+# src/GridText.c
+#: src/GridText.c:723
+msgid "Memory exhausted, display interrupted!"
+msgstr "Mémoire insuffisante ; interruption de l’affichage."
+
+#: src/GridText.c:728
+msgid "Memory exhausted, will interrupt transfer!"
+msgstr "Mémoire saturée, interruption du transfert !"
+
+#: src/GridText.c:1719
+#, c-format
+msgid " (l%d of %d)"
+msgstr " (l%d sur %d)"
+
+#: src/GridText.c:1728
+#, c-format
+msgid " (p%d of %d)"
+msgstr " (p%d sur %d)"
+
+#: src/GridText.c:3720
+msgid " *** MEMORY EXHAUSTED ***"
+msgstr " *** MÉMOIRE INSUFFISANTE ***"
+
+#: src/GridText.c:6220
+msgid "text entry field"
+msgstr "champ de saisie texte"
+
+#: src/GridText.c:6223
+msgid "password entry field"
+msgstr "champ d’entrée du mot de passe"
+
+#: src/GridText.c:6226
+msgid "checkbox"
+msgstr "case à cocher"
+
+#: src/GridText.c:6229
+msgid "radio button"
+msgstr "bouton d’option"
+
+#: src/GridText.c:6232
+msgid "submit button"
+msgstr "bouton Envoyer"
+
+#: src/GridText.c:6235
+msgid "reset button"
+msgstr "bouton RAZ"
+
+#: src/GridText.c:6238
+msgid "script button"
+msgstr "bouton script"
+
+#: src/GridText.c:6241
+msgid "popup menu"
+msgstr "menu popup"
+
+#: src/GridText.c:6244
+msgid "hidden form field"
+msgstr "champ de formulaire caché"
+
+#: src/GridText.c:6247
+msgid "text entry area"
+msgstr "zone saisie de texte"
+
+#: src/GridText.c:6250
+msgid "range entry field"
+msgstr "champ de saisie (intervalle)"
+
+#: src/GridText.c:6253
+msgid "file entry field"
+msgstr "champ de saisie (fichier)"
+
+#: src/GridText.c:6256
+msgid "text-submit field"
+msgstr "champ d’envoi (texte)"
+
+#: src/GridText.c:6259
+msgid "image-submit button"
+msgstr "bouton d’envoi (image)"
+
+#: src/GridText.c:6262
+msgid "keygen field"
+msgstr "champ keygen"
+
+#: src/GridText.c:6265
+msgid "unknown form field"
+msgstr "champ de formulaire inconnu"
+
+#: src/GridText.c:6285 src/GridText.c:6292 src/LYList.c:249
+msgid "unknown field or link"
+msgstr "champ ou lien inconnu"
+
+# WWW/Libary/Implementation/HTFile.c
+#: src/GridText.c:10722
+msgid "Can't open file for uploading"
+msgstr "Impossible d’ouvrir le fichier pour envoi."
+
+#: src/GridText.c:11910
+#, c-format
+msgid "Submitting %s"
+msgstr "Envoi de %s"
+
+#. ugliness has happened; inform user and do the best we can
+#: src/GridText.c:12980
+msgid "Hang Detect: TextAnchor struct corrupted - suggest aborting!"
+msgstr "Problème détecté : structure TextAnchor corrompue - abandon suggéré !"
+
+#. don't show previous state
+#: src/GridText.c:13139
+msgid "Wrap lines to fit displayed area?"
+msgstr "Couper les lignes pour remplir la zone d’affichage ?"
+
+#: src/GridText.c:13772
+msgid "Very long lines have been truncated!"
+msgstr "Les très longues lignes ont été tronquées !"
+
+#: src/HTAlert.c:164 src/LYShowInfo.c:389 src/LYShowInfo.c:393
+msgid "bytes"
+msgstr "octets"
+
+# WWW/Library/Implementation/HTFormat.c
+#.
+#. * If we know the total size of the file, we can compute
+#. * a percentage, and show a corresponding progress bar.
+#.
+#: src/HTAlert.c:328 src/HTAlert.c:354
+#, c-format
+msgid "Read %s of data"
+msgstr "Données lues : %s"
+
+#: src/HTAlert.c:351
+#, c-format
+msgid "Read %s of %s of data"
+msgstr "Données lues : %s de %s"
+
+#: src/HTAlert.c:360
+#, c-format
+msgid ", %s/sec"
+msgstr ", %s/sec"
+
+#: src/HTAlert.c:374
+#, c-format
+msgid " (stalled for %s)"
+msgstr " (bloqué pour %s)"
+
+#: src/HTAlert.c:378
+#, c-format
+msgid ", ETA %s"
+msgstr ", temps estimé ETA : %s"
+
+#: src/HTAlert.c:400
+msgid " (Press 'z' to abort)"
+msgstr " (Pressez <z> pour annuler)"
+
+#. Meta-note: don't move the following note from its place right
+#. in front of the first gettext(). As it is now, it should
+#. automatically appear in generated lynx.pot files. - kw
+#.
+#. NOTE TO TRANSLATORS: If you provide a translation for "yes", lynx
+#. * will take the first byte of the translation as a positive response
+#. * to Yes/No questions. If you provide a translation for "no", lynx
+#. * will take the first byte of the translation as a negative response
+#. * to Yes/No questions. For both, lynx will also try to show the
+#. * first byte in the prompt as a character, instead of (y) or (n),
+#. * respectively. This will not work right for multibyte charsets!
+#. * Don't translate "yes" and "no" for CJK character sets (or translate
+#. * them to "yes" and "no"). For a translation using UTF-8, don't
+#. * translate if the translation would begin with anything but a 7-bit
+#. * (US_ASCII) character. That also means do not translate if the
+#. * translation would begin with anything but a 7-bit character, if
+#. * you use a single-byte character encoding (a charset like ISO-8859-n)
+#. * but anticipate that the message catalog may be used re-encoded in
+#. * UTF-8 form.
+#. * For translations using other character sets, you may also wish to
+#. * leave "yes" and "no" untranslated, if using (y) and (n) is the
+#. * preferred behavior.
+#. * Lynx will also accept y Y n N as responses unless there is a conflict
+#. * with the first letter of the "yes" or "no" translation.
+#.
+#: src/HTAlert.c:438 src/HTAlert.c:486
+msgid "yes"
+msgstr "oui"
+
+#: src/HTAlert.c:441 src/HTAlert.c:487
+msgid "no"
+msgstr "non"
+
+#.
+#. * Special-purpose workaround for gettext support (we should do
+#. * this in a more general way) -TD
+#. *
+#. * NOTE TO TRANSLATORS: If the prompt has been rendered into
+#. * another language, and if yes/no are distinct, assume the
+#. * translator can make an ordered list in parentheses with one
+#. * capital letter for each as we assumed in HTConfirmDefault().
+#. * The list has to be in the same order as in the original message,
+#. * and the four capital letters chosen to not match those in the
+#. * original unless they have the same position.
+#. *
+#. * Example:
+#. * (Y/N/Always/neVer) - English (original)
+#. * (O/N/Toujours/Jamais) - French
+#.
+#: src/HTAlert.c:938
+msgid "Y/N/A/V"
+msgstr "O/N/T/J"
+
+#: src/HTML.c:5769
+msgid "Description:"
+msgstr "Description :"
+
+#: src/HTML.c:5774
+msgid "(none)"
+msgstr "(aucun(e))"
+
+#: src/HTML.c:5778
+msgid "Filepath:"
+msgstr "Chemin de fichier :"
+
+#: src/HTML.c:5784
+msgid "(unknown)"
+msgstr "(inconnu)"
+
+#: src/HTML.c:7224
+msgid "Document has only hidden links. Use the 'l'ist command."
+msgstr "Le document ne contient que des liens cachés. Utiliser la commande <l> (Liste)."
+
+#: src/HTML.c:7725
+msgid "Source cache error - disk full?"
+msgstr "Erreur de cache - disque plein ?"
+
+#: src/HTML.c:7738
+msgid "Source cache error - not enough memory!"
+msgstr "Erreur de cache - pas assez de mémoire !"
+
+#: src/LYBookmark.c:167
+msgid ""
+" This file is an HTML representation of the X Mosaic hotlist file.\n"
+" Outdated or invalid links may be removed by using the\n"
+" remove bookmark command, it is usually the 'R' key but may have\n"
+" been remapped by you or your system administrator."
+msgstr ""
+" Ce fichier est une représentation HTML du fichier de signets de X Mosaic.\n"
+" Les liens désuets ou non valides peuvent être supprimés au moyen de la\n"
+" commande de suppression de signet, habituellement la touche <R> mais les\n"
+" touches peuvent avoir été reconfigurées par vous ou l’administrateur système."
+
+#: src/LYBookmark.c:380
+#, c-format
+msgid ""
+" You can delete links by the 'R' key<br>\n"
+"<ol>\n"
+msgstr ""
+" Vous pouvez effacer des liens avec la touche <R><br>\n"
+"<ol>\n"
+
+#: src/LYBookmark.c:383
+msgid ""
+" You can delete links using the remove bookmark command. It is usually\n"
+" the 'R' key but may have been remapped by you or your system\n"
+" administrator."
+msgstr ""
+" Vous pouvez supprimer des liens avec la commande de suppression de signet,\n"
+" habituellement la touche <R> mais les touches peuvent avoir été\n"
+" reconfigurées par vous ou par votre administrateur système."
+
+#: src/LYBookmark.c:387
+msgid ""
+" This file also may be edited with a standard text editor to delete\n"
+" outdated or invalid links, or to change their order."
+msgstr ""
+" Le fichier peut aussi être édité au moyen d’un éditeur de texte standard.\n"
+" Vous pouvez supprimer les liens désuets/non valides ou modifier l’ordre."
+
+#: src/LYBookmark.c:390
+msgid ""
+"Note: if you edit this file manually\n"
+" you should not change the format within the lines\n"
+" or add other HTML markup.\n"
+" Make sure any bookmark link is saved as a single line."
+msgstr ""
+"Note : si vous éditez ce fichier, ne changez\n"
+" pas la structure des lignes et n’\n"
+" ajoutez pas de balise HTML.\n"
+" Soyez sûr que chaque signet est sur une seule ligne."
+
+#: src/LYBookmark.c:686
+#, c-format
+msgid "File may be recoverable from %s during this session"
+msgstr "Le fichier pourrait être récupérable depuis %s lors de cette session"
+
+#: src/LYCgi.c:161
+#, c-format
+msgid "Do you want to execute \"%s\"?"
+msgstr "Voulez-vous exécuter « %s » ?"
+
+#.
+#. * Neither the path as given nor any components examined by backing up
+#. * were stat()able. - kw
+#.
+#: src/LYCgi.c:276
+msgid "Unable to access cgi script"
+msgstr "Impossible d’accéder au script cgi"
+
+#: src/LYCgi.c:709 src/LYCgi.c:712
+msgid "Good Advice"
+msgstr "Bon conseil"
+
+#: src/LYCgi.c:716
+msgid "An excellent http server for VMS is available via"
+msgstr "Un excellent serveur http pour VMS est disponible via"
+
+#: src/LYCgi.c:723
+msgid "this link"
+msgstr "ce lien"
+
+#: src/LYCgi.c:727
+msgid "It provides state of the art CGI script support.\n"
+msgstr "Il offre un soutien <b>hors pair</b> pour les scripts CGI.\n"
+
+#: src/LYClean.c:115
+msgid "Exiting via interrupt:"
+msgstr "Sortie par interruption :"
+
+#: src/LYCookie.c:2651
+msgid "(from a previous session)"
+msgstr "(d’une session précédente)"
+
+#: src/LYCookie.c:2712
+msgid "Maximum Gobble Date:"
+msgstr "Date d’obtention maximale :"
+
+#: src/LYCookie.c:2751
+msgid "Internal"
+msgstr "Interne"
+
+#: src/LYCookie.c:2752
+msgid "cookie_domain_flag_set error, aborting program"
+msgstr "erreur cookie_domain_flag_set, fin du programme"
+
+#: src/LYCurses.c:1136
+msgid "Terminal reinitialisation failed - unknown terminal type?"
+msgstr "Défaut de reinitialisation du terminal ; type de terminal inconnu ?"
+
+#: src/LYCurses.c:1343
+msgid "Terminal initialisation failed - unknown terminal type?"
+msgstr "Défaut d’initialisation du terminal ; type de terminal inconnu ?"
+
+#: src/LYCurses.c:1837
+msgid "Terminal ="
+msgstr "Terminal ="
+
+#: src/LYCurses.c:1841
+msgid "You must use a vt100, 200, etc. terminal with this program."
+msgstr "Il faut utiliser un terminal vt100, 200, etc. avec ce programme."
+
+#: src/LYCurses.c:1890
+msgid "Your Terminal type is unknown!"
+msgstr "Votre type de terminal n’est pas reconnu."
+
+#: src/LYCurses.c:1891
+msgid "Enter a terminal type:"
+msgstr "Entrez un type de terminal :"
+
+#: src/LYCurses.c:1905
+msgid "TERMINAL TYPE IS SET TO"
+msgstr "TYPE DE TERMINAL RÉGLÉ À"
+
+#: src/LYCurses.c:2464
+#, c-format
+msgid ""
+"\n"
+"A Fatal error has occurred in %s Ver. %s\n"
+msgstr ""
+"\n"
+"Une erreur fatale s’est produite dans %s Ver. %s\n"
+
+#: src/LYCurses.c:2467
+#, c-format
+msgid ""
+"\n"
+"Please notify your system administrator to confirm a bug, and if\n"
+"confirmed, to notify the lynx-dev list. Bug reports should have concise\n"
+"descriptions of the command and/or URL which causes the problem, the\n"
+"operating system name with version number, the TCPIP implementation, the\n"
+"TRACEBACK if it can be captured, and any other relevant information.\n"
+msgstr ""
+"\n"
+"Merci de prévenir votre administrateur système pour confirmer un bug.\n"
+"Si le bug est confirmé, merci de prévenir la liste de diffusion lynx-dev.\n"
+"Les rapports de bugs devraient être des descriptions concises de la\n"
+"commande et/ou de l’URL en cause, précisant le système d’exploitation\n"
+"et sa version, l’implémentation TCP/IP, le TRACEBACK si il a pu être\n"
+"capturé ainsi que toute information pouvant s’avérer utile.\n"
+
+#: src/LYEdit.c:272
+#, c-format
+msgid "Error starting editor, %s"
+msgstr "Erreur en lançant l’éditeur, %s"
+
+#: src/LYEdit.c:275
+msgid "Editor killed by signal"
+msgstr "Éditeur interrompu par signal"
+
+#: src/LYEdit.c:280
+#, c-format
+msgid "Editor returned with error status %s"
+msgstr "L’éditeur a retourné un code d’erreur %s"
+
+#: src/LYDownload.c:511
+msgid "Downloaded link:"
+msgstr "Lien téléchargé :"
+
+#: src/LYDownload.c:516
+msgid "Suggested file name:"
+msgstr "Nom de fichier suggéré :"
+
+#: src/LYDownload.c:521
+msgid "Standard download options:"
+msgstr "Options standard de téléchargement :"
+
+#: src/LYDownload.c:522
+msgid "Download options:"
+msgstr "Options de téléchargement :"
+
+#: src/LYDownload.c:538
+msgid "Save to disk"
+msgstr "Enregistrement sur disque"
+
+#: src/LYDownload.c:552
+msgid "View temporary file"
+msgstr "Voir le fichier temporaire"
+
+#: src/LYDownload.c:559
+msgid "Save to disk disabled."
+msgstr "Enregistrement sur disque désactivé."
+
+#: src/LYDownload.c:563 src/LYPrint.c:1331
+msgid "Local additions:"
+msgstr "Ajouts locaux :"
+
+#: src/LYDownload.c:574 src/LYUpload.c:206
+msgid "No Name Given"
+msgstr "Aucun nom donné"
+
+#: src/LYHistory.c:673
+msgid "You selected:"
+msgstr "Vous avez choisi :"
+
+#: src/LYHistory.c:697 src/LYHistory.c:926
+msgid "(no address)"
+msgstr "(aucune adresse)"
+
+#: src/LYHistory.c:701
+msgid " (internal)"
+msgstr " (interne)"
+
+#: src/LYHistory.c:703
+msgid " (was internal)"
+msgstr " (était interne)"
+
+#: src/LYHistory.c:801
+msgid " (From History)"
+msgstr " (de l’historique)"
+
+#: src/LYHistory.c:846
+msgid "You visited (POSTs, bookmark, menu and list files excluded):"
+msgstr "Vous avez consulté (données POST, références et signets exclus) :"
+
+#: src/LYHistory.c:1148
+msgid "(No messages yet)"
+msgstr "(Pas encore de message)"
+
+#: src/LYLeaks.c:222
+msgid "Invalid pointer detected."
+msgstr "Pointeur non valide détecté."
+
+#: src/LYLeaks.c:224 src/LYLeaks.c:262
+msgid "Sequence:"
+msgstr "Séquence :"
+
+#: src/LYLeaks.c:227 src/LYLeaks.c:265
+msgid "Pointer:"
+msgstr "Pointeur :"
+
+#: src/LYLeaks.c:236 src/LYLeaks.c:243 src/LYLeaks.c:284
+msgid "FileName:"
+msgstr "Nom de fichier :"
+
+#: src/LYLeaks.c:239 src/LYLeaks.c:246 src/LYLeaks.c:287 src/LYLeaks.c:298
+msgid "LineCount:"
+msgstr "Nombre de lignes :"
+
+#: src/LYLeaks.c:260
+msgid "Memory leak detected."
+msgstr "Fuite de mémoire détectée."
+
+#: src/LYLeaks.c:268
+msgid "Contains:"
+msgstr "Contient :"
+
+#: src/LYLeaks.c:281
+msgid "ByteSize:"
+msgstr "Taille (octets) :"
+
+#: src/LYLeaks.c:295
+msgid "realloced:"
+msgstr "réallouée(s) :"
+
+#: src/LYLeaks.c:316
+msgid "Total memory leakage this run:"
+msgstr "Total de fuites de mémoire pour cette exécution :"
+
+#: src/LYLeaks.c:320
+msgid "Peak allocation"
+msgstr "Pic d’allocation mémoire"
+
+#: src/LYLeaks.c:322
+msgid "Bytes allocated"
+msgstr "Octets alloués"
+
+#: src/LYLeaks.c:324
+msgid "Total mallocs"
+msgstr "Total des allocations"
+
+#: src/LYLeaks.c:326
+msgid "Total frees"
+msgstr "Total des libérations"
+
+#: src/LYList.c:89
+msgid "References in "
+msgstr "Références dans"
+
+#: src/LYList.c:92
+msgid "this document:"
+msgstr "ce document :"
+
+#: src/LYList.c:98 src/LYList.c:363
+msgid "Visible links:"
+msgstr "Liens visibles :"
+
+#: src/LYList.c:202 src/LYList.c:322
+msgid "Hidden links:"
+msgstr "Liens cachés :"
+
+#: src/LYList.c:359
+msgid "References"
+msgstr "Références"
+
+#: src/LYLocal.c:289
+#, c-format
+msgid "Unable to get status of '%s'."
+msgstr "Impossible d’obtenir l’état de « %s »."
+
+#: src/LYLocal.c:354
+msgid "The selected item is not a file or a directory! Request ignored."
+msgstr "L’élément sélectionné n’est ni un fichier ni un répertoire ! Requête ignorée."
+
+#: src/LYLocal.c:456
+#, c-format
+msgid "Unable to %s due to system error!"
+msgstr "Opération (%s) impossible suite à une erreur système !"
+
+#: src/LYLocal.c:490
+#, c-format
+msgid "Probable failure to %s due to system error!"
+msgstr "Échec de %s dû probablement à une erreur système."
+
+#: src/LYLocal.c:555 src/LYLocal.c:578
+#, c-format
+msgid "remove %s"
+msgstr "destruction de %s"
+
+#: src/LYLocal.c:598
+#, c-format
+msgid "touch %s"
+msgstr "%s atteint"
+
+#: src/LYLocal.c:628
+#, c-format
+msgid "move %s to %s"
+msgstr "déplacement de %s vers %s"
+
+#: src/LYLocal.c:676
+msgid "There is already a directory with that name! Request ignored."
+msgstr "Le répertoire existe déjà. Requête ignorée."
+
+#: src/LYLocal.c:678
+msgid "There is already a file with that name! Request ignored."
+msgstr "Ce fichier existe déjà. Requête ignorée."
+
+#: src/LYLocal.c:680
+msgid "The specified name is already in use! Request ignored."
+msgstr "Ce nom est déjà utilisé. Requête ignorée."
+
+#: src/LYLocal.c:692
+msgid "Destination has different owner! Request denied."
+msgstr "Destination possédée par un autre propriétaire. Requête ignorée."
+
+#: src/LYLocal.c:695
+msgid "Destination is not a valid directory! Request denied."
+msgstr "La destination n’est pas un répertoire valide. Requête ignorée."
+
+#: src/LYLocal.c:711
+msgid "Source and destination are the same location! Request ignored!"
+msgstr "La source et la destination sont similaires. Requête ignorée."
+
+#: src/LYLocal.c:735
+msgid "Remove all tagged files and directories?"
+msgstr "Détruire tous les répertoires et fichiers marqués ?"
+
+#: src/LYLocal.c:808
+msgid "Enter new location for tagged items: "
+msgstr "Entrer un nouvel emplacement pour éléments marqués : "
+
+#: src/LYLocal.c:906
+msgid "Enter new name for directory: "
+msgstr "Entrer un nouveau nom pour le répertoire : "
+
+#: src/LYLocal.c:908
+msgid "Enter new name for file: "
+msgstr "Entrer un nouveau nom pour le fichier : "
+
+#: src/LYLocal.c:920
+msgid "Illegal character (path-separator) found! Request ignored."
+msgstr "Caractère séparateur de fichier illégal ; demande non traitée."
+
+#: src/LYLocal.c:970
+msgid "Enter new location for directory: "
+msgstr "Entrez le nouvel emplacement du répertoire : "
+
+#: src/LYLocal.c:972
+msgid "Enter new location for file: "
+msgstr "Entrez la nouvelle localisation du fichier :"
+
+#: src/LYLocal.c:999
+msgid "Unexpected failure - unable to find trailing path separator"
+msgstr "Échec. Impossible de trouver les séparateurs dans le chemin"
+
+#: src/LYLocal.c:1061
+msgid "Modify name, location, or permission (n, l, or p): "
+msgstr "Modifier nom, emplacement ou permission (n, l ou p) : "
+
+#: src/LYLocal.c:1063
+msgid "Modify name or location (n or l): "
+msgstr "Modifier le nom ou l’emplacement (n ou l) : "
+
+#.
+#. * Code for changing ownership needed here.
+#.
+#: src/LYLocal.c:1092
+msgid "This feature not yet implemented!"
+msgstr "Fonctionnalité non encore disponible !"
+
+#: src/LYLocal.c:1113
+msgid "Enter name of file to create: "
+msgstr "Entrez le nom du fichier à créer : "
+
+#: src/LYLocal.c:1116 src/LYLocal.c:1153
+msgid "Illegal redirection \"//\" found! Request ignored."
+msgstr "Réacheminement « // » non autorisé ; demande non traitée."
+
+#: src/LYLocal.c:1150
+msgid "Enter name for new directory: "
+msgstr "Entrer le nom du nouveau répertoire : "
+
+#: src/LYLocal.c:1191
+msgid "Create file or directory (f or d): "
+msgstr "Créer un fichier ou un répertoire (f ou d) :"
+
+#: src/LYLocal.c:1233
+#, c-format
+msgid "Remove directory '%s'?"
+msgstr "Supprimer le répertoire « %s » ?"
+
+#: src/LYLocal.c:1236
+msgid "Remove directory?"
+msgstr "Supprimer le répertoire ?"
+
+#: src/LYLocal.c:1241
+#, c-format
+msgid "Remove file '%s'?"
+msgstr "Supprimer le fichier « %s » ?"
+
+#: src/LYLocal.c:1243
+msgid "Remove file?"
+msgstr "Supprimer le fichier ?"
+
+#: src/LYLocal.c:1248
+#, c-format
+msgid "Remove symbolic link '%s'?"
+msgstr "Supprimer le lien symbolique « %s » ?"
+
+#: src/LYLocal.c:1250
+msgid "Remove symbolic link?"
+msgstr "Supprimer le lien symbolique ?"
+
+#: src/LYLocal.c:1348
+msgid "Sorry, don't know how to permit non-UNIX files yet."
+msgstr "Désolé, impossible d’accepter les fichiers non UNIX pour le moment."
+
+#: src/LYLocal.c:1377
+msgid "Unable to open permit options file"
+msgstr "Impossible d’ouvrir le fichier de permissions."
+
+#: src/LYLocal.c:1405
+msgid "Specify permissions below:"
+msgstr "Spécifier les permissions d’accès ci-après :"
+
+#: src/LYLocal.c:1406 src/LYShowInfo.c:291
+msgid "Owner:"
+msgstr "Propriétaire :"
+
+#: src/LYLocal.c:1422
+msgid "Group"
+msgstr "Groupe"
+
+#: src/LYLocal.c:1438
+msgid "Others:"
+msgstr "Autres :"
+
+#: src/LYLocal.c:1456
+msgid "form to permit"
+msgstr "formulaire de permission"
+
+#: src/LYLocal.c:1552
+msgid "Invalid mode format."
+msgstr "Format de mode non valide."
+
+#: src/LYLocal.c:1556
+msgid "Invalid syntax format."
+msgstr "Format de syntaxe non valide."
+
+#: src/LYLocal.c:1743
+msgid "Warning! UUDecoded file will exist in the directory you started Lynx."
+msgstr "Attention : le fichier « UUDécodé » sera dans le répertoire où vous avez lancé Lynx."
+
+#: src/LYLocal.c:1933
+msgid "NULL URL pointer"
+msgstr "pointeur sur URL nul"
+
+#: src/LYLocal.c:2015
+#, c-format
+msgid "Executing %s "
+msgstr "Exécution : %s "
+
+#: src/LYLocal.c:2018
+msgid "Executing system command. This might take a while."
+msgstr "Exécution de la commande système. Veuillez patienter."
+
+#: src/LYLocal.c:2092
+msgid "Current directory:"
+msgstr "Le répertoire courant :"
+
+#: src/LYLocal.c:2095 src/LYLocal.c:2113
+msgid "Current selection:"
+msgstr "La sélection courante :"
+
+#: src/LYLocal.c:2099
+msgid "Nothing currently selected."
+msgstr "Il n’y a rien de sélectionné."
+
+#: src/LYLocal.c:2115
+msgid "tagged item:"
+msgstr "élément marqué :"
+
+#: src/LYLocal.c:2116
+msgid "tagged items:"
+msgstr "éléments marqués :"
+
+#: src/LYLocal.c:2216 src/LYLocal.c:2225
+msgid "Illegal filename; request ignored."
+msgstr "Nom de fichier non valide ; demande non traitée."
+
+#. directory not writable
+#: src/LYLocal.c:2323 src/LYLocal.c:2382
+msgid "Install in the selected directory not permitted."
+msgstr "Installation dans le répertoire choisi non permise."
+
+#: src/LYLocal.c:2378
+msgid "The selected item is not a directory! Request ignored."
+msgstr "L’élément sélectionné n’est pas un répertoire valide. Requête ignorée."
+
+#: src/LYLocal.c:2387
+msgid "Just a moment, ..."
+msgstr "Un instant svp…"
+
+#: src/LYLocal.c:2404
+msgid "Error building install args"
+msgstr "Erreur lors de la mise en place des arguments d’installation"
+
+#: src/LYLocal.c:2419 src/LYLocal.c:2450
+#, c-format
+msgid "Source and target are the same: %s"
+msgstr "Source et destination identiques : %s"
+
+#: src/LYLocal.c:2426 src/LYLocal.c:2457
+#, c-format
+msgid "Already in target directory: %s"
+msgstr "Déjà dans le répertoire de destination : %s"
+
+#: src/LYLocal.c:2475
+msgid "Installation complete"
+msgstr "Installation terminée"
+
+#: src/LYLocal.c:2678
+msgid "Temporary URL or list would be too long."
+msgstr "L’URL ou la liste temporaires seraient trop longues."
+
+#: src/LYMail.c:566
+msgid "Sending"
+msgstr "Envoi"
+
+#: src/LYMail.c:1050
+#, c-format
+msgid "The link %s :?: %s \n"
+msgstr "Le lien %s :?: %s \n"
+
+#: src/LYMail.c:1052
+#, c-format
+msgid "called \"%s\"\n"
+msgstr "appelé « %s »\n"
+
+#: src/LYMail.c:1053
+#, c-format
+msgid "in the file \"%s\" called \"%s\"\n"
+msgstr "dans le fichier « %s » appelé « %s »\n"
+
+#: src/LYMail.c:1054
+msgid "was requested but was not available."
+msgstr "a été demandé mais n’est pas disponible."
+
+#: src/LYMail.c:1055
+msgid "Thought you might want to know."
+msgstr "Pour votre information."
+
+#: src/LYMail.c:1057
+msgid "This message was automatically generated by"
+msgstr "Ce message est généré automatiquement par"
+
+#: src/LYMail.c:1770
+msgid "No system mailer configured"
+msgstr "Aucun agent de courrier sortant"
+
+#: src/LYMain.c:1095
+msgid "No Winsock found, sorry."
+msgstr "Pas de Winsock trouvée, désolé."
+
+#: src/LYMain.c:1285
+msgid "You MUST define a valid TMP or TEMP area!"
+msgstr "vous DEVEZ définir une zone TMP ou TEMP valide !"
+
+#: src/LYMain.c:1338 src/LYMainLoop.c:5285
+msgid "No such directory"
+msgstr "Répertoire inconnu"
+
+#: src/LYMain.c:1532
+#, c-format
+msgid ""
+"\n"
+"Configuration file \"%s\" is not available.\n"
+"\n"
+msgstr ""
+"\n"
+"Le fichier de configuration « %s » n’est pas disponible.\n"
+"\n"
+
+# src/LYMain.c
+#: src/LYMain.c:1542
+#, c-format
+msgid ""
+"\n"
+"Lynx character sets not declared.\n"
+"\n"
+msgstr ""
+"\n"
+"Jeux de caractères Lynx non déclaré.\n"
+"\n"
+
+#: src/LYMain.c:1698
+#, c-format
+msgid "Ignored %d characters from standard input.\n"
+msgstr "%d caractères ignorés sur l’entrée standard.\n"
+
+#: src/LYMain.c:1700
+#, c-format
+msgid "Use \"-stdin\" or \"-\" to tell how to handle piped input.\n"
+msgstr "Utilisez -stdin or - pour préciser la gestion du flux d’entrée.\n"
+
+#: src/LYMain.c:1858
+msgid "Warning:"
+msgstr "Attention :"
+
+#: src/LYMain.c:2426
+msgid "persistent cookies state will be changed in next session only."
+msgstr "L’état des cookies persistants sera changé au cours de la prochaine session seulement."
+
+#: src/LYMain.c:2661 src/LYMain.c:2705
+#, c-format
+msgid "Lynx: ignoring unrecognized charset=%s\n"
+msgstr "Lynx : jeu de caractères « %s » inconnu et ignoré\n"
+
+#: src/LYMain.c:3222
+#, c-format
+msgid "%s Version %s (%s)"
+msgstr "%s Version %s (%s)"
+
+#: src/LYMain.c:3263
+#, c-format
+msgid "Built on %s%s.\n"
+msgstr "Compilé le %s%s.\n"
+
+#: src/LYMain.c:3277
+msgid "Copyrights held by the Lynx Developers Group,"
+msgstr "Copyrights : Lynx Developers Group,"
+
+#: src/LYMain.c:3278
+msgid "the University of Kansas, CERN, and other contributors."
+msgstr "l’université du Kansas, le CERN, et d’autres contributeurs."
+
+#: src/LYMain.c:3279
+msgid "Distributed under the GNU General Public License (Version 2)."
+msgstr "Distribué sous licence GNU General Public License (version 2)."
+
+#: src/LYMain.c:3280
+msgid "See https://lynx.invisible-island.net/ and the online help for more information."
+msgstr "Voyez https://lynx.invisible-island.net/ et l’aide en ligne pour plus d’information."
+
+#: src/LYMain.c:4139
+#, c-format
+msgid "USAGE: %s [options] [file]\n"
+msgstr "Utilisation : %s [options] [fichier]\n"
+
+#: src/LYMain.c:4140
+#, c-format
+msgid "Options are:\n"
+msgstr "Les options sont :\n"
+
+#: src/LYMain.c:4443
+#, c-format
+msgid "%s: Invalid Option: %s\n"
+msgstr "%s : Option non valide : %s\n"
+
+#: src/LYMainLoop.c:572
+#, c-format
+msgid "Internal error: Invalid mouse link %d!"
+msgstr "Erreur interne : lien pour la souris %d non valide !"
+
+#: src/LYMainLoop.c:693 src/LYMainLoop.c:5307
+msgid "A URL specified by the user"
+msgstr "Une URL spécifiée par l’utilisateur"
+
+#: src/LYMainLoop.c:1142
+msgid "Enctype multipart/form-data not yet supported! Cannot submit."
+msgstr "Type d’encodage multipart/form-data non supporté. Envoi impossible."
+
+#.
+#. * Make a name for this help file.
+#.
+#: src/LYMainLoop.c:3197
+msgid "Help Screen"
+msgstr "Écran d’aide"
+
+#: src/LYMainLoop.c:3328
+msgid "System Index"
+msgstr "Index système"
+
+#: src/LYMainLoop.c:3577
+#, c-format
+msgid "Query parameter %d: "
+msgstr "Paramètre de requête : %d"
+
+#: src/LYMainLoop.c:3806 src/LYMainLoop.c:5583
+msgid "Entry into main screen"
+msgstr "Entrée dans l’écran principal"
+
+#: src/LYMainLoop.c:4064
+msgid "No next document present"
+msgstr "Aucun document suivant"
+
+#: src/LYMainLoop.c:4359
+msgid "charset for this document specified explicitly, sorry..."
+msgstr "jeu de caractères pour ce document spécifié explicitement, désolé…"
+
+#: src/LYMainLoop.c:5265
+msgid "cd to:"
+msgstr "changer de répertoire vers :"
+
+#: src/LYMainLoop.c:5288
+msgid "A component of path is not a directory"
+msgstr "Une partie du chemin n’est pas un répertoire."
+
+#: src/LYMainLoop.c:5291
+msgid "failed to change directory"
+msgstr "échec de changement de répertoire"
+
+#: src/LYMainLoop.c:6517
+msgid "Reparsing document under current settings..."
+msgstr "Relecture du document avec les paramètres actuels…"
+
+#: src/LYMainLoop.c:6811
+#, c-format
+msgid "Fatal error - could not open output file %s\n"
+msgstr "Erreur fatale - impossible d’ouvrir le fichier de sortie %s\n"
+
+#: src/LYMainLoop.c:7153
+msgid "TABLE center enable."
+msgstr "centrage des TABLEAUX activé."
+
+#: src/LYMainLoop.c:7156
+msgid "TABLE center disable."
+msgstr "centrage des TABLEAUX désactivé."
+
+#: src/LYMainLoop.c:7236
+msgid "Current URL is empty."
+msgstr "URL courante vide."
+
+#: src/LYMainLoop.c:7238 src/LYUtils.c:1909
+msgid "Copy to clipboard failed."
+msgstr "Échec de copie dans le presse-papiers."
+
+#: src/LYMainLoop.c:7240
+msgid "Document URL put to clipboard."
+msgstr "URL du document copiée dans le presse-papiers."
+
+#: src/LYMainLoop.c:7242
+msgid "Link URL put to clipboard."
+msgstr "URL du lien copiée dans le presse-papiers."
+
+#: src/LYMainLoop.c:7269
+msgid "No URL in the clipboard."
+msgstr "Aucune URL dans le presse-papiers."
+
+#: src/LYMainLoop.c:7962 src/LYMainLoop.c:8133
+msgid "-index-"
+msgstr "-index-"
+
+#: src/LYMainLoop.c:8071
+msgid "lynx: Can't access startfile"
+msgstr "lynx : accès impossible au fichier de départ"
+
+#: src/LYMainLoop.c:8083
+msgid "lynx: Start file could not be found or is not text/html or text/plain"
+msgstr "lynx : fichier de départ introuvable ou n’est pas de type text/html ou text/plain"
+
+#: src/LYMainLoop.c:8084
+msgid " Exiting..."
+msgstr " Sortie…"
+
+#: src/LYMainLoop.c:8127
+msgid "-more-"
+msgstr "-suite-"
+
+#. Enable scrolling.
+#: src/LYNews.c:186
+msgid "You will be posting to:"
+msgstr "Vous postez à : "
+
+#.
+#. * Get the mail address for the From header, offering personal_mail_address
+#. * as default.
+#.
+#: src/LYNews.c:195
+msgid ""
+"\n"
+"\n"
+" Please provide your mail address for the From: header\n"
+msgstr ""
+"\n"
+"\n"
+" Veuillez fournir votre courriel ou éditer l’entête « From: » (Expéditeur) :\n"
+
+#.
+#. * Get the Subject header, offering the current document's title as the
+#. * default if this is a followup rather than a new post. - FM
+#.
+#: src/LYNews.c:212
+msgid ""
+"\n"
+"\n"
+" Please provide or edit the Subject: header\n"
+msgstr ""
+"\n"
+"\n"
+" Veuillez fournir ou éditer l’entête « Subject: » (Objet) :\n"
+
+#: src/LYNews.c:302
+msgid ""
+"\n"
+"\n"
+" Please provide or edit the Organization: header\n"
+msgstr ""
+"\n"
+"\n"
+" Veuillez fournir ou éditer l’entête « Organization: » (Organisme) :\n"
+
+#.
+#. * Use the built in line editior.
+#.
+#: src/LYNews.c:359
+msgid ""
+"\n"
+"\n"
+" Please enter your message below."
+msgstr ""
+"\n"
+"\n"
+"Veuillez entrer votre message ci-après :"
+
+#: src/LYNews.c:405
+msgid "Message has no original text!"
+msgstr "Le message n’a pas de texte original !"
+
+#: src/LYOptions.c:774
+msgid "review/edit B)ookmarks files"
+msgstr "B) Voir/Éditer les signets "
+
+#: src/LYOptions.c:776
+msgid "B)ookmark file: "
+msgstr "B) Fichier de signets : "
+
+#: src/LYOptions.c:2131 src/LYOptions.c:2138
+msgid "ON"
+msgstr "ON"
+
+#. verbose_img variable
+#. LYCollapseBRs variable
+#. LYtrimBlankLines variable
+#: src/LYOptions.c:2132 src/LYOptions.c:2137 src/LYOptions.c:2321
+#: src/LYOptions.c:2330 src/LYOptions.c:2339 src/LYOptions.c:2350
+msgid "OFF"
+msgstr "OFF"
+
+#: src/LYOptions.c:2133
+msgid "NEVER"
+msgstr "JAMAIS"
+
+#: src/LYOptions.c:2134
+msgid "ALWAYS"
+msgstr "TOUJOURS"
+
+#: src/LYOptions.c:2150 src/LYOptions.c:2313
+msgid "ignore"
+msgstr "ignorer"
+
+#: src/LYOptions.c:2151
+msgid "ask user"
+msgstr "demander"
+
+#: src/LYOptions.c:2152
+msgid "accept all"
+msgstr "tout accepter"
+
+#: src/LYOptions.c:2164
+msgid "ALWAYS OFF"
+msgstr "TOUJOURS DÉSACTIVÉ"
+
+#: src/LYOptions.c:2165
+msgid "FOR LOCAL FILES ONLY"
+msgstr "FICHIERS LOCAUX SEULEMENT"
+
+#: src/LYOptions.c:2167
+msgid "ALWAYS ON"
+msgstr "TOUJOURS ACTIVÉ"
+
+#: src/LYOptions.c:2179
+msgid "Numbers act as arrows"
+msgstr "touches <nombres> => <flèches>"
+
+#: src/LYOptions.c:2181
+msgid "Links are numbered"
+msgstr "Les liens sont numérotés"
+
+#: src/LYOptions.c:2184
+msgid "Links and form fields are numbered"
+msgstr "Les liens et champs de formulaire sont numérotés"
+
+#: src/LYOptions.c:2187
+msgid "Form fields are numbered"
+msgstr "Les champs de formulaires sont numérotés"
+
+#: src/LYOptions.c:2202
+msgid "Case insensitive"
+msgstr "Insensible à la casse"
+
+#: src/LYOptions.c:2203
+msgid "Case sensitive"
+msgstr "Sensible à la casse"
+
+#: src/LYOptions.c:2237
+msgid "prompt normally"
+msgstr "demander normalement"
+
+#: src/LYOptions.c:2238
+msgid "force yes-response"
+msgstr "forcer la réponse oui"
+
+#: src/LYOptions.c:2239
+msgid "force no-response"
+msgstr "forcer la réponse non"
+
+#: src/LYOptions.c:2249
+msgid "RFC 2109"
+msgstr "RFC 2109"
+
+#: src/LYOptions.c:2250
+msgid "RFC 2965"
+msgstr "RFC 2965"
+
+#: src/LYOptions.c:2251
+msgid "RFC 6265"
+msgstr "RFC 6265"
+
+#: src/LYOptions.c:2268
+msgid "Novice"
+msgstr "Débutant"
+
+#: src/LYOptions.c:2269
+msgid "Intermediate"
+msgstr "Intermédiaire"
+
+#: src/LYOptions.c:2270
+msgid "Advanced"
+msgstr "Avancé(es)"
+
+#: src/LYOptions.c:2279
+msgid "By First Visit"
+msgstr "Première visite"
+
+#: src/LYOptions.c:2281
+msgid "By First Visit Reversed"
+msgstr "Première visite (inversé)"
+
+#: src/LYOptions.c:2282
+msgid "As Visit Tree"
+msgstr "Arbre de visites"
+
+#: src/LYOptions.c:2283
+msgid "By Last Visit"
+msgstr "Dernière visite"
+
+#: src/LYOptions.c:2285
+msgid "By Last Visit Reversed"
+msgstr "Dernière visite (inversé)"
+
+#. Old_DTD variable
+#: src/LYOptions.c:2296
+msgid "relaxed (TagSoup mode)"
+msgstr "souple (mode TagSoup)"
+
+#: src/LYOptions.c:2297
+msgid "strict (SortaSGML mode)"
+msgstr "strict (mode SortaSGML)"
+
+#: src/LYOptions.c:2304
+msgid "Ignore"
+msgstr "Ignorer"
+
+#: src/LYOptions.c:2305
+msgid "Add to trace-file"
+msgstr "Ajouter un fichier de trace"
+
+#: src/LYOptions.c:2306
+msgid "Add to LYNXMESSAGES"
+msgstr "Ajouter à LYNXMESSAGES"
+
+#: src/LYOptions.c:2307
+msgid "Warn, point to trace-file"
+msgstr "Attention pointe vers le fichier de trace"
+
+#: src/LYOptions.c:2314
+msgid "as labels"
+msgstr "comme étiquettes"
+
+#: src/LYOptions.c:2315
+msgid "as links"
+msgstr "comme des liens"
+
+#: src/LYOptions.c:2322
+msgid "show filename"
+msgstr "voir le nom du fichier"
+
+#: src/LYOptions.c:2331
+msgid "collapse"
+msgstr "fusionner"
+
+#: src/LYOptions.c:2340
+msgid "trim-lines"
+msgstr "supprimer-lignes-vides"
+
+#: src/LYOptions.c:2351
+msgid "STANDARD"
+msgstr "STANDARD"
+
+#: src/LYOptions.c:2352
+msgid "ADVANCED"
+msgstr "AVANCÉ"
+
+#: src/LYOptions.c:2374
+msgid "IDNA 2003"
+msgstr "IDNA 2003"
+
+#: src/LYOptions.c:2375
+msgid "IDNA 2008"
+msgstr "IDNA 2008"
+
+#: src/LYOptions.c:2376
+msgid "IDNA TR46"
+msgstr "IDNA TR46"
+
+#: src/LYOptions.c:2377
+msgid "IDNA Compatible"
+msgstr "IDNA compatible"
+
+#: src/LYOptions.c:2398
+msgid "Directories first"
+msgstr "Répertoires en premier"
+
+#: src/LYOptions.c:2399
+msgid "Files first"
+msgstr "Fichiers en premier"
+
+#: src/LYOptions.c:2400
+msgid "Mixed style"
+msgstr "Style mixte"
+
+#: src/LYOptions.c:2408 src/LYOptions.c:2428
+msgid "By Name"
+msgstr "Par Nom"
+
+#: src/LYOptions.c:2409 src/LYOptions.c:2429
+msgid "By Type"
+msgstr "Par type"
+
+#: src/LYOptions.c:2410 src/LYOptions.c:2430
+msgid "By Size"
+msgstr "Par Taille"
+
+#: src/LYOptions.c:2411 src/LYOptions.c:2431
+msgid "By Date"
+msgstr "Par Date"
+
+#: src/LYOptions.c:2412
+msgid "By Mode"
+msgstr "Par mode"
+
+#: src/LYOptions.c:2414
+msgid "By User"
+msgstr "Par utilisateur"
+
+#: src/LYOptions.c:2415
+msgid "By Group"
+msgstr "Par Groupe"
+
+#: src/LYOptions.c:2440
+msgid "Do not show rate"
+msgstr "Cacher le taux"
+
+#: src/LYOptions.c:2441 src/LYOptions.c:2442
+#, c-format
+msgid "Show %s/sec rate"
+msgstr "Montrer le taux %s/s"
+
+#: src/LYOptions.c:2444 src/LYOptions.c:2445
+#, c-format
+msgid "Show %s/sec, ETA"
+msgstr "Montrer %s/s, ETA"
+
+#: src/LYOptions.c:2446 src/LYOptions.c:2447
+#, c-format
+msgid "Show %s/sec (2-digits), ETA"
+msgstr "Montrer %s/s (2 chiffres), ETA"
+
+#: src/LYOptions.c:2450
+msgid "Show progressbar"
+msgstr "Montrer la barre de progression"
+
+#: src/LYOptions.c:2471
+msgid "Accept lynx's internal types"
+msgstr "Accepter les types internes Lynx"
+
+#: src/LYOptions.c:2472
+msgid "Also accept lynx.cfg's types"
+msgstr "Accepter aussi les types lynx.cfg"
+
+#: src/LYOptions.c:2473
+msgid "Also accept user's types"
+msgstr "Accepter aussi les types de l’utilisateur"
+
+#: src/LYOptions.c:2474
+msgid "Also accept system's types"
+msgstr "Accepter aussi les types systèmes"
+
+#: src/LYOptions.c:2475
+msgid "Accept all types"
+msgstr "Accepter tous les types"
+
+#: src/LYOptions.c:2484
+msgid "gzip"
+msgstr "gzip"
+
+#: src/LYOptions.c:2485
+msgid "deflate"
+msgstr "deflate"
+
+#: src/LYOptions.c:2488
+msgid "compress"
+msgstr "compress"
+
+#: src/LYOptions.c:2491
+msgid "bzip2"
+msgstr "bzip2"
+
+#: src/LYOptions.c:2493
+msgid "All"
+msgstr "Tous"
+
+#: src/LYOptions.c:2503
+msgid "HTTP 1.0"
+msgstr "HTTP 1.0"
+
+#: src/LYOptions.c:2504
+msgid "HTTP 1.1"
+msgstr "HTTP 1.1"
+
+#: src/LYOptions.c:2863 src/LYOptions.c:2892
+#, c-format
+msgid "Use %s to invoke the Options menu!"
+msgstr "Utilisez %s pour invoquer le menu des Options."
+
+#: src/LYOptions.c:3789
+msgid "(options marked with (!) will not be saved)"
+msgstr "(les options marquées avec (!) ne seront pas sauvées)"
+
+#: src/LYOptions.c:3797
+msgid "General Preferences"
+msgstr "Préférences globales"
+
+#. ***************************************************************
+#. User Mode: SELECT
+#: src/LYOptions.c:3801
+msgid "User mode"
+msgstr "Mode utilisateur"
+
+#. Editor: INPUT
+#: src/LYOptions.c:3807
+msgid "Editor"
+msgstr "Éditeur"
+
+#. Search Type: SELECT
+#: src/LYOptions.c:3812
+msgid "Type of Search"
+msgstr "Type de recherche"
+
+#: src/LYOptions.c:3817
+msgid "Security and Privacy"
+msgstr "Sécurité et Vie privée"
+
+#. ***************************************************************
+#. Cookies: SELECT
+#: src/LYOptions.c:3821
+msgid "Cookies"
+msgstr "Cookies"
+
+#. Cookie Version: SELECT
+#: src/LYOptions.c:3835
+msgid "Cookie RFC-version"
+msgstr "Cookie RFC-version"
+
+#. Cookie Prompting: SELECT
+#: src/LYOptions.c:3841
+msgid "Invalid-Cookie Prompting"
+msgstr "Dialogue pour les cookies non valides"
+
+#. SSL Prompting: SELECT
+#: src/LYOptions.c:3848
+msgid "SSL Prompting"
+msgstr "Dialogue SSL"
+
+#: src/LYOptions.c:3853
+msgid "SSL client certificate file"
+msgstr "Fichier de certificat client SSL"
+
+#: src/LYOptions.c:3857
+msgid "SSL client key file"
+msgstr "Fichier de clef client SSL"
+
+#: src/LYOptions.c:3863
+msgid "Keyboard Input"
+msgstr "Entrée du clavier"
+
+#. ***************************************************************
+#. Keypad Mode: SELECT
+#: src/LYOptions.c:3867
+msgid "Keypad mode"
+msgstr "Mode pavé numérique"
+
+#. Emacs keys: ON/OFF
+#: src/LYOptions.c:3873
+msgid "Emacs keys"
+msgstr "Touches emacs"
+
+#. VI Keys: ON/OFF
+#: src/LYOptions.c:3879
+msgid "VI keys"
+msgstr "Touches vi"
+
+#. Line edit style: SELECT
+#. well, at least 2 line edit styles available
+#: src/LYOptions.c:3886
+msgid "Line edit style"
+msgstr "Style d’édition de ligne"
+
+#. Keyboard layout: SELECT
+#: src/LYOptions.c:3898
+msgid "Keyboard layout"
+msgstr "Plan du clavier"
+
+#.
+#. * Display and Character Set
+#.
+#: src/LYOptions.c:3912
+msgid "Display and Character Set"
+msgstr "Affichage et jeu de caractères"
+
+#. Use locale-based character set: ON/OFF
+#: src/LYOptions.c:3917
+msgid "Use locale-based character set"
+msgstr "Utiliser le jeu de caractères local"
+
+#: src/LYOptions.c:3924
+msgid "Use HTML5 charset replacements"
+msgstr "Utiliser les remplacements de charset HTML5"
+
+#. Display Character Set: SELECT
+#: src/LYOptions.c:3930
+msgid "Display character set"
+msgstr "Afficher le jeu de caractères"
+
+#: src/LYOptions.c:3961
+msgid "Assumed document character set"
+msgstr "Jeu de caractères présumé du document"
+
+#: src/LYOptions.c:3977
+msgid "Internationalized domain names"
+msgstr "Nom de domaine internationalisé"
+
+#.
+#. * Since CJK people hardly mixed with other world
+#. * we split the header to make it more readable:
+#. * "CJK mode" for CJK display charsets, and "Raw 8-bit" for others.
+#.
+#: src/LYOptions.c:3995
+msgid "CJK mode"
+msgstr "Mode CJK"
+
+#: src/LYOptions.c:3997
+msgid "Raw 8-bit"
+msgstr "Mode 8-bit « brut »"
+
+#. X Display: INPUT
+#: src/LYOptions.c:4005
+msgid "X Display"
+msgstr "X Display"
+
+#.
+#. * Document Appearance
+#.
+#: src/LYOptions.c:4011
+msgid "Document Appearance"
+msgstr "Apparence du document"
+
+#: src/LYOptions.c:4017
+msgid "Show color"
+msgstr "Afficher les couleurs"
+
+#: src/LYOptions.c:4043
+msgid "Color style"
+msgstr "Style de couleur"
+
+#: src/LYOptions.c:4053
+msgid "Default colors"
+msgstr "Couleurs par défaut"
+
+#. Show cursor: ON/OFF
+#: src/LYOptions.c:4061
+msgid "Show cursor"
+msgstr "Afficher le curseur"
+
+#. Underline links: ON/OFF
+#: src/LYOptions.c:4067
+msgid "Underline links"
+msgstr "Souligner les liens"
+
+#. Show scrollbar: ON/OFF
+#: src/LYOptions.c:4074
+msgid "Show scrollbar"
+msgstr "Montrer l’ascenseur"
+
+#. Select Popups: ON/OFF
+#: src/LYOptions.c:4081
+msgid "Popups for select fields"
+msgstr "Fenêtre popup pour les champs sélectionnés"
+
+#. HTML error recovery: SELECT
+#: src/LYOptions.c:4087
+msgid "HTML error recovery"
+msgstr "Reprise d’une erreur HTML"
+
+#. Bad HTML messages: SELECT
+#: src/LYOptions.c:4093
+msgid "Bad HTML messages"
+msgstr "Messages HTML erronés"
+
+#. Show Images: SELECT
+#: src/LYOptions.c:4099
+msgid "Show images"
+msgstr "Montrer les images"
+
+#. Verbose Images: ON/OFF
+#: src/LYOptions.c:4113
+msgid "Verbose images"
+msgstr "Images verbeuses"
+
+#. Collapse BR Tags: ON/OFF
+#: src/LYOptions.c:4119
+msgid "Collapse BR tags"
+msgstr "Fusionner les éléments BR"
+
+#. Trim blank lines: ON/OFF
+#: src/LYOptions.c:4125
+msgid "Trim blank lines"
+msgstr "Supprimer les lignes vides"
+
+#.
+#. * Headers Transferred to Remote Servers
+#.
+#: src/LYOptions.c:4133
+msgid "Headers Transferred to Remote Servers"
+msgstr "Entêtes transférés aux serveurs distants"
+
+#. ***************************************************************
+#. Mail Address: INPUT
+#: src/LYOptions.c:4137
+msgid "Personal mail address"
+msgstr "Adresse email personnelle"
+
+#: src/LYOptions.c:4142
+msgid "Personal name for mail"
+msgstr "Nom de personne pour le mail"
+
+#: src/LYOptions.c:4149
+msgid "Password for anonymous ftp"
+msgstr "Mot de passe pour l’accès FTP anonyme"
+
+#. Preferred content type: SELECT
+#: src/LYOptions.c:4155
+msgid "Preferred content type"
+msgstr "Type de contenu préféré"
+
+#. Preferred media type: SELECT
+#: src/LYOptions.c:4161
+msgid "Preferred media type"
+msgstr "Type média préféré"
+
+#. Preferred encoding: SELECT
+#: src/LYOptions.c:4167
+msgid "Preferred encoding"
+msgstr "Encodage préféré"
+
+#. Preferred Document Character Set: INPUT
+#: src/LYOptions.c:4173
+msgid "Preferred document character set"
+msgstr "Jeu de caractères de document préféré"
+
+#. Preferred Document Language: INPUT
+#: src/LYOptions.c:4178
+msgid "Preferred document language"
+msgstr "Langue de document préférée"
+
+#. HTTP protocol SELECT
+#: src/LYOptions.c:4183
+msgid "HTTP protocol"
+msgstr "Protocole HTTP"
+
+#: src/LYOptions.c:4190
+msgid "Send User-Agent header"
+msgstr "Envoyé l’entête User-Agent"
+
+#: src/LYOptions.c:4192
+msgid "User-Agent header"
+msgstr "Entête User-Agent"
+
+#.
+#. * Listing and Accessing Files
+#.
+#: src/LYOptions.c:4200
+msgid "Listing and Accessing Files"
+msgstr "Listes et accès aux fichiers"
+
+#. FTP sort: SELECT
+#: src/LYOptions.c:4205
+msgid "Use Passive FTP"
+msgstr "Utiliser le mode FTP passif"
+
+#. FTP sort: SELECT
+#: src/LYOptions.c:4211
+msgid "FTP sort criteria"
+msgstr "Critères de tri FTP"
+
+#. Local Directory Sort: SELECT
+#: src/LYOptions.c:4219
+msgid "Local directory sort criteria"
+msgstr "Critère de tri des répertoires locaux."
+
+#. Local Directory Order: SELECT
+#: src/LYOptions.c:4225
+msgid "Local directory sort order"
+msgstr "Ordre de tri des répertoires locaux"
+
+#: src/LYOptions.c:4234
+msgid "Show dot files"
+msgstr "Montrer les fichiers cachés"
+
+#: src/LYOptions.c:4242
+msgid "Execution links"
+msgstr "Liens à exécuter"
+
+#: src/LYOptions.c:4260
+msgid "Pause when showing message"
+msgstr "Mettre en pause lors de l’affichage d’un message"
+
+#. Show transfer rate: SELECT
+#: src/LYOptions.c:4267
+msgid "Show transfer rate"
+msgstr "Montrer le taux de transfert"
+
+#.
+#. * Special Files and Screens
+#.
+#: src/LYOptions.c:4287
+msgid "Special Files and Screens"
+msgstr "Fichiers et écrans spéciaux"
+
+#: src/LYOptions.c:4292
+msgid "Multi-bookmarks"
+msgstr "Signets multiples"
+
+#: src/LYOptions.c:4300
+msgid "Review/edit Bookmarks files"
+msgstr "Revoir/Éditer les fichiers signets"
+
+#: src/LYOptions.c:4303
+msgid "Goto multi-bookmark menu"
+msgstr "Aller au menu signets multiples"
+
+#: src/LYOptions.c:4305
+msgid "Bookmarks file"
+msgstr "Fichier de signets"
+
+#. Auto Session: ON/OFF
+#: src/LYOptions.c:4312
+msgid "Auto Session"
+msgstr "Session Auto"
+
+#. Session File Menu: INPUT
+#: src/LYOptions.c:4318
+msgid "Session file"
+msgstr "Fichier de session"
+
+#. Visited Pages: SELECT
+#: src/LYOptions.c:4324
+msgid "Visited Pages"
+msgstr "Pages visitées"
+
+#: src/LYOptions.c:4329
+msgid "View the file "
+msgstr "Voir le fichier"
+
+#: src/LYPrint.c:956
+#, c-format
+msgid " Print job complete.\n"
+msgstr "Impression terminée.\n"
+
+#: src/LYPrint.c:1283
+msgid "Document:"
+msgstr "Document :"
+
+#: src/LYPrint.c:1284
+msgid "Number of lines:"
+msgstr "Nombre de lignes :"
+
+#: src/LYPrint.c:1285
+msgid "Number of pages:"
+msgstr "Nombre de pages :"
+
+#: src/LYPrint.c:1286
+msgid "pages"
+msgstr "pages"
+
+#: src/LYPrint.c:1286
+msgid "page"
+msgstr "page"
+
+#: src/LYPrint.c:1287
+msgid "(approximately)"
+msgstr "(approximativement)"
+
+#: src/LYPrint.c:1294
+msgid "Some print functions have been disabled!"
+msgstr "Certaines fonctions d’impression ont été désactivées."
+
+#: src/LYPrint.c:1298
+msgid "Standard print options:"
+msgstr "Options d’impression standard :"
+
+#: src/LYPrint.c:1299
+msgid "Print options:"
+msgstr "Options d’impression :"
+
+#: src/LYPrint.c:1306
+msgid "Save to a local file"
+msgstr "Enregistrer dans un fichier"
+
+#: src/LYPrint.c:1308
+msgid "Save to disk disabled"
+msgstr "Enregistrement sur disque désactivé"
+
+#: src/LYPrint.c:1315
+msgid "Mail the file"
+msgstr "Envoyer le fichier par courrier"
+
+#: src/LYPrint.c:1322
+msgid "Print to the screen"
+msgstr "Imprimer à l’écran"
+
+#: src/LYPrint.c:1327
+msgid "Print out on a printer attached to your vt100 terminal"
+msgstr "Utiliser le terminal vt100 pour imprimer"
+
+#: src/LYReadCFG.c:437
+#, c-format
+msgid ""
+"Syntax Error parsing COLOR in configuration file:\n"
+"The line must be of the form:\n"
+"COLOR:INTEGER:FOREGROUND:BACKGROUND\n"
+"\n"
+"Here FOREGROUND and BACKGROUND must be one of:\n"
+"The special strings 'nocolor' or 'default', or\n"
+msgstr ""
+"Erreur de syntaxe lors de l’analyse de COLOR dans le fichier de\n"
+"configuration. La ligne doit être du type:\n"
+"COULEUR:ENTIER:PREMIERPLAN:ARRIEREPLAN\n"
+"\n"
+"Ici, PREMIERPLAN et ARRIEREPLAN doivent être au choix\n"
+"une chaîne de caractères spéciale « nocolor » ou « default », ou\n"
+
+#: src/LYReadCFG.c:450
+msgid "Offending line:"
+msgstr "Ligne fautive :"
+
+#: src/LYReadCFG.c:764
+#, c-format
+msgid "key remapping of %s to %s for %s failed\n"
+msgstr "échec de changement de touche de %s vers %s pour %s\n"
+
+#: src/LYReadCFG.c:771
+#, c-format
+msgid "key remapping of %s to %s failed\n"
+msgstr "échec du changement de touche de %s vers %s\n"
+
+#: src/LYReadCFG.c:792
+#, c-format
+msgid "invalid line-editor selection %s for key %s, selecting all\n"
+msgstr "Sélection de lignes éditées %s non valide pour la touche %s, sélection de l’ensemble\n"
+
+#: src/LYReadCFG.c:817 src/LYReadCFG.c:832
+#, c-format
+msgid "setting of line-editor binding for key %s (0x%x) to 0x%x for %s failed\n"
+msgstr "Échec de définition (éditeur de ligne) pour la touche %s (0x%x) en 0x%x pour %s.\n"
+
+#: src/LYReadCFG.c:839
+#, c-format
+msgid "setting of line-editor binding for key %s (0x%x) for %s failed\n"
+msgstr "Échec de définition (éditeur de ligne) pour la touche %s (0x%x) pour %s.\n"
+
+#: src/LYReadCFG.c:937
+#, c-format
+msgid "Lynx: cannot start, CERN rules file %s is not available\n"
+msgstr "Lynx : impossible de démarrer. Le fichier de règles CERN %s n’est pas accessible.\n"
+
+#: src/LYReadCFG.c:938
+msgid "(no name)"
+msgstr "(pas de nom)"
+
+#: src/LYReadCFG.c:2086
+#, c-format
+msgid "More than %d nested lynx.cfg includes -- perhaps there is a loop?!?\n"
+msgstr "Plus de %d inclusions de lynx.cfg imbriquées. Peut être y-a-t’il une boucle ?\n"
+
+#: src/LYReadCFG.c:2088
+#, c-format
+msgid "Last attempted include was '%s',\n"
+msgstr "La dernière inclusion tentée était : « %s »,\n"
+
+#: src/LYReadCFG.c:2089
+#, c-format
+msgid "included from '%s'.\n"
+msgstr "inclusion de « %s ».\n"
+
+#: src/LYReadCFG.c:2500 src/LYReadCFG.c:2513 src/LYReadCFG.c:2571
+msgid "The following is read from your lynx.cfg file."
+msgstr "Les données suivantes sont lues à partir de votre fichier lynx.cfg."
+
+#: src/LYReadCFG.c:2501 src/LYReadCFG.c:2514
+msgid "Please read the distribution"
+msgstr "Merci de chercher dans la distribution"
+
+#: src/LYReadCFG.c:2507 src/LYReadCFG.c:2517
+msgid "for more comments."
+msgstr "pour plus de commentaires."
+
+#: src/LYReadCFG.c:2553
+msgid "RELOAD THE CHANGES"
+msgstr "RECHARGER LES MODIFICATIONS"
+
+#: src/LYReadCFG.c:2561
+msgid "Your primary configuration"
+msgstr "Votre configuration principale"
+
+#: src/LYShowInfo.c:116
+msgid "URL:"
+msgstr "URL :"
+
+#: src/LYShowInfo.c:200
+msgid "Directory that you are currently viewing"
+msgstr "Répertoire vu en ce moment"
+
+#: src/LYShowInfo.c:203
+msgid "Name:"
+msgstr "Nom :"
+
+#: src/LYShowInfo.c:220
+msgid "Directory that you have currently selected"
+msgstr "Répertoire sélectionné"
+
+#: src/LYShowInfo.c:222
+msgid "File that you have currently selected"
+msgstr "Fichier sélectionné"
+
+#: src/LYShowInfo.c:225
+msgid "Symbolic link that you have currently selected"
+msgstr "Lien symbolique sélectionné"
+
+#: src/LYShowInfo.c:228
+msgid "Item that you have currently selected"
+msgstr "Article sélectionné"
+
+#: src/LYShowInfo.c:230
+msgid "Full name:"
+msgstr "Nom complet :"
+
+#: src/LYShowInfo.c:243
+msgid "Unable to follow link"
+msgstr "Impossible de suivre le lien"
+
+#: src/LYShowInfo.c:245
+msgid "Points to file:"
+msgstr "Pointe vers le fichier :"
+
+#: src/LYShowInfo.c:250
+msgid "Name of owner:"
+msgstr "Nom du propriétaire :"
+
+#: src/LYShowInfo.c:253
+msgid "Group name:"
+msgstr "Nom du groupe :"
+
+#: src/LYShowInfo.c:255
+msgid "File size:"
+msgstr "Taille du fichier :"
+
+#: src/LYShowInfo.c:257
+msgid "(bytes)"
+msgstr "(octets)"
+
+#.
+#. * Include date and time information.
+#.
+#: src/LYShowInfo.c:262
+msgid "Creation date:"
+msgstr "Date de création :"
+
+#: src/LYShowInfo.c:265
+msgid "Last modified:"
+msgstr "Dernière mise à jour :"
+
+#: src/LYShowInfo.c:268
+msgid "Last accessed:"
+msgstr "Dernier accès :"
+
+#: src/LYShowInfo.c:274
+msgid "Access Permissions"
+msgstr "Permissions d’accès"
+
+#: src/LYShowInfo.c:309
+msgid "Group:"
+msgstr "Groupe :"
+
+#: src/LYShowInfo.c:329
+msgid "World:"
+msgstr "Mot :"
+
+#: src/LYShowInfo.c:336
+msgid "File that you are currently viewing"
+msgstr "Fichier que vous visualisez présentement"
+
+#: src/LYShowInfo.c:344 src/LYShowInfo.c:444
+msgid "Linkname:"
+msgstr "Nom du lien :"
+
+#: src/LYShowInfo.c:350 src/LYShowInfo.c:365
+msgid "Charset:"
+msgstr "Jeu de caractères :"
+
+#: src/LYShowInfo.c:364
+msgid "(assumed)"
+msgstr "(implicite)"
+
+#: src/LYShowInfo.c:371
+msgid "Server:"
+msgstr "Serveur :"
+
+#: src/LYShowInfo.c:374
+msgid "Date:"
+msgstr "Date :"
+
+#: src/LYShowInfo.c:377
+msgid "Last Mod:"
+msgstr "Dernière modification :"
+
+#: src/LYShowInfo.c:381
+msgid "Expires:"
+msgstr "Expire :"
+
+#: src/LYShowInfo.c:384
+msgid "Cache-Control:"
+msgstr "Contrôle du cache :"
+
+#: src/LYShowInfo.c:387
+msgid "Content-Length:"
+msgstr "Longueur du contenu :"
+
+#: src/LYShowInfo.c:391
+msgid "Length:"
+msgstr "Longueur :"
+
+#: src/LYShowInfo.c:396
+msgid "Language:"
+msgstr "Langage :"
+
+#: src/LYShowInfo.c:402
+msgid "Post Data:"
+msgstr "Données POST :"
+
+#: src/LYShowInfo.c:405
+msgid "Post Content Type:"
+msgstr "Type de contenu POST :"
+
+#: src/LYShowInfo.c:408
+msgid "Owner(s):"
+msgstr "Propriétaire(s) :"
+
+#: src/LYShowInfo.c:413
+msgid "size:"
+msgstr "Taille :"
+
+#: src/LYShowInfo.c:415
+msgid "lines"
+msgstr "lignes"
+
+#: src/LYShowInfo.c:419
+msgid "forms mode"
+msgstr "mode formulaires"
+
+#: src/LYShowInfo.c:421
+msgid "source"
+msgstr "source"
+
+#: src/LYShowInfo.c:422
+msgid "normal"
+msgstr "normal"
+
+#: src/LYShowInfo.c:424
+msgid ", safe"
+msgstr ", sécurisé"
+
+#: src/LYShowInfo.c:426
+msgid ", via internal link"
+msgstr ", lien interne"
+
+#: src/LYShowInfo.c:430
+msgid ", no-cache"
+msgstr ", pas de cache"
+
+#: src/LYShowInfo.c:432
+msgid ", ISMAP script"
+msgstr ", script ISMAP"
+
+#: src/LYShowInfo.c:434
+msgid ", bookmark file"
+msgstr ", fichier signet"
+
+#: src/LYShowInfo.c:437
+msgid "mode:"
+msgstr "mode :"
+
+#: src/LYShowInfo.c:443
+msgid "Link that you currently have selected"
+msgstr "Lien que vous avez sélectionné"
+
+#: src/LYShowInfo.c:452
+msgid "Method:"
+msgstr "Méthode :"
+
+#: src/LYShowInfo.c:456
+msgid "Enctype:"
+msgstr "Encodage :"
+
+#: src/LYShowInfo.c:462
+msgid "Action:"
+msgstr "Action : "
+
+#: src/LYShowInfo.c:468
+msgid "(Form field)"
+msgstr "(champ de formulaire)"
+
+#: src/LYShowInfo.c:478
+msgid "No Links on the current page"
+msgstr "Aucun lien dans la page courante"
+
+#: src/LYShowInfo.c:483
+msgid "Server Headers:"
+msgstr "Entêtes serveur :"
+
+#: src/LYStyle.c:332
+#, c-format
+msgid ""
+"Syntax Error parsing style in lss file:\n"
+"[%s]\n"
+"The line must be of the form:\n"
+"OBJECT:MONO:COLOR (ie em:bold:brightblue:white)\n"
+"where OBJECT is one of EM,STRONG,B,I,U,BLINK etc.\n"
+"\n"
+msgstr ""
+"Erreur de syntaxe lors de l’analyse du style dans le fichier lss:\n"
+"[%s]\n"
+"La ligne doit être de la forme :\n"
+"OBJET:MONO:COULEUR (em:bold:brightblue:white)\n"
+"Où OBJET est un élément parmi EM,STRONG,B,I,U,BLINK etc.\n"
+"\n"
+
+#: src/LYStyle.c:941
+#, c-format
+msgid ""
+"\n"
+"Lynx file \"%s\" is not available.\n"
+"\n"
+msgstr ""
+"\n"
+"Le fichier Lynx « %s » n’est pas disponible.\n"
+"\n"
+
+#: src/LYTraversal.c:111
+msgid "here is a list of the history stack so that you may rebuild"
+msgstr "voici une liste de l’historique que vous pouvez reconstituer"
+
+#: src/LYUpload.c:77
+msgid "ERROR! - upload command is misconfigured"
+msgstr "ERREUR - commande d’envoi mal configurée"
+
+#: src/LYUpload.c:98
+msgid "Illegal redirection \"../\" found! Request ignored."
+msgstr "Redirection « ../ » non autorisée ; demande non traitée."
+
+#: src/LYUpload.c:101
+msgid "Illegal character \"/\" found! Request ignored."
+msgstr "Caractère « / » non autorisé ; demande non traitée."
+
+#: src/LYUpload.c:104
+msgid "Illegal redirection using \"~\" found! Request ignored."
+msgstr "Redirection avec « ~ » non autorisée ; demande non traitée."
+
+#: src/LYUpload.c:157
+msgid "Unable to upload file."
+msgstr "Impossible d’envoyer le fichier."
+
+#: src/LYUpload.c:196
+msgid "Upload To:"
+msgstr "Envoi vers :"
+
+#: src/LYUpload.c:197
+msgid "Upload options:"
+msgstr "Options d’envoi de fichiers :"
+
+#: src/LYUtils.c:1911
+msgid "Download document URL put to clipboard."
+msgstr "URL du document téléchargé copiée dans le presse-papiers."
+
+#: src/LYUtils.c:2658
+msgid "Unexpected access protocol for this URL scheme."
+msgstr "Protocole d’accès inattendu pour ce schéma l’URL"
+
+#: src/LYUtils.c:3571
+msgid "Too many tempfiles"
+msgstr "Trop de fichiers temporaires"
+
+#: src/LYUtils.c:3871
+msgid "unknown restriction"
+msgstr "restriction inconnue"
+
+#: src/LYUtils.c:3902
+#, c-format
+msgid "No restrictions set.\n"
+msgstr "Pas de restriction définie.\n"
+
+#: src/LYUtils.c:3905
+#, c-format
+msgid "Restrictions set:\n"
+msgstr "Définitions de restrictions :\n"
+
+#: src/LYUtils.c:5202
+msgid "Cannot find HOME directory"
+msgstr "Impossible de trouver le répertoire personnel (HOME)"
+
+#: src/LYrcFile.c:16
+msgid "Normally disabled. See ENABLE_LYNXRC in lynx.cfg\n"
+msgstr "Normalement désactivé(e). Voyez ENABLE_LYNXRC dans lynx.cfg\n"
+
+#: src/LYrcFile.c:373
+msgid ""
+"accept_all_cookies allows the user to tell Lynx to automatically\n"
+"accept all cookies if desired. The default is \"FALSE\" which will\n"
+"prompt for each cookie. Set accept_all_cookies to \"TRUE\" to accept\n"
+"all cookies.\n"
+msgstr ""
+"accept_all_cookies permet à l’utilisateur de dire à Lynx d’accepter\n"
+"automatiquement tous les cookies. « FALSE » (non) par défaut, donc\n"
+"demande pour chaque cookie. Mettre accept_all_cookies à « TRUE »\n"
+"(vrai) pour accepter tous les cookies.\n"
+
+#: src/LYrcFile.c:381
+msgid ""
+"anonftp_password allows the user to tell Lynx to use the personal\n"
+"email address as the password for anonymous ftp. If no value is given,\n"
+"Lynx will use the personal email address. Set anonftp_password\n"
+"to a different value if you choose.\n"
+msgstr ""
+"anonftp_password permet à l’utilisateur de faire utiliser par Lynx l’adresse\n"
+"mail personnelle comme mot de passe FTP anonyme. Si aucune valeur,\n"
+"précisée, Lynx utilise l’adresse personnelle. Fixer anonftp_password\n"
+"à une autre valeur si vous le souhaitez.\n"
+
+#: src/LYrcFile.c:390
+msgid ""
+"bookmark_file specifies the name and location of the default bookmark\n"
+"file into which the user can paste links for easy access at a later\n"
+"date.\n"
+msgstr ""
+"bookmark_file spécifie le nom et l’emplacement du fichier de signets par\n"
+"défaut dans lequel l’utilisateur peut copier des liens pour un accès\n"
+"rapide ultérieurement.\n"
+
+#: src/LYrcFile.c:395
+msgid ""
+"If case_sensitive_searching is \"on\" then when the user invokes a search\n"
+"using the 's' or '/' keys, the search performed will be case sensitive\n"
+"instead of case INsensitive. The default is usually \"off\".\n"
+msgstr ""
+"Si case_sensitive_searching est réglé à « on », lors d’une recherche au\n"
+"moyen des touches <s> ou </>, la recherche tient compte de la casse au lieu\n"
+"de prendre tous les caractères. La valeur par défaut est « off ».\n"
+
+#: src/LYrcFile.c:400
+msgid ""
+"The character_set definition controls the representation of 8 bit\n"
+"characters for your terminal. If 8 bit characters do not show up\n"
+"correctly on your screen you may try changing to a different 8 bit\n"
+"set or using the 7 bit character approximations.\n"
+"Current valid characters sets are:\n"
+msgstr ""
+"L’option character_set définit la représentation des caractères 8 bits\n"
+"pour votre terminal. Si de tels caractères 8 bits ne s’affichent pas\n"
+"correctement à l’écran, vous pouvez essayer de changer pour un jeu\n"
+"de caractères 8 bits différent ou utiliser les caractères approximatifs\n"
+"7 bits. Les jeux de caractères valides sont :\n"
+
+#: src/LYrcFile.c:408
+msgid ""
+"cookie_accept_domains and cookie_reject_domains are comma-delimited\n"
+"lists of domains from which Lynx should automatically accept or reject\n"
+"all cookies. If a domain is specified in both options, rejection will\n"
+"take precedence. The accept_all_cookies parameter will override any\n"
+"settings made here.\n"
+msgstr ""
+"cookie_accept_domains et cookie_reject_domains sont des listes de\n"
+"domaines séparés par des virgules dont Lynx accepte ou rejette\n"
+"les cookies. Si un domaine est précisé dans les deux, le rejet\n"
+"prévaut. Le paramètre accept_all_cookies est prioritaire sur les\n"
+"réglages précisés ici.\n"
+
+#: src/LYrcFile.c:416
+msgid ""
+"cookie_file specifies the file from which to read persistent cookies.\n"
+"The default is ~/"
+msgstr ""
+"cookie_file spécifie le fichier à partir duquel lire les cookies persistants\n"
+"Valeur par défaut : ~/"
+
+#: src/LYrcFile.c:421
+msgid ""
+"cookie_loose_invalid_domains, cookie_strict_invalid_domains, and\n"
+"cookie_query_invalid_domains are comma-delimited lists of which domains\n"
+"should be subjected to varying degrees of validity checking. If a\n"
+"domain is set to strict checking, strict conformance to RFC2109 will\n"
+"be applied. A domain with loose checking will be allowed to set cookies\n"
+"with an invalid path or domain attribute. All domains will default to\n"
+"querying the user for an invalid path or domain.\n"
+msgstr ""
+"cookie_loose_invalid_domains, cookie_strict_invalid_domains, et\n"
+"cookie_query_invalid_domains sont des listes de domaines séparés\n"
+"par des virgules soumis à divers degrés de validation. Si un domaine\n"
+"est « strict », la stricte conformation à RFC2109 est vérifiée.\n"
+"Un domaine « loose » est autorisé à poster des cookies avec un\n"
+"chemin ou un domaine non valides. Pour les autres domaines\n"
+"l’utilisateur sera prévenu en cas de mauvais chemin ou domaine.\n"
+
+#: src/LYrcFile.c:435
+msgid ""
+"dir_list_order specifies the directory list order under DIRED_SUPPORT\n"
+"(if implemented). The default is \"ORDER_BY_NAME\"\n"
+msgstr ""
+"dir_list_order spécifie l’ordre de listage des répertoires sous DIRED_SUPPORT\n"
+"(si implémenté). Par défaut : « ORDER_BY_NAME »\n"
+
+#: src/LYrcFile.c:440
+msgid ""
+"dir_list_styles specifies the directory list style under DIRED_SUPPORT\n"
+"(if implemented). The default is \"MIXED_STYLE\", which sorts both\n"
+"files and directories together. \"FILES_FIRST\" lists files first and\n"
+"\"DIRECTORIES_FIRST\" lists directories first.\n"
+msgstr ""
+"L’option dir_list_styles spécifie le style de liste de répertoires sous\n"
+"DIRED_SUPPORT (si l’option est offerte). La valeur « MIXED_STYLE »\n"
+"(défaut) trie fichiers et répertoires ensemble. La valeur « FILES_FIRST »\n"
+"permet de lister les fichiers d’abord tandis que « DIRECTORIES_FIRST »\n"
+"permet de lister les répertoires d’abord.\n"
+
+#: src/LYrcFile.c:448
+msgid ""
+"If emacs_keys is to \"on\" then the normal EMACS movement keys:\n"
+" ^N = down ^P = up\n"
+" ^B = left ^F = right\n"
+"will be enabled.\n"
+msgstr ""
+"Si emacs_keys est réglé à « on », le jeu de touches EMACS normal :\n"
+" <^N> = bas <^P> = haut\n"
+" <^B> = gauche <^F> = droite\n"
+"est activé.\n"
+
+#: src/LYrcFile.c:454
+msgid ""
+"file_editor specifies the editor to be invoked when editing local files\n"
+"or sending mail. If no editor is specified, then file editing is disabled\n"
+"unless it is activated from the command line, and the built-in line editor\n"
+"will be used for sending mail.\n"
+msgstr ""
+"file_editor spécifie l’éditeur pour l’édition de fichiers locaux ou l’envoi\n"
+"de courrier. Si aucun n’est précisé, l’édition de fichier est désactivée,\n"
+"à moins qu’elle soit activée de la ligne de commande, auquel cas l’éditeur\n"
+"de lignes sera utilisé pour l’envoi de courrier.\n"
+
+#: src/LYrcFile.c:461
+msgid ""
+"The file_sorting_method specifies which value to sort on when viewing\n"
+"file lists such as FTP directories. The options are:\n"
+" BY_FILENAME -- sorts on the name of the file\n"
+" BY_TYPE -- sorts on the type of the file\n"
+" BY_SIZE -- sorts on the size of the file\n"
+" BY_DATE -- sorts on the date of the file\n"
+msgstr ""
+"file_sorting_method spécifie le mode de tri à utiliser pour consulter\n"
+"des listes de fichiers tels que des répertoires FTP. Les options sont :\n"
+" BY_FILENAME -- tri selon le nom de fichier\n"
+" BY_TYPE -- tri selon le type de fichier\n"
+" BY_VOLUME -- tri selon la taille du fichier\n"
+" BY_DATE -- tri selon la date du fichier\n"
+
+#: src/LYrcFile.c:492
+msgid ""
+"lineedit_mode specifies the key binding used for inputting strings in\n"
+"prompts and forms. If lineedit_mode is set to \"Default Binding\" then\n"
+"the following control characters are used for moving and deleting:\n"
+"\n"
+" Prev Next Enter = Accept input\n"
+" Move char: <- -> ^G = Cancel input\n"
+" Move word: ^P ^N ^U = Erase line\n"
+" Delete char: ^H ^R ^A = Beginning of line\n"
+" Delete word: ^B ^F ^E = End of line\n"
+"\n"
+"Current lineedit modes are:\n"
+msgstr ""
+"lineedit_mode spécifie l’association de touche utilisée pour \n"
+"entrer des chaîne de caractères dans les formulaires et les.\n"
+"dialogues. Si lineedit_mode est égal à « Default Binding » alors\n"
+"les caractères de contrôle suivants seront utilisés pour se\n"
+"déplacer et effacer du texte:\n"
+"\n"
+" Précèdent Suivant Entrée = Accepter les données\n"
+"Déplacer car. < â†> < →> <^G> = Annuler les données\n"
+"Déplacer mot <^P> <^N> <^U> = Effacer la ligne.\n"
+"Effacer car. <^H> <^R> <^A> = Début de ligne.\n"
+"Effacer mot <^B> <^F> <^E> = Fin de ligne.\n"
+"\n"
+"Les modes d’édition de ligne courants sont :\n"
+
+#: src/LYrcFile.c:510
+msgid ""
+"The following allow you to define sub-bookmark files and descriptions.\n"
+"The format is multi_bookmark<capital_letter>=<filename>,<description>\n"
+"Up to 26 bookmark files (for the English capital letters) are allowed.\n"
+"We start with \"multi_bookmarkB\" since 'A' is the default (see above).\n"
+msgstr ""
+"Vous pouvez définir des sous-catégories de signets et de descriptions.\n"
+"Le format est multi_bookmark<lettre_majuscule>=<nom_de_fichier>,<description>\n"
+"vous pouvez définir jusque 26 fichiers de signets (pour les lettres de l’alphabet\n"
+"anglais). Commencez avec « multi_bookmarkB » car <A> est le fichier implicite\n"
+"(voir après).\n"
+
+#: src/LYrcFile.c:516
+msgid ""
+"personal_mail_address specifies your personal mail address. The\n"
+"address will be sent during HTTP file transfers for authorization and\n"
+"logging purposes, and for mailed comments.\n"
+"If you do not want this information given out, set the NO_FROM_HEADER\n"
+"to TRUE in lynx.cfg, or use the -nofrom command line switch. You also\n"
+"could leave this field blank, but then you won't have it included in\n"
+"your mailed comments.\n"
+msgstr ""
+"personal_mail_address spécifie votre adresse email personnelle. \n"
+"Cette adresse sera envoyée lors des transferts de fichiers HTTP comme\n"
+"moyen d’autorisation, de logs et pour les commentaires postés par mail.\n"
+"Si vous ne voulez pas que cette information soit communiquée, définissez\n"
+"la variable NO_FROM_HEADER comme étant vraie (TRUE) dans lynx.cfg,\n"
+"ou utilisez l’option -nofrom en ligne de commande. Vous pouvez aussi laisser\n"
+"ce champ vide, mais alors il n’apparaîtra pas dans vos commentaires postés.\n"
+
+#: src/LYrcFile.c:525
+msgid ""
+"personal_mail_name specifies your personal name, for mail. The\n"
+"name is sent for mailed comments. Lynx will prompt for this,\n"
+"showing the configured value as a default when sending mail.\n"
+"This is not necessarily the same as a name provided as part of the\n"
+"personal_mail_address.\n"
+"Lynx does not save your changes to that default value as a side-effect\n"
+"of sending email. To update the default value, you must use the options\n"
+"menu, or modify this file directly.\n"
+msgstr ""
+"personal_mail_name spécifie votre nom personnel, pour le courriel.\n"
+"Le nom est envoyé pour les commentaires par courriel. Lors de l’envoi\n"
+"d’un courriel, Lynx demande une valeur et propose celle par défaut.\n"
+"Ce n’est pas nécessairement le même nom que celui fourni par\n"
+"personal_mail_address.\n"
+"Lynx n’enregistre pas vos changements comme valeur par défaut lors de\n"
+"l’envoi de courriel. Pour mettre à jour la valeur par défaut, vous devez\n"
+"utiliser les options du menu ou modifier directement ce fichier.\n"
+
+#: src/LYrcFile.c:535
+msgid ""
+"preferred_charset specifies the character set in MIME notation (e.g.,\n"
+"ISO-8859-2, ISO-8859-5) which Lynx will indicate you prefer in requests\n"
+"to http servers using an Accept-Charset header. The value should NOT\n"
+"include ISO-8859-1 or US-ASCII, since those values are always assumed\n"
+"by default. May be a comma-separated list.\n"
+"If a file in that character set is available, the server will send it.\n"
+"If no Accept-Charset header is present, the default is that any\n"
+"character set is acceptable. If an Accept-Charset header is present,\n"
+"and if the server cannot send a response which is acceptable\n"
+"according to the Accept-Charset header, then the server SHOULD send\n"
+"an error response, though the sending of an unacceptable response\n"
+"is also allowed.\n"
+msgstr ""
+"preferred_charset spécifie la jeu de caractères en notation MIME (ç-à-d \n"
+"ISO-8859-2, ISO-8859-5) que lynx indiquera comme jeu de caractères préféré\n"
+"lors des requêtes http en utilisant l’entête Accept-Charset. Cette valeur\n"
+"ne dois PAS inclure ISO-8859-1 ou US-ASCII car ces valeurs sont toujours\n"
+"prises par défaut. La liste de choix peut être composée de types séparés par\n"
+"des virgules. Si un fichier dans ce jeu de caractères est disponible,\n"
+"le serveur vous l’enverra. Si il n’y a pas d’entête Accept-Charset,\n"
+"le comportement par défaut est d’accepter n’importe quel type de jeu de caractères\n"
+"Si il existe un entête Accept-Charset mais que le serveur ne peut renvoyer une\n"
+"réponse acceptable relativement à votre choix, le serveur DEVRAIT renvoyer un\n"
+"message d’erreur bien que le renvoi d’une réponse inacceptable soit permis.\n"
+
+#: src/LYrcFile.c:553
+msgid ""
+"preferred_language specifies the language in MIME notation (e.g., en,\n"
+"fr, may be a comma-separated list in decreasing preference)\n"
+"which Lynx will indicate you prefer in requests to http servers.\n"
+"If a file in that language is available, the server will send it.\n"
+"Otherwise, the server will send the file in its default language.\n"
+msgstr ""
+"preferred_language spécifie la langue selon le code MIME (ex. en,\n"
+"fr : liste de langues séparées par des virgules en ordre décroissant\n"
+"de préférence). Lynx tient compte des préférences lors des requêtes\n"
+"aux serveurs http. Si un fichier est disponible dans la langue précisée,\n"
+"le serveur l’envoie. Sinon, le serveur envoie le fichier dans la langue\n"
+"par défaut.\n"
+
+#: src/LYrcFile.c:564
+msgid ""
+"If run_all_execution_links is set \"on\" then all local execution links\n"
+"will be executed when they are selected.\n"
+"\n"
+"WARNING - This is potentially VERY dangerous. Since you may view\n"
+" information that is written by unknown and untrusted sources\n"
+" there exists the possibility that Trojan horse links could be\n"
+" written. Trojan horse links could be written to erase files\n"
+" or compromise security. This should only be set to \"on\" if\n"
+" you are viewing trusted source information.\n"
+msgstr ""
+"Si run_all_execution_links est réglé à « on », tous les liens actifs\n"
+"locaux sont exécutés lorsqu’ils sont sélectionnés.\n"
+"\n"
+"AVIS - Cette option est potentiellement très dangereuse car elle permet\n"
+" de voir de l’information écrite par des sources inconnues ou non\n"
+" fiables. Il existe un danger que des fichiers Cheval de Troie\n"
+" soient inclus. Les fichiers troyens peuvent provoquer\n"
+" l’effacement de fichiers ou compromettre la sécurité. Cette\n"
+" fonction devrait être réglée à « on » uniquement si vous\n"
+" consultez de l’information fiable.\n"
+
+#: src/LYrcFile.c:575
+msgid ""
+"If run_execution_links_on_local_files is set \"on\" then all local\n"
+"execution links that are found in LOCAL files will be executed when they\n"
+"are selected. This is different from run_all_execution_links in that\n"
+"only files that reside on the local system will have execution link\n"
+"permissions.\n"
+"\n"
+"WARNING - This is potentially dangerous. Since you may view\n"
+" information that is written by unknown and untrusted sources\n"
+" there exists the possibility that Trojan horse links could be\n"
+" written. Trojan horse links could be written to erase files\n"
+" or compromise security. This should only be set to \"on\" if\n"
+" you are viewing trusted source information.\n"
+msgstr ""
+"Si run_execution_links_on_local_files est réglé à « on », tous les liens\n"
+"actifs qui se trouvent dans des fichiers LOCAUX seront exécutés lorsque\n"
+"choisis. Cette option est différente de run_all_execution_links en ce que\n"
+"les permissions d’accès sont accordées uniquement pour les fichiers du\n"
+"système local.\n"
+"\n"
+"AVIS - Cette option est potentiellement très dangereuse car elle permet de\n"
+" voir de l’information écrite par des sources inconnues ou non fiables.\n"
+" Il existe un danger que des fichiers Cheval de Troie soient inclus.\n"
+" Les fichiers troyens peuvent provoquer l’effacement de fichiers ou\n"
+" compromettre la sécurité. Cette fonction devrait être réglée à\n"
+" « activé » uniquement si vous consultez de l’information fiable.\n"
+
+#: src/LYrcFile.c:593
+msgid ""
+"select_popups specifies whether the OPTIONs in a SELECT block which\n"
+"lacks a MULTIPLE attribute are presented as a vertical list of radio\n"
+"buttons or via a popup menu. Note that if the MULTIPLE attribute is\n"
+"present in the SELECT start tag, Lynx always will create a vertical list\n"
+"of checkboxes for the OPTIONs. A value of \"on\" will set popup menus\n"
+"as the default while a value of \"off\" will set use of radio boxes.\n"
+"The default can be overridden via the -popup command line toggle.\n"
+msgstr ""
+"select_popups spécifie si les OPTIONS d’un bloc SELECT qui ne\n"
+"contient pas l’attribut MULTIPLE doivent être présentés comme une liste\n"
+"verticale de boutons radio ou comme un menu popup. Notez que si l’attribut\n"
+"MULTIPLE est défini dans le tag SELECT, lynx créera toujours une liste\n"
+"verticale de cases à cocher pour chaque OPTION. Une valeur à « on »\n"
+"sélectionnera les menus popup par défaut alors qu’une valeur à « off »\n"
+"sélectionnera les boutons radio par défaut. Cette option peut être surchargée\n"
+"par l’option -popup en ligne de commande.\n"
+
+#: src/LYrcFile.c:604
+msgid ""
+"show_color specifies how to set the color mode at startup. A value of\n"
+"\"never\" will force color mode off (treat the terminal as monochrome)\n"
+"at startup even if the terminal appears to be color capable. A value of\n"
+"\"always\" will force color mode on even if the terminal appears to be\n"
+"monochrome, if this is supported by the library used to build lynx.\n"
+"A value of \"default\" will yield the behavior of assuming\n"
+"a monochrome terminal unless color capability is inferred at startup\n"
+"based on the terminal type, or the -color command line switch is used, or\n"
+"the COLORTERM environment variable is set. The default behavior always is\n"
+"used in anonymous accounts or if the \"option_save\" restriction is set.\n"
+"The effect of the saved value can be overridden via\n"
+"the -color and -nocolor command line switches.\n"
+"The mode set at startup can be changed via the \"show color\" option in\n"
+"the 'o'ptions menu. If the option settings are saved, the \"on\" and\n"
+"\"off\" \"show color\" settings will be treated as \"default\".\n"
+msgstr ""
+"show_color permet de paramétrer le mode couleur à l’initialisation. La\n"
+"valeur « never » désactive le mode couleur (ce qui équivaut à un terminal\n"
+"monochrome) même si le terminal est capable d’afficher les couleurs. La\n"
+"valeur « always » active le mode couleur même si le terminal est\n"
+"monochrome, en autant que cette valeur soit incluse dans la librairie\n"
+"utilisée pour créer Lynx. La valeur « default » suppose par défaut un\n"
+"terminal monochrome à moins que la capacité d’afficher les couleurs soit\n"
+"déterminée à l’initialisation en fonction du type de terminal, ou que\n"
+"l’option -color soit entrée à la ligne de commande, ou que la variable\n"
+"d’environnement soit réglée à COLORTERM. La valeur implicite est toujours\n"
+"utilisée dans le cas des connexions anonymes ou si la restriction\n"
+"« option_save » est activée. L’effet de la valeur enregistrée peut être\n"
+"annulé en permutant les options -color et -nocolor sur la ligne de\n"
+"commande. Le mode attribué à l’initialisation peut être modifié au moyen\n"
+"de l’option « afficher les couleurs » dans le menu Paramètres. Si les\n"
+"paramètres sont enregistrés, les attributs « on » et « off » de l’option\n"
+"« afficher les couleurs » <o> sont interprétés comme étant la valeur « default ».\n"
+
+#: src/LYrcFile.c:621
+msgid ""
+"show_cursor specifies whether to 'hide' the cursor to the right (and\n"
+"bottom, if possible) of the screen, or to place it to the left of the\n"
+"current link in documents, or current option in select popup windows.\n"
+"Positioning the cursor to the left of the current link or option is\n"
+"helpful for speech or braille interfaces, and when the terminal is\n"
+"one which does not distinguish the current link based on highlighting\n"
+"or color. A value of \"on\" will set positioning to the left as the\n"
+"default while a value of \"off\" will set 'hiding' of the cursor.\n"
+"The default can be overridden via the -show_cursor command line toggle.\n"
+msgstr ""
+"show_cursor permet d’indiquer si le curseur doit être caché à droite\n"
+"(et au bas, si possible) de l’écran, ou s’il doit être placé à la gauche du\n"
+"lien actif dans les documents, ou de l’option active dans les fenêtres\n"
+"flash. Le placement du curseur à la gauche de l’option ou du lien actif\n"
+"est utile dans le cas des interfaces de reconnaissance de la parole ou de\n"
+"braille, et quand le terminal est incapable de distinguer le lien actif au\n"
+"moyen de la surbrillance ou de la couleur. La valeur « on » règle le\n"
+"placement du curseur à la gauche par défaut, tandis que la valeur « off »\n"
+"équivaut à « cacher » le curseur de l’écran. La valeur implicite peut être\n"
+"annulée à la ligne de commande au moyen de l’option -show_cursor.\n"
+
+#: src/LYrcFile.c:632
+msgid ""
+"show_dotfiles specifies that the directory listing should include\n"
+"\"hidden\" (dot) files/directories. If set \"on\", this will be\n"
+"honored only if enabled via userdefs.h and/or lynx.cfg, and not\n"
+"restricted via a command line switch. If display of hidden files\n"
+"is disabled, creation of such files via Lynx also is disabled.\n"
+msgstr ""
+"Le paramètre show_dotfiles spécifie que la liste des répertoires doit\n"
+"inclure les fichiers et répertoires « cachés ». S’il est réglé à « on »,\n"
+"il n’est pris en compte que s’il est activé dans userdefs.h et/ou lynx.cfg\n"
+"et s’il n’est pas restreint par une option de la ligne de commande. Si\n"
+"l’affichage des fichiers cachés est désactivé, la création de tels fichiers\n"
+"dans Lynx est aussi désactivée.\n"
+
+#: src/LYrcFile.c:643
+msgid ""
+"If sub_bookmarks is not turned \"off\", and multiple bookmarks have\n"
+"been defined (see below), then all bookmark operations will first\n"
+"prompt the user to select an active sub-bookmark file. If the default\n"
+"Lynx bookmark_file is defined (see above), it will be used as the\n"
+"default selection. When this option is set to \"advanced\", and the\n"
+"user mode is advanced, the 'v'iew bookmark command will invoke a\n"
+"statusline prompt instead of the menu seen in novice and intermediate\n"
+"user modes. When this option is set to \"standard\", the menu will be\n"
+"presented regardless of user mode.\n"
+msgstr ""
+"Si le sub_bookmark n’est pas désactivé « off » et que les signets\n"
+"multiples (cf plus bas) ont étés définis, alors toutes les opérations\n"
+"relatives aux signets déclencheront un dialogue utilisateur afin qu’il\n"
+"puisse sélectionner un fichier de sous signet actif. Si le fichier \n"
+"de signets par défaut est défini (cf plus haut), il sera utilisé comme\n"
+"la sélection par défaut. Lorsque cette option est fixée à « advanced »\n"
+"et que le mode d’utilisation est avancé, la commande <v> voire les signets\n"
+"invoquera un prompt sur la ligne d’état au lieu du menu qui apparait dans les\n"
+"modes novices et intermédiaires. Lorsque cette option est définie comme \n"
+"« standard », le menu apparaîtra quelque soit le mode d’utilisation.\n"
+
+#: src/LYrcFile.c:658
+msgid ""
+"user_mode specifies the users level of knowledge with Lynx. The\n"
+"default is \"NOVICE\" which displays two extra lines of help at the\n"
+"bottom of the screen to aid the user in learning the basic Lynx\n"
+"commands. Set user_mode to \"INTERMEDIATE\" to turn off the extra info.\n"
+"Use \"ADVANCED\" to see the URL of the currently selected link at the\n"
+"bottom of the screen.\n"
+msgstr ""
+"Le paramètre user_mode spécifie le niveau de connaissance de Lynx par\n"
+"l’utilisateur. La valeur « NOVICE » (défaut) commande l’affichage de deux\n"
+"lignes supplémentaires d’aide au bas de l’écran pour aider l’utilisateur à\n"
+"apprendre les commandes Lynx de base. Réglez le paramètre user_mode à\n"
+"« INTERMEDIATE » pour éliminer ces lignes. Utilisez l’option « ADVANCED » pour\n"
+"afficher l’URL du lien sélectionné au bas de l’écran.\n"
+
+#: src/LYrcFile.c:667
+msgid ""
+"If verbose_images is \"on\", lynx will print the name of the image\n"
+"source file in place of [INLINE], [LINK] or [IMAGE]\n"
+"See also VERBOSE_IMAGES in lynx.cfg\n"
+msgstr ""
+"Si verbose_images est à « on », lynx affichera les noms des fichiers\n"
+"sources d’images au lieu de [INLINE],[LINK] ou [IMAGE]\n"
+"Voir aussi VERBOSE_IMAGES dans lynx.cfg\n"
+
+#: src/LYrcFile.c:672
+msgid ""
+"If vi_keys is set to \"on\", then the normal VI movement keys:\n"
+" j = down k = up\n"
+" h = left l = right\n"
+"will be enabled. These keys are only lower case.\n"
+"Capital 'H', 'J' and 'K will still activate help, jump shortcuts,\n"
+"and the keymap display, respectively.\n"
+msgstr ""
+"Si vi_keys est réglé à « on », le mouvement de touches VI normal :\n"
+" <j> = bas <k> = haut\n"
+" <h> = gauche <l> = droite\n"
+"est activé. Ces touches sont en minuscule uniquement.\n"
+"Les majuscules <H>, <J> et <K> activent l’aide, les touches de raccourci\n"
+"et la configuration des touches respectivement.\n"
+
+#: src/LYrcFile.c:680
+msgid ""
+"The visited_links setting controls how Lynx organizes the information\n"
+"in the Visited Links Page.\n"
+msgstr ""
+"L’option visited_links contrôle la façon dont Lynx organise les informations\n"
+"sur la page Liens visités.\n"
+
+#: src/LYrcFile.c:924
+msgid ""
+"If keypad_mode is set to \"NUMBERS_AS_ARROWS\", then the numbers on\n"
+"your keypad when the numlock is on will act as arrow keys:\n"
+" 8 = Up Arrow\n"
+" 4 = Left Arrow 6 = Right Arrow\n"
+" 2 = Down Arrow\n"
+"and the corresponding keyboard numbers will act as arrow keys,\n"
+"regardless of whether numlock is on.\n"
+msgstr ""
+"Si keypad_mode est définit comme « NUMBERS_AS_ARROWS », alors les \n"
+"chiffres de votre pavé numérique se comporteront comme des flèches\n"
+"lorsque numlock est à on:\n"
+" <8> = haut \n"
+" <4> = gauche <6> = droite \n"
+" <2> = bas \n"
+"et les chiffres correspondants de votre clavier se comporteront\n"
+"comme des flèches, quelque soit l’état du numlock.\n"
+
+#: src/LYrcFile.c:933
+msgid ""
+"If keypad_mode is set to \"LINKS_ARE_NUMBERED\", then numbers will\n"
+"appear next to each link and numbers are used to select links.\n"
+msgstr ""
+"Si keypad_mode est défini comme « LINKS_ARE_NUMBERED » ; alors des \n"
+"nombres apparaitront à coté des liens afin de pouvoir les sélectionner.\n"
+
+#: src/LYrcFile.c:937
+msgid ""
+"If keypad_mode is set to \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\", then\n"
+"numbers will appear next to each link and visible form input field.\n"
+"Numbers are used to select links, or to move the \"current link\" to a\n"
+"form input field or button. In addition, options in popup menus are\n"
+"indexed so that the user may type an option number to select an option in\n"
+"a popup menu, even if the option isn't visible on the screen. Reference\n"
+"lists and output from the list command also enumerate form inputs.\n"
+msgstr ""
+"Si keypad_mode est défini comme « LINKS_AND_FORM_FIELDS_ARE_NUMBERED »,\n"
+"alors des nombres apparaîtront à coté de chaque liens et des champs\n"
+"de formulaires. Ces nombres seront utilisés pour sélectionner un lien,\n"
+"ou pour déplacer le « lien courant » vers un champ de formulaire ou \n"
+"un bouton. En plus, les options des menus popup seront indexées afin que\n"
+"l’utilisateur puisse taper un chiffre pour sélectionner une option de l’un\n"
+"de ces menus,même si cette option n’est pas visible à l’écran. Les listes\n"
+"de référence et les sorties de ces listes de commandes énumèrent aussi les\n"
+"champs de formulaires.\n"
+
+#: src/LYrcFile.c:946
+msgid ""
+"NOTE: Some fixed format documents may look disfigured when\n"
+"\"LINKS_ARE_NUMBERED\" or \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\" are\n"
+"enabled.\n"
+msgstr ""
+"NB : certains formats de document peuvent apparaître défigurés\n"
+"lorsque « LINKS_ARE_NUMBERED » ou « LINKS_AND_FORM_FIELDS_ARE_NUMBERED »\n"
+"sont activés.\n"
+
+#: src/LYrcFile.c:978
+msgid ""
+"Lynx User Defaults File\n"
+"\n"
+msgstr ""
+"Fichier de paramètres utilisateur par défaut de Lynx\n"
+"\n"
+
+#: src/LYrcFile.c:987
+msgid ""
+"This file contains options saved from the Lynx Options Screen (normally\n"
+"with the 'o' key). To save options with that screen, you must select the\n"
+"checkbox:\n"
+msgstr ""
+"Ce fichier contient les options sauvegardées depuis l’écran d’options Lynx\n"
+"(normalement, touche <o>). Pour sauvegarder les options de cet écran,\n"
+"vous devez sélectionner la case à cocher :\n"
+
+#: src/LYrcFile.c:994
+msgid ""
+"You must then save the settings using the link on the line above the\n"
+"checkbox:\n"
+msgstr ""
+"Vous devez maintenant enregistrer les réglages à l’aide du lien sur la\n"
+"ligne au-dessus de la case à cocher :\n"
+
+#: src/LYrcFile.c:1001
+msgid ""
+"You may also use the command-line option \"-forms_options\", which displays\n"
+"the simpler Options Menu instead. Save options with that using the '>' key.\n"
+"\n"
+msgstr ""
+"Vous pouvez aussi utiliser la commande en ligne -forms_options, qui fait\n"
+"apparaître le menu d’options simplifié à la place. Enregistrez ces options en\n"
+"utilisant la touche <>>.\n"
+
+#: src/LYrcFile.c:1008
+msgid ""
+"This file contains options saved from the Lynx Options Screen (normally\n"
+"with the '>' key).\n"
+"\n"
+msgstr ""
+"Ce fichier contient les options enregistrées depuis l’écran d’options Lynx\n"
+"(normalement, touche <>>).\n"
+"\n"
+
+#: src/LYrcFile.c:1015
+msgid ""
+"There is normally no need to edit this file manually, since the defaults\n"
+"here can be controlled from the Options Screen, and the next time options\n"
+"are saved from the Options Screen this file will be completely rewritten.\n"
+"You have been warned...\n"
+"\n"
+"If you are looking for the general configuration file - it is normally\n"
+"called \"lynx.cfg\". It has different content and a different format.\n"
+"It is not this file.\n"
+msgstr ""
+"Il n’y a normalement pas besoin d’éditer ce fichier à la main, puisque les\n"
+"réglages par défaut se font via l’écran Options, et que la prochaine fois\n"
+"ce fichier sera modifié avec les valeurs de cet écran.\n"
+"Vous êtes prévenu…\n"
+"\n"
+"Si vous cherchez le fichier de configuration générale il est normalement\n"
+"nommé « lynx.cfg ». Son contenu et son format sont différents.\n"
+"Il ne s’agit pas de ce fichier.\n"
diff --git a/po/hu.po b/po/hu.po
new file mode 100644
index 0000000..152002d
--- /dev/null
+++ b/po/hu.po
@@ -0,0 +1,6098 @@
+# A Lynx szöveges webböngészõ program magyar fordításai
+# Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
+# Mihály Gyulai <gyulai@fbi.hu>, 2004.
+# Elsõ fordító: Gábor István <stive@mezobereny.hu>, 2002.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: lynx 2.8.6-dev8\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-12-07 20:02-0500\n"
+"PO-Revision-Date: 2004-11-14 19:52+0100\n"
+"Last-Translator: Mihály Gyulai <gyulai@fbi.hu>\n"
+"Language-Team: Hungarian <translation-team-hu@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-2\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. ******************************************************************
+#. * The following definitions are for status line prompts, messages, or
+#. * warnings issued by Lynx during program execution. You can modify
+#. * them to make them more appropriate for your site. We recommend that
+#. * you extend these definitions to other languages using the gettext
+#. * library. There are also scattered uses of 'gettext()' throughout the
+#. * Lynx source, covering all but those messages which (a) are used for
+#. * debugging (CTRACE) or (b) are constants used in interaction with
+#. * other programs.
+#. *
+#. * Links to collections of alternate definitions, developed by the Lynx
+#. * User Community, are maintained in Lynx links:
+#. *
+#. * http://www.subir.com/lynx.html
+#. *
+#. * See ABOUT-NLS and po/readme for details and location of contributed
+#. * translations. When no translation is available, the English default is
+#. * used.
+#.
+#: LYMessages.c:32
+#, c-format
+msgid "Alert!: %s"
+msgstr "Figyelem!: %s"
+
+#: LYMessages.c:33
+msgid "Welcome"
+msgstr "Üdvözöljük"
+
+#: LYMessages.c:34
+msgid "Are you sure you want to quit?"
+msgstr "Ki akar lépni a programból?"
+
+#: LYMessages.c:36
+msgid "Really exit from Lynx?"
+msgstr "Kilép a Lynx-bõl?"
+
+#: LYMessages.c:38
+msgid "Connection interrupted."
+msgstr "A kapcsolat megszakadt."
+
+#: LYMessages.c:39
+msgid "Data transfer interrupted."
+msgstr "Az adatátvitel megszakadt."
+
+#: LYMessages.c:40
+msgid "Cancelled!!!"
+msgstr "Megszakítva!!!"
+
+#: LYMessages.c:41
+msgid "Cancelling!"
+msgstr "Megszakítás!"
+
+#: LYMessages.c:42
+msgid "Excellent!!!"
+msgstr "Kitûnõ!!!"
+
+#: LYMessages.c:43
+msgid "OK"
+msgstr "RENDBEN"
+
+#: LYMessages.c:44
+msgid "Done!"
+msgstr "Kész!"
+
+#: LYMessages.c:45
+msgid "Bad request!"
+msgstr "Hibás kérés!"
+
+#: LYMessages.c:46
+msgid "previous"
+msgstr "elõzõ"
+
+#: LYMessages.c:47
+msgid "next screen"
+msgstr "következõ képernyõ"
+
+#: LYMessages.c:48
+msgid "HELP!"
+msgstr "További segítség az opciókhoz"
+
+#: LYMessages.c:49
+msgid ", help on "
+msgstr ", segítség "
+
+#. #define HELP
+#: LYMessages.c:51
+msgid "Commands: Use arrow keys to move, '?' for help, 'q' to quit, '<-' to go back."
+msgstr "Le-föl billentyû: mozgás, ?: súgó, q: kilép, balra nyíl: vissza"
+
+#. #define MOREHELP
+#: LYMessages.c:53
+msgid "-- press space for more, use arrow keys to move, '?' for help, 'q' to quit."
+msgstr "-- Szóköz: tovább, le-föl nyíl: mozgás, ?: súgó, q: kilép"
+
+#: LYMessages.c:54
+msgid "-- press space for next page --"
+msgstr "-- Szóköz: következõ oldal --"
+
+#: LYMessages.c:55
+msgid "URL too long"
+msgstr "Az URL túl hosszú"
+
+#. Inactive input fields, messages used with -tna option - kw
+#. #define FORM_LINK_TEXT_MESSAGE_INA
+#: LYMessages.c:61
+msgid "(Text entry field) Inactive. Press <return> to activate."
+msgstr "(Szövegbeviteli mezõ). Nem aktív. <return>: aktivál"
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_INA
+#: LYMessages.c:63
+msgid "(Textarea) Inactive. Press <return> to activate."
+msgstr "(Szöveges terület). Nem aktív. <return>: aktivál"
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_INA_E
+#: LYMessages.c:65
+#, c-format
+msgid "(Textarea) Inactive. Press <return> to activate (%s for editor)."
+msgstr "(Szövegmezõ). Nem aktív. <return>: aktivál. (%s szerkesztõvel)"
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE_INA
+#: LYMessages.c:67
+msgid "(Form field) Inactive. Use <return> to edit."
+msgstr "(Ûrlap mezõ). Nem aktív. <return>: szerkeszt"
+
+#. #define FORM_TEXT_SUBMIT_MESSAGE_INA_X
+#: LYMessages.c:69
+#, c-format
+msgid "(Form field) Inactive. Use <return> to edit (%s to submit with no cache)."
+msgstr "(Ûrlap mezõ). Nem aktív. <return>: szerkeszt (%s: gyorsítótár nélküli küldés)"
+
+#. #define FORM_TEXT_RESUBMIT_MESSAGE_INA
+#: LYMessages.c:71
+msgid "(Form field) Inactive. Press <return> to edit, press <return> twice to submit."
+msgstr "(Ûrlap mezõ). Nem aktív. <return>: szerkeszt, 2x <return>: elküld"
+
+#. #define FORM_TEXT_SUBMIT_MAILTO_MSG_INA
+#: LYMessages.c:73
+msgid "(mailto form field) Inactive. Press <return> to change."
+msgstr "(címzés mezõ). Nem aktív. <return>: váltás"
+
+#. #define FORM_LINK_PASSWORD_MESSAGE_INA
+#: LYMessages.c:75
+msgid "(Password entry field) Inactive. Press <return> to activate."
+msgstr "(Jelszó mezõ). Nem aktív. <return>: aktivál"
+
+#. #define FORM_LINK_FILE_UNM_MSG
+#: LYMessages.c:78
+msgid "UNMODIFIABLE file entry field. Use UP or DOWN arrows or tab to move off."
+msgstr "MÓDOSÍTHATATLAN fájl megadási mezõ. Le-föl nyíl, Tab: kilép"
+
+#. #define FORM_LINK_FILE_MESSAGE
+#: LYMessages.c:80
+msgid "(File entry field) Enter filename. Use UP or DOWN arrows or tab to move off."
+msgstr "(Fájl megadási mezõ). Kérem a fájl nevét. Le-föl nyíl, Tab: kilép"
+
+#. #define FORM_LINK_TEXT_MESSAGE
+#: LYMessages.c:82
+msgid "(Text entry field) Enter text. Use UP or DOWN arrows or tab to move off."
+msgstr "(Szövegbeviteli mezõ). Kérem a szöveget. Le-föl nyíl, Tab: kilép"
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE
+#: LYMessages.c:84
+msgid "(Textarea) Enter text. Use UP/DOWN arrows or TAB to move off."
+msgstr "(Szöveges terület). Kérem a szöveget. Le-föl nyíl, Tab: kilép"
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_E
+#: LYMessages.c:86
+#, c-format
+msgid "(Textarea) Enter text. Use UP/DOWN arrows or TAB to move off (%s for editor)."
+msgstr "(Szöveges terület). Kérem a szöveget. Le-föl nyíl, Tab: kilép. (%s szerkesztõ)"
+
+#. #define FORM_LINK_TEXT_UNM_MSG
+#: LYMessages.c:88
+msgid "UNMODIFIABLE form text field. Use UP or DOWN arrows or tab to move off."
+msgstr "MÓDOSÍTHATATLAN szöveg mezõ. Le-föl nyíl, Tab: kilép"
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE
+#: LYMessages.c:90
+msgid "(Form field) Enter text. Use <return> to submit."
+msgstr "(Ûrlap mezõ). Kérem a szöveget. <return>: elküld"
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE_X
+#: LYMessages.c:92
+#, c-format
+msgid "(Form field) Enter text. Use <return> to submit (%s for no cache)."
+msgstr "(Ûrlap mezõ). Kérem a szöveget. <return>: elküld (%s: gyorstár nélküli küldés)"
+
+#. #define FORM_LINK_TEXT_RESUBMIT_MESSAGE
+#: LYMessages.c:94
+msgid "(Form field) Enter text. Use <return> to submit, arrows or tab to move off."
+msgstr "(Ûrlap mezõ). Kérem a szöveget. <return>: elküld. Le-föl nyíl, Tab: kilép"
+
+#. #define FORM_LINK_TEXT_SUBMIT_UNM_MSG
+#: LYMessages.c:96
+msgid "UNMODIFIABLE form field. Use UP or DOWN arrows or tab to move off."
+msgstr "MÓDOSÍTHATATLAN ûrlap mezõ. Le-föl nyíl, Tab: kilép"
+
+#. #define FORM_LINK_TEXT_SUBMIT_MAILTO_MSG
+#: LYMessages.c:98
+msgid "(mailto form field) Enter text. Use <return> to submit, arrows to move off."
+msgstr "(Levelezõ mezõ). Kérem a szöveget. <return>: elküld. Le-föl nyíl, Tab: kilép"
+
+#. #define FORM_LINK_TEXT_SUBMIT_MAILTO_DIS_MSG
+#: LYMessages.c:100
+msgid "(mailto form field) Mail is disallowed so you cannot submit."
+msgstr "(címzés mezõ). A levelezés használata nincs engedélyezve, nem tudjuk elküldeni."
+
+#. #define FORM_LINK_PASSWORD_MESSAGE
+#: LYMessages.c:102
+msgid "(Password entry field) Enter text. Use UP or DOWN arrows or tab to move off."
+msgstr "(Jelszó mezõ). Kérem a szöveget. Le-föl nyíl, Tab: kilép"
+
+#. #define FORM_LINK_PASSWORD_UNM_MSG
+#: LYMessages.c:104
+msgid "UNMODIFIABLE form password. Use UP or DOWN arrows or tab to move off."
+msgstr "MÓDOSÍTHATATLAN jelszó mezõ. Le-föl nyíl, Tab: kilép"
+
+#. #define FORM_LINK_CHECKBOX_MESSAGE
+#: LYMessages.c:106
+msgid "(Checkbox Field) Use right-arrow or <return> to toggle."
+msgstr "(Jelölõnégyzet mezõ). Jobb nyíl vagy <return>: kijelöl"
+
+#. #define FORM_LINK_CHECKBOX_UNM_MSG
+#: LYMessages.c:108
+msgid "UNMODIFIABLE form checkbox. Use UP or DOWN arrows or tab to move off."
+msgstr "MÓDOSÍTHATATLAN jelölõnégyzet. Le-föl nyíl, Tab: kilép"
+
+#. #define FORM_LINK_RADIO_MESSAGE
+#: LYMessages.c:110
+msgid "(Radio Button) Use right-arrow or <return> to toggle."
+msgstr "(Választógomb). Jobbra nyíl vagy <return>: kijelöl"
+
+#. #define FORM_LINK_RADIO_UNM_MSG
+#: LYMessages.c:112
+msgid "UNMODIFIABLE form radio button. Use UP or DOWN arrows or tab to move off."
+msgstr "MÓDOSÍTHATATLAN választógomb. Le-föl nyíl, Tab: kilép"
+
+#. #define FORM_LINK_SUBMIT_PREFIX
+#: LYMessages.c:114
+msgid "Submit ('x' for no cache) to "
+msgstr "Elküldés (x: gyorstár nélküli küldés) "
+
+#. #define FORM_LINK_RESUBMIT_PREFIX
+#: LYMessages.c:116
+msgid "Submit to "
+msgstr "Küldés "
+
+#. #define FORM_LINK_SUBMIT_MESSAGE
+#: LYMessages.c:118
+msgid "(Form submit button) Use right-arrow or <return> to submit ('x' for no cache)."
+msgstr "(Ûrlap küldõ gomb). Jobbra nyíl vagy <return>: ('x': gyorstár nélküli küldés)"
+
+#. #define FORM_LINK_RESUBMIT_MESSAGE
+#: LYMessages.c:120
+msgid "(Form submit button) Use right-arrow or <return> to submit."
+msgstr "(Ûrlap küldõ gomb). Jobbra nyíl vagy <return>: elküld"
+
+#. #define FORM_LINK_SUBMIT_DIS_MSG
+#: LYMessages.c:122
+msgid "DISABLED form submit button. Use UP or DOWN arrows or tab to move off."
+msgstr "A küldés gomb le van tiltva. Le-föl nyíl, Tab: kilép"
+
+#. #define FORM_LINK_SUBMIT_MAILTO_PREFIX
+#: LYMessages.c:124
+msgid "Submit mailto form to "
+msgstr "Levél küldése "
+
+#. #define FORM_LINK_SUBMIT_MAILTO_MSG
+#: LYMessages.c:126
+msgid "(mailto form submit button) Use right-arrow or <return> to submit."
+msgstr "(Levélküldõ gomb). Jobbra nyíl vagy <return>: elküld"
+
+#. #define FORM_LINK_SUBMIT_MAILTO_DIS_MSG
+#: LYMessages.c:128
+msgid "(mailto form submit button) Mail is disallowed so you cannot submit."
+msgstr "(Levélküldõ gomb). A levelezés le van tiltva, nem lehet elküldeni."
+
+#. #define FORM_LINK_RESET_MESSAGE
+#: LYMessages.c:130
+msgid "(Form reset button) Use right-arrow or <return> to reset form to defaults."
+msgstr "(Ûrlap törlés gomb). Jobbra nyíl vagy <return>: alaphelyzetbe hoz"
+
+#. #define FORM_LINK_RESET_DIS_MSG
+#: LYMessages.c:132
+msgid "DISABLED form reset button. Use UP or DOWN arrows or tab to move off."
+msgstr "A törlés gomb le van tiltva. Le-föl nyíl, Tab: kilép"
+
+#. #define FORM_LINK_OPTION_LIST_MESSAGE
+#: LYMessages.c:134
+msgid "(Option list) Hit return and use arrow keys and return to select option."
+msgstr "(Legördülõ menü). <return>, jobbra nyíl: belép"
+
+#. #define CHOICE_LIST_MESSAGE
+#: LYMessages.c:136
+msgid "(Choice list) Hit return and use arrow keys and return to select option."
+msgstr "(Választó lista). Le-föl nyíl: mozgás, <return>: választ"
+
+#. #define FORM_LINK_OPTION_LIST_UNM_MSG
+#: LYMessages.c:138
+msgid "UNMODIFIABLE option list. Use return or arrow keys to review or leave."
+msgstr "MÓDOSÍTHATATLAN legördülõ menü. <return>: megnéz, le-föl nyíl: kilép"
+
+#. #define CHOICE_LIST_UNM_MSG
+#: LYMessages.c:140
+msgid "UNMODIFIABLE choice list. Use return or arrow keys to review or leave."
+msgstr "MÓDOSÍTHATATLAN választó lista. <return>: megnéz, le-föl nyíl: kilép"
+
+#: LYMessages.c:141
+msgid "Submitting form..."
+msgstr "Ûrlap elküldése..."
+
+#: LYMessages.c:142
+msgid "Resetting form..."
+msgstr "Ûrlap törlése..."
+
+#. #define RELOADING_FORM
+#: LYMessages.c:144
+msgid "Reloading document. Any form entries will be lost!"
+msgstr "Dokumentum újratöltése: Az összes bejegyzés el fog veszni!"
+
+#: LYMessages.c:145
+#, c-format
+msgid "Warning: Cannot transcode form data to charset %s!"
+msgstr "Figyelem: Nem lehet átkódolni az adatokat a(z) %s karakterkészletre!"
+
+#. #define NORMAL_LINK_MESSAGE
+#: LYMessages.c:148
+msgid "(NORMAL LINK) Use right-arrow or <return> to activate."
+msgstr "(HIVATKOZÁS). Jobbra nyíl vagy <return>: kiválaszt"
+
+#: LYMessages.c:149
+msgid "The resource requested is not available at this time."
+msgstr "A kívánt erõforrás most nem áll rendelkezésre."
+
+#: LYMessages.c:150
+msgid "Enter Lynx keystroke command: "
+msgstr "Kérem a Lynx billentyû-parancsot: "
+
+#: LYMessages.c:151
+msgid "Looking up "
+msgstr "Keresés "
+
+#: LYMessages.c:152
+#, c-format
+msgid "Getting %s"
+msgstr "%s lekérdezése"
+
+#: LYMessages.c:153
+#, c-format
+msgid "Skipping %s"
+msgstr "%s kihagyása"
+
+#: LYMessages.c:154
+#, c-format
+msgid "Using %s"
+msgstr "%s használata"
+
+#: LYMessages.c:155
+#, c-format
+msgid "Illegal URL: %s"
+msgstr "Érvénytelen URL: %s"
+
+#: LYMessages.c:156
+#, c-format
+msgid "Badly formed address %s"
+msgstr "Hibás címzés %s"
+
+#: LYMessages.c:157
+#, c-format
+msgid "URL: %s"
+msgstr "URL: %s"
+
+#: LYMessages.c:158
+msgid "Unable to access WWW file!!!"
+msgstr "Nem lehet elérni WWW fájlt!"
+
+#: LYMessages.c:159
+#, c-format
+msgid "This is a searchable index. Use %s to search."
+msgstr "Ez egy kereshetõ index. Használja a %s-t a kereséshez."
+
+#. #define WWW_INDEX_MORE_MESSAGE
+#: LYMessages.c:161
+#, c-format
+msgid "--More-- This is a searchable index. Use %s to search."
+msgstr "--Tovább-- Ez egy kereshetõ index. Használja a %s-t a kereséshez."
+
+#: LYMessages.c:162
+msgid "You have entered an invalid link number."
+msgstr "Ön egy érvénytelen hivatkozás-számot írt be."
+
+#. #define SOURCE_HELP
+#: LYMessages.c:164
+msgid "Currently viewing document source. Press '\\' to return to rendered version."
+msgstr "Ez a dokumentum forrása. Nyomja le a \\-t a normál nézethez."
+
+#. #define NOVICE_LINE_ONE
+#: LYMessages.c:166
+msgid " Arrow keys: Up and Down to move. Right to follow a link; Left to go back. \n"
+msgstr " Le-föl nyilak: mozgás. Jobbra nyíl: hivatkozást követ; Balra nyíl: visszalép.\n"
+
+#. #define NOVICE_LINE_TWO
+#: LYMessages.c:168
+msgid " H)elp O)ptions P)rint G)o M)ain screen Q)uit /=search [delete]=history list \n"
+msgstr "H: Súgó, O: Beállít, P: Nyomtat, M:Fõablak, Q:Kilép, /:Keres\n"
+
+#. #define NOVICE_LINE_TWO_A
+#: LYMessages.c:170
+msgid " O)ther cmds H)elp K)eymap G)oto P)rint M)ain screen o)ptions Q)uit \n"
+msgstr "O:Parancs, H:Súgó, K:Bill., G:Ugrik, P:Nyomtat, M:Fõoldal, O:Beállít, Q:Kilép\n"
+
+#. #define NOVICE_LINE_TWO_B
+#: LYMessages.c:172
+msgid " O)ther cmds B)ack E)dit D)ownload ^R)eload ^W)ipe screen search doc: / \n"
+msgstr "O:Parancs, B:Vissza, E:Szerk., D:Letölt, Ctl-R:Újratölt, Ctl-W:Frissít, /:Keres\n"
+
+#. #define NOVICE_LINE_TWO_C
+#: LYMessages.c:174
+msgid "O)ther cmds C)omment History: <backspace> Bookmarks: V)iew, A)dd, R)emove \n"
+msgstr "O:Parancs, C:Megj., BS:Elõzmény, Könyvjelzõnél: V:Néz, A:Új, R:Töröl\n"
+
+#. #define FORM_NOVICELINE_ONE
+#: LYMessages.c:176
+msgid " Enter text into the field by typing on the keyboard "
+msgstr " Írja be a szöveget a mezõbe "
+
+#. #define FORM_NOVICELINE_TWO
+#: LYMessages.c:178
+msgid " Ctrl-U to delete all text in field, [Backspace] to delete a character "
+msgstr " Ctrl-U: kitörli az egész szöveget, [Backspace]: egy karaktert töröl "
+
+#. #define FORM_NOVICELINE_TWO_DELBL
+#: LYMessages.c:180
+msgid " Ctrl-U to delete text in field, [Backspace] to delete a character "
+msgstr " Ctrl-U: kitörli a szöveget a mezõbõl, [Backspace]: egy karaktert töröl "
+
+#. #define FORM_NOVICELINE_TWO_VAR
+#: LYMessages.c:182
+#, c-format
+msgid " %s to delete all text in field, [Backspace] to delete a character "
+msgstr " %s kitörli az egész szöveget, [Backspace]: egy karaktert töröl "
+
+#. #define FORM_NOVICELINE_TWO_DELBL_VAR
+#: LYMessages.c:184
+#, c-format
+msgid " %s to delete text in field, [Backspace] to delete a character "
+msgstr " %s kitörli a szöveget, [Backspace]: egy karaktert töröl "
+
+#. mailto
+#: LYMessages.c:187
+msgid "Malformed mailto form submission! Cancelled!"
+msgstr "Hibás levél kitöltés! Megszakítva!"
+
+#: LYMessages.c:188
+msgid "Warning! Control codes in mail address replaced by ?"
+msgstr "Figyelmeztetés! Az ellenõrzõ kódokat a levél címében kicserélte?"
+
+#: LYMessages.c:189
+msgid "Mail disallowed! Cannot submit."
+msgstr "A levelezés le van tiltva! Nem lehet elküldeni."
+
+#: LYMessages.c:190
+msgid "Mailto form submission failed!"
+msgstr "A levél küldése nem sikerült!"
+
+#: LYMessages.c:191
+msgid "Mailto form submission Cancelled!!!"
+msgstr "A levél küldése megszakítva!"
+
+#: LYMessages.c:192
+msgid "Sending form content..."
+msgstr "Ûrlap tartalmának küldése..."
+
+#: LYMessages.c:193
+msgid "No email address is present in mailto URL!"
+msgstr "Nincs email cím ebben a \"mailto\" URL-ben!"
+
+#. #define MAILTO_URL_TEMPOPEN_FAILED
+#: LYMessages.c:195
+msgid "Unable to open temporary file for mailto URL!"
+msgstr "Nem lehet az átmeneti fájlt megnyitni a levelezõ URL-hez"
+
+#. #define INC_ORIG_MSG_PROMPT
+#: LYMessages.c:197
+msgid "Do you wish to include the original message?"
+msgstr "Szeretné az eredeti üzenetet a levélbe illeszteni?"
+
+#. #define INC_PREPARSED_MSG_PROMPT
+#: LYMessages.c:199
+msgid "Do you wish to include the preparsed source?"
+msgstr "Szeretné az elemzett forrást a levélbe illeszteni?"
+
+#. #define SPAWNING_EDITOR_FOR_MAIL
+#: LYMessages.c:201
+msgid "Spawning your selected editor to edit mail message"
+msgstr "A kiválasztott szerkesztõ meghívása a levél szerkesztéséhez"
+
+#. #define ERROR_SPAWNING_EDITOR
+#: LYMessages.c:203
+msgid "Error spawning editor, check your editor definition in the options menu"
+msgstr "Hiba a szerkesztõ meghívásakor. Az opcióknál a szerkesztõ jól lett megadva?"
+
+#: LYMessages.c:204
+msgid "Send this comment?"
+msgstr "Üzenet küldése?"
+
+#: LYMessages.c:205
+msgid "Send this message?"
+msgstr "Az üzenet küldése?"
+
+#: LYMessages.c:206
+msgid "Sending your message..."
+msgstr "Az üzenet küldése..."
+
+#: LYMessages.c:207
+msgid "Sending your comment:"
+msgstr "Üzenet küldése:"
+
+#. textarea
+#: LYMessages.c:210
+msgid "Not in a TEXTAREA; cannot use external editor."
+msgstr "Nem szövegmezõ! Nem lehet használni külsõ szerkesztõt."
+
+#: LYMessages.c:211
+msgid "Not in a TEXTAREA; cannot use command."
+msgstr "Nem szövegmezõ! Nem lehet használni parancsokat."
+
+#: LYMessages.c:213
+msgid "file: ACTIONs are disallowed!"
+msgstr "fájl: A mûveletek le vannak tiltva!"
+
+#. #define FILE_SERVED_LINKS_DISALLOWED
+#: LYMessages.c:215
+msgid "file: URLs via served links are disallowed!"
+msgstr "fájl: URL-ek hivatkozásokon keresztüli elérése le van tiltva!"
+
+#: LYMessages.c:216
+msgid "Access to local files denied."
+msgstr "A helyi fájl-elérés le van tiltva."
+
+#: LYMessages.c:217
+msgid "file: URLs via bookmarks are disallowed!"
+msgstr "fájl: az URL-ek könyvjelzõn keresztüli elérése le van tiltva!"
+
+#. #define SPECIAL_VIA_EXTERNAL_DISALLOWED
+#: LYMessages.c:219
+msgid "This special URL is not allowed in external documents!"
+msgstr "Ez a speciális URL nincs engedélyezve külsõ dokumentumokban!"
+
+#: LYMessages.c:220
+msgid "Press <return> to return to Lynx."
+msgstr "Nyomja meg a <return> billentyût, hogy visszatérjen a Lynx-hez."
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:223
+msgid "Spawning DCL subprocess. Use 'logout' to return to Lynx.\n"
+msgstr "DCL folyamat hívása. Használja a 'logout' parancsot a Lynx-hez való visszatéréshez.\n"
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:227
+msgid "Type EXIT to return to Lynx.\n"
+msgstr "Gépelje be az 'exit' parancsot a Lynx-hez való visszatéréshez.\n"
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:230
+msgid "Spawning your default shell. Use 'exit' to return to Lynx.\n"
+msgstr "Az alapértelmezett parancsértelmezõ meghívása. Használja az 'exit' parancsot a Lynx-hez való visszatéréshez.\n"
+
+#: LYMessages.c:233
+msgid "Spawning is currently disabled."
+msgstr "A meghívás most le van tiltva."
+
+#: LYMessages.c:234
+msgid "The 'd'ownload command is currently disabled."
+msgstr "A letöltés parancs (D) most le van tiltva."
+
+#: LYMessages.c:235
+msgid "You cannot download an input field."
+msgstr "Beviteli mezõt nem lehet letölteni."
+
+#: LYMessages.c:236
+msgid "Form has a mailto action! Cannot download."
+msgstr "Ez az ûrlap levelezésre való! Nem lehet letölteni."
+
+#: LYMessages.c:237
+msgid "You cannot download a mailto: link."
+msgstr "Nem lehet letölteni levél-hivatkozást."
+
+#: LYMessages.c:238
+msgid "You cannot download cookies."
+msgstr "Sütiket nem lehet letölteni."
+
+#: LYMessages.c:239
+msgid "You cannot download a printing option."
+msgstr "Nyomtatási beállításokat nem lehet letölteni."
+
+#: LYMessages.c:240
+msgid "You cannot download an upload option."
+msgstr "Feltöltés opciót nem lehet letölteni."
+
+#: LYMessages.c:241
+msgid "You cannot download an permit option."
+msgstr "Engedélyezõ opciót nem lehet letölteni."
+
+#: LYMessages.c:242
+msgid "This special URL cannot be downloaded!"
+msgstr "Ezt a speciális URL-t nem lehet letölteni!"
+
+#: LYMessages.c:243
+msgid "Nothing to download."
+msgstr "Nincs mit letölteni."
+
+#: LYMessages.c:244
+msgid "Trace ON!"
+msgstr "Nyomkövetés BE!"
+
+#: LYMessages.c:245
+msgid "Trace OFF!"
+msgstr "Nyomkövetés KI!"
+
+#. #define CLICKABLE_IMAGES_ON
+#: LYMessages.c:247
+msgid "Links will be included for all images! Reloading..."
+msgstr "Hivatkozások betöltése a képekhez. Újratöltés..."
+
+#. #define CLICKABLE_IMAGES_OFF
+#: LYMessages.c:249
+msgid "Standard image handling restored! Reloading..."
+msgstr "Alapértelmezett képkezelés visszaállítva! Újratöltés..."
+
+#. #define PSEUDO_INLINE_ALTS_ON
+#: LYMessages.c:251
+msgid "Pseudo_ALTs will be inserted for inlines without ALT strings! Reloading..."
+msgstr "Pszeudo_ALT-ok lesznek beszúrva ALT sztringek nélküli \"inline\"-okhoz! Újratöltés.."
+
+#. #define PSEUDO_INLINE_ALTS_OFF
+#: LYMessages.c:253
+msgid "Inlines without an ALT string specified will be ignored! Reloading..."
+msgstr "Az ALT sztringek nélküli sorok ki lesznek hagyva! Újratöltés..."
+
+#: LYMessages.c:254
+msgid "Raw 8-bit or CJK mode toggled OFF! Reloading..."
+msgstr "Nyers 8-bites vagy CJK mód KIkapcsolva! Újratöltés..."
+
+#: LYMessages.c:255
+msgid "Raw 8-bit or CJK mode toggled ON! Reloading..."
+msgstr "Nyers 8-bites vagy CJK mód BEkapcsolva! Újratöltés..."
+
+#. #define HEAD_D_L_OR_CANCEL
+#: LYMessages.c:257
+msgid "Send HEAD request for D)ocument or L)ink, or C)ancel? (d,l,c): "
+msgstr "HEAD kérés küldése a dokumentumnak (D), vagy hivatkozásnak (L) vagy sehova (C): "
+
+#. #define HEAD_D_OR_CANCEL
+#: LYMessages.c:259
+msgid "Send HEAD request for D)ocument, or C)ancel? (d,c): "
+msgstr "HEAD kérés küldése a dokumentumnak (D), vagy sehova (C): "
+
+#: LYMessages.c:260
+msgid "Sorry, the document is not an http URL."
+msgstr "Sajnálom, de ez a dokumentum nem HTTP URL."
+
+#: LYMessages.c:261
+msgid "Sorry, the link is not an http URL."
+msgstr "Sajnálom, de a hivatkozás nem HTTP URL."
+
+#: LYMessages.c:262
+msgid "Sorry, the ACTION for this form is disabled."
+msgstr "Sajnálom, de ez a mûvelet erre az ûrlapra le van tiltva."
+
+#. #define FORM_ACTION_NOT_HTTP_URL
+#: LYMessages.c:264
+msgid "Sorry, the ACTION for this form is not an http URL."
+msgstr "Sajnálom, de ez a mûvelet erre a ûrlapra nem HTTP URL."
+
+#: LYMessages.c:265
+msgid "Not an http URL or form ACTION!"
+msgstr "Nem HTTP URL vagy ûrlap mûvelet!"
+
+#: LYMessages.c:266
+msgid "This special URL cannot be a form ACTION!"
+msgstr "Ez a speciális URL nem lehet ûrlap mûvelet!"
+
+#: LYMessages.c:267
+msgid "URL is not in starting realm!"
+msgstr "Az URL nem kezdõtartományban van!"
+
+#: LYMessages.c:268
+msgid "News posting is disabled!"
+msgstr "Hírek postázása le van tiltva!"
+
+#: LYMessages.c:269
+msgid "File management support is disabled!"
+msgstr "A fájlkezelés le van tiltva!"
+
+#: LYMessages.c:270
+msgid "No jump file is currently available."
+msgstr "Ugrásfájl jelenleg nem áll rendelkezésre."
+
+#: LYMessages.c:271
+msgid "Jump to (use '?' for list): "
+msgstr "Ugrás ('?': listát mutat) : "
+
+#: LYMessages.c:272
+msgid "Jumping to a shortcut URL is disallowed!"
+msgstr "Az URL billentyûparanccsal való ugrás le van tiltva!"
+
+#: LYMessages.c:273
+msgid "Random URL is disallowed! Use a shortcut."
+msgstr "Közvetlen URL le van tiltva! Használjon billentyûparancsot."
+
+#: LYMessages.c:274
+msgid "No random URLs have been used thus far."
+msgstr "A közvetlen URL-ek eddig még nem voltak használva."
+
+#: LYMessages.c:275
+msgid "Bookmark features are currently disabled."
+msgstr "A könyvjelzõ jelenleg le van tiltva."
+
+#: LYMessages.c:276
+msgid "Execution via bookmarks is disabled."
+msgstr "Futtatás könyvjelzõn keresztül le van tiltva."
+
+#. #define BOOKMARK_FILE_NOT_DEFINED
+#: LYMessages.c:278
+#, c-format
+msgid "Bookmark file is not defined. Use %s to see options."
+msgstr "Nincs megadva könyvjelzõ fájl. Használja a %s-t a beállítások megnézéséhez."
+
+#. #define NO_TEMP_FOR_HOTLIST
+#: LYMessages.c:280
+msgid "Unable to open tempfile for X Mosaic hotlist conversion."
+msgstr "Nem lehet megnyitni átmeneti fájlt az X Mosaic gyorslista átalakításához."
+
+#: LYMessages.c:281
+msgid "ERROR - unable to open bookmark file."
+msgstr "HIBA - Nem lehet megnyitni könyvjelzõ fájlt."
+
+#. #define BOOKMARK_OPEN_FAILED_FOR_DEL
+#: LYMessages.c:283
+msgid "Unable to open bookmark file for deletion of link."
+msgstr "Nem lehet megnyitni könyvjelzõ fájlt a hivatkozás törléséhez."
+
+#. #define BOOKSCRA_OPEN_FAILED_FOR_DEL
+#: LYMessages.c:285
+msgid "Unable to open scratch file for deletion of link."
+msgstr "Nem lehet megnyitni visszavonó fájlt a hivatkozás törléséhez."
+
+#: LYMessages.c:287
+msgid "Error renaming scratch file."
+msgstr "Hiba a visszavonó fájl átnevezése közben."
+
+#: LYMessages.c:289
+msgid "Error renaming temporary file."
+msgstr "Hiba az átmeneti fájl átnevezése közben."
+
+#. #define BOOKTEMP_COPY_FAIL
+#: LYMessages.c:291
+msgid "Unable to copy temporary file for deletion of link."
+msgstr "Nem lehet másolni az átmeneti fájlt a hivatkozás törléséhez."
+
+#. #define BOOKTEMP_REOPEN_FAIL_FOR_DEL
+#: LYMessages.c:293
+msgid "Unable to reopen temporary file for deletion of link."
+msgstr "Nem lehet újra megnyitni az átmeneti fájlt a hivatkozás törléséhez."
+
+#. #define BOOKMARK_LINK_NOT_ONE_LINE
+#: LYMessages.c:296
+msgid "Link is not by itself all on one line in bookmark file."
+msgstr "A hivatkozás nem egy sorban van a könyvjelzõ fájlon belül."
+
+#: LYMessages.c:297
+msgid "Bookmark deletion failed."
+msgstr "Könyvjelzõ törlés sikertelen."
+
+#. #define BOOKMARKS_NOT_TRAVERSED
+#: LYMessages.c:299
+msgid "Bookmark files cannot be traversed (only http URLs)."
+msgstr "Könyvjelzõ fájlt nem lehet átirányítani (csak http URL-ek szerepelhetnek)."
+
+#. #define BOOKMARKS_NOT_OPEN
+#: LYMessages.c:301
+msgid "Unable to open bookmark file, use 'a' to save a link first"
+msgstr "Nem lehet megnyitni könyvjelzõ fájlt, az 'a'-val elmentheti az elsõ hivatkozást"
+
+#: LYMessages.c:302
+msgid "There are no links in this bookmark file!"
+msgstr "Ebben a könyvjelzõ fájlban nincs hivatkozás!"
+
+#. #define CACHE_D_OR_CANCEL
+#: LYMessages.c:304
+#, fuzzy
+msgid "D)elete cached document or C)ancel? (d,c): "
+msgstr "HEAD kérés küldése a dokumentumnak (D), vagy sehova (C): "
+
+#. #define BOOK_D_L_OR_CANCEL
+#: LYMessages.c:306
+msgid "Save D)ocument or L)ink to bookmark file or C)ancel? (d,l,c): "
+msgstr "D: Dokumentum vagy L: hivatkozás mentése a könyvjelzõkhöz vagy C: Semmi"
+
+#: LYMessages.c:307
+msgid "Save D)ocument to bookmark file or C)ancel? (d,c): "
+msgstr "D: Dokumentum mentése a könyvjelzõkhöz, vagy C: Semmi"
+
+#: LYMessages.c:308
+msgid "Save L)ink to bookmark file or C)ancel? (l,c): "
+msgstr "A hivatkozás (L) mentése a könyvjelzõkhöz, vagy Semmi (C)"
+
+#. #define NOBOOK_POST_FORM
+#: LYMessages.c:310
+msgid "Documents from forms with POST content cannot be saved as bookmarks."
+msgstr "POST tartalmú ûrlapnál lévõ dokumentumokat nem lehet könyvjelzõként elmenteni."
+
+#: LYMessages.c:311
+msgid "Cannot save form fields/links"
+msgstr "Nem lehet elmenteni ûrlap mezõt/hivatkozást"
+
+#. #define NOBOOK_HSML
+#: LYMessages.c:313
+msgid "History, showinfo, menu and list files cannot be saved as bookmarks."
+msgstr "Elõzményt, információt, menüt és listafájlt nem lehet elmenteni könyvjelzõként."
+
+#. #define CONFIRM_BOOKMARK_DELETE
+#: LYMessages.c:315
+msgid "Do you really want to delete this link from your bookmark file?"
+msgstr "Törölni akarja ezt a hivatkozást a könyvjelzõ fájlból?"
+
+#: LYMessages.c:316
+msgid "Malformed address."
+msgstr "Hibásan megadott cím."
+
+#. #define HISTORICAL_ON_MINIMAL_OFF
+#: LYMessages.c:318
+msgid "Historical comment parsing ON (Minimal is overridden)!"
+msgstr "Elõzmények megjegyzés-elemzése BE! (\"minimális\" felülbírálva)"
+
+#. #define HISTORICAL_OFF_MINIMAL_ON
+#: LYMessages.c:320
+msgid "Historical comment parsing OFF (Minimal is in effect)!"
+msgstr "Elõzmények megjegyzés-elemzése KI! (\"minimális\"-ba kapcsolva)"
+
+#. #define HISTORICAL_ON_VALID_OFF
+#: LYMessages.c:322
+msgid "Historical comment parsing ON (Valid is overridden)!"
+msgstr "Elõzmények megjegyzés-elemzése BE (\"érvényes\" felülbírálva)!"
+
+#. #define HISTORICAL_OFF_VALID_ON
+#: LYMessages.c:324
+msgid "Historical comment parsing OFF (Valid is in effect)!"
+msgstr "Elõzmény megjegyzés elemzés KI(\"érvényes\" bekapcsolva)!"
+
+#. #define MINIMAL_ON_IN_EFFECT
+#: LYMessages.c:326
+msgid "Minimal comment parsing ON (and in effect)!"
+msgstr "Minimális megjegyzés-elemzés BE!"
+
+#. #define MINIMAL_OFF_VALID_ON
+#: LYMessages.c:328
+msgid "Minimal comment parsing OFF (Valid is in effect)!"
+msgstr "Minimális megjegyzés-elemzés KI (\"érvényes\" bekapcsolva)!"
+
+#. #define MINIMAL_ON_BUT_HISTORICAL
+#: LYMessages.c:330
+msgid "Minimal comment parsing ON (but Historical is in effect)!"
+msgstr "Minimális megjegyzés-elemzés BE (de az \"elõzmények\" is érvényes)!"
+
+#. #define MINIMAL_OFF_HISTORICAL_ON
+#: LYMessages.c:332
+msgid "Minimal comment parsing OFF (Historical is in effect)!"
+msgstr "Minimális megjegyzés-elemzés KI (az \"elõzmények\" is érvényes)!"
+
+#: LYMessages.c:333
+msgid "Soft double-quote parsing ON!"
+msgstr "Dupla-idézõjel elemzés BE!"
+
+#: LYMessages.c:334
+msgid "Soft double-quote parsing OFF!"
+msgstr "Dupla-idézõjel elemzés KI!"
+
+#: LYMessages.c:335
+msgid "Now using TagSoup parsing of HTML."
+msgstr "Most a \"TagSoup HTML\" elemzést használom."
+
+#: LYMessages.c:336
+msgid "Now using SortaSGML parsing of HTML!"
+msgstr "Most a \"SortaSGML HTML\" elemzést használom."
+
+#: LYMessages.c:337
+msgid "You are already at the end of this document."
+msgstr "A dokumentum végénél vagyunk."
+
+#: LYMessages.c:338
+msgid "You are already at the beginning of this document."
+msgstr "A dokumentum elejénél vagyunk."
+
+#: LYMessages.c:339
+#, c-format
+msgid "You are already at page %d of this document."
+msgstr "A dokumentum %d. oldalán vagyunk."
+
+#: LYMessages.c:340
+#, c-format
+msgid "Link number %d already is current."
+msgstr "A %d. hivatkozás már aktuális volt."
+
+#: LYMessages.c:341
+msgid "You are already at the first document"
+msgstr "Az elsõ dokumentumon állunk."
+
+#: LYMessages.c:342
+msgid "There are no links above this line of the document."
+msgstr "A dokumentumban e sor fölött nincs semmilyen hivatkozás."
+
+#: LYMessages.c:343
+msgid "There are no links below this line of the document."
+msgstr "A dokumentumban e sor alatt nincs semmilyen hivatkozás."
+
+#. #define MAXLEN_REACHED_DEL_OR_MOV
+#: LYMessages.c:345
+msgid "Maximum length reached! Delete text or move off field."
+msgstr "Elértük a max. hosszúságot! Töröljön a szövegbõl, vagy lépjen ki a mezõbõl."
+
+#. #define NOT_ON_SUBMIT_OR_LINK
+#: LYMessages.c:347
+msgid "You are not on a form submission button or normal link."
+msgstr "Nem ûrlapküldõ gombon vagy hivatkozáson állunk."
+
+#. #define NEED_CHECKED_RADIO_BUTTON
+#: LYMessages.c:349
+msgid "One radio button must be checked at all times!"
+msgstr "A választó gombok közül egy mindenképpen ki lesz jelölve!"
+
+#: LYMessages.c:350
+msgid "No submit button for this form, submit single text field?"
+msgstr "Nincs küldés gomb ezen az ûrlapon. Elküldjem önálló szövegmezõként?"
+
+#: LYMessages.c:351
+msgid "Do you want to go back to the previous document?"
+msgstr "Visszatérünk az elõzõ dokumentumhoz?"
+
+#: LYMessages.c:352
+msgid "Use arrows or tab to move off of field."
+msgstr "Használja a le-föl nyilat vagy a tabulátort a mezõ elhagyásához."
+
+#. #define ENTER_TEXT_ARROWS_OR_TAB
+#: LYMessages.c:354
+msgid "Enter text. Use arrows or tab to move off of field."
+msgstr "Kérem a szöveget. Le-föl nyíl vagy Tab: mezõ elhagyása."
+
+#: LYMessages.c:355
+msgid "** Bad HTML!! No form action defined. **"
+msgstr "** Hibás HTML! Nincs ûrlap mûvelet meghatározva. **"
+
+#: LYMessages.c:356
+msgid "Bad HTML!! Unable to create popup window!"
+msgstr "Hibás HTML! Nem lehet létrehozni legördülõ ablakot!"
+
+#: LYMessages.c:357
+msgid "Unable to create popup window!"
+msgstr "Nem lehet létrehozni legördülõ ablakot!"
+
+#: LYMessages.c:358
+msgid "Goto a random URL is disallowed!"
+msgstr "Az \"ugrás közvetlen URL-re\" le van tiltva!"
+
+#: LYMessages.c:359
+msgid "Goto a non-http URL is disallowed!"
+msgstr "Az \"ugrás nem HTTP URL-re\" le van tiltva!"
+
+#: LYMessages.c:360
+#, c-format
+msgid "You are not allowed to goto \"%s\" URLs"
+msgstr "Az Ön számára nincs engedélyezve \"%s\" URL-ekre való ugrás"
+
+#: LYMessages.c:361
+msgid "URL to open: "
+msgstr "URL megnyitása: "
+
+#: LYMessages.c:362
+msgid "Edit the current Goto URL: "
+msgstr "Az aktuális \"URL-re ugrás\" szerkesztése: "
+
+#: LYMessages.c:363
+msgid "Edit the previous Goto URL: "
+msgstr "Az elõzõ \"URL-re ugrás\" szerkesztése: "
+
+#: LYMessages.c:364
+msgid "Edit a previous Goto URL: "
+msgstr "Egy elõzõ \"URL-re ugrás\" szerkesztése: "
+
+#: LYMessages.c:365
+msgid "Current document has POST data."
+msgstr "A jelenlegi dokumentumban POST adatok vannak."
+
+#: LYMessages.c:366
+msgid "Edit this document's URL: "
+msgstr "A dokumentum URL-jének szerkesztése: "
+
+#: LYMessages.c:367
+msgid "Edit the current link's URL: "
+msgstr "A jelenlegi hivatkozás URL-jének szerkesztése: "
+
+#: LYMessages.c:368
+msgid "You cannot edit File Management URLs"
+msgstr "A fájlkezelés URL-jeit nem lehet szerkeszteni"
+
+#: LYMessages.c:369
+msgid "Enter a database query: "
+msgstr "Kérem az adatbázisbeli keresést: "
+
+#: LYMessages.c:370
+msgid "Enter a whereis query: "
+msgstr "Kérem a keresendõ szöveget: "
+
+#: LYMessages.c:371
+msgid "Edit the current query: "
+msgstr "A keresendõ szöveg szerkesztése: "
+
+#: LYMessages.c:372
+msgid "Edit the previous query: "
+msgstr "Az elõzõ keresendõ szöveg szerkesztése: "
+
+#: LYMessages.c:373
+msgid "Edit a previous query: "
+msgstr "Egy elõzõ keresendõ szöveg szerkesztése: "
+
+#. #define USE_C_R_TO_RESUB_CUR_QUERY
+#: LYMessages.c:375
+msgid "Use Control-R to resubmit the current query."
+msgstr "Használja a Control-R gombot a keresési kulcs újraküldéséhez."
+
+#: LYMessages.c:376
+msgid "Edit the current shortcut: "
+msgstr "A billentyûparancs szerkesztése: "
+
+#: LYMessages.c:377
+msgid "Edit the previous shortcut: "
+msgstr "Az elõzõ billentyûparancs szerkesztése: "
+
+#: LYMessages.c:378
+msgid "Edit a previous shortcut: "
+msgstr "Egyik elõzõ billentyûparancs szerkesztése: "
+
+#: LYMessages.c:379
+#, c-format
+msgid "Key '%c' is not mapped to a jump file!"
+msgstr "A '%c' billentyû nincs hozzárendelve ugrás fájlhoz!"
+
+#: LYMessages.c:380
+msgid "Cannot locate jump file!"
+msgstr "Nem találok ugrás fájlt!"
+
+#: LYMessages.c:381
+msgid "Cannot open jump file!"
+msgstr "Nem tudok megnyitni ugrás fájlt!"
+
+#: LYMessages.c:382
+msgid "Error reading jump file!"
+msgstr "Hiba az ugrás fájl olvasásakor!"
+
+#: LYMessages.c:383
+msgid "Out of memory reading jump file!"
+msgstr "Elfogyott a memória az ugrás fájl olvasásakor!"
+
+#: LYMessages.c:384
+msgid "Out of memory reading jump table!"
+msgstr "Elfogyott a memória az ugrás tábla olvasásakor!"
+
+#: LYMessages.c:385
+msgid "No index is currently available."
+msgstr "Nincs elérhetõ index."
+
+#. #define CONFIRM_MAIN_SCREEN
+#: LYMessages.c:387
+msgid "Do you really want to go to the Main screen?"
+msgstr "Vissza akar térni a fõképre?"
+
+#: LYMessages.c:388
+msgid "You are already at main screen!"
+msgstr "A fõképnél vagyunk!"
+
+#. #define NOT_ISINDEX
+#: LYMessages.c:390
+msgid "Not a searchable indexed document -- press '/' to search for a text string"
+msgstr "Nem indexelt dokumentum -- használja a '/'-t a szövegben való kereséshez"
+
+#. #define NO_OWNER
+#: LYMessages.c:392
+msgid "No owner is defined for this file so you cannot send a comment"
+msgstr "Nincs meghatározva a fájl tulajdonosa, így nem tudunk üzenetet küldeni"
+
+#: LYMessages.c:393
+#, c-format
+msgid "No owner is defined. Use %s?"
+msgstr "Nincs tulajdonos meghatározva. Használjuk a(z) %s-t?"
+
+#: LYMessages.c:394
+msgid "Do you wish to send a comment?"
+msgstr "El akar küldeni egy üzenetet?"
+
+#: LYMessages.c:395
+msgid "Mail is disallowed so you cannot send a comment"
+msgstr "A levélküldés nincs engedélyezve, nem lehet küldeni üzenetet"
+
+#: LYMessages.c:396
+msgid "The 'e'dit command is currently disabled."
+msgstr "A szerkesztés parancs (E) jelenleg le van tiltva."
+
+#: LYMessages.c:397
+msgid "External editing is currently disabled."
+msgstr "A külsõ szerkesztés le van tiltva."
+
+#: LYMessages.c:398
+msgid "System error - failure to get status."
+msgstr "Rendszerhiba - nem lehet kiolvasni az állapotot."
+
+#: LYMessages.c:399
+msgid "No editor is defined!"
+msgstr "Nincs szerkesztõ meghatározva!"
+
+#: LYMessages.c:400
+msgid "The 'p'rint command is currently disabled."
+msgstr "A nyomtatásparancs (P) jelenleg le van tiltva."
+
+#: LYMessages.c:401
+msgid "Document has no Toolbar links or Banner."
+msgstr "A dokumentumban nincs Eszköztár link, sem Felirat (\"banner\")."
+
+#: LYMessages.c:402
+msgid "Unable to open traversal file."
+msgstr "Nem lehet megnyitni a bejárás fájlt (\"traversal\")."
+
+#: LYMessages.c:403
+msgid "Unable to open traversal found file."
+msgstr "Nem lehet megnyitni a talált bejárás fájlt (\"traversal\")."
+
+#: LYMessages.c:404
+msgid "Unable to open reject file."
+msgstr "Nem lehet megnyitni a visszautasítás fájlt."
+
+#: LYMessages.c:405
+msgid "Unable to open traversal errors output file"
+msgstr "Nem lehet megnyitni a bejárás hibakimeneti fájlt."
+
+#: LYMessages.c:406
+msgid "TRAVERSAL WAS INTERRUPTED"
+msgstr "BEJÁRÁS MEGSZAKADT"
+
+#: LYMessages.c:407
+msgid "Follow link (or goto link or page) number: "
+msgstr "Hivatkozás követésének (vagy hivatkozásra ugrásnak vagy lapnak) száma:"
+
+#: LYMessages.c:408
+msgid "Select option (or page) number: "
+msgstr "Opció kiválasztásának (vagy lapnak) a száma: "
+
+#: LYMessages.c:409
+#, c-format
+msgid "Option number %d already is current."
+msgstr "A %d. opció már ki van választva."
+
+#. #define ALREADY_AT_OPTION_END
+#: LYMessages.c:411
+msgid "You are already at the end of this option list."
+msgstr "A legördülõ menü végénél vagyunk."
+
+#. #define ALREADY_AT_OPTION_BEGIN
+#: LYMessages.c:413
+msgid "You are already at the beginning of this option list."
+msgstr "A legördülõ menü elejénél vagyunk."
+
+#. #define ALREADY_AT_OPTION_PAGE
+#: LYMessages.c:415
+#, c-format
+msgid "You are already at page %d of this option list."
+msgstr "A legördülõ menü %d. oldalán vagyunk."
+
+#: LYMessages.c:416
+msgid "You have entered an invalid option number."
+msgstr "A beírt opció-szám érvénytelen."
+
+#: LYMessages.c:417
+msgid "** Bad HTML!! Use -trace to diagnose. **"
+msgstr "** Hibás HTML!! Használja a -trace kapcsolót a hibakereséshez. **"
+
+#: LYMessages.c:418
+msgid "Give name of file to save in"
+msgstr "Kérem a menteni kívánt fájl nevét"
+
+#: LYMessages.c:419
+msgid "Can't save data to file -- please run WWW locally"
+msgstr "Nem lehet az adatokat fájlba menteni -- kérem futtassa WWW-t helyileg"
+
+#: LYMessages.c:420
+msgid "Can't open temporary file!"
+msgstr "Nem lehet megnyitni átmeneti fájlt!"
+
+#: LYMessages.c:421
+msgid "Can't open output file! Cancelling!"
+msgstr "Nem lehet megnyitni kimeneti fájlt! Megszakítva!"
+
+#: LYMessages.c:422
+msgid "Execution is disabled."
+msgstr "Futtatás tiltva."
+
+#. #define EXECUTION_DISABLED_FOR_FILE
+#: LYMessages.c:424
+#, c-format
+msgid "Execution is not enabled for this file. See the Options menu (use %s)."
+msgstr "A futtatás le van tiltva erre a fájlra. Nézze meg a beállítások menüben (használja a(z) %s-t)"
+
+#. #define EXECUTION_NOT_COMPILED
+#: LYMessages.c:426
+msgid "Execution capabilities are not compiled into this version."
+msgstr "A futtatás lehetõsége nincs beleépítve ebbe a verzióba."
+
+#: LYMessages.c:427
+msgid "This file cannot be displayed on this terminal."
+msgstr "Ezt a fájlt nem lehet megjeleníteni ezen a terminálon."
+
+#. #define CANNOT_DISPLAY_FILE_D_OR_C
+#: LYMessages.c:429
+msgid "This file cannot be displayed on this terminal: D)ownload, or C)ancel"
+msgstr "Ezt a fájlt nem lehet megjeleníteni ezen a terminálon. Letöltés (D), vagy mégse (C)"
+
+#: LYMessages.c:430
+#, c-format
+msgid "%s D)ownload, or C)ancel"
+msgstr "%s Letöltés (D) vagy mégse (C)"
+
+#: LYMessages.c:431
+msgid "Cancelling file."
+msgstr "Fájl megszakítása."
+
+#: LYMessages.c:432
+msgid "Retrieving file. - PLEASE WAIT -"
+msgstr "Fájl letöltése. - KÉREM VÁRJON -"
+
+#: LYMessages.c:433
+msgid "Enter a filename: "
+msgstr "Kérem a fájlnevet: "
+
+#: LYMessages.c:434
+msgid "Edit the previous filename: "
+msgstr "Az elõzõ fájlnév szerkesztése: "
+
+#: LYMessages.c:435
+msgid "Edit a previous filename: "
+msgstr "Egy elõzõ fájlnév szerkesztése: "
+
+#: LYMessages.c:436
+msgid "Enter a new filename: "
+msgstr "Kérem az új fájlnevet: "
+
+#: LYMessages.c:437
+msgid "File name may not begin with a dot."
+msgstr "Fájlnév nem kezdõdhet ponttal."
+
+#: LYMessages.c:439
+msgid "File exists. Create higher version?"
+msgstr "A fájl már létezik. Létrehozzak egy újabb verziót?"
+
+#: LYMessages.c:441
+msgid "File exists. Overwrite?"
+msgstr "A fájl már létezik. Felülírjam?"
+
+#: LYMessages.c:443
+msgid "Cannot write to file."
+msgstr "Nem lehet fájlba írni."
+
+#: LYMessages.c:444
+msgid "ERROR! - download command is misconfigured."
+msgstr "HIBA! A letöltés parancs nincs jól beállítva."
+
+#: LYMessages.c:445
+msgid "Unable to download file."
+msgstr "Nem lehet letölteni a fájlt."
+
+#: LYMessages.c:446
+msgid "Reading directory..."
+msgstr "Könyvtár olvasása..."
+
+#: LYMessages.c:447
+msgid "Building directory listing..."
+msgstr "Könyvtárlista felépítése..."
+
+#: LYMessages.c:448
+msgid "Saving..."
+msgstr "Mentés..."
+
+#: LYMessages.c:449
+#, c-format
+msgid "Could not edit file '%s'."
+msgstr "Nem lehet szerkeszteni a(z) %s fájlt."
+
+#: LYMessages.c:450
+msgid "Unable to access document!"
+msgstr "Nem lehet elérni a dokumentumot!"
+
+#: LYMessages.c:451
+msgid "Could not access file."
+msgstr "Nem lehet elérni a fájlt."
+
+#: LYMessages.c:452
+msgid "Could not access directory."
+msgstr "Nem lehet elérni a könyvtárat."
+
+#: LYMessages.c:453
+msgid "Could not load data."
+msgstr "Nem lehet betölteni az adatokat."
+
+#. #define CANNOT_EDIT_REMOTE_FILES
+#: LYMessages.c:455
+msgid "Lynx cannot currently (e)dit remote WWW files."
+msgstr "A Lynx jelenleg nem tud szerkeszteni távoli WWW fájlokat."
+
+#. #define CANNOT_EDIT_FIELD
+#: LYMessages.c:457
+msgid "This field cannot be (e)dited with an external editor."
+msgstr "Ez a mezõ nem szerkeszthetõ külsõ szerkesztõvel."
+
+#: LYMessages.c:458
+msgid "Bad rule"
+msgstr "Hibás szabály"
+
+#: LYMessages.c:459
+msgid "Insufficient operands:"
+msgstr "Kevés mûvelet:"
+
+#: LYMessages.c:460
+msgid "You are not authorized to edit this file."
+msgstr "Ön nem jogosult e fájl szerkesztésére."
+
+#: LYMessages.c:461
+msgid "Title: "
+msgstr "Megnevezés: "
+
+#: LYMessages.c:462
+msgid "Subject: "
+msgstr "Tárgy: "
+
+#: LYMessages.c:463
+msgid "Username: "
+msgstr "Felhasználói név: "
+
+#: LYMessages.c:464
+msgid "Password: "
+msgstr "Jelszó: "
+
+#: LYMessages.c:465
+msgid "lynx: Username and Password required!!!"
+msgstr "lynx: Felhasználói név és jelszó szükséges!"
+
+#: LYMessages.c:466
+msgid "lynx: Password required!!!"
+msgstr "lynx: Jelszó szükséges!"
+
+#: LYMessages.c:467
+msgid "Clear all authorization info for this session?"
+msgstr "Minden felhatalmazás törlése errõl a folyamatról?"
+
+#: LYMessages.c:468
+msgid "Authorization info cleared."
+msgstr "Felhatalmazási információk törölve."
+
+#: LYMessages.c:469
+msgid "Authorization failed. Retry?"
+msgstr "A felhasználói azonosítás sikertelen. Újra?"
+
+#: LYMessages.c:470
+msgid "cgi support has been disabled."
+msgstr "A CGI támogatás le van tiltva."
+
+#. #define CGI_NOT_COMPILED
+#: LYMessages.c:472
+msgid "Lynxcgi capabilities are not compiled into this version."
+msgstr "Lynxcgi lehetõségek nincsenek beépítve ebbe a verzióba."
+
+#: LYMessages.c:473
+#, c-format
+msgid "Sorry, no known way of converting %s to %s."
+msgstr "Sajnálom, nincs ismert módja a(z) %s %s átalakításnak."
+
+#: LYMessages.c:474
+msgid "Unable to set up connection."
+msgstr "Nem lehet beállítani a csatlakozást."
+
+#: LYMessages.c:475
+msgid "Unable to make connection"
+msgstr "Nem lehet csatlakozást létrehozni"
+
+#. #define MALFORMED_EXEC_REQUEST
+#: LYMessages.c:477
+msgid "Executable link rejected due to malformed request."
+msgstr "A végrehajtható link visszautasítva, hibás kérés miatt."
+
+#. #define BADCHAR_IN_EXEC_LINK
+#: LYMessages.c:479
+#, c-format
+msgid "Executable link rejected due to `%c' character."
+msgstr "A végrehajtható link visszautasítva, '%c' karakter miatt."
+
+#. #define RELPATH_IN_EXEC_LINK
+#: LYMessages.c:481
+msgid "Executable link rejected due to relative path string ('../')."
+msgstr "A végrehajtható link visszautasítva, relatív útvonal ('../') miatt."
+
+#. #define BADLOCPATH_IN_EXEC_LINK
+#: LYMessages.c:483
+msgid "Executable link rejected due to location or path."
+msgstr "A végrehajtható link visszautasítva, hely vagy útvonal miatt."
+
+#: LYMessages.c:484
+msgid "Mail access is disabled!"
+msgstr "A levelek elérése le van tiltva!"
+
+#. #define ACCESS_ONLY_LOCALHOST
+#: LYMessages.c:486
+msgid "Only files and servers on the local host can be accessed."
+msgstr "Csak a helyi számítógépen található szolgáltatásokat és fájlokat lehet elérni."
+
+#: LYMessages.c:487
+msgid "Telnet access is disabled!"
+msgstr "A telnet hozzáférés le van tiltva!"
+
+#. #define TELNET_PORT_SPECS_DISABLED
+#: LYMessages.c:489
+msgid "Telnet port specifications are disabled."
+msgstr "A telnet port beállítása le van tiltva."
+
+#: LYMessages.c:490
+msgid "USENET news access is disabled!"
+msgstr "A USENET hírek elérése le van tiltva!"
+
+#: LYMessages.c:491
+msgid "Rlogin access is disabled!"
+msgstr "Az rlogin elérése le van tiltva!"
+
+#: LYMessages.c:492
+msgid "Ftp access is disabled!"
+msgstr "Az FTP-s elérés le van tiltva!"
+
+#: LYMessages.c:493
+msgid "There are no references from this document."
+msgstr "Ebben a dokumentumban nincsenek hivatkozások."
+
+#: LYMessages.c:494
+msgid "There are only hidden links from this document."
+msgstr "Ebben a dokumentumban csak rejtett hivatkozások vannak."
+
+#: LYMessages.c:496
+msgid "Unable to open command file."
+msgstr "Nem lehet megnyitni a parancs fájlt."
+
+#: LYMessages.c:498
+msgid "News Post Cancelled!!!"
+msgstr "Hírek postázása megszakítva!"
+
+#. #define SPAWNING_EDITOR_FOR_NEWS
+#: LYMessages.c:500
+msgid "Spawning your selected editor to edit news message"
+msgstr "A kiválasztott szerkesztõ meghívása hírüzenet szerkesztéséhez"
+
+#: LYMessages.c:501
+msgid "Post this message?"
+msgstr "Postázzam az üzenetet?"
+
+#: LYMessages.c:502
+#, c-format
+msgid "Append '%s'?"
+msgstr "Hozzáfûzés: '%s'?"
+
+#: LYMessages.c:503
+msgid "Posting to newsgroup(s)..."
+msgstr "Hírcsoport(ok) felé postázás..."
+
+#: LYMessages.c:505
+msgid "*** You have unread mail. ***"
+msgstr "*** Önnek olvasatlan levele van. ***"
+
+#: LYMessages.c:507
+msgid "*** You have mail. ***"
+msgstr "*** Önnek új levele van. ***"
+
+#: LYMessages.c:509
+msgid "*** You have new mail. ***"
+msgstr "*** Önnek új levele van. ***"
+
+#: LYMessages.c:510
+msgid "File insert cancelled!!!"
+msgstr "Fájlbeszúrás megszakítva!"
+
+#: LYMessages.c:511
+msgid "Not enough memory for file!"
+msgstr "Nincs elég memória a fájlnak!"
+
+#: LYMessages.c:512
+msgid "Can't open file for reading."
+msgstr "Nem lehet megnyitni a fájlt olvasásra."
+
+#: LYMessages.c:513
+msgid "File does not exist."
+msgstr "A fájl nem létezik."
+
+#: LYMessages.c:514
+msgid "File does not exist - reenter or cancel:"
+msgstr "A fájl nem létezik - újra vagy mégsem:"
+
+#: LYMessages.c:515
+msgid "File is not readable."
+msgstr "A fájl nem olvasható."
+
+#: LYMessages.c:516
+msgid "File is not readable - reenter or cancel:"
+msgstr "A fájl nem olvasható - újra vagy mégsem:"
+
+#: LYMessages.c:517
+msgid "Nothing to insert - file is 0-length."
+msgstr "Nincs mit beszúrni - a fájl 0 hosszú."
+
+#: LYMessages.c:518
+msgid "Save request cancelled!!!"
+msgstr "Mentési kérés megszakítva!"
+
+#: LYMessages.c:519
+msgid "Mail request cancelled!!!"
+msgstr "Levelezési kérés megszakítva!"
+
+#. #define CONFIRM_MAIL_SOURCE_PREPARSED
+#: LYMessages.c:521
+msgid "Viewing preparsed source. Are you sure you want to mail it?"
+msgstr "Az elõkészített forrás megtekintése. El akarja postázni?"
+
+#: LYMessages.c:522
+msgid "Please wait..."
+msgstr "Kérem várjon..."
+
+#: LYMessages.c:523
+msgid "Mailing file. Please wait..."
+msgstr "Fájl postázása. Kérem várjon..."
+
+#: LYMessages.c:524
+msgid "ERROR - Unable to mail file"
+msgstr "HIBA - Nem lehet postázni a fájlt"
+
+#. #define CONFIRM_LONG_SCREEN_PRINT
+#: LYMessages.c:526
+#, c-format
+msgid "File is %d screens long. Are you sure you want to print?"
+msgstr "A fájl %d képernyõ hosszú. Ki akarja nyomtatni?"
+
+#: LYMessages.c:527
+msgid "Print request cancelled!!!"
+msgstr "Nyomtatási kérés megszakítva!"
+
+#: LYMessages.c:528
+msgid "Press <return> to begin: "
+msgstr "Nyomja le a <return>-t a kezdéshez: "
+
+#: LYMessages.c:529
+msgid "Press <return> to finish: "
+msgstr "Nyomja le a <return>-t a befejezéshez: "
+
+#. #define CONFIRM_LONG_PAGE_PRINT
+#: LYMessages.c:531
+#, c-format
+msgid "File is %d pages long. Are you sure you want to print?"
+msgstr "A fájl %d oldal hosszú. Ki akarja nyomtatni?"
+
+#. #define CHECK_PRINTER
+#: LYMessages.c:533
+msgid "Be sure your printer is on-line. Press <return> to start printing:"
+msgstr "A nyomtató legyen bekapcsolva. Nyomja le a <return>-t a nyomtatáshoz:"
+
+#: LYMessages.c:534
+msgid "ERROR - Unable to allocate file space!!!"
+msgstr "HIBA - Nem lehet lefoglalni a fájlnak elég helyet!"
+
+#: LYMessages.c:535
+msgid "Unable to open tempfile"
+msgstr "Nem lehet megnyitni az átmeneti fájlt"
+
+#: LYMessages.c:536
+msgid "Unable to open print options file"
+msgstr "Nem lehet megnyitni a nyomtatási beállítások fájlt"
+
+#: LYMessages.c:537
+msgid "Printing file. Please wait..."
+msgstr "Nyomtatás. Kérem várjon..."
+
+#: LYMessages.c:538
+msgid "Please enter a valid internet mail address: "
+msgstr "Írjon be egy érvényes email címet: "
+
+#: LYMessages.c:539
+msgid "ERROR! - printer is misconfigured!"
+msgstr "HIBA - a nyomtató nincs jól beállítva!"
+
+#: LYMessages.c:540
+msgid "Image map from POST response not available!"
+msgstr "Képtérkép nem áll rendelkezésre POST válaszból!"
+
+#: LYMessages.c:541
+msgid "Misdirected client-side image MAP request!"
+msgstr "Félreirányított ügyféloldali képtérkép kérés!"
+
+#: LYMessages.c:542
+msgid "Client-side image MAP is not accessible!"
+msgstr "Az ügyféloldali képtérkép nem hozzáférhetõ!"
+
+#: LYMessages.c:543
+msgid "No client-side image MAPs are available!"
+msgstr "Nincs elérhetõ ügyféloldali képtérkép!"
+
+#: LYMessages.c:544
+msgid "Client-side image MAP is not available!"
+msgstr "Az ügyfél oldali képtérkép nem elérhetõ!"
+
+#. #define OPTION_SCREEN_NEEDS_24
+#: LYMessages.c:547
+msgid "Screen height must be at least 24 lines for the Options menu!"
+msgstr "A képernyõ magassága legalább 24 sor legyen a Beállítások menü számára!"
+
+#. #define OPTION_SCREEN_NEEDS_23
+#: LYMessages.c:549
+msgid "Screen height must be at least 23 lines for the Options menu!"
+msgstr "A képernyõ magassága legalább 23 sor legyen a Beállítások menü számára!"
+
+#. #define OPTION_SCREEN_NEEDS_22
+#: LYMessages.c:551
+msgid "Screen height must be at least 22 lines for the Options menu!"
+msgstr "A képernyõ magassága legalább 22 sor legyen a Beállítások menü számára!"
+
+#: LYMessages.c:553
+msgid "That key requires Advanced User mode."
+msgstr "Ehhez a gombhoz Haladó Felhasználói Mód kell."
+
+#: LYMessages.c:554
+#, c-format
+msgid "Content-type: %s"
+msgstr "Tartalom típusa: %s"
+
+#: LYMessages.c:555
+msgid "Command: "
+msgstr "Parancs: "
+
+#: LYMessages.c:556
+msgid "Unknown or ambiguous command"
+msgstr "Ismeretlen vagy bizonytalan parancs"
+
+#: LYMessages.c:557
+msgid " Version "
+msgstr " Verzió "
+
+#: LYMessages.c:558
+msgid " first"
+msgstr " elõször"
+
+#: LYMessages.c:559
+msgid ", guessing..."
+msgstr ", próbálkozás..."
+
+#: LYMessages.c:560
+msgid "Permissions for "
+msgstr "Jogosultságok "
+
+#: LYMessages.c:561
+msgid "Select "
+msgstr "Választás "
+
+#: LYMessages.c:562
+msgid "capital letter"
+msgstr "nagybetû"
+
+#: LYMessages.c:563
+msgid " of option line,"
+msgstr "beállítások sorának,"
+
+#: LYMessages.c:564
+msgid " to save,"
+msgstr " mentés,"
+
+#: LYMessages.c:565
+msgid " to "
+msgstr " "
+
+#: LYMessages.c:566
+msgid " or "
+msgstr " vagy "
+
+#: LYMessages.c:567
+msgid " index"
+msgstr " index"
+
+#: LYMessages.c:568
+msgid " to return to Lynx."
+msgstr " vissza a Lynx-be."
+
+#: LYMessages.c:569
+msgid "Accept Changes"
+msgstr "A változások elfogadása"
+
+#: LYMessages.c:570
+msgid "Reset Changes"
+msgstr "Változások eldobása"
+
+#: LYMessages.c:571
+msgid "Left Arrow cancels changes"
+msgstr "Balra nyíl: változtatások figyelmen kívül hagyása"
+
+#: LYMessages.c:572
+msgid "Save options to disk"
+msgstr "A beállítások lemezre mentése"
+
+#: LYMessages.c:573
+msgid "Hit RETURN to accept entered data."
+msgstr "Nyomja le a RETURN-t a beírt adatok elfogadásához."
+
+#. #define ACCEPT_DATA_OR_DEFAULT
+#: LYMessages.c:575
+msgid "Hit RETURN to accept entered data. Delete data to invoke the default."
+msgstr "Nyomja le a RETURN-t a beírt adatok elfogadásához. Az adatok törlésével az alapbeállításokat hívja meg."
+
+#: LYMessages.c:576
+msgid "Value accepted!"
+msgstr "Érték elfogadva!"
+
+#. #define VALUE_ACCEPTED_WARNING_X
+#: LYMessages.c:578
+msgid "Value accepted! -- WARNING: Lynx is configured for XWINDOWS!"
+msgstr "Érték elfogadva! -- FIGYELMEZTETÉS: a Lynx-et az XWINDOW-hoz állította be!"
+
+#. #define VALUE_ACCEPTED_WARNING_NONX
+#: LYMessages.c:580
+msgid "Value accepted! -- WARNING: Lynx is NOT configured for XWINDOWS!"
+msgstr "Érték elfogadva! -- FIGYELMEZTETÉS: a Lynx nincs beállítva XWINDOW-hoz!"
+
+#: LYMessages.c:581
+msgid "You are not allowed to change which editor to use!"
+msgstr "Ön nem állíthatja be, hogy melyik szerkesztõt használja!"
+
+#: LYMessages.c:582
+msgid "Failed to set DISPLAY variable!"
+msgstr "Nem sikerült beállítani a DISPLAY változót!"
+
+#: LYMessages.c:583
+msgid "Failed to clear DISPLAY variable!"
+msgstr "Nem sikerült törölni a DISPLAY változót!"
+
+#. #define BOOKMARK_CHANGE_DISALLOWED
+#: LYMessages.c:585
+msgid "You are not allowed to change the bookmark file!"
+msgstr "Ön nem módosíthatja a könyvjelzõ fájlt!"
+
+#: LYMessages.c:586
+msgid "Terminal does not support color"
+msgstr "A terminál nem támogatja a színeket"
+
+#: LYMessages.c:587
+#, c-format
+msgid "Your '%s' terminal does not support color."
+msgstr "Ez a '%s' terminál nem támogatja a színeket."
+
+#: LYMessages.c:588
+msgid "Access to dot files is disabled!"
+msgstr "A rejtett fájlok elérése le van tiltva!"
+
+#. #define UA_NO_LYNX_WARNING
+#: LYMessages.c:590
+msgid "User-Agent string does not contain \"Lynx\" or \"L_y_n_x\""
+msgstr "A böngészõ-azonosító sztring nem tartalmaz \"Lynx\" vagy \"L_y_n_x\"-et"
+
+#. #define UA_PLEASE_USE_LYNX
+#: LYMessages.c:592
+msgid "Use \"L_y_n_x\" or \"Lynx\" in User-Agent, or it looks like intentional deception!"
+msgstr "Használja a \"L_y_n_x\" vagy a \"Lynx\"-et a böngészõ-azonosítóban egyébként ez szándékos csalás!"
+
+#. #define UA_CHANGE_DISABLED
+#: LYMessages.c:594
+msgid "Changing of the User-Agent string is disabled!"
+msgstr "A böngészõ-azonosító sztring változtatása le van tiltva!"
+
+#. #define CHANGE_OF_SETTING_DISALLOWED
+#: LYMessages.c:596
+msgid "You are not allowed to change this setting."
+msgstr "Önnek nincs engedélyezve ennek a beállításnak a módosítása."
+
+#: LYMessages.c:597
+msgid "Saving Options..."
+msgstr "Beállítások mentése..."
+
+#: LYMessages.c:598
+msgid "Options saved!"
+msgstr "Beállítások elmentve!"
+
+#: LYMessages.c:599
+msgid "Unable to save Options!"
+msgstr "Nem lehet elmenteni a beállításokat!"
+
+#: LYMessages.c:600
+msgid " 'r' to return to Lynx "
+msgstr "'r': visszatérés a Lynx-hez "
+
+#: LYMessages.c:601
+msgid " '>' to save, or 'r' to return to Lynx "
+msgstr "'>': mentés vagy az 'r': visszatérés a Lynx-hez "
+
+#. #define ANY_KEY_CHANGE_RET_ACCEPT
+#: LYMessages.c:603
+msgid "Hit any key to change value; RETURN to accept."
+msgstr "Bármely billentyû lenyomásával módosíthatja az értéket; RETURN elfogadja"
+
+#: LYMessages.c:604
+msgid "Error uncompressing temporary file!"
+msgstr "Hiba az átmeneti fájl kitömörítése közben!"
+
+#: LYMessages.c:605
+msgid "Unsupported URL scheme!"
+msgstr "Nem támogatott URL séma!"
+
+#: LYMessages.c:606
+msgid "Unsupported data: URL! Use SHOWINFO, for now."
+msgstr "Nem támogatott adat: URL! Használja a SHOWINFO-t."
+
+#: LYMessages.c:607
+msgid "Redirection limit of 10 URL's reached."
+msgstr "Elértük a 10 URL-es átirányítási határt."
+
+#: LYMessages.c:608
+msgid "Illegal redirection URL received from server!"
+msgstr "Érvénytelen URL átirányítás érkezett a szervertõl!"
+
+#. #define SERVER_ASKED_FOR_REDIRECTION
+#: LYMessages.c:610
+#, c-format
+msgid "Server asked for %d redirection of POST content to"
+msgstr "A kiszolgáló %d átirányítást kért POST tartalommal"
+
+#: LYMessages.c:613
+msgid "P)roceed, use G)ET or C)ancel "
+msgstr "Folytatás (P), használjam a GET-et (G), vagy hagyjuk (C) "
+
+#: LYMessages.c:614
+msgid "P)roceed, or C)ancel "
+msgstr "Folytatás (P), vagy hagyjuk (C) "
+
+#. #define ADVANCED_POST_GET_REDIRECT
+#: LYMessages.c:616
+msgid "Redirection of POST content. P)roceed, see U)RL, use G)ET or C)ancel"
+msgstr "POST tartalmú átirányítás. Folytatás (P), nézzük az URL-t, használjam a GET-et (G), vagy mégsem (C)"
+
+#. #define ADVANCED_POST_REDIRECT
+#: LYMessages.c:618
+msgid "Redirection of POST content. P)roceed, see U)RL, or C)ancel"
+msgstr "POST tartalmú átirányítás. Folytatás (P), nézzük az URL-t, vagy mégsem (C)"
+
+#. #define CONFIRM_POST_RESUBMISSION
+#: LYMessages.c:620
+msgid "Document from Form with POST content. Resubmit?"
+msgstr "Dokumentum ûrlap POST tartalommal. Újraküldés?"
+
+#. #define CONFIRM_POST_RESUBMISSION_TO
+#: LYMessages.c:622
+#, c-format
+msgid "Resubmit POST content to %s ?"
+msgstr "A POST tartalom újraküldése a %s-hez?"
+
+#. #define CONFIRM_POST_LIST_RELOAD
+#: LYMessages.c:624
+#, c-format
+msgid "List from document with POST data. Reload %s ?"
+msgstr "A dokumentum listázása POST adatokkal. %s újratöltése?"
+
+#. #define CONFIRM_POST_DOC_HEAD
+#: LYMessages.c:626
+msgid "Document from POST action, HEAD may not be understood. Proceed?"
+msgstr "POST mûveletbõl dokumentum, a HEAD nem értelmezhetõ. Tovább?"
+
+#. #define CONFIRM_POST_LINK_HEAD
+#: LYMessages.c:628
+msgid "Form submit action is POST, HEAD may not be understood. Proceed?"
+msgstr "Az ûrlap kitöltése POST mûvelet, a HEAD nem értelmezhetõ. Tovább?"
+
+#: LYMessages.c:629
+msgid "Proceed without a username and password?"
+msgstr "Tovább felhasználónév és jelszó nélkül?"
+
+#: LYMessages.c:630
+#, c-format
+msgid "Proceed (%s)?"
+msgstr "Tovább (%s)?"
+
+#: LYMessages.c:631
+msgid "Cannot POST to this host."
+msgstr "Nem lehet ezen a kiszolgálón POST mûveletet végrehajtani."
+
+#: LYMessages.c:632
+msgid "POST not supported for this URL - ignoring POST data!"
+msgstr "A POST nincs támogatva ezen az URL-en - a POST adatok eldobása!"
+
+#: LYMessages.c:633
+msgid "Discarding POST data..."
+msgstr "POST adatok eldobása."
+
+#: LYMessages.c:634
+msgid "Document will not be reloaded!"
+msgstr "A dokumentum nem lesz újratöltve!"
+
+#: LYMessages.c:635
+msgid "Location: "
+msgstr "Hely: "
+
+#: LYMessages.c:636
+#, c-format
+msgid "'%s' not found!"
+msgstr "'%s' nem található!"
+
+#: LYMessages.c:637
+msgid "Default Bookmark File"
+msgstr "Alapértelmezett könyvjelzõ-fájl"
+
+#: LYMessages.c:638
+msgid "Screen too small! (8x35 min)"
+msgstr "A képernyõ túl kicsi (8x35 a minimum)"
+
+#: LYMessages.c:639
+msgid "Select destination or ^G to Cancel: "
+msgstr "Válasszon célt vagy ^G-vel vissza: "
+
+#. #define MULTIBOOKMARKS_SELECT
+#: LYMessages.c:641
+msgid "Select subbookmark, '=' for menu, or ^G to cancel: "
+msgstr "Segédkönyvjelzõ kiválasztása, '=': menü, vagy a ^G-vel vissza: "
+
+#. #define MULTIBOOKMARKS_SELF
+#: LYMessages.c:643
+msgid "Reproduce L)ink in this bookmark file or C)ancel? (l,c): "
+msgstr "Lemásolja a hivatkozást (L) ebbe a könyvjelzõ-fájlba, vagy mégsem (C): "
+
+#: LYMessages.c:644
+msgid "Multiple bookmark support is not available."
+msgstr "Többszörös könyvjelzõ-támogatás nem áll rendelkezésre."
+
+#: LYMessages.c:645
+#, c-format
+msgid " Select Bookmark (screen %d of %d)"
+msgstr "Könyvjelzõ kiválasztása (%d. képernyõ, összesen %d)"
+
+#: LYMessages.c:646
+msgid " Select Bookmark"
+msgstr " Könyvjelzõ kiválasztása"
+
+#. #define MULTIBOOKMARKS_EHEAD_MASK
+#: LYMessages.c:648
+#, c-format
+msgid "Editing Bookmark DESCRIPTION and FILEPATH (%d of 2)"
+msgstr "Könyvjelzõ leírás és útvonal szerkesztése (2-bõl %d)"
+
+#. #define MULTIBOOKMARKS_EHEAD
+#: LYMessages.c:650
+msgid " Editing Bookmark DESCRIPTION and FILEPATH"
+msgstr " Könyvjelzõ leírás és útvonal szerkesztése"
+
+#: LYMessages.c:651
+msgid "Letter: "
+msgstr "Betû: "
+
+#. #define USE_PATH_OFF_HOME
+#: LYMessages.c:654
+msgid "Use a filepath off your login directory in SHELL syntax!"
+msgstr "Használja a belépési könyvtár útvonalát parancsértelmezõ stílusban!"
+
+#: LYMessages.c:656
+msgid "Use a filepath off your home directory!"
+msgstr "Használja a HOME könyvtártól az útvonalat!"
+
+#. #define MAXLINKS_REACHED
+#: LYMessages.c:659
+msgid "Maximum links per page exceeded! Use half-page or two-line scrolling."
+msgstr "Elértük az oldalankénti maximális hivatkozások számát! Használjon fél oldalt vagy kétsoros görgetést."
+
+#: LYMessages.c:660
+msgid "No previously visited links available!"
+msgstr "Nem áll rendelkezésre meglátogatott hivatkozás!"
+
+#: LYMessages.c:661
+msgid "Memory exhausted! Program aborted!"
+msgstr "A memória kimerült! A program megszakítva!"
+
+#: LYMessages.c:662
+msgid "Memory exhausted! Aborting..."
+msgstr "A memória kimerült! Megszakítás..."
+
+#: LYMessages.c:663
+msgid "Not enough memory!"
+msgstr "Nincs elég memória!"
+
+#: LYMessages.c:664
+msgid "Directory/File Manager not available"
+msgstr "Könyvtár- vagy fájlkezelõprogram nem elérhetõ"
+
+#: LYMessages.c:665
+msgid "HREF in BASE tag is not an absolute URL."
+msgstr "A HREF a BASE tagban nem egy abszolút URL."
+
+#: LYMessages.c:666
+msgid "Location URL is not absolute."
+msgstr "Az URL nem abszolút."
+
+#: LYMessages.c:667
+msgid "Refresh URL is not absolute."
+msgstr "A frissítési URL nem abszolút."
+
+#. #define SENDING_MESSAGE_WITH_BODY_TO
+#: LYMessages.c:669
+msgid ""
+"You are sending a message with body to:\n"
+" "
+msgstr ""
+"Ön egy üzenet küld ide:\n"
+" "
+
+#: LYMessages.c:670
+msgid ""
+"You are sending a comment to:\n"
+" "
+msgstr ""
+"Ön egy üzenetet küld ide:\n"
+" "
+
+#: LYMessages.c:671
+msgid ""
+"\n"
+" With copy to:\n"
+" "
+msgstr ""
+"\n"
+" Másolat ide:\n"
+" "
+
+#: LYMessages.c:672
+msgid ""
+"\n"
+" With copies to:\n"
+" "
+msgstr ""
+"\n"
+" Másolatok ide:\n"
+" "
+
+#. #define CTRL_G_TO_CANCEL_SEND
+#: LYMessages.c:674
+msgid ""
+"\n"
+"\n"
+"Use Ctrl-G to cancel if you do not want to send a message\n"
+msgstr ""
+"\n"
+"\n"
+"Használja a Ctrl G-t a megszakításhoz, ha mégsem akar üzenetet küldeni\n"
+
+#. #define ENTER_NAME_OR_BLANK
+#: LYMessages.c:676
+msgid ""
+"\n"
+" Please enter your name, or leave it blank to remain anonymous\n"
+msgstr ""
+"\n"
+" Kérem írja be a nevét, vagy hagyja üresen, ha névtelen akar maradni\n"
+
+#. #define ENTER_MAIL_ADDRESS_OR_OTHER
+#: LYMessages.c:678
+msgid ""
+"\n"
+" Please enter a mail address or some other\n"
+msgstr ""
+"\n"
+" Kérem írja ide az email címét, vagy más elérhetõségét\n"
+
+#. #define MEANS_TO_CONTACT_FOR_RESPONSE
+#: LYMessages.c:680
+msgid " means to contact you, if you desire a response.\n"
+msgstr " ahol kapcsolatba léphetnek önnel, ha választ vár.\n"
+
+#: LYMessages.c:681
+msgid ""
+"\n"
+" Please enter a subject line.\n"
+msgstr ""
+"\n"
+" Kérem írja be a levél tárgyát.\n"
+
+#. #define ENTER_ADDRESS_FOR_CC
+#: LYMessages.c:683
+msgid ""
+"\n"
+" Enter a mail address for a CC of your message.\n"
+msgstr ""
+"\n"
+" Írja be azt a címet, ahova szeretne az üzenetrõl másolatot küldeni.\n"
+
+#: LYMessages.c:684
+msgid " (Leave blank if you don't want a copy.)\n"
+msgstr " (Hagyja üresen, ha nem akar másolatot.)\n"
+
+#: LYMessages.c:685
+msgid ""
+"\n"
+" Please review the message body:\n"
+"\n"
+msgstr ""
+"\n"
+" Kérem nézze át az üzenet szövegét:\n"
+"\n"
+
+#: LYMessages.c:686
+msgid ""
+"\n"
+"Press RETURN to continue: "
+msgstr ""
+"\n"
+"Nyomjon RETURN-t a folytatáshoz: "
+
+#: LYMessages.c:687
+msgid ""
+"\n"
+"Press RETURN to clean up: "
+msgstr ""
+"\n"
+"Nyomjon RETURN-t a törléshez: "
+
+#: LYMessages.c:688
+msgid " Use Control-U to erase the default.\n"
+msgstr " Használja a Control-U -t a teljes törléshez\n"
+
+#: LYMessages.c:689
+msgid ""
+"\n"
+" Please enter your message below."
+msgstr ""
+"\n"
+" Ide írhatja az üzenet szövegét."
+
+#. #define ENTER_PERIOD_WHEN_DONE_A
+#: LYMessages.c:691 src/LYNews.c:360
+msgid ""
+"\n"
+" When you are done, press enter and put a single period (.)"
+msgstr ""
+"\n"
+" Mikor kész, nyomjon ENTER-t, és egy üres sorba írjon pontot (.)"
+
+#. #define ENTER_PERIOD_WHEN_DONE_B
+#: LYMessages.c:693 src/LYNews.c:361
+msgid ""
+"\n"
+" on a line and press enter again."
+msgstr ""
+"\n"
+" egy sorban nyomjon újból ENTER-t."
+
+#. Cookies messages
+#. #define ADVANCED_COOKIE_CONFIRMATION
+#: LYMessages.c:697
+#, c-format
+msgid "%s cookie: %.*s=%.*s Allow? (Y/N/Always/neVer)"
+msgstr "%s süti: %.*s=%.*s Engedjük? (Igen/Nem/Mindig/Soha)"
+
+#. #define INVALID_COOKIE_DOMAIN_CONFIRMATION
+#: LYMessages.c:699
+#, c-format
+msgid "Accept invalid cookie domain=%s for '%s'?"
+msgstr "Elfogadjuk az érvénytelen süti tartományt=%s %s-nek?"
+
+#. #define INVALID_COOKIE_PATH_CONFIRMATION
+#: LYMessages.c:701
+#, c-format
+msgid "Accept invalid cookie path=%s as a prefix of '%s'?"
+msgstr "Elfogadjuk az érvénytelen süti útvonalat=%s, mint '%s' elõtétjét?"
+
+#: LYMessages.c:702
+msgid "Allowing this cookie."
+msgstr "A süti elfogadása."
+
+#: LYMessages.c:703
+msgid "Rejecting this cookie."
+msgstr "A süti elutasítása."
+
+#: LYMessages.c:704
+msgid "The Cookie Jar is empty."
+msgstr "A sütis tálca üres."
+
+#: LYMessages.c:705
+#, fuzzy
+msgid "The Cache Jar is empty."
+msgstr "A sütis tálca üres."
+
+#. #define ACTIVATE_TO_GOBBLE
+#: LYMessages.c:707
+msgid "Activate links to gobble up cookies or entire domains,"
+msgstr "A hivatkozás aktiválásával felfalhatja a sütiket vagy teljes tartományokat,"
+
+#: LYMessages.c:708
+msgid "or to change a domain's 'allow' setting."
+msgstr "vagy módosíthatja a tartomány 'engedélyezési' beállítását."
+
+#: LYMessages.c:709
+msgid "(Cookies never allowed.)"
+msgstr "(Sütiket soha nem engedélyezi.)"
+
+#: LYMessages.c:710
+msgid "(Cookies always allowed.)"
+msgstr "(Sütiket mindig engedélyezi.)"
+
+#: LYMessages.c:711
+msgid "(Cookies allowed via prompt.)"
+msgstr "(Sütiket csak rákérdezés után engedélyezi.)"
+
+#: LYMessages.c:712
+msgid "(Persistent Cookies.)"
+msgstr "(Állandó sütik.)"
+
+#: LYMessages.c:713
+msgid "(No title.)"
+msgstr "(Nincs cím)"
+
+#: LYMessages.c:714
+msgid "(No name.)"
+msgstr "(Nincs név.)"
+
+#: LYMessages.c:715
+msgid "(No value.)"
+msgstr "(Nincs érték.)"
+
+#: LYMessages.c:716 src/LYOptions.c:2402
+msgid "None"
+msgstr "Nincs"
+
+#: LYMessages.c:717
+msgid "(End of session.)"
+msgstr "(Folyamat vége.)"
+
+#: LYMessages.c:718
+msgid "Delete this cookie?"
+msgstr "A süti törlése?"
+
+#: LYMessages.c:719
+msgid "The cookie has been eaten!"
+msgstr "A sütit megettük!"
+
+#: LYMessages.c:720
+msgid "Delete this empty domain?"
+msgstr "Töröljem ezt az üres tartományt?"
+
+#: LYMessages.c:721
+msgid "The domain has been eaten!"
+msgstr "A tartományt megettük!"
+
+#. #define DELETE_COOKIES_SET_ALLOW_OR_CANCEL
+#: LYMessages.c:723
+msgid "D)elete domain's cookies, set allow A)lways/P)rompt/neV)er, or C)ancel? "
+msgstr "A tartomány sütijeinek törlése (D), engedélyez mindig (A), kérdez (P), Soha (V), mégsem (C)?"
+
+#. #define DELETE_DOMAIN_SET_ALLOW_OR_CANCEL
+#: LYMessages.c:725
+msgid "D)elete domain, set allow A)lways/P)rompt/neV)er, or C)ancel? "
+msgstr "A tartomány törlése (D), engedélyez mindig (A), kérdez (P), Soha (V), mégsem (C)?"
+
+#: LYMessages.c:726
+msgid "All cookies in the domain have been eaten!"
+msgstr "Minden sütit megettünk ebben a tartományban!"
+
+#: LYMessages.c:727
+#, c-format
+msgid "'A'lways allowing from domain '%s'."
+msgstr "(A): Mindig engedélyezi a %s tartományt."
+
+#: LYMessages.c:728
+#, c-format
+msgid "ne'V'er allowing from domain '%s'."
+msgstr "(V): Soha nem engedélyezi a %s tartományt."
+
+#: LYMessages.c:729
+#, c-format
+msgid "'P'rompting to allow from domain '%s'."
+msgstr "(P): Rákérdez a %s tartomány engedélyezésére."
+
+#: LYMessages.c:730
+msgid "Delete all cookies in this domain?"
+msgstr "Töröljek minden sütit ebben a tartományban?"
+
+#: LYMessages.c:731
+msgid "All of the cookies in the jar have been eaten!"
+msgstr "Az összes sütit megettük errõl a tálcáról!"
+
+#: LYMessages.c:733
+msgid "Port 19 not permitted in URLs."
+msgstr "A 19-es port nem megengedett URL-ekben."
+
+#: LYMessages.c:734
+msgid "Port 25 not permitted in URLs."
+msgstr "A 25-ös port nem megengedett URL-ekben."
+
+#: LYMessages.c:735
+#, c-format
+msgid "Port %lu not permitted in URLs."
+msgstr "A %lu port nem megengedett URL-ekben."
+
+#: LYMessages.c:736
+msgid "URL has a bad port field."
+msgstr "Az URL-ben hibás a port beállítása."
+
+#: LYMessages.c:737
+msgid "Maximum nesting of HTML elements exceeded."
+msgstr "Túlléptük a maximálisan egymásba ágyazható HTML elemszámot."
+
+#: LYMessages.c:738
+msgid "Bad partial reference! Stripping lead dots."
+msgstr "Hibás részleges hivatkozás! A soreleji pontokat elhagyom."
+
+#: LYMessages.c:739
+msgid "Trace Log open failed. Trace off!"
+msgstr "A nyomozati napló megnyitása nem sikerült. Nyomozás kikapcsolva!"
+
+#: LYMessages.c:740
+msgid "Lynx Trace Log"
+msgstr "Lynx nyomozati napló"
+
+#: LYMessages.c:741
+msgid "No trace log has been started for this session."
+msgstr "Nincs nyomozati napló indítva ezen a folyamaton."
+
+#. #define MAX_TEMPCOUNT_REACHED
+#: LYMessages.c:743
+msgid "The maximum temporary file count has been reached!"
+msgstr "Elértük a maximális átmeneti fájlok számát!"
+
+#. #define FORM_VALUE_TOO_LONG
+#: LYMessages.c:745
+msgid "Form field value exceeds buffer length! Trim the tail."
+msgstr "Az ûrlap mezõ értéke nagyobb, mint a puffer hossza! Megpróbálom levágni a végét."
+
+#. #define FORM_TAIL_COMBINED_WITH_HEAD
+#: LYMessages.c:747
+msgid "Modified tail combined with head of form field value."
+msgstr "A módosított véget kombináltam az ûrlapmezõ fejlécével."
+
+#. HTFile.c
+#: LYMessages.c:750
+msgid "Directory"
+msgstr "Könyvtár"
+
+#: LYMessages.c:751
+msgid "Directory browsing is not allowed."
+msgstr "A könyvtárak tallózása nincs engedélyezve."
+
+#: LYMessages.c:752
+msgid "Selective access is not enabled for this directory"
+msgstr "A válogatott elérés nincs engedélyezve ezen a könyvtáron"
+
+#: LYMessages.c:753
+msgid "Multiformat: directory scan failed."
+msgstr "Multiformat: a könyvtár vizsgálata sikertelen."
+
+#: LYMessages.c:754
+msgid "This directory is not readable."
+msgstr "Ez a könyvtár nem olvasható."
+
+#: LYMessages.c:755
+msgid "Can't access requested file."
+msgstr "Nem lehet elérni a kívánt fájlt."
+
+#: LYMessages.c:756
+msgid "Could not find suitable representation for transmission."
+msgstr "Nem találtam megfelelõ ábrázolást az átvitelre."
+
+#: LYMessages.c:757
+msgid "Could not open file for decompression!"
+msgstr "Nem lehet megnyitni a fájlt a kitömörítéshez!"
+
+#: LYMessages.c:758
+msgid "Files:"
+msgstr "Fájlok:"
+
+#: LYMessages.c:759
+msgid "Subdirectories:"
+msgstr "Alkönyvtárak:"
+
+#: LYMessages.c:760
+msgid " directory"
+msgstr " könyvtár"
+
+#: LYMessages.c:761
+msgid "Up to "
+msgstr "Fel "
+
+#: LYMessages.c:762
+msgid "Current directory is "
+msgstr "A jelenlegi könyvtár "
+
+#. HTGopher.c
+#: LYMessages.c:765
+msgid "No response from server!"
+msgstr "Nem válaszol a szerver!"
+
+#: LYMessages.c:766
+msgid "CSO index"
+msgstr "CSO index"
+
+#: LYMessages.c:767
+msgid ""
+"\n"
+"This is a searchable index of a CSO database.\n"
+msgstr ""
+"\n"
+"Ez egy CSO adatbázis kereshetõ indexe.\n"
+
+#: LYMessages.c:768
+msgid "CSO Search Results"
+msgstr "CSO Keresés eredménye"
+
+#: LYMessages.c:769
+#, c-format
+msgid "Seek fail on %s\n"
+msgstr "A keresés nem sikerült: %s\n"
+
+#: LYMessages.c:770
+msgid ""
+"\n"
+"Press the 's' key and enter search keywords.\n"
+msgstr ""
+"\n"
+"Nyomja le az 's' gombot, és írja be a keresendõ szavakat.\n"
+
+#: LYMessages.c:771
+msgid ""
+"\n"
+"This is a searchable Gopher index.\n"
+msgstr ""
+"\n"
+"Ez egy kereshetõ Gopher index.\n"
+
+#: LYMessages.c:772
+msgid "Gopher index"
+msgstr "Gopher index"
+
+#: LYMessages.c:773
+msgid "Gopher Menu"
+msgstr "Gopher menü"
+
+#: LYMessages.c:774
+msgid " Search Results"
+msgstr " A keresés eredménye"
+
+#: LYMessages.c:775
+msgid "Sending CSO/PH request."
+msgstr "CSO/PH kérés küldése."
+
+#: LYMessages.c:776
+msgid "Sending Gopher request."
+msgstr "Gopher kérés küldése."
+
+#: LYMessages.c:777
+msgid "CSO/PH request sent; waiting for response."
+msgstr "CSO/PH kérés elküldve; várakozás a válaszra."
+
+#: LYMessages.c:778
+msgid "Gopher request sent; waiting for response."
+msgstr "Gopher kérés elküldve; várakozás a válaszra."
+
+#: LYMessages.c:779
+msgid ""
+"\n"
+"Please enter search keywords.\n"
+msgstr ""
+"\n"
+"Írja be a keresendõ kulcsszavakat.\n"
+
+#: LYMessages.c:780
+msgid ""
+"\n"
+"The keywords that you enter will allow you to search on a"
+msgstr ""
+"\n"
+"A megadott kulcsszavak lehetõvé teszik a keresést egy"
+
+#: LYMessages.c:781
+msgid " person's name in the database.\n"
+msgstr " személy neve után az adatbázisban.\n"
+
+#. HTNews.c
+#: LYMessages.c:784
+msgid "Connection closed ???"
+msgstr "A kapcsolat bezáródott?"
+
+#: LYMessages.c:785
+msgid "Cannot open temporary file for news POST."
+msgstr "Nem sikerült az átmeneti fájl megnyitása a hírek postázásához."
+
+#: LYMessages.c:786
+msgid "This client does not contain support for posting to news with SSL."
+msgstr "Ez az ügyfél nem tartalmazza az SSL kapcsolaton keresztüli hírküldést."
+
+#. HTStyle.c
+#: LYMessages.c:789
+#, c-format
+msgid "Style %d `%s' SGML:%s. Font %s %.1f point.\n"
+msgstr "%d stílus `%s' SGML:%s. %s font %.1f pont.\n"
+
+#: LYMessages.c:791
+#, c-format
+msgid "\tAlign=%d, %d tabs. (%.0f before, %.0f after)\n"
+msgstr "\tIgazítás=%d, %d tab (%.0f elõtte, %.0f mögötte)\n"
+
+#: LYMessages.c:792
+#, c-format
+msgid "\t\tTab kind=%d at %.0f\n"
+msgstr "\t\tTab típusa=%d a %.0f-nél\n"
+
+#. HTTP.c
+#: LYMessages.c:795
+msgid "Can't proceed without a username and password."
+msgstr "Nem lehet folytatni felhasználói név és jelszó nélkül."
+
+#: LYMessages.c:796
+msgid "Can't retry with authorization! Contact the server's WebMaster."
+msgstr "Nem lehet újrapróbálni az azonosítást! Lépjen kapcsolatba a szerver webmesterével."
+
+#: LYMessages.c:797
+msgid "Can't retry with proxy authorization! Contact the server's WebMaster."
+msgstr "Nem lehet újrapróbálni proxy felhatalmazást! Lépjen kapcsolatba a szerver webmesterével."
+
+#: LYMessages.c:798
+msgid "Retrying with proxy authorization information."
+msgstr "Újra próbálkozom a proxy felhatalmazási információval."
+
+#: LYMessages.c:799
+#, fuzzy, c-format
+msgid "SSL error:%s-Continue?"
+msgstr "SSL hiba:host(%s)!=cert(%s)-Tovább?"
+
+#. HTWAIS.c
+#: LYMessages.c:802
+msgid "HTWAIS: Return message too large."
+msgstr "HTWAIS: A visszaadott üzenet túl nagy."
+
+#: LYMessages.c:803
+msgid "Enter WAIS query: "
+msgstr "Gépelje be a WAIS keresést: "
+
+#. Miscellaneous status
+#: LYMessages.c:806
+msgid "Retrying as HTTP0 request."
+msgstr "Újra próbálom HTTP0 kéréssel."
+
+#: LYMessages.c:807
+#, c-format
+msgid "Transferred %d bytes"
+msgstr "Továbbítva %d bájt"
+
+#: LYMessages.c:808
+msgid "Data transfer complete"
+msgstr "Adatátvitel kész"
+
+#: LYMessages.c:809
+#, c-format
+msgid "Error processing line %d of %s\n"
+msgstr "Hiba a feldolgozásban a %d. sorban (össz: %s)\n"
+
+#. Lynx internal page titles
+#: LYMessages.c:812
+msgid "Address List Page"
+msgstr "Címlista lap"
+
+#: LYMessages.c:813
+msgid "Bookmark file"
+msgstr "Könyvjelzõ fájl"
+
+#: LYMessages.c:814
+msgid "Configuration Definitions"
+msgstr "Beállítás meghatározásai"
+
+#: LYMessages.c:815
+msgid "Cookie Jar"
+msgstr "Sütis tálca"
+
+#: LYMessages.c:816
+msgid "Current Key Map"
+msgstr "Jelenlegi billentyûkiosztás"
+
+#: LYMessages.c:817
+msgid "File Management Options"
+msgstr "Fájlkezelési beállítások"
+
+#: LYMessages.c:818
+msgid "Download Options"
+msgstr "Letöltési beállítások"
+
+#: LYMessages.c:819
+msgid "History Page"
+msgstr "Elõzmények lap"
+
+#: LYMessages.c:820
+#, fuzzy
+msgid "Cache Jar"
+msgstr "Sütis tálca"
+
+#: LYMessages.c:821
+msgid "List Page"
+msgstr "Lista lap"
+
+#: LYMessages.c:822
+msgid "Lynx.cfg Information"
+msgstr "Lynx.cfg információ"
+
+#: LYMessages.c:823
+msgid "Converted Mosaic Hotlist"
+msgstr "Átalakított Mosaic gyorslista"
+
+#: LYMessages.c:824
+msgid "Options Menu"
+msgstr "Beállítások menü"
+
+#: LYMessages.c:825
+msgid "File Permission Options"
+msgstr "Fájl-jogok beállításai"
+
+#: LYMessages.c:826
+msgid "Printing Options"
+msgstr "Nyomtatási beállítások"
+
+#: LYMessages.c:827
+msgid "Information about the current document"
+msgstr "Információ az aktuális dokumentumról"
+
+#: LYMessages.c:828
+msgid "Your recent statusline messages"
+msgstr "A legutóbbi állapotsori üzenetek"
+
+#: LYMessages.c:829
+msgid "Upload Options"
+msgstr "Feltöltési beállítások"
+
+#: LYMessages.c:830
+msgid "Visited Links Page"
+msgstr "Látogatott linkek lapja"
+
+#. CONFIG_DEF_TITLE subtitles
+#: LYMessages.c:833
+msgid "See also"
+msgstr "Lásd még:"
+
+#: LYMessages.c:834
+msgid "your"
+msgstr "az ön"
+
+#: LYMessages.c:835
+msgid "for runtime options"
+msgstr "futásidejû beállítások"
+
+#: LYMessages.c:836
+msgid "compile time options"
+msgstr "programfordítási beállítások"
+
+#: LYMessages.c:837
+msgid "color-style configuration"
+msgstr "szín-stílus beállítása"
+
+#: LYMessages.c:838
+msgid "latest release"
+msgstr "A Lynx honlapja"
+
+#: LYMessages.c:839
+msgid "pre-release version"
+msgstr "A Lynx kiadás elõtti változata"
+
+#: LYMessages.c:840
+msgid "development version"
+msgstr "Fejlesztõi változat helye"
+
+#. #define AUTOCONF_CONFIG_CACHE
+#: LYMessages.c:842
+msgid ""
+"The following data were derived during the automatic configuration/build\n"
+"process of this copy of Lynx. When reporting a bug, please include a copy\n"
+"of this page."
+msgstr ""
+"A következõ adatok ennek a Lynx példánynak az automatikus konfigurációja/\n"
+"fordítása alatt készültek. Ha hibajelentést küld, kérem mellékeljen \n"
+"egy másolatot errõl az oldalról. (másolat: 'p' parancs)"
+
+#. #define AUTOCONF_LYNXCFG_H
+#: LYMessages.c:846
+msgid ""
+"The following data were used as automatically-configured compile-time\n"
+"definitions when this copy of Lynx was built."
+msgstr ""
+"A következõ adatok lettek felhasználva ennek a Lynx példánynak az automatikus\n"
+" konfigurálása során."
+
+#. #define DIRED_NOVICELINE
+#: LYMessages.c:851
+msgid " C)reate D)ownload E)dit F)ull menu M)odify R)emove T)ag U)pload \n"
+msgstr "Létrehoz (C), Letölt (D), Szerkeszt (E), Teljes menü (F), Módosít (M), Eltávolít (R), Jelöl (T), Feltölt (U)\n"
+
+#: LYMessages.c:852
+msgid "Failed to obtain status of current link!"
+msgstr "Nem sikerült megállapítani az aktuális link állapotát!"
+
+#. #define INVALID_PERMIT_URL
+#: LYMessages.c:855
+msgid "Special URL only valid from current File Permission menu!"
+msgstr "Speciális URL csak az aktuális Fájl-Jogok menübõl érvényes!"
+
+#: LYMessages.c:859
+msgid "External support is currently disabled."
+msgstr "A külsõ támogatás jelenleg le van tiltva."
+
+#. new with 2.8.4dev.21
+#: LYMessages.c:863
+msgid "Changing working-directory is currently disabled."
+msgstr "A munkakönyvtár váltás most le van tiltva."
+
+#: LYMessages.c:864
+msgid "Linewrap OFF!"
+msgstr "Sortörés KI!"
+
+#: LYMessages.c:865
+msgid "Linewrap ON!"
+msgstr "Sortörés BE!"
+
+#: LYMessages.c:866
+msgid "Parsing nested-tables toggled OFF! Reloading..."
+msgstr "Egymásba ágyazott táblázatok kikapcsolva! Újratöltés..."
+
+#: LYMessages.c:867
+msgid "Parsing nested-tables toggled ON! Reloading..."
+msgstr "Egymásba ágyazott táblázatok bekapcsolva! Újratöltés..."
+
+#: LYMessages.c:868
+msgid "Shifting is disabled while line-wrap is in effect"
+msgstr "Az eltolás le van tiltva a sortörés alatt"
+
+#: LYMessages.c:869
+msgid "Trace not supported"
+msgstr "A nyomozás nincs támogatva"
+
+#: LYMessages.c:790
+#, c-format
+msgid "\tIndents: first=%.0f others=%.0f, Height=%.1f Desc=%.1f\n"
+msgstr "\tÖsszetevõk: elsõ=%.0f többi=%.0f, Magasság=%.1f Leírás=%.1f\n"
+
+#: WWW/Library/Implementation/HTAABrow.c:626
+#, c-format
+msgid "Username for '%s' at %s '%s%s':"
+msgstr "'%s' %s '%s%s' felhasználónév:"
+
+#: WWW/Library/Implementation/HTAABrow.c:894
+msgid "This client doesn't know how to compose proxy authorization information for scheme"
+msgstr "Ez a program nem tudja, hogyan kell összeállítani proxy jogosultságot ehhez a sémához"
+
+#: WWW/Library/Implementation/HTAABrow.c:971
+msgid "This client doesn't know how to compose authorization information for scheme"
+msgstr "Ez az ügyfél nem tudja, hogyan kell összeállítani jogosultságot ehhez a sémához"
+
+#: WWW/Library/Implementation/HTAABrow.c:1079
+#, c-format
+msgid "Invalid header '%s%s%s%s%s'"
+msgstr "Helytelen fejléc: '%s%s%s%s%s'"
+
+#: WWW/Library/Implementation/HTAABrow.c:1181
+msgid "Proxy authorization required -- retrying"
+msgstr "Proxy felhatalmazás szükséges -- újra"
+
+#: WWW/Library/Implementation/HTAABrow.c:1239
+msgid "Access without authorization denied -- retrying"
+msgstr "Felhatalmazás nélküli elérés megtagadva -- újra"
+
+#: WWW/Library/Implementation/HTAccess.c:688
+msgid "Access forbidden by rule"
+msgstr "Az elérést szabály tiltja"
+
+#: WWW/Library/Implementation/HTAccess.c:783
+msgid "Document with POST content not found in cache. Resubmit?"
+msgstr "POST tartalommal rendelkezõ dokumentum nem található a gyorstárban. Újratöltsem?"
+
+#: WWW/Library/Implementation/HTAccess.c:938
+msgid "Loading failed, use a previous copy."
+msgstr "A betöltés sikertelen, korábbi példány használata."
+
+#: WWW/Library/Implementation/HTAccess.c:1047 src/GridText.c:8546
+msgid "Loading incomplete."
+msgstr "A betöltés nem teljes."
+
+#: WWW/Library/Implementation/HTAccess.c:1078
+#, c-format
+msgid "**** HTAccess: socket or file number returned by obsolete load routine!\n"
+msgstr "**** HTAccess: elavult betöltési rutin által adott socket vagy fájl szám!\n"
+
+#: WWW/Library/Implementation/HTAccess.c:1080
+#, c-format
+msgid "**** HTAccess: Internal software error. Please mail lynx-dev@nongnu.org!\n"
+msgstr "**** HTaccess: Belsõ programhiba. Kérem írjon egy emailt a lynx-dev@nongnu.org címre (angolul)!\n"
+
+#: WWW/Library/Implementation/HTAccess.c:1081
+#, c-format
+msgid "**** HTAccess: Status returned was: %d\n"
+msgstr "**** HTAccess: Visszatérési állapot: %d\n"
+
+#.
+#. * hack: if we fail in HTAccess.c
+#. * avoid duplicating URL, oh.
+#.
+#: WWW/Library/Implementation/HTAccess.c:1087 src/LYMainLoop.c:7779
+msgid "Can't Access"
+msgstr "Nem lehet elérni"
+
+#: WWW/Library/Implementation/HTAccess.c:1095
+msgid "Unable to access document."
+msgstr "Nem lehet elérni a dokumentumot."
+
+#: WWW/Library/Implementation/HTFTP.c:843
+#, c-format
+msgid "Enter password for user %s@%s:"
+msgstr "Kérem a %s@%s felhasználó jelszavát:"
+
+#: WWW/Library/Implementation/HTFTP.c:871
+msgid "Unable to connect to FTP host."
+msgstr "Nem lehet kapcsolódni az FTP kiszolgálóhoz."
+
+#: WWW/Library/Implementation/HTFTP.c:1152
+msgid "close master socket"
+msgstr "a fõ socket bezárása"
+
+#: WWW/Library/Implementation/HTFTP.c:1214
+msgid "socket for master socket"
+msgstr "socket a fõ-socket-hez"
+
+#.
+#. * It's a symbolic link, does the user care about knowing if it is
+#. * symbolic? I think so since it might be a directory.
+#.
+#: WWW/Library/Implementation/HTFTP.c:1733 WWW/Library/Implementation/HTFTP.c:2350
+msgid "Symbolic Link"
+msgstr "Szimbolikus hivatkozás"
+
+#: WWW/Library/Implementation/HTFTP.c:2707
+msgid "Receiving FTP directory."
+msgstr "FTP könyvtár fogadása."
+
+#: WWW/Library/Implementation/HTFTP.c:2843
+#, c-format
+msgid "Transferred %d bytes (%5d)"
+msgstr "Letöltve: %d bájt (%5d)"
+
+#: WWW/Library/Implementation/HTFTP.c:3194
+msgid "connect for data"
+msgstr "kapcsolás az adatért"
+
+#: WWW/Library/Implementation/HTFTP.c:3855
+msgid "Receiving FTP file."
+msgstr "FTP fájl fogadása."
+
+#: WWW/Library/Implementation/HTFinger.c:273
+msgid "Could not set up finger connection."
+msgstr "Nem lehet finger csatlakozást felépíteni."
+
+#: WWW/Library/Implementation/HTFinger.c:320
+msgid "Could not load data (no sitename in finger URL)"
+msgstr "Nem lehet betölteni az adatokat (nincs megadva webhely a finger URL-ben)"
+
+#: WWW/Library/Implementation/HTFinger.c:326
+msgid "Invalid port number - will only use port 79!"
+msgstr "Érvénytelen port szám - csak a 79-es port lesz használva!"
+
+#: WWW/Library/Implementation/HTFinger.c:392
+msgid "Could not access finger host."
+msgstr "Nem lehet elérni a finger gazdagépet."
+
+#: WWW/Library/Implementation/HTFinger.c:400
+msgid "No response from finger server."
+msgstr "Nem válaszol a finger szerver."
+
+#: WWW/Library/Implementation/HTNews.c:426
+#, c-format
+msgid "Username for news host '%s':"
+msgstr "Felhasználónév a(z) '%s' hírszolgáltatóhoz:"
+
+#: WWW/Library/Implementation/HTNews.c:479
+msgid "Change username?"
+msgstr "Felhasználónév módosítása?"
+
+#: WWW/Library/Implementation/HTNews.c:483
+msgid "Username:"
+msgstr "Felhasználói név:"
+
+#: WWW/Library/Implementation/HTNews.c:508
+#, c-format
+msgid "Password for news host '%s':"
+msgstr "Jelszó a(z) '%s' hírszolgáltatóhoz:"
+
+#: WWW/Library/Implementation/HTNews.c:591
+msgid "Change password?"
+msgstr "Jelszó módosítása?"
+
+#: WWW/Library/Implementation/HTNews.c:1711
+#, c-format
+msgid "No matches for: %s"
+msgstr "Nincs illeszkedés: %s"
+
+#: WWW/Library/Implementation/HTNews.c:1761
+msgid ""
+"\n"
+"No articles in this group.\n"
+msgstr ""
+"\n"
+"Nincs cikk ebben csoportban.\n"
+
+#: WWW/Library/Implementation/HTNews.c:1773
+msgid ""
+"\n"
+"No articles in this range.\n"
+msgstr ""
+"\n"
+"Nincs cikk ebben tartományban.\n"
+
+#.
+#. * Set window title.
+#.
+#: WWW/Library/Implementation/HTNews.c:1786
+#, c-format
+msgid "%s, Articles %d-%d"
+msgstr "%s, Cikk: %d-%d"
+
+#: WWW/Library/Implementation/HTNews.c:1809
+msgid "Earlier articles"
+msgstr "Korábbi cikkek"
+
+#: WWW/Library/Implementation/HTNews.c:1822
+#, c-format
+msgid ""
+"\n"
+"There are about %d articles currently available in %s, IDs as follows:\n"
+"\n"
+msgstr ""
+"\n"
+"Körülbelül %d cikk van itt: %s, a következõ azonosítókkal:\n"
+"\n"
+
+#: WWW/Library/Implementation/HTNews.c:1884
+msgid "All available articles in "
+msgstr "Minden rendelkezésre álló cikk "
+
+#: WWW/Library/Implementation/HTNews.c:2098
+msgid "Later articles"
+msgstr "Újabb cikkek"
+
+#: WWW/Library/Implementation/HTNews.c:2121
+msgid "Post to "
+msgstr "Cikk írása "
+
+#: WWW/Library/Implementation/HTNews.c:2342
+msgid "This client does not contain support for SNEWS URLs."
+msgstr "Ez az ügyfél nem támogatja az SNEWS URL-eket."
+
+#: WWW/Library/Implementation/HTNews.c:2550
+msgid "No target for raw text!"
+msgstr "Nincs cél a nyers szöveghez!"
+
+#: WWW/Library/Implementation/HTNews.c:2581
+msgid "Connecting to NewsHost ..."
+msgstr "Kapcsolódás NewsHost-hoz..."
+
+#: WWW/Library/Implementation/HTNews.c:2633
+#, c-format
+msgid "Could not access %s."
+msgstr "Nem lehet elérni %s-t."
+
+#: WWW/Library/Implementation/HTNews.c:2739
+#, c-format
+msgid "Can't read news info. News host %.20s responded: %.200s"
+msgstr "Nem lehet olvasni a hír információkat. A %.20s hírszolgáltató válasza: %.200s"
+
+#: WWW/Library/Implementation/HTNews.c:2743
+#, c-format
+msgid "Can't read news info, empty response from host %s"
+msgstr "Nem lehet olvasni a hír információkat. A %s hírszolgáltató üres választ adott"
+
+#.
+#. * List available newsgroups. - FM
+#.
+#: WWW/Library/Implementation/HTNews.c:2947
+msgid "Reading list of available newsgroups."
+msgstr "A rendelkezésre álló hírcsoportok olvasása."
+
+#: WWW/Library/Implementation/HTNews.c:2968
+msgid "Reading list of articles in newsgroup."
+msgstr "A hírlista olvasása a hírcsoportból."
+
+#.
+#. * Get an article from a news group. - FM
+#.
+#: WWW/Library/Implementation/HTNews.c:2974
+msgid "Reading news article."
+msgstr "Cikk olvasása."
+
+#: WWW/Library/Implementation/HTNews.c:3004
+msgid "Sorry, could not load requested news."
+msgstr "Sajnálom, nem tudom betölteni a hírt."
+
+#: WWW/Library/Implementation/HTTCP.c:1282
+msgid "Address has invalid port"
+msgstr "A címben érvénytelen a port"
+
+#: WWW/Library/Implementation/HTTCP.c:1358
+msgid "Address length looks invalid"
+msgstr "A cím hosszúsága érvénytelen"
+
+#: WWW/Library/Implementation/HTTCP.c:1618 WWW/Library/Implementation/HTTCP.c:1636
+#, c-format
+msgid "Unable to locate remote host %s."
+msgstr "Nem találom a %s távoli számítógépet."
+
+#. Not HTProgress, so warning won't be overwritten immediately;
+#. * but not HTAlert, because typically there will be other
+#. * alerts from the callers. - kw
+#.
+#: WWW/Library/Implementation/HTTCP.c:1633 WWW/Library/Implementation/HTTelnet.c:115
+#, c-format
+msgid "Invalid hostname %s"
+msgstr "A %s helytelen gépnév"
+
+#: WWW/Library/Implementation/HTTCP.c:1647
+#, c-format
+msgid "Making %s connection to %s"
+msgstr "%s csatlakozás létrehozása ide: %s"
+
+#: WWW/Library/Implementation/HTTCP.c:1658
+msgid "socket failed."
+msgstr "az illesztõpont sérült."
+
+#: WWW/Library/Implementation/HTTCP.c:1671
+#, c-format
+msgid "socket failed: family %d addr %s port %s."
+msgstr "az illesztõpont sérült: család: %d cím: %s port: %s."
+
+#: WWW/Library/Implementation/HTTCP.c:1695
+msgid "Could not make connection non-blocking."
+msgstr "Nem sikerült a nem blokkolt csatlakozás."
+
+#: WWW/Library/Implementation/HTTCP.c:1763
+msgid "Connection failed (too many retries)."
+msgstr "A kapcsolat sikertelen (túl sok próbálkozás)."
+
+#: WWW/Library/Implementation/HTTCP.c:1950
+msgid "Could not restore socket to blocking."
+msgstr "Nem lehet visszaállítani az illesztõpontot blokkoltra."
+
+#: WWW/Library/Implementation/HTTCP.c:2016
+#, fuzzy
+msgid "Socket read failed (too many tries)."
+msgstr "A kapcsolat sikertelen (túl sok próbálkozás)."
+
+#: WWW/Library/Implementation/HTTP.c:84
+#, c-format
+msgid "SSL callback:%s, preverify_ok=%d, ssl_okay=%d"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:406
+#, c-format
+msgid "Address contains a username: %s"
+msgstr "A cím felhasználói nevet tartalmaz: %s"
+
+#: WWW/Library/Implementation/HTTP.c:460
+#, c-format
+msgid "Certificate issued by: %s"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:620
+msgid "This client does not contain support for HTTPS URLs."
+msgstr "Ez az ügyfél nem támogatja a HTTPS URL-eket."
+
+#: WWW/Library/Implementation/HTTP.c:645
+msgid "Unable to connect to remote host."
+msgstr "Nem lehet kapcsolódni a távoli számítógéphez."
+
+#: WWW/Library/Implementation/HTTP.c:669
+msgid "Retrying connection without TLS."
+msgstr "Újbóli csatlakozás TLS nélkül."
+
+#: WWW/Library/Implementation/HTTP.c:714
+msgid "no issuer was found"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:716
+msgid "issuer is not a CA"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:718
+msgid "the certificate has no known issuer"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:720
+#, fuzzy
+msgid "the certificate has been revoked"
+msgstr "A sütit megettük!"
+
+#: WWW/Library/Implementation/HTTP.c:722
+msgid "the certificate is not trusted"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:807
+#, c-format
+msgid "Verified connection to %s (cert=%s)"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:855 WWW/Library/Implementation/HTTP.c:901
+#, c-format
+msgid "Verified connection to %s (subj=%s)"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:931
+#, fuzzy
+msgid "Can't find common name in certificate"
+msgstr "SSL hiba: nem található azonos név a bizonyítványban - folytatjuk?"
+
+#: WWW/Library/Implementation/HTTP.c:934
+#, c-format
+msgid "SSL error:host(%s)!=cert(%s)-Continue?"
+msgstr "SSL hiba:host(%s)!=cert(%s)-Tovább?"
+
+#: WWW/Library/Implementation/HTTP.c:947
+#, c-format
+msgid "UNVERIFIED connection to %s (cert=%s)"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:956
+#, c-format
+msgid "Secure %d-bit %s (%s) HTTP connection"
+msgstr "Biztonságos %d-bit %s (%s) HTTP csatlakozás"
+
+#: WWW/Library/Implementation/HTTP.c:1426
+msgid "Sending HTTP request."
+msgstr "HTTP kérés küldése."
+
+#: WWW/Library/Implementation/HTTP.c:1465
+msgid "Unexpected network write error; connection aborted."
+msgstr "Váratlan hálózati írási hiba; a csatlakozás megszakítva."
+
+#: WWW/Library/Implementation/HTTP.c:1471
+msgid "HTTP request sent; waiting for response."
+msgstr "HTTP kérés elküldve, várakozás a válaszra."
+
+#: WWW/Library/Implementation/HTTP.c:1539
+msgid "Unexpected network read error; connection aborted."
+msgstr "Váratlan hálózati olvasási hiba, a csatlakozás megszakítva."
+
+#.
+#. * HTTP/1.1 Informational statuses.
+#. * 100 Continue.
+#. * 101 Switching Protocols.
+#. * > 101 is unknown.
+#. * We should never get these, and they have only the status
+#. * line and possibly other headers, so we'll deal with them by
+#. * showing the full header to the user as text/plain. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:1733
+msgid "Got unexpected Informational Status."
+msgstr "Váratlan tájékoztatást kaptam az állapotról."
+
+#.
+#. * Reset Content. The server has fulfilled the request but
+#. * nothing is returned and we should reset any form
+#. * content. We'll instruct the user to do that, and
+#. * restore the current document. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:1767
+msgid "Request fulfilled. Reset Content."
+msgstr "Kérés teljesítve. Állítsa vissza a tartalmat."
+
+#. Not Modified
+#.
+#. * We didn't send an "If-Modified-Since" header, so this
+#. * status is inappropriate. We'll deal with it by showing
+#. * the full header to the user as text/plain. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:1884
+msgid "Got unexpected 304 Not Modified status."
+msgstr "Váratlan 304-es hiba: Nem lett módosítva az állapot."
+
+#: WWW/Library/Implementation/HTTP.c:1947
+msgid "Redirection of POST content requires user approval."
+msgstr "A POST tartalom átirányításához felhasználói engedély kell."
+
+#: WWW/Library/Implementation/HTTP.c:1962
+msgid "Have POST content. Treating Permanent Redirection as Temporary.\n"
+msgstr "POST tartalom. Az állandó átirányítást átmenetiként kezelem.\n"
+
+#: WWW/Library/Implementation/HTTP.c:2004
+msgid "Retrying with access authorization information."
+msgstr "Újra próbálom elérés felhatalmazási információval."
+
+#: WWW/Library/Implementation/HTTP.c:2016
+msgid "Show the 401 message body?"
+msgstr "Mutassam a 401-es üzenet szövegét?"
+
+#: WWW/Library/Implementation/HTTP.c:2059
+msgid "Show the 407 message body?"
+msgstr "Mutassam a 407-es üzenet szövegét?"
+
+#.
+#. * Bad or unknown server_status number. Take a chance and hope
+#. * there is something to display. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2159
+msgid "Unknown status reply from server!"
+msgstr "A szerver válasza: Ismeretlen állapot!"
+
+#: WWW/Library/Implementation/HTTelnet.c:113
+#, c-format
+msgid "remote %s session:"
+msgstr "távoli %s folyamat:"
+
+#: WWW/Library/Implementation/HTWAIS.c:162
+msgid "Could not connect to WAIS server."
+msgstr "Nem lehet kapcsolódni WAIS szerverhez."
+
+#: WWW/Library/Implementation/HTWAIS.c:170
+msgid "Could not open WAIS connection for reading."
+msgstr "Nem lehet megnyitni WAIS csatlakozást az olvasáshoz."
+
+#: WWW/Library/Implementation/HTWAIS.c:192
+msgid "Diagnostic code is "
+msgstr "A diagnosztikai kód "
+
+#: WWW/Library/Implementation/HTWAIS.c:464
+msgid "Index "
+msgstr "Index "
+
+#: WWW/Library/Implementation/HTWAIS.c:468
+#, c-format
+msgid " contains the following %d item%s relevant to \""
+msgstr " tartalmazza a következõ %d elemet %s fontos \""
+
+#: WWW/Library/Implementation/HTWAIS.c:476
+msgid "The first figure after each entry is its relative score, "
+msgstr "Minden bejegyzés után álló elsõ számjegy egy arányos pontszám, "
+
+#: WWW/Library/Implementation/HTWAIS.c:477
+msgid "the second is the number of lines in the item."
+msgstr "a második a sorok száma a tételben."
+
+#: WWW/Library/Implementation/HTWAIS.c:519
+msgid " (bad file name)"
+msgstr " (hibás fájlnév)"
+
+#: WWW/Library/Implementation/HTWAIS.c:545
+msgid "(bad doc id)"
+msgstr "(hibás dok. azonosító)"
+
+#: WWW/Library/Implementation/HTWAIS.c:561
+msgid "(Short Header record, can't display)"
+msgstr "(Rövid fejléc-rekord, nem lehet megjeleníteni)"
+
+#: WWW/Library/Implementation/HTWAIS.c:568
+msgid ""
+"\n"
+"Long Header record, can't display\n"
+msgstr ""
+"\n"
+"Hosszú fejlécrekord, nem lehet megjeleníteni\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:575
+msgid ""
+"\n"
+"Text record\n"
+msgstr ""
+"\n"
+"Szöveg rekord\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:584
+msgid ""
+"\n"
+"Headline record, can't display\n"
+msgstr ""
+"\n"
+"Fejléc-rekord, nem lehet megjeleníteni\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:592
+msgid ""
+"\n"
+"Code record, can't display\n"
+msgstr ""
+"\n"
+"Kód rekord, nem lehet megjeleníteni\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:696
+msgid "Syntax error in WAIS URL"
+msgstr "Szintaktikai hiba a WAIS URL-ben"
+
+#: WWW/Library/Implementation/HTWAIS.c:768
+msgid " (WAIS Index)"
+msgstr " (WAIS Index)"
+
+#: WWW/Library/Implementation/HTWAIS.c:775
+msgid "WAIS Index: "
+msgstr "WAIS Index: "
+
+#: WWW/Library/Implementation/HTWAIS.c:781
+msgid "This is a link for searching the "
+msgstr "Ezt a hivatkozást keresem a "
+
+#: WWW/Library/Implementation/HTWAIS.c:785
+msgid " WAIS Index.\n"
+msgstr " WAIS Indexben.\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:814
+msgid ""
+"\n"
+"Enter the 's'earch command and then specify search words.\n"
+msgstr ""
+"\n"
+"Adjon ki keresés parancsot (S), és határozza meg a keresendõ szavakat.\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:836
+msgid " (in "
+msgstr " ("
+
+#: WWW/Library/Implementation/HTWAIS.c:845
+msgid "WAIS Search of \""
+msgstr "WAIS Keresés: \""
+
+#: WWW/Library/Implementation/HTWAIS.c:849
+msgid "\" in: "
+msgstr "\" itt: "
+
+#: WWW/Library/Implementation/HTWAIS.c:864
+msgid "HTWAIS: Request too large."
+msgstr "HTWAIS: A kérés túl nagy."
+
+#: WWW/Library/Implementation/HTWAIS.c:873
+msgid "Searching WAIS database..."
+msgstr "Keresés a WAIS adatbázisban..."
+
+#: WWW/Library/Implementation/HTWAIS.c:883
+msgid "Search interrupted."
+msgstr "A keresés megszakítva."
+
+#: WWW/Library/Implementation/HTWAIS.c:934
+msgid "Can't convert format of WAIS document"
+msgstr "Nem lehet átalakítani WAIS dokumentum formátumot"
+
+#: WWW/Library/Implementation/HTWAIS.c:978
+msgid "HTWAIS: Request too long."
+msgstr "HTWAIS: A kérés túl hosszú."
+
+#.
+#. * Actually do the transaction given by request_message.
+#.
+#: WWW/Library/Implementation/HTWAIS.c:992
+msgid "Fetching WAIS document..."
+msgstr "WAIS dokumentum lehívása..."
+
+#. display_search_response(target, retrieval_response,
+#. wais_database, keywords);
+#: WWW/Library/Implementation/HTWAIS.c:1031
+msgid "No text was returned!\n"
+msgstr "Nem jött vissza szöveg!\n"
+
+#: WWW/Library/Implementation/HTWSRC.c:296
+msgid " NOT GIVEN in source file; "
+msgstr " NINCS MEGADVA a forrás fájlban, "
+
+#: WWW/Library/Implementation/HTWSRC.c:319
+msgid " WAIS source file"
+msgstr " WAIS forrás fájl"
+
+#: WWW/Library/Implementation/HTWSRC.c:326
+msgid " description"
+msgstr " leírás"
+
+#: WWW/Library/Implementation/HTWSRC.c:336
+msgid "Access links"
+msgstr "Hivatkozás elérése"
+
+#: WWW/Library/Implementation/HTWSRC.c:357
+msgid "Direct access"
+msgstr "Közvetlen elérés"
+
+#. * Proxy will be used if defined, so let user know that - FM *
+#: WWW/Library/Implementation/HTWSRC.c:360
+msgid " (or via proxy server, if defined)"
+msgstr " (vagy proxykiszolgálón keresztül, ha meg van adva)"
+
+#: WWW/Library/Implementation/HTWSRC.c:375
+msgid "Maintainer"
+msgstr "Karbantartó"
+
+#: WWW/Library/Implementation/HTWSRC.c:383
+msgid "Host"
+msgstr "Kiszolgáló"
+
+#: src/GridText.c:705
+msgid "Memory exhausted, display interrupted!"
+msgstr "A memória elfogyott, megjelenítés megszakítva!"
+
+#: src/GridText.c:710
+msgid "Memory exhausted, will interrupt transfer!"
+msgstr "A memória elfogyott, az átvitel meg lesz szakítva!"
+
+#: src/GridText.c:3654
+msgid " *** MEMORY EXHAUSTED ***"
+msgstr " *** A MEMÓRIA ELFOGYOTT ***"
+
+#: src/GridText.c:6089 src/GridText.c:6096 src/LYList.c:239
+msgid "unknown field or link"
+msgstr "ismeretlen mezõ vagy hivatkozás"
+
+#: src/GridText.c:6105
+msgid "text entry field"
+msgstr "szöveg bejegyzés mezõ"
+
+#: src/GridText.c:6108
+msgid "password entry field"
+msgstr "jelszó bejegyzés mezõ"
+
+#: src/GridText.c:6111
+msgid "checkbox"
+msgstr "jelölõnégyzet"
+
+#: src/GridText.c:6114
+msgid "radio button"
+msgstr "választógomb"
+
+#: src/GridText.c:6117
+msgid "submit button"
+msgstr "küldõ gomb"
+
+#: src/GridText.c:6120
+msgid "reset button"
+msgstr "törlés gomb"
+
+#: src/GridText.c:6123
+msgid "popup menu"
+msgstr "felbukkanó menü"
+
+#: src/GridText.c:6126
+msgid "hidden form field"
+msgstr "rejtett ûrlap mezõ"
+
+#: src/GridText.c:6129
+msgid "text entry area"
+msgstr "szöveg bejegyzés terület"
+
+#: src/GridText.c:6132
+msgid "range entry field"
+msgstr "tartomány bejegyzés mezõ"
+
+#: src/GridText.c:6135
+msgid "file entry field"
+msgstr "fájl bejegyzés mezõ"
+
+#: src/GridText.c:6138
+msgid "text-submit field"
+msgstr "szöveg-küldõ mezõ"
+
+#: src/GridText.c:6141
+msgid "image-submit button"
+msgstr "kép-küldõ mezõ"
+
+#: src/GridText.c:6144
+msgid "keygen field"
+msgstr "kulcsgeneráló mezõ"
+
+#: src/GridText.c:6147
+msgid "unknown form field"
+msgstr "ismeretlen ûrlap mezõ"
+
+#: src/GridText.c:10279
+msgid "Can't open file for uploading"
+msgstr "Nem lehet megnyitni a fájlt a feltöltéshez"
+
+#: src/GridText.c:11438
+#, c-format
+msgid "Submitting %s"
+msgstr "%s továbbítása"
+
+#. ugliness has happened; inform user and do the best we can
+#: src/GridText.c:12491
+msgid "Hang Detect: TextAnchor struct corrupted - suggest aborting!"
+msgstr "Akadásjelzés: A TextAnchor szerkezete sérült - javaslom a megszakítást!"
+
+#. don't show previous state
+#: src/GridText.c:12628
+msgid "Wrap lines to fit displayed area?"
+msgstr "Tördeljem a sorokat, hogy kiférjenek?"
+
+#: src/GridText.c:12680
+msgid "Very long lines have been wrapped!"
+msgstr "A hosszú sorokat új sorba tördeltem!"
+
+#: src/GridText.c:13185
+msgid "Very long lines have been truncated!"
+msgstr "A hosszú sorok végét levágtam!"
+
+#: src/HTAlert.c:164 src/LYShowInfo.c:360 src/LYShowInfo.c:364
+msgid "bytes"
+msgstr "bájt"
+
+#.
+#. * If we know the total size of the file, we can compute
+#. * a percentage, and show a corresponding progress bar.
+#.
+#: src/HTAlert.c:300 src/HTAlert.c:324
+#, c-format
+msgid "Read %s of data"
+msgstr "%s adat olvasása"
+
+#: src/HTAlert.c:321
+#, c-format
+msgid "Read %s of %s of data"
+msgstr "Adat olvasása: %s (összesen: %s)"
+
+#: src/HTAlert.c:330
+#, c-format
+msgid ", %s/sec"
+msgstr ", %s/sec"
+
+#: src/HTAlert.c:342
+#, c-format
+msgid " (stalled for %s)"
+msgstr " (megállt %s sec-ra)"
+
+#: src/HTAlert.c:346
+#, c-format
+msgid ", ETA %s"
+msgstr ", ETA %s sec"
+
+#: src/HTAlert.c:368
+msgid " (Press 'z' to abort)"
+msgstr " (Nyomja le a 'Z'-t a megszakításhoz)"
+
+#. Meta-note: don't move the following note from its place right
+#. in front of the first gettext(). As it is now, it should
+#. automatically appear in generated lynx.pot files. - kw
+#.
+#. NOTE TO TRANSLATORS: If you provide a translation for "yes", lynx
+#. * will take the first byte of the translation as a positive response
+#. * to Yes/No questions. If you provide a translation for "no", lynx
+#. * will take the first byte of the translation as a negative response
+#. * to Yes/No questions. For both, lynx will also try to show the
+#. * first byte in the prompt as a character, instead of (y) or (n),
+#. * respectively. This will not work right for multibyte charsets!
+#. * Don't translate "yes" and "no" for CJK character sets (or translate
+#. * them to "yes" and "no"). For a translation using UTF-8, don't
+#. * translate if the translation would begin with anything but a 7-bit
+#. * (US_ASCII) character. That also means do not translate if the
+#. * translation would begin with anything but a 7-bit character, if
+#. * you use a single-byte character encoding (a charset like ISO-8859-n)
+#. * but anticipate that the message catalog may be used re-encoded in
+#. * UTF-8 form.
+#. * For translations using other character sets, you may also wish to
+#. * leave "yes" and "no" untranslated, if using (y) and (n) is the
+#. * preferred behavior.
+#. * Lynx will also accept y Y n N as responses unless there is a conflict
+#. * with the first letter of the "yes" or "no" translation.
+#.
+#: src/HTAlert.c:406 src/HTAlert.c:454
+msgid "yes"
+msgstr "igen"
+
+#: src/HTAlert.c:409 src/HTAlert.c:455
+msgid "no"
+msgstr "nem"
+
+#.
+#. * Special-purpose workaround for gettext support (we should do
+#. * this in a more general way) -TD
+#. *
+#. * NOTE TO TRANSLATORS: If the prompt has been rendered into
+#. * another language, and if yes/no are distinct, assume the
+#. * translator can make an ordered list in parentheses with one
+#. * capital letter for each as we assumed in HTConfirmDefault().
+#. * The list has to be in the same order as in the original message,
+#. * and the four capital letters chosen to not match those in the
+#. * original unless they have the same position.
+#. *
+#. * Example:
+#. * (Y/N/Always/neVer) - English (original)
+#. * (O/N/Toujours/Jamais) - French
+#.
+#: src/HTAlert.c:911
+msgid "Y/N/A/V"
+msgstr "I/N/M/S"
+
+#: src/HTML.c:5911
+msgid "Description:"
+msgstr "Leírás:"
+
+#: src/HTML.c:5916
+msgid "(none)"
+msgstr "(nincs)"
+
+#: src/HTML.c:5920
+msgid "Filepath:"
+msgstr "Útvonal:"
+
+#: src/HTML.c:5926
+msgid "(unknown)"
+msgstr "(ismeretlen)"
+
+#: src/HTML.c:7353
+msgid "Document has only hidden links. Use the 'l'ist command."
+msgstr "(A dokumentum csak rejtett hivatkozásokat tartalmaz. Használja az 'L' parancsot."
+
+#: src/HTML.c:7852
+msgid "Source cache error - disk full?"
+msgstr "Forrás gyorstárazási hiba - a lemez megtelt?"
+
+#: src/HTML.c:7865
+msgid "Source cache error - not enough memory!"
+msgstr "Forrás gyorstárazási hiba - nincs elég memória!"
+
+#: src/LYBookmark.c:164
+msgid ""
+" This file is an HTML representation of the X Mosaic hotlist file.\n"
+" Outdated or invalid links may be removed by using the\n"
+" remove bookmark command, it is usually the 'R' key but may have\n"
+" been remapped by you or your system administrator."
+msgstr ""
+" Ez a fájl HTML ábrázolása egy X Mosaic gyorslista fájlnak.\n"
+" A régi vagy érvénytelen hivatkozásokat törölheti\n"
+" a könyvjelzõ eltávolítás paranccsal, ami általában az \n"
+" 'R' billentyû (lehet, hogy ez meg lett változtatva)."
+
+#: src/LYBookmark.c:371
+#, c-format
+msgid ""
+" You can delete links by the 'R' key<br>\n"
+"<ol>\n"
+msgstr ""
+" A hivatkozásokat az 'R' billentyûvel törölheti<br>\n"
+"<ol>\n"
+
+#: src/LYBookmark.c:374
+msgid ""
+" You can delete links using the remove bookmark command. It is usually\n"
+" the 'R' key but may have been remapped by you or your system\n"
+" administrator."
+msgstr ""
+" A hivatkozásokat törölheti a könyvjelzõ eltávolítás paranccsal.\n"
+" Ez általában a 'R' billentyû, de lehet, hogy ez meg lett változtatva."
+
+#: src/LYBookmark.c:378
+msgid ""
+" This file also may be edited with a standard text editor to delete\n"
+" outdated or invalid links, or to change their order."
+msgstr ""
+" Ez a fájl szövegszerkesztõvel módosítható, törölhetõk a \n"
+" régi vagy érvénytelen hivatkozások, vagy módosítható a sorrendjük."
+
+#: src/LYBookmark.c:381
+msgid ""
+"Note: if you edit this file manually\n"
+" you should not change the format within the lines\n"
+" or add other HTML markup.\n"
+" Make sure any bookmark link is saved as a single line."
+msgstr ""
+"Megjegyzés: ha ön ezt a fájlt kézzel szerkeszti,\n"
+" nem szabad változtatnia a sor felépítésén, és\n"
+" ne adjon hozzá más HTML tagot.\n"
+" Gyõzõdjön meg róla, hogy minden hivatkozás egy sorban van."
+
+#: src/LYBookmark.c:677
+#, c-format
+msgid "File may be recoverable from %s during this session"
+msgstr "A fájl még helyreállítható innen: %s, ebben a folyamatban"
+
+#: src/LYCgi.c:161
+#, c-format
+msgid "Do you want to execute \"%s\"?"
+msgstr ""
+
+#.
+#. * Neither the path as given nor any components examined by backing up
+#. * were stat()able. - kw
+#.
+#: src/LYCgi.c:276
+msgid "Unable to access cgi script"
+msgstr "Nem lehet elérni a cgi alkalmazói programot"
+
+#: src/LYCgi.c:701 src/LYCgi.c:704
+msgid "Good Advice"
+msgstr "Jó tanács"
+
+#: src/LYCgi.c:708
+msgid "An excellent http server for VMS is available via"
+msgstr "Egy kitûnõ http szerver VMS-hez rendelkezésre áll"
+
+#: src/LYCgi.c:715
+msgid "this link"
+msgstr "ezen a linken keresztül"
+
+#: src/LYCgi.c:719
+msgid "It provides state of the art CGI script support.\n"
+msgstr "Nagyon jól támogatja a CGI szkripteket.\n"
+
+#: src/LYClean.c:122
+msgid "Exiting via interrupt:"
+msgstr "Kilépés megszakításon keresztül:"
+
+#: src/LYCookie.c:2461
+msgid "(from a previous session)"
+msgstr "(egy elõzõ folyamatból)"
+
+#: src/LYCookie.c:2522
+msgid "Maximum Gobble Date:"
+msgstr "Maximális evési dátum:"
+
+#: src/LYCookie.c:2562
+msgid "Internal"
+msgstr "Belsõ"
+
+#: src/LYCookie.c:2563
+msgid "cookie_domain_flag_set error, aborting program"
+msgstr "cookie_domain_flag_set hiba, program megszakítva"
+
+#: src/LYCurses.c:1088
+msgid "Terminal initialisation failed - unknown terminal type?"
+msgstr "Terminál megnyitás sikertelen - ismeretlen terminál típus?"
+
+#: src/LYCurses.c:1546
+msgid "Terminal ="
+msgstr "Terminál ="
+
+#: src/LYCurses.c:1550
+msgid "You must use a vt100, 200, etc. terminal with this program."
+msgstr "Önnek vt100, 200 stb.-t kell használnia ehhez a programhoz."
+
+#: src/LYCurses.c:1599
+msgid "Your Terminal type is unknown!"
+msgstr "A terminál típus ismeretlen!"
+
+#: src/LYCurses.c:1600
+msgid "Enter a terminal type:"
+msgstr "Kérem a terminál típusát:"
+
+#: src/LYCurses.c:1614
+msgid "TERMINAL TYPE IS SET TO"
+msgstr "A TERMINÁL TÍPUS BEÁLLÍTVA:"
+
+#: src/LYCurses.c:2127
+#, c-format
+msgid ""
+"\n"
+"A Fatal error has occurred in %s Ver. %s\n"
+msgstr ""
+"\n"
+"Végzetes hiba lépett fel a %s %s verzióban\n"
+
+#: src/LYCurses.c:2130
+#, c-format
+msgid ""
+"\n"
+"Please notify your system administrator to confirm a bug, and if\n"
+"confirmed, to notify the lynx-dev list. Bug reports should have concise\n"
+"descriptions of the command and/or URL which causes the problem, the\n"
+"operating system name with version number, the TCPIP implementation, the\n"
+"TRACEBACK if it can be captured, and any other relevant information.\n"
+msgstr ""
+"\n"
+"Kérem beszéljen a rendszergazdájával, hogy ellenõrizze a hibát,\n"
+"és ha õ megerõsítette, akkor küldjön egy jelentést a lynx-dev listára.\n"
+"A hibajelentésbe írja bele: a parancs leírását, melyik URL-el volt gond,\n"
+" az operációs rendszert verziószámmal együtt, a TCP/IP implementációt \n"
+"(ha tudja), mi hozta létre a hibát és egyéb fontos lényegeket.\n"
+
+#: src/LYEdit.c:266
+#, fuzzy, c-format
+msgid "Error starting editor, %s"
+msgstr "Hiba a feldolgozásban a %d. sorban (össz: %s)\n"
+
+#: src/LYEdit.c:269
+msgid "Editor killed by signal"
+msgstr "Szerkesztõprogram kilõve:"
+
+#: src/LYEdit.c:274
+#, fuzzy, c-format
+msgid "Editor returned with error status %s"
+msgstr "A szerkesztõprogram a következõ hibaállapottal tért vissza: %s"
+
+#: src/LYDownload.c:504
+msgid "Downloaded link:"
+msgstr "Letöltött link:"
+
+#: src/LYDownload.c:509
+msgid "Suggested file name:"
+msgstr "Javasolt fájlnév:"
+
+#: src/LYDownload.c:514
+msgid "Standard download options:"
+msgstr "Alapvetõ letöltési beállítások:"
+
+#: src/LYDownload.c:515
+msgid "Download options:"
+msgstr "Letöltési beállítások:"
+
+#: src/LYDownload.c:531
+msgid "Save to disk"
+msgstr "Mentés lemezre"
+
+#: src/LYDownload.c:545
+msgid "View temporary file"
+msgstr "Átmeneti fájl nézése"
+
+#: src/LYDownload.c:552
+msgid "Save to disk disabled."
+msgstr "Mentés lemezre le van tiltva."
+
+#: src/LYDownload.c:556 src/LYPrint.c:1310
+msgid "Local additions:"
+msgstr "Helyi adalékok:"
+
+#: src/LYDownload.c:567 src/LYUpload.c:211
+msgid "No Name Given"
+msgstr "Nincs név megadva"
+
+#: src/LYHistory.c:672
+msgid "You selected:"
+msgstr "Kiválasztva:"
+
+#: src/LYHistory.c:696 src/LYHistory.c:925
+msgid "(no address)"
+msgstr "(nincs cím)"
+
+#: src/LYHistory.c:700
+msgid " (internal)"
+msgstr " (belsõ)"
+
+#: src/LYHistory.c:702
+msgid " (was internal)"
+msgstr " (belsõ volt)"
+
+#: src/LYHistory.c:800
+msgid " (From History)"
+msgstr " (Elõzményekbõl)"
+
+#: src/LYHistory.c:845
+msgid "You visited (POSTs, bookmark, menu and list files excluded):"
+msgstr "Ön itt volt (POST, könyvjelzõ, menü és listafájl kihagyva):"
+
+#: src/LYHistory.c:1138
+msgid "(No messages yet)"
+msgstr "(Még nincs üzenet)"
+
+#: src/LYLeaks.c:220
+msgid "Invalid pointer detected."
+msgstr "Helytelen mutatót észleltem."
+
+#: src/LYLeaks.c:222 src/LYLeaks.c:260
+msgid "Sequence:"
+msgstr "Sorozat:"
+
+#: src/LYLeaks.c:225 src/LYLeaks.c:263
+msgid "Pointer:"
+msgstr "Mutató:"
+
+#: src/LYLeaks.c:234 src/LYLeaks.c:241 src/LYLeaks.c:282
+msgid "FileName:"
+msgstr "Fájlnév:"
+
+#: src/LYLeaks.c:237 src/LYLeaks.c:244 src/LYLeaks.c:285 src/LYLeaks.c:296
+msgid "LineCount:"
+msgstr "Sorok száma:"
+
+#: src/LYLeaks.c:258
+msgid "Memory leak detected."
+msgstr "Memóriaszivárgást észleltem."
+
+#: src/LYLeaks.c:266
+msgid "Contains:"
+msgstr "Tartalom:"
+
+#: src/LYLeaks.c:279
+msgid "ByteSize:"
+msgstr "Bájtméret:"
+
+#: src/LYLeaks.c:293
+msgid "realloced:"
+msgstr "újra lefoglalva:"
+
+#: src/LYLeaks.c:314
+msgid "Total memory leakage this run:"
+msgstr "Összes memóriaszivárgás ebben a futtatásban:"
+
+#: src/LYLeaks.c:317
+msgid "Peak allocation"
+msgstr "Lefoglalási csúcs"
+
+#: src/LYLeaks.c:318
+msgid "Bytes allocated"
+msgstr "bájt lefoglalva"
+
+#: src/LYLeaks.c:319
+msgid "Total mallocs"
+msgstr "Össz 'malloc'"
+
+#: src/LYLeaks.c:320
+msgid "Total frees"
+msgstr "Össz 'free'"
+
+#: src/LYList.c:84
+msgid "References in "
+msgstr "Hivatkozások itt: "
+
+#: src/LYList.c:87
+msgid "this document:"
+msgstr "ez a dokumentum:"
+
+#: src/LYList.c:93
+msgid "Visible links:"
+msgstr "Látható hivatkozás:"
+
+#: src/LYList.c:194 src/LYList.c:295
+msgid "Hidden links:"
+msgstr "Rejtett hivatkozás:"
+
+#: src/LYList.c:332
+msgid "References"
+msgstr "Hivatkozások"
+
+#: src/LYList.c:336
+msgid "Visible links"
+msgstr "Látható hivatkozás"
+
+#: src/LYLocal.c:271
+#, c-format
+msgid "Unable to get status of '%s'."
+msgstr "Nem lehet a(z) %s állapotát meghatározni."
+
+#: src/LYLocal.c:305
+msgid "The selected item is not a file or a directory! Request ignored."
+msgstr "A kiválasztott elem nem fájl vagy könyvtár! A kérés figyelmen kívül hagyva."
+
+#: src/LYLocal.c:373
+#, c-format
+msgid "Unable to %s due to system error!"
+msgstr "A(z) %s nem végrehajtható, rendszerhiba miatt!"
+
+#: src/LYLocal.c:407
+#, c-format
+msgid "Probable failure to %s due to system error!"
+msgstr "Valószínûleg sérült %s, rendszerhiba miatt!"
+
+#: src/LYLocal.c:469 src/LYLocal.c:490
+#, c-format
+msgid "remove %s"
+msgstr "%s eltávolítása"
+
+#: src/LYLocal.c:508
+#, c-format
+msgid "touch %s"
+msgstr "%s létrehozása"
+
+#: src/LYLocal.c:536
+#, c-format
+msgid "move %s to %s"
+msgstr "%s mozgatása ide: %s"
+
+#: src/LYLocal.c:577
+msgid "There is already a directory with that name! Request ignored."
+msgstr "Ezen a néven már létezik egy könyvtár! A kérés figyelmen kívül hagyva."
+
+#: src/LYLocal.c:579
+msgid "There is already a file with that name! Request ignored."
+msgstr "Ezen a néven már létezik egy fájl! A kérés figyelmen kívül hagyva."
+
+#: src/LYLocal.c:581
+msgid "The specified name is already in use! Request ignored."
+msgstr "A megadott név már használatban van! A kérés figyelmen kívül hagyva."
+
+#: src/LYLocal.c:592
+msgid "Destination has different owner! Request denied."
+msgstr "A célnak más a tulajdonosa! Kérés megtagadva."
+
+#: src/LYLocal.c:595
+msgid "Destination is not a valid directory! Request denied."
+msgstr "A cél nem érvényes könyvtár! Kérés megtagadva."
+
+#: src/LYLocal.c:617
+msgid "Remove all tagged files and directories?"
+msgstr "Minden megjelölt fájl és könyvtár eltávolítása?"
+
+#: src/LYLocal.c:675
+msgid "Enter new location for tagged items: "
+msgstr "Kérem az új helyét a megjelölt elemeknek: "
+
+#: src/LYLocal.c:745
+msgid "Path too long"
+msgstr "Az elérési út túl hosszú"
+
+#: src/LYLocal.c:776
+msgid "Source and destination are the same location - request ignored!"
+msgstr "A forrás és a cél ugyanaz az hely - figyelmen kívül hagyva!"
+
+#: src/LYLocal.c:833
+msgid "Enter new name for directory: "
+msgstr "Kérem az új könyvtárnevet: "
+
+#: src/LYLocal.c:835
+msgid "Enter new name for file: "
+msgstr "Kérem az új fájlnevet: "
+
+#: src/LYLocal.c:847
+msgid "Illegal character (path-separator) found! Request ignored."
+msgstr "Érvénytelen karaktert találtam (elérési út elválasztó)! Kérés figyelmen kívül hagyva."
+
+#: src/LYLocal.c:897
+msgid "Enter new location for directory: "
+msgstr "Kérem a könyvtár új helyét: "
+
+#: src/LYLocal.c:903
+msgid "Enter new location for file: "
+msgstr "Kérem a fájl új helyét: "
+
+#: src/LYLocal.c:930
+msgid "Unexpected failure - unable to find trailing path separator"
+msgstr "Váratlan hiba - hiányzik a záró elérési út elválasztó"
+
+#: src/LYLocal.c:950
+msgid "Source and destination are the same location! Request ignored!"
+msgstr "A forrás és a cél ugyanaz az hely - figyelmen kívül hagyva!"
+
+#: src/LYLocal.c:997
+msgid "Modify name, location, or permission (n, l, or p): "
+msgstr "Név (N), hely (L) vagy jogok (P) módosítása:"
+
+#: src/LYLocal.c:999
+msgid "Modify name or location (n or l): "
+msgstr "Név (N) vagy hely (L) módosítása:"
+
+#.
+#. * Code for changing ownership needed here.
+#.
+#: src/LYLocal.c:1028
+msgid "This feature not yet implemented!"
+msgstr "Ez a képesség még nincs készen!"
+
+#: src/LYLocal.c:1048
+msgid "Enter name of file to create: "
+msgstr "Kérem a létrehozandó fájl nevét: "
+
+#: src/LYLocal.c:1052 src/LYLocal.c:1088
+msgid "Illegal redirection \"//\" found! Request ignored."
+msgstr "Érvénytelen átirányítás \"//\"! A kérés figyelmen kívül hagyva."
+
+#: src/LYLocal.c:1084
+msgid "Enter name for new directory: "
+msgstr "Kérem az új könyvtár nevét: "
+
+#: src/LYLocal.c:1124
+msgid "Create file or directory (f or d): "
+msgstr "Fájl (F) vagy könyvtár (D) létrehozása: "
+
+#: src/LYLocal.c:1166
+#, c-format
+msgid "Remove directory '%s'?"
+msgstr "'%s' könyvtár eltávolítása?"
+
+#: src/LYLocal.c:1169
+msgid "Remove directory?"
+msgstr "Könyvtár eltávolítása?"
+
+#: src/LYLocal.c:1174
+#, c-format
+msgid "Remove file '%s'?"
+msgstr "'%s' fájl eltávolítása?"
+
+#: src/LYLocal.c:1176
+msgid "Remove file?"
+msgstr "Fájl eltávolítása?"
+
+#: src/LYLocal.c:1181
+#, c-format
+msgid "Remove symbolic link '%s'?"
+msgstr "Eltávolítsam a %s szimbolikus hivatkozást?"
+
+#: src/LYLocal.c:1183
+msgid "Remove symbolic link?"
+msgstr "Eltávolítsam a szimbolikus hivatkozást?"
+
+#: src/LYLocal.c:1278
+msgid "Sorry, don't know how to permit non-UNIX files yet."
+msgstr "Sajnálom, nem tudom hogy kell engedélyezni a nem-UNIX fájlokat."
+
+#: src/LYLocal.c:1308
+msgid "Unable to open permit options file"
+msgstr "Nem lehet megnyitni az engedély beállítások fájlt"
+
+#: src/LYLocal.c:1338
+msgid "Specify permissions below:"
+msgstr "Adja meg a jogosultságokat:"
+
+#: src/LYLocal.c:1339 src/LYShowInfo.c:261
+msgid "Owner:"
+msgstr "Tulajdonos:"
+
+#: src/LYLocal.c:1355
+msgid "Group"
+msgstr "Csoport"
+
+#: src/LYLocal.c:1371
+msgid "Others:"
+msgstr "A többiek:"
+
+#: src/LYLocal.c:1389
+msgid "form to permit"
+msgstr "engedélyezve"
+
+#: src/LYLocal.c:1484
+msgid "Invalid mode format."
+msgstr "Érvénytelen mód formátum."
+
+#: src/LYLocal.c:1488
+msgid "Invalid syntax format."
+msgstr "Érvénytelen szintaktika."
+
+#: src/LYLocal.c:1670
+msgid "Warning! UUDecoded file will exist in the directory you started Lynx."
+msgstr "Figyelmeztetés! UU-dekódolt fájl jön létre abban a könyvtárban, ahonnan elindította a Lynxet."
+
+#: src/LYLocal.c:1860
+msgid "NULL URL pointer"
+msgstr "ÜRES URL mutató"
+
+#: src/LYLocal.c:1942
+#, c-format
+msgid "Executing %s "
+msgstr "%s futtatása "
+
+#: src/LYLocal.c:1945
+msgid "Executing system command. This might take a while."
+msgstr "Rendszerparancs végrehajtása. Ez eltarthat egy ideig."
+
+#: src/LYLocal.c:2017
+msgid "Current directory:"
+msgstr "Aktuális könyvtár:"
+
+#: src/LYLocal.c:2020 src/LYLocal.c:2038
+msgid "Current selection:"
+msgstr "Jelenlegi kiválasztás:"
+
+#: src/LYLocal.c:2024
+msgid "Nothing currently selected."
+msgstr "Semmi nincs kiválasztva."
+
+#: src/LYLocal.c:2040
+msgid "tagged item:"
+msgstr "jelölt elem:"
+
+#: src/LYLocal.c:2041
+msgid "tagged items:"
+msgstr "jelölt elemek:"
+
+#: src/LYLocal.c:2138 src/LYLocal.c:2149
+msgid "Illegal filename; request ignored."
+msgstr "Érvénytelen fájlnév; a kérés figyelmen kívül hagyva."
+
+#. directory not writable
+#: src/LYLocal.c:2247 src/LYLocal.c:2306
+msgid "Install in the selected directory not permitted."
+msgstr "A telepítés nincs engedélyezve a kiválasztott könyvtárba."
+
+#: src/LYLocal.c:2302
+msgid "The selected item is not a directory! Request ignored."
+msgstr "A kiválasztott elem nem könyvtár! A kérés figyelmen kívül hagyva."
+
+#: src/LYLocal.c:2311
+msgid "Just a moment, ..."
+msgstr "Egy pillanat, ..."
+
+#: src/LYLocal.c:2328
+msgid "Error building install args"
+msgstr "Hiba a telepítési paraméterek létrehozása során"
+
+#: src/LYLocal.c:2343 src/LYLocal.c:2374
+#, c-format
+msgid "Source and target are the same: %s"
+msgstr "A forrás és a cél ugyanaz: %s"
+
+#: src/LYLocal.c:2350 src/LYLocal.c:2381
+#, c-format
+msgid "Already in target directory: %s"
+msgstr "Már a cél könyvtárban van: %s"
+
+#: src/LYLocal.c:2399
+msgid "Installation complete"
+msgstr "Telepítés kész"
+
+#: src/LYLocal.c:2586
+msgid "Temporary URL or list would be too long."
+msgstr "Az átmeneti URL vagy lista túl hosszú."
+
+#: src/LYMail.c:520
+msgid "Sending"
+msgstr "Küldés"
+
+#: src/LYMail.c:1006
+#, c-format
+msgid "The link %s :?: %s \n"
+msgstr "A hivatkozás :%s :?: %s \n"
+
+#: src/LYMail.c:1008
+#, c-format
+msgid "called \"%s\"\n"
+msgstr "\"%s\" meghívva\n"
+
+#: src/LYMail.c:1009
+#, c-format
+msgid "in the file \"%s\" called \"%s\"\n"
+msgstr "a(z) %s fájlban meghívtam a(z) \"%s\"-t\n"
+
+#: src/LYMail.c:1010
+msgid "was requested but was not available."
+msgstr "igényeltem, de nem állt rendelkezésre."
+
+#: src/LYMail.c:1011
+msgid "Thought you might want to know."
+msgstr "Azt hiszem, jó tudni."
+
+#: src/LYMail.c:1013
+msgid "This message was automatically generated by"
+msgstr "Ez az üzenet önmûködõen jött létre"
+
+#: src/LYMail.c:1728
+msgid "No system mailer configured"
+msgstr "Nincsen rendszerszintû levelezõ beállítva"
+
+#: src/LYMain.c:1023
+msgid "No Winsock found, sorry."
+msgstr "Nem találtam Winsock-ot, sajnálom."
+
+#: src/LYMain.c:1226
+msgid "You MUST define a valid TMP or TEMP area!"
+msgstr "Önnek meg kell adnia egy érvényes TMP vagy TEMP területet"
+
+#: src/LYMain.c:1279 src/LYMainLoop.c:5074
+msgid "No such directory"
+msgstr "Nincs ilyen könyvtár"
+
+#: src/LYMain.c:1464
+#, fuzzy, c-format
+msgid ""
+"\n"
+"Configuration file \"%s\" is not available.\n"
+"\n"
+msgstr ""
+"\n"
+"A(z) %s konfigurációs fájl nem áll rendelkezésre.\n"
+"\n"
+
+#: src/LYMain.c:1474
+#, c-format
+msgid ""
+"\n"
+"Lynx character sets not declared.\n"
+"\n"
+msgstr ""
+"\n"
+"Nincs deklarált karakterkészlet a Lynx-ben.\n"
+"\n"
+
+#: src/LYMain.c:1503
+#, c-format
+msgid ""
+"\n"
+"Lynx edit map not declared.\n"
+"\n"
+msgstr ""
+"\n"
+"Nincs deklarált szerkesztõkép a Lynx-ben.\n"
+"\n"
+
+#: src/LYMain.c:1579
+#, fuzzy, c-format
+msgid ""
+"\n"
+"Lynx file \"%s\" is not available.\n"
+"\n"
+msgstr ""
+"\n"
+"A(z) %s Lynx-fájl nem áll rendelkezésre.\n"
+"\n"
+
+#: src/LYMain.c:1654
+#, c-format
+msgid "Ignored %d characters from standard input.\n"
+msgstr ""
+
+#: src/LYMain.c:1656
+#, c-format
+msgid "Use \"-stdin\" or \"-\" to tell how to handle piped input.\n"
+msgstr ""
+
+#: src/LYMain.c:1804
+msgid "Warning:"
+msgstr "Figyelem:"
+
+#: src/LYMain.c:2372
+msgid "persistent cookies state will be changed in next session only."
+msgstr "az állandó süti állapot csak a következõ folyamat során fog megváltozni."
+
+#: src/LYMain.c:2617 src/LYMain.c:2662
+#, c-format
+msgid "Lynx: ignoring unrecognized charset=%s\n"
+msgstr "A Lynx figyelmen kívül hagyja a %s fel nem ismert karakterkészletet\n"
+
+#: src/LYMain.c:3181
+#, c-format
+msgid "%s Version %s (%s)"
+msgstr "%s Verzió %s (%s)"
+
+#: src/LYMain.c:3219
+#, c-format
+msgid "Built on %s %s %s\n"
+msgstr "Készítve %s %s %s\n"
+
+#: src/LYMain.c:3241
+msgid "Copyrights held by the Lynx Developers Group,"
+msgstr ""
+
+#: src/LYMain.c:3242
+#, fuzzy
+msgid "the University of Kansas, CERN, and other contributors."
+msgstr "A szerzõi és kiadó jogokat a Kansas Egyetem, a CERN és az egyéb közremûködõk gyakorolják."
+
+#: src/LYMain.c:3243
+#, fuzzy
+msgid "Distributed under the GNU General Public License (Version 2)."
+msgstr "A GNU Általános Nyilvános Licensz szerint kiadva."
+
+#: src/LYMain.c:3244
+msgid "See http://lynx.isc.org/ and the online help for more information."
+msgstr "Nézze meg a súgót és a http://lynx.isc.org/-ot, ahol segítséget kaphat."
+
+#: src/LYMain.c:4065
+#, c-format
+msgid "USAGE: %s [options] [file]\n"
+msgstr "HASZNÁLAT: %s [opciók] [fájl]\n"
+
+#: src/LYMain.c:4066
+#, c-format
+msgid "Options are:\n"
+msgstr "Opciók:\n"
+
+#: src/LYMain.c:4365
+#, c-format
+msgid "%s: Invalid Option: %s\n"
+msgstr "%s: Érvénytelen opció: %s \n"
+
+#: src/LYMainLoop.c:594
+#, c-format
+msgid "Internal error: Invalid mouse link %d!"
+msgstr "Belsõ hiba: Hibás egér hivatkozás %d!"
+
+#: src/LYMainLoop.c:714 src/LYMainLoop.c:5096
+msgid "A URL specified by the user"
+msgstr "Felhasználó által megadott URL"
+
+#: src/LYMainLoop.c:1173
+msgid "Enctype multipart/form-data not yet supported! Cannot submit."
+msgstr "Enctype multipart/form-data még nincs támogatva! Nem tudjuk elküldeni."
+
+#.
+#. * Make a name for this help file.
+#.
+#: src/LYMainLoop.c:3105
+msgid "Help Screen"
+msgstr "Súgó képernyõ"
+
+#: src/LYMainLoop.c:3226
+msgid "System Index"
+msgstr "Rendszer index"
+
+#: src/LYMainLoop.c:3585 src/LYMainLoop.c:5320
+msgid "Entry into main screen"
+msgstr "Belépés a fõképernyõbe"
+
+#: src/LYMainLoop.c:3843
+msgid "No next document present"
+msgstr "Nincs további dokumentum"
+
+#: src/LYMainLoop.c:4139
+msgid "charset for this document specified explicitly, sorry..."
+msgstr "a dokumentum karakterkészlete már be van állítva..."
+
+#: src/LYMainLoop.c:5052
+msgid "cd to:"
+msgstr "könyvtárváltás:"
+
+#: src/LYMainLoop.c:5077
+msgid "A component of path is not a directory"
+msgstr "Az útvonal egy összetevõje nem könyvtár"
+
+#: src/LYMainLoop.c:5080
+msgid "failed to change directory"
+msgstr "nem sikerült a könyvtárváltás"
+
+#: src/LYMainLoop.c:6252
+msgid "Reparsing document under current settings..."
+msgstr "A dokumentumot átalakítom az aktuális beállításoknak megfelelõen..."
+
+#: src/LYMainLoop.c:6543
+#, c-format
+msgid "Fatal error - could not open output file %s\n"
+msgstr "Végzetes hiba: nem lehet megnyitni a(z) '%s' kimeneti fájlt\n"
+
+#: src/LYMainLoop.c:6880
+msgid "TABLE center enable."
+msgstr "'Táblázat középre' engedélyezve."
+
+#: src/LYMainLoop.c:6883
+msgid "TABLE center disable."
+msgstr "'Táblázat középre' tiltva."
+
+#: src/LYMainLoop.c:6960
+msgid "Current URL is empty."
+msgstr "Üres a pillanatnyi URL."
+
+#: src/LYMainLoop.c:6962 src/LYUtils.c:1828
+msgid "Copy to clipboard failed."
+msgstr "Sikertelen a vágólapra másolás."
+
+#: src/LYMainLoop.c:6964
+msgid "Document URL put to clipboard."
+msgstr "A dokumentum URL-jét a vágólapra tesszük."
+
+#: src/LYMainLoop.c:6966
+msgid "Link URL put to clipboard."
+msgstr "A link URL-jét a vágólapra tesszük."
+
+#: src/LYMainLoop.c:6993
+msgid "No URL in the clipboard."
+msgstr "Nincsen URL a vágólapon."
+
+#: src/LYMainLoop.c:7664 src/LYMainLoop.c:7834
+msgid "-index-"
+msgstr "-index-"
+
+#: src/LYMainLoop.c:7774
+msgid "lynx: Can't access startfile"
+msgstr "lynx: Nincs kezdõfájl!"
+
+#: src/LYMainLoop.c:7786
+msgid "lynx: Start file could not be found or is not text/html or text/plain"
+msgstr "lynx: A kezdõfájlt nem találom (sem HTML szöveget, sem sima szöveget)"
+
+#: src/LYMainLoop.c:7787
+msgid " Exiting..."
+msgstr " Kilépés..."
+
+#: src/LYMainLoop.c:7828
+msgid "-more-"
+msgstr "-tovább-"
+
+#. Enable scrolling.
+#: src/LYNews.c:186
+msgid "You will be posting to:"
+msgstr "Ön levelet fog küldeni:"
+
+#.
+#. * Get the mail address for the From header, offering personal_mail_address
+#. * as default.
+#.
+#: src/LYNews.c:195
+msgid ""
+"\n"
+"\n"
+" Please provide your mail address for the From: header\n"
+msgstr ""
+"\n"
+"\n"
+" Kérem adja meg a postacímét a fejléc \"Feladó:\" sorába\n"
+
+#.
+#. * Get the Subject header, offering the current document's title as the
+#. * default if this is a followup rather than a new post. - FM
+#.
+#: src/LYNews.c:212
+msgid ""
+"\n"
+"\n"
+" Please provide or edit the Subject: header\n"
+msgstr ""
+"\n"
+"\n"
+" Adja meg vagy szerkessze a fejléc \"Tárgy:\" sorát\n"
+
+#: src/LYNews.c:302
+msgid ""
+"\n"
+"\n"
+" Please provide or edit the Organization: header\n"
+msgstr ""
+"\n"
+"\n"
+" Adja meg vagy szerkessze a fejléc \"Szervezet:\" sorát\n"
+
+#.
+#. * Use the built in line editior.
+#.
+#: src/LYNews.c:359
+msgid ""
+"\n"
+"\n"
+" Please enter your message below."
+msgstr ""
+"\n"
+"\n"
+" Kérem írja be az üzenetet ez alá."
+
+#: src/LYNews.c:405
+msgid "Message has no original text!"
+msgstr "Az üzenetben nincs eredeti szöveg!"
+
+#: src/LYOptions.c:765
+msgid "review/edit B)ookmarks files"
+msgstr "(B): a könyvjelzõ fájlok áttekintése/szerkesztése"
+
+#: src/LYOptions.c:767
+msgid "B)ookmark file: "
+msgstr "(B): a könyvjelzõ fájl: "
+
+#: src/LYOptions.c:2127 src/LYOptions.c:2134
+msgid "ON"
+msgstr "BE"
+
+#. verbose_img variable
+#: src/LYOptions.c:2128 src/LYOptions.c:2133 src/LYOptions.c:2285 src/LYOptions.c:2296
+msgid "OFF"
+msgstr "KI"
+
+#: src/LYOptions.c:2129
+msgid "NEVER"
+msgstr "SOHA"
+
+#: src/LYOptions.c:2130
+msgid "ALWAYS"
+msgstr "MINDIG"
+
+#: src/LYOptions.c:2146 src/LYOptions.c:2277
+msgid "ignore"
+msgstr "hanyagol"
+
+#: src/LYOptions.c:2147
+msgid "ask user"
+msgstr "kérdez"
+
+#: src/LYOptions.c:2148
+msgid "accept all"
+msgstr "mindent elfogad"
+
+#: src/LYOptions.c:2160
+msgid "ALWAYS OFF"
+msgstr "Mindig: KI"
+
+#: src/LYOptions.c:2161
+msgid "FOR LOCAL FILES ONLY"
+msgstr "Csak helyi fájlokra"
+
+#: src/LYOptions.c:2163
+msgid "ALWAYS ON"
+msgstr "Mindig: BE"
+
+#: src/LYOptions.c:2175
+msgid "Numbers act as arrows"
+msgstr "A számok mint nyilak"
+
+#: src/LYOptions.c:2177
+msgid "Links are numbered"
+msgstr "A linkek számozottak"
+
+#: src/LYOptions.c:2180
+msgid "Links and form fields are numbered"
+msgstr "Linkek és ûrlapok számozottak"
+
+#: src/LYOptions.c:2183
+msgid "Form fields are numbered"
+msgstr "Ûrlap mezõk számozottak"
+
+#: src/LYOptions.c:2197
+msgid "Case insensitive"
+msgstr "Kis/nagybetûre érzéketlen"
+
+#: src/LYOptions.c:2198
+msgid "Case sensitive"
+msgstr "Kis/nagybetûre érzékeny"
+
+#: src/LYOptions.c:2222
+msgid "prompt normally"
+msgstr "szokásos kérdés"
+
+#: src/LYOptions.c:2223
+msgid "force yes-response"
+msgstr "mindig IGEN-válasz"
+
+#: src/LYOptions.c:2224
+msgid "force no-response"
+msgstr "mindig NEM-válasz"
+
+#: src/LYOptions.c:2242
+msgid "Novice"
+msgstr "Kezdõ"
+
+#: src/LYOptions.c:2243
+msgid "Intermediate"
+msgstr "Haladó"
+
+#: src/LYOptions.c:2244
+msgid "Advanced"
+msgstr "Profi"
+
+#: src/LYOptions.c:2253
+msgid "By First Visit"
+msgstr "Elsõ alkalommal"
+
+#: src/LYOptions.c:2255
+msgid "By First Visit Reversed"
+msgstr "Elsõ alkalommal, megfordítva"
+
+#: src/LYOptions.c:2256
+msgid "As Visit Tree"
+msgstr "Látogatási fa"
+
+#: src/LYOptions.c:2257
+msgid "By Last Visit"
+msgstr "Utolsó látogatás"
+
+#: src/LYOptions.c:2259
+msgid "By Last Visit Reversed"
+msgstr "Utolsó látogatás, megfordítva"
+
+#. Old_DTD variable
+#: src/LYOptions.c:2270
+msgid "relaxed (TagSoup mode)"
+msgstr "enyhe (TagSoup mód)"
+
+#: src/LYOptions.c:2271
+msgid "strict (SortaSGML mode)"
+msgstr "szigorú (SortaSGML mód)"
+
+#: src/LYOptions.c:2278
+msgid "as labels"
+msgstr "címkék"
+
+#: src/LYOptions.c:2279
+msgid "as links"
+msgstr "linkek"
+
+#: src/LYOptions.c:2286
+msgid "show filename"
+msgstr "fájlnév mutatása"
+
+#: src/LYOptions.c:2297
+msgid "STANDARD"
+msgstr "SZOKÁSOS"
+
+#: src/LYOptions.c:2298
+msgid "ADVANCED"
+msgstr "FEJLETT"
+
+#: src/LYOptions.c:2329
+msgid "Directories first"
+msgstr "Elõbb könyvtárak"
+
+#: src/LYOptions.c:2330
+msgid "Files first"
+msgstr "Elõbb fájlok"
+
+#: src/LYOptions.c:2331
+msgid "Mixed style"
+msgstr "Kevert stílus"
+
+#: src/LYOptions.c:2339 src/LYOptions.c:2359
+msgid "By Name"
+msgstr "Név szerint"
+
+#: src/LYOptions.c:2340 src/LYOptions.c:2360
+msgid "By Type"
+msgstr "Típus szerint"
+
+#: src/LYOptions.c:2341 src/LYOptions.c:2361
+msgid "By Size"
+msgstr "Méret szerint"
+
+#: src/LYOptions.c:2342 src/LYOptions.c:2362
+msgid "By Date"
+msgstr "Dátum szerint"
+
+#: src/LYOptions.c:2343
+msgid "By Mode"
+msgstr "Mód szerint"
+
+#: src/LYOptions.c:2345
+msgid "By User"
+msgstr "Felh. szerint"
+
+#: src/LYOptions.c:2346
+msgid "By Group"
+msgstr "Csoport szerint"
+
+#: src/LYOptions.c:2371
+msgid "Do not show rate"
+msgstr "Ne mutassa a sebességet"
+
+#: src/LYOptions.c:2372 src/LYOptions.c:2373
+#, c-format
+msgid "Show %s/sec rate"
+msgstr "Az átviteli sebesség megjelenítése (%s/s)"
+
+#: src/LYOptions.c:2375 src/LYOptions.c:2376
+#, c-format
+msgid "Show %s/sec, ETA"
+msgstr "%s/s mutatása, ETA"
+
+#: src/LYOptions.c:2379
+#, fuzzy
+msgid "Show progressbar"
+msgstr "Csúszka mutatása"
+
+#: src/LYOptions.c:2391
+msgid "Accept lynx's internal types"
+msgstr "Lynx belsõ típusainak elfogadása"
+
+#: src/LYOptions.c:2392
+msgid "Also accept lynx.cfg's types"
+msgstr "lynx.cfg fájl típusainak elfogadása"
+
+#: src/LYOptions.c:2393
+msgid "Also accept user's types"
+msgstr "Felhasználói típusok elfogadása"
+
+#: src/LYOptions.c:2394
+msgid "Also accept system's types"
+msgstr "Rendszer-típusok elfogadása"
+
+#: src/LYOptions.c:2395
+msgid "Accept all types"
+msgstr "minden típust elfogad"
+
+#: src/LYOptions.c:2404
+msgid "gzip"
+msgstr "gzip"
+
+#: src/LYOptions.c:2405
+msgid "deflate"
+msgstr "kibont (deflate)"
+
+#: src/LYOptions.c:2408
+msgid "compress"
+msgstr "compress"
+
+#: src/LYOptions.c:2411
+msgid "bzip2"
+msgstr "bzip2"
+
+#: src/LYOptions.c:2413
+msgid "All"
+msgstr "mindegyik"
+
+#: src/LYOptions.c:2681 src/LYOptions.c:2705
+#, c-format
+msgid "Use %s to invoke the Options menu!"
+msgstr "Használja a(z) %s-t, hogy bejöjjön a Beállítások menü!"
+
+#: src/LYOptions.c:3477
+msgid "(options marked with (!) will not be saved)"
+msgstr "(a '!'-el jelölt opciók nem lesznek megõrizve!)"
+
+#: src/LYOptions.c:3485
+msgid "General Preferences"
+msgstr "Általános beállítások"
+
+#. ***************************************************************
+#. User Mode: SELECT
+#: src/LYOptions.c:3489
+msgid "User mode"
+msgstr "Felhasználói mód"
+
+#. Editor: INPUT
+#: src/LYOptions.c:3495
+msgid "Editor"
+msgstr "Szerkesztõ"
+
+#. Search Type: SELECT
+#: src/LYOptions.c:3500
+msgid "Type of Search"
+msgstr "Keresés típusa"
+
+#: src/LYOptions.c:3505
+msgid "Security and Privacy"
+msgstr "Biztonság és magánszféra"
+
+#. ***************************************************************
+#. Cookies: SELECT
+#: src/LYOptions.c:3509
+msgid "Cookies"
+msgstr "Sütik"
+
+#. Cookie Prompting: SELECT
+#: src/LYOptions.c:3523
+msgid "Invalid-Cookie Prompting"
+msgstr "Érvénytelen süti"
+
+#. SSL Prompting: SELECT
+#: src/LYOptions.c:3530
+msgid "SSL Prompting"
+msgstr "SSL választás"
+
+#: src/LYOptions.c:3536
+msgid "Keyboard Input"
+msgstr "Billentyûzet bevitel"
+
+#. ***************************************************************
+#. Keypad Mode: SELECT
+#: src/LYOptions.c:3540
+msgid "Keypad mode"
+msgstr "Numerikus pad módja"
+
+#. Emacs keys: ON/OFF
+#: src/LYOptions.c:3546
+msgid "Emacs keys"
+msgstr "Emacs billentyûk"
+
+#. VI Keys: ON/OFF
+#: src/LYOptions.c:3552
+msgid "VI keys"
+msgstr "vi billentyûk"
+
+#. Line edit style: SELECT
+#. well, at least 2 line edit styles available
+#: src/LYOptions.c:3559
+msgid "Line edit style"
+msgstr "Sorszerkesztõi stílus"
+
+#. Keyboard layout: SELECT
+#: src/LYOptions.c:3571
+msgid "Keyboard layout"
+msgstr "Billentyûzet kiosztás"
+
+#.
+#. * Display and Character Set
+#.
+#: src/LYOptions.c:3585
+msgid "Display and Character Set"
+msgstr "Képernyõ és karakterkészlet "
+
+#. Use locale-based character set: ON/OFF
+#: src/LYOptions.c:3590
+msgid "Use locale-based character set"
+msgstr "Helyi karakterkészlet használata"
+
+#. Display Character Set: SELECT
+#: src/LYOptions.c:3599
+msgid "Display character set"
+msgstr "Képernyõ karakterkészlet"
+
+#: src/LYOptions.c:3630
+msgid "Assumed document character set"
+msgstr "Feltételezett karakterkészlet"
+
+#.
+#. * Since CJK people hardly mixed with other world
+#. * we split the header to make it more readable:
+#. * "CJK mode" for CJK display charsets, and "Raw 8-bit" for others.
+#.
+#: src/LYOptions.c:3650
+msgid "CJK mode"
+msgstr "CJK mód"
+
+#: src/LYOptions.c:3652
+msgid "Raw 8-bit"
+msgstr "Nyers 8-bites mód"
+
+#. X Display: INPUT
+#: src/LYOptions.c:3660
+msgid "X Display"
+msgstr "X képernyõ"
+
+#.
+#. * Document Appearance
+#.
+#: src/LYOptions.c:3666
+msgid "Document Appearance"
+msgstr "Dokumentum megjelenése"
+
+#: src/LYOptions.c:3672
+msgid "Show color"
+msgstr "Színek mutatása"
+
+#. Show cursor: ON/OFF
+#: src/LYOptions.c:3696
+msgid "Show cursor"
+msgstr "Kurzor mutatása"
+
+#. Underline links: ON/OFF
+#: src/LYOptions.c:3702
+msgid "Underline links"
+msgstr "Rejtett hivatkozás"
+
+#. Show scrollbar: ON/OFF
+#: src/LYOptions.c:3709
+msgid "Show scrollbar"
+msgstr "Csúszka mutatása"
+
+#. Select Popups: ON/OFF
+#: src/LYOptions.c:3716
+msgid "Popups for select fields"
+msgstr "Felbukkanó ablakok használata"
+
+#. HTML error recovery: SELECT
+#: src/LYOptions.c:3722
+msgid "HTML error recovery"
+msgstr "HTML hiba helyreállítás"
+
+#. Show Images: SELECT
+#: src/LYOptions.c:3728
+msgid "Show images"
+msgstr "Képek mutatása"
+
+#. Verbose Images: ON/OFF
+#: src/LYOptions.c:3742
+msgid "Verbose images"
+msgstr "Tallózás a képek között"
+
+#.
+#. * Headers Transferred to Remote Servers
+#.
+#: src/LYOptions.c:3750
+msgid "Headers Transferred to Remote Servers"
+msgstr "A távoli gépeknek átküldött fejlécek"
+
+#. ***************************************************************
+#. Mail Address: INPUT
+#: src/LYOptions.c:3754
+msgid "Personal mail address"
+msgstr "Személyes email cím"
+
+#: src/LYOptions.c:3760
+#, fuzzy
+msgid "Password for anonymous ftp"
+msgstr "Jelszó a(z) '%s' hírszolgáltatóhoz:"
+
+#. Preferred media type: SELECT
+#: src/LYOptions.c:3766
+msgid "Preferred media type"
+msgstr "Elsõdleges média-típus"
+
+#. Preferred encoding: SELECT
+#: src/LYOptions.c:3772
+msgid "Preferred encoding"
+msgstr "Elsõdleges kódolás"
+
+#. Preferred Document Character Set: INPUT
+#: src/LYOptions.c:3778
+msgid "Preferred document character set"
+msgstr "Elsõdleges karakterkészlet"
+
+#. Preferred Document Language: INPUT
+#: src/LYOptions.c:3783
+msgid "Preferred document language"
+msgstr "Elsõdleges nyelv"
+
+#: src/LYOptions.c:3789
+msgid "User-Agent header"
+msgstr "Böngészõ-azonosító fejléc"
+
+#.
+#. * Listing and Accessing Files
+#.
+#: src/LYOptions.c:3797
+msgid "Listing and Accessing Files"
+msgstr "Fájlok listázása és elérése"
+
+#. FTP sort: SELECT
+#: src/LYOptions.c:3802
+msgid "Use Passive FTP"
+msgstr ""
+
+#. FTP sort: SELECT
+#: src/LYOptions.c:3808
+msgid "FTP sort criteria"
+msgstr "FTP-s rendezés módja"
+
+#. Local Directory Sort: SELECT
+#: src/LYOptions.c:3816
+msgid "Local directory sort criteria"
+msgstr "Helyi könyvtárrendezés módja"
+
+#. Local Directory Order: SELECT
+#: src/LYOptions.c:3822
+msgid "Local directory sort order"
+msgstr "Helyi könyvtárrendezés sorrendje"
+
+#: src/LYOptions.c:3831
+msgid "Show dot files"
+msgstr "Rejtett fájlok mutatása"
+
+#: src/LYOptions.c:3839
+msgid "Execution links"
+msgstr "Futtatható hivatkozások"
+
+#. Show transfer rate: SELECT
+#: src/LYOptions.c:3859
+msgid "Show transfer rate"
+msgstr "Az átviteli sebesség megjelenítése"
+
+#.
+#. * Special Files and Screens
+#.
+#: src/LYOptions.c:3879
+msgid "Special Files and Screens"
+msgstr "Speciális fájlok és képernyõk"
+
+#: src/LYOptions.c:3884
+msgid "Multi-bookmarks"
+msgstr "Többszörös könyvjelzõk"
+
+#: src/LYOptions.c:3892
+msgid "Review/edit Bookmarks files"
+msgstr "Könyvjelzõk szerkesztése, átnézése"
+
+#: src/LYOptions.c:3894
+msgid "Goto multi-bookmark menu"
+msgstr "Ugrás a többszörös könyvjelzõi menübe"
+
+#: src/LYOptions.c:3896
+msgid "Bookmarks file"
+msgstr "Könyvjelzõ fájl"
+
+#. Auto Session: ON/OFF
+#: src/LYOptions.c:3903
+msgid "Auto Session"
+msgstr ""
+
+#. Session File Menu: INPUT
+#: src/LYOptions.c:3909
+msgid "Session file"
+msgstr ""
+
+#. Visited Pages: SELECT
+#: src/LYOptions.c:3915
+msgid "Visited Pages"
+msgstr "Meglátogatott lapok"
+
+#: src/LYOptions.c:3920
+msgid "View the file "
+msgstr "A fájl nézése "
+
+#: src/LYPrint.c:937
+#, c-format
+msgid " Print job complete.\n"
+msgstr "Nyomtatási munka kész.\n"
+
+#: src/LYPrint.c:1262
+msgid "Document:"
+msgstr "Dokumentum:"
+
+#: src/LYPrint.c:1263
+msgid "Number of lines:"
+msgstr "Sorok száma:"
+
+#: src/LYPrint.c:1264
+msgid "Number of pages:"
+msgstr "Oldalak száma:"
+
+#: src/LYPrint.c:1265
+msgid "pages"
+msgstr "oldal"
+
+#: src/LYPrint.c:1265
+msgid "page"
+msgstr "oldal"
+
+#: src/LYPrint.c:1266
+msgid "(approximately)"
+msgstr "(körülbelül)"
+
+#: src/LYPrint.c:1273
+msgid "Some print functions have been disabled!"
+msgstr "Néhány nyomtatási funkció le van tiltva!"
+
+#: src/LYPrint.c:1277
+msgid "Standard print options:"
+msgstr "Nyomtatási alapbeállítások: "
+
+#: src/LYPrint.c:1278
+msgid "Print options:"
+msgstr "Nyomtatási beállítások:"
+
+#: src/LYPrint.c:1285
+msgid "Save to a local file"
+msgstr "Mentés helyi fájlba"
+
+#: src/LYPrint.c:1287
+msgid "Save to disk disabled"
+msgstr "A lemezre mentés le van tiltva"
+
+#: src/LYPrint.c:1294
+msgid "Mail the file"
+msgstr "Fájl küldése levélben"
+
+#: src/LYPrint.c:1301
+msgid "Print to the screen"
+msgstr "Nyomtatás a képernyõre"
+
+#: src/LYPrint.c:1306
+msgid "Print out on a printer attached to your vt100 terminal"
+msgstr "Nyomtatás a vt100-as terminálhoz csatlakozó nyomtatóra."
+
+#: src/LYReadCFG.c:371
+#, c-format
+msgid ""
+"Syntax Error parsing COLOR in configuration file:\n"
+"The line must be of the form:\n"
+"COLOR:INTEGER:FOREGROUND:BACKGROUND\n"
+"\n"
+"Here FOREGROUND and BACKGROUND must be one of:\n"
+"The special strings 'nocolor' or 'default', or\n"
+msgstr ""
+"Szintaktikai hiba a konfigurációs fájl SZÍNEK (COLOR) részében\n"
+"A sor a következõ szerkezetû legyen:\n"
+"SZÍN:EGÉSZ:ELÕTÉR:HÁTTÉR\n"
+"\n"
+"Itt az ELÕTÉR és a HÁTTÉR a következõ lehet:\n"
+"A különleges szavak lehetnek 'nocolor' vagy 'default', vagy\n"
+
+#: src/LYReadCFG.c:384
+msgid "Offending line:"
+msgstr "Nem jó sor:"
+
+#: src/LYReadCFG.c:681
+#, c-format
+msgid "key remapping of %s to %s for %s failed\n"
+msgstr "a %s billentyû átállítása %s-re nem sikerült (%s)\n"
+
+#: src/LYReadCFG.c:688
+#, c-format
+msgid "key remapping of %s to %s failed\n"
+msgstr "a %s billentyû átállítása %s-re nem sikerült\n"
+
+#: src/LYReadCFG.c:709
+#, c-format
+msgid "invalid line-editor selection %s for key %s, selecting all\n"
+msgstr "%s: érvénytelen sor-szerkesztõ kiválasztás %s gombnak, összes kiválasztva\n"
+
+#: src/LYReadCFG.c:734 src/LYReadCFG.c:746
+#, c-format
+msgid "setting of line-editor binding for key %s (0x%x) to 0x%x for %s failed\n"
+msgstr "a sorszerkesztõ hozzárendelése a %s gombnak (0x%x) a 0x%x-hez (%s) sikertelen\n"
+
+#: src/LYReadCFG.c:750
+#, c-format
+msgid "setting of line-editor binding for key %s (0x%x) for %s failed\n"
+msgstr "a sorszerkesztõ hozzárendelése %s gombhoz (0x%x) sikertelen (%s)\n"
+
+#: src/LYReadCFG.c:846
+#, c-format
+msgid "Lynx: cannot start, CERN rules file %s is not available\n"
+msgstr "Nem tud elindulni, a CERN szabály fájlja nem áll rendelkezésre (%s)\n"
+
+#: src/LYReadCFG.c:847
+msgid "(no name)"
+msgstr "(névtelen)"
+
+#: src/LYReadCFG.c:1881
+#, c-format
+msgid "More than %d nested lynx.cfg includes -- perhaps there is a loop?!?\n"
+msgstr "Több mint %d egymásba-ágyazást találtam a lynx.cfg-ben -- hurok alakult ki???\n"
+
+#: src/LYReadCFG.c:1883
+#, c-format
+msgid "Last attempted include was '%s',\n"
+msgstr "Az utolsó beillesztés %s volt,\n"
+
+#: src/LYReadCFG.c:1884
+#, c-format
+msgid "included from '%s'.\n"
+msgstr "beszúrva innen: %s.\n"
+
+#: src/LYReadCFG.c:2292 src/LYReadCFG.c:2305 src/LYReadCFG.c:2363
+msgid "The following is read from your lynx.cfg file."
+msgstr "Az itt következõk a lynx.cfg fájlban olvashatók."
+
+#: src/LYReadCFG.c:2293 src/LYReadCFG.c:2306
+msgid "Please read the distribution"
+msgstr "Kérem olvassa el az ide vonatkozó leírást ("
+
+#: src/LYReadCFG.c:2299 src/LYReadCFG.c:2309
+msgid "for more comments."
+msgstr ") további információért."
+
+#: src/LYReadCFG.c:2345
+msgid "RELOAD THE CHANGES"
+msgstr "VÁLTOZÁSOK ÚJRATÖLTÉSE"
+
+#: src/LYReadCFG.c:2353
+msgid "Your primary configuration"
+msgstr "Az elsõdleges beállítás:"
+
+#: src/LYShowInfo.c:173
+msgid "Directory that you are currently viewing"
+msgstr "A könyvtár, amit jelenleg néz:"
+
+#: src/LYShowInfo.c:176
+msgid "Name:"
+msgstr "Név:"
+
+#: src/LYShowInfo.c:179
+msgid "URL:"
+msgstr "URL:"
+
+#: src/LYShowInfo.c:193
+msgid "Directory that you have currently selected"
+msgstr "A kiválasztott könyvtár"
+
+#: src/LYShowInfo.c:195
+msgid "File that you have currently selected"
+msgstr "A kiválasztott fájl"
+
+#: src/LYShowInfo.c:198
+msgid "Symbolic link that you have currently selected"
+msgstr "A kiválasztott szimbolikus link"
+
+#: src/LYShowInfo.c:201
+msgid "Item that you have currently selected"
+msgstr "A kiválasztott elem"
+
+#: src/LYShowInfo.c:203
+msgid "Full name:"
+msgstr "Teljes név:"
+
+#: src/LYShowInfo.c:213
+msgid "Unable to follow link"
+msgstr "Nem tudom követni a linket"
+
+#: src/LYShowInfo.c:215
+msgid "Points to file:"
+msgstr "Erre a fájlra mutat:"
+
+#: src/LYShowInfo.c:220
+msgid "Name of owner:"
+msgstr "Tulajdonos neve:"
+
+#: src/LYShowInfo.c:223
+msgid "Group name:"
+msgstr "Csoport neve:"
+
+#: src/LYShowInfo.c:225
+msgid "File size:"
+msgstr "Fájl méret:"
+
+#: src/LYShowInfo.c:227
+msgid "(bytes)"
+msgstr "(bájt)"
+
+#.
+#. * Include date and time information.
+#.
+#: src/LYShowInfo.c:232
+msgid "Creation date:"
+msgstr "Létrehozás dátuma:"
+
+#: src/LYShowInfo.c:235
+msgid "Last modified:"
+msgstr "Utolsó módosítás:"
+
+#: src/LYShowInfo.c:238
+msgid "Last accessed:"
+msgstr "Utolsó hozzáférés:"
+
+#: src/LYShowInfo.c:244
+msgid "Access Permissions"
+msgstr "Elérési jogok"
+
+#: src/LYShowInfo.c:279
+msgid "Group:"
+msgstr "Csoport"
+
+#: src/LYShowInfo.c:299
+msgid "World:"
+msgstr "Világ:"
+
+#: src/LYShowInfo.c:306
+msgid "File that you are currently viewing"
+msgstr "Az aktuális fájl"
+
+#: src/LYShowInfo.c:314 src/LYShowInfo.c:418
+msgid "Linkname:"
+msgstr "Hivatkozásnév:"
+
+#: src/LYShowInfo.c:320 src/LYShowInfo.c:335
+msgid "Charset:"
+msgstr "Karakterkészlet:"
+
+#: src/LYShowInfo.c:334
+msgid "(assumed)"
+msgstr "(feltételezett)"
+
+#: src/LYShowInfo.c:341
+msgid "Server:"
+msgstr "Kiszolgáló:"
+
+#: src/LYShowInfo.c:344
+msgid "Date:"
+msgstr "Dátum:"
+
+#: src/LYShowInfo.c:347
+msgid "Last Mod:"
+msgstr "Utolsó módosítás:"
+
+#: src/LYShowInfo.c:352
+msgid "Expires:"
+msgstr "Lejár:"
+
+#: src/LYShowInfo.c:355
+msgid "Cache-Control:"
+msgstr "Gyorstár vezérlés:"
+
+#: src/LYShowInfo.c:358
+msgid "Content-Length:"
+msgstr "Tartalom hossz:"
+
+#: src/LYShowInfo.c:362
+#, fuzzy
+msgid "Length:"
+msgstr "Tartalom hossz:"
+
+#: src/LYShowInfo.c:367
+msgid "Language:"
+msgstr "Nyelv:"
+
+#: src/LYShowInfo.c:374
+msgid "Post Data:"
+msgstr "Elküldött adat:"
+
+#: src/LYShowInfo.c:377
+msgid "Post Content Type:"
+msgstr "Elküldött tartalom-típus:"
+
+#: src/LYShowInfo.c:380
+msgid "Owner(s):"
+msgstr "Tulajdonos:"
+
+#: src/LYShowInfo.c:385
+msgid "size:"
+msgstr "méret:"
+
+#: src/LYShowInfo.c:387
+msgid "lines"
+msgstr "sor"
+
+#: src/LYShowInfo.c:391
+msgid "forms mode"
+msgstr "ûrlap mód"
+
+#: src/LYShowInfo.c:393
+msgid "source"
+msgstr "forrás"
+
+#: src/LYShowInfo.c:394
+msgid "normal"
+msgstr "normál"
+
+#: src/LYShowInfo.c:396
+msgid ", safe"
+msgstr ", biztonságos"
+
+#: src/LYShowInfo.c:398
+msgid ", via internal link"
+msgstr ", belsõ hivatkozáson keresztül"
+
+#: src/LYShowInfo.c:403
+msgid ", no-cache"
+msgstr ", gyorstár nélkül"
+
+#: src/LYShowInfo.c:405
+msgid ", ISMAP script"
+msgstr ", ISMAP parancsállomány"
+
+#: src/LYShowInfo.c:407
+msgid ", bookmark file"
+msgstr ", könyvjelzõ fájl"
+
+#: src/LYShowInfo.c:411
+msgid "mode:"
+msgstr "mód:"
+
+#: src/LYShowInfo.c:417
+msgid "Link that you currently have selected"
+msgstr "Az aktuális link"
+
+#: src/LYShowInfo.c:426
+msgid "Method:"
+msgstr "Módszer:"
+
+#: src/LYShowInfo.c:430
+msgid "Enctype:"
+msgstr "Kódolás típusa:"
+
+#: src/LYShowInfo.c:436
+msgid "Action:"
+msgstr "Mûvelet:"
+
+#: src/LYShowInfo.c:441
+msgid "(Form field)"
+msgstr "(Ûrlap mezõ)"
+
+#: src/LYShowInfo.c:450
+msgid "No Links on the current page"
+msgstr "Nincs hivatkozás ezen a lapon"
+
+#: src/LYShowInfo.c:455
+msgid "Server Headers:"
+msgstr "Kiszolgáló fejléc:"
+
+#: src/LYStyle.c:312
+#, c-format
+msgid ""
+"Syntax Error parsing style in lss file:\n"
+"[%s]\n"
+"The line must be of the form:\n"
+"OBJECT:MONO:COLOR (ie em:bold:brightblue:white)\n"
+"where OBJECT is one of EM,STRONG,B,I,U,BLINK etc.\n"
+"\n"
+msgstr ""
+"Szintaktikai hiba az lss fájlban:\n"
+"[%s]\n"
+"A sornak a következõ szerkezete legyen:\n"
+"TÁRGY:MONO:SZÍN (pl. em:bold:brightblue:white)\n"
+"ahol a TÁRGY lehet: EM, STRONG, B, I, U, BLINK stb.\n"
+"\n"
+
+#: src/LYTraversal.c:108
+msgid "here is a list of the history stack so that you may rebuild"
+msgstr "itt egy lista az elõzmények veremrõl, így újra tudja építeni"
+
+#: src/LYUpload.c:75
+msgid "ERROR! - upload command is misconfigured"
+msgstr "HIBA! - a feltöltési parancs nincs jól beállítva"
+
+#: src/LYUpload.c:96
+msgid "Illegal redirection \"../\" found! Request ignored."
+msgstr "Érvénytelen átirányítás! \"../\" A kérés figyelmen kívül hagyva."
+
+#: src/LYUpload.c:99
+msgid "Illegal character \"/\" found! Request ignored."
+msgstr "Érvénytelen karakter! \"/\" A kérés figyelmen kívül hagyva."
+
+#: src/LYUpload.c:102
+msgid "Illegal redirection using \"~\" found! Request ignored."
+msgstr "Érvénytelen átirányítás! \"~\" A kérés figyelmen kívül hagyva."
+
+#: src/LYUpload.c:159
+msgid "Unable to upload file."
+msgstr "Nem lehet feltölteni a fájlt."
+
+#: src/LYUpload.c:201
+msgid "Upload To:"
+msgstr "Feltöltés:"
+
+#: src/LYUpload.c:202
+msgid "Upload options:"
+msgstr "Feltöltési beállítások:"
+
+#: src/LYUtils.c:1830
+msgid "Download document URL put to clipboard."
+msgstr "A letöltendõ dokumentum URL-jét a vágólapra tesszük."
+
+#: src/LYUtils.c:2615
+msgid "Unexpected access protocol for this URL scheme."
+msgstr "Nem támogatott elérési protokoll ezen az URL sémán."
+
+#: src/LYUtils.c:3419
+msgid "Too many tempfiles"
+msgstr "Túl sok átmeneti fájl"
+
+#: src/LYUtils.c:3719
+msgid "unknown restriction"
+msgstr "ismeretlen szigorítás"
+
+#: src/LYUtils.c:3750
+#, c-format
+msgid "No restrictions set.\n"
+msgstr "Nincs szigorítás beállítva.\n"
+
+#: src/LYUtils.c:3753
+#, c-format
+msgid "Restrictions set:\n"
+msgstr "Szigorítási beállítás:\n"
+
+#: src/LYUtils.c:5131
+msgid "Cannot find HOME directory"
+msgstr "Nem találom a HOME könyvtárat"
+
+#: src/LYrcFile.c:16
+msgid "Normally disabled. See ENABLE_LYNXRC in lynx.cfg\n"
+msgstr "Általában letiltva. Nézze meg az ENABLE_LYNXRC-t a lynx.cfg-ben\n"
+
+#: src/LYrcFile.c:317
+msgid ""
+"accept_all_cookies allows the user to tell Lynx to automatically\n"
+"accept all cookies if desired. The default is \"FALSE\" which will\n"
+"prompt for each cookie. Set accept_all_cookies to \"TRUE\" to accept\n"
+"all cookies.\n"
+msgstr ""
+"Az accept_all_cookies TRUE-ra állítása lehetõvé teszi a sütik automatikus\n"
+" fogadását. Alapban FALSE, így mindig rákérdez.\n"
+
+#: src/LYrcFile.c:325
+msgid ""
+"anonftp_password allows the user to tell Lynx to use the personal\n"
+"email address as the password for anonymous ftp. If no value is given,\n"
+"Lynx will use the personal email address. Set anonftp_password\n"
+"to a different value if you choose.\n"
+msgstr ""
+
+#: src/LYrcFile.c:332
+msgid ""
+"bookmark_file specifies the name and location of the default bookmark\n"
+"file into which the user can paste links for easy access at a later\n"
+"date.\n"
+msgstr ""
+"a bookmark_file eltárolja annak a fájlnak a nevét és helyét, amibe linkeket\n"
+" lehet felvenni, és késõbb felhasználni.\n"
+
+#: src/LYrcFile.c:337
+msgid ""
+"If case_sensitive_searching is \"on\" then when the user invokes a search\n"
+"using the 's' or '/' keys, the search performed will be case sensitive\n"
+"instead of case INsensitive. The default is usually \"off\".\n"
+msgstr ""
+"Ha a case_sensitive_searching \"on\", akkor a keresés megkülönbözteti\n"
+" a kis- és nagybetûket. Az alapbeállítás az \"off\" állapot.\n"
+
+#: src/LYrcFile.c:342
+msgid ""
+"The character_set definition controls the representation of 8 bit\n"
+"characters for your terminal. If 8 bit characters do not show up\n"
+"correctly on your screen you may try changing to a different 8 bit\n"
+"set or using the 7 bit character approximations.\n"
+"Current valid characters sets are:\n"
+msgstr ""
+"A character_set definíció vezérli a 8 bites megjelenítést a terminálon.\n"
+"Ha a 8 bites betûk nem megfelelõen látszanak, akkor megpróbálhatja\n"
+"használni a 7 bites karaktereket.\n"
+"A jelenlegi karakterkészletek:\n"
+
+#: src/LYrcFile.c:349
+msgid ""
+"cookie_accept_domains and cookie_reject_domains are comma-delimited\n"
+"lists of domains from which Lynx should automatically accept or reject\n"
+"all cookies. If a domain is specified in both options, rejection will\n"
+"take precedence. The accept_all_cookies parameter will override any\n"
+"settings made here.\n"
+msgstr ""
+"A cookie_accept_domains és a cookie_reject_domains vesszõvel elválasztott\n"
+"tartomány-listák, ahonnan a Lynxnek automatikusan el kell fogadnia, \n"
+"vagy elvetnie a kapott sütiket. Ha egy tartomány mindkét listában szerepelne,\n"
+"az elutasítás lép érvénybe. Az accept_all_cookies felülírja az itt megadott\n"
+"beállítást.\n"
+
+#: src/LYrcFile.c:357
+#, fuzzy
+msgid ""
+"cookie_file specifies the file from which to read persistent cookies.\n"
+"The default is ~/"
+msgstr "A cookie_file az a fájl, ahonnan az állandó sütiket be kell olvasni. Alaphelyzetben ez a ~/.lynx_cookies.\n"
+
+#: src/LYrcFile.c:362
+msgid ""
+"cookie_loose_invalid_domains, cookie_strict_invalid_domains, and\n"
+"cookie_query_invalid_domains are comma-delimited lists of which domains\n"
+"should be subjected to varying degrees of validity checking. If a\n"
+"domain is set to strict checking, strict conformance to RFC2109 will\n"
+"be applied. A domain with loose checking will be allowed to set cookies\n"
+"with an invalid path or domain attribute. All domains will default to\n"
+"querying the user for an invalid path or domain.\n"
+msgstr ""
+"A cookie_loose_invalid_domains, a cookie_strict_invalid_domains, és\n"
+"a cookie_query_invalid_domains vesszõvel elválasztott tartomány-listák,\n"
+" ahonnan különbözõ mértékû azonosítást kívánunk meg. Ha egy tartomány\n"
+"'strict checking'-re van állítva, akkor az RFC2109-nek megfelelõ eljárás\n"
+"lép érvénybe. A 'loose checking' megengedi a sütik érvénytelen útvonallal\n"
+"való elfogadását. Alapbeállításban a felhasználó egy kérdést kap, melyben\n"
+"eldöntheti, hogy elfogadja-e az érvénytelen útvonalat vagy tartományt.\n"
+
+#: src/LYrcFile.c:376
+msgid ""
+"dir_list_order specifies the directory list order under DIRED_SUPPORT\n"
+"(if implemented). The default is \"ORDER_BY_NAME\"\n"
+msgstr ""
+"A dir_list_order határozza meg a könyvtárlista rendezését, a \n"
+"DIRED_SUPPORT-nál (ha rendelkezésre áll). Alaphelyzet: \"ORDER_BY_NAME\"\n"
+
+#: src/LYrcFile.c:381
+msgid ""
+"dir_list_styles specifies the directory list style under DIRED_SUPPORT\n"
+"(if implemented). The default is \"MIXED_STYLE\", which sorts both\n"
+"files and directories together. \"FILES_FIRST\" lists files first and\n"
+"\"DIRECTORIES_FIRST\" lists directories first.\n"
+msgstr ""
+"A dir_list_styles határozza meg a könyvtárlista módját a DIRED_SUPPORT-nál\n"
+"(ha rendelkezésre áll). Alaphelyzet: \"MIXED_STYLE\", amiben a könyvtárak\n"
+"és a fájlok egy listában vannak. A \"FILES_FIRST\" elõször a fájlokat\n"
+" listázza, a \"DIRECTORIES_FIRST\" elõször a könyvtárakat.\n"
+
+#: src/LYrcFile.c:389
+msgid ""
+"If emacs_keys is to \"on\" then the normal EMACS movement keys:\n"
+" ^N = down ^P = up\n"
+" ^B = left ^F = right\n"
+"will be enabled.\n"
+msgstr ""
+"Ha az emacs_keys \"on\" állásban van, akkor az alábbi EMACS gombok \n"
+"használhatók:\n"
+" ^N = le ^P = fel\n"
+" ^B = balra ^F = jobbra\n"
+
+#: src/LYrcFile.c:395
+msgid ""
+"file_editor specifies the editor to be invoked when editing local files\n"
+"or sending mail. If no editor is specified, then file editing is disabled\n"
+"unless it is activated from the command line, and the built-in line editor\n"
+"will be used for sending mail.\n"
+msgstr ""
+"A file_editor rendeli a szerkesztõt a helyi fájlokhoz vagy levelekhez.\n"
+"Ha ez nincs meghatározva, akkor a fájl szerkesztés letiltódik, hacsak nem\n"
+"parancssorból lett aktiválva, mert akkor a beépített szerkesztõt lehet\n"
+"használni a levélíráshoz.\n"
+
+#: src/LYrcFile.c:402
+msgid ""
+"The file_sorting_method specifies which value to sort on when viewing\n"
+"file lists such as FTP directories. The options are:\n"
+" BY_FILENAME -- sorts on the name of the file\n"
+" BY_TYPE -- sorts on the type of the file\n"
+" BY_SIZE -- sorts on the size of the file\n"
+" BY_DATE -- sorts on the date of the file\n"
+msgstr ""
+"A file_sorting_method meghatározza, hogy melyik érték szerint rendezze\n"
+"sorba az éppen látható FTP könyvtárat. Az opciók:\n"
+" BY_FILENAME -- fájlnév szerint rendez\n"
+" BY_TYPE -- fájl típusa szerint rendez\n"
+" BY_SIZE -- fájl mérete szerint rendez\n"
+" BY_DATE -- fájl dátuma szerint rendez\n"
+
+#: src/LYrcFile.c:424
+msgid ""
+"lineedit_mode specifies the key binding used for inputting strings in\n"
+"prompts and forms. If lineedit_mode is set to \"Default Binding\" then\n"
+"the following control characters are used for moving and deleting:\n"
+"\n"
+" Prev Next Enter = Accept input\n"
+" Move char: <- -> ^G = Cancel input\n"
+" Move word: ^P ^N ^U = Erase line\n"
+" Delete char: ^H ^R ^A = Beginning of line\n"
+" Delete word: ^B ^F ^E = End of line\n"
+"\n"
+"Current lineedit modes are:\n"
+msgstr ""
+"\"A lineedit_mode határozza meg azokat a hozzárendeléseket, amiket az\n"
+"ûrlapoknál használunk. Ha a lineedit_mode \"Default Binding\"-re van állítva\n"
+"(alapértelmezés), akkor a következõ vezérlõkaraktereket lehet használni\n"
+"mozgásra és törlésre:\n"
+"\n"
+" Elõzõ Köv. Enter = rendben\n"
+"Mozgás karakterre: <- -> ^G = mégsem \n"
+"Mozgás szóra: ^P ^N ^U = sor törlése \n"
+"Karakter törlése: ^H ^R ^A = sor elejére\n"
+"Szó törlése: ^B ^F ^E = sor végére \n"
+"A pillanatnyi 'lineedit' módok:\n"
+
+#: src/LYrcFile.c:442
+msgid ""
+"The following allow you to define sub-bookmark files and descriptions.\n"
+"The format is multi_bookmark<capital_letter>=<filename>,<description>\n"
+"Up to 26 bookmark files (for the English capital letters) are allowed.\n"
+"We start with \"multi_bookmarkB\" since 'A' is the default (see above).\n"
+msgstr ""
+"Itt definiálhatjuk az al-könyvjelzõ fájlokat és leírásukat.\n"
+"A forma a következõ: többszörös_könyvjelzõ<nagy_betû>=<fájlnév>,<leírás>\n"
+"Összesen 26 könyvjelzõt lehet létrehozni (az angol ABC nagy betûibõl)\n"
+"Kezdjük a \"multi_bookmarkB\"-vel, mivel az 'A' az alapbeállítás.\n"
+
+#: src/LYrcFile.c:448
+msgid ""
+"personal_mail_address specifies your personal mail address. The\n"
+"address will be sent during HTTP file transfers for authorization and\n"
+"logging purposes, and for mailed comments.\n"
+"If you do not want this information given out, set the NO_FROM_HEADER\n"
+"to TRUE in lynx.cfg, or use the -nofrom command line switch. You also\n"
+"could leave this field blank, but then you won't have it included in\n"
+"your mailed comments.\n"
+msgstr ""
+"A personal_mail_address határozza meg az ön személyes email címét. Ez a\n"
+"cím lesz elküldve HTTP fájl átvitel hitelesítésekor, tárolva lesz, amikor\n"
+"bejelentkezik egy gépre és amikor egy levelet küld.\n"
+"Ha nem akarja, hogy ezt az adatot kiadja a program, akkor \n"
+"állítsa be a NO_FROM_HEADER-t TRUE-ra a lynx.cfg-ben, vagy használja\n"
+"a -nofrom parancssori kapcsolót. Üresen is hagyhatja a mezõt, akkor\n"
+"nem lesz benne az elküldött levélben.\n"
+
+#: src/LYrcFile.c:457
+msgid ""
+"preferred_charset specifies the character set in MIME notation (e.g.,\n"
+"ISO-8859-2, ISO-8859-5) which Lynx will indicate you prefer in requests\n"
+"to http servers using an Accept-Charset header. The value should NOT\n"
+"include ISO-8859-1 or US-ASCII, since those values are always assumed\n"
+"by default. May be a comma-separated list.\n"
+"If a file in that character set is available, the server will send it.\n"
+"If no Accept-Charset header is present, the default is that any\n"
+"character set is acceptable. If an Accept-Charset header is present,\n"
+"and if the server cannot send a response which is acceptable\n"
+"according to the Accept-Charset header, then the server SHOULD send\n"
+"an error response, though the sending of an unacceptable response\n"
+"is also allowed.\n"
+msgstr ""
+"A preferred_charset meghatározza a MIME jelölés karakterkészletét (pl.\n"
+"ISO-8859-2, ISO-8859-5) amit a Lynx jelez a http szervernek az Accept-Charset\n"
+"fejlécen keresztül. Fölösleges az ISO-8859-1 vagy US-ASCII beállítás,\n"
+"mert ezeket alapból használja.\n"
+"Készíthetünk belõlük kettõsponttal elválasztott listát.\n"
+"Ha a karakterkészlet elérhetõ, a szerver azt küldi.\n"
+"Ha nincs Accept-Charset fejléc, akkor az összes karakterkészletet\n"
+"elfogadjuk. Ha az Accept-Charset létezik, de a szerver nem tud küldeni\n"
+"ennek megfelelõ választ, akkor a szervernek hibaüzenetet\n"
+"kell küldenie, bár elfogadhatatlan válasz is lehetséges.\n"
+
+#: src/LYrcFile.c:473
+msgid ""
+"preferred_language specifies the language in MIME notation (e.g., en,\n"
+"fr, may be a comma-separated list in decreasing preference)\n"
+"which Lynx will indicate you prefer in requests to http servers.\n"
+"If a file in that language is available, the server will send it.\n"
+"Otherwise, the server will send the file in its default language.\n"
+msgstr ""
+"A preferred_language meghatározza a MIME jelölés nyelvét (pl: hu, en,\n"
+"fr; ezeket csökkenõ fontossági sorrendben kettõsponttal el lehet\n"
+"választani egymástól), amit a Lynx jelezni fog a http szerver felé. Ha\n"
+"a fájl ezen a nyelven elérhetõ, akkor a szerver azt küldi vissza. \n"
+"Egyébként a szerver az általa alapértelmezettnek vett nyelven fog beszélni.\n"
+
+#: src/LYrcFile.c:484
+msgid ""
+"If run_all_execution_links is set \"on\" then all local execution links\n"
+"will be executed when they are selected.\n"
+"\n"
+"WARNING - This is potentially VERY dangerous. Since you may view\n"
+" information that is written by unknown and untrusted sources\n"
+" there exists the possibility that Trojan horse links could be\n"
+" written. Trojan horse links could be written to erase files\n"
+" or compromise security. This should only be set to \"on\" if\n"
+" you are viewing trusted source information.\n"
+msgstr ""
+"Ha a run_all_execution_links \"on\"-ra van állítva, akkor minden\n"
+" végrehajtható link kiválasztás után végrehajtódik.\n"
+"\n"
+"FIGYELEM - Ez egy NAGYON veszélyes beállítás. Minthogy ismeretlen\n"
+" forrás által készített anyagot használunk, \n"
+" megvan a lehetõsége, hogy trójai programot indítunk el.\n"
+" A trójai program fájlokat törölhet a gépünkrõl, vagy\n"
+" hozzáférhet a személyes adatainkhoz. Kizárólag abban az\n"
+" esetben állítsuk \"on\"-ra, ha megbízható forrást használunk.\n"
+
+#: src/LYrcFile.c:495
+msgid ""
+"If run_execution_links_on_local_files is set \"on\" then all local\n"
+"execution links that are found in LOCAL files will be executed when they\n"
+"are selected. This is different from run_all_execution_links in that\n"
+"only files that reside on the local system will have execution link\n"
+"permissions.\n"
+"\n"
+"WARNING - This is potentially dangerous. Since you may view\n"
+" information that is written by unknown and untrusted sources\n"
+" there exists the possibility that Trojan horse links could be\n"
+" written. Trojan horse links could be written to erase files\n"
+" or compromise security. This should only be set to \"on\" if\n"
+" you are viewing trusted source information.\n"
+msgstr ""
+"Ha a run_execution_links_on_local_files \"on\"-ra van állítva, akkor\n"
+"a helyi végrehajtható linkeket kiválasztással el lehet indítani.\n"
+"Ez különbözik a run_all_execution_links beállítástól, mert\n"
+"csak a helyi fájlokra vonatkozik.\n"
+"\n"
+"FIGYELEM - Ez egy veszélyes beállítás. Minthogy ismeretlen\n"
+" forrás által készített anyagot használunk, \n"
+" megvan a lehetõsége, hogy trójai programot indítunk el.\n"
+" A trójai program fájlokat törölhet a gépünkrõl, vagy\n"
+" hozzáférhet a személyes adatainkhoz. Kizárólag abban az\n"
+" esetben állítsuk \"on\"-ra, ha megbízható forrást használunk.\n"
+
+#: src/LYrcFile.c:513
+msgid ""
+"select_popups specifies whether the OPTIONs in a SELECT block which\n"
+"lacks a MULTIPLE attribute are presented as a vertical list of radio\n"
+"buttons or via a popup menu. Note that if the MULTIPLE attribute is\n"
+"present in the SELECT start tag, Lynx always will create a vertical list\n"
+"of checkboxes for the OPTIONs. A value of \"on\" will set popup menus\n"
+"as the default while a value of \"off\" will set use of radio boxes.\n"
+"The default can be overridden via the -popup command line toggle.\n"
+msgstr ""
+"A select_popups meghatározza, hogy a SELECT blokkban lévõ OPCIÓK\n"
+"hogyan jelenjen meg, ha hiányzik a MULTIPLE attribútum: függõleges\n"
+"rádiógombokkal, vagy legördülõ menüvel. Megjegyezzük, hogy ha a \n"
+"MULTIPLE attribútum be van állítva a SELECT tagban, akkor a Lynx\n"
+" automatikusan jelölõnégyzeteket rajzol egymás alá. Ha az érték \"on\"\n"
+" állásban van, akkor mindig legördülõ menüt használ, \"off\" állásban\n"
+"pedig jelölõnégyzeteket.\n"
+"Az alapértelmezett beállítást a -popup paranccsal felül lehet bírálni.\n"
+
+#: src/LYrcFile.c:523
+msgid ""
+"show_color specifies how to set the color mode at startup. A value of\n"
+"\"never\" will force color mode off (treat the terminal as monochrome)\n"
+"at startup even if the terminal appears to be color capable. A value of\n"
+"\"always\" will force color mode on even if the terminal appears to be\n"
+"monochrome, if this is supported by the library used to build lynx.\n"
+"A value of \"default\" will yield the behavior of assuming\n"
+"a monochrome terminal unless color capability is inferred at startup\n"
+"based on the terminal type, or the -color command line switch is used, or\n"
+"the COLORTERM environment variable is set. The default behavior always is\n"
+"used in anonymous accounts or if the \"option_save\" restriction is set.\n"
+"The effect of the saved value can be overridden via\n"
+"the -color and -nocolor command line switches.\n"
+"The mode set at startup can be changed via the \"show color\" option in\n"
+"the 'o'ptions menu. If the option settings are saved, the \"on\" and\n"
+"\"off\" \"show color\" settings will be treated as \"default\".\n"
+msgstr ""
+"A show_color meghatározza, hogy induláskor a Lynx színes legyen, vagy sem.\n"
+"A \"never\" érték kikapcsolja a színes módot (a terminál fekete-fehér lesz),\n"
+"akkor is, ha lehetséges lenne színes mód használata. Az \"always\" érték\n"
+"bekapcsolja a színes üzemmódot még fekete-fehér monitoron is, ha \n"
+"a támogatás bele lett fordítva a Lynx-be. A \"default\" érték hatására\n"
+"fekete-fehér terminált használ, hacsak színes képernyõt nem talál,\n"
+"esetleg a -color parancssori, vagy a COLORTERM \n"
+"környezeti változó be nem lett állítva. Az alapértelmezett viselkedés \n"
+" lesz érvényes a névtelen bejelentkezések esetén, vagy ha\n"
+"a felhasználó az \"option_save\" szigorítást használja.\n"
+"Az elmentett beállításokat felül lehet bírálni a parancssori\n"
+" -color és -nocolor kapcsolókkal.\n"
+"Az induláskori beállításokat meg lehet változtatni a \"színek mutatása\" opcióval.\n"
+
+#: src/LYrcFile.c:540
+msgid ""
+"show_cursor specifies whether to 'hide' the cursor to the right (and\n"
+"bottom, if possible) of the screen, or to place it to the left of the\n"
+"current link in documents, or current option in select popup windows.\n"
+"Positioning the cursor to the left of the current link or option is\n"
+"helpful for speech or braille interfaces, and when the terminal is\n"
+"one which does not distinguish the current link based on highlighting\n"
+"or color. A value of \"on\" will set positioning to the left as the\n"
+"default while a value of \"off\" will set 'hiding' of the cursor.\n"
+"The default can be overridden via the -show_cursor command line toggle.\n"
+msgstr ""
+"A show_cursor határozza meg, hogy a kurzort elrejtjük-e ('hide') a\n"
+"képernyõ jobb oldalára, alulra (ha lehetséges), vagy az aktuális\n"
+"linktõl balra, vagy az aktuális opcióra egy felbukkanó menüben. A\n"
+"kurzor balra helyezése elõnyös felolvasó- vagy braille csatolók\n"
+"esetén, és általában akkor, ha a terminál nem különbözteti meg\n"
+"kiemeléssel vagy színnel a linkeket. Alaphelyzet az \"ON\", ekkor a\n"
+"\"balra\" pozicionálás érvényes, míg \"OFF\" állásban a kurzor elrejtésre\n"
+"kerül. Felülírható a \"-show_cursor\" parancssori opcióval.\n"
+
+#: src/LYrcFile.c:551
+msgid ""
+"show_dotfiles specifies that the directory listing should include\n"
+"\"hidden\" (dot) files/directories. If set \"on\", this will be\n"
+"honored only if enabled via userdefs.h and/or lynx.cfg, and not\n"
+"restricted via a command line switch. If display of hidden files\n"
+"is disabled, creation of such files via Lynx also is disabled.\n"
+msgstr ""
+"A show_dotfiles meghatározza, hogyan viselkedjen a program azokkal a \n"
+"könyvtárakkal, amikben rejtett (ponttal kezdõdõ) fájlok, könyvtárak vannak. \n"
+"A kapcsolót csak úgy tudjuk \"ON\" állásba helyezni, hogy a userdefs.h vagy \n"
+"a lynx.cfg-ben engedélyezzük és a parancssorban sem tiltottuk le. Ha a rejtett \n"
+"fájlok megjelenítése le van tiltva, akkor az ilyen fájlok létrehozása sem \n"
+"lehetséges.\n"
+
+#: src/LYrcFile.c:562
+msgid ""
+"If sub_bookmarks is not turned \"off\", and multiple bookmarks have\n"
+"been defined (see below), then all bookmark operations will first\n"
+"prompt the user to select an active sub-bookmark file. If the default\n"
+"Lynx bookmark_file is defined (see above), it will be used as the\n"
+"default selection. When this option is set to \"advanced\", and the\n"
+"user mode is advanced, the 'v'iew bookmark command will invoke a\n"
+"statusline prompt instead of the menu seen in novice and intermediate\n"
+"user modes. When this option is set to \"standard\", the menu will be\n"
+"presented regardless of user mode.\n"
+msgstr ""
+"Ha az al-könyvjelzõ nincs kikapcsolva (OFF), és többszörös könyvjelzõt\n"
+"állítottunk be (lásd késõbb), akkor könyvjelzõ mûveletek elõtt elõször\n"
+"megkérdezzük a felhasználót, hogy melyik al-könyvjelzõt akarja\n"
+"használni. Ha az alapértelmezett Lynx könyvjelzõ definiálva van (lásd\n"
+"fentebb), akkor azt használjuk alapból. Amikor ez a beállítás haladó\n"
+"(\"advanced\") módban van és a felhasználó is haladó, akkor a könyvjelzõ\n"
+"megnézése parancs állapotsorában prompt lesz látható a kezdõ és közép-\n"
+"haladónál látható menü helyett. Ha ez az opció \"standard\"-re van\n"
+"állítva, akkor a menü - felhasználói módra való tekintet nélkül -\n"
+"megjelenik.\n"
+
+#: src/LYrcFile.c:576
+msgid ""
+"user_mode specifies the users level of knowledge with Lynx. The\n"
+"default is \"NOVICE\" which displays two extra lines of help at the\n"
+"bottom of the screen to aid the user in learning the basic Lynx\n"
+"commands. Set user_mode to \"INTERMEDIATE\" to turn off the extra info.\n"
+"Use \"ADVANCED\" to see the URL of the currently selected link at the\n"
+"bottom of the screen.\n"
+msgstr ""
+"A user_mode határozza meg a felhasználó tapasztalati szintjét\n"
+"Lynx-szel kapcsolatban. Alaphelyzet a \"KEZDÕ\" szint, ekkor két plusz\n"
+"sor segíti a felhasználót a képernyõ alján. A \"KÖZÉPFOKÚ\" szint\n"
+"kikapcsolja ezeket a sorokat. A \"HALADÓ\" szinten a képernyõ alján a\n"
+"kiválasztott link URL-je látható.\n"
+
+#: src/LYrcFile.c:585
+msgid ""
+"If verbose_images is \"on\", lynx will print the name of the image\n"
+"source file in place of [INLINE], [LINK] or [IMAGE]\n"
+"See also VERBOSE_IMAGES in lynx.cfg\n"
+msgstr ""
+"Ha a verbose_images \"ON\" állásban van, akkor a Lynx kiírja a kép nevét\n"
+"az [INLINE], [LINK] vagy [IMAGE] elõfordulásakor. (Lásd még:\n"
+"VERBOSE_IMAGES a lynx.cfg fájlban\n"
+
+#: src/LYrcFile.c:590
+msgid ""
+"If vi_keys is set to \"on\", then the normal VI movement keys:\n"
+" j = down k = up\n"
+" h = left l = right\n"
+"will be enabled. These keys are only lower case.\n"
+"Capital 'H', 'J' and 'K will still activate help, jump shortcuts,\n"
+"and the keymap display, respectively.\n"
+msgstr ""
+"Ha a vi_keys \"ON\" állásban van, akkor a VI mozgató gombokat \n"
+"használhatjuk:\n"
+" j = le k = fel\n"
+" h = balra l = jobbra\n"
+"A parancsok kisbetûsek! A nagy 'H', 'J' és 'K' segítséget, ugrást, és\n"
+"billentyû beállítást jelent.\n"
+
+#: src/LYrcFile.c:598
+msgid ""
+"The visited_links setting controls how Lynx organizes the information\n"
+"in the Visited Links Page.\n"
+msgstr ""
+"A visited_links beállítás határozza meg, hogy a Lynx hogyan szervezi a\n"
+"meglátogatott oldalakkal kapcsolatos információkat.\n"
+
+#: src/LYrcFile.c:819
+msgid ""
+"If keypad_mode is set to \"NUMBERS_AS_ARROWS\", then the numbers on\n"
+"your keypad when the numlock is on will act as arrow keys:\n"
+" 8 = Up Arrow\n"
+" 4 = Left Arrow 6 = Right Arrow\n"
+" 2 = Down Arrow\n"
+"and the corresponding keyboard numbers will act as arrow keys,\n"
+"regardless of whether numlock is on.\n"
+msgstr ""
+"Ha a keypad_mode \"NUMBERS_AS_ARROWS\" beállításban van (a numerikus\n"
+"gombok nyilakként viselkedjenek), akkor a numerikus gombokkal a következõ\n"
+"haladási irányt adhatjuk meg (feltéve, hogy a NumLock gomb be van nyomva):\n"
+"\n"
+" 8 = fel\n"
+" 4 = balra 6 = jobbra\n"
+" 2 = le \n"
+"\n"
+"Ugyanígy viselkednek a betûknél lévõ számok is, függetlenül a NumLock\n"
+"gomb állásától.\n"
+
+#: src/LYrcFile.c:828
+msgid ""
+"If keypad_mode is set to \"LINKS_ARE_NUMBERED\", then numbers will\n"
+"appear next to each link and numbers are used to select links.\n"
+msgstr ""
+"Ha a keypad_mode \"LINKS_ARE_NUMBERED\"-re van állítva (\"a hivatkozások\n"
+"számozva lesznek\"), a hivatkozások mellett számok fognak megjelenni, amivel\n"
+"ki lehet választani az adott hivatkozást.\n"
+
+#: src/LYrcFile.c:832
+msgid ""
+"If keypad_mode is set to \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\", then\n"
+"numbers will appear next to each link and visible form input field.\n"
+"Numbers are used to select links, or to move the \"current link\" to a\n"
+"form input field or button. In addition, options in popup menus are\n"
+"indexed so that the user may type an option number to select an option in\n"
+"a popup menu, even if the option isn't visible on the screen. Reference\n"
+"lists and output from the list command also enumerate form inputs.\n"
+msgstr ""
+"Ha a keypad_mode \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\"-re van állítva,\n"
+"akkor a hivatkozások és a látható bemeneti mezõk mellett számok fognak\n"
+"megjelenni. A számokat a hivatkozás kiválasztására lehet használni,\n"
+"vagy az \"aktuális link\"-et lehet átállítani bemeneti mezõre vagy\n"
+"gombra. Ezen felül a felbukkanó menükben lévõ opciók indexet kapnak,\n"
+"ami alapján is ki lehet választani õket számokkal, akkor is, ha az\n"
+"opció nem látható a képernyõn. Referencia listák és a listaparancsból\n"
+"származó kimenetek szintén beszámozzák az ûrlap bemeneteket.\n"
+
+#: src/LYrcFile.c:841
+msgid ""
+"NOTE: Some fixed format documents may look disfigured when\n"
+"\"LINKS_ARE_NUMBERED\" or \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\" are\n"
+"enabled.\n"
+msgstr ""
+"MEGJEGYZÉS: Bizonyos meghatározott formátumú dokumentum rosszul nézhet\n"
+"ki, ha a LINKS_ARE_NUMBERED vagy a LINKS_AND_FORM_FIELDS_ARE_NUMBERED\n"
+"opció engedélyezve van.\n"
+
+#: src/LYrcFile.c:873
+msgid ""
+"Lynx User Defaults File\n"
+"\n"
+msgstr ""
+
+#: src/LYrcFile.c:882
+msgid ""
+"This file contains options saved from the Lynx Options Screen (normally\n"
+"with the 'o' key). To save options with that screen, you must select the\n"
+"checkbox:\n"
+msgstr ""
+
+#: src/LYrcFile.c:889
+msgid ""
+"You must then save the settings using the link on the line above the\n"
+"checkbox:\n"
+msgstr ""
+
+#: src/LYrcFile.c:896
+msgid ""
+"You may also use the command-line option \"-forms_options\", which displays\n"
+"the simpler Options Menu instead. Save options with that using the '>' key.\n"
+"\n"
+msgstr ""
+
+#: src/LYrcFile.c:903
+msgid ""
+"This file contains options saved from the Lynx Options Screen (normally\n"
+"with the '>' key).\n"
+"\n"
+msgstr ""
+
+#: src/LYrcFile.c:910
+#, fuzzy
+msgid ""
+"There is normally no need to edit this file manually, since the defaults\n"
+"here can be controlled from the Options Screen, and the next time options\n"
+"are saved from the Options Screen this file will be completely rewritten.\n"
+"You have been warned...\n"
+"\n"
+"If you are looking for the general configuration file - it is normally\n"
+"called \"lynx.cfg\". It has different content and a different format.\n"
+"It is not this file.\n"
+msgstr ""
+"Lynx Felhasználói Alapbeállítások Fájl\n"
+"\n"
+"Ez a fájl tartalmazza a Lynx Beállítások Képernyõn elmentett\n"
+"beállításokat. Nem szükséges ennek a fájlnak a kézi szerkesztése,\n"
+"mivel a Beállítások Képernyõ teljesen átveszi a fájl kezelését. Ha ön\n"
+"az általános beállítások fájlt keresi - azt általában lynx.cfg -nek\n"
+"nevezik. Ez nem az a fájl.\n"
+
+#~ msgid "History List maximum reached! Document not pushed."
+#~ msgstr "Elértük az elõzménylista maximális hosszát! A dokumentum nem lett berakva."
+
+#~ msgid "Socket read failed for 180,000 tries."
+#~ msgstr "Az illesztõpont 180.000 olvasás után is sikertelen."
+
+#~ msgid "reason unknown."
+#~ msgstr "ok ismeretlen."
diff --git a/po/id.po b/po/id.po
new file mode 100644
index 0000000..2a53d0c
--- /dev/null
+++ b/po/id.po
@@ -0,0 +1,6418 @@
+# Pesan bahasa indonesia untuk lynx
+# Copyright (C) 2008 Arif E. Nugroho <arif_endro@yahoo.com>
+# This file is distributed under the same license as the lynx package.
+# Arif E. Nugroho <arif_endro@yahoo.com>, 2008, 2009, 2010, 2011, 2012, 2013, 2014.
+# Andika Triwidada <andika@gmail.com>, 2021.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: lynx 2.9.0-dev8\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-07-31 10:04-0400\n"
+"PO-Revision-Date: 2021-08-24 15:34+0700\n"
+"Last-Translator: Andika Triwidada <andika@gmail.com>\n"
+"Language-Team: Indonesian <translation-team-id@lists.sourceforge.net>\n"
+"Language: id\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"X-Generator: Poedit 2.4.3\n"
+
+#. ******************************************************************
+#. * The following definitions are for status line prompts, messages, or
+#. * warnings issued by Lynx during program execution. You can modify
+#. * them to make them more appropriate for your site. We recommend that
+#. * you extend these definitions to other languages using the gettext
+#. * library. There are also scattered uses of 'gettext()' throughout the
+#. * Lynx source, covering all but those messages which (a) are used for
+#. * debugging (CTRACE) or (b) are constants used in interaction with
+#. * other programs.
+#. *
+#. * See ABOUT-NLS and po/readme for details and location of contributed
+#. * translations. When no translation is available, the English default is
+#. * used.
+#.
+#: LYMessages.c:28
+#, c-format
+msgid "Alert!: %s"
+msgstr "Peringatan!: %s"
+
+#: LYMessages.c:29
+msgid "Welcome"
+msgstr "Selamat datang"
+
+#: LYMessages.c:30
+msgid "Are you sure you want to quit?"
+msgstr "Apakah Anda yakin Anda ingin keluar?"
+
+#: LYMessages.c:32
+msgid "Really exit from Lynx?"
+msgstr "Benar benar keluar dari Lynx?"
+
+#: LYMessages.c:34
+msgid "Connection interrupted."
+msgstr "Koneksi terinterupsi."
+
+#: LYMessages.c:35
+msgid "Data transfer interrupted."
+msgstr "Transfer data terinterupsi."
+
+#: LYMessages.c:36
+msgid "Cancelled!!!"
+msgstr "Dibatalkan!!!"
+
+#: LYMessages.c:37
+msgid "Cancelling!"
+msgstr "Membatalkan!"
+
+#: LYMessages.c:38
+msgid "Excellent!!!"
+msgstr "Ekselen!!!"
+
+#: LYMessages.c:39
+msgid "OK"
+msgstr "OK"
+
+#: LYMessages.c:40
+msgid "Done!"
+msgstr "Selesai!"
+
+#: LYMessages.c:41
+msgid "Bad request!"
+msgstr "Permintaan buruk!"
+
+#: LYMessages.c:42
+msgid "previous"
+msgstr "sebelumnya"
+
+#: LYMessages.c:43
+msgid "next screen"
+msgstr "layar selanjutnya"
+
+#: LYMessages.c:44
+msgid "HELP!"
+msgstr "TOLONG!"
+
+#: LYMessages.c:45
+msgid ", help on "
+msgstr ", bantuan di "
+
+#. #define HELP
+#: LYMessages.c:47
+msgid "Commands: Use arrow keys to move, '?' for help, 'q' to quit, '<-' to go back."
+msgstr "Perintah: Gunakan tombol panah untuk berpindah, '?' untuk bantuan, 'q' untuk berhenti, '<-' untuk kembali."
+
+#. #define MOREHELP
+#: LYMessages.c:49
+msgid "-- press space for more, use arrow keys to move, '?' for help, 'q' to quit."
+msgstr "-- tekan spasi untuk lebih lanjut, gunakan tombol panah untuk berpindah, '?' untuk bantuan, 'q' untuk berhenti."
+
+#: LYMessages.c:50
+msgid "-- press space for next page --"
+msgstr "-- tekan spasi untuk halaman selanjutnya --"
+
+#: LYMessages.c:51
+msgid "URL too long"
+msgstr "URL terlalu panjang"
+
+#. Inactive input fields, messages used with -tna option - kw
+#. #define FORM_LINK_TEXT_ADV_MSG_INA
+#: LYMessages.c:57
+#, c-format
+msgid "(Textfield \"%s\"); Inactive. Press <return> to activate."
+msgstr "(Ruas teks\"%s\"); Tidak aktif. Tekan <return> untuk mengaktifkan."
+
+#. #define FORM_LINK_TEXT_MESSAGE_INA
+#: LYMessages.c:59
+msgid "(Text entry field) Inactive. Press <return> to activate."
+msgstr "(Bagian masukan teks) Tidak aktif. Tekan <return> untuk mengaktifkan."
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG_INA
+#: LYMessages.c:61
+#, c-format
+msgid "(Textarea \"%s\"); Inactive. Press <return> to activate."
+msgstr "(Wilayah teks \"%s\"); Tidak aktif. Tekan <return> untuk mengaktifkan."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_INA
+#: LYMessages.c:63
+msgid "(Textarea) Inactive. Press <return> to activate."
+msgstr "(Daerah teks) Tidak aktif. Tekan <return> untuk mengaktifkan."
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG_INA_E
+#: LYMessages.c:65
+#, c-format
+msgid "(Textarea \"%s\"); Inactive. Press <return> to activate (%s for editor)."
+msgstr "(Daerah teks \"%s\"); Tidak aktif. Tekan <return> untuk mengaktifkan (%s untuk penyunting)."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_INA_E
+#: LYMessages.c:67
+#, c-format
+msgid "(Textarea) Inactive. Press <return> to activate (%s for editor)."
+msgstr "(Daerah teks) Tidak aktif. Tekan <return> untuk mengaktifkan (%s untuk penyunting)."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE_INA
+#: LYMessages.c:69
+msgid "(Form field) Inactive. Use <return> to edit."
+msgstr "(Ruas formulir) Tidak aktif. Gunakan <return> untuk menyunting."
+
+#. #define FORM_TEXT_SUBMIT_MESSAGE_INA_X
+#: LYMessages.c:71
+#, c-format
+msgid "(Form field) Inactive. Use <return> to edit (%s to submit with no cache)."
+msgstr "(Ruas formulir) Tidak aktif. Gunakan <return> untuk menyunting (%s untuk mengirim dengan tanpa cache)."
+
+#. #define FORM_TEXT_RESUBMIT_MESSAGE_INA
+#: LYMessages.c:73
+msgid "(Form field) Inactive. Press <return> to edit, press <return> twice to submit."
+msgstr "(Ruas formulir) Tidak aktif. Tekan <return> untuk menyunting, tekan <return> dua kali untuk mengirimkan."
+
+#. #define FORM_TEXT_SUBMIT_MAILTO_MSG_INA
+#: LYMessages.c:75
+msgid "(mailto form field) Inactive. Press <return> to change."
+msgstr "(ruas formulir mailto) Tidak aktif. Tekan <return> untuk mengubah."
+
+#. #define FORM_LINK_PASSWORD_MESSAGE_INA
+#: LYMessages.c:77
+msgid "(Password entry field) Inactive. Press <return> to activate."
+msgstr "(Ruas masukan kata sandi) Tidak aktif. Tekan <return> untuk mengaktifkan."
+
+#. #define FORM_LINK_FILE_UNM_MSG
+#: LYMessages.c:80
+msgid "UNMODIFIABLE file entry field. Use UP or DOWN arrows or tab to move off."
+msgstr "Bagian masukan berkas TAK-DAPAT-DIUBAH. Gunakan panah NAIK atau TURUN atau tab untuk meninggalkan."
+
+#. #define FORM_LINK_FILE_MESSAGE
+#: LYMessages.c:82
+msgid "(File entry field) Enter filename. Use UP or DOWN arrows or tab to move off."
+msgstr "(Ruas masukan berkas) Masukkan nama berkas. Gunakan panah NAIK atau TURUN atau tab untuk meninggalkan."
+
+#. #define FORM_LINK_TEXT_ADV_MSG
+#. #define FORM_LINK_TEXT_MESSAGE
+#: LYMessages.c:84 LYMessages.c:86
+#, c-format
+msgid "(Textfield \"%s\"); Enter text. Use UP or DOWN arrows or tab to move off."
+msgstr "(Ruas teks \"%s\"); Masukkan teks. Gunakan panah NAIK atau TURUN atau tab untuk berpindah."
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG
+#: LYMessages.c:88
+#, c-format
+msgid "(Textarea \"%s\"); Enter text. Use UP/DOWN arrows or TAB to move off."
+msgstr "(Daerah teks \"%s\"); Masukkan teks. Gunakan panah NAIK/TURUN atau TAB untuk berpindah."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE
+#: LYMessages.c:90
+msgid "(Textarea) Enter text. Use UP/DOWN arrows or TAB to move off."
+msgstr "(Daerah teks) Masukkan teks. Gunakan panah NAIK/TURUN atau TAB untuk berpindah."
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG_E
+#: LYMessages.c:92
+#, c-format
+msgid "(Textarea \"%s\"); Enter text. Use UP/DOWN arrows or TAB to move off (%s for editor)."
+msgstr "(Daerah teks \"%s\"); Masukkan teks. Gunakan panah NAIK/TURUN atau TAB untuk berpindah (%s untuk penyunting)."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_E
+#: LYMessages.c:94
+#, c-format
+msgid "(Textarea) Enter text. Use UP/DOWN arrows or TAB to move off (%s for editor)."
+msgstr "(Daerah teks) Masukkan teks. Gunakan panah NAIK/TURUN atau TAB untuk berpindah (%s untuk penyunting)."
+
+#. #define FORM_LINK_TEXT_UNM_MSG
+#: LYMessages.c:96
+msgid "UNMODIFIABLE form text field. Use UP or DOWN arrows or tab to move off."
+msgstr "Ruas formulir teks TAK-DAPAT-DIUBAH. Gunakan panah NAIK atau TURUN atau tab untuk berpindah."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE
+#: LYMessages.c:98
+msgid "(Form field) Enter text. Use <return> to submit."
+msgstr "(Ruas formulir) Masukkan teks. Gunakan <return> untuk mengirimkan."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE_X
+#: LYMessages.c:100
+#, c-format
+msgid "(Form field) Enter text. Use <return> to submit (%s for no cache)."
+msgstr "(Ruas formulir) Masukkan teks. Gunakan <return> untuk mengirimkan (%s untuk tanpa cache)."
+
+#. #define FORM_LINK_TEXT_RESUBMIT_MESSAGE
+#: LYMessages.c:102
+msgid "(Form field) Enter text. Use <return> to submit, arrows or tab to move off."
+msgstr "(Ruas formulir) Masukkan teks. Gunakan <return> untuk mengirimkan, panah atau tabs untuk berpindah."
+
+#. #define FORM_LINK_TEXT_SUBMIT_UNM_MSG
+#: LYMessages.c:104
+msgid "UNMODIFIABLE form field. Use UP or DOWN arrows or tab to move off."
+msgstr "Ruas formulir TAK-DAPAT-DIUBAH. Gunakan panah NAIK atau TURUN atau tab untuk berpindah."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MAILTO_MSG
+#: LYMessages.c:106
+msgid "(mailto form field) Enter text. Use <return> to submit, arrows to move off."
+msgstr "(ruas formulir mailto) Masukkan teks. Gunakan <return> untuk mengirimkan, panah untuk berpindah."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MAILTO_DIS_MSG
+#: LYMessages.c:108
+msgid "(mailto form field) Mail is disallowed so you cannot submit."
+msgstr "(ruas formulir mailto) Surat dilarang jadi Anda tidak dapat mengirimkan."
+
+#. #define FORM_LINK_PASSWORD_MESSAGE
+#: LYMessages.c:110
+msgid "(Password entry field) Enter text. Use UP or DOWN arrows or tab to move off."
+msgstr "(Ruas masukan kata sandi) Masukkan teks. Gunakan panah NAIK atau TURUN atau tab untuk berpindah."
+
+#. #define FORM_LINK_PASSWORD_UNM_MSG
+#: LYMessages.c:112
+msgid "UNMODIFIABLE form password. Use UP or DOWN arrows or tab to move off."
+msgstr "Kata sandi formulir TAK-DAPAT-DIUBAH. Gunakan panah NAIK atau TURUN atau tab untuk berpindah."
+
+#. #define FORM_LINK_CHECKBOX_ADV_MSG
+#: LYMessages.c:114
+#, c-format
+msgid "(Checkbox \"%s\"); Use right-arrow or <return> to toggle."
+msgstr "(Kotak centang \"%s\"); Gunakan panah-kanan atau <return> untuk menjungkit."
+
+#. #define FORM_LINK_CHECKBOX_MESSAGE
+#: LYMessages.c:116
+msgid "(Checkbox Field) Use right-arrow or <return> to toggle."
+msgstr "(Ruas Kotak Centang) Gunakan panah-kanan atau <return> untuk menjungkit."
+
+#. #define FORM_LINK_CHECKBOX_UNM_MSG
+#: LYMessages.c:118
+msgid "UNMODIFIABLE form checkbox. Use UP or DOWN arrows or tab to move off."
+msgstr "Kotak centang formulir TAK-DAPAT-DIUBAH. Gunakan panah NAIK atau TURUN atau tab untuk berpindah."
+
+#. #define FORM_LINK_RADIO_ADV_MSG
+#: LYMessages.c:120
+#, c-format
+msgid "(Radio Button \"%s\"); Use right-arrow or <return> to toggle."
+msgstr "(Tombol Radio \"%s\"); Gunakan panah-kanan atau <return> untuk menjungkit."
+
+#. #define FORM_LINK_RADIO_MESSAGE
+#: LYMessages.c:122
+msgid "(Radio Button) Use right-arrow or <return> to toggle."
+msgstr "(Tombol Radio) Gunakan panah-kanan atau <return> untuk menjungkit."
+
+#. #define FORM_LINK_RADIO_UNM_MSG
+#: LYMessages.c:124
+msgid "UNMODIFIABLE form radio button. Use UP or DOWN arrows or tab to move off."
+msgstr "Tombol radio formulir TAK-DAPAT-DIUBAH. Gunakan panah NAIK atau TURUN atau tab untuk berpindah."
+
+#. #define FORM_LINK_SUBMIT_PREFIX
+#: LYMessages.c:126
+msgid "Submit ('x' for no cache) to "
+msgstr "Kirim ('x' untuk tanpa cache) ke "
+
+#. #define FORM_LINK_RESUBMIT_PREFIX
+#: LYMessages.c:128
+msgid "Submit to "
+msgstr "Kirim ke "
+
+#. #define FORM_LINK_SUBMIT_MESSAGE
+#: LYMessages.c:130
+msgid "(Form submit button) Use right-arrow or <return> to submit ('x' for no cache)."
+msgstr "(Tombol kirim formulir) Gunakan panah-kanan atau <return> untuk mengirimkan ('x' untuk tanpa cache)."
+
+#. #define FORM_LINK_RESUBMIT_MESSAGE
+#: LYMessages.c:132
+msgid "(Form submit button) Use right-arrow or <return> to submit."
+msgstr "(Tombol kirim formulir) Gunakan panah-kanan atau <return> untuk mengirimkan."
+
+#. #define FORM_LINK_SUBMIT_DIS_MSG
+#: LYMessages.c:134
+msgid "DISABLED form submit button. Use UP or DOWN arrows or tab to move off."
+msgstr "Tombol kirim formulir TIDAK AKTIF. Gunakan panah NAIK atau TURUN atau tab untuk berpindah."
+
+#. #define FORM_LINK_SUBMIT_MAILTO_PREFIX
+#: LYMessages.c:136
+msgid "Submit mailto form to "
+msgstr "Kirim formulir mailto ke "
+
+#. #define FORM_LINK_SUBMIT_MAILTO_MSG
+#: LYMessages.c:138
+msgid "(mailto form submit button) Use right-arrow or <return> to submit."
+msgstr "(tombol kirim formulir mailto) Gunakan panah-kanan atau <return> untuk mengirimkan."
+
+#. #define FORM_LINK_SUBMIT_MAILTO_DIS_MSG
+#: LYMessages.c:140
+msgid "(mailto form submit button) Mail is disallowed so you cannot submit."
+msgstr "(tombol kirim formulir mailto) Surat dilarang jadi Anda tidak dapat mengirimkan."
+
+#. #define FORM_LINK_RESET_MESSAGE
+#: LYMessages.c:142
+msgid "(Form reset button) Use right-arrow or <return> to reset form to defaults."
+msgstr "(Tombol reset formulir) Gunakan panah-kanan atau <return> untuk mereset formulir ke baku."
+
+#. #define FORM_LINK_RESET_DIS_MSG
+#: LYMessages.c:144
+msgid "DISABLED form reset button. Use UP or DOWN arrows or tab to move off."
+msgstr "Tombol reset formulir TIDAK AKTIF. Gunakan panah NAIK atau TURUN atau tab untuk berpindah."
+
+#. #define FORM_LINK_BUTTON_MESSAGE
+#: LYMessages.c:146
+msgid "(Script button) Use UP or DOWN arrows or tab to move off."
+msgstr "(Tombol skrip) Gunakan panah NAIK atau TURUN atau tab untuk berpindah."
+
+#. #define FORM_LINK_BUTTON_ADV_MSG
+#: LYMessages.c:148
+#, c-format
+msgid "(Script button \"%s\"); Use UP or DOWN arrows or tab to move off."
+msgstr "(Tombol skrip \"%s\"); Gunakan panah NAIK atau TURUN atau tab untuk berpindah."
+
+#. #define FORM_LINK_BUTTON_DIS_MSG
+#: LYMessages.c:150
+msgid "DISABLED Script button. Use UP or DOWN arrows or tab to move off."
+msgstr "Tombol skrip TIDAK AKTIF. Gunakan panah NAIK atau TURUN atau tab untuk berpindah."
+
+#. #define FORM_LINK_OPTION_LIST_ADV_MSG
+#: LYMessages.c:152
+#, c-format
+msgid "(Option list \"%s\"); Hit return to select option."
+msgstr "(Daftar opsi \"%s\"); Tekan return untuk memilih opsi."
+
+#. #define FORM_LINK_OPTION_LIST_MESSAGE
+#: LYMessages.c:154
+msgid "(Option list) Hit return and use arrow keys and return to select option."
+msgstr "(Daftar opsi) Tekan return dan gunakan tombol panah dan return untuk memilih opsi."
+
+#. #define CHOICE_LIST_ADV_MSG
+#: LYMessages.c:156
+#, c-format
+msgid "(Choice entry \"%s\"); Use arrow keys and return to select option."
+msgstr "(Entri pilihan \"%s\"); Gunakan tombol panah dan return untuk memilih opsi."
+
+#. #define CHOICE_LIST_MESSAGE
+#: LYMessages.c:158
+msgid "(Choice list) Hit return and use arrow keys and return to select option."
+msgstr "(Daftar pilihan) Tekan return dan gunakan tombol panah dan return untuk memilih opsi."
+
+#. #define MOUSE_CHOICE_MESSAGE
+#: LYMessages.c:160
+msgid "Left mouse button or return to select, arrow keys to scroll."
+msgstr "Tombol kiri tetikus atau return untuk memilih, tombol panah untuk menggulir."
+
+#. #define FORM_LINK_OPTION_LIST_UNM_MSG
+#: LYMessages.c:162
+msgid "UNMODIFIABLE option list. Use return or arrow keys to review or leave."
+msgstr "Daftar opsi TAK-DAPAT-DIUBAH. Gunakan return atau tombol panah untuk memeriksa atau meninggalkan."
+
+#. #define CHOICE_LIST_UNM_MSG
+#: LYMessages.c:164
+msgid "UNMODIFIABLE choice list. Use return or arrow keys to review or leave."
+msgstr "Daftar pilihan TAK-DAPAT-DIUBAH. Gunakan return atau tombol panah untuk memeriksa atau meninggalkan."
+
+#: LYMessages.c:165
+msgid "Submitting form..."
+msgstr "Mengirimkan formulir..."
+
+#: LYMessages.c:166
+msgid "Resetting form..."
+msgstr "Mereset formulir..."
+
+#. #define RELOADING_FORM
+#: LYMessages.c:168
+msgid "Reloading document. Any form entries will be lost!"
+msgstr "Memuat kembali dokumen. Masukan formulir apa pun akan hilang!"
+
+#. #define LINK_NOT_IN_FORM
+#: LYMessages.c:170
+msgid "The current link is not in a FORM"
+msgstr "Tautan saat ini bukan dalam suatu FORMULIR"
+
+#: LYMessages.c:171
+#, c-format
+msgid "Warning: Cannot transcode form data to charset %s!"
+msgstr "Peringatan: Tidak dapat transcode formulir data ke set karakter %s!"
+
+#. #define NORMAL_LINK_MESSAGE
+#: LYMessages.c:174
+msgid "(NORMAL LINK) Use right-arrow or <return> to activate."
+msgstr "(TAUTAN NORMAL) Gunakan panah-kanan atau <return> untuk mengaktifkan."
+
+#: LYMessages.c:175
+msgid "The resource requested is not available at this time."
+msgstr "Sumber daya yang diminta tidak tersedia saat ini."
+
+#: LYMessages.c:176
+msgid "Enter Lynx keystroke command: "
+msgstr "Masukan perintah tombol singkat Lynx: "
+
+#: LYMessages.c:177
+msgid "Looking up "
+msgstr "Mencari "
+
+#: LYMessages.c:178
+#, c-format
+msgid "Getting %s"
+msgstr "Mendapatkan %s"
+
+#: LYMessages.c:179
+#, c-format
+msgid "Skipping %s"
+msgstr "Melewatkan %s"
+
+#: LYMessages.c:180
+#, c-format
+msgid "Using %s"
+msgstr "Menggunakan %s"
+
+#: LYMessages.c:181
+#, c-format
+msgid "Illegal URL: %s"
+msgstr "URL tidak legal: %s"
+
+#: LYMessages.c:182
+#, c-format
+msgid "Badly formed address %s"
+msgstr "Alamat %s terbentuk buruk"
+
+#: LYMessages.c:183
+#, c-format
+msgid "URL: %s"
+msgstr "URL: %s"
+
+#: LYMessages.c:184
+msgid "Unable to access WWW file!!!"
+msgstr "Tidak dapat mengakses berkas WWW!!!"
+
+#: LYMessages.c:185
+#, c-format
+msgid "This is a searchable index. Use %s to search."
+msgstr "Ini adalah sebuah indeks yang dapat dicari. Gunakan %s untuk mencari."
+
+#. #define WWW_INDEX_MORE_MESSAGE
+#: LYMessages.c:187
+#, c-format
+msgid "--More-- This is a searchable index. Use %s to search."
+msgstr "--Lebih-- Ini adalah sebuah indeks yang dapat dicari. Gunakan %s untuk mencari."
+
+#: LYMessages.c:188
+msgid "You have entered an invalid link number."
+msgstr "Anda telah memasukkan sebuah nomor tautan yang tidak valid."
+
+#. #define SOURCE_HELP
+#: LYMessages.c:190
+msgid "Currently viewing document source. Press '\\' to return to rendered version."
+msgstr "Saat ini melihat sumber dokumen. Tekan '\\' untuk kembali ke versi biasa."
+
+#. #define NOVICE_LINE_ONE
+#: LYMessages.c:192
+msgid " Arrow keys: Up and Down to move. Right to follow a link; Left to go back. \n"
+msgstr " Tombol panah: Naik dan Turun untuk bergerak. Kanan untuk mengikuti sebuah tautan. Kiri untuk kembali. \n"
+
+#. #define NOVICE_LINE_TWO
+#: LYMessages.c:194
+msgid " H)elp O)ptions P)rint G)o M)ain screen Q)uit /=search [delete]=history list \n"
+msgstr " H)elp O)ptions P)rint G)o M)ain screen Q)uit /=cari [delete]=daftar sejarah \n"
+
+#. #define NOVICE_LINE_TWO_A
+#: LYMessages.c:196
+msgid " O)ther cmds H)elp K)eymap G)oto P)rint M)ain screen o)ptions Q)uit \n"
+msgstr " O)ther cmds H)elp K)eymap G)oto P)rint M)ain screen o)ptions Q)uit \n"
+
+#. #define NOVICE_LINE_TWO_B
+#: LYMessages.c:198
+msgid " O)ther cmds B)ack E)dit D)ownload ^R)eload ^W)ipe screen search doc: / \n"
+msgstr " O)ther cmds B)ack E)dit D)ownload ^R)eload ^W)ipe screen cari dok: / \n"
+
+#. #define NOVICE_LINE_TWO_C
+#: LYMessages.c:200
+msgid "O)ther cmds C)omment History: <backspace> Bookmarks: V)iew, A)dd, R)emove \n"
+msgstr "O)ther cmds C)omment Sejarah: <backspace> Bookmarks: V)iew, A)dd, R)emove\n"
+
+#. #define FORM_NOVICELINE_ONE
+#: LYMessages.c:202
+msgid " Enter text into the field by typing on the keyboard "
+msgstr " Masukan teks ke dalam ruas dengan mengetikkannya di papan ketik "
+
+#. #define FORM_NOVICELINE_TWO
+#: LYMessages.c:204
+msgid " Ctrl-U to delete all text in field, [Backspace] to delete a character "
+msgstr " Ctrl-U hapus semua teks dalam ruas, [Backspace] hapus satu karakter "
+
+#. #define FORM_NOVICELINE_TWO_DELBL
+#: LYMessages.c:206
+msgid " Ctrl-U to delete text in field, [Backspace] to delete a character "
+msgstr " Ctrl-U hapus teks dalam ruas, [Backspace] hapus satu karakter "
+
+#. #define FORM_NOVICELINE_TWO_VAR
+#: LYMessages.c:208
+#, c-format
+msgid " %s to delete all text in field, [Backspace] to delete a character "
+msgstr " %s untuk menghapus seluruh teks dalam ruas, [Backspace] untuk menghapus sebuah karakter "
+
+#. #define FORM_NOVICELINE_TWO_DELBL_VAR
+#: LYMessages.c:210
+#, c-format
+msgid " %s to delete text in field, [Backspace] to delete a character "
+msgstr " %s untuk menghapus teks dalam ruas, [Backspace] untuk menghapus sebuah karakter "
+
+#. mailto
+#: LYMessages.c:213
+msgid "Malformed mailto form submission! Cancelled!"
+msgstr "Pengiriman formulir mailto salah bentuk! Dibatalkan!"
+
+#: LYMessages.c:214
+msgid "Warning! Control codes in mail address replaced by ?"
+msgstr "Peringatan! Kode kontrol dalam alamat surat digantikan oleh ?"
+
+#: LYMessages.c:215
+msgid "Mail disallowed! Cannot submit."
+msgstr "Surat dilarang! Tidak dapat mengirimkan."
+
+#: LYMessages.c:216
+msgid "Mailto form submission failed!"
+msgstr "Pengiriman formulir mailto gagal!"
+
+#: LYMessages.c:217
+msgid "Mailto form submission Cancelled!!!"
+msgstr "Pengiriman formulir mailto Dibatalkan!!!"
+
+#: LYMessages.c:218
+msgid "Sending form content..."
+msgstr "Mengirimkan isi formulir..."
+
+#: LYMessages.c:219
+msgid "No email address is present in mailto URL!"
+msgstr "Tidak ada alamat surel yang ada dalam URL mailto!"
+
+#. #define MAILTO_URL_TEMPOPEN_FAILED
+#: LYMessages.c:221
+msgid "Unable to open temporary file for mailto URL!"
+msgstr "Tidak dapat membuka berkas sementara untuk URL mailto!"
+
+#. #define INC_ORIG_MSG_PROMPT
+#: LYMessages.c:223
+msgid "Do you wish to include the original message?"
+msgstr "Anda ingin menyertakan pesan asli?"
+
+#. #define INC_PREPARSED_MSG_PROMPT
+#: LYMessages.c:225
+msgid "Do you wish to include the preparsed source?"
+msgstr "Anda ingin menyertakan sumber yang sudah diurai?"
+
+#. #define SPAWNING_EDITOR_FOR_MAIL
+#: LYMessages.c:227
+msgid "Spawning your selected editor to edit mail message"
+msgstr "Men-spawn penyunting yang Anda pilih untuk menyunting pesan surat"
+
+#. #define ERROR_SPAWNING_EDITOR
+#: LYMessages.c:229
+msgid "Error spawning editor, check your editor definition in the options menu"
+msgstr "Galat saat spawn penyunting, periksa definisi penyunting Anda dalam menu opsi"
+
+#: LYMessages.c:230
+msgid "Send this comment?"
+msgstr "Kirim komentar ini?"
+
+#: LYMessages.c:231
+msgid "Send this message?"
+msgstr "Kirim pesan ini?"
+
+#: LYMessages.c:232
+msgid "Sending your message..."
+msgstr "Mengirim pesan Anda..."
+
+#: LYMessages.c:233
+msgid "Sending your comment:"
+msgstr "Mengirim komentar Anda:"
+
+#. textarea
+#: LYMessages.c:236
+msgid "Not in a TEXTAREA; cannot use external editor."
+msgstr "Tidak dalam sebuah TEXTAREA; tidak dapat menggunakan pengubah eksternal."
+
+#: LYMessages.c:237
+msgid "Not in a TEXTAREA; cannot use command."
+msgstr "Tidak dalam sebuah TEKSAREA. tidak dapat menggunakan perintah."
+
+#: LYMessages.c:239
+msgid "file: ACTIONs are disallowed!"
+msgstr "berkas: AKSI dilarang!"
+
+#. #define FILE_SERVED_LINKS_DISALLOWED
+#: LYMessages.c:241
+msgid "file: URLs via served links are disallowed!"
+msgstr "berkas: URL melalui sambungan yang dilayani dilarang!"
+
+#: LYMessages.c:242
+msgid "Access to local files denied."
+msgstr "Akses ke berkas lokal ditolak."
+
+#: LYMessages.c:243
+msgid "file: URLs via bookmarks are disallowed!"
+msgstr "berkas: URL melalui bookmarks dilarang!"
+
+#. #define SPECIAL_VIA_EXTERNAL_DISALLOWED
+#: LYMessages.c:245
+msgid "This special URL is not allowed in external documents!"
+msgstr "URL spesial ini dilarang dalam dokumen eksternal!"
+
+#: LYMessages.c:246
+msgid "Press <return> to return to Lynx."
+msgstr "Tekan <return> untuk kembali ke Lynx."
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:249
+msgid "Spawning DCL subprocess. Use 'logout' to return to Lynx.\n"
+msgstr "Spawning subproses DCL. Gunakan 'logout' untuk kembali ke Lynx.\n"
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:253
+msgid "Type EXIT to return to Lynx.\n"
+msgstr "Ketik EXIT untuk kembali ke Lynx.\n"
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:256
+msgid "Spawning your default shell. Use 'exit' to return to Lynx.\n"
+msgstr "Spawning ke shell baku. Gunakan 'exit' untuk kembali ke Lynx.\n"
+
+#: LYMessages.c:259
+msgid "Spawning is currently disabled."
+msgstr "Spawning saat ini tidak aktif."
+
+#: LYMessages.c:260
+msgid "The 'd'ownload command is currently disabled."
+msgstr "Perintah 'd'ownload saat ini tidak aktif."
+
+#: LYMessages.c:261
+msgid "You cannot download an input field."
+msgstr "Anda tidak dapat mengubah sebuah daerah masukan."
+
+#: LYMessages.c:262
+msgid "Form has a mailto action! Cannot download."
+msgstr "Formulir memiliki sebuah aksi mailto! Tidak dapat mengunduh."
+
+#: LYMessages.c:263
+msgid "You cannot download a mailto: link."
+msgstr "Anda tidak dapat mengunduh sebuah sambungan mailto:."
+
+#: LYMessages.c:264
+msgid "You cannot download cookies."
+msgstr "Anda tidak dapat mengunduh cookies."
+
+#: LYMessages.c:265
+msgid "You cannot download a printing option."
+msgstr "Anda tidak dapat mengunduh sebuah opsi pencetakan."
+
+#: LYMessages.c:266
+msgid "You cannot download an upload option."
+msgstr "Anda tidak dapat mengunduh sebuah opsi upload."
+
+#: LYMessages.c:267
+msgid "You cannot download an permit option."
+msgstr "Anda tidak dapat mengunduh sebuah opsi ijin."
+
+#: LYMessages.c:268
+msgid "This special URL cannot be downloaded!"
+msgstr "URL spesial ini tidak dapat diunduh!"
+
+#: LYMessages.c:269
+msgid "Nothing to download."
+msgstr "Tidak ada yang akan diunduh."
+
+#: LYMessages.c:270
+msgid "Trace ON!"
+msgstr "Jejak AKTIF!"
+
+#: LYMessages.c:271
+msgid "Trace OFF!"
+msgstr "Jejak TIDAK AKTIF!"
+
+#. #define CLICKABLE_IMAGES_ON
+#: LYMessages.c:273
+msgid "Links will be included for all images! Reloading..."
+msgstr "Sambungan tidak akan dimasukan untuk seluruh gambar! Memuat kembali..."
+
+#. #define CLICKABLE_IMAGES_OFF
+#: LYMessages.c:275
+msgid "Standard image handling restored! Reloading..."
+msgstr "Penanganan gambar baku dikembalikan! Memuat kembali..."
+
+#. #define PSEUDO_INLINE_ALTS_ON
+#: LYMessages.c:277
+msgid "Pseudo_ALTs will be inserted for inlines without ALT strings! Reloading..."
+msgstr "Pseudo_ALTs akan dimasukan untuk inlines tanpa string ALT! Memuat kembali..."
+
+#. #define PSEUDO_INLINE_ALTS_OFF
+#: LYMessages.c:279
+msgid "Inlines without an ALT string specified will be ignored! Reloading..."
+msgstr "Inlines tanpa sebuah string ALT dispesifikan akan diabaikan! Memuat kembali..."
+
+#: LYMessages.c:280
+msgid "Raw 8-bit or CJK mode toggled OFF! Reloading..."
+msgstr "Mentah 8-bit atau mode CJK diubah TIDAK AKTIF! Memuat kembali..."
+
+#: LYMessages.c:281
+msgid "Raw 8-bit or CJK mode toggled ON! Reloading..."
+msgstr "Mentah 8-bit atau mode CJK diubah AKTIF! Memuat kembali..."
+
+#. #define HEAD_D_L_OR_CANCEL
+#: LYMessages.c:283
+msgid "Send HEAD request for D)ocument or L)ink, or C)ancel? (d,l,c): "
+msgstr "Kirim permintaan HEAD untuk D)okumen atau L)ink, atau C)ancel? (d,l,c): "
+
+#. #define HEAD_D_OR_CANCEL
+#: LYMessages.c:285
+msgid "Send HEAD request for D)ocument, or C)ancel? (d,c): "
+msgstr "Kirim permintaan HEAD untuk D)okumen, atau C)ancel? (d,c): "
+
+#: LYMessages.c:286
+msgid "Sorry, the document is not an http URL."
+msgstr "Maaf, dokumen bukan sebuah URL http."
+
+#: LYMessages.c:287
+msgid "Sorry, the link is not an http URL."
+msgstr "Maaf, sambungan bukan sebuah URL http."
+
+#: LYMessages.c:288
+msgid "Sorry, the ACTION for this form is disabled."
+msgstr "Maaf, AKSI untuk formulir ini tidak aktif."
+
+#. #define FORM_ACTION_NOT_HTTP_URL
+#: LYMessages.c:290
+msgid "Sorry, the ACTION for this form is not an http URL."
+msgstr "Maaf, AKSI untuk formulir ini bukan sebuah URL http."
+
+#: LYMessages.c:291
+msgid "Not an http URL or form ACTION!"
+msgstr "Bukan sebuah URL http atau formulir AKSI!"
+
+#: LYMessages.c:292
+msgid "This special URL cannot be a form ACTION!"
+msgstr "URL spesial ini tidak dapat berupa sebuah formulir AKSI!"
+
+#: LYMessages.c:293
+msgid "URL is not in starting realm!"
+msgstr "URL tidak dalam realm starting!"
+
+#: LYMessages.c:294
+msgid "News posting is disabled!"
+msgstr "Pengiriman berita tidak aktif!"
+
+#: LYMessages.c:295
+msgid "File management support is disabled!"
+msgstr "Dukungan manajemen berkas tidak aktif!"
+
+#: LYMessages.c:296
+msgid "No jump file is currently available."
+msgstr "Tidak ada berkas lompat yang saat ini tersedia."
+
+#: LYMessages.c:297
+msgid "Jump to (use '?' for list): "
+msgstr "Lompat ke (gunakan '?' untuk daftar): "
+
+#: LYMessages.c:298
+msgid "Jumping to a shortcut URL is disallowed!"
+msgstr "Melompat ke sebuah shortcut URL dilarang!"
+
+#: LYMessages.c:299
+msgid "Random URL is disallowed! Use a shortcut."
+msgstr "URL random dilarang! Gunakan sebuah shortcut."
+
+#: LYMessages.c:300
+msgid "No random URLs have been used thus far."
+msgstr "Tidak ada URL random yang telah digunakan sampai saat ini."
+
+#: LYMessages.c:301
+msgid "Bookmark features are currently disabled."
+msgstr "Features bookmark saat ini tidak aktif."
+
+#: LYMessages.c:302
+msgid "Execution via bookmarks is disabled."
+msgstr "Eksekusi melalui bookmarks tidak aktif."
+
+#. #define BOOKMARK_FILE_NOT_DEFINED
+#: LYMessages.c:304
+#, c-format
+msgid "Bookmark file is not defined. Use %s to see options."
+msgstr "Berkas bookmark tidak didefinisikan. Gunakan %s untuk melihat opsi."
+
+#. #define NO_TEMP_FOR_HOTLIST
+#: LYMessages.c:306
+msgid "Unable to open tempfile for X Mosaic hotlist conversion."
+msgstr "Tidak dapat membuka berkas sementara untuk konversi hotlist X Mosaic."
+
+#: LYMessages.c:307
+msgid "ERROR - unable to open bookmark file."
+msgstr "ERROR - tidak dapat membuka berkas bookmark."
+
+#. #define BOOKMARK_OPEN_FAILED_FOR_DEL
+#: LYMessages.c:309
+msgid "Unable to open bookmark file for deletion of link."
+msgstr "Tidak dapat membuka berkas bookmark untuk penghapusan sebuah link."
+
+#. #define BOOKSCRA_OPEN_FAILED_FOR_DEL
+#: LYMessages.c:311
+msgid "Unable to open scratch file for deletion of link."
+msgstr "Tidak dapat membuka berkas scratch untuk penghapusan sebuah sambungan."
+
+#: LYMessages.c:313
+msgid "Error renaming scratch file."
+msgstr "Error mengubah nama berkas scratch."
+
+#: LYMessages.c:315
+msgid "Error renaming temporary file."
+msgstr "Error mengubah nama berkas sementara."
+
+#. #define BOOKTEMP_COPY_FAIL
+#: LYMessages.c:317
+msgid "Unable to copy temporary file for deletion of link."
+msgstr "Tidak dapat menyalin berkas sementara untuk penghapusan dari sambungan."
+
+#. #define BOOKTEMP_REOPEN_FAIL_FOR_DEL
+#: LYMessages.c:319
+msgid "Unable to reopen temporary file for deletion of link."
+msgstr "Tidak dapat membuka kembali berkas sementara untuk penghapusan dari link."
+
+#. #define BOOKMARK_LINK_NOT_ONE_LINE
+#: LYMessages.c:322
+msgid "Link is not by itself all on one line in bookmark file."
+msgstr "Sambungan bukan dengan dirinya sendiri seluruh di satu baris di berkas bookmark."
+
+#: LYMessages.c:323
+msgid "Bookmark deletion failed."
+msgstr "Penghapusan bookmark gagal."
+
+#. #define BOOKMARKS_NOT_TRAVERSED
+#: LYMessages.c:325
+msgid "Bookmark files cannot be traversed (only http URLs)."
+msgstr "Berkas bookmark tidak dapat di traversed (hanya URL http)."
+
+#. #define BOOKMARKS_NOT_OPEN
+#: LYMessages.c:327
+msgid "Unable to open bookmark file, use 'a' to save a link first"
+msgstr "Tidak dapat membuka berkas bookmark, gunakan 'a' untuk menyimpan sebuah link pertama"
+
+#: LYMessages.c:328
+msgid "There are no links in this bookmark file!"
+msgstr "Tidak ada link di berkas bookmark ini!"
+
+#. #define CACHE_D_OR_CANCEL
+#: LYMessages.c:330
+msgid "D)elete cached document or C)ancel? (d,c): "
+msgstr "D)elete cached dokumen atau C)ancel? (d,c): "
+
+#. #define BOOK_D_L_OR_CANCEL
+#: LYMessages.c:332
+msgid "Save D)ocument or L)ink to bookmark file or C)ancel? (d,l,c): "
+msgstr "Simpan D)okumen atau L)ink untuk berkas bookmark atau C)ancel? (d,l,c): "
+
+#: LYMessages.c:333
+msgid "Save D)ocument to bookmark file or C)ancel? (d,c): "
+msgstr "Simpan D)okumen ke berkas bookmark atau C)ancel? (d,c): "
+
+#: LYMessages.c:334
+msgid "Save L)ink to bookmark file or C)ancel? (l,c): "
+msgstr "Simpan L)ink ke berkas bookmark atau C)ancel? (l,c): "
+
+#. #define NOBOOK_POST_FORM
+#: LYMessages.c:336
+msgid "Documents from forms with POST content cannot be saved as bookmarks."
+msgstr "Dokumen dari formulir dengan isi POST tidak dapat disimpan sebagai bookmarks."
+
+#: LYMessages.c:337
+msgid "Cannot save form fields/links"
+msgstr "Tidak dapat menyimpan sambungan/daerah formulir"
+
+#. #define NOBOOK_HSML
+#: LYMessages.c:339
+msgid "History, showinfo, menu and list files cannot be saved as bookmarks."
+msgstr "Sejarah, showinfo, menu dan daftar berkas tidak dapat disimpan sebagai bookmarks."
+
+#. #define CONFIRM_BOOKMARK_DELETE
+#: LYMessages.c:341
+msgid "Do you really want to delete this link from your bookmark file?"
+msgstr "Apakah Anda benar benar ingin menghapus sambungan ini dari berkas bookmark Anda?"
+
+#: LYMessages.c:342
+msgid "Malformed address."
+msgstr "Alamat salah bentuk."
+
+#. #define HISTORICAL_ON_MINIMAL_OFF
+#: LYMessages.c:344
+msgid "Historical comment parsing ON (Minimal is overridden)!"
+msgstr "Komentar sejarah parsing AKTIF (Minimal adalah overridden)!"
+
+#. #define HISTORICAL_OFF_MINIMAL_ON
+#: LYMessages.c:346
+msgid "Historical comment parsing OFF (Minimal is in effect)!"
+msgstr "Komentar historical parsing OFF (Minimal adalah dalam efek)!"
+
+#. #define HISTORICAL_ON_VALID_OFF
+#: LYMessages.c:348
+msgid "Historical comment parsing ON (Valid is overridden)!"
+msgstr "Komentar historical parsing AKTIF (Valid overridden)!"
+
+#. #define HISTORICAL_OFF_VALID_ON
+#: LYMessages.c:350
+msgid "Historical comment parsing OFF (Valid is in effect)!"
+msgstr "Historical komentar parsing TIDAK AKTIF (Valid berada dalam efek)!"
+
+#. #define MINIMAL_ON_IN_EFFECT
+#: LYMessages.c:352
+msgid "Minimal comment parsing ON (and in effect)!"
+msgstr "Komentar minimal parsing AKTIF (dan dalam efek)!"
+
+#. #define MINIMAL_OFF_VALID_ON
+#: LYMessages.c:354
+msgid "Minimal comment parsing OFF (Valid is in effect)!"
+msgstr "Komentar minimal parsing TIDAK AKTIF (Valid adalah dalam efek)!"
+
+#. #define MINIMAL_ON_BUT_HISTORICAL
+#: LYMessages.c:356
+msgid "Minimal comment parsing ON (but Historical is in effect)!"
+msgstr "Komentar minimal parsing AKTIF (tetapi Historical berada dalam efek)!"
+
+#. #define MINIMAL_OFF_HISTORICAL_ON
+#: LYMessages.c:358
+msgid "Minimal comment parsing OFF (Historical is in effect)!"
+msgstr "Komentar minimal parsing TIDAK AKTIF (Historical berada dalam efek)!"
+
+#: LYMessages.c:359
+msgid "Soft double-quote parsing ON!"
+msgstr "Soft double-quote parsing AKTIF!"
+
+#: LYMessages.c:360
+msgid "Soft double-quote parsing OFF!"
+msgstr "Soft double-quote parsing TIDAK AKTIF!"
+
+#: LYMessages.c:361
+msgid "Now using TagSoup parsing of HTML."
+msgstr "Sekarang menggunakan TagSoup parsing dari HTML."
+
+#: LYMessages.c:362
+msgid "Now using SortaSGML parsing of HTML!"
+msgstr "Sekarang menggunakan SortaSGML parsing dari HTML!"
+
+#: LYMessages.c:363
+msgid "You are already at the end of this document."
+msgstr "Anda telah berada di akhir dari dokumen ini."
+
+#: LYMessages.c:364
+msgid "You are already at the beginning of this document."
+msgstr "Anda telah berada diawal dari dokumen ini."
+
+#: LYMessages.c:365
+#, c-format
+msgid "You are already at page %d of this document."
+msgstr "Anda telah berada di halaman %d dari dokumen ini."
+
+#: LYMessages.c:366
+#, c-format
+msgid "Link number %d already is current."
+msgstr "Sambungan nomor %d telah baru."
+
+#: LYMessages.c:367
+msgid "You are already at the first document"
+msgstr "Anda telah berada di awal dokumen"
+
+#: LYMessages.c:368
+msgid "There are no links above this line of the document."
+msgstr "Tidak ada sambungan diatas baris ini dari dokumen."
+
+#: LYMessages.c:369
+msgid "There are no links below this line of the document."
+msgstr "Tidak ada sambungan dibawah baris ini dari dokumen."
+
+#. #define MAXLEN_REACHED_DEL_OR_MOV
+#: LYMessages.c:371
+msgid "Maximum length reached! Delete text or move off field."
+msgstr "Panjang maksimal dicapai! Hapus teks atau berpindah field."
+
+#. #define NOT_ON_SUBMIT_OR_LINK
+#: LYMessages.c:373
+msgid "You are not on a form submission button or normal link."
+msgstr "Anda tidak berada di tombol pengiriman formulir atau sambungan normal."
+
+#. #define NEED_CHECKED_RADIO_BUTTON
+#: LYMessages.c:375
+msgid "One radio button must be checked at all times!"
+msgstr "Satu tombol radio harus dicentang di setiap saat!"
+
+#: LYMessages.c:376
+msgid "No submit button for this form, submit single text field?"
+msgstr "Tidak ada tombol kirim untuk formulir ini, kirim sebuah field teks tunggal?"
+
+#: LYMessages.c:377
+msgid "Do you want to go back to the previous document?"
+msgstr "Apakah Anda ingin kembali ke dokumen sebelumnya?"
+
+#: LYMessages.c:378
+msgid "Use arrows or tab to move off of field."
+msgstr "Gunakan panah atau tab untuk berpindah dari field."
+
+#. #define ENTER_TEXT_ARROWS_OR_TAB
+#: LYMessages.c:380
+msgid "Enter text. Use arrows or tab to move off of field."
+msgstr "Masukan teks. Gunakan panah atau tab untuk berpindah dari field."
+
+#: LYMessages.c:381
+msgid "** Bad HTML!! No form action defined. **"
+msgstr "** HTML buruk!! Tidak ada formulir aksi yang didefinisikan.**"
+
+#: LYMessages.c:382
+msgid "Bad HTML!! Unable to create popup window!"
+msgstr "HTML buruk!! Tidak dapat membuat jendela popup!"
+
+#: LYMessages.c:383
+msgid "Unable to create popup window!"
+msgstr "Tidak dapat membuat jendela popup!"
+
+#: LYMessages.c:384
+msgid "Goto a random URL is disallowed!"
+msgstr "Pergi ke URL random tidak diijinkan!"
+
+#: LYMessages.c:385
+msgid "Goto a non-http URL is disallowed!"
+msgstr "Pergi ke sebuah URL bukan http tidak diijinkan!"
+
+#: LYMessages.c:386
+#, c-format
+msgid "You are not allowed to goto \"%s\" URLs"
+msgstr "Anda tidak diijinkan untuk pergi ke URL \"%s\""
+
+#: LYMessages.c:387
+msgid "URL to open: "
+msgstr "URL untuk dibuka: "
+
+#: LYMessages.c:388
+msgid "Edit the current Goto URL: "
+msgstr "Ubah URL Goto sekarang: "
+
+#: LYMessages.c:389
+msgid "Edit the previous Goto URL: "
+msgstr "Ubah URL Goto sebelumnya: "
+
+#: LYMessages.c:390
+msgid "Edit a previous Goto URL: "
+msgstr "Ubah sebuah URL Goto sebelumnya: "
+
+#: LYMessages.c:391
+msgid "Current document has POST data."
+msgstr "Dokumen sekarang memiliki data POST."
+
+#: LYMessages.c:392
+msgid "Edit this document's URL: "
+msgstr "Ubah URL dokumen ini: "
+
+#: LYMessages.c:393
+msgid "Edit the current link's URL: "
+msgstr "Ubah sambungan URL sekarang: "
+
+#: LYMessages.c:394
+msgid "Edit the form's submit-URL: "
+msgstr "Ubah URL dokumen ini: "
+
+#: LYMessages.c:395
+msgid "You cannot edit File Management URLs"
+msgstr "Anda tidak dapat mengubah URL Manajemen Berkas"
+
+#: LYMessages.c:396
+msgid "Enter a database query: "
+msgstr "Masukan sebuah permintaan basis data: "
+
+#: LYMessages.c:397
+msgid "Enter a whereis query: "
+msgstr "Masukan sebuah permintaan whereis: "
+
+#: LYMessages.c:398
+msgid "Edit the current query: "
+msgstr "Ubah permintaan sekarang: "
+
+#: LYMessages.c:399
+msgid "Edit the previous query: "
+msgstr "Ubah permintaan sebelumnya: "
+
+#: LYMessages.c:400
+msgid "Edit a previous query: "
+msgstr "Ubah permintaan sebelumnya: "
+
+#. #define USE_C_R_TO_RESUB_CUR_QUERY
+#: LYMessages.c:402
+msgid "Use Control-R to resubmit the current query."
+msgstr "Gunakan Ctrl-R untuk mengirim kembali permintaan sekarang."
+
+#: LYMessages.c:403
+msgid "Edit the current shortcut: "
+msgstr "Ubah tombol singkat sekarang: "
+
+#: LYMessages.c:404
+msgid "Edit the previous shortcut: "
+msgstr "Ubah tombol singkat sebelumnya: "
+
+#: LYMessages.c:405
+msgid "Edit a previous shortcut: "
+msgstr "Ubah sebuah tombol singkat sebelumnya: "
+
+#: LYMessages.c:406
+#, c-format
+msgid "Key '%c' is not mapped to a jump file!"
+msgstr "Tombol '%c' tidak dipetakan ke sebuah berkas lompat!"
+
+#: LYMessages.c:407
+msgid "Cannot locate jump file!"
+msgstr "Tidak dapat menemukan berkas lompat!"
+
+#: LYMessages.c:408
+msgid "Cannot open jump file!"
+msgstr "Tidak dapat membuka berkas lompat!"
+
+#: LYMessages.c:409
+msgid "Error reading jump file!"
+msgstr "Error membaca berkas lompat!"
+
+#: LYMessages.c:410
+msgid "Out of memory reading jump file!"
+msgstr "Kehabisan memori membaca berkas lompat!"
+
+#: LYMessages.c:411
+msgid "Out of memory reading jump table!"
+msgstr "Kehabisan memori membaca tabel lompat!"
+
+#: LYMessages.c:412
+msgid "No index is currently available."
+msgstr "Tidak ada indeks yang saat ini tersedia."
+
+#. #define CONFIRM_MAIN_SCREEN
+#: LYMessages.c:414
+msgid "Do you really want to go to the Main screen?"
+msgstr "Apakah Anda benar benar ingin pergi ke layar Utama?"
+
+#: LYMessages.c:415
+msgid "You are already at main screen!"
+msgstr "Anda telah berada dilayar utama!"
+
+#. #define NOT_ISINDEX
+#: LYMessages.c:417
+msgid "Not a searchable indexed document -- press '/' to search for a text string"
+msgstr "Bukan sebuah dokumen terindeks yang dapat dicari -- tekan '/' untuk mencari untuk sebuah string teks"
+
+#. #define NO_OWNER
+#: LYMessages.c:419
+msgid "No owner is defined for this file so you cannot send a comment"
+msgstr "Tidak ada pemilik didefinisikan untuk berkas ini jadi Anda tidak dapat mengirim sebuah komentar"
+
+#: LYMessages.c:420
+#, c-format
+msgid "No owner is defined. Use %s?"
+msgstr "Tidak ada pemilik yang didefinisikan. Gunakan %s?"
+
+#: LYMessages.c:421
+msgid "Do you wish to send a comment?"
+msgstr "Apakah Anda ingin mengirim sebuah komentar?"
+
+#: LYMessages.c:422
+msgid "Mail is disallowed so you cannot send a comment"
+msgstr "Surat tidak diijinkan jadi Anda tidak dapat mengirim sebuah komentar"
+
+#: LYMessages.c:423
+msgid "The 'e'dit command is currently disabled."
+msgstr "Perintah 'e' saat ini tidak aktif."
+
+#: LYMessages.c:424
+msgid "External editing is currently disabled."
+msgstr "Pengubahan eksternal saat ini tidak aktif."
+
+#: LYMessages.c:425
+msgid "System error - failure to get status."
+msgstr "Sistem error - gagal untuk memperoleh status."
+
+#: LYMessages.c:426
+msgid "No editor is defined!"
+msgstr "Tidak ada pengubah yang didefinisikan!"
+
+#: LYMessages.c:427
+msgid "The 'p'rint command is currently disabled."
+msgstr "Perintah 'p' saat ini tidak aktif."
+
+#: LYMessages.c:428
+msgid "Document has no Toolbar links or Banner."
+msgstr "Dokumen tidak memiliki sebuah sambungan Toolbar atau Banner."
+
+#: LYMessages.c:429
+msgid "Unable to open traversal file."
+msgstr "Tidak dapat membuka sebuah berkas traversal."
+
+#: LYMessages.c:430
+msgid "Unable to open traversal found file."
+msgstr "Tidak dapat membuka berkas traversal yang ditemukan."
+
+#: LYMessages.c:431
+msgid "Unable to open reject file."
+msgstr "Tidak dapat membuka sebuah berkas reject."
+
+#: LYMessages.c:432
+msgid "Unable to open traversal errors output file"
+msgstr "Tidak dapat membuka traversal errors berkas keluaran"
+
+#: LYMessages.c:433
+msgid "TRAVERSAL WAS INTERRUPTED"
+msgstr "TRAVERSAL TELAH DIINTERUPSI"
+
+#: LYMessages.c:434
+msgid "Follow link (or goto link or page) number: "
+msgstr "Ikuti sambungan (atau pergi link atau halaman) nomor: "
+
+#: LYMessages.c:435
+msgid "Select option (or page) number: "
+msgstr "Pilih opsi (atau halaman) nomor: "
+
+#: LYMessages.c:436
+#, c-format
+msgid "Option number %d already is current."
+msgstr "Opsi nomor %d telah baru."
+
+#. #define ALREADY_AT_OPTION_END
+#: LYMessages.c:438
+msgid "You are already at the end of this option list."
+msgstr "Anda telah berada di akhir dari daftar opsi ini."
+
+#. #define ALREADY_AT_OPTION_BEGIN
+#: LYMessages.c:440
+msgid "You are already at the beginning of this option list."
+msgstr "Anda telah berada di awal dari daftar opsi ini."
+
+#. #define ALREADY_AT_OPTION_PAGE
+#: LYMessages.c:442
+#, c-format
+msgid "You are already at page %d of this option list."
+msgstr "Anda telah berada di halaman %d dari daftar opsi ini."
+
+#: LYMessages.c:443
+msgid "You have entered an invalid option number."
+msgstr "Anda telah memasukan sebuah nomor opsi tidak valid."
+
+#: LYMessages.c:444
+msgid "** Bad HTML!! Use -trace to diagnose. **"
+msgstr "** HTML buruk!! Gunakan -trace untuk mendiagnosa. **"
+
+#: LYMessages.c:445
+msgid "Give name of file to save in"
+msgstr "Berikan nama dari berkas untuk menyimpan"
+
+#: LYMessages.c:446
+msgid "Can't save data to file -- please run WWW locally"
+msgstr "Tidak dapat menyimpan data ke berkas -- mohon jalankan WWW secara lokal"
+
+#: LYMessages.c:447
+msgid "Can't open temporary file!"
+msgstr "Tidak dapat membuka berkas sementara!"
+
+#: LYMessages.c:448
+msgid "Can't open output file! Cancelling!"
+msgstr "Tidak dapat membuka berkas! Membatalkan!"
+
+#: LYMessages.c:449
+msgid "Execution is disabled."
+msgstr "Eksekusi tidak aktif."
+
+#. #define EXECUTION_DISABLED_FOR_FILE
+#: LYMessages.c:451
+#, c-format
+msgid "Execution is not enabled for this file. See the Options menu (use %s)."
+msgstr "Eksekusi tidak aktif untuk berkas ini. Lihat menu Opsi (gunakan %s)."
+
+#. #define EXECUTION_NOT_COMPILED
+#: LYMessages.c:453
+msgid "Execution capabilities are not compiled into this version."
+msgstr "Kapabilitas eksekusi tidak dikompile kedalam versi ini."
+
+#: LYMessages.c:454
+msgid "This file cannot be displayed on this terminal."
+msgstr "Berkas ini tidak dapat ditampilkan di terminal ini."
+
+#. #define CANNOT_DISPLAY_FILE_D_OR_C
+#: LYMessages.c:456
+msgid "This file cannot be displayed on this terminal: D)ownload, or C)ancel"
+msgstr "Berkas ini tidak dapat ditampilkan di terminal ini: D)ownload, atau C)cancel"
+
+#: LYMessages.c:457
+#, c-format
+msgid "%s D)ownload, or C)ancel"
+msgstr "%s D)ownload, atau C)ancel"
+
+#: LYMessages.c:458
+msgid "Cancelling file."
+msgstr "Membatalkan berkas."
+
+#: LYMessages.c:459
+msgid "Retrieving file. - PLEASE WAIT -"
+msgstr "Mendapatkan berkas. - MOHON TUNGGU -"
+
+#: LYMessages.c:460
+msgid "Enter a filename: "
+msgstr "Masukan sebuah nama berkas: "
+
+#: LYMessages.c:461
+msgid "Edit the previous filename: "
+msgstr "Ubah nama berkas sebelumnya: "
+
+#: LYMessages.c:462
+msgid "Edit a previous filename: "
+msgstr "Ubah nama berkas sebelumnya: "
+
+#: LYMessages.c:463
+msgid "Enter a new filename: "
+msgstr "Masukan sebuah nama berkas baru: "
+
+#: LYMessages.c:464
+msgid "File name may not begin with a dot."
+msgstr "Nama berkas tidak boleh dimulai dengan sebuah dot."
+
+#: LYMessages.c:466
+msgid "File exists. Create higher version?"
+msgstr "Berkas ada. Buat sebuah versi lebih tinggi?"
+
+#: LYMessages.c:468
+msgid "File exists. Overwrite?"
+msgstr "Berkas ada. Paksa tulis?"
+
+#: LYMessages.c:470
+msgid "Cannot write to file."
+msgstr "Tidak dapat menulis ke berkas."
+
+#: LYMessages.c:471
+msgid "ERROR! - download command is misconfigured."
+msgstr "ERROR! - perintah unduh salah konfigurasi."
+
+#: LYMessages.c:472
+msgid "Unable to download file."
+msgstr "Tidak dapat mengunduh berkas."
+
+#: LYMessages.c:473
+msgid "Reading directory..."
+msgstr "Membaca direktori..."
+
+#: LYMessages.c:474
+msgid "Building directory listing..."
+msgstr "Membuat daftar direktori..."
+
+#: LYMessages.c:475
+msgid "Saving..."
+msgstr "Menyimpan..."
+
+#: LYMessages.c:476
+#, c-format
+msgid "Could not edit file '%s'."
+msgstr "Tidak dapat mengubah berkas '%s'."
+
+#: LYMessages.c:477
+msgid "Unable to access document!"
+msgstr "Tidak dapat mengakses dokumen!"
+
+#: LYMessages.c:478
+msgid "Could not access file."
+msgstr "Tidak dapat mengakses berkas."
+
+#: LYMessages.c:479
+msgid "Could not access directory."
+msgstr "Tidak dapat mengakses direktori."
+
+#: LYMessages.c:480
+msgid "Could not load data."
+msgstr "Tidak dapat memuat data."
+
+#. #define CANNOT_EDIT_REMOTE_FILES
+#: LYMessages.c:482
+msgid "Lynx cannot currently (e)dit remote WWW files."
+msgstr "Lynx tidak dapat saat ini (e)dit berkas WWW remote."
+
+#. #define CANNOT_EDIT_FIELD
+#: LYMessages.c:484
+msgid "This field cannot be (e)dited with an external editor."
+msgstr "Daerah ini tidak dapat (e)dited dengan sebuah pengubah eksternal."
+
+#: LYMessages.c:485
+msgid "Bad rule"
+msgstr "Aturan buruk"
+
+#: LYMessages.c:486
+msgid "Insufficient operands:"
+msgstr "Operan tidak mencukupi:"
+
+#: LYMessages.c:487
+msgid "You are not authorized to edit this file."
+msgstr "Anda tidak diijinkan untuk mengubah berkas ini."
+
+#: LYMessages.c:488
+msgid "Title: "
+msgstr "Judul: "
+
+#: LYMessages.c:489
+msgid "Subject: "
+msgstr "Subjek: "
+
+#: LYMessages.c:490
+msgid "Username: "
+msgstr "Nama pengguna: "
+
+#: LYMessages.c:491
+msgid "Password: "
+msgstr "Sandi lewat: "
+
+#: LYMessages.c:492
+msgid "lynx: Username and Password required!!!"
+msgstr "lynx: Nama pengguna dan Sandi lewat dibutuhkan!!!"
+
+#: LYMessages.c:493
+msgid "lynx: Password required!!!"
+msgstr "lynx: Sandi lewat dibutuhkan!!!"
+
+#: LYMessages.c:494
+msgid "Clear all authorization info for this session?"
+msgstr "Hapus seluruh informasi otorisasi untuk sesi ini?"
+
+#: LYMessages.c:495
+msgid "Authorization info cleared."
+msgstr "Informasi otorisasi dihapus."
+
+#: LYMessages.c:496
+msgid "Authorization failed. Retry?"
+msgstr "Otorisasi gagal. Coba lagi?"
+
+#: LYMessages.c:497
+msgid "cgi support has been disabled."
+msgstr "dukungan cgi telah dinon-aktifkan."
+
+#. #define CGI_NOT_COMPILED
+#: LYMessages.c:499
+msgid "Lynxcgi capabilities are not compiled into this version."
+msgstr "Kapabilitas lynxcgi tidak dikompile kedalam versi ini."
+
+#: LYMessages.c:500
+#, c-format
+msgid "Sorry, no known way of converting %s to %s."
+msgstr "Maaf, tidak ada cara yang dikenal untuk mengubah %s ke %s."
+
+#: LYMessages.c:501
+msgid "Unable to set up connection."
+msgstr "Tidak dapat menset up koneksi."
+
+#: LYMessages.c:502
+msgid "Unable to make connection"
+msgstr "Tidak dapat membuat koneksi"
+
+#. #define MALFORMED_EXEC_REQUEST
+#: LYMessages.c:504
+msgid "Executable link rejected due to malformed request."
+msgstr "Sambungan eksekusi ditolak karena permintaan salah bentuk."
+
+#. #define BADCHAR_IN_EXEC_LINK
+#: LYMessages.c:506
+#, c-format
+msgid "Executable link rejected due to `%c' character."
+msgstr "Sambungan eksekusi ditolak karena karakter `%c'."
+
+#. #define RELPATH_IN_EXEC_LINK
+#: LYMessages.c:508
+msgid "Executable link rejected due to relative path string ('../')."
+msgstr "Sambungan eksekusi ditolak karena string jalur relatif ('../')."
+
+#. #define BADLOCPATH_IN_EXEC_LINK
+#: LYMessages.c:510
+msgid "Executable link rejected due to location or path."
+msgstr "Sambungan eksekusi ditolak karena lokasi atau jalur."
+
+#: LYMessages.c:511
+msgid "Mail access is disabled!"
+msgstr "Akses surat tidak aktif!"
+
+#. #define ACCESS_ONLY_LOCALHOST
+#: LYMessages.c:513
+msgid "Only files and servers on the local host can be accessed."
+msgstr "Hanya berkas dan server di lokal host yang dapat diakses."
+
+#: LYMessages.c:514
+msgid "Telnet access is disabled!"
+msgstr "Akses telnet tidak aktif!"
+
+#. #define TELNET_PORT_SPECS_DISABLED
+#: LYMessages.c:516
+msgid "Telnet port specifications are disabled."
+msgstr "Spesifikasi telnet port tidak aktif."
+
+#: LYMessages.c:517
+msgid "USENET news access is disabled!"
+msgstr "Akses berita USENET tidak aktif!"
+
+#: LYMessages.c:518
+msgid "Rlogin access is disabled!"
+msgstr "Akses Rlogin tidak aktif!"
+
+#: LYMessages.c:519
+msgid "Ftp access is disabled!"
+msgstr "Akses ftp tidak aktif!"
+
+#: LYMessages.c:520
+msgid "There are no references from this document."
+msgstr "Tidak ada referensi dari dokumen ini."
+
+#: LYMessages.c:521
+msgid "There are only hidden links from this document."
+msgstr "Hanya sambungan tersembunyi dari dokumen ini."
+
+#: LYMessages.c:523
+msgid "Unable to open command file."
+msgstr "Tidak dapat membuka berkas perintah."
+
+#: LYMessages.c:525
+msgid "News Post Cancelled!!!"
+msgstr "Pos Berita Dibatalkan!!!"
+
+#. #define SPAWNING_EDITOR_FOR_NEWS
+#: LYMessages.c:527
+msgid "Spawning your selected editor to edit news message"
+msgstr "Spawning ke pengubah yang Anda pilih untuk mengubah pesan berita"
+
+#: LYMessages.c:528
+msgid "Post this message?"
+msgstr "Pos pesan ini?"
+
+#: LYMessages.c:529
+#, c-format
+msgid "Append '%s'?"
+msgstr "Tambahkan '%s'?"
+
+#: LYMessages.c:530
+msgid "Posting to newsgroup(s)..."
+msgstr "Posting ke newsgroup(s)..."
+
+#: LYMessages.c:532
+msgid "*** You have unread mail. ***"
+msgstr "*** Anda memiliki surat belum dibaca.***"
+
+#: LYMessages.c:534
+msgid "*** You have mail. ***"
+msgstr "*** Anda memiliki surat. ***"
+
+#: LYMessages.c:536
+msgid "*** You have new mail. ***"
+msgstr "*** Anda memiliki surat baru. ***"
+
+#: LYMessages.c:537
+msgid "File insert cancelled!!!"
+msgstr "Penyisipan berkas dibatalkan!!!"
+
+#: LYMessages.c:538
+msgid "Not enough memory for file!"
+msgstr "Tidak cukup memori untuk berkas!"
+
+#: LYMessages.c:539
+msgid "Can't open file for reading."
+msgstr "Tidak dapat membuka berkas untuk pembacaan."
+
+#: LYMessages.c:540
+msgid "File does not exist."
+msgstr "Berkas tidak ada."
+
+#: LYMessages.c:541
+msgid "File does not exist - reenter or cancel:"
+msgstr "Berkas tidak ada - reenter atau batalkan:"
+
+#: LYMessages.c:542
+msgid "File is not readable."
+msgstr "Berkas tidak dapat dibaca."
+
+#: LYMessages.c:543
+msgid "File is not readable - reenter or cancel:"
+msgstr "Berkas tidak dapat dibaca - reenter atau batal:"
+
+#: LYMessages.c:544
+msgid "Nothing to insert - file is 0-length."
+msgstr "Tidak ada untuk dimasukan - berkas panjang-0."
+
+#: LYMessages.c:545
+msgid "Save request cancelled!!!"
+msgstr "Permintaan penyimpanan dibatalkan!!!"
+
+#: LYMessages.c:546
+msgid "Mail request cancelled!!!"
+msgstr "Permintaan surat dibatalkan!!!"
+
+#. #define CONFIRM_MAIL_SOURCE_PREPARSED
+#: LYMessages.c:548
+msgid "Viewing preparsed source. Are you sure you want to mail it?"
+msgstr "Melihat preparsed sumber. Apakah Anda yang Anda ingin untuk mengirimnya?"
+
+#: LYMessages.c:549
+msgid "Please wait..."
+msgstr "Mohon tunggu..."
+
+#: LYMessages.c:550
+msgid "Mailing file. Please wait..."
+msgstr "Mengirim surat berkas. Mohon tunggu..."
+
+#: LYMessages.c:551
+msgid "ERROR - Unable to mail file"
+msgstr "ERROR - Tidak dapat mengirim surat berkas"
+
+#. #define CONFIRM_LONG_SCREEN_PRINT
+#: LYMessages.c:553
+#, c-format
+msgid "File is %d screens long. Are you sure you want to print?"
+msgstr "Berkas %d panjang layar. Apakah Anda yakin Anda ingin untuk mencetaknya?"
+
+#: LYMessages.c:554
+msgid "Print request cancelled!!!"
+msgstr "Permintaan pencetakan dibatalkan!!!"
+
+#: LYMessages.c:555
+msgid "Press <return> to begin: "
+msgstr "Tekan <return> untuk memulai: "
+
+#: LYMessages.c:556
+msgid "Press <return> to finish: "
+msgstr "Tekan <return> untuk selesai: "
+
+#. #define CONFIRM_LONG_PAGE_PRINT
+#: LYMessages.c:558
+#, c-format
+msgid "File is %d pages long. Are you sure you want to print?"
+msgstr "Berkas memiliki %d halaman. Apakah Anda yakin Anda ingin untuk mencetaknya?"
+
+#. #define CHECK_PRINTER
+#: LYMessages.c:560
+msgid "Be sure your printer is on-line. Press <return> to start printing:"
+msgstr "Yakinkan pencetak Anda sudah nyala. Tekan <return> untuk memulai pencetakan:"
+
+#: LYMessages.c:561
+msgid "ERROR - Unable to allocate file space!!!"
+msgstr "ERROR - Tidak dapat mengalokasikan ruang berkas!!!"
+
+#: LYMessages.c:562
+msgid "Unable to open tempfile"
+msgstr "Tidak dapat membuka berkas sementara"
+
+#: LYMessages.c:563
+msgid "Unable to open print options file"
+msgstr "Tidak dapat membuka opsi cetak berkas"
+
+#: LYMessages.c:564
+msgid "Printing file. Please wait..."
+msgstr "Mencetak berkas. Mohon tunggu..."
+
+#: LYMessages.c:565
+msgid "Please enter a valid internet mail address: "
+msgstr "Mohon masukan sebuah alamat internet surat yang valid: "
+
+#: LYMessages.c:566
+msgid "ERROR! - printer is misconfigured!"
+msgstr "ERROR! - pencetak salah konfigurasi!"
+
+#: LYMessages.c:567
+msgid "Image map from POST response not available!"
+msgstr "Peta gambar dari balasan POST tidak tersedia!"
+
+#: LYMessages.c:568
+msgid "Misdirected client-side image MAP request!"
+msgstr "Salah arah permintaan sisi klien peta gambar!"
+
+#: LYMessages.c:569
+msgid "Client-side image MAP is not accessible!"
+msgstr "Gambar PETA sisi klien tidak dapat diakses!"
+
+#: LYMessages.c:570
+msgid "No client-side image MAPs are available!"
+msgstr "Tidak ada peta gambar sisi klien yang tersedia!"
+
+#: LYMessages.c:571
+msgid "Client-side image MAP is not available!"
+msgstr "Gambar PETA sisi klien tidak tersedia!"
+
+#. #define OPTION_SCREEN_NEEDS_24
+#: LYMessages.c:574
+msgid "Screen height must be at least 24 lines for the Options menu!"
+msgstr "Tinggi layar harus paling tidak 24 baris untuk menu Opsi!"
+
+#. #define OPTION_SCREEN_NEEDS_23
+#: LYMessages.c:576
+msgid "Screen height must be at least 23 lines for the Options menu!"
+msgstr "Tinggi layar harus berada paling tidak 23 baris untuk menu Opsi!"
+
+#. #define OPTION_SCREEN_NEEDS_22
+#: LYMessages.c:578
+msgid "Screen height must be at least 22 lines for the Options menu!"
+msgstr "Tinggi layar harus berada paling tidak 22 baris untuk menu Opsi!"
+
+#: LYMessages.c:580
+msgid "That key requires Advanced User mode."
+msgstr "Tombol itu membutuhkan mode Pengguna Expert."
+
+#: LYMessages.c:581
+#, c-format
+msgid "Content-type: %s"
+msgstr "Tipe-isi: %s"
+
+#: LYMessages.c:582
+msgid "Command: "
+msgstr "Perintah: "
+
+#: LYMessages.c:583
+msgid "Unknown or ambiguous command"
+msgstr "Tidak diketahui atau perintah ambigu"
+
+#: LYMessages.c:584
+msgid " Version "
+msgstr " Versi "
+
+#: LYMessages.c:585
+msgid " first"
+msgstr " pertama"
+
+#: LYMessages.c:586
+msgid ", guessing..."
+msgstr ", menebak..."
+
+#: LYMessages.c:587
+msgid "Permissions for "
+msgstr "Ijin untuk "
+
+#: LYMessages.c:588
+msgid "Select "
+msgstr "Pilih "
+
+#: LYMessages.c:589
+msgid "capital letter"
+msgstr "huruf besar"
+
+#: LYMessages.c:590
+msgid " of option line,"
+msgstr " dari baris opsi,"
+
+#: LYMessages.c:591
+msgid " to save,"
+msgstr " untuk menyimpan,"
+
+#: LYMessages.c:592
+msgid " to "
+msgstr " ke "
+
+#: LYMessages.c:593
+msgid " or "
+msgstr " atau "
+
+#: LYMessages.c:594
+msgid " index"
+msgstr " indeks"
+
+#: LYMessages.c:595
+msgid " to return to Lynx."
+msgstr " untuk kembali ke Lynx."
+
+#: LYMessages.c:596
+msgid "Accept Changes"
+msgstr "Terima Perubahan"
+
+#: LYMessages.c:597
+msgid "Reset Changes"
+msgstr "Bakukan Perubahan"
+
+#: LYMessages.c:598
+msgid "Left Arrow cancels changes"
+msgstr "Panah Kirim membatalkan perubahan"
+
+#: LYMessages.c:599
+msgid "Save options to disk"
+msgstr "Simpan opsi ke disk"
+
+#: LYMessages.c:600
+msgid "Hit RETURN to accept entered data."
+msgstr "Tekan RETURN untuk menerima data yang dimasukan."
+
+#. #define ACCEPT_DATA_OR_DEFAULT
+#: LYMessages.c:602
+msgid "Hit RETURN to accept entered data. Delete data to invoke the default."
+msgstr "Tekan RETURN untuk menerima data yang dimasukan. Hapus data untuk memanggil baku."
+
+#: LYMessages.c:603
+msgid "Value accepted!"
+msgstr "Nilai diterima!"
+
+#. #define VALUE_ACCEPTED_WARNING_X
+#: LYMessages.c:605
+msgid "Value accepted! -- WARNING: Lynx is configured for XWINDOWS!"
+msgstr "Nilai diterima! -- PERINGATAN: Lynx dikonfigurasikan untuk XWINDOWS!"
+
+#. #define VALUE_ACCEPTED_WARNING_NONX
+#: LYMessages.c:607
+msgid "Value accepted! -- WARNING: Lynx is NOT configured for XWINDOWS!"
+msgstr "Nilai diterima! -- PERINGATAN: Lynx TIDAK dikonfigurasikan untuk XWINDOWS!"
+
+#: LYMessages.c:608
+msgid "You are not allowed to change which editor to use!"
+msgstr "Anda tidak diijinkan untuk mengubah pengubah mana untuk digunakan!"
+
+#: LYMessages.c:609
+msgid "Failed to set DISPLAY variable!"
+msgstr "Gagal untuk menset variabel DISPLAY!"
+
+#: LYMessages.c:610
+msgid "Failed to clear DISPLAY variable!"
+msgstr "Gagal untuk menghapus variabel DISPLAY!"
+
+#. #define BOOKMARK_CHANGE_DISALLOWED
+#: LYMessages.c:612
+msgid "You are not allowed to change the bookmark file!"
+msgstr "Anda tidak diijinkan untuk mengubah berkas bookmark!"
+
+#: LYMessages.c:613
+msgid "Terminal does not support color"
+msgstr "Terminal tidak mendukung warna"
+
+#: LYMessages.c:614
+#, c-format
+msgid "Your '%s' terminal does not support color."
+msgstr "Terminal '%s' Anda tidak mendukung warna."
+
+#: LYMessages.c:615
+msgid "Access to dot files is disabled!"
+msgstr "Akses ke berkas titik tidak aktif!"
+
+#. #define UA_NO_LYNX_WARNING
+#: LYMessages.c:617
+msgid "User-Agent string does not contain \"Lynx\" or \"L_y_n_x\""
+msgstr "String User-Agent tidak berisi \"Lynx\" atau \"L_y_n_x\""
+
+#. #define UA_PLEASE_USE_LYNX
+#: LYMessages.c:619
+msgid "Use \"L_y_n_x\" or \"Lynx\" in User-Agent, or it looks like intentional deception!"
+msgstr "Gunakan \"L_y_n_x\" atau \"Lynx\" dalam User-Agent, atau ini tampak seperti penipuan sengaja!"
+
+#. #define UA_CHANGE_DISABLED
+#: LYMessages.c:621
+msgid "Changing of the User-Agent string is disabled!"
+msgstr "Perubahan dari string User-Agent tidak aktif!"
+
+#. #define CHANGE_OF_SETTING_DISALLOWED
+#: LYMessages.c:623
+msgid "You are not allowed to change this setting."
+msgstr "Anda tidak diijinkan untuk mengubah konfigurasi ini."
+
+#: LYMessages.c:624
+msgid "Saving Options..."
+msgstr "Menyimpan Opsi..."
+
+#: LYMessages.c:625
+msgid "Options saved!"
+msgstr "Opsi disimpan!"
+
+#: LYMessages.c:626
+msgid "Unable to save Options!"
+msgstr "Tidak dapat menyimpan Opsi!"
+
+#: LYMessages.c:627
+msgid " 'r' to return to Lynx "
+msgstr " 'r' untuk kembali ke Lynx "
+
+#: LYMessages.c:628
+msgid " '>' to save, or 'r' to return to Lynx "
+msgstr " '>' untuk menyimpan, atau 'r' untuk kembali ke Lynx "
+
+#. #define ANY_KEY_CHANGE_RET_ACCEPT
+#: LYMessages.c:630
+msgid "Hit any key to change value; RETURN to accept."
+msgstr "Tekan tombol apapun untuk mengubah nilai; RETURN untuk menerima."
+
+#: LYMessages.c:631
+msgid "Error uncompressing temporary file!"
+msgstr "Error mengurai berkas sementara!"
+
+#: LYMessages.c:632
+msgid "Unsupported URL scheme!"
+msgstr "Skema URL tidak didukung!"
+
+#: LYMessages.c:633
+msgid "Unsupported data: URL! Use SHOWINFO, for now."
+msgstr "Data tidak didukung: URL! Gunakan SHOWINFO, untuk saat ini."
+
+#: LYMessages.c:634
+#, c-format
+msgid "Redirection limit of %d URL's reached."
+msgstr "Batas redireksi dari %d URL dicapai."
+
+#: LYMessages.c:635
+msgid "Illegal redirection URL received from server!"
+msgstr "Redireksi URL tidak legal diterima dari server!"
+
+#. #define SERVER_ASKED_FOR_REDIRECTION
+#: LYMessages.c:637
+#, c-format
+msgid "Server asked for %d redirection of POST content to"
+msgstr "Server diminta untuk %d redireksi dari isi POST ke"
+
+#: LYMessages.c:640
+msgid "P)roceed, use G)ET or C)ancel "
+msgstr "P)roceed, gunakan G)ET atau C)ancel "
+
+#: LYMessages.c:641
+msgid "P)roceed, or C)ancel "
+msgstr "P)roceed, atau C)ancel "
+
+#. #define ADVANCED_POST_GET_REDIRECT
+#: LYMessages.c:643
+msgid "Redirection of POST content. P)roceed, see U)RL, use G)ET or C)ancel"
+msgstr "Redireksi dari isi POST. P)roceed, lihat U)RL, gunakan G)ET atau C)ancel"
+
+#. #define ADVANCED_POST_REDIRECT
+#: LYMessages.c:645
+msgid "Redirection of POST content. P)roceed, see U)RL, or C)ancel"
+msgstr "Redireksi dari isi POST. P)roceed, lihat U)RL, atau C)ancel"
+
+#. #define CONFIRM_POST_RESUBMISSION
+#: LYMessages.c:647
+msgid "Document from Form with POST content. Resubmit?"
+msgstr "Dokumen dari Form dengan isi POST. Kirim kembali?"
+
+#. #define CONFIRM_POST_RESUBMISSION_TO
+#: LYMessages.c:649
+#, c-format
+msgid "Resubmit POST content to %s ?"
+msgstr "Kirim kembali isi POST ke %s?"
+
+#. #define CONFIRM_POST_LIST_RELOAD
+#: LYMessages.c:651
+#, c-format
+msgid "List from document with POST data. Reload %s ?"
+msgstr "Daftar dari dokumen dengan data POST. Muat kembali %s ?"
+
+#. #define CONFIRM_POST_DOC_HEAD
+#: LYMessages.c:653
+msgid "Document from POST action, HEAD may not be understood. Proceed?"
+msgstr "Dokumen dari aksi POST, HEAD mungkin tidak dimengerti. Lanjutkan?"
+
+#. #define CONFIRM_POST_LINK_HEAD
+#: LYMessages.c:655
+msgid "Form submit action is POST, HEAD may not be understood. Proceed?"
+msgstr "Aksi kirim formulir adalah POST, HEAD mungkin tidak dimengerti. Lanjutkan?"
+
+#: LYMessages.c:656
+msgid "Proceed without a username and password?"
+msgstr "Lanjutkan tanpa sebuah nama pengguna dan sandi lewat?"
+
+#: LYMessages.c:657
+#, c-format
+msgid "Proceed (%s)?"
+msgstr "Lanjutkan (%s)?"
+
+#: LYMessages.c:658
+msgid "Cannot POST to this host."
+msgstr "Tidak dapat POST ke host ini."
+
+#: LYMessages.c:659
+msgid "POST not supported for this URL - ignoring POST data!"
+msgstr "POST tidak didukung untuk URL ini - mengabaikan data POST!"
+
+#: LYMessages.c:660
+msgid "Discarding POST data..."
+msgstr "Mengabaikan data POST..."
+
+#: LYMessages.c:661
+msgid "Document will not be reloaded!"
+msgstr "Dokumen tidak akan dimuat kembali!"
+
+#: LYMessages.c:662
+msgid "Location: "
+msgstr "Lokasi: "
+
+#: LYMessages.c:663
+#, c-format
+msgid "'%s' not found!"
+msgstr "'%s' tidak ditemukan!"
+
+#: LYMessages.c:664
+msgid "Default Bookmark File"
+msgstr "Berkas Bookmark Baku"
+
+#: LYMessages.c:665
+msgid "Screen too small! (8x35 min)"
+msgstr "Layar terlalu kecil! (minimal 8x35)"
+
+#: LYMessages.c:666
+msgid "Select destination or ^G to Cancel: "
+msgstr "Pilih tujuan atau ^G untuk membatalkan: "
+
+#. #define MULTIBOOKMARKS_SELECT
+#: LYMessages.c:668
+msgid "Select subbookmark, '=' for menu, or ^G to cancel: "
+msgstr "Pilih subbookmark, '=' untuk menu, atau ^G untuk membatalkan: "
+
+#. #define MULTIBOOKMARKS_SELF
+#: LYMessages.c:670
+msgid "Reproduce L)ink in this bookmark file or C)ancel? (l,c): "
+msgstr "Membuat kembali L)ink dalam berkas bookmark ini atau C)ancel? (l,c): "
+
+#: LYMessages.c:671
+msgid "Multiple bookmark support is not available."
+msgstr "Dukungan multiple bookmark tidak tersedia."
+
+#: LYMessages.c:672
+#, c-format
+msgid " Select Bookmark (screen %d of %d)"
+msgstr " Pilih Bookmark (layar %d dari %d)"
+
+#: LYMessages.c:673
+msgid " Select Bookmark"
+msgstr " Pilih Bookmark"
+
+#. #define MULTIBOOKMARKS_EHEAD_MASK
+#: LYMessages.c:675
+#, c-format
+msgid "Editing Bookmark DESCRIPTION and FILEPATH (%d of 2)"
+msgstr "Pengubahan DESKRIPSI bookmark dan FILEPATH (%d dari 2)"
+
+#. #define MULTIBOOKMARKS_EHEAD
+#: LYMessages.c:677
+msgid " Editing Bookmark DESCRIPTION and FILEPATH"
+msgstr " Pengubahan DESKRIPSI bookmark dan FILEPATH"
+
+#: LYMessages.c:678
+msgid "Letter: "
+msgstr "Huruf: "
+
+#. #define USE_PATH_OFF_HOME
+#: LYMessages.c:681
+msgid "Use a filepath off your login directory in SHELL syntax!"
+msgstr "Gunakan sebuah jalur berkas dari direktori login Anda dalam sintaks SHELL!"
+
+#: LYMessages.c:683
+msgid "Use a filepath off your home directory!"
+msgstr "Gunakan sebuah jalur berkas diluar dari direktori rumah Anda!"
+
+#. #define MAXLINKS_REACHED
+#: LYMessages.c:686
+msgid "Maximum links per page exceeded! Use half-page or two-line scrolling."
+msgstr "Sambungan maksimal per halaman dilampaui! Gunakan setengah-halaman atau dua-baris scrolling."
+
+#: LYMessages.c:687
+msgid "No previously visited links available!"
+msgstr "Tidak ada sebelumnya sambungan dikunjungi yang tersedia!"
+
+#: LYMessages.c:688
+msgid "Memory exhausted! Program aborted!"
+msgstr "Kehabisan memori! Aplikasi dibatalkan!"
+
+#: LYMessages.c:689
+msgid "Memory exhausted! Aborting..."
+msgstr "Kehabisan memori! Membatalkan..."
+
+#: LYMessages.c:690
+msgid "Not enough memory!"
+msgstr "Tidak cukup memori!"
+
+#: LYMessages.c:691
+msgid "Directory/File Manager not available"
+msgstr "Direktori/Manajer Berkas tidak tersedia"
+
+#: LYMessages.c:692
+msgid "Location URL is not absolute."
+msgstr "Lokasi URL tidak absolut."
+
+#: LYMessages.c:693
+msgid "Refresh URL is not absolute."
+msgstr "Refresh URL tidak absolut."
+
+#. #define SENDING_MESSAGE_WITH_BODY_TO
+#: LYMessages.c:695
+msgid ""
+"You are sending a message with body to:\n"
+" "
+msgstr ""
+"Anda sedang mengirimkan sebuah pesan dengan tubuh ke:\n"
+" "
+
+#: LYMessages.c:696
+msgid ""
+"You are sending a comment to:\n"
+" "
+msgstr ""
+"Anda sedang mengirimkan sebuah komentar ke:\n"
+" "
+
+#: LYMessages.c:697
+msgid ""
+"\n"
+" With copy to:\n"
+" "
+msgstr ""
+"\n"
+" Dengan salinan ke:\n"
+" "
+
+#: LYMessages.c:698
+msgid ""
+"\n"
+" With copies to:\n"
+" "
+msgstr ""
+"\n"
+" Dengan salinan ke:\n"
+" "
+
+#. #define CTRL_G_TO_CANCEL_SEND
+#: LYMessages.c:700
+msgid ""
+"\n"
+"\n"
+"Use Ctrl-G to cancel if you do not want to send a message\n"
+msgstr ""
+"\n"
+"\n"
+"Gunakan Ctrl-G untuk membatalkan jika Anda tidak ingin mengirim sebuah pesan\n"
+
+#. #define ENTER_NAME_OR_BLANK
+#: LYMessages.c:702
+msgid ""
+"\n"
+" Please enter your name, or leave it blank to remain anonymous\n"
+msgstr ""
+"\n"
+" Mohon masukan nama Anda, atau tinggalkan itu kosong supaya tetap anonim\n"
+
+#. #define ENTER_MAIL_ADDRESS_OR_OTHER
+#: LYMessages.c:704
+msgid ""
+"\n"
+" Please enter a mail address or some other\n"
+msgstr ""
+"\n"
+" Mohon masukan sebuah alamat surat atau beberapa yang lain\n"
+
+#. #define MEANS_TO_CONTACT_FOR_RESPONSE
+#: LYMessages.c:706
+msgid " means to contact you, if you desire a response.\n"
+msgstr " cara untuk menghubungi Anda, jika Anda menginginkan sebuah balasan.\n"
+
+#: LYMessages.c:707
+msgid ""
+"\n"
+" Please enter a subject line.\n"
+msgstr ""
+"\n"
+" Mohon masukan sebuah baris subjek.\n"
+
+#. #define ENTER_ADDRESS_FOR_CC
+#: LYMessages.c:709
+msgid ""
+"\n"
+" Enter a mail address for a CC of your message.\n"
+msgstr ""
+"\n"
+" Masukan sebuah alamat surat untuk CC dari pesan Anda.\n"
+
+#: LYMessages.c:710
+msgid " (Leave blank if you don't want a copy.)\n"
+msgstr " (Tinggalkan kosong jika Anda tidak ingin sebuah salinan.)\n"
+
+#: LYMessages.c:711
+msgid ""
+"\n"
+" Please review the message body:\n"
+"\n"
+msgstr ""
+"\n"
+" Mohon ulas kembali tubuh pesan:\n"
+"\n"
+
+#: LYMessages.c:712
+msgid ""
+"\n"
+"Press RETURN to continue: "
+msgstr ""
+"\n"
+"Tekan RETURN untuk melanjutkan: "
+
+#: LYMessages.c:713
+msgid ""
+"\n"
+"Press RETURN to clean up: "
+msgstr ""
+"\n"
+"Tekan RETURN untuk membersihkan: "
+
+#: LYMessages.c:714
+msgid " Use Control-U to erase the default.\n"
+msgstr " Gunakan Control-U untuk menghapus baku.\n"
+
+#: LYMessages.c:715
+msgid ""
+"\n"
+" Please enter your message below."
+msgstr ""
+"\n"
+" Mohon masukan pesan Anda dibawah."
+
+#. #define ENTER_PERIOD_WHEN_DONE_A
+#: LYMessages.c:717 src/LYNews.c:360
+msgid ""
+"\n"
+" When you are done, press enter and put a single period (.)"
+msgstr ""
+"\n"
+" Ketika Anda telah selesai, tekan enter dan letakan sebuah titik tunggal (.)"
+
+#. #define ENTER_PERIOD_WHEN_DONE_B
+#: LYMessages.c:719 src/LYNews.c:361
+msgid ""
+"\n"
+" on a line and press enter again."
+msgstr ""
+"\n"
+" di sebuah baris dan tekan enter lagi."
+
+#. Cookies messages
+#. #define ADVANCED_COOKIE_CONFIRMATION
+#: LYMessages.c:723
+#, c-format
+msgid "%s cookie: %.*s=%.*s Allow? (Y/N/Always/neVer)"
+msgstr "%s cookie: %.*s=%.*s Ijinkan? (Y/T/Selalu/tidak Pernah)"
+
+#. #define INVALID_COOKIE_DOMAIN_CONFIRMATION
+#: LYMessages.c:725
+#, c-format
+msgid "Accept invalid cookie domain=%s for '%s'?"
+msgstr "Terima cookie tidak valid domain=%s untuk '%s'?"
+
+#. #define INVALID_COOKIE_PATH_CONFIRMATION
+#: LYMessages.c:727
+#, c-format
+msgid "Accept invalid cookie path=%s as a prefix of '%s'?"
+msgstr "Terima cookie tidak valid jalur=%s sebagai sebuah awalan dari '%s'?"
+
+#: LYMessages.c:728
+msgid "Allowing this cookie."
+msgstr "Ijinkan cookie ini."
+
+#: LYMessages.c:729
+msgid "Rejecting this cookie."
+msgstr "Menolak cookie ini."
+
+#: LYMessages.c:730
+msgid "The Cookie Jar is empty."
+msgstr "Cookie Jar kosong."
+
+#: LYMessages.c:731
+msgid "The Cache Jar is empty."
+msgstr "Cache Jar kosong."
+
+#. #define ACTIVATE_TO_GOBBLE
+#: LYMessages.c:733
+msgid "Activate links to gobble up cookies or entire domains,"
+msgstr "Aktifkan sambungan untuk gobble up cookies atau seluruh domains,"
+
+#: LYMessages.c:734
+msgid "or to change a domain's 'allow' setting."
+msgstr "atau untuk mengubah sebuah domain 'allow' konfigurasi."
+
+#: LYMessages.c:735
+msgid "(Cookies never allowed.)"
+msgstr "(Cookies tidak pernah diijinkan.)"
+
+#: LYMessages.c:736
+msgid "(Cookies always allowed.)"
+msgstr "(Cookies selalu diijinkan.)"
+
+#: LYMessages.c:737
+msgid "(Cookies allowed via prompt.)"
+msgstr "(Cookies diijinkan melalui prompt.)"
+
+#: LYMessages.c:738
+msgid "(Persistent Cookies.)"
+msgstr "(Persistent Cookies.)"
+
+#: LYMessages.c:739
+msgid "(No title.)"
+msgstr "(Tidak ada judul.)"
+
+#: LYMessages.c:740
+msgid "(No name.)"
+msgstr "(Tidak ada nama.)"
+
+#: LYMessages.c:741
+msgid "(No value.)"
+msgstr "(Tidak ada nilai.)"
+
+#: LYMessages.c:742 src/LYOptions.c:2482
+msgid "None"
+msgstr "Kosong"
+
+#: LYMessages.c:743
+msgid "(End of session.)"
+msgstr "(Akhir dari sesi.)"
+
+#: LYMessages.c:744
+msgid "Delete this cookie?"
+msgstr "Hapus cookie ini?"
+
+#: LYMessages.c:745
+msgid "The cookie has been eaten!"
+msgstr "Cookie telah dimakan!"
+
+#: LYMessages.c:746
+msgid "Delete this empty domain?"
+msgstr "Hapus domain kosong ini?"
+
+#: LYMessages.c:747
+msgid "The domain has been eaten!"
+msgstr "Domain telah dimakan!"
+
+#. #define DELETE_COOKIES_SET_ALLOW_OR_CANCEL
+#: LYMessages.c:749
+msgid "D)elete domain's cookies, set allow A)lways/P)rompt/neV)er, or C)ancel? "
+msgstr "D)elete domain cookies, set ijinkan A)lways/P)rompt/neV)er, atau C)ancel? "
+
+#. #define DELETE_DOMAIN_SET_ALLOW_OR_CANCEL
+#: LYMessages.c:751
+msgid "D)elete domain, set allow A)lways/P)rompt/neV)er, or C)ancel? "
+msgstr "D)elete domain, set ijinkan A)lways/P)rompt/neV)er, atau C)ancel? "
+
+#: LYMessages.c:752
+msgid "All cookies in the domain have been eaten!"
+msgstr "Seluruh cookies dalam domain telah dimakan!"
+
+#: LYMessages.c:753
+#, c-format
+msgid "'A'lways allowing from domain '%s'."
+msgstr "'A'lways mengijinkan dari domain '%s'."
+
+#: LYMessages.c:754
+#, c-format
+msgid "ne'V'er allowing from domain '%s'."
+msgstr "ne'V'er mengijinkan dari domain '%s'."
+
+#: LYMessages.c:755
+#, c-format
+msgid "'P'rompting to allow from domain '%s'."
+msgstr "'P'rompting untuk mengijinkan dari domain '%s'."
+
+#: LYMessages.c:756
+msgid "Delete all cookies in this domain?"
+msgstr "Hapus seluruh cookie dalam domain ini?"
+
+#: LYMessages.c:757
+msgid "All of the cookies in the jar have been eaten!"
+msgstr "Seluruh cookie dalam jar telah dimakan!"
+
+#: LYMessages.c:759
+msgid "Port 19 not permitted in URLs."
+msgstr "Port 19 tidak diijinkan dalam URL."
+
+#: LYMessages.c:760
+msgid "Port 25 not permitted in URLs."
+msgstr "Port 25 tidak diijinkan dalam URL."
+
+#: LYMessages.c:761
+#, c-format
+msgid "Port %lu not permitted in URLs."
+msgstr "Port %lu tidak diijinkan dalam URL."
+
+#: LYMessages.c:762
+msgid "URL has a bad port field."
+msgstr "URL memiliki daerah port buruk."
+
+#: LYMessages.c:763
+msgid "Maximum nesting of HTML elements exceeded."
+msgstr "Jumlah maksimal nesting dari elemen HTML dilampaui."
+
+#: LYMessages.c:764
+msgid "Bad partial reference! Stripping lead dots."
+msgstr "Referensi partial buruk! Membuang titik-titik awalan."
+
+#: LYMessages.c:765
+msgid "Trace Log open failed. Trace off!"
+msgstr "Pembukaan catatan penjejakan gagal. Penjejakan tidak aktif!"
+
+#: LYMessages.c:766
+msgid "Lynx Trace Log"
+msgstr "Catatan Jejak Lynx"
+
+#: LYMessages.c:767
+msgid "No trace log has been started for this session."
+msgstr "Tidak ada catatan jejak yang telah dimulai untuk sesi ini."
+
+#. #define MAX_TEMPCOUNT_REACHED
+#: LYMessages.c:769
+msgid "The maximum temporary file count has been reached!"
+msgstr "Jumlah maksimal berkas sementara telah dicapai!"
+
+#. #define FORM_VALUE_TOO_LONG
+#: LYMessages.c:771
+msgid "Form field value exceeds buffer length! Trim the tail."
+msgstr "Nilai isi formulir melebihi panjang penyangga! Trim the tail."
+
+#. #define FORM_TAIL_COMBINED_WITH_HEAD
+#: LYMessages.c:773
+msgid "Modified tail combined with head of form field value."
+msgstr "Modifikasi tail dikombinasikan dengan kepala dari nilai bagian formulir."
+
+#. HTFile.c
+#: LYMessages.c:776
+msgid "Directory"
+msgstr "Direktori"
+
+#: LYMessages.c:777
+msgid "Directory browsing is not allowed."
+msgstr "Direktori browsing tidak diijinkan."
+
+#: LYMessages.c:778
+msgid "Selective access is not enabled for this directory"
+msgstr "Akses selektif tidak aktif untuk direktori ini"
+
+#: LYMessages.c:779
+msgid "Multiformat: directory scan failed."
+msgstr "Multiformat: pemindaian direktori gagal."
+
+#: LYMessages.c:780
+msgid "This directory is not readable."
+msgstr "Direktori ini tidak dapat dibaca."
+
+#: LYMessages.c:781
+msgid "Can't access requested file."
+msgstr "Tidak dapat mengakses berkas yang diminta."
+
+#: LYMessages.c:782
+msgid "Could not find suitable representation for transmission."
+msgstr "Tidak dapat menemukan representasi cocok untuk transmisi."
+
+#: LYMessages.c:783
+msgid "Could not open file for decompression!"
+msgstr "Tidak dapat membuka berkas untuk dekompresi!"
+
+#: LYMessages.c:784
+msgid "Files:"
+msgstr "Berkas:"
+
+#: LYMessages.c:785
+msgid "Subdirectories:"
+msgstr "Subdirektori:"
+
+#: LYMessages.c:786
+msgid " directory"
+msgstr " direktori"
+
+#: LYMessages.c:787
+msgid "Up to "
+msgstr "Sampai ke "
+
+#: LYMessages.c:788
+msgid "Current directory is "
+msgstr "Direktori saat ini adalah "
+
+#. HTFTP.c
+#: LYMessages.c:791
+msgid "Symbolic Link"
+msgstr "Link simbolik"
+
+#. HTGopher.c
+#: LYMessages.c:794
+msgid "No response from server!"
+msgstr "Tidak ada balasan dari server!"
+
+#: LYMessages.c:795
+msgid "CSO index"
+msgstr "CSO indeks"
+
+#: LYMessages.c:796
+msgid ""
+"\n"
+"This is a searchable index of a CSO database.\n"
+msgstr ""
+"\n"
+" Ini adalah sebuah indeks yang dapat dipindah dari sebuah basis data CSO.\n"
+
+#: LYMessages.c:797
+msgid "CSO Search Results"
+msgstr "Hasil pencarian CSO"
+
+#: LYMessages.c:798
+#, c-format
+msgid "Seek fail on %s\n"
+msgstr "Pencarian gagal di %s\n"
+
+#: LYMessages.c:799
+msgid ""
+"\n"
+"Press the 's' key and enter search keywords.\n"
+msgstr ""
+"\n"
+"Tekan tombol 's' dan masukan kata kunci pencarian.\n"
+
+#: LYMessages.c:800
+msgid ""
+"\n"
+"This is a searchable Gopher index.\n"
+msgstr ""
+"\n"
+"Ini adalah sebuah indeks Gopher yang dapat dipindai.\n"
+
+#: LYMessages.c:801
+msgid "Gopher index"
+msgstr "Indeks Gopher"
+
+#: LYMessages.c:802
+msgid "Gopher Menu"
+msgstr "Menu Gopher"
+
+#: LYMessages.c:803
+msgid " Search Results"
+msgstr " Hasil Pencarian"
+
+#: LYMessages.c:804
+msgid "Sending CSO/PH request."
+msgstr "Mengirimkan permintaan CSO/PH."
+
+#: LYMessages.c:805
+msgid "Sending Gopher request."
+msgstr "Mengirimkan permintaan Gopher."
+
+#: LYMessages.c:806
+msgid "CSO/PH request sent; waiting for response."
+msgstr "Permintaan CSO/PH dikirimkan; menunggu balasan."
+
+#: LYMessages.c:807
+msgid "Gopher request sent; waiting for response."
+msgstr "Permintaan Gopher dikirimkan; menunggu balasan."
+
+#: LYMessages.c:808
+msgid ""
+"\n"
+"Please enter search keywords.\n"
+msgstr ""
+"\n"
+"Mohon masukan kata kunci pencarian.\n"
+
+#: LYMessages.c:809
+msgid ""
+"\n"
+"The keywords that you enter will allow you to search on a"
+msgstr ""
+"\n"
+"Kata kunci yang Anda masukan akan mengijinkan Anda untuk mencari di"
+
+#: LYMessages.c:810
+msgid " person's name in the database.\n"
+msgstr " nama orang dalam basis data.\n"
+
+#. HTNews.c
+#: LYMessages.c:813
+msgid "Connection closed ???"
+msgstr "Koneksi ditutup ???"
+
+#: LYMessages.c:814
+msgid "Cannot open temporary file for news POST."
+msgstr "Tidak dapat membuka berkas sementara untuk news POST."
+
+#: LYMessages.c:815
+msgid "This client does not contain support for posting to news with SSL."
+msgstr "Klien ini tidak berisi dukungan untuk posting ke news dengan SSL."
+
+#. HTStyle.c
+#: LYMessages.c:818
+#, c-format
+msgid "Style %d `%s' SGML:%s. Font %s %.1f point.\n"
+msgstr "Gaya %d `%s' SGML:%s. Font %s %.1f titik.\n"
+
+#: LYMessages.c:820
+#, c-format
+msgid "\tAlign=%d, %d tabs. (%.0f before, %.0f after)\n"
+msgstr "\tAlign=%d, %d tabs. (%.0f sebelumnya, %.0f sesudahnya)\n"
+
+#: LYMessages.c:821
+#, c-format
+msgid "\t\tTab kind=%d at %.0f\n"
+msgstr "\t\tTab jenis=%d di %.0f\n"
+
+#. HTTP.c
+#: LYMessages.c:824
+msgid "Can't proceed without a username and password."
+msgstr "Tidak dapat melanjutkan tanpa sebuah nama pengguna dan kata sandi."
+
+#: LYMessages.c:825
+msgid "Can't retry with authorization! Contact the server's WebMaster."
+msgstr "Tidak dapat mencoba dengan otorisasi! Hubungi WebMaster server."
+
+#: LYMessages.c:826
+msgid "Can't retry with proxy authorization! Contact the server's WebMaster."
+msgstr "Tidak dapat mencoba dengan proxy otorisasi! Hubungi WebMaster server."
+
+#: LYMessages.c:827
+msgid "Retrying with proxy authorization information."
+msgstr "Mencoba dengan informasi otorisasi proxy."
+
+#: LYMessages.c:828
+#, c-format
+msgid "SSL error:%s-Continue?"
+msgstr "SSL error:%s-Lanjutkan?"
+
+#. HTWAIS.c
+#: LYMessages.c:831
+msgid "HTWAIS: Return message too large."
+msgstr "HTWIS: Pesan yang dikembalikan terlalu besar."
+
+#: LYMessages.c:832
+msgid "Enter WAIS query: "
+msgstr "Masukan permintaan WAIS: "
+
+#. Miscellaneous status
+#: LYMessages.c:835
+msgid "Retrying as HTTP0 request."
+msgstr "Mencoba kembali sebagai permintaan HTTPO."
+
+#: LYMessages.c:836
+#, c-format
+msgid "Transferred %d bytes"
+msgstr "Dikirimkan %d bytes"
+
+#: LYMessages.c:837
+msgid "Data transfer complete"
+msgstr "Transfer data selesai"
+
+#: LYMessages.c:838
+#, c-format
+msgid "Error processing line %d of %s\n"
+msgstr "Error memproses baris %d dari %s\n"
+
+#. Lynx internal page titles
+#: LYMessages.c:841
+msgid "Address List Page"
+msgstr "Daftar halaman alamat"
+
+#: LYMessages.c:842
+msgid "Bookmark file"
+msgstr "Berkas bookmark"
+
+#: LYMessages.c:843
+msgid "Configuration Definitions"
+msgstr "Definisi konfigurasi"
+
+#: LYMessages.c:844
+msgid "Cookie Jar"
+msgstr "Cookie Jar"
+
+#: LYMessages.c:845
+msgid "Current Edit-Key Map"
+msgstr "Peta Edit-Key saat ini"
+
+#: LYMessages.c:846
+msgid "Current Key Map"
+msgstr "Peta Kunci Saat Ini"
+
+#: LYMessages.c:847
+msgid "File Management Options"
+msgstr "Opsi Manajemen Berkas"
+
+#: LYMessages.c:848
+msgid "Download Options"
+msgstr "Opsi Unduh"
+
+#: LYMessages.c:849
+msgid "History Page"
+msgstr "Halaman Sejarah"
+
+#: LYMessages.c:850
+msgid "Cache Jar"
+msgstr "Cache Jar"
+
+#: LYMessages.c:851
+msgid "List Page"
+msgstr "Daftar Halaman"
+
+#: LYMessages.c:852
+msgid "Lynx.cfg Information"
+msgstr "Informasi Lynx.cfg"
+
+#: LYMessages.c:853
+msgid "Converted Mosaic Hotlist"
+msgstr "Diubah Mosaic Hotlist"
+
+#: LYMessages.c:854
+msgid "Options Menu"
+msgstr "Menu Opsi"
+
+#: LYMessages.c:855
+msgid "File Permission Options"
+msgstr "Opsi Izin Berkas"
+
+#: LYMessages.c:856
+msgid "Printing Options"
+msgstr "Opsi Pencetakan"
+
+#: LYMessages.c:857
+msgid "Information about the current document"
+msgstr "Informasi mengenai dokumen saat ini"
+
+#: LYMessages.c:858
+msgid "Your recent statusline messages"
+msgstr "Pesan baris status Anda baru baru ini"
+
+#: LYMessages.c:859
+msgid "Upload Options"
+msgstr "Opsi Unggah"
+
+#: LYMessages.c:860
+msgid "Visited Links Page"
+msgstr "Halaman Tautan yang Pernah Dikunjungi"
+
+#. CONFIG_DEF_TITLE subtitles
+#: LYMessages.c:863
+msgid "See also"
+msgstr "Lihat juga"
+
+#: LYMessages.c:864
+msgid "your"
+msgstr "milik Anda"
+
+#: LYMessages.c:865
+msgid "for runtime options"
+msgstr "opsi untuk runtime"
+
+#: LYMessages.c:866
+msgid "compile time options"
+msgstr "opsi waktu kompilasi"
+
+#: LYMessages.c:867
+msgid "color-style configuration"
+msgstr "konfigurasi gaya-warna"
+
+#: LYMessages.c:868
+msgid "latest release"
+msgstr "rilis terakhir"
+
+#: LYMessages.c:869
+msgid "pre-release version"
+msgstr "versi prarilis"
+
+#: LYMessages.c:870
+msgid "development version"
+msgstr "versi pengembangan"
+
+#. #define AUTOCONF_CONFIG_CACHE
+#: LYMessages.c:872
+msgid ""
+"The following data were derived during the automatic configuration/build\n"
+"process of this copy of Lynx. When reporting a bug, please include a copy\n"
+"of this page."
+msgstr ""
+"Data berikut diturunkan ketika proses otomatis konfigurasi/buat\n"
+"dari salinan lynx ini. Ketika melaporkan sebuah bug, mohon masukan\n"
+"sebuah salinan dari halaman ini."
+
+#. #define AUTOCONF_LYNXCFG_H
+#: LYMessages.c:876
+msgid ""
+"The following data were used as automatically-configured compile-time\n"
+"definitions when this copy of Lynx was built."
+msgstr ""
+"Data berikut digunakan sebagai definisi terkonfigurasi otomatis waktu kompilasi\n"
+"ketika salinan dari lynx dibuat."
+
+#. #define DIRED_NOVICELINE
+#: LYMessages.c:881
+msgid " C)reate D)ownload E)dit F)ull menu M)odify R)emove T)ag U)pload \n"
+msgstr " C)reate D)ownload E)dit F)ull menu M)odify R)emove T)ag U)pload \n"
+
+#: LYMessages.c:882
+msgid "Failed to obtain status of current link!"
+msgstr "Gagal untuk memperoleh status dari sambungan sekarang!"
+
+#. #define INVALID_PERMIT_URL
+#: LYMessages.c:885
+msgid "Special URL only valid from current File Permission menu!"
+msgstr "Hanya URL spesial saja yang valid dari menu permisi berkas sekarang!"
+
+#: LYMessages.c:889
+msgid "External support is currently disabled."
+msgstr "Dukungan eksternal saat ini tidak aktif."
+
+#. new with 2.8.4dev.21
+#: LYMessages.c:893
+msgid "Changing working-directory is currently disabled."
+msgstr "Pengubahan direktori kerja saat ini tidak aktif."
+
+#: LYMessages.c:894
+msgid "Linewrap OFF!"
+msgstr "Linewrap OFF!"
+
+#: LYMessages.c:895
+msgid "Linewrap ON!"
+msgstr "Linewrap ON!"
+
+#: LYMessages.c:896
+msgid "Parsing nested-tables toggled OFF! Reloading..."
+msgstr "Parsing nested tables dimatikan! Memuat kembali..."
+
+#: LYMessages.c:897
+msgid "Parsing nested-tables toggled ON! Reloading..."
+msgstr "Parsing nested tables diaktifkan! Memuat kembali..."
+
+#: LYMessages.c:898
+msgid "Shifting is disabled while line-wrap is in effect"
+msgstr "Shifting tidak aktif ketika line-wrap berada dalam efek"
+
+#: LYMessages.c:899
+msgid "Trace not supported"
+msgstr "Trace tidak didukung"
+
+#: LYMessages.c:819
+#, c-format
+msgid "\tIndents: first=%.0f others=%.0f, Height=%.1f Desc=%.1f\n"
+msgstr "\tIndents: pertama=%.0f lain=%.0f, Tinggi=%.1f Desc=%.1f\n"
+
+#: WWW/Library/Implementation/HTAABrow.c:575
+#, c-format
+msgid "username for realm %s changed from %s to %s"
+msgstr "nama pengguna untuk realm %s berubah dari %s ke %s"
+
+#: WWW/Library/Implementation/HTAABrow.c:591
+#, c-format
+msgid "password for realm %s user %s changed"
+msgstr "kata sandi bagi realm %s pengguna %s berubah"
+
+#: WWW/Library/Implementation/HTAABrow.c:703
+#, c-format
+msgid "Username for '%s' at %s '%s%s':"
+msgstr "Nama pengguna untuk '%s' di %s '%s%s':"
+
+#: WWW/Library/Implementation/HTAABrow.c:976
+msgid "This client doesn't know how to compose proxy authorization information for scheme"
+msgstr "Klien ini tidak tahu bagaimana mengisi informasi otorisasi proxy untuk skema"
+
+#: WWW/Library/Implementation/HTAABrow.c:1053
+msgid "This client doesn't know how to compose authorization information for scheme"
+msgstr "Klien ini tidak tahu bagaimana mengisi informasi otorisasi untuk skema"
+
+#: WWW/Library/Implementation/HTAABrow.c:1162
+#, c-format
+msgid "Invalid header '%s%s%s%s%s'"
+msgstr "Header tidak valid '%s%s%s%s%s'"
+
+#: WWW/Library/Implementation/HTAABrow.c:1266
+msgid "Proxy authorization required -- retrying"
+msgstr "Otorisasi proxy dibutuhkan -- memcoba"
+
+#: WWW/Library/Implementation/HTAABrow.c:1322
+msgid "Access without authorization denied -- retrying"
+msgstr "Akses tanpa otorisasi ditolak -- mencoba"
+
+#: WWW/Library/Implementation/HTAccess.c:698
+msgid "Access forbidden by rule"
+msgstr "Akses dilarang oleh aturan"
+
+#: WWW/Library/Implementation/HTAccess.c:800
+msgid "Document with POST content not found in cache. Resubmit?"
+msgstr "Dokumen dengan isi POST tidak ditemukan dalam cache. Kirim kembali?"
+
+#: WWW/Library/Implementation/HTAccess.c:953
+msgid "Loading failed, use a previous copy."
+msgstr "Pemuatan gagal, gunakan salinan sebelumnya."
+
+#: WWW/Library/Implementation/HTAccess.c:1062 src/GridText.c:8939
+msgid "Loading incomplete."
+msgstr "Pemuatan tidak lengkap."
+
+#: WWW/Library/Implementation/HTAccess.c:1093
+#, c-format
+msgid "**** HTAccess: socket or file number returned by obsolete load routine!\n"
+msgstr "**** HHTAccess: socket atau nomor berkas yang dikembalikan oleh pemuatan rutinitas sudah ditinggalkan!\n"
+
+#: WWW/Library/Implementation/HTAccess.c:1095
+#, c-format
+msgid "**** HTAccess: Internal software error. Please mail lynx-dev@nongnu.org!\n"
+msgstr "**** HTAccess: Internal software error. Mohon kirimkan surat ke lynx-dev@nongnu.org!\n"
+
+#: WWW/Library/Implementation/HTAccess.c:1096
+#, c-format
+msgid "**** HTAccess: Status returned was: %d\n"
+msgstr "**** HTAccess: Status yang dikembalikan: %d\n"
+
+#.
+#. * hack: if we fail in HTAccess.c
+#. * avoid duplicating URL, oh.
+#.
+#: WWW/Library/Implementation/HTAccess.c:1102 src/LYMainLoop.c:8076
+msgid "Can't Access"
+msgstr "Tidak dapat mengakses"
+
+#: WWW/Library/Implementation/HTAccess.c:1110
+msgid "Unable to access document."
+msgstr "Tidak dapat mengakses dokumen."
+
+#: WWW/Library/Implementation/HTFTP.c:870
+#, c-format
+msgid "Enter password for user %s@%s:"
+msgstr "Masukan kata sandi untuk pengguna %s@%s:"
+
+#: WWW/Library/Implementation/HTFTP.c:898
+msgid "Unable to connect to FTP host."
+msgstr "Tidak dapat menghubungi ke FTP host."
+
+#: WWW/Library/Implementation/HTFTP.c:1137
+msgid "close master socket"
+msgstr "tutup master socket"
+
+#: WWW/Library/Implementation/HTFTP.c:1195
+msgid "socket for master socket"
+msgstr "socket untuk master socket"
+
+#: WWW/Library/Implementation/HTFTP.c:2925
+msgid "Receiving FTP directory."
+msgstr "Menerima direktori FTP."
+
+#: WWW/Library/Implementation/HTFTP.c:3063
+#, c-format
+msgid "Transferred %d bytes (%5d)"
+msgstr "Ditransfer %d bytes (%5d)"
+
+#: WWW/Library/Implementation/HTFTP.c:3421
+msgid "connect for data"
+msgstr "hubungi untuk data"
+
+#: WWW/Library/Implementation/HTFTP.c:4098
+msgid "Receiving FTP file."
+msgstr "Menerima berkas FTP."
+
+#: WWW/Library/Implementation/HTFinger.c:274
+msgid "Could not set up finger connection."
+msgstr "Tidak dapat menset up koneksi finger."
+
+#: WWW/Library/Implementation/HTFinger.c:321
+msgid "Could not load data (no sitename in finger URL)"
+msgstr "Tidak dapat memuat data (tidak ada nama site dalam finger URL)"
+
+#: WWW/Library/Implementation/HTFinger.c:325
+msgid "Invalid port number - will only use port 79!"
+msgstr "Nomor port tidak valid - hanya akan menggunakan port 79!"
+
+#: WWW/Library/Implementation/HTFinger.c:391
+msgid "Could not access finger host."
+msgstr "Tidak dapat mengakses host finger."
+
+#: WWW/Library/Implementation/HTFinger.c:399
+msgid "No response from finger server."
+msgstr "Tidak ada balasan dari server finger."
+
+#: WWW/Library/Implementation/HTNews.c:439
+#, c-format
+msgid "Username for news host '%s':"
+msgstr "Nama pengguna untuk news host '%s':"
+
+#: WWW/Library/Implementation/HTNews.c:492
+msgid "Change username?"
+msgstr "Ubah nama pengguna?"
+
+#: WWW/Library/Implementation/HTNews.c:496
+msgid "Username:"
+msgstr "Nama pengguna:"
+
+#: WWW/Library/Implementation/HTNews.c:521
+#, c-format
+msgid "Password for news host '%s':"
+msgstr "Kata sandi untuk news host '%s':"
+
+#: WWW/Library/Implementation/HTNews.c:604
+msgid "Change password?"
+msgstr "Ubah kata sandi?"
+
+#: WWW/Library/Implementation/HTNews.c:1725
+#, c-format
+msgid "No matches for: %s"
+msgstr "Tidak cocok untuk: %s"
+
+#: WWW/Library/Implementation/HTNews.c:1775
+msgid ""
+"\n"
+"No articles in this group.\n"
+msgstr ""
+"\n"
+"Tidak ada artikel dalam grup ini.\n"
+
+#: WWW/Library/Implementation/HTNews.c:1787
+msgid ""
+"\n"
+"No articles in this range.\n"
+msgstr ""
+"\n"
+"Tidak ada artikel dalam jangkauan ini.\n"
+
+#.
+#. * Set window title.
+#.
+#: WWW/Library/Implementation/HTNews.c:1800
+#, c-format
+msgid "%s, Articles %d-%d"
+msgstr "%s, Artikel %d-%d"
+
+#: WWW/Library/Implementation/HTNews.c:1823
+msgid "Earlier articles"
+msgstr "Artikel sebelumnya"
+
+#: WWW/Library/Implementation/HTNews.c:1836
+#, c-format
+msgid ""
+"\n"
+"There are about %d articles currently available in %s, IDs as follows:\n"
+"\n"
+msgstr ""
+"\n"
+"Disana ada sekitar %d artikel yang saat ini tersedia dalam %s, ID sebagai berikut:\n"
+"\n"
+
+#: WWW/Library/Implementation/HTNews.c:1898
+msgid "All available articles in "
+msgstr "Semua artikel yang tersedia dalam "
+
+#: WWW/Library/Implementation/HTNews.c:2112
+msgid "Later articles"
+msgstr "Artikel selanjutnya"
+
+#: WWW/Library/Implementation/HTNews.c:2135
+msgid "Post to "
+msgstr "Post ke "
+
+#: WWW/Library/Implementation/HTNews.c:2356
+msgid "This client does not contain support for SNEWS URLs."
+msgstr "Klien ini tidak memiliki dukungan untuk URL SNEWS."
+
+#: WWW/Library/Implementation/HTNews.c:2565
+msgid "No target for raw text!"
+msgstr "Tidak ada target untuk teks mentah!"
+
+#: WWW/Library/Implementation/HTNews.c:2595
+msgid "Connecting to NewsHost ..."
+msgstr "Menghubungi ke NewsHost ..."
+
+#: WWW/Library/Implementation/HTNews.c:2647
+#, c-format
+msgid "Could not access %s."
+msgstr "Tidak dapat mengakses %s."
+
+#: WWW/Library/Implementation/HTNews.c:2753
+#, c-format
+msgid "Can't read news info. News host %.20s responded: %.200s"
+msgstr "Tidak dapat membaca informasi news. News host %.20s dibalas: %.200s"
+
+#: WWW/Library/Implementation/HTNews.c:2757
+#, c-format
+msgid "Can't read news info, empty response from host %s"
+msgstr "Tidak dapat membaca informasi news, balasan kosong dari host %s"
+
+#.
+#. * List available newsgroups. - FM
+#.
+#: WWW/Library/Implementation/HTNews.c:2961
+msgid "Reading list of available newsgroups."
+msgstr "Membaca daftar dari newsgroups yang tersedia."
+
+#: WWW/Library/Implementation/HTNews.c:2982
+msgid "Reading list of articles in newsgroup."
+msgstr "Membaca daftar dari artikel dalam newsgrup."
+
+#.
+#. * Get an article from a news group. - FM
+#.
+#: WWW/Library/Implementation/HTNews.c:2988
+msgid "Reading news article."
+msgstr "Membaca news artikel."
+
+#: WWW/Library/Implementation/HTNews.c:3018
+msgid "Sorry, could not load requested news."
+msgstr "Maaf, tidak dapat memuat berita yang diminta."
+
+#: WWW/Library/Implementation/HTTCP.c:1339
+msgid "Address has invalid port"
+msgstr "Alamat memiliki port tidak valid"
+
+#: WWW/Library/Implementation/HTTCP.c:1410
+msgid "Address length looks invalid"
+msgstr "Panjang alamat kelihatannya tidak valid"
+
+#: WWW/Library/Implementation/HTTCP.c:1868
+msgid "SOCKS5: no hostname found."
+msgstr "SOCKS5: tidak ada nama host yang ditemukan."
+
+#: WWW/Library/Implementation/HTTCP.c:1874
+msgid "SOCKS5: hostname too long."
+msgstr "SOCKS5: nama host terlalu panjang."
+
+#: WWW/Library/Implementation/HTTCP.c:1892
+#, c-format
+msgid "(for %s at %s) SOCKS5"
+msgstr "(untuk %s di %s) SOCKS5"
+
+#: WWW/Library/Implementation/HTTCP.c:1919
+#: WWW/Library/Implementation/HTTCP.c:1936
+#, c-format
+msgid "Unable to locate remote host %s."
+msgstr "Tidak dapat melokasi remote host %s."
+
+#. Not HTProgress, so warning won't be overwritten immediately;
+#. * but not HTAlert, because typically there will be other
+#. * alerts from the callers. - kw
+#.
+#: WWW/Library/Implementation/HTTCP.c:1933
+#: WWW/Library/Implementation/HTTelnet.c:115
+#, c-format
+msgid "Invalid hostname %s"
+msgstr "Nama host tidak valid %s"
+
+#: WWW/Library/Implementation/HTTCP.c:1945
+#, c-format
+msgid "Making %s connection to %s"
+msgstr "Membuat %s koneksi ke %s"
+
+#: WWW/Library/Implementation/HTTCP.c:1955
+msgid "socket failed."
+msgstr "socket gagal."
+
+#: WWW/Library/Implementation/HTTCP.c:1969
+#, c-format
+msgid "socket failed: family %d addr %s port %s."
+msgstr "socket gagal: keluarga %d alamat %s port %s."
+
+#: WWW/Library/Implementation/HTTCP.c:1992
+msgid "Could not make connection non-blocking."
+msgstr "Tidak dapat membuat koneksi tidak terblok."
+
+#: WWW/Library/Implementation/HTTCP.c:2058
+msgid "Connection failed (too many retries)."
+msgstr "Koneksi gagal (terlalu banyak percobaan)."
+
+#: WWW/Library/Implementation/HTTCP.c:2253
+msgid "Could not restore socket to blocking."
+msgstr "Tidak dapat mengembalikan socket ke bloking."
+
+#. RFC 1928: CONNECT request
+#: WWW/Library/Implementation/HTTCP.c:2285
+#, c-format
+msgid "SOCKS5: connecting to %s"
+msgstr "SOCKS5: menyambungkan ke %s"
+
+#: WWW/Library/Implementation/HTTCP.c:2314
+msgid "SOCKS server failure"
+msgstr "Kegagalan server SOCKS"
+
+#: WWW/Library/Implementation/HTTCP.c:2317
+msgid "connection not allowed by ruleset"
+msgstr "koneksi tidak diizinkan oleh ruleset"
+
+#: WWW/Library/Implementation/HTTCP.c:2320
+msgid "network unreachable"
+msgstr "jaringan tak dapat dijangkau"
+
+#: WWW/Library/Implementation/HTTCP.c:2323
+msgid "host unreachable"
+msgstr "host tak dapat dihubungi"
+
+#: WWW/Library/Implementation/HTTCP.c:2326
+msgid "connection refused"
+msgstr "koneksi ditolak"
+
+#: WWW/Library/Implementation/HTTCP.c:2329
+msgid "TTL expired"
+msgstr "TTL kedaluwarsa"
+
+#: WWW/Library/Implementation/HTTCP.c:2332
+msgid "command not supported"
+msgstr "perintah tidak didukung"
+
+#: WWW/Library/Implementation/HTTCP.c:2335
+msgid "address type not supported"
+msgstr "tipe alamat tidak didukung"
+
+#: WWW/Library/Implementation/HTTCP.c:2338
+msgid "unknown SOCKS error code"
+msgstr "kode galat SOCKS tidak diketahui"
+
+#: WWW/Library/Implementation/HTTCP.c:2383
+msgid "unexpected reply\n"
+msgstr "balasan tak terduga\n"
+
+#: WWW/Library/Implementation/HTTCP.c:2460
+msgid "Socket read failed (too many tries)."
+msgstr "Pembacaan socket gagal (terlalu banyak percobaan)."
+
+#: WWW/Library/Implementation/HTTP.c:165
+#, c-format
+msgid "SSL callback:%s, preverify_ok=%d, ssl_okay=%d"
+msgstr "SSL callback:%s, preverify_ok=%d, ssl_okay=%d"
+
+#: WWW/Library/Implementation/HTTP.c:668
+#, c-format
+msgid "User/password contains only punctuation: %s"
+msgstr "Pengguna/kata sandi hanya berisi tanda baca: %s"
+
+#: WWW/Library/Implementation/HTTP.c:672
+#, c-format
+msgid "User/password may be confused with hostname: '%s' (e.g, '%s')"
+msgstr "Pengguna/kata sandi mungkin dibingungkan dengan nama host: '%s' (mis., '%s')"
+
+#: WWW/Library/Implementation/HTTP.c:733
+#, c-format
+msgid "Certificate issued by: %s"
+msgstr "Sertifikan diisukan oleh: %s"
+
+#: WWW/Library/Implementation/HTTP.c:922
+msgid "This client does not contain support for HTTPS URLs."
+msgstr "Klien ini tidak berisi dukungan untuk URL HTTPS."
+
+#: WWW/Library/Implementation/HTTP.c:947
+msgid "Unable to connect to remote host."
+msgstr "Tidak dapat menghubungi ke remote host."
+
+#: WWW/Library/Implementation/HTTP.c:990
+msgid "Retrying connection without TLS."
+msgstr "Mencoba koneksi tanpa TLS."
+
+#: WWW/Library/Implementation/HTTP.c:1042
+msgid "GnuTLS error when trying to verify certificate."
+msgstr "Galat GnuTLS ketika mencoba memverifikasi sertifikat."
+
+#: WWW/Library/Implementation/HTTP.c:1055
+msgid "the certificate has no known issuer"
+msgstr "sertifikat tidak memiliki penerbit yang diketahui"
+
+#: WWW/Library/Implementation/HTTP.c:1057
+msgid "no issuer was found"
+msgstr "tidak ada penerbit yang ditemukan"
+
+#: WWW/Library/Implementation/HTTP.c:1059
+msgid "issuer is not a CA"
+msgstr "penerbit bukan sebuah CA"
+
+#: WWW/Library/Implementation/HTTP.c:1061
+msgid "the certificate has been revoked"
+msgstr "sertifikat telah dicabut"
+
+#: WWW/Library/Implementation/HTTP.c:1063
+msgid "the certificate is not trusted"
+msgstr "sertifikat tidak dipercaya"
+
+#: WWW/Library/Implementation/HTTP.c:1138
+#, c-format
+msgid "Verified connection to %s (cert=%s)"
+msgstr "Koneksi terverifikasi ke %s (cert=%s)"
+
+#: WWW/Library/Implementation/HTTP.c:1188
+#: WWW/Library/Implementation/HTTP.c:1230
+#, c-format
+msgid "Verified connection to %s (subj=%s)"
+msgstr "Koneksi terverifikasi ke %s (subj=%s)"
+
+#: WWW/Library/Implementation/HTTP.c:1260
+msgid "Can't find common name in certificate"
+msgstr "Tidak dapat menemukan nama sama dalam sertifikat"
+
+#: WWW/Library/Implementation/HTTP.c:1263
+#, c-format
+msgid "SSL error:host(%s)!=cert(%s)-Continue?"
+msgstr "SSL error:host(%s)!=cert(%s)-Lanjutkan?"
+
+#: WWW/Library/Implementation/HTTP.c:1270
+msgid "SSL error"
+msgstr "Galat SSL"
+
+#: WWW/Library/Implementation/HTTP.c:1278
+#, c-format
+msgid "UNVERIFIED connection to %s (cert=%s)"
+msgstr "Koneksi TIDAK TERVERIFIKASI ke %s (cert=%s)"
+
+#: WWW/Library/Implementation/HTTP.c:1287
+#, c-format
+msgid "Secure %d-bit %s (%s) HTTP connection"
+msgstr "Aman %d-bit %s (%s) koneksi HTTP"
+
+#: WWW/Library/Implementation/HTTP.c:1757
+msgid "Sending HTTP request."
+msgstr "Mengirimkan permintaan HTTP."
+
+#: WWW/Library/Implementation/HTTP.c:1799
+msgid "Unexpected network write error; connection aborted."
+msgstr "Tidak terduga penulisan jaringan error: koneksi dibatalkan."
+
+#: WWW/Library/Implementation/HTTP.c:1805
+msgid "HTTP request sent; waiting for response."
+msgstr "Permintaan HTTP dikirimkan; menunggu balasan."
+
+#: WWW/Library/Implementation/HTTP.c:1878
+#: WWW/Library/Implementation/HTTP.c:1888
+msgid "Unexpected network read error; connection aborted."
+msgstr "Tidak terduga pembacaan jaringan error; koneksi dibatalkan."
+
+#.
+#. * HTTP/1.1 Informational statuses.
+#. * 100 Continue.
+#. * 101 Switching Protocols.
+#. * > 101 is unknown.
+#. * We should never get these, and they have only the status
+#. * line and possibly other headers, so we'll deal with them by
+#. * showing the full header to the user as text/plain. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2091
+msgid "Got unexpected Informational Status."
+msgstr "Diperoleh Status Informasi tidak terduga."
+
+#.
+#. * Reset Content. The server has fulfilled the request but
+#. * nothing is returned and we should reset any form
+#. * content. We'll instruct the user to do that, and
+#. * restore the current document. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2125
+msgid "Request fulfilled. Reset Content."
+msgstr "Permintaan dipenuhi. Reset Isi."
+
+#. Not Modified
+#.
+#. * We didn't send an "If-Modified-Since" header, so this
+#. * status is inappropriate. We'll deal with it by showing
+#. * the full header to the user as text/plain. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2242
+msgid "Got unexpected 304 Not Modified status."
+msgstr "Diperoleh tidak terduga 304 status Tidak Termodifikasi."
+
+#: WWW/Library/Implementation/HTTP.c:2305
+msgid "Redirection of POST content requires user approval."
+msgstr "Redireksi dari isi POST membutuhkan persetujuan pengguna."
+
+#: WWW/Library/Implementation/HTTP.c:2320
+msgid "Have POST content. Treating Permanent Redirection as Temporary.\n"
+msgstr "Memiliki isi POST. Memperlakukan Redireksi Permanen sebagai Sementara.\n"
+
+#: WWW/Library/Implementation/HTTP.c:2366
+msgid "Retrying with access authorization information."
+msgstr "Mencoba kembali dengan informasi otorisasi akses."
+
+#: WWW/Library/Implementation/HTTP.c:2378
+msgid "Show the 401 message body?"
+msgstr "Tampilkan tubuh pesan 401?"
+
+#: WWW/Library/Implementation/HTTP.c:2422
+msgid "Show the 407 message body?"
+msgstr "Tampilkan tubuh pesan 407?"
+
+#.
+#. * Bad or unknown server_status number. Take a chance and hope
+#. * there is something to display. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2522
+msgid "Unknown status reply from server!"
+msgstr "Balasan status dari server tidak diketahui!"
+
+#: WWW/Library/Implementation/HTTelnet.c:113
+#, c-format
+msgid "remote %s session:"
+msgstr "remote %s sesi:"
+
+#: WWW/Library/Implementation/HTWAIS.c:163
+msgid "Could not connect to WAIS server."
+msgstr "Tidak dapat menghubungi ke server WAIS."
+
+#: WWW/Library/Implementation/HTWAIS.c:171
+msgid "Could not open WAIS connection for reading."
+msgstr "Tidak dapat membuka koneksi WAIS untuk pembacaan."
+
+#: WWW/Library/Implementation/HTWAIS.c:193
+msgid "Diagnostic code is "
+msgstr "Kode diagnosa adalah "
+
+#: WWW/Library/Implementation/HTWAIS.c:460
+msgid "Index "
+msgstr "Indeks "
+
+#: WWW/Library/Implementation/HTWAIS.c:464
+#, c-format
+msgid " contains the following %d item%s relevant to \""
+msgstr " berisi %d berikut item%s relevan ke \""
+
+#: WWW/Library/Implementation/HTWAIS.c:472
+msgid "The first figure after each entry is its relative score, "
+msgstr "Gambar pertama setelah setiap entri adalah nilai relatifnya, "
+
+#: WWW/Library/Implementation/HTWAIS.c:473
+msgid "the second is the number of lines in the item."
+msgstr "kedua adalah jumlah dari baris dalam item."
+
+#: WWW/Library/Implementation/HTWAIS.c:515
+msgid " (bad file name)"
+msgstr " (nama berkas buruk)"
+
+#: WWW/Library/Implementation/HTWAIS.c:541
+msgid "(bad doc id)"
+msgstr "(doc id buruk)"
+
+#: WWW/Library/Implementation/HTWAIS.c:557
+msgid "(Short Header record, can't display)"
+msgstr "(Rekaman header Pendek, tidak dapat menampilkan)"
+
+#: WWW/Library/Implementation/HTWAIS.c:564
+msgid ""
+"\n"
+"Long Header record, can't display\n"
+msgstr ""
+"\n"
+"rekaman Header panjang, tidak dapat menampilkan\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:571
+msgid ""
+"\n"
+"Text record\n"
+msgstr ""
+"\n"
+"Rekaman teks\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:580
+msgid ""
+"\n"
+"Headline record, can't display\n"
+msgstr ""
+"\n"
+"Rekaman headline, tidak dapat menampilkan\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:588
+msgid ""
+"\n"
+"Code record, can't display\n"
+msgstr ""
+"\n"
+"Rekaman kode, tidak dapat menampilkan\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:692
+msgid "Syntax error in WAIS URL"
+msgstr "Sintaks error dalam URL WAIS"
+
+#: WWW/Library/Implementation/HTWAIS.c:764
+msgid " (WAIS Index)"
+msgstr " (Indeks WAIS)"
+
+#: WWW/Library/Implementation/HTWAIS.c:771
+msgid "WAIS Index: "
+msgstr "Indeks WAIS: "
+
+#: WWW/Library/Implementation/HTWAIS.c:777
+msgid "This is a link for searching the "
+msgstr "Ini adalah sebuah link untuk pencarian "
+
+#: WWW/Library/Implementation/HTWAIS.c:781
+msgid " WAIS Index.\n"
+msgstr " Indeks WAIS.\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:810
+msgid ""
+"\n"
+"Enter the 's'earch command and then specify search words.\n"
+msgstr ""
+"\n"
+"Masukan perintah s'each dan kemudian spesifikasikan kata pencarian.\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:832
+msgid " (in "
+msgstr " (in "
+
+#: WWW/Library/Implementation/HTWAIS.c:841
+msgid "WAIS Search of \""
+msgstr "WAIS Pencarian dari \""
+
+#: WWW/Library/Implementation/HTWAIS.c:845
+msgid "\" in: "
+msgstr "\" dalam: "
+
+#: WWW/Library/Implementation/HTWAIS.c:860
+msgid "HTWAIS: Request too large."
+msgstr "HTWAIS: Permintaan terlalu besar."
+
+#: WWW/Library/Implementation/HTWAIS.c:869
+msgid "Searching WAIS database..."
+msgstr "Pencarian basis data WAIS..."
+
+#: WWW/Library/Implementation/HTWAIS.c:879
+msgid "Search interrupted."
+msgstr "Pencarian terinterupsi."
+
+#: WWW/Library/Implementation/HTWAIS.c:930
+msgid "Can't convert format of WAIS document"
+msgstr "Tidak dapat mengubah format dari dokumen WAIS"
+
+#: WWW/Library/Implementation/HTWAIS.c:974
+msgid "HTWAIS: Request too long."
+msgstr "HTWAIS: Permintaan terlalu panjang."
+
+#.
+#. * Actually do the transaction given by request_message.
+#.
+#: WWW/Library/Implementation/HTWAIS.c:988
+msgid "Fetching WAIS document..."
+msgstr "Mengambil dokumen WAIS..."
+
+#. display_search_response(target, retrieval_response,
+#. wais_database, keywords);
+#: WWW/Library/Implementation/HTWAIS.c:1027
+msgid "No text was returned!\n"
+msgstr "Tidak ada teks yang dikembalikan!\n"
+
+#: WWW/Library/Implementation/HTWSRC.c:302
+msgid " NOT GIVEN in source file; "
+msgstr " TIDAK DIBERIKAN dalam berkas sumber; "
+
+#: WWW/Library/Implementation/HTWSRC.c:325
+msgid " WAIS source file"
+msgstr " berkas sumber WAIS"
+
+#: WWW/Library/Implementation/HTWSRC.c:332
+msgid " description"
+msgstr " deskripsi"
+
+#: WWW/Library/Implementation/HTWSRC.c:342
+msgid "Access links"
+msgstr "Tautan akses"
+
+#: WWW/Library/Implementation/HTWSRC.c:363
+msgid "Direct access"
+msgstr "Akses langsung"
+
+#. * Proxy will be used if defined, so let user know that - FM *
+#: WWW/Library/Implementation/HTWSRC.c:366
+msgid " (or via proxy server, if defined)"
+msgstr " (atau melalui server proxy, jika didefinisikan)"
+
+#: WWW/Library/Implementation/HTWSRC.c:381
+msgid "Maintainer"
+msgstr "Pengelola"
+
+#: WWW/Library/Implementation/HTWSRC.c:389
+msgid "Host"
+msgstr "Host"
+
+#: src/GridText.c:723
+msgid "Memory exhausted, display interrupted!"
+msgstr "Kehabisan memori, penampilan terinterupsi!"
+
+#: src/GridText.c:728
+msgid "Memory exhausted, will interrupt transfer!"
+msgstr "Kehabisan memori, akan menginterupsi transfer!"
+
+#: src/GridText.c:1719
+#, c-format
+msgid " (l%d of %d)"
+msgstr " (l%d dari %d)"
+
+#: src/GridText.c:1728
+#, c-format
+msgid " (p%d of %d)"
+msgstr " (p%d dari %d)"
+
+#: src/GridText.c:3720
+msgid " *** MEMORY EXHAUSTED ***"
+msgstr " *** KEHABISAN MEMORI ***"
+
+#: src/GridText.c:6220
+msgid "text entry field"
+msgstr "daerah masukan teks"
+
+#: src/GridText.c:6223
+msgid "password entry field"
+msgstr "daerah masukan kata sandi"
+
+#: src/GridText.c:6226
+msgid "checkbox"
+msgstr "checkbox"
+
+#: src/GridText.c:6229
+msgid "radio button"
+msgstr "tombol radio"
+
+#: src/GridText.c:6232
+msgid "submit button"
+msgstr "tombol kirim"
+
+#: src/GridText.c:6235
+msgid "reset button"
+msgstr "tombol reset"
+
+#: src/GridText.c:6238
+msgid "script button"
+msgstr "tombol kirim"
+
+#: src/GridText.c:6241
+msgid "popup menu"
+msgstr "menu popup"
+
+#: src/GridText.c:6244
+msgid "hidden form field"
+msgstr "daerah formulir tersembunyi"
+
+#: src/GridText.c:6247
+msgid "text entry area"
+msgstr "daerah masukan teks"
+
+#: src/GridText.c:6250
+msgid "range entry field"
+msgstr "daerah masukan jangkauan"
+
+#: src/GridText.c:6253
+msgid "file entry field"
+msgstr "daerah masukan berkas"
+
+#: src/GridText.c:6256
+msgid "text-submit field"
+msgstr "daerah teks-kirim"
+
+#: src/GridText.c:6259
+msgid "image-submit button"
+msgstr "tombol gambar-kirim"
+
+#: src/GridText.c:6262
+msgid "keygen field"
+msgstr "daerah keygen"
+
+#: src/GridText.c:6265
+msgid "unknown form field"
+msgstr "daerah formulir tidak diketahui"
+
+#: src/GridText.c:6285 src/GridText.c:6292 src/LYList.c:249
+msgid "unknown field or link"
+msgstr "field atau link tidak diketahui"
+
+#: src/GridText.c:10722
+msgid "Can't open file for uploading"
+msgstr "Tidak dapat membuka berkas untuk upload"
+
+#: src/GridText.c:11910
+#, c-format
+msgid "Submitting %s"
+msgstr "Mengirimkan %s"
+
+#. ugliness has happened; inform user and do the best we can
+#: src/GridText.c:12980
+msgid "Hang Detect: TextAnchor struct corrupted - suggest aborting!"
+msgstr "Hang Deteksi: TextAnchor struct terkorupsi - disarankan untuk dibatalkan!"
+
+#. don't show previous state
+#: src/GridText.c:13139
+msgid "Wrap lines to fit displayed area?"
+msgstr "Potong baris untuk menyesuaikan daerah penampilan?"
+
+#: src/GridText.c:13772
+msgid "Very long lines have been truncated!"
+msgstr "Baris sangat panjang telah dipotong!"
+
+#: src/HTAlert.c:164 src/LYShowInfo.c:389 src/LYShowInfo.c:393
+msgid "bytes"
+msgstr "byte"
+
+#.
+#. * If we know the total size of the file, we can compute
+#. * a percentage, and show a corresponding progress bar.
+#.
+#: src/HTAlert.c:328 src/HTAlert.c:354
+#, c-format
+msgid "Read %s of data"
+msgstr "Terbaca %s dari data"
+
+#: src/HTAlert.c:351
+#, c-format
+msgid "Read %s of %s of data"
+msgstr "Terbaca %s dari %s dari data"
+
+#: src/HTAlert.c:360
+#, c-format
+msgid ", %s/sec"
+msgstr ", %s/detik"
+
+#: src/HTAlert.c:374
+#, c-format
+msgid " (stalled for %s)"
+msgstr " (berhenti untuk %s)"
+
+#: src/HTAlert.c:378
+#, c-format
+msgid ", ETA %s"
+msgstr ", ETA %s"
+
+#: src/HTAlert.c:400
+msgid " (Press 'z' to abort)"
+msgstr " (Tekan 'z' untuk membatalkan)"
+
+#. Meta-note: don't move the following note from its place right
+#. in front of the first gettext(). As it is now, it should
+#. automatically appear in generated lynx.pot files. - kw
+#.
+#. NOTE TO TRANSLATORS: If you provide a translation for "yes", lynx
+#. * will take the first byte of the translation as a positive response
+#. * to Yes/No questions. If you provide a translation for "no", lynx
+#. * will take the first byte of the translation as a negative response
+#. * to Yes/No questions. For both, lynx will also try to show the
+#. * first byte in the prompt as a character, instead of (y) or (n),
+#. * respectively. This will not work right for multibyte charsets!
+#. * Don't translate "yes" and "no" for CJK character sets (or translate
+#. * them to "yes" and "no"). For a translation using UTF-8, don't
+#. * translate if the translation would begin with anything but a 7-bit
+#. * (US_ASCII) character. That also means do not translate if the
+#. * translation would begin with anything but a 7-bit character, if
+#. * you use a single-byte character encoding (a charset like ISO-8859-n)
+#. * but anticipate that the message catalog may be used re-encoded in
+#. * UTF-8 form.
+#. * For translations using other character sets, you may also wish to
+#. * leave "yes" and "no" untranslated, if using (y) and (n) is the
+#. * preferred behavior.
+#. * Lynx will also accept y Y n N as responses unless there is a conflict
+#. * with the first letter of the "yes" or "no" translation.
+#.
+#: src/HTAlert.c:438 src/HTAlert.c:486
+msgid "yes"
+msgstr "ya"
+
+#: src/HTAlert.c:441 src/HTAlert.c:487
+msgid "no"
+msgstr "tidak"
+
+#.
+#. * Special-purpose workaround for gettext support (we should do
+#. * this in a more general way) -TD
+#. *
+#. * NOTE TO TRANSLATORS: If the prompt has been rendered into
+#. * another language, and if yes/no are distinct, assume the
+#. * translator can make an ordered list in parentheses with one
+#. * capital letter for each as we assumed in HTConfirmDefault().
+#. * The list has to be in the same order as in the original message,
+#. * and the four capital letters chosen to not match those in the
+#. * original unless they have the same position.
+#. *
+#. * Example:
+#. * (Y/N/Always/neVer) - English (original)
+#. * (O/N/Toujours/Jamais) - French
+#.
+#: src/HTAlert.c:938
+msgid "Y/N/A/V"
+msgstr "Y/T/S/P"
+
+#: src/HTML.c:5769
+msgid "Description:"
+msgstr "Deskripsi:"
+
+#: src/HTML.c:5774
+msgid "(none)"
+msgstr "(kosong)"
+
+#: src/HTML.c:5778
+msgid "Filepath:"
+msgstr "Jalur berkas:"
+
+#: src/HTML.c:5784
+msgid "(unknown)"
+msgstr "(tidak diketahui)"
+
+#: src/HTML.c:7224
+msgid "Document has only hidden links. Use the 'l'ist command."
+msgstr "Dokumen hanya memiliki link tersembunyi. Gunakan perintah l."
+
+#: src/HTML.c:7725
+msgid "Source cache error - disk full?"
+msgstr "Cache sumber error - disk penuh?"
+
+#: src/HTML.c:7738
+msgid "Source cache error - not enough memory!"
+msgstr "Cache sumber error - tidak cukup memori!"
+
+#: src/LYBookmark.c:167
+msgid ""
+" This file is an HTML representation of the X Mosaic hotlist file.\n"
+" Outdated or invalid links may be removed by using the\n"
+" remove bookmark command, it is usually the 'R' key but may have\n"
+" been remapped by you or your system administrator."
+msgstr ""
+" Berkas ini adalah sebuah representasi HTML dari berkas hotlist X Mosaic.\n"
+" Outdated atau link tidak valid dapat dihapus menggunakan perintah hapus\n"
+" bookmark, ini biasanya dengan tombol 'R' tetapi mungkin telah dipetakan\n"
+" oleh Anda atau sistem administrasi Anda."
+
+#: src/LYBookmark.c:380
+#, c-format
+msgid ""
+" You can delete links by the 'R' key<br>\n"
+"<ol>\n"
+msgstr ""
+" Anda dapat menghapus link dengan tombol 'R'<br>\n"
+"<ol>\n"
+
+#: src/LYBookmark.c:383
+msgid ""
+" You can delete links using the remove bookmark command. It is usually\n"
+" the 'R' key but may have been remapped by you or your system\n"
+" administrator."
+msgstr ""
+" Anda dapat menghapus link menggunakan perintah hapus bookmark. Ini\n"
+" biasanya tombol 'R' tetapi mungkin telah dipetakan oleh Anda atau\n"
+" sistem administrator Anda."
+
+#: src/LYBookmark.c:387
+msgid ""
+" This file also may be edited with a standard text editor to delete\n"
+" outdated or invalid links, or to change their order."
+msgstr ""
+" Berkas ini juga mungkin telah diubah dengan pengubah teks standar\n"
+" untuk menghapus outdated atau links tidak valid, atau mengubah urutannya."
+
+#: src/LYBookmark.c:390
+msgid ""
+"Note: if you edit this file manually\n"
+" you should not change the format within the lines\n"
+" or add other HTML markup.\n"
+" Make sure any bookmark link is saved as a single line."
+msgstr ""
+"Catat: jika Anda mengubah berkas ini secara manual\n"
+" Anda seharusnya tidak mengubah format didalam baris\n"
+" atau menambahkan markup HTML.\n"
+" Pastikan link bookmark disimpan sebagai sebuah baris tunggal."
+
+#: src/LYBookmark.c:686
+#, c-format
+msgid "File may be recoverable from %s during this session"
+msgstr "Berkas mungkin dapat direkover dari %s selama sesi ini"
+
+#: src/LYCgi.c:161
+#, c-format
+msgid "Do you want to execute \"%s\"?"
+msgstr "Anda ingin menjalankan \"%s\"?"
+
+#.
+#. * Neither the path as given nor any components examined by backing up
+#. * were stat()able. - kw
+#.
+#: src/LYCgi.c:276
+msgid "Unable to access cgi script"
+msgstr "Tidak dapat mengakses script cgi"
+
+#: src/LYCgi.c:709 src/LYCgi.c:712
+msgid "Good Advice"
+msgstr "Saran Baik"
+
+#: src/LYCgi.c:716
+msgid "An excellent http server for VMS is available via"
+msgstr "Sebuah server https sempurna untuk VMS tesedia melalui"
+
+#: src/LYCgi.c:723
+msgid "this link"
+msgstr "link ini"
+
+#: src/LYCgi.c:727
+msgid "It provides state of the art CGI script support.\n"
+msgstr "Ini menyediakan dukungan CGI script terbaik.\n"
+
+#: src/LYClean.c:115
+msgid "Exiting via interrupt:"
+msgstr "Keluar melalui interupsi:"
+
+#: src/LYCookie.c:2651
+msgid "(from a previous session)"
+msgstr "(daeri sebuah sesi sebelumnya)"
+
+#: src/LYCookie.c:2712
+msgid "Maximum Gobble Date:"
+msgstr "Maksimal Tanggal Gobble:"
+
+#: src/LYCookie.c:2751
+msgid "Internal"
+msgstr "Internal"
+
+#: src/LYCookie.c:2752
+msgid "cookie_domain_flag_set error, aborting program"
+msgstr "cookie_domain_flag_set error, membatalkan aplikasi"
+
+#: src/LYCurses.c:1136
+msgid "Terminal reinitialisation failed - unknown terminal type?"
+msgstr "Inisialisasi ulang terminal gagal - tipe terminal tidak diketahui?"
+
+#: src/LYCurses.c:1343
+msgid "Terminal initialisation failed - unknown terminal type?"
+msgstr "Inisialisasi terminal gagal - tipe terminal tidak diketahui?"
+
+#: src/LYCurses.c:1837
+msgid "Terminal ="
+msgstr "Terminal ="
+
+#: src/LYCurses.c:1841
+msgid "You must use a vt100, 200, etc. terminal with this program."
+msgstr "Anda harus menggunakan sebuah vt100, 200, etc. terminal dengan aplikasi ini."
+
+#: src/LYCurses.c:1890
+msgid "Your Terminal type is unknown!"
+msgstr "Tipe terminal Anda tidak diketahui!"
+
+#: src/LYCurses.c:1891
+msgid "Enter a terminal type:"
+msgstr "Masukan sebuah tipe terminal:"
+
+#: src/LYCurses.c:1905
+msgid "TERMINAL TYPE IS SET TO"
+msgstr "TIPE TERMINAL DISET KE"
+
+#: src/LYCurses.c:2464
+#, c-format
+msgid ""
+"\n"
+"A Fatal error has occurred in %s Ver. %s\n"
+msgstr ""
+"\n"
+"Sebuah Fatal error telah terjadi dalam %s Ver. %s\n"
+
+#: src/LYCurses.c:2467
+#, c-format
+msgid ""
+"\n"
+"Please notify your system administrator to confirm a bug, and if\n"
+"confirmed, to notify the lynx-dev list. Bug reports should have concise\n"
+"descriptions of the command and/or URL which causes the problem, the\n"
+"operating system name with version number, the TCPIP implementation, the\n"
+"TRACEBACK if it can be captured, and any other relevant information.\n"
+msgstr ""
+"\n"
+"Mohon notifikasi sistem administrator Anda untuk mengkonfirmasi sebuah bug,\n"
+"dan jika terkonfirmasi, untuk menotifikasi ke daftar lynx-dev. Laporan bug\n"
+"seharusnya memiliki deskripsi singkat dari perintah dan/atau URL yang\n"
+"menyebabkan masalah, nama sistem operasi dengan nomor versi, implementasi\n"
+"TCPIP, TRACKBACK jika ini dapat ditangkap, dan informasi lain yang berhubungan.\n"
+
+#: src/LYEdit.c:272
+#, c-format
+msgid "Error starting editor, %s"
+msgstr "Error memulai pengubah, %s"
+
+#: src/LYEdit.c:275
+msgid "Editor killed by signal"
+msgstr "Pengubah dihentikan oleh sinyal"
+
+#: src/LYEdit.c:280
+#, c-format
+msgid "Editor returned with error status %s"
+msgstr "Pengubah kembali dengan status error %s"
+
+#: src/LYDownload.c:511
+msgid "Downloaded link:"
+msgstr "Link terunduh:"
+
+#: src/LYDownload.c:516
+msgid "Suggested file name:"
+msgstr "Nama berkas yang disarankan:"
+
+#: src/LYDownload.c:521
+msgid "Standard download options:"
+msgstr "Opsi unduh standar:"
+
+#: src/LYDownload.c:522
+msgid "Download options:"
+msgstr "Opsi unduh:"
+
+#: src/LYDownload.c:538
+msgid "Save to disk"
+msgstr "Simpan ke disk"
+
+#: src/LYDownload.c:552
+msgid "View temporary file"
+msgstr "Lihat berkas sementara"
+
+#: src/LYDownload.c:559
+msgid "Save to disk disabled."
+msgstr "Simpan ke disk tidak aktif."
+
+#: src/LYDownload.c:563 src/LYPrint.c:1331
+msgid "Local additions:"
+msgstr "Penambahan lokal:"
+
+#: src/LYDownload.c:574 src/LYUpload.c:206
+msgid "No Name Given"
+msgstr "Tidak ada nama yang diberikan"
+
+#: src/LYHistory.c:673
+msgid "You selected:"
+msgstr "Pilihan Anda:"
+
+#: src/LYHistory.c:697 src/LYHistory.c:926
+msgid "(no address)"
+msgstr "(tidak ada alamat)"
+
+#: src/LYHistory.c:701
+msgid " (internal)"
+msgstr " (internal)"
+
+#: src/LYHistory.c:703
+msgid " (was internal)"
+msgstr " (adalah internal)"
+
+#: src/LYHistory.c:801
+msgid " (From History)"
+msgstr " (Dari Sejarah)"
+
+#: src/LYHistory.c:846
+msgid "You visited (POSTs, bookmark, menu and list files excluded):"
+msgstr "Anda telah mengunjungi (POST, bookmark, menu dan daftar berkas diabaikan):"
+
+#: src/LYHistory.c:1148
+msgid "(No messages yet)"
+msgstr "(Belum ada pesan)"
+
+#: src/LYLeaks.c:222
+msgid "Invalid pointer detected."
+msgstr "Penunjuk tidak valid terdeteksi."
+
+#: src/LYLeaks.c:224 src/LYLeaks.c:262
+msgid "Sequence:"
+msgstr "Urutan:"
+
+#: src/LYLeaks.c:227 src/LYLeaks.c:265
+msgid "Pointer:"
+msgstr "Penunjuk:"
+
+#: src/LYLeaks.c:236 src/LYLeaks.c:243 src/LYLeaks.c:284
+msgid "FileName:"
+msgstr "Nama Berkas:"
+
+#: src/LYLeaks.c:239 src/LYLeaks.c:246 src/LYLeaks.c:287 src/LYLeaks.c:298
+msgid "LineCount:"
+msgstr "Jumlah Baris:"
+
+#: src/LYLeaks.c:260
+msgid "Memory leak detected."
+msgstr "Kebocoran memori terdeteksi."
+
+#: src/LYLeaks.c:268
+msgid "Contains:"
+msgstr "Berisi:"
+
+#: src/LYLeaks.c:281
+msgid "ByteSize:"
+msgstr "Ukuran Byte:"
+
+#: src/LYLeaks.c:295
+msgid "realloced:"
+msgstr "realokasi:"
+
+#: src/LYLeaks.c:316
+msgid "Total memory leakage this run:"
+msgstr "Total kebocoran memori saat ini:"
+
+#: src/LYLeaks.c:320
+msgid "Peak allocation"
+msgstr "Puncak alokasi"
+
+#: src/LYLeaks.c:322
+msgid "Bytes allocated"
+msgstr "Byte alokasi"
+
+#: src/LYLeaks.c:324
+msgid "Total mallocs"
+msgstr "Total mallocs"
+
+#: src/LYLeaks.c:326
+msgid "Total frees"
+msgstr "Total frees"
+
+#: src/LYList.c:89
+msgid "References in "
+msgstr "References dalam "
+
+#: src/LYList.c:92
+msgid "this document:"
+msgstr "dokumen ini:"
+
+#: src/LYList.c:98 src/LYList.c:363
+msgid "Visible links:"
+msgstr "Sambungan yang terlihat:"
+
+#: src/LYList.c:202 src/LYList.c:322
+msgid "Hidden links:"
+msgstr "Sambungan tersembunyi:"
+
+#: src/LYList.c:359
+msgid "References"
+msgstr "Referensi"
+
+#: src/LYLocal.c:289
+#, c-format
+msgid "Unable to get status of '%s'."
+msgstr "Tidak dapat memperoleh status dari '%s'."
+
+#: src/LYLocal.c:354
+msgid "The selected item is not a file or a directory! Request ignored."
+msgstr "Item yang dipilih bukan sebuah berkas atau sebuah direktori! Permintaan ditolak."
+
+#: src/LYLocal.c:456
+#, c-format
+msgid "Unable to %s due to system error!"
+msgstr "Tidak dapat ke %s karena sistem error!"
+
+#: src/LYLocal.c:490
+#, c-format
+msgid "Probable failure to %s due to system error!"
+msgstr "Mungkin gagal ke %s karena sistem error!"
+
+#: src/LYLocal.c:555 src/LYLocal.c:578
+#, c-format
+msgid "remove %s"
+msgstr "hapus %s"
+
+#: src/LYLocal.c:598
+#, c-format
+msgid "touch %s"
+msgstr "sentuh %s"
+
+#: src/LYLocal.c:628
+#, c-format
+msgid "move %s to %s"
+msgstr "pindahkan %s ke %s"
+
+#: src/LYLocal.c:676
+msgid "There is already a directory with that name! Request ignored."
+msgstr "Telah ada sebuah direktori dengan nama itu! Permintaan diabaikan."
+
+#: src/LYLocal.c:678
+msgid "There is already a file with that name! Request ignored."
+msgstr "Telah ada sebuah berkas dengan nama itu! Permintaan diabaikan."
+
+#: src/LYLocal.c:680
+msgid "The specified name is already in use! Request ignored."
+msgstr "Nama yang dispesifikasikan telah digunakan! Permintaan diabaikan."
+
+#: src/LYLocal.c:692
+msgid "Destination has different owner! Request denied."
+msgstr "Tujuan memiliki pemilik yang berbeda! Permintaan ditolak."
+
+#: src/LYLocal.c:695
+msgid "Destination is not a valid directory! Request denied."
+msgstr "Tujuan bukan sebuah direktori yang valid! Permintaan ditolak."
+
+#: src/LYLocal.c:711
+msgid "Source and destination are the same location! Request ignored!"
+msgstr "Sumber dan tujuan berada dilokasi yang sama! Permintaan diabaikan!"
+
+#: src/LYLocal.c:735
+msgid "Remove all tagged files and directories?"
+msgstr "Hapus seluruh berkas dan direktori yang ditandai?"
+
+#: src/LYLocal.c:808
+msgid "Enter new location for tagged items: "
+msgstr "Masukan lokasi baru untuk tagged items: "
+
+#: src/LYLocal.c:906
+msgid "Enter new name for directory: "
+msgstr "Masukan nama baru untuk direktori: "
+
+#: src/LYLocal.c:908
+msgid "Enter new name for file: "
+msgstr "Masukan nama baru untuk berkas: "
+
+#: src/LYLocal.c:920
+msgid "Illegal character (path-separator) found! Request ignored."
+msgstr "Karakter tidak legal (pemisah-jalur) ditemukan! Permintaan diabaikan."
+
+#: src/LYLocal.c:970
+msgid "Enter new location for directory: "
+msgstr "Masukan lokasi baru untuk direktori: "
+
+#: src/LYLocal.c:972
+msgid "Enter new location for file: "
+msgstr "Masukan lokasi baru untuk berkas: "
+
+#: src/LYLocal.c:999
+msgid "Unexpected failure - unable to find trailing path separator"
+msgstr "Kegagalan tidak terduga - tidak dapat menemukan akhiran jalur pemisah"
+
+#: src/LYLocal.c:1061
+msgid "Modify name, location, or permission (n, l, or p): "
+msgstr "Modifikasi nama, lokasi, atau izin (n, l, atau p): "
+
+#: src/LYLocal.c:1063
+msgid "Modify name or location (n or l): "
+msgstr "Modifikasi nama atau lokasi (n atau l): "
+
+#.
+#. * Code for changing ownership needed here.
+#.
+#: src/LYLocal.c:1092
+msgid "This feature not yet implemented!"
+msgstr "Fitur ini belum diimplementasikan!"
+
+#: src/LYLocal.c:1113
+msgid "Enter name of file to create: "
+msgstr "Masukan nama dari berkas untuk dibuat: "
+
+#: src/LYLocal.c:1116 src/LYLocal.c:1153
+msgid "Illegal redirection \"//\" found! Request ignored."
+msgstr "Redireksi \"//\" tidak legal ditemukan! Permintaan diabaikan."
+
+#: src/LYLocal.c:1150
+msgid "Enter name for new directory: "
+msgstr "Masukan nama untuk direktori baru: "
+
+#: src/LYLocal.c:1191
+msgid "Create file or directory (f or d): "
+msgstr "Buat berkas atau direktori (f atau d): "
+
+#: src/LYLocal.c:1233
+#, c-format
+msgid "Remove directory '%s'?"
+msgstr "Hapus direktori '%s'?"
+
+#: src/LYLocal.c:1236
+msgid "Remove directory?"
+msgstr "Hapus direktori?"
+
+#: src/LYLocal.c:1241
+#, c-format
+msgid "Remove file '%s'?"
+msgstr "Hapus berkas '%s'?"
+
+#: src/LYLocal.c:1243
+msgid "Remove file?"
+msgstr "Hapus berkas?"
+
+#: src/LYLocal.c:1248
+#, c-format
+msgid "Remove symbolic link '%s'?"
+msgstr "Hapus sambungan simbolik '%s'?"
+
+#: src/LYLocal.c:1250
+msgid "Remove symbolic link?"
+msgstr "Hapus sambungan simbolik?"
+
+#: src/LYLocal.c:1348
+msgid "Sorry, don't know how to permit non-UNIX files yet."
+msgstr "Maaf, tidak tahu bagaimana mengijinkan berkas bukan UNIX."
+
+#: src/LYLocal.c:1377
+msgid "Unable to open permit options file"
+msgstr "Tidak dapat membuka opsi ijin berkas"
+
+#: src/LYLocal.c:1405
+msgid "Specify permissions below:"
+msgstr "Spesifikasikan ijin dibawah:"
+
+#: src/LYLocal.c:1406 src/LYShowInfo.c:291
+msgid "Owner:"
+msgstr "Pemilik:"
+
+#: src/LYLocal.c:1422
+msgid "Group"
+msgstr "Grup"
+
+#: src/LYLocal.c:1438
+msgid "Others:"
+msgstr "Lain:"
+
+#: src/LYLocal.c:1456
+msgid "form to permit"
+msgstr "formulir untuk ijin"
+
+#: src/LYLocal.c:1552
+msgid "Invalid mode format."
+msgstr "Format mode tidak valid."
+
+#: src/LYLocal.c:1556
+msgid "Invalid syntax format."
+msgstr "Format sintaks tidak valid."
+
+#: src/LYLocal.c:1743
+msgid "Warning! UUDecoded file will exist in the directory you started Lynx."
+msgstr "Peringatan! UUDecoded berkas akan ada dalam direktori dimana Anda memulai Lynx."
+
+#: src/LYLocal.c:1933
+msgid "NULL URL pointer"
+msgstr "Penunjuk URL KOSONG"
+
+#: src/LYLocal.c:2015
+#, c-format
+msgid "Executing %s "
+msgstr "Menjalankan %s "
+
+#: src/LYLocal.c:2018
+msgid "Executing system command. This might take a while."
+msgstr "Menjalankan perintah sistem. Ini mungkin membutuhkan waktu beberapa saat."
+
+#: src/LYLocal.c:2092
+msgid "Current directory:"
+msgstr "Direktori saat ini:"
+
+#: src/LYLocal.c:2095 src/LYLocal.c:2113
+msgid "Current selection:"
+msgstr "Pemilihaan saat ini:"
+
+#: src/LYLocal.c:2099
+msgid "Nothing currently selected."
+msgstr "Tidak ada yang dipilih saat ini."
+
+#: src/LYLocal.c:2115
+msgid "tagged item:"
+msgstr "tagged item:"
+
+#: src/LYLocal.c:2116
+msgid "tagged items:"
+msgstr "tagged item:"
+
+#: src/LYLocal.c:2216 src/LYLocal.c:2225
+msgid "Illegal filename; request ignored."
+msgstr "Nama berkas tidak legal; permintaan diabaikan."
+
+#. directory not writable
+#: src/LYLocal.c:2323 src/LYLocal.c:2382
+msgid "Install in the selected directory not permitted."
+msgstr "Pemasangan di direktori yang dipilih tidak diijinkan."
+
+#: src/LYLocal.c:2378
+msgid "The selected item is not a directory! Request ignored."
+msgstr "Item yang dipilih bukan sebuah direktori! Permintaan diabaikan."
+
+#: src/LYLocal.c:2387
+msgid "Just a moment, ..."
+msgstr "Tunggu sebentar, ..."
+
+#: src/LYLocal.c:2404
+msgid "Error building install args"
+msgstr "Error membuat args pemasangan"
+
+#: src/LYLocal.c:2419 src/LYLocal.c:2450
+#, c-format
+msgid "Source and target are the same: %s"
+msgstr "Sumber dan target sama: %s"
+
+#: src/LYLocal.c:2426 src/LYLocal.c:2457
+#, c-format
+msgid "Already in target directory: %s"
+msgstr "Telah berada dalam target direktori: %s"
+
+#: src/LYLocal.c:2475
+msgid "Installation complete"
+msgstr "Pemasangan lengkap"
+
+#: src/LYLocal.c:2678
+msgid "Temporary URL or list would be too long."
+msgstr "URL sementara atau daftar akan menjadi terlalu panjang."
+
+#: src/LYMail.c:566
+msgid "Sending"
+msgstr "Mengirimkan"
+
+#: src/LYMail.c:1050
+#, c-format
+msgid "The link %s :?: %s \n"
+msgstr "Sambungan %s :?: %s \n"
+
+#: src/LYMail.c:1052
+#, c-format
+msgid "called \"%s\"\n"
+msgstr "dipanggil \"%s\"\n"
+
+#: src/LYMail.c:1053
+#, c-format
+msgid "in the file \"%s\" called \"%s\"\n"
+msgstr "dalam berkas \"%s\" dipanggil \"%s\"\n"
+
+#: src/LYMail.c:1054
+msgid "was requested but was not available."
+msgstr "telah diminta tetapi tidak tersedia."
+
+#: src/LYMail.c:1055
+msgid "Thought you might want to know."
+msgstr "Dikira Anda mungkin ingin mengetahui."
+
+#: src/LYMail.c:1057
+msgid "This message was automatically generated by"
+msgstr "Pesan ini secara otomatis dibuat oleh"
+
+#: src/LYMail.c:1770
+msgid "No system mailer configured"
+msgstr "Tidak ada pengirim surat sistem yang dikonfigurasikan"
+
+#: src/LYMain.c:1095
+msgid "No Winsock found, sorry."
+msgstr "Tidak ada Winsock ditemukan, maaf."
+
+#: src/LYMain.c:1285
+msgid "You MUST define a valid TMP or TEMP area!"
+msgstr "Anda HARUS mendefinisikan sebuah daerah valid TMP atau TEMP!"
+
+#: src/LYMain.c:1338 src/LYMainLoop.c:5285
+msgid "No such directory"
+msgstr "Tidak ada direktori seperti itu"
+
+#: src/LYMain.c:1532
+#, c-format
+msgid ""
+"\n"
+"Configuration file \"%s\" is not available.\n"
+"\n"
+msgstr ""
+"\n"
+"Berkas konfigurasi \"%s\" tidak tersedia.\n"
+"\n"
+
+#: src/LYMain.c:1542
+#, c-format
+msgid ""
+"\n"
+"Lynx character sets not declared.\n"
+"\n"
+msgstr ""
+"\n"
+"Karakter set Lynx tidak dideklarasikan.\n"
+"\n"
+
+#: src/LYMain.c:1698
+#, c-format
+msgid "Ignored %d characters from standard input.\n"
+msgstr "Diabaikan %d karakter dari standar masukan.\n"
+
+#: src/LYMain.c:1700
+#, c-format
+msgid "Use \"-stdin\" or \"-\" to tell how to handle piped input.\n"
+msgstr "Gunakan \"-stdin\" atatu \"-\" untuk mengetahui bagaimana menangani masukan piped.\n"
+
+#: src/LYMain.c:1858
+msgid "Warning:"
+msgstr "Peringatan:"
+
+#: src/LYMain.c:2426
+msgid "persistent cookies state will be changed in next session only."
+msgstr "persisten keadaan cookies hanya akan berubah di sesi selanjutnya saja."
+
+#: src/LYMain.c:2661 src/LYMain.c:2705
+#, c-format
+msgid "Lynx: ignoring unrecognized charset=%s\n"
+msgstr "Lynx: mengabaikan charset=%s tidak diketahui\n"
+
+#: src/LYMain.c:3222
+#, c-format
+msgid "%s Version %s (%s)"
+msgstr "%s Versi %s (%s)"
+
+#: src/LYMain.c:3263
+#, c-format
+msgid "Built on %s%s.\n"
+msgstr "Dibangun pada %s%s.\n"
+
+#: src/LYMain.c:3277
+msgid "Copyrights held by the Lynx Developers Group,"
+msgstr "Hak Cipta dipegang oleh Lynx Developers Group,"
+
+#: src/LYMain.c:3278
+msgid "the University of Kansas, CERN, and other contributors."
+msgstr "the University of Kansas, CERN, dan kontributor lain."
+
+#: src/LYMain.c:3279
+msgid "Distributed under the GNU General Public License (Version 2)."
+msgstr "Didistribusikan dibawah GNU General Public License (Version 2)."
+
+#: src/LYMain.c:3280
+msgid "See https://lynx.invisible-island.net/ and the online help for more information."
+msgstr "Lihat https://lynx.invisible-island.net/ dan bantuan daring untuk informasi lebih lanjut."
+
+#: src/LYMain.c:4139
+#, c-format
+msgid "USAGE: %s [options] [file]\n"
+msgstr "PENGGUNAAN: %s [opsi] [berkas]\n"
+
+#: src/LYMain.c:4140
+#, c-format
+msgid "Options are:\n"
+msgstr "Opsi adalah:\n"
+
+#: src/LYMain.c:4443
+#, c-format
+msgid "%s: Invalid Option: %s\n"
+msgstr "%s: Opsi tidak valid: %s\n"
+
+#: src/LYMainLoop.c:572
+#, c-format
+msgid "Internal error: Invalid mouse link %d!"
+msgstr "Internal error: Sambungan mouse tidak valid %d!"
+
+#: src/LYMainLoop.c:693 src/LYMainLoop.c:5307
+msgid "A URL specified by the user"
+msgstr "Sebuah URL dispesifikasikan oleh pengguna"
+
+#: src/LYMainLoop.c:1142
+msgid "Enctype multipart/form-data not yet supported! Cannot submit."
+msgstr "Enctype multipart/form-data belum didukung! Tidak dapat mengirimkan."
+
+#.
+#. * Make a name for this help file.
+#.
+#: src/LYMainLoop.c:3197
+msgid "Help Screen"
+msgstr "Layar Bantuan"
+
+#: src/LYMainLoop.c:3328
+msgid "System Index"
+msgstr "Indeks Sistem"
+
+#: src/LYMainLoop.c:3577
+#, c-format
+msgid "Query parameter %d: "
+msgstr "Query parameter %d: "
+
+#: src/LYMainLoop.c:3806 src/LYMainLoop.c:5583
+msgid "Entry into main screen"
+msgstr "Masukan ke layar utama"
+
+#: src/LYMainLoop.c:4064
+msgid "No next document present"
+msgstr "Tidak ada dokumen selanjutnya yang ada"
+
+#: src/LYMainLoop.c:4359
+msgid "charset for this document specified explicitly, sorry..."
+msgstr "charset untuk dokumen ini dispesifikasikan secara eksplisit, maaf..."
+
+#: src/LYMainLoop.c:5265
+msgid "cd to:"
+msgstr "cd ke:"
+
+#: src/LYMainLoop.c:5288
+msgid "A component of path is not a directory"
+msgstr "Sebuah komponen dari jalur bukan sebuah direktori"
+
+#: src/LYMainLoop.c:5291
+msgid "failed to change directory"
+msgstr "gagal untuk berpindah direktori"
+
+#: src/LYMainLoop.c:6517
+msgid "Reparsing document under current settings..."
+msgstr "Reparsing dokumen dibawah konfigurasi saat ini..."
+
+#: src/LYMainLoop.c:6811
+#, c-format
+msgid "Fatal error - could not open output file %s\n"
+msgstr "Fatal error - tidak dapat membuka berkas keluaran %s\n"
+
+#: src/LYMainLoop.c:7153
+msgid "TABLE center enable."
+msgstr "pusat TABEL aktif."
+
+#: src/LYMainLoop.c:7156
+msgid "TABLE center disable."
+msgstr "pusat TABEL tidak aktif."
+
+#: src/LYMainLoop.c:7236
+msgid "Current URL is empty."
+msgstr "URL sekarang kosong."
+
+#: src/LYMainLoop.c:7238 src/LYUtils.c:1909
+msgid "Copy to clipboard failed."
+msgstr "Salin ke clipboard gagal."
+
+#: src/LYMainLoop.c:7240
+msgid "Document URL put to clipboard."
+msgstr "URL dokumen diletakan ke clipboard."
+
+#: src/LYMainLoop.c:7242
+msgid "Link URL put to clipboard."
+msgstr "Sambungan URL diletakan ke clipboard."
+
+#: src/LYMainLoop.c:7269
+msgid "No URL in the clipboard."
+msgstr "Tidak ada URL dalam clipboard."
+
+#: src/LYMainLoop.c:7962 src/LYMainLoop.c:8133
+msgid "-index-"
+msgstr "-index-"
+
+#: src/LYMainLoop.c:8071
+msgid "lynx: Can't access startfile"
+msgstr "lynx: Tidak dapat mengakses startfile"
+
+#: src/LYMainLoop.c:8083
+msgid "lynx: Start file could not be found or is not text/html or text/plain"
+msgstr "lynx: Start file tidak dapat ditemukana atau bukan teks/html atau teks/plain"
+
+#: src/LYMainLoop.c:8084
+msgid " Exiting..."
+msgstr " Keluar..."
+
+#: src/LYMainLoop.c:8127
+msgid "-more-"
+msgstr "-lebih-"
+
+#. Enable scrolling.
+#: src/LYNews.c:186
+msgid "You will be posting to:"
+msgstr "Anda akan mempost ke:"
+
+#.
+#. * Get the mail address for the From header, offering personal_mail_address
+#. * as default.
+#.
+#: src/LYNews.c:195
+msgid ""
+"\n"
+"\n"
+" Please provide your mail address for the From: header\n"
+msgstr ""
+"\n"
+"\n"
+" Mohon sediakan alamat surat Anda untuk header From:\n"
+
+#.
+#. * Get the Subject header, offering the current document's title as the
+#. * default if this is a followup rather than a new post. - FM
+#.
+#: src/LYNews.c:212
+msgid ""
+"\n"
+"\n"
+" Please provide or edit the Subject: header\n"
+msgstr ""
+"\n"
+"\n"
+" Mohon sediakan atau ubah header Subject:\n"
+
+#: src/LYNews.c:302
+msgid ""
+"\n"
+"\n"
+" Please provide or edit the Organization: header\n"
+msgstr ""
+"\n"
+"\n"
+" Mohon sediakan atau ubah header Organization:\n"
+
+#.
+#. * Use the built in line editior.
+#.
+#: src/LYNews.c:359
+msgid ""
+"\n"
+"\n"
+" Please enter your message below."
+msgstr ""
+"\n"
+"\n"
+" Mohon masukan pesan Anda dibawah."
+
+#: src/LYNews.c:405
+msgid "Message has no original text!"
+msgstr "Pesan tidak memiliki teks asli!"
+
+#: src/LYOptions.c:774
+msgid "review/edit B)ookmarks files"
+msgstr "ulas/ubah berkas B)ookmarks"
+
+#: src/LYOptions.c:776
+msgid "B)ookmark file: "
+msgstr "B)erkas markah: "
+
+#: src/LYOptions.c:2131 src/LYOptions.c:2138
+msgid "ON"
+msgstr "ON"
+
+#. verbose_img variable
+#. LYCollapseBRs variable
+#. LYtrimBlankLines variable
+#: src/LYOptions.c:2132 src/LYOptions.c:2137 src/LYOptions.c:2321
+#: src/LYOptions.c:2330 src/LYOptions.c:2339 src/LYOptions.c:2350
+msgid "OFF"
+msgstr "OFF"
+
+#: src/LYOptions.c:2133
+msgid "NEVER"
+msgstr "TIDAK PERNAH"
+
+#: src/LYOptions.c:2134
+msgid "ALWAYS"
+msgstr "SELALU"
+
+#: src/LYOptions.c:2150 src/LYOptions.c:2313
+msgid "ignore"
+msgstr "abaikan"
+
+#: src/LYOptions.c:2151
+msgid "ask user"
+msgstr "tanya pengguna"
+
+#: src/LYOptions.c:2152
+msgid "accept all"
+msgstr "terima semua"
+
+#: src/LYOptions.c:2164
+msgid "ALWAYS OFF"
+msgstr "SELALU OFF"
+
+#: src/LYOptions.c:2165
+msgid "FOR LOCAL FILES ONLY"
+msgstr "UNTUK BERKAS LOKAL SAJA"
+
+#: src/LYOptions.c:2167
+msgid "ALWAYS ON"
+msgstr "SELALU ON"
+
+#: src/LYOptions.c:2179
+msgid "Numbers act as arrows"
+msgstr "Angka berlaku sebagai panah"
+
+#: src/LYOptions.c:2181
+msgid "Links are numbered"
+msgstr "Sambungan dinomori"
+
+#: src/LYOptions.c:2184
+msgid "Links and form fields are numbered"
+msgstr "Sambungan dan daerah formulir dinomori"
+
+#: src/LYOptions.c:2187
+msgid "Form fields are numbered"
+msgstr "Daerah formulir dinomori"
+
+#: src/LYOptions.c:2202
+msgid "Case insensitive"
+msgstr "Tidak memperhatikan besar huruf"
+
+#: src/LYOptions.c:2203
+msgid "Case sensitive"
+msgstr "Memperhatikan besar huruf"
+
+#: src/LYOptions.c:2237
+msgid "prompt normally"
+msgstr "tanya secara manual"
+
+#: src/LYOptions.c:2238
+msgid "force yes-response"
+msgstr "paksa balasan ya"
+
+#: src/LYOptions.c:2239
+msgid "force no-response"
+msgstr "paksa balasan tidak"
+
+#: src/LYOptions.c:2249
+msgid "RFC 2109"
+msgstr "RFC 2109"
+
+#: src/LYOptions.c:2250
+msgid "RFC 2965"
+msgstr "RFC 2965"
+
+#: src/LYOptions.c:2251
+msgid "RFC 6265"
+msgstr "RFC 6265"
+
+#: src/LYOptions.c:2268
+msgid "Novice"
+msgstr "Pemula"
+
+#: src/LYOptions.c:2269
+msgid "Intermediate"
+msgstr "Menengah"
+
+#: src/LYOptions.c:2270
+msgid "Advanced"
+msgstr "Ahli"
+
+#: src/LYOptions.c:2279
+msgid "By First Visit"
+msgstr "Dengan Kunjungan Pertama"
+
+#: src/LYOptions.c:2281
+msgid "By First Visit Reversed"
+msgstr "Dengan Kunjungan Pertama dibalik"
+
+#: src/LYOptions.c:2282
+msgid "As Visit Tree"
+msgstr "Sebagai Pohon Pengunjung"
+
+#: src/LYOptions.c:2283
+msgid "By Last Visit"
+msgstr "Dengan Kunjungan Terakhir"
+
+#: src/LYOptions.c:2285
+msgid "By Last Visit Reversed"
+msgstr "Dengan Kunjungan Terakhir Dibalik"
+
+#. Old_DTD variable
+#: src/LYOptions.c:2296
+msgid "relaxed (TagSoup mode)"
+msgstr "relaxed (mode TagSoup)"
+
+#: src/LYOptions.c:2297
+msgid "strict (SortaSGML mode)"
+msgstr "strict (mode SortaSGML)"
+
+#: src/LYOptions.c:2304
+msgid "Ignore"
+msgstr "Abaikan"
+
+#: src/LYOptions.c:2305
+msgid "Add to trace-file"
+msgstr "Add to trace-file"
+
+#: src/LYOptions.c:2306
+msgid "Add to LYNXMESSAGES"
+msgstr "Add to LYNXMESSAGES"
+
+#: src/LYOptions.c:2307
+msgid "Warn, point to trace-file"
+msgstr "Peringatan, menunjuk ke berkas lacak"
+
+#: src/LYOptions.c:2314
+msgid "as labels"
+msgstr "sebagai label"
+
+#: src/LYOptions.c:2315
+msgid "as links"
+msgstr "sebagai tautan"
+
+#: src/LYOptions.c:2322
+msgid "show filename"
+msgstr "tampilkan nama berkas"
+
+#: src/LYOptions.c:2331
+msgid "collapse"
+msgstr "kuncupkan"
+
+#: src/LYOptions.c:2340
+msgid "trim-lines"
+msgstr "pangkas baris"
+
+#: src/LYOptions.c:2351
+msgid "STANDARD"
+msgstr "STANDAR"
+
+#: src/LYOptions.c:2352
+msgid "ADVANCED"
+msgstr "ADVANCED"
+
+#: src/LYOptions.c:2374
+msgid "IDNA 2003"
+msgstr "IDNA 2003"
+
+#: src/LYOptions.c:2375
+msgid "IDNA 2008"
+msgstr "IDNA 2008"
+
+#: src/LYOptions.c:2376
+msgid "IDNA TR46"
+msgstr "IDNA TR46"
+
+#: src/LYOptions.c:2377
+msgid "IDNA Compatible"
+msgstr "Kompatibel IDNA"
+
+#: src/LYOptions.c:2398
+msgid "Directories first"
+msgstr "Direktori dahulu"
+
+#: src/LYOptions.c:2399
+msgid "Files first"
+msgstr "Berkas dahulu"
+
+#: src/LYOptions.c:2400
+msgid "Mixed style"
+msgstr "Gaya campur"
+
+#: src/LYOptions.c:2408 src/LYOptions.c:2428
+msgid "By Name"
+msgstr "Menurut Nama"
+
+#: src/LYOptions.c:2409 src/LYOptions.c:2429
+msgid "By Type"
+msgstr "Menurut Tipe"
+
+#: src/LYOptions.c:2410 src/LYOptions.c:2430
+msgid "By Size"
+msgstr "Menurut Ukuran"
+
+#: src/LYOptions.c:2411 src/LYOptions.c:2431
+msgid "By Date"
+msgstr "Menurut Tanggal"
+
+#: src/LYOptions.c:2412
+msgid "By Mode"
+msgstr "Menurut Mode"
+
+#: src/LYOptions.c:2414
+msgid "By User"
+msgstr "Menurut Pengguna"
+
+#: src/LYOptions.c:2415
+msgid "By Group"
+msgstr "Menurut Grup"
+
+#: src/LYOptions.c:2440
+msgid "Do not show rate"
+msgstr "Jangan tampilkan kecepatan"
+
+#: src/LYOptions.c:2441 src/LYOptions.c:2442
+#, c-format
+msgid "Show %s/sec rate"
+msgstr "Tampilkan kecepatan %s/detik"
+
+#: src/LYOptions.c:2444 src/LYOptions.c:2445
+#, c-format
+msgid "Show %s/sec, ETA"
+msgstr "Tampilkan ETA %s/detik"
+
+#: src/LYOptions.c:2446 src/LYOptions.c:2447
+#, c-format
+msgid "Show %s/sec (2-digits), ETA"
+msgstr "Tampilkan %s/detik (2 digit), ETA"
+
+#: src/LYOptions.c:2450
+msgid "Show progressbar"
+msgstr "Tampilkan bilah kemajuan"
+
+#: src/LYOptions.c:2471
+msgid "Accept lynx's internal types"
+msgstr "Terima tipe internal lynx"
+
+#: src/LYOptions.c:2472
+msgid "Also accept lynx.cfg's types"
+msgstr "Juga terima tipe lynx.cfg"
+
+#: src/LYOptions.c:2473
+msgid "Also accept user's types"
+msgstr "Juga terima tipe pengguna"
+
+#: src/LYOptions.c:2474
+msgid "Also accept system's types"
+msgstr "Juga terima tipe sistem"
+
+#: src/LYOptions.c:2475
+msgid "Accept all types"
+msgstr "Terima semua tipe"
+
+#: src/LYOptions.c:2484
+msgid "gzip"
+msgstr "gzip"
+
+#: src/LYOptions.c:2485
+msgid "deflate"
+msgstr "deflate"
+
+#: src/LYOptions.c:2488
+msgid "compress"
+msgstr "compress"
+
+#: src/LYOptions.c:2491
+msgid "bzip2"
+msgstr "bzip2"
+
+#: src/LYOptions.c:2493
+msgid "All"
+msgstr "Semua"
+
+#: src/LYOptions.c:2503
+msgid "HTTP 1.0"
+msgstr "HTTP 1.0"
+
+#: src/LYOptions.c:2504
+msgid "HTTP 1.1"
+msgstr "HTTP 1.1"
+
+#: src/LYOptions.c:2863 src/LYOptions.c:2892
+#, c-format
+msgid "Use %s to invoke the Options menu!"
+msgstr "Gunakan %s untuk menjalankan Opsi menu!"
+
+#: src/LYOptions.c:3789
+msgid "(options marked with (!) will not be saved)"
+msgstr "(opsi ditandai dengan (!) tidak akan disimpan)"
+
+#: src/LYOptions.c:3797
+msgid "General Preferences"
+msgstr "Kesukaan Umum"
+
+#. ***************************************************************
+#. User Mode: SELECT
+#: src/LYOptions.c:3801
+msgid "User mode"
+msgstr "Mode pengguna"
+
+#. Editor: INPUT
+#: src/LYOptions.c:3807
+msgid "Editor"
+msgstr "Pengubah"
+
+#. Search Type: SELECT
+#: src/LYOptions.c:3812
+msgid "Type of Search"
+msgstr "Tipe Pencarian"
+
+#: src/LYOptions.c:3817
+msgid "Security and Privacy"
+msgstr "Keamanan dan Privasi"
+
+#. ***************************************************************
+#. Cookies: SELECT
+#: src/LYOptions.c:3821
+msgid "Cookies"
+msgstr "Cookies"
+
+#. Cookie Version: SELECT
+#: src/LYOptions.c:3835
+msgid "Cookie RFC-version"
+msgstr "Cookie versi RFC"
+
+#. Cookie Prompting: SELECT
+#: src/LYOptions.c:3841
+msgid "Invalid-Cookie Prompting"
+msgstr "Tanya Cookie Tidak valid"
+
+#. SSL Prompting: SELECT
+#: src/LYOptions.c:3848
+msgid "SSL Prompting"
+msgstr "Tanya SSL"
+
+#: src/LYOptions.c:3853
+msgid "SSL client certificate file"
+msgstr "Berkas sertifikat klien SSL"
+
+#: src/LYOptions.c:3857
+msgid "SSL client key file"
+msgstr "Berkas kunci klien SSL"
+
+#: src/LYOptions.c:3863
+msgid "Keyboard Input"
+msgstr "Masukan Keyboard"
+
+#. ***************************************************************
+#. Keypad Mode: SELECT
+#: src/LYOptions.c:3867
+msgid "Keypad mode"
+msgstr "Mode Keypad"
+
+#. Emacs keys: ON/OFF
+#: src/LYOptions.c:3873
+msgid "Emacs keys"
+msgstr "Tombol Emacs"
+
+#. VI Keys: ON/OFF
+#: src/LYOptions.c:3879
+msgid "VI keys"
+msgstr "Tombol VI"
+
+#. Line edit style: SELECT
+#. well, at least 2 line edit styles available
+#: src/LYOptions.c:3886
+msgid "Line edit style"
+msgstr "Gaya pengubahan baris"
+
+#. Keyboard layout: SELECT
+#: src/LYOptions.c:3898
+msgid "Keyboard layout"
+msgstr "Layout keyboard"
+
+#.
+#. * Display and Character Set
+#.
+#: src/LYOptions.c:3912
+msgid "Display and Character Set"
+msgstr "Layar dan Set Karakter"
+
+#. Use locale-based character set: ON/OFF
+#: src/LYOptions.c:3917
+msgid "Use locale-based character set"
+msgstr "Gunakan Set Karakter berbasis lokal"
+
+#: src/LYOptions.c:3924
+msgid "Use HTML5 charset replacements"
+msgstr "Use HTML5 charset replacements"
+
+#. Display Character Set: SELECT
+#: src/LYOptions.c:3930
+msgid "Display character set"
+msgstr "Karakter Set Penampilan"
+
+#: src/LYOptions.c:3961
+msgid "Assumed document character set"
+msgstr "Asumsikan karakter set dokumen"
+
+#: src/LYOptions.c:3977
+msgid "Internationalized domain names"
+msgstr "Nama domain terinternasionalisasi"
+
+#.
+#. * Since CJK people hardly mixed with other world
+#. * we split the header to make it more readable:
+#. * "CJK mode" for CJK display charsets, and "Raw 8-bit" for others.
+#.
+#: src/LYOptions.c:3995
+msgid "CJK mode"
+msgstr "mode CJK"
+
+#: src/LYOptions.c:3997
+msgid "Raw 8-bit"
+msgstr "Raw 8-bit"
+
+#. X Display: INPUT
+#: src/LYOptions.c:4005
+msgid "X Display"
+msgstr "Tampilan X"
+
+#.
+#. * Document Appearance
+#.
+#: src/LYOptions.c:4011
+msgid "Document Appearance"
+msgstr "Tampilan Dokumen"
+
+#: src/LYOptions.c:4017
+msgid "Show color"
+msgstr "Tampilkan warna"
+
+#: src/LYOptions.c:4043
+msgid "Color style"
+msgstr "Gaya warna"
+
+#: src/LYOptions.c:4053
+msgid "Default colors"
+msgstr "Warna baku"
+
+#. Show cursor: ON/OFF
+#: src/LYOptions.c:4061
+msgid "Show cursor"
+msgstr "Tampilkan cursor"
+
+#. Underline links: ON/OFF
+#: src/LYOptions.c:4067
+msgid "Underline links"
+msgstr "Garis bawah sambungan"
+
+#. Show scrollbar: ON/OFF
+#: src/LYOptions.c:4074
+msgid "Show scrollbar"
+msgstr "Tampilkan scrollbar"
+
+#. Select Popups: ON/OFF
+#: src/LYOptions.c:4081
+msgid "Popups for select fields"
+msgstr "Popups untuk daerah yang dipilih"
+
+#. HTML error recovery: SELECT
+#: src/LYOptions.c:4087
+msgid "HTML error recovery"
+msgstr "HTML error rekoveri"
+
+#. Bad HTML messages: SELECT
+#: src/LYOptions.c:4093
+msgid "Bad HTML messages"
+msgstr "Bad HTML messages"
+
+#. Show Images: SELECT
+#: src/LYOptions.c:4099
+msgid "Show images"
+msgstr "Tampilkan gambar"
+
+#. Verbose Images: ON/OFF
+#: src/LYOptions.c:4113
+msgid "Verbose images"
+msgstr "Verbose gambar"
+
+#. Collapse BR Tags: ON/OFF
+#: src/LYOptions.c:4119
+msgid "Collapse BR tags"
+msgstr "Kuncupkan tag BR"
+
+#. Trim blank lines: ON/OFF
+#: src/LYOptions.c:4125
+msgid "Trim blank lines"
+msgstr "Pangkas baris-baris kosong"
+
+#.
+#. * Headers Transferred to Remote Servers
+#.
+#: src/LYOptions.c:4133
+msgid "Headers Transferred to Remote Servers"
+msgstr "Headers ditransfer ke Server Remote"
+
+#. ***************************************************************
+#. Mail Address: INPUT
+#: src/LYOptions.c:4137
+msgid "Personal mail address"
+msgstr "Alamat surat pribadi"
+
+#: src/LYOptions.c:4142
+msgid "Personal name for mail"
+msgstr "Nama pribadi untuk surat"
+
+#: src/LYOptions.c:4149
+msgid "Password for anonymous ftp"
+msgstr "Kata sandi untuk ftp anonim"
+
+#. Preferred content type: SELECT
+#: src/LYOptions.c:4155
+msgid "Preferred content type"
+msgstr "Tipe konten yang disukai"
+
+#. Preferred media type: SELECT
+#: src/LYOptions.c:4161
+msgid "Preferred media type"
+msgstr "Tipe media yang disukai"
+
+#. Preferred encoding: SELECT
+#: src/LYOptions.c:4167
+msgid "Preferred encoding"
+msgstr "Pengkodean yang disukai"
+
+#. Preferred Document Character Set: INPUT
+#: src/LYOptions.c:4173
+msgid "Preferred document character set"
+msgstr "Set Karakter dokumen yang disukai"
+
+#. Preferred Document Language: INPUT
+#: src/LYOptions.c:4178
+msgid "Preferred document language"
+msgstr "Bahasa dokumen yang disukai"
+
+#. HTTP protocol SELECT
+#: src/LYOptions.c:4183
+msgid "HTTP protocol"
+msgstr "Protokol HTTP"
+
+#: src/LYOptions.c:4190
+msgid "Send User-Agent header"
+msgstr "Header User-Agent"
+
+#: src/LYOptions.c:4192
+msgid "User-Agent header"
+msgstr "Header User-Agent"
+
+#.
+#. * Listing and Accessing Files
+#.
+#: src/LYOptions.c:4200
+msgid "Listing and Accessing Files"
+msgstr "Mendaftar dan Mengakses Berkas"
+
+#. FTP sort: SELECT
+#: src/LYOptions.c:4205
+msgid "Use Passive FTP"
+msgstr "Gunakan Passive FTP"
+
+#. FTP sort: SELECT
+#: src/LYOptions.c:4211
+msgid "FTP sort criteria"
+msgstr "Kriteria pengurutan FTP"
+
+#. Local Directory Sort: SELECT
+#: src/LYOptions.c:4219
+msgid "Local directory sort criteria"
+msgstr "Kriteria pengurutan direktori lokal"
+
+#. Local Directory Order: SELECT
+#: src/LYOptions.c:4225
+msgid "Local directory sort order"
+msgstr "Pengurutan direktori lokal"
+
+#: src/LYOptions.c:4234
+msgid "Show dot files"
+msgstr "Tampilkan berkas titik"
+
+#: src/LYOptions.c:4242
+msgid "Execution links"
+msgstr "Eksekusi sambungan"
+
+#: src/LYOptions.c:4260
+msgid "Pause when showing message"
+msgstr "Pause when showing message"
+
+#. Show transfer rate: SELECT
+#: src/LYOptions.c:4267
+msgid "Show transfer rate"
+msgstr "Tampilkan kecepatan transfer"
+
+#.
+#. * Special Files and Screens
+#.
+#: src/LYOptions.c:4287
+msgid "Special Files and Screens"
+msgstr "Berkas Spesial dan Layar"
+
+#: src/LYOptions.c:4292
+msgid "Multi-bookmarks"
+msgstr "Multi-bookmarks"
+
+#: src/LYOptions.c:4300
+msgid "Review/edit Bookmarks files"
+msgstr "Ulas/ubah berkas Bookmarks"
+
+#: src/LYOptions.c:4303
+msgid "Goto multi-bookmark menu"
+msgstr "Goto menu multi-bookmark"
+
+#: src/LYOptions.c:4305
+msgid "Bookmarks file"
+msgstr "Berkas bookmarks"
+
+#. Auto Session: ON/OFF
+#: src/LYOptions.c:4312
+msgid "Auto Session"
+msgstr "Sesi otomatis"
+
+#. Session File Menu: INPUT
+#: src/LYOptions.c:4318
+msgid "Session file"
+msgstr "Berkas sesi"
+
+#. Visited Pages: SELECT
+#: src/LYOptions.c:4324
+msgid "Visited Pages"
+msgstr "Halaman Dikunjungi"
+
+#: src/LYOptions.c:4329
+msgid "View the file "
+msgstr "Lihat berkas "
+
+#: src/LYPrint.c:956
+#, c-format
+msgid " Print job complete.\n"
+msgstr " Pekerjaan pencetakan selesai.\n"
+
+#: src/LYPrint.c:1283
+msgid "Document:"
+msgstr "Dokumen:"
+
+#: src/LYPrint.c:1284
+msgid "Number of lines:"
+msgstr "Jumlah dari baris:"
+
+#: src/LYPrint.c:1285
+msgid "Number of pages:"
+msgstr "Jumlah dari halaman:"
+
+#: src/LYPrint.c:1286
+msgid "pages"
+msgstr "halaman"
+
+#: src/LYPrint.c:1286
+msgid "page"
+msgstr "halaman"
+
+#: src/LYPrint.c:1287
+msgid "(approximately)"
+msgstr "(kira kira)"
+
+#: src/LYPrint.c:1294
+msgid "Some print functions have been disabled!"
+msgstr "Beberapa fungsi pencetakan telah dinon-aktifkan!"
+
+#: src/LYPrint.c:1298
+msgid "Standard print options:"
+msgstr "Opsi pencetakan standar:"
+
+#: src/LYPrint.c:1299
+msgid "Print options:"
+msgstr "Opsi pencetakan:"
+
+#: src/LYPrint.c:1306
+msgid "Save to a local file"
+msgstr "Simpan ke sebuah bekas lokal"
+
+#: src/LYPrint.c:1308
+msgid "Save to disk disabled"
+msgstr "Simpan ke disk tidak aktif"
+
+#: src/LYPrint.c:1315
+msgid "Mail the file"
+msgstr "Berkas dikirimkan melalui surat"
+
+#: src/LYPrint.c:1322
+msgid "Print to the screen"
+msgstr "Tampilkan ke layar"
+
+#: src/LYPrint.c:1327
+msgid "Print out on a printer attached to your vt100 terminal"
+msgstr "Tampilkan ke sebuah pencetak dipasang ke terminal vt100 Anda"
+
+#: src/LYReadCFG.c:437
+#, c-format
+msgid ""
+"Syntax Error parsing COLOR in configuration file:\n"
+"The line must be of the form:\n"
+"COLOR:INTEGER:FOREGROUND:BACKGROUND\n"
+"\n"
+"Here FOREGROUND and BACKGROUND must be one of:\n"
+"The special strings 'nocolor' or 'default', or\n"
+msgstr ""
+"Sintaks Error parsing COLOR dalam berkas konfigurasi:\n"
+"Baris harus berupa formulir:\n"
+"COLOR:INTEGER:FOREGROUND:BACKGROUND\n"
+"\n"
+"Disini FOREGROUND dan BACKGROUND harus salah sati dari:\n"
+"String spesial 'nocolor' atau 'baku', atau\n"
+
+#: src/LYReadCFG.c:450
+msgid "Offending line:"
+msgstr "Baris yang menyerang:"
+
+#: src/LYReadCFG.c:764
+#, c-format
+msgid "key remapping of %s to %s for %s failed\n"
+msgstr "pemetaan tombol dari %s ke %s untuk %s gagal\n"
+
+#: src/LYReadCFG.c:771
+#, c-format
+msgid "key remapping of %s to %s failed\n"
+msgstr "pemetaan tombol dari %s ke %s gagal\n"
+
+#: src/LYReadCFG.c:792
+#, c-format
+msgid "invalid line-editor selection %s for key %s, selecting all\n"
+msgstr "pemilihan pengubah baris %s untuk tombol %s tidak valid, memilih semua\n"
+
+#: src/LYReadCFG.c:817 src/LYReadCFG.c:832
+#, c-format
+msgid "setting of line-editor binding for key %s (0x%x) to 0x%x for %s failed\n"
+msgstr "setting dari binding pengubah baris untuk tombol %s (0x%x) ke 0x%x untuk %s gagal\n"
+
+#: src/LYReadCFG.c:839
+#, c-format
+msgid "setting of line-editor binding for key %s (0x%x) for %s failed\n"
+msgstr "setting dari pengubah baris binding untuk tombol %s (0x%x) untuk %s gagal\n"
+
+#: src/LYReadCFG.c:937
+#, c-format
+msgid "Lynx: cannot start, CERN rules file %s is not available\n"
+msgstr "Lunx: tidak dapat memulai, berkas aturan CERN %s tidak tersedia\n"
+
+#: src/LYReadCFG.c:938
+msgid "(no name)"
+msgstr "(tidak ada nama)"
+
+#: src/LYReadCFG.c:2086
+#, c-format
+msgid "More than %d nested lynx.cfg includes -- perhaps there is a loop?!?\n"
+msgstr "Lebih dari %d nested lynx.cfg termasuk -- mungkin disana ada sebuah loop?!?\n"
+
+#: src/LYReadCFG.c:2088
+#, c-format
+msgid "Last attempted include was '%s',\n"
+msgstr "Percobaan terakhir termasuk '%s',\n"
+
+#: src/LYReadCFG.c:2089
+#, c-format
+msgid "included from '%s'.\n"
+msgstr "dimasukan dari '%s'.\n"
+
+#: src/LYReadCFG.c:2500 src/LYReadCFG.c:2513 src/LYReadCFG.c:2571
+msgid "The following is read from your lynx.cfg file."
+msgstr "Berikut dibaca dari berkas lynx.cfg Anda."
+
+#: src/LYReadCFG.c:2501 src/LYReadCFG.c:2514
+msgid "Please read the distribution"
+msgstr "Mohon baca distribusi"
+
+#: src/LYReadCFG.c:2507 src/LYReadCFG.c:2517
+msgid "for more comments."
+msgstr "untuk komentar lebih."
+
+#: src/LYReadCFG.c:2553
+msgid "RELOAD THE CHANGES"
+msgstr "MUAT KEMBALI PERUBAHAN"
+
+#: src/LYReadCFG.c:2561
+msgid "Your primary configuration"
+msgstr "Konfigurasi Utama Anda"
+
+#: src/LYShowInfo.c:116
+msgid "URL:"
+msgstr "URL:"
+
+#: src/LYShowInfo.c:200
+msgid "Directory that you are currently viewing"
+msgstr "Direktori yang saat ini sedang Anda lihat"
+
+#: src/LYShowInfo.c:203
+msgid "Name:"
+msgstr "Nama:"
+
+#: src/LYShowInfo.c:220
+msgid "Directory that you have currently selected"
+msgstr "Direktori yang saat ini sedang Anda pilih"
+
+#: src/LYShowInfo.c:222
+msgid "File that you have currently selected"
+msgstr "Berkas yang saat ini sedang Anda pilih"
+
+#: src/LYShowInfo.c:225
+msgid "Symbolic link that you have currently selected"
+msgstr "Link simbolik yang saat ini sedang Anda pilih"
+
+#: src/LYShowInfo.c:228
+msgid "Item that you have currently selected"
+msgstr "Item yang saat ini sedang Anda pilih"
+
+#: src/LYShowInfo.c:230
+msgid "Full name:"
+msgstr "Nama lengkap:"
+
+#: src/LYShowInfo.c:243
+msgid "Unable to follow link"
+msgstr "Tidak dapat mengikuti sambungan"
+
+#: src/LYShowInfo.c:245
+msgid "Points to file:"
+msgstr "Menunjuk ke berkas:"
+
+#: src/LYShowInfo.c:250
+msgid "Name of owner:"
+msgstr "Nama dari pemilik:"
+
+#: src/LYShowInfo.c:253
+msgid "Group name:"
+msgstr "Nama grup:"
+
+#: src/LYShowInfo.c:255
+msgid "File size:"
+msgstr "Ukuran berkas:"
+
+#: src/LYShowInfo.c:257
+msgid "(bytes)"
+msgstr "(byte)"
+
+#.
+#. * Include date and time information.
+#.
+#: src/LYShowInfo.c:262
+msgid "Creation date:"
+msgstr "Tanggal pembuatan:"
+
+#: src/LYShowInfo.c:265
+msgid "Last modified:"
+msgstr "Modifikasi terakhir:"
+
+#: src/LYShowInfo.c:268
+msgid "Last accessed:"
+msgstr "Terakhir diakses:"
+
+#: src/LYShowInfo.c:274
+msgid "Access Permissions"
+msgstr "Ijin Akses"
+
+#: src/LYShowInfo.c:309
+msgid "Group:"
+msgstr "Grup:"
+
+#: src/LYShowInfo.c:329
+msgid "World:"
+msgstr "Dunia:"
+
+#: src/LYShowInfo.c:336
+msgid "File that you are currently viewing"
+msgstr "Berkas yang saat ini sedang Anda lihat"
+
+#: src/LYShowInfo.c:344 src/LYShowInfo.c:444
+msgid "Linkname:"
+msgstr "Nama sambungan:"
+
+#: src/LYShowInfo.c:350 src/LYShowInfo.c:365
+msgid "Charset:"
+msgstr "Charset:"
+
+#: src/LYShowInfo.c:364
+msgid "(assumed)"
+msgstr "(diasumsikan)"
+
+#: src/LYShowInfo.c:371
+msgid "Server:"
+msgstr "Server:"
+
+#: src/LYShowInfo.c:374
+msgid "Date:"
+msgstr "Tanggal:"
+
+#: src/LYShowInfo.c:377
+msgid "Last Mod:"
+msgstr "Modifikasi Terakhir:"
+
+#: src/LYShowInfo.c:381
+msgid "Expires:"
+msgstr "Kadaluarsa:"
+
+#: src/LYShowInfo.c:384
+msgid "Cache-Control:"
+msgstr "Cache-Control:"
+
+#: src/LYShowInfo.c:387
+msgid "Content-Length:"
+msgstr "Content-Length:"
+
+#: src/LYShowInfo.c:391
+msgid "Length:"
+msgstr "Panjang:"
+
+#: src/LYShowInfo.c:396
+msgid "Language:"
+msgstr "Bahasa:"
+
+#: src/LYShowInfo.c:402
+msgid "Post Data:"
+msgstr "Post Data:"
+
+#: src/LYShowInfo.c:405
+msgid "Post Content Type:"
+msgstr "Tipe Isi Post:"
+
+#: src/LYShowInfo.c:408
+msgid "Owner(s):"
+msgstr "Pemilik:"
+
+#: src/LYShowInfo.c:413
+msgid "size:"
+msgstr "ukuran:"
+
+#: src/LYShowInfo.c:415
+msgid "lines"
+msgstr "baris"
+
+#: src/LYShowInfo.c:419
+msgid "forms mode"
+msgstr "formulir mode"
+
+#: src/LYShowInfo.c:421
+msgid "source"
+msgstr "sumber"
+
+#: src/LYShowInfo.c:422
+msgid "normal"
+msgstr "normal"
+
+#: src/LYShowInfo.c:424
+msgid ", safe"
+msgstr ", aman"
+
+#: src/LYShowInfo.c:426
+msgid ", via internal link"
+msgstr ", melalui link internal"
+
+#: src/LYShowInfo.c:430
+msgid ", no-cache"
+msgstr ", tidak ada cache"
+
+#: src/LYShowInfo.c:432
+msgid ", ISMAP script"
+msgstr ", ISMAP script"
+
+#: src/LYShowInfo.c:434
+msgid ", bookmark file"
+msgstr ", berkas bookmark"
+
+#: src/LYShowInfo.c:437
+msgid "mode:"
+msgstr "mode:"
+
+#: src/LYShowInfo.c:443
+msgid "Link that you currently have selected"
+msgstr "Sambungan yang saat ini Anda pilih"
+
+#: src/LYShowInfo.c:452
+msgid "Method:"
+msgstr "Metode:"
+
+#: src/LYShowInfo.c:456
+msgid "Enctype:"
+msgstr "Enctype:"
+
+#: src/LYShowInfo.c:462
+msgid "Action:"
+msgstr "Aksi:"
+
+#: src/LYShowInfo.c:468
+msgid "(Form field)"
+msgstr "(Form Field)"
+
+#: src/LYShowInfo.c:478
+msgid "No Links on the current page"
+msgstr "Tidak ada sambungan di halaman sekarang"
+
+#: src/LYShowInfo.c:483
+msgid "Server Headers:"
+msgstr "Header Server:"
+
+#: src/LYStyle.c:332
+#, c-format
+msgid ""
+"Syntax Error parsing style in lss file:\n"
+"[%s]\n"
+"The line must be of the form:\n"
+"OBJECT:MONO:COLOR (ie em:bold:brightblue:white)\n"
+"where OBJECT is one of EM,STRONG,B,I,U,BLINK etc.\n"
+"\n"
+msgstr ""
+"Sintaks Error parsing style dalam berkas lss:\n"
+"[%s]\n"
+"Baris harus berupa dalam bentuk:\n"
+"OBJECT:MONO:COLOR (ie em:bold:brightblue:white)\n"
+"dimana OBJECT adalah salah satu dari EM,STRONG,B,I,U,BLINK etc.\n"
+"\n"
+
+#: src/LYStyle.c:941
+#, c-format
+msgid ""
+"\n"
+"Lynx file \"%s\" is not available.\n"
+"\n"
+msgstr ""
+"\n"
+"Berkas Lynx \"%s\" tidak tersedia.\n"
+"\n"
+
+#: src/LYTraversal.c:111
+msgid "here is a list of the history stack so that you may rebuild"
+msgstr "disini adalah daftar dari sejarah stack yang dapat Anda buat kembali"
+
+#: src/LYUpload.c:77
+msgid "ERROR! - upload command is misconfigured"
+msgstr "ERROR! - perintah upload salah konfigurasi"
+
+#: src/LYUpload.c:98
+msgid "Illegal redirection \"../\" found! Request ignored."
+msgstr "Redireksi \"../\" tidak legal ditemukan! Permintaan diabaikan."
+
+#: src/LYUpload.c:101
+msgid "Illegal character \"/\" found! Request ignored."
+msgstr "Karakter tidak legal \"/\" ditemukan! Permintaan diabaikan."
+
+#: src/LYUpload.c:104
+msgid "Illegal redirection using \"~\" found! Request ignored."
+msgstr "Redireksi menggunakan \"~\" tidak legal ditemukan! Permintaan diabaikan."
+
+#: src/LYUpload.c:157
+msgid "Unable to upload file."
+msgstr "Tidak dapat mengupload berkas."
+
+#: src/LYUpload.c:196
+msgid "Upload To:"
+msgstr "Upload Ke:"
+
+#: src/LYUpload.c:197
+msgid "Upload options:"
+msgstr "Opsi Upload:"
+
+#: src/LYUtils.c:1911
+msgid "Download document URL put to clipboard."
+msgstr "URL unduh dokumen diletakan ke clipboard."
+
+#: src/LYUtils.c:2658
+msgid "Unexpected access protocol for this URL scheme."
+msgstr "Protokol akses tidak terduga untuk skema URL ini."
+
+#: src/LYUtils.c:3571
+msgid "Too many tempfiles"
+msgstr "Terlalu banyak berkas tempfiles"
+
+#: src/LYUtils.c:3871
+msgid "unknown restriction"
+msgstr "restriksi tidak diketahui"
+
+#: src/LYUtils.c:3902
+#, c-format
+msgid "No restrictions set.\n"
+msgstr "Tidak ada set restriksi.\n"
+
+#: src/LYUtils.c:3905
+#, c-format
+msgid "Restrictions set:\n"
+msgstr "Set restriksi:\n"
+
+#: src/LYUtils.c:5202
+msgid "Cannot find HOME directory"
+msgstr "Tidak dapat menemukan direktori HOME"
+
+#: src/LYrcFile.c:16
+msgid "Normally disabled. See ENABLE_LYNXRC in lynx.cfg\n"
+msgstr "Secara normal tidak aktif. Lihat ENABLE_LYNXRC dalam lynx.cfg\n"
+
+#: src/LYrcFile.c:373
+msgid ""
+"accept_all_cookies allows the user to tell Lynx to automatically\n"
+"accept all cookies if desired. The default is \"FALSE\" which will\n"
+"prompt for each cookie. Set accept_all_cookies to \"TRUE\" to accept\n"
+"all cookies.\n"
+msgstr ""
+"accept_all_cookies mengijinkan pengguna untuk memberitahu Lynx secara otomatis\n"
+"menerima seluruh cookies jika diinginkan. Baku adalah \"FALSE\" yang akan\n"
+"menanyakan untuk setiap cookie. Set accept_all_cookies ke \"TRUE\" untuk\n"
+"menerima semua cookie.\n"
+
+#: src/LYrcFile.c:381
+msgid ""
+"anonftp_password allows the user to tell Lynx to use the personal\n"
+"email address as the password for anonymous ftp. If no value is given,\n"
+"Lynx will use the personal email address. Set anonftp_password\n"
+"to a different value if you choose.\n"
+msgstr ""
+"anonftp_password mengijinkan pengguna untuk memberitahu Lynx untuk menggunakan\n"
+"alamat email pribadi sebagai kata sandi untuk ftp anonim. Jika tidak ada nilai\n"
+"yang diberikan Lynx akan menggunakan alamat email pribadi. Set anonftp_password\n"
+"ke sebuah nilai berbeda jika Anda memilih.\n"
+
+#: src/LYrcFile.c:390
+msgid ""
+"bookmark_file specifies the name and location of the default bookmark\n"
+"file into which the user can paste links for easy access at a later\n"
+"date.\n"
+msgstr ""
+"bookmark_file menspesifikasikan nama dan lokasi dari berkas bookmark baku\n"
+"kedalam dimana pengguna dapat paste link untuk akses mudah di waktu\n"
+"kemudian.\n"
+
+#: src/LYrcFile.c:395
+msgid ""
+"If case_sensitive_searching is \"on\" then when the user invokes a search\n"
+"using the 's' or '/' keys, the search performed will be case sensitive\n"
+"instead of case INsensitive. The default is usually \"off\".\n"
+msgstr ""
+"Jika case_sensitive_searching \"on\" maka ketika pengguna menjalankan sebuah\n"
+"pencarian menggunakan tombol 's' atau '/', pencarian yang dilakukan akan\n"
+"memperhatikan besar huruf dari pada tidak diperhatikan. Baku biasanya \"off\".\n"
+
+#: src/LYrcFile.c:400
+msgid ""
+"The character_set definition controls the representation of 8 bit\n"
+"characters for your terminal. If 8 bit characters do not show up\n"
+"correctly on your screen you may try changing to a different 8 bit\n"
+"set or using the 7 bit character approximations.\n"
+"Current valid characters sets are:\n"
+msgstr ""
+"Definisi kontrol character_set representasi dari 8 bit karakter untuk\n"
+"terminal Anda. Jika 8 bit karakter tidak tampil dengan benar di layar\n"
+"Anda mungkin coba mengubah ke 8 bit set yang berbeda atau menggunakan\n"
+"approksimasi karakter 7 bit.\n"
+"Set karakter yang valid sekarang adalah:\n"
+
+#: src/LYrcFile.c:408
+msgid ""
+"cookie_accept_domains and cookie_reject_domains are comma-delimited\n"
+"lists of domains from which Lynx should automatically accept or reject\n"
+"all cookies. If a domain is specified in both options, rejection will\n"
+"take precedence. The accept_all_cookies parameter will override any\n"
+"settings made here.\n"
+msgstr ""
+"cookie_accept_domains dan cookie_reject_domain adalah daftar dipisahkan\n"
+"koma dari domain dari Lynx yang seharusnya secara otomatis diterima atau\n"
+"ditolak untuk semua cookie. Jika sebuah domain dispesifikasikan di kedua\n"
+"opsi, penolakan akan mengambil prioritas. Parameter accept_all_cookies akan\n"
+"override konfigurasi apapun yang dibuat disini.\n"
+
+#: src/LYrcFile.c:416
+msgid ""
+"cookie_file specifies the file from which to read persistent cookies.\n"
+"The default is ~/"
+msgstr ""
+"cookie_file menspesifikasikan berkas yang dibaca persistent cookies.\n"
+"Baku adalah ~/"
+
+#: src/LYrcFile.c:421
+msgid ""
+"cookie_loose_invalid_domains, cookie_strict_invalid_domains, and\n"
+"cookie_query_invalid_domains are comma-delimited lists of which domains\n"
+"should be subjected to varying degrees of validity checking. If a\n"
+"domain is set to strict checking, strict conformance to RFC2109 will\n"
+"be applied. A domain with loose checking will be allowed to set cookies\n"
+"with an invalid path or domain attribute. All domains will default to\n"
+"querying the user for an invalid path or domain.\n"
+msgstr ""
+"cookie_loose_invalid_domains, cookie_strict_invalid_domains, dan\n"
+"cookie_query_invalid_domain adalah daftar dipisahkan koma dari domain\n"
+"yang seharusnya ditunjukan untuk tingkat berbeda dari pemeriksaan keabsahan.\n"
+"Jika sebuah domain diset ke pemeriksaan strict, strict konformance ke\n"
+"RFC22109 akan diaplikasikan. Sebuah domain akan kehilangan pemeriksaan akan\n"
+"diijinkan untuk menset cookies dengan sebuah jalur tidak valid atau atribut\n"
+"domain. Semua domain akan baku ke permintaan pengguna untuk sebuah jalur atau domain tidak valid.\n"
+
+#: src/LYrcFile.c:435
+msgid ""
+"dir_list_order specifies the directory list order under DIRED_SUPPORT\n"
+"(if implemented). The default is \"ORDER_BY_NAME\"\n"
+msgstr ""
+"dir_list_order menspesifikasikan urutan daftar direktori dibawah DIRED_SUPPORT\n"
+"(jika diimplementasikan). Baku adalah \"ORDER_BY_NAME\"\n"
+
+#: src/LYrcFile.c:440
+msgid ""
+"dir_list_styles specifies the directory list style under DIRED_SUPPORT\n"
+"(if implemented). The default is \"MIXED_STYLE\", which sorts both\n"
+"files and directories together. \"FILES_FIRST\" lists files first and\n"
+"\"DIRECTORIES_FIRST\" lists directories first.\n"
+msgstr ""
+"dir_list_style menspesifikasikan gaya daftar direktori dibawah DIRED_SUPPORT\n"
+"(jika diimplementasikan). Baku adalah \"MIXED_STYLE\", jika diurutkan baik\n"
+"berkas dan direktori bersama. \"FILES_FIRST\" daftar berkas pertama dan\n"
+"\"DIRECTORIES_FIRST\" daftar direktori pertama.\n"
+
+#: src/LYrcFile.c:448
+msgid ""
+"If emacs_keys is to \"on\" then the normal EMACS movement keys:\n"
+" ^N = down ^P = up\n"
+" ^B = left ^F = right\n"
+"will be enabled.\n"
+msgstr ""
+"Jika emacs_keys aktif ke \"on\" maka normal tombol pemindahan EMACS:\n"
+" ^N = turun ^P = naik\n"
+" ^B = kiri ^F = kanan\n"
+"akan diaktifkan.\n"
+
+#: src/LYrcFile.c:454
+msgid ""
+"file_editor specifies the editor to be invoked when editing local files\n"
+"or sending mail. If no editor is specified, then file editing is disabled\n"
+"unless it is activated from the command line, and the built-in line editor\n"
+"will be used for sending mail.\n"
+msgstr ""
+"file_editor menspesifikasikan pengubah yang dipanggil ketika mengubah berkas\n"
+"lokal atau mengirim surat. Jika tidak ada pengubah yang dispesifikasikan,\n"
+"maka pengubahan berkas tidak aktif kecuali ini diaktifkan dari baris perintah,\n"
+"dan built-in baris pengubah akan digunakan untuk mengirim surat.\n"
+
+#: src/LYrcFile.c:461
+msgid ""
+"The file_sorting_method specifies which value to sort on when viewing\n"
+"file lists such as FTP directories. The options are:\n"
+" BY_FILENAME -- sorts on the name of the file\n"
+" BY_TYPE -- sorts on the type of the file\n"
+" BY_SIZE -- sorts on the size of the file\n"
+" BY_DATE -- sorts on the date of the file\n"
+msgstr ""
+"file_sorting_method menspesifikasikan nilai untuk mengurutkan ketika melihat\n"
+"daftar berkas seperti direktori FTP. Opsi adalah:\n"
+" BY_FILENAME -- urutkan berdasarkan nama dari berkas\n"
+" BY_TYPE -- urutkan berdasarkan tipe dari berkas\n"
+" BY_SIZE -- urutkan berdasarkan ukuran dari berkas\n"
+" BY_DATE -- urutkan berdasarkan tanggal dari berkas\n"
+
+#: src/LYrcFile.c:492
+msgid ""
+"lineedit_mode specifies the key binding used for inputting strings in\n"
+"prompts and forms. If lineedit_mode is set to \"Default Binding\" then\n"
+"the following control characters are used for moving and deleting:\n"
+"\n"
+" Prev Next Enter = Accept input\n"
+" Move char: <- -> ^G = Cancel input\n"
+" Move word: ^P ^N ^U = Erase line\n"
+" Delete char: ^H ^R ^A = Beginning of line\n"
+" Delete word: ^B ^F ^E = End of line\n"
+"\n"
+"Current lineedit modes are:\n"
+msgstr ""
+"lineedit_mode menspesifikasikan pengikatan tombol digunakan untuk memasukan\n"
+"string dalam pertanyaan dan formulir. Jika lineedit_mode diset ke \"Default Binding\" maka\n"
+"kontrol karakter berikut digunakan untuk berpindah dan menghapus:\n"
+"\n"
+" Sebelumnya Sesudahnya Enter = Terima Masukan\n"
+" Pindah char: <- -> ^G = Batalkan masukan\n"
+" Pindah kata: ^P ^N ^U = Hapus baris\n"
+" Hapus char: ^H ^R ^A = Awal dari baris\n"
+" Hapus kata: ^B ^F ^E = Akhir dari baris\n"
+"\n"
+"Mode lineedit sekarang:\n"
+
+#: src/LYrcFile.c:510
+msgid ""
+"The following allow you to define sub-bookmark files and descriptions.\n"
+"The format is multi_bookmark<capital_letter>=<filename>,<description>\n"
+"Up to 26 bookmark files (for the English capital letters) are allowed.\n"
+"We start with \"multi_bookmarkB\" since 'A' is the default (see above).\n"
+msgstr ""
+"Berikut mengijinkan Anda untuk mendefinisikan berkas sub-bookmark dan deskripsi.\n"
+"Format adalah multi_bookmark<huruf_besaar>=<nama berkas>, <deskripsi>\n"
+"Sampai ke 26 berkas bookmark (untuk huruf besar bahasa inggris) diijinkan.\n"
+"Kita memulai dengan \"multi_bookmarkB\" karena 'A' adalah baku (lihat diatas).\n"
+
+#: src/LYrcFile.c:516
+msgid ""
+"personal_mail_address specifies your personal mail address. The\n"
+"address will be sent during HTTP file transfers for authorization and\n"
+"logging purposes, and for mailed comments.\n"
+"If you do not want this information given out, set the NO_FROM_HEADER\n"
+"to TRUE in lynx.cfg, or use the -nofrom command line switch. You also\n"
+"could leave this field blank, but then you won't have it included in\n"
+"your mailed comments.\n"
+msgstr ""
+"personal_mail_address menspesifikasikan alamat email pribadi Anda.\n"
+"Alamat akan dikirimkan ketika transfer berkas HTTP untuk tujuan otorisasi\n"
+"dan pencatatan, dan untuk mengirimkan komentar.\n"
+"Jika Anda tidak ingin informasi ini dikirimkan keluar, set NO_FROM_HEADER\n"
+"ke TRUE dalam lynx.cfg, atau gunakan opsi baris perintah -nofrom. Anda\n"
+"juga dapat meninggalkan daerah ini kosong, tetapi nanti Anda tidak akan\n"
+"memasukannya ke komentar surat Anda.\n"
+
+#: src/LYrcFile.c:525
+msgid ""
+"personal_mail_name specifies your personal name, for mail. The\n"
+"name is sent for mailed comments. Lynx will prompt for this,\n"
+"showing the configured value as a default when sending mail.\n"
+"This is not necessarily the same as a name provided as part of the\n"
+"personal_mail_address.\n"
+"Lynx does not save your changes to that default value as a side-effect\n"
+"of sending email. To update the default value, you must use the options\n"
+"menu, or modify this file directly.\n"
+msgstr ""
+"personal_mail_name specifies your personal name, for mail. The\n"
+"name is sent for mailed comments. Lynx will prompt for this,\n"
+"showing the configured value as a default when sending mail.\n"
+"This is not necessarily the same as a name provided as part of the\n"
+"personal_mail_address.\n"
+"Lynx does not save your changes to that default value as a side-effect\n"
+"of sending email. To update the default value, you must use the options\n"
+"menu, or modify this file directly.\n"
+
+#: src/LYrcFile.c:535
+msgid ""
+"preferred_charset specifies the character set in MIME notation (e.g.,\n"
+"ISO-8859-2, ISO-8859-5) which Lynx will indicate you prefer in requests\n"
+"to http servers using an Accept-Charset header. The value should NOT\n"
+"include ISO-8859-1 or US-ASCII, since those values are always assumed\n"
+"by default. May be a comma-separated list.\n"
+"If a file in that character set is available, the server will send it.\n"
+"If no Accept-Charset header is present, the default is that any\n"
+"character set is acceptable. If an Accept-Charset header is present,\n"
+"and if the server cannot send a response which is acceptable\n"
+"according to the Accept-Charset header, then the server SHOULD send\n"
+"an error response, though the sending of an unacceptable response\n"
+"is also allowed.\n"
+msgstr ""
+"preferred_charset menspesifikasikan set karakter dalam notasi MIME (e.g,\n"
+"ISO-8859-2, ISO-8859-5) dimana Lynx akan mengindikasikan kesukaan Anda\n"
+"dalam permintaan ke server http menggunakan sebuah header Accept-Charset.\n"
+"Nilai seharusnya TIDAK termasuk ISO-8859-1 atau US-ASCII, karena nilai itu\n"
+"selalu diasumsikan secara baku. Mungkin berupa sebuah daftar dipisahkan koma.\n"
+"Jika sebuah berkas dalam set karakter tersedia, server akan mengirimkannya.\n"
+"Jika tidak ada header Accept-Charset yang ada, baku adalah set karakter apapun\n"
+"yang diterima. Jika sebuah header Accept-Charset header ada, dan jika server\n"
+"tidak dapat mengirimkan sebuah balasan dimana itu dapat diterima\n"
+"menurut header Accept-Charset, maka server SEHARUSNYA mengirimkan sebuah\n"
+"pesan balasan error, walaupun pengiriman dari sebuah balasan tidak diterima\n"
+"juga diijinkan.\n"
+
+#: src/LYrcFile.c:553
+msgid ""
+"preferred_language specifies the language in MIME notation (e.g., en,\n"
+"fr, may be a comma-separated list in decreasing preference)\n"
+"which Lynx will indicate you prefer in requests to http servers.\n"
+"If a file in that language is available, the server will send it.\n"
+"Otherwise, the server will send the file in its default language.\n"
+msgstr ""
+"preferred_language menspesifikasikan bahasa dalam notasi MIME (e.g., en,\n"
+"fr, mungkin berupa daftar dipisahkan koma dalam kesukaan menurun)\n"
+"dimana Lynx akan mengindikasikan kesukaan Anda dalam permintaan ke server http.\n"
+"Jika sebuah berkas dalam bahasa itu tersedia, server akan mengirimkannya.\n"
+"Jika tidak, server akan mengirim berkas dalam bahasa bakunya.\n"
+
+#: src/LYrcFile.c:564
+msgid ""
+"If run_all_execution_links is set \"on\" then all local execution links\n"
+"will be executed when they are selected.\n"
+"\n"
+"WARNING - This is potentially VERY dangerous. Since you may view\n"
+" information that is written by unknown and untrusted sources\n"
+" there exists the possibility that Trojan horse links could be\n"
+" written. Trojan horse links could be written to erase files\n"
+" or compromise security. This should only be set to \"on\" if\n"
+" you are viewing trusted source information.\n"
+msgstr ""
+"Jika run_all_execution_links di set ke \"on\" maka seluruh link eksekusi lokal\n"
+"akan dieksekusi ketika mereka dipilih.\n"
+"\n"
+"PERINGATAN - Ini mungkin akan SANGAT berbahaya. Karena Anda mungkin melihat\n"
+" informasi yang ditulis oleh sumber yang tidak diketahui dan\n"
+" tidak dipercaya dimana ada kemungkinan link ke Trojan Horse dapat\n"
+" ditulis. Trojan horse link dapat ditulis untuk menghapus berkas\n"
+" atau kompromi keamanan. Ini seharusnya hanya diset ke \"on\" jika\n"
+" Anda melihat sumber informasi yang dipercaya.\n"
+
+#: src/LYrcFile.c:575
+msgid ""
+"If run_execution_links_on_local_files is set \"on\" then all local\n"
+"execution links that are found in LOCAL files will be executed when they\n"
+"are selected. This is different from run_all_execution_links in that\n"
+"only files that reside on the local system will have execution link\n"
+"permissions.\n"
+"\n"
+"WARNING - This is potentially dangerous. Since you may view\n"
+" information that is written by unknown and untrusted sources\n"
+" there exists the possibility that Trojan horse links could be\n"
+" written. Trojan horse links could be written to erase files\n"
+" or compromise security. This should only be set to \"on\" if\n"
+" you are viewing trusted source information.\n"
+msgstr ""
+"Jika run_execution_links_on_local_files diset ke \"on\" maka seluruh link\n"
+"eksekusi lokal yang ditemukan dalam berkas LOCAL akan dieksekusi ketika\n"
+"mereka dipilih. Ini berbeda dari run_all_execution_links yang hanya\n"
+"berkas yang berada di sistem lokal yang memiliki ijin eksekusi link.\n"
+"\n"
+"PERINGATAN - Ini mungkin berbahaya. Karena Anda mungkin melihat informasi\n"
+" yang ditulis oleh sumber yang tidak diketahui dan tidak dipercaya\n"
+" ada kemungkinan bahwa link Trojan Horse dapat ditulis. Trojan horse\n"
+" link dapat ditulis untuk menghapus berkas atau kompromi keamanan.\n"
+" Ini seharusnya diset ke \"on\" jika Anda melihat ke sumber\n"
+" informasi yang dapat dipercaya.\n"
+
+#: src/LYrcFile.c:593
+msgid ""
+"select_popups specifies whether the OPTIONs in a SELECT block which\n"
+"lacks a MULTIPLE attribute are presented as a vertical list of radio\n"
+"buttons or via a popup menu. Note that if the MULTIPLE attribute is\n"
+"present in the SELECT start tag, Lynx always will create a vertical list\n"
+"of checkboxes for the OPTIONs. A value of \"on\" will set popup menus\n"
+"as the default while a value of \"off\" will set use of radio boxes.\n"
+"The default can be overridden via the -popup command line toggle.\n"
+msgstr ""
+"select_popups menspesifikasikan apakah OPSI dalam blok SELECT yang kurang\n"
+"atribut MULTIPLE ada sebagai sebuah daftar vertikal dari tombol radio atau\n"
+"melalui sebuah menu popup. Catat jika sebuah atribut MULTIPLE ada dalam tag\n"
+"mulai SELECT, Lynx selalu membuat sebuah daftar vertikal dari checkboxes\n"
+"untuk OPSI. Sebuah NILAI dari \"on\" akan menset popups menu\n"
+"sebagai baku ketika sebuah nilai dari \"off\" akan menset penggunaan dari boxes.\n"
+"Baku dapat dioverridden melalui opsi baris perintah -popup .\n"
+
+#: src/LYrcFile.c:604
+msgid ""
+"show_color specifies how to set the color mode at startup. A value of\n"
+"\"never\" will force color mode off (treat the terminal as monochrome)\n"
+"at startup even if the terminal appears to be color capable. A value of\n"
+"\"always\" will force color mode on even if the terminal appears to be\n"
+"monochrome, if this is supported by the library used to build lynx.\n"
+"A value of \"default\" will yield the behavior of assuming\n"
+"a monochrome terminal unless color capability is inferred at startup\n"
+"based on the terminal type, or the -color command line switch is used, or\n"
+"the COLORTERM environment variable is set. The default behavior always is\n"
+"used in anonymous accounts or if the \"option_save\" restriction is set.\n"
+"The effect of the saved value can be overridden via\n"
+"the -color and -nocolor command line switches.\n"
+"The mode set at startup can be changed via the \"show color\" option in\n"
+"the 'o'ptions menu. If the option settings are saved, the \"on\" and\n"
+"\"off\" \"show color\" settings will be treated as \"default\".\n"
+msgstr ""
+"show_color menspesifikasikan bagaiman menset mode warna di waktu awal. Sebuah\n"
+"nilai dari \"never\" akan memaksa mode warna tidak aktif (perlakukan termina\n"
+"sebagai monochrome) di waktu awal walaupun terminal kelihatannya mampu\n"
+"menampilkan warna. Sebuah warna dari \"always\" selalu memaksa mode warna aktif\n"
+"walaupun terminal tampak seperti monochrome, jika ini didukung oleh perpustakaan\n"
+"yang digunakan untuk membuat lynx.\n"
+"Sebuah nilai dari \"default\" akan menghasilkan perilaku dengan mengasumsikan\n"
+"sebuah terminal monochrome kecuali kapabilitas warna tidak ada ketika awal\n"
+"variabel lingkungan COLORTERM diset. Perilaku baku selalu digunakan dalam akun\n"
+"anonim atau jika \"option_save\" pembatasan diset.\n"
+"Efek dari nilai yang disimpan dapat dioverride melalui opsi baris perintah\n"
+"-color dan -nocolor.\n"
+"Mode set di waktu awal dapat diubah melalui opsi \"show color\" dalam menu\n"
+"'o'ptions. Jika konfigurasi option disimpan, \"on\" dan \"off\" \"show color\"\n"
+"konfigurasi akan diperlakukan sebagai \"default\".\n"
+
+#: src/LYrcFile.c:621
+msgid ""
+"show_cursor specifies whether to 'hide' the cursor to the right (and\n"
+"bottom, if possible) of the screen, or to place it to the left of the\n"
+"current link in documents, or current option in select popup windows.\n"
+"Positioning the cursor to the left of the current link or option is\n"
+"helpful for speech or braille interfaces, and when the terminal is\n"
+"one which does not distinguish the current link based on highlighting\n"
+"or color. A value of \"on\" will set positioning to the left as the\n"
+"default while a value of \"off\" will set 'hiding' of the cursor.\n"
+"The default can be overridden via the -show_cursor command line toggle.\n"
+msgstr ""
+"show_cursor menspesifikasikan apakah 'hide' cursor ke kanan (dan\n"
+"bawah, jika memungkinkan) dari layar, atau tempatkan itu ke kiri dari\n"
+"link saat ini dalam dokumen, atau opsi sekarang dalam jendela popups yang dipilih\n"
+"Posisi kursor dikiri dari link sekarang atau opsi berguna untuk antarmuka\n"
+"suara atau braile, dan ketika termina adalah salah satu yang tidak membedakan\n"
+"link sekarang berdasarkan dari highlighting atau warna. Sebuah nilai dari \"on\"\n"
+"akan menset posisi ke kiri sebagai baku ketika nilai dari \"off\" akan menset\n"
+"'hiding' dari kursor.\n"
+"baku dapat dioverriden melalui opsi baris perintah -show_cursor.\n"
+
+#: src/LYrcFile.c:632
+msgid ""
+"show_dotfiles specifies that the directory listing should include\n"
+"\"hidden\" (dot) files/directories. If set \"on\", this will be\n"
+"honored only if enabled via userdefs.h and/or lynx.cfg, and not\n"
+"restricted via a command line switch. If display of hidden files\n"
+"is disabled, creation of such files via Lynx also is disabled.\n"
+msgstr ""
+"show_dotfiles menspesifikasikan bahwa daftar direktori seharusnya termasuk\n"
+"\"hidden\" (dot) files/direktori. Jika diset \"on\", ini akan dihargai jika\n"
+"aktif melalui userdefs.h dan/atau lynx.cfg, dan tidak terbatas melalui\n"
+"sebuah opsi baris perintah. Jika penampilan dari berkas tersembunyi tidak \n"
+"aktif, pembuatan dari berkas seperti itu melalui Lynx juga tidak aktif.\n"
+
+#: src/LYrcFile.c:643
+msgid ""
+"If sub_bookmarks is not turned \"off\", and multiple bookmarks have\n"
+"been defined (see below), then all bookmark operations will first\n"
+"prompt the user to select an active sub-bookmark file. If the default\n"
+"Lynx bookmark_file is defined (see above), it will be used as the\n"
+"default selection. When this option is set to \"advanced\", and the\n"
+"user mode is advanced, the 'v'iew bookmark command will invoke a\n"
+"statusline prompt instead of the menu seen in novice and intermediate\n"
+"user modes. When this option is set to \"standard\", the menu will be\n"
+"presented regardless of user mode.\n"
+msgstr ""
+"Jika sub_bookmarks tidak di ubah \"off\", dan multiple bookmark telah\n"
+"didefinisikan (lihat dibawah), maka semua operasi bookmark pertama akan\n"
+"menanyakan pengguna untuk memilih sebuah berkas sub-bookmark aktif. Jika\n"
+"bookmark_file Lynx baku didefinisikan (lihat atas), ini akan digunakan\n"
+"sebagai pemilihan baku. Ketika opsi ini diset ke \"advanced\", dan mode\n"
+"pengguna advanced, perintah bookmark 'v'iew akan memanggil sebuah prompt\n"
+"statusline daripada menu terlihat dalam mode pengguna pemula dan menengah.\n"
+"Ketika opsi ini diset ke \"standard\", menu akan ditampilkan tidak perduli mode pengguna.\n"
+
+#: src/LYrcFile.c:658
+msgid ""
+"user_mode specifies the users level of knowledge with Lynx. The\n"
+"default is \"NOVICE\" which displays two extra lines of help at the\n"
+"bottom of the screen to aid the user in learning the basic Lynx\n"
+"commands. Set user_mode to \"INTERMEDIATE\" to turn off the extra info.\n"
+"Use \"ADVANCED\" to see the URL of the currently selected link at the\n"
+"bottom of the screen.\n"
+msgstr ""
+"user_mode menspesifikasikan tingkat pengetahuan pengguna dengan Lynx. Baku\n"
+"adalah \"NOVICE\" dimana menampilkan kelebihan dua baris dari bantuan di bawah\n"
+"layar untuk menolong pengguna menggunakan perintah dasar Lynx.\n"
+"Set user_mode ke \"INTERMEDIATE\" untuk menon-aktifkan informasi tambahan.\n"
+"Gunakan \"ADVANCED\" untuk melihat URL dari link yang saat ini dipilih di\n"
+"bawah dari layar.\n"
+
+#: src/LYrcFile.c:667
+msgid ""
+"If verbose_images is \"on\", lynx will print the name of the image\n"
+"source file in place of [INLINE], [LINK] or [IMAGE]\n"
+"See also VERBOSE_IMAGES in lynx.cfg\n"
+msgstr ""
+"Jika verbose_images \"on\", lynx akan menampilkan nama dari gambar\n"
+"berkas sumber ditempat dari [INLINE], [LINK] atau [GAMBAR]\n"
+"Lihat juga VERBOSE_IMAGES dalam lynx.cfg\n"
+
+#: src/LYrcFile.c:672
+msgid ""
+"If vi_keys is set to \"on\", then the normal VI movement keys:\n"
+" j = down k = up\n"
+" h = left l = right\n"
+"will be enabled. These keys are only lower case.\n"
+"Capital 'H', 'J' and 'K will still activate help, jump shortcuts,\n"
+"and the keymap display, respectively.\n"
+msgstr ""
+"Jika vi_keys di set ke \"on\", maka tombol perpindahan normal VI:\n"
+" j = turun k = naik\n"
+" h = kiri l = kanan\n"
+"akan aktif. Tombol ini hanya huruf kecil.\n"
+"Huruf kapital 'H', 'J' dan 'K' akan tetapi mengaktifkan bantuan, lompat shortcuts,\n"
+"dan menampilkan peta tombol.\n"
+
+#: src/LYrcFile.c:680
+msgid ""
+"The visited_links setting controls how Lynx organizes the information\n"
+"in the Visited Links Page.\n"
+msgstr ""
+"Pengaturan visited_links mengontrol bagaimana Lynx mengorganisasi informasi\n"
+"dalam Halaman Taut Yang Dikunjungi.\n"
+
+#: src/LYrcFile.c:924
+msgid ""
+"If keypad_mode is set to \"NUMBERS_AS_ARROWS\", then the numbers on\n"
+"your keypad when the numlock is on will act as arrow keys:\n"
+" 8 = Up Arrow\n"
+" 4 = Left Arrow 6 = Right Arrow\n"
+" 2 = Down Arrow\n"
+"and the corresponding keyboard numbers will act as arrow keys,\n"
+"regardless of whether numlock is on.\n"
+msgstr ""
+"Jika keypad_mode diset ke \"NUMBERS_AS_ARROWS\", maka nomor di keypad\n"
+"Anda ketika numlock aktif akan berlaku sebagai tombol panah:\n"
+" 8 = Panah atas\n"
+" 4 = Panah Kiri 6 = Panah Kiri\n"
+" 2 = Panah bawah\n"
+"dan nomor keyboard yang berhubungan akan berlaku sebagai tombol panah,\n"
+"tidak perduli apakah numlock aktif.\n"
+
+#: src/LYrcFile.c:933
+msgid ""
+"If keypad_mode is set to \"LINKS_ARE_NUMBERED\", then numbers will\n"
+"appear next to each link and numbers are used to select links.\n"
+msgstr ""
+"Jika keypad_mode diset ke \"LINKS_ARE_NUMBERED\", maka nomor akan muncul\n"
+"setelah setiap link dan nomor yang digunakan untuk memilih link.\n"
+
+#: src/LYrcFile.c:937
+msgid ""
+"If keypad_mode is set to \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\", then\n"
+"numbers will appear next to each link and visible form input field.\n"
+"Numbers are used to select links, or to move the \"current link\" to a\n"
+"form input field or button. In addition, options in popup menus are\n"
+"indexed so that the user may type an option number to select an option in\n"
+"a popup menu, even if the option isn't visible on the screen. Reference\n"
+"lists and output from the list command also enumerate form inputs.\n"
+msgstr ""
+"Jika keypad_mode diset ke \"LINKS_AND_FORM_FIELD_ARE_NUMBERED\", maka\n"
+"nomor akan muncul setelah setiap link dan terlihat dari daerah masukan formulir.\n"
+"Nomor digunakan untuk memilih link, atau untuk memindahkan ke \"current link\" ke\n"
+"sebuah daerah masukan formulir atau tombol. Sebagai tambahan, opsi dalam menu\n"
+"popup terindeks jadi pengguna mugkin mengetikan sebuah nomor opsi untuk memilih\n"
+"sebuah opsi dalam sebuah menu popup, bahkan jika opsi tidak terlihat dilayar.\n"
+"Daftar referensi dan keluaran dari baris perintah juga mengenumerasi masukan formulir.\n"
+
+#: src/LYrcFile.c:946
+msgid ""
+"NOTE: Some fixed format documents may look disfigured when\n"
+"\"LINKS_ARE_NUMBERED\" or \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\" are\n"
+"enabled.\n"
+msgstr ""
+"CATAT: Beberapa format dokumen tetap mungkin tampak salah bentuk ketika\n"
+"\"LINKS_ARE_NUMBERED\" atau \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\"\n"
+"diaktifkan.\n"
+
+#: src/LYrcFile.c:978
+msgid ""
+"Lynx User Defaults File\n"
+"\n"
+msgstr ""
+"Berkas Baku Pengguna Lynx\n"
+"\n"
+
+#: src/LYrcFile.c:987
+msgid ""
+"This file contains options saved from the Lynx Options Screen (normally\n"
+"with the 'o' key). To save options with that screen, you must select the\n"
+"checkbox:\n"
+msgstr ""
+"Berkas ini berisi opsi disimpan dari Opsi Layar Lynx (secara normal\n"
+"dengan tombol 'o'). Untuk menyimpan opsi di layar itu, Anda harus\n"
+"memilih checkbox:\n"
+
+#: src/LYrcFile.c:994
+msgid ""
+"You must then save the settings using the link on the line above the\n"
+"checkbox:\n"
+msgstr ""
+"Anda harus menyimpan konfigurasi menggunakan sambungan di baris\n"
+"diatas checkbox:\n"
+
+#: src/LYrcFile.c:1001
+msgid ""
+"You may also use the command-line option \"-forms_options\", which displays\n"
+"the simpler Options Menu instead. Save options with that using the '>' key.\n"
+"\n"
+msgstr ""
+"Anda juga boleh menggunakan opsi baris-perintah \" -forms_options\", yang\n"
+"menampilkan Opsi Menu lebih sederhana. Simpan opsi dengan itu menggunakan\n"
+"tombol '>'.\n"
+
+#: src/LYrcFile.c:1008
+msgid ""
+"This file contains options saved from the Lynx Options Screen (normally\n"
+"with the '>' key).\n"
+"\n"
+msgstr ""
+"Berkas ini berisi opsi disimpan dari Layar Opsi Lynx (secara normal\n"
+"dengan tombol '>').\n"
+"\n"
+
+#: src/LYrcFile.c:1015
+msgid ""
+"There is normally no need to edit this file manually, since the defaults\n"
+"here can be controlled from the Options Screen, and the next time options\n"
+"are saved from the Options Screen this file will be completely rewritten.\n"
+"You have been warned...\n"
+"\n"
+"If you are looking for the general configuration file - it is normally\n"
+"called \"lynx.cfg\". It has different content and a different format.\n"
+"It is not this file.\n"
+msgstr ""
+"Disana secara normal tidak dibutuhkan untuk mengubah berkas ini\n"
+"secara manual, karena disini baku dapat dikontrol dari Layar Opsi, dan opsi\n"
+"selanjutnya disimpan dari Layar Opsi berkas ini akan ditulis ulang.\n"
+"Anda telah diperingatkan...\n"
+"\n"
+"Jika Anda mencari untuk berkas konfigurasi umum - ini secara normal dipanggil\n"
+"lynx.cfg, dan ini memiliki isi berbeda dan sebuah format berbeda.\n"
+"Tapi bukan berkas ini.\n"
diff --git a/po/it.po b/po/it.po
new file mode 100644
index 0000000..4577de2
--- /dev/null
+++ b/po/it.po
@@ -0,0 +1,6110 @@
+# ITALIAN TRANSLATION OF LYNX-2.8.7-dev12
+# Copyright (C) 1998, 2002, 2008, 2009 Free Software Foundation, Inc.
+# This file is distributed under the same license as the lynx package.
+#
+# Sabato De Rosa, 1997 (release 2.7)
+# Giuliano Artico <artico@math.unipd.it>, 2002.
+# Vincenzo Campanella <vinz65@gmail.com>, 2008, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: lynx 2.8.7-dev12\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-04-26 11:42-0400\n"
+"PO-Revision-Date: 2009-04-10 17:59+0200\n"
+"Last-Translator: Vincenzo Campanella <vinz65@gmail.com>\n"
+"Language-Team: Italian <tp@lists.linux.it>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. ******************************************************************
+#. * The following definitions are for status line prompts, messages, or
+#. * warnings issued by Lynx during program execution. You can modify
+#. * them to make them more appropriate for your site. We recommend that
+#. * you extend these definitions to other languages using the gettext
+#. * library. There are also scattered uses of 'gettext()' throughout the
+#. * Lynx source, covering all but those messages which (a) are used for
+#. * debugging (CTRACE) or (b) are constants used in interaction with
+#. * other programs.
+#. *
+#. * Links to collections of alternate definitions, developed by the Lynx
+#. * User Community, are maintained in Lynx links:
+#. *
+#. * http://www.subir.com/lynx.html
+#. *
+#. * See ABOUT-NLS and po/readme for details and location of contributed
+#. * translations. When no translation is available, the English default is
+#. * used.
+#.
+#: LYMessages.c:32
+#, c-format
+msgid "Alert!: %s"
+msgstr "Attenzione: %s"
+
+#: LYMessages.c:33
+msgid "Welcome"
+msgstr "Benvenuti"
+
+#: LYMessages.c:34
+msgid "Are you sure you want to quit?"
+msgstr "Uscire da Lynx?"
+
+#: LYMessages.c:36
+msgid "Really exit from Lynx?"
+msgstr "Uscire veramente da Lynx?"
+
+#: LYMessages.c:38
+msgid "Connection interrupted."
+msgstr "Connessione interrotta."
+
+#: LYMessages.c:39
+msgid "Data transfer interrupted."
+msgstr "Trasferimento di dati interrotto."
+
+#: LYMessages.c:40
+msgid "Cancelled!!!"
+msgstr "Annullato."
+
+#: LYMessages.c:41
+msgid "Cancelling!"
+msgstr "Annullamento in corso."
+
+#: LYMessages.c:42
+msgid "Excellent!!!"
+msgstr "Ottimo!"
+
+#: LYMessages.c:43
+msgid "OK"
+msgstr "OK"
+
+#: LYMessages.c:44
+msgid "Done!"
+msgstr "Fatto."
+
+#: LYMessages.c:45
+msgid "Bad request!"
+msgstr "Richiesta non corretta."
+
+#: LYMessages.c:46
+msgid "previous"
+msgstr "precedente"
+
+#: LYMessages.c:47
+msgid "next screen"
+msgstr "prossima schermata"
+
+#: LYMessages.c:48
+msgid "HELP!"
+msgstr "AIUTO"
+
+#: LYMessages.c:49
+msgid ", help on "
+msgstr ", aiuto su "
+
+#. #define HELP
+#: LYMessages.c:51
+msgid "Commands: Use arrow keys to move, '?' for help, 'q' to quit, '<-' to go back."
+msgstr "Comandi: usare le frecce per spostarsi, «?» per l'aiuto, «q» per uscire, «<-»' per tornare indietro."
+
+#. #define MOREHELP
+#: LYMessages.c:53
+msgid "-- press space for more, use arrow keys to move, '?' for help, 'q' to quit."
+msgstr "-- premere la barra spaziatrice per continuare, usare le frecce per spostarsi, «?» per l'aiuto, «q» per uscire."
+
+#: LYMessages.c:54
+msgid "-- press space for next page --"
+msgstr "-- premere la barra spaziatrice per andare alla prossima pagina --"
+
+#: LYMessages.c:55
+msgid "URL too long"
+msgstr "URL troppo lungo"
+
+#. Inactive input fields, messages used with -tna option - kw
+#. #define FORM_LINK_TEXT_MESSAGE_INA
+#: LYMessages.c:61
+msgid "(Text entry field) Inactive. Press <return> to activate."
+msgstr "(Campo immissione testo) Non attivo. Premere <Invio> per attivare."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_INA
+#: LYMessages.c:63
+msgid "(Textarea) Inactive. Press <return> to activate."
+msgstr "(Area testo) Non attiva. Premere <Invio> per attivare."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_INA_E
+#: LYMessages.c:65
+#, c-format
+msgid "(Textarea) Inactive. Press <return> to activate (%s for editor)."
+msgstr "(Area testo) Non attiva. Premere <Invio> per attivare (%s per l'editor)."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE_INA
+#: LYMessages.c:67
+msgid "(Form field) Inactive. Use <return> to edit."
+msgstr "(Campo modulo) Non attivo. Usare <Invio> per modificare."
+
+#. #define FORM_TEXT_SUBMIT_MESSAGE_INA_X
+#: LYMessages.c:69
+#, c-format
+msgid "(Form field) Inactive. Use <return> to edit (%s to submit with no cache)."
+msgstr "(Campo modulo) Non attivo. Usare <Invio> per modificare (%s per inviare senza cache)."
+
+#. #define FORM_TEXT_RESUBMIT_MESSAGE_INA
+#: LYMessages.c:71
+msgid "(Form field) Inactive. Press <return> to edit, press <return> twice to submit."
+msgstr "(Campo modulo) Non attivo. Premere <Invio> per modificare, premere due volte <Invio> per inviare."
+
+#. #define FORM_TEXT_SUBMIT_MAILTO_MSG_INA
+#: LYMessages.c:73
+msgid "(mailto form field) Inactive. Press <return> to change."
+msgstr "(Campo invio posta elettronica) Non attivo. Premere <Invio> per cambiare."
+
+#. #define FORM_LINK_PASSWORD_MESSAGE_INA
+#: LYMessages.c:75
+msgid "(Password entry field) Inactive. Press <return> to activate."
+msgstr "(Campo immissione password) Non attivo. Premere <Invio> per attivare."
+
+#. #define FORM_LINK_FILE_UNM_MSG
+#: LYMessages.c:78
+msgid "UNMODIFIABLE file entry field. Use UP or DOWN arrows or tab to move off."
+msgstr "Campo immissione file INALTERABILE. Usare le frecce Su/Giù oppure il tabulatore per spostarsi."
+
+#. #define FORM_LINK_FILE_MESSAGE
+#: LYMessages.c:80
+msgid "(File entry field) Enter filename. Use UP or DOWN arrows or tab to move off."
+msgstr "(Campo immissione file) Inserire il nome del file. Usare le frecce Su/Giù oppure il tabulatore per spostarsi."
+
+#. #define FORM_LINK_TEXT_MESSAGE
+#: LYMessages.c:82
+msgid "(Text entry field) Enter text. Use UP or DOWN arrows or tab to move off."
+msgstr "(Campo immissione testo) Inserire il testo. Usare le frecce Su/Giù oppure il tabulatore per spostarsi."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE
+#: LYMessages.c:84
+msgid "(Textarea) Enter text. Use UP/DOWN arrows or TAB to move off."
+msgstr "(Area testo) Inserire il testo. Usare le frecce Su/Giù oppure il tabulatore per spostarsi."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_E
+#: LYMessages.c:86
+#, c-format
+msgid "(Textarea) Enter text. Use UP/DOWN arrows or TAB to move off (%s for editor)."
+msgstr "(Area testo) Inserire il testo. Usare le frecce Su/Giù oppure il tabulatore per spostarsi (%s per l'editor)."
+
+#. #define FORM_LINK_TEXT_UNM_MSG
+#: LYMessages.c:88
+msgid "UNMODIFIABLE form text field. Use UP or DOWN arrows or tab to move off."
+msgstr "Campo testo modulo INALTERABILE. Usare le frecce Su/Giù oppure il tabulatore per spostarsi."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE
+#: LYMessages.c:90
+msgid "(Form field) Enter text. Use <return> to submit."
+msgstr "(Campo modulo) Inserire il testo. Usare <Invio> per inviare."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE_X
+#: LYMessages.c:92
+#, c-format
+msgid "(Form field) Enter text. Use <return> to submit (%s for no cache)."
+msgstr "(Campo modulo) Inserire il testo. Usare <Invio> per inviare (%s per escludere la cache)."
+
+#. #define FORM_LINK_TEXT_RESUBMIT_MESSAGE
+#: LYMessages.c:94
+msgid "(Form field) Enter text. Use <return> to submit, arrows or tab to move off."
+msgstr "(Campo modulo) Inserire il testo. Usare <Invio> per inviare, le frecce oppure il tabulatore per spostarsi."
+
+#. #define FORM_LINK_TEXT_SUBMIT_UNM_MSG
+#: LYMessages.c:96
+msgid "UNMODIFIABLE form field. Use UP or DOWN arrows or tab to move off."
+msgstr "Campo modulo INALTERABILE. Usare le frecce Su/Giù oppure il tabulatore per spostarsi."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MAILTO_MSG
+#: LYMessages.c:98
+msgid "(mailto form field) Enter text. Use <return> to submit, arrows to move off."
+msgstr "(Campo invio posta elettronica) Inserire il testo. Usare <Invio> per inviare, le frecce per spostarsi."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MAILTO_DIS_MSG
+#: LYMessages.c:100
+msgid "(mailto form field) Mail is disallowed so you cannot submit."
+msgstr "(Campo invio posta elettronica) L'invio di posta elettronica non è ammesso, impossibile inviare."
+
+#. #define FORM_LINK_PASSWORD_MESSAGE
+#: LYMessages.c:102
+msgid "(Password entry field) Enter text. Use UP or DOWN arrows or tab to move off."
+msgstr "(Campo immissione password) Inserire il testo. Usare le frecce Su/Giù oppure il tabulatore per spostarsi."
+
+#. #define FORM_LINK_PASSWORD_UNM_MSG
+#: LYMessages.c:104
+msgid "UNMODIFIABLE form password. Use UP or DOWN arrows or tab to move off."
+msgstr "Modulo password INALTERABILE. Usare le frecce Su/Giù oppure il tabulatore per spostarsi."
+
+#. #define FORM_LINK_CHECKBOX_MESSAGE
+#: LYMessages.c:106
+msgid "(Checkbox Field) Use right-arrow or <return> to toggle."
+msgstr "(Casella di scelta) Usare la freccia destra o <Invio> per cambiare lo stato."
+
+#. #define FORM_LINK_CHECKBOX_UNM_MSG
+#: LYMessages.c:108
+msgid "UNMODIFIABLE form checkbox. Use UP or DOWN arrows or tab to move off."
+msgstr "Casella di scelta INALTERABILE. Usare le frecce Su/Giù oppure il tabulatore per spostarsi."
+
+#. #define FORM_LINK_RADIO_MESSAGE
+#: LYMessages.c:110
+msgid "(Radio Button) Use right-arrow or <return> to toggle."
+msgstr "(Pulsante radio) Usare la freccia destra o <Invio> per cambiare lo stato."
+
+#. #define FORM_LINK_RADIO_UNM_MSG
+#: LYMessages.c:112
+msgid "UNMODIFIABLE form radio button. Use UP or DOWN arrows or tab to move off."
+msgstr "Pulsante radio INALTERABILE. Usare le frecce Su/Giù oppure il tabulatore per spostarsi."
+
+#. #define FORM_LINK_SUBMIT_PREFIX
+#: LYMessages.c:114
+msgid "Submit ('x' for no cache) to "
+msgstr "Invia («x» per escludere la cache) a "
+
+#. #define FORM_LINK_RESUBMIT_PREFIX
+#: LYMessages.c:116
+msgid "Submit to "
+msgstr "Invia a "
+
+#. #define FORM_LINK_SUBMIT_MESSAGE
+#: LYMessages.c:118
+msgid "(Form submit button) Use right-arrow or <return> to submit ('x' for no cache)."
+msgstr "(Pulsante invio modulo) Usare la freccia destra o <Invio> per inviare («x» per escludere la cache)."
+
+#. #define FORM_LINK_RESUBMIT_MESSAGE
+#: LYMessages.c:120
+msgid "(Form submit button) Use right-arrow or <return> to submit."
+msgstr "(Pulsante invio modulo) Usare la freccia destra o <Invio> per inviare."
+
+#. #define FORM_LINK_SUBMIT_DIS_MSG
+#: LYMessages.c:122
+msgid "DISABLED form submit button. Use UP or DOWN arrows or tab to move off."
+msgstr "Pulsante invio modulo DISABILITATO. Usare le frecce Su/Giù oppure il tabulatore per spostarsi."
+
+#. #define FORM_LINK_SUBMIT_MAILTO_PREFIX
+#: LYMessages.c:124
+msgid "Submit mailto form to "
+msgstr "Invia il modulo tramite posta elettronica a "
+
+#. #define FORM_LINK_SUBMIT_MAILTO_MSG
+#: LYMessages.c:126
+msgid "(mailto form submit button) Use right-arrow or <return> to submit."
+msgstr "(Pulsante invio posta elettronica) Usare la freccia destra o <Invio> per inviare."
+
+#. #define FORM_LINK_SUBMIT_MAILTO_DIS_MSG
+#: LYMessages.c:128
+msgid "(mailto form submit button) Mail is disallowed so you cannot submit."
+msgstr "(Pulsante invio posta elettronica) L'invio di posta elettronica non è ammesso, impossibile inviare."
+
+#. #define FORM_LINK_RESET_MESSAGE
+#: LYMessages.c:130
+msgid "(Form reset button) Use right-arrow or <return> to reset form to defaults."
+msgstr "(Pulsante azzeramento modulo) Usare la freccia destra oppure <Invio> per riportare il modulo ai valori predefiniti."
+
+#. #define FORM_LINK_RESET_DIS_MSG
+#: LYMessages.c:132
+msgid "DISABLED form reset button. Use UP or DOWN arrows or tab to move off."
+msgstr "Pulsante azzeramento modulo DISABILITATO. Usare le frecce Su/Giù oppure il tabulatore per spostarsi."
+
+#. #define FORM_LINK_OPTION_LIST_MESSAGE
+#: LYMessages.c:134
+msgid "(Option list) Hit return and use arrow keys and return to select option."
+msgstr "(Elenco opzioni) Premere <Invio>, scegliere con le frecce e confermare con <Invio>."
+
+#. #define CHOICE_LIST_MESSAGE
+#: LYMessages.c:136
+msgid "(Choice list) Hit return and use arrow keys and return to select option."
+msgstr "(Elenco scelte) Premere <Invio>, scegliere con le frecce e confermare con <Invio>."
+
+#. #define FORM_LINK_OPTION_LIST_UNM_MSG
+#: LYMessages.c:138
+msgid "UNMODIFIABLE option list. Use return or arrow keys to review or leave."
+msgstr "Elenco opzioni INALTERABILE. Usare le frecce o <Invio> per esaminare o abbandonare."
+
+#. #define CHOICE_LIST_UNM_MSG
+#: LYMessages.c:140
+msgid "UNMODIFIABLE choice list. Use return or arrow keys to review or leave."
+msgstr "Elenco scelte INALTERABILE. Usare le frecce o <Invio> per esaminare o abbandonare."
+
+#: LYMessages.c:141
+msgid "Submitting form..."
+msgstr "Invio del modulo in corso"
+
+#: LYMessages.c:142
+msgid "Resetting form..."
+msgstr "Azzeramento del modulo in corso"
+
+#. #define RELOADING_FORM
+#: LYMessages.c:144
+msgid "Reloading document. Any form entries will be lost!"
+msgstr "Ricarica del documento in corso. I dati immessi nel modulo andranno persi."
+
+#: LYMessages.c:145
+#, c-format
+msgid "Warning: Cannot transcode form data to charset %s!"
+msgstr "Attenzione: impossibile convertire nel set di caratteri %s i dati del modulo."
+
+#. #define NORMAL_LINK_MESSAGE
+#: LYMessages.c:148
+msgid "(NORMAL LINK) Use right-arrow or <return> to activate."
+msgstr "(COLLEGAMENTO NORMALE) Usare la freccia destra o <Invio> per attivare."
+
+#: LYMessages.c:149
+msgid "The resource requested is not available at this time."
+msgstr "La risorsa richiesta non è disponibile in questo momento."
+
+#: LYMessages.c:150
+msgid "Enter Lynx keystroke command: "
+msgstr "Immettere il comando di Lynx con la tastiera: "
+
+#: LYMessages.c:151
+msgid "Looking up "
+msgstr "Ricerca in corso di "
+
+#: LYMessages.c:152
+#, c-format
+msgid "Getting %s"
+msgstr "Acquisizione di %s in corso"
+
+#: LYMessages.c:153
+#, c-format
+msgid "Skipping %s"
+msgstr "%s viene ignorato"
+
+#: LYMessages.c:154
+#, c-format
+msgid "Using %s"
+msgstr "%s viene usato"
+
+#: LYMessages.c:155
+#, c-format
+msgid "Illegal URL: %s"
+msgstr "URL illecito: %s"
+
+#: LYMessages.c:156
+#, c-format
+msgid "Badly formed address %s"
+msgstr "Indirizzo malformato %s"
+
+#: LYMessages.c:157
+#, c-format
+msgid "URL: %s"
+msgstr "URL: %s"
+
+#: LYMessages.c:158
+msgid "Unable to access WWW file!!!"
+msgstr "Impossibile accedere al file WWW."
+
+#: LYMessages.c:159
+#, c-format
+msgid "This is a searchable index. Use %s to search."
+msgstr "Questo è un indice consultabile. Usare %s per cercare."
+
+#. #define WWW_INDEX_MORE_MESSAGE
+#: LYMessages.c:161
+#, c-format
+msgid "--More-- This is a searchable index. Use %s to search."
+msgstr "--Segue-- Questo è un indice consultabile. Usare %s per cercare."
+
+#: LYMessages.c:162
+msgid "You have entered an invalid link number."
+msgstr "Il numero di collegamento immesso non è valido."
+
+#. #define SOURCE_HELP
+#: LYMessages.c:164
+msgid "Currently viewing document source. Press '\\' to return to rendered version."
+msgstr "Attualmente viene visualizzato il codice sorgente. Premere «\\» per tornare alla versione ipertestuale."
+
+#. #define NOVICE_LINE_ONE
+#: LYMessages.c:166
+msgid " Arrow keys: Up and Down to move. Right to follow a link; Left to go back. \n"
+msgstr " Frecce: Su/Giù per spostarsi, destra per seguire un collegamento, sinistra per tornare indietro. \n"
+
+#. #define NOVICE_LINE_TWO
+#: LYMessages.c:168
+msgid " H)elp O)ptions P)rint G)o M)ain screen Q)uit /=search [delete]=history list \n"
+msgstr " H = aiuto, O = opzioni, P = stampa, G = vai, M = pagina principale, Q = esci, / = cerca, <canc> = cronologia \n"
+
+#. #define NOVICE_LINE_TWO_A
+#: LYMessages.c:170
+msgid " O)ther cmds H)elp K)eymap G)oto P)rint M)ain screen o)ptions Q)uit \n"
+msgstr ""
+" O = altri comandi, H = aiuto, K = mappatura della tastiera, G = vai, P = stampa, M = pagina principale, o = opzioni, Q = "
+"esci \n"
+
+#. #define NOVICE_LINE_TWO_B
+#: LYMessages.c:172
+msgid " O)ther cmds B)ack E)dit D)ownload ^R)eload ^W)ipe screen search doc: / \n"
+msgstr " O = altri comandi, B = indietro, E = modifica, D = scarica, ^R = ricarica, ^W = pulisci schermo, / = cerca documento \n"
+
+#. #define NOVICE_LINE_TWO_C
+#: LYMessages.c:174
+msgid "O)ther cmds C)omment History: <backspace> Bookmarks: V)iew, A)dd, R)emove \n"
+msgstr "O = altri comandi, C = commento, <backspace> = cronologia | Segnalibri: V = visualizza, A = aggiungi, R = rimuovi \n"
+
+#. #define FORM_NOVICELINE_ONE
+#: LYMessages.c:176
+msgid " Enter text into the field by typing on the keyboard "
+msgstr " Usare la tastiera per immettere il testo nel campo "
+
+#. #define FORM_NOVICELINE_TWO
+#: LYMessages.c:178
+msgid " Ctrl-U to delete all text in field, [Backspace] to delete a character "
+msgstr " Ctrl-U per cancellare tutto il testo nel campo, <Backspace> per cancellare un carattere "
+
+#. #define FORM_NOVICELINE_TWO_DELBL
+#: LYMessages.c:180
+msgid " Ctrl-U to delete text in field, [Backspace] to delete a character "
+msgstr " Ctrl-U per cancellare il testo nel campo, <Backspace> per cancellare un carattere "
+
+#. #define FORM_NOVICELINE_TWO_VAR
+#: LYMessages.c:182
+#, c-format
+msgid " %s to delete all text in field, [Backspace] to delete a character "
+msgstr " %s per cancellare tutto il testo nel campo, <Backspace> per cancellare un carattere "
+
+#. #define FORM_NOVICELINE_TWO_DELBL_VAR
+#: LYMessages.c:184
+#, c-format
+msgid " %s to delete text in field, [Backspace] to delete a character "
+msgstr " %s per cancellare tutto il testo nel campo, <Backspace> per cancellare un carattere "
+
+#. mailto
+#: LYMessages.c:187
+msgid "Malformed mailto form submission! Cancelled!"
+msgstr "Invio del modulo di posta elettronica malformato. Richiesta annullata."
+
+#: LYMessages.c:188
+msgid "Warning! Control codes in mail address replaced by ?"
+msgstr "Attenzione: i codici di controllo nell'indirizzo di posta elettronica sono stati sostituiti con ?"
+
+#: LYMessages.c:189
+msgid "Mail disallowed! Cannot submit."
+msgstr "L'invio di posta elettronica non è ammesso. Impossibile inviare."
+
+#: LYMessages.c:190
+msgid "Mailto form submission failed!"
+msgstr "Impossibile inviare il modulo di posta elettronica."
+
+#: LYMessages.c:191
+msgid "Mailto form submission Cancelled!!!"
+msgstr "Invio del modulo di posta elettronica annullato."
+
+#: LYMessages.c:192
+msgid "Sending form content..."
+msgstr "Invio del contenuto del modulo in corso"
+
+#: LYMessages.c:193
+msgid "No email address is present in mailto URL!"
+msgstr "Non è presente alcun indirizzo di posta elettronica nell'URL mailto."
+
+#. #define MAILTO_URL_TEMPOPEN_FAILED
+#: LYMessages.c:195
+msgid "Unable to open temporary file for mailto URL!"
+msgstr "Impossibile aprire il file temporaneo per l'URL mailto."
+
+#. #define INC_ORIG_MSG_PROMPT
+#: LYMessages.c:197
+msgid "Do you wish to include the original message?"
+msgstr "Includere il messaggio originale?"
+
+#. #define INC_PREPARSED_MSG_PROMPT
+#: LYMessages.c:199
+msgid "Do you wish to include the preparsed source?"
+msgstr "Includere il sorgente preanalizzato?"
+
+#. #define SPAWNING_EDITOR_FOR_MAIL
+#: LYMessages.c:201
+msgid "Spawning your selected editor to edit mail message"
+msgstr "Avvio in corso dell'editor prescelto per l'elaborazione della posta elettronica"
+
+#. #define ERROR_SPAWNING_EDITOR
+#: LYMessages.c:203
+msgid "Error spawning editor, check your editor definition in the options menu"
+msgstr "Errore durante l'avvio dell'editor. Verificare la definizione dell'editor nel menù delle opzioni"
+
+#: LYMessages.c:204
+msgid "Send this comment?"
+msgstr "Inviare questo commento?"
+
+#: LYMessages.c:205
+msgid "Send this message?"
+msgstr "Inviare questo messaggio?"
+
+#: LYMessages.c:206
+msgid "Sending your message..."
+msgstr "Invio del messaggio in corso"
+
+#: LYMessages.c:207
+msgid "Sending your comment:"
+msgstr "Invio del commento in corso:"
+
+#. textarea
+#: LYMessages.c:210
+msgid "Not in a TEXTAREA; cannot use external editor."
+msgstr "Non si è in un'area di testo, impossibile usare l'editor esterno."
+
+#: LYMessages.c:211
+msgid "Not in a TEXTAREA; cannot use command."
+msgstr "Non si è in un'area di testo, impossibile usare questo comando."
+
+#: LYMessages.c:213
+msgid "file: ACTIONs are disallowed!"
+msgstr "Le azioni non sono ammesse con questo file."
+
+#. #define FILE_SERVED_LINKS_DISALLOWED
+#: LYMessages.c:215
+msgid "file: URLs via served links are disallowed!"
+msgstr "L'URL «file:» non è ammesso con i collegamenti serviti."
+
+#: LYMessages.c:216
+msgid "Access to local files denied."
+msgstr "Accesso ai file locali negato."
+
+#: LYMessages.c:217
+msgid "file: URLs via bookmarks are disallowed!"
+msgstr "L'URL «file:» non è ammesso nei segnalibri."
+
+#. #define SPECIAL_VIA_EXTERNAL_DISALLOWED
+#: LYMessages.c:219
+msgid "This special URL is not allowed in external documents!"
+msgstr "Questo particolare URL non è ammesso nei documenti esterni."
+
+#: LYMessages.c:220
+msgid "Press <return> to return to Lynx."
+msgstr "Premere <Invio> per ritornare a Lynx."
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:223
+msgid "Spawning DCL subprocess. Use 'logout' to return to Lynx.\n"
+msgstr "Avvio di un sottoprocesso DCL in corso. Usare «logout» per ritornare a Lynx.\n"
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:227
+msgid "Type EXIT to return to Lynx.\n"
+msgstr "Scrivere «EXIT» per ritornare a Lynx.\n"
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:230
+msgid "Spawning your default shell. Use 'exit' to return to Lynx.\n"
+msgstr "Avvio della shell predefinita in corso. Usare «exit» per ritornare a Lynx.\n"
+
+#: LYMessages.c:233
+msgid "Spawning is currently disabled."
+msgstr "L'avvio è attualmente disabilitato."
+
+#: LYMessages.c:234
+msgid "The 'd'ownload command is currently disabled."
+msgstr "Il comando «d» (scarica) è attualmente disabilitato."
+
+#: LYMessages.c:235
+msgid "You cannot download an input field."
+msgstr "Impossibile scaricare un campo d'immissione."
+
+#: LYMessages.c:236
+msgid "Form has a mailto action! Cannot download."
+msgstr "Il modulo contiene un'azione «mailto:». Impossibile scaricare."
+
+#: LYMessages.c:237
+msgid "You cannot download a mailto: link."
+msgstr "Impossibile scaricare un collegamento di tipo «mailto»."
+
+#: LYMessages.c:238
+msgid "You cannot download cookies."
+msgstr "Impossibile scaricare cookie."
+
+#: LYMessages.c:239
+msgid "You cannot download a printing option."
+msgstr "Impossibile scaricare un'opzione di stampa."
+
+#: LYMessages.c:240
+msgid "You cannot download an upload option."
+msgstr "Impossibile scaricare un'opzione di caricamento."
+
+#: LYMessages.c:241
+msgid "You cannot download an permit option."
+msgstr "Impossibile scaricare un'opzione di permessi."
+
+#: LYMessages.c:242
+msgid "This special URL cannot be downloaded!"
+msgstr "Questo particolare URL non può essere scaricato."
+
+#: LYMessages.c:243
+msgid "Nothing to download."
+msgstr "Non c'è nulla da scaricare."
+
+#: LYMessages.c:244
+msgid "Trace ON!"
+msgstr "Tracciamento ATTIVATO."
+
+#: LYMessages.c:245
+msgid "Trace OFF!"
+msgstr "Tracciamento DISATTIVATO."
+
+#. #define CLICKABLE_IMAGES_ON
+#: LYMessages.c:247
+msgid "Links will be included for all images! Reloading..."
+msgstr "I collegamenti saranno inclusi per tutte le immagini. Ricaricamento in corso."
+
+#. #define CLICKABLE_IMAGES_OFF
+#: LYMessages.c:249
+msgid "Standard image handling restored! Reloading..."
+msgstr "Trattamento normale delle immagini ripristinato. Ricaricamento in corso."
+
+#. #define PSEUDO_INLINE_ALTS_ON
+#: LYMessages.c:251
+msgid "Pseudo_ALTs will be inserted for inlines without ALT strings! Reloading..."
+msgstr "Verranno inseriti «pseudo-ALT» per le immagini prive dell'attributo «ALT». Ricaricamento in corso."
+
+#. #define PSEUDO_INLINE_ALTS_OFF
+#: LYMessages.c:253
+msgid "Inlines without an ALT string specified will be ignored! Reloading..."
+msgstr "Le immagini prive dell'attributo ALT verranno ignorate. Ricaricamento in corso."
+
+#: LYMessages.c:254
+msgid "Raw 8-bit or CJK mode toggled OFF! Reloading..."
+msgstr "Modalità 8-bit o CJK DISATTIVATA. Ricaricamento in corso."
+
+#: LYMessages.c:255
+msgid "Raw 8-bit or CJK mode toggled ON! Reloading..."
+msgstr "Modalità 8-bit o CJK ATTIVATA. Ricaricamento in corso."
+
+#. #define HEAD_D_L_OR_CANCEL
+#: LYMessages.c:257
+msgid "Send HEAD request for D)ocument or L)ink, or C)ancel? (d,l,c): "
+msgstr "Inviare richiesta HEAD per D = documento, L = collegamento, o C = annullare? (d,l,c): "
+
+#. #define HEAD_D_OR_CANCEL
+#: LYMessages.c:259
+msgid "Send HEAD request for D)ocument, or C)ancel? (d,c): "
+msgstr "Inviare richiesta HEAD per D = documento, o C = annullare? (d,c): "
+
+#: LYMessages.c:260
+msgid "Sorry, the document is not an http URL."
+msgstr "Spiacente, il documento non è un URL http."
+
+#: LYMessages.c:261
+msgid "Sorry, the link is not an http URL."
+msgstr "Spiacente, il collegamento non è un URL http."
+
+#: LYMessages.c:262
+msgid "Sorry, the ACTION for this form is disabled."
+msgstr "Spiacente, l'attributo ACTION per questo modulo è disabilitato."
+
+#. #define FORM_ACTION_NOT_HTTP_URL
+#: LYMessages.c:264
+msgid "Sorry, the ACTION for this form is not an http URL."
+msgstr "Spiacente, l'attributo ACTION per questo modulo non è un URL http."
+
+#: LYMessages.c:265
+msgid "Not an http URL or form ACTION!"
+msgstr "L'elemento non è né un URL http né ha un attributo ACTION."
+
+#: LYMessages.c:266
+msgid "This special URL cannot be a form ACTION!"
+msgstr "Questo particolare URL non può essere un attributo ACTION."
+
+#: LYMessages.c:267
+msgid "URL is not in starting realm!"
+msgstr "L'URL non è nel dominio di partenza."
+
+#: LYMessages.c:268
+msgid "News posting is disabled!"
+msgstr "L'invio di articoli è disabilitato."
+
+#: LYMessages.c:269
+msgid "File management support is disabled!"
+msgstr "Il supporto alla gestione di file è disabilitato."
+
+#: LYMessages.c:270
+msgid "No jump file is currently available."
+msgstr "Non è disponibile alcun file di accesso rapido."
+
+#: LYMessages.c:271
+msgid "Jump to (use '?' for list): "
+msgstr "Vai a (usare «?» per l'elenco): "
+
+#: LYMessages.c:272
+msgid "Jumping to a shortcut URL is disallowed!"
+msgstr "L'accesso rapido a una scorciatoia URL non è ammesso."
+
+#: LYMessages.c:273
+msgid "Random URL is disallowed! Use a shortcut."
+msgstr "Gli URL casuali non sono ammessi. Usare una scorciatoia."
+
+#: LYMessages.c:274
+msgid "No random URLs have been used thus far."
+msgstr "Finora non è stato usato alcun URL casuale."
+
+#: LYMessages.c:275
+msgid "Bookmark features are currently disabled."
+msgstr "Le funzioni riguardanti i segnalibri sono attualmente disabilitate."
+
+#: LYMessages.c:276
+msgid "Execution via bookmarks is disabled."
+msgstr "L'esecuzione a partire dai segnalibri è disabilitata."
+
+#. #define BOOKMARK_FILE_NOT_DEFINED
+#: LYMessages.c:278
+#, c-format
+msgid "Bookmark file is not defined. Use %s to see options."
+msgstr "Il file dei segnalibri non è definito. Usare %s per vedere le opzioni."
+
+#. #define NO_TEMP_FOR_HOTLIST
+#: LYMessages.c:280
+msgid "Unable to open tempfile for X Mosaic hotlist conversion."
+msgstr "Impossibile aprire il file temporaneo per convertire i segnalibri di X Mosaic."
+
+#: LYMessages.c:281
+msgid "ERROR - unable to open bookmark file."
+msgstr "ERRORE - Impossibile aprire il file dei segnalibri."
+
+#. #define BOOKMARK_OPEN_FAILED_FOR_DEL
+#: LYMessages.c:283
+msgid "Unable to open bookmark file for deletion of link."
+msgstr "Impossibile aprire il file dei segnalibri per l'eliminazione del collegamento."
+
+#. #define BOOKSCRA_OPEN_FAILED_FOR_DEL
+#: LYMessages.c:285
+msgid "Unable to open scratch file for deletion of link."
+msgstr "Impossibile aprire il file di appoggio per l'eliminazione del collegamento."
+
+#: LYMessages.c:287
+msgid "Error renaming scratch file."
+msgstr "Errore nel rinominare il file di appoggio."
+
+#: LYMessages.c:289
+msgid "Error renaming temporary file."
+msgstr "Errore nel rinominare il file temporaneo."
+
+#. #define BOOKTEMP_COPY_FAIL
+#: LYMessages.c:291
+msgid "Unable to copy temporary file for deletion of link."
+msgstr "Impossibile copiare il file temporaneo per l'eliminazione del collegamento."
+
+#. #define BOOKTEMP_REOPEN_FAIL_FOR_DEL
+#: LYMessages.c:293
+msgid "Unable to reopen temporary file for deletion of link."
+msgstr "Impossibile riaprire il file temporaneo per l'eliminazione del collegamento."
+
+#. #define BOOKMARK_LINK_NOT_ONE_LINE
+#: LYMessages.c:296
+msgid "Link is not by itself all on one line in bookmark file."
+msgstr "Il collegamento non è contenuto in un'unica riga nel file dei segnalibri."
+
+#: LYMessages.c:297
+msgid "Bookmark deletion failed."
+msgstr "Impossibile eliminare il segnalibro."
+
+#. #define BOOKMARKS_NOT_TRAVERSED
+#: LYMessages.c:299
+msgid "Bookmark files cannot be traversed (only http URLs)."
+msgstr "Impossibile scorrere i file dei segnalibri (solo gli URL http)."
+
+#. #define BOOKMARKS_NOT_OPEN
+#: LYMessages.c:301
+msgid "Unable to open bookmark file, use 'a' to save a link first"
+msgstr "Impossibile aprire il file dei segnalibri; usare dapprima «a» per salvare un collegamento."
+
+#: LYMessages.c:302
+msgid "There are no links in this bookmark file!"
+msgstr "Nessun collegamento in questo file dei segnalibri."
+
+#. #define CACHE_D_OR_CANCEL
+#: LYMessages.c:304
+msgid "D)elete cached document or C)ancel? (d,c): "
+msgstr "D = elimina il documento nella cache, C = annulla? (d,c): "
+
+#. #define BOOK_D_L_OR_CANCEL
+#: LYMessages.c:306
+msgid "Save D)ocument or L)ink to bookmark file or C)ancel? (d,l,c): "
+msgstr "D = salva il documento nei preferiti, L = salva il collegamento nei preferiti, C = annulla? (d,l,c): "
+
+#: LYMessages.c:307
+msgid "Save D)ocument to bookmark file or C)ancel? (d,c): "
+msgstr "D = salva il documento nei segnalibri, C = annulla? (d,c): "
+
+#: LYMessages.c:308
+msgid "Save L)ink to bookmark file or C)ancel? (l,c): "
+msgstr "L = salva il collegamento nei segnalibri, C = Annulla? (l,c): "
+
+#. #define NOBOOK_POST_FORM
+#: LYMessages.c:310
+msgid "Documents from forms with POST content cannot be saved as bookmarks."
+msgstr "Impossibile salvare nei segnalibri documenti da moduli con contenuto POST."
+
+#: LYMessages.c:311
+msgid "Cannot save form fields/links"
+msgstr "Impossibile salvare campi o collegamenti di un modulo."
+
+#. #define NOBOOK_HSML
+#: LYMessages.c:313
+msgid "History, showinfo, menu and list files cannot be saved as bookmarks."
+msgstr "Impossibile salvare come segnalibri cronologia, informazioni, menù ed elenco di file."
+
+#. #define CONFIRM_BOOKMARK_DELETE
+#: LYMessages.c:315
+msgid "Do you really want to delete this link from your bookmark file?"
+msgstr "Eliminare veramente questa voce dai segnalibri?"
+
+#: LYMessages.c:316
+msgid "Malformed address."
+msgstr "Indirizzo malformato."
+
+#. #define HISTORICAL_ON_MINIMAL_OFF
+#: LYMessages.c:318
+msgid "Historical comment parsing ON (Minimal is overridden)!"
+msgstr "Analisi storica dei commenti ATTIVATA (l'analisi minima viene sostituita)."
+
+#. #define HISTORICAL_OFF_MINIMAL_ON
+#: LYMessages.c:320
+msgid "Historical comment parsing OFF (Minimal is in effect)!"
+msgstr "Analisi storica dei commenti DISATTIVATA (analisi minima in atto)."
+
+#. #define HISTORICAL_ON_VALID_OFF
+#: LYMessages.c:322
+msgid "Historical comment parsing ON (Valid is overridden)!"
+msgstr "Analisi storica dei commenti ATTIVATA (l'analisi di validità viene sostituita)."
+
+#. #define HISTORICAL_OFF_VALID_ON
+#: LYMessages.c:324
+msgid "Historical comment parsing OFF (Valid is in effect)!"
+msgstr "Analisi storica dei commenti DISATTIVATA (analisi di validità in atto)."
+
+#. #define MINIMAL_ON_IN_EFFECT
+#: LYMessages.c:326
+msgid "Minimal comment parsing ON (and in effect)!"
+msgstr "Analisi minima dei commenti ATTIVATA (e in atto)."
+
+#. #define MINIMAL_OFF_VALID_ON
+#: LYMessages.c:328
+msgid "Minimal comment parsing OFF (Valid is in effect)!"
+msgstr "Analisi minima dei commenti DISATTIVATA (analisi di validità in atto)."
+
+#. #define MINIMAL_ON_BUT_HISTORICAL
+#: LYMessages.c:330
+msgid "Minimal comment parsing ON (but Historical is in effect)!"
+msgstr "Analisi minima dei commenti ATTIVATA (ma l'analisi storica è in atto)."
+
+#. #define MINIMAL_OFF_HISTORICAL_ON
+#: LYMessages.c:332
+msgid "Minimal comment parsing OFF (Historical is in effect)!"
+msgstr "Analisi minima dei commenti DISATTIVATA (analisi storica in atto)."
+
+#: LYMessages.c:333
+msgid "Soft double-quote parsing ON!"
+msgstr "Analisi flessibile delle virgolette (soft double-quote) ATTIVATA."
+
+#: LYMessages.c:334
+msgid "Soft double-quote parsing OFF!"
+msgstr "Analisi flessibile delle virgolette (soft double-quote) DISATTIVATA."
+
+#: LYMessages.c:335
+msgid "Now using TagSoup parsing of HTML."
+msgstr "Analisi dell'HTML in stile TagSoup (meno rigida) in uso."
+
+#: LYMessages.c:336
+msgid "Now using SortaSGML parsing of HTML!"
+msgstr "Analisi dell'HTML in stile SortaSGML (più rigida) in uso."
+
+#: LYMessages.c:337
+msgid "You are already at the end of this document."
+msgstr "Si è già alla fine del documento."
+
+#: LYMessages.c:338
+msgid "You are already at the beginning of this document."
+msgstr "Si è già all'inizio del documento."
+
+#: LYMessages.c:339
+#, c-format
+msgid "You are already at page %d of this document."
+msgstr "Si è già alla pagina %d di questo documento."
+
+#: LYMessages.c:340
+#, c-format
+msgid "Link number %d already is current."
+msgstr "Si è già al collegamento numero %d."
+
+#: LYMessages.c:341
+msgid "You are already at the first document"
+msgstr "Si è già al primo documento."
+
+#: LYMessages.c:342
+msgid "There are no links above this line of the document."
+msgstr "Non ci sono collegamenti sopra questa riga del documento."
+
+#: LYMessages.c:343
+msgid "There are no links below this line of the document."
+msgstr "Non ci sono collegamenti sotto questa riga del documento."
+
+#. #define MAXLEN_REACHED_DEL_OR_MOV
+#: LYMessages.c:345
+msgid "Maximum length reached! Delete text or move off field."
+msgstr "Raggiunta la lunghezza massima. Cancellare del testo o uscire dal campo."
+
+#. #define NOT_ON_SUBMIT_OR_LINK
+#: LYMessages.c:347
+msgid "You are not on a form submission button or normal link."
+msgstr "Non si è su un pulsante di invio del modulo o su un collegamento normale."
+
+#. #define NEED_CHECKED_RADIO_BUTTON
+#: LYMessages.c:349
+msgid "One radio button must be checked at all times!"
+msgstr "Un pulsante radio deve sempre esser attivato."
+
+#: LYMessages.c:350
+msgid "No submit button for this form, submit single text field?"
+msgstr "Questo modulo non contiene un pulsante di invio. Inviare il campo di testo singolo?"
+
+#: LYMessages.c:351
+msgid "Do you want to go back to the previous document?"
+msgstr "Ritornare al documento precedente?"
+
+#: LYMessages.c:352
+msgid "Use arrows or tab to move off of field."
+msgstr "Usare le frecce o il tabulatore per uscire da questo campo."
+
+#. #define ENTER_TEXT_ARROWS_OR_TAB
+#: LYMessages.c:354
+msgid "Enter text. Use arrows or tab to move off of field."
+msgstr "Inserire il testo. Usare le frecce Su/Giù oppure il tabulatore per uscire dal campo."
+
+#: LYMessages.c:355
+msgid "** Bad HTML!! No form action defined. **"
+msgstr "** Errore nel codice HTML: non è definita alcuna azione per il modulo. **"
+
+#: LYMessages.c:356
+msgid "Bad HTML!! Unable to create popup window!"
+msgstr "Errore nel codice HTML: impossibile creare la finestra di popup."
+
+#: LYMessages.c:357
+msgid "Unable to create popup window!"
+msgstr "Impossibile creare la finestra di popup."
+
+#: LYMessages.c:358
+msgid "Goto a random URL is disallowed!"
+msgstr "Il rinvio a un URL casuale non è ammesso."
+
+#: LYMessages.c:359
+msgid "Goto a non-http URL is disallowed!"
+msgstr "Il rinvio a un URL non HTTP non è ammesso."
+
+#: LYMessages.c:360
+#, c-format
+msgid "You are not allowed to goto \"%s\" URLs"
+msgstr "Non è consentito andare agli URL «%s»"
+
+#: LYMessages.c:361
+msgid "URL to open: "
+msgstr "URL da aprire: "
+
+#: LYMessages.c:362
+msgid "Edit the current Goto URL: "
+msgstr "Modifica dell'URL Goto attuale: "
+
+#: LYMessages.c:363
+msgid "Edit the previous Goto URL: "
+msgstr "Modifica dell'URL Goto precedente: "
+
+#: LYMessages.c:364
+msgid "Edit a previous Goto URL: "
+msgstr "Modifica di un URL Goto precedente: "
+
+#: LYMessages.c:365
+msgid "Current document has POST data."
+msgstr "Il documento attuale contiene dati POST."
+
+#: LYMessages.c:366
+msgid "Edit this document's URL: "
+msgstr "Modifica l'URL di questo documento: "
+
+#: LYMessages.c:367
+msgid "Edit the current link's URL: "
+msgstr "Modifica l'URL del collegamento attuale: "
+
+#: LYMessages.c:368
+msgid "You cannot edit File Management URLs"
+msgstr "Impossibile modificare gli URL della gestione dei file."
+
+#: LYMessages.c:369
+msgid "Enter a database query: "
+msgstr "Immettere un'interrogazione per il database: "
+
+#: LYMessages.c:370
+msgid "Enter a whereis query: "
+msgstr "Immettere un'interrogazione whereis: "
+
+#: LYMessages.c:371
+msgid "Edit the current query: "
+msgstr "Modifica l'interrogazione attuale: "
+
+#: LYMessages.c:372
+msgid "Edit the previous query: "
+msgstr "Modifica l'interrogazione precedente: "
+
+#: LYMessages.c:373
+msgid "Edit a previous query: "
+msgstr "Modifica di un'interrogazione precedente: "
+
+#. #define USE_C_R_TO_RESUB_CUR_QUERY
+#: LYMessages.c:375
+msgid "Use Control-R to resubmit the current query."
+msgstr "Usare Ctrl-R per inviare nuovamente l'interrogazione attuale."
+
+#: LYMessages.c:376
+msgid "Edit the current shortcut: "
+msgstr "Modifica la scorciatoia attuale: "
+
+#: LYMessages.c:377
+msgid "Edit the previous shortcut: "
+msgstr "Modifica la scorciatoia precedente: "
+
+#: LYMessages.c:378
+msgid "Edit a previous shortcut: "
+msgstr "Modifica una scorciatoia precedente: "
+
+#: LYMessages.c:379
+#, c-format
+msgid "Key '%c' is not mapped to a jump file!"
+msgstr "Il tasto «%c» non corrisponde a un file di accesso rapido."
+
+#: LYMessages.c:380
+msgid "Cannot locate jump file!"
+msgstr "Impossibile trovare il file di accesso rapido."
+
+#: LYMessages.c:381
+msgid "Cannot open jump file!"
+msgstr "Impossibile aprire il file di accesso rapido."
+
+#: LYMessages.c:382
+msgid "Error reading jump file!"
+msgstr "Errore durante la lettura del file di accesso rapido."
+
+#: LYMessages.c:383
+msgid "Out of memory reading jump file!"
+msgstr "Memoria esaurita durante la lettura del file di accesso rapido."
+
+#: LYMessages.c:384
+msgid "Out of memory reading jump table!"
+msgstr "Memoria esaurita durante la lettura della tabella degli accessi rapidi."
+
+#: LYMessages.c:385
+msgid "No index is currently available."
+msgstr "Attualmente non è disponibile alcun indice."
+
+#. #define CONFIRM_MAIN_SCREEN
+#: LYMessages.c:387
+msgid "Do you really want to go to the Main screen?"
+msgstr "Andare alla pagina principale?"
+
+#: LYMessages.c:388
+msgid "You are already at main screen!"
+msgstr "Si è già nella pagina principale."
+
+#. #define NOT_ISINDEX
+#: LYMessages.c:390
+msgid "Not a searchable indexed document -- press '/' to search for a text string"
+msgstr "Documento non indicizzato. Premere «/» per cercare una stringa di testo."
+
+#. #define NO_OWNER
+#: LYMessages.c:392
+msgid "No owner is defined for this file so you cannot send a comment"
+msgstr "Non è stato definito alcun proprietario di questo file. Impossibile inviare un commento."
+
+#: LYMessages.c:393
+#, c-format
+msgid "No owner is defined. Use %s?"
+msgstr "Non è stato definito alcun proprietario. Usare %s?"
+
+#: LYMessages.c:394
+msgid "Do you wish to send a comment?"
+msgstr "Inviare un commento?"
+
+#: LYMessages.c:395
+msgid "Mail is disallowed so you cannot send a comment"
+msgstr "La posta elettronica non è ammessa. Impossibile inviare un commento."
+
+#: LYMessages.c:396
+msgid "The 'e'dit command is currently disabled."
+msgstr "Il comando «e» (editor) è attualmente disabilitato."
+
+#: LYMessages.c:397
+msgid "External editing is currently disabled."
+msgstr "La modifica esterna è attualmente disabilitata."
+
+#: LYMessages.c:398
+msgid "System error - failure to get status."
+msgstr "Errore di sistema: impossibile rilevare lo stato."
+
+#: LYMessages.c:399
+msgid "No editor is defined!"
+msgstr "Non è stato definito alcun editor."
+
+#: LYMessages.c:400
+msgid "The 'p'rint command is currently disabled."
+msgstr "Il comando «p» (stampa) è attualmente disabilitato."
+
+#: LYMessages.c:401
+msgid "Document has no Toolbar links or Banner."
+msgstr "Il documento non ha barre di strumenti o banner."
+
+#: LYMessages.c:402
+msgid "Unable to open traversal file."
+msgstr "Impossibile aprire il file dei percorsi."
+
+#: LYMessages.c:403
+msgid "Unable to open traversal found file."
+msgstr "Impossibile aprire il file dei percorsi trovato."
+
+#: LYMessages.c:404
+msgid "Unable to open reject file."
+msgstr "Impossibile aprire il file dei percorsi respinti."
+
+#: LYMessages.c:405
+msgid "Unable to open traversal errors output file"
+msgstr "Impossibile aprire il file degli errori dei percorsi"
+
+#: LYMessages.c:406
+msgid "TRAVERSAL WAS INTERRUPTED"
+msgstr "RILEVAMENTO DEI PERCORSI INTERROTTO"
+
+#: LYMessages.c:407
+msgid "Follow link (or goto link or page) number: "
+msgstr "Seguire il collegamento (o andare al collegamento o alla pagina) numero: "
+
+#: LYMessages.c:408
+msgid "Select option (or page) number: "
+msgstr "Selezionare il numero di opzione o di pagina: "
+
+#: LYMessages.c:409
+#, c-format
+msgid "Option number %d already is current."
+msgstr "L'opzione numero %d è già quella attuale."
+
+#. #define ALREADY_AT_OPTION_END
+#: LYMessages.c:411
+msgid "You are already at the end of this option list."
+msgstr "Si è già alla fine di questo elenco di opzioni."
+
+#. #define ALREADY_AT_OPTION_BEGIN
+#: LYMessages.c:413
+msgid "You are already at the beginning of this option list."
+msgstr "Si è già all'inizio di questo elenco di opzioni."
+
+#. #define ALREADY_AT_OPTION_PAGE
+#: LYMessages.c:415
+#, c-format
+msgid "You are already at page %d of this option list."
+msgstr "Si è già alla pagina %d di questo elenco di opzioni."
+
+#: LYMessages.c:416
+msgid "You have entered an invalid option number."
+msgstr "Il numero di opzione immesso non è valido."
+
+#: LYMessages.c:417
+msgid "** Bad HTML!! Use -trace to diagnose. **"
+msgstr "** Errore nel codice HTML. Usare «-trace» per la diagnosi. **"
+
+#: LYMessages.c:418
+msgid "Give name of file to save in"
+msgstr "Inserire il nome del file in cui salvare"
+
+#: LYMessages.c:419
+msgid "Can't save data to file -- please run WWW locally"
+msgstr "Impossibile salvare i dati nel file. Eseguire WWW localmente"
+
+#: LYMessages.c:420
+msgid "Can't open temporary file!"
+msgstr "Impossibile aprire il file temporaneo."
+
+#: LYMessages.c:421
+msgid "Can't open output file! Cancelling!"
+msgstr "Impossibile aprire il file di output. Richiesta annullata."
+
+#: LYMessages.c:422
+msgid "Execution is disabled."
+msgstr "L'esecuzione è disabilitata."
+
+#. #define EXECUTION_DISABLED_FOR_FILE
+#: LYMessages.c:424
+#, c-format
+msgid "Execution is not enabled for this file. See the Options menu (use %s)."
+msgstr "Esecuzione disabilitata per questo file. Vedere il menù Opzioni (usare %s)."
+
+#. #define EXECUTION_NOT_COMPILED
+#: LYMessages.c:426
+msgid "Execution capabilities are not compiled into this version."
+msgstr "Le funzionalità di esecuzione non sono compilate in questa versione."
+
+#: LYMessages.c:427
+msgid "This file cannot be displayed on this terminal."
+msgstr "Questo file non può essere visualizzato su questo terminale."
+
+#. #define CANNOT_DISPLAY_FILE_D_OR_C
+#: LYMessages.c:429
+msgid "This file cannot be displayed on this terminal: D)ownload, or C)ancel"
+msgstr "Impossibile mostrare il file su questo terminale: D = scaricarlo, o C = annullare"
+
+#: LYMessages.c:430
+#, c-format
+msgid "%s D)ownload, or C)ancel"
+msgstr "%s D = scaricare, o C = annullare"
+
+#: LYMessages.c:431
+msgid "Cancelling file."
+msgstr "Annullamento in corso."
+
+#: LYMessages.c:432
+msgid "Retrieving file. - PLEASE WAIT -"
+msgstr "Recupero del file in corso. ATTENDERE."
+
+#: LYMessages.c:433
+msgid "Enter a filename: "
+msgstr "Inserire un nome di file: "
+
+#: LYMessages.c:434
+msgid "Edit the previous filename: "
+msgstr "Modificare il nome di file precedente: "
+
+#: LYMessages.c:435
+msgid "Edit a previous filename: "
+msgstr "Modificare un nome di file precedente: "
+
+#: LYMessages.c:436
+msgid "Enter a new filename: "
+msgstr "Inserire un nuovo nome di file: "
+
+#: LYMessages.c:437
+msgid "File name may not begin with a dot."
+msgstr "Un nome di file non può iniziare con un punto."
+
+#: LYMessages.c:439
+msgid "File exists. Create higher version?"
+msgstr "Il file esiste già. Crearne una nuova versione?"
+
+#: LYMessages.c:441
+msgid "File exists. Overwrite?"
+msgstr "Il file esiste già. Sovrascriverlo?"
+
+#: LYMessages.c:443
+msgid "Cannot write to file."
+msgstr "Impossibile scrivere il file."
+
+#: LYMessages.c:444
+msgid "ERROR! - download command is misconfigured."
+msgstr "ERRORE: il comando di scaricamento è mal configurato."
+
+#: LYMessages.c:445
+msgid "Unable to download file."
+msgstr "Impossibile scaricare il file."
+
+#: LYMessages.c:446
+msgid "Reading directory..."
+msgstr "Lettura della directory in corso."
+
+#: LYMessages.c:447
+msgid "Building directory listing..."
+msgstr "Generazione dell'elenco delle directory in corso."
+
+#: LYMessages.c:448
+msgid "Saving..."
+msgstr "Salvataggio in corso."
+
+#: LYMessages.c:449
+#, c-format
+msgid "Could not edit file '%s'."
+msgstr "Impossibile modificare il file «%s»."
+
+#: LYMessages.c:450
+msgid "Unable to access document!"
+msgstr "Impossibile accedere al documento."
+
+#: LYMessages.c:451
+msgid "Could not access file."
+msgstr "Impossibile accedere al file."
+
+#: LYMessages.c:452
+msgid "Could not access directory."
+msgstr "Impossibile accedere alla directory."
+
+#: LYMessages.c:453
+msgid "Could not load data."
+msgstr "Impossibile caricare i dati."
+
+#. #define CANNOT_EDIT_REMOTE_FILES
+#: LYMessages.c:455
+msgid "Lynx cannot currently (e)dit remote WWW files."
+msgstr "Attualmente non è possibile (E) modificare file WWW remoti."
+
+#. #define CANNOT_EDIT_FIELD
+#: LYMessages.c:457
+msgid "This field cannot be (e)dited with an external editor."
+msgstr "Questo campo non può essere (E) modificato con un editor esterno."
+
+#: LYMessages.c:458
+msgid "Bad rule"
+msgstr "Regola non valida."
+
+#: LYMessages.c:459
+msgid "Insufficient operands:"
+msgstr "Numero di operandi insufficiente."
+
+#: LYMessages.c:460
+msgid "You are not authorized to edit this file."
+msgstr "Nessuna autorizzazione per modificare questo file."
+
+#: LYMessages.c:461
+msgid "Title: "
+msgstr "Titolo: "
+
+#: LYMessages.c:462
+msgid "Subject: "
+msgstr "Oggetto: "
+
+#: LYMessages.c:463
+msgid "Username: "
+msgstr "Nome utente: "
+
+#: LYMessages.c:464
+msgid "Password: "
+msgstr "Password: "
+
+#: LYMessages.c:465
+msgid "lynx: Username and Password required!!!"
+msgstr "lynx: nome utente e password obbligatori."
+
+#: LYMessages.c:466
+msgid "lynx: Password required!!!"
+msgstr "lynx: password obbligatoria."
+
+#: LYMessages.c:467
+msgid "Clear all authorization info for this session?"
+msgstr "Eliminare tutte le informazioni di autorizzazione per questa sessione?"
+
+#: LYMessages.c:468
+msgid "Authorization info cleared."
+msgstr "Informazioni di autorizzazione eliminate."
+
+#: LYMessages.c:469
+msgid "Authorization failed. Retry?"
+msgstr "Autorizzazione fallita. Riprovare?"
+
+#: LYMessages.c:470
+msgid "cgi support has been disabled."
+msgstr "Il supporto cgi è stato disabilitato."
+
+#. #define CGI_NOT_COMPILED
+#: LYMessages.c:472
+msgid "Lynxcgi capabilities are not compiled into this version."
+msgstr "Le funzionalità Lynxcgi non sono compilate in questa versione."
+
+#: LYMessages.c:473
+#, c-format
+msgid "Sorry, no known way of converting %s to %s."
+msgstr "Spiacente, non è noto alcun metodo per convertire %s in %s."
+
+#: LYMessages.c:474
+msgid "Unable to set up connection."
+msgstr "Impossibile stabilire la connessione."
+
+#: LYMessages.c:475
+msgid "Unable to make connection"
+msgstr "Impossibile creare la connessione"
+
+#. #define MALFORMED_EXEC_REQUEST
+#: LYMessages.c:477
+msgid "Executable link rejected due to malformed request."
+msgstr "Collegamento eseguibile rifiutato a causa di richiesta malformata."
+
+#. #define BADCHAR_IN_EXEC_LINK
+#: LYMessages.c:479
+#, c-format
+msgid "Executable link rejected due to `%c' character."
+msgstr "Collegamento eseguibile rifiutato a causa del carattere «%c»."
+
+#. #define RELPATH_IN_EXEC_LINK
+#: LYMessages.c:481
+msgid "Executable link rejected due to relative path string ('../')."
+msgstr "Collegamento eseguibile rifiutato a causa di una stringa di percorso relativo («../»)."
+
+#. #define BADLOCPATH_IN_EXEC_LINK
+#: LYMessages.c:483
+msgid "Executable link rejected due to location or path."
+msgstr "Collegamento eseguibile rifiutato a causa della posizione o del percorso."
+
+#: LYMessages.c:484
+msgid "Mail access is disabled!"
+msgstr "L'accesso alla posta elettronica è disabilitato."
+
+#. #define ACCESS_ONLY_LOCALHOST
+#: LYMessages.c:486
+msgid "Only files and servers on the local host can be accessed."
+msgstr "Sono accessibili solo i file e i server del sistema locale."
+
+#: LYMessages.c:487
+msgid "Telnet access is disabled!"
+msgstr "L'accesso Telnet è disabilitato."
+
+#. #define TELNET_PORT_SPECS_DISABLED
+#: LYMessages.c:489
+msgid "Telnet port specifications are disabled."
+msgstr "Le specifiche delle porte Telnet sono disabilitate."
+
+#: LYMessages.c:490
+msgid "USENET news access is disabled!"
+msgstr "L'accesso agli articoli Usenet è disabilitato."
+
+#: LYMessages.c:491
+msgid "Rlogin access is disabled!"
+msgstr "L'accesso Rlogin è disabilitato."
+
+#: LYMessages.c:492
+msgid "Ftp access is disabled!"
+msgstr "L'accesso FTP è disabilitato."
+
+#: LYMessages.c:493
+msgid "There are no references from this document."
+msgstr "Non esistono riferimenti da questo documento."
+
+#: LYMessages.c:494
+msgid "There are only hidden links from this document."
+msgstr "Ci sono solo collegamenti nascosti da questo documento."
+
+#: LYMessages.c:496
+msgid "Unable to open command file."
+msgstr "Impossibile aprire il file dei comandi."
+
+#: LYMessages.c:498
+msgid "News Post Cancelled!!!"
+msgstr "Invio dell'articolo annullato."
+
+#. #define SPAWNING_EDITOR_FOR_NEWS
+#: LYMessages.c:500
+msgid "Spawning your selected editor to edit news message"
+msgstr "Avvio in corso dell'editor prescelto per la modifica dell'articolo"
+
+#: LYMessages.c:501
+msgid "Post this message?"
+msgstr "Inviare questo messaggio?"
+
+#: LYMessages.c:502
+#, c-format
+msgid "Append '%s'?"
+msgstr "Accodare «%s»?"
+
+#: LYMessages.c:503
+msgid "Posting to newsgroup(s)..."
+msgstr "Invio del messaggio ai gruppi di discussione in corso."
+
+#: LYMessages.c:505
+msgid "*** You have unread mail. ***"
+msgstr "*** È presente posta non letta ***"
+
+#: LYMessages.c:507
+msgid "*** You have mail. ***"
+msgstr "*** È presente posta. ***"
+
+#: LYMessages.c:509
+msgid "*** You have new mail. ***"
+msgstr "*** È presente nuova posta. ***"
+
+#: LYMessages.c:510
+msgid "File insert cancelled!!!"
+msgstr "Inserimento del file annullato."
+
+#: LYMessages.c:511
+msgid "Not enough memory for file!"
+msgstr "Memoria insufficiente per il file."
+
+#: LYMessages.c:512
+msgid "Can't open file for reading."
+msgstr "Impossibile aprire il file per la lettura."
+
+#: LYMessages.c:513
+msgid "File does not exist."
+msgstr "Il file non esiste."
+
+#: LYMessages.c:514
+msgid "File does not exist - reenter or cancel:"
+msgstr "Il file non esiste. Inserire nuovamente o annullare:"
+
+#: LYMessages.c:515
+msgid "File is not readable."
+msgstr "Il file non è leggibile."
+
+#: LYMessages.c:516
+msgid "File is not readable - reenter or cancel:"
+msgstr "Il file non è leggibile. Inserire nuovamente o annullare:"
+
+#: LYMessages.c:517
+msgid "Nothing to insert - file is 0-length."
+msgstr "Nulla da inserire, il file è vuoto."
+
+#: LYMessages.c:518
+msgid "Save request cancelled!!!"
+msgstr "Richiesta di salvataggio annullata."
+
+#: LYMessages.c:519
+msgid "Mail request cancelled!!!"
+msgstr "Richiesta di invio annullata."
+
+#. #define CONFIRM_MAIL_SOURCE_PREPARSED
+#: LYMessages.c:521
+msgid "Viewing preparsed source. Are you sure you want to mail it?"
+msgstr "È attualmente visualizzato il sorgente preanalizzato. Inviarlo tramite posta elettronica?"
+
+#: LYMessages.c:522
+msgid "Please wait..."
+msgstr "Attendere..."
+
+#: LYMessages.c:523
+msgid "Mailing file. Please wait..."
+msgstr "Invio del file in corso. Attendere..."
+
+#: LYMessages.c:524
+msgid "ERROR - Unable to mail file"
+msgstr "ERRORE: impossibile inviare il file"
+
+#. #define CONFIRM_LONG_SCREEN_PRINT
+#: LYMessages.c:526
+#, c-format
+msgid "File is %d screens long. Are you sure you want to print?"
+msgstr "Il file è lungo %d schermate. Stamparlo?"
+
+#: LYMessages.c:527
+msgid "Print request cancelled!!!"
+msgstr "Richiesta di stampa annullata."
+
+#: LYMessages.c:528
+msgid "Press <return> to begin: "
+msgstr "Premere <Invio> per iniziare: "
+
+#: LYMessages.c:529
+msgid "Press <return> to finish: "
+msgstr "Premere <Invio> per terminare: "
+
+#. #define CONFIRM_LONG_PAGE_PRINT
+#: LYMessages.c:531
+#, c-format
+msgid "File is %d pages long. Are you sure you want to print?"
+msgstr "Il file è lungo %d pagine. Stamparlo?"
+
+#. #define CHECK_PRINTER
+#: LYMessages.c:533
+msgid "Be sure your printer is on-line. Press <return> to start printing:"
+msgstr "Verificare che la stampante sia accesa e collegata. Premere <Invio> per avviare la stampa:"
+
+#: LYMessages.c:534
+msgid "ERROR - Unable to allocate file space!!!"
+msgstr "ERRORE: impossibile allocare lo spazio per il file."
+
+#: LYMessages.c:535
+msgid "Unable to open tempfile"
+msgstr "Impossibile aprire il file temporaneo."
+
+#: LYMessages.c:536
+msgid "Unable to open print options file"
+msgstr "Impossibile aprire il file delle opzioni di stampa"
+
+#: LYMessages.c:537
+msgid "Printing file. Please wait..."
+msgstr "Stampa del file in corso. Attendere..."
+
+#: LYMessages.c:538
+msgid "Please enter a valid internet mail address: "
+msgstr "Inserire un indirizzo di posta elettronica valido: "
+
+#: LYMessages.c:539
+msgid "ERROR! - printer is misconfigured!"
+msgstr "ERRORE: la stampante è mal configurata."
+
+#: LYMessages.c:540
+msgid "Image map from POST response not available!"
+msgstr "Mappa dell'immagine dalla risposta POST non disponibile."
+
+#: LYMessages.c:541
+msgid "Misdirected client-side image MAP request!"
+msgstr "Errore di indirizzamento della richiesta di mappa immagine gestita dal client."
+
+#: LYMessages.c:542
+msgid "Client-side image MAP is not accessible!"
+msgstr "La mappa immagine gestita dal client non è accessibile."
+
+#: LYMessages.c:543
+msgid "No client-side image MAPs are available!"
+msgstr "Nessuna mappa immagine gestita dal client disponibile."
+
+#: LYMessages.c:544
+msgid "Client-side image MAP is not available!"
+msgstr "La mappa immagine gestita dal client non è disponibile."
+
+#. #define OPTION_SCREEN_NEEDS_24
+#: LYMessages.c:547
+msgid "Screen height must be at least 24 lines for the Options menu!"
+msgstr "L'altezza dello schermo per il menù delle opzioni deve essere di almeno 24 righe."
+
+#. #define OPTION_SCREEN_NEEDS_23
+#: LYMessages.c:549
+msgid "Screen height must be at least 23 lines for the Options menu!"
+msgstr "L'altezza dello schermo per il menù delle opzioni deve essere di almeno 23 righe."
+
+#. #define OPTION_SCREEN_NEEDS_22
+#: LYMessages.c:551
+msgid "Screen height must be at least 22 lines for the Options menu!"
+msgstr "L'altezza dello schermo per il menù delle opzioni deve essere di almeno 22 righe."
+
+#: LYMessages.c:553
+msgid "That key requires Advanced User mode."
+msgstr "Questo tasto è attivo solo nella modalità «esperto»."
+
+#: LYMessages.c:554
+#, c-format
+msgid "Content-type: %s"
+msgstr "Tipo di contenuto: %s"
+
+#: LYMessages.c:555
+msgid "Command: "
+msgstr "Comando: "
+
+#: LYMessages.c:556
+msgid "Unknown or ambiguous command"
+msgstr "Comando sconosciuto o ambiguo."
+
+#: LYMessages.c:557
+msgid " Version "
+msgstr " Versione "
+
+#: LYMessages.c:558
+msgid " first"
+msgstr " per primo"
+
+#: LYMessages.c:559
+msgid ", guessing..."
+msgstr ", supponendo..."
+
+#: LYMessages.c:560
+msgid "Permissions for "
+msgstr "Diritti di accesso per "
+
+#: LYMessages.c:561
+msgid "Select "
+msgstr "Scegliere "
+
+#: LYMessages.c:562
+msgid "capital letter"
+msgstr "maiuscola"
+
+#: LYMessages.c:563
+msgid " of option line,"
+msgstr " della riga delle opzioni,"
+
+#: LYMessages.c:564
+msgid " to save,"
+msgstr " per salvare,"
+
+#: LYMessages.c:565
+msgid " to "
+msgstr " a "
+
+#: LYMessages.c:566
+msgid " or "
+msgstr " o "
+
+#: LYMessages.c:567
+msgid " index"
+msgstr " indice"
+
+#: LYMessages.c:568
+msgid " to return to Lynx."
+msgstr " per ritornare a Lynx."
+
+#: LYMessages.c:569
+msgid "Accept Changes"
+msgstr "Accetta le modifiche"
+
+#: LYMessages.c:570
+msgid "Reset Changes"
+msgstr "Azzera le modifiche"
+
+#: LYMessages.c:571
+msgid "Left Arrow cancels changes"
+msgstr "Freccia sinistra per annullare le modifiche"
+
+#: LYMessages.c:572
+msgid "Save options to disk"
+msgstr "Salvare le opzioni nel disco"
+
+#: LYMessages.c:573
+msgid "Hit RETURN to accept entered data."
+msgstr "Premere <Invio> per accettare i dati immessi."
+
+#. #define ACCEPT_DATA_OR_DEFAULT
+#: LYMessages.c:575
+msgid "Hit RETURN to accept entered data. Delete data to invoke the default."
+msgstr "Premere <Invio> per accettare i dati immessi. Eliminare i dati per recuperare i valori predefiniti."
+
+#: LYMessages.c:576
+msgid "Value accepted!"
+msgstr "Valore accettato."
+
+#. #define VALUE_ACCEPTED_WARNING_X
+#: LYMessages.c:578
+msgid "Value accepted! -- WARNING: Lynx is configured for XWINDOWS!"
+msgstr "Valore accettato. NOTA: Lynx è configurato per XWINDOWS."
+
+#. #define VALUE_ACCEPTED_WARNING_NONX
+#: LYMessages.c:580
+msgid "Value accepted! -- WARNING: Lynx is NOT configured for XWINDOWS!"
+msgstr "Valore accettato. NOTA: Lynx NON è configurato per XWINDOWS!"
+
+#: LYMessages.c:581
+msgid "You are not allowed to change which editor to use!"
+msgstr "Non è consentito cambiare l'editor."
+
+#: LYMessages.c:582
+msgid "Failed to set DISPLAY variable!"
+msgstr "Impossibile impostare la variabile DISPLAY."
+
+#: LYMessages.c:583
+msgid "Failed to clear DISPLAY variable!"
+msgstr "Lo svuotamento della variabile DISPLAY è fallito."
+
+#. #define BOOKMARK_CHANGE_DISALLOWED
+#: LYMessages.c:585
+msgid "You are not allowed to change the bookmark file!"
+msgstr "Non è consentito cambiare il file dei segnalibri."
+
+#: LYMessages.c:586
+msgid "Terminal does not support color"
+msgstr "Il terminale non supporta i colori."
+
+#: LYMessages.c:587
+#, c-format
+msgid "Your '%s' terminal does not support color."
+msgstr "Il terminale «%s» non supporta i colori."
+
+#: LYMessages.c:588
+msgid "Access to dot files is disabled!"
+msgstr "L'accesso ai file nascosti è disabilitato."
+
+#. #define UA_NO_LYNX_WARNING
+#: LYMessages.c:590
+msgid "User-Agent string does not contain \"Lynx\" or \"L_y_n_x\""
+msgstr "La sequenza di caratteri «User-Agent» non contiene né «Lynx» né «L_y_n_x»"
+
+#. #define UA_PLEASE_USE_LYNX
+#: LYMessages.c:592
+msgid "Use \"L_y_n_x\" or \"Lynx\" in User-Agent, or it looks like intentional deception!"
+msgstr "Usare \"L_y_n_x\" o \"Lynx\" in «User-Agent», altrimenti sembrerà un inganno intenzionale."
+
+#. #define UA_CHANGE_DISABLED
+#: LYMessages.c:594
+msgid "Changing of the User-Agent string is disabled!"
+msgstr "La modifica di «User-Agent» è disabilitata."
+
+#. #define CHANGE_OF_SETTING_DISALLOWED
+#: LYMessages.c:596
+msgid "You are not allowed to change this setting."
+msgstr "Non si posseggono i permessi per cambiare questa impostazione."
+
+#: LYMessages.c:597
+msgid "Saving Options..."
+msgstr "Salvataggio delle opzioni in corso."
+
+#: LYMessages.c:598
+msgid "Options saved!"
+msgstr "Opzioni salvate."
+
+#: LYMessages.c:599
+msgid "Unable to save Options!"
+msgstr "Impossibile salvare le opzioni."
+
+#: LYMessages.c:600
+msgid " 'r' to return to Lynx "
+msgstr " «r» per ritornare a Lynx "
+
+#: LYMessages.c:601
+msgid " '>' to save, or 'r' to return to Lynx "
+msgstr " «>» per salvare, o «r» per ritornare a Lynx "
+
+#. #define ANY_KEY_CHANGE_RET_ACCEPT
+#: LYMessages.c:603
+msgid "Hit any key to change value; RETURN to accept."
+msgstr "Premere <Invio> per accettare, qualsiasi altro tasto per cambiare il valore."
+
+#: LYMessages.c:604
+msgid "Error uncompressing temporary file!"
+msgstr "Errore durante la decompressione del file temporaneo."
+
+#: LYMessages.c:605
+msgid "Unsupported URL scheme!"
+msgstr "Schema di URL non supportato."
+
+#: LYMessages.c:606
+msgid "Unsupported data: URL! Use SHOWINFO, for now."
+msgstr "Dato non supportato: URL. Per ora consultare la pagina di informazioni."
+
+#: LYMessages.c:607
+msgid "Redirection limit of 10 URL's reached."
+msgstr "Reindirizzamento: raggiunto il limite di 10 URL."
+
+#: LYMessages.c:608
+msgid "Illegal redirection URL received from server!"
+msgstr "URL di reindirizzamento illecito ricevuto dal server."
+
+#. #define SERVER_ASKED_FOR_REDIRECTION
+#: LYMessages.c:610
+#, c-format
+msgid "Server asked for %d redirection of POST content to"
+msgstr "Il server chiede %d reindirizzamento del contenuto POST verso"
+
+#: LYMessages.c:613
+msgid "P)roceed, use G)ET or C)ancel "
+msgstr "P = proseguire, G = ottenere, C = annullare "
+
+#: LYMessages.c:614
+msgid "P)roceed, or C)ancel "
+msgstr "P = proseguire, C = annullare "
+
+#. #define ADVANCED_POST_GET_REDIRECT
+#: LYMessages.c:616
+msgid "Redirection of POST content. P)roceed, see U)RL, use G)ET or C)ancel"
+msgstr "Reindirizzamento del contenuto POST. P = proseguire, U = vedere URL, G = ottenere, C = annullare"
+
+#. #define ADVANCED_POST_REDIRECT
+#: LYMessages.c:618
+msgid "Redirection of POST content. P)roceed, see U)RL, or C)ancel"
+msgstr "Reindirizzamento del contenuto POST. P = proseguire, U = vedere URL, C = annullare"
+
+#. #define CONFIRM_POST_RESUBMISSION
+#: LYMessages.c:620
+msgid "Document from Form with POST content. Resubmit?"
+msgstr "Documento da un modulo con contenuto POST. Inviare nuovamente?"
+
+#. #define CONFIRM_POST_RESUBMISSION_TO
+#: LYMessages.c:622
+#, c-format
+msgid "Resubmit POST content to %s ?"
+msgstr "Inviare nuovamente il contenuto POST a %s?"
+
+#. #define CONFIRM_POST_LIST_RELOAD
+#: LYMessages.c:624
+#, c-format
+msgid "List from document with POST data. Reload %s ?"
+msgstr "Elenco da documento con dati POST. Ricaricare %s?"
+
+#. #define CONFIRM_POST_DOC_HEAD
+#: LYMessages.c:626
+msgid "Document from POST action, HEAD may not be understood. Proceed?"
+msgstr "Documento da azione POST, l'elemento HEAD può non essere interpretato. Proseguire?"
+
+#. #define CONFIRM_POST_LINK_HEAD
+#: LYMessages.c:628
+msgid "Form submit action is POST, HEAD may not be understood. Proceed?"
+msgstr "L'azione di invio del modulo è POST, l'elemento HEAD potrebbe non essere interpretato. Proseguire?"
+
+#: LYMessages.c:629
+msgid "Proceed without a username and password?"
+msgstr "Proseguire senza nome utente e password?"
+
+#: LYMessages.c:630
+#, c-format
+msgid "Proceed (%s)?"
+msgstr "Proseguire (%s)?"
+
+#: LYMessages.c:631
+msgid "Cannot POST to this host."
+msgstr "Impossibile usare il metodo POST con questo host."
+
+#: LYMessages.c:632
+msgid "POST not supported for this URL - ignoring POST data!"
+msgstr "Il metodo POST non è supportato per questo URL. I dati POST vengono ignorati."
+
+#: LYMessages.c:633
+msgid "Discarding POST data..."
+msgstr "Eliminazione dei dati POST in corso."
+
+#: LYMessages.c:634
+msgid "Document will not be reloaded!"
+msgstr "Il documento non sarà ricaricato."
+
+#: LYMessages.c:635
+msgid "Location: "
+msgstr "Posizione: "
+
+#: LYMessages.c:636
+#, c-format
+msgid "'%s' not found!"
+msgstr "«%s» non trovato."
+
+#: LYMessages.c:637
+msgid "Default Bookmark File"
+msgstr "File dei segnalibri predefinito"
+
+#: LYMessages.c:638
+msgid "Screen too small! (8x35 min)"
+msgstr "Schermo troppo piccolo (min 8x35)"
+
+#: LYMessages.c:639
+msgid "Select destination or ^G to Cancel: "
+msgstr "Scegliere la destinazione o ^G per annullare: "
+
+#. #define MULTIBOOKMARKS_SELECT
+#: LYMessages.c:641
+msgid "Select subbookmark, '=' for menu, or ^G to cancel: "
+msgstr "Scegliere il sottosegnalibro, = per il menù, ^G per annullare: "
+
+#. #define MULTIBOOKMARKS_SELF
+#: LYMessages.c:643
+msgid "Reproduce L)ink in this bookmark file or C)ancel? (l,c): "
+msgstr "L = riprodurre il collegamento in questo file di segnalibri, C = annullare? (l,c): "
+
+#: LYMessages.c:644
+msgid "Multiple bookmark support is not available."
+msgstr "Supporto per i segnalibri multipli non disponibile."
+
+#: LYMessages.c:645
+#, c-format
+msgid " Select Bookmark (screen %d of %d)"
+msgstr " Scelta dei segnalibri (schermata %d di %d)"
+
+#: LYMessages.c:646
+msgid " Select Bookmark"
+msgstr " Scelta dei segnalibri"
+
+#. #define MULTIBOOKMARKS_EHEAD_MASK
+#: LYMessages.c:648
+#, c-format
+msgid "Editing Bookmark DESCRIPTION and FILEPATH (%d of 2)"
+msgstr "Modifica della descrizione e del percorso del segnalibro (%d di 2)"
+
+#. #define MULTIBOOKMARKS_EHEAD
+#: LYMessages.c:650
+msgid " Editing Bookmark DESCRIPTION and FILEPATH"
+msgstr " Modifica della descrizione e del percorso del segnalibro"
+
+#: LYMessages.c:651
+msgid "Letter: "
+msgstr "Lettera: "
+
+#. #define USE_PATH_OFF_HOME
+#: LYMessages.c:654
+msgid "Use a filepath off your login directory in SHELL syntax!"
+msgstr "Usare la sintassi SHELL con un percorso di file a partire dalla propria directory iniziale."
+
+#: LYMessages.c:656
+msgid "Use a filepath off your home directory!"
+msgstr "Usare un percorso del file relativo alla propria directory home."
+
+#. #define MAXLINKS_REACHED
+#: LYMessages.c:659
+msgid "Maximum links per page exceeded! Use half-page or two-line scrolling."
+msgstr "Troppi collegamenti nella pagina. Scorrere di due righe o di mezza pagina."
+
+#: LYMessages.c:660
+msgid "No previously visited links available!"
+msgstr "Non è disponibile alcun collegamento visitato in precedenza."
+
+#: LYMessages.c:661
+msgid "Memory exhausted! Program aborted!"
+msgstr "Memoria esaurita. Esecuzione annullata."
+
+#: LYMessages.c:662
+msgid "Memory exhausted! Aborting..."
+msgstr "Memoria esaurita. Annullamento in corso."
+
+#: LYMessages.c:663
+msgid "Not enough memory!"
+msgstr "Memoria insufficiente."
+
+#: LYMessages.c:664
+msgid "Directory/File Manager not available"
+msgstr "Gestore di directory/file non disponibile"
+
+#: LYMessages.c:665
+msgid "HREF in BASE tag is not an absolute URL."
+msgstr "L'attributo HREF dell'elemento BASE non è un URL assoluto."
+
+#: LYMessages.c:666
+msgid "Location URL is not absolute."
+msgstr "L'indirizzo dell'URL non è assoluto."
+
+#: LYMessages.c:667
+msgid "Refresh URL is not absolute."
+msgstr "L'URL di aggiornamento non è assoluto."
+
+#. #define SENDING_MESSAGE_WITH_BODY_TO
+#: LYMessages.c:669
+msgid ""
+"You are sending a message with body to:\n"
+" "
+msgstr ""
+"Invio di un messaggio con corpo in corso a:\n"
+" "
+
+#: LYMessages.c:670
+msgid ""
+"You are sending a comment to:\n"
+" "
+msgstr ""
+" Invio di un commento in corso a:\n"
+" "
+
+#: LYMessages.c:671
+msgid ""
+"\n"
+" With copy to:\n"
+" "
+msgstr ""
+"\n"
+" Con copia a:\n"
+" "
+
+#: LYMessages.c:672
+msgid ""
+"\n"
+" With copies to:\n"
+" "
+msgstr ""
+"\n"
+" Con copie a:\n"
+" "
+
+#. #define CTRL_G_TO_CANCEL_SEND
+#: LYMessages.c:674
+msgid ""
+"\n"
+"\n"
+"Use Ctrl-G to cancel if you do not want to send a message\n"
+msgstr ""
+"\n"
+"\n"
+"Usare Ctrl-G per annullare l'invio del messaggio\n"
+
+#. #define ENTER_NAME_OR_BLANK
+#: LYMessages.c:676
+msgid ""
+"\n"
+" Please enter your name, or leave it blank to remain anonymous\n"
+msgstr ""
+"\n"
+" Inserire il proprio nome, o lasciare vuoto per rimanere anonimi\n"
+
+#. #define ENTER_MAIL_ADDRESS_OR_OTHER
+#: LYMessages.c:678
+msgid ""
+"\n"
+" Please enter a mail address or some other\n"
+msgstr ""
+"\n"
+" Inserire un indirizzo di posta elettronica o qualche altro mezzo\n"
+
+#. #define MEANS_TO_CONTACT_FOR_RESPONSE
+#: LYMessages.c:680
+msgid " means to contact you, if you desire a response.\n"
+msgstr " per essere contattati, se si desidera una risposta.\n"
+
+#: LYMessages.c:681
+msgid ""
+"\n"
+" Please enter a subject line.\n"
+msgstr ""
+"\n"
+" Inserire una riga con l'oggetto del messaggio.\n"
+
+#. #define ENTER_ADDRESS_FOR_CC
+#: LYMessages.c:683
+msgid ""
+"\n"
+" Enter a mail address for a CC of your message.\n"
+msgstr ""
+"\n"
+" Inserire un indirizzo di posta elettronica per una CC del messaggio\n"
+
+#: LYMessages.c:684
+msgid " (Leave blank if you don't want a copy.)\n"
+msgstr " (lasciare vuoto per non inviare copie).\n"
+
+#: LYMessages.c:685
+msgid ""
+"\n"
+" Please review the message body:\n"
+"\n"
+msgstr ""
+"\n"
+" Rivedere il corpo del messaggio:\n"
+"\n"
+
+#: LYMessages.c:686
+msgid ""
+"\n"
+"Press RETURN to continue: "
+msgstr ""
+"\n"
+"Premere <Invio> per proseguire: "
+
+#: LYMessages.c:687
+msgid ""
+"\n"
+"Press RETURN to clean up: "
+msgstr ""
+"\n"
+"Premere <Invio> per ripulire: "
+
+#: LYMessages.c:688
+msgid " Use Control-U to erase the default.\n"
+msgstr " Usare Ctrl-U per cancellare il valore predefinito.\n"
+
+#: LYMessages.c:689
+msgid ""
+"\n"
+" Please enter your message below."
+msgstr ""
+"\n"
+" Immettere il messaggio qui di seguito."
+
+#. #define ENTER_PERIOD_WHEN_DONE_A
+#: LYMessages.c:691 src/LYNews.c:360
+msgid ""
+"\n"
+" When you are done, press enter and put a single period (.)"
+msgstr ""
+"\n"
+" Una volta terminato, premere <Invio> e mettere un singolo punto (.)"
+
+#. #define ENTER_PERIOD_WHEN_DONE_B
+#: LYMessages.c:693 src/LYNews.c:361
+msgid ""
+"\n"
+" on a line and press enter again."
+msgstr ""
+"\n"
+" su una riga, poi premere nuovamente <Invio>."
+
+#. Cookies messages
+#. #define ADVANCED_COOKIE_CONFIRMATION
+#: LYMessages.c:697
+#, c-format
+msgid "%s cookie: %.*s=%.*s Allow? (Y/N/Always/neVer)"
+msgstr "cookie %s: %.*s=%.*s Accettare? (Y = sì, N = no, A = sempre, V = mai)"
+
+#. #define INVALID_COOKIE_DOMAIN_CONFIRMATION
+#: LYMessages.c:699
+#, c-format
+msgid "Accept invalid cookie domain=%s for '%s'?"
+msgstr "Accettare dominio di cookie non valido = %s per «%s»?"
+
+#. #define INVALID_COOKIE_PATH_CONFIRMATION
+#: LYMessages.c:701
+#, c-format
+msgid "Accept invalid cookie path=%s as a prefix of '%s'?"
+msgstr "Accettare percorso di cookie non valido = %s come prefisso di «%s»?"
+
+#: LYMessages.c:702
+msgid "Allowing this cookie."
+msgstr "Cookie accettato."
+
+#: LYMessages.c:703
+msgid "Rejecting this cookie."
+msgstr "Cookie rifiutato."
+
+#: LYMessages.c:704
+msgid "The Cookie Jar is empty."
+msgstr "Il contenitore dei cookie è vuoto."
+
+#: LYMessages.c:705
+msgid "The Cache Jar is empty."
+msgstr "Il contenitore della cache è vuoto."
+
+#. #define ACTIVATE_TO_GOBBLE
+#: LYMessages.c:707
+msgid "Activate links to gobble up cookies or entire domains,"
+msgstr "Attivare i collegamenti per eliminare i cookie o gli interi domini,"
+
+#: LYMessages.c:708
+msgid "or to change a domain's 'allow' setting."
+msgstr "o per cambiare l'impostazione di autorizzazione per un dominio."
+
+#: LYMessages.c:709
+msgid "(Cookies never allowed.)"
+msgstr "(Cookie mai accettati.)"
+
+#: LYMessages.c:710
+msgid "(Cookies always allowed.)"
+msgstr "(Cookie sempre accettati.)"
+
+#: LYMessages.c:711
+msgid "(Cookies allowed via prompt.)"
+msgstr "(Cookie accettati su richiesta.)"
+
+#: LYMessages.c:712
+msgid "(Persistent Cookies.)"
+msgstr "(Cookie permanenti.)"
+
+#: LYMessages.c:713
+msgid "(No title.)"
+msgstr "(Nessun titolo.)"
+
+#: LYMessages.c:714
+msgid "(No name.)"
+msgstr "(Nessun nome.)"
+
+#: LYMessages.c:715
+msgid "(No value.)"
+msgstr "(Nessun valore.)"
+
+#: LYMessages.c:716 src/LYOptions.c:2408
+msgid "None"
+msgstr "Nessuno"
+
+#: LYMessages.c:717
+msgid "(End of session.)"
+msgstr "(Fine della sessione.)"
+
+#: LYMessages.c:718
+msgid "Delete this cookie?"
+msgstr "Eliminare questo cookie?"
+
+#: LYMessages.c:719
+msgid "The cookie has been eaten!"
+msgstr "Il cookie è stato eliminato."
+
+#: LYMessages.c:720
+msgid "Delete this empty domain?"
+msgstr "Eliminare questo dominio vuoto?"
+
+#: LYMessages.c:721
+msgid "The domain has been eaten!"
+msgstr "Il dominio è stato eliminato."
+
+#. #define DELETE_COOKIES_SET_ALLOW_OR_CANCEL
+#: LYMessages.c:723
+msgid "D)elete domain's cookies, set allow A)lways/P)rompt/neV)er, or C)ancel? "
+msgstr "D = eliminare cookie del dominio, imposta livello di permessi a A = sempre, P = chiedi, V = mai, C = annullare?"
+
+#. #define DELETE_DOMAIN_SET_ALLOW_OR_CANCEL
+#: LYMessages.c:725
+msgid "D)elete domain, set allow A)lways/P)rompt/neV)er, or C)ancel? "
+msgstr "D = eliminare dominio, imposta livello dei permessi a A = sempre, P = chiedi, V = mai, C = annullare?"
+
+#: LYMessages.c:726
+msgid "All cookies in the domain have been eaten!"
+msgstr "Tutti i cookie nel dominio sono stati eliminati."
+
+#: LYMessages.c:727
+#, c-format
+msgid "'A'lways allowing from domain '%s'."
+msgstr "«A»: tutti i cookie del dominio «%s» verranno accettati."
+
+#: LYMessages.c:728
+#, c-format
+msgid "ne'V'er allowing from domain '%s'."
+msgstr "«V»: nessun cookie dal dominio «%s» verrà accettato."
+
+#: LYMessages.c:729
+#, c-format
+msgid "'P'rompting to allow from domain '%s'."
+msgstr "«P»: verrà sempre chiesta conferma prima di accettare cookie dal dominio «%s»."
+
+#: LYMessages.c:730
+msgid "Delete all cookies in this domain?"
+msgstr "Eliminare tutti i cookie in questo dominio?"
+
+#: LYMessages.c:731
+msgid "All of the cookies in the jar have been eaten!"
+msgstr "Tutti i cookie nel contenitore sono stati eliminati."
+
+#: LYMessages.c:733
+msgid "Port 19 not permitted in URLs."
+msgstr "Porta 19 non autorizzata negli URL."
+
+#: LYMessages.c:734
+msgid "Port 25 not permitted in URLs."
+msgstr "Porta 25 non autorizzata negli URL."
+
+#: LYMessages.c:735
+#, c-format
+msgid "Port %lu not permitted in URLs."
+msgstr "Porta %lu non autorizzata negli URL."
+
+#: LYMessages.c:736
+msgid "URL has a bad port field."
+msgstr "Campo porta dell'URL non valido."
+
+#: LYMessages.c:737
+msgid "Maximum nesting of HTML elements exceeded."
+msgstr "Annidamento massimo di elementi HTML superato."
+
+#: LYMessages.c:738
+msgid "Bad partial reference! Stripping lead dots."
+msgstr "Riferimento parziale errato. I punti iniziali vengono rimossi."
+
+#: LYMessages.c:739
+msgid "Trace Log open failed. Trace off!"
+msgstr "Errore nell'apertura del «Trace Log». Tracciamento non attivo."
+
+#: LYMessages.c:740
+msgid "Lynx Trace Log"
+msgstr "Trace Log di Lynx"
+
+#: LYMessages.c:741
+msgid "No trace log has been started for this session."
+msgstr "Non è stato iniziato alcun «Trace Log» per questa sessione."
+
+#. #define MAX_TEMPCOUNT_REACHED
+#: LYMessages.c:743
+msgid "The maximum temporary file count has been reached!"
+msgstr "Il numero massimo di file temporanei è stato raggiunto."
+
+#. #define FORM_VALUE_TOO_LONG
+#: LYMessages.c:745
+msgid "Form field value exceeds buffer length! Trim the tail."
+msgstr "Il valore del campo eccede la lunghezza del buffer. La coda viene tagliata."
+
+#. #define FORM_TAIL_COMBINED_WITH_HEAD
+#: LYMessages.c:747
+msgid "Modified tail combined with head of form field value."
+msgstr "Coda modificata combinata con il valore in testa al campo del modulo."
+
+#. HTFile.c
+#: LYMessages.c:750
+msgid "Directory"
+msgstr "Directory"
+
+#: LYMessages.c:751
+msgid "Directory browsing is not allowed."
+msgstr "Non è consentito leggere le directory."
+
+#: LYMessages.c:752
+msgid "Selective access is not enabled for this directory"
+msgstr "L'accesso selettivo non è abilitato per questa directory"
+
+#: LYMessages.c:753
+msgid "Multiformat: directory scan failed."
+msgstr "Multiformat: scansione della directory fallita."
+
+#: LYMessages.c:754
+msgid "This directory is not readable."
+msgstr "Questa directory non è leggibile."
+
+#: LYMessages.c:755
+msgid "Can't access requested file."
+msgstr "Impossibile accedere al file richiesto."
+
+#: LYMessages.c:756
+msgid "Could not find suitable representation for transmission."
+msgstr "Impossibile trovare una rappresentazione adatta per la trasmissione."
+
+#: LYMessages.c:757
+msgid "Could not open file for decompression!"
+msgstr "Impossibile aprire il file per la decompressione."
+
+#: LYMessages.c:758
+msgid "Files:"
+msgstr "File:"
+
+#: LYMessages.c:759
+msgid "Subdirectories:"
+msgstr "Sottodirectory:"
+
+#: LYMessages.c:760
+msgid " directory"
+msgstr " directory"
+
+#: LYMessages.c:761
+msgid "Up to "
+msgstr "Risali a "
+
+#: LYMessages.c:762
+msgid "Current directory is "
+msgstr "La directory attuale è: "
+
+#. HTFTP.c
+#: LYMessages.c:765
+msgid "Symbolic Link"
+msgstr "Collegamento simbolico"
+
+#. HTGopher.c
+#: LYMessages.c:768
+msgid "No response from server!"
+msgstr "Nessuna risposta dal server."
+
+#: LYMessages.c:769
+msgid "CSO index"
+msgstr "indice CSO"
+
+#: LYMessages.c:770
+msgid ""
+"\n"
+"This is a searchable index of a CSO database.\n"
+msgstr ""
+"\n"
+"Questo è un indice ricercabile proveniente da un database CSO.\n"
+
+#: LYMessages.c:771
+msgid "CSO Search Results"
+msgstr "Risultati della ricerca CSO"
+
+#: LYMessages.c:772
+#, c-format
+msgid "Seek fail on %s\n"
+msgstr "Ricerca fallita su %s\n"
+
+#: LYMessages.c:773
+msgid ""
+"\n"
+"Press the 's' key and enter search keywords.\n"
+msgstr ""
+"\n"
+"Premere il tasto «s» e immettere le parole chiave per la ricerca.\n"
+
+#: LYMessages.c:774
+msgid ""
+"\n"
+"This is a searchable Gopher index.\n"
+msgstr ""
+"\n"
+"Questo è un indice Gopher ricercabile.\n"
+
+#: LYMessages.c:775
+msgid "Gopher index"
+msgstr "Indice Gopher"
+
+#: LYMessages.c:776
+msgid "Gopher Menu"
+msgstr "Menù Gopher"
+
+#: LYMessages.c:777
+msgid " Search Results"
+msgstr " Risultati della ricerca"
+
+#: LYMessages.c:778
+msgid "Sending CSO/PH request."
+msgstr "Invio della richiesta CSO/PH in corso."
+
+#: LYMessages.c:779
+msgid "Sending Gopher request."
+msgstr "Invio della richiesta Gopher in corso."
+
+#: LYMessages.c:780
+msgid "CSO/PH request sent; waiting for response."
+msgstr "Richiesta CSO/PH inviata; in attesa di risposta."
+
+#: LYMessages.c:781
+msgid "Gopher request sent; waiting for response."
+msgstr "Richiesta Gopher inviata; in attesa di risposta."
+
+#: LYMessages.c:782
+msgid ""
+"\n"
+"Please enter search keywords.\n"
+msgstr ""
+"\n"
+"Immettere le parole chiave per la ricerca.\n"
+
+#: LYMessages.c:783
+msgid ""
+"\n"
+"The keywords that you enter will allow you to search on a"
+msgstr ""
+"\n"
+"Le parole chiave immesse permetteranno di effettuare una ricerca su un"
+
+#: LYMessages.c:784
+msgid " person's name in the database.\n"
+msgstr " nome di persona nel database.\n"
+
+#. HTNews.c
+#: LYMessages.c:787
+msgid "Connection closed ???"
+msgstr "Connessione terminata?"
+
+#: LYMessages.c:788
+msgid "Cannot open temporary file for news POST."
+msgstr "Impossibile aprire un file temporaneo per inviare il contributo."
+
+#: LYMessages.c:789
+msgid "This client does not contain support for posting to news with SSL."
+msgstr "Questo client non supporta l'invio di articoli mediante SSL."
+
+#. HTStyle.c
+#: LYMessages.c:792
+#, c-format
+msgid "Style %d `%s' SGML:%s. Font %s %.1f point.\n"
+msgstr "Stile %d «%s» SGML:%s. Carattere %s %.1f punti.\n"
+
+#: LYMessages.c:794
+#, c-format
+msgid "\tAlign=%d, %d tabs. (%.0f before, %.0f after)\n"
+msgstr "\tAllinea=%d, %d tab. (%.0f prima, %.0f dopo)\n"
+
+#: LYMessages.c:795
+#, c-format
+msgid "\t\tTab kind=%d at %.0f\n"
+msgstr "\t\tTipo tab.=%d a %.0f\n"
+
+#. HTTP.c
+#: LYMessages.c:798
+msgid "Can't proceed without a username and password."
+msgstr "Impossibile proseguire senza nome utente e password."
+
+#: LYMessages.c:799
+msgid "Can't retry with authorization! Contact the server's WebMaster."
+msgstr "Impossibile ritentare l'autorizzazione. Contattare l'amministratore del server."
+
+#: LYMessages.c:800
+msgid "Can't retry with proxy authorization! Contact the server's WebMaster."
+msgstr "Impossibile ritentare l'autorizzazione proxy. Contattare l'amministratore del server."
+
+#: LYMessages.c:801
+msgid "Retrying with proxy authorization information."
+msgstr "Nuovo tentativo con informazioni di autorizzazione del proxy in corso."
+
+#: LYMessages.c:802
+#, c-format
+msgid "SSL error:%s-Continue?"
+msgstr "Errore SSL: %s. Continuare?"
+
+#. HTWAIS.c
+#: LYMessages.c:805
+msgid "HTWAIS: Return message too large."
+msgstr "HTWAIS: messaggio troppo grande respinto."
+
+#: LYMessages.c:806
+msgid "Enter WAIS query: "
+msgstr "Inserire l'interrogazione WAIS:"
+
+#. Miscellaneous status
+#: LYMessages.c:809
+msgid "Retrying as HTTP0 request."
+msgstr "Nuovo tentativo come richiesta HTTP0 in corso."
+
+#: LYMessages.c:810
+#, c-format
+msgid "Transferred %d bytes"
+msgstr "%d byte trasferiti"
+
+#: LYMessages.c:811
+msgid "Data transfer complete"
+msgstr "Trasferimento dei dati completato"
+
+#: LYMessages.c:812
+#, c-format
+msgid "Error processing line %d of %s\n"
+msgstr "Errore durante l'elaborazione della riga %d di %s\n"
+
+#. Lynx internal page titles
+#: LYMessages.c:815
+msgid "Address List Page"
+msgstr "Pagina con l'elenco degli indirizzi"
+
+#: LYMessages.c:816
+msgid "Bookmark file"
+msgstr "File dei segnalibri"
+
+#: LYMessages.c:817
+msgid "Configuration Definitions"
+msgstr "Definizioni della configurazione"
+
+#: LYMessages.c:818
+msgid "Cookie Jar"
+msgstr "Contenitore dei cookie"
+
+#: LYMessages.c:819
+msgid "Current Key Map"
+msgstr "Mappatura attuale della tastiera"
+
+#: LYMessages.c:820
+msgid "File Management Options"
+msgstr "Opzioni di gestione dei file"
+
+#: LYMessages.c:821
+msgid "Download Options"
+msgstr "Opzioni di scaricamento"
+
+#: LYMessages.c:822
+msgid "History Page"
+msgstr "Cronologia"
+
+#: LYMessages.c:823
+msgid "Cache Jar"
+msgstr "Contenitore della cache"
+
+#: LYMessages.c:824
+msgid "List Page"
+msgstr "Pagina di riferimenti"
+
+#: LYMessages.c:825
+msgid "Lynx.cfg Information"
+msgstr "Informazioni su Lynx.cfg"
+
+#: LYMessages.c:826
+msgid "Converted Mosaic Hotlist"
+msgstr "Segnalibri di Mosaic convertiti"
+
+#: LYMessages.c:827
+msgid "Options Menu"
+msgstr "Menù delle opzioni"
+
+#: LYMessages.c:828
+msgid "File Permission Options"
+msgstr "Opzioni di permessi sui file"
+
+#: LYMessages.c:829
+msgid "Printing Options"
+msgstr "Opzioni di stampa"
+
+#: LYMessages.c:830
+msgid "Information about the current document"
+msgstr "Informazioni sul documento attuale"
+
+#: LYMessages.c:831
+msgid "Your recent statusline messages"
+msgstr "Messaggi recenti nella riga di stato"
+
+#: LYMessages.c:832
+msgid "Upload Options"
+msgstr "Opzioni di caricamento"
+
+#: LYMessages.c:833
+msgid "Visited Links Page"
+msgstr "Pagina dei collegamenti visitati"
+
+#. CONFIG_DEF_TITLE subtitles
+#: LYMessages.c:836
+msgid "See also"
+msgstr "Vedere anche"
+
+#: LYMessages.c:837
+msgid "your"
+msgstr "il proprio"
+
+#: LYMessages.c:838
+msgid "for runtime options"
+msgstr "per le opzioni di esecuzione"
+
+#: LYMessages.c:839
+msgid "compile time options"
+msgstr "opzioni di compilazione"
+
+#: LYMessages.c:840
+msgid "color-style configuration"
+msgstr "configurazione dello stile dei colori"
+
+#: LYMessages.c:841
+msgid "latest release"
+msgstr "ultima versione"
+
+#: LYMessages.c:842
+msgid "pre-release version"
+msgstr "versione pre-rilascio"
+
+#: LYMessages.c:843
+msgid "development version"
+msgstr "versione di sviluppo"
+
+#. #define AUTOCONF_CONFIG_CACHE
+#: LYMessages.c:845
+msgid ""
+"The following data were derived during the automatic configuration/build\n"
+"process of this copy of Lynx. When reporting a bug, please include a copy\n"
+"of this page."
+msgstr ""
+"I dati seguenti sono stati desunti durante la configurazione automatica\n"
+"di questa copia di Lynx. Nel segnalare un difetto, si prega di\n"
+"includere una copia di questa pagina."
+
+#. #define AUTOCONF_LYNXCFG_H
+#: LYMessages.c:849
+msgid ""
+"The following data were used as automatically-configured compile-time\n"
+"definitions when this copy of Lynx was built."
+msgstr ""
+"I dati seguenti sono stati usati come opzioni di compilazione configurati\n"
+"automaticamente quando questa versione di Lynx è stata compilata."
+
+#. #define DIRED_NOVICELINE
+#: LYMessages.c:854
+msgid " C)reate D)ownload E)dit F)ull menu M)odify R)emove T)ag U)pload \n"
+msgstr ""
+" C = creare, D = scaricare, E = modificare, F = menù completo, M = modificare, R = eliminare, T = contrassegnare, U = caricare\n"
+
+#: LYMessages.c:855
+msgid "Failed to obtain status of current link!"
+msgstr "Impossibile ottenere lo stato del collegamento attuale."
+
+#. #define INVALID_PERMIT_URL
+#: LYMessages.c:858
+msgid "Special URL only valid from current File Permission menu!"
+msgstr "URL speciale valido solo dal menù dei permessi sul file attuale."
+
+#: LYMessages.c:862
+msgid "External support is currently disabled."
+msgstr "Il supporto esterno è attualmente disabilitato."
+
+#. new with 2.8.4dev.21
+#: LYMessages.c:866
+msgid "Changing working-directory is currently disabled."
+msgstr "Il cambio della directory di lavoro è attualmente disabilitato."
+
+#: LYMessages.c:867
+msgid "Linewrap OFF!"
+msgstr "A capo automatico DISATTIVATO."
+
+#: LYMessages.c:868
+msgid "Linewrap ON!"
+msgstr "A capo automatico ATTIVATO."
+
+#: LYMessages.c:869
+msgid "Parsing nested-tables toggled OFF! Reloading..."
+msgstr "Analisi delle tabelle annidate DISATTIVATA. Ricaricamento in corso."
+
+#: LYMessages.c:870
+msgid "Parsing nested-tables toggled ON! Reloading..."
+msgstr "Analisi delle tabelle annidate ATTIVATA. Ricaricamento in corso."
+
+#: LYMessages.c:871
+msgid "Shifting is disabled while line-wrap is in effect"
+msgstr "Lo spostamento è disabilitato mentre l'a capo automatico è in funzione"
+
+#: LYMessages.c:872
+msgid "Trace not supported"
+msgstr "Trace non supportato"
+
+#: LYMessages.c:793
+#, c-format
+msgid "\tIndents: first=%.0f others=%.0f, Height=%.1f Desc=%.1f\n"
+msgstr "\tRientri: primo=%.0f altri=%.0f, Altezza=%.1f Desc=%.1f\n"
+
+#: WWW/Library/Implementation/HTAABrow.c:629
+#, c-format
+msgid "Username for '%s' at %s '%s%s':"
+msgstr "Nome utente per «%s» a %s «%s%s»:"
+
+#: WWW/Library/Implementation/HTAABrow.c:897
+msgid "This client doesn't know how to compose proxy authorization information for scheme"
+msgstr "Il client non sa come comporre l'informazione di autorizzazione del proxy per lo schema"
+
+#: WWW/Library/Implementation/HTAABrow.c:974
+msgid "This client doesn't know how to compose authorization information for scheme"
+msgstr "Il client non sa come comporre le informazioni di autorizzazione per lo schema"
+
+#: WWW/Library/Implementation/HTAABrow.c:1082
+#, c-format
+msgid "Invalid header '%s%s%s%s%s'"
+msgstr "Intestazione non valida «%s%s%s%s%s»"
+
+#: WWW/Library/Implementation/HTAABrow.c:1184
+msgid "Proxy authorization required -- retrying"
+msgstr "Autorizzazione del proxy obbligatoria. Nuovo tentativo in corso"
+
+#: WWW/Library/Implementation/HTAABrow.c:1242
+msgid "Access without authorization denied -- retrying"
+msgstr "Accesso senza autorizzazione negato. Nuovo tentativo in corso"
+
+#: WWW/Library/Implementation/HTAccess.c:689
+msgid "Access forbidden by rule"
+msgstr "Accesso vietato da una regola"
+
+#: WWW/Library/Implementation/HTAccess.c:784
+msgid "Document with POST content not found in cache. Resubmit?"
+msgstr "Documento con contenuto POST non trovato nella cache. Inviare nuovamente?"
+
+#: WWW/Library/Implementation/HTAccess.c:939
+msgid "Loading failed, use a previous copy."
+msgstr "Caricamento fallito, usare una copia precedente."
+
+#: WWW/Library/Implementation/HTAccess.c:1048 src/GridText.c:8543
+msgid "Loading incomplete."
+msgstr "Caricamento incompleto."
+
+#: WWW/Library/Implementation/HTAccess.c:1079
+#, c-format
+msgid "**** HTAccess: socket or file number returned by obsolete load routine!\n"
+msgstr "**** HTAccess: socket o numero file restituito da routine di caricamento obsoleta.\n"
+
+#: WWW/Library/Implementation/HTAccess.c:1081
+#, c-format
+msgid "**** HTAccess: Internal software error. Please mail lynx-dev@nongnu.org!\n"
+msgstr "**** HTAccess: errore interno del software. Segnalare a lynx-dev@nongnu.org.\n"
+
+#: WWW/Library/Implementation/HTAccess.c:1082
+#, c-format
+msgid "**** HTAccess: Status returned was: %d\n"
+msgstr "**** HTAccess: stato di ritorno: %d\n"
+
+#.
+#. * hack: if we fail in HTAccess.c
+#. * avoid duplicating URL, oh.
+#.
+#: WWW/Library/Implementation/HTAccess.c:1088 src/LYMainLoop.c:7757
+msgid "Can't Access"
+msgstr "Impossibile accedere"
+
+#: WWW/Library/Implementation/HTAccess.c:1096
+msgid "Unable to access document."
+msgstr "Impossibile accedere al documento."
+
+#: WWW/Library/Implementation/HTFTP.c:843
+#, c-format
+msgid "Enter password for user %s@%s:"
+msgstr "Inserire la password per l'utente %s@%s:"
+
+#: WWW/Library/Implementation/HTFTP.c:871
+msgid "Unable to connect to FTP host."
+msgstr "Impossibile collegarsi all'host FTP."
+
+#: WWW/Library/Implementation/HTFTP.c:1152
+msgid "close master socket"
+msgstr "chiudere il socket principale"
+
+#: WWW/Library/Implementation/HTFTP.c:1214
+msgid "socket for master socket"
+msgstr "socket per il socket principale"
+
+#: WWW/Library/Implementation/HTFTP.c:2976
+msgid "Receiving FTP directory."
+msgstr "Ricezione della directory FTP in corso."
+
+#: WWW/Library/Implementation/HTFTP.c:3112
+#, c-format
+msgid "Transferred %d bytes (%5d)"
+msgstr "Trasferiti %d byte (%5d)"
+
+#: WWW/Library/Implementation/HTFTP.c:3467
+msgid "connect for data"
+msgstr "connessione per dati"
+
+#: WWW/Library/Implementation/HTFTP.c:4128
+msgid "Receiving FTP file."
+msgstr "Ricezione del file FTP in corso."
+
+#: WWW/Library/Implementation/HTFinger.c:276
+msgid "Could not set up finger connection."
+msgstr "Impossibile stabilire la connessione finger."
+
+#: WWW/Library/Implementation/HTFinger.c:323
+msgid "Could not load data (no sitename in finger URL)"
+msgstr "Impossibile caricare i dati (URL finger senza nome del sito)"
+
+#: WWW/Library/Implementation/HTFinger.c:329
+msgid "Invalid port number - will only use port 79!"
+msgstr "Numero di porta non valido. Sarà usata solo la porta 79."
+
+#: WWW/Library/Implementation/HTFinger.c:395
+msgid "Could not access finger host."
+msgstr "Impossibile accedere all'host finger."
+
+#: WWW/Library/Implementation/HTFinger.c:403
+msgid "No response from finger server."
+msgstr "Nessuna risposta dal server finger."
+
+#: WWW/Library/Implementation/HTNews.c:425
+#, c-format
+msgid "Username for news host '%s':"
+msgstr "Nome utente per l'host delle news «%s»:"
+
+#: WWW/Library/Implementation/HTNews.c:478
+msgid "Change username?"
+msgstr "Cambiare il nome utente?"
+
+#: WWW/Library/Implementation/HTNews.c:482
+msgid "Username:"
+msgstr "Nome utente:"
+
+#: WWW/Library/Implementation/HTNews.c:507
+#, c-format
+msgid "Password for news host '%s':"
+msgstr "Password per l'host delle news «%s»:"
+
+#: WWW/Library/Implementation/HTNews.c:590
+msgid "Change password?"
+msgstr "Cambiare la password?"
+
+#: WWW/Library/Implementation/HTNews.c:1710
+#, c-format
+msgid "No matches for: %s"
+msgstr "Nessuna corrispondenza per: %s"
+
+#: WWW/Library/Implementation/HTNews.c:1760
+msgid ""
+"\n"
+"No articles in this group.\n"
+msgstr ""
+"\n"
+"Nessun articolo in questo gruppo.\n"
+
+#: WWW/Library/Implementation/HTNews.c:1772
+msgid ""
+"\n"
+"No articles in this range.\n"
+msgstr ""
+"\n"
+"Nessun articolo in questo intervallo.\n"
+
+#.
+#. * Set window title.
+#.
+#: WWW/Library/Implementation/HTNews.c:1785
+#, c-format
+msgid "%s, Articles %d-%d"
+msgstr "%s, articoli %d-%d"
+
+#: WWW/Library/Implementation/HTNews.c:1808
+msgid "Earlier articles"
+msgstr "Articoli precedenti"
+
+#: WWW/Library/Implementation/HTNews.c:1821
+#, c-format
+msgid ""
+"\n"
+"There are about %d articles currently available in %s, IDs as follows:\n"
+"\n"
+msgstr ""
+"\n"
+"Ci sono attualmente circa %d articoli disponibili in %s, ID come segue:\n"
+"\n"
+
+#: WWW/Library/Implementation/HTNews.c:1883
+msgid "All available articles in "
+msgstr "Tutti gli articoli disponibili in "
+
+#: WWW/Library/Implementation/HTNews.c:2097
+msgid "Later articles"
+msgstr "Articoli successivi"
+
+#: WWW/Library/Implementation/HTNews.c:2120
+msgid "Post to "
+msgstr "Invia a "
+
+#: WWW/Library/Implementation/HTNews.c:2341
+msgid "This client does not contain support for SNEWS URLs."
+msgstr "Questo client non è predisposto per supportare gli URL SNEWS."
+
+#: WWW/Library/Implementation/HTNews.c:2548
+msgid "No target for raw text!"
+msgstr "Nessuna destinazione per il testo grezzo."
+
+#: WWW/Library/Implementation/HTNews.c:2578
+msgid "Connecting to NewsHost ..."
+msgstr "Connessione all'host delle news in corso."
+
+#: WWW/Library/Implementation/HTNews.c:2630
+#, c-format
+msgid "Could not access %s."
+msgstr "Impossibile accedere a %s."
+
+#: WWW/Library/Implementation/HTNews.c:2736
+#, c-format
+msgid "Can't read news info. News host %.20s responded: %.200s"
+msgstr "Impossibile leggere le informazioni delle news. L'host delle news %.20s ha risposto: %.200s"
+
+#: WWW/Library/Implementation/HTNews.c:2740
+#, c-format
+msgid "Can't read news info, empty response from host %s"
+msgstr "Impossibile leggere le informazioni delle news, risposta vuota dall'host %s"
+
+#.
+#. * List available newsgroups. - FM
+#.
+#: WWW/Library/Implementation/HTNews.c:2944
+msgid "Reading list of available newsgroups."
+msgstr "Lettura dell'elenco dei gruppi di discussione disponibili in corso."
+
+#: WWW/Library/Implementation/HTNews.c:2965
+msgid "Reading list of articles in newsgroup."
+msgstr "Lettura dell'elenco degli articoli nel gruppo di discussione in corso."
+
+#.
+#. * Get an article from a news group. - FM
+#.
+#: WWW/Library/Implementation/HTNews.c:2971
+msgid "Reading news article."
+msgstr "Lettura del contributo news."
+
+#: WWW/Library/Implementation/HTNews.c:3001
+msgid "Sorry, could not load requested news."
+msgstr "Spiacente, impossibile caricare l'articolo richiesto."
+
+#: WWW/Library/Implementation/HTTCP.c:1282
+msgid "Address has invalid port"
+msgstr "L'indirizzo ha un numero di porta non valido."
+
+#: WWW/Library/Implementation/HTTCP.c:1358
+msgid "Address length looks invalid"
+msgstr "La lunghezza dell'indirizzo non sembra essere valida"
+
+#: WWW/Library/Implementation/HTTCP.c:1618 WWW/Library/Implementation/HTTCP.c:1636
+#, c-format
+msgid "Unable to locate remote host %s."
+msgstr "Impossibile individuare l'host remoto %s."
+
+#. Not HTProgress, so warning won't be overwritten immediately;
+#. * but not HTAlert, because typically there will be other
+#. * alerts from the callers. - kw
+#.
+#: WWW/Library/Implementation/HTTCP.c:1633 WWW/Library/Implementation/HTTelnet.c:115
+#, c-format
+msgid "Invalid hostname %s"
+msgstr "Nome di host %s non valido"
+
+#: WWW/Library/Implementation/HTTCP.c:1647
+#, c-format
+msgid "Making %s connection to %s"
+msgstr "Creazione della connessione %s a %s in corso"
+
+#: WWW/Library/Implementation/HTTCP.c:1658
+msgid "socket failed."
+msgstr "socket fallito."
+
+#: WWW/Library/Implementation/HTTCP.c:1671
+#, c-format
+msgid "socket failed: family %d addr %s port %s."
+msgstr "socket fallito: famiglia %d indirizzo %s porta %s."
+
+#: WWW/Library/Implementation/HTTCP.c:1695
+msgid "Could not make connection non-blocking."
+msgstr "Impossibile stabilire una connessione non bloccante."
+
+#: WWW/Library/Implementation/HTTCP.c:1763
+msgid "Connection failed (too many retries)."
+msgstr "Connessione fallita (troppi tentativi)."
+
+#: WWW/Library/Implementation/HTTCP.c:1950
+msgid "Could not restore socket to blocking."
+msgstr "Impossibile ripristinare il socket bloccante."
+
+#: WWW/Library/Implementation/HTTCP.c:2016
+msgid "Socket read failed (too many tries)."
+msgstr "Lettura del socket fallita (troppi tentativi)."
+
+#: WWW/Library/Implementation/HTTP.c:85
+#, c-format
+msgid "SSL callback:%s, preverify_ok=%d, ssl_okay=%d"
+msgstr "Richiamata SSL: %s, preverify_ok=%d, ssl_okay=%d"
+
+#: WWW/Library/Implementation/HTTP.c:390
+#, c-format
+msgid "Address contains a username: %s"
+msgstr "L'indirizzo contiene un nome utente: %s"
+
+#: WWW/Library/Implementation/HTTP.c:444
+#, c-format
+msgid "Certificate issued by: %s"
+msgstr "Certificato emesso da: %s"
+
+#: WWW/Library/Implementation/HTTP.c:627
+msgid "This client does not contain support for HTTPS URLs."
+msgstr "Questo client non supporta gli URL HTTPS."
+
+#: WWW/Library/Implementation/HTTP.c:652
+msgid "Unable to connect to remote host."
+msgstr "Impossibile stabilire la connessione con l'host remoto."
+
+#: WWW/Library/Implementation/HTTP.c:684
+msgid "Retrying connection without TLS."
+msgstr "Nuovo tentativo di connessione senza TLS."
+
+#: WWW/Library/Implementation/HTTP.c:729
+msgid "no issuer was found"
+msgstr "non è stato trovato alcun emittente"
+
+#: WWW/Library/Implementation/HTTP.c:731
+msgid "issuer is not a CA"
+msgstr "l'emittente non è un'autorità di certificazione"
+
+#: WWW/Library/Implementation/HTTP.c:733
+msgid "the certificate has no known issuer"
+msgstr "l'emittente del certificato è sconosciuto"
+
+#: WWW/Library/Implementation/HTTP.c:735
+msgid "the certificate has been revoked"
+msgstr "il certificato è stato revocato"
+
+#: WWW/Library/Implementation/HTTP.c:737
+msgid "the certificate is not trusted"
+msgstr "il certificato non è fidato"
+
+#: WWW/Library/Implementation/HTTP.c:810
+#, c-format
+msgid "Verified connection to %s (cert=%s)"
+msgstr "Connessione a %s verificata (cert=%s)"
+
+#: WWW/Library/Implementation/HTTP.c:858 WWW/Library/Implementation/HTTP.c:900
+#, c-format
+msgid "Verified connection to %s (subj=%s)"
+msgstr "Connessione a %s verificata (ogg=%s)"
+
+#: WWW/Library/Implementation/HTTP.c:930
+msgid "Can't find common name in certificate"
+msgstr "Impossibile trovare un nome comune nel certificato"
+
+#: WWW/Library/Implementation/HTTP.c:933
+#, c-format
+msgid "SSL error:host(%s)!=cert(%s)-Continue?"
+msgstr "Errore di SSL: host(%s)!=cert(%s). Continuare?"
+
+#: WWW/Library/Implementation/HTTP.c:946
+#, c-format
+msgid "UNVERIFIED connection to %s (cert=%s)"
+msgstr "Connessione NON VERIFICATA a %s (cert=%s)"
+
+#: WWW/Library/Implementation/HTTP.c:955
+#, c-format
+msgid "Secure %d-bit %s (%s) HTTP connection"
+msgstr "Connessione HTTP sicura %d bit %s (%s)"
+
+#: WWW/Library/Implementation/HTTP.c:1422
+msgid "Sending HTTP request."
+msgstr "Invio della richiesta HTTP in corso."
+
+#: WWW/Library/Implementation/HTTP.c:1461
+msgid "Unexpected network write error; connection aborted."
+msgstr "Errore inatteso di scrittura in rete; connessione annullata."
+
+#: WWW/Library/Implementation/HTTP.c:1467
+msgid "HTTP request sent; waiting for response."
+msgstr "Richiesta HTTP inviata; in attesa di risposta."
+
+#: WWW/Library/Implementation/HTTP.c:1538
+msgid "Unexpected network read error; connection aborted."
+msgstr "Errore inatteso di lettura in rete; connessione annullata."
+
+#.
+#. * HTTP/1.1 Informational statuses.
+#. * 100 Continue.
+#. * 101 Switching Protocols.
+#. * > 101 is unknown.
+#. * We should never get these, and they have only the status
+#. * line and possibly other headers, so we'll deal with them by
+#. * showing the full header to the user as text/plain. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:1733
+msgid "Got unexpected Informational Status."
+msgstr "Ricevuta un'informazione di stato inattesa."
+
+#.
+#. * Reset Content. The server has fulfilled the request but
+#. * nothing is returned and we should reset any form
+#. * content. We'll instruct the user to do that, and
+#. * restore the current document. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:1767
+msgid "Request fulfilled. Reset Content."
+msgstr "Richiesta soddisfatta. Ripristino del contenuto."
+
+#. Not Modified
+#.
+#. * We didn't send an "If-Modified-Since" header, so this
+#. * status is inappropriate. We'll deal with it by showing
+#. * the full header to the user as text/plain. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:1883
+msgid "Got unexpected 304 Not Modified status."
+msgstr "Ricevuto uno stato non modificato 304 inatteso."
+
+#: WWW/Library/Implementation/HTTP.c:1946
+msgid "Redirection of POST content requires user approval."
+msgstr "Il reindirizzamento del contenuto POST richiede il consenso dell'utente."
+
+#: WWW/Library/Implementation/HTTP.c:1961
+msgid "Have POST content. Treating Permanent Redirection as Temporary.\n"
+msgstr "Contenuto POST. Il reindirizzamento permanente viene trattato come temporaneo.\n"
+
+#: WWW/Library/Implementation/HTTP.c:2003
+msgid "Retrying with access authorization information."
+msgstr "Nuovo tentativo con le informazioni di autorizzazione d'accesso."
+
+#: WWW/Library/Implementation/HTTP.c:2015
+msgid "Show the 401 message body?"
+msgstr "Visualizzare il corpo del messaggio 401?"
+
+#: WWW/Library/Implementation/HTTP.c:2058
+msgid "Show the 407 message body?"
+msgstr "Visualizzare il corpo del messaggio 407?"
+
+#.
+#. * Bad or unknown server_status number. Take a chance and hope
+#. * there is something to display. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2158
+msgid "Unknown status reply from server!"
+msgstr "Risposta di stato sconosciuto ricevuta dal server."
+
+#: WWW/Library/Implementation/HTTelnet.c:113
+#, c-format
+msgid "remote %s session:"
+msgstr "sessione remota %s:"
+
+#: WWW/Library/Implementation/HTWAIS.c:162
+msgid "Could not connect to WAIS server."
+msgstr "Impossibile collegarsi al server WAIS."
+
+#: WWW/Library/Implementation/HTWAIS.c:170
+msgid "Could not open WAIS connection for reading."
+msgstr "Impossibile aprire una connessione WAIS in lettura."
+
+#: WWW/Library/Implementation/HTWAIS.c:192
+msgid "Diagnostic code is "
+msgstr "Il codice diagnostico è "
+
+#: WWW/Library/Implementation/HTWAIS.c:464
+msgid "Index "
+msgstr "Indice "
+
+#: WWW/Library/Implementation/HTWAIS.c:468
+#, c-format
+msgid " contains the following %d item%s relevant to \""
+msgstr " contiene i seguenti %d elementi (%s) relativi a \""
+
+#: WWW/Library/Implementation/HTWAIS.c:476
+msgid "The first figure after each entry is its relative score, "
+msgstr "La prima cifra dopo ciascuna voce è il suo punteggio relativo, "
+
+#: WWW/Library/Implementation/HTWAIS.c:477
+msgid "the second is the number of lines in the item."
+msgstr "la seconda è il numero di righe nella voce."
+
+#: WWW/Library/Implementation/HTWAIS.c:519
+msgid " (bad file name)"
+msgstr " (nome di file non valido)"
+
+#: WWW/Library/Implementation/HTWAIS.c:545
+msgid "(bad doc id)"
+msgstr "(ID del documento non valido)"
+
+#: WWW/Library/Implementation/HTWAIS.c:561
+msgid "(Short Header record, can't display)"
+msgstr "(Registro d'intestazione corto, impossibile visualizzare)"
+
+#: WWW/Library/Implementation/HTWAIS.c:568
+msgid ""
+"\n"
+"Long Header record, can't display\n"
+msgstr ""
+"\n"
+"Registro d'intestazione lungo, impossibile visualizzare\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:575
+msgid ""
+"\n"
+"Text record\n"
+msgstr ""
+"\n"
+"Voce di testo\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:584
+msgid ""
+"\n"
+"Headline record, can't display\n"
+msgstr ""
+"\n"
+"Voce di riga d'intestazione, impossibile visualizzare\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:592
+msgid ""
+"\n"
+"Code record, can't display\n"
+msgstr ""
+"\n"
+"Voce di codice, impossibile visualizzare\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:696
+msgid "Syntax error in WAIS URL"
+msgstr "Errore di sintassi nell'URL WAIS"
+
+#: WWW/Library/Implementation/HTWAIS.c:768
+msgid " (WAIS Index)"
+msgstr " (Indice WAIS)"
+
+#: WWW/Library/Implementation/HTWAIS.c:775
+msgid "WAIS Index: "
+msgstr "Indice WAIS: "
+
+#: WWW/Library/Implementation/HTWAIS.c:781
+msgid "This is a link for searching the "
+msgstr "Questo è un collegamento per cercare l'"
+
+#: WWW/Library/Implementation/HTWAIS.c:785
+msgid " WAIS Index.\n"
+msgstr " indice WAIS.\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:814
+msgid ""
+"\n"
+"Enter the 's'earch command and then specify search words.\n"
+msgstr ""
+"\n"
+"Inserire il comando di ricerca (s), poi specificare le parole da cercare.\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:836
+msgid " (in "
+msgstr " (in "
+
+#: WWW/Library/Implementation/HTWAIS.c:845
+msgid "WAIS Search of \""
+msgstr "Ricerca WAIS di \""
+
+#: WWW/Library/Implementation/HTWAIS.c:849
+msgid "\" in: "
+msgstr "\" in: "
+
+#: WWW/Library/Implementation/HTWAIS.c:864
+msgid "HTWAIS: Request too large."
+msgstr "HTWAIS: richiesta troppo grande."
+
+#: WWW/Library/Implementation/HTWAIS.c:873
+msgid "Searching WAIS database..."
+msgstr "Ricerca nel database WAIS in corso."
+
+#: WWW/Library/Implementation/HTWAIS.c:883
+msgid "Search interrupted."
+msgstr "Ricerca interrotta."
+
+#: WWW/Library/Implementation/HTWAIS.c:934
+msgid "Can't convert format of WAIS document"
+msgstr "Impossibile convertire il formato del documento WAIS"
+
+#: WWW/Library/Implementation/HTWAIS.c:978
+msgid "HTWAIS: Request too long."
+msgstr "HTWAIS: richiesta troppo lunga."
+
+#.
+#. * Actually do the transaction given by request_message.
+#.
+#: WWW/Library/Implementation/HTWAIS.c:992
+msgid "Fetching WAIS document..."
+msgstr "Recupero del documento WAIS in corso."
+
+#. display_search_response(target, retrieval_response,
+#. wais_database, keywords);
+#: WWW/Library/Implementation/HTWAIS.c:1031
+msgid "No text was returned!\n"
+msgstr "Non è stato restituito alcun testo.\n"
+
+#: WWW/Library/Implementation/HTWSRC.c:299
+msgid " NOT GIVEN in source file; "
+msgstr " NON DATO nel file di origine; "
+
+#: WWW/Library/Implementation/HTWSRC.c:322
+msgid " WAIS source file"
+msgstr " file di origine WAIS"
+
+#: WWW/Library/Implementation/HTWSRC.c:329
+msgid " description"
+msgstr " descrizione"
+
+#: WWW/Library/Implementation/HTWSRC.c:339
+msgid "Access links"
+msgstr "Collegamenti di accesso"
+
+#: WWW/Library/Implementation/HTWSRC.c:360
+msgid "Direct access"
+msgstr "Accesso diretto"
+
+#. * Proxy will be used if defined, so let user know that - FM *
+#: WWW/Library/Implementation/HTWSRC.c:363
+msgid " (or via proxy server, if defined)"
+msgstr " (o tramite un server proxy, se definito)"
+
+#: WWW/Library/Implementation/HTWSRC.c:378
+msgid "Maintainer"
+msgstr "Curatore"
+
+#: WWW/Library/Implementation/HTWSRC.c:386
+msgid "Host"
+msgstr "Host"
+
+#: src/GridText.c:711
+msgid "Memory exhausted, display interrupted!"
+msgstr "Memoria esaurita, visualizzazione interrotta."
+
+#: src/GridText.c:716
+msgid "Memory exhausted, will interrupt transfer!"
+msgstr "Memoria esaurita, il trasferimento sarà interrotto."
+
+#: src/GridText.c:3688
+msgid " *** MEMORY EXHAUSTED ***"
+msgstr " *** MEMORIA ESAURITA ***"
+
+#: src/GridText.c:6087 src/GridText.c:6094 src/LYList.c:239
+msgid "unknown field or link"
+msgstr "campo o collegamento sconosciuto"
+
+#: src/GridText.c:6103
+msgid "text entry field"
+msgstr "campo di immissione testo"
+
+#: src/GridText.c:6106
+msgid "password entry field"
+msgstr "campo di immissione password"
+
+#: src/GridText.c:6109
+msgid "checkbox"
+msgstr "casella di scelta"
+
+#: src/GridText.c:6112
+msgid "radio button"
+msgstr "pulsante radio"
+
+#: src/GridText.c:6115
+msgid "submit button"
+msgstr "pulsante di invio"
+
+#: src/GridText.c:6118
+msgid "reset button"
+msgstr "pulsante di azzeramento"
+
+#: src/GridText.c:6121
+msgid "popup menu"
+msgstr "menù a comparsa"
+
+#: src/GridText.c:6124
+msgid "hidden form field"
+msgstr "campo nascosto di modulo"
+
+#: src/GridText.c:6127
+msgid "text entry area"
+msgstr "area di immissione testo"
+
+#: src/GridText.c:6130
+msgid "range entry field"
+msgstr "campo di immissione intervallo"
+
+#: src/GridText.c:6133
+msgid "file entry field"
+msgstr "campo di immissione file"
+
+#: src/GridText.c:6136
+msgid "text-submit field"
+msgstr "campo di invio testo"
+
+#: src/GridText.c:6139
+msgid "image-submit button"
+msgstr "pulsante di invio immagine"
+
+#: src/GridText.c:6142
+msgid "keygen field"
+msgstr "campo «keygen»"
+
+#: src/GridText.c:6145
+msgid "unknown form field"
+msgstr "campo di modulo sconosciuto"
+
+#: src/GridText.c:10275
+msgid "Can't open file for uploading"
+msgstr "Impossibile aprire il file per il caricamento"
+
+#: src/GridText.c:11434
+#, c-format
+msgid "Submitting %s"
+msgstr "Invio di %s in corso"
+
+#. ugliness has happened; inform user and do the best we can
+#: src/GridText.c:12487
+msgid "Hang Detect: TextAnchor struct corrupted - suggest aborting!"
+msgstr "Interruzione: struttura di TextAnchor danneggiata. Si suggerisce di abbandonare."
+
+#. don't show previous state
+#: src/GridText.c:12624
+msgid "Wrap lines to fit displayed area?"
+msgstr "Spezzare le righe per adattarle all'area di visualizzazione?"
+
+#: src/GridText.c:12676
+msgid "Very long lines have been wrapped!"
+msgstr "Le righe molto lunghe sono state spezzate."
+
+#: src/GridText.c:13181
+msgid "Very long lines have been truncated!"
+msgstr "Le righe molto lunghe sono state troncate."
+
+#: src/HTAlert.c:164 src/LYShowInfo.c:364 src/LYShowInfo.c:368
+msgid "bytes"
+msgstr "byte"
+
+#.
+#. * If we know the total size of the file, we can compute
+#. * a percentage, and show a corresponding progress bar.
+#.
+#: src/HTAlert.c:300 src/HTAlert.c:324
+#, c-format
+msgid "Read %s of data"
+msgstr "Letti %s di dati"
+
+#: src/HTAlert.c:321
+#, c-format
+msgid "Read %s of %s of data"
+msgstr "Letti %s su %s di dati"
+
+#: src/HTAlert.c:330
+#, c-format
+msgid ", %s/sec"
+msgstr ", %s/sec"
+
+#: src/HTAlert.c:342
+#, c-format
+msgid " (stalled for %s)"
+msgstr " (bloccato per %s)"
+
+#: src/HTAlert.c:346
+#, c-format
+msgid ", ETA %s"
+msgstr ", mancano %s"
+
+#: src/HTAlert.c:368
+msgid " (Press 'z' to abort)"
+msgstr " (Premere «z» per annullare)"
+
+#. Meta-note: don't move the following note from its place right
+#. in front of the first gettext(). As it is now, it should
+#. automatically appear in generated lynx.pot files. - kw
+#.
+#. NOTE TO TRANSLATORS: If you provide a translation for "yes", lynx
+#. * will take the first byte of the translation as a positive response
+#. * to Yes/No questions. If you provide a translation for "no", lynx
+#. * will take the first byte of the translation as a negative response
+#. * to Yes/No questions. For both, lynx will also try to show the
+#. * first byte in the prompt as a character, instead of (y) or (n),
+#. * respectively. This will not work right for multibyte charsets!
+#. * Don't translate "yes" and "no" for CJK character sets (or translate
+#. * them to "yes" and "no"). For a translation using UTF-8, don't
+#. * translate if the translation would begin with anything but a 7-bit
+#. * (US_ASCII) character. That also means do not translate if the
+#. * translation would begin with anything but a 7-bit character, if
+#. * you use a single-byte character encoding (a charset like ISO-8859-n)
+#. * but anticipate that the message catalog may be used re-encoded in
+#. * UTF-8 form.
+#. * For translations using other character sets, you may also wish to
+#. * leave "yes" and "no" untranslated, if using (y) and (n) is the
+#. * preferred behavior.
+#. * Lynx will also accept y Y n N as responses unless there is a conflict
+#. * with the first letter of the "yes" or "no" translation.
+#.
+#: src/HTAlert.c:406 src/HTAlert.c:454
+msgid "yes"
+msgstr "sì"
+
+#: src/HTAlert.c:409 src/HTAlert.c:455
+msgid "no"
+msgstr "no"
+
+#.
+#. * Special-purpose workaround for gettext support (we should do
+#. * this in a more general way) -TD
+#. *
+#. * NOTE TO TRANSLATORS: If the prompt has been rendered into
+#. * another language, and if yes/no are distinct, assume the
+#. * translator can make an ordered list in parentheses with one
+#. * capital letter for each as we assumed in HTConfirmDefault().
+#. * The list has to be in the same order as in the original message,
+#. * and the four capital letters chosen to not match those in the
+#. * original unless they have the same position.
+#. *
+#. * Example:
+#. * (Y/N/Always/neVer) - English (original)
+#. * (O/N/Toujours/Jamais) - French
+#.
+#: src/HTAlert.c:911
+msgid "Y/N/A/V"
+msgstr "S/N/sEmpre/Mai"
+
+#: src/HTML.c:5899
+msgid "Description:"
+msgstr "Descrizione:"
+
+#: src/HTML.c:5904
+msgid "(none)"
+msgstr "(nessuno)"
+
+#: src/HTML.c:5908
+msgid "Filepath:"
+msgstr "Percorso del file:"
+
+#: src/HTML.c:5914
+msgid "(unknown)"
+msgstr "(sconosciuto)"
+
+#: src/HTML.c:7340
+msgid "Document has only hidden links. Use the 'l'ist command."
+msgstr "Il documento ha solo collegamenti nascosti. Usare il comando «l» per l'elenco."
+
+#: src/HTML.c:7839
+msgid "Source cache error - disk full?"
+msgstr "Errore nella cache di origine. Controllare se il disco è pieno."
+
+#: src/HTML.c:7852
+msgid "Source cache error - not enough memory!"
+msgstr "Errore nella cache di origine. Memoria insufficiente."
+
+#: src/LYBookmark.c:167
+msgid ""
+" This file is an HTML representation of the X Mosaic hotlist file.\n"
+" Outdated or invalid links may be removed by using the\n"
+" remove bookmark command, it is usually the 'R' key but may have\n"
+" been remapped by you or your system administrator."
+msgstr ""
+" Questo file è una rappresentazione HTML del file segnalibri di X Mosaic.\n"
+" Si possono eliminare i collegamenti scaduti o non validi con il consueto\n"
+" comando di cancellazione dei segnalibri, normalmente il tasto «R», che però\n"
+" potrebbe essere stato riconfigurato dall'utente o dall'amministratore del sistema."
+
+#: src/LYBookmark.c:374
+#, c-format
+msgid ""
+" You can delete links by the 'R' key<br>\n"
+"<ol>\n"
+msgstr ""
+" Si possono cancellare le voci con il tasto «R»<br>\n"
+"<ol>\n"
+
+#: src/LYBookmark.c:377
+msgid ""
+" You can delete links using the remove bookmark command. It is usually\n"
+" the 'R' key but may have been remapped by you or your system\n"
+" administrator."
+msgstr ""
+" Si possono cancellare le voci con il tasto di cancellazione dei segnalibri,\n"
+" di solito il tasto «R», ma i tasti possono essere stati riconfigurati\n"
+" dall'utente o dall'amministratore del sistema."
+
+#: src/LYBookmark.c:381
+msgid ""
+" This file also may be edited with a standard text editor to delete\n"
+" outdated or invalid links, or to change their order."
+msgstr ""
+" Il file può anche essere modificato con un normale editor di testi per\n"
+" eliminare le voci scadute o non valide o per modificarne l'ordine."
+
+#: src/LYBookmark.c:384
+msgid ""
+"Note: if you edit this file manually\n"
+" you should not change the format within the lines\n"
+" or add other HTML markup.\n"
+" Make sure any bookmark link is saved as a single line."
+msgstr ""
+"Nota: se si elabora manualmente questo file,\n"
+" non si deve cambiare il formato all'interno delle righe\n"
+" e nemmeno aggiungere altro codice HTML.\n"
+" Assicurarsi che ogni collegamento del segnalibro venga salvato su una singola riga."
+
+#: src/LYBookmark.c:680
+#, c-format
+msgid "File may be recoverable from %s during this session"
+msgstr "Il file potrebbe essere recuperabile da %s durante questa sessione."
+
+#: src/LYCgi.c:161
+#, c-format
+msgid "Do you want to execute \"%s\"?"
+msgstr "Eseguire «%s»?"
+
+#.
+#. * Neither the path as given nor any components examined by backing up
+#. * were stat()able. - kw
+#.
+#: src/LYCgi.c:276
+msgid "Unable to access cgi script"
+msgstr "Impossibile accedere allo script CGI"
+
+#: src/LYCgi.c:701 src/LYCgi.c:704
+msgid "Good Advice"
+msgstr "Buon consiglio"
+
+#: src/LYCgi.c:708
+msgid "An excellent http server for VMS is available via"
+msgstr "Un ottimo server http per VMS è disponibile tramite"
+
+#: src/LYCgi.c:715
+msgid "this link"
+msgstr "questo collegamento"
+
+#: src/LYCgi.c:719
+msgid "It provides state of the art CGI script support.\n"
+msgstr "Esso offre il supporto per gli script CGI al miglior livello attuale.\n"
+
+#: src/LYClean.c:122
+msgid "Exiting via interrupt:"
+msgstr "Uscita tramite interrupt in corso:"
+
+#: src/LYCookie.c:2477
+msgid "(from a previous session)"
+msgstr "(da una sessione precedente)"
+
+#: src/LYCookie.c:2538
+msgid "Maximum Gobble Date:"
+msgstr "Data massima di scadenza:"
+
+#: src/LYCookie.c:2577
+msgid "Internal"
+msgstr "Interno"
+
+#: src/LYCookie.c:2578
+msgid "cookie_domain_flag_set error, aborting program"
+msgstr "errore cookie_domain_flag_set: programma interrotto"
+
+#: src/LYCurses.c:1105
+msgid "Terminal initialisation failed - unknown terminal type?"
+msgstr "Inizializzazione del terminale fallita, probabilmente a causa di un tipo di terminale sconosciuto."
+
+#: src/LYCurses.c:1574
+msgid "Terminal ="
+msgstr "Terminale ="
+
+#: src/LYCurses.c:1578
+msgid "You must use a vt100, 200, etc. terminal with this program."
+msgstr "Con questo programma si deve usare un terminale vt100, 200, ecc."
+
+#: src/LYCurses.c:1627
+msgid "Your Terminal type is unknown!"
+msgstr "Il tipo di terminale è sconosciuto."
+
+#: src/LYCurses.c:1628
+msgid "Enter a terminal type:"
+msgstr "Inserire un tipo di terminale:"
+
+#: src/LYCurses.c:1642
+msgid "TERMINAL TYPE IS SET TO"
+msgstr "IL TIPO DI TERMINALE È IMPOSTATO A"
+
+#: src/LYCurses.c:2163
+#, c-format
+msgid ""
+"\n"
+"A Fatal error has occurred in %s Ver. %s\n"
+msgstr ""
+"\n"
+"Un errore irreversibile si è verificato in %s Ver. %s\n"
+
+#: src/LYCurses.c:2166
+#, c-format
+msgid ""
+"\n"
+"Please notify your system administrator to confirm a bug, and if\n"
+"confirmed, to notify the lynx-dev list. Bug reports should have concise\n"
+"descriptions of the command and/or URL which causes the problem, the\n"
+"operating system name with version number, the TCPIP implementation, the\n"
+"TRACEBACK if it can be captured, and any other relevant information.\n"
+msgstr ""
+"\n"
+"Avvisare l'amministratore del sistema per segnalare un difetto e, se il\n"
+"difetto è confermato, segnalarlo alla lista lynx-dev.\n"
+"La segnalazione dovrebbe contenere una descrizione concisa del comando e/o dell'URL\n"
+"che provoca il problema, il nome del sistema operativo con il numero di versione,\n"
+"l'implementazione TCP/IP, il TRACEBACK se è possibile catturarlo, e ogni\n"
+"altra informazione significativa.\n"
+
+#: src/LYEdit.c:266
+#, c-format
+msgid "Error starting editor, %s"
+msgstr "Errore durante l'avvio dell'editor, %s"
+
+#: src/LYEdit.c:269
+msgid "Editor killed by signal"
+msgstr "Editor terminato da segnale"
+
+#: src/LYEdit.c:274
+#, c-format
+msgid "Editor returned with error status %s"
+msgstr "L'editor ha restituito un codice di errore %s"
+
+#: src/LYDownload.c:506
+msgid "Downloaded link:"
+msgstr "Collegamento scaricato:"
+
+#: src/LYDownload.c:511
+msgid "Suggested file name:"
+msgstr "Nome di file proposto:"
+
+#: src/LYDownload.c:516
+msgid "Standard download options:"
+msgstr "Opzioni normali di scaricamento:"
+
+#: src/LYDownload.c:517
+msgid "Download options:"
+msgstr "Opzioni di scaricamento:"
+
+#: src/LYDownload.c:533
+msgid "Save to disk"
+msgstr "Salva su disco"
+
+#: src/LYDownload.c:547
+msgid "View temporary file"
+msgstr "Visualizza il file temporaneo"
+
+#: src/LYDownload.c:554
+msgid "Save to disk disabled."
+msgstr "Salvataggio su disco disabilitato."
+
+#: src/LYDownload.c:558 src/LYPrint.c:1310
+msgid "Local additions:"
+msgstr "Aggiunte locali:"
+
+#: src/LYDownload.c:569 src/LYUpload.c:211
+msgid "No Name Given"
+msgstr "Nessun nome dato"
+
+#: src/LYHistory.c:672
+msgid "You selected:"
+msgstr "Scelte effettuate:"
+
+#: src/LYHistory.c:696 src/LYHistory.c:925
+msgid "(no address)"
+msgstr "(nessun indirizzo)"
+
+#: src/LYHistory.c:700
+msgid " (internal)"
+msgstr " (interno)"
+
+#: src/LYHistory.c:702
+msgid " (was internal)"
+msgstr " (era interno)"
+
+#: src/LYHistory.c:800
+msgid " (From History)"
+msgstr " (dalla cronologia)"
+
+#: src/LYHistory.c:845
+msgid "You visited (POSTs, bookmark, menu and list files excluded):"
+msgstr "Elementi visitati (sono esclusi file POST, segnalibri, voci di menù ed elenchi):"
+
+#: src/LYHistory.c:1138
+msgid "(No messages yet)"
+msgstr "(Ancora nessun messaggio)"
+
+#: src/LYLeaks.c:220
+msgid "Invalid pointer detected."
+msgstr "Individuato puntatore non valido."
+
+#: src/LYLeaks.c:222 src/LYLeaks.c:260
+msgid "Sequence:"
+msgstr "Sequenza:"
+
+#: src/LYLeaks.c:225 src/LYLeaks.c:263
+msgid "Pointer:"
+msgstr "Puntatore:"
+
+#: src/LYLeaks.c:234 src/LYLeaks.c:241 src/LYLeaks.c:282
+msgid "FileName:"
+msgstr "Nome del file:"
+
+#: src/LYLeaks.c:237 src/LYLeaks.c:244 src/LYLeaks.c:285 src/LYLeaks.c:296
+msgid "LineCount:"
+msgstr "Numero di righe:"
+
+#: src/LYLeaks.c:258
+msgid "Memory leak detected."
+msgstr "Individuata perdita di memoria."
+
+#: src/LYLeaks.c:266
+msgid "Contains:"
+msgstr "Contiene:"
+
+#: src/LYLeaks.c:279
+msgid "ByteSize:"
+msgstr "Dimensione in byte:"
+
+#: src/LYLeaks.c:293
+msgid "realloced:"
+msgstr "reallocato:"
+
+#: src/LYLeaks.c:314
+msgid "Total memory leakage this run:"
+msgstr "Perdita totale di memoria in questa esecuzione:"
+
+#: src/LYLeaks.c:317
+msgid "Peak allocation"
+msgstr "Allocazione massima"
+
+#: src/LYLeaks.c:318
+msgid "Bytes allocated"
+msgstr "Byte allocati"
+
+#: src/LYLeaks.c:319
+msgid "Total mallocs"
+msgstr "«malloc» totali"
+
+#: src/LYLeaks.c:320
+msgid "Total frees"
+msgstr "«free» totali"
+
+#: src/LYList.c:84
+msgid "References in "
+msgstr "Riferimenti in "
+
+#: src/LYList.c:87
+msgid "this document:"
+msgstr "questo documento:"
+
+#: src/LYList.c:93
+msgid "Visible links:"
+msgstr "Collegamenti visibili:"
+
+#: src/LYList.c:194 src/LYList.c:295
+msgid "Hidden links:"
+msgstr "Collegamenti nascosti:"
+
+#: src/LYList.c:332
+msgid "References"
+msgstr "Riferimenti"
+
+#: src/LYList.c:336
+msgid "Visible links"
+msgstr "Collegamenti visibili"
+
+#: src/LYLocal.c:271
+#, c-format
+msgid "Unable to get status of '%s'."
+msgstr "Impossibile rilevare lo stato di «%s»."
+
+#: src/LYLocal.c:305
+msgid "The selected item is not a file or a directory! Request ignored."
+msgstr "L'elemento selezionato non è un file né una directory. Richiesta ignorata."
+
+#: src/LYLocal.c:373
+#, c-format
+msgid "Unable to %s due to system error!"
+msgstr "Operazione %s impossibile a causa di un errore di sistema."
+
+#: src/LYLocal.c:407
+#, c-format
+msgid "Probable failure to %s due to system error!"
+msgstr "Probabile insuccesso di %s a causa di un errore di sistema."
+
+#: src/LYLocal.c:469 src/LYLocal.c:490
+#, c-format
+msgid "remove %s"
+msgstr "eliminare %s"
+
+#: src/LYLocal.c:508
+#, c-format
+msgid "touch %s"
+msgstr "touch %s"
+
+#: src/LYLocal.c:536
+#, c-format
+msgid "move %s to %s"
+msgstr "sposta %s in %s"
+
+#: src/LYLocal.c:577
+msgid "There is already a directory with that name! Request ignored."
+msgstr "Una directory con questo nome esiste già. Richiesta ignorata."
+
+#: src/LYLocal.c:579
+msgid "There is already a file with that name! Request ignored."
+msgstr "Un file con questo nome esiste già. Richiesta ignorata."
+
+#: src/LYLocal.c:581
+msgid "The specified name is already in use! Request ignored."
+msgstr "Il nome indicato è già usato. Richiesta ignorata."
+
+#: src/LYLocal.c:592
+msgid "Destination has different owner! Request denied."
+msgstr "La destinazione ha un proprietario diverso. Richiesta negata."
+
+#: src/LYLocal.c:595
+msgid "Destination is not a valid directory! Request denied."
+msgstr "La destinazione non è una directory valida. Richiesta negata."
+
+#: src/LYLocal.c:617
+msgid "Remove all tagged files and directories?"
+msgstr "Eliminare tutte le directory e i file contrassegnati?"
+
+#: src/LYLocal.c:675
+msgid "Enter new location for tagged items: "
+msgstr "Inserire la nuova posizione per le voci contrassegnate: "
+
+#: src/LYLocal.c:745
+msgid "Path too long"
+msgstr "Percorso troppo lungo"
+
+#: src/LYLocal.c:776
+msgid "Source and destination are the same location - request ignored!"
+msgstr "Origine e destinazione sono identici. Richiesta ignorata."
+
+#: src/LYLocal.c:833
+msgid "Enter new name for directory: "
+msgstr "Inserire il nuovo nome per la directory: "
+
+#: src/LYLocal.c:835
+msgid "Enter new name for file: "
+msgstr "Inserire il nuovo nome per il file: "
+
+#: src/LYLocal.c:847
+msgid "Illegal character (path-separator) found! Request ignored."
+msgstr "Trovato carattere illecito (separatore di percorso). Richiesta ignorata."
+
+#: src/LYLocal.c:897
+msgid "Enter new location for directory: "
+msgstr "Immettere la nuova posizione per la directory: "
+
+#: src/LYLocal.c:903
+msgid "Enter new location for file: "
+msgstr "Immettere la nuova posizione per il file: "
+
+#: src/LYLocal.c:930
+msgid "Unexpected failure - unable to find trailing path separator"
+msgstr "Errore inatteso: impossibile trovare il separatore di percorso finale"
+
+#: src/LYLocal.c:950
+msgid "Source and destination are the same location! Request ignored!"
+msgstr "Origine e destinazione sono identici. Richiesta ignorata."
+
+#: src/LYLocal.c:997
+msgid "Modify name, location, or permission (n, l, or p): "
+msgstr "Modificare il nome (n), la posizione (l) o i diritti di accesso (p) (n, l o p): "
+
+#: src/LYLocal.c:999
+msgid "Modify name or location (n or l): "
+msgstr "Modificare il nome (n) o la posizione (l) (n o l): "
+
+#.
+#. * Code for changing ownership needed here.
+#.
+#: src/LYLocal.c:1028
+msgid "This feature not yet implemented!"
+msgstr "Questa funzionalità non è ancora implementata."
+
+#: src/LYLocal.c:1048
+msgid "Enter name of file to create: "
+msgstr "Inserire il nome del file da creare: "
+
+#: src/LYLocal.c:1052 src/LYLocal.c:1088
+msgid "Illegal redirection \"//\" found! Request ignored."
+msgstr "Trovato reindirizzamento illecito «//». Richiesta ignorata."
+
+#: src/LYLocal.c:1084
+msgid "Enter name for new directory: "
+msgstr "Inserire il nome della nuova directory: "
+
+#: src/LYLocal.c:1124
+msgid "Create file or directory (f or d): "
+msgstr "Creare un file (f) o una directory (d) (f o d): "
+
+#: src/LYLocal.c:1166
+#, c-format
+msgid "Remove directory '%s'?"
+msgstr "Eliminare la directory «%s»?"
+
+#: src/LYLocal.c:1169
+msgid "Remove directory?"
+msgstr "Eliminare la directory?"
+
+#: src/LYLocal.c:1174
+#, c-format
+msgid "Remove file '%s'?"
+msgstr "Eliminare il file «%s»?"
+
+#: src/LYLocal.c:1176
+msgid "Remove file?"
+msgstr "Eliminare il file?"
+
+#: src/LYLocal.c:1181
+#, c-format
+msgid "Remove symbolic link '%s'?"
+msgstr "Eliminare il collegamento simbolico «%s»?"
+
+#: src/LYLocal.c:1183
+msgid "Remove symbolic link?"
+msgstr "Eliminare il collegamento simbolico?"
+
+#: src/LYLocal.c:1278
+msgid "Sorry, don't know how to permit non-UNIX files yet."
+msgstr "Spiacente, non è ancora possibile gestire i diritti di accesso per i file non UNIX."
+
+#: src/LYLocal.c:1308
+msgid "Unable to open permit options file"
+msgstr "Impossibile aprire il file delle opzioni di permesso."
+
+#: src/LYLocal.c:1338
+msgid "Specify permissions below:"
+msgstr "Specificare di seguito i diritti di accesso:"
+
+#: src/LYLocal.c:1339 src/LYShowInfo.c:265
+msgid "Owner:"
+msgstr "Proprietario:"
+
+#: src/LYLocal.c:1355
+msgid "Group"
+msgstr "Gruppo"
+
+#: src/LYLocal.c:1371
+msgid "Others:"
+msgstr "Altri:"
+
+#: src/LYLocal.c:1389
+msgid "form to permit"
+msgstr "modulo da autorizzare"
+
+#: src/LYLocal.c:1484
+msgid "Invalid mode format."
+msgstr "Formato del modo non valido."
+
+#: src/LYLocal.c:1488
+msgid "Invalid syntax format."
+msgstr "Formato di sintassi non valido."
+
+#: src/LYLocal.c:1670
+msgid "Warning! UUDecoded file will exist in the directory you started Lynx."
+msgstr "Attenzione: il file UUDecoded sarà creato nella directory da cui è stato avviato Lynx."
+
+#: src/LYLocal.c:1860
+msgid "NULL URL pointer"
+msgstr "Puntatore a URL NULL"
+
+#: src/LYLocal.c:1942
+#, c-format
+msgid "Executing %s "
+msgstr "Esecuzione in corso di %s "
+
+#: src/LYLocal.c:1945
+msgid "Executing system command. This might take a while."
+msgstr "Esecuzione di un comando di sistema in corso. Potrebbe volerci un po' di tempo."
+
+#: src/LYLocal.c:2017
+msgid "Current directory:"
+msgstr "Directory attuale:"
+
+#: src/LYLocal.c:2020 src/LYLocal.c:2038
+msgid "Current selection:"
+msgstr "Selezione attuale:"
+
+#: src/LYLocal.c:2024
+msgid "Nothing currently selected."
+msgstr "Nulla attualmente selezionato."
+
+#: src/LYLocal.c:2040
+msgid "tagged item:"
+msgstr "voce contrassegnata:"
+
+#: src/LYLocal.c:2041
+msgid "tagged items:"
+msgstr "voci contrassegnate:"
+
+#: src/LYLocal.c:2138 src/LYLocal.c:2149
+msgid "Illegal filename; request ignored."
+msgstr "Nome di file illecito. Richiesta ignorata."
+
+#. directory not writable
+#: src/LYLocal.c:2247 src/LYLocal.c:2306
+msgid "Install in the selected directory not permitted."
+msgstr "Manca il diritto per l'installazione nella directory selezionata."
+
+#: src/LYLocal.c:2302
+msgid "The selected item is not a directory! Request ignored."
+msgstr "La voce selezionata non è una directory. Richiesta ignorata."
+
+#: src/LYLocal.c:2311
+msgid "Just a moment, ..."
+msgstr "Solo un attimo..."
+
+#: src/LYLocal.c:2328
+msgid "Error building install args"
+msgstr "Errore nella preparazione degli argomenti di installazione"
+
+#: src/LYLocal.c:2343 src/LYLocal.c:2374
+#, c-format
+msgid "Source and target are the same: %s"
+msgstr "Origine e destinazione sono identici: %s"
+
+#: src/LYLocal.c:2350 src/LYLocal.c:2381
+#, c-format
+msgid "Already in target directory: %s"
+msgstr "Si è già nella directory destinazione: %s"
+
+#: src/LYLocal.c:2399
+msgid "Installation complete"
+msgstr "Installazione terminata"
+
+#: src/LYLocal.c:2586
+msgid "Temporary URL or list would be too long."
+msgstr "L'URL temporanea o l'elenco temporaneo sarebbero troppo lunghi."
+
+#: src/LYMail.c:523
+msgid "Sending"
+msgstr "Invio in corso"
+
+#: src/LYMail.c:1009
+#, c-format
+msgid "The link %s :?: %s \n"
+msgstr "Il collegamento %s :?: %s \n"
+
+#: src/LYMail.c:1011
+#, c-format
+msgid "called \"%s\"\n"
+msgstr "chiamato «%s»\n"
+
+#: src/LYMail.c:1012
+#, c-format
+msgid "in the file \"%s\" called \"%s\"\n"
+msgstr "nel file «%s» chiamato «%s»\n"
+
+#: src/LYMail.c:1013
+msgid "was requested but was not available."
+msgstr "è stato richiesto ma non è disponibile."
+
+#: src/LYMail.c:1014
+msgid "Thought you might want to know."
+msgstr "Probabilmente è utile saperlo."
+
+#: src/LYMail.c:1016
+msgid "This message was automatically generated by"
+msgstr "Questo messaggio è stato generato automaticamente da"
+
+#: src/LYMail.c:1731
+msgid "No system mailer configured"
+msgstr "Non è stato configurato alcun programma di sistema per l'invio della posta elettronica"
+
+#: src/LYMain.c:1002
+msgid "No Winsock found, sorry."
+msgstr "Nessun Winsock trovato, spiacente."
+
+#: src/LYMain.c:1199
+msgid "You MUST define a valid TMP or TEMP area!"
+msgstr "SI DEVE definire un'area TMP o TEMP valida."
+
+#: src/LYMain.c:1252 src/LYMainLoop.c:5051
+msgid "No such directory"
+msgstr "Directory inesistente"
+
+#: src/LYMain.c:1437
+#, c-format
+msgid ""
+"\n"
+"Configuration file \"%s\" is not available.\n"
+"\n"
+msgstr ""
+"\n"
+"Il file di configurazione «%s» non è disponibile.\n"
+"\n"
+
+#: src/LYMain.c:1447
+#, c-format
+msgid ""
+"\n"
+"Lynx character sets not declared.\n"
+"\n"
+msgstr ""
+"\n"
+"Set di caratteri di Lynx non dichiarati.\n"
+"\n"
+
+#: src/LYMain.c:1476
+#, c-format
+msgid ""
+"\n"
+"Lynx edit map not declared.\n"
+"\n"
+msgstr ""
+"\n"
+"Edit map di Lynx non dichiarata.\n"
+"\n"
+
+#: src/LYMain.c:1552
+#, c-format
+msgid ""
+"\n"
+"Lynx file \"%s\" is not available.\n"
+"\n"
+msgstr ""
+"\n"
+"Il file di Lynx «%s» non è disponibile.\n"
+"\n"
+
+#: src/LYMain.c:1627
+#, c-format
+msgid "Ignored %d characters from standard input.\n"
+msgstr "%d caratteri ignorati dallo standard input.\n"
+
+#: src/LYMain.c:1629
+#, c-format
+msgid "Use \"-stdin\" or \"-\" to tell how to handle piped input.\n"
+msgstr "Usare «-stdin» o «-» per indicare come gestire l'input del pipe.\n"
+
+#: src/LYMain.c:1777
+msgid "Warning:"
+msgstr "Attenzione:"
+
+#: src/LYMain.c:2342
+msgid "persistent cookies state will be changed in next session only."
+msgstr "lo stato dei cookie permanenti sarà modificato solo alla prossima sessione."
+
+#: src/LYMain.c:2578 src/LYMain.c:2623
+#, c-format
+msgid "Lynx: ignoring unrecognized charset=%s\n"
+msgstr "Lynx: il set di caratteri %s sconosciuto viene ignorato.\n"
+
+#: src/LYMain.c:3142
+#, c-format
+msgid "%s Version %s (%s)"
+msgstr "%s versione %s (%s)"
+
+#: src/LYMain.c:3180
+#, c-format
+msgid "Built on %s %s %s\n"
+msgstr "Compilato il %s %s %s\n"
+
+#: src/LYMain.c:3202
+msgid "Copyrights held by the Lynx Developers Group,"
+msgstr "Il copyright appartiene al Lynx Developers Group.,"
+
+#: src/LYMain.c:3203
+msgid "the University of Kansas, CERN, and other contributors."
+msgstr "all'Università del Kansas, al CERN e ad altri collaboratori."
+
+#: src/LYMain.c:3204
+msgid "Distributed under the GNU General Public License (Version 2)."
+msgstr "Distribuito sotto la GNU General Public License (GPL) (versione 2)."
+
+#: src/LYMain.c:3205
+msgid "See http://lynx.isc.org/ and the online help for more information."
+msgstr "Vedere http://lynx.isc.org/ e l'aiuto in linea per ulteriori informazioni."
+
+#: src/LYMain.c:4024
+#, c-format
+msgid "USAGE: %s [options] [file]\n"
+msgstr "USO: %s [opzioni] [file]\n"
+
+#: src/LYMain.c:4025
+#, c-format
+msgid "Options are:\n"
+msgstr "Le opzioni sono:\n"
+
+#: src/LYMain.c:4326
+#, c-format
+msgid "%s: Invalid Option: %s\n"
+msgstr "%s: opzione non valida: %s\n"
+
+#: src/LYMainLoop.c:571
+#, c-format
+msgid "Internal error: Invalid mouse link %d!"
+msgstr "Errore interno: collegamento al mouse %d non valido."
+
+#: src/LYMainLoop.c:691 src/LYMainLoop.c:5073
+msgid "A URL specified by the user"
+msgstr "Un URL specificato dall'utente"
+
+#: src/LYMainLoop.c:1150
+msgid "Enctype multipart/form-data not yet supported! Cannot submit."
+msgstr "«Enctype multipart/form-data» non ancora supportato. Impossibile inviare."
+
+#.
+#. * Make a name for this help file.
+#.
+#: src/LYMainLoop.c:3082
+msgid "Help Screen"
+msgstr "Schermata di aiuto"
+
+#: src/LYMainLoop.c:3203
+msgid "System Index"
+msgstr "Indice di sistema"
+
+#: src/LYMainLoop.c:3562 src/LYMainLoop.c:5297
+msgid "Entry into main screen"
+msgstr "Ingresso nella schermata principale"
+
+#: src/LYMainLoop.c:3820
+msgid "No next document present"
+msgstr "Non è presente alcun documento successivo"
+
+#: src/LYMainLoop.c:4116
+msgid "charset for this document specified explicitly, sorry..."
+msgstr "il set di caratteri per questo documento è specificato in modo esplicito, spiacente..."
+
+#: src/LYMainLoop.c:5029
+msgid "cd to:"
+msgstr "cd in:"
+
+#: src/LYMainLoop.c:5054
+msgid "A component of path is not a directory"
+msgstr "Un elemento del percorso non è una directory"
+
+#: src/LYMainLoop.c:5057
+msgid "failed to change directory"
+msgstr "cambiamento di directory fallito"
+
+#: src/LYMainLoop.c:6229
+msgid "Reparsing document under current settings..."
+msgstr "Rianalisi del documento con le impostazioni attuali in corso."
+
+#: src/LYMainLoop.c:6521
+#, c-format
+msgid "Fatal error - could not open output file %s\n"
+msgstr "Errore fatale: impossibile aprire il file di output %s\n"
+
+#: src/LYMainLoop.c:6858
+msgid "TABLE center enable."
+msgstr "TABELLA abilita la centratura."
+
+#: src/LYMainLoop.c:6861
+msgid "TABLE center disable."
+msgstr "TABELLA disabilita la centratura."
+
+#: src/LYMainLoop.c:6938
+msgid "Current URL is empty."
+msgstr "L'URL attuale è vuoto."
+
+#: src/LYMainLoop.c:6940 src/LYUtils.c:1880
+msgid "Copy to clipboard failed."
+msgstr "Copia negli appunti di sistema fallita."
+
+#: src/LYMainLoop.c:6942
+msgid "Document URL put to clipboard."
+msgstr "URL del documento copiato negli appunti di sistema."
+
+#: src/LYMainLoop.c:6944
+msgid "Link URL put to clipboard."
+msgstr "URL del collegamento copiato negli appunti di sistema."
+
+#: src/LYMainLoop.c:6971
+msgid "No URL in the clipboard."
+msgstr "Nessun URL negli appunti di sistema."
+
+#: src/LYMainLoop.c:7642 src/LYMainLoop.c:7812
+msgid "-index-"
+msgstr "-indice-"
+
+#: src/LYMainLoop.c:7752
+msgid "lynx: Can't access startfile"
+msgstr "lynx: impossibile accedere al file di avvio"
+
+#: src/LYMainLoop.c:7764
+msgid "lynx: Start file could not be found or is not text/html or text/plain"
+msgstr "lynx: il file di avvio non è stato trovato o non ha un formato text/html o text/plain"
+
+#: src/LYMainLoop.c:7765
+msgid " Exiting..."
+msgstr " Uscita in corso."
+
+#: src/LYMainLoop.c:7806
+msgid "-more-"
+msgstr "-seguente-"
+
+#. Enable scrolling.
+#: src/LYNews.c:186
+msgid "You will be posting to:"
+msgstr "L'articolo sarà inviato a: "
+
+#.
+#. * Get the mail address for the From header, offering personal_mail_address
+#. * as default.
+#.
+#: src/LYNews.c:195
+msgid ""
+"\n"
+"\n"
+" Please provide your mail address for the From: header\n"
+msgstr ""
+"\n"
+"\n"
+" Immettere il proprio indirizzo di posta elettronica per l'intestazione «From:»\n"
+
+#.
+#. * Get the Subject header, offering the current document's title as the
+#. * default if this is a followup rather than a new post. - FM
+#.
+#: src/LYNews.c:212
+msgid ""
+"\n"
+"\n"
+" Please provide or edit the Subject: header\n"
+msgstr ""
+"\n"
+"\n"
+" Immettere o modificare l'intestazione «Subject:»\n"
+
+#: src/LYNews.c:302
+msgid ""
+"\n"
+"\n"
+" Please provide or edit the Organization: header\n"
+msgstr ""
+"\n"
+"\n"
+" Immettere o modificare l'intestazione «Organization:»\n"
+
+#.
+#. * Use the built in line editior.
+#.
+#: src/LYNews.c:359
+msgid ""
+"\n"
+"\n"
+" Please enter your message below."
+msgstr ""
+"\n"
+"\n"
+" Immettere il messaggio qui di seguito:"
+
+#: src/LYNews.c:405
+msgid "Message has no original text!"
+msgstr "Il messaggio non ha testo originale."
+
+#: src/LYOptions.c:769
+msgid "review/edit B)ookmarks files"
+msgstr "B) revisione o modifica dei file dei segnalibri"
+
+#: src/LYOptions.c:771
+msgid "B)ookmark file: "
+msgstr "B) File dei segnalibri: "
+
+#: src/LYOptions.c:2132 src/LYOptions.c:2139
+msgid "ON"
+msgstr "B) File dei segnalibri: "
+
+#. verbose_img variable
+#: src/LYOptions.c:2133 src/LYOptions.c:2138 src/LYOptions.c:2290 src/LYOptions.c:2301
+msgid "OFF"
+msgstr "DISABILITATO"
+
+#: src/LYOptions.c:2134
+msgid "NEVER"
+msgstr "MAI"
+
+#: src/LYOptions.c:2135
+msgid "ALWAYS"
+msgstr "SEMPRE"
+
+#: src/LYOptions.c:2151 src/LYOptions.c:2282
+msgid "ignore"
+msgstr "ignora"
+
+#: src/LYOptions.c:2152
+msgid "ask user"
+msgstr "chiedi conferma"
+
+#: src/LYOptions.c:2153
+msgid "accept all"
+msgstr "accetta tutto"
+
+#: src/LYOptions.c:2165
+msgid "ALWAYS OFF"
+msgstr "SEMPRE DISABILITATO"
+
+#: src/LYOptions.c:2166
+msgid "FOR LOCAL FILES ONLY"
+msgstr "SOLO PER FILE LOCALI"
+
+#: src/LYOptions.c:2168
+msgid "ALWAYS ON"
+msgstr "SEMPRE ABILITATO"
+
+#: src/LYOptions.c:2180
+msgid "Numbers act as arrows"
+msgstr "I tasti numerici fungono da frecce"
+
+#: src/LYOptions.c:2182
+msgid "Links are numbered"
+msgstr "I collegamenti sono numerati"
+
+#: src/LYOptions.c:2185
+msgid "Links and form fields are numbered"
+msgstr "I collegamenti e i campi dei moduli sono numerati"
+
+#: src/LYOptions.c:2188
+msgid "Form fields are numbered"
+msgstr "I campi dei moduli sono numerati"
+
+#: src/LYOptions.c:2202
+msgid "Case insensitive"
+msgstr "Non distinguere fra maiuscolo e minuscolo"
+
+#: src/LYOptions.c:2203
+msgid "Case sensitive"
+msgstr "Distingui fra maiuscolo e minuscolo"
+
+#: src/LYOptions.c:2227
+msgid "prompt normally"
+msgstr "normalmente chiedi"
+
+#: src/LYOptions.c:2228
+msgid "force yes-response"
+msgstr "forza la risposta positiva"
+
+#: src/LYOptions.c:2229
+msgid "force no-response"
+msgstr "forza la risposta negativa"
+
+#: src/LYOptions.c:2247
+msgid "Novice"
+msgstr "Novizio"
+
+#: src/LYOptions.c:2248
+msgid "Intermediate"
+msgstr "Medio"
+
+#: src/LYOptions.c:2249
+msgid "Advanced"
+msgstr "Esperto"
+
+#: src/LYOptions.c:2258
+msgid "By First Visit"
+msgstr "Alla prima visita"
+
+#: src/LYOptions.c:2260
+msgid "By First Visit Reversed"
+msgstr "Alla prima visita invertita"
+
+#: src/LYOptions.c:2261
+msgid "As Visit Tree"
+msgstr "Come albero delle visite"
+
+#: src/LYOptions.c:2262
+msgid "By Last Visit"
+msgstr "All'ultima visita"
+
+#: src/LYOptions.c:2264
+msgid "By Last Visit Reversed"
+msgstr "All'ultima visita invertita"
+
+#. Old_DTD variable
+#: src/LYOptions.c:2275
+msgid "relaxed (TagSoup mode)"
+msgstr "meno rigida (modalità «TagSoup»)"
+
+#: src/LYOptions.c:2276
+msgid "strict (SortaSGML mode)"
+msgstr "rigida (modalità «SortaSGML»)"
+
+#: src/LYOptions.c:2283
+msgid "as labels"
+msgstr "come testi"
+
+#: src/LYOptions.c:2284
+msgid "as links"
+msgstr "come collegamenti"
+
+#: src/LYOptions.c:2291
+msgid "show filename"
+msgstr "mostra il nome del file"
+
+#: src/LYOptions.c:2302
+msgid "STANDARD"
+msgstr "NORMALE"
+
+#: src/LYOptions.c:2303
+msgid "ADVANCED"
+msgstr "AVANZATO"
+
+#: src/LYOptions.c:2335
+msgid "Directories first"
+msgstr "Prima le directory"
+
+#: src/LYOptions.c:2336
+msgid "Files first"
+msgstr "Prima i file"
+
+#: src/LYOptions.c:2337
+msgid "Mixed style"
+msgstr "Stile misto"
+
+#: src/LYOptions.c:2345 src/LYOptions.c:2365
+msgid "By Name"
+msgstr "Per nome"
+
+#: src/LYOptions.c:2346 src/LYOptions.c:2366
+msgid "By Type"
+msgstr "Per tipo"
+
+#: src/LYOptions.c:2347 src/LYOptions.c:2367
+msgid "By Size"
+msgstr "Per dimensione"
+
+#: src/LYOptions.c:2348 src/LYOptions.c:2368
+msgid "By Date"
+msgstr "Per data"
+
+#: src/LYOptions.c:2349
+msgid "By Mode"
+msgstr "Per modalità"
+
+#: src/LYOptions.c:2351
+msgid "By User"
+msgstr "Per utente"
+
+#: src/LYOptions.c:2352
+msgid "By Group"
+msgstr "Per gruppo"
+
+#: src/LYOptions.c:2377
+msgid "Do not show rate"
+msgstr "Non mostrare la velocità"
+
+#: src/LYOptions.c:2378 src/LYOptions.c:2379
+#, c-format
+msgid "Show %s/sec rate"
+msgstr "Mostra velocità %s/sec."
+
+#: src/LYOptions.c:2381 src/LYOptions.c:2382
+#, c-format
+msgid "Show %s/sec, ETA"
+msgstr "Mostra %s/sec., ETA"
+
+#: src/LYOptions.c:2385
+msgid "Show progressbar"
+msgstr "Mostra la barra di avanzamento"
+
+#: src/LYOptions.c:2397
+msgid "Accept lynx's internal types"
+msgstr "Accetta i tipi interni di Lynx"
+
+#: src/LYOptions.c:2398
+msgid "Also accept lynx.cfg's types"
+msgstr "Accetta anche i tipi lynx.cfg"
+
+#: src/LYOptions.c:2399
+msgid "Also accept user's types"
+msgstr "Accetta anche i tipi dell'utente"
+
+#: src/LYOptions.c:2400
+msgid "Also accept system's types"
+msgstr "Accetta anche i tipi di sistema"
+
+#: src/LYOptions.c:2401
+msgid "Accept all types"
+msgstr "Accetta tutti i tipi"
+
+#: src/LYOptions.c:2410
+msgid "gzip"
+msgstr "gzip"
+
+#: src/LYOptions.c:2411
+msgid "deflate"
+msgstr "decomprimi"
+
+#: src/LYOptions.c:2414
+msgid "compress"
+msgstr "comprimi"
+
+#: src/LYOptions.c:2417
+msgid "bzip2"
+msgstr "bzip2"
+
+#: src/LYOptions.c:2419
+msgid "All"
+msgstr "Tutti"
+
+#: src/LYOptions.c:2687 src/LYOptions.c:2711
+#, c-format
+msgid "Use %s to invoke the Options menu!"
+msgstr "Usare %s per richiamare il menù delle opzioni."
+
+#: src/LYOptions.c:3500
+msgid "(options marked with (!) will not be saved)"
+msgstr "(le opzioni marcate con (!) non saranno salvate)"
+
+#: src/LYOptions.c:3508
+msgid "General Preferences"
+msgstr "Preferenze generali"
+
+#. ***************************************************************
+#. User Mode: SELECT
+#: src/LYOptions.c:3512
+msgid "User mode"
+msgstr "Modalità utente"
+
+#. Editor: INPUT
+#: src/LYOptions.c:3518
+msgid "Editor"
+msgstr "Editor"
+
+#. Search Type: SELECT
+#: src/LYOptions.c:3523
+msgid "Type of Search"
+msgstr "Tipo di ricerca"
+
+#: src/LYOptions.c:3528
+msgid "Security and Privacy"
+msgstr "Sicurezza e riservatezza"
+
+#. ***************************************************************
+#. Cookies: SELECT
+#: src/LYOptions.c:3532
+msgid "Cookies"
+msgstr "Cookie"
+
+#. Cookie Prompting: SELECT
+#: src/LYOptions.c:3546
+msgid "Invalid-Cookie Prompting"
+msgstr "Dialogo per i cookie non valido"
+
+#. SSL Prompting: SELECT
+#: src/LYOptions.c:3553
+msgid "SSL Prompting"
+msgstr "Dialogo SSL"
+
+#: src/LYOptions.c:3559
+msgid "Keyboard Input"
+msgstr "Immissione da tastiera"
+
+#. ***************************************************************
+#. Keypad Mode: SELECT
+#: src/LYOptions.c:3563
+msgid "Keypad mode"
+msgstr "Modalità tastierino numerico"
+
+#. Emacs keys: ON/OFF
+#: src/LYOptions.c:3569
+msgid "Emacs keys"
+msgstr "Tasti Emacs"
+
+#. VI Keys: ON/OFF
+#: src/LYOptions.c:3575
+msgid "VI keys"
+msgstr "Tasti VI"
+
+#. Line edit style: SELECT
+#. well, at least 2 line edit styles available
+#: src/LYOptions.c:3582
+msgid "Line edit style"
+msgstr "Stile di elaborazione riga"
+
+#. Keyboard layout: SELECT
+#: src/LYOptions.c:3594
+msgid "Keyboard layout"
+msgstr "Mappatura della tastiera"
+
+#.
+#. * Display and Character Set
+#.
+#: src/LYOptions.c:3608
+msgid "Display and Character Set"
+msgstr "Visualizzazione e set di caratteri"
+
+#. Use locale-based character set: ON/OFF
+#: src/LYOptions.c:3613
+msgid "Use locale-based character set"
+msgstr "Usa il set di caratteri basato sulla localizzazione"
+
+#. Display Character Set: SELECT
+#: src/LYOptions.c:3622
+msgid "Display character set"
+msgstr "Mostra il set di caratteri"
+
+#: src/LYOptions.c:3653
+msgid "Assumed document character set"
+msgstr "Set di caratteri presunto dei documenti"
+
+#.
+#. * Since CJK people hardly mixed with other world
+#. * we split the header to make it more readable:
+#. * "CJK mode" for CJK display charsets, and "Raw 8-bit" for others.
+#.
+#: src/LYOptions.c:3673
+msgid "CJK mode"
+msgstr "Modalità CJK"
+
+#: src/LYOptions.c:3675
+msgid "Raw 8-bit"
+msgstr "Non convertito (raw 8-bit)"
+
+#. X Display: INPUT
+#: src/LYOptions.c:3683
+msgid "X Display"
+msgstr "Schermo di X"
+
+#.
+#. * Document Appearance
+#.
+#: src/LYOptions.c:3689
+msgid "Document Appearance"
+msgstr "Aspetto del documento"
+
+#: src/LYOptions.c:3695
+msgid "Show color"
+msgstr "Mostra i colori"
+
+#. Show cursor: ON/OFF
+#: src/LYOptions.c:3719
+msgid "Show cursor"
+msgstr "Mostra il cursore"
+
+#. Underline links: ON/OFF
+#: src/LYOptions.c:3725
+msgid "Underline links"
+msgstr "Sottolinea i collegamenti"
+
+#. Show scrollbar: ON/OFF
+#: src/LYOptions.c:3732
+msgid "Show scrollbar"
+msgstr "Mostra la barra di scorrimento"
+
+#. Select Popups: ON/OFF
+#: src/LYOptions.c:3739
+msgid "Popups for select fields"
+msgstr "Menù a comparsa per i campi «select»"
+
+#. HTML error recovery: SELECT
+#: src/LYOptions.c:3745
+msgid "HTML error recovery"
+msgstr "Ripristina da errori HTML"
+
+#. Show Images: SELECT
+#: src/LYOptions.c:3751
+msgid "Show images"
+msgstr "Mostra le immagini"
+
+#. Verbose Images: ON/OFF
+#: src/LYOptions.c:3765
+msgid "Verbose images"
+msgstr "Immagini prolisse"
+
+#.
+#. * Headers Transferred to Remote Servers
+#.
+#: src/LYOptions.c:3773
+msgid "Headers Transferred to Remote Servers"
+msgstr "Le intestazioni vengono trasmesse ai server remoti"
+
+#. ***************************************************************
+#. Mail Address: INPUT
+#: src/LYOptions.c:3777
+msgid "Personal mail address"
+msgstr "Indirizzo personale di posta elettronica"
+
+#: src/LYOptions.c:3783
+msgid "Password for anonymous ftp"
+msgstr "Password per FTP anonimo"
+
+#. Preferred media type: SELECT
+#: src/LYOptions.c:3789
+msgid "Preferred media type"
+msgstr "Tipo di media preferito"
+
+#. Preferred encoding: SELECT
+#: src/LYOptions.c:3795
+msgid "Preferred encoding"
+msgstr "Codifica preferita"
+
+#. Preferred Document Character Set: INPUT
+#: src/LYOptions.c:3801
+msgid "Preferred document character set"
+msgstr "Set di caratteri preferito per i documenti"
+
+#. Preferred Document Language: INPUT
+#: src/LYOptions.c:3806
+msgid "Preferred document language"
+msgstr "Lingua preferita per i documenti"
+
+#: src/LYOptions.c:3812
+msgid "User-Agent header"
+msgstr "Intestazione «User-Agent»"
+
+#.
+#. * Listing and Accessing Files
+#.
+#: src/LYOptions.c:3820
+msgid "Listing and Accessing Files"
+msgstr "Elencazione e accesso ai file"
+
+#. FTP sort: SELECT
+#: src/LYOptions.c:3825
+msgid "Use Passive FTP"
+msgstr "Usa FTP passivo"
+
+#. FTP sort: SELECT
+#: src/LYOptions.c:3831
+msgid "FTP sort criteria"
+msgstr "Criterio di ordinamento FTP"
+
+#. Local Directory Sort: SELECT
+#: src/LYOptions.c:3839
+msgid "Local directory sort criteria"
+msgstr "Criterio di ordinamento delle directory locali"
+
+#. Local Directory Order: SELECT
+#: src/LYOptions.c:3845
+msgid "Local directory sort order"
+msgstr "Ordinamento delle directory locali"
+
+#: src/LYOptions.c:3854
+msgid "Show dot files"
+msgstr "Mostra i file nascosti"
+
+#: src/LYOptions.c:3862
+msgid "Execution links"
+msgstr "Collegamenti per l'esecuzione"
+
+#: src/LYOptions.c:3880
+msgid "Pause when showing message"
+msgstr ""
+
+#. Show transfer rate: SELECT
+#: src/LYOptions.c:3887
+msgid "Show transfer rate"
+msgstr "Mostra la velocità di trasferimento"
+
+#.
+#. * Special Files and Screens
+#.
+#: src/LYOptions.c:3907
+msgid "Special Files and Screens"
+msgstr "File e schermate speciali"
+
+#: src/LYOptions.c:3912
+msgid "Multi-bookmarks"
+msgstr "Segnalibri multipli"
+
+#: src/LYOptions.c:3920
+msgid "Review/edit Bookmarks files"
+msgstr "Revisione/modifica dei file dei segnalibri"
+
+#: src/LYOptions.c:3923
+msgid "Goto multi-bookmark menu"
+msgstr "Andare al menù dei segnalibri multipli"
+
+#: src/LYOptions.c:3925
+msgid "Bookmarks file"
+msgstr "File dei segnalibri"
+
+#. Auto Session: ON/OFF
+#: src/LYOptions.c:3932
+msgid "Auto Session"
+msgstr "Sessione automatica"
+
+#. Session File Menu: INPUT
+#: src/LYOptions.c:3938
+msgid "Session file"
+msgstr "File della sessione"
+
+#. Visited Pages: SELECT
+#: src/LYOptions.c:3944
+msgid "Visited Pages"
+msgstr "Pagine visitate"
+
+#: src/LYOptions.c:3949
+msgid "View the file "
+msgstr "Visualizza il file "
+
+#: src/LYPrint.c:937
+#, c-format
+msgid " Print job complete.\n"
+msgstr " Stampa completata.\n"
+
+#: src/LYPrint.c:1262
+msgid "Document:"
+msgstr "Documento:"
+
+#: src/LYPrint.c:1263
+msgid "Number of lines:"
+msgstr "Numero di righe:"
+
+#: src/LYPrint.c:1264
+msgid "Number of pages:"
+msgstr "Numero di pagine:"
+
+#: src/LYPrint.c:1265
+msgid "pages"
+msgstr "pagine"
+
+#: src/LYPrint.c:1265
+msgid "page"
+msgstr "pagina"
+
+#: src/LYPrint.c:1266
+msgid "(approximately)"
+msgstr "(approssimativamente)"
+
+#: src/LYPrint.c:1273
+msgid "Some print functions have been disabled!"
+msgstr "Alcune funzionalità di stampa sono state disabilitate."
+
+#: src/LYPrint.c:1277
+msgid "Standard print options:"
+msgstr "Opzioni di stampa predefinite:"
+
+#: src/LYPrint.c:1278
+msgid "Print options:"
+msgstr "Opzioni di stampa:"
+
+#: src/LYPrint.c:1285
+msgid "Save to a local file"
+msgstr "Salvare in un file locale"
+
+#: src/LYPrint.c:1287
+msgid "Save to disk disabled"
+msgstr "Salvataggio su disco disabilitato"
+
+#: src/LYPrint.c:1294
+msgid "Mail the file"
+msgstr "Invia il file tramite posta elettronica"
+
+#: src/LYPrint.c:1301
+msgid "Print to the screen"
+msgstr "Stampa sullo schermo"
+
+#: src/LYPrint.c:1306
+msgid "Print out on a printer attached to your vt100 terminal"
+msgstr "Stampa su una stampante collegata al terminale vt100"
+
+#: src/LYReadCFG.c:371
+#, c-format
+msgid ""
+"Syntax Error parsing COLOR in configuration file:\n"
+"The line must be of the form:\n"
+"COLOR:INTEGER:FOREGROUND:BACKGROUND\n"
+"\n"
+"Here FOREGROUND and BACKGROUND must be one of:\n"
+"The special strings 'nocolor' or 'default', or\n"
+msgstr ""
+"Errore di sintassi durante l'analisi di COLOR nel file di configurazione:\n"
+"la riga deve essere del formato:\n"
+"COLOR:INTERO:PRIMOPIANO:SFONDO\n"
+"\n"
+"Dove PRIMOPIANO e SFONDO devono essere uno fra:\n"
+"i termini speciali «nocolor» o «default», o\n"
+
+#: src/LYReadCFG.c:384
+msgid "Offending line:"
+msgstr "Riga erronea:"
+
+#: src/LYReadCFG.c:681
+#, c-format
+msgid "key remapping of %s to %s for %s failed\n"
+msgstr "cambiamento del tasto da %s a %s per %s fallito\n"
+
+#: src/LYReadCFG.c:688
+#, c-format
+msgid "key remapping of %s to %s failed\n"
+msgstr "cambiamento del tasto da %s a %s fallito\n"
+
+#: src/LYReadCFG.c:709
+#, c-format
+msgid "invalid line-editor selection %s for key %s, selecting all\n"
+msgstr "selezione «line-editor» %s per il tasto %s non valida, seleziono tutto\n"
+
+#: src/LYReadCFG.c:734 src/LYReadCFG.c:746
+#, c-format
+msgid "setting of line-editor binding for key %s (0x%x) to 0x%x for %s failed\n"
+msgstr "impostazione dell'associazione «line-editor» per il tasto %s (0x%x) a 0x%x per %s fallita.\n"
+
+#: src/LYReadCFG.c:750
+#, c-format
+msgid "setting of line-editor binding for key %s (0x%x) for %s failed\n"
+msgstr "impostazione dell'associazione «line-editor» per il tasto %s (0x%x) per %s fallita.\n"
+
+#: src/LYReadCFG.c:846
+#, c-format
+msgid "Lynx: cannot start, CERN rules file %s is not available\n"
+msgstr "Lynx: impossibile iniziare. File di regole CERN %s non disponibile\n"
+
+#: src/LYReadCFG.c:847
+msgid "(no name)"
+msgstr "(nessun nome)"
+
+#: src/LYReadCFG.c:1883
+#, c-format
+msgid "More than %d nested lynx.cfg includes -- perhaps there is a loop?!?\n"
+msgstr "Oltre %d inclusioni annidate in lynx.cfg. Controllare se c'è un circolo vizioso.\n"
+
+#: src/LYReadCFG.c:1885
+#, c-format
+msgid "Last attempted include was '%s',\n"
+msgstr "L'ultima inclusione tentata era «%s»,\n"
+
+#: src/LYReadCFG.c:1886
+#, c-format
+msgid "included from '%s'.\n"
+msgstr "incluso da «%s».\n"
+
+#: src/LYReadCFG.c:2290 src/LYReadCFG.c:2303 src/LYReadCFG.c:2361
+msgid "The following is read from your lynx.cfg file."
+msgstr "Quanto segue è tratto dal file lynx.cfg."
+
+#: src/LYReadCFG.c:2291 src/LYReadCFG.c:2304
+msgid "Please read the distribution"
+msgstr "Consultare la distribuzione"
+
+#: src/LYReadCFG.c:2297 src/LYReadCFG.c:2307
+msgid "for more comments."
+msgstr "per ulteriori commenti."
+
+#: src/LYReadCFG.c:2343
+msgid "RELOAD THE CHANGES"
+msgstr "RICARICARE LE MODIFICHE"
+
+#: src/LYReadCFG.c:2351
+msgid "Your primary configuration"
+msgstr "Configurazione principale"
+
+#: src/LYShowInfo.c:177
+msgid "Directory that you are currently viewing"
+msgstr "Directory attualmente visualizzata"
+
+#: src/LYShowInfo.c:180
+msgid "Name:"
+msgstr "Nome:"
+
+#: src/LYShowInfo.c:183
+msgid "URL:"
+msgstr "URL:"
+
+#: src/LYShowInfo.c:197
+msgid "Directory that you have currently selected"
+msgstr "Directory attualmente selezionata"
+
+#: src/LYShowInfo.c:199
+msgid "File that you have currently selected"
+msgstr "File attualmente selezionato"
+
+#: src/LYShowInfo.c:202
+msgid "Symbolic link that you have currently selected"
+msgstr "Collegamento simbolico attualmente selezionato"
+
+#: src/LYShowInfo.c:205
+msgid "Item that you have currently selected"
+msgstr "Voce attualmente selezionata"
+
+#: src/LYShowInfo.c:207
+msgid "Full name:"
+msgstr "Nome completo:"
+
+#: src/LYShowInfo.c:217
+msgid "Unable to follow link"
+msgstr "Impossibile seguire il collegamento"
+
+#: src/LYShowInfo.c:219
+msgid "Points to file:"
+msgstr "Punta al file:"
+
+#: src/LYShowInfo.c:224
+msgid "Name of owner:"
+msgstr "Nome del proprietario:"
+
+#: src/LYShowInfo.c:227
+msgid "Group name:"
+msgstr "Nome del gruppo:"
+
+#: src/LYShowInfo.c:229
+msgid "File size:"
+msgstr "Dimensione del file:"
+
+#: src/LYShowInfo.c:231
+msgid "(bytes)"
+msgstr "(byte)"
+
+#.
+#. * Include date and time information.
+#.
+#: src/LYShowInfo.c:236
+msgid "Creation date:"
+msgstr "Data di creazione:"
+
+#: src/LYShowInfo.c:239
+msgid "Last modified:"
+msgstr "Ultima modifica:"
+
+#: src/LYShowInfo.c:242
+msgid "Last accessed:"
+msgstr "Ultimo accesso:"
+
+#: src/LYShowInfo.c:248
+msgid "Access Permissions"
+msgstr "Diritti di accesso"
+
+#: src/LYShowInfo.c:283
+msgid "Group:"
+msgstr "Gruppo"
+
+#: src/LYShowInfo.c:303
+msgid "World:"
+msgstr "Mondo:"
+
+#: src/LYShowInfo.c:310
+msgid "File that you are currently viewing"
+msgstr "File attualmente visualizzato"
+
+#: src/LYShowInfo.c:318 src/LYShowInfo.c:422
+msgid "Linkname:"
+msgstr "Nome del collegamento:"
+
+#: src/LYShowInfo.c:324 src/LYShowInfo.c:339
+msgid "Charset:"
+msgstr "Set di caratteri:"
+
+#: src/LYShowInfo.c:338
+msgid "(assumed)"
+msgstr "(presunto)"
+
+#: src/LYShowInfo.c:345
+msgid "Server:"
+msgstr "Server:"
+
+#: src/LYShowInfo.c:348
+msgid "Date:"
+msgstr "Data:"
+
+#: src/LYShowInfo.c:351
+msgid "Last Mod:"
+msgstr "Ultima modifica:"
+
+#: src/LYShowInfo.c:356
+msgid "Expires:"
+msgstr "Scadenza:"
+
+#: src/LYShowInfo.c:359
+msgid "Cache-Control:"
+msgstr "Controllo della cache:"
+
+#: src/LYShowInfo.c:362
+msgid "Content-Length:"
+msgstr "Lunghezza del contenuto:"
+
+#: src/LYShowInfo.c:366
+msgid "Length:"
+msgstr "Lunghezza:"
+
+#: src/LYShowInfo.c:371
+msgid "Language:"
+msgstr "Lingua:"
+
+#: src/LYShowInfo.c:378
+msgid "Post Data:"
+msgstr "Dati POST:"
+
+#: src/LYShowInfo.c:381
+msgid "Post Content Type:"
+msgstr "Tipo di contenuto POST:"
+
+#: src/LYShowInfo.c:384
+msgid "Owner(s):"
+msgstr "Proprietari:"
+
+#: src/LYShowInfo.c:389
+msgid "size:"
+msgstr "dimensione:"
+
+#: src/LYShowInfo.c:391
+msgid "lines"
+msgstr "righe"
+
+#: src/LYShowInfo.c:395
+msgid "forms mode"
+msgstr "tipo di modulo"
+
+#: src/LYShowInfo.c:397
+msgid "source"
+msgstr "origine"
+
+#: src/LYShowInfo.c:398
+msgid "normal"
+msgstr "normale"
+
+#: src/LYShowInfo.c:400
+msgid ", safe"
+msgstr ", protetto"
+
+#: src/LYShowInfo.c:402
+msgid ", via internal link"
+msgstr ", tramite collegamento interno"
+
+#: src/LYShowInfo.c:407
+msgid ", no-cache"
+msgstr ", nessuna cache"
+
+#: src/LYShowInfo.c:409
+msgid ", ISMAP script"
+msgstr ", script ISMAP"
+
+#: src/LYShowInfo.c:411
+msgid ", bookmark file"
+msgstr ", file dei segnalibri"
+
+#: src/LYShowInfo.c:415
+msgid "mode:"
+msgstr "modalità:"
+
+#: src/LYShowInfo.c:421
+msgid "Link that you currently have selected"
+msgstr "Collegamento attualmente selezionato"
+
+#: src/LYShowInfo.c:430
+msgid "Method:"
+msgstr "Metodo:"
+
+#: src/LYShowInfo.c:434
+msgid "Enctype:"
+msgstr "Tpo di codifica:"
+
+#: src/LYShowInfo.c:440
+msgid "Action:"
+msgstr "Azione:"
+
+#: src/LYShowInfo.c:446
+msgid "(Form field)"
+msgstr "(Campo del modulo)"
+
+#: src/LYShowInfo.c:457
+msgid "No Links on the current page"
+msgstr "Nessun collegamento nella pagina attuale"
+
+#: src/LYShowInfo.c:463
+msgid "Server Headers:"
+msgstr "Intestazioni del server:"
+
+#: src/LYStyle.c:312
+#, c-format
+msgid ""
+"Syntax Error parsing style in lss file:\n"
+"[%s]\n"
+"The line must be of the form:\n"
+"OBJECT:MONO:COLOR (ie em:bold:brightblue:white)\n"
+"where OBJECT is one of EM,STRONG,B,I,U,BLINK etc.\n"
+"\n"
+msgstr ""
+"Errore di sintassi durante l'analisi di stile nel file lss:\n"
+"[%s]\n"
+"La riga deve essere del tipo:\n"
+"OGGETTO:MONO:COLORE (es. em:bold:brightblue:white)\n"
+"dove OGGETTO è un elemento fra EM, STRONG, B, I, U, BLINK, ecc.\n"
+"\n"
+
+#: src/LYTraversal.c:111
+msgid "here is a list of the history stack so that you may rebuild"
+msgstr "ecco un elenco della cronologia per poter ricostruire"
+
+#: src/LYUpload.c:75
+msgid "ERROR! - upload command is misconfigured"
+msgstr "ERRORE: comando di caricamento configurato male"
+
+#: src/LYUpload.c:96
+msgid "Illegal redirection \"../\" found! Request ignored."
+msgstr "Trovato reindirizzamento illecito «../». Richiesta ignorata."
+
+#: src/LYUpload.c:99
+msgid "Illegal character \"/\" found! Request ignored."
+msgstr " Trovato carattere illecito «/». Richiesta ignorata."
+
+#: src/LYUpload.c:102
+msgid "Illegal redirection using \"~\" found! Request ignored."
+msgstr "Reindirizzamento illecito nell'uso di «~». Richiesta ignorata."
+
+#: src/LYUpload.c:159
+msgid "Unable to upload file."
+msgstr "Impossibile caricare il file."
+
+#: src/LYUpload.c:201
+msgid "Upload To:"
+msgstr "Caricare su:"
+
+#: src/LYUpload.c:202
+msgid "Upload options:"
+msgstr "Opzioni di caricamento:"
+
+#: src/LYUtils.c:1882
+msgid "Download document URL put to clipboard."
+msgstr "Scarica l'URL del documento nel blocco appunti del sistema."
+
+#: src/LYUtils.c:2666
+msgid "Unexpected access protocol for this URL scheme."
+msgstr "Protocollo di accesso inatteso per questo schema di URL."
+
+#: src/LYUtils.c:3474
+msgid "Too many tempfiles"
+msgstr "Troppi file temporanei"
+
+#: src/LYUtils.c:3774
+msgid "unknown restriction"
+msgstr "restrizione sconosciuta"
+
+#: src/LYUtils.c:3805
+#, c-format
+msgid "No restrictions set.\n"
+msgstr "Nessuna restrizione impostata.\n"
+
+#: src/LYUtils.c:3808
+#, c-format
+msgid "Restrictions set:\n"
+msgstr "Restrizioni impostate:\n"
+
+#: src/LYUtils.c:5186
+msgid "Cannot find HOME directory"
+msgstr "Impossibile trovare la directory HOME"
+
+#: src/LYrcFile.c:16
+msgid "Normally disabled. See ENABLE_LYNXRC in lynx.cfg\n"
+msgstr "Normalmente disattivato. Vedere «ENABLE_LYNXRC» in lynx.cfg\n"
+
+#: src/LYrcFile.c:317
+msgid ""
+"accept_all_cookies allows the user to tell Lynx to automatically\n"
+"accept all cookies if desired. The default is \"FALSE\" which will\n"
+"prompt for each cookie. Set accept_all_cookies to \"TRUE\" to accept\n"
+"all cookies.\n"
+msgstr ""
+"«accept_all_cookies» permette di impostare Lynx in modo che accetti\n"
+"automaticamente tutti i cookie, se si desidera. La condizione predefinita\n"
+"è «FALSE», per cui è chiesto il consenso per ogni cookie. Impostare\n"
+"«accept_all_cookies» a «TRUE» per accettare tutti i cookie.\n"
+
+#: src/LYrcFile.c:325
+msgid ""
+"anonftp_password allows the user to tell Lynx to use the personal\n"
+"email address as the password for anonymous ftp. If no value is given,\n"
+"Lynx will use the personal email address. Set anonftp_password\n"
+"to a different value if you choose.\n"
+msgstr ""
+"«anonftp_password» permette di impostare Lnxy in modo che usi l'indirizzo\n"
+"personale di posta elettronica come password per l'FTP anonimo. Se non è inserito\n"
+"alcun valore, verrà utilizzato l'indirizzo personale di posta elettronica. Se si\n"
+"desidera, è possibile impostare «anonftp_password» a un valore diverso.\n"
+
+#: src/LYrcFile.c:332
+msgid ""
+"bookmark_file specifies the name and location of the default bookmark\n"
+"file into which the user can paste links for easy access at a later\n"
+"date.\n"
+msgstr ""
+"«bookmark_file» indica il nome e la posizione del file dei segnalibri\n"
+"predefinito nel quale si possono copiare i collegamenti ai quali accedere\n"
+"rapidamente in un momento successivo.\n"
+
+#: src/LYrcFile.c:337
+msgid ""
+"If case_sensitive_searching is \"on\" then when the user invokes a search\n"
+"using the 's' or '/' keys, the search performed will be case sensitive\n"
+"instead of case INsensitive. The default is usually \"off\".\n"
+msgstr ""
+"Se «case_sensitive_searching» è impostato a «on», le ricerche richiamate con\n"
+"i tasti «s» o «/» distingueranno fra maiuscole e minuscole presenti nel\n"
+"documento. Il valore predefinito è «off» (insensibile a maiuscolo/minuscolo).\n"
+
+#: src/LYrcFile.c:342
+msgid ""
+"The character_set definition controls the representation of 8 bit\n"
+"characters for your terminal. If 8 bit characters do not show up\n"
+"correctly on your screen you may try changing to a different 8 bit\n"
+"set or using the 7 bit character approximations.\n"
+"Current valid characters sets are:\n"
+msgstr ""
+"Il parametro «character_set» determina la rappresentazione dei caratteri a\n"
+"8 bit per il terminale usato. Se i caratteri non vengono visualizzati\n"
+"correttamente sullo schermo, si può provare un diverso set di caratteri a\n"
+"8 bit, oppure si possono utilizzare le approssimazioni a 7 bit.\n"
+"I set di caratteri attualmente validi sono:\n"
+
+#: src/LYrcFile.c:349
+msgid ""
+"cookie_accept_domains and cookie_reject_domains are comma-delimited\n"
+"lists of domains from which Lynx should automatically accept or reject\n"
+"all cookies. If a domain is specified in both options, rejection will\n"
+"take precedence. The accept_all_cookies parameter will override any\n"
+"settings made here.\n"
+msgstr ""
+"«cookie_accept_domains» e «cookie_reject_domains» sono elenchi di domini,\n"
+"separati da virgole, dai quali si vuole che vengano accettati o respinti\n"
+"automaticamente tutti i cookie. Se un dominio è indicato in entrambi gli\n"
+"elenchi, il rifiuto avrà la priorità. Il parametro «accept_all_cookies»\n"
+"sovrascrive qualunque impostazione fatta con queste due opzioni.\n"
+
+#: src/LYrcFile.c:357
+msgid ""
+"cookie_file specifies the file from which to read persistent cookies.\n"
+"The default is ~/"
+msgstr ""
+"«cookie_file» indica il file da cui leggere i cookie permanenti.\n"
+"Il valore predefinito è ~/"
+
+#: src/LYrcFile.c:362
+msgid ""
+"cookie_loose_invalid_domains, cookie_strict_invalid_domains, and\n"
+"cookie_query_invalid_domains are comma-delimited lists of which domains\n"
+"should be subjected to varying degrees of validity checking. If a\n"
+"domain is set to strict checking, strict conformance to RFC2109 will\n"
+"be applied. A domain with loose checking will be allowed to set cookies\n"
+"with an invalid path or domain attribute. All domains will default to\n"
+"querying the user for an invalid path or domain.\n"
+msgstr ""
+"«cookie_loose_invalid_domains», «cookie_strict_invalid_domains» e\n"
+"«cookie_query_invalid_domains» sono elenchi di domini, separati da virgole,\n"
+"per i quali il controllo di validità può variare. Se un dominio è soggetto\n"
+"a un controllo «strict» verrà adottata una rigorosa conformità con la\n"
+"RFC2109. A un dominio con verifica «loose» verrà consentito di presentare\n"
+"cookie con attributi path o domain non validi. Per ogni dominio la condizione\n"
+"predefinita è di interpellare l'utente in caso di path o dominio non valido.\n"
+
+#: src/LYrcFile.c:376
+msgid ""
+"dir_list_order specifies the directory list order under DIRED_SUPPORT\n"
+"(if implemented). The default is \"ORDER_BY_NAME\"\n"
+msgstr ""
+"«dir_list_order» specifica l'ordinamento dell'elenco delle directory in «DIRED_SUPPORT»\n"
+"(se implementato). Il valore predefinito è «ORDER_BY_NAME»\n"
+
+#: src/LYrcFile.c:381
+msgid ""
+"dir_list_styles specifies the directory list style under DIRED_SUPPORT\n"
+"(if implemented). The default is \"MIXED_STYLE\", which sorts both\n"
+"files and directories together. \"FILES_FIRST\" lists files first and\n"
+"\"DIRECTORIES_FIRST\" lists directories first.\n"
+msgstr ""
+"«dir_list_styles» specifica lo stile degli elenchi delle directory sotto\n"
+"«DIRED_SUPPORT» (se implementato). Il valore predefinito è «MIXED_STYLE»,\n"
+"che ordina file e directory insieme. «FILES_FIRST» elenca per primi i file,\n"
+"mentre «DIRECTORIES_FIRST» elenca per prime le directory.\n"
+
+#: src/LYrcFile.c:389
+msgid ""
+"If emacs_keys is to \"on\" then the normal EMACS movement keys:\n"
+" ^N = down ^P = up\n"
+" ^B = left ^F = right\n"
+"will be enabled.\n"
+msgstr ""
+"Se «emacs_keys» è impostato a «on», i normali tasti di movimento di EMACS:\n"
+" ^N = giù ^P = su\n"
+" ^B = sinistra ^F = destra\n"
+"saranno abilitati.\n"
+
+#: src/LYrcFile.c:395
+msgid ""
+"file_editor specifies the editor to be invoked when editing local files\n"
+"or sending mail. If no editor is specified, then file editing is disabled\n"
+"unless it is activated from the command line, and the built-in line editor\n"
+"will be used for sending mail.\n"
+msgstr ""
+"«file_editor» indica l'editor da richiamare per l'elaborazione di file locali o\n"
+"per l'invio di posta elettronica. Se non è specificato nessuno, l'elaborazione dei\n"
+"file è disabilitata, a meno che non venga attivata da riga di comando, e viene\n"
+"usato l'editor di riga incorporato per la preparazione dei messaggi di posta.\n"
+
+#: src/LYrcFile.c:402
+msgid ""
+"The file_sorting_method specifies which value to sort on when viewing\n"
+"file lists such as FTP directories. The options are:\n"
+" BY_FILENAME -- sorts on the name of the file\n"
+" BY_TYPE -- sorts on the type of the file\n"
+" BY_SIZE -- sorts on the size of the file\n"
+" BY_DATE -- sorts on the date of the file\n"
+msgstr ""
+"Il metodo «file_sorting_method» indica il valore su cui eseguire l'ordinamento durante\n"
+"la consultazione di elenchi di file, quali le directory FTP. Le opzioni sono:\n"
+" BY_FILENAME -- ordina in base al nome del file\n"
+" BY_TYPE -- ordina in base al tipo di file\n"
+" BY_SIZE -- ordina in base alla dimensione dei file\n"
+" BY_DATE -- ordina in base alla data dei file\n"
+
+#: src/LYrcFile.c:424
+msgid ""
+"lineedit_mode specifies the key binding used for inputting strings in\n"
+"prompts and forms. If lineedit_mode is set to \"Default Binding\" then\n"
+"the following control characters are used for moving and deleting:\n"
+"\n"
+" Prev Next Enter = Accept input\n"
+" Move char: <- -> ^G = Cancel input\n"
+" Move word: ^P ^N ^U = Erase line\n"
+" Delete char: ^H ^R ^A = Beginning of line\n"
+" Delete word: ^B ^F ^E = End of line\n"
+"\n"
+"Current lineedit modes are:\n"
+msgstr ""
+"«lineedit_mode» specifica l'associazione dei tasti da utilizzare per\n"
+"immettere le sequenze di caratteri nei moduli e nelle richieste.\n"
+"Se impostato a «Default Binding», i caratteri di controllo seguenti\n"
+"verranno usati per gli spostamenti e le cancellazioni:\n"
+"\n"
+" Prec Succ Invio = Accetta il dato\n"
+" Muovi carattere: <- -> ^G = Annulla immissione\n"
+" Muovi parola: ^P ^N ^U = Cancella riga\n"
+"Cancella carattere: ^H ^R ^A = Inizio riga\n"
+" Cancella parola: ^B ^F ^E = Fine riga\n"
+"\n"
+"I metodi attuali di modifica delle righe sono:\n"
+
+#: src/LYrcFile.c:442
+msgid ""
+"The following allow you to define sub-bookmark files and descriptions.\n"
+"The format is multi_bookmark<capital_letter>=<filename>,<description>\n"
+"Up to 26 bookmark files (for the English capital letters) are allowed.\n"
+"We start with \"multi_bookmarkB\" since 'A' is the default (see above).\n"
+msgstr ""
+"Quanto segue consente di definire file e descrizioni di sotto-segnalibri.\n"
+"Il formato è multi_bookmark<lettera_maiuscola>=<nomefile>,<descrizione>\n"
+"Sono consentiti fino a 26 file di segnalibri (per le 26 lettere maiuscole\n"
+"dell'alfabeto inglese). Si parte da «multi_bookmarkB», poiché «A» è il\n"
+"valore predefinito (vedi sopra).\n"
+
+#: src/LYrcFile.c:448
+msgid ""
+"personal_mail_address specifies your personal mail address. The\n"
+"address will be sent during HTTP file transfers for authorization and\n"
+"logging purposes, and for mailed comments.\n"
+"If you do not want this information given out, set the NO_FROM_HEADER\n"
+"to TRUE in lynx.cfg, or use the -nofrom command line switch. You also\n"
+"could leave this field blank, but then you won't have it included in\n"
+"your mailed comments.\n"
+msgstr ""
+"«personal_mail_address» indica l'indirizzo personale di posta elettronica che\n"
+"viene inviato durante i trasferimenti di file HTTP per l'autorizzazione e\n"
+"i registri, nonché per i commenti inviati.\n"
+"Se non si desidera fornire questa informazione, impostare «NO_FROM_HEADER»\n"
+"al valore «TRUE» in lynx.cfg, o usare l'opzione «-nofrom» nella riga di comando.\n"
+"Si potrebbe anche lasciar vuoto questo campo, ma in tal caso l'indirizzo\n"
+"non comparirebbe nei commenti inviati.\n"
+
+#: src/LYrcFile.c:457
+msgid ""
+"preferred_charset specifies the character set in MIME notation (e.g.,\n"
+"ISO-8859-2, ISO-8859-5) which Lynx will indicate you prefer in requests\n"
+"to http servers using an Accept-Charset header. The value should NOT\n"
+"include ISO-8859-1 or US-ASCII, since those values are always assumed\n"
+"by default. May be a comma-separated list.\n"
+"If a file in that character set is available, the server will send it.\n"
+"If no Accept-Charset header is present, the default is that any\n"
+"character set is acceptable. If an Accept-Charset header is present,\n"
+"and if the server cannot send a response which is acceptable\n"
+"according to the Accept-Charset header, then the server SHOULD send\n"
+"an error response, though the sending of an unacceptable response\n"
+"is also allowed.\n"
+msgstr ""
+"«preferred_charset» specifica il set di caratteri in notazione MIME (p.es.\n"
+"ISO-8859-2, ISO-8859-5) che Lynx indicherà come preferiti nelle richieste\n"
+"ai server http che accettano l'intestazione «Accept-Charset». Il valore NON deve\n"
+"includere ISO-8859-1 o US-ASCII, poiché che tali valori sono sempre assunti\n"
+"come predefiniti. Può essere un elenco separato da virgole.\n"
+"Il server invierà un file con quel set di caratteri, se è disponibile.\n"
+"In assenza dell'intestazione «Accept-Charset», il comportamento predefinito è\n"
+"che ogni set di caratteri è accettabile. Se c'è l'intestazione «Accept-Charset»,\n"
+"ma il server non è in grado di dare una risposta accettabile secondo tale\n"
+"intestazione, il server DOVREBBE ritornare un messaggio di errore, malgrado\n"
+"l'invio di una risposta inaccettabile sia ugualmente consentito.\n"
+
+#: src/LYrcFile.c:473
+msgid ""
+"preferred_language specifies the language in MIME notation (e.g., en,\n"
+"fr, may be a comma-separated list in decreasing preference)\n"
+"which Lynx will indicate you prefer in requests to http servers.\n"
+"If a file in that language is available, the server will send it.\n"
+"Otherwise, the server will send the file in its default language.\n"
+msgstr ""
+"«preferred_language» precisa la lingua in notazione MIME (p.es. «it» o «en»;\n"
+"può essere un elenco separato da virgole in ordine di preferenza decrescente)\n"
+"che Lynx indicherà come preferenza ai server http.\n"
+"Il server invierà un file in tale lingua, se è disponibile, altrimenti\n"
+"invierà il file nella sua lingua predefinita.\n"
+
+#: src/LYrcFile.c:484
+msgid ""
+"If run_all_execution_links is set \"on\" then all local execution links\n"
+"will be executed when they are selected.\n"
+"\n"
+"WARNING - This is potentially VERY dangerous. Since you may view\n"
+" information that is written by unknown and untrusted sources\n"
+" there exists the possibility that Trojan horse links could be\n"
+" written. Trojan horse links could be written to erase files\n"
+" or compromise security. This should only be set to \"on\" if\n"
+" you are viewing trusted source information.\n"
+msgstr ""
+"Se «run_all_execution_links» è impostato su «on», tutti i collegamenti eseguibili\n"
+"localmente saranno eseguiti quando verranno selezionati.\n"
+"\n"
+"ATTENZIONE: questo può essere MOLTO pericoloso. Poiché si può accedere a fonti\n"
+" sconosciute o non fidate, può accadere di registrare collegamenti che\n"
+" sono «cavalli di Troia». Tali collegamenti potrebbero essere prodotti\n"
+" con lo scopo di cancellare file o di compromettere la sicurezza.\n"
+" Questo parametro va impostato su «on» solo nel caso in cui si acceda\n"
+" esclusivamente a fonti completamente fidate.\n"
+
+#: src/LYrcFile.c:495
+msgid ""
+"If run_execution_links_on_local_files is set \"on\" then all local\n"
+"execution links that are found in LOCAL files will be executed when they\n"
+"are selected. This is different from run_all_execution_links in that\n"
+"only files that reside on the local system will have execution link\n"
+"permissions.\n"
+"\n"
+"WARNING - This is potentially dangerous. Since you may view\n"
+" information that is written by unknown and untrusted sources\n"
+" there exists the possibility that Trojan horse links could be\n"
+" written. Trojan horse links could be written to erase files\n"
+" or compromise security. This should only be set to \"on\" if\n"
+" you are viewing trusted source information.\n"
+msgstr ""
+"Se «run_execution_links_on_local_files» è impostato su «on», tutti i collegamenti\n"
+"eseguibili trovati nei file LOCALI verranno eseguiti quando verranno selezionati.\n"
+"Questo differisce da «run_all_execution_links» in quanto il permesso di\n"
+"esecuzione come collegamento verrà accordato soltanto ai file che si trovano\n"
+"nel sistema locale.\n"
+"\n"
+"ATTENZIONE: questo può essere pericoloso. Poiché si può accedere a fonti\n"
+" sconosciute o non fidate, può accadere di registrare collegamenti che\n"
+" sono «cavalli di Troia». Tali collegamenti potrebbero essere prodotti\n"
+" con lo scopo di cancellare file o di compromettere la sicurezza.\n"
+" Questo parametro va impostato su «on» solo nel caso in cui si acceda\n"
+" esclusivamente a fonti completamente fidate.\n"
+
+#: src/LYrcFile.c:513
+msgid ""
+"select_popups specifies whether the OPTIONs in a SELECT block which\n"
+"lacks a MULTIPLE attribute are presented as a vertical list of radio\n"
+"buttons or via a popup menu. Note that if the MULTIPLE attribute is\n"
+"present in the SELECT start tag, Lynx always will create a vertical list\n"
+"of checkboxes for the OPTIONs. A value of \"on\" will set popup menus\n"
+"as the default while a value of \"off\" will set use of radio boxes.\n"
+"The default can be overridden via the -popup command line toggle.\n"
+msgstr ""
+"«select_popups» specifica se le OPTION in un blocco SELECT privo dell'attributo\n"
+"MULTIPLE sono presentate come una lista verticale di pulsanti radio oppure\n"
+"mediante un menù a comparsa. Notare che se l'attributo MULTIPLE è presente\n"
+"nel comando iniziale SELECT, Lynx genera comunque una lista verticale di\n"
+"caselle di scelta per le OPTION. Il valore «on» imposta i menù a comparsa come\n"
+"predefiniti, mentre il valore «off» imposta l'uso dei pulsanti radio.\n"
+"Il valore predefinito può essere sovrascritto tramite l'istruzione «-popup» da\n"
+"riga di comando.\n"
+
+#: src/LYrcFile.c:523
+msgid ""
+"show_color specifies how to set the color mode at startup. A value of\n"
+"\"never\" will force color mode off (treat the terminal as monochrome)\n"
+"at startup even if the terminal appears to be color capable. A value of\n"
+"\"always\" will force color mode on even if the terminal appears to be\n"
+"monochrome, if this is supported by the library used to build lynx.\n"
+"A value of \"default\" will yield the behavior of assuming\n"
+"a monochrome terminal unless color capability is inferred at startup\n"
+"based on the terminal type, or the -color command line switch is used, or\n"
+"the COLORTERM environment variable is set. The default behavior always is\n"
+"used in anonymous accounts or if the \"option_save\" restriction is set.\n"
+"The effect of the saved value can be overridden via\n"
+"the -color and -nocolor command line switches.\n"
+"The mode set at startup can be changed via the \"show color\" option in\n"
+"the 'o'ptions menu. If the option settings are saved, the \"on\" and\n"
+"\"off\" \"show color\" settings will be treated as \"default\".\n"
+msgstr ""
+"«show_color» specifica come impostare i colori all'avvio. Il valore «never»\n"
+"forzerà l'esclusione dei colori (considerando il terminale come monocromatico)\n"
+"all'avvio, anche se il terminale è in grado di visualizzare i colori. Il valore\n"
+"«always» forzerà l'attivazione dei colori, anche se il terminale è monocromatico,\n"
+"se ciò è previsto dalla libreria usata per compilare Lynx.\n"
+"Il valore «default» presuppone che il terminale sia monocromatico, a meno che\n"
+"la capacità di visualizzare i colori venga dedotta all'avvio in base al tipo\n"
+"di terminale, o che sia indicata sulla riga di comando l'opzione «-color», o che\n"
+"sia impostata la variabile di ambiente COLORTERM. Il comportamento predefinito\n"
+"è sempre adottato in caso di connessione anonima o se è impostata la restrizione\n"
+"«option_save». L'effetto del valore registrato può essere sovrascritto tramite\n"
+"le opzioni «-color» e «-nocolor» dalla riga di comando.\n"
+"La modalità impostata all'avvio può essere cambiata nel menù 'o'pzioni agendo\n"
+"sulla voce «show color» (mostra i colori). Se le impostazioni vengono\n"
+"registrate, i valori «on» e «off» di tale voce sono trattati come «default».\n"
+
+#: src/LYrcFile.c:540
+msgid ""
+"show_cursor specifies whether to 'hide' the cursor to the right (and\n"
+"bottom, if possible) of the screen, or to place it to the left of the\n"
+"current link in documents, or current option in select popup windows.\n"
+"Positioning the cursor to the left of the current link or option is\n"
+"helpful for speech or braille interfaces, and when the terminal is\n"
+"one which does not distinguish the current link based on highlighting\n"
+"or color. A value of \"on\" will set positioning to the left as the\n"
+"default while a value of \"off\" will set 'hiding' of the cursor.\n"
+"The default can be overridden via the -show_cursor command line toggle.\n"
+msgstr ""
+"«show_cursor» specifica se il cursore deve essere \"nascosto\" alla destra (in fondo,\n"
+"se possibile) dello schermo, oppure se va posto alla sinistra del collegamento attuale\n"
+"nei documenti e dell'opzione attuale nelle finestre a comparsa di scelta.\n"
+"Il posizionamento del cursore alla sinistra del collegamento o dell'opzione attuale è\n"
+"utile per le interfacce in voce o tattili (braille) e quando il terminale non\n"
+"permette di distinguere il collegamento attivo in base alla brillantezza o al\n"
+"colore. Il valore «on» fissa il posizionamento alla sinistra come predefinito,\n"
+"mentre il valore «off» determina l'occultamento del cursore. Il valore\n"
+"predefinito può essere sovrascritto con l'opzione «-show_cursor» da riga di comando.\n"
+
+#: src/LYrcFile.c:551
+msgid ""
+"show_dotfiles specifies that the directory listing should include\n"
+"\"hidden\" (dot) files/directories. If set \"on\", this will be\n"
+"honored only if enabled via userdefs.h and/or lynx.cfg, and not\n"
+"restricted via a command line switch. If display of hidden files\n"
+"is disabled, creation of such files via Lynx also is disabled.\n"
+msgstr ""
+"«show_dotfiles» specifica che l'elenco delle directory deve includere\n"
+"file e directory nascosti. Se impostato su «on», ciò sarà rispettato\n"
+"solo se abilitato tramite userdefs.h o lynx.cfg e non ristretto da\n"
+"un'opzione dalla riga di comando. Se la visualizzazione dei file nascosti è\n"
+"disattivata, è disabilitata anche la creazione di tali file da parte di Lynx.\n"
+
+#: src/LYrcFile.c:562
+msgid ""
+"If sub_bookmarks is not turned \"off\", and multiple bookmarks have\n"
+"been defined (see below), then all bookmark operations will first\n"
+"prompt the user to select an active sub-bookmark file. If the default\n"
+"Lynx bookmark_file is defined (see above), it will be used as the\n"
+"default selection. When this option is set to \"advanced\", and the\n"
+"user mode is advanced, the 'v'iew bookmark command will invoke a\n"
+"statusline prompt instead of the menu seen in novice and intermediate\n"
+"user modes. When this option is set to \"standard\", the menu will be\n"
+"presented regardless of user mode.\n"
+msgstr ""
+"Se «sub_bookmarks» non è impostato su «off» e i segnalibri multipli sono\n"
+"stati definiti, (vedere più avanti), tutte le operazioni sui segnalibri\n"
+"inizieranno proponendo all'utente di scegliere un file di sotto-segnalibri\n"
+"attivo. Se è impostato il file predefinito (vedere sopra), questi sarà utilizzato\n"
+"come scelta predefinita. Quando questa opzione è impostata come «advanced» e la\n"
+"modalità d'uso è «esperto», il comando 'v'edi bookmark richiamerà una\n"
+"richiesta di riga di stato anziché il menù visibile nei modi «novizio»\n"
+"e «medio». Quando l'opzione è impostata su «standard», verrà presentato il\n"
+"menù indipendentemente dalla modalità d'uso.\n"
+
+#: src/LYrcFile.c:576
+msgid ""
+"user_mode specifies the users level of knowledge with Lynx. The\n"
+"default is \"NOVICE\" which displays two extra lines of help at the\n"
+"bottom of the screen to aid the user in learning the basic Lynx\n"
+"commands. Set user_mode to \"INTERMEDIATE\" to turn off the extra info.\n"
+"Use \"ADVANCED\" to see the URL of the currently selected link at the\n"
+"bottom of the screen.\n"
+msgstr ""
+"«user_mode» specifica il grado di conoscenza di Lynx da parte dell'utente.\n"
+"Il valore predefinito è «novizio», che mostra due righe di aiuto\n"
+"aggiuntive in fondo allo schermo per aiutare l'utente ad apprendere i\n"
+"comandi basilari di Lynx. Impostarlo a «medio» per togliere le informazioni\n"
+"supplementari. Usare la modalità «esperto» per vedere in fondo allo schermo\n"
+"l'URL del collegamento attualmente selezionato.\n"
+
+#: src/LYrcFile.c:585
+msgid ""
+"If verbose_images is \"on\", lynx will print the name of the image\n"
+"source file in place of [INLINE], [LINK] or [IMAGE]\n"
+"See also VERBOSE_IMAGES in lynx.cfg\n"
+msgstr ""
+"Se «verbose_images» è impostato su «on», Lynx visualizzerà il nome del file\n"
+"origine dell'immagine anziché [INLINE], [LINK] o [IMAGE].\n"
+"Vedere anche «VERBOSE_IMAGES» in lynx.cfg.\n"
+
+#: src/LYrcFile.c:590
+msgid ""
+"If vi_keys is set to \"on\", then the normal VI movement keys:\n"
+" j = down k = up\n"
+" h = left l = right\n"
+"will be enabled. These keys are only lower case.\n"
+"Capital 'H', 'J' and 'K will still activate help, jump shortcuts,\n"
+"and the keymap display, respectively.\n"
+msgstr ""
+"Se «vi_keys» è impostato su «on», allora i consueti tasti di movimento di VI:\n"
+" j = giù k = su\n"
+" h = sinistra l = destra\n"
+"verranno abilitati. Questi tasti sono unicamente in carattere minuscolo.\n"
+"Le maiuscole «H», «J» e «K» continuano a richiamare rispettivamente l'aiuto,\n"
+"le scorciatoie e la mappatura della tastiera.\n"
+
+#: src/LYrcFile.c:598
+msgid ""
+"The visited_links setting controls how Lynx organizes the information\n"
+"in the Visited Links Page.\n"
+msgstr ""
+"L'opzione «visited_links» determina il modo in cui Lynx organizza le\n"
+"informazioni nella pagina dei collegamenti visitati.\n"
+
+#: src/LYrcFile.c:820
+msgid ""
+"If keypad_mode is set to \"NUMBERS_AS_ARROWS\", then the numbers on\n"
+"your keypad when the numlock is on will act as arrow keys:\n"
+" 8 = Up Arrow\n"
+" 4 = Left Arrow 6 = Right Arrow\n"
+" 2 = Down Arrow\n"
+"and the corresponding keyboard numbers will act as arrow keys,\n"
+"regardless of whether numlock is on.\n"
+msgstr ""
+"Se keypad_mode è impostato su «NUMBERS_AS_ARROWS», i numeri del tastierino\n"
+"agiranno come le frecce, se «numlock» è acceso:\n"
+" 8 = freccia su\n"
+" 4 = freccia sinistra 6 = freccia destra\n"
+" 2 = freccia giù\n"
+"e i corrispondenti numeri della tastiera agiranno come le frecce,\n"
+"qualunque sia lo stato di «numlock».\n"
+
+#: src/LYrcFile.c:829
+msgid ""
+"If keypad_mode is set to \"LINKS_ARE_NUMBERED\", then numbers will\n"
+"appear next to each link and numbers are used to select links.\n"
+msgstr ""
+"Se «keypad_mode» è impostato su «LINKS_ARE_NUMBERED», a fianco di ciascun collegamento\n"
+"comparirà un numero e sanno usati i numeri per selezionare i collegamenti.\n"
+
+#: src/LYrcFile.c:833
+msgid ""
+"If keypad_mode is set to \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\", then\n"
+"numbers will appear next to each link and visible form input field.\n"
+"Numbers are used to select links, or to move the \"current link\" to a\n"
+"form input field or button. In addition, options in popup menus are\n"
+"indexed so that the user may type an option number to select an option in\n"
+"a popup menu, even if the option isn't visible on the screen. Reference\n"
+"lists and output from the list command also enumerate form inputs.\n"
+msgstr ""
+"Se «keypad_mode» è impostato su «LINKS_AND_FORM_FIELDS_ARE_NUMBERED» verranno inseriti\n"
+"dei numeri a fianco dei collegamenti e dei campi di immissione visibili nei moduli.\n"
+"I numeri saranno usati per scegliere i collegamenti o per spostare il «collegamento attuale»\n"
+"in un campo di immissione o in un pulsante. Inoltre le opzioni nei menù a comparsa vengono\n"
+"indicizzate, in modo che l'utente possa scrivere un numero per selezionare un'opzione in un\n"
+"menù di questo tipo, anche se l'opzione non è visibile sullo schermo. Gli elenchi di\n"
+"riferimenti e l'output del comando «list» enumerano anche i campi di immissione nei moduli.\n"
+
+#: src/LYrcFile.c:842
+msgid ""
+"NOTE: Some fixed format documents may look disfigured when\n"
+"\"LINKS_ARE_NUMBERED\" or \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\" are\n"
+"enabled.\n"
+msgstr ""
+"NOTA: alcuni documenti con formato fisso possono apparire sfigurati quando\n"
+"si usano i valori «LINKS_ARE_NUMBERED» o «LINKS_AND_FORM_FIELDS_ARE_NUMBERED».\n"
+
+#: src/LYrcFile.c:874
+msgid ""
+"Lynx User Defaults File\n"
+"\n"
+msgstr ""
+"File dei valori predefiniti dall'utente per Lynx.\n"
+"\n"
+
+#: src/LYrcFile.c:883
+msgid ""
+"This file contains options saved from the Lynx Options Screen (normally\n"
+"with the 'o' key). To save options with that screen, you must select the\n"
+"checkbox:\n"
+msgstr ""
+"Questo file contiene le impostazioni salvate nel menù delle opzioni di Lynx\n"
+"(di solito con il tasto «o»). Per salvare le opzioni con quella schermata si\n"
+"deve selezionare la casella di spunta:\n"
+
+#: src/LYrcFile.c:890
+msgid ""
+"You must then save the settings using the link on the line above the\n"
+"checkbox:\n"
+msgstr ""
+"Si dovranno poi salvare le impostazioni usando il collegamento nella riga\n"
+"sopra la casella di spunta:\n"
+
+#: src/LYrcFile.c:897
+msgid ""
+"You may also use the command-line option \"-forms_options\", which displays\n"
+"the simpler Options Menu instead. Save options with that using the '>' key.\n"
+"\n"
+msgstr ""
+"È anche possibile usare l'opzione da riga di comando «-forms_options», la quale\n"
+"mostra, invece, il menù delle opzioni semplificato. Le opzioni in tal caso verranno\n"
+"salvate usando il tasto«>».\n"
+"\n"
+
+#: src/LYrcFile.c:904
+msgid ""
+"This file contains options saved from the Lynx Options Screen (normally\n"
+"with the '>' key).\n"
+"\n"
+msgstr ""
+"Questo file contiene le opzioni salvate dalla schermata delle opzioni di Lynx\n"
+"(normalmente con il tasto «>»).\n"
+"\n"
+
+#: src/LYrcFile.c:911
+msgid ""
+"There is normally no need to edit this file manually, since the defaults\n"
+"here can be controlled from the Options Screen, and the next time options\n"
+"are saved from the Options Screen this file will be completely rewritten.\n"
+"You have been warned...\n"
+"\n"
+"If you are looking for the general configuration file - it is normally\n"
+"called \"lynx.cfg\". It has different content and a different format.\n"
+"It is not this file.\n"
+msgstr ""
+"Normalmente non vi è alcun bisogno di modificare manualmente questo file,\n"
+"poiché i valori predefiniti possono essere modificati nel menù delle opzioni e\n"
+"al prossimo salvataggio delle opzioni nella relativa schermata questo file\n"
+"verrà completamente riscritto. Tenerlo presente...\n"
+"\n"
+"Il file per la configurazione generale si chiama normalmente lynx.cfg e ha\n"
+"contenuto e formato diversi, non è questo file.\n"
diff --git a/po/ja.po b/po/ja.po
new file mode 100644
index 0000000..914bd8b
--- /dev/null
+++ b/po/ja.po
@@ -0,0 +1,6143 @@
+# Japanese messages for Lynx
+# Copyright (C) 2000 Free Software Foundation, Inc.
+# This file is distributed under the same license as the lynx package.
+# Masayuki Hatta <mhatta@po.airs.net>, 2000-2003.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: lynx 2.8.5pre9\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-09-21 16:20-0400\n"
+"PO-Revision-Date: 2003-04-19 20:40+0900\n"
+"Last-Translator: Masayuki Hatta <mhatta@po.airs.net>\n"
+"Language-Team: Japanese <translation-team-ja@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=EUC-JP\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. ******************************************************************
+#. * The following definitions are for status line prompts, messages, or
+#. * warnings issued by Lynx during program execution. You can modify
+#. * them to make them more appropriate for your site. We recommend that
+#. * you extend these definitions to other languages using the gettext
+#. * library. There are also scattered uses of 'gettext()' throughout the
+#. * Lynx source, covering all but those messages which (a) are used for
+#. * debugging (CTRACE) or (b) are constants used in interaction with
+#. * other programs.
+#. *
+#. * Links to collections of alternate definitions, developed by the Lynx
+#. * User Community, are maintained in Lynx links:
+#. *
+#. * http://www.subir.com/lynx.html
+#. *
+#. * See ABOUT-NLS and po/readme for details and location of contributed
+#. * translations. When no translation is available, the English default is
+#. * used.
+#.
+#: LYMessages.c:32
+#, c-format
+msgid "Alert!: %s"
+msgstr "·Ù¹ð!: %s"
+
+#: LYMessages.c:33
+msgid "Welcome"
+msgstr "¤è¤¦¤³¤½"
+
+#: LYMessages.c:34
+msgid "Are you sure you want to quit?"
+msgstr "ËÜÅö¤Ë½ªÎ»¤·¤Æ¤â¤è¤í¤·¤¤¤Ç¤¹¤«?"
+
+#: LYMessages.c:36
+msgid "Really exit from Lynx?"
+msgstr "ËÜÅö¤Ë Lynx ¤ò½ªÎ»¤·¤Þ¤¹¤«?"
+
+#: LYMessages.c:38
+msgid "Connection interrupted."
+msgstr "Àܳ¤¬ÃæÃǤµ¤ì¤Þ¤·¤¿¡£"
+
+#: LYMessages.c:39
+msgid "Data transfer interrupted."
+msgstr "¥Ç¡¼¥¿Å¾Á÷¤¬ÃæÃǤµ¤ì¤Þ¤·¤¿¡£"
+
+#: LYMessages.c:40
+msgid "Cancelled!!!"
+msgstr "¥­¥ã¥ó¥»¥ë¤µ¤ì¤Þ¤·¤¿!!!"
+
+#: LYMessages.c:41
+msgid "Cancelling!"
+msgstr "¥­¥ã¥ó¥»¥ë¤·¤Þ¤¹!"
+
+#: LYMessages.c:42
+msgid "Excellent!!!"
+msgstr "¤½¤¦Íè¤Ê¤¯¤Ã¤Á¤ã!!!"
+
+#: LYMessages.c:43
+msgid "OK"
+msgstr "OK"
+
+#: LYMessages.c:44
+msgid "Done!"
+msgstr "´°Î»!"
+
+#: LYMessages.c:45
+msgid "Bad request!"
+msgstr "̵¸ú¤Ê¥ê¥¯¥¨¥¹¥È¤Ç¤¹!"
+
+#: LYMessages.c:46
+msgid "previous"
+msgstr "Á°¤Î²èÌÌ"
+
+#: LYMessages.c:47
+msgid "next screen"
+msgstr "¼¡¤Î²èÌÌ"
+
+#: LYMessages.c:48
+msgid "HELP!"
+msgstr "¥Ø¥ë¥×!"
+
+#: LYMessages.c:49
+msgid ", help on "
+msgstr ", ¥Ø¥ë¥×¢ª"
+
+#. #define HELP
+#: LYMessages.c:51
+msgid "Commands: Use arrow keys to move, '?' for help, 'q' to quit, '<-' to go back."
+msgstr "¥³¥Þ¥ó¥É: [Ìð°õ¥­¡¼] °ÜÆ°¡¢[?] ¥Ø¥ë¥×¡¢[q] ½ªÎ»¡¢[¢«] Ìá¤ë"
+
+#. #define MOREHELP
+#: LYMessages.c:53
+msgid "-- press space for more, use arrow keys to move, '?' for help, 'q' to quit."
+msgstr "-- [¥¹¥Ú¡¼¥¹¥­¡¼] ¼¡¥Ú¡¼¥¸¤Ø [Ìð°õ¥­¡¼] °ÜÆ° [?] ¥Ø¥ë¥× [q] ½ªÎ»"
+
+#: LYMessages.c:54
+msgid "-- press space for next page --"
+msgstr "-- ¥¹¥Ú¡¼¥¹¥­¡¼¤Ç¼¡¤Î¥Ú¡¼¥¸ --"
+
+#: LYMessages.c:55
+msgid "URL too long"
+msgstr "URL ¤¬Ä¹¤¹¤®¤Þ¤¹"
+
+#. Inactive input fields, messages used with -tna option - kw
+#. #define FORM_LINK_TEXT_MESSAGE_INA
+#: LYMessages.c:61
+msgid "(Text entry field) Inactive. Press <return> to activate."
+msgstr "(¥Æ¥­¥¹¥ÈÆþÎÏ¥Õ¥£¡¼¥ë¥É) ¸½ºß̤ÁªÂò ¥ê¥¿¡¼¥ó¥­¡¼¤ÇÆþÎϳ«»Ï"
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_INA
+#: LYMessages.c:63
+msgid "(Textarea) Inactive. Press <return> to activate."
+msgstr "(¥Æ¥­¥¹¥È¥¨¥ê¥¢) ¸½ºß̤ÁªÂò ¥ê¥¿¡¼¥ó¥­¡¼¤ÇÆþÎϳ«»Ï"
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_INA_E
+#: LYMessages.c:65
+#, c-format
+msgid "(Textarea) Inactive. Press <return> to activate (%s for editor)."
+msgstr "(¥Æ¥­¥¹¥È¥¨¥ê¥¢) ̤ÁªÂò ¥ê¥¿¡¼¥ó¤ÇÆþÎϳ«»Ï (%s ¤Ç¥¨¥Ç¥£¥¿µ¯Æ°)"
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE_INA
+#: LYMessages.c:67
+msgid "(Form field) Inactive. Use <return> to edit."
+msgstr "(¥Õ¥©¡¼¥à¥Õ¥£¡¼¥ë¥É) ¸½ºß̤ÁªÂò ¥ê¥¿¡¼¥ó¥­¡¼¤ÇÊÔ½¸³«»Ï"
+
+#. #define FORM_TEXT_SUBMIT_MESSAGE_INA_X
+#: LYMessages.c:69
+#, c-format
+msgid "(Form field) Inactive. Use <return> to edit (%s to submit with no cache)."
+msgstr "(¥Õ¥©¡¼¥à¥Õ¥£¡¼¥ë¥É) ¸½ºß̤ÁªÂò ¥ê¥¿¡¼¥ó¤ÇÊÔ½¸³«»Ï (%s ¤Ï¥­¥ã¥Ã¥·¥å̵¸ú¤ÇÁ÷¿®)"
+
+#. #define FORM_TEXT_RESUBMIT_MESSAGE_INA
+#: LYMessages.c:71
+msgid "(Form field) Inactive. Press <return> to edit, press <return> twice to submit."
+msgstr "(¥Õ¥©¡¼¥à¥Õ¥£¡¼¥ë¥É) ¸½ºß̤ÁªÂò ¥ê¥¿¡¼¥ó¤ÇÊÔ½¸¡¢¥ê¥¿¡¼¥ó2²ó¤ÇÁ÷¿®"
+
+#. #define FORM_TEXT_SUBMIT_MAILTO_MSG_INA
+#: LYMessages.c:73
+msgid "(mailto form field) Inactive. Press <return> to change."
+msgstr "(mailto ¥Õ¥©¡¼¥à¥Õ¥£¡¼¥ë¥É) ¸½ºß̤ÁªÂò ¥ê¥¿¡¼¥ó¤ÇÊѹ¹"
+
+#. #define FORM_LINK_PASSWORD_MESSAGE_INA
+#: LYMessages.c:75
+msgid "(Password entry field) Inactive. Press <return> to activate."
+msgstr "(¥Ñ¥¹¥ï¡¼¥ÉÆþÎÏ¥Õ¥£¡¼¥ë¥É) ¸½ºß̤ÁªÂò ¥ê¥¿¡¼¥ó¥­¡¼¤ÇÆþÎϳ«»Ï"
+
+#. #define FORM_LINK_FILE_UNM_MSG
+#: LYMessages.c:78
+msgid "UNMODIFIABLE file entry field. Use UP or DOWN arrows or tab to move off."
+msgstr "Êѹ¹¤Ç¤­¤Ê¤¤¥Õ¥¡¥¤¥ëÆþÎÏ¥Õ¥£¡¼¥ë¥É [¢¬][¢­]¤«¥¿¥Ö¤Ç°ÜÆ°"
+
+#. #define FORM_LINK_FILE_MESSAGE
+#: LYMessages.c:80
+msgid "(File entry field) Enter filename. Use UP or DOWN arrows or tab to move off."
+msgstr "(¥Õ¥¡¥¤¥ëÆþÎÏ¥Õ¥£¡¼¥ë¥É) ¥Õ¥¡¥¤¥ë̾¤òÆþÎÏ [¢¬][¢­]¤«¥¿¥Ö¤Ç°ÜÆ°"
+
+#. #define FORM_LINK_TEXT_MESSAGE
+#: LYMessages.c:82
+msgid "(Text entry field) Enter text. Use UP or DOWN arrows or tab to move off."
+msgstr "(¥Æ¥­¥¹¥ÈÆþÎÏ¥Õ¥£¡¼¥ë¥É) ¥Æ¥­¥¹¥È¤òÆþÎÏ [¢¬][¢­] ¤È¥¿¥Ö¤Ç°ÜÆ°"
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE
+#: LYMessages.c:84
+msgid "(Textarea) Enter text. Use UP/DOWN arrows or TAB to move off."
+msgstr "(¥Æ¥­¥¹¥È¥¨¥ê¥¢) ¥Æ¥­¥¹¥È¤òÆþÎÏ [¢¬][¢­] ¤È¥¿¥Ö¤Ç°ÜÆ°"
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_E
+#: LYMessages.c:86
+#, c-format
+msgid "(Textarea) Enter text. Use UP/DOWN arrows or TAB to move off (%s for editor)."
+msgstr "(¥Æ¥­¥¹¥È¥¨¥ê¥¢) ¥Æ¥­¥¹¥È¤òÆþÎÏ [¢¬][¢­] ¤È¥¿¥Ö¤Ç°ÜÆ° (%s ¤Ç¥¨¥Ç¥£¥¿µ¯Æ°)"
+
+#. #define FORM_LINK_TEXT_UNM_MSG
+#: LYMessages.c:88
+msgid "UNMODIFIABLE form text field. Use UP or DOWN arrows or tab to move off."
+msgstr "Êѹ¹¤Ç¤­¤Ê¤¤¥Õ¥©¡¼¥à¥Æ¥­¥¹¥È¥Õ¥£¡¼¥ë¥É [¢¬][¢­]¤«¥¿¥Ö¤Ç°ÜÆ°"
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE
+#: LYMessages.c:90
+msgid "(Form field) Enter text. Use <return> to submit."
+msgstr "(¥Õ¥©¡¼¥à¥Õ¥£¡¼¥ë¥É) ¥Æ¥­¥¹¥È¤òÆþÎÏ ¥ê¥¿¡¼¥ó¥­¡¼¤ÇÁ÷¿®"
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE_X
+#: LYMessages.c:92
+#, c-format
+msgid "(Form field) Enter text. Use <return> to submit (%s for no cache)."
+msgstr "(¥Õ¥©¡¼¥à¥Õ¥£¡¼¥ë¥É) ¥Æ¥­¥¹¥È¤òÆþÎÏ ¥ê¥¿¡¼¥ó¥­¡¼¤ÇÁ÷¿® (%s ¤Ç¥­¥ã¥Ã¥·¥å̵¸ú)"
+
+#. #define FORM_LINK_TEXT_RESUBMIT_MESSAGE
+#: LYMessages.c:94
+msgid "(Form field) Enter text. Use <return> to submit, arrows or tab to move off."
+msgstr "(¥Õ¥©¡¼¥à¥Õ¥£¡¼¥ë¥É) ¥Æ¥­¥¹¥È¤òÆþÎÏ ¥ê¥¿¡¼¥ó¥­¡¼¤ÇÁ÷¿®¡¢Ìð°õ¥­¡¼¤«¥¿¥Ö¤Ç°ÜÆ°"
+
+#. #define FORM_LINK_TEXT_SUBMIT_UNM_MSG
+#: LYMessages.c:96
+msgid "UNMODIFIABLE form field. Use UP or DOWN arrows or tab to move off."
+msgstr "Êѹ¹¤Ç¤­¤Ê¤¤¥Õ¥©¡¼¥à¥Õ¥£¡¼¥ë¥É [¢¬][¢­]¤«¥¿¥Ö¤Ç°ÜÆ°"
+
+#. #define FORM_LINK_TEXT_SUBMIT_MAILTO_MSG
+#: LYMessages.c:98
+msgid "(mailto form field) Enter text. Use <return> to submit, arrows to move off."
+msgstr "(mailto ¥Õ¥©¡¼¥à¥Õ¥£¡¼¥ë¥É) ¥Æ¥­¥¹¥È¤òÆþÎÏ ¥ê¥¿¡¼¥ó¤ÇÁ÷¿®¡¢Ìð°õ¥­¡¼¤Ç°ÜÆ°"
+
+#. #define FORM_LINK_TEXT_SUBMIT_MAILTO_DIS_MSG
+#: LYMessages.c:100
+msgid "(mailto form field) Mail is disallowed so you cannot submit."
+msgstr "(mailto ¥Õ¥©¡¼¥à¥Õ¥£¡¼¥ë¥É) ¥á¡¼¥ë¤Ï¶Ø»ß¤µ¤ì¤Æ¤¤¤Þ¤¹¤Î¤ÇÁ÷¿®¤Ç¤­¤Þ¤»¤ó¡£"
+
+#. #define FORM_LINK_PASSWORD_MESSAGE
+#: LYMessages.c:102
+msgid "(Password entry field) Enter text. Use UP or DOWN arrows or tab to move off."
+msgstr "(¥Ñ¥¹¥ï¡¼¥ÉÆþÎÏ¥Õ¥£¡¼¥ë¥É) ¥Æ¥­¥¹¥È¤òÆþÎÏ [¢¬][¢­]¤«¥¿¥Ö¤Ç°ÜÆ°"
+
+#. #define FORM_LINK_PASSWORD_UNM_MSG
+#: LYMessages.c:104
+msgid "UNMODIFIABLE form password. Use UP or DOWN arrows or tab to move off."
+msgstr "Êѹ¹¤Ç¤­¤Ê¤¤¥Ñ¥¹¥ï¡¼¥É¥Õ¥©¡¼¥à [¢¬][¢­]¤«¥¿¥Ö¤Ç°ÜÆ°"
+
+#. #define FORM_LINK_CHECKBOX_MESSAGE
+#: LYMessages.c:106
+msgid "(Checkbox Field) Use right-arrow or <return> to toggle."
+msgstr "(¥Á¥§¥Ã¥¯¥Ü¥Ã¥¯¥¹) [¢ª] ¤«¥ê¥¿¡¼¥ó¥­¡¼¤Ç¥È¥°¥ëÊѹ¹"
+
+#. #define FORM_LINK_CHECKBOX_UNM_MSG
+#: LYMessages.c:108
+msgid "UNMODIFIABLE form checkbox. Use UP or DOWN arrows or tab to move off."
+msgstr "Êѹ¹¤Ç¤­¤Ê¤¤¥Õ¥©¡¼¥à¥Á¥§¥Ã¥¯¥Ü¥Ã¥¯¥¹ [¢¬][¢­]¤«¥¿¥Ö¤Ç°ÜÆ°"
+
+#. #define FORM_LINK_RADIO_MESSAGE
+#: LYMessages.c:110
+msgid "(Radio Button) Use right-arrow or <return> to toggle."
+msgstr "(¥é¥¸¥ª¥Ü¥¿¥ó) [¢ª] ¤«¥ê¥¿¡¼¥ó¥­¡¼¤Ç¥È¥°¥ëÁªÂò"
+
+#. #define FORM_LINK_RADIO_UNM_MSG
+#: LYMessages.c:112
+msgid "UNMODIFIABLE form radio button. Use UP or DOWN arrows or tab to move off."
+msgstr "Êѹ¹¤Ç¤­¤Ê¤¤¥Õ¥©¡¼¥à¥é¥¸¥ª¥Ü¥¿¥ó [¢¬][¢­]¤«¥¿¥Ö¤Ç°ÜÆ°"
+
+#. #define FORM_LINK_SUBMIT_PREFIX
+#: LYMessages.c:114
+msgid "Submit ('x' for no cache) to "
+msgstr "Á÷¿®([x] ¤Ç¥­¥ã¥Ã¥·¥å̵¸ú): "
+
+#. #define FORM_LINK_RESUBMIT_PREFIX
+#: LYMessages.c:116
+msgid "Submit to "
+msgstr "Á÷¿®ÂоÝ: "
+
+#. #define FORM_LINK_SUBMIT_MESSAGE
+#: LYMessages.c:118
+msgid "(Form submit button) Use right-arrow or <return> to submit ('x' for no cache)."
+msgstr "(¥Õ¥©¡¼¥àÁ÷¿®¥Ü¥¿¥ó) [¢ª] ¤«¥ê¥¿¡¼¥ó¥­¡¼¤ÇÁ÷¿® ([x] ¤Ç¥­¥ã¥Ã¥·¥å̵¸ú)"
+
+#. #define FORM_LINK_RESUBMIT_MESSAGE
+#: LYMessages.c:120
+msgid "(Form submit button) Use right-arrow or <return> to submit."
+msgstr "(¥Õ¥©¡¼¥àÁ÷¿®¥Ü¥¿¥ó) [¢ª] ¤«¥ê¥¿¡¼¥ó¥­¡¼¤ÇÁ÷¿®"
+
+#. #define FORM_LINK_SUBMIT_DIS_MSG
+#: LYMessages.c:122
+msgid "DISABLED form submit button. Use UP or DOWN arrows or tab to move off."
+msgstr "̵¸ú¤Ë¤µ¤ì¤¿Á÷¿®¥Ü¥¿¥ó [¢¬][¢­]¤«¥¿¥Ö¤Ç°ÜÆ°"
+
+#. #define FORM_LINK_SUBMIT_MAILTO_PREFIX
+#: LYMessages.c:124
+msgid "Submit mailto form to "
+msgstr "mailto ¥Õ¥©¡¼¥à¤ò°Ê²¼¤ËÁ÷¿®: "
+
+#. #define FORM_LINK_SUBMIT_MAILTO_MSG
+#: LYMessages.c:126
+msgid "(mailto form submit button) Use right-arrow or <return> to submit."
+msgstr "(mailto ¥Õ¥©¡¼¥àÁ÷¿®¥Ü¥¿¥ó) [¢ª]¤«¥ê¥¿¡¼¥ó¤ÇÁ÷¿®"
+
+#. #define FORM_LINK_SUBMIT_MAILTO_DIS_MSG
+#: LYMessages.c:128
+msgid "(mailto form submit button) Mail is disallowed so you cannot submit."
+msgstr "(mailto ¥Õ¥©¡¼¥àÁ÷¿®¥Ü¥¿¥ó) ¥á¡¼¥ë¤Ï¶Ø»ß¤µ¤ì¤Æ¤¤¤Þ¤¹¤Î¤ÇÁ÷¿®¤Ç¤­¤Þ¤»¤ó"
+
+#. #define FORM_LINK_RESET_MESSAGE
+#: LYMessages.c:130
+msgid "(Form reset button) Use right-arrow or <return> to reset form to defaults."
+msgstr "(¥Õ¥©¡¼¥à¥ê¥»¥Ã¥È¥Ü¥¿¥ó) [¢ª] ¤«¥ê¥¿¡¼¥ó¥­¡¼¤Ç¥Õ¥©¡¼¥àÆâÍƤò¥ê¥»¥Ã¥È"
+
+#. #define FORM_LINK_RESET_DIS_MSG
+#: LYMessages.c:132
+msgid "DISABLED form reset button. Use UP or DOWN arrows or tab to move off."
+msgstr "̵¸ú¤Ë¤µ¤ì¤¿¥Õ¥©¡¼¥à¥ê¥»¥Ã¥È¥Ü¥¿¥ó [¢¬][¢­]¤«¥¿¥Ö¤Ç°ÜÆ°"
+
+#. #define FORM_LINK_OPTION_LIST_MESSAGE
+#: LYMessages.c:134
+msgid "(Option list) Hit return and use arrow keys and return to select option."
+msgstr "(¥ª¥×¥·¥ç¥ó¥ê¥¹¥È) ¥ê¥¿¡¼¥ó¥­¡¼¤ò²¡¤·¡¢Ìð°õ¥­¡¼¤È¥ê¥¿¡¼¥ó¥­¡¼¤Ç°ìÍ÷¤«¤éÁªÂò"
+
+#. #define CHOICE_LIST_MESSAGE
+#: LYMessages.c:136
+msgid "(Choice list) Hit return and use arrow keys and return to select option."
+msgstr "(¥Á¥ç¥¤¥¹¥ê¥¹¥È) ¥ê¥¿¡¼¥ó¥­¡¼¤ò²¡¤·¡¢Ìð°õ¥­¡¼¤È¥ê¥¿¡¼¥ó¥­¡¼¤Ç°ìÍ÷¤«¤éÁªÂò"
+
+#. #define FORM_LINK_OPTION_LIST_UNM_MSG
+#: LYMessages.c:138
+msgid "UNMODIFIABLE option list. Use return or arrow keys to review or leave."
+msgstr "Êѹ¹¤Ç¤­¤Ê¤¤¥ª¥×¥·¥ç¥ó¥ê¥¹¥È¤Ç¤¹¡£¥ê¥¿¡¼¥ó¤«Ìð°õ¥­¡¼¤Ç±ÜÍ÷¤Þ¤¿¤Ï°ÜÆ°"
+
+#. #define CHOICE_LIST_UNM_MSG
+#: LYMessages.c:140
+msgid "UNMODIFIABLE choice list. Use return or arrow keys to review or leave."
+msgstr "Êѹ¹¤Ç¤­¤Ê¤¤ÁªÂò¥ê¥¹¥È¤Ç¤¹¡£¥ê¥¿¡¼¥ó¥­¡¼¤«Ìð°õ¥­¡¼¤Ç±ÜÍ÷¤Þ¤¿¤Ï°ÜÆ°"
+
+#: LYMessages.c:141
+msgid "Submitting form..."
+msgstr "¥Õ¥©¡¼¥à¤òÁ÷¿®¤·¤Æ¤¤¤Þ¤¹..."
+
+#: LYMessages.c:142
+msgid "Resetting form..."
+msgstr "¥Õ¥©¡¼¥à¤ò¥ê¥»¥Ã¥È¤·¤Æ¤¤¤Þ¤¹..."
+
+#. #define RELOADING_FORM
+#: LYMessages.c:144
+msgid "Reloading document. Any form entries will be lost!"
+msgstr "ʸ½ñ¤ÎºÆÆɤ߹þ¤ßÃæ¡£¥Õ¥©¡¼¥àÆâÍƤÏÁ´¤Æ¼º¤ï¤ì¤Þ¤¹!"
+
+#: LYMessages.c:145
+#, c-format
+msgid "Warning: Cannot transcode form data to charset %s!"
+msgstr "Ãí°Õ: ¥Õ¥©¡¼¥à¥Ç¡¼¥¿¤ò¥­¥ã¥é¥¯¥¿¥»¥Ã¥È %s ¤ËÊÑ´¹¤Ç¤­¤Þ¤»¤ó!"
+
+#. #define NORMAL_LINK_MESSAGE
+#: LYMessages.c:148
+msgid "(NORMAL LINK) Use right-arrow or <return> to activate."
+msgstr "(Ä̾ï¥ê¥ó¥¯) [¢ª] ¤«¥ê¥¿¡¼¥ó¥­¡¼¤ÇÁªÂò"
+
+#: LYMessages.c:149
+msgid "The resource requested is not available at this time."
+msgstr "¸½ºßÍ׵ᤵ¤ì¤¿¥ê¥½¡¼¥¹¤ÏÍøÍѤǤ­¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:150
+msgid "Enter Lynx keystroke command: "
+msgstr "Lynx ¤Î¥³¥Þ¥ó¥É¥­¡¼¤òÆþÎÏ: "
+
+#: LYMessages.c:151
+msgid "Looking up "
+msgstr "õº÷Ãæ: "
+
+#: LYMessages.c:152
+#, c-format
+msgid "Getting %s"
+msgstr "%s ¤ò¼èÆÀÃæ"
+
+#: LYMessages.c:153
+#, c-format
+msgid "Skipping %s"
+msgstr "%s ¤òÈô¤Ð¤·¤Þ¤¹"
+
+#: LYMessages.c:154
+#, c-format
+msgid "Using %s"
+msgstr "%s ¤ò»È¤¤¤Þ¤¹"
+
+#: LYMessages.c:155
+#, c-format
+msgid "Illegal URL: %s"
+msgstr "ÉÔÀµ¤Ê URL ¤Ç¤¹: %s"
+
+#: LYMessages.c:156
+#, c-format
+msgid "Badly formed address %s"
+msgstr "%s ¤Ï¥¢¥É¥ì¥¹¤È¤·¤Æ̵¸ú¤Ç¤¹"
+
+#: LYMessages.c:157
+#, c-format
+msgid "URL: %s"
+msgstr "URL: %s"
+
+#: LYMessages.c:158
+msgid "Unable to access WWW file!!!"
+msgstr "WWW ¥Õ¥¡¥¤¥ë¤Ë¥¢¥¯¥»¥¹¤Ç¤­¤Þ¤»¤ó!!!"
+
+#: LYMessages.c:159
+#, c-format
+msgid "This is a searchable index. Use %s to search."
+msgstr "¤³¤ì¤Ï¸¡º÷²Äǽ¤Ê¥¤¥ó¥Ç¥Ã¥¯¥¹¤Ç¤¹¡£%s ¤Ç¸¡º÷¤Ç¤­¤Þ¤¹¡£"
+
+#. #define WWW_INDEX_MORE_MESSAGE
+#: LYMessages.c:161
+#, c-format
+msgid "--More-- This is a searchable index. Use %s to search."
+msgstr "--³¤­¤¢¤ê-- ¤³¤ì¤Ï¸¡º÷²Äǽ¤Ê¥¤¥ó¥Ç¥Ã¥¯¥¹¤Ç¤¹¡£%s ¤Ç¸¡º÷¤Ç¤­¤Þ¤¹¡£"
+
+#: LYMessages.c:162
+msgid "You have entered an invalid link number."
+msgstr "ÉÔÀµ¤Ê¥ê¥ó¥¯Èֹ椬ÆþÎϤµ¤ì¤Þ¤·¤¿¡£"
+
+#. #define SOURCE_HELP
+#: LYMessages.c:164
+msgid "Currently viewing document source. Press '\\' to return to rendered version."
+msgstr "¸½ºßʸ½ñ¤Î¥½¡¼¥¹¤ò±ÜÍ÷Ãæ¤Ç¤¹¡£[\\] ¤ÇÄ̾ï²èÌ̤ËÌá¤ê¤Þ¤¹¡£"
+
+#. #define NOVICE_LINE_ONE
+#: LYMessages.c:166
+msgid " Arrow keys: Up and Down to move. Right to follow a link; Left to go back. \n"
+msgstr " Ìð°õ¥­¡¼: [¢¬][¢­]¤Ç°ÜÆ° [¢ª]¤Ç¥ê¥ó¥¯¤òé¤ë [¢«]¤Ç°ì¤ÄÌá¤ë \n"
+
+#. #define NOVICE_LINE_TWO
+#: LYMessages.c:168
+msgid " H)elp O)ptions P)rint G)o M)ain screen Q)uit /=search [delete]=history list \n"
+msgstr " [H]¥Ø¥ë¥×[o]ÀßÄê[p]°õºþ[g]°ÜÆ°[m]¥á¥¤¥ó²èÌÌ[q]½ªÎ» /=¸¡º÷ [BackSpace]=ÍúÎò \n"
+
+#. #define NOVICE_LINE_TWO_A
+#: LYMessages.c:170
+msgid " O)ther cmds H)elp K)eymap G)oto P)rint M)ain screen o)ptions Q)uit \n"
+msgstr " [o]¤½¤Î¾[H]¥Ø¥ë¥×[K]¥­¡¼ÇÛÃÖ[g]°ÜÆ°[p]°õºþ[m]¥á¥¤¥ó [o]¥ª¥×¥·¥ç¥ó [q]½ªÎ» \n"
+
+#. #define NOVICE_LINE_TWO_B
+#: LYMessages.c:172
+msgid " O)ther cmds B)ack E)dit D)ownload ^R)eload ^W)ipe screen search doc: / \n"
+msgstr " [o]¤½¤Î¾[b]Ìá¤ë[e]ÊÔ½¸[d]¥À¥¦¥ó¥í¡¼¥É [^R]ºÆÆɹþ[^W]¥¯¥ê¥¢ ʸ½ñ¸¡º÷: / \n"
+
+#. #define NOVICE_LINE_TWO_C
+#: LYMessages.c:174
+msgid "O)ther cmds C)omment History: <backspace> Bookmarks: V)iew, A)dd, R)emove \n"
+msgstr "[o]¤½¤Î¾[c]¥³¥á¥ó¥È ÍúÎò: [Backspace] ¥Ö¥Ã¥¯¥Þ¡¼¥¯: [v]±ÜÍ÷[a]ÄɲÃ[r]ºï½ü \n"
+
+#. #define FORM_NOVICELINE_ONE
+#: LYMessages.c:176
+msgid " Enter text into the field by typing on the keyboard "
+msgstr " ¥­¡¼¥Ü¡¼¥É¤ò¥¿¥¤¥×¤¹¤ë¤³¤È¤Ç¥Æ¥­¥¹¥È¤ò¥Õ¥£¡¼¥ë¥ÉÆâ¤ËÆþÎÏ"
+
+#. #define FORM_NOVICELINE_TWO
+#: LYMessages.c:178
+msgid " Ctrl-U to delete all text in field, [Backspace] to delete a character "
+msgstr " Ctrl-U ¤Ç¥Õ¥£¡¼¥ë¥ÉÆâ¤ÎÁ´¥Æ¥­¥¹¥È¤òºï½ü¡¢[Backspace] ¤Ç°ìʸ»úºï½ü "
+
+#. #define FORM_NOVICELINE_TWO_DELBL
+#: LYMessages.c:180
+msgid " Ctrl-U to delete text in field, [Backspace] to delete a character "
+msgstr " Ctrl-U ¤Ç¥Õ¥£¡¼¥ë¥ÉÆâ¤Î¥Æ¥­¥¹¥È¤òºï½ü¡¢[Backspace] ¤Ç°ìʸ»úºï½ü "
+
+#. #define FORM_NOVICELINE_TWO_VAR
+#: LYMessages.c:182
+#, c-format
+msgid " %s to delete all text in field, [Backspace] to delete a character "
+msgstr " %s ¤Ç¥Õ¥£¡¼¥ë¥ÉÆâ¤ÎÁ´¥Æ¥­¥¹¥È¤òºï½ü¡¢[Backspace] ¤Ç°ìʸ»úºï½ü "
+
+#. #define FORM_NOVICELINE_TWO_DELBL_VAR
+#: LYMessages.c:184
+#, c-format
+msgid " %s to delete text in field, [Backspace] to delete a character "
+msgstr " %s ¤Ç¥Õ¥£¡¼¥ë¥ÉÆâ¤Î¥Æ¥­¥¹¥È¤òºï½ü¡¢[Backspace] ¤Ç°ìʸ»úºï½ü "
+
+#. mailto
+#: LYMessages.c:187
+msgid "Malformed mailto form submission! Cancelled!"
+msgstr "ÉÔÀµ¤Ê mailto ¥Õ¥©¡¼¥àÁ÷¿®¤Ç¤¹! ¥­¥ã¥ó¥»¥ë¤µ¤ì¤Þ¤·¤¿!"
+
+#: LYMessages.c:188
+msgid "Warning! Control codes in mail address replaced by ?"
+msgstr "Ãí°Õ! ¥á¡¼¥ë¥¢¥É¥ì¥¹Ãæ¤Î¥³¥ó¥È¥í¡¼¥ë¥³¡¼¥É¤Ï ? ¤ÇÃÖ´¹¤µ¤ì¤Þ¤¹"
+
+#: LYMessages.c:189
+msgid "Mail disallowed! Cannot submit."
+msgstr "¥á¡¼¥ë¤Ï¶Ø»ß¤µ¤ì¤Æ¤¤¤Þ¤¹! Á÷¿®¤Ç¤­¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:190
+msgid "Mailto form submission failed!"
+msgstr "Mailto ¥Õ¥©¡¼¥à¤ÎÁ÷¿®¤Ë¼ºÇÔ¤·¤Þ¤·¤¿!"
+
+#: LYMessages.c:191
+msgid "Mailto form submission Cancelled!!!"
+msgstr "Mailto ¥Õ¥©¡¼¥à¤ÎÁ÷¿®¤¬¥­¥ã¥ó¥»¥ë¤µ¤ì¤Þ¤·¤¿!!!"
+
+#: LYMessages.c:192
+msgid "Sending form content..."
+msgstr "¥Õ¥©¡¼¥à¤ÎÆâÍƤòÁ÷¿®Ãæ..."
+
+#: LYMessages.c:193
+msgid "No email address is present in mailto URL!"
+msgstr "mailto URL ¤ËÅŻҥ᡼¥ë¥¢¥É¥ì¥¹¤¬»ØÄꤵ¤ì¤Æ¤¤¤Þ¤»¤ó!"
+
+#. #define MAILTO_URL_TEMPOPEN_FAILED
+#: LYMessages.c:195
+msgid "Unable to open temporary file for mailto URL!"
+msgstr "mailto URL ¤Î¤¿¤á¤Î°ì¼¡¥Õ¥¡¥¤¥ë¤¬³«¤±¤Þ¤»¤ó!"
+
+#. #define INC_ORIG_MSG_PROMPT
+#: LYMessages.c:197
+msgid "Do you wish to include the original message?"
+msgstr "¸µ¤Î¥á¥Ã¥»¡¼¥¸¤ò´Þ¤á¤Þ¤¹¤«?"
+
+#. #define INC_PREPARSED_MSG_PROMPT
+#: LYMessages.c:199
+msgid "Do you wish to include the preparsed source?"
+msgstr "²òÀϺѤߤΥ½¡¼¥¹¤ò´Þ¤á¤Þ¤¹¤«?"
+
+#. #define SPAWNING_EDITOR_FOR_MAIL
+#: LYMessages.c:201
+msgid "Spawning your selected editor to edit mail message"
+msgstr "¥á¡¼¥ëËÜʸ¤òÊÔ½¸¤¹¤ë¤¿¤á»ØÄê¤Î¥¨¥Ç¥£¥¿¤òµ¯Æ°¤·¤Æ¤¤¤Þ¤¹"
+
+#. #define ERROR_SPAWNING_EDITOR
+#: LYMessages.c:203
+msgid "Error spawning editor, check your editor definition in the options menu"
+msgstr "¥¨¥Ç¥£¥¿¤Îµ¯Æ°¤Ç¥¨¥é¡¼¤¬È¯À¸¤·¤Þ¤·¤¿¡£ÀßÄê¥á¥Ë¥å¡¼¤Î¥¨¥Ç¥£¥¿¤ÎÀßÄê¤ò³Î¤«¤á¤Æ²¼¤µ¤¤¡£"
+
+#: LYMessages.c:204
+msgid "Send this comment?"
+msgstr "¤³¤Î¥³¥á¥ó¥È¤òÁ÷¤ê¤Þ¤¹¤«?"
+
+#: LYMessages.c:205
+msgid "Send this message?"
+msgstr "¤³¤Î¥á¥Ã¥»¡¼¥¸¤òÁ÷¤ê¤Þ¤¹¤«?"
+
+#: LYMessages.c:206
+msgid "Sending your message..."
+msgstr "¥á¥Ã¥»¡¼¥¸¤òÁ÷¤Ã¤Æ¤¤¤Þ¤¹..."
+
+#: LYMessages.c:207
+msgid "Sending your comment:"
+msgstr "¥³¥á¥ó¥ÈÁ÷ÉÕÀè:"
+
+#. textarea
+#: LYMessages.c:210
+msgid "Not in a TEXTAREA; cannot use external editor."
+msgstr "¥Æ¥­¥¹¥È¥¨¥ê¥¢¤Ç¤Ï¤Ê¤¤¤Î¤Ç³°Éô¥¨¥Ç¥£¥¿¤Ï»È¤¨¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:211
+msgid "Not in a TEXTAREA; cannot use command."
+msgstr "¥Æ¥­¥¹¥È¥¨¥ê¥¢¤Ç¤Ï¤Ê¤¤¤Î¤Ç¥³¥Þ¥ó¥É¤Ï»È¤¨¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:213
+msgid "file: ACTIONs are disallowed!"
+msgstr "file: ACTION ¤Ïµö²Ä¤µ¤ì¤Æ¤¤¤Þ¤»¤ó!"
+
+#. #define FILE_SERVED_LINKS_DISALLOWED
+#: LYMessages.c:215
+msgid "file: URLs via served links are disallowed!"
+msgstr "file: Ä󶡤µ¤ì¤¿¥ê¥ó¥¯·Ðͳ¤Î URL ¤Ïǧ¤á¤é¤ì¤Æ¤¤¤Þ¤»¤ó!"
+
+#: LYMessages.c:216
+msgid "Access to local files denied."
+msgstr "¥í¡¼¥«¥ë¥Õ¥¡¥¤¥ë¤Ø¤Î¥¢¥¯¥»¥¹¤ÏµñÈݤµ¤ì¤Þ¤·¤¿¡£"
+
+#: LYMessages.c:217
+msgid "file: URLs via bookmarks are disallowed!"
+msgstr "file: ¥Ö¥Ã¥¯¥Þ¡¼¥¯·Ðͳ¤Î URL ¤Ïµö²Ä¤µ¤ì¤Æ¤¤¤Þ¤»¤ó!"
+
+#. #define SPECIAL_VIA_EXTERNAL_DISALLOWED
+#: LYMessages.c:219
+msgid "This special URL is not allowed in external documents!"
+msgstr "¤³¤ÎÆÃÊÌ¤Ê URL ¤Ï³°Éôʸ½ñÃæ¤Ç¤Ïǧ¤á¤é¤ì¤Æ¤¤¤Þ¤»¤ó!"
+
+#: LYMessages.c:220
+msgid "Press <return> to return to Lynx."
+msgstr "¥ê¥¿¡¼¥ó¥­¡¼¤Ç Lynx ¤ËÌá¤ê¤Þ¤¹¡£"
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:223
+msgid "Spawning DCL subprocess. Use 'logout' to return to Lynx.\n"
+msgstr "DCL ¥µ¥Ö¥×¥í¥»¥¹¤òµ¯Æ°¤·¤Æ¤¤¤Þ¤¹¡£'logout' ¤Ç Lynx ¤ËÌá¤ê¤Þ¤¹¡£\n"
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:227
+msgid "Type EXIT to return to Lynx.\n"
+msgstr "EXIT ¤È¥¿¥¤¥×¤¹¤ë¤È Lynx ¤ËÌá¤ê¤Þ¤¹¡£\n"
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:230
+msgid "Spawning your default shell. Use 'exit' to return to Lynx.\n"
+msgstr "¥Ç¥Õ¥©¥ë¥È¥·¥§¥ë¤òµ¯Æ°¤·¤Þ¤·¤¿¡£'exit' ¤Ç Lynx ¤ËÌá¤ê¤Þ¤¹¡£\n"
+
+#: LYMessages.c:233
+msgid "Spawning is currently disabled."
+msgstr "³°Éô¥³¥Þ¥ó¥Éµ¯Æ°¤Ï¸½ºß¤Ç¤­¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:234
+msgid "The 'd'ownload command is currently disabled."
+msgstr "¥À¥¦¥ó¥í¡¼¥É¥³¥Þ¥ó¥É [d] ¤Ï¸½ºßÍøÍѤǤ­¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:235
+msgid "You cannot download an input field."
+msgstr "ÆþÎÏ¥Õ¥£¡¼¥ë¥É¤ò¥À¥¦¥ó¥í¡¼¥É¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:236
+msgid "Form has a mailto action! Cannot download."
+msgstr "¥Õ¥©¡¼¥à¤Ë¤Ï mailto ¥¢¥¯¥·¥ç¥ó¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹! ¥À¥¦¥ó¥í¡¼¥É¤Ç¤­¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:237
+msgid "You cannot download a mailto: link."
+msgstr "mailto: ¥ê¥ó¥¯¤Ï¥À¥¦¥ó¥í¡¼¥É¤Ç¤­¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:238
+msgid "You cannot download cookies."
+msgstr "¥¯¥Ã¥­¡¼¤ò¥À¥¦¥ó¥í¡¼¥É¤Ç¤­¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:239
+msgid "You cannot download a printing option."
+msgstr "°õºþ¥ª¥×¥·¥ç¥ó¤ò¥À¥¦¥ó¥í¡¼¥É¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:240
+msgid "You cannot download an upload option."
+msgstr "¥¢¥Ã¥×¥í¡¼¥É¥ª¥×¥·¥ç¥ó¤ò¥À¥¦¥ó¥í¡¼¥É¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:241
+msgid "You cannot download an permit option."
+msgstr "µö²Ä¥ª¥×¥·¥ç¥ó¤ò¥À¥¦¥ó¥í¡¼¥É¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:242
+msgid "This special URL cannot be downloaded!"
+msgstr "¤³¤ÎÆüì¤Ê URL ¤Ï¥À¥¦¥ó¥í¡¼¥É¤Ç¤­¤Þ¤»¤ó!"
+
+#: LYMessages.c:243
+msgid "Nothing to download."
+msgstr "¥À¥¦¥ó¥í¡¼¥É¤¹¤ë¤â¤Î¤¬¤¢¤ê¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:244
+msgid "Trace ON!"
+msgstr "ÄÉÀ׳«»Ï!"
+
+#: LYMessages.c:245
+msgid "Trace OFF!"
+msgstr "ÄÉÀ×½ªÎ»!"
+
+#. #define CLICKABLE_IMAGES_ON
+#: LYMessages.c:247
+msgid "Links will be included for all images! Reloading..."
+msgstr "²èÁü¤¹¤Ù¤Æ¤Ø¤Î¥ê¥ó¥¯¤òɽ¼¨¤·¤Þ¤¹! ºÆÆɤ߹þ¤ßÃæ..."
+
+#. #define CLICKABLE_IMAGES_OFF
+#: LYMessages.c:249
+msgid "Standard image handling restored! Reloading..."
+msgstr "ɸ½àŪ¤Ê²èÁü¤Î¼è¤ê°·¤¤¤ËÌᤷ¤Þ¤¹! ºÆÆɤ߹þ¤ßÃæ..."
+
+#. #define PSEUDO_INLINE_ALTS_ON
+#: LYMessages.c:251
+msgid "Pseudo_ALTs will be inserted for inlines without ALT strings! Reloading..."
+msgstr "ALT »ØÄê¤Î̵¤¤¥¤¥ó¥é¥¤¥ó¤Ëµ¿»÷Ū ALT ¤òÁÞÆþ¤·¤Þ¤¹¡£ºÆÆɤ߹þ¤ßÃæ..."
+
+#. #define PSEUDO_INLINE_ALTS_OFF
+#: LYMessages.c:253
+msgid "Inlines without an ALT string specified will be ignored! Reloading..."
+msgstr "ALT »ØÄê¤Î̵¤¤¥¤¥ó¥é¥¤¥ó¤Ï̵»ë¤µ¤ì¤Þ¤¹! ºÆÆɤ߹þ¤ßÃæ..."
+
+#: LYMessages.c:254
+msgid "Raw 8-bit or CJK mode toggled OFF! Reloading..."
+msgstr "À¸ 8 ¥Ó¥Ã¥È / CJK ¥â¡¼¥É ¥È¥°¥ë¥ª¥Õ! ºÆÆɤ߹þ¤ßÃæ..."
+
+#: LYMessages.c:255
+msgid "Raw 8-bit or CJK mode toggled ON! Reloading..."
+msgstr "À¸ 8 ¥Ó¥Ã¥È / CJK ¥â¡¼¥É ¥È¥°¥ë¥ª¥ó! ºÆÆɤ߹þ¤ßÃæ..."
+
+#. #define HEAD_D_L_OR_CANCEL
+#: LYMessages.c:257
+msgid "Send HEAD request for D)ocument or L)ink, or C)ancel? (d,l,c): "
+msgstr "[d]ʸ½ñ ¤« [l]¥ê¥ó¥¯¤Ë HEAD ¥ê¥¯¥¨¥¹¥È¤òÁ÷¤ê¤Þ¤¹¤«? ([c]¥­¥ã¥ó¥»¥ë): "
+
+#. #define HEAD_D_OR_CANCEL
+#: LYMessages.c:259
+msgid "Send HEAD request for D)ocument, or C)ancel? (d,c): "
+msgstr "[d]ʸ½ñ ¤Ë HEAD ¥ê¥¯¥¨¥¹¥È¤òÁ÷¤ê¤Þ¤¹¤«? ([c]¥­¥ã¥ó¥»¥ë): "
+
+#: LYMessages.c:260
+msgid "Sorry, the document is not an http URL."
+msgstr "¤³¤Îʸ½ñ¤Ï http URL ¤Ç¤Ï¤Ê¤¤¤è¤¦¤Ç¤¹¡£"
+
+#: LYMessages.c:261
+msgid "Sorry, the link is not an http URL."
+msgstr "¤³¤Î¥ê¥ó¥¯¤Ï http URL ¤Ç¤Ï¤Ê¤¤¤è¤¦¤Ç¤¹¡£"
+
+#: LYMessages.c:262
+msgid "Sorry, the ACTION for this form is disabled."
+msgstr "¤³¤Î¥Õ¥©¡¼¥à¤Ø¤Î ACTION ¤Ï¤Ç¤­¤Þ¤»¤ó¡£"
+
+#. #define FORM_ACTION_NOT_HTTP_URL
+#: LYMessages.c:264
+msgid "Sorry, the ACTION for this form is not an http URL."
+msgstr "¤³¤Î¥Õ¥©¡¼¥à¤Ø¤Î ACTION ¤Ï http URL ¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:265
+msgid "Not an http URL or form ACTION!"
+msgstr "http URL ¤Ç¤â¥Õ¥©¡¼¥à ACTION ¤Ç¤â¤¢¤ê¤Þ¤»¤ó!"
+
+#: LYMessages.c:266
+msgid "This special URL cannot be a form ACTION!"
+msgstr "¤³¤ÎÆÃÊÌ¤Ê URL ¤Ï¥Õ¥©¡¼¥à ACTION ¤Ë¤Ï¤Ê¤êÆÀ¤Þ¤»¤ó!"
+
+#: LYMessages.c:267
+msgid "URL is not in starting realm!"
+msgstr "URL ¤¬³«»ÏÎΰè¤Ë¤¢¤ê¤Þ¤»¤ó!"
+
+#: LYMessages.c:268
+msgid "News posting is disabled!"
+msgstr "¥Ë¥å¡¼¥¹Åê¹Æ¤Ï¤Ç¤­¤Þ¤»¤ó!"
+
+#: LYMessages.c:269
+msgid "File management support is disabled!"
+msgstr "¥Õ¥¡¥¤¥ë´ÉÍý¥µ¥Ý¡¼¥È¤ÏÍøÍѤǤ­¤Þ¤»¤ó!"
+
+#: LYMessages.c:270
+msgid "No jump file is currently available."
+msgstr "¸½ºßÍøÍѲÄǽ¤Ê¥¸¥ã¥ó¥×¥Õ¥¡¥¤¥ë¤Ï¤¢¤ê¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:271
+msgid "Jump to (use '?' for list): "
+msgstr "¥¸¥ã¥ó¥×Àè ([?] ¤Ç°ìÍ÷): "
+
+#: LYMessages.c:272
+msgid "Jumping to a shortcut URL is disallowed!"
+msgstr "¥·¥ç¡¼¥È¥«¥Ã¥È URL ¤Ø¤Î¥¸¥ã¥ó¥×¤Ïµö²Ä¤µ¤ì¤Æ¤¤¤Þ¤»¤ó!"
+
+#: LYMessages.c:273
+msgid "Random URL is disallowed! Use a shortcut."
+msgstr "¥é¥ó¥À¥à URL ¤Ïµö²Ä¤µ¤ì¤Æ¤¤¤Þ¤»¤ó! ¥·¥ç¡¼¥È¥«¥Ã¥È¤ò»È¤Ã¤Æ¤¯¤À¤µ¤¤¡£"
+
+#: LYMessages.c:274
+msgid "No random URLs have been used thus far."
+msgstr "º£¤Þ¤Ç¤Î¤È¤³¤í¥é¥ó¥À¥à URL ¤Ï°ì¤Ä¤â»È¤ï¤ì¤Æ¤¤¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:275
+msgid "Bookmark features are currently disabled."
+msgstr "¥Ö¥Ã¥¯¥Þ¡¼¥¯µ¡Ç½¤Ï¸½ºßÍøÍѤǤ­¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:276
+msgid "Execution via bookmarks is disabled."
+msgstr "¥Ö¥Ã¥¯¥Þ¡¼¥¯¤«¤é¤Î¼Â¹Ô¤Ï¤Ç¤­¤Þ¤»¤ó¡£"
+
+#. #define BOOKMARK_FILE_NOT_DEFINED
+#: LYMessages.c:278
+#, c-format
+msgid "Bookmark file is not defined. Use %s to see options."
+msgstr "¥Ö¥Ã¥¯¥Þ¡¼¥¯¥Õ¥¡¥¤¥ë¤ÏÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£%s ¤Ç¥ª¥×¥·¥ç¥ó¤¬¸«¤é¤ì¤Þ¤¹¡£"
+
+#. #define NO_TEMP_FOR_HOTLIST
+#: LYMessages.c:280
+msgid "Unable to open tempfile for X Mosaic hotlist conversion."
+msgstr "X Mosaic ¥Û¥Ã¥È¥ê¥¹¥ÈÊÑ´¹ÍѤΰì»þ¥Õ¥¡¥¤¥ë¤¬³«¤±¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:281
+msgid "ERROR - unable to open bookmark file."
+msgstr "¥¨¥é¡¼ - ¥Ö¥Ã¥¯¥Þ¡¼¥¯¥Õ¥¡¥¤¥ë¤ò³«¤±¤Þ¤»¤ó¡£"
+
+#. #define BOOKMARK_OPEN_FAILED_FOR_DEL
+#: LYMessages.c:283
+msgid "Unable to open bookmark file for deletion of link."
+msgstr "¥ê¥ó¥¯¤òºï½ü¤¹¤ë¤Î¤Ë¥Ö¥Ã¥¯¥Þ¡¼¥¯¥Õ¥¡¥¤¥ë¤¬³«¤±¤Þ¤»¤ó¡£"
+
+#. #define BOOKSCRA_OPEN_FAILED_FOR_DEL
+#: LYMessages.c:285
+msgid "Unable to open scratch file for deletion of link."
+msgstr "¥ê¥ó¥¯¤òºï½ü¤¹¤ë¤Î¤Ë¥¹¥¯¥é¥Ã¥Á¥Õ¥¡¥¤¥ë¤¬³«¤±¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:287
+msgid "Error renaming scratch file."
+msgstr "¥¹¥¯¥é¥Ã¥Á¥Õ¥¡¥¤¥ë¤Î²þ̾»þ¤Ë¥¨¥é¡¼¤¬È¯À¸¤·¤Þ¤·¤¿¡£"
+
+#: LYMessages.c:289
+msgid "Error renaming temporary file."
+msgstr "°ì»þ¥Õ¥¡¥¤¥ë¤Î²þ̾»þ¤Ë¥¨¥é¡¼¤¬È¯À¸¤·¤Þ¤·¤¿¡£"
+
+#. #define BOOKTEMP_COPY_FAIL
+#: LYMessages.c:291
+msgid "Unable to copy temporary file for deletion of link."
+msgstr "¥ê¥ó¥¯ºï½ü¤Î¤¿¤á¤Ë¡¢°ì»þ¥Õ¥¡¥¤¥ë¤ò¥³¥Ô¡¼¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤»¤ó¡£"
+
+#. #define BOOKTEMP_REOPEN_FAIL_FOR_DEL
+#: LYMessages.c:293
+msgid "Unable to reopen temporary file for deletion of link."
+msgstr "¥ê¥ó¥¯ºï½ü¤Î¤¿¤á¤Ë¡¢°ì»þ¥Õ¥¡¥¤¥ë¤òºÆ¥ª¡¼¥×¥ó¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤»¤ó¡£"
+
+#. #define BOOKMARK_LINK_NOT_ONE_LINE
+#: LYMessages.c:296
+msgid "Link is not by itself all on one line in bookmark file."
+msgstr "¥ê¥ó¥¯¤¬¡¢¥Ö¥Ã¥¯¥Þ¡¼¥¯¥Õ¥¡¥¤¥ë¤Ë¤ª¤¤¤Æ¤½¤ì¤À¤±¤Ç°ì¹Ô¤Ë¤Þ¤È¤Þ¤Ã¤Æ¤¤¤Æ¤Ï¤¤¤±¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:297
+msgid "Bookmark deletion failed."
+msgstr "¥Ö¥Ã¥¯¥Þ¡¼¥¯ºï½ü¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡£"
+
+#. #define BOOKMARKS_NOT_TRAVERSED
+#: LYMessages.c:299
+msgid "Bookmark files cannot be traversed (only http URLs)."
+msgstr "¥Ö¥Ã¥¯¥Þ¡¼¥¯¥Õ¥¡¥¤¥ë¤Ï¥È¥é¥Ð¡¼¥¹¤Ç¤­¤Þ¤»¤ó (http URL ¤Î¤ß)¡£"
+
+#. #define BOOKMARKS_NOT_OPEN
+#: LYMessages.c:301
+msgid "Unable to open bookmark file, use 'a' to save a link first"
+msgstr "¥Ö¥Ã¥¯¥Þ¡¼¥¯¤ò³«¤±¤Þ¤»¤ó¡£ºÇ½é¤Ë [a] ¤Ç¥ê¥ó¥¯¤òÊݸ¤·¤Æ¤¯¤À¤µ¤¤¡£"
+
+#: LYMessages.c:302
+msgid "There are no links in this bookmark file!"
+msgstr "¤³¤Î¥Ö¥Ã¥¯¥Þ¡¼¥¯¥Õ¥¡¥¤¥ë¤Ë¤Ï°ì¤Ä¤â¥ê¥ó¥¯¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤»¤ó!"
+
+#. #define CACHE_D_OR_CANCEL
+#: LYMessages.c:304
+#, fuzzy
+msgid "D)elete cached document or C)ancel? (d,c): "
+msgstr "[d]ʸ½ñ ¤Ë HEAD ¥ê¥¯¥¨¥¹¥È¤òÁ÷¤ê¤Þ¤¹¤«? ([c]¥­¥ã¥ó¥»¥ë): "
+
+#. #define BOOK_D_L_OR_CANCEL
+#: LYMessages.c:306
+msgid "Save D)ocument or L)ink to bookmark file or C)ancel? (d,l,c): "
+msgstr "[d]ʸ½ñ [l]¥ê¥ó¥¯ ¤ò¥Ö¥Ã¥¯¥Þ¡¼¥¯¤ËÊݸ¤·¤Þ¤¹ ([c]¥­¥ã¥ó¥»¥ë): "
+
+#: LYMessages.c:307
+msgid "Save D)ocument to bookmark file or C)ancel? (d,c): "
+msgstr "[d]¤Çʸ½ñ¤ò¥Ö¥Ã¥¯¥Þ¡¼¥¯¥Õ¥¡¥¤¥ë¤ËÊݸ ([c]¥­¥ã¥ó¥»¥ë): "
+
+#: LYMessages.c:308
+msgid "Save L)ink to bookmark file or C)ancel? (l,c): "
+msgstr "[l]¤Ç¥ê¥ó¥¯¤ò¥Ö¥Ã¥¯¥Þ¡¼¥¯¥Õ¥¡¥¤¥ë¤ËÊݸ ([c]¥­¥ã¥ó¥»¥ë): "
+
+#. #define NOBOOK_POST_FORM
+#: LYMessages.c:310
+msgid "Documents from forms with POST content cannot be saved as bookmarks."
+msgstr "POST ¥³¥ó¥Æ¥ó¥È¤Î¥Õ¥©¡¼¥à¤«¤é¤Î¥É¥­¥å¥á¥ó¥È¤Ï¥Ö¥Ã¥¯¥Þ¡¼¥¯¤È¤·¤ÆÊݸ¤Ç¤­¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:311
+msgid "Cannot save form fields/links"
+msgstr "¥Õ¥©¡¼¥à¥Õ¥£¡¼¥ë¥É/¥ê¥ó¥¯¤ÏÊݸ¤Ç¤­¤Þ¤»¤ó"
+
+#. #define NOBOOK_HSML
+#: LYMessages.c:313
+msgid "History, showinfo, menu and list files cannot be saved as bookmarks."
+msgstr "ÍúÎò¤ä¾ðÊóɽ¼¨¡¢¥á¥Ë¥å¡¼¡¢¥Õ¥¡¥¤¥ë°ìÍ÷¤Ï¥Ö¥Ã¥¯¥Þ¡¼¥¯¤È¤·¤ÆÊݸ¤Ç¤­¤Þ¤»¤ó¡£"
+
+#. #define CONFIRM_BOOKMARK_DELETE
+#: LYMessages.c:315
+msgid "Do you really want to delete this link from your bookmark file?"
+msgstr "ËÜÅö¤Ë¤³¤Î¥ê¥ó¥¯¤ò¥Ö¥Ã¥¯¥Þ¡¼¥¯¤«¤éºï½ü¤·¤Æ¤è¤í¤·¤¤¤Ç¤¹¤«?"
+
+#: LYMessages.c:316
+msgid "Malformed address."
+msgstr "ÉÔÀµ¤Ê¥¢¥É¥ì¥¹¤Ç¤¹¡£"
+
+#. #define HISTORICAL_ON_MINIMAL_OFF
+#: LYMessages.c:318
+msgid "Historical comment parsing ON (Minimal is overridden)!"
+msgstr "ÀΤʤ¬¤é¤Î¥³¥á¥ó¥È²òÀÏ¥ª¥ó(ºÇ¾®¸Â¤Î²òÀϤè¤êÍ¥Àè)!"
+
+#. #define HISTORICAL_OFF_MINIMAL_ON
+#: LYMessages.c:320
+msgid "Historical comment parsing OFF (Minimal is in effect)!"
+msgstr "ÀΤʤ¬¤é¤Î¥³¥á¥ó¥È²òÀÏ¥ª¥Õ(ºÇ¾®¸Â¤Î²òÀϤ¬Í­¸ú)!"
+
+#. #define HISTORICAL_ON_VALID_OFF
+#: LYMessages.c:322
+msgid "Historical comment parsing ON (Valid is overridden)!"
+msgstr "ÀΤʤ¬¤é¤Î¥³¥á¥ó¥È²òÀÏ¥ª¥ó(¸·Ì©¤Ê²òÀϤè¤êÍ¥Àè)!"
+
+#. #define HISTORICAL_OFF_VALID_ON
+#: LYMessages.c:324
+msgid "Historical comment parsing OFF (Valid is in effect)!"
+msgstr "ÀΤʤ¬¤é¤Î¥³¥á¥ó¥È²òÀÏ¥ª¥Õ(¸·Ì©¤Ê²òÀϤ¬Í­¸ú)!"
+
+#. #define MINIMAL_ON_IN_EFFECT
+#: LYMessages.c:326
+msgid "Minimal comment parsing ON (and in effect)!"
+msgstr "ºÇ¾®¸Â¤Î¥³¥á¥ó¥È²òÀÏ¥ª¥ó(¤«¤ÄÍ­¸ú)!"
+
+#. #define MINIMAL_OFF_VALID_ON
+#: LYMessages.c:328
+msgid "Minimal comment parsing OFF (Valid is in effect)!"
+msgstr "ºÇ¾®¸Â¤Î¥³¥á¥ó¥È²òÀÏ¥ª¥Õ(¸·Ì©¤Ê²òÀϤ¬Í­¸ú)!"
+
+#. #define MINIMAL_ON_BUT_HISTORICAL
+#: LYMessages.c:330
+msgid "Minimal comment parsing ON (but Historical is in effect)!"
+msgstr "ºÇ¾®¸Â¤Î¥³¥á¥ó¥È²òÀÏ¥ª¥ó(¤Ç¤âÀΤʤ¬¤é¤Î²òÀϤ¬Í­¸ú)!"
+
+#. #define MINIMAL_OFF_HISTORICAL_ON
+#: LYMessages.c:332
+msgid "Minimal comment parsing OFF (Historical is in effect)!"
+msgstr "ºÇ¾®¸Â¤Î¥³¥á¥ó¥È²òÀÏ¥ª¥Õ(ÀΤʤ¬¤é¤Î²òÀϤ¬Í­¸ú)!"
+
+#: LYMessages.c:333
+msgid "Soft double-quote parsing ON!"
+msgstr "´Ë¤ä¤«¤Ê¥À¥Ö¥ë¥¯¥©¡¼¥È²òÀÏ¥ª¥ó!"
+
+#: LYMessages.c:334
+msgid "Soft double-quote parsing OFF!"
+msgstr "´Ë¤ä¤«¤Ê¥À¥Ö¥ë¥¯¥©¡¼¥È²òÀÏ¥ª¥Õ!"
+
+#: LYMessages.c:335
+msgid "Now using TagSoup parsing of HTML."
+msgstr "HTML ¤ò¡Ö¥¿¥°¤Î¤´¤Ã¤¿¼Ñ¡×É÷Ì£¤Ç²òÀϤ·¤Þ¤¹¡£"
+
+#: LYMessages.c:336
+msgid "Now using SortaSGML parsing of HTML!"
+msgstr "HTML ¤ò¡Ö¤½¤³¤½¤³¸·Ì© SGML¡×É÷Ì£¤Ç²òÀϤ·¤Þ¤¹!"
+
+#: LYMessages.c:337
+msgid "You are already at the end of this document."
+msgstr "¤¹¤Ç¤Ë¤³¤Îʸ½ñ¤ÎËöÈø¤Ë¤¤¤Þ¤¹¡£"
+
+#: LYMessages.c:338
+msgid "You are already at the beginning of this document."
+msgstr "¤¹¤Ç¤Ë¤³¤Îʸ½ñ¤ÎÀèƬ¤Ë¤¤¤Þ¤¹¡£"
+
+#: LYMessages.c:339
+#, c-format
+msgid "You are already at page %d of this document."
+msgstr "¤¹¤Ç¤Ë¤³¤Îʸ½ñ¤Î %d ¥Ú¡¼¥¸Ìܤˤ¤¤Þ¤¹¡£"
+
+#: LYMessages.c:340
+#, c-format
+msgid "Link number %d already is current."
+msgstr "¤¹¤Ç¤Ë¥ê¥ó¥¯ÈÖ¹æ %d ¤òÁªÂò¤·¤Æ¤¤¤Þ¤¹¡£"
+
+#: LYMessages.c:341
+msgid "You are already at the first document"
+msgstr "¤³¤ì°Ê¾åÌá¤ì¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:342
+msgid "There are no links above this line of the document."
+msgstr "Åöʸ½ñ¤Î¤³¤Î¹Ô¤è¤ê¾å¤Ë¥ê¥ó¥¯¤Ï¤¢¤ê¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:343
+msgid "There are no links below this line of the document."
+msgstr "Åöʸ½ñ¤Î¤³¤Î¹Ô¤è¤ê²¼¤Ë¥ê¥ó¥¯¤Ï¤¢¤ê¤Þ¤»¤ó¡£"
+
+#. #define MAXLEN_REACHED_DEL_OR_MOV
+#: LYMessages.c:345
+msgid "Maximum length reached! Delete text or move off field."
+msgstr "Ťµ¤Î¸Â³¦¤Ç¤¹! ¥Æ¥­¥¹¥È¤òºï½ü¤¹¤ë¤«¥Õ¥£¡¼¥ë¥É¤ò°ÜÆ°¤·¤Æ¤¯¤À¤µ¤¤"
+
+#. #define NOT_ON_SUBMIT_OR_LINK
+#: LYMessages.c:347
+msgid "You are not on a form submission button or normal link."
+msgstr "¸½ºß¥Õ¥©¡¼¥àÁ÷¿®¥Ü¥¿¥ó¤Þ¤¿¤ÏÄ̾ï¤Î¥ê¥ó¥¯¤Î¾å¤Ë¤¤¤Þ¤»¤ó"
+
+#. #define NEED_CHECKED_RADIO_BUTTON
+#: LYMessages.c:349
+msgid "One radio button must be checked at all times!"
+msgstr "¥é¥¸¥ª¥Ü¥¿¥ó¤ÏºÇÄã°ì¤Ä¤Ï»ØÄꤷ¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó!"
+
+#: LYMessages.c:350
+msgid "No submit button for this form, submit single text field?"
+msgstr "¥Õ¥©¡¼¥à¤Ë¤ÏÁ÷¿®¥Ü¥¿¥ó¤¬¤¢¤ê¤Þ¤»¤ó¡£Ã±°ì¤Î¥Æ¥­¥¹¥È¥Õ¥£¡¼¥ë¥É¤òÁ÷¿®¤·¤Þ¤¹¤«?"
+
+#: LYMessages.c:351
+msgid "Do you want to go back to the previous document?"
+msgstr "°ì¤ÄÁ°¤Îʸ½ñ¤ËÌá¤ê¤Þ¤¹¤«?"
+
+#: LYMessages.c:352
+msgid "Use arrows or tab to move off of field."
+msgstr "Ìð°õ¥­¡¼¤«¥¿¥Ö¤Ç¥Õ¥£¡¼¥ë¥É¤ò°ÜÆ°"
+
+#. #define ENTER_TEXT_ARROWS_OR_TAB
+#: LYMessages.c:354
+msgid "Enter text. Use arrows or tab to move off of field."
+msgstr "¥Æ¥­¥¹¥È¤òÆþÎÏ Ìð°õ¥­¡¼¤«¥¿¥Ö¤Ç¥Õ¥£¡¼¥ë¥É¤ò°ÜÆ°"
+
+#: LYMessages.c:355
+msgid "** Bad HTML!! No form action defined. **"
+msgstr "ÉÔÀµ¤Ê HTML ¤Ç¤¹!! ¥Õ¥©¡¼¥à¥¢¥¯¥·¥ç¥ó¤¬ÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó **"
+
+#: LYMessages.c:356
+msgid "Bad HTML!! Unable to create popup window!"
+msgstr "ÉÔÀµ¤Ê HTML ¤Ç¤¹!! ¥Ý¥Ã¥×¥¢¥Ã¥×¥¦¥£¥ó¥É¥¦¤¬ºî¤ì¤Þ¤»¤ó **"
+
+#: LYMessages.c:357
+msgid "Unable to create popup window!"
+msgstr "¥Ý¥Ã¥×¥¢¥Ã¥×¥¦¥£¥ó¥É¥¦¤¬ºî¤ì¤Þ¤»¤ó!"
+
+#: LYMessages.c:358
+msgid "Goto a random URL is disallowed!"
+msgstr "¥é¥ó¥À¥à URL ¤Ø¤Î Goto ¤Ïµö²Ä¤µ¤ì¤Æ¤¤¤Þ¤»¤ó!"
+
+#: LYMessages.c:359
+msgid "Goto a non-http URL is disallowed!"
+msgstr "Èó http URL ¤Ø¤Î Goto ¤Ïµö²Ä¤µ¤ì¤Æ¤¤¤Þ¤»¤ó!"
+
+#: LYMessages.c:360
+#, c-format
+msgid "You are not allowed to goto \"%s\" URLs"
+msgstr "Goto ¤Ç \"%s\" URL ¤ò»ØÄꤹ¤ë¤Î¤Ï¶Ø»ß¤µ¤ì¤Æ¤¤¤Þ¤¹"
+
+#: LYMessages.c:361
+msgid "URL to open: "
+msgstr "³«¤­¤¿¤¤ URL: "
+
+#: LYMessages.c:362
+msgid "Edit the current Goto URL: "
+msgstr "¸½ºß¤Î Goto URL ¤òÊÔ½¸: "
+
+#: LYMessages.c:363
+msgid "Edit the previous Goto URL: "
+msgstr "Á°¤Î Goto URL: ¤òÊÔ½¸: "
+
+#: LYMessages.c:364
+msgid "Edit a previous Goto URL: "
+msgstr "°ÊÁ°¤Î Goto URL: ¤òÊÔ½¸: "
+
+#: LYMessages.c:365
+msgid "Current document has POST data."
+msgstr "¸½ºß¤Îʸ½ñ¤Ï POST ¥Ç¡¼¥¿¤ò´Þ¤ó¤Ç¤¤¤Þ¤¹¡£"
+
+#: LYMessages.c:366
+msgid "Edit this document's URL: "
+msgstr "¤³¤Îʸ½ñ¤Î URL ¤òÊÔ½¸: "
+
+#: LYMessages.c:367
+msgid "Edit the current link's URL: "
+msgstr "¸½ºß¤Î URL ¥ê¥ó¥¯Àè¤òÊÔ½¸: "
+
+#: LYMessages.c:368
+msgid "You cannot edit File Management URLs"
+msgstr "¥Õ¥¡¥¤¥ë´ÉÍý URL ¤ÏÊÔ½¸¤Ç¤­¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:369
+msgid "Enter a database query: "
+msgstr "¥Ç¡¼¥¿¥Ù¡¼¥¹¤Ç¸¡º÷¤¹¤ëʸ»úÎó¤òÆþÎÏ: "
+
+#: LYMessages.c:370
+msgid "Enter a whereis query: "
+msgstr "¸¡º÷¤¹¤ëʸ»úÎó: "
+
+#: LYMessages.c:371
+msgid "Edit the current query: "
+msgstr "¸½ºß¤Î¸¡º÷ʸ»úÎó¤òÊÔ½¸: "
+
+#: LYMessages.c:372
+msgid "Edit the previous query: "
+msgstr "°ì¤ÄÁ°¤Î¸¡º÷ʸ»úÎó¤òÊÔ½¸: "
+
+#: LYMessages.c:373
+msgid "Edit a previous query: "
+msgstr "°ÊÁ°¤Î¸¡º÷ʸ»úÎó¤òÊÔ½¸: "
+
+#. #define USE_C_R_TO_RESUB_CUR_QUERY
+#: LYMessages.c:375
+msgid "Use Control-R to resubmit the current query."
+msgstr "Ctrl-R ¤Ç¸½ºß¤Î¸¡º÷ʸ»úÎó¤òºÆÁ÷¿®"
+
+#: LYMessages.c:376
+msgid "Edit the current shortcut: "
+msgstr "¸½ºß¤Î¥·¥ç¡¼¥È¥«¥Ã¥È¤òÊÔ½¸: "
+
+#: LYMessages.c:377
+msgid "Edit the previous shortcut: "
+msgstr "°ì¤ÄÁ°¤Î¥·¥ç¡¼¥È¥«¥Ã¥È¤òÊÔ½¸: "
+
+#: LYMessages.c:378
+msgid "Edit a previous shortcut: "
+msgstr "°ÊÁ°¤Î¥·¥ç¡¼¥È¥«¥Ã¥È¤òÊÔ½¸: "
+
+#: LYMessages.c:379
+#, c-format
+msgid "Key '%c' is not mapped to a jump file!"
+msgstr "¥­¡¼ '%c' ¤Ï¥¸¥ã¥ó¥×¥Õ¥¡¥¤¥ë¤Ë³ä¤êÅö¤Æ¤é¤ì¤Æ¤¤¤Þ¤»¤ó!"
+
+#: LYMessages.c:380
+msgid "Cannot locate jump file!"
+msgstr "¥¸¥ã¥ó¥×¥Õ¥¡¥¤¥ë¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó!"
+
+#: LYMessages.c:381
+msgid "Cannot open jump file!"
+msgstr "¥¸¥ã¥ó¥×¥Õ¥¡¥¤¥ë¤¬³«¤±¤Þ¤»¤ó!"
+
+#: LYMessages.c:382
+msgid "Error reading jump file!"
+msgstr "¥¸¥ã¥ó¥×¥Õ¥¡¥¤¥ë¤ÎÆɤ߹þ¤ß¤Ç¥¨¥é¡¼¤¬È¯À¸¤·¤Þ¤·¤¿!"
+
+#: LYMessages.c:383
+msgid "Out of memory reading jump file!"
+msgstr "¥¸¥ã¥ó¥×¥Õ¥¡¥¤¥ë¤ÎÆɤ߹þ¤ß¤Ç¥á¥â¥ê¤¬Â­¤ê¤Ê¤¯¤Ê¤ê¤Þ¤·¤¿!"
+
+#: LYMessages.c:384
+msgid "Out of memory reading jump table!"
+msgstr "¥¸¥ã¥ó¥×¥Æ¡¼¥Ö¥ë¤ÎÆɤ߹þ¤ß¤Ç¥á¥â¥ê¤¬Â­¤ê¤Ê¤¯¤Ê¤ê¤Þ¤·¤¿!"
+
+#: LYMessages.c:385
+msgid "No index is currently available."
+msgstr "¸½ºßÍøÍѲÄǽ¤Ê¥¤¥ó¥Ç¥Ã¥¯¥¹¤Ï¤¢¤ê¤Þ¤»¤ó¡£"
+
+#. #define CONFIRM_MAIN_SCREEN
+#: LYMessages.c:387
+msgid "Do you really want to go to the Main screen?"
+msgstr "ËÜÅö¤Ë¥á¥¤¥ó²èÌ̤˹Ԥ­¤Þ¤¹¤«?"
+
+#: LYMessages.c:388
+msgid "You are already at main screen!"
+msgstr "¤¹¤Ç¤Ë¥á¥¤¥ó²èÌ̤ˤ¤¤Þ¤¹!"
+
+#. #define NOT_ISINDEX
+#: LYMessages.c:390
+msgid "Not a searchable indexed document -- press '/' to search for a text string"
+msgstr "¸¡º÷²Äǽ¤Êº÷°úÉÕ¤­Ê¸½ñ¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó -- [/] ¤Çʸ»úÎó¤ò¸¡º÷"
+
+#. #define NO_OWNER
+#: LYMessages.c:392
+msgid "No owner is defined for this file so you cannot send a comment"
+msgstr "¥Õ¥¡¥¤¥ë¤Î½êÍ­¼Ô¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¤Î¤Ç¥³¥á¥ó¥È¤ÏÁ÷¤ì¤Þ¤»¤ó"
+
+#: LYMessages.c:393
+#, c-format
+msgid "No owner is defined. Use %s?"
+msgstr "½êÍ­¼Ô¤¬»ØÄꤵ¤ì¤Æ¤¤¤Þ¤»¤ó¡£%s ¤ò»È¤¤¤Þ¤¹¤«?"
+
+#: LYMessages.c:394
+msgid "Do you wish to send a comment?"
+msgstr "¥³¥á¥ó¥È¤òÁ÷¤ê¤Þ¤¹¤«?"
+
+#: LYMessages.c:395
+msgid "Mail is disallowed so you cannot send a comment"
+msgstr "¥á¡¼¥ë¤Ïµö²Ä¤µ¤ì¤Æ¤¤¤Ê¤¤¤Î¤Ç¥³¥á¥ó¥È¤ÏÁ÷¤ì¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:396
+msgid "The 'e'dit command is currently disabled."
+msgstr "ÊÔ½¸ [e] ¥³¥Þ¥ó¥É¤Ï¸½ºßÍøÍѤǤ­¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:397
+msgid "External editing is currently disabled."
+msgstr "³°ÉôÊÔ½¸µ¡Ç½¤Ï¸½ºßÍøÍѤǤ­¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:398
+msgid "System error - failure to get status."
+msgstr "¥·¥¹¥Æ¥à¥¨¥é¡¼ - ¥¹¥Æ¡¼¥¿¥¹¤òÆÀ¤ë¤Î¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡£"
+
+#: LYMessages.c:399
+msgid "No editor is defined!"
+msgstr "¥¨¥Ç¥£¥¿¤¬ÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó!"
+
+#: LYMessages.c:400
+msgid "The 'p'rint command is currently disabled."
+msgstr "°õºþ¥³¥Þ¥ó¥É [p] ¤Ï¸½ºßÍøÍѤǤ­¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:401
+msgid "Document has no Toolbar links or Banner."
+msgstr "¤³¤Îʸ½ñ¤Ë¤Ï¥Ä¡¼¥ë¥Ð¡¼¥ê¥ó¥¯¤â¥Ð¥Ê¡¼¤â´Þ¤Þ¤ì¤Æ¤¤¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:402
+msgid "Unable to open traversal file."
+msgstr "¥È¥é¥Ð¡¼¥µ¥ë¥Õ¥¡¥¤¥ë¤¬³«¤±¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:403
+msgid "Unable to open traversal found file."
+msgstr "¥È¥é¥Ð¡¼¥µ¥ëȯ¸«¥Õ¥¡¥¤¥ë¤¬³«¤±¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:404
+msgid "Unable to open reject file."
+msgstr "¥ê¥¸¥§¥¯¥È¥Õ¥¡¥¤¥ë¤¬³«¤±¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:405
+msgid "Unable to open traversal errors output file"
+msgstr "¥È¥é¥Ð¡¼¥µ¥ë¥¨¥é¡¼½ÐÎÏ¥Õ¥¡¥¤¥ë¤¬³«¤±¤Þ¤»¤ó"
+
+#: LYMessages.c:406
+msgid "TRAVERSAL WAS INTERRUPTED"
+msgstr "¥È¥é¥Ð¡¼¥µ¥ë¤¬ÃæÃǤµ¤ì¤Þ¤·¤¿"
+
+#: LYMessages.c:407
+msgid "Follow link (or goto link or page) number: "
+msgstr "é¤ë¥ê¥ó¥¯(¤â¤·¤¯¤Ï goto ¥ê¥ó¥¯¤«¥Ú¡¼¥¸)¤ÎÈÖ¹æ: "
+
+#: LYMessages.c:408
+msgid "Select option (or page) number: "
+msgstr "¥ª¥×¥·¥ç¥ó(¤Þ¤¿¤Ï¥Ú¡¼¥¸)ÈÖ¹æ¤òÁªÂò: "
+
+#: LYMessages.c:409
+#, c-format
+msgid "Option number %d already is current."
+msgstr "¥ª¥×¥·¥ç¥óÈÖ¹æ %d ¤Ï¤¹¤Ç¤ËÁªÂò¤µ¤ì¤Æ¤¤¤Þ¤¹¡£"
+
+#. #define ALREADY_AT_OPTION_END
+#: LYMessages.c:411
+msgid "You are already at the end of this option list."
+msgstr "¤¹¤Ç¤Ë¤³¤Î¥ª¥×¥·¥ç¥ó¥ê¥¹¥È¤Î½ªÃ¼¤Ë¤¤¤Þ¤¹¡£"
+
+#. #define ALREADY_AT_OPTION_BEGIN
+#: LYMessages.c:413
+msgid "You are already at the beginning of this option list."
+msgstr "¤¹¤Ç¤Ë¤³¤Î¥ª¥×¥·¥ç¥ó¥ê¥¹¥È¤ÎÀèƬ¤Ë¤¤¤Þ¤¹¡£"
+
+#. #define ALREADY_AT_OPTION_PAGE
+#: LYMessages.c:415
+#, c-format
+msgid "You are already at page %d of this option list."
+msgstr "¤¹¤Ç¤Ë¤³¤Î¥ª¥×¥·¥ç¥ó¥ê¥¹¥È¤Î¥Ú¡¼¥¸ %d ¤Ë¤¤¤Þ¤¹¡£"
+
+#: LYMessages.c:416
+msgid "You have entered an invalid option number."
+msgstr "ÉÔÀµ¤Ê¥ª¥×¥·¥ç¥óÈֹ椬ÆþÎϤµ¤ì¤Þ¤·¤¿¡£"
+
+#: LYMessages.c:417
+msgid "** Bad HTML!! Use -trace to diagnose. **"
+msgstr "** ÉÔÀµ¤Ê HTML ¤Ç¤¹!! -trace ¤Ç¸¶°ø¤òÄ´¤Ù¤é¤ì¤Þ¤¹ **"
+
+#: LYMessages.c:418
+msgid "Give name of file to save in"
+msgstr "Êݸ¤¹¤ë¥Õ¥¡¥¤¥ë¤Î̾Á°¤òÆþÎϤ·¤Æ¤¯¤À¤µ¤¤"
+
+#: LYMessages.c:419
+msgid "Can't save data to file -- please run WWW locally"
+msgstr "¥Ç¡¼¥¿¤ò¥Õ¥¡¥¤¥ë¤ËÊݸ¤Ç¤­¤Þ¤»¤ó -- WWW ¤ò¥í¡¼¥«¥ë¤Ç¼Â¹Ô¤·¤Æ¤¯¤À¤µ¤¤"
+
+#: LYMessages.c:420
+msgid "Can't open temporary file!"
+msgstr "°ì»þŪ¥Õ¥¡¥¤¥ë¤¬³«¤±¤Þ¤»¤ó!"
+
+#: LYMessages.c:421
+msgid "Can't open output file! Cancelling!"
+msgstr "½ÐÎÏ¥Õ¥¡¥¤¥ë¤¬³«¤±¤Þ¤»¤ó! ¥­¥ã¥ó¥»¥ë¤·¤Þ¤¹!"
+
+#: LYMessages.c:422
+msgid "Execution is disabled."
+msgstr "¼Â¹Ôµ¡Ç½¤ÏÍøÍѤǤ­¤Þ¤»¤ó¡£"
+
+#. #define EXECUTION_DISABLED_FOR_FILE
+#: LYMessages.c:424
+#, c-format
+msgid "Execution is not enabled for this file. See the Options menu (use %s)."
+msgstr "¤³¤Î¥Õ¥¡¥¤¥ë¤ò¼Â¹Ô¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£¥ª¥×¥·¥ç¥ó¥á¥Ë¥å¡¼¤ò»²¾È(%s¤ò»È¤¦)¤·¤Æ¤¯¤À¤µ¤¤¡£"
+
+#. #define EXECUTION_NOT_COMPILED
+#: LYMessages.c:426
+msgid "Execution capabilities are not compiled into this version."
+msgstr "¼Â¹Ôµ¡Ç½¤Ï¤³¤Î¥Ð¡¼¥¸¥ç¥ó¤Ç¤Ï¥³¥ó¥Ñ¥¤¥ë»þ¤ËÁȤ߹þ¤Þ¤ì¤Æ¤¤¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:427
+msgid "This file cannot be displayed on this terminal."
+msgstr "¤³¤Î¥Õ¥¡¥¤¥ë¤Ï¸½ºß¤ÎüËö¤Ç¤Ïɽ¼¨¤Ç¤­¤Þ¤»¤ó¡£"
+
+#. #define CANNOT_DISPLAY_FILE_D_OR_C
+#: LYMessages.c:429
+msgid "This file cannot be displayed on this terminal: D)ownload, or C)ancel"
+msgstr "¤³¤Î¥Õ¥¡¥¤¥ë¤Ï¸½ºß¤ÎüËö¤Ç¤Ïɽ¼¨¤Ç¤­¤Þ¤»¤ó¡£[d]¥À¥¦¥ó¥í¡¼¥É [c]¥­¥ã¥ó¥»¥ë"
+
+#: LYMessages.c:430
+#, c-format
+msgid "%s D)ownload, or C)ancel"
+msgstr "%s [d]¥À¥¦¥ó¥í¡¼¥É ¤Þ¤¿¤Ï [c]¥­¥ã¥ó¥»¥ë"
+
+#: LYMessages.c:431
+msgid "Cancelling file."
+msgstr "¥Õ¥¡¥¤¥ë¤ò¥­¥ã¥ó¥»¥ë¤·¤Þ¤¹¡£"
+
+#: LYMessages.c:432
+msgid "Retrieving file. - PLEASE WAIT -"
+msgstr "¥Õ¥¡¥¤¥ë¤ò¼õ¿®Ãæ - ¤ªÂÔ¤Á¤¯¤À¤µ¤¤"
+
+#: LYMessages.c:433
+msgid "Enter a filename: "
+msgstr "¥Õ¥¡¥¤¥ë̾¤òÆþÎÏ: "
+
+#: LYMessages.c:434
+msgid "Edit the previous filename: "
+msgstr "°ì¤ÄÁ°¤Î¥Õ¥¡¥¤¥ë̾¤òÊÔ½¸: "
+
+#: LYMessages.c:435
+msgid "Edit a previous filename: "
+msgstr "°ÊÁ°¤Î¥Õ¥¡¥¤¥ë̾¤òÊÔ½¸: "
+
+#: LYMessages.c:436
+msgid "Enter a new filename: "
+msgstr "¿·¤·¤¤¥Õ¥¡¥¤¥ë̾¤òÆþÎÏ: "
+
+#: LYMessages.c:437
+msgid "File name may not begin with a dot."
+msgstr "¥Õ¥¡¥¤¥ë̾¤Ï¥É¥Ã¥È¤Ç»Ï¤Þ¤Ã¤Æ¤Ï¤¤¤±¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:439
+msgid "File exists. Create higher version?"
+msgstr "¥Õ¥¡¥¤¥ë¤¬Â¸ºß¤·¤Þ¤¹¡£¤è¤ê¹â¤¤¥Ð¡¼¥¸¥ç¥ó¤òºîÀ®¤·¤Þ¤¹¤«?"
+
+#: LYMessages.c:441
+msgid "File exists. Overwrite?"
+msgstr "¥Õ¥¡¥¤¥ë¤¬Â¸ºß¤·¤Þ¤¹¡£¾å½ñ¤­¤·¤Þ¤¹¤«?"
+
+#: LYMessages.c:443
+msgid "Cannot write to file."
+msgstr "¥Õ¥¡¥¤¥ë¤Ë½ñ¤­¹þ¤á¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:444
+msgid "ERROR! - download command is misconfigured."
+msgstr "¥¨¥é¡¼! - ¥À¥¦¥ó¥í¡¼¥É¥³¥Þ¥ó¥É¤ÎÀßÄ꤬´Ö°ã¤Ã¤Æ¤¤¤Þ¤¹¡£"
+
+#: LYMessages.c:445
+msgid "Unable to download file."
+msgstr "¥Õ¥¡¥¤¥ë¤ò¥À¥¦¥ó¥í¡¼¥É¤Ç¤­¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:446
+msgid "Reading directory..."
+msgstr "¥Ç¥£¥ì¥¯¥È¥ê¤òÆɤ߹þ¤ßÃæ..."
+
+#: LYMessages.c:447
+msgid "Building directory listing..."
+msgstr "¥Ç¥£¥ì¥¯¥È¥ê°ìÍ÷¤òºîÀ®Ãæ..."
+
+#: LYMessages.c:448
+msgid "Saving..."
+msgstr "Êݸ¤·¤Æ¤¤¤Þ¤¹..."
+
+#: LYMessages.c:449
+#, c-format
+msgid "Could not edit file '%s'."
+msgstr "¥Õ¥¡¥¤¥ë '%s' ¤òÊÔ½¸¤Ç¤­¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:450
+msgid "Unable to access document!"
+msgstr "ʸ½ñ¤Ë¥¢¥¯¥»¥¹¤Ç¤­¤Þ¤»¤ó!"
+
+#: LYMessages.c:451
+msgid "Could not access file."
+msgstr "¥Õ¥¡¥¤¥ë¤Ë¥¢¥¯¥»¥¹¤Ç¤­¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:452
+msgid "Could not access directory."
+msgstr "¥Ç¥£¥ì¥¯¥È¥ê¤Ë¥¢¥¯¥»¥¹¤Ç¤­¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:453
+msgid "Could not load data."
+msgstr "¥Ç¡¼¥¿¤òÆɤ߹þ¤á¤Þ¤»¤ó¡£"
+
+#. #define CANNOT_EDIT_REMOTE_FILES
+#: LYMessages.c:455
+msgid "Lynx cannot currently (e)dit remote WWW files."
+msgstr "¸½ºß Lynx ¤Ï¥ê¥â¡¼¥È WWW ¥Õ¥¡¥¤¥ë¤ò [e] ÊÔ½¸¤Ç¤­¤Þ¤»¤ó¡£"
+
+#. #define CANNOT_EDIT_FIELD
+#: LYMessages.c:457
+msgid "This field cannot be (e)dited with an external editor."
+msgstr "¤³¤Î¥Õ¥£¡¼¥ë¥É¤Ï³°Éô¥¨¥Ç¥£¥¿¤ÇÊÔ½¸ [e] ¤Ç¤­¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:458
+msgid "Bad rule"
+msgstr "ÉÔÀµ¤Ê¥ë¡¼¥ë¤Ç¤¹¡£"
+
+#: LYMessages.c:459
+msgid "Insufficient operands:"
+msgstr "¥ª¥Ú¥é¥ó¥É¤¬Â­¤ê¤Þ¤»¤ó:"
+
+#: LYMessages.c:460
+msgid "You are not authorized to edit this file."
+msgstr "¤³¤Î¥Õ¥¡¥¤¥ë¤òÊÔ½¸¤¹¤ë¸¢¸Â¤¬¤¢¤ê¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:461
+msgid "Title: "
+msgstr "Âê̾: "
+
+#: LYMessages.c:462
+msgid "Subject: "
+msgstr "¥µ¥Ö¥¸¥§¥¯¥È: "
+
+#: LYMessages.c:463
+msgid "Username: "
+msgstr "¥æ¡¼¥¶Ì¾: "
+
+#: LYMessages.c:464
+msgid "Password: "
+msgstr "¥Ñ¥¹¥ï¡¼¥É: "
+
+#: LYMessages.c:465
+msgid "lynx: Username and Password required!!!"
+msgstr "lynx: ¥æ¡¼¥¶Ì¾¤È¥Ñ¥¹¥ï¡¼¥É¤¬É¬ÍפǤ¹!!!"
+
+#: LYMessages.c:466
+msgid "lynx: Password required!!!"
+msgstr "lynx: ¥Ñ¥¹¥ï¡¼¥É¤¬É¬ÍפǤ¹!!!"
+
+#: LYMessages.c:467
+msgid "Clear all authorization info for this session?"
+msgstr "¤³¤Î¥»¥Ã¥·¥ç¥ó¤Î¤¹¤Ù¤Æ¤Îǧ¾Ú¾ðÊó¤ò¥¯¥ê¥¢¤·¤Þ¤¹¤«?"
+
+#: LYMessages.c:468
+msgid "Authorization info cleared."
+msgstr "ǧ¾Ú¾ðÊó¤ò¥¯¥ê¥¢¤·¤Þ¤·¤¿¡£"
+
+#: LYMessages.c:469
+msgid "Authorization failed. Retry?"
+msgstr "ǧ¾Ú¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡£ºÆ»î¹Ô¤·¤Þ¤¹¤«?"
+
+#: LYMessages.c:470
+msgid "cgi support has been disabled."
+msgstr "cgi ¥µ¥Ý¡¼¥È¤ÏÍøÍѤǤ­¤Þ¤»¤ó¡£"
+
+#. #define CGI_NOT_COMPILED
+#: LYMessages.c:472
+msgid "Lynxcgi capabilities are not compiled into this version."
+msgstr "Lynxcgi µ¡Ç½¤Ï¤³¤Î¥Ð¡¼¥¸¥ç¥ó¤Ë¤ÏÁȤ߹þ¤Þ¤ì¤Æ¤¤¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:473
+#, c-format
+msgid "Sorry, no known way of converting %s to %s."
+msgstr "%s ¤ò %s ¤ËÊÑ´¹¤¹¤ë¼êÃʤϤ¢¤ê¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:474
+msgid "Unable to set up connection."
+msgstr "Àܳ¤ò½àÈ÷¤Ç¤­¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:475
+msgid "Unable to make connection"
+msgstr "Àܳ¤ò³ÎΩ¤Ç¤­¤Þ¤»¤ó¡£"
+
+#. #define MALFORMED_EXEC_REQUEST
+#: LYMessages.c:477
+msgid "Executable link rejected due to malformed request."
+msgstr "ÉÔÀµ¤Ê¥ê¥¯¥¨¥¹¥È¤Î¤¿¤á¡¢¼Â¹Ô²Äǽ¤Ê¥ê¥ó¥¯¤ÏµñÈݤµ¤ì¤Þ¤·¤¿¡£"
+
+#. #define BADCHAR_IN_EXEC_LINK
+#: LYMessages.c:479
+#, c-format
+msgid "Executable link rejected due to `%c' character."
+msgstr "¥­¥ã¥é¥¯¥¿ '%c' ¤Î¤¿¤á¡¢¼Â¹Ô²Äǽ¤Ê¥ê¥ó¥¯¤ÏµñÈݤµ¤ì¤Þ¤·¤¿¡£"
+
+#. #define RELPATH_IN_EXEC_LINK
+#: LYMessages.c:481
+msgid "Executable link rejected due to relative path string ('../')."
+msgstr "ÁêÂХѥ¹Ê¸»úÎó('../')¤Î¤¿¤á¡¢¼Â¹Ô²Äǽ¤Ê¥ê¥ó¥¯¤ÏµñÈݤµ¤ì¤Þ¤·¤¿¡£"
+
+#. #define BADLOCPATH_IN_EXEC_LINK
+#: LYMessages.c:483
+msgid "Executable link rejected due to location or path."
+msgstr "¾ì½ê¤Þ¤¿¤Ï¥Ñ¥¹¤Î¤¿¤á¡¢¼Â¹Ô²Äǽ¤Ê¥ê¥ó¥¯¤ÏµñÈݤµ¤ì¤Þ¤·¤¿¡£"
+
+#: LYMessages.c:484
+msgid "Mail access is disabled!"
+msgstr "¥á¡¼¥ë¥¢¥¯¥»¥¹¤ÏÍøÍѤǤ­¤Þ¤»¤ó!"
+
+#. #define ACCESS_ONLY_LOCALHOST
+#: LYMessages.c:486
+msgid "Only files and servers on the local host can be accessed."
+msgstr "¥í¡¼¥«¥ë¥Û¥¹¥È¾å¤Î¥Õ¥¡¥¤¥ë¤È¥µ¡¼¥Ð¤Î¤ß¥¢¥¯¥»¥¹¤Ç¤­¤Þ¤¹¡£"
+
+#: LYMessages.c:487
+msgid "Telnet access is disabled!"
+msgstr "Telnet ¥¢¥¯¥»¥¹¤ÏÍøÍѤǤ­¤Þ¤»¤ó!"
+
+#. #define TELNET_PORT_SPECS_DISABLED
+#: LYMessages.c:489
+msgid "Telnet port specifications are disabled."
+msgstr "Telnet ¥Ý¡¼¥È»ØÄê¤ÏÍøÍѤǤ­¤Þ¤»¤ó!"
+
+#: LYMessages.c:490
+msgid "USENET news access is disabled!"
+msgstr "USENET ¥Ë¥å¡¼¥¹¥¢¥¯¥»¥¹¤ÏÍøÍѤǤ­¤Þ¤»¤ó!"
+
+#: LYMessages.c:491
+msgid "Rlogin access is disabled!"
+msgstr "Rlogin ¥¢¥¯¥»¥¹¤ÏÍøÍѤǤ­¤Þ¤»¤ó!"
+
+#: LYMessages.c:492
+msgid "Ftp access is disabled!"
+msgstr "Ftp ¥¢¥¯¥»¥¹¤ÏÍøÍѤǤ­¤Þ¤»¤ó!"
+
+#: LYMessages.c:493
+msgid "There are no references from this document."
+msgstr "¤³¤Îʸ½ñ¤«¤é¤Î»²¾È¤Ï¤¢¤ê¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:494
+msgid "There are only hidden links from this document."
+msgstr "¤³¤Îʸ½ñ¤Ë¤Ï±£¤·¥ê¥ó¥¯¤·¤«¤¢¤ê¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:496
+msgid "Unable to open command file."
+msgstr "¥³¥Þ¥ó¥É¥Õ¥¡¥¤¥ë¤¬³«¤±¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:498
+msgid "News Post Cancelled!!!"
+msgstr "¥Ë¥å¡¼¥¹¤ÎÅê¹Æ¤Ï¥­¥ã¥ó¥»¥ë¤µ¤ì¤Þ¤·¤¿!!!"
+
+#. #define SPAWNING_EDITOR_FOR_NEWS
+#: LYMessages.c:500
+msgid "Spawning your selected editor to edit news message"
+msgstr "»ØÄê¤Î¥¨¥Ç¥£¥¿¤òµ¯Æ°¤·¤Æ¥Ë¥å¡¼¥¹¥á¥Ã¥»¡¼¥¸¤òÊÔ½¸¤·¤Þ¤¹"
+
+#: LYMessages.c:501
+msgid "Post this message?"
+msgstr "¤³¤Î¥á¥Ã¥»¡¼¥¸¤òÅê¹Æ¤·¤Þ¤¹¤«?"
+
+#: LYMessages.c:502
+#, c-format
+msgid "Append '%s'?"
+msgstr "'%s' ¤òÄɲä·¤Þ¤¹¤«?"
+
+#: LYMessages.c:503
+msgid "Posting to newsgroup(s)..."
+msgstr "¥Ë¥å¡¼¥¹¥°¥ë¡¼¥×¤ËÅê¹ÆÃæ..."
+
+#: LYMessages.c:505
+msgid "*** You have unread mail. ***"
+msgstr "*** ¤Þ¤ÀÆɤó¤Ç¤¤¤Ê¤¤¥á¡¼¥ë¤¬¤¢¤ê¤Þ¤¹ ***"
+
+#: LYMessages.c:507
+msgid "*** You have mail. ***"
+msgstr "*** ¥á¡¼¥ë¤¬Íè¤Æ¤¤¤Þ¤¹ ***"
+
+#: LYMessages.c:509
+msgid "*** You have new mail. ***"
+msgstr "*** ¿·Ãå¥á¡¼¥ë¤¬¤¢¤ê¤Þ¤¹ ***"
+
+#: LYMessages.c:510
+msgid "File insert cancelled!!!"
+msgstr "¥Õ¥¡¥¤¥ëÁÞÆþ¤¬¥­¥ã¥ó¥»¥ë¤µ¤ì¤Þ¤·¤¿!!!"
+
+#: LYMessages.c:511
+msgid "Not enough memory for file!"
+msgstr "¥Õ¥¡¥¤¥ë¤òÆɤ߹þ¤à¥á¥â¥ê¤¬Â­¤ê¤Þ¤»¤ó"
+
+#: LYMessages.c:512
+msgid "Can't open file for reading."
+msgstr "Æɤ߹þ¤à¥Õ¥¡¥¤¥ë¤¬³«¤±¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:513
+msgid "File does not exist."
+msgstr "¥Õ¥¡¥¤¥ë¤¬Â¸ºß¤·¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:514
+msgid "File does not exist - reenter or cancel:"
+msgstr "¥Õ¥¡¥¤¥ë¤¬Â¸ºß¤·¤Þ¤»¤ó - ºÆÆþÎϤ«¥­¥ã¥ó¥»¥ë:"
+
+#: LYMessages.c:515
+msgid "File is not readable."
+msgstr "¥Õ¥¡¥¤¥ë¤ÏÆɤ߹þ¤ßÉԲĤǤ¹¡£"
+
+#: LYMessages.c:516
+msgid "File is not readable - reenter or cancel:"
+msgstr "¥Õ¥¡¥¤¥ë¤¬Æɤá¤Þ¤»¤ó - ºÆÆþÎϤ«¥­¥ã¥ó¥»¥ë:"
+
+#: LYMessages.c:517
+msgid "Nothing to insert - file is 0-length."
+msgstr "ÁÞÆþ¤¹¤ëÆâÍƤ¬¤¢¤ê¤Þ¤»¤ó - ¥Õ¥¡¥¤¥ë¤ÎŤµ¤¬ 0 ¤Ç¤¹¡£"
+
+#: LYMessages.c:518
+msgid "Save request cancelled!!!"
+msgstr "Êݸ¥ê¥¯¥¨¥¹¥È¤¬¥­¥ã¥ó¥»¥ë¤µ¤ì¤Þ¤·¤¿!!!"
+
+#: LYMessages.c:519
+msgid "Mail request cancelled!!!"
+msgstr "¥á¡¼¥ë¥ê¥¯¥¨¥¹¥È¤¬¥­¥ã¥ó¥»¥ë¤µ¤ì¤Þ¤·¤¿!!!"
+
+#. #define CONFIRM_MAIL_SOURCE_PREPARSED
+#: LYMessages.c:521
+msgid "Viewing preparsed source. Are you sure you want to mail it?"
+msgstr "²òÀϺѤߥ½¡¼¥¹¤ò±ÜÍ÷Ãæ¤Ç¤¹¡£ËÜÅö¤Ë¤³¤ì¤ò¥á¡¼¥ë¤·¤Þ¤¹¤«?"
+
+#: LYMessages.c:522
+msgid "Please wait..."
+msgstr "¤ªÂÔ¤Á¤¯¤À¤µ¤¤..."
+
+#: LYMessages.c:523
+msgid "Mailing file. Please wait..."
+msgstr "¥Õ¥¡¥¤¥ë¤ò¥á¡¼¥ë¤ÇÁ÷¿®Ãæ¡£¤ªÂÔ¤Á¤¯¤À¤µ¤¤..."
+
+#: LYMessages.c:524
+msgid "ERROR - Unable to mail file"
+msgstr "¥¨¥é¡¼ - ¥Õ¥¡¥¤¥ë¤ò¥á¡¼¥ë¤ÇÁ÷¿®¤Ç¤­¤Þ¤»¤ó¡£"
+
+#. #define CONFIRM_LONG_SCREEN_PRINT
+#: LYMessages.c:526
+#, c-format
+msgid "File is %d screens long. Are you sure you want to print?"
+msgstr "¥Õ¥¡¥¤¥ë¤Ï %d ²èÌÌʬ¤ÎŤµ¤Ç¤¹¡£ËÜÅö¤Ë°õºþ¤·¤Þ¤¹¤«?"
+
+#: LYMessages.c:527
+msgid "Print request cancelled!!!"
+msgstr "°õºþ¥ê¥¯¥¨¥¹¥È¤Ï¥­¥ã¥ó¥»¥ë¤µ¤ì¤Þ¤·¤¿!!!"
+
+#: LYMessages.c:528
+msgid "Press <return> to begin: "
+msgstr "¥ê¥¿¡¼¥ó¥­¡¼¤Ç³«»Ï: "
+
+#: LYMessages.c:529
+msgid "Press <return> to finish: "
+msgstr "¥ê¥¿¡¼¥ó¥­¡¼¤Ç½ªÎ»"
+
+#. #define CONFIRM_LONG_PAGE_PRINT
+#: LYMessages.c:531
+#, c-format
+msgid "File is %d pages long. Are you sure you want to print?"
+msgstr "¥Õ¥¡¥¤¥ë¤Ï %d ¥Ú¡¼¥¸Ê¬¤ÎŤµ¤Ç¤¹¡£ËÜÅö¤Ë°õºþ¤·¤Þ¤¹¤«?"
+
+#. #define CHECK_PRINTER
+#: LYMessages.c:533
+msgid "Be sure your printer is on-line. Press <return> to start printing:"
+msgstr "¥×¥ê¥ó¥¿¤¬¥ª¥ó¥é¥¤¥ó¤«³Î¤«¤á¤Æ¤¯¤À¤µ¤¤¡£¥ê¥¿¡¼¥ó¥­¡¼¤Ç°õºþ³«»Ï:"
+
+#: LYMessages.c:534
+msgid "ERROR - Unable to allocate file space!!!"
+msgstr "¥¨¥é¡¼ - ¥Õ¥¡¥¤¥ëÎΰ褬³ÎÊݤǤ­¤Þ¤»¤ó!!!"
+
+#: LYMessages.c:535
+msgid "Unable to open tempfile"
+msgstr "°ì»þ¥Õ¥¡¥¤¥ë¤¬³«¤±¤Þ¤»¤ó"
+
+#: LYMessages.c:536
+msgid "Unable to open print options file"
+msgstr "°õºþ¥ª¥×¥·¥ç¥ó¥Õ¥¡¥¤¥ë¤¬³«¤±¤Þ¤»¤ó"
+
+#: LYMessages.c:537
+msgid "Printing file. Please wait..."
+msgstr "¥Õ¥¡¥¤¥ë¤ò°õºþ¤·¤Æ¤¤¤Þ¤¹¡£¤ªÂÔ¤Á¤¯¤À¤µ¤¤..."
+
+#: LYMessages.c:538
+msgid "Please enter a valid internet mail address: "
+msgstr "Àµ¤·¤¤¥¤¥ó¥¿¡¼¥Í¥Ã¥È¥á¡¼¥ë¥¢¥É¥ì¥¹¤òÆþÎϤ·¤Æ¤¯¤À¤µ¤¤: "
+
+#: LYMessages.c:539
+msgid "ERROR! - printer is misconfigured!"
+msgstr "¥¨¥é¡¼! - ¥×¥ê¥ó¥¿¤ÎÀßÄ꤬´Ö°ã¤Ã¤Æ¤¤¤Þ¤¹"
+
+#: LYMessages.c:540
+msgid "Image map from POST response not available!"
+msgstr "POST ¥ì¥¹¥Ý¥ó¥¹¤«¤é¤Î¥¤¥á¡¼¥¸¥Þ¥Ã¥×¤¬ÍøÍѤǤ­¤Þ¤»¤ó!"
+
+#: LYMessages.c:541
+msgid "Misdirected client-side image MAP request!"
+msgstr "¥¯¥é¥¤¥¢¥ó¥È¥µ¥¤¥É¥¤¥á¡¼¥¸ MAP ¥ê¥¯¥¨¥¹¥È¤Î¥Ç¥£¥ì¥¯¥·¥ç¥ó¤¬ÉÔÀµ¤Ç¤¹!"
+
+#: LYMessages.c:542
+msgid "Client-side image MAP is not accessible!"
+msgstr "¥¯¥é¥¤¥¢¥ó¥È¥µ¥¤¥É¥¤¥á¡¼¥¸ MAP ¤Ë¥¢¥¯¥»¥¹¤Ç¤­¤Þ¤»¤ó!"
+
+#: LYMessages.c:543
+msgid "No client-side image MAPs are available!"
+msgstr "ÍøÍѤǤ­¤ë¥¯¥é¥¤¥¢¥ó¥È¥µ¥¤¥É¥¤¥á¡¼¥¸ MAP ¤¬¤¢¤ê¤Þ¤»¤ó!"
+
+#: LYMessages.c:544
+msgid "Client-side image MAP is not available!"
+msgstr "¥¯¥é¥¤¥¢¥ó¥È¥µ¥¤¥É¥¤¥á¡¼¥¸ MAP ¤ÏÍøÍѤǤ­¤Þ¤»¤ó!"
+
+#. #define OPTION_SCREEN_NEEDS_24
+#: LYMessages.c:547
+msgid "Screen height must be at least 24 lines for the Options menu!"
+msgstr "¥ª¥×¥·¥ç¥ó¥á¥Ë¥å¡¼¤òɽ¼¨¤¹¤ë¤Ë¤Ï¥¹¥¯¥ê¡¼¥ó¤Î¹â¤µ¤¬ºÇÄã 24 ¹ÔʬɬÍפǤ¹!"
+
+#. #define OPTION_SCREEN_NEEDS_23
+#: LYMessages.c:549
+msgid "Screen height must be at least 23 lines for the Options menu!"
+msgstr "¥ª¥×¥·¥ç¥ó¥á¥Ë¥å¡¼¤òɽ¼¨¤¹¤ë¤Ë¤Ï¥¹¥¯¥ê¡¼¥ó¤Î¹â¤µ¤¬ºÇÄã 23 ¹ÔʬɬÍפǤ¹!"
+
+#. #define OPTION_SCREEN_NEEDS_22
+#: LYMessages.c:551
+msgid "Screen height must be at least 22 lines for the Options menu!"
+msgstr "¥ª¥×¥·¥ç¥ó¥á¥Ë¥å¡¼¤òɽ¼¨¤¹¤ë¤Ë¤Ï¥¹¥¯¥ê¡¼¥ó¤Î¹â¤µ¤¬ºÇÄã 22 ¹ÔʬɬÍפǤ¹!"
+
+#: LYMessages.c:553
+msgid "That key requires Advanced User mode."
+msgstr "¤½¤Î¥­¡¼¤ò»È¤¦¤Ë¤Ï¹âÅ٥桼¥¶¥â¡¼¥É¤Ç¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:554
+#, c-format
+msgid "Content-type: %s"
+msgstr "Content-type: %s"
+
+#: LYMessages.c:555
+msgid "Command: "
+msgstr "¥³¥Þ¥ó¥É: "
+
+#: LYMessages.c:556
+msgid "Unknown or ambiguous command"
+msgstr "ÉÔÌÀ¤Þ¤¿¤Ï¤¢¤¤¤Þ¤¤¤Ê¥³¥Þ¥ó¥É¤Ç¤¹"
+
+#: LYMessages.c:557
+msgid " Version "
+msgstr " ¥Ð¡¼¥¸¥ç¥ó "
+
+#: LYMessages.c:558
+msgid " first"
+msgstr " ¤òºÇ½é¤Ëõ¤·¤Þ¤¹"
+
+#: LYMessages.c:559
+msgid ", guessing..."
+msgstr "¡¢¿ä¬Ãæ..."
+
+#: LYMessages.c:560
+msgid "Permissions for "
+msgstr "¥Ñ¡¼¥ß¥Ã¥·¥ç¥ó: "
+
+#: LYMessages.c:561
+msgid "Select "
+msgstr "ÁªÂò "
+
+#: LYMessages.c:562
+msgid "capital letter"
+msgstr "Âçʸ»ú"
+
+#: LYMessages.c:563
+msgid " of option line,"
+msgstr " ¤Î¥ª¥×¥·¥ç¥ó¥é¥¤¥ó¡¢"
+
+#: LYMessages.c:564
+msgid " to save,"
+msgstr " ¤ÇÊݸ¡¢"
+
+#: LYMessages.c:565
+msgid " to "
+msgstr " ¤Ø "
+
+#: LYMessages.c:566
+msgid " or "
+msgstr " ¤Þ¤¿¤Ï "
+
+#: LYMessages.c:567
+msgid " index"
+msgstr " º÷°ú"
+
+#: LYMessages.c:568
+msgid " to return to Lynx."
+msgstr " ¤Ç Lynx ¤ËÌá¤ë¡£"
+
+#: LYMessages.c:569
+msgid "Accept Changes"
+msgstr "Êѹ¹¤òÍ­¸ú¤Ë¤¹¤ë"
+
+#: LYMessages.c:570
+msgid "Reset Changes"
+msgstr "Êѹ¹¤ò¥ê¥»¥Ã¥È"
+
+#: LYMessages.c:571
+msgid "Left Arrow cancels changes"
+msgstr "[¢«] ¥­¥ã¥ó¥»¥ë"
+
+#: LYMessages.c:572
+msgid "Save options to disk"
+msgstr "Êѹ¹¤ò¥Ç¥£¥¹¥¯¤ËÊݸ"
+
+#: LYMessages.c:573
+msgid "Hit RETURN to accept entered data."
+msgstr "¥ê¥¿¡¼¥ó¥­¡¼¤ÇÆþÎϤ·¤¿¥Ç¡¼¥¿¤òÅÐÏ¿"
+
+#. #define ACCEPT_DATA_OR_DEFAULT
+#: LYMessages.c:575
+msgid "Hit RETURN to accept entered data. Delete data to invoke the default."
+msgstr "¥ê¥¿¡¼¥ó¤ÇÆþÎϤ·¤¿¥Ç¡¼¥¿¤ò¼õ¤±ÉÕ¤±¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤ËÌ᤹¤Ë¤Ï¥Ç¡¼¥¿¤òºï½ü"
+
+#: LYMessages.c:576
+msgid "Value accepted!"
+msgstr "Ãͤò¼õ¤±Æþ¤ì¤Þ¤·¤¿!"
+
+#. #define VALUE_ACCEPTED_WARNING_X
+#: LYMessages.c:578
+msgid "Value accepted! -- WARNING: Lynx is configured for XWINDOWS!"
+msgstr "Ãͤò¼õ¤±Æþ¤ì¤Þ¤·¤¿! -- Ãí°Õ: Lynx ¤Ï XWINDOWS ¸þ¤±¤ËÀßÄꤵ¤ì¤Þ¤·¤¿!"
+
+#. #define VALUE_ACCEPTED_WARNING_NONX
+#: LYMessages.c:580
+msgid "Value accepted! -- WARNING: Lynx is NOT configured for XWINDOWS!"
+msgstr "Ãͤò¼õ¤±Æþ¤ì¤Þ¤·¤¿! -- Ãí°Õ: Lynx ¤Ï XWINDOWS ¸þ¤±¤ËÀßÄꤵ¤ì¤Æ*¤¤¤Þ¤»¤ó*"
+
+#: LYMessages.c:581
+msgid "You are not allowed to change which editor to use!"
+msgstr "»ÈÍѤ¹¤ë¥¨¥Ç¥£¥¿¤ÎÊѹ¹¤Ïµö²Ä¤µ¤ì¤Æ¤¤¤Þ¤»¤ó!"
+
+#: LYMessages.c:582
+msgid "Failed to set DISPLAY variable!"
+msgstr "´Ä¶­ÊÑ¿ô DISPLAY ¤ÎÀßÄê¤Ë¼ºÇÔ¤·¤Þ¤·¤¿!"
+
+#: LYMessages.c:583
+msgid "Failed to clear DISPLAY variable!"
+msgstr "´Ä¶­ÊÑ¿ô DISPLAY ¤Î¥¯¥ê¥¢¤Ë¼ºÇÔ¤·¤Þ¤·¤¿!"
+
+#. #define BOOKMARK_CHANGE_DISALLOWED
+#: LYMessages.c:585
+msgid "You are not allowed to change the bookmark file!"
+msgstr "¥Ö¥Ã¥¯¥Þ¡¼¥¯¥Õ¥¡¥¤¥ë¤ÎÊѹ¹¤Ïµö²Ä¤µ¤ì¤Æ¤¤¤Þ¤»¤ó!"
+
+#: LYMessages.c:586
+msgid "Terminal does not support color"
+msgstr "üËö¤¬¥«¥é¡¼É½¼¨¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:587
+#, c-format
+msgid "Your '%s' terminal does not support color."
+msgstr "¤¢¤Ê¤¿¤ÎüËö '%s' ¤Ï¥«¥é¡¼É½¼¨¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:588
+msgid "Access to dot files is disabled!"
+msgstr "¥É¥Ã¥È¥Õ¥¡¥¤¥ë¤Ø¤Î¥¢¥¯¥»¥¹¤Ï¤Ç¤­¤Þ¤»¤ó!"
+
+#. #define UA_NO_LYNX_WARNING
+#: LYMessages.c:590
+msgid "User-Agent string does not contain \"Lynx\" or \"L_y_n_x\""
+msgstr "User-Agent ¤Ë \"Lynx\" ¤¢¤ë¤¤¤Ï \"L_y_n_x\" ¤È¤¤¤¦Ê¸»úÎ󤬴ޤޤì¤Æ¤¤¤Þ¤»¤ó"
+
+#. #define UA_PLEASE_USE_LYNX
+#: LYMessages.c:592
+msgid "Use \"L_y_n_x\" or \"Lynx\" in User-Agent, or it looks like intentional deception!"
+msgstr "User-Agent ¤Ë \"L_y_n_x\" ¤Ê¤¤¤· \"Lynx\" ¤È¤¤¤¦Ê¸»úÎó¤ò´Þ¤á¤Æ¤¯¤À¤µ¤¤¡£¤µ¤â¤Ê¤¤¤È°Õ¿ÞŪ¤Êµ½â֤ȸ«¤Ê¤·¤Þ¤¹!"
+
+#. #define UA_CHANGE_DISABLED
+#: LYMessages.c:594
+msgid "Changing of the User-Agent string is disabled!"
+msgstr "User-Agent ʸ»úÎó¤ÎÊѹ¹¤Ï¤Ç¤­¤Þ¤»¤ó!"
+
+#. #define CHANGE_OF_SETTING_DISALLOWED
+#: LYMessages.c:596
+msgid "You are not allowed to change this setting."
+msgstr "¤³¤ÎÀßÄê¤ÎÊѹ¹¤Ïµö²Ä¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:597
+msgid "Saving Options..."
+msgstr "ÀßÄê¤òÊݸÃæ..."
+
+#: LYMessages.c:598
+msgid "Options saved!"
+msgstr "ÀßÄê¤òÊݸ¤·¤Þ¤·¤¿!"
+
+#: LYMessages.c:599
+msgid "Unable to save Options!"
+msgstr "ÀßÄê¤òÊݸ¤Ç¤­¤Þ¤»¤ó!"
+
+#: LYMessages.c:600
+msgid " 'r' to return to Lynx "
+msgstr "[r]¤Ç Lynx ¤ËÌá¤ê¤Þ¤¹ "
+
+#: LYMessages.c:601
+msgid " '>' to save, or 'r' to return to Lynx "
+msgstr " [>] ¤ÇÊݸ¡¢[r] ¤Ç Lynx ¤ËÌá¤ê¤Þ¤¹ "
+
+#. #define ANY_KEY_CHANGE_RET_ACCEPT
+#: LYMessages.c:603
+msgid "Hit any key to change value; RETURN to accept."
+msgstr "²¿¤«¥­¡¼¤ò²¡¤·¤ÆÃͤòÊѤ¨¤Æ¤¯¤À¤µ¤¤¡£¥ê¥¿¡¼¥ó¤ÇÅÐÏ¿"
+
+#: LYMessages.c:604
+msgid "Error uncompressing temporary file!"
+msgstr "°ì»þ¥Õ¥¡¥¤¥ë¤ÎŸ³«¤Ç¥¨¥é¡¼¤¬È¯À¸¤·¤Þ¤·¤¿!"
+
+#: LYMessages.c:605
+msgid "Unsupported URL scheme!"
+msgstr "¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Ê¤¤ URL ¥¹¥­¡¼¥à¤Ç¤¹!"
+
+#: LYMessages.c:606
+msgid "Unsupported data: URL! Use SHOWINFO, for now."
+msgstr "¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Ê¤¤¥Ç¡¼¥¿: URL! ¤È¤ê¤¢¤¨¤º SHOWINFO ¤ò»È¤Ã¤Æ¤¯¤À¤µ¤¤¡£"
+
+#: LYMessages.c:607
+msgid "Redirection limit of 10 URL's reached."
+msgstr "¥ê¥À¥¤¥ì¥¯¥·¥ç¥óÀ©¸Â (10 URL) ¤ËÅþ㤷¤Þ¤·¤¿¡£"
+
+#: LYMessages.c:608
+msgid "Illegal redirection URL received from server!"
+msgstr "¥µ¡¼¥Ð¤«¤éÉÔÀµ¤Ê¥ê¥À¥¤¥ì¥¯¥·¥ç¥ó URL ¤ò¼õ¿®¤·¤Þ¤·¤¿!"
+
+#. #define SERVER_ASKED_FOR_REDIRECTION
+#: LYMessages.c:610
+#, c-format
+msgid "Server asked for %d redirection of POST content to"
+msgstr "¥µ¡¼¥Ð¤Ï POST ¥³¥ó¥Æ¥ó¥È¤Î°Ê²¼¤Ø¤Î %d ¥ê¥À¥¤¥ì¥¯¥·¥ç¥ó¤òÍ׵ᤷ¤Þ¤·¤¿: "
+
+#: LYMessages.c:613
+msgid "P)roceed, use G)ET or C)ancel "
+msgstr "[p]¤Ç³¹Ô¡¢[g]GET¤ò»È¤¦¡¢[c]¥­¥ã¥ó¥»¥ë"
+
+#: LYMessages.c:614
+msgid "P)roceed, or C)ancel "
+msgstr "[p]¤Ç³¹Ô¡¢¤Þ¤¿¤Ï [c]¥­¥ã¥ó¥»¥ë"
+
+#. #define ADVANCED_POST_GET_REDIRECT
+#: LYMessages.c:616
+msgid "Redirection of POST content. P)roceed, see U)RL, use G)ET or C)ancel"
+msgstr "POST ¥³¥ó¥Æ¥ó¥È¤Î¥ê¥À¥¤¥ì¥¯¥·¥ç¥ó [p]³¹Ô [u]URL¤ò¸«¤ë [g]GET¤ò»È¤¦ [c]¥­¥ã¥ó¥»¥ë"
+
+#. #define ADVANCED_POST_REDIRECT
+#: LYMessages.c:618
+msgid "Redirection of POST content. P)roceed, see U)RL, or C)ancel"
+msgstr "POST ¥³¥ó¥Æ¥ó¥È¤Î¥ê¥À¥¤¥ì¥¯¥·¥ç¥ó [p]³¹Ô [u]URL¤ò¸«¤ë [c]¥­¥ã¥ó¥»¥ë"
+
+#. #define CONFIRM_POST_RESUBMISSION
+#: LYMessages.c:620
+msgid "Document from Form with POST content. Resubmit?"
+msgstr "POST ¥³¥ó¥Æ¥ó¥È¤ò»ý¤Ä¥Õ¥©¡¼¥à¤«¤é¤Î¥É¥­¥å¥á¥ó¥È¤Ç¤¹¡£ºÆÁ÷¿®¤·¤Þ¤¹¤«?"
+
+#. #define CONFIRM_POST_RESUBMISSION_TO
+#: LYMessages.c:622
+#, c-format
+msgid "Resubmit POST content to %s ?"
+msgstr "POST ¥³¥ó¥Æ¥ó¥È¤ò %s ¤ËºÆÁ÷¿®¤·¤Þ¤¹¤«?"
+
+#. #define CONFIRM_POST_LIST_RELOAD
+#: LYMessages.c:624
+#, c-format
+msgid "List from document with POST data. Reload %s ?"
+msgstr "POST ¥Ç¡¼¥¿¤ò»ý¤Ä¥É¥­¥å¥á¥ó¥È¤«¤é¤Î¥ê¥¹¥È¤Ç¤¹¡£%s ¤òºÆÆɤ߹þ¤ß¤·¤Þ¤¹¤«?"
+
+#. #define CONFIRM_POST_DOC_HEAD
+#: LYMessages.c:626
+msgid "Document from POST action, HEAD may not be understood. Proceed?"
+msgstr "POST ¥¢¥¯¥·¥ç¥ó¤«¤é¤Îʸ½ñ¤Ç¤¹¤¬¡¢HEAD ¤ÏÍý²ò¤µ¤ì¤Æ¤¤¤Ê¤¤¤«¤â¤·¤ì¤Þ¤»¤ó¡£Â³¹Ô¤·¤Þ¤¹¤«?"
+
+#. #define CONFIRM_POST_LINK_HEAD
+#: LYMessages.c:628
+msgid "Form submit action is POST, HEAD may not be understood. Proceed?"
+msgstr "¥Õ¥©¡¼¥àÁ÷¿®¥¢¥¯¥·¥ç¥ó¤Ï POST ¤Ç¤¹¤¬¡¢HEAD ¤ÏÍý²ò¤µ¤ì¤Æ¤¤¤Ê¤¤¤«¤â¤·¤ì¤Þ¤»¤ó¡£Â³¹Ô¤·¤Þ¤¹¤«?"
+
+#: LYMessages.c:629
+msgid "Proceed without a username and password?"
+msgstr "¥æ¡¼¥¶Ì¾¤â¥Ñ¥¹¥ï¡¼¥É¤â̵¤·¤Ç³¹Ô¤·¤Þ¤¹¤«?"
+
+#: LYMessages.c:630
+#, c-format
+msgid "Proceed (%s)?"
+msgstr "³¹Ô¤·¤Þ¤¹¤« (%s)?"
+
+#: LYMessages.c:631
+msgid "Cannot POST to this host."
+msgstr "¤³¤Î¥Û¥¹¥È¤Ë¤Ï POST ¤Ç¤­¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:632
+msgid "POST not supported for this URL - ignoring POST data!"
+msgstr "¤³¤Î URL ¤Î¤¿¤á¤Î POST ¤Ï¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£POST ¥Ç¡¼¥¿¤Ï̵»ë¤µ¤ì¤Þ¤¹!"
+
+#: LYMessages.c:633
+msgid "Discarding POST data..."
+msgstr "POST ¥Ç¡¼¥¿¤òÇÑ´þ¤·¤Æ¤¤¤Þ¤¹..."
+
+#: LYMessages.c:634
+msgid "Document will not be reloaded!"
+msgstr "ʸ½ñ¤ÏºÆÆɤ߹þ¤ß¤µ¤ì¤Þ¤»¤ó!"
+
+#: LYMessages.c:635
+msgid "Location: "
+msgstr "¾ì½ê: "
+
+#: LYMessages.c:636
+#, c-format
+msgid "'%s' not found!"
+msgstr "'%s' ¤Ï¸«¤Ä¤«¤ê¤Þ¤»¤ó¤Ç¤·¤¿!"
+
+#: LYMessages.c:637
+msgid "Default Bookmark File"
+msgstr "¥Ç¥Õ¥©¥ë¥È¥Ö¥Ã¥¯¥Þ¡¼¥¯¥Õ¥¡¥¤¥ë"
+
+#: LYMessages.c:638
+msgid "Screen too small! (8x35 min)"
+msgstr "¥¹¥¯¥ê¡¼¥ó¤¬¾®¤µ¤¹¤®¤Þ¤¹!!! (ºÇÄã 8x35 ɬÍפǤ¹)"
+
+#: LYMessages.c:639
+msgid "Select destination or ^G to Cancel: "
+msgstr "¥Õ¥¡¥¤¥ë¤òÁªÂò¤·¤Æ¤¯¤À¤µ¤¤ (^G ¤Ç¥­¥ã¥ó¥»¥ë): "
+
+#. #define MULTIBOOKMARKS_SELECT
+#: LYMessages.c:641
+msgid "Select subbookmark, '=' for menu, or ^G to cancel: "
+msgstr "¥Ö¥Ã¥¯¥Þ¡¼¥¯¤òÁªÂò [=] ¥á¥Ë¥å¡¼ [^g] ¥­¥ã¥ó¥»¥ë: "
+
+#. #define MULTIBOOKMARKS_SELF
+#: LYMessages.c:643
+msgid "Reproduce L)ink in this bookmark file or C)ancel? (l,c): "
+msgstr "[l]¤³¤Î¥Ö¥Ã¥¯¥Þ¡¼¥¯¥Õ¥¡¥¤¥ëÆâ¤Ç¥ê¥ó¥¯¤òºÆÀ½ ([c]¥­¥ã¥ó¥»¥ë): "
+
+#: LYMessages.c:644
+msgid "Multiple bookmark support is not available."
+msgstr "¥Þ¥ë¥Á¥Ö¥Ã¥¯¥Þ¡¼¥¯¤Ï¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:645
+#, c-format
+msgid " Select Bookmark (screen %d of %d)"
+msgstr "¥Ö¥Ã¥¯¥Þ¡¼¥¯¤òÁªÂò (¥Ú¡¼¥¸ %d¡¢Á´ %d ¥Ú¡¼¥¸)"
+
+#: LYMessages.c:646
+msgid " Select Bookmark"
+msgstr " ¥Ö¥Ã¥¯¥Þ¡¼¥¯¤òÁªÂò"
+
+#. #define MULTIBOOKMARKS_EHEAD_MASK
+#: LYMessages.c:648
+#, c-format
+msgid "Editing Bookmark DESCRIPTION and FILEPATH (%d of 2)"
+msgstr "¥Ö¥Ã¥¯¥Þ¡¼¥¯¤ÎÀâÌÀ¤È¥Õ¥¡¥¤¥ë¤Ø¤Î¥Ñ¥¹¤òÊÔ½¸ (2 ¤Î %d) "
+
+#. #define MULTIBOOKMARKS_EHEAD
+#: LYMessages.c:650
+msgid " Editing Bookmark DESCRIPTION and FILEPATH"
+msgstr "¥Ö¥Ã¥¯¥Þ¡¼¥¯¤ÎÀâÌÀ¤È¥Õ¥¡¥¤¥ë̾¤òÊÔ½¸"
+
+#: LYMessages.c:651
+msgid "Letter: "
+msgstr "ʸ»ú¤òÆþÎÏ: "
+
+#. #define USE_PATH_OFF_HOME
+#: LYMessages.c:654
+msgid "Use a filepath off your login directory in SHELL syntax!"
+msgstr "SHELL ¹½Ê¸¤Ç¤Ï¤¢¤Ê¤¿¤Î¥í¥°¥¤¥ó¥Ç¥£¥ì¥¯¥È¥ê¤ò½ü¤¤¤¿¥Õ¥¡¥¤¥ë¥Ñ¥¹¤ò»ØÄꤷ¤Æ¤¯¤À¤µ¤¤!"
+
+#: LYMessages.c:656
+msgid "Use a filepath off your home directory!"
+msgstr "¤¢¤Ê¤¿¤Î¥Û¡¼¥à¥Ç¥£¥ì¥¯¥È¥ê¤ò½ü¤¤¤¿¥Õ¥¡¥¤¥ë¥Ñ¥¹¤ò»ØÄꤷ¤Æ¤¯¤À¤µ¤¤!"
+
+#. #define MAXLINKS_REACHED
+#: LYMessages.c:659
+msgid "Maximum links per page exceeded! Use half-page or two-line scrolling."
+msgstr "°ì¥Ú¡¼¥¸¤¢¤¿¤ê¤Î¥ê¥ó¥¯¤ÎºÇÂç¿ô¤òĶ¤¨¤Þ¤·¤¿! Ⱦ¥Ú¡¼¥¸¤Ê¤¤¤·Æó¹Ôñ°Ì¤Î¥¹¥¯¥í¡¼¥ë¤ò»È¤Ã¤Æ¤¯¤À¤µ¤¤¡£"
+
+#: LYMessages.c:660
+msgid "No previously visited links available!"
+msgstr "°ÊÁ°¤Ëˬ¤Í¤¿¥ê¥ó¥¯¤Ï°ì¤Ä¤â¤¢¤ê¤Þ¤»¤ó!"
+
+#: LYMessages.c:661
+msgid "Memory exhausted! Program aborted!"
+msgstr "¥á¥â¥ê¤ò»È¤¤¤­¤ê¤Þ¤·¤¿! ¥×¥í¥°¥é¥à¤¬ÃæÃǤµ¤ì¤Þ¤·¤¿!"
+
+#: LYMessages.c:662
+msgid "Memory exhausted! Aborting..."
+msgstr "¥á¥â¥ê¤ò»È¤¤¤­¤ê¤Þ¤·¤¿! ½ªÎ»¤·¤Þ¤¹..."
+
+#: LYMessages.c:663
+msgid "Not enough memory!"
+msgstr "¥á¥â¥ê¤¬Â­¤ê¤Þ¤»¤ó!"
+
+#: LYMessages.c:664
+msgid "Directory/File Manager not available"
+msgstr "¥Ç¥£¥ì¥¯¥È¥ê/¥Õ¥¡¥¤¥ë¥Þ¥Í¡¼¥¸¥ã¤ÏÍøÍѤǤ­¤Þ¤»¤ó"
+
+#: LYMessages.c:665
+msgid "HREF in BASE tag is not an absolute URL."
+msgstr "BASE ¥¿¥°Ãæ¤Î HREF ¤ÏÀäÂÐ URL ¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:666
+msgid "Location URL is not absolute."
+msgstr "¥í¥±¡¼¥·¥ç¥ó URL ¤ÏÀäÂÐŪ¤Ê¤â¤Î¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:667
+msgid "Refresh URL is not absolute."
+msgstr "¥ê¥Õ¥ì¥Ã¥·¥å URL ¤ÏÀäÂÐŪ¤Ê¤â¤Î¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£"
+
+#. #define SENDING_MESSAGE_WITH_BODY_TO
+#: LYMessages.c:669
+msgid ""
+"You are sending a message with body to:\n"
+" "
+msgstr ""
+"ËÜʸ¤ò´Þ¤à¥á¥Ã¥»¡¼¥¸¤ò°Ê²¼¤ØÁ÷¤í¤¦¤È¤·¤Æ¤¤¤Þ¤¹:\n"
+" "
+
+#: LYMessages.c:670
+msgid ""
+"You are sending a comment to:\n"
+" "
+msgstr ""
+"°Ê²¼¤Î¥¢¥É¥ì¥¹¤Ë¥³¥á¥ó¥È¤òÁ÷¤ê¤Þ¤¹:\n"
+" "
+
+#: LYMessages.c:671
+msgid ""
+"\n"
+" With copy to:\n"
+" "
+msgstr ""
+"\n"
+" °Ê²¼¤Ø¤â¥³¥Ô¡¼¤òÁ÷¤ê¤Þ¤¹:\n"
+" "
+
+#: LYMessages.c:672
+msgid ""
+"\n"
+" With copies to:\n"
+" "
+msgstr ""
+"\n"
+" °Ê²¼¤Ø¤â¥³¥Ô¡¼¤òÁ÷¤ê¤Þ¤¹:\n"
+" "
+
+#. #define CTRL_G_TO_CANCEL_SEND
+#: LYMessages.c:674
+msgid ""
+"\n"
+"\n"
+"Use Ctrl-G to cancel if you do not want to send a message\n"
+msgstr ""
+"\n"
+"\n"
+"Ctrl-G ¤Ç¥á¥Ã¥»¡¼¥¸Á÷¿®¤òÃæ»ß¤·¤Þ¤¹\n"
+
+#. #define ENTER_NAME_OR_BLANK
+#: LYMessages.c:676
+msgid ""
+"\n"
+" Please enter your name, or leave it blank to remain anonymous\n"
+msgstr ""
+"\n"
+"¤¢¤Ê¤¿¤Î¤ªÌ¾Á°¤òÆþÎϤ·¤Æ¤¯¤À¤µ¤¤¡£¶õÇò¤Î¤Þ¤Þ¤À¤Èƿ̾¤Ë¤Ê¤ê¤Þ¤¹\n"
+
+#. #define ENTER_MAIL_ADDRESS_OR_OTHER
+#: LYMessages.c:678
+msgid ""
+"\n"
+" Please enter a mail address or some other\n"
+msgstr ""
+"\n"
+" ÊÖ»ö¤ò´õ˾¤¹¤ë¾ì¹ç¤Ï¡¢¥á¡¼¥ë¥¢¥É¥ì¥¹¤«¡¢¤½¤Î¾¤Î\n"
+
+#. #define MEANS_TO_CONTACT_FOR_RESPONSE
+#: LYMessages.c:680
+msgid " means to contact you, if you desire a response.\n"
+msgstr " Ï¢Íí¼êÃʤò¤³¤³¤Ç»ØÄꤷ¤Æ¤¯¤À¤µ¤¤¡£\n"
+
+#: LYMessages.c:681
+msgid ""
+"\n"
+" Please enter a subject line.\n"
+msgstr ""
+"\n"
+" ¥µ¥Ö¥¸¥§¥¯¥È¤òÆþÎϤ·¤Æ¤¯¤À¤µ¤¤¡£\n"
+
+#. #define ENTER_ADDRESS_FOR_CC
+#: LYMessages.c:683
+msgid ""
+"\n"
+" Enter a mail address for a CC of your message.\n"
+msgstr ""
+"\n"
+" ¤¢¤Ê¤¿¤Î¥á¥Ã¥»¡¼¥¸¤ò CC ¤¹¤ë¥á¡¼¥ë¥¢¥É¥ì¥¹¤òÆþÎϤ·¤Æ¤¯¤À¤µ¤¤¡£\n"
+
+#: LYMessages.c:684
+msgid " (Leave blank if you don't want a copy.)\n"
+msgstr " (¤â¤·¥³¥Ô¡¼¤·¤¿¤¯¤Ê¤±¤ì¤Ð¶õÇò¤Î¤Þ¤Þ¤Ë¤·¤Æ¤ª¤¤¤Æ¤¯¤À¤µ¤¤)\n"
+
+#: LYMessages.c:685
+msgid ""
+"\n"
+" Please review the message body:\n"
+"\n"
+msgstr ""
+"\n"
+" ¥á¥Ã¥»¡¼¥¸ËÜʸ¤ò³Îǧ¤·¤Æ²¼¤µ¤¤:\n"
+"\n"
+
+#: LYMessages.c:686
+msgid ""
+"\n"
+"Press RETURN to continue: "
+msgstr ""
+"\n"
+"³¤±¤ë¤Ë¤Ï¥ê¥¿¡¼¥ó¥­¡¼¤ò²¡¤·¤Æ²¼¤µ¤¤: "
+
+#: LYMessages.c:687
+msgid ""
+"\n"
+"Press RETURN to clean up: "
+msgstr ""
+"\n"
+"Á´¤Æºï½ü¤¹¤ë¤Ë¤Ï¥ê¥¿¡¼¥ó¥­¡¼¤ò²¡¤·¤Æ²¼¤µ¤¤: "
+
+#: LYMessages.c:688
+msgid " Use Control-U to erase the default.\n"
+msgstr "Ctrl-U ¤Ç¥Ç¥Õ¥©¥ë¥ÈÃͤòºï½ü¤·¤Þ¤¹¡£\n"
+
+#: LYMessages.c:689
+msgid ""
+"\n"
+" Please enter your message below."
+msgstr ""
+"\n"
+" ¤¢¤Ê¤¿¤Î¥á¥Ã¥»¡¼¥¸¤ò°Ê²¼¤ËÆþÎϤ·¤Æ¤¯¤À¤µ¤¤¡£"
+
+#. #define ENTER_PERIOD_WHEN_DONE_A
+#: LYMessages.c:691 src/LYNews.c:357
+msgid ""
+"\n"
+" When you are done, press enter and put a single period (.)"
+msgstr ""
+"\n"
+" ½ª¤ï¤Ã¤¿¤é¡¢²þ¹Ô¥­¡¼¤ò²¡¤·¤Æ¤½¤Î¹Ô¤Ë¥Ô¥ê¥ª¥É (.) ¤ò°ì¤Ä"
+
+#. #define ENTER_PERIOD_WHEN_DONE_B
+#: LYMessages.c:693 src/LYNews.c:358
+msgid ""
+"\n"
+" on a line and press enter again."
+msgstr ""
+"\n"
+" ÆþÎϤ·¡¢¤â¤¦°ìÅÙ²þ¹Ô¥­¡¼¤ò²¡¤·¤Æ²¼¤µ¤¤¡£"
+
+#. Cookies messages
+#. #define ADVANCED_COOKIE_CONFIRMATION
+#: LYMessages.c:697
+#, c-format
+msgid "%s cookie: %.*s=%.*s Allow? (Y/N/Always/neVer)"
+msgstr "%s ¤«¤é¤Î¥¯¥Ã¥­¡¼: %.*s=%.*s ¼õ¤±ÉÕ¤±¤Þ¤¹¤«? (Y/N/Always/neVer)"
+
+#. #define INVALID_COOKIE_DOMAIN_CONFIRMATION
+#: LYMessages.c:699
+#, c-format
+msgid "Accept invalid cookie domain=%s for '%s'?"
+msgstr "ÉÔÀµ¤Ê¥¯¥Ã¥­¡¼¥É¥á¥¤¥ó= %s ¤ò %s ¤È¤·¤Æ¼õ¤±ÉÕ¤±¤Þ¤¹¤«?"
+
+#. #define INVALID_COOKIE_PATH_CONFIRMATION
+#: LYMessages.c:701
+#, c-format
+msgid "Accept invalid cookie path=%s as a prefix of '%s'?"
+msgstr "ÉÔÀµ¤Ê¥¯¥Ã¥­¡¼¥Ñ¥¹ = %s ¤ò %s ¤Î¥×¥ê¥Õ¥£¥Ã¥¯¥¹¤È¤·¤Æ¼õ¤±ÉÕ¤±¤Þ¤¹¤«? "
+
+#: LYMessages.c:702
+msgid "Allowing this cookie."
+msgstr "¤³¤Î¥¯¥Ã¥­¡¼¤ò¼õ¤±ÉÕ¤±¤Þ¤¹¡£"
+
+#: LYMessages.c:703
+msgid "Rejecting this cookie."
+msgstr "¤³¤Î¥¯¥Ã¥­¡¼¤òµñÈݤ·¤Þ¤¹¡£"
+
+#: LYMessages.c:704
+msgid "The Cookie Jar is empty."
+msgstr "¥¯¥Ã¥­¡¼È¢¤Ï¶õ¤Ã¤Ý¤Ç¤¹¡£"
+
+#: LYMessages.c:705
+#, fuzzy
+msgid "The Cache Jar is empty."
+msgstr "¥¯¥Ã¥­¡¼È¢¤Ï¶õ¤Ã¤Ý¤Ç¤¹¡£"
+
+#. #define ACTIVATE_TO_GOBBLE
+#: LYMessages.c:707
+msgid "Activate links to gobble up cookies or entire domains,"
+msgstr "¥ê¥ó¥¯¤òé¤ë¤È¡¢¥¯¥Ã¥­¡¼¤ä¥É¥á¥¤¥óÁ´ÂΤò¡Ö¿©¤Ù¡×¤¿¤ê¡¢"
+
+#: LYMessages.c:708
+msgid "or to change a domain's 'allow' setting."
+msgstr "¥É¥á¥¤¥ó¤´¤È¤Î¥¯¥Ã¥­¡¼¼õ¤±ÉÕ¤±ÀßÄê¤òÊѤ¨¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£"
+
+#: LYMessages.c:709
+msgid "(Cookies never allowed.)"
+msgstr "(¥¯¥Ã¥­¡¼¤ò¾ï¤ËµñÈݤ·¤Þ¤¹)"
+
+#: LYMessages.c:710
+msgid "(Cookies always allowed.)"
+msgstr "(¥¯¥Ã¥­¡¼¤ò¾ï¤Ë¼õ¤±ÉÕ¤±¤Þ¤¹)"
+
+#: LYMessages.c:711
+msgid "(Cookies allowed via prompt.)"
+msgstr "(¥¯¥Ã¥­¡¼¼õ¤±ÉÕ¤±¤Ï¤½¤Î¤Ä¤ÉȽÃǤ·¤Þ¤¹)"
+
+#: LYMessages.c:712
+msgid "(Persistent Cookies.)"
+msgstr "(±Ê³Ū¤Ê¥¯¥Ã¥­¡¼)"
+
+#: LYMessages.c:713
+msgid "(No title.)"
+msgstr "(¥¿¥¤¥È¥ë¤Ê¤·)"
+
+#: LYMessages.c:714
+msgid "(No name.)"
+msgstr "(̾Á°¤Ê¤·)"
+
+#: LYMessages.c:715
+msgid "(No value.)"
+msgstr "(Ãͤʤ·)"
+
+#: LYMessages.c:716 src/LYOptions.c:2402
+msgid "None"
+msgstr "¤Ê¤·"
+
+#: LYMessages.c:717
+msgid "(End of session.)"
+msgstr "(¥»¥Ã¥·¥ç¥ó¤Î½ª¤ï¤ê)"
+
+#: LYMessages.c:718
+msgid "Delete this cookie?"
+msgstr "¤³¤Î¥¯¥Ã¥­¡¼¤òºï½ü¤·¤Þ¤¹¤«?"
+
+#: LYMessages.c:719
+msgid "The cookie has been eaten!"
+msgstr "¥¯¥Ã¥­¡¼¤Ï¿©¤Ù¤é¤ì¤Æ¤·¤Þ¤¤¤Þ¤·¤¿!"
+
+#: LYMessages.c:720
+msgid "Delete this empty domain?"
+msgstr "¤³¤Î¶õ¤Ë¤Ê¤Ã¤¿¥É¥á¥¤¥ó¤òºï½ü¤·¤Þ¤¹¤«?"
+
+#: LYMessages.c:721
+msgid "The domain has been eaten!"
+msgstr "¥É¥á¥¤¥ó¤Ï¿©¤Ù¤é¤ì¤Æ¤·¤Þ¤¤¤Þ¤·¤¿!"
+
+#. #define DELETE_COOKIES_SET_ALLOW_OR_CANCEL
+#: LYMessages.c:723
+msgid "D)elete domain's cookies, set allow A)lways/P)rompt/neV)er, or C)ancel? "
+msgstr "¥É¥á¥¤¥ó¤Î¥¯¥Ã¥­¡¼¤ò[d]ºï½ü¡¢¾ï¤Ë[a]¼õÉÕ[v]µñÈÝ¡¢[p]ȽÃÇ ([c]¥­¥ã¥ó¥»¥ë)? "
+
+#. #define DELETE_DOMAIN_SET_ALLOW_OR_CANCEL
+#: LYMessages.c:725
+msgid "D)elete domain, set allow A)lways/P)rompt/neV)er, or C)ancel? "
+msgstr "¥É¥á¥¤¥ó¤ò[d]ºï½ü¡¢¾ï¤Ë[a]¼õÉÕ[v]µñÈÝ¡¢[p]ȽÃÇ ([c]¥­¥ã¥ó¥»¥ë)? "
+
+#: LYMessages.c:726
+msgid "All cookies in the domain have been eaten!"
+msgstr "¥É¥á¥¤¥ó¤Î¥¯¥Ã¥­¡¼¤Ï¤¹¤Ù¤Æ¿©¤Ù¤é¤ì¤Æ¤·¤Þ¤¤¤Þ¤·¤¿!"
+
+#: LYMessages.c:727
+#, c-format
+msgid "'A'lways allowing from domain '%s'."
+msgstr "¥É¥á¥¤¥ó %s ¤«¤é¤Ï¾ï¤Ë¼õ¤±ÉÕ¤±¤Þ¤¹¡£"
+
+#: LYMessages.c:728
+#, c-format
+msgid "ne'V'er allowing from domain '%s'."
+msgstr "¥É¥á¥¤¥ó %s ¤«¤é¤ÏÁ´¤ÆµñÈݤ·¤Þ¤¹¡£"
+
+#: LYMessages.c:729
+#, c-format
+msgid "'P'rompting to allow from domain '%s'."
+msgstr "¥É¥á¥¤¥ó %s ¤«¤é¤Ï¤½¤Î¤Ä¤ÉȽÃǤ·¤Þ¤¹¡£"
+
+#: LYMessages.c:730
+msgid "Delete all cookies in this domain?"
+msgstr "¤³¤Î¥É¥á¥¤¥ó¤Î¥¯¥Ã¥­¡¼¤ò¤¹¤Ù¤Æºï½ü¤·¤Þ¤¹¤«?"
+
+#: LYMessages.c:731
+msgid "All of the cookies in the jar have been eaten!"
+msgstr "¥¯¥Ã¥­¡¼È¢¤Î¥¯¥Ã¥­¡¼¤Ï¤ß¤ó¤Ê¿©¤Ù¤é¤ì¤Æ¤·¤Þ¤¤¤Þ¤·¤¿!"
+
+#: LYMessages.c:733
+msgid "Port 19 not permitted in URLs."
+msgstr "¥Ý¡¼¥È 19 ¤ò URL ¤Ç»ØÄꤹ¤ë¤³¤È¤Ïǧ¤á¤é¤ì¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:734
+msgid "Port 25 not permitted in URLs."
+msgstr "¥Ý¡¼¥È 25 ¤ò URL ¤Ç»ØÄꤹ¤ë¤³¤È¤Ïǧ¤á¤é¤ì¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:735
+#, c-format
+msgid "Port %lu not permitted in URLs."
+msgstr "¥Ý¡¼¥È %lu ¤ò URL ¤Ç»ØÄꤹ¤ë¤³¤È¤Ïǧ¤á¤é¤ì¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:736
+msgid "URL has a bad port field."
+msgstr "URL ¤ËÉÔÀµ¤Ê¥Ý¡¼¥È¥Õ¥£¡¼¥ë¥É¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£"
+
+#: LYMessages.c:737
+msgid "Maximum nesting of HTML elements exceeded."
+msgstr "HTML ¥¨¥ì¥á¥ó¥È¤Î¥Í¥¹¥Æ¥£¥ó¥°¤¬¸Â³¦¤òĶ¤¨¤Þ¤·¤¿¡£"
+
+#: LYMessages.c:738
+msgid "Bad partial reference! Stripping lead dots."
+msgstr "ÉÔÀµ¤ÊÉôʬŪ»²¾È¤Ç¤¹! ÀèƬ¥É¥Ã¥È¤òºï¤ê¤Þ¤¹¡£"
+
+#: LYMessages.c:739
+msgid "Trace Log open failed. Trace off!"
+msgstr "ÄÉÀ×¥í¥°¤ò³«¤¯¤Î¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡£ÄÉÀ×½ªÎ»!"
+
+#: LYMessages.c:740
+msgid "Lynx Trace Log"
+msgstr "Lynx ÄÉÀ×¥í¥°"
+
+#: LYMessages.c:741
+msgid "No trace log has been started for this session."
+msgstr "¤³¤Î¥»¥Ã¥·¥ç¥ó¤Ç³«»Ï¤µ¤ì¤¿ÄÉÀ×¥í¥°¤Ï¤¢¤ê¤Þ¤»¤ó¡£"
+
+#. #define MAX_TEMPCOUNT_REACHED
+#: LYMessages.c:743
+msgid "The maximum temporary file count has been reached!"
+msgstr "°ì»þŪ¥Õ¥¡¥¤¥ë¿ô¤¬¸Â³¦¤ò±Û¤¨¤Þ¤·¤¿!"
+
+#. #define FORM_VALUE_TOO_LONG
+#: LYMessages.c:745
+msgid "Form field value exceeds buffer length! Trim the tail."
+msgstr "¥Õ¥©¡¼¥à¥Õ¥£¡¼¥ë¥É¤ÎÃͤ¬¥Ð¥Ã¥Õ¥¡¤ÎŤµ¤ò±Û¤¨¤Þ¤·¤¿¡£½ªÃ¼¤òÀÚ¤ê¤Þ¤¹¡£"
+
+#. #define FORM_TAIL_COMBINED_WITH_HEAD
+#: LYMessages.c:747
+msgid "Modified tail combined with head of form field value."
+msgstr "½ªÃ¼¤ò¥Õ¥©¡¼¥à¥Õ¥£¡¼¥ë¥É¤ÎÃͤÎÀèƬ¤È·ë¹ç¤¹¤ë¤è¤¦Êѹ¹¤·¤Þ¤·¤¿¡£"
+
+#. HTFile.c
+#: LYMessages.c:750
+msgid "Directory"
+msgstr "¥Ç¥£¥ì¥¯¥È¥ê"
+
+#: LYMessages.c:751
+msgid "Directory browsing is not allowed."
+msgstr "¥Ç¥£¥ì¥¯¥È¥ê±ÜÍ÷¤Ïµö²Ä¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:752
+msgid "Selective access is not enabled for this directory"
+msgstr "ÁªÂòŪ¥¢¥¯¥»¥¹¤Ï¤³¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ç¤Ï»È¤¨¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:753
+msgid "Multiformat: directory scan failed."
+msgstr "¥Þ¥ë¥Á¥Õ¥©¡¼¥Þ¥Ã¥È: ¥Ç¥£¥ì¥¯¥È¥ê¤Î¥¹¥­¥ã¥ó¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡£"
+
+#: LYMessages.c:754
+msgid "This directory is not readable."
+msgstr "¤³¤Î¥Ç¥£¥ì¥¯¥È¥ê¤ÏÆɤá¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:755
+msgid "Can't access requested file."
+msgstr "Í׵ᤵ¤ì¤¿¥Õ¥¡¥¤¥ë¤Ë¥¢¥¯¥»¥¹¤Ç¤­¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:756
+msgid "Could not find suitable representation for transmission."
+msgstr "ÅÁ㤹¤ëŬÅö¤Êɽ¸½¤ò¸«¤Ä¤±¤é¤ì¤Þ¤»¤ó¤Ç¤·¤¿¡£"
+
+#: LYMessages.c:757
+msgid "Could not open file for decompression!"
+msgstr "Ÿ³«¤¹¤ë¥Õ¥¡¥¤¥ë¤¬³«¤±¤Þ¤»¤ó!"
+
+#: LYMessages.c:758
+msgid "Files:"
+msgstr "¥Õ¥¡¥¤¥ë:"
+
+#: LYMessages.c:759
+msgid "Subdirectories:"
+msgstr "¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê:"
+
+#: LYMessages.c:760
+msgid " directory"
+msgstr " ¥Ç¥£¥ì¥¯¥È¥ê"
+
+#: LYMessages.c:761
+msgid "Up to "
+msgstr "°Ê²¼¤Þ¤Ç: "
+
+#: LYMessages.c:762
+msgid "Current directory is "
+msgstr "¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ï "
+
+#. HTGopher.c
+#: LYMessages.c:765
+msgid "No response from server!"
+msgstr "¥µ¡¼¥Ð¤«¤é±þÅú¤¬¤¢¤ê¤Þ¤»¤ó!"
+
+#: LYMessages.c:766
+msgid "CSO index"
+msgstr "CSO ¥¤¥ó¥Ç¥Ã¥¯¥¹"
+
+#: LYMessages.c:767
+msgid ""
+"\n"
+"This is a searchable index of a CSO database.\n"
+msgstr ""
+"\n"
+"¤³¤ì¤ÏCSO¥Ç¡¼¥¿¥Ù¡¼¥¹¤Î¸¡º÷²Äǽ¤Ê¥¤¥ó¥Ç¥Ã¥¯¥¹¤Ç¤¹¡£\n"
+
+#: LYMessages.c:768
+msgid "CSO Search Results"
+msgstr "CSO ¸¡º÷·ë²Ì"
+
+#: LYMessages.c:769
+#, c-format
+msgid "Seek fail on %s\n"
+msgstr "%s ¤Ç¸¡º÷¤Ë¼ºÇÔ\n"
+
+#: LYMessages.c:770
+msgid ""
+"\n"
+"Press the 's' key and enter search keywords.\n"
+msgstr ""
+"\n"
+" 's' ¥­¡¼¤ò²¡¤·¤Æ¸¡º÷¤¹¤ë¥­¡¼¥ï¡¼¥É¤òÆþÎϤ·¤Æ²¼¤µ¤¤¡£\n"
+
+#: LYMessages.c:771
+msgid ""
+"\n"
+"This is a searchable Gopher index.\n"
+msgstr ""
+"\n"
+"¤³¤ì¤Ï¸¡º÷²Äǽ¤Ê Gopher ¥¤¥ó¥Ç¥Ã¥¯¥¹¤Ç¤¹¡£\n"
+
+#: LYMessages.c:772
+msgid "Gopher index"
+msgstr "Gopher ¥¤¥ó¥Ç¥Ã¥¯¥¹"
+
+#: LYMessages.c:773
+msgid "Gopher Menu"
+msgstr "Gopher ¥á¥Ë¥å¡¼"
+
+#: LYMessages.c:774
+msgid " Search Results"
+msgstr " ¸¡º÷·ë²Ì"
+
+#: LYMessages.c:775
+msgid "Sending CSO/PH request."
+msgstr "CSO/PH ¥ê¥¯¥¨¥¹¥È¤òÁ÷¿®Ãæ¡£"
+
+#: LYMessages.c:776
+msgid "Sending Gopher request."
+msgstr "Gopher ¥ê¥¯¥¨¥¹¥È¤òÁ÷¿®Ãæ¡£"
+
+#: LYMessages.c:777
+msgid "CSO/PH request sent; waiting for response."
+msgstr "CSO/PH ¥ê¥¯¥¨¥¹¥È¤òÁ÷¿®¤·¤Þ¤·¤¿¡£±þÅú¤òÂԤäƤ¤¤Þ¤¹¡£"
+
+#: LYMessages.c:778
+msgid "Gopher request sent; waiting for response."
+msgstr "Gopher ¥ê¥¯¥¨¥¹¥È¤òÁ÷¿®¤·¤Þ¤·¤¿¡£±þÅú¤òÂԤäƤ¤¤Þ¤¹¡£"
+
+#: LYMessages.c:779
+msgid ""
+"\n"
+"Please enter search keywords.\n"
+msgstr ""
+"\n"
+"¸¡º÷¤¹¤ë¥­¡¼¥ï¡¼¥É¤òÆþÎϤ·¤Æ²¼¤µ¤¤¡£\n"
+
+#: LYMessages.c:780
+msgid ""
+"\n"
+"The keywords that you enter will allow you to search on a"
+msgstr ""
+"\n"
+"ÆþÎϤ·¤¿¥­¡¼¥ï¡¼¥É¤Ë¤è¤ê¡¢¥Ç¡¼¥¿¥Ù¡¼¥¹Æâ¤Î¸Ä¿Í»á̾¤ò"
+
+#: LYMessages.c:781
+msgid " person's name in the database.\n"
+msgstr "¸¡º÷¤¹¤ë¤³¤È¤¬²Äǽ¤Ë¤Ê¤ê¤Þ¤¹¡£\n"
+
+#. HTNews.c
+#: LYMessages.c:784
+msgid "Connection closed ???"
+msgstr "Àܳ¤¬ÊĤ¸¤é¤ì¤¿¤Î¤«¤â ???"
+
+#: LYMessages.c:785
+msgid "Cannot open temporary file for news POST."
+msgstr "¥Ë¥å¡¼¥¹ POST ¤Î¤¿¤á¤Î°ì»þ¥Õ¥¡¥¤¥ë¤¬³«¤±¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:786
+msgid "This client does not contain support for posting to news with SSL."
+msgstr "¤³¤Î¥¯¥é¥¤¥¢¥ó¥È¤Ç¤Ï¥Ë¥å¡¼¥¹¤ò SSL ·Ðͳ¤Ç¥Ý¥¹¥È¤¹¤ëµ¡Ç½¤¬¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£"
+
+#. HTStyle.c
+#: LYMessages.c:789
+#, c-format
+msgid "Style %d `%s' SGML:%s. Font %s %.1f point.\n"
+msgstr "¥¹¥¿¥¤¥ë %d `%s'¡¢SGML:%s¡£ ¥Õ¥©¥ó¥È %s %.1f ¥Ý¥¤¥ó¥È¡£\n"
+
+#: LYMessages.c:791
+#, c-format
+msgid "\tAlign=%d, %d tabs. (%.0f before, %.0f after)\n"
+msgstr "\tÄ´À°=%d¡¢%d ¥¿¥Ö¡£(Á°¤Ë %.0f¡¢¸å¤Ë %.0f)\n"
+
+#: LYMessages.c:792
+#, c-format
+msgid "\t\tTab kind=%d at %.0f\n"
+msgstr "\t\t¥¿¥Ö ¼ïÎà=%d (%.0f ¤Ë¤ª¤±¤ë)\n"
+
+#. HTTP.c
+#: LYMessages.c:795
+msgid "Can't proceed without a username and password."
+msgstr "¥æ¡¼¥¶Ì¾¤È¥Ñ¥¹¥ï¡¼¥É̵¤·¤Ç¤Ï³¹Ô¤Ç¤­¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:796
+msgid "Can't retry with authorization! Contact the server's WebMaster."
+msgstr "ǧ¾ÚÉÕ¤­¤ÇºÆ»î¹Ô¤Ç¤­¤Þ¤»¤ó! ¥µ¡¼¥Ð¤Î¥¦¥§¥Ö¥Þ¥¹¥¿¤ËÏ¢Íí¤·¤Æ¤¯¤À¤µ¤¤¡£"
+
+#: LYMessages.c:797
+msgid "Can't retry with proxy authorization! Contact the server's WebMaster."
+msgstr "¥×¥í¥­¥·Ç§¾ÚÉÕ¤­¤ÇºÆ»î¹Ô¤Ç¤­¤Þ¤»¤ó! ¥µ¡¼¥Ð¤Î¥¦¥§¥Ö¥Þ¥¹¥¿¤ËÏ¢Íí¤·¤Æ¤¯¤À¤µ¤¤¡£"
+
+#: LYMessages.c:798
+msgid "Retrying with proxy authorization information."
+msgstr "¥×¥í¥­¥·Ç§¾Ú¾ðÊóÉÕ¤­¤ÇºÆ»î¹Ô¤·¤Æ¤¤¤Þ¤¹¡£"
+
+#: LYMessages.c:799
+#, fuzzy, c-format
+msgid "SSL error:%s-Continue?"
+msgstr "SSL¥¨¥é¡¼: ¥Û¥¹¥È(%s) ¤¬ cert(%s) ¤È°ìÃפ·¤Þ¤»¤ó ³¤±¤Þ¤¹¤«?"
+
+#. HTWAIS.c
+#: LYMessages.c:802
+msgid "HTWAIS: Return message too large."
+msgstr "HTWAIS: ¥ê¥¿¡¼¥ó¥á¥Ã¥»¡¼¥¸¤¬Â礭¤¹¤®¤Þ¤¹¡£"
+
+#: LYMessages.c:803
+msgid "Enter WAIS query: "
+msgstr "WAIS ¸¡º÷ʸ»úÎó¤òÆþÎÏ: "
+
+#. Miscellaneous status
+#: LYMessages.c:806
+msgid "Retrying as HTTP0 request."
+msgstr "HTTP0 ¥ê¥¯¥¨¥¹¥È¤È¤·¤ÆºÆÁ÷¿®¤·¤Æ¤¤¤Þ¤¹¡£"
+
+#: LYMessages.c:807
+#, c-format
+msgid "Transferred %d bytes"
+msgstr "%d ¥Ð¥¤¥ÈžÁ÷ºÑ"
+
+#: LYMessages.c:808
+msgid "Data transfer complete"
+msgstr "¥Ç¡¼¥¿Å¾Á÷´°Î»"
+
+#: LYMessages.c:809
+#, c-format
+msgid "Error processing line %d of %s\n"
+msgstr "%d ¹ÔÌÜ(%s Ãæ)¤Î½èÍý¤Ç¥¨¥é¡¼\n"
+
+#. Lynx internal page titles
+#: LYMessages.c:812
+msgid "Address List Page"
+msgstr "¥¢¥É¥ì¥¹¥ê¥¹¥È¥Ú¡¼¥¸"
+
+#: LYMessages.c:813
+msgid "Bookmark file"
+msgstr "¥Ö¥Ã¥¯¥Þ¡¼¥¯¥Õ¥¡¥¤¥ë"
+
+#: LYMessages.c:814
+msgid "Configuration Definitions"
+msgstr "¥³¥ó¥Ñ¥¤¥ë»þ¤ËÄêµÁ¤µ¤ì¤¿ÀßÄê"
+
+#: LYMessages.c:815
+msgid "Cookie Jar"
+msgstr "¥¯¥Ã¥­¡¼È¢"
+
+#: LYMessages.c:816
+msgid "Current Key Map"
+msgstr "¸½ºß¤Î¥­¡¼¥Þ¥Ã¥×"
+
+#: LYMessages.c:817
+msgid "File Management Options"
+msgstr "¥Õ¥¡¥¤¥ë´ÉÍý¥ª¥×¥·¥ç¥ó"
+
+#: LYMessages.c:818
+msgid "Download Options"
+msgstr "¥À¥¦¥ó¥í¡¼¥ÉÀè¤òÁªÂò"
+
+#: LYMessages.c:819
+msgid "History Page"
+msgstr "ÍúÎò¥Ú¡¼¥¸"
+
+#: LYMessages.c:820
+#, fuzzy
+msgid "Cache Jar"
+msgstr "¥¯¥Ã¥­¡¼È¢"
+
+#: LYMessages.c:821
+msgid "List Page"
+msgstr "¥ê¥¹¥È¥Ú¡¼¥¸"
+
+#: LYMessages.c:822
+msgid "Lynx.cfg Information"
+msgstr "Lynx.cfg ¤Î¾ðÊó"
+
+#: LYMessages.c:823
+msgid "Converted Mosaic Hotlist"
+msgstr "ÊÑ´¹¤µ¤ì¤¿ Mosaic ¤Î Hotlist"
+
+#: LYMessages.c:824
+msgid "Options Menu"
+msgstr "ÀßÄê¥á¥Ë¥å¡¼"
+
+#: LYMessages.c:825
+msgid "File Permission Options"
+msgstr "¥Õ¥¡¥¤¥ë¥Ñ¡¼¥ß¥Ã¥·¥ç¥ó¤ÎÀßÄê"
+
+#: LYMessages.c:826
+msgid "Printing Options"
+msgstr "°õºþ¤ÎÀßÄê"
+
+#: LYMessages.c:827
+msgid "Information about the current document"
+msgstr "¸½ºß¤Îʸ½ñ¤Ë¤Ä¤¤¤Æ¤Î¾ðÊó"
+
+#: LYMessages.c:828
+msgid "Your recent statusline messages"
+msgstr "ºÇ¶á¤Î¥¹¥Æ¡¼¥¿¥¹¥é¥¤¥ó¥á¥Ã¥»¡¼¥¸"
+
+#: LYMessages.c:829
+msgid "Upload Options"
+msgstr "¥¢¥Ã¥×¥í¡¼¥É¤ÎÀßÄê"
+
+#: LYMessages.c:830
+msgid "Visited Links Page"
+msgstr "ˬ¤ì¤¿¥ê¥ó¥¯°ìÍ÷"
+
+#. CONFIG_DEF_TITLE subtitles
+#: LYMessages.c:833
+msgid "See also"
+msgstr "¤³¤Á¤é¤â»²¾È:"
+
+#: LYMessages.c:834
+msgid "your"
+msgstr "¤¢¤Ê¤¿¤Î"
+
+#: LYMessages.c:835
+msgid "for runtime options"
+msgstr "¥é¥ó¥¿¥¤¥à¥ª¥×¥·¥ç¥ó¸þ¤±"
+
+#: LYMessages.c:836
+msgid "compile time options"
+msgstr "¥³¥ó¥Ñ¥¤¥ë»þ¤Î¥ª¥×¥·¥ç¥ó"
+
+#: LYMessages.c:837
+#, fuzzy
+msgid "color-style configuration"
+msgstr "ºÇ½é¤Ë»²¾È¤µ¤ì¤ëÀßÄê¥Õ¥¡¥¤¥ë¤Ï"
+
+#: LYMessages.c:838
+msgid "latest release"
+msgstr "ºÇ¿·ÈÇ"
+
+#: LYMessages.c:839
+msgid "pre-release version"
+msgstr "¥×¥ì¥ê¥ê¡¼¥¹ÈÇ"
+
+#: LYMessages.c:840
+msgid "development version"
+msgstr "³«È¯ÈÇ"
+
+#. #define AUTOCONF_CONFIG_CACHE
+#: LYMessages.c:842
+msgid ""
+"The following data were derived during the automatic configuration/build\n"
+"process of this copy of Lynx. When reporting a bug, please include a copy\n"
+"of this page."
+msgstr ""
+"°Ê²¼¤Î¥Ç¡¼¥¿¤Ï¤³¤Î Lynx ¤Î¥³¥Ô¡¼¤¬¼«Æ°Åª¤ËÀßÄê/¹½ÃÛ¤µ¤ì¤ë²áÄø¤Ç\n"
+"ÆÀ¤é¤ì¤¿¤â¤Î¤Ç¤¹¡£¥Ð¥°¤òÊó¹ð¤¹¤ëºÝ¤Ë¤Ï¡¢¤³¤Î¥Ú¡¼¥¸¤Î¥³¥Ô¡¼¤ò\n"
+"´Þ¤á¤Æ¤¯¤À¤µ¤¤¡£"
+
+#. #define AUTOCONF_LYNXCFG_H
+#: LYMessages.c:846
+msgid ""
+"The following data were used as automatically-configured compile-time\n"
+"definitions when this copy of Lynx was built."
+msgstr ""
+"°Ê²¼¤Î¥Ç¡¼¥¿¤Ï¡¢¤³¤Î Lynx ¤Î¥³¥Ô¡¼¤¬¥Ó¥ë¥É¤µ¤ì¤¿ºÝ¤Ë¡¢¼«Æ°Åª¤ËÀßÄꤵ¤ì¤¿\n"
+"¥³¥ó¥Ñ¥¤¥ë»þÄêµÁ¤È¤·¤Æ»È¤ï¤ì¤¿¤â¤Î¤Ç¤¹¡£"
+
+#. #define DIRED_NOVICELINE
+#: LYMessages.c:851
+msgid " C)reate D)ownload E)dit F)ull menu M)odify R)emove T)ag U)pload \n"
+msgstr " [c]ºîÀ® [d]¥À¥¦¥ó¥í¡¼¥É [e]ÊÔ½¸ [f]¥Õ¥ë¥á¥Ë¥å¡¼ [m]Êѹ¹ [r]ºï½ü [t]¥¿¥° [u]¥¢¥Ã¥×¥í¡¼¥É \n"
+
+#: LYMessages.c:852
+msgid "Failed to obtain status of current link!"
+msgstr "¸½ºß¤Î¥ê¥ó¥¯¤Î¥¹¥Æ¡¼¥¿¥¹¤ÎÆþ¼ê¤Ë¼ºÇÔ¤·¤Þ¤·¤¿!"
+
+#. #define INVALID_PERMIT_URL
+#: LYMessages.c:855
+msgid "Special URL only valid from current File Permission menu!"
+msgstr "ÆÃÊÌ URL ¤Ï¸½ºß¤Î¥Õ¥¡¥¤¥ëµö²Ä¥á¥Ë¥å¡¼¤«¤é¤Î¤ßÍ­¸ú¤Ç¤¹!"
+
+#: LYMessages.c:859
+msgid "External support is currently disabled."
+msgstr "³°Éô¥µ¥Ý¡¼¥È¤Ï¸½ºß̵¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£"
+
+#. new with 2.8.4dev.21
+#: LYMessages.c:863
+msgid "Changing working-directory is currently disabled."
+msgstr "ºî¶È¥Ç¥£¥ì¥¯¥È¥ê¤ÎÊѹ¹¤Ï¸½ºß̵¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£"
+
+#: LYMessages.c:864
+msgid "Linewrap OFF!"
+msgstr "¹Ô¥é¥Ã¥× ¥ª¥Õ!"
+
+#: LYMessages.c:865
+msgid "Linewrap ON!"
+msgstr "¹Ô¥é¥Ã¥× ¥ª¥ó!"
+
+#: LYMessages.c:866
+msgid "Parsing nested-tables toggled OFF! Reloading..."
+msgstr "Æþ¤ì»Ò¥Æ¡¼¥Ö¥ë¤Î²òÀÏ ¥È¥°¥ë¥ª¥Õ! ºÆÆɤ߹þ¤ßÃæ..."
+
+#: LYMessages.c:867
+msgid "Parsing nested-tables toggled ON! Reloading..."
+msgstr "Æþ¤ì»Ò¥Æ¡¼¥Ö¥ë¤Î²òÀÏ ¥È¥°¥ë¥ª¥ó! ºÆÆɤ߹þ¤ßÃæ..."
+
+#: LYMessages.c:868
+msgid "Shifting is disabled while line-wrap is in effect"
+msgstr "¹Ô¥é¥Ã¥×¤¬Í­¸ú¤Ê´Ö¡¢°ÜÆ°¤Ï̵¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹"
+
+#: LYMessages.c:869
+msgid "Trace not supported"
+msgstr "ÄÉÀפϥµ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£"
+
+#: LYMessages.c:790
+#, c-format
+msgid "\tIndents: first=%.0f others=%.0f, Height=%.1f Desc=%.1f\n"
+msgstr "\t¥¤¥ó¥Ç¥ó¥È: ºÇ½é=%.0f ¤½¤Î¾=%.0f¡¢¹â¤µ=%.1f Desc=%.1f\n"
+
+#: WWW/Library/Implementation/HTAABrow.c:626
+#, c-format
+msgid "Username for '%s' at %s '%s%s':"
+msgstr "'%s' ¤Î¤¿¤á¤Î %s '%s%s' ¤Ë¤ª¤±¤ë¥æ¡¼¥¶Ì¾:"
+
+#: WWW/Library/Implementation/HTAABrow.c:894
+msgid "This client doesn't know how to compose proxy authorization information for scheme"
+msgstr "¤³¤Î¥¯¥é¥¤¥¢¥ó¥È¤Ï¤³¤Î¥¹¥­¡¼¥à¸þ¤±¤Ë¥×¥í¥­¥·Ç§¾Ú¾ðÊó¤ò¹½À®¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤»¤ó"
+
+#: WWW/Library/Implementation/HTAABrow.c:971
+msgid "This client doesn't know how to compose authorization information for scheme"
+msgstr "¤³¤Î¥¯¥é¥¤¥¢¥ó¥È¤Ï¤³¤Î¥¹¥­¡¼¥à¸þ¤±¤Ëǧ¾Ú¾ðÊó¤ò¹½À®¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤»¤ó"
+
+#: WWW/Library/Implementation/HTAABrow.c:1079
+#, c-format
+msgid "Invalid header '%s%s%s%s%s'"
+msgstr "ÉÔÀµ¤Ê¥Ø¥Ã¥À '%s%s%s%s%s' ¤Ç¤¹"
+
+#: WWW/Library/Implementation/HTAABrow.c:1181
+msgid "Proxy authorization required -- retrying"
+msgstr "¥×¥í¥­¥·Ç§¾Ú¤¬É¬ÍפǤ¹ -- ºÆ»î¹Ô¤·¤Æ¤¤¤Þ¤¹"
+
+#: WWW/Library/Implementation/HTAABrow.c:1239
+msgid "Access without authorization denied -- retrying"
+msgstr "ǧ¾Ú̵¤·¤Î¥¢¥¯¥»¥¹¤ÏµñÈݤµ¤ì¤Þ¤·¤¿ -- ºÆ»î¹Ô¤·¤Æ¤¤¤Þ¤¹"
+
+#: WWW/Library/Implementation/HTAccess.c:688
+msgid "Access forbidden by rule"
+msgstr "µ¬Â§¤Ë¤è¤ê¥¢¥¯¥»¥¹¤Ï¶Ø»ß¤µ¤ì¤Æ¤¤¤Þ¤¹¡£"
+
+#: WWW/Library/Implementation/HTAccess.c:783
+msgid "Document with POST content not found in cache. Resubmit?"
+msgstr "POST ¥³¥ó¥Æ¥ó¥Ä¤ò´Þ¤à¥É¥­¥å¥á¥ó¥È¤Ï¥­¥ã¥Ã¥·¥å¤ÎÃæ¤Ë¤¢¤ê¤Þ¤»¤ó¤Ç¤·¤¿¡£ºÆÁ÷¿®¤·¤Þ¤¹¤«?"
+
+#: WWW/Library/Implementation/HTAccess.c:938
+msgid "Loading failed, use a previous copy."
+msgstr ""
+
+#: WWW/Library/Implementation/HTAccess.c:1047 src/GridText.c:8587
+msgid "Loading incomplete."
+msgstr "Æɤ߹þ¤ß¤¬ÃæÃǤµ¤ì¤Þ¤·¤¿¡£"
+
+#: WWW/Library/Implementation/HTAccess.c:1078
+#, c-format
+msgid "**** HTAccess: socket or file number returned by obsolete load routine!\n"
+msgstr "*** HTAccess: ¥½¥±¥Ã¥È¤«¥Õ¥¡¥¤¥ë¤ÎÈֹ椬¡¢µì¼°¤ÎÆɤ߹þ¤ß¥ë¡¼¥Á¥ó¤«¤éÊÖ¤µ¤ì¤Æ¤¤¤Þ¤¹!\n"
+
+#: WWW/Library/Implementation/HTAccess.c:1080
+#, fuzzy, c-format
+msgid "**** HTAccess: Internal software error. Please mail lynx-dev@nongnu.org!\n"
+msgstr "**** HTAccess: ¥½¥Õ¥È¥¦¥§¥¢ÆâÉô¤Î¥¨¥é¡¼¤Ç¤¹¡£lynx-dev@sig.net ¤Ë¥á¡¼¥ë¤ÇÊó¹ð¤·¤Æ¤¯¤À¤µ¤¤!\n"
+
+#: WWW/Library/Implementation/HTAccess.c:1081
+#, c-format
+msgid "**** HTAccess: Status returned was: %d\n"
+msgstr "**** HTAccess: Ê֤äƤ­¤¿¥¹¥Æ¡¼¥¿¥¹¤Ï: %d\n"
+
+#.
+#. * hack: if we fail in HTAccess.c
+#. * avoid duplicating URL, oh.
+#.
+#: WWW/Library/Implementation/HTAccess.c:1087 src/LYMainLoop.c:7783
+msgid "Can't Access"
+msgstr "¥¢¥¯¥»¥¹¤Ç¤­¤Þ¤»¤ó¡£"
+
+#: WWW/Library/Implementation/HTAccess.c:1095
+msgid "Unable to access document."
+msgstr "ʸ½ñ¤Ë¥¢¥¯¥»¥¹¤Ç¤­¤Þ¤»¤ó¡£"
+
+#: WWW/Library/Implementation/HTFTP.c:843
+#, c-format
+msgid "Enter password for user %s@%s:"
+msgstr "¥æ¡¼¥¶ %s@%s ¤Î¥Ñ¥¹¥ï¡¼¥É¤òÆþÎÏ:"
+
+#: WWW/Library/Implementation/HTFTP.c:871
+msgid "Unable to connect to FTP host."
+msgstr "FTP ¥Û¥¹¥È¤ËÀܳ¤Ç¤­¤Þ¤»¤ó¡£"
+
+#: WWW/Library/Implementation/HTFTP.c:1152
+msgid "close master socket"
+msgstr "¥Þ¥¹¥¿¡¼¥½¥±¥Ã¥È¤¬ÊĤ¸¤Þ¤¹"
+
+#: WWW/Library/Implementation/HTFTP.c:1214
+msgid "socket for master socket"
+msgstr "¥Þ¥¹¥¿¡¼¥½¥±¥Ã¥ÈÍÑ¥½¥±¥Ã¥È"
+
+#.
+#. * It's a symbolic link, does the user care about knowing if it is
+#. * symbolic? I think so since it might be a directory.
+#.
+#: WWW/Library/Implementation/HTFTP.c:1733 WWW/Library/Implementation/HTFTP.c:2350
+msgid "Symbolic Link"
+msgstr "¥·¥ó¥Ü¥ê¥Ã¥¯¥ê¥ó¥¯"
+
+#: WWW/Library/Implementation/HTFTP.c:2707
+msgid "Receiving FTP directory."
+msgstr "FTP ¥Ç¥£¥ì¥¯¥È¥ê¤ò¼õ¿®Ãæ"
+
+#: WWW/Library/Implementation/HTFTP.c:2843
+#, c-format
+msgid "Transferred %d bytes (%5d)"
+msgstr "%d ¥Ð¥¤¥ÈžÁ÷ºÑ (%5d)"
+
+#: WWW/Library/Implementation/HTFTP.c:3194
+msgid "connect for data"
+msgstr "¥Ç¡¼¥¿¤ËÀܳ"
+
+#: WWW/Library/Implementation/HTFTP.c:3855
+msgid "Receiving FTP file."
+msgstr "FTP ¥Õ¥¡¥¤¥ë¤ò¼õ¿®Ãæ"
+
+#: WWW/Library/Implementation/HTFinger.c:273
+msgid "Could not set up finger connection."
+msgstr "finger Àܳ¤òÍѰդǤ­¤Þ¤»¤ó¤Ç¤·¤¿¡£"
+
+#: WWW/Library/Implementation/HTFinger.c:320
+msgid "Could not load data (no sitename in finger URL)"
+msgstr "¥Ç¡¼¥¿¤¬Æɤ߹þ¤á¤Þ¤»¤ó¤Ç¤·¤¿(finger URL ¤Ë¥µ¥¤¥È̾¤¬»ØÄꤵ¤ì¤Æ¤¤¤Þ¤»¤ó)"
+
+#: WWW/Library/Implementation/HTFinger.c:326
+msgid "Invalid port number - will only use port 79!"
+msgstr "ÉÔÀµ¤Ê¥Ý¡¼¥ÈÈÖ¹æ¤Ç¤¹ - ¥Ý¡¼¥È 79 ¤Î¤ß¤ò»È¤¤¤Þ¤¹!"
+
+#: WWW/Library/Implementation/HTFinger.c:392
+msgid "Could not access finger host."
+msgstr "finger ¥Û¥¹¥È¤ËÀܳ¤Ç¤­¤Þ¤»¤ó¡£"
+
+#: WWW/Library/Implementation/HTFinger.c:400
+msgid "No response from finger server."
+msgstr "finger ¥µ¡¼¥Ð¤¬±þÅú¤·¤Þ¤»¤ó¡£"
+
+#: WWW/Library/Implementation/HTNews.c:426
+#, c-format
+msgid "Username for news host '%s':"
+msgstr "¥Ë¥å¡¼¥¹¥Û¥¹¥È '%s' ¤Ç¤Î¥æ¡¼¥¶Ì¾:"
+
+#: WWW/Library/Implementation/HTNews.c:479
+msgid "Change username?"
+msgstr "¥æ¡¼¥¶Ì¾¤òÊѹ¹¤·¤Þ¤¹¤«?"
+
+#: WWW/Library/Implementation/HTNews.c:483
+msgid "Username:"
+msgstr "¥æ¡¼¥¶Ì¾:"
+
+#: WWW/Library/Implementation/HTNews.c:508
+#, c-format
+msgid "Password for news host '%s':"
+msgstr "¥Ë¥å¡¼¥¹¥Û¥¹¥È '%s' ¤Î¥Ñ¥¹¥ï¡¼¥É:"
+
+#: WWW/Library/Implementation/HTNews.c:591
+msgid "Change password?"
+msgstr "¥Ñ¥¹¥ï¡¼¥É¤òÊѹ¹¤·¤Þ¤¹¤«?"
+
+#: WWW/Library/Implementation/HTNews.c:1711
+#, c-format
+msgid "No matches for: %s"
+msgstr "³ºÅö¤¹¤ë¤â¤Î¤¬¤¢¤ê¤Þ¤»¤ó: %s"
+
+#: WWW/Library/Implementation/HTNews.c:1761
+msgid ""
+"\n"
+"No articles in this group.\n"
+msgstr ""
+"\n"
+"¤³¤Î¥°¥ë¡¼¥×Æâ¤Ë¤Ïµ­»ö¤¬¤¢¤ê¤Þ¤»¤ó¡£\n"
+
+#: WWW/Library/Implementation/HTNews.c:1773
+msgid ""
+"\n"
+"No articles in this range.\n"
+msgstr ""
+"\n"
+"¤³¤ÎÈϰϤˤϵ­»ö¤¬¤¢¤ê¤Þ¤»¤ó¡£\n"
+
+#.
+#. * Set window title.
+#.
+#: WWW/Library/Implementation/HTNews.c:1786
+#, c-format
+msgid "%s, Articles %d-%d"
+msgstr "%s¡¢µ­»ö %d-%d"
+
+#: WWW/Library/Implementation/HTNews.c:1809
+msgid "Earlier articles"
+msgstr "°ÊÁ°¤Îµ­»ö"
+
+#: WWW/Library/Implementation/HTNews.c:1822
+#, c-format
+msgid ""
+"\n"
+"There are about %d articles currently available in %s, IDs as follows:\n"
+"\n"
+msgstr ""
+"\n"
+"¸½ºß %d Ä̤ۤɤε­»ö¤ò %s ¤ÇÆɤळ¤È¤¬¤Ç¤­¤Þ¤¹¡£ID ¤Ï°Ê²¼¤ÎÄ̤ê:\n"
+"\n"
+
+#: WWW/Library/Implementation/HTNews.c:1884
+msgid "All available articles in "
+msgstr "°Ê²¼¤ÇÆɤá¤ëÁ´µ­»ö: "
+
+#: WWW/Library/Implementation/HTNews.c:2098
+msgid "Later articles"
+msgstr "¤½¤Î¸å¤Îµ­»ö"
+
+#: WWW/Library/Implementation/HTNews.c:2121
+msgid "Post to "
+msgstr "°Ê²¼¤Ø¥Ý¥¹¥È: "
+
+#: WWW/Library/Implementation/HTNews.c:2342
+msgid "This client does not contain support for SNEWS URLs."
+msgstr "¤³¤Î¥¯¥é¥¤¥¢¥ó¥È¤Ë¤Ï SNEWS URL ¤Î¥µ¥Ý¡¼¥È¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤»¤ó¡£"
+
+#: WWW/Library/Implementation/HTNews.c:2550
+msgid "No target for raw text!"
+msgstr "À¸¥Æ¥­¥¹¥È¸þ¤±¤Î¥¿¡¼¥²¥Ã¥È¤¬¤¢¤ê¤Þ¤»¤ó!"
+
+#: WWW/Library/Implementation/HTNews.c:2581
+msgid "Connecting to NewsHost ..."
+msgstr "¥Ë¥å¡¼¥¹¥Û¥¹¥È¤ËÀܳÃæ ..."
+
+#: WWW/Library/Implementation/HTNews.c:2633
+#, c-format
+msgid "Could not access %s."
+msgstr "%s ¤Ë¥¢¥¯¥»¥¹¤Ç¤­¤Þ¤»¤ó¡£"
+
+#: WWW/Library/Implementation/HTNews.c:2739
+#, c-format
+msgid "Can't read news info. News host %.20s responded: %.200s"
+msgstr "¥Ë¥å¡¼¥¹¾ðÊó¤¬Æɤá¤Þ¤»¤ó¡£¥Ë¥å¡¼¥¹¥Û¥¹¥È %.20s ¤Î±þÅú: %.200s"
+
+#: WWW/Library/Implementation/HTNews.c:2743
+#, c-format
+msgid "Can't read news info, empty response from host %s"
+msgstr "¥Ë¥å¡¼¥¹¾ðÊó¤¬Æɤá¤Þ¤»¤ó¡£¥Û¥¹¥È %s ¤«¤é¤Î±þÅú¤Ï¶õ¤Ç¤¹"
+
+#.
+#. * List available newsgroups. - FM
+#.
+#: WWW/Library/Implementation/HTNews.c:2947
+msgid "Reading list of available newsgroups."
+msgstr "ÍøÍѲÄǽ¤Ê¥Ë¥å¡¼¥¹¥°¥ë¡¼¥×¤Î¥ê¥¹¥È¤òÆɤ߹þ¤ßÃæ¡£"
+
+#: WWW/Library/Implementation/HTNews.c:2968
+msgid "Reading list of articles in newsgroup."
+msgstr "¥Ë¥å¡¼¥¹¥°¥ë¡¼¥×Æâ¤Îµ­»ö¤Î¥ê¥¹¥È¤òÆɤ߹þ¤ßÃæ¡£"
+
+#.
+#. * Get an article from a news group. - FM
+#.
+#: WWW/Library/Implementation/HTNews.c:2974
+msgid "Reading news article."
+msgstr "¥Ë¥å¡¼¥¹µ­»ö¤òÆɤ߹þ¤ßÃæ¡£"
+
+#: WWW/Library/Implementation/HTNews.c:3004
+msgid "Sorry, could not load requested news."
+msgstr "¤¦¤¦¤à¡¢Í׵ᤵ¤ì¤¿¥Ë¥å¡¼¥¹¤òÆɤ߹þ¤á¤Þ¤»¤ó¤Ç¤·¤¿¡£"
+
+#: WWW/Library/Implementation/HTTCP.c:1282
+msgid "Address has invalid port"
+msgstr "¥¢¥É¥ì¥¹¤ËÉÔÀµ¤Ê¥Ý¡¼¥È¤¬»ØÄꤵ¤ì¤Æ¤¤¤Þ¤¹"
+
+#: WWW/Library/Implementation/HTTCP.c:1358
+msgid "Address length looks invalid"
+msgstr "¥¢¥É¥ì¥¹Ä¹¤¬ÉÔÀµ¤Î¤è¤¦¤Ç¤¹"
+
+#: WWW/Library/Implementation/HTTCP.c:1607 WWW/Library/Implementation/HTTCP.c:1625
+#, c-format
+msgid "Unable to locate remote host %s."
+msgstr "¥ê¥â¡¼¥È¥Û¥¹¥È %s ¤Î°ÌÃÖ¤òÆÃÄê¤Ç¤­¤Þ¤»¤ó¡£"
+
+#. Not HTProgress, so warning won't be overwritten immediately;
+#. * but not HTAlert, because typically there will be other
+#. * alerts from the callers. - kw
+#.
+#: WWW/Library/Implementation/HTTCP.c:1622 WWW/Library/Implementation/HTTelnet.c:115
+#, c-format
+msgid "Invalid hostname %s"
+msgstr "%s ¤ÏÉÔÀµ¤Ê¥Û¥¹¥È̾¤Ç¤¹"
+
+#: WWW/Library/Implementation/HTTCP.c:1636
+#, c-format
+msgid "Making %s connection to %s"
+msgstr "%s ¤Ç %s ¤ËÀܳÃæ"
+
+#: WWW/Library/Implementation/HTTCP.c:1647
+msgid "socket failed."
+msgstr "¥½¥±¥Ã¥È¤¬¼ºÇÔ¤·¤Þ¤·¤¿¡£"
+
+#: WWW/Library/Implementation/HTTCP.c:1660
+#, c-format
+msgid "socket failed: family %d addr %s port %s."
+msgstr "¥½¥±¥Ã¥È¤¬¼ºÇÔ¤·¤Þ¤·¤¿: ¥Õ¥¡¥ß¥ê %d ¥¢¥É¥ì¥¹ %s ¥Ý¡¼¥È %s¡£"
+
+#: WWW/Library/Implementation/HTTCP.c:1684
+msgid "Could not make connection non-blocking."
+msgstr "Àܳ¤òÈó¥Ö¥í¥Ã¥­¥ó¥°¤Ë¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£"
+
+#: WWW/Library/Implementation/HTTCP.c:1752
+msgid "Connection failed (too many retries)."
+msgstr "Àܳ¤Ë¼ºÇÔ¤·¤Þ¤·¤¿ (ºÆ»î¹Ô¤¬Â¿¤¹¤®¤Þ¤¹)"
+
+#: WWW/Library/Implementation/HTTCP.c:1945
+msgid "Could not restore socket to blocking."
+msgstr "¥Ö¥í¥Ã¥­¥ó¥°¤Î¤¿¤á¤Î¥½¥±¥Ã¥È¤òÉüµì¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£"
+
+#: WWW/Library/Implementation/HTTCP.c:2011
+msgid "Socket read failed for 180,000 tries."
+msgstr "180,000 ²ó»î¹Ô¤·¤Þ¤·¤¿¤¬¥½¥±¥Ã¥È¤ÎÆɤ߹þ¤ß¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡£"
+
+#: WWW/Library/Implementation/HTTP.c:84
+#, c-format
+msgid "SSL callback:%s, preverify_ok=%d, ssl_okay=%d"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:406
+#, c-format
+msgid "Address contains a username: %s"
+msgstr "¥¢¥É¥ì¥¹¤Ï¥æ¡¼¥¶Ì¾ %s ¤ò´Þ¤ó¤Ç¤¤¤Þ¤¹"
+
+#: WWW/Library/Implementation/HTTP.c:460
+#, c-format
+msgid "Certificate issued by: %s"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:620
+msgid "This client does not contain support for HTTPS URLs."
+msgstr "¤³¤Î¥¯¥é¥¤¥¢¥ó¥È¤Ï HTTPS URL ¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤»¤ó¡£"
+
+#: WWW/Library/Implementation/HTTP.c:645
+msgid "Unable to connect to remote host."
+msgstr "¥ê¥â¡¼¥È¥Û¥¹¥È¤ËÀܳ¤Ç¤­¤Þ¤»¤ó¡£"
+
+#: WWW/Library/Implementation/HTTP.c:669
+msgid "Retrying connection without TLS."
+msgstr "TLS¤ò»È¤ï¤º¤ËÀܳ¤òºÆ»î¹Ô¤·¤Æ¤¤¤Þ¤¹¡£"
+
+#: WWW/Library/Implementation/HTTP.c:714
+msgid "no issuer was found"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:716
+msgid "issuer is not a CA"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:718
+msgid "the certificate has no known issuer"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:720
+#, fuzzy
+msgid "the certificate has been revoked"
+msgstr "¥¯¥Ã¥­¡¼¤Ï¿©¤Ù¤é¤ì¤Æ¤·¤Þ¤¤¤Þ¤·¤¿!"
+
+#: WWW/Library/Implementation/HTTP.c:722
+msgid "the certificate is not trusted"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:807
+#, c-format
+msgid "Verified connection to %s (cert=%s)"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:855 WWW/Library/Implementation/HTTP.c:901
+#, c-format
+msgid "Verified connection to %s (subj=%s)"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:931
+msgid "Can't find common name in certificate"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:934
+#, c-format
+msgid "SSL error:host(%s)!=cert(%s)-Continue?"
+msgstr "SSL¥¨¥é¡¼: ¥Û¥¹¥È(%s) ¤¬ cert(%s) ¤È°ìÃפ·¤Þ¤»¤ó ³¤±¤Þ¤¹¤«?"
+
+#: WWW/Library/Implementation/HTTP.c:947
+#, c-format
+msgid "UNVERIFIED connection to %s (cert=%s)"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:956
+#, c-format
+msgid "Secure %d-bit %s (%s) HTTP connection"
+msgstr "¥»¥­¥å¥¢¤Ê %d ¥Ó¥Ã¥È %s (%s) HTTP Àܳ"
+
+#: WWW/Library/Implementation/HTTP.c:1426
+msgid "Sending HTTP request."
+msgstr "HTTP ¥ê¥¯¥¨¥¹¥È¤òÁ÷¿®Ãæ"
+
+#: WWW/Library/Implementation/HTTP.c:1465
+msgid "Unexpected network write error; connection aborted."
+msgstr "ÆÍÁ³¤Î¥Í¥Ã¥È¥ï¡¼¥¯½ñ¤­¹þ¤ß¥¨¥é¡¼: Àܳ¤¬ÃæÃǤµ¤ì¤Þ¤·¤¿¡£"
+
+#: WWW/Library/Implementation/HTTP.c:1471
+msgid "HTTP request sent; waiting for response."
+msgstr "HTTP ¥ê¥¯¥¨¥¹¥È¤òÁ÷¿®¤·¤Þ¤·¤¿: ±þÅú¤òÂԤäƤ¤¤Þ¤¹"
+
+#: WWW/Library/Implementation/HTTP.c:1539
+msgid "Unexpected network read error; connection aborted."
+msgstr "ÆÍÁ³¤Î¥Í¥Ã¥È¥ï¡¼¥¯Æɤ߹þ¤ß¥¨¥é¡¼: Àܳ¤¬ÃæÃǤµ¤ì¤Þ¤·¤¿¡£"
+
+#.
+#. * HTTP/1.1 Informational statuses.
+#. * 100 Continue.
+#. * 101 Switching Protocols.
+#. * > 101 is unknown.
+#. * We should never get these, and they have only the status
+#. * line and possibly other headers, so we'll deal with them by
+#. * showing the full header to the user as text/plain. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:1733
+msgid "Got unexpected Informational Status."
+msgstr "ͽ´ü¤·¤Ê¤¤ Informational Status ¤ò¼õ¤±¼è¤ê¤Þ¤·¤¿¡£"
+
+#.
+#. * Reset Content. The server has fulfilled the request but
+#. * nothing is returned and we should reset any form
+#. * content. We'll instruct the user to do that, and
+#. * restore the current document. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:1767
+msgid "Request fulfilled. Reset Content."
+msgstr "¥ê¥¯¥¨¥¹¥È¤¬¼Â¹Ô¤µ¤ì¤Þ¤·¤¿¡£¥³¥ó¥Æ¥ó¥È¤ò¥ê¥»¥Ã¥È¤·¤Æ¤¯¤À¤µ¤¤¡£"
+
+#. Not Modified
+#.
+#. * We didn't send an "If-Modified-Since" header, so this
+#. * status is inappropriate. We'll deal with it by showing
+#. * the full header to the user as text/plain. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:1884
+msgid "Got unexpected 304 Not Modified status."
+msgstr "ͽ´ü¤»¤Ì 304 Not Modified ¥¹¥Æ¡¼¥¿¥¹¤ò¼õ¤±¼è¤ê¤Þ¤·¤¿¡£"
+
+#: WWW/Library/Implementation/HTTP.c:1947
+msgid "Redirection of POST content requires user approval."
+msgstr "POST ¥³¥ó¥Æ¥ó¥È¤Î¥ê¥À¥¤¥ì¥¯¥·¥ç¥ó¤Ë¤Ï¥æ¡¼¥¶¤Î¾µÇ§¤¬É¬ÍפǤ¹¡£"
+
+#: WWW/Library/Implementation/HTTP.c:1962
+msgid "Have POST content. Treating Permanent Redirection as Temporary.\n"
+msgstr "POST ¥³¥ó¥Æ¥ó¥È¤ò´Þ¤ó¤Ç¤¤¤Þ¤¹¡£±Ê³Ū¤Ê¥ê¥À¥¤¥ì¥¯¥·¥ç¥ó¤ò°ì»þŪ¤Ê¤â¤Î¤È¤·¤Æ°·¤¤¤Þ¤¹¡£\n"
+
+#: WWW/Library/Implementation/HTTP.c:2004
+msgid "Retrying with access authorization information."
+msgstr "¥¢¥¯¥»¥¹Ç§¾Ú¾ðÊóÉÕ¤­¤ÇºÆ»î¹Ô¤·¤Æ¤¤¤Þ¤¹¡£"
+
+#: WWW/Library/Implementation/HTTP.c:2016
+msgid "Show the 401 message body?"
+msgstr "401 ¥á¥Ã¥»¡¼¥¸ËÜÂΤò¸«¤Þ¤¹¤«?"
+
+#: WWW/Library/Implementation/HTTP.c:2059
+msgid "Show the 407 message body?"
+msgstr "407 ¥á¥Ã¥»¡¼¥¸ËÜÂΤò¸«¤Þ¤¹¤«?"
+
+#.
+#. * Bad or unknown server_status number. Take a chance and hope
+#. * there is something to display. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2159
+msgid "Unknown status reply from server!"
+msgstr "¥µ¡¼¥Ð¤«¤é¤ÎÉÔÌÀ¤Ê¥¹¥Æ¡¼¥¿¥¹¥ê¥×¥é¥¤¤Ç¤¹!"
+
+#: WWW/Library/Implementation/HTTelnet.c:113
+#, c-format
+msgid "remote %s session:"
+msgstr "¥ê¥â¡¼¥È %s ¥»¥Ã¥·¥ç¥ó:"
+
+#: WWW/Library/Implementation/HTWAIS.c:162
+msgid "Could not connect to WAIS server."
+msgstr "WAIS ¥µ¡¼¥Ð¤ËÀܳ¤Ç¤­¤Þ¤»¤ó¡£"
+
+#: WWW/Library/Implementation/HTWAIS.c:170
+msgid "Could not open WAIS connection for reading."
+msgstr "Æɤ߹þ¤ß¤Î¤¿¤á¤Î WAIS Àܳ¤ò³«¤±¤Þ¤»¤ó¤Ç¤·¤¿¡£"
+
+#: WWW/Library/Implementation/HTWAIS.c:192
+msgid "Diagnostic code is "
+msgstr "¿ÇÃÇ¥³¡¼¥É¤Ï "
+
+#: WWW/Library/Implementation/HTWAIS.c:464
+msgid "Index "
+msgstr "¥¤¥ó¥Ç¥Ã¥¯¥¹ "
+
+#: WWW/Library/Implementation/HTWAIS.c:468
+#, c-format
+msgid " contains the following %d item%s relevant to \""
+msgstr " ¤Ï°Ê²¼¤Î %d ¥¢¥¤¥Æ¥à%s¤ò´Þ¤ó¤Ç¤¤¤Þ¤¹¡£¤³¤ì¤¬´ØÏ¢¤¹¤ë¤Î¤Ï\""
+
+#: WWW/Library/Implementation/HTWAIS.c:476
+msgid "The first figure after each entry is its relative score, "
+msgstr "³Æ¥¨¥ó¥È¥ê¤Î¸å¤ÎºÇ½é¤Î¿ô»ú¤Ï¤½¤ÎÁêÂÐ¥¹¥³¥¢¤Ç¤¢¤ë "
+
+#: WWW/Library/Implementation/HTWAIS.c:477
+msgid "the second is the number of lines in the item."
+msgstr "ÂèÆó¤Î¿ô»ú¤Ï¥¢¥¤¥Æ¥àÆâ¤Ë¤ª¤±¤ë¹ÔÈÖ¹æ¤Ç¤¹¡£"
+
+#: WWW/Library/Implementation/HTWAIS.c:519
+msgid " (bad file name)"
+msgstr " (ÉÔÀµ¤Ê¥Õ¥¡¥¤¥ë̾)"
+
+#: WWW/Library/Implementation/HTWAIS.c:545
+msgid "(bad doc id)"
+msgstr "(ÉÔÀµ¤Ê¥É¥­¥å¥á¥ó¥È ID)"
+
+#: WWW/Library/Implementation/HTWAIS.c:561
+msgid "(Short Header record, can't display)"
+msgstr "(û¤¤¥Ø¥Ã¥À¥ì¥³¡¼¥É¡¢É½¼¨ÉÔǽ)"
+
+#: WWW/Library/Implementation/HTWAIS.c:568
+msgid ""
+"\n"
+"Long Header record, can't display\n"
+msgstr ""
+"\n"
+"Ť¤¥Ø¥Ã¥À¥ì¥³¡¼¥É¡¢É½¼¨ÉÔǽ\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:575
+msgid ""
+"\n"
+"Text record\n"
+msgstr ""
+"\n"
+"¥Æ¥­¥¹¥È¥ì¥³¡¼¥É\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:584
+msgid ""
+"\n"
+"Headline record, can't display\n"
+msgstr ""
+"\n"
+"¥Ø¥Ã¥É¥é¥¤¥ó¥ì¥³¡¼¥É¡¢É½¼¨ÉÔǽ\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:592
+msgid ""
+"\n"
+"Code record, can't display\n"
+msgstr ""
+"\n"
+"¥³¡¼¥É¥ì¥³¡¼¥É¡¢É½¼¨ÉÔǽ\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:696
+msgid "Syntax error in WAIS URL"
+msgstr "WAIS URL ¤Î¹½Ê¸¥¨¥é¡¼¤Ç¤¹¡£"
+
+#: WWW/Library/Implementation/HTWAIS.c:768
+msgid " (WAIS Index)"
+msgstr "(WAIS ¥¤¥ó¥Ç¥Ã¥¯¥¹)"
+
+#: WWW/Library/Implementation/HTWAIS.c:775
+msgid "WAIS Index: "
+msgstr "WAIS ¥¤¥ó¥Ç¥Ã¥¯¥¹: "
+
+#: WWW/Library/Implementation/HTWAIS.c:781
+msgid "This is a link for searching the "
+msgstr "¤³¤ì¤Ï°Ê²¼¤ò¸¡º÷¤¹¤ë¤¿¤á¤Î¥ê¥ó¥¯¤Ç¤¹: "
+
+#: WWW/Library/Implementation/HTWAIS.c:785
+msgid " WAIS Index.\n"
+msgstr " WAIS ¥¤¥ó¥Ç¥Ã¥¯¥¹¡£\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:814
+msgid ""
+"\n"
+"Enter the 's'earch command and then specify search words.\n"
+msgstr ""
+"\n"
+"¸¡º÷¥³¥Þ¥ó¥É 's' ¤òÆþÎϤ·¡¢¸¡º÷¤¹¤ë¸ÀÍÕ¤ò»ØÄꤷ¤Æ¤¯¤À¤µ¤¤¡£\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:836
+msgid " (in "
+msgstr " (´Þ¤Þ¤ì¤Æ¤¤¤ë¤Î¤Ï "
+
+#: WWW/Library/Implementation/HTWAIS.c:845
+msgid "WAIS Search of \""
+msgstr "WAIS ¥µ¡¼¥Á ÂоÝ: \""
+
+#: WWW/Library/Implementation/HTWAIS.c:849
+msgid "\" in: "
+msgstr "\" ´Þ¤Þ¤ì¤ë¤Î¤Ï: "
+
+#: WWW/Library/Implementation/HTWAIS.c:864
+msgid "HTWAIS: Request too large."
+msgstr "HTWAIS: ¥ê¥¯¥¨¥¹¥È¤¬Â礭¤¹¤®¤Þ¤¹¡£"
+
+#: WWW/Library/Implementation/HTWAIS.c:873
+msgid "Searching WAIS database..."
+msgstr "WAIS ¥Ç¡¼¥¿¥Ù¡¼¥¹¤ò¸¡º÷¤·¤Æ¤¤¤Þ¤¹..."
+
+#: WWW/Library/Implementation/HTWAIS.c:883
+msgid "Search interrupted."
+msgstr "¸¡º÷¤¬ÃæÃǤµ¤ì¤Þ¤·¤¿¡£"
+
+#: WWW/Library/Implementation/HTWAIS.c:934
+msgid "Can't convert format of WAIS document"
+msgstr "WAIS ¥É¥­¥å¥á¥ó¥È¤Î·Á¼°¤ËÊÑ´¹¤Ç¤­¤Þ¤»¤ó¡£"
+
+#: WWW/Library/Implementation/HTWAIS.c:978
+msgid "HTWAIS: Request too long."
+msgstr "HTWAIS: ¥ê¥¯¥¨¥¹¥È¤¬Ä¹¤¹¤®¤Þ¤¹¡£"
+
+#.
+#. * Actually do the transaction given by request_message.
+#.
+#: WWW/Library/Implementation/HTWAIS.c:992
+msgid "Fetching WAIS document..."
+msgstr "WAIS ¥É¥­¥å¥á¥ó¥È¤ò¼èÆÀÃæ..."
+
+#. display_search_response(target, retrieval_response,
+#. wais_database, keywords);
+#: WWW/Library/Implementation/HTWAIS.c:1031
+msgid "No text was returned!\n"
+msgstr "Ê֤äƤ­¤¿¥Æ¥­¥¹¥È¤Ï¤¢¤ê¤Þ¤»¤ó!\n"
+
+#: WWW/Library/Implementation/HTWSRC.c:296
+msgid " NOT GIVEN in source file; "
+msgstr " °Ê²¼¤Î¥½¡¼¥¹¥Õ¥¡¥¤¥ë¤Ç»ØÄꤵ¤ì¤Æ*¤¤¤Þ¤»¤ó*: "
+
+#: WWW/Library/Implementation/HTWSRC.c:319
+msgid " WAIS source file"
+msgstr " WAIS ¥½¡¼¥¹¥Õ¥¡¥¤¥ë"
+
+#: WWW/Library/Implementation/HTWSRC.c:326
+msgid " description"
+msgstr " ÀâÌÀ"
+
+#: WWW/Library/Implementation/HTWSRC.c:336
+msgid "Access links"
+msgstr "¥ê¥ó¥¯¤Ë¥¢¥¯¥»¥¹"
+
+#: WWW/Library/Implementation/HTWSRC.c:357
+msgid "Direct access"
+msgstr "ľÀÜ¥¢¥¯¥»¥¹"
+
+#. * Proxy will be used if defined, so let user know that - FM *
+#: WWW/Library/Implementation/HTWSRC.c:360
+msgid " (or via proxy server, if defined)"
+msgstr "(¤¢¤ë¤¤¤Ï¥×¥í¥­¥·¥µ¡¼¥Ð·Ðͳ¤Ç¡¢¤â¤·ÄêµÁ¤µ¤ì¤Æ¤¤¤ì¤Ð)"
+
+#: WWW/Library/Implementation/HTWSRC.c:375
+msgid "Maintainer"
+msgstr "¥á¥ó¥Æ¥Ê"
+
+#: WWW/Library/Implementation/HTWSRC.c:383
+msgid "Host"
+msgstr "¥Û¥¹¥È"
+
+#: src/GridText.c:705
+msgid "Memory exhausted, display interrupted!"
+msgstr "¥á¥â¥ê¤ò»È¤¤¤­¤ê¤Þ¤·¤¿¡£É½¼¨¤òÃæÃǤ·¤Þ¤¹!"
+
+#: src/GridText.c:710
+msgid "Memory exhausted, will interrupt transfer!"
+msgstr "¥á¥â¥ê¤ò»È¤¤¤­¤ê¤Þ¤·¤¿¡£Å¾Á÷¤òÃæÃǤ·¤Þ¤¹!"
+
+#: src/GridText.c:3654
+msgid " *** MEMORY EXHAUSTED ***"
+msgstr "*** ¥á¥â¥ê¤ò»È¤¤¤­¤ê¤Þ¤·¤¿ ***"
+
+#: src/GridText.c:6089 src/GridText.c:6096 src/LYList.c:239
+msgid "unknown field or link"
+msgstr "̤ÃΤΥե£¡¼¥ë¥É¤Þ¤¿¤Ï¥ê¥ó¥¯¤Ç¤¹"
+
+#: src/GridText.c:6105
+msgid "text entry field"
+msgstr "¥Æ¥­¥¹¥ÈÆþÎÏ¥Õ¥£¡¼¥ë¥É"
+
+#: src/GridText.c:6108
+msgid "password entry field"
+msgstr "¥Ñ¥¹¥ï¡¼¥ÉÆþÎÏ¥Õ¥£¡¼¥ë¥É"
+
+#: src/GridText.c:6111
+msgid "checkbox"
+msgstr "¥Á¥§¥Ã¥¯¥Ü¥Ã¥¯¥¹"
+
+#: src/GridText.c:6114
+msgid "radio button"
+msgstr "¥é¥¸¥ª¥Ü¥¿¥ó"
+
+#: src/GridText.c:6117
+msgid "submit button"
+msgstr "Á÷¿®¥Ü¥¿¥ó"
+
+#: src/GridText.c:6120
+msgid "reset button"
+msgstr "¥ê¥»¥Ã¥È¥Ü¥¿¥ó"
+
+#: src/GridText.c:6123
+msgid "popup menu"
+msgstr "¥Ý¥Ã¥×¥¢¥Ã¥×¥á¥Ë¥å¡¼"
+
+#: src/GridText.c:6126
+msgid "hidden form field"
+msgstr "±£¤µ¤ì¤¿¥Õ¥©¡¼¥à¥Õ¥£¡¼¥ë¥É"
+
+#: src/GridText.c:6129
+msgid "text entry area"
+msgstr "¥Æ¥­¥¹¥ÈÆþÎÏ¥¨¥ê¥¢"
+
+#: src/GridText.c:6132
+msgid "range entry field"
+msgstr "ÈÏ°ÏÆþÎÏ¥Õ¥£¡¼¥ë¥É"
+
+#: src/GridText.c:6135
+msgid "file entry field"
+msgstr "¥Õ¥¡¥¤¥ëÆþÎÏ¥Õ¥£¡¼¥ë¥É"
+
+#: src/GridText.c:6138
+msgid "text-submit field"
+msgstr "¥Æ¥­¥¹¥ÈÁ÷¿®¥Õ¥£¡¼¥ë¥É"
+
+#: src/GridText.c:6141
+msgid "image-submit button"
+msgstr "²èÁüÁ÷¿®¥Ü¥¿¥ó"
+
+#: src/GridText.c:6144
+msgid "keygen field"
+msgstr "keygen ¥Õ¥£¡¼¥ë¥É"
+
+#: src/GridText.c:6147
+msgid "unknown form field"
+msgstr "̤ÃΤΥե©¡¼¥à¥Õ¥£¡¼¥ë¥É"
+
+#: src/GridText.c:10320
+msgid "Can't open file for uploading"
+msgstr "¥¢¥Ã¥×¥í¡¼¥É¤¹¤ë¥Õ¥¡¥¤¥ë¤¬³«¤±¤Þ¤»¤ó¡£"
+
+#: src/GridText.c:11479
+#, c-format
+msgid "Submitting %s"
+msgstr "%s ¤òÁ÷¿®Ãæ"
+
+#. ugliness has happened; inform user and do the best we can
+#: src/GridText.c:12532
+msgid "Hang Detect: TextAnchor struct corrupted - suggest aborting!"
+msgstr "¥Ï¥ó¥°¸¡½Ð: TextAnchor ¹½Â¤ÂΤ¬²õ¤ì¤Þ¤·¤¿ - ½ªÎ»¤ò¤ª´«¤á¤·¤Þ¤¹!"
+
+#. don't show previous state
+#: src/GridText.c:12669
+msgid "Wrap lines to fit displayed area?"
+msgstr "ɽ¼¨Îΰè¤Ë¼ý¤Þ¤ë¤è¤¦¹Ô¤òÀÞ¤êÊÖ¤·¤Þ¤¹¤«?"
+
+#: src/GridText.c:12721
+msgid "Very long lines have been wrapped!"
+msgstr "Ť¹¤®¤ë¹Ô¤ÏÀÞ¤êÊÖ¤µ¤ì¤Þ¤¹!"
+
+#: src/GridText.c:13226
+msgid "Very long lines have been truncated!"
+msgstr "Ť¹¤®¤ë¹Ô¤ÏÀÚ¤êµÍ¤á¤é¤ì¤Þ¤¹!"
+
+#: src/HTAlert.c:164 src/LYShowInfo.c:359 src/LYShowInfo.c:363
+msgid "bytes"
+msgstr "¥Ð¥¤¥È"
+
+#.
+#. * If we know the total size of the file, we can compute
+#. * a percentage, and show a corresponding progress bar.
+#.
+#: src/HTAlert.c:300 src/HTAlert.c:324
+#, c-format
+msgid "Read %s of data"
+msgstr "%s Æɤ߹þ¤ßºÑ"
+
+#: src/HTAlert.c:321
+#, c-format
+msgid "Read %s of %s of data"
+msgstr "%s (%s Ãæ) Æɤ߹þ¤ßºÑ"
+
+#: src/HTAlert.c:330
+#, c-format
+msgid ", %s/sec"
+msgstr "¡¢%s/ÉÃ"
+
+#: src/HTAlert.c:342
+#, c-format
+msgid " (stalled for %s)"
+msgstr " (%s ÉÃÄä»ßÃæ)"
+
+#: src/HTAlert.c:346
+#, c-format
+msgid ", ETA %s"
+msgstr "¡¢ ETA %s"
+
+#: src/HTAlert.c:368
+msgid " (Press 'z' to abort)"
+msgstr " ([z] ¤ÇÃæ»ß)"
+
+#. Meta-note: don't move the following note from its place right
+#. in front of the first gettext(). As it is now, it should
+#. automatically appear in generated lynx.pot files. - kw
+#.
+#. NOTE TO TRANSLATORS: If you provide a translation for "yes", lynx
+#. * will take the first byte of the translation as a positive response
+#. * to Yes/No questions. If you provide a translation for "no", lynx
+#. * will take the first byte of the translation as a negative response
+#. * to Yes/No questions. For both, lynx will also try to show the
+#. * first byte in the prompt as a character, instead of (y) or (n),
+#. * respectively. This will not work right for multibyte charsets!
+#. * Don't translate "yes" and "no" for CJK character sets (or translate
+#. * them to "yes" and "no"). For a translation using UTF-8, don't
+#. * translate if the translation would begin with anything but a 7-bit
+#. * (US_ASCII) character. That also means do not translate if the
+#. * translation would begin with anything but a 7-bit character, if
+#. * you use a single-byte character encoding (a charset like ISO-8859-n)
+#. * but anticipate that the message catalog may be used re-encoded in
+#. * UTF-8 form.
+#. * For translations using other character sets, you may also wish to
+#. * leave "yes" and "no" untranslated, if using (y) and (n) is the
+#. * preferred behavior.
+#. * Lynx will also accept y Y n N as responses unless there is a conflict
+#. * with the first letter of the "yes" or "no" translation.
+#.
+#: src/HTAlert.c:406 src/HTAlert.c:454
+msgid "yes"
+msgstr "yes"
+
+#: src/HTAlert.c:409 src/HTAlert.c:455
+msgid "no"
+msgstr "no"
+
+#.
+#. * Special-purpose workaround for gettext support (we should do
+#. * this in a more general way) -TD
+#. *
+#. * NOTE TO TRANSLATORS: If the prompt has been rendered into
+#. * another language, and if yes/no are distinct, assume the
+#. * translator can make an ordered list in parentheses with one
+#. * capital letter for each as we assumed in HTConfirmDefault().
+#. * The list has to be in the same order as in the original message,
+#. * and the four capital letters chosen to not match those in the
+#. * original unless they have the same position.
+#. *
+#. * Example:
+#. * (Y/N/Always/neVer) - English (original)
+#. * (O/N/Toujours/Jamais) - French
+#.
+#: src/HTAlert.c:911
+msgid "Y/N/A/V"
+msgstr ""
+
+#: src/HTML.c:5911
+msgid "Description:"
+msgstr "ÀâÌÀ:"
+
+#: src/HTML.c:5916
+msgid "(none)"
+msgstr "(¤Ê¤·)"
+
+#: src/HTML.c:5920
+msgid "Filepath:"
+msgstr "¥Õ¥¡¥¤¥ë¤Ø¤Î¥Ñ¥¹:"
+
+#: src/HTML.c:5926
+msgid "(unknown)"
+msgstr "(ÉÔÌÀ)"
+
+#: src/HTML.c:7353
+msgid "Document has only hidden links. Use the 'l'ist command."
+msgstr "ʸ½ñ¤Ë¤Ï±£¤·¥ê¥ó¥¯¤·¤«¤¢¤ê¤Þ¤»¤ó¡£[l]¤«¤éé¤Ã¤Æ¤¯¤À¤µ¤¤¡£"
+
+#: src/HTML.c:7852
+msgid "Source cache error - disk full?"
+msgstr "¥½¡¼¥¹¥­¥ã¥Ã¥·¥å¥¨¥é¡¼¤Ç¤¹ - ¥Ç¥£¥¹¥¯¤¬°ìÇÕ¤«¤â?"
+
+#: src/HTML.c:7865
+msgid "Source cache error - not enough memory!"
+msgstr "¥½¡¼¥¹¥­¥ã¥Ã¥·¥å¥¨¥é¡¼¤Ç¤¹ - ¥á¥â¥ê¤¬Â­¤ê¤Þ¤»¤ó!"
+
+#: src/LYBookmark.c:164
+msgid ""
+" This file is an HTML representation of the X Mosaic hotlist file.\n"
+" Outdated or invalid links may be removed by using the\n"
+" remove bookmark command, it is usually the 'R' key but may have\n"
+" been remapped by you or your system administrator."
+msgstr ""
+" ¤³¤Î¥Õ¥¡¥¤¥ë¤Ï X Moasaic ¥Û¥Ã¥È¥ê¥¹¥È¥Õ¥¡¥¤¥ë¤ò HTML ¤Ë¤·¤¿¤â¤Î¤Ç¤¹¡£\n"
+" µì¼°¤Ê¤¤¤·ÉÔÀµ¤Ê¥ê¥ó¥¯¤Ï¡¢¥Ö¥Ã¥¯¥Þ¡¼¥¯ºï½ü¥³¥Þ¥ó¥É¤Çºï½ü¤Ç¤­¤Þ¤¹¡£\n"
+" ¤³¤Î¥³¥Þ¥ó¥É¤ÏÄ̾ï [r] ¥­¡¼¤Ë³ä¤êÅö¤Æ¤é¤ì¤Æ¤¤¤Þ¤¹¤¬¡¢¤¢¤Ê¤¿¤«¥·¥¹¥Æ¥à\n"
+" ´ÉÍý¼Ô¤Ë¤è¤Ã¤ÆÊѹ¹¤µ¤ì¤Æ¤¤¤ë¤«¤â¤·¤ì¤Þ¤»¤ó¡£"
+
+#: src/LYBookmark.c:371
+#, c-format
+msgid ""
+" You can delete links by the 'R' key<br>\n"
+"<ol>\n"
+msgstr ""
+" [r] ¥­¡¼¤Ç¥ê¥ó¥¯¤òºï½ü¤Ç¤­¤Þ¤¹<br>\n"
+"<ol>\n"
+
+#: src/LYBookmark.c:374
+msgid ""
+" You can delete links using the remove bookmark command. It is usually\n"
+" the 'R' key but may have been remapped by you or your system\n"
+" administrator."
+msgstr ""
+" ¥ê¥ó¥¯¤Ï¥Ö¥Ã¥¯¥Þ¡¼¥¯ºï½ü¥³¥Þ¥ó¥É¤Çºï½ü¤Ç¤­¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Ï\n"
+" Ä̾ï [r] ¥­¡¼¤Ë³ä¤êÅö¤Æ¤é¤ì¤Æ¤¤¤Þ¤¹¤¬¡¢¤¢¤Ê¤¿¤«¥·¥¹¥Æ¥à´ÉÍý¼Ô¤Ë¤è¤Ã¤Æ\n"
+" Êѹ¹¤µ¤ì¤Æ¤¤¤ë¤«¤â¤·¤ì¤Þ¤»¤ó¡£"
+
+#: src/LYBookmark.c:378
+msgid ""
+" This file also may be edited with a standard text editor to delete\n"
+" outdated or invalid links, or to change their order."
+msgstr ""
+" ¤Þ¤¿¡¢É¸½àŪ¤Ê¥Æ¥­¥¹¥È¥¨¥Ç¥£¥¿¤ò»È¤Ã¤Æ¤³¤Î¥Õ¥¡¥¤¥ë¤òÊÔ½¸¤·¡¢\n"
+" ¸Å¤«¤Ã¤¿¤ê´Ö°ã¤Ã¤¿¤ê¤·¤Æ¤¤¤ë¥ê¥ó¥¯¤òºï½ü¤·¤¿¤ê¡¢\n"
+" ½çÈÖ¤òÊѤ¨¤¿¤ê¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£"
+
+#: src/LYBookmark.c:381
+msgid ""
+"Note: if you edit this file manually\n"
+" you should not change the format within the lines\n"
+" or add other HTML markup.\n"
+" Make sure any bookmark link is saved as a single line."
+msgstr ""
+"Ãí°Õ: ¤³¤Î¥Õ¥¡¥¤¥ë¤ò¼ê¤ÇÊÔ½¸¤¹¤ëºÝ¤Ë¤Ï¡¢³Æ¹Ô¤Î¥Õ¥©¡¼¥Þ¥Ã¥È¤ò\n"
+" Êѹ¹¤·¤¿¤ê¡¢Â¾¤Î HTML ¥Þ¡¼¥¯¥¢¥Ã¥×¤ò²Ã¤¨¤¿¤ê¤·¤Æ¤Ï¤Ê¤ê¤Þ¤»¤ó¡£\n"
+" ¥Ö¥Ã¥¯¥Þ¡¼¥¯¤Î¥ê¥ó¥¯¤Ï°ì¹Ô¤Ë¼ý¤Þ¤ë¤è¤¦¤Ë¤·¤Æ¤¯¤À¤µ¤¤¡£"
+
+#: src/LYBookmark.c:677
+#, c-format
+msgid "File may be recoverable from %s during this session"
+msgstr "¤³¤Î¥»¥Ã¥·¥ç¥ó¤Î´Ö¤Ï %s ¤«¤é¥Õ¥¡¥¤¥ë¤òÉüµì¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¤«¤â¤·¤ì¤Þ¤»¤ó"
+
+#: src/LYCgi.c:159
+#, c-format
+msgid "Do you want to execute \"%s\"?"
+msgstr ""
+
+#.
+#. * Neither the path as given nor any components examined by backing up
+#. * were stat()able. - kw
+#.
+#: src/LYCgi.c:274
+msgid "Unable to access cgi script"
+msgstr "cgi ¥¹¥¯¥ê¥×¥È¤Ë¥¢¥¯¥»¥¹¤Ç¤­¤Þ¤»¤ó"
+
+#: src/LYCgi.c:699 src/LYCgi.c:702
+msgid "Good Advice"
+msgstr "Îɤ¤¥¢¥É¥Ð¥¤¥¹"
+
+#: src/LYCgi.c:706
+msgid "An excellent http server for VMS is available via"
+msgstr "VMS ¤Ë¤·¤Æ¤Ï¤Ê¤«¤Ê¤«Í¥¤ì¤¿ http ¥µ¡¼¥Ð¤¬°Ê²¼¤«¤éÍøÍѲÄǽ¤Ç¤¹: "
+
+#: src/LYCgi.c:713
+msgid "this link"
+msgstr "¤³¤Î¥ê¥ó¥¯"
+
+#: src/LYCgi.c:717
+msgid "It provides state of the art CGI script support.\n"
+msgstr "¸½ºß˾¤ß¤¦¤ëºÇ¹â¿å½à¤Î CGI ¥¹¥¯¥ê¥×¥È¥µ¥Ý¡¼¥È¤òÈ÷¤¨¤Æ¤¤¤Þ¤¹¡£\n"
+
+#: src/LYClean.c:122
+msgid "Exiting via interrupt:"
+msgstr "½ªÎ»¤·¤Þ¤¹ ¸¶°ø: ³ä¤ê¹þ¤ß"
+
+#: src/LYCookie.c:2461
+msgid "(from a previous session)"
+msgstr "(°ÊÁ°¤Î¥»¥Ã¥·¥ç¥ó¤«¤é)"
+
+#: src/LYCookie.c:2522
+msgid "Maximum Gobble Date:"
+msgstr "¾ÞÌ£´ü¸Â:"
+
+#: src/LYCookie.c:2562
+msgid "Internal"
+msgstr "ÆâÉô"
+
+#: src/LYCookie.c:2563
+msgid "cookie_domain_flag_set error, aborting program"
+msgstr "cookie_domain_flag_set ¥¨¥é¡¼¡¢¥×¥í¥°¥é¥à¤ò½ªÎ»¤·¤Þ¤¹"
+
+#: src/LYCurses.c:1088
+msgid "Terminal initialisation failed - unknown terminal type?"
+msgstr "üËö¤Î½é´ü²½¤Ë¼ºÇÔ¤·¤Þ¤·¤¿ - üËö¤Î¥¿¥¤¥×¤¬ÉÔÌÀ?"
+
+#: src/LYCurses.c:1546
+msgid "Terminal ="
+msgstr "üËö ="
+
+#: src/LYCurses.c:1550
+msgid "You must use a vt100, 200, etc. terminal with this program."
+msgstr "¤³¤Î¥×¥í¥°¥é¥à¤Ï vt100¡¢200 ¤Ê¤É¤ÎüËö¾å¤Ç¼Â¹Ô¤·¤Æ¤¯¤À¤µ¤¤¡£"
+
+#: src/LYCurses.c:1599
+msgid "Your Terminal type is unknown!"
+msgstr "¤ª»È¤¤¤ÎüËö¥¿¥¤¥×¤¬Ê¬¤«¤ê¤Þ¤»¤ó!"
+
+#: src/LYCurses.c:1600
+msgid "Enter a terminal type:"
+msgstr "üËö¥¿¥¤¥×¤òÆþÎÏ:"
+
+#: src/LYCurses.c:1614
+msgid "TERMINAL TYPE IS SET TO"
+msgstr "ÀßÄꤵ¤ì¤ëüËö¥¿¥¤¥×¤Ï"
+
+#: src/LYCurses.c:2127
+#, c-format
+msgid ""
+"\n"
+"A Fatal error has occurred in %s Ver. %s\n"
+msgstr ""
+"\n"
+"Ã×̿Ū¤Ê¥¨¥é¡¼¤¬ %s ¥Ð¡¼¥¸¥ç¥ó %s ¤ÇȯÀ¸¤·¤Þ¤·¤¿\n"
+
+#: src/LYCurses.c:2130
+#, c-format
+msgid ""
+"\n"
+"Please notify your system administrator to confirm a bug, and if\n"
+"confirmed, to notify the lynx-dev list. Bug reports should have concise\n"
+"descriptions of the command and/or URL which causes the problem, the\n"
+"operating system name with version number, the TCPIP implementation, the\n"
+"TRACEBACK if it can be captured, and any other relevant information.\n"
+msgstr ""
+"\n"
+"¥Ð¥°¤ò³Îǧ¤¹¤ë¤¿¤á¥·¥¹¥Æ¥à´ÉÍý¼Ô¤ËÏ¢Íí¤·¡¢¤â¤·³Îǧ¤µ¤ì¤¿¤Ê¤é¤Ð lynx-dev \n"
+"¥á¡¼¥ê¥ó¥°¥ê¥¹¥È¤ËÏ¢Íí¤·¤Æ¤¯¤À¤µ¤¤¡£¥Ð¥°Êó¹ð¤Ë¤Ï¡¢ÌäÂê¤òµ¯¤³¤·¤¿¥³¥Þ¥ó¥É¤«\n"
+"URL ¤ÎÀµ³Î¤ÊÀâÌÀ¤È¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¥·¥¹¥Æ¥à̾(¥Ð¡¼¥¸¥ç¥óÈÖ¹æ´Þ¤à)¡¢TCPIP \n"
+"¼ÂÁõ¡¢¤â¤·Ê᪤Ǥ­¤¿¤Ê¤é¤Ð TRACEBACK¡¢¤½¤Î¾¤ÎŬÀڤʾðÊó¤ò´Þ¤á¤Æ¤¯¤À¤µ¤¤¡£\n"
+
+#: src/LYEdit.c:266
+#, fuzzy, c-format
+msgid "Error starting editor, %s"
+msgstr "%d ¹ÔÌÜ(%s Ãæ)¤Î½èÍý¤Ç¥¨¥é¡¼\n"
+
+#: src/LYEdit.c:269
+msgid "Editor killed by signal"
+msgstr "¥¨¥Ç¥£¥¿¤¬°Û¾ï½ªÎ»¤·¤Þ¤·¤¿ ¥·¥°¥Ê¥ë:"
+
+#: src/LYEdit.c:274
+#, fuzzy, c-format
+msgid "Editor returned with error status %s"
+msgstr "¥¨¥Ç¥£¥¿¤Ï¥¨¥é¡¼¥¹¥Æ¡¼¥¿¥¹ %s ¤òÊÖ¤·¤Þ¤·¤¿"
+
+#: src/LYDownload.c:504
+msgid "Downloaded link:"
+msgstr "¥À¥¦¥ó¥í¡¼¥É¤·¤¿¥ê¥ó¥¯:"
+
+#: src/LYDownload.c:509
+msgid "Suggested file name:"
+msgstr "¿ä¾©¤¹¤ë¥Õ¥¡¥¤¥ë̾:"
+
+#: src/LYDownload.c:514
+msgid "Standard download options:"
+msgstr "ɸ½à¤Î¥À¥¦¥ó¥í¡¼¥ÉÀè:"
+
+#: src/LYDownload.c:515
+msgid "Download options:"
+msgstr "¥À¥¦¥ó¥í¡¼¥ÉÀè"
+
+#: src/LYDownload.c:531
+msgid "Save to disk"
+msgstr "¥Ç¥£¥¹¥¯¤ËÊݸ"
+
+#: src/LYDownload.c:545
+#, fuzzy
+msgid "View temporary file"
+msgstr "¥Õ¥¡¥¤¥ë¤ò±ÜÍ÷"
+
+#: src/LYDownload.c:552
+msgid "Save to disk disabled."
+msgstr "¥Ç¥£¥¹¥¯¤ËÊݸ¤Ç¤­¤Þ¤»¤ó¡£"
+
+#: src/LYDownload.c:556 src/LYPrint.c:1310
+msgid "Local additions:"
+msgstr "¥í¡¼¥«¥ë¤Ç¤ÎÄɲÃ:"
+
+#: src/LYDownload.c:567 src/LYUpload.c:211
+msgid "No Name Given"
+msgstr "̾Á°¤¬»ØÄꤵ¤ì¤Æ¤¤¤Þ¤»¤ó"
+
+#: src/LYHistory.c:672
+msgid "You selected:"
+msgstr "ÁªÂò¤·¤¿¥Ú¡¼¥¸: "
+
+#: src/LYHistory.c:696 src/LYHistory.c:925
+msgid "(no address)"
+msgstr "(¥¢¥É¥ì¥¹¤Ê¤·)"
+
+#: src/LYHistory.c:700
+msgid " (internal)"
+msgstr " (ÆâÉô)"
+
+#: src/LYHistory.c:702
+msgid " (was internal)"
+msgstr "(¤«¤Ä¤ÆÆâÉô)"
+
+#: src/LYHistory.c:800
+msgid " (From History)"
+msgstr " (ÍúÎò¤è¤ê)"
+
+#: src/LYHistory.c:845
+msgid "You visited (POSTs, bookmark, menu and list files excluded):"
+msgstr "¤¢¤Ê¤¿¤¬Ë¬¤ì¤¿¥ê¥ó¥¯(POST¡¢¥Ö¥Ã¥¯¥Þ¡¼¥¯¡¢¥á¥Ë¥å¡¼¡¢¥ê¥¹¥È¥Õ¥¡¥¤¥ë¤Ï½ü¤¯):"
+
+#: src/LYHistory.c:1138
+msgid "(No messages yet)"
+msgstr "(¤Þ¤À¥á¥Ã¥»¡¼¥¸¤Ï̵¤¤)"
+
+#: src/LYLeaks.c:220
+msgid "Invalid pointer detected."
+msgstr "ÉÔÀµ¤Ê¥Ý¥¤¥ó¥¿¤¬¸¡½Ð¤µ¤ì¤Þ¤·¤¿¡£"
+
+#: src/LYLeaks.c:222 src/LYLeaks.c:260
+msgid "Sequence:"
+msgstr ""
+
+#: src/LYLeaks.c:225 src/LYLeaks.c:263
+msgid "Pointer:"
+msgstr "¥Ý¥¤¥ó¥¿:"
+
+#: src/LYLeaks.c:234 src/LYLeaks.c:241 src/LYLeaks.c:282
+msgid "FileName:"
+msgstr "¥Õ¥¡¥¤¥ë̾:"
+
+#: src/LYLeaks.c:237 src/LYLeaks.c:244 src/LYLeaks.c:285 src/LYLeaks.c:296
+msgid "LineCount:"
+msgstr "¹Ô¿ô:"
+
+#: src/LYLeaks.c:258
+msgid "Memory leak detected."
+msgstr "¥á¥â¥ê¥ê¡¼¥¯¤¬¸¡½Ð¤µ¤ì¤Þ¤·¤¿¡£"
+
+#: src/LYLeaks.c:266
+msgid "Contains:"
+msgstr "´Þ¤à:"
+
+#: src/LYLeaks.c:279
+msgid "ByteSize:"
+msgstr "¥Ð¥¤¥È¥µ¥¤¥º:"
+
+#: src/LYLeaks.c:293
+msgid "realloced:"
+msgstr "ºÆ³ä¤êÅö¤Æ:"
+
+#: src/LYLeaks.c:314
+msgid "Total memory leakage this run:"
+msgstr "º£²ó¤Î¼Â¹Ô¤Ç¤Î¥á¥â¥ê¥ê¡¼¥¯ÁíÎÌ"
+
+#: src/LYLeaks.c:317
+msgid "Peak allocation"
+msgstr ""
+
+#: src/LYLeaks.c:318
+#, fuzzy
+msgid "Bytes allocated"
+msgstr "ºÆ³ä¤êÅö¤Æ:"
+
+#: src/LYLeaks.c:319
+msgid "Total mallocs"
+msgstr ""
+
+#: src/LYLeaks.c:320
+msgid "Total frees"
+msgstr ""
+
+#: src/LYList.c:84
+msgid "References in "
+msgstr "±¦¤«¤é¤Î»²¾È: "
+
+#: src/LYList.c:87
+msgid "this document:"
+msgstr "¤³¤Îʸ½ñ:"
+
+#: src/LYList.c:93
+msgid "Visible links:"
+msgstr "¸«¤¨¤ë¥ê¥ó¥¯:"
+
+#: src/LYList.c:194 src/LYList.c:295
+msgid "Hidden links:"
+msgstr "±£¤µ¤ì¤¿¥ê¥ó¥¯:"
+
+#: src/LYList.c:332
+msgid "References"
+msgstr "»²¾È"
+
+#: src/LYList.c:336
+msgid "Visible links"
+msgstr "¸«¤¨¤ë¥ê¥ó¥¯"
+
+#: src/LYLocal.c:269
+#, c-format
+msgid "Unable to get status of '%s'."
+msgstr "'%s' ¤Î¥¹¥Æ¡¼¥¿¥¹¤òÆÀ¤ë¤³¤È¤¬¤Ç¤­¤Þ¤»¤ó¡£"
+
+#: src/LYLocal.c:303
+msgid "The selected item is not a file or a directory! Request ignored."
+msgstr "ÁªÂò¤µ¤ì¤¿¥¢¥¤¥Æ¥à¤Ï¥Õ¥¡¥¤¥ë¤Ç¤â¥Ç¥£¥ì¥¯¥È¥ê¤Ç¤â¤¢¤ê¤Þ¤»¤ó¡£¥ê¥¯¥¨¥¹¥È¤Ï̵»ë¤µ¤ì¤Þ¤¹¡£"
+
+#: src/LYLocal.c:371
+#, c-format
+msgid "Unable to %s due to system error!"
+msgstr "¥·¥¹¥Æ¥à¥¨¥é¡¼¤Ë¤è¤ê %s ¤Ç¤­¤Þ¤»¤ó!"
+
+#: src/LYLocal.c:405
+#, c-format
+msgid "Probable failure to %s due to system error!"
+msgstr "¥·¥¹¥Æ¥à¥¨¥é¡¼¤Ë¤è¤ê %s ¤¬¼ºÇÔ¤·¤¿¤è¤¦¤Ç¤¹!"
+
+#: src/LYLocal.c:467 src/LYLocal.c:488
+#, c-format
+msgid "remove %s"
+msgstr "%s ¤òºï½ü¤·¤Þ¤¹"
+
+#: src/LYLocal.c:506
+#, c-format
+msgid "touch %s"
+msgstr "%s ¤ò touch ¤·¤Þ¤¹"
+
+#: src/LYLocal.c:534
+#, c-format
+msgid "move %s to %s"
+msgstr "%s ¤ò %s ¤Ë°ÜÆ°¤·¤Þ¤¹"
+
+#: src/LYLocal.c:575
+msgid "There is already a directory with that name! Request ignored."
+msgstr "»ØÄê¤Î̾Á°¤ò»ý¤Ä¥Ç¥£¥ì¥¯¥È¥ê¤¬¤¹¤Ç¤Ë¸ºß¤·¤Þ¤¹! ¥ê¥¯¥¨¥¹¥È¤Ï̵»ë¤µ¤ì¤Þ¤·¤¿¡£"
+
+#: src/LYLocal.c:577
+msgid "There is already a file with that name! Request ignored."
+msgstr "»ØÄê¤Î̾Á°¤ò»ý¤Ä¥Õ¥¡¥¤¥ë¤¬¤¹¤Ç¤Ë¸ºß¤·¤Þ¤¹! ¥ê¥¯¥¨¥¹¥È¤Ï̵»ë¤µ¤ì¤Þ¤·¤¿¡£"
+
+#: src/LYLocal.c:579
+msgid "The specified name is already in use! Request ignored."
+msgstr "»ØÄê¤Î̾Á°¤Ï¤¹¤Ç¤Ë»È¤ï¤ì¤Æ¤¤¤Þ¤¹! ¥ê¥¯¥¨¥¹¥È¤Ï̵»ë¤µ¤ì¤Þ¤·¤¿¡£"
+
+#: src/LYLocal.c:590
+msgid "Destination has different owner! Request denied."
+msgstr "ÌÜŪÃϤϽêÍ­¼Ô¤¬°Û¤Ê¤ê¤Þ¤¹! ¥ê¥¯¥¨¥¹¥È¤ÏµñÈݤµ¤ì¤Þ¤·¤¿¡£"
+
+#: src/LYLocal.c:593
+msgid "Destination is not a valid directory! Request denied."
+msgstr "ÌÜŪÃϤÏÀµ¤·¤¤¥Ç¥£¥ì¥¯¥È¥ê¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó! Í×µá¤ÏµñÈݤµ¤ì¤Þ¤·¤¿¡£"
+
+#: src/LYLocal.c:615
+msgid "Remove all tagged files and directories?"
+msgstr "ÁªÂò¤·¤¿Á´¤Æ¤Î¥Õ¥¡¥¤¥ë¤È¥Ç¥£¥ì¥¯¥È¥ê¤òºï½ü¤·¤Þ¤¹¤«?"
+
+#: src/LYLocal.c:673
+msgid "Enter new location for tagged items: "
+msgstr "ÁªÂò¤·¤¿¥¢¥¤¥Æ¥à¤Î¿·¤·¤¤¾ì½ê¤òÆþÎÏ: "
+
+#: src/LYLocal.c:743
+msgid "Path too long"
+msgstr "¥Ñ¥¹¤¬Ä¹¤¹¤®¤Þ¤¹"
+
+#: src/LYLocal.c:774
+msgid "Source and destination are the same location - request ignored!"
+msgstr "¥½¡¼¥¹¤ÈÌÜŪÃϤ¬Æ±¤¸¾ì½ê¤Ç¤¹ - Í×µá¤Ï̵»ë¤µ¤ì¤Þ¤·¤¿!"
+
+#: src/LYLocal.c:831
+msgid "Enter new name for directory: "
+msgstr "¿·¤·¤¤¥Ç¥£¥ì¥¯¥È¥ê̾¤òÆþÎÏ"
+
+#: src/LYLocal.c:833
+msgid "Enter new name for file: "
+msgstr "¿·¤·¤¤¥Õ¥¡¥¤¥ë̾¤òÆþÎÏ: "
+
+#: src/LYLocal.c:845
+msgid "Illegal character (path-separator) found! Request ignored."
+msgstr "ÉÔÀµ¤Ê¥­¥ã¥é¥¯¥¿(¥Ñ¥¹¥»¥Ñ¥ì¡¼¥¿)¤¬¸«¤Ä¤«¤ê¤Þ¤·¤¿! ¥ê¥¯¥¨¥¹¥È¤Ï̵»ë¤µ¤ì¤Þ¤·¤¿¡£"
+
+#: src/LYLocal.c:895
+msgid "Enter new location for directory: "
+msgstr "¥Ç¥£¥ì¥¯¥È¥ê¤Î¿·¤·¤¤¾ì½ê¤òÆþÎÏ: "
+
+#: src/LYLocal.c:901
+msgid "Enter new location for file: "
+msgstr "¥Õ¥¡¥¤¥ë¤Î¿·¤·¤¤¾ì½ê¤òÆþÎÏ: "
+
+#: src/LYLocal.c:928
+msgid "Unexpected failure - unable to find trailing path separator"
+msgstr "ͽ´ü¤»¤Ì¼ºÇÔ - Äɤ¦¥Ñ¥¹¥»¥Ñ¥ì¡¼¥¿¤ò¸«¤Ä¤±¤é¤ì¤Þ¤»¤ó"
+
+#: src/LYLocal.c:948
+msgid "Source and destination are the same location! Request ignored!"
+msgstr "¥½¡¼¥¹¤ÈÌÜŪÃϤ¬Æ±¤¸¾ì½ê¤Ç¤¹! ¥ê¥¯¥¨¥¹¥È¤Ï̵»ë¤µ¤ì¤Þ¤¹!"
+
+#: src/LYLocal.c:995
+msgid "Modify name, location, or permission (n, l, or p): "
+msgstr "[n]̾Á°¡¢[l]¾ì½ê¡¢¤¢¤ë¤¤¤Ï [p]¥Ñ¡¼¥ß¥Ã¥·¥ç¥ó¤òÊѹ¹: "
+
+#: src/LYLocal.c:997
+msgid "Modify name or location (n or l): "
+msgstr "[n]̾Á° ¤¢¤ë¤¤¤Ï [l]¾ì½ê¤òÊѹ¹: "
+
+#.
+#. * Code for changing ownership needed here.
+#.
+#: src/LYLocal.c:1026
+msgid "This feature not yet implemented!"
+msgstr "¤³¤Îµ¡Ç½¤Ï¤Þ¤À¼ÂÁõ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó!"
+
+#: src/LYLocal.c:1046
+msgid "Enter name of file to create: "
+msgstr "ºîÀ®¤¹¤ë¥Õ¥¡¥¤¥ë̾¤òÆþÎÏ: "
+
+#: src/LYLocal.c:1050 src/LYLocal.c:1086
+msgid "Illegal redirection \"//\" found! Request ignored."
+msgstr "ÉÔÀµ¤Ê¥ê¥À¥¤¥ì¥¯¥·¥ç¥ó \"//\" ¤ò¸¡½Ð¤·¤Þ¤·¤¿! Í×µá¤Ï̵»ë¤µ¤ì¤Þ¤¹¡£"
+
+#: src/LYLocal.c:1082
+msgid "Enter name for new directory: "
+msgstr "¿·¤·¤¤¥Ç¥£¥ì¥¯¥È¥ê̾¤òÆþÎÏ: "
+
+#: src/LYLocal.c:1122
+msgid "Create file or directory (f or d): "
+msgstr "¥Õ¥¡¥¤¥ë [f] ¤Þ¤¿¤Ï ¥Ç¥£¥ì¥¯¥È¥ê [d] ¤òºîÀ®: "
+
+#: src/LYLocal.c:1164
+#, fuzzy, c-format
+msgid "Remove directory '%s'?"
+msgstr "¥Õ¥¡¥¤¥ë '%s' ¤òºï½ü¤·¤Þ¤¹¤«?"
+
+#: src/LYLocal.c:1167
+#, fuzzy
+msgid "Remove directory?"
+msgstr " ¥Ç¥£¥ì¥¯¥È¥ê"
+
+#: src/LYLocal.c:1172
+#, c-format
+msgid "Remove file '%s'?"
+msgstr "¥Õ¥¡¥¤¥ë '%s' ¤òºï½ü¤·¤Þ¤¹¤«?"
+
+#: src/LYLocal.c:1174
+msgid "Remove file?"
+msgstr "¥Õ¥¡¥¤¥ë¤òºï½ü¤·¤Þ¤¹¤«?"
+
+#: src/LYLocal.c:1179
+#, c-format
+msgid "Remove symbolic link '%s'?"
+msgstr "¥·¥ó¥Ü¥ê¥Ã¥¯¥ê¥ó¥¯ '%s' ¤òºï½ü¤·¤Þ¤¹¤«?"
+
+#: src/LYLocal.c:1181
+msgid "Remove symbolic link?"
+msgstr "¥·¥ó¥Ü¥ê¥Ã¥¯¥ê¥ó¥¯¤òºï½ü¤·¤Þ¤¹¤«?"
+
+#: src/LYLocal.c:1276
+msgid "Sorry, don't know how to permit non-UNIX files yet."
+msgstr "Èó UNIX ¥Õ¥¡¥¤¥ë¤Î¥Ñ¡¼¥ß¥Ã¥·¥ç¥ó¤Ï¤Þ¤À°·¤¨¤Þ¤»¤ó¡£"
+
+#: src/LYLocal.c:1306
+msgid "Unable to open permit options file"
+msgstr "¥Ñ¡¼¥ß¥Ã¥·¥ç¥ó¥ª¥×¥·¥ç¥ó¥Õ¥¡¥¤¥ë¤¬³«¤±¤Þ¤»¤ó"
+
+#: src/LYLocal.c:1336
+msgid "Specify permissions below:"
+msgstr "°Ê²¼¤Î¥Ñ¡¼¥ß¥Ã¥·¥ç¥ó¤ò»ØÄê:"
+
+#: src/LYLocal.c:1337 src/LYShowInfo.c:260
+msgid "Owner:"
+msgstr "½êÍ­¼Ô:"
+
+#: src/LYLocal.c:1353
+msgid "Group"
+msgstr "¥°¥ë¡¼¥×"
+
+#: src/LYLocal.c:1369
+msgid "Others:"
+msgstr "¤½¤Î¾:"
+
+#: src/LYLocal.c:1387
+msgid "form to permit"
+msgstr "µö²Ä¤¹¤ë¥Õ¥©¡¼¥à"
+
+#: src/LYLocal.c:1482
+msgid "Invalid mode format."
+msgstr "ÉÔÀµ¤Ê¥â¡¼¥É¥Õ¥©¡¼¥Þ¥Ã¥È"
+
+#: src/LYLocal.c:1486
+msgid "Invalid syntax format."
+msgstr "ÉÔÀµ¤Ê¹½Ê¸¥Õ¥©¡¼¥Þ¥Ã¥È"
+
+#: src/LYLocal.c:1668
+msgid "Warning! UUDecoded file will exist in the directory you started Lynx."
+msgstr "Ãí°Õ! UUDecode ¤µ¤ì¤¿¥Õ¥¡¥¤¥ë¤Ï¤¢¤Ê¤¿¤¬ Lynx ¤òµ¯Æ°¤·¤¿¥Ç¥£¥ì¥¯¥È¥êÆâ¤ËÃÖ¤«¤ì¤Þ¤¹¡£"
+
+#: src/LYLocal.c:1858
+msgid "NULL URL pointer"
+msgstr "¥Ì¥ë URL ¥Ý¥¤¥ó¥¿"
+
+#: src/LYLocal.c:1940
+#, c-format
+msgid "Executing %s "
+msgstr "%s ¤ò¼Â¹ÔÃæ "
+
+#: src/LYLocal.c:1943
+msgid "Executing system command. This might take a while."
+msgstr "¥·¥¹¥Æ¥à¥³¥Þ¥ó¥É¤ò¼Â¹ÔÃæ¤Ç¤¹¡£¤·¤Ð¤é¤¯¤«¤«¤ê¤Þ¤¹¡£"
+
+#: src/LYLocal.c:2015
+msgid "Current directory:"
+msgstr "¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê:"
+
+#: src/LYLocal.c:2018 src/LYLocal.c:2036
+msgid "Current selection:"
+msgstr "¸½ºßÁªÂò:"
+
+#: src/LYLocal.c:2022
+msgid "Nothing currently selected."
+msgstr "¸½ºß²¿¤âÁªÂò¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£"
+
+#: src/LYLocal.c:2038
+msgid "tagged item:"
+msgstr "ÁªÂò¤µ¤ì¤¿¥¢¥¤¥Æ¥à:"
+
+#: src/LYLocal.c:2039
+msgid "tagged items:"
+msgstr "ÁªÂò¤µ¤ì¤¿¥¢¥¤¥Æ¥à:"
+
+#: src/LYLocal.c:2136 src/LYLocal.c:2147
+msgid "Illegal filename; request ignored."
+msgstr "ÉÔÀµ¤Ê¥Õ¥¡¥¤¥ë̾¤Ç¤¹: Í×µá¤Ï̵»ë¤µ¤ì¤Þ¤¹¡£"
+
+#. directory not writable
+#: src/LYLocal.c:2245 src/LYLocal.c:2304
+msgid "Install in the selected directory not permitted."
+msgstr "ÁªÂò¤µ¤ì¤¿¥Ç¥£¥ì¥¯¥È¥ê¤Ø¤Î¥¤¥ó¥¹¥È¡¼¥ë¤Ïµö²Ä¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£"
+
+#: src/LYLocal.c:2300
+msgid "The selected item is not a directory! Request ignored."
+msgstr "ÁªÂò¤µ¤ì¤¿¥¢¥¤¥Æ¥à¤Ï¥Ç¥£¥ì¥¯¥È¥ê¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó! Í×µá¤Ï̵»ë¤µ¤ì¤Þ¤¹¡£"
+
+#: src/LYLocal.c:2309
+msgid "Just a moment, ..."
+msgstr "¤ªÂÔ¤Á¤¯¤À¤µ¤¤ ..."
+
+#: src/LYLocal.c:2326
+#, fuzzy
+msgid "Error building install args"
+msgstr "¥¤¥ó¥¹¥È¡¼¥ë°ú¿ô¤òÀ¸À®¤¹¤ë¤Î¤Ë¼ºÇÔ¤·¤Þ¤·¤¿"
+
+#: src/LYLocal.c:2341 src/LYLocal.c:2372
+#, c-format
+msgid "Source and target are the same: %s"
+msgstr "¥½¡¼¥¹¤È¥¿¡¼¥²¥Ã¥È¤¬Æ±¤¸¤Ç¤¹: %s"
+
+#: src/LYLocal.c:2348 src/LYLocal.c:2379
+#, c-format
+msgid "Already in target directory: %s"
+msgstr "¤¹¤Ç¤Ë¥¿¡¼¥²¥Ã¥È¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤¤¤Þ¤¹: %s"
+
+#: src/LYLocal.c:2397
+msgid "Installation complete"
+msgstr "¥¤¥ó¥¹¥È¡¼¥ë´°Î»"
+
+#: src/LYLocal.c:2584
+msgid "Temporary URL or list would be too long."
+msgstr "°ì»þŪ URL ¤¢¤ë¤¤¤Ï¥ê¥¹¥È¤¬Ä¹¤¹¤®¤ë¤è¤¦¤Ç¤¹¡£"
+
+#: src/LYMail.c:520
+msgid "Sending"
+msgstr "Á÷¿®Ãæ"
+
+#: src/LYMail.c:1006
+#, c-format
+msgid "The link %s :?: %s \n"
+msgstr "¥ê¥ó¥¯ %s :?: %s \n"
+
+#: src/LYMail.c:1008
+#, c-format
+msgid "called \"%s\"\n"
+msgstr "\"%s\"¤È¤·¤Æ¸Æ¤Ð¤ì¤ë\n"
+
+#: src/LYMail.c:1009
+#, c-format
+msgid "in the file \"%s\" called \"%s\"\n"
+msgstr "¥Õ¥¡¥¤¥ë \"%s\" ¤Ç \"%s\" ¤È¸Æ¤Ð¤ì¤ë\n"
+
+#: src/LYMail.c:1010
+msgid "was requested but was not available."
+msgstr "¤¬Í׵ᤵ¤ì¤Þ¤·¤¿¤¬ÍøÍѤǤ­¤Þ¤»¤ó¤Ç¤·¤¿¡£"
+
+#: src/LYMail.c:1011
+msgid "Thought you might want to know."
+msgstr "¤¢¤Ê¤¿¤¬ÃΤꤿ¤¤¤«¤â¤·¤ì¤Ê¤¤¤È»×¤¤¤Þ¤·¤¿¡£"
+
+#: src/LYMail.c:1013
+msgid "This message was automatically generated by"
+msgstr "¤³¤Î¥á¥Ã¥»¡¼¥¸¤Ï°Ê²¼¤Ë¤è¤Ã¤Æ¼«Æ°Åª¤ËÀ¸À®¤µ¤ì¤Þ¤·¤¿: "
+
+#: src/LYMail.c:1728
+msgid "No system mailer configured"
+msgstr ""
+
+#: src/LYMain.c:1022
+msgid "No Winsock found, sorry."
+msgstr "Winsock ¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó¡£"
+
+#: src/LYMain.c:1225
+#, fuzzy
+msgid "You MUST define a valid TMP or TEMP area!"
+msgstr "TMP ¤Ê¤¤¤· TEMP Îΰè¤òÀµ¤·¤¯ÄêµÁ¤·¤Ê¤±¤ì¤Ð*¤Ê¤ê¤Þ¤»¤ó*!\n"
+
+#: src/LYMain.c:1278 src/LYMainLoop.c:5074
+msgid "No such directory"
+msgstr "¤½¤ó¤Ê¥Ç¥£¥ì¥¯¥È¥ê¤Ï¤¢¤ê¤Þ¤»¤ó"
+
+#: src/LYMain.c:1463
+#, fuzzy, c-format
+msgid ""
+"\n"
+"Configuration file \"%s\" is not available.\n"
+"\n"
+msgstr ""
+"\n"
+"ÄêµÁ¥Õ¥¡¥¤¥ë %s ¤¬ÍøÍѤǤ­¤Þ¤»¤ó¡£\n"
+"\n"
+
+#: src/LYMain.c:1473
+#, c-format
+msgid ""
+"\n"
+"Lynx character sets not declared.\n"
+"\n"
+msgstr ""
+"\n"
+"Lynx ¥­¥ã¥é¥¯¥¿¥»¥Ã¥È¤¬Àë¸À¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£\n"
+"\n"
+
+#: src/LYMain.c:1502
+#, c-format
+msgid ""
+"\n"
+"Lynx edit map not declared.\n"
+"\n"
+msgstr ""
+"\n"
+"Lynx ÊÔ½¸¥Þ¥Ã¥×¤¬Àë¸À¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£\n"
+"\n"
+
+#: src/LYMain.c:1578
+#, fuzzy, c-format
+msgid ""
+"\n"
+"Lynx file \"%s\" is not available.\n"
+"\n"
+msgstr ""
+"\n"
+"Lynx ¥Õ¥¡¥¤¥ë %s ¤ÏÍøÍѤǤ­¤Þ¤»¤ó¡£\n"
+"\n"
+
+#: src/LYMain.c:1653
+#, c-format
+msgid "Ignored %d characters from standard input.\n"
+msgstr ""
+
+#: src/LYMain.c:1655
+#, c-format
+msgid "Use \"-stdin\" or \"-\" to tell how to handle piped input.\n"
+msgstr ""
+
+#: src/LYMain.c:1803
+msgid "Warning:"
+msgstr "Ãí°Õ: "
+
+#: src/LYMain.c:2371
+msgid "persistent cookies state will be changed in next session only."
+msgstr "±Ê³Ū¥¯¥Ã¥­¡¼¤Î¾õÂ֤ϼ¡¤Î¥»¥Ã¥·¥ç¥ó¤Ë¤Ê¤é¤Ê¤¤¤ÈÊѹ¹¤µ¤ì¤Þ¤»¤ó¡£"
+
+#: src/LYMain.c:2616 src/LYMain.c:2661
+#, c-format
+msgid "Lynx: ignoring unrecognized charset=%s\n"
+msgstr "Lynx: ÉÔÌÀ¤Ê¥­¥ã¥é¥¯¥¿¥»¥Ã¥È %s ¤ò̵»ë¤·¤Þ¤¹¡£\n"
+
+#: src/LYMain.c:3180
+#, fuzzy, c-format
+msgid "%s Version %s (%s)"
+msgstr "%s ¥Ð¡¼¥¸¥ç¥ó %s (%s)\n"
+
+#: src/LYMain.c:3218
+#, c-format
+msgid "Built on %s %s %s\n"
+msgstr "%s ¾å¤Ç %s %s ¤Ë¥Ó¥ë¥É¤µ¤ì¤Þ¤·¤¿¡£\n"
+
+#: src/LYMain.c:3240
+msgid "Copyrights held by the Lynx Developers Group,"
+msgstr ""
+
+#: src/LYMain.c:3241
+#, fuzzy
+msgid "the University of Kansas, CERN, and other contributors."
+msgstr "¥«¥ó¥¶¥¹Âç³Ø¡¢CERN ¤È¤½¤Î¾¤Î¹×¸¥¼Ô¤¬Ãøºî¸¢¤òÊÝÍ­¤·¡¢\n"
+
+#: src/LYMain.c:3242
+#, fuzzy
+msgid "Distributed under the GNU General Public License (Version 2)."
+msgstr "GNU °ìÈ̸øÍ­»ÈÍѵöÂú·ÀÌó½ñ¤Î²¼¤ÇÇÛÉÛ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£\n"
+
+#: src/LYMain.c:3243
+#, fuzzy
+msgid "See http://lynx.isc.org/ and the online help for more information."
+msgstr ""
+"¾Ü¤·¤¯¤Ï http://lynx.browser.org/ ¤È¥ª¥ó¥é¥¤¥ó¥Ø¥ë¥×¤ò¤´Í÷¤¯¤À¤µ¤¤¡£\n"
+"\n"
+
+#: src/LYMain.c:4060
+#, c-format
+msgid "USAGE: %s [options] [file]\n"
+msgstr "»È¤¤Êý: %s [¥ª¥×¥·¥ç¥ó] [¥Õ¥¡¥¤¥ë]\n"
+
+#: src/LYMain.c:4061
+#, c-format
+msgid "Options are:\n"
+msgstr "¥ª¥×¥·¥ç¥ó:\n"
+
+#: src/LYMain.c:4360
+#, c-format
+msgid "%s: Invalid Option: %s\n"
+msgstr "%s: ÉÔÀµ¤Ê¥ª¥×¥·¥ç¥ó¤Ç¤¹: %s\n"
+
+#: src/LYMainLoop.c:594
+#, c-format
+msgid "Internal error: Invalid mouse link %d!"
+msgstr "ÆâÉô¥¨¥é¡¼: %d ¤ÏÉÔÀµ¤Ê¥Þ¥¦¥¹¥ê¥ó¥¯¤Ç¤¹!"
+
+#: src/LYMainLoop.c:714 src/LYMainLoop.c:5096
+msgid "A URL specified by the user"
+msgstr "¥æ¡¼¥¶¤Ë¤è¤Ã¤Æ»ØÄꤵ¤ì¤¿ URL"
+
+#: src/LYMainLoop.c:1173
+msgid "Enctype multipart/form-data not yet supported! Cannot submit."
+msgstr "Enctype multipart/form-data ¤Ï¤Þ¤À¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó! Á÷¿®¤Ç¤­¤Þ¤»¤ó¡£"
+
+#.
+#. * Make a name for this help file.
+#.
+#: src/LYMainLoop.c:3105
+msgid "Help Screen"
+msgstr "¥Ø¥ë¥×²èÌÌ"
+
+#: src/LYMainLoop.c:3226
+msgid "System Index"
+msgstr "¥·¥¹¥Æ¥à¥¤¥ó¥Ç¥Ã¥¯¥¹"
+
+#: src/LYMainLoop.c:3585 src/LYMainLoop.c:5324
+msgid "Entry into main screen"
+msgstr "¥á¥¤¥ó²èÌ̤ؤÎÆþÎÏ"
+
+#: src/LYMainLoop.c:3843
+msgid "No next document present"
+msgstr "¼¡¤Î¥É¥­¥å¥á¥ó¥È¤¬Â¸ºß¤·¤Þ¤»¤ó"
+
+#: src/LYMainLoop.c:4139
+msgid "charset for this document specified explicitly, sorry..."
+msgstr "¤³¤Îʸ½ñ¤Î¥­¥ã¥é¥¯¥¿¥»¥Ã¥È¤ÏÌÀ¼¨Åª¤Ë»ØÄꤵ¤ì¤Æ¤¤¤Þ¤¹..."
+
+#: src/LYMainLoop.c:5052
+msgid "cd to:"
+msgstr "°Ê²¼¤Ø°ÜÆ°:"
+
+#: src/LYMainLoop.c:5077
+msgid "A component of path is not a directory"
+msgstr "¥Ñ¥¹¤Î°ìÉô¤¬¥Ç¥£¥ì¥¯¥È¥ê¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó"
+
+#: src/LYMainLoop.c:5080
+msgid "failed to change directory"
+msgstr "¥Ç¥£¥ì¥¯¥È¥ê¤òÊѹ¹¤Ç¤­¤Þ¤»¤ó"
+
+#: src/LYMainLoop.c:6256
+msgid "Reparsing document under current settings..."
+msgstr "¸½ºß¤ÎÀßÄê¤Î²¼¤Çʸ½ñ¤òºÆ²ò¼áÃæ..."
+
+#: src/LYMainLoop.c:6547
+#, c-format
+msgid "Fatal error - could not open output file %s\n"
+msgstr "Ã×̿Ū¥¨¥é¡¼ - ½ÐÎÏ¥Õ¥¡¥¤¥ë %s ¤¬³«¤±¤Þ¤»¤ó\n"
+
+#: src/LYMainLoop.c:6884
+msgid "TABLE center enable."
+msgstr ""
+
+#: src/LYMainLoop.c:6887
+msgid "TABLE center disable."
+msgstr ""
+
+#: src/LYMainLoop.c:6964
+#, fuzzy
+msgid "Current URL is empty."
+msgstr "¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê:"
+
+#: src/LYMainLoop.c:6966 src/LYUtils.c:1817
+msgid "Copy to clipboard failed."
+msgstr ""
+
+#: src/LYMainLoop.c:6968
+msgid "Document URL put to clipboard."
+msgstr ""
+
+#: src/LYMainLoop.c:6970
+msgid "Link URL put to clipboard."
+msgstr ""
+
+#: src/LYMainLoop.c:6997
+msgid "No URL in the clipboard."
+msgstr ""
+
+#: src/LYMainLoop.c:7668 src/LYMainLoop.c:7838
+msgid "-index-"
+msgstr "-¥¤¥ó¥Ç¥Ã¥¯¥¹-"
+
+#: src/LYMainLoop.c:7778
+msgid "lynx: Can't access startfile"
+msgstr "lynx: ¥¹¥¿¡¼¥È¥Õ¥¡¥¤¥ë¤Ë¥¢¥¯¥»¥¹¤Ç¤­¤Þ¤»¤ó"
+
+#: src/LYMainLoop.c:7790
+msgid "lynx: Start file could not be found or is not text/html or text/plain"
+msgstr "lynx: ¥¹¥¿¡¼¥È¥Õ¥¡¥¤¥ë¤¬¸«¤Ä¤«¤é¤Ê¤¤¤«¡¢text/html ¤Ê¤¤¤· text/plain ¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó"
+
+#: src/LYMainLoop.c:7791
+msgid " Exiting..."
+msgstr " ½ªÎ»¤·¤Þ¤¹..."
+
+#: src/LYMainLoop.c:7832
+msgid "-more-"
+msgstr "-³¤­¤¢¤ê-"
+
+#. Enable scrolling.
+#: src/LYNews.c:183
+msgid "You will be posting to:"
+msgstr "Åê¹ÆÀè: "
+
+#.
+#. * Get the mail address for the From header, offering personal_mail_address
+#. * as default.
+#.
+#: src/LYNews.c:192
+msgid ""
+"\n"
+"\n"
+" Please provide your mail address for the From: header\n"
+msgstr ""
+"\n"
+"\n"
+" From: ¥Ø¥Ã¥ÀÍѤˤ¢¤Ê¤¿¤Î¥á¡¼¥ë¥¢¥É¥ì¥¹¤ò»ØÄꤷ¤Æ¤¯¤À¤µ¤¤\n"
+
+#.
+#. * Get the Subject header, offering the current document's title as the
+#. * default if this is a followup rather than a new post. - FM
+#.
+#: src/LYNews.c:209
+msgid ""
+"\n"
+"\n"
+" Please provide or edit the Subject: header\n"
+msgstr ""
+"\n"
+"\n"
+" Subject: ¥Ø¥Ã¥À¤òÊÔ½¸¤·¤ÆÍÑ°Õ¤·¤Æ¤¯¤À¤µ¤¤\n"
+
+#: src/LYNews.c:299
+msgid ""
+"\n"
+"\n"
+" Please provide or edit the Organization: header\n"
+msgstr ""
+"\n"
+"\n"
+"Organization: ¥Ø¥Ã¥À¤òÊÔ½¸¤·¤ÆÍÑ°Õ¤·¤Æ¤¯¤À¤µ¤¤\n"
+
+#.
+#. * Use the built in line editior.
+#.
+#: src/LYNews.c:356
+msgid ""
+"\n"
+"\n"
+" Please enter your message below."
+msgstr ""
+"\n"
+"\n"
+" °Ê²¼¤Ë¤¢¤Ê¤¿¤Î¥á¥Ã¥»¡¼¥¸¤òÆþÎϤ·¤Æ¤¯¤À¤µ¤¤¡£"
+
+#: src/LYNews.c:402
+msgid "Message has no original text!"
+msgstr "¥á¥Ã¥»¡¼¥¸¤Ë¤Ï¸µ¤Î¥Æ¥­¥¹¥È¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤»¤ó!"
+
+#: src/LYOptions.c:765
+msgid "review/edit B)ookmarks files"
+msgstr "[b]¥Ö¥Ã¥¯¥Þ¡¼¥¯¥Õ¥¡¥¤¥ë¤ò±ÜÍ÷/ÊÔ½¸"
+
+#: src/LYOptions.c:767
+msgid "B)ookmark file: "
+msgstr "[b]¥Ö¥Ã¥¯¥Þ¡¼¥¯¥Õ¥¡¥¤¥ë"
+
+#: src/LYOptions.c:2127 src/LYOptions.c:2134
+msgid "ON"
+msgstr ""
+
+#. verbose_img variable
+#: src/LYOptions.c:2128 src/LYOptions.c:2133 src/LYOptions.c:2285 src/LYOptions.c:2296
+msgid "OFF"
+msgstr ""
+
+#: src/LYOptions.c:2129
+msgid "NEVER"
+msgstr ""
+
+#: src/LYOptions.c:2130
+msgid "ALWAYS"
+msgstr ""
+
+#: src/LYOptions.c:2146 src/LYOptions.c:2277
+msgid "ignore"
+msgstr ""
+
+#: src/LYOptions.c:2147
+msgid "ask user"
+msgstr ""
+
+#: src/LYOptions.c:2148
+msgid "accept all"
+msgstr ""
+
+#: src/LYOptions.c:2160
+msgid "ALWAYS OFF"
+msgstr ""
+
+#: src/LYOptions.c:2161
+msgid "FOR LOCAL FILES ONLY"
+msgstr ""
+
+#: src/LYOptions.c:2163
+msgid "ALWAYS ON"
+msgstr ""
+
+#: src/LYOptions.c:2175
+msgid "Numbers act as arrows"
+msgstr ""
+
+#: src/LYOptions.c:2177
+msgid "Links are numbered"
+msgstr ""
+
+#: src/LYOptions.c:2180
+msgid "Links and form fields are numbered"
+msgstr ""
+
+#: src/LYOptions.c:2183
+msgid "Form fields are numbered"
+msgstr ""
+
+#: src/LYOptions.c:2197
+msgid "Case insensitive"
+msgstr ""
+
+#: src/LYOptions.c:2198
+msgid "Case sensitive"
+msgstr ""
+
+#: src/LYOptions.c:2222
+msgid "prompt normally"
+msgstr ""
+
+#: src/LYOptions.c:2223
+msgid "force yes-response"
+msgstr ""
+
+#: src/LYOptions.c:2224
+msgid "force no-response"
+msgstr ""
+
+#: src/LYOptions.c:2242
+#, fuzzy
+msgid "Novice"
+msgstr "¤Ê¤·"
+
+#: src/LYOptions.c:2243
+#, fuzzy
+msgid "Intermediate"
+msgstr "ÆâÉô"
+
+#: src/LYOptions.c:2244
+msgid "Advanced"
+msgstr ""
+
+#: src/LYOptions.c:2253
+msgid "By First Visit"
+msgstr ""
+
+#: src/LYOptions.c:2255
+msgid "By First Visit Reversed"
+msgstr ""
+
+#: src/LYOptions.c:2256
+msgid "As Visit Tree"
+msgstr ""
+
+#: src/LYOptions.c:2257
+msgid "By Last Visit"
+msgstr ""
+
+#: src/LYOptions.c:2259
+msgid "By Last Visit Reversed"
+msgstr ""
+
+#. Old_DTD variable
+#: src/LYOptions.c:2270
+msgid "relaxed (TagSoup mode)"
+msgstr ""
+
+#: src/LYOptions.c:2271
+msgid "strict (SortaSGML mode)"
+msgstr ""
+
+#: src/LYOptions.c:2278
+msgid "as labels"
+msgstr ""
+
+#: src/LYOptions.c:2279
+#, fuzzy
+msgid "as links"
+msgstr "¤³¤Î¥ê¥ó¥¯"
+
+#: src/LYOptions.c:2286
+#, fuzzy
+msgid "show filename"
+msgstr " (ÉÔÀµ¤Ê¥Õ¥¡¥¤¥ë̾)"
+
+#: src/LYOptions.c:2297
+msgid "STANDARD"
+msgstr ""
+
+#: src/LYOptions.c:2298
+msgid "ADVANCED"
+msgstr ""
+
+#: src/LYOptions.c:2329
+#, fuzzy
+msgid "Directories first"
+msgstr "¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê:"
+
+#: src/LYOptions.c:2330
+#, fuzzy
+msgid "Files first"
+msgstr " ¤òºÇ½é¤Ëõ¤·¤Þ¤¹"
+
+#: src/LYOptions.c:2331
+#, fuzzy
+msgid "Mixed style"
+msgstr "¹ÔÊÔ½¸¥¹¥¿¥¤¥ë"
+
+#: src/LYOptions.c:2339 src/LYOptions.c:2359
+#, fuzzy
+msgid "By Name"
+msgstr "̾Á°:"
+
+#: src/LYOptions.c:2340 src/LYOptions.c:2360
+msgid "By Type"
+msgstr ""
+
+#: src/LYOptions.c:2341 src/LYOptions.c:2361
+#, fuzzy
+msgid "By Size"
+msgstr "¥Ð¥¤¥È¥µ¥¤¥º:"
+
+#: src/LYOptions.c:2342 src/LYOptions.c:2362
+#, fuzzy
+msgid "By Date"
+msgstr "Æü»þ:"
+
+#: src/LYOptions.c:2343
+msgid "By Mode"
+msgstr ""
+
+#: src/LYOptions.c:2345
+msgid "By User"
+msgstr ""
+
+#: src/LYOptions.c:2346
+#, fuzzy
+msgid "By Group"
+msgstr "¥°¥ë¡¼¥×"
+
+#: src/LYOptions.c:2371
+msgid "Do not show rate"
+msgstr ""
+
+#: src/LYOptions.c:2372 src/LYOptions.c:2373
+#, fuzzy, c-format
+msgid "Show %s/sec rate"
+msgstr "žÁ÷¥ì¡¼¥È¤òɽ¼¨"
+
+#: src/LYOptions.c:2375 src/LYOptions.c:2376
+#, c-format
+msgid "Show %s/sec, ETA"
+msgstr ""
+
+#: src/LYOptions.c:2379
+#, fuzzy
+msgid "Show progressbar"
+msgstr "¥¹¥¯¥í¡¼¥ë¥Ð¡¼¤òɽ¼¨"
+
+#: src/LYOptions.c:2391
+msgid "Accept lynx's internal types"
+msgstr ""
+
+#: src/LYOptions.c:2392
+msgid "Also accept lynx.cfg's types"
+msgstr ""
+
+#: src/LYOptions.c:2393
+msgid "Also accept user's types"
+msgstr ""
+
+#: src/LYOptions.c:2394
+msgid "Also accept system's types"
+msgstr ""
+
+#: src/LYOptions.c:2395
+#, fuzzy
+msgid "Accept all types"
+msgstr "Êѹ¹¤òÍ­¸ú¤Ë¤¹¤ë"
+
+#: src/LYOptions.c:2404
+msgid "gzip"
+msgstr ""
+
+#: src/LYOptions.c:2405
+msgid "deflate"
+msgstr ""
+
+#: src/LYOptions.c:2408
+msgid "compress"
+msgstr ""
+
+#: src/LYOptions.c:2411
+msgid "bzip2"
+msgstr ""
+
+#: src/LYOptions.c:2413
+msgid "All"
+msgstr ""
+
+#: src/LYOptions.c:2681 src/LYOptions.c:2705
+#, c-format
+msgid "Use %s to invoke the Options menu!"
+msgstr "%s ¤ÇÀßÄê¥á¥Ë¥å¡¼¤òµ¯Æ°¤·¤Þ¤¹!"
+
+#: src/LYOptions.c:3477
+msgid "(options marked with (!) will not be saved)"
+msgstr "((!) ¤¬¤Ä¤¤¤¿¥ª¥×¥·¥ç¥ó¤ÏÊݸ¤µ¤ì¤Þ¤»¤ó)"
+
+#: src/LYOptions.c:3485
+msgid "General Preferences"
+msgstr "Á´ÈÌŪ¤ÊÀßÄê"
+
+#. ***************************************************************
+#. User Mode: SELECT
+#: src/LYOptions.c:3489
+msgid "User mode"
+msgstr "¥æ¡¼¥¶¥â¡¼¥É"
+
+#. Editor: INPUT
+#: src/LYOptions.c:3495
+msgid "Editor"
+msgstr "»ÈÍѤ¹¤ë¥¨¥Ç¥£¥¿"
+
+#. Search Type: SELECT
+#: src/LYOptions.c:3500
+msgid "Type of Search"
+msgstr "¸¡º÷¥¿¥¤¥×"
+
+#: src/LYOptions.c:3505
+msgid "Security and Privacy"
+msgstr ""
+
+#. ***************************************************************
+#. Cookies: SELECT
+#: src/LYOptions.c:3509
+msgid "Cookies"
+msgstr "¥¯¥Ã¥­¡¼"
+
+#. Cookie Prompting: SELECT
+#: src/LYOptions.c:3523
+msgid "Invalid-Cookie Prompting"
+msgstr ""
+
+#. SSL Prompting: SELECT
+#: src/LYOptions.c:3530
+msgid "SSL Prompting"
+msgstr ""
+
+#: src/LYOptions.c:3536
+msgid "Keyboard Input"
+msgstr "¥­¡¼¥Ü¡¼¥ÉÆþÎÏ"
+
+#. ***************************************************************
+#. Keypad Mode: SELECT
+#: src/LYOptions.c:3540
+msgid "Keypad mode"
+msgstr "¥­¡¼¥Ñ¥Ã¥É¤Î¥â¡¼¥É"
+
+#. Emacs keys: ON/OFF
+#: src/LYOptions.c:3546
+msgid "Emacs keys"
+msgstr "Emacs É÷¥­¡¼ÇÛÎó"
+
+#. VI Keys: ON/OFF
+#: src/LYOptions.c:3552
+msgid "VI keys"
+msgstr "VI É÷¥­¡¼ÇÛÎó"
+
+#. Line edit style: SELECT
+#. well, at least 2 line edit styles available
+#: src/LYOptions.c:3559
+msgid "Line edit style"
+msgstr "¹ÔÊÔ½¸¥¹¥¿¥¤¥ë"
+
+#. Keyboard layout: SELECT
+#: src/LYOptions.c:3571
+msgid "Keyboard layout"
+msgstr "¥­¡¼¥Ü¡¼¥É¥ì¥¤¥¢¥¦¥È"
+
+#.
+#. * Display and Character Set
+#.
+#: src/LYOptions.c:3585
+msgid "Display and Character Set"
+msgstr "ɽ¼¨¤È¥­¥ã¥é¥¯¥¿¥»¥Ã¥È"
+
+#. Use locale-based character set: ON/OFF
+#: src/LYOptions.c:3590
+#, fuzzy
+msgid "Use locale-based character set"
+msgstr "ɽ¼¨¤¹¤ë¥­¥ã¥é¥¯¥¿¥»¥Ã¥È"
+
+#. Display Character Set: SELECT
+#: src/LYOptions.c:3599
+msgid "Display character set"
+msgstr "ɽ¼¨¤¹¤ë¥­¥ã¥é¥¯¥¿¥»¥Ã¥È"
+
+#: src/LYOptions.c:3630
+msgid "Assumed document character set"
+msgstr "²¾Äꤹ¤ë¥­¥ã¥é¥¯¥¿¥»¥Ã¥È"
+
+#.
+#. * Since CJK people hardly mixed with other world
+#. * we split the header to make it more readable:
+#. * "CJK mode" for CJK display charsets, and "Raw 8-bit" for others.
+#.
+#: src/LYOptions.c:3650
+msgid "CJK mode"
+msgstr "CJK ¥â¡¼¥É"
+
+#: src/LYOptions.c:3652
+msgid "Raw 8-bit"
+msgstr "À¸ 8 ¥Ó¥Ã¥È"
+
+#. X Display: INPUT
+#: src/LYOptions.c:3660
+msgid "X Display"
+msgstr "X ¥Ç¥£¥¹¥×¥ì¥¤"
+
+#.
+#. * Document Appearance
+#.
+#: src/LYOptions.c:3666
+msgid "Document Appearance"
+msgstr "ʸ½ñ¤Î³°¸«"
+
+#: src/LYOptions.c:3672
+msgid "Show color"
+msgstr "¿§¤òÉÕ¤±¤ë"
+
+#. Show cursor: ON/OFF
+#: src/LYOptions.c:3696
+msgid "Show cursor"
+msgstr "¥«¡¼¥½¥ë¤ò¸«¤»¤ë"
+
+#. Underline links: ON/OFF
+#: src/LYOptions.c:3702
+#, fuzzy
+msgid "Underline links"
+msgstr "±£¤µ¤ì¤¿¥ê¥ó¥¯:"
+
+#. Show scrollbar: ON/OFF
+#: src/LYOptions.c:3709
+msgid "Show scrollbar"
+msgstr "¥¹¥¯¥í¡¼¥ë¥Ð¡¼¤òɽ¼¨"
+
+#. Select Popups: ON/OFF
+#: src/LYOptions.c:3716
+msgid "Popups for select fields"
+msgstr "¥Õ¥£¡¼¥ë¥ÉÁªÂò»þ¤Ë¥Ý¥Ã¥×¥¢¥Ã¥×"
+
+#. HTML error recovery: SELECT
+#: src/LYOptions.c:3722
+msgid "HTML error recovery"
+msgstr "HTML ¥¨¥é¡¼¤«¤é¤Î²óÉü"
+
+#. Show Images: SELECT
+#: src/LYOptions.c:3728
+msgid "Show images"
+msgstr "²èÁü¤Îɽ¼¨"
+
+#. Verbose Images: ON/OFF
+#: src/LYOptions.c:3742
+msgid "Verbose images"
+msgstr "¾éĹ¤Ê²èÁüɽ¼¨"
+
+#.
+#. * Headers Transferred to Remote Servers
+#.
+#: src/LYOptions.c:3750
+msgid "Headers Transferred to Remote Servers"
+msgstr "¥ê¥â¡¼¥È¥µ¡¼¥Ð¤ËžÁ÷¤µ¤ì¤ë¥Ø¥Ã¥À"
+
+#. ***************************************************************
+#. Mail Address: INPUT
+#: src/LYOptions.c:3754
+msgid "Personal mail address"
+msgstr "¸Ä¿Í¤Î¥á¡¼¥ë¥¢¥É¥ì¥¹"
+
+#: src/LYOptions.c:3760
+#, fuzzy
+msgid "Password for anonymous ftp"
+msgstr "¥Ë¥å¡¼¥¹¥Û¥¹¥È '%s' ¤Î¥Ñ¥¹¥ï¡¼¥É:"
+
+#. Preferred media type: SELECT
+#: src/LYOptions.c:3766
+#, fuzzy
+msgid "Preferred media type"
+msgstr "%d ¥Ð¥¤¥ÈžÁ÷ºÑ"
+
+#. Preferred encoding: SELECT
+#: src/LYOptions.c:3772
+#, fuzzy
+msgid "Preferred encoding"
+msgstr "ɽ¼¨¤·¤¿¤¤¸À¸ì"
+
+#. Preferred Document Character Set: INPUT
+#: src/LYOptions.c:3778
+msgid "Preferred document character set"
+msgstr "ɽ¼¨¤·¤¿¤¤¥­¥ã¥é¥¯¥¿¡¼¥»¥Ã¥È"
+
+#. Preferred Document Language: INPUT
+#: src/LYOptions.c:3783
+msgid "Preferred document language"
+msgstr "ɽ¼¨¤·¤¿¤¤¸À¸ì"
+
+#: src/LYOptions.c:3789
+msgid "User-Agent header"
+msgstr "User-Agent ¥Ø¥Ã¥À"
+
+#.
+#. * Listing and Accessing Files
+#.
+#: src/LYOptions.c:3797
+msgid "Listing and Accessing Files"
+msgstr "¥ê¥¹¥Èɽ¼¨¤È¥Õ¥¡¥¤¥ë¤Ø¤Î¥¢¥¯¥»¥¹"
+
+#. FTP sort: SELECT
+#: src/LYOptions.c:3802
+msgid "Use Passive FTP"
+msgstr ""
+
+#. FTP sort: SELECT
+#: src/LYOptions.c:3808
+msgid "FTP sort criteria"
+msgstr "FTP ¥Ç¥£¥ì¥¯¥È¥ê¤Î¥½¡¼¥È´ð½à"
+
+#. Local Directory Sort: SELECT
+#: src/LYOptions.c:3816
+msgid "Local directory sort criteria"
+msgstr "¥í¡¼¥«¥ë¥Ç¥£¥ì¥¯¥È¥ê¤Î¥½¡¼¥È´ð½à"
+
+#. Local Directory Order: SELECT
+#: src/LYOptions.c:3822
+msgid "Local directory sort order"
+msgstr "¥í¡¼¥«¥ë¥Ç¥£¥ì¥¯¥È¥ê¤Î¥½¡¼¥È½ç"
+
+#: src/LYOptions.c:3831
+msgid "Show dot files"
+msgstr "¥É¥Ã¥È¥Õ¥¡¥¤¥ë¤òɽ¼¨"
+
+#: src/LYOptions.c:3839
+msgid "Execution links"
+msgstr "¥ê¥ó¥¯¤ò¼Â¹Ô"
+
+#. Show transfer rate: SELECT
+#: src/LYOptions.c:3859
+msgid "Show transfer rate"
+msgstr "žÁ÷¥ì¡¼¥È¤òɽ¼¨"
+
+#.
+#. * Special Files and Screens
+#.
+#: src/LYOptions.c:3879
+msgid "Special Files and Screens"
+msgstr "ÆÃÊÌ¥Õ¥¡¥¤¥ë¤È²èÌÌ"
+
+#: src/LYOptions.c:3884
+msgid "Multi-bookmarks"
+msgstr "¥Þ¥ë¥Á¥Ö¥Ã¥¯¥Þ¡¼¥¯¤ò»È¤¦"
+
+#: src/LYOptions.c:3892
+msgid "Review/edit Bookmarks files"
+msgstr "¥Ö¥Ã¥¯¥Þ¡¼¥¯¥Õ¥¡¥¤¥ë¤Î±ÜÍ÷/ÊÔ½¸"
+
+#: src/LYOptions.c:3894
+msgid "Goto multi-bookmark menu"
+msgstr "¥Þ¥ë¥Á¥Ö¥Ã¥¯¥Þ¡¼¥¯¥á¥Ë¥å¡¼¤Ø"
+
+#: src/LYOptions.c:3896
+msgid "Bookmarks file"
+msgstr "¥Ö¥Ã¥¯¥Þ¡¼¥¯¥Õ¥¡¥¤¥ë"
+
+#. Auto Session: ON/OFF
+#: src/LYOptions.c:3903
+msgid "Auto Session"
+msgstr ""
+
+#. Session File Menu: INPUT
+#: src/LYOptions.c:3909
+msgid "Session file"
+msgstr ""
+
+#. Visited Pages: SELECT
+#: src/LYOptions.c:3915
+msgid "Visited Pages"
+msgstr "ˬ¤ì¤¿¥Ú¡¼¥¸"
+
+#: src/LYOptions.c:3920
+msgid "View the file "
+msgstr "¥Õ¥¡¥¤¥ë¤ò±ÜÍ÷"
+
+#: src/LYPrint.c:937
+#, c-format
+msgid " Print job complete.\n"
+msgstr "°õºþ¥¸¥ç¥Ö¤¬´°Î»¤·¤Þ¤·¤¿¡£\n"
+
+#: src/LYPrint.c:1262
+msgid "Document:"
+msgstr "ʸ½ñ:"
+
+#: src/LYPrint.c:1263
+msgid "Number of lines:"
+msgstr "¹Ô¿ô:"
+
+#: src/LYPrint.c:1264
+msgid "Number of pages:"
+msgstr "¥Ú¡¼¥¸¿ô:"
+
+#: src/LYPrint.c:1265
+msgid "pages"
+msgstr "¥Ú¡¼¥¸"
+
+#: src/LYPrint.c:1265
+msgid "page"
+msgstr "¥Ú¡¼¥¸"
+
+#: src/LYPrint.c:1266
+msgid "(approximately)"
+msgstr "(³µ»»)"
+
+#: src/LYPrint.c:1273
+msgid "Some print functions have been disabled!"
+msgstr "°õºþµ¡Ç½¤Î°ìÉô¤Ï»È¤¨¤Þ¤»¤ó!"
+
+#: src/LYPrint.c:1277
+msgid "Standard print options:"
+msgstr "ɸ½à¤Î°õºþÀè"
+
+#: src/LYPrint.c:1278
+msgid "Print options:"
+msgstr "°õºþÀè¤òÁªÂò:"
+
+#: src/LYPrint.c:1285
+msgid "Save to a local file"
+msgstr "¥í¡¼¥«¥ë¥Õ¥¡¥¤¥ë¤ËÊݸ"
+
+#: src/LYPrint.c:1287
+msgid "Save to disk disabled"
+msgstr "¥Ç¥£¥¹¥¯¤Ø¤ÎÊݸ¤Ï¤Ç¤­¤Þ¤»¤ó"
+
+#: src/LYPrint.c:1294
+msgid "Mail the file"
+msgstr "¥Õ¥¡¥¤¥ë¤ò¥á¡¼¥ë¤ÇÁ÷¿®"
+
+#: src/LYPrint.c:1301
+msgid "Print to the screen"
+msgstr "²èÌ̤Ëɽ¼¨"
+
+#: src/LYPrint.c:1306
+msgid "Print out on a printer attached to your vt100 terminal"
+msgstr "¤¢¤Ê¤¿¤Î vt100 üËö¤ËÀܳ¤µ¤ì¤¿¥×¥ê¥ó¥¿¤Ë°õºþ"
+
+#: src/LYReadCFG.c:371
+#, c-format
+msgid ""
+"Syntax Error parsing COLOR in configuration file:\n"
+"The line must be of the form:\n"
+"COLOR:INTEGER:FOREGROUND:BACKGROUND\n"
+"\n"
+"Here FOREGROUND and BACKGROUND must be one of:\n"
+"The special strings 'nocolor' or 'default', or\n"
+msgstr ""
+"ÀßÄê¥Õ¥¡¥¤¥ë¤Î COLOR ¤ò²òÀÏÃæ¤Ë¥·¥ó¥¿¥Ã¥¯¥¹¥¨¥é¡¼¤ò¸¡½Ð¤·¤Þ¤·¤¿:\n"
+"¤³¤Î¹Ô¤Ï°Ê²¼¤Î·Á¼°¤ò¼è¤é¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó:\n"
+"COLOR:INTEGER:FOREGROUND:BACKGROUND\n"
+"\n"
+"FOREGROUND ¤È BACKGROUND ¤Ï°Ê²¼¤Î¤¦¤Á°ì¤Ä¤ò¼è¤ê¤Þ¤¹:\n"
+"ÆÃÊÌʸ»úÎó¤Î¡Önocolor¡×¡¢¡Ödefault¡×¡¢¤¢¤ë¤¤¤Ï\n"
+
+#: src/LYReadCFG.c:384
+msgid "Offending line:"
+msgstr "ÌäÂê¤Î¹Ô:"
+
+#: src/LYReadCFG.c:681
+#, c-format
+msgid "key remapping of %s to %s for %s failed\n"
+msgstr "¥­¡¼ %s ¤ò %s ¤Ø (Æ°ºî¤Ï %s) ºÆÄêµÁ¤¹¤ë¤Î¤Ë¼ºÇÔ¤·¤Þ¤·¤¿\n"
+
+#: src/LYReadCFG.c:688
+#, c-format
+msgid "key remapping of %s to %s failed\n"
+msgstr "¥­¡¼ %s ¤ò %s ¤ØºÆÄêµÁ¤¹¤ë¤Î¤Ë¼ºÇÔ¤·¤Þ¤·¤¿\n"
+
+#: src/LYReadCFG.c:709
+#, c-format
+msgid "invalid line-editor selection %s for key %s, selecting all\n"
+msgstr "¥­¡¼ %s ¤Î¹Ô¥¨¥Ç¥£¥¿ÁªÂò %s ¤¬ÉÔÀµ¤Ç¤¹¡¢Á´ÂΤòÁªÂò¤·¤Þ¤¹\n"
+
+#: src/LYReadCFG.c:734 src/LYReadCFG.c:746
+#, c-format
+msgid "setting of line-editor binding for key %s (0x%x) to 0x%x for %s failed\n"
+msgstr "¹Ô¥¨¥Ç¥£¥¿¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤Ç¥­¡¼ %s (0x%x) ¤ò 0x%x (Æ°ºî ¤Ï %s)¤ËÀßÄꤹ¤ë¤Î¤Ë¼ºÇÔ¤·¤Þ¤·¤¿\n"
+
+#: src/LYReadCFG.c:750
+#, c-format
+msgid "setting of line-editor binding for key %s (0x%x) for %s failed\n"
+msgstr "¹Ô¥¨¥Ç¥£¥¿¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤Ç¥­¡¼ %s (0x%x) ¤òÆ°ºî %s¤ËÀßÄꤹ¤ë¤Î¤Ë¼ºÇÔ¤·¤Þ¤·¤¿\n"
+
+#: src/LYReadCFG.c:846
+#, c-format
+msgid "Lynx: cannot start, CERN rules file %s is not available\n"
+msgstr "Lynx: ³«»Ï¤Ç¤­¤Þ¤»¤ó¡£CERN ¥ë¡¼¥ë¥Õ¥¡¥¤¥ë %s ¤¬ÍøÍѤǤ­¤Þ¤»¤ó\n"
+
+#: src/LYReadCFG.c:847
+msgid "(no name)"
+msgstr "(̾Á°Ìµ¤·)"
+
+#: src/LYReadCFG.c:1880
+#, c-format
+msgid "More than %d nested lynx.cfg includes -- perhaps there is a loop?!?\n"
+msgstr "lynx.cfg ¥¤¥ó¥¯¥ë¡¼¥É¤¬ %d ²ó°Ê¾å¤ÎÆþ¤ì»Ò¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹ -- ¤ª¤½¤é¤¯¥ë¡¼¥×¤¬¤¢¤ë¤Î¤Ç¤Ï!?\n"
+
+#: src/LYReadCFG.c:1882
+#, c-format
+msgid "Last attempted include was '%s',\n"
+msgstr "ºÇ¸å¤Ë»î¤ß¤¿¥¤¥ó¥¯¥ë¡¼¥É¤Ï '%s' ¤Ç¡¢\n"
+
+#: src/LYReadCFG.c:1883
+#, c-format
+msgid "included from '%s'.\n"
+msgstr "'%s' ¤«¤é¥¤¥ó¥¯¥ë¡¼¥É¤µ¤ì¤Æ¤¤¤Þ¤¹¡£\n"
+
+#: src/LYReadCFG.c:2291 src/LYReadCFG.c:2304 src/LYReadCFG.c:2362
+msgid "The following is read from your lynx.cfg file."
+msgstr "°Ê²¼¤Ï¤¢¤Ê¤¿¤Î lynx.cfg ¥Õ¥¡¥¤¥ë¤«¤éÆɤ߹þ¤Þ¤ì¤¿¾ðÊó¤Ç¤¹¡£"
+
+#: src/LYReadCFG.c:2292 src/LYReadCFG.c:2305
+msgid "Please read the distribution"
+msgstr "ÇÛÉÛ¤Î"
+
+#: src/LYReadCFG.c:2298 src/LYReadCFG.c:2308
+msgid "for more comments."
+msgstr "¤Ë¤Ï¾ÜºÙ¤ÊÃí¤¬ÉÕ¤¤¤Æ¤¤¤Þ¤¹¤Î¤Ç»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£"
+
+#: src/LYReadCFG.c:2344
+msgid "RELOAD THE CHANGES"
+msgstr "Êѹ¹¤òºÆÆɤ߹þ¤ß"
+
+#: src/LYReadCFG.c:2352
+msgid "Your primary configuration"
+msgstr "ºÇ½é¤Ë»²¾È¤µ¤ì¤ëÀßÄê¥Õ¥¡¥¤¥ë¤Ï"
+
+#: src/LYShowInfo.c:173
+msgid "Directory that you are currently viewing"
+msgstr "¸½ºß¸«¤Æ¤¤¤ë¥Ç¥£¥ì¥¯¥È¥ê"
+
+#: src/LYShowInfo.c:176
+msgid "Name:"
+msgstr "̾Á°:"
+
+#: src/LYShowInfo.c:179
+msgid "URL:"
+msgstr "URL:"
+
+#: src/LYShowInfo.c:193
+msgid "Directory that you have currently selected"
+msgstr "¸½ºßÁªÂò¤·¤Æ¤¤¤ë¥Ç¥£¥ì¥¯¥È¥ê"
+
+#: src/LYShowInfo.c:195
+msgid "File that you have currently selected"
+msgstr "¸½ºßÁªÂò¤·¤Æ¤¤¤ë¥Õ¥¡¥¤¥ë"
+
+#: src/LYShowInfo.c:198
+msgid "Symbolic link that you have currently selected"
+msgstr "¸½ºßÁªÂò¤·¤Æ¤¤¤ë¥·¥ó¥Ü¥ê¥Ã¥¯¥ê¥ó¥¯"
+
+#: src/LYShowInfo.c:201
+msgid "Item that you have currently selected"
+msgstr "¸½ºßÁªÂò¤·¤Æ¤¤¤ë¥¢¥¤¥Æ¥à"
+
+#: src/LYShowInfo.c:203
+msgid "Full name:"
+msgstr "¥Õ¥ë¥Í¡¼¥à:"
+
+#: src/LYShowInfo.c:212
+msgid "Unable to follow link"
+msgstr "¥ê¥ó¥¯¤òé¤ì¤Þ¤»¤ó"
+
+#: src/LYShowInfo.c:214
+msgid "Points to file:"
+msgstr "¥Õ¥¡¥¤¥ë¤Ø¤Î¥Ý¥¤¥ó¥È:"
+
+#: src/LYShowInfo.c:219
+msgid "Name of owner:"
+msgstr "½êÍ­¼Ô¤Î̾Á°:"
+
+#: src/LYShowInfo.c:222
+msgid "Group name:"
+msgstr "¥°¥ë¡¼¥×¤Î̾Á°:"
+
+#: src/LYShowInfo.c:224
+msgid "File size:"
+msgstr "¥Õ¥¡¥¤¥ë¥µ¥¤¥º:"
+
+#: src/LYShowInfo.c:226
+#, fuzzy
+msgid "(bytes)"
+msgstr "¥Ð¥¤¥È"
+
+#.
+#. * Include date and time information.
+#.
+#: src/LYShowInfo.c:231
+msgid "Creation date:"
+msgstr "ºîÀ®Æü»þ:"
+
+#: src/LYShowInfo.c:234
+msgid "Last modified:"
+msgstr "ºÇ½ªÊѹ¹Æü»þ:"
+
+#: src/LYShowInfo.c:237
+msgid "Last accessed:"
+msgstr "ºÇ¸å¤Ë¥¢¥¯¥»¥¹¤µ¤ì¤¿Æü»þ:"
+
+#: src/LYShowInfo.c:243
+msgid "Access Permissions"
+msgstr "¥¢¥¯¥»¥¹µö²Ä"
+
+#: src/LYShowInfo.c:278
+#, fuzzy
+msgid "Group:"
+msgstr "¥°¥ë¡¼¥×"
+
+#: src/LYShowInfo.c:298
+msgid "World:"
+msgstr ""
+
+#: src/LYShowInfo.c:305
+msgid "File that you are currently viewing"
+msgstr "¸½ºß¤¢¤Ê¤¿¤¬¸«¤Æ¤¤¤ë¥Õ¥¡¥¤¥ë"
+
+#: src/LYShowInfo.c:313 src/LYShowInfo.c:417
+msgid "Linkname:"
+msgstr "¥ê¥ó¥¯Ì¾"
+
+#: src/LYShowInfo.c:319 src/LYShowInfo.c:334
+msgid "Charset:"
+msgstr "¥­¥ã¥é¥¯¥¿¥»¥Ã¥È:"
+
+#: src/LYShowInfo.c:333
+msgid "(assumed)"
+msgstr ""
+
+#: src/LYShowInfo.c:340
+msgid "Server:"
+msgstr "¥µ¡¼¥Ð:"
+
+#: src/LYShowInfo.c:343
+msgid "Date:"
+msgstr "Æü»þ:"
+
+#: src/LYShowInfo.c:346
+msgid "Last Mod:"
+msgstr "ºÇ½ª¹¹¿·:"
+
+#: src/LYShowInfo.c:351
+#, fuzzy
+msgid "Expires:"
+msgstr "&nbsp;Í­¸ú´ü¸Â:"
+
+#: src/LYShowInfo.c:354
+msgid "Cache-Control:"
+msgstr "Cache-Control:"
+
+#: src/LYShowInfo.c:357
+msgid "Content-Length:"
+msgstr "Content-Length:"
+
+#: src/LYShowInfo.c:361
+#, fuzzy
+msgid "Length:"
+msgstr "Content-Length:"
+
+#: src/LYShowInfo.c:366
+msgid "Language:"
+msgstr "¸À¸ì:"
+
+#: src/LYShowInfo.c:373
+msgid "Post Data:"
+msgstr "Post ¥Ç¡¼¥¿:"
+
+#: src/LYShowInfo.c:376
+msgid "Post Content Type:"
+msgstr "Post ¥³¥ó¥Æ¥ó¥È¥¿¥¤¥×:"
+
+#: src/LYShowInfo.c:379
+msgid "Owner(s):"
+msgstr "½êÍ­¼Ô:"
+
+#: src/LYShowInfo.c:384
+msgid "size:"
+msgstr "¥µ¥¤¥º:"
+
+#: src/LYShowInfo.c:386
+msgid "lines"
+msgstr "¹Ô"
+
+#: src/LYShowInfo.c:390
+msgid "forms mode"
+msgstr "Ê£¿ô¥Õ¥©¡¼¥à¥â¡¼¥É"
+
+#: src/LYShowInfo.c:392
+msgid "source"
+msgstr "¥½¡¼¥¹"
+
+#: src/LYShowInfo.c:393
+msgid "normal"
+msgstr "Ä̾ï"
+
+#: src/LYShowInfo.c:395
+msgid ", safe"
+msgstr "¡¢°ÂÁ´"
+
+#: src/LYShowInfo.c:397
+msgid ", via internal link"
+msgstr "¡¢ÆâÉô¥ê¥ó¥¯·Ðͳ"
+
+#: src/LYShowInfo.c:402
+msgid ", no-cache"
+msgstr "¡¢¥­¥ã¥Ã¥·¥å̵¤·"
+
+#: src/LYShowInfo.c:404
+msgid ", ISMAP script"
+msgstr "¡¢ISMAP ¥¹¥¯¥ê¥×¥È"
+
+#: src/LYShowInfo.c:406
+msgid ", bookmark file"
+msgstr "¡¢¥Ö¥Ã¥¯¥Þ¡¼¥¯¥Õ¥¡¥¤¥ë"
+
+#: src/LYShowInfo.c:410
+msgid "mode:"
+msgstr "¥â¡¼¥É:"
+
+#: src/LYShowInfo.c:416
+msgid "Link that you currently have selected"
+msgstr "¸½ºßÁªÂò¤·¤Æ¤¤¤ë¥ê¥ó¥¯"
+
+#: src/LYShowInfo.c:425
+msgid "Method:"
+msgstr "¥á¥½¥Ã¥É:"
+
+#: src/LYShowInfo.c:429
+msgid "Enctype:"
+msgstr "Enctype:"
+
+#: src/LYShowInfo.c:435
+#, fuzzy
+msgid "Action:"
+msgstr "¾ì½ê: "
+
+#: src/LYShowInfo.c:440
+msgid "(Form field)"
+msgstr "(¥Õ¥©¡¼¥à¥Õ¥£¡¼¥ë¥É)"
+
+#: src/LYShowInfo.c:449
+msgid "No Links on the current page"
+msgstr "¸½ºß¤Î¥Ú¡¼¥¸¤Ë¤Ï¥ê¥ó¥¯¤¬¤¢¤ê¤Þ¤»¤ó"
+
+#: src/LYShowInfo.c:454
+#, fuzzy
+msgid "Server Headers:"
+msgstr "¥µ¡¼¥Ð:"
+
+#: src/LYStyle.c:312
+#, c-format
+msgid ""
+"Syntax Error parsing style in lss file:\n"
+"[%s]\n"
+"The line must be of the form:\n"
+"OBJECT:MONO:COLOR (ie em:bold:brightblue:white)\n"
+"where OBJECT is one of EM,STRONG,B,I,U,BLINK etc.\n"
+"\n"
+msgstr ""
+"lss ¥Õ¥¡¥¤¥ë¤Î¥¹¥¿¥¤¥ë¤ò²òÀÏÃæ¤Ë¥·¥ó¥¿¥Ã¥¯¥¹¥¨¥é¡¼¤ò¸¡½Ð¤·¤Þ¤·¤¿:\n"
+"[%s]\n"
+"¤³¤Î¹Ô¤Ï°Ê²¼¤Î·Á¼°¤Ç¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó:\n"
+"OBJECT:MONO:COLOR (em:bold:brightblue:white ¤«¤éÁª¤Ö)\n"
+"OBJECT ¤Ï EM¡¢STRONG¡¢B¡¢I¡¢U¡¢BLINK ¤Ê¤É¤«¤é°ì¤ÄÁª¤Ó¤Þ¤¹¡£\n"
+"\n"
+
+#: src/LYTraversal.c:108
+msgid "here is a list of the history stack so that you may rebuild"
+msgstr "°Ê²¼¤ÏºÆ¹½ÃۤΤ¿¤á¤ÎÍúÎò¥¹¥¿¥Ã¥¯¤Î¥ê¥¹¥È¤Ç¤¹¡£"
+
+#: src/LYUpload.c:75
+msgid "ERROR! - upload command is misconfigured"
+msgstr "¥¨¥é¡¼! - ¥¢¥Ã¥×¥í¡¼¥É¥³¥Þ¥ó¥É¤ÎÀßÄ꤬´Ö°ã¤Ã¤Æ¤¤¤Þ¤¹¡£"
+
+#: src/LYUpload.c:96
+msgid "Illegal redirection \"../\" found! Request ignored."
+msgstr "ÉÔÀµ¤Ê¥ê¥À¥¤¥ì¥¯¥·¥ç¥ó \"../\" ¤òȯ¸«! ¥ê¥¯¥¨¥¹¥È¤Ï̵»ë¤µ¤ì¤Þ¤¹¡£"
+
+#: src/LYUpload.c:99
+msgid "Illegal character \"/\" found! Request ignored."
+msgstr "ÉÔÀµ¤Ê¥­¥ã¥é¥¯¥¿ \"/\" ȯ¸«! ¥ê¥¯¥¨¥¹¥È¤Ï̵»ë¤µ¤ì¤Þ¤¹¡£"
+
+#: src/LYUpload.c:102
+msgid "Illegal redirection using \"~\" found! Request ignored."
+msgstr "ÉÔÀµ¤Ê¥ê¥À¥¤¥ì¥¯¥·¥ç¥ó \"~\" ȯ¸«! ¥ê¥¯¥¨¥¹¥È¤Ï̵»ë¤µ¤ì¤Þ¤¹¡£"
+
+#: src/LYUpload.c:159
+msgid "Unable to upload file."
+msgstr "¥Õ¥¡¥¤¥ë¤ò¥¢¥Ã¥×¥í¡¼¥É¤Ç¤­¤Þ¤»¤ó¡£"
+
+#: src/LYUpload.c:201
+msgid "Upload To:"
+msgstr "°Ê²¼¤Ë¥¢¥Ã¥×¥í¡¼¥É:"
+
+#: src/LYUpload.c:202
+msgid "Upload options:"
+msgstr "¥¢¥Ã¥×¥í¡¼¥É¥ª¥×¥·¥ç¥ó:"
+
+#: src/LYUtils.c:1819
+msgid "Download document URL put to clipboard."
+msgstr ""
+
+#: src/LYUtils.c:2604
+msgid "Unexpected access protocol for this URL scheme."
+msgstr "¤³¤Î URL ¥¹¥­¡¼¥à¤Ç¤ÏÁÛÄꤵ¤ì¤Æ¤¤¤Ê¤¤¥¢¥¯¥»¥¹¥×¥í¥È¥³¥ë¤Ç¤¹¡£"
+
+#: src/LYUtils.c:3408
+msgid "Too many tempfiles"
+msgstr "°ì»þ¥Õ¥¡¥¤¥ë¤¬Â¿¤¹¤®¤Þ¤¹"
+
+#: src/LYUtils.c:3708
+msgid "unknown restriction"
+msgstr "ÉÔÌÀ¤ÊÀ©¸Â"
+
+#: src/LYUtils.c:3739
+#, c-format
+msgid "No restrictions set.\n"
+msgstr "À©¸Â¤ÏÀßÄꤵ¤ì¤Æ¤¤¤Þ¤»¤ó¡£\n"
+
+#: src/LYUtils.c:3742
+#, c-format
+msgid "Restrictions set:\n"
+msgstr "À©¸Â¤ò°Ê²¼¤ËÀßÄê:\n"
+
+#: src/LYUtils.c:5120
+msgid "Cannot find HOME directory"
+msgstr "HOME ¥Ç¥£¥ì¥¯¥È¥ê¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó"
+
+#: src/LYrcFile.c:16
+msgid "Normally disabled. See ENABLE_LYNXRC in lynx.cfg\n"
+msgstr "Ä̾ï¤Ï̵¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£lynx.cfg ¤Î ENABLE_LYNXRC ¤ÎÉôʬ¤ò»²¾È¤·¤Æ²¼¤µ¤¤\n"
+
+#: src/LYrcFile.c:317
+msgid ""
+"accept_all_cookies allows the user to tell Lynx to automatically\n"
+"accept all cookies if desired. The default is \"FALSE\" which will\n"
+"prompt for each cookie. Set accept_all_cookies to \"TRUE\" to accept\n"
+"all cookies.\n"
+msgstr ""
+"accept_all_cookies allows the user to tell Lynx to automatically\n"
+"accept all cookies if desired. The default is \"FALSE\" which will\n"
+"prompt for each cookie. Set accept_all_cookies to \"TRUE\" to accept\n"
+"all cookies.\n"
+
+#: src/LYrcFile.c:325
+msgid ""
+"anonftp_password allows the user to tell Lynx to use the personal\n"
+"email address as the password for anonymous ftp. If no value is given,\n"
+"Lynx will use the personal email address. Set anonftp_password\n"
+"to a different value if you choose.\n"
+msgstr ""
+
+#: src/LYrcFile.c:332
+msgid ""
+"bookmark_file specifies the name and location of the default bookmark\n"
+"file into which the user can paste links for easy access at a later\n"
+"date.\n"
+msgstr ""
+"bookmark_file specifies the name and location of the default bookmark\n"
+"file into which the user can paste links for easy access at a later\n"
+"date.\n"
+
+#: src/LYrcFile.c:337
+msgid ""
+"If case_sensitive_searching is \"on\" then when the user invokes a search\n"
+"using the 's' or '/' keys, the search performed will be case sensitive\n"
+"instead of case INsensitive. The default is usually \"off\".\n"
+msgstr ""
+"If case_sensitive_searching is \"on\" then when the user invokes a search\n"
+"using the 's' or '/' keys, the search performed will be case sensitive\n"
+"instead of case INsensitive. The default is usually \"off\".\n"
+
+#: src/LYrcFile.c:342
+msgid ""
+"The character_set definition controls the representation of 8 bit\n"
+"characters for your terminal. If 8 bit characters do not show up\n"
+"correctly on your screen you may try changing to a different 8 bit\n"
+"set or using the 7 bit character approximations.\n"
+"Current valid characters sets are:\n"
+msgstr ""
+"The character_set definition controls the representation of 8 bit\n"
+"characters for your terminal. If 8 bit characters do not show up\n"
+"correctly on your screen you may try changing to a different 8 bit\n"
+"set or using the 7 bit character approximations.\n"
+"Current valid characters sets are:\n"
+
+#: src/LYrcFile.c:349
+msgid ""
+"cookie_accept_domains and cookie_reject_domains are comma-delimited\n"
+"lists of domains from which Lynx should automatically accept or reject\n"
+"all cookies. If a domain is specified in both options, rejection will\n"
+"take precedence. The accept_all_cookies parameter will override any\n"
+"settings made here.\n"
+msgstr ""
+"cookie_accept_domains and cookie_reject_domains are comma-delimited\n"
+"lists of domains from which Lynx should automatically accept or reject\n"
+"all cookies. If a domain is specified in both options, rejection will\n"
+"take precedence. The accept_all_cookies parameter will override any\n"
+"settings made here.\n"
+
+#: src/LYrcFile.c:357
+#, fuzzy
+msgid ""
+"cookie_file specifies the file from which to read persistent cookies.\n"
+"The default is ~/"
+msgstr ""
+"cookie_file specifies the file from which to read persistent cookies.\n"
+"The default is ~/.lynx_cookies.\n"
+
+#: src/LYrcFile.c:362
+msgid ""
+"cookie_loose_invalid_domains, cookie_strict_invalid_domains, and\n"
+"cookie_query_invalid_domains are comma-delimited lists of which domains\n"
+"should be subjected to varying degrees of validity checking. If a\n"
+"domain is set to strict checking, strict conformance to RFC2109 will\n"
+"be applied. A domain with loose checking will be allowed to set cookies\n"
+"with an invalid path or domain attribute. All domains will default to\n"
+"querying the user for an invalid path or domain.\n"
+msgstr ""
+"cookie_loose_invalid_domains, cookie_strict_invalid_domains, and\n"
+"cookie_query_invalid_domains are comma-delimited lists of which domains\n"
+"should be subjected to varying degrees of validity checking. If a\n"
+"domain is set to strict checking, strict conformance to RFC2109 will\n"
+"be applied. A domain with loose checking will be allowed to set cookies\n"
+"with an invalid path or domain attribute. All domains will default to\n"
+"querying the user for an invalid path or domain.\n"
+
+#: src/LYrcFile.c:376
+msgid ""
+"dir_list_order specifies the directory list order under DIRED_SUPPORT\n"
+"(if implemented). The default is \"ORDER_BY_NAME\"\n"
+msgstr ""
+"dir_list_order specifies the directory list order under DIRED_SUPPORT\n"
+"(if implemented). The default is \"ORDER_BY_NAME\"\n"
+
+#: src/LYrcFile.c:381
+msgid ""
+"dir_list_styles specifies the directory list style under DIRED_SUPPORT\n"
+"(if implemented). The default is \"MIXED_STYLE\", which sorts both\n"
+"files and directories together. \"FILES_FIRST\" lists files first and\n"
+"\"DIRECTORIES_FIRST\" lists directories first.\n"
+msgstr ""
+"dir_list_styles specifies the directory list style under DIRED_SUPPORT\n"
+"(if implemented). The default is \"MIXED_STYLE\", which sorts both\n"
+"files and directories together. \"FILES_FIRST\" lists files first and\n"
+"\"DIRECTORIES_FIRST\" lists directories first.\n"
+
+#: src/LYrcFile.c:389
+msgid ""
+"If emacs_keys is to \"on\" then the normal EMACS movement keys:\n"
+" ^N = down ^P = up\n"
+" ^B = left ^F = right\n"
+"will be enabled.\n"
+msgstr ""
+"If emacs_keys is to \"on\" then the normal EMACS movement keys:\n"
+" ^N = down ^P = up\n"
+" ^B = left ^F = right\n"
+"will be enabled.\n"
+
+#: src/LYrcFile.c:395
+msgid ""
+"file_editor specifies the editor to be invoked when editing local files\n"
+"or sending mail. If no editor is specified, then file editing is disabled\n"
+"unless it is activated from the command line, and the built-in line editor\n"
+"will be used for sending mail.\n"
+msgstr ""
+"file_editor specifies the editor to be invoked when editing local files\n"
+"or sending mail. If no editor is specified, then file editing is disabled\n"
+"unless it is activated from the command line, and the built-in line editor\n"
+"will be used for sending mail.\n"
+
+#: src/LYrcFile.c:402
+msgid ""
+"The file_sorting_method specifies which value to sort on when viewing\n"
+"file lists such as FTP directories. The options are:\n"
+" BY_FILENAME -- sorts on the name of the file\n"
+" BY_TYPE -- sorts on the type of the file\n"
+" BY_SIZE -- sorts on the size of the file\n"
+" BY_DATE -- sorts on the date of the file\n"
+msgstr ""
+"The file_sorting_method specifies which value to sort on when viewing\n"
+"file lists such as FTP directories. The options are:\n"
+" BY_FILENAME -- sorts on the name of the file\n"
+" BY_TYPE -- sorts on the type of the file\n"
+" BY_SIZE -- sorts on the size of the file\n"
+" BY_DATE -- sorts on the date of the file\n"
+
+#: src/LYrcFile.c:424
+msgid ""
+"lineedit_mode specifies the key binding used for inputting strings in\n"
+"prompts and forms. If lineedit_mode is set to \"Default Binding\" then\n"
+"the following control characters are used for moving and deleting:\n"
+"\n"
+" Prev Next Enter = Accept input\n"
+" Move char: <- -> ^G = Cancel input\n"
+" Move word: ^P ^N ^U = Erase line\n"
+" Delete char: ^H ^R ^A = Beginning of line\n"
+" Delete word: ^B ^F ^E = End of line\n"
+"\n"
+"Current lineedit modes are:\n"
+msgstr ""
+"lineedit_mode specifies the key binding used for inputting strings in\n"
+"prompts and forms. If lineedit_mode is set to \"Default Binding\" then\n"
+"the following control characters are used for moving and deleting:\n"
+"\n"
+" Prev Next Enter = Accept input\n"
+" Move char: <- -> ^G = Cancel input\n"
+" Move word: ^P ^N ^U = Erase line\n"
+" Delete char: ^H ^R ^A = Beginning of line\n"
+" Delete word: ^B ^F ^E = End of line\n"
+"\n"
+"Current lineedit modes are:\n"
+
+#: src/LYrcFile.c:442
+msgid ""
+"The following allow you to define sub-bookmark files and descriptions.\n"
+"The format is multi_bookmark<capital_letter>=<filename>,<description>\n"
+"Up to 26 bookmark files (for the English capital letters) are allowed.\n"
+"We start with \"multi_bookmarkB\" since 'A' is the default (see above).\n"
+msgstr ""
+"The following allow you to define sub-bookmark files and descriptions.\n"
+"The format is multi_bookmark<capital_letter>=<filename>,<description>\n"
+"Up to 26 bookmark files (for the English capital letters) are allowed.\n"
+"We start with \"multi_bookmarkB\" since 'A' is the default (see above).\n"
+
+#: src/LYrcFile.c:448
+msgid ""
+"personal_mail_address specifies your personal mail address. The\n"
+"address will be sent during HTTP file transfers for authorization and\n"
+"logging purposes, and for mailed comments.\n"
+"If you do not want this information given out, set the NO_FROM_HEADER\n"
+"to TRUE in lynx.cfg, or use the -nofrom command line switch. You also\n"
+"could leave this field blank, but then you won't have it included in\n"
+"your mailed comments.\n"
+msgstr ""
+"personal_mail_address specifies your personal mail address. The\n"
+"address will be sent during HTTP file transfers for authorization and\n"
+"logging purposes, and for mailed comments.\n"
+"If you do not want this information given out, set the NO_FROM_HEADER\n"
+"to TRUE in lynx.cfg, or use the -nofrom command line switch. You also\n"
+"could leave this field blank, but then you won't have it included in\n"
+"your mailed comments.\n"
+
+#: src/LYrcFile.c:457
+msgid ""
+"preferred_charset specifies the character set in MIME notation (e.g.,\n"
+"ISO-8859-2, ISO-8859-5) which Lynx will indicate you prefer in requests\n"
+"to http servers using an Accept-Charset header. The value should NOT\n"
+"include ISO-8859-1 or US-ASCII, since those values are always assumed\n"
+"by default. May be a comma-separated list.\n"
+"If a file in that character set is available, the server will send it.\n"
+"If no Accept-Charset header is present, the default is that any\n"
+"character set is acceptable. If an Accept-Charset header is present,\n"
+"and if the server cannot send a response which is acceptable\n"
+"according to the Accept-Charset header, then the server SHOULD send\n"
+"an error response, though the sending of an unacceptable response\n"
+"is also allowed.\n"
+msgstr ""
+"preferred_charset specifies the character set in MIME notation (e.g.,\n"
+"ISO-8859-2, ISO-8859-5) which Lynx will indicate you prefer in requests\n"
+"to http servers using an Accept-Charset header. The value should NOT\n"
+"include ISO-8859-1 or US-ASCII, since those values are always assumed\n"
+"by default. May be a comma-separated list.\n"
+"If a file in that character set is available, the server will send it.\n"
+"If no Accept-Charset header is present, the default is that any\n"
+"character set is acceptable. If an Accept-Charset header is present,\n"
+"and if the server cannot send a response which is acceptable\n"
+"according to the Accept-Charset header, then the server SHOULD send\n"
+"an error response, though the sending of an unacceptable response\n"
+"is also allowed.\n"
+
+#: src/LYrcFile.c:473
+msgid ""
+"preferred_language specifies the language in MIME notation (e.g., en,\n"
+"fr, may be a comma-separated list in decreasing preference)\n"
+"which Lynx will indicate you prefer in requests to http servers.\n"
+"If a file in that language is available, the server will send it.\n"
+"Otherwise, the server will send the file in its default language.\n"
+msgstr " ----\n"
+
+#: src/LYrcFile.c:484
+msgid ""
+"If run_all_execution_links is set \"on\" then all local execution links\n"
+"will be executed when they are selected.\n"
+"\n"
+"WARNING - This is potentially VERY dangerous. Since you may view\n"
+" information that is written by unknown and untrusted sources\n"
+" there exists the possibility that Trojan horse links could be\n"
+" written. Trojan horse links could be written to erase files\n"
+" or compromise security. This should only be set to \"on\" if\n"
+" you are viewing trusted source information.\n"
+msgstr ""
+"If run_all_execution_links is set \"on\" then all local execution links\n"
+"will be executed when they are selected.\n"
+"\n"
+"WARNING - This is potentially VERY dangerous. Since you may view\n"
+" information that is written by unknown and untrusted sources\n"
+" there exists the possibility that Trojan horse links could be\n"
+" written. Trojan horse links could be written to erase files\n"
+" or compromise security. This should only be set to \"on\" if\n"
+" you are viewing trusted source information.\n"
+
+#: src/LYrcFile.c:495
+msgid ""
+"If run_execution_links_on_local_files is set \"on\" then all local\n"
+"execution links that are found in LOCAL files will be executed when they\n"
+"are selected. This is different from run_all_execution_links in that\n"
+"only files that reside on the local system will have execution link\n"
+"permissions.\n"
+"\n"
+"WARNING - This is potentially dangerous. Since you may view\n"
+" information that is written by unknown and untrusted sources\n"
+" there exists the possibility that Trojan horse links could be\n"
+" written. Trojan horse links could be written to erase files\n"
+" or compromise security. This should only be set to \"on\" if\n"
+" you are viewing trusted source information.\n"
+msgstr ""
+"If run_execution_links_on_local_files is set \"on\" then all local\n"
+"execution links that are found in LOCAL files will be executed when they\n"
+"are selected. This is different from run_all_execution_links in that\n"
+"only files that reside on the local system will have execution link\n"
+"permissions.\n"
+"\n"
+"WARNING - This is potentially dangerous. Since you may view\n"
+" information that is written by unknown and untrusted sources\n"
+" there exists the possibility that Trojan horse links could be\n"
+" written. Trojan horse links could be written to erase files\n"
+" or compromise security. This should only be set to \"on\" if\n"
+" you are viewing trusted source information.\n"
+
+#: src/LYrcFile.c:513
+msgid ""
+"select_popups specifies whether the OPTIONs in a SELECT block which\n"
+"lacks a MULTIPLE attribute are presented as a vertical list of radio\n"
+"buttons or via a popup menu. Note that if the MULTIPLE attribute is\n"
+"present in the SELECT start tag, Lynx always will create a vertical list\n"
+"of checkboxes for the OPTIONs. A value of \"on\" will set popup menus\n"
+"as the default while a value of \"off\" will set use of radio boxes.\n"
+"The default can be overridden via the -popup command line toggle.\n"
+msgstr ""
+"select_popups specifies whether the OPTIONs in a SELECT block which\n"
+"lacks a MULTIPLE attribute are presented as a vertical list of radio\n"
+"buttons or via a popup menu. Note that if the MULTIPLE attribute is\n"
+"present in the SELECT start tag, Lynx always will create a vertical list\n"
+"of checkboxes for the OPTIONs. A value of \"on\" will set popup menus\n"
+"as the default while a value of \"off\" will set use of radio boxes.\n"
+"The default can be overridden via the -popup command line toggle.\n"
+
+#: src/LYrcFile.c:523
+msgid ""
+"show_color specifies how to set the color mode at startup. A value of\n"
+"\"never\" will force color mode off (treat the terminal as monochrome)\n"
+"at startup even if the terminal appears to be color capable. A value of\n"
+"\"always\" will force color mode on even if the terminal appears to be\n"
+"monochrome, if this is supported by the library used to build lynx.\n"
+"A value of \"default\" will yield the behavior of assuming\n"
+"a monochrome terminal unless color capability is inferred at startup\n"
+"based on the terminal type, or the -color command line switch is used, or\n"
+"the COLORTERM environment variable is set. The default behavior always is\n"
+"used in anonymous accounts or if the \"option_save\" restriction is set.\n"
+"The effect of the saved value can be overridden via\n"
+"the -color and -nocolor command line switches.\n"
+"The mode set at startup can be changed via the \"show color\" option in\n"
+"the 'o'ptions menu. If the option settings are saved, the \"on\" and\n"
+"\"off\" \"show color\" settings will be treated as \"default\".\n"
+msgstr ""
+"show_color specifies how to set the color mode at startup. A value of\n"
+"\"never\" will force color mode off (treat the terminal as monochrome)\n"
+"at startup even if the terminal appears to be color capable. A value of\n"
+"\"always\" will force color mode on even if the terminal appears to be\n"
+"monochrome, if this is supported by the library used to build lynx.\n"
+"A value of \"default\" will yield the behavior of assuming\n"
+"a monochrome terminal unless color capability is inferred at startup\n"
+"based on the terminal type, or the -color command line switch is used, or\n"
+"the COLORTERM environment variable is set. The default behavior always is\n"
+"used in anonymous accounts or if the \"option_save\" restriction is set.\n"
+"The effect of the saved value can be overridden via\n"
+"the -color and -nocolor command line switches.\n"
+"The mode set at startup can be changed via the \"show color\" option in\n"
+"the 'o'ptions menu. If the option settings are saved, the \"on\" and\n"
+"\"off\" \"show color\" settings will be treated as \"default\".\n"
+
+#: src/LYrcFile.c:540
+msgid ""
+"show_cursor specifies whether to 'hide' the cursor to the right (and\n"
+"bottom, if possible) of the screen, or to place it to the left of the\n"
+"current link in documents, or current option in select popup windows.\n"
+"Positioning the cursor to the left of the current link or option is\n"
+"helpful for speech or braille interfaces, and when the terminal is\n"
+"one which does not distinguish the current link based on highlighting\n"
+"or color. A value of \"on\" will set positioning to the left as the\n"
+"default while a value of \"off\" will set 'hiding' of the cursor.\n"
+"The default can be overridden via the -show_cursor command line toggle.\n"
+msgstr ""
+"show_cursor specifies whether to 'hide' the cursor to the right (and\n"
+"bottom, if possible) of the screen, or to place it to the left of the\n"
+"current link in documents, or current option in select popup windows.\n"
+"Positioning the cursor to the left of the current link or option is\n"
+"helpful for speech or braille interfaces, and when the terminal is\n"
+"one which does not distinguish the current link based on highlighting\n"
+"or color. A value of \"on\" will set positioning to the left as the\n"
+"default while a value of \"off\" will set 'hiding' of the cursor.\n"
+"The default can be overridden via the -show_cursor command line toggle.\n"
+
+#: src/LYrcFile.c:551
+msgid ""
+"show_dotfiles specifies that the directory listing should include\n"
+"\"hidden\" (dot) files/directories. If set \"on\", this will be\n"
+"honored only if enabled via userdefs.h and/or lynx.cfg, and not\n"
+"restricted via a command line switch. If display of hidden files\n"
+"is disabled, creation of such files via Lynx also is disabled.\n"
+msgstr ""
+"show_dotfiles specifies that the directory listing should include\n"
+"\"hidden\" (dot) files/directories. If set \"on\", this will be\n"
+"honored only if enabled via userdefs.h and/or lynx.cfg, and not\n"
+"restricted via a command line switch. If display of hidden files\n"
+"is disabled, creation of such files via Lynx also is disabled.\n"
+
+#: src/LYrcFile.c:562
+msgid ""
+"If sub_bookmarks is not turned \"off\", and multiple bookmarks have\n"
+"been defined (see below), then all bookmark operations will first\n"
+"prompt the user to select an active sub-bookmark file. If the default\n"
+"Lynx bookmark_file is defined (see above), it will be used as the\n"
+"default selection. When this option is set to \"advanced\", and the\n"
+"user mode is advanced, the 'v'iew bookmark command will invoke a\n"
+"statusline prompt instead of the menu seen in novice and intermediate\n"
+"user modes. When this option is set to \"standard\", the menu will be\n"
+"presented regardless of user mode.\n"
+msgstr ""
+"If sub_bookmarks is not turned \"off\", and multiple bookmarks have\n"
+"been defined (see below), then all bookmark operations will first\n"
+"prompt the user to select an active sub-bookmark file. If the default\n"
+"Lynx bookmark_file is defined (see above), it will be used as the\n"
+"default selection. When this option is set to \"advanced\", and the\n"
+"user mode is advanced, the 'v'iew bookmark command will invoke a\n"
+"statusline prompt instead of the menu seen in novice and intermediate\n"
+"user modes. When this option is set to \"standard\", the menu will be\n"
+"presented regardless of user mode.\n"
+
+#: src/LYrcFile.c:576
+msgid ""
+"user_mode specifies the users level of knowledge with Lynx. The\n"
+"default is \"NOVICE\" which displays two extra lines of help at the\n"
+"bottom of the screen to aid the user in learning the basic Lynx\n"
+"commands. Set user_mode to \"INTERMEDIATE\" to turn off the extra info.\n"
+"Use \"ADVANCED\" to see the URL of the currently selected link at the\n"
+"bottom of the screen.\n"
+msgstr ""
+"user_mode specifies the users level of knowledge with Lynx. The\n"
+"default is \"NOVICE\" which displays two extra lines of help at the\n"
+"bottom of the screen to aid the user in learning the basic Lynx\n"
+"commands. Set user_mode to \"INTERMEDIATE\" to turn off the extra info.\n"
+"Use \"ADVANCED\" to see the URL of the currently selected link at the\n"
+"bottom of the screen.\n"
+
+#: src/LYrcFile.c:585
+msgid ""
+"If verbose_images is \"on\", lynx will print the name of the image\n"
+"source file in place of [INLINE], [LINK] or [IMAGE]\n"
+"See also VERBOSE_IMAGES in lynx.cfg\n"
+msgstr ""
+"If verbose_images is \"on\", lynx will print the name of the image\n"
+"source file in place of [INLINE], [LINK] or [IMAGE]\n"
+"See also VERBOSE_IMAGES in lynx.cfg\n"
+
+#: src/LYrcFile.c:590
+msgid ""
+"If vi_keys is set to \"on\", then the normal VI movement keys:\n"
+" j = down k = up\n"
+" h = left l = right\n"
+"will be enabled. These keys are only lower case.\n"
+"Capital 'H', 'J' and 'K will still activate help, jump shortcuts,\n"
+"and the keymap display, respectively.\n"
+msgstr ""
+"If vi_keys is set to \"on\", then the normal VI movement keys:\n"
+" j = down k = up\n"
+" h = left l = right\n"
+"will be enabled. These keys are only lower case.\n"
+"Capital 'H', 'J' and 'K will still activate help, jump shortcuts,\n"
+"and the keymap display, respectively.\n"
+
+#: src/LYrcFile.c:598
+msgid ""
+"The visited_links setting controls how Lynx organizes the information\n"
+"in the Visited Links Page.\n"
+msgstr ""
+"The visited_links setting controls how Lynx organizes the information\n"
+"in the Visited Links Page.\n"
+
+#: src/LYrcFile.c:819
+msgid ""
+"If keypad_mode is set to \"NUMBERS_AS_ARROWS\", then the numbers on\n"
+"your keypad when the numlock is on will act as arrow keys:\n"
+" 8 = Up Arrow\n"
+" 4 = Left Arrow 6 = Right Arrow\n"
+" 2 = Down Arrow\n"
+"and the corresponding keyboard numbers will act as arrow keys,\n"
+"regardless of whether numlock is on.\n"
+msgstr ""
+"If keypad_mode is set to \"NUMBERS_AS_ARROWS\", then the numbers on\n"
+"your keypad when the numlock is on will act as arrow keys:\n"
+" 8 = Up Arrow\n"
+" 4 = Left Arrow 6 = Right Arrow\n"
+" 2 = Down Arrow\n"
+"and the corresponding keyboard numbers will act as arrow keys,\n"
+"regardless of whether numlock is on.\n"
+
+#: src/LYrcFile.c:828
+msgid ""
+"If keypad_mode is set to \"LINKS_ARE_NUMBERED\", then numbers will\n"
+"appear next to each link and numbers are used to select links.\n"
+msgstr ""
+"If keypad_mode is set to \"LINKS_ARE_NUMBERED\", then numbers will\n"
+"appear next to each link and numbers are used to select links.\n"
+
+#: src/LYrcFile.c:832
+msgid ""
+"If keypad_mode is set to \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\", then\n"
+"numbers will appear next to each link and visible form input field.\n"
+"Numbers are used to select links, or to move the \"current link\" to a\n"
+"form input field or button. In addition, options in popup menus are\n"
+"indexed so that the user may type an option number to select an option in\n"
+"a popup menu, even if the option isn't visible on the screen. Reference\n"
+"lists and output from the list command also enumerate form inputs.\n"
+msgstr ""
+"If keypad_mode is set to \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\", then\n"
+"numbers will appear next to each link and visible form input field.\n"
+"Numbers are used to select links, or to move the \"current link\" to a\n"
+"form input field or button. In addition, options in popup menus are\n"
+"indexed so that the user may type an option number to select an option in\n"
+"a popup menu, even if the option isn't visible on the screen. Reference\n"
+"lists and output from the list command also enumerate form inputs.\n"
+
+#: src/LYrcFile.c:841
+msgid ""
+"NOTE: Some fixed format documents may look disfigured when\n"
+"\"LINKS_ARE_NUMBERED\" or \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\" are\n"
+"enabled.\n"
+msgstr ""
+"NOTE: Some fixed format documents may look disfigured when\n"
+"\"LINKS_ARE_NUMBERED\" or \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\" are\n"
+"enabled.\n"
+
+#: src/LYrcFile.c:873
+msgid ""
+"Lynx User Defaults File\n"
+"\n"
+msgstr ""
+
+#: src/LYrcFile.c:882
+msgid ""
+"This file contains options saved from the Lynx Options Screen (normally\n"
+"with the 'o' key). To save options with that screen, you must select the\n"
+"checkbox:\n"
+msgstr ""
+
+#: src/LYrcFile.c:889
+msgid ""
+"You must then save the settings using the link on the line above the\n"
+"checkbox:\n"
+msgstr ""
+
+#: src/LYrcFile.c:896
+msgid ""
+"You may also use the command-line option \"-forms_options\", which displays\n"
+"the simpler Options Menu instead. Save options with that using the '>' key.\n"
+"\n"
+msgstr ""
+
+#: src/LYrcFile.c:903
+msgid ""
+"This file contains options saved from the Lynx Options Screen (normally\n"
+"with the '>' key).\n"
+"\n"
+msgstr ""
+
+#: src/LYrcFile.c:910
+#, fuzzy
+msgid ""
+"There is normally no need to edit this file manually, since the defaults\n"
+"here can be controlled from the Options Screen, and the next time options\n"
+"are saved from the Options Screen this file will be completely rewritten.\n"
+"You have been warned...\n"
+"\n"
+"If you are looking for the general configuration file - it is normally\n"
+"called \"lynx.cfg\". It has different content and a different format.\n"
+"It is not this file.\n"
+msgstr ""
+"Lynx User Defaults File\n"
+"\n"
+"This file contains options saved from the Lynx Options Screen (normally\n"
+"with the '>' key). There is normally no need to edit this file manually,\n"
+"since the defaults here can be controlled from the Options Screen, and the\n"
+"next time options are saved from the Options Screen this file will be\n"
+"completely rewritten. You have been warned...\n"
+"If you are looking for the general configuration file - it is normally\n"
+"called lynx.cfg, and it has different content and a different format.\n"
+"It is not this file.\n"
+
+#~ msgid "History List maximum reached! Document not pushed."
+#~ msgstr "ÍúÎò¥ê¥¹¥È¤¬ºÇÂç¿ô¤òĶ¤¨¤Þ¤·¤¿! ¥É¥­¥å¥á¥ó¥È¤Ï¥×¥Ã¥·¥å¤µ¤ì¤Þ¤»¤ó¡£"
+
+#~ msgid "Short read from file, problem?"
+#~ msgstr "¥Õ¥¡¥¤¥ë¤«¤é¤ÎÆɤ߹þ¤ß¤¬ÃæÃǤ·¤Þ¤·¤¿ ÌäÂêȯÀ¸¤«¤â?"
+
+#~ msgid "KB"
+#~ msgstr "KB"
+
+#~ msgid "reason unknown."
+#~ msgstr "(ÉÔÌÀ)"
+
+#~ msgid "Remove '%s' and all of its contents?"
+#~ msgstr "'%s' ¤È¤½¤ÎÁ´¤Æ¤ÎÆâÍƤòºï½ü¤·¤Þ¤¹¤«?"
+
+#~ msgid "Remove directory and all of its contents?"
+#~ msgstr "¥Ç¥£¥ì¥¯¥È¥ê¤È¤½¤ÎÁ´¤Æ¤ÎÆâÍƤòºï½ü¤·¤Þ¤¹¤«?"
+
+#~ msgid "Unable to open file management menu file."
+#~ msgstr "¥Õ¥¡¥¤¥ë´ÉÍý¥á¥Ë¥å¡¼¥Õ¥¡¥¤¥ë¤ò³«¤±¤Þ¤»¤ó¡£"
diff --git a/po/lynx.pot b/po/lynx.pot
new file mode 100644
index 0000000..118c2d3
--- /dev/null
+++ b/po/lynx.pot
@@ -0,0 +1,6121 @@
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: lynx 2.9.0dev.8\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-07-31 10:04-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. ******************************************************************
+#. * The following definitions are for status line prompts, messages, or
+#. * warnings issued by Lynx during program execution. You can modify
+#. * them to make them more appropriate for your site. We recommend that
+#. * you extend these definitions to other languages using the gettext
+#. * library. There are also scattered uses of 'gettext()' throughout the
+#. * Lynx source, covering all but those messages which (a) are used for
+#. * debugging (CTRACE) or (b) are constants used in interaction with
+#. * other programs.
+#. *
+#. * See ABOUT-NLS and po/readme for details and location of contributed
+#. * translations. When no translation is available, the English default is
+#. * used.
+#.
+#: LYMessages.c:28
+#, c-format
+msgid "Alert!: %s"
+msgstr ""
+
+#: LYMessages.c:29
+msgid "Welcome"
+msgstr ""
+
+#: LYMessages.c:30
+msgid "Are you sure you want to quit?"
+msgstr ""
+
+#: LYMessages.c:32
+msgid "Really exit from Lynx?"
+msgstr ""
+
+#: LYMessages.c:34
+msgid "Connection interrupted."
+msgstr ""
+
+#: LYMessages.c:35
+msgid "Data transfer interrupted."
+msgstr ""
+
+#: LYMessages.c:36
+msgid "Cancelled!!!"
+msgstr ""
+
+#: LYMessages.c:37
+msgid "Cancelling!"
+msgstr ""
+
+#: LYMessages.c:38
+msgid "Excellent!!!"
+msgstr ""
+
+#: LYMessages.c:39
+msgid "OK"
+msgstr ""
+
+#: LYMessages.c:40
+msgid "Done!"
+msgstr ""
+
+#: LYMessages.c:41
+msgid "Bad request!"
+msgstr ""
+
+#: LYMessages.c:42
+msgid "previous"
+msgstr ""
+
+#: LYMessages.c:43
+msgid "next screen"
+msgstr ""
+
+#: LYMessages.c:44
+msgid "HELP!"
+msgstr ""
+
+#: LYMessages.c:45
+msgid ", help on "
+msgstr ""
+
+#. #define HELP
+#: LYMessages.c:47
+msgid ""
+"Commands: Use arrow keys to move, '?' for help, 'q' to quit, '<-' to go back."
+msgstr ""
+
+#. #define MOREHELP
+#: LYMessages.c:49
+msgid ""
+"-- press space for more, use arrow keys to move, '?' for help, 'q' to quit."
+msgstr ""
+
+#: LYMessages.c:50
+msgid "-- press space for next page --"
+msgstr ""
+
+#: LYMessages.c:51
+msgid "URL too long"
+msgstr ""
+
+#. Inactive input fields, messages used with -tna option - kw
+#. #define FORM_LINK_TEXT_ADV_MSG_INA
+#: LYMessages.c:57
+#, c-format
+msgid "(Textfield \"%s\"); Inactive. Press <return> to activate."
+msgstr ""
+
+#. #define FORM_LINK_TEXT_MESSAGE_INA
+#: LYMessages.c:59
+msgid "(Text entry field) Inactive. Press <return> to activate."
+msgstr ""
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG_INA
+#: LYMessages.c:61
+#, c-format
+msgid "(Textarea \"%s\"); Inactive. Press <return> to activate."
+msgstr ""
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_INA
+#: LYMessages.c:63
+msgid "(Textarea) Inactive. Press <return> to activate."
+msgstr ""
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG_INA_E
+#: LYMessages.c:65
+#, c-format
+msgid ""
+"(Textarea \"%s\"); Inactive. Press <return> to activate (%s for editor)."
+msgstr ""
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_INA_E
+#: LYMessages.c:67
+#, c-format
+msgid "(Textarea) Inactive. Press <return> to activate (%s for editor)."
+msgstr ""
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE_INA
+#: LYMessages.c:69
+msgid "(Form field) Inactive. Use <return> to edit."
+msgstr ""
+
+#. #define FORM_TEXT_SUBMIT_MESSAGE_INA_X
+#: LYMessages.c:71
+#, c-format
+msgid ""
+"(Form field) Inactive. Use <return> to edit (%s to submit with no cache)."
+msgstr ""
+
+#. #define FORM_TEXT_RESUBMIT_MESSAGE_INA
+#: LYMessages.c:73
+msgid ""
+"(Form field) Inactive. Press <return> to edit, press <return> twice to "
+"submit."
+msgstr ""
+
+#. #define FORM_TEXT_SUBMIT_MAILTO_MSG_INA
+#: LYMessages.c:75
+msgid "(mailto form field) Inactive. Press <return> to change."
+msgstr ""
+
+#. #define FORM_LINK_PASSWORD_MESSAGE_INA
+#: LYMessages.c:77
+msgid "(Password entry field) Inactive. Press <return> to activate."
+msgstr ""
+
+#. #define FORM_LINK_FILE_UNM_MSG
+#: LYMessages.c:80
+msgid ""
+"UNMODIFIABLE file entry field. Use UP or DOWN arrows or tab to move off."
+msgstr ""
+
+#. #define FORM_LINK_FILE_MESSAGE
+#: LYMessages.c:82
+msgid ""
+"(File entry field) Enter filename. Use UP or DOWN arrows or tab to move off."
+msgstr ""
+
+#. #define FORM_LINK_TEXT_ADV_MSG
+#. #define FORM_LINK_TEXT_MESSAGE
+#: LYMessages.c:84 LYMessages.c:86
+#, c-format
+msgid ""
+"(Textfield \"%s\"); Enter text. Use UP or DOWN arrows or tab to move off."
+msgstr ""
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG
+#: LYMessages.c:88
+#, c-format
+msgid "(Textarea \"%s\"); Enter text. Use UP/DOWN arrows or TAB to move off."
+msgstr ""
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE
+#: LYMessages.c:90
+msgid "(Textarea) Enter text. Use UP/DOWN arrows or TAB to move off."
+msgstr ""
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG_E
+#: LYMessages.c:92
+#, c-format
+msgid ""
+"(Textarea \"%s\"); Enter text. Use UP/DOWN arrows or TAB to move off (%s for "
+"editor)."
+msgstr ""
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_E
+#: LYMessages.c:94
+#, c-format
+msgid ""
+"(Textarea) Enter text. Use UP/DOWN arrows or TAB to move off (%s for editor)."
+msgstr ""
+
+#. #define FORM_LINK_TEXT_UNM_MSG
+#: LYMessages.c:96
+msgid ""
+"UNMODIFIABLE form text field. Use UP or DOWN arrows or tab to move off."
+msgstr ""
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE
+#: LYMessages.c:98
+msgid "(Form field) Enter text. Use <return> to submit."
+msgstr ""
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE_X
+#: LYMessages.c:100
+#, c-format
+msgid "(Form field) Enter text. Use <return> to submit (%s for no cache)."
+msgstr ""
+
+#. #define FORM_LINK_TEXT_RESUBMIT_MESSAGE
+#: LYMessages.c:102
+msgid ""
+"(Form field) Enter text. Use <return> to submit, arrows or tab to move off."
+msgstr ""
+
+#. #define FORM_LINK_TEXT_SUBMIT_UNM_MSG
+#: LYMessages.c:104
+msgid "UNMODIFIABLE form field. Use UP or DOWN arrows or tab to move off."
+msgstr ""
+
+#. #define FORM_LINK_TEXT_SUBMIT_MAILTO_MSG
+#: LYMessages.c:106
+msgid ""
+"(mailto form field) Enter text. Use <return> to submit, arrows to move off."
+msgstr ""
+
+#. #define FORM_LINK_TEXT_SUBMIT_MAILTO_DIS_MSG
+#: LYMessages.c:108
+msgid "(mailto form field) Mail is disallowed so you cannot submit."
+msgstr ""
+
+#. #define FORM_LINK_PASSWORD_MESSAGE
+#: LYMessages.c:110
+msgid ""
+"(Password entry field) Enter text. Use UP or DOWN arrows or tab to move off."
+msgstr ""
+
+#. #define FORM_LINK_PASSWORD_UNM_MSG
+#: LYMessages.c:112
+msgid "UNMODIFIABLE form password. Use UP or DOWN arrows or tab to move off."
+msgstr ""
+
+#. #define FORM_LINK_CHECKBOX_ADV_MSG
+#: LYMessages.c:114
+#, c-format
+msgid "(Checkbox \"%s\"); Use right-arrow or <return> to toggle."
+msgstr ""
+
+#. #define FORM_LINK_CHECKBOX_MESSAGE
+#: LYMessages.c:116
+msgid "(Checkbox Field) Use right-arrow or <return> to toggle."
+msgstr ""
+
+#. #define FORM_LINK_CHECKBOX_UNM_MSG
+#: LYMessages.c:118
+msgid "UNMODIFIABLE form checkbox. Use UP or DOWN arrows or tab to move off."
+msgstr ""
+
+#. #define FORM_LINK_RADIO_ADV_MSG
+#: LYMessages.c:120
+#, c-format
+msgid "(Radio Button \"%s\"); Use right-arrow or <return> to toggle."
+msgstr ""
+
+#. #define FORM_LINK_RADIO_MESSAGE
+#: LYMessages.c:122
+msgid "(Radio Button) Use right-arrow or <return> to toggle."
+msgstr ""
+
+#. #define FORM_LINK_RADIO_UNM_MSG
+#: LYMessages.c:124
+msgid ""
+"UNMODIFIABLE form radio button. Use UP or DOWN arrows or tab to move off."
+msgstr ""
+
+#. #define FORM_LINK_SUBMIT_PREFIX
+#: LYMessages.c:126
+msgid "Submit ('x' for no cache) to "
+msgstr ""
+
+#. #define FORM_LINK_RESUBMIT_PREFIX
+#: LYMessages.c:128
+msgid "Submit to "
+msgstr ""
+
+#. #define FORM_LINK_SUBMIT_MESSAGE
+#: LYMessages.c:130
+msgid ""
+"(Form submit button) Use right-arrow or <return> to submit ('x' for no "
+"cache)."
+msgstr ""
+
+#. #define FORM_LINK_RESUBMIT_MESSAGE
+#: LYMessages.c:132
+msgid "(Form submit button) Use right-arrow or <return> to submit."
+msgstr ""
+
+#. #define FORM_LINK_SUBMIT_DIS_MSG
+#: LYMessages.c:134
+msgid "DISABLED form submit button. Use UP or DOWN arrows or tab to move off."
+msgstr ""
+
+#. #define FORM_LINK_SUBMIT_MAILTO_PREFIX
+#: LYMessages.c:136
+msgid "Submit mailto form to "
+msgstr ""
+
+#. #define FORM_LINK_SUBMIT_MAILTO_MSG
+#: LYMessages.c:138
+msgid "(mailto form submit button) Use right-arrow or <return> to submit."
+msgstr ""
+
+#. #define FORM_LINK_SUBMIT_MAILTO_DIS_MSG
+#: LYMessages.c:140
+msgid "(mailto form submit button) Mail is disallowed so you cannot submit."
+msgstr ""
+
+#. #define FORM_LINK_RESET_MESSAGE
+#: LYMessages.c:142
+msgid ""
+"(Form reset button) Use right-arrow or <return> to reset form to defaults."
+msgstr ""
+
+#. #define FORM_LINK_RESET_DIS_MSG
+#: LYMessages.c:144
+msgid "DISABLED form reset button. Use UP or DOWN arrows or tab to move off."
+msgstr ""
+
+#. #define FORM_LINK_BUTTON_MESSAGE
+#: LYMessages.c:146
+msgid "(Script button) Use UP or DOWN arrows or tab to move off."
+msgstr ""
+
+#. #define FORM_LINK_BUTTON_ADV_MSG
+#: LYMessages.c:148
+#, c-format
+msgid "(Script button \"%s\"); Use UP or DOWN arrows or tab to move off."
+msgstr ""
+
+#. #define FORM_LINK_BUTTON_DIS_MSG
+#: LYMessages.c:150
+msgid "DISABLED Script button. Use UP or DOWN arrows or tab to move off."
+msgstr ""
+
+#. #define FORM_LINK_OPTION_LIST_ADV_MSG
+#: LYMessages.c:152
+#, c-format
+msgid "(Option list \"%s\"); Hit return to select option."
+msgstr ""
+
+#. #define FORM_LINK_OPTION_LIST_MESSAGE
+#: LYMessages.c:154
+msgid ""
+"(Option list) Hit return and use arrow keys and return to select option."
+msgstr ""
+
+#. #define CHOICE_LIST_ADV_MSG
+#: LYMessages.c:156
+#, c-format
+msgid "(Choice entry \"%s\"); Use arrow keys and return to select option."
+msgstr ""
+
+#. #define CHOICE_LIST_MESSAGE
+#: LYMessages.c:158
+msgid ""
+"(Choice list) Hit return and use arrow keys and return to select option."
+msgstr ""
+
+#. #define MOUSE_CHOICE_MESSAGE
+#: LYMessages.c:160
+msgid "Left mouse button or return to select, arrow keys to scroll."
+msgstr ""
+
+#. #define FORM_LINK_OPTION_LIST_UNM_MSG
+#: LYMessages.c:162
+msgid "UNMODIFIABLE option list. Use return or arrow keys to review or leave."
+msgstr ""
+
+#. #define CHOICE_LIST_UNM_MSG
+#: LYMessages.c:164
+msgid "UNMODIFIABLE choice list. Use return or arrow keys to review or leave."
+msgstr ""
+
+#: LYMessages.c:165
+msgid "Submitting form..."
+msgstr ""
+
+#: LYMessages.c:166
+msgid "Resetting form..."
+msgstr ""
+
+#. #define RELOADING_FORM
+#: LYMessages.c:168
+msgid "Reloading document. Any form entries will be lost!"
+msgstr ""
+
+#. #define LINK_NOT_IN_FORM
+#: LYMessages.c:170
+msgid "The current link is not in a FORM"
+msgstr ""
+
+#: LYMessages.c:171
+#, c-format
+msgid "Warning: Cannot transcode form data to charset %s!"
+msgstr ""
+
+#. #define NORMAL_LINK_MESSAGE
+#: LYMessages.c:174
+msgid "(NORMAL LINK) Use right-arrow or <return> to activate."
+msgstr ""
+
+#: LYMessages.c:175
+msgid "The resource requested is not available at this time."
+msgstr ""
+
+#: LYMessages.c:176
+msgid "Enter Lynx keystroke command: "
+msgstr ""
+
+#: LYMessages.c:177
+msgid "Looking up "
+msgstr ""
+
+#: LYMessages.c:178
+#, c-format
+msgid "Getting %s"
+msgstr ""
+
+#: LYMessages.c:179
+#, c-format
+msgid "Skipping %s"
+msgstr ""
+
+#: LYMessages.c:180
+#, c-format
+msgid "Using %s"
+msgstr ""
+
+#: LYMessages.c:181
+#, c-format
+msgid "Illegal URL: %s"
+msgstr ""
+
+#: LYMessages.c:182
+#, c-format
+msgid "Badly formed address %s"
+msgstr ""
+
+#: LYMessages.c:183
+#, c-format
+msgid "URL: %s"
+msgstr ""
+
+#: LYMessages.c:184
+msgid "Unable to access WWW file!!!"
+msgstr ""
+
+#: LYMessages.c:185
+#, c-format
+msgid "This is a searchable index. Use %s to search."
+msgstr ""
+
+#. #define WWW_INDEX_MORE_MESSAGE
+#: LYMessages.c:187
+#, c-format
+msgid "--More-- This is a searchable index. Use %s to search."
+msgstr ""
+
+#: LYMessages.c:188
+msgid "You have entered an invalid link number."
+msgstr ""
+
+#. #define SOURCE_HELP
+#: LYMessages.c:190
+msgid ""
+"Currently viewing document source. Press '\\' to return to rendered version."
+msgstr ""
+
+#. #define NOVICE_LINE_ONE
+#: LYMessages.c:192
+msgid ""
+" Arrow keys: Up and Down to move. Right to follow a link; Left to go "
+"back. \n"
+msgstr ""
+
+#. #define NOVICE_LINE_TWO
+#: LYMessages.c:194
+msgid ""
+" H)elp O)ptions P)rint G)o M)ain screen Q)uit /=search [delete]=history "
+"list \n"
+msgstr ""
+
+#. #define NOVICE_LINE_TWO_A
+#: LYMessages.c:196
+msgid ""
+" O)ther cmds H)elp K)eymap G)oto P)rint M)ain screen o)ptions "
+"Q)uit \n"
+msgstr ""
+
+#. #define NOVICE_LINE_TWO_B
+#: LYMessages.c:198
+msgid ""
+" O)ther cmds B)ack E)dit D)ownload ^R)eload ^W)ipe screen search "
+"doc: / \n"
+msgstr ""
+
+#. #define NOVICE_LINE_TWO_C
+#: LYMessages.c:200
+msgid ""
+"O)ther cmds C)omment History: <backspace> Bookmarks: V)iew, A)dd, "
+"R)emove \n"
+msgstr ""
+
+#. #define FORM_NOVICELINE_ONE
+#: LYMessages.c:202
+msgid ""
+" Enter text into the field by typing on the keyboard "
+msgstr ""
+
+#. #define FORM_NOVICELINE_TWO
+#: LYMessages.c:204
+msgid ""
+" Ctrl-U to delete all text in field, [Backspace] to delete a character "
+msgstr ""
+
+#. #define FORM_NOVICELINE_TWO_DELBL
+#: LYMessages.c:206
+msgid ""
+" Ctrl-U to delete text in field, [Backspace] to delete a character "
+msgstr ""
+
+#. #define FORM_NOVICELINE_TWO_VAR
+#: LYMessages.c:208
+#, c-format
+msgid ""
+" %s to delete all text in field, [Backspace] to delete a character "
+msgstr ""
+
+#. #define FORM_NOVICELINE_TWO_DELBL_VAR
+#: LYMessages.c:210
+#, c-format
+msgid " %s to delete text in field, [Backspace] to delete a character "
+msgstr ""
+
+#. mailto
+#: LYMessages.c:213
+msgid "Malformed mailto form submission! Cancelled!"
+msgstr ""
+
+#: LYMessages.c:214
+msgid "Warning! Control codes in mail address replaced by ?"
+msgstr ""
+
+#: LYMessages.c:215
+msgid "Mail disallowed! Cannot submit."
+msgstr ""
+
+#: LYMessages.c:216
+msgid "Mailto form submission failed!"
+msgstr ""
+
+#: LYMessages.c:217
+msgid "Mailto form submission Cancelled!!!"
+msgstr ""
+
+#: LYMessages.c:218
+msgid "Sending form content..."
+msgstr ""
+
+#: LYMessages.c:219
+msgid "No email address is present in mailto URL!"
+msgstr ""
+
+#. #define MAILTO_URL_TEMPOPEN_FAILED
+#: LYMessages.c:221
+msgid "Unable to open temporary file for mailto URL!"
+msgstr ""
+
+#. #define INC_ORIG_MSG_PROMPT
+#: LYMessages.c:223
+msgid "Do you wish to include the original message?"
+msgstr ""
+
+#. #define INC_PREPARSED_MSG_PROMPT
+#: LYMessages.c:225
+msgid "Do you wish to include the preparsed source?"
+msgstr ""
+
+#. #define SPAWNING_EDITOR_FOR_MAIL
+#: LYMessages.c:227
+msgid "Spawning your selected editor to edit mail message"
+msgstr ""
+
+#. #define ERROR_SPAWNING_EDITOR
+#: LYMessages.c:229
+msgid "Error spawning editor, check your editor definition in the options menu"
+msgstr ""
+
+#: LYMessages.c:230
+msgid "Send this comment?"
+msgstr ""
+
+#: LYMessages.c:231
+msgid "Send this message?"
+msgstr ""
+
+#: LYMessages.c:232
+msgid "Sending your message..."
+msgstr ""
+
+#: LYMessages.c:233
+msgid "Sending your comment:"
+msgstr ""
+
+#. textarea
+#: LYMessages.c:236
+msgid "Not in a TEXTAREA; cannot use external editor."
+msgstr ""
+
+#: LYMessages.c:237
+msgid "Not in a TEXTAREA; cannot use command."
+msgstr ""
+
+#: LYMessages.c:239
+msgid "file: ACTIONs are disallowed!"
+msgstr ""
+
+#. #define FILE_SERVED_LINKS_DISALLOWED
+#: LYMessages.c:241
+msgid "file: URLs via served links are disallowed!"
+msgstr ""
+
+#: LYMessages.c:242
+msgid "Access to local files denied."
+msgstr ""
+
+#: LYMessages.c:243
+msgid "file: URLs via bookmarks are disallowed!"
+msgstr ""
+
+#. #define SPECIAL_VIA_EXTERNAL_DISALLOWED
+#: LYMessages.c:245
+msgid "This special URL is not allowed in external documents!"
+msgstr ""
+
+#: LYMessages.c:246
+msgid "Press <return> to return to Lynx."
+msgstr ""
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:249
+msgid "Spawning DCL subprocess. Use 'logout' to return to Lynx.\n"
+msgstr ""
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:253
+msgid "Type EXIT to return to Lynx.\n"
+msgstr ""
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:256
+msgid "Spawning your default shell. Use 'exit' to return to Lynx.\n"
+msgstr ""
+
+#: LYMessages.c:259
+msgid "Spawning is currently disabled."
+msgstr ""
+
+#: LYMessages.c:260
+msgid "The 'd'ownload command is currently disabled."
+msgstr ""
+
+#: LYMessages.c:261
+msgid "You cannot download an input field."
+msgstr ""
+
+#: LYMessages.c:262
+msgid "Form has a mailto action! Cannot download."
+msgstr ""
+
+#: LYMessages.c:263
+msgid "You cannot download a mailto: link."
+msgstr ""
+
+#: LYMessages.c:264
+msgid "You cannot download cookies."
+msgstr ""
+
+#: LYMessages.c:265
+msgid "You cannot download a printing option."
+msgstr ""
+
+#: LYMessages.c:266
+msgid "You cannot download an upload option."
+msgstr ""
+
+#: LYMessages.c:267
+msgid "You cannot download an permit option."
+msgstr ""
+
+#: LYMessages.c:268
+msgid "This special URL cannot be downloaded!"
+msgstr ""
+
+#: LYMessages.c:269
+msgid "Nothing to download."
+msgstr ""
+
+#: LYMessages.c:270
+msgid "Trace ON!"
+msgstr ""
+
+#: LYMessages.c:271
+msgid "Trace OFF!"
+msgstr ""
+
+#. #define CLICKABLE_IMAGES_ON
+#: LYMessages.c:273
+msgid "Links will be included for all images! Reloading..."
+msgstr ""
+
+#. #define CLICKABLE_IMAGES_OFF
+#: LYMessages.c:275
+msgid "Standard image handling restored! Reloading..."
+msgstr ""
+
+#. #define PSEUDO_INLINE_ALTS_ON
+#: LYMessages.c:277
+msgid ""
+"Pseudo_ALTs will be inserted for inlines without ALT strings! Reloading..."
+msgstr ""
+
+#. #define PSEUDO_INLINE_ALTS_OFF
+#: LYMessages.c:279
+msgid "Inlines without an ALT string specified will be ignored! Reloading..."
+msgstr ""
+
+#: LYMessages.c:280
+msgid "Raw 8-bit or CJK mode toggled OFF! Reloading..."
+msgstr ""
+
+#: LYMessages.c:281
+msgid "Raw 8-bit or CJK mode toggled ON! Reloading..."
+msgstr ""
+
+#. #define HEAD_D_L_OR_CANCEL
+#: LYMessages.c:283
+msgid "Send HEAD request for D)ocument or L)ink, or C)ancel? (d,l,c): "
+msgstr ""
+
+#. #define HEAD_D_OR_CANCEL
+#: LYMessages.c:285
+msgid "Send HEAD request for D)ocument, or C)ancel? (d,c): "
+msgstr ""
+
+#: LYMessages.c:286
+msgid "Sorry, the document is not an http URL."
+msgstr ""
+
+#: LYMessages.c:287
+msgid "Sorry, the link is not an http URL."
+msgstr ""
+
+#: LYMessages.c:288
+msgid "Sorry, the ACTION for this form is disabled."
+msgstr ""
+
+#. #define FORM_ACTION_NOT_HTTP_URL
+#: LYMessages.c:290
+msgid "Sorry, the ACTION for this form is not an http URL."
+msgstr ""
+
+#: LYMessages.c:291
+msgid "Not an http URL or form ACTION!"
+msgstr ""
+
+#: LYMessages.c:292
+msgid "This special URL cannot be a form ACTION!"
+msgstr ""
+
+#: LYMessages.c:293
+msgid "URL is not in starting realm!"
+msgstr ""
+
+#: LYMessages.c:294
+msgid "News posting is disabled!"
+msgstr ""
+
+#: LYMessages.c:295
+msgid "File management support is disabled!"
+msgstr ""
+
+#: LYMessages.c:296
+msgid "No jump file is currently available."
+msgstr ""
+
+#: LYMessages.c:297
+msgid "Jump to (use '?' for list): "
+msgstr ""
+
+#: LYMessages.c:298
+msgid "Jumping to a shortcut URL is disallowed!"
+msgstr ""
+
+#: LYMessages.c:299
+msgid "Random URL is disallowed! Use a shortcut."
+msgstr ""
+
+#: LYMessages.c:300
+msgid "No random URLs have been used thus far."
+msgstr ""
+
+#: LYMessages.c:301
+msgid "Bookmark features are currently disabled."
+msgstr ""
+
+#: LYMessages.c:302
+msgid "Execution via bookmarks is disabled."
+msgstr ""
+
+#. #define BOOKMARK_FILE_NOT_DEFINED
+#: LYMessages.c:304
+#, c-format
+msgid "Bookmark file is not defined. Use %s to see options."
+msgstr ""
+
+#. #define NO_TEMP_FOR_HOTLIST
+#: LYMessages.c:306
+msgid "Unable to open tempfile for X Mosaic hotlist conversion."
+msgstr ""
+
+#: LYMessages.c:307
+msgid "ERROR - unable to open bookmark file."
+msgstr ""
+
+#. #define BOOKMARK_OPEN_FAILED_FOR_DEL
+#: LYMessages.c:309
+msgid "Unable to open bookmark file for deletion of link."
+msgstr ""
+
+#. #define BOOKSCRA_OPEN_FAILED_FOR_DEL
+#: LYMessages.c:311
+msgid "Unable to open scratch file for deletion of link."
+msgstr ""
+
+#: LYMessages.c:313
+msgid "Error renaming scratch file."
+msgstr ""
+
+#: LYMessages.c:315
+msgid "Error renaming temporary file."
+msgstr ""
+
+#. #define BOOKTEMP_COPY_FAIL
+#: LYMessages.c:317
+msgid "Unable to copy temporary file for deletion of link."
+msgstr ""
+
+#. #define BOOKTEMP_REOPEN_FAIL_FOR_DEL
+#: LYMessages.c:319
+msgid "Unable to reopen temporary file for deletion of link."
+msgstr ""
+
+#. #define BOOKMARK_LINK_NOT_ONE_LINE
+#: LYMessages.c:322
+msgid "Link is not by itself all on one line in bookmark file."
+msgstr ""
+
+#: LYMessages.c:323
+msgid "Bookmark deletion failed."
+msgstr ""
+
+#. #define BOOKMARKS_NOT_TRAVERSED
+#: LYMessages.c:325
+msgid "Bookmark files cannot be traversed (only http URLs)."
+msgstr ""
+
+#. #define BOOKMARKS_NOT_OPEN
+#: LYMessages.c:327
+msgid "Unable to open bookmark file, use 'a' to save a link first"
+msgstr ""
+
+#: LYMessages.c:328
+msgid "There are no links in this bookmark file!"
+msgstr ""
+
+#. #define CACHE_D_OR_CANCEL
+#: LYMessages.c:330
+msgid "D)elete cached document or C)ancel? (d,c): "
+msgstr ""
+
+#. #define BOOK_D_L_OR_CANCEL
+#: LYMessages.c:332
+msgid "Save D)ocument or L)ink to bookmark file or C)ancel? (d,l,c): "
+msgstr ""
+
+#: LYMessages.c:333
+msgid "Save D)ocument to bookmark file or C)ancel? (d,c): "
+msgstr ""
+
+#: LYMessages.c:334
+msgid "Save L)ink to bookmark file or C)ancel? (l,c): "
+msgstr ""
+
+#. #define NOBOOK_POST_FORM
+#: LYMessages.c:336
+msgid "Documents from forms with POST content cannot be saved as bookmarks."
+msgstr ""
+
+#: LYMessages.c:337
+msgid "Cannot save form fields/links"
+msgstr ""
+
+#. #define NOBOOK_HSML
+#: LYMessages.c:339
+msgid "History, showinfo, menu and list files cannot be saved as bookmarks."
+msgstr ""
+
+#. #define CONFIRM_BOOKMARK_DELETE
+#: LYMessages.c:341
+msgid "Do you really want to delete this link from your bookmark file?"
+msgstr ""
+
+#: LYMessages.c:342
+msgid "Malformed address."
+msgstr ""
+
+#. #define HISTORICAL_ON_MINIMAL_OFF
+#: LYMessages.c:344
+msgid "Historical comment parsing ON (Minimal is overridden)!"
+msgstr ""
+
+#. #define HISTORICAL_OFF_MINIMAL_ON
+#: LYMessages.c:346
+msgid "Historical comment parsing OFF (Minimal is in effect)!"
+msgstr ""
+
+#. #define HISTORICAL_ON_VALID_OFF
+#: LYMessages.c:348
+msgid "Historical comment parsing ON (Valid is overridden)!"
+msgstr ""
+
+#. #define HISTORICAL_OFF_VALID_ON
+#: LYMessages.c:350
+msgid "Historical comment parsing OFF (Valid is in effect)!"
+msgstr ""
+
+#. #define MINIMAL_ON_IN_EFFECT
+#: LYMessages.c:352
+msgid "Minimal comment parsing ON (and in effect)!"
+msgstr ""
+
+#. #define MINIMAL_OFF_VALID_ON
+#: LYMessages.c:354
+msgid "Minimal comment parsing OFF (Valid is in effect)!"
+msgstr ""
+
+#. #define MINIMAL_ON_BUT_HISTORICAL
+#: LYMessages.c:356
+msgid "Minimal comment parsing ON (but Historical is in effect)!"
+msgstr ""
+
+#. #define MINIMAL_OFF_HISTORICAL_ON
+#: LYMessages.c:358
+msgid "Minimal comment parsing OFF (Historical is in effect)!"
+msgstr ""
+
+#: LYMessages.c:359
+msgid "Soft double-quote parsing ON!"
+msgstr ""
+
+#: LYMessages.c:360
+msgid "Soft double-quote parsing OFF!"
+msgstr ""
+
+#: LYMessages.c:361
+msgid "Now using TagSoup parsing of HTML."
+msgstr ""
+
+#: LYMessages.c:362
+msgid "Now using SortaSGML parsing of HTML!"
+msgstr ""
+
+#: LYMessages.c:363
+msgid "You are already at the end of this document."
+msgstr ""
+
+#: LYMessages.c:364
+msgid "You are already at the beginning of this document."
+msgstr ""
+
+#: LYMessages.c:365
+#, c-format
+msgid "You are already at page %d of this document."
+msgstr ""
+
+#: LYMessages.c:366
+#, c-format
+msgid "Link number %d already is current."
+msgstr ""
+
+#: LYMessages.c:367
+msgid "You are already at the first document"
+msgstr ""
+
+#: LYMessages.c:368
+msgid "There are no links above this line of the document."
+msgstr ""
+
+#: LYMessages.c:369
+msgid "There are no links below this line of the document."
+msgstr ""
+
+#. #define MAXLEN_REACHED_DEL_OR_MOV
+#: LYMessages.c:371
+msgid "Maximum length reached! Delete text or move off field."
+msgstr ""
+
+#. #define NOT_ON_SUBMIT_OR_LINK
+#: LYMessages.c:373
+msgid "You are not on a form submission button or normal link."
+msgstr ""
+
+#. #define NEED_CHECKED_RADIO_BUTTON
+#: LYMessages.c:375
+msgid "One radio button must be checked at all times!"
+msgstr ""
+
+#: LYMessages.c:376
+msgid "No submit button for this form, submit single text field?"
+msgstr ""
+
+#: LYMessages.c:377
+msgid "Do you want to go back to the previous document?"
+msgstr ""
+
+#: LYMessages.c:378
+msgid "Use arrows or tab to move off of field."
+msgstr ""
+
+#. #define ENTER_TEXT_ARROWS_OR_TAB
+#: LYMessages.c:380
+msgid "Enter text. Use arrows or tab to move off of field."
+msgstr ""
+
+#: LYMessages.c:381
+msgid "** Bad HTML!! No form action defined. **"
+msgstr ""
+
+#: LYMessages.c:382
+msgid "Bad HTML!! Unable to create popup window!"
+msgstr ""
+
+#: LYMessages.c:383
+msgid "Unable to create popup window!"
+msgstr ""
+
+#: LYMessages.c:384
+msgid "Goto a random URL is disallowed!"
+msgstr ""
+
+#: LYMessages.c:385
+msgid "Goto a non-http URL is disallowed!"
+msgstr ""
+
+#: LYMessages.c:386
+#, c-format
+msgid "You are not allowed to goto \"%s\" URLs"
+msgstr ""
+
+#: LYMessages.c:387
+msgid "URL to open: "
+msgstr ""
+
+#: LYMessages.c:388
+msgid "Edit the current Goto URL: "
+msgstr ""
+
+#: LYMessages.c:389
+msgid "Edit the previous Goto URL: "
+msgstr ""
+
+#: LYMessages.c:390
+msgid "Edit a previous Goto URL: "
+msgstr ""
+
+#: LYMessages.c:391
+msgid "Current document has POST data."
+msgstr ""
+
+#: LYMessages.c:392
+msgid "Edit this document's URL: "
+msgstr ""
+
+#: LYMessages.c:393
+msgid "Edit the current link's URL: "
+msgstr ""
+
+#: LYMessages.c:394
+msgid "Edit the form's submit-URL: "
+msgstr ""
+
+#: LYMessages.c:395
+msgid "You cannot edit File Management URLs"
+msgstr ""
+
+#: LYMessages.c:396
+msgid "Enter a database query: "
+msgstr ""
+
+#: LYMessages.c:397
+msgid "Enter a whereis query: "
+msgstr ""
+
+#: LYMessages.c:398
+msgid "Edit the current query: "
+msgstr ""
+
+#: LYMessages.c:399
+msgid "Edit the previous query: "
+msgstr ""
+
+#: LYMessages.c:400
+msgid "Edit a previous query: "
+msgstr ""
+
+#. #define USE_C_R_TO_RESUB_CUR_QUERY
+#: LYMessages.c:402
+msgid "Use Control-R to resubmit the current query."
+msgstr ""
+
+#: LYMessages.c:403
+msgid "Edit the current shortcut: "
+msgstr ""
+
+#: LYMessages.c:404
+msgid "Edit the previous shortcut: "
+msgstr ""
+
+#: LYMessages.c:405
+msgid "Edit a previous shortcut: "
+msgstr ""
+
+#: LYMessages.c:406
+#, c-format
+msgid "Key '%c' is not mapped to a jump file!"
+msgstr ""
+
+#: LYMessages.c:407
+msgid "Cannot locate jump file!"
+msgstr ""
+
+#: LYMessages.c:408
+msgid "Cannot open jump file!"
+msgstr ""
+
+#: LYMessages.c:409
+msgid "Error reading jump file!"
+msgstr ""
+
+#: LYMessages.c:410
+msgid "Out of memory reading jump file!"
+msgstr ""
+
+#: LYMessages.c:411
+msgid "Out of memory reading jump table!"
+msgstr ""
+
+#: LYMessages.c:412
+msgid "No index is currently available."
+msgstr ""
+
+#. #define CONFIRM_MAIN_SCREEN
+#: LYMessages.c:414
+msgid "Do you really want to go to the Main screen?"
+msgstr ""
+
+#: LYMessages.c:415
+msgid "You are already at main screen!"
+msgstr ""
+
+#. #define NOT_ISINDEX
+#: LYMessages.c:417
+msgid ""
+"Not a searchable indexed document -- press '/' to search for a text string"
+msgstr ""
+
+#. #define NO_OWNER
+#: LYMessages.c:419
+msgid "No owner is defined for this file so you cannot send a comment"
+msgstr ""
+
+#: LYMessages.c:420
+#, c-format
+msgid "No owner is defined. Use %s?"
+msgstr ""
+
+#: LYMessages.c:421
+msgid "Do you wish to send a comment?"
+msgstr ""
+
+#: LYMessages.c:422
+msgid "Mail is disallowed so you cannot send a comment"
+msgstr ""
+
+#: LYMessages.c:423
+msgid "The 'e'dit command is currently disabled."
+msgstr ""
+
+#: LYMessages.c:424
+msgid "External editing is currently disabled."
+msgstr ""
+
+#: LYMessages.c:425
+msgid "System error - failure to get status."
+msgstr ""
+
+#: LYMessages.c:426
+msgid "No editor is defined!"
+msgstr ""
+
+#: LYMessages.c:427
+msgid "The 'p'rint command is currently disabled."
+msgstr ""
+
+#: LYMessages.c:428
+msgid "Document has no Toolbar links or Banner."
+msgstr ""
+
+#: LYMessages.c:429
+msgid "Unable to open traversal file."
+msgstr ""
+
+#: LYMessages.c:430
+msgid "Unable to open traversal found file."
+msgstr ""
+
+#: LYMessages.c:431
+msgid "Unable to open reject file."
+msgstr ""
+
+#: LYMessages.c:432
+msgid "Unable to open traversal errors output file"
+msgstr ""
+
+#: LYMessages.c:433
+msgid "TRAVERSAL WAS INTERRUPTED"
+msgstr ""
+
+#: LYMessages.c:434
+msgid "Follow link (or goto link or page) number: "
+msgstr ""
+
+#: LYMessages.c:435
+msgid "Select option (or page) number: "
+msgstr ""
+
+#: LYMessages.c:436
+#, c-format
+msgid "Option number %d already is current."
+msgstr ""
+
+#. #define ALREADY_AT_OPTION_END
+#: LYMessages.c:438
+msgid "You are already at the end of this option list."
+msgstr ""
+
+#. #define ALREADY_AT_OPTION_BEGIN
+#: LYMessages.c:440
+msgid "You are already at the beginning of this option list."
+msgstr ""
+
+#. #define ALREADY_AT_OPTION_PAGE
+#: LYMessages.c:442
+#, c-format
+msgid "You are already at page %d of this option list."
+msgstr ""
+
+#: LYMessages.c:443
+msgid "You have entered an invalid option number."
+msgstr ""
+
+#: LYMessages.c:444
+msgid "** Bad HTML!! Use -trace to diagnose. **"
+msgstr ""
+
+#: LYMessages.c:445
+msgid "Give name of file to save in"
+msgstr ""
+
+#: LYMessages.c:446
+msgid "Can't save data to file -- please run WWW locally"
+msgstr ""
+
+#: LYMessages.c:447
+msgid "Can't open temporary file!"
+msgstr ""
+
+#: LYMessages.c:448
+msgid "Can't open output file! Cancelling!"
+msgstr ""
+
+#: LYMessages.c:449
+msgid "Execution is disabled."
+msgstr ""
+
+#. #define EXECUTION_DISABLED_FOR_FILE
+#: LYMessages.c:451
+#, c-format
+msgid "Execution is not enabled for this file. See the Options menu (use %s)."
+msgstr ""
+
+#. #define EXECUTION_NOT_COMPILED
+#: LYMessages.c:453
+msgid "Execution capabilities are not compiled into this version."
+msgstr ""
+
+#: LYMessages.c:454
+msgid "This file cannot be displayed on this terminal."
+msgstr ""
+
+#. #define CANNOT_DISPLAY_FILE_D_OR_C
+#: LYMessages.c:456
+msgid "This file cannot be displayed on this terminal: D)ownload, or C)ancel"
+msgstr ""
+
+#: LYMessages.c:457
+#, c-format
+msgid "%s D)ownload, or C)ancel"
+msgstr ""
+
+#: LYMessages.c:458
+msgid "Cancelling file."
+msgstr ""
+
+#: LYMessages.c:459
+msgid "Retrieving file. - PLEASE WAIT -"
+msgstr ""
+
+#: LYMessages.c:460
+msgid "Enter a filename: "
+msgstr ""
+
+#: LYMessages.c:461
+msgid "Edit the previous filename: "
+msgstr ""
+
+#: LYMessages.c:462
+msgid "Edit a previous filename: "
+msgstr ""
+
+#: LYMessages.c:463
+msgid "Enter a new filename: "
+msgstr ""
+
+#: LYMessages.c:464
+msgid "File name may not begin with a dot."
+msgstr ""
+
+#: LYMessages.c:466
+msgid "File exists. Create higher version?"
+msgstr ""
+
+#: LYMessages.c:468
+msgid "File exists. Overwrite?"
+msgstr ""
+
+#: LYMessages.c:470
+msgid "Cannot write to file."
+msgstr ""
+
+#: LYMessages.c:471
+msgid "ERROR! - download command is misconfigured."
+msgstr ""
+
+#: LYMessages.c:472
+msgid "Unable to download file."
+msgstr ""
+
+#: LYMessages.c:473
+msgid "Reading directory..."
+msgstr ""
+
+#: LYMessages.c:474
+msgid "Building directory listing..."
+msgstr ""
+
+#: LYMessages.c:475
+msgid "Saving..."
+msgstr ""
+
+#: LYMessages.c:476
+#, c-format
+msgid "Could not edit file '%s'."
+msgstr ""
+
+#: LYMessages.c:477
+msgid "Unable to access document!"
+msgstr ""
+
+#: LYMessages.c:478
+msgid "Could not access file."
+msgstr ""
+
+#: LYMessages.c:479
+msgid "Could not access directory."
+msgstr ""
+
+#: LYMessages.c:480
+msgid "Could not load data."
+msgstr ""
+
+#. #define CANNOT_EDIT_REMOTE_FILES
+#: LYMessages.c:482
+msgid "Lynx cannot currently (e)dit remote WWW files."
+msgstr ""
+
+#. #define CANNOT_EDIT_FIELD
+#: LYMessages.c:484
+msgid "This field cannot be (e)dited with an external editor."
+msgstr ""
+
+#: LYMessages.c:485
+msgid "Bad rule"
+msgstr ""
+
+#: LYMessages.c:486
+msgid "Insufficient operands:"
+msgstr ""
+
+#: LYMessages.c:487
+msgid "You are not authorized to edit this file."
+msgstr ""
+
+#: LYMessages.c:488
+msgid "Title: "
+msgstr ""
+
+#: LYMessages.c:489
+msgid "Subject: "
+msgstr ""
+
+#: LYMessages.c:490
+msgid "Username: "
+msgstr ""
+
+#: LYMessages.c:491
+msgid "Password: "
+msgstr ""
+
+#: LYMessages.c:492
+msgid "lynx: Username and Password required!!!"
+msgstr ""
+
+#: LYMessages.c:493
+msgid "lynx: Password required!!!"
+msgstr ""
+
+#: LYMessages.c:494
+msgid "Clear all authorization info for this session?"
+msgstr ""
+
+#: LYMessages.c:495
+msgid "Authorization info cleared."
+msgstr ""
+
+#: LYMessages.c:496
+msgid "Authorization failed. Retry?"
+msgstr ""
+
+#: LYMessages.c:497
+msgid "cgi support has been disabled."
+msgstr ""
+
+#. #define CGI_NOT_COMPILED
+#: LYMessages.c:499
+msgid "Lynxcgi capabilities are not compiled into this version."
+msgstr ""
+
+#: LYMessages.c:500
+#, c-format
+msgid "Sorry, no known way of converting %s to %s."
+msgstr ""
+
+#: LYMessages.c:501
+msgid "Unable to set up connection."
+msgstr ""
+
+#: LYMessages.c:502
+msgid "Unable to make connection"
+msgstr ""
+
+#. #define MALFORMED_EXEC_REQUEST
+#: LYMessages.c:504
+msgid "Executable link rejected due to malformed request."
+msgstr ""
+
+#. #define BADCHAR_IN_EXEC_LINK
+#: LYMessages.c:506
+#, c-format
+msgid "Executable link rejected due to `%c' character."
+msgstr ""
+
+#. #define RELPATH_IN_EXEC_LINK
+#: LYMessages.c:508
+msgid "Executable link rejected due to relative path string ('../')."
+msgstr ""
+
+#. #define BADLOCPATH_IN_EXEC_LINK
+#: LYMessages.c:510
+msgid "Executable link rejected due to location or path."
+msgstr ""
+
+#: LYMessages.c:511
+msgid "Mail access is disabled!"
+msgstr ""
+
+#. #define ACCESS_ONLY_LOCALHOST
+#: LYMessages.c:513
+msgid "Only files and servers on the local host can be accessed."
+msgstr ""
+
+#: LYMessages.c:514
+msgid "Telnet access is disabled!"
+msgstr ""
+
+#. #define TELNET_PORT_SPECS_DISABLED
+#: LYMessages.c:516
+msgid "Telnet port specifications are disabled."
+msgstr ""
+
+#: LYMessages.c:517
+msgid "USENET news access is disabled!"
+msgstr ""
+
+#: LYMessages.c:518
+msgid "Rlogin access is disabled!"
+msgstr ""
+
+#: LYMessages.c:519
+msgid "Ftp access is disabled!"
+msgstr ""
+
+#: LYMessages.c:520
+msgid "There are no references from this document."
+msgstr ""
+
+#: LYMessages.c:521
+msgid "There are only hidden links from this document."
+msgstr ""
+
+#: LYMessages.c:523
+msgid "Unable to open command file."
+msgstr ""
+
+#: LYMessages.c:525
+msgid "News Post Cancelled!!!"
+msgstr ""
+
+#. #define SPAWNING_EDITOR_FOR_NEWS
+#: LYMessages.c:527
+msgid "Spawning your selected editor to edit news message"
+msgstr ""
+
+#: LYMessages.c:528
+msgid "Post this message?"
+msgstr ""
+
+#: LYMessages.c:529
+#, c-format
+msgid "Append '%s'?"
+msgstr ""
+
+#: LYMessages.c:530
+msgid "Posting to newsgroup(s)..."
+msgstr ""
+
+#: LYMessages.c:532
+msgid "*** You have unread mail. ***"
+msgstr ""
+
+#: LYMessages.c:534
+msgid "*** You have mail. ***"
+msgstr ""
+
+#: LYMessages.c:536
+msgid "*** You have new mail. ***"
+msgstr ""
+
+#: LYMessages.c:537
+msgid "File insert cancelled!!!"
+msgstr ""
+
+#: LYMessages.c:538
+msgid "Not enough memory for file!"
+msgstr ""
+
+#: LYMessages.c:539
+msgid "Can't open file for reading."
+msgstr ""
+
+#: LYMessages.c:540
+msgid "File does not exist."
+msgstr ""
+
+#: LYMessages.c:541
+msgid "File does not exist - reenter or cancel:"
+msgstr ""
+
+#: LYMessages.c:542
+msgid "File is not readable."
+msgstr ""
+
+#: LYMessages.c:543
+msgid "File is not readable - reenter or cancel:"
+msgstr ""
+
+#: LYMessages.c:544
+msgid "Nothing to insert - file is 0-length."
+msgstr ""
+
+#: LYMessages.c:545
+msgid "Save request cancelled!!!"
+msgstr ""
+
+#: LYMessages.c:546
+msgid "Mail request cancelled!!!"
+msgstr ""
+
+#. #define CONFIRM_MAIL_SOURCE_PREPARSED
+#: LYMessages.c:548
+msgid "Viewing preparsed source. Are you sure you want to mail it?"
+msgstr ""
+
+#: LYMessages.c:549
+msgid "Please wait..."
+msgstr ""
+
+#: LYMessages.c:550
+msgid "Mailing file. Please wait..."
+msgstr ""
+
+#: LYMessages.c:551
+msgid "ERROR - Unable to mail file"
+msgstr ""
+
+#. #define CONFIRM_LONG_SCREEN_PRINT
+#: LYMessages.c:553
+#, c-format
+msgid "File is %d screens long. Are you sure you want to print?"
+msgstr ""
+
+#: LYMessages.c:554
+msgid "Print request cancelled!!!"
+msgstr ""
+
+#: LYMessages.c:555
+msgid "Press <return> to begin: "
+msgstr ""
+
+#: LYMessages.c:556
+msgid "Press <return> to finish: "
+msgstr ""
+
+#. #define CONFIRM_LONG_PAGE_PRINT
+#: LYMessages.c:558
+#, c-format
+msgid "File is %d pages long. Are you sure you want to print?"
+msgstr ""
+
+#. #define CHECK_PRINTER
+#: LYMessages.c:560
+msgid "Be sure your printer is on-line. Press <return> to start printing:"
+msgstr ""
+
+#: LYMessages.c:561
+msgid "ERROR - Unable to allocate file space!!!"
+msgstr ""
+
+#: LYMessages.c:562
+msgid "Unable to open tempfile"
+msgstr ""
+
+#: LYMessages.c:563
+msgid "Unable to open print options file"
+msgstr ""
+
+#: LYMessages.c:564
+msgid "Printing file. Please wait..."
+msgstr ""
+
+#: LYMessages.c:565
+msgid "Please enter a valid internet mail address: "
+msgstr ""
+
+#: LYMessages.c:566
+msgid "ERROR! - printer is misconfigured!"
+msgstr ""
+
+#: LYMessages.c:567
+msgid "Image map from POST response not available!"
+msgstr ""
+
+#: LYMessages.c:568
+msgid "Misdirected client-side image MAP request!"
+msgstr ""
+
+#: LYMessages.c:569
+msgid "Client-side image MAP is not accessible!"
+msgstr ""
+
+#: LYMessages.c:570
+msgid "No client-side image MAPs are available!"
+msgstr ""
+
+#: LYMessages.c:571
+msgid "Client-side image MAP is not available!"
+msgstr ""
+
+#. #define OPTION_SCREEN_NEEDS_24
+#: LYMessages.c:574
+msgid "Screen height must be at least 24 lines for the Options menu!"
+msgstr ""
+
+#. #define OPTION_SCREEN_NEEDS_23
+#: LYMessages.c:576
+msgid "Screen height must be at least 23 lines for the Options menu!"
+msgstr ""
+
+#. #define OPTION_SCREEN_NEEDS_22
+#: LYMessages.c:578
+msgid "Screen height must be at least 22 lines for the Options menu!"
+msgstr ""
+
+#: LYMessages.c:580
+msgid "That key requires Advanced User mode."
+msgstr ""
+
+#: LYMessages.c:581
+#, c-format
+msgid "Content-type: %s"
+msgstr ""
+
+#: LYMessages.c:582
+msgid "Command: "
+msgstr ""
+
+#: LYMessages.c:583
+msgid "Unknown or ambiguous command"
+msgstr ""
+
+#: LYMessages.c:584
+msgid " Version "
+msgstr ""
+
+#: LYMessages.c:585
+msgid " first"
+msgstr ""
+
+#: LYMessages.c:586
+msgid ", guessing..."
+msgstr ""
+
+#: LYMessages.c:587
+msgid "Permissions for "
+msgstr ""
+
+#: LYMessages.c:588
+msgid "Select "
+msgstr ""
+
+#: LYMessages.c:589
+msgid "capital letter"
+msgstr ""
+
+#: LYMessages.c:590
+msgid " of option line,"
+msgstr ""
+
+#: LYMessages.c:591
+msgid " to save,"
+msgstr ""
+
+#: LYMessages.c:592
+msgid " to "
+msgstr ""
+
+#: LYMessages.c:593
+msgid " or "
+msgstr ""
+
+#: LYMessages.c:594
+msgid " index"
+msgstr ""
+
+#: LYMessages.c:595
+msgid " to return to Lynx."
+msgstr ""
+
+#: LYMessages.c:596
+msgid "Accept Changes"
+msgstr ""
+
+#: LYMessages.c:597
+msgid "Reset Changes"
+msgstr ""
+
+#: LYMessages.c:598
+msgid "Left Arrow cancels changes"
+msgstr ""
+
+#: LYMessages.c:599
+msgid "Save options to disk"
+msgstr ""
+
+#: LYMessages.c:600
+msgid "Hit RETURN to accept entered data."
+msgstr ""
+
+#. #define ACCEPT_DATA_OR_DEFAULT
+#: LYMessages.c:602
+msgid "Hit RETURN to accept entered data. Delete data to invoke the default."
+msgstr ""
+
+#: LYMessages.c:603
+msgid "Value accepted!"
+msgstr ""
+
+#. #define VALUE_ACCEPTED_WARNING_X
+#: LYMessages.c:605
+msgid "Value accepted! -- WARNING: Lynx is configured for XWINDOWS!"
+msgstr ""
+
+#. #define VALUE_ACCEPTED_WARNING_NONX
+#: LYMessages.c:607
+msgid "Value accepted! -- WARNING: Lynx is NOT configured for XWINDOWS!"
+msgstr ""
+
+#: LYMessages.c:608
+msgid "You are not allowed to change which editor to use!"
+msgstr ""
+
+#: LYMessages.c:609
+msgid "Failed to set DISPLAY variable!"
+msgstr ""
+
+#: LYMessages.c:610
+msgid "Failed to clear DISPLAY variable!"
+msgstr ""
+
+#. #define BOOKMARK_CHANGE_DISALLOWED
+#: LYMessages.c:612
+msgid "You are not allowed to change the bookmark file!"
+msgstr ""
+
+#: LYMessages.c:613
+msgid "Terminal does not support color"
+msgstr ""
+
+#: LYMessages.c:614
+#, c-format
+msgid "Your '%s' terminal does not support color."
+msgstr ""
+
+#: LYMessages.c:615
+msgid "Access to dot files is disabled!"
+msgstr ""
+
+#. #define UA_NO_LYNX_WARNING
+#: LYMessages.c:617
+msgid "User-Agent string does not contain \"Lynx\" or \"L_y_n_x\""
+msgstr ""
+
+#. #define UA_PLEASE_USE_LYNX
+#: LYMessages.c:619
+msgid ""
+"Use \"L_y_n_x\" or \"Lynx\" in User-Agent, or it looks like intentional "
+"deception!"
+msgstr ""
+
+#. #define UA_CHANGE_DISABLED
+#: LYMessages.c:621
+msgid "Changing of the User-Agent string is disabled!"
+msgstr ""
+
+#. #define CHANGE_OF_SETTING_DISALLOWED
+#: LYMessages.c:623
+msgid "You are not allowed to change this setting."
+msgstr ""
+
+#: LYMessages.c:624
+msgid "Saving Options..."
+msgstr ""
+
+#: LYMessages.c:625
+msgid "Options saved!"
+msgstr ""
+
+#: LYMessages.c:626
+msgid "Unable to save Options!"
+msgstr ""
+
+#: LYMessages.c:627
+msgid " 'r' to return to Lynx "
+msgstr ""
+
+#: LYMessages.c:628
+msgid " '>' to save, or 'r' to return to Lynx "
+msgstr ""
+
+#. #define ANY_KEY_CHANGE_RET_ACCEPT
+#: LYMessages.c:630
+msgid "Hit any key to change value; RETURN to accept."
+msgstr ""
+
+#: LYMessages.c:631
+msgid "Error uncompressing temporary file!"
+msgstr ""
+
+#: LYMessages.c:632
+msgid "Unsupported URL scheme!"
+msgstr ""
+
+#: LYMessages.c:633
+msgid "Unsupported data: URL! Use SHOWINFO, for now."
+msgstr ""
+
+#: LYMessages.c:634
+#, c-format
+msgid "Redirection limit of %d URL's reached."
+msgstr ""
+
+#: LYMessages.c:635
+msgid "Illegal redirection URL received from server!"
+msgstr ""
+
+#. #define SERVER_ASKED_FOR_REDIRECTION
+#: LYMessages.c:637
+#, c-format
+msgid "Server asked for %d redirection of POST content to"
+msgstr ""
+
+#: LYMessages.c:640
+msgid "P)roceed, use G)ET or C)ancel "
+msgstr ""
+
+#: LYMessages.c:641
+msgid "P)roceed, or C)ancel "
+msgstr ""
+
+#. #define ADVANCED_POST_GET_REDIRECT
+#: LYMessages.c:643
+msgid "Redirection of POST content. P)roceed, see U)RL, use G)ET or C)ancel"
+msgstr ""
+
+#. #define ADVANCED_POST_REDIRECT
+#: LYMessages.c:645
+msgid "Redirection of POST content. P)roceed, see U)RL, or C)ancel"
+msgstr ""
+
+#. #define CONFIRM_POST_RESUBMISSION
+#: LYMessages.c:647
+msgid "Document from Form with POST content. Resubmit?"
+msgstr ""
+
+#. #define CONFIRM_POST_RESUBMISSION_TO
+#: LYMessages.c:649
+#, c-format
+msgid "Resubmit POST content to %s ?"
+msgstr ""
+
+#. #define CONFIRM_POST_LIST_RELOAD
+#: LYMessages.c:651
+#, c-format
+msgid "List from document with POST data. Reload %s ?"
+msgstr ""
+
+#. #define CONFIRM_POST_DOC_HEAD
+#: LYMessages.c:653
+msgid "Document from POST action, HEAD may not be understood. Proceed?"
+msgstr ""
+
+#. #define CONFIRM_POST_LINK_HEAD
+#: LYMessages.c:655
+msgid "Form submit action is POST, HEAD may not be understood. Proceed?"
+msgstr ""
+
+#: LYMessages.c:656
+msgid "Proceed without a username and password?"
+msgstr ""
+
+#: LYMessages.c:657
+#, c-format
+msgid "Proceed (%s)?"
+msgstr ""
+
+#: LYMessages.c:658
+msgid "Cannot POST to this host."
+msgstr ""
+
+#: LYMessages.c:659
+msgid "POST not supported for this URL - ignoring POST data!"
+msgstr ""
+
+#: LYMessages.c:660
+msgid "Discarding POST data..."
+msgstr ""
+
+#: LYMessages.c:661
+msgid "Document will not be reloaded!"
+msgstr ""
+
+#: LYMessages.c:662
+msgid "Location: "
+msgstr ""
+
+#: LYMessages.c:663
+#, c-format
+msgid "'%s' not found!"
+msgstr ""
+
+#: LYMessages.c:664
+msgid "Default Bookmark File"
+msgstr ""
+
+#: LYMessages.c:665
+msgid "Screen too small! (8x35 min)"
+msgstr ""
+
+#: LYMessages.c:666
+msgid "Select destination or ^G to Cancel: "
+msgstr ""
+
+#. #define MULTIBOOKMARKS_SELECT
+#: LYMessages.c:668
+msgid "Select subbookmark, '=' for menu, or ^G to cancel: "
+msgstr ""
+
+#. #define MULTIBOOKMARKS_SELF
+#: LYMessages.c:670
+msgid "Reproduce L)ink in this bookmark file or C)ancel? (l,c): "
+msgstr ""
+
+#: LYMessages.c:671
+msgid "Multiple bookmark support is not available."
+msgstr ""
+
+#: LYMessages.c:672
+#, c-format
+msgid " Select Bookmark (screen %d of %d)"
+msgstr ""
+
+#: LYMessages.c:673
+msgid " Select Bookmark"
+msgstr ""
+
+#. #define MULTIBOOKMARKS_EHEAD_MASK
+#: LYMessages.c:675
+#, c-format
+msgid "Editing Bookmark DESCRIPTION and FILEPATH (%d of 2)"
+msgstr ""
+
+#. #define MULTIBOOKMARKS_EHEAD
+#: LYMessages.c:677
+msgid " Editing Bookmark DESCRIPTION and FILEPATH"
+msgstr ""
+
+#: LYMessages.c:678
+msgid "Letter: "
+msgstr ""
+
+#. #define USE_PATH_OFF_HOME
+#: LYMessages.c:681
+msgid "Use a filepath off your login directory in SHELL syntax!"
+msgstr ""
+
+#: LYMessages.c:683
+msgid "Use a filepath off your home directory!"
+msgstr ""
+
+#. #define MAXLINKS_REACHED
+#: LYMessages.c:686
+msgid "Maximum links per page exceeded! Use half-page or two-line scrolling."
+msgstr ""
+
+#: LYMessages.c:687
+msgid "No previously visited links available!"
+msgstr ""
+
+#: LYMessages.c:688
+msgid "Memory exhausted! Program aborted!"
+msgstr ""
+
+#: LYMessages.c:689
+msgid "Memory exhausted! Aborting..."
+msgstr ""
+
+#: LYMessages.c:690
+msgid "Not enough memory!"
+msgstr ""
+
+#: LYMessages.c:691
+msgid "Directory/File Manager not available"
+msgstr ""
+
+#: LYMessages.c:692
+msgid "Location URL is not absolute."
+msgstr ""
+
+#: LYMessages.c:693
+msgid "Refresh URL is not absolute."
+msgstr ""
+
+#. #define SENDING_MESSAGE_WITH_BODY_TO
+#: LYMessages.c:695
+msgid ""
+"You are sending a message with body to:\n"
+" "
+msgstr ""
+
+#: LYMessages.c:696
+msgid ""
+"You are sending a comment to:\n"
+" "
+msgstr ""
+
+#: LYMessages.c:697
+msgid ""
+"\n"
+" With copy to:\n"
+" "
+msgstr ""
+
+#: LYMessages.c:698
+msgid ""
+"\n"
+" With copies to:\n"
+" "
+msgstr ""
+
+#. #define CTRL_G_TO_CANCEL_SEND
+#: LYMessages.c:700
+msgid ""
+"\n"
+"\n"
+"Use Ctrl-G to cancel if you do not want to send a message\n"
+msgstr ""
+
+#. #define ENTER_NAME_OR_BLANK
+#: LYMessages.c:702
+msgid ""
+"\n"
+" Please enter your name, or leave it blank to remain anonymous\n"
+msgstr ""
+
+#. #define ENTER_MAIL_ADDRESS_OR_OTHER
+#: LYMessages.c:704
+msgid ""
+"\n"
+" Please enter a mail address or some other\n"
+msgstr ""
+
+#. #define MEANS_TO_CONTACT_FOR_RESPONSE
+#: LYMessages.c:706
+msgid " means to contact you, if you desire a response.\n"
+msgstr ""
+
+#: LYMessages.c:707
+msgid ""
+"\n"
+" Please enter a subject line.\n"
+msgstr ""
+
+#. #define ENTER_ADDRESS_FOR_CC
+#: LYMessages.c:709
+msgid ""
+"\n"
+" Enter a mail address for a CC of your message.\n"
+msgstr ""
+
+#: LYMessages.c:710
+msgid " (Leave blank if you don't want a copy.)\n"
+msgstr ""
+
+#: LYMessages.c:711
+msgid ""
+"\n"
+" Please review the message body:\n"
+"\n"
+msgstr ""
+
+#: LYMessages.c:712
+msgid ""
+"\n"
+"Press RETURN to continue: "
+msgstr ""
+
+#: LYMessages.c:713
+msgid ""
+"\n"
+"Press RETURN to clean up: "
+msgstr ""
+
+#: LYMessages.c:714
+msgid " Use Control-U to erase the default.\n"
+msgstr ""
+
+#: LYMessages.c:715
+msgid ""
+"\n"
+" Please enter your message below."
+msgstr ""
+
+#. #define ENTER_PERIOD_WHEN_DONE_A
+#: LYMessages.c:717 src/LYNews.c:360
+msgid ""
+"\n"
+" When you are done, press enter and put a single period (.)"
+msgstr ""
+
+#. #define ENTER_PERIOD_WHEN_DONE_B
+#: LYMessages.c:719 src/LYNews.c:361
+msgid ""
+"\n"
+" on a line and press enter again."
+msgstr ""
+
+#. Cookies messages
+#. #define ADVANCED_COOKIE_CONFIRMATION
+#: LYMessages.c:723
+#, c-format
+msgid "%s cookie: %.*s=%.*s Allow? (Y/N/Always/neVer)"
+msgstr ""
+
+#. #define INVALID_COOKIE_DOMAIN_CONFIRMATION
+#: LYMessages.c:725
+#, c-format
+msgid "Accept invalid cookie domain=%s for '%s'?"
+msgstr ""
+
+#. #define INVALID_COOKIE_PATH_CONFIRMATION
+#: LYMessages.c:727
+#, c-format
+msgid "Accept invalid cookie path=%s as a prefix of '%s'?"
+msgstr ""
+
+#: LYMessages.c:728
+msgid "Allowing this cookie."
+msgstr ""
+
+#: LYMessages.c:729
+msgid "Rejecting this cookie."
+msgstr ""
+
+#: LYMessages.c:730
+msgid "The Cookie Jar is empty."
+msgstr ""
+
+#: LYMessages.c:731
+msgid "The Cache Jar is empty."
+msgstr ""
+
+#. #define ACTIVATE_TO_GOBBLE
+#: LYMessages.c:733
+msgid "Activate links to gobble up cookies or entire domains,"
+msgstr ""
+
+#: LYMessages.c:734
+msgid "or to change a domain's 'allow' setting."
+msgstr ""
+
+#: LYMessages.c:735
+msgid "(Cookies never allowed.)"
+msgstr ""
+
+#: LYMessages.c:736
+msgid "(Cookies always allowed.)"
+msgstr ""
+
+#: LYMessages.c:737
+msgid "(Cookies allowed via prompt.)"
+msgstr ""
+
+#: LYMessages.c:738
+msgid "(Persistent Cookies.)"
+msgstr ""
+
+#: LYMessages.c:739
+msgid "(No title.)"
+msgstr ""
+
+#: LYMessages.c:740
+msgid "(No name.)"
+msgstr ""
+
+#: LYMessages.c:741
+msgid "(No value.)"
+msgstr ""
+
+#: LYMessages.c:742 src/LYOptions.c:2482
+msgid "None"
+msgstr ""
+
+#: LYMessages.c:743
+msgid "(End of session.)"
+msgstr ""
+
+#: LYMessages.c:744
+msgid "Delete this cookie?"
+msgstr ""
+
+#: LYMessages.c:745
+msgid "The cookie has been eaten!"
+msgstr ""
+
+#: LYMessages.c:746
+msgid "Delete this empty domain?"
+msgstr ""
+
+#: LYMessages.c:747
+msgid "The domain has been eaten!"
+msgstr ""
+
+#. #define DELETE_COOKIES_SET_ALLOW_OR_CANCEL
+#: LYMessages.c:749
+msgid ""
+"D)elete domain's cookies, set allow A)lways/P)rompt/neV)er, or C)ancel? "
+msgstr ""
+
+#. #define DELETE_DOMAIN_SET_ALLOW_OR_CANCEL
+#: LYMessages.c:751
+msgid "D)elete domain, set allow A)lways/P)rompt/neV)er, or C)ancel? "
+msgstr ""
+
+#: LYMessages.c:752
+msgid "All cookies in the domain have been eaten!"
+msgstr ""
+
+#: LYMessages.c:753
+#, c-format
+msgid "'A'lways allowing from domain '%s'."
+msgstr ""
+
+#: LYMessages.c:754
+#, c-format
+msgid "ne'V'er allowing from domain '%s'."
+msgstr ""
+
+#: LYMessages.c:755
+#, c-format
+msgid "'P'rompting to allow from domain '%s'."
+msgstr ""
+
+#: LYMessages.c:756
+msgid "Delete all cookies in this domain?"
+msgstr ""
+
+#: LYMessages.c:757
+msgid "All of the cookies in the jar have been eaten!"
+msgstr ""
+
+#: LYMessages.c:759
+msgid "Port 19 not permitted in URLs."
+msgstr ""
+
+#: LYMessages.c:760
+msgid "Port 25 not permitted in URLs."
+msgstr ""
+
+#: LYMessages.c:761
+#, c-format
+msgid "Port %lu not permitted in URLs."
+msgstr ""
+
+#: LYMessages.c:762
+msgid "URL has a bad port field."
+msgstr ""
+
+#: LYMessages.c:763
+msgid "Maximum nesting of HTML elements exceeded."
+msgstr ""
+
+#: LYMessages.c:764
+msgid "Bad partial reference! Stripping lead dots."
+msgstr ""
+
+#: LYMessages.c:765
+msgid "Trace Log open failed. Trace off!"
+msgstr ""
+
+#: LYMessages.c:766
+msgid "Lynx Trace Log"
+msgstr ""
+
+#: LYMessages.c:767
+msgid "No trace log has been started for this session."
+msgstr ""
+
+#. #define MAX_TEMPCOUNT_REACHED
+#: LYMessages.c:769
+msgid "The maximum temporary file count has been reached!"
+msgstr ""
+
+#. #define FORM_VALUE_TOO_LONG
+#: LYMessages.c:771
+msgid "Form field value exceeds buffer length! Trim the tail."
+msgstr ""
+
+#. #define FORM_TAIL_COMBINED_WITH_HEAD
+#: LYMessages.c:773
+msgid "Modified tail combined with head of form field value."
+msgstr ""
+
+#. HTFile.c
+#: LYMessages.c:776
+msgid "Directory"
+msgstr ""
+
+#: LYMessages.c:777
+msgid "Directory browsing is not allowed."
+msgstr ""
+
+#: LYMessages.c:778
+msgid "Selective access is not enabled for this directory"
+msgstr ""
+
+#: LYMessages.c:779
+msgid "Multiformat: directory scan failed."
+msgstr ""
+
+#: LYMessages.c:780
+msgid "This directory is not readable."
+msgstr ""
+
+#: LYMessages.c:781
+msgid "Can't access requested file."
+msgstr ""
+
+#: LYMessages.c:782
+msgid "Could not find suitable representation for transmission."
+msgstr ""
+
+#: LYMessages.c:783
+msgid "Could not open file for decompression!"
+msgstr ""
+
+#: LYMessages.c:784
+msgid "Files:"
+msgstr ""
+
+#: LYMessages.c:785
+msgid "Subdirectories:"
+msgstr ""
+
+#: LYMessages.c:786
+msgid " directory"
+msgstr ""
+
+#: LYMessages.c:787
+msgid "Up to "
+msgstr ""
+
+#: LYMessages.c:788
+msgid "Current directory is "
+msgstr ""
+
+#. HTFTP.c
+#: LYMessages.c:791
+msgid "Symbolic Link"
+msgstr ""
+
+#. HTGopher.c
+#: LYMessages.c:794
+msgid "No response from server!"
+msgstr ""
+
+#: LYMessages.c:795
+msgid "CSO index"
+msgstr ""
+
+#: LYMessages.c:796
+msgid ""
+"\n"
+"This is a searchable index of a CSO database.\n"
+msgstr ""
+
+#: LYMessages.c:797
+msgid "CSO Search Results"
+msgstr ""
+
+#: LYMessages.c:798
+#, c-format
+msgid "Seek fail on %s\n"
+msgstr ""
+
+#: LYMessages.c:799
+msgid ""
+"\n"
+"Press the 's' key and enter search keywords.\n"
+msgstr ""
+
+#: LYMessages.c:800
+msgid ""
+"\n"
+"This is a searchable Gopher index.\n"
+msgstr ""
+
+#: LYMessages.c:801
+msgid "Gopher index"
+msgstr ""
+
+#: LYMessages.c:802
+msgid "Gopher Menu"
+msgstr ""
+
+#: LYMessages.c:803
+msgid " Search Results"
+msgstr ""
+
+#: LYMessages.c:804
+msgid "Sending CSO/PH request."
+msgstr ""
+
+#: LYMessages.c:805
+msgid "Sending Gopher request."
+msgstr ""
+
+#: LYMessages.c:806
+msgid "CSO/PH request sent; waiting for response."
+msgstr ""
+
+#: LYMessages.c:807
+msgid "Gopher request sent; waiting for response."
+msgstr ""
+
+#: LYMessages.c:808
+msgid ""
+"\n"
+"Please enter search keywords.\n"
+msgstr ""
+
+#: LYMessages.c:809
+msgid ""
+"\n"
+"The keywords that you enter will allow you to search on a"
+msgstr ""
+
+#: LYMessages.c:810
+msgid " person's name in the database.\n"
+msgstr ""
+
+#. HTNews.c
+#: LYMessages.c:813
+msgid "Connection closed ???"
+msgstr ""
+
+#: LYMessages.c:814
+msgid "Cannot open temporary file for news POST."
+msgstr ""
+
+#: LYMessages.c:815
+msgid "This client does not contain support for posting to news with SSL."
+msgstr ""
+
+#. HTStyle.c
+#: LYMessages.c:818
+#, c-format
+msgid "Style %d `%s' SGML:%s. Font %s %.1f point.\n"
+msgstr ""
+
+#: LYMessages.c:820
+#, c-format
+msgid "\tAlign=%d, %d tabs. (%.0f before, %.0f after)\n"
+msgstr ""
+
+#: LYMessages.c:821
+#, c-format
+msgid "\t\tTab kind=%d at %.0f\n"
+msgstr ""
+
+#. HTTP.c
+#: LYMessages.c:824
+msgid "Can't proceed without a username and password."
+msgstr ""
+
+#: LYMessages.c:825
+msgid "Can't retry with authorization! Contact the server's WebMaster."
+msgstr ""
+
+#: LYMessages.c:826
+msgid "Can't retry with proxy authorization! Contact the server's WebMaster."
+msgstr ""
+
+#: LYMessages.c:827
+msgid "Retrying with proxy authorization information."
+msgstr ""
+
+#: LYMessages.c:828
+#, c-format
+msgid "SSL error:%s-Continue?"
+msgstr ""
+
+#. HTWAIS.c
+#: LYMessages.c:831
+msgid "HTWAIS: Return message too large."
+msgstr ""
+
+#: LYMessages.c:832
+msgid "Enter WAIS query: "
+msgstr ""
+
+#. Miscellaneous status
+#: LYMessages.c:835
+msgid "Retrying as HTTP0 request."
+msgstr ""
+
+#: LYMessages.c:836
+#, c-format
+msgid "Transferred %d bytes"
+msgstr ""
+
+#: LYMessages.c:837
+msgid "Data transfer complete"
+msgstr ""
+
+#: LYMessages.c:838
+#, c-format
+msgid "Error processing line %d of %s\n"
+msgstr ""
+
+#. Lynx internal page titles
+#: LYMessages.c:841
+msgid "Address List Page"
+msgstr ""
+
+#: LYMessages.c:842
+msgid "Bookmark file"
+msgstr ""
+
+#: LYMessages.c:843
+msgid "Configuration Definitions"
+msgstr ""
+
+#: LYMessages.c:844
+msgid "Cookie Jar"
+msgstr ""
+
+#: LYMessages.c:845
+msgid "Current Edit-Key Map"
+msgstr ""
+
+#: LYMessages.c:846
+msgid "Current Key Map"
+msgstr ""
+
+#: LYMessages.c:847
+msgid "File Management Options"
+msgstr ""
+
+#: LYMessages.c:848
+msgid "Download Options"
+msgstr ""
+
+#: LYMessages.c:849
+msgid "History Page"
+msgstr ""
+
+#: LYMessages.c:850
+msgid "Cache Jar"
+msgstr ""
+
+#: LYMessages.c:851
+msgid "List Page"
+msgstr ""
+
+#: LYMessages.c:852
+msgid "Lynx.cfg Information"
+msgstr ""
+
+#: LYMessages.c:853
+msgid "Converted Mosaic Hotlist"
+msgstr ""
+
+#: LYMessages.c:854
+msgid "Options Menu"
+msgstr ""
+
+#: LYMessages.c:855
+msgid "File Permission Options"
+msgstr ""
+
+#: LYMessages.c:856
+msgid "Printing Options"
+msgstr ""
+
+#: LYMessages.c:857
+msgid "Information about the current document"
+msgstr ""
+
+#: LYMessages.c:858
+msgid "Your recent statusline messages"
+msgstr ""
+
+#: LYMessages.c:859
+msgid "Upload Options"
+msgstr ""
+
+#: LYMessages.c:860
+msgid "Visited Links Page"
+msgstr ""
+
+#. CONFIG_DEF_TITLE subtitles
+#: LYMessages.c:863
+msgid "See also"
+msgstr ""
+
+#: LYMessages.c:864
+msgid "your"
+msgstr ""
+
+#: LYMessages.c:865
+msgid "for runtime options"
+msgstr ""
+
+#: LYMessages.c:866
+msgid "compile time options"
+msgstr ""
+
+#: LYMessages.c:867
+msgid "color-style configuration"
+msgstr ""
+
+#: LYMessages.c:868
+msgid "latest release"
+msgstr ""
+
+#: LYMessages.c:869
+msgid "pre-release version"
+msgstr ""
+
+#: LYMessages.c:870
+msgid "development version"
+msgstr ""
+
+#. #define AUTOCONF_CONFIG_CACHE
+#: LYMessages.c:872
+msgid ""
+"The following data were derived during the automatic configuration/build\n"
+"process of this copy of Lynx. When reporting a bug, please include a copy\n"
+"of this page."
+msgstr ""
+
+#. #define AUTOCONF_LYNXCFG_H
+#: LYMessages.c:876
+msgid ""
+"The following data were used as automatically-configured compile-time\n"
+"definitions when this copy of Lynx was built."
+msgstr ""
+
+#. #define DIRED_NOVICELINE
+#: LYMessages.c:881
+msgid ""
+" C)reate D)ownload E)dit F)ull menu M)odify R)emove T)ag "
+"U)pload \n"
+msgstr ""
+
+#: LYMessages.c:882
+msgid "Failed to obtain status of current link!"
+msgstr ""
+
+#. #define INVALID_PERMIT_URL
+#: LYMessages.c:885
+msgid "Special URL only valid from current File Permission menu!"
+msgstr ""
+
+#: LYMessages.c:889
+msgid "External support is currently disabled."
+msgstr ""
+
+#. new with 2.8.4dev.21
+#: LYMessages.c:893
+msgid "Changing working-directory is currently disabled."
+msgstr ""
+
+#: LYMessages.c:894
+msgid "Linewrap OFF!"
+msgstr ""
+
+#: LYMessages.c:895
+msgid "Linewrap ON!"
+msgstr ""
+
+#: LYMessages.c:896
+msgid "Parsing nested-tables toggled OFF! Reloading..."
+msgstr ""
+
+#: LYMessages.c:897
+msgid "Parsing nested-tables toggled ON! Reloading..."
+msgstr ""
+
+#: LYMessages.c:898
+msgid "Shifting is disabled while line-wrap is in effect"
+msgstr ""
+
+#: LYMessages.c:899
+msgid "Trace not supported"
+msgstr ""
+
+#: LYMessages.c:819
+#, c-format
+msgid "\tIndents: first=%.0f others=%.0f, Height=%.1f Desc=%.1f\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAABrow.c:575
+#, c-format
+msgid "username for realm %s changed from %s to %s"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAABrow.c:591
+#, c-format
+msgid "password for realm %s user %s changed"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAABrow.c:703
+#, c-format
+msgid "Username for '%s' at %s '%s%s':"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAABrow.c:976
+msgid ""
+"This client doesn't know how to compose proxy authorization information for "
+"scheme"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAABrow.c:1053
+msgid ""
+"This client doesn't know how to compose authorization information for scheme"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAABrow.c:1162
+#, c-format
+msgid "Invalid header '%s%s%s%s%s'"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAABrow.c:1266
+msgid "Proxy authorization required -- retrying"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAABrow.c:1322
+msgid "Access without authorization denied -- retrying"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAccess.c:698
+msgid "Access forbidden by rule"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAccess.c:800
+msgid "Document with POST content not found in cache. Resubmit?"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAccess.c:953
+msgid "Loading failed, use a previous copy."
+msgstr ""
+
+#: WWW/Library/Implementation/HTAccess.c:1062 src/GridText.c:8939
+msgid "Loading incomplete."
+msgstr ""
+
+#: WWW/Library/Implementation/HTAccess.c:1093
+#, c-format
+msgid ""
+"**** HTAccess: socket or file number returned by obsolete load routine!\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAccess.c:1095
+#, c-format
+msgid ""
+"**** HTAccess: Internal software error. Please mail lynx-dev@nongnu.org!\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAccess.c:1096
+#, c-format
+msgid "**** HTAccess: Status returned was: %d\n"
+msgstr ""
+
+#.
+#. * hack: if we fail in HTAccess.c
+#. * avoid duplicating URL, oh.
+#.
+#: WWW/Library/Implementation/HTAccess.c:1102 src/LYMainLoop.c:8076
+msgid "Can't Access"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAccess.c:1110
+msgid "Unable to access document."
+msgstr ""
+
+#: WWW/Library/Implementation/HTFTP.c:870
+#, c-format
+msgid "Enter password for user %s@%s:"
+msgstr ""
+
+#: WWW/Library/Implementation/HTFTP.c:898
+msgid "Unable to connect to FTP host."
+msgstr ""
+
+#: WWW/Library/Implementation/HTFTP.c:1137
+msgid "close master socket"
+msgstr ""
+
+#: WWW/Library/Implementation/HTFTP.c:1195
+msgid "socket for master socket"
+msgstr ""
+
+#: WWW/Library/Implementation/HTFTP.c:2925
+msgid "Receiving FTP directory."
+msgstr ""
+
+#: WWW/Library/Implementation/HTFTP.c:3063
+#, c-format
+msgid "Transferred %d bytes (%5d)"
+msgstr ""
+
+#: WWW/Library/Implementation/HTFTP.c:3421
+msgid "connect for data"
+msgstr ""
+
+#: WWW/Library/Implementation/HTFTP.c:4098
+msgid "Receiving FTP file."
+msgstr ""
+
+#: WWW/Library/Implementation/HTFinger.c:274
+msgid "Could not set up finger connection."
+msgstr ""
+
+#: WWW/Library/Implementation/HTFinger.c:321
+msgid "Could not load data (no sitename in finger URL)"
+msgstr ""
+
+#: WWW/Library/Implementation/HTFinger.c:325
+msgid "Invalid port number - will only use port 79!"
+msgstr ""
+
+#: WWW/Library/Implementation/HTFinger.c:391
+msgid "Could not access finger host."
+msgstr ""
+
+#: WWW/Library/Implementation/HTFinger.c:399
+msgid "No response from finger server."
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:439
+#, c-format
+msgid "Username for news host '%s':"
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:492
+msgid "Change username?"
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:496
+msgid "Username:"
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:521
+#, c-format
+msgid "Password for news host '%s':"
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:604
+msgid "Change password?"
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:1725
+#, c-format
+msgid "No matches for: %s"
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:1775
+msgid ""
+"\n"
+"No articles in this group.\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:1787
+msgid ""
+"\n"
+"No articles in this range.\n"
+msgstr ""
+
+#.
+#. * Set window title.
+#.
+#: WWW/Library/Implementation/HTNews.c:1800
+#, c-format
+msgid "%s, Articles %d-%d"
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:1823
+msgid "Earlier articles"
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:1836
+#, c-format
+msgid ""
+"\n"
+"There are about %d articles currently available in %s, IDs as follows:\n"
+"\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:1898
+msgid "All available articles in "
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:2112
+msgid "Later articles"
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:2135
+msgid "Post to "
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:2356
+msgid "This client does not contain support for SNEWS URLs."
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:2565
+msgid "No target for raw text!"
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:2595
+msgid "Connecting to NewsHost ..."
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:2647
+#, c-format
+msgid "Could not access %s."
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:2753
+#, c-format
+msgid "Can't read news info. News host %.20s responded: %.200s"
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:2757
+#, c-format
+msgid "Can't read news info, empty response from host %s"
+msgstr ""
+
+#.
+#. * List available newsgroups. - FM
+#.
+#: WWW/Library/Implementation/HTNews.c:2961
+msgid "Reading list of available newsgroups."
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:2982
+msgid "Reading list of articles in newsgroup."
+msgstr ""
+
+#.
+#. * Get an article from a news group. - FM
+#.
+#: WWW/Library/Implementation/HTNews.c:2988
+msgid "Reading news article."
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:3018
+msgid "Sorry, could not load requested news."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:1339
+msgid "Address has invalid port"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:1410
+msgid "Address length looks invalid"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:1868
+msgid "SOCKS5: no hostname found."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:1874
+msgid "SOCKS5: hostname too long."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:1892
+#, c-format
+msgid "(for %s at %s) SOCKS5"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:1919
+#: WWW/Library/Implementation/HTTCP.c:1936
+#, c-format
+msgid "Unable to locate remote host %s."
+msgstr ""
+
+#. Not HTProgress, so warning won't be overwritten immediately;
+#. * but not HTAlert, because typically there will be other
+#. * alerts from the callers. - kw
+#.
+#: WWW/Library/Implementation/HTTCP.c:1933
+#: WWW/Library/Implementation/HTTelnet.c:115
+#, c-format
+msgid "Invalid hostname %s"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:1945
+#, c-format
+msgid "Making %s connection to %s"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:1955
+msgid "socket failed."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:1969
+#, c-format
+msgid "socket failed: family %d addr %s port %s."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:1992
+msgid "Could not make connection non-blocking."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:2058
+msgid "Connection failed (too many retries)."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:2253
+msgid "Could not restore socket to blocking."
+msgstr ""
+
+#. RFC 1928: CONNECT request
+#: WWW/Library/Implementation/HTTCP.c:2285
+#, c-format
+msgid "SOCKS5: connecting to %s"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:2314
+msgid "SOCKS server failure"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:2317
+msgid "connection not allowed by ruleset"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:2320
+msgid "network unreachable"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:2323
+msgid "host unreachable"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:2326
+msgid "connection refused"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:2329
+msgid "TTL expired"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:2332
+msgid "command not supported"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:2335
+msgid "address type not supported"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:2338
+msgid "unknown SOCKS error code"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:2383
+msgid "unexpected reply\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:2460
+msgid "Socket read failed (too many tries)."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:165
+#, c-format
+msgid "SSL callback:%s, preverify_ok=%d, ssl_okay=%d"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:668
+#, c-format
+msgid "User/password contains only punctuation: %s"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:672
+#, c-format
+msgid "User/password may be confused with hostname: '%s' (e.g, '%s')"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:733
+#, c-format
+msgid "Certificate issued by: %s"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:922
+msgid "This client does not contain support for HTTPS URLs."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:947
+msgid "Unable to connect to remote host."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:990
+msgid "Retrying connection without TLS."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:1042
+msgid "GnuTLS error when trying to verify certificate."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:1055
+msgid "the certificate has no known issuer"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:1057
+msgid "no issuer was found"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:1059
+msgid "issuer is not a CA"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:1061
+msgid "the certificate has been revoked"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:1063
+msgid "the certificate is not trusted"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:1138
+#, c-format
+msgid "Verified connection to %s (cert=%s)"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:1188
+#: WWW/Library/Implementation/HTTP.c:1230
+#, c-format
+msgid "Verified connection to %s (subj=%s)"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:1260
+msgid "Can't find common name in certificate"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:1263
+#, c-format
+msgid "SSL error:host(%s)!=cert(%s)-Continue?"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:1270
+msgid "SSL error"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:1278
+#, c-format
+msgid "UNVERIFIED connection to %s (cert=%s)"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:1287
+#, c-format
+msgid "Secure %d-bit %s (%s) HTTP connection"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:1757
+msgid "Sending HTTP request."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:1799
+msgid "Unexpected network write error; connection aborted."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:1805
+msgid "HTTP request sent; waiting for response."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:1878
+#: WWW/Library/Implementation/HTTP.c:1888
+msgid "Unexpected network read error; connection aborted."
+msgstr ""
+
+#.
+#. * HTTP/1.1 Informational statuses.
+#. * 100 Continue.
+#. * 101 Switching Protocols.
+#. * > 101 is unknown.
+#. * We should never get these, and they have only the status
+#. * line and possibly other headers, so we'll deal with them by
+#. * showing the full header to the user as text/plain. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2091
+msgid "Got unexpected Informational Status."
+msgstr ""
+
+#.
+#. * Reset Content. The server has fulfilled the request but
+#. * nothing is returned and we should reset any form
+#. * content. We'll instruct the user to do that, and
+#. * restore the current document. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2125
+msgid "Request fulfilled. Reset Content."
+msgstr ""
+
+#. Not Modified
+#.
+#. * We didn't send an "If-Modified-Since" header, so this
+#. * status is inappropriate. We'll deal with it by showing
+#. * the full header to the user as text/plain. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2242
+msgid "Got unexpected 304 Not Modified status."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:2305
+msgid "Redirection of POST content requires user approval."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:2320
+msgid "Have POST content. Treating Permanent Redirection as Temporary.\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:2366
+msgid "Retrying with access authorization information."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:2378
+msgid "Show the 401 message body?"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:2422
+msgid "Show the 407 message body?"
+msgstr ""
+
+#.
+#. * Bad or unknown server_status number. Take a chance and hope
+#. * there is something to display. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2522
+msgid "Unknown status reply from server!"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTelnet.c:113
+#, c-format
+msgid "remote %s session:"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:163
+msgid "Could not connect to WAIS server."
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:171
+msgid "Could not open WAIS connection for reading."
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:193
+msgid "Diagnostic code is "
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:460
+msgid "Index "
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:464
+#, c-format
+msgid " contains the following %d item%s relevant to \""
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:472
+msgid "The first figure after each entry is its relative score, "
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:473
+msgid "the second is the number of lines in the item."
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:515
+msgid " (bad file name)"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:541
+msgid "(bad doc id)"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:557
+msgid "(Short Header record, can't display)"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:564
+msgid ""
+"\n"
+"Long Header record, can't display\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:571
+msgid ""
+"\n"
+"Text record\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:580
+msgid ""
+"\n"
+"Headline record, can't display\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:588
+msgid ""
+"\n"
+"Code record, can't display\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:692
+msgid "Syntax error in WAIS URL"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:764
+msgid " (WAIS Index)"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:771
+msgid "WAIS Index: "
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:777
+msgid "This is a link for searching the "
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:781
+msgid " WAIS Index.\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:810
+msgid ""
+"\n"
+"Enter the 's'earch command and then specify search words.\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:832
+msgid " (in "
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:841
+msgid "WAIS Search of \""
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:845
+msgid "\" in: "
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:860
+msgid "HTWAIS: Request too large."
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:869
+msgid "Searching WAIS database..."
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:879
+msgid "Search interrupted."
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:930
+msgid "Can't convert format of WAIS document"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:974
+msgid "HTWAIS: Request too long."
+msgstr ""
+
+#.
+#. * Actually do the transaction given by request_message.
+#.
+#: WWW/Library/Implementation/HTWAIS.c:988
+msgid "Fetching WAIS document..."
+msgstr ""
+
+#. display_search_response(target, retrieval_response,
+#. wais_database, keywords);
+#: WWW/Library/Implementation/HTWAIS.c:1027
+msgid "No text was returned!\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWSRC.c:302
+msgid " NOT GIVEN in source file; "
+msgstr ""
+
+#: WWW/Library/Implementation/HTWSRC.c:325
+msgid " WAIS source file"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWSRC.c:332
+msgid " description"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWSRC.c:342
+msgid "Access links"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWSRC.c:363
+msgid "Direct access"
+msgstr ""
+
+#. * Proxy will be used if defined, so let user know that - FM *
+#: WWW/Library/Implementation/HTWSRC.c:366
+msgid " (or via proxy server, if defined)"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWSRC.c:381
+msgid "Maintainer"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWSRC.c:389
+msgid "Host"
+msgstr ""
+
+#: src/GridText.c:723
+msgid "Memory exhausted, display interrupted!"
+msgstr ""
+
+#: src/GridText.c:728
+msgid "Memory exhausted, will interrupt transfer!"
+msgstr ""
+
+#: src/GridText.c:1719
+#, c-format
+msgid " (l%d of %d)"
+msgstr ""
+
+#: src/GridText.c:1728
+#, c-format
+msgid " (p%d of %d)"
+msgstr ""
+
+#: src/GridText.c:3720
+msgid " *** MEMORY EXHAUSTED ***"
+msgstr ""
+
+#: src/GridText.c:6220
+msgid "text entry field"
+msgstr ""
+
+#: src/GridText.c:6223
+msgid "password entry field"
+msgstr ""
+
+#: src/GridText.c:6226
+msgid "checkbox"
+msgstr ""
+
+#: src/GridText.c:6229
+msgid "radio button"
+msgstr ""
+
+#: src/GridText.c:6232
+msgid "submit button"
+msgstr ""
+
+#: src/GridText.c:6235
+msgid "reset button"
+msgstr ""
+
+#: src/GridText.c:6238
+msgid "script button"
+msgstr ""
+
+#: src/GridText.c:6241
+msgid "popup menu"
+msgstr ""
+
+#: src/GridText.c:6244
+msgid "hidden form field"
+msgstr ""
+
+#: src/GridText.c:6247
+msgid "text entry area"
+msgstr ""
+
+#: src/GridText.c:6250
+msgid "range entry field"
+msgstr ""
+
+#: src/GridText.c:6253
+msgid "file entry field"
+msgstr ""
+
+#: src/GridText.c:6256
+msgid "text-submit field"
+msgstr ""
+
+#: src/GridText.c:6259
+msgid "image-submit button"
+msgstr ""
+
+#: src/GridText.c:6262
+msgid "keygen field"
+msgstr ""
+
+#: src/GridText.c:6265
+msgid "unknown form field"
+msgstr ""
+
+#: src/GridText.c:6285 src/GridText.c:6292 src/LYList.c:249
+msgid "unknown field or link"
+msgstr ""
+
+#: src/GridText.c:10722
+msgid "Can't open file for uploading"
+msgstr ""
+
+#: src/GridText.c:11910
+#, c-format
+msgid "Submitting %s"
+msgstr ""
+
+#. ugliness has happened; inform user and do the best we can
+#: src/GridText.c:12980
+msgid "Hang Detect: TextAnchor struct corrupted - suggest aborting!"
+msgstr ""
+
+#. don't show previous state
+#: src/GridText.c:13139
+msgid "Wrap lines to fit displayed area?"
+msgstr ""
+
+#: src/GridText.c:13772
+msgid "Very long lines have been truncated!"
+msgstr ""
+
+#: src/HTAlert.c:164 src/LYShowInfo.c:389 src/LYShowInfo.c:393
+msgid "bytes"
+msgstr ""
+
+#.
+#. * If we know the total size of the file, we can compute
+#. * a percentage, and show a corresponding progress bar.
+#.
+#: src/HTAlert.c:328 src/HTAlert.c:354
+#, c-format
+msgid "Read %s of data"
+msgstr ""
+
+#: src/HTAlert.c:351
+#, c-format
+msgid "Read %s of %s of data"
+msgstr ""
+
+#: src/HTAlert.c:360
+#, c-format
+msgid ", %s/sec"
+msgstr ""
+
+#: src/HTAlert.c:374
+#, c-format
+msgid " (stalled for %s)"
+msgstr ""
+
+#: src/HTAlert.c:378
+#, c-format
+msgid ", ETA %s"
+msgstr ""
+
+#: src/HTAlert.c:400
+msgid " (Press 'z' to abort)"
+msgstr ""
+
+#. Meta-note: don't move the following note from its place right
+#. in front of the first gettext(). As it is now, it should
+#. automatically appear in generated lynx.pot files. - kw
+#.
+#. NOTE TO TRANSLATORS: If you provide a translation for "yes", lynx
+#. * will take the first byte of the translation as a positive response
+#. * to Yes/No questions. If you provide a translation for "no", lynx
+#. * will take the first byte of the translation as a negative response
+#. * to Yes/No questions. For both, lynx will also try to show the
+#. * first byte in the prompt as a character, instead of (y) or (n),
+#. * respectively. This will not work right for multibyte charsets!
+#. * Don't translate "yes" and "no" for CJK character sets (or translate
+#. * them to "yes" and "no"). For a translation using UTF-8, don't
+#. * translate if the translation would begin with anything but a 7-bit
+#. * (US_ASCII) character. That also means do not translate if the
+#. * translation would begin with anything but a 7-bit character, if
+#. * you use a single-byte character encoding (a charset like ISO-8859-n)
+#. * but anticipate that the message catalog may be used re-encoded in
+#. * UTF-8 form.
+#. * For translations using other character sets, you may also wish to
+#. * leave "yes" and "no" untranslated, if using (y) and (n) is the
+#. * preferred behavior.
+#. * Lynx will also accept y Y n N as responses unless there is a conflict
+#. * with the first letter of the "yes" or "no" translation.
+#.
+#: src/HTAlert.c:438 src/HTAlert.c:486
+msgid "yes"
+msgstr ""
+
+#: src/HTAlert.c:441 src/HTAlert.c:487
+msgid "no"
+msgstr ""
+
+#.
+#. * Special-purpose workaround for gettext support (we should do
+#. * this in a more general way) -TD
+#. *
+#. * NOTE TO TRANSLATORS: If the prompt has been rendered into
+#. * another language, and if yes/no are distinct, assume the
+#. * translator can make an ordered list in parentheses with one
+#. * capital letter for each as we assumed in HTConfirmDefault().
+#. * The list has to be in the same order as in the original message,
+#. * and the four capital letters chosen to not match those in the
+#. * original unless they have the same position.
+#. *
+#. * Example:
+#. * (Y/N/Always/neVer) - English (original)
+#. * (O/N/Toujours/Jamais) - French
+#.
+#: src/HTAlert.c:938
+msgid "Y/N/A/V"
+msgstr ""
+
+#: src/HTML.c:5769
+msgid "Description:"
+msgstr ""
+
+#: src/HTML.c:5774
+msgid "(none)"
+msgstr ""
+
+#: src/HTML.c:5778
+msgid "Filepath:"
+msgstr ""
+
+#: src/HTML.c:5784
+msgid "(unknown)"
+msgstr ""
+
+#: src/HTML.c:7224
+msgid "Document has only hidden links. Use the 'l'ist command."
+msgstr ""
+
+#: src/HTML.c:7725
+msgid "Source cache error - disk full?"
+msgstr ""
+
+#: src/HTML.c:7738
+msgid "Source cache error - not enough memory!"
+msgstr ""
+
+#: src/LYBookmark.c:167
+msgid ""
+" This file is an HTML representation of the X Mosaic hotlist file.\n"
+" Outdated or invalid links may be removed by using the\n"
+" remove bookmark command, it is usually the 'R' key but may have\n"
+" been remapped by you or your system administrator."
+msgstr ""
+
+#: src/LYBookmark.c:380
+#, c-format
+msgid ""
+" You can delete links by the 'R' key<br>\n"
+"<ol>\n"
+msgstr ""
+
+#: src/LYBookmark.c:383
+msgid ""
+" You can delete links using the remove bookmark command. It is usually\n"
+" the 'R' key but may have been remapped by you or your system\n"
+" administrator."
+msgstr ""
+
+#: src/LYBookmark.c:387
+msgid ""
+" This file also may be edited with a standard text editor to delete\n"
+" outdated or invalid links, or to change their order."
+msgstr ""
+
+#: src/LYBookmark.c:390
+msgid ""
+"Note: if you edit this file manually\n"
+" you should not change the format within the lines\n"
+" or add other HTML markup.\n"
+" Make sure any bookmark link is saved as a single line."
+msgstr ""
+
+#: src/LYBookmark.c:686
+#, c-format
+msgid "File may be recoverable from %s during this session"
+msgstr ""
+
+#: src/LYCgi.c:161
+#, c-format
+msgid "Do you want to execute \"%s\"?"
+msgstr ""
+
+#.
+#. * Neither the path as given nor any components examined by backing up
+#. * were stat()able. - kw
+#.
+#: src/LYCgi.c:276
+msgid "Unable to access cgi script"
+msgstr ""
+
+#: src/LYCgi.c:709 src/LYCgi.c:712
+msgid "Good Advice"
+msgstr ""
+
+#: src/LYCgi.c:716
+msgid "An excellent http server for VMS is available via"
+msgstr ""
+
+#: src/LYCgi.c:723
+msgid "this link"
+msgstr ""
+
+#: src/LYCgi.c:727
+msgid "It provides state of the art CGI script support.\n"
+msgstr ""
+
+#: src/LYClean.c:115
+msgid "Exiting via interrupt:"
+msgstr ""
+
+#: src/LYCookie.c:2651
+msgid "(from a previous session)"
+msgstr ""
+
+#: src/LYCookie.c:2712
+msgid "Maximum Gobble Date:"
+msgstr ""
+
+#: src/LYCookie.c:2751
+msgid "Internal"
+msgstr ""
+
+#: src/LYCookie.c:2752
+msgid "cookie_domain_flag_set error, aborting program"
+msgstr ""
+
+#: src/LYCurses.c:1136
+msgid "Terminal reinitialisation failed - unknown terminal type?"
+msgstr ""
+
+#: src/LYCurses.c:1343
+msgid "Terminal initialisation failed - unknown terminal type?"
+msgstr ""
+
+#: src/LYCurses.c:1837
+msgid "Terminal ="
+msgstr ""
+
+#: src/LYCurses.c:1841
+msgid "You must use a vt100, 200, etc. terminal with this program."
+msgstr ""
+
+#: src/LYCurses.c:1890
+msgid "Your Terminal type is unknown!"
+msgstr ""
+
+#: src/LYCurses.c:1891
+msgid "Enter a terminal type:"
+msgstr ""
+
+#: src/LYCurses.c:1905
+msgid "TERMINAL TYPE IS SET TO"
+msgstr ""
+
+#: src/LYCurses.c:2464
+#, c-format
+msgid ""
+"\n"
+"A Fatal error has occurred in %s Ver. %s\n"
+msgstr ""
+
+#: src/LYCurses.c:2467
+#, c-format
+msgid ""
+"\n"
+"Please notify your system administrator to confirm a bug, and if\n"
+"confirmed, to notify the lynx-dev list. Bug reports should have concise\n"
+"descriptions of the command and/or URL which causes the problem, the\n"
+"operating system name with version number, the TCPIP implementation, the\n"
+"TRACEBACK if it can be captured, and any other relevant information.\n"
+msgstr ""
+
+#: src/LYEdit.c:272
+#, c-format
+msgid "Error starting editor, %s"
+msgstr ""
+
+#: src/LYEdit.c:275
+msgid "Editor killed by signal"
+msgstr ""
+
+#: src/LYEdit.c:280
+#, c-format
+msgid "Editor returned with error status %s"
+msgstr ""
+
+#: src/LYDownload.c:511
+msgid "Downloaded link:"
+msgstr ""
+
+#: src/LYDownload.c:516
+msgid "Suggested file name:"
+msgstr ""
+
+#: src/LYDownload.c:521
+msgid "Standard download options:"
+msgstr ""
+
+#: src/LYDownload.c:522
+msgid "Download options:"
+msgstr ""
+
+#: src/LYDownload.c:538
+msgid "Save to disk"
+msgstr ""
+
+#: src/LYDownload.c:552
+msgid "View temporary file"
+msgstr ""
+
+#: src/LYDownload.c:559
+msgid "Save to disk disabled."
+msgstr ""
+
+#: src/LYDownload.c:563 src/LYPrint.c:1331
+msgid "Local additions:"
+msgstr ""
+
+#: src/LYDownload.c:574 src/LYUpload.c:206
+msgid "No Name Given"
+msgstr ""
+
+#: src/LYHistory.c:673
+msgid "You selected:"
+msgstr ""
+
+#: src/LYHistory.c:697 src/LYHistory.c:926
+msgid "(no address)"
+msgstr ""
+
+#: src/LYHistory.c:701
+msgid " (internal)"
+msgstr ""
+
+#: src/LYHistory.c:703
+msgid " (was internal)"
+msgstr ""
+
+#: src/LYHistory.c:801
+msgid " (From History)"
+msgstr ""
+
+#: src/LYHistory.c:846
+msgid "You visited (POSTs, bookmark, menu and list files excluded):"
+msgstr ""
+
+#: src/LYHistory.c:1148
+msgid "(No messages yet)"
+msgstr ""
+
+#: src/LYLeaks.c:222
+msgid "Invalid pointer detected."
+msgstr ""
+
+#: src/LYLeaks.c:224 src/LYLeaks.c:262
+msgid "Sequence:"
+msgstr ""
+
+#: src/LYLeaks.c:227 src/LYLeaks.c:265
+msgid "Pointer:"
+msgstr ""
+
+#: src/LYLeaks.c:236 src/LYLeaks.c:243 src/LYLeaks.c:284
+msgid "FileName:"
+msgstr ""
+
+#: src/LYLeaks.c:239 src/LYLeaks.c:246 src/LYLeaks.c:287 src/LYLeaks.c:298
+msgid "LineCount:"
+msgstr ""
+
+#: src/LYLeaks.c:260
+msgid "Memory leak detected."
+msgstr ""
+
+#: src/LYLeaks.c:268
+msgid "Contains:"
+msgstr ""
+
+#: src/LYLeaks.c:281
+msgid "ByteSize:"
+msgstr ""
+
+#: src/LYLeaks.c:295
+msgid "realloced:"
+msgstr ""
+
+#: src/LYLeaks.c:316
+msgid "Total memory leakage this run:"
+msgstr ""
+
+#: src/LYLeaks.c:320
+msgid "Peak allocation"
+msgstr ""
+
+#: src/LYLeaks.c:322
+msgid "Bytes allocated"
+msgstr ""
+
+#: src/LYLeaks.c:324
+msgid "Total mallocs"
+msgstr ""
+
+#: src/LYLeaks.c:326
+msgid "Total frees"
+msgstr ""
+
+#: src/LYList.c:89
+msgid "References in "
+msgstr ""
+
+#: src/LYList.c:92
+msgid "this document:"
+msgstr ""
+
+#: src/LYList.c:98 src/LYList.c:363
+msgid "Visible links:"
+msgstr ""
+
+#: src/LYList.c:202 src/LYList.c:322
+msgid "Hidden links:"
+msgstr ""
+
+#: src/LYList.c:359
+msgid "References"
+msgstr ""
+
+#: src/LYLocal.c:289
+#, c-format
+msgid "Unable to get status of '%s'."
+msgstr ""
+
+#: src/LYLocal.c:354
+msgid "The selected item is not a file or a directory! Request ignored."
+msgstr ""
+
+#: src/LYLocal.c:456
+#, c-format
+msgid "Unable to %s due to system error!"
+msgstr ""
+
+#: src/LYLocal.c:490
+#, c-format
+msgid "Probable failure to %s due to system error!"
+msgstr ""
+
+#: src/LYLocal.c:555 src/LYLocal.c:578
+#, c-format
+msgid "remove %s"
+msgstr ""
+
+#: src/LYLocal.c:598
+#, c-format
+msgid "touch %s"
+msgstr ""
+
+#: src/LYLocal.c:628
+#, c-format
+msgid "move %s to %s"
+msgstr ""
+
+#: src/LYLocal.c:676
+msgid "There is already a directory with that name! Request ignored."
+msgstr ""
+
+#: src/LYLocal.c:678
+msgid "There is already a file with that name! Request ignored."
+msgstr ""
+
+#: src/LYLocal.c:680
+msgid "The specified name is already in use! Request ignored."
+msgstr ""
+
+#: src/LYLocal.c:692
+msgid "Destination has different owner! Request denied."
+msgstr ""
+
+#: src/LYLocal.c:695
+msgid "Destination is not a valid directory! Request denied."
+msgstr ""
+
+#: src/LYLocal.c:711
+msgid "Source and destination are the same location! Request ignored!"
+msgstr ""
+
+#: src/LYLocal.c:735
+msgid "Remove all tagged files and directories?"
+msgstr ""
+
+#: src/LYLocal.c:808
+msgid "Enter new location for tagged items: "
+msgstr ""
+
+#: src/LYLocal.c:906
+msgid "Enter new name for directory: "
+msgstr ""
+
+#: src/LYLocal.c:908
+msgid "Enter new name for file: "
+msgstr ""
+
+#: src/LYLocal.c:920
+msgid "Illegal character (path-separator) found! Request ignored."
+msgstr ""
+
+#: src/LYLocal.c:970
+msgid "Enter new location for directory: "
+msgstr ""
+
+#: src/LYLocal.c:972
+msgid "Enter new location for file: "
+msgstr ""
+
+#: src/LYLocal.c:999
+msgid "Unexpected failure - unable to find trailing path separator"
+msgstr ""
+
+#: src/LYLocal.c:1061
+msgid "Modify name, location, or permission (n, l, or p): "
+msgstr ""
+
+#: src/LYLocal.c:1063
+msgid "Modify name or location (n or l): "
+msgstr ""
+
+#.
+#. * Code for changing ownership needed here.
+#.
+#: src/LYLocal.c:1092
+msgid "This feature not yet implemented!"
+msgstr ""
+
+#: src/LYLocal.c:1113
+msgid "Enter name of file to create: "
+msgstr ""
+
+#: src/LYLocal.c:1116 src/LYLocal.c:1153
+msgid "Illegal redirection \"//\" found! Request ignored."
+msgstr ""
+
+#: src/LYLocal.c:1150
+msgid "Enter name for new directory: "
+msgstr ""
+
+#: src/LYLocal.c:1191
+msgid "Create file or directory (f or d): "
+msgstr ""
+
+#: src/LYLocal.c:1233
+#, c-format
+msgid "Remove directory '%s'?"
+msgstr ""
+
+#: src/LYLocal.c:1236
+msgid "Remove directory?"
+msgstr ""
+
+#: src/LYLocal.c:1241
+#, c-format
+msgid "Remove file '%s'?"
+msgstr ""
+
+#: src/LYLocal.c:1243
+msgid "Remove file?"
+msgstr ""
+
+#: src/LYLocal.c:1248
+#, c-format
+msgid "Remove symbolic link '%s'?"
+msgstr ""
+
+#: src/LYLocal.c:1250
+msgid "Remove symbolic link?"
+msgstr ""
+
+#: src/LYLocal.c:1348
+msgid "Sorry, don't know how to permit non-UNIX files yet."
+msgstr ""
+
+#: src/LYLocal.c:1377
+msgid "Unable to open permit options file"
+msgstr ""
+
+#: src/LYLocal.c:1405
+msgid "Specify permissions below:"
+msgstr ""
+
+#: src/LYLocal.c:1406 src/LYShowInfo.c:291
+msgid "Owner:"
+msgstr ""
+
+#: src/LYLocal.c:1422
+msgid "Group"
+msgstr ""
+
+#: src/LYLocal.c:1438
+msgid "Others:"
+msgstr ""
+
+#: src/LYLocal.c:1456
+msgid "form to permit"
+msgstr ""
+
+#: src/LYLocal.c:1552
+msgid "Invalid mode format."
+msgstr ""
+
+#: src/LYLocal.c:1556
+msgid "Invalid syntax format."
+msgstr ""
+
+#: src/LYLocal.c:1743
+msgid "Warning! UUDecoded file will exist in the directory you started Lynx."
+msgstr ""
+
+#: src/LYLocal.c:1933
+msgid "NULL URL pointer"
+msgstr ""
+
+#: src/LYLocal.c:2015
+#, c-format
+msgid "Executing %s "
+msgstr ""
+
+#: src/LYLocal.c:2018
+msgid "Executing system command. This might take a while."
+msgstr ""
+
+#: src/LYLocal.c:2092
+msgid "Current directory:"
+msgstr ""
+
+#: src/LYLocal.c:2095 src/LYLocal.c:2113
+msgid "Current selection:"
+msgstr ""
+
+#: src/LYLocal.c:2099
+msgid "Nothing currently selected."
+msgstr ""
+
+#: src/LYLocal.c:2115
+msgid "tagged item:"
+msgstr ""
+
+#: src/LYLocal.c:2116
+msgid "tagged items:"
+msgstr ""
+
+#: src/LYLocal.c:2216 src/LYLocal.c:2225
+msgid "Illegal filename; request ignored."
+msgstr ""
+
+#. directory not writable
+#: src/LYLocal.c:2323 src/LYLocal.c:2382
+msgid "Install in the selected directory not permitted."
+msgstr ""
+
+#: src/LYLocal.c:2378
+msgid "The selected item is not a directory! Request ignored."
+msgstr ""
+
+#: src/LYLocal.c:2387
+msgid "Just a moment, ..."
+msgstr ""
+
+#: src/LYLocal.c:2404
+msgid "Error building install args"
+msgstr ""
+
+#: src/LYLocal.c:2419 src/LYLocal.c:2450
+#, c-format
+msgid "Source and target are the same: %s"
+msgstr ""
+
+#: src/LYLocal.c:2426 src/LYLocal.c:2457
+#, c-format
+msgid "Already in target directory: %s"
+msgstr ""
+
+#: src/LYLocal.c:2475
+msgid "Installation complete"
+msgstr ""
+
+#: src/LYLocal.c:2678
+msgid "Temporary URL or list would be too long."
+msgstr ""
+
+#: src/LYMail.c:566
+msgid "Sending"
+msgstr ""
+
+#: src/LYMail.c:1050
+#, c-format
+msgid "The link %s :?: %s \n"
+msgstr ""
+
+#: src/LYMail.c:1052
+#, c-format
+msgid "called \"%s\"\n"
+msgstr ""
+
+#: src/LYMail.c:1053
+#, c-format
+msgid "in the file \"%s\" called \"%s\"\n"
+msgstr ""
+
+#: src/LYMail.c:1054
+msgid "was requested but was not available."
+msgstr ""
+
+#: src/LYMail.c:1055
+msgid "Thought you might want to know."
+msgstr ""
+
+#: src/LYMail.c:1057
+msgid "This message was automatically generated by"
+msgstr ""
+
+#: src/LYMail.c:1770
+msgid "No system mailer configured"
+msgstr ""
+
+#: src/LYMain.c:1095
+msgid "No Winsock found, sorry."
+msgstr ""
+
+#: src/LYMain.c:1285
+msgid "You MUST define a valid TMP or TEMP area!"
+msgstr ""
+
+#: src/LYMain.c:1338 src/LYMainLoop.c:5285
+msgid "No such directory"
+msgstr ""
+
+#: src/LYMain.c:1532
+#, c-format
+msgid ""
+"\n"
+"Configuration file \"%s\" is not available.\n"
+"\n"
+msgstr ""
+
+#: src/LYMain.c:1542
+#, c-format
+msgid ""
+"\n"
+"Lynx character sets not declared.\n"
+"\n"
+msgstr ""
+
+#: src/LYMain.c:1698
+#, c-format
+msgid "Ignored %d characters from standard input.\n"
+msgstr ""
+
+#: src/LYMain.c:1700
+#, c-format
+msgid "Use \"-stdin\" or \"-\" to tell how to handle piped input.\n"
+msgstr ""
+
+#: src/LYMain.c:1858
+msgid "Warning:"
+msgstr ""
+
+#: src/LYMain.c:2426
+msgid "persistent cookies state will be changed in next session only."
+msgstr ""
+
+#: src/LYMain.c:2661 src/LYMain.c:2705
+#, c-format
+msgid "Lynx: ignoring unrecognized charset=%s\n"
+msgstr ""
+
+#: src/LYMain.c:3222
+#, c-format
+msgid "%s Version %s (%s)"
+msgstr ""
+
+#: src/LYMain.c:3263
+#, c-format
+msgid "Built on %s%s.\n"
+msgstr ""
+
+#: src/LYMain.c:3277
+msgid "Copyrights held by the Lynx Developers Group,"
+msgstr ""
+
+#: src/LYMain.c:3278
+msgid "the University of Kansas, CERN, and other contributors."
+msgstr ""
+
+#: src/LYMain.c:3279
+msgid "Distributed under the GNU General Public License (Version 2)."
+msgstr ""
+
+#: src/LYMain.c:3280
+msgid ""
+"See https://lynx.invisible-island.net/ and the online help for more "
+"information."
+msgstr ""
+
+#: src/LYMain.c:4139
+#, c-format
+msgid "USAGE: %s [options] [file]\n"
+msgstr ""
+
+#: src/LYMain.c:4140
+#, c-format
+msgid "Options are:\n"
+msgstr ""
+
+#: src/LYMain.c:4443
+#, c-format
+msgid "%s: Invalid Option: %s\n"
+msgstr ""
+
+#: src/LYMainLoop.c:572
+#, c-format
+msgid "Internal error: Invalid mouse link %d!"
+msgstr ""
+
+#: src/LYMainLoop.c:693 src/LYMainLoop.c:5307
+msgid "A URL specified by the user"
+msgstr ""
+
+#: src/LYMainLoop.c:1142
+msgid "Enctype multipart/form-data not yet supported! Cannot submit."
+msgstr ""
+
+#.
+#. * Make a name for this help file.
+#.
+#: src/LYMainLoop.c:3197
+msgid "Help Screen"
+msgstr ""
+
+#: src/LYMainLoop.c:3328
+msgid "System Index"
+msgstr ""
+
+#: src/LYMainLoop.c:3577
+#, c-format
+msgid "Query parameter %d: "
+msgstr ""
+
+#: src/LYMainLoop.c:3806 src/LYMainLoop.c:5583
+msgid "Entry into main screen"
+msgstr ""
+
+#: src/LYMainLoop.c:4064
+msgid "No next document present"
+msgstr ""
+
+#: src/LYMainLoop.c:4359
+msgid "charset for this document specified explicitly, sorry..."
+msgstr ""
+
+#: src/LYMainLoop.c:5265
+msgid "cd to:"
+msgstr ""
+
+#: src/LYMainLoop.c:5288
+msgid "A component of path is not a directory"
+msgstr ""
+
+#: src/LYMainLoop.c:5291
+msgid "failed to change directory"
+msgstr ""
+
+#: src/LYMainLoop.c:6517
+msgid "Reparsing document under current settings..."
+msgstr ""
+
+#: src/LYMainLoop.c:6811
+#, c-format
+msgid "Fatal error - could not open output file %s\n"
+msgstr ""
+
+#: src/LYMainLoop.c:7153
+msgid "TABLE center enable."
+msgstr ""
+
+#: src/LYMainLoop.c:7156
+msgid "TABLE center disable."
+msgstr ""
+
+#: src/LYMainLoop.c:7236
+msgid "Current URL is empty."
+msgstr ""
+
+#: src/LYMainLoop.c:7238 src/LYUtils.c:1909
+msgid "Copy to clipboard failed."
+msgstr ""
+
+#: src/LYMainLoop.c:7240
+msgid "Document URL put to clipboard."
+msgstr ""
+
+#: src/LYMainLoop.c:7242
+msgid "Link URL put to clipboard."
+msgstr ""
+
+#: src/LYMainLoop.c:7269
+msgid "No URL in the clipboard."
+msgstr ""
+
+#: src/LYMainLoop.c:7962 src/LYMainLoop.c:8133
+msgid "-index-"
+msgstr ""
+
+#: src/LYMainLoop.c:8071
+msgid "lynx: Can't access startfile"
+msgstr ""
+
+#: src/LYMainLoop.c:8083
+msgid "lynx: Start file could not be found or is not text/html or text/plain"
+msgstr ""
+
+#: src/LYMainLoop.c:8084
+msgid " Exiting..."
+msgstr ""
+
+#: src/LYMainLoop.c:8127
+msgid "-more-"
+msgstr ""
+
+#. Enable scrolling.
+#: src/LYNews.c:186
+msgid "You will be posting to:"
+msgstr ""
+
+#.
+#. * Get the mail address for the From header, offering personal_mail_address
+#. * as default.
+#.
+#: src/LYNews.c:195
+msgid ""
+"\n"
+"\n"
+" Please provide your mail address for the From: header\n"
+msgstr ""
+
+#.
+#. * Get the Subject header, offering the current document's title as the
+#. * default if this is a followup rather than a new post. - FM
+#.
+#: src/LYNews.c:212
+msgid ""
+"\n"
+"\n"
+" Please provide or edit the Subject: header\n"
+msgstr ""
+
+#: src/LYNews.c:302
+msgid ""
+"\n"
+"\n"
+" Please provide or edit the Organization: header\n"
+msgstr ""
+
+#.
+#. * Use the built in line editior.
+#.
+#: src/LYNews.c:359
+msgid ""
+"\n"
+"\n"
+" Please enter your message below."
+msgstr ""
+
+#: src/LYNews.c:405
+msgid "Message has no original text!"
+msgstr ""
+
+#: src/LYOptions.c:774
+msgid "review/edit B)ookmarks files"
+msgstr ""
+
+#: src/LYOptions.c:776
+msgid "B)ookmark file: "
+msgstr ""
+
+#: src/LYOptions.c:2131 src/LYOptions.c:2138
+msgid "ON"
+msgstr ""
+
+#. verbose_img variable
+#. LYCollapseBRs variable
+#. LYtrimBlankLines variable
+#: src/LYOptions.c:2132 src/LYOptions.c:2137 src/LYOptions.c:2321
+#: src/LYOptions.c:2330 src/LYOptions.c:2339 src/LYOptions.c:2350
+msgid "OFF"
+msgstr ""
+
+#: src/LYOptions.c:2133
+msgid "NEVER"
+msgstr ""
+
+#: src/LYOptions.c:2134
+msgid "ALWAYS"
+msgstr ""
+
+#: src/LYOptions.c:2150 src/LYOptions.c:2313
+msgid "ignore"
+msgstr ""
+
+#: src/LYOptions.c:2151
+msgid "ask user"
+msgstr ""
+
+#: src/LYOptions.c:2152
+msgid "accept all"
+msgstr ""
+
+#: src/LYOptions.c:2164
+msgid "ALWAYS OFF"
+msgstr ""
+
+#: src/LYOptions.c:2165
+msgid "FOR LOCAL FILES ONLY"
+msgstr ""
+
+#: src/LYOptions.c:2167
+msgid "ALWAYS ON"
+msgstr ""
+
+#: src/LYOptions.c:2179
+msgid "Numbers act as arrows"
+msgstr ""
+
+#: src/LYOptions.c:2181
+msgid "Links are numbered"
+msgstr ""
+
+#: src/LYOptions.c:2184
+msgid "Links and form fields are numbered"
+msgstr ""
+
+#: src/LYOptions.c:2187
+msgid "Form fields are numbered"
+msgstr ""
+
+#: src/LYOptions.c:2202
+msgid "Case insensitive"
+msgstr ""
+
+#: src/LYOptions.c:2203
+msgid "Case sensitive"
+msgstr ""
+
+#: src/LYOptions.c:2237
+msgid "prompt normally"
+msgstr ""
+
+#: src/LYOptions.c:2238
+msgid "force yes-response"
+msgstr ""
+
+#: src/LYOptions.c:2239
+msgid "force no-response"
+msgstr ""
+
+#: src/LYOptions.c:2249
+msgid "RFC 2109"
+msgstr ""
+
+#: src/LYOptions.c:2250
+msgid "RFC 2965"
+msgstr ""
+
+#: src/LYOptions.c:2251
+msgid "RFC 6265"
+msgstr ""
+
+#: src/LYOptions.c:2268
+msgid "Novice"
+msgstr ""
+
+#: src/LYOptions.c:2269
+msgid "Intermediate"
+msgstr ""
+
+#: src/LYOptions.c:2270
+msgid "Advanced"
+msgstr ""
+
+#: src/LYOptions.c:2279
+msgid "By First Visit"
+msgstr ""
+
+#: src/LYOptions.c:2281
+msgid "By First Visit Reversed"
+msgstr ""
+
+#: src/LYOptions.c:2282
+msgid "As Visit Tree"
+msgstr ""
+
+#: src/LYOptions.c:2283
+msgid "By Last Visit"
+msgstr ""
+
+#: src/LYOptions.c:2285
+msgid "By Last Visit Reversed"
+msgstr ""
+
+#. Old_DTD variable
+#: src/LYOptions.c:2296
+msgid "relaxed (TagSoup mode)"
+msgstr ""
+
+#: src/LYOptions.c:2297
+msgid "strict (SortaSGML mode)"
+msgstr ""
+
+#: src/LYOptions.c:2304
+msgid "Ignore"
+msgstr ""
+
+#: src/LYOptions.c:2305
+msgid "Add to trace-file"
+msgstr ""
+
+#: src/LYOptions.c:2306
+msgid "Add to LYNXMESSAGES"
+msgstr ""
+
+#: src/LYOptions.c:2307
+msgid "Warn, point to trace-file"
+msgstr ""
+
+#: src/LYOptions.c:2314
+msgid "as labels"
+msgstr ""
+
+#: src/LYOptions.c:2315
+msgid "as links"
+msgstr ""
+
+#: src/LYOptions.c:2322
+msgid "show filename"
+msgstr ""
+
+#: src/LYOptions.c:2331
+msgid "collapse"
+msgstr ""
+
+#: src/LYOptions.c:2340
+msgid "trim-lines"
+msgstr ""
+
+#: src/LYOptions.c:2351
+msgid "STANDARD"
+msgstr ""
+
+#: src/LYOptions.c:2352
+msgid "ADVANCED"
+msgstr ""
+
+#: src/LYOptions.c:2374
+msgid "IDNA 2003"
+msgstr ""
+
+#: src/LYOptions.c:2375
+msgid "IDNA 2008"
+msgstr ""
+
+#: src/LYOptions.c:2376
+msgid "IDNA TR46"
+msgstr ""
+
+#: src/LYOptions.c:2377
+msgid "IDNA Compatible"
+msgstr ""
+
+#: src/LYOptions.c:2398
+msgid "Directories first"
+msgstr ""
+
+#: src/LYOptions.c:2399
+msgid "Files first"
+msgstr ""
+
+#: src/LYOptions.c:2400
+msgid "Mixed style"
+msgstr ""
+
+#: src/LYOptions.c:2408 src/LYOptions.c:2428
+msgid "By Name"
+msgstr ""
+
+#: src/LYOptions.c:2409 src/LYOptions.c:2429
+msgid "By Type"
+msgstr ""
+
+#: src/LYOptions.c:2410 src/LYOptions.c:2430
+msgid "By Size"
+msgstr ""
+
+#: src/LYOptions.c:2411 src/LYOptions.c:2431
+msgid "By Date"
+msgstr ""
+
+#: src/LYOptions.c:2412
+msgid "By Mode"
+msgstr ""
+
+#: src/LYOptions.c:2414
+msgid "By User"
+msgstr ""
+
+#: src/LYOptions.c:2415
+msgid "By Group"
+msgstr ""
+
+#: src/LYOptions.c:2440
+msgid "Do not show rate"
+msgstr ""
+
+#: src/LYOptions.c:2441 src/LYOptions.c:2442
+#, c-format
+msgid "Show %s/sec rate"
+msgstr ""
+
+#: src/LYOptions.c:2444 src/LYOptions.c:2445
+#, c-format
+msgid "Show %s/sec, ETA"
+msgstr ""
+
+#: src/LYOptions.c:2446 src/LYOptions.c:2447
+#, c-format
+msgid "Show %s/sec (2-digits), ETA"
+msgstr ""
+
+#: src/LYOptions.c:2450
+msgid "Show progressbar"
+msgstr ""
+
+#: src/LYOptions.c:2471
+msgid "Accept lynx's internal types"
+msgstr ""
+
+#: src/LYOptions.c:2472
+msgid "Also accept lynx.cfg's types"
+msgstr ""
+
+#: src/LYOptions.c:2473
+msgid "Also accept user's types"
+msgstr ""
+
+#: src/LYOptions.c:2474
+msgid "Also accept system's types"
+msgstr ""
+
+#: src/LYOptions.c:2475
+msgid "Accept all types"
+msgstr ""
+
+#: src/LYOptions.c:2484
+msgid "gzip"
+msgstr ""
+
+#: src/LYOptions.c:2485
+msgid "deflate"
+msgstr ""
+
+#: src/LYOptions.c:2488
+msgid "compress"
+msgstr ""
+
+#: src/LYOptions.c:2491
+msgid "bzip2"
+msgstr ""
+
+#: src/LYOptions.c:2493
+msgid "All"
+msgstr ""
+
+#: src/LYOptions.c:2503
+msgid "HTTP 1.0"
+msgstr ""
+
+#: src/LYOptions.c:2504
+msgid "HTTP 1.1"
+msgstr ""
+
+#: src/LYOptions.c:2863 src/LYOptions.c:2892
+#, c-format
+msgid "Use %s to invoke the Options menu!"
+msgstr ""
+
+#: src/LYOptions.c:3789
+msgid "(options marked with (!) will not be saved)"
+msgstr ""
+
+#: src/LYOptions.c:3797
+msgid "General Preferences"
+msgstr ""
+
+#. ***************************************************************
+#. User Mode: SELECT
+#: src/LYOptions.c:3801
+msgid "User mode"
+msgstr ""
+
+#. Editor: INPUT
+#: src/LYOptions.c:3807
+msgid "Editor"
+msgstr ""
+
+#. Search Type: SELECT
+#: src/LYOptions.c:3812
+msgid "Type of Search"
+msgstr ""
+
+#: src/LYOptions.c:3817
+msgid "Security and Privacy"
+msgstr ""
+
+#. ***************************************************************
+#. Cookies: SELECT
+#: src/LYOptions.c:3821
+msgid "Cookies"
+msgstr ""
+
+#. Cookie Version: SELECT
+#: src/LYOptions.c:3835
+msgid "Cookie RFC-version"
+msgstr ""
+
+#. Cookie Prompting: SELECT
+#: src/LYOptions.c:3841
+msgid "Invalid-Cookie Prompting"
+msgstr ""
+
+#. SSL Prompting: SELECT
+#: src/LYOptions.c:3848
+msgid "SSL Prompting"
+msgstr ""
+
+#: src/LYOptions.c:3853
+msgid "SSL client certificate file"
+msgstr ""
+
+#: src/LYOptions.c:3857
+msgid "SSL client key file"
+msgstr ""
+
+#: src/LYOptions.c:3863
+msgid "Keyboard Input"
+msgstr ""
+
+#. ***************************************************************
+#. Keypad Mode: SELECT
+#: src/LYOptions.c:3867
+msgid "Keypad mode"
+msgstr ""
+
+#. Emacs keys: ON/OFF
+#: src/LYOptions.c:3873
+msgid "Emacs keys"
+msgstr ""
+
+#. VI Keys: ON/OFF
+#: src/LYOptions.c:3879
+msgid "VI keys"
+msgstr ""
+
+#. Line edit style: SELECT
+#. well, at least 2 line edit styles available
+#: src/LYOptions.c:3886
+msgid "Line edit style"
+msgstr ""
+
+#. Keyboard layout: SELECT
+#: src/LYOptions.c:3898
+msgid "Keyboard layout"
+msgstr ""
+
+#.
+#. * Display and Character Set
+#.
+#: src/LYOptions.c:3912
+msgid "Display and Character Set"
+msgstr ""
+
+#. Use locale-based character set: ON/OFF
+#: src/LYOptions.c:3917
+msgid "Use locale-based character set"
+msgstr ""
+
+#: src/LYOptions.c:3924
+msgid "Use HTML5 charset replacements"
+msgstr ""
+
+#. Display Character Set: SELECT
+#: src/LYOptions.c:3930
+msgid "Display character set"
+msgstr ""
+
+#: src/LYOptions.c:3961
+msgid "Assumed document character set"
+msgstr ""
+
+#: src/LYOptions.c:3977
+msgid "Internationalized domain names"
+msgstr ""
+
+#.
+#. * Since CJK people hardly mixed with other world
+#. * we split the header to make it more readable:
+#. * "CJK mode" for CJK display charsets, and "Raw 8-bit" for others.
+#.
+#: src/LYOptions.c:3995
+msgid "CJK mode"
+msgstr ""
+
+#: src/LYOptions.c:3997
+msgid "Raw 8-bit"
+msgstr ""
+
+#. X Display: INPUT
+#: src/LYOptions.c:4005
+msgid "X Display"
+msgstr ""
+
+#.
+#. * Document Appearance
+#.
+#: src/LYOptions.c:4011
+msgid "Document Appearance"
+msgstr ""
+
+#: src/LYOptions.c:4017
+msgid "Show color"
+msgstr ""
+
+#: src/LYOptions.c:4043
+msgid "Color style"
+msgstr ""
+
+#: src/LYOptions.c:4053
+msgid "Default colors"
+msgstr ""
+
+#. Show cursor: ON/OFF
+#: src/LYOptions.c:4061
+msgid "Show cursor"
+msgstr ""
+
+#. Underline links: ON/OFF
+#: src/LYOptions.c:4067
+msgid "Underline links"
+msgstr ""
+
+#. Show scrollbar: ON/OFF
+#: src/LYOptions.c:4074
+msgid "Show scrollbar"
+msgstr ""
+
+#. Select Popups: ON/OFF
+#: src/LYOptions.c:4081
+msgid "Popups for select fields"
+msgstr ""
+
+#. HTML error recovery: SELECT
+#: src/LYOptions.c:4087
+msgid "HTML error recovery"
+msgstr ""
+
+#. Bad HTML messages: SELECT
+#: src/LYOptions.c:4093
+msgid "Bad HTML messages"
+msgstr ""
+
+#. Show Images: SELECT
+#: src/LYOptions.c:4099
+msgid "Show images"
+msgstr ""
+
+#. Verbose Images: ON/OFF
+#: src/LYOptions.c:4113
+msgid "Verbose images"
+msgstr ""
+
+#. Collapse BR Tags: ON/OFF
+#: src/LYOptions.c:4119
+msgid "Collapse BR tags"
+msgstr ""
+
+#. Trim blank lines: ON/OFF
+#: src/LYOptions.c:4125
+msgid "Trim blank lines"
+msgstr ""
+
+#.
+#. * Headers Transferred to Remote Servers
+#.
+#: src/LYOptions.c:4133
+msgid "Headers Transferred to Remote Servers"
+msgstr ""
+
+#. ***************************************************************
+#. Mail Address: INPUT
+#: src/LYOptions.c:4137
+msgid "Personal mail address"
+msgstr ""
+
+#: src/LYOptions.c:4142
+msgid "Personal name for mail"
+msgstr ""
+
+#: src/LYOptions.c:4149
+msgid "Password for anonymous ftp"
+msgstr ""
+
+#. Preferred content type: SELECT
+#: src/LYOptions.c:4155
+msgid "Preferred content type"
+msgstr ""
+
+#. Preferred media type: SELECT
+#: src/LYOptions.c:4161
+msgid "Preferred media type"
+msgstr ""
+
+#. Preferred encoding: SELECT
+#: src/LYOptions.c:4167
+msgid "Preferred encoding"
+msgstr ""
+
+#. Preferred Document Character Set: INPUT
+#: src/LYOptions.c:4173
+msgid "Preferred document character set"
+msgstr ""
+
+#. Preferred Document Language: INPUT
+#: src/LYOptions.c:4178
+msgid "Preferred document language"
+msgstr ""
+
+#. HTTP protocol SELECT
+#: src/LYOptions.c:4183
+msgid "HTTP protocol"
+msgstr ""
+
+#: src/LYOptions.c:4190
+msgid "Send User-Agent header"
+msgstr ""
+
+#: src/LYOptions.c:4192
+msgid "User-Agent header"
+msgstr ""
+
+#.
+#. * Listing and Accessing Files
+#.
+#: src/LYOptions.c:4200
+msgid "Listing and Accessing Files"
+msgstr ""
+
+#. FTP sort: SELECT
+#: src/LYOptions.c:4205
+msgid "Use Passive FTP"
+msgstr ""
+
+#. FTP sort: SELECT
+#: src/LYOptions.c:4211
+msgid "FTP sort criteria"
+msgstr ""
+
+#. Local Directory Sort: SELECT
+#: src/LYOptions.c:4219
+msgid "Local directory sort criteria"
+msgstr ""
+
+#. Local Directory Order: SELECT
+#: src/LYOptions.c:4225
+msgid "Local directory sort order"
+msgstr ""
+
+#: src/LYOptions.c:4234
+msgid "Show dot files"
+msgstr ""
+
+#: src/LYOptions.c:4242
+msgid "Execution links"
+msgstr ""
+
+#: src/LYOptions.c:4260
+msgid "Pause when showing message"
+msgstr ""
+
+#. Show transfer rate: SELECT
+#: src/LYOptions.c:4267
+msgid "Show transfer rate"
+msgstr ""
+
+#.
+#. * Special Files and Screens
+#.
+#: src/LYOptions.c:4287
+msgid "Special Files and Screens"
+msgstr ""
+
+#: src/LYOptions.c:4292
+msgid "Multi-bookmarks"
+msgstr ""
+
+#: src/LYOptions.c:4300
+msgid "Review/edit Bookmarks files"
+msgstr ""
+
+#: src/LYOptions.c:4303
+msgid "Goto multi-bookmark menu"
+msgstr ""
+
+#: src/LYOptions.c:4305
+msgid "Bookmarks file"
+msgstr ""
+
+#. Auto Session: ON/OFF
+#: src/LYOptions.c:4312
+msgid "Auto Session"
+msgstr ""
+
+#. Session File Menu: INPUT
+#: src/LYOptions.c:4318
+msgid "Session file"
+msgstr ""
+
+#. Visited Pages: SELECT
+#: src/LYOptions.c:4324
+msgid "Visited Pages"
+msgstr ""
+
+#: src/LYOptions.c:4329
+msgid "View the file "
+msgstr ""
+
+#: src/LYPrint.c:956
+#, c-format
+msgid " Print job complete.\n"
+msgstr ""
+
+#: src/LYPrint.c:1283
+msgid "Document:"
+msgstr ""
+
+#: src/LYPrint.c:1284
+msgid "Number of lines:"
+msgstr ""
+
+#: src/LYPrint.c:1285
+msgid "Number of pages:"
+msgstr ""
+
+#: src/LYPrint.c:1286
+msgid "pages"
+msgstr ""
+
+#: src/LYPrint.c:1286
+msgid "page"
+msgstr ""
+
+#: src/LYPrint.c:1287
+msgid "(approximately)"
+msgstr ""
+
+#: src/LYPrint.c:1294
+msgid "Some print functions have been disabled!"
+msgstr ""
+
+#: src/LYPrint.c:1298
+msgid "Standard print options:"
+msgstr ""
+
+#: src/LYPrint.c:1299
+msgid "Print options:"
+msgstr ""
+
+#: src/LYPrint.c:1306
+msgid "Save to a local file"
+msgstr ""
+
+#: src/LYPrint.c:1308
+msgid "Save to disk disabled"
+msgstr ""
+
+#: src/LYPrint.c:1315
+msgid "Mail the file"
+msgstr ""
+
+#: src/LYPrint.c:1322
+msgid "Print to the screen"
+msgstr ""
+
+#: src/LYPrint.c:1327
+msgid "Print out on a printer attached to your vt100 terminal"
+msgstr ""
+
+#: src/LYReadCFG.c:437
+#, c-format
+msgid ""
+"Syntax Error parsing COLOR in configuration file:\n"
+"The line must be of the form:\n"
+"COLOR:INTEGER:FOREGROUND:BACKGROUND\n"
+"\n"
+"Here FOREGROUND and BACKGROUND must be one of:\n"
+"The special strings 'nocolor' or 'default', or\n"
+msgstr ""
+
+#: src/LYReadCFG.c:450
+msgid "Offending line:"
+msgstr ""
+
+#: src/LYReadCFG.c:764
+#, c-format
+msgid "key remapping of %s to %s for %s failed\n"
+msgstr ""
+
+#: src/LYReadCFG.c:771
+#, c-format
+msgid "key remapping of %s to %s failed\n"
+msgstr ""
+
+#: src/LYReadCFG.c:792
+#, c-format
+msgid "invalid line-editor selection %s for key %s, selecting all\n"
+msgstr ""
+
+#: src/LYReadCFG.c:817 src/LYReadCFG.c:832
+#, c-format
+msgid ""
+"setting of line-editor binding for key %s (0x%x) to 0x%x for %s failed\n"
+msgstr ""
+
+#: src/LYReadCFG.c:839
+#, c-format
+msgid "setting of line-editor binding for key %s (0x%x) for %s failed\n"
+msgstr ""
+
+#: src/LYReadCFG.c:937
+#, c-format
+msgid "Lynx: cannot start, CERN rules file %s is not available\n"
+msgstr ""
+
+#: src/LYReadCFG.c:938
+msgid "(no name)"
+msgstr ""
+
+#: src/LYReadCFG.c:2086
+#, c-format
+msgid "More than %d nested lynx.cfg includes -- perhaps there is a loop?!?\n"
+msgstr ""
+
+#: src/LYReadCFG.c:2088
+#, c-format
+msgid "Last attempted include was '%s',\n"
+msgstr ""
+
+#: src/LYReadCFG.c:2089
+#, c-format
+msgid "included from '%s'.\n"
+msgstr ""
+
+#: src/LYReadCFG.c:2500 src/LYReadCFG.c:2513 src/LYReadCFG.c:2571
+msgid "The following is read from your lynx.cfg file."
+msgstr ""
+
+#: src/LYReadCFG.c:2501 src/LYReadCFG.c:2514
+msgid "Please read the distribution"
+msgstr ""
+
+#: src/LYReadCFG.c:2507 src/LYReadCFG.c:2517
+msgid "for more comments."
+msgstr ""
+
+#: src/LYReadCFG.c:2553
+msgid "RELOAD THE CHANGES"
+msgstr ""
+
+#: src/LYReadCFG.c:2561
+msgid "Your primary configuration"
+msgstr ""
+
+#: src/LYShowInfo.c:116
+msgid "URL:"
+msgstr ""
+
+#: src/LYShowInfo.c:200
+msgid "Directory that you are currently viewing"
+msgstr ""
+
+#: src/LYShowInfo.c:203
+msgid "Name:"
+msgstr ""
+
+#: src/LYShowInfo.c:220
+msgid "Directory that you have currently selected"
+msgstr ""
+
+#: src/LYShowInfo.c:222
+msgid "File that you have currently selected"
+msgstr ""
+
+#: src/LYShowInfo.c:225
+msgid "Symbolic link that you have currently selected"
+msgstr ""
+
+#: src/LYShowInfo.c:228
+msgid "Item that you have currently selected"
+msgstr ""
+
+#: src/LYShowInfo.c:230
+msgid "Full name:"
+msgstr ""
+
+#: src/LYShowInfo.c:243
+msgid "Unable to follow link"
+msgstr ""
+
+#: src/LYShowInfo.c:245
+msgid "Points to file:"
+msgstr ""
+
+#: src/LYShowInfo.c:250
+msgid "Name of owner:"
+msgstr ""
+
+#: src/LYShowInfo.c:253
+msgid "Group name:"
+msgstr ""
+
+#: src/LYShowInfo.c:255
+msgid "File size:"
+msgstr ""
+
+#: src/LYShowInfo.c:257
+msgid "(bytes)"
+msgstr ""
+
+#.
+#. * Include date and time information.
+#.
+#: src/LYShowInfo.c:262
+msgid "Creation date:"
+msgstr ""
+
+#: src/LYShowInfo.c:265
+msgid "Last modified:"
+msgstr ""
+
+#: src/LYShowInfo.c:268
+msgid "Last accessed:"
+msgstr ""
+
+#: src/LYShowInfo.c:274
+msgid "Access Permissions"
+msgstr ""
+
+#: src/LYShowInfo.c:309
+msgid "Group:"
+msgstr ""
+
+#: src/LYShowInfo.c:329
+msgid "World:"
+msgstr ""
+
+#: src/LYShowInfo.c:336
+msgid "File that you are currently viewing"
+msgstr ""
+
+#: src/LYShowInfo.c:344 src/LYShowInfo.c:444
+msgid "Linkname:"
+msgstr ""
+
+#: src/LYShowInfo.c:350 src/LYShowInfo.c:365
+msgid "Charset:"
+msgstr ""
+
+#: src/LYShowInfo.c:364
+msgid "(assumed)"
+msgstr ""
+
+#: src/LYShowInfo.c:371
+msgid "Server:"
+msgstr ""
+
+#: src/LYShowInfo.c:374
+msgid "Date:"
+msgstr ""
+
+#: src/LYShowInfo.c:377
+msgid "Last Mod:"
+msgstr ""
+
+#: src/LYShowInfo.c:381
+msgid "Expires:"
+msgstr ""
+
+#: src/LYShowInfo.c:384
+msgid "Cache-Control:"
+msgstr ""
+
+#: src/LYShowInfo.c:387
+msgid "Content-Length:"
+msgstr ""
+
+#: src/LYShowInfo.c:391
+msgid "Length:"
+msgstr ""
+
+#: src/LYShowInfo.c:396
+msgid "Language:"
+msgstr ""
+
+#: src/LYShowInfo.c:402
+msgid "Post Data:"
+msgstr ""
+
+#: src/LYShowInfo.c:405
+msgid "Post Content Type:"
+msgstr ""
+
+#: src/LYShowInfo.c:408
+msgid "Owner(s):"
+msgstr ""
+
+#: src/LYShowInfo.c:413
+msgid "size:"
+msgstr ""
+
+#: src/LYShowInfo.c:415
+msgid "lines"
+msgstr ""
+
+#: src/LYShowInfo.c:419
+msgid "forms mode"
+msgstr ""
+
+#: src/LYShowInfo.c:421
+msgid "source"
+msgstr ""
+
+#: src/LYShowInfo.c:422
+msgid "normal"
+msgstr ""
+
+#: src/LYShowInfo.c:424
+msgid ", safe"
+msgstr ""
+
+#: src/LYShowInfo.c:426
+msgid ", via internal link"
+msgstr ""
+
+#: src/LYShowInfo.c:430
+msgid ", no-cache"
+msgstr ""
+
+#: src/LYShowInfo.c:432
+msgid ", ISMAP script"
+msgstr ""
+
+#: src/LYShowInfo.c:434
+msgid ", bookmark file"
+msgstr ""
+
+#: src/LYShowInfo.c:437
+msgid "mode:"
+msgstr ""
+
+#: src/LYShowInfo.c:443
+msgid "Link that you currently have selected"
+msgstr ""
+
+#: src/LYShowInfo.c:452
+msgid "Method:"
+msgstr ""
+
+#: src/LYShowInfo.c:456
+msgid "Enctype:"
+msgstr ""
+
+#: src/LYShowInfo.c:462
+msgid "Action:"
+msgstr ""
+
+#: src/LYShowInfo.c:468
+msgid "(Form field)"
+msgstr ""
+
+#: src/LYShowInfo.c:478
+msgid "No Links on the current page"
+msgstr ""
+
+#: src/LYShowInfo.c:483
+msgid "Server Headers:"
+msgstr ""
+
+#: src/LYStyle.c:332
+#, c-format
+msgid ""
+"Syntax Error parsing style in lss file:\n"
+"[%s]\n"
+"The line must be of the form:\n"
+"OBJECT:MONO:COLOR (ie em:bold:brightblue:white)\n"
+"where OBJECT is one of EM,STRONG,B,I,U,BLINK etc.\n"
+"\n"
+msgstr ""
+
+#: src/LYStyle.c:941
+#, c-format
+msgid ""
+"\n"
+"Lynx file \"%s\" is not available.\n"
+"\n"
+msgstr ""
+
+#: src/LYTraversal.c:111
+msgid "here is a list of the history stack so that you may rebuild"
+msgstr ""
+
+#: src/LYUpload.c:77
+msgid "ERROR! - upload command is misconfigured"
+msgstr ""
+
+#: src/LYUpload.c:98
+msgid "Illegal redirection \"../\" found! Request ignored."
+msgstr ""
+
+#: src/LYUpload.c:101
+msgid "Illegal character \"/\" found! Request ignored."
+msgstr ""
+
+#: src/LYUpload.c:104
+msgid "Illegal redirection using \"~\" found! Request ignored."
+msgstr ""
+
+#: src/LYUpload.c:157
+msgid "Unable to upload file."
+msgstr ""
+
+#: src/LYUpload.c:196
+msgid "Upload To:"
+msgstr ""
+
+#: src/LYUpload.c:197
+msgid "Upload options:"
+msgstr ""
+
+#: src/LYUtils.c:1911
+msgid "Download document URL put to clipboard."
+msgstr ""
+
+#: src/LYUtils.c:2658
+msgid "Unexpected access protocol for this URL scheme."
+msgstr ""
+
+#: src/LYUtils.c:3571
+msgid "Too many tempfiles"
+msgstr ""
+
+#: src/LYUtils.c:3871
+msgid "unknown restriction"
+msgstr ""
+
+#: src/LYUtils.c:3902
+#, c-format
+msgid "No restrictions set.\n"
+msgstr ""
+
+#: src/LYUtils.c:3905
+#, c-format
+msgid "Restrictions set:\n"
+msgstr ""
+
+#: src/LYUtils.c:5202
+msgid "Cannot find HOME directory"
+msgstr ""
+
+#: src/LYrcFile.c:16
+msgid "Normally disabled. See ENABLE_LYNXRC in lynx.cfg\n"
+msgstr ""
+
+#: src/LYrcFile.c:373
+msgid ""
+"accept_all_cookies allows the user to tell Lynx to automatically\n"
+"accept all cookies if desired. The default is \"FALSE\" which will\n"
+"prompt for each cookie. Set accept_all_cookies to \"TRUE\" to accept\n"
+"all cookies.\n"
+msgstr ""
+
+#: src/LYrcFile.c:381
+msgid ""
+"anonftp_password allows the user to tell Lynx to use the personal\n"
+"email address as the password for anonymous ftp. If no value is given,\n"
+"Lynx will use the personal email address. Set anonftp_password\n"
+"to a different value if you choose.\n"
+msgstr ""
+
+#: src/LYrcFile.c:390
+msgid ""
+"bookmark_file specifies the name and location of the default bookmark\n"
+"file into which the user can paste links for easy access at a later\n"
+"date.\n"
+msgstr ""
+
+#: src/LYrcFile.c:395
+msgid ""
+"If case_sensitive_searching is \"on\" then when the user invokes a search\n"
+"using the 's' or '/' keys, the search performed will be case sensitive\n"
+"instead of case INsensitive. The default is usually \"off\".\n"
+msgstr ""
+
+#: src/LYrcFile.c:400
+msgid ""
+"The character_set definition controls the representation of 8 bit\n"
+"characters for your terminal. If 8 bit characters do not show up\n"
+"correctly on your screen you may try changing to a different 8 bit\n"
+"set or using the 7 bit character approximations.\n"
+"Current valid characters sets are:\n"
+msgstr ""
+
+#: src/LYrcFile.c:408
+msgid ""
+"cookie_accept_domains and cookie_reject_domains are comma-delimited\n"
+"lists of domains from which Lynx should automatically accept or reject\n"
+"all cookies. If a domain is specified in both options, rejection will\n"
+"take precedence. The accept_all_cookies parameter will override any\n"
+"settings made here.\n"
+msgstr ""
+
+#: src/LYrcFile.c:416
+msgid ""
+"cookie_file specifies the file from which to read persistent cookies.\n"
+"The default is ~/"
+msgstr ""
+
+#: src/LYrcFile.c:421
+msgid ""
+"cookie_loose_invalid_domains, cookie_strict_invalid_domains, and\n"
+"cookie_query_invalid_domains are comma-delimited lists of which domains\n"
+"should be subjected to varying degrees of validity checking. If a\n"
+"domain is set to strict checking, strict conformance to RFC2109 will\n"
+"be applied. A domain with loose checking will be allowed to set cookies\n"
+"with an invalid path or domain attribute. All domains will default to\n"
+"querying the user for an invalid path or domain.\n"
+msgstr ""
+
+#: src/LYrcFile.c:435
+msgid ""
+"dir_list_order specifies the directory list order under DIRED_SUPPORT\n"
+"(if implemented). The default is \"ORDER_BY_NAME\"\n"
+msgstr ""
+
+#: src/LYrcFile.c:440
+msgid ""
+"dir_list_styles specifies the directory list style under DIRED_SUPPORT\n"
+"(if implemented). The default is \"MIXED_STYLE\", which sorts both\n"
+"files and directories together. \"FILES_FIRST\" lists files first and\n"
+"\"DIRECTORIES_FIRST\" lists directories first.\n"
+msgstr ""
+
+#: src/LYrcFile.c:448
+msgid ""
+"If emacs_keys is to \"on\" then the normal EMACS movement keys:\n"
+" ^N = down ^P = up\n"
+" ^B = left ^F = right\n"
+"will be enabled.\n"
+msgstr ""
+
+#: src/LYrcFile.c:454
+msgid ""
+"file_editor specifies the editor to be invoked when editing local files\n"
+"or sending mail. If no editor is specified, then file editing is disabled\n"
+"unless it is activated from the command line, and the built-in line editor\n"
+"will be used for sending mail.\n"
+msgstr ""
+
+#: src/LYrcFile.c:461
+msgid ""
+"The file_sorting_method specifies which value to sort on when viewing\n"
+"file lists such as FTP directories. The options are:\n"
+" BY_FILENAME -- sorts on the name of the file\n"
+" BY_TYPE -- sorts on the type of the file\n"
+" BY_SIZE -- sorts on the size of the file\n"
+" BY_DATE -- sorts on the date of the file\n"
+msgstr ""
+
+#: src/LYrcFile.c:492
+msgid ""
+"lineedit_mode specifies the key binding used for inputting strings in\n"
+"prompts and forms. If lineedit_mode is set to \"Default Binding\" then\n"
+"the following control characters are used for moving and deleting:\n"
+"\n"
+" Prev Next Enter = Accept input\n"
+" Move char: <- -> ^G = Cancel input\n"
+" Move word: ^P ^N ^U = Erase line\n"
+" Delete char: ^H ^R ^A = Beginning of line\n"
+" Delete word: ^B ^F ^E = End of line\n"
+"\n"
+"Current lineedit modes are:\n"
+msgstr ""
+
+#: src/LYrcFile.c:510
+msgid ""
+"The following allow you to define sub-bookmark files and descriptions.\n"
+"The format is multi_bookmark<capital_letter>=<filename>,<description>\n"
+"Up to 26 bookmark files (for the English capital letters) are allowed.\n"
+"We start with \"multi_bookmarkB\" since 'A' is the default (see above).\n"
+msgstr ""
+
+#: src/LYrcFile.c:516
+msgid ""
+"personal_mail_address specifies your personal mail address. The\n"
+"address will be sent during HTTP file transfers for authorization and\n"
+"logging purposes, and for mailed comments.\n"
+"If you do not want this information given out, set the NO_FROM_HEADER\n"
+"to TRUE in lynx.cfg, or use the -nofrom command line switch. You also\n"
+"could leave this field blank, but then you won't have it included in\n"
+"your mailed comments.\n"
+msgstr ""
+
+#: src/LYrcFile.c:525
+msgid ""
+"personal_mail_name specifies your personal name, for mail. The\n"
+"name is sent for mailed comments. Lynx will prompt for this,\n"
+"showing the configured value as a default when sending mail.\n"
+"This is not necessarily the same as a name provided as part of the\n"
+"personal_mail_address.\n"
+"Lynx does not save your changes to that default value as a side-effect\n"
+"of sending email. To update the default value, you must use the options\n"
+"menu, or modify this file directly.\n"
+msgstr ""
+
+#: src/LYrcFile.c:535
+msgid ""
+"preferred_charset specifies the character set in MIME notation (e.g.,\n"
+"ISO-8859-2, ISO-8859-5) which Lynx will indicate you prefer in requests\n"
+"to http servers using an Accept-Charset header. The value should NOT\n"
+"include ISO-8859-1 or US-ASCII, since those values are always assumed\n"
+"by default. May be a comma-separated list.\n"
+"If a file in that character set is available, the server will send it.\n"
+"If no Accept-Charset header is present, the default is that any\n"
+"character set is acceptable. If an Accept-Charset header is present,\n"
+"and if the server cannot send a response which is acceptable\n"
+"according to the Accept-Charset header, then the server SHOULD send\n"
+"an error response, though the sending of an unacceptable response\n"
+"is also allowed.\n"
+msgstr ""
+
+#: src/LYrcFile.c:553
+msgid ""
+"preferred_language specifies the language in MIME notation (e.g., en,\n"
+"fr, may be a comma-separated list in decreasing preference)\n"
+"which Lynx will indicate you prefer in requests to http servers.\n"
+"If a file in that language is available, the server will send it.\n"
+"Otherwise, the server will send the file in its default language.\n"
+msgstr ""
+
+#: src/LYrcFile.c:564
+msgid ""
+"If run_all_execution_links is set \"on\" then all local execution links\n"
+"will be executed when they are selected.\n"
+"\n"
+"WARNING - This is potentially VERY dangerous. Since you may view\n"
+" information that is written by unknown and untrusted sources\n"
+" there exists the possibility that Trojan horse links could be\n"
+" written. Trojan horse links could be written to erase files\n"
+" or compromise security. This should only be set to \"on\" if\n"
+" you are viewing trusted source information.\n"
+msgstr ""
+
+#: src/LYrcFile.c:575
+msgid ""
+"If run_execution_links_on_local_files is set \"on\" then all local\n"
+"execution links that are found in LOCAL files will be executed when they\n"
+"are selected. This is different from run_all_execution_links in that\n"
+"only files that reside on the local system will have execution link\n"
+"permissions.\n"
+"\n"
+"WARNING - This is potentially dangerous. Since you may view\n"
+" information that is written by unknown and untrusted sources\n"
+" there exists the possibility that Trojan horse links could be\n"
+" written. Trojan horse links could be written to erase files\n"
+" or compromise security. This should only be set to \"on\" if\n"
+" you are viewing trusted source information.\n"
+msgstr ""
+
+#: src/LYrcFile.c:593
+msgid ""
+"select_popups specifies whether the OPTIONs in a SELECT block which\n"
+"lacks a MULTIPLE attribute are presented as a vertical list of radio\n"
+"buttons or via a popup menu. Note that if the MULTIPLE attribute is\n"
+"present in the SELECT start tag, Lynx always will create a vertical list\n"
+"of checkboxes for the OPTIONs. A value of \"on\" will set popup menus\n"
+"as the default while a value of \"off\" will set use of radio boxes.\n"
+"The default can be overridden via the -popup command line toggle.\n"
+msgstr ""
+
+#: src/LYrcFile.c:604
+msgid ""
+"show_color specifies how to set the color mode at startup. A value of\n"
+"\"never\" will force color mode off (treat the terminal as monochrome)\n"
+"at startup even if the terminal appears to be color capable. A value of\n"
+"\"always\" will force color mode on even if the terminal appears to be\n"
+"monochrome, if this is supported by the library used to build lynx.\n"
+"A value of \"default\" will yield the behavior of assuming\n"
+"a monochrome terminal unless color capability is inferred at startup\n"
+"based on the terminal type, or the -color command line switch is used, or\n"
+"the COLORTERM environment variable is set. The default behavior always is\n"
+"used in anonymous accounts or if the \"option_save\" restriction is set.\n"
+"The effect of the saved value can be overridden via\n"
+"the -color and -nocolor command line switches.\n"
+"The mode set at startup can be changed via the \"show color\" option in\n"
+"the 'o'ptions menu. If the option settings are saved, the \"on\" and\n"
+"\"off\" \"show color\" settings will be treated as \"default\".\n"
+msgstr ""
+
+#: src/LYrcFile.c:621
+msgid ""
+"show_cursor specifies whether to 'hide' the cursor to the right (and\n"
+"bottom, if possible) of the screen, or to place it to the left of the\n"
+"current link in documents, or current option in select popup windows.\n"
+"Positioning the cursor to the left of the current link or option is\n"
+"helpful for speech or braille interfaces, and when the terminal is\n"
+"one which does not distinguish the current link based on highlighting\n"
+"or color. A value of \"on\" will set positioning to the left as the\n"
+"default while a value of \"off\" will set 'hiding' of the cursor.\n"
+"The default can be overridden via the -show_cursor command line toggle.\n"
+msgstr ""
+
+#: src/LYrcFile.c:632
+msgid ""
+"show_dotfiles specifies that the directory listing should include\n"
+"\"hidden\" (dot) files/directories. If set \"on\", this will be\n"
+"honored only if enabled via userdefs.h and/or lynx.cfg, and not\n"
+"restricted via a command line switch. If display of hidden files\n"
+"is disabled, creation of such files via Lynx also is disabled.\n"
+msgstr ""
+
+#: src/LYrcFile.c:643
+msgid ""
+"If sub_bookmarks is not turned \"off\", and multiple bookmarks have\n"
+"been defined (see below), then all bookmark operations will first\n"
+"prompt the user to select an active sub-bookmark file. If the default\n"
+"Lynx bookmark_file is defined (see above), it will be used as the\n"
+"default selection. When this option is set to \"advanced\", and the\n"
+"user mode is advanced, the 'v'iew bookmark command will invoke a\n"
+"statusline prompt instead of the menu seen in novice and intermediate\n"
+"user modes. When this option is set to \"standard\", the menu will be\n"
+"presented regardless of user mode.\n"
+msgstr ""
+
+#: src/LYrcFile.c:658
+msgid ""
+"user_mode specifies the users level of knowledge with Lynx. The\n"
+"default is \"NOVICE\" which displays two extra lines of help at the\n"
+"bottom of the screen to aid the user in learning the basic Lynx\n"
+"commands. Set user_mode to \"INTERMEDIATE\" to turn off the extra info.\n"
+"Use \"ADVANCED\" to see the URL of the currently selected link at the\n"
+"bottom of the screen.\n"
+msgstr ""
+
+#: src/LYrcFile.c:667
+msgid ""
+"If verbose_images is \"on\", lynx will print the name of the image\n"
+"source file in place of [INLINE], [LINK] or [IMAGE]\n"
+"See also VERBOSE_IMAGES in lynx.cfg\n"
+msgstr ""
+
+#: src/LYrcFile.c:672
+msgid ""
+"If vi_keys is set to \"on\", then the normal VI movement keys:\n"
+" j = down k = up\n"
+" h = left l = right\n"
+"will be enabled. These keys are only lower case.\n"
+"Capital 'H', 'J' and 'K will still activate help, jump shortcuts,\n"
+"and the keymap display, respectively.\n"
+msgstr ""
+
+#: src/LYrcFile.c:680
+msgid ""
+"The visited_links setting controls how Lynx organizes the information\n"
+"in the Visited Links Page.\n"
+msgstr ""
+
+#: src/LYrcFile.c:924
+msgid ""
+"If keypad_mode is set to \"NUMBERS_AS_ARROWS\", then the numbers on\n"
+"your keypad when the numlock is on will act as arrow keys:\n"
+" 8 = Up Arrow\n"
+" 4 = Left Arrow 6 = Right Arrow\n"
+" 2 = Down Arrow\n"
+"and the corresponding keyboard numbers will act as arrow keys,\n"
+"regardless of whether numlock is on.\n"
+msgstr ""
+
+#: src/LYrcFile.c:933
+msgid ""
+"If keypad_mode is set to \"LINKS_ARE_NUMBERED\", then numbers will\n"
+"appear next to each link and numbers are used to select links.\n"
+msgstr ""
+
+#: src/LYrcFile.c:937
+msgid ""
+"If keypad_mode is set to \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\", then\n"
+"numbers will appear next to each link and visible form input field.\n"
+"Numbers are used to select links, or to move the \"current link\" to a\n"
+"form input field or button. In addition, options in popup menus are\n"
+"indexed so that the user may type an option number to select an option in\n"
+"a popup menu, even if the option isn't visible on the screen. Reference\n"
+"lists and output from the list command also enumerate form inputs.\n"
+msgstr ""
+
+#: src/LYrcFile.c:946
+msgid ""
+"NOTE: Some fixed format documents may look disfigured when\n"
+"\"LINKS_ARE_NUMBERED\" or \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\" are\n"
+"enabled.\n"
+msgstr ""
+
+#: src/LYrcFile.c:978
+msgid ""
+"Lynx User Defaults File\n"
+"\n"
+msgstr ""
+
+#: src/LYrcFile.c:987
+msgid ""
+"This file contains options saved from the Lynx Options Screen (normally\n"
+"with the 'o' key). To save options with that screen, you must select the\n"
+"checkbox:\n"
+msgstr ""
+
+#: src/LYrcFile.c:994
+msgid ""
+"You must then save the settings using the link on the line above the\n"
+"checkbox:\n"
+msgstr ""
+
+#: src/LYrcFile.c:1001
+msgid ""
+"You may also use the command-line option \"-forms_options\", which displays\n"
+"the simpler Options Menu instead. Save options with that using the '>' "
+"key.\n"
+"\n"
+msgstr ""
+
+#: src/LYrcFile.c:1008
+msgid ""
+"This file contains options saved from the Lynx Options Screen (normally\n"
+"with the '>' key).\n"
+"\n"
+msgstr ""
+
+#: src/LYrcFile.c:1015
+msgid ""
+"There is normally no need to edit this file manually, since the defaults\n"
+"here can be controlled from the Options Screen, and the next time options\n"
+"are saved from the Options Screen this file will be completely rewritten.\n"
+"You have been warned...\n"
+"\n"
+"If you are looking for the general configuration file - it is normally\n"
+"called \"lynx.cfg\". It has different content and a different format.\n"
+"It is not this file.\n"
+msgstr ""
diff --git a/po/makefile.inn b/po/makefile.inn
new file mode 100644
index 0000000..52b253f
--- /dev/null
+++ b/po/makefile.inn
@@ -0,0 +1,300 @@
+# $LynxId: makefile.inn,v 1.32 2021/02/28 15:56:25 tom Exp $
+#
+# Makefile for program source directory in GNU NLS utilities package.
+# Copyright (C) 1995, 1996, 1997 by Ulrich Drepper <drepper@gnu.ai.mit.edu>
+#
+# This file may be copied and used freely without restrictions. It can
+# be used in projects which are not available under the GNU General
+# Public License but which still want to provide support for the GNU
+# gettext functionality.
+#
+# Please note that the actual code is *not* freely available.
+
+SHELL = /bin/sh
+@SET_MAKE@
+
+PACKAGE = @PACKAGE@
+VERSION = @VERSION@
+NLS_TEXTDOMAIN = @NLS_TEXTDOMAIN@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+
+DESTDIR = @DESTDIR@
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+datadir = @NLS_DATADIR@
+localedir = $(datadir)/locale
+gnulocaledir = $(prefix)/share/locale
+gettextsrcdir = $(prefix)/share/gettext/po
+
+subdir = po
+
+DATADIR = $(DESTDIR)$(datadir)
+LOCALEDIR = $(DESTDIR)$(localedir)
+GNULOCALEDIR = $(DESTDIR)$(gnulocaledir)
+GETTEXTSRCDIR = $(DESTDIR)$(gettextsrcdir)
+
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+
+CC = @CC@
+GENCAT = @GENCAT@
+GMSGFMT = PATH=../src:$$PATH @GMSGFMT@
+MSGFMT = @MSGFMT@
+XGETTEXT = PATH=../src:$$PATH @XGETTEXT@
+MSGMERGE = PATH=../src:$$PATH msgmerge
+
+DEFS = @DEFS@
+CFLAGS = @CFLAGS@
+CPPFLAGS = @CPPFLAGS@
+
+INCLUDES = -I.. -I$(top_srcdir)/intl
+
+COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS)
+
+SOURCES = # cat-id-tbl.c
+POFILES = @POFILES@
+GMOFILES = @GMOFILES@
+DISTFILES = ChangeLog makefile.inn POTFILES.in $(PACKAGE).pot \
+stamp-cat-id $(POFILES) $(GMOFILES) $(SOURCES)
+
+POTFILES = \
+
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
+INSTOBJEXT = @INSTOBJEXT@
+
+INSTOBJ = $(NLS_TEXTDOMAIN)$(INSTOBJEXT)
+
+.SUFFIXES:
+.SUFFIXES: .c .o .po .pox .gmo .mo .msg .cat
+
+.c.o:
+ @RULE_CC@
+ $(COMPILE) $<
+
+.po.pox:
+ $(MAKE) $(PACKAGE).pot
+ $(MSGMERGE) -w 132 $< $(srcdir)/$(PACKAGE).pot -o $*.pox
+
+.po.mo:
+ @echo "translating $< to $@"
+ @ECHO_CC@$(MSGFMT) -o $@ $<
+
+.po.gmo:
+ @echo "translating $< to $@"
+ @$(SHELL) -c 'LC_ALL=C \
+ sed -e s,http://lynx.browser.org/,@HOMEPAGE_URL@,g \
+ -e s,http://lynx.isc.org/,@HOMEPAGE_URL@,g $< >pass1-$(*F).tmp;\
+ if cmp -s $< pass1-$(*F).tmp; \
+ then \
+ echo ...no change made to homepage URL; \
+ else \
+ echo ...updated homepage URL;\
+ fi; \
+ if $(MSGMERGE) -w 132 pass1-$(*F).tmp $(srcdir)/$(PACKAGE).pot -o pass2-$(*F).tmp; \
+ then \
+ echo "...merged against $(srcdir)/$(PACKAGE).pot";\
+ else \
+ echo "...workaround without merging against $(srcdir)/$(PACKAGE).pot";\
+ cat $< >pass2-$(*F).tmp; \
+ fi '
+ @ECHO_CC@rm -f $@ && $(GMSGFMT) -o $@ pass2-$(*F).tmp
+ @-rm -f pass*-$(*F).tmp
+
+.po.cat:
+ @echo "translating $< to $@"
+ @ECHO_CC@sed -f ../intl/po2msg.sed < $< > $*.msg \
+ && rm -f $@ && $(GENCAT) $@ $*.msg
+
+
+all: all-@USE_NLS@
+
+all-yes: $(SOURCES) $(CATALOGS)
+all-no:
+
+en.po :
+ msginit --no-translator -l en -i $(PACKAGE).pot
+# cygwin's msginit 1.19.3 creates "en_US.po" rather than "en.po"...
+ @$(SHELL) -c 'for n in en*.po; \
+ do \
+ if test -f $$n; \
+ then \
+ test $$n != $@ && mv -vf $$n $@; \
+ break; \
+ fi \
+ done'
+
+$(srcdir)/$(PACKAGE).pot: $(POTFILES)
+ $(XGETTEXT) \
+ --default-domain=$(NLS_TEXTDOMAIN) \
+ --directory=$(top_srcdir) \
+ --add-comments \
+ --keyword=_ \
+ --keyword=N_ \
+ --files-from=$(srcdir)/POTFILES.in \
+ && test ! -f $(PACKAGE).po \
+ || ( rm -f $(srcdir)/$(PACKAGE).pot \
+ && ( sed -e 1,5d -e s/"Project-Id-Version: PACKAGE VERSION"/"Project-Id-Version: $(PACKAGE) $(VERSION)"/ $(PACKAGE).po > $(srcdir)/$(PACKAGE).pot ) )
+
+$(srcdir)/cat-id-tbl.c: stamp-cat-id; @:
+$(srcdir)/stamp-cat-id: $(PACKAGE).pot
+ rm -f cat-id-tbl.tmp
+ sed -f ../intl/po2tbl.sed $(srcdir)/$(PACKAGE).pot \
+ | sed -e "s/@PACKAGE NAME@/$(PACKAGE)/" > cat-id-tbl.tmp
+ if cmp -s cat-id-tbl.tmp $(srcdir)/cat-id-tbl.c; then \
+ rm cat-id-tbl.tmp; \
+ else \
+ echo cat-id-tbl.c changed; \
+ rm -f $(srcdir)/cat-id-tbl.c; \
+ mv cat-id-tbl.tmp $(srcdir)/cat-id-tbl.c; \
+ fi
+ ( cd $(srcdir) && rm -f stamp-cat-id && echo timestamp > stamp-cat-id )
+
+
+install: install-exec install-data
+install-exec:
+install-data: install-data-@USE_NLS@
+install-data-no: all
+install-data-yes: all
+ mkdir -p $(DATADIR)
+ @catalogs='$(CATALOGS)'; \
+ for cat in $$catalogs; do \
+ cat=`basename $$cat`; \
+ case "$$cat" in \
+ *.gmo) destdir=$(GNULOCALEDIR);; \
+ *) destdir=$(LOCALEDIR);; \
+ esac; \
+ lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \
+ dir=$$destdir/$$lang/LC_MESSAGES; \
+ mkdir -p $$dir; \
+ if test -r $$cat; then \
+ $(INSTALL_DATA) $$cat $$dir/$(INSTOBJ); \
+ echo "installing $$cat as $$dir/$(INSTOBJ)"; \
+ else \
+ $(INSTALL_DATA) $(srcdir)/$$cat $$dir/$(INSTOBJ); \
+ echo "installing $(srcdir)/$$cat as" \
+ "$$dir/$(INSTOBJ)"; \
+ fi; \
+ if test -r $$cat.m; then \
+ $(INSTALL_DATA) $$cat.m $$dir/$(INSTOBJ).m; \
+ echo "installing $$cat.m as $$dir/$(INSTOBJ).m"; \
+ else \
+ if test -r $(srcdir)/$$cat.m ; then \
+ $(INSTALL_DATA) $(srcdir)/$$cat.m \
+ $$dir/$(INSTOBJ).m; \
+ echo "installing $(srcdir)/$$cat as" \
+ "$$dir/$(INSTOBJ).m"; \
+ else \
+ true; \
+ fi; \
+ fi; \
+ done
+ if test "$(PACKAGE)" = "gettext"; then \
+ mkdir -p $(GETTEXTSRCDIR); \
+ $(INSTALL_DATA) $(srcdir)/makefile.inn \
+ $(GETTEXTSRCDIR)/makefile.inn; \
+ else \
+ : ; \
+ fi
+
+# Define this as empty until I find a useful application.
+installcheck:
+
+uninstall:
+ catalogs='$(CATALOGS)'; \
+ for cat in $$catalogs; do \
+ cat=`basename $$cat`; \
+ lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \
+ rm -f $(LOCALEDIR)/$$lang/LC_MESSAGES/$(INSTOBJ); \
+ rm -f $(LOCALEDIR)/$$lang/LC_MESSAGES/$(INSTOBJ).m; \
+ rm -f $(GNULOCALEDIR)/$$lang/LC_MESSAGES/$(INSTOBJ); \
+ rm -f $(GNULOCALEDIR)/$$lang/LC_MESSAGES/$(INSTOBJ).m; \
+ done
+ rm -f $(GETTEXTSRCDIR)/po-makefile.inn
+
+check: all
+
+cat-id-tbl.o: ../intl/libgettext.h
+
+dvi info tags TAGS ID:
+
+mostlyclean:
+ rm -f core core.* *.pox $(PACKAGE).po en.po *.old.po cat-id-tbl.tmp
+ rm -f *.gmo *.mo *.tmp
+ rm -fr *.o
+
+clean: mostlyclean
+
+distclean: clean
+ rm -f cat-id-tbl.c stamp-cat-id
+ rm -f makefile makefile.in POTFILES *.mo *.msg *.cat *.cat.m
+
+maintainer-clean: distclean
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+ rm -f $(GMOFILES)
+
+distdir = ../$(PACKAGE)-$(VERSION)/$(subdir)
+dist distdir: update-po $(DISTFILES)
+ dists="$(DISTFILES)"; \
+ for file in $$dists; do \
+ ln $(srcdir)/$$file $(distdir) 2> /dev/null \
+ || cp -p $(srcdir)/$$file $(distdir); \
+ done
+
+# GNU msgfmt -C option can also check for X/Open compat.
+check-po:
+ ( cd $(srcdir); \
+ catalogs='$(CATALOGS)'; \
+ for cat in $$catalogs; do \
+ cat=`basename $$cat`; \
+ lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \
+ echo "$$lang:"; \
+ $(MSGFMT) -f -c -v $$lang.po; \
+ done )
+
+update-po: makefile
+ $(MAKE) $(PACKAGE).pot
+ PATH=`pwd`/../src:$$PATH; \
+ ( cd $(srcdir); \
+ catalogs='$(CATALOGS)'; \
+ for cat in $$catalogs; do \
+ cat=`basename $$cat`; \
+ lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \
+ mv $$lang.po $$lang.old.po; \
+ echo "$$lang:"; \
+ if $(MSGMERGE) -w 132 $$lang.old.po $(PACKAGE).pot -o $$lang.po; then \
+ rm -f $$lang.old.po; \
+ else \
+ echo "msgmerge for $$cat failed!"; \
+ rm -f $$lang.po; \
+ mv $$lang.old.po $$lang.po; \
+ fi; \
+ done )
+
+POTFILES: POTFILES.in
+ ( if test 'x$(srcdir)' != 'x.'; then \
+ posrcprefix='$(top_srcdir)/'; \
+ else \
+ posrcprefix="../"; \
+ fi; \
+ rm -f $@-t $@ \
+ && (sed -e '/^#/d' -e '/^[ ]*$$/d' \
+ -e "s@.*@ $$posrcprefix& \\\\@" < $(srcdir)/$@.in \
+ | sed -e '$$s/\\$$//') > $@-t \
+ && chmod a-w $@-t \
+ && mv $@-t $@ )
+
+makefile: makefile.inn ../config.status POTFILES
+ ( cd .. \
+ && CONFIG_FILES=$(subdir)/$@.in:$(subdir)/$@.inn CONFIG_HEADERS= \
+ $(SHELL) ./config.status )
+
+# Tell versions [3.59,3.63) of GNU make not to export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/po/nl.po b/po/nl.po
new file mode 100644
index 0000000..f441658
--- /dev/null
+++ b/po/nl.po
@@ -0,0 +1,6462 @@
+# Dutch translations for lynx.
+# This file is distributed under the same license as the lynx package.
+#
+# "Foi toch, het zwien is dood en het schit nog!"
+#
+# Tijs van Bakel <smoke@casema.net>, 1999, 2000.
+# Luk Claes <luk.claes@ugent.be>, 2004.
+# Erwin Poeze <erwin.poeze@gmail.com>, 2012.
+# Benno Schulenberg <benno@vertaalt.nl>, 2008, 2015, 2016, 2019, 2021.
+msgid ""
+msgstr ""
+"Project-Id-Version: lynx-2.9.0-dev8\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-07-31 10:04-0400\n"
+"PO-Revision-Date: 2021-08-11 12:02+0200\n"
+"Last-Translator: Benno Schulenberg <vertaling@coevern.nl>\n"
+"Language-Team: Dutch <vertaling@vrijschrift.org>\n"
+"Language: nl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. ******************************************************************
+#. * The following definitions are for status line prompts, messages, or
+#. * warnings issued by Lynx during program execution. You can modify
+#. * them to make them more appropriate for your site. We recommend that
+#. * you extend these definitions to other languages using the gettext
+#. * library. There are also scattered uses of 'gettext()' throughout the
+#. * Lynx source, covering all but those messages which (a) are used for
+#. * debugging (CTRACE) or (b) are constants used in interaction with
+#. * other programs.
+#. *
+#. * See ABOUT-NLS and po/readme for details and location of contributed
+#. * translations. When no translation is available, the English default is
+#. * used.
+#.
+#: LYMessages.c:28
+#, c-format
+msgid "Alert!: %s"
+msgstr "Let op!: %s"
+
+#: LYMessages.c:29
+msgid "Welcome"
+msgstr "Welkom"
+
+#: LYMessages.c:30
+msgid "Are you sure you want to quit?"
+msgstr "Afsluiten?"
+
+#: LYMessages.c:32
+msgid "Really exit from Lynx?"
+msgstr "Lynx afsluiten?"
+
+#: LYMessages.c:34
+msgid "Connection interrupted."
+msgstr "Verbinding is onderbroken."
+
+#: LYMessages.c:35
+msgid "Data transfer interrupted."
+msgstr "Gegevensoverdracht is onderbroken."
+
+#: LYMessages.c:36
+msgid "Cancelled!!!"
+msgstr "Geannuleerd!"
+
+#: LYMessages.c:37
+msgid "Cancelling!"
+msgstr "Annuleren..."
+
+#: LYMessages.c:38
+msgid "Excellent!!!"
+msgstr "Prima!"
+
+#: LYMessages.c:39
+msgid "OK"
+msgstr "OK"
+
+#: LYMessages.c:40
+msgid "Done!"
+msgstr "Klaar!"
+
+#: LYMessages.c:41
+msgid "Bad request!"
+msgstr "Ongeldig verzoek!"
+
+#: LYMessages.c:42
+msgid "previous"
+msgstr "vorige"
+
+#: LYMessages.c:43
+msgid "next screen"
+msgstr "volgend scherm"
+
+#: LYMessages.c:44
+msgid "HELP!"
+msgstr "HELP!"
+
+#: LYMessages.c:45
+msgid ", help on "
+msgstr ", hulp bij "
+
+#. #define HELP
+#: LYMessages.c:47
+msgid "Commands: Use arrow keys to move, '?' for help, 'q' to quit, '<-' to go back."
+msgstr "Opdrachten: pijltjes verplaatsen, '?'=hulp, 'q'=afsluiten, '<-'=terug."
+
+#. #define MOREHELP
+#: LYMessages.c:49
+msgid "-- press space for more, use arrow keys to move, '?' for help, 'q' to quit."
+msgstr "-- spatiebalk=volgend blad, pijltjes verplaatsen, '?'=hulp, 'q'=afsluiten."
+
+#: LYMessages.c:50
+msgid "-- press space for next page --"
+msgstr "-- druk op spatiebalk voor volgend blad --"
+
+#: LYMessages.c:51
+msgid "URL too long"
+msgstr "URL is te lang"
+
+#. Inactive input fields, messages used with -tna option - kw
+#. #define FORM_LINK_TEXT_ADV_MSG_INA
+#: LYMessages.c:57
+#, c-format
+msgid "(Textfield \"%s\"); Inactive. Press <return> to activate."
+msgstr "(Tekstveld \"%s\") Niet actief. Druk op <Enter> om te activeren."
+
+#. #define FORM_LINK_TEXT_MESSAGE_INA
+#: LYMessages.c:59
+msgid "(Text entry field) Inactive. Press <return> to activate."
+msgstr "(Tekstinvoerveld) Niet actief. Druk op <Enter> om te activeren."
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG_INA
+#: LYMessages.c:61
+#, c-format
+msgid "(Textarea \"%s\"); Inactive. Press <return> to activate."
+msgstr "(Tekstgebied \"%s\") Niet actief. Druk op <Enter> om te activeren."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_INA
+#: LYMessages.c:63
+msgid "(Textarea) Inactive. Press <return> to activate."
+msgstr "(Tekstgebied) Niet actief. Druk op <Enter> om te activeren."
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG_INA_E
+#: LYMessages.c:65
+#, c-format
+msgid "(Textarea \"%s\"); Inactive. Press <return> to activate (%s for editor)."
+msgstr "(Tekstgebied \"%s\") Niet actief. Druk op <Enter> om te activeren (%s voor editor)."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_INA_E
+#: LYMessages.c:67
+#, c-format
+msgid "(Textarea) Inactive. Press <return> to activate (%s for editor)."
+msgstr "(Tekstgebied) Niet actief. Druk op <Enter> om te activeren (%s voor editor)."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE_INA
+#: LYMessages.c:69
+msgid "(Form field) Inactive. Use <return> to edit."
+msgstr "(Formulierveld) Niet actief. Gebruik <Enter> om te wijzigen."
+
+#. #define FORM_TEXT_SUBMIT_MESSAGE_INA_X
+#: LYMessages.c:71
+#, c-format
+msgid "(Form field) Inactive. Use <return> to edit (%s to submit with no cache)."
+msgstr "(Form.veld) Niet actief. Wijzig met <Enter> (%s = verzenden zonder cache)."
+
+#. #define FORM_TEXT_RESUBMIT_MESSAGE_INA
+#: LYMessages.c:73
+msgid "(Form field) Inactive. Press <return> to edit, press <return> twice to submit."
+msgstr "(Form.veld) Niet actief. Wijzig met <Enter>, verzenden met twee keer <Enter>."
+
+#. #define FORM_TEXT_SUBMIT_MAILTO_MSG_INA
+#: LYMessages.c:75
+msgid "(mailto form field) Inactive. Press <return> to change."
+msgstr "(E-mailformulierveld) Niet actief. Gebruik <Enter> om te wijzigen."
+
+#. #define FORM_LINK_PASSWORD_MESSAGE_INA
+#: LYMessages.c:77
+msgid "(Password entry field) Inactive. Press <return> to activate."
+msgstr "(Wachtwoordveld) Niet actief. Gebruik <Enter> om te activeren."
+
+#. #define FORM_LINK_FILE_UNM_MSG
+#: LYMessages.c:80
+msgid "UNMODIFIABLE file entry field. Use UP or DOWN arrows or tab to move off."
+msgstr "ONVERANDERBAAR bestandsnaaminvoerveld. Ga weg met pijltjes of <Tab>."
+
+#. #define FORM_LINK_FILE_MESSAGE
+#: LYMessages.c:82
+msgid "(File entry field) Enter filename. Use UP or DOWN arrows or tab to move off."
+msgstr "(Bestandsnaamveld) Voer een bestandsnaam in. Ga weg met pijltjes of <Tab>."
+
+#. #define FORM_LINK_TEXT_ADV_MSG
+#. #define FORM_LINK_TEXT_MESSAGE
+#: LYMessages.c:84 LYMessages.c:86
+#, c-format
+msgid "(Textfield \"%s\"); Enter text. Use UP or DOWN arrows or tab to move off."
+msgstr "(Tekstveld \"%s\") Voer tekst in. Ga weg met pijltjes of <Tab>."
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG
+#: LYMessages.c:88
+#, c-format
+msgid "(Textarea \"%s\"); Enter text. Use UP/DOWN arrows or TAB to move off."
+msgstr "(Tekstgebied \"%s\") Voer tekst in. Ga weg met pijltjes of <Tab>."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE
+#: LYMessages.c:90
+msgid "(Textarea) Enter text. Use UP/DOWN arrows or TAB to move off."
+msgstr "(Tekstgebied) Voer tekst in. Ga weg met pijltjes of <Tab>."
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG_E
+#: LYMessages.c:92
+#, c-format
+msgid "(Textarea \"%s\"); Enter text. Use UP/DOWN arrows or TAB to move off (%s for editor)."
+msgstr "(Tekstgebied \"%s\") Voer tekst in. Ga weg met pijltjes of <Tab> (%s voor editor)."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_E
+#: LYMessages.c:94
+#, c-format
+msgid "(Textarea) Enter text. Use UP/DOWN arrows or TAB to move off (%s for editor)."
+msgstr "(Tekstgebied) Voer tekst in. Ga weg met pijltjes of <Tab> (%s voor editor)."
+
+#. #define FORM_LINK_TEXT_UNM_MSG
+#: LYMessages.c:96
+msgid "UNMODIFIABLE form text field. Use UP or DOWN arrows or tab to move off."
+msgstr "ONVERANDERBAAR formuliertekstveld. Ga weg met pijltjes of <Tab>."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE
+#: LYMessages.c:98
+msgid "(Form field) Enter text. Use <return> to submit."
+msgstr "(Formulierveld) Voer tekst in. Verzend met <Enter>."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE_X
+#: LYMessages.c:100
+#, c-format
+msgid "(Form field) Enter text. Use <return> to submit (%s for no cache)."
+msgstr "(Formulierveld) Voer tekst in. Verzend met <Enter> (%s = geen cache)."
+
+#. #define FORM_LINK_TEXT_RESUBMIT_MESSAGE
+#: LYMessages.c:102
+msgid "(Form field) Enter text. Use <return> to submit, arrows or tab to move off."
+msgstr "(Form.veld) Voer tekst in. <Enter>=verzenden, ga weg met pijltjes of <Tab>."
+
+#. #define FORM_LINK_TEXT_SUBMIT_UNM_MSG
+#: LYMessages.c:104
+msgid "UNMODIFIABLE form field. Use UP or DOWN arrows or tab to move off."
+msgstr "ONVERANDERBAAR formulierveld. Ga weg met pijltjes of <Tab>."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MAILTO_MSG
+#: LYMessages.c:106
+msgid "(mailto form field) Enter text. Use <return> to submit, arrows to move off."
+msgstr "(E-mailformulierveld) Voer tekst in. Verzend met <Enter>, ga weg met pijltjes."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MAILTO_DIS_MSG
+#: LYMessages.c:108
+msgid "(mailto form field) Mail is disallowed so you cannot submit."
+msgstr "(E-mailformulierveld) Post verzenden is niet toegestaan; u kunt niets versturen."
+
+#. #define FORM_LINK_PASSWORD_MESSAGE
+#: LYMessages.c:110
+msgid "(Password entry field) Enter text. Use UP or DOWN arrows or tab to move off."
+msgstr "(Wachtwoordveld) Voer tekst in. Ga weg met pijltjes of <Tab>."
+
+#. #define FORM_LINK_PASSWORD_UNM_MSG
+#: LYMessages.c:112
+msgid "UNMODIFIABLE form password. Use UP or DOWN arrows or tab to move off."
+msgstr "ONVERANDERBAAR formulierwachtwoord. Ga weg met pijltjes of <Tab>."
+
+#. #define FORM_LINK_CHECKBOX_ADV_MSG
+#: LYMessages.c:114
+#, c-format
+msgid "(Checkbox \"%s\"); Use right-arrow or <return> to toggle."
+msgstr "(Aanvinkveld \"%s\") Gebruik pijltje-rechts of <Enter> om te veranderen."
+
+#. #define FORM_LINK_CHECKBOX_MESSAGE
+#: LYMessages.c:116
+msgid "(Checkbox Field) Use right-arrow or <return> to toggle."
+msgstr "(Aanvinkveld) Gebruik pijltje-rechts of <Enter> om te veranderen."
+
+#. #define FORM_LINK_CHECKBOX_UNM_MSG
+#: LYMessages.c:118
+msgid "UNMODIFIABLE form checkbox. Use UP or DOWN arrows or tab to move off."
+msgstr "ONVERANDERBAAR formulieraanvinkveld. Ga weg met pijltjes of <Tab>."
+
+#. #define FORM_LINK_RADIO_ADV_MSG
+#: LYMessages.c:120
+#, c-format
+msgid "(Radio Button \"%s\"); Use right-arrow or <return> to toggle."
+msgstr "(Drukknop \"%s\") Gebruik pijltje-rechts of <Enter> om te veranderen."
+
+#. #define FORM_LINK_RADIO_MESSAGE
+#: LYMessages.c:122
+msgid "(Radio Button) Use right-arrow or <return> to toggle."
+msgstr "(Drukknop) Gebruik pijltje-rechts of <Enter> om te veranderen."
+
+#. #define FORM_LINK_RADIO_UNM_MSG
+#: LYMessages.c:124
+msgid "UNMODIFIABLE form radio button. Use UP or DOWN arrows or tab to move off."
+msgstr "ONVERANDERBARE formulierdrukknop. Ga weg met pijltjes of <Tab>."
+
+#. #define FORM_LINK_SUBMIT_PREFIX
+#: LYMessages.c:126
+msgid "Submit ('x' for no cache) to "
+msgstr "Verzenden ('x' voor geen cache) naar "
+
+#. #define FORM_LINK_RESUBMIT_PREFIX
+#: LYMessages.c:128
+msgid "Submit to "
+msgstr "Verzenden naar "
+
+#. #define FORM_LINK_SUBMIT_MESSAGE
+#: LYMessages.c:130
+msgid "(Form submit button) Use right-arrow or <return> to submit ('x' for no cache)."
+msgstr "(Form.verzendknop) Verzend met pijltje-rechts of <Enter> ('x'-geen cache)."
+
+#. #define FORM_LINK_RESUBMIT_MESSAGE
+#: LYMessages.c:132
+msgid "(Form submit button) Use right-arrow or <return> to submit."
+msgstr "(Formulierverzendknop) Verzend met pijltje-rechts of <Enter>."
+
+#. #define FORM_LINK_SUBMIT_DIS_MSG
+#: LYMessages.c:134
+msgid "DISABLED form submit button. Use UP or DOWN arrows or tab to move off."
+msgstr "UITGESCHAKELDE formulierverzendknop. Ga weg met pijltjes of <Tab>."
+
+#. #define FORM_LINK_SUBMIT_MAILTO_PREFIX
+#: LYMessages.c:136
+msgid "Submit mailto form to "
+msgstr "E-mailformulier verzenden naar "
+
+#. #define FORM_LINK_SUBMIT_MAILTO_MSG
+#: LYMessages.c:138
+msgid "(mailto form submit button) Use right-arrow or <return> to submit."
+msgstr "(E-mailformulierverzendknop) Verzend met pijltje-rechts of <Enter>."
+
+#. #define FORM_LINK_SUBMIT_MAILTO_DIS_MSG
+#: LYMessages.c:140
+msgid "(mailto form submit button) Mail is disallowed so you cannot submit."
+msgstr "(E-mailformulierverzendknop) Post is niet toegestaan; u kunt niet verzenden."
+
+#. #define FORM_LINK_RESET_MESSAGE
+#: LYMessages.c:142
+msgid "(Form reset button) Use right-arrow or <return> to reset form to defaults."
+msgstr "(Formulierherstelknop) Herstel standaardwaarden met pijltje-rechts of <Enter>."
+
+#. #define FORM_LINK_RESET_DIS_MSG
+#: LYMessages.c:144
+msgid "DISABLED form reset button. Use UP or DOWN arrows or tab to move off."
+msgstr "UITGESCHAKELDE formulierherstelknop. Ga weg met pijltjes of <Tab>."
+
+#. #define FORM_LINK_BUTTON_MESSAGE
+#: LYMessages.c:146
+msgid "(Script button) Use UP or DOWN arrows or tab to move off."
+msgstr "(Scriptknop) Ga weg met pijltjestoetsen of <Tab>."
+
+#. #define FORM_LINK_BUTTON_ADV_MSG
+#: LYMessages.c:148
+#, c-format
+msgid "(Script button \"%s\"); Use UP or DOWN arrows or tab to move off."
+msgstr "(Scriptknop \"%s\") Ga weg met pijltjestoetsen of <Tab>."
+
+#. #define FORM_LINK_BUTTON_DIS_MSG
+#: LYMessages.c:150
+msgid "DISABLED Script button. Use UP or DOWN arrows or tab to move off."
+msgstr "UITGESCHAKELDE scriptknop. Ga weg met pijltjestoetsen of <Tab>."
+
+#. #define FORM_LINK_OPTION_LIST_ADV_MSG
+#: LYMessages.c:152
+#, c-format
+msgid "(Option list \"%s\"); Hit return to select option."
+msgstr "(Optielijst \"%s\") Druk op <Enter> om te kiezen."
+
+#. #define FORM_LINK_OPTION_LIST_MESSAGE
+#: LYMessages.c:154
+msgid "(Option list) Hit return and use arrow keys and return to select option."
+msgstr "(Optielijst) Druk op <Enter>, dan pijltjes en vervolgens <Enter> om te kiezen."
+
+#. #define CHOICE_LIST_ADV_MSG
+#: LYMessages.c:156
+#, c-format
+msgid "(Choice entry \"%s\"); Use arrow keys and return to select option."
+msgstr "(Keuze-item \"%s\") Gebruik pijltjestoetsen, of <Enter> om te kiezen."
+
+#. #define CHOICE_LIST_MESSAGE
+#: LYMessages.c:158
+msgid "(Choice list) Hit return and use arrow keys and return to select option."
+msgstr "(Keuzelijst) Druk op <Enter>, dan pijltjes en vervolgens <Enter> om te kiezen."
+
+#. #define MOUSE_CHOICE_MESSAGE
+#: LYMessages.c:160
+msgid "Left mouse button or return to select, arrow keys to scroll."
+msgstr "Linkermuisknop of <Enter> om te kiezen, pijltjestoetsen om te scrollen."
+
+#. #define FORM_LINK_OPTION_LIST_UNM_MSG
+#: LYMessages.c:162
+msgid "UNMODIFIABLE option list. Use return or arrow keys to review or leave."
+msgstr "ONVERANDERBARE optielijst. <Enter> of pijltjes om te bekijken of weg te gaan."
+
+#. #define CHOICE_LIST_UNM_MSG
+#: LYMessages.c:164
+msgid "UNMODIFIABLE choice list. Use return or arrow keys to review or leave."
+msgstr "ONVERANDERBARE keuzelijst. <Enter> of pijltjes om te bekijken of weg te gaan."
+
+#: LYMessages.c:165
+msgid "Submitting form..."
+msgstr "Verzenden van formulier..."
+
+#: LYMessages.c:166
+msgid "Resetting form..."
+msgstr "Herstellen van oningevuld formulier..."
+
+#. #define RELOADING_FORM
+#: LYMessages.c:168
+msgid "Reloading document. Any form entries will be lost!"
+msgstr "Bezig document te herladen. Alle formulierinvoer gaat verloren!"
+
+#. #define LINK_NOT_IN_FORM
+#: LYMessages.c:170
+msgid "The current link is not in a FORM"
+msgstr "De huidige koppeling zit niet in een formulier"
+
+#: LYMessages.c:171
+#, c-format
+msgid "Warning: Cannot transcode form data to charset %s!"
+msgstr "Waarschuwing: kan de formuliergegevens niet omzetten naar tekenset %s!"
+
+#. #define NORMAL_LINK_MESSAGE
+#: LYMessages.c:174
+msgid "(NORMAL LINK) Use right-arrow or <return> to activate."
+msgstr "(Gewone link) Activeer met pijltje-rechts of <Enter>."
+
+#: LYMessages.c:175
+msgid "The resource requested is not available at this time."
+msgstr "De gevraagde hulpbron is op dit moment niet beschikbaar."
+
+#: LYMessages.c:176
+msgid "Enter Lynx keystroke command: "
+msgstr "Voer een Lynx-sneltoetscommando in: "
+
+#: LYMessages.c:177
+msgid "Looking up "
+msgstr "Opzoeken van "
+
+#: LYMessages.c:178
+#, c-format
+msgid "Getting %s"
+msgstr "%s wordt opgehaald"
+
+#: LYMessages.c:179
+#, c-format
+msgid "Skipping %s"
+msgstr "%s wordt overgeslagen"
+
+#: LYMessages.c:180
+#, c-format
+msgid "Using %s"
+msgstr "%s wordt gebruikt"
+
+#: LYMessages.c:181
+#, c-format
+msgid "Illegal URL: %s"
+msgstr "Ongeldige URL: %s"
+
+#: LYMessages.c:182
+#, c-format
+msgid "Badly formed address %s"
+msgstr "Foutief adres %s"
+
+#: LYMessages.c:183
+#, c-format
+msgid "URL: %s"
+msgstr "URL: %s"
+
+#: LYMessages.c:184
+msgid "Unable to access WWW file!!!"
+msgstr "Kan WWW-bestand niet vinden!"
+
+#: LYMessages.c:185
+#, c-format
+msgid "This is a searchable index. Use %s to search."
+msgstr "Deze index kan doorzocht worden. Gebruik %s om te zoeken."
+
+#. #define WWW_INDEX_MORE_MESSAGE
+#: LYMessages.c:187
+#, c-format
+msgid "--More-- This is a searchable index. Use %s to search."
+msgstr "--Meer-- Deze index kan doorzocht worden. Gebruik %s om te zoeken."
+
+#: LYMessages.c:188
+msgid "You have entered an invalid link number."
+msgstr "U hebt een ongeldig linknummer ingevoerd."
+
+#. #define SOURCE_HELP
+#: LYMessages.c:190
+msgid "Currently viewing document source. Press '\\' to return to rendered version."
+msgstr "Dit is de brontekst van het document. Druk op '\\' voor de verwerkte versie."
+
+#. #define NOVICE_LINE_ONE
+#: LYMessages.c:192
+msgid " Arrow keys: Up and Down to move. Right to follow a link; Left to go back. \n"
+msgstr " Pijltje-op/neer=verplaatsen; rechts=link volgen; links=terug.\n"
+
+#. #define NOVICE_LINE_TWO
+#: LYMessages.c:194
+msgid " H)elp O)ptions P)rint G)o M)ain screen Q)uit /=search [delete]=history list \n"
+msgstr " H)ulp O)pties P)rint G)a naar M)-beginscherm Q)-stop /=zoek [bkspc]=historie\n"
+
+#. #define NOVICE_LINE_TWO_A
+#: LYMessages.c:196
+msgid " O)ther cmds H)elp K)eymap G)oto P)rint M)ain screen o)ptions Q)uit \n"
+msgstr " O)verige opdr H)ulp K)eymap G)a naar P)rint M)-beginscherm o)pties Q)-stop\n"
+
+#. #define NOVICE_LINE_TWO_B
+#: LYMessages.c:198
+msgid " O)ther cmds B)ack E)dit D)ownload ^R)eload ^W)ipe screen search doc: / \n"
+msgstr " O)verige opdr B)-terug E)dit D)ownload ^R)-herladen ^W)is scherm doorzoeken: /\n"
+
+#. #define NOVICE_LINE_TWO_C
+#: LYMessages.c:200
+msgid "O)ther cmds C)omment History: <backspace> Bookmarks: V)iew, A)dd, R)emove \n"
+msgstr "O)verige C)ommentaar <backspace>-Historie Boekenleggers: V)-inzien A)-toevoegen R)-wissen\n"
+
+#. #define FORM_NOVICELINE_ONE
+#: LYMessages.c:202
+msgid " Enter text into the field by typing on the keyboard "
+msgstr " Voer tekst in door te typen "
+
+#. #define FORM_NOVICELINE_TWO
+#: LYMessages.c:204
+msgid " Ctrl-U to delete all text in field, [Backspace] to delete a character "
+msgstr " Ctrl-U wist alle tekst in het invoerveld, [Backspace] wist één teken. "
+
+#. #define FORM_NOVICELINE_TWO_DELBL
+#: LYMessages.c:206
+msgid " Ctrl-U to delete text in field, [Backspace] to delete a character "
+msgstr " Ctrl-U wist tekst in het invoerveld, [Backspace] wist één teken "
+
+#. #define FORM_NOVICELINE_TWO_VAR
+#: LYMessages.c:208
+#, c-format
+msgid " %s to delete all text in field, [Backspace] to delete a character "
+msgstr " %s wist alle tekst in het invoerveld, [Backspace] wist één teken "
+
+#. #define FORM_NOVICELINE_TWO_DELBL_VAR
+#: LYMessages.c:210
+#, c-format
+msgid " %s to delete text in field, [Backspace] to delete a character "
+msgstr " %s wist tekst in het invoerveld, [Backspace] wist één teken "
+
+#. mailto
+#: LYMessages.c:213
+msgid "Malformed mailto form submission! Cancelled!"
+msgstr "Onjuist gevormde mailto-formulierverzending! Geannuleerd!"
+
+#: LYMessages.c:214
+msgid "Warning! Control codes in mail address replaced by ?"
+msgstr "Waarschuwing! Stuurcodes in mailadres zijn vervangen door ?"
+
+#: LYMessages.c:215
+msgid "Mail disallowed! Cannot submit."
+msgstr "U mag niet e-mailen! Gegevens kunnen niet worden verzonden."
+
+#: LYMessages.c:216
+msgid "Mailto form submission failed!"
+msgstr "Mailto-formulierverzending is mislukt!"
+
+#: LYMessages.c:217
+msgid "Mailto form submission Cancelled!!!"
+msgstr "Mailto-formulierverzending is geannuleerd!"
+
+#: LYMessages.c:218
+msgid "Sending form content..."
+msgstr "Gegevens worden verzonden..."
+
+#: LYMessages.c:219
+msgid "No email address is present in mailto URL!"
+msgstr "Er staat geen e-mailadres in de mailto-URL!"
+
+#. #define MAILTO_URL_TEMPOPEN_FAILED
+#: LYMessages.c:221
+msgid "Unable to open temporary file for mailto URL!"
+msgstr "Kan geen tijdelijk bestand voor mailto-URL openen!"
+
+#. #define INC_ORIG_MSG_PROMPT
+#: LYMessages.c:223
+msgid "Do you wish to include the original message?"
+msgstr "Wilt u het originele bericht opnemen?"
+
+#. #define INC_PREPARSED_MSG_PROMPT
+#: LYMessages.c:225
+msgid "Do you wish to include the preparsed source?"
+msgstr "Wilt u de voorverwerkte brontekst opnemen?"
+
+#. #define SPAWNING_EDITOR_FOR_MAIL
+#: LYMessages.c:227
+msgid "Spawning your selected editor to edit mail message"
+msgstr "Uw editor wordt gestart om het e-mailbericht te maken"
+
+#. #define ERROR_SPAWNING_EDITOR
+#: LYMessages.c:229
+msgid "Error spawning editor, check your editor definition in the options menu"
+msgstr "De editor wil niet starten; controleer de instellingen in het Optiesmenu"
+
+#: LYMessages.c:230
+msgid "Send this comment?"
+msgstr "Dit commentaar verzenden?"
+
+#: LYMessages.c:231
+msgid "Send this message?"
+msgstr "Dit bericht verzenden?"
+
+#: LYMessages.c:232
+msgid "Sending your message..."
+msgstr "Uw bericht wordt verzonden..."
+
+#: LYMessages.c:233
+msgid "Sending your comment:"
+msgstr "Uw commentaar wordt verzonden:"
+
+#. textarea
+#: LYMessages.c:236
+msgid "Not in a TEXTAREA; cannot use external editor."
+msgstr "Niet in een TEKSTVELD; kan geen externe editor gebruiken."
+
+#: LYMessages.c:237
+msgid "Not in a TEXTAREA; cannot use command."
+msgstr "Niet in een TEKSTVELD; dit commando heeft hier geen zin."
+
+#: LYMessages.c:239
+msgid "file: ACTIONs are disallowed!"
+msgstr "bestand: ACTIEs zijn niet toegestaan!"
+
+#. #define FILE_SERVED_LINKS_DISALLOWED
+#: LYMessages.c:241
+msgid "file: URLs via served links are disallowed!"
+msgstr "bestand: URL's via aangeboden links zijn niet toegestaan!"
+
+#: LYMessages.c:242
+msgid "Access to local files denied."
+msgstr "Toegang tot lokale bestanden is geweigerd."
+
+#: LYMessages.c:243
+msgid "file: URLs via bookmarks are disallowed!"
+msgstr "bestand: URL's via boekenleggers zijn niet toegestaan!"
+
+#. #define SPECIAL_VIA_EXTERNAL_DISALLOWED
+#: LYMessages.c:245
+msgid "This special URL is not allowed in external documents!"
+msgstr "Deze specifieke URL is niet toegestaan in externe documenten!"
+
+#: LYMessages.c:246
+msgid "Press <return> to return to Lynx."
+msgstr "Druk op <Enter> om terug te keren naar Lynx."
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:249
+msgid "Spawning DCL subprocess. Use 'logout' to return to Lynx.\n"
+msgstr "DCL-subproces wordt gestart. Gebruik 'logout' om terug te keren naar Lynx.\n"
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:253
+msgid "Type EXIT to return to Lynx.\n"
+msgstr "Typ 'exit' om terug te keren naar Lynx.\n"
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:256
+msgid "Spawning your default shell. Use 'exit' to return to Lynx.\n"
+msgstr "Uw standaardshell wordt aangeroepen. Typ 'exit' om terug te keren naar Lynx.\n"
+
+#: LYMessages.c:259
+msgid "Spawning is currently disabled."
+msgstr "Het starten van externe programma's is uitgeschakeld."
+
+#: LYMessages.c:260
+msgid "The 'd'ownload command is currently disabled."
+msgstr "Het 'd'ownload-commando is momenteel uitgeschakeld."
+
+#: LYMessages.c:261
+msgid "You cannot download an input field."
+msgstr "U kunt niet downloaden in een invoerveld."
+
+#: LYMessages.c:262
+msgid "Form has a mailto action! Cannot download."
+msgstr "Formulier heeft een mailto-actie! Kan niet downloaden."
+
+#: LYMessages.c:263
+msgid "You cannot download a mailto: link."
+msgstr "U kunt een 'mailto:'-koppeling niet downloaden."
+
+#: LYMessages.c:264
+msgid "You cannot download cookies."
+msgstr "U kunt koekjes niet downloaden."
+
+#: LYMessages.c:265
+msgid "You cannot download a printing option."
+msgstr "U kunt een printopdracht niet downloaden."
+
+#: LYMessages.c:266
+msgid "You cannot download an upload option."
+msgstr "U kunt een upload-optie niet downloaden."
+
+#: LYMessages.c:267
+msgid "You cannot download an permit option."
+msgstr "U kunt een toestemmingsoptie niet downloaden."
+
+#: LYMessages.c:268
+msgid "This special URL cannot be downloaded!"
+msgstr "Deze specifieke URL kan niet worden gedownload!"
+
+#: LYMessages.c:269
+msgid "Nothing to download."
+msgstr "Er is niets om te downloaden."
+
+#: LYMessages.c:270
+msgid "Trace ON!"
+msgstr "Traceren AAN!"
+
+#: LYMessages.c:271
+msgid "Trace OFF!"
+msgstr "Traceren UIT!"
+
+#. #define CLICKABLE_IMAGES_ON
+#: LYMessages.c:273
+msgid "Links will be included for all images! Reloading..."
+msgstr "Links voor alle afbeeldingen worden opgenomen! Herladen..."
+
+#. #define CLICKABLE_IMAGES_OFF
+#: LYMessages.c:275
+msgid "Standard image handling restored! Reloading..."
+msgstr "Normale afhandeling van afbeeldingen is hersteld! Herladen..."
+
+#. #define PSEUDO_INLINE_ALTS_ON
+#: LYMessages.c:277
+msgid "Pseudo_ALTs will be inserted for inlines without ALT strings! Reloading..."
+msgstr "Pseudo-ALT's worden ingevoegd voor inlines zonder ALT-strings! Herladen..."
+
+#. #define PSEUDO_INLINE_ALTS_OFF
+#: LYMessages.c:279
+msgid "Inlines without an ALT string specified will be ignored! Reloading..."
+msgstr "Inlines zonder ALT-strings worden genegeerd! Herladen..."
+
+#: LYMessages.c:280
+msgid "Raw 8-bit or CJK mode toggled OFF! Reloading..."
+msgstr "Ruwe 8-bit- of CJK-modus is UITgezet! Herladen..."
+
+#: LYMessages.c:281
+msgid "Raw 8-bit or CJK mode toggled ON! Reloading..."
+msgstr "Ruwe 8-bit- of CJK-modus is AANgezet! Herladen..."
+
+#. #define HEAD_D_L_OR_CANCEL
+#: LYMessages.c:283
+msgid "Send HEAD request for D)ocument or L)ink, or C)ancel? (d,l,c): "
+msgstr "'HEAD'-verzoek verzenden voor D)ocument, L)ink of C)-annuleren? (d,l,c): "
+
+#. #define HEAD_D_OR_CANCEL
+#: LYMessages.c:285
+msgid "Send HEAD request for D)ocument, or C)ancel? (d,c): "
+msgstr "'HEAD'-verzoek verzenden voor D)ocument of C)-annuleren? (d,c): "
+
+#: LYMessages.c:286
+msgid "Sorry, the document is not an http URL."
+msgstr "Sorry, het document is geen http-URL."
+
+#: LYMessages.c:287
+msgid "Sorry, the link is not an http URL."
+msgstr "Sorry, de link is geen http-URL."
+
+#: LYMessages.c:288
+msgid "Sorry, the ACTION for this form is disabled."
+msgstr "Sorry, de ACTIE voor dit formulier is uitgeschakeld."
+
+#. #define FORM_ACTION_NOT_HTTP_URL
+#: LYMessages.c:290
+msgid "Sorry, the ACTION for this form is not an http URL."
+msgstr "Sorry, de ACTIE voor dit formulier is geen http-URL."
+
+#: LYMessages.c:291
+msgid "Not an http URL or form ACTION!"
+msgstr "Niet een http-URL of formulier-ACTIE!"
+
+#: LYMessages.c:292
+msgid "This special URL cannot be a form ACTION!"
+msgstr "Deze specifieke URL kan geen formulier-ACTIE zijn!"
+
+#: LYMessages.c:293
+msgid "URL is not in starting realm!"
+msgstr "URL is niet in begin-omgeving!"
+
+#: LYMessages.c:294
+msgid "News posting is disabled!"
+msgstr "Nieuwsberichten zenden is uitgeschakeld!"
+
+#: LYMessages.c:295
+msgid "File management support is disabled!"
+msgstr "Bestandsbeheer is uitgeschakeld!"
+
+#: LYMessages.c:296
+msgid "No jump file is currently available."
+msgstr "Er is momenteel geen snelkoppelingenbestand beschikbaar."
+
+#: LYMessages.c:297
+msgid "Jump to (use '?' for list): "
+msgstr "Spring naar ('?' toont een lijst): "
+
+#: LYMessages.c:298
+msgid "Jumping to a shortcut URL is disallowed!"
+msgstr "Springen naar een snelkoppeling-URL is niet toegestaan!"
+
+#: LYMessages.c:299
+msgid "Random URL is disallowed! Use a shortcut."
+msgstr "Willekeurige URL is niet toegestaan! Gebruik een sneltoets."
+
+#: LYMessages.c:300
+msgid "No random URLs have been used thus far."
+msgstr "Tot nog toe zijn er geen willeukeurige URL's gebruikt."
+
+#: LYMessages.c:301
+msgid "Bookmark features are currently disabled."
+msgstr "Boekenleggerfuncties zijn momenteel uitgeschakeld."
+
+#: LYMessages.c:302
+msgid "Execution via bookmarks is disabled."
+msgstr "Uitvoeren via boekenleggers is uitgeschakeld."
+
+#. #define BOOKMARK_FILE_NOT_DEFINED
+#: LYMessages.c:304
+#, c-format
+msgid "Bookmark file is not defined. Use %s to see options."
+msgstr "Boekenleggerbestand is niet opgegeven. Gebruik %s om de opties te zien."
+
+#. #define NO_TEMP_FOR_HOTLIST
+#: LYMessages.c:306
+msgid "Unable to open tempfile for X Mosaic hotlist conversion."
+msgstr "Kan geen tijdelijk bestand openen voor 'X Mosaic hotlist'-conversie."
+
+#: LYMessages.c:307
+msgid "ERROR - unable to open bookmark file."
+msgstr "FOUT -- Kan boekenleggerbestand niet openen."
+
+#. #define BOOKMARK_OPEN_FAILED_FOR_DEL
+#: LYMessages.c:309
+msgid "Unable to open bookmark file for deletion of link."
+msgstr "Kan boekenleggerbestand niet openen om link te verwijderen."
+
+#. #define BOOKSCRA_OPEN_FAILED_FOR_DEL
+#: LYMessages.c:311
+msgid "Unable to open scratch file for deletion of link."
+msgstr "Kan geen kladbestand openen om link te verwijderen."
+
+#: LYMessages.c:313
+msgid "Error renaming scratch file."
+msgstr "Fout bij het hernoemen van kladbestand."
+
+#: LYMessages.c:315
+msgid "Error renaming temporary file."
+msgstr "Fout bij het hernoemen van tijdelijk bestand."
+
+#. #define BOOKTEMP_COPY_FAIL
+#: LYMessages.c:317
+msgid "Unable to copy temporary file for deletion of link."
+msgstr "Kan tijdelijk bestand niet kopiëren om link te verwijderen."
+
+#. #define BOOKTEMP_REOPEN_FAIL_FOR_DEL
+#: LYMessages.c:319
+msgid "Unable to reopen temporary file for deletion of link."
+msgstr "Kan tijdelijk bestand niet heropenen om link te verwijderen."
+
+#. #define BOOKMARK_LINK_NOT_ONE_LINE
+#: LYMessages.c:322
+msgid "Link is not by itself all on one line in bookmark file."
+msgstr "De link gebruikt meer dan één regel in het boekenleggerbestand."
+
+#: LYMessages.c:323
+msgid "Bookmark deletion failed."
+msgstr "Wissen van boekenlegger is mislukt."
+
+#. #define BOOKMARKS_NOT_TRAVERSED
+#: LYMessages.c:325
+msgid "Bookmark files cannot be traversed (only http URLs)."
+msgstr "Boekenleggerbestanden kunnen niet doorkruist worden (alleen http-URL's)."
+
+#. #define BOOKMARKS_NOT_OPEN
+#: LYMessages.c:327
+msgid "Unable to open bookmark file, use 'a' to save a link first"
+msgstr "Kan boekenleggerbestand niet openen; gebruik 'a' om de link eerst op te slaan"
+
+#: LYMessages.c:328
+msgid "There are no links in this bookmark file!"
+msgstr "Er zijn geen links in dit boekenleggerbestand!"
+
+#. #define CACHE_D_OR_CANCEL
+#: LYMessages.c:330
+msgid "D)elete cached document or C)ancel? (d,c): "
+msgstr "Gecachet document D)-verwijderen of C)-annuleren? (d,c): "
+
+#. #define BOOK_D_L_OR_CANCEL
+#: LYMessages.c:332
+msgid "Save D)ocument or L)ink to bookmark file or C)ancel? (d,l,c): "
+msgstr "Opslaan in boekenleggerbestand: D)ocument, L)ink of C)-annuleren? (d,l,c): "
+
+#: LYMessages.c:333
+msgid "Save D)ocument to bookmark file or C)ancel? (d,c): "
+msgstr "Opslaan in boekenleggerbestand: D)ocument of C)-annuleren? (d,c): "
+
+#: LYMessages.c:334
+msgid "Save L)ink to bookmark file or C)ancel? (l,c): "
+msgstr "Opslaan in boekenleggerbestand: L)ink of C)-annuleren? (l,c): "
+
+#. #define NOBOOK_POST_FORM
+#: LYMessages.c:336
+msgid "Documents from forms with POST content cannot be saved as bookmarks."
+msgstr "Kan geen boekenlegger maken van document van formulier met POST-informatie."
+
+#: LYMessages.c:337
+msgid "Cannot save form fields/links"
+msgstr "Kan formuliervelden/-links niet opslaan"
+
+#. #define NOBOOK_HSML
+#: LYMessages.c:339
+msgid "History, showinfo, menu and list files cannot be saved as bookmarks."
+msgstr "Kan geen boekenleggers maken van historie, info-overzicht, menu of lijsten."
+
+#. #define CONFIRM_BOOKMARK_DELETE
+#: LYMessages.c:341
+msgid "Do you really want to delete this link from your bookmark file?"
+msgstr "Deze link echt uit het boekenleggerbestand verwijderen?"
+
+#: LYMessages.c:342
+msgid "Malformed address."
+msgstr "Ongeldig adres."
+
+#. #define HISTORICAL_ON_MINIMAL_OFF
+#: LYMessages.c:344
+msgid "Historical comment parsing ON (Minimal is overridden)!"
+msgstr "Oorspronkelijke commentaarverwerking AAN (Minimale methode is onderdrukt)!"
+
+#. #define HISTORICAL_OFF_MINIMAL_ON
+#: LYMessages.c:346
+msgid "Historical comment parsing OFF (Minimal is in effect)!"
+msgstr "Oorspronkelijke commentaarverwerking UIT (Minimale methode is actief)!"
+
+#. #define HISTORICAL_ON_VALID_OFF
+#: LYMessages.c:348
+msgid "Historical comment parsing ON (Valid is overridden)!"
+msgstr "Oorspronkelijke commentaarverwerking AAN (Geldige methode is onderdrukt)!"
+
+#. #define HISTORICAL_OFF_VALID_ON
+#: LYMessages.c:350
+msgid "Historical comment parsing OFF (Valid is in effect)!"
+msgstr "Oorspronkelijke commentaarverwerking UIT (Geldige methode is actief)!"
+
+#. #define MINIMAL_ON_IN_EFFECT
+#: LYMessages.c:352
+msgid "Minimal comment parsing ON (and in effect)!"
+msgstr "Minimale verwerking van commentaar AAN (en actief)!"
+
+#. #define MINIMAL_OFF_VALID_ON
+#: LYMessages.c:354
+msgid "Minimal comment parsing OFF (Valid is in effect)!"
+msgstr "Minimale verwerking van commentaar UIT (Geldige methode is actief)!"
+
+#. #define MINIMAL_ON_BUT_HISTORICAL
+#: LYMessages.c:356
+msgid "Minimal comment parsing ON (but Historical is in effect)!"
+msgstr "Minimale verwerking van commentaar AAN (Oorspronkelijke methode is actief)!"
+
+#. #define MINIMAL_OFF_HISTORICAL_ON
+#: LYMessages.c:358
+msgid "Minimal comment parsing OFF (Historical is in effect)!"
+msgstr "Minimale verwerking van commentaar UIT (Oorspronkelijke methode is actief)!"
+
+#: LYMessages.c:359
+msgid "Soft double-quote parsing ON!"
+msgstr "'Soft double-quote' ontleden AAN!"
+
+#: LYMessages.c:360
+msgid "Soft double-quote parsing OFF!"
+msgstr "'Soft double-quote' ontleden UIT!"
+
+#: LYMessages.c:361
+msgid "Now using TagSoup parsing of HTML."
+msgstr "Vanaf nu wordt 'TagSoup' gebruikt om HTML te ontleden."
+
+#: LYMessages.c:362
+msgid "Now using SortaSGML parsing of HTML!"
+msgstr "Vanaf nu wordt 'SortaSGML' gebruikt om HTML te ontleden."
+
+#: LYMessages.c:363
+msgid "You are already at the end of this document."
+msgstr "Dit is het einde van het document."
+
+#: LYMessages.c:364
+msgid "You are already at the beginning of this document."
+msgstr "Dit is het begin van het document."
+
+#: LYMessages.c:365
+#, c-format
+msgid "You are already at page %d of this document."
+msgstr "Dit is pagina %d van dit document."
+
+#: LYMessages.c:366
+#, c-format
+msgid "Link number %d already is current."
+msgstr "Linknummer %d is al geselecteerd."
+
+#: LYMessages.c:367
+msgid "You are already at the first document"
+msgstr "Dit is het eerste document."
+
+#: LYMessages.c:368
+msgid "There are no links above this line of the document."
+msgstr "Boven deze regel zijn er geen links in dit document."
+
+#: LYMessages.c:369
+msgid "There are no links below this line of the document."
+msgstr "Beneden deze regel zijn er geen links in dit document."
+
+#. #define MAXLEN_REACHED_DEL_OR_MOV
+#: LYMessages.c:371
+msgid "Maximum length reached! Delete text or move off field."
+msgstr "Maximale lengte is bereikt! Verwijder tekst of ga hier weg."
+
+#. #define NOT_ON_SUBMIT_OR_LINK
+#: LYMessages.c:373
+msgid "You are not on a form submission button or normal link."
+msgstr "U staat niet op een formulierverzendknop of op een normale link."
+
+#. #define NEED_CHECKED_RADIO_BUTTON
+#: LYMessages.c:375
+msgid "One radio button must be checked at all times!"
+msgstr "Er moet altijd één keuzeknop ingedrukt zijn!"
+
+#: LYMessages.c:376
+msgid "No submit button for this form, submit single text field?"
+msgstr "Geen invoerknop aanwezig voor dit formulier; het enige tekstveld verzenden?"
+
+#: LYMessages.c:377
+msgid "Do you want to go back to the previous document?"
+msgstr "Wilt u teruggaan naar het vorige document?"
+
+#: LYMessages.c:378
+msgid "Use arrows or tab to move off of field."
+msgstr "Gebruik pijltjes of <Tab> om weg te gaan van dit veld."
+
+#. #define ENTER_TEXT_ARROWS_OR_TAB
+#: LYMessages.c:380
+msgid "Enter text. Use arrows or tab to move off of field."
+msgstr "Voer tekst in. Ga weg met pijltjes of <Tab>."
+
+#: LYMessages.c:381
+msgid "** Bad HTML!! No form action defined. **"
+msgstr "** Onjuiste HTML!! Geen formulieractie gedefinieerd. **"
+
+#: LYMessages.c:382
+msgid "Bad HTML!! Unable to create popup window!"
+msgstr "Onjuiste HTML!! Kan geen popup-venster aanmaken!"
+
+#: LYMessages.c:383
+msgid "Unable to create popup window!"
+msgstr "Kan geen popup-venster aanmaken!"
+
+#: LYMessages.c:384
+msgid "Goto a random URL is disallowed!"
+msgstr "Naar een willekeurige URL gaan is niet toegestaan!"
+
+#: LYMessages.c:385
+msgid "Goto a non-http URL is disallowed!"
+msgstr "Naar een niet-http-URL gaan is niet toegestaan!"
+
+#: LYMessages.c:386
+#, c-format
+msgid "You are not allowed to goto \"%s\" URLs"
+msgstr "Het is niet toegestaan naar \"%s\"-URL's te gaan"
+
+#: LYMessages.c:387
+msgid "URL to open: "
+msgstr "Te openen URL: "
+
+#: LYMessages.c:388
+msgid "Edit the current Goto URL: "
+msgstr "Wijzig de huidige Ga-naar URL: "
+
+#: LYMessages.c:389
+msgid "Edit the previous Goto URL: "
+msgstr "Wijzig de vorige Ga-naar URL: "
+
+#: LYMessages.c:390
+msgid "Edit a previous Goto URL: "
+msgstr "Wijzig een voorgaande Ga-naar URL: "
+
+#: LYMessages.c:391
+msgid "Current document has POST data."
+msgstr "Huidige document bevat geen POST-informatie."
+
+#: LYMessages.c:392
+msgid "Edit this document's URL: "
+msgstr "Wijzig de URL van dit document: "
+
+#: LYMessages.c:393
+msgid "Edit the current link's URL: "
+msgstr "Wijzig de URL van de huidige link: "
+
+#: LYMessages.c:394
+msgid "Edit the form's submit-URL: "
+msgstr "Wijzig het verzendadres van dit formulier: "
+
+#: LYMessages.c:395
+msgid "You cannot edit File Management URLs"
+msgstr "U kunt Bestandsbeheeradressen niet wijzigen"
+
+#: LYMessages.c:396
+msgid "Enter a database query: "
+msgstr "Voer een databankopdracht in: "
+
+#: LYMessages.c:397
+msgid "Enter a whereis query: "
+msgstr "Voer een zoekopdracht in: "
+
+#: LYMessages.c:398
+msgid "Edit the current query: "
+msgstr "Wijzig de huidige opdracht: "
+
+#: LYMessages.c:399
+msgid "Edit the previous query: "
+msgstr "Wijzig de vorige opdracht: "
+
+#: LYMessages.c:400
+msgid "Edit a previous query: "
+msgstr "Wijzig een voorgaande opdracht: "
+
+#. #define USE_C_R_TO_RESUB_CUR_QUERY
+#: LYMessages.c:402
+msgid "Use Control-R to resubmit the current query."
+msgstr "Gebruik Ctrl-R om de huidige opdracht nog eens te verzenden."
+
+#: LYMessages.c:403
+msgid "Edit the current shortcut: "
+msgstr "Wijzig de huidige snelkoppeling: "
+
+#: LYMessages.c:404
+msgid "Edit the previous shortcut: "
+msgstr "Wijzig de vorige snelkoppeling: "
+
+#: LYMessages.c:405
+msgid "Edit a previous shortcut: "
+msgstr "Wijzig een voorgaande snelkoppeling: "
+
+#: LYMessages.c:406
+#, c-format
+msgid "Key '%c' is not mapped to a jump file!"
+msgstr "Toets '%c' is niet gebonden aan een snelkoppelingenbestand!"
+
+#: LYMessages.c:407
+msgid "Cannot locate jump file!"
+msgstr "Kan snelkoppelingenbestand niet vinden!"
+
+#: LYMessages.c:408
+msgid "Cannot open jump file!"
+msgstr "Kan snelkoppelingenbestand niet openen!"
+
+#: LYMessages.c:409
+msgid "Error reading jump file!"
+msgstr "Fout bij lezen van snelkoppelingenbestand!"
+
+#: LYMessages.c:410
+msgid "Out of memory reading jump file!"
+msgstr "Geen geheugen meer beschikbaar tijdens lezen van snelkoppelingenbestand!"
+
+#: LYMessages.c:411
+msgid "Out of memory reading jump table!"
+msgstr "Geen geheugen meer beschikbaar tijdens lezen van snelkoppelingentabel!"
+
+#: LYMessages.c:412
+msgid "No index is currently available."
+msgstr "Er is momenteel geen index beschikbaar."
+
+#. #define CONFIRM_MAIN_SCREEN
+#: LYMessages.c:414
+msgid "Do you really want to go to the Main screen?"
+msgstr "Wilt u echt naar het beginscherm gaan?"
+
+#: LYMessages.c:415
+msgid "You are already at main screen!"
+msgstr "U bent al in het beginscherm!"
+
+#. #define NOT_ISINDEX
+#: LYMessages.c:417
+msgid "Not a searchable indexed document -- press '/' to search for a text string"
+msgstr "Dit is geen geïndexeerd document -- gebruik '/' om een tekenreeks te zoeken"
+
+#. #define NO_OWNER
+#: LYMessages.c:419
+msgid "No owner is defined for this file so you cannot send a comment"
+msgstr "Er is geen eigenaar genoemd voor dit bestand, dus u kunt geen commentaar zenden"
+
+#: LYMessages.c:420
+#, c-format
+msgid "No owner is defined. Use %s?"
+msgstr "Er is geen eigenaar gedefinieerd. %s gebruiken?"
+
+#: LYMessages.c:421
+msgid "Do you wish to send a comment?"
+msgstr "Wilt u commentaar versturen?"
+
+#: LYMessages.c:422
+msgid "Mail is disallowed so you cannot send a comment"
+msgstr "E-mail is niet toegestaan, dus u kunt geen commentaar zenden"
+
+#: LYMessages.c:423
+msgid "The 'e'dit command is currently disabled."
+msgstr "Het 'e'dit-commando is momenteel uitgeschakeld."
+
+#: LYMessages.c:424
+msgid "External editing is currently disabled."
+msgstr "Extern editen is momenteel uitgeschakeld."
+
+#: LYMessages.c:425
+msgid "System error - failure to get status."
+msgstr "Systeemfout -- status opvragen is mislukt."
+
+#: LYMessages.c:426
+msgid "No editor is defined!"
+msgstr "Er is geen editor opgegeven!"
+
+#: LYMessages.c:427
+msgid "The 'p'rint command is currently disabled."
+msgstr "Het 'p'rint-commando is momenteel uitgeschakeld."
+
+#: LYMessages.c:428
+msgid "Document has no Toolbar links or Banner."
+msgstr "Het document heeft geen Werkbalk-links of koptekst."
+
+#: LYMessages.c:429
+msgid "Unable to open traversal file."
+msgstr "Kan bestand met doorkruisingen niet openen."
+
+#: LYMessages.c:430
+msgid "Unable to open traversal found file."
+msgstr "Kan bestand met gevonden doorkruisingen niet openen."
+
+#: LYMessages.c:431
+msgid "Unable to open reject file."
+msgstr "Kan bestand met verwerpingen niet openen."
+
+#: LYMessages.c:432
+msgid "Unable to open traversal errors output file"
+msgstr "Kan bestand met doorkruisingsfouten niet openen"
+
+#: LYMessages.c:433
+msgid "TRAVERSAL WAS INTERRUPTED"
+msgstr "DOORKRUISING WERD ONDERBROKEN"
+
+#: LYMessages.c:434
+msgid "Follow link (or goto link or page) number: "
+msgstr "Volg link (of ga naar link of pagina) met nummer: "
+
+#: LYMessages.c:435
+msgid "Select option (or page) number: "
+msgstr "Selecteer optie (of pagina) met nummer: "
+
+#: LYMessages.c:436
+#, c-format
+msgid "Option number %d already is current."
+msgstr "Optienummer %d is al het huidige."
+
+#. #define ALREADY_AT_OPTION_END
+#: LYMessages.c:438
+msgid "You are already at the end of this option list."
+msgstr "Dit is het einde van deze optielijst."
+
+#. #define ALREADY_AT_OPTION_BEGIN
+#: LYMessages.c:440
+msgid "You are already at the beginning of this option list."
+msgstr "Dit is het begin van deze optielijst."
+
+#. #define ALREADY_AT_OPTION_PAGE
+#: LYMessages.c:442
+#, c-format
+msgid "You are already at page %d of this option list."
+msgstr "Dit is pagina %d van deze optielijst."
+
+#: LYMessages.c:443
+msgid "You have entered an invalid option number."
+msgstr "U hebt een ongeldig optienummer ingevoerd."
+
+#: LYMessages.c:444
+msgid "** Bad HTML!! Use -trace to diagnose. **"
+msgstr "** Ongeldige HTML!! Gebruik -trace om een diagnose op te maken. **"
+
+#: LYMessages.c:445
+msgid "Give name of file to save in"
+msgstr "Voer de naam in van het bestand om in op te slaan"
+
+#: LYMessages.c:446
+msgid "Can't save data to file -- please run WWW locally"
+msgstr "Kan gegevens niet opslaan in bestand -- draai WWW lokaal"
+
+#: LYMessages.c:447
+msgid "Can't open temporary file!"
+msgstr "Kan tijdelijk bestand niet openen!"
+
+#: LYMessages.c:448
+msgid "Can't open output file! Cancelling!"
+msgstr "Kan uitvoerbestand niet openen! Bezig met annuleren!"
+
+#: LYMessages.c:449
+msgid "Execution is disabled."
+msgstr "Uitvoeren is uitgeschakeld."
+
+#. #define EXECUTION_DISABLED_FOR_FILE
+#: LYMessages.c:451
+#, c-format
+msgid "Execution is not enabled for this file. See the Options menu (use %s)."
+msgstr "Uitvoeren is niet aangezet voor dit bestand. Zie het Optiesmenu (gebruik %s)."
+
+#. #define EXECUTION_NOT_COMPILED
+#: LYMessages.c:453
+msgid "Execution capabilities are not compiled into this version."
+msgstr "Uitvoermogelijkheden zijn niet ingebouwd in deze versie."
+
+#: LYMessages.c:454
+msgid "This file cannot be displayed on this terminal."
+msgstr "Dit bestand kan niet op deze terminal getoond worden."
+
+#. #define CANNOT_DISPLAY_FILE_D_OR_C
+#: LYMessages.c:456
+msgid "This file cannot be displayed on this terminal: D)ownload, or C)ancel"
+msgstr "Dit bestand kan niet op deze terminal getoond worden: D)ownload, C)-annuleren"
+
+#: LYMessages.c:457
+#, c-format
+msgid "%s D)ownload, or C)ancel"
+msgstr "%s D)ownloaden, of C)-annuleren"
+
+#: LYMessages.c:458
+msgid "Cancelling file."
+msgstr "Bestand wordt geannuleerd."
+
+#: LYMessages.c:459
+msgid "Retrieving file. - PLEASE WAIT -"
+msgstr "Bestand wordt opgehaald. Even geduld..."
+
+#: LYMessages.c:460
+msgid "Enter a filename: "
+msgstr "Voer een bestandsnaam in: "
+
+#: LYMessages.c:461
+msgid "Edit the previous filename: "
+msgstr "Wijzig de vorige bestandsnaam: "
+
+#: LYMessages.c:462
+msgid "Edit a previous filename: "
+msgstr "Wijzig een voorgaande bestandsnaam: "
+
+#: LYMessages.c:463
+msgid "Enter a new filename: "
+msgstr "Voer een nieuwe bestandsnaam in: "
+
+#: LYMessages.c:464
+msgid "File name may not begin with a dot."
+msgstr "Bestandsnaam mag niet met een punt beginnen."
+
+#: LYMessages.c:466
+msgid "File exists. Create higher version?"
+msgstr "Bestand bestaat al. Hogere versie aanmaken?"
+
+#: LYMessages.c:468
+msgid "File exists. Overwrite?"
+msgstr "Bestand bestaat al. Overschrijven?"
+
+#: LYMessages.c:470
+msgid "Cannot write to file."
+msgstr "Kan niet naar bestand schrijven."
+
+#: LYMessages.c:471
+msgid "ERROR! - download command is misconfigured."
+msgstr "FOUT -- Downloadcommando is onjuist ingesteld."
+
+#: LYMessages.c:472
+msgid "Unable to download file."
+msgstr "Kan bestand niet downloaden."
+
+#: LYMessages.c:473
+msgid "Reading directory..."
+msgstr "Lezen van mapinhoud..."
+
+#: LYMessages.c:474
+msgid "Building directory listing..."
+msgstr "Opbouwen van bestandenoverzicht voor map..."
+
+#: LYMessages.c:475
+msgid "Saving..."
+msgstr "Bezig met opslaan..."
+
+#: LYMessages.c:476
+#, c-format
+msgid "Could not edit file '%s'."
+msgstr "Kan bestand '%s' niet wijzigen."
+
+#: LYMessages.c:477
+msgid "Unable to access document!"
+msgstr "Geen toegang tot document!"
+
+#: LYMessages.c:478
+msgid "Could not access file."
+msgstr "Geen toegang tot bestand."
+
+#: LYMessages.c:479
+msgid "Could not access directory."
+msgstr "Geen toegang tot map."
+
+#: LYMessages.c:480
+msgid "Could not load data."
+msgstr "Kan gegevens niet inlezen."
+
+#. #define CANNOT_EDIT_REMOTE_FILES
+#: LYMessages.c:482
+msgid "Lynx cannot currently (e)dit remote WWW files."
+msgstr "Lynx kan momenteel geen WWW-bestanden op een andere computer wijzigen."
+
+#. #define CANNOT_EDIT_FIELD
+#: LYMessages.c:484
+msgid "This field cannot be (e)dited with an external editor."
+msgstr "Dit veld kan niet gewijzigd worden met een externe editor."
+
+#: LYMessages.c:485
+msgid "Bad rule"
+msgstr "Foutieve regel"
+
+#: LYMessages.c:486
+msgid "Insufficient operands:"
+msgstr "Onvoldoende argumenten:"
+
+#: LYMessages.c:487
+msgid "You are not authorized to edit this file."
+msgstr "U bent niet geautoriseerd om dit bestand te wijzigen."
+
+#: LYMessages.c:488
+msgid "Title: "
+msgstr "Titel: "
+
+#: LYMessages.c:489
+msgid "Subject: "
+msgstr "Onderwerp: "
+
+#: LYMessages.c:490
+msgid "Username: "
+msgstr "Gebruikersnaam: "
+
+#: LYMessages.c:491
+msgid "Password: "
+msgstr "Wachtwoord: "
+
+#: LYMessages.c:492
+msgid "lynx: Username and Password required!!!"
+msgstr "lynx: Gebruikersnaam en wachtwoord zijn vereist!"
+
+#: LYMessages.c:493
+msgid "lynx: Password required!!!"
+msgstr "lynx: Wachtwoord is vereist!"
+
+#: LYMessages.c:494
+msgid "Clear all authorization info for this session?"
+msgstr "Alle autorisatie-informatie voor deze sessie wissen?"
+
+#: LYMessages.c:495
+msgid "Authorization info cleared."
+msgstr "Autorisatie-informatie is gewist."
+
+#: LYMessages.c:496
+msgid "Authorization failed. Retry?"
+msgstr "Autorisatie is mislukt. Nog eens proberen?"
+
+#: LYMessages.c:497
+msgid "cgi support has been disabled."
+msgstr "CGI-ondersteuning is uitgeschakeld."
+
+#. #define CGI_NOT_COMPILED
+#: LYMessages.c:499
+msgid "Lynxcgi capabilities are not compiled into this version."
+msgstr "Lynx-CGI-functies zijn niet ingebouwd in deze versie."
+
+#: LYMessages.c:500
+#, c-format
+msgid "Sorry, no known way of converting %s to %s."
+msgstr "Sorry, er is geen bekende manier om %s naar %s te converteren."
+
+#: LYMessages.c:501
+msgid "Unable to set up connection."
+msgstr "Kan verbinding niet voorbereiden."
+
+#: LYMessages.c:502
+msgid "Unable to make connection"
+msgstr "Kan verbinding niet maken"
+
+#. #define MALFORMED_EXEC_REQUEST
+#: LYMessages.c:504
+msgid "Executable link rejected due to malformed request."
+msgstr "Uitvoerbare link is verworpen vanwege een verkeerd geformuleerde opdracht."
+
+#. #define BADCHAR_IN_EXEC_LINK
+#: LYMessages.c:506
+#, c-format
+msgid "Executable link rejected due to `%c' character."
+msgstr "Uitvoerbare link is verworpen vanwege '%c'-teken."
+
+#. #define RELPATH_IN_EXEC_LINK
+#: LYMessages.c:508
+msgid "Executable link rejected due to relative path string ('../')."
+msgstr "Uitvoerbare link is verworpen vanwege een relatief pad ('../')."
+
+#. #define BADLOCPATH_IN_EXEC_LINK
+#: LYMessages.c:510
+msgid "Executable link rejected due to location or path."
+msgstr "Uitvoerbare link is verworpen vanwege locatie of pad."
+
+#: LYMessages.c:511
+msgid "Mail access is disabled!"
+msgstr "E-mailtoegang is uitgeschakeld!"
+
+#. #define ACCESS_ONLY_LOCALHOST
+#: LYMessages.c:513
+msgid "Only files and servers on the local host can be accessed."
+msgstr "Er is alleen toegang tot bestanden en servers op de lokale computer."
+
+#: LYMessages.c:514
+msgid "Telnet access is disabled!"
+msgstr "Toegang via telnet is uitgeschakeld!"
+
+#. #define TELNET_PORT_SPECS_DISABLED
+#: LYMessages.c:516
+msgid "Telnet port specifications are disabled."
+msgstr "Telnet-poortspecificaties zijn uitgeschakeld."
+
+#: LYMessages.c:517
+msgid "USENET news access is disabled!"
+msgstr "Toegang tot USENET-nieuws is uitgeschakeld!"
+
+#: LYMessages.c:518
+msgid "Rlogin access is disabled!"
+msgstr "Toegang via 'rlogin' is uitgeschakeld!"
+
+#: LYMessages.c:519
+msgid "Ftp access is disabled!"
+msgstr "Toegang via FTP is uitgeschakeld!"
+
+#: LYMessages.c:520
+msgid "There are no references from this document."
+msgstr "Er zijn geen referenties vanuit dit document."
+
+#: LYMessages.c:521
+msgid "There are only hidden links from this document."
+msgstr "Er zijn alleen verborgen links vanuit dit document."
+
+#: LYMessages.c:523
+msgid "Unable to open command file."
+msgstr "Kan opdrachtenbestand niet openen."
+
+#: LYMessages.c:525
+msgid "News Post Cancelled!!!"
+msgstr "Nieuwsverzending is geannuleerd!"
+
+#. #define SPAWNING_EDITOR_FOR_NEWS
+#: LYMessages.c:527
+msgid "Spawning your selected editor to edit news message"
+msgstr "Uw geselecteerde editor wordt opgestart om een nieuwsbericht in te voeren"
+
+#: LYMessages.c:528
+msgid "Post this message?"
+msgstr "Dit bericht posten?"
+
+#: LYMessages.c:529
+#, c-format
+msgid "Append '%s'?"
+msgstr "'%s' aan einde toevoegen?"
+
+#: LYMessages.c:530
+msgid "Posting to newsgroup(s)..."
+msgstr "Posten naar nieuwsgroep(en)..."
+
+#: LYMessages.c:532
+msgid "*** You have unread mail. ***"
+msgstr "*** U hebt ongelezen e-mail. ***"
+
+#: LYMessages.c:534
+msgid "*** You have mail. ***"
+msgstr "*** U hebt e-mail. ***"
+
+#: LYMessages.c:536
+msgid "*** You have new mail. ***"
+msgstr "*** U hebt nieuwe e-mail. ***"
+
+#: LYMessages.c:537
+msgid "File insert cancelled!!!"
+msgstr "Opname van bestand is geannuleerd!"
+
+#: LYMessages.c:538
+msgid "Not enough memory for file!"
+msgstr "Niet genoeg geheugen beschikbaar voor bestand!"
+
+#: LYMessages.c:539
+msgid "Can't open file for reading."
+msgstr "Kan bestand niet openen om te lezen."
+
+#: LYMessages.c:540
+msgid "File does not exist."
+msgstr "Bestand bestaat niet."
+
+#: LYMessages.c:541
+msgid "File does not exist - reenter or cancel:"
+msgstr "Bestand bestaat niet -- voer opnieuw in of annuleer:"
+
+#: LYMessages.c:542
+msgid "File is not readable."
+msgstr "Bestand is niet leesbaar."
+
+#: LYMessages.c:543
+msgid "File is not readable - reenter or cancel:"
+msgstr "Bestand is niet leesbaar -- voer opnieuw in of annuleer:"
+
+#: LYMessages.c:544
+msgid "Nothing to insert - file is 0-length."
+msgstr "Er is niets om in te voegen -- bestand heeft lengte 0."
+
+#: LYMessages.c:545
+msgid "Save request cancelled!!!"
+msgstr "Opslagverzoek is geannuleerd!"
+
+#: LYMessages.c:546
+msgid "Mail request cancelled!!!"
+msgstr "E-mailopdracht is geannuleerd!"
+
+#. #define CONFIRM_MAIL_SOURCE_PREPARSED
+#: LYMessages.c:548
+msgid "Viewing preparsed source. Are you sure you want to mail it?"
+msgstr "Voorverwerkte brontekst wordt getoond. Verzenden?"
+
+#: LYMessages.c:549
+msgid "Please wait..."
+msgstr "Even geduld..."
+
+#: LYMessages.c:550
+msgid "Mailing file. Please wait..."
+msgstr "Bestand wordt verzonden. Even geduld..."
+
+#: LYMessages.c:551
+msgid "ERROR - Unable to mail file"
+msgstr "FOUT -- Kan e-mailbestand niet openen."
+
+#. #define CONFIRM_LONG_SCREEN_PRINT
+#: LYMessages.c:553
+#, c-format
+msgid "File is %d screens long. Are you sure you want to print?"
+msgstr "Bestand is %d schermen lang. Toch afdrukken?"
+
+#: LYMessages.c:554
+msgid "Print request cancelled!!!"
+msgstr "Adrukverzoek is geannuleerd!"
+
+#: LYMessages.c:555
+msgid "Press <return> to begin: "
+msgstr "Druk op <Enter> om te beginnen: "
+
+#: LYMessages.c:556
+msgid "Press <return> to finish: "
+msgstr "Druk op <Enter> om te voltooien: "
+
+#. #define CONFIRM_LONG_PAGE_PRINT
+#: LYMessages.c:558
+#, c-format
+msgid "File is %d pages long. Are you sure you want to print?"
+msgstr "Bestand is %d pagina's lang. Toch afdrukken?"
+
+#. #define CHECK_PRINTER
+#: LYMessages.c:560
+msgid "Be sure your printer is on-line. Press <return> to start printing:"
+msgstr "Zorg dat de printer aan staat. Druk op <Enter> om het afdrukken te beginnen:"
+
+#: LYMessages.c:561
+msgid "ERROR - Unable to allocate file space!!!"
+msgstr "FOUT -- Kan geen ruimte voor bestand reserveren."
+
+#: LYMessages.c:562
+msgid "Unable to open tempfile"
+msgstr "Kan tijdelijk bestand niet openen"
+
+#: LYMessages.c:563
+msgid "Unable to open print options file"
+msgstr "Kan optiesbestand niet afdrukken"
+
+#: LYMessages.c:564
+msgid "Printing file. Please wait..."
+msgstr "Bestand wordt afgedrukt. Even geduld..."
+
+#: LYMessages.c:565
+msgid "Please enter a valid internet mail address: "
+msgstr "Voer een geldig e-mailadres in: "
+
+#: LYMessages.c:566
+msgid "ERROR! - printer is misconfigured!"
+msgstr "FOUT -- Printer is niet goed ingesteld."
+
+#: LYMessages.c:567
+msgid "Image map from POST response not available!"
+msgstr "Menuplaatje van POST-antwoord is niet beschikbaar!"
+
+#: LYMessages.c:568
+msgid "Misdirected client-side image MAP request!"
+msgstr "Verkeerd gerichte opdracht voor menuplaatje aan cliëntzijde!"
+
+#: LYMessages.c:569
+msgid "Client-side image MAP is not accessible!"
+msgstr "Menuplaatje aan cliëntzijde is niet bereikbaar!"
+
+#: LYMessages.c:570
+msgid "No client-side image MAPs are available!"
+msgstr "Er zijn aan cliëntzijde geen menuplaatjes beschikbaar!"
+
+#: LYMessages.c:571
+msgid "Client-side image MAP is not available!"
+msgstr "Menuplaatje aan cliëntzijde is niet beschikbaar!"
+
+#. #define OPTION_SCREEN_NEEDS_24
+#: LYMessages.c:574
+msgid "Screen height must be at least 24 lines for the Options menu!"
+msgstr "Voor het Optiesmenu moet de schermhoogte minimaal 24 regels zijn."
+
+#. #define OPTION_SCREEN_NEEDS_23
+#: LYMessages.c:576
+msgid "Screen height must be at least 23 lines for the Options menu!"
+msgstr "Voor het Optiesmenu moet de schermhoogte minimaal 23 regels zijn."
+
+#. #define OPTION_SCREEN_NEEDS_22
+#: LYMessages.c:578
+msgid "Screen height must be at least 22 lines for the Options menu!"
+msgstr "Voor het Optiesmenu moet de schermhoogte minimaal 22 regels zijn."
+
+#: LYMessages.c:580
+msgid "That key requires Advanced User mode."
+msgstr "Die toets werkt alleen in de 'expert'-gebruikersmodus."
+
+#: LYMessages.c:581
+#, c-format
+msgid "Content-type: %s"
+msgstr "Inhoudstype: %s"
+
+#: LYMessages.c:582
+msgid "Command: "
+msgstr "Opdracht: "
+
+#: LYMessages.c:583
+msgid "Unknown or ambiguous command"
+msgstr "Onbekende of meerduidige opdracht"
+
+#: LYMessages.c:584
+msgid " Version "
+msgstr " versie "
+
+#: LYMessages.c:585
+msgid " first"
+msgstr " eerst"
+
+#: LYMessages.c:586
+msgid ", guessing..."
+msgstr ", er naar raden..."
+
+#: LYMessages.c:587
+msgid "Permissions for "
+msgstr "Toegangsrechten voor "
+
+#: LYMessages.c:588
+msgid "Select "
+msgstr "Selecteer "
+
+#: LYMessages.c:589
+msgid "capital letter"
+msgstr "hoofdletter"
+
+#: LYMessages.c:590
+msgid " of option line,"
+msgstr " van optieregel,"
+
+#: LYMessages.c:591
+msgid " to save,"
+msgstr " om op te slaan,"
+
+#: LYMessages.c:592
+msgid " to "
+msgstr " aan "
+
+#: LYMessages.c:593
+msgid " or "
+msgstr " of "
+
+#: LYMessages.c:594
+msgid " index"
+msgstr " index"
+
+#: LYMessages.c:595
+msgid " to return to Lynx."
+msgstr " om terug te keren naar Lynx."
+
+#: LYMessages.c:596
+msgid "Accept Changes"
+msgstr "Wijzigen bevestigen"
+
+#: LYMessages.c:597
+msgid "Reset Changes"
+msgstr "Wijzigingen annuleren"
+
+#: LYMessages.c:598
+msgid "Left Arrow cancels changes"
+msgstr "(pijltje links annuleert ook)"
+
+#: LYMessages.c:599
+msgid "Save options to disk"
+msgstr "Opties op schijf opslaan"
+
+#: LYMessages.c:600
+msgid "Hit RETURN to accept entered data."
+msgstr "Druk op <Enter> om ingevoerde gegevens te accepteren."
+
+#. #define ACCEPT_DATA_OR_DEFAULT
+#: LYMessages.c:602
+msgid "Hit RETURN to accept entered data. Delete data to invoke the default."
+msgstr "Druk op <Enter> om gegevens te accepteren. Wis gegevens om te herstellen."
+
+#: LYMessages.c:603
+msgid "Value accepted!"
+msgstr "Waarde is geaccepteerd!"
+
+#. #define VALUE_ACCEPTED_WARNING_X
+#: LYMessages.c:605
+msgid "Value accepted! -- WARNING: Lynx is configured for XWINDOWS!"
+msgstr "Waarde is geaccepteerd! -- WAARSCHUWING: Lynx is geconfigureerd voor X Windows!"
+
+#. #define VALUE_ACCEPTED_WARNING_NONX
+#: LYMessages.c:607
+msgid "Value accepted! -- WARNING: Lynx is NOT configured for XWINDOWS!"
+msgstr "Waarde is geaccepteerd! -- WAARSCHUWING: Lynx is NIET geconfigureerd voor X Windows!"
+
+#: LYMessages.c:608
+msgid "You are not allowed to change which editor to use!"
+msgstr "U mag niet opgeven welke editor u wilt gebruiken!"
+
+#: LYMessages.c:609
+msgid "Failed to set DISPLAY variable!"
+msgstr "Zetten van variabele DISPLAY is mislukt!"
+
+#: LYMessages.c:610
+msgid "Failed to clear DISPLAY variable!"
+msgstr "Wissen van variabele DISPLAY is mislukt!"
+
+#. #define BOOKMARK_CHANGE_DISALLOWED
+#: LYMessages.c:612
+msgid "You are not allowed to change the bookmark file!"
+msgstr "U mag het boekenleggerbestand niet veranderen!"
+
+#: LYMessages.c:613
+msgid "Terminal does not support color"
+msgstr "De terminal ondersteunt geen kleur"
+
+#: LYMessages.c:614
+#, c-format
+msgid "Your '%s' terminal does not support color."
+msgstr "Uw '%s'-terminal ondersteunt geen kleur."
+
+#: LYMessages.c:615
+msgid "Access to dot files is disabled!"
+msgstr "Toegang tot puntbestanden is uitgeschakeld!"
+
+#. #define UA_NO_LYNX_WARNING
+#: LYMessages.c:617
+msgid "User-Agent string does not contain \"Lynx\" or \"L_y_n_x\""
+msgstr "Waarde van 'User-Agent' bevat geen \"Lynx\" of \"L_y_n_x\""
+
+#. #define UA_PLEASE_USE_LYNX
+#: LYMessages.c:619
+msgid "Use \"L_y_n_x\" or \"Lynx\" in User-Agent, or it looks like intentional deception!"
+msgstr "Gebruik \"L_y_n_x\" of \"Lynx\" in 'User-Agent', anders lijkt het op bedrog."
+
+#. #define UA_CHANGE_DISABLED
+#: LYMessages.c:621
+msgid "Changing of the User-Agent string is disabled!"
+msgstr "Wijzigen van de waarde van 'User-Agent' is uitgeschakeld!"
+
+#. #define CHANGE_OF_SETTING_DISALLOWED
+#: LYMessages.c:623
+msgid "You are not allowed to change this setting."
+msgstr "U mag deze instelling niet wijzigen."
+
+#: LYMessages.c:624
+msgid "Saving Options..."
+msgstr "Opslaan van opties..."
+
+#: LYMessages.c:625
+msgid "Options saved!"
+msgstr "Opties zijn opgeslagen."
+
+#: LYMessages.c:626
+msgid "Unable to save Options!"
+msgstr "Kan opties niet opslaan!"
+
+#: LYMessages.c:627
+msgid " 'r' to return to Lynx "
+msgstr " 'r' om terug te keren naar Lynx "
+
+#: LYMessages.c:628
+msgid " '>' to save, or 'r' to return to Lynx "
+msgstr " '>' om op te slaan, of 'r' om terug te keren naar Lynx "
+
+#. #define ANY_KEY_CHANGE_RET_ACCEPT
+#: LYMessages.c:630
+msgid "Hit any key to change value; RETURN to accept."
+msgstr "Druk op een toets om de waarde te veranderen; <Enter> om te accepteren."
+
+#: LYMessages.c:631
+msgid "Error uncompressing temporary file!"
+msgstr "Fout bij decomprimeren van tijdelijk bestand!"
+
+#: LYMessages.c:632
+msgid "Unsupported URL scheme!"
+msgstr "Niet-ondersteunde URL-methode!"
+
+#: LYMessages.c:633
+msgid "Unsupported data: URL! Use SHOWINFO, for now."
+msgstr "Niet-ondersteunde 'data:'-URL! Gebruik voorlopig SHOWINFO."
+
+#: LYMessages.c:634
+#, c-format
+msgid "Redirection limit of %d URL's reached."
+msgstr "Doorverwijzingslimiet van %d URL's is bereikt."
+
+#: LYMessages.c:635
+msgid "Illegal redirection URL received from server!"
+msgstr "Ongeldige doorverwijzing-URL ontvangen van server!"
+
+#. #define SERVER_ASKED_FOR_REDIRECTION
+#: LYMessages.c:637
+#, c-format
+msgid "Server asked for %d redirection of POST content to"
+msgstr "Server vroeg om %d-doorverwijzing van POST-inhoud naar"
+
+#: LYMessages.c:640
+msgid "P)roceed, use G)ET or C)ancel "
+msgstr "P)-doorgaan, G)ET gebruiken of C)-annuleren "
+
+#: LYMessages.c:641
+msgid "P)roceed, or C)ancel "
+msgstr "P)-doorgaan, of C)-annuleren "
+
+#. #define ADVANCED_POST_GET_REDIRECT
+#: LYMessages.c:643
+msgid "Redirection of POST content. P)roceed, see U)RL, use G)ET or C)ancel"
+msgstr "Doorverwezen POST-inhoud. P)-doorgaan, U)RL zien, G)ET of C)-annuleren"
+
+#. #define ADVANCED_POST_REDIRECT
+#: LYMessages.c:645
+msgid "Redirection of POST content. P)roceed, see U)RL, or C)ancel"
+msgstr "Doorverwezen POST-inhoud. P)-doorgaan, U)RL bekijken, of C)-annuleren"
+
+#. #define CONFIRM_POST_RESUBMISSION
+#: LYMessages.c:647
+msgid "Document from Form with POST content. Resubmit?"
+msgstr "Document van formulier met POST-inhoud. Opnieuw verzenden?"
+
+#. #define CONFIRM_POST_RESUBMISSION_TO
+#: LYMessages.c:649
+#, c-format
+msgid "Resubmit POST content to %s ?"
+msgstr "Opnieuw POST-inhoud naar %s verzenden?"
+
+#. #define CONFIRM_POST_LIST_RELOAD
+#: LYMessages.c:651
+#, c-format
+msgid "List from document with POST data. Reload %s ?"
+msgstr "Lijst van document met POST-informatie. Opnieuw %s laden?"
+
+#. #define CONFIRM_POST_DOC_HEAD
+#: LYMessages.c:653
+msgid "Document from POST action, HEAD may not be understood. Proceed?"
+msgstr "Document met POST-actie, HEAD wordt mogelijk niet begrepen. Doorgaan?"
+
+#. #define CONFIRM_POST_LINK_HEAD
+#: LYMessages.c:655
+msgid "Form submit action is POST, HEAD may not be understood. Proceed?"
+msgstr "Formulierverzendactie is POST, HEAD wordt mogelijk niet begrepen. Doorgaan?"
+
+#: LYMessages.c:656
+msgid "Proceed without a username and password?"
+msgstr "Doorgaan zonder gebruikersnaam en wachtwoord?"
+
+#: LYMessages.c:657
+#, c-format
+msgid "Proceed (%s)?"
+msgstr "Doorgaan (%s)?"
+
+#: LYMessages.c:658
+msgid "Cannot POST to this host."
+msgstr "Kan geen 'POST' verzenden naar deze host."
+
+#: LYMessages.c:659
+msgid "POST not supported for this URL - ignoring POST data!"
+msgstr "POST wordt niet ondersteund voor deze URL -- POST-informatie wordt genegeerd!"
+
+#: LYMessages.c:660
+msgid "Discarding POST data..."
+msgstr "Weggooien van POST-informatie..."
+
+#: LYMessages.c:661
+msgid "Document will not be reloaded!"
+msgstr "Document zal niet opnieuw geladen worden!"
+
+#: LYMessages.c:662
+msgid "Location: "
+msgstr "Locatie: "
+
+#: LYMessages.c:663
+#, c-format
+msgid "'%s' not found!"
+msgstr "'%s' niet gevonden!"
+
+#: LYMessages.c:664
+msgid "Default Bookmark File"
+msgstr "Standaard boekenleggerbestand"
+
+#: LYMessages.c:665
+msgid "Screen too small! (8x35 min)"
+msgstr "Scherm is te klein! (minimaal 8x35)"
+
+#: LYMessages.c:666
+msgid "Select destination or ^G to Cancel: "
+msgstr "Selecteer bestemming of Ctrl-G om te annuleren: "
+
+#. #define MULTIBOOKMARKS_SELECT
+#: LYMessages.c:668
+msgid "Select subbookmark, '=' for menu, or ^G to cancel: "
+msgstr "Selecteer subboekenlegger, '=' = menu, Ctrl-G = annuleren: "
+
+#. #define MULTIBOOKMARKS_SELF
+#: LYMessages.c:670
+msgid "Reproduce L)ink in this bookmark file or C)ancel? (l,c): "
+msgstr "L)ink reproduceren in dit boekenleggerbestand of C)-annuleren? (l,c): "
+
+#: LYMessages.c:671
+msgid "Multiple bookmark support is not available."
+msgstr "Meervoudige boekenleggerondersteuning is niet beschikbaar."
+
+#: LYMessages.c:672
+#, c-format
+msgid " Select Bookmark (screen %d of %d)"
+msgstr " Selecteer boekenlegger (scherm %d van %d)"
+
+#: LYMessages.c:673
+msgid " Select Bookmark"
+msgstr " Selecteer boekenlegger"
+
+#. #define MULTIBOOKMARKS_EHEAD_MASK
+#: LYMessages.c:675
+#, c-format
+msgid "Editing Bookmark DESCRIPTION and FILEPATH (%d of 2)"
+msgstr "Wijzigen van boekenlegger-OMSCHRIJVING en -BESTANDSPAD (%d van 2)"
+
+#. #define MULTIBOOKMARKS_EHEAD
+#: LYMessages.c:677
+msgid " Editing Bookmark DESCRIPTION and FILEPATH"
+msgstr " Wijzigen van boekenlegger-OMSCHRIJVING en -BESTANDSPAD"
+
+#: LYMessages.c:678
+msgid "Letter: "
+msgstr "Letter: "
+
+#. #define USE_PATH_OFF_HOME
+#: LYMessages.c:681
+msgid "Use a filepath off your login directory in SHELL syntax!"
+msgstr "Gebruik een bestandspad vanuit uw login-map in shell-syntax!"
+
+#: LYMessages.c:683
+msgid "Use a filepath off your home directory!"
+msgstr "Gebruik een bestandspad vanuit uw persoonlijke map!"
+
+#. #define MAXLINKS_REACHED
+#: LYMessages.c:686
+msgid "Maximum links per page exceeded! Use half-page or two-line scrolling."
+msgstr "Te veel links per pagina! Blader per halve pagina of tweeregelig."
+
+#: LYMessages.c:687
+msgid "No previously visited links available!"
+msgstr "Geen voorgaande bezochte links beschikbaar!"
+
+#: LYMessages.c:688
+msgid "Memory exhausted! Program aborted!"
+msgstr "Geen geheugen meer beschikbaar! Programma is afgebroken!"
+
+#: LYMessages.c:689
+msgid "Memory exhausted! Aborting..."
+msgstr "Geen geheugen meer beschikbaar! Programma wordt afgebroken..."
+
+#: LYMessages.c:690
+msgid "Not enough memory!"
+msgstr "Onvoldoende geheugen beschikbaar!"
+
+#: LYMessages.c:691
+msgid "Directory/File Manager not available"
+msgstr "Bestandsbeheer is niet beschikbaar"
+
+#: LYMessages.c:692
+msgid "Location URL is not absolute."
+msgstr "Locatie-URL is niet absoluut."
+
+#: LYMessages.c:693
+msgid "Refresh URL is not absolute."
+msgstr "Verversings-URL is niet absoluut."
+
+#. #define SENDING_MESSAGE_WITH_BODY_TO
+#: LYMessages.c:695
+msgid ""
+"You are sending a message with body to:\n"
+" "
+msgstr ""
+"U zendt een bericht met inhoud naar:\n"
+" "
+
+#: LYMessages.c:696
+msgid ""
+"You are sending a comment to:\n"
+" "
+msgstr ""
+"U zendt commentaar naar:\n"
+" "
+
+#: LYMessages.c:697
+msgid ""
+"\n"
+" With copy to:\n"
+" "
+msgstr ""
+"\n"
+" Met kopie naar:\n"
+" "
+
+#: LYMessages.c:698
+msgid ""
+"\n"
+" With copies to:\n"
+" "
+msgstr ""
+"\n"
+" Met kopieën naar:\n"
+" "
+
+#. #define CTRL_G_TO_CANCEL_SEND
+#: LYMessages.c:700
+msgid ""
+"\n"
+"\n"
+"Use Ctrl-G to cancel if you do not want to send a message\n"
+msgstr ""
+"\n"
+"\n"
+"Gebruik Ctrl-G om te annuleren (bericht niet verzenden).\n"
+
+#. #define ENTER_NAME_OR_BLANK
+#: LYMessages.c:702
+msgid ""
+"\n"
+" Please enter your name, or leave it blank to remain anonymous\n"
+msgstr ""
+"\n"
+" Voer uw naam in, of laat het leeg om anoniem te blijven\n"
+
+#. #define ENTER_MAIL_ADDRESS_OR_OTHER
+#: LYMessages.c:704
+msgid ""
+"\n"
+" Please enter a mail address or some other\n"
+msgstr ""
+"\n"
+" Vul een e-mailadres in of een andere manier om\n"
+
+#. #define MEANS_TO_CONTACT_FOR_RESPONSE
+#: LYMessages.c:706
+msgid " means to contact you, if you desire a response.\n"
+msgstr " u te bereiken, als u antwoord wenst te ontvangen.\n"
+
+#: LYMessages.c:707
+msgid ""
+"\n"
+" Please enter a subject line.\n"
+msgstr ""
+"\n"
+" Vul een onderwerp in.\n"
+
+#. #define ENTER_ADDRESS_FOR_CC
+#: LYMessages.c:709
+msgid ""
+"\n"
+" Enter a mail address for a CC of your message.\n"
+msgstr ""
+"\n"
+" Voer een e-mailadres in om een kopie van het bericht naar toe te sturen.\n"
+
+#: LYMessages.c:710
+msgid " (Leave blank if you don't want a copy.)\n"
+msgstr " (Laat dit leeg indien u geen kopie wilt.)\n"
+
+#: LYMessages.c:711
+msgid ""
+"\n"
+" Please review the message body:\n"
+"\n"
+msgstr ""
+"\n"
+" Controleer de inhoud van het bericht:\n"
+"\n"
+
+#: LYMessages.c:712
+msgid ""
+"\n"
+"Press RETURN to continue: "
+msgstr ""
+"\n"
+"Druk op <Enter> om door te gaan: "
+
+#: LYMessages.c:713
+msgid ""
+"\n"
+"Press RETURN to clean up: "
+msgstr ""
+"\n"
+"Druk op <Enter> om op te ruimen: "
+
+#: LYMessages.c:714
+msgid " Use Control-U to erase the default.\n"
+msgstr " Gebruik Ctrl-U om de huidige regel te wissen.\n"
+
+#: LYMessages.c:715
+msgid ""
+"\n"
+" Please enter your message below."
+msgstr ""
+"\n"
+" Schrijf uw bericht hieronder."
+
+#. #define ENTER_PERIOD_WHEN_DONE_A
+#: LYMessages.c:717 src/LYNews.c:360
+msgid ""
+"\n"
+" When you are done, press enter and put a single period (.)"
+msgstr ""
+"\n"
+" Wanneer u klaar bent, druk dan op <Enter> en plaats vervolgens"
+
+#. #define ENTER_PERIOD_WHEN_DONE_B
+#: LYMessages.c:719 src/LYNews.c:361
+msgid ""
+"\n"
+" on a line and press enter again."
+msgstr ""
+"\n"
+" een punt (.) op één regel, en druk dan opnieuw op <Enter>."
+
+#. Cookies messages
+#. #define ADVANCED_COOKIE_CONFIRMATION
+#: LYMessages.c:723
+#, c-format
+msgid "%s cookie: %.*s=%.*s Allow? (Y/N/Always/neVer)"
+msgstr "%s koekje: %.*s=%.*s Toestaan? (Ja, Nee, Altijd, noOit)"
+
+#. #define INVALID_COOKIE_DOMAIN_CONFIRMATION
+#: LYMessages.c:725
+#, c-format
+msgid "Accept invalid cookie domain=%s for '%s'?"
+msgstr "Ongeldig koekjesdomein=%s voor '%s' accepteren?"
+
+#. #define INVALID_COOKIE_PATH_CONFIRMATION
+#: LYMessages.c:727
+#, c-format
+msgid "Accept invalid cookie path=%s as a prefix of '%s'?"
+msgstr "Ongeldig koekjespad=%s als een prefix voor '%s' accepteren?"
+
+#: LYMessages.c:728
+msgid "Allowing this cookie."
+msgstr "Dit koekje wordt toegelaten."
+
+#: LYMessages.c:729
+msgid "Rejecting this cookie."
+msgstr "Dit koekje wordt verworpen."
+
+#: LYMessages.c:730
+msgid "The Cookie Jar is empty."
+msgstr "De koekjestrommel is leeg."
+
+#: LYMessages.c:731
+msgid "The Cache Jar is empty."
+msgstr "De cachetrommel is leeg."
+
+#. #define ACTIVATE_TO_GOBBLE
+#: LYMessages.c:733
+msgid "Activate links to gobble up cookies or entire domains,"
+msgstr "Activeer de links om koekjes over hun houdbaarheidsdatum heen te helpen,"
+
+#: LYMessages.c:734
+msgid "or to change a domain's 'allow' setting."
+msgstr "of om de 'toelaatbaarheids'-instelling van een domein te wijzigen."
+
+#: LYMessages.c:735
+msgid "(Cookies never allowed.)"
+msgstr "(Koekjes nooit toegestaan.)"
+
+#: LYMessages.c:736
+msgid "(Cookies always allowed.)"
+msgstr "(Koekjes altijd toegestaan.)"
+
+#: LYMessages.c:737
+msgid "(Cookies allowed via prompt.)"
+msgstr "(Koekjes toegestaan met prompt.)"
+
+#: LYMessages.c:738
+msgid "(Persistent Cookies.)"
+msgstr "(Persistente koekjes.)"
+
+#: LYMessages.c:739
+msgid "(No title.)"
+msgstr "(Geen titel.)"
+
+#: LYMessages.c:740
+msgid "(No name.)"
+msgstr "(Geen naam.)"
+
+#: LYMessages.c:741
+msgid "(No value.)"
+msgstr "(Geen waarde.)"
+
+#: LYMessages.c:742 src/LYOptions.c:2482
+msgid "None"
+msgstr "geen"
+
+#: LYMessages.c:743
+msgid "(End of session.)"
+msgstr "(Einde van sessie.)"
+
+#: LYMessages.c:744
+msgid "Delete this cookie?"
+msgstr "Dit koekje verwijderen?"
+
+#: LYMessages.c:745
+msgid "The cookie has been eaten!"
+msgstr "Het koekje is opgegeten!"
+
+#: LYMessages.c:746
+msgid "Delete this empty domain?"
+msgstr "Dit lege domein verwijderen?"
+
+#: LYMessages.c:747
+msgid "The domain has been eaten!"
+msgstr "Het domein is opgegeten!"
+
+#. #define DELETE_COOKIES_SET_ALLOW_OR_CANCEL
+#: LYMessages.c:749
+msgid "D)elete domain's cookies, set allow A)lways/P)rompt/neV)er, or C)ancel? "
+msgstr "D)omein wissen; zet toelaten op A)ltijd/P)rompt/V)-nooit, of C)-annuleren? "
+
+#. #define DELETE_DOMAIN_SET_ALLOW_OR_CANCEL
+#: LYMessages.c:751
+msgid "D)elete domain, set allow A)lways/P)rompt/neV)er, or C)ancel? "
+msgstr "D)omein wissen; zet toestaan op A)ltijd/P)rompt/V)-nooit, of C)-annuleren? "
+
+#: LYMessages.c:752
+msgid "All cookies in the domain have been eaten!"
+msgstr "Alle koekjes in het domein zijn opgegeten!"
+
+#: LYMessages.c:753
+#, c-format
+msgid "'A'lways allowing from domain '%s'."
+msgstr "(A) altijd toelaten van domein '%s'."
+
+#: LYMessages.c:754
+#, c-format
+msgid "ne'V'er allowing from domain '%s'."
+msgstr "(V) nooit toelaten van domein '%s'."
+
+#: LYMessages.c:755
+#, c-format
+msgid "'P'rompting to allow from domain '%s'."
+msgstr "(P) prompten voor toestaan van domein '%s'."
+
+#: LYMessages.c:756
+msgid "Delete all cookies in this domain?"
+msgstr "Alle koekjes in dit domein verwijderen?"
+
+#: LYMessages.c:757
+msgid "All of the cookies in the jar have been eaten!"
+msgstr "Alle koekjes in de trommel zijn opgegeten!"
+
+#: LYMessages.c:759
+msgid "Port 19 not permitted in URLs."
+msgstr "Poort 19 is niet toegestaan in URL's."
+
+#: LYMessages.c:760
+msgid "Port 25 not permitted in URLs."
+msgstr "Poort 25 is niet toegestaan in URL's."
+
+#: LYMessages.c:761
+#, c-format
+msgid "Port %lu not permitted in URLs."
+msgstr "Poort %lu is niet toegestaan in URL's."
+
+#: LYMessages.c:762
+msgid "URL has a bad port field."
+msgstr "URL heeft een foutief poortveld."
+
+#: LYMessages.c:763
+msgid "Maximum nesting of HTML elements exceeded."
+msgstr "Maximale nestingsdiepte van HTML-elementen is overschreden."
+
+#: LYMessages.c:764
+msgid "Bad partial reference! Stripping lead dots."
+msgstr "Foutieve gedeeltelijke referentie! Voorafgaande puntjes worden weggelaten."
+
+#: LYMessages.c:765
+msgid "Trace Log open failed. Trace off!"
+msgstr "Kan trace-logbestand niet openen. Traceren is uitgezet!"
+
+#: LYMessages.c:766
+msgid "Lynx Trace Log"
+msgstr "Lynx-trace-logbestand"
+
+#: LYMessages.c:767
+msgid "No trace log has been started for this session."
+msgstr "Er is geen trace-logbestand gestart voor deze sessie."
+
+#. #define MAX_TEMPCOUNT_REACHED
+#: LYMessages.c:769
+msgid "The maximum temporary file count has been reached!"
+msgstr "Het maximale aantal tijdelijke bestanden is bereikt!"
+
+#. #define FORM_VALUE_TOO_LONG
+#: LYMessages.c:771
+msgid "Form field value exceeds buffer length! Trim the tail."
+msgstr "Waarde in formulierveld overschrijdt lengte van de buffer! Staart wordt afgeknipt."
+
+#. #define FORM_TAIL_COMBINED_WITH_HEAD
+#: LYMessages.c:773
+msgid "Modified tail combined with head of form field value."
+msgstr "Veranderde staart samengevoegd met kop van waarde uit formulierveld."
+
+#. HTFile.c
+#: LYMessages.c:776
+msgid "Directory"
+msgstr "Map"
+
+#: LYMessages.c:777
+msgid "Directory browsing is not allowed."
+msgstr "Bladeren door mappen is niet toegestaan."
+
+#: LYMessages.c:778
+msgid "Selective access is not enabled for this directory"
+msgstr "Selectieve toegang is niet aangezet voor deze map"
+
+#: LYMessages.c:779
+msgid "Multiformat: directory scan failed."
+msgstr "Multiformat: doorzoeken van map is mislukt."
+
+#: LYMessages.c:780
+msgid "This directory is not readable."
+msgstr "Deze map is niet leesbaar."
+
+#: LYMessages.c:781
+msgid "Can't access requested file."
+msgstr "Geen toegang tot opgevraagd bestand."
+
+#: LYMessages.c:782
+msgid "Could not find suitable representation for transmission."
+msgstr "Kan geen passende representatie vinden voor overdracht."
+
+#: LYMessages.c:783
+msgid "Could not open file for decompression!"
+msgstr "Kan bestand niet openen voor decompressie!"
+
+#: LYMessages.c:784
+msgid "Files:"
+msgstr "Bestanden:"
+
+#: LYMessages.c:785
+msgid "Subdirectories:"
+msgstr "Submappen:"
+
+#: LYMessages.c:786
+msgid " directory"
+msgstr " map"
+
+#: LYMessages.c:787
+msgid "Up to "
+msgstr "Terug naar "
+
+#: LYMessages.c:788
+msgid "Current directory is "
+msgstr "Huidige map is "
+
+#. HTFTP.c
+#: LYMessages.c:791
+msgid "Symbolic Link"
+msgstr "Symbolische koppeling"
+
+#. HTGopher.c
+#: LYMessages.c:794
+msgid "No response from server!"
+msgstr "Geen reactie van die server!"
+
+#: LYMessages.c:795
+msgid "CSO index"
+msgstr "CSO-index"
+
+#: LYMessages.c:796
+msgid ""
+"\n"
+"This is a searchable index of a CSO database.\n"
+msgstr ""
+"\n"
+"Dit is een doorzoekbare index van een CSO-databank.\n"
+
+#: LYMessages.c:797
+msgid "CSO Search Results"
+msgstr "CSO-zoekresultaten"
+
+#: LYMessages.c:798
+#, c-format
+msgid "Seek fail on %s\n"
+msgstr "Zoekopdracht is mislukt op %s\n"
+
+#: LYMessages.c:799
+msgid ""
+"\n"
+"Press the 's' key and enter search keywords.\n"
+msgstr ""
+"\n"
+"Druk op de 's'-toets en voer zoektermen in.\n"
+
+#: LYMessages.c:800
+msgid ""
+"\n"
+"This is a searchable Gopher index.\n"
+msgstr ""
+"\n"
+"Dit is een doorzoekbare Gopher-index.\n"
+
+#: LYMessages.c:801
+msgid "Gopher index"
+msgstr "Gopher-index"
+
+#: LYMessages.c:802
+msgid "Gopher Menu"
+msgstr "Gopher-menu"
+
+#: LYMessages.c:803
+msgid " Search Results"
+msgstr " Zoekresultaten"
+
+#: LYMessages.c:804
+msgid "Sending CSO/PH request."
+msgstr "Verzenden van CSO/PH-verzoek."
+
+#: LYMessages.c:805
+msgid "Sending Gopher request."
+msgstr "Verzenden van Gopher-verzoek."
+
+#: LYMessages.c:806
+msgid "CSO/PH request sent; waiting for response."
+msgstr "CSO/PH-verzoek is verzonden; wacht op antwoord."
+
+#: LYMessages.c:807
+msgid "Gopher request sent; waiting for response."
+msgstr "Gopher-verzoek is verzonden; wacht op antwoord."
+
+#: LYMessages.c:808
+msgid ""
+"\n"
+"Please enter search keywords.\n"
+msgstr ""
+"\n"
+"Voer zoektermen in.\n"
+
+#: LYMessages.c:809
+msgid ""
+"\n"
+"The keywords that you enter will allow you to search on a"
+msgstr ""
+"\n"
+"De zoektermen die u opgeeft maken het mogelijk te zoeken op"
+
+#: LYMessages.c:810
+msgid " person's name in the database.\n"
+msgstr " een persoonsnaam in de databank.\n"
+
+#. HTNews.c
+#: LYMessages.c:813
+msgid "Connection closed ???"
+msgstr "Verbinding gesloten???"
+
+#: LYMessages.c:814
+msgid "Cannot open temporary file for news POST."
+msgstr "Kan geen tijdelijk bestand openen voor nieuws-POST."
+
+#: LYMessages.c:815
+msgid "This client does not contain support for posting to news with SSL."
+msgstr "Dit programma ondersteunt versturen van nieuwsberichten met SSL niet."
+
+#. HTStyle.c
+#: LYMessages.c:818
+#, c-format
+msgid "Style %d `%s' SGML:%s. Font %s %.1f point.\n"
+msgstr "Stijl %d '%s' SGML:%s. Lettertype %s %.1f-punts.\n"
+
+#: LYMessages.c:820
+#, c-format
+msgid "\tAlign=%d, %d tabs. (%.0f before, %.0f after)\n"
+msgstr " Uitlijnen=%d, %d tabs. (%.0f voor, %.0f na)\n"
+
+#: LYMessages.c:821
+#, c-format
+msgid "\t\tTab kind=%d at %.0f\n"
+msgstr " Tabsoort=%d op %.0f\n"
+
+#. HTTP.c
+#: LYMessages.c:824
+msgid "Can't proceed without a username and password."
+msgstr "Kan niet verder zonder gebruikersnaam en wachtwoord."
+
+#: LYMessages.c:825
+msgid "Can't retry with authorization! Contact the server's WebMaster."
+msgstr "Herhalen gaat niet met autorisatie! Vraag beheerder van de webserver."
+
+#: LYMessages.c:826
+msgid "Can't retry with proxy authorization! Contact the server's WebMaster."
+msgstr "Herhalen gaat niet met proxy-autorisatie! Vraag beheerder van de webserver."
+
+#: LYMessages.c:827
+msgid "Retrying with proxy authorization information."
+msgstr "Nieuwe poging met proxy-autorisatie-informatie."
+
+#: LYMessages.c:828
+#, c-format
+msgid "SSL error:%s-Continue?"
+msgstr "SSL-fout: %s -- Verdergaan?"
+
+#. HTWAIS.c
+#: LYMessages.c:831
+msgid "HTWAIS: Return message too large."
+msgstr "HTWAIS: Geretourneerd bericht is te groot."
+
+#: LYMessages.c:832
+msgid "Enter WAIS query: "
+msgstr "Voer een WAIS-verzoek in: "
+
+#. Miscellaneous status
+#: LYMessages.c:835
+msgid "Retrying as HTTP0 request."
+msgstr "Nieuwe poging als HTTP0-verzoek."
+
+#: LYMessages.c:836
+#, c-format
+msgid "Transferred %d bytes"
+msgstr "%d bytes overgezet"
+
+#: LYMessages.c:837
+msgid "Data transfer complete"
+msgstr "Gegevensoverdracht is voltooid"
+
+#: LYMessages.c:838
+#, c-format
+msgid "Error processing line %d of %s\n"
+msgstr "Fout bij verwerking van regel %d van %s\n"
+
+#. Lynx internal page titles
+#: LYMessages.c:841
+msgid "Address List Page"
+msgstr "Adreslijstenpagina"
+
+#: LYMessages.c:842
+msgid "Bookmark file"
+msgstr "Boekenleggerbestand"
+
+#: LYMessages.c:843
+msgid "Configuration Definitions"
+msgstr "Instellingen"
+
+#: LYMessages.c:844
+msgid "Cookie Jar"
+msgstr "Koekjestrommel"
+
+#: LYMessages.c:845
+msgid "Current Edit-Key Map"
+msgstr "Huidige edittoetsenindeling"
+
+#: LYMessages.c:846
+msgid "Current Key Map"
+msgstr "Huidige toetsenindeling"
+
+#: LYMessages.c:847
+msgid "File Management Options"
+msgstr "Bestandsbeheeropties"
+
+#: LYMessages.c:848
+msgid "Download Options"
+msgstr "Downloadopties"
+
+#: LYMessages.c:849
+msgid "History Page"
+msgstr "Historiepagina"
+
+#: LYMessages.c:850
+msgid "Cache Jar"
+msgstr "Cachetrommel"
+
+#: LYMessages.c:851
+msgid "List Page"
+msgstr "Lijstenpagina"
+
+#: LYMessages.c:852
+msgid "Lynx.cfg Information"
+msgstr "Lynx.cfg-informatie"
+
+#: LYMessages.c:853
+msgid "Converted Mosaic Hotlist"
+msgstr "Geconverteerde Mosaic-hotlist"
+
+#: LYMessages.c:854
+msgid "Options Menu"
+msgstr "Optiesmenu"
+
+#: LYMessages.c:855
+msgid "File Permission Options"
+msgstr "Opties voor bestandstoegangsrechten"
+
+#: LYMessages.c:856
+msgid "Printing Options"
+msgstr "Afdrukopties"
+
+#: LYMessages.c:857
+msgid "Information about the current document"
+msgstr "Informatie over het huidige document"
+
+#: LYMessages.c:858
+msgid "Your recent statusline messages"
+msgstr "Recente berichten van de statusregel"
+
+#: LYMessages.c:859
+msgid "Upload Options"
+msgstr "Uploadopties"
+
+#: LYMessages.c:860
+msgid "Visited Links Page"
+msgstr "Bezochte links-pagina"
+
+#. CONFIG_DEF_TITLE subtitles
+#: LYMessages.c:863
+msgid "See also"
+msgstr "Zie ook"
+
+#: LYMessages.c:864
+msgid "your"
+msgstr "uw"
+
+#: LYMessages.c:865
+msgid "for runtime options"
+msgstr "voor uitvoeropties"
+
+#: LYMessages.c:866
+msgid "compile time options"
+msgstr "compilatieopties"
+
+#: LYMessages.c:867
+msgid "color-style configuration"
+msgstr "instellingen van kleurstijl"
+
+#: LYMessages.c:868
+msgid "latest release"
+msgstr "laatste versie"
+
+#: LYMessages.c:869
+msgid "pre-release version"
+msgstr "testversie"
+
+#: LYMessages.c:870
+msgid "development version"
+msgstr "ontwikkelversie"
+
+#. #define AUTOCONF_CONFIG_CACHE
+#: LYMessages.c:872
+msgid ""
+"The following data were derived during the automatic configuration/build\n"
+"process of this copy of Lynx. When reporting a bug, please include a copy\n"
+"of this page."
+msgstr ""
+"Onderstaande gegevens werden bepaald tijdens het configuratieproces van\n"
+"dit exemplaar van Lynx. Voeg een kopie van deze gegevens bij wanneer u\n"
+"een programmafout rapporteert."
+
+#. #define AUTOCONF_LYNXCFG_H
+#: LYMessages.c:876
+msgid ""
+"The following data were used as automatically-configured compile-time\n"
+"definitions when this copy of Lynx was built."
+msgstr ""
+"Onderstaande gegevens werden gebruikt als automatisch bepaalde\n"
+"definities tijdens het compileren van dit exemplaar van Lynx."
+
+#. #define DIRED_NOVICELINE
+#: LYMessages.c:881
+msgid " C)reate D)ownload E)dit F)ull menu M)odify R)emove T)ag U)pload \n"
+msgstr "C)reëer D)ownload E)dit F)-volledig menu M)-wijzig R)-wis T)-vink U)pload\n"
+
+#: LYMessages.c:882
+msgid "Failed to obtain status of current link!"
+msgstr "Kan status van de huidige link niet verkrijgen!"
+
+#. #define INVALID_PERMIT_URL
+#: LYMessages.c:885
+msgid "Special URL only valid from current File Permission menu!"
+msgstr "Speciale URL is alleen geldig vanuit huidige Bestandstoegangsrechten-menu!"
+
+#: LYMessages.c:889
+msgid "External support is currently disabled."
+msgstr "Externe ondersteuning is momenteel uitgeschakeld."
+
+#. new with 2.8.4dev.21
+#: LYMessages.c:893
+msgid "Changing working-directory is currently disabled."
+msgstr "De werkmap wijzigen is momenteel uitgeschakeld."
+
+#: LYMessages.c:894
+msgid "Linewrap OFF!"
+msgstr "Regelvouwen UIT!"
+
+#: LYMessages.c:895
+msgid "Linewrap ON!"
+msgstr "Regelvouwen AAN!"
+
+#: LYMessages.c:896
+msgid "Parsing nested-tables toggled OFF! Reloading..."
+msgstr "Ontleden van geneste tabellen is UITgezet! Herladen..."
+
+#: LYMessages.c:897
+msgid "Parsing nested-tables toggled ON! Reloading..."
+msgstr "Ontleden van geneste tabellen is AANgezet! Herladen..."
+
+#: LYMessages.c:898
+msgid "Shifting is disabled while line-wrap is in effect"
+msgstr "Schuiven is uitgeschakeld als regelvouwen in gebruik is"
+
+#: LYMessages.c:899
+msgid "Trace not supported"
+msgstr "Traceren wordt niet ondersteund"
+
+#: LYMessages.c:819
+#, c-format
+msgid "\tIndents: first=%.0f others=%.0f, Height=%.1f Desc=%.1f\n"
+msgstr " Inspringen: eerste=%.0f overigen=%.0f, hoogte=%.1f omschr=%.1f\n"
+
+#: WWW/Library/Implementation/HTAABrow.c:575
+#, c-format
+msgid "username for realm %s changed from %s to %s"
+msgstr "gebruikersnaam voor omgeving %s is gewijzigd van %s naar %s"
+
+#: WWW/Library/Implementation/HTAABrow.c:591
+#, c-format
+msgid "password for realm %s user %s changed"
+msgstr "wachtwoord voor omgeving %s gebruiker %s is gewijzigd"
+
+#: WWW/Library/Implementation/HTAABrow.c:703
+#, c-format
+msgid "Username for '%s' at %s '%s%s':"
+msgstr "Gebruikersnaam voor '%s' op %s '%s%s':"
+
+#: WWW/Library/Implementation/HTAABrow.c:976
+msgid "This client doesn't know how to compose proxy authorization information for scheme"
+msgstr "Dit programma weet niet hoe proxy-autorisatie-informatie te maken voor schema"
+
+#: WWW/Library/Implementation/HTAABrow.c:1053
+msgid "This client doesn't know how to compose authorization information for scheme"
+msgstr "Dit programma weet niet hoe autorisatie-informatie te maken voor schema"
+
+#: WWW/Library/Implementation/HTAABrow.c:1162
+#, c-format
+msgid "Invalid header '%s%s%s%s%s'"
+msgstr "Foutieve kop '%s%s%s%s%s'"
+
+#: WWW/Library/Implementation/HTAABrow.c:1266
+msgid "Proxy authorization required -- retrying"
+msgstr "Proxy-autorisatie is vereist -- nieuwe poging"
+
+#: WWW/Library/Implementation/HTAABrow.c:1322
+msgid "Access without authorization denied -- retrying"
+msgstr "Toegang zonder autorisatie is geweigerd -- nieuwe poging"
+
+#: WWW/Library/Implementation/HTAccess.c:698
+msgid "Access forbidden by rule"
+msgstr "Toegang is verboden volgens regel"
+
+#: WWW/Library/Implementation/HTAccess.c:800
+msgid "Document with POST content not found in cache. Resubmit?"
+msgstr "Document met POST inhoud niet gevonden in cache. Nog eens verzenden?"
+
+#: WWW/Library/Implementation/HTAccess.c:953
+msgid "Loading failed, use a previous copy."
+msgstr "Het laden is mislukt; gebruik een vroegere kopie."
+
+#: WWW/Library/Implementation/HTAccess.c:1062 src/GridText.c:8939
+msgid "Loading incomplete."
+msgstr "Laden is niet voltooid."
+
+#: WWW/Library/Implementation/HTAccess.c:1093
+#, c-format
+msgid "**** HTAccess: socket or file number returned by obsolete load routine!\n"
+msgstr "**** HTAccess: socket of bestandsnummer teruggegeven door verouderde laadroutine!\n"
+
+#: WWW/Library/Implementation/HTAccess.c:1095
+#, c-format
+msgid "**** HTAccess: Internal software error. Please mail lynx-dev@nongnu.org!\n"
+msgstr "**** HTAccess: Interne fout. Meld dit aan <lynx-dev@nongnu.org>!\n"
+
+#: WWW/Library/Implementation/HTAccess.c:1096
+#, c-format
+msgid "**** HTAccess: Status returned was: %d\n"
+msgstr "**** HTAccess: Geretourneerde status was: %d\n"
+
+#.
+#. * hack: if we fail in HTAccess.c
+#. * avoid duplicating URL, oh.
+#.
+#: WWW/Library/Implementation/HTAccess.c:1102 src/LYMainLoop.c:8076
+msgid "Can't Access"
+msgstr "Kan geen toegang krijgen"
+
+#: WWW/Library/Implementation/HTAccess.c:1110
+msgid "Unable to access document."
+msgstr "Kan geen toegang krijgen tot document."
+
+#: WWW/Library/Implementation/HTFTP.c:870
+#, c-format
+msgid "Enter password for user %s@%s:"
+msgstr "Voer wachtwoord in voor gebruiker %s@%s:"
+
+#: WWW/Library/Implementation/HTFTP.c:898
+msgid "Unable to connect to FTP host."
+msgstr "Kan geen verbinding maken met FTP-host."
+
+#: WWW/Library/Implementation/HTFTP.c:1137
+msgid "close master socket"
+msgstr "hoofdsocket sluiten"
+
+#: WWW/Library/Implementation/HTFTP.c:1195
+msgid "socket for master socket"
+msgstr "socket voor hoofdsocket"
+
+#: WWW/Library/Implementation/HTFTP.c:2925
+msgid "Receiving FTP directory."
+msgstr "Ophalen van FTP-bestandenoverzicht."
+
+#: WWW/Library/Implementation/HTFTP.c:3063
+#, c-format
+msgid "Transferred %d bytes (%5d)"
+msgstr "%d bytes overgezet (%5d)"
+
+#: WWW/Library/Implementation/HTFTP.c:3421
+msgid "connect for data"
+msgstr "verbinden voor datastroom"
+
+#: WWW/Library/Implementation/HTFTP.c:4098
+msgid "Receiving FTP file."
+msgstr "Ophalen van FTP-bestand."
+
+#: WWW/Library/Implementation/HTFinger.c:274
+msgid "Could not set up finger connection."
+msgstr "Kan finger-verbinding niet maken."
+
+#: WWW/Library/Implementation/HTFinger.c:321
+msgid "Could not load data (no sitename in finger URL)"
+msgstr "Kan gegevens niet laden (geen site-naam in finger-URL)"
+
+#: WWW/Library/Implementation/HTFinger.c:325
+msgid "Invalid port number - will only use port 79!"
+msgstr "Ongeldig poortnummer -- zal alleen poort 79 gebruiken!"
+
+#: WWW/Library/Implementation/HTFinger.c:391
+msgid "Could not access finger host."
+msgstr "Kan finger-host niet bereiken."
+
+#: WWW/Library/Implementation/HTFinger.c:399
+msgid "No response from finger server."
+msgstr "Geen antwoord van finger-server."
+
+#: WWW/Library/Implementation/HTNews.c:439
+#, c-format
+msgid "Username for news host '%s':"
+msgstr "Gebruikersnaam voor nieuws-host '%s':"
+
+#: WWW/Library/Implementation/HTNews.c:492
+msgid "Change username?"
+msgstr "Gebruikersnaam wijzigen?"
+
+#: WWW/Library/Implementation/HTNews.c:496
+msgid "Username:"
+msgstr "Gebruikersnaam:"
+
+#: WWW/Library/Implementation/HTNews.c:521
+#, c-format
+msgid "Password for news host '%s':"
+msgstr "Wachtwoord voor nieuws-host '%s':"
+
+#: WWW/Library/Implementation/HTNews.c:604
+msgid "Change password?"
+msgstr "Wachtwoord wijzigen?"
+
+#: WWW/Library/Implementation/HTNews.c:1725
+#, c-format
+msgid "No matches for: %s"
+msgstr "Geen overeenkomsten voor: %s"
+
+#: WWW/Library/Implementation/HTNews.c:1775
+msgid ""
+"\n"
+"No articles in this group.\n"
+msgstr ""
+"\n"
+"Geen artikelen gevonden in deze groep.\n"
+
+#: WWW/Library/Implementation/HTNews.c:1787
+msgid ""
+"\n"
+"No articles in this range.\n"
+msgstr ""
+"\n"
+"Geen artikelen in dit bereik.\n"
+
+#.
+#. * Set window title.
+#.
+#: WWW/Library/Implementation/HTNews.c:1800
+#, c-format
+msgid "%s, Articles %d-%d"
+msgstr "%s, Artikelen %d-%d"
+
+#: WWW/Library/Implementation/HTNews.c:1823
+msgid "Earlier articles"
+msgstr "Eerdere artikelen"
+
+#: WWW/Library/Implementation/HTNews.c:1836
+#, c-format
+msgid ""
+"\n"
+"There are about %d articles currently available in %s, IDs as follows:\n"
+"\n"
+msgstr ""
+"\n"
+"Er zijn momenteel ongeveer %d artikelen beschikbaar in %s, met volgende ID's:\n"
+
+#: WWW/Library/Implementation/HTNews.c:1898
+msgid "All available articles in "
+msgstr "Alle beschikbare artikelen in "
+
+#: WWW/Library/Implementation/HTNews.c:2112
+msgid "Later articles"
+msgstr "Latere artikelen"
+
+#: WWW/Library/Implementation/HTNews.c:2135
+msgid "Post to "
+msgstr "Posten naar "
+
+#: WWW/Library/Implementation/HTNews.c:2356
+msgid "This client does not contain support for SNEWS URLs."
+msgstr "Dit programma ondersteunt geen SNEWS-URL's."
+
+#: WWW/Library/Implementation/HTNews.c:2565
+msgid "No target for raw text!"
+msgstr "Geen bestemming voor ruwe tekst!"
+
+#: WWW/Library/Implementation/HTNews.c:2595
+msgid "Connecting to NewsHost ..."
+msgstr "Verbinden met nieuws-host ..."
+
+#: WWW/Library/Implementation/HTNews.c:2647
+#, c-format
+msgid "Could not access %s."
+msgstr "Geen toegang tot %s."
+
+#: WWW/Library/Implementation/HTNews.c:2753
+#, c-format
+msgid "Can't read news info. News host %.20s responded: %.200s"
+msgstr "Kan nieuwsinformatie niet lezen. Nieuws-host %.20s antwoordde: %.200s"
+
+#: WWW/Library/Implementation/HTNews.c:2757
+#, c-format
+msgid "Can't read news info, empty response from host %s"
+msgstr "Kan nieuwsinformatie niet lezen; loos antwoord van host %s"
+
+#.
+#. * List available newsgroups. - FM
+#.
+#: WWW/Library/Implementation/HTNews.c:2961
+msgid "Reading list of available newsgroups."
+msgstr "Lezen van lijst met beschikbare nieuwsgroepen."
+
+#: WWW/Library/Implementation/HTNews.c:2982
+msgid "Reading list of articles in newsgroup."
+msgstr "Lezen van lijst met artikelen in nieuwsgroep."
+
+#.
+#. * Get an article from a news group. - FM
+#.
+#: WWW/Library/Implementation/HTNews.c:2988
+msgid "Reading news article."
+msgstr "Lezen van nieuwsartikel."
+
+#: WWW/Library/Implementation/HTNews.c:3018
+msgid "Sorry, could not load requested news."
+msgstr "Sorry, kan het opgevraagde nieuws niet laden."
+
+#: WWW/Library/Implementation/HTTCP.c:1339
+msgid "Address has invalid port"
+msgstr "Adres bevat ongeldige poort"
+
+#: WWW/Library/Implementation/HTTCP.c:1410
+msgid "Address length looks invalid"
+msgstr "Adreslengte ziet er ongeldig uit"
+
+#: WWW/Library/Implementation/HTTCP.c:1868
+msgid "SOCKS5: no hostname found."
+msgstr "SOCKS5: geen hostnaam gevonden."
+
+#: WWW/Library/Implementation/HTTCP.c:1874
+msgid "SOCKS5: hostname too long."
+msgstr "SOCKS5: hostnaam is te lang."
+
+#: WWW/Library/Implementation/HTTCP.c:1892
+#, c-format
+msgid "(for %s at %s) SOCKS5"
+msgstr "(voor %s op %s) SOCKS5"
+
+#: WWW/Library/Implementation/HTTCP.c:1919
+#: WWW/Library/Implementation/HTTCP.c:1936
+#, c-format
+msgid "Unable to locate remote host %s."
+msgstr "Kan gindse computer %s niet vinden."
+
+#. Not HTProgress, so warning won't be overwritten immediately;
+#. * but not HTAlert, because typically there will be other
+#. * alerts from the callers. - kw
+#.
+#: WWW/Library/Implementation/HTTCP.c:1933
+#: WWW/Library/Implementation/HTTelnet.c:115
+#, c-format
+msgid "Invalid hostname %s"
+msgstr "Ongeldige hostnaam %s"
+
+#: WWW/Library/Implementation/HTTCP.c:1945
+#, c-format
+msgid "Making %s connection to %s"
+msgstr "Maken van %s-verbinding met %s"
+
+#: WWW/Library/Implementation/HTTCP.c:1955
+msgid "socket failed."
+msgstr "socket is mislukt."
+
+#: WWW/Library/Implementation/HTTCP.c:1969
+#, c-format
+msgid "socket failed: family %d addr %s port %s."
+msgstr "socket is mislukt: familie %d, adres %s, poort %s."
+
+#: WWW/Library/Implementation/HTTCP.c:1992
+msgid "Could not make connection non-blocking."
+msgstr "Kan verbinding niet niet-blokkerend maken."
+
+#: WWW/Library/Implementation/HTTCP.c:2058
+msgid "Connection failed (too many retries)."
+msgstr "Verbinden is mislukt (te vaak opnieuw geprobeerd)."
+
+#: WWW/Library/Implementation/HTTCP.c:2253
+msgid "Could not restore socket to blocking."
+msgstr "Kan socket niet naar blokkerende modus herstellen."
+
+#. RFC 1928: CONNECT request
+#: WWW/Library/Implementation/HTTCP.c:2285
+#, c-format
+msgid "SOCKS5: connecting to %s"
+msgstr "SOCKS5: verbinding maken met %s"
+
+#: WWW/Library/Implementation/HTTCP.c:2314
+msgid "SOCKS server failure"
+msgstr "SOCKS-serverfout"
+
+#: WWW/Library/Implementation/HTTCP.c:2317
+msgid "connection not allowed by ruleset"
+msgstr "verbinding is niet toegestaan vanwege een regel"
+
+#: WWW/Library/Implementation/HTTCP.c:2320
+msgid "network unreachable"
+msgstr "netwerk is onbereikbaar"
+
+#: WWW/Library/Implementation/HTTCP.c:2323
+msgid "host unreachable"
+msgstr "host is onbereikbaar"
+
+#: WWW/Library/Implementation/HTTCP.c:2326
+msgid "connection refused"
+msgstr "verbinding is geweigerd"
+
+#: WWW/Library/Implementation/HTTCP.c:2329
+msgid "TTL expired"
+msgstr "TTL is verlopen"
+
+#: WWW/Library/Implementation/HTTCP.c:2332
+msgid "command not supported"
+msgstr "opdracht wordt niet ondersteund"
+
+#: WWW/Library/Implementation/HTTCP.c:2335
+msgid "address type not supported"
+msgstr "adressoort wordt niet ondersteund"
+
+#: WWW/Library/Implementation/HTTCP.c:2338
+msgid "unknown SOCKS error code"
+msgstr "onbekende SOCKS-foutcode"
+
+#: WWW/Library/Implementation/HTTCP.c:2383
+msgid "unexpected reply\n"
+msgstr "onverwacht antwoord\n"
+
+#: WWW/Library/Implementation/HTTCP.c:2460
+msgid "Socket read failed (too many tries)."
+msgstr "Socket uitlezen is mislukt (te vaak opnieuw geprobeerd)."
+
+#: WWW/Library/Implementation/HTTP.c:165
+#, c-format
+msgid "SSL callback:%s, preverify_ok=%d, ssl_okay=%d"
+msgstr "SSL callback:%s, preverify_ok=%d, ssl_okay=%d"
+
+#: WWW/Library/Implementation/HTTP.c:668
+#, c-format
+msgid "User/password contains only punctuation: %s"
+msgstr "Gebruikersnaam/wachtwoord bevat alleen interpunctie: %s"
+
+#: WWW/Library/Implementation/HTTP.c:672
+#, c-format
+msgid "User/password may be confused with hostname: '%s' (e.g, '%s')"
+msgstr "Gebruikersnaam/wachtwoord kan verward worden met hostnaam: '%s' (bijvoorbeeld '%s')"
+
+#: WWW/Library/Implementation/HTTP.c:733
+#, c-format
+msgid "Certificate issued by: %s"
+msgstr "Certificaat is uitgeven door: %s"
+
+#: WWW/Library/Implementation/HTTP.c:922
+msgid "This client does not contain support for HTTPS URLs."
+msgstr "Dit programma ondersteunt geen HTTPS-URL's."
+
+#: WWW/Library/Implementation/HTTP.c:947
+msgid "Unable to connect to remote host."
+msgstr "Kan geen verbinding maken met gindse computer."
+
+#: WWW/Library/Implementation/HTTP.c:990
+msgid "Retrying connection without TLS."
+msgstr "Verbinding wordt opnieuw geprobeerd zonder TLS."
+
+#: WWW/Library/Implementation/HTTP.c:1042
+msgid "GnuTLS error when trying to verify certificate."
+msgstr "GnuTLS-fout tijdens verificatie van certificaat."
+
+#: WWW/Library/Implementation/HTTP.c:1055
+msgid "the certificate has no known issuer"
+msgstr "het certificaat heeft geen bekende uitgever"
+
+#: WWW/Library/Implementation/HTTP.c:1057
+msgid "no issuer was found"
+msgstr "geen uitgever gevonden"
+
+#: WWW/Library/Implementation/HTTP.c:1059
+msgid "issuer is not a CA"
+msgstr "uitgever is geen CA"
+
+#: WWW/Library/Implementation/HTTP.c:1061
+msgid "the certificate has been revoked"
+msgstr "het certificaat is herroepen"
+
+#: WWW/Library/Implementation/HTTP.c:1063
+msgid "the certificate is not trusted"
+msgstr "het certificaat wordt niet vertrouwd"
+
+#: WWW/Library/Implementation/HTTP.c:1138
+#, c-format
+msgid "Verified connection to %s (cert=%s)"
+msgstr "Geverifieerde verbinding met %s (cert=%s)"
+
+#: WWW/Library/Implementation/HTTP.c:1188
+#: WWW/Library/Implementation/HTTP.c:1230
+#, c-format
+msgid "Verified connection to %s (subj=%s)"
+msgstr "Geverifieerde verbinding met %s (subj=%s)"
+
+#: WWW/Library/Implementation/HTTP.c:1260
+msgid "Can't find common name in certificate"
+msgstr "Kan in certificaat geen gewone naam vinden"
+
+#: WWW/Library/Implementation/HTTP.c:1263
+#, c-format
+msgid "SSL error:host(%s)!=cert(%s)-Continue?"
+msgstr "SSL-fout: computer(%s)!=certificaat(%s). Verdergaan?"
+
+#: WWW/Library/Implementation/HTTP.c:1270
+msgid "SSL error"
+msgstr "SSL-fout"
+
+#: WWW/Library/Implementation/HTTP.c:1278
+#, c-format
+msgid "UNVERIFIED connection to %s (cert=%s)"
+msgstr "ONGEVERIFIEERDE verbinding met %s (cert=%s)"
+
+#: WWW/Library/Implementation/HTTP.c:1287
+#, c-format
+msgid "Secure %d-bit %s (%s) HTTP connection"
+msgstr "Veilige %d-bits %s (%s) HTTP-verbinding"
+
+#: WWW/Library/Implementation/HTTP.c:1757
+msgid "Sending HTTP request."
+msgstr "Zenden van HTTP-verzoek."
+
+#: WWW/Library/Implementation/HTTP.c:1799
+msgid "Unexpected network write error; connection aborted."
+msgstr "Onverwachte fout bij schrijven naar netwerk; verbinding is verbroken."
+
+#: WWW/Library/Implementation/HTTP.c:1805
+msgid "HTTP request sent; waiting for response."
+msgstr "HTTP-verzoek is verzonden; wacht op antwoord."
+
+#: WWW/Library/Implementation/HTTP.c:1878
+#: WWW/Library/Implementation/HTTP.c:1888
+msgid "Unexpected network read error; connection aborted."
+msgstr "Onverwachte fout bij lezen uit netwerk; verbinding is verbroken."
+
+#.
+#. * HTTP/1.1 Informational statuses.
+#. * 100 Continue.
+#. * 101 Switching Protocols.
+#. * > 101 is unknown.
+#. * We should never get these, and they have only the status
+#. * line and possibly other headers, so we'll deal with them by
+#. * showing the full header to the user as text/plain. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2091
+msgid "Got unexpected Informational Status."
+msgstr "Onverwachte informatieve status ontvangen."
+
+#.
+#. * Reset Content. The server has fulfilled the request but
+#. * nothing is returned and we should reset any form
+#. * content. We'll instruct the user to do that, and
+#. * restore the current document. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2125
+msgid "Request fulfilled. Reset Content."
+msgstr "Verzoek is volbracht. Herstellen van inhoud."
+
+#. Not Modified
+#.
+#. * We didn't send an "If-Modified-Since" header, so this
+#. * status is inappropriate. We'll deal with it by showing
+#. * the full header to the user as text/plain. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2242
+msgid "Got unexpected 304 Not Modified status."
+msgstr "Kreeg een onverwachte '304 Niet gewijzigd'-statusmelding."
+
+#: WWW/Library/Implementation/HTTP.c:2305
+msgid "Redirection of POST content requires user approval."
+msgstr "Doorverwijzing van POST-inhoud vereist toestemming van de gebruiker."
+
+#: WWW/Library/Implementation/HTTP.c:2320
+msgid "Have POST content. Treating Permanent Redirection as Temporary.\n"
+msgstr "Heb POST-inhoud. Permanente doorverwijzing wordt behandeld als een tijdelijke.\n"
+
+#: WWW/Library/Implementation/HTTP.c:2366
+msgid "Retrying with access authorization information."
+msgstr "Bezig opnieuw te proberen met toegangsautorisatie-informatie."
+
+#: WWW/Library/Implementation/HTTP.c:2378
+msgid "Show the 401 message body?"
+msgstr "Inhoud van het 401-bericht laten zien?"
+
+#: WWW/Library/Implementation/HTTP.c:2422
+msgid "Show the 407 message body?"
+msgstr "Inhoud van het 407-bericht laten zien?"
+
+#.
+#. * Bad or unknown server_status number. Take a chance and hope
+#. * there is something to display. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2522
+msgid "Unknown status reply from server!"
+msgstr "Onbekende statusmelding van server!"
+
+#: WWW/Library/Implementation/HTTelnet.c:113
+#, c-format
+msgid "remote %s session:"
+msgstr "sessie %s op andere computer:"
+
+#: WWW/Library/Implementation/HTWAIS.c:163
+msgid "Could not connect to WAIS server."
+msgstr "Kan verbinding met WAIS-server niet tot stand brengen."
+
+#: WWW/Library/Implementation/HTWAIS.c:171
+msgid "Could not open WAIS connection for reading."
+msgstr "Kan WAIS-verbinding voor lezen niet tot stand brengen."
+
+#: WWW/Library/Implementation/HTWAIS.c:193
+msgid "Diagnostic code is "
+msgstr "Diagnostische code is "
+
+#: WWW/Library/Implementation/HTWAIS.c:460
+msgid "Index "
+msgstr "Inhoud "
+
+#: WWW/Library/Implementation/HTWAIS.c:464
+#, c-format
+msgid " contains the following %d item%s relevant to \""
+msgstr " bevat de volgende %d item%s relevant voor \""
+
+#: WWW/Library/Implementation/HTWAIS.c:472
+msgid "The first figure after each entry is its relative score, "
+msgstr "Het eerste cijfer achter elk item is zijn relatieve score, "
+
+#: WWW/Library/Implementation/HTWAIS.c:473
+msgid "the second is the number of lines in the item."
+msgstr "het tweede is het aantal regels in het item."
+
+#: WWW/Library/Implementation/HTWAIS.c:515
+msgid " (bad file name)"
+msgstr " (foutieve bestandsnaam)"
+
+#: WWW/Library/Implementation/HTWAIS.c:541
+msgid "(bad doc id)"
+msgstr "(foutief document-ID.)"
+
+#: WWW/Library/Implementation/HTWAIS.c:557
+msgid "(Short Header record, can't display)"
+msgstr "(Verkorte Kop structuur, niet toonbaar)"
+
+#: WWW/Library/Implementation/HTWAIS.c:564
+msgid ""
+"\n"
+"Long Header record, can't display\n"
+msgstr ""
+"\n"
+"Lange Kop structuur, niet toonbaar\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:571
+msgid ""
+"\n"
+"Text record\n"
+msgstr ""
+"\n"
+"Tekst structuur\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:580
+msgid ""
+"\n"
+"Headline record, can't display\n"
+msgstr ""
+"\n"
+"Kopregel structuur, niet toonbaar\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:588
+msgid ""
+"\n"
+"Code record, can't display\n"
+msgstr ""
+"\n"
+"Code structuur, niet toonbaar\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:692
+msgid "Syntax error in WAIS URL"
+msgstr "Syntactische fout in WAIS-URL"
+
+#: WWW/Library/Implementation/HTWAIS.c:764
+msgid " (WAIS Index)"
+msgstr " (WAIS-index)"
+
+#: WWW/Library/Implementation/HTWAIS.c:771
+msgid "WAIS Index: "
+msgstr "WAIS-index: "
+
+#: WWW/Library/Implementation/HTWAIS.c:777
+msgid "This is a link for searching the "
+msgstr "Deze link is om te zoeken in de "
+
+#: WWW/Library/Implementation/HTWAIS.c:781
+msgid " WAIS Index.\n"
+msgstr " WAIS-index.\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:810
+msgid ""
+"\n"
+"Enter the 's'earch command and then specify search words.\n"
+msgstr ""
+"\n"
+"Typ de zoekopdracht ('s') en specificeer dan zoektermen.\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:832
+msgid " (in "
+msgstr " (in "
+
+#: WWW/Library/Implementation/HTWAIS.c:841
+msgid "WAIS Search of \""
+msgstr "WAIS doorzoeken naar \""
+
+#: WWW/Library/Implementation/HTWAIS.c:845
+msgid "\" in: "
+msgstr "\" in: "
+
+#: WWW/Library/Implementation/HTWAIS.c:860
+msgid "HTWAIS: Request too large."
+msgstr "HTWAIS: Verzoek is te groot."
+
+#: WWW/Library/Implementation/HTWAIS.c:869
+msgid "Searching WAIS database..."
+msgstr "Doorzoeken van WAIS-databank..."
+
+#: WWW/Library/Implementation/HTWAIS.c:879
+msgid "Search interrupted."
+msgstr "Zoeken is onderbroken."
+
+#: WWW/Library/Implementation/HTWAIS.c:930
+msgid "Can't convert format of WAIS document"
+msgstr "Kan opmaak van WAIS-document niet converteren"
+
+#: WWW/Library/Implementation/HTWAIS.c:974
+msgid "HTWAIS: Request too long."
+msgstr "HTWAIS: Verzoek is te lang."
+
+#.
+#. * Actually do the transaction given by request_message.
+#.
+#: WWW/Library/Implementation/HTWAIS.c:988
+msgid "Fetching WAIS document..."
+msgstr "Ophalen van WAIS-document..."
+
+#. display_search_response(target, retrieval_response,
+#. wais_database, keywords);
+#: WWW/Library/Implementation/HTWAIS.c:1027
+msgid "No text was returned!\n"
+msgstr "Er is geen tekst geretourneerd!\n"
+
+#: WWW/Library/Implementation/HTWSRC.c:302
+msgid " NOT GIVEN in source file; "
+msgstr " NIET OPGEGEVEN in bronbestand; "
+
+#: WWW/Library/Implementation/HTWSRC.c:325
+msgid " WAIS source file"
+msgstr " WAIS-bronbestand"
+
+#: WWW/Library/Implementation/HTWSRC.c:332
+msgid " description"
+msgstr " omschrijving"
+
+#: WWW/Library/Implementation/HTWSRC.c:342
+msgid "Access links"
+msgstr "Toegangs-links"
+
+#: WWW/Library/Implementation/HTWSRC.c:363
+msgid "Direct access"
+msgstr "Directe toegang"
+
+#. * Proxy will be used if defined, so let user know that - FM *
+#: WWW/Library/Implementation/HTWSRC.c:366
+msgid " (or via proxy server, if defined)"
+msgstr " (of via een proxy-server, indien opgegeven)"
+
+#: WWW/Library/Implementation/HTWSRC.c:381
+msgid "Maintainer"
+msgstr "Beheerder"
+
+#: WWW/Library/Implementation/HTWSRC.c:389
+msgid "Host"
+msgstr "Computer"
+
+#: src/GridText.c:723
+msgid "Memory exhausted, display interrupted!"
+msgstr "Geen geheugen meer beschikbar, weergave is onderbroken!"
+
+#: src/GridText.c:728
+msgid "Memory exhausted, will interrupt transfer!"
+msgstr "Geen geheugen meer beschikbaar, overdracht wordt afgebroken!"
+
+#: src/GridText.c:1719
+#, c-format
+msgid " (l%d of %d)"
+msgstr " (l%d van %d)"
+
+#: src/GridText.c:1728
+#, c-format
+msgid " (p%d of %d)"
+msgstr " (p%d van %d)"
+
+#: src/GridText.c:3720
+msgid " *** MEMORY EXHAUSTED ***"
+msgstr " *** ONVOLDOENDE GEHEUGEN BESCHIKBAAR ***"
+
+#: src/GridText.c:6220
+msgid "text entry field"
+msgstr "tekstinvoerveld"
+
+#: src/GridText.c:6223
+msgid "password entry field"
+msgstr "wachtwoordinvoerveld"
+
+#: src/GridText.c:6226
+msgid "checkbox"
+msgstr "aanvinkvakje"
+
+#: src/GridText.c:6229
+msgid "radio button"
+msgstr "drukknop"
+
+#: src/GridText.c:6232
+msgid "submit button"
+msgstr "verzendknop"
+
+#: src/GridText.c:6235
+msgid "reset button"
+msgstr "herstelknop"
+
+#: src/GridText.c:6238
+msgid "script button"
+msgstr "scriptknop"
+
+#: src/GridText.c:6241
+msgid "popup menu"
+msgstr "popup-menu"
+
+#: src/GridText.c:6244
+msgid "hidden form field"
+msgstr "verborgen formulierveld"
+
+#: src/GridText.c:6247
+msgid "text entry area"
+msgstr "tekstinvoergebied"
+
+#: src/GridText.c:6250
+msgid "range entry field"
+msgstr "bereikinvoerveld"
+
+#: src/GridText.c:6253
+msgid "file entry field"
+msgstr "bestandsnaaminvoerveld"
+
+#: src/GridText.c:6256
+msgid "text-submit field"
+msgstr "tekst-verzendveld"
+
+#: src/GridText.c:6259
+msgid "image-submit button"
+msgstr "afbeelding-verzendknop"
+
+#: src/GridText.c:6262
+msgid "keygen field"
+msgstr "sleutelaanmaakveld"
+
+#: src/GridText.c:6265
+msgid "unknown form field"
+msgstr "onbekend formulierveld"
+
+#: src/GridText.c:6285 src/GridText.c:6292 src/LYList.c:249
+msgid "unknown field or link"
+msgstr "onbekend veld of link"
+
+#: src/GridText.c:10722
+msgid "Can't open file for uploading"
+msgstr "Kan bestand niet openen voor upload"
+
+#: src/GridText.c:11910
+#, c-format
+msgid "Submitting %s"
+msgstr "Verzenden van %s"
+
+#. ugliness has happened; inform user and do the best we can
+#: src/GridText.c:12980
+msgid "Hang Detect: TextAnchor struct corrupted - suggest aborting!"
+msgstr "Ophanging gedetecteerd: TextAnchor-struct is beschadigd -- stel voor te onderbreken!"
+
+#. don't show previous state
+#: src/GridText.c:13139
+msgid "Wrap lines to fit displayed area?"
+msgstr "Regels omvouwen zodat alles zichtbaar is?"
+
+#: src/GridText.c:13772
+msgid "Very long lines have been truncated!"
+msgstr "Erg lange regels zijn afgekapt!"
+
+#: src/HTAlert.c:164 src/LYShowInfo.c:389 src/LYShowInfo.c:393
+msgid "bytes"
+msgstr "bytes"
+
+#.
+#. * If we know the total size of the file, we can compute
+#. * a percentage, and show a corresponding progress bar.
+#.
+#: src/HTAlert.c:328 src/HTAlert.c:354
+#, c-format
+msgid "Read %s of data"
+msgstr "%s aan gegevens gelezen"
+
+#: src/HTAlert.c:351
+#, c-format
+msgid "Read %s of %s of data"
+msgstr "%s van %s aan gegevens gelezen"
+
+#: src/HTAlert.c:360
+#, c-format
+msgid ", %s/sec"
+msgstr ", %s/s"
+
+#: src/HTAlert.c:374
+#, c-format
+msgid " (stalled for %s)"
+msgstr " (gestopt voor %s)"
+
+#: src/HTAlert.c:378
+#, c-format
+msgid ", ETA %s"
+msgstr ", ETA %s"
+
+#: src/HTAlert.c:400
+msgid " (Press 'z' to abort)"
+msgstr " (Druk op 'z' om te stoppen)"
+
+#. Meta-note: don't move the following note from its place right
+#. in front of the first gettext(). As it is now, it should
+#. automatically appear in generated lynx.pot files. - kw
+#.
+#. NOTE TO TRANSLATORS: If you provide a translation for "yes", lynx
+#. * will take the first byte of the translation as a positive response
+#. * to Yes/No questions. If you provide a translation for "no", lynx
+#. * will take the first byte of the translation as a negative response
+#. * to Yes/No questions. For both, lynx will also try to show the
+#. * first byte in the prompt as a character, instead of (y) or (n),
+#. * respectively. This will not work right for multibyte charsets!
+#. * Don't translate "yes" and "no" for CJK character sets (or translate
+#. * them to "yes" and "no"). For a translation using UTF-8, don't
+#. * translate if the translation would begin with anything but a 7-bit
+#. * (US_ASCII) character. That also means do not translate if the
+#. * translation would begin with anything but a 7-bit character, if
+#. * you use a single-byte character encoding (a charset like ISO-8859-n)
+#. * but anticipate that the message catalog may be used re-encoded in
+#. * UTF-8 form.
+#. * For translations using other character sets, you may also wish to
+#. * leave "yes" and "no" untranslated, if using (y) and (n) is the
+#. * preferred behavior.
+#. * Lynx will also accept y Y n N as responses unless there is a conflict
+#. * with the first letter of the "yes" or "no" translation.
+#.
+#: src/HTAlert.c:438 src/HTAlert.c:486
+msgid "yes"
+msgstr "ja"
+
+#: src/HTAlert.c:441 src/HTAlert.c:487
+msgid "no"
+msgstr "nee"
+
+#.
+#. * Special-purpose workaround for gettext support (we should do
+#. * this in a more general way) -TD
+#. *
+#. * NOTE TO TRANSLATORS: If the prompt has been rendered into
+#. * another language, and if yes/no are distinct, assume the
+#. * translator can make an ordered list in parentheses with one
+#. * capital letter for each as we assumed in HTConfirmDefault().
+#. * The list has to be in the same order as in the original message,
+#. * and the four capital letters chosen to not match those in the
+#. * original unless they have the same position.
+#. *
+#. * Example:
+#. * (Y/N/Always/neVer) - English (original)
+#. * (O/N/Toujours/Jamais) - French
+#.
+#: src/HTAlert.c:938
+msgid "Y/N/A/V"
+msgstr "(J/N/A/O)"
+
+#: src/HTML.c:5769
+msgid "Description:"
+msgstr "Omschrijving:"
+
+#: src/HTML.c:5774
+msgid "(none)"
+msgstr "(geen)"
+
+#: src/HTML.c:5778
+msgid "Filepath:"
+msgstr "Bestandspad:"
+
+#: src/HTML.c:5784
+msgid "(unknown)"
+msgstr "(onbekend)"
+
+#: src/HTML.c:7224
+msgid "Document has only hidden links. Use the 'l'ist command."
+msgstr "Document heeft slechts verborgen links. Gebruik het 'l'ijst commando."
+
+# Source?
+#: src/HTML.c:7725
+msgid "Source cache error - disk full?"
+msgstr "Cache fout - schijf vol?"
+
+#: src/HTML.c:7738
+msgid "Source cache error - not enough memory!"
+msgstr "Cache fout - niet genoeg geheugen!"
+
+#: src/LYBookmark.c:167
+msgid ""
+" This file is an HTML representation of the X Mosaic hotlist file.\n"
+" Outdated or invalid links may be removed by using the\n"
+" remove bookmark command, it is usually the 'R' key but may have\n"
+" been remapped by you or your system administrator."
+msgstr ""
+" Dit bestand is een HTML representatie van het 'X Mosaic hotlist'\n"
+" bestand. Verlopen of foutieve links kunnen verwijderd worden met\n"
+" het 'verwijder boekenlegger', welke doorgaans gekoppeld is aan\n"
+" de 'R' toets, maar uw systeembeheerder heeft dit wellicht gewijzigd."
+
+#: src/LYBookmark.c:380
+#, c-format
+msgid ""
+" You can delete links by the 'R' key<br>\n"
+"<ol>\n"
+msgstr ""
+" U kunt links verwijderen met de 'R' toets<br>\n"
+"<ol>\n"
+
+#: src/LYBookmark.c:383
+msgid ""
+" You can delete links using the remove bookmark command. It is usually\n"
+" the 'R' key but may have been remapped by you or your system\n"
+" administrator."
+msgstr ""
+" U kunt links verwijderen met het commando 'verwijder boekenlegger'.\n"
+" Dit is doorgaans de 'R' toets, maar uw systeembeheerder kan dit\n"
+" gewijzigd hebben."
+
+#: src/LYBookmark.c:387
+msgid ""
+" This file also may be edited with a standard text editor to delete\n"
+" outdated or invalid links, or to change their order."
+msgstr ""
+" Dit bestand kan ook met een doorsnee tekst-editor worden gewijzigd om\n"
+" verlopen of foutieve links te wissen, of om de volgorde aan te passen."
+
+#: src/LYBookmark.c:390
+msgid ""
+"Note: if you edit this file manually\n"
+" you should not change the format within the lines\n"
+" or add other HTML markup.\n"
+" Make sure any bookmark link is saved as a single line."
+msgstr ""
+"N.B.: als u dit bestand handmatig hebt aangepast\n"
+" moet u niet de formattering binnen de regels aanpassen\n"
+" of andere HTML opmaak toevoegen.\n"
+" Boekenlegger-links dienen als één regel te worden opgeslagen."
+
+#: src/LYBookmark.c:686
+#, c-format
+msgid "File may be recoverable from %s during this session"
+msgstr "Het bestand is gedurende deze sessie wellicht terug te halen uit %s"
+
+#: src/LYCgi.c:161
+#, c-format
+msgid "Do you want to execute \"%s\"?"
+msgstr "Wilt u \"%s\" uitvoeren?"
+
+#.
+#. * Neither the path as given nor any components examined by backing up
+#. * were stat()able. - kw
+#.
+#: src/LYCgi.c:276
+msgid "Unable to access cgi script"
+msgstr "Geen toegang tot cgi script"
+
+#: src/LYCgi.c:709 src/LYCgi.c:712
+msgid "Good Advice"
+msgstr "Goede Raad"
+
+#: src/LYCgi.c:716
+msgid "An excellent http server for VMS is available via"
+msgstr "Een uitstekende http server voor VMS is bereikbaar via"
+
+#: src/LYCgi.c:723
+msgid "this link"
+msgstr "deze link"
+
+#: src/LYCgi.c:727
+msgid "It provides state of the art CGI script support.\n"
+msgstr "Het biedt voortreffelijke CGI script ondersteuning.\n"
+
+#: src/LYClean.c:115
+msgid "Exiting via interrupt:"
+msgstr "Beëindiging via interrupt:"
+
+#: src/LYCookie.c:2651
+msgid "(from a previous session)"
+msgstr "(van een eerdere sessie)"
+
+#: src/LYCookie.c:2712
+msgid "Maximum Gobble Date:"
+msgstr "Uiterste Houdbaarheidsdatum:"
+
+#: src/LYCookie.c:2751
+msgid "Internal"
+msgstr "Intern"
+
+#: src/LYCookie.c:2752
+msgid "cookie_domain_flag_set error, aborting program"
+msgstr "cookie_domain_flag_set fout, programma wordt afgebroken"
+
+#: src/LYCurses.c:1136
+msgid "Terminal reinitialisation failed - unknown terminal type?"
+msgstr "Herinitialisatie van terminal is mislukt -- onbekend terminaltype?"
+
+#: src/LYCurses.c:1343
+msgid "Terminal initialisation failed - unknown terminal type?"
+msgstr "Initialisatie van terminal is mislukt -- onbekend terminaltype?"
+
+#: src/LYCurses.c:1837
+msgid "Terminal ="
+msgstr "Terminal ="
+
+#: src/LYCurses.c:1841
+msgid "You must use a vt100, 200, etc. terminal with this program."
+msgstr "U mout een vt100, 200, enz. terminal gebruiken met dit programma."
+
+#: src/LYCurses.c:1890
+msgid "Your Terminal type is unknown!"
+msgstr "Uw terminaltype is onbekend!"
+
+#: src/LYCurses.c:1891
+msgid "Enter a terminal type:"
+msgstr "Voer een terminaltype in:"
+
+#: src/LYCurses.c:1905
+msgid "TERMINAL TYPE IS SET TO"
+msgstr "TERMINALTYPE IS GEZET OP"
+
+#: src/LYCurses.c:2464
+#, c-format
+msgid ""
+"\n"
+"A Fatal error has occurred in %s Ver. %s\n"
+msgstr ""
+"\n"
+"Een fatale fout is opgetreden in %s Ver. %s\n"
+
+#: src/LYCurses.c:2467
+#, c-format
+msgid ""
+"\n"
+"Please notify your system administrator to confirm a bug, and if\n"
+"confirmed, to notify the lynx-dev list. Bug reports should have concise\n"
+"descriptions of the command and/or URL which causes the problem, the\n"
+"operating system name with version number, the TCPIP implementation, the\n"
+"TRACEBACK if it can be captured, and any other relevant information.\n"
+msgstr ""
+"\n"
+"Vraag uw systeembeheerder om deze fout te bevestigen, en indien bevestigd,\n"
+"breng dan de lynx-dev mailinglijst hiervan op de hoogte. Een foutrapportage\n"
+"moet een nauwgezette omschrijving bevatten van het commando en/of de URL die\n"
+"het probleem veroorzaakt heeft, alsmede de naam en het versienummer van het\n"
+"besturingssysteem, de TCP/IP-implementatie, de BACKTRACE (indien beschikbaar),\n"
+"en alle andere relevante informatie.\n"
+
+#: src/LYEdit.c:272
+#, c-format
+msgid "Error starting editor, %s"
+msgstr "Fout bij starten van editor, %s"
+
+#: src/LYEdit.c:275
+msgid "Editor killed by signal"
+msgstr "Editor is geëlimineerd door signaal"
+
+#: src/LYEdit.c:280
+#, c-format
+msgid "Editor returned with error status %s"
+msgstr "Editor gaf afsluitwaarde %s terug"
+
+#: src/LYDownload.c:511
+msgid "Downloaded link:"
+msgstr "Gedownloade link:"
+
+#: src/LYDownload.c:516
+msgid "Suggested file name:"
+msgstr "Voorgestelde bestandsnaam:"
+
+#: src/LYDownload.c:521
+msgid "Standard download options:"
+msgstr "Standaard downloadmogelijkheden:"
+
+#: src/LYDownload.c:522
+msgid "Download options:"
+msgstr "Downloadmogelijkheden:"
+
+#: src/LYDownload.c:538
+msgid "Save to disk"
+msgstr "Opslaan op schijf"
+
+#: src/LYDownload.c:552
+msgid "View temporary file"
+msgstr "Tijdelijk bestand bekijken"
+
+#: src/LYDownload.c:559
+msgid "Save to disk disabled."
+msgstr "Opslaan op schijf is uitgeschakeld."
+
+#: src/LYDownload.c:563 src/LYPrint.c:1331
+msgid "Local additions:"
+msgstr "Lokale toevoegingen:"
+
+#: src/LYDownload.c:574 src/LYUpload.c:206
+msgid "No Name Given"
+msgstr "Geen naam opgegeven"
+
+#: src/LYHistory.c:673
+msgid "You selected:"
+msgstr "U selecteerde:"
+
+#: src/LYHistory.c:697 src/LYHistory.c:926
+msgid "(no address)"
+msgstr "(geen adres)"
+
+#: src/LYHistory.c:701
+msgid " (internal)"
+msgstr " (intern)"
+
+#: src/LYHistory.c:703
+msgid " (was internal)"
+msgstr " (was intern)"
+
+#: src/LYHistory.c:801
+msgid " (From History)"
+msgstr " (Uit historie)"
+
+#: src/LYHistory.c:846
+msgid "You visited (POSTs, bookmark, menu and list files excluded):"
+msgstr "U bezocht (m.u.v. POST's, boekenlegger, menu en lijstbestanden):"
+
+#: src/LYHistory.c:1148
+msgid "(No messages yet)"
+msgstr "(Nog geen vermeldingen)"
+
+#: src/LYLeaks.c:222
+msgid "Invalid pointer detected."
+msgstr "Foutieve verwijzing gevonden."
+
+#: src/LYLeaks.c:224 src/LYLeaks.c:262
+msgid "Sequence:"
+msgstr "Sequentie:"
+
+#: src/LYLeaks.c:227 src/LYLeaks.c:265
+msgid "Pointer:"
+msgstr "Verwijzing:"
+
+#: src/LYLeaks.c:236 src/LYLeaks.c:243 src/LYLeaks.c:284
+msgid "FileName:"
+msgstr "BestandsNaam:"
+
+#: src/LYLeaks.c:239 src/LYLeaks.c:246 src/LYLeaks.c:287 src/LYLeaks.c:298
+msgid "LineCount:"
+msgstr "RegelAantal:"
+
+#: src/LYLeaks.c:260
+msgid "Memory leak detected."
+msgstr "Geheugenlek ontdekt."
+
+#: src/LYLeaks.c:268
+msgid "Contains:"
+msgstr "Bevat:"
+
+#: src/LYLeaks.c:281
+msgid "ByteSize:"
+msgstr "ByteGrootte:"
+
+#: src/LYLeaks.c:295
+msgid "realloced:"
+msgstr "Geherreserveerd:"
+
+#: src/LYLeaks.c:316
+msgid "Total memory leakage this run:"
+msgstr "Totale geheugenlekkage tijdens deze uitvoering:"
+
+#: src/LYLeaks.c:320
+msgid "Peak allocation"
+msgstr "Piekreserveringen"
+
+#: src/LYLeaks.c:322
+msgid "Bytes allocated"
+msgstr "Aantal gereserveerde bytes"
+
+#: src/LYLeaks.c:324
+msgid "Total mallocs"
+msgstr "Totaal aantal reserveringen"
+
+#: src/LYLeaks.c:326
+msgid "Total frees"
+msgstr "Totaal aantal vrijgevingen"
+
+#: src/LYList.c:89
+msgid "References in "
+msgstr "Referenties in "
+
+#: src/LYList.c:92
+msgid "this document:"
+msgstr "dit document:"
+
+#: src/LYList.c:98 src/LYList.c:363
+msgid "Visible links:"
+msgstr "Zichtbare links:"
+
+#: src/LYList.c:202 src/LYList.c:322
+msgid "Hidden links:"
+msgstr "Verborgen links:"
+
+#: src/LYList.c:359
+msgid "References"
+msgstr "Referenties"
+
+#: src/LYLocal.c:289
+#, c-format
+msgid "Unable to get status of '%s'."
+msgstr "Kan status van '%s' niet opvragen."
+
+#: src/LYLocal.c:354
+msgid "The selected item is not a file or a directory! Request ignored."
+msgstr "Het geselecteerde item is geen bestand of map! Verzoek is genegeerd."
+
+#: src/LYLocal.c:456
+#, c-format
+msgid "Unable to %s due to system error!"
+msgstr "Het %s is mislukt vanwege systeemfout!"
+
+#: src/LYLocal.c:490
+#, c-format
+msgid "Probable failure to %s due to system error!"
+msgstr "Waarschijnlijke fout tijdens het %s vanwege systeemfout!"
+
+#: src/LYLocal.c:555 src/LYLocal.c:578
+#, c-format
+msgid "remove %s"
+msgstr "verwijderen van %s"
+
+#: src/LYLocal.c:598
+#, c-format
+msgid "touch %s"
+msgstr "aanraken van %s"
+
+#: src/LYLocal.c:628
+#, c-format
+msgid "move %s to %s"
+msgstr "verplaatsen van %s naar %s"
+
+#: src/LYLocal.c:676
+msgid "There is already a directory with that name! Request ignored."
+msgstr "Er is al een map met die naam! Verzoek is genegeerd."
+
+#: src/LYLocal.c:678
+msgid "There is already a file with that name! Request ignored."
+msgstr "Er is al een bestand met die naam! Verzoek is genegeerd."
+
+#: src/LYLocal.c:680
+msgid "The specified name is already in use! Request ignored."
+msgstr "De opgegeven naam is al in gebruik! Verzoek is genegeerd."
+
+#: src/LYLocal.c:692
+msgid "Destination has different owner! Request denied."
+msgstr "Bestemming heeft een andere eigenaar! Verzoek is genegeerd."
+
+#: src/LYLocal.c:695
+msgid "Destination is not a valid directory! Request denied."
+msgstr "Bestemming is geen geldige map! Verzoek is genegeerd."
+
+#: src/LYLocal.c:711
+msgid "Source and destination are the same location! Request ignored!"
+msgstr "Bron en bestemming zijn dezelfde locatie! Verzoek is genegeerd!"
+
+#: src/LYLocal.c:735
+msgid "Remove all tagged files and directories?"
+msgstr "Alle aangevinkte bestand en mappen verwijderen?"
+
+#: src/LYLocal.c:808
+msgid "Enter new location for tagged items: "
+msgstr "Voer een nieuwe bestemming in voor aangevinkte items: "
+
+#: src/LYLocal.c:906
+msgid "Enter new name for directory: "
+msgstr "Voer een nieuwe naam in voor map: "
+
+#: src/LYLocal.c:908
+msgid "Enter new name for file: "
+msgstr "Voer een nieuwe naam in voor bestand: "
+
+#: src/LYLocal.c:920
+msgid "Illegal character (path-separator) found! Request ignored."
+msgstr "Ongeldig teken (padscheidingsteken) gevonden! Verzoek is genegeerd."
+
+#: src/LYLocal.c:970
+msgid "Enter new location for directory: "
+msgstr "Voer een nieuwe locatie in voor map: "
+
+#: src/LYLocal.c:972
+msgid "Enter new location for file: "
+msgstr "Voer een nieuwe locatie voor bestand in: "
+
+#: src/LYLocal.c:999
+msgid "Unexpected failure - unable to find trailing path separator"
+msgstr "Onverwachte mislukking - kan nakomend padscheidingsteken niet vinden"
+
+#: src/LYLocal.c:1061
+msgid "Modify name, location, or permission (n, l, or p): "
+msgstr "Wijzig N)aam, L)ocatie, of P)ermissies (n,l, of p): "
+
+#: src/LYLocal.c:1063
+msgid "Modify name or location (n or l): "
+msgstr "Wijzig N)aam of L)ocatie (n of l): "
+
+#.
+#. * Code for changing ownership needed here.
+#.
+#: src/LYLocal.c:1092
+msgid "This feature not yet implemented!"
+msgstr "Deze optie is nog niet geïmplementeerd!"
+
+#: src/LYLocal.c:1113
+msgid "Enter name of file to create: "
+msgstr "Voer een bestandsnaam in om aan te maken: "
+
+#: src/LYLocal.c:1116 src/LYLocal.c:1153
+msgid "Illegal redirection \"//\" found! Request ignored."
+msgstr "Foutieve verwijzing \"/\"gevonden! Verzoek is genegeerd."
+
+#: src/LYLocal.c:1150
+msgid "Enter name for new directory: "
+msgstr "Voer een naam in voor een nieuwe map: "
+
+#: src/LYLocal.c:1191
+msgid "Create file or directory (f or d): "
+msgstr "Maak F)-bestand of D)-map (f of d): "
+
+#: src/LYLocal.c:1233
+#, c-format
+msgid "Remove directory '%s'?"
+msgstr "Map '%s' verwijderen?"
+
+#: src/LYLocal.c:1236
+msgid "Remove directory?"
+msgstr "Map verwijderen?"
+
+#: src/LYLocal.c:1241
+#, c-format
+msgid "Remove file '%s'?"
+msgstr "Verwijder bestand '%s'?"
+
+#: src/LYLocal.c:1243
+msgid "Remove file?"
+msgstr "Verwijder bestand?"
+
+#: src/LYLocal.c:1248
+#, c-format
+msgid "Remove symbolic link '%s'?"
+msgstr "Verwijder symbolische koppeling '%s'?"
+
+#: src/LYLocal.c:1250
+msgid "Remove symbolic link?"
+msgstr "Verwijder symbolische koppeling?"
+
+#: src/LYLocal.c:1348
+msgid "Sorry, don't know how to permit non-UNIX files yet."
+msgstr "Sorry, weet nog niet hoe met permissies van niet-UNIX bestanden om te gaan."
+
+#: src/LYLocal.c:1377
+msgid "Unable to open permit options file"
+msgstr "Kan bestand met permissie-opties niet openen"
+
+#: src/LYLocal.c:1405
+msgid "Specify permissions below:"
+msgstr "Specificeer permissies hieronder:"
+
+#: src/LYLocal.c:1406 src/LYShowInfo.c:291
+msgid "Owner:"
+msgstr "Eigenaar:"
+
+#: src/LYLocal.c:1422
+msgid "Group"
+msgstr "Groep"
+
+#: src/LYLocal.c:1438
+msgid "Others:"
+msgstr "Anderen:"
+
+#: src/LYLocal.c:1456
+msgid "form to permit"
+msgstr "formulier voor permissies"
+
+#: src/LYLocal.c:1552
+msgid "Invalid mode format."
+msgstr "Onjuist formaat voor modus."
+
+#: src/LYLocal.c:1556
+msgid "Invalid syntax format."
+msgstr "Onjuiste syntax."
+
+#: src/LYLocal.c:1743
+msgid "Warning! UUDecoded file will exist in the directory you started Lynx."
+msgstr "Let op! UUDecoded bestand blijft bestaan in de map waarin u Lynx startte."
+
+#: src/LYLocal.c:1933
+msgid "NULL URL pointer"
+msgstr "NULL URL verwijzing"
+
+#: src/LYLocal.c:2015
+#, c-format
+msgid "Executing %s "
+msgstr "Bezig met uitvoeren van %s "
+
+#: src/LYLocal.c:2018
+msgid "Executing system command. This might take a while."
+msgstr "Bezig met uitvoeren van systeemcommando. Dit kan even duren."
+
+#: src/LYLocal.c:2092
+msgid "Current directory:"
+msgstr "Huidige map:"
+
+#: src/LYLocal.c:2095 src/LYLocal.c:2113
+msgid "Current selection:"
+msgstr "Geselecteerd:"
+
+#: src/LYLocal.c:2099
+msgid "Nothing currently selected."
+msgstr "Er is momenteel niets geselecteerd."
+
+#: src/LYLocal.c:2115
+msgid "tagged item:"
+msgstr "aangevinkt item:"
+
+#: src/LYLocal.c:2116
+msgid "tagged items:"
+msgstr "aangevinkte items:"
+
+#: src/LYLocal.c:2216 src/LYLocal.c:2225
+msgid "Illegal filename; request ignored."
+msgstr "Onjuiste bestandsnaam; verzoek is genegeerd."
+
+#. directory not writable
+#: src/LYLocal.c:2323 src/LYLocal.c:2382
+msgid "Install in the selected directory not permitted."
+msgstr "Installatie in de geselecteerde map is niet toegestaan."
+
+#: src/LYLocal.c:2378
+msgid "The selected item is not a directory! Request ignored."
+msgstr "Het geselecteerde item is geen map! Verzoek is genegeerd."
+
+#: src/LYLocal.c:2387
+msgid "Just a moment, ..."
+msgstr "Een ogenblik geduld..."
+
+#: src/LYLocal.c:2404
+msgid "Error building install args"
+msgstr "Fout bij opbouwen van installatie-argumenten"
+
+#: src/LYLocal.c:2419 src/LYLocal.c:2450
+#, c-format
+msgid "Source and target are the same: %s"
+msgstr "Bron en bestemming zijn gelijk: %s"
+
+#: src/LYLocal.c:2426 src/LYLocal.c:2457
+#, c-format
+msgid "Already in target directory: %s"
+msgstr "Al in bestemmingsmap: %s"
+
+#: src/LYLocal.c:2475
+msgid "Installation complete"
+msgstr "Installatie is voltooid"
+
+#: src/LYLocal.c:2678
+msgid "Temporary URL or list would be too long."
+msgstr "Tijdelijke URL of lijst zou te lang zijn."
+
+#: src/LYMail.c:566
+msgid "Sending"
+msgstr "Bezig met zenden"
+
+#: src/LYMail.c:1050
+#, c-format
+msgid "The link %s :?: %s \n"
+msgstr "De link %s :?: %s\n"
+
+#: src/LYMail.c:1052
+#, c-format
+msgid "called \"%s\"\n"
+msgstr "genaamd \"%s\"\n"
+
+#: src/LYMail.c:1053
+#, c-format
+msgid "in the file \"%s\" called \"%s\"\n"
+msgstr "in het bestand \"%s\" genaamd \"%s\"\n"
+
+#: src/LYMail.c:1054
+msgid "was requested but was not available."
+msgstr "is opgevraagd maar niet beschikbaar."
+
+#: src/LYMail.c:1055
+msgid "Thought you might want to know."
+msgstr "Het leek me dat u dat zou willen weten."
+
+#: src/LYMail.c:1057
+msgid "This message was automatically generated by"
+msgstr "Dit bericht is automatisch gegenereerd door"
+
+#: src/LYMail.c:1770
+msgid "No system mailer configured"
+msgstr "Geen systeemmailer geconfigureerd"
+
+#: src/LYMain.c:1095
+msgid "No Winsock found, sorry."
+msgstr "Geen Winsock gevonden, sorry."
+
+#: src/LYMain.c:1285
+msgid "You MUST define a valid TMP or TEMP area!"
+msgstr "U MOET een geldig TMP- of TEMP-gebied opgeven!"
+
+#: src/LYMain.c:1338 src/LYMainLoop.c:5285
+msgid "No such directory"
+msgstr "Map bestaat niet"
+
+#: src/LYMain.c:1532
+#, c-format
+msgid ""
+"\n"
+"Configuration file \"%s\" is not available.\n"
+"\n"
+msgstr ""
+"\n"
+"Configuratiebestand '%s' is niet beschikbaar.\n"
+"\n"
+
+#: src/LYMain.c:1542
+#, c-format
+msgid ""
+"\n"
+"Lynx character sets not declared.\n"
+"\n"
+msgstr ""
+"\n"
+"Lynx-tekensets zijn niet opgegeven.\n"
+"\n"
+
+#: src/LYMain.c:1698
+#, c-format
+msgid "Ignored %d characters from standard input.\n"
+msgstr "Er zijn %d tekens van standaardinvoer genegeerd.\n"
+
+#: src/LYMain.c:1700
+#, c-format
+msgid "Use \"-stdin\" or \"-\" to tell how to handle piped input.\n"
+msgstr "Gebruik \"-stdin\" of \"-\" om aan te geven hoe doorgesluisde invoer behandeld moet worden.\n"
+
+#: src/LYMain.c:1858
+msgid "Warning:"
+msgstr "Waarschuwing:"
+
+#: src/LYMain.c:2426
+msgid "persistent cookies state will be changed in next session only."
+msgstr "Voortbestaande stand van koekjes wordt pas in volgende sessie gewijzigd."
+
+#: src/LYMain.c:2661 src/LYMain.c:2705
+#, c-format
+msgid "Lynx: ignoring unrecognized charset=%s\n"
+msgstr "Lynx: onbekende tekenset '%s' wordt genegeerd\n"
+
+#: src/LYMain.c:3222
+#, c-format
+msgid "%s Version %s (%s)"
+msgstr "%s versie %s (%s)"
+
+#: src/LYMain.c:3263
+#, c-format
+msgid "Built on %s%s.\n"
+msgstr "Gecompileerd op %s%s\n"
+
+#: src/LYMain.c:3277
+msgid "Copyrights held by the Lynx Developers Group,"
+msgstr "De auteursrechten zijn in handen van de Lynx-ontwikkelaarsgroep,"
+
+#: src/LYMain.c:3278
+msgid "the University of Kansas, CERN, and other contributors."
+msgstr "de Universiteit van Kansas, CERN, en andere medewerkers."
+
+#: src/LYMain.c:3279
+msgid "Distributed under the GNU General Public License (Version 2)."
+msgstr "Gedistribueerd onder de GPL (GNU General Public License), versie 2."
+
+#: src/LYMain.c:3280
+msgid "See https://lynx.invisible-island.net/ and the online help for more information."
+msgstr "Zie https://lynx.invisible-island.net/ en de online hulp voor meer informatie."
+
+#: src/LYMain.c:4139
+#, c-format
+msgid "USAGE: %s [options] [file]\n"
+msgstr "Gebruik: %s [opties] [bestand]\n"
+
+#: src/LYMain.c:4140
+#, c-format
+msgid "Options are:\n"
+msgstr "Mogelijke opties zijn:\n"
+
+#: src/LYMain.c:4443
+#, c-format
+msgid "%s: Invalid Option: %s\n"
+msgstr "%s: Ongeldige optie: %s\n"
+
+#: src/LYMainLoop.c:572
+#, c-format
+msgid "Internal error: Invalid mouse link %d!"
+msgstr "**Interne fout**: Ongeldige muiskoppeling %d!"
+
+#: src/LYMainLoop.c:693 src/LYMainLoop.c:5307
+msgid "A URL specified by the user"
+msgstr "Een door de gebruiker opgegeven URL"
+
+#: src/LYMainLoop.c:1142
+msgid "Enctype multipart/form-data not yet supported! Cannot submit."
+msgstr "Het Enctype 'multipart/form-data' wordt nog niet ondersteund! Kan niet verzenden."
+
+#.
+#. * Make a name for this help file.
+#.
+#: src/LYMainLoop.c:3197
+msgid "Help Screen"
+msgstr "Hulpscherm"
+
+#: src/LYMainLoop.c:3328
+msgid "System Index"
+msgstr "Systeemindex"
+
+#: src/LYMainLoop.c:3577
+#, c-format
+msgid "Query parameter %d: "
+msgstr "Bevraagparameter %d: "
+
+#: src/LYMainLoop.c:3806 src/LYMainLoop.c:5583
+msgid "Entry into main screen"
+msgstr "Ingang naar beginscherm"
+
+#: src/LYMainLoop.c:4064
+msgid "No next document present"
+msgstr "Geen volgend document aanwezig"
+
+#: src/LYMainLoop.c:4359
+msgid "charset for this document specified explicitly, sorry..."
+msgstr "de tekenset voor dit document is expliciet opgegeven, sorry..."
+
+#: src/LYMainLoop.c:5265
+msgid "cd to:"
+msgstr "cd naar:"
+
+#: src/LYMainLoop.c:5288
+msgid "A component of path is not a directory"
+msgstr "Een component van het pad is geen map"
+
+#: src/LYMainLoop.c:5291
+msgid "failed to change directory"
+msgstr "Map wijzigen is mislukt"
+
+#: src/LYMainLoop.c:6517
+msgid "Reparsing document under current settings..."
+msgstr "Document wordt opnieuw ontleed met huidige instellingen..."
+
+#: src/LYMainLoop.c:6811
+#, c-format
+msgid "Fatal error - could not open output file %s\n"
+msgstr "Fatale fout: kan uitvoerbestand %s niet openen\n"
+
+#: src/LYMainLoop.c:7153
+msgid "TABLE center enable."
+msgstr "TABLE centreren ingeschakeld."
+
+#: src/LYMainLoop.c:7156
+msgid "TABLE center disable."
+msgstr "TABLE centreren uitgeschakeld."
+
+#: src/LYMainLoop.c:7236
+msgid "Current URL is empty."
+msgstr "Huidige URL is leeg."
+
+#: src/LYMainLoop.c:7238 src/LYUtils.c:1909
+msgid "Copy to clipboard failed."
+msgstr "Kopiëren naar klembord is mislukt."
+
+#: src/LYMainLoop.c:7240
+msgid "Document URL put to clipboard."
+msgstr "Document-URL is op klembord geplaatst."
+
+#: src/LYMainLoop.c:7242
+msgid "Link URL put to clipboard."
+msgstr "Link-URL is op klembord geplaatst."
+
+#: src/LYMainLoop.c:7269
+msgid "No URL in the clipboard."
+msgstr "Geen URL op het klembord."
+
+#: src/LYMainLoop.c:7962 src/LYMainLoop.c:8133
+msgid "-index-"
+msgstr "-index-"
+
+#: src/LYMainLoop.c:8071
+msgid "lynx: Can't access startfile"
+msgstr "lynx: geen toegang tot startbestand"
+
+#: src/LYMainLoop.c:8083
+msgid "lynx: Start file could not be found or is not text/html or text/plain"
+msgstr "lynx: startbestand kan niet gevonden worden of is geen tekst/html of tekst/plain"
+
+#: src/LYMainLoop.c:8084
+msgid " Exiting..."
+msgstr " Afsluiten..."
+
+#: src/LYMainLoop.c:8127
+msgid "-more-"
+msgstr "-meer-"
+
+#. Enable scrolling.
+#: src/LYNews.c:186
+msgid "You will be posting to:"
+msgstr "U zult posten naar:"
+
+#.
+#. * Get the mail address for the From header, offering personal_mail_address
+#. * as default.
+#.
+#: src/LYNews.c:195
+msgid ""
+"\n"
+"\n"
+" Please provide your mail address for the From: header\n"
+msgstr ""
+"\n"
+"\n"
+" Geef uw e-mailadres voor de 'From:'-kopregel\n"
+
+#.
+#. * Get the Subject header, offering the current document's title as the
+#. * default if this is a followup rather than a new post. - FM
+#.
+#: src/LYNews.c:212
+msgid ""
+"\n"
+"\n"
+" Please provide or edit the Subject: header\n"
+msgstr ""
+"\n"
+"\n"
+" Geef of wijzig de 'Subject:'-kopregel (Onderwerp)\n"
+
+#: src/LYNews.c:302
+msgid ""
+"\n"
+"\n"
+" Please provide or edit the Organization: header\n"
+msgstr ""
+"\n"
+"\n"
+" Geef of wijzig de 'Organization:'-kopregel (Organisatie)\n"
+
+#.
+#. * Use the built in line editior.
+#.
+#: src/LYNews.c:359
+msgid ""
+"\n"
+"\n"
+" Please enter your message below."
+msgstr ""
+"\n"
+"\n"
+" Schrijf hieronder uw bericht."
+
+#: src/LYNews.c:405
+msgid "Message has no original text!"
+msgstr "Bericht bevat geen oorspronkelijke tekst!"
+
+#: src/LYOptions.c:774
+msgid "review/edit B)ookmarks files"
+msgstr "B)ladwijzerbestanden bekijken/wijzigen"
+
+#: src/LYOptions.c:776
+msgid "B)ookmark file: "
+msgstr "B)ladwijzerbestand: "
+
+#: src/LYOptions.c:2131 src/LYOptions.c:2138
+msgid "ON"
+msgstr "AAN"
+
+#. verbose_img variable
+#. LYCollapseBRs variable
+#. LYtrimBlankLines variable
+#: src/LYOptions.c:2132 src/LYOptions.c:2137 src/LYOptions.c:2321
+#: src/LYOptions.c:2330 src/LYOptions.c:2339 src/LYOptions.c:2350
+msgid "OFF"
+msgstr "UIT"
+
+#: src/LYOptions.c:2133
+msgid "NEVER"
+msgstr "NOOIT"
+
+#: src/LYOptions.c:2134
+msgid "ALWAYS"
+msgstr "ALTIJD"
+
+#: src/LYOptions.c:2150 src/LYOptions.c:2313
+msgid "ignore"
+msgstr "negeren"
+
+#: src/LYOptions.c:2151
+msgid "ask user"
+msgstr "gebruiker vragen"
+
+#: src/LYOptions.c:2152
+msgid "accept all"
+msgstr "alles aanvaarden"
+
+#: src/LYOptions.c:2164
+msgid "ALWAYS OFF"
+msgstr "ALTIJD UIT"
+
+#: src/LYOptions.c:2165
+msgid "FOR LOCAL FILES ONLY"
+msgstr "ALLEEN VOOR LOKALE BESTANDEN"
+
+#: src/LYOptions.c:2167
+msgid "ALWAYS ON"
+msgstr "ALTIJD AAN"
+
+#: src/LYOptions.c:2179
+msgid "Numbers act as arrows"
+msgstr "cijfers werken als pijltjes"
+
+#: src/LYOptions.c:2181
+msgid "Links are numbered"
+msgstr "cijfers kiezen koppelingen"
+
+#: src/LYOptions.c:2184
+msgid "Links and form fields are numbered"
+msgstr "cijfers kiezen koppelingen/formuliervelden"
+
+#: src/LYOptions.c:2187
+msgid "Form fields are numbered"
+msgstr "cijfers kiezen formuliervelden"
+
+#: src/LYOptions.c:2202
+msgid "Case insensitive"
+msgstr "hoofdletterongevoelig"
+
+#: src/LYOptions.c:2203
+msgid "Case sensitive"
+msgstr "hoofdlettergevoelig"
+
+#: src/LYOptions.c:2237
+msgid "prompt normally"
+msgstr "normaal prompten"
+
+#: src/LYOptions.c:2238
+msgid "force yes-response"
+msgstr "ja-antwoord afdwingen"
+
+#: src/LYOptions.c:2239
+msgid "force no-response"
+msgstr "nee-antwoord afdwingen"
+
+#: src/LYOptions.c:2249
+msgid "RFC 2109"
+msgstr "RFC 2109"
+
+#: src/LYOptions.c:2250
+msgid "RFC 2965"
+msgstr "RFC 2965"
+
+#: src/LYOptions.c:2251
+msgid "RFC 6265"
+msgstr "RFC 6265"
+
+#: src/LYOptions.c:2268
+msgid "Novice"
+msgstr "beginner"
+
+#: src/LYOptions.c:2269
+msgid "Intermediate"
+msgstr "gevorderd"
+
+#: src/LYOptions.c:2270
+msgid "Advanced"
+msgstr "expert"
+
+#: src/LYOptions.c:2279
+msgid "By First Visit"
+msgstr "op eerstbezocht"
+
+#: src/LYOptions.c:2281
+msgid "By First Visit Reversed"
+msgstr "omgekeerd eerstbezocht"
+
+#: src/LYOptions.c:2282
+msgid "As Visit Tree"
+msgstr "als bezoekboom"
+
+#: src/LYOptions.c:2283
+msgid "By Last Visit"
+msgstr "op laatstbezocht"
+
+#: src/LYOptions.c:2285
+msgid "By Last Visit Reversed"
+msgstr "omgekeerd laatstbezocht"
+
+#. Old_DTD variable
+#: src/LYOptions.c:2296
+msgid "relaxed (TagSoup mode)"
+msgstr "versoepeld (TagSoup-modus)"
+
+#: src/LYOptions.c:2297
+msgid "strict (SortaSGML mode)"
+msgstr "strikt (SortaSGML-modus)"
+
+#: src/LYOptions.c:2304
+msgid "Ignore"
+msgstr "Negeren"
+
+#: src/LYOptions.c:2305
+msgid "Add to trace-file"
+msgstr "Aan volgbestand toevoegen"
+
+#: src/LYOptions.c:2306
+msgid "Add to LYNXMESSAGES"
+msgstr "Aan LYNXBERICHT toevoegen"
+
+#: src/LYOptions.c:2307
+msgid "Warn, point to trace-file"
+msgstr "Waarschuwing, verwijst naar volgbestand:"
+
+#: src/LYOptions.c:2314
+msgid "as labels"
+msgstr "tonen als labels"
+
+#: src/LYOptions.c:2315
+msgid "as links"
+msgstr "tonen als koppelingen"
+
+#: src/LYOptions.c:2322
+msgid "show filename"
+msgstr "bestandsnaam tonen"
+
+#: src/LYOptions.c:2331
+msgid "collapse"
+msgstr "samendrukken"
+
+#: src/LYOptions.c:2340
+msgid "trim-lines"
+msgstr "regels-trimmen"
+
+#: src/LYOptions.c:2351
+msgid "STANDARD"
+msgstr "STANDAARD"
+
+#: src/LYOptions.c:2352
+msgid "ADVANCED"
+msgstr "GEAVANCEERD"
+
+#: src/LYOptions.c:2374
+msgid "IDNA 2003"
+msgstr "IDNA 2003"
+
+#: src/LYOptions.c:2375
+msgid "IDNA 2008"
+msgstr "IDNA 2008"
+
+#: src/LYOptions.c:2376
+msgid "IDNA TR46"
+msgstr "IDNA TR46"
+
+#: src/LYOptions.c:2377
+msgid "IDNA Compatible"
+msgstr "IDNA-compatibel"
+
+#: src/LYOptions.c:2398
+msgid "Directories first"
+msgstr "mappen eerst"
+
+#: src/LYOptions.c:2399
+msgid "Files first"
+msgstr "bestanden eerst"
+
+#: src/LYOptions.c:2400
+msgid "Mixed style"
+msgstr "gemengd"
+
+#: src/LYOptions.c:2408 src/LYOptions.c:2428
+msgid "By Name"
+msgstr "op naam"
+
+#: src/LYOptions.c:2409 src/LYOptions.c:2429
+msgid "By Type"
+msgstr "op type"
+
+#: src/LYOptions.c:2410 src/LYOptions.c:2430
+msgid "By Size"
+msgstr "op grootte"
+
+#: src/LYOptions.c:2411 src/LYOptions.c:2431
+msgid "By Date"
+msgstr "op datum"
+
+#: src/LYOptions.c:2412
+msgid "By Mode"
+msgstr "op modus"
+
+#: src/LYOptions.c:2414
+msgid "By User"
+msgstr "op gebruiker"
+
+#: src/LYOptions.c:2415
+msgid "By Group"
+msgstr "op groep"
+
+#: src/LYOptions.c:2440
+msgid "Do not show rate"
+msgstr "niet tonen"
+
+#: src/LYOptions.c:2441 src/LYOptions.c:2442
+#, c-format
+msgid "Show %s/sec rate"
+msgstr "als %s/s tonen"
+
+#: src/LYOptions.c:2444 src/LYOptions.c:2445
+#, c-format
+msgid "Show %s/sec, ETA"
+msgstr "als %s/s plus ETA tonen"
+
+#: src/LYOptions.c:2446 src/LYOptions.c:2447
+#, c-format
+msgid "Show %s/sec (2-digits), ETA"
+msgstr "als tweecijferig %s/s plus ETA tonen"
+
+#: src/LYOptions.c:2450
+msgid "Show progressbar"
+msgstr "als voortgangsbalk"
+
+#: src/LYOptions.c:2471
+msgid "Accept lynx's internal types"
+msgstr "interne types van Lynx accepteren"
+
+#: src/LYOptions.c:2472
+msgid "Also accept lynx.cfg's types"
+msgstr "ook types uit lynx.cfg accepteren"
+
+#: src/LYOptions.c:2473
+msgid "Also accept user's types"
+msgstr "ook gebruikertypes accepteren"
+
+#: src/LYOptions.c:2474
+msgid "Also accept system's types"
+msgstr "ook systeemtypes accepteren"
+
+#: src/LYOptions.c:2475
+msgid "Accept all types"
+msgstr "alle types accepteren"
+
+#: src/LYOptions.c:2484
+msgid "gzip"
+msgstr "gzip"
+
+#: src/LYOptions.c:2485
+msgid "deflate"
+msgstr "deflate"
+
+#: src/LYOptions.c:2488
+msgid "compress"
+msgstr "compress"
+
+#: src/LYOptions.c:2491
+msgid "bzip2"
+msgstr "bzip2"
+
+#: src/LYOptions.c:2493
+msgid "All"
+msgstr "allemaal"
+
+#: src/LYOptions.c:2503
+msgid "HTTP 1.0"
+msgstr "HTTP 1.0"
+
+#: src/LYOptions.c:2504
+msgid "HTTP 1.1"
+msgstr "HTTP 1.1"
+
+#: src/LYOptions.c:2863 src/LYOptions.c:2892
+#, c-format
+msgid "Use %s to invoke the Options menu!"
+msgstr "Gebruik %s om naar het Optiesmenu te gaan!"
+
+#: src/LYOptions.c:3789
+msgid "(options marked with (!) will not be saved)"
+msgstr "(opties gemarkeerd met (!) worden niet opgeslagen)"
+
+#: src/LYOptions.c:3797
+msgid "General Preferences"
+msgstr "Algemene voorkeuren"
+
+#. ***************************************************************
+#. User Mode: SELECT
+#: src/LYOptions.c:3801
+msgid "User mode"
+msgstr "Gebruikersmodus"
+
+#. Editor: INPUT
+#: src/LYOptions.c:3807
+msgid "Editor"
+msgstr "Editor"
+
+#. Search Type: SELECT
+#: src/LYOptions.c:3812
+msgid "Type of Search"
+msgstr "Zoekmethode"
+
+#: src/LYOptions.c:3817
+msgid "Security and Privacy"
+msgstr "Veiligheid en privacy"
+
+#. ***************************************************************
+#. Cookies: SELECT
+#: src/LYOptions.c:3821
+msgid "Cookies"
+msgstr "Koekjes"
+
+#. Cookie Version: SELECT
+#: src/LYOptions.c:3835
+msgid "Cookie RFC-version"
+msgstr "Koekje RFC-versie"
+
+#. Cookie Prompting: SELECT
+#: src/LYOptions.c:3841
+msgid "Invalid-Cookie Prompting"
+msgstr "Prompt bij ongeldige koekjes"
+
+#. SSL Prompting: SELECT
+#: src/LYOptions.c:3848
+msgid "SSL Prompting"
+msgstr "SSL-prompt"
+
+#: src/LYOptions.c:3853
+msgid "SSL client certificate file"
+msgstr "SSL-cliëntcertificaatbestand"
+
+#: src/LYOptions.c:3857
+msgid "SSL client key file"
+msgstr "SSL-cliëntsleutelbestand"
+
+#: src/LYOptions.c:3863
+msgid "Keyboard Input"
+msgstr "Toetsenbordinvoer"
+
+#. ***************************************************************
+#. Keypad Mode: SELECT
+#: src/LYOptions.c:3867
+msgid "Keypad mode"
+msgstr "Gedrag van cijfertoetsen"
+
+#. Emacs keys: ON/OFF
+#: src/LYOptions.c:3873
+msgid "Emacs keys"
+msgstr "Emacs-toetsen"
+
+#. VI Keys: ON/OFF
+#: src/LYOptions.c:3879
+msgid "VI keys"
+msgstr "VI-toetsen"
+
+#. Line edit style: SELECT
+#. well, at least 2 line edit styles available
+#: src/LYOptions.c:3886
+msgid "Line edit style"
+msgstr "Regelbewerkingsstijl"
+
+#. Keyboard layout: SELECT
+#: src/LYOptions.c:3898
+msgid "Keyboard layout"
+msgstr "Toetsenbordindeling"
+
+#.
+#. * Display and Character Set
+#.
+#: src/LYOptions.c:3912
+msgid "Display and Character Set"
+msgstr "Weergave en tekenset"
+
+#. Use locale-based character set: ON/OFF
+#: src/LYOptions.c:3917
+msgid "Use locale-based character set"
+msgstr "Tekenset van taalregio nemen"
+
+#: src/LYOptions.c:3924
+msgid "Use HTML5 charset replacements"
+msgstr "Vervangende HTML5-tekenset"
+
+#. Display Character Set: SELECT
+#: src/LYOptions.c:3930
+msgid "Display character set"
+msgstr "Gebruikte tekenset op scherm"
+
+#: src/LYOptions.c:3961
+msgid "Assumed document character set"
+msgstr "Tekenset van huidig document"
+
+#: src/LYOptions.c:3977
+msgid "Internationalized domain names"
+msgstr "Geïnternationaliseerde domeinnamen"
+
+#.
+#. * Since CJK people hardly mixed with other world
+#. * we split the header to make it more readable:
+#. * "CJK mode" for CJK display charsets, and "Raw 8-bit" for others.
+#.
+#: src/LYOptions.c:3995
+msgid "CJK mode"
+msgstr "CJK-modus"
+
+#: src/LYOptions.c:3997
+msgid "Raw 8-bit"
+msgstr "Kale 8-bit"
+
+#. X Display: INPUT
+#: src/LYOptions.c:4005
+msgid "X Display"
+msgstr "X-display"
+
+#.
+#. * Document Appearance
+#.
+#: src/LYOptions.c:4011
+msgid "Document Appearance"
+msgstr "Uiterlijk van document"
+
+#: src/LYOptions.c:4017
+msgid "Show color"
+msgstr "Kleur tonen"
+
+#: src/LYOptions.c:4043
+msgid "Color style"
+msgstr "Kleurstijl"
+
+#: src/LYOptions.c:4053
+msgid "Default colors"
+msgstr "Standaardkleuren"
+
+#. Show cursor: ON/OFF
+#: src/LYOptions.c:4061
+msgid "Show cursor"
+msgstr "Cursor tonen"
+
+#. Underline links: ON/OFF
+#: src/LYOptions.c:4067
+msgid "Underline links"
+msgstr "Koppelingen onderstrepen"
+
+#. Show scrollbar: ON/OFF
+#: src/LYOptions.c:4074
+msgid "Show scrollbar"
+msgstr "Schuifbalk tonen"
+
+#. Select Popups: ON/OFF
+#: src/LYOptions.c:4081
+msgid "Popups for select fields"
+msgstr "Menuutjes voor keuzevelden"
+
+#. HTML error recovery: SELECT
+#: src/LYOptions.c:4087
+msgid "HTML error recovery"
+msgstr "HTML-foutcorrectie"
+
+#. Bad HTML messages: SELECT
+#: src/LYOptions.c:4093
+msgid "Bad HTML messages"
+msgstr "Ongeldige HTML-berichten"
+
+#. Show Images: SELECT
+#: src/LYOptions.c:4099
+msgid "Show images"
+msgstr "Afbeeldingen"
+
+#. Verbose Images: ON/OFF
+#: src/LYOptions.c:4113
+msgid "Verbose images"
+msgstr "Details van afbeeldingen"
+
+#. Collapse BR Tags: ON/OFF
+#: src/LYOptions.c:4119
+msgid "Collapse BR tags"
+msgstr "BR-tags samendrukken"
+
+#. Trim blank lines: ON/OFF
+#: src/LYOptions.c:4125
+msgid "Trim blank lines"
+msgstr "Lege regels trimmen"
+
+#.
+#. * Headers Transferred to Remote Servers
+#.
+#: src/LYOptions.c:4133
+msgid "Headers Transferred to Remote Servers"
+msgstr "Naar servers verzonden kopregels"
+
+#. ***************************************************************
+#. Mail Address: INPUT
+#: src/LYOptions.c:4137
+msgid "Personal mail address"
+msgstr "Persoonlijk e-mailadres"
+
+#: src/LYOptions.c:4142
+msgid "Personal name for mail"
+msgstr "Persoonlijke naam voor e-mail"
+
+#: src/LYOptions.c:4149
+msgid "Password for anonymous ftp"
+msgstr "Wachtwoord voor anonieme FTP"
+
+#. Preferred content type: SELECT
+#: src/LYOptions.c:4155
+msgid "Preferred content type"
+msgstr "Voorkeursinhoudstype"
+
+#. Preferred media type: SELECT
+#: src/LYOptions.c:4161
+msgid "Preferred media type"
+msgstr "Voorkeursmediatype"
+
+# Het gaat over compressiemethodes, niet over codering.
+#. Preferred encoding: SELECT
+#: src/LYOptions.c:4167
+msgid "Preferred encoding"
+msgstr "Voorkeurscompressie"
+
+#. Preferred Document Character Set: INPUT
+#: src/LYOptions.c:4173
+msgid "Preferred document character set"
+msgstr "Voorkeurstekenset van document"
+
+#. Preferred Document Language: INPUT
+#: src/LYOptions.c:4178
+msgid "Preferred document language"
+msgstr "Voorkeurstaal van document"
+
+#. HTTP protocol SELECT
+#: src/LYOptions.c:4183
+msgid "HTTP protocol"
+msgstr "HTTP-protocol"
+
+#: src/LYOptions.c:4190
+msgid "Send User-Agent header"
+msgstr "User-Agent-kopregel versturen"
+
+#: src/LYOptions.c:4192
+msgid "User-Agent header"
+msgstr "User-Agent-kopregel"
+
+#.
+#. * Listing and Accessing Files
+#.
+#: src/LYOptions.c:4200
+msgid "Listing and Accessing Files"
+msgstr "Bestandslijsten en snelheid"
+
+#. FTP sort: SELECT
+#: src/LYOptions.c:4205
+msgid "Use Passive FTP"
+msgstr "Passieve FTP gebruiken"
+
+#. FTP sort: SELECT
+#: src/LYOptions.c:4211
+msgid "FTP sort criteria"
+msgstr "Sortering voor FTP"
+
+#. Local Directory Sort: SELECT
+#: src/LYOptions.c:4219
+msgid "Local directory sort criteria"
+msgstr "Groepering in lokale mappen"
+
+#. Local Directory Order: SELECT
+#: src/LYOptions.c:4225
+msgid "Local directory sort order"
+msgstr "Sortering van lokale bestanden"
+
+#: src/LYOptions.c:4234
+msgid "Show dot files"
+msgstr "Puntbestanden tonen"
+
+#: src/LYOptions.c:4242
+msgid "Execution links"
+msgstr "Programma-startende links"
+
+#: src/LYOptions.c:4260
+msgid "Pause when showing message"
+msgstr "Pauzeren bij tonen van bericht"
+
+#. Show transfer rate: SELECT
+#: src/LYOptions.c:4267
+msgid "Show transfer rate"
+msgstr "Overdrachtssnelheid tonen"
+
+#.
+#. * Special Files and Screens
+#.
+#: src/LYOptions.c:4287
+msgid "Special Files and Screens"
+msgstr "Speciale bestanden en schermen"
+
+#: src/LYOptions.c:4292
+msgid "Multi-bookmarks"
+msgstr "Meervoudige boekenleggers"
+
+#: src/LYOptions.c:4300
+msgid "Review/edit Bookmarks files"
+msgstr "Boekenleggerbestanden bekijken/wijzigen"
+
+#: src/LYOptions.c:4303
+msgid "Goto multi-bookmark menu"
+msgstr "Naar multiboekenleggermenu"
+
+#: src/LYOptions.c:4305
+msgid "Bookmarks file"
+msgstr "Boekenleggerbestand"
+
+#. Auto Session: ON/OFF
+#: src/LYOptions.c:4312
+msgid "Auto Session"
+msgstr "Automatische sessie"
+
+#. Session File Menu: INPUT
+#: src/LYOptions.c:4318
+msgid "Session file"
+msgstr "Sessiebestand"
+
+#. Visited Pages: SELECT
+#: src/LYOptions.c:4324
+msgid "Visited Pages"
+msgstr "Bezochte pagina's"
+
+#: src/LYOptions.c:4329
+msgid "View the file "
+msgstr "Instellingenbestand bekijken: "
+
+#: src/LYPrint.c:956
+#, c-format
+msgid " Print job complete.\n"
+msgstr " Printopdracht is voltooid.\n"
+
+#: src/LYPrint.c:1283
+msgid "Document:"
+msgstr "Document:"
+
+#: src/LYPrint.c:1284
+msgid "Number of lines:"
+msgstr "Aantal regels:"
+
+#: src/LYPrint.c:1285
+msgid "Number of pages:"
+msgstr "Aantal pagina's:"
+
+#: src/LYPrint.c:1286
+msgid "pages"
+msgstr "pagina's"
+
+#: src/LYPrint.c:1286
+msgid "page"
+msgstr "pagina"
+
+#: src/LYPrint.c:1287
+msgid "(approximately)"
+msgstr "(bij benadering)"
+
+#: src/LYPrint.c:1294
+msgid "Some print functions have been disabled!"
+msgstr "Enkele afdrukinstellingen zijn uitgeschakeld."
+
+#: src/LYPrint.c:1298
+msgid "Standard print options:"
+msgstr "Standaard afdrukinstellingen:"
+
+#: src/LYPrint.c:1299
+msgid "Print options:"
+msgstr "Afdrukinstellingen:"
+
+#: src/LYPrint.c:1306
+msgid "Save to a local file"
+msgstr "Opslaan naar een lokaal bestand"
+
+#: src/LYPrint.c:1308
+msgid "Save to disk disabled"
+msgstr "Opslaan naar schijf is uitgeschakeld"
+
+#: src/LYPrint.c:1315
+msgid "Mail the file"
+msgstr "Het bestand mailen"
+
+#: src/LYPrint.c:1322
+msgid "Print to the screen"
+msgstr "Afdrukken naar het scherm"
+
+#: src/LYPrint.c:1327
+msgid "Print out on a printer attached to your vt100 terminal"
+msgstr "Afdrukken naar een printer die verbonden is aan uw vt100-terminal"
+
+#: src/LYReadCFG.c:437
+#, c-format
+msgid ""
+"Syntax Error parsing COLOR in configuration file:\n"
+"The line must be of the form:\n"
+"COLOR:INTEGER:FOREGROUND:BACKGROUND\n"
+"\n"
+"Here FOREGROUND and BACKGROUND must be one of:\n"
+"The special strings 'nocolor' or 'default', or\n"
+msgstr ""
+"Syntactische fout bij het verwerken van KLEUR in het configuratiebestand:\n"
+"De regel moet in de volgende vorm staan:\n"
+"KLEUR:GEHEEL GETAL:VOORGROND:ACHTERGROND\n"
+"\n"
+"Hier kunnen VOORGROND en ACHTERGROND één van de volgende zijn:\n"
+"De uitzonderingen 'nocolor' of 'default', of\n"
+
+#: src/LYReadCFG.c:450
+msgid "Offending line:"
+msgstr "Regel waar het misging:"
+
+#: src/LYReadCFG.c:764
+#, c-format
+msgid "key remapping of %s to %s for %s failed\n"
+msgstr "toetsherdefinitie van %s naar %s voor %s is mislukt\n"
+
+#: src/LYReadCFG.c:771
+#, c-format
+msgid "key remapping of %s to %s failed\n"
+msgstr "toetsherdefinitie van %s naar %s is mislukt\n"
+
+#: src/LYReadCFG.c:792
+#, c-format
+msgid "invalid line-editor selection %s for key %s, selecting all\n"
+msgstr "ongeldige selectie %s voor toets %s; alles wordt geselecteerd\n"
+
+#: src/LYReadCFG.c:817 src/LYReadCFG.c:832
+#, c-format
+msgid "setting of line-editor binding for key %s (0x%x) to 0x%x for %s failed\n"
+msgstr "maken van koppeling voor toets %s (0x%x) naar 0x%x voor %s is mislukt\n"
+
+#: src/LYReadCFG.c:839
+#, c-format
+msgid "setting of line-editor binding for key %s (0x%x) for %s failed\n"
+msgstr "maken van koppeling voor toets %s (0x%x) voor %s is mislukt\n"
+
+#: src/LYReadCFG.c:937
+#, c-format
+msgid "Lynx: cannot start, CERN rules file %s is not available\n"
+msgstr "Lynx: kan niet starten, CERN reglement bestand %s is niet beschikbaar\n"
+
+#: src/LYReadCFG.c:938
+msgid "(no name)"
+msgstr "(naamloos)"
+
+#: src/LYReadCFG.c:2086
+#, c-format
+msgid "More than %d nested lynx.cfg includes -- perhaps there is a loop?!?\n"
+msgstr "Meer dan %d geneste insluitingen in lynx.cfg -- misschien een lus?!?\n"
+
+#: src/LYReadCFG.c:2088
+#, c-format
+msgid "Last attempted include was '%s',\n"
+msgstr "De laatst geprobeerde insluiting was '%s',\n"
+
+#: src/LYReadCFG.c:2089
+#, c-format
+msgid "included from '%s'.\n"
+msgstr "ingevoegd vanuit '%s'.\n"
+
+#: src/LYReadCFG.c:2500 src/LYReadCFG.c:2513 src/LYReadCFG.c:2571
+msgid "The following is read from your lynx.cfg file."
+msgstr "Onderstaande gegevens werden gelezen uit uw lynx.cfg-bestand."
+
+#: src/LYReadCFG.c:2501 src/LYReadCFG.c:2514
+msgid "Please read the distribution"
+msgstr "Lees de meegeleverde versie van"
+
+#: src/LYReadCFG.c:2507 src/LYReadCFG.c:2517
+msgid "for more comments."
+msgstr "voor meer opmerkingen."
+
+#: src/LYReadCFG.c:2553
+msgid "RELOAD THE CHANGES"
+msgstr "DE VERANDERINGEN HERLADEN"
+
+#: src/LYReadCFG.c:2561
+msgid "Your primary configuration"
+msgstr "Uw primaire instellingenbestand is:"
+
+#: src/LYShowInfo.c:116
+msgid "URL:"
+msgstr "URL:"
+
+#: src/LYShowInfo.c:200
+msgid "Directory that you are currently viewing"
+msgstr "De map die u op dit moment bekijkt"
+
+#: src/LYShowInfo.c:203
+msgid "Name:"
+msgstr "Naam:"
+
+#: src/LYShowInfo.c:220
+msgid "Directory that you have currently selected"
+msgstr "Geselecteerde map"
+
+#: src/LYShowInfo.c:222
+msgid "File that you have currently selected"
+msgstr "Geselecteerd bestand"
+
+#: src/LYShowInfo.c:225
+msgid "Symbolic link that you have currently selected"
+msgstr "Geselecteerde symbolische verwijzing"
+
+#: src/LYShowInfo.c:228
+msgid "Item that you have currently selected"
+msgstr "Geselecteerd item"
+
+#: src/LYShowInfo.c:230
+msgid "Full name:"
+msgstr "Volledige naam:"
+
+#: src/LYShowInfo.c:243
+msgid "Unable to follow link"
+msgstr "De verwijzing kan niet vervolgd worden"
+
+#: src/LYShowInfo.c:245
+msgid "Points to file:"
+msgstr "Wijst naar bestand:"
+
+#: src/LYShowInfo.c:250
+msgid "Name of owner:"
+msgstr "Naam van eigenaar:"
+
+#: src/LYShowInfo.c:253
+msgid "Group name:"
+msgstr "Groepsnaam:"
+
+#: src/LYShowInfo.c:255
+msgid "File size:"
+msgstr "Bestandsgrootte:"
+
+#: src/LYShowInfo.c:257
+msgid "(bytes)"
+msgstr "(bytes)"
+
+#.
+#. * Include date and time information.
+#.
+#: src/LYShowInfo.c:262
+msgid "Creation date:"
+msgstr "Aanmaakdatum:"
+
+#: src/LYShowInfo.c:265
+msgid "Last modified:"
+msgstr "Laatst gewijzigd op:"
+
+#: src/LYShowInfo.c:268
+msgid "Last accessed:"
+msgstr "Laatst bezocht op:"
+
+#: src/LYShowInfo.c:274
+msgid "Access Permissions"
+msgstr "Toegangsrechten"
+
+#: src/LYShowInfo.c:309
+msgid "Group:"
+msgstr "Groep:"
+
+#: src/LYShowInfo.c:329
+msgid "World:"
+msgstr "Wereld:"
+
+#: src/LYShowInfo.c:336
+msgid "File that you are currently viewing"
+msgstr "Het bestand dat u op dit moment bekijkt"
+
+#: src/LYShowInfo.c:344 src/LYShowInfo.c:444
+msgid "Linkname:"
+msgstr "Linknaam:"
+
+#: src/LYShowInfo.c:350 src/LYShowInfo.c:365
+msgid "Charset:"
+msgstr "Tekenset:"
+
+#: src/LYShowInfo.c:364
+msgid "(assumed)"
+msgstr "(verondersteld)"
+
+#: src/LYShowInfo.c:371
+msgid "Server:"
+msgstr "Server:"
+
+#: src/LYShowInfo.c:374
+msgid "Date:"
+msgstr "Datum:"
+
+#: src/LYShowInfo.c:377
+msgid "Last Mod:"
+msgstr "Laatst veranderd:"
+
+#: src/LYShowInfo.c:381
+msgid "Expires:"
+msgstr "Vervalt:"
+
+#: src/LYShowInfo.c:384
+msgid "Cache-Control:"
+msgstr "Cache-besturing:"
+
+#: src/LYShowInfo.c:387
+msgid "Content-Length:"
+msgstr "Inhoudslengte:"
+
+#: src/LYShowInfo.c:391
+msgid "Length:"
+msgstr "Lengte:"
+
+#: src/LYShowInfo.c:396
+msgid "Language:"
+msgstr "Taal:"
+
+#: src/LYShowInfo.c:402
+msgid "Post Data:"
+msgstr "POST-informatie:"
+
+#: src/LYShowInfo.c:405
+msgid "Post Content Type:"
+msgstr "POST-inhoudstype:"
+
+#: src/LYShowInfo.c:408
+msgid "Owner(s):"
+msgstr "Eigenaar:"
+
+#: src/LYShowInfo.c:413
+msgid "size:"
+msgstr "grootte:"
+
+#: src/LYShowInfo.c:415
+msgid "lines"
+msgstr "regels"
+
+#: src/LYShowInfo.c:419
+msgid "forms mode"
+msgstr "formuliermodus"
+
+#: src/LYShowInfo.c:421
+msgid "source"
+msgstr "bron"
+
+#: src/LYShowInfo.c:422
+msgid "normal"
+msgstr "normaal"
+
+#: src/LYShowInfo.c:424
+msgid ", safe"
+msgstr ", veilig"
+
+#: src/LYShowInfo.c:426
+msgid ", via internal link"
+msgstr ", via interne link"
+
+#: src/LYShowInfo.c:430
+msgid ", no-cache"
+msgstr ", geen cache"
+
+#: src/LYShowInfo.c:432
+msgid ", ISMAP script"
+msgstr ", ISMAP-script"
+
+#: src/LYShowInfo.c:434
+msgid ", bookmark file"
+msgstr ", boekenleggerbestand"
+
+#: src/LYShowInfo.c:437
+msgid "mode:"
+msgstr "modus:"
+
+#: src/LYShowInfo.c:443
+msgid "Link that you currently have selected"
+msgstr "Link die nu geselecteerd is"
+
+#: src/LYShowInfo.c:452
+msgid "Method:"
+msgstr "Methode:"
+
+#: src/LYShowInfo.c:456
+msgid "Enctype:"
+msgstr "Enctype:"
+
+#: src/LYShowInfo.c:462
+msgid "Action:"
+msgstr "Actie:"
+
+#: src/LYShowInfo.c:468
+msgid "(Form field)"
+msgstr "(formulierveld)"
+
+#: src/LYShowInfo.c:478
+msgid "No Links on the current page"
+msgstr "Er zijn geen verwijzingen op de huidige pagina"
+
+#: src/LYShowInfo.c:483
+msgid "Server Headers:"
+msgstr "Serverkopregels:"
+
+#: src/LYStyle.c:332
+#, c-format
+msgid ""
+"Syntax Error parsing style in lss file:\n"
+"[%s]\n"
+"The line must be of the form:\n"
+"OBJECT:MONO:COLOR (ie em:bold:brightblue:white)\n"
+"where OBJECT is one of EM,STRONG,B,I,U,BLINK etc.\n"
+"\n"
+msgstr ""
+"Syntactische fout bij verwerken van stijl in lss-bestand:\n"
+"[%s]\n"
+"De regel moet van de volgende vorm zijn:\n"
+"OBJECT:MONO:KLEUR (dat is, em:bold:brightblue:white)\n"
+"waar OBJECT een van de volgende is: EM,STRONG,B,I,U,BLINK enz.\n"
+"\n"
+
+#: src/LYStyle.c:941
+#, c-format
+msgid ""
+"\n"
+"Lynx file \"%s\" is not available.\n"
+"\n"
+msgstr ""
+"\n"
+"Lynx-bestand '%s' is niet beschikbaar.\n"
+"\n"
+
+#: src/LYTraversal.c:111
+msgid "here is a list of the history stack so that you may rebuild"
+msgstr "hier is een lijst van de logs, zodat u opnieuw kunt bouwen"
+
+#: src/LYUpload.c:77
+msgid "ERROR! - upload command is misconfigured"
+msgstr "FOUT! -- upload-commando is niet goed ingesteld"
+
+#: src/LYUpload.c:98
+msgid "Illegal redirection \"../\" found! Request ignored."
+msgstr "Ongeldige doorverwijzing \"../\" gevonden! Verzoek is genegeerd."
+
+#: src/LYUpload.c:101
+msgid "Illegal character \"/\" found! Request ignored."
+msgstr "Ongeldig teken \"/\" gevonden! Verzoek is genegeerd."
+
+#: src/LYUpload.c:104
+msgid "Illegal redirection using \"~\" found! Request ignored."
+msgstr "Ongeldige doorverwijzing met \"~\" gevonden! Verzoek is genegeerd."
+
+#: src/LYUpload.c:157
+msgid "Unable to upload file."
+msgstr "Kan bestand niet uploaden."
+
+#: src/LYUpload.c:196
+msgid "Upload To:"
+msgstr "Zenden naar:"
+
+#: src/LYUpload.c:197
+msgid "Upload options:"
+msgstr "Zendopties:"
+
+#: src/LYUtils.c:1911
+msgid "Download document URL put to clipboard."
+msgstr "Document afhalings-URL op klembord geplaatst."
+
+#: src/LYUtils.c:2658
+msgid "Unexpected access protocol for this URL scheme."
+msgstr "Onverwacht toegangsprotocol voor deze URL-methode."
+
+#: src/LYUtils.c:3571
+msgid "Too many tempfiles"
+msgstr "Te veel tijdelijke bestanden"
+
+#: src/LYUtils.c:3871
+msgid "unknown restriction"
+msgstr "Onbekende beperking"
+
+#: src/LYUtils.c:3902
+#, c-format
+msgid "No restrictions set.\n"
+msgstr "Er zijn geen beperkingen gesteld.\n"
+
+#: src/LYUtils.c:3905
+#, c-format
+msgid "Restrictions set:\n"
+msgstr "Gestelde beperkingen:\n"
+
+#: src/LYUtils.c:5202
+msgid "Cannot find HOME directory"
+msgstr "Kan persoonlijke map niet vinden"
+
+#: src/LYrcFile.c:16
+msgid "Normally disabled. See ENABLE_LYNXRC in lynx.cfg\n"
+msgstr "Normaliter uitgeschakeld. Zie ENABLE_LYNXRC in lynx.cfg\n"
+
+#: src/LYrcFile.c:373
+msgid ""
+"accept_all_cookies allows the user to tell Lynx to automatically\n"
+"accept all cookies if desired. The default is \"FALSE\" which will\n"
+"prompt for each cookie. Set accept_all_cookies to \"TRUE\" to accept\n"
+"all cookies.\n"
+msgstr ""
+"accept_all_cookies stelt de gebruiker in staat om, indien gewenst,\n"
+"Lynx automatisch alle koekjes te laten accepteren. De standaard is\n"
+"\"FALSE\", zodat voor elk koekje om bevestiging zal worden gevraagd.\n"
+"Zet accept_all_cookies op \"TRUE\" om alle koekjes te accepteren.\n"
+
+#: src/LYrcFile.c:381
+msgid ""
+"anonftp_password allows the user to tell Lynx to use the personal\n"
+"email address as the password for anonymous ftp. If no value is given,\n"
+"Lynx will use the personal email address. Set anonftp_password\n"
+"to a different value if you choose.\n"
+msgstr ""
+"anonftp_password geeft de gebruiker de gelegenheid op het e-mailadres\n"
+"op te geven dat gebruikt wordt als wachtwoord bij anonieme FTP-toegang.n Als geen waarde gegeven wordt, gebruikt Lynx het persoonlijke e-mailadres.\n"
+
+#: src/LYrcFile.c:390
+msgid ""
+"bookmark_file specifies the name and location of the default bookmark\n"
+"file into which the user can paste links for easy access at a later\n"
+"date.\n"
+msgstr ""
+"bookmark_file specificeert de naam en locatie van het standaard\n"
+"boekenleggerbestand waarin de gebruiker links kan plaatsen om deze\n"
+"op een later tijdstip eenvoudig te kunnen bereiken.\n"
+
+#: src/LYrcFile.c:395
+msgid ""
+"If case_sensitive_searching is \"on\" then when the user invokes a search\n"
+"using the 's' or '/' keys, the search performed will be case sensitive\n"
+"instead of case INsensitive. The default is usually \"off\".\n"
+msgstr ""
+"Als case_sensitive_searching \"on\" is, zal indien de gebruiker een zoekopdracht\n"
+"opgeeft met de 's' of '/' toetsen, het zoeken gevoelig voor verschil in grote\n"
+"en kleine letters, in plaats van ongevoelig voor kast. De standaard is\n"
+"meestal \"off\".\n"
+
+#: src/LYrcFile.c:400
+msgid ""
+"The character_set definition controls the representation of 8 bit\n"
+"characters for your terminal. If 8 bit characters do not show up\n"
+"correctly on your screen you may try changing to a different 8 bit\n"
+"set or using the 7 bit character approximations.\n"
+"Current valid characters sets are:\n"
+msgstr ""
+"De character_set definitie bepaalt de representatie van 8 bit tekens\n"
+"voor uw terminal. Als 8 bit tekens niet correct afgebeeld worden op uw\n"
+"scherm, kunt u een andere 8 bit verzameling proberen of 7 bit benaderingen.\n"
+"Huidig geldige tekenverzamelingen zijn:\n"
+
+#: src/LYrcFile.c:408
+msgid ""
+"cookie_accept_domains and cookie_reject_domains are comma-delimited\n"
+"lists of domains from which Lynx should automatically accept or reject\n"
+"all cookies. If a domain is specified in both options, rejection will\n"
+"take precedence. The accept_all_cookies parameter will override any\n"
+"settings made here.\n"
+msgstr "cookie_accept_domains en cookie_reject_domains zijn door komma's gescheiden lijsten van domeinen voor welke Lynx automatisch alle koekjes respectievelijk toelaat of weigert. Als een domein opgegeven wordt voor beide opties zal verwerping het winnen van toelaten. De accept_all_cookies parameter doet deze instellingen teniet.\n"
+
+#: src/LYrcFile.c:416
+msgid ""
+"cookie_file specifies the file from which to read persistent cookies.\n"
+"The default is ~/"
+msgstr ""
+"'cookie_file' specificeert het bestand waaruit blijvende koekjes worden\n"
+"gelezen. Standaard is dit ~/"
+
+#: src/LYrcFile.c:421
+msgid ""
+"cookie_loose_invalid_domains, cookie_strict_invalid_domains, and\n"
+"cookie_query_invalid_domains are comma-delimited lists of which domains\n"
+"should be subjected to varying degrees of validity checking. If a\n"
+"domain is set to strict checking, strict conformance to RFC2109 will\n"
+"be applied. A domain with loose checking will be allowed to set cookies\n"
+"with an invalid path or domain attribute. All domains will default to\n"
+"querying the user for an invalid path or domain.\n"
+msgstr ""
+"cookie_loose_invalid_domains, cookie_strict_invalid_domains, en\n"
+"cookie_query_invalid_domains zijn door komma's gescheiden lijsten\n"
+"waarmee domeinen op verscheidene niveau's van geldigheid worden\n"
+"gecontroleerd. Als een domein op `strict'e controle wordt gezet, moet\n"
+"strict voldaan worden aan RFC2109. Een domein met 'loose' controle\n"
+"zal toegestaan worden om koekjes met een ongeldige padnaam of\n"
+"domein-attribuut te plaatsen. Alle domeinen zullen standaard de\n"
+"gebruiker vragen (query) in geval van ongeldig pad of domein.\n"
+
+#: src/LYrcFile.c:435
+msgid ""
+"dir_list_order specifies the directory list order under DIRED_SUPPORT\n"
+"(if implemented). The default is \"ORDER_BY_NAME\"\n"
+msgstr ""
+"dir_list_order bepaalt de volgorde van de mappenlijst onder DIRED_SUPPORT\n"
+"(als geïmplementeerd). De standaard is \"ORDER_BY_NAME\"\n"
+
+#: src/LYrcFile.c:440
+msgid ""
+"dir_list_styles specifies the directory list style under DIRED_SUPPORT\n"
+"(if implemented). The default is \"MIXED_STYLE\", which sorts both\n"
+"files and directories together. \"FILES_FIRST\" lists files first and\n"
+"\"DIRECTORIES_FIRST\" lists directories first.\n"
+msgstr ""
+"dir_list_styles specificeert de stijl van een map in DIRED_SUPPORT\n"
+"(indien geïmplementeerd). De standaard is \"MIXED_STYLE\", waarmee\n"
+"bestanden en mappen samen worden gesorteerd. \"FILES_FIRST\" plaatst\n"
+"bestanden eerst, \"DIRECTORIES_FIRST\" plaatst mappen eerst.\n"
+
+#: src/LYrcFile.c:448
+msgid ""
+"If emacs_keys is to \"on\" then the normal EMACS movement keys:\n"
+" ^N = down ^P = up\n"
+" ^B = left ^F = right\n"
+"will be enabled.\n"
+msgstr ""
+"Als emacs_keys \"on\" is dan zullen de normale EMACS toetsen:\n"
+" ^N = omlaag (next-line) ^P = omhoog (previous-line)\n"
+" ^B = links (backward-char) ^F = rechts (forward-char)\n"
+"in gebruik zijn.\n"
+
+#: src/LYrcFile.c:454
+msgid ""
+"file_editor specifies the editor to be invoked when editing local files\n"
+"or sending mail. If no editor is specified, then file editing is disabled\n"
+"unless it is activated from the command line, and the built-in line editor\n"
+"will be used for sending mail.\n"
+msgstr ""
+"file_editor specificeert de editor die aangeroepen wordt om lokale bestanden\n"
+"te wijzigen of om e-mail te verzenden. Als geen editor gespecificeerd wordt,\n"
+"dan is bestanden wijzigen niet mogelijk, tenzij het vanaf de commando-regel\n"
+"wordt opgegeven. De ingebouwde editor zal worden gebruikt om e-mail te\n"
+"verzenden.\n"
+
+#: src/LYrcFile.c:461
+msgid ""
+"The file_sorting_method specifies which value to sort on when viewing\n"
+"file lists such as FTP directories. The options are:\n"
+" BY_FILENAME -- sorts on the name of the file\n"
+" BY_TYPE -- sorts on the type of the file\n"
+" BY_SIZE -- sorts on the size of the file\n"
+" BY_DATE -- sorts on the date of the file\n"
+msgstr ""
+"De file_sorting_method specificeert op welke waarde gesorteerd wordt bij\n"
+"het bekijken van lijsten zoals FTP mappen. De opties zijn:\n"
+" BY_FILENAME -- sorteert op de naam van het bestand\n"
+" BY_TYPE -- sorteert op het type van het bestand\n"
+" BY_SIZE -- sorteert op de grootte van het bestand\n"
+" BY_DATE -- sorteert op de datum van het bestand\n"
+
+#: src/LYrcFile.c:492
+msgid ""
+"lineedit_mode specifies the key binding used for inputting strings in\n"
+"prompts and forms. If lineedit_mode is set to \"Default Binding\" then\n"
+"the following control characters are used for moving and deleting:\n"
+"\n"
+" Prev Next Enter = Accept input\n"
+" Move char: <- -> ^G = Cancel input\n"
+" Move word: ^P ^N ^U = Erase line\n"
+" Delete char: ^H ^R ^A = Beginning of line\n"
+" Delete word: ^B ^F ^E = End of line\n"
+"\n"
+"Current lineedit modes are:\n"
+msgstr ""
+"lineedit_mode specificeert de toetsaanslagen die gebruikt worden voor het invoeren van tekenreeksen in prompten en formulieren. Als lineedit_mode gezet wordt op \"Default Binding\" dan worden de volgende tekens gebruikt voor verplaatsen en verwijderen:\n"
+" Vorig Volgend return = Accepteer invoer\n"
+" Verplaats teken: <- -> ^G = annuleer invoer\n"
+" Verplaats woord: ^P ^N ^U = wis regel\n"
+" Wis teken: ^H ^R ^A = ga naar begin van regel\n"
+" Wis woord: ^B ^F ^E = ga naar einde van regel\n"
+"\n"
+"Huidige mogelijkheden voor lineedit_mode zijn:\n"
+
+#: src/LYrcFile.c:510
+msgid ""
+"The following allow you to define sub-bookmark files and descriptions.\n"
+"The format is multi_bookmark<capital_letter>=<filename>,<description>\n"
+"Up to 26 bookmark files (for the English capital letters) are allowed.\n"
+"We start with \"multi_bookmarkB\" since 'A' is the default (see above).\n"
+msgstr ""
+"Op de volgende regels kunt u sub-boekenlegger bestanden en\n"
+"omschrijvingen opgeven. Het formaat is als volgt:\n"
+"multi_bookmark<hoofdletter>=<bestandsnaam>,<omschrijving>\n"
+"Er kunnen 26 boekenleggerbestanden zijn, voor elke hoofdletter A-Z.\n"
+"We beginnen met \"multi_bookmarkB\" omdat 'A' de gewone is (zie boven).\n"
+
+#: src/LYrcFile.c:516
+msgid ""
+"personal_mail_address specifies your personal mail address. The\n"
+"address will be sent during HTTP file transfers for authorization and\n"
+"logging purposes, and for mailed comments.\n"
+"If you do not want this information given out, set the NO_FROM_HEADER\n"
+"to TRUE in lynx.cfg, or use the -nofrom command line switch. You also\n"
+"could leave this field blank, but then you won't have it included in\n"
+"your mailed comments.\n"
+msgstr ""
+"personal_mail_address specificeert uw persoonlijke e-mailadres.\n"
+"Het adres zal verzonden worden tijdens HTTP bestandsoverdrachten voor\n"
+"autorisatie- en log-doeleinden, en voor e-mailcommentaren.\n"
+"Als u deze informatie niet uit wilt reiken, zet dan NO_FROM_HEADER op\n"
+"TRUE in lynx.cfg, of gebruik de -nofrom commando-regel optie. U kunt\n"
+"ook dit veld leeg laten, maar dan wordt het ook niet opgenomen in\n"
+"uw e-mailcommentaren.\n"
+
+#: src/LYrcFile.c:525
+msgid ""
+"personal_mail_name specifies your personal name, for mail. The\n"
+"name is sent for mailed comments. Lynx will prompt for this,\n"
+"showing the configured value as a default when sending mail.\n"
+"This is not necessarily the same as a name provided as part of the\n"
+"personal_mail_address.\n"
+"Lynx does not save your changes to that default value as a side-effect\n"
+"of sending email. To update the default value, you must use the options\n"
+"menu, or modify this file directly.\n"
+msgstr ""
+"personal_mail_name specificeert uw persoonlijke naam, gebruikt voor e-mail.\n"
+"De naam wordt verzonden voor e-mailcommentaren. Lynx zal hiernaar\n"
+"vragen, daarbij de ingestelde waarde als standaard bij het versturen van\n"
+"berichten wordt getoond. Het is niet noodzakelijk dezelfde naam als\n"
+"gebruikt in het personal_mail_address.\n"
+"Lynx zal uw veranderingen van de standaardnaam bij het verzenden van het\n"
+"bericht niet opslaan. Om de standaardwaarde te veranderen kunt u het\n"
+"optiemenu gebruiken of dit bestand direct bewerken.\n"
+
+#: src/LYrcFile.c:535
+msgid ""
+"preferred_charset specifies the character set in MIME notation (e.g.,\n"
+"ISO-8859-2, ISO-8859-5) which Lynx will indicate you prefer in requests\n"
+"to http servers using an Accept-Charset header. The value should NOT\n"
+"include ISO-8859-1 or US-ASCII, since those values are always assumed\n"
+"by default. May be a comma-separated list.\n"
+"If a file in that character set is available, the server will send it.\n"
+"If no Accept-Charset header is present, the default is that any\n"
+"character set is acceptable. If an Accept-Charset header is present,\n"
+"and if the server cannot send a response which is acceptable\n"
+"according to the Accept-Charset header, then the server SHOULD send\n"
+"an error response, though the sending of an unacceptable response\n"
+"is also allowed.\n"
+msgstr ""
+"preferred_charset specificeert de tekenset in MIME-notatie\n"
+"(bijvoorbeeld ISO-8859-2, ISO-8859-5 -- een kommagescheiden lijst)\n"
+"waarmee Lynx uw voorkeuren doorgeeft aan HTTP-servers die een\n"
+"'Accept-Charset'-kopregel gebruiken. De waarde mag _niet_ ISO-8859-1\n"
+"of US-ASCII bevatten, omdat deze waarden altijd standaard aangenomen\n"
+"worden. Als een bestand in die tekenverzameling beschikbaar is, zal\n"
+"de server het verzenden. Als geen Accept-Charset header aanwezig is, is\n"
+"elke willekeurige tekenverzameling acceptabel. Als een Accept-Charset\n"
+"header aanwezig is, en als de server geen antwoord kan zenden dat\n"
+"acceptabel is volgens deze header, dan ZOU de server een foutmelding\n"
+"moeten sturen, maar het verzenden van een onacceptabel antwoord is ook\n"
+"toegestaan.\n"
+
+#: src/LYrcFile.c:553
+msgid ""
+"preferred_language specifies the language in MIME notation (e.g., en,\n"
+"fr, may be a comma-separated list in decreasing preference)\n"
+"which Lynx will indicate you prefer in requests to http servers.\n"
+"If a file in that language is available, the server will send it.\n"
+"Otherwise, the server will send the file in its default language.\n"
+msgstr ""
+"preferred_language specificeert de taal in MIME notatie (dat is, en,\n"
+"fr, een door komma's gescheiden lijst in afnemende volgorde van\n"
+"voorkeur) waarmee Lynx uw voorkeuren doorgeeft in opdrachten aan http\n"
+"servers. Als een bestand in een bepaalde taal aanwezig is, zal de\n"
+"server het verzenden. Als dit niet het geval is, zal de server het\n"
+"bestand in zijn standaard taal verzenden.\n"
+
+#: src/LYrcFile.c:564
+msgid ""
+"If run_all_execution_links is set \"on\" then all local execution links\n"
+"will be executed when they are selected.\n"
+"\n"
+"WARNING - This is potentially VERY dangerous. Since you may view\n"
+" information that is written by unknown and untrusted sources\n"
+" there exists the possibility that Trojan horse links could be\n"
+" written. Trojan horse links could be written to erase files\n"
+" or compromise security. This should only be set to \"on\" if\n"
+" you are viewing trusted source information.\n"
+msgstr ""
+"Als run_all_execution_links op \"on\" wordt gezet zullen alle lokale\n"
+"uitvoer-linksworden uitgevoerd als ze geselecteerd worden.\n"
+"\n"
+"LET OP - Dit is potentieel ERG gevaarlijk. Omdat u informatie kunt\n"
+" bekijken die geschreven is door onbekende en niet vertrouwde\n"
+" bronnen, bestaat er een mogelijkheid dat Trojaanse paarden in\n"
+" de vorm van links geschreven kunnen worden. Deze kunnen\n"
+" worden geschreven om bestanden te wissen of beveiligingen te\n"
+" omzeilen. Deze optie moet alleen op \"on\" gezet worden als u\n"
+" alleen maar informatie bekijkt uit een vertrouwde bron.\n"
+
+#: src/LYrcFile.c:575
+msgid ""
+"If run_execution_links_on_local_files is set \"on\" then all local\n"
+"execution links that are found in LOCAL files will be executed when they\n"
+"are selected. This is different from run_all_execution_links in that\n"
+"only files that reside on the local system will have execution link\n"
+"permissions.\n"
+"\n"
+"WARNING - This is potentially dangerous. Since you may view\n"
+" information that is written by unknown and untrusted sources\n"
+" there exists the possibility that Trojan horse links could be\n"
+" written. Trojan horse links could be written to erase files\n"
+" or compromise security. This should only be set to \"on\" if\n"
+" you are viewing trusted source information.\n"
+msgstr ""
+"Als run_execution_links_on_local_files op \"on\" wordt gezet zullen alle\n"
+"lokale uitvoer-links gevonden in LOKALE bestanden worden uitgevoerd als\n"
+"ze geselecteerd worden. Dit verschilt van run_all_execution_links, daar\n"
+"slechts bestanden die zich op het lokale systeem bevinden deze uitvoer\n"
+"rechten krijgen.\n"
+"\n"
+"LET OP - Hier dreigt potentieel gevaar. Omdat u informatie kunt\n"
+" bekijken die geschreven is door onbekende en niet vertrouwde\n"
+" bronnen, bestaat er een mogelijkheid dat Trojaanse paarden in\n"
+" de vorm van links geschreven kunnen worden. Deze kunnen\n"
+" worden geschreven om bestanden te wissen of beveiligingen te\n"
+" omzeilen. Deze optie moet alleen op \"on\" gezet worden als u\n"
+" alleen maar informatie bekijkt uit een vertrouwde bron.\n"
+
+#: src/LYrcFile.c:593
+msgid ""
+"select_popups specifies whether the OPTIONs in a SELECT block which\n"
+"lacks a MULTIPLE attribute are presented as a vertical list of radio\n"
+"buttons or via a popup menu. Note that if the MULTIPLE attribute is\n"
+"present in the SELECT start tag, Lynx always will create a vertical list\n"
+"of checkboxes for the OPTIONs. A value of \"on\" will set popup menus\n"
+"as the default while a value of \"off\" will set use of radio boxes.\n"
+"The default can be overridden via the -popup command line toggle.\n"
+msgstr ""
+"select_popups bepaalt of de `OPTION's in een `SELECT' blok dat geen\n"
+"`MULTIPLE' attribuut heeft getoond worden als een verticale lijst van\n"
+"druknoppen of via een popup-menu. Merk op dat indien het `MULTIPLE'\n"
+"attribuut aanwezig is in de `SELECT' begin-tag, Lynx altijd een\n"
+"verticale lijst van aanvinkvelden voor de `OPTION's zal maken. Een\n"
+"waarde \"on\" maakt popup-menu's de standaard, terwijl \"off\" voor\n"
+"drukknoppen zorgt.\n"
+"De standaard kan worden tenietgedaan d.m.v. de `-popup' commandoregel optie.\n"
+
+#: src/LYrcFile.c:604
+msgid ""
+"show_color specifies how to set the color mode at startup. A value of\n"
+"\"never\" will force color mode off (treat the terminal as monochrome)\n"
+"at startup even if the terminal appears to be color capable. A value of\n"
+"\"always\" will force color mode on even if the terminal appears to be\n"
+"monochrome, if this is supported by the library used to build lynx.\n"
+"A value of \"default\" will yield the behavior of assuming\n"
+"a monochrome terminal unless color capability is inferred at startup\n"
+"based on the terminal type, or the -color command line switch is used, or\n"
+"the COLORTERM environment variable is set. The default behavior always is\n"
+"used in anonymous accounts or if the \"option_save\" restriction is set.\n"
+"The effect of the saved value can be overridden via\n"
+"the -color and -nocolor command line switches.\n"
+"The mode set at startup can be changed via the \"show color\" option in\n"
+"the 'o'ptions menu. If the option settings are saved, the \"on\" and\n"
+"\"off\" \"show color\" settings will be treated as \"default\".\n"
+msgstr ""
+"show_color specificeert wat de kleurenmodus bij het opstarten moet\n"
+"zijn. Een waarde \"never\" forceert de kleurmodus \"off\" (de terminal\n"
+"wordt als monochroom beschouwd) zelfs als de terminal kleur aan lijkt\n"
+"te kunnen. Een waarde \"always\" forceert de kleurenmodus \"on\", zelfs\n"
+"als de terminal monochroom lijkt te zijn, als dit maar ondersteund\n"
+"wordt door de bibliotheek die gebruikt is om lynx mee te maken. Een\n"
+"waarde \"default\" zal uitgaan van een monochrome terminal, tenzij bij\n"
+"het opstarten blijkt dat de terminal kleur aan kan, of als de '-color'\n"
+"optie wordt opgegeven vanaf de commandoregel, of als de COLORTERM\n"
+"omgevingsvariabele gezet is. Het standaardgedrag wordt gebruikt bij\n"
+"anonieme accounts of als de \"option_save\" restrictie gezet is. Het\n"
+"effect van de opgeslagen waarde kan worden tenietgedaan d.m.v. de\n"
+"'-color' en '-nocolor' opties op de commandoregel. De modus van het\n"
+"opstarten kan gewijzigd worden via de optie \"Kleur tonen\" in het\n"
+"'o'pties menu. Als de optie-instellingen worden opgeslagen, zullen\n"
+"de \"on\" en \"off\" instellingen worden gezien als \"default\".\n"
+
+#: src/LYrcFile.c:621
+msgid ""
+"show_cursor specifies whether to 'hide' the cursor to the right (and\n"
+"bottom, if possible) of the screen, or to place it to the left of the\n"
+"current link in documents, or current option in select popup windows.\n"
+"Positioning the cursor to the left of the current link or option is\n"
+"helpful for speech or braille interfaces, and when the terminal is\n"
+"one which does not distinguish the current link based on highlighting\n"
+"or color. A value of \"on\" will set positioning to the left as the\n"
+"default while a value of \"off\" will set 'hiding' of the cursor.\n"
+"The default can be overridden via the -show_cursor command line toggle.\n"
+msgstr ""
+"show_cursor bepaalt of de cursor 'verborgen' wordt rechts van (en,\n"
+"indien mogelijk, onder in) het scherm, of om het links van de huidige\n"
+"link in documenten te plaatsen, of op de huidige optie in popup\n"
+"vensters. De cursor links van een link of optie plaatsen is handig\n"
+"voor spraak of braille interfaces, en voor gevallen waarin de terminal\n"
+"de geselecteerde link niet onderscheidt door fel oplichten of kleur.\n"
+"Een waarde \"on\" zal de positionering links van de links of opties\n"
+"zetten, en en waarde \"off\" probeert de cursor te 'verbergen'.\n"
+
+#: src/LYrcFile.c:632
+msgid ""
+"show_dotfiles specifies that the directory listing should include\n"
+"\"hidden\" (dot) files/directories. If set \"on\", this will be\n"
+"honored only if enabled via userdefs.h and/or lynx.cfg, and not\n"
+"restricted via a command line switch. If display of hidden files\n"
+"is disabled, creation of such files via Lynx also is disabled.\n"
+msgstr ""
+"show_dotfiles specificeert of binnen een map 'verborgen' (punt)bestanden\n"
+"en mappen getoond worden. Indien \"on\", zal dit alleen gebeuren indien\n"
+"aangezet in userdefs.h en/of lynx.cfg, en niet beperkt door een optie op\n"
+"de commandoregel. Indien uitgeschakeld, wordt het ook onmogelijk gemaakt\n"
+"om verborgen bestanden aan te maken vanuit Lynx.\n"
+
+#: src/LYrcFile.c:643
+msgid ""
+"If sub_bookmarks is not turned \"off\", and multiple bookmarks have\n"
+"been defined (see below), then all bookmark operations will first\n"
+"prompt the user to select an active sub-bookmark file. If the default\n"
+"Lynx bookmark_file is defined (see above), it will be used as the\n"
+"default selection. When this option is set to \"advanced\", and the\n"
+"user mode is advanced, the 'v'iew bookmark command will invoke a\n"
+"statusline prompt instead of the menu seen in novice and intermediate\n"
+"user modes. When this option is set to \"standard\", the menu will be\n"
+"presented regardless of user mode.\n"
+msgstr ""
+"Als sub_bookmarks niet \"off\" is, en meervoudige boekenleggers zijn\n"
+"opgegeven (zie onder), dan zullen alle boekenleggeroperaties eerst de\n"
+"gebruiker vragen om een actief sub-boekenleggerbestand te selecteren.\n"
+"Als de standaard Lynx bookmark_file gedefinieerd is (zie boven), dan\n"
+"zal dit gebruikt worden als de standaard selectie. Als deze optie op\n"
+"\"geavanceerd\" gezet is en de gebruikersmodus is \"expert\", dan zal\n"
+"het boekenlegger-inzien-commando ('v') een statusregel-menu tonen in\n"
+"plaats van het menu dat in \"beginner\" en \"gevorderd\" modus wordt\n"
+"gebruikt. Als deze optie op \"standaard\" gezet wordt, zal ongeacht de\n"
+"gebruikersmodus het volledige menu getoond worden.\n"
+"\n"
+
+#: src/LYrcFile.c:658
+msgid ""
+"user_mode specifies the users level of knowledge with Lynx. The\n"
+"default is \"NOVICE\" which displays two extra lines of help at the\n"
+"bottom of the screen to aid the user in learning the basic Lynx\n"
+"commands. Set user_mode to \"INTERMEDIATE\" to turn off the extra info.\n"
+"Use \"ADVANCED\" to see the URL of the currently selected link at the\n"
+"bottom of the screen.\n"
+msgstr ""
+"user_mode specificeert het gebruikersniveau binnen Lynx. De standaard\n"
+"is \"NOVICE\" waarbij twee extra regels met hulpteksten onder in het\n"
+"scherm getoond worden, om de gebruiker de basis commando's in Lynx te\n"
+"leren. Zet user_mode op \"INTERMEDIATE\" om de extra informatie uit te\n"
+"schakelen. Gebruik \"ADVANCED\" om onder in het scherm de URL van de\n"
+"geselecteerd link te zien.\n"
+
+#: src/LYrcFile.c:667
+msgid ""
+"If verbose_images is \"on\", lynx will print the name of the image\n"
+"source file in place of [INLINE], [LINK] or [IMAGE]\n"
+"See also VERBOSE_IMAGES in lynx.cfg\n"
+msgstr ""
+"Als verbose_images \"on\" is, zal lynx de naam van het brobestand van de\n"
+"afbeelding laten zien in plaats van [INLINE], [LINK] of [IMAGE].\n"
+"Zie ook VERBOSE_IMAGES in lynx.cfg\n"
+
+#: src/LYrcFile.c:672
+msgid ""
+"If vi_keys is set to \"on\", then the normal VI movement keys:\n"
+" j = down k = up\n"
+" h = left l = right\n"
+"will be enabled. These keys are only lower case.\n"
+"Capital 'H', 'J' and 'K will still activate help, jump shortcuts,\n"
+"and the keymap display, respectively.\n"
+msgstr ""
+"Als 'vi_keys' \"on\" is, dan zijn de normale VI-toetsen in gebruik:\n"
+" j = omlaag k = omhoog\n"
+" h = links l = rechts Dit zijn alleen de kleine letters.\n"
+"De hoofdletters 'H', 'J' en 'K' zullen nog steeds hulp activeren,\n"
+"springen naar snelkoppelingen of de toetsenindeling laten zien.\n"
+
+#: src/LYrcFile.c:680
+msgid ""
+"The visited_links setting controls how Lynx organizes the information\n"
+"in the Visited Links Page.\n"
+msgstr ""
+"De optie 'visited_links' bepaalt hoe Lynx de informatie weergeeft op de\n"
+"pagina met Bezochte links.\n"
+
+#: src/LYrcFile.c:924
+msgid ""
+"If keypad_mode is set to \"NUMBERS_AS_ARROWS\", then the numbers on\n"
+"your keypad when the numlock is on will act as arrow keys:\n"
+" 8 = Up Arrow\n"
+" 4 = Left Arrow 6 = Right Arrow\n"
+" 2 = Down Arrow\n"
+"and the corresponding keyboard numbers will act as arrow keys,\n"
+"regardless of whether numlock is on.\n"
+msgstr ""
+"Als keypad_mode op \"NUMBERS_AS_ARROWS\" gezet wordt, zullen de nummers\n"
+"op uw numerieke eiland met Numlock aan als pijltjestoetsen functioneren:\n"
+" 8 = Pijltje omhoog\n"
+" 4 = Pijltje links 6 = Pijltje rechts\n"
+" 2 = Pijltje omlaag\n"
+"De corresponderende nummers op het linkerdeel van het toetsenbord zullen\n"
+"ook als pijltjestoetsen functioneren, ongeacht de Numlock stand.\n"
+
+#: src/LYrcFile.c:933
+msgid ""
+"If keypad_mode is set to \"LINKS_ARE_NUMBERED\", then numbers will\n"
+"appear next to each link and numbers are used to select links.\n"
+msgstr ""
+"Als keypad_mode op \"LINKS_ARE_NUMBERED\" staat, zullen nummers\n"
+"verschijnen naast elke link en nummers kunnen gebruikt worden om links\n"
+"te selecteren.\n"
+
+#: src/LYrcFile.c:937
+msgid ""
+"If keypad_mode is set to \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\", then\n"
+"numbers will appear next to each link and visible form input field.\n"
+"Numbers are used to select links, or to move the \"current link\" to a\n"
+"form input field or button. In addition, options in popup menus are\n"
+"indexed so that the user may type an option number to select an option in\n"
+"a popup menu, even if the option isn't visible on the screen. Reference\n"
+"lists and output from the list command also enumerate form inputs.\n"
+msgstr ""
+"Als keypad_mode op \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\" gezet wordt,\n"
+"zullen nummers verschijnen naast elke link en zichtbare\n"
+"formulier-invoervelden. Nummers zullen gebruikt worden om links te\n"
+"selecteren, of om de \"huidige link\" te verplaatsen naar een\n"
+"formulier-invoerveld of -knop. Daarbij komt dat opties in een popup\n"
+"menu geïndexeerd zijn, zodat de gebruiker een optienummer kan intypen\n"
+"om een optie in een popup menu te selecteren, zelfs als de optie niet\n"
+"op het scherm zichtbaar is. Referentielijsten en uitvoer van het\n"
+"lijst commando nummeren ook formulier-invoervelden.\n"
+
+#: src/LYrcFile.c:946
+msgid ""
+"NOTE: Some fixed format documents may look disfigured when\n"
+"\"LINKS_ARE_NUMBERED\" or \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\" are\n"
+"enabled.\n"
+msgstr ""
+"MERK OP: Sommige documenten met een gefixeerde opmaak kunnen er\n"
+"verminkt uitzien als \"LINKS_ARE_NUMBERED\" of\n"
+"\"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\" is aangezet.\n"
+
+#: src/LYrcFile.c:978
+msgid ""
+"Lynx User Defaults File\n"
+"\n"
+msgstr ""
+"Lynxbestand met standaardinstellingen van gebruiker\n"
+"\n"
+
+#: src/LYrcFile.c:987
+msgid ""
+"This file contains options saved from the Lynx Options Screen (normally\n"
+"with the 'o' key). To save options with that screen, you must select the\n"
+"checkbox:\n"
+msgstr ""
+"Dit bestand bevat opties bewaard uit het scherm met Lynx-opties (meestal\n"
+"met de 'o'-toets). Om opties met dit venster te bewaren vinkt u het\n"
+"aanvinkveld aan:\n"
+
+#: src/LYrcFile.c:994
+msgid ""
+"You must then save the settings using the link on the line above the\n"
+"checkbox:\n"
+msgstr ""
+"U bewaart vervolgens de instellingen via de link op de regel boven het\n"
+"aanvinkveld:\n"
+
+#: src/LYrcFile.c:1001
+msgid ""
+"You may also use the command-line option \"-forms_options\", which displays\n"
+"the simpler Options Menu instead. Save options with that using the '>' key.\n"
+"\n"
+msgstr ""
+"U kunt via de opdrachtregel ook de optie \"-forms_options\" opgegeven, zodat\n"
+"een eenvoudiger optiemenu wordt getoond. Bewaar hiermee de opties met de\n"
+"'>'-toets.\n"
+
+#: src/LYrcFile.c:1008
+msgid ""
+"This file contains options saved from the Lynx Options Screen (normally\n"
+"with the '>' key).\n"
+"\n"
+msgstr ""
+"Dit bestand bevat opties bewaard uit het Lynx-optiesscherm (meestal\n"
+"via de '>'-toets).\n"
+"\n"
+
+#: src/LYrcFile.c:1015
+msgid ""
+"There is normally no need to edit this file manually, since the defaults\n"
+"here can be controlled from the Options Screen, and the next time options\n"
+"are saved from the Options Screen this file will be completely rewritten.\n"
+"You have been warned...\n"
+"\n"
+"If you are looking for the general configuration file - it is normally\n"
+"called \"lynx.cfg\". It has different content and a different format.\n"
+"It is not this file.\n"
+msgstr ""
+"Er is doorgaans geen reden om dit bestand handmatig te wijzigen, omdat\n"
+"de instellingen vanuit het Optiesscherm kunnen worden bewerkt, en de\n"
+"eerstvolgende keer dat de opties daar opgeslagen worden zal dit bestand\n"
+"volledig worden herschreven.\n"
+"U bent gewaarschuwd...\n"
+"Als u op zoek bent naar het algemene configuratiebestand: dat is\n"
+"meestal \"lynx.cfg\". Het heeft een andere inhoud en een andere opmaak.\n"
+"Het is niet dit bestand.\n"
+
+#~ msgid "HREF in BASE tag is not an absolute URL."
+#~ msgstr "HREF in 'BASE'-element is niet een absolute URL."
+
+#~ msgid "Address contains a username: %s"
+#~ msgstr "Adres bevat een gebruikersnaam: %s"
+
+#~ msgid "Visible links"
+#~ msgstr "Zichtbare links"
+
+#~ msgid ""
+#~ "\n"
+#~ "Lynx edit map not declared.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Lynx-editkaart is niet opgegeven.\n"
+#~ "\n"
+
+#~ msgid "Very long lines have been wrapped!"
+#~ msgstr "Erg lange regels zijn omgevouwen!"
+
+#~ msgid "Path too long"
+#~ msgstr "Pad is te lang"
+
+#~ msgid "Source and destination are the same location - request ignored!"
+#~ msgstr "Bron en bestemming zijn dezelfde locatie -- verzoek is genegeerd!"
+
+#~ msgid "Socket read failed for 180,000 tries."
+#~ msgstr "Lezen uit socket is mislukt na 180 duizend (!) pogingen."
+
+#~ msgid "History List maximum reached! Document not pushed."
+#~ msgstr "Maximum lengte van Historielijst is bereikt! Document is niet toegevoegd."
+
+#~ msgid "reason unknown"
+#~ msgstr "reden onbekend"
diff --git a/po/pt_BR.po b/po/pt_BR.po
new file mode 100644
index 0000000..6704328
--- /dev/null
+++ b/po/pt_BR.po
@@ -0,0 +1,6533 @@
+# Brazilian Portuguese translation of the "lynx" messages
+# Copyright (C) 1999 Free Software Foundation, Inc.
+# Ricardo Soares Guimarães <ricardo@conectiva.com.br>, 1999.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: lynx 2.8.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2012-02-12 19:13-0500\n"
+"PO-Revision-Date: 1999-07-30 09:47-03:00\n"
+"Last-Translator: Ricardo Soares Guimarães <ricardo@conectiva.com.br>\n"
+"Language-Team: Brazilian Portuguese <ldp-br@bazar.conectiva.com.br>\n"
+"Language: pt_BR\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8-bit\n"
+
+#. ******************************************************************
+#. * The following definitions are for status line prompts, messages, or
+#. * warnings issued by Lynx during program execution. You can modify
+#. * them to make them more appropriate for your site. We recommend that
+#. * you extend these definitions to other languages using the gettext
+#. * library. There are also scattered uses of 'gettext()' throughout the
+#. * Lynx source, covering all but those messages which (a) are used for
+#. * debugging (CTRACE) or (b) are constants used in interaction with
+#. * other programs.
+#. *
+#. * See ABOUT-NLS and po/readme for details and location of contributed
+#. * translations. When no translation is available, the English default is
+#. * used.
+#.
+#: LYMessages.c:27
+#, c-format
+msgid "Alert!: %s"
+msgstr "Alerta!: %s"
+
+#: LYMessages.c:28
+msgid "Welcome"
+msgstr "Bem Vindo"
+
+#: LYMessages.c:29
+msgid "Are you sure you want to quit?"
+msgstr "Você tem certeza?"
+
+#: LYMessages.c:31
+msgid "Really exit from Lynx?"
+msgstr "Realmente sair do Lynx?"
+
+#: LYMessages.c:33
+msgid "Connection interrupted."
+msgstr "Conexão interrompida."
+
+#: LYMessages.c:34
+msgid "Data transfer interrupted."
+msgstr "Transferência de dados interrompida."
+
+#: LYMessages.c:35
+msgid "Cancelled!!!"
+msgstr "Cancelado!!!"
+
+#: LYMessages.c:36
+msgid "Cancelling!"
+msgstr "Cancelando!"
+
+#: LYMessages.c:37
+msgid "Excellent!!!"
+msgstr "Excelente!!"
+
+#: LYMessages.c:38
+msgid "OK"
+msgstr "OK"
+
+#: LYMessages.c:39
+msgid "Done!"
+msgstr "Finalizado!"
+
+#: LYMessages.c:40
+msgid "Bad request!"
+msgstr "Requisição mal formada!"
+
+#: LYMessages.c:41
+msgid "previous"
+msgstr "anterior"
+
+#: LYMessages.c:42
+msgid "next screen"
+msgstr "próxima tela"
+
+#: LYMessages.c:43
+msgid "HELP!"
+msgstr "AJUDA!"
+
+#: LYMessages.c:44
+msgid ", help on "
+msgstr ", ajuda em "
+
+#. #define HELP
+#: LYMessages.c:46
+msgid "Commands: Use arrow keys to move, '?' for help, 'q' to quit, '<-' to go back."
+msgstr "Comandos: Use as setas para mover,'?' ajuda, 'q' sair, '<-' voltar."
+
+#. #define MOREHELP
+#: LYMessages.c:48
+msgid "-- press space for more, use arrow keys to move, '?' for help, 'q' to quit."
+msgstr "espaço para continuar, use as setas para mover,'?' ajuda, 'q' sair."
+
+#: LYMessages.c:49
+msgid "-- press space for next page --"
+msgstr "-- pressione a barra de espaço para ir para a próxima página --"
+
+#: LYMessages.c:50
+#, fuzzy
+#| msgid "Path too long"
+msgid "URL too long"
+msgstr "Caminho muito grande"
+
+#. Inactive input fields, messages used with -tna option - kw
+#. #define FORM_LINK_TEXT_MESSAGE_INA
+#: LYMessages.c:56
+msgid "(Text entry field) Inactive. Press <return> to activate."
+msgstr ""
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_INA
+#: LYMessages.c:58
+msgid "(Textarea) Inactive. Press <return> to activate."
+msgstr ""
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_INA_E
+#: LYMessages.c:60
+#, fuzzy, c-format
+#| msgid "(Textarea) Enter text. Use UP/DOWN arrows or TAB to move off (^Ve for editor)."
+msgid "(Textarea) Inactive. Press <return> to activate (%s for editor)."
+msgstr "(Area de texto).Setas para cima/baixo, ou TAB para sair (^Ve para editor)."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE_INA
+#: LYMessages.c:62
+#, fuzzy
+#| msgid "(Form field) Enter text. Use <return> to submit ('x' for no cache)."
+msgid "(Form field) Inactive. Use <return> to edit."
+msgstr "(Campo de formulário). Use <enter> para enviar('x' para não salvar no cache)."
+
+#. #define FORM_TEXT_SUBMIT_MESSAGE_INA_X
+#: LYMessages.c:64
+#, fuzzy, c-format
+#| msgid "(Form field) Enter text. Use <return> to submit ('x' for no cache)."
+msgid "(Form field) Inactive. Use <return> to edit (%s to submit with no cache)."
+msgstr "(Campo de formulário). Use <enter> para enviar('x' para não salvar no cache)."
+
+#. #define FORM_TEXT_RESUBMIT_MESSAGE_INA
+#: LYMessages.c:66
+#, fuzzy
+#| msgid "(Form field) Enter text. Use <return> to submit, arrows or tab to move off."
+msgid "(Form field) Inactive. Press <return> to edit, press <return> twice to submit."
+msgstr "(Campo de formulário). Use <enter> para enviar, setas ou TAB para sair."
+
+#. #define FORM_TEXT_SUBMIT_MAILTO_MSG_INA
+#: LYMessages.c:68
+#, fuzzy
+#| msgid "(mailto form field) Enter text. Use <return> to submit, arrows to move off."
+msgid "(mailto form field) Inactive. Press <return> to change."
+msgstr "(Campo de e-mail) Digite o texto. Use <enter> para enviar, setas para sair."
+
+#. #define FORM_LINK_PASSWORD_MESSAGE_INA
+#: LYMessages.c:70
+#, fuzzy
+#| msgid "(Password entry field) Enter text. Use UP or DOWN arrows or tab to move off."
+msgid "(Password entry field) Inactive. Press <return> to activate."
+msgstr "(Campo de entrada de senha). Use setas para cima/baixo ou TAB para sair."
+
+#. #define FORM_LINK_FILE_UNM_MSG
+#: LYMessages.c:73
+msgid "UNMODIFIABLE file entry field. Use UP or DOWN arrows or tab to move off."
+msgstr "Campo não modificável. Use setas para cima ou para baixo ou TAB para sair."
+
+#. #define FORM_LINK_FILE_MESSAGE
+#: LYMessages.c:75
+msgid "(File entry field) Enter filename. Use UP or DOWN arrows or tab to move off."
+msgstr "(Caixa de texto). Use seta para cima, para baixo ou TAB para sair."
+
+#. #define FORM_LINK_TEXT_MESSAGE
+#: LYMessages.c:77
+msgid "(Text entry field) Enter text. Use UP or DOWN arrows or tab to move off."
+msgstr "(Caixa de texto) Digite o texto.Seta para cima, para baixo ou TAB para sair."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE
+#: LYMessages.c:79
+#, fuzzy
+#| msgid "(Textarea) Enter text. Use UP/DOWN arrows or TAB to move off (^Ve for editor)."
+msgid "(Textarea) Enter text. Use UP/DOWN arrows or TAB to move off."
+msgstr "(Area de texto).Setas para cima/baixo, ou TAB para sair (^Ve para editor)."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_E
+#: LYMessages.c:81
+#, fuzzy, c-format
+#| msgid "(Textarea) Enter text. Use UP/DOWN arrows or TAB to move off (^Ve for editor)."
+msgid "(Textarea) Enter text. Use UP/DOWN arrows or TAB to move off (%s for editor)."
+msgstr "(Area de texto).Setas para cima/baixo, ou TAB para sair (^Ve para editor)."
+
+#. #define FORM_LINK_TEXT_UNM_MSG
+#: LYMessages.c:83
+msgid "UNMODIFIABLE form text field. Use UP or DOWN arrows or tab to move off."
+msgstr "Caixa de texto não modificável. S setas para cima/baixo, ou TAB para sair."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE
+#: LYMessages.c:85
+#, fuzzy
+#| msgid "(Form field) Enter text. Use <return> to submit ('x' for no cache)."
+msgid "(Form field) Enter text. Use <return> to submit."
+msgstr "(Campo de formulário). Use <enter> para enviar('x' para não salvar no cache)."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE_X
+#: LYMessages.c:87
+#, fuzzy, c-format
+#| msgid "(Form field) Enter text. Use <return> to submit ('x' for no cache)."
+msgid "(Form field) Enter text. Use <return> to submit (%s for no cache)."
+msgstr "(Campo de formulário). Use <enter> para enviar('x' para não salvar no cache)."
+
+#. #define FORM_LINK_TEXT_RESUBMIT_MESSAGE
+#: LYMessages.c:89
+msgid "(Form field) Enter text. Use <return> to submit, arrows or tab to move off."
+msgstr "(Campo de formulário). Use <enter> para enviar, setas ou TAB para sair."
+
+#. #define FORM_LINK_TEXT_SUBMIT_UNM_MSG
+#: LYMessages.c:91
+msgid "UNMODIFIABLE form field. Use UP or DOWN arrows or tab to move off."
+msgstr "Campo de texto não modificável. Use setas para cima/baixo ou TAB para sair."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MAILTO_MSG
+#: LYMessages.c:93
+msgid "(mailto form field) Enter text. Use <return> to submit, arrows to move off."
+msgstr "(Campo de e-mail) Digite o texto. Use <enter> para enviar, setas para sair."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MAILTO_DIS_MSG
+#: LYMessages.c:95
+msgid "(mailto form field) Mail is disallowed so you cannot submit."
+msgstr "(Campo de e-mail) E-mail está desabilitado, portanto você não pode enviar."
+
+#. #define FORM_LINK_PASSWORD_MESSAGE
+#: LYMessages.c:97
+msgid "(Password entry field) Enter text. Use UP or DOWN arrows or tab to move off."
+msgstr "(Campo de entrada de senha). Use setas para cima/baixo ou TAB para sair."
+
+#. #define FORM_LINK_PASSWORD_UNM_MSG
+#: LYMessages.c:99
+msgid "UNMODIFIABLE form password. Use UP or DOWN arrows or tab to move off."
+msgstr "Campo de senha não modificável. Use setas para cima/baixo ou TAB para sair."
+
+#. #define FORM_LINK_CHECKBOX_MESSAGE
+#: LYMessages.c:101
+msgid "(Checkbox Field) Use right-arrow or <return> to toggle."
+msgstr "(Caixa de checagem) Use seta para a direita ou <enter> para marcar."
+
+#. #define FORM_LINK_CHECKBOX_UNM_MSG
+#: LYMessages.c:103
+msgid "UNMODIFIABLE form checkbox. Use UP or DOWN arrows or tab to move off."
+msgstr "Caixa de checagem não modificável. Setas para cima/baixo ou TAB para sair."
+
+#. #define FORM_LINK_RADIO_MESSAGE
+#: LYMessages.c:105
+msgid "(Radio Button) Use right-arrow or <return> to toggle."
+msgstr "(Botão de rádio) Use seta para a direita ou <enter> para marcar."
+
+#. #define FORM_LINK_RADIO_UNM_MSG
+#: LYMessages.c:107
+msgid "UNMODIFIABLE form radio button. Use UP or DOWN arrows or tab to move off."
+msgstr "Botão de rádio não modificável.Setas para cima/baixo ou TAB para sair."
+
+#. #define FORM_LINK_SUBMIT_PREFIX
+#: LYMessages.c:109
+msgid "Submit ('x' for no cache) to "
+msgstr "Enviar ('x' para não salvar) para"
+
+#. #define FORM_LINK_RESUBMIT_PREFIX
+#: LYMessages.c:111
+msgid "Submit to "
+msgstr "Enviar para"
+
+#. #define FORM_LINK_SUBMIT_MESSAGE
+#: LYMessages.c:113
+msgid "(Form submit button) Use right-arrow or <return> to submit ('x' for no cache)."
+msgstr "Botão de envio.Seta para a direita ou <enter> para enviar('x' para não salvar)"
+
+#. #define FORM_LINK_RESUBMIT_MESSAGE
+#: LYMessages.c:115
+msgid "(Form submit button) Use right-arrow or <return> to submit."
+msgstr "(Botão de envio) Use seta para a direita ou <enter> para enviar."
+
+#. #define FORM_LINK_SUBMIT_DIS_MSG
+#: LYMessages.c:117
+msgid "DISABLED form submit button. Use UP or DOWN arrows or tab to move off."
+msgstr "Botão de rádio desabilitado. Seta para cima ou para baixo ou TAB para sair."
+
+#. #define FORM_LINK_SUBMIT_MAILTO_PREFIX
+#: LYMessages.c:119
+msgid "Submit mailto form to "
+msgstr "Enviar formulário de e-mail para "
+
+#. #define FORM_LINK_SUBMIT_MAILTO_MSG
+#: LYMessages.c:121
+msgid "(mailto form submit button) Use right-arrow or <return> to submit."
+msgstr "(Botão de envio de email) Use seta para a direita ou <enter> para enviar."
+
+#. #define FORM_LINK_SUBMIT_MAILTO_DIS_MSG
+#: LYMessages.c:123
+msgid "(mailto form submit button) Mail is disallowed so you cannot submit."
+msgstr "(Botão de envio de email) E-mail desabilitado. Você não pode enviar emails agora."
+
+#. #define FORM_LINK_RESET_MESSAGE
+#: LYMessages.c:125
+msgid "(Form reset button) Use right-arrow or <return> to reset form to defaults."
+msgstr "(Botão de limpar).Seta para a direita ou<enter> para voltar aos valores padrão"
+
+#. #define FORM_LINK_RESET_DIS_MSG
+#: LYMessages.c:127
+msgid "DISABLED form reset button. Use UP or DOWN arrows or tab to move off."
+msgstr "Botão de limpar desabilitado. Seta para cima ou para baixo ou TAB para sair."
+
+#. #define FORM_LINK_BUTTON_MESSAGE
+#: LYMessages.c:129
+#, fuzzy
+#| msgid "DISABLED form submit button. Use UP or DOWN arrows or tab to move off."
+msgid "(Script button) Use UP or DOWN arrows or tab to move off."
+msgstr "Botão de rádio desabilitado. Seta para cima ou para baixo ou TAB para sair."
+
+#. #define FORM_LINK_BUTTON_DIS_MSG
+#: LYMessages.c:131
+#, fuzzy
+#| msgid "DISABLED form submit button. Use UP or DOWN arrows or tab to move off."
+msgid "DISABLED Script button. Use UP or DOWN arrows or tab to move off."
+msgstr "Botão de rádio desabilitado. Seta para cima ou para baixo ou TAB para sair."
+
+#. #define FORM_LINK_OPTION_LIST_MESSAGE
+#: LYMessages.c:133
+msgid "(Option list) Hit return and use arrow keys and return to select option."
+msgstr "(Lista de opções)Tecle enter, use as setas e enter novamente para selecionar."
+
+#. #define CHOICE_LIST_MESSAGE
+#: LYMessages.c:135
+msgid "(Choice list) Hit return and use arrow keys and return to select option."
+msgstr "(Lista de opções) Tecle enter, use as setas e enter novamente para selecionar."
+
+#. #define FORM_LINK_OPTION_LIST_UNM_MSG
+#: LYMessages.c:137
+msgid "UNMODIFIABLE option list. Use return or arrow keys to review or leave."
+msgstr "Lista de opções não modificável. Use enter ou setas para rever ou sair."
+
+#. #define CHOICE_LIST_UNM_MSG
+#: LYMessages.c:139
+msgid "UNMODIFIABLE choice list. Use return or arrow keys to review or leave."
+msgstr "Lista de opções não modificável. Use enter ou setas para rever ou sair."
+
+#: LYMessages.c:140
+msgid "Submitting form..."
+msgstr "Enviando formulário..."
+
+#: LYMessages.c:141
+msgid "Resetting form..."
+msgstr "Limpando formulário..."
+
+#. #define RELOADING_FORM
+#: LYMessages.c:143
+msgid "Reloading document. Any form entries will be lost!"
+msgstr "Recarregando formulário. Qualquer entrada será perdida!"
+
+#. #define LINK_NOT_IN_FORM
+#: LYMessages.c:145
+msgid "The current link is not in a FORM"
+msgstr ""
+
+#: LYMessages.c:146
+#, c-format
+msgid "Warning: Cannot transcode form data to charset %s!"
+msgstr "Atencão: Impossível transformar dados do formulario em %s!"
+
+#. #define NORMAL_LINK_MESSAGE
+#: LYMessages.c:149
+msgid "(NORMAL LINK) Use right-arrow or <return> to activate."
+msgstr "(Link Normal) Use seta para a direita ou <enter> para ativar."
+
+#: LYMessages.c:150
+msgid "The resource requested is not available at this time."
+msgstr "O recurso solicitado não está disponível neste momento."
+
+#: LYMessages.c:151
+msgid "Enter Lynx keystroke command: "
+msgstr "Entre o comando para o Lynx:"
+
+#: LYMessages.c:152
+msgid "Looking up "
+msgstr "Procurando "
+
+#: LYMessages.c:153
+#, c-format
+msgid "Getting %s"
+msgstr "Recebendo %s"
+
+#: LYMessages.c:154
+#, c-format
+msgid "Skipping %s"
+msgstr "Omitindo %s"
+
+#: LYMessages.c:155
+#, c-format
+msgid "Using %s"
+msgstr "Usando %s"
+
+#: LYMessages.c:156
+#, c-format
+msgid "Illegal URL: %s"
+msgstr "Link Ilegal: %s"
+
+#: LYMessages.c:157
+#, c-format
+msgid "Badly formed address %s"
+msgstr "Endereço %s mal formado"
+
+#: LYMessages.c:158
+#, c-format
+msgid "URL: %s"
+msgstr "URL: %s"
+
+#: LYMessages.c:159
+msgid "Unable to access WWW file!!!"
+msgstr "Impossível acessar o arquivo WWW!!!"
+
+#: LYMessages.c:160
+#, c-format
+msgid "This is a searchable index. Use %s to search."
+msgstr "Este é um índice de busca, use %s para procurar."
+
+#. #define WWW_INDEX_MORE_MESSAGE
+#: LYMessages.c:162
+#, c-format
+msgid "--More-- This is a searchable index. Use %s to search."
+msgstr "--Mais-- Este é um índice de busca. Use %s para procurar."
+
+#: LYMessages.c:163
+msgid "You have entered an invalid link number."
+msgstr "Você entrou um número inválido de link."
+
+#. #define SOURCE_HELP
+#: LYMessages.c:165
+msgid "Currently viewing document source. Press '\\' to return to rendered version."
+msgstr "Vendo a fonte do documento.Pressione '\\' para voltar ao documento."
+
+#. #define NOVICE_LINE_ONE
+#: LYMessages.c:167
+msgid " Arrow keys: Up and Down to move. Right to follow a link; Left to go back. \n"
+msgstr "Setas para cima/baixo move.A direita segue um link; A esquerda para voltar.\n"
+
+#. #define NOVICE_LINE_TWO
+#: LYMessages.c:169
+msgid " H)elp O)ptions P)rint G)o M)ain screen Q)uit /=search [delete]=history list \n"
+msgstr "H)Ajuda O)Opções P)Imprimir G)Segue M)Principal Q)Sair /=procura [delete]=Histórico \n"
+
+#. #define NOVICE_LINE_TWO_A
+#: LYMessages.c:171
+msgid " O)ther cmds H)elp K)eymap G)oto P)rint M)ain screen o)ptions Q)uit \n"
+msgstr "O)Comandos H)Ajuda K)Teclas G)Segue P)Imprimir M)Principal o)opções Q)Sair\n"
+
+#. #define NOVICE_LINE_TWO_B
+#: LYMessages.c:173
+msgid " O)ther cmds B)ack E)dit D)ownload ^R)eload ^W)ipe screen search doc: / \n"
+msgstr "O)Outros comandos B)Volta E)Edita D)Copia ^R)Recarrega ^W)Tela procura doc:\n"
+
+#. #define NOVICE_LINE_TWO_C
+#: LYMessages.c:175
+#, fuzzy
+#| msgid " O)ther cmds C)omment History: <delete> Bookmarks: V)iew, A)dd, R)emove \n"
+msgid "O)ther cmds C)omment History: <backspace> Bookmarks: V)iew, A)dd, R)emove \n"
+msgstr "O)Comandos|C)Comentário|<delete>Marcações|V)Visualizar|A) Adicionar|R)Remover\n"
+
+#. #define FORM_NOVICELINE_ONE
+#: LYMessages.c:177
+msgid " Enter text into the field by typing on the keyboard "
+msgstr " Entre com o texto no campo digitando no teclado"
+
+#. #define FORM_NOVICELINE_TWO
+#: LYMessages.c:179
+msgid " Ctrl-U to delete all text in field, [Backspace] to delete a character "
+msgstr "Ctrl-U apaga todo o texto do campo. [Backspace] apaga um caractere"
+
+#. #define FORM_NOVICELINE_TWO_DELBL
+#: LYMessages.c:181
+#, fuzzy
+#| msgid " Ctrl-U to delete all text in field, [Backspace] to delete a character "
+msgid " Ctrl-U to delete text in field, [Backspace] to delete a character "
+msgstr "Ctrl-U apaga todo o texto do campo. [Backspace] apaga um caractere"
+
+#. #define FORM_NOVICELINE_TWO_VAR
+#: LYMessages.c:183
+#, fuzzy, c-format
+#| msgid " Ctrl-U to delete all text in field, [Backspace] to delete a character "
+msgid " %s to delete all text in field, [Backspace] to delete a character "
+msgstr "Ctrl-U apaga todo o texto do campo. [Backspace] apaga um caractere"
+
+#. #define FORM_NOVICELINE_TWO_DELBL_VAR
+#: LYMessages.c:185
+#, fuzzy, c-format
+#| msgid " Ctrl-U to delete all text in field, [Backspace] to delete a character "
+msgid " %s to delete text in field, [Backspace] to delete a character "
+msgstr "Ctrl-U apaga todo o texto do campo. [Backspace] apaga um caractere"
+
+#. mailto
+#: LYMessages.c:188
+msgid "Malformed mailto form submission! Cancelled!"
+msgstr "Formulário de envio de email mal-formado! Cancelado!"
+
+#: LYMessages.c:189
+msgid "Warning! Control codes in mail address replaced by ?"
+msgstr "Atenção! Codificação de endereço de email alterado por ?"
+
+#: LYMessages.c:190
+msgid "Mail disallowed! Cannot submit."
+msgstr "E-mail desabilitado!! Impossível enviar."
+
+#: LYMessages.c:191
+msgid "Mailto form submission failed!"
+msgstr "Envio de formulário de email falhou!"
+
+#: LYMessages.c:192
+msgid "Mailto form submission Cancelled!!!"
+msgstr "Envio de formulário de e-mail cancelado!!"
+
+#: LYMessages.c:193
+msgid "Sending form content..."
+msgstr "Enviando dados do formulário..."
+
+#: LYMessages.c:194
+msgid "No email address is present in mailto URL!"
+msgstr "Endereço de e-mail não está presente no campo de E-mail!"
+
+#. #define MAILTO_URL_TEMPOPEN_FAILED
+#: LYMessages.c:196
+msgid "Unable to open temporary file for mailto URL!"
+msgstr "Impossível abrir arquivo temporário para o campo de e-mail!"
+
+#. #define INC_ORIG_MSG_PROMPT
+#: LYMessages.c:198
+msgid "Do you wish to include the original message?"
+msgstr "Você quer imcluir a mensagem original?"
+
+#. #define INC_PREPARSED_MSG_PROMPT
+#: LYMessages.c:200
+msgid "Do you wish to include the preparsed source?"
+msgstr "Você quer incluir o arquivo fonte?"
+
+#. #define SPAWNING_EDITOR_FOR_MAIL
+#: LYMessages.c:202
+msgid "Spawning your selected editor to edit mail message"
+msgstr "Chamando o editor selecionado para editar o email."
+
+#. #define ERROR_SPAWNING_EDITOR
+#: LYMessages.c:204
+msgid "Error spawning editor, check your editor definition in the options menu"
+msgstr "Erro chamando o editor, cheque as configurações de seu editor em opções"
+
+#: LYMessages.c:205
+msgid "Send this comment?"
+msgstr "Envia este comentário?"
+
+#: LYMessages.c:206
+msgid "Send this message?"
+msgstr "Envia esta mensagem?"
+
+#: LYMessages.c:207
+msgid "Sending your message..."
+msgstr "Enviando sua mensagem..."
+
+#: LYMessages.c:208
+msgid "Sending your comment:"
+msgstr "Enviando seu comentário..."
+
+#. textarea
+#: LYMessages.c:211
+msgid "Not in a TEXTAREA; cannot use external editor."
+msgstr "Fora da área de texto: impossível usar um editor externo."
+
+#: LYMessages.c:212
+#, fuzzy
+#| msgid "Not in a TEXTAREA; cannot use external editor."
+msgid "Not in a TEXTAREA; cannot use command."
+msgstr "Fora da área de texto: impossível usar um editor externo."
+
+#: LYMessages.c:214
+msgid "file: ACTIONs are disallowed!"
+msgstr "arquivo: ACTION está desabilitado!"
+
+#. #define FILE_SERVED_LINKS_DISALLOWED
+#: LYMessages.c:216
+msgid "file: URLs via served links are disallowed!"
+msgstr "arquivo: URLs através de links estão desabilitadas!"
+
+#: LYMessages.c:217
+#, fuzzy
+#| msgid "Access to dot files is disabled!"
+msgid "Access to local files denied."
+msgstr "Acesso aos arquivos ocultos está desabilitado!"
+
+#: LYMessages.c:218
+msgid "file: URLs via bookmarks are disallowed!"
+msgstr "arquivo: URLs através de 'favoritos' estão desabilitadas!"
+
+#. #define SPECIAL_VIA_EXTERNAL_DISALLOWED
+#: LYMessages.c:220
+msgid "This special URL is not allowed in external documents!"
+msgstr "Esta URL em particular não permite entrada em documentos externos!"
+
+#: LYMessages.c:221
+msgid "Press <return> to return to Lynx."
+msgstr "Pressione <enter> para voltar ao Lynx."
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:224
+msgid "Spawning DCL subprocess. Use 'logout' to return to Lynx.\n"
+msgstr "Chamando subprocessos DCL. Use 'logout' para voltar ao Lynx.\n"
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:228
+msgid "Type EXIT to return to Lynx.\n"
+msgstr "Digite EXIT para voltar ao Lynx.\n"
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:231
+msgid "Spawning your default shell. Use 'exit' to return to Lynx.\n"
+msgstr "Chamando seu shell padrão. Use 'exit' para voltar ao Lynx.\n"
+
+#: LYMessages.c:234
+msgid "Spawning is currently disabled."
+msgstr "Chamadas estão atualmente desabilitadas."
+
+#: LYMessages.c:235
+msgid "The 'd'ownload command is currently disabled."
+msgstr "O comando de 'd'ownload está atualmente desabilitado."
+
+#: LYMessages.c:236
+msgid "You cannot download an input field."
+msgstr "Você não pode copiar um campo de entrada."
+
+#: LYMessages.c:237
+msgid "Form has a mailto action! Cannot download."
+msgstr "O formulário tem uma ação de envio de email. Impossível copiar."
+
+#: LYMessages.c:238
+msgid "You cannot download a mailto: link."
+msgstr "Você não pode copiar uma ligação de e-mail."
+
+#: LYMessages.c:239
+msgid "You cannot download cookies."
+msgstr "Você não pode copiar cookies."
+
+#: LYMessages.c:240
+msgid "You cannot download a printing option."
+msgstr "Você não pode copiar uma opção de impressão."
+
+#: LYMessages.c:241
+msgid "You cannot download an upload option."
+msgstr "Você não pode copiar uma opção de envio de arquivos."
+
+#: LYMessages.c:242
+msgid "You cannot download an permit option."
+msgstr "Você não pode copiar uma opção de permissão."
+
+#: LYMessages.c:243
+msgid "This special URL cannot be downloaded!"
+msgstr "Esta URL em particular não pode ser copiada."
+
+#: LYMessages.c:244
+msgid "Nothing to download."
+msgstr "Nada a fazer."
+
+#: LYMessages.c:245
+msgid "Trace ON!"
+msgstr "Traçador de rotas ligado!"
+
+#: LYMessages.c:246
+msgid "Trace OFF!"
+msgstr "Traçador de rotas desligado!"
+
+#. #define CLICKABLE_IMAGES_ON
+#: LYMessages.c:248
+msgid "Links will be included for all images! Reloading..."
+msgstr "Os links serão incluídos em todas as imagens! Recarregando..."
+
+#. #define CLICKABLE_IMAGES_OFF
+#: LYMessages.c:250
+msgid "Standard image handling restored! Reloading..."
+msgstr "Imagem padrão de ponteiro restaurada! Recarregando..."
+
+#. #define PSEUDO_INLINE_ALTS_ON
+#: LYMessages.c:252
+msgid "Pseudo_ALTs will be inserted for inlines without ALT strings! Reloading..."
+msgstr "Pseudo nomes serão incluídos sem os nomes alternativos. Recarregando..."
+
+#. #define PSEUDO_INLINE_ALTS_OFF
+#: LYMessages.c:254
+msgid "Inlines without an ALT string specified will be ignored! Reloading..."
+msgstr "Campos sem um nome alternativo serão ignorados! Recarregando..."
+
+#: LYMessages.c:255
+msgid "Raw 8-bit or CJK mode toggled OFF! Reloading..."
+msgstr "Modo Raw 8-bit ou CJK estão desativados. Atualizando..."
+
+#: LYMessages.c:256
+msgid "Raw 8-bit or CJK mode toggled ON! Reloading..."
+msgstr "Modo Raw 8-bit ou CJK estão ativados. Atualizando..."
+
+#. #define HEAD_D_L_OR_CANCEL
+#: LYMessages.c:258
+msgid "Send HEAD request for D)ocument or L)ink, or C)ancel? (d,l,c): "
+msgstr "Envia pedido de HEAD para D) Documento ou L) Link ou C) Cancela (d,l,c):"
+
+#. #define HEAD_D_OR_CANCEL
+#: LYMessages.c:260
+msgid "Send HEAD request for D)ocument, or C)ancel? (d,c): "
+msgstr "Envia pedido de HEAD para D) Documento ou C) Cancela (d,c):"
+
+#: LYMessages.c:261
+msgid "Sorry, the document is not an http URL."
+msgstr "Desculpe, o documento não é no formato de endereço http."
+
+#: LYMessages.c:262
+msgid "Sorry, the link is not an http URL."
+msgstr "Desculpe, esta ligação não é um endereço http."
+
+#: LYMessages.c:263
+msgid "Sorry, the ACTION for this form is disabled."
+msgstr "Desculpe, a ACTION para este formulário está desabilitada."
+
+#. #define FORM_ACTION_NOT_HTTP_URL
+#: LYMessages.c:265
+msgid "Sorry, the ACTION for this form is not an http URL."
+msgstr "Desculpe, a ACTION para este formulário não é um endereço http."
+
+#: LYMessages.c:266
+msgid "Not an http URL or form ACTION!"
+msgstr "Não há um endereço http ou ação de formulário!"
+
+#: LYMessages.c:267
+msgid "This special URL cannot be a form ACTION!"
+msgstr "Esta URL não tem uma ação de formulário!"
+
+#: LYMessages.c:268
+msgid "URL is not in starting realm!"
+msgstr "Esta URL não tem um domínio inicial!"
+
+#: LYMessages.c:269
+msgid "News posting is disabled!"
+msgstr "Postagem de NEWS está desabilitada!"
+
+#: LYMessages.c:270
+msgid "File management support is disabled!"
+msgstr "Suporte a gerenciamento de arquivos está desabilitado!"
+
+#: LYMessages.c:271
+msgid "No jump file is currently available."
+msgstr "Nenhum arquivo de pulo está disponível."
+
+#: LYMessages.c:272
+msgid "Jump to (use '?' for list): "
+msgstr "Siga para (use '?' para ajuda):"
+
+#: LYMessages.c:273
+msgid "Jumping to a shortcut URL is disallowed!"
+msgstr "Atalho URL de pulo está desabilitado!"
+
+#: LYMessages.c:274
+msgid "Random URL is disallowed! Use a shortcut."
+msgstr "URL randômica está sesabilitada! Use um atalho."
+
+#: LYMessages.c:275
+msgid "No random URLs have been used thus far."
+msgstr "Nenhuma URL randômica foi usada ultimamente."
+
+#: LYMessages.c:276
+msgid "Bookmark features are currently disabled."
+msgstr "Insersão de URL no Livro de Marcações está desabilitada neste momento."
+
+#: LYMessages.c:277
+msgid "Execution via bookmarks is disabled."
+msgstr "Execução via Livro de Marcações está desabilitada."
+
+#. #define BOOKMARK_FILE_NOT_DEFINED
+#: LYMessages.c:279
+#, c-format
+msgid "Bookmark file is not defined. Use %s to see options."
+msgstr "Livro de Marcações não está definido. Use %s para ver as opções."
+
+#. #define NO_TEMP_FOR_HOTLIST
+#: LYMessages.c:281
+msgid "Unable to open tempfile for X Mosaic hotlist conversion."
+msgstr "Impossível abrir arquivo temporário para conversão X Mosaic"
+
+#: LYMessages.c:282
+msgid "ERROR - unable to open bookmark file."
+msgstr "ERRO - Impossível abrir arquivo de Livro de Marcações."
+
+#. #define BOOKMARK_OPEN_FAILED_FOR_DEL
+#: LYMessages.c:284
+msgid "Unable to open bookmark file for deletion of link."
+msgstr "Impossível arir arquivo do Livro de Marcações para apagar a ligação."
+
+#. #define BOOKSCRA_OPEN_FAILED_FOR_DEL
+#: LYMessages.c:286
+msgid "Unable to open scratch file for deletion of link."
+msgstr "Impossível abrir arquivo de marcação para apagar a ligação."
+
+#: LYMessages.c:288
+msgid "Error renaming scratch file."
+msgstr "Erro renomeando arquivo de marcação."
+
+#: LYMessages.c:290
+msgid "Error renaming temporary file."
+msgstr "Erro renomeando arquivo temporário."
+
+#. #define BOOKTEMP_COPY_FAIL
+#: LYMessages.c:292
+msgid "Unable to copy temporary file for deletion of link."
+msgstr "Impossível copiar arquivo temporário para apagar a ligação."
+
+#. #define BOOKTEMP_REOPEN_FAIL_FOR_DEL
+#: LYMessages.c:294
+msgid "Unable to reopen temporary file for deletion of link."
+msgstr "Impossível reabrir arquivo temporário para deleção de ligação."
+
+#. #define BOOKMARK_LINK_NOT_ONE_LINE
+#: LYMessages.c:297
+msgid "Link is not by itself all on one line in bookmark file."
+msgstr "Ligação não é a única na linha do arquivo do Livro de Marcações."
+
+#: LYMessages.c:298
+msgid "Bookmark deletion failed."
+msgstr "Deleção do Livro de Marcações falhou!"
+
+#. #define BOOKMARKS_NOT_TRAVERSED
+#: LYMessages.c:300
+msgid "Bookmark files cannot be traversed (only http URLs)."
+msgstr "Endereços do Livro de Marcações não pode ser transversal (somente http URLs)."
+
+#. #define BOOKMARKS_NOT_OPEN
+#: LYMessages.c:302
+msgid "Unable to open bookmark file, use 'a' to save a link first"
+msgstr "Impossível abrir Livro de Marcações, use 'a' para salvar a ligação primeiro."
+
+#: LYMessages.c:303
+msgid "There are no links in this bookmark file!"
+msgstr "Não existem ligações neste Livro de Marcações."
+
+#. #define CACHE_D_OR_CANCEL
+#: LYMessages.c:305
+#, fuzzy
+#| msgid "Send HEAD request for D)ocument, or C)ancel? (d,c): "
+msgid "D)elete cached document or C)ancel? (d,c): "
+msgstr "Envia pedido de HEAD para D) Documento ou C) Cancela (d,c):"
+
+#. #define BOOK_D_L_OR_CANCEL
+#: LYMessages.c:307
+msgid "Save D)ocument or L)ink to bookmark file or C)ancel? (d,l,c): "
+msgstr "D)Salvar documento ou L)Marque no Livro de Marcações ou C)Cancela? (d,l,c):"
+
+#: LYMessages.c:308
+msgid "Save D)ocument to bookmark file or C)ancel? (d,c): "
+msgstr "D) Salva documento no Livro de Marcações ou C) Cancela> (d,c): "
+
+#: LYMessages.c:309
+msgid "Save L)ink to bookmark file or C)ancel? (l,c): "
+msgstr "L) Salva ligação no Livro de Marcações ou C) Cancela? (l,c):"
+
+#. #define NOBOOK_POST_FORM
+#: LYMessages.c:311
+msgid "Documents from forms with POST content cannot be saved as bookmarks."
+msgstr "Formulários com função de postar não podem ser marcados no Livro de Marcações."
+
+#: LYMessages.c:312
+msgid "Cannot save form fields/links"
+msgstr "Impossível salvar campos de formulário/ligações"
+
+#. #define NOBOOK_HSML
+#: LYMessages.c:314
+msgid "History, showinfo, menu and list files cannot be saved as bookmarks."
+msgstr "Histórico, informações, menu e lista de arquivos não podem ser salvos no Livro de Marcações."
+
+#. #define CONFIRM_BOOKMARK_DELETE
+#: LYMessages.c:316
+msgid "Do you really want to delete this link from your bookmark file?"
+msgstr "Você realmente quer apagar esta ligação do seu Livro de Marcações?"
+
+#: LYMessages.c:317
+msgid "Malformed address."
+msgstr "Endereço mal formado."
+
+#. #define HISTORICAL_ON_MINIMAL_OFF
+#: LYMessages.c:319
+msgid "Historical comment parsing ON (Minimal is overridden)!"
+msgstr "Mensagens do histórico de tratamento estão ligadas (Ignorando mínimas)!"
+
+#. #define HISTORICAL_OFF_MINIMAL_ON
+#: LYMessages.c:321
+msgid "Historical comment parsing OFF (Minimal is in effect)!"
+msgstr "Mensagens do histórico de tratamento estão desligadas (Não ignorando nenhuma)!"
+
+#. #define HISTORICAL_ON_VALID_OFF
+#: LYMessages.c:323
+msgid "Historical comment parsing ON (Valid is overridden)!"
+msgstr "Mensagens do histórico de tratamento estão ligadas (Ignorando as válidas)!"
+
+#. #define HISTORICAL_OFF_VALID_ON
+#: LYMessages.c:325
+msgid "Historical comment parsing OFF (Valid is in effect)!"
+msgstr "Mensagens do histórico de tratamento estão desligadas (Incluindo as válidas)!"
+
+#. #define MINIMAL_ON_IN_EFFECT
+#: LYMessages.c:327
+msgid "Minimal comment parsing ON (and in effect)!"
+msgstr "Comentários mínimos de tratamento estão ativos e ligados!"
+
+#. #define MINIMAL_OFF_VALID_ON
+#: LYMessages.c:329
+msgid "Minimal comment parsing OFF (Valid is in effect)!"
+msgstr "Comentários mínimos de tratamento desligados. (Estão em efeitos os válidos)!"
+
+#. #define MINIMAL_ON_BUT_HISTORICAL
+#: LYMessages.c:331
+msgid "Minimal comment parsing ON (but Historical is in effect)!"
+msgstr "Comentários mínimos de tratamento ativos. (mas histórico está ativado)!"
+
+#. #define MINIMAL_OFF_HISTORICAL_ON
+#: LYMessages.c:333
+msgid "Minimal comment parsing OFF (Historical is in effect)!"
+msgstr "Comentários mínimos de tratamento desativados. (Histórico está ativado)!"
+
+#: LYMessages.c:334
+msgid "Soft double-quote parsing ON!"
+msgstr "Interpretação de aspas duplas ativada!"
+
+#: LYMessages.c:335
+msgid "Soft double-quote parsing OFF!"
+msgstr "Interpretação de aspas duplas desativada!"
+
+#: LYMessages.c:336
+msgid "Now using TagSoup parsing of HTML."
+msgstr "Agora usando formato TagSoup de tratamento de HTML. "
+
+#: LYMessages.c:337
+msgid "Now using SortaSGML parsing of HTML!"
+msgstr "Agora usando formato SortaSGML de tratamento de HTML!"
+
+#: LYMessages.c:338
+msgid "You are already at the end of this document."
+msgstr "Você ja está no fim do documento."
+
+#: LYMessages.c:339
+msgid "You are already at the beginning of this document."
+msgstr "Você ja está no início do documento."
+
+#: LYMessages.c:340
+#, c-format
+msgid "You are already at page %d of this document."
+msgstr "Você está na página %d deste documento."
+
+#: LYMessages.c:341
+#, c-format
+msgid "Link number %d already is current."
+msgstr "Ligação número %d já esta ativada."
+
+#: LYMessages.c:342
+msgid "You are already at the first document"
+msgstr "Você está no primeiro documento."
+
+#: LYMessages.c:343
+msgid "There are no links above this line of the document."
+msgstr "Não existem ligações acima desta linha do documento."
+
+#: LYMessages.c:344
+msgid "There are no links below this line of the document."
+msgstr "Não existem ligações abaixo desta linha do documento."
+
+#. #define MAXLEN_REACHED_DEL_OR_MOV
+#: LYMessages.c:346
+msgid "Maximum length reached! Delete text or move off field."
+msgstr "Tamanho máximo atingido! Apague uma parte do texto ou saia do campo."
+
+#. #define NOT_ON_SUBMIT_OR_LINK
+#: LYMessages.c:348
+msgid "You are not on a form submission button or normal link."
+msgstr "Você não está num botão de envio de formulário ou ligação normal."
+
+#. #define NEED_CHECKED_RADIO_BUTTON
+#: LYMessages.c:350
+msgid "One radio button must be checked at all times!"
+msgstr "Pelo menos um botão de rádio deve estar marcado sempre!"
+
+#: LYMessages.c:351
+msgid "No submit button for this form, submit single text field?"
+msgstr ""
+
+#: LYMessages.c:352
+msgid "Do you want to go back to the previous document?"
+msgstr "Você quer voltar ao documento inicial?"
+
+#: LYMessages.c:353
+msgid "Use arrows or tab to move off of field."
+msgstr "Use setas ou TAB para sair do campo."
+
+#. #define ENTER_TEXT_ARROWS_OR_TAB
+#: LYMessages.c:355
+msgid "Enter text. Use arrows or tab to move off of field."
+msgstr "Digite o texto. Use setas ou TAB para sair do campo."
+
+#: LYMessages.c:356
+msgid "** Bad HTML!! No form action defined. **"
+msgstr "** Tag HTML desconhecida!! Sem ação de formulário definida. **"
+
+#: LYMessages.c:357
+msgid "Bad HTML!! Unable to create popup window!"
+msgstr "** Tag HTML desconhecida ** Impossível criar janela de pop-up!"
+
+#: LYMessages.c:358
+msgid "Unable to create popup window!"
+msgstr "Impossível criar janela pop-up!"
+
+#: LYMessages.c:359
+msgid "Goto a random URL is disallowed!"
+msgstr "Ir para URL randômica está desabilitado!"
+
+#: LYMessages.c:360
+msgid "Goto a non-http URL is disallowed!"
+msgstr "Ir para não-http URL está desabilitado!"
+
+#: LYMessages.c:361
+#, fuzzy, c-format
+#| msgid "You are not allowed to goto \"cso:\" URLs"
+msgid "You are not allowed to goto \"%s\" URLs"
+msgstr "Você não pode ir para \"cso:\" URLs"
+
+#: LYMessages.c:362
+msgid "URL to open: "
+msgstr "URL para ir:"
+
+#: LYMessages.c:363
+msgid "Edit the current Goto URL: "
+msgstr "Edite a URL que será apresentada:"
+
+#: LYMessages.c:364
+msgid "Edit the previous Goto URL: "
+msgstr "Edite a URL que foi escolhida anteriormente:"
+
+#: LYMessages.c:365
+msgid "Edit a previous Goto URL: "
+msgstr "Edite a URL que foi apresentada anteriormente:"
+
+#: LYMessages.c:366
+msgid "Current document has POST data."
+msgstr "O documento corrente tem uma ação de postagem"
+
+#: LYMessages.c:367
+msgid "Edit this document's URL: "
+msgstr "Edite este documento de URL:"
+
+#: LYMessages.c:368
+msgid "Edit the current link's URL: "
+msgstr "Edite o link corrente:"
+
+#: LYMessages.c:369
+#, fuzzy
+#| msgid "Edit this document's URL: "
+msgid "Edit the form's submit-URL: "
+msgstr "Edite este documento de URL:"
+
+#: LYMessages.c:370
+msgid "You cannot edit File Management URLs"
+msgstr "Você não pode editar Gerenciadores de arquivos de URLs"
+
+#: LYMessages.c:371
+msgid "Enter a database query: "
+msgstr "Digite uma pesquisa de banco de dados:"
+
+#: LYMessages.c:372
+msgid "Enter a whereis query: "
+msgstr "Digite uma pesquisa de 'onde está':"
+
+#: LYMessages.c:373
+msgid "Edit the current query: "
+msgstr "Edite a pesquisa atual:"
+
+#: LYMessages.c:374
+msgid "Edit the previous query: "
+msgstr "Edite a pesquisa anterior:"
+
+#: LYMessages.c:375
+msgid "Edit a previous query: "
+msgstr "Edite uma pesquisa anterior:"
+
+#. #define USE_C_R_TO_RESUB_CUR_QUERY
+#: LYMessages.c:377
+msgid "Use Control-R to resubmit the current query."
+msgstr "Use Control-R para reenviar a pesquisa atual."
+
+#: LYMessages.c:378
+msgid "Edit the current shortcut: "
+msgstr "Edite o atalho atual:"
+
+#: LYMessages.c:379
+msgid "Edit the previous shortcut: "
+msgstr "Edite o atalho anterior:"
+
+#: LYMessages.c:380
+msgid "Edit a previous shortcut: "
+msgstr "Edite um atalho anterior:"
+
+#: LYMessages.c:381
+#, c-format
+msgid "Key '%c' is not mapped to a jump file!"
+msgstr "Tecla '%c' não está mapeada para abrir um arquivo!"
+
+#: LYMessages.c:382
+msgid "Cannot locate jump file!"
+msgstr "Não foi possível localizar um arquivo de salto!"
+
+#: LYMessages.c:383
+msgid "Cannot open jump file!"
+msgstr "Não foi possivel abrir um arquivo de salto!"
+
+#: LYMessages.c:384
+msgid "Error reading jump file!"
+msgstr "Erro lendo arquivo de salto!"
+
+#: LYMessages.c:385
+msgid "Out of memory reading jump file!"
+msgstr "Estouro de memória, lendo arquivo de salto!"
+
+#: LYMessages.c:386
+msgid "Out of memory reading jump table!"
+msgstr "Estouro de memória, lento tabela de atalhos!"
+
+#: LYMessages.c:387
+msgid "No index is currently available."
+msgstr "Sem arquivo indexador disponível."
+
+#. #define CONFIRM_MAIN_SCREEN
+#: LYMessages.c:389
+msgid "Do you really want to go to the Main screen?"
+msgstr "Você quer realmente ir para o menu principal?"
+
+#: LYMessages.c:390
+msgid "You are already at main screen!"
+msgstr "Você ja esta na tela inicial!"
+
+#. #define NOT_ISINDEX
+#: LYMessages.c:392
+msgid "Not a searchable indexed document -- press '/' to search for a text string"
+msgstr "Área não passivel de busca - pressione '/' para procurar no documento."
+
+#. #define NO_OWNER
+#: LYMessages.c:394
+msgid "No owner is defined for this file so you cannot send a comment"
+msgstr "Nenhum dono definido para este arquivo, você não pode enviar um comentário"
+
+#: LYMessages.c:395
+#, c-format
+msgid "No owner is defined. Use %s?"
+msgstr "Nehum dono está definido. Uso %s?"
+
+#: LYMessages.c:396
+msgid "Do you wish to send a comment?"
+msgstr "Você quer que envio um comentário?"
+
+#: LYMessages.c:397
+msgid "Mail is disallowed so you cannot send a comment"
+msgstr "Email está desabilitado, portanto você não pode enviar um comentário"
+
+#: LYMessages.c:398
+msgid "The 'e'dit command is currently disabled."
+msgstr "Comando 'e' Edite está atualmente desabilitado."
+
+#: LYMessages.c:399
+#, fuzzy
+#| msgid "External support is currently disabled."
+msgid "External editing is currently disabled."
+msgstr "Suporte externo está desabilitado."
+
+#: LYMessages.c:400
+msgid "System error - failure to get status."
+msgstr "Erro de sistema - Falha ao receber estado."
+
+#: LYMessages.c:401
+msgid "No editor is defined!"
+msgstr "Nenhum editor foi definido"
+
+#: LYMessages.c:402
+msgid "The 'p'rint command is currently disabled."
+msgstr "Comando 'p' Imprimir está atualmente desabilitado."
+
+#: LYMessages.c:403
+msgid "Document has no Toolbar links or Banner."
+msgstr "O documento não tem uma barra de links ou Faixa."
+
+#: LYMessages.c:404
+msgid "Unable to open traversal file."
+msgstr "Impossível abrir um arquivo transversal."
+
+#: LYMessages.c:405
+msgid "Unable to open traversal found file."
+msgstr "Impossível abrir o arquivo transversal encontrado."
+
+#: LYMessages.c:406
+msgid "Unable to open reject file."
+msgstr "Impossível de abrir um arquivo rejeitado."
+
+#: LYMessages.c:407
+msgid "Unable to open traversal errors output file"
+msgstr "Impossível de abrir o log de erros transversal"
+
+#: LYMessages.c:408
+msgid "TRAVERSAL WAS INTERRUPTED"
+msgstr "TRANSMISSÃO TRANSVERSAL FOI INTERROMPIDA."
+
+#: LYMessages.c:409
+msgid "Follow link (or goto link or page) number: "
+msgstr "Segue ligação (ou vai para a pagina de ligações) número:"
+
+#: LYMessages.c:410
+msgid "Select option (or page) number: "
+msgstr "Seleciona a opção (ou página) número:"
+
+#: LYMessages.c:411
+#, c-format
+msgid "Option number %d already is current."
+msgstr "Opção número %d ja está ativa."
+
+#. #define ALREADY_AT_OPTION_END
+#: LYMessages.c:413
+msgid "You are already at the end of this option list."
+msgstr "Você ja está no fim desta opçao."
+
+#. #define ALREADY_AT_OPTION_BEGIN
+#: LYMessages.c:415
+msgid "You are already at the beginning of this option list."
+msgstr "Você ja esta no começo desta lista de opções."
+
+#. #define ALREADY_AT_OPTION_PAGE
+#: LYMessages.c:417
+#, c-format
+msgid "You are already at page %d of this option list."
+msgstr "Você ja está na página %d desta lista de opções."
+
+#: LYMessages.c:418
+msgid "You have entered an invalid option number."
+msgstr "Você entrou com um número inválido de opção."
+
+#: LYMessages.c:419
+msgid "** Bad HTML!! Use -trace to diagnose. **"
+msgstr "** Tag errada no HTML!! Use -trace para diagnosticar. **"
+
+#: LYMessages.c:420
+msgid "Give name of file to save in"
+msgstr "Informe o nome do arquivo a salvar"
+
+#: LYMessages.c:421
+msgid "Can't save data to file -- please run WWW locally"
+msgstr "Impossível salvar dados no arquivo -- por favor, rode WWW localmente. "
+
+#: LYMessages.c:422
+msgid "Can't open temporary file!"
+msgstr "Impossível abrir arquivo temporário!"
+
+#: LYMessages.c:423
+msgid "Can't open output file! Cancelling!"
+msgstr "Impossível abrir arquivo de saída! Cancelando!"
+
+#: LYMessages.c:424
+msgid "Execution is disabled."
+msgstr "Executar está desabilitado!"
+
+#. #define EXECUTION_DISABLED_FOR_FILE
+#: LYMessages.c:426
+#, c-format
+msgid "Execution is not enabled for this file. See the Options menu (use %s)."
+msgstr "Executar não disponível para este arquivo.Veja o menu de Optins (use %s)."
+
+#. #define EXECUTION_NOT_COMPILED
+#: LYMessages.c:428
+msgid "Execution capabilities are not compiled into this version."
+msgstr "Capacidade de execução não está compilada nesta versão."
+
+#: LYMessages.c:429
+msgid "This file cannot be displayed on this terminal."
+msgstr "Este arquivo não pode ser mostrado neste terminal."
+
+#. #define CANNOT_DISPLAY_FILE_D_OR_C
+#: LYMessages.c:431
+msgid "This file cannot be displayed on this terminal: D)ownload, or C)ancel"
+msgstr "Este arquivo não pode ser mostrado neste terminal: D) Copia ou C) Cancela"
+
+#: LYMessages.c:432
+#, c-format
+msgid "%s D)ownload, or C)ancel"
+msgstr "%s D) Copia ou C) Cancela"
+
+#: LYMessages.c:433
+msgid "Cancelling file."
+msgstr "Cancelando arquivo."
+
+#: LYMessages.c:434
+msgid "Retrieving file. - PLEASE WAIT -"
+msgstr "Recebendo arquivo, AGUARDE!"
+
+#: LYMessages.c:435
+msgid "Enter a filename: "
+msgstr "Entre com um nome para o arquivo:"
+
+#: LYMessages.c:436
+msgid "Edit the previous filename: "
+msgstr "Edite o nome anterior:"
+
+#: LYMessages.c:437
+msgid "Edit a previous filename: "
+msgstr "Edite um arquivo anterior:"
+
+#: LYMessages.c:438
+msgid "Enter a new filename: "
+msgstr "Entre com um novo nome:"
+
+#: LYMessages.c:439
+msgid "File name may not begin with a dot."
+msgstr "Nome do arquivo não pode começar com um ponto."
+
+#: LYMessages.c:441
+msgid "File exists. Create higher version?"
+msgstr "Arquivo existente. Criar nova versão?"
+
+#: LYMessages.c:443
+msgid "File exists. Overwrite?"
+msgstr "Arquivo existente. Sobreescrever?"
+
+#: LYMessages.c:445
+msgid "Cannot write to file."
+msgstr "Impossível gravar no arquivo"
+
+#: LYMessages.c:446
+msgid "ERROR! - download command is misconfigured."
+msgstr "ERRO! - comando de cópia está mal configurado."
+
+#: LYMessages.c:447
+msgid "Unable to download file."
+msgstr "Impossível copiar arquivo."
+
+#: LYMessages.c:448
+msgid "Reading directory..."
+msgstr "Lendo diretório..."
+
+#: LYMessages.c:449
+msgid "Building directory listing..."
+msgstr "Criando lista de diretórios..."
+
+#: LYMessages.c:450
+msgid "Saving..."
+msgstr "Salvando..."
+
+#: LYMessages.c:451
+#, c-format
+msgid "Could not edit file '%s'."
+msgstr "Impossível editar o arquivo '%s'."
+
+#: LYMessages.c:452
+msgid "Unable to access document!"
+msgstr "Não foi possível acessar o documento!"
+
+#: LYMessages.c:453
+msgid "Could not access file."
+msgstr "Impossível acessar o arquivo."
+
+#: LYMessages.c:454
+msgid "Could not access directory."
+msgstr "Impossível acessar diretório."
+
+#: LYMessages.c:455
+msgid "Could not load data."
+msgstr "Impossível ler dados."
+
+#. #define CANNOT_EDIT_REMOTE_FILES
+#: LYMessages.c:457
+msgid "Lynx cannot currently (e)dit remote WWW files."
+msgstr "Lynx não pode atualmente editar um arquivo WWW remoto."
+
+#. #define CANNOT_EDIT_FIELD
+#: LYMessages.c:459
+msgid "This field cannot be (e)dited with an external editor."
+msgstr "Este campo não pode ser editado por um editor externo."
+
+#: LYMessages.c:460
+msgid "Bad rule"
+msgstr "Domínio inválido"
+
+#: LYMessages.c:461
+msgid "Insufficient operands:"
+msgstr "Operadores insuficientes:"
+
+#: LYMessages.c:462
+msgid "You are not authorized to edit this file."
+msgstr "Você não está autorizado a editar este arquivo."
+
+#: LYMessages.c:463
+msgid "Title: "
+msgstr "Título: "
+
+#: LYMessages.c:464
+msgid "Subject: "
+msgstr "Assunto: "
+
+#: LYMessages.c:465
+msgid "Username: "
+msgstr "Nome do Usuário: "
+
+#: LYMessages.c:466
+msgid "Password: "
+msgstr "Senha: "
+
+#: LYMessages.c:467
+msgid "lynx: Username and Password required!!!"
+msgstr "lynx: Nome do usuário e senha são requeridos!!!"
+
+#: LYMessages.c:468
+msgid "lynx: Password required!!!"
+msgstr "lynx: Senha requerida!!!"
+
+#: LYMessages.c:469
+msgid "Clear all authorization info for this session?"
+msgstr "Limpar todas as informações de autorização desta seção?"
+
+#: LYMessages.c:470
+msgid "Authorization info cleared."
+msgstr "Informações de autorização foram apagadas."
+
+#: LYMessages.c:471
+msgid "Authorization failed. Retry?"
+msgstr "Falha na autorização. Repetir?"
+
+#: LYMessages.c:472
+#, fuzzy
+#| msgid "cgi support has been disabled by system administrator."
+msgid "cgi support has been disabled."
+msgstr "Suporte a CGI foi desabilitado pelo administrador."
+
+#. #define CGI_NOT_COMPILED
+#: LYMessages.c:474
+msgid "Lynxcgi capabilities are not compiled into this version."
+msgstr "Capacidades do LynxCGI não foram compiladas com esta versão."
+
+#: LYMessages.c:475
+#, c-format
+msgid "Sorry, no known way of converting %s to %s."
+msgstr "Desculpe, não há protocolos disponíveis para converter %s em %s."
+
+#: LYMessages.c:476
+msgid "Unable to set up connection."
+msgstr "Imposível preparar conecção."
+
+#: LYMessages.c:477
+msgid "Unable to make connection"
+msgstr "Impossível criar conecção"
+
+#. #define MALFORMED_EXEC_REQUEST
+#: LYMessages.c:479
+msgid "Executable link rejected due to malformed request."
+msgstr "Ligação rejeitada por má formação da requisição."
+
+#. #define BADCHAR_IN_EXEC_LINK
+#: LYMessages.c:481
+#, c-format
+msgid "Executable link rejected due to `%c' character."
+msgstr "Ligação rejeitada devido ao caracter '%c'."
+
+#. #define RELPATH_IN_EXEC_LINK
+#: LYMessages.c:483
+msgid "Executable link rejected due to relative path string ('../')."
+msgstr "Ligação rejeitada devido ao caminho relativo errado ('../')."
+
+#. #define BADLOCPATH_IN_EXEC_LINK
+#: LYMessages.c:485
+msgid "Executable link rejected due to location or path."
+msgstr "Ligação rejeitada devido a localização ou caminho."
+
+#: LYMessages.c:486
+msgid "Mail access is disabled!"
+msgstr "Acesso ao Mail está desabilitado!"
+
+#. #define ACCESS_ONLY_LOCALHOST
+#: LYMessages.c:488
+msgid "Only files and servers on the local host can be accessed."
+msgstr "Somente arquivos e servidores no host local podem ser acessados."
+
+#: LYMessages.c:489
+msgid "Telnet access is disabled!"
+msgstr "Acesso telnet está desabilitado!"
+
+#. #define TELNET_PORT_SPECS_DISABLED
+#: LYMessages.c:491
+msgid "Telnet port specifications are disabled."
+msgstr "Especificações de porta telnet estão desabilitadas."
+
+#: LYMessages.c:492
+msgid "USENET news access is disabled!"
+msgstr "Acesso aos NEWS USENET está desabilitado!"
+
+#: LYMessages.c:493
+msgid "Rlogin access is disabled!"
+msgstr "Acesso Rlogin está desabilitado!"
+
+#: LYMessages.c:494
+msgid "Ftp access is disabled!"
+msgstr "Acesso FTP está desabilitado!"
+
+#: LYMessages.c:495
+msgid "There are no references from this document."
+msgstr "Não existem referências a partir documento."
+
+#: LYMessages.c:496
+msgid "There are only hidden links from this document."
+msgstr "Existem somente ligações ocultas a partir deste documento."
+
+#: LYMessages.c:498
+msgid "Unable to open command file."
+msgstr "Impossível abrir linha de comando."
+
+#: LYMessages.c:500
+msgid "News Post Cancelled!!!"
+msgstr "Postagem de NEWS cancelada!!"
+
+#. #define SPAWNING_EDITOR_FOR_NEWS
+#: LYMessages.c:502
+msgid "Spawning your selected editor to edit news message"
+msgstr "Chamando seu editor preferido para editar mensagens de NEWS."
+
+#: LYMessages.c:503
+msgid "Post this message?"
+msgstr "Postar esta mensagem?"
+
+#: LYMessages.c:504
+#, c-format
+msgid "Append '%s'?"
+msgstr "Acrescentar '%s'?"
+
+#: LYMessages.c:505
+msgid "Posting to newsgroup(s)..."
+msgstr "Postando aos newsgroup(s)..."
+
+#: LYMessages.c:507
+msgid "*** You have unread mail. ***"
+msgstr "*** Você tem emails não lidos ainda. ***"
+
+#: LYMessages.c:509
+msgid "*** You have mail. ***"
+msgstr "*** Você recebeu emails. ***"
+
+#: LYMessages.c:511
+msgid "*** You have new mail. ***"
+msgstr "*** Você recebeu novos emails. ***"
+
+#: LYMessages.c:512
+msgid "File insert cancelled!!!"
+msgstr "Inserção de arquivo cancelada!!!"
+
+#: LYMessages.c:513
+#, fuzzy
+#| msgid "Out of memory reading jump file!"
+msgid "Not enough memory for file!"
+msgstr "Estouro de memória, lendo arquivo de salto!"
+
+#: LYMessages.c:514
+#, fuzzy
+#| msgid "Could not open file for decompression!"
+msgid "Can't open file for reading."
+msgstr "Impossóvel abrir arquivo para descompressão!"
+
+#: LYMessages.c:515
+msgid "File does not exist."
+msgstr "Arquivo inexistente."
+
+#: LYMessages.c:516
+msgid "File does not exist - reenter or cancel:"
+msgstr "Arquivo não existe - Repita ou cancele:"
+
+#: LYMessages.c:517
+msgid "File is not readable."
+msgstr "Arquivo não pode ser lido."
+
+#: LYMessages.c:518
+msgid "File is not readable - reenter or cancel:"
+msgstr "Arquivo não pode ser lido. Repita ou cancele:"
+
+#: LYMessages.c:519
+msgid "Nothing to insert - file is 0-length."
+msgstr "Nada a acrescentar - arquivo tem tamanho 0"
+
+#: LYMessages.c:520
+msgid "Save request cancelled!!!"
+msgstr "Salvamento de requisição cancelado!!!"
+
+#: LYMessages.c:521
+msgid "Mail request cancelled!!!"
+msgstr "Requisição de e-mail cancelada!!!"
+
+#. #define CONFIRM_MAIL_SOURCE_PREPARSED
+#: LYMessages.c:523
+msgid "Viewing preparsed source. Are you sure you want to mail it?"
+msgstr "Visualizando aquivo quebrado. Você tem certeza de que quer enviar este email?"
+
+#: LYMessages.c:524
+msgid "Please wait..."
+msgstr "Por favor aguarde...."
+
+#: LYMessages.c:525
+msgid "Mailing file. Please wait..."
+msgstr "Enviando email. Por favor aguarde..."
+
+#: LYMessages.c:526
+msgid "ERROR - Unable to mail file"
+msgstr "ERRO - Impossível enviar arquivo..."
+
+#. #define CONFIRM_LONG_SCREEN_PRINT
+#: LYMessages.c:528
+#, c-format
+msgid "File is %d screens long. Are you sure you want to print?"
+msgstr "Arquivo contém %d páginas. Você quer mesmo imprimir?"
+
+#: LYMessages.c:529
+msgid "Print request cancelled!!!"
+msgstr "Impressão da requisição foi cancelada!!!"
+
+#: LYMessages.c:530
+msgid "Press <return> to begin: "
+msgstr "Pressione <enter> para continuar:"
+
+#: LYMessages.c:531
+msgid "Press <return> to finish: "
+msgstr "Pressione <enter> para terminar:"
+
+#. #define CONFIRM_LONG_PAGE_PRINT
+#: LYMessages.c:533
+#, c-format
+msgid "File is %d pages long. Are you sure you want to print?"
+msgstr "O arquivo tem %d páginas. Tem certeza de que quer imprimir?"
+
+#. #define CHECK_PRINTER
+#: LYMessages.c:535
+msgid "Be sure your printer is on-line. Press <return> to start printing:"
+msgstr "Confira se sua impressora está on-line. Pressione <enter> para iniciar:"
+
+#: LYMessages.c:536
+msgid "ERROR - Unable to allocate file space!!!"
+msgstr "ERRO - Impossível alocar espaço para o arquivo!!!"
+
+#: LYMessages.c:537
+msgid "Unable to open tempfile"
+msgstr "Impossível criar arquivo temporário."
+
+#: LYMessages.c:538
+msgid "Unable to open print options file"
+msgstr "Impossível abrir arquivo de opções da inpressora."
+
+#: LYMessages.c:539
+msgid "Printing file. Please wait..."
+msgstr "Imprimindo. Por favor aguarde..."
+
+#: LYMessages.c:540
+msgid "Please enter a valid internet mail address: "
+msgstr "Por favor, entre com um endereço válido de email:"
+
+#: LYMessages.c:541
+msgid "ERROR! - printer is misconfigured!"
+msgstr "ERRO! - A impressora está mal configurada!!"
+
+#: LYMessages.c:542
+msgid "Image map from POST response not available!"
+msgstr "Imagem mapeada através da esposta do comando POST não está disponível!"
+
+#: LYMessages.c:543
+msgid "Misdirected client-side image MAP request!"
+msgstr "Requisição da imagem mapeada foi perdida!"
+
+#: LYMessages.c:544
+msgid "Client-side image MAP is not accessible!"
+msgstr "O mapeador de imagens não pôde ser acessado!!"
+
+#: LYMessages.c:545
+msgid "No client-side image MAPs are available!"
+msgstr "Não há programa mapeador de imagem disponível!"
+
+#: LYMessages.c:546
+msgid "Client-side image MAP is not available!"
+msgstr "O mapeador de imagens não está disponível!"
+
+#. #define OPTION_SCREEN_NEEDS_24
+#: LYMessages.c:549
+msgid "Screen height must be at least 24 lines for the Options menu!"
+msgstr "O comprimento da tela deve ter pelo menos 24 linhas para o menu de opções."
+
+#. #define OPTION_SCREEN_NEEDS_23
+#: LYMessages.c:551
+msgid "Screen height must be at least 23 lines for the Options menu!"
+msgstr "O comprimento da tela deve ter pelo menos 23 linhas para o menu de opções."
+
+#. #define OPTION_SCREEN_NEEDS_22
+#: LYMessages.c:553
+msgid "Screen height must be at least 22 lines for the Options menu!"
+msgstr "O comprimento da tela deve ter pelo menos 22 linhas para o menu de opçoes."
+
+#: LYMessages.c:555
+msgid "That key requires Advanced User mode."
+msgstr "Esta opção requere o modo de usuário avançado."
+
+#: LYMessages.c:556
+#, c-format
+msgid "Content-type: %s"
+msgstr "Content-type: %s"
+
+#: LYMessages.c:557
+msgid "Command: "
+msgstr "Comando:"
+
+#: LYMessages.c:558
+msgid "Unknown or ambiguous command"
+msgstr ""
+
+#: LYMessages.c:559
+msgid " Version "
+msgstr " Versão "
+
+#: LYMessages.c:560
+#, fuzzy
+#| msgid " first."
+msgid " first"
+msgstr " primeiro."
+
+#: LYMessages.c:561
+msgid ", guessing..."
+msgstr ", solicitando..."
+
+#: LYMessages.c:562
+msgid "Permissions for "
+msgstr "Permissão para "
+
+#: LYMessages.c:563
+msgid "Select "
+msgstr "Selecione "
+
+#: LYMessages.c:564
+msgid "capital letter"
+msgstr "maiuscula"
+
+#: LYMessages.c:565
+msgid " of option line,"
+msgstr "da linha de opção."
+
+#: LYMessages.c:566
+msgid " to save,"
+msgstr " para salvar,"
+
+#: LYMessages.c:567
+msgid " to "
+msgstr " para "
+
+#: LYMessages.c:568
+msgid " or "
+msgstr " ou "
+
+#: LYMessages.c:569
+msgid " index"
+msgstr " index"
+
+#: LYMessages.c:570
+msgid " to return to Lynx."
+msgstr " para voltar ao Lynx"
+
+#: LYMessages.c:571
+msgid "Accept Changes"
+msgstr "Aceitar mudanças"
+
+#: LYMessages.c:572
+msgid "Reset Changes"
+msgstr "Limpar alterações"
+
+#: LYMessages.c:573
+msgid "Left Arrow cancels changes"
+msgstr "Setas a esquerda cancelam as mudanças"
+
+#: LYMessages.c:574
+msgid "Save options to disk"
+msgstr "Grava as opções no disco"
+
+#: LYMessages.c:575
+msgid "Hit RETURN to accept entered data."
+msgstr "Tecle ENTER para aceitar os dados fornecidos"
+
+#. #define ACCEPT_DATA_OR_DEFAULT
+#: LYMessages.c:577
+msgid "Hit RETURN to accept entered data. Delete data to invoke the default."
+msgstr "Tecle ENTER para aceitar os dados.Delete para chamar os valores padrão."
+
+#: LYMessages.c:578
+msgid "Value accepted!"
+msgstr "Valor aceito!"
+
+#. #define VALUE_ACCEPTED_WARNING_X
+#: LYMessages.c:580
+msgid "Value accepted! -- WARNING: Lynx is configured for XWINDOWS!"
+msgstr "Valor aceito! - Atenção: O Lynx está configurado para XWINDOWS!"
+
+#. #define VALUE_ACCEPTED_WARNING_NONX
+#: LYMessages.c:582
+msgid "Value accepted! -- WARNING: Lynx is NOT configured for XWINDOWS!"
+msgstr "Valor aceito! - Atenção: O Lynx não está configurado para XWINDOWS!"
+
+#: LYMessages.c:583
+msgid "You are not allowed to change which editor to use!"
+msgstr "Você não tem permissão para alterar o editor a ser usado!"
+
+#: LYMessages.c:584
+msgid "Failed to set DISPLAY variable!"
+msgstr "Falha ao setar a variável DISPLAY!"
+
+#: LYMessages.c:585
+msgid "Failed to clear DISPLAY variable!"
+msgstr "Falha ao apagar a variável DISPLAY"
+
+#. #define BOOKMARK_CHANGE_DISALLOWED
+#: LYMessages.c:587
+msgid "You are not allowed to change the bookmark file!"
+msgstr "Você não tem permissão para alterar o Livro de Marcações!"
+
+#: LYMessages.c:588
+msgid "Terminal does not support color"
+msgstr "O terminal não suporta cores."
+
+#: LYMessages.c:589
+#, c-format
+msgid "Your '%s' terminal does not support color."
+msgstr "Seu terminal '%s' não suporta cores."
+
+#: LYMessages.c:590
+msgid "Access to dot files is disabled!"
+msgstr "Acesso aos arquivos ocultos está desabilitado!"
+
+#. #define UA_NO_LYNX_WARNING
+#: LYMessages.c:592
+msgid "User-Agent string does not contain \"Lynx\" or \"L_y_n_x\""
+msgstr ""
+
+#. #define UA_PLEASE_USE_LYNX
+#: LYMessages.c:594
+msgid "Use \"L_y_n_x\" or \"Lynx\" in User-Agent, or it looks like intentional deception!"
+msgstr ""
+
+#. #define UA_CHANGE_DISABLED
+#: LYMessages.c:596
+msgid "Changing of the User-Agent string is disabled!"
+msgstr ""
+
+#. #define CHANGE_OF_SETTING_DISALLOWED
+#: LYMessages.c:598
+msgid "You are not allowed to change this setting."
+msgstr "Você não tem permissão para alterar esta configuração."
+
+#: LYMessages.c:599
+msgid "Saving Options..."
+msgstr "Salvando opções..."
+
+#: LYMessages.c:600
+msgid "Options saved!"
+msgstr "Opções salvas."
+
+#: LYMessages.c:601
+msgid "Unable to save Options!"
+msgstr "Impossível salvar opções!"
+
+#: LYMessages.c:602
+msgid " 'r' to return to Lynx "
+msgstr " 'r' para voltar ao Lynx "
+
+#: LYMessages.c:603
+msgid " '>' to save, or 'r' to return to Lynx "
+msgstr " '>' para salvar, ou 'r' para voltar ao Lynx "
+
+#. #define ANY_KEY_CHANGE_RET_ACCEPT
+#: LYMessages.c:605
+msgid "Hit any key to change value; RETURN to accept."
+msgstr "Qualquer tecla para alterar, ENTER para submeter."
+
+#: LYMessages.c:606
+msgid "Error uncompressing temporary file!"
+msgstr "Erro descomprimindo arquivo temporário!"
+
+#: LYMessages.c:607
+msgid "Unsupported URL scheme!"
+msgstr "Esquema de URL não suportado!"
+
+#: LYMessages.c:608
+msgid "Unsupported data: URL! Use SHOWINFO, for now."
+msgstr "Dados não suportados. Use SHOWINFO por agora."
+
+#: LYMessages.c:609
+msgid "Redirection limit of 10 URL's reached."
+msgstr "Limite de 10 redirecionamentos atingido."
+
+#: LYMessages.c:610
+msgid "Illegal redirection URL received from server!"
+msgstr "Recebido um redirecionamento ilegal do servidor."
+
+#. #define SERVER_ASKED_FOR_REDIRECTION
+#: LYMessages.c:612
+#, c-format
+msgid "Server asked for %d redirection of POST content to"
+msgstr "O servidor perguntou sobre redirecionar o formulário postado de %d para"
+
+#: LYMessages.c:615
+msgid "P)roceed, use G)ET or C)ancel "
+msgstr "P) Procede, G) Copia, ou C) Cancela"
+
+#: LYMessages.c:616
+msgid "P)roceed, or C)ancel "
+msgstr "P) Procede, C) Cancela"
+
+#. #define ADVANCED_POST_GET_REDIRECT
+#: LYMessages.c:618
+msgid "Redirection of POST content. P)roceed, see U)RL, use G)ET or C)ancel"
+msgstr "Redirecionamento de Postagem. P)Procede, U)Ver a URL, G)Copia ou C)Cancela"
+
+#. #define ADVANCED_POST_REDIRECT
+#: LYMessages.c:620
+msgid "Redirection of POST content. P)roceed, see U)RL, or C)ancel"
+msgstr "Redirecinamento de comando de Postagem. P) Procede, U) Ver URL ou C) Cancela"
+
+#. #define CONFIRM_POST_RESUBMISSION
+#: LYMessages.c:622
+msgid "Document from Form with POST content. Resubmit?"
+msgstr "Documento com formulário de postagem. Reenviar?"
+
+#. #define CONFIRM_POST_RESUBMISSION_TO
+#: LYMessages.c:624
+#, c-format
+msgid "Resubmit POST content to %s ?"
+msgstr "Reenviar formulário postado para %s ?"
+
+#. #define CONFIRM_POST_LIST_RELOAD
+#: LYMessages.c:626
+#, c-format
+msgid "List from document with POST data. Reload %s ?"
+msgstr "Documento com lista de dados para postagem. Re-ler %s ? "
+
+#. #define CONFIRM_POST_DOC_HEAD
+#: LYMessages.c:628
+msgid "Document from POST action, HEAD may not be understood. Proceed?"
+msgstr "Documento de uma ação de postagem. Cabeçalho não compreendido. Continua?"
+
+#. #define CONFIRM_POST_LINK_HEAD
+#: LYMessages.c:630
+msgid "Form submit action is POST, HEAD may not be understood. Proceed?"
+msgstr "Ação de postagem de formulário. Cabeçalho não compreendido. Continua?"
+
+#: LYMessages.c:631
+msgid "Proceed without a username and password?"
+msgstr "Continua sem um usuário e senha?"
+
+#: LYMessages.c:632
+#, c-format
+msgid "Proceed (%s)?"
+msgstr "Proseguir (%s)?"
+
+#: LYMessages.c:633
+msgid "Cannot POST to this host."
+msgstr "Impossível postar neste servidor."
+
+#: LYMessages.c:634
+msgid "POST not supported for this URL - ignoring POST data!"
+msgstr "Comando de postagem não suportado por esta URL - ignorando dados de postagem!"
+
+#: LYMessages.c:635
+msgid "Discarding POST data..."
+msgstr "Apagando dados de postagem..."
+
+#: LYMessages.c:636
+msgid "Document will not be reloaded!"
+msgstr "Documento não será atualizado!"
+
+#: LYMessages.c:637
+msgid "Location: "
+msgstr "Localização:"
+
+#: LYMessages.c:638
+#, c-format
+msgid "'%s' not found!"
+msgstr "'%s' não encontrado!"
+
+#: LYMessages.c:639
+msgid "Default Bookmark File"
+msgstr "Arquivo padrão do Livro de Marcações"
+
+#: LYMessages.c:640
+msgid "Screen too small! (8x35 min)"
+msgstr "Tela muito pequena, (8x35 mínimo)"
+
+#: LYMessages.c:641
+msgid "Select destination or ^G to Cancel: "
+msgstr "Selecione destino ou ^G para cancelar:"
+
+#. #define MULTIBOOKMARKS_SELECT
+#: LYMessages.c:643
+msgid "Select subbookmark, '=' for menu, or ^G to cancel: "
+msgstr "Selecione submarca, '=' para menu, ou ^G para cancelar:"
+
+#. #define MULTIBOOKMARKS_SELF
+#: LYMessages.c:645
+msgid "Reproduce L)ink in this bookmark file or C)ancel? (l,c): "
+msgstr "L) Reproduzir ligação nesta marcação ou C) Cancela? (l,c):"
+
+#: LYMessages.c:646
+msgid "Multiple bookmark support is not available."
+msgstr "Suporte a multiplos livros de marcação não está disponível."
+
+#: LYMessages.c:647
+#, c-format
+msgid " Select Bookmark (screen %d of %d)"
+msgstr "Selecione Livro de Marcação (seleção %d de %d)"
+
+#: LYMessages.c:648
+msgid " Select Bookmark"
+msgstr " Selecione Livro de Marcação"
+
+#. #define MULTIBOOKMARKS_EHEAD_MASK
+#: LYMessages.c:650
+#, c-format
+msgid "Editing Bookmark DESCRIPTION and FILEPATH (%d of 2)"
+msgstr "Editando Descrição e Localização do Livro de Marcações (%d de 2)"
+
+#. #define MULTIBOOKMARKS_EHEAD
+#: LYMessages.c:652
+msgid " Editing Bookmark DESCRIPTION and FILEPATH"
+msgstr " Editando Descrição e Localização"
+
+#: LYMessages.c:653
+msgid "Letter: "
+msgstr "Letra: "
+
+#. #define USE_PATH_OFF_HOME
+#: LYMessages.c:656
+msgid "Use a filepath off your login directory in SHELL syntax!"
+msgstr "Use o diretório de seu login na sintaxe do interpretador de comando."
+
+#: LYMessages.c:658
+msgid "Use a filepath off your home directory!"
+msgstr "Use o caminho de seu diretório padrão!"
+
+#. #define MAXLINKS_REACHED
+#: LYMessages.c:661
+msgid "Maximum links per page exceeded! Use half-page or two-line scrolling."
+msgstr "Limite de ligações atingido! Use uma página menor ou rolagem de tela dupla."
+
+#: LYMessages.c:662
+msgid "No previously visited links available!"
+msgstr "Não há ligações visitadas antes desta disponíveis!"
+
+#: LYMessages.c:663
+msgid "Memory exhausted! Program aborted!"
+msgstr "Memória no limite. Programa abortado!"
+
+#: LYMessages.c:664
+msgid "Memory exhausted! Aborting..."
+msgstr "Memória no limite. Abortando..."
+
+#: LYMessages.c:665
+msgid "Not enough memory!"
+msgstr ""
+
+#: LYMessages.c:666
+msgid "Directory/File Manager not available"
+msgstr "Gerenciador de Diretórios/Arquivos não disponível"
+
+#: LYMessages.c:667
+msgid "HREF in BASE tag is not an absolute URL."
+msgstr "HREF na tag BASE não é uma URL absoluta."
+
+#: LYMessages.c:668
+msgid "Location URL is not absolute."
+msgstr "Ligação da URL não tem endereço absoluto."
+
+#: LYMessages.c:669
+msgid "Refresh URL is not absolute."
+msgstr "Não há um endereço absoluto de atualização definido."
+
+#. #define SENDING_MESSAGE_WITH_BODY_TO
+#: LYMessages.c:671
+msgid ""
+"You are sending a message with body to:\n"
+" "
+msgstr ""
+"Você está enviando uma mensagem para:\n"
+" "
+
+#: LYMessages.c:672
+msgid ""
+"You are sending a comment to:\n"
+" "
+msgstr ""
+"Você está enviando um comentário para:\n"
+" "
+
+#: LYMessages.c:673
+msgid ""
+"\n"
+" With copy to:\n"
+" "
+msgstr ""
+"\n"
+" com cópia para:\n"
+" "
+
+#: LYMessages.c:674
+msgid ""
+"\n"
+" With copies to:\n"
+" "
+msgstr ""
+"\n"
+" com cópias para:\n"
+" "
+
+#. #define CTRL_G_TO_CANCEL_SEND
+#: LYMessages.c:676
+msgid ""
+"\n"
+"\n"
+"Use Ctrl-G to cancel if you do not want to send a message\n"
+msgstr ""
+"\n"
+"\n"
+"Use Ctrl-G para Cancelar se você não quer enviar a mensagem.\n"
+
+#. #define ENTER_NAME_OR_BLANK
+#: LYMessages.c:678
+msgid ""
+"\n"
+" Please enter your name, or leave it blank to remain anonymous\n"
+msgstr ""
+"\n"
+" Por favor, entre com seu nome, ou deixe em branco para enviar anônimo\n"
+
+#. #define ENTER_MAIL_ADDRESS_OR_OTHER
+#: LYMessages.c:680
+msgid ""
+"\n"
+" Please enter a mail address or some other\n"
+msgstr ""
+"\n"
+" Por favor, entre com o endereço de email ou outro qualquer.\n"
+
+#. #define MEANS_TO_CONTACT_FOR_RESPONSE
+#: LYMessages.c:682
+msgid " means to contact you, if you desire a response.\n"
+msgstr " quer contactar você, se você desejar responder.\n"
+
+#: LYMessages.c:683
+msgid ""
+"\n"
+" Please enter a subject line.\n"
+msgstr ""
+"\n"
+"Por favor, entre com uma linha de assunto.\n"
+
+#. #define ENTER_ADDRESS_FOR_CC
+#: LYMessages.c:685
+msgid ""
+"\n"
+" Enter a mail address for a CC of your message.\n"
+msgstr ""
+"\n"
+" Entre com o endereço de email para enviar uma cópia da mensagem.\n"
+
+#: LYMessages.c:686
+msgid " (Leave blank if you don't want a copy.)\n"
+msgstr " (Deixe em branco se não deseja enviar uma cópia deste email)\n"
+
+#: LYMessages.c:687
+msgid ""
+"\n"
+" Please review the message body:\n"
+"\n"
+msgstr ""
+"\n"
+" Por favor, examine o corpo da mensagem:\n"
+"\n"
+
+#: LYMessages.c:688
+msgid ""
+"\n"
+"Press RETURN to continue: "
+msgstr ""
+"\n"
+"Pressione ENTER para continuar:"
+
+#: LYMessages.c:689
+msgid ""
+"\n"
+"Press RETURN to clean up: "
+msgstr ""
+"\n"
+"Pressione ENTER para limpar:"
+
+#: LYMessages.c:690
+msgid " Use Control-U to erase the default.\n"
+msgstr "Use Control-U para apagar o valor padrão.\n"
+
+#: LYMessages.c:691
+msgid ""
+"\n"
+" Please enter your message below."
+msgstr ""
+"\n"
+" Por favor entre com sua mensagem abaixo."
+
+#. #define ENTER_PERIOD_WHEN_DONE_A
+#: LYMessages.c:693 src/LYNews.c:360
+msgid ""
+"\n"
+" When you are done, press enter and put a single period (.)"
+msgstr ""
+"\n"
+" Quando você terminar, pressione enter e aguarde alguns instantes."
+
+#. #define ENTER_PERIOD_WHEN_DONE_B
+#: LYMessages.c:695 src/LYNews.c:361
+msgid ""
+"\n"
+" on a line and press enter again."
+msgstr ""
+"\n"
+" numa linha em pressione enter novamente."
+
+#. Cookies messages
+#. #define ADVANCED_COOKIE_CONFIRMATION
+#: LYMessages.c:699
+#, c-format
+msgid "%s cookie: %.*s=%.*s Allow? (Y/N/Always/neVer)"
+msgstr "%s cookie: %.*s=%.*s Permite? (S/N/semPre/nunCa)"
+
+#. #define INVALID_COOKIE_DOMAIN_CONFIRMATION
+#: LYMessages.c:701
+#, c-format
+msgid "Accept invalid cookie domain=%s for '%s'?"
+msgstr "Aceita cookie inválido do domínio %s para '%s'?"
+
+#. #define INVALID_COOKIE_PATH_CONFIRMATION
+#: LYMessages.c:703
+#, c-format
+msgid "Accept invalid cookie path=%s as a prefix of '%s'?"
+msgstr "Aceita cookie de caminho mal definido '%s' com prefixo de '%s'?"
+
+#: LYMessages.c:704
+msgid "Allowing this cookie."
+msgstr "Aceitando este cookie."
+
+#: LYMessages.c:705
+msgid "Rejecting this cookie."
+msgstr "Rejeitando este cookie."
+
+#: LYMessages.c:706
+msgid "The Cookie Jar is empty."
+msgstr "O arquivo Jar do cookie está vazio."
+
+#: LYMessages.c:707
+#, fuzzy
+#| msgid "The Cookie Jar is empty."
+msgid "The Cache Jar is empty."
+msgstr "O arquivo Jar do cookie está vazio."
+
+#. #define ACTIVATE_TO_GOBBLE
+#: LYMessages.c:709
+msgid "Activate links to gobble up cookies or entire domains,"
+msgstr "Ativa ligação para pegar os cookies de todo o domínio,"
+
+#: LYMessages.c:710
+msgid "or to change a domain's 'allow' setting."
+msgstr "ou para alterar a permissão de cookies do domínio"
+
+#: LYMessages.c:711
+msgid "(Cookies never allowed.)"
+msgstr "(Cookies nunca serão aceitos.)"
+
+#: LYMessages.c:712
+msgid "(Cookies always allowed.)"
+msgstr "(Cookies estão sendo aceitos.)"
+
+#: LYMessages.c:713
+msgid "(Cookies allowed via prompt.)"
+msgstr "(Pergunta antes de aceitar cookies.)"
+
+#: LYMessages.c:714
+msgid "(Persistent Cookies.)"
+msgstr "(Cookies permanentes.)"
+
+#: LYMessages.c:715
+msgid "(No title.)"
+msgstr "(Sem título.)"
+
+#: LYMessages.c:716
+msgid "(No name.)"
+msgstr "(Sem nome.)"
+
+#: LYMessages.c:717
+msgid "(No value.)"
+msgstr "(Sem valor.)"
+
+#: LYMessages.c:718 src/LYOptions.c:2409
+msgid "None"
+msgstr "Vazio"
+
+#: LYMessages.c:719
+msgid "(End of session.)"
+msgstr "(Fim da seção.)"
+
+#: LYMessages.c:720
+msgid "Delete this cookie?"
+msgstr "Delete este cookie?"
+
+#: LYMessages.c:721
+msgid "The cookie has been eaten!"
+msgstr "O cookie foi destruido!"
+
+#: LYMessages.c:722
+msgid "Delete this empty domain?"
+msgstr "Apaga este domínio vazio?"
+
+#: LYMessages.c:723
+msgid "The domain has been eaten!"
+msgstr "O domínio foi destruido!"
+
+#. #define DELETE_COOKIES_SET_ALLOW_OR_CANCEL
+#: LYMessages.c:725
+msgid "D)elete domain's cookies, set allow A)lways/P)rompt/neV)er, or C)ancel? "
+msgstr "D)Deleta cookie, acerta para A)Sempre/P)Perguntar/V)Nunca ou C) Cancela?"
+
+#. #define DELETE_DOMAIN_SET_ALLOW_OR_CANCEL
+#: LYMessages.c:727
+msgid "D)elete domain, set allow A)lways/P)rompt/neV)er, or C)ancel? "
+msgstr "D)Deleta dominio, acerta para A)Sempre/P)Perguntar/V)Nunca ou C) Cancela?"
+
+#: LYMessages.c:728
+msgid "All cookies in the domain have been eaten!"
+msgstr "Todos os cookies deste domínio foram destruídos!"
+
+#: LYMessages.c:729
+#, c-format
+msgid "'A'lways allowing from domain '%s'."
+msgstr "'Sempre' aceitar do domínio '%s'."
+
+#: LYMessages.c:730
+#, c-format
+msgid "ne'V'er allowing from domain '%s'."
+msgstr "'Nunca' aceitar do domínio '%s'."
+
+#: LYMessages.c:731
+#, c-format
+msgid "'P'rompting to allow from domain '%s'."
+msgstr "'Perguntar' antes de aceitar de '%s'."
+
+#: LYMessages.c:732
+msgid "Delete all cookies in this domain?"
+msgstr "Deleta todos os cookies deste domínio?"
+
+#: LYMessages.c:733
+msgid "All of the cookies in the jar have been eaten!"
+msgstr "Todos os cookies no arquivo Jar foram destruidos!"
+
+#: LYMessages.c:735
+msgid "Port 19 not permitted in URLs."
+msgstr "Porta 19 não permitida em URLs."
+
+#: LYMessages.c:736
+msgid "Port 25 not permitted in URLs."
+msgstr "Porta 25 nao permitida em URLs."
+
+#: LYMessages.c:737
+#, c-format
+msgid "Port %lu not permitted in URLs."
+msgstr "Porta %lu nao permitida em URLs."
+
+#: LYMessages.c:738
+msgid "URL has a bad port field."
+msgstr "URL tem uma porta inválida."
+
+#: LYMessages.c:739
+msgid "Maximum nesting of HTML elements exceeded."
+msgstr "Origens dos elementos HTML excederam o limite."
+
+#: LYMessages.c:740
+msgid "Bad partial reference! Stripping lead dots."
+msgstr "Referência parcial inválida! Ignorando alguns pontos."
+
+#: LYMessages.c:741
+#, fuzzy
+#| msgid "Trace Log open failed. Trace off!."
+msgid "Trace Log open failed. Trace off!"
+msgstr "Falha ao localizar arquivo de log. Localização desligada!"
+
+#: LYMessages.c:742
+msgid "Lynx Trace Log"
+msgstr "Registro de depuração de rotas do Lynx"
+
+#: LYMessages.c:743
+msgid "No trace log has been started for this session."
+msgstr "Não foi aberta uma seção de traçagem de log."
+
+#. #define MAX_TEMPCOUNT_REACHED
+#: LYMessages.c:745
+msgid "The maximum temporary file count has been reached!"
+msgstr "A quantidade máxima de arquivos temporários foi atingida."
+
+#. #define FORM_VALUE_TOO_LONG
+#: LYMessages.c:747
+msgid "Form field value exceeds buffer length! Trim the tail."
+msgstr "O tamanho do buffer excedeu o tramanho do campo do formulário. Cortando o fim."
+
+#. #define FORM_TAIL_COMBINED_WITH_HEAD
+#: LYMessages.c:749
+msgid "Modified tail combined with head of form field value."
+msgstr "Aba modificada combinada com o cabeçalho do campo de formulario."
+
+#. HTFile.c
+#: LYMessages.c:752
+msgid "Directory"
+msgstr "Diretório"
+
+#: LYMessages.c:753
+msgid "Directory browsing is not allowed."
+msgstr "Leitor de diretórios não disponível."
+
+#: LYMessages.c:754
+msgid "Selective access is not enabled for this directory"
+msgstr "Acesso seletivo está habilitado para este diretório"
+
+#: LYMessages.c:755
+msgid "Multiformat: directory scan failed."
+msgstr "Formatador multiplo: Leitura de diretório falhou."
+
+#: LYMessages.c:756
+msgid "This directory is not readable."
+msgstr "Este diretório não pode ser lido."
+
+#: LYMessages.c:757
+msgid "Can't access requested file."
+msgstr "Impossível acessar arquivo requisitado."
+
+#: LYMessages.c:758
+msgid "Could not find suitable representation for transmission."
+msgstr "Não foi encontrado processo de representação para transmissão."
+
+#: LYMessages.c:759
+msgid "Could not open file for decompression!"
+msgstr "Impossóvel abrir arquivo para descompressão!"
+
+#: LYMessages.c:760
+msgid "Files:"
+msgstr "Arquivos:"
+
+#: LYMessages.c:761
+msgid "Subdirectories:"
+msgstr "Subdiretórios:"
+
+#: LYMessages.c:762
+msgid " directory"
+msgstr " diretório"
+
+#: LYMessages.c:763
+msgid "Up to "
+msgstr "Segue para "
+
+#: LYMessages.c:764
+msgid "Current directory is "
+msgstr "Diretório corrente é "
+
+#. HTFTP.c
+#: LYMessages.c:767
+msgid "Symbolic Link"
+msgstr "Ligação simbólica"
+
+#. HTGopher.c
+#: LYMessages.c:770
+msgid "No response from server!"
+msgstr "Sem resposta do servidor!"
+
+#: LYMessages.c:771
+msgid "CSO index"
+msgstr "CSO index"
+
+#: LYMessages.c:772
+msgid ""
+"\n"
+"This is a searchable index of a CSO database.\n"
+msgstr ""
+"\n"
+"Este é um campo de procura de um banco de dados CSO.\n"
+
+#: LYMessages.c:773
+msgid "CSO Search Results"
+msgstr "Resultados da busca no CSO"
+
+#: LYMessages.c:774
+#, c-format
+msgid "Seek fail on %s\n"
+msgstr "Busca falhou em %s\n"
+
+#: LYMessages.c:775
+msgid ""
+"\n"
+"Press the 's' key and enter search keywords.\n"
+msgstr ""
+"\n"
+"Pressione 's' e entre com os dados para busca.\n"
+
+#: LYMessages.c:776
+msgid ""
+"\n"
+"This is a searchable Gopher index.\n"
+msgstr ""
+"\n"
+"Este é um indexador de busca Gopher.\n"
+
+#: LYMessages.c:777
+msgid "Gopher index"
+msgstr "Indexador Gopher"
+
+#: LYMessages.c:778
+msgid "Gopher Menu"
+msgstr "Menu Gopher"
+
+#: LYMessages.c:779
+msgid " Search Results"
+msgstr "Resultados da Busca"
+
+#: LYMessages.c:780
+msgid "Sending CSO/PH request."
+msgstr "Enviando requisição CSO/PH."
+
+#: LYMessages.c:781
+msgid "Sending Gopher request."
+msgstr "Enviando requisição Gopher."
+
+#: LYMessages.c:782
+msgid "CSO/PH request sent; waiting for response."
+msgstr "requisição CSO/PH enviada; esperando pela resposta."
+
+#: LYMessages.c:783
+msgid "Gopher request sent; waiting for response."
+msgstr "requisição Gopher enviada; esperando pela resposta."
+
+#: LYMessages.c:784
+msgid ""
+"\n"
+"Please enter search keywords.\n"
+msgstr ""
+"\n"
+"Por favor, entre com os dados para busca.\n"
+
+#: LYMessages.c:785
+msgid ""
+"\n"
+"The keywords that you enter will allow you to search on a"
+msgstr ""
+"\n"
+"Os dados que você escolheu para busca irão fazer uma busca em"
+
+#: LYMessages.c:786
+msgid " person's name in the database.\n"
+msgstr " nome personificado na base de dados.\n"
+
+#. HTNews.c
+#: LYMessages.c:789
+msgid "Connection closed ???"
+msgstr "Conecção fechada???"
+
+#: LYMessages.c:790
+msgid "Cannot open temporary file for news POST."
+msgstr "Impossível abrir arquivo temporário para postagem de NEWS"
+
+#: LYMessages.c:791
+msgid "This client does not contain support for posting to news with SSL."
+msgstr "Este cliente não contém suporte para postar NEWS com SSL."
+
+#. HTStyle.c
+#: LYMessages.c:794
+#, c-format
+msgid "Style %d `%s' SGML:%s. Font %s %.1f point.\n"
+msgstr "Estilo %d '%s' SGML:%s. Fonte %s %.1f pontos.\n"
+
+#: LYMessages.c:796
+#, c-format
+msgid "\tAlign=%d, %d tabs. (%.0f before, %.0f after)\n"
+msgstr "Alinhamento=%d, %d tabs. (%.0f antes, %.0f depois)\n"
+
+#: LYMessages.c:797
+#, c-format
+msgid "\t\tTab kind=%d at %.0f\n"
+msgstr "Aba tipo=%d a %.0f\n"
+
+#. HTTP.c
+#: LYMessages.c:800
+msgid "Can't proceed without a username and password."
+msgstr "Impossível continuar sem um usuário e senha."
+
+#: LYMessages.c:801
+msgid "Can't retry with authorization! Contact the server's WebMaster."
+msgstr "Impossível repetir sem autorização! Contate o WebMaster."
+
+#: LYMessages.c:802
+msgid "Can't retry with proxy authorization! Contact the server's WebMaster."
+msgstr "Impossível repetir sem uma autorização de proxy. Contate o WebMaster."
+
+#: LYMessages.c:803
+msgid "Retrying with proxy authorization information."
+msgstr "Repetindo com informações de autorização para o proxy."
+
+#: LYMessages.c:804
+#, c-format
+msgid "SSL error:%s-Continue?"
+msgstr ""
+
+#. HTWAIS.c
+#: LYMessages.c:807
+msgid "HTWAIS: Return message too large."
+msgstr "HTWAIS: Mensagem de retorno muito grande."
+
+#: LYMessages.c:808
+msgid "Enter WAIS query: "
+msgstr "Entre com a requisição de WAIS: "
+
+#. Miscellaneous status
+#: LYMessages.c:811
+msgid "Retrying as HTTP0 request."
+msgstr "Repetindo com requisição HTTPO."
+
+#: LYMessages.c:812
+#, fuzzy, c-format
+#| msgid "Transferred %d bytes"
+msgid "Transferred %d bytes"
+msgstr "Transferidos %s bytes."
+
+#: LYMessages.c:813
+msgid "Data transfer complete"
+msgstr "Transferência completada"
+
+#: LYMessages.c:814
+#, c-format
+msgid "Error processing line %d of %s\n"
+msgstr "Erro processando linha %d de %s\n"
+
+#. Lynx internal page titles
+#: LYMessages.c:817
+msgid "Address List Page"
+msgstr "Pagina de endereços"
+
+#: LYMessages.c:818
+msgid "Bookmark file"
+msgstr "Arquivo do Livro de Marcações"
+
+#: LYMessages.c:819
+msgid "Configuration Definitions"
+msgstr "Definições de configuração"
+
+#: LYMessages.c:820
+msgid "Cookie Jar"
+msgstr "Cookie Jar"
+
+#: LYMessages.c:821
+msgid "Current Key Map"
+msgstr "Mapa de teclado corrente"
+
+#: LYMessages.c:822
+msgid "File Management Options"
+msgstr "Opções de gerenciamento de arquivos"
+
+#: LYMessages.c:823
+msgid "Download Options"
+msgstr "Opções de cópia"
+
+#: LYMessages.c:824
+msgid "History Page"
+msgstr "Página de histórico"
+
+#: LYMessages.c:825
+#, fuzzy
+#| msgid "Cookie Jar"
+msgid "Cache Jar"
+msgstr "Cookie Jar"
+
+#: LYMessages.c:826
+msgid "List Page"
+msgstr "Listas"
+
+#: LYMessages.c:827
+msgid "Lynx.cfg Information"
+msgstr "Informações do Lynx.cfg"
+
+#: LYMessages.c:828
+msgid "Converted Mosaic Hotlist"
+msgstr "Livro de amrcações convertido do Mosaic"
+
+#: LYMessages.c:829
+msgid "Options Menu"
+msgstr "Menu de Opções"
+
+#: LYMessages.c:830
+msgid "File Permission Options"
+msgstr "Opções de permissão de arquivos"
+
+#: LYMessages.c:831
+msgid "Printing Options"
+msgstr "Opções de imporessão"
+
+#: LYMessages.c:832
+msgid "Information about the current document"
+msgstr "Informações sobre este documento"
+
+#: LYMessages.c:833
+msgid "Your recent statusline messages"
+msgstr "Sua linha de mensagens de estado atual"
+
+#: LYMessages.c:834
+msgid "Upload Options"
+msgstr "Opções de Envio"
+
+#: LYMessages.c:835
+msgid "Visited Links Page"
+msgstr "Página de ligações visitadas"
+
+#. CONFIG_DEF_TITLE subtitles
+#: LYMessages.c:838
+msgid "See also"
+msgstr "Veja mais"
+
+#: LYMessages.c:839
+msgid "your"
+msgstr "seu"
+
+#: LYMessages.c:840
+msgid "for runtime options"
+msgstr "para opções de execução"
+
+#: LYMessages.c:841
+msgid "compile time options"
+msgstr "Opções de tempo de compilação"
+
+#: LYMessages.c:842
+#, fuzzy
+#| msgid "Your primary configuration"
+msgid "color-style configuration"
+msgstr "Sua configuração inicial"
+
+#: LYMessages.c:843
+msgid "latest release"
+msgstr "ultimo apresentado"
+
+#: LYMessages.c:844
+#, fuzzy
+#| msgid "development version"
+msgid "pre-release version"
+msgstr "versão em desenvolvimento"
+
+#: LYMessages.c:845
+msgid "development version"
+msgstr "versão em desenvolvimento"
+
+#. #define AUTOCONF_CONFIG_CACHE
+#: LYMessages.c:847
+msgid ""
+"The following data were derived during the automatic configuration/build\n"
+"process of this copy of Lynx. When reporting a bug, please include a copy\n"
+"of this page."
+msgstr ""
+"Os dados apresentados são derivados dos processos de configuração/compilação\n"
+"automática desta cópia do Lynx. Quando reportar um BUG, por favor inclua uma\n"
+"cópia desta página."
+
+#. #define AUTOCONF_LYNXCFG_H
+#: LYMessages.c:851
+msgid ""
+"The following data were used as automatically-configured compile-time\n"
+"definitions when this copy of Lynx was built."
+msgstr ""
+"Os dados apresentados usaram uma configuração automática de definição de\n"
+"compilação quando esta cópia do Lynx foi criada."
+
+#. #define DIRED_NOVICELINE
+#: LYMessages.c:856
+msgid " C)reate D)ownload E)dit F)ull menu M)odify R)emove T)ag U)pload \n"
+msgstr "C) Criar D) Copiar E) Editar F) Menu inteiro M) Alterar R) Remover T) Tag U) Enviar arquivo \n"
+
+#: LYMessages.c:857
+msgid "Failed to obtain status of current link!"
+msgstr "Falha obtendo o estado atual desta ligação!"
+
+#. #define INVALID_PERMIT_URL
+#: LYMessages.c:860
+msgid "Special URL only valid from current File Permission menu!"
+msgstr "Acesso a URLs especiais só válidas pelo menu de permissões de arquivos."
+
+#: LYMessages.c:864
+msgid "External support is currently disabled."
+msgstr "Suporte externo está desabilitado."
+
+#. new with 2.8.4dev.21
+#: LYMessages.c:868
+#, fuzzy
+#| msgid "Spawning is currently disabled."
+msgid "Changing working-directory is currently disabled."
+msgstr "Chamadas estão atualmente desabilitadas."
+
+#: LYMessages.c:869
+#, fuzzy
+#| msgid "Trace OFF!"
+msgid "Linewrap OFF!"
+msgstr "Traçador de rotas desligado!"
+
+#: LYMessages.c:870
+msgid "Linewrap ON!"
+msgstr ""
+
+#: LYMessages.c:871
+#, fuzzy
+#| msgid "Raw 8-bit or CJK mode toggled OFF! Reloading..."
+msgid "Parsing nested-tables toggled OFF! Reloading..."
+msgstr "Modo Raw 8-bit ou CJK estão desativados. Atualizando..."
+
+#: LYMessages.c:872
+#, fuzzy
+#| msgid "Raw 8-bit or CJK mode toggled ON! Reloading..."
+msgid "Parsing nested-tables toggled ON! Reloading..."
+msgstr "Modo Raw 8-bit ou CJK estão ativados. Atualizando..."
+
+#: LYMessages.c:873
+msgid "Shifting is disabled while line-wrap is in effect"
+msgstr ""
+
+#: LYMessages.c:874
+#, fuzzy
+#| msgid "Terminal does not support color"
+msgid "Trace not supported"
+msgstr "O terminal não suporta cores."
+
+#: LYMessages.c:795
+#, c-format
+msgid "\tIndents: first=%.0f others=%.0f, Height=%.1f Desc=%.1f\n"
+msgstr "Recortes: primeiro:%.0f outros=%.0f, altura=%.1f Desc.=%.1f\n"
+
+#.
+#. * Set up the message for the username prompt, and then issue the
+#. * prompt. The default username is included in the call to the
+#. * prompting function, but the password is NULL-ed and always replaced.
+#. * - FM
+#.
+#: WWW/Library/Implementation/HTAABrow.c:634
+#, c-format
+msgid "Username for '%s' at %s '%s%s':"
+msgstr "Usuário de '%s' em %s '%s%s':"
+
+#: WWW/Library/Implementation/HTAABrow.c:904
+msgid "This client doesn't know how to compose proxy authorization information for scheme"
+msgstr "Este programa não está preparado para compor autorização proxy neste esquema."
+
+#: WWW/Library/Implementation/HTAABrow.c:983
+msgid "This client doesn't know how to compose authorization information for scheme"
+msgstr "Este programa não está preparado para compor autorizações neste esquema."
+
+#: WWW/Library/Implementation/HTAABrow.c:1093
+#, c-format
+msgid "Invalid header '%s%s%s%s%s'"
+msgstr "Cabeçalho inválido '%s%s%s%s%s'"
+
+#: WWW/Library/Implementation/HTAABrow.c:1198
+msgid "Proxy authorization required -- retrying"
+msgstr "Autorização de proxy requerida -- repetindo"
+
+#: WWW/Library/Implementation/HTAABrow.c:1256
+msgid "Access without authorization denied -- retrying"
+msgstr "Acesso sem autorização não permitido -- repetindo"
+
+#: WWW/Library/Implementation/HTAccess.c:698
+msgid "Access forbidden by rule"
+msgstr "Acesso não permitido pelo regulamento."
+
+#: WWW/Library/Implementation/HTAccess.c:793
+msgid "Document with POST content not found in cache. Resubmit?"
+msgstr "Documento com ação de postagem não encontrado no cache. Reenviar?"
+
+#: WWW/Library/Implementation/HTAccess.c:949
+msgid "Loading failed, use a previous copy."
+msgstr ""
+
+#: WWW/Library/Implementation/HTAccess.c:1058 src/GridText.c:8867
+msgid "Loading incomplete."
+msgstr "Leitura incompleta"
+
+#: WWW/Library/Implementation/HTAccess.c:1089
+#, c-format
+msgid "**** HTAccess: socket or file number returned by obsolete load routine!\n"
+msgstr "**** HTAccess: Socket ou numero de arquivos retornado pela rotina é obsoleto!\n"
+
+#: WWW/Library/Implementation/HTAccess.c:1091
+#, fuzzy, c-format
+#| msgid "**** HTAccess: Internal software error. Please mail lynx_dev@sig.net!\n"
+msgid "**** HTAccess: Internal software error. Please mail lynx-dev@nongnu.org!\n"
+msgstr "HTAccess:Erro interno.Por favor envie email informando para lynx_dev@sig.net!\n"
+
+#: WWW/Library/Implementation/HTAccess.c:1092
+#, c-format
+msgid "**** HTAccess: Status returned was: %d\n"
+msgstr "HTAccess: Retorno de estado foi: %d\n"
+
+#.
+#. * hack: if we fail in HTAccess.c
+#. * avoid duplicating URL, oh.
+#.
+#: WWW/Library/Implementation/HTAccess.c:1098 src/LYMainLoop.c:8050
+msgid "Can't Access"
+msgstr "Não foi possível acessar"
+
+#: WWW/Library/Implementation/HTAccess.c:1106
+msgid "Unable to access document."
+msgstr "Impossível acessar documento."
+
+#: WWW/Library/Implementation/HTFTP.c:849
+#, c-format
+msgid "Enter password for user %s@%s:"
+msgstr "Entre senha para usuário %s@%s:"
+
+#: WWW/Library/Implementation/HTFTP.c:877
+msgid "Unable to connect to FTP host."
+msgstr "Impossível contactar servidor de FTP."
+
+#: WWW/Library/Implementation/HTFTP.c:1158
+msgid "close master socket"
+msgstr "fechado o socket principal."
+
+#: WWW/Library/Implementation/HTFTP.c:1220
+msgid "socket for master socket"
+msgstr "socket para socket principal"
+
+#: WWW/Library/Implementation/HTFTP.c:2986
+msgid "Receiving FTP directory."
+msgstr "Recebendo lista de diretórios do FTP."
+
+#: WWW/Library/Implementation/HTFTP.c:3122
+#, fuzzy, c-format
+#| msgid "Transferred %d bytes"
+msgid "Transferred %d bytes (%5d)"
+msgstr "Transferidos %s bytes."
+
+#: WWW/Library/Implementation/HTFTP.c:3480
+msgid "connect for data"
+msgstr "conectado para dados"
+
+#: WWW/Library/Implementation/HTFTP.c:4141
+msgid "Receiving FTP file."
+msgstr "Recebendo arquivo de FTP."
+
+#: WWW/Library/Implementation/HTFinger.c:278
+msgid "Could not set up finger connection."
+msgstr "Não foi possível conecção pelo finger."
+
+#: WWW/Library/Implementation/HTFinger.c:325
+msgid "Could not load data (no sitename in finger URL)"
+msgstr "Não foi possível ler dados. (sem site definido na URL)"
+
+#: WWW/Library/Implementation/HTFinger.c:329
+msgid "Invalid port number - will only use port 79!"
+msgstr "Porta inválida. - Será usada somente a porta 79!"
+
+#: WWW/Library/Implementation/HTFinger.c:395
+msgid "Could not access finger host."
+msgstr "Não foi possível acessar o servidor pelo finger."
+
+#: WWW/Library/Implementation/HTFinger.c:403
+msgid "No response from finger server."
+msgstr "Sem resposta do comando finger pelo servidor."
+
+#: WWW/Library/Implementation/HTNews.c:421
+#, c-format
+msgid "Username for news host '%s':"
+msgstr "Usuário para o servidor NEWS '%s':"
+
+#: WWW/Library/Implementation/HTNews.c:474
+msgid "Change username?"
+msgstr "Troca o usuário?"
+
+#: WWW/Library/Implementation/HTNews.c:478
+msgid "Username:"
+msgstr "Usuário:"
+
+#: WWW/Library/Implementation/HTNews.c:503
+#, c-format
+msgid "Password for news host '%s':"
+msgstr "Senha para o servidor NEWS '%s':"
+
+#: WWW/Library/Implementation/HTNews.c:586
+msgid "Change password?"
+msgstr "Troca senha?"
+
+#: WWW/Library/Implementation/HTNews.c:1707
+#, c-format
+msgid "No matches for: %s"
+msgstr "Sem combinações para: %s"
+
+#: WWW/Library/Implementation/HTNews.c:1757
+msgid ""
+"\n"
+"No articles in this group.\n"
+msgstr ""
+"\n"
+"Sem objetos neste grupo.\n"
+
+#: WWW/Library/Implementation/HTNews.c:1769
+msgid ""
+"\n"
+"No articles in this range.\n"
+msgstr ""
+"\n"
+"Sem objetos nesta faixa.\n"
+
+#.
+#. * Set window title.
+#.
+#: WWW/Library/Implementation/HTNews.c:1782
+#, c-format
+msgid "%s, Articles %d-%d"
+msgstr "%s, Objetos %d-%d"
+
+#: WWW/Library/Implementation/HTNews.c:1805
+msgid "Earlier articles"
+msgstr "Primeiros objetos"
+
+#: WWW/Library/Implementation/HTNews.c:1818
+#, fuzzy, c-format
+#| msgid ""
+#| "\n"
+#| "There are about %d articles currently available in %s, IDs as follows:\n"
+#| "\n"
+msgid ""
+"\n"
+"There are about %d articles currently available in %s, IDs as follows:\n"
+"\n"
+msgstr ""
+"\n"
+"Existem cerca de %s atualmente disponíveis em %s, Como segue:\n"
+"\n"
+
+#: WWW/Library/Implementation/HTNews.c:1880
+msgid "All available articles in "
+msgstr "Todos os objetos disponíveis em "
+
+#: WWW/Library/Implementation/HTNews.c:2094
+msgid "Later articles"
+msgstr "Próximos objetos"
+
+#: WWW/Library/Implementation/HTNews.c:2117
+msgid "Post to "
+msgstr "Envoar pata "
+
+#: WWW/Library/Implementation/HTNews.c:2338
+msgid "This client does not contain support for SNEWS URLs."
+msgstr "Este programa não contém suporte para SNEWS URLs."
+
+#: WWW/Library/Implementation/HTNews.c:2545
+msgid "No target for raw text!"
+msgstr "Sem destino para texto primário!"
+
+#: WWW/Library/Implementation/HTNews.c:2575
+msgid "Connecting to NewsHost ..."
+msgstr "Conectando ao servidor NEWS..."
+
+#: WWW/Library/Implementation/HTNews.c:2627
+#, c-format
+msgid "Could not access %s."
+msgstr "Não foi possível acessar %s."
+
+#: WWW/Library/Implementation/HTNews.c:2733
+#, c-format
+msgid "Can't read news info. News host %.20s responded: %.200s"
+msgstr "Não foi possível ler notícias. Sservidor NEWS %.20s respondeu: %.200s"
+
+#: WWW/Library/Implementation/HTNews.c:2737
+#, fuzzy, c-format
+#| msgid "Can't read news info. News host %.20s responded: %.200s"
+msgid "Can't read news info, empty response from host %s"
+msgstr "Não foi possível ler notícias. Sservidor NEWS %.20s respondeu: %.200s"
+
+#.
+#. * List available newsgroups. - FM
+#.
+#: WWW/Library/Implementation/HTNews.c:2941
+msgid "Reading list of available newsgroups."
+msgstr "Lendo lista de grupos de NEWS disponíveis."
+
+#: WWW/Library/Implementation/HTNews.c:2962
+msgid "Reading list of articles in newsgroup."
+msgstr "Lendo lista de objetos no grupo de NEWS."
+
+#.
+#. * Get an article from a news group. - FM
+#.
+#: WWW/Library/Implementation/HTNews.c:2968
+msgid "Reading news article."
+msgstr "Lendo objetos de NEWS."
+
+#: WWW/Library/Implementation/HTNews.c:2998
+msgid "Sorry, could not load requested news."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:1286
+#, fuzzy
+#| msgid "Address length looks invalid"
+msgid "Address has invalid port"
+msgstr "Comprimento do endereço parece estar errado"
+
+#: WWW/Library/Implementation/HTTCP.c:1362
+msgid "Address length looks invalid"
+msgstr "Comprimento do endereço parece estar errado"
+
+#: WWW/Library/Implementation/HTTCP.c:1622
+#: WWW/Library/Implementation/HTTCP.c:1640
+#, c-format
+msgid "Unable to locate remote host %s."
+msgstr "Imposs;ivel localizar servidor remoto %s."
+
+#. Not HTProgress, so warning won't be overwritten immediately;
+#. * but not HTAlert, because typically there will be other
+#. * alerts from the callers. - kw
+#.
+#: WWW/Library/Implementation/HTTCP.c:1637
+#: WWW/Library/Implementation/HTTelnet.c:115
+#, c-format
+msgid "Invalid hostname %s"
+msgstr "Servidor inválido %s"
+
+#: WWW/Library/Implementation/HTTCP.c:1651
+#, fuzzy, c-format
+#| msgid "Making %s connection to %s."
+msgid "Making %s connection to %s"
+msgstr "Conectando com %s em %s."
+
+#: WWW/Library/Implementation/HTTCP.c:1662
+msgid "socket failed."
+msgstr "Falha na conecção do socket."
+
+#: WWW/Library/Implementation/HTTCP.c:1676
+#, c-format
+msgid "socket failed: family %d addr %s port %s."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:1700
+msgid "Could not make connection non-blocking."
+msgstr "Não foi possível criar conecção."
+
+#: WWW/Library/Implementation/HTTCP.c:1768
+#, fuzzy
+#| msgid "Connection failed for 180,000 tries."
+msgid "Connection failed (too many retries)."
+msgstr "Conecção falhou apos 180,000 tentativas."
+
+#: WWW/Library/Implementation/HTTCP.c:1955
+msgid "Could not restore socket to blocking."
+msgstr "Impossível restaurar socket para blocagem."
+
+#: WWW/Library/Implementation/HTTCP.c:2021
+#, fuzzy
+#| msgid "Socket read failed for 180,000 tries."
+msgid "Socket read failed (too many tries)."
+msgstr "Leitura do socket falhou após 180,000 tentativas."
+
+#: WWW/Library/Implementation/HTTP.c:81
+#, c-format
+msgid "SSL callback:%s, preverify_ok=%d, ssl_okay=%d"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:432
+#, c-format
+msgid "Address contains a username: %s"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:486
+#, c-format
+msgid "Certificate issued by: %s"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:673
+msgid "This client does not contain support for HTTPS URLs."
+msgstr "Este programa não suporta URLs com HTTPS"
+
+#: WWW/Library/Implementation/HTTP.c:698
+msgid "Unable to connect to remote host."
+msgstr "Impossível conectar ao servidor remoto."
+
+#: WWW/Library/Implementation/HTTP.c:730
+#, fuzzy
+#| msgid "Making %s connection to %s."
+msgid "Retrying connection without TLS."
+msgstr "Conectando com %s em %s."
+
+#: WWW/Library/Implementation/HTTP.c:773
+msgid "no issuer was found"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:775
+msgid "issuer is not a CA"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:777
+msgid "the certificate has no known issuer"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:779
+#, fuzzy
+#| msgid "The cookie has been eaten!"
+msgid "the certificate has been revoked"
+msgstr "O cookie foi destruido!"
+
+#: WWW/Library/Implementation/HTTP.c:781
+msgid "the certificate is not trusted"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:855
+#, c-format
+msgid "Verified connection to %s (cert=%s)"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:903 WWW/Library/Implementation/HTTP.c:945
+#, c-format
+msgid "Verified connection to %s (subj=%s)"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:975
+msgid "Can't find common name in certificate"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:978
+#, c-format
+msgid "SSL error:host(%s)!=cert(%s)-Continue?"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:991
+#, c-format
+msgid "UNVERIFIED connection to %s (cert=%s)"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:1000
+#, c-format
+msgid "Secure %d-bit %s (%s) HTTP connection"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:1467
+msgid "Sending HTTP request."
+msgstr "Enviando requisição HTTP."
+
+#: WWW/Library/Implementation/HTTP.c:1509
+msgid "Unexpected network write error; connection aborted."
+msgstr "Erro inesperado de gravação na rede; conecção abortada."
+
+#: WWW/Library/Implementation/HTTP.c:1515
+msgid "HTTP request sent; waiting for response."
+msgstr "Enviada requisição HTTP; aguardando resposta."
+
+#: WWW/Library/Implementation/HTTP.c:1588
+#: WWW/Library/Implementation/HTTP.c:1598
+msgid "Unexpected network read error; connection aborted."
+msgstr "Erro inesperado de leitura na rede; conecção abortada."
+
+#.
+#. * HTTP/1.1 Informational statuses.
+#. * 100 Continue.
+#. * 101 Switching Protocols.
+#. * > 101 is unknown.
+#. * We should never get these, and they have only the status
+#. * line and possibly other headers, so we'll deal with them by
+#. * showing the full header to the user as text/plain. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:1800
+msgid "Got unexpected Informational Status."
+msgstr "Recebido informação de estado não solicitada."
+
+#.
+#. * Reset Content. The server has fulfilled the request but
+#. * nothing is returned and we should reset any form
+#. * content. We'll instruct the user to do that, and
+#. * restore the current document. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:1834
+msgid "Request fulfilled. Reset Content."
+msgstr "Estouro de requisição. Limpando pedido."
+
+#. Not Modified
+#.
+#. * We didn't send an "If-Modified-Since" header, so this
+#. * status is inappropriate. We'll deal with it by showing
+#. * the full header to the user as text/plain. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:1949
+msgid "Got unexpected 304 Not Modified status."
+msgstr "Recebida resposta de valor 304."
+
+#: WWW/Library/Implementation/HTTP.c:2012
+msgid "Redirection of POST content requires user approval."
+msgstr "Redirecionamento de postagem requer autorização do usuário."
+
+#: WWW/Library/Implementation/HTTP.c:2027
+msgid "Have POST content. Treating Permanent Redirection as Temporary.\n"
+msgstr "Há uma ação de postagem.Tratando redirecionamento permanente como temporário.\n"
+
+#: WWW/Library/Implementation/HTTP.c:2071
+msgid "Retrying with access authorization information."
+msgstr "Repetindo com informações de autorização de acesso."
+
+#: WWW/Library/Implementation/HTTP.c:2083
+msgid "Show the 401 message body?"
+msgstr "Mostra o corpo da mensagem 401?"
+
+#: WWW/Library/Implementation/HTTP.c:2127
+msgid "Show the 407 message body?"
+msgstr "Mostra o corpo da mensagem 407?"
+
+#.
+#. * Bad or unknown server_status number. Take a chance and hope
+#. * there is something to display. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2227
+msgid "Unknown status reply from server!"
+msgstr "Resposta desconhecida de estado do servidor!"
+
+#: WWW/Library/Implementation/HTTelnet.c:113
+#, c-format
+msgid "remote %s session:"
+msgstr "seção remota %s:"
+
+#: WWW/Library/Implementation/HTWAIS.c:163
+msgid "Could not connect to WAIS server."
+msgstr "Não foi possível conectar ao servidor de WAIS."
+
+#: WWW/Library/Implementation/HTWAIS.c:171
+msgid "Could not open WAIS connection for reading."
+msgstr "Não foi possível conectar ao servidor de WAIS para leitura."
+
+#: WWW/Library/Implementation/HTWAIS.c:193
+msgid "Diagnostic code is "
+msgstr "O código de diagnóstido é "
+
+#: WWW/Library/Implementation/HTWAIS.c:464
+msgid "Index "
+msgstr "Arquivo de indexação "
+
+#: WWW/Library/Implementation/HTWAIS.c:468
+#, c-format
+msgid " contains the following %d item%s relevant to \""
+msgstr " contém os segintes %d ítens %s relativos a\""
+
+#: WWW/Library/Implementation/HTWAIS.c:476
+msgid "The first figure after each entry is its relative score, "
+msgstr "A primeira figura após qualquer entrada está em posição relativa, "
+
+#: WWW/Library/Implementation/HTWAIS.c:477
+msgid "the second is the number of lines in the item."
+msgstr "o(a) segundo(a) é i número de linhas no ítem."
+
+#: WWW/Library/Implementation/HTWAIS.c:519
+msgid " (bad file name)"
+msgstr " (Nome incorreto de arquivo)"
+
+#: WWW/Library/Implementation/HTWAIS.c:545
+msgid "(bad doc id)"
+msgstr " (mau id de documento)"
+
+#: WWW/Library/Implementation/HTWAIS.c:561
+msgid "(Short Header record, can't display)"
+msgstr "Campo de cabeçalho curto, não é possível mostrar)"
+
+#: WWW/Library/Implementation/HTWAIS.c:568
+msgid ""
+"\n"
+"Long Header record, can't display\n"
+msgstr ""
+"\n"
+"Campo de cabeçalho longo, não é possível mostrar.\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:575
+msgid ""
+"\n"
+"Text record\n"
+msgstr ""
+"\n"
+"Registro de texto\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:584
+msgid ""
+"\n"
+"Headline record, can't display\n"
+msgstr ""
+"\n"
+"Registro de cabeçalho. Não é possível apresentar.\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:592
+msgid ""
+"\n"
+"Code record, can't display\n"
+msgstr ""
+"\n"
+"Registro de código, não é possível apresentar\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:696
+msgid "Syntax error in WAIS URL"
+msgstr "Erro de sintaxe na URL WAIS"
+
+#: WWW/Library/Implementation/HTWAIS.c:768
+msgid " (WAIS Index)"
+msgstr " (WAIS Index)"
+
+#: WWW/Library/Implementation/HTWAIS.c:775
+msgid "WAIS Index: "
+msgstr "Index WAIS:"
+
+#: WWW/Library/Implementation/HTWAIS.c:781
+msgid "This is a link for searching the "
+msgstr "Esta é uma ligação para procurar o(a)"
+
+#: WWW/Library/Implementation/HTWAIS.c:785
+msgid " WAIS Index.\n"
+msgstr " Index do WAIS.\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:814
+msgid ""
+"\n"
+"Enter the 's'earch command and then specify search words.\n"
+msgstr ""
+"\n"
+"Entre com 's' para procura e especifique as palavras de busca.\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:836
+msgid " (in "
+msgstr " (em "
+
+#: WWW/Library/Implementation/HTWAIS.c:845
+msgid "WAIS Search of \""
+msgstr "Procura WAIS de \""
+
+#: WWW/Library/Implementation/HTWAIS.c:849
+msgid "\" in: "
+msgstr "\" em: "
+
+#: WWW/Library/Implementation/HTWAIS.c:864
+msgid "HTWAIS: Request too large."
+msgstr "HTWAIS: Requisição muito grande."
+
+#: WWW/Library/Implementation/HTWAIS.c:873
+msgid "Searching WAIS database..."
+msgstr "Procurando no banco de dados WAIS..."
+
+#: WWW/Library/Implementation/HTWAIS.c:883
+msgid "Search interrupted."
+msgstr "Procura interrompida."
+
+#: WWW/Library/Implementation/HTWAIS.c:934
+msgid "Can't convert format of WAIS document"
+msgstr "Impossível converter formado do documento WAIS."
+
+#: WWW/Library/Implementation/HTWAIS.c:978
+msgid "HTWAIS: Request too long."
+msgstr "HTWAIS: Requisição muito grande."
+
+#.
+#. * Actually do the transaction given by request_message.
+#.
+#: WWW/Library/Implementation/HTWAIS.c:992
+msgid "Fetching WAIS document..."
+msgstr "Procurando documento WAIS..."
+
+#. display_search_response(target, retrieval_response,
+#. wais_database, keywords);
+#: WWW/Library/Implementation/HTWAIS.c:1031
+msgid "No text was returned!\n"
+msgstr "Não foi retornado texto algum!\n"
+
+#: WWW/Library/Implementation/HTWSRC.c:301
+msgid " NOT GIVEN in source file; "
+msgstr "NÃO ENTREGAR no arquivo de fonte;"
+
+#: WWW/Library/Implementation/HTWSRC.c:324
+msgid " WAIS source file"
+msgstr "Arquivo de fonte do WAIS"
+
+#: WWW/Library/Implementation/HTWSRC.c:331
+msgid " description"
+msgstr " descrição"
+
+#: WWW/Library/Implementation/HTWSRC.c:341
+msgid "Access links"
+msgstr "Acesso de ligações"
+
+#: WWW/Library/Implementation/HTWSRC.c:362
+msgid "Direct access"
+msgstr "Acesso direto"
+
+#. * Proxy will be used if defined, so let user know that - FM *
+#: WWW/Library/Implementation/HTWSRC.c:365
+msgid " (or via proxy server, if defined)"
+msgstr " (ou via servidor de proxy, se definido)"
+
+#: WWW/Library/Implementation/HTWSRC.c:380
+msgid "Maintainer"
+msgstr "Mantenedor"
+
+#: WWW/Library/Implementation/HTWSRC.c:388
+msgid "Host"
+msgstr "Servidor"
+
+#: src/GridText.c:699
+msgid "Memory exhausted, display interrupted!"
+msgstr "Memória exaurida, apresentação interrompida!"
+
+#: src/GridText.c:704
+msgid "Memory exhausted, will interrupt transfer!"
+msgstr "Memória exaurida, srá interrompida a transferência!"
+
+#: src/GridText.c:3685
+msgid " *** MEMORY EXHAUSTED ***"
+msgstr "*** MEMÓRIA EXAURIDA ***"
+
+#: src/GridText.c:6146
+msgid "text entry field"
+msgstr "Campo de entrada de texto"
+
+#: src/GridText.c:6149
+msgid "password entry field"
+msgstr "Campo de entrada de senha"
+
+#: src/GridText.c:6152
+msgid "checkbox"
+msgstr "Caixa de checagem"
+
+#: src/GridText.c:6155
+msgid "radio button"
+msgstr "Botão de rádio"
+
+#: src/GridText.c:6158
+msgid "submit button"
+msgstr "Botão de envio"
+
+#: src/GridText.c:6161
+msgid "reset button"
+msgstr "Botão de limpar"
+
+#: src/GridText.c:6164
+#, fuzzy
+#| msgid "submit button"
+msgid "script button"
+msgstr "Botão de envio"
+
+#: src/GridText.c:6167
+msgid "popup menu"
+msgstr "Menu de pop-up"
+
+#: src/GridText.c:6170
+msgid "hidden form field"
+msgstr "Campo de formulário escondido"
+
+#: src/GridText.c:6173
+msgid "text entry area"
+msgstr "Área de entrada de texto"
+
+#: src/GridText.c:6176
+msgid "range entry field"
+msgstr "Faixa de entrada de texto"
+
+#: src/GridText.c:6179
+msgid "file entry field"
+msgstr "Campo de entrada de arquivo"
+
+#: src/GridText.c:6182
+msgid "text-submit field"
+msgstr "Campo de envio de texto"
+
+#: src/GridText.c:6185
+msgid "image-submit button"
+msgstr "Botão de imagem de envio de formulário"
+
+#: src/GridText.c:6188
+msgid "keygen field"
+msgstr "Campo de 'chave'"
+
+#: src/GridText.c:6191
+msgid "unknown form field"
+msgstr "Campo desconhecido"
+
+#: src/GridText.c:6211 src/GridText.c:6218 src/LYList.c:248
+msgid "unknown field or link"
+msgstr "Campo ou ligacão desconhecidos."
+
+#: src/GridText.c:10649
+#, fuzzy
+#| msgid "Can't open output file! Cancelling!"
+msgid "Can't open file for uploading"
+msgstr "Impossível abrir arquivo de saída! Cancelando!"
+
+#: src/GridText.c:11837
+#, c-format
+msgid "Submitting %s"
+msgstr "Enviando %s"
+
+#. ugliness has happened; inform user and do the best we can
+#: src/GridText.c:12894
+msgid "Hang Detect: TextAnchor struct corrupted - suggest aborting!"
+msgstr ""
+
+#. don't show previous state
+#: src/GridText.c:13056
+msgid "Wrap lines to fit displayed area?"
+msgstr ""
+
+#: src/GridText.c:13696
+msgid "Very long lines have been truncated!"
+msgstr ""
+
+#: src/HTAlert.c:164 src/LYShowInfo.c:364 src/LYShowInfo.c:368
+msgid "bytes"
+msgstr "bytes"
+
+#.
+#. * If we know the total size of the file, we can compute
+#. * a percentage, and show a corresponding progress bar.
+#.
+#: src/HTAlert.c:303 src/HTAlert.c:329
+#, fuzzy, c-format
+#| msgid "Read %ld %s of data"
+msgid "Read %s of data"
+msgstr "Lido %ld %s dos dados"
+
+#: src/HTAlert.c:326
+#, fuzzy, c-format
+#| msgid "Read %ld of %ld %s of data"
+msgid "Read %s of %s of data"
+msgstr "Lido %ld de %ld %s dos dados."
+
+#: src/HTAlert.c:335
+#, fuzzy, c-format
+#| msgid ", %ld %s/sec."
+msgid ", %s/sec"
+msgstr ", %ld %s/sec."
+
+#: src/HTAlert.c:347
+#, c-format
+msgid " (stalled for %s)"
+msgstr ""
+
+#: src/HTAlert.c:351
+#, c-format
+msgid ", ETA %s"
+msgstr ""
+
+#: src/HTAlert.c:373
+msgid " (Press 'z' to abort)"
+msgstr " (Pressione 'z' para abortar)"
+
+#. Meta-note: don't move the following note from its place right
+#. in front of the first gettext(). As it is now, it should
+#. automatically appear in generated lynx.pot files. - kw
+#.
+#. NOTE TO TRANSLATORS: If you provide a translation for "yes", lynx
+#. * will take the first byte of the translation as a positive response
+#. * to Yes/No questions. If you provide a translation for "no", lynx
+#. * will take the first byte of the translation as a negative response
+#. * to Yes/No questions. For both, lynx will also try to show the
+#. * first byte in the prompt as a character, instead of (y) or (n),
+#. * respectively. This will not work right for multibyte charsets!
+#. * Don't translate "yes" and "no" for CJK character sets (or translate
+#. * them to "yes" and "no"). For a translation using UTF-8, don't
+#. * translate if the translation would begin with anything but a 7-bit
+#. * (US_ASCII) character. That also means do not translate if the
+#. * translation would begin with anything but a 7-bit character, if
+#. * you use a single-byte character encoding (a charset like ISO-8859-n)
+#. * but anticipate that the message catalog may be used re-encoded in
+#. * UTF-8 form.
+#. * For translations using other character sets, you may also wish to
+#. * leave "yes" and "no" untranslated, if using (y) and (n) is the
+#. * preferred behavior.
+#. * Lynx will also accept y Y n N as responses unless there is a conflict
+#. * with the first letter of the "yes" or "no" translation.
+#.
+#: src/HTAlert.c:411 src/HTAlert.c:459
+msgid "yes"
+msgstr "sim"
+
+#: src/HTAlert.c:414 src/HTAlert.c:460
+msgid "no"
+msgstr "não"
+
+#.
+#. * Special-purpose workaround for gettext support (we should do
+#. * this in a more general way) -TD
+#. *
+#. * NOTE TO TRANSLATORS: If the prompt has been rendered into
+#. * another language, and if yes/no are distinct, assume the
+#. * translator can make an ordered list in parentheses with one
+#. * capital letter for each as we assumed in HTConfirmDefault().
+#. * The list has to be in the same order as in the original message,
+#. * and the four capital letters chosen to not match those in the
+#. * original unless they have the same position.
+#. *
+#. * Example:
+#. * (Y/N/Always/neVer) - English (original)
+#. * (O/N/Toujours/Jamais) - French
+#.
+#: src/HTAlert.c:913
+msgid "Y/N/A/V"
+msgstr "S/N/P/C"
+
+#: src/HTML.c:5915
+msgid "Description:"
+msgstr "Descrição:"
+
+#: src/HTML.c:5920
+msgid "(none)"
+msgstr " (vazio)"
+
+#: src/HTML.c:5924
+msgid "Filepath:"
+msgstr "Caminho:"
+
+#: src/HTML.c:5930
+msgid "(unknown)"
+msgstr "(desconhecido)"
+
+#: src/HTML.c:7370
+msgid "Document has only hidden links. Use the 'l'ist command."
+msgstr "Documento contém somente ligações ocultas. Use 'l' para listar."
+
+#: src/HTML.c:7869
+msgid "Source cache error - disk full?"
+msgstr ""
+
+#: src/HTML.c:7882
+msgid "Source cache error - not enough memory!"
+msgstr ""
+
+#: src/LYBookmark.c:167
+msgid ""
+" This file is an HTML representation of the X Mosaic hotlist file.\n"
+" Outdated or invalid links may be removed by using the\n"
+" remove bookmark command, it is usually the 'R' key but may have\n"
+" been remapped by you or your system administrator."
+msgstr ""
+" Este arquivo é uma representação HTML do Livro de marcações do\n"
+" Mosaic. Ligações antigas ou inválidas podem ser removidas usando\n"
+" o comando de remover marcação 'R'. Este comando pode ser sido \n"
+" alterado pelo administrador do sistema."
+
+#: src/LYBookmark.c:376
+#, c-format
+msgid ""
+" You can delete links by the 'R' key<br>\n"
+"<ol>\n"
+msgstr ""
+
+#: src/LYBookmark.c:379
+msgid ""
+" You can delete links using the remove bookmark command. It is usually\n"
+" the 'R' key but may have been remapped by you or your system\n"
+" administrator."
+msgstr ""
+" Ligações antigas ou inválidas podem ser removidas usando\n"
+" o comando de remover marcação 'R'. Este comando pode ser sido \n"
+" alterado pelo administrador do sistema."
+
+#: src/LYBookmark.c:383
+msgid ""
+" This file also may be edited with a standard text editor to delete\n"
+" outdated or invalid links, or to change their order."
+msgstr ""
+" Este arquivo também pode ser editado por um editor normal de texto para\n"
+" apagar as ligações antigas ou inválidas, ou para alterar sua ordem.<"
+
+#: src/LYBookmark.c:386
+msgid ""
+"Note: if you edit this file manually\n"
+" you should not change the format within the lines\n"
+" or add other HTML markup.\n"
+" Make sure any bookmark link is saved as a single line."
+msgstr ""
+"Nota: Se você editar este arquivo manualmente, você não deve\n"
+" mudar o formato das linhas ou inserir alguma TAG HTML.\n"
+" Tenha certeza de que cada ligação está salva como uma linha simples."
+
+#: src/LYBookmark.c:684
+#, c-format
+msgid "File may be recoverable from %s during this session"
+msgstr ""
+
+#: src/LYCgi.c:158
+#, c-format
+msgid "Do you want to execute \"%s\"?"
+msgstr ""
+
+#.
+#. * Neither the path as given nor any components examined by backing up
+#. * were stat()able. - kw
+#.
+#: src/LYCgi.c:273
+msgid "Unable to access cgi script"
+msgstr "Impossível acessar script CGI"
+
+#: src/LYCgi.c:707 src/LYCgi.c:710
+msgid "Good Advice"
+msgstr "Conselho útil"
+
+#: src/LYCgi.c:714
+msgid "An excellent http server for VMS is available via"
+msgstr "Um excelente servidor de HTTP para VMS está dispinível via"
+
+#: src/LYCgi.c:721
+msgid "this link"
+msgstr "esta ligação"
+
+#: src/LYCgi.c:725
+msgid "It provides state of the art CGI script support.\n"
+msgstr "Provê o estado do suporte a scripts CGI\n"
+
+#: src/LYClean.c:122
+msgid "Exiting via interrupt:"
+msgstr "Saindo via interrupção:"
+
+#: src/LYCookie.c:2537
+msgid "(from a previous session)"
+msgstr "(De uma seção anterior)"
+
+#: src/LYCookie.c:2598
+msgid "Maximum Gobble Date:"
+msgstr "Data máxima de aquisição:"
+
+#: src/LYCookie.c:2637
+#, fuzzy
+#| msgid " (internal)"
+msgid "Internal"
+msgstr "(interno)"
+
+#: src/LYCookie.c:2638
+msgid "cookie_domain_flag_set error, aborting program"
+msgstr ""
+
+#: src/LYCurses.c:1297
+msgid "Terminal initialisation failed - unknown terminal type?"
+msgstr "Inicialização do terminal falhou - Terminal de tipo desconhecido?"
+
+#: src/LYCurses.c:1780
+msgid "Terminal ="
+msgstr "Terminal ="
+
+#: src/LYCurses.c:1784
+msgid "You must use a vt100, 200, etc. terminal with this program."
+msgstr "Você deve usar um terminal vt100, 200, etc... com este programa."
+
+#: src/LYCurses.c:1833
+msgid "Your Terminal type is unknown!"
+msgstr "O tipo do seu terminal é desconhecido!"
+
+#: src/LYCurses.c:1834
+msgid "Enter a terminal type:"
+msgstr "Entre com o tipo do terminal:"
+
+#: src/LYCurses.c:1848
+msgid "TERMINAL TYPE IS SET TO"
+msgstr "TERMINAL ESTÁ CONFIGURADO PARA"
+
+#: src/LYCurses.c:2398
+#, c-format
+msgid ""
+"\n"
+"A Fatal error has occurred in %s Ver. %s\n"
+msgstr ""
+"\n"
+"Um erro fatal ocorreu em %s Ver. %s\n"
+
+#: src/LYCurses.c:2401
+#, c-format
+msgid ""
+"\n"
+"Please notify your system administrator to confirm a bug, and if\n"
+"confirmed, to notify the lynx-dev list. Bug reports should have concise\n"
+"descriptions of the command and/or URL which causes the problem, the\n"
+"operating system name with version number, the TCPIP implementation, the\n"
+"TRACEBACK if it can be captured, and any other relevant information.\n"
+msgstr ""
+"\n"
+"Por favor, notifique o administrador do sistema para confirmar o nug, e se\n"
+"for confirmado, para notificar a lista lynx-dev. Reportes de bug devem ter\n"
+"uma descrição concisa do comando e/ou URL que causou o problema, o sistema\n"
+"operacional e sua versão, a implementação TCPIP, o 'TRACEBACK' se puder ser\n"
+"capturado, e qualquer outra informação relevante.\n"
+
+#: src/LYEdit.c:272
+#, fuzzy, c-format
+#| msgid "Error processing line %d of %s\n"
+msgid "Error starting editor, %s"
+msgstr "Erro processando linha %d de %s\n"
+
+#: src/LYEdit.c:275
+msgid "Editor killed by signal"
+msgstr ""
+
+#: src/LYEdit.c:280
+#, c-format
+msgid "Editor returned with error status %s"
+msgstr ""
+
+#: src/LYDownload.c:509
+msgid "Downloaded link:"
+msgstr "Ligaçao copiada:"
+
+#: src/LYDownload.c:514
+msgid "Suggested file name:"
+msgstr "Sugestão de nome do arquivo:"
+
+#: src/LYDownload.c:519
+msgid "Standard download options:"
+msgstr "Opções padrão de cópia:"
+
+#: src/LYDownload.c:520
+msgid "Download options:"
+msgstr "Opções de cópia"
+
+#: src/LYDownload.c:536
+msgid "Save to disk"
+msgstr "Salva no disco"
+
+#: src/LYDownload.c:550
+#, fuzzy
+#| msgid "Can't open temporary file!"
+msgid "View temporary file"
+msgstr "Impossível abrir arquivo temporário!"
+
+#: src/LYDownload.c:557
+msgid "Save to disk disabled."
+msgstr "Salvar para o disco está desabilitado."
+
+#: src/LYDownload.c:561 src/LYPrint.c:1322
+msgid "Local additions:"
+msgstr "Adições locais:"
+
+#: src/LYDownload.c:572 src/LYUpload.c:209
+msgid "No Name Given"
+msgstr "Não foi informado nome"
+
+#: src/LYHistory.c:679
+msgid "You selected:"
+msgstr "Você selecionou:"
+
+#: src/LYHistory.c:703 src/LYHistory.c:932
+msgid "(no address)"
+msgstr "(sem endereço)"
+
+#: src/LYHistory.c:707
+msgid " (internal)"
+msgstr "(interno)"
+
+#: src/LYHistory.c:709
+msgid " (was internal)"
+msgstr " (foi interno)"
+
+#: src/LYHistory.c:807
+msgid " (From History)"
+msgstr " (Do histórico)"
+
+#: src/LYHistory.c:852
+msgid "You visited (POSTs, bookmark, menu and list files excluded):"
+msgstr "Você visitou (POSTs, Livro de marcações, menu e listas de arquivos excluidos):"
+
+#: src/LYHistory.c:1154
+msgid "(No messages yet)"
+msgstr ""
+
+#: src/LYLeaks.c:222
+msgid "Invalid pointer detected."
+msgstr "Ponto inválido detectado."
+
+#: src/LYLeaks.c:224 src/LYLeaks.c:262
+msgid "Sequence:"
+msgstr ""
+
+#: src/LYLeaks.c:227 src/LYLeaks.c:265
+msgid "Pointer:"
+msgstr "Ponteiro:"
+
+#: src/LYLeaks.c:236 src/LYLeaks.c:243 src/LYLeaks.c:284
+msgid "FileName:"
+msgstr "Arquivo:"
+
+#: src/LYLeaks.c:239 src/LYLeaks.c:246 src/LYLeaks.c:287 src/LYLeaks.c:298
+msgid "LineCount:"
+msgstr "Numero de Linha(s):"
+
+#: src/LYLeaks.c:260
+msgid "Memory leak detected."
+msgstr "Vazamento de memória detectado."
+
+#: src/LYLeaks.c:268
+msgid "Contains:"
+msgstr "Contém:"
+
+#: src/LYLeaks.c:281
+msgid "ByteSize:"
+msgstr "Tamanho em bytes:"
+
+#: src/LYLeaks.c:295
+msgid "realloced:"
+msgstr "realocado:"
+
+#: src/LYLeaks.c:316
+msgid "Total memory leakage this run:"
+msgstr "Total de memória gasta nesta execução:"
+
+#: src/LYLeaks.c:320
+msgid "Peak allocation"
+msgstr ""
+
+#: src/LYLeaks.c:322
+#, fuzzy
+#| msgid "realloced:"
+msgid "Bytes allocated"
+msgstr "realocado:"
+
+#: src/LYLeaks.c:324
+msgid "Total mallocs"
+msgstr ""
+
+#: src/LYLeaks.c:326
+msgid "Total frees"
+msgstr ""
+
+#: src/LYList.c:88
+msgid "References in "
+msgstr "Referências em "
+
+#: src/LYList.c:91
+msgid "this document:"
+msgstr "este documento:"
+
+#: src/LYList.c:97
+msgid "Visible links:"
+msgstr "Ligações visíveis:"
+
+#: src/LYList.c:201 src/LYList.c:312
+msgid "Hidden links:"
+msgstr "Ligações escondidas:"
+
+#: src/LYList.c:349
+msgid "References"
+msgstr "Referências"
+
+#: src/LYList.c:353
+msgid "Visible links"
+msgstr "Ligações visíveis"
+
+#: src/LYLocal.c:289
+#, c-format
+msgid "Unable to get status of '%s'."
+msgstr "Impossível pegar estado de '%s'."
+
+#: src/LYLocal.c:354
+msgid "The selected item is not a file or a directory! Request ignored."
+msgstr "O ítem selecionado não é um diretório ou arquivo! Requisição ignorada."
+
+#: src/LYLocal.c:455
+#, c-format
+msgid "Unable to %s due to system error!"
+msgstr "Impossível executar %s em razão de falha do sistema!"
+
+#: src/LYLocal.c:489
+#, c-format
+msgid "Probable failure to %s due to system error!"
+msgstr "Falha possível em %s devido a falha do sistema!"
+
+#: src/LYLocal.c:554 src/LYLocal.c:577
+#, c-format
+msgid "remove %s"
+msgstr "remove %s"
+
+#: src/LYLocal.c:597
+#, c-format
+msgid "touch %s"
+msgstr ""
+
+#: src/LYLocal.c:627
+#, c-format
+msgid "move %s to %s"
+msgstr "move %s para %s"
+
+#: src/LYLocal.c:675
+msgid "There is already a directory with that name! Request ignored."
+msgstr "Já existe um diretório com este nome! Requisição ignorada."
+
+#: src/LYLocal.c:677
+msgid "There is already a file with that name! Request ignored."
+msgstr "Já existe um arquivo com este nome! Requisição ignorada."
+
+#: src/LYLocal.c:679
+msgid "The specified name is already in use! Request ignored."
+msgstr "O nome especificado já está em uso! Requisição ignorada."
+
+#: src/LYLocal.c:691
+msgid "Destination has different owner! Request denied."
+msgstr "Destino tem um dono difwerente! Requisição impedida."
+
+#: src/LYLocal.c:694
+msgid "Destination is not a valid directory! Request denied."
+msgstr "Destino não é um diretório válido! Requisição impedida."
+
+#: src/LYLocal.c:710
+msgid "Source and destination are the same location! Request ignored!"
+msgstr "Fonte e destino são o mesmo local! Requisição ignorada!"
+
+#: src/LYLocal.c:734
+#, fuzzy
+#| msgid "Remove all tagged files and directories "
+msgid "Remove all tagged files and directories?"
+msgstr "Remove todos os diretórios e arquivos marcados"
+
+#: src/LYLocal.c:807
+msgid "Enter new location for tagged items: "
+msgstr "Entre com novo local para itens marcados:"
+
+#: src/LYLocal.c:905
+msgid "Enter new name for directory: "
+msgstr "Entre com o novo nome para o diretório:"
+
+#: src/LYLocal.c:907
+msgid "Enter new name for file: "
+msgstr "Entre com o novo nome do arquivo:"
+
+#: src/LYLocal.c:919
+#, fuzzy
+#| msgid "Illegal character \"/\" found! Request ignored."
+msgid "Illegal character (path-separator) found! Request ignored."
+msgstr "Caractere inválido \"/\" encontrado! requisição ignorada."
+
+#: src/LYLocal.c:969
+msgid "Enter new location for directory: "
+msgstr "Entre com novo local para o diretório:"
+
+#: src/LYLocal.c:971
+msgid "Enter new location for file: "
+msgstr "Entre com novo local para o arquivo:"
+
+#: src/LYLocal.c:998
+#, fuzzy
+#| msgid "Unexpected failure - unable to find trailing \"/\""
+msgid "Unexpected failure - unable to find trailing path separator"
+msgstr "Falha inexperada - Impossível encontrar caminho \"/\""
+
+#: src/LYLocal.c:1060
+msgid "Modify name, location, or permission (n, l, or p): "
+msgstr "Modifica nome, local, ou permissão (n,l,p):"
+
+#: src/LYLocal.c:1062
+#, fuzzy
+#| msgid "Modify name, or location (n or l): "
+msgid "Modify name or location (n or l): "
+msgstr "Modifica nome ou local (n,l):"
+
+#.
+#. * Code for changing ownership needed here.
+#.
+#: src/LYLocal.c:1091
+msgid "This feature not yet implemented!"
+msgstr "Esta propriedade não foi implementada ainda!"
+
+#: src/LYLocal.c:1112
+msgid "Enter name of file to create: "
+msgstr "Entre com o nome do arquivo a ser criado:"
+
+#: src/LYLocal.c:1115 src/LYLocal.c:1152
+msgid "Illegal redirection \"//\" found! Request ignored."
+msgstr "Redirecionamento ilegal \"//\" encontrado! Requisição ignorada."
+
+#: src/LYLocal.c:1149
+msgid "Enter name for new directory: "
+msgstr "Entre com o nome para o novo diretório:"
+
+#: src/LYLocal.c:1190
+msgid "Create file or directory (f or d): "
+msgstr "Criar 'f' arquivo ou 'd' diretório (f ou d):"
+
+#: src/LYLocal.c:1232
+#, fuzzy, c-format
+#| msgid "Remove file '%s': "
+msgid "Remove directory '%s'?"
+msgstr "Remove arquivo '%s':"
+
+#: src/LYLocal.c:1235
+#, fuzzy
+#| msgid " directory"
+msgid "Remove directory?"
+msgstr " diretório"
+
+#: src/LYLocal.c:1240
+#, fuzzy, c-format
+#| msgid "Remove file '%s': "
+msgid "Remove file '%s'?"
+msgstr "Remove arquivo '%s':"
+
+#: src/LYLocal.c:1242
+#, fuzzy
+#| msgid "Remove file: "
+msgid "Remove file?"
+msgstr "Remove arquivo:"
+
+#: src/LYLocal.c:1247
+#, fuzzy, c-format
+#| msgid "Remove symbolic link '%s': "
+msgid "Remove symbolic link '%s'?"
+msgstr "Remove uma ligação simbólcia '%s':"
+
+#: src/LYLocal.c:1249
+#, fuzzy
+#| msgid "Remove symbolic link: "
+msgid "Remove symbolic link?"
+msgstr "Remove ligação simbólica:"
+
+#: src/LYLocal.c:1347
+msgid "Sorry, don't know how to permit non-UNIX files yet."
+msgstr "Desculpe, não sei como permitir arquivos não-UNIX ainda."
+
+#: src/LYLocal.c:1376
+msgid "Unable to open permit options file"
+msgstr "Impossível abrir arquivo de opções de permissão"
+
+#: src/LYLocal.c:1404
+msgid "Specify permissions below:"
+msgstr "Especifique as permissões abaixo:"
+
+#: src/LYLocal.c:1405 src/LYShowInfo.c:265
+msgid "Owner:"
+msgstr "Dono:"
+
+#: src/LYLocal.c:1421
+msgid "Group"
+msgstr "Grupo"
+
+#: src/LYLocal.c:1437
+msgid "Others:"
+msgstr "Outros:"
+
+#: src/LYLocal.c:1455
+msgid "form to permit"
+msgstr "forma como permitir"
+
+#: src/LYLocal.c:1551
+msgid "Invalid mode format."
+msgstr "Formato de modo inválido"
+
+#: src/LYLocal.c:1555
+msgid "Invalid syntax format."
+msgstr "Formato da sintaxe inválido."
+
+#: src/LYLocal.c:1742
+msgid "Warning! UUDecoded file will exist in the directory you started Lynx."
+msgstr "Atenção! UUDecodificação ficará no diretório onde você chamou o Lynx."
+
+#: src/LYLocal.c:1932
+msgid "NULL URL pointer"
+msgstr "Ponteiro de URL vazio"
+
+#: src/LYLocal.c:2014
+#, c-format
+msgid "Executing %s "
+msgstr "Executando %s "
+
+#: src/LYLocal.c:2017
+msgid "Executing system command. This might take a while."
+msgstr "Executando comando de sistema. Isto pode demorar um pouco."
+
+#: src/LYLocal.c:2091
+msgid "Current directory:"
+msgstr "Diretório corrente:"
+
+#: src/LYLocal.c:2094 src/LYLocal.c:2112
+msgid "Current selection:"
+msgstr "Seleção corrente:"
+
+#: src/LYLocal.c:2098
+msgid "Nothing currently selected."
+msgstr "Nada foi selecionado."
+
+#: src/LYLocal.c:2114
+msgid "tagged item:"
+msgstr "item marcado:"
+
+#: src/LYLocal.c:2115
+msgid "tagged items:"
+msgstr "itens marcados:"
+
+#: src/LYLocal.c:2215 src/LYLocal.c:2224
+msgid "Illegal filename; request ignored."
+msgstr "Nome de arquivo inválido. Requisição ignorada."
+
+#. directory not writable
+#: src/LYLocal.c:2322 src/LYLocal.c:2381
+msgid "Install in the selected directory not permitted."
+msgstr "Instalação no diretório selecionado não é possivel."
+
+#: src/LYLocal.c:2377
+msgid "The selected item is not a directory! Request ignored."
+msgstr "O item selecionado não é um diretório. Requisição ignorada."
+
+#: src/LYLocal.c:2386
+msgid "Just a moment, ..."
+msgstr "Só um momento..."
+
+#: src/LYLocal.c:2403
+msgid "Error building install args"
+msgstr ""
+
+#: src/LYLocal.c:2418 src/LYLocal.c:2449
+#, c-format
+msgid "Source and target are the same: %s"
+msgstr ""
+
+#: src/LYLocal.c:2425 src/LYLocal.c:2456
+#, fuzzy, c-format
+#| msgid "Reading directory..."
+msgid "Already in target directory: %s"
+msgstr "Lendo diretório..."
+
+#: src/LYLocal.c:2474
+msgid "Installation complete"
+msgstr "Instalação completa."
+
+#: src/LYLocal.c:2666
+msgid "Temporary URL or list would be too long."
+msgstr "URL temporário ou lista podem estar muito longas."
+
+#: src/LYMail.c:544
+msgid "Sending"
+msgstr "Enviando"
+
+#: src/LYMail.c:1030
+#, c-format
+msgid "The link %s :?: %s \n"
+msgstr "A ligação %s :?: %s \n"
+
+#: src/LYMail.c:1032
+#, c-format
+msgid "called \"%s\"\n"
+msgstr "chamado(a) \"%s\"\n"
+
+#: src/LYMail.c:1033
+#, c-format
+msgid "in the file \"%s\" called \"%s\"\n"
+msgstr "no arquivo \"%s\" chamado \"%s\" \n"
+
+#: src/LYMail.c:1034
+msgid "was requested but was not available."
+msgstr "foi requisitado mas não está disponível."
+
+#: src/LYMail.c:1035
+msgid "Thought you might want to know."
+msgstr "Embora você possa querer saber."
+
+#: src/LYMail.c:1037
+msgid "This message was automatically generated by"
+msgstr "Esta mensagem foi gerada automaticamente por"
+
+#: src/LYMail.c:1751
+msgid "No system mailer configured"
+msgstr ""
+
+#: src/LYMain.c:1049
+msgid "No Winsock found, sorry."
+msgstr "Não foi encontrado o Winsock, desculpe."
+
+#: src/LYMain.c:1240
+#, fuzzy
+#| msgid "You MUST define a valid TMP or TEMP area!\n"
+msgid "You MUST define a valid TMP or TEMP area!"
+msgstr "Você deve definir uma área TMP ou TEMP válida!\n"
+
+#: src/LYMain.c:1293 src/LYMainLoop.c:5260
+#, fuzzy
+#| msgid " directory"
+msgid "No such directory"
+msgstr " diretório"
+
+#: src/LYMain.c:1487
+#, fuzzy, c-format
+#| msgid ""
+#| "\n"
+#| "Configuration file %s is not available.\n"
+#| "\n"
+msgid ""
+"\n"
+"Configuration file \"%s\" is not available.\n"
+"\n"
+msgstr ""
+"\n"
+"Arquivo %s de configuração não está disponível.\n"
+
+#: src/LYMain.c:1497
+#, c-format
+msgid ""
+"\n"
+"Lynx character sets not declared.\n"
+"\n"
+msgstr ""
+"\n"
+"Não foi declarada uma coleção de caracteres Lynx.\n"
+" \n"
+
+#: src/LYMain.c:1526
+#, c-format
+msgid ""
+"\n"
+"Lynx edit map not declared.\n"
+"\n"
+msgstr ""
+"\n"
+"Editor de mapas Lynx não foi declarado.\n"
+" \n"
+
+#: src/LYMain.c:1608
+#, fuzzy, c-format
+#| msgid ""
+#| "\n"
+#| "Lynx file %s is not available.\n"
+#| "\n"
+msgid ""
+"\n"
+"Lynx file \"%s\" is not available.\n"
+"\n"
+msgstr ""
+"\n"
+"Arquivo Lynx %s não está disponível.\n"
+" \n"
+
+#: src/LYMain.c:1683
+#, c-format
+msgid "Ignored %d characters from standard input.\n"
+msgstr ""
+
+#: src/LYMain.c:1685
+#, c-format
+msgid "Use \"-stdin\" or \"-\" to tell how to handle piped input.\n"
+msgstr ""
+
+#: src/LYMain.c:1843
+msgid "Warning:"
+msgstr ""
+
+#: src/LYMain.c:2408
+msgid "persistent cookies state will be changed in next session only."
+msgstr "O estado dos cookies permanentes será alterado na próxima seção."
+
+#: src/LYMain.c:2644 src/LYMain.c:2689
+#, c-format
+msgid "Lynx: ignoring unrecognized charset=%s\n"
+msgstr ""
+
+#: src/LYMain.c:3208
+#, fuzzy, c-format
+#| msgid ""
+#| "\n"
+#| "%s Version %s (%.*s)\n"
+msgid "%s Version %s (%s)"
+msgstr ""
+"\n"
+"Versão %s (%.*s)\n"
+
+#: src/LYMain.c:3246
+#, c-format
+msgid "Built on %s %s %s\n"
+msgstr "Criado em %s %s %s\n"
+
+#: src/LYMain.c:3268
+msgid "Copyrights held by the Lynx Developers Group,"
+msgstr ""
+
+#: src/LYMain.c:3269
+#, fuzzy
+#| msgid "Copyrights held by the University of Kansas, CERN, and other contributors.\n"
+msgid "the University of Kansas, CERN, and other contributors."
+msgstr "Copyrights mantidos pela University of Kansas, CERN, e outros colaboradores.\n"
+
+#: src/LYMain.c:3270
+#, fuzzy
+#| msgid "Distributed under the GNU General Public License.\n"
+msgid "Distributed under the GNU General Public License (Version 2)."
+msgstr "Distribuido pela GNU General Public License.\n"
+
+#: src/LYMain.c:3271
+#, fuzzy
+#| msgid ""
+#| "See http://lynx.browser.org/ and the online help for more information.\n"
+#| "\n"
+msgid "See http://lynx.isc.org/ and the online help for more information."
+msgstr ""
+"Veja http://lynx.browser.org/ e o help on-line para mais informações.\n"
+"\n"
+
+#: src/LYMain.c:4104
+#, c-format
+msgid "USAGE: %s [options] [file]\n"
+msgstr "USO: %s [opções] [arquivo]\n"
+
+#: src/LYMain.c:4105
+#, c-format
+msgid "Options are:\n"
+msgstr "Opções são:\n"
+
+#: src/LYMain.c:4406
+#, c-format
+msgid "%s: Invalid Option: %s\n"
+msgstr "%s: Opção inválida: %s\n"
+
+#: src/LYMainLoop.c:575
+#, c-format
+msgid "Internal error: Invalid mouse link %d!"
+msgstr ""
+
+#: src/LYMainLoop.c:696 src/LYMainLoop.c:5282
+msgid "A URL specified by the user"
+msgstr "Uma URL especificada pelo usuário"
+
+#: src/LYMainLoop.c:1148
+msgid "Enctype multipart/form-data not yet supported! Cannot submit."
+msgstr "multipart/form-data não é suportado ainda! Impossível enviar."
+
+#.
+#. * Make a name for this help file.
+#.
+#: src/LYMainLoop.c:3177
+msgid "Help Screen"
+msgstr "Tela de Ajuda"
+
+#: src/LYMainLoop.c:3308
+msgid "System Index"
+msgstr "Indexador de sistema"
+
+#: src/LYMainLoop.c:3556
+#, c-format
+msgid "Query parameter %d: "
+msgstr ""
+
+#: src/LYMainLoop.c:3781 src/LYMainLoop.c:5558
+msgid "Entry into main screen"
+msgstr "Entrada na tela principal"
+
+#: src/LYMainLoop.c:4039
+msgid "No next document present"
+msgstr ""
+
+#: src/LYMainLoop.c:4334
+#, fuzzy
+#| msgid "charset for this document specified explicitely, sorry..."
+msgid "charset for this document specified explicitly, sorry..."
+msgstr "O mapa de caracteres deve ser explicito no documento, desculpe..."
+
+#: src/LYMainLoop.c:5240
+msgid "cd to:"
+msgstr ""
+
+#: src/LYMainLoop.c:5263
+msgid "A component of path is not a directory"
+msgstr ""
+
+#: src/LYMainLoop.c:5266
+#, fuzzy
+#| msgid "Could not access directory."
+msgid "failed to change directory"
+msgstr "Impossível acessar diretório."
+
+#: src/LYMainLoop.c:6496
+msgid "Reparsing document under current settings..."
+msgstr "Reinterpretando documento pelas opções atuais..."
+
+#: src/LYMainLoop.c:6790
+#, c-format
+msgid "Fatal error - could not open output file %s\n"
+msgstr "Erro fatal - não foi possível abrir arquivo %s\n"
+
+#: src/LYMainLoop.c:7128
+msgid "TABLE center enable."
+msgstr ""
+
+#: src/LYMainLoop.c:7131
+msgid "TABLE center disable."
+msgstr ""
+
+#: src/LYMainLoop.c:7211
+#, fuzzy
+#| msgid "Current directory:"
+msgid "Current URL is empty."
+msgstr "Diretório corrente:"
+
+#: src/LYMainLoop.c:7213 src/LYUtils.c:1881
+msgid "Copy to clipboard failed."
+msgstr ""
+
+#: src/LYMainLoop.c:7215
+msgid "Document URL put to clipboard."
+msgstr ""
+
+#: src/LYMainLoop.c:7217
+msgid "Link URL put to clipboard."
+msgstr ""
+
+#: src/LYMainLoop.c:7244
+msgid "No URL in the clipboard."
+msgstr ""
+
+#: src/LYMainLoop.c:7936 src/LYMainLoop.c:8105
+#, fuzzy
+#| msgid " index"
+msgid "-index-"
+msgstr " index"
+
+#: src/LYMainLoop.c:8045
+msgid "lynx: Can't access startfile"
+msgstr "lynx: Não foi possível acessar o arquivo principal"
+
+#: src/LYMainLoop.c:8057
+msgid "lynx: Start file could not be found or is not text/html or text/plain"
+msgstr "lynx: Arquivo inicial não pode ser encontrado ou não é texto/HTML"
+
+#: src/LYMainLoop.c:8058
+msgid " Exiting..."
+msgstr " Saindo..."
+
+#: src/LYMainLoop.c:8099
+msgid "-more-"
+msgstr ""
+
+#. Enable scrolling.
+#: src/LYNews.c:186
+msgid "You will be posting to:"
+msgstr "Você estará postando para:"
+
+#.
+#. * Get the mail address for the From header, offering personal_mail_address
+#. * as default.
+#.
+#: src/LYNews.c:195
+msgid ""
+"\n"
+"\n"
+" Please provide your mail address for the From: header\n"
+msgstr ""
+"\n"
+"\n"
+" Por favor forneça seu endereço de email para o cabeçalho\n"
+
+#.
+#. * Get the Subject header, offering the current document's title as the
+#. * default if this is a followup rather than a new post. - FM
+#.
+#: src/LYNews.c:212
+msgid ""
+"\n"
+"\n"
+" Please provide or edit the Subject: header\n"
+msgstr ""
+"\n"
+"\n"
+"Por favor forneça ou edite o Assunto:\n"
+
+#: src/LYNews.c:302
+msgid ""
+"\n"
+"\n"
+" Please provide or edit the Organization: header\n"
+msgstr ""
+"\n"
+"\n"
+"Por favor forneça ou edite a Empresa:\n"
+
+#.
+#. * Use the built in line editior.
+#.
+#: src/LYNews.c:359
+msgid ""
+"\n"
+"\n"
+" Please enter your message below."
+msgstr ""
+"\n"
+"\n"
+"Por favor, entre com sua mensagem abaixo."
+
+#: src/LYNews.c:405
+msgid "Message has no original text!"
+msgstr "Mensagem não tem texto original!"
+
+#: src/LYOptions.c:770
+msgid "review/edit B)ookmarks files"
+msgstr "rever/editar B) Livro de Marcações"
+
+#: src/LYOptions.c:772
+msgid "B)ookmark file: "
+msgstr "B) Livro de Marcações:"
+
+#: src/LYOptions.c:2120 src/LYOptions.c:2127
+msgid "ON"
+msgstr ""
+
+#. verbose_img variable
+#: src/LYOptions.c:2121 src/LYOptions.c:2126 src/LYOptions.c:2289
+#: src/LYOptions.c:2300
+msgid "OFF"
+msgstr ""
+
+#: src/LYOptions.c:2122
+msgid "NEVER"
+msgstr ""
+
+#: src/LYOptions.c:2123
+msgid "ALWAYS"
+msgstr ""
+
+#: src/LYOptions.c:2139 src/LYOptions.c:2281
+msgid "ignore"
+msgstr ""
+
+#: src/LYOptions.c:2140
+msgid "ask user"
+msgstr ""
+
+#: src/LYOptions.c:2141
+msgid "accept all"
+msgstr ""
+
+#: src/LYOptions.c:2153
+msgid "ALWAYS OFF"
+msgstr ""
+
+#: src/LYOptions.c:2154
+msgid "FOR LOCAL FILES ONLY"
+msgstr ""
+
+#: src/LYOptions.c:2156
+msgid "ALWAYS ON"
+msgstr ""
+
+#: src/LYOptions.c:2168
+msgid "Numbers act as arrows"
+msgstr ""
+
+#: src/LYOptions.c:2170
+msgid "Links are numbered"
+msgstr ""
+
+#: src/LYOptions.c:2173
+msgid "Links and form fields are numbered"
+msgstr ""
+
+#: src/LYOptions.c:2176
+msgid "Form fields are numbered"
+msgstr ""
+
+#: src/LYOptions.c:2191
+msgid "Case insensitive"
+msgstr ""
+
+#: src/LYOptions.c:2192
+msgid "Case sensitive"
+msgstr ""
+
+#: src/LYOptions.c:2216
+msgid "prompt normally"
+msgstr ""
+
+#: src/LYOptions.c:2217
+msgid "force yes-response"
+msgstr ""
+
+#: src/LYOptions.c:2218
+msgid "force no-response"
+msgstr ""
+
+#: src/LYOptions.c:2236
+msgid "Novice"
+msgstr ""
+
+#: src/LYOptions.c:2237
+msgid "Intermediate"
+msgstr ""
+
+#: src/LYOptions.c:2238
+msgid "Advanced"
+msgstr ""
+
+#: src/LYOptions.c:2247
+msgid "By First Visit"
+msgstr ""
+
+#: src/LYOptions.c:2249
+msgid "By First Visit Reversed"
+msgstr ""
+
+#: src/LYOptions.c:2250
+msgid "As Visit Tree"
+msgstr ""
+
+#: src/LYOptions.c:2251
+msgid "By Last Visit"
+msgstr ""
+
+#: src/LYOptions.c:2253
+msgid "By Last Visit Reversed"
+msgstr ""
+
+#. Old_DTD variable
+#: src/LYOptions.c:2264
+msgid "relaxed (TagSoup mode)"
+msgstr ""
+
+#: src/LYOptions.c:2265
+msgid "strict (SortaSGML mode)"
+msgstr ""
+
+#: src/LYOptions.c:2272
+msgid "Ignore"
+msgstr ""
+
+#: src/LYOptions.c:2273
+msgid "Add to trace-file"
+msgstr ""
+
+#: src/LYOptions.c:2274
+msgid "Add to LYNXMESSAGES"
+msgstr ""
+
+#: src/LYOptions.c:2275
+#, fuzzy
+#| msgid "Points to file:"
+msgid "Warn, point to trace-file"
+msgstr "Ponteiros para o arquivo:"
+
+#: src/LYOptions.c:2282
+msgid "as labels"
+msgstr ""
+
+#: src/LYOptions.c:2283
+#, fuzzy
+#| msgid "this link"
+msgid "as links"
+msgstr "esta ligação"
+
+#: src/LYOptions.c:2290
+#, fuzzy
+#| msgid " (bad file name)"
+msgid "show filename"
+msgstr " (Nome incorreto de arquivo)"
+
+#: src/LYOptions.c:2301
+msgid "STANDARD"
+msgstr ""
+
+#: src/LYOptions.c:2302
+msgid "ADVANCED"
+msgstr ""
+
+#: src/LYOptions.c:2336
+#, fuzzy
+#| msgid "Subdirectories:"
+msgid "Directories first"
+msgstr "Subdiretórios:"
+
+#: src/LYOptions.c:2337
+#, fuzzy
+#| msgid " first."
+msgid "Files first"
+msgstr " primeiro."
+
+#: src/LYOptions.c:2338
+msgid "Mixed style"
+msgstr ""
+
+#: src/LYOptions.c:2346 src/LYOptions.c:2366
+#, fuzzy
+#| msgid "Name:"
+msgid "By Name"
+msgstr "Nome:"
+
+#: src/LYOptions.c:2347 src/LYOptions.c:2367
+msgid "By Type"
+msgstr ""
+
+#: src/LYOptions.c:2348 src/LYOptions.c:2368
+#, fuzzy
+#| msgid "ByteSize:"
+msgid "By Size"
+msgstr "Tamanho em bytes:"
+
+#: src/LYOptions.c:2349 src/LYOptions.c:2369
+#, fuzzy
+#| msgid "Date:"
+msgid "By Date"
+msgstr "Data:"
+
+#: src/LYOptions.c:2350
+msgid "By Mode"
+msgstr ""
+
+#: src/LYOptions.c:2352
+msgid "By User"
+msgstr ""
+
+#: src/LYOptions.c:2353
+#, fuzzy
+#| msgid "Group"
+msgid "By Group"
+msgstr "Grupo"
+
+#: src/LYOptions.c:2378
+msgid "Do not show rate"
+msgstr ""
+
+#: src/LYOptions.c:2379 src/LYOptions.c:2380
+#, c-format
+msgid "Show %s/sec rate"
+msgstr ""
+
+#: src/LYOptions.c:2382 src/LYOptions.c:2383
+#, c-format
+msgid "Show %s/sec, ETA"
+msgstr ""
+
+#: src/LYOptions.c:2386
+msgid "Show progressbar"
+msgstr ""
+
+#: src/LYOptions.c:2398
+msgid "Accept lynx's internal types"
+msgstr ""
+
+#: src/LYOptions.c:2399
+msgid "Also accept lynx.cfg's types"
+msgstr ""
+
+#: src/LYOptions.c:2400
+msgid "Also accept user's types"
+msgstr ""
+
+#: src/LYOptions.c:2401
+msgid "Also accept system's types"
+msgstr ""
+
+#: src/LYOptions.c:2402
+#, fuzzy
+#| msgid "Accept Changes"
+msgid "Accept all types"
+msgstr "Aceitar mudanças"
+
+#: src/LYOptions.c:2411
+msgid "gzip"
+msgstr ""
+
+#: src/LYOptions.c:2412
+msgid "deflate"
+msgstr ""
+
+#: src/LYOptions.c:2415
+msgid "compress"
+msgstr ""
+
+#: src/LYOptions.c:2418
+msgid "bzip2"
+msgstr ""
+
+#: src/LYOptions.c:2420
+msgid "All"
+msgstr ""
+
+#: src/LYOptions.c:2699 src/LYOptions.c:2728
+#, c-format
+msgid "Use %s to invoke the Options menu!"
+msgstr ""
+
+#: src/LYOptions.c:3541
+msgid "(options marked with (!) will not be saved)"
+msgstr ""
+
+#: src/LYOptions.c:3549
+#, fuzzy
+#| msgid "Personal Preferences"
+msgid "General Preferences"
+msgstr "Preferências pessoais"
+
+#. ***************************************************************
+#. User Mode: SELECT
+#: src/LYOptions.c:3553
+msgid "User mode"
+msgstr "Modo usuário"
+
+#. Editor: INPUT
+#: src/LYOptions.c:3559
+msgid "Editor"
+msgstr "Editor"
+
+#. Search Type: SELECT
+#: src/LYOptions.c:3564
+msgid "Type of Search"
+msgstr ""
+
+#: src/LYOptions.c:3569
+msgid "Security and Privacy"
+msgstr ""
+
+#. ***************************************************************
+#. Cookies: SELECT
+#: src/LYOptions.c:3573
+msgid "Cookies"
+msgstr "Cookies"
+
+#. Cookie Prompting: SELECT
+#: src/LYOptions.c:3587
+msgid "Invalid-Cookie Prompting"
+msgstr ""
+
+#. SSL Prompting: SELECT
+#: src/LYOptions.c:3594
+msgid "SSL Prompting"
+msgstr ""
+
+#: src/LYOptions.c:3600
+msgid "Keyboard Input"
+msgstr ""
+
+#. ***************************************************************
+#. Keypad Mode: SELECT
+#: src/LYOptions.c:3604
+msgid "Keypad mode"
+msgstr "Modo Keypad"
+
+#. Emacs keys: ON/OFF
+#: src/LYOptions.c:3610
+msgid "Emacs keys"
+msgstr "Teclas Emacs"
+
+#. VI Keys: ON/OFF
+#: src/LYOptions.c:3616
+msgid "VI keys"
+msgstr "Teclas VI"
+
+#. Line edit style: SELECT
+#. well, at least 2 line edit styles available
+#: src/LYOptions.c:3623
+msgid "Line edit style"
+msgstr ""
+
+#. Keyboard layout: SELECT
+#: src/LYOptions.c:3635
+msgid "Keyboard layout"
+msgstr ""
+
+#.
+#. * Display and Character Set
+#.
+#: src/LYOptions.c:3649
+#, fuzzy
+#| msgid "Display character set"
+msgid "Display and Character Set"
+msgstr "Mostra mapa de caracteres"
+
+#. Use locale-based character set: ON/OFF
+#: src/LYOptions.c:3654
+#, fuzzy
+#| msgid "Display character set"
+msgid "Use locale-based character set"
+msgstr "Mostra mapa de caracteres"
+
+#: src/LYOptions.c:3661
+msgid "Use HTML5 charset replacements"
+msgstr ""
+
+#. Display Character Set: SELECT
+#: src/LYOptions.c:3667
+msgid "Display character set"
+msgstr "Mostra mapa de caracteres"
+
+#: src/LYOptions.c:3698
+msgid "Assumed document character set"
+msgstr "Assumindo mapa de caracteres do documento"
+
+#.
+#. * Since CJK people hardly mixed with other world
+#. * we split the header to make it more readable:
+#. * "CJK mode" for CJK display charsets, and "Raw 8-bit" for others.
+#.
+#: src/LYOptions.c:3718
+msgid "CJK mode"
+msgstr "Modo CJK"
+
+#: src/LYOptions.c:3720
+msgid "Raw 8-bit"
+msgstr "Raw 8-bit"
+
+#. X Display: INPUT
+#: src/LYOptions.c:3728
+msgid "X Display"
+msgstr "Visual X"
+
+#.
+#. * Document Appearance
+#.
+#: src/LYOptions.c:3734
+msgid "Document Appearance"
+msgstr ""
+
+#: src/LYOptions.c:3740
+msgid "Show color"
+msgstr "Mostra cor"
+
+#. Show cursor: ON/OFF
+#: src/LYOptions.c:3764
+msgid "Show cursor"
+msgstr "Mostra cursor"
+
+#. Underline links: ON/OFF
+#: src/LYOptions.c:3770
+#, fuzzy
+#| msgid "Hidden links:"
+msgid "Underline links"
+msgstr "Ligações escondidas:"
+
+#. Show scrollbar: ON/OFF
+#: src/LYOptions.c:3777
+#, fuzzy
+#| msgid "Show color"
+msgid "Show scrollbar"
+msgstr "Mostra cor"
+
+#. Select Popups: ON/OFF
+#: src/LYOptions.c:3784
+msgid "Popups for select fields"
+msgstr "Pop-ups para os campos selecionados"
+
+#. HTML error recovery: SELECT
+#: src/LYOptions.c:3790
+msgid "HTML error recovery"
+msgstr "Erro recuperando HTML"
+
+#. Bad HTML messages: SELECT
+#: src/LYOptions.c:3796
+msgid "Bad HTML messages"
+msgstr ""
+
+#. Show Images: SELECT
+#: src/LYOptions.c:3802
+msgid "Show images"
+msgstr "Mostra imagens"
+
+#. Verbose Images: ON/OFF
+#: src/LYOptions.c:3816
+msgid "Verbose images"
+msgstr "Imagens explicitadas"
+
+#.
+#. * Headers Transferred to Remote Servers
+#.
+#: src/LYOptions.c:3824
+#, fuzzy
+#| msgid "Headers transferred to remote server"
+msgid "Headers Transferred to Remote Servers"
+msgstr "Cabeçalhos tranferidos ao servidor remoto"
+
+#. ***************************************************************
+#. Mail Address: INPUT
+#: src/LYOptions.c:3828
+msgid "Personal mail address"
+msgstr "Endereço pessoal de email"
+
+#: src/LYOptions.c:3833
+#, fuzzy
+#| msgid "Personal_name: "
+msgid "Personal name for mail"
+msgstr "Nome_Completo:"
+
+#: src/LYOptions.c:3840
+#, fuzzy
+#| msgid "Password for news host '%s':"
+msgid "Password for anonymous ftp"
+msgstr "Senha para o servidor NEWS '%s':"
+
+#. Preferred media type: SELECT
+#: src/LYOptions.c:3846
+#, fuzzy
+#| msgid "Transferred %d bytes"
+msgid "Preferred media type"
+msgstr "Transferidos %s bytes."
+
+#. Preferred encoding: SELECT
+#: src/LYOptions.c:3852
+#, fuzzy
+#| msgid "Preferred document language"
+msgid "Preferred encoding"
+msgstr "Preferência de linguagem do documento."
+
+#. Preferred Document Character Set: INPUT
+#: src/LYOptions.c:3858
+msgid "Preferred document character set"
+msgstr "Preferências de mapa de caracteres do documento"
+
+#. Preferred Document Language: INPUT
+#: src/LYOptions.c:3863
+msgid "Preferred document language"
+msgstr "Preferência de linguagem do documento."
+
+#: src/LYOptions.c:3869
+#, fuzzy
+#| msgid "User-Agent header"
+msgid "Send User-Agent header"
+msgstr "Cabeçalho de Agente de Usuário"
+
+#: src/LYOptions.c:3871
+msgid "User-Agent header"
+msgstr "Cabeçalho de Agente de Usuário"
+
+#.
+#. * Listing and Accessing Files
+#.
+#: src/LYOptions.c:3879
+msgid "Listing and Accessing Files"
+msgstr ""
+
+#. FTP sort: SELECT
+#: src/LYOptions.c:3884
+msgid "Use Passive FTP"
+msgstr ""
+
+#. FTP sort: SELECT
+#: src/LYOptions.c:3890
+msgid "FTP sort criteria"
+msgstr "Critérios de organização do FTP"
+
+#. Local Directory Sort: SELECT
+#: src/LYOptions.c:3898
+msgid "Local directory sort criteria"
+msgstr "Critérios de organizações dos diretórios locais"
+
+#. Local Directory Order: SELECT
+#: src/LYOptions.c:3904
+#, fuzzy
+#| msgid "Local directory sort criteria"
+msgid "Local directory sort order"
+msgstr "Critérios de organizações dos diretórios locais"
+
+#: src/LYOptions.c:3913
+msgid "Show dot files"
+msgstr "Monstre arquivos de pontos"
+
+#: src/LYOptions.c:3921
+msgid "Execution links"
+msgstr "Ligações de execução"
+
+#: src/LYOptions.c:3939
+msgid "Pause when showing message"
+msgstr ""
+
+#. Show transfer rate: SELECT
+#: src/LYOptions.c:3946
+#, fuzzy
+#| msgid "Data transfer complete"
+msgid "Show transfer rate"
+msgstr "Transferência completada"
+
+#.
+#. * Special Files and Screens
+#.
+#: src/LYOptions.c:3966
+msgid "Special Files and Screens"
+msgstr ""
+
+#: src/LYOptions.c:3971
+msgid "Multi-bookmarks"
+msgstr "Multiplos Livros de Marcações"
+
+#: src/LYOptions.c:3979
+msgid "Review/edit Bookmarks files"
+msgstr "Rever/editar arquivos de Livro de Marcações"
+
+#: src/LYOptions.c:3982
+msgid "Goto multi-bookmark menu"
+msgstr "Ir para menu de multiplos livros de marcações"
+
+#: src/LYOptions.c:3984
+msgid "Bookmarks file"
+msgstr "Arquivo de Livro de marcações"
+
+#. Auto Session: ON/OFF
+#: src/LYOptions.c:3991
+msgid "Auto Session"
+msgstr ""
+
+#. Session File Menu: INPUT
+#: src/LYOptions.c:3997
+msgid "Session file"
+msgstr ""
+
+#. Visited Pages: SELECT
+#: src/LYOptions.c:4003
+#, fuzzy
+#| msgid "Visited Links Page"
+msgid "Visited Pages"
+msgstr "Página de ligações visitadas"
+
+#: src/LYOptions.c:4008
+#, fuzzy
+#| msgid "Mail the file"
+msgid "View the file "
+msgstr "Enviar arquivo por email"
+
+#: src/LYPrint.c:947
+#, fuzzy, c-format
+#| msgid "Loading incomplete."
+msgid " Print job complete.\n"
+msgstr "Leitura incompleta"
+
+#: src/LYPrint.c:1274
+msgid "Document:"
+msgstr "Documento:"
+
+#: src/LYPrint.c:1275
+msgid "Number of lines:"
+msgstr "Número de Linhas:"
+
+#: src/LYPrint.c:1276
+msgid "Number of pages:"
+msgstr "Número de páginas:"
+
+#: src/LYPrint.c:1277
+msgid "pages"
+msgstr "páginas"
+
+#: src/LYPrint.c:1277
+msgid "page"
+msgstr "página"
+
+#: src/LYPrint.c:1278
+msgid "(approximately)"
+msgstr "(aproximadamente)"
+
+#: src/LYPrint.c:1285
+msgid "Some print functions have been disabled!"
+msgstr "Algumas funções de impressão foram desabilitadas!"
+
+#: src/LYPrint.c:1289
+msgid "Standard print options:"
+msgstr "Opções padrão de impressão:"
+
+#: src/LYPrint.c:1290
+msgid "Print options:"
+msgstr "Opções de impressão:"
+
+#: src/LYPrint.c:1297
+msgid "Save to a local file"
+msgstr "Salva para um arquivo local"
+
+#: src/LYPrint.c:1299
+msgid "Save to disk disabled"
+msgstr "Salvar para disco desabilitado"
+
+#: src/LYPrint.c:1306
+msgid "Mail the file"
+msgstr "Enviar arquivo por email"
+
+#: src/LYPrint.c:1313
+msgid "Print to the screen"
+msgstr "Mostra na tela"
+
+#: src/LYPrint.c:1318
+msgid "Print out on a printer attached to your vt100 terminal"
+msgstr "Imprime numa impressora atachada num terminal vt100."
+
+#: src/LYReadCFG.c:441
+#, c-format
+msgid ""
+"Syntax Error parsing COLOR in configuration file:\n"
+"The line must be of the form:\n"
+"COLOR:INTEGER:FOREGROUND:BACKGROUND\n"
+"\n"
+"Here FOREGROUND and BACKGROUND must be one of:\n"
+"The special strings 'nocolor' or 'default', or\n"
+msgstr ""
+"Erro de sintaxe analizando cores no arquivo de configuração:\n"
+"A linha deve ser formada desta vorma:\n"
+"COR:INTEIRO:FRENTE:FUNDO\n"
+"\n"
+"Onde FRENTE e FUNDO devem ser um destes:\n"
+"O campo 'nocolor', ou 'default', ou\n"
+
+#: src/LYReadCFG.c:454
+msgid "Offending line:"
+msgstr "Linha 'infratora': "
+
+#: src/LYReadCFG.c:757
+#, c-format
+msgid "key remapping of %s to %s for %s failed\n"
+msgstr ""
+
+#: src/LYReadCFG.c:764
+#, fuzzy, c-format
+#| msgid "key remapping of "
+msgid "key remapping of %s to %s failed\n"
+msgstr "Remapeamento de teclas "
+
+#: src/LYReadCFG.c:785
+#, c-format
+msgid "invalid line-editor selection %s for key %s, selecting all\n"
+msgstr ""
+
+#: src/LYReadCFG.c:810 src/LYReadCFG.c:822
+#, c-format
+msgid "setting of line-editor binding for key %s (0x%x) to 0x%x for %s failed\n"
+msgstr ""
+
+#: src/LYReadCFG.c:826
+#, c-format
+msgid "setting of line-editor binding for key %s (0x%x) for %s failed\n"
+msgstr ""
+
+#: src/LYReadCFG.c:922
+#, c-format
+msgid "Lynx: cannot start, CERN rules file %s is not available\n"
+msgstr "Lynx: Impossível iniciar,CERN arquivo de regulamento %s não está disponível\n"
+
+#: src/LYReadCFG.c:923
+msgid "(no name)"
+msgstr "(sem nome)"
+
+#: src/LYReadCFG.c:2044
+#, c-format
+msgid "More than %d nested lynx.cfg includes -- perhaps there is a loop?!?\n"
+msgstr "Mais de %d aninhados nos arquivos incluídos do lynx.cfg -- talvez seja um loop???\n"
+
+#: src/LYReadCFG.c:2046
+#, c-format
+msgid "Last attempted include was '%s',\n"
+msgstr "Ultimo arquivo incluso chamado foi '%s',\n"
+
+#: src/LYReadCFG.c:2047
+#, c-format
+msgid "included from '%s'.\n"
+msgstr "incluído a partir de '%s'\n"
+
+#: src/LYReadCFG.c:2450 src/LYReadCFG.c:2463 src/LYReadCFG.c:2521
+msgid "The following is read from your lynx.cfg file."
+msgstr "O seguinte foi lido em seu arquivo lynx.cfg."
+
+#: src/LYReadCFG.c:2451 src/LYReadCFG.c:2464
+msgid "Please read the distribution"
+msgstr "Por favor veja a distribuição"
+
+#: src/LYReadCFG.c:2457 src/LYReadCFG.c:2467
+msgid "for more comments."
+msgstr "para mais comentários."
+
+#: src/LYReadCFG.c:2503
+msgid "RELOAD THE CHANGES"
+msgstr "RELER AS ALTERAÇÕES"
+
+#: src/LYReadCFG.c:2511
+msgid "Your primary configuration"
+msgstr "Sua configuração inicial"
+
+#: src/LYShowInfo.c:177
+msgid "Directory that you are currently viewing"
+msgstr "Diretório que você está vendo atualmente"
+
+#: src/LYShowInfo.c:180
+msgid "Name:"
+msgstr "Nome:"
+
+#: src/LYShowInfo.c:183
+msgid "URL:"
+msgstr "URL:"
+
+#: src/LYShowInfo.c:197
+msgid "Directory that you have currently selected"
+msgstr "Diretório que você acabou de selecionar"
+
+#: src/LYShowInfo.c:199
+msgid "File that you have currently selected"
+msgstr "Arquivo que você acabou de selecionar"
+
+#: src/LYShowInfo.c:202
+msgid "Symbolic link that you have currently selected"
+msgstr "Ligação simbólica que você acabou de selecionar"
+
+#: src/LYShowInfo.c:205
+msgid "Item that you have currently selected"
+msgstr "Item que você acabou de selecionar"
+
+#: src/LYShowInfo.c:207
+msgid "Full name:"
+msgstr "Nome Completo:"
+
+#: src/LYShowInfo.c:217
+msgid "Unable to follow link"
+msgstr "Impossível seguir link"
+
+#: src/LYShowInfo.c:219
+msgid "Points to file:"
+msgstr "Ponteiros para o arquivo:"
+
+#: src/LYShowInfo.c:224
+#, fuzzy
+#| msgid "Name of owner"
+msgid "Name of owner:"
+msgstr "Nome do dono:"
+
+#: src/LYShowInfo.c:227
+msgid "Group name:"
+msgstr "Nome do grupo:"
+
+#: src/LYShowInfo.c:229
+msgid "File size:"
+msgstr "Tamanho do arquivo:"
+
+#: src/LYShowInfo.c:231
+#, fuzzy
+#| msgid "bytes"
+msgid "(bytes)"
+msgstr "bytes"
+
+#.
+#. * Include date and time information.
+#.
+#: src/LYShowInfo.c:236
+msgid "Creation date:"
+msgstr "Data de criação:"
+
+#: src/LYShowInfo.c:239
+msgid "Last modified:"
+msgstr "Última modificação:"
+
+#: src/LYShowInfo.c:242
+msgid "Last accessed:"
+msgstr "Último acesso:"
+
+#: src/LYShowInfo.c:248
+msgid "Access Permissions"
+msgstr "Permissões de acesso"
+
+#: src/LYShowInfo.c:283
+#, fuzzy
+#| msgid "Group"
+msgid "Group:"
+msgstr "Grupo"
+
+#: src/LYShowInfo.c:303
+msgid "World:"
+msgstr ""
+
+#: src/LYShowInfo.c:310
+msgid "File that you are currently viewing"
+msgstr "Arquivo que você está vendo atualmente."
+
+#: src/LYShowInfo.c:318 src/LYShowInfo.c:422
+msgid "Linkname:"
+msgstr "Nome da Ligação:"
+
+#: src/LYShowInfo.c:324 src/LYShowInfo.c:339
+msgid "Charset:"
+msgstr "Mapa de caracteres:"
+
+#: src/LYShowInfo.c:338
+msgid "(assumed)"
+msgstr ""
+
+#: src/LYShowInfo.c:345
+msgid "Server:"
+msgstr "Servidor:"
+
+#: src/LYShowInfo.c:348
+msgid "Date:"
+msgstr "Data:"
+
+#: src/LYShowInfo.c:351
+msgid "Last Mod:"
+msgstr "Última modificação:"
+
+#: src/LYShowInfo.c:356
+#, fuzzy
+#| msgid "&nbsp;Expires:"
+msgid "Expires:"
+msgstr "&nbsp;EXpira:"
+
+#: src/LYShowInfo.c:359
+msgid "Cache-Control:"
+msgstr "Controle de cache:"
+
+#: src/LYShowInfo.c:362
+msgid "Content-Length:"
+msgstr "Content-Length:"
+
+#: src/LYShowInfo.c:366
+#, fuzzy
+#| msgid "Content-Length:"
+msgid "Length:"
+msgstr "Content-Length:"
+
+#: src/LYShowInfo.c:371
+msgid "Language:"
+msgstr "Lingua:"
+
+#: src/LYShowInfo.c:378
+msgid "Post Data:"
+msgstr "Data de postagem:"
+
+#: src/LYShowInfo.c:381
+msgid "Post Content Type:"
+msgstr "Postar tipo de documento:"
+
+#: src/LYShowInfo.c:384
+msgid "Owner(s):"
+msgstr "Dono(s):"
+
+#: src/LYShowInfo.c:389
+msgid "size:"
+msgstr "Tamanho:"
+
+#: src/LYShowInfo.c:391
+msgid "lines"
+msgstr "linhas"
+
+#: src/LYShowInfo.c:395
+msgid "forms mode"
+msgstr "modo do formulário"
+
+#: src/LYShowInfo.c:397
+msgid "source"
+msgstr "fonte"
+
+#: src/LYShowInfo.c:398
+msgid "normal"
+msgstr "normal"
+
+#: src/LYShowInfo.c:400
+msgid ", safe"
+msgstr ", salvo"
+
+#: src/LYShowInfo.c:402
+#, fuzzy
+#| msgid ", internal link"
+msgid ", via internal link"
+msgstr ", ligação interna"
+
+#: src/LYShowInfo.c:407
+msgid ", no-cache"
+msgstr ", sem cache"
+
+#: src/LYShowInfo.c:409
+msgid ", ISMAP script"
+msgstr ", script ISMAP"
+
+#: src/LYShowInfo.c:411
+msgid ", bookmark file"
+msgstr ", arquivo de Livro de marcações"
+
+#: src/LYShowInfo.c:415
+msgid "mode:"
+msgstr "modo:"
+
+#: src/LYShowInfo.c:421
+msgid "Link that you currently have selected"
+msgstr "Ligação que você acabou de selecionar"
+
+#: src/LYShowInfo.c:430
+msgid "Method:"
+msgstr "Metodo:"
+
+#: src/LYShowInfo.c:434
+msgid "Enctype:"
+msgstr "Enctype:"
+
+#: src/LYShowInfo.c:440
+#, fuzzy
+#| msgid "Location: "
+msgid "Action:"
+msgstr "Localização:"
+
+#: src/LYShowInfo.c:446
+msgid "(Form field)"
+msgstr "(Campo de formulário)"
+
+#: src/LYShowInfo.c:457
+msgid "No Links on the current page"
+msgstr "Sem ligações na página atual"
+
+#: src/LYShowInfo.c:463
+#, fuzzy
+#| msgid "Server:"
+msgid "Server Headers:"
+msgstr "Servidor:"
+
+#: src/LYStyle.c:331
+#, c-format
+msgid ""
+"Syntax Error parsing style in lss file:\n"
+"[%s]\n"
+"The line must be of the form:\n"
+"OBJECT:MONO:COLOR (ie em:bold:brightblue:white)\n"
+"where OBJECT is one of EM,STRONG,B,I,U,BLINK etc.\n"
+"\n"
+msgstr ""
+"Erro de sintaxe durante interpretação do arquivo lss:\n"
+"[%s]\n"
+"A linha deve estar:\n"
+"OBJETO:MONO:COLOR (ex. em:bold:brightblue:white)\n"
+"onde OBJETO é um destes: EM,STRONG,B,I,U,BLINK etc...\n"
+"\n"
+
+#: src/LYTraversal.c:111
+msgid "here is a list of the history stack so that you may rebuild"
+msgstr "Aqui há uma lista da pilha de histórico que você pode recriar"
+
+#: src/LYUpload.c:77
+msgid "ERROR! - upload command is misconfigured"
+msgstr "ERRO - Comando de envio de arquivos está mal configurado"
+
+#: src/LYUpload.c:98
+msgid "Illegal redirection \"../\" found! Request ignored."
+msgstr "Redirecionamento ilegal atingido \"../\" encontrado! Requisição ignorada."
+
+#: src/LYUpload.c:101
+msgid "Illegal character \"/\" found! Request ignored."
+msgstr "Caractere inválido \"/\" encontrado! requisição ignorada."
+
+#: src/LYUpload.c:104
+msgid "Illegal redirection using \"~\" found! Request ignored."
+msgstr "Redirecionamento ilegal usando \"~\" encontrado! Requisição ignorada."
+
+#: src/LYUpload.c:157
+msgid "Unable to upload file."
+msgstr "Impossível abrir arquivo"
+
+#: src/LYUpload.c:199
+msgid "Upload To:"
+msgstr "Enviar para:"
+
+#: src/LYUpload.c:200
+msgid "Upload options:"
+msgstr "Opções de envio de arquivos:"
+
+#: src/LYUtils.c:1883
+msgid "Download document URL put to clipboard."
+msgstr ""
+
+#: src/LYUtils.c:2668
+msgid "Unexpected access protocol for this URL scheme."
+msgstr ""
+
+#: src/LYUtils.c:3492
+msgid "Too many tempfiles"
+msgstr ""
+
+#: src/LYUtils.c:3792
+#, fuzzy
+#| msgid "unknown field or link"
+msgid "unknown restriction"
+msgstr "Campo ou ligacão desconhecidos."
+
+#: src/LYUtils.c:3823
+#, c-format
+msgid "No restrictions set.\n"
+msgstr ""
+
+#: src/LYUtils.c:3826
+#, fuzzy, c-format
+#| msgid "Description:"
+msgid "Restrictions set:\n"
+msgstr "Descrição:"
+
+#: src/LYUtils.c:5212
+msgid "Cannot find HOME directory"
+msgstr ""
+
+#: src/LYrcFile.c:16
+msgid "Normally disabled. See ENABLE_LYNXRC in lynx.cfg\n"
+msgstr ""
+
+#: src/LYrcFile.c:325
+msgid ""
+"accept_all_cookies allows the user to tell Lynx to automatically\n"
+"accept all cookies if desired. The default is \"FALSE\" which will\n"
+"prompt for each cookie. Set accept_all_cookies to \"TRUE\" to accept\n"
+"all cookies.\n"
+msgstr ""
+"accept_all_cookies permite receber qualquer tipo de cookie. \n"
+"O padrão é \"FALSE\" que vai forçar o usuário a confirmar a cada novo\n"
+"cookie que for enviado. Ajuste para \"TRUE\" a fim de aceitar qualquer\n"
+"cookie.\n"
+
+#: src/LYrcFile.c:333
+msgid ""
+"anonftp_password allows the user to tell Lynx to use the personal\n"
+"email address as the password for anonymous ftp. If no value is given,\n"
+"Lynx will use the personal email address. Set anonftp_password\n"
+"to a different value if you choose.\n"
+msgstr ""
+
+#: src/LYrcFile.c:342
+msgid ""
+"bookmark_file specifies the name and location of the default bookmark\n"
+"file into which the user can paste links for easy access at a later\n"
+"date.\n"
+msgstr ""
+"bookmark_file especifica o nome e local do livro de marcação padrão\n"
+"onde o usuário pode inserir para acessar facilmente os endereços \n"
+"preferidos.\n"
+
+#: src/LYrcFile.c:347
+msgid ""
+"If case_sensitive_searching is \"on\" then when the user invokes a search\n"
+"using the 's' or '/' keys, the search performed will be case sensitive\n"
+"instead of case INsensitive. The default is usually \"off\".\n"
+msgstr ""
+"Se case_sensitive_searching estiver \"on\" então quando o usuário\n"
+"chama uma busca usando 's' ou '/', a performance da procura será\n"
+"não sensitiva a letras maiusculas e minusculas. O padrão é \"off\".\n"
+
+#: src/LYrcFile.c:352
+msgid ""
+"The character_set definition controls the representation of 8 bit\n"
+"characters for your terminal. If 8 bit characters do not show up\n"
+"correctly on your screen you may try changing to a different 8 bit\n"
+"set or using the 7 bit character approximations.\n"
+"Current valid characters sets are:\n"
+msgstr ""
+"O character_set controla a representação dos caracteres de 8 bits para seu\n"
+"terminal. Se os caracteres de 8 bits não aparecerem corretamente em sua \n"
+"tela, você pode tentar trocando para uma diferente configuração ou usando \n"
+"caracteres de 7 bits.\n"
+"Atualmente os caracteres válidos são:\n"
+
+#: src/LYrcFile.c:359
+msgid ""
+"cookie_accept_domains and cookie_reject_domains are comma-delimited\n"
+"lists of domains from which Lynx should automatically accept or reject\n"
+"all cookies. If a domain is specified in both options, rejection will\n"
+"take precedence. The accept_all_cookies parameter will override any\n"
+"settings made here.\n"
+msgstr ""
+"cookie_accept_domains e cookie_reject_domains são listas de domínios\n"
+"delimitados por virgulas, de onde o Lynx pode aceitar ou rejeitar \n"
+"automaticamente os cookies enviados. Se um domínio estiver especificado\n"
+"em ambos, rejeitar tem preferência. O parametro accept_all_cookies irá\n"
+"sobreescrever qualquer outro parâmetro feito aqui.\n"
+
+#: src/LYrcFile.c:367
+#, fuzzy
+#| msgid ""
+#| "cookie_file specifies the file in which to store persistent cookies.\n"
+#| "The default is ~/.lynx_cookies.\n"
+msgid ""
+"cookie_file specifies the file from which to read persistent cookies.\n"
+"The default is ~/"
+msgstr ""
+"cookie_file especifica o arquivo em que irão ser gravados os cookies.\n"
+"O padrão é ~/.lynx_cookies.\n"
+
+#: src/LYrcFile.c:372
+msgid ""
+"cookie_loose_invalid_domains, cookie_strict_invalid_domains, and\n"
+"cookie_query_invalid_domains are comma-delimited lists of which domains\n"
+"should be subjected to varying degrees of validity checking. If a\n"
+"domain is set to strict checking, strict conformance to RFC2109 will\n"
+"be applied. A domain with loose checking will be allowed to set cookies\n"
+"with an invalid path or domain attribute. All domains will default to\n"
+"querying the user for an invalid path or domain.\n"
+msgstr ""
+"cookie_loose_invalid_domains, cookie_strict_invalid_domains, e\n"
+"cookie_query_invalid_domains são listas de domínios, delimitados \n"
+"por vírgulas que podem ser sujeitados a vários tipos de autenticação\n"
+"Se um domínio estriver ajustado para checagem precisa, será checado\n"
+"de acordo com a norma RFC2109. Um domínio que perder a checagem será \n"
+"autorizado a configurar cookies com caminhos ou parâmetros inválidos.\n"
+"Todos os domínios tem como padrão perguntar ao usuário sobre um caminho\n"
+"ou parâmetro inválido no cookie.\n"
+
+#: src/LYrcFile.c:386
+msgid ""
+"dir_list_order specifies the directory list order under DIRED_SUPPORT\n"
+"(if implemented). The default is \"ORDER_BY_NAME\"\n"
+msgstr ""
+
+#: src/LYrcFile.c:391
+msgid ""
+"dir_list_styles specifies the directory list style under DIRED_SUPPORT\n"
+"(if implemented). The default is \"MIXED_STYLE\", which sorts both\n"
+"files and directories together. \"FILES_FIRST\" lists files first and\n"
+"\"DIRECTORIES_FIRST\" lists directories first.\n"
+msgstr ""
+"dir_list_styles especifica o estilo da listagem de diretório pelo \n"
+"DIRED_SUPPORT (se implementado). O padrão é \"MIXED_STYLE\", que \n"
+"organiza os diretórios e os arquivos juntos.\"FILES_FIRST\" organiza\n"
+"primeiro os arquivos, depois os diretórios.\"DIRECTORIES_FIRST\" lista\n"
+"primeiro os diretórios.\n"
+
+#: src/LYrcFile.c:399
+msgid ""
+"If emacs_keys is to \"on\" then the normal EMACS movement keys:\n"
+" ^N = down ^P = up\n"
+" ^B = left ^F = right\n"
+"will be enabled.\n"
+msgstr ""
+"Se emacs_keys estiver \"on\" então as teclas normais de movimento são:\n"
+" ^N = para baixo ^P = para cima\n"
+" ^B = esquerda ^F = para direita\n"
+
+#: src/LYrcFile.c:405
+msgid ""
+"file_editor specifies the editor to be invoked when editing local files\n"
+"or sending mail. If no editor is specified, then file editing is disabled\n"
+"unless it is activated from the command line, and the built-in line editor\n"
+"will be used for sending mail.\n"
+msgstr ""
+"file_editor especifica o editor que deve ser chamado quando você\n"
+"quer editar arquivos localmente ou enviar email. Se nenhum editor for\n"
+"especificado, então esta facilidade estará desabilitada, a não ser que\n"
+"seja ativado na linha de comando, então o editor será usado para enviar\n"
+"emails.\n"
+
+#: src/LYrcFile.c:412
+msgid ""
+"The file_sorting_method specifies which value to sort on when viewing\n"
+"file lists such as FTP directories. The options are:\n"
+" BY_FILENAME -- sorts on the name of the file\n"
+" BY_TYPE -- sorts on the type of the file\n"
+" BY_SIZE -- sorts on the size of the file\n"
+" BY_DATE -- sorts on the date of the file\n"
+msgstr ""
+"O file_sorting_method especifica qual valor será usado para classificar\n"
+"quando você estiver listando diretórios e arquivos de FTP. As opções são:\n"
+" BY_FILENAME -- classifica pelo Nome do arquivo\n"
+" BY_TYPE -- classifica pelo Tipo do arquivo\n"
+" BY_SIZE -- classifica pelo Tamanho do arquivo\n"
+" BY_DATE -- classifica pela Data do arquivo\n"
+
+#: src/LYrcFile.c:435
+msgid ""
+"lineedit_mode specifies the key binding used for inputting strings in\n"
+"prompts and forms. If lineedit_mode is set to \"Default Binding\" then\n"
+"the following control characters are used for moving and deleting:\n"
+"\n"
+" Prev Next Enter = Accept input\n"
+" Move char: <- -> ^G = Cancel input\n"
+" Move word: ^P ^N ^U = Erase line\n"
+" Delete char: ^H ^R ^A = Beginning of line\n"
+" Delete word: ^B ^F ^E = End of line\n"
+"\n"
+"Current lineedit modes are:\n"
+msgstr ""
+"lineedit_mode especifica as teclas que serão usadas durante a edição \n"
+"de campos de formulários. Se lineedit_mode estiver como \"Default Binding\"\n"
+"então os caracteres abaixo serão usados para mover-se e deletar.\n"
+"\n"
+" anterior próximo Enter = Aceita entrada\n"
+" Move carac: <- -> ^G = Cancela entrada\n"
+" Move palav: ^P ^N ^U = Apaga linha\n"
+" Delete carac: ^H ^R ^A = Começo da linha \n"
+" Delete palav: ^B ^F ^E = Fim da linha\n"
+"\n"
+"Atualmente os modos de edição de linha são:\n"
+
+#: src/LYrcFile.c:453
+msgid ""
+"The following allow you to define sub-bookmark files and descriptions.\n"
+"The format is multi_bookmark<capital_letter>=<filename>,<description>\n"
+"Up to 26 bookmark files (for the English capital letters) are allowed.\n"
+"We start with \"multi_bookmarkB\" since 'A' is the default (see above).\n"
+msgstr ""
+"Este permite a você definir sub-livros de marcação. O formato é\n"
+"multi_bookmark(letra maiúscula)=(nome do arquivo),(descrição)\n"
+"Até 26 livros podem ser definidos (para letras maiúsculas do\n"
+"ingles). Nós começamos com \"multi_bookmarkB\" desde que 'A' é o \n"
+"padrão. (veja abaixo).\n"
+
+#: src/LYrcFile.c:459
+msgid ""
+"personal_mail_address specifies your personal mail address. The\n"
+"address will be sent during HTTP file transfers for authorization and\n"
+"logging purposes, and for mailed comments.\n"
+"If you do not want this information given out, set the NO_FROM_HEADER\n"
+"to TRUE in lynx.cfg, or use the -nofrom command line switch. You also\n"
+"could leave this field blank, but then you won't have it included in\n"
+"your mailed comments.\n"
+msgstr ""
+"persona_mail_address especifica seu email. O endereço será\n"
+"enviado durante transferências de arquivos para autenticação\n"
+"de usuário e dentro de emails que você enviar.\n"
+"Se você não quer que esta informação seja publicada, acerte \n"
+"NO_FROM_HEADER para TRUE no lynx.cfg, ou use -nofrom na linha \n"
+"de comando. Você também pode deixar este campo em branco, mas então você não poderá incluir em seus comentários de email.\n"
+
+#: src/LYrcFile.c:468
+msgid ""
+"personal_mail_name specifies your personal name, for mail. The\n"
+"name is sent for mailed comments. Lynx will prompt for this,\n"
+"showing the configured value as a default when sending mail.\n"
+"This is not necessarily the same as a name provided as part of the\n"
+"personal_mail_address.\n"
+"Lynx does not save your changes to that default value as a side-effect\n"
+"of sending email. To update the default value, you must use the options\n"
+"menu, or modify this file directly.\n"
+msgstr ""
+
+#: src/LYrcFile.c:478
+msgid ""
+"preferred_charset specifies the character set in MIME notation (e.g.,\n"
+"ISO-8859-2, ISO-8859-5) which Lynx will indicate you prefer in requests\n"
+"to http servers using an Accept-Charset header. The value should NOT\n"
+"include ISO-8859-1 or US-ASCII, since those values are always assumed\n"
+"by default. May be a comma-separated list.\n"
+"If a file in that character set is available, the server will send it.\n"
+"If no Accept-Charset header is present, the default is that any\n"
+"character set is acceptable. If an Accept-Charset header is present,\n"
+"and if the server cannot send a response which is acceptable\n"
+"according to the Accept-Charset header, then the server SHOULD send\n"
+"an error response, though the sending of an unacceptable response\n"
+"is also allowed.\n"
+msgstr ""
+"preferred_charset especifica o formato ISO que será usado nas notações\n"
+"MIME, e que será enviado ao servidor http usando cabeçalho 'Accept-Charset'\n"
+"O valor não deve conter ISO-8859-1 ou US-ASCII, desde que estes valores \n"
+"são assumidos como padrão. Deve ser uma lista separada por virgulas.\n"
+"Se um arquivo com este codigo estiver disponível, o servidor irá envia-lo\n"
+"a você. Se não houver cabeçalho 'Accept-Charset', o documento padrão\n"
+"será enviado. Se um cabeçalho 'Accept-Charset' estiver presente, e se o\n"
+"servidor não puder enviar uma resposta que seja aceitável de acordo com\n"
+"o cabeçalho solicitado, então você poderá receber uma mensagem de erro.\n"
+
+#: src/LYrcFile.c:494
+#, fuzzy
+#| msgid ""
+#| "preferred_language specifies the language in MIME notation (e.g., en,\n"
+#| "fr, may be a comma-separated list in decreasing preference)\n"
+#| "which Lynx will indicate you prefer in requests to http servers.\n"
+#| "If a file in that language is available, the server will send it.\n"
+#| "Otherwise, the server will send the file in it's default language.\n"
+msgid ""
+"preferred_language specifies the language in MIME notation (e.g., en,\n"
+"fr, may be a comma-separated list in decreasing preference)\n"
+"which Lynx will indicate you prefer in requests to http servers.\n"
+"If a file in that language is available, the server will send it.\n"
+"Otherwise, the server will send the file in its default language.\n"
+msgstr ""
+"preferred_language especifica a lingua que será informado o formato\n"
+"MIME(ex. en,fr, devem ser separados por vírgulas em ordem decrescente de\n"
+"preferência) ao servidor de http. Se o arquivo nesta linguagem estiver \n"
+"disponível, o servidor irá envia-lo a você. Do contrário, enviará o\n"
+"documento padrão.\n"
+
+#: src/LYrcFile.c:505
+msgid ""
+"If run_all_execution_links is set \"on\" then all local execution links\n"
+"will be executed when they are selected.\n"
+"\n"
+"WARNING - This is potentially VERY dangerous. Since you may view\n"
+" information that is written by unknown and untrusted sources\n"
+" there exists the possibility that Trojan horse links could be\n"
+" written. Trojan horse links could be written to erase files\n"
+" or compromise security. This should only be set to \"on\" if\n"
+" you are viewing trusted source information.\n"
+msgstr ""
+"Se run_all_execution_links estiver como \"on\" então todas as execuções de\n"
+"ligações locais serão executadas quando elas forem selecionadas.\n"
+"\n"
+"ATENÇÃO - Isto é muito perigoso. Desde que você permita que alguma informação\n"
+" seja gravada em seu microcomputador de um local desconhecido\n"
+" existe a possibilidade de um Trojan ou Cavalo de Tróia ser \n"
+" executado. Trojans e Cavalos de Tróia podem desde alterar a segu-\n"
+" rança de seu microcomputador até destruir arquivos. Somente deixe\n"
+" como \"on\" se você tiver certeza das informações que estarão sendo \n"
+" executadas ou gravadas em seu equipamento. \n"
+
+#: src/LYrcFile.c:516
+msgid ""
+"If run_execution_links_on_local_files is set \"on\" then all local\n"
+"execution links that are found in LOCAL files will be executed when they\n"
+"are selected. This is different from run_all_execution_links in that\n"
+"only files that reside on the local system will have execution link\n"
+"permissions.\n"
+"\n"
+"WARNING - This is potentially dangerous. Since you may view\n"
+" information that is written by unknown and untrusted sources\n"
+" there exists the possibility that Trojan horse links could be\n"
+" written. Trojan horse links could be written to erase files\n"
+" or compromise security. This should only be set to \"on\" if\n"
+" you are viewing trusted source information.\n"
+msgstr ""
+"Se run_execution_links_on_local_files estiver como \"on\" então todas as\n"
+"execuções de ligações locais encontradas em arquivos LOCAIS serão execu-\n"
+"tadas quando forem selecionadas. Isto é diferente de run_all_execution_links\n"
+"onde somente arquivos que estiverem no sistema local serão executados.\n"
+"\n"
+"ATENÇÃO - Isto é muito perigoso. Desde que você permita que alguma informação\n"
+" seja executada em seu microcomputador de um local desconhecido\n"
+" existe a possibilidade de um Trojan ou Cavalo de Tróia ser \n"
+" executado. Trojans e Cavalos de Tróia podem desde alterar a segu-\n"
+" rança de seu microcomputador até destruir arquivos. Somente deixe\n"
+" como \"on\" se você tiver certeza das informações que estarão sendo \n"
+" executadas ou gravadas em sei equipament.\n"
+
+#: src/LYrcFile.c:534
+msgid ""
+"select_popups specifies whether the OPTIONs in a SELECT block which\n"
+"lacks a MULTIPLE attribute are presented as a vertical list of radio\n"
+"buttons or via a popup menu. Note that if the MULTIPLE attribute is\n"
+"present in the SELECT start tag, Lynx always will create a vertical list\n"
+"of checkboxes for the OPTIONs. A value of \"on\" will set popup menus\n"
+"as the default while a value of \"off\" will set use of radio boxes.\n"
+"The default can be overridden via the -popup command line toggle.\n"
+msgstr ""
+"select_popups especifica como srão apresentados os menus de pop-up. Se\n"
+"como botões de rádio ou via menu. Note que o Lynx sempre criará um menu \n"
+"vertical para OPÇÕES. Um valor de \"on\" irá deixar os menus como o padrão\n"
+"e \"off\" forçará o uso de caixas de rádio. O valor pode ser alterado na\n"
+"linha de comando com -popup.\n"
+
+#: src/LYrcFile.c:545
+msgid ""
+"show_color specifies how to set the color mode at startup. A value of\n"
+"\"never\" will force color mode off (treat the terminal as monochrome)\n"
+"at startup even if the terminal appears to be color capable. A value of\n"
+"\"always\" will force color mode on even if the terminal appears to be\n"
+"monochrome, if this is supported by the library used to build lynx.\n"
+"A value of \"default\" will yield the behavior of assuming\n"
+"a monochrome terminal unless color capability is inferred at startup\n"
+"based on the terminal type, or the -color command line switch is used, or\n"
+"the COLORTERM environment variable is set. The default behavior always is\n"
+"used in anonymous accounts or if the \"option_save\" restriction is set.\n"
+"The effect of the saved value can be overridden via\n"
+"the -color and -nocolor command line switches.\n"
+"The mode set at startup can be changed via the \"show color\" option in\n"
+"the 'o'ptions menu. If the option settings are saved, the \"on\" and\n"
+"\"off\" \"show color\" settings will be treated as \"default\".\n"
+msgstr ""
+"show_color especifica como as cores irão ser apresentadas. Um valor de \n"
+"\"never\" forçará o mono monocromático mesmo que o terminal tenha capaci-\n"
+"dade de apresentar cores. Um valor de \"always\" forçará o modo colorido\n"
+"mesmo que o terminal seja monocromático. Mas somente se a biblioteca \n"
+"usada para compilar o lynx permitir. Um valor de \"default\" irá assumir\n"
+"monocromático a não ser que a opção de colorido tenha sido requisitada\n"
+"na linha de comando (ex.'lynx -color') ou a variável COLORTERM esteja\n"
+"presente. O padrão sempre é usado em contas anônimas ou se a restrição\n"
+"\"option_save\" esteja presente. O efeito dos valores salvos pode ser \n"
+"sobreescrito com o comando -color ou -nocolor. Para alterar o modo padrão\n"
+"use o menu de opções. Se estiver salvo \"on\" ou \"off\" estes serão tratados\n"
+"como \"default\".\n"
+
+#: src/LYrcFile.c:562
+msgid ""
+"show_cursor specifies whether to 'hide' the cursor to the right (and\n"
+"bottom, if possible) of the screen, or to place it to the left of the\n"
+"current link in documents, or current option in select popup windows.\n"
+"Positioning the cursor to the left of the current link or option is\n"
+"helpful for speech or braille interfaces, and when the terminal is\n"
+"one which does not distinguish the current link based on highlighting\n"
+"or color. A value of \"on\" will set positioning to the left as the\n"
+"default while a value of \"off\" will set 'hiding' of the cursor.\n"
+"The default can be overridden via the -show_cursor command line toggle.\n"
+msgstr ""
+"show_cursor especifica como 'esconder' o cursor no canto inferior direito\n"
+"da tela, ou para coloca-lo no lado esquerdo da ligação corrente do \n"
+"documento, ou opções correntes nas janelas de pop-up.\n"
+"Posicionando o cursor no lado esquerdo ajuda em interfaces braille, e \n"
+"quando o terminal não distingue as ligações baseadas em cores.\n"
+"Um valor de \"on\" ira posiciona-lo no lado esquerdo e \"off\" irá oculta-lo\n"
+"O valor padrão pode ser sobreescrito via linha de comando -show_cursor.\n"
+
+#: src/LYrcFile.c:573
+msgid ""
+"show_dotfiles specifies that the directory listing should include\n"
+"\"hidden\" (dot) files/directories. If set \"on\", this will be\n"
+"honored only if enabled via userdefs.h and/or lynx.cfg, and not\n"
+"restricted via a command line switch. If display of hidden files\n"
+"is disabled, creation of such files via Lynx also is disabled.\n"
+msgstr ""
+"show_dotfiles especifica que o diretório listado irá apresentar os\n"
+"arquivos ocultos. Se estiver \"on\" este será distinto somente via \n"
+"userdefs.h e/ou lynx.cfg, e não restringido via linha de comando.\n"
+"Se a apresentação de arquivos ocultos estiver \"off\", a criação dos \n"
+"mesmos pelo lynx estará desabilitada.\n"
+
+#: src/LYrcFile.c:584
+msgid ""
+"If sub_bookmarks is not turned \"off\", and multiple bookmarks have\n"
+"been defined (see below), then all bookmark operations will first\n"
+"prompt the user to select an active sub-bookmark file. If the default\n"
+"Lynx bookmark_file is defined (see above), it will be used as the\n"
+"default selection. When this option is set to \"advanced\", and the\n"
+"user mode is advanced, the 'v'iew bookmark command will invoke a\n"
+"statusline prompt instead of the menu seen in novice and intermediate\n"
+"user modes. When this option is set to \"standard\", the menu will be\n"
+"presented regardless of user mode.\n"
+msgstr ""
+"Se sub_bookmarks não estiver \"off\", e foram definidos multiplis livros de\n"
+"marcação (veja abaixo), então todas as operações de livros de marcações \n"
+"irão solicitar que você escolha entre os arquivos de livro de marcação.\n"
+"Se o bookmark_file padrão estiver definido(veja acima), ele será usado\n"
+"como padrão de seleção. Quando esta opção estiver \"advanced\", e o modo\n"
+"de usuário estiver como avançado, o comando de 'v'isualizar irá invocar\n"
+"uma linha de prompt em vez de um menu de novato ou intermediário. Quando\n"
+"esta opção estiver como \"standart\", o menu será apresentado respeitando o\n"
+"modo do usuário.\n"
+
+#: src/LYrcFile.c:598
+msgid ""
+"user_mode specifies the users level of knowledge with Lynx. The\n"
+"default is \"NOVICE\" which displays two extra lines of help at the\n"
+"bottom of the screen to aid the user in learning the basic Lynx\n"
+"commands. Set user_mode to \"INTERMEDIATE\" to turn off the extra info.\n"
+"Use \"ADVANCED\" to see the URL of the currently selected link at the\n"
+"bottom of the screen.\n"
+msgstr ""
+"user_mode especifica o nível do usuário que está usando o Lynx. O\n"
+"padrão é \"NOVICE\" que equivale a novato. Mostra menus simples junto\n"
+"de uma barra de ajuda. Ajustando para \"INTERMEDIATE\" para desligar\n"
+"a ajuda e ter menus mais avançados.\n"
+"Use \"ADVANCED\" para ver a URL da ligação marcada atualmente na base\n"
+"da tela.\n"
+
+#: src/LYrcFile.c:607
+msgid ""
+"If verbose_images is \"on\", lynx will print the name of the image\n"
+"source file in place of [INLINE], [LINK] or [IMAGE]\n"
+"See also VERBOSE_IMAGES in lynx.cfg\n"
+msgstr ""
+"Se as imagens são \"on\", Lynx irá imprimir o nome da imagem\n"
+"no local como [INLINE], [LINK], ou [IMAGE]\n"
+"Veja mais sobre em lynx.cfg\n"
+
+#: src/LYrcFile.c:612
+msgid ""
+"If vi_keys is set to \"on\", then the normal VI movement keys:\n"
+" j = down k = up\n"
+" h = left l = right\n"
+"will be enabled. These keys are only lower case.\n"
+"Capital 'H', 'J' and 'K will still activate help, jump shortcuts,\n"
+"and the keymap display, respectively.\n"
+msgstr ""
+"Se vi_keys estiver marcado como \"on\", então os movimentos normais de teclas são:\n"
+" j = para baixo k = para cima\n"
+" h = esquerda l = direita\n"
+"Estas teclas são somente em letras minúsculas.\n"
+"As letras 'H', 'J' e 'K continuam ativando a ajuda,pular atalhos e mostrar\n"
+"o mapa de caracteres.\n"
+
+#: src/LYrcFile.c:620
+msgid ""
+"The visited_links setting controls how Lynx organizes the information\n"
+"in the Visited Links Page.\n"
+msgstr ""
+
+#: src/LYrcFile.c:845
+msgid ""
+"If keypad_mode is set to \"NUMBERS_AS_ARROWS\", then the numbers on\n"
+"your keypad when the numlock is on will act as arrow keys:\n"
+" 8 = Up Arrow\n"
+" 4 = Left Arrow 6 = Right Arrow\n"
+" 2 = Down Arrow\n"
+"and the corresponding keyboard numbers will act as arrow keys,\n"
+"regardless of whether numlock is on.\n"
+msgstr ""
+"Se keypad_mode estiver com \"NUMBERS_AS_ARROWS\", então oa números em\n"
+"seu keypad quando o numlock estiver ligado funcionarão como setas.\n"
+" 8 = para cima\n"
+" 4 = para esquerda 6 = para direita\n"
+" 2 = para baixo\n"
+"e os números do teclado responderão da mesma forma, desde que o \n"
+"numlock estiver ligado.\n"
+
+#: src/LYrcFile.c:854
+msgid ""
+"If keypad_mode is set to \"LINKS_ARE_NUMBERED\", then numbers will\n"
+"appear next to each link and numbers are used to select links.\n"
+msgstr ""
+"Se keypad_mode estiver com \"LINKS_ARE_NUMBERED\", então números\n"
+"irão aparecer ao lado das ligações e serão usados para ativá-las.\n"
+
+#: src/LYrcFile.c:858
+msgid ""
+"If keypad_mode is set to \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\", then\n"
+"numbers will appear next to each link and visible form input field.\n"
+"Numbers are used to select links, or to move the \"current link\" to a\n"
+"form input field or button. In addition, options in popup menus are\n"
+"indexed so that the user may type an option number to select an option in\n"
+"a popup menu, even if the option isn't visible on the screen. Reference\n"
+"lists and output from the list command also enumerate form inputs.\n"
+msgstr ""
+"Se keypad_mode estiver com \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\", então\n"
+"números irão aparecer ao lado das ligações e dos campos de formulário.\n"
+"Serão usados para ativar ligações ou para mover o \"link corrente\" para\n"
+"um campo de formulário ou botão. Em adição, as opções nos menus serão\n"
+"indexadas onde o usuário poderá escolher a opção por um número, mesmo\n"
+"que a opção não esteja visível. Listas de referências e saídas do comando\n"
+"de lista serão numeradas também.\n"
+
+#: src/LYrcFile.c:867
+msgid ""
+"NOTE: Some fixed format documents may look disfigured when\n"
+"\"LINKS_ARE_NUMBERED\" or \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\" are\n"
+"enabled.\n"
+msgstr ""
+"NOTA: Alguns formatos fixados de documento podem ser alterados quando\n"
+"\"LINKS_ARE_NUMBERED\" ou \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\" estiverem\n"
+"habilitados.\n"
+
+#: src/LYrcFile.c:899
+msgid ""
+"Lynx User Defaults File\n"
+"\n"
+msgstr ""
+
+#: src/LYrcFile.c:908
+msgid ""
+"This file contains options saved from the Lynx Options Screen (normally\n"
+"with the 'o' key). To save options with that screen, you must select the\n"
+"checkbox:\n"
+msgstr ""
+
+#: src/LYrcFile.c:915
+msgid ""
+"You must then save the settings using the link on the line above the\n"
+"checkbox:\n"
+msgstr ""
+
+#: src/LYrcFile.c:922
+msgid ""
+"You may also use the command-line option \"-forms_options\", which displays\n"
+"the simpler Options Menu instead. Save options with that using the '>' key.\n"
+"\n"
+msgstr ""
+
+#: src/LYrcFile.c:929
+msgid ""
+"This file contains options saved from the Lynx Options Screen (normally\n"
+"with the '>' key).\n"
+"\n"
+msgstr ""
+
+#: src/LYrcFile.c:936
+#, fuzzy
+#| msgid ""
+#| "Lynx User Defaults File\n"
+#| "\n"
+#| "This file contains options saved from the Lynx Options Screen (normally\n"
+#| "with the '>' key). There is normally no need to edit this file manually,\n"
+#| "since the defaults here can be controlled from the Options Screen, and the\n"
+#| "next time options are saved from the Options Screen this file will be\n"
+#| "completely rewritten. You have been warned...\n"
+#| "If you are looking for the general configuration file - it is normally\n"
+#| "called lynx.cfg, and it has different content and a different format.\n"
+#| "It is not this file.\n"
+msgid ""
+"There is normally no need to edit this file manually, since the defaults\n"
+"here can be controlled from the Options Screen, and the next time options\n"
+"are saved from the Options Screen this file will be completely rewritten.\n"
+"You have been warned...\n"
+"\n"
+"If you are looking for the general configuration file - it is normally\n"
+"called \"lynx.cfg\". It has different content and a different format.\n"
+"It is not this file.\n"
+msgstr ""
+"Arquivo de configuração do usuário\n"
+"\n"
+"Este arquivo contém as opções salvas pela tela de Opções do Lynx.\n"
+"(normalmente com a tecla '>'). Normalmente você não precisa editar\n"
+"este arquivo manualmente, desde que os valores aqui são controlados\n"
+"pelo menu de opções, e a próxima vez que qualquer opção for salva\n"
+"este arquivo será totalmente reescrito. Você foi avisado...\n"
+"Se você está procurando pelo arquivo de configurações principal - \n"
+"ele é normalmente chamado de lynx.cfg, e tel forma e conteúdo dife-\n"
+"rente - não é este arquivo.\n"
+
+#~ msgid "Comment request cancelled!!!"
+#~ msgstr "Pedido de comentário cancelado!!!"
+
+#~ msgid "You are not allowed to goto \"file:\" URLs"
+#~ msgstr "Você não pode ir para \"file:\" URLs"
+
+#~ msgid "You are not allowed to goto \"finger:\" URLs"
+#~ msgstr "Você não pode ir para \"finger:\" URLs"
+
+#~ msgid "You are not allowed to goto \"ftp:\" URLs"
+#~ msgstr "Você não pode ir para \"ftp:\" URLs"
+
+#~ msgid "You are not allowed to goto \"gopher:\" URLs"
+#~ msgstr "Você não pode ir para \"gopher:\" URLs"
+
+#~ msgid "You are not allowed to goto \"http:\" URLs"
+#~ msgstr "Você não pode ir para \"http:\" URLs"
+
+#~ msgid "You are not allowed to goto \"https:\" URLs"
+#~ msgstr "Você não pode ir para \"https:\" URLs"
+
+#~ msgid "You are not allowed to goto \"lynxcgi:\" URLs"
+#~ msgstr "Você não pode ir para \"lynxcgi:\" URLs"
+
+#~ msgid "You are not allowed to goto \"lynxexec:\" URLs"
+#~ msgstr "Você não pode ir para \"lynxexec:\" URLs"
+
+#~ msgid "You are not allowed to goto \"lynxprog:\" URLs"
+#~ msgstr "Você não pode ir para \"lynxprog:\" URLs"
+
+#~ msgid "You are not allowed to goto \"mailto:\" URLs"
+#~ msgstr "Você não pode ir para \"mailto:\" URLs"
+
+#~ msgid "You are not allowed to goto \"news:\" URLs"
+#~ msgstr "Você não pode ir para \"news:\" URLs"
+
+#~ msgid "You are not allowed to goto \"nntp:\" URLs"
+#~ msgstr "Você não pode ir para \"nntp:\" URLs"
+
+#~ msgid "You are not allowed to goto \"rlogin:\" URLs"
+#~ msgstr "Você não pode ir para \"rlogin:\" URLs"
+
+#~ msgid "You are not allowed to goto \"snews:\" URLs"
+#~ msgstr "Você não pode ir para \"snews:\" URLs"
+
+#~ msgid "You are not allowed to goto \"telnet:\" URLs"
+#~ msgstr "Você não pode ir para \"telnet:\" URLs"
+
+#~ msgid "You are not allowed to goto \"tn3270:\" URLs"
+#~ msgstr "Você não pode ir para \"tn3270:\" URLs"
+
+#~ msgid "You are not allowed to goto \"wais:\" URLs"
+#~ msgstr "Você não pode ir para \"wais:\" URLs"
+
+#~ msgid "This special URL is not allowed as a goto!"
+#~ msgstr "Você não pode ir para esta URL em particular."
+
+#~ msgid "Option choice (or page) number: "
+#~ msgstr "Opção (ou página) número:"
+
+#~ msgid "Choice number %d already is current."
+#~ msgstr "Escolha número %d ja está ativa."
+
+#~ msgid "You are already at the end of this choice list."
+#~ msgstr "Você ja está no fim desta lista de opções."
+
+#~ msgid "You are already at the beginning of this choice list."
+#~ msgstr "Você já esta no início desta lista de escolhas."
+
+#~ msgid "You are already at page %d of this choice list."
+#~ msgstr "Você ja está na página %d desta lista de escolhas."
+
+#~ msgid "You have entered an invalid choice number."
+#~ msgstr "Você entrou com um número de escolha inválido."
+
+#~ msgid "WARNING: Misrepresentation of the User-Agent may be a copyright violation!"
+#~ msgstr "Má representação do 'User-Agent' pode ser uma violação de direitos autorais!"
+
+#~ msgid "History List maximum reached! Document not pushed."
+#~ msgstr "Máximo do histórico atingido. O documento não foi acrescentado."
+
+#~ msgid "Looking up %s."
+#~ msgstr "Conectando em %s."
+
+#~ msgid "Got redirection with a bad Location header."
+#~ msgstr "Recebido redirecionamento com uma localização inválida."
+
+#~ msgid "Got redirection with no Location header."
+#~ msgstr "Redirecionado sem um cabeçalho de localização."
+
+#~ msgid "KB"
+#~ msgstr "KB"
+
+#~ msgid "(From Cookie Jar)"
+#~ msgstr "(do Cookie Jar)"
+
+#~ msgid "Source and destination are the same location - request ignored!"
+#~ msgstr "Fonte e destino são o mesmo local - requisição impedida!"
+
+#~ msgid "create %s"
+#~ msgstr "criar %s"
+
+#~ msgid "Remove '%s' and all of its contents: "
+#~ msgstr "Remove '%s' e todos que ele contém:"
+
+#~ msgid "Remove directory and all of its contents: "
+#~ msgstr "Remove diretório e sub-diretórios:"
+
+#~ msgid "Unable to open file management menu file."
+#~ msgstr "Impossível abrir arquivo de menu de gerenciamento de arquivos."
+
+#~ msgid "Lynx ver. %s"
+#~ msgstr "Lynx ver. %s"
+
+#~ msgid "X_Personal_name: "
+#~ msgstr "X_Nome_Completo: "
+
+#~ msgid "Personal Name: "
+#~ msgstr "Nome Completo: "
+
+#~ msgid "Searching type"
+#~ msgstr "Procurando tipo"
+
+#~ msgid "Document Layout"
+#~ msgstr "Formatação do documento"
+
+#~ msgid "Bookmark Options"
+#~ msgstr "Opções do Livro de Marcações"
+
+#~ msgid " failed"
+#~ msgstr " falhou"
+
+#~ msgid "Ignoring invalid HOME"
+#~ msgstr "Ignorando $HOME inválido"
+
+#~ msgid ""
+#~ "partial_thres specifies the number of lines Lynx should download and render\n"
+#~ "before we redraw the screen in Partial Display logic\n"
+#~ "e.g., partial_thres=2\n"
+#~ "would have Lynx redraw every 2 lines that it renders\n"
+#~ "partial_thres=-1 would use the entire screensize\n"
+#~ msgstr ""
+#~ "partial_thres especifica o número de linhas que o Lynx irá copiar antes \n"
+#~ "de apresentar a tela parcial. \n"
+#~ "ex. partial_thres=2\n"
+#~ "\"would have Lynx redraw every 2 lines that it renders\\n\"\n"
+#~ "\"partial_thres=-1 would use the entire screensize\"\n"
diff --git a/po/readme b/po/readme
new file mode 100644
index 0000000..c5dae39
--- /dev/null
+++ b/po/readme
@@ -0,0 +1,21 @@
+
+> I want to translate to xxxxxx.
+
+The full list of messages is in lynx.pot, which is generated from looking
+at the calls to gettext, use it as template for translations.
+
+syntax:
+
+#: src/LYMainLoop.c:1512 src/LYMainLoop.c:1516
+msgid "Fatal error - could not open output file %s\n"
+msgstr ""
+
+First line is a comment beginning with #, for your information.
+Original english string is <msgid>, do not change it.
+Translation in <msgstr>, empty string assume english default.
+Do not forget to include %s properly in your contributed translation!
+
+A good place to start is with the messages derived from LYMessages_en.h
+
+The Translation Project is collecting message translation files at
+http://www.iro.umontreal.ca/contrib/po/HTML/domain-lynx.html
diff --git a/po/ro.po b/po/ro.po
new file mode 100644
index 0000000..8949226
--- /dev/null
+++ b/po/ro.po
@@ -0,0 +1,5996 @@
+# Mesajele în limba română pentru pachetul lynx
+# Copyright (C) 2019 Free Software Foundation, Inc.
+# This file is distributed under the same license as the lynx package.
+# Daniel Șerbănescu <daniel@serbanescu.dk>, 2019.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: lynx 2.9.0-dev3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2019-08-23 19:59-0400\n"
+"PO-Revision-Date: 2019-08-26 19:18+0200\n"
+"Last-Translator: Daniel Șerbănescu <daniel@serbanescu.dk>\n"
+"Language-Team: Romanian <translation-team-ro@lists.sourceforge.net>\n"
+"Language: ro\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 2.2.3\n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n==0 || (n!=1 && n%100>=1 && n%100<=19) ? 1 : 2);\n"
+
+#. ******************************************************************
+#. * The following definitions are for status line prompts, messages, or
+#. * warnings issued by Lynx during program execution. You can modify
+#. * them to make them more appropriate for your site. We recommend that
+#. * you extend these definitions to other languages using the gettext
+#. * library. There are also scattered uses of 'gettext()' throughout the
+#. * Lynx source, covering all but those messages which (a) are used for
+#. * debugging (CTRACE) or (b) are constants used in interaction with
+#. * other programs.
+#. *
+#. * See ABOUT-NLS and po/readme for details and location of contributed
+#. * translations. When no translation is available, the English default is
+#. * used.
+#.
+#: LYMessages.c:28
+#, c-format
+msgid "Alert!: %s"
+msgstr "Atenție!: %s"
+
+#: LYMessages.c:29
+msgid "Welcome"
+msgstr "Bine ați venit"
+
+#: LYMessages.c:30
+msgid "Are you sure you want to quit?"
+msgstr "Sigur doriți să ieșiți?"
+
+#: LYMessages.c:32
+msgid "Really exit from Lynx?"
+msgstr "Ieșiți din Lynx?"
+
+#: LYMessages.c:34
+msgid "Connection interrupted."
+msgstr ""
+
+#: LYMessages.c:35
+msgid "Data transfer interrupted."
+msgstr ""
+
+#: LYMessages.c:36
+msgid "Cancelled!!!"
+msgstr ""
+
+#: LYMessages.c:37
+msgid "Cancelling!"
+msgstr ""
+
+#: LYMessages.c:38
+msgid "Excellent!!!"
+msgstr ""
+
+#: LYMessages.c:39
+msgid "OK"
+msgstr "v"
+
+#: LYMessages.c:40
+msgid "Done!"
+msgstr ""
+
+#: LYMessages.c:41
+msgid "Bad request!"
+msgstr ""
+
+#: LYMessages.c:42
+msgid "previous"
+msgstr ""
+
+#: LYMessages.c:43
+msgid "next screen"
+msgstr ""
+
+#: LYMessages.c:44
+msgid "HELP!"
+msgstr ""
+
+#: LYMessages.c:45
+msgid ", help on "
+msgstr ""
+
+#. #define HELP
+#: LYMessages.c:47
+msgid "Commands: Use arrow keys to move, '?' for help, 'q' to quit, '<-' to go back."
+msgstr "Comenzi: Utilizați săgețile pentru navigare, „?†pentru ajutor, „q†pentru ieșire, „<-†pentru navigare înapoi."
+
+#. #define MOREHELP
+#: LYMessages.c:49
+msgid "-- press space for more, use arrow keys to move, '?' for help, 'q' to quit."
+msgstr "-- apăsați spațiu pentru mai mult, utilizați săgețile pentru navigare, „?†pentru ajutor, „q†pentru ieșire."
+
+#: LYMessages.c:50
+msgid "-- press space for next page --"
+msgstr "-- apăsați spațiu pentru pagina următoare --"
+
+#: LYMessages.c:51
+msgid "URL too long"
+msgstr "URL prea lung"
+
+#. Inactive input fields, messages used with -tna option - kw
+#. #define FORM_LINK_TEXT_ADV_MSG_INA
+#: LYMessages.c:57
+#, c-format
+msgid "(Textfield \"%s\"); Inactive. Press <return> to activate."
+msgstr ""
+
+#. #define FORM_LINK_TEXT_MESSAGE_INA
+#: LYMessages.c:59
+msgid "(Text entry field) Inactive. Press <return> to activate."
+msgstr ""
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG_INA
+#: LYMessages.c:61
+#, c-format
+msgid "(Textarea \"%s\"); Inactive. Press <return> to activate."
+msgstr ""
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_INA
+#: LYMessages.c:63
+msgid "(Textarea) Inactive. Press <return> to activate."
+msgstr ""
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG_INA_E
+#: LYMessages.c:65
+#, c-format
+msgid "(Textarea \"%s\"); Inactive. Press <return> to activate (%s for editor)."
+msgstr ""
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_INA_E
+#: LYMessages.c:67
+#, c-format
+msgid "(Textarea) Inactive. Press <return> to activate (%s for editor)."
+msgstr ""
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE_INA
+#: LYMessages.c:69
+msgid "(Form field) Inactive. Use <return> to edit."
+msgstr ""
+
+#. #define FORM_TEXT_SUBMIT_MESSAGE_INA_X
+#: LYMessages.c:71
+#, c-format
+msgid "(Form field) Inactive. Use <return> to edit (%s to submit with no cache)."
+msgstr ""
+
+#. #define FORM_TEXT_RESUBMIT_MESSAGE_INA
+#: LYMessages.c:73
+msgid "(Form field) Inactive. Press <return> to edit, press <return> twice to submit."
+msgstr ""
+
+#. #define FORM_TEXT_SUBMIT_MAILTO_MSG_INA
+#: LYMessages.c:75
+msgid "(mailto form field) Inactive. Press <return> to change."
+msgstr ""
+
+#. #define FORM_LINK_PASSWORD_MESSAGE_INA
+#: LYMessages.c:77
+msgid "(Password entry field) Inactive. Press <return> to activate."
+msgstr ""
+
+#. #define FORM_LINK_FILE_UNM_MSG
+#: LYMessages.c:80
+msgid "UNMODIFIABLE file entry field. Use UP or DOWN arrows or tab to move off."
+msgstr ""
+
+#. #define FORM_LINK_FILE_MESSAGE
+#: LYMessages.c:82
+msgid "(File entry field) Enter filename. Use UP or DOWN arrows or tab to move off."
+msgstr ""
+
+#. #define FORM_LINK_TEXT_ADV_MSG
+#. #define FORM_LINK_TEXT_MESSAGE
+#: LYMessages.c:84 LYMessages.c:86
+#, c-format
+msgid "(Textfield \"%s\"); Enter text. Use UP or DOWN arrows or tab to move off."
+msgstr ""
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG
+#: LYMessages.c:88
+#, c-format
+msgid "(Textarea \"%s\"); Enter text. Use UP/DOWN arrows or TAB to move off."
+msgstr ""
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE
+#: LYMessages.c:90
+msgid "(Textarea) Enter text. Use UP/DOWN arrows or TAB to move off."
+msgstr ""
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG_E
+#: LYMessages.c:92
+#, c-format
+msgid "(Textarea \"%s\"); Enter text. Use UP/DOWN arrows or TAB to move off (%s for editor)."
+msgstr ""
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_E
+#: LYMessages.c:94
+#, c-format
+msgid "(Textarea) Enter text. Use UP/DOWN arrows or TAB to move off (%s for editor)."
+msgstr ""
+
+#. #define FORM_LINK_TEXT_UNM_MSG
+#: LYMessages.c:96
+msgid "UNMODIFIABLE form text field. Use UP or DOWN arrows or tab to move off."
+msgstr ""
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE
+#: LYMessages.c:98
+msgid "(Form field) Enter text. Use <return> to submit."
+msgstr ""
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE_X
+#: LYMessages.c:100
+#, c-format
+msgid "(Form field) Enter text. Use <return> to submit (%s for no cache)."
+msgstr ""
+
+#. #define FORM_LINK_TEXT_RESUBMIT_MESSAGE
+#: LYMessages.c:102
+msgid "(Form field) Enter text. Use <return> to submit, arrows or tab to move off."
+msgstr ""
+
+#. #define FORM_LINK_TEXT_SUBMIT_UNM_MSG
+#: LYMessages.c:104
+msgid "UNMODIFIABLE form field. Use UP or DOWN arrows or tab to move off."
+msgstr ""
+
+#. #define FORM_LINK_TEXT_SUBMIT_MAILTO_MSG
+#: LYMessages.c:106
+msgid "(mailto form field) Enter text. Use <return> to submit, arrows to move off."
+msgstr ""
+
+#. #define FORM_LINK_TEXT_SUBMIT_MAILTO_DIS_MSG
+#: LYMessages.c:108
+msgid "(mailto form field) Mail is disallowed so you cannot submit."
+msgstr ""
+
+#. #define FORM_LINK_PASSWORD_MESSAGE
+#: LYMessages.c:110
+msgid "(Password entry field) Enter text. Use UP or DOWN arrows or tab to move off."
+msgstr ""
+
+#. #define FORM_LINK_PASSWORD_UNM_MSG
+#: LYMessages.c:112
+msgid "UNMODIFIABLE form password. Use UP or DOWN arrows or tab to move off."
+msgstr ""
+
+#. #define FORM_LINK_CHECKBOX_ADV_MSG
+#: LYMessages.c:114
+#, c-format
+msgid "(Checkbox \"%s\"); Use right-arrow or <return> to toggle."
+msgstr ""
+
+#. #define FORM_LINK_CHECKBOX_MESSAGE
+#: LYMessages.c:116
+msgid "(Checkbox Field) Use right-arrow or <return> to toggle."
+msgstr ""
+
+#. #define FORM_LINK_CHECKBOX_UNM_MSG
+#: LYMessages.c:118
+msgid "UNMODIFIABLE form checkbox. Use UP or DOWN arrows or tab to move off."
+msgstr ""
+
+#. #define FORM_LINK_RADIO_ADV_MSG
+#: LYMessages.c:120
+#, c-format
+msgid "(Radio Button \"%s\"); Use right-arrow or <return> to toggle."
+msgstr ""
+
+#. #define FORM_LINK_RADIO_MESSAGE
+#: LYMessages.c:122
+msgid "(Radio Button) Use right-arrow or <return> to toggle."
+msgstr ""
+
+#. #define FORM_LINK_RADIO_UNM_MSG
+#: LYMessages.c:124
+msgid "UNMODIFIABLE form radio button. Use UP or DOWN arrows or tab to move off."
+msgstr ""
+
+#. #define FORM_LINK_SUBMIT_PREFIX
+#: LYMessages.c:126
+msgid "Submit ('x' for no cache) to "
+msgstr ""
+
+#. #define FORM_LINK_RESUBMIT_PREFIX
+#: LYMessages.c:128
+msgid "Submit to "
+msgstr ""
+
+#. #define FORM_LINK_SUBMIT_MESSAGE
+#: LYMessages.c:130
+msgid "(Form submit button) Use right-arrow or <return> to submit ('x' for no cache)."
+msgstr ""
+
+#. #define FORM_LINK_RESUBMIT_MESSAGE
+#: LYMessages.c:132
+msgid "(Form submit button) Use right-arrow or <return> to submit."
+msgstr ""
+
+#. #define FORM_LINK_SUBMIT_DIS_MSG
+#: LYMessages.c:134
+msgid "DISABLED form submit button. Use UP or DOWN arrows or tab to move off."
+msgstr ""
+
+#. #define FORM_LINK_SUBMIT_MAILTO_PREFIX
+#: LYMessages.c:136
+msgid "Submit mailto form to "
+msgstr ""
+
+#. #define FORM_LINK_SUBMIT_MAILTO_MSG
+#: LYMessages.c:138
+msgid "(mailto form submit button) Use right-arrow or <return> to submit."
+msgstr ""
+
+#. #define FORM_LINK_SUBMIT_MAILTO_DIS_MSG
+#: LYMessages.c:140
+msgid "(mailto form submit button) Mail is disallowed so you cannot submit."
+msgstr ""
+
+#. #define FORM_LINK_RESET_MESSAGE
+#: LYMessages.c:142
+msgid "(Form reset button) Use right-arrow or <return> to reset form to defaults."
+msgstr ""
+
+#. #define FORM_LINK_RESET_DIS_MSG
+#: LYMessages.c:144
+msgid "DISABLED form reset button. Use UP or DOWN arrows or tab to move off."
+msgstr ""
+
+#. #define FORM_LINK_BUTTON_MESSAGE
+#: LYMessages.c:146
+msgid "(Script button) Use UP or DOWN arrows or tab to move off."
+msgstr ""
+
+#. #define FORM_LINK_BUTTON_ADV_MSG
+#: LYMessages.c:148
+#, c-format
+msgid "(Script button \"%s\"); Use UP or DOWN arrows or tab to move off."
+msgstr ""
+
+#. #define FORM_LINK_BUTTON_DIS_MSG
+#: LYMessages.c:150
+msgid "DISABLED Script button. Use UP or DOWN arrows or tab to move off."
+msgstr ""
+
+#. #define FORM_LINK_OPTION_LIST_ADV_MSG
+#: LYMessages.c:152
+#, c-format
+msgid "(Option list \"%s\"); Hit return to select option."
+msgstr ""
+
+#. #define FORM_LINK_OPTION_LIST_MESSAGE
+#: LYMessages.c:154
+msgid "(Option list) Hit return and use arrow keys and return to select option."
+msgstr ""
+
+#. #define CHOICE_LIST_ADV_MSG
+#: LYMessages.c:156
+#, c-format
+msgid "(Choice entry \"%s\"); Use arrow keys and return to select option."
+msgstr ""
+
+#. #define CHOICE_LIST_MESSAGE
+#: LYMessages.c:158
+msgid "(Choice list) Hit return and use arrow keys and return to select option."
+msgstr ""
+
+#. #define MOUSE_CHOICE_MESSAGE
+#: LYMessages.c:160
+msgid "Left mouse button or return to select, arrow keys to scroll."
+msgstr ""
+
+#. #define FORM_LINK_OPTION_LIST_UNM_MSG
+#: LYMessages.c:162
+msgid "UNMODIFIABLE option list. Use return or arrow keys to review or leave."
+msgstr ""
+
+#. #define CHOICE_LIST_UNM_MSG
+#: LYMessages.c:164
+msgid "UNMODIFIABLE choice list. Use return or arrow keys to review or leave."
+msgstr ""
+
+#: LYMessages.c:165
+msgid "Submitting form..."
+msgstr ""
+
+#: LYMessages.c:166
+msgid "Resetting form..."
+msgstr ""
+
+#. #define RELOADING_FORM
+#: LYMessages.c:168
+msgid "Reloading document. Any form entries will be lost!"
+msgstr ""
+
+#. #define LINK_NOT_IN_FORM
+#: LYMessages.c:170
+msgid "The current link is not in a FORM"
+msgstr ""
+
+#: LYMessages.c:171
+#, c-format
+msgid "Warning: Cannot transcode form data to charset %s!"
+msgstr ""
+
+#. #define NORMAL_LINK_MESSAGE
+#: LYMessages.c:174
+msgid "(NORMAL LINK) Use right-arrow or <return> to activate."
+msgstr ""
+
+#: LYMessages.c:175
+msgid "The resource requested is not available at this time."
+msgstr ""
+
+#: LYMessages.c:176
+msgid "Enter Lynx keystroke command: "
+msgstr ""
+
+#: LYMessages.c:177
+msgid "Looking up "
+msgstr ""
+
+#: LYMessages.c:178
+#, c-format
+msgid "Getting %s"
+msgstr ""
+
+#: LYMessages.c:179
+#, c-format
+msgid "Skipping %s"
+msgstr ""
+
+#: LYMessages.c:180
+#, c-format
+msgid "Using %s"
+msgstr ""
+
+#: LYMessages.c:181
+#, c-format
+msgid "Illegal URL: %s"
+msgstr "URL nelegal: %s"
+
+#: LYMessages.c:182
+#, c-format
+msgid "Badly formed address %s"
+msgstr ""
+
+#: LYMessages.c:183
+#, c-format
+msgid "URL: %s"
+msgstr "URL: %s"
+
+#: LYMessages.c:184
+msgid "Unable to access WWW file!!!"
+msgstr ""
+
+#: LYMessages.c:185
+#, c-format
+msgid "This is a searchable index. Use %s to search."
+msgstr ""
+
+#. #define WWW_INDEX_MORE_MESSAGE
+#: LYMessages.c:187
+#, c-format
+msgid "--More-- This is a searchable index. Use %s to search."
+msgstr ""
+
+#: LYMessages.c:188
+msgid "You have entered an invalid link number."
+msgstr ""
+
+#. #define SOURCE_HELP
+#: LYMessages.c:190
+msgid "Currently viewing document source. Press '\\' to return to rendered version."
+msgstr ""
+
+#. #define NOVICE_LINE_ONE
+#: LYMessages.c:192
+msgid " Arrow keys: Up and Down to move. Right to follow a link; Left to go back. \n"
+msgstr " Tastele săgeți: Sus și Jos pentru navigare. Dreapta pentru a urma o legătură; Stânga pentru a naviga înapoi. \n"
+
+#. #define NOVICE_LINE_TWO
+#: LYMessages.c:194
+msgid " H)elp O)ptions P)rint G)o M)ain screen Q)uit /=search [delete]=history list \n"
+msgstr " Ajutor(H) O)pțiuni Ti(P)ărește Navi(G)hează Ecranul principal(M) Ieșire(Q) /=căutare [delete]=lista istoricului \n"
+
+#. #define NOVICE_LINE_TWO_A
+#: LYMessages.c:196
+msgid " O)ther cmds H)elp K)eymap G)oto P)rint M)ain screen o)ptions Q)uit \n"
+msgstr ""
+
+#. #define NOVICE_LINE_TWO_B
+#: LYMessages.c:198
+msgid " O)ther cmds B)ack E)dit D)ownload ^R)eload ^W)ipe screen search doc: / \n"
+msgstr ""
+
+#. #define NOVICE_LINE_TWO_C
+#: LYMessages.c:200
+msgid "O)ther cmds C)omment History: <backspace> Bookmarks: V)iew, A)dd, R)emove \n"
+msgstr ""
+
+#. #define FORM_NOVICELINE_ONE
+#: LYMessages.c:202
+msgid " Enter text into the field by typing on the keyboard "
+msgstr ""
+
+#. #define FORM_NOVICELINE_TWO
+#: LYMessages.c:204
+msgid " Ctrl-U to delete all text in field, [Backspace] to delete a character "
+msgstr ""
+
+#. #define FORM_NOVICELINE_TWO_DELBL
+#: LYMessages.c:206
+msgid " Ctrl-U to delete text in field, [Backspace] to delete a character "
+msgstr ""
+
+#. #define FORM_NOVICELINE_TWO_VAR
+#: LYMessages.c:208
+#, c-format
+msgid " %s to delete all text in field, [Backspace] to delete a character "
+msgstr ""
+
+#. #define FORM_NOVICELINE_TWO_DELBL_VAR
+#: LYMessages.c:210
+#, c-format
+msgid " %s to delete text in field, [Backspace] to delete a character "
+msgstr ""
+
+#. mailto
+#: LYMessages.c:213
+msgid "Malformed mailto form submission! Cancelled!"
+msgstr ""
+
+#: LYMessages.c:214
+msgid "Warning! Control codes in mail address replaced by ?"
+msgstr ""
+
+#: LYMessages.c:215
+msgid "Mail disallowed! Cannot submit."
+msgstr ""
+
+#: LYMessages.c:216
+msgid "Mailto form submission failed!"
+msgstr ""
+
+#: LYMessages.c:217
+msgid "Mailto form submission Cancelled!!!"
+msgstr ""
+
+#: LYMessages.c:218
+msgid "Sending form content..."
+msgstr ""
+
+#: LYMessages.c:219
+msgid "No email address is present in mailto URL!"
+msgstr ""
+
+#. #define MAILTO_URL_TEMPOPEN_FAILED
+#: LYMessages.c:221
+msgid "Unable to open temporary file for mailto URL!"
+msgstr ""
+
+#. #define INC_ORIG_MSG_PROMPT
+#: LYMessages.c:223
+msgid "Do you wish to include the original message?"
+msgstr ""
+
+#. #define INC_PREPARSED_MSG_PROMPT
+#: LYMessages.c:225
+msgid "Do you wish to include the preparsed source?"
+msgstr ""
+
+#. #define SPAWNING_EDITOR_FOR_MAIL
+#: LYMessages.c:227
+msgid "Spawning your selected editor to edit mail message"
+msgstr ""
+
+#. #define ERROR_SPAWNING_EDITOR
+#: LYMessages.c:229
+msgid "Error spawning editor, check your editor definition in the options menu"
+msgstr ""
+
+#: LYMessages.c:230
+msgid "Send this comment?"
+msgstr ""
+
+#: LYMessages.c:231
+msgid "Send this message?"
+msgstr ""
+
+#: LYMessages.c:232
+msgid "Sending your message..."
+msgstr ""
+
+#: LYMessages.c:233
+msgid "Sending your comment:"
+msgstr ""
+
+#. textarea
+#: LYMessages.c:236
+msgid "Not in a TEXTAREA; cannot use external editor."
+msgstr ""
+
+#: LYMessages.c:237
+msgid "Not in a TEXTAREA; cannot use command."
+msgstr ""
+
+#: LYMessages.c:239
+msgid "file: ACTIONs are disallowed!"
+msgstr ""
+
+#. #define FILE_SERVED_LINKS_DISALLOWED
+#: LYMessages.c:241
+msgid "file: URLs via served links are disallowed!"
+msgstr ""
+
+#: LYMessages.c:242
+msgid "Access to local files denied."
+msgstr ""
+
+#: LYMessages.c:243
+msgid "file: URLs via bookmarks are disallowed!"
+msgstr ""
+
+#. #define SPECIAL_VIA_EXTERNAL_DISALLOWED
+#: LYMessages.c:245
+msgid "This special URL is not allowed in external documents!"
+msgstr ""
+
+#: LYMessages.c:246
+msgid "Press <return> to return to Lynx."
+msgstr ""
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:249
+msgid "Spawning DCL subprocess. Use 'logout' to return to Lynx.\n"
+msgstr ""
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:253
+msgid "Type EXIT to return to Lynx.\n"
+msgstr ""
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:256
+msgid "Spawning your default shell. Use 'exit' to return to Lynx.\n"
+msgstr ""
+
+#: LYMessages.c:259
+msgid "Spawning is currently disabled."
+msgstr ""
+
+#: LYMessages.c:260
+msgid "The 'd'ownload command is currently disabled."
+msgstr ""
+
+#: LYMessages.c:261
+msgid "You cannot download an input field."
+msgstr ""
+
+#: LYMessages.c:262
+msgid "Form has a mailto action! Cannot download."
+msgstr ""
+
+#: LYMessages.c:263
+msgid "You cannot download a mailto: link."
+msgstr ""
+
+#: LYMessages.c:264
+msgid "You cannot download cookies."
+msgstr ""
+
+#: LYMessages.c:265
+msgid "You cannot download a printing option."
+msgstr ""
+
+#: LYMessages.c:266
+msgid "You cannot download an upload option."
+msgstr ""
+
+#: LYMessages.c:267
+msgid "You cannot download an permit option."
+msgstr ""
+
+#: LYMessages.c:268
+msgid "This special URL cannot be downloaded!"
+msgstr ""
+
+#: LYMessages.c:269
+msgid "Nothing to download."
+msgstr ""
+
+#: LYMessages.c:270
+msgid "Trace ON!"
+msgstr ""
+
+#: LYMessages.c:271
+msgid "Trace OFF!"
+msgstr ""
+
+#. #define CLICKABLE_IMAGES_ON
+#: LYMessages.c:273
+msgid "Links will be included for all images! Reloading..."
+msgstr ""
+
+#. #define CLICKABLE_IMAGES_OFF
+#: LYMessages.c:275
+msgid "Standard image handling restored! Reloading..."
+msgstr ""
+
+#. #define PSEUDO_INLINE_ALTS_ON
+#: LYMessages.c:277
+msgid "Pseudo_ALTs will be inserted for inlines without ALT strings! Reloading..."
+msgstr ""
+
+#. #define PSEUDO_INLINE_ALTS_OFF
+#: LYMessages.c:279
+msgid "Inlines without an ALT string specified will be ignored! Reloading..."
+msgstr ""
+
+#: LYMessages.c:280
+msgid "Raw 8-bit or CJK mode toggled OFF! Reloading..."
+msgstr ""
+
+#: LYMessages.c:281
+msgid "Raw 8-bit or CJK mode toggled ON! Reloading..."
+msgstr ""
+
+#. #define HEAD_D_L_OR_CANCEL
+#: LYMessages.c:283
+msgid "Send HEAD request for D)ocument or L)ink, or C)ancel? (d,l,c): "
+msgstr ""
+
+#. #define HEAD_D_OR_CANCEL
+#: LYMessages.c:285
+msgid "Send HEAD request for D)ocument, or C)ancel? (d,c): "
+msgstr ""
+
+#: LYMessages.c:286
+msgid "Sorry, the document is not an http URL."
+msgstr ""
+
+#: LYMessages.c:287
+msgid "Sorry, the link is not an http URL."
+msgstr ""
+
+#: LYMessages.c:288
+msgid "Sorry, the ACTION for this form is disabled."
+msgstr ""
+
+#. #define FORM_ACTION_NOT_HTTP_URL
+#: LYMessages.c:290
+msgid "Sorry, the ACTION for this form is not an http URL."
+msgstr ""
+
+#: LYMessages.c:291
+msgid "Not an http URL or form ACTION!"
+msgstr ""
+
+#: LYMessages.c:292
+msgid "This special URL cannot be a form ACTION!"
+msgstr ""
+
+#: LYMessages.c:293
+msgid "URL is not in starting realm!"
+msgstr ""
+
+#: LYMessages.c:294
+msgid "News posting is disabled!"
+msgstr ""
+
+#: LYMessages.c:295
+msgid "File management support is disabled!"
+msgstr ""
+
+#: LYMessages.c:296
+msgid "No jump file is currently available."
+msgstr ""
+
+#: LYMessages.c:297
+msgid "Jump to (use '?' for list): "
+msgstr ""
+
+#: LYMessages.c:298
+msgid "Jumping to a shortcut URL is disallowed!"
+msgstr ""
+
+#: LYMessages.c:299
+msgid "Random URL is disallowed! Use a shortcut."
+msgstr ""
+
+#: LYMessages.c:300
+msgid "No random URLs have been used thus far."
+msgstr ""
+
+#: LYMessages.c:301
+msgid "Bookmark features are currently disabled."
+msgstr ""
+
+#: LYMessages.c:302
+msgid "Execution via bookmarks is disabled."
+msgstr ""
+
+#. #define BOOKMARK_FILE_NOT_DEFINED
+#: LYMessages.c:304
+#, c-format
+msgid "Bookmark file is not defined. Use %s to see options."
+msgstr ""
+
+#. #define NO_TEMP_FOR_HOTLIST
+#: LYMessages.c:306
+msgid "Unable to open tempfile for X Mosaic hotlist conversion."
+msgstr ""
+
+#: LYMessages.c:307
+msgid "ERROR - unable to open bookmark file."
+msgstr ""
+
+#. #define BOOKMARK_OPEN_FAILED_FOR_DEL
+#: LYMessages.c:309
+msgid "Unable to open bookmark file for deletion of link."
+msgstr ""
+
+#. #define BOOKSCRA_OPEN_FAILED_FOR_DEL
+#: LYMessages.c:311
+msgid "Unable to open scratch file for deletion of link."
+msgstr ""
+
+#: LYMessages.c:313
+msgid "Error renaming scratch file."
+msgstr ""
+
+#: LYMessages.c:315
+msgid "Error renaming temporary file."
+msgstr ""
+
+#. #define BOOKTEMP_COPY_FAIL
+#: LYMessages.c:317
+msgid "Unable to copy temporary file for deletion of link."
+msgstr ""
+
+#. #define BOOKTEMP_REOPEN_FAIL_FOR_DEL
+#: LYMessages.c:319
+msgid "Unable to reopen temporary file for deletion of link."
+msgstr ""
+
+#. #define BOOKMARK_LINK_NOT_ONE_LINE
+#: LYMessages.c:322
+msgid "Link is not by itself all on one line in bookmark file."
+msgstr ""
+
+#: LYMessages.c:323
+msgid "Bookmark deletion failed."
+msgstr ""
+
+#. #define BOOKMARKS_NOT_TRAVERSED
+#: LYMessages.c:325
+msgid "Bookmark files cannot be traversed (only http URLs)."
+msgstr ""
+
+#. #define BOOKMARKS_NOT_OPEN
+#: LYMessages.c:327
+msgid "Unable to open bookmark file, use 'a' to save a link first"
+msgstr ""
+
+#: LYMessages.c:328
+msgid "There are no links in this bookmark file!"
+msgstr ""
+
+#. #define CACHE_D_OR_CANCEL
+#: LYMessages.c:330
+msgid "D)elete cached document or C)ancel? (d,c): "
+msgstr ""
+
+#. #define BOOK_D_L_OR_CANCEL
+#: LYMessages.c:332
+msgid "Save D)ocument or L)ink to bookmark file or C)ancel? (d,l,c): "
+msgstr ""
+
+#: LYMessages.c:333
+msgid "Save D)ocument to bookmark file or C)ancel? (d,c): "
+msgstr ""
+
+#: LYMessages.c:334
+msgid "Save L)ink to bookmark file or C)ancel? (l,c): "
+msgstr ""
+
+#. #define NOBOOK_POST_FORM
+#: LYMessages.c:336
+msgid "Documents from forms with POST content cannot be saved as bookmarks."
+msgstr ""
+
+#: LYMessages.c:337
+msgid "Cannot save form fields/links"
+msgstr ""
+
+#. #define NOBOOK_HSML
+#: LYMessages.c:339
+msgid "History, showinfo, menu and list files cannot be saved as bookmarks."
+msgstr ""
+
+#. #define CONFIRM_BOOKMARK_DELETE
+#: LYMessages.c:341
+msgid "Do you really want to delete this link from your bookmark file?"
+msgstr ""
+
+#: LYMessages.c:342
+msgid "Malformed address."
+msgstr ""
+
+#. #define HISTORICAL_ON_MINIMAL_OFF
+#: LYMessages.c:344
+msgid "Historical comment parsing ON (Minimal is overridden)!"
+msgstr ""
+
+#. #define HISTORICAL_OFF_MINIMAL_ON
+#: LYMessages.c:346
+msgid "Historical comment parsing OFF (Minimal is in effect)!"
+msgstr ""
+
+#. #define HISTORICAL_ON_VALID_OFF
+#: LYMessages.c:348
+msgid "Historical comment parsing ON (Valid is overridden)!"
+msgstr ""
+
+#. #define HISTORICAL_OFF_VALID_ON
+#: LYMessages.c:350
+msgid "Historical comment parsing OFF (Valid is in effect)!"
+msgstr ""
+
+#. #define MINIMAL_ON_IN_EFFECT
+#: LYMessages.c:352
+msgid "Minimal comment parsing ON (and in effect)!"
+msgstr ""
+
+#. #define MINIMAL_OFF_VALID_ON
+#: LYMessages.c:354
+msgid "Minimal comment parsing OFF (Valid is in effect)!"
+msgstr ""
+
+#. #define MINIMAL_ON_BUT_HISTORICAL
+#: LYMessages.c:356
+msgid "Minimal comment parsing ON (but Historical is in effect)!"
+msgstr ""
+
+#. #define MINIMAL_OFF_HISTORICAL_ON
+#: LYMessages.c:358
+msgid "Minimal comment parsing OFF (Historical is in effect)!"
+msgstr ""
+
+#: LYMessages.c:359
+msgid "Soft double-quote parsing ON!"
+msgstr ""
+
+#: LYMessages.c:360
+msgid "Soft double-quote parsing OFF!"
+msgstr ""
+
+#: LYMessages.c:361
+msgid "Now using TagSoup parsing of HTML."
+msgstr ""
+
+#: LYMessages.c:362
+msgid "Now using SortaSGML parsing of HTML!"
+msgstr ""
+
+#: LYMessages.c:363
+msgid "You are already at the end of this document."
+msgstr "Sunteți deja la sfârșitul acestui document."
+
+#: LYMessages.c:364
+msgid "You are already at the beginning of this document."
+msgstr "Sunteți deja la începutul acestui document."
+
+#: LYMessages.c:365
+#, c-format
+msgid "You are already at page %d of this document."
+msgstr ""
+
+#: LYMessages.c:366
+#, c-format
+msgid "Link number %d already is current."
+msgstr ""
+
+#: LYMessages.c:367
+msgid "You are already at the first document"
+msgstr ""
+
+#: LYMessages.c:368
+msgid "There are no links above this line of the document."
+msgstr ""
+
+#: LYMessages.c:369
+msgid "There are no links below this line of the document."
+msgstr ""
+
+#. #define MAXLEN_REACHED_DEL_OR_MOV
+#: LYMessages.c:371
+msgid "Maximum length reached! Delete text or move off field."
+msgstr ""
+
+#. #define NOT_ON_SUBMIT_OR_LINK
+#: LYMessages.c:373
+msgid "You are not on a form submission button or normal link."
+msgstr ""
+
+#. #define NEED_CHECKED_RADIO_BUTTON
+#: LYMessages.c:375
+msgid "One radio button must be checked at all times!"
+msgstr ""
+
+#: LYMessages.c:376
+msgid "No submit button for this form, submit single text field?"
+msgstr ""
+
+#: LYMessages.c:377
+msgid "Do you want to go back to the previous document?"
+msgstr ""
+
+#: LYMessages.c:378
+msgid "Use arrows or tab to move off of field."
+msgstr ""
+
+#. #define ENTER_TEXT_ARROWS_OR_TAB
+#: LYMessages.c:380
+msgid "Enter text. Use arrows or tab to move off of field."
+msgstr ""
+
+#: LYMessages.c:381
+msgid "** Bad HTML!! No form action defined. **"
+msgstr ""
+
+#: LYMessages.c:382
+msgid "Bad HTML!! Unable to create popup window!"
+msgstr ""
+
+#: LYMessages.c:383
+msgid "Unable to create popup window!"
+msgstr ""
+
+#: LYMessages.c:384
+msgid "Goto a random URL is disallowed!"
+msgstr ""
+
+#: LYMessages.c:385
+msgid "Goto a non-http URL is disallowed!"
+msgstr ""
+
+#: LYMessages.c:386
+#, c-format
+msgid "You are not allowed to goto \"%s\" URLs"
+msgstr ""
+
+#: LYMessages.c:387
+msgid "URL to open: "
+msgstr ""
+
+#: LYMessages.c:388
+msgid "Edit the current Goto URL: "
+msgstr ""
+
+#: LYMessages.c:389
+msgid "Edit the previous Goto URL: "
+msgstr ""
+
+#: LYMessages.c:390
+msgid "Edit a previous Goto URL: "
+msgstr ""
+
+#: LYMessages.c:391
+msgid "Current document has POST data."
+msgstr ""
+
+#: LYMessages.c:392
+msgid "Edit this document's URL: "
+msgstr ""
+
+#: LYMessages.c:393
+msgid "Edit the current link's URL: "
+msgstr ""
+
+#: LYMessages.c:394
+msgid "Edit the form's submit-URL: "
+msgstr ""
+
+#: LYMessages.c:395
+msgid "You cannot edit File Management URLs"
+msgstr ""
+
+#: LYMessages.c:396
+msgid "Enter a database query: "
+msgstr ""
+
+#: LYMessages.c:397
+msgid "Enter a whereis query: "
+msgstr ""
+
+#: LYMessages.c:398
+msgid "Edit the current query: "
+msgstr ""
+
+#: LYMessages.c:399
+msgid "Edit the previous query: "
+msgstr ""
+
+#: LYMessages.c:400
+msgid "Edit a previous query: "
+msgstr ""
+
+#. #define USE_C_R_TO_RESUB_CUR_QUERY
+#: LYMessages.c:402
+msgid "Use Control-R to resubmit the current query."
+msgstr ""
+
+#: LYMessages.c:403
+msgid "Edit the current shortcut: "
+msgstr ""
+
+#: LYMessages.c:404
+msgid "Edit the previous shortcut: "
+msgstr ""
+
+#: LYMessages.c:405
+msgid "Edit a previous shortcut: "
+msgstr ""
+
+#: LYMessages.c:406
+#, c-format
+msgid "Key '%c' is not mapped to a jump file!"
+msgstr ""
+
+#: LYMessages.c:407
+msgid "Cannot locate jump file!"
+msgstr ""
+
+#: LYMessages.c:408
+msgid "Cannot open jump file!"
+msgstr ""
+
+#: LYMessages.c:409
+msgid "Error reading jump file!"
+msgstr ""
+
+#: LYMessages.c:410
+msgid "Out of memory reading jump file!"
+msgstr ""
+
+#: LYMessages.c:411
+msgid "Out of memory reading jump table!"
+msgstr ""
+
+#: LYMessages.c:412
+msgid "No index is currently available."
+msgstr ""
+
+#. #define CONFIRM_MAIN_SCREEN
+#: LYMessages.c:414
+msgid "Do you really want to go to the Main screen?"
+msgstr ""
+
+#: LYMessages.c:415
+msgid "You are already at main screen!"
+msgstr ""
+
+#. #define NOT_ISINDEX
+#: LYMessages.c:417
+msgid "Not a searchable indexed document -- press '/' to search for a text string"
+msgstr ""
+
+#. #define NO_OWNER
+#: LYMessages.c:419
+msgid "No owner is defined for this file so you cannot send a comment"
+msgstr ""
+
+#: LYMessages.c:420
+#, c-format
+msgid "No owner is defined. Use %s?"
+msgstr ""
+
+#: LYMessages.c:421
+msgid "Do you wish to send a comment?"
+msgstr ""
+
+#: LYMessages.c:422
+msgid "Mail is disallowed so you cannot send a comment"
+msgstr ""
+
+#: LYMessages.c:423
+msgid "The 'e'dit command is currently disabled."
+msgstr ""
+
+#: LYMessages.c:424
+msgid "External editing is currently disabled."
+msgstr ""
+
+#: LYMessages.c:425
+msgid "System error - failure to get status."
+msgstr ""
+
+#: LYMessages.c:426
+msgid "No editor is defined!"
+msgstr ""
+
+#: LYMessages.c:427
+msgid "The 'p'rint command is currently disabled."
+msgstr ""
+
+#: LYMessages.c:428
+msgid "Document has no Toolbar links or Banner."
+msgstr ""
+
+#: LYMessages.c:429
+msgid "Unable to open traversal file."
+msgstr ""
+
+#: LYMessages.c:430
+msgid "Unable to open traversal found file."
+msgstr ""
+
+#: LYMessages.c:431
+msgid "Unable to open reject file."
+msgstr ""
+
+#: LYMessages.c:432
+msgid "Unable to open traversal errors output file"
+msgstr ""
+
+#: LYMessages.c:433
+msgid "TRAVERSAL WAS INTERRUPTED"
+msgstr ""
+
+#: LYMessages.c:434
+msgid "Follow link (or goto link or page) number: "
+msgstr ""
+
+#: LYMessages.c:435
+msgid "Select option (or page) number: "
+msgstr ""
+
+#: LYMessages.c:436
+#, c-format
+msgid "Option number %d already is current."
+msgstr ""
+
+#. #define ALREADY_AT_OPTION_END
+#: LYMessages.c:438
+msgid "You are already at the end of this option list."
+msgstr ""
+
+#. #define ALREADY_AT_OPTION_BEGIN
+#: LYMessages.c:440
+msgid "You are already at the beginning of this option list."
+msgstr ""
+
+#. #define ALREADY_AT_OPTION_PAGE
+#: LYMessages.c:442
+#, c-format
+msgid "You are already at page %d of this option list."
+msgstr ""
+
+#: LYMessages.c:443
+msgid "You have entered an invalid option number."
+msgstr ""
+
+#: LYMessages.c:444
+msgid "** Bad HTML!! Use -trace to diagnose. **"
+msgstr ""
+
+#: LYMessages.c:445
+msgid "Give name of file to save in"
+msgstr ""
+
+#: LYMessages.c:446
+msgid "Can't save data to file -- please run WWW locally"
+msgstr ""
+
+#: LYMessages.c:447
+msgid "Can't open temporary file!"
+msgstr ""
+
+#: LYMessages.c:448
+msgid "Can't open output file! Cancelling!"
+msgstr ""
+
+#: LYMessages.c:449
+msgid "Execution is disabled."
+msgstr ""
+
+#. #define EXECUTION_DISABLED_FOR_FILE
+#: LYMessages.c:451
+#, c-format
+msgid "Execution is not enabled for this file. See the Options menu (use %s)."
+msgstr ""
+
+#. #define EXECUTION_NOT_COMPILED
+#: LYMessages.c:453
+msgid "Execution capabilities are not compiled into this version."
+msgstr ""
+
+#: LYMessages.c:454
+msgid "This file cannot be displayed on this terminal."
+msgstr ""
+
+#. #define CANNOT_DISPLAY_FILE_D_OR_C
+#: LYMessages.c:456
+msgid "This file cannot be displayed on this terminal: D)ownload, or C)ancel"
+msgstr ""
+
+#: LYMessages.c:457
+#, c-format
+msgid "%s D)ownload, or C)ancel"
+msgstr ""
+
+#: LYMessages.c:458
+msgid "Cancelling file."
+msgstr ""
+
+#: LYMessages.c:459
+msgid "Retrieving file. - PLEASE WAIT -"
+msgstr ""
+
+#: LYMessages.c:460
+msgid "Enter a filename: "
+msgstr ""
+
+#: LYMessages.c:461
+msgid "Edit the previous filename: "
+msgstr ""
+
+#: LYMessages.c:462
+msgid "Edit a previous filename: "
+msgstr ""
+
+#: LYMessages.c:463
+msgid "Enter a new filename: "
+msgstr ""
+
+#: LYMessages.c:464
+msgid "File name may not begin with a dot."
+msgstr ""
+
+#: LYMessages.c:466
+msgid "File exists. Create higher version?"
+msgstr ""
+
+#: LYMessages.c:468
+msgid "File exists. Overwrite?"
+msgstr ""
+
+#: LYMessages.c:470
+msgid "Cannot write to file."
+msgstr ""
+
+#: LYMessages.c:471
+msgid "ERROR! - download command is misconfigured."
+msgstr ""
+
+#: LYMessages.c:472
+msgid "Unable to download file."
+msgstr ""
+
+#: LYMessages.c:473
+msgid "Reading directory..."
+msgstr ""
+
+#: LYMessages.c:474
+msgid "Building directory listing..."
+msgstr ""
+
+#: LYMessages.c:475
+msgid "Saving..."
+msgstr ""
+
+#: LYMessages.c:476
+#, c-format
+msgid "Could not edit file '%s'."
+msgstr ""
+
+#: LYMessages.c:477
+msgid "Unable to access document!"
+msgstr ""
+
+#: LYMessages.c:478
+msgid "Could not access file."
+msgstr ""
+
+#: LYMessages.c:479
+msgid "Could not access directory."
+msgstr ""
+
+#: LYMessages.c:480
+msgid "Could not load data."
+msgstr ""
+
+#. #define CANNOT_EDIT_REMOTE_FILES
+#: LYMessages.c:482
+msgid "Lynx cannot currently (e)dit remote WWW files."
+msgstr ""
+
+#. #define CANNOT_EDIT_FIELD
+#: LYMessages.c:484
+msgid "This field cannot be (e)dited with an external editor."
+msgstr ""
+
+#: LYMessages.c:485
+msgid "Bad rule"
+msgstr ""
+
+#: LYMessages.c:486
+msgid "Insufficient operands:"
+msgstr ""
+
+#: LYMessages.c:487
+msgid "You are not authorized to edit this file."
+msgstr ""
+
+#: LYMessages.c:488
+msgid "Title: "
+msgstr ""
+
+#: LYMessages.c:489
+msgid "Subject: "
+msgstr ""
+
+#: LYMessages.c:490
+msgid "Username: "
+msgstr ""
+
+#: LYMessages.c:491
+msgid "Password: "
+msgstr ""
+
+#: LYMessages.c:492
+msgid "lynx: Username and Password required!!!"
+msgstr ""
+
+#: LYMessages.c:493
+msgid "lynx: Password required!!!"
+msgstr ""
+
+#: LYMessages.c:494
+msgid "Clear all authorization info for this session?"
+msgstr ""
+
+#: LYMessages.c:495
+msgid "Authorization info cleared."
+msgstr ""
+
+#: LYMessages.c:496
+msgid "Authorization failed. Retry?"
+msgstr ""
+
+#: LYMessages.c:497
+msgid "cgi support has been disabled."
+msgstr ""
+
+#. #define CGI_NOT_COMPILED
+#: LYMessages.c:499
+msgid "Lynxcgi capabilities are not compiled into this version."
+msgstr ""
+
+#: LYMessages.c:500
+#, c-format
+msgid "Sorry, no known way of converting %s to %s."
+msgstr ""
+
+#: LYMessages.c:501
+msgid "Unable to set up connection."
+msgstr ""
+
+#: LYMessages.c:502
+msgid "Unable to make connection"
+msgstr ""
+
+#. #define MALFORMED_EXEC_REQUEST
+#: LYMessages.c:504
+msgid "Executable link rejected due to malformed request."
+msgstr ""
+
+#. #define BADCHAR_IN_EXEC_LINK
+#: LYMessages.c:506
+#, c-format
+msgid "Executable link rejected due to `%c' character."
+msgstr ""
+
+#. #define RELPATH_IN_EXEC_LINK
+#: LYMessages.c:508
+msgid "Executable link rejected due to relative path string ('../')."
+msgstr ""
+
+#. #define BADLOCPATH_IN_EXEC_LINK
+#: LYMessages.c:510
+msgid "Executable link rejected due to location or path."
+msgstr ""
+
+#: LYMessages.c:511
+msgid "Mail access is disabled!"
+msgstr ""
+
+#. #define ACCESS_ONLY_LOCALHOST
+#: LYMessages.c:513
+msgid "Only files and servers on the local host can be accessed."
+msgstr ""
+
+#: LYMessages.c:514
+msgid "Telnet access is disabled!"
+msgstr ""
+
+#. #define TELNET_PORT_SPECS_DISABLED
+#: LYMessages.c:516
+msgid "Telnet port specifications are disabled."
+msgstr ""
+
+#: LYMessages.c:517
+msgid "USENET news access is disabled!"
+msgstr ""
+
+#: LYMessages.c:518
+msgid "Rlogin access is disabled!"
+msgstr ""
+
+#: LYMessages.c:519
+msgid "Ftp access is disabled!"
+msgstr ""
+
+#: LYMessages.c:520
+msgid "There are no references from this document."
+msgstr ""
+
+#: LYMessages.c:521
+msgid "There are only hidden links from this document."
+msgstr ""
+
+#: LYMessages.c:523
+msgid "Unable to open command file."
+msgstr ""
+
+#: LYMessages.c:525
+msgid "News Post Cancelled!!!"
+msgstr ""
+
+#. #define SPAWNING_EDITOR_FOR_NEWS
+#: LYMessages.c:527
+msgid "Spawning your selected editor to edit news message"
+msgstr ""
+
+#: LYMessages.c:528
+msgid "Post this message?"
+msgstr ""
+
+#: LYMessages.c:529
+#, c-format
+msgid "Append '%s'?"
+msgstr ""
+
+#: LYMessages.c:530
+msgid "Posting to newsgroup(s)..."
+msgstr ""
+
+#: LYMessages.c:532
+msgid "*** You have unread mail. ***"
+msgstr ""
+
+#: LYMessages.c:534
+msgid "*** You have mail. ***"
+msgstr ""
+
+#: LYMessages.c:536
+msgid "*** You have new mail. ***"
+msgstr ""
+
+#: LYMessages.c:537
+msgid "File insert cancelled!!!"
+msgstr ""
+
+#: LYMessages.c:538
+msgid "Not enough memory for file!"
+msgstr ""
+
+#: LYMessages.c:539
+msgid "Can't open file for reading."
+msgstr ""
+
+#: LYMessages.c:540
+msgid "File does not exist."
+msgstr ""
+
+#: LYMessages.c:541
+msgid "File does not exist - reenter or cancel:"
+msgstr ""
+
+#: LYMessages.c:542
+msgid "File is not readable."
+msgstr ""
+
+#: LYMessages.c:543
+msgid "File is not readable - reenter or cancel:"
+msgstr ""
+
+#: LYMessages.c:544
+msgid "Nothing to insert - file is 0-length."
+msgstr ""
+
+#: LYMessages.c:545
+msgid "Save request cancelled!!!"
+msgstr ""
+
+#: LYMessages.c:546
+msgid "Mail request cancelled!!!"
+msgstr ""
+
+#. #define CONFIRM_MAIL_SOURCE_PREPARSED
+#: LYMessages.c:548
+msgid "Viewing preparsed source. Are you sure you want to mail it?"
+msgstr ""
+
+#: LYMessages.c:549
+msgid "Please wait..."
+msgstr ""
+
+#: LYMessages.c:550
+msgid "Mailing file. Please wait..."
+msgstr ""
+
+#: LYMessages.c:551
+msgid "ERROR - Unable to mail file"
+msgstr ""
+
+#. #define CONFIRM_LONG_SCREEN_PRINT
+#: LYMessages.c:553
+#, c-format
+msgid "File is %d screens long. Are you sure you want to print?"
+msgstr ""
+
+#: LYMessages.c:554
+msgid "Print request cancelled!!!"
+msgstr ""
+
+#: LYMessages.c:555
+msgid "Press <return> to begin: "
+msgstr ""
+
+#: LYMessages.c:556
+msgid "Press <return> to finish: "
+msgstr ""
+
+#. #define CONFIRM_LONG_PAGE_PRINT
+#: LYMessages.c:558
+#, c-format
+msgid "File is %d pages long. Are you sure you want to print?"
+msgstr ""
+
+#. #define CHECK_PRINTER
+#: LYMessages.c:560
+msgid "Be sure your printer is on-line. Press <return> to start printing:"
+msgstr ""
+
+#: LYMessages.c:561
+msgid "ERROR - Unable to allocate file space!!!"
+msgstr ""
+
+#: LYMessages.c:562
+msgid "Unable to open tempfile"
+msgstr ""
+
+#: LYMessages.c:563
+msgid "Unable to open print options file"
+msgstr ""
+
+#: LYMessages.c:564
+msgid "Printing file. Please wait..."
+msgstr ""
+
+#: LYMessages.c:565
+msgid "Please enter a valid internet mail address: "
+msgstr ""
+
+#: LYMessages.c:566
+msgid "ERROR! - printer is misconfigured!"
+msgstr ""
+
+#: LYMessages.c:567
+msgid "Image map from POST response not available!"
+msgstr ""
+
+#: LYMessages.c:568
+msgid "Misdirected client-side image MAP request!"
+msgstr ""
+
+#: LYMessages.c:569
+msgid "Client-side image MAP is not accessible!"
+msgstr ""
+
+#: LYMessages.c:570
+msgid "No client-side image MAPs are available!"
+msgstr ""
+
+#: LYMessages.c:571
+msgid "Client-side image MAP is not available!"
+msgstr ""
+
+#. #define OPTION_SCREEN_NEEDS_24
+#: LYMessages.c:574
+msgid "Screen height must be at least 24 lines for the Options menu!"
+msgstr ""
+
+#. #define OPTION_SCREEN_NEEDS_23
+#: LYMessages.c:576
+msgid "Screen height must be at least 23 lines for the Options menu!"
+msgstr ""
+
+#. #define OPTION_SCREEN_NEEDS_22
+#: LYMessages.c:578
+msgid "Screen height must be at least 22 lines for the Options menu!"
+msgstr ""
+
+#: LYMessages.c:580
+msgid "That key requires Advanced User mode."
+msgstr ""
+
+#: LYMessages.c:581
+#, c-format
+msgid "Content-type: %s"
+msgstr ""
+
+#: LYMessages.c:582
+msgid "Command: "
+msgstr ""
+
+#: LYMessages.c:583
+msgid "Unknown or ambiguous command"
+msgstr ""
+
+#: LYMessages.c:584
+msgid " Version "
+msgstr ""
+
+#: LYMessages.c:585
+msgid " first"
+msgstr ""
+
+#: LYMessages.c:586
+msgid ", guessing..."
+msgstr ""
+
+#: LYMessages.c:587
+msgid "Permissions for "
+msgstr ""
+
+#: LYMessages.c:588
+msgid "Select "
+msgstr ""
+
+#: LYMessages.c:589
+msgid "capital letter"
+msgstr ""
+
+#: LYMessages.c:590
+msgid " of option line,"
+msgstr ""
+
+#: LYMessages.c:591
+msgid " to save,"
+msgstr ""
+
+#: LYMessages.c:592
+msgid " to "
+msgstr ""
+
+#: LYMessages.c:593
+msgid " or "
+msgstr ""
+
+#: LYMessages.c:594
+msgid " index"
+msgstr ""
+
+#: LYMessages.c:595
+msgid " to return to Lynx."
+msgstr ""
+
+#: LYMessages.c:596
+msgid "Accept Changes"
+msgstr ""
+
+#: LYMessages.c:597
+msgid "Reset Changes"
+msgstr ""
+
+#: LYMessages.c:598
+msgid "Left Arrow cancels changes"
+msgstr ""
+
+#: LYMessages.c:599
+msgid "Save options to disk"
+msgstr ""
+
+#: LYMessages.c:600
+msgid "Hit RETURN to accept entered data."
+msgstr ""
+
+#. #define ACCEPT_DATA_OR_DEFAULT
+#: LYMessages.c:602
+msgid "Hit RETURN to accept entered data. Delete data to invoke the default."
+msgstr ""
+
+#: LYMessages.c:603
+msgid "Value accepted!"
+msgstr ""
+
+#. #define VALUE_ACCEPTED_WARNING_X
+#: LYMessages.c:605
+msgid "Value accepted! -- WARNING: Lynx is configured for XWINDOWS!"
+msgstr ""
+
+#. #define VALUE_ACCEPTED_WARNING_NONX
+#: LYMessages.c:607
+msgid "Value accepted! -- WARNING: Lynx is NOT configured for XWINDOWS!"
+msgstr ""
+
+#: LYMessages.c:608
+msgid "You are not allowed to change which editor to use!"
+msgstr ""
+
+#: LYMessages.c:609
+msgid "Failed to set DISPLAY variable!"
+msgstr ""
+
+#: LYMessages.c:610
+msgid "Failed to clear DISPLAY variable!"
+msgstr ""
+
+#. #define BOOKMARK_CHANGE_DISALLOWED
+#: LYMessages.c:612
+msgid "You are not allowed to change the bookmark file!"
+msgstr ""
+
+#: LYMessages.c:613
+msgid "Terminal does not support color"
+msgstr ""
+
+#: LYMessages.c:614
+#, c-format
+msgid "Your '%s' terminal does not support color."
+msgstr ""
+
+#: LYMessages.c:615
+msgid "Access to dot files is disabled!"
+msgstr ""
+
+#. #define UA_NO_LYNX_WARNING
+#: LYMessages.c:617
+msgid "User-Agent string does not contain \"Lynx\" or \"L_y_n_x\""
+msgstr ""
+
+#. #define UA_PLEASE_USE_LYNX
+#: LYMessages.c:619
+msgid "Use \"L_y_n_x\" or \"Lynx\" in User-Agent, or it looks like intentional deception!"
+msgstr ""
+
+#. #define UA_CHANGE_DISABLED
+#: LYMessages.c:621
+msgid "Changing of the User-Agent string is disabled!"
+msgstr ""
+
+#. #define CHANGE_OF_SETTING_DISALLOWED
+#: LYMessages.c:623
+msgid "You are not allowed to change this setting."
+msgstr ""
+
+#: LYMessages.c:624
+msgid "Saving Options..."
+msgstr ""
+
+#: LYMessages.c:625
+msgid "Options saved!"
+msgstr ""
+
+#: LYMessages.c:626
+msgid "Unable to save Options!"
+msgstr ""
+
+#: LYMessages.c:627
+msgid " 'r' to return to Lynx "
+msgstr ""
+
+#: LYMessages.c:628
+msgid " '>' to save, or 'r' to return to Lynx "
+msgstr ""
+
+#. #define ANY_KEY_CHANGE_RET_ACCEPT
+#: LYMessages.c:630
+msgid "Hit any key to change value; RETURN to accept."
+msgstr ""
+
+#: LYMessages.c:631
+msgid "Error uncompressing temporary file!"
+msgstr ""
+
+#: LYMessages.c:632
+msgid "Unsupported URL scheme!"
+msgstr ""
+
+#: LYMessages.c:633
+msgid "Unsupported data: URL! Use SHOWINFO, for now."
+msgstr ""
+
+#: LYMessages.c:634
+#, c-format
+msgid "Redirection limit of %d URL's reached."
+msgstr ""
+
+#: LYMessages.c:635
+msgid "Illegal redirection URL received from server!"
+msgstr ""
+
+#. #define SERVER_ASKED_FOR_REDIRECTION
+#: LYMessages.c:637
+#, c-format
+msgid "Server asked for %d redirection of POST content to"
+msgstr ""
+
+#: LYMessages.c:640
+msgid "P)roceed, use G)ET or C)ancel "
+msgstr ""
+
+#: LYMessages.c:641
+msgid "P)roceed, or C)ancel "
+msgstr ""
+
+#. #define ADVANCED_POST_GET_REDIRECT
+#: LYMessages.c:643
+msgid "Redirection of POST content. P)roceed, see U)RL, use G)ET or C)ancel"
+msgstr ""
+
+#. #define ADVANCED_POST_REDIRECT
+#: LYMessages.c:645
+msgid "Redirection of POST content. P)roceed, see U)RL, or C)ancel"
+msgstr ""
+
+#. #define CONFIRM_POST_RESUBMISSION
+#: LYMessages.c:647
+msgid "Document from Form with POST content. Resubmit?"
+msgstr ""
+
+#. #define CONFIRM_POST_RESUBMISSION_TO
+#: LYMessages.c:649
+#, c-format
+msgid "Resubmit POST content to %s ?"
+msgstr ""
+
+#. #define CONFIRM_POST_LIST_RELOAD
+#: LYMessages.c:651
+#, c-format
+msgid "List from document with POST data. Reload %s ?"
+msgstr ""
+
+#. #define CONFIRM_POST_DOC_HEAD
+#: LYMessages.c:653
+msgid "Document from POST action, HEAD may not be understood. Proceed?"
+msgstr ""
+
+#. #define CONFIRM_POST_LINK_HEAD
+#: LYMessages.c:655
+msgid "Form submit action is POST, HEAD may not be understood. Proceed?"
+msgstr ""
+
+#: LYMessages.c:656
+msgid "Proceed without a username and password?"
+msgstr ""
+
+#: LYMessages.c:657
+#, c-format
+msgid "Proceed (%s)?"
+msgstr ""
+
+#: LYMessages.c:658
+msgid "Cannot POST to this host."
+msgstr ""
+
+#: LYMessages.c:659
+msgid "POST not supported for this URL - ignoring POST data!"
+msgstr ""
+
+#: LYMessages.c:660
+msgid "Discarding POST data..."
+msgstr ""
+
+#: LYMessages.c:661
+msgid "Document will not be reloaded!"
+msgstr ""
+
+#: LYMessages.c:662
+msgid "Location: "
+msgstr ""
+
+#: LYMessages.c:663
+#, c-format
+msgid "'%s' not found!"
+msgstr ""
+
+#: LYMessages.c:664
+msgid "Default Bookmark File"
+msgstr ""
+
+#: LYMessages.c:665
+msgid "Screen too small! (8x35 min)"
+msgstr ""
+
+#: LYMessages.c:666
+msgid "Select destination or ^G to Cancel: "
+msgstr ""
+
+#. #define MULTIBOOKMARKS_SELECT
+#: LYMessages.c:668
+msgid "Select subbookmark, '=' for menu, or ^G to cancel: "
+msgstr ""
+
+#. #define MULTIBOOKMARKS_SELF
+#: LYMessages.c:670
+msgid "Reproduce L)ink in this bookmark file or C)ancel? (l,c): "
+msgstr ""
+
+#: LYMessages.c:671
+msgid "Multiple bookmark support is not available."
+msgstr ""
+
+#: LYMessages.c:672
+#, c-format
+msgid " Select Bookmark (screen %d of %d)"
+msgstr ""
+
+#: LYMessages.c:673
+msgid " Select Bookmark"
+msgstr ""
+
+#. #define MULTIBOOKMARKS_EHEAD_MASK
+#: LYMessages.c:675
+#, c-format
+msgid "Editing Bookmark DESCRIPTION and FILEPATH (%d of 2)"
+msgstr ""
+
+#. #define MULTIBOOKMARKS_EHEAD
+#: LYMessages.c:677
+msgid " Editing Bookmark DESCRIPTION and FILEPATH"
+msgstr ""
+
+#: LYMessages.c:678
+msgid "Letter: "
+msgstr ""
+
+#. #define USE_PATH_OFF_HOME
+#: LYMessages.c:681
+msgid "Use a filepath off your login directory in SHELL syntax!"
+msgstr ""
+
+#: LYMessages.c:683
+msgid "Use a filepath off your home directory!"
+msgstr ""
+
+#. #define MAXLINKS_REACHED
+#: LYMessages.c:686
+msgid "Maximum links per page exceeded! Use half-page or two-line scrolling."
+msgstr ""
+
+#: LYMessages.c:687
+msgid "No previously visited links available!"
+msgstr ""
+
+#: LYMessages.c:688
+msgid "Memory exhausted! Program aborted!"
+msgstr ""
+
+#: LYMessages.c:689
+msgid "Memory exhausted! Aborting..."
+msgstr ""
+
+#: LYMessages.c:690
+msgid "Not enough memory!"
+msgstr ""
+
+#: LYMessages.c:691
+msgid "Directory/File Manager not available"
+msgstr ""
+
+#: LYMessages.c:692
+msgid "Location URL is not absolute."
+msgstr ""
+
+#: LYMessages.c:693
+msgid "Refresh URL is not absolute."
+msgstr ""
+
+#. #define SENDING_MESSAGE_WITH_BODY_TO
+#: LYMessages.c:695
+msgid ""
+"You are sending a message with body to:\n"
+" "
+msgstr ""
+
+#: LYMessages.c:696
+msgid ""
+"You are sending a comment to:\n"
+" "
+msgstr ""
+
+#: LYMessages.c:697
+msgid ""
+"\n"
+" With copy to:\n"
+" "
+msgstr ""
+
+#: LYMessages.c:698
+msgid ""
+"\n"
+" With copies to:\n"
+" "
+msgstr ""
+
+#. #define CTRL_G_TO_CANCEL_SEND
+#: LYMessages.c:700
+msgid ""
+"\n"
+"\n"
+"Use Ctrl-G to cancel if you do not want to send a message\n"
+msgstr ""
+
+#. #define ENTER_NAME_OR_BLANK
+#: LYMessages.c:702
+msgid ""
+"\n"
+" Please enter your name, or leave it blank to remain anonymous\n"
+msgstr ""
+
+#. #define ENTER_MAIL_ADDRESS_OR_OTHER
+#: LYMessages.c:704
+msgid ""
+"\n"
+" Please enter a mail address or some other\n"
+msgstr ""
+
+#. #define MEANS_TO_CONTACT_FOR_RESPONSE
+#: LYMessages.c:706
+msgid " means to contact you, if you desire a response.\n"
+msgstr ""
+
+#: LYMessages.c:707
+msgid ""
+"\n"
+" Please enter a subject line.\n"
+msgstr ""
+
+#. #define ENTER_ADDRESS_FOR_CC
+#: LYMessages.c:709
+msgid ""
+"\n"
+" Enter a mail address for a CC of your message.\n"
+msgstr ""
+
+#: LYMessages.c:710
+msgid " (Leave blank if you don't want a copy.)\n"
+msgstr ""
+
+#: LYMessages.c:711
+msgid ""
+"\n"
+" Please review the message body:\n"
+"\n"
+msgstr ""
+
+#: LYMessages.c:712
+msgid ""
+"\n"
+"Press RETURN to continue: "
+msgstr ""
+
+#: LYMessages.c:713
+msgid ""
+"\n"
+"Press RETURN to clean up: "
+msgstr ""
+
+#: LYMessages.c:714
+msgid " Use Control-U to erase the default.\n"
+msgstr ""
+
+#: LYMessages.c:715
+msgid ""
+"\n"
+" Please enter your message below."
+msgstr ""
+
+#. #define ENTER_PERIOD_WHEN_DONE_A
+#: LYMessages.c:717 src/LYNews.c:360
+msgid ""
+"\n"
+" When you are done, press enter and put a single period (.)"
+msgstr ""
+
+#. #define ENTER_PERIOD_WHEN_DONE_B
+#: LYMessages.c:719 src/LYNews.c:361
+msgid ""
+"\n"
+" on a line and press enter again."
+msgstr ""
+
+#. Cookies messages
+#. #define ADVANCED_COOKIE_CONFIRMATION
+#: LYMessages.c:723
+#, c-format
+msgid "%s cookie: %.*s=%.*s Allow? (Y/N/Always/neVer)"
+msgstr ""
+
+#. #define INVALID_COOKIE_DOMAIN_CONFIRMATION
+#: LYMessages.c:725
+#, c-format
+msgid "Accept invalid cookie domain=%s for '%s'?"
+msgstr ""
+
+#. #define INVALID_COOKIE_PATH_CONFIRMATION
+#: LYMessages.c:727
+#, c-format
+msgid "Accept invalid cookie path=%s as a prefix of '%s'?"
+msgstr ""
+
+#: LYMessages.c:728
+msgid "Allowing this cookie."
+msgstr ""
+
+#: LYMessages.c:729
+msgid "Rejecting this cookie."
+msgstr ""
+
+#: LYMessages.c:730
+msgid "The Cookie Jar is empty."
+msgstr ""
+
+#: LYMessages.c:731
+msgid "The Cache Jar is empty."
+msgstr ""
+
+#. #define ACTIVATE_TO_GOBBLE
+#: LYMessages.c:733
+msgid "Activate links to gobble up cookies or entire domains,"
+msgstr ""
+
+#: LYMessages.c:734
+msgid "or to change a domain's 'allow' setting."
+msgstr ""
+
+#: LYMessages.c:735
+msgid "(Cookies never allowed.)"
+msgstr ""
+
+#: LYMessages.c:736
+msgid "(Cookies always allowed.)"
+msgstr ""
+
+#: LYMessages.c:737
+msgid "(Cookies allowed via prompt.)"
+msgstr ""
+
+#: LYMessages.c:738
+msgid "(Persistent Cookies.)"
+msgstr ""
+
+#: LYMessages.c:739
+msgid "(No title.)"
+msgstr ""
+
+#: LYMessages.c:740
+msgid "(No name.)"
+msgstr ""
+
+#: LYMessages.c:741
+msgid "(No value.)"
+msgstr ""
+
+#: LYMessages.c:742 src/LYOptions.c:2470
+msgid "None"
+msgstr ""
+
+#: LYMessages.c:743
+msgid "(End of session.)"
+msgstr ""
+
+#: LYMessages.c:744
+msgid "Delete this cookie?"
+msgstr ""
+
+#: LYMessages.c:745
+msgid "The cookie has been eaten!"
+msgstr ""
+
+#: LYMessages.c:746
+msgid "Delete this empty domain?"
+msgstr ""
+
+#: LYMessages.c:747
+msgid "The domain has been eaten!"
+msgstr ""
+
+#. #define DELETE_COOKIES_SET_ALLOW_OR_CANCEL
+#: LYMessages.c:749
+msgid "D)elete domain's cookies, set allow A)lways/P)rompt/neV)er, or C)ancel? "
+msgstr ""
+
+#. #define DELETE_DOMAIN_SET_ALLOW_OR_CANCEL
+#: LYMessages.c:751
+msgid "D)elete domain, set allow A)lways/P)rompt/neV)er, or C)ancel? "
+msgstr ""
+
+#: LYMessages.c:752
+msgid "All cookies in the domain have been eaten!"
+msgstr ""
+
+#: LYMessages.c:753
+#, c-format
+msgid "'A'lways allowing from domain '%s'."
+msgstr ""
+
+#: LYMessages.c:754
+#, c-format
+msgid "ne'V'er allowing from domain '%s'."
+msgstr ""
+
+#: LYMessages.c:755
+#, c-format
+msgid "'P'rompting to allow from domain '%s'."
+msgstr ""
+
+#: LYMessages.c:756
+msgid "Delete all cookies in this domain?"
+msgstr ""
+
+#: LYMessages.c:757
+msgid "All of the cookies in the jar have been eaten!"
+msgstr ""
+
+#: LYMessages.c:759
+msgid "Port 19 not permitted in URLs."
+msgstr ""
+
+#: LYMessages.c:760
+msgid "Port 25 not permitted in URLs."
+msgstr ""
+
+#: LYMessages.c:761
+#, c-format
+msgid "Port %lu not permitted in URLs."
+msgstr ""
+
+#: LYMessages.c:762
+msgid "URL has a bad port field."
+msgstr ""
+
+#: LYMessages.c:763
+msgid "Maximum nesting of HTML elements exceeded."
+msgstr ""
+
+#: LYMessages.c:764
+msgid "Bad partial reference! Stripping lead dots."
+msgstr ""
+
+#: LYMessages.c:765
+msgid "Trace Log open failed. Trace off!"
+msgstr ""
+
+#: LYMessages.c:766
+msgid "Lynx Trace Log"
+msgstr ""
+
+#: LYMessages.c:767
+msgid "No trace log has been started for this session."
+msgstr ""
+
+#. #define MAX_TEMPCOUNT_REACHED
+#: LYMessages.c:769
+msgid "The maximum temporary file count has been reached!"
+msgstr ""
+
+#. #define FORM_VALUE_TOO_LONG
+#: LYMessages.c:771
+msgid "Form field value exceeds buffer length! Trim the tail."
+msgstr ""
+
+#. #define FORM_TAIL_COMBINED_WITH_HEAD
+#: LYMessages.c:773
+msgid "Modified tail combined with head of form field value."
+msgstr ""
+
+#. HTFile.c
+#: LYMessages.c:776
+msgid "Directory"
+msgstr ""
+
+#: LYMessages.c:777
+msgid "Directory browsing is not allowed."
+msgstr ""
+
+#: LYMessages.c:778
+msgid "Selective access is not enabled for this directory"
+msgstr ""
+
+#: LYMessages.c:779
+msgid "Multiformat: directory scan failed."
+msgstr ""
+
+#: LYMessages.c:780
+msgid "This directory is not readable."
+msgstr ""
+
+#: LYMessages.c:781
+msgid "Can't access requested file."
+msgstr ""
+
+#: LYMessages.c:782
+msgid "Could not find suitable representation for transmission."
+msgstr ""
+
+#: LYMessages.c:783
+msgid "Could not open file for decompression!"
+msgstr ""
+
+#: LYMessages.c:784
+msgid "Files:"
+msgstr ""
+
+#: LYMessages.c:785
+msgid "Subdirectories:"
+msgstr ""
+
+#: LYMessages.c:786
+msgid " directory"
+msgstr ""
+
+#: LYMessages.c:787
+msgid "Up to "
+msgstr ""
+
+#: LYMessages.c:788
+msgid "Current directory is "
+msgstr ""
+
+#. HTFTP.c
+#: LYMessages.c:791
+msgid "Symbolic Link"
+msgstr ""
+
+#. HTGopher.c
+#: LYMessages.c:794
+msgid "No response from server!"
+msgstr ""
+
+#: LYMessages.c:795
+msgid "CSO index"
+msgstr ""
+
+#: LYMessages.c:796
+msgid ""
+"\n"
+"This is a searchable index of a CSO database.\n"
+msgstr ""
+
+#: LYMessages.c:797
+msgid "CSO Search Results"
+msgstr ""
+
+#: LYMessages.c:798
+#, c-format
+msgid "Seek fail on %s\n"
+msgstr ""
+
+#: LYMessages.c:799
+msgid ""
+"\n"
+"Press the 's' key and enter search keywords.\n"
+msgstr ""
+
+#: LYMessages.c:800
+msgid ""
+"\n"
+"This is a searchable Gopher index.\n"
+msgstr ""
+
+#: LYMessages.c:801
+msgid "Gopher index"
+msgstr ""
+
+#: LYMessages.c:802
+msgid "Gopher Menu"
+msgstr ""
+
+#: LYMessages.c:803
+msgid " Search Results"
+msgstr ""
+
+#: LYMessages.c:804
+msgid "Sending CSO/PH request."
+msgstr ""
+
+#: LYMessages.c:805
+msgid "Sending Gopher request."
+msgstr ""
+
+#: LYMessages.c:806
+msgid "CSO/PH request sent; waiting for response."
+msgstr ""
+
+#: LYMessages.c:807
+msgid "Gopher request sent; waiting for response."
+msgstr ""
+
+#: LYMessages.c:808
+msgid ""
+"\n"
+"Please enter search keywords.\n"
+msgstr ""
+
+#: LYMessages.c:809
+msgid ""
+"\n"
+"The keywords that you enter will allow you to search on a"
+msgstr ""
+
+#: LYMessages.c:810
+msgid " person's name in the database.\n"
+msgstr ""
+
+#. HTNews.c
+#: LYMessages.c:813
+msgid "Connection closed ???"
+msgstr ""
+
+#: LYMessages.c:814
+msgid "Cannot open temporary file for news POST."
+msgstr ""
+
+#: LYMessages.c:815
+msgid "This client does not contain support for posting to news with SSL."
+msgstr ""
+
+#. HTStyle.c
+#: LYMessages.c:818
+#, c-format
+msgid "Style %d `%s' SGML:%s. Font %s %.1f point.\n"
+msgstr ""
+
+#: LYMessages.c:820
+#, c-format
+msgid "\tAlign=%d, %d tabs. (%.0f before, %.0f after)\n"
+msgstr ""
+
+#: LYMessages.c:821
+#, c-format
+msgid "\t\tTab kind=%d at %.0f\n"
+msgstr ""
+
+#. HTTP.c
+#: LYMessages.c:824
+msgid "Can't proceed without a username and password."
+msgstr ""
+
+#: LYMessages.c:825
+msgid "Can't retry with authorization! Contact the server's WebMaster."
+msgstr ""
+
+#: LYMessages.c:826
+msgid "Can't retry with proxy authorization! Contact the server's WebMaster."
+msgstr ""
+
+#: LYMessages.c:827
+msgid "Retrying with proxy authorization information."
+msgstr ""
+
+#: LYMessages.c:828
+#, c-format
+msgid "SSL error:%s-Continue?"
+msgstr ""
+
+#. HTWAIS.c
+#: LYMessages.c:831
+msgid "HTWAIS: Return message too large."
+msgstr ""
+
+#: LYMessages.c:832
+msgid "Enter WAIS query: "
+msgstr ""
+
+#. Miscellaneous status
+#: LYMessages.c:835
+msgid "Retrying as HTTP0 request."
+msgstr ""
+
+#: LYMessages.c:836
+#, c-format
+msgid "Transferred %d bytes"
+msgstr ""
+
+#: LYMessages.c:837
+msgid "Data transfer complete"
+msgstr ""
+
+#: LYMessages.c:838
+#, c-format
+msgid "Error processing line %d of %s\n"
+msgstr ""
+
+#. Lynx internal page titles
+#: LYMessages.c:841
+msgid "Address List Page"
+msgstr ""
+
+#: LYMessages.c:842
+msgid "Bookmark file"
+msgstr ""
+
+#: LYMessages.c:843
+msgid "Configuration Definitions"
+msgstr ""
+
+#: LYMessages.c:844
+msgid "Cookie Jar"
+msgstr ""
+
+#: LYMessages.c:845
+msgid "Current Edit-Key Map"
+msgstr ""
+
+#: LYMessages.c:846
+msgid "Current Key Map"
+msgstr ""
+
+#: LYMessages.c:847
+msgid "File Management Options"
+msgstr ""
+
+#: LYMessages.c:848
+msgid "Download Options"
+msgstr ""
+
+#: LYMessages.c:849
+msgid "History Page"
+msgstr ""
+
+#: LYMessages.c:850
+msgid "Cache Jar"
+msgstr ""
+
+#: LYMessages.c:851
+msgid "List Page"
+msgstr ""
+
+#: LYMessages.c:852
+msgid "Lynx.cfg Information"
+msgstr ""
+
+#: LYMessages.c:853
+msgid "Converted Mosaic Hotlist"
+msgstr ""
+
+#: LYMessages.c:854
+msgid "Options Menu"
+msgstr ""
+
+#: LYMessages.c:855
+msgid "File Permission Options"
+msgstr ""
+
+#: LYMessages.c:856
+msgid "Printing Options"
+msgstr ""
+
+#: LYMessages.c:857
+msgid "Information about the current document"
+msgstr ""
+
+#: LYMessages.c:858
+msgid "Your recent statusline messages"
+msgstr ""
+
+#: LYMessages.c:859
+msgid "Upload Options"
+msgstr ""
+
+#: LYMessages.c:860
+msgid "Visited Links Page"
+msgstr ""
+
+#. CONFIG_DEF_TITLE subtitles
+#: LYMessages.c:863
+msgid "See also"
+msgstr ""
+
+#: LYMessages.c:864
+msgid "your"
+msgstr ""
+
+#: LYMessages.c:865
+msgid "for runtime options"
+msgstr ""
+
+#: LYMessages.c:866
+msgid "compile time options"
+msgstr ""
+
+#: LYMessages.c:867
+msgid "color-style configuration"
+msgstr ""
+
+#: LYMessages.c:868
+msgid "latest release"
+msgstr ""
+
+#: LYMessages.c:869
+msgid "pre-release version"
+msgstr ""
+
+#: LYMessages.c:870
+msgid "development version"
+msgstr ""
+
+#. #define AUTOCONF_CONFIG_CACHE
+#: LYMessages.c:872
+msgid ""
+"The following data were derived during the automatic configuration/build\n"
+"process of this copy of Lynx. When reporting a bug, please include a copy\n"
+"of this page."
+msgstr ""
+
+#. #define AUTOCONF_LYNXCFG_H
+#: LYMessages.c:876
+msgid ""
+"The following data were used as automatically-configured compile-time\n"
+"definitions when this copy of Lynx was built."
+msgstr ""
+
+#. #define DIRED_NOVICELINE
+#: LYMessages.c:881
+msgid " C)reate D)ownload E)dit F)ull menu M)odify R)emove T)ag U)pload \n"
+msgstr ""
+
+#: LYMessages.c:882
+msgid "Failed to obtain status of current link!"
+msgstr ""
+
+#. #define INVALID_PERMIT_URL
+#: LYMessages.c:885
+msgid "Special URL only valid from current File Permission menu!"
+msgstr ""
+
+#: LYMessages.c:889
+msgid "External support is currently disabled."
+msgstr ""
+
+#. new with 2.8.4dev.21
+#: LYMessages.c:893
+msgid "Changing working-directory is currently disabled."
+msgstr ""
+
+#: LYMessages.c:894
+msgid "Linewrap OFF!"
+msgstr ""
+
+#: LYMessages.c:895
+msgid "Linewrap ON!"
+msgstr ""
+
+#: LYMessages.c:896
+msgid "Parsing nested-tables toggled OFF! Reloading..."
+msgstr ""
+
+#: LYMessages.c:897
+msgid "Parsing nested-tables toggled ON! Reloading..."
+msgstr ""
+
+#: LYMessages.c:898
+msgid "Shifting is disabled while line-wrap is in effect"
+msgstr ""
+
+#: LYMessages.c:899
+msgid "Trace not supported"
+msgstr ""
+
+#: LYMessages.c:819
+#, c-format
+msgid "\tIndents: first=%.0f others=%.0f, Height=%.1f Desc=%.1f\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAABrow.c:575
+#, c-format
+msgid "username for realm %s changed from %s to %s"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAABrow.c:591
+#, c-format
+msgid "password for realm %s user %s changed"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAABrow.c:703
+#, c-format
+msgid "Username for '%s' at %s '%s%s':"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAABrow.c:976
+msgid "This client doesn't know how to compose proxy authorization information for scheme"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAABrow.c:1053
+msgid "This client doesn't know how to compose authorization information for scheme"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAABrow.c:1162
+#, c-format
+msgid "Invalid header '%s%s%s%s%s'"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAABrow.c:1266
+msgid "Proxy authorization required -- retrying"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAABrow.c:1322
+msgid "Access without authorization denied -- retrying"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAccess.c:698
+msgid "Access forbidden by rule"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAccess.c:800
+msgid "Document with POST content not found in cache. Resubmit?"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAccess.c:953
+msgid "Loading failed, use a previous copy."
+msgstr ""
+
+#: WWW/Library/Implementation/HTAccess.c:1062 src/GridText.c:8928
+msgid "Loading incomplete."
+msgstr ""
+
+#: WWW/Library/Implementation/HTAccess.c:1093
+#, c-format
+msgid "**** HTAccess: socket or file number returned by obsolete load routine!\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAccess.c:1095
+#, c-format
+msgid "**** HTAccess: Internal software error. Please mail lynx-dev@nongnu.org!\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAccess.c:1096
+#, c-format
+msgid "**** HTAccess: Status returned was: %d\n"
+msgstr ""
+
+#.
+#. * hack: if we fail in HTAccess.c
+#. * avoid duplicating URL, oh.
+#.
+#: WWW/Library/Implementation/HTAccess.c:1102 src/LYMainLoop.c:8076
+msgid "Can't Access"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAccess.c:1110
+msgid "Unable to access document."
+msgstr ""
+
+#: WWW/Library/Implementation/HTFTP.c:870
+#, c-format
+msgid "Enter password for user %s@%s:"
+msgstr ""
+
+#: WWW/Library/Implementation/HTFTP.c:898
+msgid "Unable to connect to FTP host."
+msgstr ""
+
+#: WWW/Library/Implementation/HTFTP.c:1137
+msgid "close master socket"
+msgstr ""
+
+#: WWW/Library/Implementation/HTFTP.c:1194
+msgid "socket for master socket"
+msgstr ""
+
+#: WWW/Library/Implementation/HTFTP.c:2922
+msgid "Receiving FTP directory."
+msgstr ""
+
+#: WWW/Library/Implementation/HTFTP.c:3060
+#, c-format
+msgid "Transferred %d bytes (%5d)"
+msgstr ""
+
+#: WWW/Library/Implementation/HTFTP.c:3417
+msgid "connect for data"
+msgstr ""
+
+#: WWW/Library/Implementation/HTFTP.c:4094
+msgid "Receiving FTP file."
+msgstr ""
+
+#: WWW/Library/Implementation/HTFinger.c:274
+msgid "Could not set up finger connection."
+msgstr ""
+
+#: WWW/Library/Implementation/HTFinger.c:321
+msgid "Could not load data (no sitename in finger URL)"
+msgstr ""
+
+#: WWW/Library/Implementation/HTFinger.c:325
+msgid "Invalid port number - will only use port 79!"
+msgstr ""
+
+#: WWW/Library/Implementation/HTFinger.c:391
+msgid "Could not access finger host."
+msgstr ""
+
+#: WWW/Library/Implementation/HTFinger.c:399
+msgid "No response from finger server."
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:439
+#, c-format
+msgid "Username for news host '%s':"
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:492
+msgid "Change username?"
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:496
+msgid "Username:"
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:521
+#, c-format
+msgid "Password for news host '%s':"
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:604
+msgid "Change password?"
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:1725
+#, c-format
+msgid "No matches for: %s"
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:1775
+msgid ""
+"\n"
+"No articles in this group.\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:1787
+msgid ""
+"\n"
+"No articles in this range.\n"
+msgstr ""
+
+#.
+#. * Set window title.
+#.
+#: WWW/Library/Implementation/HTNews.c:1800
+#, c-format
+msgid "%s, Articles %d-%d"
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:1823
+msgid "Earlier articles"
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:1836
+#, c-format
+msgid ""
+"\n"
+"There are about %d articles currently available in %s, IDs as follows:\n"
+"\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:1898
+msgid "All available articles in "
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:2112
+msgid "Later articles"
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:2135
+msgid "Post to "
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:2356
+msgid "This client does not contain support for SNEWS URLs."
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:2563
+msgid "No target for raw text!"
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:2593
+msgid "Connecting to NewsHost ..."
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:2645
+#, c-format
+msgid "Could not access %s."
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:2751
+#, c-format
+msgid "Can't read news info. News host %.20s responded: %.200s"
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:2755
+#, c-format
+msgid "Can't read news info, empty response from host %s"
+msgstr ""
+
+#.
+#. * List available newsgroups. - FM
+#.
+#: WWW/Library/Implementation/HTNews.c:2959
+msgid "Reading list of available newsgroups."
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:2980
+msgid "Reading list of articles in newsgroup."
+msgstr ""
+
+#.
+#. * Get an article from a news group. - FM
+#.
+#: WWW/Library/Implementation/HTNews.c:2986
+msgid "Reading news article."
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:3016
+msgid "Sorry, could not load requested news."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:1339
+msgid "Address has invalid port"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:1410
+msgid "Address length looks invalid"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:1862
+#: WWW/Library/Implementation/HTTCP.c:1880
+#, c-format
+msgid "Unable to locate remote host %s."
+msgstr ""
+
+#. Not HTProgress, so warning won't be overwritten immediately;
+#. * but not HTAlert, because typically there will be other
+#. * alerts from the callers. - kw
+#.
+#: WWW/Library/Implementation/HTTCP.c:1877
+#: WWW/Library/Implementation/HTTelnet.c:115
+#, c-format
+msgid "Invalid hostname %s"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:1891
+#, c-format
+msgid "Making %s connection to %s"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:1902
+msgid "socket failed."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:1916
+#, c-format
+msgid "socket failed: family %d addr %s port %s."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:1940
+msgid "Could not make connection non-blocking."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:2006
+msgid "Connection failed (too many retries)."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:2201
+msgid "Could not restore socket to blocking."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:2271
+msgid "Socket read failed (too many tries)."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:165
+#, c-format
+msgid "SSL callback:%s, preverify_ok=%d, ssl_okay=%d"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:668
+#, c-format
+msgid "User/password contains only punctuation: %s"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:672
+#, c-format
+msgid "User/password may be confused with hostname: '%s' (e.g, '%s')"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:733
+#, c-format
+msgid "Certificate issued by: %s"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:920
+msgid "This client does not contain support for HTTPS URLs."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:945
+msgid "Unable to connect to remote host."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:988
+msgid "Retrying connection without TLS."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:1040
+msgid "GnuTLS error when trying to verify certificate."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:1053
+msgid "the certificate has no known issuer"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:1055
+msgid "no issuer was found"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:1057
+msgid "issuer is not a CA"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:1059
+msgid "the certificate has been revoked"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:1061
+msgid "the certificate is not trusted"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:1136
+#, c-format
+msgid "Verified connection to %s (cert=%s)"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:1186
+#: WWW/Library/Implementation/HTTP.c:1228
+#, c-format
+msgid "Verified connection to %s (subj=%s)"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:1258
+msgid "Can't find common name in certificate"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:1261
+#, c-format
+msgid "SSL error:host(%s)!=cert(%s)-Continue?"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:1268
+msgid "SSL error"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:1276
+#, c-format
+msgid "UNVERIFIED connection to %s (cert=%s)"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:1285
+#, c-format
+msgid "Secure %d-bit %s (%s) HTTP connection"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:1755
+msgid "Sending HTTP request."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:1797
+msgid "Unexpected network write error; connection aborted."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:1803
+msgid "HTTP request sent; waiting for response."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:1876
+#: WWW/Library/Implementation/HTTP.c:1886
+msgid "Unexpected network read error; connection aborted."
+msgstr ""
+
+#.
+#. * HTTP/1.1 Informational statuses.
+#. * 100 Continue.
+#. * 101 Switching Protocols.
+#. * > 101 is unknown.
+#. * We should never get these, and they have only the status
+#. * line and possibly other headers, so we'll deal with them by
+#. * showing the full header to the user as text/plain. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2089
+msgid "Got unexpected Informational Status."
+msgstr ""
+
+#.
+#. * Reset Content. The server has fulfilled the request but
+#. * nothing is returned and we should reset any form
+#. * content. We'll instruct the user to do that, and
+#. * restore the current document. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2123
+msgid "Request fulfilled. Reset Content."
+msgstr ""
+
+#. Not Modified
+#.
+#. * We didn't send an "If-Modified-Since" header, so this
+#. * status is inappropriate. We'll deal with it by showing
+#. * the full header to the user as text/plain. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2240
+msgid "Got unexpected 304 Not Modified status."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:2303
+msgid "Redirection of POST content requires user approval."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:2318
+msgid "Have POST content. Treating Permanent Redirection as Temporary.\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:2364
+msgid "Retrying with access authorization information."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:2376
+msgid "Show the 401 message body?"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:2420
+msgid "Show the 407 message body?"
+msgstr ""
+
+#.
+#. * Bad or unknown server_status number. Take a chance and hope
+#. * there is something to display. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2520
+msgid "Unknown status reply from server!"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTelnet.c:113
+#, c-format
+msgid "remote %s session:"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:163
+msgid "Could not connect to WAIS server."
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:171
+msgid "Could not open WAIS connection for reading."
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:193
+msgid "Diagnostic code is "
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:460
+msgid "Index "
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:464
+#, c-format
+msgid " contains the following %d item%s relevant to \""
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:472
+msgid "The first figure after each entry is its relative score, "
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:473
+msgid "the second is the number of lines in the item."
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:515
+msgid " (bad file name)"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:541
+msgid "(bad doc id)"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:557
+msgid "(Short Header record, can't display)"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:564
+msgid ""
+"\n"
+"Long Header record, can't display\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:571
+msgid ""
+"\n"
+"Text record\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:580
+msgid ""
+"\n"
+"Headline record, can't display\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:588
+msgid ""
+"\n"
+"Code record, can't display\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:692
+msgid "Syntax error in WAIS URL"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:764
+msgid " (WAIS Index)"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:771
+msgid "WAIS Index: "
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:777
+msgid "This is a link for searching the "
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:781
+msgid " WAIS Index.\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:810
+msgid ""
+"\n"
+"Enter the 's'earch command and then specify search words.\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:832
+msgid " (in "
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:841
+msgid "WAIS Search of \""
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:845
+msgid "\" in: "
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:860
+msgid "HTWAIS: Request too large."
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:869
+msgid "Searching WAIS database..."
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:879
+msgid "Search interrupted."
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:930
+msgid "Can't convert format of WAIS document"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:974
+msgid "HTWAIS: Request too long."
+msgstr ""
+
+#.
+#. * Actually do the transaction given by request_message.
+#.
+#: WWW/Library/Implementation/HTWAIS.c:988
+msgid "Fetching WAIS document..."
+msgstr ""
+
+#. display_search_response(target, retrieval_response,
+#. wais_database, keywords);
+#: WWW/Library/Implementation/HTWAIS.c:1027
+msgid "No text was returned!\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWSRC.c:302
+msgid " NOT GIVEN in source file; "
+msgstr ""
+
+#: WWW/Library/Implementation/HTWSRC.c:325
+msgid " WAIS source file"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWSRC.c:332
+msgid " description"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWSRC.c:342
+msgid "Access links"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWSRC.c:363
+msgid "Direct access"
+msgstr ""
+
+#. * Proxy will be used if defined, so let user know that - FM *
+#: WWW/Library/Implementation/HTWSRC.c:366
+msgid " (or via proxy server, if defined)"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWSRC.c:381
+msgid "Maintainer"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWSRC.c:389
+msgid "Host"
+msgstr ""
+
+#: src/GridText.c:723
+msgid "Memory exhausted, display interrupted!"
+msgstr ""
+
+#: src/GridText.c:728
+msgid "Memory exhausted, will interrupt transfer!"
+msgstr ""
+
+#: src/GridText.c:1719
+#, c-format
+msgid " (l%d of %d)"
+msgstr ""
+
+#: src/GridText.c:1728
+#, c-format
+msgid " (p%d of %d)"
+msgstr ""
+
+#: src/GridText.c:3713
+msgid " *** MEMORY EXHAUSTED ***"
+msgstr ""
+
+#: src/GridText.c:6211
+msgid "text entry field"
+msgstr ""
+
+#: src/GridText.c:6214
+msgid "password entry field"
+msgstr ""
+
+#: src/GridText.c:6217
+msgid "checkbox"
+msgstr ""
+
+#: src/GridText.c:6220
+msgid "radio button"
+msgstr ""
+
+#: src/GridText.c:6223
+msgid "submit button"
+msgstr ""
+
+#: src/GridText.c:6226
+msgid "reset button"
+msgstr ""
+
+#: src/GridText.c:6229
+msgid "script button"
+msgstr ""
+
+#: src/GridText.c:6232
+msgid "popup menu"
+msgstr ""
+
+#: src/GridText.c:6235
+msgid "hidden form field"
+msgstr ""
+
+#: src/GridText.c:6238
+msgid "text entry area"
+msgstr ""
+
+#: src/GridText.c:6241
+msgid "range entry field"
+msgstr ""
+
+#: src/GridText.c:6244
+msgid "file entry field"
+msgstr ""
+
+#: src/GridText.c:6247
+msgid "text-submit field"
+msgstr ""
+
+#: src/GridText.c:6250
+msgid "image-submit button"
+msgstr ""
+
+#: src/GridText.c:6253
+msgid "keygen field"
+msgstr ""
+
+#: src/GridText.c:6256
+msgid "unknown form field"
+msgstr ""
+
+#: src/GridText.c:6276 src/GridText.c:6283 src/LYList.c:249
+msgid "unknown field or link"
+msgstr ""
+
+#: src/GridText.c:10711
+msgid "Can't open file for uploading"
+msgstr ""
+
+#: src/GridText.c:11899
+#, c-format
+msgid "Submitting %s"
+msgstr ""
+
+#. ugliness has happened; inform user and do the best we can
+#: src/GridText.c:12969
+msgid "Hang Detect: TextAnchor struct corrupted - suggest aborting!"
+msgstr ""
+
+#. don't show previous state
+#: src/GridText.c:13128
+msgid "Wrap lines to fit displayed area?"
+msgstr ""
+
+#: src/GridText.c:13758
+msgid "Very long lines have been truncated!"
+msgstr ""
+
+#: src/HTAlert.c:164 src/LYShowInfo.c:389 src/LYShowInfo.c:393
+msgid "bytes"
+msgstr ""
+
+#.
+#. * If we know the total size of the file, we can compute
+#. * a percentage, and show a corresponding progress bar.
+#.
+#: src/HTAlert.c:328 src/HTAlert.c:354
+#, c-format
+msgid "Read %s of data"
+msgstr ""
+
+#: src/HTAlert.c:351
+#, c-format
+msgid "Read %s of %s of data"
+msgstr ""
+
+#: src/HTAlert.c:360
+#, c-format
+msgid ", %s/sec"
+msgstr ""
+
+#: src/HTAlert.c:374
+#, c-format
+msgid " (stalled for %s)"
+msgstr ""
+
+#: src/HTAlert.c:378
+#, c-format
+msgid ", ETA %s"
+msgstr ""
+
+#: src/HTAlert.c:400
+msgid " (Press 'z' to abort)"
+msgstr ""
+
+#. Meta-note: don't move the following note from its place right
+#. in front of the first gettext(). As it is now, it should
+#. automatically appear in generated lynx.pot files. - kw
+#.
+#. NOTE TO TRANSLATORS: If you provide a translation for "yes", lynx
+#. * will take the first byte of the translation as a positive response
+#. * to Yes/No questions. If you provide a translation for "no", lynx
+#. * will take the first byte of the translation as a negative response
+#. * to Yes/No questions. For both, lynx will also try to show the
+#. * first byte in the prompt as a character, instead of (y) or (n),
+#. * respectively. This will not work right for multibyte charsets!
+#. * Don't translate "yes" and "no" for CJK character sets (or translate
+#. * them to "yes" and "no"). For a translation using UTF-8, don't
+#. * translate if the translation would begin with anything but a 7-bit
+#. * (US_ASCII) character. That also means do not translate if the
+#. * translation would begin with anything but a 7-bit character, if
+#. * you use a single-byte character encoding (a charset like ISO-8859-n)
+#. * but anticipate that the message catalog may be used re-encoded in
+#. * UTF-8 form.
+#. * For translations using other character sets, you may also wish to
+#. * leave "yes" and "no" untranslated, if using (y) and (n) is the
+#. * preferred behavior.
+#. * Lynx will also accept y Y n N as responses unless there is a conflict
+#. * with the first letter of the "yes" or "no" translation.
+#.
+#: src/HTAlert.c:438 src/HTAlert.c:486
+msgid "yes"
+msgstr ""
+
+#: src/HTAlert.c:441 src/HTAlert.c:487
+msgid "no"
+msgstr ""
+
+#.
+#. * Special-purpose workaround for gettext support (we should do
+#. * this in a more general way) -TD
+#. *
+#. * NOTE TO TRANSLATORS: If the prompt has been rendered into
+#. * another language, and if yes/no are distinct, assume the
+#. * translator can make an ordered list in parentheses with one
+#. * capital letter for each as we assumed in HTConfirmDefault().
+#. * The list has to be in the same order as in the original message,
+#. * and the four capital letters chosen to not match those in the
+#. * original unless they have the same position.
+#. *
+#. * Example:
+#. * (Y/N/Always/neVer) - English (original)
+#. * (O/N/Toujours/Jamais) - French
+#.
+#: src/HTAlert.c:938
+msgid "Y/N/A/V"
+msgstr ""
+
+#: src/HTML.c:5767
+msgid "Description:"
+msgstr ""
+
+#: src/HTML.c:5772
+msgid "(none)"
+msgstr ""
+
+#: src/HTML.c:5776
+msgid "Filepath:"
+msgstr ""
+
+#: src/HTML.c:5782
+msgid "(unknown)"
+msgstr ""
+
+#: src/HTML.c:7220
+msgid "Document has only hidden links. Use the 'l'ist command."
+msgstr ""
+
+#: src/HTML.c:7721
+msgid "Source cache error - disk full?"
+msgstr ""
+
+#: src/HTML.c:7734
+msgid "Source cache error - not enough memory!"
+msgstr ""
+
+#: src/LYBookmark.c:167
+msgid ""
+" This file is an HTML representation of the X Mosaic hotlist file.\n"
+" Outdated or invalid links may be removed by using the\n"
+" remove bookmark command, it is usually the 'R' key but may have\n"
+" been remapped by you or your system administrator."
+msgstr ""
+
+#: src/LYBookmark.c:380
+#, c-format
+msgid ""
+" You can delete links by the 'R' key<br>\n"
+"<ol>\n"
+msgstr ""
+
+#: src/LYBookmark.c:383
+msgid ""
+" You can delete links using the remove bookmark command. It is usually\n"
+" the 'R' key but may have been remapped by you or your system\n"
+" administrator."
+msgstr ""
+
+#: src/LYBookmark.c:387
+msgid ""
+" This file also may be edited with a standard text editor to delete\n"
+" outdated or invalid links, or to change their order."
+msgstr ""
+
+#: src/LYBookmark.c:390
+msgid ""
+"Note: if you edit this file manually\n"
+" you should not change the format within the lines\n"
+" or add other HTML markup.\n"
+" Make sure any bookmark link is saved as a single line."
+msgstr ""
+
+#: src/LYBookmark.c:686
+#, c-format
+msgid "File may be recoverable from %s during this session"
+msgstr ""
+
+#: src/LYCgi.c:161
+#, c-format
+msgid "Do you want to execute \"%s\"?"
+msgstr ""
+
+#.
+#. * Neither the path as given nor any components examined by backing up
+#. * were stat()able. - kw
+#.
+#: src/LYCgi.c:276
+msgid "Unable to access cgi script"
+msgstr ""
+
+#: src/LYCgi.c:709 src/LYCgi.c:712
+msgid "Good Advice"
+msgstr ""
+
+#: src/LYCgi.c:716
+msgid "An excellent http server for VMS is available via"
+msgstr ""
+
+#: src/LYCgi.c:723
+msgid "this link"
+msgstr ""
+
+#: src/LYCgi.c:727
+msgid "It provides state of the art CGI script support.\n"
+msgstr ""
+
+#: src/LYClean.c:115
+msgid "Exiting via interrupt:"
+msgstr ""
+
+#: src/LYCookie.c:2651
+msgid "(from a previous session)"
+msgstr ""
+
+#: src/LYCookie.c:2712
+msgid "Maximum Gobble Date:"
+msgstr ""
+
+#: src/LYCookie.c:2751
+msgid "Internal"
+msgstr ""
+
+#: src/LYCookie.c:2752
+msgid "cookie_domain_flag_set error, aborting program"
+msgstr ""
+
+#: src/LYCurses.c:1127
+msgid "Terminal reinitialisation failed - unknown terminal type?"
+msgstr ""
+
+#: src/LYCurses.c:1334
+msgid "Terminal initialisation failed - unknown terminal type?"
+msgstr ""
+
+#: src/LYCurses.c:1828
+msgid "Terminal ="
+msgstr ""
+
+#: src/LYCurses.c:1832
+msgid "You must use a vt100, 200, etc. terminal with this program."
+msgstr ""
+
+#: src/LYCurses.c:1881
+msgid "Your Terminal type is unknown!"
+msgstr ""
+
+#: src/LYCurses.c:1882
+msgid "Enter a terminal type:"
+msgstr ""
+
+#: src/LYCurses.c:1896
+msgid "TERMINAL TYPE IS SET TO"
+msgstr ""
+
+#: src/LYCurses.c:2455
+#, c-format
+msgid ""
+"\n"
+"A Fatal error has occurred in %s Ver. %s\n"
+msgstr ""
+
+#: src/LYCurses.c:2458
+#, c-format
+msgid ""
+"\n"
+"Please notify your system administrator to confirm a bug, and if\n"
+"confirmed, to notify the lynx-dev list. Bug reports should have concise\n"
+"descriptions of the command and/or URL which causes the problem, the\n"
+"operating system name with version number, the TCPIP implementation, the\n"
+"TRACEBACK if it can be captured, and any other relevant information.\n"
+msgstr ""
+
+#: src/LYEdit.c:272
+#, c-format
+msgid "Error starting editor, %s"
+msgstr ""
+
+#: src/LYEdit.c:275
+msgid "Editor killed by signal"
+msgstr ""
+
+#: src/LYEdit.c:280
+#, c-format
+msgid "Editor returned with error status %s"
+msgstr ""
+
+#: src/LYDownload.c:511
+msgid "Downloaded link:"
+msgstr ""
+
+#: src/LYDownload.c:516
+msgid "Suggested file name:"
+msgstr ""
+
+#: src/LYDownload.c:521
+msgid "Standard download options:"
+msgstr ""
+
+#: src/LYDownload.c:522
+msgid "Download options:"
+msgstr ""
+
+#: src/LYDownload.c:538
+msgid "Save to disk"
+msgstr ""
+
+#: src/LYDownload.c:552
+msgid "View temporary file"
+msgstr ""
+
+#: src/LYDownload.c:559
+msgid "Save to disk disabled."
+msgstr ""
+
+#: src/LYDownload.c:563 src/LYPrint.c:1331
+msgid "Local additions:"
+msgstr ""
+
+#: src/LYDownload.c:574 src/LYUpload.c:206
+msgid "No Name Given"
+msgstr ""
+
+#: src/LYHistory.c:676
+msgid "You selected:"
+msgstr ""
+
+#: src/LYHistory.c:700 src/LYHistory.c:929
+msgid "(no address)"
+msgstr ""
+
+#: src/LYHistory.c:704
+msgid " (internal)"
+msgstr ""
+
+#: src/LYHistory.c:706
+msgid " (was internal)"
+msgstr ""
+
+#: src/LYHistory.c:804
+msgid " (From History)"
+msgstr ""
+
+#: src/LYHistory.c:849
+msgid "You visited (POSTs, bookmark, menu and list files excluded):"
+msgstr ""
+
+#: src/LYHistory.c:1151
+msgid "(No messages yet)"
+msgstr ""
+
+#: src/LYLeaks.c:222
+msgid "Invalid pointer detected."
+msgstr ""
+
+#: src/LYLeaks.c:224 src/LYLeaks.c:262
+msgid "Sequence:"
+msgstr ""
+
+#: src/LYLeaks.c:227 src/LYLeaks.c:265
+msgid "Pointer:"
+msgstr ""
+
+#: src/LYLeaks.c:236 src/LYLeaks.c:243 src/LYLeaks.c:284
+msgid "FileName:"
+msgstr ""
+
+#: src/LYLeaks.c:239 src/LYLeaks.c:246 src/LYLeaks.c:287 src/LYLeaks.c:298
+msgid "LineCount:"
+msgstr ""
+
+#: src/LYLeaks.c:260
+msgid "Memory leak detected."
+msgstr ""
+
+#: src/LYLeaks.c:268
+msgid "Contains:"
+msgstr ""
+
+#: src/LYLeaks.c:281
+msgid "ByteSize:"
+msgstr ""
+
+#: src/LYLeaks.c:295
+msgid "realloced:"
+msgstr ""
+
+#: src/LYLeaks.c:316
+msgid "Total memory leakage this run:"
+msgstr ""
+
+#: src/LYLeaks.c:320
+msgid "Peak allocation"
+msgstr ""
+
+#: src/LYLeaks.c:322
+msgid "Bytes allocated"
+msgstr ""
+
+#: src/LYLeaks.c:324
+msgid "Total mallocs"
+msgstr ""
+
+#: src/LYLeaks.c:326
+msgid "Total frees"
+msgstr ""
+
+#: src/LYList.c:89
+msgid "References in "
+msgstr ""
+
+#: src/LYList.c:92
+msgid "this document:"
+msgstr ""
+
+#: src/LYList.c:98 src/LYList.c:362
+msgid "Visible links:"
+msgstr ""
+
+#: src/LYList.c:202 src/LYList.c:321
+msgid "Hidden links:"
+msgstr ""
+
+#: src/LYList.c:358
+msgid "References"
+msgstr ""
+
+#: src/LYLocal.c:289
+#, c-format
+msgid "Unable to get status of '%s'."
+msgstr ""
+
+#: src/LYLocal.c:354
+msgid "The selected item is not a file or a directory! Request ignored."
+msgstr ""
+
+#: src/LYLocal.c:456
+#, c-format
+msgid "Unable to %s due to system error!"
+msgstr ""
+
+#: src/LYLocal.c:490
+#, c-format
+msgid "Probable failure to %s due to system error!"
+msgstr ""
+
+#: src/LYLocal.c:555 src/LYLocal.c:578
+#, c-format
+msgid "remove %s"
+msgstr ""
+
+#: src/LYLocal.c:598
+#, c-format
+msgid "touch %s"
+msgstr ""
+
+#: src/LYLocal.c:628
+#, c-format
+msgid "move %s to %s"
+msgstr ""
+
+#: src/LYLocal.c:676
+msgid "There is already a directory with that name! Request ignored."
+msgstr ""
+
+#: src/LYLocal.c:678
+msgid "There is already a file with that name! Request ignored."
+msgstr ""
+
+#: src/LYLocal.c:680
+msgid "The specified name is already in use! Request ignored."
+msgstr ""
+
+#: src/LYLocal.c:692
+msgid "Destination has different owner! Request denied."
+msgstr ""
+
+#: src/LYLocal.c:695
+msgid "Destination is not a valid directory! Request denied."
+msgstr ""
+
+#: src/LYLocal.c:711
+msgid "Source and destination are the same location! Request ignored!"
+msgstr ""
+
+#: src/LYLocal.c:735
+msgid "Remove all tagged files and directories?"
+msgstr ""
+
+#: src/LYLocal.c:808
+msgid "Enter new location for tagged items: "
+msgstr ""
+
+#: src/LYLocal.c:906
+msgid "Enter new name for directory: "
+msgstr ""
+
+#: src/LYLocal.c:908
+msgid "Enter new name for file: "
+msgstr ""
+
+#: src/LYLocal.c:920
+msgid "Illegal character (path-separator) found! Request ignored."
+msgstr ""
+
+#: src/LYLocal.c:970
+msgid "Enter new location for directory: "
+msgstr ""
+
+#: src/LYLocal.c:972
+msgid "Enter new location for file: "
+msgstr ""
+
+#: src/LYLocal.c:999
+msgid "Unexpected failure - unable to find trailing path separator"
+msgstr ""
+
+#: src/LYLocal.c:1061
+msgid "Modify name, location, or permission (n, l, or p): "
+msgstr ""
+
+#: src/LYLocal.c:1063
+msgid "Modify name or location (n or l): "
+msgstr ""
+
+#.
+#. * Code for changing ownership needed here.
+#.
+#: src/LYLocal.c:1092
+msgid "This feature not yet implemented!"
+msgstr ""
+
+#: src/LYLocal.c:1113
+msgid "Enter name of file to create: "
+msgstr ""
+
+#: src/LYLocal.c:1116 src/LYLocal.c:1153
+msgid "Illegal redirection \"//\" found! Request ignored."
+msgstr ""
+
+#: src/LYLocal.c:1150
+msgid "Enter name for new directory: "
+msgstr ""
+
+#: src/LYLocal.c:1191
+msgid "Create file or directory (f or d): "
+msgstr ""
+
+#: src/LYLocal.c:1233
+#, c-format
+msgid "Remove directory '%s'?"
+msgstr ""
+
+#: src/LYLocal.c:1236
+msgid "Remove directory?"
+msgstr ""
+
+#: src/LYLocal.c:1241
+#, c-format
+msgid "Remove file '%s'?"
+msgstr ""
+
+#: src/LYLocal.c:1243
+msgid "Remove file?"
+msgstr ""
+
+#: src/LYLocal.c:1248
+#, c-format
+msgid "Remove symbolic link '%s'?"
+msgstr ""
+
+#: src/LYLocal.c:1250
+msgid "Remove symbolic link?"
+msgstr ""
+
+#: src/LYLocal.c:1348
+msgid "Sorry, don't know how to permit non-UNIX files yet."
+msgstr ""
+
+#: src/LYLocal.c:1377
+msgid "Unable to open permit options file"
+msgstr ""
+
+#: src/LYLocal.c:1405
+msgid "Specify permissions below:"
+msgstr ""
+
+#: src/LYLocal.c:1406 src/LYShowInfo.c:291
+msgid "Owner:"
+msgstr ""
+
+#: src/LYLocal.c:1422
+msgid "Group"
+msgstr ""
+
+#: src/LYLocal.c:1438
+msgid "Others:"
+msgstr ""
+
+#: src/LYLocal.c:1456
+msgid "form to permit"
+msgstr ""
+
+#: src/LYLocal.c:1552
+msgid "Invalid mode format."
+msgstr ""
+
+#: src/LYLocal.c:1556
+msgid "Invalid syntax format."
+msgstr ""
+
+#: src/LYLocal.c:1743
+msgid "Warning! UUDecoded file will exist in the directory you started Lynx."
+msgstr ""
+
+#: src/LYLocal.c:1933
+msgid "NULL URL pointer"
+msgstr ""
+
+#: src/LYLocal.c:2015
+#, c-format
+msgid "Executing %s "
+msgstr ""
+
+#: src/LYLocal.c:2018
+msgid "Executing system command. This might take a while."
+msgstr ""
+
+#: src/LYLocal.c:2092
+msgid "Current directory:"
+msgstr ""
+
+#: src/LYLocal.c:2095 src/LYLocal.c:2113
+msgid "Current selection:"
+msgstr ""
+
+#: src/LYLocal.c:2099
+msgid "Nothing currently selected."
+msgstr ""
+
+#: src/LYLocal.c:2115
+msgid "tagged item:"
+msgstr ""
+
+#: src/LYLocal.c:2116
+msgid "tagged items:"
+msgstr ""
+
+#: src/LYLocal.c:2216 src/LYLocal.c:2225
+msgid "Illegal filename; request ignored."
+msgstr ""
+
+#. directory not writable
+#: src/LYLocal.c:2323 src/LYLocal.c:2382
+msgid "Install in the selected directory not permitted."
+msgstr ""
+
+#: src/LYLocal.c:2378
+msgid "The selected item is not a directory! Request ignored."
+msgstr ""
+
+#: src/LYLocal.c:2387
+msgid "Just a moment, ..."
+msgstr ""
+
+#: src/LYLocal.c:2404
+msgid "Error building install args"
+msgstr ""
+
+#: src/LYLocal.c:2419 src/LYLocal.c:2450
+#, c-format
+msgid "Source and target are the same: %s"
+msgstr ""
+
+#: src/LYLocal.c:2426 src/LYLocal.c:2457
+#, c-format
+msgid "Already in target directory: %s"
+msgstr ""
+
+#: src/LYLocal.c:2475
+msgid "Installation complete"
+msgstr ""
+
+#: src/LYLocal.c:2678
+msgid "Temporary URL or list would be too long."
+msgstr ""
+
+#: src/LYMail.c:566
+msgid "Sending"
+msgstr ""
+
+#: src/LYMail.c:1050
+#, c-format
+msgid "The link %s :?: %s \n"
+msgstr ""
+
+#: src/LYMail.c:1052
+#, c-format
+msgid "called \"%s\"\n"
+msgstr ""
+
+#: src/LYMail.c:1053
+#, c-format
+msgid "in the file \"%s\" called \"%s\"\n"
+msgstr ""
+
+#: src/LYMail.c:1054
+msgid "was requested but was not available."
+msgstr ""
+
+#: src/LYMail.c:1055
+msgid "Thought you might want to know."
+msgstr ""
+
+#: src/LYMail.c:1057
+msgid "This message was automatically generated by"
+msgstr ""
+
+#: src/LYMail.c:1770
+msgid "No system mailer configured"
+msgstr ""
+
+#: src/LYMain.c:1088
+msgid "No Winsock found, sorry."
+msgstr ""
+
+#: src/LYMain.c:1278
+msgid "You MUST define a valid TMP or TEMP area!"
+msgstr ""
+
+#: src/LYMain.c:1331 src/LYMainLoop.c:5285
+msgid "No such directory"
+msgstr ""
+
+#: src/LYMain.c:1525
+#, c-format
+msgid ""
+"\n"
+"Configuration file \"%s\" is not available.\n"
+"\n"
+msgstr ""
+
+#: src/LYMain.c:1535
+#, c-format
+msgid ""
+"\n"
+"Lynx character sets not declared.\n"
+"\n"
+msgstr ""
+
+#: src/LYMain.c:1691
+#, c-format
+msgid "Ignored %d characters from standard input.\n"
+msgstr ""
+
+#: src/LYMain.c:1693
+#, c-format
+msgid "Use \"-stdin\" or \"-\" to tell how to handle piped input.\n"
+msgstr ""
+
+#: src/LYMain.c:1851
+msgid "Warning:"
+msgstr ""
+
+#: src/LYMain.c:2419
+msgid "persistent cookies state will be changed in next session only."
+msgstr ""
+
+#: src/LYMain.c:2654 src/LYMain.c:2698
+#, c-format
+msgid "Lynx: ignoring unrecognized charset=%s\n"
+msgstr ""
+
+#: src/LYMain.c:3215
+#, c-format
+msgid "%s Version %s (%s)"
+msgstr ""
+
+#: src/LYMain.c:3256
+#, c-format
+msgid "Built on %s%s.\n"
+msgstr ""
+
+#: src/LYMain.c:3270
+msgid "Copyrights held by the Lynx Developers Group,"
+msgstr ""
+
+#: src/LYMain.c:3271
+msgid "the University of Kansas, CERN, and other contributors."
+msgstr ""
+
+#: src/LYMain.c:3272
+msgid "Distributed under the GNU General Public License (Version 2)."
+msgstr ""
+
+#: src/LYMain.c:3273
+msgid "See https://lynx.invisible-island.net/ and the online help for more information."
+msgstr ""
+
+#: src/LYMain.c:4120
+#, c-format
+msgid "USAGE: %s [options] [file]\n"
+msgstr ""
+
+#: src/LYMain.c:4121
+#, c-format
+msgid "Options are:\n"
+msgstr ""
+
+#: src/LYMain.c:4424
+#, c-format
+msgid "%s: Invalid Option: %s\n"
+msgstr ""
+
+#: src/LYMainLoop.c:572
+#, c-format
+msgid "Internal error: Invalid mouse link %d!"
+msgstr ""
+
+#: src/LYMainLoop.c:693 src/LYMainLoop.c:5307
+msgid "A URL specified by the user"
+msgstr ""
+
+#: src/LYMainLoop.c:1142
+msgid "Enctype multipart/form-data not yet supported! Cannot submit."
+msgstr ""
+
+#.
+#. * Make a name for this help file.
+#.
+#: src/LYMainLoop.c:3197
+msgid "Help Screen"
+msgstr ""
+
+#: src/LYMainLoop.c:3328
+msgid "System Index"
+msgstr ""
+
+#: src/LYMainLoop.c:3577
+#, c-format
+msgid "Query parameter %d: "
+msgstr ""
+
+#: src/LYMainLoop.c:3806 src/LYMainLoop.c:5583
+msgid "Entry into main screen"
+msgstr ""
+
+#: src/LYMainLoop.c:4064
+msgid "No next document present"
+msgstr ""
+
+#: src/LYMainLoop.c:4359
+msgid "charset for this document specified explicitly, sorry..."
+msgstr ""
+
+#: src/LYMainLoop.c:5265
+msgid "cd to:"
+msgstr ""
+
+#: src/LYMainLoop.c:5288
+msgid "A component of path is not a directory"
+msgstr ""
+
+#: src/LYMainLoop.c:5291
+msgid "failed to change directory"
+msgstr ""
+
+#: src/LYMainLoop.c:6517
+msgid "Reparsing document under current settings..."
+msgstr ""
+
+#: src/LYMainLoop.c:6811
+#, c-format
+msgid "Fatal error - could not open output file %s\n"
+msgstr ""
+
+#: src/LYMainLoop.c:7153
+msgid "TABLE center enable."
+msgstr ""
+
+#: src/LYMainLoop.c:7156
+msgid "TABLE center disable."
+msgstr ""
+
+#: src/LYMainLoop.c:7236
+msgid "Current URL is empty."
+msgstr ""
+
+#: src/LYMainLoop.c:7238 src/LYUtils.c:1909
+msgid "Copy to clipboard failed."
+msgstr ""
+
+#: src/LYMainLoop.c:7240
+msgid "Document URL put to clipboard."
+msgstr ""
+
+#: src/LYMainLoop.c:7242
+msgid "Link URL put to clipboard."
+msgstr ""
+
+#: src/LYMainLoop.c:7269
+msgid "No URL in the clipboard."
+msgstr ""
+
+#: src/LYMainLoop.c:7962 src/LYMainLoop.c:8133
+msgid "-index-"
+msgstr ""
+
+#: src/LYMainLoop.c:8071
+msgid "lynx: Can't access startfile"
+msgstr ""
+
+#: src/LYMainLoop.c:8083
+msgid "lynx: Start file could not be found or is not text/html or text/plain"
+msgstr ""
+
+#: src/LYMainLoop.c:8084
+msgid " Exiting..."
+msgstr ""
+
+#: src/LYMainLoop.c:8127
+msgid "-more-"
+msgstr ""
+
+#. Enable scrolling.
+#: src/LYNews.c:186
+msgid "You will be posting to:"
+msgstr ""
+
+#.
+#. * Get the mail address for the From header, offering personal_mail_address
+#. * as default.
+#.
+#: src/LYNews.c:195
+msgid ""
+"\n"
+"\n"
+" Please provide your mail address for the From: header\n"
+msgstr ""
+
+#.
+#. * Get the Subject header, offering the current document's title as the
+#. * default if this is a followup rather than a new post. - FM
+#.
+#: src/LYNews.c:212
+msgid ""
+"\n"
+"\n"
+" Please provide or edit the Subject: header\n"
+msgstr ""
+
+#: src/LYNews.c:302
+msgid ""
+"\n"
+"\n"
+" Please provide or edit the Organization: header\n"
+msgstr ""
+
+#.
+#. * Use the built in line editior.
+#.
+#: src/LYNews.c:359
+msgid ""
+"\n"
+"\n"
+" Please enter your message below."
+msgstr ""
+
+#: src/LYNews.c:405
+msgid "Message has no original text!"
+msgstr ""
+
+#: src/LYOptions.c:774
+msgid "review/edit B)ookmarks files"
+msgstr ""
+
+#: src/LYOptions.c:776
+msgid "B)ookmark file: "
+msgstr ""
+
+#: src/LYOptions.c:2131 src/LYOptions.c:2138
+msgid "ON"
+msgstr ""
+
+#. verbose_img variable
+#. LYCollapseBRs variable
+#. LYtrimBlankLines variable
+#: src/LYOptions.c:2132 src/LYOptions.c:2137 src/LYOptions.c:2321
+#: src/LYOptions.c:2330 src/LYOptions.c:2339 src/LYOptions.c:2350
+msgid "OFF"
+msgstr ""
+
+#: src/LYOptions.c:2133
+msgid "NEVER"
+msgstr ""
+
+#: src/LYOptions.c:2134
+msgid "ALWAYS"
+msgstr ""
+
+#: src/LYOptions.c:2150 src/LYOptions.c:2313
+msgid "ignore"
+msgstr ""
+
+#: src/LYOptions.c:2151
+msgid "ask user"
+msgstr ""
+
+#: src/LYOptions.c:2152
+msgid "accept all"
+msgstr ""
+
+#: src/LYOptions.c:2164
+msgid "ALWAYS OFF"
+msgstr ""
+
+#: src/LYOptions.c:2165
+msgid "FOR LOCAL FILES ONLY"
+msgstr ""
+
+#: src/LYOptions.c:2167
+msgid "ALWAYS ON"
+msgstr ""
+
+#: src/LYOptions.c:2179
+msgid "Numbers act as arrows"
+msgstr ""
+
+#: src/LYOptions.c:2181
+msgid "Links are numbered"
+msgstr ""
+
+#: src/LYOptions.c:2184
+msgid "Links and form fields are numbered"
+msgstr ""
+
+#: src/LYOptions.c:2187
+msgid "Form fields are numbered"
+msgstr ""
+
+#: src/LYOptions.c:2202
+msgid "Case insensitive"
+msgstr ""
+
+#: src/LYOptions.c:2203
+msgid "Case sensitive"
+msgstr ""
+
+#: src/LYOptions.c:2237
+msgid "prompt normally"
+msgstr ""
+
+#: src/LYOptions.c:2238
+msgid "force yes-response"
+msgstr ""
+
+#: src/LYOptions.c:2239
+msgid "force no-response"
+msgstr ""
+
+#: src/LYOptions.c:2249
+msgid "RFC 2109"
+msgstr ""
+
+#: src/LYOptions.c:2250
+msgid "RFC 2965"
+msgstr ""
+
+#: src/LYOptions.c:2251
+msgid "RFC 6265"
+msgstr ""
+
+#: src/LYOptions.c:2268
+msgid "Novice"
+msgstr ""
+
+#: src/LYOptions.c:2269
+msgid "Intermediate"
+msgstr ""
+
+#: src/LYOptions.c:2270
+msgid "Advanced"
+msgstr ""
+
+#: src/LYOptions.c:2279
+msgid "By First Visit"
+msgstr ""
+
+#: src/LYOptions.c:2281
+msgid "By First Visit Reversed"
+msgstr ""
+
+#: src/LYOptions.c:2282
+msgid "As Visit Tree"
+msgstr ""
+
+#: src/LYOptions.c:2283
+msgid "By Last Visit"
+msgstr ""
+
+#: src/LYOptions.c:2285
+msgid "By Last Visit Reversed"
+msgstr ""
+
+#. Old_DTD variable
+#: src/LYOptions.c:2296
+msgid "relaxed (TagSoup mode)"
+msgstr ""
+
+#: src/LYOptions.c:2297
+msgid "strict (SortaSGML mode)"
+msgstr ""
+
+#: src/LYOptions.c:2304
+msgid "Ignore"
+msgstr ""
+
+#: src/LYOptions.c:2305
+msgid "Add to trace-file"
+msgstr ""
+
+#: src/LYOptions.c:2306
+msgid "Add to LYNXMESSAGES"
+msgstr ""
+
+#: src/LYOptions.c:2307
+msgid "Warn, point to trace-file"
+msgstr ""
+
+#: src/LYOptions.c:2314
+msgid "as labels"
+msgstr ""
+
+#: src/LYOptions.c:2315
+msgid "as links"
+msgstr ""
+
+#: src/LYOptions.c:2322
+msgid "show filename"
+msgstr ""
+
+#: src/LYOptions.c:2331
+msgid "collapse"
+msgstr ""
+
+#: src/LYOptions.c:2340
+msgid "trim-lines"
+msgstr ""
+
+#: src/LYOptions.c:2351
+msgid "STANDARD"
+msgstr ""
+
+#: src/LYOptions.c:2352
+msgid "ADVANCED"
+msgstr ""
+
+#: src/LYOptions.c:2386
+msgid "Directories first"
+msgstr ""
+
+#: src/LYOptions.c:2387
+msgid "Files first"
+msgstr ""
+
+#: src/LYOptions.c:2388
+msgid "Mixed style"
+msgstr ""
+
+#: src/LYOptions.c:2396 src/LYOptions.c:2416
+msgid "By Name"
+msgstr ""
+
+#: src/LYOptions.c:2397 src/LYOptions.c:2417
+msgid "By Type"
+msgstr ""
+
+#: src/LYOptions.c:2398 src/LYOptions.c:2418
+msgid "By Size"
+msgstr ""
+
+#: src/LYOptions.c:2399 src/LYOptions.c:2419
+msgid "By Date"
+msgstr ""
+
+#: src/LYOptions.c:2400
+msgid "By Mode"
+msgstr ""
+
+#: src/LYOptions.c:2402
+msgid "By User"
+msgstr ""
+
+#: src/LYOptions.c:2403
+msgid "By Group"
+msgstr ""
+
+#: src/LYOptions.c:2428
+msgid "Do not show rate"
+msgstr ""
+
+#: src/LYOptions.c:2429 src/LYOptions.c:2430
+#, c-format
+msgid "Show %s/sec rate"
+msgstr ""
+
+#: src/LYOptions.c:2432 src/LYOptions.c:2433
+#, c-format
+msgid "Show %s/sec, ETA"
+msgstr ""
+
+#: src/LYOptions.c:2434 src/LYOptions.c:2435
+#, c-format
+msgid "Show %s/sec (2-digits), ETA"
+msgstr ""
+
+#: src/LYOptions.c:2438
+msgid "Show progressbar"
+msgstr ""
+
+#: src/LYOptions.c:2459
+msgid "Accept lynx's internal types"
+msgstr ""
+
+#: src/LYOptions.c:2460
+msgid "Also accept lynx.cfg's types"
+msgstr ""
+
+#: src/LYOptions.c:2461
+msgid "Also accept user's types"
+msgstr ""
+
+#: src/LYOptions.c:2462
+msgid "Also accept system's types"
+msgstr ""
+
+#: src/LYOptions.c:2463
+msgid "Accept all types"
+msgstr ""
+
+#: src/LYOptions.c:2472
+msgid "gzip"
+msgstr ""
+
+#: src/LYOptions.c:2473
+msgid "deflate"
+msgstr ""
+
+#: src/LYOptions.c:2476
+msgid "compress"
+msgstr ""
+
+#: src/LYOptions.c:2479
+msgid "bzip2"
+msgstr ""
+
+#: src/LYOptions.c:2481
+msgid "All"
+msgstr ""
+
+#: src/LYOptions.c:2491
+msgid "HTTP 1.0"
+msgstr ""
+
+#: src/LYOptions.c:2492
+msgid "HTTP 1.1"
+msgstr ""
+
+#: src/LYOptions.c:2851 src/LYOptions.c:2880
+#, c-format
+msgid "Use %s to invoke the Options menu!"
+msgstr ""
+
+#: src/LYOptions.c:3772
+msgid "(options marked with (!) will not be saved)"
+msgstr ""
+
+#: src/LYOptions.c:3780
+msgid "General Preferences"
+msgstr ""
+
+#. ***************************************************************
+#. User Mode: SELECT
+#: src/LYOptions.c:3784
+msgid "User mode"
+msgstr ""
+
+#. Editor: INPUT
+#: src/LYOptions.c:3790
+msgid "Editor"
+msgstr ""
+
+#. Search Type: SELECT
+#: src/LYOptions.c:3795
+msgid "Type of Search"
+msgstr ""
+
+#: src/LYOptions.c:3800
+msgid "Security and Privacy"
+msgstr ""
+
+#. ***************************************************************
+#. Cookies: SELECT
+#: src/LYOptions.c:3804
+msgid "Cookies"
+msgstr ""
+
+#. Cookie Version: SELECT
+#: src/LYOptions.c:3818
+msgid "Cookie RFC-version"
+msgstr ""
+
+#. Cookie Prompting: SELECT
+#: src/LYOptions.c:3824
+msgid "Invalid-Cookie Prompting"
+msgstr ""
+
+#. SSL Prompting: SELECT
+#: src/LYOptions.c:3831
+msgid "SSL Prompting"
+msgstr ""
+
+#: src/LYOptions.c:3836
+msgid "SSL client certificate file"
+msgstr ""
+
+#: src/LYOptions.c:3840
+msgid "SSL client key file"
+msgstr ""
+
+#: src/LYOptions.c:3846
+msgid "Keyboard Input"
+msgstr ""
+
+#. ***************************************************************
+#. Keypad Mode: SELECT
+#: src/LYOptions.c:3850
+msgid "Keypad mode"
+msgstr ""
+
+#. Emacs keys: ON/OFF
+#: src/LYOptions.c:3856
+msgid "Emacs keys"
+msgstr ""
+
+#. VI Keys: ON/OFF
+#: src/LYOptions.c:3862
+msgid "VI keys"
+msgstr ""
+
+#. Line edit style: SELECT
+#. well, at least 2 line edit styles available
+#: src/LYOptions.c:3869
+msgid "Line edit style"
+msgstr ""
+
+#. Keyboard layout: SELECT
+#: src/LYOptions.c:3881
+msgid "Keyboard layout"
+msgstr ""
+
+#.
+#. * Display and Character Set
+#.
+#: src/LYOptions.c:3895
+msgid "Display and Character Set"
+msgstr ""
+
+#. Use locale-based character set: ON/OFF
+#: src/LYOptions.c:3900
+msgid "Use locale-based character set"
+msgstr ""
+
+#: src/LYOptions.c:3907
+msgid "Use HTML5 charset replacements"
+msgstr ""
+
+#. Display Character Set: SELECT
+#: src/LYOptions.c:3913
+msgid "Display character set"
+msgstr ""
+
+#: src/LYOptions.c:3944
+msgid "Assumed document character set"
+msgstr ""
+
+#.
+#. * Since CJK people hardly mixed with other world
+#. * we split the header to make it more readable:
+#. * "CJK mode" for CJK display charsets, and "Raw 8-bit" for others.
+#.
+#: src/LYOptions.c:3964
+msgid "CJK mode"
+msgstr ""
+
+#: src/LYOptions.c:3966
+msgid "Raw 8-bit"
+msgstr ""
+
+#. X Display: INPUT
+#: src/LYOptions.c:3974
+msgid "X Display"
+msgstr ""
+
+#.
+#. * Document Appearance
+#.
+#: src/LYOptions.c:3980
+msgid "Document Appearance"
+msgstr ""
+
+#: src/LYOptions.c:3986
+msgid "Show color"
+msgstr ""
+
+#: src/LYOptions.c:4012
+msgid "Color style"
+msgstr ""
+
+#: src/LYOptions.c:4022
+msgid "Default colors"
+msgstr ""
+
+#. Show cursor: ON/OFF
+#: src/LYOptions.c:4030
+msgid "Show cursor"
+msgstr ""
+
+#. Underline links: ON/OFF
+#: src/LYOptions.c:4036
+msgid "Underline links"
+msgstr ""
+
+#. Show scrollbar: ON/OFF
+#: src/LYOptions.c:4043
+msgid "Show scrollbar"
+msgstr ""
+
+#. Select Popups: ON/OFF
+#: src/LYOptions.c:4050
+msgid "Popups for select fields"
+msgstr ""
+
+#. HTML error recovery: SELECT
+#: src/LYOptions.c:4056
+msgid "HTML error recovery"
+msgstr ""
+
+#. Bad HTML messages: SELECT
+#: src/LYOptions.c:4062
+msgid "Bad HTML messages"
+msgstr ""
+
+#. Show Images: SELECT
+#: src/LYOptions.c:4068
+msgid "Show images"
+msgstr ""
+
+#. Verbose Images: ON/OFF
+#: src/LYOptions.c:4082
+msgid "Verbose images"
+msgstr ""
+
+#. Collapse BR Tags: ON/OFF
+#: src/LYOptions.c:4088
+msgid "Collapse BR tags"
+msgstr ""
+
+#. Trim blank lines: ON/OFF
+#: src/LYOptions.c:4094
+msgid "Trim blank lines"
+msgstr ""
+
+#.
+#. * Headers Transferred to Remote Servers
+#.
+#: src/LYOptions.c:4102
+msgid "Headers Transferred to Remote Servers"
+msgstr ""
+
+#. ***************************************************************
+#. Mail Address: INPUT
+#: src/LYOptions.c:4106
+msgid "Personal mail address"
+msgstr ""
+
+#: src/LYOptions.c:4111
+msgid "Personal name for mail"
+msgstr ""
+
+#: src/LYOptions.c:4118
+msgid "Password for anonymous ftp"
+msgstr ""
+
+#. Preferred content type: SELECT
+#: src/LYOptions.c:4124
+msgid "Preferred content type"
+msgstr ""
+
+#. Preferred media type: SELECT
+#: src/LYOptions.c:4130
+msgid "Preferred media type"
+msgstr ""
+
+#. Preferred encoding: SELECT
+#: src/LYOptions.c:4136
+msgid "Preferred encoding"
+msgstr ""
+
+#. Preferred Document Character Set: INPUT
+#: src/LYOptions.c:4142
+msgid "Preferred document character set"
+msgstr ""
+
+#. Preferred Document Language: INPUT
+#: src/LYOptions.c:4147
+msgid "Preferred document language"
+msgstr ""
+
+#. HTTP protocol SELECT
+#: src/LYOptions.c:4152
+msgid "HTTP protocol"
+msgstr ""
+
+#: src/LYOptions.c:4159
+msgid "Send User-Agent header"
+msgstr ""
+
+#: src/LYOptions.c:4161
+msgid "User-Agent header"
+msgstr ""
+
+#.
+#. * Listing and Accessing Files
+#.
+#: src/LYOptions.c:4169
+msgid "Listing and Accessing Files"
+msgstr ""
+
+#. FTP sort: SELECT
+#: src/LYOptions.c:4174
+msgid "Use Passive FTP"
+msgstr ""
+
+#. FTP sort: SELECT
+#: src/LYOptions.c:4180
+msgid "FTP sort criteria"
+msgstr ""
+
+#. Local Directory Sort: SELECT
+#: src/LYOptions.c:4188
+msgid "Local directory sort criteria"
+msgstr ""
+
+#. Local Directory Order: SELECT
+#: src/LYOptions.c:4194
+msgid "Local directory sort order"
+msgstr ""
+
+#: src/LYOptions.c:4203
+msgid "Show dot files"
+msgstr ""
+
+#: src/LYOptions.c:4211
+msgid "Execution links"
+msgstr ""
+
+#: src/LYOptions.c:4229
+msgid "Pause when showing message"
+msgstr ""
+
+#. Show transfer rate: SELECT
+#: src/LYOptions.c:4236
+msgid "Show transfer rate"
+msgstr ""
+
+#.
+#. * Special Files and Screens
+#.
+#: src/LYOptions.c:4256
+msgid "Special Files and Screens"
+msgstr ""
+
+#: src/LYOptions.c:4261
+msgid "Multi-bookmarks"
+msgstr ""
+
+#: src/LYOptions.c:4269
+msgid "Review/edit Bookmarks files"
+msgstr ""
+
+#: src/LYOptions.c:4272
+msgid "Goto multi-bookmark menu"
+msgstr ""
+
+#: src/LYOptions.c:4274
+msgid "Bookmarks file"
+msgstr ""
+
+#. Auto Session: ON/OFF
+#: src/LYOptions.c:4281
+msgid "Auto Session"
+msgstr ""
+
+#. Session File Menu: INPUT
+#: src/LYOptions.c:4287
+msgid "Session file"
+msgstr ""
+
+#. Visited Pages: SELECT
+#: src/LYOptions.c:4293
+msgid "Visited Pages"
+msgstr ""
+
+#: src/LYOptions.c:4298
+msgid "View the file "
+msgstr ""
+
+#: src/LYPrint.c:956
+#, c-format
+msgid " Print job complete.\n"
+msgstr ""
+
+#: src/LYPrint.c:1283
+msgid "Document:"
+msgstr ""
+
+#: src/LYPrint.c:1284
+msgid "Number of lines:"
+msgstr ""
+
+#: src/LYPrint.c:1285
+msgid "Number of pages:"
+msgstr ""
+
+#: src/LYPrint.c:1286
+msgid "pages"
+msgstr ""
+
+#: src/LYPrint.c:1286
+msgid "page"
+msgstr ""
+
+#: src/LYPrint.c:1287
+msgid "(approximately)"
+msgstr ""
+
+#: src/LYPrint.c:1294
+msgid "Some print functions have been disabled!"
+msgstr ""
+
+#: src/LYPrint.c:1298
+msgid "Standard print options:"
+msgstr ""
+
+#: src/LYPrint.c:1299
+msgid "Print options:"
+msgstr ""
+
+#: src/LYPrint.c:1306
+msgid "Save to a local file"
+msgstr ""
+
+#: src/LYPrint.c:1308
+msgid "Save to disk disabled"
+msgstr ""
+
+#: src/LYPrint.c:1315
+msgid "Mail the file"
+msgstr ""
+
+#: src/LYPrint.c:1322
+msgid "Print to the screen"
+msgstr ""
+
+#: src/LYPrint.c:1327
+msgid "Print out on a printer attached to your vt100 terminal"
+msgstr ""
+
+#: src/LYReadCFG.c:437
+#, c-format
+msgid ""
+"Syntax Error parsing COLOR in configuration file:\n"
+"The line must be of the form:\n"
+"COLOR:INTEGER:FOREGROUND:BACKGROUND\n"
+"\n"
+"Here FOREGROUND and BACKGROUND must be one of:\n"
+"The special strings 'nocolor' or 'default', or\n"
+msgstr ""
+
+#: src/LYReadCFG.c:450
+msgid "Offending line:"
+msgstr ""
+
+#: src/LYReadCFG.c:764
+#, c-format
+msgid "key remapping of %s to %s for %s failed\n"
+msgstr ""
+
+#: src/LYReadCFG.c:771
+#, c-format
+msgid "key remapping of %s to %s failed\n"
+msgstr ""
+
+#: src/LYReadCFG.c:792
+#, c-format
+msgid "invalid line-editor selection %s for key %s, selecting all\n"
+msgstr ""
+
+#: src/LYReadCFG.c:817 src/LYReadCFG.c:829
+#, c-format
+msgid "setting of line-editor binding for key %s (0x%x) to 0x%x for %s failed\n"
+msgstr ""
+
+#: src/LYReadCFG.c:833
+#, c-format
+msgid "setting of line-editor binding for key %s (0x%x) for %s failed\n"
+msgstr ""
+
+#: src/LYReadCFG.c:929
+#, c-format
+msgid "Lynx: cannot start, CERN rules file %s is not available\n"
+msgstr ""
+
+#: src/LYReadCFG.c:930
+msgid "(no name)"
+msgstr ""
+
+#: src/LYReadCFG.c:2076
+#, c-format
+msgid "More than %d nested lynx.cfg includes -- perhaps there is a loop?!?\n"
+msgstr ""
+
+#: src/LYReadCFG.c:2078
+#, c-format
+msgid "Last attempted include was '%s',\n"
+msgstr ""
+
+#: src/LYReadCFG.c:2079
+#, c-format
+msgid "included from '%s'.\n"
+msgstr ""
+
+#: src/LYReadCFG.c:2490 src/LYReadCFG.c:2503 src/LYReadCFG.c:2561
+msgid "The following is read from your lynx.cfg file."
+msgstr ""
+
+#: src/LYReadCFG.c:2491 src/LYReadCFG.c:2504
+msgid "Please read the distribution"
+msgstr ""
+
+#: src/LYReadCFG.c:2497 src/LYReadCFG.c:2507
+msgid "for more comments."
+msgstr ""
+
+#: src/LYReadCFG.c:2543
+msgid "RELOAD THE CHANGES"
+msgstr ""
+
+#: src/LYReadCFG.c:2551
+msgid "Your primary configuration"
+msgstr ""
+
+#: src/LYShowInfo.c:116
+msgid "URL:"
+msgstr ""
+
+#: src/LYShowInfo.c:200
+msgid "Directory that you are currently viewing"
+msgstr ""
+
+#: src/LYShowInfo.c:203
+msgid "Name:"
+msgstr ""
+
+#: src/LYShowInfo.c:220
+msgid "Directory that you have currently selected"
+msgstr ""
+
+#: src/LYShowInfo.c:222
+msgid "File that you have currently selected"
+msgstr ""
+
+#: src/LYShowInfo.c:225
+msgid "Symbolic link that you have currently selected"
+msgstr ""
+
+#: src/LYShowInfo.c:228
+msgid "Item that you have currently selected"
+msgstr ""
+
+#: src/LYShowInfo.c:230
+msgid "Full name:"
+msgstr ""
+
+#: src/LYShowInfo.c:243
+msgid "Unable to follow link"
+msgstr ""
+
+#: src/LYShowInfo.c:245
+msgid "Points to file:"
+msgstr ""
+
+#: src/LYShowInfo.c:250
+msgid "Name of owner:"
+msgstr ""
+
+#: src/LYShowInfo.c:253
+msgid "Group name:"
+msgstr ""
+
+#: src/LYShowInfo.c:255
+msgid "File size:"
+msgstr ""
+
+#: src/LYShowInfo.c:257
+msgid "(bytes)"
+msgstr ""
+
+#.
+#. * Include date and time information.
+#.
+#: src/LYShowInfo.c:262
+msgid "Creation date:"
+msgstr ""
+
+#: src/LYShowInfo.c:265
+msgid "Last modified:"
+msgstr ""
+
+#: src/LYShowInfo.c:268
+msgid "Last accessed:"
+msgstr ""
+
+#: src/LYShowInfo.c:274
+msgid "Access Permissions"
+msgstr ""
+
+#: src/LYShowInfo.c:309
+msgid "Group:"
+msgstr ""
+
+#: src/LYShowInfo.c:329
+msgid "World:"
+msgstr ""
+
+#: src/LYShowInfo.c:336
+msgid "File that you are currently viewing"
+msgstr ""
+
+#: src/LYShowInfo.c:344 src/LYShowInfo.c:444
+msgid "Linkname:"
+msgstr ""
+
+#: src/LYShowInfo.c:350 src/LYShowInfo.c:365
+msgid "Charset:"
+msgstr ""
+
+#: src/LYShowInfo.c:364
+msgid "(assumed)"
+msgstr ""
+
+#: src/LYShowInfo.c:371
+msgid "Server:"
+msgstr ""
+
+#: src/LYShowInfo.c:374
+msgid "Date:"
+msgstr ""
+
+#: src/LYShowInfo.c:377
+msgid "Last Mod:"
+msgstr ""
+
+#: src/LYShowInfo.c:381
+msgid "Expires:"
+msgstr ""
+
+#: src/LYShowInfo.c:384
+msgid "Cache-Control:"
+msgstr ""
+
+#: src/LYShowInfo.c:387
+msgid "Content-Length:"
+msgstr ""
+
+#: src/LYShowInfo.c:391
+msgid "Length:"
+msgstr ""
+
+#: src/LYShowInfo.c:396
+msgid "Language:"
+msgstr ""
+
+#: src/LYShowInfo.c:402
+msgid "Post Data:"
+msgstr ""
+
+#: src/LYShowInfo.c:405
+msgid "Post Content Type:"
+msgstr ""
+
+#: src/LYShowInfo.c:408
+msgid "Owner(s):"
+msgstr ""
+
+#: src/LYShowInfo.c:413
+msgid "size:"
+msgstr ""
+
+#: src/LYShowInfo.c:415
+msgid "lines"
+msgstr ""
+
+#: src/LYShowInfo.c:419
+msgid "forms mode"
+msgstr ""
+
+#: src/LYShowInfo.c:421
+msgid "source"
+msgstr ""
+
+#: src/LYShowInfo.c:422
+msgid "normal"
+msgstr ""
+
+#: src/LYShowInfo.c:424
+msgid ", safe"
+msgstr ""
+
+#: src/LYShowInfo.c:426
+msgid ", via internal link"
+msgstr ""
+
+#: src/LYShowInfo.c:430
+msgid ", no-cache"
+msgstr ""
+
+#: src/LYShowInfo.c:432
+msgid ", ISMAP script"
+msgstr ""
+
+#: src/LYShowInfo.c:434
+msgid ", bookmark file"
+msgstr ""
+
+#: src/LYShowInfo.c:437
+msgid "mode:"
+msgstr ""
+
+#: src/LYShowInfo.c:443
+msgid "Link that you currently have selected"
+msgstr ""
+
+#: src/LYShowInfo.c:452
+msgid "Method:"
+msgstr ""
+
+#: src/LYShowInfo.c:456
+msgid "Enctype:"
+msgstr ""
+
+#: src/LYShowInfo.c:462
+msgid "Action:"
+msgstr ""
+
+#: src/LYShowInfo.c:468
+msgid "(Form field)"
+msgstr ""
+
+#: src/LYShowInfo.c:478
+msgid "No Links on the current page"
+msgstr ""
+
+#: src/LYShowInfo.c:483
+msgid "Server Headers:"
+msgstr ""
+
+#: src/LYStyle.c:332
+#, c-format
+msgid ""
+"Syntax Error parsing style in lss file:\n"
+"[%s]\n"
+"The line must be of the form:\n"
+"OBJECT:MONO:COLOR (ie em:bold:brightblue:white)\n"
+"where OBJECT is one of EM,STRONG,B,I,U,BLINK etc.\n"
+"\n"
+msgstr ""
+
+#: src/LYStyle.c:939
+#, c-format
+msgid ""
+"\n"
+"Lynx file \"%s\" is not available.\n"
+"\n"
+msgstr ""
+
+#: src/LYTraversal.c:111
+msgid "here is a list of the history stack so that you may rebuild"
+msgstr ""
+
+#: src/LYUpload.c:77
+msgid "ERROR! - upload command is misconfigured"
+msgstr ""
+
+#: src/LYUpload.c:98
+msgid "Illegal redirection \"../\" found! Request ignored."
+msgstr ""
+
+#: src/LYUpload.c:101
+msgid "Illegal character \"/\" found! Request ignored."
+msgstr ""
+
+#: src/LYUpload.c:104
+msgid "Illegal redirection using \"~\" found! Request ignored."
+msgstr ""
+
+#: src/LYUpload.c:157
+msgid "Unable to upload file."
+msgstr ""
+
+#: src/LYUpload.c:196
+msgid "Upload To:"
+msgstr ""
+
+#: src/LYUpload.c:197
+msgid "Upload options:"
+msgstr ""
+
+#: src/LYUtils.c:1911
+msgid "Download document URL put to clipboard."
+msgstr ""
+
+#: src/LYUtils.c:2658
+msgid "Unexpected access protocol for this URL scheme."
+msgstr ""
+
+#: src/LYUtils.c:3571
+msgid "Too many tempfiles"
+msgstr ""
+
+#: src/LYUtils.c:3871
+msgid "unknown restriction"
+msgstr ""
+
+#: src/LYUtils.c:3902
+#, c-format
+msgid "No restrictions set.\n"
+msgstr ""
+
+#: src/LYUtils.c:3905
+#, c-format
+msgid "Restrictions set:\n"
+msgstr ""
+
+#: src/LYUtils.c:5202
+msgid "Cannot find HOME directory"
+msgstr ""
+
+#: src/LYrcFile.c:16
+msgid "Normally disabled. See ENABLE_LYNXRC in lynx.cfg\n"
+msgstr ""
+
+#: src/LYrcFile.c:363
+msgid ""
+"accept_all_cookies allows the user to tell Lynx to automatically\n"
+"accept all cookies if desired. The default is \"FALSE\" which will\n"
+"prompt for each cookie. Set accept_all_cookies to \"TRUE\" to accept\n"
+"all cookies.\n"
+msgstr ""
+
+#: src/LYrcFile.c:371
+msgid ""
+"anonftp_password allows the user to tell Lynx to use the personal\n"
+"email address as the password for anonymous ftp. If no value is given,\n"
+"Lynx will use the personal email address. Set anonftp_password\n"
+"to a different value if you choose.\n"
+msgstr ""
+
+#: src/LYrcFile.c:380
+msgid ""
+"bookmark_file specifies the name and location of the default bookmark\n"
+"file into which the user can paste links for easy access at a later\n"
+"date.\n"
+msgstr ""
+
+#: src/LYrcFile.c:385
+msgid ""
+"If case_sensitive_searching is \"on\" then when the user invokes a search\n"
+"using the 's' or '/' keys, the search performed will be case sensitive\n"
+"instead of case INsensitive. The default is usually \"off\".\n"
+msgstr ""
+
+#: src/LYrcFile.c:390
+msgid ""
+"The character_set definition controls the representation of 8 bit\n"
+"characters for your terminal. If 8 bit characters do not show up\n"
+"correctly on your screen you may try changing to a different 8 bit\n"
+"set or using the 7 bit character approximations.\n"
+"Current valid characters sets are:\n"
+msgstr ""
+
+#: src/LYrcFile.c:398
+msgid ""
+"cookie_accept_domains and cookie_reject_domains are comma-delimited\n"
+"lists of domains from which Lynx should automatically accept or reject\n"
+"all cookies. If a domain is specified in both options, rejection will\n"
+"take precedence. The accept_all_cookies parameter will override any\n"
+"settings made here.\n"
+msgstr ""
+
+#: src/LYrcFile.c:406
+msgid ""
+"cookie_file specifies the file from which to read persistent cookies.\n"
+"The default is ~/"
+msgstr ""
+
+#: src/LYrcFile.c:411
+msgid ""
+"cookie_loose_invalid_domains, cookie_strict_invalid_domains, and\n"
+"cookie_query_invalid_domains are comma-delimited lists of which domains\n"
+"should be subjected to varying degrees of validity checking. If a\n"
+"domain is set to strict checking, strict conformance to RFC2109 will\n"
+"be applied. A domain with loose checking will be allowed to set cookies\n"
+"with an invalid path or domain attribute. All domains will default to\n"
+"querying the user for an invalid path or domain.\n"
+msgstr ""
+
+#: src/LYrcFile.c:425
+msgid ""
+"dir_list_order specifies the directory list order under DIRED_SUPPORT\n"
+"(if implemented). The default is \"ORDER_BY_NAME\"\n"
+msgstr ""
+
+#: src/LYrcFile.c:430
+msgid ""
+"dir_list_styles specifies the directory list style under DIRED_SUPPORT\n"
+"(if implemented). The default is \"MIXED_STYLE\", which sorts both\n"
+"files and directories together. \"FILES_FIRST\" lists files first and\n"
+"\"DIRECTORIES_FIRST\" lists directories first.\n"
+msgstr ""
+
+#: src/LYrcFile.c:438
+msgid ""
+"If emacs_keys is to \"on\" then the normal EMACS movement keys:\n"
+" ^N = down ^P = up\n"
+" ^B = left ^F = right\n"
+"will be enabled.\n"
+msgstr ""
+
+#: src/LYrcFile.c:444
+msgid ""
+"file_editor specifies the editor to be invoked when editing local files\n"
+"or sending mail. If no editor is specified, then file editing is disabled\n"
+"unless it is activated from the command line, and the built-in line editor\n"
+"will be used for sending mail.\n"
+msgstr ""
+
+#: src/LYrcFile.c:451
+msgid ""
+"The file_sorting_method specifies which value to sort on when viewing\n"
+"file lists such as FTP directories. The options are:\n"
+" BY_FILENAME -- sorts on the name of the file\n"
+" BY_TYPE -- sorts on the type of the file\n"
+" BY_SIZE -- sorts on the size of the file\n"
+" BY_DATE -- sorts on the date of the file\n"
+msgstr ""
+
+#: src/LYrcFile.c:478
+msgid ""
+"lineedit_mode specifies the key binding used for inputting strings in\n"
+"prompts and forms. If lineedit_mode is set to \"Default Binding\" then\n"
+"the following control characters are used for moving and deleting:\n"
+"\n"
+" Prev Next Enter = Accept input\n"
+" Move char: <- -> ^G = Cancel input\n"
+" Move word: ^P ^N ^U = Erase line\n"
+" Delete char: ^H ^R ^A = Beginning of line\n"
+" Delete word: ^B ^F ^E = End of line\n"
+"\n"
+"Current lineedit modes are:\n"
+msgstr ""
+
+#: src/LYrcFile.c:496
+msgid ""
+"The following allow you to define sub-bookmark files and descriptions.\n"
+"The format is multi_bookmark<capital_letter>=<filename>,<description>\n"
+"Up to 26 bookmark files (for the English capital letters) are allowed.\n"
+"We start with \"multi_bookmarkB\" since 'A' is the default (see above).\n"
+msgstr ""
+
+#: src/LYrcFile.c:502
+msgid ""
+"personal_mail_address specifies your personal mail address. The\n"
+"address will be sent during HTTP file transfers for authorization and\n"
+"logging purposes, and for mailed comments.\n"
+"If you do not want this information given out, set the NO_FROM_HEADER\n"
+"to TRUE in lynx.cfg, or use the -nofrom command line switch. You also\n"
+"could leave this field blank, but then you won't have it included in\n"
+"your mailed comments.\n"
+msgstr ""
+
+#: src/LYrcFile.c:511
+msgid ""
+"personal_mail_name specifies your personal name, for mail. The\n"
+"name is sent for mailed comments. Lynx will prompt for this,\n"
+"showing the configured value as a default when sending mail.\n"
+"This is not necessarily the same as a name provided as part of the\n"
+"personal_mail_address.\n"
+"Lynx does not save your changes to that default value as a side-effect\n"
+"of sending email. To update the default value, you must use the options\n"
+"menu, or modify this file directly.\n"
+msgstr ""
+
+#: src/LYrcFile.c:521
+msgid ""
+"preferred_charset specifies the character set in MIME notation (e.g.,\n"
+"ISO-8859-2, ISO-8859-5) which Lynx will indicate you prefer in requests\n"
+"to http servers using an Accept-Charset header. The value should NOT\n"
+"include ISO-8859-1 or US-ASCII, since those values are always assumed\n"
+"by default. May be a comma-separated list.\n"
+"If a file in that character set is available, the server will send it.\n"
+"If no Accept-Charset header is present, the default is that any\n"
+"character set is acceptable. If an Accept-Charset header is present,\n"
+"and if the server cannot send a response which is acceptable\n"
+"according to the Accept-Charset header, then the server SHOULD send\n"
+"an error response, though the sending of an unacceptable response\n"
+"is also allowed.\n"
+msgstr ""
+
+#: src/LYrcFile.c:539
+msgid ""
+"preferred_language specifies the language in MIME notation (e.g., en,\n"
+"fr, may be a comma-separated list in decreasing preference)\n"
+"which Lynx will indicate you prefer in requests to http servers.\n"
+"If a file in that language is available, the server will send it.\n"
+"Otherwise, the server will send the file in its default language.\n"
+msgstr ""
+
+#: src/LYrcFile.c:550
+msgid ""
+"If run_all_execution_links is set \"on\" then all local execution links\n"
+"will be executed when they are selected.\n"
+"\n"
+"WARNING - This is potentially VERY dangerous. Since you may view\n"
+" information that is written by unknown and untrusted sources\n"
+" there exists the possibility that Trojan horse links could be\n"
+" written. Trojan horse links could be written to erase files\n"
+" or compromise security. This should only be set to \"on\" if\n"
+" you are viewing trusted source information.\n"
+msgstr ""
+
+#: src/LYrcFile.c:561
+msgid ""
+"If run_execution_links_on_local_files is set \"on\" then all local\n"
+"execution links that are found in LOCAL files will be executed when they\n"
+"are selected. This is different from run_all_execution_links in that\n"
+"only files that reside on the local system will have execution link\n"
+"permissions.\n"
+"\n"
+"WARNING - This is potentially dangerous. Since you may view\n"
+" information that is written by unknown and untrusted sources\n"
+" there exists the possibility that Trojan horse links could be\n"
+" written. Trojan horse links could be written to erase files\n"
+" or compromise security. This should only be set to \"on\" if\n"
+" you are viewing trusted source information.\n"
+msgstr ""
+
+#: src/LYrcFile.c:579
+msgid ""
+"select_popups specifies whether the OPTIONs in a SELECT block which\n"
+"lacks a MULTIPLE attribute are presented as a vertical list of radio\n"
+"buttons or via a popup menu. Note that if the MULTIPLE attribute is\n"
+"present in the SELECT start tag, Lynx always will create a vertical list\n"
+"of checkboxes for the OPTIONs. A value of \"on\" will set popup menus\n"
+"as the default while a value of \"off\" will set use of radio boxes.\n"
+"The default can be overridden via the -popup command line toggle.\n"
+msgstr ""
+
+#: src/LYrcFile.c:590
+msgid ""
+"show_color specifies how to set the color mode at startup. A value of\n"
+"\"never\" will force color mode off (treat the terminal as monochrome)\n"
+"at startup even if the terminal appears to be color capable. A value of\n"
+"\"always\" will force color mode on even if the terminal appears to be\n"
+"monochrome, if this is supported by the library used to build lynx.\n"
+"A value of \"default\" will yield the behavior of assuming\n"
+"a monochrome terminal unless color capability is inferred at startup\n"
+"based on the terminal type, or the -color command line switch is used, or\n"
+"the COLORTERM environment variable is set. The default behavior always is\n"
+"used in anonymous accounts or if the \"option_save\" restriction is set.\n"
+"The effect of the saved value can be overridden via\n"
+"the -color and -nocolor command line switches.\n"
+"The mode set at startup can be changed via the \"show color\" option in\n"
+"the 'o'ptions menu. If the option settings are saved, the \"on\" and\n"
+"\"off\" \"show color\" settings will be treated as \"default\".\n"
+msgstr ""
+
+#: src/LYrcFile.c:607
+msgid ""
+"show_cursor specifies whether to 'hide' the cursor to the right (and\n"
+"bottom, if possible) of the screen, or to place it to the left of the\n"
+"current link in documents, or current option in select popup windows.\n"
+"Positioning the cursor to the left of the current link or option is\n"
+"helpful for speech or braille interfaces, and when the terminal is\n"
+"one which does not distinguish the current link based on highlighting\n"
+"or color. A value of \"on\" will set positioning to the left as the\n"
+"default while a value of \"off\" will set 'hiding' of the cursor.\n"
+"The default can be overridden via the -show_cursor command line toggle.\n"
+msgstr ""
+
+#: src/LYrcFile.c:618
+msgid ""
+"show_dotfiles specifies that the directory listing should include\n"
+"\"hidden\" (dot) files/directories. If set \"on\", this will be\n"
+"honored only if enabled via userdefs.h and/or lynx.cfg, and not\n"
+"restricted via a command line switch. If display of hidden files\n"
+"is disabled, creation of such files via Lynx also is disabled.\n"
+msgstr ""
+
+#: src/LYrcFile.c:629
+msgid ""
+"If sub_bookmarks is not turned \"off\", and multiple bookmarks have\n"
+"been defined (see below), then all bookmark operations will first\n"
+"prompt the user to select an active sub-bookmark file. If the default\n"
+"Lynx bookmark_file is defined (see above), it will be used as the\n"
+"default selection. When this option is set to \"advanced\", and the\n"
+"user mode is advanced, the 'v'iew bookmark command will invoke a\n"
+"statusline prompt instead of the menu seen in novice and intermediate\n"
+"user modes. When this option is set to \"standard\", the menu will be\n"
+"presented regardless of user mode.\n"
+msgstr ""
+
+#: src/LYrcFile.c:644
+msgid ""
+"user_mode specifies the users level of knowledge with Lynx. The\n"
+"default is \"NOVICE\" which displays two extra lines of help at the\n"
+"bottom of the screen to aid the user in learning the basic Lynx\n"
+"commands. Set user_mode to \"INTERMEDIATE\" to turn off the extra info.\n"
+"Use \"ADVANCED\" to see the URL of the currently selected link at the\n"
+"bottom of the screen.\n"
+msgstr ""
+
+#: src/LYrcFile.c:653
+msgid ""
+"If verbose_images is \"on\", lynx will print the name of the image\n"
+"source file in place of [INLINE], [LINK] or [IMAGE]\n"
+"See also VERBOSE_IMAGES in lynx.cfg\n"
+msgstr ""
+
+#: src/LYrcFile.c:658
+msgid ""
+"If vi_keys is set to \"on\", then the normal VI movement keys:\n"
+" j = down k = up\n"
+" h = left l = right\n"
+"will be enabled. These keys are only lower case.\n"
+"Capital 'H', 'J' and 'K will still activate help, jump shortcuts,\n"
+"and the keymap display, respectively.\n"
+msgstr ""
+
+#: src/LYrcFile.c:666
+msgid ""
+"The visited_links setting controls how Lynx organizes the information\n"
+"in the Visited Links Page.\n"
+msgstr ""
+
+#: src/LYrcFile.c:910
+msgid ""
+"If keypad_mode is set to \"NUMBERS_AS_ARROWS\", then the numbers on\n"
+"your keypad when the numlock is on will act as arrow keys:\n"
+" 8 = Up Arrow\n"
+" 4 = Left Arrow 6 = Right Arrow\n"
+" 2 = Down Arrow\n"
+"and the corresponding keyboard numbers will act as arrow keys,\n"
+"regardless of whether numlock is on.\n"
+msgstr ""
+
+#: src/LYrcFile.c:919
+msgid ""
+"If keypad_mode is set to \"LINKS_ARE_NUMBERED\", then numbers will\n"
+"appear next to each link and numbers are used to select links.\n"
+msgstr ""
+
+#: src/LYrcFile.c:923
+msgid ""
+"If keypad_mode is set to \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\", then\n"
+"numbers will appear next to each link and visible form input field.\n"
+"Numbers are used to select links, or to move the \"current link\" to a\n"
+"form input field or button. In addition, options in popup menus are\n"
+"indexed so that the user may type an option number to select an option in\n"
+"a popup menu, even if the option isn't visible on the screen. Reference\n"
+"lists and output from the list command also enumerate form inputs.\n"
+msgstr ""
+
+#: src/LYrcFile.c:932
+msgid ""
+"NOTE: Some fixed format documents may look disfigured when\n"
+"\"LINKS_ARE_NUMBERED\" or \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\" are\n"
+"enabled.\n"
+msgstr ""
+
+#: src/LYrcFile.c:964
+msgid ""
+"Lynx User Defaults File\n"
+"\n"
+msgstr ""
+
+#: src/LYrcFile.c:973
+msgid ""
+"This file contains options saved from the Lynx Options Screen (normally\n"
+"with the 'o' key). To save options with that screen, you must select the\n"
+"checkbox:\n"
+msgstr ""
+
+#: src/LYrcFile.c:980
+msgid ""
+"You must then save the settings using the link on the line above the\n"
+"checkbox:\n"
+msgstr ""
+
+#: src/LYrcFile.c:987
+msgid ""
+"You may also use the command-line option \"-forms_options\", which displays\n"
+"the simpler Options Menu instead. Save options with that using the '>' key.\n"
+"\n"
+msgstr ""
+
+#: src/LYrcFile.c:994
+msgid ""
+"This file contains options saved from the Lynx Options Screen (normally\n"
+"with the '>' key).\n"
+"\n"
+msgstr ""
+
+#: src/LYrcFile.c:1001
+msgid ""
+"There is normally no need to edit this file manually, since the defaults\n"
+"here can be controlled from the Options Screen, and the next time options\n"
+"are saved from the Options Screen this file will be completely rewritten.\n"
+"You have been warned...\n"
+"\n"
+"If you are looking for the general configuration file - it is normally\n"
+"called \"lynx.cfg\". It has different content and a different format.\n"
+"It is not this file.\n"
+msgstr ""
diff --git a/po/ru.po b/po/ru.po
new file mode 100644
index 0000000..3225a73
--- /dev/null
+++ b/po/ru.po
@@ -0,0 +1,6317 @@
+# Russian translation for lynx.
+# This file is distributed under the same license as the lynx package.
+# Copyright (C) 1999, 2000 Free Software Foundation, Inc.
+# Dmitry S. Sivachenko <dima@Chg.RU>, 1999, 2000, 2001, 2002.
+# Pavel Maryanov <acid@jack.kiev.ua>, 2015.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: lynx 2.8.8-dev9\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2012-02-12 19:13-0500\n"
+"PO-Revision-Date: 2015-03-22 12:51+0200\n"
+"Last-Translator: Pavel Maryanov <acid@jack.kiev.ua>\n"
+"Language-Team: Russian <gnu@mx.ru>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.7.5\n"
+
+#. ******************************************************************
+#. * The following definitions are for status line prompts, messages, or
+#. * warnings issued by Lynx during program execution. You can modify
+#. * them to make them more appropriate for your site. We recommend that
+#. * you extend these definitions to other languages using the gettext
+#. * library. There are also scattered uses of 'gettext()' throughout the
+#. * Lynx source, covering all but those messages which (a) are used for
+#. * debugging (CTRACE) or (b) are constants used in interaction with
+#. * other programs.
+#. *
+#. * See ABOUT-NLS and po/readme for details and location of contributed
+#. * translations. When no translation is available, the English default is
+#. * used.
+#.
+#: LYMessages.c:27
+#, c-format
+msgid "Alert!: %s"
+msgstr "Внимание!: %s"
+
+#: LYMessages.c:28
+msgid "Welcome"
+msgstr "Добро пожаловать"
+
+#: LYMessages.c:29
+msgid "Are you sure you want to quit?"
+msgstr "Вы уверены, что хотите выйти?"
+
+#: LYMessages.c:31
+msgid "Really exit from Lynx?"
+msgstr "ДейÑтвительно выйти из Lynx?"
+
+#: LYMessages.c:33
+msgid "Connection interrupted."
+msgstr "Соединение прервано."
+
+#: LYMessages.c:34
+msgid "Data transfer interrupted."
+msgstr "Передача данных прервана."
+
+#: LYMessages.c:35
+msgid "Cancelled!!!"
+msgstr "Отменено!!!"
+
+#: LYMessages.c:36
+msgid "Cancelling!"
+msgstr "Отмена!"
+
+#: LYMessages.c:37
+msgid "Excellent!!!"
+msgstr "Отлично!!!"
+
+#: LYMessages.c:38
+msgid "OK"
+msgstr "OK"
+
+#: LYMessages.c:39
+msgid "Done!"
+msgstr "Готово!"
+
+#: LYMessages.c:40
+msgid "Bad request!"
+msgstr "Плохой запроÑ!"
+
+#: LYMessages.c:41
+msgid "previous"
+msgstr "предыдущий"
+
+#: LYMessages.c:42
+msgid "next screen"
+msgstr "Ñледующий Ñкран"
+
+#: LYMessages.c:43
+msgid "HELP!"
+msgstr "ПОМОЩЬ!"
+
+#: LYMessages.c:44
+msgid ", help on "
+msgstr ", помощь по "
+
+#. #define HELP
+#: LYMessages.c:46
+msgid "Commands: Use arrow keys to move, '?' for help, 'q' to quit, '<-' to go back."
+msgstr "Команды: Ñтрелки - перемещение, '?' - помощь, 'q' - выход, '<-' - назад."
+
+#. #define MOREHELP
+#: LYMessages.c:48
+msgid "-- press space for more, use arrow keys to move, '?' for help, 'q' to quit."
+msgstr "-- нажмите пробел Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ, Ñтрелки - перемещение, '?' помощь, 'q' выход."
+
+#: LYMessages.c:49
+msgid "-- press space for next page --"
+msgstr "-- нажмите пробел Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÑ…Ð¾Ð´Ð° на Ñледующую Ñтраницу --"
+
+#: LYMessages.c:50
+msgid "URL too long"
+msgstr "URL Ñлишком длинный"
+
+#. Inactive input fields, messages used with -tna option - kw
+#. #define FORM_LINK_TEXT_MESSAGE_INA
+#: LYMessages.c:56
+msgid "(Text entry field) Inactive. Press <return> to activate."
+msgstr "(Поле ввода текÑта) Ðеактивно. Ðажмите <ввод> Ð´Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð¸Ð·Ð°Ñ†Ð¸Ð¸."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_INA
+#: LYMessages.c:58
+msgid "(Textarea) Inactive. Press <return> to activate."
+msgstr "(Textarea) Ðеактивна. Ðажмите <ввод> Ð´Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð¸Ð·Ð°Ñ†Ð¸Ð¸."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_INA_E
+#: LYMessages.c:60
+#, c-format
+msgid "(Textarea) Inactive. Press <return> to activate (%s for editor)."
+msgstr "(Textarea) Ðеактивна. Ðажмите <ввод> Ð´Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð¸Ð·Ð°Ñ†Ð¸Ð¸ (%s - редактор)."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE_INA
+#: LYMessages.c:62
+msgid "(Form field) Inactive. Use <return> to edit."
+msgstr "(Поле формы) Ðеактивно. ИÑпользуйте <ввод> Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ."
+
+#. #define FORM_TEXT_SUBMIT_MESSAGE_INA_X
+#: LYMessages.c:64
+#, c-format
+msgid "(Form field) Inactive. Use <return> to edit (%s to submit with no cache)."
+msgstr "(Поле формы) Ðеактивно. <ввод> редактирование (%s - поÑлать без кÑшированиÑ)."
+
+#. #define FORM_TEXT_RESUBMIT_MESSAGE_INA
+#: LYMessages.c:66
+msgid "(Form field) Inactive. Press <return> to edit, press <return> twice to submit."
+msgstr ""
+"(Поле формы) Ðеактивно. Ðажмите <ввод> Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ, <ввод> дважды - \n"
+"поÑлать."
+
+#. #define FORM_TEXT_SUBMIT_MAILTO_MSG_INA
+#: LYMessages.c:68
+msgid "(mailto form field) Inactive. Press <return> to change."
+msgstr "(Поле формы mailto) Ðеактивно. Ðажмите <ввод> Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ."
+
+#. #define FORM_LINK_PASSWORD_MESSAGE_INA
+#: LYMessages.c:70
+msgid "(Password entry field) Inactive. Press <return> to activate."
+msgstr "(Поле ввода паролÑ) Ðеактивно. Ðажмите <ввод> Ð´Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð¸Ð·Ð°Ñ†Ð¸Ð¸."
+
+#. #define FORM_LINK_FILE_UNM_MSG
+#: LYMessages.c:73
+msgid "UNMODIFIABLE file entry field. Use UP or DOWN arrows or tab to move off."
+msgstr "ÐЕМОДИФИЦИРУЕМОЕ поле ввода файла. Стрелки ВВЕРХ, Ð’ÐИЗ или tab - выход."
+
+#. #define FORM_LINK_FILE_MESSAGE
+#: LYMessages.c:75
+msgid "(File entry field) Enter filename. Use UP or DOWN arrows or tab to move off."
+msgstr "(Поле ввода файла) Введите Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°. Стрелки ВВЕРХ, Ð’ÐИЗ или tab - выход."
+
+#. #define FORM_LINK_TEXT_MESSAGE
+#: LYMessages.c:77
+msgid "(Text entry field) Enter text. Use UP or DOWN arrows or tab to move off."
+msgstr "(Поле ввода текÑта) Введите текÑÑ‚. Стрелки ВВЕРХ, Ð’ÐИЗ или tab - выход."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE
+#: LYMessages.c:79
+msgid "(Textarea) Enter text. Use UP/DOWN arrows or TAB to move off."
+msgstr "(Textarea) Введите текÑÑ‚. Стрелки ВВЕРХ/Ð’ÐИЗ или TAB - выход."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_E
+#: LYMessages.c:81
+#, c-format
+msgid "(Textarea) Enter text. Use UP/DOWN arrows or TAB to move off (%s for editor)."
+msgstr "(Textarea) Введите текÑÑ‚. Стрелки ВВЕРХ/Ð’ÐИЗ или TAB - выход (%s - редактор)."
+
+#. #define FORM_LINK_TEXT_UNM_MSG
+#: LYMessages.c:83
+msgid "UNMODIFIABLE form text field. Use UP or DOWN arrows or tab to move off."
+msgstr "ÐЕМОДИФИЦИРУЕМОЕ поле ввода текÑта. Стрелки ВВЕРХ, Ð’ÐИЗ или tab - выход."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE
+#: LYMessages.c:85
+msgid "(Form field) Enter text. Use <return> to submit."
+msgstr "(Поле формы) Введите текÑÑ‚. <ввод> - поÑлать."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE_X
+#: LYMessages.c:87
+#, c-format
+msgid "(Form field) Enter text. Use <return> to submit (%s for no cache)."
+msgstr "(Поле формы) Введите текÑÑ‚. <ввод> - поÑлать (%s Ð´Ð»Ñ Ð·Ð°Ð¿Ñ€ÐµÑ‚Ð° кÑшированиÑ)."
+
+#. #define FORM_LINK_TEXT_RESUBMIT_MESSAGE
+#: LYMessages.c:89
+msgid "(Form field) Enter text. Use <return> to submit, arrows or tab to move off."
+msgstr "(Поле формы) Введите текÑÑ‚. <ввод> - поÑлать, Ñтрелки или tab - выход."
+
+#. #define FORM_LINK_TEXT_SUBMIT_UNM_MSG
+#: LYMessages.c:91
+msgid "UNMODIFIABLE form field. Use UP or DOWN arrows or tab to move off."
+msgstr "ÐЕМОДИФИЦИРУЕМОЕ поле формы. Стрелки ВВЕРХ, Ð’ÐИЗ или tab - выход."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MAILTO_MSG
+#: LYMessages.c:93
+msgid "(mailto form field) Enter text. Use <return> to submit, arrows to move off."
+msgstr "(Поле формы mailto) Введите текÑÑ‚. <ввод> - поÑлать, Ñтрелки или tab - выход."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MAILTO_DIS_MSG
+#: LYMessages.c:95
+msgid "(mailto form field) Mail is disallowed so you cannot submit."
+msgstr "(Поле формы mailto) Отправка почты запрещена, так что вы не можете поÑлать."
+
+#. #define FORM_LINK_PASSWORD_MESSAGE
+#: LYMessages.c:97
+msgid "(Password entry field) Enter text. Use UP or DOWN arrows or tab to move off."
+msgstr "(Поле ввода паролÑ) Введите текÑÑ‚. Стрелки ВВЕРХ, Ð’ÐИЗ или tab - выход."
+
+#. #define FORM_LINK_PASSWORD_UNM_MSG
+#: LYMessages.c:99
+msgid "UNMODIFIABLE form password. Use UP or DOWN arrows or tab to move off."
+msgstr "ÐЕМОДИФИЦИРУЕМЫЙ пароль формы. Стрелки ВВЕРХ, Ð’ÐИЗ или tab - выход."
+
+#. #define FORM_LINK_CHECKBOX_MESSAGE
+#: LYMessages.c:101
+msgid "(Checkbox Field) Use right-arrow or <return> to toggle."
+msgstr "(Поле незавиÑимой кнопки) ÐŸÑ€Ð°Ð²Ð°Ñ Ñтрелка или <ввод> - переключение."
+
+#. #define FORM_LINK_CHECKBOX_UNM_MSG
+#: LYMessages.c:103
+msgid "UNMODIFIABLE form checkbox. Use UP or DOWN arrows or tab to move off."
+msgstr "ÐЕМОДИФИЦИРУЕМÐЯ незавиÑÐ¸Ð¼Ð°Ñ ÐºÐ½Ð¾Ð¿ÐºÐ° формы. Стрелки ВВЕРХ, Ð’ÐИЗ или tab - выход."
+
+#. #define FORM_LINK_RADIO_MESSAGE
+#: LYMessages.c:105
+msgid "(Radio Button) Use right-arrow or <return> to toggle."
+msgstr "(ЗавиÑÐ¸Ð¼Ð°Ñ ÐºÐ½Ð¾Ð¿ÐºÐ°) ÐŸÑ€Ð°Ð²Ð°Ñ Ñтрелка или <ввод> - переключение."
+
+#. #define FORM_LINK_RADIO_UNM_MSG
+#: LYMessages.c:107
+msgid "UNMODIFIABLE form radio button. Use UP or DOWN arrows or tab to move off."
+msgstr "ÐЕМОДИФИЦИРУЕМÐЯ завиÑÐ¸Ð¼Ð°Ñ ÐºÐ½Ð¾Ð¿ÐºÐ° формы. Стрелки ВВЕРХ, Ð’ÐИЗ или tab - выход."
+
+#. #define FORM_LINK_SUBMIT_PREFIX
+#: LYMessages.c:109
+msgid "Submit ('x' for no cache) to "
+msgstr "ПоÑлать ('x' Ð´Ð»Ñ Ð·Ð°Ð¿Ñ€ÐµÑ‚Ð° кÑшированиÑ) "
+
+#. #define FORM_LINK_RESUBMIT_PREFIX
+#: LYMessages.c:111
+msgid "Submit to "
+msgstr "ПоÑлать "
+
+#. #define FORM_LINK_SUBMIT_MESSAGE
+#: LYMessages.c:113
+msgid "(Form submit button) Use right-arrow or <return> to submit ('x' for no cache)."
+msgstr "(Кнопка поÑылки формы) -> или <ввод> - поÑлать ('x' - запрет кÑшированиÑ)."
+
+#. #define FORM_LINK_RESUBMIT_MESSAGE
+#: LYMessages.c:115
+msgid "(Form submit button) Use right-arrow or <return> to submit."
+msgstr "(Кнопка поÑылки формы) ÐŸÑ€Ð°Ð²Ð°Ñ Ñтрелка или <ввод> - поÑлать."
+
+#. #define FORM_LINK_SUBMIT_DIS_MSG
+#: LYMessages.c:117
+msgid "DISABLED form submit button. Use UP or DOWN arrows or tab to move off."
+msgstr "ОТКЛЮЧЕÐÐÐЯ кнопка поÑылки формы. Стрелки ВВЕРХ, Ð’ÐИЗ или tab - выход."
+
+#. #define FORM_LINK_SUBMIT_MAILTO_PREFIX
+#: LYMessages.c:119
+msgid "Submit mailto form to "
+msgstr "ПоÑлать форму по почте "
+
+#. #define FORM_LINK_SUBMIT_MAILTO_MSG
+#: LYMessages.c:121
+msgid "(mailto form submit button) Use right-arrow or <return> to submit."
+msgstr "(Кнопка поÑылки формы по почте) ÐŸÑ€Ð°Ð²Ð°Ñ Ñтрелка или <ввод> - поÑлать."
+
+#. #define FORM_LINK_SUBMIT_MAILTO_DIS_MSG
+#: LYMessages.c:123
+msgid "(mailto form submit button) Mail is disallowed so you cannot submit."
+msgstr "(Кнопка поÑылки формы по почте) Почта запрещена, так что вы не можете поÑлать."
+
+#. #define FORM_LINK_RESET_MESSAGE
+#: LYMessages.c:125
+msgid "(Form reset button) Use right-arrow or <return> to reset form to defaults."
+msgstr "(Кнопка очиÑтки формы) ÐŸÑ€Ð°Ð²Ð°Ñ Ñтрелка или <ввод> - очиÑтить форму."
+
+#. #define FORM_LINK_RESET_DIS_MSG
+#: LYMessages.c:127
+msgid "DISABLED form reset button. Use UP or DOWN arrows or tab to move off."
+msgstr "ОТКЛЮЧЕÐÐÐЯ кнопка очиÑтки формы. Стрелки ВВЕРХ, Ð’ÐИЗ или tab - выход."
+
+#. #define FORM_LINK_BUTTON_MESSAGE
+#: LYMessages.c:129
+#, fuzzy
+#| msgid "DISABLED form submit button. Use UP or DOWN arrows or tab to move off."
+msgid "(Script button) Use UP or DOWN arrows or tab to move off."
+msgstr "ОТКЛЮЧЕÐÐÐЯ кнопка поÑылки формы. Стрелки ВВЕРХ, Ð’ÐИЗ или tab - выход."
+
+#. #define FORM_LINK_BUTTON_DIS_MSG
+#: LYMessages.c:131
+#, fuzzy
+#| msgid "DISABLED form submit button. Use UP or DOWN arrows or tab to move off."
+msgid "DISABLED Script button. Use UP or DOWN arrows or tab to move off."
+msgstr "ОТКЛЮЧЕÐÐÐЯ кнопка поÑылки формы. Стрелки ВВЕРХ, Ð’ÐИЗ или tab - выход."
+
+#. #define FORM_LINK_OPTION_LIST_MESSAGE
+#: LYMessages.c:133
+msgid "(Option list) Hit return and use arrow keys and return to select option."
+msgstr "(СпиÑок опций) Ðажмите ввод и иÑпользуйте Ñтрелки и ввод Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° опции."
+
+#. #define CHOICE_LIST_MESSAGE
+#: LYMessages.c:135
+msgid "(Choice list) Hit return and use arrow keys and return to select option."
+msgstr "(СпиÑок вариантов) Ðажмите ввод и иÑпользуйте Ñтрелки и ввод Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° варианта."
+
+#. #define FORM_LINK_OPTION_LIST_UNM_MSG
+#: LYMessages.c:137
+msgid "UNMODIFIABLE option list. Use return or arrow keys to review or leave."
+msgstr "ÐЕМОДИФИЦИРУЕМЫЙ ÑпиÑок опций. Ввод или Ñтрелки - проÑмотр или выход."
+
+#. #define CHOICE_LIST_UNM_MSG
+#: LYMessages.c:139
+msgid "UNMODIFIABLE choice list. Use return or arrow keys to review or leave."
+msgstr "ÐЕМОДИФИЦИРУЕМЫЙ ÑпиÑок вариантов. Ввод или Ñтрелки - проÑмотр или выход."
+
+#: LYMessages.c:140
+msgid "Submitting form..."
+msgstr "ПоÑылка формы..."
+
+#: LYMessages.c:141
+msgid "Resetting form..."
+msgstr "ОчиÑтка формы..."
+
+#. #define RELOADING_FORM
+#: LYMessages.c:143
+msgid "Reloading document. Any form entries will be lost!"
+msgstr "Обновление документа. Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð²Ñех полей формы будут потерÑны!"
+
+#. #define LINK_NOT_IN_FORM
+#: LYMessages.c:145
+msgid "The current link is not in a FORM"
+msgstr ""
+
+#: LYMessages.c:146
+#, c-format
+msgid "Warning: Cannot transcode form data to charset %s!"
+msgstr "Предупреждение: не удаетÑÑ Ð¿ÐµÑ€ÐµÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ данные формы в кодировку %s!"
+
+#. #define NORMAL_LINK_MESSAGE
+#: LYMessages.c:149
+msgid "(NORMAL LINK) Use right-arrow or <return> to activate."
+msgstr "(ОБЫЧÐÐЯ ССЫЛКÐ) ИÑпользуйте правую Ñтрелку или <ввод> Ð´Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð¸Ð·Ð°Ñ†Ð¸Ð¸."
+
+#: LYMessages.c:150
+msgid "The resource requested is not available at this time."
+msgstr "Запрашиваемый реÑÑƒÑ€Ñ Ð² наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð½ÐµÐ´Ð¾Ñтупен."
+
+#: LYMessages.c:151
+msgid "Enter Lynx keystroke command: "
+msgstr "Введите команду Lynx: "
+
+#: LYMessages.c:152
+msgid "Looking up "
+msgstr "Идет поиÑк "
+
+#: LYMessages.c:153
+#, c-format
+msgid "Getting %s"
+msgstr "Получение %s"
+
+#: LYMessages.c:154
+#, c-format
+msgid "Skipping %s"
+msgstr "ПропуÑк %s"
+
+#: LYMessages.c:155
+#, c-format
+msgid "Using %s"
+msgstr "ИÑпользование %s"
+
+#: LYMessages.c:156
+#, c-format
+msgid "Illegal URL: %s"
+msgstr "Ðеверный URL: %s"
+
+#: LYMessages.c:157
+#, c-format
+msgid "Badly formed address %s"
+msgstr "Ðеправильно Ñформированный Ð°Ð´Ñ€ÐµÑ %s"
+
+#: LYMessages.c:158
+#, c-format
+msgid "URL: %s"
+msgstr "URL: %s"
+
+#: LYMessages.c:159
+msgid "Unable to access WWW file!!!"
+msgstr "Ðет доÑтупа к WWW-файлу!!!"
+
+#: LYMessages.c:160
+#, c-format
+msgid "This is a searchable index. Use %s to search."
+msgstr "Это поиÑковый индекÑ. Ð”Ð»Ñ Ð¿Ð¾Ð¸Ñка иÑпользуйте %s."
+
+#. #define WWW_INDEX_MORE_MESSAGE
+#: LYMessages.c:162
+#, c-format
+msgid "--More-- This is a searchable index. Use %s to search."
+msgstr "--Далее-- Это поиÑковый индекÑ. Ð”Ð»Ñ Ð¿Ð¾Ð¸Ñка иÑпользуйте %s."
+
+#: LYMessages.c:163
+msgid "You have entered an invalid link number."
+msgstr "Ð’Ñ‹ ввели неверный номер ÑÑылки."
+
+#. #define SOURCE_HELP
+#: LYMessages.c:165
+msgid "Currently viewing document source. Press '\\' to return to rendered version."
+msgstr "Идет проÑмотр иÑходного текÑта документа. Ðажмите '\\' Ð´Ð»Ñ Ð²Ð¾Ð·Ð²Ñ€Ð°Ñ‚Ð° к режиму визуализации."
+
+#. #define NOVICE_LINE_ONE
+#: LYMessages.c:167
+msgid " Arrow keys: Up and Down to move. Right to follow a link; Left to go back. \n"
+msgstr "Стрелки: Вверх, Вниз - перемещение. Вправо - переход по ÑÑылке; Влево - возврат.\n"
+
+#. #define NOVICE_LINE_TWO
+#: LYMessages.c:169
+msgid " H)elp O)ptions P)rint G)o M)ain screen Q)uit /=search [delete]=history list \n"
+msgstr " H)elp O)ptions P)rint G)o M)Глав Ñкран Q)uit /=поиÑк [delete]=ÑпиÑок иÑтории \n"
+
+#. #define NOVICE_LINE_TWO_A
+#: LYMessages.c:171
+msgid " O)ther cmds H)elp K)eymap G)oto P)rint M)ain screen o)ptions Q)uit \n"
+msgstr " O)Др. ком. H)elp K)eymap G)oto P)Печать M)Глав Ñкран o)Парам Q)Выход\n"
+
+#. #define NOVICE_LINE_TWO_B
+#: LYMessages.c:173
+msgid " O)ther cmds B)ack E)dit D)ownload ^R)eload ^W)ipe screen search doc: / \n"
+msgstr " O)Др. ком. B)ack E)Ред D)загрузить ^R)eload ^W)ipe screen поиÑк в док: / \n"
+
+#. #define NOVICE_LINE_TWO_C
+#: LYMessages.c:175
+msgid "O)ther cmds C)omment History: <backspace> Bookmarks: V)iew, A)dd, R)emove \n"
+msgstr "O)Др. ком. C)omment ИÑториÑ: <backspace> Закладки: V)iew, A)dd, R)emove \n"
+
+#. #define FORM_NOVICELINE_ONE
+#: LYMessages.c:177
+msgid " Enter text into the field by typing on the keyboard "
+msgstr " Введите в поле текÑÑ‚ Ñ ÐºÐ»Ð°Ð²Ð¸Ð°Ñ‚ÑƒÑ€Ñ‹ "
+
+#. #define FORM_NOVICELINE_TWO
+#: LYMessages.c:179
+msgid " Ctrl-U to delete all text in field, [Backspace] to delete a character "
+msgstr " Ctrl-U - удаление вÑего текÑта в поле, [Backspace] - удаление одного Ñимвола"
+
+#. #define FORM_NOVICELINE_TWO_DELBL
+#: LYMessages.c:181
+msgid " Ctrl-U to delete text in field, [Backspace] to delete a character "
+msgstr " Ctrl-U - удаление вÑего текÑта в поле, [Backspace] - удаление одного Ñимвола "
+
+#. #define FORM_NOVICELINE_TWO_VAR
+#: LYMessages.c:183
+#, c-format
+msgid " %s to delete all text in field, [Backspace] to delete a character "
+msgstr " %s - удаление вÑего текÑта в поле, [Backspace] - удаление одного Ñимвола "
+
+#. #define FORM_NOVICELINE_TWO_DELBL_VAR
+#: LYMessages.c:185
+#, c-format
+msgid " %s to delete text in field, [Backspace] to delete a character "
+msgstr " %s - удаление вÑего текÑта в поле, [Backspace] - удаление одного Ñимвола "
+
+#. mailto
+#: LYMessages.c:188
+msgid "Malformed mailto form submission! Cancelled!"
+msgstr "Ðеправильно ÑÑ„Ð¾Ñ€Ð¼Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ð¿Ð¾Ñылка формы по почте! Отменено!"
+
+#: LYMessages.c:189
+msgid "Warning! Control codes in mail address replaced by ?"
+msgstr "Предупреждение! УправлÑющие коды в почтовом адреÑе заменены на ?"
+
+#: LYMessages.c:190
+msgid "Mail disallowed! Cannot submit."
+msgstr "Почта запрещена! Ðе удаетÑÑ Ð¿Ð¾Ñлать."
+
+#: LYMessages.c:191
+msgid "Mailto form submission failed!"
+msgstr "ПоÑылка формы по почте не выполнена!"
+
+#: LYMessages.c:192
+msgid "Mailto form submission Cancelled!!!"
+msgstr "ПоÑылка формы по почте отменена!!!"
+
+#: LYMessages.c:193
+msgid "Sending form content..."
+msgstr "ПоÑылка Ñодержимого формы..."
+
+#: LYMessages.c:194
+msgid "No email address is present in mailto URL!"
+msgstr "ОтÑутÑтвует почтовый Ð°Ð´Ñ€ÐµÑ Ð² mailto URL!"
+
+#. #define MAILTO_URL_TEMPOPEN_FAILED
+#: LYMessages.c:196
+msgid "Unable to open temporary file for mailto URL!"
+msgstr "Ðевозможно открыть временный файл Ð´Ð»Ñ mailto URL!"
+
+#. #define INC_ORIG_MSG_PROMPT
+#: LYMessages.c:198
+msgid "Do you wish to include the original message?"
+msgstr "Ð’Ñ‹ хотите включить иÑходное Ñообщение?"
+
+#. #define INC_PREPARSED_MSG_PROMPT
+#: LYMessages.c:200
+msgid "Do you wish to include the preparsed source?"
+msgstr "Ð’Ñ‹ хотите включить разобранный иÑходный текÑÑ‚?"
+
+#. #define SPAWNING_EDITOR_FOR_MAIL
+#: LYMessages.c:202
+msgid "Spawning your selected editor to edit mail message"
+msgstr "ЗапуÑк вашего выбранного редактора Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾Ñ‡Ñ‚Ð¾Ð²Ð¾Ð³Ð¾ ÑообщениÑ"
+
+#. #define ERROR_SPAWNING_EDITOR
+#: LYMessages.c:204
+msgid "Error spawning editor, check your editor definition in the options menu"
+msgstr "Ошибка при запуÑке редактора, проверьте определение редактора в меню параметров"
+
+#: LYMessages.c:205
+msgid "Send this comment?"
+msgstr "ПоÑлать Ñтот комментарий?"
+
+#: LYMessages.c:206
+msgid "Send this message?"
+msgstr "ПоÑлать Ñто Ñообщение?"
+
+#: LYMessages.c:207
+msgid "Sending your message..."
+msgstr "ПоÑылка вашего ÑообщениÑ..."
+
+#: LYMessages.c:208
+msgid "Sending your comment:"
+msgstr "ПоÑылка вашего комментариÑ:"
+
+#. textarea
+#: LYMessages.c:211
+msgid "Not in a TEXTAREA; cannot use external editor."
+msgstr "ИÑпользование внешнего редактора, находÑÑÑŒ вне TEXTAREA, невозможно."
+
+#: LYMessages.c:212
+msgid "Not in a TEXTAREA; cannot use command."
+msgstr "ИÑпользование команды, находÑÑÑŒ вне TEXTAREA, невозможно."
+
+#: LYMessages.c:214
+msgid "file: ACTIONs are disallowed!"
+msgstr "файл: ДЕЙСТВИЯ запрещены!"
+
+#. #define FILE_SERVED_LINKS_DISALLOWED
+#: LYMessages.c:216
+msgid "file: URLs via served links are disallowed!"
+msgstr ""
+
+#: LYMessages.c:217
+msgid "Access to local files denied."
+msgstr "ДоÑтуп к локальным файлам запрещен."
+
+#: LYMessages.c:218
+msgid "file: URLs via bookmarks are disallowed!"
+msgstr "файл: URL через закладки запрещены!"
+
+#. #define SPECIAL_VIA_EXTERNAL_DISALLOWED
+#: LYMessages.c:220
+msgid "This special URL is not allowed in external documents!"
+msgstr "Этот Ñпециальный URL не допуÑкаетÑÑ Ð²Ð¾ внешнем документе!"
+
+#: LYMessages.c:221
+msgid "Press <return> to return to Lynx."
+msgstr "Ðажмите <ввод> Ð´Ð»Ñ Ð²Ð¾Ð·Ð²Ñ€Ð°Ñ‚Ð° в Lynx."
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:224
+msgid "Spawning DCL subprocess. Use 'logout' to return to Lynx.\n"
+msgstr "ЗапуÑкаетÑÑ Ð¿Ð¾Ð´Ð¿Ñ€Ð¾Ñ†ÐµÑÑ DCL. ИÑпользуйте 'logout' Ð´Ð»Ñ Ð²Ð¾Ð·Ð²Ñ€Ð°Ñ‚Ð° в Lynx.\n"
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:228
+msgid "Type EXIT to return to Lynx.\n"
+msgstr "Введите EXIT Ð´Ð»Ñ Ð²Ð¾Ð·Ð²Ñ€Ð°Ñ‚Ð° в Lynx.\n"
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:231
+msgid "Spawning your default shell. Use 'exit' to return to Lynx.\n"
+msgstr "ЗапуÑк вашей оболочки по умолчанию. ИÑпользуйте 'exit' Ð´Ð»Ñ Ð²Ð¾Ð·Ð²Ñ€Ð°Ñ‚Ð° в Lynx.\n"
+
+#: LYMessages.c:234
+msgid "Spawning is currently disabled."
+msgstr "ЗапуÑк процеÑÑов ÑÐµÐ¹Ñ‡Ð°Ñ Ð·Ð°Ð¿Ñ€ÐµÑ‰ÐµÐ½."
+
+#: LYMessages.c:235
+msgid "The 'd'ownload command is currently disabled."
+msgstr "Команда 'd' (Ñкачать) ÑÐµÐ¹Ñ‡Ð°Ñ Ð·Ð°Ð¿Ñ€ÐµÑ‰ÐµÐ½Ð°."
+
+#: LYMessages.c:236
+msgid "You cannot download an input field."
+msgstr "Ð’Ñ‹ не можете Ñкачать поле ввода."
+
+#: LYMessages.c:237
+msgid "Form has a mailto action! Cannot download."
+msgstr "ДейÑтвием формы ÑвлÑетÑÑ Ð¿Ð¾Ñылка по почте! Ðевозможно Ñкачать."
+
+#: LYMessages.c:238
+msgid "You cannot download a mailto: link."
+msgstr "Ð’Ñ‹ не можете Ñкачать ÑÑылку mailto:."
+
+#: LYMessages.c:239
+msgid "You cannot download cookies."
+msgstr "Ð’Ñ‹ не можете Ñкачать cookie."
+
+#: LYMessages.c:240
+msgid "You cannot download a printing option."
+msgstr "Ð’Ñ‹ не можете Ñкачать параметр печати."
+
+#: LYMessages.c:241
+msgid "You cannot download an upload option."
+msgstr "Ð’Ñ‹ не можете Ñкачать или загрузить параметр."
+
+#: LYMessages.c:242
+msgid "You cannot download an permit option."
+msgstr ""
+
+#: LYMessages.c:243
+msgid "This special URL cannot be downloaded!"
+msgstr "Этот Ñпециальный URL не может быть Ñкачан!"
+
+#: LYMessages.c:244
+msgid "Nothing to download."
+msgstr "Скачивать нечего."
+
+#: LYMessages.c:245
+msgid "Trace ON!"
+msgstr "ТраÑÑировка ВКЛЮЧЕÐÐ!"
+
+#: LYMessages.c:246
+msgid "Trace OFF!"
+msgstr "ТраÑÑировка ВЫКЛЮЧЕÐÐ!"
+
+#. #define CLICKABLE_IMAGES_ON
+#: LYMessages.c:248
+msgid "Links will be included for all images! Reloading..."
+msgstr "СÑылки будут включены Ð´Ð»Ñ Ð²Ñех изображений! Обновление..."
+
+#. #define CLICKABLE_IMAGES_OFF
+#: LYMessages.c:250
+msgid "Standard image handling restored! Reloading..."
+msgstr "Ð¡Ñ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð°Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ° изображений воÑÑтановлена! Обновление..."
+
+#. #define PSEUDO_INLINE_ALTS_ON
+#: LYMessages.c:252
+msgid "Pseudo_ALTs will be inserted for inlines without ALT strings! Reloading..."
+msgstr "ПÑевдо-ALT будут вÑтавлены Ð´Ð»Ñ Ð²Ð½ÑƒÑ‚Ñ€Ð¸Ñтрочных изображений без ALT. Обновление..."
+
+#. #define PSEUDO_INLINE_ALTS_OFF
+#: LYMessages.c:254
+msgid "Inlines without an ALT string specified will be ignored! Reloading..."
+msgstr "ВнутриÑтрочные Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð±ÐµÐ· атрибута ALT будут игнорироватьÑÑ! Обновление..."
+
+#: LYMessages.c:255
+msgid "Raw 8-bit or CJK mode toggled OFF! Reloading..."
+msgstr "Ðеобработанный 8-битный или CJK-режим ВЫКЛЮЧЕÐ! Обновление..."
+
+#: LYMessages.c:256
+msgid "Raw 8-bit or CJK mode toggled ON! Reloading..."
+msgstr "Ðеобработанный 8-битный или CJK-режим ВКЛЮЧЕÐ! Обновление..."
+
+#. #define HEAD_D_L_OR_CANCEL
+#: LYMessages.c:258
+msgid "Send HEAD request for D)ocument or L)ink, or C)ancel? (d,l,c): "
+msgstr "ПоÑлать Ð·Ð°Ð¿Ñ€Ð¾Ñ HEAD Ð´Ð»Ñ D)документа или L)ÑÑылки, или C)Отменить? (d,l,c): "
+
+#. #define HEAD_D_OR_CANCEL
+#: LYMessages.c:260
+msgid "Send HEAD request for D)ocument, or C)ancel? (d,c): "
+msgstr "ПоÑлать Ð·Ð°Ð¿Ñ€Ð¾Ñ HEAD Ð´Ð»Ñ D)документа, или C)отменить? (d,c): "
+
+#: LYMessages.c:261
+msgid "Sorry, the document is not an http URL."
+msgstr "Извините, документ не ÑвлÑетÑÑ http URL."
+
+#: LYMessages.c:262
+msgid "Sorry, the link is not an http URL."
+msgstr "Извините, ÑÑылка не ÑвлÑетÑÑ http URL."
+
+#: LYMessages.c:263
+msgid "Sorry, the ACTION for this form is disabled."
+msgstr "Извините, ДЕЙСТВИЕ Ð´Ð»Ñ Ñтой формы отключено."
+
+#. #define FORM_ACTION_NOT_HTTP_URL
+#: LYMessages.c:265
+msgid "Sorry, the ACTION for this form is not an http URL."
+msgstr "Извините, ДЕЙСТВИЕ Ð´Ð»Ñ Ñтой формы не ÑвлÑетÑÑ http URL."
+
+#: LYMessages.c:266
+msgid "Not an http URL or form ACTION!"
+msgstr "Ðе http URL или ДЕЙСТВИЕ формы!"
+
+#: LYMessages.c:267
+msgid "This special URL cannot be a form ACTION!"
+msgstr "Этот Ñпециальный URL не может быть ДЕЙСТВИЕМ формы!"
+
+#: LYMessages.c:268
+msgid "URL is not in starting realm!"
+msgstr "URL находитÑÑ Ð²Ð½Ðµ начальной облаÑти!"
+
+#: LYMessages.c:269
+msgid "News posting is disabled!"
+msgstr "ПоÑылка новоÑтей запрещена!"
+
+#: LYMessages.c:270
+msgid "File management support is disabled!"
+msgstr "Поддержка работы Ñ Ñ„Ð°Ð¹Ð»Ð°Ð¼Ð¸ отключена!"
+
+#: LYMessages.c:271
+msgid "No jump file is currently available."
+msgstr "Ð’ данный момент нет доÑтупного файла переходов."
+
+#: LYMessages.c:272
+msgid "Jump to (use '?' for list): "
+msgstr "Перейти к (иÑпользуйте '?' Ð´Ð»Ñ ÑпиÑка): "
+
+#: LYMessages.c:273
+msgid "Jumping to a shortcut URL is disallowed!"
+msgstr "Переход по Ñокращенному URL запрещен!"
+
+#: LYMessages.c:274
+msgid "Random URL is disallowed! Use a shortcut."
+msgstr "Случайные URL запрещены! ИÑпользуйте Ñокращение."
+
+#: LYMessages.c:275
+msgid "No random URLs have been used thus far."
+msgstr "Случайные URL до Ñих пор не иÑпользовалиÑÑŒ."
+
+#: LYMessages.c:276
+msgid "Bookmark features are currently disabled."
+msgstr "Закладки ÑÐµÐ¹Ñ‡Ð°Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ñ‹."
+
+#: LYMessages.c:277
+msgid "Execution via bookmarks is disabled."
+msgstr "Выполнение через закладки отключено."
+
+#. #define BOOKMARK_FILE_NOT_DEFINED
+#: LYMessages.c:279
+#, c-format
+msgid "Bookmark file is not defined. Use %s to see options."
+msgstr "Файл закладок не определен. ИÑпользуйте %s Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра опций."
+
+#. #define NO_TEMP_FOR_HOTLIST
+#: LYMessages.c:281
+msgid "Unable to open tempfile for X Mosaic hotlist conversion."
+msgstr "Ðевозможно открыть временный файл Ð´Ð»Ñ Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð°ÐºÐ»Ð°Ð´Ð¾Ðº X Mosaic."
+
+#: LYMessages.c:282
+msgid "ERROR - unable to open bookmark file."
+msgstr "ОШИБКР- невозможно открыть файл закладок."
+
+#. #define BOOKMARK_OPEN_FAILED_FOR_DEL
+#: LYMessages.c:284
+msgid "Unable to open bookmark file for deletion of link."
+msgstr "Ðевозможно открыть файл закладок Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ ÑÑылки."
+
+#. #define BOOKSCRA_OPEN_FAILED_FOR_DEL
+#: LYMessages.c:286
+msgid "Unable to open scratch file for deletion of link."
+msgstr "Ðевозможно открыть рабочий файл Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ ÑÑылки."
+
+#: LYMessages.c:288
+msgid "Error renaming scratch file."
+msgstr "Ошибка Ð¿ÐµÑ€ÐµÐ¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ€Ð°Ð±Ð¾Ñ‡ÐµÐ³Ð¾ файла."
+
+#: LYMessages.c:290
+msgid "Error renaming temporary file."
+msgstr "Ошибка Ð¿ÐµÑ€ÐµÐ¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ð¾Ð³Ð¾ файла."
+
+#. #define BOOKTEMP_COPY_FAIL
+#: LYMessages.c:292
+msgid "Unable to copy temporary file for deletion of link."
+msgstr "Ðевозможно Ñкопировать временный файл Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ ÑÑылки."
+
+#. #define BOOKTEMP_REOPEN_FAIL_FOR_DEL
+#: LYMessages.c:294
+msgid "Unable to reopen temporary file for deletion of link."
+msgstr "Ðевозможно заново открыть временный файл Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ ÑÑылки."
+
+#. #define BOOKMARK_LINK_NOT_ONE_LINE
+#: LYMessages.c:297
+msgid "Link is not by itself all on one line in bookmark file."
+msgstr "СÑылка не находитÑÑ Ñ†ÐµÐ»Ð¸ÐºÐ¾Ð¼ на одной Ñтроке файла закладок."
+
+#: LYMessages.c:298
+msgid "Bookmark deletion failed."
+msgstr "Ошибка при удалении закладки."
+
+#. #define BOOKMARKS_NOT_TRAVERSED
+#: LYMessages.c:300
+msgid "Bookmark files cannot be traversed (only http URLs)."
+msgstr "Прохождение по файлам закладок невозможно (только по http URL)."
+
+#. #define BOOKMARKS_NOT_OPEN
+#: LYMessages.c:302
+msgid "Unable to open bookmark file, use 'a' to save a link first"
+msgstr "Ðевозможно открыть файл закладок, Ñначала иÑпользуйте 'a' Ð´Ð»Ñ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ ÑÑылки"
+
+#: LYMessages.c:303
+msgid "There are no links in this bookmark file!"
+msgstr "Ð’ Ñтом файле закладок нет ÑÑылок!"
+
+#. #define CACHE_D_OR_CANCEL
+#: LYMessages.c:305
+#, fuzzy
+#| msgid "Send HEAD request for D)ocument, or C)ancel? (d,c): "
+msgid "D)elete cached document or C)ancel? (d,c): "
+msgstr "ПоÑлать Ð·Ð°Ð¿Ñ€Ð¾Ñ HEAD Ð´Ð»Ñ D)документа, или C)отменить? (d,c): "
+
+#. #define BOOK_D_L_OR_CANCEL
+#: LYMessages.c:307
+msgid "Save D)ocument or L)ink to bookmark file or C)ancel? (d,l,c): "
+msgstr "Сохранить D)документ или L)ÑÑылку в файл закладок или C)отменить? (d,l,c): "
+
+#: LYMessages.c:308
+msgid "Save D)ocument to bookmark file or C)ancel? (d,c): "
+msgstr "Сохранить D)документ в файл закладок или C)отменить? (d,c): "
+
+#: LYMessages.c:309
+msgid "Save L)ink to bookmark file or C)ancel? (l,c): "
+msgstr "Сохранить L)ÑÑылку в файл закладок или C)отменить? (l,c): "
+
+#. #define NOBOOK_POST_FORM
+#: LYMessages.c:311
+msgid "Documents from forms with POST content cannot be saved as bookmarks."
+msgstr "Документы из форм Ñ Ñодержимым POST не могут быть Ñохранены как закладки."
+
+#: LYMessages.c:312
+msgid "Cannot save form fields/links"
+msgstr "Ðевозможно Ñохранить полÑ/ÑÑылки формы"
+
+#. #define NOBOOK_HSML
+#: LYMessages.c:314
+msgid "History, showinfo, menu and list files cannot be saved as bookmarks."
+msgstr "ИÑториÑ, информациÑ, меню и файлы ÑпиÑков не могут быть Ñохранены как закладки."
+
+#. #define CONFIRM_BOOKMARK_DELETE
+#: LYMessages.c:316
+msgid "Do you really want to delete this link from your bookmark file?"
+msgstr "Ð’Ñ‹ дейÑтвительно хотите удалить Ñту ÑÑылку из файла закладок?"
+
+#: LYMessages.c:317
+msgid "Malformed address."
+msgstr "Ðеправильно Ñформированный адреÑ."
+
+#. #define HISTORICAL_ON_MINIMAL_OFF
+#: LYMessages.c:319
+msgid "Historical comment parsing ON (Minimal is overridden)!"
+msgstr "ИÑторичеÑкий ÑпоÑоб разбора комментариев ВКЛЮЧЕР(замещает Минимальный)!"
+
+#. #define HISTORICAL_OFF_MINIMAL_ON
+#: LYMessages.c:321
+msgid "Historical comment parsing OFF (Minimal is in effect)!"
+msgstr "ИÑторичеÑкий ÑпоÑоб разбора комментариев ВЫКЛЮЧЕР(Минимальный дейÑтвует)!"
+
+#. #define HISTORICAL_ON_VALID_OFF
+#: LYMessages.c:323
+msgid "Historical comment parsing ON (Valid is overridden)!"
+msgstr "ИÑторичеÑкий ÑпоÑоб разбора комментариев ВКЛЮЧЕР(замещает Правильный)!"
+
+#. #define HISTORICAL_OFF_VALID_ON
+#: LYMessages.c:325
+msgid "Historical comment parsing OFF (Valid is in effect)!"
+msgstr "ИÑторичеÑкий ÑпоÑоб разбора комментариев ВЫКЛЮЧЕР(Правильный дейÑтвует)!"
+
+#. #define MINIMAL_ON_IN_EFFECT
+#: LYMessages.c:327
+msgid "Minimal comment parsing ON (and in effect)!"
+msgstr "Минимальный ÑпоÑоб разбора комментариев ВКЛЮЧЕР(и дейÑтвует)!"
+
+#. #define MINIMAL_OFF_VALID_ON
+#: LYMessages.c:329
+msgid "Minimal comment parsing OFF (Valid is in effect)!"
+msgstr "Минимальный ÑпоÑоб разбора комментариев ВЫКЛЮЧЕР(Правильный дейÑтвует)!"
+
+#. #define MINIMAL_ON_BUT_HISTORICAL
+#: LYMessages.c:331
+msgid "Minimal comment parsing ON (but Historical is in effect)!"
+msgstr "Минимальный ÑпоÑоб разбора комментариев ВКЛЮЧЕР(но ИÑторичеÑкий дейÑтвует)!"
+
+#. #define MINIMAL_OFF_HISTORICAL_ON
+#: LYMessages.c:333
+msgid "Minimal comment parsing OFF (Historical is in effect)!"
+msgstr "Минимальный ÑпоÑоб разбора комментариев ВЫКЛЮЧЕР(ИÑторичеÑкий дейÑтвует)!"
+
+#: LYMessages.c:334
+msgid "Soft double-quote parsing ON!"
+msgstr "ÐœÑгкий разбор двойных кавычек ВКЛЮЧЕÐ!"
+
+#: LYMessages.c:335
+msgid "Soft double-quote parsing OFF!"
+msgstr "ÐœÑгкий разбор двойных кавычек ВЫКЛЮЧЕÐ!"
+
+#: LYMessages.c:336
+msgid "Now using TagSoup parsing of HTML."
+msgstr "Теперь иÑпользуетÑÑ Ð¼ÐµÑ‚Ð¾Ð´ TagSoup разбора HTML."
+
+#: LYMessages.c:337
+msgid "Now using SortaSGML parsing of HTML!"
+msgstr "Теперь иÑпользуетÑÑ Ð¼ÐµÑ‚Ð¾Ð´ SortaSGML разбора HTML!"
+
+#: LYMessages.c:338
+msgid "You are already at the end of this document."
+msgstr "Ð’Ñ‹ уже находитеÑÑŒ в конце Ñтого документа."
+
+#: LYMessages.c:339
+msgid "You are already at the beginning of this document."
+msgstr "Ð’Ñ‹ уже находитеÑÑŒ в начале Ñтого документа."
+
+#: LYMessages.c:340
+#, c-format
+msgid "You are already at page %d of this document."
+msgstr "Ð’Ñ‹ уже находитеÑÑŒ на Ñтранице %d Ñтого документа."
+
+#: LYMessages.c:341
+#, c-format
+msgid "Link number %d already is current."
+msgstr "СÑылка номер %d уже ÑвлÑетÑÑ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ¹."
+
+#: LYMessages.c:342
+msgid "You are already at the first document"
+msgstr "Ð’Ñ‹ уже находитеÑÑŒ на первом документе"
+
+#: LYMessages.c:343
+msgid "There are no links above this line of the document."
+msgstr "Выше Ñтой Ñтроки документа ÑÑылок нет."
+
+#: LYMessages.c:344
+msgid "There are no links below this line of the document."
+msgstr "Ðиже Ñтой Ñтроки документа ÑÑылок нет."
+
+#. #define MAXLEN_REACHED_DEL_OR_MOV
+#: LYMessages.c:346
+msgid "Maximum length reached! Delete text or move off field."
+msgstr "МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° доÑтигнута! Удалите текÑÑ‚ или выйдете Ñ Ð¿Ð¾Ð»Ñ."
+
+#. #define NOT_ON_SUBMIT_OR_LINK
+#: LYMessages.c:348
+msgid "You are not on a form submission button or normal link."
+msgstr "Ð’Ñ‹ находитеÑÑŒ не на кнопке поÑылки формы или обычной ÑÑылке."
+
+#. #define NEED_CHECKED_RADIO_BUTTON
+#: LYMessages.c:350
+msgid "One radio button must be checked at all times!"
+msgstr "Ð’Ñе Ð²Ñ€ÐµÐ¼Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° быть выбрана одна завиÑÐ¸Ð¼Ð°Ñ ÐºÐ½Ð¾Ð¿ÐºÐ°!"
+
+#: LYMessages.c:351
+msgid "No submit button for this form, submit single text field?"
+msgstr "Ð’ Ñтой форме нет кнопки поÑылки, поÑлать одно текÑтовое поле?"
+
+#: LYMessages.c:352
+msgid "Do you want to go back to the previous document?"
+msgstr "Ð’Ñ‹ хотите вернутьÑÑ Ð½Ð°Ð·Ð°Ð´ к предыдущему документу?"
+
+#: LYMessages.c:353
+msgid "Use arrows or tab to move off of field."
+msgstr "ИÑпользуйте Ñтрелки или tab Ð´Ð»Ñ Ð²Ñ‹Ñ…Ð¾Ð´Ð° из полÑ."
+
+#. #define ENTER_TEXT_ARROWS_OR_TAB
+#: LYMessages.c:355
+msgid "Enter text. Use arrows or tab to move off of field."
+msgstr "Введите текÑÑ‚. ИÑпользуйте Ñтрелки или tab Ð´Ð»Ñ Ð²Ñ‹Ñ…Ð¾Ð´Ð° из полÑ."
+
+#: LYMessages.c:356
+msgid "** Bad HTML!! No form action defined. **"
+msgstr "** Плохой HTML!! Ðе определено дейÑтвие формы. **"
+
+#: LYMessages.c:357
+msgid "Bad HTML!! Unable to create popup window!"
+msgstr "Плохой HTML!! Ðевозможно Ñоздать вÑплывающее окно!"
+
+#: LYMessages.c:358
+msgid "Unable to create popup window!"
+msgstr "Ðевозможно Ñоздать вÑплывающее окно!"
+
+#: LYMessages.c:359
+msgid "Goto a random URL is disallowed!"
+msgstr "Переход к Ñлучайному URL запрещен!"
+
+#: LYMessages.c:360
+msgid "Goto a non-http URL is disallowed!"
+msgstr "Переход к не-http URL запрещен!"
+
+#: LYMessages.c:361
+#, c-format
+msgid "You are not allowed to goto \"%s\" URLs"
+msgstr "Вам не разрешено переходить к \"%s\" URLs"
+
+#: LYMessages.c:362
+msgid "URL to open: "
+msgstr "Открыть URL: "
+
+#: LYMessages.c:363
+msgid "Edit the current Goto URL: "
+msgstr "Редактирование текущего URL Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÑ…Ð¾Ð´Ð°: "
+
+#: LYMessages.c:364
+msgid "Edit the previous Goto URL: "
+msgstr "Редактирование предыдущего URL Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÑ…Ð¾Ð´Ð°: "
+
+#: LYMessages.c:365
+msgid "Edit a previous Goto URL: "
+msgstr "Редактирование предыдущего URL Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÑ…Ð¾Ð´Ð°: "
+
+#: LYMessages.c:366
+msgid "Current document has POST data."
+msgstr "Текущий документ имеет POST-данные."
+
+#: LYMessages.c:367
+msgid "Edit this document's URL: "
+msgstr "Редактирование URL Ñтого документа: "
+
+#: LYMessages.c:368
+msgid "Edit the current link's URL: "
+msgstr "Редактирование URL текущей ÑÑылки: "
+
+#: LYMessages.c:369
+#, fuzzy
+#| msgid "Edit this document's URL: "
+msgid "Edit the form's submit-URL: "
+msgstr "Редактирование URL Ñтого документа: "
+
+#: LYMessages.c:370
+msgid "You cannot edit File Management URLs"
+msgstr "Ð’Ñ‹ не можете редактировать URL Работы Ñ Ð¤Ð°Ð¹Ð»Ð°Ð¼Ð¸"
+
+#: LYMessages.c:371
+msgid "Enter a database query: "
+msgstr "Введите Ð·Ð°Ð¿Ñ€Ð¾Ñ Ðº базе данных: "
+
+#: LYMessages.c:372
+msgid "Enter a whereis query: "
+msgstr "Введите Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° поиÑк: "
+
+#: LYMessages.c:373
+msgid "Edit the current query: "
+msgstr "Отредактируйте текущий запроÑ: "
+
+#: LYMessages.c:374
+msgid "Edit the previous query: "
+msgstr "Отредактируйте предыдущий запроÑ: "
+
+#: LYMessages.c:375
+msgid "Edit a previous query: "
+msgstr "Отредактируйте предыдущий запроÑ: "
+
+#. #define USE_C_R_TO_RESUB_CUR_QUERY
+#: LYMessages.c:377
+msgid "Use Control-R to resubmit the current query."
+msgstr "ИÑпользуйте Control-R, чтобы поÑлать заново текущий запроÑ."
+
+#: LYMessages.c:378
+msgid "Edit the current shortcut: "
+msgstr "Отредактируйте текущее Ñокращение: "
+
+#: LYMessages.c:379
+msgid "Edit the previous shortcut: "
+msgstr "Отредактируйте предыдущее Ñокращение: "
+
+#: LYMessages.c:380
+msgid "Edit a previous shortcut: "
+msgstr "Отредактируйте предыдущее Ñокращение: "
+
+#: LYMessages.c:381
+#, c-format
+msgid "Key '%c' is not mapped to a jump file!"
+msgstr "Ключ '%c' не отображаетÑÑ Ð² файл переходов!"
+
+#: LYMessages.c:382
+msgid "Cannot locate jump file!"
+msgstr "Ðе удаетÑÑ Ð¾Ð±Ð½Ð°Ñ€ÑƒÐ¶Ð¸Ñ‚ÑŒ файл переходов!"
+
+#: LYMessages.c:383
+msgid "Cannot open jump file!"
+msgstr "Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ файл переходов!"
+
+#: LYMessages.c:384
+msgid "Error reading jump file!"
+msgstr "Ошибка Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° переходов!"
+
+#: LYMessages.c:385
+msgid "Out of memory reading jump file!"
+msgstr "Ðе хватает памÑти Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° переходов!"
+
+#: LYMessages.c:386
+msgid "Out of memory reading jump table!"
+msgstr "Ðе хватает памÑти Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹ переходов!"
+
+#: LYMessages.c:387
+msgid "No index is currently available."
+msgstr "Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð½ÐµÑ‚ доÑтупного индекÑа."
+
+#. #define CONFIRM_MAIN_SCREEN
+#: LYMessages.c:389
+msgid "Do you really want to go to the Main screen?"
+msgstr "Ð’Ñ‹ дейÑтвительно хотите перейти к Главному Ñкрану?"
+
+#: LYMessages.c:390
+msgid "You are already at main screen!"
+msgstr "Ð’Ñ‹ уже находитеÑÑŒ на главном Ñкране!"
+
+#. #define NOT_ISINDEX
+#: LYMessages.c:392
+msgid "Not a searchable indexed document -- press '/' to search for a text string"
+msgstr "Ðе поиÑковый индекÑированный документ - нажмите '/' Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка по Ñтроке текÑта"
+
+#. #define NO_OWNER
+#: LYMessages.c:394
+msgid "No owner is defined for this file so you cannot send a comment"
+msgstr "Ð”Ð»Ñ Ñтого файла не определен владелец, так что вы не можете поÑлать комментарий"
+
+#: LYMessages.c:395
+#, c-format
+msgid "No owner is defined. Use %s?"
+msgstr "Владелец не определен. ИÑпользуйте %s?"
+
+#: LYMessages.c:396
+msgid "Do you wish to send a comment?"
+msgstr "Ð’Ñ‹ хотите поÑлать комментарий?"
+
+#: LYMessages.c:397
+msgid "Mail is disallowed so you cannot send a comment"
+msgstr "Почта запрещена, так что вы не можете поÑлать комментарий"
+
+#: LYMessages.c:398
+msgid "The 'e'dit command is currently disabled."
+msgstr "Команда e)Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÑÐµÐ¹Ñ‡Ð°Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð°."
+
+#: LYMessages.c:399
+msgid "External editing is currently disabled."
+msgstr "Внешнее редактирование ÑÐµÐ¹Ñ‡Ð°Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¾."
+
+#: LYMessages.c:400
+msgid "System error - failure to get status."
+msgstr "СиÑÑ‚ÐµÐ¼Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° - не удаетÑÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒ ÑтатуÑ."
+
+#: LYMessages.c:401
+msgid "No editor is defined!"
+msgstr "Редактор не определен!"
+
+#: LYMessages.c:402
+msgid "The 'p'rint command is currently disabled."
+msgstr "Команда p)печати ÑÐµÐ¹Ñ‡Ð°Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð°."
+
+#: LYMessages.c:403
+msgid "Document has no Toolbar links or Banner."
+msgstr "Документ не имеет ÑÑылок Toolbar или Banner."
+
+#: LYMessages.c:404
+msgid "Unable to open traversal file."
+msgstr "Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ файл прохождениÑ."
+
+#: LYMessages.c:405
+msgid "Unable to open traversal found file."
+msgstr ""
+
+#: LYMessages.c:406
+msgid "Unable to open reject file."
+msgstr ""
+
+#: LYMessages.c:407
+msgid "Unable to open traversal errors output file"
+msgstr ""
+
+#: LYMessages.c:408
+msgid "TRAVERSAL WAS INTERRUPTED"
+msgstr "ПОХОЖДЕÐИЕ ПРЕРВÐÐО"
+
+#: LYMessages.c:409
+msgid "Follow link (or goto link or page) number: "
+msgstr "Переход по ÑÑылке (или к ÑÑылке или Ñтранице) Ñ Ð½Ð¾Ð¼ÐµÑ€Ð¾Ð¼: "
+
+#: LYMessages.c:410
+msgid "Select option (or page) number: "
+msgstr "Выберите номер опции (или Ñтраницы): "
+
+#: LYMessages.c:411
+#, c-format
+msgid "Option number %d already is current."
+msgstr "ÐžÐ¿Ñ†Ð¸Ñ Ð½Ð¾Ð¼ÐµÑ€ %d уже ÑвлÑетÑÑ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ¹."
+
+#. #define ALREADY_AT_OPTION_END
+#: LYMessages.c:413
+msgid "You are already at the end of this option list."
+msgstr "Ð’Ñ‹ уже находитеÑÑŒ в конце Ñтого ÑпиÑка опций."
+
+#. #define ALREADY_AT_OPTION_BEGIN
+#: LYMessages.c:415
+msgid "You are already at the beginning of this option list."
+msgstr "Ð’Ñ‹ уже находитеÑÑŒ в начале Ñтого ÑпиÑка опций."
+
+#. #define ALREADY_AT_OPTION_PAGE
+#: LYMessages.c:417
+#, c-format
+msgid "You are already at page %d of this option list."
+msgstr "Ð’Ñ‹ уже находитеÑÑŒ на Ñтранице %d Ñтого ÑпиÑка опций."
+
+#: LYMessages.c:418
+msgid "You have entered an invalid option number."
+msgstr "Вы ввели неверный номер опции."
+
+#: LYMessages.c:419
+msgid "** Bad HTML!! Use -trace to diagnose. **"
+msgstr "** Плохой HTML!! Ð”Ð»Ñ Ð´Ð¸Ð°Ð³Ð½Ð¾Ñтики иÑпользуйте -trace. **"
+
+#: LYMessages.c:420
+msgid "Give name of file to save in"
+msgstr "Задайте Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи"
+
+#: LYMessages.c:421
+msgid "Can't save data to file -- please run WWW locally"
+msgstr "Ðе удаетÑÑ Ð·Ð°Ð¿Ð¸Ñать данные в файл -- пожалуйÑта, запуÑтите WWW локально"
+
+#: LYMessages.c:422
+msgid "Can't open temporary file!"
+msgstr "Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ временный файл!"
+
+#: LYMessages.c:423
+msgid "Can't open output file! Cancelling!"
+msgstr "Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ выходной файл! Отмена!"
+
+#: LYMessages.c:424
+msgid "Execution is disabled."
+msgstr "Выполнение отключено."
+
+#. #define EXECUTION_DISABLED_FOR_FILE
+#: LYMessages.c:426
+#, c-format
+msgid "Execution is not enabled for this file. See the Options menu (use %s)."
+msgstr "Выполнение Ð´Ð»Ñ Ñтого файла отключено. См. меню Опций (иÑпользуйте %s)."
+
+#. #define EXECUTION_NOT_COMPILED
+#: LYMessages.c:428
+msgid "Execution capabilities are not compiled into this version."
+msgstr "ВозможноÑти Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð½Ðµ включены в Ñту верÑию."
+
+#: LYMessages.c:429
+msgid "This file cannot be displayed on this terminal."
+msgstr "Этот файл не может быть отображен на данном терминале."
+
+#. #define CANNOT_DISPLAY_FILE_D_OR_C
+#: LYMessages.c:431
+msgid "This file cannot be displayed on this terminal: D)ownload, or C)ancel"
+msgstr "Этот файл не может быть отображен на данном терминале: D)загрузить или C)отменить"
+
+#: LYMessages.c:432
+#, c-format
+msgid "%s D)ownload, or C)ancel"
+msgstr "%s D)Ñкачать или C)отменить"
+
+#: LYMessages.c:433
+msgid "Cancelling file."
+msgstr "Отмена файла."
+
+#: LYMessages.c:434
+msgid "Retrieving file. - PLEASE WAIT -"
+msgstr "Получение файла. - ПОЖÐЛУЙСТÐ, ПОДОЖДИТЕ -"
+
+#: LYMessages.c:435
+msgid "Enter a filename: "
+msgstr "Введите Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°: "
+
+#: LYMessages.c:436
+msgid "Edit the previous filename: "
+msgstr "Редактирование предыдущего имени файла: "
+
+#: LYMessages.c:437
+msgid "Edit a previous filename: "
+msgstr "Редактирование предыдущего имени файла: "
+
+#: LYMessages.c:438
+msgid "Enter a new filename: "
+msgstr "Введите новое Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°: "
+
+#: LYMessages.c:439
+msgid "File name may not begin with a dot."
+msgstr "Ð˜Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° не может начинатьÑÑ Ñ Ñ‚Ð¾Ñ‡ÐºÐ¸."
+
+#: LYMessages.c:441
+msgid "File exists. Create higher version?"
+msgstr "Файл ÑущеÑтвует. Создать еще одну верÑию?"
+
+#: LYMessages.c:443
+msgid "File exists. Overwrite?"
+msgstr "Файл ÑущеÑтвует. ПерезапиÑать?"
+
+#: LYMessages.c:445
+msgid "Cannot write to file."
+msgstr "Ðе удаетÑÑ Ð·Ð°Ð¿Ð¸Ñать в файл."
+
+#: LYMessages.c:446
+msgid "ERROR! - download command is misconfigured."
+msgstr "ОШИБКÐ! - команда ÑÐºÐ°Ñ‡Ð¸Ð²Ð°Ð½Ð¸Ñ Ð½ÐµÐ¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð¾ Ñконфигурирована."
+
+#: LYMessages.c:447
+msgid "Unable to download file."
+msgstr "Ðе удаетÑÑ Ñкачать файл."
+
+#: LYMessages.c:448
+msgid "Reading directory..."
+msgstr "Чтение каталога..."
+
+#: LYMessages.c:449
+msgid "Building directory listing..."
+msgstr "ПоÑтроение ÑпиÑка каталога..."
+
+#: LYMessages.c:450
+msgid "Saving..."
+msgstr "Сохранение..."
+
+#: LYMessages.c:451
+#, c-format
+msgid "Could not edit file '%s'."
+msgstr "Ðе удаетÑÑ Ð¾Ñ‚Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ файл '%s'."
+
+#: LYMessages.c:452
+msgid "Unable to access document!"
+msgstr "Ошибка доÑтупа к документу!"
+
+#: LYMessages.c:453
+msgid "Could not access file."
+msgstr "Ошибка доÑтупа к файлу."
+
+#: LYMessages.c:454
+msgid "Could not access directory."
+msgstr "Ошибка доÑтупа к каталогу."
+
+#: LYMessages.c:455
+msgid "Could not load data."
+msgstr "Ðе удаетÑÑ Ð·Ð°Ð³Ñ€ÑƒÐ·Ð¸Ñ‚ÑŒ данные."
+
+#. #define CANNOT_EDIT_REMOTE_FILES
+#: LYMessages.c:457
+msgid "Lynx cannot currently (e)dit remote WWW files."
+msgstr "Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Lynx не может e)редактировать удаленные WWW файлы."
+
+#. #define CANNOT_EDIT_FIELD
+#: LYMessages.c:459
+msgid "This field cannot be (e)dited with an external editor."
+msgstr "Это поле не может быть e)отредактировано Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ внешнего редактора."
+
+#: LYMessages.c:460
+msgid "Bad rule"
+msgstr "Плохое правило"
+
+#: LYMessages.c:461
+msgid "Insufficient operands:"
+msgstr "ÐедоÑтаточно операндов:"
+
+#: LYMessages.c:462
+msgid "You are not authorized to edit this file."
+msgstr "У Ð²Ð°Ñ Ð½ÐµÑ‚ полномочий Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñтого файла."
+
+#: LYMessages.c:463
+msgid "Title: "
+msgstr "Заголовок: "
+
+#: LYMessages.c:464
+msgid "Subject: "
+msgstr "Тема: "
+
+#: LYMessages.c:465
+msgid "Username: "
+msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ: "
+
+#: LYMessages.c:466
+msgid "Password: "
+msgstr "Пароль: "
+
+#: LYMessages.c:467
+msgid "lynx: Username and Password required!!!"
+msgstr "lynx: требуютÑÑ Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸ Пароль!!!"
+
+#: LYMessages.c:468
+msgid "lynx: Password required!!!"
+msgstr "lynx: требуетÑÑ ÐŸÐ°Ñ€Ð¾Ð»ÑŒ!!!"
+
+#: LYMessages.c:469
+msgid "Clear all authorization info for this session?"
+msgstr "ОчиÑтить вÑÑŽ информацию о полномочиÑÑ… Ð´Ð»Ñ Ñтого ÑеанÑа?"
+
+#: LYMessages.c:470
+msgid "Authorization info cleared."
+msgstr "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ полномочиÑÑ… очищена."
+
+#: LYMessages.c:471
+msgid "Authorization failed. Retry?"
+msgstr "ÐÐµÑƒÐ´Ð°Ñ‡Ð½Ð°Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ° полномочий. Повторить?"
+
+#: LYMessages.c:472
+msgid "cgi support has been disabled."
+msgstr "поддержка cgi была отключена."
+
+#. #define CGI_NOT_COMPILED
+#: LYMessages.c:474
+msgid "Lynxcgi capabilities are not compiled into this version."
+msgstr "ВозможноÑти lynxcgi не Ñкомпилированы в Ñтой верÑии."
+
+#: LYMessages.c:475
+#, c-format
+msgid "Sorry, no known way of converting %s to %s."
+msgstr "Извините, нет извеÑтного ÑпоÑоба Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ %s в %s."
+
+#: LYMessages.c:476
+msgid "Unable to set up connection."
+msgstr "Ðе удаетÑÑ Ð¿Ð¾Ð´Ð³Ð¾Ñ‚Ð¾Ð²Ð¸Ñ‚ÑŒ Ñоединение."
+
+#: LYMessages.c:477
+msgid "Unable to make connection"
+msgstr "Ðе удаетÑÑ ÑƒÑтановить Ñоединение"
+
+#. #define MALFORMED_EXEC_REQUEST
+#: LYMessages.c:479
+msgid "Executable link rejected due to malformed request."
+msgstr "ВыполнÑÐµÐ¼Ð°Ñ ÑÑылка отвергнута из-за неправильно Ñформированного запроÑа."
+
+#. #define BADCHAR_IN_EXEC_LINK
+#: LYMessages.c:481
+#, c-format
+msgid "Executable link rejected due to `%c' character."
+msgstr "ВыполнÑÐµÐ¼Ð°Ñ ÑÑылка отвергнута из-за Ñимвола `%c'."
+
+#. #define RELPATH_IN_EXEC_LINK
+#: LYMessages.c:483
+msgid "Executable link rejected due to relative path string ('../')."
+msgstr "ВыполнÑÐµÐ¼Ð°Ñ ÑÑылка отвергнута из-за Ñтроки отноÑительного пути ('../')."
+
+#. #define BADLOCPATH_IN_EXEC_LINK
+#: LYMessages.c:485
+msgid "Executable link rejected due to location or path."
+msgstr "ВыполнÑÐµÐ¼Ð°Ñ ÑÑылка отвергнута из-за адреÑа или пути."
+
+#: LYMessages.c:486
+msgid "Mail access is disabled!"
+msgstr "ДоÑтуп к почте отключен!"
+
+#. #define ACCESS_ONLY_LOCALHOST
+#: LYMessages.c:488
+msgid "Only files and servers on the local host can be accessed."
+msgstr "ДоÑтупны только файлы и Ñерверы на локальном компьютере."
+
+#: LYMessages.c:489
+msgid "Telnet access is disabled!"
+msgstr "ДоÑтуп к telnet запрещен!"
+
+#. #define TELNET_PORT_SPECS_DISABLED
+#: LYMessages.c:491
+msgid "Telnet port specifications are disabled."
+msgstr "Спецификации порта Ð´Ð»Ñ telnet запрещены."
+
+#: LYMessages.c:492
+msgid "USENET news access is disabled!"
+msgstr "ДоÑтуп к новоÑÑ‚Ñм USENET запрещен!"
+
+#: LYMessages.c:493
+msgid "Rlogin access is disabled!"
+msgstr "ДоÑтуп к rlogin запрещен!"
+
+#: LYMessages.c:494
+msgid "Ftp access is disabled!"
+msgstr "ДоÑтуп к ftp запрещен!"
+
+#: LYMessages.c:495
+msgid "There are no references from this document."
+msgstr "Из Ñтого документа нет ÑÑылок."
+
+#: LYMessages.c:496
+msgid "There are only hidden links from this document."
+msgstr "Ð’ Ñтом документе еÑÑ‚ÑŒ только Ñкрытые ÑÑылки."
+
+#: LYMessages.c:498
+msgid "Unable to open command file."
+msgstr "Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ командный файл."
+
+#: LYMessages.c:500
+msgid "News Post Cancelled!!!"
+msgstr "ПоÑылка новоÑтей прервана!!!"
+
+#. #define SPAWNING_EDITOR_FOR_NEWS
+#: LYMessages.c:502
+msgid "Spawning your selected editor to edit news message"
+msgstr "ЗапуÑк выбранного вами редактора Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ñтей"
+
+#: LYMessages.c:503
+msgid "Post this message?"
+msgstr "ПоÑлать Ñто Ñообщение?"
+
+#: LYMessages.c:504
+#, c-format
+msgid "Append '%s'?"
+msgstr "Добавить '%s'?"
+
+#: LYMessages.c:505
+msgid "Posting to newsgroup(s)..."
+msgstr "ПоÑылка в группы новоÑтей..."
+
+#: LYMessages.c:507
+msgid "*** You have unread mail. ***"
+msgstr "*** У Ð²Ð°Ñ ÐµÑÑ‚ÑŒ Ð½ÐµÐ¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ð°Ñ Ð¿Ð¾Ñ‡Ñ‚Ð°. ***"
+
+#: LYMessages.c:509
+msgid "*** You have mail. ***"
+msgstr "*** У Ð²Ð°Ñ ÐµÑÑ‚ÑŒ почта. ***"
+
+#: LYMessages.c:511
+msgid "*** You have new mail. ***"
+msgstr "*** У Ð²Ð°Ñ ÐµÑÑ‚ÑŒ Ð½Ð¾Ð²Ð°Ñ Ð¿Ð¾Ñ‡Ñ‚Ð°. ***"
+
+#: LYMessages.c:512
+msgid "File insert cancelled!!!"
+msgstr "Ð’Ñтавка файла отменена!!!"
+
+#: LYMessages.c:513
+msgid "Not enough memory for file!"
+msgstr "Ðе хватает памÑти Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð°!"
+
+#: LYMessages.c:514
+msgid "Can't open file for reading."
+msgstr "Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ файл Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ!"
+
+#: LYMessages.c:515
+msgid "File does not exist."
+msgstr "Файл не ÑущеÑтвует."
+
+#: LYMessages.c:516
+msgid "File does not exist - reenter or cancel:"
+msgstr "Файл не ÑущеÑтвует - введите Ñнова или отмените:"
+
+#: LYMessages.c:517
+msgid "File is not readable."
+msgstr "Файл не доÑтупен на чтение."
+
+#: LYMessages.c:518
+msgid "File is not readable - reenter or cancel:"
+msgstr "Файл не доÑтупен на чтение - введите Ñнова или отмените:"
+
+#: LYMessages.c:519
+msgid "Nothing to insert - file is 0-length."
+msgstr "Ð’ÑтавлÑÑ‚ÑŒ нечего - файл нулевой длины."
+
+#: LYMessages.c:520
+msgid "Save request cancelled!!!"
+msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° Ñохранение отменен!!!"
+
+#: LYMessages.c:521
+msgid "Mail request cancelled!!!"
+msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° поÑылку почты отменен!!!"
+
+#. #define CONFIRM_MAIL_SOURCE_PREPARSED
+#: LYMessages.c:523
+msgid "Viewing preparsed source. Are you sure you want to mail it?"
+msgstr "ПроÑмотр разобранного иÑходного текÑта. Ð’Ñ‹ уверены, что хотите отправить его?"
+
+#: LYMessages.c:524
+msgid "Please wait..."
+msgstr "ПожалуйÑта, подождите..."
+
+#: LYMessages.c:525
+msgid "Mailing file. Please wait..."
+msgstr "ПоÑылка файла по почте. ПожалуйÑта, подождите..."
+
+#: LYMessages.c:526
+msgid "ERROR - Unable to mail file"
+msgstr "ОШИБКР- не удаетÑÑ Ð¿Ð¾Ñлать файл по почте"
+
+#. #define CONFIRM_LONG_SCREEN_PRINT
+#: LYMessages.c:528
+#, c-format
+msgid "File is %d screens long. Are you sure you want to print?"
+msgstr "Файл занимает %d Ñкранов. Ð’Ñ‹ уверены, что хотите его напечатать?"
+
+#: LYMessages.c:529
+msgid "Print request cancelled!!!"
+msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° печать отменен!!!"
+
+#: LYMessages.c:530
+msgid "Press <return> to begin: "
+msgstr "Ðажмите <ввод> Ð´Ð»Ñ Ð½Ð°Ñ‡Ð°Ð»Ð°: "
+
+#: LYMessages.c:531
+msgid "Press <return> to finish: "
+msgstr "Ðажмите <ввод> Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ: "
+
+#. #define CONFIRM_LONG_PAGE_PRINT
+#: LYMessages.c:533
+#, c-format
+msgid "File is %d pages long. Are you sure you want to print?"
+msgstr "Файл занимает %d Ñтраниц. Ð’Ñ‹ уверены, что хотите напечатать?"
+
+#. #define CHECK_PRINTER
+#: LYMessages.c:535
+msgid "Be sure your printer is on-line. Press <return> to start printing:"
+msgstr "УбедитеÑÑŒ, что принтер в режиме on-line. Ðажмите <ввод> Ð´Ð»Ñ Ð½Ð°Ñ‡Ð°Ð»Ð° печати:"
+
+#: LYMessages.c:536
+msgid "ERROR - Unable to allocate file space!!!"
+msgstr "ОШИБКР- не удаетÑÑ Ð²Ñ‹Ð´ÐµÐ»Ð¸Ñ‚ÑŒ меÑто Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð°!!!"
+
+#: LYMessages.c:537
+msgid "Unable to open tempfile"
+msgstr "Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ временный файл"
+
+#: LYMessages.c:538
+msgid "Unable to open print options file"
+msgstr "Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ файл Ñ Ð¾Ð¿Ñ†Ð¸Ñми печати"
+
+#: LYMessages.c:539
+msgid "Printing file. Please wait..."
+msgstr "Печать файла. ПожалуйÑта, подождите..."
+
+#: LYMessages.c:540
+msgid "Please enter a valid internet mail address: "
+msgstr "ПожалуйÑта, введите правильный Ð°Ð´Ñ€ÐµÑ Ñлектронной почты: "
+
+#: LYMessages.c:541
+msgid "ERROR! - printer is misconfigured!"
+msgstr "ОШИБКÐ! - принтер неправильно Ñконфигурирован!"
+
+#: LYMessages.c:542
+msgid "Image map from POST response not available!"
+msgstr "ОтÑутÑтвует Ð½Ð°Ð²Ð¸Ð³Ð°Ñ†Ð¸Ð¾Ð½Ð½Ð°Ñ ÐºÐ°Ñ€Ñ‚Ð° от ответа POST!"
+
+#: LYMessages.c:543
+msgid "Misdirected client-side image MAP request!"
+msgstr ""
+
+#: LYMessages.c:544
+msgid "Client-side image MAP is not accessible!"
+msgstr "КлиентÑÐºÐ°Ñ Ð½Ð°Ð²Ð¸Ð³Ð°Ñ†Ð¸Ð¾Ð½Ð½Ð°Ñ ÐºÐ°Ñ€Ñ‚Ð° недоÑтупна!"
+
+#: LYMessages.c:545
+msgid "No client-side image MAPs are available!"
+msgstr "КлиентÑкие навигационные карты отÑутÑтвуют!"
+
+#: LYMessages.c:546
+msgid "Client-side image MAP is not available!"
+msgstr "КлиентÑÐºÐ°Ñ Ð½Ð°Ð²Ð¸Ð³Ð°Ñ†Ð¸Ð¾Ð½Ð½Ð°Ñ ÐºÐ°Ñ€Ñ‚Ð° отÑутÑтвует!"
+
+#. #define OPTION_SCREEN_NEEDS_24
+#: LYMessages.c:549
+msgid "Screen height must be at least 24 lines for the Options menu!"
+msgstr "Ð”Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¼ÐµÐ½ÑŽ Опций, выÑота Ñкрана должна быть не менее 24 Ñтрок!"
+
+#. #define OPTION_SCREEN_NEEDS_23
+#: LYMessages.c:551
+msgid "Screen height must be at least 23 lines for the Options menu!"
+msgstr "Ð”Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¼ÐµÐ½ÑŽ Опций, выÑота Ñкрана должна быть не менее 23 Ñтрок!"
+
+#. #define OPTION_SCREEN_NEEDS_22
+#: LYMessages.c:553
+msgid "Screen height must be at least 22 lines for the Options menu!"
+msgstr "Ð”Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¼ÐµÐ½ÑŽ Опций, выÑота Ñкрана должна быть не менее 22 Ñтрок!"
+
+#: LYMessages.c:555
+msgid "That key requires Advanced User mode."
+msgstr "Этот ключ требует режима Ð´Ð»Ñ ÐŸÑ€Ð¾Ð´Ð²Ð¸Ð½ÑƒÑ‚Ð¾Ð³Ð¾ ПользователÑ."
+
+#: LYMessages.c:556
+#, c-format
+msgid "Content-type: %s"
+msgstr "Тип Ñодержимого: %s"
+
+#: LYMessages.c:557
+msgid "Command: "
+msgstr "Команда: "
+
+#: LYMessages.c:558
+msgid "Unknown or ambiguous command"
+msgstr "ÐеизвеÑÑ‚Ð½Ð°Ñ Ð¸Ð»Ð¸ Ð½ÐµÐ¾Ð´Ð½Ð¾Ð·Ð½Ð°Ñ‡Ð½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°"
+
+#: LYMessages.c:559
+msgid " Version "
+msgstr " ВерÑÐ¸Ñ "
+
+#: LYMessages.c:560
+msgid " first"
+msgstr " Ñначала"
+
+#: LYMessages.c:561
+msgid ", guessing..."
+msgstr ", угадывание..."
+
+#: LYMessages.c:562
+msgid "Permissions for "
+msgstr "Разрешение Ð´Ð»Ñ "
+
+#: LYMessages.c:563
+msgid "Select "
+msgstr "Выберите "
+
+#: LYMessages.c:564
+msgid "capital letter"
+msgstr "Ð·Ð°Ð³Ð»Ð°Ð²Ð½Ð°Ñ Ð±ÑƒÐºÐ²Ð°"
+
+#: LYMessages.c:565
+msgid " of option line,"
+msgstr " Ñтроки опций,"
+
+#: LYMessages.c:566
+msgid " to save,"
+msgstr " Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи,"
+
+#: LYMessages.c:567
+msgid " to "
+msgstr " Ð´Ð»Ñ "
+
+#: LYMessages.c:568
+msgid " or "
+msgstr " или "
+
+#: LYMessages.c:569
+msgid " index"
+msgstr " индекÑ"
+
+#: LYMessages.c:570
+msgid " to return to Lynx."
+msgstr " Ð´Ð»Ñ Ð²Ð¾Ð·Ð²Ñ€Ð°Ñ‚Ð° к Lynx."
+
+#: LYMessages.c:571
+msgid "Accept Changes"
+msgstr "ПринÑÑ‚ÑŒ изменениÑ"
+
+#: LYMessages.c:572
+msgid "Reset Changes"
+msgstr "Отменить ИзменениÑ"
+
+#: LYMessages.c:573
+msgid "Left Arrow cancels changes"
+msgstr "Ð›ÐµÐ²Ð°Ñ Ð¡Ñ‚Ñ€ÐµÐ»ÐºÐ° отменÑет изменениÑ"
+
+#: LYMessages.c:574
+msgid "Save options to disk"
+msgstr "Сохранить опции на диÑк"
+
+#: LYMessages.c:575
+msgid "Hit RETURN to accept entered data."
+msgstr "Ðажмите ВВОД Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð½ÑÑ‚Ð¸Ñ Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ‹Ñ… данных."
+
+#. #define ACCEPT_DATA_OR_DEFAULT
+#: LYMessages.c:577
+msgid "Hit RETURN to accept entered data. Delete data to invoke the default."
+msgstr "Ðажмите ВВОД Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð½ÑÑ‚Ð¸Ñ Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ‹Ñ… данных. Удалите Ð´Ð»Ñ Ð²Ð¾Ð·Ð²Ñ€Ð°Ñ‚Ð° к предыдущим."
+
+#: LYMessages.c:578
+msgid "Value accepted!"
+msgstr "Значение принÑто!"
+
+#. #define VALUE_ACCEPTED_WARNING_X
+#: LYMessages.c:580
+msgid "Value accepted! -- WARNING: Lynx is configured for XWINDOWS!"
+msgstr "Значение принÑто! -- ПРЕДУПРЕЖДЕÐИЕ: Lynx Ñконфигурирован Ð´Ð»Ñ XWINDOWS!"
+
+#. #define VALUE_ACCEPTED_WARNING_NONX
+#: LYMessages.c:582
+msgid "Value accepted! -- WARNING: Lynx is NOT configured for XWINDOWS!"
+msgstr "Значение принÑто! -- ПРЕДУПРЕЖДЕÐИЕ: Lynx ÐЕ Ñконфигурирован Ð´Ð»Ñ XWINDOWS!"
+
+#: LYMessages.c:583
+msgid "You are not allowed to change which editor to use!"
+msgstr "Ð’Ñ‹ не можете изменить редактор, который иÑпользовать!"
+
+#: LYMessages.c:584
+msgid "Failed to set DISPLAY variable!"
+msgstr "Ðе удаетÑÑ ÑƒÑтановить переменную DISPLAY!"
+
+#: LYMessages.c:585
+msgid "Failed to clear DISPLAY variable!"
+msgstr "Ðе удаетÑÑ Ð¾Ñ‡Ð¸Ñтить переменную DISPLAY!"
+
+#. #define BOOKMARK_CHANGE_DISALLOWED
+#: LYMessages.c:587
+msgid "You are not allowed to change the bookmark file!"
+msgstr "Вы не можете изменить файл закладок!"
+
+#: LYMessages.c:588
+msgid "Terminal does not support color"
+msgstr "Терминал не поддерживает цвет"
+
+#: LYMessages.c:589
+#, c-format
+msgid "Your '%s' terminal does not support color."
+msgstr "Ваш терминал '%s' не поддерживает цвет."
+
+#: LYMessages.c:590
+msgid "Access to dot files is disabled!"
+msgstr "ДоÑтуп к dot-файлам отключен!"
+
+#. #define UA_NO_LYNX_WARNING
+#: LYMessages.c:592
+msgid "User-Agent string does not contain \"Lynx\" or \"L_y_n_x\""
+msgstr "Строка User-Agent не Ñодержит \"Lynx\" или \"L_y_n_x\""
+
+#. #define UA_PLEASE_USE_LYNX
+#: LYMessages.c:594
+msgid "Use \"L_y_n_x\" or \"Lynx\" in User-Agent, or it looks like intentional deception!"
+msgstr "ИÑпользуйте \"L_y_n_x\" или \"Lynx\" в User-Agent, иначе Ñто выглÑдит как преднамеренный обман!"
+
+#. #define UA_CHANGE_DISABLED
+#: LYMessages.c:596
+msgid "Changing of the User-Agent string is disabled!"
+msgstr "ВозможноÑÑ‚ÑŒ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñтроки User-Agent отключена!"
+
+#. #define CHANGE_OF_SETTING_DISALLOWED
+#: LYMessages.c:598
+msgid "You are not allowed to change this setting."
+msgstr "Ð’Ñ‹ не можете изменить Ñту наÑтройку."
+
+#: LYMessages.c:599
+msgid "Saving Options..."
+msgstr "Сохранение опций..."
+
+#: LYMessages.c:600
+msgid "Options saved!"
+msgstr "Опции Ñохранены!"
+
+#: LYMessages.c:601
+msgid "Unable to save Options!"
+msgstr "Ðе удаетÑÑ Ñохранить Опции!"
+
+#: LYMessages.c:602
+msgid " 'r' to return to Lynx "
+msgstr " 'r' Ð´Ð»Ñ Ð²Ð¾Ð·Ð²Ñ€Ð°Ñ‚Ð° к Lynx "
+
+#: LYMessages.c:603
+msgid " '>' to save, or 'r' to return to Lynx "
+msgstr " '>' Ð´Ð»Ñ ÑохранениÑ, или 'r' Ð´Ð»Ñ Ð²Ð¾Ð·Ð²Ñ€Ð°Ñ‚Ð° к Lynx "
+
+#. #define ANY_KEY_CHANGE_RET_ACCEPT
+#: LYMessages.c:605
+msgid "Hit any key to change value; RETURN to accept."
+msgstr "Ðажмите любую клавишу Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ; ВВОД чтобы принÑÑ‚ÑŒ."
+
+#: LYMessages.c:606
+msgid "Error uncompressing temporary file!"
+msgstr "Ошибка разархивации временного файла!"
+
+#: LYMessages.c:607
+msgid "Unsupported URL scheme!"
+msgstr "ÐÐµÐ¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÐµÐ¼Ð°Ñ Ñхема URL!"
+
+#: LYMessages.c:608
+msgid "Unsupported data: URL! Use SHOWINFO, for now."
+msgstr "Ðеподдерживаемые данные: URL! ИÑпользуйте ПОКÐЗ ИÐФОРМÐЦИИ, пока что."
+
+#: LYMessages.c:609
+msgid "Redirection limit of 10 URL's reached."
+msgstr "ДоÑтигнут предел перенаправлений в 10 URL."
+
+#: LYMessages.c:610
+msgid "Illegal redirection URL received from server!"
+msgstr "От Ñервера получен неверный URL перенаправлениÑ!"
+
+#. #define SERVER_ASKED_FOR_REDIRECTION
+#: LYMessages.c:612
+#, c-format
+msgid "Server asked for %d redirection of POST content to"
+msgstr "Сервер запроÑил %d перенаправлений Ñодержимого POST по адреÑу"
+
+#: LYMessages.c:615
+msgid "P)roceed, use G)ET or C)ancel "
+msgstr "P)ПриÑтупить, иÑпользуйте G)ET или C)Отмена "
+
+#: LYMessages.c:616
+msgid "P)roceed, or C)ancel "
+msgstr "P)ПриÑтупить, или C)Отменить "
+
+#. #define ADVANCED_POST_GET_REDIRECT
+#: LYMessages.c:618
+msgid "Redirection of POST content. P)roceed, see U)RL, use G)ET or C)ancel"
+msgstr "Перенаправление Ñодержимого POST. P)ПриÑтупить, показать U)RL, G)ET или C)отмена"
+
+#. #define ADVANCED_POST_REDIRECT
+#: LYMessages.c:620
+msgid "Redirection of POST content. P)roceed, see U)RL, or C)ancel"
+msgstr "Перенаправление Ñодержимого POST. P)Продолжить, проÑмотреть U)RL или C)отменить"
+
+#. #define CONFIRM_POST_RESUBMISSION
+#: LYMessages.c:622
+msgid "Document from Form with POST content. Resubmit?"
+msgstr "Документ из Формы Ñ Ñодержимым POST. ПоÑлать заново?"
+
+#. #define CONFIRM_POST_RESUBMISSION_TO
+#: LYMessages.c:624
+#, c-format
+msgid "Resubmit POST content to %s ?"
+msgstr "ПоÑлать заново Ñодержимое POST на %s ?"
+
+#. #define CONFIRM_POST_LIST_RELOAD
+#: LYMessages.c:626
+#, c-format
+msgid "List from document with POST data. Reload %s ?"
+msgstr "СпиÑок из документа Ñ Ð´Ð°Ð½Ð½Ñ‹Ð¼Ð¸ POST. Обновить %s ?"
+
+#. #define CONFIRM_POST_DOC_HEAD
+#: LYMessages.c:628
+msgid "Document from POST action, HEAD may not be understood. Proceed?"
+msgstr "Документ из дейÑÑ‚Ð²Ð¸Ñ POST, HEAD может быть не понÑÑ‚. Продолжить?"
+
+#. #define CONFIRM_POST_LINK_HEAD
+#: LYMessages.c:630
+msgid "Form submit action is POST, HEAD may not be understood. Proceed?"
+msgstr "ДейÑтвие поÑылки формы - POST, HEAD может быть не понÑÑ‚. Продолжить?"
+
+#: LYMessages.c:631
+msgid "Proceed without a username and password?"
+msgstr "Продолжить без имени Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸ паролÑ?"
+
+#: LYMessages.c:632
+#, c-format
+msgid "Proceed (%s)?"
+msgstr "Продолжить (%s)?"
+
+#: LYMessages.c:633
+msgid "Cannot POST to this host."
+msgstr "Ðевозможно выполнить POST на Ñту машину."
+
+#: LYMessages.c:634
+msgid "POST not supported for this URL - ignoring POST data!"
+msgstr "POST не поддерживаетÑÑ Ð´Ð»Ñ Ñтого URL - данные POST игнорируютÑÑ!"
+
+#: LYMessages.c:635
+msgid "Discarding POST data..."
+msgstr "Уничтожение данных POST..."
+
+#: LYMessages.c:636
+msgid "Document will not be reloaded!"
+msgstr "Документ не будет обновлен!"
+
+#: LYMessages.c:637
+msgid "Location: "
+msgstr "ÐдреÑ: "
+
+#: LYMessages.c:638
+#, c-format
+msgid "'%s' not found!"
+msgstr "'%s' не найдено!"
+
+#: LYMessages.c:639
+msgid "Default Bookmark File"
+msgstr "Файл закладок по умолчанию"
+
+#: LYMessages.c:640
+msgid "Screen too small! (8x35 min)"
+msgstr "Экран Ñлишком маленький! (8x35 минимум)"
+
+#: LYMessages.c:641
+msgid "Select destination or ^G to Cancel: "
+msgstr "Выберите меÑто Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ ^G Ð´Ð»Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ñ‹: "
+
+#. #define MULTIBOOKMARKS_SELECT
+#: LYMessages.c:643
+msgid "Select subbookmark, '=' for menu, or ^G to cancel: "
+msgstr "Выберите подзакладку, '=' Ð´Ð»Ñ Ð¼ÐµÐ½ÑŽ или ^G Ð´Ð»Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ñ‹: "
+
+#. #define MULTIBOOKMARKS_SELF
+#: LYMessages.c:645
+msgid "Reproduce L)ink in this bookmark file or C)ancel? (l,c): "
+msgstr "ВоÑпроизвеÑти L)ÑÑылку в Ñтом файле закладок или C)отменить? (l,c): "
+
+#: LYMessages.c:646
+msgid "Multiple bookmark support is not available."
+msgstr "Поддержка множеÑтвенных закладок не доÑтупна."
+
+#: LYMessages.c:647
+#, c-format
+msgid " Select Bookmark (screen %d of %d)"
+msgstr " Выберите закладку (Ñкран %d из %d)"
+
+#: LYMessages.c:648
+msgid " Select Bookmark"
+msgstr " Выберите закладку"
+
+#. #define MULTIBOOKMARKS_EHEAD_MASK
+#: LYMessages.c:650
+#, c-format
+msgid "Editing Bookmark DESCRIPTION and FILEPATH (%d of 2)"
+msgstr "Редактирование ОПИСÐÐИЯ и ПУТИ К ФÐЙЛУ закладок (%d из 2)"
+
+#. #define MULTIBOOKMARKS_EHEAD
+#: LYMessages.c:652
+msgid " Editing Bookmark DESCRIPTION and FILEPATH"
+msgstr " Редактирование ОПИСÐÐИЯ и ПУТИ_ФÐЙЛРзакладок"
+
+#: LYMessages.c:653
+msgid "Letter: "
+msgstr "Буква: "
+
+#. #define USE_PATH_OFF_HOME
+#: LYMessages.c:656
+msgid "Use a filepath off your login directory in SHELL syntax!"
+msgstr ""
+
+#: LYMessages.c:658
+msgid "Use a filepath off your home directory!"
+msgstr ""
+
+#. #define MAXLINKS_REACHED
+#: LYMessages.c:661
+msgid "Maximum links per page exceeded! Use half-page or two-line scrolling."
+msgstr ""
+
+#: LYMessages.c:662
+msgid "No previously visited links available!"
+msgstr "Ранее поÑещенных ÑÑылок нет!"
+
+#: LYMessages.c:663
+msgid "Memory exhausted! Program aborted!"
+msgstr "ПамÑÑ‚ÑŒ иÑчерпана! Программа прервана!"
+
+#: LYMessages.c:664
+msgid "Memory exhausted! Aborting..."
+msgstr "ПамÑÑ‚ÑŒ иÑчерпана! Прерывание..."
+
+#: LYMessages.c:665
+msgid "Not enough memory!"
+msgstr "Ðе хватает памÑти!"
+
+#: LYMessages.c:666
+msgid "Directory/File Manager not available"
+msgstr "Каталог/файл-менеджер недоÑтупен"
+
+#: LYMessages.c:667
+msgid "HREF in BASE tag is not an absolute URL."
+msgstr "HREF в теге BASE не ÑвлÑетÑÑ Ð°Ð±Ñолютным URL."
+
+#: LYMessages.c:668
+msgid "Location URL is not absolute."
+msgstr "ÐÐ´Ñ€ÐµÑ URL не абÑолютный."
+
+#: LYMessages.c:669
+msgid "Refresh URL is not absolute."
+msgstr "URL Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ðµ абÑолютный."
+
+#. #define SENDING_MESSAGE_WITH_BODY_TO
+#: LYMessages.c:671
+msgid ""
+"You are sending a message with body to:\n"
+" "
+msgstr ""
+"Ð’Ñ‹ поÑылаете Ñообщение Ñ Ñ‚ÐµÐ»Ð¾Ð¼ по адреÑу:\n"
+" "
+
+#: LYMessages.c:672
+msgid ""
+"You are sending a comment to:\n"
+" "
+msgstr ""
+"Ð’Ñ‹ поÑылаете комментарий по адреÑу:\n"
+" "
+
+#: LYMessages.c:673
+msgid ""
+"\n"
+" With copy to:\n"
+" "
+msgstr ""
+"\n"
+" С копией по адреÑу:\n"
+" "
+
+#: LYMessages.c:674
+msgid ""
+"\n"
+" With copies to:\n"
+" "
+msgstr ""
+"\n"
+" С копиÑми по адреÑу:\n"
+" "
+
+#. #define CTRL_G_TO_CANCEL_SEND
+#: LYMessages.c:676
+msgid ""
+"\n"
+"\n"
+"Use Ctrl-G to cancel if you do not want to send a message\n"
+msgstr ""
+"\n"
+"\n"
+"ИÑпользуйте Ctrl-G Ð´Ð»Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ñ‹, еÑли вы не хотите поÑылать Ñообщение\n"
+
+#. #define ENTER_NAME_OR_BLANK
+#: LYMessages.c:678
+msgid ""
+"\n"
+" Please enter your name, or leave it blank to remain anonymous\n"
+msgstr ""
+"\n"
+" ПожалуйÑта, введите ваше Ð¸Ð¼Ñ Ð¸Ð»Ð¸ оÑтавьте его пуÑтым, чтобы оÑтатьÑÑ Ð°Ð½Ð¾Ð½Ð¸Ð¼Ð½Ñ‹Ð¼\n"
+
+#. #define ENTER_MAIL_ADDRESS_OR_OTHER
+#: LYMessages.c:680
+msgid ""
+"\n"
+" Please enter a mail address or some other\n"
+msgstr ""
+"\n"
+" ПожалуйÑта, введите почтовый Ð°Ð´Ñ€ÐµÑ Ð¸Ð»Ð¸ какую-нибудь другую\n"
+
+#. #define MEANS_TO_CONTACT_FOR_RESPONSE
+#: LYMessages.c:682
+msgid " means to contact you, if you desire a response.\n"
+msgstr " информацию Ð´Ð»Ñ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð° Ñ Ð²Ð°Ð¼Ð¸, еÑли вы желаете получить ответ.\n"
+
+#: LYMessages.c:683
+msgid ""
+"\n"
+" Please enter a subject line.\n"
+msgstr ""
+"\n"
+" ПожалуйÑта, введите Ñтроку темы.\n"
+
+#. #define ENTER_ADDRESS_FOR_CC
+#: LYMessages.c:685
+msgid ""
+"\n"
+" Enter a mail address for a CC of your message.\n"
+msgstr ""
+"\n"
+" Введите почтовый Ð°Ð´Ñ€ÐµÑ Ð´Ð»Ñ ÐºÐ¾Ð¿Ð¸Ð¸ (CC) вашего ÑообщениÑ.\n"
+
+#: LYMessages.c:686
+msgid " (Leave blank if you don't want a copy.)\n"
+msgstr " (ОÑтавьте пуÑтым, еÑли вы не хотите копию.)\n"
+
+#: LYMessages.c:687
+msgid ""
+"\n"
+" Please review the message body:\n"
+"\n"
+msgstr ""
+"\n"
+" ПожалуйÑта, проÑмотрите тело ÑообщениÑ:\n"
+"\n"
+
+#: LYMessages.c:688
+msgid ""
+"\n"
+"Press RETURN to continue: "
+msgstr ""
+"\n"
+"Ðажмите ВВОД Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ: "
+
+#: LYMessages.c:689
+msgid ""
+"\n"
+"Press RETURN to clean up: "
+msgstr ""
+"\n"
+"Ðажмите ВВОД Ð´Ð»Ñ Ð¾Ñ‡Ð¸Ñтки: "
+
+#: LYMessages.c:690
+msgid " Use Control-U to erase the default.\n"
+msgstr " ИÑпользуйте Control-U Ð´Ð»Ñ ÑƒÐ½Ð¸Ñ‡Ñ‚Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ умолчанию.\n"
+
+#: LYMessages.c:691
+msgid ""
+"\n"
+" Please enter your message below."
+msgstr ""
+"\n"
+" ПожалуйÑта, введите ниже ваше Ñообщение."
+
+#. #define ENTER_PERIOD_WHEN_DONE_A
+#: LYMessages.c:693 src/LYNews.c:360
+msgid ""
+"\n"
+" When you are done, press enter and put a single period (.)"
+msgstr ""
+"\n"
+" Когда вÑе готово, нажмите <ввод> и поÑтавьте единÑтвенную точку (.)"
+
+#. #define ENTER_PERIOD_WHEN_DONE_B
+#: LYMessages.c:695 src/LYNews.c:361
+msgid ""
+"\n"
+" on a line and press enter again."
+msgstr ""
+"\n"
+" в Ñтроке и Ñнова нажмите <ввод>."
+
+#. Cookies messages
+#. #define ADVANCED_COOKIE_CONFIRMATION
+#: LYMessages.c:699
+#, c-format
+msgid "%s cookie: %.*s=%.*s Allow? (Y/N/Always/neVer)"
+msgstr "%s cookie: %.*s=%.*s ПринÑÑ‚ÑŒ? (Y)Да/(N)Ðет/(A)Ð’Ñегда/(V)Ðикогда"
+
+#. #define INVALID_COOKIE_DOMAIN_CONFIRMATION
+#: LYMessages.c:701
+#, c-format
+msgid "Accept invalid cookie domain=%s for '%s'?"
+msgstr "ПринÑÑ‚ÑŒ неправильный домен=%s Ð´Ð»Ñ cookie '%s'?"
+
+#. #define INVALID_COOKIE_PATH_CONFIRMATION
+#: LYMessages.c:703
+#, c-format
+msgid "Accept invalid cookie path=%s as a prefix of '%s'?"
+msgstr "ПринÑÑ‚ÑŒ неправильный путь=%s как Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Ð´Ð»Ñ cookie '%s'?"
+
+#: LYMessages.c:704
+msgid "Allowing this cookie."
+msgstr "ПринÑтие Ñтого cookie."
+
+#: LYMessages.c:705
+msgid "Rejecting this cookie."
+msgstr "Отклонение Ñтого cookie."
+
+#: LYMessages.c:706
+msgid "The Cookie Jar is empty."
+msgstr "СпиÑок cookie пуÑÑ‚."
+
+#: LYMessages.c:707
+#, fuzzy
+#| msgid "The Cookie Jar is empty."
+msgid "The Cache Jar is empty."
+msgstr "СпиÑок cookie пуÑÑ‚."
+
+#. #define ACTIVATE_TO_GOBBLE
+#: LYMessages.c:709
+msgid "Activate links to gobble up cookies or entire domains,"
+msgstr "Ðктивизировать ÑÑылки Ð´Ð»Ñ ÑƒÐ½Ð¸Ñ‡Ñ‚Ð¾Ð¶ÐµÐ½Ð¸Ñ cookie или целых доменов,"
+
+#: LYMessages.c:710
+msgid "or to change a domain's 'allow' setting."
+msgstr "или Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑƒÑтановки 'allow' домена."
+
+#: LYMessages.c:711
+msgid "(Cookies never allowed.)"
+msgstr "(Cookie никогда не разрешены.)"
+
+#: LYMessages.c:712
+msgid "(Cookies always allowed.)"
+msgstr "(Cookie вÑегда разрешены.)"
+
+#: LYMessages.c:713
+msgid "(Cookies allowed via prompt.)"
+msgstr "(Cookie разрешаютÑÑ Ñ‡ÐµÑ€ÐµÐ· подтверждение.)"
+
+#: LYMessages.c:714
+msgid "(Persistent Cookies.)"
+msgstr "(ПоÑтоÑнные cookie.)"
+
+#: LYMessages.c:715
+msgid "(No title.)"
+msgstr "(Ðет заголовка.)"
+
+#: LYMessages.c:716
+msgid "(No name.)"
+msgstr "(Ðет имени.)"
+
+#: LYMessages.c:717
+msgid "(No value.)"
+msgstr "(Ðет значениÑ.)"
+
+#: LYMessages.c:718 src/LYOptions.c:2409
+msgid "None"
+msgstr "Ðет"
+
+#: LYMessages.c:719
+msgid "(End of session.)"
+msgstr "(Конец ÑеанÑа.)"
+
+#: LYMessages.c:720
+msgid "Delete this cookie?"
+msgstr "Удалить Ñтот cookie?"
+
+#: LYMessages.c:721
+msgid "The cookie has been eaten!"
+msgstr "Cookie удалён!"
+
+#: LYMessages.c:722
+msgid "Delete this empty domain?"
+msgstr "Удалить Ñтот пуÑтой домен?"
+
+#: LYMessages.c:723
+msgid "The domain has been eaten!"
+msgstr "Домен удалён!"
+
+#. #define DELETE_COOKIES_SET_ALLOW_OR_CANCEL
+#: LYMessages.c:725
+msgid "D)elete domain's cookies, set allow A)lways/P)rompt/neV)er, or C)ancel? "
+msgstr "D)Удалить cookie домена, уÑтановить разрешение в A)lways/P)rompt/neVer или C)ancel?"
+
+#. #define DELETE_DOMAIN_SET_ALLOW_OR_CANCEL
+#: LYMessages.c:727
+msgid "D)elete domain, set allow A)lways/P)rompt/neV)er, or C)ancel? "
+msgstr "D)Удалить домен, уÑтановить разрешение в A)lways/P)rompt/neV)er или C)ancel? "
+
+#: LYMessages.c:728
+msgid "All cookies in the domain have been eaten!"
+msgstr "Ð’Ñе cookie в домене были уничтожены!"
+
+#: LYMessages.c:729
+#, c-format
+msgid "'A'lways allowing from domain '%s'."
+msgstr "A)Ð’Ñегда принимать из домена '%s'."
+
+#: LYMessages.c:730
+#, c-format
+msgid "ne'V'er allowing from domain '%s'."
+msgstr "V)Ðикогда не принимать из домена '%s'."
+
+#: LYMessages.c:731
+#, c-format
+msgid "'P'rompting to allow from domain '%s'."
+msgstr "P)Спрашивать о приеме из домена '%s'."
+
+#: LYMessages.c:732
+msgid "Delete all cookies in this domain?"
+msgstr "Удалить вÑе cookie в Ñтом домене?"
+
+#: LYMessages.c:733
+msgid "All of the cookies in the jar have been eaten!"
+msgstr "Ð’Ñе cookie из ÑпиÑка были уничтожены!"
+
+#: LYMessages.c:735
+msgid "Port 19 not permitted in URLs."
+msgstr "19 порт в URL не допуÑкаетÑÑ."
+
+#: LYMessages.c:736
+msgid "Port 25 not permitted in URLs."
+msgstr "25 порт в URL не допуÑкаетÑÑ."
+
+#: LYMessages.c:737
+#, c-format
+msgid "Port %lu not permitted in URLs."
+msgstr "%lu порт в URL не допуÑкаетÑÑ."
+
+#: LYMessages.c:738
+msgid "URL has a bad port field."
+msgstr "URL имеет плохое поле порта."
+
+#: LYMessages.c:739
+msgid "Maximum nesting of HTML elements exceeded."
+msgstr "Превышено макÑимальное чиÑло вложенных Ñлементов HTML."
+
+#: LYMessages.c:740
+msgid "Bad partial reference! Stripping lead dots."
+msgstr "ÐŸÐ»Ð¾Ñ…Ð°Ñ Ñ‡Ð°ÑÑ‚Ð¸Ñ‡Ð½Ð°Ñ ÑÑылка! Ðачальные точки игнорируютÑÑ."
+
+#: LYMessages.c:741
+msgid "Trace Log open failed. Trace off!"
+msgstr "Ошибка при открытии журнала траÑÑировки. ТраÑÑировка выключена!"
+
+#: LYMessages.c:742
+msgid "Lynx Trace Log"
+msgstr "Журнал траÑÑировки Lynx"
+
+#: LYMessages.c:743
+msgid "No trace log has been started for this session."
+msgstr "Журнал траÑÑировки Ð´Ð»Ñ Ñтого ÑеанÑа не велÑÑ."
+
+#. #define MAX_TEMPCOUNT_REACHED
+#: LYMessages.c:745
+msgid "The maximum temporary file count has been reached!"
+msgstr "ДоÑтигнуто макÑимальное количеÑтво временных файлов!"
+
+#. #define FORM_VALUE_TOO_LONG
+#: LYMessages.c:747
+msgid "Form field value exceeds buffer length! Trim the tail."
+msgstr "Значение Ð¿Ð¾Ð»Ñ Ñ„Ð¾Ñ€Ð¼Ñ‹ превышает длину буфера. Обрежьте конец."
+
+#. #define FORM_TAIL_COMBINED_WITH_HEAD
+#: LYMessages.c:749
+msgid "Modified tail combined with head of form field value."
+msgstr "Модифицированное окончание Ñкомбинировано Ñ Ð½Ð°Ñ‡Ð°Ð»Ð¾Ð¼ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»Ñ Ñ„Ð¾Ñ€Ð¼Ñ‹."
+
+#. HTFile.c
+#: LYMessages.c:752
+msgid "Directory"
+msgstr "Каталог"
+
+#: LYMessages.c:753
+msgid "Directory browsing is not allowed."
+msgstr "ПроÑмотр каталогов не разрешен."
+
+#: LYMessages.c:754
+msgid "Selective access is not enabled for this directory"
+msgstr "Избирательный доÑтуп не включен Ð´Ð»Ñ Ñтого каталога"
+
+#: LYMessages.c:755
+msgid "Multiformat: directory scan failed."
+msgstr "Multiformat: ошибка при Ñканировании каталога."
+
+#: LYMessages.c:756
+msgid "This directory is not readable."
+msgstr "Этот каталог не доÑтупен на чтение."
+
+#: LYMessages.c:757
+msgid "Can't access requested file."
+msgstr "Ðет доÑтупа к запрошенному файлу."
+
+#: LYMessages.c:758
+msgid "Could not find suitable representation for transmission."
+msgstr "Ðе удаетÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ подходÑщее предÑтавление Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸."
+
+#: LYMessages.c:759
+msgid "Could not open file for decompression!"
+msgstr "Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ файл Ð´Ð»Ñ Ñ€Ð°Ð·Ð°Ñ€Ñ…Ð¸Ð²Ð°Ñ†Ð¸Ð¸!"
+
+#: LYMessages.c:760
+msgid "Files:"
+msgstr "Файлы:"
+
+#: LYMessages.c:761
+msgid "Subdirectories:"
+msgstr "Подкаталоги:"
+
+#: LYMessages.c:762
+msgid " directory"
+msgstr " каталог"
+
+#: LYMessages.c:763
+msgid "Up to "
+msgstr "Перейти к "
+
+#: LYMessages.c:764
+msgid "Current directory is "
+msgstr "Текущий каталог "
+
+#. HTFTP.c
+#: LYMessages.c:767
+msgid "Symbolic Link"
+msgstr "Ð¡Ð¸Ð¼Ð²Ð¾Ð»ÑŒÐ½Ð°Ñ ÑÑылка"
+
+#. HTGopher.c
+#: LYMessages.c:770
+msgid "No response from server!"
+msgstr "Ðет ответа от Ñервера!"
+
+#: LYMessages.c:771
+msgid "CSO index"
+msgstr "Ð˜Ð½Ð´ÐµÐºÑ CSO"
+
+#: LYMessages.c:772
+msgid ""
+"\n"
+"This is a searchable index of a CSO database.\n"
+msgstr ""
+"\n"
+"Это поиÑковый Ð¸Ð½Ð´ÐµÐºÑ Ð±Ð°Ð·Ñ‹ данных CSO.\n"
+
+#: LYMessages.c:773
+msgid "CSO Search Results"
+msgstr "Результаты поиÑка CSO"
+
+#: LYMessages.c:774
+#, c-format
+msgid "Seek fail on %s\n"
+msgstr "Ошибка Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ð¾Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² %s\n"
+
+#: LYMessages.c:775
+msgid ""
+"\n"
+"Press the 's' key and enter search keywords.\n"
+msgstr ""
+"\n"
+"Ðажмите клавишу 's' и введите ключевые Ñлова Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка.\n"
+
+#: LYMessages.c:776
+msgid ""
+"\n"
+"This is a searchable Gopher index.\n"
+msgstr ""
+"\n"
+"Это поиÑковый Ð¸Ð½Ð´ÐµÐºÑ Gopher.\n"
+
+#: LYMessages.c:777
+msgid "Gopher index"
+msgstr "Ð˜Ð½Ð´ÐµÐºÑ Gopher"
+
+#: LYMessages.c:778
+msgid "Gopher Menu"
+msgstr "Меню Gopher"
+
+#: LYMessages.c:779
+msgid " Search Results"
+msgstr " Результаты поиÑка"
+
+#: LYMessages.c:780
+msgid "Sending CSO/PH request."
+msgstr "ПоÑылка запроÑа CSO/PH"
+
+#: LYMessages.c:781
+msgid "Sending Gopher request."
+msgstr "ПоÑылка запроÑа Gopher."
+
+#: LYMessages.c:782
+msgid "CSO/PH request sent; waiting for response."
+msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ CSO/PH поÑлан; ожидаетÑÑ Ð¾Ñ‚Ð²ÐµÑ‚."
+
+#: LYMessages.c:783
+msgid "Gopher request sent; waiting for response."
+msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Gopher поÑлан; ожидаетÑÑ Ð¾Ñ‚Ð²ÐµÑ‚."
+
+#: LYMessages.c:784
+msgid ""
+"\n"
+"Please enter search keywords.\n"
+msgstr ""
+"\n"
+"ПожалуйÑта, введите ключевые Ñлова Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка.\n"
+
+#: LYMessages.c:785
+msgid ""
+"\n"
+"The keywords that you enter will allow you to search on a"
+msgstr ""
+"\n"
+"Введенные вами ключевые Ñлова позволÑÑ‚ вам иÑкать по"
+
+#: LYMessages.c:786
+msgid " person's name in the database.\n"
+msgstr " имени человека в базе данных.\n"
+
+#. HTNews.c
+#: LYMessages.c:789
+msgid "Connection closed ???"
+msgstr "Соединение закрыто ???"
+
+#: LYMessages.c:790
+msgid "Cannot open temporary file for news POST."
+msgstr "Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ временный файл Ð´Ð»Ñ Ð¿Ð¾Ñылки новоÑтей."
+
+#: LYMessages.c:791
+msgid "This client does not contain support for posting to news with SSL."
+msgstr "Этот клиент не имеет поддержки Ð´Ð»Ñ Ð¿Ð¾Ñылки новоÑтей Ñ Ð¸Ñпользованием SSL."
+
+#. HTStyle.c
+#: LYMessages.c:794
+#, c-format
+msgid "Style %d `%s' SGML:%s. Font %s %.1f point.\n"
+msgstr "Стиль %d `%s' SGML:%s. Шрифт %s %.1f точка.\n"
+
+#: LYMessages.c:796
+#, c-format
+msgid "\tAlign=%d, %d tabs. (%.0f before, %.0f after)\n"
+msgstr "\tВыравнивание=%d, %d tabs. (%.0f до, %.0f поÑле)\n"
+
+#: LYMessages.c:797
+#, c-format
+msgid "\t\tTab kind=%d at %.0f\n"
+msgstr ""
+
+#. HTTP.c
+#: LYMessages.c:800
+msgid "Can't proceed without a username and password."
+msgstr "Ðе удаетÑÑ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶Ð¸Ñ‚ÑŒ без имени Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸ паролÑ."
+
+#: LYMessages.c:801
+msgid "Can't retry with authorization! Contact the server's WebMaster."
+msgstr "Ðе удаетÑÑ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð¸Ñ‚ÑŒ проверку полномочий! СвÑжитеÑÑŒ Ñ Ð²ÐµÐ±Ð¼Ð°Ñтером Ñервера."
+
+#: LYMessages.c:802
+msgid "Can't retry with proxy authorization! Contact the server's WebMaster."
+msgstr "Ðе удаетÑÑ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð¸Ñ‚ÑŒ проверку полномочий через прокÑи! СвÑжитеÑÑŒ Ñ Ð²ÐµÐ±Ð¼Ð°Ñтером Ñервера."
+
+#: LYMessages.c:803
+msgid "Retrying with proxy authorization information."
+msgstr "Повтор Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸ÐµÐ¹ проверки полномочий Ð´Ð»Ñ Ð¿Ñ€Ð¾ÐºÑи."
+
+#: LYMessages.c:804
+#, fuzzy, c-format
+#| msgid "SSL error:host(%s)!=cert(%s)-Continue?"
+msgid "SSL error:%s-Continue?"
+msgstr "Ошибка SSL:host(%s)!=cert(%s)-Продолжить?"
+
+#. HTWAIS.c
+#: LYMessages.c:807
+msgid "HTWAIS: Return message too large."
+msgstr "HTWAIS: Возвращенное Ñообщение Ñлишком велико."
+
+#: LYMessages.c:808
+msgid "Enter WAIS query: "
+msgstr "Введите Ð·Ð°Ð¿Ñ€Ð¾Ñ WAIS: "
+
+#. Miscellaneous status
+#: LYMessages.c:811
+msgid "Retrying as HTTP0 request."
+msgstr "Повтор как Ð·Ð°Ð¿Ñ€Ð¾Ñ HTTP0."
+
+#: LYMessages.c:812
+#, c-format
+msgid "Transferred %d bytes"
+msgstr "Передано %d байт"
+
+#: LYMessages.c:813
+msgid "Data transfer complete"
+msgstr "Передача данных завершена"
+
+#: LYMessages.c:814
+#, c-format
+msgid "Error processing line %d of %s\n"
+msgstr "Ошибка при обработке Ñтроки %d из %s\n"
+
+#. Lynx internal page titles
+#: LYMessages.c:817
+msgid "Address List Page"
+msgstr "Страница ÑпиÑка адреÑов"
+
+#: LYMessages.c:818
+msgid "Bookmark file"
+msgstr "Файл закладок"
+
+#: LYMessages.c:819
+msgid "Configuration Definitions"
+msgstr "ÐžÐ¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ð¸"
+
+#: LYMessages.c:820
+msgid "Cookie Jar"
+msgstr "СпиÑок cookie"
+
+#: LYMessages.c:821
+msgid "Current Key Map"
+msgstr "Текущее отображение клавиш"
+
+#: LYMessages.c:822
+msgid "File Management Options"
+msgstr "Опции работы Ñ Ñ„Ð°Ð¹Ð»Ð°Ð¼Ð¸"
+
+#: LYMessages.c:823
+msgid "Download Options"
+msgstr "Опции ÑкачиваниÑ"
+
+#: LYMessages.c:824
+msgid "History Page"
+msgstr "Страница иÑтории"
+
+#: LYMessages.c:825
+#, fuzzy
+#| msgid "Cookie Jar"
+msgid "Cache Jar"
+msgstr "СпиÑок cookie"
+
+#: LYMessages.c:826
+msgid "List Page"
+msgstr "Страница ÑпиÑка"
+
+#: LYMessages.c:827
+msgid "Lynx.cfg Information"
+msgstr "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ lynx.cfg"
+
+#: LYMessages.c:828
+msgid "Converted Mosaic Hotlist"
+msgstr "Преобразованные закладки Mosaic"
+
+#: LYMessages.c:829
+msgid "Options Menu"
+msgstr "Меню Опций"
+
+#: LYMessages.c:830
+msgid "File Permission Options"
+msgstr "Опции прав доÑтупа к файлам"
+
+#: LYMessages.c:831
+msgid "Printing Options"
+msgstr "Опции печати"
+
+#: LYMessages.c:832
+msgid "Information about the current document"
+msgstr "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ текущем документе"
+
+#: LYMessages.c:833
+msgid "Your recent statusline messages"
+msgstr "Ваши поÑледние ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñтроки ÑтатуÑа"
+
+#: LYMessages.c:834
+msgid "Upload Options"
+msgstr "Опции загрузки"
+
+#: LYMessages.c:835
+msgid "Visited Links Page"
+msgstr "Страница поÑещенных ÑÑылок"
+
+#. CONFIG_DEF_TITLE subtitles
+#: LYMessages.c:838
+msgid "See also"
+msgstr "См. также"
+
+#: LYMessages.c:839
+msgid "your"
+msgstr "ваш"
+
+#: LYMessages.c:840
+msgid "for runtime options"
+msgstr "Ð´Ð»Ñ Ð¾Ð¿Ñ†Ð¸Ð¹ времени выполнениÑ"
+
+#: LYMessages.c:841
+msgid "compile time options"
+msgstr "опции Ñтадии компилÑции"
+
+#: LYMessages.c:842
+#, fuzzy
+msgid "color-style configuration"
+msgstr "Ваша оÑÐ½Ð¾Ð²Ð½Ð°Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ"
+
+#: LYMessages.c:843
+msgid "latest release"
+msgstr "поÑледнÑÑ ÑÑ‚Ð°Ð±Ð¸Ð»ÑŒÐ½Ð°Ñ Ð²ÐµÑ€ÑиÑ"
+
+#: LYMessages.c:844
+msgid "pre-release version"
+msgstr "почти ÑÑ‚Ð°Ð±Ð¸Ð»ÑŒÐ½Ð°Ñ Ð²ÐµÑ€ÑиÑ"
+
+#: LYMessages.c:845
+msgid "development version"
+msgstr "неÑÑ‚Ð°Ð±Ð¸Ð»ÑŒÐ½Ð°Ñ Ð²ÐµÑ€ÑиÑ"
+
+#. #define AUTOCONF_CONFIG_CACHE
+#: LYMessages.c:847
+msgid ""
+"The following data were derived during the automatic configuration/build\n"
+"process of this copy of Lynx. When reporting a bug, please include a copy\n"
+"of this page."
+msgstr ""
+"Следующие данные были получены в течение автоматичеÑкого процеÑÑа\n"
+"конфигурации/компилÑции Ñтой копии Lynx. При Ñообщении об ошибке, пожалуйÑта,\n"
+"включите копию Ñтой Ñтраницы."
+
+#. #define AUTOCONF_LYNXCFG_H
+#: LYMessages.c:851
+msgid ""
+"The following data were used as automatically-configured compile-time\n"
+"definitions when this copy of Lynx was built."
+msgstr ""
+"Следующие данные были иÑпользованы как автоматичеÑки Ñконфигурированные\n"
+"Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ñтадии компилÑции при Ñборке Ñтой копии Lynx."
+
+#. #define DIRED_NOVICELINE
+#: LYMessages.c:856
+msgid " C)reate D)ownload E)dit F)ull menu M)odify R)emove T)ag U)pload \n"
+msgstr " C)оздать D)Загр E)Редакт F)Полн меню M)Измен R)Удал T)Отм U)Загр \n"
+
+#: LYMessages.c:857
+msgid "Failed to obtain status of current link!"
+msgstr "Ðе удаетÑÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒ ÑÑ‚Ð°Ñ‚ÑƒÑ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ¹ ÑÑылки!"
+
+#. #define INVALID_PERMIT_URL
+#: LYMessages.c:860
+msgid "Special URL only valid from current File Permission menu!"
+msgstr "Специальный URL дейÑтвителен только из текущего меню Прав ДоÑтупа к Файлам!"
+
+#: LYMessages.c:864
+msgid "External support is currently disabled."
+msgstr "ВнешнÑÑ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ° ÑÐµÐ¹Ñ‡Ð°Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð°."
+
+#. new with 2.8.4dev.21
+#: LYMessages.c:868
+msgid "Changing working-directory is currently disabled."
+msgstr "Изменение рабочего каталога ÑÐµÐ¹Ñ‡Ð°Ñ Ð·Ð°Ð¿Ñ€ÐµÑ‰ÐµÐ½Ð¾."
+
+#: LYMessages.c:869
+msgid "Linewrap OFF!"
+msgstr "ÐŸÐµÑ€ÐµÐ½Ð¾Ñ Ñтрок ОТКЛЮЧЕÐ!"
+
+#: LYMessages.c:870
+msgid "Linewrap ON!"
+msgstr "ÐŸÐµÑ€ÐµÐ½Ð¾Ñ Ñтрок ВКЛЮЧЕÐ!"
+
+#: LYMessages.c:871
+msgid "Parsing nested-tables toggled OFF! Reloading..."
+msgstr "Разбор вложенных таблиц ОТКЛЮЧЕÐ! Обновление..."
+
+#: LYMessages.c:872
+msgid "Parsing nested-tables toggled ON! Reloading..."
+msgstr "Разбор вложенных таблиц ВКЛЮЧЕÐ! Обновление..."
+
+#: LYMessages.c:873
+msgid "Shifting is disabled while line-wrap is in effect"
+msgstr "Сдвиг запрещен пока дейÑтвует Ð¿ÐµÑ€ÐµÐ½Ð¾Ñ Ñтрок"
+
+#: LYMessages.c:874
+msgid "Trace not supported"
+msgstr "ТраÑÑировка не поддерживаетÑÑ"
+
+#: LYMessages.c:795
+#, c-format
+msgid "\tIndents: first=%.0f others=%.0f, Height=%.1f Desc=%.1f\n"
+msgstr "\tОтÑтупы: первый=%.0f оÑтальные=%.0f, выÑота=%.1f опиÑание=%.1f\n"
+
+#.
+#. * Set up the message for the username prompt, and then issue the
+#. * prompt. The default username is included in the call to the
+#. * prompting function, but the password is NULL-ed and always replaced.
+#. * - FM
+#.
+#: WWW/Library/Implementation/HTAABrow.c:634
+#, c-format
+msgid "Username for '%s' at %s '%s%s':"
+msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ '%s' на %s '%s%s':"
+
+#: WWW/Library/Implementation/HTAABrow.c:904
+msgid "This client doesn't know how to compose proxy authorization information for scheme"
+msgstr "Этот клиент не знает, как ÑоÑтавить информацию проверки прав Ð´Ð»Ñ Ð¿Ñ€Ð¾ÐºÑи Ð´Ð»Ñ Ñхемы"
+
+#: WWW/Library/Implementation/HTAABrow.c:983
+msgid "This client doesn't know how to compose authorization information for scheme"
+msgstr "Этот клиент не знает, как ÑоÑтавить информацию проверки прав Ð´Ð»Ñ Ñхемы"
+
+#: WWW/Library/Implementation/HTAABrow.c:1093
+#, c-format
+msgid "Invalid header '%s%s%s%s%s'"
+msgstr "Ðеверный заголовок '%s%s%s%s%s'"
+
+#: WWW/Library/Implementation/HTAABrow.c:1198
+msgid "Proxy authorization required -- retrying"
+msgstr "ТребуетÑÑ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ° прав Ð´Ð»Ñ Ð¿Ñ€Ð¾ÐºÑи -- повтор"
+
+#: WWW/Library/Implementation/HTAABrow.c:1256
+msgid "Access without authorization denied -- retrying"
+msgstr "ДоÑтуп без проверки прав запрещен -- повтор"
+
+#: WWW/Library/Implementation/HTAccess.c:698
+msgid "Access forbidden by rule"
+msgstr "ДоÑтуп запрещен правилом"
+
+#: WWW/Library/Implementation/HTAccess.c:793
+msgid "Document with POST content not found in cache. Resubmit?"
+msgstr "Документ Ñ Ñодержимым POST не найден в кÑше. ПоÑлать Ñнова?"
+
+#: WWW/Library/Implementation/HTAccess.c:949
+msgid "Loading failed, use a previous copy."
+msgstr "Ошибка загрузки. ИÑпользуйте предыдущую копию."
+
+#: WWW/Library/Implementation/HTAccess.c:1058 src/GridText.c:8867
+msgid "Loading incomplete."
+msgstr "Загрузка завершена не полноÑтью."
+
+#: WWW/Library/Implementation/HTAccess.c:1089
+#, c-format
+msgid "**** HTAccess: socket or file number returned by obsolete load routine!\n"
+msgstr "**** HTAccess: номер Ñокета или файла возвращен уÑтаревшей программой загрузки!\n"
+
+#: WWW/Library/Implementation/HTAccess.c:1091
+#, fuzzy, c-format
+#| msgid "**** HTAccess: Internal software error. Please mail lynx-dev@sig.net!\n"
+msgid "**** HTAccess: Internal software error. Please mail lynx-dev@nongnu.org!\n"
+msgstr "**** HTAccess: ВнутреннÑÑ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°. ПожалуйÑта, напишите в lynx-dev@sig.net!\n"
+
+#: WWW/Library/Implementation/HTAccess.c:1092
+#, c-format
+msgid "**** HTAccess: Status returned was: %d\n"
+msgstr "**** HTAccess: Возвращенный ÑтатуÑ: %d\n"
+
+#.
+#. * hack: if we fail in HTAccess.c
+#. * avoid duplicating URL, oh.
+#.
+#: WWW/Library/Implementation/HTAccess.c:1098 src/LYMainLoop.c:8050
+msgid "Can't Access"
+msgstr "Ðет доÑтупа"
+
+#: WWW/Library/Implementation/HTAccess.c:1106
+msgid "Unable to access document."
+msgstr "Ошибка доÑтупа к документу."
+
+#: WWW/Library/Implementation/HTFTP.c:849
+#, c-format
+msgid "Enter password for user %s@%s:"
+msgstr "Введите пароль Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ %s@%s:"
+
+#: WWW/Library/Implementation/HTFTP.c:877
+msgid "Unable to connect to FTP host."
+msgstr "Ðе удаетÑÑ ÑƒÑтановить Ñоединение Ñ FTP-узлом."
+
+#: WWW/Library/Implementation/HTFTP.c:1158
+msgid "close master socket"
+msgstr "закрыть ведущий Ñокет"
+
+#: WWW/Library/Implementation/HTFTP.c:1220
+msgid "socket for master socket"
+msgstr "Ñокет Ð´Ð»Ñ Ð²ÐµÐ´ÑƒÑ‰ÐµÐ³Ð¾ Ñокета"
+
+#: WWW/Library/Implementation/HTFTP.c:2986
+msgid "Receiving FTP directory."
+msgstr "Получение FTP-каталога."
+
+#: WWW/Library/Implementation/HTFTP.c:3122
+#, c-format
+msgid "Transferred %d bytes (%5d)"
+msgstr "Передано %d байт (%5d)"
+
+#: WWW/Library/Implementation/HTFTP.c:3480
+msgid "connect for data"
+msgstr "Ñоединение Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ…"
+
+#: WWW/Library/Implementation/HTFTP.c:4141
+msgid "Receiving FTP file."
+msgstr "Получение FTP-файла."
+
+#: WWW/Library/Implementation/HTFinger.c:278
+msgid "Could not set up finger connection."
+msgstr "Ðе удаетÑÑ ÑƒÑтановить Ñоединение finger."
+
+#: WWW/Library/Implementation/HTFinger.c:325
+msgid "Could not load data (no sitename in finger URL)"
+msgstr "Ðе удаетÑÑ Ð·Ð°Ð³Ñ€ÑƒÐ·Ð¸Ñ‚ÑŒ данные (нет имени Ñайта в URL Ð´Ð»Ñ finger)"
+
+#: WWW/Library/Implementation/HTFinger.c:329
+msgid "Invalid port number - will only use port 79!"
+msgstr "Ðеверный номер порта - будет иÑпользован только порт 79!"
+
+#: WWW/Library/Implementation/HTFinger.c:395
+msgid "Could not access finger host."
+msgstr "Ðет доÑтупа к узлу finger."
+
+#: WWW/Library/Implementation/HTFinger.c:403
+msgid "No response from finger server."
+msgstr "Ðет ответа от Ñервера finger."
+
+#: WWW/Library/Implementation/HTNews.c:421
+#, c-format
+msgid "Username for news host '%s':"
+msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ ÑƒÐ·Ð»Ð° новоÑтей '%s':"
+
+#: WWW/Library/Implementation/HTNews.c:474
+msgid "Change username?"
+msgstr "Изменить Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ?"
+
+#: WWW/Library/Implementation/HTNews.c:478
+msgid "Username:"
+msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ:"
+
+#: WWW/Library/Implementation/HTNews.c:503
+#, c-format
+msgid "Password for news host '%s':"
+msgstr "Пароль Ð´Ð»Ñ ÑƒÐ·Ð»Ð° новоÑтей '%s':"
+
+#: WWW/Library/Implementation/HTNews.c:586
+msgid "Change password?"
+msgstr "Изменить пароль?"
+
+#: WWW/Library/Implementation/HTNews.c:1707
+#, c-format
+msgid "No matches for: %s"
+msgstr "Ðет Ñовпадений длÑ: %s"
+
+#: WWW/Library/Implementation/HTNews.c:1757
+msgid ""
+"\n"
+"No articles in this group.\n"
+msgstr ""
+"\n"
+"Ð’ Ñтой группе нет Ñтатей.\n"
+
+#: WWW/Library/Implementation/HTNews.c:1769
+msgid ""
+"\n"
+"No articles in this range.\n"
+msgstr ""
+"\n"
+"Ð’ Ñтом диапазоне нет Ñтатей.\n"
+
+#.
+#. * Set window title.
+#.
+#: WWW/Library/Implementation/HTNews.c:1782
+#, c-format
+msgid "%s, Articles %d-%d"
+msgstr "%s, Статьи %d-%d"
+
+#: WWW/Library/Implementation/HTNews.c:1805
+msgid "Earlier articles"
+msgstr "Более ранние Ñтатьи"
+
+#: WWW/Library/Implementation/HTNews.c:1818
+#, c-format
+msgid ""
+"\n"
+"There are about %d articles currently available in %s, IDs as follows:\n"
+"\n"
+msgstr ""
+"\n"
+"Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð´Ð¾Ñтупно около %d Ñтатей в %s Ñо Ñледующими идентификаторами:\n"
+"\n"
+
+#: WWW/Library/Implementation/HTNews.c:1880
+msgid "All available articles in "
+msgstr "Ð’Ñе доÑтупные Ñтатьи в "
+
+#: WWW/Library/Implementation/HTNews.c:2094
+msgid "Later articles"
+msgstr "Более поздние Ñтатьи"
+
+#: WWW/Library/Implementation/HTNews.c:2117
+msgid "Post to "
+msgstr "ПоÑлать в "
+
+#: WWW/Library/Implementation/HTNews.c:2338
+msgid "This client does not contain support for SNEWS URLs."
+msgstr "Этот клиент не Ñодержит поддержки Ð´Ð»Ñ URL SNEWS."
+
+#: WWW/Library/Implementation/HTNews.c:2545
+msgid "No target for raw text!"
+msgstr "Ðет цели Ð´Ð»Ñ Ð¾Ð±Ñ‹Ñ‡Ð½Ð¾Ð³Ð¾ текÑта!"
+
+#: WWW/Library/Implementation/HTNews.c:2575
+msgid "Connecting to NewsHost ..."
+msgstr "УÑтановление ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ Ð£Ð·Ð»Ð¾Ð¼ÐовоÑтей ..."
+
+#: WWW/Library/Implementation/HTNews.c:2627
+#, c-format
+msgid "Could not access %s."
+msgstr "Ðет доÑтупа к %s."
+
+#: WWW/Library/Implementation/HTNews.c:2733
+#, c-format
+msgid "Can't read news info. News host %.20s responded: %.200s"
+msgstr "Ðе удаетÑÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒ информацию о новоÑÑ‚ÑÑ…. Узел новоÑтей %.20s ответил: %.200s"
+
+#: WWW/Library/Implementation/HTNews.c:2737
+#, c-format
+msgid "Can't read news info, empty response from host %s"
+msgstr "Ðу удаетÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚ÑŒ информацию о новоÑÑ‚ÑÑ…, пуÑтой ответ от узла %s"
+
+#.
+#. * List available newsgroups. - FM
+#.
+#: WWW/Library/Implementation/HTNews.c:2941
+msgid "Reading list of available newsgroups."
+msgstr "Чтение ÑпиÑка доÑтупных групп новоÑтей."
+
+#: WWW/Library/Implementation/HTNews.c:2962
+msgid "Reading list of articles in newsgroup."
+msgstr "Чтение ÑпиÑка Ñтатей в группе новоÑтей."
+
+#.
+#. * Get an article from a news group. - FM
+#.
+#: WWW/Library/Implementation/HTNews.c:2968
+msgid "Reading news article."
+msgstr "Чтение Ñтатьи новоÑтей."
+
+#: WWW/Library/Implementation/HTNews.c:2998
+msgid "Sorry, could not load requested news."
+msgstr "Ðе удаетÑÑ Ð·Ð°Ð³Ñ€ÑƒÐ·Ð¸Ñ‚ÑŒ запрошенные новоÑти, извините."
+
+#: WWW/Library/Implementation/HTTCP.c:1286
+msgid "Address has invalid port"
+msgstr "Ðеверный порт у адреÑа"
+
+#: WWW/Library/Implementation/HTTCP.c:1362
+msgid "Address length looks invalid"
+msgstr "Длина адреÑа выглÑдит неверной"
+
+#: WWW/Library/Implementation/HTTCP.c:1622
+#: WWW/Library/Implementation/HTTCP.c:1640
+#, c-format
+msgid "Unable to locate remote host %s."
+msgstr "Ðе удаетÑÑ Ð¾Ð±Ð½Ð°Ñ€ÑƒÐ¶Ð¸Ñ‚ÑŒ удаленную машину %s."
+
+#. Not HTProgress, so warning won't be overwritten immediately;
+#. * but not HTAlert, because typically there will be other
+#. * alerts from the callers. - kw
+#.
+#: WWW/Library/Implementation/HTTCP.c:1637
+#: WWW/Library/Implementation/HTTelnet.c:115
+#, c-format
+msgid "Invalid hostname %s"
+msgstr "Ðеправильное Ð¸Ð¼Ñ Ð¼Ð°ÑˆÐ¸Ð½Ñ‹ %s"
+
+#: WWW/Library/Implementation/HTTCP.c:1651
+#, c-format
+msgid "Making %s connection to %s"
+msgstr "УÑтанавливаетÑÑ %s Ñоединение Ñ %s"
+
+#: WWW/Library/Implementation/HTTCP.c:1662
+msgid "socket failed."
+msgstr "ошибка Ñокета."
+
+#: WWW/Library/Implementation/HTTCP.c:1676
+#, c-format
+msgid "socket failed: family %d addr %s port %s."
+msgstr "ошибка Ñокета: ÑемейÑтво %d Ð°Ð´Ñ€ÐµÑ %s порт %s."
+
+#: WWW/Library/Implementation/HTTCP.c:1700
+msgid "Could not make connection non-blocking."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:1768
+msgid "Connection failed (too many retries)."
+msgstr "Ðе удаетÑÑ ÑƒÑтановить Ñоединение (Ñлишком много попыток)."
+
+#: WWW/Library/Implementation/HTTCP.c:1955
+msgid "Could not restore socket to blocking."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:2021
+#, fuzzy
+#| msgid "Connection failed (too many retries)."
+msgid "Socket read failed (too many tries)."
+msgstr "Ðе удаетÑÑ ÑƒÑтановить Ñоединение (Ñлишком много попыток)."
+
+#: WWW/Library/Implementation/HTTP.c:81
+#, c-format
+msgid "SSL callback:%s, preverify_ok=%d, ssl_okay=%d"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:432
+#, c-format
+msgid "Address contains a username: %s"
+msgstr "ÐÐ´Ñ€ÐµÑ Ñодержит Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ: %s"
+
+#: WWW/Library/Implementation/HTTP.c:486
+#, c-format
+msgid "Certificate issued by: %s"
+msgstr "Кем выдан Ñертификат: %s"
+
+#: WWW/Library/Implementation/HTTP.c:673
+msgid "This client does not contain support for HTTPS URLs."
+msgstr "Этот клиент не Ñодержит поддержки Ð´Ð»Ñ URL HTTPS."
+
+#: WWW/Library/Implementation/HTTP.c:698
+msgid "Unable to connect to remote host."
+msgstr "Ðе удаетÑÑ ÑƒÑтановить Ñоединение Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð½Ð¾Ð¹ машиной."
+
+#: WWW/Library/Implementation/HTTP.c:730
+msgid "Retrying connection without TLS."
+msgstr "Попытка уÑтановить Ñоединение без TLS."
+
+#: WWW/Library/Implementation/HTTP.c:773
+msgid "no issuer was found"
+msgstr "издатель не найден"
+
+#: WWW/Library/Implementation/HTTP.c:775
+msgid "issuer is not a CA"
+msgstr "издатель не ÑвлÑетÑÑ Ñ†ÐµÐ½Ñ‚Ñ€Ð¾Ð¼ Ñертификации"
+
+#: WWW/Library/Implementation/HTTP.c:777
+msgid "the certificate has no known issuer"
+msgstr "Ð´Ð»Ñ Ñертификата нет извеÑтного издателÑ"
+
+#: WWW/Library/Implementation/HTTP.c:779
+#, fuzzy
+#| msgid "The cookie has been eaten!"
+msgid "the certificate has been revoked"
+msgstr "Cookie удален!"
+
+#: WWW/Library/Implementation/HTTP.c:781
+msgid "the certificate is not trusted"
+msgstr "Ñертификат не ÑвлÑетÑÑ Ð´Ð¾Ð²ÐµÑ€ÐµÐ½Ð½Ñ‹Ð¼"
+
+#: WWW/Library/Implementation/HTTP.c:855
+#, c-format
+msgid "Verified connection to %s (cert=%s)"
+msgstr "Проверенное подключение к %s (cert=%s)"
+
+#: WWW/Library/Implementation/HTTP.c:903 WWW/Library/Implementation/HTTP.c:945
+#, c-format
+msgid "Verified connection to %s (subj=%s)"
+msgstr "Проверенное подключение к %s (subj=%s)"
+
+#: WWW/Library/Implementation/HTTP.c:975
+msgid "Can't find common name in certificate"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:978
+#, c-format
+msgid "SSL error:host(%s)!=cert(%s)-Continue?"
+msgstr "Ошибка SSL:host(%s)!=cert(%s)-Продолжить?"
+
+#: WWW/Library/Implementation/HTTP.c:991
+#, c-format
+msgid "UNVERIFIED connection to %s (cert=%s)"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:1000
+#, c-format
+msgid "Secure %d-bit %s (%s) HTTP connection"
+msgstr "БезопаÑное HTTP-Ñоединение: %d бит %s (%s)"
+
+#: WWW/Library/Implementation/HTTP.c:1467
+msgid "Sending HTTP request."
+msgstr "ПоÑылка HTTP-запроÑа."
+
+#: WWW/Library/Implementation/HTTP.c:1509
+msgid "Unexpected network write error; connection aborted."
+msgstr "ÐÐµÐ¾Ð¶Ð¸Ð´Ð°Ð½Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° запиÑи по Ñети; Ñоединение прервано."
+
+#: WWW/Library/Implementation/HTTP.c:1515
+msgid "HTTP request sent; waiting for response."
+msgstr "HTTP-Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð¿Ð¾Ñлан; ожидаетÑÑ Ð¾Ñ‚Ð²ÐµÑ‚."
+
+#: WWW/Library/Implementation/HTTP.c:1588
+#: WWW/Library/Implementation/HTTP.c:1598
+msgid "Unexpected network read error; connection aborted."
+msgstr "ÐÐµÐ¾Ð¶Ð¸Ð´Ð°Ð½Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð¿Ð¾ Ñети; Ñоединение прервано."
+
+#.
+#. * HTTP/1.1 Informational statuses.
+#. * 100 Continue.
+#. * 101 Switching Protocols.
+#. * > 101 is unknown.
+#. * We should never get these, and they have only the status
+#. * line and possibly other headers, so we'll deal with them by
+#. * showing the full header to the user as text/plain. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:1800
+msgid "Got unexpected Informational Status."
+msgstr "Получен неожиданный Информационный СтатуÑ."
+
+#.
+#. * Reset Content. The server has fulfilled the request but
+#. * nothing is returned and we should reset any form
+#. * content. We'll instruct the user to do that, and
+#. * restore the current document. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:1834
+msgid "Request fulfilled. Reset Content."
+msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½. Обновление Содержимого."
+
+#. Not Modified
+#.
+#. * We didn't send an "If-Modified-Since" header, so this
+#. * status is inappropriate. We'll deal with it by showing
+#. * the full header to the user as text/plain. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:1949
+msgid "Got unexpected 304 Not Modified status."
+msgstr "Получен неожиданный ÑÑ‚Ð°Ñ‚ÑƒÑ 304 (Ðе Модифицировано)."
+
+#: WWW/Library/Implementation/HTTP.c:2012
+msgid "Redirection of POST content requires user approval."
+msgstr "Перенаправление Ñодержимого POST требует Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ."
+
+#: WWW/Library/Implementation/HTTP.c:2027
+msgid "Have POST content. Treating Permanent Redirection as Temporary.\n"
+msgstr "ИмеетÑÑ Ñодержимое POST. Трактовка ПоÑтоÑнного ÐŸÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ ÐºÐ°Ðº Временного.\n"
+
+#: WWW/Library/Implementation/HTTP.c:2071
+msgid "Retrying with access authorization information."
+msgstr "Повторение Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸ÐµÐ¹ о правах доÑтупа."
+
+#: WWW/Library/Implementation/HTTP.c:2083
+msgid "Show the 401 message body?"
+msgstr "Показывать тело ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ 401?"
+
+#: WWW/Library/Implementation/HTTP.c:2127
+msgid "Show the 407 message body?"
+msgstr "Показывать тело ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ 407?"
+
+#.
+#. * Bad or unknown server_status number. Take a chance and hope
+#. * there is something to display. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2227
+msgid "Unknown status reply from server!"
+msgstr "ÐеизвеÑтный ÑÑ‚Ð°Ñ‚ÑƒÑ Ð¾Ñ‚Ð²ÐµÑ‚Ð° от Ñервера!"
+
+#: WWW/Library/Implementation/HTTelnet.c:113
+#, c-format
+msgid "remote %s session:"
+msgstr "удаленный %s ÑеанÑ:"
+
+#: WWW/Library/Implementation/HTWAIS.c:163
+msgid "Could not connect to WAIS server."
+msgstr "Ðе удаетÑÑ ÑƒÑтановить Ñоединение Ñ Ñервером WAIS."
+
+#: WWW/Library/Implementation/HTWAIS.c:171
+msgid "Could not open WAIS connection for reading."
+msgstr "Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ WAIS-Ñоединение Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ."
+
+#: WWW/Library/Implementation/HTWAIS.c:193
+msgid "Diagnostic code is "
+msgstr "Код диагноÑтики "
+
+#: WWW/Library/Implementation/HTWAIS.c:464
+msgid "Index "
+msgstr "Ð˜Ð½Ð´ÐµÐºÑ "
+
+#: WWW/Library/Implementation/HTWAIS.c:468
+#, c-format
+msgid " contains the following %d item%s relevant to \""
+msgstr " Ñодержит Ñледующие %d Ñлементов%s, отноÑÑщихÑÑ Ðº \""
+
+#: WWW/Library/Implementation/HTWAIS.c:476
+msgid "The first figure after each entry is its relative score, "
+msgstr "ÐŸÐµÑ€Ð²Ð°Ñ Ñ„Ð¸Ð³ÑƒÑ€Ð° поÑле каждого Ñлемента ÑвлÑетÑÑ ÐµÐµ отноÑительным Ñчетом, "
+
+#: WWW/Library/Implementation/HTWAIS.c:477
+msgid "the second is the number of lines in the item."
+msgstr "Ð²Ñ‚Ð¾Ñ€Ð°Ñ ÑвлÑетÑÑ Ñ‡Ð¸Ñлом Ñтрок в Ñлементе."
+
+#: WWW/Library/Implementation/HTWAIS.c:519
+msgid " (bad file name)"
+msgstr " (неверное Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°)"
+
+#: WWW/Library/Implementation/HTWAIS.c:545
+msgid "(bad doc id)"
+msgstr "(неверных идентификатор документа)"
+
+#: WWW/Library/Implementation/HTWAIS.c:561
+msgid "(Short Header record, can't display)"
+msgstr "(ЗапиÑÑŒ Короткого Заголовка, не удаетÑÑ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð·Ð¸Ñ‚ÑŒ)"
+
+#: WWW/Library/Implementation/HTWAIS.c:568
+msgid ""
+"\n"
+"Long Header record, can't display\n"
+msgstr ""
+"\n"
+"ЗапиÑÑŒ Длинного Заголовка, не удаетÑÑ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð·Ð¸Ñ‚ÑŒ\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:575
+msgid ""
+"\n"
+"Text record\n"
+msgstr ""
+"\n"
+"ТекÑÑ‚Ð¾Ð²Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:584
+msgid ""
+"\n"
+"Headline record, can't display\n"
+msgstr ""
+"\n"
+"ЗапиÑÑŒ Заголовка, не удаетÑÑ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð·Ð¸Ñ‚ÑŒ\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:592
+msgid ""
+"\n"
+"Code record, can't display\n"
+msgstr ""
+"\n"
+"ЗапиÑÑŒ Кода, не удаетÑÑ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð·Ð¸Ñ‚ÑŒ\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:696
+msgid "Syntax error in WAIS URL"
+msgstr "СинтакÑичеÑÐºÐ°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° в WAIS URL"
+
+#: WWW/Library/Implementation/HTWAIS.c:768
+msgid " (WAIS Index)"
+msgstr " (Ð˜Ð½Ð´ÐµÐºÑ WAIS)"
+
+#: WWW/Library/Implementation/HTWAIS.c:775
+msgid "WAIS Index: "
+msgstr "Ð˜Ð½Ð´ÐµÐºÑ WAIS: "
+
+#: WWW/Library/Implementation/HTWAIS.c:781
+msgid "This is a link for searching the "
+msgstr "Это ÑÑылка Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка в "
+
+#: WWW/Library/Implementation/HTWAIS.c:785
+msgid " WAIS Index.\n"
+msgstr " индекÑе WAIS.\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:814
+msgid ""
+"\n"
+"Enter the 's'earch command and then specify search words.\n"
+msgstr ""
+"\n"
+"Введите команду поиÑка (s), и затем задайте поиÑковые Ñлова.\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:836
+msgid " (in "
+msgstr " (в "
+
+#: WWW/Library/Implementation/HTWAIS.c:845
+msgid "WAIS Search of \""
+msgstr "ПоиÑк WAIS \""
+
+#: WWW/Library/Implementation/HTWAIS.c:849
+msgid "\" in: "
+msgstr "\" в: "
+
+#: WWW/Library/Implementation/HTWAIS.c:864
+msgid "HTWAIS: Request too large."
+msgstr "HTWAIS: Ð—Ð°Ð¿Ñ€Ð¾Ñ Ñлишком большой."
+
+#: WWW/Library/Implementation/HTWAIS.c:873
+msgid "Searching WAIS database..."
+msgstr "ПоиÑк в базе данных WAIS..."
+
+#: WWW/Library/Implementation/HTWAIS.c:883
+msgid "Search interrupted."
+msgstr "ПоиÑк прерван."
+
+#: WWW/Library/Implementation/HTWAIS.c:934
+msgid "Can't convert format of WAIS document"
+msgstr "Ðе удаетÑÑ Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ñ‚ÑŒ формат документа WAIS"
+
+#: WWW/Library/Implementation/HTWAIS.c:978
+msgid "HTWAIS: Request too long."
+msgstr "HTWAIS: Ð—Ð°Ð¿Ñ€Ð¾Ñ Ñлишком длинный."
+
+#.
+#. * Actually do the transaction given by request_message.
+#.
+#: WWW/Library/Implementation/HTWAIS.c:992
+msgid "Fetching WAIS document..."
+msgstr "Получение документа WAIS..."
+
+#. display_search_response(target, retrieval_response,
+#. wais_database, keywords);
+#: WWW/Library/Implementation/HTWAIS.c:1031
+msgid "No text was returned!\n"
+msgstr "ТекÑÑ‚ не был возвращен!\n"
+
+#: WWW/Library/Implementation/HTWSRC.c:301
+msgid " NOT GIVEN in source file; "
+msgstr " ÐЕ ЗÐДÐРв иÑходном файле; "
+
+#: WWW/Library/Implementation/HTWSRC.c:324
+msgid " WAIS source file"
+msgstr " иÑходный файл WAIS"
+
+#: WWW/Library/Implementation/HTWSRC.c:331
+msgid " description"
+msgstr " опиÑание"
+
+#: WWW/Library/Implementation/HTWSRC.c:341
+msgid "Access links"
+msgstr "СÑылки доÑтупа"
+
+#: WWW/Library/Implementation/HTWSRC.c:362
+msgid "Direct access"
+msgstr "ПрÑмой доÑтуп"
+
+#. * Proxy will be used if defined, so let user know that - FM *
+#: WWW/Library/Implementation/HTWSRC.c:365
+msgid " (or via proxy server, if defined)"
+msgstr " (или через прокÑи-Ñервер, еÑли он определен)"
+
+#: WWW/Library/Implementation/HTWSRC.c:380
+msgid "Maintainer"
+msgstr "ОтветÑтвенный"
+
+#: WWW/Library/Implementation/HTWSRC.c:388
+msgid "Host"
+msgstr "Машина"
+
+#: src/GridText.c:699
+msgid "Memory exhausted, display interrupted!"
+msgstr "ПамÑÑ‚ÑŒ иÑчерпана, отображение прервано!"
+
+#: src/GridText.c:704
+msgid "Memory exhausted, will interrupt transfer!"
+msgstr "ПамÑÑ‚ÑŒ иÑчерпана, передача данных будет прервана!"
+
+#: src/GridText.c:3685
+msgid " *** MEMORY EXHAUSTED ***"
+msgstr " *** ПÐМЯТЬ ИСЧЕРПÐÐÐ ***"
+
+#: src/GridText.c:6146
+msgid "text entry field"
+msgstr "поле ввода текÑта"
+
+#: src/GridText.c:6149
+msgid "password entry field"
+msgstr "поле ввода паролÑ"
+
+#: src/GridText.c:6152
+msgid "checkbox"
+msgstr "незавиÑÐ¸Ð¼Ð°Ñ ÐºÐ½Ð¾Ð¿ÐºÐ°"
+
+#: src/GridText.c:6155
+msgid "radio button"
+msgstr "завиÑÐ¸Ð¼Ð°Ñ ÐºÐ½Ð¾Ð¿ÐºÐ°"
+
+#: src/GridText.c:6158
+msgid "submit button"
+msgstr "кнопка поÑылки"
+
+#: src/GridText.c:6161
+msgid "reset button"
+msgstr "кнопка очиÑтки"
+
+#: src/GridText.c:6164
+#, fuzzy
+#| msgid "submit button"
+msgid "script button"
+msgstr "кнопка поÑылки"
+
+#: src/GridText.c:6167
+msgid "popup menu"
+msgstr "вÑплывающее меню"
+
+#: src/GridText.c:6170
+msgid "hidden form field"
+msgstr "Ñкрытое поле формы"
+
+#: src/GridText.c:6173
+msgid "text entry area"
+msgstr "облаÑÑ‚ÑŒ ввода текÑта"
+
+#: src/GridText.c:6176
+msgid "range entry field"
+msgstr "поле ввода диапазона"
+
+#: src/GridText.c:6179
+msgid "file entry field"
+msgstr "поле ввода файла"
+
+#: src/GridText.c:6182
+msgid "text-submit field"
+msgstr "текÑтовое поле поÑылки"
+
+#: src/GridText.c:6185
+msgid "image-submit button"
+msgstr "графичеÑÐºÐ°Ñ ÐºÐ½Ð¾Ð¿ÐºÐ° поÑылки"
+
+#: src/GridText.c:6188
+msgid "keygen field"
+msgstr "поле keygen"
+
+#: src/GridText.c:6191
+msgid "unknown form field"
+msgstr "неизвеÑтное поле формы"
+
+#: src/GridText.c:6211 src/GridText.c:6218 src/LYList.c:248
+msgid "unknown field or link"
+msgstr "неизвеÑтное поле или ÑÑылка"
+
+#: src/GridText.c:10649
+msgid "Can't open file for uploading"
+msgstr "Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ файл Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸!"
+
+#: src/GridText.c:11837
+#, c-format
+msgid "Submitting %s"
+msgstr "ПоÑылка %s"
+
+#. ugliness has happened; inform user and do the best we can
+#: src/GridText.c:12894
+msgid "Hang Detect: TextAnchor struct corrupted - suggest aborting!"
+msgstr ""
+
+#. don't show previous state
+#: src/GridText.c:13056
+msgid "Wrap lines to fit displayed area?"
+msgstr "ПеренеÑти Ñтроки, чтобы попаÑÑ‚ÑŒ в облаÑÑ‚ÑŒ отображениÑ?"
+
+#: src/GridText.c:13696
+msgid "Very long lines have been truncated!"
+msgstr "Очень длинные Ñтроки были уÑечены!"
+
+#: src/HTAlert.c:164 src/LYShowInfo.c:364 src/LYShowInfo.c:368
+msgid "bytes"
+msgstr "байт"
+
+#.
+#. * If we know the total size of the file, we can compute
+#. * a percentage, and show a corresponding progress bar.
+#.
+#: src/HTAlert.c:303 src/HTAlert.c:329
+#, c-format
+msgid "Read %s of data"
+msgstr "Прочитано %s данных"
+
+#: src/HTAlert.c:326
+#, c-format
+msgid "Read %s of %s of data"
+msgstr "Прочитано %s из %s данных"
+
+#: src/HTAlert.c:335
+#, c-format
+msgid ", %s/sec"
+msgstr ", %s/Ñек"
+
+#: src/HTAlert.c:347
+#, c-format
+msgid " (stalled for %s)"
+msgstr " (задержано на %s)"
+
+#: src/HTAlert.c:351
+#, c-format
+msgid ", ETA %s"
+msgstr ", ETA %s"
+
+#: src/HTAlert.c:373
+msgid " (Press 'z' to abort)"
+msgstr " (Ðажмите 'z' чтобы прервать)"
+
+#. Meta-note: don't move the following note from its place right
+#. in front of the first gettext(). As it is now, it should
+#. automatically appear in generated lynx.pot files. - kw
+#.
+#. NOTE TO TRANSLATORS: If you provide a translation for "yes", lynx
+#. * will take the first byte of the translation as a positive response
+#. * to Yes/No questions. If you provide a translation for "no", lynx
+#. * will take the first byte of the translation as a negative response
+#. * to Yes/No questions. For both, lynx will also try to show the
+#. * first byte in the prompt as a character, instead of (y) or (n),
+#. * respectively. This will not work right for multibyte charsets!
+#. * Don't translate "yes" and "no" for CJK character sets (or translate
+#. * them to "yes" and "no"). For a translation using UTF-8, don't
+#. * translate if the translation would begin with anything but a 7-bit
+#. * (US_ASCII) character. That also means do not translate if the
+#. * translation would begin with anything but a 7-bit character, if
+#. * you use a single-byte character encoding (a charset like ISO-8859-n)
+#. * but anticipate that the message catalog may be used re-encoded in
+#. * UTF-8 form.
+#. * For translations using other character sets, you may also wish to
+#. * leave "yes" and "no" untranslated, if using (y) and (n) is the
+#. * preferred behavior.
+#. * Lynx will also accept y Y n N as responses unless there is a conflict
+#. * with the first letter of the "yes" or "no" translation.
+#.
+#: src/HTAlert.c:411 src/HTAlert.c:459
+msgid "yes"
+msgstr "yes"
+
+#: src/HTAlert.c:414 src/HTAlert.c:460
+msgid "no"
+msgstr "no"
+
+#.
+#. * Special-purpose workaround for gettext support (we should do
+#. * this in a more general way) -TD
+#. *
+#. * NOTE TO TRANSLATORS: If the prompt has been rendered into
+#. * another language, and if yes/no are distinct, assume the
+#. * translator can make an ordered list in parentheses with one
+#. * capital letter for each as we assumed in HTConfirmDefault().
+#. * The list has to be in the same order as in the original message,
+#. * and the four capital letters chosen to not match those in the
+#. * original unless they have the same position.
+#. *
+#. * Example:
+#. * (Y/N/Always/neVer) - English (original)
+#. * (O/N/Toujours/Jamais) - French
+#.
+#: src/HTAlert.c:913
+msgid "Y/N/A/V"
+msgstr "Y/N/A/V"
+
+#: src/HTML.c:5915
+msgid "Description:"
+msgstr "ОпиÑание:"
+
+#: src/HTML.c:5920
+msgid "(none)"
+msgstr "(нет)"
+
+#: src/HTML.c:5924
+msgid "Filepath:"
+msgstr "Путь к файлу:"
+
+#: src/HTML.c:5930
+msgid "(unknown)"
+msgstr "(неизвеÑтно)"
+
+#: src/HTML.c:7370
+msgid "Document has only hidden links. Use the 'l'ist command."
+msgstr "Документ Ñодержит только Ñкрытые ÑÑылки. ИÑпользуйте команду 'l'ist."
+
+#: src/HTML.c:7869
+msgid "Source cache error - disk full?"
+msgstr "Ошибка кÑÑˆÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ñходных файлов. ДиÑк переполнен?"
+
+#: src/HTML.c:7882
+msgid "Source cache error - not enough memory!"
+msgstr "Ошибка кÑÑˆÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ñходных файлов. ÐедоÑтаточно памÑти!"
+
+#: src/LYBookmark.c:167
+msgid ""
+" This file is an HTML representation of the X Mosaic hotlist file.\n"
+" Outdated or invalid links may be removed by using the\n"
+" remove bookmark command, it is usually the 'R' key but may have\n"
+" been remapped by you or your system administrator."
+msgstr ""
+" Этот файл ÑвлÑетÑÑ HTML-предÑтавлением файла закладок X Mosaic.\n"
+" УÑтаревшие и неправильные ÑÑылки могут быть удалены Ñ Ð¸Ñпользованием\n"
+" команды ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ»Ð°Ð´ÐºÐ¸, обычно клавиша 'R', Ñ…Ð¾Ñ‚Ñ Ð¾Ð½Ð° может быть\n"
+" переназначена вами или ÑиÑтемным админиÑтратором."
+
+#: src/LYBookmark.c:376
+#, c-format
+msgid ""
+" You can delete links by the 'R' key<br>\n"
+"<ol>\n"
+msgstr ""
+" Ð’Ñ‹ можете удалÑÑ‚ÑŒ ÑÑылки клавишей 'R'<br>\n"
+"<ol>\n"
+
+#: src/LYBookmark.c:379
+msgid ""
+" You can delete links using the remove bookmark command. It is usually\n"
+" the 'R' key but may have been remapped by you or your system\n"
+" administrator."
+msgstr ""
+" Ð’Ñ‹ можете удалÑÑ‚ÑŒ ÑÑылки иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñƒ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ»Ð°Ð´ÐºÐ¸. Обычно Ñто\n"
+" делаетÑÑ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ клавиши 'R', но может быть переназначено вами или\n"
+" вашим ÑиÑтемным админиÑтратором."
+
+#: src/LYBookmark.c:383
+msgid ""
+" This file also may be edited with a standard text editor to delete\n"
+" outdated or invalid links, or to change their order."
+msgstr ""
+" Этот файл также может быть отредактирован Ñтандартным текÑтовым\n"
+" редактором Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ ÑƒÑтаревших или неправильных ÑÑылок, или\n"
+" Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸Ñ… порÑдка."
+
+#: src/LYBookmark.c:386
+msgid ""
+"Note: if you edit this file manually\n"
+" you should not change the format within the lines\n"
+" or add other HTML markup.\n"
+" Make sure any bookmark link is saved as a single line."
+msgstr ""
+"Примечание: еÑли вы редактируете Ñтот файл вручную,\n"
+" вы не должны изменÑÑ‚ÑŒ формат Ñтрок\n"
+" или добавлÑÑ‚ÑŒ другие теги HTML.\n"
+" УбедитеÑÑŒ, что ÐºÐ°Ð¶Ð´Ð°Ñ Ð·Ð°ÐºÐ»Ð°Ð´ÐºÐ° Ñохранена на единÑтвенной Ñтроке."
+
+#: src/LYBookmark.c:684
+#, c-format
+msgid "File may be recoverable from %s during this session"
+msgstr "Файл может быть воÑÑтановлен из %s в течение Ñтого ÑеанÑа"
+
+#: src/LYCgi.c:158
+#, c-format
+msgid "Do you want to execute \"%s\"?"
+msgstr "Выполнить «%s»?"
+
+#.
+#. * Neither the path as given nor any components examined by backing up
+#. * were stat()able. - kw
+#.
+#: src/LYCgi.c:273
+msgid "Unable to access cgi script"
+msgstr "Ошибка доÑтупа к cgi-Ñкрипту"
+
+#: src/LYCgi.c:707 src/LYCgi.c:710
+msgid "Good Advice"
+msgstr "Хороший Ñовет"
+
+#: src/LYCgi.c:714
+msgid "An excellent http server for VMS is available via"
+msgstr "Отличный http Ñервер Ð´Ð»Ñ VMS доÑтупен через"
+
+#: src/LYCgi.c:721
+msgid "this link"
+msgstr "Ñту ÑÑылку"
+
+#: src/LYCgi.c:725
+msgid "It provides state of the art CGI script support.\n"
+msgstr "ПредоÑтавлÑÐµÐ¼Ð°Ñ Ð¸Ð¼ поддержка CGI-Ñкриптов ÑвлÑетÑÑ Ð¿Ð¾Ñледним Ñловом техники.\n"
+
+#: src/LYClean.c:122
+msgid "Exiting via interrupt:"
+msgstr "Выход по прерыванию:"
+
+#: src/LYCookie.c:2537
+msgid "(from a previous session)"
+msgstr "(из предыдущего ÑеанÑа)"
+
+#: src/LYCookie.c:2598
+msgid "Maximum Gobble Date:"
+msgstr ""
+
+#: src/LYCookie.c:2637
+msgid "Internal"
+msgstr "Внутренний"
+
+#: src/LYCookie.c:2638
+msgid "cookie_domain_flag_set error, aborting program"
+msgstr "ошибка cookie_domain_flag_set error, преграмма прерываетÑÑ"
+
+#: src/LYCurses.c:1297
+msgid "Terminal initialisation failed - unknown terminal type?"
+msgstr "Ошибка при инициализации терминала - неизвеÑтный тип терминала?"
+
+#: src/LYCurses.c:1780
+msgid "Terminal ="
+msgstr "Терминал ="
+
+#: src/LYCurses.c:1784
+msgid "You must use a vt100, 200, etc. terminal with this program."
+msgstr "С Ñтой программой вы должны иÑпользовать терминал vt100, 200, и Ñ‚.д."
+
+#: src/LYCurses.c:1833
+msgid "Your Terminal type is unknown!"
+msgstr "Тип вашего Терминала неизвеÑтен!"
+
+#: src/LYCurses.c:1834
+msgid "Enter a terminal type:"
+msgstr "Введите тип терминала:"
+
+#: src/LYCurses.c:1848
+msgid "TERMINAL TYPE IS SET TO"
+msgstr "ТИП ТЕРМИÐÐЛРУСТÐÐОВЛЕРВ"
+
+#: src/LYCurses.c:2398
+#, c-format
+msgid ""
+"\n"
+"A Fatal error has occurred in %s Ver. %s\n"
+msgstr ""
+"\n"
+" Ð’ %s Вер. %s произошла Ñ„Ð°Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°.\n"
+
+#: src/LYCurses.c:2401
+#, c-format
+msgid ""
+"\n"
+"Please notify your system administrator to confirm a bug, and if\n"
+"confirmed, to notify the lynx-dev list. Bug reports should have concise\n"
+"descriptions of the command and/or URL which causes the problem, the\n"
+"operating system name with version number, the TCPIP implementation, the\n"
+"TRACEBACK if it can be captured, and any other relevant information.\n"
+msgstr ""
+"\n"
+"ПожалуйÑта, попроÑите вашего ÑиÑтемного админиÑтратора подтвердить\n"
+"ошибку, и, еÑли она подтвердитÑÑ, Ñообщите в ÑпиÑок раÑÑылки lynx-dev.\n"
+"Ð¡Ð¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ð± ошибках должны Ñодержать точные опиÑÐ°Ð½Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ‹ и/или URL,\n"
+"которые вызывают проблему, название и верÑию операционной ÑиÑтемы,\n"
+"реализацию TCPIP, Ñлед вызовов TRACEBACK, еÑли его можно получить, и любую\n"
+"другую отноÑÑщуюÑÑ Ðº делу информацию.\n"
+
+#: src/LYEdit.c:272
+#, fuzzy, c-format
+#| msgid "Error processing line %d of %s\n"
+msgid "Error starting editor, %s"
+msgstr "Ошибка при обработке Ñтроки %d из %s\n"
+
+#: src/LYEdit.c:275
+msgid "Editor killed by signal"
+msgstr "Редактор убит Ñигналом"
+
+#: src/LYEdit.c:280
+#, fuzzy, c-format
+#| msgid "Editor returned with error status, %s"
+msgid "Editor returned with error status %s"
+msgstr "Редактор завершилÑÑ Ñо ÑтатуÑом ошибки, %s"
+
+#: src/LYDownload.c:509
+msgid "Downloaded link:"
+msgstr "Ð¡ÐºÐ°Ñ‡Ð°Ð½Ð½Ð°Ñ ÑÑылка:"
+
+#: src/LYDownload.c:514
+msgid "Suggested file name:"
+msgstr "Предлагаемое Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°:"
+
+#: src/LYDownload.c:519
+msgid "Standard download options:"
+msgstr "Стандартные опции Ð´Ð»Ñ ÑкачиваниÑ:"
+
+#: src/LYDownload.c:520
+msgid "Download options:"
+msgstr "Опции ÑкачиваниÑ:"
+
+#: src/LYDownload.c:536
+msgid "Save to disk"
+msgstr "Сохранить на диÑк"
+
+#: src/LYDownload.c:550
+#, fuzzy
+#| msgid "View the file "
+msgid "View temporary file"
+msgstr "ПроÑмотреть файл"
+
+#: src/LYDownload.c:557
+msgid "Save to disk disabled."
+msgstr "Сохранение на диÑк отключено."
+
+#: src/LYDownload.c:561 src/LYPrint.c:1322
+msgid "Local additions:"
+msgstr "Локальные дополнениÑ:"
+
+#: src/LYDownload.c:572 src/LYUpload.c:209
+msgid "No Name Given"
+msgstr "Ð˜Ð¼Ñ Ð½Ðµ задано"
+
+#: src/LYHistory.c:679
+msgid "You selected:"
+msgstr "Вы выбрали:"
+
+#: src/LYHistory.c:703 src/LYHistory.c:932
+msgid "(no address)"
+msgstr "(нет адреÑа)"
+
+#: src/LYHistory.c:707
+msgid " (internal)"
+msgstr " (внутренний)"
+
+#: src/LYHistory.c:709
+msgid " (was internal)"
+msgstr " (был внутренний)"
+
+#: src/LYHistory.c:807
+msgid " (From History)"
+msgstr " (Из ИÑтории)"
+
+#: src/LYHistory.c:852
+msgid "You visited (POSTs, bookmark, menu and list files excluded):"
+msgstr "Ð’Ñ‹ поÑетили (POST, закладки, меню и ÑпиÑки файлов иÑключаютÑÑ):"
+
+#: src/LYHistory.c:1154
+msgid "(No messages yet)"
+msgstr "(Пока Ñообщений нет)"
+
+#: src/LYLeaks.c:222
+msgid "Invalid pointer detected."
+msgstr "Обнаружен неверный указатель."
+
+#: src/LYLeaks.c:224 src/LYLeaks.c:262
+msgid "Sequence:"
+msgstr "ПоÑледовательноÑÑ‚ÑŒ:"
+
+#: src/LYLeaks.c:227 src/LYLeaks.c:265
+msgid "Pointer:"
+msgstr "Указатель:"
+
+#: src/LYLeaks.c:236 src/LYLeaks.c:243 src/LYLeaks.c:284
+msgid "FileName:"
+msgstr "ИмÑФайла:"
+
+#: src/LYLeaks.c:239 src/LYLeaks.c:246 src/LYLeaks.c:287 src/LYLeaks.c:298
+msgid "LineCount:"
+msgstr "ÐомерСтроки:"
+
+#: src/LYLeaks.c:260
+msgid "Memory leak detected."
+msgstr "Обнаружена утечка памÑти."
+
+#: src/LYLeaks.c:268
+msgid "Contains:"
+msgstr "Содержит:"
+
+#: src/LYLeaks.c:281
+msgid "ByteSize:"
+msgstr "РазмерБайта:"
+
+#: src/LYLeaks.c:295
+msgid "realloced:"
+msgstr "выделено заново:"
+
+#: src/LYLeaks.c:316
+msgid "Total memory leakage this run:"
+msgstr "ÐžÐ±Ñ‰Ð°Ñ ÑƒÑ‚ÐµÑ‡ÐºÐ° памÑти за Ñтот запуÑк:"
+
+#: src/LYLeaks.c:320
+msgid "Peak allocation"
+msgstr ""
+
+#: src/LYLeaks.c:322
+msgid "Bytes allocated"
+msgstr "Выделено байт"
+
+#: src/LYLeaks.c:324
+msgid "Total mallocs"
+msgstr ""
+
+#: src/LYLeaks.c:326
+msgid "Total frees"
+msgstr ""
+
+#: src/LYList.c:88
+msgid "References in "
+msgstr "СÑылок в "
+
+#: src/LYList.c:91
+msgid "this document:"
+msgstr "Ñтом документе:"
+
+#: src/LYList.c:97
+msgid "Visible links:"
+msgstr "Видимых ÑÑылок:"
+
+#: src/LYList.c:201 src/LYList.c:312
+msgid "Hidden links:"
+msgstr "Скрытых ÑÑылок:"
+
+#: src/LYList.c:349
+msgid "References"
+msgstr "СÑылки"
+
+#: src/LYList.c:353
+msgid "Visible links"
+msgstr "Видимые ÑÑылки"
+
+#: src/LYLocal.c:289
+#, c-format
+msgid "Unable to get status of '%s'."
+msgstr "Ðевозможно получить ÑÑ‚Ð°Ñ‚ÑƒÑ '%s'."
+
+#: src/LYLocal.c:354
+msgid "The selected item is not a file or a directory! Request ignored."
+msgstr "Выбранный Ñлемент не ÑвлÑетÑÑ Ñ„Ð°Ð¹Ð»Ð¾Ð¼ или каталогом! Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð¸Ð³Ð½Ð¾Ñ€Ð¸Ñ€Ð¾Ð²Ð°Ð½."
+
+#: src/LYLocal.c:455
+#, c-format
+msgid "Unable to %s due to system error!"
+msgstr "Ðе удаетÑÑ %s вÑледÑтвие ÑиÑтемной ошибки!"
+
+#: src/LYLocal.c:489
+#, c-format
+msgid "Probable failure to %s due to system error!"
+msgstr "Возможно ошибка %s вÑледÑтвие ÑиÑтемной ошибки!"
+
+#: src/LYLocal.c:554 src/LYLocal.c:577
+#, c-format
+msgid "remove %s"
+msgstr "удалить %s"
+
+#: src/LYLocal.c:597
+#, c-format
+msgid "touch %s"
+msgstr ""
+
+#: src/LYLocal.c:627
+#, c-format
+msgid "move %s to %s"
+msgstr "перемеÑтить %s в %s"
+
+#: src/LYLocal.c:675
+msgid "There is already a directory with that name! Request ignored."
+msgstr "Каталог Ñ Ñ‚Ð°ÐºÐ¸Ð¼ именем уже ÑущеÑтвует! Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð¸Ð³Ð½Ð¾Ñ€Ð¸Ñ€Ð¾Ð²Ð°Ð½."
+
+#: src/LYLocal.c:677
+msgid "There is already a file with that name! Request ignored."
+msgstr "Файл Ñ Ñ‚Ð°ÐºÐ¸Ð¼ именем уже ÑущеÑтвует! Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð¸Ð³Ð½Ð¾Ñ€Ð¸Ñ€Ð¾Ð²Ð°Ð½."
+
+#: src/LYLocal.c:679
+msgid "The specified name is already in use! Request ignored."
+msgstr "Указанное Ð¸Ð¼Ñ ÑƒÐ¶Ðµ иÑпользуетÑÑ! Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð¸Ð³Ð½Ð¾Ñ€Ð¸Ñ€Ð¾Ð²Ð°Ð½."
+
+#: src/LYLocal.c:691
+msgid "Destination has different owner! Request denied."
+msgstr "Файл Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¸Ð¼ÐµÐµÑ‚ другого владельца! Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð·Ð°Ð¿Ñ€ÐµÑ‰ÐµÐ½."
+
+#: src/LYLocal.c:694
+msgid "Destination is not a valid directory! Request denied."
+msgstr "Файл Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð½Ðµ ÑвлÑетÑÑ Ð¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ñ‹Ð¼ каталогом! Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð·Ð°Ð¿Ñ€ÐµÑ‰ÐµÐ½."
+
+#: src/LYLocal.c:710
+msgid "Source and destination are the same location! Request ignored!"
+msgstr "ИÑточник и путь Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ñовпадают! Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð¸Ð³Ð½Ð¾Ñ€Ð¸Ñ€Ð¾Ð²Ð°Ð½!"
+
+#: src/LYLocal.c:734
+msgid "Remove all tagged files and directories?"
+msgstr "Удалить вÑе отмеченные файлы и каталоги?"
+
+#: src/LYLocal.c:807
+msgid "Enter new location for tagged items: "
+msgstr "Введите новое раÑположение Ð´Ð»Ñ Ð¾Ñ‚Ð¼ÐµÑ‡ÐµÐ½Ð½Ñ‹Ñ… Ñлементов: "
+
+#: src/LYLocal.c:905
+msgid "Enter new name for directory: "
+msgstr "Введите новое Ð¸Ð¼Ñ Ð´Ð»Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð°: "
+
+#: src/LYLocal.c:907
+msgid "Enter new name for file: "
+msgstr "Введите новое Ð¸Ð¼Ñ Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð°: "
+
+#: src/LYLocal.c:919
+msgid "Illegal character (path-separator) found! Request ignored."
+msgstr "Ðайден недопуÑтимый Ñимвол (разделитель пути)! Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð¸Ð³Ð½Ð¾Ñ€Ð¸Ñ€Ð¾Ð²Ð°Ð½."
+
+#: src/LYLocal.c:969
+msgid "Enter new location for directory: "
+msgstr "Введите новое меÑто раÑÐ¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð°: "
+
+#: src/LYLocal.c:971
+msgid "Enter new location for file: "
+msgstr "Введите новое меÑто раÑÐ¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð°: "
+
+#: src/LYLocal.c:998
+msgid "Unexpected failure - unable to find trailing path separator"
+msgstr "ÐÐµÐ¾Ð¶Ð¸Ð´Ð°Ð½Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° - не удаетÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ завершающий разделитель пути"
+
+#: src/LYLocal.c:1060
+msgid "Modify name, location, or permission (n, l, or p): "
+msgstr "Измените имÑ, меÑто раÑположениÑ, или права доÑтупа (n, l, или p): "
+
+#: src/LYLocal.c:1062
+msgid "Modify name or location (n or l): "
+msgstr "Изменить Ð¸Ð¼Ñ Ð¸Ð»Ð¸ меÑто раÑÐ¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ (n или l): "
+
+#.
+#. * Code for changing ownership needed here.
+#.
+#: src/LYLocal.c:1091
+msgid "This feature not yet implemented!"
+msgstr "Эта возможноÑÑ‚ÑŒ еще не реализована!"
+
+#: src/LYLocal.c:1112
+msgid "Enter name of file to create: "
+msgstr "Введите Ð¸Ð¼Ñ Ñоздаваемого файла: "
+
+#: src/LYLocal.c:1115 src/LYLocal.c:1152
+msgid "Illegal redirection \"//\" found! Request ignored."
+msgstr "Ðайдено неверное перенаправление! Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð¸Ð³Ð½Ð¾Ñ€Ð¸Ñ€Ð¾Ð²Ð°Ð½."
+
+#: src/LYLocal.c:1149
+msgid "Enter name for new directory: "
+msgstr "Введите Ð¸Ð¼Ñ Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ каталога: "
+
+#: src/LYLocal.c:1190
+msgid "Create file or directory (f or d): "
+msgstr "Создать файл или каталог (f или d): "
+
+#: src/LYLocal.c:1232
+#, fuzzy, c-format
+#| msgid "Remove file '%s'?"
+msgid "Remove directory '%s'?"
+msgstr "Удалить файл '%s'?"
+
+#: src/LYLocal.c:1235
+#, fuzzy
+#| msgid " directory"
+msgid "Remove directory?"
+msgstr " каталог"
+
+#: src/LYLocal.c:1240
+#, c-format
+msgid "Remove file '%s'?"
+msgstr "Удалить файл '%s'?"
+
+#: src/LYLocal.c:1242
+msgid "Remove file?"
+msgstr "Удалить файл?"
+
+#: src/LYLocal.c:1247
+#, c-format
+msgid "Remove symbolic link '%s'?"
+msgstr "Удалить Ñимвольную ÑÑылку '%s'?"
+
+#: src/LYLocal.c:1249
+msgid "Remove symbolic link?"
+msgstr "Удалить Ñимвольную ÑÑылку?"
+
+#: src/LYLocal.c:1347
+msgid "Sorry, don't know how to permit non-UNIX files yet."
+msgstr "Извините, пока не извеÑтно, как уÑтанавливать права доÑтупа Ð´Ð»Ñ Ð½Ðµ-UNIX файлов."
+
+#: src/LYLocal.c:1376
+msgid "Unable to open permit options file"
+msgstr "Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ файл Ñ Ð¾Ð¿Ñ†Ð¸Ñми прав доÑтупа"
+
+#: src/LYLocal.c:1404
+msgid "Specify permissions below:"
+msgstr "Укажите ниже права доÑтупа:"
+
+#: src/LYLocal.c:1405 src/LYShowInfo.c:265
+msgid "Owner:"
+msgstr "Владелец:"
+
+#: src/LYLocal.c:1421
+msgid "Group"
+msgstr "Группа"
+
+#: src/LYLocal.c:1437
+msgid "Others:"
+msgstr "Другие:"
+
+#: src/LYLocal.c:1455
+msgid "form to permit"
+msgstr ""
+
+#: src/LYLocal.c:1551
+msgid "Invalid mode format."
+msgstr "Ðеверный формат режима."
+
+#: src/LYLocal.c:1555
+msgid "Invalid syntax format."
+msgstr "Ðеверный формат ÑинтакÑиÑа."
+
+#: src/LYLocal.c:1742
+msgid "Warning! UUDecoded file will exist in the directory you started Lynx."
+msgstr "Внимание! UU-декодированный файл будет в каталоге, из которого вы запуÑтили Lynx."
+
+#: src/LYLocal.c:1932
+msgid "NULL URL pointer"
+msgstr "NULL указатель на URL"
+
+#: src/LYLocal.c:2014
+#, c-format
+msgid "Executing %s "
+msgstr "Выполнение %s"
+
+#: src/LYLocal.c:2017
+msgid "Executing system command. This might take a while."
+msgstr "Выполнение ÑиÑтемной команды. Это может занÑÑ‚ÑŒ времÑ."
+
+#: src/LYLocal.c:2091
+msgid "Current directory:"
+msgstr "Текущий каталог:"
+
+#: src/LYLocal.c:2094 src/LYLocal.c:2112
+msgid "Current selection:"
+msgstr "Текущий выбор:"
+
+#: src/LYLocal.c:2098
+msgid "Nothing currently selected."
+msgstr "Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð½Ð¸Ñ‡ÐµÐ³Ð¾ не выбрано."
+
+#: src/LYLocal.c:2114
+msgid "tagged item:"
+msgstr "отмеченный Ñлемент:"
+
+#: src/LYLocal.c:2115
+msgid "tagged items:"
+msgstr "отмеченные Ñлементы:"
+
+#: src/LYLocal.c:2215 src/LYLocal.c:2224
+msgid "Illegal filename; request ignored."
+msgstr "Ðеправильное Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°; Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð¸Ð³Ð½Ð¾Ñ€Ð¸Ñ€Ð¾Ð²Ð°Ð½."
+
+#. directory not writable
+#: src/LYLocal.c:2322 src/LYLocal.c:2381
+msgid "Install in the selected directory not permitted."
+msgstr "УÑтановка в выбранный каталог не разрешена."
+
+#: src/LYLocal.c:2377
+msgid "The selected item is not a directory! Request ignored."
+msgstr "Выбранный Ñлемент не ÑвлÑетÑÑ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð¾Ð¼! Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð¸Ð³Ð½Ð¾Ñ€Ð¸Ñ€Ð¾Ð²Ð°Ð½."
+
+#: src/LYLocal.c:2386
+msgid "Just a moment, ..."
+msgstr "Минутку ..."
+
+#: src/LYLocal.c:2403
+msgid "Error building install args"
+msgstr ""
+
+#: src/LYLocal.c:2418 src/LYLocal.c:2449
+#, c-format
+msgid "Source and target are the same: %s"
+msgstr "ИÑточник и цель Ñовпадают: %s"
+
+#: src/LYLocal.c:2425 src/LYLocal.c:2456
+#, c-format
+msgid "Already in target directory: %s"
+msgstr "Уже в целевом каталоге: %s"
+
+#: src/LYLocal.c:2474
+msgid "Installation complete"
+msgstr "УÑтановка завершена"
+
+#: src/LYLocal.c:2666
+msgid "Temporary URL or list would be too long."
+msgstr "Временный URL или ÑпиÑок должен быть Ñлишком длинным."
+
+#: src/LYMail.c:544
+msgid "Sending"
+msgstr "ПоÑылка"
+
+#: src/LYMail.c:1030
+#, c-format
+msgid "The link %s :?: %s \n"
+msgstr "СÑылка %s :?: %s \n"
+
+#: src/LYMail.c:1032
+#, c-format
+msgid "called \"%s\"\n"
+msgstr "Ð½Ð°Ð·Ð²Ð°Ð½Ð½Ð°Ñ \"%s\"\n"
+
+#: src/LYMail.c:1033
+#, c-format
+msgid "in the file \"%s\" called \"%s\"\n"
+msgstr "в файле \"%s\" названа \"%s\"\n"
+
+#: src/LYMail.c:1034
+msgid "was requested but was not available."
+msgstr "была запрошена, но оказалаÑÑŒ недоÑтупна."
+
+#: src/LYMail.c:1035
+msgid "Thought you might want to know."
+msgstr "Ð¥Ð¾Ñ‚Ñ Ð²Ñ‹ можете хотеть знать."
+
+#: src/LYMail.c:1037
+msgid "This message was automatically generated by"
+msgstr "Это Ñообщение было автоматичеÑки Ñгенерировано"
+
+#: src/LYMail.c:1751
+msgid "No system mailer configured"
+msgstr ""
+
+#: src/LYMain.c:1049
+msgid "No Winsock found, sorry."
+msgstr "К Ñожалению Winsock не найден."
+
+#: src/LYMain.c:1240
+#, fuzzy
+#| msgid "You MUST define a valid TMP or TEMP area!\n"
+msgid "You MUST define a valid TMP or TEMP area!"
+msgstr "Ð’Ñ‹ ДОЛЖÐЫ определить правильную облаÑÑ‚ÑŒ TMP или TEMP!\n"
+
+#: src/LYMain.c:1293 src/LYMainLoop.c:5260
+msgid "No such directory"
+msgstr "Ðет каталога"
+
+#: src/LYMain.c:1487
+#, fuzzy, c-format
+#| msgid ""
+#| "\n"
+#| "Configuration file %s is not available.\n"
+#| "\n"
+msgid ""
+"\n"
+"Configuration file \"%s\" is not available.\n"
+"\n"
+msgstr ""
+"\n"
+"Конфигурационный файл %s не доÑтупен.\n"
+"\n"
+
+#: src/LYMain.c:1497
+#, c-format
+msgid ""
+"\n"
+"Lynx character sets not declared.\n"
+"\n"
+msgstr ""
+"\n"
+"Кодировки Lynx не определены.\n"
+"\n"
+
+#: src/LYMain.c:1526
+#, c-format
+msgid ""
+"\n"
+"Lynx edit map not declared.\n"
+"\n"
+msgstr ""
+
+#: src/LYMain.c:1608
+#, fuzzy, c-format
+#| msgid ""
+#| "\n"
+#| "Lynx file %s is not available.\n"
+#| "\n"
+msgid ""
+"\n"
+"Lynx file \"%s\" is not available.\n"
+"\n"
+msgstr ""
+"\n"
+"Файл Lynx %s не доÑтупен.\n"
+"\n"
+
+#: src/LYMain.c:1683
+#, c-format
+msgid "Ignored %d characters from standard input.\n"
+msgstr ""
+
+#: src/LYMain.c:1685
+#, c-format
+msgid "Use \"-stdin\" or \"-\" to tell how to handle piped input.\n"
+msgstr ""
+
+#: src/LYMain.c:1843
+msgid "Warning:"
+msgstr "Предупреждение:"
+
+#: src/LYMain.c:2408
+msgid "persistent cookies state will be changed in next session only."
+msgstr "ÑоÑтоÑние поÑтоÑнных cookie будет изменено только в Ñледующем ÑеанÑе."
+
+#: src/LYMain.c:2644 src/LYMain.c:2689
+#, c-format
+msgid "Lynx: ignoring unrecognized charset=%s\n"
+msgstr "Lynx: нераÑÐ¿Ð¾Ð·Ð½Ð°Ð½Ð½Ð°Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ°=%s игнорируетÑÑ\n"
+
+#: src/LYMain.c:3208
+#, fuzzy, c-format
+#| msgid "%s Version %s (%s)\n"
+msgid "%s Version %s (%s)"
+msgstr "%s ВерÑÐ¸Ñ %s (%s)\n"
+
+#: src/LYMain.c:3246
+#, c-format
+msgid "Built on %s %s %s\n"
+msgstr "Собрано %s %s %s\n"
+
+#: src/LYMain.c:3268
+msgid "Copyrights held by the Lynx Developers Group,"
+msgstr ""
+
+#: src/LYMain.c:3269
+#, fuzzy
+#| msgid "Copyrights held by the University of Kansas, CERN, and other contributors.\n"
+msgid "the University of Kansas, CERN, and other contributors."
+msgstr "ÐвторÑкие права принадлежат универÑитету КанзаÑа, CERN, и другим учаÑтникам.\n"
+
+#: src/LYMain.c:3270
+#, fuzzy
+#| msgid "Distributed under the GNU General Public License.\n"
+msgid "Distributed under the GNU General Public License (Version 2)."
+msgstr "РаÑпроÑтранÑетÑÑ Ð² рамках УниверÑальной ОбщеÑтвенной Лицензии GNU.\n"
+
+#: src/LYMain.c:3271
+#, fuzzy
+#| msgid ""
+#| "See http://lynx.browser.org/ and the online help for more information.\n"
+#| "\n"
+msgid "See http://lynx.isc.org/ and the online help for more information."
+msgstr ""
+"См. http://lynx.browser.org/ и помощь Ð´Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации.\n"
+"\n"
+
+#: src/LYMain.c:4104
+#, c-format
+msgid "USAGE: %s [options] [file]\n"
+msgstr "ИСПОЛЬЗОВÐÐИЕ: %s [ключи] [файл]\n"
+
+#: src/LYMain.c:4105
+#, c-format
+msgid "Options are:\n"
+msgstr "Ключи:\n"
+
+#: src/LYMain.c:4406
+#, c-format
+msgid "%s: Invalid Option: %s\n"
+msgstr "%s: ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð¾Ð¿Ñ†Ð¸Ñ: %s\n"
+
+#: src/LYMainLoop.c:575
+#, c-format
+msgid "Internal error: Invalid mouse link %d!"
+msgstr "ВнутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°: ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ ÑÑылка мыши %d!"
+
+#: src/LYMainLoop.c:696 src/LYMainLoop.c:5282
+msgid "A URL specified by the user"
+msgstr "URL, указанный пользователем"
+
+#: src/LYMainLoop.c:1148
+msgid "Enctype multipart/form-data not yet supported! Cannot submit."
+msgstr "Enctype multipart/form-data еще не поддерживаетÑÑ! Ðе удаетÑÑ Ð¿Ð¾Ñлать."
+
+#.
+#. * Make a name for this help file.
+#.
+#: src/LYMainLoop.c:3177
+msgid "Help Screen"
+msgstr "Экран Помощи"
+
+#: src/LYMainLoop.c:3308
+msgid "System Index"
+msgstr "СиÑтемный ИндекÑ"
+
+#: src/LYMainLoop.c:3556
+#, c-format
+msgid "Query parameter %d: "
+msgstr ""
+
+#: src/LYMainLoop.c:3781 src/LYMainLoop.c:5558
+msgid "Entry into main screen"
+msgstr "Вход на главный Ñкран"
+
+#: src/LYMainLoop.c:4039
+msgid "No next document present"
+msgstr "Следующий документ отÑутÑтвует"
+
+#: src/LYMainLoop.c:4334
+msgid "charset for this document specified explicitly, sorry..."
+msgstr "извините, кодировка Ð´Ð»Ñ Ñтого документа указана Ñвно..."
+
+#: src/LYMainLoop.c:5240
+msgid "cd to:"
+msgstr "перейти в:"
+
+#: src/LYMainLoop.c:5263
+msgid "A component of path is not a directory"
+msgstr "Компонента пути не ÑвлÑетÑÑ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð¾Ð¼"
+
+#: src/LYMainLoop.c:5266
+msgid "failed to change directory"
+msgstr "не удалоÑÑŒ изменить каталог"
+
+#: src/LYMainLoop.c:6496
+msgid "Reparsing document under current settings..."
+msgstr "Документ разбираетÑÑ Ð·Ð°Ð½Ð¾Ð²Ð¾ Ñ ÑƒÑ‡ÐµÑ‚Ð¾Ð¼ текущих уÑтановок..."
+
+#: src/LYMainLoop.c:6790
+#, c-format
+msgid "Fatal error - could not open output file %s\n"
+msgstr "Ð¤Ð°Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° - не удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ выходной файл %s\n"
+
+#: src/LYMainLoop.c:7128
+msgid "TABLE center enable."
+msgstr ""
+
+#: src/LYMainLoop.c:7131
+msgid "TABLE center disable."
+msgstr ""
+
+#: src/LYMainLoop.c:7211
+msgid "Current URL is empty."
+msgstr "Текущий URL пуÑÑ‚."
+
+#: src/LYMainLoop.c:7213 src/LYUtils.c:1881
+msgid "Copy to clipboard failed."
+msgstr "Ощибка при копировании в буфер обмена."
+
+#: src/LYMainLoop.c:7215
+msgid "Document URL put to clipboard."
+msgstr "URL документа помещен в буфер обмена."
+
+#: src/LYMainLoop.c:7217
+msgid "Link URL put to clipboard."
+msgstr "URL ÑÑылки помещен в буфер обмена."
+
+#: src/LYMainLoop.c:7244
+msgid "No URL in the clipboard."
+msgstr "URL в буфере обмена отÑутÑтвует."
+
+#: src/LYMainLoop.c:7936 src/LYMainLoop.c:8105
+msgid "-index-"
+msgstr "-индекÑ-"
+
+#: src/LYMainLoop.c:8045
+msgid "lynx: Can't access startfile"
+msgstr "lynx: Ðет доÑтупа к начальному файлу"
+
+#: src/LYMainLoop.c:8057
+msgid "lynx: Start file could not be found or is not text/html or text/plain"
+msgstr "lynx: Ðачальный файл либо не удаетÑÑ Ð½Ð°Ð¹Ñ‚Ð¸, либо он не text/html или text/plain"
+
+#: src/LYMainLoop.c:8058
+msgid " Exiting..."
+msgstr " Выход..."
+
+#: src/LYMainLoop.c:8099
+msgid "-more-"
+msgstr "-далее-"
+
+#. Enable scrolling.
+#: src/LYNews.c:186
+msgid "You will be posting to:"
+msgstr "Ð’Ñ‹ будете поÑылать в:"
+
+#.
+#. * Get the mail address for the From header, offering personal_mail_address
+#. * as default.
+#.
+#: src/LYNews.c:195
+msgid ""
+"\n"
+"\n"
+" Please provide your mail address for the From: header\n"
+msgstr ""
+"\n"
+"\n"
+" ПожалуйÑта, укажите ваш почтовый Ð°Ð´Ñ€ÐµÑ Ð´Ð»Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ° From:\n"
+
+#.
+#. * Get the Subject header, offering the current document's title as the
+#. * default if this is a followup rather than a new post. - FM
+#.
+#: src/LYNews.c:212
+msgid ""
+"\n"
+"\n"
+" Please provide or edit the Subject: header\n"
+msgstr ""
+"\n"
+"\n"
+" ПожалуйÑта, укажите или отредактируйте заголовок Subject:\n"
+
+#: src/LYNews.c:302
+msgid ""
+"\n"
+"\n"
+" Please provide or edit the Organization: header\n"
+msgstr ""
+"\n"
+"\n"
+" ПожалуйÑта, укажите или отредактируйте заголовок Organization:\n"
+
+#.
+#. * Use the built in line editior.
+#.
+#: src/LYNews.c:359
+msgid ""
+"\n"
+"\n"
+" Please enter your message below."
+msgstr ""
+"\n"
+"\n"
+" ПожалуйÑта, введите ниже ваше Ñообщение."
+
+#: src/LYNews.c:405
+msgid "Message has no original text!"
+msgstr "Сообщение не имеет первоначального текÑта!"
+
+#: src/LYOptions.c:770
+msgid "review/edit B)ookmarks files"
+msgstr "проÑмотреть/отредактировать файлы B)закладок"
+
+#: src/LYOptions.c:772
+msgid "B)ookmark file: "
+msgstr "Файл B)закладок: "
+
+#: src/LYOptions.c:2120 src/LYOptions.c:2127
+msgid "ON"
+msgstr ""
+
+#. verbose_img variable
+#: src/LYOptions.c:2121 src/LYOptions.c:2126 src/LYOptions.c:2289
+#: src/LYOptions.c:2300
+msgid "OFF"
+msgstr ""
+
+#: src/LYOptions.c:2122
+msgid "NEVER"
+msgstr ""
+
+#: src/LYOptions.c:2123
+msgid "ALWAYS"
+msgstr ""
+
+#: src/LYOptions.c:2139 src/LYOptions.c:2281
+msgid "ignore"
+msgstr ""
+
+#: src/LYOptions.c:2140
+msgid "ask user"
+msgstr ""
+
+#: src/LYOptions.c:2141
+msgid "accept all"
+msgstr ""
+
+#: src/LYOptions.c:2153
+msgid "ALWAYS OFF"
+msgstr ""
+
+#: src/LYOptions.c:2154
+msgid "FOR LOCAL FILES ONLY"
+msgstr ""
+
+#: src/LYOptions.c:2156
+msgid "ALWAYS ON"
+msgstr ""
+
+#: src/LYOptions.c:2168
+msgid "Numbers act as arrows"
+msgstr ""
+
+#: src/LYOptions.c:2170
+msgid "Links are numbered"
+msgstr ""
+
+#: src/LYOptions.c:2173
+msgid "Links and form fields are numbered"
+msgstr ""
+
+#: src/LYOptions.c:2176
+msgid "Form fields are numbered"
+msgstr ""
+
+#: src/LYOptions.c:2191
+msgid "Case insensitive"
+msgstr ""
+
+#: src/LYOptions.c:2192
+msgid "Case sensitive"
+msgstr ""
+
+#: src/LYOptions.c:2216
+msgid "prompt normally"
+msgstr ""
+
+#: src/LYOptions.c:2217
+msgid "force yes-response"
+msgstr ""
+
+#: src/LYOptions.c:2218
+msgid "force no-response"
+msgstr ""
+
+#: src/LYOptions.c:2236
+msgid "Novice"
+msgstr ""
+
+#: src/LYOptions.c:2237
+#, fuzzy
+#| msgid "Internal"
+msgid "Intermediate"
+msgstr "Внутренний"
+
+#: src/LYOptions.c:2238
+msgid "Advanced"
+msgstr ""
+
+#: src/LYOptions.c:2247
+msgid "By First Visit"
+msgstr ""
+
+#: src/LYOptions.c:2249
+msgid "By First Visit Reversed"
+msgstr ""
+
+#: src/LYOptions.c:2250
+msgid "As Visit Tree"
+msgstr ""
+
+#: src/LYOptions.c:2251
+msgid "By Last Visit"
+msgstr ""
+
+#: src/LYOptions.c:2253
+msgid "By Last Visit Reversed"
+msgstr ""
+
+#. Old_DTD variable
+#: src/LYOptions.c:2264
+msgid "relaxed (TagSoup mode)"
+msgstr ""
+
+#: src/LYOptions.c:2265
+msgid "strict (SortaSGML mode)"
+msgstr ""
+
+#: src/LYOptions.c:2272
+msgid "Ignore"
+msgstr ""
+
+#: src/LYOptions.c:2273
+msgid "Add to trace-file"
+msgstr ""
+
+#: src/LYOptions.c:2274
+msgid "Add to LYNXMESSAGES"
+msgstr ""
+
+#: src/LYOptions.c:2275
+#, fuzzy
+#| msgid "Points to file:"
+msgid "Warn, point to trace-file"
+msgstr "Указывает на файл:"
+
+#: src/LYOptions.c:2282
+msgid "as labels"
+msgstr ""
+
+#: src/LYOptions.c:2283
+#, fuzzy
+#| msgid "this link"
+msgid "as links"
+msgstr "Ñту ÑÑылку"
+
+#: src/LYOptions.c:2290
+#, fuzzy
+#| msgid " (bad file name)"
+msgid "show filename"
+msgstr " (неверное Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°)"
+
+#: src/LYOptions.c:2301
+msgid "STANDARD"
+msgstr ""
+
+#: src/LYOptions.c:2302
+msgid "ADVANCED"
+msgstr ""
+
+#: src/LYOptions.c:2336
+#, fuzzy
+#| msgid "Subdirectories:"
+msgid "Directories first"
+msgstr "Подкаталоги:"
+
+#: src/LYOptions.c:2337
+#, fuzzy
+#| msgid " first"
+msgid "Files first"
+msgstr " Ñначала"
+
+#: src/LYOptions.c:2338
+#, fuzzy
+#| msgid "Line edit style"
+msgid "Mixed style"
+msgstr "Стиль Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñтрок"
+
+#: src/LYOptions.c:2346 src/LYOptions.c:2366
+#, fuzzy
+#| msgid "Name:"
+msgid "By Name"
+msgstr "ИмÑ:"
+
+#: src/LYOptions.c:2347 src/LYOptions.c:2367
+msgid "By Type"
+msgstr ""
+
+#: src/LYOptions.c:2348 src/LYOptions.c:2368
+#, fuzzy
+#| msgid "ByteSize:"
+msgid "By Size"
+msgstr "РазмерБайта:"
+
+#: src/LYOptions.c:2349 src/LYOptions.c:2369
+#, fuzzy
+#| msgid "Date:"
+msgid "By Date"
+msgstr "Дата:"
+
+#: src/LYOptions.c:2350
+msgid "By Mode"
+msgstr ""
+
+#: src/LYOptions.c:2352
+msgid "By User"
+msgstr ""
+
+#: src/LYOptions.c:2353
+#, fuzzy
+#| msgid "Group"
+msgid "By Group"
+msgstr "Группа"
+
+#: src/LYOptions.c:2378
+msgid "Do not show rate"
+msgstr ""
+
+#: src/LYOptions.c:2379 src/LYOptions.c:2380
+#, fuzzy, c-format
+#| msgid "Show transfer rate"
+msgid "Show %s/sec rate"
+msgstr "Показывать ÑкороÑÑ‚ÑŒ передачи"
+
+#: src/LYOptions.c:2382 src/LYOptions.c:2383
+#, c-format
+msgid "Show %s/sec, ETA"
+msgstr ""
+
+#: src/LYOptions.c:2386
+#, fuzzy
+#| msgid "Show scrollbar"
+msgid "Show progressbar"
+msgstr "Показывать полоÑу прокрутки"
+
+#: src/LYOptions.c:2398
+msgid "Accept lynx's internal types"
+msgstr ""
+
+#: src/LYOptions.c:2399
+msgid "Also accept lynx.cfg's types"
+msgstr ""
+
+#: src/LYOptions.c:2400
+msgid "Also accept user's types"
+msgstr ""
+
+#: src/LYOptions.c:2401
+msgid "Also accept system's types"
+msgstr ""
+
+#: src/LYOptions.c:2402
+#, fuzzy
+#| msgid "Accept Changes"
+msgid "Accept all types"
+msgstr "ПринÑÑ‚ÑŒ изменениÑ"
+
+#: src/LYOptions.c:2411
+msgid "gzip"
+msgstr ""
+
+#: src/LYOptions.c:2412
+msgid "deflate"
+msgstr ""
+
+#: src/LYOptions.c:2415
+msgid "compress"
+msgstr ""
+
+#: src/LYOptions.c:2418
+msgid "bzip2"
+msgstr ""
+
+#: src/LYOptions.c:2420
+msgid "All"
+msgstr ""
+
+#: src/LYOptions.c:2699 src/LYOptions.c:2728
+#, c-format
+msgid "Use %s to invoke the Options menu!"
+msgstr "ИÑпользуйте %s Ð´Ð»Ñ Ð²Ñ‹Ð·Ð¾Ð²Ð° меню Параметров!"
+
+#: src/LYOptions.c:3541
+msgid "(options marked with (!) will not be saved)"
+msgstr "(параметры, отмеченные (!) Ñохранены не будут)"
+
+#: src/LYOptions.c:3549
+msgid "General Preferences"
+msgstr "Общие ПредпочтениÑ"
+
+#. ***************************************************************
+#. User Mode: SELECT
+#: src/LYOptions.c:3553
+msgid "User mode"
+msgstr "Режим пользователÑ"
+
+#. Editor: INPUT
+#: src/LYOptions.c:3559
+msgid "Editor"
+msgstr "Редактор"
+
+#. Search Type: SELECT
+#: src/LYOptions.c:3564
+msgid "Type of Search"
+msgstr "Тип поиÑка"
+
+#: src/LYOptions.c:3569
+msgid "Security and Privacy"
+msgstr ""
+
+#. ***************************************************************
+#. Cookies: SELECT
+#: src/LYOptions.c:3573
+msgid "Cookies"
+msgstr "Cookie"
+
+#. Cookie Prompting: SELECT
+#: src/LYOptions.c:3587
+msgid "Invalid-Cookie Prompting"
+msgstr ""
+
+#. SSL Prompting: SELECT
+#: src/LYOptions.c:3594
+msgid "SSL Prompting"
+msgstr ""
+
+#: src/LYOptions.c:3600
+msgid "Keyboard Input"
+msgstr "Ввод Ñ ÐºÐ»Ð°Ð²Ð¸Ð°Ñ‚ÑƒÑ€Ñ‹"
+
+#. ***************************************************************
+#. Keypad Mode: SELECT
+#: src/LYOptions.c:3604
+msgid "Keypad mode"
+msgstr "Режим дополнительной клавиатуры"
+
+#. Emacs keys: ON/OFF
+#: src/LYOptions.c:3610
+msgid "Emacs keys"
+msgstr "Клавиши Emacs"
+
+#. VI Keys: ON/OFF
+#: src/LYOptions.c:3616
+msgid "VI keys"
+msgstr "Клавиши VI"
+
+#. Line edit style: SELECT
+#. well, at least 2 line edit styles available
+#: src/LYOptions.c:3623
+msgid "Line edit style"
+msgstr "Стиль Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñтрок"
+
+#. Keyboard layout: SELECT
+#: src/LYOptions.c:3635
+msgid "Keyboard layout"
+msgstr "РаÑкладка клавиатуры"
+
+#.
+#. * Display and Character Set
+#.
+#: src/LYOptions.c:3649
+msgid "Display and Character Set"
+msgstr "Отображение и Ðабор Символов"
+
+#. Use locale-based character set: ON/OFF
+#: src/LYOptions.c:3654
+#, fuzzy
+#| msgid "Display character set"
+msgid "Use locale-based character set"
+msgstr "Кодировка отображениÑ"
+
+#: src/LYOptions.c:3661
+msgid "Use HTML5 charset replacements"
+msgstr ""
+
+#. Display Character Set: SELECT
+#: src/LYOptions.c:3667
+msgid "Display character set"
+msgstr "Кодировка отображениÑ"
+
+#: src/LYOptions.c:3698
+msgid "Assumed document character set"
+msgstr "ÐŸÐ¾Ð´Ñ€Ð°Ð·ÑƒÐ¼ÐµÐ²Ð°ÐµÐ¼Ð°Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ° документа"
+
+#.
+#. * Since CJK people hardly mixed with other world
+#. * we split the header to make it more readable:
+#. * "CJK mode" for CJK display charsets, and "Raw 8-bit" for others.
+#.
+#: src/LYOptions.c:3718
+msgid "CJK mode"
+msgstr "Режим CJK"
+
+#: src/LYOptions.c:3720
+msgid "Raw 8-bit"
+msgstr "Ðеобработанный 8-битный режим"
+
+#. X Display: INPUT
+#: src/LYOptions.c:3728
+msgid "X Display"
+msgstr "Экран X"
+
+#.
+#. * Document Appearance
+#.
+#: src/LYOptions.c:3734
+msgid "Document Appearance"
+msgstr "Внешний вид документа"
+
+#: src/LYOptions.c:3740
+msgid "Show color"
+msgstr "Показывать цвет"
+
+#. Show cursor: ON/OFF
+#: src/LYOptions.c:3764
+msgid "Show cursor"
+msgstr "Показывать курÑор"
+
+#. Underline links: ON/OFF
+#: src/LYOptions.c:3770
+#, fuzzy
+#| msgid "Hidden links:"
+msgid "Underline links"
+msgstr "Скрытых ÑÑылок:"
+
+#. Show scrollbar: ON/OFF
+#: src/LYOptions.c:3777
+msgid "Show scrollbar"
+msgstr "Показывать полоÑу прокрутки"
+
+#. Select Popups: ON/OFF
+#: src/LYOptions.c:3784
+msgid "Popups for select fields"
+msgstr "Ð’Ñплывающие меню Ð´Ð»Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ñ‹Ñ… полей"
+
+#. HTML error recovery: SELECT
+#: src/LYOptions.c:3790
+msgid "HTML error recovery"
+msgstr "ВоÑÑтановление от ошибок в HTML"
+
+#. Bad HTML messages: SELECT
+#: src/LYOptions.c:3796
+msgid "Bad HTML messages"
+msgstr ""
+
+#. Show Images: SELECT
+#: src/LYOptions.c:3802
+msgid "Show images"
+msgstr "Показать изображениÑ"
+
+#. Verbose Images: ON/OFF
+#: src/LYOptions.c:3816
+msgid "Verbose images"
+msgstr "ЗаменÑÑ‚ÑŒ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð½Ð° адреÑа"
+
+#.
+#. * Headers Transferred to Remote Servers
+#.
+#: src/LYOptions.c:3824
+msgid "Headers Transferred to Remote Servers"
+msgstr "Заголовки, переданные на удаленные Ñерверы"
+
+#. ***************************************************************
+#. Mail Address: INPUT
+#: src/LYOptions.c:3828
+msgid "Personal mail address"
+msgstr "ПерÑональный почтовый адреÑ"
+
+#: src/LYOptions.c:3833
+#, fuzzy
+#| msgid "Enter new name for file: "
+msgid "Personal name for mail"
+msgstr "Введите новое Ð¸Ð¼Ñ Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð°: "
+
+#: src/LYOptions.c:3840
+#, fuzzy
+#| msgid "Password for news host '%s':"
+msgid "Password for anonymous ftp"
+msgstr "Пароль Ð´Ð»Ñ ÑƒÐ·Ð»Ð° новоÑтей '%s':"
+
+#. Preferred media type: SELECT
+#: src/LYOptions.c:3846
+#, fuzzy
+#| msgid "Transferred %d bytes"
+msgid "Preferred media type"
+msgstr "Передано %d байт"
+
+#. Preferred encoding: SELECT
+#: src/LYOptions.c:3852
+#, fuzzy
+#| msgid "Preferred document language"
+msgid "Preferred encoding"
+msgstr "Предпочитаемый Ñзык документа"
+
+#. Preferred Document Character Set: INPUT
+#: src/LYOptions.c:3858
+msgid "Preferred document character set"
+msgstr "ÐŸÑ€ÐµÐ´Ð¿Ð¾Ñ‡Ð¸Ñ‚Ð°ÐµÐ¼Ð°Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ° документа"
+
+#. Preferred Document Language: INPUT
+#: src/LYOptions.c:3863
+msgid "Preferred document language"
+msgstr "Предпочитаемый Ñзык документа"
+
+#: src/LYOptions.c:3869
+#, fuzzy
+#| msgid "User-Agent header"
+msgid "Send User-Agent header"
+msgstr "Заголовок User-Agent"
+
+#: src/LYOptions.c:3871
+msgid "User-Agent header"
+msgstr "Заголовок User-Agent"
+
+#.
+#. * Listing and Accessing Files
+#.
+#: src/LYOptions.c:3879
+msgid "Listing and Accessing Files"
+msgstr "Вывод ÑпиÑка файлов и доÑтуп к ним"
+
+#. FTP sort: SELECT
+#: src/LYOptions.c:3884
+msgid "Use Passive FTP"
+msgstr ""
+
+#. FTP sort: SELECT
+#: src/LYOptions.c:3890
+msgid "FTP sort criteria"
+msgstr "Критерий Ñортировки FTP"
+
+#. Local Directory Sort: SELECT
+#: src/LYOptions.c:3898
+msgid "Local directory sort criteria"
+msgstr "Критерий Ñортировки локального каталога"
+
+#. Local Directory Order: SELECT
+#: src/LYOptions.c:3904
+msgid "Local directory sort order"
+msgstr "Критерий Ñортировки локального каталога"
+
+#: src/LYOptions.c:3913
+msgid "Show dot files"
+msgstr "Показывать dot-файлы"
+
+#: src/LYOptions.c:3921
+msgid "Execution links"
+msgstr "Выполнение ÑÑылок"
+
+#: src/LYOptions.c:3939
+msgid "Pause when showing message"
+msgstr ""
+
+#. Show transfer rate: SELECT
+#: src/LYOptions.c:3946
+msgid "Show transfer rate"
+msgstr "Показывать ÑкороÑÑ‚ÑŒ передачи"
+
+#.
+#. * Special Files and Screens
+#.
+#: src/LYOptions.c:3966
+msgid "Special Files and Screens"
+msgstr "Специальные файлы и Ñкраны"
+
+#: src/LYOptions.c:3971
+msgid "Multi-bookmarks"
+msgstr "МножеÑтвенные закладки"
+
+#: src/LYOptions.c:3979
+msgid "Review/edit Bookmarks files"
+msgstr "ПроÑмотреть/отредактировать файла закладок"
+
+#: src/LYOptions.c:3982
+msgid "Goto multi-bookmark menu"
+msgstr "Переход к меню множеÑтвенных закладок"
+
+#: src/LYOptions.c:3984
+msgid "Bookmarks file"
+msgstr "Файл закладок"
+
+#. Auto Session: ON/OFF
+#: src/LYOptions.c:3991
+msgid "Auto Session"
+msgstr ""
+
+#. Session File Menu: INPUT
+#: src/LYOptions.c:3997
+msgid "Session file"
+msgstr ""
+
+#. Visited Pages: SELECT
+#: src/LYOptions.c:4003
+msgid "Visited Pages"
+msgstr "ПоÑещенные Ñтраницы"
+
+#: src/LYOptions.c:4008
+msgid "View the file "
+msgstr "ПроÑмотреть файл"
+
+#: src/LYPrint.c:947
+#, c-format
+msgid " Print job complete.\n"
+msgstr " Задача печати завершена.\n"
+
+#: src/LYPrint.c:1274
+msgid "Document:"
+msgstr "Документ:"
+
+#: src/LYPrint.c:1275
+msgid "Number of lines:"
+msgstr "ЧиÑло Ñтрок:"
+
+#: src/LYPrint.c:1276
+msgid "Number of pages:"
+msgstr "ЧиÑло Ñтраниц:"
+
+#: src/LYPrint.c:1277
+msgid "pages"
+msgstr "Ñтраниц"
+
+#: src/LYPrint.c:1277
+msgid "page"
+msgstr "Ñтраница"
+
+#: src/LYPrint.c:1278
+msgid "(approximately)"
+msgstr "(приблизительно)"
+
+#: src/LYPrint.c:1285
+msgid "Some print functions have been disabled!"
+msgstr "Ðекоторые функции печати были отключены!"
+
+#: src/LYPrint.c:1289
+msgid "Standard print options:"
+msgstr "Стандартные опции печати:"
+
+#: src/LYPrint.c:1290
+msgid "Print options:"
+msgstr "Опции печати:"
+
+#: src/LYPrint.c:1297
+msgid "Save to a local file"
+msgstr "Сохранить в локальный файл"
+
+#: src/LYPrint.c:1299
+msgid "Save to disk disabled"
+msgstr "Сохранение на диÑк отключено"
+
+#: src/LYPrint.c:1306
+msgid "Mail the file"
+msgstr "ПоÑлать почтой файл"
+
+#: src/LYPrint.c:1313
+msgid "Print to the screen"
+msgstr "Ðапечатать на Ñкран"
+
+#: src/LYPrint.c:1318
+msgid "Print out on a printer attached to your vt100 terminal"
+msgstr "Ðапечатать на принтер, подÑоединенный к вашему терминалу vt100"
+
+#: src/LYReadCFG.c:441
+#, c-format
+msgid ""
+"Syntax Error parsing COLOR in configuration file:\n"
+"The line must be of the form:\n"
+"COLOR:INTEGER:FOREGROUND:BACKGROUND\n"
+"\n"
+"Here FOREGROUND and BACKGROUND must be one of:\n"
+"The special strings 'nocolor' or 'default', or\n"
+msgstr ""
+"СинтакÑичеÑÐºÐ°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° при разборе COLOR в конфигурационном файле:\n"
+"Строка должна иметь форму:\n"
+"COLOR:ЦЕЛОЕ:ЦВЕТ:ЦВЕТ_ФОÐÐ\n"
+"\n"
+"ЗдеÑÑŒ ЦВЕТ и ЦВЕТ_ФОÐРдолжны быть Ñпециальной Ñтрокой:\n"
+"'nocolor' или 'default', или\n"
+
+#: src/LYReadCFG.c:454
+msgid "Offending line:"
+msgstr "ÐŸÐ¾Ð²Ñ€ÐµÐ¶Ð´ÐµÐ½Ð½Ð°Ñ Ñтрока:"
+
+#: src/LYReadCFG.c:757
+#, c-format
+msgid "key remapping of %s to %s for %s failed\n"
+msgstr "ошибка при переназначении клавиши %s в %s Ð´Ð»Ñ %s\n"
+
+#: src/LYReadCFG.c:764
+#, c-format
+msgid "key remapping of %s to %s failed\n"
+msgstr "переназначение клавиши %s в %s закончилоÑÑŒ неудачей\n"
+
+#: src/LYReadCFG.c:785
+#, c-format
+msgid "invalid line-editor selection %s for key %s, selecting all\n"
+msgstr "неверный выбор в редакторе Ñтроки %s Ð´Ð»Ñ ÐºÐ»Ð°Ð²Ð¸ÑˆÐ¸ %s, выбрано вÑе\n"
+
+#: src/LYReadCFG.c:810 src/LYReadCFG.c:822
+#, c-format
+msgid "setting of line-editor binding for key %s (0x%x) to 0x%x for %s failed\n"
+msgstr "ошибка при уÑтановке привÑзки клавиши редактора Ñтроки %s (0x%x) в 0x%x Ð´Ð»Ñ %s\n"
+
+#: src/LYReadCFG.c:826
+#, c-format
+msgid "setting of line-editor binding for key %s (0x%x) for %s failed\n"
+msgstr "ошибка при уÑтановке привÑзки клавиши редактора Ñтроки %s (0x%x) Ð´Ð»Ñ %s\n"
+
+#: src/LYReadCFG.c:922
+#, c-format
+msgid "Lynx: cannot start, CERN rules file %s is not available\n"
+msgstr "Lynx: ошибка Ñтарта, файл Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»Ð°Ð¼Ð¸ CERN %s не доÑтупен\n"
+
+#: src/LYReadCFG.c:923
+msgid "(no name)"
+msgstr "(нет имени)"
+
+#: src/LYReadCFG.c:2044
+#, c-format
+msgid "More than %d nested lynx.cfg includes -- perhaps there is a loop?!?\n"
+msgstr "Больше чем %d вложенных включений lynx.cfg -- возможно цикл?!?\n"
+
+#: src/LYReadCFG.c:2046
+#, c-format
+msgid "Last attempted include was '%s',\n"
+msgstr "ПоÑледнÑÑ Ð¿Ð¾Ð¿Ñ‹Ñ‚ÐºÐ° Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð±Ñ‹Ð»Ð° '%s',\n"
+
+#: src/LYReadCFG.c:2047
+#, c-format
+msgid "included from '%s'.\n"
+msgstr "включено из '%s'.\n"
+
+#: src/LYReadCFG.c:2450 src/LYReadCFG.c:2463 src/LYReadCFG.c:2521
+msgid "The following is read from your lynx.cfg file."
+msgstr "Следующее читаетÑÑ Ð¸Ð· вашего файла lynx.cfg."
+
+#: src/LYReadCFG.c:2451 src/LYReadCFG.c:2464
+msgid "Please read the distribution"
+msgstr "ПожалуйÑта, прочитайте иÑходный"
+
+#: src/LYReadCFG.c:2457 src/LYReadCFG.c:2467
+msgid "for more comments."
+msgstr "Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ñ… комментариев."
+
+#: src/LYReadCFG.c:2503
+msgid "RELOAD THE CHANGES"
+msgstr "ОБÐОВИТЬ ИЗМЕÐЕÐИЯ"
+
+#: src/LYReadCFG.c:2511
+msgid "Your primary configuration"
+msgstr "Ваша оÑÐ½Ð¾Ð²Ð½Ð°Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ"
+
+#: src/LYShowInfo.c:177
+msgid "Directory that you are currently viewing"
+msgstr "Каталог, который вы ÑÐµÐ¹Ñ‡Ð°Ñ Ð¿Ñ€Ð¾Ñматриваете"
+
+#: src/LYShowInfo.c:180
+msgid "Name:"
+msgstr "ИмÑ:"
+
+#: src/LYShowInfo.c:183
+msgid "URL:"
+msgstr "URL:"
+
+#: src/LYShowInfo.c:197
+msgid "Directory that you have currently selected"
+msgstr "Каталог, который вы ÑÐµÐ¹Ñ‡Ð°Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð»Ð¸"
+
+#: src/LYShowInfo.c:199
+msgid "File that you have currently selected"
+msgstr "Файл, который вы ÑÐµÐ¹Ñ‡Ð°Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð»Ð¸"
+
+#: src/LYShowInfo.c:202
+msgid "Symbolic link that you have currently selected"
+msgstr "Ð¡Ð¸Ð¼Ð²Ð¾Ð»ÑŒÐ½Ð°Ñ ÑÑылка, которую вы ÑÐµÐ¹Ñ‡Ð°Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð»Ð¸"
+
+#: src/LYShowInfo.c:205
+msgid "Item that you have currently selected"
+msgstr "Элемент, который вы ÑÐµÐ¹Ñ‡Ð°Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð»Ð¸"
+
+#: src/LYShowInfo.c:207
+msgid "Full name:"
+msgstr "Полное имÑ:"
+
+#: src/LYShowInfo.c:217
+msgid "Unable to follow link"
+msgstr "Ðевозможно Ñледовать по ÑÑылке"
+
+#: src/LYShowInfo.c:219
+msgid "Points to file:"
+msgstr "Указывает на файл:"
+
+#: src/LYShowInfo.c:224
+msgid "Name of owner:"
+msgstr "Ð˜Ð¼Ñ Ð²Ð»Ð°Ð´ÐµÐ»ÑŒÑ†Ð°:"
+
+#: src/LYShowInfo.c:227
+msgid "Group name:"
+msgstr "Ð˜Ð¼Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹:"
+
+#: src/LYShowInfo.c:229
+msgid "File size:"
+msgstr "Размер файла:"
+
+#: src/LYShowInfo.c:231
+#, fuzzy
+#| msgid "bytes"
+msgid "(bytes)"
+msgstr "байт"
+
+#.
+#. * Include date and time information.
+#.
+#: src/LYShowInfo.c:236
+msgid "Creation date:"
+msgstr "Дата ÑозданиÑ:"
+
+#: src/LYShowInfo.c:239
+msgid "Last modified:"
+msgstr "ПоÑледнÑÑ Ð¼Ð¾Ð´Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ:"
+
+#: src/LYShowInfo.c:242
+msgid "Last accessed:"
+msgstr "ПоÑледний доÑтуп:"
+
+#: src/LYShowInfo.c:248
+msgid "Access Permissions"
+msgstr "Права доÑтупа"
+
+#: src/LYShowInfo.c:283
+#, fuzzy
+#| msgid "Group"
+msgid "Group:"
+msgstr "Группа"
+
+#: src/LYShowInfo.c:303
+msgid "World:"
+msgstr ""
+
+#: src/LYShowInfo.c:310
+msgid "File that you are currently viewing"
+msgstr "Файл, который вы ÑÐµÐ¹Ñ‡Ð°Ñ Ð¿Ñ€Ð¾Ñматриваете"
+
+#: src/LYShowInfo.c:318 src/LYShowInfo.c:422
+msgid "Linkname:"
+msgstr "Ð˜Ð¼Ñ ÑÑылки:"
+
+#: src/LYShowInfo.c:324 src/LYShowInfo.c:339
+msgid "Charset:"
+msgstr "Кодировка:"
+
+#: src/LYShowInfo.c:338
+msgid "(assumed)"
+msgstr ""
+
+#: src/LYShowInfo.c:345
+msgid "Server:"
+msgstr "Сервер:"
+
+#: src/LYShowInfo.c:348
+msgid "Date:"
+msgstr "Дата:"
+
+#: src/LYShowInfo.c:351
+msgid "Last Mod:"
+msgstr "ПоÑл мод:"
+
+#: src/LYShowInfo.c:356
+#, fuzzy
+#| msgid "&nbsp;Expires:"
+msgid "Expires:"
+msgstr "&nbsp;УÑтаревает:"
+
+#: src/LYShowInfo.c:359
+msgid "Cache-Control:"
+msgstr "Cache-Control:"
+
+#: src/LYShowInfo.c:362
+msgid "Content-Length:"
+msgstr "Content-Length:"
+
+#: src/LYShowInfo.c:366
+#, fuzzy
+#| msgid "Content-Length:"
+msgid "Length:"
+msgstr "Content-Length:"
+
+#: src/LYShowInfo.c:371
+msgid "Language:"
+msgstr "Язык:"
+
+#: src/LYShowInfo.c:378
+msgid "Post Data:"
+msgstr "Данные Post:"
+
+#: src/LYShowInfo.c:381
+msgid "Post Content Type:"
+msgstr "Тип Ñодержимого Post:"
+
+#: src/LYShowInfo.c:384
+msgid "Owner(s):"
+msgstr "Владельцы:"
+
+#: src/LYShowInfo.c:389
+msgid "size:"
+msgstr "размер:"
+
+#: src/LYShowInfo.c:391
+msgid "lines"
+msgstr "Ñтрок"
+
+#: src/LYShowInfo.c:395
+msgid "forms mode"
+msgstr "режим Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ð¼Ð¸"
+
+#: src/LYShowInfo.c:397
+msgid "source"
+msgstr "иÑходный текÑÑ‚"
+
+#: src/LYShowInfo.c:398
+msgid "normal"
+msgstr "обычный"
+
+#: src/LYShowInfo.c:400
+msgid ", safe"
+msgstr ", безопаÑный"
+
+#: src/LYShowInfo.c:402
+msgid ", via internal link"
+msgstr ", через внутреннюю ÑÑылку"
+
+#: src/LYShowInfo.c:407
+msgid ", no-cache"
+msgstr ", не кÑшировать"
+
+#: src/LYShowInfo.c:409
+msgid ", ISMAP script"
+msgstr ", ISMAP-Ñкрипт"
+
+#: src/LYShowInfo.c:411
+msgid ", bookmark file"
+msgstr ", файл закладок"
+
+#: src/LYShowInfo.c:415
+msgid "mode:"
+msgstr "режим:"
+
+#: src/LYShowInfo.c:421
+msgid "Link that you currently have selected"
+msgstr "СÑылка, которую вы ÑÐµÐ¹Ñ‡Ð°Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð»Ð¸"
+
+#: src/LYShowInfo.c:430
+msgid "Method:"
+msgstr "Метод:"
+
+#: src/LYShowInfo.c:434
+msgid "Enctype:"
+msgstr "Тип шифрованиÑ:"
+
+#: src/LYShowInfo.c:440
+#, fuzzy
+#| msgid "Location: "
+msgid "Action:"
+msgstr "ÐдреÑ: "
+
+#: src/LYShowInfo.c:446
+msgid "(Form field)"
+msgstr "(Поле формы)"
+
+#: src/LYShowInfo.c:457
+msgid "No Links on the current page"
+msgstr "Ðа Ñтой Ñтранице нет ÑÑылок"
+
+#: src/LYShowInfo.c:463
+#, fuzzy
+#| msgid "Server:"
+msgid "Server Headers:"
+msgstr "Сервер:"
+
+#: src/LYStyle.c:331
+#, c-format
+msgid ""
+"Syntax Error parsing style in lss file:\n"
+"[%s]\n"
+"The line must be of the form:\n"
+"OBJECT:MONO:COLOR (ie em:bold:brightblue:white)\n"
+"where OBJECT is one of EM,STRONG,B,I,U,BLINK etc.\n"
+"\n"
+msgstr ""
+"СинтакÑичеÑÐºÐ°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° при разборе ÑÑ‚Ð¸Ð»Ñ Ð² lss файле:\n"
+"[%s]\n"
+"Строка должна иметь форму:\n"
+"ОБЪЕКТ:MONO:ЦВЕТ (т.е. em:bold:brightblue:white),\n"
+"где ОБЪЕКТ - одно из EM,STRONG,B,I,U,BLINK и т.д.\n"
+"\n"
+
+#: src/LYTraversal.c:111
+msgid "here is a list of the history stack so that you may rebuild"
+msgstr "Ñто ÑпиÑок иÑтории, так что вы можете переÑтроить"
+
+#: src/LYUpload.c:77
+msgid "ERROR! - upload command is misconfigured"
+msgstr "ОШИБКÐ! - команда загрузки неправильно Ñконфигурирована"
+
+#: src/LYUpload.c:98
+msgid "Illegal redirection \"../\" found! Request ignored."
+msgstr "Ðайдено неверное перенаправление \"../\"! Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð¸Ð³Ð½Ð¾Ñ€Ð¸Ñ€Ð¾Ð²Ð°Ð½."
+
+#: src/LYUpload.c:101
+msgid "Illegal character \"/\" found! Request ignored."
+msgstr "Ðайден недопуÑтимый Ñимвол \"/\"! Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð¸Ð³Ð½Ð¾Ñ€Ð¸Ñ€Ð¾Ð²Ð°Ð½."
+
+#: src/LYUpload.c:104
+msgid "Illegal redirection using \"~\" found! Request ignored."
+msgstr "Ðайдено неверное перенаправление, иÑпользующее \"~\"! Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð¸Ð³Ð½Ð¾Ñ€Ð¸Ñ€Ð¾Ð²Ð°Ð½."
+
+#: src/LYUpload.c:157
+msgid "Unable to upload file."
+msgstr "Ðе удаетÑÑ Ð·Ð°Ð³Ñ€ÑƒÐ·Ð¸Ñ‚ÑŒ файл."
+
+#: src/LYUpload.c:199
+msgid "Upload To:"
+msgstr "Загрузить в:"
+
+#: src/LYUpload.c:200
+msgid "Upload options:"
+msgstr "Опции загрузки:"
+
+#: src/LYUtils.c:1883
+msgid "Download document URL put to clipboard."
+msgstr ""
+
+#: src/LYUtils.c:2668
+msgid "Unexpected access protocol for this URL scheme."
+msgstr "Ðеожиданный протокол доÑтупа Ð´Ð»Ñ Ñтой Ñхемы URL."
+
+#: src/LYUtils.c:3492
+msgid "Too many tempfiles"
+msgstr "Слишком много временных файлов"
+
+#: src/LYUtils.c:3792
+msgid "unknown restriction"
+msgstr "неизвеÑтное ограничение"
+
+#: src/LYUtils.c:3823
+#, c-format
+msgid "No restrictions set.\n"
+msgstr "Ограничений не уÑтановлены.\n"
+
+#: src/LYUtils.c:3826
+#, c-format
+msgid "Restrictions set:\n"
+msgstr "УÑтановленные ограничениÑ:\n"
+
+#: src/LYUtils.c:5212
+msgid "Cannot find HOME directory"
+msgstr "Домашний каталог не найден"
+
+#: src/LYrcFile.c:16
+msgid "Normally disabled. See ENABLE_LYNXRC in lynx.cfg\n"
+msgstr "Обычно отключено. См. ENABLE_LYNXRC в lynx.cfg\n"
+
+#: src/LYrcFile.c:325
+msgid ""
+"accept_all_cookies allows the user to tell Lynx to automatically\n"
+"accept all cookies if desired. The default is \"FALSE\" which will\n"
+"prompt for each cookie. Set accept_all_cookies to \"TRUE\" to accept\n"
+"all cookies.\n"
+msgstr ""
+"accept_all_cookies позволÑет Lynx автоматичеÑки принимать вÑе cookie.\n"
+"По умолчанию Ñта Ð¾Ð¿Ñ†Ð¸Ñ ÑƒÑтановлена в \"FALSE\", что будет запрашивать\n"
+"подтверждение Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ cookie. УÑтановите accept_all_cookies в \"TRUE\"\n"
+"чтобы принимать вÑе cookie.\n"
+
+#: src/LYrcFile.c:333
+msgid ""
+"anonftp_password allows the user to tell Lynx to use the personal\n"
+"email address as the password for anonymous ftp. If no value is given,\n"
+"Lynx will use the personal email address. Set anonftp_password\n"
+"to a different value if you choose.\n"
+msgstr ""
+
+#: src/LYrcFile.c:342
+msgid ""
+"bookmark_file specifies the name and location of the default bookmark\n"
+"file into which the user can paste links for easy access at a later\n"
+"date.\n"
+msgstr ""
+"bookmark_file определÑет Ð¸Ð¼Ñ Ð¸ меÑтоположение файла закладок по умолчанию,\n"
+"в который пользователь может помещать ÑÑылки Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñтого доÑтупа\n"
+"в будущем.\n"
+
+#: src/LYrcFile.c:347
+msgid ""
+"If case_sensitive_searching is \"on\" then when the user invokes a search\n"
+"using the 's' or '/' keys, the search performed will be case sensitive\n"
+"instead of case INsensitive. The default is usually \"off\".\n"
+msgstr ""
+"ЕÑли case_sensitive_searching находитÑÑ Ð² ÑоÑтоÑнии \"on\", то когда\n"
+"пользователь вызывает поиÑк иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ ÐºÐ»Ð°Ð²Ð¸ÑˆÐ¸ 's' или '/', выполнÑемый поиÑк\n"
+"будет производитьÑÑ Ñ ÑƒÑ‡ÐµÑ‚Ð¾Ð¼ региÑтра Ñимволов, вмеÑто поиÑка БЕЗ учета\n"
+"региÑтра. Значение по умолчанию обычно \"off\".\n"
+
+#: src/LYrcFile.c:352
+msgid ""
+"The character_set definition controls the representation of 8 bit\n"
+"characters for your terminal. If 8 bit characters do not show up\n"
+"correctly on your screen you may try changing to a different 8 bit\n"
+"set or using the 7 bit character approximations.\n"
+"Current valid characters sets are:\n"
+msgstr ""
+"Определение character_set контролирует предÑтавление 8-битных\n"
+"Ñимволов Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ терминала. ЕÑли 8-битные Ñимволы не отображаютÑÑ\n"
+"корректно на вашем Ñкране, вы можете попробовать перейти к другому 8-битному\n"
+"набору или иÑпользовать 7-битные Ð¿Ñ€Ð¸Ð±Ð»Ð¸Ð¶ÐµÐ½Ð¸Ñ Ñимволов.\n"
+"Текущими правильными кодировками ÑвлÑÑŽÑ‚ÑÑ:\n"
+
+#: src/LYrcFile.c:359
+msgid ""
+"cookie_accept_domains and cookie_reject_domains are comma-delimited\n"
+"lists of domains from which Lynx should automatically accept or reject\n"
+"all cookies. If a domain is specified in both options, rejection will\n"
+"take precedence. The accept_all_cookies parameter will override any\n"
+"settings made here.\n"
+msgstr ""
+"cookie_accept_domains и cookie_reject_domains - ÑпиÑки доменов, разделенные\n"
+"запÑтыми, от которых Lynx должен автоматичеÑки принимать или\n"
+"отвергать вÑе cookie. ЕÑли домен указан в обоих ÑпиÑках, выÑший\n"
+"приоритет имеет второй ÑпиÑок (отвергать). Параметр accept_all_cookies\n"
+"замещает вÑе уÑтановки, Ñделанные Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Ñтих ÑпиÑков.\n"
+
+#: src/LYrcFile.c:367
+#, fuzzy
+#| msgid ""
+#| "cookie_file specifies the file from which to read persistent cookies.\n"
+#| "The default is ~/.lynx_cookies.\n"
+msgid ""
+"cookie_file specifies the file from which to read persistent cookies.\n"
+"The default is ~/"
+msgstr ""
+"cookie_file определÑет файл, из которого будут ÑчитыватьÑÑ Ð¿Ð¾ÑтоÑнные cookie.\n"
+"По умолчанию иÑпользуетÑÑ ~/.lynx_cookies.\n"
+
+#: src/LYrcFile.c:372
+msgid ""
+"cookie_loose_invalid_domains, cookie_strict_invalid_domains, and\n"
+"cookie_query_invalid_domains are comma-delimited lists of which domains\n"
+"should be subjected to varying degrees of validity checking. If a\n"
+"domain is set to strict checking, strict conformance to RFC2109 will\n"
+"be applied. A domain with loose checking will be allowed to set cookies\n"
+"with an invalid path or domain attribute. All domains will default to\n"
+"querying the user for an invalid path or domain.\n"
+msgstr ""
+"cookie_loose_invalid_domains, cookie_strict_invalid_domains, и\n"
+"cookie_query_invalid_domains - Ñто ÑпиÑки доменов, разделенных запÑтыми,\n"
+"которые проверÑÑŽÑ‚ÑÑ Ð½Ð° правильноÑÑ‚ÑŒ Ñ Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð½Ð¾Ð¹ Ñтепенью. ЕÑли домен\n"
+"находитÑÑ Ð² ÑпиÑке жеÑткой (strict) проверки, то будет требоватьÑÑ Ñ‚Ð¾Ñ‡Ð½Ð¾Ðµ\n"
+"ÑоответÑтвие RFC2109. Домену, находÑщемуÑÑ Ð² ÑпиÑке мÑгкой (loose) проверки,\n"
+"будет разрешено уÑтанавливать cookie Ñ Ð½ÐµÐ¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ñ‹Ð¼Ð¸ атрибутами\n"
+"пути или домена. По умолчанию вÑе домены запрашивают подтверждение у\n"
+"Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð² Ñлучае неправильного Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿ÑƒÑ‚Ð¸ или домена.\n"
+
+#: src/LYrcFile.c:386
+msgid ""
+"dir_list_order specifies the directory list order under DIRED_SUPPORT\n"
+"(if implemented). The default is \"ORDER_BY_NAME\"\n"
+msgstr ""
+
+#: src/LYrcFile.c:391
+msgid ""
+"dir_list_styles specifies the directory list style under DIRED_SUPPORT\n"
+"(if implemented). The default is \"MIXED_STYLE\", which sorts both\n"
+"files and directories together. \"FILES_FIRST\" lists files first and\n"
+"\"DIRECTORIES_FIRST\" lists directories first.\n"
+msgstr ""
+"dir_list_styles определÑет Ñтиль Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ñодержимого каталога\n"
+"при DIRED_SUPPORT (еÑли реализовано). По умолчанию уÑтановлено \"MIXED_STYLE\",\n"
+"что Ñортирует файлы и каталоги вмеÑте. \"FILES_FIRST\" выводит Ñначала файлы,\n"
+"а \"DIRECTORIES_FIRST\" выводит Ñначала каталоги.\n"
+
+#: src/LYrcFile.c:399
+msgid ""
+"If emacs_keys is to \"on\" then the normal EMACS movement keys:\n"
+" ^N = down ^P = up\n"
+" ^B = left ^F = right\n"
+"will be enabled.\n"
+msgstr ""
+"ЕÑли emacs_keys уÑтановлено в \"on\", то будут включены обычные\n"
+"команды Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ EMACS:\n"
+" ^N = вниз ^P = вверх\n"
+" ^B = влево ^F = вправо\n"
+
+#: src/LYrcFile.c:405
+msgid ""
+"file_editor specifies the editor to be invoked when editing local files\n"
+"or sending mail. If no editor is specified, then file editing is disabled\n"
+"unless it is activated from the command line, and the built-in line editor\n"
+"will be used for sending mail.\n"
+msgstr ""
+"file_editor определÑет, какой редактор будет запуÑкатьÑÑ Ð¿Ñ€Ð¸ редактировании\n"
+"локальных файлов или при поÑылке почты. Ð’ Ñлучае, когда редактор не указан,\n"
+"редактирование файлов будет запрещено, еÑли редактор не вызван Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ð¾Ð¹\n"
+"Ñтроки, а при поÑылке почты будет иÑпользоватьÑÑ Ð²Ñтроенный\n"
+"Ñтроковый редактор.\n"
+
+#: src/LYrcFile.c:412
+msgid ""
+"The file_sorting_method specifies which value to sort on when viewing\n"
+"file lists such as FTP directories. The options are:\n"
+" BY_FILENAME -- sorts on the name of the file\n"
+" BY_TYPE -- sorts on the type of the file\n"
+" BY_SIZE -- sorts on the size of the file\n"
+" BY_DATE -- sorts on the date of the file\n"
+msgstr ""
+"file_sorting_method определÑет, по какому параметру производить Ñортировку\n"
+"при проÑмотре ÑпиÑков файлов, таких как FTP каталоги. ВозможноÑти выбора:\n"
+" BY_FILENAME -- Ñортировать по имени файла\n"
+" BY_TYPE -- Ñортировать по типу файла\n"
+" BY_SIZE -- Ñортировать по размеру файла\n"
+" BY_DATE -- Ñортировать по дате поÑледней модификации файла\n"
+
+#: src/LYrcFile.c:435
+msgid ""
+"lineedit_mode specifies the key binding used for inputting strings in\n"
+"prompts and forms. If lineedit_mode is set to \"Default Binding\" then\n"
+"the following control characters are used for moving and deleting:\n"
+"\n"
+" Prev Next Enter = Accept input\n"
+" Move char: <- -> ^G = Cancel input\n"
+" Move word: ^P ^N ^U = Erase line\n"
+" Delete char: ^H ^R ^A = Beginning of line\n"
+" Delete word: ^B ^F ^E = End of line\n"
+"\n"
+"Current lineedit modes are:\n"
+msgstr ""
+"lineedit_mode определÑет привÑзку клавиш, иÑпользуемую Ð´Ð»Ñ Ð²Ð²Ð¾Ð´Ð¸Ð¼Ñ‹Ñ… Ñтрок в\n"
+"приглашениÑÑ… и формах. ЕÑли lineedit_mode уÑтановлено в\n"
+"\"ПривÑзка по умолчанию\", тогда Ñледующие управлÑющие Ñимволы будут\n"
+"иÑпользованы Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¸ удалениÑ:\n"
+"\n"
+" Пред След Enter = ПринÑÑ‚ÑŒ ввод\n"
+" СдвинутьÑÑ Ð½Ð° Ñимвол: <- -> ^G = Отменить ввод\n"
+" СдвинутьÑÑ Ð½Ð° Ñлово: ^P ^N ^U = Удалить Ñтроку\n"
+" Удалить Ñимвол: ^H ^R ^A = Ð’ начало Ñтроки\n"
+" Удалить Ñлово: ^B ^F ^E = Ð’ конец Ñтроки\n"
+"Поддерживаемые режимы Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñтроки:\n"
+
+#: src/LYrcFile.c:453
+msgid ""
+"The following allow you to define sub-bookmark files and descriptions.\n"
+"The format is multi_bookmark<capital_letter>=<filename>,<description>\n"
+"Up to 26 bookmark files (for the English capital letters) are allowed.\n"
+"We start with \"multi_bookmarkB\" since 'A' is the default (see above).\n"
+msgstr ""
+"Следующее позволит вам определить файлы подзакладок и их опиÑаниÑ.\n"
+"Формат: multi_bookmark<ЗаглавнаÑ_буква>=<имÑ_файла>,<опиÑание>\n"
+"РазрешаетÑÑ Ð¸Ð¼ÐµÑ‚ÑŒ до 26 файлов закладок (по количеÑтву английÑких заглавных\n"
+"букв). Следует начинать Ñ \"multi_bookmarkB\", Ñ‚.к. 'A' ÑвлÑетÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸ÐµÐ¼\n"
+"по умолчанию (Ñм. выше).\n"
+
+#: src/LYrcFile.c:459
+msgid ""
+"personal_mail_address specifies your personal mail address. The\n"
+"address will be sent during HTTP file transfers for authorization and\n"
+"logging purposes, and for mailed comments.\n"
+"If you do not want this information given out, set the NO_FROM_HEADER\n"
+"to TRUE in lynx.cfg, or use the -nofrom command line switch. You also\n"
+"could leave this field blank, but then you won't have it included in\n"
+"your mailed comments.\n"
+msgstr ""
+"personal_mail_address определÑет ваш личный почтовый адреÑ. Этот адреÑ\n"
+"будет поÑылатьÑÑ Ð²Ð¾ Ð²Ñ€ÐµÐ¼Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸ файлов по HTTP Ð´Ð»Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸, Ñ Ñ†ÐµÐ»ÑŒÑŽ\n"
+"Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»ÑŒÐ½Ñ‹Ñ… запиÑей, и Ð´Ð»Ñ Ð¿Ð¾Ñылаемых комментариев.\n"
+"ЕÑли вы не хотите объÑвлÑÑ‚ÑŒ Ñту информацию, уÑтановите NO_FROM_HEADER\n"
+"в TRUE в lynx.cfg, или иÑпользуйте ключ командной Ñтроки -nofrom. Ð’Ñ‹ также\n"
+"можете оÑтавить Ñто поле пуÑтым, но в Ñтом Ñлучае оно не будет включатьÑÑ Ð²\n"
+"поÑылаемые комментарии.\n"
+
+#: src/LYrcFile.c:468
+msgid ""
+"personal_mail_name specifies your personal name, for mail. The\n"
+"name is sent for mailed comments. Lynx will prompt for this,\n"
+"showing the configured value as a default when sending mail.\n"
+"This is not necessarily the same as a name provided as part of the\n"
+"personal_mail_address.\n"
+"Lynx does not save your changes to that default value as a side-effect\n"
+"of sending email. To update the default value, you must use the options\n"
+"menu, or modify this file directly.\n"
+msgstr ""
+
+#: src/LYrcFile.c:478
+msgid ""
+"preferred_charset specifies the character set in MIME notation (e.g.,\n"
+"ISO-8859-2, ISO-8859-5) which Lynx will indicate you prefer in requests\n"
+"to http servers using an Accept-Charset header. The value should NOT\n"
+"include ISO-8859-1 or US-ASCII, since those values are always assumed\n"
+"by default. May be a comma-separated list.\n"
+"If a file in that character set is available, the server will send it.\n"
+"If no Accept-Charset header is present, the default is that any\n"
+"character set is acceptable. If an Accept-Charset header is present,\n"
+"and if the server cannot send a response which is acceptable\n"
+"according to the Accept-Charset header, then the server SHOULD send\n"
+"an error response, though the sending of an unacceptable response\n"
+"is also allowed.\n"
+msgstr ""
+"preferred_charset определÑет кодировку в нотации MIME (напр.\n"
+"ISO-8859-2, ISO-8859-5), которую Lynx будет указывать как предпочтительную\n"
+"в запроÑах к http Ñерверам, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²Ð¾Ðº Accept-Charset. Это значение\n"
+"ÐЕ должно включать ISO-8859-1 или US-ASCII, Ñ‚.к. они вÑегда подразумеваютÑÑ Ð¿Ð¾\n"
+"умолчанию. Может быть ÑпиÑком, разделенным запÑтыми.\n"
+"ЕÑли файл в Ñтой кодировке доÑтупен, Ñервер пошлет его.\n"
+"ЕÑли заголовок Accept-Charset не указан, по умолчанию Ñто значит, что любаÑ\n"
+"кодировка приемлема. ЕÑли заголовок Accept-Charset указан, и еÑли Ñервер не\n"
+"может поÑлать ответ в кодировке, приемлемой в ÑоответÑтвии Ñ Ñтим заголовком,\n"
+"то Ñервер ДОЛЖЕР(SHOULD) поÑлать ответ, указывающий\n"
+"на ошибку, Ñ…Ð¾Ñ‚Ñ Ð¿Ð¾Ñылка ответа в неприемлемой кодировке тоже допуÑкаетÑÑ.\n"
+
+#: src/LYrcFile.c:494
+msgid ""
+"preferred_language specifies the language in MIME notation (e.g., en,\n"
+"fr, may be a comma-separated list in decreasing preference)\n"
+"which Lynx will indicate you prefer in requests to http servers.\n"
+"If a file in that language is available, the server will send it.\n"
+"Otherwise, the server will send the file in its default language.\n"
+msgstr ""
+"preferred_language определÑет Ñзык в нотации MIME (напр. en, fr,\n"
+"может быть ÑпиÑок, разделенный запÑтыми, по убыванию приоритета),\n"
+"который Lynx будет указывать как предпочтительный в запроÑах к http Ñерверам.\n"
+"ЕÑли файл на Ñтом Ñзыке доÑтупен, Ñервер будет поÑылать его.\n"
+"Ð’ противном Ñлучае, Ñервер будет поÑылать файл на Ñвоем Ñзыке по умолчанию.\n"
+
+#: src/LYrcFile.c:505
+msgid ""
+"If run_all_execution_links is set \"on\" then all local execution links\n"
+"will be executed when they are selected.\n"
+"\n"
+"WARNING - This is potentially VERY dangerous. Since you may view\n"
+" information that is written by unknown and untrusted sources\n"
+" there exists the possibility that Trojan horse links could be\n"
+" written. Trojan horse links could be written to erase files\n"
+" or compromise security. This should only be set to \"on\" if\n"
+" you are viewing trusted source information.\n"
+msgstr ""
+"ЕÑли run_all_execution_links уÑтановлено в \"on\", то вÑе локальные\n"
+"выполнÑемые ÑÑылки будут выполнÑÑ‚ÑŒÑÑ, когда они выбраны.\n"
+"\n"
+"ПРЕДУПРЕЖДЕÐИЕ - Потенциально Ñто ОЧЕÐЬ опаÑно. Т.к. вы можете проÑматривать\n"
+" неизвеÑтную и непроверенную информацию, ÑущеÑтвует вероÑтноÑÑ‚ÑŒ\n"
+" напиÑÐ°Ð½Ð¸Ñ ÑÑылок Ñ Ð¢Ñ€Ð¾ÑнÑким конем. СÑылки Ñ Ð¢Ñ€Ð¾ÑнÑким конем\n"
+" могут быть напиÑаны Ñ Ñ†ÐµÐ»ÑŒÑŽ ÑƒÐ½Ð¸Ñ‡Ñ‚Ð¾Ð¶ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð² или нарушениÑ\n"
+" безопаÑноÑти. Эта Ð¾Ð¿Ñ†Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° быть уÑтановлена в \"on\" только\n"
+" еÑли вы проÑматриваете проверенный иÑточник информации.\n"
+
+#: src/LYrcFile.c:516
+msgid ""
+"If run_execution_links_on_local_files is set \"on\" then all local\n"
+"execution links that are found in LOCAL files will be executed when they\n"
+"are selected. This is different from run_all_execution_links in that\n"
+"only files that reside on the local system will have execution link\n"
+"permissions.\n"
+"\n"
+"WARNING - This is potentially dangerous. Since you may view\n"
+" information that is written by unknown and untrusted sources\n"
+" there exists the possibility that Trojan horse links could be\n"
+" written. Trojan horse links could be written to erase files\n"
+" or compromise security. This should only be set to \"on\" if\n"
+" you are viewing trusted source information.\n"
+msgstr ""
+"ЕÑли run_execution_links_on_local_files находитÑÑ Ð² ÑоÑтоÑнии \"on\", то вÑе\n"
+"выполнÑемые ÑÑылки, найденные в ЛОКÐЛЬÐЫХ файлах, будут выполнÑÑ‚ÑŒÑÑ Ð² Ñлучае\n"
+"их выбора. Это отличаетÑÑ Ð¾Ñ‚ run_all_execution_links тем, что только файлы на\n"
+"локальной ÑиÑтеме будут иметь разрешение на выполнÑемые ÑÑылки.\n"
+"\n"
+"ПРЕДУПРЕЖДЕÐИЕ - Это потенциально опаÑно. Т.к. вы можете проÑматривать\n"
+" неизвеÑтную и непроверенную информацию, ÑущеÑтвует вероÑтноÑÑ‚ÑŒ\n"
+" напиÑÐ°Ð½Ð¸Ñ ÑÑылок Ñ Ð¢Ñ€Ð¾ÑнÑким конем. СÑылки Ñ Ð¢Ñ€Ð¾ÑнÑким конем\n"
+" могут быть напиÑаны Ñ Ñ†ÐµÐ»ÑŒÑŽ ÑƒÐ½Ð¸Ñ‡Ñ‚Ð¾Ð¶ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð² или нарушениÑ\n"
+" безопаÑноÑти. Эта Ð¾Ð¿Ñ†Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° быть уÑтановлена в \"on\" только\n"
+" еÑли вы проÑматриваете проверенный иÑточник информации.\n"
+
+#: src/LYrcFile.c:534
+msgid ""
+"select_popups specifies whether the OPTIONs in a SELECT block which\n"
+"lacks a MULTIPLE attribute are presented as a vertical list of radio\n"
+"buttons or via a popup menu. Note that if the MULTIPLE attribute is\n"
+"present in the SELECT start tag, Lynx always will create a vertical list\n"
+"of checkboxes for the OPTIONs. A value of \"on\" will set popup menus\n"
+"as the default while a value of \"off\" will set use of radio boxes.\n"
+"The default can be overridden via the -popup command line toggle.\n"
+msgstr ""
+"select_popups определÑет, будут ли ОПЦИИ в блоке SELECT, в котором отÑутÑтвует\n"
+"атрибут MULTIPLE, предÑтавлены вертикальным ÑпиÑком завиÑимых кнопок или\n"
+"вÑплывающим меню. Заметьте, что еÑли атрибут MULTIPLE приÑутÑтвует в теге\n"
+"SELECT, Lynx будет вÑегда Ñоздавать Ð´Ð»Ñ Ð¾Ð¿Ñ†Ð¸Ð¹ вертикальный ÑпиÑок незавиÑимых\n"
+"кнопок. Значение \"on\" уÑтанавливает по умолчанию вÑплывающие меню, в то\n"
+"Ð²Ñ€ÐµÐ¼Ñ ÐºÐ°Ðº значение \"off\" уÑтанавливает завиÑимые кнопки. Значение\n"
+"по умолчанию может быть изменено при иÑпользовании ключа командной\n"
+"Ñтроки -popup.\n"
+
+#: src/LYrcFile.c:545
+msgid ""
+"show_color specifies how to set the color mode at startup. A value of\n"
+"\"never\" will force color mode off (treat the terminal as monochrome)\n"
+"at startup even if the terminal appears to be color capable. A value of\n"
+"\"always\" will force color mode on even if the terminal appears to be\n"
+"monochrome, if this is supported by the library used to build lynx.\n"
+"A value of \"default\" will yield the behavior of assuming\n"
+"a monochrome terminal unless color capability is inferred at startup\n"
+"based on the terminal type, or the -color command line switch is used, or\n"
+"the COLORTERM environment variable is set. The default behavior always is\n"
+"used in anonymous accounts or if the \"option_save\" restriction is set.\n"
+"The effect of the saved value can be overridden via\n"
+"the -color and -nocolor command line switches.\n"
+"The mode set at startup can be changed via the \"show color\" option in\n"
+"the 'o'ptions menu. If the option settings are saved, the \"on\" and\n"
+"\"off\" \"show color\" settings will be treated as \"default\".\n"
+msgstr ""
+"show_color определÑет, как уÑтанавливать цветовой режим при Ñтарте. Значение\n"
+"\"never\" будет принудительно отключать цветовой режим (и трактовать\n"
+"терминал как монохромный), даже еÑли на первый взглÑд терминал ÑпоÑобен\n"
+"поддерживать цвета. Значение \"always\" принудительно включает цветовой\n"
+"режим, даже еÑли терминал кажетÑÑ Ð¼Ð¾Ð½Ð¾Ñ…Ñ€Ð¾Ð¼Ð½Ñ‹Ð¼, еÑли Ñто поддерживаетÑÑ\n"
+"библиотекой, иÑпользовавшейÑÑ Ð¿Ñ€Ð¸ Ñборке lynx. Значение \"default\" приведет\n"
+"к поведению, при котором подразумеваетÑÑ Ð¼Ð¾Ð½Ð¾Ñ…Ñ€Ð¾Ð¼Ð½Ñ‹Ð¹ терминал, за иÑключением\n"
+"Ñлучаев, когда при Ñтарте цветовые возможноÑти Ñледуют из типа терминала,\n"
+"или задан ключ командной Ñтроки -color, или уÑтановлена Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ñреды\n"
+"COLORTERM. Поведение по умолчанию вÑегда иÑпользуетÑÑ Ð¿Ñ€Ð¸ анонимных account\n"
+"или еÑли уÑтановлено ограничение \"option_save\". Эффект Ñохраненного\n"
+"Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ‚ быть перекрыт Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ ключей командной Ñтроки\n"
+"-color и -nocolor.\n"
+"Режим, уÑтановленный при Ñтарте, может быть изменен Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ опции\n"
+"\"показывать цвет\" в меню опций. ЕÑли наÑтройки опций Ñохранены, значениÑ\n"
+"\"on\" и \"off\" параметра \"показывать цвет\" будут\n"
+"трактоватьÑÑ ÐºÐ°Ðº \"default\".\n"
+
+#: src/LYrcFile.c:562
+msgid ""
+"show_cursor specifies whether to 'hide' the cursor to the right (and\n"
+"bottom, if possible) of the screen, or to place it to the left of the\n"
+"current link in documents, or current option in select popup windows.\n"
+"Positioning the cursor to the left of the current link or option is\n"
+"helpful for speech or braille interfaces, and when the terminal is\n"
+"one which does not distinguish the current link based on highlighting\n"
+"or color. A value of \"on\" will set positioning to the left as the\n"
+"default while a value of \"off\" will set 'hiding' of the cursor.\n"
+"The default can be overridden via the -show_cursor command line toggle.\n"
+msgstr ""
+"show_cursor определÑет, 'Ñкрывать' курÑор Ñправа (и внизу, еÑли возможно)\n"
+"Ñкрана, или помещать его Ñлева от текущей ÑÑылки в документах или текущей\n"
+"опции во вÑплывающих меню выбора. Позиционирование курÑора Ñлева от текущей\n"
+"ÑÑылки или опции полезно Ð´Ð»Ñ Ñ€ÐµÑ‡ÐµÐ²Ñ‹Ñ… интерфейÑов или интерфейÑов Ð´Ð»Ñ Ñлепых,\n"
+"или когда терминал один из тех, которые не выделÑÑŽÑ‚ текущую ÑÑылки ÑркоÑтью\n"
+"или цветом. Значение \"on\" уÑтанавливает раÑположение Ñлева как опцию по\n"
+"умолчанию, в то Ð²Ñ€ÐµÐ¼Ñ ÐºÐ°Ðº значение \"off\" уÑтанавливает 'Ñокрытие' курÑора.\n"
+"Значение по умолчанию может быть перекрыто опцией командной\n"
+"Ñтроки -show_cursor.\n"
+
+#: src/LYrcFile.c:573
+msgid ""
+"show_dotfiles specifies that the directory listing should include\n"
+"\"hidden\" (dot) files/directories. If set \"on\", this will be\n"
+"honored only if enabled via userdefs.h and/or lynx.cfg, and not\n"
+"restricted via a command line switch. If display of hidden files\n"
+"is disabled, creation of such files via Lynx also is disabled.\n"
+msgstr ""
+"show_dotfiles определÑет, что Ñодержимое каталога должно включать\n"
+"\"Ñкрытые\" (начинающиеÑÑ Ñ Ñ‚Ð¾Ñ‡ÐºÐ¸) файлы/каталоги. ЕÑли уÑтановлено в \"on\",\n"
+"Ñто будет учитыватьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ еÑли включено в userdefs.h и/или в lynx.cfg,\n"
+"и не запрещено Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ ключей командной Ñтроки. ЕÑли отображение Ñкрытых\n"
+"файлов отключено, Ñоздание таких файлов из Lynx тоже запрещаетÑÑ.\n"
+
+#: src/LYrcFile.c:584
+msgid ""
+"If sub_bookmarks is not turned \"off\", and multiple bookmarks have\n"
+"been defined (see below), then all bookmark operations will first\n"
+"prompt the user to select an active sub-bookmark file. If the default\n"
+"Lynx bookmark_file is defined (see above), it will be used as the\n"
+"default selection. When this option is set to \"advanced\", and the\n"
+"user mode is advanced, the 'v'iew bookmark command will invoke a\n"
+"statusline prompt instead of the menu seen in novice and intermediate\n"
+"user modes. When this option is set to \"standard\", the menu will be\n"
+"presented regardless of user mode.\n"
+msgstr ""
+"ЕÑли sub_bookmarks не находитÑÑ Ð² ÑоÑтоÑнии \"off\", и множеÑтвенные закладки\n"
+"были определены (Ñм. ниже), то вÑе операции Ñ Ð·Ð°ÐºÐ»Ð°Ð´ÐºÐ°Ð¼Ð¸ будут начинатьÑÑ Ñ\n"
+"запроÑа Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° активного файла подзакладок. ЕÑли файл\n"
+"по умолчанию Lynx определен (Ñм. выше), он будет иÑпользоватьÑÑ ÐºÐ°Ðº выбор по\n"
+"умолчанию. Когда Ñта Ð¾Ð¿Ñ†Ð¸Ñ ÑƒÑтановлена в \"advanced\", и выбран Режим\n"
+"ÐŸÐ¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ advanced, команда проÑмотра закладок ('v') будет вызывать запроÑ\n"
+"в Ñтроке ÑтатуÑа, вмеÑто меню, выводимого в Режиме ÐŸÐ¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ novice и\n"
+"intermediate. Когда Ñта Ð¾Ð¿Ñ†Ð¸Ñ ÑƒÑтановлена в \"standard\", меню будет\n"
+"выводитьÑÑ Ð²Ð½Ðµ завиÑимоÑти от Режима ПользователÑ.\n"
+
+#: src/LYrcFile.c:598
+msgid ""
+"user_mode specifies the users level of knowledge with Lynx. The\n"
+"default is \"NOVICE\" which displays two extra lines of help at the\n"
+"bottom of the screen to aid the user in learning the basic Lynx\n"
+"commands. Set user_mode to \"INTERMEDIATE\" to turn off the extra info.\n"
+"Use \"ADVANCED\" to see the URL of the currently selected link at the\n"
+"bottom of the screen.\n"
+msgstr ""
+"user_mode определÑет уровень Ð·Ð½Ð°Ð½Ð¸Ñ Lynx пользователем. По умолчанию\n"
+"уÑтановлено \"NOVICE\", что отображает две дополнительных Ñтроки подÑказок\n"
+"внизу Ñкрана, чтобы помочь пользователю в изучении оÑновных команд Lynx.\n"
+"УÑтановите user_mode в \"INTERMEDIATE\" чтобы убрать дополнительную\n"
+"информацию. ИÑпользуйте \"ADVANCED\" Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ URL текущей выбранной\n"
+"ÑÑылки внизу Ñкрана.\n"
+
+#: src/LYrcFile.c:607
+msgid ""
+"If verbose_images is \"on\", lynx will print the name of the image\n"
+"source file in place of [INLINE], [LINK] or [IMAGE]\n"
+"See also VERBOSE_IMAGES in lynx.cfg\n"
+msgstr ""
+"ЕÑли verbose_images находитÑÑ Ð² ÑоÑтоÑнии \"on\", lynx будет печатать имÑ\n"
+"иÑходного файла Ñ ÐºÐ°Ñ€Ñ‚Ð¸Ð½ÐºÐ¾Ð¹ на меÑте [INLINE], [LINK] или [IMAGE]\n"
+"См. также VERBOSE_IMAGES в lynx.cfg\n"
+
+#: src/LYrcFile.c:612
+msgid ""
+"If vi_keys is set to \"on\", then the normal VI movement keys:\n"
+" j = down k = up\n"
+" h = left l = right\n"
+"will be enabled. These keys are only lower case.\n"
+"Capital 'H', 'J' and 'K will still activate help, jump shortcuts,\n"
+"and the keymap display, respectively.\n"
+msgstr ""
+"ЕÑли vi_keys уÑтановлено в \"on\", то будут включены обычные команды\n"
+"Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ VI:\n"
+" j = вниз k = вверх\n"
+" h = влево l = вправо\n"
+"Эти клавиши дейÑтвуют так только в нижнем региÑтре.\n"
+"Заглавные 'H', 'J' и 'K' будут по-прежнему активизировать помощь, ÑокращениÑ\n"
+"перехода и вывод Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ ÐºÐ»Ð°Ð²Ð¸Ñˆ, ÑоответÑтвенно.\n"
+
+#: src/LYrcFile.c:620
+msgid ""
+"The visited_links setting controls how Lynx organizes the information\n"
+"in the Visited Links Page.\n"
+msgstr ""
+"УÑтановка visited_links контролирует, как Lynx организует информацию\n"
+"на Странице ПоÑещенных СÑылок.\n"
+
+#: src/LYrcFile.c:845
+msgid ""
+"If keypad_mode is set to \"NUMBERS_AS_ARROWS\", then the numbers on\n"
+"your keypad when the numlock is on will act as arrow keys:\n"
+" 8 = Up Arrow\n"
+" 4 = Left Arrow 6 = Right Arrow\n"
+" 2 = Down Arrow\n"
+"and the corresponding keyboard numbers will act as arrow keys,\n"
+"regardless of whether numlock is on.\n"
+msgstr ""
+"ЕÑли keypad_mode уÑтановлено в \"NUMBERS_AS_ARROWS\", то цифры на вашей\n"
+"дополнительной клавиатуре, еÑли включен режим numlock, будут дейÑтвовать\n"
+"как клавиши Ñтрелок:\n"
+" 8 = Стрелка вверх\n"
+" 4 = Стрелка влево 6 = Стрелка вправо\n"
+" 2 = Стрелка вниз\n"
+"и ÑоответÑтвующие цифры на оÑновной клавиатуре будут дейÑтвовать как\n"
+"клавиши Ñтрелок, вне завиÑимоÑти от ÑоÑтоÑÐ½Ð¸Ñ numlock.\n"
+
+#: src/LYrcFile.c:854
+msgid ""
+"If keypad_mode is set to \"LINKS_ARE_NUMBERED\", then numbers will\n"
+"appear next to each link and numbers are used to select links.\n"
+msgstr ""
+"ЕÑли keypad_mode уÑтановлено в ÑоÑтоÑние \"LINKS_ARE_NUMBERED\", то чиÑла\n"
+"будут поÑвлÑÑ‚ÑŒÑÑ Ñледом за каждой ÑÑылкой и они могут быть иÑпользованы длÑ\n"
+"выбора ÑÑылки.\n"
+
+#: src/LYrcFile.c:858
+msgid ""
+"If keypad_mode is set to \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\", then\n"
+"numbers will appear next to each link and visible form input field.\n"
+"Numbers are used to select links, or to move the \"current link\" to a\n"
+"form input field or button. In addition, options in popup menus are\n"
+"indexed so that the user may type an option number to select an option in\n"
+"a popup menu, even if the option isn't visible on the screen. Reference\n"
+"lists and output from the list command also enumerate form inputs.\n"
+msgstr ""
+"ЕÑли keypad_mode уÑтановлено в \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\", то\n"
+"чиÑла будут поÑвлÑÑ‚ÑŒÑÑ Ñледом за каждой ÑÑылкой и отображаемым полем ввода\n"
+"формы. ЧиÑла иÑпользуютÑÑ Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° ÑÑылок, или Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ\n"
+"\"текущей ÑÑылки\" на поле ввода или кнопку формы. Кроме того, опции во\n"
+"вÑплывающих меню индекÑированы так, что пользователь Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° может ввеÑти\n"
+"номер опции, даже еÑли Ð¾Ð¿Ñ†Ð¸Ñ Ð½Ðµ видна на Ñкране. СпиÑки ÑÑылок и результат\n"
+"команды вывода ÑпиÑка также нумеруют Ð¿Ð¾Ð»Ñ Ð²Ð²Ð¾Ð´Ð° формы.\n"
+
+#: src/LYrcFile.c:867
+msgid ""
+"NOTE: Some fixed format documents may look disfigured when\n"
+"\"LINKS_ARE_NUMBERED\" or \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\" are\n"
+"enabled.\n"
+msgstr ""
+"ПРИМЕЧÐÐИЕ: некоторые документы фикÑированного формата могут\n"
+"отображатьÑÑ Ð½ÐµÐ¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð¾, еÑли включены опции \"LINKS_ARE_NUMBERED\"\n"
+"или \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\".\n"
+
+#: src/LYrcFile.c:899
+msgid ""
+"Lynx User Defaults File\n"
+"\n"
+msgstr ""
+
+#: src/LYrcFile.c:908
+msgid ""
+"This file contains options saved from the Lynx Options Screen (normally\n"
+"with the 'o' key). To save options with that screen, you must select the\n"
+"checkbox:\n"
+msgstr ""
+
+#: src/LYrcFile.c:915
+msgid ""
+"You must then save the settings using the link on the line above the\n"
+"checkbox:\n"
+msgstr ""
+
+#: src/LYrcFile.c:922
+msgid ""
+"You may also use the command-line option \"-forms_options\", which displays\n"
+"the simpler Options Menu instead. Save options with that using the '>' key.\n"
+"\n"
+msgstr ""
+
+#: src/LYrcFile.c:929
+msgid ""
+"This file contains options saved from the Lynx Options Screen (normally\n"
+"with the '>' key).\n"
+"\n"
+msgstr ""
+
+#: src/LYrcFile.c:936
+#, fuzzy
+#| msgid ""
+#| "Lynx User Defaults File\n"
+#| "\n"
+#| "This file contains options saved from the Lynx Options Screen (normally\n"
+#| "with the '>' key). There is normally no need to edit this file manually,\n"
+#| "since the defaults here can be controlled from the Options Screen, and the\n"
+#| "next time options are saved from the Options Screen this file will be\n"
+#| "completely rewritten. You have been warned...\n"
+#| "If you are looking for the general configuration file - it is normally\n"
+#| "called lynx.cfg, and it has different content and a different format.\n"
+#| "It is not this file.\n"
+msgid ""
+"There is normally no need to edit this file manually, since the defaults\n"
+"here can be controlled from the Options Screen, and the next time options\n"
+"are saved from the Options Screen this file will be completely rewritten.\n"
+"You have been warned...\n"
+"\n"
+"If you are looking for the general configuration file - it is normally\n"
+"called \"lynx.cfg\". It has different content and a different format.\n"
+"It is not this file.\n"
+msgstr ""
+"Файл Lynx пользовательÑких опций по умолчанию\n"
+"\n"
+"Этот файл Ñодержит опции, Ñохраненные из Экрана Опций Lynx (обычно\n"
+"Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ клавиши '>'). Как правило, нет ÑмыÑла редактировать Ñтот файл\n"
+"вручную, Ñ‚.к. Ñти опции по умолчанию могут изменÑÑ‚ÑŒÑÑ Ð¸Ð· Экрана Опций, и когда\n"
+"в Ñледующий раз опции будут Ñохранены из Экрана Опций, Ñтот файл будет\n"
+"полноÑтью перезапиÑан. Ð’Ñ‹ были предупреждены...\n"
+"ЕÑли вы ищете общий конфигурационный файл, то он обычно называетÑÑ lynx.cfg\n"
+"и имеет другое Ñодержание и другой формат.\n"
+"Это не тот файл.\n"
+
+#~ msgid "History List maximum reached! Document not pushed."
+#~ msgstr "ДоÑтигнут макÑимум СпиÑка ИÑтории! Документ не помещен."
+
+#~ msgid "Socket read failed for 180,000 tries."
+#~ msgstr "Ошибка при чтении Ñокета в течение 180,000 попыток."
+
+#~ msgid "Very long lines have been wrapped!"
+#~ msgstr "Очень длинные Ñтроки были перенеÑены!"
+
+#~ msgid "KB"
+#~ msgstr "КБ"
+
+#~ msgid "reason unknown."
+#~ msgstr "причина неизвеÑтна."
+
+#~ msgid "Path too long"
+#~ msgstr "Путь Ñлишком длинный"
+
+#~ msgid "Source and destination are the same location - request ignored!"
+#~ msgstr "ИÑточник и путь Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ñовпадают - Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð¸Ð³Ð½Ð¾Ñ€Ð¸Ñ€Ð¾Ð²Ð°Ð½!"
+
+#~ msgid "Remove '%s' and all of its contents?"
+#~ msgstr "Удалить '%s' и вÑе его Ñодержимое?"
+
+#~ msgid "Remove directory and all of its contents?"
+#~ msgstr "Удалить каталог и вÑе его Ñодержимое?"
+
+#~ msgid "create %s"
+#~ msgstr " Ñоздать %s"
+
+#~ msgid "Unable to open file management menu file."
+#~ msgstr "Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ файл меню работы Ñ Ñ„Ð°Ð¹Ð»Ð°Ð¼Ð¸."
+
+#~ msgid "Ignoring invalid HOME"
+#~ msgstr "Ðеверное значение HOME игнорировано"
diff --git a/po/sl.po b/po/sl.po
new file mode 100644
index 0000000..9a57a03
--- /dev/null
+++ b/po/sl.po
@@ -0,0 +1,6151 @@
+# Slovenian translation of Lynx WWW browser.
+# Copyright (C) 1999 Free Software Foundation, Inc.
+# Roman Maurer <roman.maurer@hermes.si>, 1999.
+# $Id: sl.po,v 1.43 2016/10/14 23:33:23 tom Exp $
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: lynx 2.8.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2012-02-12 19:13-0500\n"
+"PO-Revision-Date: 1999-12-29 12:30 +0200\n"
+"Last-Translator: Roman Maurer <roman.maurer@hermes.si>\n"
+"Language-Team: Slovenian <sl@li.org>\n"
+"Language: sl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=iso-8859-2\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. ******************************************************************
+#. * The following definitions are for status line prompts, messages, or
+#. * warnings issued by Lynx during program execution. You can modify
+#. * them to make them more appropriate for your site. We recommend that
+#. * you extend these definitions to other languages using the gettext
+#. * library. There are also scattered uses of 'gettext()' throughout the
+#. * Lynx source, covering all but those messages which (a) are used for
+#. * debugging (CTRACE) or (b) are constants used in interaction with
+#. * other programs.
+#. *
+#. * See ABOUT-NLS and po/readme for details and location of contributed
+#. * translations. When no translation is available, the English default is
+#. * used.
+#.
+#: LYMessages.c:27
+#, c-format
+msgid "Alert!: %s"
+msgstr "Pozor!: %s"
+
+#: LYMessages.c:28
+msgid "Welcome"
+msgstr "Dobrodo¹li"
+
+#: LYMessages.c:29
+msgid "Are you sure you want to quit?"
+msgstr "Ste preprièani, da ¾elite konèati?"
+
+#: LYMessages.c:31
+msgid "Really exit from Lynx?"
+msgstr "Zares zapustim Lynx?"
+
+#: LYMessages.c:33
+msgid "Connection interrupted."
+msgstr "Povezava prekinjena."
+
+#: LYMessages.c:34
+msgid "Data transfer interrupted."
+msgstr "Podatkovni prenos prekinjen."
+
+#: LYMessages.c:35
+msgid "Cancelled!!!"
+msgstr "Preklicano!!!"
+
+#: LYMessages.c:36
+msgid "Cancelling!"
+msgstr "Preklicujem!"
+
+#: LYMessages.c:37
+msgid "Excellent!!!"
+msgstr "Izvrstno!!!"
+
+#: LYMessages.c:38
+msgid "OK"
+msgstr "V redu."
+
+#: LYMessages.c:39
+msgid "Done!"
+msgstr "Opravljeno!"
+
+#: LYMessages.c:40
+msgid "Bad request!"
+msgstr "Slaba zahteva!"
+
+#: LYMessages.c:41
+msgid "previous"
+msgstr "prej¹nji"
+
+#: LYMessages.c:42
+msgid "next screen"
+msgstr "naslednji zaslon"
+
+#: LYMessages.c:43
+msgid "HELP!"
+msgstr "POMOÈ!"
+
+#: LYMessages.c:44
+msgid ", help on "
+msgstr ", pomoè za "
+
+#. #define HELP
+#: LYMessages.c:46
+msgid "Commands: Use arrow keys to move, '?' for help, 'q' to quit, '<-' to go back."
+msgstr "Ukazi: pu¹èice za premikanje ,?` za pomoè, ,q` za izhod, vraèalka za povratek."
+
+#. #define MOREHELP
+#: LYMessages.c:48
+msgid "-- press space for more, use arrow keys to move, '?' for help, 'q' to quit."
+msgstr "-- pritisnite presledek za veè, pu¹èice za premik, ,?` za pomoè, ,q` za izhod."
+
+#: LYMessages.c:49
+msgid "-- press space for next page --"
+msgstr "-- pritisnite presledek za naslednjo stran --"
+
+#: LYMessages.c:50
+#, fuzzy
+#| msgid "Path too long"
+msgid "URL too long"
+msgstr "Predolga pot"
+
+#. Inactive input fields, messages used with -tna option - kw
+#. #define FORM_LINK_TEXT_MESSAGE_INA
+#: LYMessages.c:56
+msgid "(Text entry field) Inactive. Press <return> to activate."
+msgstr ""
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_INA
+#: LYMessages.c:58
+msgid "(Textarea) Inactive. Press <return> to activate."
+msgstr ""
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_INA_E
+#: LYMessages.c:60
+#, fuzzy, c-format
+#| msgid "(Textarea) Enter text. Use UP/DOWN arrows or TAB to move off (^Ve for editor)."
+msgid "(Textarea) Inactive. Press <return> to activate (%s for editor)."
+msgstr "(Besedilo) Vnesite besedilo. Uporabljajte GOR/DOL ali TAB (^Ve za urejevalnik)."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE_INA
+#: LYMessages.c:62
+#, fuzzy
+#| msgid "(Form field) Enter text. Use <return> to submit ('x' for no cache)."
+msgid "(Form field) Inactive. Use <return> to edit."
+msgstr "(Vnosno polje) Vnesite besedilo. Na koncu uporabite <return> ('x' brez predpomnenja)."
+
+#. #define FORM_TEXT_SUBMIT_MESSAGE_INA_X
+#: LYMessages.c:64
+#, fuzzy, c-format
+#| msgid "(Form field) Enter text. Use <return> to submit ('x' for no cache)."
+msgid "(Form field) Inactive. Use <return> to edit (%s to submit with no cache)."
+msgstr "(Vnosno polje) Vnesite besedilo. Na koncu uporabite <return> ('x' brez predpomnenja)."
+
+#. #define FORM_TEXT_RESUBMIT_MESSAGE_INA
+#: LYMessages.c:66
+#, fuzzy
+#| msgid "(Form field) Enter text. Use <return> to submit, arrows or tab to move off."
+msgid "(Form field) Inactive. Press <return> to edit, press <return> twice to submit."
+msgstr "(Vnosno polje) Vnesite besedilo. Na koncu uporabite <return>, pu¹èice ali tab za premik."
+
+#. #define FORM_TEXT_SUBMIT_MAILTO_MSG_INA
+#: LYMessages.c:68
+msgid "(mailto form field) Inactive. Press <return> to change."
+msgstr ""
+
+#. #define FORM_LINK_PASSWORD_MESSAGE_INA
+#: LYMessages.c:70
+msgid "(Password entry field) Inactive. Press <return> to activate."
+msgstr ""
+
+#. #define FORM_LINK_FILE_UNM_MSG
+#: LYMessages.c:73
+msgid "UNMODIFIABLE file entry field. Use UP or DOWN arrows or tab to move off."
+msgstr "NESPREMENLJIVO datoteèno polje. Uporabljajte GOR/DOL ali tab."
+
+#. #define FORM_LINK_FILE_MESSAGE
+#: LYMessages.c:75
+msgid "(File entry field) Enter filename. Use UP or DOWN arrows or tab to move off."
+msgstr "(Datoteèno polje) Vnesite ime datoteke. Uporabljajte GOR/DOL ali tab."
+
+#. #define FORM_LINK_TEXT_MESSAGE
+#: LYMessages.c:77
+msgid "(Text entry field) Enter text. Use UP or DOWN arrows or tab to move off."
+msgstr "(Tekstovno vnosno polje) Vnesite besedilo. Uporabljajte pu¹èici GOR/DOL ali tab."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE
+#: LYMessages.c:79
+#, fuzzy
+#| msgid "(Textarea) Enter text. Use UP/DOWN arrows or TAB to move off (^Ve for editor)."
+msgid "(Textarea) Enter text. Use UP/DOWN arrows or TAB to move off."
+msgstr "(Besedilo) Vnesite besedilo. Uporabljajte GOR/DOL ali TAB (^Ve za urejevalnik)."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_E
+#: LYMessages.c:81
+#, fuzzy, c-format
+#| msgid "(Textarea) Enter text. Use UP/DOWN arrows or TAB to move off (^Ve for editor)."
+msgid "(Textarea) Enter text. Use UP/DOWN arrows or TAB to move off (%s for editor)."
+msgstr "(Besedilo) Vnesite besedilo. Uporabljajte GOR/DOL ali TAB (^Ve za urejevalnik)."
+
+#. #define FORM_LINK_TEXT_UNM_MSG
+#: LYMessages.c:83
+msgid "UNMODIFIABLE form text field. Use UP or DOWN arrows or tab to move off."
+msgstr "NESPREMENLJIVO vnosno polje. Za premik uporabite pu¹èici gor ali dol ali Tab."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE
+#: LYMessages.c:85
+#, fuzzy
+#| msgid "(Form field) Enter text. Use <return> to submit ('x' for no cache)."
+msgid "(Form field) Enter text. Use <return> to submit."
+msgstr "(Vnosno polje) Vnesite besedilo. Na koncu uporabite <return> ('x' brez predpomnenja)."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE_X
+#: LYMessages.c:87
+#, fuzzy, c-format
+#| msgid "(Form field) Enter text. Use <return> to submit ('x' for no cache)."
+msgid "(Form field) Enter text. Use <return> to submit (%s for no cache)."
+msgstr "(Vnosno polje) Vnesite besedilo. Na koncu uporabite <return> ('x' brez predpomnenja)."
+
+#. #define FORM_LINK_TEXT_RESUBMIT_MESSAGE
+#: LYMessages.c:89
+msgid "(Form field) Enter text. Use <return> to submit, arrows or tab to move off."
+msgstr "(Vnosno polje) Vnesite besedilo. Na koncu uporabite <return>, pu¹èice ali tab za premik."
+
+#. #define FORM_LINK_TEXT_SUBMIT_UNM_MSG
+#: LYMessages.c:91
+msgid "UNMODIFIABLE form field. Use UP or DOWN arrows or tab to move off."
+msgstr "NESPREMENLJIVO polje obrazca. Uporabite tipke gor, dol ali tab za premik drugam."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MAILTO_MSG
+#: LYMessages.c:93
+msgid "(mailto form field) Enter text. Use <return> to submit, arrows to move off."
+msgstr ""
+
+#. #define FORM_LINK_TEXT_SUBMIT_MAILTO_DIS_MSG
+#: LYMessages.c:95
+msgid "(mailto form field) Mail is disallowed so you cannot submit."
+msgstr ""
+
+#. #define FORM_LINK_PASSWORD_MESSAGE
+#: LYMessages.c:97
+msgid "(Password entry field) Enter text. Use UP or DOWN arrows or tab to move off."
+msgstr ""
+
+#. #define FORM_LINK_PASSWORD_UNM_MSG
+#: LYMessages.c:99
+msgid "UNMODIFIABLE form password. Use UP or DOWN arrows or tab to move off."
+msgstr ""
+
+#. #define FORM_LINK_CHECKBOX_MESSAGE
+#: LYMessages.c:101
+msgid "(Checkbox Field) Use right-arrow or <return> to toggle."
+msgstr ""
+
+#. #define FORM_LINK_CHECKBOX_UNM_MSG
+#: LYMessages.c:103
+msgid "UNMODIFIABLE form checkbox. Use UP or DOWN arrows or tab to move off."
+msgstr ""
+
+#. #define FORM_LINK_RADIO_MESSAGE
+#: LYMessages.c:105
+msgid "(Radio Button) Use right-arrow or <return> to toggle."
+msgstr ""
+
+#. #define FORM_LINK_RADIO_UNM_MSG
+#: LYMessages.c:107
+msgid "UNMODIFIABLE form radio button. Use UP or DOWN arrows or tab to move off."
+msgstr ""
+
+#. #define FORM_LINK_SUBMIT_PREFIX
+#: LYMessages.c:109
+msgid "Submit ('x' for no cache) to "
+msgstr ""
+
+#. #define FORM_LINK_RESUBMIT_PREFIX
+#: LYMessages.c:111
+msgid "Submit to "
+msgstr ""
+
+#. #define FORM_LINK_SUBMIT_MESSAGE
+#: LYMessages.c:113
+msgid "(Form submit button) Use right-arrow or <return> to submit ('x' for no cache)."
+msgstr ""
+
+#. #define FORM_LINK_RESUBMIT_MESSAGE
+#: LYMessages.c:115
+msgid "(Form submit button) Use right-arrow or <return> to submit."
+msgstr ""
+
+#. #define FORM_LINK_SUBMIT_DIS_MSG
+#: LYMessages.c:117
+msgid "DISABLED form submit button. Use UP or DOWN arrows or tab to move off."
+msgstr ""
+
+#. #define FORM_LINK_SUBMIT_MAILTO_PREFIX
+#: LYMessages.c:119
+msgid "Submit mailto form to "
+msgstr ""
+
+#. #define FORM_LINK_SUBMIT_MAILTO_MSG
+#: LYMessages.c:121
+msgid "(mailto form submit button) Use right-arrow or <return> to submit."
+msgstr ""
+
+#. #define FORM_LINK_SUBMIT_MAILTO_DIS_MSG
+#: LYMessages.c:123
+msgid "(mailto form submit button) Mail is disallowed so you cannot submit."
+msgstr ""
+
+#. #define FORM_LINK_RESET_MESSAGE
+#: LYMessages.c:125
+msgid "(Form reset button) Use right-arrow or <return> to reset form to defaults."
+msgstr ""
+
+#. #define FORM_LINK_RESET_DIS_MSG
+#: LYMessages.c:127
+msgid "DISABLED form reset button. Use UP or DOWN arrows or tab to move off."
+msgstr ""
+
+#. #define FORM_LINK_BUTTON_MESSAGE
+#: LYMessages.c:129
+#, fuzzy
+#| msgid "(Text entry field) Enter text. Use UP or DOWN arrows or tab to move off."
+msgid "(Script button) Use UP or DOWN arrows or tab to move off."
+msgstr "(Tekstovno vnosno polje) Vnesite besedilo. Uporabljajte pu¹èici GOR/DOL ali tab."
+
+#. #define FORM_LINK_BUTTON_DIS_MSG
+#: LYMessages.c:131
+#, fuzzy
+#| msgid "UNMODIFIABLE form text field. Use UP or DOWN arrows or tab to move off."
+msgid "DISABLED Script button. Use UP or DOWN arrows or tab to move off."
+msgstr "NESPREMENLJIVO vnosno polje. Za premik uporabite pu¹èici gor ali dol ali Tab."
+
+#. #define FORM_LINK_OPTION_LIST_MESSAGE
+#: LYMessages.c:133
+msgid "(Option list) Hit return and use arrow keys and return to select option."
+msgstr ""
+
+#. #define CHOICE_LIST_MESSAGE
+#: LYMessages.c:135
+msgid "(Choice list) Hit return and use arrow keys and return to select option."
+msgstr ""
+
+#. #define FORM_LINK_OPTION_LIST_UNM_MSG
+#: LYMessages.c:137
+msgid "UNMODIFIABLE option list. Use return or arrow keys to review or leave."
+msgstr ""
+
+#. #define CHOICE_LIST_UNM_MSG
+#: LYMessages.c:139
+msgid "UNMODIFIABLE choice list. Use return or arrow keys to review or leave."
+msgstr ""
+
+#: LYMessages.c:140
+msgid "Submitting form..."
+msgstr "Po¹iljamo obrazec..."
+
+#: LYMessages.c:141
+msgid "Resetting form..."
+msgstr "Resetiramo obrazec..."
+
+#. #define RELOADING_FORM
+#: LYMessages.c:143
+msgid "Reloading document. Any form entries will be lost!"
+msgstr "Ponovno nalagamo dokument. Vsi vnosi v obrazcu bodo izgubljeni!"
+
+#. #define LINK_NOT_IN_FORM
+#: LYMessages.c:145
+msgid "The current link is not in a FORM"
+msgstr ""
+
+#: LYMessages.c:146
+#, c-format
+msgid "Warning: Cannot transcode form data to charset %s!"
+msgstr "Pozor: Prevedba podatkov v znakovni nabor %s ni mogoèa!"
+
+#. #define NORMAL_LINK_MESSAGE
+#: LYMessages.c:149
+msgid "(NORMAL LINK) Use right-arrow or <return> to activate."
+msgstr ""
+
+#: LYMessages.c:150
+msgid "The resource requested is not available at this time."
+msgstr ""
+
+#: LYMessages.c:151
+msgid "Enter Lynx keystroke command: "
+msgstr "Vnesite tipkovni ukaz Lynxu: "
+
+#: LYMessages.c:152
+msgid "Looking up "
+msgstr "I¹èemo "
+
+#: LYMessages.c:153
+#, c-format
+msgid "Getting %s"
+msgstr "Prena¹amo %s"
+
+#: LYMessages.c:154
+#, c-format
+msgid "Skipping %s"
+msgstr "Preskakujemo %s"
+
+#: LYMessages.c:155
+#, c-format
+msgid "Using %s"
+msgstr "Uporabljamo %s"
+
+#: LYMessages.c:156
+#, c-format
+msgid "Illegal URL: %s"
+msgstr "Nepravilni URL: %s"
+
+#: LYMessages.c:157
+#, c-format
+msgid "Badly formed address %s"
+msgstr "Slabo oblikovan naslov %s"
+
+#: LYMessages.c:158
+#, c-format
+msgid "URL: %s"
+msgstr "URL: %s"
+
+#: LYMessages.c:159
+msgid "Unable to access WWW file!!!"
+msgstr "Dostop do spletne datoteke ni mogoè!!!"
+
+#: LYMessages.c:160
+#, c-format
+msgid "This is a searchable index. Use %s to search."
+msgstr "To je kazalo z mo¾nostjo iskanja. Uporabite %s za iskanje."
+
+#. #define WWW_INDEX_MORE_MESSAGE
+#: LYMessages.c:162
+#, c-format
+msgid "--More-- This is a searchable index. Use %s to search."
+msgstr "--Naprej-- To je kazalo z mo¾nostjo iskanja. Uporabite %s za iskanje."
+
+#: LYMessages.c:163
+msgid "You have entered an invalid link number."
+msgstr "Vnesli ste neveljavno ¹tevilko povezave."
+
+#. #define SOURCE_HELP
+#: LYMessages.c:165
+msgid "Currently viewing document source. Press '\\' to return to rendered version."
+msgstr ""
+
+#. #define NOVICE_LINE_ONE
+#: LYMessages.c:167
+msgid " Arrow keys: Up and Down to move. Right to follow a link; Left to go back. \n"
+msgstr ""
+
+#. #define NOVICE_LINE_TWO
+#: LYMessages.c:169
+msgid " H)elp O)ptions P)rint G)o M)ain screen Q)uit /=search [delete]=history list \n"
+msgstr ""
+
+#. #define NOVICE_LINE_TWO_A
+#: LYMessages.c:171
+msgid " O)ther cmds H)elp K)eymap G)oto P)rint M)ain screen o)ptions Q)uit \n"
+msgstr ""
+
+#. #define NOVICE_LINE_TWO_B
+#: LYMessages.c:173
+msgid " O)ther cmds B)ack E)dit D)ownload ^R)eload ^W)ipe screen search doc: / \n"
+msgstr ""
+
+#. #define NOVICE_LINE_TWO_C
+#: LYMessages.c:175
+msgid "O)ther cmds C)omment History: <backspace> Bookmarks: V)iew, A)dd, R)emove \n"
+msgstr ""
+
+#. #define FORM_NOVICELINE_ONE
+#: LYMessages.c:177
+msgid " Enter text into the field by typing on the keyboard "
+msgstr ""
+
+#. #define FORM_NOVICELINE_TWO
+#: LYMessages.c:179
+msgid " Ctrl-U to delete all text in field, [Backspace] to delete a character "
+msgstr ""
+
+#. #define FORM_NOVICELINE_TWO_DELBL
+#: LYMessages.c:181
+msgid " Ctrl-U to delete text in field, [Backspace] to delete a character "
+msgstr ""
+
+#. #define FORM_NOVICELINE_TWO_VAR
+#: LYMessages.c:183
+#, c-format
+msgid " %s to delete all text in field, [Backspace] to delete a character "
+msgstr ""
+
+#. #define FORM_NOVICELINE_TWO_DELBL_VAR
+#: LYMessages.c:185
+#, c-format
+msgid " %s to delete text in field, [Backspace] to delete a character "
+msgstr ""
+
+#. mailto
+#: LYMessages.c:188
+msgid "Malformed mailto form submission! Cancelled!"
+msgstr ""
+
+#: LYMessages.c:189
+msgid "Warning! Control codes in mail address replaced by ?"
+msgstr ""
+
+#: LYMessages.c:190
+msgid "Mail disallowed! Cannot submit."
+msgstr ""
+
+#: LYMessages.c:191
+msgid "Mailto form submission failed!"
+msgstr ""
+
+#: LYMessages.c:192
+msgid "Mailto form submission Cancelled!!!"
+msgstr ""
+
+#: LYMessages.c:193
+msgid "Sending form content..."
+msgstr ""
+
+#: LYMessages.c:194
+msgid "No email address is present in mailto URL!"
+msgstr ""
+
+#. #define MAILTO_URL_TEMPOPEN_FAILED
+#: LYMessages.c:196
+msgid "Unable to open temporary file for mailto URL!"
+msgstr ""
+
+#. #define INC_ORIG_MSG_PROMPT
+#: LYMessages.c:198
+msgid "Do you wish to include the original message?"
+msgstr ""
+
+#. #define INC_PREPARSED_MSG_PROMPT
+#: LYMessages.c:200
+msgid "Do you wish to include the preparsed source?"
+msgstr ""
+
+#. #define SPAWNING_EDITOR_FOR_MAIL
+#: LYMessages.c:202
+msgid "Spawning your selected editor to edit mail message"
+msgstr ""
+
+#. #define ERROR_SPAWNING_EDITOR
+#: LYMessages.c:204
+msgid "Error spawning editor, check your editor definition in the options menu"
+msgstr ""
+
+#: LYMessages.c:205
+msgid "Send this comment?"
+msgstr "Po¹ljemo ta komentar?"
+
+#: LYMessages.c:206
+msgid "Send this message?"
+msgstr "Po¹ljemo to sporoèilo?"
+
+#: LYMessages.c:207
+msgid "Sending your message..."
+msgstr "Po¹iljamo va¹e sporoèilo..."
+
+#: LYMessages.c:208
+msgid "Sending your comment:"
+msgstr "Po¹iljamo va¹ komentar:"
+
+#. textarea
+#: LYMessages.c:211
+msgid "Not in a TEXTAREA; cannot use external editor."
+msgstr ""
+
+#: LYMessages.c:212
+msgid "Not in a TEXTAREA; cannot use command."
+msgstr ""
+
+#: LYMessages.c:214
+msgid "file: ACTIONs are disallowed!"
+msgstr ""
+
+#. #define FILE_SERVED_LINKS_DISALLOWED
+#: LYMessages.c:216
+msgid "file: URLs via served links are disallowed!"
+msgstr ""
+
+#: LYMessages.c:217
+msgid "Access to local files denied."
+msgstr ""
+
+#: LYMessages.c:218
+msgid "file: URLs via bookmarks are disallowed!"
+msgstr ""
+
+#. #define SPECIAL_VIA_EXTERNAL_DISALLOWED
+#: LYMessages.c:220
+msgid "This special URL is not allowed in external documents!"
+msgstr ""
+
+#: LYMessages.c:221
+msgid "Press <return> to return to Lynx."
+msgstr "Pritisnite <return> za vrnitev v Lynx."
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:224
+msgid "Spawning DCL subprocess. Use 'logout' to return to Lynx.\n"
+msgstr ""
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:228
+msgid "Type EXIT to return to Lynx.\n"
+msgstr "Napi¹ite EXIT za vrnitev v Lynx.\n"
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:231
+msgid "Spawning your default shell. Use 'exit' to return to Lynx.\n"
+msgstr ""
+
+#: LYMessages.c:234
+msgid "Spawning is currently disabled."
+msgstr ""
+
+#: LYMessages.c:235
+msgid "The 'd'ownload command is currently disabled."
+msgstr ""
+
+#: LYMessages.c:236
+msgid "You cannot download an input field."
+msgstr ""
+
+#: LYMessages.c:237
+msgid "Form has a mailto action! Cannot download."
+msgstr ""
+
+#: LYMessages.c:238
+msgid "You cannot download a mailto: link."
+msgstr ""
+
+#: LYMessages.c:239
+msgid "You cannot download cookies."
+msgstr "Ne morete prenesti pi¹kotov."
+
+#: LYMessages.c:240
+msgid "You cannot download a printing option."
+msgstr "Ne morete prenesti tiskalni¹ke izbire."
+
+#: LYMessages.c:241
+msgid "You cannot download an upload option."
+msgstr "Ne morete prenesti izbire za po¹iljanje."
+
+#: LYMessages.c:242
+msgid "You cannot download an permit option."
+msgstr "Ne morete prenesti izbire za dovoljenje."
+
+#: LYMessages.c:243
+msgid "This special URL cannot be downloaded!"
+msgstr ""
+
+#: LYMessages.c:244
+msgid "Nothing to download."
+msgstr "Nièesar ni za prenesti."
+
+#: LYMessages.c:245
+msgid "Trace ON!"
+msgstr "Sledenje VKLJUÈENO!"
+
+#: LYMessages.c:246
+msgid "Trace OFF!"
+msgstr "Sledenje IZKLJUÈENO!"
+
+#. #define CLICKABLE_IMAGES_ON
+#: LYMessages.c:248
+msgid "Links will be included for all images! Reloading..."
+msgstr ""
+
+#. #define CLICKABLE_IMAGES_OFF
+#: LYMessages.c:250
+msgid "Standard image handling restored! Reloading..."
+msgstr ""
+
+#. #define PSEUDO_INLINE_ALTS_ON
+#: LYMessages.c:252
+msgid "Pseudo_ALTs will be inserted for inlines without ALT strings! Reloading..."
+msgstr ""
+
+#. #define PSEUDO_INLINE_ALTS_OFF
+#: LYMessages.c:254
+msgid "Inlines without an ALT string specified will be ignored! Reloading..."
+msgstr ""
+
+#: LYMessages.c:255
+msgid "Raw 8-bit or CJK mode toggled OFF! Reloading..."
+msgstr ""
+
+#: LYMessages.c:256
+msgid "Raw 8-bit or CJK mode toggled ON! Reloading..."
+msgstr ""
+
+#. #define HEAD_D_L_OR_CANCEL
+#: LYMessages.c:258
+msgid "Send HEAD request for D)ocument or L)ink, or C)ancel? (d,l,c): "
+msgstr ""
+
+#. #define HEAD_D_OR_CANCEL
+#: LYMessages.c:260
+msgid "Send HEAD request for D)ocument, or C)ancel? (d,c): "
+msgstr ""
+
+#: LYMessages.c:261
+msgid "Sorry, the document is not an http URL."
+msgstr "Oprostite, sestavek ni URL vrste http."
+
+#: LYMessages.c:262
+msgid "Sorry, the link is not an http URL."
+msgstr "Oprostite, povezava ni URL vrste http."
+
+#: LYMessages.c:263
+msgid "Sorry, the ACTION for this form is disabled."
+msgstr ""
+
+#. #define FORM_ACTION_NOT_HTTP_URL
+#: LYMessages.c:265
+msgid "Sorry, the ACTION for this form is not an http URL."
+msgstr ""
+
+#: LYMessages.c:266
+msgid "Not an http URL or form ACTION!"
+msgstr ""
+
+#: LYMessages.c:267
+msgid "This special URL cannot be a form ACTION!"
+msgstr ""
+
+#: LYMessages.c:268
+msgid "URL is not in starting realm!"
+msgstr ""
+
+#: LYMessages.c:269
+msgid "News posting is disabled!"
+msgstr ""
+
+#: LYMessages.c:270
+msgid "File management support is disabled!"
+msgstr ""
+
+#: LYMessages.c:271
+msgid "No jump file is currently available."
+msgstr ""
+
+#: LYMessages.c:272
+msgid "Jump to (use '?' for list): "
+msgstr ""
+
+#: LYMessages.c:273
+msgid "Jumping to a shortcut URL is disallowed!"
+msgstr ""
+
+#: LYMessages.c:274
+msgid "Random URL is disallowed! Use a shortcut."
+msgstr ""
+
+#: LYMessages.c:275
+msgid "No random URLs have been used thus far."
+msgstr ""
+
+#: LYMessages.c:276
+msgid "Bookmark features are currently disabled."
+msgstr ""
+
+#: LYMessages.c:277
+msgid "Execution via bookmarks is disabled."
+msgstr ""
+
+#. #define BOOKMARK_FILE_NOT_DEFINED
+#: LYMessages.c:279
+#, c-format
+msgid "Bookmark file is not defined. Use %s to see options."
+msgstr ""
+
+#. #define NO_TEMP_FOR_HOTLIST
+#: LYMessages.c:281
+msgid "Unable to open tempfile for X Mosaic hotlist conversion."
+msgstr ""
+
+#: LYMessages.c:282
+msgid "ERROR - unable to open bookmark file."
+msgstr ""
+
+#. #define BOOKMARK_OPEN_FAILED_FOR_DEL
+#: LYMessages.c:284
+msgid "Unable to open bookmark file for deletion of link."
+msgstr ""
+
+#. #define BOOKSCRA_OPEN_FAILED_FOR_DEL
+#: LYMessages.c:286
+msgid "Unable to open scratch file for deletion of link."
+msgstr ""
+
+#: LYMessages.c:288
+msgid "Error renaming scratch file."
+msgstr ""
+
+#: LYMessages.c:290
+msgid "Error renaming temporary file."
+msgstr ""
+
+#. #define BOOKTEMP_COPY_FAIL
+#: LYMessages.c:292
+msgid "Unable to copy temporary file for deletion of link."
+msgstr ""
+
+#. #define BOOKTEMP_REOPEN_FAIL_FOR_DEL
+#: LYMessages.c:294
+msgid "Unable to reopen temporary file for deletion of link."
+msgstr ""
+
+#. #define BOOKMARK_LINK_NOT_ONE_LINE
+#: LYMessages.c:297
+msgid "Link is not by itself all on one line in bookmark file."
+msgstr ""
+
+#: LYMessages.c:298
+msgid "Bookmark deletion failed."
+msgstr ""
+
+#. #define BOOKMARKS_NOT_TRAVERSED
+#: LYMessages.c:300
+msgid "Bookmark files cannot be traversed (only http URLs)."
+msgstr ""
+
+#. #define BOOKMARKS_NOT_OPEN
+#: LYMessages.c:302
+msgid "Unable to open bookmark file, use 'a' to save a link first"
+msgstr ""
+
+#: LYMessages.c:303
+msgid "There are no links in this bookmark file!"
+msgstr ""
+
+#. #define CACHE_D_OR_CANCEL
+#: LYMessages.c:305
+msgid "D)elete cached document or C)ancel? (d,c): "
+msgstr ""
+
+#. #define BOOK_D_L_OR_CANCEL
+#: LYMessages.c:307
+msgid "Save D)ocument or L)ink to bookmark file or C)ancel? (d,l,c): "
+msgstr ""
+
+#: LYMessages.c:308
+msgid "Save D)ocument to bookmark file or C)ancel? (d,c): "
+msgstr ""
+
+#: LYMessages.c:309
+msgid "Save L)ink to bookmark file or C)ancel? (l,c): "
+msgstr ""
+
+#. #define NOBOOK_POST_FORM
+#: LYMessages.c:311
+msgid "Documents from forms with POST content cannot be saved as bookmarks."
+msgstr ""
+
+#: LYMessages.c:312
+msgid "Cannot save form fields/links"
+msgstr ""
+
+#. #define NOBOOK_HSML
+#: LYMessages.c:314
+msgid "History, showinfo, menu and list files cannot be saved as bookmarks."
+msgstr ""
+
+#. #define CONFIRM_BOOKMARK_DELETE
+#: LYMessages.c:316
+msgid "Do you really want to delete this link from your bookmark file?"
+msgstr ""
+
+#: LYMessages.c:317
+msgid "Malformed address."
+msgstr "Zmalièen naslov."
+
+#. #define HISTORICAL_ON_MINIMAL_OFF
+#: LYMessages.c:319
+msgid "Historical comment parsing ON (Minimal is overridden)!"
+msgstr ""
+
+#. #define HISTORICAL_OFF_MINIMAL_ON
+#: LYMessages.c:321
+msgid "Historical comment parsing OFF (Minimal is in effect)!"
+msgstr ""
+
+#. #define HISTORICAL_ON_VALID_OFF
+#: LYMessages.c:323
+msgid "Historical comment parsing ON (Valid is overridden)!"
+msgstr ""
+
+#. #define HISTORICAL_OFF_VALID_ON
+#: LYMessages.c:325
+msgid "Historical comment parsing OFF (Valid is in effect)!"
+msgstr ""
+
+#. #define MINIMAL_ON_IN_EFFECT
+#: LYMessages.c:327
+msgid "Minimal comment parsing ON (and in effect)!"
+msgstr ""
+
+#. #define MINIMAL_OFF_VALID_ON
+#: LYMessages.c:329
+msgid "Minimal comment parsing OFF (Valid is in effect)!"
+msgstr ""
+
+#. #define MINIMAL_ON_BUT_HISTORICAL
+#: LYMessages.c:331
+msgid "Minimal comment parsing ON (but Historical is in effect)!"
+msgstr ""
+
+#. #define MINIMAL_OFF_HISTORICAL_ON
+#: LYMessages.c:333
+msgid "Minimal comment parsing OFF (Historical is in effect)!"
+msgstr ""
+
+#: LYMessages.c:334
+msgid "Soft double-quote parsing ON!"
+msgstr ""
+
+#: LYMessages.c:335
+msgid "Soft double-quote parsing OFF!"
+msgstr ""
+
+#: LYMessages.c:336
+msgid "Now using TagSoup parsing of HTML."
+msgstr ""
+
+#: LYMessages.c:337
+msgid "Now using SortaSGML parsing of HTML!"
+msgstr ""
+
+#: LYMessages.c:338
+msgid "You are already at the end of this document."
+msgstr ""
+
+#: LYMessages.c:339
+msgid "You are already at the beginning of this document."
+msgstr ""
+
+#: LYMessages.c:340
+#, c-format
+msgid "You are already at page %d of this document."
+msgstr ""
+
+#: LYMessages.c:341
+#, c-format
+msgid "Link number %d already is current."
+msgstr ""
+
+#: LYMessages.c:342
+msgid "You are already at the first document"
+msgstr ""
+
+#: LYMessages.c:343
+msgid "There are no links above this line of the document."
+msgstr ""
+
+#: LYMessages.c:344
+msgid "There are no links below this line of the document."
+msgstr ""
+
+#. #define MAXLEN_REACHED_DEL_OR_MOV
+#: LYMessages.c:346
+msgid "Maximum length reached! Delete text or move off field."
+msgstr ""
+
+#. #define NOT_ON_SUBMIT_OR_LINK
+#: LYMessages.c:348
+msgid "You are not on a form submission button or normal link."
+msgstr ""
+
+#. #define NEED_CHECKED_RADIO_BUTTON
+#: LYMessages.c:350
+msgid "One radio button must be checked at all times!"
+msgstr ""
+
+#: LYMessages.c:351
+msgid "No submit button for this form, submit single text field?"
+msgstr ""
+
+#: LYMessages.c:352
+msgid "Do you want to go back to the previous document?"
+msgstr ""
+
+#: LYMessages.c:353
+msgid "Use arrows or tab to move off of field."
+msgstr "Uporabite pu¹èice ali tab za premik drugam."
+
+#. #define ENTER_TEXT_ARROWS_OR_TAB
+#: LYMessages.c:355
+msgid "Enter text. Use arrows or tab to move off of field."
+msgstr "Vnesite besedilo. Uporabite pu¹èice ali tab za premik drugam."
+
+#: LYMessages.c:356
+msgid "** Bad HTML!! No form action defined. **"
+msgstr "** Slab HTML!! V obrazcu ni definirane akcije. **"
+
+#: LYMessages.c:357
+msgid "Bad HTML!! Unable to create popup window!"
+msgstr ""
+
+#: LYMessages.c:358
+msgid "Unable to create popup window!"
+msgstr ""
+
+#: LYMessages.c:359
+msgid "Goto a random URL is disallowed!"
+msgstr ""
+
+#: LYMessages.c:360
+msgid "Goto a non-http URL is disallowed!"
+msgstr "Premik na URL, ki ni http, ni dovoljen!"
+
+#: LYMessages.c:361
+#, fuzzy, c-format
+#| msgid "You are not allowed to goto \"cso:\" URLs"
+msgid "You are not allowed to goto \"%s\" URLs"
+msgstr "Ni vam dovoljeno odpreti URL-jev \"cso:\""
+
+#: LYMessages.c:362
+msgid "URL to open: "
+msgstr "URL za odpiranje: "
+
+#: LYMessages.c:363
+msgid "Edit the current Goto URL: "
+msgstr ""
+
+#: LYMessages.c:364
+msgid "Edit the previous Goto URL: "
+msgstr ""
+
+#: LYMessages.c:365
+msgid "Edit a previous Goto URL: "
+msgstr ""
+
+#: LYMessages.c:366
+msgid "Current document has POST data."
+msgstr ""
+
+#: LYMessages.c:367
+msgid "Edit this document's URL: "
+msgstr "Uredimo URL tega sestavka: "
+
+#: LYMessages.c:368
+msgid "Edit the current link's URL: "
+msgstr "Uredimo URL trenutne povezave: "
+
+#: LYMessages.c:369
+#, fuzzy
+#| msgid "Edit this document's URL: "
+msgid "Edit the form's submit-URL: "
+msgstr "Uredimo URL tega sestavka: "
+
+#: LYMessages.c:370
+msgid "You cannot edit File Management URLs"
+msgstr ""
+
+#: LYMessages.c:371
+msgid "Enter a database query: "
+msgstr ""
+
+#: LYMessages.c:372
+msgid "Enter a whereis query: "
+msgstr ""
+
+#: LYMessages.c:373
+msgid "Edit the current query: "
+msgstr ""
+
+#: LYMessages.c:374
+msgid "Edit the previous query: "
+msgstr ""
+
+#: LYMessages.c:375
+msgid "Edit a previous query: "
+msgstr ""
+
+#. #define USE_C_R_TO_RESUB_CUR_QUERY
+#: LYMessages.c:377
+msgid "Use Control-R to resubmit the current query."
+msgstr ""
+
+#: LYMessages.c:378
+msgid "Edit the current shortcut: "
+msgstr ""
+
+#: LYMessages.c:379
+msgid "Edit the previous shortcut: "
+msgstr ""
+
+#: LYMessages.c:380
+msgid "Edit a previous shortcut: "
+msgstr ""
+
+#: LYMessages.c:381
+#, c-format
+msgid "Key '%c' is not mapped to a jump file!"
+msgstr ""
+
+#: LYMessages.c:382
+msgid "Cannot locate jump file!"
+msgstr ""
+
+#: LYMessages.c:383
+msgid "Cannot open jump file!"
+msgstr ""
+
+#: LYMessages.c:384
+msgid "Error reading jump file!"
+msgstr ""
+
+#: LYMessages.c:385
+msgid "Out of memory reading jump file!"
+msgstr ""
+
+#: LYMessages.c:386
+msgid "Out of memory reading jump table!"
+msgstr ""
+
+#: LYMessages.c:387
+msgid "No index is currently available."
+msgstr "Trenutno ni dostopno nobeno kazalo."
+
+#. #define CONFIRM_MAIN_SCREEN
+#: LYMessages.c:389
+msgid "Do you really want to go to the Main screen?"
+msgstr "Ali res ¾elite skoèiti na Glavni zaslon?"
+
+#: LYMessages.c:390
+msgid "You are already at main screen!"
+msgstr "®e zdaj smo v glavnem zaslonu!"
+
+#. #define NOT_ISINDEX
+#: LYMessages.c:392
+msgid "Not a searchable indexed document -- press '/' to search for a text string"
+msgstr ""
+
+#. #define NO_OWNER
+#: LYMessages.c:394
+msgid "No owner is defined for this file so you cannot send a comment"
+msgstr "Za to datoteko ni definiranega lastnika, torej ne morete poslati komentarja"
+
+#: LYMessages.c:395
+#, c-format
+msgid "No owner is defined. Use %s?"
+msgstr "Lastnik ni definiran. Uporabimo %s?"
+
+#: LYMessages.c:396
+msgid "Do you wish to send a comment?"
+msgstr "Ali ¾elite poslati komentar?"
+
+#: LYMessages.c:397
+msgid "Mail is disallowed so you cannot send a comment"
+msgstr "Po¹ta je onemogoèena, zato ne moremo poslati komentarja"
+
+#: LYMessages.c:398
+msgid "The 'e'dit command is currently disabled."
+msgstr "Ukaz ur,e`di je trenutno onemogoèen."
+
+#: LYMessages.c:399
+#, fuzzy
+#| msgid "External support is currently disabled."
+msgid "External editing is currently disabled."
+msgstr "Zunanja podpora je trenutno onemogoèena."
+
+#: LYMessages.c:400
+msgid "System error - failure to get status."
+msgstr "Sistemska napaka - ne moremo dobiti statusa."
+
+#: LYMessages.c:401
+msgid "No editor is defined!"
+msgstr "Ni definiranega urejevalnika!"
+
+#: LYMessages.c:402
+msgid "The 'p'rint command is currently disabled."
+msgstr "Ukaz natisni (p) je trenutno onemogoèen."
+
+#: LYMessages.c:403
+msgid "Document has no Toolbar links or Banner."
+msgstr ""
+
+#: LYMessages.c:404
+msgid "Unable to open traversal file."
+msgstr ""
+
+#: LYMessages.c:405
+msgid "Unable to open traversal found file."
+msgstr ""
+
+#: LYMessages.c:406
+msgid "Unable to open reject file."
+msgstr "Ne moremo odpreti datoteke z zavrnjenimi URL-ji."
+
+#: LYMessages.c:407
+msgid "Unable to open traversal errors output file"
+msgstr ""
+
+#: LYMessages.c:408
+msgid "TRAVERSAL WAS INTERRUPTED"
+msgstr ""
+
+#: LYMessages.c:409
+msgid "Follow link (or goto link or page) number: "
+msgstr ""
+
+#: LYMessages.c:410
+msgid "Select option (or page) number: "
+msgstr "Izberite ¹tevilko mo¾nosti (ali strani): "
+
+#: LYMessages.c:411
+#, c-format
+msgid "Option number %d already is current."
+msgstr "Mo¾nost ¹tevilka %d je ¾e zdaj trenutna."
+
+#. #define ALREADY_AT_OPTION_END
+#: LYMessages.c:413
+msgid "You are already at the end of this option list."
+msgstr "®e zdaj smo na vrhu tega seznama izbir."
+
+#. #define ALREADY_AT_OPTION_BEGIN
+#: LYMessages.c:415
+msgid "You are already at the beginning of this option list."
+msgstr "®e zdaj smo na zaèetku tega seznama mo¾nosti."
+
+#. #define ALREADY_AT_OPTION_PAGE
+#: LYMessages.c:417
+#, c-format
+msgid "You are already at page %d of this option list."
+msgstr "®e zdaj smo na strani %d tega seznama mo¾nosti."
+
+#: LYMessages.c:418
+msgid "You have entered an invalid option number."
+msgstr "Vnesli ste neveljavno ¹tevilko mo¾nosti."
+
+#: LYMessages.c:419
+msgid "** Bad HTML!! Use -trace to diagnose. **"
+msgstr "** Slab HTML!! Uporabite -trace za diagnozo. **"
+
+#: LYMessages.c:420
+msgid "Give name of file to save in"
+msgstr "Podajte ime datoteke za shranitev"
+
+#: LYMessages.c:421
+msgid "Can't save data to file -- please run WWW locally"
+msgstr "Ne moremo posneti podatkov v datoteko -- prosim, po¾enite WWW lokalno"
+
+#: LYMessages.c:422
+msgid "Can't open temporary file!"
+msgstr "Ne moremo odpreti zaèasne datoteke!"
+
+#: LYMessages.c:423
+msgid "Can't open output file! Cancelling!"
+msgstr "Ne moremo odpreti izhodne datoteke! Prekinitev!"
+
+#: LYMessages.c:424
+msgid "Execution is disabled."
+msgstr "Izvajanje je onemogoèeno."
+
+#. #define EXECUTION_DISABLED_FOR_FILE
+#: LYMessages.c:426
+#, c-format
+msgid "Execution is not enabled for this file. See the Options menu (use %s)."
+msgstr "Izvajanje za to datoteko ni omogoèeno. Poglejte menu Izbire (uporabite %s)."
+
+#. #define EXECUTION_NOT_COMPILED
+#: LYMessages.c:428
+msgid "Execution capabilities are not compiled into this version."
+msgstr "Zmo¾nosti izvajanja niso prevedene v to razlièico."
+
+#: LYMessages.c:429
+msgid "This file cannot be displayed on this terminal."
+msgstr "Ta datoteka ne more biti prikazana na tem terminalu."
+
+#. #define CANNOT_DISPLAY_FILE_D_OR_C
+#: LYMessages.c:431
+msgid "This file cannot be displayed on this terminal: D)ownload, or C)ancel"
+msgstr "Ta datoteka ne more biti prikazana na tem terminalu: D) prenos ali C) prekinitev"
+
+#: LYMessages.c:432
+#, c-format
+msgid "%s D)ownload, or C)ancel"
+msgstr "%s D) prenos, ali C) prekinitev"
+
+#: LYMessages.c:433
+msgid "Cancelling file."
+msgstr "Prekinjamo z datoteko."
+
+#: LYMessages.c:434
+msgid "Retrieving file. - PLEASE WAIT -"
+msgstr "Jemljemo datoteko. - PROSIM, POÈAKAJTE -"
+
+#: LYMessages.c:435
+msgid "Enter a filename: "
+msgstr "Vnesite ime datoteke: "
+
+#: LYMessages.c:436
+msgid "Edit the previous filename: "
+msgstr "Uredite prej¹nje ime datoteke: "
+
+#: LYMessages.c:437
+msgid "Edit a previous filename: "
+msgstr "Uredite kak¹no prej¹nje ime datoteke: "
+
+#: LYMessages.c:438
+msgid "Enter a new filename: "
+msgstr "Vnesite novo ime datoteke: "
+
+#: LYMessages.c:439
+msgid "File name may not begin with a dot."
+msgstr "Ime datoteke se ne sme zaèeti s piko."
+
+#: LYMessages.c:441
+msgid "File exists. Create higher version?"
+msgstr "Datoteka obstaja. Ustvarimo vi¹jo razlièico?"
+
+#: LYMessages.c:443
+msgid "File exists. Overwrite?"
+msgstr "Datoteka obstaja. Prepi¹emo?"
+
+#: LYMessages.c:445
+msgid "Cannot write to file."
+msgstr "Ne moremo pisati v datoteko."
+
+#: LYMessages.c:446
+msgid "ERROR! - download command is misconfigured."
+msgstr "NAPAKA! - ukaz za jemanje je napaèno nastavljen."
+
+#: LYMessages.c:447
+msgid "Unable to download file."
+msgstr "Ne moremo prenesti datoteke."
+
+#: LYMessages.c:448
+msgid "Reading directory..."
+msgstr "Beremo imenik..."
+
+#: LYMessages.c:449
+msgid "Building directory listing..."
+msgstr "Gradimo seznam vsebine imenika ..."
+
+#: LYMessages.c:450
+msgid "Saving..."
+msgstr "Shranjujemo ..."
+
+#: LYMessages.c:451
+#, c-format
+msgid "Could not edit file '%s'."
+msgstr "Ne moremo urediti datoteke ,%s`."
+
+#: LYMessages.c:452
+msgid "Unable to access document!"
+msgstr "Ne moremo dostopati do sestavka!"
+
+#: LYMessages.c:453
+msgid "Could not access file."
+msgstr "Ne moremo dostopati do datoteke."
+
+#: LYMessages.c:454
+msgid "Could not access directory."
+msgstr "Ne moremo dostopati do imenika."
+
+#: LYMessages.c:455
+msgid "Could not load data."
+msgstr "Ne moremo nalo¾iti podatkov."
+
+#. #define CANNOT_EDIT_REMOTE_FILES
+#: LYMessages.c:457
+msgid "Lynx cannot currently (e)dit remote WWW files."
+msgstr "Lynx trenutno ne zmore ur(e)diti oddaljenih spletnih datotek."
+
+#. #define CANNOT_EDIT_FIELD
+#: LYMessages.c:459
+msgid "This field cannot be (e)dited with an external editor."
+msgstr "To polje ne more biti ur(e)jeno z zunanjim urejevalnikom."
+
+#: LYMessages.c:460
+msgid "Bad rule"
+msgstr "Slabo pravilo"
+
+#: LYMessages.c:461
+msgid "Insufficient operands:"
+msgstr "Premalo operandov:"
+
+#: LYMessages.c:462
+msgid "You are not authorized to edit this file."
+msgstr "Niste poobla¹èeni za urejanje te datoteke."
+
+#: LYMessages.c:463
+msgid "Title: "
+msgstr "Naslov: "
+
+#: LYMessages.c:464
+msgid "Subject: "
+msgstr "Predmet: "
+
+#: LYMessages.c:465
+msgid "Username: "
+msgstr "Uporabni¹ko ime: "
+
+#: LYMessages.c:466
+msgid "Password: "
+msgstr "Geslo: "
+
+#: LYMessages.c:467
+msgid "lynx: Username and Password required!!!"
+msgstr "lynx: Uporabni¹ko ime in geslo sta zahtevani!!!"
+
+#: LYMessages.c:468
+msgid "lynx: Password required!!!"
+msgstr "lynx: Geslo je zahtevano!!!"
+
+#: LYMessages.c:469
+msgid "Clear all authorization info for this session?"
+msgstr "Pobri¹emo vse avtorizacijske podatke za to sejo?"
+
+#: LYMessages.c:470
+msgid "Authorization info cleared."
+msgstr "Avtorizacijski podatki pobrisani."
+
+#: LYMessages.c:471
+msgid "Authorization failed. Retry?"
+msgstr "Avtorizaciji je spodletelo. Poskusimo ¹e enkrat?"
+
+#: LYMessages.c:472
+#, fuzzy
+#| msgid "cgi support has been disabled by system administrator."
+msgid "cgi support has been disabled."
+msgstr "Sistemski upravitelj je onemogoèil podporo CGI."
+
+#. #define CGI_NOT_COMPILED
+#: LYMessages.c:474
+msgid "Lynxcgi capabilities are not compiled into this version."
+msgstr "V tej razlièici ni prevedene mo¾nosti Lynxcgi."
+
+#: LYMessages.c:475
+#, c-format
+msgid "Sorry, no known way of converting %s to %s."
+msgstr "®al, ni znanega naèina za pretvarjanje %s v %s."
+
+#: LYMessages.c:476
+msgid "Unable to set up connection."
+msgstr "Ne moremo nastaviti povezave."
+
+#: LYMessages.c:477
+msgid "Unable to make connection"
+msgstr "Ne moremo vzpostaviti povezave."
+
+#. #define MALFORMED_EXEC_REQUEST
+#: LYMessages.c:479
+msgid "Executable link rejected due to malformed request."
+msgstr "Izvedljiva povezava zavrnjena zaradi zmalièenega zahtevka."
+
+#. #define BADCHAR_IN_EXEC_LINK
+#: LYMessages.c:481
+#, c-format
+msgid "Executable link rejected due to `%c' character."
+msgstr "Izvedljiva povezava zavrnjena zaradi znaka ,%c`."
+
+#. #define RELPATH_IN_EXEC_LINK
+#: LYMessages.c:483
+msgid "Executable link rejected due to relative path string ('../')."
+msgstr "Izvedljiva povezava zavrnjena zaradi niza za relativno pot (,../`)."
+
+#. #define BADLOCPATH_IN_EXEC_LINK
+#: LYMessages.c:485
+msgid "Executable link rejected due to location or path."
+msgstr "Izvedljiva povezava zavrnjena zaradi lokacije ali poti."
+
+#: LYMessages.c:486
+msgid "Mail access is disabled!"
+msgstr "Po¹tni dostop je onemogoèen!"
+
+#. #define ACCESS_ONLY_LOCALHOST
+#: LYMessages.c:488
+msgid "Only files and servers on the local host can be accessed."
+msgstr "Dostopne so le datoteke in stre¾niki na lokalnem raèunalniku."
+
+#: LYMessages.c:489
+msgid "Telnet access is disabled!"
+msgstr "Dostop prek telneta je onemogoèen!"
+
+#. #define TELNET_PORT_SPECS_DISABLED
+#: LYMessages.c:491
+msgid "Telnet port specifications are disabled."
+msgstr ""
+
+#: LYMessages.c:492
+msgid "USENET news access is disabled!"
+msgstr "Dostop novièarskih skupin USENET je onemogoèen!"
+
+#: LYMessages.c:493
+msgid "Rlogin access is disabled!"
+msgstr "Dostop s programom rlogin je onemogoèen!"
+
+#: LYMessages.c:494
+msgid "Ftp access is disabled!"
+msgstr "Dostop prek FTP je onemogoèen!"
+
+#: LYMessages.c:495
+msgid "There are no references from this document."
+msgstr "Iz tega dokumenta ni sklicevanj."
+
+#: LYMessages.c:496
+msgid "There are only hidden links from this document."
+msgstr "Iz tega dokumenta vodijo le skrite povezave."
+
+#: LYMessages.c:498
+msgid "Unable to open command file."
+msgstr "Ne moremo odpreti ukazne datoteke."
+
+#: LYMessages.c:500
+msgid "News Post Cancelled!!!"
+msgstr "Po¹iljanje novièarskega èlanka preklicano!!!"
+
+#. #define SPAWNING_EDITOR_FOR_NEWS
+#: LYMessages.c:502
+msgid "Spawning your selected editor to edit news message"
+msgstr ""
+
+#: LYMessages.c:503
+msgid "Post this message?"
+msgstr "Po¹ljemo to sporoèilo?"
+
+#: LYMessages.c:504
+#, c-format
+msgid "Append '%s'?"
+msgstr "Pripnemo na konec ,%s`?"
+
+#: LYMessages.c:505
+msgid "Posting to newsgroup(s)..."
+msgstr "Po¹iljamo v novièarske skupine ..."
+
+#: LYMessages.c:507
+msgid "*** You have unread mail. ***"
+msgstr "*** Imate neprebrano po¹to. ***"
+
+#: LYMessages.c:509
+msgid "*** You have mail. ***"
+msgstr "*** Imate po¹to. ***"
+
+#: LYMessages.c:511
+msgid "*** You have new mail. ***"
+msgstr "*** Imate novo po¹to. ***"
+
+#: LYMessages.c:512
+msgid "File insert cancelled!!!"
+msgstr ""
+
+#: LYMessages.c:513
+#, fuzzy
+#| msgid "Can't open temporary file!"
+msgid "Not enough memory for file!"
+msgstr "Ne moremo odpreti zaèasne datoteke!"
+
+#: LYMessages.c:514
+#, fuzzy
+#| msgid "Can't open output file! Cancelling!"
+msgid "Can't open file for reading."
+msgstr "Ne moremo odpreti izhodne datoteke! Prekinitev!"
+
+#: LYMessages.c:515
+msgid "File does not exist."
+msgstr "Datoteka ne obstaja."
+
+#: LYMessages.c:516
+msgid "File does not exist - reenter or cancel:"
+msgstr "Datoteka ne obstaja - ponovni vnos ali preklic:"
+
+#: LYMessages.c:517
+msgid "File is not readable."
+msgstr "Datoteka ni berlljiva."
+
+#: LYMessages.c:518
+msgid "File is not readable - reenter or cancel:"
+msgstr "Datoteka ni berljiva - ponovni vnos ali preklic:"
+
+#: LYMessages.c:519
+msgid "Nothing to insert - file is 0-length."
+msgstr "Nièesar za vnesti - datoteka je dolga 0 zlogov."
+
+#: LYMessages.c:520
+msgid "Save request cancelled!!!"
+msgstr "Preklicana zahteva za shranjevanje!!!"
+
+#: LYMessages.c:521
+msgid "Mail request cancelled!!!"
+msgstr "Preklicana po¹tna zahteva!!!"
+
+#. #define CONFIRM_MAIL_SOURCE_PREPARSED
+#: LYMessages.c:523
+msgid "Viewing preparsed source. Are you sure you want to mail it?"
+msgstr ""
+
+#: LYMessages.c:524
+msgid "Please wait..."
+msgstr "Prosim, poèakajte ..."
+
+#: LYMessages.c:525
+msgid "Mailing file. Please wait..."
+msgstr "Po¹iljamo datoteko. Prosimo, poèakajte ..."
+
+#: LYMessages.c:526
+msgid "ERROR - Unable to mail file"
+msgstr "NAPAKA - Ne moremo poslati datoteke"
+
+#. #define CONFIRM_LONG_SCREEN_PRINT
+#: LYMessages.c:528
+#, c-format
+msgid "File is %d screens long. Are you sure you want to print?"
+msgstr "Datoteka je dolga %d zaslonov. Ste preprièani, da jo ¾elite natisniti?"
+
+#: LYMessages.c:529
+msgid "Print request cancelled!!!"
+msgstr "Tiskalni¹ka zahteva preklicana!!!"
+
+#: LYMessages.c:530
+msgid "Press <return> to begin: "
+msgstr "Pritisnite <return > za zaèetek: "
+
+#: LYMessages.c:531
+msgid "Press <return> to finish: "
+msgstr "Pritisnite <return> za konec: "
+
+#. #define CONFIRM_LONG_PAGE_PRINT
+#: LYMessages.c:533
+#, c-format
+msgid "File is %d pages long. Are you sure you want to print?"
+msgstr "Datoteka je dolga %d strani. Ste preprièani, da jo ¾elite natisniti?"
+
+#. #define CHECK_PRINTER
+#: LYMessages.c:535
+msgid "Be sure your printer is on-line. Press <return> to start printing:"
+msgstr "Preprièajte se, da je tiskalnik na zvezi. Pritisnite <return> za zaèetek tiskanja:"
+
+#: LYMessages.c:536
+msgid "ERROR - Unable to allocate file space!!!"
+msgstr "NAPAKA - Ne moremo doloèiti prostora za datoteko!!!"
+
+#: LYMessages.c:537
+msgid "Unable to open tempfile"
+msgstr "Ne moremo odpreti zaèasne datoteke"
+
+#: LYMessages.c:538
+msgid "Unable to open print options file"
+msgstr "Ne moremo odpreti datoteke s tiskalni¹kimi izbirami"
+
+#: LYMessages.c:539
+msgid "Printing file. Please wait..."
+msgstr "Tiskamo datoteko. Prosim, poèakajte ..."
+
+#: LYMessages.c:540
+msgid "Please enter a valid internet mail address: "
+msgstr "Prosim, vnesite veljavni internetni po¹tni naslov: "
+
+#: LYMessages.c:541
+msgid "ERROR! - printer is misconfigured!"
+msgstr "NAPAKA! - tiskalnik je nepravilno nastavljen!"
+
+#: LYMessages.c:542
+msgid "Image map from POST response not available!"
+msgstr ""
+
+#: LYMessages.c:543
+msgid "Misdirected client-side image MAP request!"
+msgstr ""
+
+#: LYMessages.c:544
+msgid "Client-side image MAP is not accessible!"
+msgstr ""
+
+#: LYMessages.c:545
+msgid "No client-side image MAPs are available!"
+msgstr ""
+
+#: LYMessages.c:546
+msgid "Client-side image MAP is not available!"
+msgstr ""
+
+#. #define OPTION_SCREEN_NEEDS_24
+#: LYMessages.c:549
+msgid "Screen height must be at least 24 lines for the Options menu!"
+msgstr "Za menu Mo¾nosti mora biti zaslon visok vsaj 24 vrstic!"
+
+#. #define OPTION_SCREEN_NEEDS_23
+#: LYMessages.c:551
+msgid "Screen height must be at least 23 lines for the Options menu!"
+msgstr "Za menu Mo¾nosti mora biti zaslon visok vsaj 23 vrstic!"
+
+#. #define OPTION_SCREEN_NEEDS_22
+#: LYMessages.c:553
+msgid "Screen height must be at least 22 lines for the Options menu!"
+msgstr "Za menu Mo¾nosti mora biti zaslon visok vsaj 22 vrstic!"
+
+#: LYMessages.c:555
+msgid "That key requires Advanced User mode."
+msgstr "Ta tipka zahteva naèin dela Izku¹eni uporabnik."
+
+#: LYMessages.c:556
+#, c-format
+msgid "Content-type: %s"
+msgstr "Content-type: %s"
+
+#: LYMessages.c:557
+msgid "Command: "
+msgstr "Ukaz: "
+
+#: LYMessages.c:558
+msgid "Unknown or ambiguous command"
+msgstr ""
+
+#: LYMessages.c:559
+msgid " Version "
+msgstr " Razlièica "
+
+#: LYMessages.c:560
+#, fuzzy
+#| msgid " first."
+msgid " first"
+msgstr " najprej."
+
+#: LYMessages.c:561
+msgid ", guessing..."
+msgstr ", ugibamo ..."
+
+#: LYMessages.c:562
+msgid "Permissions for "
+msgstr "Dovoljenja za "
+
+#: LYMessages.c:563
+msgid "Select "
+msgstr "Izberite "
+
+#: LYMessages.c:564
+msgid "capital letter"
+msgstr "veliko èrko"
+
+#: LYMessages.c:565
+msgid " of option line,"
+msgstr " v vrstici z mo¾nostmi,"
+
+#: LYMessages.c:566
+msgid " to save,"
+msgstr " za shranjevanje,"
+
+#: LYMessages.c:567
+msgid " to "
+msgstr " v "
+
+#: LYMessages.c:568
+msgid " or "
+msgstr " ali "
+
+#: LYMessages.c:569
+msgid " index"
+msgstr " stvarno kazalo"
+
+#: LYMessages.c:570
+msgid " to return to Lynx."
+msgstr " za vrnitev v Lynx."
+
+#: LYMessages.c:571
+msgid "Accept Changes"
+msgstr "Sprejmimo spremembe"
+
+#: LYMessages.c:572
+msgid "Reset Changes"
+msgstr "Iznièimo spremembe"
+
+#: LYMessages.c:573
+msgid "Left Arrow cancels changes"
+msgstr "Z levo pu¹èico iznièimo spremembe"
+
+#: LYMessages.c:574
+msgid "Save options to disk"
+msgstr "Shranimo izbire v disk"
+
+#: LYMessages.c:575
+msgid "Hit RETURN to accept entered data."
+msgstr ""
+
+#. #define ACCEPT_DATA_OR_DEFAULT
+#: LYMessages.c:577
+msgid "Hit RETURN to accept entered data. Delete data to invoke the default."
+msgstr ""
+
+#: LYMessages.c:578
+msgid "Value accepted!"
+msgstr "Vrednost sprejeta!"
+
+#. #define VALUE_ACCEPTED_WARNING_X
+#: LYMessages.c:580
+msgid "Value accepted! -- WARNING: Lynx is configured for XWINDOWS!"
+msgstr "Vrednost sprejeta! -- POZOR: Lynx je nastavljen za XWINDOWS!"
+
+#. #define VALUE_ACCEPTED_WARNING_NONX
+#: LYMessages.c:582
+msgid "Value accepted! -- WARNING: Lynx is NOT configured for XWINDOWS!"
+msgstr "Vrednost sprejeta! -- POZOR: Lynx NI nastavljen za XWINDOWS!"
+
+#: LYMessages.c:583
+msgid "You are not allowed to change which editor to use!"
+msgstr ""
+
+#: LYMessages.c:584
+msgid "Failed to set DISPLAY variable!"
+msgstr ""
+
+#: LYMessages.c:585
+msgid "Failed to clear DISPLAY variable!"
+msgstr ""
+
+#. #define BOOKMARK_CHANGE_DISALLOWED
+#: LYMessages.c:587
+msgid "You are not allowed to change the bookmark file!"
+msgstr ""
+
+#: LYMessages.c:588
+msgid "Terminal does not support color"
+msgstr "Terminal ne podpira barv"
+
+#: LYMessages.c:589
+#, c-format
+msgid "Your '%s' terminal does not support color."
+msgstr ""
+
+#: LYMessages.c:590
+msgid "Access to dot files is disabled!"
+msgstr ""
+
+#. #define UA_NO_LYNX_WARNING
+#: LYMessages.c:592
+msgid "User-Agent string does not contain \"Lynx\" or \"L_y_n_x\""
+msgstr ""
+
+#. #define UA_PLEASE_USE_LYNX
+#: LYMessages.c:594
+msgid "Use \"L_y_n_x\" or \"Lynx\" in User-Agent, or it looks like intentional deception!"
+msgstr ""
+
+#. #define UA_CHANGE_DISABLED
+#: LYMessages.c:596
+msgid "Changing of the User-Agent string is disabled!"
+msgstr ""
+
+#. #define CHANGE_OF_SETTING_DISALLOWED
+#: LYMessages.c:598
+msgid "You are not allowed to change this setting."
+msgstr ""
+
+#: LYMessages.c:599
+msgid "Saving Options..."
+msgstr "Shranjujemo mo¾nosti ..."
+
+#: LYMessages.c:600
+msgid "Options saved!"
+msgstr "Mo¾nosti shranjene!"
+
+#: LYMessages.c:601
+msgid "Unable to save Options!"
+msgstr ""
+
+#: LYMessages.c:602
+msgid " 'r' to return to Lynx "
+msgstr ""
+
+#: LYMessages.c:603
+msgid " '>' to save, or 'r' to return to Lynx "
+msgstr ""
+
+#. #define ANY_KEY_CHANGE_RET_ACCEPT
+#: LYMessages.c:605
+msgid "Hit any key to change value; RETURN to accept."
+msgstr "Pritisnite katerokoli tipko za spremembo vrednosti; RETURN za sprejem."
+
+#: LYMessages.c:606
+msgid "Error uncompressing temporary file!"
+msgstr "Napaka pri raz¹irjanju zaèasne datoteke!"
+
+#: LYMessages.c:607
+msgid "Unsupported URL scheme!"
+msgstr "Nepodprta shema URL!"
+
+#: LYMessages.c:608
+msgid "Unsupported data: URL! Use SHOWINFO, for now."
+msgstr "Nepodprti podatki: URL! Zaenkrat uporabite SHOWINFO."
+
+#: LYMessages.c:609
+msgid "Redirection limit of 10 URL's reached."
+msgstr "Dose¾ena je bila omejitev 10 preumerjenih URL-jve."
+
+#: LYMessages.c:610
+msgid "Illegal redirection URL received from server!"
+msgstr "Stre¾nik je poslal URL z neveljavno preusmeritvijo!"
+
+#. #define SERVER_ASKED_FOR_REDIRECTION
+#: LYMessages.c:612
+#, c-format
+msgid "Server asked for %d redirection of POST content to"
+msgstr "Server je prosil za preusmeritev %d vsebine POST na"
+
+#: LYMessages.c:615
+msgid "P)roceed, use G)ET or C)ancel "
+msgstr "P)nadaljevanje, uporabite G)poberi ali C)preklièi"
+
+#: LYMessages.c:616
+msgid "P)roceed, or C)ancel "
+msgstr "P)nadaljevanje ali C)preklic"
+
+#. #define ADVANCED_POST_GET_REDIRECT
+#: LYMessages.c:618
+msgid "Redirection of POST content. P)roceed, see U)RL, use G)ET or C)ancel"
+msgstr "Preusmeritev vsebine POST. P)nadaljevanje, ogled U)RL, G)pobiranje ali C)preklic"
+
+#. #define ADVANCED_POST_REDIRECT
+#: LYMessages.c:620
+msgid "Redirection of POST content. P)roceed, see U)RL, or C)ancel"
+msgstr "Preusmeritev vsebine POST. P)nadaljevanje, ogled U)URL ali C)preklic"
+
+#. #define CONFIRM_POST_RESUBMISSION
+#: LYMessages.c:622
+msgid "Document from Form with POST content. Resubmit?"
+msgstr "Spis iz obrazca brez vsebine POST. Ponovno po¹ljemo zahtevo?"
+
+#. #define CONFIRM_POST_RESUBMISSION_TO
+#: LYMessages.c:624
+#, c-format
+msgid "Resubmit POST content to %s ?"
+msgstr "Ponovno po¹ljemo vsebino POST na %s ?"
+
+#. #define CONFIRM_POST_LIST_RELOAD
+#: LYMessages.c:626
+#, c-format
+msgid "List from document with POST data. Reload %s ?"
+msgstr "Seznam iz dokumenta s podatki POST. Ponovno nalo¾imo %s ?"
+
+#. #define CONFIRM_POST_DOC_HEAD
+#: LYMessages.c:628
+msgid "Document from POST action, HEAD may not be understood. Proceed?"
+msgstr ""
+
+#. #define CONFIRM_POST_LINK_HEAD
+#: LYMessages.c:630
+msgid "Form submit action is POST, HEAD may not be understood. Proceed?"
+msgstr ""
+
+#: LYMessages.c:631
+msgid "Proceed without a username and password?"
+msgstr "Nadaljujemo brez uporabni¹kega imena in gesla?"
+
+#: LYMessages.c:632
+#, c-format
+msgid "Proceed (%s)?"
+msgstr "Nadaljujemo (%s)?"
+
+#: LYMessages.c:633
+msgid "Cannot POST to this host."
+msgstr "Ne moremo poslati POST temu gostitelju."
+
+#: LYMessages.c:634
+msgid "POST not supported for this URL - ignoring POST data!"
+msgstr "POST ni podprt za ta URL - zanemarjamo podatke POST!"
+
+#: LYMessages.c:635
+msgid "Discarding POST data..."
+msgstr "Zanemarjamo podatke POST..."
+
+#: LYMessages.c:636
+msgid "Document will not be reloaded!"
+msgstr "Dokument ne bo ponovno nalo¾en!"
+
+#: LYMessages.c:637
+msgid "Location: "
+msgstr "Lokacija: "
+
+#: LYMessages.c:638
+#, c-format
+msgid "'%s' not found!"
+msgstr ",%s` ni bil najden!"
+
+#: LYMessages.c:639
+msgid "Default Bookmark File"
+msgstr "Privzeta datoteka z zaznamki"
+
+#: LYMessages.c:640
+msgid "Screen too small! (8x35 min)"
+msgstr "Premajhen zaslon! (najmanj 8×35)"
+
+#: LYMessages.c:641
+msgid "Select destination or ^G to Cancel: "
+msgstr "Izberite cilj ali ^G za preklic: "
+
+#. #define MULTIBOOKMARKS_SELECT
+#: LYMessages.c:643
+msgid "Select subbookmark, '=' for menu, or ^G to cancel: "
+msgstr "Izberite podzaznamek, ,=` za menu ali ^G za preklic: "
+
+#. #define MULTIBOOKMARKS_SELF
+#: LYMessages.c:645
+msgid "Reproduce L)ink in this bookmark file or C)ancel? (l,c): "
+msgstr "Reproduciramo L)povezavo v tej datoteki z zaznamki ali C)preklièemo? (l,c): "
+
+#: LYMessages.c:646
+msgid "Multiple bookmark support is not available."
+msgstr "Podpora za veè zaznamkov ni dostopna."
+
+#: LYMessages.c:647
+#, c-format
+msgid " Select Bookmark (screen %d of %d)"
+msgstr ""
+
+#: LYMessages.c:648
+msgid " Select Bookmark"
+msgstr " Izberimo zaznamek"
+
+#. #define MULTIBOOKMARKS_EHEAD_MASK
+#: LYMessages.c:650
+#, c-format
+msgid "Editing Bookmark DESCRIPTION and FILEPATH (%d of 2)"
+msgstr "Urejamo OPIS in POT DO DATOTEKE zaznamka (%d od 2)"
+
+#. #define MULTIBOOKMARKS_EHEAD
+#: LYMessages.c:652
+msgid " Editing Bookmark DESCRIPTION and FILEPATH"
+msgstr " Urejamo OPIS in POT DO DATOTEKE zaznamka"
+
+#: LYMessages.c:653
+msgid "Letter: "
+msgstr "Pismo: "
+
+#. #define USE_PATH_OFF_HOME
+#: LYMessages.c:656
+msgid "Use a filepath off your login directory in SHELL syntax!"
+msgstr "Uporabite pot do datoteke od va¹ega prijavnega imenika v skladnji za lupino!"
+
+#: LYMessages.c:658
+msgid "Use a filepath off your home directory!"
+msgstr "Uporabite ime poti od va¹ega domaèega imenika!"
+
+#. #define MAXLINKS_REACHED
+#: LYMessages.c:661
+msgid "Maximum links per page exceeded! Use half-page or two-line scrolling."
+msgstr "Prese¾eno najveèje ¹tevilo povezav na stran! Uporabite polovièno stran ali dvovrstièno pomikanje."
+
+#: LYMessages.c:662
+msgid "No previously visited links available!"
+msgstr ""
+
+#: LYMessages.c:663
+msgid "Memory exhausted! Program aborted!"
+msgstr "Zmanjkalo pomnilnika! Program je prekinjen!"
+
+#: LYMessages.c:664
+msgid "Memory exhausted! Aborting..."
+msgstr "Zmanjkalo pomnilnika! Konèujemo..."
+
+#: LYMessages.c:665
+msgid "Not enough memory!"
+msgstr ""
+
+#: LYMessages.c:666
+msgid "Directory/File Manager not available"
+msgstr "Urejevalnik imenikov/datotek ni dostopen"
+
+#: LYMessages.c:667
+msgid "HREF in BASE tag is not an absolute URL."
+msgstr "HREF v oznaki BASE ni absolutni URL."
+
+#: LYMessages.c:668
+msgid "Location URL is not absolute."
+msgstr "URL lokacije ni absoluten."
+
+#: LYMessages.c:669
+msgid "Refresh URL is not absolute."
+msgstr "URL za osve¾itev strani ni absoluten."
+
+#. #define SENDING_MESSAGE_WITH_BODY_TO
+#: LYMessages.c:671
+msgid ""
+"You are sending a message with body to:\n"
+" "
+msgstr ""
+"Po¹iljate sporoèilo s telesom na:\n"
+" "
+
+#: LYMessages.c:672
+msgid ""
+"You are sending a comment to:\n"
+" "
+msgstr ""
+"Po¹iljate komentar prejemniku:\n"
+" "
+
+#: LYMessages.c:673
+msgid ""
+"\n"
+" With copy to:\n"
+" "
+msgstr ""
+"\n"
+"S kopijo prejemniku:\n"
+" "
+
+#: LYMessages.c:674
+msgid ""
+"\n"
+" With copies to:\n"
+" "
+msgstr ""
+"\n"
+"S kopijami prejemnikom:\n"
+" "
+
+#. #define CTRL_G_TO_CANCEL_SEND
+#: LYMessages.c:676
+msgid ""
+"\n"
+"\n"
+"Use Ctrl-G to cancel if you do not want to send a message\n"
+msgstr ""
+"\n"
+"\n"
+"Èe ne ¾elite poslati sporoèila, uporabite Ctrl-G za preklic\n"
+
+#. #define ENTER_NAME_OR_BLANK
+#: LYMessages.c:678
+msgid ""
+"\n"
+" Please enter your name, or leave it blank to remain anonymous\n"
+msgstr ""
+"\n"
+" Prosim, vnesite svoje ime ali pustite prazno polje za anonimnost\n"
+
+#. #define ENTER_MAIL_ADDRESS_OR_OTHER
+#: LYMessages.c:680
+msgid ""
+"\n"
+" Please enter a mail address or some other\n"
+msgstr ""
+"\n"
+" Prosim, vnesite po¹tni naslov ali kaj drugega\n"
+
+#. #define MEANS_TO_CONTACT_FOR_RESPONSE
+#: LYMessages.c:682
+msgid " means to contact you, if you desire a response.\n"
+msgstr " naèini za kontaktiranje, èe ¾elite odziv.\n"
+
+#: LYMessages.c:683
+msgid ""
+"\n"
+" Please enter a subject line.\n"
+msgstr ""
+"\n"
+" Prosim, vnesite vrstico s predmetom.\n"
+
+#. #define ENTER_ADDRESS_FOR_CC
+#: LYMessages.c:685
+msgid ""
+"\n"
+" Enter a mail address for a CC of your message.\n"
+msgstr ""
+"\n"
+" Vnesite po¹tni naslov za kopijo (CC) va¹ega sporoèila.\n"
+
+#: LYMessages.c:686
+msgid " (Leave blank if you don't want a copy.)\n"
+msgstr " (Pustite prazno, èe ne ¾elite kopije.)\n"
+
+#: LYMessages.c:687
+msgid ""
+"\n"
+" Please review the message body:\n"
+"\n"
+msgstr ""
+"\n"
+" Prosim, preglejte telo sporoèila:\n"
+"\n"
+
+#: LYMessages.c:688
+msgid ""
+"\n"
+"Press RETURN to continue: "
+msgstr ""
+"\n"
+"Pritisnite RETURN za nadaljevanje: "
+
+#: LYMessages.c:689
+msgid ""
+"\n"
+"Press RETURN to clean up: "
+msgstr ""
+"\n"
+"Pritisnite RETURN za èi¹èenje: "
+
+#: LYMessages.c:690
+msgid " Use Control-U to erase the default.\n"
+msgstr " Uporabite Control-U za izbris privzete vrednosti.\n"
+
+#: LYMessages.c:691
+msgid ""
+"\n"
+" Please enter your message below."
+msgstr ""
+"\n"
+" Prosim, spodaj vnesite svoje sporoèilo."
+
+#. #define ENTER_PERIOD_WHEN_DONE_A
+#: LYMessages.c:693 src/LYNews.c:360
+msgid ""
+"\n"
+" When you are done, press enter and put a single period (.)"
+msgstr ""
+"\n"
+" Ko opravite, pritisnite Enter in vstavite eno samo piko (.)"
+
+#. #define ENTER_PERIOD_WHEN_DONE_B
+#: LYMessages.c:695 src/LYNews.c:361
+msgid ""
+"\n"
+" on a line and press enter again."
+msgstr ""
+"\n"
+" v vrstici, nato spet pritisnite Enter."
+
+#. Cookies messages
+#. #define ADVANCED_COOKIE_CONFIRMATION
+#: LYMessages.c:699
+#, c-format
+msgid "%s cookie: %.*s=%.*s Allow? (Y/N/Always/neVer)"
+msgstr "pi¹kot %s: %.*s=%.*s Dovolimo? (D/N/Vedno/niKoli)"
+
+#. #define INVALID_COOKIE_DOMAIN_CONFIRMATION
+#: LYMessages.c:701
+#, c-format
+msgid "Accept invalid cookie domain=%s for '%s'?"
+msgstr "Sprejmemo neveljavno domeno=%s za pi¹kote za ,%s`?"
+
+#. #define INVALID_COOKIE_PATH_CONFIRMATION
+#: LYMessages.c:703
+#, c-format
+msgid "Accept invalid cookie path=%s as a prefix of '%s'?"
+msgstr "Sprejmemo neveljavno pot=%s za pi¹kote s predpono ,%s`?"
+
+#: LYMessages.c:704
+msgid "Allowing this cookie."
+msgstr "Sprejmemo ta pi¹kot."
+
+#: LYMessages.c:705
+msgid "Rejecting this cookie."
+msgstr "Zavraèamo ta pi¹kot."
+
+#: LYMessages.c:706
+msgid "The Cookie Jar is empty."
+msgstr "Posoda s pi¹koti je prazna."
+
+#: LYMessages.c:707
+#, fuzzy
+#| msgid "The Cookie Jar is empty."
+msgid "The Cache Jar is empty."
+msgstr "Posoda s pi¹koti je prazna."
+
+#. #define ACTIVATE_TO_GOBBLE
+#: LYMessages.c:709
+msgid "Activate links to gobble up cookies or entire domains,"
+msgstr ""
+
+#: LYMessages.c:710
+msgid "or to change a domain's 'allow' setting."
+msgstr ""
+
+#: LYMessages.c:711
+msgid "(Cookies never allowed.)"
+msgstr "(Pi¹koti nikoli dovoljeni.)"
+
+#: LYMessages.c:712
+msgid "(Cookies always allowed.)"
+msgstr "(Pi¹koti vedno dobrodo¹li.)"
+
+#: LYMessages.c:713
+msgid "(Cookies allowed via prompt.)"
+msgstr "(Pi¹koti dovoljeni po vpra¹anju.)"
+
+#: LYMessages.c:714
+msgid "(Persistent Cookies.)"
+msgstr "(Obstojni pi¹koti.)"
+
+#: LYMessages.c:715
+msgid "(No title.)"
+msgstr "(Brez naslova.)"
+
+#: LYMessages.c:716
+msgid "(No name.)"
+msgstr "(Brez imena.)"
+
+#: LYMessages.c:717
+msgid "(No value.)"
+msgstr "(Brez vrednosti.)"
+
+#: LYMessages.c:718 src/LYOptions.c:2409
+msgid "None"
+msgstr "Niè"
+
+#: LYMessages.c:719
+msgid "(End of session.)"
+msgstr "(Konec seje.)"
+
+#: LYMessages.c:720
+msgid "Delete this cookie?"
+msgstr "Odstranimo ta pi¹kot?"
+
+#: LYMessages.c:721
+msgid "The cookie has been eaten!"
+msgstr "Pi¹kot smo pojedli!"
+
+#: LYMessages.c:722
+msgid "Delete this empty domain?"
+msgstr "Pobri¹emo to prazno domeno?"
+
+#: LYMessages.c:723
+msgid "The domain has been eaten!"
+msgstr "Domeno smo pojedli!"
+
+#. #define DELETE_COOKIES_SET_ALLOW_OR_CANCEL
+#: LYMessages.c:725
+msgid "D)elete domain's cookies, set allow A)lways/P)rompt/neV)er, or C)ancel? "
+msgstr ""
+
+#. #define DELETE_DOMAIN_SET_ALLOW_OR_CANCEL
+#: LYMessages.c:727
+msgid "D)elete domain, set allow A)lways/P)rompt/neV)er, or C)ancel? "
+msgstr ""
+
+#: LYMessages.c:728
+msgid "All cookies in the domain have been eaten!"
+msgstr "Pojedli smo vse pi¹kote v domeni!"
+
+#: LYMessages.c:729
+#, c-format
+msgid "'A'lways allowing from domain '%s'."
+msgstr "A)Vedno dovolimo iz domene ,%s`."
+
+#: LYMessages.c:730
+#, c-format
+msgid "ne'V'er allowing from domain '%s'."
+msgstr "V)Nikoli ne dovolimo iz domene ,%s`."
+
+#: LYMessages.c:731
+#, c-format
+msgid "'P'rompting to allow from domain '%s'."
+msgstr "P)Vpra¹amo za dovoljenje za pi¹kote iz domene ,%s`."
+
+#: LYMessages.c:732
+msgid "Delete all cookies in this domain?"
+msgstr "Odstranimo vse pi¹kote v tej domeni?"
+
+#: LYMessages.c:733
+msgid "All of the cookies in the jar have been eaten!"
+msgstr "Vse pi¹kote v posodi smo pojedli!"
+
+#: LYMessages.c:735
+msgid "Port 19 not permitted in URLs."
+msgstr "Vrata 19 niso dovoljena v URL-jih."
+
+#: LYMessages.c:736
+msgid "Port 25 not permitted in URLs."
+msgstr "Vrata 25 niso dovoljena v URL-jih."
+
+#: LYMessages.c:737
+#, c-format
+msgid "Port %lu not permitted in URLs."
+msgstr "Vrata %lu niso dovoljena v URL-jih."
+
+#: LYMessages.c:738
+msgid "URL has a bad port field."
+msgstr "URL ima slabo polje z vrati."
+
+#: LYMessages.c:739
+msgid "Maximum nesting of HTML elements exceeded."
+msgstr "Dose¾eno najgloblje gnezdenje gradnikov HTML."
+
+#: LYMessages.c:740
+msgid "Bad partial reference! Stripping lead dots."
+msgstr "Slab delni sklic! Odstranjujemo vodilne pike."
+
+#: LYMessages.c:741
+#, fuzzy
+#| msgid "Trace Log open failed. Trace off!."
+msgid "Trace Log open failed. Trace off!"
+msgstr "Odpiranje dnevnika za sledenje spodletelo. Sledenje izkljuèeno!"
+
+#: LYMessages.c:742
+msgid "Lynx Trace Log"
+msgstr "Dnevnik za sledenje Lynxu"
+
+#: LYMessages.c:743
+msgid "No trace log has been started for this session."
+msgstr "V tej seji ni bilo zagnanega dnevnika za sledenje."
+
+#. #define MAX_TEMPCOUNT_REACHED
+#: LYMessages.c:745
+msgid "The maximum temporary file count has been reached!"
+msgstr ""
+
+#. #define FORM_VALUE_TOO_LONG
+#: LYMessages.c:747
+msgid "Form field value exceeds buffer length! Trim the tail."
+msgstr ""
+
+#. #define FORM_TAIL_COMBINED_WITH_HEAD
+#: LYMessages.c:749
+msgid "Modified tail combined with head of form field value."
+msgstr ""
+
+#. HTFile.c
+#: LYMessages.c:752
+msgid "Directory"
+msgstr "Imenik"
+
+#: LYMessages.c:753
+msgid "Directory browsing is not allowed."
+msgstr "Brskanje po imeniku ni dovoljeno."
+
+#: LYMessages.c:754
+msgid "Selective access is not enabled for this directory"
+msgstr ""
+
+#: LYMessages.c:755
+msgid "Multiformat: directory scan failed."
+msgstr ""
+
+#: LYMessages.c:756
+msgid "This directory is not readable."
+msgstr "Tega imenika ni mogoèe brati."
+
+#: LYMessages.c:757
+msgid "Can't access requested file."
+msgstr "Ne moremo dostopati do zahtevane datoteke."
+
+#: LYMessages.c:758
+msgid "Could not find suitable representation for transmission."
+msgstr ""
+
+#: LYMessages.c:759
+msgid "Could not open file for decompression!"
+msgstr ""
+
+#: LYMessages.c:760
+msgid "Files:"
+msgstr "Datoteke:"
+
+#: LYMessages.c:761
+msgid "Subdirectories:"
+msgstr "Podimeniki:"
+
+#: LYMessages.c:762
+msgid " directory"
+msgstr " imenik"
+
+#: LYMessages.c:763
+msgid "Up to "
+msgstr "Do "
+
+#: LYMessages.c:764
+msgid "Current directory is "
+msgstr "Trenutni imenik je "
+
+#. HTFTP.c
+#: LYMessages.c:767
+msgid "Symbolic Link"
+msgstr "Simbolna povezava"
+
+#. HTGopher.c
+#: LYMessages.c:770
+msgid "No response from server!"
+msgstr "Ni odgovora od stre¾nika!"
+
+#: LYMessages.c:771
+msgid "CSO index"
+msgstr "Indeks CSO"
+
+#: LYMessages.c:772
+msgid ""
+"\n"
+"This is a searchable index of a CSO database.\n"
+msgstr ""
+"\n"
+"To je iskalni indeks za zbirko podatkov CSO.\n"
+
+#: LYMessages.c:773
+msgid "CSO Search Results"
+msgstr "Iskalni rezultati CSO"
+
+#: LYMessages.c:774
+#, c-format
+msgid "Seek fail on %s\n"
+msgstr "Napaka pri iskanju pri %s\n"
+
+#: LYMessages.c:775
+msgid ""
+"\n"
+"Press the 's' key and enter search keywords.\n"
+msgstr ""
+"\n"
+"Pritisnite tipko ,s` in vnesite iskane kljuène besede.\n"
+
+#: LYMessages.c:776
+msgid ""
+"\n"
+"This is a searchable Gopher index.\n"
+msgstr ""
+"\n"
+"To je iskalno kazalo po Gopherju.\n"
+
+#: LYMessages.c:777
+msgid "Gopher index"
+msgstr "Kazalo po Gopherju"
+
+#: LYMessages.c:778
+msgid "Gopher Menu"
+msgstr "Menu Gopherja"
+
+#: LYMessages.c:779
+msgid " Search Results"
+msgstr " Rezultati iskanja"
+
+#: LYMessages.c:780
+msgid "Sending CSO/PH request."
+msgstr "Po¹iljamo zahtevek CSO/PH."
+
+#: LYMessages.c:781
+msgid "Sending Gopher request."
+msgstr "Po¹iljamo zahtevek Gopherju."
+
+#: LYMessages.c:782
+msgid "CSO/PH request sent; waiting for response."
+msgstr "Zahtevek CSO/PH poslan; èakamo na odgovor."
+
+#: LYMessages.c:783
+msgid "Gopher request sent; waiting for response."
+msgstr "Zahteva Gopherju poslana; èakamo na odgovor."
+
+#: LYMessages.c:784
+msgid ""
+"\n"
+"Please enter search keywords.\n"
+msgstr ""
+"\n"
+"Prosim, vnesite iskane kljuène besede.\n"
+
+#: LYMessages.c:785
+msgid ""
+"\n"
+"The keywords that you enter will allow you to search on a"
+msgstr ""
+"\n"
+"Kljuène besede, ki jih boste vnesli, bodo omogoèile iskanje po"
+
+#: LYMessages.c:786
+msgid " person's name in the database.\n"
+msgstr " imenu osebe v zbirki podatkov.\n"
+
+#. HTNews.c
+#: LYMessages.c:789
+msgid "Connection closed ???"
+msgstr "Povezava zaprta???"
+
+#: LYMessages.c:790
+msgid "Cannot open temporary file for news POST."
+msgstr "Ne moremo odpreti zaèasne datoteke za PO©ILJANJE novic."
+
+#: LYMessages.c:791
+msgid "This client does not contain support for posting to news with SSL."
+msgstr "Ta odjemnik ne vsebuje podpore za po¹iljanje novic s SSL."
+
+#. HTStyle.c
+#: LYMessages.c:794
+#, c-format
+msgid "Style %d `%s' SGML:%s. Font %s %.1f point.\n"
+msgstr "Slog %d ,%s` SGML:%s. Pisava %s %.1f pik.\n"
+
+#: LYMessages.c:796
+#, c-format
+msgid "\tAlign=%d, %d tabs. (%.0f before, %.0f after)\n"
+msgstr "\tPoravnava=%d, %d predelènikov. (%.0f prej, %.0f pozneje)\n"
+
+#: LYMessages.c:797
+#, c-format
+msgid "\t\tTab kind=%d at %.0f\n"
+msgstr "\t\tVrsta predelènika=%d na %.0f\n"
+
+#. HTTP.c
+#: LYMessages.c:800
+msgid "Can't proceed without a username and password."
+msgstr "Ne moremo nadaljevati brez uporabni¹kega imena in gesla."
+
+#: LYMessages.c:801
+msgid "Can't retry with authorization! Contact the server's WebMaster."
+msgstr "Ne moremo ponovno poskusiti brez avtorizacije! Povpra¹ajte upravitelja spletnega stre¾nika."
+
+#: LYMessages.c:802
+msgid "Can't retry with proxy authorization! Contact the server's WebMaster."
+msgstr "Ne moremo ponovno poskusiti brez avtorizacije za proxy! Povpra¹ajte upravitelja spletnega stre¾nika."
+
+#: LYMessages.c:803
+msgid "Retrying with proxy authorization information."
+msgstr "Posku¹amo ponovno z avtorizacijo za proxy."
+
+#: LYMessages.c:804
+#, c-format
+msgid "SSL error:%s-Continue?"
+msgstr ""
+
+#. HTWAIS.c
+#: LYMessages.c:807
+msgid "HTWAIS: Return message too large."
+msgstr "HTWAIS: Sporoèilo z odgovorom je predolgo."
+
+#: LYMessages.c:808
+msgid "Enter WAIS query: "
+msgstr "Vnesite zahtevek za WAIS: "
+
+#. Miscellaneous status
+#: LYMessages.c:811
+msgid "Retrying as HTTP0 request."
+msgstr "Ponovno posku¹amo z zahtevkom HTTP0."
+
+#: LYMessages.c:812
+#, c-format
+msgid "Transferred %d bytes"
+msgstr "Preneseno %d zlogov"
+
+#: LYMessages.c:813
+msgid "Data transfer complete"
+msgstr "Prenos podatkov konèan"
+
+#: LYMessages.c:814
+#, c-format
+msgid "Error processing line %d of %s\n"
+msgstr "Napaka pri obdelavi vrstice %d datoteke %s\n"
+
+#. Lynx internal page titles
+#: LYMessages.c:817
+msgid "Address List Page"
+msgstr "Stran z imenikom naslovov"
+
+#: LYMessages.c:818
+msgid "Bookmark file"
+msgstr "Datoteka z zaznamki"
+
+#: LYMessages.c:819
+msgid "Configuration Definitions"
+msgstr "Definicije nastavitev"
+
+#: LYMessages.c:820
+msgid "Cookie Jar"
+msgstr "Posoda s pi¹koti"
+
+#: LYMessages.c:821
+msgid "Current Key Map"
+msgstr "Trenutna tipkovnica"
+
+#: LYMessages.c:822
+msgid "File Management Options"
+msgstr "Izbire upravljanja datotek"
+
+#: LYMessages.c:823
+msgid "Download Options"
+msgstr "Izbire za jemanje"
+
+#: LYMessages.c:824
+msgid "History Page"
+msgstr "Stran z zgodovino"
+
+#: LYMessages.c:825
+#, fuzzy
+#| msgid "Cookie Jar"
+msgid "Cache Jar"
+msgstr "Posoda s pi¹koti"
+
+#: LYMessages.c:826
+msgid "List Page"
+msgstr "Stran s seznamom"
+
+#: LYMessages.c:827
+msgid "Lynx.cfg Information"
+msgstr "Informacije o Lynx.cfg"
+
+#: LYMessages.c:828
+msgid "Converted Mosaic Hotlist"
+msgstr ""
+
+#: LYMessages.c:829
+msgid "Options Menu"
+msgstr "Menu izbir"
+
+#: LYMessages.c:830
+msgid "File Permission Options"
+msgstr "Izbire za dovoljenja datotek"
+
+#: LYMessages.c:831
+msgid "Printing Options"
+msgstr "Izbire tiskanja"
+
+#: LYMessages.c:832
+msgid "Information about the current document"
+msgstr "Informacije o trenutnem dokumentu"
+
+#: LYMessages.c:833
+msgid "Your recent statusline messages"
+msgstr "Novej¹a sporoèila v vrstici stanja"
+
+#: LYMessages.c:834
+msgid "Upload Options"
+msgstr "Izbire po¹iljanja"
+
+#: LYMessages.c:835
+msgid "Visited Links Page"
+msgstr "Stran z obiskanimi povezavami"
+
+#. CONFIG_DEF_TITLE subtitles
+#: LYMessages.c:838
+msgid "See also"
+msgstr "Glejte tudi"
+
+#: LYMessages.c:839
+msgid "your"
+msgstr "va¹"
+
+#: LYMessages.c:840
+msgid "for runtime options"
+msgstr "za izbire med tekom"
+
+#: LYMessages.c:841
+msgid "compile time options"
+msgstr "izbire ob prevajanju"
+
+#: LYMessages.c:842
+msgid "color-style configuration"
+msgstr ""
+
+#: LYMessages.c:843
+msgid "latest release"
+msgstr "zadnjo razlièico"
+
+#: LYMessages.c:844
+#, fuzzy
+#| msgid "development version"
+msgid "pre-release version"
+msgstr "razvojno razlièico"
+
+#: LYMessages.c:845
+msgid "development version"
+msgstr "razvojno razlièico"
+
+#. #define AUTOCONF_CONFIG_CACHE
+#: LYMessages.c:847
+msgid ""
+"The following data were derived during the automatic configuration/build\n"
+"process of this copy of Lynx. When reporting a bug, please include a copy\n"
+"of this page."
+msgstr ""
+
+#. #define AUTOCONF_LYNXCFG_H
+#: LYMessages.c:851
+msgid ""
+"The following data were used as automatically-configured compile-time\n"
+"definitions when this copy of Lynx was built."
+msgstr ""
+
+#. #define DIRED_NOVICELINE
+#: LYMessages.c:856
+msgid " C)reate D)ownload E)dit F)ull menu M)odify R)emove T)ag U)pload \n"
+msgstr ""
+
+#: LYMessages.c:857
+msgid "Failed to obtain status of current link!"
+msgstr "Nismo mogli dobiti stanja trenutne povezave!"
+
+#. #define INVALID_PERMIT_URL
+#: LYMessages.c:860
+msgid "Special URL only valid from current File Permission menu!"
+msgstr ""
+
+#: LYMessages.c:864
+msgid "External support is currently disabled."
+msgstr "Zunanja podpora je trenutno onemogoèena."
+
+#. new with 2.8.4dev.21
+#: LYMessages.c:868
+#, fuzzy
+#| msgid "The 'p'rint command is currently disabled."
+msgid "Changing working-directory is currently disabled."
+msgstr "Ukaz natisni (p) je trenutno onemogoèen."
+
+#: LYMessages.c:869
+#, fuzzy
+#| msgid "Trace OFF!"
+msgid "Linewrap OFF!"
+msgstr "Sledenje IZKLJUÈENO!"
+
+#: LYMessages.c:870
+msgid "Linewrap ON!"
+msgstr ""
+
+#: LYMessages.c:871
+msgid "Parsing nested-tables toggled OFF! Reloading..."
+msgstr ""
+
+#: LYMessages.c:872
+msgid "Parsing nested-tables toggled ON! Reloading..."
+msgstr ""
+
+#: LYMessages.c:873
+msgid "Shifting is disabled while line-wrap is in effect"
+msgstr ""
+
+#: LYMessages.c:874
+#, fuzzy
+#| msgid "Terminal does not support color"
+msgid "Trace not supported"
+msgstr "Terminal ne podpira barv"
+
+#: LYMessages.c:795
+#, c-format
+msgid "\tIndents: first=%.0f others=%.0f, Height=%.1f Desc=%.1f\n"
+msgstr "\tZamiki: prvi=%.0f ostali=%.0f, vi¹ina=%.1f globina=%.1f\n"
+
+#.
+#. * Set up the message for the username prompt, and then issue the
+#. * prompt. The default username is included in the call to the
+#. * prompting function, but the password is NULL-ed and always replaced.
+#. * - FM
+#.
+#: WWW/Library/Implementation/HTAABrow.c:634
+#, c-format
+msgid "Username for '%s' at %s '%s%s':"
+msgstr "Uporabni¹ko ime za ,%s` na %s ,%s%s`:"
+
+#: WWW/Library/Implementation/HTAABrow.c:904
+msgid "This client doesn't know how to compose proxy authorization information for scheme"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAABrow.c:983
+msgid "This client doesn't know how to compose authorization information for scheme"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAABrow.c:1093
+#, c-format
+msgid "Invalid header '%s%s%s%s%s'"
+msgstr "Neveljavna glava ,%s%s%s%s%s`"
+
+#: WWW/Library/Implementation/HTAABrow.c:1198
+msgid "Proxy authorization required -- retrying"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAABrow.c:1256
+msgid "Access without authorization denied -- retrying"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAccess.c:698
+msgid "Access forbidden by rule"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAccess.c:793
+msgid "Document with POST content not found in cache. Resubmit?"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAccess.c:949
+msgid "Loading failed, use a previous copy."
+msgstr ""
+
+#: WWW/Library/Implementation/HTAccess.c:1058 src/GridText.c:8867
+msgid "Loading incomplete."
+msgstr "Nalaganje nepopolno."
+
+#: WWW/Library/Implementation/HTAccess.c:1089
+#, c-format
+msgid "**** HTAccess: socket or file number returned by obsolete load routine!\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAccess.c:1091
+#, c-format
+msgid "**** HTAccess: Internal software error. Please mail lynx-dev@nongnu.org!\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAccess.c:1092
+#, c-format
+msgid "**** HTAccess: Status returned was: %d\n"
+msgstr ""
+
+#.
+#. * hack: if we fail in HTAccess.c
+#. * avoid duplicating URL, oh.
+#.
+#: WWW/Library/Implementation/HTAccess.c:1098 src/LYMainLoop.c:8050
+msgid "Can't Access"
+msgstr "Ne moremo dostopati"
+
+#: WWW/Library/Implementation/HTAccess.c:1106
+msgid "Unable to access document."
+msgstr "Ne moremo dostopati do sestavka"
+
+#: WWW/Library/Implementation/HTFTP.c:849
+#, c-format
+msgid "Enter password for user %s@%s:"
+msgstr "Vnesite geslo za uporabnika %s@%s:"
+
+#: WWW/Library/Implementation/HTFTP.c:877
+msgid "Unable to connect to FTP host."
+msgstr "Ne moremo se povezati z gostiteljem FTP."
+
+#: WWW/Library/Implementation/HTFTP.c:1158
+msgid "close master socket"
+msgstr ""
+
+#: WWW/Library/Implementation/HTFTP.c:1220
+msgid "socket for master socket"
+msgstr ""
+
+#: WWW/Library/Implementation/HTFTP.c:2986
+msgid "Receiving FTP directory."
+msgstr "Sprejemamo imenik za FTP."
+
+#: WWW/Library/Implementation/HTFTP.c:3122
+#, fuzzy, c-format
+#| msgid "Transferred %d bytes"
+msgid "Transferred %d bytes (%5d)"
+msgstr "Preneseno %d zlogov"
+
+#: WWW/Library/Implementation/HTFTP.c:3480
+msgid "connect for data"
+msgstr "povezava za podatke"
+
+#: WWW/Library/Implementation/HTFTP.c:4141
+msgid "Receiving FTP file."
+msgstr "Jemljemo datoteko s FTP."
+
+#: WWW/Library/Implementation/HTFinger.c:278
+msgid "Could not set up finger connection."
+msgstr "Ne moremo vzpostaviti povezave s finger."
+
+#: WWW/Library/Implementation/HTFinger.c:325
+msgid "Could not load data (no sitename in finger URL)"
+msgstr ""
+
+#: WWW/Library/Implementation/HTFinger.c:329
+msgid "Invalid port number - will only use port 79!"
+msgstr ""
+
+#: WWW/Library/Implementation/HTFinger.c:395
+msgid "Could not access finger host."
+msgstr ""
+
+#: WWW/Library/Implementation/HTFinger.c:403
+msgid "No response from finger server."
+msgstr "Ni odgovora od stre¾nika za finger."
+
+#: WWW/Library/Implementation/HTNews.c:421
+#, c-format
+msgid "Username for news host '%s':"
+msgstr "Uporabni¹ko ime za novièarski stre¾nik ,%s`:"
+
+#: WWW/Library/Implementation/HTNews.c:474
+msgid "Change username?"
+msgstr "Sprememba uporabni¹kega imena?"
+
+#: WWW/Library/Implementation/HTNews.c:478
+msgid "Username:"
+msgstr "Uporabni¹ko ime:"
+
+#: WWW/Library/Implementation/HTNews.c:503
+#, c-format
+msgid "Password for news host '%s':"
+msgstr "Geslo za novièarski stre¾nik ,%s`:"
+
+#: WWW/Library/Implementation/HTNews.c:586
+msgid "Change password?"
+msgstr "Sprememba gesla?"
+
+#: WWW/Library/Implementation/HTNews.c:1707
+#, c-format
+msgid "No matches for: %s"
+msgstr "Ni ujemanja za: %s"
+
+#: WWW/Library/Implementation/HTNews.c:1757
+msgid ""
+"\n"
+"No articles in this group.\n"
+msgstr ""
+"\n"
+"V tem obsegu ni èlankov.\n"
+
+#: WWW/Library/Implementation/HTNews.c:1769
+msgid ""
+"\n"
+"No articles in this range.\n"
+msgstr ""
+
+#.
+#. * Set window title.
+#.
+#: WWW/Library/Implementation/HTNews.c:1782
+#, c-format
+msgid "%s, Articles %d-%d"
+msgstr "%s, Èlanki %d-%d"
+
+#: WWW/Library/Implementation/HTNews.c:1805
+msgid "Earlier articles"
+msgstr "Prej¹nji èlanki"
+
+#: WWW/Library/Implementation/HTNews.c:1818
+#, c-format
+msgid ""
+"\n"
+"There are about %d articles currently available in %s, IDs as follows:\n"
+"\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:1880
+msgid "All available articles in "
+msgstr "Vsi dostopni èlanki v "
+
+#: WWW/Library/Implementation/HTNews.c:2094
+msgid "Later articles"
+msgstr "Poznej¹i èlanki"
+
+#: WWW/Library/Implementation/HTNews.c:2117
+msgid "Post to "
+msgstr "Razpo¹ljemo v "
+
+#: WWW/Library/Implementation/HTNews.c:2338
+msgid "This client does not contain support for SNEWS URLs."
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:2545
+msgid "No target for raw text!"
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:2575
+msgid "Connecting to NewsHost ..."
+msgstr "Povezujemo se z novièarskim stre¾nikom ..."
+
+#: WWW/Library/Implementation/HTNews.c:2627
+#, c-format
+msgid "Could not access %s."
+msgstr "Ne moremo dostopati do %s."
+
+#: WWW/Library/Implementation/HTNews.c:2733
+#, c-format
+msgid "Can't read news info. News host %.20s responded: %.200s"
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:2737
+#, c-format
+msgid "Can't read news info, empty response from host %s"
+msgstr ""
+
+#.
+#. * List available newsgroups. - FM
+#.
+#: WWW/Library/Implementation/HTNews.c:2941
+msgid "Reading list of available newsgroups."
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:2962
+msgid "Reading list of articles in newsgroup."
+msgstr ""
+
+#.
+#. * Get an article from a news group. - FM
+#.
+#: WWW/Library/Implementation/HTNews.c:2968
+msgid "Reading news article."
+msgstr "Beremo novièarski èlanek."
+
+#: WWW/Library/Implementation/HTNews.c:2998
+msgid "Sorry, could not load requested news."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:1286
+msgid "Address has invalid port"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:1362
+msgid "Address length looks invalid"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:1622
+#: WWW/Library/Implementation/HTTCP.c:1640
+#, c-format
+msgid "Unable to locate remote host %s."
+msgstr ""
+
+#. Not HTProgress, so warning won't be overwritten immediately;
+#. * but not HTAlert, because typically there will be other
+#. * alerts from the callers. - kw
+#.
+#: WWW/Library/Implementation/HTTCP.c:1637
+#: WWW/Library/Implementation/HTTelnet.c:115
+#, c-format
+msgid "Invalid hostname %s"
+msgstr "Neveljavno ime gostitelja %s"
+
+#: WWW/Library/Implementation/HTTCP.c:1651
+#, c-format
+msgid "Making %s connection to %s"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:1662
+msgid "socket failed."
+msgstr "vtiènici je spodletelo."
+
+#: WWW/Library/Implementation/HTTCP.c:1676
+#, c-format
+msgid "socket failed: family %d addr %s port %s."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:1700
+msgid "Could not make connection non-blocking."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:1768
+msgid "Connection failed (too many retries)."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:1955
+msgid "Could not restore socket to blocking."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:2021
+msgid "Socket read failed (too many tries)."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:81
+#, c-format
+msgid "SSL callback:%s, preverify_ok=%d, ssl_okay=%d"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:432
+#, c-format
+msgid "Address contains a username: %s"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:486
+#, c-format
+msgid "Certificate issued by: %s"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:673
+msgid "This client does not contain support for HTTPS URLs."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:698
+msgid "Unable to connect to remote host."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:730
+msgid "Retrying connection without TLS."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:773
+msgid "no issuer was found"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:775
+msgid "issuer is not a CA"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:777
+msgid "the certificate has no known issuer"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:779
+#, fuzzy
+#| msgid "The cookie has been eaten!"
+msgid "the certificate has been revoked"
+msgstr "Pi¹kot smo pojedli!"
+
+#: WWW/Library/Implementation/HTTP.c:781
+msgid "the certificate is not trusted"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:855
+#, c-format
+msgid "Verified connection to %s (cert=%s)"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:903 WWW/Library/Implementation/HTTP.c:945
+#, c-format
+msgid "Verified connection to %s (subj=%s)"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:975
+msgid "Can't find common name in certificate"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:978
+#, c-format
+msgid "SSL error:host(%s)!=cert(%s)-Continue?"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:991
+#, c-format
+msgid "UNVERIFIED connection to %s (cert=%s)"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:1000
+#, c-format
+msgid "Secure %d-bit %s (%s) HTTP connection"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:1467
+msgid "Sending HTTP request."
+msgstr "Po¹iljamo zahtevek HTTP."
+
+#: WWW/Library/Implementation/HTTP.c:1509
+msgid "Unexpected network write error; connection aborted."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:1515
+msgid "HTTP request sent; waiting for response."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:1588
+#: WWW/Library/Implementation/HTTP.c:1598
+msgid "Unexpected network read error; connection aborted."
+msgstr ""
+
+#.
+#. * HTTP/1.1 Informational statuses.
+#. * 100 Continue.
+#. * 101 Switching Protocols.
+#. * > 101 is unknown.
+#. * We should never get these, and they have only the status
+#. * line and possibly other headers, so we'll deal with them by
+#. * showing the full header to the user as text/plain. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:1800
+msgid "Got unexpected Informational Status."
+msgstr ""
+
+#.
+#. * Reset Content. The server has fulfilled the request but
+#. * nothing is returned and we should reset any form
+#. * content. We'll instruct the user to do that, and
+#. * restore the current document. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:1834
+msgid "Request fulfilled. Reset Content."
+msgstr ""
+
+#. Not Modified
+#.
+#. * We didn't send an "If-Modified-Since" header, so this
+#. * status is inappropriate. We'll deal with it by showing
+#. * the full header to the user as text/plain. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:1949
+msgid "Got unexpected 304 Not Modified status."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:2012
+msgid "Redirection of POST content requires user approval."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:2027
+msgid "Have POST content. Treating Permanent Redirection as Temporary.\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:2071
+msgid "Retrying with access authorization information."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:2083
+msgid "Show the 401 message body?"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:2127
+msgid "Show the 407 message body?"
+msgstr ""
+
+#.
+#. * Bad or unknown server_status number. Take a chance and hope
+#. * there is something to display. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2227
+msgid "Unknown status reply from server!"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTelnet.c:113
+#, c-format
+msgid "remote %s session:"
+msgstr "oddaljena seja %s:"
+
+#: WWW/Library/Implementation/HTWAIS.c:163
+msgid "Could not connect to WAIS server."
+msgstr "Ne moremo se prikljuèiti na stre¾nik WAIS."
+
+#: WWW/Library/Implementation/HTWAIS.c:171
+msgid "Could not open WAIS connection for reading."
+msgstr "Ne moremo odpreti povezave WAIS za branje."
+
+#: WWW/Library/Implementation/HTWAIS.c:193
+msgid "Diagnostic code is "
+msgstr "Koda za diagnozo je "
+
+#: WWW/Library/Implementation/HTWAIS.c:464
+msgid "Index "
+msgstr "Stvarno kazalo "
+
+#: WWW/Library/Implementation/HTWAIS.c:468
+#, c-format
+msgid " contains the following %d item%s relevant to \""
+msgstr " vsebuje naslednjih %d postavk(%s) za \""
+
+#: WWW/Library/Implementation/HTWAIS.c:476
+msgid "The first figure after each entry is its relative score, "
+msgstr "Prva ¹tevilka po vsakem vnosu je njegov relativni rezultat, "
+
+#: WWW/Library/Implementation/HTWAIS.c:477
+msgid "the second is the number of lines in the item."
+msgstr "druga je ¹tevilo vrstic v postavki."
+
+#: WWW/Library/Implementation/HTWAIS.c:519
+msgid " (bad file name)"
+msgstr " (slabo ime datoteke)"
+
+#: WWW/Library/Implementation/HTWAIS.c:545
+msgid "(bad doc id)"
+msgstr "(slaba id dokumenta)"
+
+#: WWW/Library/Implementation/HTWAIS.c:561
+msgid "(Short Header record, can't display)"
+msgstr "(Zapis s prekratko glavo, ne moremo prikazati)"
+
+#: WWW/Library/Implementation/HTWAIS.c:568
+msgid ""
+"\n"
+"Long Header record, can't display\n"
+msgstr ""
+"\n"
+"Zapis s predolgo glavo, ne moremo prikazati\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:575
+msgid ""
+"\n"
+"Text record\n"
+msgstr ""
+"\n"
+"Besedilni zapis\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:584
+msgid ""
+"\n"
+"Headline record, can't display\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:592
+msgid ""
+"\n"
+"Code record, can't display\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:696
+msgid "Syntax error in WAIS URL"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:768
+msgid " (WAIS Index)"
+msgstr " (Indeks WAIS)"
+
+#: WWW/Library/Implementation/HTWAIS.c:775
+msgid "WAIS Index: "
+msgstr "Indeks WAIS: "
+
+#: WWW/Library/Implementation/HTWAIS.c:781
+msgid "This is a link for searching the "
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:785
+msgid " WAIS Index.\n"
+msgstr " Indeks WAIS.\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:814
+msgid ""
+"\n"
+"Enter the 's'earch command and then specify search words.\n"
+msgstr ""
+"\n"
+"Vnesite ukaz za i,s`kanje in potem doloèite iskalne besede.\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:836
+msgid " (in "
+msgstr " (v "
+
+#: WWW/Library/Implementation/HTWAIS.c:845
+msgid "WAIS Search of \""
+msgstr "Iskanje z WAIS za \""
+
+#: WWW/Library/Implementation/HTWAIS.c:849
+msgid "\" in: "
+msgstr "\" v: "
+
+#: WWW/Library/Implementation/HTWAIS.c:864
+msgid "HTWAIS: Request too large."
+msgstr "HTWAIS: Prevelik zahtevek."
+
+#: WWW/Library/Implementation/HTWAIS.c:873
+msgid "Searching WAIS database..."
+msgstr "Iskanje po zbirki podatkov WAIS..."
+
+#: WWW/Library/Implementation/HTWAIS.c:883
+msgid "Search interrupted."
+msgstr "Iskanje prekinjeno."
+
+#: WWW/Library/Implementation/HTWAIS.c:934
+msgid "Can't convert format of WAIS document"
+msgstr "Ne moremo pretvoriti formata dokumenta WAIS"
+
+#: WWW/Library/Implementation/HTWAIS.c:978
+msgid "HTWAIS: Request too long."
+msgstr "HTWAIS: Predolg zahtevek."
+
+#.
+#. * Actually do the transaction given by request_message.
+#.
+#: WWW/Library/Implementation/HTWAIS.c:992
+msgid "Fetching WAIS document..."
+msgstr "Pobiramo dokument WAIS..."
+
+#. display_search_response(target, retrieval_response,
+#. wais_database, keywords);
+#: WWW/Library/Implementation/HTWAIS.c:1031
+msgid "No text was returned!\n"
+msgstr "Besedilo ni bilo vrnjeno!\n"
+
+#: WWW/Library/Implementation/HTWSRC.c:301
+msgid " NOT GIVEN in source file; "
+msgstr " NI PODANO v izvorni datoteki; "
+
+#: WWW/Library/Implementation/HTWSRC.c:324
+msgid " WAIS source file"
+msgstr " Izvorna datoteka WAIS"
+
+#: WWW/Library/Implementation/HTWSRC.c:331
+msgid " description"
+msgstr " opis"
+
+#: WWW/Library/Implementation/HTWSRC.c:341
+msgid "Access links"
+msgstr "Povezave za dostop"
+
+#: WWW/Library/Implementation/HTWSRC.c:362
+msgid "Direct access"
+msgstr "Neposredni dostop"
+
+#. * Proxy will be used if defined, so let user know that - FM *
+#: WWW/Library/Implementation/HTWSRC.c:365
+msgid " (or via proxy server, if defined)"
+msgstr " (ali prek stre¾nika proxy, èe je definiran)"
+
+#: WWW/Library/Implementation/HTWSRC.c:380
+msgid "Maintainer"
+msgstr "Vzdr¾evalec"
+
+#: WWW/Library/Implementation/HTWSRC.c:388
+msgid "Host"
+msgstr "Gostitelj"
+
+#: src/GridText.c:699
+msgid "Memory exhausted, display interrupted!"
+msgstr "Pomnilnik izèrpan, prikaz prekinjen!"
+
+#: src/GridText.c:704
+msgid "Memory exhausted, will interrupt transfer!"
+msgstr "Pomnilnik izèrpan, prekinili bomo prenos!"
+
+#: src/GridText.c:3685
+msgid " *** MEMORY EXHAUSTED ***"
+msgstr "*** POMNILNIK IZÈRPAN ***"
+
+#: src/GridText.c:6146
+msgid "text entry field"
+msgstr "tekstovno vnosno polje"
+
+#: src/GridText.c:6149
+msgid "password entry field"
+msgstr "vnosno polje za geslo"
+
+#: src/GridText.c:6152
+msgid "checkbox"
+msgstr ""
+
+#: src/GridText.c:6155
+msgid "radio button"
+msgstr "radijski gumb"
+
+#: src/GridText.c:6158
+msgid "submit button"
+msgstr ""
+
+#: src/GridText.c:6161
+msgid "reset button"
+msgstr ""
+
+#: src/GridText.c:6164
+#, fuzzy
+#| msgid "radio button"
+msgid "script button"
+msgstr "radijski gumb"
+
+#: src/GridText.c:6167
+msgid "popup menu"
+msgstr ""
+
+#: src/GridText.c:6170
+msgid "hidden form field"
+msgstr ""
+
+#: src/GridText.c:6173
+msgid "text entry area"
+msgstr ""
+
+#: src/GridText.c:6176
+msgid "range entry field"
+msgstr ""
+
+#: src/GridText.c:6179
+msgid "file entry field"
+msgstr ""
+
+#: src/GridText.c:6182
+msgid "text-submit field"
+msgstr ""
+
+#: src/GridText.c:6185
+msgid "image-submit button"
+msgstr "gumb za po¹iljanje slike"
+
+#: src/GridText.c:6188
+msgid "keygen field"
+msgstr "polje za generiranje kljuèa"
+
+#: src/GridText.c:6191
+msgid "unknown form field"
+msgstr ""
+
+#: src/GridText.c:6211 src/GridText.c:6218 src/LYList.c:248
+msgid "unknown field or link"
+msgstr "neznano polje ali povezava"
+
+#: src/GridText.c:10649
+#, fuzzy
+#| msgid "Can't open output file! Cancelling!"
+msgid "Can't open file for uploading"
+msgstr "Ne moremo odpreti izhodne datoteke! Prekinitev!"
+
+#: src/GridText.c:11837
+#, c-format
+msgid "Submitting %s"
+msgstr ""
+
+#. ugliness has happened; inform user and do the best we can
+#: src/GridText.c:12894
+msgid "Hang Detect: TextAnchor struct corrupted - suggest aborting!"
+msgstr ""
+
+#. don't show previous state
+#: src/GridText.c:13056
+msgid "Wrap lines to fit displayed area?"
+msgstr ""
+
+#: src/GridText.c:13696
+msgid "Very long lines have been truncated!"
+msgstr ""
+
+#: src/HTAlert.c:164 src/LYShowInfo.c:364 src/LYShowInfo.c:368
+msgid "bytes"
+msgstr "zlogov"
+
+#.
+#. * If we know the total size of the file, we can compute
+#. * a percentage, and show a corresponding progress bar.
+#.
+#: src/HTAlert.c:303 src/HTAlert.c:329
+#, fuzzy, c-format
+#| msgid "Read %ld %s of data"
+msgid "Read %s of data"
+msgstr "Prebrano %ld %s podatkov"
+
+#: src/HTAlert.c:326
+#, fuzzy, c-format
+#| msgid "Read %ld of %ld %s of data"
+msgid "Read %s of %s of data"
+msgstr "Prebrano %ld od %ld %s podatkov"
+
+#: src/HTAlert.c:335
+#, fuzzy, c-format
+#| msgid ", %ld %s/sec."
+msgid ", %s/sec"
+msgstr ", %ld %s/sek."
+
+#: src/HTAlert.c:347
+#, c-format
+msgid " (stalled for %s)"
+msgstr ""
+
+#: src/HTAlert.c:351
+#, c-format
+msgid ", ETA %s"
+msgstr ""
+
+#: src/HTAlert.c:373
+msgid " (Press 'z' to abort)"
+msgstr " (Pritisnite ,z` za prenehanje)"
+
+#. Meta-note: don't move the following note from its place right
+#. in front of the first gettext(). As it is now, it should
+#. automatically appear in generated lynx.pot files. - kw
+#.
+#. NOTE TO TRANSLATORS: If you provide a translation for "yes", lynx
+#. * will take the first byte of the translation as a positive response
+#. * to Yes/No questions. If you provide a translation for "no", lynx
+#. * will take the first byte of the translation as a negative response
+#. * to Yes/No questions. For both, lynx will also try to show the
+#. * first byte in the prompt as a character, instead of (y) or (n),
+#. * respectively. This will not work right for multibyte charsets!
+#. * Don't translate "yes" and "no" for CJK character sets (or translate
+#. * them to "yes" and "no"). For a translation using UTF-8, don't
+#. * translate if the translation would begin with anything but a 7-bit
+#. * (US_ASCII) character. That also means do not translate if the
+#. * translation would begin with anything but a 7-bit character, if
+#. * you use a single-byte character encoding (a charset like ISO-8859-n)
+#. * but anticipate that the message catalog may be used re-encoded in
+#. * UTF-8 form.
+#. * For translations using other character sets, you may also wish to
+#. * leave "yes" and "no" untranslated, if using (y) and (n) is the
+#. * preferred behavior.
+#. * Lynx will also accept y Y n N as responses unless there is a conflict
+#. * with the first letter of the "yes" or "no" translation.
+#.
+#: src/HTAlert.c:411 src/HTAlert.c:459
+msgid "yes"
+msgstr "da"
+
+#: src/HTAlert.c:414 src/HTAlert.c:460
+msgid "no"
+msgstr "ne"
+
+#.
+#. * Special-purpose workaround for gettext support (we should do
+#. * this in a more general way) -TD
+#. *
+#. * NOTE TO TRANSLATORS: If the prompt has been rendered into
+#. * another language, and if yes/no are distinct, assume the
+#. * translator can make an ordered list in parentheses with one
+#. * capital letter for each as we assumed in HTConfirmDefault().
+#. * The list has to be in the same order as in the original message,
+#. * and the four capital letters chosen to not match those in the
+#. * original unless they have the same position.
+#. *
+#. * Example:
+#. * (Y/N/Always/neVer) - English (original)
+#. * (O/N/Toujours/Jamais) - French
+#.
+#: src/HTAlert.c:913
+msgid "Y/N/A/V"
+msgstr "D/N/V/K"
+
+#: src/HTML.c:5915
+msgid "Description:"
+msgstr "Opis:"
+
+#: src/HTML.c:5920
+msgid "(none)"
+msgstr "(brez)"
+
+#: src/HTML.c:5924
+msgid "Filepath:"
+msgstr "Pot do datoteke:"
+
+#: src/HTML.c:5930
+msgid "(unknown)"
+msgstr "(neznana)"
+
+#: src/HTML.c:7370
+msgid "Document has only hidden links. Use the 'l'ist command."
+msgstr "Dokument ima le skrite povezave. Uporabite ukaz ,l` za izpis."
+
+#: src/HTML.c:7869
+msgid "Source cache error - disk full?"
+msgstr ""
+
+#: src/HTML.c:7882
+msgid "Source cache error - not enough memory!"
+msgstr ""
+
+#: src/LYBookmark.c:167
+msgid ""
+" This file is an HTML representation of the X Mosaic hotlist file.\n"
+" Outdated or invalid links may be removed by using the\n"
+" remove bookmark command, it is usually the 'R' key but may have\n"
+" been remapped by you or your system administrator."
+msgstr ""
+
+#: src/LYBookmark.c:376
+#, c-format
+msgid ""
+" You can delete links by the 'R' key<br>\n"
+"<ol>\n"
+msgstr ""
+
+#: src/LYBookmark.c:379
+msgid ""
+" You can delete links using the remove bookmark command. It is usually\n"
+" the 'R' key but may have been remapped by you or your system\n"
+" administrator."
+msgstr ""
+
+#: src/LYBookmark.c:383
+msgid ""
+" This file also may be edited with a standard text editor to delete\n"
+" outdated or invalid links, or to change their order."
+msgstr ""
+
+#: src/LYBookmark.c:386
+msgid ""
+"Note: if you edit this file manually\n"
+" you should not change the format within the lines\n"
+" or add other HTML markup.\n"
+" Make sure any bookmark link is saved as a single line."
+msgstr ""
+
+#: src/LYBookmark.c:684
+#, c-format
+msgid "File may be recoverable from %s during this session"
+msgstr ""
+
+#: src/LYCgi.c:158
+#, c-format
+msgid "Do you want to execute \"%s\"?"
+msgstr ""
+
+#.
+#. * Neither the path as given nor any components examined by backing up
+#. * were stat()able. - kw
+#.
+#: src/LYCgi.c:273
+msgid "Unable to access cgi script"
+msgstr ""
+
+#: src/LYCgi.c:707 src/LYCgi.c:710
+msgid "Good Advice"
+msgstr "Dober nasvet"
+
+#: src/LYCgi.c:714
+msgid "An excellent http server for VMS is available via"
+msgstr "Izvrsten stre¾nik HTTP za VMS je dostopen prek"
+
+#: src/LYCgi.c:721
+msgid "this link"
+msgstr "te povezave"
+
+#: src/LYCgi.c:725
+msgid "It provides state of the art CGI script support.\n"
+msgstr "Ponuja naravnost umetni¹ko podporo za skripte CGI.\n"
+
+#: src/LYClean.c:122
+msgid "Exiting via interrupt:"
+msgstr "Zapu¹èamo program prek prekinitve:"
+
+#: src/LYCookie.c:2537
+msgid "(from a previous session)"
+msgstr "(iz prej¹nje seje)"
+
+#: src/LYCookie.c:2598
+msgid "Maximum Gobble Date:"
+msgstr ""
+
+#: src/LYCookie.c:2637
+#, fuzzy
+#| msgid " (internal)"
+msgid "Internal"
+msgstr " (notranji)"
+
+#: src/LYCookie.c:2638
+msgid "cookie_domain_flag_set error, aborting program"
+msgstr ""
+
+#: src/LYCurses.c:1297
+msgid "Terminal initialisation failed - unknown terminal type?"
+msgstr ""
+
+#: src/LYCurses.c:1780
+msgid "Terminal ="
+msgstr "Terminal ="
+
+#: src/LYCurses.c:1784
+msgid "You must use a vt100, 200, etc. terminal with this program."
+msgstr "V tem programu morate uporabljati terminal vt100, 200, ipd."
+
+#: src/LYCurses.c:1833
+msgid "Your Terminal type is unknown!"
+msgstr "Vrsta va¹ega terminala je neznana!"
+
+#: src/LYCurses.c:1834
+msgid "Enter a terminal type:"
+msgstr "Vnesite vrsto terminala:"
+
+#: src/LYCurses.c:1848
+msgid "TERMINAL TYPE IS SET TO"
+msgstr "VRSTA TERMINALA JE NASTAVLJENA NA"
+
+#: src/LYCurses.c:2398
+#, c-format
+msgid ""
+"\n"
+"A Fatal error has occurred in %s Ver. %s\n"
+msgstr ""
+"\n"
+"Usodna napaka se je pojavila v %s Ver. %s\n"
+
+#: src/LYCurses.c:2401
+#, c-format
+msgid ""
+"\n"
+"Please notify your system administrator to confirm a bug, and if\n"
+"confirmed, to notify the lynx-dev list. Bug reports should have concise\n"
+"descriptions of the command and/or URL which causes the problem, the\n"
+"operating system name with version number, the TCPIP implementation, the\n"
+"TRACEBACK if it can be captured, and any other relevant information.\n"
+msgstr ""
+"\n"
+"Prosim, obvestite va¹ega sistemskega nadzornika, da potrdi ta hro¹è\n"
+"in, èe je potrjen, obvesti dopisni seznam lynx-dev. Opisi hro¹èev bi\n"
+"morali imeti podrobne opise ukazov in/ali URL-jev, ki so povzroèili\n"
+"te¾ave, ime in ¹tevilko razlièice operacijskega sistema, izvedbe\n"
+"TCP/IP, podatke TRACEBACK, èe jih je mogoèe zajeti, in vse druge\n"
+"pomembne podatke.\n"
+
+#: src/LYEdit.c:272
+#, fuzzy, c-format
+#| msgid "Error processing line %d of %s\n"
+msgid "Error starting editor, %s"
+msgstr "Napaka pri obdelavi vrstice %d datoteke %s\n"
+
+#: src/LYEdit.c:275
+msgid "Editor killed by signal"
+msgstr ""
+
+#: src/LYEdit.c:280
+#, c-format
+msgid "Editor returned with error status %s"
+msgstr ""
+
+#: src/LYDownload.c:509
+msgid "Downloaded link:"
+msgstr "Prene¹ena povezava:"
+
+#: src/LYDownload.c:514
+msgid "Suggested file name:"
+msgstr "Predlagano ime datoteke:"
+
+#: src/LYDownload.c:519
+msgid "Standard download options:"
+msgstr "Standardne izbire za jemanje:"
+
+#: src/LYDownload.c:520
+msgid "Download options:"
+msgstr "Izbire za jemanje:"
+
+#: src/LYDownload.c:536
+msgid "Save to disk"
+msgstr "Shranimo v disk"
+
+#: src/LYDownload.c:550
+#, fuzzy
+#| msgid "Can't open temporary file!"
+msgid "View temporary file"
+msgstr "Ne moremo odpreti zaèasne datoteke!"
+
+#: src/LYDownload.c:557
+msgid "Save to disk disabled."
+msgstr "Shranjevanje v disk onemogoèeno."
+
+#: src/LYDownload.c:561 src/LYPrint.c:1322
+msgid "Local additions:"
+msgstr "Lokalni dodatki:"
+
+#: src/LYDownload.c:572 src/LYUpload.c:209
+msgid "No Name Given"
+msgstr "Ni podanega imena"
+
+#: src/LYHistory.c:679
+msgid "You selected:"
+msgstr "Izbrali ste:"
+
+#: src/LYHistory.c:703 src/LYHistory.c:932
+msgid "(no address)"
+msgstr "(ni naslova)"
+
+#: src/LYHistory.c:707
+msgid " (internal)"
+msgstr " (notranji)"
+
+#: src/LYHistory.c:709
+msgid " (was internal)"
+msgstr " (je bil notranji)"
+
+#: src/LYHistory.c:807
+msgid " (From History)"
+msgstr " (iz Zgodovine)"
+
+#: src/LYHistory.c:852
+msgid "You visited (POSTs, bookmark, menu and list files excluded):"
+msgstr ""
+
+#: src/LYHistory.c:1154
+msgid "(No messages yet)"
+msgstr ""
+
+#: src/LYLeaks.c:222
+msgid "Invalid pointer detected."
+msgstr ""
+
+#: src/LYLeaks.c:224 src/LYLeaks.c:262
+msgid "Sequence:"
+msgstr ""
+
+#: src/LYLeaks.c:227 src/LYLeaks.c:265
+msgid "Pointer:"
+msgstr "Kazalec:"
+
+#: src/LYLeaks.c:236 src/LYLeaks.c:243 src/LYLeaks.c:284
+msgid "FileName:"
+msgstr "Ime datoteke:"
+
+#: src/LYLeaks.c:239 src/LYLeaks.c:246 src/LYLeaks.c:287 src/LYLeaks.c:298
+msgid "LineCount:"
+msgstr ""
+
+#: src/LYLeaks.c:260
+msgid "Memory leak detected."
+msgstr ""
+
+#: src/LYLeaks.c:268
+msgid "Contains:"
+msgstr "Vsebuje:"
+
+#: src/LYLeaks.c:281
+msgid "ByteSize:"
+msgstr "Velikost zlogov:"
+
+#: src/LYLeaks.c:295
+msgid "realloced:"
+msgstr ""
+
+#: src/LYLeaks.c:316
+msgid "Total memory leakage this run:"
+msgstr ""
+
+#: src/LYLeaks.c:320
+msgid "Peak allocation"
+msgstr ""
+
+#: src/LYLeaks.c:322
+msgid "Bytes allocated"
+msgstr ""
+
+#: src/LYLeaks.c:324
+msgid "Total mallocs"
+msgstr ""
+
+#: src/LYLeaks.c:326
+msgid "Total frees"
+msgstr ""
+
+#: src/LYList.c:88
+msgid "References in "
+msgstr ""
+
+#: src/LYList.c:91
+msgid "this document:"
+msgstr ""
+
+#: src/LYList.c:97
+msgid "Visible links:"
+msgstr ""
+
+#: src/LYList.c:201 src/LYList.c:312
+msgid "Hidden links:"
+msgstr "Skrite povezave:"
+
+#: src/LYList.c:349
+msgid "References"
+msgstr "Sklici"
+
+#: src/LYList.c:353
+msgid "Visible links"
+msgstr "Vidne povezave"
+
+#: src/LYLocal.c:289
+#, c-format
+msgid "Unable to get status of '%s'."
+msgstr ""
+
+#: src/LYLocal.c:354
+msgid "The selected item is not a file or a directory! Request ignored."
+msgstr ""
+
+#: src/LYLocal.c:455
+#, c-format
+msgid "Unable to %s due to system error!"
+msgstr ""
+
+#: src/LYLocal.c:489
+#, c-format
+msgid "Probable failure to %s due to system error!"
+msgstr ""
+
+#: src/LYLocal.c:554 src/LYLocal.c:577
+#, c-format
+msgid "remove %s"
+msgstr ""
+
+#: src/LYLocal.c:597
+#, c-format
+msgid "touch %s"
+msgstr ""
+
+#: src/LYLocal.c:627
+#, c-format
+msgid "move %s to %s"
+msgstr ""
+
+#: src/LYLocal.c:675
+msgid "There is already a directory with that name! Request ignored."
+msgstr ""
+
+#: src/LYLocal.c:677
+msgid "There is already a file with that name! Request ignored."
+msgstr ""
+
+#: src/LYLocal.c:679
+msgid "The specified name is already in use! Request ignored."
+msgstr ""
+
+#: src/LYLocal.c:691
+msgid "Destination has different owner! Request denied."
+msgstr ""
+
+#: src/LYLocal.c:694
+msgid "Destination is not a valid directory! Request denied."
+msgstr ""
+
+#: src/LYLocal.c:710
+msgid "Source and destination are the same location! Request ignored!"
+msgstr ""
+
+#: src/LYLocal.c:734
+msgid "Remove all tagged files and directories?"
+msgstr ""
+
+#: src/LYLocal.c:807
+msgid "Enter new location for tagged items: "
+msgstr ""
+
+#: src/LYLocal.c:905
+msgid "Enter new name for directory: "
+msgstr ""
+
+#: src/LYLocal.c:907
+msgid "Enter new name for file: "
+msgstr ""
+
+#: src/LYLocal.c:919
+msgid "Illegal character (path-separator) found! Request ignored."
+msgstr ""
+
+#: src/LYLocal.c:969
+msgid "Enter new location for directory: "
+msgstr ""
+
+#: src/LYLocal.c:971
+msgid "Enter new location for file: "
+msgstr ""
+
+#: src/LYLocal.c:998
+msgid "Unexpected failure - unable to find trailing path separator"
+msgstr ""
+
+#: src/LYLocal.c:1060
+msgid "Modify name, location, or permission (n, l, or p): "
+msgstr ""
+
+#: src/LYLocal.c:1062
+msgid "Modify name or location (n or l): "
+msgstr ""
+
+#.
+#. * Code for changing ownership needed here.
+#.
+#: src/LYLocal.c:1091
+msgid "This feature not yet implemented!"
+msgstr ""
+
+#: src/LYLocal.c:1112
+msgid "Enter name of file to create: "
+msgstr ""
+
+#: src/LYLocal.c:1115 src/LYLocal.c:1152
+msgid "Illegal redirection \"//\" found! Request ignored."
+msgstr ""
+
+#: src/LYLocal.c:1149
+msgid "Enter name for new directory: "
+msgstr ""
+
+#: src/LYLocal.c:1190
+msgid "Create file or directory (f or d): "
+msgstr ""
+
+#: src/LYLocal.c:1232
+#, fuzzy, c-format
+#| msgid " directory"
+msgid "Remove directory '%s'?"
+msgstr " imenik"
+
+#: src/LYLocal.c:1235
+#, fuzzy
+#| msgid " directory"
+msgid "Remove directory?"
+msgstr " imenik"
+
+#: src/LYLocal.c:1240
+#, c-format
+msgid "Remove file '%s'?"
+msgstr ""
+
+#: src/LYLocal.c:1242
+msgid "Remove file?"
+msgstr ""
+
+#: src/LYLocal.c:1247
+#, c-format
+msgid "Remove symbolic link '%s'?"
+msgstr ""
+
+#: src/LYLocal.c:1249
+#, fuzzy
+#| msgid "Symbolic Link"
+msgid "Remove symbolic link?"
+msgstr "Simbolna povezava"
+
+#: src/LYLocal.c:1347
+msgid "Sorry, don't know how to permit non-UNIX files yet."
+msgstr ""
+
+#: src/LYLocal.c:1376
+msgid "Unable to open permit options file"
+msgstr ""
+
+#: src/LYLocal.c:1404
+msgid "Specify permissions below:"
+msgstr ""
+
+#: src/LYLocal.c:1405 src/LYShowInfo.c:265
+msgid "Owner:"
+msgstr "Lastnik:"
+
+#: src/LYLocal.c:1421
+msgid "Group"
+msgstr "Skupina"
+
+#: src/LYLocal.c:1437
+msgid "Others:"
+msgstr "Drugi:"
+
+#: src/LYLocal.c:1455
+msgid "form to permit"
+msgstr ""
+
+#: src/LYLocal.c:1551
+msgid "Invalid mode format."
+msgstr ""
+
+#: src/LYLocal.c:1555
+msgid "Invalid syntax format."
+msgstr ""
+
+#: src/LYLocal.c:1742
+msgid "Warning! UUDecoded file will exist in the directory you started Lynx."
+msgstr ""
+
+#: src/LYLocal.c:1932
+msgid "NULL URL pointer"
+msgstr ""
+
+#: src/LYLocal.c:2014
+#, c-format
+msgid "Executing %s "
+msgstr "Izvajamo %s "
+
+#: src/LYLocal.c:2017
+msgid "Executing system command. This might take a while."
+msgstr ""
+
+#: src/LYLocal.c:2091
+msgid "Current directory:"
+msgstr "Trenutni imenik:"
+
+#: src/LYLocal.c:2094 src/LYLocal.c:2112
+msgid "Current selection:"
+msgstr ""
+
+#: src/LYLocal.c:2098
+msgid "Nothing currently selected."
+msgstr ""
+
+#: src/LYLocal.c:2114
+msgid "tagged item:"
+msgstr ""
+
+#: src/LYLocal.c:2115
+msgid "tagged items:"
+msgstr ""
+
+#: src/LYLocal.c:2215 src/LYLocal.c:2224
+msgid "Illegal filename; request ignored."
+msgstr ""
+
+#. directory not writable
+#: src/LYLocal.c:2322 src/LYLocal.c:2381
+msgid "Install in the selected directory not permitted."
+msgstr ""
+
+#: src/LYLocal.c:2377
+msgid "The selected item is not a directory! Request ignored."
+msgstr ""
+
+#: src/LYLocal.c:2386
+msgid "Just a moment, ..."
+msgstr ""
+
+#: src/LYLocal.c:2403
+msgid "Error building install args"
+msgstr ""
+
+#: src/LYLocal.c:2418 src/LYLocal.c:2449
+#, c-format
+msgid "Source and target are the same: %s"
+msgstr ""
+
+#: src/LYLocal.c:2425 src/LYLocal.c:2456
+#, fuzzy, c-format
+#| msgid "Reading directory..."
+msgid "Already in target directory: %s"
+msgstr "Beremo imenik..."
+
+#: src/LYLocal.c:2474
+msgid "Installation complete"
+msgstr ""
+
+#: src/LYLocal.c:2666
+msgid "Temporary URL or list would be too long."
+msgstr ""
+
+#: src/LYMail.c:544
+msgid "Sending"
+msgstr "Po¹iljamo"
+
+#: src/LYMail.c:1030
+#, c-format
+msgid "The link %s :?: %s \n"
+msgstr "Povezava %s :?: %s\n"
+
+#: src/LYMail.c:1032
+#, c-format
+msgid "called \"%s\"\n"
+msgstr "je klicala \"%s\"\n"
+
+#: src/LYMail.c:1033
+#, c-format
+msgid "in the file \"%s\" called \"%s\"\n"
+msgstr "v datoteki \"%s\" je klicana \"%s\"\n"
+
+#: src/LYMail.c:1034
+msgid "was requested but was not available."
+msgstr "je bila zahtevana, a ni dostopna."
+
+#: src/LYMail.c:1035
+msgid "Thought you might want to know."
+msgstr ""
+
+#: src/LYMail.c:1037
+msgid "This message was automatically generated by"
+msgstr ""
+
+#: src/LYMail.c:1751
+msgid "No system mailer configured"
+msgstr ""
+
+#: src/LYMain.c:1049
+msgid "No Winsock found, sorry."
+msgstr "Vtiènica Winsock ¾al ni bila najdena."
+
+#: src/LYMain.c:1240
+#, fuzzy
+#| msgid "You MUST define a valid TMP or TEMP area!\n"
+msgid "You MUST define a valid TMP or TEMP area!"
+msgstr "MORATE nastaviti veljavno podroèje TMP ali TEMP!\n"
+
+#: src/LYMain.c:1293 src/LYMainLoop.c:5260
+#, fuzzy
+#| msgid " directory"
+msgid "No such directory"
+msgstr " imenik"
+
+#: src/LYMain.c:1487
+#, fuzzy, c-format
+#| msgid ""
+#| "\n"
+#| "Configuration file %s is not available.\n"
+#| "\n"
+msgid ""
+"\n"
+"Configuration file \"%s\" is not available.\n"
+"\n"
+msgstr ""
+"\n"
+"Nastavitvena datoteka %s ni dostopna.\n"
+"\n"
+
+#: src/LYMain.c:1497
+#, c-format
+msgid ""
+"\n"
+"Lynx character sets not declared.\n"
+"\n"
+msgstr ""
+"\n"
+"Nabor znakov za Lynx ni bil doloèen.\n"
+"\n"
+
+#: src/LYMain.c:1526
+#, c-format
+msgid ""
+"\n"
+"Lynx edit map not declared.\n"
+"\n"
+msgstr ""
+"\n"
+"Urejevalna preslikava za Lynx ni bila doloèena.\n"
+"\n"
+
+#: src/LYMain.c:1608
+#, fuzzy, c-format
+#| msgid ""
+#| "\n"
+#| "Lynx file %s is not available.\n"
+#| "\n"
+msgid ""
+"\n"
+"Lynx file \"%s\" is not available.\n"
+"\n"
+msgstr ""
+"\n"
+"Datoteka %s za Lynx< ni dostopna.\n"
+"\n"
+
+#: src/LYMain.c:1683
+#, c-format
+msgid "Ignored %d characters from standard input.\n"
+msgstr ""
+
+#: src/LYMain.c:1685
+#, c-format
+msgid "Use \"-stdin\" or \"-\" to tell how to handle piped input.\n"
+msgstr ""
+
+#: src/LYMain.c:1843
+msgid "Warning:"
+msgstr ""
+
+#: src/LYMain.c:2408
+msgid "persistent cookies state will be changed in next session only."
+msgstr "stanje obstojnih pi¹kotov bo spremenjeno le v naslednji seji."
+
+#: src/LYMain.c:2644 src/LYMain.c:2689
+#, c-format
+msgid "Lynx: ignoring unrecognized charset=%s\n"
+msgstr ""
+
+#: src/LYMain.c:3208
+#, fuzzy, c-format
+#| msgid ""
+#| "\n"
+#| "%s Version %s (%.*s)\n"
+msgid "%s Version %s (%s)"
+msgstr ""
+"\n"
+"%s Razlièica %s (%.*s)\n"
+
+#: src/LYMain.c:3246
+#, c-format
+msgid "Built on %s %s %s\n"
+msgstr "Zgrajena na %s %s %s\n"
+
+#: src/LYMain.c:3268
+msgid "Copyrights held by the Lynx Developers Group,"
+msgstr ""
+
+#: src/LYMain.c:3269
+#, fuzzy
+#| msgid "Copyrights held by the University of Kansas, CERN, and other contributors.\n"
+msgid "the University of Kansas, CERN, and other contributors."
+msgstr "Pravice raz¹irjanja imajo Univerza v Kansasu, CERN in drugi sodelavci.\n"
+
+#: src/LYMain.c:3270
+#, fuzzy
+#| msgid "Distributed under the GNU General Public License.\n"
+msgid "Distributed under the GNU General Public License (Version 2)."
+msgstr "Raz¹irjano pod Splo¹no licenco GNU.\n"
+
+#: src/LYMain.c:3271
+msgid "See http://lynx.isc.org/ and the online help for more information."
+msgstr ""
+
+#: src/LYMain.c:4104
+#, c-format
+msgid "USAGE: %s [options] [file]\n"
+msgstr ""
+
+#: src/LYMain.c:4105
+#, c-format
+msgid "Options are:\n"
+msgstr ""
+
+#: src/LYMain.c:4406
+#, c-format
+msgid "%s: Invalid Option: %s\n"
+msgstr ""
+
+#: src/LYMainLoop.c:575
+#, c-format
+msgid "Internal error: Invalid mouse link %d!"
+msgstr ""
+
+#: src/LYMainLoop.c:696 src/LYMainLoop.c:5282
+msgid "A URL specified by the user"
+msgstr ""
+
+#: src/LYMainLoop.c:1148
+msgid "Enctype multipart/form-data not yet supported! Cannot submit."
+msgstr ""
+
+#.
+#. * Make a name for this help file.
+#.
+#: src/LYMainLoop.c:3177
+msgid "Help Screen"
+msgstr ""
+
+#: src/LYMainLoop.c:3308
+msgid "System Index"
+msgstr ""
+
+#: src/LYMainLoop.c:3556
+#, c-format
+msgid "Query parameter %d: "
+msgstr ""
+
+#: src/LYMainLoop.c:3781 src/LYMainLoop.c:5558
+msgid "Entry into main screen"
+msgstr ""
+
+#: src/LYMainLoop.c:4039
+msgid "No next document present"
+msgstr ""
+
+#: src/LYMainLoop.c:4334
+msgid "charset for this document specified explicitly, sorry..."
+msgstr ""
+
+#: src/LYMainLoop.c:5240
+msgid "cd to:"
+msgstr ""
+
+#: src/LYMainLoop.c:5263
+msgid "A component of path is not a directory"
+msgstr ""
+
+#: src/LYMainLoop.c:5266
+#, fuzzy
+#| msgid "Could not access directory."
+msgid "failed to change directory"
+msgstr "Ne moremo dostopati do imenika."
+
+#: src/LYMainLoop.c:6496
+msgid "Reparsing document under current settings..."
+msgstr ""
+
+#: src/LYMainLoop.c:6790
+#, c-format
+msgid "Fatal error - could not open output file %s\n"
+msgstr ""
+
+#: src/LYMainLoop.c:7128
+msgid "TABLE center enable."
+msgstr ""
+
+#: src/LYMainLoop.c:7131
+msgid "TABLE center disable."
+msgstr ""
+
+#: src/LYMainLoop.c:7211
+#, fuzzy
+#| msgid "Current directory:"
+msgid "Current URL is empty."
+msgstr "Trenutni imenik:"
+
+#: src/LYMainLoop.c:7213 src/LYUtils.c:1881
+msgid "Copy to clipboard failed."
+msgstr ""
+
+#: src/LYMainLoop.c:7215
+msgid "Document URL put to clipboard."
+msgstr ""
+
+#: src/LYMainLoop.c:7217
+msgid "Link URL put to clipboard."
+msgstr ""
+
+#: src/LYMainLoop.c:7244
+msgid "No URL in the clipboard."
+msgstr ""
+
+#: src/LYMainLoop.c:7936 src/LYMainLoop.c:8105
+#, fuzzy
+#| msgid " index"
+msgid "-index-"
+msgstr " stvarno kazalo"
+
+#: src/LYMainLoop.c:8045
+msgid "lynx: Can't access startfile"
+msgstr ""
+
+#: src/LYMainLoop.c:8057
+msgid "lynx: Start file could not be found or is not text/html or text/plain"
+msgstr ""
+
+#: src/LYMainLoop.c:8058
+msgid " Exiting..."
+msgstr ""
+
+#: src/LYMainLoop.c:8099
+msgid "-more-"
+msgstr ""
+
+#. Enable scrolling.
+#: src/LYNews.c:186
+msgid "You will be posting to:"
+msgstr ""
+
+#.
+#. * Get the mail address for the From header, offering personal_mail_address
+#. * as default.
+#.
+#: src/LYNews.c:195
+msgid ""
+"\n"
+"\n"
+" Please provide your mail address for the From: header\n"
+msgstr ""
+
+#.
+#. * Get the Subject header, offering the current document's title as the
+#. * default if this is a followup rather than a new post. - FM
+#.
+#: src/LYNews.c:212
+msgid ""
+"\n"
+"\n"
+" Please provide or edit the Subject: header\n"
+msgstr ""
+
+#: src/LYNews.c:302
+msgid ""
+"\n"
+"\n"
+" Please provide or edit the Organization: header\n"
+msgstr ""
+
+#.
+#. * Use the built in line editior.
+#.
+#: src/LYNews.c:359
+msgid ""
+"\n"
+"\n"
+" Please enter your message below."
+msgstr ""
+
+#: src/LYNews.c:405
+msgid "Message has no original text!"
+msgstr ""
+
+#: src/LYOptions.c:770
+msgid "review/edit B)ookmarks files"
+msgstr ""
+
+#: src/LYOptions.c:772
+msgid "B)ookmark file: "
+msgstr ""
+
+#: src/LYOptions.c:2120 src/LYOptions.c:2127
+msgid "ON"
+msgstr ""
+
+#. verbose_img variable
+#: src/LYOptions.c:2121 src/LYOptions.c:2126 src/LYOptions.c:2289
+#: src/LYOptions.c:2300
+msgid "OFF"
+msgstr ""
+
+#: src/LYOptions.c:2122
+msgid "NEVER"
+msgstr ""
+
+#: src/LYOptions.c:2123
+msgid "ALWAYS"
+msgstr ""
+
+#: src/LYOptions.c:2139 src/LYOptions.c:2281
+msgid "ignore"
+msgstr ""
+
+#: src/LYOptions.c:2140
+msgid "ask user"
+msgstr ""
+
+#: src/LYOptions.c:2141
+msgid "accept all"
+msgstr ""
+
+#: src/LYOptions.c:2153
+msgid "ALWAYS OFF"
+msgstr ""
+
+#: src/LYOptions.c:2154
+msgid "FOR LOCAL FILES ONLY"
+msgstr ""
+
+#: src/LYOptions.c:2156
+msgid "ALWAYS ON"
+msgstr ""
+
+#: src/LYOptions.c:2168
+msgid "Numbers act as arrows"
+msgstr ""
+
+#: src/LYOptions.c:2170
+msgid "Links are numbered"
+msgstr ""
+
+#: src/LYOptions.c:2173
+msgid "Links and form fields are numbered"
+msgstr ""
+
+#: src/LYOptions.c:2176
+msgid "Form fields are numbered"
+msgstr ""
+
+#: src/LYOptions.c:2191
+msgid "Case insensitive"
+msgstr ""
+
+#: src/LYOptions.c:2192
+msgid "Case sensitive"
+msgstr ""
+
+#: src/LYOptions.c:2216
+msgid "prompt normally"
+msgstr ""
+
+#: src/LYOptions.c:2217
+msgid "force yes-response"
+msgstr ""
+
+#: src/LYOptions.c:2218
+msgid "force no-response"
+msgstr ""
+
+#: src/LYOptions.c:2236
+msgid "Novice"
+msgstr ""
+
+#: src/LYOptions.c:2237
+msgid "Intermediate"
+msgstr ""
+
+#: src/LYOptions.c:2238
+msgid "Advanced"
+msgstr ""
+
+#: src/LYOptions.c:2247
+msgid "By First Visit"
+msgstr ""
+
+#: src/LYOptions.c:2249
+msgid "By First Visit Reversed"
+msgstr ""
+
+#: src/LYOptions.c:2250
+msgid "As Visit Tree"
+msgstr ""
+
+#: src/LYOptions.c:2251
+msgid "By Last Visit"
+msgstr ""
+
+#: src/LYOptions.c:2253
+msgid "By Last Visit Reversed"
+msgstr ""
+
+#. Old_DTD variable
+#: src/LYOptions.c:2264
+msgid "relaxed (TagSoup mode)"
+msgstr ""
+
+#: src/LYOptions.c:2265
+msgid "strict (SortaSGML mode)"
+msgstr ""
+
+#: src/LYOptions.c:2272
+msgid "Ignore"
+msgstr ""
+
+#: src/LYOptions.c:2273
+msgid "Add to trace-file"
+msgstr ""
+
+#: src/LYOptions.c:2274
+msgid "Add to LYNXMESSAGES"
+msgstr ""
+
+#: src/LYOptions.c:2275
+msgid "Warn, point to trace-file"
+msgstr ""
+
+#: src/LYOptions.c:2282
+msgid "as labels"
+msgstr ""
+
+#: src/LYOptions.c:2283
+#, fuzzy
+#| msgid "this link"
+msgid "as links"
+msgstr "te povezave"
+
+#: src/LYOptions.c:2290
+#, fuzzy
+#| msgid " (bad file name)"
+msgid "show filename"
+msgstr " (slabo ime datoteke)"
+
+#: src/LYOptions.c:2301
+msgid "STANDARD"
+msgstr ""
+
+#: src/LYOptions.c:2302
+msgid "ADVANCED"
+msgstr ""
+
+#: src/LYOptions.c:2336
+#, fuzzy
+#| msgid "Subdirectories:"
+msgid "Directories first"
+msgstr "Podimeniki:"
+
+#: src/LYOptions.c:2337
+#, fuzzy
+#| msgid " first."
+msgid "Files first"
+msgstr " najprej."
+
+#: src/LYOptions.c:2338
+msgid "Mixed style"
+msgstr ""
+
+#: src/LYOptions.c:2346 src/LYOptions.c:2366
+#, fuzzy
+#| msgid "Name:"
+msgid "By Name"
+msgstr "Ime:"
+
+#: src/LYOptions.c:2347 src/LYOptions.c:2367
+msgid "By Type"
+msgstr ""
+
+#: src/LYOptions.c:2348 src/LYOptions.c:2368
+#, fuzzy
+#| msgid "ByteSize:"
+msgid "By Size"
+msgstr "Velikost zlogov:"
+
+#: src/LYOptions.c:2349 src/LYOptions.c:2369
+msgid "By Date"
+msgstr ""
+
+#: src/LYOptions.c:2350
+msgid "By Mode"
+msgstr ""
+
+#: src/LYOptions.c:2352
+msgid "By User"
+msgstr ""
+
+#: src/LYOptions.c:2353
+#, fuzzy
+#| msgid "Group"
+msgid "By Group"
+msgstr "Skupina"
+
+#: src/LYOptions.c:2378
+msgid "Do not show rate"
+msgstr ""
+
+#: src/LYOptions.c:2379 src/LYOptions.c:2380
+#, c-format
+msgid "Show %s/sec rate"
+msgstr ""
+
+#: src/LYOptions.c:2382 src/LYOptions.c:2383
+#, c-format
+msgid "Show %s/sec, ETA"
+msgstr ""
+
+#: src/LYOptions.c:2386
+msgid "Show progressbar"
+msgstr ""
+
+#: src/LYOptions.c:2398
+msgid "Accept lynx's internal types"
+msgstr ""
+
+#: src/LYOptions.c:2399
+msgid "Also accept lynx.cfg's types"
+msgstr ""
+
+#: src/LYOptions.c:2400
+msgid "Also accept user's types"
+msgstr ""
+
+#: src/LYOptions.c:2401
+msgid "Also accept system's types"
+msgstr ""
+
+#: src/LYOptions.c:2402
+#, fuzzy
+#| msgid "Accept Changes"
+msgid "Accept all types"
+msgstr "Sprejmimo spremembe"
+
+#: src/LYOptions.c:2411
+msgid "gzip"
+msgstr ""
+
+#: src/LYOptions.c:2412
+msgid "deflate"
+msgstr ""
+
+#: src/LYOptions.c:2415
+msgid "compress"
+msgstr ""
+
+#: src/LYOptions.c:2418
+msgid "bzip2"
+msgstr ""
+
+#: src/LYOptions.c:2420
+msgid "All"
+msgstr ""
+
+#: src/LYOptions.c:2699 src/LYOptions.c:2728
+#, c-format
+msgid "Use %s to invoke the Options menu!"
+msgstr ""
+
+#: src/LYOptions.c:3541
+msgid "(options marked with (!) will not be saved)"
+msgstr ""
+
+#: src/LYOptions.c:3549
+#, fuzzy
+#| msgid "References"
+msgid "General Preferences"
+msgstr "Sklici"
+
+#. ***************************************************************
+#. User Mode: SELECT
+#: src/LYOptions.c:3553
+msgid "User mode"
+msgstr ""
+
+#. Editor: INPUT
+#: src/LYOptions.c:3559
+msgid "Editor"
+msgstr ""
+
+#. Search Type: SELECT
+#: src/LYOptions.c:3564
+msgid "Type of Search"
+msgstr ""
+
+#: src/LYOptions.c:3569
+msgid "Security and Privacy"
+msgstr ""
+
+#. ***************************************************************
+#. Cookies: SELECT
+#: src/LYOptions.c:3573
+msgid "Cookies"
+msgstr ""
+
+#. Cookie Prompting: SELECT
+#: src/LYOptions.c:3587
+msgid "Invalid-Cookie Prompting"
+msgstr ""
+
+#. SSL Prompting: SELECT
+#: src/LYOptions.c:3594
+msgid "SSL Prompting"
+msgstr ""
+
+#: src/LYOptions.c:3600
+msgid "Keyboard Input"
+msgstr ""
+
+#. ***************************************************************
+#. Keypad Mode: SELECT
+#: src/LYOptions.c:3604
+msgid "Keypad mode"
+msgstr ""
+
+#. Emacs keys: ON/OFF
+#: src/LYOptions.c:3610
+msgid "Emacs keys"
+msgstr ""
+
+#. VI Keys: ON/OFF
+#: src/LYOptions.c:3616
+msgid "VI keys"
+msgstr ""
+
+#. Line edit style: SELECT
+#. well, at least 2 line edit styles available
+#: src/LYOptions.c:3623
+msgid "Line edit style"
+msgstr ""
+
+#. Keyboard layout: SELECT
+#: src/LYOptions.c:3635
+msgid "Keyboard layout"
+msgstr ""
+
+#.
+#. * Display and Character Set
+#.
+#: src/LYOptions.c:3649
+msgid "Display and Character Set"
+msgstr ""
+
+#. Use locale-based character set: ON/OFF
+#: src/LYOptions.c:3654
+msgid "Use locale-based character set"
+msgstr ""
+
+#: src/LYOptions.c:3661
+msgid "Use HTML5 charset replacements"
+msgstr ""
+
+#. Display Character Set: SELECT
+#: src/LYOptions.c:3667
+msgid "Display character set"
+msgstr ""
+
+#: src/LYOptions.c:3698
+msgid "Assumed document character set"
+msgstr ""
+
+#.
+#. * Since CJK people hardly mixed with other world
+#. * we split the header to make it more readable:
+#. * "CJK mode" for CJK display charsets, and "Raw 8-bit" for others.
+#.
+#: src/LYOptions.c:3718
+msgid "CJK mode"
+msgstr ""
+
+#: src/LYOptions.c:3720
+msgid "Raw 8-bit"
+msgstr ""
+
+#. X Display: INPUT
+#: src/LYOptions.c:3728
+msgid "X Display"
+msgstr ""
+
+#.
+#. * Document Appearance
+#.
+#: src/LYOptions.c:3734
+msgid "Document Appearance"
+msgstr ""
+
+#: src/LYOptions.c:3740
+msgid "Show color"
+msgstr ""
+
+#. Show cursor: ON/OFF
+#: src/LYOptions.c:3764
+msgid "Show cursor"
+msgstr ""
+
+#. Underline links: ON/OFF
+#: src/LYOptions.c:3770
+#, fuzzy
+#| msgid "Hidden links:"
+msgid "Underline links"
+msgstr "Skrite povezave:"
+
+#. Show scrollbar: ON/OFF
+#: src/LYOptions.c:3777
+msgid "Show scrollbar"
+msgstr ""
+
+#. Select Popups: ON/OFF
+#: src/LYOptions.c:3784
+msgid "Popups for select fields"
+msgstr ""
+
+#. HTML error recovery: SELECT
+#: src/LYOptions.c:3790
+msgid "HTML error recovery"
+msgstr ""
+
+#. Bad HTML messages: SELECT
+#: src/LYOptions.c:3796
+msgid "Bad HTML messages"
+msgstr ""
+
+#. Show Images: SELECT
+#: src/LYOptions.c:3802
+msgid "Show images"
+msgstr ""
+
+#. Verbose Images: ON/OFF
+#: src/LYOptions.c:3816
+msgid "Verbose images"
+msgstr ""
+
+#.
+#. * Headers Transferred to Remote Servers
+#.
+#: src/LYOptions.c:3824
+msgid "Headers Transferred to Remote Servers"
+msgstr ""
+
+#. ***************************************************************
+#. Mail Address: INPUT
+#: src/LYOptions.c:3828
+msgid "Personal mail address"
+msgstr ""
+
+#: src/LYOptions.c:3833
+#, fuzzy
+#| msgid "Personal Name: "
+msgid "Personal name for mail"
+msgstr "Osebno ime: "
+
+#: src/LYOptions.c:3840
+#, fuzzy
+#| msgid "Password for news host '%s':"
+msgid "Password for anonymous ftp"
+msgstr "Geslo za novièarski stre¾nik ,%s`:"
+
+#. Preferred media type: SELECT
+#: src/LYOptions.c:3846
+#, fuzzy
+#| msgid "Transferred %d bytes"
+msgid "Preferred media type"
+msgstr "Preneseno %d zlogov"
+
+#. Preferred encoding: SELECT
+#: src/LYOptions.c:3852
+msgid "Preferred encoding"
+msgstr ""
+
+#. Preferred Document Character Set: INPUT
+#: src/LYOptions.c:3858
+msgid "Preferred document character set"
+msgstr ""
+
+#. Preferred Document Language: INPUT
+#: src/LYOptions.c:3863
+msgid "Preferred document language"
+msgstr ""
+
+#: src/LYOptions.c:3869
+msgid "Send User-Agent header"
+msgstr ""
+
+#: src/LYOptions.c:3871
+msgid "User-Agent header"
+msgstr ""
+
+#.
+#. * Listing and Accessing Files
+#.
+#: src/LYOptions.c:3879
+msgid "Listing and Accessing Files"
+msgstr ""
+
+#. FTP sort: SELECT
+#: src/LYOptions.c:3884
+msgid "Use Passive FTP"
+msgstr ""
+
+#. FTP sort: SELECT
+#: src/LYOptions.c:3890
+msgid "FTP sort criteria"
+msgstr ""
+
+#. Local Directory Sort: SELECT
+#: src/LYOptions.c:3898
+msgid "Local directory sort criteria"
+msgstr ""
+
+#. Local Directory Order: SELECT
+#: src/LYOptions.c:3904
+#, fuzzy
+#| msgid "This directory is not readable."
+msgid "Local directory sort order"
+msgstr "Tega imenika ni mogoèe brati."
+
+#: src/LYOptions.c:3913
+msgid "Show dot files"
+msgstr ""
+
+#: src/LYOptions.c:3921
+msgid "Execution links"
+msgstr ""
+
+#: src/LYOptions.c:3939
+msgid "Pause when showing message"
+msgstr ""
+
+#. Show transfer rate: SELECT
+#: src/LYOptions.c:3946
+#, fuzzy
+#| msgid "Data transfer complete"
+msgid "Show transfer rate"
+msgstr "Prenos podatkov konèan"
+
+#.
+#. * Special Files and Screens
+#.
+#: src/LYOptions.c:3966
+msgid "Special Files and Screens"
+msgstr ""
+
+#: src/LYOptions.c:3971
+msgid "Multi-bookmarks"
+msgstr ""
+
+#: src/LYOptions.c:3979
+msgid "Review/edit Bookmarks files"
+msgstr ""
+
+#: src/LYOptions.c:3982
+msgid "Goto multi-bookmark menu"
+msgstr ""
+
+#: src/LYOptions.c:3984
+msgid "Bookmarks file"
+msgstr ""
+
+#. Auto Session: ON/OFF
+#: src/LYOptions.c:3991
+msgid "Auto Session"
+msgstr ""
+
+#. Session File Menu: INPUT
+#: src/LYOptions.c:3997
+msgid "Session file"
+msgstr ""
+
+#. Visited Pages: SELECT
+#: src/LYOptions.c:4003
+#, fuzzy
+#| msgid "Visited Links Page"
+msgid "Visited Pages"
+msgstr "Stran z obiskanimi povezavami"
+
+#: src/LYOptions.c:4008
+msgid "View the file "
+msgstr ""
+
+#: src/LYPrint.c:947
+#, fuzzy, c-format
+#| msgid "Loading incomplete."
+msgid " Print job complete.\n"
+msgstr "Nalaganje nepopolno."
+
+#: src/LYPrint.c:1274
+msgid "Document:"
+msgstr ""
+
+#: src/LYPrint.c:1275
+msgid "Number of lines:"
+msgstr "©tevilo vrstic:"
+
+#: src/LYPrint.c:1276
+msgid "Number of pages:"
+msgstr "©tevilo strani:"
+
+#: src/LYPrint.c:1277
+msgid "pages"
+msgstr "strani"
+
+#: src/LYPrint.c:1277
+msgid "page"
+msgstr "stran"
+
+#: src/LYPrint.c:1278
+msgid "(approximately)"
+msgstr "(pribli¾no)"
+
+#: src/LYPrint.c:1285
+msgid "Some print functions have been disabled!"
+msgstr ""
+
+#: src/LYPrint.c:1289
+msgid "Standard print options:"
+msgstr ""
+
+#: src/LYPrint.c:1290
+msgid "Print options:"
+msgstr ""
+
+#: src/LYPrint.c:1297
+msgid "Save to a local file"
+msgstr ""
+
+#: src/LYPrint.c:1299
+msgid "Save to disk disabled"
+msgstr ""
+
+#: src/LYPrint.c:1306
+msgid "Mail the file"
+msgstr ""
+
+#: src/LYPrint.c:1313
+msgid "Print to the screen"
+msgstr ""
+
+#: src/LYPrint.c:1318
+msgid "Print out on a printer attached to your vt100 terminal"
+msgstr ""
+
+#: src/LYReadCFG.c:441
+#, c-format
+msgid ""
+"Syntax Error parsing COLOR in configuration file:\n"
+"The line must be of the form:\n"
+"COLOR:INTEGER:FOREGROUND:BACKGROUND\n"
+"\n"
+"Here FOREGROUND and BACKGROUND must be one of:\n"
+"The special strings 'nocolor' or 'default', or\n"
+msgstr ""
+
+#: src/LYReadCFG.c:454
+msgid "Offending line:"
+msgstr ""
+
+#: src/LYReadCFG.c:757
+#, c-format
+msgid "key remapping of %s to %s for %s failed\n"
+msgstr ""
+
+#: src/LYReadCFG.c:764
+#, c-format
+msgid "key remapping of %s to %s failed\n"
+msgstr ""
+
+#: src/LYReadCFG.c:785
+#, c-format
+msgid "invalid line-editor selection %s for key %s, selecting all\n"
+msgstr ""
+
+#: src/LYReadCFG.c:810 src/LYReadCFG.c:822
+#, c-format
+msgid "setting of line-editor binding for key %s (0x%x) to 0x%x for %s failed\n"
+msgstr ""
+
+#: src/LYReadCFG.c:826
+#, c-format
+msgid "setting of line-editor binding for key %s (0x%x) for %s failed\n"
+msgstr ""
+
+#: src/LYReadCFG.c:922
+#, c-format
+msgid "Lynx: cannot start, CERN rules file %s is not available\n"
+msgstr ""
+
+#: src/LYReadCFG.c:923
+msgid "(no name)"
+msgstr "(brez imena)"
+
+#: src/LYReadCFG.c:2044
+#, c-format
+msgid "More than %d nested lynx.cfg includes -- perhaps there is a loop?!?\n"
+msgstr ""
+
+#: src/LYReadCFG.c:2046
+#, c-format
+msgid "Last attempted include was '%s',\n"
+msgstr ""
+
+#: src/LYReadCFG.c:2047
+#, c-format
+msgid "included from '%s'.\n"
+msgstr ""
+
+#: src/LYReadCFG.c:2450 src/LYReadCFG.c:2463 src/LYReadCFG.c:2521
+msgid "The following is read from your lynx.cfg file."
+msgstr ""
+
+#: src/LYReadCFG.c:2451 src/LYReadCFG.c:2464
+msgid "Please read the distribution"
+msgstr "Prosim, preberite dokumentacijo v distribuciji"
+
+#: src/LYReadCFG.c:2457 src/LYReadCFG.c:2467
+msgid "for more comments."
+msgstr "za veè pripomb."
+
+#: src/LYReadCFG.c:2503
+msgid "RELOAD THE CHANGES"
+msgstr ""
+
+#: src/LYReadCFG.c:2511
+msgid "Your primary configuration"
+msgstr ""
+
+#: src/LYShowInfo.c:177
+msgid "Directory that you are currently viewing"
+msgstr ""
+
+#: src/LYShowInfo.c:180
+msgid "Name:"
+msgstr "Ime:"
+
+#: src/LYShowInfo.c:183
+msgid "URL:"
+msgstr "URL:"
+
+#: src/LYShowInfo.c:197
+msgid "Directory that you have currently selected"
+msgstr ""
+
+#: src/LYShowInfo.c:199
+msgid "File that you have currently selected"
+msgstr ""
+
+#: src/LYShowInfo.c:202
+msgid "Symbolic link that you have currently selected"
+msgstr ""
+
+#: src/LYShowInfo.c:205
+msgid "Item that you have currently selected"
+msgstr ""
+
+#: src/LYShowInfo.c:207
+msgid "Full name:"
+msgstr ""
+
+#: src/LYShowInfo.c:217
+msgid "Unable to follow link"
+msgstr ""
+
+#: src/LYShowInfo.c:219
+msgid "Points to file:"
+msgstr ""
+
+#: src/LYShowInfo.c:224
+#, fuzzy
+#| msgid "Number of lines:"
+msgid "Name of owner:"
+msgstr "©tevilo vrstic:"
+
+#: src/LYShowInfo.c:227
+msgid "Group name:"
+msgstr ""
+
+#: src/LYShowInfo.c:229
+msgid "File size:"
+msgstr ""
+
+#: src/LYShowInfo.c:231
+#, fuzzy
+#| msgid "bytes"
+msgid "(bytes)"
+msgstr "zlogov"
+
+#.
+#. * Include date and time information.
+#.
+#: src/LYShowInfo.c:236
+msgid "Creation date:"
+msgstr ""
+
+#: src/LYShowInfo.c:239
+msgid "Last modified:"
+msgstr ""
+
+#: src/LYShowInfo.c:242
+msgid "Last accessed:"
+msgstr ""
+
+#: src/LYShowInfo.c:248
+msgid "Access Permissions"
+msgstr ""
+
+#: src/LYShowInfo.c:283
+#, fuzzy
+#| msgid "Group"
+msgid "Group:"
+msgstr "Skupina"
+
+#: src/LYShowInfo.c:303
+msgid "World:"
+msgstr ""
+
+#: src/LYShowInfo.c:310
+msgid "File that you are currently viewing"
+msgstr ""
+
+#: src/LYShowInfo.c:318 src/LYShowInfo.c:422
+msgid "Linkname:"
+msgstr ""
+
+#: src/LYShowInfo.c:324 src/LYShowInfo.c:339
+msgid "Charset:"
+msgstr ""
+
+#: src/LYShowInfo.c:338
+msgid "(assumed)"
+msgstr ""
+
+#: src/LYShowInfo.c:345
+msgid "Server:"
+msgstr ""
+
+#: src/LYShowInfo.c:348
+msgid "Date:"
+msgstr ""
+
+#: src/LYShowInfo.c:351
+msgid "Last Mod:"
+msgstr ""
+
+#: src/LYShowInfo.c:356
+msgid "Expires:"
+msgstr ""
+
+#: src/LYShowInfo.c:359
+msgid "Cache-Control:"
+msgstr ""
+
+#: src/LYShowInfo.c:362
+msgid "Content-Length:"
+msgstr ""
+
+#: src/LYShowInfo.c:366
+msgid "Length:"
+msgstr ""
+
+#: src/LYShowInfo.c:371
+msgid "Language:"
+msgstr ""
+
+#: src/LYShowInfo.c:378
+msgid "Post Data:"
+msgstr ""
+
+#: src/LYShowInfo.c:381
+msgid "Post Content Type:"
+msgstr ""
+
+#: src/LYShowInfo.c:384
+msgid "Owner(s):"
+msgstr ""
+
+#: src/LYShowInfo.c:389
+msgid "size:"
+msgstr ""
+
+#: src/LYShowInfo.c:391
+msgid "lines"
+msgstr ""
+
+#: src/LYShowInfo.c:395
+msgid "forms mode"
+msgstr ""
+
+#: src/LYShowInfo.c:397
+msgid "source"
+msgstr ""
+
+#: src/LYShowInfo.c:398
+msgid "normal"
+msgstr ""
+
+#: src/LYShowInfo.c:400
+msgid ", safe"
+msgstr ""
+
+#: src/LYShowInfo.c:402
+#, fuzzy
+#| msgid " (was internal)"
+msgid ", via internal link"
+msgstr " (je bil notranji)"
+
+#: src/LYShowInfo.c:407
+msgid ", no-cache"
+msgstr ""
+
+#: src/LYShowInfo.c:409
+msgid ", ISMAP script"
+msgstr ""
+
+#: src/LYShowInfo.c:411
+msgid ", bookmark file"
+msgstr ""
+
+#: src/LYShowInfo.c:415
+msgid "mode:"
+msgstr ""
+
+#: src/LYShowInfo.c:421
+msgid "Link that you currently have selected"
+msgstr ""
+
+#: src/LYShowInfo.c:430
+msgid "Method:"
+msgstr ""
+
+#: src/LYShowInfo.c:434
+msgid "Enctype:"
+msgstr ""
+
+#: src/LYShowInfo.c:440
+#, fuzzy
+#| msgid "Location: "
+msgid "Action:"
+msgstr "Lokacija: "
+
+#: src/LYShowInfo.c:446
+msgid "(Form field)"
+msgstr ""
+
+#: src/LYShowInfo.c:457
+msgid "No Links on the current page"
+msgstr ""
+
+#: src/LYShowInfo.c:463
+msgid "Server Headers:"
+msgstr ""
+
+#: src/LYStyle.c:331
+#, c-format
+msgid ""
+"Syntax Error parsing style in lss file:\n"
+"[%s]\n"
+"The line must be of the form:\n"
+"OBJECT:MONO:COLOR (ie em:bold:brightblue:white)\n"
+"where OBJECT is one of EM,STRONG,B,I,U,BLINK etc.\n"
+"\n"
+msgstr ""
+
+#: src/LYTraversal.c:111
+msgid "here is a list of the history stack so that you may rebuild"
+msgstr ""
+
+#: src/LYUpload.c:77
+msgid "ERROR! - upload command is misconfigured"
+msgstr ""
+
+#: src/LYUpload.c:98
+msgid "Illegal redirection \"../\" found! Request ignored."
+msgstr ""
+
+#: src/LYUpload.c:101
+msgid "Illegal character \"/\" found! Request ignored."
+msgstr ""
+
+#: src/LYUpload.c:104
+msgid "Illegal redirection using \"~\" found! Request ignored."
+msgstr ""
+
+#: src/LYUpload.c:157
+msgid "Unable to upload file."
+msgstr ""
+
+#: src/LYUpload.c:199
+msgid "Upload To:"
+msgstr ""
+
+#: src/LYUpload.c:200
+msgid "Upload options:"
+msgstr ""
+
+#: src/LYUtils.c:1883
+msgid "Download document URL put to clipboard."
+msgstr ""
+
+#: src/LYUtils.c:2668
+msgid "Unexpected access protocol for this URL scheme."
+msgstr ""
+
+#: src/LYUtils.c:3492
+msgid "Too many tempfiles"
+msgstr ""
+
+#: src/LYUtils.c:3792
+#, fuzzy
+#| msgid "unknown field or link"
+msgid "unknown restriction"
+msgstr "neznano polje ali povezava"
+
+#: src/LYUtils.c:3823
+#, c-format
+msgid "No restrictions set.\n"
+msgstr ""
+
+#: src/LYUtils.c:3826
+#, fuzzy, c-format
+#| msgid "Description:"
+msgid "Restrictions set:\n"
+msgstr "Opis:"
+
+#: src/LYUtils.c:5212
+msgid "Cannot find HOME directory"
+msgstr ""
+
+#: src/LYrcFile.c:16
+msgid "Normally disabled. See ENABLE_LYNXRC in lynx.cfg\n"
+msgstr ""
+
+#: src/LYrcFile.c:325
+msgid ""
+"accept_all_cookies allows the user to tell Lynx to automatically\n"
+"accept all cookies if desired. The default is \"FALSE\" which will\n"
+"prompt for each cookie. Set accept_all_cookies to \"TRUE\" to accept\n"
+"all cookies.\n"
+msgstr ""
+
+#: src/LYrcFile.c:333
+msgid ""
+"anonftp_password allows the user to tell Lynx to use the personal\n"
+"email address as the password for anonymous ftp. If no value is given,\n"
+"Lynx will use the personal email address. Set anonftp_password\n"
+"to a different value if you choose.\n"
+msgstr ""
+
+#: src/LYrcFile.c:342
+msgid ""
+"bookmark_file specifies the name and location of the default bookmark\n"
+"file into which the user can paste links for easy access at a later\n"
+"date.\n"
+msgstr ""
+
+#: src/LYrcFile.c:347
+msgid ""
+"If case_sensitive_searching is \"on\" then when the user invokes a search\n"
+"using the 's' or '/' keys, the search performed will be case sensitive\n"
+"instead of case INsensitive. The default is usually \"off\".\n"
+msgstr ""
+
+#: src/LYrcFile.c:352
+msgid ""
+"The character_set definition controls the representation of 8 bit\n"
+"characters for your terminal. If 8 bit characters do not show up\n"
+"correctly on your screen you may try changing to a different 8 bit\n"
+"set or using the 7 bit character approximations.\n"
+"Current valid characters sets are:\n"
+msgstr ""
+
+#: src/LYrcFile.c:359
+msgid ""
+"cookie_accept_domains and cookie_reject_domains are comma-delimited\n"
+"lists of domains from which Lynx should automatically accept or reject\n"
+"all cookies. If a domain is specified in both options, rejection will\n"
+"take precedence. The accept_all_cookies parameter will override any\n"
+"settings made here.\n"
+msgstr ""
+
+#: src/LYrcFile.c:367
+#, fuzzy
+#| msgid ""
+#| "cookie_file specifies the file in which to store persistent cookies.\n"
+#| "The default is ~/.lynx_cookies.\n"
+msgid ""
+"cookie_file specifies the file from which to read persistent cookies.\n"
+"The default is ~/"
+msgstr ""
+"cookie_file doloèa datoteko, v kateri naj se hranijo obstojni pi¹koti.\n"
+"Privzeta je ~/.lynx_cookies.\n"
+
+#: src/LYrcFile.c:372
+msgid ""
+"cookie_loose_invalid_domains, cookie_strict_invalid_domains, and\n"
+"cookie_query_invalid_domains are comma-delimited lists of which domains\n"
+"should be subjected to varying degrees of validity checking. If a\n"
+"domain is set to strict checking, strict conformance to RFC2109 will\n"
+"be applied. A domain with loose checking will be allowed to set cookies\n"
+"with an invalid path or domain attribute. All domains will default to\n"
+"querying the user for an invalid path or domain.\n"
+msgstr ""
+
+#: src/LYrcFile.c:386
+msgid ""
+"dir_list_order specifies the directory list order under DIRED_SUPPORT\n"
+"(if implemented). The default is \"ORDER_BY_NAME\"\n"
+msgstr ""
+
+#: src/LYrcFile.c:391
+msgid ""
+"dir_list_styles specifies the directory list style under DIRED_SUPPORT\n"
+"(if implemented). The default is \"MIXED_STYLE\", which sorts both\n"
+"files and directories together. \"FILES_FIRST\" lists files first and\n"
+"\"DIRECTORIES_FIRST\" lists directories first.\n"
+msgstr ""
+
+#: src/LYrcFile.c:399
+msgid ""
+"If emacs_keys is to \"on\" then the normal EMACS movement keys:\n"
+" ^N = down ^P = up\n"
+" ^B = left ^F = right\n"
+"will be enabled.\n"
+msgstr ""
+
+#: src/LYrcFile.c:405
+msgid ""
+"file_editor specifies the editor to be invoked when editing local files\n"
+"or sending mail. If no editor is specified, then file editing is disabled\n"
+"unless it is activated from the command line, and the built-in line editor\n"
+"will be used for sending mail.\n"
+msgstr ""
+
+#: src/LYrcFile.c:412
+msgid ""
+"The file_sorting_method specifies which value to sort on when viewing\n"
+"file lists such as FTP directories. The options are:\n"
+" BY_FILENAME -- sorts on the name of the file\n"
+" BY_TYPE -- sorts on the type of the file\n"
+" BY_SIZE -- sorts on the size of the file\n"
+" BY_DATE -- sorts on the date of the file\n"
+msgstr ""
+
+#: src/LYrcFile.c:435
+msgid ""
+"lineedit_mode specifies the key binding used for inputting strings in\n"
+"prompts and forms. If lineedit_mode is set to \"Default Binding\" then\n"
+"the following control characters are used for moving and deleting:\n"
+"\n"
+" Prev Next Enter = Accept input\n"
+" Move char: <- -> ^G = Cancel input\n"
+" Move word: ^P ^N ^U = Erase line\n"
+" Delete char: ^H ^R ^A = Beginning of line\n"
+" Delete word: ^B ^F ^E = End of line\n"
+"\n"
+"Current lineedit modes are:\n"
+msgstr ""
+
+#: src/LYrcFile.c:453
+msgid ""
+"The following allow you to define sub-bookmark files and descriptions.\n"
+"The format is multi_bookmark<capital_letter>=<filename>,<description>\n"
+"Up to 26 bookmark files (for the English capital letters) are allowed.\n"
+"We start with \"multi_bookmarkB\" since 'A' is the default (see above).\n"
+msgstr ""
+
+#: src/LYrcFile.c:459
+msgid ""
+"personal_mail_address specifies your personal mail address. The\n"
+"address will be sent during HTTP file transfers for authorization and\n"
+"logging purposes, and for mailed comments.\n"
+"If you do not want this information given out, set the NO_FROM_HEADER\n"
+"to TRUE in lynx.cfg, or use the -nofrom command line switch. You also\n"
+"could leave this field blank, but then you won't have it included in\n"
+"your mailed comments.\n"
+msgstr ""
+
+#: src/LYrcFile.c:468
+msgid ""
+"personal_mail_name specifies your personal name, for mail. The\n"
+"name is sent for mailed comments. Lynx will prompt for this,\n"
+"showing the configured value as a default when sending mail.\n"
+"This is not necessarily the same as a name provided as part of the\n"
+"personal_mail_address.\n"
+"Lynx does not save your changes to that default value as a side-effect\n"
+"of sending email. To update the default value, you must use the options\n"
+"menu, or modify this file directly.\n"
+msgstr ""
+
+#: src/LYrcFile.c:478
+msgid ""
+"preferred_charset specifies the character set in MIME notation (e.g.,\n"
+"ISO-8859-2, ISO-8859-5) which Lynx will indicate you prefer in requests\n"
+"to http servers using an Accept-Charset header. The value should NOT\n"
+"include ISO-8859-1 or US-ASCII, since those values are always assumed\n"
+"by default. May be a comma-separated list.\n"
+"If a file in that character set is available, the server will send it.\n"
+"If no Accept-Charset header is present, the default is that any\n"
+"character set is acceptable. If an Accept-Charset header is present,\n"
+"and if the server cannot send a response which is acceptable\n"
+"according to the Accept-Charset header, then the server SHOULD send\n"
+"an error response, though the sending of an unacceptable response\n"
+"is also allowed.\n"
+msgstr ""
+
+#: src/LYrcFile.c:494
+msgid ""
+"preferred_language specifies the language in MIME notation (e.g., en,\n"
+"fr, may be a comma-separated list in decreasing preference)\n"
+"which Lynx will indicate you prefer in requests to http servers.\n"
+"If a file in that language is available, the server will send it.\n"
+"Otherwise, the server will send the file in its default language.\n"
+msgstr ""
+
+#: src/LYrcFile.c:505
+msgid ""
+"If run_all_execution_links is set \"on\" then all local execution links\n"
+"will be executed when they are selected.\n"
+"\n"
+"WARNING - This is potentially VERY dangerous. Since you may view\n"
+" information that is written by unknown and untrusted sources\n"
+" there exists the possibility that Trojan horse links could be\n"
+" written. Trojan horse links could be written to erase files\n"
+" or compromise security. This should only be set to \"on\" if\n"
+" you are viewing trusted source information.\n"
+msgstr ""
+"Èe je vrednost all_execution_links nastavljena na \"on\", se bodo\n"
+"izvedle vse lokalne povezave, èe bodo izbrane.\n"
+"\n"
+"POZOR - To je potencialno ZELO nevarno. Ker lahko pregledujete\n"
+" informacije iz neznanih in nezaupnih virov, je mogoèe, da so\n"
+" napisane tudi povezave do trojanskih konjev. Trojanski konji\n"
+" vam lahko pobri¹ejo datoteke ali ogrozijo varnost. To naj bi\n"
+" bilo nastavljeno na \"on\" le, èe pregledujete zaupen vir\n"
+" informacij.\n"
+
+#: src/LYrcFile.c:516
+msgid ""
+"If run_execution_links_on_local_files is set \"on\" then all local\n"
+"execution links that are found in LOCAL files will be executed when they\n"
+"are selected. This is different from run_all_execution_links in that\n"
+"only files that reside on the local system will have execution link\n"
+"permissions.\n"
+"\n"
+"WARNING - This is potentially dangerous. Since you may view\n"
+" information that is written by unknown and untrusted sources\n"
+" there exists the possibility that Trojan horse links could be\n"
+" written. Trojan horse links could be written to erase files\n"
+" or compromise security. This should only be set to \"on\" if\n"
+" you are viewing trusted source information.\n"
+msgstr ""
+"Èe je vrednost run_execution_links_on_local_files nastavljena na \"on\",\n"
+"e bodo izvedle vse lokalne povezave, ki so na¹tete v datotekah LOCAL,\n"
+"èe bodo izbrane. To se razlikuje od run_all_execution_links v tem, da\n"
+"bodo imele dovoljenje za izvajanje povezav le datoteke na lokalnem\n"
+"sistemu.\n"
+"\n"
+"POZOR - To je potencialno nevarno. Ker lahko pregledujete informacije\n"
+" iz neznanih in nezaupnih virov, je mogoèe, da so napisane tudi\n"
+" povezave do trojanskih konjev. Trojanski konji vam lahko\n"
+" pobri¹ejo datoteke ali ogrozijo varnost. To naj bi bilo\n"
+" nastavljeno na \"on\" le, èe pregledujete zaupen vir informacij.\n"
+
+#: src/LYrcFile.c:534
+msgid ""
+"select_popups specifies whether the OPTIONs in a SELECT block which\n"
+"lacks a MULTIPLE attribute are presented as a vertical list of radio\n"
+"buttons or via a popup menu. Note that if the MULTIPLE attribute is\n"
+"present in the SELECT start tag, Lynx always will create a vertical list\n"
+"of checkboxes for the OPTIONs. A value of \"on\" will set popup menus\n"
+"as the default while a value of \"off\" will set use of radio boxes.\n"
+"The default can be overridden via the -popup command line toggle.\n"
+msgstr ""
+
+#: src/LYrcFile.c:545
+msgid ""
+"show_color specifies how to set the color mode at startup. A value of\n"
+"\"never\" will force color mode off (treat the terminal as monochrome)\n"
+"at startup even if the terminal appears to be color capable. A value of\n"
+"\"always\" will force color mode on even if the terminal appears to be\n"
+"monochrome, if this is supported by the library used to build lynx.\n"
+"A value of \"default\" will yield the behavior of assuming\n"
+"a monochrome terminal unless color capability is inferred at startup\n"
+"based on the terminal type, or the -color command line switch is used, or\n"
+"the COLORTERM environment variable is set. The default behavior always is\n"
+"used in anonymous accounts or if the \"option_save\" restriction is set.\n"
+"The effect of the saved value can be overridden via\n"
+"the -color and -nocolor command line switches.\n"
+"The mode set at startup can be changed via the \"show color\" option in\n"
+"the 'o'ptions menu. If the option settings are saved, the \"on\" and\n"
+"\"off\" \"show color\" settings will be treated as \"default\".\n"
+msgstr ""
+
+#: src/LYrcFile.c:562
+msgid ""
+"show_cursor specifies whether to 'hide' the cursor to the right (and\n"
+"bottom, if possible) of the screen, or to place it to the left of the\n"
+"current link in documents, or current option in select popup windows.\n"
+"Positioning the cursor to the left of the current link or option is\n"
+"helpful for speech or braille interfaces, and when the terminal is\n"
+"one which does not distinguish the current link based on highlighting\n"
+"or color. A value of \"on\" will set positioning to the left as the\n"
+"default while a value of \"off\" will set 'hiding' of the cursor.\n"
+"The default can be overridden via the -show_cursor command line toggle.\n"
+msgstr ""
+
+#: src/LYrcFile.c:573
+msgid ""
+"show_dotfiles specifies that the directory listing should include\n"
+"\"hidden\" (dot) files/directories. If set \"on\", this will be\n"
+"honored only if enabled via userdefs.h and/or lynx.cfg, and not\n"
+"restricted via a command line switch. If display of hidden files\n"
+"is disabled, creation of such files via Lynx also is disabled.\n"
+msgstr ""
+
+#: src/LYrcFile.c:584
+msgid ""
+"If sub_bookmarks is not turned \"off\", and multiple bookmarks have\n"
+"been defined (see below), then all bookmark operations will first\n"
+"prompt the user to select an active sub-bookmark file. If the default\n"
+"Lynx bookmark_file is defined (see above), it will be used as the\n"
+"default selection. When this option is set to \"advanced\", and the\n"
+"user mode is advanced, the 'v'iew bookmark command will invoke a\n"
+"statusline prompt instead of the menu seen in novice and intermediate\n"
+"user modes. When this option is set to \"standard\", the menu will be\n"
+"presented regardless of user mode.\n"
+msgstr ""
+
+#: src/LYrcFile.c:598
+msgid ""
+"user_mode specifies the users level of knowledge with Lynx. The\n"
+"default is \"NOVICE\" which displays two extra lines of help at the\n"
+"bottom of the screen to aid the user in learning the basic Lynx\n"
+"commands. Set user_mode to \"INTERMEDIATE\" to turn off the extra info.\n"
+"Use \"ADVANCED\" to see the URL of the currently selected link at the\n"
+"bottom of the screen.\n"
+msgstr ""
+
+#: src/LYrcFile.c:607
+msgid ""
+"If verbose_images is \"on\", lynx will print the name of the image\n"
+"source file in place of [INLINE], [LINK] or [IMAGE]\n"
+"See also VERBOSE_IMAGES in lynx.cfg\n"
+msgstr ""
+
+#: src/LYrcFile.c:612
+msgid ""
+"If vi_keys is set to \"on\", then the normal VI movement keys:\n"
+" j = down k = up\n"
+" h = left l = right\n"
+"will be enabled. These keys are only lower case.\n"
+"Capital 'H', 'J' and 'K will still activate help, jump shortcuts,\n"
+"and the keymap display, respectively.\n"
+msgstr ""
+
+#: src/LYrcFile.c:620
+msgid ""
+"The visited_links setting controls how Lynx organizes the information\n"
+"in the Visited Links Page.\n"
+msgstr ""
+
+#: src/LYrcFile.c:845
+msgid ""
+"If keypad_mode is set to \"NUMBERS_AS_ARROWS\", then the numbers on\n"
+"your keypad when the numlock is on will act as arrow keys:\n"
+" 8 = Up Arrow\n"
+" 4 = Left Arrow 6 = Right Arrow\n"
+" 2 = Down Arrow\n"
+"and the corresponding keyboard numbers will act as arrow keys,\n"
+"regardless of whether numlock is on.\n"
+msgstr ""
+
+#: src/LYrcFile.c:854
+msgid ""
+"If keypad_mode is set to \"LINKS_ARE_NUMBERED\", then numbers will\n"
+"appear next to each link and numbers are used to select links.\n"
+msgstr ""
+
+#: src/LYrcFile.c:858
+msgid ""
+"If keypad_mode is set to \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\", then\n"
+"numbers will appear next to each link and visible form input field.\n"
+"Numbers are used to select links, or to move the \"current link\" to a\n"
+"form input field or button. In addition, options in popup menus are\n"
+"indexed so that the user may type an option number to select an option in\n"
+"a popup menu, even if the option isn't visible on the screen. Reference\n"
+"lists and output from the list command also enumerate form inputs.\n"
+msgstr ""
+
+#: src/LYrcFile.c:867
+msgid ""
+"NOTE: Some fixed format documents may look disfigured when\n"
+"\"LINKS_ARE_NUMBERED\" or \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\" are\n"
+"enabled.\n"
+msgstr ""
+
+#: src/LYrcFile.c:899
+msgid ""
+"Lynx User Defaults File\n"
+"\n"
+msgstr ""
+
+#: src/LYrcFile.c:908
+msgid ""
+"This file contains options saved from the Lynx Options Screen (normally\n"
+"with the 'o' key). To save options with that screen, you must select the\n"
+"checkbox:\n"
+msgstr ""
+
+#: src/LYrcFile.c:915
+msgid ""
+"You must then save the settings using the link on the line above the\n"
+"checkbox:\n"
+msgstr ""
+
+#: src/LYrcFile.c:922
+msgid ""
+"You may also use the command-line option \"-forms_options\", which displays\n"
+"the simpler Options Menu instead. Save options with that using the '>' key.\n"
+"\n"
+msgstr ""
+
+#: src/LYrcFile.c:929
+msgid ""
+"This file contains options saved from the Lynx Options Screen (normally\n"
+"with the '>' key).\n"
+"\n"
+msgstr ""
+
+#: src/LYrcFile.c:936
+msgid ""
+"There is normally no need to edit this file manually, since the defaults\n"
+"here can be controlled from the Options Screen, and the next time options\n"
+"are saved from the Options Screen this file will be completely rewritten.\n"
+"You have been warned...\n"
+"\n"
+"If you are looking for the general configuration file - it is normally\n"
+"called \"lynx.cfg\". It has different content and a different format.\n"
+"It is not this file.\n"
+msgstr ""
+
+#~ msgid "You are not allowed to goto \"file:\" URLs"
+#~ msgstr "Ni vam dovoljeno odpreti URL-jev \"file:\""
+
+#~ msgid "You are not allowed to goto \"finger:\" URLs"
+#~ msgstr "Ni vam dovoljeno odpreti URL-jev \"finger:\""
+
+#~ msgid "You are not allowed to goto \"ftp:\" URLs"
+#~ msgstr "Ni vam dovoljeno odpreti URL-jev \"ftp:\""
+
+#~ msgid "You are not allowed to goto \"gopher:\" URLs"
+#~ msgstr "Ni vam dovoljeno odpreti URL-jev \"gopher:\""
+
+#~ msgid "You are not allowed to goto \"http:\" URLs"
+#~ msgstr "Ni vam dovoljeno odpreti URL-jev \"http:\""
+
+#~ msgid "You are not allowed to goto \"https:\" URLs"
+#~ msgstr "Ni vam dovoljeno odpreti URL-jev \"https:\""
+
+#~ msgid "You are not allowed to goto \"lynxcgi:\" URLs"
+#~ msgstr "Ni vam dovoljeno odpreti URL-jev \"lynxcgi:\""
+
+#~ msgid "You are not allowed to goto \"lynxexec:\" URLs"
+#~ msgstr "Ni vam dovoljeno odpreti URL-jev \"lynxexec:\""
+
+#~ msgid "You are not allowed to goto \"lynxprog:\" URLs"
+#~ msgstr "Ni vam dovoljeno odpreti URL-jev \"lynxprog:\""
+
+#~ msgid "You are not allowed to goto \"mailto:\" URLs"
+#~ msgstr "Ni vam dovoljeno odpreti URL-jev \"mailto:\""
+
+#~ msgid "You are not allowed to goto \"news:\" URLs"
+#~ msgstr "Ni vam dovoljeno odpreti URL-jev \"news:\""
+
+#~ msgid "You are not allowed to goto \"nntp:\" URLs"
+#~ msgstr "Ni vam dovoljeno odpreti URL-jev \"nntp:\""
+
+#~ msgid "You are not allowed to goto \"rlogin:\" URLs"
+#~ msgstr "Ni vam dovoljeno odpreti URL-jev \"rlogin:\""
+
+#~ msgid "You are not allowed to goto \"snews:\" URLs"
+#~ msgstr "Ni vam dovoljeno odpreti URL-jev \"snews:\""
+
+#~ msgid "You are not allowed to goto \"telnet:\" URLs"
+#~ msgstr "Ni vam dovoljeno odpreti URL-jev \"telnet:\""
+
+#~ msgid "You are not allowed to goto \"tn3270:\" URLs"
+#~ msgstr "Ni vam dovoljeno odpreti URL-jev \"tn3270:\""
+
+#~ msgid "You are not allowed to goto \"wais:\" URLs"
+#~ msgstr "Ni vam dovoljeno odpreti URL-jev \"wais:\""
+
+#~ msgid "This special URL is not allowed as a goto!"
+#~ msgstr "Ne smemo skoèiti na ta posebni URL!"
+
+#~ msgid "Option choice (or page) number: "
+#~ msgstr "©tevilka izbire mo¾nosti (ali strani): "
+
+#~ msgid "Choice number %d already is current."
+#~ msgstr "Izbira ¹tevilka %d je ¾e zdaj trenutna."
+
+#~ msgid "You are already at the end of this choice list."
+#~ msgstr "®e zdaj smo na koncu tega seznama izbir."
+
+#~ msgid "You are already at the beginning of this choice list."
+#~ msgstr "®e zdaj smo na zaèetku tega seznama izbir."
+
+#~ msgid "You are already at page %d of this choice list."
+#~ msgstr "®e zdaj smo na strani %d tega seznama izbir."
+
+#~ msgid "You have entered an invalid choice number."
+#~ msgstr "Vnesli ste neveljavno ¹tevilko izbire."
+
+#~ msgid "Looking up %s."
+#~ msgstr "Preverjamo %s."
+
+#~ msgid "KB"
+#~ msgstr "KB"
+
+#~ msgid "(From Cookie Jar)"
+#~ msgstr "(Iz posode s pi¹koti)"
+
+#~ msgid "Lynx ver. %s"
+#~ msgstr "Lynx razl. %s"
diff --git a/po/sv.po b/po/sv.po
new file mode 100644
index 0000000..0a56dc9
--- /dev/null
+++ b/po/sv.po
@@ -0,0 +1,6590 @@
+# Swedish translation for Lynx
+# Copyright © 2000, 2001, 2002, 2003, 2004, 2008, 2015, 2021 Free Software Foundation, Inc.
+# This file is distributed under the same license as the lynx package.
+# Peter Krefting <peter@softwolves.pp.se>, 2000-2021.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: lynx 2.9.0-dev8\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-07-31 10:04-0400\n"
+"PO-Revision-Date: 2021-08-09 21:13+0100\n"
+"Last-Translator: Peter Krefting <peter@softwolves.pp.se>\n"
+"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Gtranslator 3.30.1\n"
+
+#. ******************************************************************
+#. * The following definitions are for status line prompts, messages, or
+#. * warnings issued by Lynx during program execution. You can modify
+#. * them to make them more appropriate for your site. We recommend that
+#. * you extend these definitions to other languages using the gettext
+#. * library. There are also scattered uses of 'gettext()' throughout the
+#. * Lynx source, covering all but those messages which (a) are used for
+#. * debugging (CTRACE) or (b) are constants used in interaction with
+#. * other programs.
+#. *
+#. * See ABOUT-NLS and po/readme for details and location of contributed
+#. * translations. When no translation is available, the English default is
+#. * used.
+#.
+#: LYMessages.c:28
+#, c-format
+msgid "Alert!: %s"
+msgstr "Varning!: %s"
+
+#: LYMessages.c:29
+msgid "Welcome"
+msgstr "Välkommen"
+
+#: LYMessages.c:30
+msgid "Are you sure you want to quit?"
+msgstr "Är du säker att du vill avsluta?"
+
+#: LYMessages.c:32
+msgid "Really exit from Lynx?"
+msgstr "Verkligen avsluta Lynx?"
+
+#: LYMessages.c:34
+msgid "Connection interrupted."
+msgstr "Anslutningen avbröts."
+
+#: LYMessages.c:35
+msgid "Data transfer interrupted."
+msgstr "Dataöverföringen avbröts."
+
+#: LYMessages.c:36
+msgid "Cancelled!!!"
+msgstr "Avbruten!!!"
+
+#: LYMessages.c:37
+msgid "Cancelling!"
+msgstr "Avbryter!"
+
+#: LYMessages.c:38
+msgid "Excellent!!!"
+msgstr "Underbart!!!"
+
+#: LYMessages.c:39
+msgid "OK"
+msgstr "OK"
+
+#: LYMessages.c:40
+msgid "Done!"
+msgstr "Klar!"
+
+#: LYMessages.c:41
+msgid "Bad request!"
+msgstr "Felaktig förfrågan!"
+
+#: LYMessages.c:42
+msgid "previous"
+msgstr "föregående"
+
+#: LYMessages.c:43
+msgid "next screen"
+msgstr "nästa skärm"
+
+#: LYMessages.c:44
+msgid "HELP!"
+msgstr "HJÄLP!"
+
+#: LYMessages.c:45
+msgid ", help on "
+msgstr ", hjälp om "
+
+#. #define HELP
+#: LYMessages.c:47
+msgid "Commands: Use arrow keys to move, '?' for help, 'q' to quit, '<-' to go back."
+msgstr "Kommandon: Piltangenter flyttar, \"?\" ger hjälp, \"q\" avslutar, \"<-\" återgår."
+
+#. #define MOREHELP
+#: LYMessages.c:49
+msgid "-- press space for more, use arrow keys to move, '?' for help, 'q' to quit."
+msgstr "-- tryck blanksteg för mer, piltangenter flyttar, \"?\" ger hjälp, \"q\" avslutar."
+
+#: LYMessages.c:50
+msgid "-- press space for next page --"
+msgstr "-- tryck blanksteg för nästa sida --"
+
+#: LYMessages.c:51
+msgid "URL too long"
+msgstr "Adressen för lång"
+
+#. Inactive input fields, messages used with -tna option - kw
+#. #define FORM_LINK_TEXT_ADV_MSG_INA
+#: LYMessages.c:57
+#, c-format
+msgid "(Textfield \"%s\"); Inactive. Press <return> to activate."
+msgstr "(Textfält \"%s\"); Inaktivt. Tryck <Enter> för att aktivera."
+
+#. #define FORM_LINK_TEXT_MESSAGE_INA
+#: LYMessages.c:59
+msgid "(Text entry field) Inactive. Press <return> to activate."
+msgstr "(Textinmatningsfält) Inaktivt. Tryck <Enter> för att aktivera."
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG_INA
+#: LYMessages.c:61
+#, c-format
+msgid "(Textarea \"%s\"); Inactive. Press <return> to activate."
+msgstr "(Textruta \"%s\"); Inaktivt. Tryck <Enter> för att aktivera."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_INA
+#: LYMessages.c:63
+msgid "(Textarea) Inactive. Press <return> to activate."
+msgstr "(Textruta) Inaktivt. Tryck <Enter> för att aktivera."
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG_INA_E
+#: LYMessages.c:65
+#, c-format
+msgid "(Textarea \"%s\"); Inactive. Press <return> to activate (%s for editor)."
+msgstr "(Textruta \"%s\"); Inaktivt. Tryck <Enter> för att aktivera (%s för redigeringsprogram)."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_INA_E
+#: LYMessages.c:67
+#, c-format
+msgid "(Textarea) Inactive. Press <return> to activate (%s for editor)."
+msgstr "(Textruta) Inaktivt. Tryck <Enter> för att aktivera (%s för redigeringsprogram)."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE_INA
+#: LYMessages.c:69
+msgid "(Form field) Inactive. Use <return> to edit."
+msgstr "(Formulärfält) Inaktivt. Tryck <Enter> för att redigera."
+
+#. #define FORM_TEXT_SUBMIT_MESSAGE_INA_X
+#: LYMessages.c:71
+#, c-format
+msgid "(Form field) Inactive. Use <return> to edit (%s to submit with no cache)."
+msgstr "(Formulärfält) Inaktivt. Tryck <Enter> för att redigera (%s skickar utan cache)."
+
+#. #define FORM_TEXT_RESUBMIT_MESSAGE_INA
+#: LYMessages.c:73
+msgid "(Form field) Inactive. Press <return> to edit, press <return> twice to submit."
+msgstr "(Formulärfält) Inaktivt. Redigera med <Enter>, två gånger för att skicka."
+
+#. #define FORM_TEXT_SUBMIT_MAILTO_MSG_INA
+#: LYMessages.c:75
+msgid "(mailto form field) Inactive. Press <return> to change."
+msgstr "(e-postformulärfält) Inaktivt. Tryck <Enter> för att ändra."
+
+#. #define FORM_LINK_PASSWORD_MESSAGE_INA
+#: LYMessages.c:77
+msgid "(Password entry field) Inactive. Press <return> to activate."
+msgstr "(Lösenordsinmatningsfält) Inaktivt. Tryck <Enter> för att aktivera."
+
+#. #define FORM_LINK_FILE_UNM_MSG
+#: LYMessages.c:80
+msgid "UNMODIFIABLE file entry field. Use UP or DOWN arrows or tab to move off."
+msgstr "SKRIVSKYDDAT filinmatningsfält. Använd UPP-/NED-pil eller tabb för att lämna."
+
+#. #define FORM_LINK_FILE_MESSAGE
+#: LYMessages.c:82
+msgid "(File entry field) Enter filename. Use UP or DOWN arrows or tab to move off."
+msgstr "(Filinmatningsfält) Ange filnamn. Använd UPP-/NED-pil eller tabb för att lämna."
+
+#. #define FORM_LINK_TEXT_ADV_MSG
+#. #define FORM_LINK_TEXT_MESSAGE
+#: LYMessages.c:84 LYMessages.c:86
+#, c-format
+msgid "(Textfield \"%s\"); Enter text. Use UP or DOWN arrows or tab to move off."
+msgstr "(Textfält \"%s\"); Ange text. Använd UPP-/NED-pil eller tabb för att lämna."
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG
+#: LYMessages.c:88
+#, c-format
+msgid "(Textarea \"%s\"); Enter text. Use UP/DOWN arrows or TAB to move off."
+msgstr "(Textruta \"%s\"); Ange text. Använd UPP-/NED-pil eller tabb för att lämna."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE
+#: LYMessages.c:90
+msgid "(Textarea) Enter text. Use UP/DOWN arrows or TAB to move off."
+msgstr "(Textruta) Ange text. Använd UPP-/NED-pil eller tabb för att lämna."
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG_E
+#: LYMessages.c:92
+#, c-format
+msgid "(Textarea \"%s\"); Enter text. Use UP/DOWN arrows or TAB to move off (%s for editor)."
+msgstr "(Textruta \"%s\"); Ange text. UPP-/NED-pil eller tabb lämnar (%s för redigeringsprogram)."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_E
+#: LYMessages.c:94
+#, c-format
+msgid "(Textarea) Enter text. Use UP/DOWN arrows or TAB to move off (%s for editor)."
+msgstr "(Textruta) Ange text. UPP-/NED-pil eller tabb lämnar (%s för redigeringsprogram)."
+
+#. #define FORM_LINK_TEXT_UNM_MSG
+#: LYMessages.c:96
+msgid "UNMODIFIABLE form text field. Use UP or DOWN arrows or tab to move off."
+msgstr "SKRIVSKYDDAT formulärtextfält. Använd UPP-/NED-pil eller tabb för att lämna."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE
+#: LYMessages.c:98
+msgid "(Form field) Enter text. Use <return> to submit."
+msgstr "(Formulärfält) Ange text. Tryck <Enter> för att skicka."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE_X
+#: LYMessages.c:100
+#, c-format
+msgid "(Form field) Enter text. Use <return> to submit (%s for no cache)."
+msgstr "(Formulärfält) Ange text. Tryck <Enter> för att skicka (%s förbigår cache)."
+
+#. #define FORM_LINK_TEXT_RESUBMIT_MESSAGE
+#: LYMessages.c:102
+msgid "(Form field) Enter text. Use <return> to submit, arrows or tab to move off."
+msgstr "(Formulärfält) Ange text. <Enter> skickar, pilar eller tabb lämnar."
+
+#. #define FORM_LINK_TEXT_SUBMIT_UNM_MSG
+#: LYMessages.c:104
+msgid "UNMODIFIABLE form field. Use UP or DOWN arrows or tab to move off."
+msgstr "SKRIVSKYDDAT formulärfält. Använd UPP-/NED-pil eller tabb för att lämna."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MAILTO_MSG
+#: LYMessages.c:106
+msgid "(mailto form field) Enter text. Use <return> to submit, arrows to move off."
+msgstr "(e-postformulärfält) Ange text. <Enter> skickar, pilar lämnar."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MAILTO_DIS_MSG
+#: LYMessages.c:108
+msgid "(mailto form field) Mail is disallowed so you cannot submit."
+msgstr "(e-postformulärfält) E-post tillåts ej, så du kan inte skicka."
+
+#. #define FORM_LINK_PASSWORD_MESSAGE
+#: LYMessages.c:110
+msgid "(Password entry field) Enter text. Use UP or DOWN arrows or tab to move off."
+msgstr "(Lösenordsfält) Ange text. Använd UPP-/NED-pil eller tabb för att lämna."
+
+#. #define FORM_LINK_PASSWORD_UNM_MSG
+#: LYMessages.c:112
+msgid "UNMODIFIABLE form password. Use UP or DOWN arrows or tab to move off."
+msgstr "SKRIVSKYDDAT formulärlösenord. Använd UPP-/NED-pil eller tabb för att lämna."
+
+#. #define FORM_LINK_CHECKBOX_ADV_MSG
+#: LYMessages.c:114
+#, c-format
+msgid "(Checkbox \"%s\"); Use right-arrow or <return> to toggle."
+msgstr "(Kryssruta \"%s\"); Använd högerpil eller <Enter> för att ställa om."
+
+#. #define FORM_LINK_CHECKBOX_MESSAGE
+#: LYMessages.c:116
+msgid "(Checkbox Field) Use right-arrow or <return> to toggle."
+msgstr "(Kryssruta) Använd högerpil eller <Enter> för att ställa om."
+
+#. #define FORM_LINK_CHECKBOX_UNM_MSG
+#: LYMessages.c:118
+msgid "UNMODIFIABLE form checkbox. Use UP or DOWN arrows or tab to move off."
+msgstr "SKRIVSKYDDAD kryssruta. Använd UPP-/NED-pil eller tabb för att lämna."
+
+#. #define FORM_LINK_RADIO_ADV_MSG
+#: LYMessages.c:120
+#, c-format
+msgid "(Radio Button \"%s\"); Use right-arrow or <return> to toggle."
+msgstr "(Radioknapp \"%s\"); Använd högerpil eller <Enter> för att ställa om."
+
+#. #define FORM_LINK_RADIO_MESSAGE
+#: LYMessages.c:122
+msgid "(Radio Button) Use right-arrow or <return> to toggle."
+msgstr "(Radioknapp) Använd högerpil eller <Enter> för att ställa om."
+
+#. #define FORM_LINK_RADIO_UNM_MSG
+#: LYMessages.c:124
+msgid "UNMODIFIABLE form radio button. Use UP or DOWN arrows or tab to move off."
+msgstr "SKRIVSKYDDAD radioknapp. Använd UPP-/NED-pil eller tabb för att lämna."
+
+#. #define FORM_LINK_SUBMIT_PREFIX
+#: LYMessages.c:126
+msgid "Submit ('x' for no cache) to "
+msgstr "Skicka (\"x\" förbigår cache) till "
+
+#. #define FORM_LINK_RESUBMIT_PREFIX
+#: LYMessages.c:128
+msgid "Submit to "
+msgstr "Skicka till "
+
+#. #define FORM_LINK_SUBMIT_MESSAGE
+#: LYMessages.c:130
+msgid "(Form submit button) Use right-arrow or <return> to submit ('x' for no cache)."
+msgstr "(Sändknapp) Använd högerpil eller <Enter> för att skicka (\"x\" förbigår cache)."
+
+#. #define FORM_LINK_RESUBMIT_MESSAGE
+#: LYMessages.c:132
+msgid "(Form submit button) Use right-arrow or <return> to submit."
+msgstr "(Sändknapp) Använd högerpil eller <Enter> för att skicka."
+
+#. #define FORM_LINK_SUBMIT_DIS_MSG
+#: LYMessages.c:134
+msgid "DISABLED form submit button. Use UP or DOWN arrows or tab to move off."
+msgstr "INAKTIV sändknapp. Använd UPP-/NED-pil eller tabb för att lämna."
+
+#. #define FORM_LINK_SUBMIT_MAILTO_PREFIX
+#: LYMessages.c:136
+msgid "Submit mailto form to "
+msgstr "Skicka e-postformulär till "
+
+#. #define FORM_LINK_SUBMIT_MAILTO_MSG
+#: LYMessages.c:138
+msgid "(mailto form submit button) Use right-arrow or <return> to submit."
+msgstr "(sändknapp i e-postformulär) Använd högerpil eller <Enter> för att skicka."
+
+#. #define FORM_LINK_SUBMIT_MAILTO_DIS_MSG
+#: LYMessages.c:140
+msgid "(mailto form submit button) Mail is disallowed so you cannot submit."
+msgstr "(sändknapp i e-postformulär) E-post tillåts ej, så du kan inte skicka."
+
+#. #define FORM_LINK_RESET_MESSAGE
+#: LYMessages.c:142
+msgid "(Form reset button) Use right-arrow or <return> to reset form to defaults."
+msgstr "(Nollställningsknapp) Använd högerpil eller <Enter> för att återställa förval."
+
+#. #define FORM_LINK_RESET_DIS_MSG
+#: LYMessages.c:144
+msgid "DISABLED form reset button. Use UP or DOWN arrows or tab to move off."
+msgstr "INAKTIV nollställningsknapp. Använd UPP-/NED-pil eller tabb för att lämna."
+
+#. #define FORM_LINK_BUTTON_MESSAGE
+#: LYMessages.c:146
+msgid "(Script button) Use UP or DOWN arrows or tab to move off."
+msgstr "(Skriptknapp) Använd UPP-/NED-pil eller tabb för att lämna."
+
+#. #define FORM_LINK_BUTTON_ADV_MSG
+#: LYMessages.c:148
+#, c-format
+msgid "(Script button \"%s\"); Use UP or DOWN arrows or tab to move off."
+msgstr "(Skriptknapp \"%s\"); Använd UPP-/NED-pil eller tabb för att lämna."
+
+#. #define FORM_LINK_BUTTON_DIS_MSG
+#: LYMessages.c:150
+msgid "DISABLED Script button. Use UP or DOWN arrows or tab to move off."
+msgstr "INAKTIV skriptknapp. Använd UPP-/NED-pil eller tabb för att lämna."
+
+#. #define FORM_LINK_OPTION_LIST_ADV_MSG
+#: LYMessages.c:152
+#, c-format
+msgid "(Option list \"%s\"); Hit return to select option."
+msgstr "(Alternativlista \"%s\"); Tryck Enter och använd pilar och Enter för att välja."
+
+#. #define FORM_LINK_OPTION_LIST_MESSAGE
+#: LYMessages.c:154
+msgid "(Option list) Hit return and use arrow keys and return to select option."
+msgstr "(Alternativlista) Tryck Enter och använd pilar och Enter för att välja."
+
+#. #define CHOICE_LIST_ADV_MSG
+#: LYMessages.c:156
+#, c-format
+msgid "(Choice entry \"%s\"); Use arrow keys and return to select option."
+msgstr "(Valpost \"%s\"); Använd piltangenter och Enter för att välja."
+
+#. #define CHOICE_LIST_MESSAGE
+#: LYMessages.c:158
+msgid "(Choice list) Hit return and use arrow keys and return to select option."
+msgstr "(Vallista) Tryck Enter och använd piltangenter och Enter för att välja."
+
+#. #define MOUSE_CHOICE_MESSAGE
+#: LYMessages.c:160
+msgid "Left mouse button or return to select, arrow keys to scroll."
+msgstr "Vänster musknapp eller Enter väljer, piltangenter rullar."
+
+#. #define FORM_LINK_OPTION_LIST_UNM_MSG
+#: LYMessages.c:162
+msgid "UNMODIFIABLE option list. Use return or arrow keys to review or leave."
+msgstr "SKRIVSKYDDAD alternativlista. Använd Enter och pilar för att visa eller lämna."
+
+#. #define CHOICE_LIST_UNM_MSG
+#: LYMessages.c:164
+msgid "UNMODIFIABLE choice list. Use return or arrow keys to review or leave."
+msgstr "SKRIVSKYDDAD vallista. Använd Enter och piltangenter för att visa eller lämna."
+
+#: LYMessages.c:165
+msgid "Submitting form..."
+msgstr "Skickar formulär..."
+
+#: LYMessages.c:166
+msgid "Resetting form..."
+msgstr "Nollställer formulär..."
+
+#. #define RELOADING_FORM
+#: LYMessages.c:168
+msgid "Reloading document. Any form entries will be lost!"
+msgstr "Hämtar om dokument. Eventuellt formulärinnehåll förkastas!"
+
+#. #define LINK_NOT_IN_FORM
+#: LYMessages.c:170
+msgid "The current link is not in a FORM"
+msgstr "Aktuell länk är inte i ett FORMULÄR"
+
+#: LYMessages.c:171
+#, c-format
+msgid "Warning: Cannot transcode form data to charset %s!"
+msgstr "Varning: Kan inte koda formulärdata i teckenuppsättningen %s!"
+
+#. #define NORMAL_LINK_MESSAGE
+#: LYMessages.c:174
+msgid "(NORMAL LINK) Use right-arrow or <return> to activate."
+msgstr "(VANLIG LÄNK) Använd högerpil eller <Enter> för att aktivera."
+
+#: LYMessages.c:175
+msgid "The resource requested is not available at this time."
+msgstr "Resursen du begärt är inte tillgänglig just nu."
+
+#: LYMessages.c:176
+msgid "Enter Lynx keystroke command: "
+msgstr "Ange Lynxtangentkommando: "
+
+#: LYMessages.c:177
+msgid "Looking up "
+msgstr "Slår upp "
+
+#: LYMessages.c:178
+#, c-format
+msgid "Getting %s"
+msgstr "Hämtar %s"
+
+#: LYMessages.c:179
+#, c-format
+msgid "Skipping %s"
+msgstr "Hoppas över %s"
+
+#: LYMessages.c:180
+#, c-format
+msgid "Using %s"
+msgstr "Använder %s"
+
+#: LYMessages.c:181
+#, c-format
+msgid "Illegal URL: %s"
+msgstr "Felaktig adress: %s"
+
+#: LYMessages.c:182
+#, c-format
+msgid "Badly formed address %s"
+msgstr "Trasig adress %s"
+
+#: LYMessages.c:183
+#, c-format
+msgid "URL: %s"
+msgstr "Adress: %s"
+
+#: LYMessages.c:184
+msgid "Unable to access WWW file!!!"
+msgstr "Kan inte komma åt webbfil!!!"
+
+#: LYMessages.c:185
+#, c-format
+msgid "This is a searchable index. Use %s to search."
+msgstr "Detta är ett sökbart index. Använd %s för att söka."
+
+#. #define WWW_INDEX_MORE_MESSAGE
+#: LYMessages.c:187
+#, c-format
+msgid "--More-- This is a searchable index. Use %s to search."
+msgstr "--Mer-- Detta är ett sökbart index. Använd %s för att söka."
+
+#: LYMessages.c:188
+msgid "You have entered an invalid link number."
+msgstr "Du har angett ett felaktigt länknummer."
+
+#. #define SOURCE_HELP
+#: LYMessages.c:190
+msgid "Currently viewing document source. Press '\\' to return to rendered version."
+msgstr "Visar dokumentkällkod. Tryck \"\\\" för att återgå till tolkad version."
+
+#. #define NOVICE_LINE_ONE
+#: LYMessages.c:192
+msgid " Arrow keys: Up and Down to move. Right to follow a link; Left to go back. \n"
+msgstr " Piltangenter: Upp och ned flyttar. Höger följer länk; vänster återgår. \n"
+
+#. #define NOVICE_LINE_TWO
+#: LYMessages.c:194
+msgid " H)elp O)ptions P)rint G)o M)ain screen Q)uit /=search [delete]=history list \n"
+msgstr " H=Hjälp O=Val P=Utskrift G=Gå M=Huvudskärm Q=Avsluta /=sök Del=Historik \n"
+
+#. #define NOVICE_LINE_TWO_A
+#: LYMessages.c:196
+msgid " O)ther cmds H)elp K)eymap G)oto P)rint M)ain screen o)ptions Q)uit \n"
+msgstr " O=Fler H=Hjälp K=Tangenter G=Gå P=Utskrift M=Huvudskärm O=Val Q=Avsluta \n"
+
+#. #define NOVICE_LINE_TWO_B
+#: LYMessages.c:198
+msgid " O)ther cmds B)ack E)dit D)ownload ^R)eload ^W)ipe screen search doc: / \n"
+msgstr " O=Fler B=Bakåt E=Redigera D=Hämta ^R=Hämta om ^W=Rita om sök dokument: / \n"
+
+#. #define NOVICE_LINE_TWO_C
+#: LYMessages.c:200
+msgid "O)ther cmds C)omment History: <backspace> Bookmarks: V)iew, A)dd, R)emove \n"
+msgstr "O=Fler C=Kommentera Historik: backsteg Bokmärken: V=Visa A=Nytt R=Ta bort \n"
+
+#. #define FORM_NOVICELINE_ONE
+#: LYMessages.c:202
+msgid " Enter text into the field by typing on the keyboard "
+msgstr " Ange text i fältet genom att skriva på tangentbordet "
+
+#. #define FORM_NOVICELINE_TWO
+#: LYMessages.c:204
+msgid " Ctrl-U to delete all text in field, [Backspace] to delete a character "
+msgstr " Ctrl-U tömmer inmatningsfältet, [Backsteg] tar bort en bokstav "
+
+#. #define FORM_NOVICELINE_TWO_DELBL
+#: LYMessages.c:206
+msgid " Ctrl-U to delete text in field, [Backspace] to delete a character "
+msgstr " Ctrl-U tömmer inmatningsfältet, [Backsteg] tar bort en bokstav "
+
+#. #define FORM_NOVICELINE_TWO_VAR
+#: LYMessages.c:208
+#, c-format
+msgid " %s to delete all text in field, [Backspace] to delete a character "
+msgstr " %s tömmer inmatningsfältet, [Backsteg] tar bort en bokstav "
+
+#. #define FORM_NOVICELINE_TWO_DELBL_VAR
+#: LYMessages.c:210
+#, c-format
+msgid " %s to delete text in field, [Backspace] to delete a character "
+msgstr " %s tömmer inmatningsfältet, [Backsteg] tar bort en bokstav "
+
+#. mailto
+#: LYMessages.c:213
+msgid "Malformed mailto form submission! Cancelled!"
+msgstr "Trasig \"mailto\" i formulär! Avbryter!"
+
+#: LYMessages.c:214
+msgid "Warning! Control codes in mail address replaced by ?"
+msgstr "Varning! Kontrollkoder i e-postadress ersatta med frågetecken"
+
+#: LYMessages.c:215
+msgid "Mail disallowed! Cannot submit."
+msgstr "E-post tillåts ej! Kan inte skicka."
+
+#: LYMessages.c:216
+msgid "Mailto form submission failed!"
+msgstr "Misslyckades att skicka e-postformulär!"
+
+#: LYMessages.c:217
+msgid "Mailto form submission Cancelled!!!"
+msgstr "Insändning av e-postformulär avbruten!!!"
+
+#: LYMessages.c:218
+msgid "Sending form content..."
+msgstr "Skickar formulärdata..."
+
+#: LYMessages.c:219
+msgid "No email address is present in mailto URL!"
+msgstr "Ingen e-postadress i \"mailto\"-fältet!"
+
+#. #define MAILTO_URL_TEMPOPEN_FAILED
+#: LYMessages.c:221
+msgid "Unable to open temporary file for mailto URL!"
+msgstr "Kan inte öppna temporärfil för \"mailto\"-adress!"
+
+#. #define INC_ORIG_MSG_PROMPT
+#: LYMessages.c:223
+msgid "Do you wish to include the original message?"
+msgstr "Vill du inkludera originalmeddelandet?"
+
+#. #define INC_PREPARSED_MSG_PROMPT
+#: LYMessages.c:225
+msgid "Do you wish to include the preparsed source?"
+msgstr "Vill du inkludera den färdigtolkade källkoden?"
+
+#. #define SPAWNING_EDITOR_FOR_MAIL
+#: LYMessages.c:227
+msgid "Spawning your selected editor to edit mail message"
+msgstr "Startar ditt valda textredigeringsprogram för att skriva brevet"
+
+#. #define ERROR_SPAWNING_EDITOR
+#: LYMessages.c:229
+msgid "Error spawning editor, check your editor definition in the options menu"
+msgstr "Fel vid start av textredigeringsprogram, se inställningar i valmenyn"
+
+#: LYMessages.c:230
+msgid "Send this comment?"
+msgstr "Skicka denna kommentar?"
+
+#: LYMessages.c:231
+msgid "Send this message?"
+msgstr "Skicka detta meddelande?"
+
+#: LYMessages.c:232
+msgid "Sending your message..."
+msgstr "Skickar ditt meddelande..."
+
+#: LYMessages.c:233
+msgid "Sending your comment:"
+msgstr "Skickar din kommentar:"
+
+#. textarea
+#: LYMessages.c:236
+msgid "Not in a TEXTAREA; cannot use external editor."
+msgstr "Inte i en TEXTAREA; kan inte använda externt redigeringsprogram."
+
+#: LYMessages.c:237
+msgid "Not in a TEXTAREA; cannot use command."
+msgstr "Inte i en TEXTAREA; kan inte använda kommando."
+
+#: LYMessages.c:239
+msgid "file: ACTIONs are disallowed!"
+msgstr "file:-formulärmål tillåts inte!"
+
+#. #define FILE_SERVED_LINKS_DISALLOWED
+#: LYMessages.c:241
+msgid "file: URLs via served links are disallowed!"
+msgstr "file:-adresser i givna adresser tillåts ej!"
+
+#: LYMessages.c:242
+msgid "Access to local files denied."
+msgstr "Ã…tkomst till lokala filer nekas."
+
+#: LYMessages.c:243
+msgid "file: URLs via bookmarks are disallowed!"
+msgstr "file:-adresser i bokmärken tillåts ej!"
+
+#. #define SPECIAL_VIA_EXTERNAL_DISALLOWED
+#: LYMessages.c:245
+msgid "This special URL is not allowed in external documents!"
+msgstr "Denna specialadress tillåts ej i externa dokument!"
+
+#: LYMessages.c:246
+msgid "Press <return> to return to Lynx."
+msgstr "Tryck <Enter> för att återgå till Lynx."
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:249
+msgid "Spawning DCL subprocess. Use 'logout' to return to Lynx.\n"
+msgstr "Startar DCL-underprocess. Använd \"logout\" för att återgå till Lynx.\n"
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:253
+msgid "Type EXIT to return to Lynx.\n"
+msgstr "Skriv EXIT för att återgå till Lynx.\n"
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:256
+msgid "Spawning your default shell. Use 'exit' to return to Lynx.\n"
+msgstr "Startar ditt valda skal. Skriv \"exit\" för att återgå till Lynx.\n"
+
+#: LYMessages.c:259
+msgid "Spawning is currently disabled."
+msgstr "Start av externa program tillåts ej just nu."
+
+#: LYMessages.c:260
+msgid "The 'd'ownload command is currently disabled."
+msgstr "Hämtningskommandot (\"d\") tillåts ej just nu."
+
+#: LYMessages.c:261
+msgid "You cannot download an input field."
+msgstr "Du kan inte hämta ett indatafält."
+
+#: LYMessages.c:262
+msgid "Form has a mailto action! Cannot download."
+msgstr "Detta är ett e-postformulär! Kan inte hämta."
+
+#: LYMessages.c:263
+msgid "You cannot download a mailto: link."
+msgstr "Du kan inte hämta en mailto:-länk."
+
+#: LYMessages.c:264
+msgid "You cannot download cookies."
+msgstr "Du kan inte hämta kakor."
+
+#: LYMessages.c:265
+msgid "You cannot download a printing option."
+msgstr "Du kan inte hämta ett utskriftsval."
+
+#: LYMessages.c:266
+msgid "You cannot download an upload option."
+msgstr "Du kan inte hämta ett sändningsalternativ."
+
+#: LYMessages.c:267
+msgid "You cannot download an permit option."
+msgstr "Du kan inte hämta en inställning."
+
+#: LYMessages.c:268
+msgid "This special URL cannot be downloaded!"
+msgstr "Denna specialadress kan inte hämtas!"
+
+#: LYMessages.c:269
+msgid "Nothing to download."
+msgstr "Inget att hämta."
+
+#: LYMessages.c:270
+msgid "Trace ON!"
+msgstr "Spårning AKTIV!"
+
+#: LYMessages.c:271
+msgid "Trace OFF!"
+msgstr "Spårning INAKTIV!"
+
+#. #define CLICKABLE_IMAGES_ON
+#: LYMessages.c:273
+msgid "Links will be included for all images! Reloading..."
+msgstr "Länkar skapas för alla bilder! Hämtar om..."
+
+#. #define CLICKABLE_IMAGES_OFF
+#: LYMessages.c:275
+msgid "Standard image handling restored! Reloading..."
+msgstr "Normal bildhantering återställd! Hämtar om..."
+
+#. #define PSEUDO_INLINE_ALTS_ON
+#: LYMessages.c:277
+msgid "Pseudo_ALTs will be inserted for inlines without ALT strings! Reloading..."
+msgstr "\"Pseudo-ALT\" sätts in för bilder som saknar ALT-strängar! Hämtar om..."
+
+#. #define PSEUDO_INLINE_ALTS_OFF
+#: LYMessages.c:279
+msgid "Inlines without an ALT string specified will be ignored! Reloading..."
+msgstr "Bilder utan ALT-strängar ignoreras! Hämtar om..."
+
+#: LYMessages.c:280
+msgid "Raw 8-bit or CJK mode toggled OFF! Reloading..."
+msgstr "Rått 8-bitars- eller CJK-läge AV! Hämtar om..."
+
+#: LYMessages.c:281
+msgid "Raw 8-bit or CJK mode toggled ON! Reloading..."
+msgstr "Rått 8-bitars- eller CJK-läge PÅ! Hämtar om..."
+
+#. #define HEAD_D_L_OR_CANCEL
+#: LYMessages.c:283
+msgid "Send HEAD request for D)ocument or L)ink, or C)ancel? (d,l,c): "
+msgstr "Sänd \"HEAD\" för D=dokument eller L=länk; C=Avbryt? (d,l,c): "
+
+#. #define HEAD_D_OR_CANCEL
+#: LYMessages.c:285
+msgid "Send HEAD request for D)ocument, or C)ancel? (d,c): "
+msgstr "Sänd \"HEAD\" för D=dokument; C=Avbryt? (d,c): "
+
+#: LYMessages.c:286
+msgid "Sorry, the document is not an http URL."
+msgstr "Tyvärr, dokumentet har inte en http-adress."
+
+#: LYMessages.c:287
+msgid "Sorry, the link is not an http URL."
+msgstr "Tyvärr, länken har inte en http-adress."
+
+#: LYMessages.c:288
+msgid "Sorry, the ACTION for this form is disabled."
+msgstr "Tyvärr, formulärmålet detta formulär är avstängt."
+
+#. #define FORM_ACTION_NOT_HTTP_URL
+#: LYMessages.c:290
+msgid "Sorry, the ACTION for this form is not an http URL."
+msgstr "Tyvärr, formulärmålet för detta formulär är inte en http-adress."
+
+#: LYMessages.c:291
+msgid "Not an http URL or form ACTION!"
+msgstr "Inte en http-adress eller formulärmål!"
+
+#: LYMessages.c:292
+msgid "This special URL cannot be a form ACTION!"
+msgstr "Denna speciella adress kan inte vara formulärmål!"
+
+#: LYMessages.c:293
+msgid "URL is not in starting realm!"
+msgstr "Adressen är inte i startmängden!"
+
+#: LYMessages.c:294
+msgid "News posting is disabled!"
+msgstr "Postning av artiklar deaktiverad!"
+
+#: LYMessages.c:295
+msgid "File management support is disabled!"
+msgstr "Filhanteringsstödet är deaktiverat!"
+
+#: LYMessages.c:296
+msgid "No jump file is currently available."
+msgstr "Ingen hoppfil finns just nu att tillgå."
+
+#: LYMessages.c:297
+msgid "Jump to (use '?' for list): "
+msgstr "Hoppa till (\"?\"=lista): "
+
+#: LYMessages.c:298
+msgid "Jumping to a shortcut URL is disallowed!"
+msgstr "Hopp till genvägsadress ej tillåtet!"
+
+#: LYMessages.c:299
+msgid "Random URL is disallowed! Use a shortcut."
+msgstr "Slumpmässig adress ej tillåten! Använd en genväg."
+
+#: LYMessages.c:300
+msgid "No random URLs have been used thus far."
+msgstr "Inga slumpmässiga adresser har ännu används."
+
+#: LYMessages.c:301
+msgid "Bookmark features are currently disabled."
+msgstr "Bokmärkesfunktionerna är just nu deaktiverade."
+
+#: LYMessages.c:302
+msgid "Execution via bookmarks is disabled."
+msgstr "Programkörning via bokmärken är deaktiverat."
+
+#. #define BOOKMARK_FILE_NOT_DEFINED
+#: LYMessages.c:304
+#, c-format
+msgid "Bookmark file is not defined. Use %s to see options."
+msgstr "Bokmärkesfil ej definierad. Använd %s för att se alternativ."
+
+#. #define NO_TEMP_FOR_HOTLIST
+#: LYMessages.c:306
+msgid "Unable to open tempfile for X Mosaic hotlist conversion."
+msgstr "Kan inte öppna temporärfil för konvertering av X Mosaics bokmärken."
+
+#: LYMessages.c:307
+msgid "ERROR - unable to open bookmark file."
+msgstr "FEL - kan inte öppna bokmärkesfil."
+
+#. #define BOOKMARK_OPEN_FAILED_FOR_DEL
+#: LYMessages.c:309
+msgid "Unable to open bookmark file for deletion of link."
+msgstr "Kan inte öppna bokmärkesfil för borttagning av länk."
+
+#. #define BOOKSCRA_OPEN_FAILED_FOR_DEL
+#: LYMessages.c:311
+msgid "Unable to open scratch file for deletion of link."
+msgstr "Kan inte öppna skräpfil för borttagning av länk."
+
+#: LYMessages.c:313
+msgid "Error renaming scratch file."
+msgstr "Fel vid namnändring av skräpfil."
+
+#: LYMessages.c:315
+msgid "Error renaming temporary file."
+msgstr "Fel vid namnändring av temporärfil."
+
+#. #define BOOKTEMP_COPY_FAIL
+#: LYMessages.c:317
+msgid "Unable to copy temporary file for deletion of link."
+msgstr "Kan inte kopiera temporärfil för borttagning av länk."
+
+#. #define BOOKTEMP_REOPEN_FAIL_FOR_DEL
+#: LYMessages.c:319
+msgid "Unable to reopen temporary file for deletion of link."
+msgstr "Kan inte återöppna temporärfil för borttagning av länk."
+
+#. #define BOOKMARK_LINK_NOT_ONE_LINE
+#: LYMessages.c:322
+msgid "Link is not by itself all on one line in bookmark file."
+msgstr "Länk är inte själv helt på en rad i bokmärkesfilen."
+
+#: LYMessages.c:323
+msgid "Bookmark deletion failed."
+msgstr "Borttagning av bokmärke misslyckades."
+
+#. #define BOOKMARKS_NOT_TRAVERSED
+#: LYMessages.c:325
+msgid "Bookmark files cannot be traversed (only http URLs)."
+msgstr "Bokmärkesfiler kan inte traverseras (endast http-adresser)."
+
+#. #define BOOKMARKS_NOT_OPEN
+#: LYMessages.c:327
+msgid "Unable to open bookmark file, use 'a' to save a link first"
+msgstr "Kan inte öppna bokmärkesfil, använd 'a' för att spara en länk först"
+
+#: LYMessages.c:328
+msgid "There are no links in this bookmark file!"
+msgstr "Det finns inga länkar i denna bokmärkesfil!"
+
+#. #define CACHE_D_OR_CANCEL
+#: LYMessages.c:330
+msgid "D)elete cached document or C)ancel? (d,c): "
+msgstr "D=Ta bort cachat dokument; C=Avbryt? (d,c): "
+
+#. #define BOOK_D_L_OR_CANCEL
+#: LYMessages.c:332
+msgid "Save D)ocument or L)ink to bookmark file or C)ancel? (d,l,c): "
+msgstr "Spara D)okument eller L)änk till bokmärkesfil? C=Avbryt (d,l,c): "
+
+#: LYMessages.c:333
+msgid "Save D)ocument to bookmark file or C)ancel? (d,c): "
+msgstr "Spara D)okument till bokmärkesfil? C=Avbryt (d,c): "
+
+#: LYMessages.c:334
+msgid "Save L)ink to bookmark file or C)ancel? (l,c): "
+msgstr "Spara L)änk till bokmärkesfil? C=Avbryt (l,c): "
+
+#. #define NOBOOK_POST_FORM
+#: LYMessages.c:336
+msgid "Documents from forms with POST content cannot be saved as bookmarks."
+msgstr "Dokument från \"POST\"-formulär kan inte lagras som bokmärken."
+
+#: LYMessages.c:337
+msgid "Cannot save form fields/links"
+msgstr "Kan inte spara formulärfält/länkar"
+
+#. #define NOBOOK_HSML
+#: LYMessages.c:339
+msgid "History, showinfo, menu and list files cannot be saved as bookmarks."
+msgstr "Historik, \"showinfo\", menyer och listfiler kan inte lagras som bokmärken."
+
+#. #define CONFIRM_BOOKMARK_DELETE
+#: LYMessages.c:341
+msgid "Do you really want to delete this link from your bookmark file?"
+msgstr "Vill du verkligen ta bort denna länk från din bokmärkesfil?"
+
+#: LYMessages.c:342
+msgid "Malformed address."
+msgstr "Trasig adress."
+
+#. #define HISTORICAL_ON_MINIMAL_OFF
+#: LYMessages.c:344
+msgid "Historical comment parsing ON (Minimal is overridden)!"
+msgstr "Historisk tolkning av kommentarer PÃ… (minimal undertryckt)!"
+
+#. #define HISTORICAL_OFF_MINIMAL_ON
+#: LYMessages.c:346
+msgid "Historical comment parsing OFF (Minimal is in effect)!"
+msgstr "Historisk tolkning av kommentarer AV (minimal aktiv)!"
+
+#. #define HISTORICAL_ON_VALID_OFF
+#: LYMessages.c:348
+msgid "Historical comment parsing ON (Valid is overridden)!"
+msgstr "Historisk tolkning av kommentarer PÃ… (korrekt undertryckt)!"
+
+#. #define HISTORICAL_OFF_VALID_ON
+#: LYMessages.c:350
+msgid "Historical comment parsing OFF (Valid is in effect)!"
+msgstr "Historisk tolkning av kommentarer AV (korrekt aktiv)!"
+
+#. #define MINIMAL_ON_IN_EFFECT
+#: LYMessages.c:352
+msgid "Minimal comment parsing ON (and in effect)!"
+msgstr "Minimal tolkning av kommentarer PÃ… (och aktiv)!"
+
+#. #define MINIMAL_OFF_VALID_ON
+#: LYMessages.c:354
+msgid "Minimal comment parsing OFF (Valid is in effect)!"
+msgstr "Minimal tolkning av kommentarer AV (korrekt aktiv)!"
+
+#. #define MINIMAL_ON_BUT_HISTORICAL
+#: LYMessages.c:356
+msgid "Minimal comment parsing ON (but Historical is in effect)!"
+msgstr "Minimal tolkning av kommentarer PÃ… (men historisk aktiv)!"
+
+#. #define MINIMAL_OFF_HISTORICAL_ON
+#: LYMessages.c:358
+msgid "Minimal comment parsing OFF (Historical is in effect)!"
+msgstr "Minimal tolkning av kommentarer AV (historisk aktiv)!"
+
+#: LYMessages.c:359
+msgid "Soft double-quote parsing ON!"
+msgstr "Mjuk citationsteckenstolkning PÃ…!"
+
+#: LYMessages.c:360
+msgid "Soft double-quote parsing OFF!"
+msgstr "Mjuk citationsteckenstolkning AV!"
+
+#: LYMessages.c:361
+msgid "Now using TagSoup parsing of HTML."
+msgstr "Tolkar nu HTML enligt \"TagSoup\"-modellen."
+
+#: LYMessages.c:362
+msgid "Now using SortaSGML parsing of HTML!"
+msgstr "Tolkar nu HTML enligt \"SortaSGML\"-modellen."
+
+#: LYMessages.c:363
+msgid "You are already at the end of this document."
+msgstr "Du är redan i slutet av dokumentet."
+
+#: LYMessages.c:364
+msgid "You are already at the beginning of this document."
+msgstr "Du är redan i början av dokumentet."
+
+#: LYMessages.c:365
+#, c-format
+msgid "You are already at page %d of this document."
+msgstr "Du är redan på sida %d av dokumentet."
+
+#: LYMessages.c:366
+#, c-format
+msgid "Link number %d already is current."
+msgstr "Länk nummer %d är redan nuvarande."
+
+#: LYMessages.c:367
+msgid "You are already at the first document"
+msgstr "Du är redan i det första dokumentet."
+
+#: LYMessages.c:368
+msgid "There are no links above this line of the document."
+msgstr "Det finns inga länkar över denna rad i dokumentet."
+
+#: LYMessages.c:369
+msgid "There are no links below this line of the document."
+msgstr "Det finns inga länkar nedanför denna rad i dokumentet."
+
+#. #define MAXLEN_REACHED_DEL_OR_MOV
+#: LYMessages.c:371
+msgid "Maximum length reached! Delete text or move off field."
+msgstr "Maximal längd nådd! Ta bort text eller lämna fältet."
+
+#. #define NOT_ON_SUBMIT_OR_LINK
+#: LYMessages.c:373
+msgid "You are not on a form submission button or normal link."
+msgstr "Du är inte på en formulärsändknapp eller normal länk."
+
+#. #define NEED_CHECKED_RADIO_BUTTON
+#: LYMessages.c:375
+msgid "One radio button must be checked at all times!"
+msgstr "En radioknapp måste alltid vara markerad!"
+
+#: LYMessages.c:376
+msgid "No submit button for this form, submit single text field?"
+msgstr "Ingen insändningsknapp i formuläret, skicka ensamt textfält?"
+
+#: LYMessages.c:377
+msgid "Do you want to go back to the previous document?"
+msgstr "Vill du gå tillbaka till föregående dokument?"
+
+#: LYMessages.c:378
+msgid "Use arrows or tab to move off of field."
+msgstr "Använd pilar eller tabb för att lämna."
+
+#. #define ENTER_TEXT_ARROWS_OR_TAB
+#: LYMessages.c:380
+msgid "Enter text. Use arrows or tab to move off of field."
+msgstr "Ange text. Använd pilar eller tabb för att lämna."
+
+#: LYMessages.c:381
+msgid "** Bad HTML!! No form action defined. **"
+msgstr "** Trasig HTML!! Inget formulärmål angivet. **"
+
+#: LYMessages.c:382
+msgid "Bad HTML!! Unable to create popup window!"
+msgstr "Trasig HTML!! Kan inte skapa popupfönster!"
+
+#: LYMessages.c:383
+msgid "Unable to create popup window!"
+msgstr "Kan inte skapa popupfönster!"
+
+#: LYMessages.c:384
+msgid "Goto a random URL is disallowed!"
+msgstr "Slumpmässig adress ej tillåten!"
+
+#: LYMessages.c:385
+msgid "Goto a non-http URL is disallowed!"
+msgstr "Icke-http-adress ej tillåten!"
+
+#: LYMessages.c:386
+#, c-format
+msgid "You are not allowed to goto \"%s\" URLs"
+msgstr "Du tillåts inte gå till \"%s\"-adresser"
+
+#: LYMessages.c:387
+msgid "URL to open: "
+msgstr "Adress att öppna: "
+
+#: LYMessages.c:388
+msgid "Edit the current Goto URL: "
+msgstr "Redigera aktuell gåadress: "
+
+#: LYMessages.c:389
+msgid "Edit the previous Goto URL: "
+msgstr "Redigera föregående gåadress: "
+
+#: LYMessages.c:390
+msgid "Edit a previous Goto URL: "
+msgstr "Redigera en tidigare gåadress: "
+
+#: LYMessages.c:391
+msgid "Current document has POST data."
+msgstr "Aktuellt dokument har \"POST\"-data."
+
+#: LYMessages.c:392
+msgid "Edit this document's URL: "
+msgstr "Redigera dokumentets adress: "
+
+#: LYMessages.c:393
+msgid "Edit the current link's URL: "
+msgstr "Redigera aktuell länkadress: "
+
+#: LYMessages.c:394
+msgid "Edit the form's submit-URL: "
+msgstr "Redigera formulärets mottagaradress: "
+
+#: LYMessages.c:395
+msgid "You cannot edit File Management URLs"
+msgstr "Du kan inte redigera filhanteringsadresser"
+
+#: LYMessages.c:396
+msgid "Enter a database query: "
+msgstr "Ange en databasfråga: "
+
+#: LYMessages.c:397
+msgid "Enter a whereis query: "
+msgstr "Ange en \"whereis\"-fråga: "
+
+#: LYMessages.c:398
+msgid "Edit the current query: "
+msgstr "Redigera aktuell fråga: "
+
+#: LYMessages.c:399
+msgid "Edit the previous query: "
+msgstr "Redigera föregående fråga: "
+
+#: LYMessages.c:400
+msgid "Edit a previous query: "
+msgstr "Redigera en tidigare fråga: "
+
+#. #define USE_C_R_TO_RESUB_CUR_QUERY
+#: LYMessages.c:402
+msgid "Use Control-R to resubmit the current query."
+msgstr "Använd Control-R för att skicka frågan på nytt."
+
+#: LYMessages.c:403
+msgid "Edit the current shortcut: "
+msgstr "Redigera aktuell genväg: "
+
+#: LYMessages.c:404
+msgid "Edit the previous shortcut: "
+msgstr "Redigera föregående genväg: "
+
+#: LYMessages.c:405
+msgid "Edit a previous shortcut: "
+msgstr "Redigera en tidigare genväg:"
+
+#: LYMessages.c:406
+#, c-format
+msgid "Key '%c' is not mapped to a jump file!"
+msgstr "Tangenten \"%c\" är inte kopplad till en hoppfil!"
+
+#: LYMessages.c:407
+msgid "Cannot locate jump file!"
+msgstr "Kan inte lokalisera hoppfil!"
+
+#: LYMessages.c:408
+msgid "Cannot open jump file!"
+msgstr "Kan inte öppna hoppfil!"
+
+#: LYMessages.c:409
+msgid "Error reading jump file!"
+msgstr "Fel vid läsning av hoppfil!"
+
+#: LYMessages.c:410
+msgid "Out of memory reading jump file!"
+msgstr "Slut på minne vid läsning av hoppfil!"
+
+#: LYMessages.c:411
+msgid "Out of memory reading jump table!"
+msgstr "Slut på minne vid läsning av hopptabell!"
+
+#: LYMessages.c:412
+msgid "No index is currently available."
+msgstr "Inget index är tillgängligt."
+
+#. #define CONFIRM_MAIN_SCREEN
+#: LYMessages.c:414
+msgid "Do you really want to go to the Main screen?"
+msgstr "Vill du verkligen gå till huvudskärmen?"
+
+#: LYMessages.c:415
+msgid "You are already at main screen!"
+msgstr "Du är redan på huvudskärmen!"
+
+#. #define NOT_ISINDEX
+#: LYMessages.c:417
+msgid "Not a searchable indexed document -- press '/' to search for a text string"
+msgstr "Inte ett sökbart index -- tryck \"/\" för att söka efter en textsträng"
+
+#. #define NO_OWNER
+#: LYMessages.c:419
+msgid "No owner is defined for this file so you cannot send a comment"
+msgstr "Ingen ägare är angiven för denna fil, så du kan inte skicka en kommentar"
+
+#: LYMessages.c:420
+#, c-format
+msgid "No owner is defined. Use %s?"
+msgstr "Ingen ägaren är angiven. Använda %s?"
+
+#: LYMessages.c:421
+msgid "Do you wish to send a comment?"
+msgstr "Vill du skicka en kommentar?"
+
+#: LYMessages.c:422
+msgid "Mail is disallowed so you cannot send a comment"
+msgstr "E-post tillåts ej, så du kan inte skicka en kommentar"
+
+#: LYMessages.c:423
+msgid "The 'e'dit command is currently disabled."
+msgstr "Redigeringskommandot är just nu deaktiverat."
+
+#: LYMessages.c:424
+msgid "External editing is currently disabled."
+msgstr "Extern redigering är just nu deaktiverad."
+
+#: LYMessages.c:425
+msgid "System error - failure to get status."
+msgstr "Systemfel - kunde inte hämta status."
+
+#: LYMessages.c:426
+msgid "No editor is defined!"
+msgstr "Inget textredigeringsprogram har angivits!"
+
+#: LYMessages.c:427
+msgid "The 'p'rint command is currently disabled."
+msgstr "Utskriftskommandot är just nu deaktiverat."
+
+#: LYMessages.c:428
+msgid "Document has no Toolbar links or Banner."
+msgstr "Dokumentet har varken verktygsradslänkar eller baner."
+
+#: LYMessages.c:429
+msgid "Unable to open traversal file."
+msgstr "Kan inte öppna traverseringsfil."
+
+#: LYMessages.c:430
+msgid "Unable to open traversal found file."
+msgstr "Kan inte öppna traverseringens resultatfil."
+
+#: LYMessages.c:431
+msgid "Unable to open reject file."
+msgstr "Kan inte öppna avvisningsfilen."
+
+#: LYMessages.c:432
+msgid "Unable to open traversal errors output file"
+msgstr "Kan inte öppna traverseringens felfil."
+
+#: LYMessages.c:433
+msgid "TRAVERSAL WAS INTERRUPTED"
+msgstr "TRAVERSERINGEN AVBRÖTS"
+
+#: LYMessages.c:434
+msgid "Follow link (or goto link or page) number: "
+msgstr "Följ länk (eller gå till länk eller sida) nummer: "
+
+#: LYMessages.c:435
+msgid "Select option (or page) number: "
+msgstr "Välj val- (eller sid-)nummer: "
+
+#: LYMessages.c:436
+#, c-format
+msgid "Option number %d already is current."
+msgstr "Alternativ %d är redan markerat."
+
+#. #define ALREADY_AT_OPTION_END
+#: LYMessages.c:438
+msgid "You are already at the end of this option list."
+msgstr "Du är redan i slutet av alternativlistan."
+
+#. #define ALREADY_AT_OPTION_BEGIN
+#: LYMessages.c:440
+msgid "You are already at the beginning of this option list."
+msgstr "Du är redan i början av alternativlistan."
+
+#. #define ALREADY_AT_OPTION_PAGE
+#: LYMessages.c:442
+#, c-format
+msgid "You are already at page %d of this option list."
+msgstr "Du är redan på sida %d i alternativlistan."
+
+#: LYMessages.c:443
+msgid "You have entered an invalid option number."
+msgstr "Du har angett ett felaktigt alternativnummer."
+
+#: LYMessages.c:444
+msgid "** Bad HTML!! Use -trace to diagnose. **"
+msgstr "** Trasig HTML!! Använd -trace för att diagnostisera. **"
+
+#: LYMessages.c:445
+msgid "Give name of file to save in"
+msgstr "Ange filnamn att spara till"
+
+#: LYMessages.c:446
+msgid "Can't save data to file -- please run WWW locally"
+msgstr "Kan inte spara data till fil -- kör lokal webbläsare"
+
+#: LYMessages.c:447
+msgid "Can't open temporary file!"
+msgstr "Kan inte öppna temporärfil!"
+
+#: LYMessages.c:448
+msgid "Can't open output file! Cancelling!"
+msgstr "Kan inte öppna utdatafil! Avbryter!"
+
+#: LYMessages.c:449
+msgid "Execution is disabled."
+msgstr "Programkörning deaktiverad."
+
+#. #define EXECUTION_DISABLED_FOR_FILE
+#: LYMessages.c:451
+#, c-format
+msgid "Execution is not enabled for this file. See the Options menu (use %s)."
+msgstr "Programkörning inte aktiverad för denna fil. Se alternativmeny (använd %s)."
+
+#. #define EXECUTION_NOT_COMPILED
+#: LYMessages.c:453
+msgid "Execution capabilities are not compiled into this version."
+msgstr "Programkörningsmöjligheter inte inkompilerade i denna version."
+
+#: LYMessages.c:454
+msgid "This file cannot be displayed on this terminal."
+msgstr "Denna fil kan inte visas på terminalen."
+
+#. #define CANNOT_DISPLAY_FILE_D_OR_C
+#: LYMessages.c:456
+msgid "This file cannot be displayed on this terminal: D)ownload, or C)ancel"
+msgstr "Denna fil kan inte visas på terminalen. D=Hämta, C=Avbryt"
+
+#: LYMessages.c:457
+#, c-format
+msgid "%s D)ownload, or C)ancel"
+msgstr "%s D=Hämta, C=Avbryt"
+
+#: LYMessages.c:458
+msgid "Cancelling file."
+msgstr "Avbryter fil."
+
+#: LYMessages.c:459
+msgid "Retrieving file. - PLEASE WAIT -"
+msgstr "Hämtar fil. - VÄNLIGEN VÄNTA -"
+
+#: LYMessages.c:460
+msgid "Enter a filename: "
+msgstr "Ange ett filnamn: "
+
+#: LYMessages.c:461
+msgid "Edit the previous filename: "
+msgstr "Redigera föregående filnamn: "
+
+#: LYMessages.c:462
+msgid "Edit a previous filename: "
+msgstr "Redigera ett tidigare filnamn: "
+
+#: LYMessages.c:463
+msgid "Enter a new filename: "
+msgstr "Ange ett nytt filnamn: "
+
+#: LYMessages.c:464
+msgid "File name may not begin with a dot."
+msgstr "Filnamnet får inte börja med en punkt."
+
+#: LYMessages.c:466
+msgid "File exists. Create higher version?"
+msgstr "Filen existerar. Skapa en högre version?"
+
+#: LYMessages.c:468
+msgid "File exists. Overwrite?"
+msgstr "Filen existerar. Skriva över?"
+
+#: LYMessages.c:470
+msgid "Cannot write to file."
+msgstr "Kan inte skriva till fil."
+
+#: LYMessages.c:471
+msgid "ERROR! - download command is misconfigured."
+msgstr "FEL! - hämtkommandot är felkonfigurerat."
+
+#: LYMessages.c:472
+msgid "Unable to download file."
+msgstr "Kan inte hämta fil."
+
+#: LYMessages.c:473
+msgid "Reading directory..."
+msgstr "Läser katalog..."
+
+#: LYMessages.c:474
+msgid "Building directory listing..."
+msgstr "Bygger kataloglista..."
+
+#: LYMessages.c:475
+msgid "Saving..."
+msgstr "Sparar..."
+
+#: LYMessages.c:476
+#, c-format
+msgid "Could not edit file '%s'."
+msgstr "Kan inte redigera filen \"%s\"."
+
+#: LYMessages.c:477
+msgid "Unable to access document!"
+msgstr "Kan inte komma åt dokument!"
+
+#: LYMessages.c:478
+msgid "Could not access file."
+msgstr "Kan inte komma åt fil."
+
+#: LYMessages.c:479
+msgid "Could not access directory."
+msgstr "Kan inte komma åt katalog."
+
+#: LYMessages.c:480
+msgid "Could not load data."
+msgstr "Kan inte läsa in data."
+
+#. #define CANNOT_EDIT_REMOTE_FILES
+#: LYMessages.c:482
+msgid "Lynx cannot currently (e)dit remote WWW files."
+msgstr "Lynx kan ännu inte redigera fjärrwebbfiler."
+
+#. #define CANNOT_EDIT_FIELD
+#: LYMessages.c:484
+msgid "This field cannot be (e)dited with an external editor."
+msgstr "Detta fält kan inte redigeras med en extern redigerare."
+
+#: LYMessages.c:485
+msgid "Bad rule"
+msgstr "Felaktig regel"
+
+#: LYMessages.c:486
+msgid "Insufficient operands:"
+msgstr "Otillräckliga operander:"
+
+#: LYMessages.c:487
+msgid "You are not authorized to edit this file."
+msgstr "Du har inte rättighet att redigera filen."
+
+#: LYMessages.c:488
+msgid "Title: "
+msgstr "Titel: "
+
+#: LYMessages.c:489
+msgid "Subject: "
+msgstr "Ärende: "
+
+#: LYMessages.c:490
+msgid "Username: "
+msgstr "Användar-id: "
+
+#: LYMessages.c:491
+msgid "Password: "
+msgstr "Lösenord: "
+
+#: LYMessages.c:492
+msgid "lynx: Username and Password required!!!"
+msgstr "lynx: Användar-id och lösenord krävs!!!"
+
+#: LYMessages.c:493
+msgid "lynx: Password required!!!"
+msgstr "lynx: Lösenord krävs!!!"
+
+#: LYMessages.c:494
+msgid "Clear all authorization info for this session?"
+msgstr "Rensa all auktoriseringsinformation från denna session?"
+
+#: LYMessages.c:495
+msgid "Authorization info cleared."
+msgstr "Auktoriseringsinformation rensad."
+
+#: LYMessages.c:496
+msgid "Authorization failed. Retry?"
+msgstr "Auktorisering misslyckades. Försök igen?"
+
+#: LYMessages.c:497
+msgid "cgi support has been disabled."
+msgstr "cgi-stöd har deaktiverats."
+
+#. #define CGI_NOT_COMPILED
+#: LYMessages.c:499
+msgid "Lynxcgi capabilities are not compiled into this version."
+msgstr "Lynxcgi-stöd är inte inkompilerade i denna version."
+
+#: LYMessages.c:500
+#, c-format
+msgid "Sorry, no known way of converting %s to %s."
+msgstr "Tyvärr, kan inte konvertera %s till %s."
+
+#: LYMessages.c:501
+msgid "Unable to set up connection."
+msgstr "Kan inte ställa in anslutning."
+
+#: LYMessages.c:502
+msgid "Unable to make connection"
+msgstr "Kan inte skapa anslutning"
+
+#. #define MALFORMED_EXEC_REQUEST
+#: LYMessages.c:504
+msgid "Executable link rejected due to malformed request."
+msgstr "Körbar länk förkastad på grund av trasig förfrågan."
+
+#. #define BADCHAR_IN_EXEC_LINK
+#: LYMessages.c:506
+#, c-format
+msgid "Executable link rejected due to `%c' character."
+msgstr "Körbar länk förkastad på grund av tecknet \"%c\"."
+
+#. #define RELPATH_IN_EXEC_LINK
+#: LYMessages.c:508
+msgid "Executable link rejected due to relative path string ('../')."
+msgstr "Körbar länk förkastad på grund av relativ sökvägssträng (\"../\")."
+
+#. #define BADLOCPATH_IN_EXEC_LINK
+#: LYMessages.c:510
+msgid "Executable link rejected due to location or path."
+msgstr "Körbar länk förkastad på grund av placering eller sökväg."
+
+#: LYMessages.c:511
+msgid "Mail access is disabled!"
+msgstr "Ã…tkomst till e-post deaktiverad!"
+
+#. #define ACCESS_ONLY_LOCALHOST
+#: LYMessages.c:513
+msgid "Only files and servers on the local host can be accessed."
+msgstr "Endast filer och servrar på den lokala värden kan nås."
+
+#: LYMessages.c:514
+msgid "Telnet access is disabled!"
+msgstr "Telnetåtkomst är deaktiverad!"
+
+#. #define TELNET_PORT_SPECS_DISABLED
+#: LYMessages.c:516
+msgid "Telnet port specifications are disabled."
+msgstr "Specificering av telnetport är deaktiverad."
+
+#: LYMessages.c:517
+msgid "USENET news access is disabled!"
+msgstr "Åtkomst till Usenet news är deaktiverad!"
+
+#: LYMessages.c:518
+msgid "Rlogin access is disabled!"
+msgstr "Rloginåtkomst är deaktiverad!"
+
+#: LYMessages.c:519
+msgid "Ftp access is disabled!"
+msgstr "Ftpåtkomst är deaktiverad!"
+
+#: LYMessages.c:520
+msgid "There are no references from this document."
+msgstr "Det finns inga referenser i detta dokument."
+
+#: LYMessages.c:521
+msgid "There are only hidden links from this document."
+msgstr "Det finns inga dolda länkar i detta dokument."
+
+#: LYMessages.c:523
+msgid "Unable to open command file."
+msgstr "Kan inte öppna kommandofil."
+
+#: LYMessages.c:525
+msgid "News Post Cancelled!!!"
+msgstr "Postning av inlägg avbruten!!!"
+
+#. #define SPAWNING_EDITOR_FOR_NEWS
+#: LYMessages.c:527
+msgid "Spawning your selected editor to edit news message"
+msgstr "Startar ditt valda textredigeringsprogram för att redigera inlägg"
+
+#: LYMessages.c:528
+msgid "Post this message?"
+msgstr "Posta inlägget?"
+
+#: LYMessages.c:529
+#, c-format
+msgid "Append '%s'?"
+msgstr "Lägga till \"%s\"?"
+
+#: LYMessages.c:530
+msgid "Posting to newsgroup(s)..."
+msgstr "Postar till diskussionsgrupp(er)..."
+
+#: LYMessages.c:532
+msgid "*** You have unread mail. ***"
+msgstr "*** Du har oläst e-post. ***"
+
+#: LYMessages.c:534
+msgid "*** You have mail. ***"
+msgstr "*** Du har e-post. ***"
+
+#: LYMessages.c:536
+msgid "*** You have new mail. ***"
+msgstr "*** Du har ny e-post. ***"
+
+#: LYMessages.c:537
+msgid "File insert cancelled!!!"
+msgstr "Filinläggning avbruten!!!"
+
+#: LYMessages.c:538
+msgid "Not enough memory for file!"
+msgstr "Minnet slut för fil!"
+
+#: LYMessages.c:539
+msgid "Can't open file for reading."
+msgstr "Kan inte öppna fil för läsning."
+
+#: LYMessages.c:540
+msgid "File does not exist."
+msgstr "Filen existerar inte."
+
+#: LYMessages.c:541
+msgid "File does not exist - reenter or cancel:"
+msgstr "Filen existerar inte - ange igen eller avbryt:"
+
+#: LYMessages.c:542
+msgid "File is not readable."
+msgstr "Filen är inte läsbar."
+
+#: LYMessages.c:543
+msgid "File is not readable - reenter or cancel:"
+msgstr "Filen är inte läsbar - ange igen eller avbryt:"
+
+#: LYMessages.c:544
+msgid "Nothing to insert - file is 0-length."
+msgstr "Inget att lägga in - filen har nollstorlek."
+
+#: LYMessages.c:545
+msgid "Save request cancelled!!!"
+msgstr "Sparning avbruten!!!"
+
+#: LYMessages.c:546
+msgid "Mail request cancelled!!!"
+msgstr "E-post avbrutet!!!"
+
+#. #define CONFIRM_MAIL_SOURCE_PREPARSED
+#: LYMessages.c:548
+msgid "Viewing preparsed source. Are you sure you want to mail it?"
+msgstr "Visar tolkad källkod. Är du säker på att du vill skicka den?"
+
+#: LYMessages.c:549
+msgid "Please wait..."
+msgstr "Var god vänta..."
+
+#: LYMessages.c:550
+msgid "Mailing file. Please wait..."
+msgstr "Skickar fil. Var god vänta..."
+
+#: LYMessages.c:551
+msgid "ERROR - Unable to mail file"
+msgstr "FEL - Kan inte skicka fil per e-post"
+
+#. #define CONFIRM_LONG_SCREEN_PRINT
+#: LYMessages.c:553
+#, c-format
+msgid "File is %d screens long. Are you sure you want to print?"
+msgstr "Filen är %d skärmar lång. Är du säker att du vill skriva ut?"
+
+#: LYMessages.c:554
+msgid "Print request cancelled!!!"
+msgstr "Utskrift avbruten!!!"
+
+#: LYMessages.c:555
+msgid "Press <return> to begin: "
+msgstr "Tryck <Enter> för att börja: "
+
+#: LYMessages.c:556
+msgid "Press <return> to finish: "
+msgstr "Tryck <Enter> för att avsluta: "
+
+#. #define CONFIRM_LONG_PAGE_PRINT
+#: LYMessages.c:558
+#, c-format
+msgid "File is %d pages long. Are you sure you want to print?"
+msgstr "Filen är %d sidor lång. Är du säker att du vill skriva ut?"
+
+#. #define CHECK_PRINTER
+#: LYMessages.c:560
+msgid "Be sure your printer is on-line. Press <return> to start printing:"
+msgstr "Försäkra dig om att skrivaren är inkopplad. Tryck <Enter> för att påbörja utskriften:"
+
+#: LYMessages.c:561
+msgid "ERROR - Unable to allocate file space!!!"
+msgstr "FEL - kan inte reservera filutrymme!!!"
+
+#: LYMessages.c:562
+msgid "Unable to open tempfile"
+msgstr "Kan inte öppna temporärfil"
+
+#: LYMessages.c:563
+msgid "Unable to open print options file"
+msgstr "Kan inte öppna utskriftsalternativfil"
+
+#: LYMessages.c:564
+msgid "Printing file. Please wait..."
+msgstr "Skriver ut fil. Var god vänta..."
+
+#: LYMessages.c:565
+msgid "Please enter a valid internet mail address: "
+msgstr "Ange en giltig Internet-e-postadress: "
+
+#: LYMessages.c:566
+msgid "ERROR! - printer is misconfigured!"
+msgstr "FEL! - skrivaren är felkonfigurerad!"
+
+#: LYMessages.c:567
+msgid "Image map from POST response not available!"
+msgstr "Bildkarta från \"POST\"-svar ej tillgänglig!"
+
+#: LYMessages.c:568
+msgid "Misdirected client-side image MAP request!"
+msgstr "Feldirigerad klientbildkarteförfrågan!"
+
+#: LYMessages.c:569
+msgid "Client-side image MAP is not accessible!"
+msgstr "Klientbildkarta ej åtkomlig!"
+
+#: LYMessages.c:570
+msgid "No client-side image MAPs are available!"
+msgstr "Inga klientbildkartor är tillgängliga!"
+
+#: LYMessages.c:571
+msgid "Client-side image MAP is not available!"
+msgstr "Klientbildkarta ej tillgänglig!"
+
+#. #define OPTION_SCREEN_NEEDS_24
+#: LYMessages.c:574
+msgid "Screen height must be at least 24 lines for the Options menu!"
+msgstr "Skärmhöjden måste vara minst 24 rader för alternativmenyn!"
+
+#. #define OPTION_SCREEN_NEEDS_23
+#: LYMessages.c:576
+msgid "Screen height must be at least 23 lines for the Options menu!"
+msgstr "Skärmhöjden måste vara minst 23 rader för alternativmenyn!"
+
+#. #define OPTION_SCREEN_NEEDS_22
+#: LYMessages.c:578
+msgid "Screen height must be at least 22 lines for the Options menu!"
+msgstr "Skärmhöjden måste vara minst 22 rader för alternativmenyn!"
+
+#: LYMessages.c:580
+msgid "That key requires Advanced User mode."
+msgstr "Den knappen kräver avancerat användarläge."
+
+#: LYMessages.c:581
+#, c-format
+msgid "Content-type: %s"
+msgstr "Datatyp: %s"
+
+#: LYMessages.c:582
+msgid "Command: "
+msgstr "Kommando: "
+
+#: LYMessages.c:583
+msgid "Unknown or ambiguous command"
+msgstr "Okänt eller tvetydigt kommando"
+
+#: LYMessages.c:584
+msgid " Version "
+msgstr " Version "
+
+#: LYMessages.c:585
+msgid " first"
+msgstr " först"
+
+#: LYMessages.c:586
+msgid ", guessing..."
+msgstr ", gissar..."
+
+#: LYMessages.c:587
+msgid "Permissions for "
+msgstr "Behörighet för "
+
+#: LYMessages.c:588
+msgid "Select "
+msgstr "Välj "
+
+#: LYMessages.c:589
+msgid "capital letter"
+msgstr "stora bokstaven"
+
+#: LYMessages.c:590
+msgid " of option line,"
+msgstr " i alternativet,"
+
+#: LYMessages.c:591
+msgid " to save,"
+msgstr " för att lagra,"
+
+#: LYMessages.c:592
+msgid " to "
+msgstr " till "
+
+#: LYMessages.c:593
+msgid " or "
+msgstr " eller "
+
+#: LYMessages.c:594
+msgid " index"
+msgstr " index"
+
+#: LYMessages.c:595
+msgid " to return to Lynx."
+msgstr " för att återgå till Lynx"
+
+#: LYMessages.c:596
+msgid "Accept Changes"
+msgstr "Bekräfta ändringar"
+
+#: LYMessages.c:597
+msgid "Reset Changes"
+msgstr "Nollställ ändringar"
+
+#: LYMessages.c:598
+msgid "Left Arrow cancels changes"
+msgstr "Vänsterpil avbryter ändringar"
+
+#: LYMessages.c:599
+msgid "Save options to disk"
+msgstr "Spara inställningar till disk"
+
+#: LYMessages.c:600
+msgid "Hit RETURN to accept entered data."
+msgstr "Tryck ENTER för att bekräfta angiven data."
+
+#. #define ACCEPT_DATA_OR_DEFAULT
+#: LYMessages.c:602
+msgid "Hit RETURN to accept entered data. Delete data to invoke the default."
+msgstr "Tryck ENTER för att bekräfta angiven data. Ta bort för att återställa förval."
+
+#: LYMessages.c:603
+msgid "Value accepted!"
+msgstr "Värdet accepterat!"
+
+#. #define VALUE_ACCEPTED_WARNING_X
+#: LYMessages.c:605
+msgid "Value accepted! -- WARNING: Lynx is configured for XWINDOWS!"
+msgstr "Värdet accepterat! -- VARNING: Lynx har ställts in för XWINDOWS!"
+
+#. #define VALUE_ACCEPTED_WARNING_NONX
+#: LYMessages.c:607
+msgid "Value accepted! -- WARNING: Lynx is NOT configured for XWINDOWS!"
+msgstr "Värdet accepterat! -- VARNING: Lynx har INTE ställts in för XWINDOWS!"
+
+#: LYMessages.c:608
+msgid "You are not allowed to change which editor to use!"
+msgstr "Du har inte rättighet att ändra textredigeringsprogram!"
+
+#: LYMessages.c:609
+msgid "Failed to set DISPLAY variable!"
+msgstr "Kunde inte ställa in DISPLAY-variabel!"
+
+#: LYMessages.c:610
+msgid "Failed to clear DISPLAY variable!"
+msgstr "Kunde inte ta bort DISPLAY-variabel!"
+
+#. #define BOOKMARK_CHANGE_DISALLOWED
+#: LYMessages.c:612
+msgid "You are not allowed to change the bookmark file!"
+msgstr "Du har inte rättighet att ändra bokmärkesfil!"
+
+#: LYMessages.c:613
+msgid "Terminal does not support color"
+msgstr "Terminalen stöder inte färg"
+
+#: LYMessages.c:614
+#, c-format
+msgid "Your '%s' terminal does not support color."
+msgstr "Din \"%s\"-terminal stöder inte färg."
+
+#: LYMessages.c:615
+msgid "Access to dot files is disabled!"
+msgstr "Tillgång till punktfiler är deaktiverad!"
+
+#. #define UA_NO_LYNX_WARNING
+#: LYMessages.c:617
+msgid "User-Agent string does not contain \"Lynx\" or \"L_y_n_x\""
+msgstr "Identifieringssträngen innehåller inte \"Lynx\" eller \"L_y_n_x\""
+
+#. #define UA_PLEASE_USE_LYNX
+#: LYMessages.c:619
+msgid "Use \"L_y_n_x\" or \"Lynx\" in User-Agent, or it looks like intentional deception!"
+msgstr "Använd \"L_y_n_x\" eller \"Lynx\" i identifieringen, annars ser det ut som medvetet bedrägeri"
+
+#. #define UA_CHANGE_DISABLED
+#: LYMessages.c:621
+msgid "Changing of the User-Agent string is disabled!"
+msgstr "Ändring av identifieringssträngen är deaktiverad!"
+
+#. #define CHANGE_OF_SETTING_DISALLOWED
+#: LYMessages.c:623
+msgid "You are not allowed to change this setting."
+msgstr "Du har inte behörighet att ändra denna inställning."
+
+#: LYMessages.c:624
+msgid "Saving Options..."
+msgstr "Sparar inställningar..."
+
+#: LYMessages.c:625
+msgid "Options saved!"
+msgstr "Inställningar sparade!"
+
+#: LYMessages.c:626
+msgid "Unable to save Options!"
+msgstr "Kan inte spara inställningar!"
+
+#: LYMessages.c:627
+msgid " 'r' to return to Lynx "
+msgstr " 'r' återgår till Lynx "
+
+#: LYMessages.c:628
+msgid " '>' to save, or 'r' to return to Lynx "
+msgstr " '>' sparar, 'r' återgår till Lynx "
+
+#. #define ANY_KEY_CHANGE_RET_ACCEPT
+#: LYMessages.c:630
+msgid "Hit any key to change value; RETURN to accept."
+msgstr "Valfri tangent ändrar, förutom ENTER som accepterar."
+
+#: LYMessages.c:631
+msgid "Error uncompressing temporary file!"
+msgstr "Fel vid dekomprimering av temporärfil!"
+
+#: LYMessages.c:632
+msgid "Unsupported URL scheme!"
+msgstr "Adresstypen stöds ej!"
+
+#: LYMessages.c:633
+msgid "Unsupported data: URL! Use SHOWINFO, for now."
+msgstr "Data stöds ej: URL! Använd SHOWINFO så länge."
+
+#: LYMessages.c:634
+#, c-format
+msgid "Redirection limit of %d URL's reached."
+msgstr "Gräns på %d adressomdirigeringar nådd."
+
+#: LYMessages.c:635
+msgid "Illegal redirection URL received from server!"
+msgstr "Felaktig omdirigeringsadress mottagen från servern!"
+
+#. #define SERVER_ASKED_FOR_REDIRECTION
+#: LYMessages.c:637
+#, c-format
+msgid "Server asked for %d redirection of POST content to"
+msgstr "Servern bad om %d-omdirigering för POST-data till"
+
+#: LYMessages.c:640
+msgid "P)roceed, use G)ET or C)ancel "
+msgstr "P=Fortsätt, G=använd Get, C=Avbryt"
+
+#: LYMessages.c:641
+msgid "P)roceed, or C)ancel "
+msgstr "P=Fortsätt, C=Avbryt "
+
+#. #define ADVANCED_POST_GET_REDIRECT
+#: LYMessages.c:643
+msgid "Redirection of POST content. P)roceed, see U)RL, use G)ET or C)ancel"
+msgstr "Omdirigering av POST-data. P=Fortsätt, U=Se adress, G=använd GET, C=Avbryt"
+
+#. #define ADVANCED_POST_REDIRECT
+#: LYMessages.c:645
+msgid "Redirection of POST content. P)roceed, see U)RL, or C)ancel"
+msgstr "Omdirigering av POST-data. P=Fortsätt, U=Se adress, C=Avbryt"
+
+#. #define CONFIRM_POST_RESUBMISSION
+#: LYMessages.c:647
+msgid "Document from Form with POST content. Resubmit?"
+msgstr "Dokument från formulär med POST-data. Skicka igen?"
+
+#. #define CONFIRM_POST_RESUBMISSION_TO
+#: LYMessages.c:649
+#, c-format
+msgid "Resubmit POST content to %s ?"
+msgstr "Skicka POST-data till %s igen?"
+
+#. #define CONFIRM_POST_LIST_RELOAD
+#: LYMessages.c:651
+#, c-format
+msgid "List from document with POST data. Reload %s ?"
+msgstr "Lista från dokument med POST-data. Hämta om %s?"
+
+#. #define CONFIRM_POST_DOC_HEAD
+#: LYMessages.c:653
+msgid "Document from POST action, HEAD may not be understood. Proceed?"
+msgstr "Dokument från POST-formulär, HEAD kanske inte förstås. Fortsätta?"
+
+#. #define CONFIRM_POST_LINK_HEAD
+#: LYMessages.c:655
+msgid "Form submit action is POST, HEAD may not be understood. Proceed?"
+msgstr "Formulärmetod är POST, HEAD kanske inte förstås. Fortsätta?"
+
+#: LYMessages.c:656
+msgid "Proceed without a username and password?"
+msgstr "Fortsätta utan användar-id och lösenord?"
+
+#: LYMessages.c:657
+#, c-format
+msgid "Proceed (%s)?"
+msgstr "Fortsätta (%s)?"
+
+#: LYMessages.c:658
+msgid "Cannot POST to this host."
+msgstr "Kan inte skicka POST-data till denna värd."
+
+#: LYMessages.c:659
+msgid "POST not supported for this URL - ignoring POST data!"
+msgstr "POST stöds inte för denna adress - ignorerar POST-data!"
+
+#: LYMessages.c:660
+msgid "Discarding POST data..."
+msgstr "Kastar POST-data..."
+
+#: LYMessages.c:661
+msgid "Document will not be reloaded!"
+msgstr "Dokumentet hämtas inte om!"
+
+#: LYMessages.c:662
+msgid "Location: "
+msgstr "Plats: "
+
+#: LYMessages.c:663
+#, c-format
+msgid "'%s' not found!"
+msgstr "'%s' hittades ej!"
+
+#: LYMessages.c:664
+msgid "Default Bookmark File"
+msgstr "Förinställd bokmärkesfil"
+
+#: LYMessages.c:665
+msgid "Screen too small! (8x35 min)"
+msgstr "Skärm för liten! (min. 8x35)"
+
+#: LYMessages.c:666
+msgid "Select destination or ^G to Cancel: "
+msgstr "Välj destination eller ^G för att avbryta: "
+
+#. #define MULTIBOOKMARKS_SELECT
+#: LYMessages.c:668
+msgid "Select subbookmark, '=' for menu, or ^G to cancel: "
+msgstr "Välj underbokmärke. '=' ger meny, ^G avbryter: "
+
+#. #define MULTIBOOKMARKS_SELF
+#: LYMessages.c:670
+msgid "Reproduce L)ink in this bookmark file or C)ancel? (l,c): "
+msgstr "L=Avbilda länk i bokmärkesfil, C=Avbryt? (l,c): "
+
+#: LYMessages.c:671
+msgid "Multiple bookmark support is not available."
+msgstr "Stöd för multipla bokmärken ej tillgängligt."
+
+#: LYMessages.c:672
+#, c-format
+msgid " Select Bookmark (screen %d of %d)"
+msgstr " Välj bokmärke (skärm %d av %d)"
+
+#: LYMessages.c:673
+msgid " Select Bookmark"
+msgstr " Välj bokmärke"
+
+#. #define MULTIBOOKMARKS_EHEAD_MASK
+#: LYMessages.c:675
+#, c-format
+msgid "Editing Bookmark DESCRIPTION and FILEPATH (%d of 2)"
+msgstr "Redigerar bokmärkes-BESKRIVNING och SÖKVÄG (%d av 2)"
+
+#. #define MULTIBOOKMARKS_EHEAD
+#: LYMessages.c:677
+msgid " Editing Bookmark DESCRIPTION and FILEPATH"
+msgstr " Redigerar bokmärkes-BESKRIVNING och SÖKVÄG"
+
+#: LYMessages.c:678
+msgid "Letter: "
+msgstr "Bokstav: "
+
+#. #define USE_PATH_OFF_HOME
+#: LYMessages.c:681
+msgid "Use a filepath off your login directory in SHELL syntax!"
+msgstr "Använd en sökväg från din inloggningskatalog enligt SKAL-syntax!"
+
+#: LYMessages.c:683
+msgid "Use a filepath off your home directory!"
+msgstr "Använd en sökväg från din hemkatalog!"
+
+#. #define MAXLINKS_REACHED
+#: LYMessages.c:686
+msgid "Maximum links per page exceeded! Use half-page or two-line scrolling."
+msgstr "Max antal länkar per sida överskreds! Använd halvsides- eller tvåradsrullning."
+
+#: LYMessages.c:687
+msgid "No previously visited links available!"
+msgstr "Inga tidigare besökta länkar tillgängliga!"
+
+#: LYMessages.c:688
+msgid "Memory exhausted! Program aborted!"
+msgstr "Minnet slut! Programmet avbrutet!"
+
+#: LYMessages.c:689
+msgid "Memory exhausted! Aborting..."
+msgstr "Minnet slut! Avbryter..."
+
+#: LYMessages.c:690
+msgid "Not enough memory!"
+msgstr "Ej tillräckligt minne!"
+
+#: LYMessages.c:691
+msgid "Directory/File Manager not available"
+msgstr "Katalog-/filhanterare ej tillgänglig"
+
+#: LYMessages.c:692
+msgid "Location URL is not absolute."
+msgstr "\"Location\"-adress ej absolut."
+
+#: LYMessages.c:693
+msgid "Refresh URL is not absolute."
+msgstr "\"Refresh\"-adress ej absolut."
+
+#. #define SENDING_MESSAGE_WITH_BODY_TO
+#: LYMessages.c:695
+msgid ""
+"You are sending a message with body to:\n"
+" "
+msgstr ""
+"Du sänder ett meddelande med textkropp till:\n"
+" "
+
+#: LYMessages.c:696
+msgid ""
+"You are sending a comment to:\n"
+" "
+msgstr ""
+"Du sänder en kommentar till:\n"
+" "
+
+#: LYMessages.c:697
+msgid ""
+"\n"
+" With copy to:\n"
+" "
+msgstr ""
+"\n"
+" Med kopia till:\n"
+" "
+
+#: LYMessages.c:698
+msgid ""
+"\n"
+" With copies to:\n"
+" "
+msgstr ""
+"\n"
+" Med kopior till:\n"
+" "
+
+#. #define CTRL_G_TO_CANCEL_SEND
+#: LYMessages.c:700
+msgid ""
+"\n"
+"\n"
+"Use Ctrl-G to cancel if you do not want to send a message\n"
+msgstr ""
+"\n"
+"\n"
+"Använd Ctrl-G för att avbryta om du inte vill skicka ett meddelande\n"
+
+#. #define ENTER_NAME_OR_BLANK
+#: LYMessages.c:702
+msgid ""
+"\n"
+" Please enter your name, or leave it blank to remain anonymous\n"
+msgstr ""
+"\n"
+" Ange ditt namn eller lämna blankt för att förbli anonym\n"
+
+#. #define ENTER_MAIL_ADDRESS_OR_OTHER
+#: LYMessages.c:704
+msgid ""
+"\n"
+" Please enter a mail address or some other\n"
+msgstr ""
+"\n"
+" Skriv din e-postadress eller något annat\n"
+
+#. #define MEANS_TO_CONTACT_FOR_RESPONSE
+#: LYMessages.c:706
+msgid " means to contact you, if you desire a response.\n"
+msgstr " sätt du kan nås på, om du vill ha ett svar.\n"
+
+#: LYMessages.c:707
+msgid ""
+"\n"
+" Please enter a subject line.\n"
+msgstr ""
+"\n"
+" Ange en ärenderad.\n"
+
+#. #define ENTER_ADDRESS_FOR_CC
+#: LYMessages.c:709
+msgid ""
+"\n"
+" Enter a mail address for a CC of your message.\n"
+msgstr ""
+"\n"
+" Ange e-postadress som får kopia på ditt meddelande.\n"
+
+#: LYMessages.c:710
+msgid " (Leave blank if you don't want a copy.)\n"
+msgstr " (Lämna blankt om du inte vill ha en kopia).\n"
+
+#: LYMessages.c:711
+msgid ""
+"\n"
+" Please review the message body:\n"
+"\n"
+msgstr ""
+"\n"
+" Se över meddelandekroppen:\n"
+"\n"
+
+#: LYMessages.c:712
+msgid ""
+"\n"
+"Press RETURN to continue: "
+msgstr ""
+"\n"
+"Tryck ENTER för att fortsätta: "
+
+#: LYMessages.c:713
+msgid ""
+"\n"
+"Press RETURN to clean up: "
+msgstr ""
+"\n"
+"Tryck ENTER för att städa upp: "
+
+#: LYMessages.c:714
+msgid " Use Control-U to erase the default.\n"
+msgstr " Använd Control-U för att rensa förvalet.\n"
+
+#: LYMessages.c:715
+msgid ""
+"\n"
+" Please enter your message below."
+msgstr ""
+"\n"
+" Skriv ditt meddelande nedan."
+
+#. #define ENTER_PERIOD_WHEN_DONE_A
+#: LYMessages.c:717 src/LYNews.c:360
+msgid ""
+"\n"
+" When you are done, press enter and put a single period (.)"
+msgstr ""
+"\n"
+" När du är klar, tryck Enter och skriv en ensam punkt (.)"
+
+#. #define ENTER_PERIOD_WHEN_DONE_B
+#: LYMessages.c:719 src/LYNews.c:361
+msgid ""
+"\n"
+" on a line and press enter again."
+msgstr ""
+"\n"
+" på en rad och tryck Enter igen."
+
+#. Cookies messages
+#. #define ADVANCED_COOKIE_CONFIRMATION
+#: LYMessages.c:723
+#, c-format
+msgid "%s cookie: %.*s=%.*s Allow? (Y/N/Always/neVer)"
+msgstr "%s kaka: %.*s=%.*s Tillåta? (J/N/Alltid/aLdrig)"
+
+#. #define INVALID_COOKIE_DOMAIN_CONFIRMATION
+#: LYMessages.c:725
+#, c-format
+msgid "Accept invalid cookie domain=%s for '%s'?"
+msgstr "Tillåta ogiltig kakdomän=%s för \"%s\"?"
+
+#. #define INVALID_COOKIE_PATH_CONFIRMATION
+#: LYMessages.c:727
+#, c-format
+msgid "Accept invalid cookie path=%s as a prefix of '%s'?"
+msgstr "Tillåta ogiltig kaksökväg=%s som prefix för \"%s\"?"
+
+#: LYMessages.c:728
+msgid "Allowing this cookie."
+msgstr "Tillåter kakan."
+
+#: LYMessages.c:729
+msgid "Rejecting this cookie."
+msgstr "Avvisar kakan."
+
+#: LYMessages.c:730
+msgid "The Cookie Jar is empty."
+msgstr "Kakburken är tom."
+
+#: LYMessages.c:731
+msgid "The Cache Jar is empty."
+msgstr "Cacheburken är tom."
+
+#. #define ACTIVATE_TO_GOBBLE
+#: LYMessages.c:733
+msgid "Activate links to gobble up cookies or entire domains,"
+msgstr "Aktivera länk för att äta upp kakor eller hela domäner,"
+
+#: LYMessages.c:734
+msgid "or to change a domain's 'allow' setting."
+msgstr "eller ändra domänens \"tillåt\"-inställning."
+
+#: LYMessages.c:735
+msgid "(Cookies never allowed.)"
+msgstr "(Kakor tillåts aldrig)"
+
+#: LYMessages.c:736
+msgid "(Cookies always allowed.)"
+msgstr "(Kakor tillåts alltid)"
+
+#: LYMessages.c:737
+msgid "(Cookies allowed via prompt.)"
+msgstr "(Kakor tillåts via fråga)"
+
+#: LYMessages.c:738
+msgid "(Persistent Cookies.)"
+msgstr "(Persistenta kakor)"
+
+#: LYMessages.c:739
+msgid "(No title.)"
+msgstr "(Titel saknas)"
+
+#: LYMessages.c:740
+msgid "(No name.)"
+msgstr "(Inget namn)"
+
+#: LYMessages.c:741
+msgid "(No value.)"
+msgstr "(Inget värde)"
+
+#: LYMessages.c:742 src/LYOptions.c:2482
+msgid "None"
+msgstr "Ingen"
+
+#: LYMessages.c:743
+msgid "(End of session.)"
+msgstr "(Slut på session)"
+
+#: LYMessages.c:744
+msgid "Delete this cookie?"
+msgstr "Radera denna kaka?"
+
+#: LYMessages.c:745
+msgid "The cookie has been eaten!"
+msgstr "Kakan har ätits upp!"
+
+#: LYMessages.c:746
+msgid "Delete this empty domain?"
+msgstr "Radera denna tomma domän?"
+
+#: LYMessages.c:747
+msgid "The domain has been eaten!"
+msgstr "Domänen har ätits upp!"
+
+#. #define DELETE_COOKIES_SET_ALLOW_OR_CANCEL
+#: LYMessages.c:749
+msgid "D)elete domain's cookies, set allow A)lways/P)rompt/neV)er, or C)ancel? "
+msgstr "D=Radera domänens kakor, ställ in A=Alltid/P=Fråga/V=Aldrig, C=Avbryt? "
+
+#. #define DELETE_DOMAIN_SET_ALLOW_OR_CANCEL
+#: LYMessages.c:751
+msgid "D)elete domain, set allow A)lways/P)rompt/neV)er, or C)ancel? "
+msgstr "D=Radera domän, ställ in A=Alltid/P=Fråga/V=Aldrig, C=Avbryt? "
+
+#: LYMessages.c:752
+msgid "All cookies in the domain have been eaten!"
+msgstr "Alla kakor från domänen har ätits upp!"
+
+#: LYMessages.c:753
+#, c-format
+msgid "'A'lways allowing from domain '%s'."
+msgstr "Tillåter alla kakor från domänen \"%s\"."
+
+#: LYMessages.c:754
+#, c-format
+msgid "ne'V'er allowing from domain '%s'."
+msgstr "Avvisar alla kakor från domänen \"%s\"."
+
+#: LYMessages.c:755
+#, c-format
+msgid "'P'rompting to allow from domain '%s'."
+msgstr "Frågar om alla kakor från domänen \"%s\"."
+
+#: LYMessages.c:756
+msgid "Delete all cookies in this domain?"
+msgstr "Radera alla kakor i denna domän?"
+
+#: LYMessages.c:757
+msgid "All of the cookies in the jar have been eaten!"
+msgstr "Alla kakor i kakburken har ätits upp!"
+
+#: LYMessages.c:759
+msgid "Port 19 not permitted in URLs."
+msgstr "Port 19 ej tillåten i adress."
+
+#: LYMessages.c:760
+msgid "Port 25 not permitted in URLs."
+msgstr "Port 25 ej tillåten i adress."
+
+#: LYMessages.c:761
+#, c-format
+msgid "Port %lu not permitted in URLs."
+msgstr "Port %lu ej tillåten i adress."
+
+#: LYMessages.c:762
+msgid "URL has a bad port field."
+msgstr "Adressen har ett felaktigt portfält."
+
+#: LYMessages.c:763
+msgid "Maximum nesting of HTML elements exceeded."
+msgstr "Maximal stapling av HTML-element överskreds."
+
+#: LYMessages.c:764
+msgid "Bad partial reference! Stripping lead dots."
+msgstr "Felaktig partiell referens! Raderar inledande punkter."
+
+#: LYMessages.c:765
+msgid "Trace Log open failed. Trace off!"
+msgstr "Öppning av spårningslogg misslyckades. Spårning avslagen!"
+
+#: LYMessages.c:766
+msgid "Lynx Trace Log"
+msgstr "Lynx' spårningslogg"
+
+#: LYMessages.c:767
+msgid "No trace log has been started for this session."
+msgstr "Ingen spårningslogg har startats för denna session."
+
+#. #define MAX_TEMPCOUNT_REACHED
+#: LYMessages.c:769
+msgid "The maximum temporary file count has been reached!"
+msgstr "Maximalt antal temporärfiler har nåtts!"
+
+#. #define FORM_VALUE_TOO_LONG
+#: LYMessages.c:771
+msgid "Form field value exceeds buffer length! Trim the tail."
+msgstr "Värdet för formulärfält är längre än bufferten! Klipp på slutet."
+
+#. #define FORM_TAIL_COMBINED_WITH_HEAD
+#: LYMessages.c:773
+msgid "Modified tail combined with head of form field value."
+msgstr "Modifierad avslutning kombinerad med huvudet i formulärfältsvärdet."
+
+#. HTFile.c
+#: LYMessages.c:776
+msgid "Directory"
+msgstr "Katalog"
+
+#: LYMessages.c:777
+msgid "Directory browsing is not allowed."
+msgstr "Katalogbläddring tillåts ej."
+
+#: LYMessages.c:778
+msgid "Selective access is not enabled for this directory"
+msgstr "Selektiv åtkomst är inte tillgänglig för denna katalog"
+
+#: LYMessages.c:779
+msgid "Multiformat: directory scan failed."
+msgstr "Multiformat: katalogavsökning misslyckades."
+
+#: LYMessages.c:780
+msgid "This directory is not readable."
+msgstr "Denna katalog är inte läsbar."
+
+#: LYMessages.c:781
+msgid "Can't access requested file."
+msgstr "Kan inte komma åt vald fil."
+
+#: LYMessages.c:782
+msgid "Could not find suitable representation for transmission."
+msgstr "Kunde inte hitta en lämplig representation för överföring."
+
+#: LYMessages.c:783
+msgid "Could not open file for decompression!"
+msgstr "Kunde inte öppna filen för dekomprimering!"
+
+#: LYMessages.c:784
+msgid "Files:"
+msgstr "Filer:"
+
+#: LYMessages.c:785
+msgid "Subdirectories:"
+msgstr "Underkataloger:"
+
+#: LYMessages.c:786
+msgid " directory"
+msgstr " katalog"
+
+#: LYMessages.c:787
+msgid "Up to "
+msgstr "Upp till "
+
+#: LYMessages.c:788
+msgid "Current directory is "
+msgstr "Aktuell katalog är "
+
+#. HTFTP.c
+#: LYMessages.c:791
+msgid "Symbolic Link"
+msgstr "Symbolisk länk"
+
+#. HTGopher.c
+#: LYMessages.c:794
+msgid "No response from server!"
+msgstr "Inget svar från servern!"
+
+#: LYMessages.c:795
+msgid "CSO index"
+msgstr "CSO-index"
+
+#: LYMessages.c:796
+msgid ""
+"\n"
+"This is a searchable index of a CSO database.\n"
+msgstr ""
+"\n"
+"Detta är ett sökbart index i en CSO-databas.\n"
+
+#: LYMessages.c:797
+msgid "CSO Search Results"
+msgstr "CSO-sökresultat"
+
+#: LYMessages.c:798
+#, c-format
+msgid "Seek fail on %s\n"
+msgstr "Sökning misslyckades på %s\n"
+
+#: LYMessages.c:799
+msgid ""
+"\n"
+"Press the 's' key and enter search keywords.\n"
+msgstr ""
+"\n"
+"Tryck \"s\"-tangenten och ange söknyckelord.\n"
+
+#: LYMessages.c:800
+msgid ""
+"\n"
+"This is a searchable Gopher index.\n"
+msgstr ""
+"\n"
+"Detta är ett sökbart Gopherindex.\n"
+
+#: LYMessages.c:801
+msgid "Gopher index"
+msgstr "Gopherindex"
+
+#: LYMessages.c:802
+msgid "Gopher Menu"
+msgstr "Gophermeny"
+
+#: LYMessages.c:803
+msgid " Search Results"
+msgstr " Sökresultats"
+
+#: LYMessages.c:804
+msgid "Sending CSO/PH request."
+msgstr "Sänder CSO/PH-fråga."
+
+#: LYMessages.c:805
+msgid "Sending Gopher request."
+msgstr "Sänder Gopherfråga."
+
+#: LYMessages.c:806
+msgid "CSO/PH request sent; waiting for response."
+msgstr "CSO/PH-fråga sänd; väntar på svar."
+
+#: LYMessages.c:807
+msgid "Gopher request sent; waiting for response."
+msgstr "Gopherfråga sänd; väntar på svar."
+
+#: LYMessages.c:808
+msgid ""
+"\n"
+"Please enter search keywords.\n"
+msgstr ""
+"\n"
+"Ange söknyckelord.\n"
+
+#: LYMessages.c:809
+msgid ""
+"\n"
+"The keywords that you enter will allow you to search on a"
+msgstr ""
+"\n"
+"Nyckelorden du anger gör det möjligt att söka på en"
+
+#: LYMessages.c:810
+msgid " person's name in the database.\n"
+msgstr " persons namn i databasen.\n"
+
+#. HTNews.c
+#: LYMessages.c:813
+msgid "Connection closed ???"
+msgstr "Anslutning stängd???"
+
+#: LYMessages.c:814
+msgid "Cannot open temporary file for news POST."
+msgstr "Kan inte öppna temporärfil för diskussionsinlägg."
+
+#: LYMessages.c:815
+msgid "This client does not contain support for posting to news with SSL."
+msgstr "Denna klient innehåller inte stöd för att posta inlägg över SSL."
+
+#. HTStyle.c
+#: LYMessages.c:818
+#, c-format
+msgid "Style %d `%s' SGML:%s. Font %s %.1f point.\n"
+msgstr "Stil %d \"%s\" SGML:%s. Teckensnitt %s %.1f punkter.\n"
+
+#: LYMessages.c:820
+#, c-format
+msgid "\tAlign=%d, %d tabs. (%.0f before, %.0f after)\n"
+msgstr "\tJustering=%d, %d tabbar. (%.0f före, %.0f efter)\n"
+
+#: LYMessages.c:821
+#, c-format
+msgid "\t\tTab kind=%d at %.0f\n"
+msgstr "\t\tTabbsort=%d på %.0f\n"
+
+#. HTTP.c
+#: LYMessages.c:824
+msgid "Can't proceed without a username and password."
+msgstr "Kan inte fortsätta utan användar-id och lösenord."
+
+#: LYMessages.c:825
+msgid "Can't retry with authorization! Contact the server's WebMaster."
+msgstr "Kan inte försöka igen utan tillåtelse! Kontakta serverns ansvariga."
+
+#: LYMessages.c:826
+msgid "Can't retry with proxy authorization! Contact the server's WebMaster."
+msgstr "Kan ej försöka igen utan mellanserverauktorisering! Kontakta serverns ansvariga."
+
+#: LYMessages.c:827
+msgid "Retrying with proxy authorization information."
+msgstr "Försöker igen med mellanserverauktoriseringsinformation."
+
+#: LYMessages.c:828
+#, c-format
+msgid "SSL error:%s-Continue?"
+msgstr "SSL-fel:%s-Fortsätta?"
+
+#. HTWAIS.c
+#: LYMessages.c:831
+msgid "HTWAIS: Return message too large."
+msgstr "HTWAIS: Returmeddelande för stort."
+
+#: LYMessages.c:832
+msgid "Enter WAIS query: "
+msgstr "Ange WAIS-fråga: "
+
+#. Miscellaneous status
+#: LYMessages.c:835
+msgid "Retrying as HTTP0 request."
+msgstr "Försöker ingen som HTTP0-fråga."
+
+#: LYMessages.c:836
+#, c-format
+msgid "Transferred %d bytes"
+msgstr "Överförde %d byte"
+
+#: LYMessages.c:837
+msgid "Data transfer complete"
+msgstr "Dataöverföring färdig"
+
+#: LYMessages.c:838
+#, c-format
+msgid "Error processing line %d of %s\n"
+msgstr "Fel vid tolkning av rad %d i %s\n"
+
+#. Lynx internal page titles
+#: LYMessages.c:841
+msgid "Address List Page"
+msgstr "Adresslistesida"
+
+#: LYMessages.c:842
+msgid "Bookmark file"
+msgstr "Bokmärkesfil"
+
+#: LYMessages.c:843
+msgid "Configuration Definitions"
+msgstr "Konfigurationsdefinitioner"
+
+#: LYMessages.c:844
+msgid "Cookie Jar"
+msgstr "Kakburk"
+
+#: LYMessages.c:845
+msgid "Current Edit-Key Map"
+msgstr "Aktuella tangentbordsbindningar för redigering"
+
+#: LYMessages.c:846
+msgid "Current Key Map"
+msgstr "Aktuella tangentbordsbindningar"
+
+#: LYMessages.c:847
+msgid "File Management Options"
+msgstr "Filhanteringsalternativ"
+
+#: LYMessages.c:848
+msgid "Download Options"
+msgstr "Hämtningalternativ"
+
+#: LYMessages.c:849
+msgid "History Page"
+msgstr "Historiksida"
+
+#: LYMessages.c:850
+msgid "Cache Jar"
+msgstr "Cacheburk"
+
+#: LYMessages.c:851
+msgid "List Page"
+msgstr "Listsida"
+
+#: LYMessages.c:852
+msgid "Lynx.cfg Information"
+msgstr "Lynx.cfg-information"
+
+#: LYMessages.c:853
+msgid "Converted Mosaic Hotlist"
+msgstr "Konverterade Mosaicbokmärken"
+
+#: LYMessages.c:854
+msgid "Options Menu"
+msgstr "Alternativmeny"
+
+#: LYMessages.c:855
+msgid "File Permission Options"
+msgstr "Filbehörighetsalternativ"
+
+#: LYMessages.c:856
+msgid "Printing Options"
+msgstr "Utskriftsalternativ"
+
+#: LYMessages.c:857
+msgid "Information about the current document"
+msgstr "Information om det aktuella dokumentet"
+
+#: LYMessages.c:858
+msgid "Your recent statusline messages"
+msgstr "Dina senaste statusradmeddelanden"
+
+#: LYMessages.c:859
+msgid "Upload Options"
+msgstr "Insändningsalternativ"
+
+#: LYMessages.c:860
+msgid "Visited Links Page"
+msgstr "Använda länkar"
+
+#. CONFIG_DEF_TITLE subtitles
+#: LYMessages.c:863
+msgid "See also"
+msgstr "Se även"
+
+#: LYMessages.c:864
+msgid "your"
+msgstr "din"
+
+#: LYMessages.c:865
+msgid "for runtime options"
+msgstr "för körningsalternativ"
+
+#: LYMessages.c:866
+msgid "compile time options"
+msgstr "kompileringsalternativ"
+
+#: LYMessages.c:867
+msgid "color-style configuration"
+msgstr "konfigurering av color-style"
+
+#: LYMessages.c:868
+msgid "latest release"
+msgstr "senaste utgåva"
+
+#: LYMessages.c:869
+msgid "pre-release version"
+msgstr "förhandsversion"
+
+#: LYMessages.c:870
+msgid "development version"
+msgstr "utvecklingsversion"
+
+#. #define AUTOCONF_CONFIG_CACHE
+#: LYMessages.c:872
+msgid ""
+"The following data were derived during the automatic configuration/build\n"
+"process of this copy of Lynx. When reporting a bug, please include a copy\n"
+"of this page."
+msgstr ""
+"Följande data hämtades under den automatiska konfigurations-/kompilerings-\n"
+"processen för din kopia av Lynx. När du rapporterar ett fel ber vi dig\n"
+"inkludera en kopia av denna sida."
+
+#. #define AUTOCONF_LYNXCFG_H
+#: LYMessages.c:876
+msgid ""
+"The following data were used as automatically-configured compile-time\n"
+"definitions when this copy of Lynx was built."
+msgstr ""
+"Följande data användes som automatiskt konfigurerade kompileringsdefinitioner\n"
+"när denna kopia av Lynx kompilerades."
+
+#. #define DIRED_NOVICELINE
+#: LYMessages.c:881
+msgid " C)reate D)ownload E)dit F)ull menu M)odify R)emove T)ag U)pload \n"
+msgstr "C=Skapa D=Hämta E=Redigera F=Full meny M=Ändra R=Radera T=Märk U=Skicka\n"
+
+#: LYMessages.c:882
+msgid "Failed to obtain status of current link!"
+msgstr "Kunde inte hämta status för aktuell länk!"
+
+#. #define INVALID_PERMIT_URL
+#: LYMessages.c:885
+msgid "Special URL only valid from current File Permission menu!"
+msgstr "Speciell adress endast giltig i menyn för filbehörigheter!"
+
+#: LYMessages.c:889
+msgid "External support is currently disabled."
+msgstr "Externt stöd är just nu deaktiverat."
+
+#. new with 2.8.4dev.21
+#: LYMessages.c:893
+msgid "Changing working-directory is currently disabled."
+msgstr "Byte av arbetskatalog tillåts ej just nu."
+
+#: LYMessages.c:894
+msgid "Linewrap OFF!"
+msgstr "Radbrytning AV!"
+
+#: LYMessages.c:895
+msgid "Linewrap ON!"
+msgstr "Radbrytning PÃ…!"
+
+#: LYMessages.c:896
+msgid "Parsing nested-tables toggled OFF! Reloading..."
+msgstr "Tolkning av nästlade tabeller AV! Hämtar om..."
+
+#: LYMessages.c:897
+msgid "Parsing nested-tables toggled ON! Reloading..."
+msgstr "Tolkning av nästlade tabeller PÅ! Hämtar om..."
+
+#: LYMessages.c:898
+msgid "Shifting is disabled while line-wrap is in effect"
+msgstr "Skiftning är deaktiverad när radbrytning är aktiv"
+
+#: LYMessages.c:899
+msgid "Trace not supported"
+msgstr "Spårning stöds ej"
+
+#: LYMessages.c:819
+#, c-format
+msgid "\tIndents: first=%.0f others=%.0f, Height=%.1f Desc=%.1f\n"
+msgstr "\tIndrag: första=%.0f övriga=%.0f, Höjd=%.1f Djup=%.1f\n"
+
+#: WWW/Library/Implementation/HTAABrow.c:575
+#, c-format
+msgid "username for realm %s changed from %s to %s"
+msgstr "användar-id för sfären %s ändrades från %s till %s"
+
+#: WWW/Library/Implementation/HTAABrow.c:591
+#, c-format
+msgid "password for realm %s user %s changed"
+msgstr "lösenordet för sfär %s användare %s ändrades"
+
+#: WWW/Library/Implementation/HTAABrow.c:703
+#, c-format
+msgid "Username for '%s' at %s '%s%s':"
+msgstr "Användar-id för \"%s\" på %s \"%s%s\":"
+
+#: WWW/Library/Implementation/HTAABrow.c:976
+msgid "This client doesn't know how to compose proxy authorization information for scheme"
+msgstr "Denna klient kan inte skapa mellanserverauktoriseringsinformation för protokolltyp"
+
+#: WWW/Library/Implementation/HTAABrow.c:1053
+msgid "This client doesn't know how to compose authorization information for scheme"
+msgstr "Denna klient kan inte skapa auktoriseringsinformation för protokolltyp"
+
+#: WWW/Library/Implementation/HTAABrow.c:1162
+#, c-format
+msgid "Invalid header '%s%s%s%s%s'"
+msgstr "Felaktigt huvud \"%s%s%s%s%s\""
+
+#: WWW/Library/Implementation/HTAABrow.c:1266
+msgid "Proxy authorization required -- retrying"
+msgstr "Mellanserverauktorisering krävs -- försöker igen"
+
+#: WWW/Library/Implementation/HTAABrow.c:1322
+msgid "Access without authorization denied -- retrying"
+msgstr "Åtkomst utan auktorisering avvisad -- försöker igen"
+
+#: WWW/Library/Implementation/HTAccess.c:698
+msgid "Access forbidden by rule"
+msgstr "Åtkomst förbjuden av regel"
+
+#: WWW/Library/Implementation/HTAccess.c:800
+msgid "Document with POST content not found in cache. Resubmit?"
+msgstr "Dokument med POST-data hittades ej i cache. Skicka in igen?"
+
+#: WWW/Library/Implementation/HTAccess.c:953
+msgid "Loading failed, use a previous copy."
+msgstr "Hämtningen misslyckades, använder tidigare exemplar."
+
+#: WWW/Library/Implementation/HTAccess.c:1062 src/GridText.c:8939
+msgid "Loading incomplete."
+msgstr "Hämtning ej komplett."
+
+#: WWW/Library/Implementation/HTAccess.c:1093
+#, c-format
+msgid "**** HTAccess: socket or file number returned by obsolete load routine!\n"
+msgstr "**** HTAccess: uttag eller filnummer returnerad av föråldrad inläsningsrutin!\n"
+
+#: WWW/Library/Implementation/HTAccess.c:1095
+#, c-format
+msgid "**** HTAccess: Internal software error. Please mail lynx-dev@nongnu.org!\n"
+msgstr "**** HTAccess: Internt programvarufel. Meddela lynx-dev@nongnu.org!\n"
+
+#: WWW/Library/Implementation/HTAccess.c:1096
+#, c-format
+msgid "**** HTAccess: Status returned was: %d\n"
+msgstr "**** HTAccess: Returnerad status var: %d\n"
+
+#.
+#. * hack: if we fail in HTAccess.c
+#. * avoid duplicating URL, oh.
+#.
+#: WWW/Library/Implementation/HTAccess.c:1102 src/LYMainLoop.c:8076
+msgid "Can't Access"
+msgstr "Kan inte komma åt"
+
+#: WWW/Library/Implementation/HTAccess.c:1110
+msgid "Unable to access document."
+msgstr "Kan inte komma åt dokument."
+
+#: WWW/Library/Implementation/HTFTP.c:870
+#, c-format
+msgid "Enter password for user %s@%s:"
+msgstr "Ange lösenord för användar-id %s@%s:"
+
+#: WWW/Library/Implementation/HTFTP.c:898
+msgid "Unable to connect to FTP host."
+msgstr "Kan inte ansluta till ftp-värd."
+
+#: WWW/Library/Implementation/HTFTP.c:1137
+msgid "close master socket"
+msgstr "stängd huvuduttag (master socket)"
+
+#: WWW/Library/Implementation/HTFTP.c:1195
+msgid "socket for master socket"
+msgstr "uttag (socket) för huvuduttag"
+
+#: WWW/Library/Implementation/HTFTP.c:2925
+msgid "Receiving FTP directory."
+msgstr "Hämtar ftp-katalog."
+
+#: WWW/Library/Implementation/HTFTP.c:3063
+#, c-format
+msgid "Transferred %d bytes (%5d)"
+msgstr "Överförde %d byte (%5d)"
+
+#: WWW/Library/Implementation/HTFTP.c:3421
+msgid "connect for data"
+msgstr "ansluter för data"
+
+#: WWW/Library/Implementation/HTFTP.c:4098
+msgid "Receiving FTP file."
+msgstr "Hämtar ftp-fil."
+
+#: WWW/Library/Implementation/HTFinger.c:274
+msgid "Could not set up finger connection."
+msgstr "Kunde inte skapa \"finger\"-anslutning."
+
+#: WWW/Library/Implementation/HTFinger.c:321
+msgid "Could not load data (no sitename in finger URL)"
+msgstr "Kunde inte hämta data (inget värdnamn i \"finger\"-adress)"
+
+#: WWW/Library/Implementation/HTFinger.c:325
+msgid "Invalid port number - will only use port 79!"
+msgstr "Felaktigt portnummer - använder endast port 79!"
+
+#: WWW/Library/Implementation/HTFinger.c:391
+msgid "Could not access finger host."
+msgstr "Kunde inta komma åt \"finger\"-värd."
+
+#: WWW/Library/Implementation/HTFinger.c:399
+msgid "No response from finger server."
+msgstr "Inget svar från \"finger\"-server."
+
+#: WWW/Library/Implementation/HTNews.c:439
+#, c-format
+msgid "Username for news host '%s':"
+msgstr "Användar-id för diskussionsvärd \"%s\":"
+
+#: WWW/Library/Implementation/HTNews.c:492
+msgid "Change username?"
+msgstr "Ändra användar-id?"
+
+#: WWW/Library/Implementation/HTNews.c:496
+msgid "Username:"
+msgstr "Användar-id:"
+
+#: WWW/Library/Implementation/HTNews.c:521
+#, c-format
+msgid "Password for news host '%s':"
+msgstr "Lösenord för diskussionsvärd \"%s\":"
+
+#: WWW/Library/Implementation/HTNews.c:604
+msgid "Change password?"
+msgstr "Ändra lösenord?"
+
+#: WWW/Library/Implementation/HTNews.c:1725
+#, c-format
+msgid "No matches for: %s"
+msgstr "Inga träffar för: %s"
+
+#: WWW/Library/Implementation/HTNews.c:1775
+msgid ""
+"\n"
+"No articles in this group.\n"
+msgstr ""
+"\n"
+"Inga artiklar i denna grupp.\n"
+
+#: WWW/Library/Implementation/HTNews.c:1787
+msgid ""
+"\n"
+"No articles in this range.\n"
+msgstr ""
+"\n"
+"Inga artiklar i detta område.\n"
+
+#.
+#. * Set window title.
+#.
+#: WWW/Library/Implementation/HTNews.c:1800
+#, c-format
+msgid "%s, Articles %d-%d"
+msgstr "%s, artiklar %d-%d"
+
+#: WWW/Library/Implementation/HTNews.c:1823
+msgid "Earlier articles"
+msgstr "Tidigare artiklar"
+
+#: WWW/Library/Implementation/HTNews.c:1836
+#, c-format
+msgid ""
+"\n"
+"There are about %d articles currently available in %s, IDs as follows:\n"
+"\n"
+msgstr ""
+"\n"
+"Det finns ca %d artiklar tillgängliga i %s nu med följande identifierare:\n"
+"\n"
+
+#: WWW/Library/Implementation/HTNews.c:1898
+msgid "All available articles in "
+msgstr "Alla tillgängliga artiklar i "
+
+#: WWW/Library/Implementation/HTNews.c:2112
+msgid "Later articles"
+msgstr "Senare artiklar"
+
+#: WWW/Library/Implementation/HTNews.c:2135
+msgid "Post to "
+msgstr "Skicka till "
+
+#: WWW/Library/Implementation/HTNews.c:2356
+msgid "This client does not contain support for SNEWS URLs."
+msgstr "Denna klient innehåller inte stöd för SNEWS-adresser."
+
+#: WWW/Library/Implementation/HTNews.c:2565
+msgid "No target for raw text!"
+msgstr "Inget mål för rå text!"
+
+#: WWW/Library/Implementation/HTNews.c:2595
+msgid "Connecting to NewsHost ..."
+msgstr "Ansluter till diskussionsvärd..."
+
+#: WWW/Library/Implementation/HTNews.c:2647
+#, c-format
+msgid "Could not access %s."
+msgstr "Kunde inte komma åt %s."
+
+#: WWW/Library/Implementation/HTNews.c:2753
+#, c-format
+msgid "Can't read news info. News host %.20s responded: %.200s"
+msgstr "Kan inte läsa diskussionsinformation. Värden %.20s svarade %.200s"
+
+#: WWW/Library/Implementation/HTNews.c:2757
+#, c-format
+msgid "Can't read news info, empty response from host %s"
+msgstr "Kan inte läsa diskussionsinformation, tomt svar från värd %s"
+
+#.
+#. * List available newsgroups. - FM
+#.
+#: WWW/Library/Implementation/HTNews.c:2961
+msgid "Reading list of available newsgroups."
+msgstr "Läser lista över tillgängliga grupper."
+
+#: WWW/Library/Implementation/HTNews.c:2982
+msgid "Reading list of articles in newsgroup."
+msgstr "Läser lista över artiklar i grupp."
+
+#.
+#. * Get an article from a news group. - FM
+#.
+#: WWW/Library/Implementation/HTNews.c:2988
+msgid "Reading news article."
+msgstr "Läser artikel."
+
+#: WWW/Library/Implementation/HTNews.c:3018
+msgid "Sorry, could not load requested news."
+msgstr "Kunde inte hämta begärda artiklar."
+
+#: WWW/Library/Implementation/HTTCP.c:1339
+msgid "Address has invalid port"
+msgstr "Adressen har en ogiltig port"
+
+#: WWW/Library/Implementation/HTTCP.c:1410
+msgid "Address length looks invalid"
+msgstr "Adresslängden verkar ogiltig"
+
+#: WWW/Library/Implementation/HTTCP.c:1868
+msgid "SOCKS5: no hostname found."
+msgstr "SOCKS5: inget värdnamn upptäcktes."
+
+#: WWW/Library/Implementation/HTTCP.c:1874
+msgid "SOCKS5: hostname too long."
+msgstr "SOCKS5: värdnamnet för långt."
+
+#: WWW/Library/Implementation/HTTCP.c:1892
+#, c-format
+msgid "(for %s at %s) SOCKS5"
+msgstr "(för %s på %s) SOCKS5"
+
+#: WWW/Library/Implementation/HTTCP.c:1919
+#: WWW/Library/Implementation/HTTCP.c:1936
+#, c-format
+msgid "Unable to locate remote host %s."
+msgstr "Kan inte hitta värd %s."
+
+#. Not HTProgress, so warning won't be overwritten immediately;
+#. * but not HTAlert, because typically there will be other
+#. * alerts from the callers. - kw
+#.
+#: WWW/Library/Implementation/HTTCP.c:1933
+#: WWW/Library/Implementation/HTTelnet.c:115
+#, c-format
+msgid "Invalid hostname %s"
+msgstr "Ogiltigt värdnamn %s"
+
+#: WWW/Library/Implementation/HTTCP.c:1945
+#, c-format
+msgid "Making %s connection to %s"
+msgstr "Kopplar upp %s-anslutning till %s"
+
+#: WWW/Library/Implementation/HTTCP.c:1955
+msgid "socket failed."
+msgstr "uttag misslyckades."
+
+#: WWW/Library/Implementation/HTTCP.c:1969
+#, c-format
+msgid "socket failed: family %d addr %s port %s."
+msgstr "uttag misslyckades: familj %d adress %s port %s."
+
+#: WWW/Library/Implementation/HTTCP.c:1992
+msgid "Could not make connection non-blocking."
+msgstr "Kunde inte koppla upp icke-blockerande anslutning."
+
+#: WWW/Library/Implementation/HTTCP.c:2058
+msgid "Connection failed (too many retries)."
+msgstr "Uppkoppling misslyckades (för många försök)."
+
+#: WWW/Library/Implementation/HTTCP.c:2253
+msgid "Could not restore socket to blocking."
+msgstr "Kunde inte återställa blockering i uttag."
+
+#. RFC 1928: CONNECT request
+#: WWW/Library/Implementation/HTTCP.c:2285
+#, c-format
+msgid "SOCKS5: connecting to %s"
+msgstr "SOCKS5: ansluter till %s"
+
+#: WWW/Library/Implementation/HTTCP.c:2314
+msgid "SOCKS server failure"
+msgstr "SOCKS-serverfel"
+
+#: WWW/Library/Implementation/HTTCP.c:2317
+msgid "connection not allowed by ruleset"
+msgstr "anslutning inte tillåten av regeluppsättning"
+
+#: WWW/Library/Implementation/HTTCP.c:2320
+msgid "network unreachable"
+msgstr "nätverket kan inte nås"
+
+#: WWW/Library/Implementation/HTTCP.c:2323
+msgid "host unreachable"
+msgstr "värden kan inte nås"
+
+#: WWW/Library/Implementation/HTTCP.c:2326
+msgid "connection refused"
+msgstr "anslutningen avslogs"
+
+#: WWW/Library/Implementation/HTTCP.c:2329
+msgid "TTL expired"
+msgstr "TTL utlöpte"
+
+#: WWW/Library/Implementation/HTTCP.c:2332
+msgid "command not supported"
+msgstr "kommandot stöds ej"
+
+#: WWW/Library/Implementation/HTTCP.c:2335
+msgid "address type not supported"
+msgstr "addresstypen stöds ej"
+
+#: WWW/Library/Implementation/HTTCP.c:2338
+msgid "unknown SOCKS error code"
+msgstr "okänd SOCKS-felkod"
+
+#: WWW/Library/Implementation/HTTCP.c:2383
+msgid "unexpected reply\n"
+msgstr "oväntat svar\n"
+
+#: WWW/Library/Implementation/HTTCP.c:2460
+msgid "Socket read failed (too many tries)."
+msgstr "Fel vid läsning från uttag (för många försök)."
+
+#: WWW/Library/Implementation/HTTP.c:165
+#, c-format
+msgid "SSL callback:%s, preverify_ok=%d, ssl_okay=%d"
+msgstr "SSL-Ã¥teranrop:%s, preverify_ok=%d, ssl_okay=%d"
+
+#: WWW/Library/Implementation/HTTP.c:668
+#, c-format
+msgid "User/password contains only punctuation: %s"
+msgstr "Användar-id/lösenord innehåller endast interpunktion: %s"
+
+#: WWW/Library/Implementation/HTTP.c:672
+#, c-format
+msgid "User/password may be confused with hostname: '%s' (e.g, '%s')"
+msgstr "Användar-id/lösenord kan förväxlas med värdnamn: \"%s\" (d.v.s., \"%s\")"
+
+#: WWW/Library/Implementation/HTTP.c:733
+#, c-format
+msgid "Certificate issued by: %s"
+msgstr "Certifikatutfärdare: %s"
+
+#: WWW/Library/Implementation/HTTP.c:922
+msgid "This client does not contain support for HTTPS URLs."
+msgstr "Denna klient innehåller inte stöd för HTTPS-adresser."
+
+#: WWW/Library/Implementation/HTTP.c:947
+msgid "Unable to connect to remote host."
+msgstr "Kan inte ansluta till värd."
+
+#: WWW/Library/Implementation/HTTP.c:990
+msgid "Retrying connection without TLS."
+msgstr "Gör nytt försök; ansluter utan TLS."
+
+#: WWW/Library/Implementation/HTTP.c:1042
+msgid "GnuTLS error when trying to verify certificate."
+msgstr "Fel i GnuTLS när certifikatet skulle bekräftas."
+
+#: WWW/Library/Implementation/HTTP.c:1055
+msgid "the certificate has no known issuer"
+msgstr "certifikatet har ingen känd utfärdare"
+
+#: WWW/Library/Implementation/HTTP.c:1057
+msgid "no issuer was found"
+msgstr "ingen utfärdare hittades"
+
+#: WWW/Library/Implementation/HTTP.c:1059
+msgid "issuer is not a CA"
+msgstr "utfärdaren är inte ett certifieringsorgan"
+
+#: WWW/Library/Implementation/HTTP.c:1061
+msgid "the certificate has been revoked"
+msgstr "certifikatet har återkallats"
+
+#: WWW/Library/Implementation/HTTP.c:1063
+msgid "the certificate is not trusted"
+msgstr "certifikatet är inte betrott"
+
+#: WWW/Library/Implementation/HTTP.c:1138
+#, c-format
+msgid "Verified connection to %s (cert=%s)"
+msgstr "Verifierade anslutning mot %s (cert=%s)"
+
+#: WWW/Library/Implementation/HTTP.c:1188
+#: WWW/Library/Implementation/HTTP.c:1230
+#, c-format
+msgid "Verified connection to %s (subj=%s)"
+msgstr "Verifierade anslutning mot %s (subj=%s)"
+
+#: WWW/Library/Implementation/HTTP.c:1260
+msgid "Can't find common name in certificate"
+msgstr "Hittar inte vanligt namn i certifikatet"
+
+#: WWW/Library/Implementation/HTTP.c:1263
+#, c-format
+msgid "SSL error:host(%s)!=cert(%s)-Continue?"
+msgstr "SSL-fel:värd(%s)!=cert(%s)-Fortsätta?"
+
+#: WWW/Library/Implementation/HTTP.c:1270
+msgid "SSL error"
+msgstr "SSL-fel"
+
+#: WWW/Library/Implementation/HTTP.c:1278
+#, c-format
+msgid "UNVERIFIED connection to %s (cert=%s)"
+msgstr "OVERIFIERAD anslutning mot %s (cert=%s)"
+
+# %d = SSL_get_cipher_bits(handle,NULL)
+# %s = SSL_get_cipher_version(handle)
+# %s = SSL_get_cipher(handle)
+#: WWW/Library/Implementation/HTTP.c:1287
+#, c-format
+msgid "Secure %d-bit %s (%s) HTTP connection"
+msgstr "Säker %d-bitars HTTP-anslutning med %s (%s)"
+
+#: WWW/Library/Implementation/HTTP.c:1757
+msgid "Sending HTTP request."
+msgstr "Sänder HTTP-fråga."
+
+#: WWW/Library/Implementation/HTTP.c:1799
+msgid "Unexpected network write error; connection aborted."
+msgstr "Oväntat skrivfel på nätverket; uppkopplingen avbröts."
+
+#: WWW/Library/Implementation/HTTP.c:1805
+msgid "HTTP request sent; waiting for response."
+msgstr "HTTP-fråga sänd; väntar på svar."
+
+#: WWW/Library/Implementation/HTTP.c:1878
+#: WWW/Library/Implementation/HTTP.c:1888
+msgid "Unexpected network read error; connection aborted."
+msgstr "Oväntat läsfel på nätverket; uppkopplingen avbröts."
+
+#.
+#. * HTTP/1.1 Informational statuses.
+#. * 100 Continue.
+#. * 101 Switching Protocols.
+#. * > 101 is unknown.
+#. * We should never get these, and they have only the status
+#. * line and possibly other headers, so we'll deal with them by
+#. * showing the full header to the user as text/plain. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2091
+msgid "Got unexpected Informational Status."
+msgstr "Fick oväntad informationsstatus."
+
+#.
+#. * Reset Content. The server has fulfilled the request but
+#. * nothing is returned and we should reset any form
+#. * content. We'll instruct the user to do that, and
+#. * restore the current document. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2125
+msgid "Request fulfilled. Reset Content."
+msgstr "Frågan slutförd. Nollställ innehåll."
+
+#. Not Modified
+#.
+#. * We didn't send an "If-Modified-Since" header, so this
+#. * status is inappropriate. We'll deal with it by showing
+#. * the full header to the user as text/plain. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2242
+msgid "Got unexpected 304 Not Modified status."
+msgstr "Fick oväntad \"ej modifierad\"-(304)-status."
+
+#: WWW/Library/Implementation/HTTP.c:2305
+msgid "Redirection of POST content requires user approval."
+msgstr "Omdirigering av POST-innehåll kräver användarens samtycke."
+
+#: WWW/Library/Implementation/HTTP.c:2320
+msgid "Have POST content. Treating Permanent Redirection as Temporary.\n"
+msgstr "Har POST-innehåll. Behandlar permanent omdirigering som temporär.\n"
+
+#: WWW/Library/Implementation/HTTP.c:2366
+msgid "Retrying with access authorization information."
+msgstr "Försöker igen med auktoriseringsinformation."
+
+#: WWW/Library/Implementation/HTTP.c:2378
+msgid "Show the 401 message body?"
+msgstr "Visa kroppen för 401-meddelandet?"
+
+#: WWW/Library/Implementation/HTTP.c:2422
+msgid "Show the 407 message body?"
+msgstr "Via kroppen för 407-meddelandet?"
+
+#.
+#. * Bad or unknown server_status number. Take a chance and hope
+#. * there is something to display. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2522
+msgid "Unknown status reply from server!"
+msgstr "Okänt statussvar från server!"
+
+#: WWW/Library/Implementation/HTTelnet.c:113
+#, c-format
+msgid "remote %s session:"
+msgstr "fjärr-%s-session:"
+
+#: WWW/Library/Implementation/HTWAIS.c:163
+msgid "Could not connect to WAIS server."
+msgstr "Kunde inte ansluta till WAIS-server."
+
+#: WWW/Library/Implementation/HTWAIS.c:171
+msgid "Could not open WAIS connection for reading."
+msgstr "Kunde inte öppna WAIS-anslutning för läsning."
+
+#: WWW/Library/Implementation/HTWAIS.c:193
+msgid "Diagnostic code is "
+msgstr "Diagnostisk kod är "
+
+#: WWW/Library/Implementation/HTWAIS.c:460
+msgid "Index "
+msgstr "Index "
+
+#: WWW/Library/Implementation/HTWAIS.c:464
+#, c-format
+msgid " contains the following %d item%s relevant to \""
+msgstr " innehåller följande %d%s poster relevanta för \""
+
+#: WWW/Library/Implementation/HTWAIS.c:472
+msgid "The first figure after each entry is its relative score, "
+msgstr "Den första siffran efter varje post är dess relativa poäng, "
+
+#: WWW/Library/Implementation/HTWAIS.c:473
+msgid "the second is the number of lines in the item."
+msgstr "den andra är antalet rader i posten"
+
+#: WWW/Library/Implementation/HTWAIS.c:515
+msgid " (bad file name)"
+msgstr " (felaktigt filnamn)"
+
+#: WWW/Library/Implementation/HTWAIS.c:541
+msgid "(bad doc id)"
+msgstr "(felaktig dokument-id)"
+
+#: WWW/Library/Implementation/HTWAIS.c:557
+msgid "(Short Header record, can't display)"
+msgstr "(Kort huvudpost, kan inte visa)"
+
+#: WWW/Library/Implementation/HTWAIS.c:564
+msgid ""
+"\n"
+"Long Header record, can't display\n"
+msgstr ""
+"\n"
+"LÃ¥ng huvudpost, kan inte visa\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:571
+msgid ""
+"\n"
+"Text record\n"
+msgstr ""
+"\n"
+"Textfält\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:580
+msgid ""
+"\n"
+"Headline record, can't display\n"
+msgstr ""
+"\n"
+"Rubrikfält, kan inte visa\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:588
+msgid ""
+"\n"
+"Code record, can't display\n"
+msgstr ""
+"\n"
+"Kodfält, kan inte visa\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:692
+msgid "Syntax error in WAIS URL"
+msgstr "Syntaxfel i WAIS-adress"
+
+#: WWW/Library/Implementation/HTWAIS.c:764
+msgid " (WAIS Index)"
+msgstr " (WAIS-index)"
+
+#: WWW/Library/Implementation/HTWAIS.c:771
+msgid "WAIS Index: "
+msgstr "WAIS-index: "
+
+#: WWW/Library/Implementation/HTWAIS.c:777
+msgid "This is a link for searching the "
+msgstr "Detta är en länk för att söka i "
+
+#: WWW/Library/Implementation/HTWAIS.c:781
+msgid " WAIS Index.\n"
+msgstr " WAIS-index.\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:810
+msgid ""
+"\n"
+"Enter the 's'earch command and then specify search words.\n"
+msgstr ""
+"\n"
+"Välj S=sök och ange sedan sökord.\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:832
+msgid " (in "
+msgstr " (i "
+
+#: WWW/Library/Implementation/HTWAIS.c:841
+msgid "WAIS Search of \""
+msgstr "WAIS-sökning efter \""
+
+#: WWW/Library/Implementation/HTWAIS.c:845
+msgid "\" in: "
+msgstr "\" i: "
+
+#: WWW/Library/Implementation/HTWAIS.c:860
+msgid "HTWAIS: Request too large."
+msgstr "HTWAIS: Fråga för stor."
+
+#: WWW/Library/Implementation/HTWAIS.c:869
+msgid "Searching WAIS database..."
+msgstr "Söker WAIS-databas..."
+
+#: WWW/Library/Implementation/HTWAIS.c:879
+msgid "Search interrupted."
+msgstr "Sökning avbruten."
+
+#: WWW/Library/Implementation/HTWAIS.c:930
+msgid "Can't convert format of WAIS document"
+msgstr "Kan inte konvertera WAIS-dokumentformat"
+
+#: WWW/Library/Implementation/HTWAIS.c:974
+msgid "HTWAIS: Request too long."
+msgstr "HTWAIS: Fråga för lång."
+
+#.
+#. * Actually do the transaction given by request_message.
+#.
+#: WWW/Library/Implementation/HTWAIS.c:988
+msgid "Fetching WAIS document..."
+msgstr "Hämtar WAIS-dokument..."
+
+#. display_search_response(target, retrieval_response,
+#. wais_database, keywords);
+#: WWW/Library/Implementation/HTWAIS.c:1027
+msgid "No text was returned!\n"
+msgstr "Ingen text returnerades!\n"
+
+#: WWW/Library/Implementation/HTWSRC.c:302
+msgid " NOT GIVEN in source file; "
+msgstr " EJ ANGIVEN i källfilen; "
+
+#: WWW/Library/Implementation/HTWSRC.c:325
+msgid " WAIS source file"
+msgstr " WAIS-källfil"
+
+#: WWW/Library/Implementation/HTWSRC.c:332
+msgid " description"
+msgstr " beskrivning"
+
+#: WWW/Library/Implementation/HTWSRC.c:342
+msgid "Access links"
+msgstr "Åtkomstlänkar"
+
+#: WWW/Library/Implementation/HTWSRC.c:363
+msgid "Direct access"
+msgstr "Direktåtkomst"
+
+#. * Proxy will be used if defined, so let user know that - FM *
+#: WWW/Library/Implementation/HTWSRC.c:366
+msgid " (or via proxy server, if defined)"
+msgstr " (eller via mellanserver, om angiven)"
+
+#: WWW/Library/Implementation/HTWSRC.c:381
+msgid "Maintainer"
+msgstr "Ansvarig"
+
+#: WWW/Library/Implementation/HTWSRC.c:389
+msgid "Host"
+msgstr "Värd"
+
+#: src/GridText.c:723
+msgid "Memory exhausted, display interrupted!"
+msgstr "Minnet slut, visning avbruten!"
+
+#: src/GridText.c:728
+msgid "Memory exhausted, will interrupt transfer!"
+msgstr "Minnet slut, avbryter överföring!"
+
+# l = line
+#: src/GridText.c:1719
+#, c-format
+msgid " (l%d of %d)"
+msgstr " (r%d av %d)"
+
+# p = page
+#: src/GridText.c:1728
+#, c-format
+msgid " (p%d of %d)"
+msgstr " (s%d av %d)"
+
+#: src/GridText.c:3720
+msgid " *** MEMORY EXHAUSTED ***"
+msgstr " *** MINNET SLUT ***"
+
+#: src/GridText.c:6220
+msgid "text entry field"
+msgstr "textinmatningsfält"
+
+#: src/GridText.c:6223
+msgid "password entry field"
+msgstr "lösenordsinmatningsfält"
+
+#: src/GridText.c:6226
+msgid "checkbox"
+msgstr "kryssruta"
+
+#: src/GridText.c:6229
+msgid "radio button"
+msgstr "radioknapp"
+
+#: src/GridText.c:6232
+msgid "submit button"
+msgstr "sändknapp"
+
+#: src/GridText.c:6235
+msgid "reset button"
+msgstr "nollställningsknapp"
+
+#: src/GridText.c:6238
+msgid "script button"
+msgstr "skriptknapp"
+
+#: src/GridText.c:6241
+msgid "popup menu"
+msgstr "popup-meny"
+
+#: src/GridText.c:6244
+msgid "hidden form field"
+msgstr "dolt formulärfält"
+
+#: src/GridText.c:6247
+msgid "text entry area"
+msgstr "textinmatningsområde"
+
+#: src/GridText.c:6250
+msgid "range entry field"
+msgstr "områdesinmatningsfält"
+
+#: src/GridText.c:6253
+msgid "file entry field"
+msgstr "filinmatningsfält"
+
+#: src/GridText.c:6256
+msgid "text-submit field"
+msgstr "textsändfält"
+
+#: src/GridText.c:6259
+msgid "image-submit button"
+msgstr "bildsändfält"
+
+#: src/GridText.c:6262
+msgid "keygen field"
+msgstr "nyckelgenerering misslyckades"
+
+#: src/GridText.c:6265
+msgid "unknown form field"
+msgstr "okänt formulärfält"
+
+#: src/GridText.c:6285 src/GridText.c:6292 src/LYList.c:249
+msgid "unknown field or link"
+msgstr "okänt fält eller länk"
+
+#: src/GridText.c:10722
+msgid "Can't open file for uploading"
+msgstr "Kan inte öppna fil för sändning"
+
+#: src/GridText.c:11910
+#, c-format
+msgid "Submitting %s"
+msgstr "Skickar %s"
+
+#. ugliness has happened; inform user and do the best we can
+#: src/GridText.c:12980
+msgid "Hang Detect: TextAnchor struct corrupted - suggest aborting!"
+msgstr "Hängning upptäckt: TextAnchor-struktur förstörd - föreslår avbrott!"
+
+#. don't show previous state
+#: src/GridText.c:13139
+msgid "Wrap lines to fit displayed area?"
+msgstr "Ombryt rader så att de passar i visat fält?"
+
+#: src/GridText.c:13772
+msgid "Very long lines have been truncated!"
+msgstr "mycket långa rader har trunkerats!"
+
+#: src/HTAlert.c:164 src/LYShowInfo.c:389 src/LYShowInfo.c:393
+msgid "bytes"
+msgstr "byte"
+
+#.
+#. * If we know the total size of the file, we can compute
+#. * a percentage, and show a corresponding progress bar.
+#.
+#: src/HTAlert.c:328 src/HTAlert.c:354
+#, c-format
+msgid "Read %s of data"
+msgstr "Läste %s data"
+
+#: src/HTAlert.c:351
+#, c-format
+msgid "Read %s of %s of data"
+msgstr "Läste %s av %s data"
+
+#: src/HTAlert.c:360
+#, c-format
+msgid ", %s/sec"
+msgstr ", %s/s"
+
+#: src/HTAlert.c:374
+#, c-format
+msgid " (stalled for %s)"
+msgstr " (avstannad i %s)"
+
+#: src/HTAlert.c:378
+#, c-format
+msgid ", ETA %s"
+msgstr ", %s kvar"
+
+#: src/HTAlert.c:400
+msgid " (Press 'z' to abort)"
+msgstr " (\"z\" avbryter)"
+
+#. Meta-note: don't move the following note from its place right
+#. in front of the first gettext(). As it is now, it should
+#. automatically appear in generated lynx.pot files. - kw
+#.
+#. NOTE TO TRANSLATORS: If you provide a translation for "yes", lynx
+#. * will take the first byte of the translation as a positive response
+#. * to Yes/No questions. If you provide a translation for "no", lynx
+#. * will take the first byte of the translation as a negative response
+#. * to Yes/No questions. For both, lynx will also try to show the
+#. * first byte in the prompt as a character, instead of (y) or (n),
+#. * respectively. This will not work right for multibyte charsets!
+#. * Don't translate "yes" and "no" for CJK character sets (or translate
+#. * them to "yes" and "no"). For a translation using UTF-8, don't
+#. * translate if the translation would begin with anything but a 7-bit
+#. * (US_ASCII) character. That also means do not translate if the
+#. * translation would begin with anything but a 7-bit character, if
+#. * you use a single-byte character encoding (a charset like ISO-8859-n)
+#. * but anticipate that the message catalog may be used re-encoded in
+#. * UTF-8 form.
+#. * For translations using other character sets, you may also wish to
+#. * leave "yes" and "no" untranslated, if using (y) and (n) is the
+#. * preferred behavior.
+#. * Lynx will also accept y Y n N as responses unless there is a conflict
+#. * with the first letter of the "yes" or "no" translation.
+#.
+#: src/HTAlert.c:438 src/HTAlert.c:486
+msgid "yes"
+msgstr "ja"
+
+#: src/HTAlert.c:441 src/HTAlert.c:487
+msgid "no"
+msgstr "nej"
+
+#.
+#. * Special-purpose workaround for gettext support (we should do
+#. * this in a more general way) -TD
+#. *
+#. * NOTE TO TRANSLATORS: If the prompt has been rendered into
+#. * another language, and if yes/no are distinct, assume the
+#. * translator can make an ordered list in parentheses with one
+#. * capital letter for each as we assumed in HTConfirmDefault().
+#. * The list has to be in the same order as in the original message,
+#. * and the four capital letters chosen to not match those in the
+#. * original unless they have the same position.
+#. *
+#. * Example:
+#. * (Y/N/Always/neVer) - English (original)
+#. * (O/N/Toujours/Jamais) - French
+#.
+#: src/HTAlert.c:938
+msgid "Y/N/A/V"
+msgstr "J/N/A/L"
+
+#: src/HTML.c:5769
+msgid "Description:"
+msgstr "Beskrivning:"
+
+#: src/HTML.c:5774
+msgid "(none)"
+msgstr "(ingen)"
+
+#: src/HTML.c:5778
+msgid "Filepath:"
+msgstr "Sökväg:"
+
+#: src/HTML.c:5784
+msgid "(unknown)"
+msgstr "(okänd)"
+
+#: src/HTML.c:7224
+msgid "Document has only hidden links. Use the 'l'ist command."
+msgstr "Dokumentet innehåller endast dolda länkar. Använd \"l\"istkommandot."
+
+#: src/HTML.c:7725
+msgid "Source cache error - disk full?"
+msgstr "Källkodscachefel - disk full?"
+
+#: src/HTML.c:7738
+msgid "Source cache error - not enough memory!"
+msgstr "Källkodscachefel - minnet slut!"
+
+#: src/LYBookmark.c:167
+msgid ""
+" This file is an HTML representation of the X Mosaic hotlist file.\n"
+" Outdated or invalid links may be removed by using the\n"
+" remove bookmark command, it is usually the 'R' key but may have\n"
+" been remapped by you or your system administrator."
+msgstr ""
+" Denna fil är en HTML-representation av X Mosaics bokmärkesfil.\n"
+" Föråldrade eller ogiltiga länkar kan tas bort genom att använda\n"
+" kommandot radera bokmärke, vilket vanligtvis nås via tangenten \"R\",\n"
+" men som kan ha ändrats av dig eller din systemadministratör."
+
+#: src/LYBookmark.c:380
+#, c-format
+msgid ""
+" You can delete links by the 'R' key<br>\n"
+"<ol>\n"
+msgstr ""
+" Du kan ta bort länkar med \"R\"-tangenten<br>\n"
+"<ol>\n"
+
+#: src/LYBookmark.c:383
+msgid ""
+" You can delete links using the remove bookmark command. It is usually\n"
+" the 'R' key but may have been remapped by you or your system\n"
+" administrator."
+msgstr ""
+" Du kan ta bort länkar med kommandot radera bokmärke, vilket vanligtvis\n"
+" nås via tangenten \"R\", men som kan ha ändrats av dig eller din\n"
+" systemadministratör."
+
+#: src/LYBookmark.c:387
+msgid ""
+" This file also may be edited with a standard text editor to delete\n"
+" outdated or invalid links, or to change their order."
+msgstr ""
+" Denna fil kan även redigeras med ett vanligt textredigeringsprogram för\n"
+" att ta bort föråldrade eller ogiltiga länkar, eller ändra den inbördes\n"
+" ordningen."
+
+#: src/LYBookmark.c:390
+msgid ""
+"Note: if you edit this file manually\n"
+" you should not change the format within the lines\n"
+" or add other HTML markup.\n"
+" Make sure any bookmark link is saved as a single line."
+msgstr ""
+"Obs: om du redigerar denna fil manuellt\n"
+" bör du inte ändra formatet på raderna,\n"
+" eller lägga till annan HTML-kod.\n"
+" Se till att alla bokmärkeslänkar lagras som enskilda rader."
+
+#: src/LYBookmark.c:686
+#, c-format
+msgid "File may be recoverable from %s during this session"
+msgstr "Filen kan kanske återskapas från %s under denna session"
+
+#: src/LYCgi.c:161
+#, c-format
+msgid "Do you want to execute \"%s\"?"
+msgstr "Vill du starta \"%s\"?"
+
+#.
+#. * Neither the path as given nor any components examined by backing up
+#. * were stat()able. - kw
+#.
+#: src/LYCgi.c:276
+msgid "Unable to access cgi script"
+msgstr "Kan inte nå cgi-skript"
+
+#: src/LYCgi.c:709 src/LYCgi.c:712
+msgid "Good Advice"
+msgstr "Gott råd"
+
+#: src/LYCgi.c:716
+msgid "An excellent http server for VMS is available via"
+msgstr "En utmärkt http-server för VMS är tillgänglig via"
+
+#: src/LYCgi.c:723
+msgid "this link"
+msgstr "denna länk"
+
+#: src/LYCgi.c:727
+msgid "It provides state of the art CGI script support.\n"
+msgstr "Den ger förstklassigt stöd för CGI-skript.\n"
+
+#: src/LYClean.c:115
+msgid "Exiting via interrupt:"
+msgstr "Avslutar via avbrott:"
+
+#: src/LYCookie.c:2651
+msgid "(from a previous session)"
+msgstr "(från en tidigare session)"
+
+#: src/LYCookie.c:2712
+msgid "Maximum Gobble Date:"
+msgstr "Maximalt ätdatum:"
+
+#: src/LYCookie.c:2751
+msgid "Internal"
+msgstr "Intern"
+
+#: src/LYCookie.c:2752
+msgid "cookie_domain_flag_set error, aborting program"
+msgstr "\"cookie_domain_flag_set\"-fel, avbryter programmet"
+
+#: src/LYCurses.c:1136
+msgid "Terminal reinitialisation failed - unknown terminal type?"
+msgstr "Ominitiering av terminalen misslyckades - okänd terminaltyp?"
+
+#: src/LYCurses.c:1343
+msgid "Terminal initialisation failed - unknown terminal type?"
+msgstr "Initiering av terminalen misslyckades - okänd terminaltyp?"
+
+#: src/LYCurses.c:1837
+msgid "Terminal ="
+msgstr "Terminal ="
+
+#: src/LYCurses.c:1841
+msgid "You must use a vt100, 200, etc. terminal with this program."
+msgstr "Du måste använda en vt100-, -200-, etc. -terminal med detta program."
+
+#: src/LYCurses.c:1890
+msgid "Your Terminal type is unknown!"
+msgstr "Din terminaltyp är okänd!"
+
+#: src/LYCurses.c:1891
+msgid "Enter a terminal type:"
+msgstr "Ange en terminaltyp:"
+
+#: src/LYCurses.c:1905
+msgid "TERMINAL TYPE IS SET TO"
+msgstr "TERMINALTYP SATT TILL"
+
+#: src/LYCurses.c:2464
+#, c-format
+msgid ""
+"\n"
+"A Fatal error has occurred in %s Ver. %s\n"
+msgstr ""
+"\n"
+"Ett fatalt fel har uppstått i %s ver. %s\n"
+
+#: src/LYCurses.c:2467
+#, c-format
+msgid ""
+"\n"
+"Please notify your system administrator to confirm a bug, and if\n"
+"confirmed, to notify the lynx-dev list. Bug reports should have concise\n"
+"descriptions of the command and/or URL which causes the problem, the\n"
+"operating system name with version number, the TCPIP implementation, the\n"
+"TRACEBACK if it can be captured, and any other relevant information.\n"
+msgstr ""
+"\n"
+"Kontakta din systemadministratör för att bekräfta ett programfel, och om\n"
+"det bekräftas, att notifiera lynx-dev-listan. Felrapporter bör ha en\n"
+"koncis beskrivning av kommandon och/eller webbadresser (URLar) som gör att\n"
+"felet uppstår, namn och versionsnummer på operativsystemet, använd TCP/IP-\n"
+"implementation, TRACEBACK om den kan fås, och all annan relevant information.\n"
+
+#: src/LYEdit.c:272
+#, c-format
+msgid "Error starting editor, %s"
+msgstr "Fel vid start av redigeringsprogram, %s"
+
+#: src/LYEdit.c:275
+msgid "Editor killed by signal"
+msgstr "Redigeringsprogram dödat av signal"
+
+#: src/LYEdit.c:280
+#, c-format
+msgid "Editor returned with error status %s"
+msgstr "Redigeringsprogrammet gav felstatus %s"
+
+#: src/LYDownload.c:511
+msgid "Downloaded link:"
+msgstr "Hämtad länk:"
+
+#: src/LYDownload.c:516
+msgid "Suggested file name:"
+msgstr "Föreslaget filnamn:"
+
+#: src/LYDownload.c:521
+msgid "Standard download options:"
+msgstr "Fördefinierade hämtalternativ:"
+
+#: src/LYDownload.c:522
+msgid "Download options:"
+msgstr "Hämtalternativ:"
+
+#: src/LYDownload.c:538
+msgid "Save to disk"
+msgstr "Spara på disk"
+
+#: src/LYDownload.c:552
+msgid "View temporary file"
+msgstr "Visa temporär fil"
+
+#: src/LYDownload.c:559
+msgid "Save to disk disabled."
+msgstr "\"Spara på disk\" deaktiverad."
+
+#: src/LYDownload.c:563 src/LYPrint.c:1331
+msgid "Local additions:"
+msgstr "Lokala tillägg:"
+
+#: src/LYDownload.c:574 src/LYUpload.c:206
+msgid "No Name Given"
+msgstr "Inget namn har angetts"
+
+#: src/LYHistory.c:673
+msgid "You selected:"
+msgstr "Du valde:"
+
+#: src/LYHistory.c:697 src/LYHistory.c:926
+msgid "(no address)"
+msgstr "(ingen adress)"
+
+#: src/LYHistory.c:701
+msgid " (internal)"
+msgstr " (intern)"
+
+#: src/LYHistory.c:703
+msgid " (was internal)"
+msgstr " (var intern)"
+
+#: src/LYHistory.c:801
+msgid " (From History)"
+msgstr " (Från historik)"
+
+#: src/LYHistory.c:846
+msgid "You visited (POSTs, bookmark, menu and list files excluded):"
+msgstr "Du besökte (POST, bokmärkes-, meny- och listfiler ej medräknade):"
+
+#: src/LYHistory.c:1148
+msgid "(No messages yet)"
+msgstr "(Inga meddelanden ännu)"
+
+#: src/LYLeaks.c:222
+msgid "Invalid pointer detected."
+msgstr "Ogiltig pekare upptäckt."
+
+#: src/LYLeaks.c:224 src/LYLeaks.c:262
+msgid "Sequence:"
+msgstr "Sekvens:"
+
+#: src/LYLeaks.c:227 src/LYLeaks.c:265
+msgid "Pointer:"
+msgstr "Pekare:"
+
+#: src/LYLeaks.c:236 src/LYLeaks.c:243 src/LYLeaks.c:284
+msgid "FileName:"
+msgstr "Filnamn:"
+
+#: src/LYLeaks.c:239 src/LYLeaks.c:246 src/LYLeaks.c:287 src/LYLeaks.c:298
+msgid "LineCount:"
+msgstr "Radnummer:"
+
+#: src/LYLeaks.c:260
+msgid "Memory leak detected."
+msgstr "Minnesläcka upptäckt."
+
+#: src/LYLeaks.c:268
+msgid "Contains:"
+msgstr "Innehåller:"
+
+#: src/LYLeaks.c:281
+msgid "ByteSize:"
+msgstr "Bytestorlek:"
+
+#: src/LYLeaks.c:295
+msgid "realloced:"
+msgstr "omallokerad:"
+
+#: src/LYLeaks.c:316
+msgid "Total memory leakage this run:"
+msgstr "Totalt minnesläckage denna körning:"
+
+#: src/LYLeaks.c:320
+msgid "Peak allocation"
+msgstr "Mesta allokering"
+
+#: src/LYLeaks.c:322
+msgid "Bytes allocated"
+msgstr "Byte allokerade"
+
+#: src/LYLeaks.c:324
+msgid "Total mallocs"
+msgstr "Totalt antal malloc"
+
+#: src/LYLeaks.c:326
+msgid "Total frees"
+msgstr "Totalt antal free"
+
+#: src/LYList.c:89
+msgid "References in "
+msgstr "Referenser i "
+
+#: src/LYList.c:92
+msgid "this document:"
+msgstr "detta dokument:"
+
+#: src/LYList.c:98 src/LYList.c:363
+msgid "Visible links:"
+msgstr "Besökta länkar:"
+
+#: src/LYList.c:202 src/LYList.c:322
+msgid "Hidden links:"
+msgstr "Dolda länkar:"
+
+#: src/LYList.c:359
+msgid "References"
+msgstr "Referenser"
+
+#: src/LYLocal.c:289
+#, c-format
+msgid "Unable to get status of '%s'."
+msgstr "Kan inte ta status på \"%s\"."
+
+#: src/LYLocal.c:354
+msgid "The selected item is not a file or a directory! Request ignored."
+msgstr "Vald post är inte en fil eller en katalog! Begäran ignoreras."
+
+#: src/LYLocal.c:456
+#, c-format
+msgid "Unable to %s due to system error!"
+msgstr "Kan inte %s på grund av systemfel!"
+
+#: src/LYLocal.c:490
+#, c-format
+msgid "Probable failure to %s due to system error!"
+msgstr "Möjligt misslyckande i %s på grund av systemfel!"
+
+#: src/LYLocal.c:555 src/LYLocal.c:578
+#, c-format
+msgid "remove %s"
+msgstr "ta bort %s"
+
+#: src/LYLocal.c:598
+#, c-format
+msgid "touch %s"
+msgstr "ändra datum på %s"
+
+#: src/LYLocal.c:628
+#, c-format
+msgid "move %s to %s"
+msgstr "flytta %s till %s"
+
+#: src/LYLocal.c:676
+msgid "There is already a directory with that name! Request ignored."
+msgstr "Det finns redan en katalog med det namnet! Begäran ignoreras."
+
+#: src/LYLocal.c:678
+msgid "There is already a file with that name! Request ignored."
+msgstr "Det finns redan en fil med det namnet! Begäran ignoreras."
+
+#: src/LYLocal.c:680
+msgid "The specified name is already in use! Request ignored."
+msgstr "Angivet filnamn används redan! Begäran ignoreras."
+
+#: src/LYLocal.c:692
+msgid "Destination has different owner! Request denied."
+msgstr "Målet har annan ägare! Begäran avvisas."
+
+#: src/LYLocal.c:695
+msgid "Destination is not a valid directory! Request denied."
+msgstr "Målet är inte en giltig katalog! Begäran avvisas."
+
+#: src/LYLocal.c:711
+msgid "Source and destination are the same location! Request ignored!"
+msgstr "Källa och mål är samma plats! Begäran ignorerad."
+
+#: src/LYLocal.c:735
+msgid "Remove all tagged files and directories?"
+msgstr "Ta bort alla markerade filer och kataloger?"
+
+#: src/LYLocal.c:808
+msgid "Enter new location for tagged items: "
+msgstr "Ange ny plats för markerade poster: "
+
+#: src/LYLocal.c:906
+msgid "Enter new name for directory: "
+msgstr "Ange nytt namn för katalog: "
+
+#: src/LYLocal.c:908
+msgid "Enter new name for file: "
+msgstr "Ange nytt namn för fil: "
+
+#: src/LYLocal.c:920
+msgid "Illegal character (path-separator) found! Request ignored."
+msgstr "Felaktigt tecken (sökvägsavdelare) funnen! Begäran ignorerad."
+
+#: src/LYLocal.c:970
+msgid "Enter new location for directory: "
+msgstr "Ange ny plats för katalog: "
+
+#: src/LYLocal.c:972
+msgid "Enter new location for file: "
+msgstr "Ange ny plats för fil: "
+
+#: src/LYLocal.c:999
+msgid "Unexpected failure - unable to find trailing path separator"
+msgstr "Oväntat misslyckande - kan inte hitta avslutande sökvägsavdelare"
+
+#: src/LYLocal.c:1061
+msgid "Modify name, location, or permission (n, l, or p): "
+msgstr "Ända N=namn, L=plats eller P=behörighet? "
+
+#: src/LYLocal.c:1063
+msgid "Modify name or location (n or l): "
+msgstr "Ändra N=namn eller L=plats? "
+
+#.
+#. * Code for changing ownership needed here.
+#.
+#: src/LYLocal.c:1092
+msgid "This feature not yet implemented!"
+msgstr "Denna funktion är ännu ej implementerad!"
+
+#: src/LYLocal.c:1113
+msgid "Enter name of file to create: "
+msgstr "Ange namn på fil att skapa: "
+
+#: src/LYLocal.c:1116 src/LYLocal.c:1153
+msgid "Illegal redirection \"//\" found! Request ignored."
+msgstr "Felaktig omdirigering \"//\" funnen! Begäran ignoreras."
+
+#: src/LYLocal.c:1150
+msgid "Enter name for new directory: "
+msgstr "Ange namn på ny katalog: "
+
+#: src/LYLocal.c:1191
+msgid "Create file or directory (f or d): "
+msgstr "Skapa F=fil eller D=katalog? "
+
+#: src/LYLocal.c:1233
+#, c-format
+msgid "Remove directory '%s'?"
+msgstr "Ta bort katalogen \"%s\"?"
+
+#: src/LYLocal.c:1236
+msgid "Remove directory?"
+msgstr "Ta bort katalogen?"
+
+#: src/LYLocal.c:1241
+#, c-format
+msgid "Remove file '%s'?"
+msgstr "Ta bort fil \"%s\"?"
+
+#: src/LYLocal.c:1243
+msgid "Remove file?"
+msgstr "Ta bort fil?"
+
+#: src/LYLocal.c:1248
+#, c-format
+msgid "Remove symbolic link '%s'?"
+msgstr "Ta bort symbolisk länk \"%s\"?"
+
+#: src/LYLocal.c:1250
+msgid "Remove symbolic link?"
+msgstr "Ta bort symbolisk länk?"
+
+#: src/LYLocal.c:1348
+msgid "Sorry, don't know how to permit non-UNIX files yet."
+msgstr "Tyvärr, kan inte ändra behörighet för icke-Unixfiler ännu."
+
+#: src/LYLocal.c:1377
+msgid "Unable to open permit options file"
+msgstr "Kan inte öppna behörighetsalternativfil"
+
+#: src/LYLocal.c:1405
+msgid "Specify permissions below:"
+msgstr "Ange behörighet nedan:"
+
+#: src/LYLocal.c:1406 src/LYShowInfo.c:291
+msgid "Owner:"
+msgstr "Ägare:"
+
+#: src/LYLocal.c:1422
+msgid "Group"
+msgstr "Grupp"
+
+#: src/LYLocal.c:1438
+msgid "Others:"
+msgstr "Övriga:"
+
+#: src/LYLocal.c:1456
+msgid "form to permit"
+msgstr "formulär för att ändra behörighet för"
+
+#: src/LYLocal.c:1552
+msgid "Invalid mode format."
+msgstr "Ogiltigt format på behörighet."
+
+#: src/LYLocal.c:1556
+msgid "Invalid syntax format."
+msgstr "Ogiltig syntaxformat."
+
+#: src/LYLocal.c:1743
+msgid "Warning! UUDecoded file will exist in the directory you started Lynx."
+msgstr "Varning! UU-avkodad fil lagras i katalogen du startade Lynx från."
+
+#: src/LYLocal.c:1933
+msgid "NULL URL pointer"
+msgstr "URL-pekare är NULL"
+
+#: src/LYLocal.c:2015
+#, c-format
+msgid "Executing %s "
+msgstr "Kör %s "
+
+#: src/LYLocal.c:2018
+msgid "Executing system command. This might take a while."
+msgstr "Kör systemkommando. Detta kan ta en stund."
+
+#: src/LYLocal.c:2092
+msgid "Current directory:"
+msgstr "Aktuell katalog:"
+
+#: src/LYLocal.c:2095 src/LYLocal.c:2113
+msgid "Current selection:"
+msgstr "Aktuell markering:"
+
+#: src/LYLocal.c:2099
+msgid "Nothing currently selected."
+msgstr "Ingenting har markerats."
+
+#: src/LYLocal.c:2115
+msgid "tagged item:"
+msgstr "markerad post:"
+
+#: src/LYLocal.c:2116
+msgid "tagged items:"
+msgstr "markerade poster:"
+
+#: src/LYLocal.c:2216 src/LYLocal.c:2225
+msgid "Illegal filename; request ignored."
+msgstr "Ogiltigt filnamn; begäran ignorerad."
+
+#. directory not writable
+#: src/LYLocal.c:2323 src/LYLocal.c:2382
+msgid "Install in the selected directory not permitted."
+msgstr "Installation i vald katalog ej tillåten."
+
+#: src/LYLocal.c:2378
+msgid "The selected item is not a directory! Request ignored."
+msgstr "Vald post är inte en katalog! Begäran ignorerad."
+
+#: src/LYLocal.c:2387
+msgid "Just a moment, ..."
+msgstr "Ett ögonblick, ..."
+
+#: src/LYLocal.c:2404
+msgid "Error building install args"
+msgstr "Fel vid uppbyggning av installationsflaggor"
+
+#: src/LYLocal.c:2419 src/LYLocal.c:2450
+#, c-format
+msgid "Source and target are the same: %s"
+msgstr "Källa och mål är samma: %s"
+
+#: src/LYLocal.c:2426 src/LYLocal.c:2457
+#, c-format
+msgid "Already in target directory: %s"
+msgstr "Redan i målkatalog: %s"
+
+#: src/LYLocal.c:2475
+msgid "Installation complete"
+msgstr "Installation färdig"
+
+#: src/LYLocal.c:2678
+msgid "Temporary URL or list would be too long."
+msgstr "Temporär adress eller lista skulle vara för lång."
+
+#: src/LYMail.c:566
+msgid "Sending"
+msgstr "Skickar"
+
+#: src/LYMail.c:1050
+#, c-format
+msgid "The link %s :?: %s \n"
+msgstr "Länken %s :?: %s \n"
+
+#: src/LYMail.c:1052
+#, c-format
+msgid "called \"%s\"\n"
+msgstr "anropade \"%s\"\n"
+
+#: src/LYMail.c:1053
+#, c-format
+msgid "in the file \"%s\" called \"%s\"\n"
+msgstr "i filen \"%s\" anropade \"%s\"\n"
+
+#: src/LYMail.c:1054
+msgid "was requested but was not available."
+msgstr "efterfrågades men var inte tillgänglig."
+
+#: src/LYMail.c:1055
+msgid "Thought you might want to know."
+msgstr "Tänkte att du kanske ville veta."
+
+#: src/LYMail.c:1057
+msgid "This message was automatically generated by"
+msgstr "Detta meddelande automatgenererades av"
+
+#: src/LYMail.c:1770
+msgid "No system mailer configured"
+msgstr "E-postprogram inte konfigurerat i systemet"
+
+#: src/LYMain.c:1095
+msgid "No Winsock found, sorry."
+msgstr "Ingen Winsock hittades, ursäkta."
+
+#: src/LYMain.c:1285
+msgid "You MUST define a valid TMP or TEMP area!"
+msgstr "Du MÅSTE ange ett giltigt TMP- eller TEMP-område!"
+
+#: src/LYMain.c:1338 src/LYMainLoop.c:5285
+msgid "No such directory"
+msgstr "Katalogen finns ej"
+
+#: src/LYMain.c:1532
+#, c-format
+msgid ""
+"\n"
+"Configuration file \"%s\" is not available.\n"
+"\n"
+msgstr ""
+"\n"
+"Konfigurationsfilen \"%s\" ej tillgänglig.\n"
+"\n"
+
+#: src/LYMain.c:1542
+#, c-format
+msgid ""
+"\n"
+"Lynx character sets not declared.\n"
+"\n"
+msgstr ""
+"\n"
+"Lynxteckenuppsättningar ej deklarerade.\n"
+"\n"
+
+#: src/LYMain.c:1698
+#, c-format
+msgid "Ignored %d characters from standard input.\n"
+msgstr "Ignorerade %d tecken från standard in.\n"
+
+#: src/LYMain.c:1700
+#, c-format
+msgid "Use \"-stdin\" or \"-\" to tell how to handle piped input.\n"
+msgstr "Använd \"-stdin\" eller \"-\" för att beskriva hur indata från rör skall hanteras.\n"
+
+#: src/LYMain.c:1858
+msgid "Warning:"
+msgstr "Varning:"
+
+#: src/LYMain.c:2426
+msgid "persistent cookies state will be changed in next session only."
+msgstr "varaktiga kakinställningar ändras endast i nästa session."
+
+#: src/LYMain.c:2661 src/LYMain.c:2705
+#, c-format
+msgid "Lynx: ignoring unrecognized charset=%s\n"
+msgstr "Lynx: ignorerar okänd teckenuppsättning %s\n"
+
+#: src/LYMain.c:3222
+#, c-format
+msgid "%s Version %s (%s)"
+msgstr "%s version %s (%s)"
+
+#: src/LYMain.c:3263
+#, c-format
+msgid "Built on %s%s.\n"
+msgstr "Byggd den %s%s.\n"
+
+#: src/LYMain.c:3277
+msgid "Copyrights held by the Lynx Developers Group,"
+msgstr "Upphovsrätten ligger hos Lynx-utvecklargruppen,"
+
+#: src/LYMain.c:3278
+msgid "the University of Kansas, CERN, and other contributors."
+msgstr "Kansas Universitet, CERN, och andra bidragslämnare."
+
+#: src/LYMain.c:3279
+msgid "Distributed under the GNU General Public License (Version 2)."
+msgstr "Distribuerad enligt GNU General Public License (version 2)."
+
+#: src/LYMain.c:3280
+msgid "See https://lynx.invisible-island.net/ and the online help for more information."
+msgstr "Se http://lynx.invisible-island.net/ och direkthjälpen för ytterligare information."
+
+#: src/LYMain.c:4139
+#, c-format
+msgid "USAGE: %s [options] [file]\n"
+msgstr "ANVÄNDNING: %s [flaggor] [fil]\n"
+
+#: src/LYMain.c:4140
+#, c-format
+msgid "Options are:\n"
+msgstr "Flaggorna är:\n"
+
+#: src/LYMain.c:4443
+#, c-format
+msgid "%s: Invalid Option: %s\n"
+msgstr "%s: Okänd flagga: %s\n"
+
+#: src/LYMainLoop.c:572
+#, c-format
+msgid "Internal error: Invalid mouse link %d!"
+msgstr "Internt fel: Ogiltig muslänk %d!"
+
+#: src/LYMainLoop.c:693 src/LYMainLoop.c:5307
+msgid "A URL specified by the user"
+msgstr "En adress angiven av användaren"
+
+#: src/LYMainLoop.c:1142
+msgid "Enctype multipart/form-data not yet supported! Cannot submit."
+msgstr "Kodningen multiport/form-data stöds inte ännu! Kan inte skicka."
+
+#.
+#. * Make a name for this help file.
+#.
+#: src/LYMainLoop.c:3197
+msgid "Help Screen"
+msgstr "Hjälpskärm"
+
+#: src/LYMainLoop.c:3328
+msgid "System Index"
+msgstr "Systemindex"
+
+#: src/LYMainLoop.c:3577
+#, c-format
+msgid "Query parameter %d: "
+msgstr "Anropsparameter %d: "
+
+#: src/LYMainLoop.c:3806 src/LYMainLoop.c:5583
+msgid "Entry into main screen"
+msgstr "Ingång till huvudskärm"
+
+#: src/LYMainLoop.c:4064
+msgid "No next document present"
+msgstr "Det finns inget nästa dokument"
+
+#: src/LYMainLoop.c:4359
+msgid "charset for this document specified explicitly, sorry..."
+msgstr "teckenuppsättning för detta dokumentet explicit deklarerat, ursäkta..."
+
+#: src/LYMainLoop.c:5265
+msgid "cd to:"
+msgstr "byt katalog till:"
+
+#: src/LYMainLoop.c:5288
+msgid "A component of path is not a directory"
+msgstr "En del av sökvägen är inte en katalog"
+
+#: src/LYMainLoop.c:5291
+msgid "failed to change directory"
+msgstr "lyckades inte byta katalog"
+
+#: src/LYMainLoop.c:6517
+msgid "Reparsing document under current settings..."
+msgstr "Tolkar om dokumentet med aktuella inställningar..."
+
+#: src/LYMainLoop.c:6811
+#, c-format
+msgid "Fatal error - could not open output file %s\n"
+msgstr "Fatalt fel - kunde inte öppna utdatafil %s\n"
+
+# Kollas!
+#: src/LYMainLoop.c:7153
+msgid "TABLE center enable."
+msgstr "Tabellcentrering aktiverad."
+
+# Kollas!
+#: src/LYMainLoop.c:7156
+msgid "TABLE center disable."
+msgstr "Tabellcentrering inaktiverad."
+
+#: src/LYMainLoop.c:7236
+msgid "Current URL is empty."
+msgstr "Nuvarande adress är tom."
+
+#: src/LYMainLoop.c:7238 src/LYUtils.c:1909
+msgid "Copy to clipboard failed."
+msgstr "Misslyckades kopiera till urklipp."
+
+#: src/LYMainLoop.c:7240
+msgid "Document URL put to clipboard."
+msgstr "Dokumentadress lagd i urklipp."
+
+#: src/LYMainLoop.c:7242
+msgid "Link URL put to clipboard."
+msgstr "Länkadress lagd i urklipp."
+
+#: src/LYMainLoop.c:7269
+msgid "No URL in the clipboard."
+msgstr "Ingen adress i urklipp."
+
+#: src/LYMainLoop.c:7962 src/LYMainLoop.c:8133
+msgid "-index-"
+msgstr "-index-"
+
+#: src/LYMainLoop.c:8071
+msgid "lynx: Can't access startfile"
+msgstr "lynx: Kan inte komma åt startfil"
+
+#: src/LYMainLoop.c:8083
+msgid "lynx: Start file could not be found or is not text/html or text/plain"
+msgstr "lynx: Startfilen hittades inte eller är varken text/html eller text/plain"
+
+#: src/LYMainLoop.c:8084
+msgid " Exiting..."
+msgstr " Avslutar..."
+
+#: src/LYMainLoop.c:8127
+msgid "-more-"
+msgstr "-mer-"
+
+#. Enable scrolling.
+#: src/LYNews.c:186
+msgid "You will be posting to:"
+msgstr "Du kommer att skicka till:"
+
+#.
+#. * Get the mail address for the From header, offering personal_mail_address
+#. * as default.
+#.
+#: src/LYNews.c:195
+msgid ""
+"\n"
+"\n"
+" Please provide your mail address for the From: header\n"
+msgstr ""
+"\n"
+"\n"
+" Ange din e-postadress för avsändarfältet\n"
+
+#.
+#. * Get the Subject header, offering the current document's title as the
+#. * default if this is a followup rather than a new post. - FM
+#.
+#: src/LYNews.c:212
+msgid ""
+"\n"
+"\n"
+" Please provide or edit the Subject: header\n"
+msgstr ""
+"\n"
+"\n"
+" Ange eller redigera ärenderaden\n"
+
+#: src/LYNews.c:302
+msgid ""
+"\n"
+"\n"
+" Please provide or edit the Organization: header\n"
+msgstr ""
+"\n"
+"\n"
+" Ange eller redigera organisationsfältet\n"
+
+#.
+#. * Use the built in line editior.
+#.
+#: src/LYNews.c:359
+msgid ""
+"\n"
+"\n"
+" Please enter your message below."
+msgstr ""
+"\n"
+"\n"
+" Skriv ditt inlägg nedan."
+
+#: src/LYNews.c:405
+msgid "Message has no original text!"
+msgstr "Inlägget har ingen ursprunglig text!"
+
+#: src/LYOptions.c:774
+msgid "review/edit B)ookmarks files"
+msgstr "se/redigera B)okmärkesfiler"
+
+#: src/LYOptions.c:776
+msgid "B)ookmark file: "
+msgstr "B)okmärkesfil: "
+
+#: src/LYOptions.c:2131 src/LYOptions.c:2138
+msgid "ON"
+msgstr "PÃ…"
+
+#. verbose_img variable
+#. LYCollapseBRs variable
+#. LYtrimBlankLines variable
+#: src/LYOptions.c:2132 src/LYOptions.c:2137 src/LYOptions.c:2321
+#: src/LYOptions.c:2330 src/LYOptions.c:2339 src/LYOptions.c:2350
+msgid "OFF"
+msgstr "AV"
+
+#: src/LYOptions.c:2133
+msgid "NEVER"
+msgstr "ALDRIG"
+
+#: src/LYOptions.c:2134
+msgid "ALWAYS"
+msgstr "ALLTID"
+
+#: src/LYOptions.c:2150 src/LYOptions.c:2313
+msgid "ignore"
+msgstr "ignorera"
+
+#: src/LYOptions.c:2151
+msgid "ask user"
+msgstr "fråga användaren"
+
+#: src/LYOptions.c:2152
+msgid "accept all"
+msgstr "ta emot alla"
+
+#: src/LYOptions.c:2164
+msgid "ALWAYS OFF"
+msgstr "ALLTID AV"
+
+#: src/LYOptions.c:2165
+msgid "FOR LOCAL FILES ONLY"
+msgstr "ENDAST FÖR LOKALA FILER"
+
+#: src/LYOptions.c:2167
+msgid "ALWAYS ON"
+msgstr "ALLTID PÃ…"
+
+# Numeriskt tangentbord
+#: src/LYOptions.c:2179
+msgid "Numbers act as arrows"
+msgstr "Siffror som pilar"
+
+#: src/LYOptions.c:2181
+msgid "Links are numbered"
+msgstr "Numrerade länkar"
+
+#: src/LYOptions.c:2184
+msgid "Links and form fields are numbered"
+msgstr "Numrerade länkar och formulärfält"
+
+#: src/LYOptions.c:2187
+msgid "Form fields are numbered"
+msgstr "Numrerade formulärfält"
+
+#: src/LYOptions.c:2202
+msgid "Case insensitive"
+msgstr "Skilj inte VERSALER och gemener"
+
+#: src/LYOptions.c:2203
+msgid "Case sensitive"
+msgstr "Skilj VERSALER och gemener"
+
+#: src/LYOptions.c:2237
+msgid "prompt normally"
+msgstr "fråga som vanligt"
+
+#: src/LYOptions.c:2238
+msgid "force yes-response"
+msgstr "svara alltid ja"
+
+#: src/LYOptions.c:2239
+msgid "force no-response"
+msgstr "svara alltid nej"
+
+#: src/LYOptions.c:2249
+msgid "RFC 2109"
+msgstr "RFC 2109"
+
+#: src/LYOptions.c:2250
+msgid "RFC 2965"
+msgstr "RFC 2965"
+
+#: src/LYOptions.c:2251
+msgid "RFC 6265"
+msgstr "RFC 6265"
+
+#: src/LYOptions.c:2268
+msgid "Novice"
+msgstr "Nybörjare"
+
+#: src/LYOptions.c:2269
+msgid "Intermediate"
+msgstr "Amatör"
+
+#: src/LYOptions.c:2270
+msgid "Advanced"
+msgstr "Avancerad"
+
+#: src/LYOptions.c:2279
+msgid "By First Visit"
+msgstr "Efter första besök"
+
+#: src/LYOptions.c:2281
+msgid "By First Visit Reversed"
+msgstr "Efter första användning, omvänt"
+
+#: src/LYOptions.c:2282
+msgid "As Visit Tree"
+msgstr "Som besöksträd"
+
+#: src/LYOptions.c:2283
+msgid "By Last Visit"
+msgstr "Efter senaste besök"
+
+#: src/LYOptions.c:2285
+msgid "By Last Visit Reversed"
+msgstr "Efter senaste besök, omvänt"
+
+#. Old_DTD variable
+#: src/LYOptions.c:2296
+msgid "relaxed (TagSoup mode)"
+msgstr "avslappnad (TagSoup-läge)"
+
+#: src/LYOptions.c:2297
+msgid "strict (SortaSGML mode)"
+msgstr "strikt (SortaSGML-läge)"
+
+#: src/LYOptions.c:2304
+msgid "Ignore"
+msgstr "Ignorera"
+
+#: src/LYOptions.c:2305
+msgid "Add to trace-file"
+msgstr "Lägg till spårningsfil"
+
+#: src/LYOptions.c:2306
+msgid "Add to LYNXMESSAGES"
+msgstr "Lägg till LYNXMESSAGES"
+
+#: src/LYOptions.c:2307
+msgid "Warn, point to trace-file"
+msgstr "Varna, visa mot spårfil"
+
+#: src/LYOptions.c:2314
+msgid "as labels"
+msgstr "som etiketter"
+
+#: src/LYOptions.c:2315
+msgid "as links"
+msgstr "som länkar"
+
+#: src/LYOptions.c:2322
+msgid "show filename"
+msgstr "visa filnamn"
+
+#: src/LYOptions.c:2331
+msgid "collapse"
+msgstr "fäll ihop"
+
+#: src/LYOptions.c:2340
+msgid "trim-lines"
+msgstr "beskär-rader"
+
+#: src/LYOptions.c:2351
+msgid "STANDARD"
+msgstr "NORMAL"
+
+#: src/LYOptions.c:2352
+msgid "ADVANCED"
+msgstr "AVANCERAD"
+
+#: src/LYOptions.c:2374
+msgid "IDNA 2003"
+msgstr "IDNA 2003"
+
+#: src/LYOptions.c:2375
+msgid "IDNA 2008"
+msgstr "IDNA 2008"
+
+#: src/LYOptions.c:2376
+msgid "IDNA TR46"
+msgstr "IDNA TR46"
+
+#: src/LYOptions.c:2377
+msgid "IDNA Compatible"
+msgstr "IDNA-kompatibel"
+
+#: src/LYOptions.c:2398
+msgid "Directories first"
+msgstr "Kataloger först"
+
+#: src/LYOptions.c:2399
+msgid "Files first"
+msgstr "Filer först"
+
+#: src/LYOptions.c:2400
+msgid "Mixed style"
+msgstr "Blandad visning"
+
+#: src/LYOptions.c:2408 src/LYOptions.c:2428
+msgid "By Name"
+msgstr "Efter namn"
+
+#: src/LYOptions.c:2409 src/LYOptions.c:2429
+msgid "By Type"
+msgstr "Efter typ"
+
+#: src/LYOptions.c:2410 src/LYOptions.c:2430
+msgid "By Size"
+msgstr "Efter storlek"
+
+#: src/LYOptions.c:2411 src/LYOptions.c:2431
+msgid "By Date"
+msgstr "Efter datum"
+
+#: src/LYOptions.c:2412
+msgid "By Mode"
+msgstr "Efter läge"
+
+#: src/LYOptions.c:2414
+msgid "By User"
+msgstr "Efter användare"
+
+#: src/LYOptions.c:2415
+msgid "By Group"
+msgstr "Efter grupp"
+
+#: src/LYOptions.c:2440
+msgid "Do not show rate"
+msgstr "Visa inte hastighet"
+
+#: src/LYOptions.c:2441 src/LYOptions.c:2442
+#, c-format
+msgid "Show %s/sec rate"
+msgstr "Visa hastighet som %s/s"
+
+#: src/LYOptions.c:2444 src/LYOptions.c:2445
+#, c-format
+msgid "Show %s/sec, ETA"
+msgstr "Visa %s/s, tid kvar"
+
+#: src/LYOptions.c:2446 src/LYOptions.c:2447
+#, c-format
+msgid "Show %s/sec (2-digits), ETA"
+msgstr "Visa %s/s (2 siffror), tid kvar"
+
+#: src/LYOptions.c:2450
+msgid "Show progressbar"
+msgstr "Visa förloppsindikator"
+
+#: src/LYOptions.c:2471
+msgid "Accept lynx's internal types"
+msgstr "Godta lynx interna typer"
+
+#: src/LYOptions.c:2472
+msgid "Also accept lynx.cfg's types"
+msgstr "Godta även typer från lynx.cfg"
+
+#: src/LYOptions.c:2473
+msgid "Also accept user's types"
+msgstr "Godta även användarens typer"
+
+#: src/LYOptions.c:2474
+msgid "Also accept system's types"
+msgstr "Godta även systemets typer"
+
+#: src/LYOptions.c:2475
+msgid "Accept all types"
+msgstr "Godta alla typer"
+
+#: src/LYOptions.c:2484
+msgid "gzip"
+msgstr "gzip"
+
+#: src/LYOptions.c:2485
+msgid "deflate"
+msgstr "deflate"
+
+#: src/LYOptions.c:2488
+msgid "compress"
+msgstr "compress"
+
+#: src/LYOptions.c:2491
+msgid "bzip2"
+msgstr "bzip2"
+
+#: src/LYOptions.c:2493
+msgid "All"
+msgstr "Alla"
+
+#: src/LYOptions.c:2503
+msgid "HTTP 1.0"
+msgstr "HTTP 1.0"
+
+#: src/LYOptions.c:2504
+msgid "HTTP 1.1"
+msgstr "HTTP 1.1"
+
+#: src/LYOptions.c:2863 src/LYOptions.c:2892
+#, c-format
+msgid "Use %s to invoke the Options menu!"
+msgstr "Använd %s för att nå alternativmenyn!"
+
+#: src/LYOptions.c:3789
+msgid "(options marked with (!) will not be saved)"
+msgstr "(inställningar markerade med (!) kommer ej att sparas)"
+
+#: src/LYOptions.c:3797
+msgid "General Preferences"
+msgstr "Allmänna inställningar"
+
+#. ***************************************************************
+#. User Mode: SELECT
+#: src/LYOptions.c:3801
+msgid "User mode"
+msgstr "Användarläge"
+
+#. Editor: INPUT
+#: src/LYOptions.c:3807
+msgid "Editor"
+msgstr "Redigeringsprogram"
+
+#. Search Type: SELECT
+#: src/LYOptions.c:3812
+msgid "Type of Search"
+msgstr "Söktyp"
+
+#: src/LYOptions.c:3817
+msgid "Security and Privacy"
+msgstr "Säkerhet och sekretess"
+
+#. ***************************************************************
+#. Cookies: SELECT
+#: src/LYOptions.c:3821
+msgid "Cookies"
+msgstr "Kakor"
+
+#. Cookie Version: SELECT
+#: src/LYOptions.c:3835
+msgid "Cookie RFC-version"
+msgstr "RFC-version för kakor"
+
+#. Cookie Prompting: SELECT
+#: src/LYOptions.c:3841
+msgid "Invalid-Cookie Prompting"
+msgstr "Fråga för ogiltiga kakor"
+
+#. SSL Prompting: SELECT
+#: src/LYOptions.c:3848
+msgid "SSL Prompting"
+msgstr "Fråga för SSL"
+
+#: src/LYOptions.c:3853
+msgid "SSL client certificate file"
+msgstr "Fil för SSL-klientcertifikat"
+
+#: src/LYOptions.c:3857
+msgid "SSL client key file"
+msgstr "Fil för SSL-klientnyckel"
+
+#: src/LYOptions.c:3863
+msgid "Keyboard Input"
+msgstr "Tangentbordsindata"
+
+#. ***************************************************************
+#. Keypad Mode: SELECT
+#: src/LYOptions.c:3867
+msgid "Keypad mode"
+msgstr "Numeriskt tangentbord"
+
+#. Emacs keys: ON/OFF
+#: src/LYOptions.c:3873
+msgid "Emacs keys"
+msgstr "Emacstangenter"
+
+#. VI Keys: ON/OFF
+#: src/LYOptions.c:3879
+msgid "VI keys"
+msgstr "VI-tangenter"
+
+#. Line edit style: SELECT
+#. well, at least 2 line edit styles available
+#: src/LYOptions.c:3886
+msgid "Line edit style"
+msgstr "Radredigeringsstil"
+
+#. Keyboard layout: SELECT
+#: src/LYOptions.c:3898
+msgid "Keyboard layout"
+msgstr "Tangentbordsmall"
+
+#.
+#. * Display and Character Set
+#.
+#: src/LYOptions.c:3912
+msgid "Display and Character Set"
+msgstr "Visning och teckenuppsättning"
+
+#. Use locale-based character set: ON/OFF
+#: src/LYOptions.c:3917
+msgid "Use locale-based character set"
+msgstr "Lokalbaserad teckenuppsättning"
+
+#: src/LYOptions.c:3924
+msgid "Use HTML5 charset replacements"
+msgstr "Använd HTML5:s ersättande teckenkoder"
+
+#. Display Character Set: SELECT
+#: src/LYOptions.c:3930
+msgid "Display character set"
+msgstr "Teckenuppsättning för visning"
+
+#: src/LYOptions.c:3961
+msgid "Assumed document character set"
+msgstr "Förvald dokumentteckenuppsättning"
+
+#: src/LYOptions.c:3977
+msgid "Internationalized domain names"
+msgstr "Internationella domännamn"
+
+#.
+#. * Since CJK people hardly mixed with other world
+#. * we split the header to make it more readable:
+#. * "CJK mode" for CJK display charsets, and "Raw 8-bit" for others.
+#.
+#: src/LYOptions.c:3995
+msgid "CJK mode"
+msgstr "CJK-läge"
+
+#: src/LYOptions.c:3997
+msgid "Raw 8-bit"
+msgstr "RÃ¥ 8-bitars"
+
+#. X Display: INPUT
+#: src/LYOptions.c:4005
+msgid "X Display"
+msgstr "X-display"
+
+#.
+#. * Document Appearance
+#.
+#: src/LYOptions.c:4011
+msgid "Document Appearance"
+msgstr "Dokumentutseende"
+
+#: src/LYOptions.c:4017
+msgid "Show color"
+msgstr "Visa färg"
+
+#: src/LYOptions.c:4043
+msgid "Color style"
+msgstr "Färgstil"
+
+#: src/LYOptions.c:4053
+msgid "Default colors"
+msgstr "Förvalda färger"
+
+#. Show cursor: ON/OFF
+#: src/LYOptions.c:4061
+msgid "Show cursor"
+msgstr "Visa markör"
+
+#. Underline links: ON/OFF
+#: src/LYOptions.c:4067
+msgid "Underline links"
+msgstr "Stryk under länkar"
+
+#. Show scrollbar: ON/OFF
+#: src/LYOptions.c:4074
+msgid "Show scrollbar"
+msgstr "Visa rullningslist"
+
+#. Select Popups: ON/OFF
+#: src/LYOptions.c:4081
+msgid "Popups for select fields"
+msgstr "Popup för valfält"
+
+#. HTML error recovery: SELECT
+#: src/LYOptions.c:4087
+msgid "HTML error recovery"
+msgstr "HTML-felåterhämtning"
+
+#. Bad HTML messages: SELECT
+#: src/LYOptions.c:4093
+msgid "Bad HTML messages"
+msgstr "Meddelanden om trasig HTML"
+
+#. Show Images: SELECT
+#: src/LYOptions.c:4099
+msgid "Show images"
+msgstr "Visa bilder"
+
+#. Verbose Images: ON/OFF
+#: src/LYOptions.c:4113
+msgid "Verbose images"
+msgstr "Pratsamma bilder"
+
+#. Collapse BR Tags: ON/OFF
+#: src/LYOptions.c:4119
+msgid "Collapse BR tags"
+msgstr "Fäll ihop BR-taggar"
+
+#. Trim blank lines: ON/OFF
+#: src/LYOptions.c:4125
+msgid "Trim blank lines"
+msgstr "Beskär tomrader"
+
+#.
+#. * Headers Transferred to Remote Servers
+#.
+#: src/LYOptions.c:4133
+msgid "Headers Transferred to Remote Servers"
+msgstr "Frågehuvud överfört till fjärrservrar"
+
+#. ***************************************************************
+#. Mail Address: INPUT
+#: src/LYOptions.c:4137
+msgid "Personal mail address"
+msgstr "Egen e-postadress"
+
+#: src/LYOptions.c:4142
+msgid "Personal name for mail"
+msgstr "Eget namn för e-post"
+
+#: src/LYOptions.c:4149
+msgid "Password for anonymous ftp"
+msgstr "Lösenord för anonym ftp"
+
+#. Preferred content type: SELECT
+#: src/LYOptions.c:4155
+msgid "Preferred content type"
+msgstr "Önskad innehållstyp"
+
+#. Preferred media type: SELECT
+#: src/LYOptions.c:4161
+msgid "Preferred media type"
+msgstr "Önskad mediatyp"
+
+#. Preferred encoding: SELECT
+#: src/LYOptions.c:4167
+msgid "Preferred encoding"
+msgstr "Önskade kodningsform"
+
+#. Preferred Document Character Set: INPUT
+#: src/LYOptions.c:4173
+msgid "Preferred document character set"
+msgstr "Önskad dokumentteckenuppsättning"
+
+#. Preferred Document Language: INPUT
+#: src/LYOptions.c:4178
+msgid "Preferred document language"
+msgstr "Önskade dokumentspråk"
+
+#. HTTP protocol SELECT
+#: src/LYOptions.c:4183
+msgid "HTTP protocol"
+msgstr "HTTP-protokoll"
+
+#: src/LYOptions.c:4190
+msgid "Send User-Agent header"
+msgstr "Sänd webbläsaridentifiering"
+
+#: src/LYOptions.c:4192
+msgid "User-Agent header"
+msgstr "Webbläsaridentifiering"
+
+#.
+#. * Listing and Accessing Files
+#.
+#: src/LYOptions.c:4200
+msgid "Listing and Accessing Files"
+msgstr "Visning av och åtkomst till filer"
+
+#. FTP sort: SELECT
+#: src/LYOptions.c:4205
+msgid "Use Passive FTP"
+msgstr "Använd passiv ftp"
+
+#. FTP sort: SELECT
+#: src/LYOptions.c:4211
+msgid "FTP sort criteria"
+msgstr "Sortering för ftp-kataloger"
+
+#. Local Directory Sort: SELECT
+#: src/LYOptions.c:4219
+msgid "Local directory sort criteria"
+msgstr "Sortering för lokala kataloger"
+
+#. Local Directory Order: SELECT
+#: src/LYOptions.c:4225
+msgid "Local directory sort order"
+msgstr "Sortering för lokala kataloger"
+
+#: src/LYOptions.c:4234
+msgid "Show dot files"
+msgstr "Visa punktfiler"
+
+#: src/LYOptions.c:4242
+msgid "Execution links"
+msgstr "Exekveringslänkar"
+
+#: src/LYOptions.c:4260
+msgid "Pause when showing message"
+msgstr "Pausa vid visning av meddelande"
+
+#. Show transfer rate: SELECT
+#: src/LYOptions.c:4267
+msgid "Show transfer rate"
+msgstr "Visa överföringshastighet"
+
+#.
+#. * Special Files and Screens
+#.
+#: src/LYOptions.c:4287
+msgid "Special Files and Screens"
+msgstr "Speciella filer och skärmar"
+
+#: src/LYOptions.c:4292
+msgid "Multi-bookmarks"
+msgstr "Multibokmärken"
+
+#: src/LYOptions.c:4300
+msgid "Review/edit Bookmarks files"
+msgstr "Se/ändra bokmärkesfiler"
+
+#: src/LYOptions.c:4303
+msgid "Goto multi-bookmark menu"
+msgstr "Gå till multibokmärkesmenyn"
+
+#: src/LYOptions.c:4305
+msgid "Bookmarks file"
+msgstr "Bokmärkesfil"
+
+#. Auto Session: ON/OFF
+#: src/LYOptions.c:4312
+msgid "Auto Session"
+msgstr "Automatiskt arbetspass"
+
+#. Session File Menu: INPUT
+#: src/LYOptions.c:4318
+msgid "Session file"
+msgstr "Arbetspassfil"
+
+#. Visited Pages: SELECT
+#: src/LYOptions.c:4324
+msgid "Visited Pages"
+msgstr "Besökta sidor"
+
+#: src/LYOptions.c:4329
+msgid "View the file "
+msgstr "Visa filen "
+
+#: src/LYPrint.c:956
+#, c-format
+msgid " Print job complete.\n"
+msgstr " Utskriftsjobb färdigt.\n"
+
+#: src/LYPrint.c:1283
+msgid "Document:"
+msgstr "Dokument:"
+
+#: src/LYPrint.c:1284
+msgid "Number of lines:"
+msgstr "Antal länkar:"
+
+#: src/LYPrint.c:1285
+msgid "Number of pages:"
+msgstr "Antal sidor:"
+
+#: src/LYPrint.c:1286
+msgid "pages"
+msgstr "sidor"
+
+#: src/LYPrint.c:1286
+msgid "page"
+msgstr "sida"
+
+#: src/LYPrint.c:1287
+msgid "(approximately)"
+msgstr "(ungefär)"
+
+#: src/LYPrint.c:1294
+msgid "Some print functions have been disabled!"
+msgstr "Vissa utskriftsfunktioner har deaktiverats!"
+
+#: src/LYPrint.c:1298
+msgid "Standard print options:"
+msgstr "Fördefinierade utskriftsalternativ:"
+
+#: src/LYPrint.c:1299
+msgid "Print options:"
+msgstr "Utskriftsalternativ"
+
+#: src/LYPrint.c:1306
+msgid "Save to a local file"
+msgstr "Spara som lokal fil"
+
+#: src/LYPrint.c:1308
+msgid "Save to disk disabled"
+msgstr "\"Spara på disk\" deaktiverad"
+
+#: src/LYPrint.c:1315
+msgid "Mail the file"
+msgstr "Sänd filer per e-post"
+
+#: src/LYPrint.c:1322
+msgid "Print to the screen"
+msgstr "Skriv ut på skärmen"
+
+#: src/LYPrint.c:1327
+msgid "Print out on a printer attached to your vt100 terminal"
+msgstr "Skriv ut på en skrivare ansluten till din vt100-terminal"
+
+#: src/LYReadCFG.c:437
+#, c-format
+msgid ""
+"Syntax Error parsing COLOR in configuration file:\n"
+"The line must be of the form:\n"
+"COLOR:INTEGER:FOREGROUND:BACKGROUND\n"
+"\n"
+"Here FOREGROUND and BACKGROUND must be one of:\n"
+"The special strings 'nocolor' or 'default', or\n"
+msgstr ""
+"Syntaxfel vid tolkning av färg (COLOR) i konfigurationsfil:\n"
+"Raden måste vara på formen:\n"
+"COLOR:HELTAL:FÖRGRUND:BAKGRUND\n"
+"\n"
+"FÖRGRUND och BAKGRUND måste vara en av:\n"
+"specialsträngarna \"nocolor\" eller \"default\", eller\n"
+
+#: src/LYReadCFG.c:450
+msgid "Offending line:"
+msgstr "Felaktig rad:"
+
+#: src/LYReadCFG.c:764
+#, c-format
+msgid "key remapping of %s to %s for %s failed\n"
+msgstr "tangentomdefiniering av %s till %s för %s misslyckades\n"
+
+#: src/LYReadCFG.c:771
+#, c-format
+msgid "key remapping of %s to %s failed\n"
+msgstr "tangentomdefiniering av %s till %s misslyckades\n"
+
+#: src/LYReadCFG.c:792
+#, c-format
+msgid "invalid line-editor selection %s for key %s, selecting all\n"
+msgstr "ogiltig radredigeringsval %s för tangent %s, väljer alla\n"
+
+#: src/LYReadCFG.c:817 src/LYReadCFG.c:832
+#, c-format
+msgid "setting of line-editor binding for key %s (0x%x) to 0x%x for %s failed\n"
+msgstr "inställning av radredigeringsdefinition för tangent %s (0x%x) till 0x%x för %s misslyckades\n"
+
+#: src/LYReadCFG.c:839
+#, c-format
+msgid "setting of line-editor binding for key %s (0x%x) for %s failed\n"
+msgstr "inställning av radredigeringsdefinition för tangent %s (0x%x) för %s misslyckades\n"
+
+#: src/LYReadCFG.c:937
+#, c-format
+msgid "Lynx: cannot start, CERN rules file %s is not available\n"
+msgstr "Lynx: kan inte börja, CERN-regelfilen %s ej tillgänglig\n"
+
+#: src/LYReadCFG.c:938
+msgid "(no name)"
+msgstr "(inget namn)"
+
+#: src/LYReadCFG.c:2086
+#, c-format
+msgid "More than %d nested lynx.cfg includes -- perhaps there is a loop?!?\n"
+msgstr "Mer än %d staplade lynx.cfg-inkluderingar -- kanske en slinga?!?\n"
+
+#: src/LYReadCFG.c:2088
+#, c-format
+msgid "Last attempted include was '%s',\n"
+msgstr "Sista försökta inkludering var \"%s\",\n"
+
+#: src/LYReadCFG.c:2089
+#, c-format
+msgid "included from '%s'.\n"
+msgstr "inkluderad från \"%s\".\n"
+
+#: src/LYReadCFG.c:2500 src/LYReadCFG.c:2513 src/LYReadCFG.c:2571
+msgid "The following is read from your lynx.cfg file."
+msgstr "Följande läses från din lynx.cfg-fil."
+
+#: src/LYReadCFG.c:2501 src/LYReadCFG.c:2514
+msgid "Please read the distribution"
+msgstr "Se distributionens"
+
+#: src/LYReadCFG.c:2507 src/LYReadCFG.c:2517
+msgid "for more comments."
+msgstr "för ytterligare kommentarer."
+
+#: src/LYReadCFG.c:2553
+msgid "RELOAD THE CHANGES"
+msgstr "HÄMTA OM ÄNDRINGARNA"
+
+#: src/LYReadCFG.c:2561
+msgid "Your primary configuration"
+msgstr "Din primära konfiguration"
+
+#: src/LYShowInfo.c:116
+msgid "URL:"
+msgstr "Adress:"
+
+#: src/LYShowInfo.c:200
+msgid "Directory that you are currently viewing"
+msgstr "Visad katalog"
+
+#: src/LYShowInfo.c:203
+msgid "Name:"
+msgstr "Namn:"
+
+#: src/LYShowInfo.c:220
+msgid "Directory that you have currently selected"
+msgstr "Markerade kataloger"
+
+#: src/LYShowInfo.c:222
+msgid "File that you have currently selected"
+msgstr "Markerade filer"
+
+#: src/LYShowInfo.c:225
+msgid "Symbolic link that you have currently selected"
+msgstr "Markerade symboliska länkar"
+
+#: src/LYShowInfo.c:228
+msgid "Item that you have currently selected"
+msgstr "Markerade poster"
+
+#: src/LYShowInfo.c:230
+msgid "Full name:"
+msgstr "Fullt namn:"
+
+#: src/LYShowInfo.c:243
+msgid "Unable to follow link"
+msgstr "Kan inte följa länk"
+
+#: src/LYShowInfo.c:245
+msgid "Points to file:"
+msgstr "Pekar på fil:"
+
+#: src/LYShowInfo.c:250
+msgid "Name of owner:"
+msgstr "Namn på ägare:"
+
+#: src/LYShowInfo.c:253
+msgid "Group name:"
+msgstr "Gruppnamn:"
+
+#: src/LYShowInfo.c:255
+msgid "File size:"
+msgstr "Filstorlek:"
+
+#: src/LYShowInfo.c:257
+msgid "(bytes)"
+msgstr "(byte)"
+
+#.
+#. * Include date and time information.
+#.
+#: src/LYShowInfo.c:262
+msgid "Creation date:"
+msgstr "Skapad den:"
+
+#: src/LYShowInfo.c:265
+msgid "Last modified:"
+msgstr "Senast ändrad:"
+
+#: src/LYShowInfo.c:268
+msgid "Last accessed:"
+msgstr "Senast åtkommen:"
+
+#: src/LYShowInfo.c:274
+msgid "Access Permissions"
+msgstr "Åtkomstbehörighet"
+
+#: src/LYShowInfo.c:309
+msgid "Group:"
+msgstr "Grupp:"
+
+#: src/LYShowInfo.c:329
+msgid "World:"
+msgstr "Övriga:"
+
+#: src/LYShowInfo.c:336
+msgid "File that you are currently viewing"
+msgstr "Visad fil"
+
+#: src/LYShowInfo.c:344 src/LYShowInfo.c:444
+msgid "Linkname:"
+msgstr "Länknamn:"
+
+#: src/LYShowInfo.c:350 src/LYShowInfo.c:365
+msgid "Charset:"
+msgstr "Teckenuppsättning:"
+
+#: src/LYShowInfo.c:364
+msgid "(assumed)"
+msgstr "(antogs)"
+
+#: src/LYShowInfo.c:371
+msgid "Server:"
+msgstr "Server:"
+
+#: src/LYShowInfo.c:374
+msgid "Date:"
+msgstr "Datum:"
+
+#: src/LYShowInfo.c:377
+msgid "Last Mod:"
+msgstr "Senaste ändring:"
+
+#: src/LYShowInfo.c:381
+msgid "Expires:"
+msgstr "Utgår:"
+
+#: src/LYShowInfo.c:384
+msgid "Cache-Control:"
+msgstr "Cachekontroll:"
+
+#: src/LYShowInfo.c:387
+msgid "Content-Length:"
+msgstr "Datalängd:"
+
+#: src/LYShowInfo.c:391
+msgid "Length:"
+msgstr "Längd:"
+
+#: src/LYShowInfo.c:396
+msgid "Language:"
+msgstr "Språk:"
+
+#: src/LYShowInfo.c:402
+msgid "Post Data:"
+msgstr "\"POST\"-data:"
+
+#: src/LYShowInfo.c:405
+msgid "Post Content Type:"
+msgstr "\"POST\"-datatyp:"
+
+#: src/LYShowInfo.c:408
+msgid "Owner(s):"
+msgstr "Ägare:"
+
+#: src/LYShowInfo.c:413
+msgid "size:"
+msgstr "storlek:"
+
+#: src/LYShowInfo.c:415
+msgid "lines"
+msgstr "rader"
+
+#: src/LYShowInfo.c:419
+msgid "forms mode"
+msgstr "formulärläge"
+
+#: src/LYShowInfo.c:421
+msgid "source"
+msgstr "källkod"
+
+#: src/LYShowInfo.c:422
+msgid "normal"
+msgstr "normal"
+
+#: src/LYShowInfo.c:424
+msgid ", safe"
+msgstr ", säker"
+
+#: src/LYShowInfo.c:426
+msgid ", via internal link"
+msgstr ", via intern länk"
+
+#: src/LYShowInfo.c:430
+msgid ", no-cache"
+msgstr ", ingen cache"
+
+#: src/LYShowInfo.c:432
+msgid ", ISMAP script"
+msgstr ", ISMAP-skript"
+
+#: src/LYShowInfo.c:434
+msgid ", bookmark file"
+msgstr ", bokmärkesfil"
+
+#: src/LYShowInfo.c:437
+msgid "mode:"
+msgstr "läge:"
+
+#: src/LYShowInfo.c:443
+msgid "Link that you currently have selected"
+msgstr "Markerad länk"
+
+#: src/LYShowInfo.c:452
+msgid "Method:"
+msgstr "Metod:"
+
+#: src/LYShowInfo.c:456
+msgid "Enctype:"
+msgstr "Kodningstyp:"
+
+#: src/LYShowInfo.c:462
+msgid "Action:"
+msgstr "Åtgärd:"
+
+#: src/LYShowInfo.c:468
+msgid "(Form field)"
+msgstr "(Formulärfält)"
+
+#: src/LYShowInfo.c:478
+msgid "No Links on the current page"
+msgstr "Ingen länk på aktuell sida"
+
+#: src/LYShowInfo.c:483
+msgid "Server Headers:"
+msgstr "Serverhuvuden:"
+
+#: src/LYStyle.c:332
+#, c-format
+msgid ""
+"Syntax Error parsing style in lss file:\n"
+"[%s]\n"
+"The line must be of the form:\n"
+"OBJECT:MONO:COLOR (ie em:bold:brightblue:white)\n"
+"where OBJECT is one of EM,STRONG,B,I,U,BLINK etc.\n"
+"\n"
+msgstr ""
+"Syntaxfel vid tolkning av stil i lss-fil:\n"
+"[%s]\n"
+"Raden måste vara på formen:\n"
+"OBJEKT:MONO:FÄRG (t.ex em:bold:brightblue:white)\n"
+"där OBJEKT är en av EM,STRONG,B,I,U,BLINK etc.\n"
+"\n"
+
+#: src/LYStyle.c:941
+#, c-format
+msgid ""
+"\n"
+"Lynx file \"%s\" is not available.\n"
+"\n"
+msgstr ""
+"\n"
+"Lynxfilen \"%s\" ej tillgänglig.\n"
+"\n"
+
+#: src/LYTraversal.c:111
+msgid "here is a list of the history stack so that you may rebuild"
+msgstr "här finns en lista över historikstacken så att du kan bygga om"
+
+#: src/LYUpload.c:77
+msgid "ERROR! - upload command is misconfigured"
+msgstr "FEL! - insändningskommandot är felkonfigurerat"
+
+#: src/LYUpload.c:98
+msgid "Illegal redirection \"../\" found! Request ignored."
+msgstr "Felaktig omdirigering \"../\" hittad! Begäran ignorerad."
+
+#: src/LYUpload.c:101
+msgid "Illegal character \"/\" found! Request ignored."
+msgstr "Felaktigt tecken \"/\" hittad! Begäran ignorerad."
+
+#: src/LYUpload.c:104
+msgid "Illegal redirection using \"~\" found! Request ignored."
+msgstr "Ogiltig omdirigering med \"~\" hittad! Begäran ignorerad."
+
+#: src/LYUpload.c:157
+msgid "Unable to upload file."
+msgstr "Kan inte skicka fil."
+
+#: src/LYUpload.c:196
+msgid "Upload To:"
+msgstr "Skicka till:"
+
+#: src/LYUpload.c:197
+msgid "Upload options:"
+msgstr "Insändningsalternativ:"
+
+#: src/LYUtils.c:1911
+msgid "Download document URL put to clipboard."
+msgstr "Adress till hämtat dokument lagt i urklipp."
+
+#: src/LYUtils.c:2658
+msgid "Unexpected access protocol for this URL scheme."
+msgstr "Oväntat åtkomstprotokoll för denna adresstyp."
+
+#: src/LYUtils.c:3571
+msgid "Too many tempfiles"
+msgstr "För många temporärfiler"
+
+#: src/LYUtils.c:3871
+msgid "unknown restriction"
+msgstr "okänd begränsning"
+
+#: src/LYUtils.c:3902
+#, c-format
+msgid "No restrictions set.\n"
+msgstr "Inga begränsningar satta.\n"
+
+#: src/LYUtils.c:3905
+#, c-format
+msgid "Restrictions set:\n"
+msgstr "Satta begränsningar:\n"
+
+#: src/LYUtils.c:5202
+msgid "Cannot find HOME directory"
+msgstr "Hittar inte hemkatalogen (HOME)"
+
+#: src/LYrcFile.c:16
+msgid "Normally disabled. See ENABLE_LYNXRC in lynx.cfg\n"
+msgstr "Vanligtvis avstängd. Se ENABLE_LYNXRC i lynx.cfg\n"
+
+#: src/LYrcFile.c:373
+msgid ""
+"accept_all_cookies allows the user to tell Lynx to automatically\n"
+"accept all cookies if desired. The default is \"FALSE\" which will\n"
+"prompt for each cookie. Set accept_all_cookies to \"TRUE\" to accept\n"
+"all cookies.\n"
+msgstr ""
+"accept_all_cookies låter användaren tala om för Lynx att automatiskt\n"
+"acceptera alla kakor. Förvalet är \"FALSE\", och visar en fråga för\n"
+"varje kaka. Sätt accept_all_cookies till \"TRUE\" för att acceptera\n"
+"alla kakor.\n"
+
+#: src/LYrcFile.c:381
+msgid ""
+"anonftp_password allows the user to tell Lynx to use the personal\n"
+"email address as the password for anonymous ftp. If no value is given,\n"
+"Lynx will use the personal email address. Set anonftp_password\n"
+"to a different value if you choose.\n"
+msgstr ""
+"anonftp_password låter användaren ange den personliga e-postadress\n"
+"Lynx skall använda som lösenord för anonym ftp. Om inget värde anges\n"
+"kommer Lynx använda den personliga e-postadressen. Sätt anonftp_password\n"
+"till ett annat värde om du vill välja.\n"
+
+#: src/LYrcFile.c:390
+msgid ""
+"bookmark_file specifies the name and location of the default bookmark\n"
+"file into which the user can paste links for easy access at a later\n"
+"date.\n"
+msgstr ""
+"bookmark_file anger namn och plats för standardbokmärkesfilen, i vilken\n"
+"användaren kan klistra in länkar för att lätt komma åt dem senare.\n"
+
+#: src/LYrcFile.c:395
+msgid ""
+"If case_sensitive_searching is \"on\" then when the user invokes a search\n"
+"using the 's' or '/' keys, the search performed will be case sensitive\n"
+"instead of case INsensitive. The default is usually \"off\".\n"
+msgstr ""
+"Om case_sensitive_searching är \"on\" när användaren startar en sökning\n"
+"med \"s\" eller \"/\" kommer sökningen som genomförs att göra skillnad på\n"
+"gemener och versaler. Förvalet är normalt sett av (\"off\").\n"
+
+#: src/LYrcFile.c:400
+msgid ""
+"The character_set definition controls the representation of 8 bit\n"
+"characters for your terminal. If 8 bit characters do not show up\n"
+"correctly on your screen you may try changing to a different 8 bit\n"
+"set or using the 7 bit character approximations.\n"
+"Current valid characters sets are:\n"
+msgstr ""
+"Inställningen för character_set anger hur åttabitarstecken representeras\n"
+"på din terminal. Om åttabitarstecken inte visas korrekt på din skärm kan\n"
+"du försöka att ändra till en annan åttabitarsteckenuppsättning, eller\n"
+"använda sjubitarstolkningarna.\n"
+"Giltiga teckenuppsättningar är:\n"
+
+#: src/LYrcFile.c:408
+msgid ""
+"cookie_accept_domains and cookie_reject_domains are comma-delimited\n"
+"lists of domains from which Lynx should automatically accept or reject\n"
+"all cookies. If a domain is specified in both options, rejection will\n"
+"take precedence. The accept_all_cookies parameter will override any\n"
+"settings made here.\n"
+msgstr ""
+"cookie_accept_domains och cookie_reject_domains är kommaavdelade\n"
+"listor över domäner från vilka Lynx automatisk skall acceptera eller\n"
+"avvisa kakor. Om en domän anges i båda alternativet kommer avvisning\n"
+"att gå före. Flaggan accept_all_cookies går före alla inställningar\n"
+"som görs här.\n"
+
+#: src/LYrcFile.c:416
+msgid ""
+"cookie_file specifies the file from which to read persistent cookies.\n"
+"The default is ~/"
+msgstr ""
+"cookie_file anger filen som varaktiga kakor skall läsas från.\n"
+"Förval är ~/"
+
+#: src/LYrcFile.c:421
+msgid ""
+"cookie_loose_invalid_domains, cookie_strict_invalid_domains, and\n"
+"cookie_query_invalid_domains are comma-delimited lists of which domains\n"
+"should be subjected to varying degrees of validity checking. If a\n"
+"domain is set to strict checking, strict conformance to RFC2109 will\n"
+"be applied. A domain with loose checking will be allowed to set cookies\n"
+"with an invalid path or domain attribute. All domains will default to\n"
+"querying the user for an invalid path or domain.\n"
+msgstr ""
+"cookie_loose_invalid_domains, cookie_strict_invalid_domains och\n"
+"cookie_query_invalid_domains är kommaavdelade listor över domäner som\n"
+"skall underkastas olika nivåer av giltighetskontroll. Om en domän sätts\n"
+"till strikt kontroll kommer strikt tolkning av RFC2109 att gälla.\n"
+"En domän med lös kontroll gör det möjligt att sätta kakor med felaktiga\n"
+"sökväg- eller domänattribut. Alla domäner får som förval frågor till\n"
+"användaren för felaktiga sökvägar eller domäner.\n"
+
+#: src/LYrcFile.c:435
+msgid ""
+"dir_list_order specifies the directory list order under DIRED_SUPPORT\n"
+"(if implemented). The default is \"ORDER_BY_NAME\"\n"
+msgstr ""
+"dir_list_order anger kataloglistesortering i DIRED_SUPPORT (om det är\n"
+"implementerat). Förvalet är \"ORDER_BY_NAME\"\n"
+
+#: src/LYrcFile.c:440
+msgid ""
+"dir_list_styles specifies the directory list style under DIRED_SUPPORT\n"
+"(if implemented). The default is \"MIXED_STYLE\", which sorts both\n"
+"files and directories together. \"FILES_FIRST\" lists files first and\n"
+"\"DIRECTORIES_FIRST\" lists directories first.\n"
+msgstr ""
+"dir_list_styles anger kataloglistestil i DIRED_SUPPORT (om det är\n"
+"implementerat). Förvalet är \"MIXED_STYLE\", vilket sorterar filer\n"
+"och kataloger tillsammans. \"FILES_FIRST\" listar filer först, och\n"
+"\"DIRECTORIES_FIRST\" listar kataloger först.\n"
+
+#: src/LYrcFile.c:448
+msgid ""
+"If emacs_keys is to \"on\" then the normal EMACS movement keys:\n"
+" ^N = down ^P = up\n"
+" ^B = left ^F = right\n"
+"will be enabled.\n"
+msgstr ""
+"Om emacs_keys sätts till \"on\" kommer EMACS-förflyttningstangenter att\n"
+"aktiveras:\n"
+" ^N = ned ^P = upp\n"
+" ^B = vänster ^F = höger\n"
+
+#: src/LYrcFile.c:454
+msgid ""
+"file_editor specifies the editor to be invoked when editing local files\n"
+"or sending mail. If no editor is specified, then file editing is disabled\n"
+"unless it is activated from the command line, and the built-in line editor\n"
+"will be used for sending mail.\n"
+msgstr ""
+"file_editor anger vilket redigeringsprogram som skall aktiveras när lokala\n"
+"filer redigeras, eller e-post sänds. Om inget program anges deaktiveras\n"
+"filredigering, såvida det inte aktiveras från kommandoraden, och den inbyggda\n"
+"radredigeraren används för e-post.\n"
+
+#: src/LYrcFile.c:461
+msgid ""
+"The file_sorting_method specifies which value to sort on when viewing\n"
+"file lists such as FTP directories. The options are:\n"
+" BY_FILENAME -- sorts on the name of the file\n"
+" BY_TYPE -- sorts on the type of the file\n"
+" BY_SIZE -- sorts on the size of the file\n"
+" BY_DATE -- sorts on the date of the file\n"
+msgstr ""
+"file_sorting_method anger hur fillistor, såsom ftp-kataloger, skall\n"
+"sorteras. Alternativen är:\n"
+" BY_FILENAME -- sorterar efter filnamn\n"
+" BY_TYPE -- sorterar efter filtyp\n"
+" BY_SIZE -- sorterar efter filstorlek\n"
+" BY_DATE -- sorterar efter fildatum\n"
+
+#: src/LYrcFile.c:492
+msgid ""
+"lineedit_mode specifies the key binding used for inputting strings in\n"
+"prompts and forms. If lineedit_mode is set to \"Default Binding\" then\n"
+"the following control characters are used for moving and deleting:\n"
+"\n"
+" Prev Next Enter = Accept input\n"
+" Move char: <- -> ^G = Cancel input\n"
+" Move word: ^P ^N ^U = Erase line\n"
+" Delete char: ^H ^R ^A = Beginning of line\n"
+" Delete word: ^B ^F ^E = End of line\n"
+"\n"
+"Current lineedit modes are:\n"
+msgstr ""
+"lineedit_mode ange tangentbordsfunktioner som används för att skriva\n"
+"in strängar i frågor och formulär. Om lineedit_mode sätts till\n"
+"\"Default Binding\" kommer följande kontrolltecken användas för att\n"
+"flytta och ta bort:\n"
+"\n"
+" Bakåt Framåt Enter = Bekräfta indata\n"
+" Flytta tecken: <- -> ^G = Avbryt inmatning\n"
+" Flytta ord: ^P ^N ^U = Radera rad\n"
+" Radera tecken: ^H ^R ^A = Radbörjan\n"
+" Radera ord: ^B ^F ^E = Radslut\n"
+"\n"
+
+#: src/LYrcFile.c:510
+msgid ""
+"The following allow you to define sub-bookmark files and descriptions.\n"
+"The format is multi_bookmark<capital_letter>=<filename>,<description>\n"
+"Up to 26 bookmark files (for the English capital letters) are allowed.\n"
+"We start with \"multi_bookmarkB\" since 'A' is the default (see above).\n"
+msgstr ""
+"Följande gör det möjligt för dig att definiera underbokmärkesfiler och\n"
+"tillhörande beskrivningar. Formatet är:\n"
+"multi_bookmark<stor bokstav>=<filnamn>,<beskrivning>\n"
+"Upp till 26 bokmärkesfiler (de stora bokstäverna A-Z) tillåts.\n"
+"Vi börjar med \"multi_bookmarkB\" eftersom \"A\" är förvalet (se ovan).\n"
+
+#: src/LYrcFile.c:516
+msgid ""
+"personal_mail_address specifies your personal mail address. The\n"
+"address will be sent during HTTP file transfers for authorization and\n"
+"logging purposes, and for mailed comments.\n"
+"If you do not want this information given out, set the NO_FROM_HEADER\n"
+"to TRUE in lynx.cfg, or use the -nofrom command line switch. You also\n"
+"could leave this field blank, but then you won't have it included in\n"
+"your mailed comments.\n"
+msgstr ""
+"personal_mail_address anger din personliga e-postadress. Adressen\n"
+"sänds under HTTP-filöverföringar för auktoriserings- och\n"
+"loggningsändamål, samt för att sända kommentarer per e-post\n"
+"Om du inte vill att denna information skall sändas, sätt NO_FROM_HEADER\n"
+"till TRUE i lynx.cfg, eller använd kommandoradsflaggan -nofrom. Du kan\n"
+"även lämna detta fält blankt, men då inkluderas det inte i kommentarer\n"
+"du sänder.\n"
+
+#: src/LYrcFile.c:525
+msgid ""
+"personal_mail_name specifies your personal name, for mail. The\n"
+"name is sent for mailed comments. Lynx will prompt for this,\n"
+"showing the configured value as a default when sending mail.\n"
+"This is not necessarily the same as a name provided as part of the\n"
+"personal_mail_address.\n"
+"Lynx does not save your changes to that default value as a side-effect\n"
+"of sending email. To update the default value, you must use the options\n"
+"menu, or modify this file directly.\n"
+msgstr ""
+"personal_mail_name anger ditt namn, för e-post. Namnet sänds\n"
+"vid e-postade kommentarer. Lynx frågar om detta och visar det\n"
+"inställda namnet som standardvärde vid sändning av e-post.\n"
+"Det behöver inte nödvändigtvis vara samma namn som anges som\n"
+"en del av personal_mail_address.\n"
+"Lynx sparar inte dina ändringar som standardvärde som en\n"
+"sidoeffekt av att sända e-post. För att ändra standardvärdet måste\n"
+"du använda inställningsmenyn, eller redigera den här filen direkt.\n"
+
+#: src/LYrcFile.c:535
+msgid ""
+"preferred_charset specifies the character set in MIME notation (e.g.,\n"
+"ISO-8859-2, ISO-8859-5) which Lynx will indicate you prefer in requests\n"
+"to http servers using an Accept-Charset header. The value should NOT\n"
+"include ISO-8859-1 or US-ASCII, since those values are always assumed\n"
+"by default. May be a comma-separated list.\n"
+"If a file in that character set is available, the server will send it.\n"
+"If no Accept-Charset header is present, the default is that any\n"
+"character set is acceptable. If an Accept-Charset header is present,\n"
+"and if the server cannot send a response which is acceptable\n"
+"according to the Accept-Charset header, then the server SHOULD send\n"
+"an error response, though the sending of an unacceptable response\n"
+"is also allowed.\n"
+msgstr ""
+"preferred_charset anger de teckenuppsättningar Lynx kommer att ange att\n"
+"du önskar ta emot i frågor till http-serverar i MIME-notation (t.ex\n"
+"ISO-8859-2, ISO-8859-5). Detta sänds i Accept-Charset-huvudet. Värdet\n"
+"bör inte innehålla ISO-8859-1 eller US-ASCII eftersom de värdena alltid\n"
+"antas som förval. Kan vara en kommaseparerad lista.\n"
+"Om en fil i den teckenuppsättningen finns att tillgå kommer servern\n"
+"Om inget Accept-Charset sänds är förvalet att alla teckenuppsättningar\n"
+"är acceptabla. Om en Accept-Charset är tillgänglig, och om servern inte\n"
+"kan sända ett svar som är acceptabelt enligt Accept-Charset-huvudet BÖR\n"
+"servern sända ett felmeddelande, även om det är tillåtet att sända även\n"
+"ett icke-acceptabelt svar.\n"
+
+#: src/LYrcFile.c:553
+msgid ""
+"preferred_language specifies the language in MIME notation (e.g., en,\n"
+"fr, may be a comma-separated list in decreasing preference)\n"
+"which Lynx will indicate you prefer in requests to http servers.\n"
+"If a file in that language is available, the server will send it.\n"
+"Otherwise, the server will send the file in its default language.\n"
+msgstr ""
+"preferred_language anger de språk som Lynx kommer att ange att du önskar\n"
+"ta emot i frågor till webbservrar i MIME-notation (t.ex en,fr, kan vara\n"
+"en kommaseparerad lista i minskande prioriteringsordning).\n"
+"Om en fil i det språket finns att tillgå kommer servern sända den.\n"
+"Annars kommer servern sända filen i sitt standardspråk.\n"
+
+#: src/LYrcFile.c:564
+msgid ""
+"If run_all_execution_links is set \"on\" then all local execution links\n"
+"will be executed when they are selected.\n"
+"\n"
+"WARNING - This is potentially VERY dangerous. Since you may view\n"
+" information that is written by unknown and untrusted sources\n"
+" there exists the possibility that Trojan horse links could be\n"
+" written. Trojan horse links could be written to erase files\n"
+" or compromise security. This should only be set to \"on\" if\n"
+" you are viewing trusted source information.\n"
+msgstr ""
+"Om run_all_execution_links är satt till \"on\" kommer alla lokala\n"
+"programkörningslänkar att köras när de väljs.\n"
+"\n"
+"VARNING - Detta kan vara MYCKET farligt. Eftersom du kan visa information\n"
+" som skrivits av okända och otillförlitliga källor är det möjligt\n"
+" att trojanska hästlänkar kan skrivas. Trojanska hästlänkar kan\n"
+" skrivas så att de raderar filer eller komprometterar säkerheten.\n"
+" Detta bör endast aktiveras (\"on\") om du visar information från\n"
+" tillförlitliga källor.\n"
+
+#: src/LYrcFile.c:575
+msgid ""
+"If run_execution_links_on_local_files is set \"on\" then all local\n"
+"execution links that are found in LOCAL files will be executed when they\n"
+"are selected. This is different from run_all_execution_links in that\n"
+"only files that reside on the local system will have execution link\n"
+"permissions.\n"
+"\n"
+"WARNING - This is potentially dangerous. Since you may view\n"
+" information that is written by unknown and untrusted sources\n"
+" there exists the possibility that Trojan horse links could be\n"
+" written. Trojan horse links could be written to erase files\n"
+" or compromise security. This should only be set to \"on\" if\n"
+" you are viewing trusted source information.\n"
+msgstr ""
+"Om run_all_execution_links_on_local_files är satt till \"on\" kommer\n"
+"alla lokala programkörningslänkar i LOKALA filer att köras när de väljs.\n"
+"Detta skiljer sig från run_all_execution_links i det att endast filer\n"
+"som ligger på det lokala systemet har rättighet att innehålla\n"
+"programkörningslänkar.\n"
+"\n"
+"VARNING - Detta kan vara farligt. Eftersom du kan visa information som\n"
+" skrivits av okända och otillförlitliga källor är det möjligt att\n"
+" trojanska hästlänkar kan skrivas. Trojanska hästlänkar kan\n"
+" skrivas å att de raderar filer eller komprometterar säkerheten.\n"
+" Detta bör endast aktiveras (\"on\") om du visar information från\n"
+" tillförlitliga källor.\n"
+
+#: src/LYrcFile.c:593
+msgid ""
+"select_popups specifies whether the OPTIONs in a SELECT block which\n"
+"lacks a MULTIPLE attribute are presented as a vertical list of radio\n"
+"buttons or via a popup menu. Note that if the MULTIPLE attribute is\n"
+"present in the SELECT start tag, Lynx always will create a vertical list\n"
+"of checkboxes for the OPTIONs. A value of \"on\" will set popup menus\n"
+"as the default while a value of \"off\" will set use of radio boxes.\n"
+"The default can be overridden via the -popup command line toggle.\n"
+msgstr ""
+"select_popups anger huruvida OPTION i ett SELECT-block som saknar\n"
+"MULTIPLE-attribut skall visas som en vertikal lista med radioknappar\n"
+"eller via en popupmeny. Observera att om MULTIPLE-attributet finns i\n"
+"SELECT-märket kommer Lynx alltid skapa en vertikal lista med kryssrutor\n"
+"för varje OPTION. Värdet \"on\" skapar som förval popupmenyer, medan\n"
+"värdet \"off\" väljer radioknappar. Förvalet kan gås förbi via\n"
+"kommandoradsflaggan -popup.\n"
+
+#: src/LYrcFile.c:604
+msgid ""
+"show_color specifies how to set the color mode at startup. A value of\n"
+"\"never\" will force color mode off (treat the terminal as monochrome)\n"
+"at startup even if the terminal appears to be color capable. A value of\n"
+"\"always\" will force color mode on even if the terminal appears to be\n"
+"monochrome, if this is supported by the library used to build lynx.\n"
+"A value of \"default\" will yield the behavior of assuming\n"
+"a monochrome terminal unless color capability is inferred at startup\n"
+"based on the terminal type, or the -color command line switch is used, or\n"
+"the COLORTERM environment variable is set. The default behavior always is\n"
+"used in anonymous accounts or if the \"option_save\" restriction is set.\n"
+"The effect of the saved value can be overridden via\n"
+"the -color and -nocolor command line switches.\n"
+"The mode set at startup can be changed via the \"show color\" option in\n"
+"the 'o'ptions menu. If the option settings are saved, the \"on\" and\n"
+"\"off\" \"show color\" settings will be treated as \"default\".\n"
+msgstr ""
+"show_color anger hur färger ställs in vid start. Värdet \"never\" tvingar\n"
+"färg att stängas av (terminalen behandlas som vore den monokrom) vid\n"
+"start, även om terminalen verkar vara kapabel till färg. Värdet \"always\"\n"
+"tvingar färg att slås på även om terminalen verkar vara monokrom, om det\n"
+"stöds av det bibliotek som användes för att bygga lynx. Värdet \"default\"\n"
+"gör att en monokrom terminal antas såvida inte färgstöd anges vid start\n"
+"baserat på terminaltyp, eller via kommandoradsflaggan -color, eller om\n"
+"miljövariabeln COLORTERM är satt. Detta beteende används alltid för anonyma\n"
+"konton, eller om \"option_save\"-begränsningen är satt.\n"
+"Det sparade värdet kan förbigås med kommandoradsflaggorna -color och\n"
+"-nocolor.\n"
+"Läget som sätts vid start kan ändras via inställningen \"visa färg\" i\n"
+"alternativmenyn. Om alternativen sparas kommer inställningarna \"on\" och\n"
+"\"off\" att tolkas som \"default\".\n"
+
+#: src/LYrcFile.c:621
+msgid ""
+"show_cursor specifies whether to 'hide' the cursor to the right (and\n"
+"bottom, if possible) of the screen, or to place it to the left of the\n"
+"current link in documents, or current option in select popup windows.\n"
+"Positioning the cursor to the left of the current link or option is\n"
+"helpful for speech or braille interfaces, and when the terminal is\n"
+"one which does not distinguish the current link based on highlighting\n"
+"or color. A value of \"on\" will set positioning to the left as the\n"
+"default while a value of \"off\" will set 'hiding' of the cursor.\n"
+"The default can be overridden via the -show_cursor command line toggle.\n"
+msgstr ""
+"show_cursor anger om markören skall \"gömmas\" till höger (och nederst,\n"
+"om möjligt) på skärmen, eller om den skall ställas till vänster om\n"
+"aktuell länk i dokument, eller aktuellt alternativ i popupfönster.\n"
+"Att ställa markören till vänster om den aktuella länken eller alternativet\n"
+"förenklar för tal- och braillegränssnitt, och om terminalen inte gör\n"
+"skillnad på den aktuella länken med ljus- eller färgmarkering. Värdet\n"
+"\"on\" placerar markören till vänster som förval, medan \"off\" \"gömmer\"\n"
+"markören. Förvalet kan gås förbi via kommandoradsflaggan -show_cursor.\n"
+
+#: src/LYrcFile.c:632
+msgid ""
+"show_dotfiles specifies that the directory listing should include\n"
+"\"hidden\" (dot) files/directories. If set \"on\", this will be\n"
+"honored only if enabled via userdefs.h and/or lynx.cfg, and not\n"
+"restricted via a command line switch. If display of hidden files\n"
+"is disabled, creation of such files via Lynx also is disabled.\n"
+msgstr ""
+"show_dotfiles anger att kataloglistan skall inkludera \"dolda\"\n"
+"(punkt-)filer/kataloger. Om satt till \"on\" kommer detta endast\n"
+"att läsas om det aktiverats via userdefs.h och/eller lynx.cfg, och\n"
+"inte begränsat via en kommandoradsflagga. Om visning av dolda\n"
+"filer är deaktiverat kommer skapandet av sådana filer via Lynx\n"
+"också att deaktiveras.\n"
+
+#: src/LYrcFile.c:643
+msgid ""
+"If sub_bookmarks is not turned \"off\", and multiple bookmarks have\n"
+"been defined (see below), then all bookmark operations will first\n"
+"prompt the user to select an active sub-bookmark file. If the default\n"
+"Lynx bookmark_file is defined (see above), it will be used as the\n"
+"default selection. When this option is set to \"advanced\", and the\n"
+"user mode is advanced, the 'v'iew bookmark command will invoke a\n"
+"statusline prompt instead of the menu seen in novice and intermediate\n"
+"user modes. When this option is set to \"standard\", the menu will be\n"
+"presented regardless of user mode.\n"
+msgstr ""
+"Om sub_bookmarks inte är avstängt (\"off\"), och multipla bokmärken\n"
+"har angetts (se nedan) kommer alla bokmärkesfunktioner först att be\n"
+"användaren ange en aktiv underbokmärkesfil. Om en standardbokmärkesfil\n"
+"har definierats (se bookmark_file ovan), kommer den att användas som\n"
+"förval. När detta alternativ är satt till \"advanced\", och användarläget\n"
+"är avancerat, kommer kommandot visa bokmärke att visa en statusradsfråga\n"
+"istället för den meny som visas i användarlägets nybörjar- och\n"
+"mellannivåer. Om detta alternativ sätts till \"standard\" visas menyn\n"
+"oavsett användarläge.\n"
+
+#: src/LYrcFile.c:658
+msgid ""
+"user_mode specifies the users level of knowledge with Lynx. The\n"
+"default is \"NOVICE\" which displays two extra lines of help at the\n"
+"bottom of the screen to aid the user in learning the basic Lynx\n"
+"commands. Set user_mode to \"INTERMEDIATE\" to turn off the extra info.\n"
+"Use \"ADVANCED\" to see the URL of the currently selected link at the\n"
+"bottom of the screen.\n"
+msgstr ""
+"user_mode anger användarens nivå av kunskap om Lynx. Förvalet\n"
+"\"NOVICE\" (nybörjare) visar två extra rader med hjälp nederst på\n"
+"skärmen för att hjälpa användaren lära de grundläggande kommandona\n"
+"i Lynx. Sätt user_mode till \"INTERMEDIATE\" (mellannivå) för att\n"
+"stänga av extrainformationen. Använd \"ADVANCED\" för att se adressen\n"
+"för den markerade länken nederst på skärmen.\n"
+
+#: src/LYrcFile.c:667
+msgid ""
+"If verbose_images is \"on\", lynx will print the name of the image\n"
+"source file in place of [INLINE], [LINK] or [IMAGE]\n"
+"See also VERBOSE_IMAGES in lynx.cfg\n"
+msgstr ""
+"Om verbose_images är \"on\" skriver lynx namnet på bildens källfil\n"
+"istället för [INLINE], [LINK] eller [IMAGE]\n"
+"Se även VERBOSE_IMAGES i lynx.cfg\n"
+
+#: src/LYrcFile.c:672
+msgid ""
+"If vi_keys is set to \"on\", then the normal VI movement keys:\n"
+" j = down k = up\n"
+" h = left l = right\n"
+"will be enabled. These keys are only lower case.\n"
+"Capital 'H', 'J' and 'K will still activate help, jump shortcuts,\n"
+"and the keymap display, respectively.\n"
+msgstr ""
+"Om vi_keys sätts till \"on\" kommer VI-förflyttningstangenter att aktiveras:\n"
+" j = ned k = upp\n"
+" h = vänster l = höger\n"
+"Dessa tangenter gäller bara som gemener.\n"
+"Versala \"H\", \"J\" och \"K\" aktiverar hjälp, hoppgenvägar respektive\n"
+"tangentbordsinställningarna.\n"
+
+#: src/LYrcFile.c:680
+msgid ""
+"The visited_links setting controls how Lynx organizes the information\n"
+"in the Visited Links Page.\n"
+msgstr ""
+"Inställningen visited_links anger hur Lynx organiserar informationen\n"
+"på sidan Använda länkar.\n"
+
+#: src/LYrcFile.c:924
+msgid ""
+"If keypad_mode is set to \"NUMBERS_AS_ARROWS\", then the numbers on\n"
+"your keypad when the numlock is on will act as arrow keys:\n"
+" 8 = Up Arrow\n"
+" 4 = Left Arrow 6 = Right Arrow\n"
+" 2 = Down Arrow\n"
+"and the corresponding keyboard numbers will act as arrow keys,\n"
+"regardless of whether numlock is on.\n"
+msgstr ""
+"Om keypad_mode sätts till \"NUMBERS_AS_ARROWS\" fungerar siffrorna på\n"
+"ditt numeriska tangentbord som piltangenter när NumLock är aktivt:\n"
+" 8 = Upp-pil\n"
+" 4 = Vänsterpil 6 = Högerpil\n"
+" 2 = Nedpil\n"
+"och motsvarande siffertangenter på tangentbordet fungerar som\n"
+"piltangenter, oavsett om NumLock är aktivt eller inte.\n"
+
+#: src/LYrcFile.c:933
+msgid ""
+"If keypad_mode is set to \"LINKS_ARE_NUMBERED\", then numbers will\n"
+"appear next to each link and numbers are used to select links.\n"
+msgstr ""
+"Om keypad_mode sätts till \"LINKS_ARE_NUMBERED\" kommer siffror\n"
+"att visas vid varje länk, och siffror används för att välja länk.\n"
+
+#: src/LYrcFile.c:937
+msgid ""
+"If keypad_mode is set to \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\", then\n"
+"numbers will appear next to each link and visible form input field.\n"
+"Numbers are used to select links, or to move the \"current link\" to a\n"
+"form input field or button. In addition, options in popup menus are\n"
+"indexed so that the user may type an option number to select an option in\n"
+"a popup menu, even if the option isn't visible on the screen. Reference\n"
+"lists and output from the list command also enumerate form inputs.\n"
+msgstr ""
+"Om keypad_mode sätts till \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\" kommer\n"
+"siffror att visas vid varje länk och synligt formulärindatafält.\n"
+"Siffror används för att välja länkar, eller för att flytta \"aktuell\n"
+"länk\" till ett formulärindatafält eller -knapp. Dessutom kommer\n"
+"alternativ i popupmenyer att numreras så att användaren kan skriva in\n"
+"ett alternativnummer för att välja ett alternativ i popupmenyn, även om\n"
+"alternativet inte är synligt på skärmen. Referenslistor och utdata från\n"
+"listkommandot kommer även de att numrera formulärindatafält.\n"
+
+#: src/LYrcFile.c:946
+msgid ""
+"NOTE: Some fixed format documents may look disfigured when\n"
+"\"LINKS_ARE_NUMBERED\" or \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\" are\n"
+"enabled.\n"
+msgstr ""
+"OBS: Vissa dokument med fixerat format kan se trasiga ut när\n"
+"\"LINKS_ARE_NUMBERED\" eller \"LINKS_AND_FORM_FILES_ARE_NUMBERED\" är\n"
+"aktiva.\n"
+
+#: src/LYrcFile.c:978
+msgid ""
+"Lynx User Defaults File\n"
+"\n"
+msgstr ""
+"Standardanvändarinställningsfil för Lynx\n"
+"\n"
+
+#: src/LYrcFile.c:987
+msgid ""
+"This file contains options saved from the Lynx Options Screen (normally\n"
+"with the 'o' key). To save options with that screen, you must select the\n"
+"checkbox:\n"
+msgstr ""
+"Filen innehåller inställningar som lagrats från Lynx inställningsskärm\n"
+"(vanligtvis med knappen \"o\"). För att spara inställningar därifrån måste\n"
+"du markera kryssrutan:\n"
+
+#: src/LYrcFile.c:994
+msgid ""
+"You must then save the settings using the link on the line above the\n"
+"checkbox:\n"
+msgstr ""
+"Du måste sedan spara inställningarna med hjälp av länken på raden\n"
+"ovanför kryssrutan:\n"
+
+#: src/LYrcFile.c:1001
+msgid ""
+"You may also use the command-line option \"-forms_options\", which displays\n"
+"the simpler Options Menu instead. Save options with that using the '>' key.\n"
+"\n"
+msgstr ""
+"Du kan även använda kommandoradsflaggan \"-forms_options\", vilken visar\n"
+"den förenklade inställningsmenyn. Därifrån sparar du inställningarna med\n"
+"knappen \">\".\n"
+"\n"
+
+#: src/LYrcFile.c:1008
+msgid ""
+"This file contains options saved from the Lynx Options Screen (normally\n"
+"with the '>' key).\n"
+"\n"
+msgstr ""
+"Denna fil innehåller inställningar lagrade från Lynx inställningsskärm\n"
+"(normalt med \">\"-knappen).\n"
+"\n"
+
+#: src/LYrcFile.c:1015
+msgid ""
+"There is normally no need to edit this file manually, since the defaults\n"
+"here can be controlled from the Options Screen, and the next time options\n"
+"are saved from the Options Screen this file will be completely rewritten.\n"
+"You have been warned...\n"
+"\n"
+"If you are looking for the general configuration file - it is normally\n"
+"called \"lynx.cfg\". It has different content and a different format.\n"
+"It is not this file.\n"
+msgstr ""
+"Vanligtvis behöver du inte redigera denna fil manuellt, eftersom\n"
+"inställningarna kan nås från alternativmenyn, och nästa gång alternativen\n"
+"lagras från alternativmenyn kommer denna fil helt att skrivas över.\n"
+"Du har varnats...\n"
+"\n"
+"Om du letar efter den generella konfigurationsfilen heter den normalt\n"
+"\"lynx.cfg\". Den har ett annat innehåll och ett annat format.\n"
+"Det är inte den här filen.\n"
+
+#~ msgid "HREF in BASE tag is not an absolute URL."
+#~ msgstr "HREF i BASE-märke är inte en absolut adress."
+
+#~ msgid "Address contains a username: %s"
+#~ msgstr "Adress innehåller användar-id: %s"
+
+#~ msgid "Visible links"
+#~ msgstr "Synliga länkar"
+
+#~ msgid ""
+#~ "\n"
+#~ "Lynx edit map not declared.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Lynxredigeringskarta ej deklarerad.\n"
+#~ "\n"
+
+#~ msgid "Very long lines have been wrapped!"
+#~ msgstr "Mycket långa rader har ombrutits!"
+
+#~ msgid "Path too long"
+#~ msgstr "Sökväg för lång"
+
+#~ msgid "Source and destination are the same location - request ignored!"
+#~ msgstr "Källa och mål är samma - begäran ignoreras!"
+
+#~ msgid "Socket read failed for 180,000 tries."
+#~ msgstr "Läsning från uttag misslyckades 180.000 gånger."
+
+#~ msgid "History List maximum reached! Document not pushed."
+#~ msgstr "Historiklistemaximum nått! Dokumentet lagrades inte."
+
+#~ msgid "reason unknown."
+#~ msgstr "okänd anledning."
+
+#~ msgid "KB"
+#~ msgstr "KB"
+
+#~ msgid "Remove '%s' and all of its contents?"
+#~ msgstr "Ta bort \"%s\" och allt dess innehåll?"
+
+#~ msgid "Remove directory and all of its contents?"
+#~ msgstr "Ta bort katalog och allt dess innehåll?"
+
+#~ msgid "Short read from file, problem?"
+#~ msgstr "Filen tog slut tidigt, problem?"
+
+#~ msgid "Unable to open file management menu file."
+#~ msgstr "Kan inte öppna filhanteringsmenyfil."
+
+#~ msgid "create %s"
+#~ msgstr "skapa %s"
+
+#~ msgid "Ignoring invalid HOME"
+#~ msgstr "Ignorerar ogiltig HOME"
+
+#~ msgid "(From Cookie Jar)"
+#~ msgstr "(Från kakburk)"
+
+#~ msgid ""
+#~ "partial_thres specifies the number of lines Lynx should download and render\n"
+#~ "before we redraw the screen in Partial Display logic\n"
+#~ "e.g., partial_thres=2\n"
+#~ "would have Lynx redraw every 2 lines that it renders\n"
+#~ "partial_thres=-1 would use the entire screensize\n"
+#~ msgstr ""
+#~ "partial_thres anger antalet rader Lynx skall hämta och tolka innan skärmen\n"
+#~ "ritas om. partial_thres=2 gör att Lynx ritar om skärmen för varannan rad\n"
+#~ "som tolkas. partial_thres=-1 använder skärmstorleken\n"
+
+#~ msgid "Comment request cancelled!!!"
+#~ msgstr "Kommentaren avbruten!!!"
+
+#~ msgid "You are not allowed to goto \"file:\" URLs"
+#~ msgstr "Du tillåts inte gå till \"file:\"-adresser"
+
+#~ msgid "You are not allowed to goto \"finger:\" URLs"
+#~ msgstr "Du tillåts inte gå till \"finger:\"-adresser"
+
+#~ msgid "You are not allowed to goto \"ftp:\" URLs"
+#~ msgstr "Du tillåts inte gå till \"ftp:\"-adresser"
+
+#~ msgid "You are not allowed to goto \"gopher:\" URLs"
+#~ msgstr "Du tillåts inte gå till \"gopher:\"-adresser"
+
+#~ msgid "You are not allowed to goto \"http:\" URLs"
+#~ msgstr "Du tillåts inte gå till \"http:\"-adresser"
+
+#~ msgid "You are not allowed to goto \"https:\" URLs"
+#~ msgstr "Du tillåts inte gå till \"https:\"-adresser"
+
+#~ msgid "You are not allowed to goto \"lynxcgi:\" URLs"
+#~ msgstr "Du tillåts inte gå till \"lynxcgi:\"-adresser"
+
+#~ msgid "You are not allowed to goto \"lynxexec:\" URLs"
+#~ msgstr "Du tillåts inte gå till \"lynxexec:\"-adresser"
+
+#~ msgid "You are not allowed to goto \"lynxprog:\" URLs"
+#~ msgstr "Du tillåts inte gå till \"lynxprog:\"-adresser"
+
+#~ msgid "You are not allowed to goto \"mailto:\" URLs"
+#~ msgstr "Du tillåts inte gå till \"mailto:\"-adresser"
+
+#~ msgid "You are not allowed to goto \"news:\" URLs"
+#~ msgstr "Du tillåts inte gå till \"news:\"-adresser"
+
+#~ msgid "You are not allowed to goto \"nntp:\" URLs"
+#~ msgstr "Du tillåts inte gå till \"nntp:\"-adresser"
+
+#~ msgid "You are not allowed to goto \"rlogin:\" URLs"
+#~ msgstr "Du tillåts inte gå till \"rlogin:\"-adresser"
+
+#~ msgid "You are not allowed to goto \"snews:\" URLs"
+#~ msgstr "Du tillåts inte gå till \"snews:\"-adresser"
+
+#~ msgid "You are not allowed to goto \"telnet:\" URLs"
+#~ msgstr "Du tillåts inte gå till \"telnet:\"-adresser"
+
+#~ msgid "You are not allowed to goto \"tn3270:\" URLs"
+#~ msgstr "Du tillåts inte gå till \"tn3270:\"-adresser"
+
+#~ msgid "You are not allowed to goto \"wais:\" URLs"
+#~ msgstr "Du tillåts inte gå till \"wais:\"-adresser"
+
+#~ msgid "This special URL is not allowed as a goto!"
+#~ msgstr "Denna specialadress tillåts inte gås till!"
+
+#~ msgid "Option choice (or page) number: "
+#~ msgstr "Välj alternativ- (eller sid-)nummer: "
+
+#~ msgid "Choice number %d already is current."
+#~ msgstr "Val %d är redan markerat."
+
+#~ msgid "You are already at the end of this choice list."
+#~ msgstr "Du är redan i slutet av vallistan."
+
+#~ msgid "You are already at the beginning of this choice list."
+#~ msgstr "Du är redan i början av vallistan."
+
+#~ msgid "You are already at page %d of this choice list."
+#~ msgstr "Du är redan på sida %d i vallistan."
+
+#~ msgid "You have entered an invalid choice number."
+#~ msgstr "Du har angett ett felaktigt valnummer."
+
+#~ msgid "Read %ld of %ld %s of data"
+#~ msgstr "Läste %ld av %ld%s data"
+
+#~ msgid "Read %ld %s of data"
+#~ msgstr "Läste %ld%s data"
+
+#~ msgid ", %ld %s/sec."
+#~ msgstr ", %ld%s/s"
+
+#~ msgid "Lynx ver. %s"
+#~ msgstr "Lynx ver. %s"
+
+#~ msgid "Inactive text input, activate to edit (e.g., press ENTER)"
+#~ msgstr "Inaktiv textindata, aktivera för att redigera (tryck Enter)"
diff --git a/po/tr.po b/po/tr.po
new file mode 100644
index 0000000..2e93d15
--- /dev/null
+++ b/po/tr.po
@@ -0,0 +1,6446 @@
+# translation of lynx-2.9.0-dev3.po to Turkish
+# lynx-2.9.0-dev3.po'nun Türkçe çevirisi
+# Copyright (C) 2002, 2004, 2006, 2009, 2012, 2015 Free Software Foundation, Inc.
+# This file is distributed under the same license as the lynx package.
+# Eyüp Hakan Duran <hakan_duran@hotmail.com>, 2012, 2015.
+# Mehmet Kececi <mkececi@mehmetkececi.com>, 2017, 2019, 2021.
+msgid ""
+msgstr ""
+"Project-Id-Version: lynx-2.9.0-dev8\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-07-31 10:04-0400\n"
+"PO-Revision-Date: 2021-08-01 19:02+0300\n"
+"Last-Translator: Mehmet Kececi <mkececi@mehmetkececi.com>\n"
+"Language-Team: Turkish <gnome-turk@gnome.org>\n"
+"Language: tr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+"X-Generator: Poedit 3.0\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+
+#. ******************************************************************
+#. * The following definitions are for status line prompts, messages, or
+#. * warnings issued by Lynx during program execution. You can modify
+#. * them to make them more appropriate for your site. We recommend that
+#. * you extend these definitions to other languages using the gettext
+#. * library. There are also scattered uses of 'gettext()' throughout the
+#. * Lynx source, covering all but those messages which (a) are used for
+#. * debugging (CTRACE) or (b) are constants used in interaction with
+#. * other programs.
+#. *
+#. * See ABOUT-NLS and po/readme for details and location of contributed
+#. * translations. When no translation is available, the English default is
+#. * used.
+#.
+#: LYMessages.c:28
+#, c-format
+msgid "Alert!: %s"
+msgstr "Alarm!: %s"
+
+#: LYMessages.c:29
+msgid "Welcome"
+msgstr "HoÅŸgeldiniz"
+
+#: LYMessages.c:30
+msgid "Are you sure you want to quit?"
+msgstr "Çıkmak istediğinizden emin misiniz?"
+
+#: LYMessages.c:32
+msgid "Really exit from Lynx?"
+msgstr "Lynx'ten cidden çıkılsın mı?"
+
+#: LYMessages.c:34
+msgid "Connection interrupted."
+msgstr "Bağlantı kesildi."
+
+#: LYMessages.c:35
+msgid "Data transfer interrupted."
+msgstr "Veri aktarımı kesildi."
+
+#: LYMessages.c:36
+msgid "Cancelled!!!"
+msgstr "Ä°ptal edildi!!!"
+
+#: LYMessages.c:37
+msgid "Cancelling!"
+msgstr "Ä°ptal ediliyor!"
+
+#: LYMessages.c:38
+msgid "Excellent!!!"
+msgstr "Mükemmel!!!"
+
+#: LYMessages.c:39
+msgid "OK"
+msgstr "Tamam"
+
+#: LYMessages.c:40
+msgid "Done!"
+msgstr "Bitti!"
+
+#: LYMessages.c:41
+msgid "Bad request!"
+msgstr "Kötü istem!"
+
+#: LYMessages.c:42
+msgid "previous"
+msgstr "önceki"
+
+#: LYMessages.c:43
+msgid "next screen"
+msgstr "sonraki ekran"
+
+#: LYMessages.c:44
+msgid "HELP!"
+msgstr "YARDIM!"
+
+#: LYMessages.c:45
+msgid ", help on "
+msgstr ", yardım konusu "
+
+#. #define HELP
+#: LYMessages.c:47
+msgid "Commands: Use arrow keys to move, '?' for help, 'q' to quit, '<-' to go back."
+msgstr "Komutlar: Gezinmek için ok tuşlarını, yardım için '?'ni, çıkış için 'q'yu, geri dönmek için '<-'u kullanınız."
+
+#. #define MOREHELP
+#: LYMessages.c:49
+msgid "-- press space for more, use arrow keys to move, '?' for help, 'q' to quit."
+msgstr "-- devamı için boşluğa, gezinmek için ok tuşlarına, yardım için '?'ne, çıkmak için 'q'ya basınız."
+
+#: LYMessages.c:50
+msgid "-- press space for next page --"
+msgstr "-- sonraki sayfa için boşluğa basınız --"
+
+#: LYMessages.c:51
+msgid "URL too long"
+msgstr "URL çok uzun"
+
+#. Inactive input fields, messages used with -tna option - kw
+#. #define FORM_LINK_TEXT_ADV_MSG_INA
+#: LYMessages.c:57
+#, c-format
+msgid "(Textfield \"%s\"); Inactive. Press <return> to activate."
+msgstr "(Metin alanı \"%s\"); Etkin değil. Etkinleştirmek için <return>'e basınız."
+
+#. #define FORM_LINK_TEXT_MESSAGE_INA
+#: LYMessages.c:59
+msgid "(Text entry field) Inactive. Press <return> to activate."
+msgstr "(Metin giriş alanı) Etkin değil. Etkinleştirmek için <return>'e basınız."
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG_INA
+#: LYMessages.c:61
+#, c-format
+msgid "(Textarea \"%s\"); Inactive. Press <return> to activate."
+msgstr "(Metin alanı \"%s\"); Etkin değil. Etkinleştirmek için <return>'e basınız."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_INA
+#: LYMessages.c:63
+msgid "(Textarea) Inactive. Press <return> to activate."
+msgstr "(Metin alanı) Etkin değil. Etkinleştirmek için <return>'e basınız."
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG_INA_E
+#: LYMessages.c:65
+#, c-format
+msgid "(Textarea \"%s\"); Inactive. Press <return> to activate (%s for editor)."
+msgstr "(Metin alanı \"%s\"); Etkin değil. Etkinleştirmek için <return>'e basınız (düzenleyici için %s)."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_INA_E
+#: LYMessages.c:67
+#, c-format
+msgid "(Textarea) Inactive. Press <return> to activate (%s for editor)."
+msgstr "(Metin alanı) Etkin değil. Etkinleştirmek için <return>'e basınız (düzenleyici için %s)."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE_INA
+#: LYMessages.c:69
+msgid "(Form field) Inactive. Use <return> to edit."
+msgstr "(Form alanı) Etkin değil. Düzenlemek için <return>'ü kullanınız."
+
+#. #define FORM_TEXT_SUBMIT_MESSAGE_INA_X
+#: LYMessages.c:71
+#, c-format
+msgid "(Form field) Inactive. Use <return> to edit (%s to submit with no cache)."
+msgstr "(Form alanı) Etkin değil. Düzenlemek için <return>'ü kullanınız (önbelleksiz göndermek için %s)."
+
+#. #define FORM_TEXT_RESUBMIT_MESSAGE_INA
+#: LYMessages.c:73
+msgid "(Form field) Inactive. Press <return> to edit, press <return> twice to submit."
+msgstr "(Form alanı) Etkin değil. Düzenlemek için <return>'e bir kez, göndermek için iki kez basınız."
+
+#. #define FORM_TEXT_SUBMIT_MAILTO_MSG_INA
+#: LYMessages.c:75
+msgid "(mailto form field) Inactive. Press <return> to change."
+msgstr "(e-posta form alanı) Etkin değil. Değiştirmek için <return>'e basınız."
+
+#. #define FORM_LINK_PASSWORD_MESSAGE_INA
+#: LYMessages.c:77
+msgid "(Password entry field) Inactive. Press <return> to activate."
+msgstr "(Parola giriş alanı) Etkin değil. Etkinleştirmek için <return>'e basınız."
+
+#. #define FORM_LINK_FILE_UNM_MSG
+#: LYMessages.c:80
+msgid "UNMODIFIABLE file entry field. Use UP or DOWN arrows or tab to move off."
+msgstr "DEĞİŞTİRİLEMEZ dosya giriş alanı. Dışına çıkmak için YUKARI / AŞAĞI ok tuşlarını ya da sekmeyi kullanınız."
+
+#. #define FORM_LINK_FILE_MESSAGE
+#: LYMessages.c:82
+msgid "(File entry field) Enter filename. Use UP or DOWN arrows or tab to move off."
+msgstr "(Dosya giriş alanı) Dosya adı giriniz. Dışına çıkmak için YUKARI / AŞAĞI ok tuşlarını ya da sekmeyi kullanınız."
+
+#. #define FORM_LINK_TEXT_ADV_MSG
+#. #define FORM_LINK_TEXT_MESSAGE
+#: LYMessages.c:84 LYMessages.c:86
+#, c-format
+msgid "(Textfield \"%s\"); Enter text. Use UP or DOWN arrows or tab to move off."
+msgstr "(Metin alanı \"%s\"); Metin giriniz. Dışına çıkmak için YUKARI / AŞAĞI ok tuşlarını ya da sekmeyi kullanınız."
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG
+#: LYMessages.c:88
+#, c-format
+msgid "(Textarea \"%s\"); Enter text. Use UP/DOWN arrows or TAB to move off."
+msgstr "(Metin alanı \"%s\"); Metin giriniz. Dışına çıkmak için YUKARI/AŞAĞI ok tuşlarını ya da sekmeyi kullanınız."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE
+#: LYMessages.c:90
+msgid "(Textarea) Enter text. Use UP/DOWN arrows or TAB to move off."
+msgstr "(Metin alanı) Metin giriniz. Dışına çıkmak için YUKARI/AŞAĞI ok tuşlarını ya da sekmeyi kullanınız."
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG_E
+#: LYMessages.c:92
+#, c-format
+msgid "(Textarea \"%s\"); Enter text. Use UP/DOWN arrows or TAB to move off (%s for editor)."
+msgstr "(Metin alanı \"%s\"); Metin giriniz. Dışına çıkmak için YUKARI/AŞAĞI ok tuşlarını ya da sekmeyi kullanınız (düzenleyici için %s)."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_E
+#: LYMessages.c:94
+#, c-format
+msgid "(Textarea) Enter text. Use UP/DOWN arrows or TAB to move off (%s for editor)."
+msgstr "(Metin alanı) Metin giriniz. Dışına çıkmak için YUKARI/AŞAĞI ok tuşlarını ya da sekmeyi kullanınız (düzenleyici için %s)."
+
+#. #define FORM_LINK_TEXT_UNM_MSG
+#: LYMessages.c:96
+msgid "UNMODIFIABLE form text field. Use UP or DOWN arrows or tab to move off."
+msgstr "DEĞİŞTİRİLEMEZ form metin alanı. Dışına çıkmak için YUKARI/AŞAĞI ok tuşlarını ya da sekmeyi kullanınız."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE
+#: LYMessages.c:98
+msgid "(Form field) Enter text. Use <return> to submit."
+msgstr "(Form alanı) Metin giriniz. Göndermek için <return>'ü kullanınız."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE_X
+#: LYMessages.c:100
+#, c-format
+msgid "(Form field) Enter text. Use <return> to submit (%s for no cache)."
+msgstr "(Form alanı) Metin giriniz. Göndermek için <return>'ü kullanınız (önbelleksiz gönderim %s)."
+
+#. #define FORM_LINK_TEXT_RESUBMIT_MESSAGE
+#: LYMessages.c:102
+msgid "(Form field) Enter text. Use <return> to submit, arrows or tab to move off."
+msgstr "(Form alanı) Metin giriniz. Göndermek için <return>, dışına çıkmak için oklar ya da sekmeyi kullanınız."
+
+#. #define FORM_LINK_TEXT_SUBMIT_UNM_MSG
+#: LYMessages.c:104
+msgid "UNMODIFIABLE form field. Use UP or DOWN arrows or tab to move off."
+msgstr "DEĞİŞTİRİLEBİLİR form alanı. Dışına çıkmak için YUKARI/AŞAĞI ok tuşlarını ya da sekmeyi kullanınız."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MAILTO_MSG
+#: LYMessages.c:106
+msgid "(mailto form field) Enter text. Use <return> to submit, arrows to move off."
+msgstr "(e-posta form alanı) Metin giriniz. Göndermek için <return>, dışına çıkmak için okları kullanınız."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MAILTO_DIS_MSG
+#: LYMessages.c:108
+msgid "(mailto form field) Mail is disallowed so you cannot submit."
+msgstr "(e-posta form alanı) Mektuba izin verilmiyor, dolayısıyla gönderemezsiniz."
+
+#. #define FORM_LINK_PASSWORD_MESSAGE
+#: LYMessages.c:110
+msgid "(Password entry field) Enter text. Use UP or DOWN arrows or tab to move off."
+msgstr "(Parola giriş alanı) Metin giriniz. Dışına çıkmak için YUKARI/AŞAĞI ok tuşlarını ya da sekmeyi kullanınız."
+
+#. #define FORM_LINK_PASSWORD_UNM_MSG
+#: LYMessages.c:112
+msgid "UNMODIFIABLE form password. Use UP or DOWN arrows or tab to move off."
+msgstr "DEĞİŞTİRİLEMEZ form parolası. Dışına çıkmak için YUKARI/AŞAĞI ok tuşlarını ya da sekmeyi kullanınız."
+
+#. #define FORM_LINK_CHECKBOX_ADV_MSG
+#: LYMessages.c:114
+#, c-format
+msgid "(Checkbox \"%s\"); Use right-arrow or <return> to toggle."
+msgstr "(Onay kutusu \"%s\"); Seçmek için sağ ok ya da <return>'ü kullanınız."
+
+#. #define FORM_LINK_CHECKBOX_MESSAGE
+#: LYMessages.c:116
+msgid "(Checkbox Field) Use right-arrow or <return> to toggle."
+msgstr "(Onay kutusu Alanı) Seçmek için sağ ok ya da <return>'ü kullanınız."
+
+#. #define FORM_LINK_CHECKBOX_UNM_MSG
+#: LYMessages.c:118
+msgid "UNMODIFIABLE form checkbox. Use UP or DOWN arrows or tab to move off."
+msgstr "DEĞİŞTİRİLEMEZ form onay kutusu. Dışına çıkmak için YUKARI/AŞAĞI ok tuşlarını ya da sekmeyi kullanınız."
+
+#. #define FORM_LINK_RADIO_ADV_MSG
+#: LYMessages.c:120
+#, c-format
+msgid "(Radio Button \"%s\"); Use right-arrow or <return> to toggle."
+msgstr "(Radyo Düğmesi \"%s\"); Seçmek için sağ ok ya da <return>'ü kullanınız."
+
+#. #define FORM_LINK_RADIO_MESSAGE
+#: LYMessages.c:122
+msgid "(Radio Button) Use right-arrow or <return> to toggle."
+msgstr "(Radyo Düğmesi) Seçmek için sağ ok ya da <return>'ü kullanınız."
+
+#. #define FORM_LINK_RADIO_UNM_MSG
+#: LYMessages.c:124
+msgid "UNMODIFIABLE form radio button. Use UP or DOWN arrows or tab to move off."
+msgstr "DEĞİŞTİRİLEMEZ form radyo düğmesi. Dışına çıkmak için YUKARI/AŞAĞI ok tuşlarını ya da sekmeyi kullanınız."
+
+#. #define FORM_LINK_SUBMIT_PREFIX
+#: LYMessages.c:126
+msgid "Submit ('x' for no cache) to "
+msgstr "Alıcı (önbelleksiz gönderim 'x') "
+
+#. #define FORM_LINK_RESUBMIT_PREFIX
+#: LYMessages.c:128
+msgid "Submit to "
+msgstr "Alıcı "
+
+#. #define FORM_LINK_SUBMIT_MESSAGE
+#: LYMessages.c:130
+msgid "(Form submit button) Use right-arrow or <return> to submit ('x' for no cache)."
+msgstr "(Form gönderme düğmesi) Göndermek için sağ ok ya da <return>'ü kullanınız (önbelleksiz gönderim 'x')."
+
+#. #define FORM_LINK_RESUBMIT_MESSAGE
+#: LYMessages.c:132
+msgid "(Form submit button) Use right-arrow or <return> to submit."
+msgstr "(Form gönderme düğmesi) Göndermek için sağ ok ya da <return>'ü kullanınız."
+
+#. #define FORM_LINK_SUBMIT_DIS_MSG
+#: LYMessages.c:134
+msgid "DISABLED form submit button. Use UP or DOWN arrows or tab to move off."
+msgstr "DEVRE DIŞI form gönderme tuşu. Dışına çıkmak için YUKARI/AŞAĞI ok tuşlarını ya da sekmeyi kullanınız."
+
+#. #define FORM_LINK_SUBMIT_MAILTO_PREFIX
+#: LYMessages.c:136
+msgid "Submit mailto form to "
+msgstr "E-posta formu alıcısı "
+
+#. #define FORM_LINK_SUBMIT_MAILTO_MSG
+#: LYMessages.c:138
+msgid "(mailto form submit button) Use right-arrow or <return> to submit."
+msgstr "(e-posta formu gönderme düğmesi) Göndermek için sağ ok ya da <return>'ü kullanınız."
+
+#. #define FORM_LINK_SUBMIT_MAILTO_DIS_MSG
+#: LYMessages.c:140
+msgid "(mailto form submit button) Mail is disallowed so you cannot submit."
+msgstr "(e-posta formu gönderme düğmesi) Mektuba izin verilmiyor, dolayısıyla gönderemezsiniz."
+
+#. #define FORM_LINK_RESET_MESSAGE
+#: LYMessages.c:142
+msgid "(Form reset button) Use right-arrow or <return> to reset form to defaults."
+msgstr "(Form temizleme düğmesi) Formu öntanımlıya dönüştürmek için sağ ok ya da <return>'ü kullanınız."
+
+#. #define FORM_LINK_RESET_DIS_MSG
+#: LYMessages.c:144
+msgid "DISABLED form reset button. Use UP or DOWN arrows or tab to move off."
+msgstr "DEVRE DIŞI form temizleme düğmesi. Dışına çıkmak için YUKARI/AŞAĞI ok tuşlarını ya da sekmeyi kullanınız."
+
+#. #define FORM_LINK_BUTTON_MESSAGE
+#: LYMessages.c:146
+msgid "(Script button) Use UP or DOWN arrows or tab to move off."
+msgstr "(Betik düğmesi) Dışına çıkmak için YUKARI ya da AŞAĞI ok tuşlarını ya da sekmeyi kullanınız."
+
+#. #define FORM_LINK_BUTTON_ADV_MSG
+#: LYMessages.c:148
+#, c-format
+msgid "(Script button \"%s\"); Use UP or DOWN arrows or tab to move off."
+msgstr "(Betik düğmesi \"%s\"); Dışına çıkmak için YUKARI ya da AŞAĞI ok tuşlarını ya da sekmeyi kullanınız."
+
+#. #define FORM_LINK_BUTTON_DIS_MSG
+#: LYMessages.c:150
+msgid "DISABLED Script button. Use UP or DOWN arrows or tab to move off."
+msgstr "DEVRE DIŞI Betik düğmesi. Dışına çıkmak için YUKARI ya da AŞAĞI ok tuşlarını ya da sekmeyi kullanınız."
+
+#. #define FORM_LINK_OPTION_LIST_ADV_MSG
+#: LYMessages.c:152
+#, c-format
+msgid "(Option list \"%s\"); Hit return to select option."
+msgstr "(Seçenek listesi \"%s\"); Seçmek için return'e basınız."
+
+#. #define FORM_LINK_OPTION_LIST_MESSAGE
+#: LYMessages.c:154
+msgid "(Option list) Hit return and use arrow keys and return to select option."
+msgstr "(Seçenek listesi) Return'e basıp, seçmek için ok tuşları ve return'ü kullanınız."
+
+#. #define CHOICE_LIST_ADV_MSG
+#: LYMessages.c:156
+#, c-format
+msgid "(Choice entry \"%s\"); Use arrow keys and return to select option."
+msgstr "(Tercih listesi \"%s\"); Seçmek için ok tuşları ve return'ü kullanınız."
+
+#. #define CHOICE_LIST_MESSAGE
+#: LYMessages.c:158
+msgid "(Choice list) Hit return and use arrow keys and return to select option."
+msgstr "(Tercih listesi) Return'e basıp, seçmek için ok tuşları ve return'ü kullanınız."
+
+#. #define MOUSE_CHOICE_MESSAGE
+#: LYMessages.c:160
+msgid "Left mouse button or return to select, arrow keys to scroll."
+msgstr "Seçmek için sol fare tuşu ya da return, kaydırmak için ok tuşları."
+
+#. #define FORM_LINK_OPTION_LIST_UNM_MSG
+#: LYMessages.c:162
+msgid "UNMODIFIABLE option list. Use return or arrow keys to review or leave."
+msgstr "DEĞİŞTİRİLEMEZ seçenek listesi. Göz gezdirmek ya da terketmek için ok tuşları ya da retun'ü kullanınız."
+
+#. #define CHOICE_LIST_UNM_MSG
+#: LYMessages.c:164
+msgid "UNMODIFIABLE choice list. Use return or arrow keys to review or leave."
+msgstr "DEĞİŞTİRİLEMEZ tercih listesi. Göz gezdirmek ya da terketmek için ok tuşları ya da retun'ü kullanınız."
+
+#: LYMessages.c:165
+msgid "Submitting form..."
+msgstr "Form gönderiliyor..."
+
+#: LYMessages.c:166
+msgid "Resetting form..."
+msgstr "Form temizleniyor..."
+
+#. #define RELOADING_FORM
+#: LYMessages.c:168
+msgid "Reloading document. Any form entries will be lost!"
+msgstr "Belge yeniden yükleniyor. Forma girdikleriniz yitirilecek!"
+
+#. #define LINK_NOT_IN_FORM
+#: LYMessages.c:170
+msgid "The current link is not in a FORM"
+msgstr "Mevcut link bir FORM içinde değil"
+
+#: LYMessages.c:171
+#, c-format
+msgid "Warning: Cannot transcode form data to charset %s!"
+msgstr "Uyarı: Form verisi %s karakter kümesine çevrilemiyor!"
+
+#. #define NORMAL_LINK_MESSAGE
+#: LYMessages.c:174
+msgid "(NORMAL LINK) Use right-arrow or <return> to activate."
+msgstr "(NORMAL LİNK) Etkinleştirmek için sağ ok ya da<return>'ü kullanınız."
+
+#: LYMessages.c:175
+msgid "The resource requested is not available at this time."
+msgstr "Ä°stenen kaynak, ÅŸu anda temin edilemiyor."
+
+#: LYMessages.c:176
+msgid "Enter Lynx keystroke command: "
+msgstr "Lynx tuşbasım komutunu giriniz: "
+
+#: LYMessages.c:177
+msgid "Looking up "
+msgstr "Aranıyor "
+
+#: LYMessages.c:178
+#, c-format
+msgid "Getting %s"
+msgstr "%s alınıyor"
+
+#: LYMessages.c:179
+#, c-format
+msgid "Skipping %s"
+msgstr "%s atlanıyor"
+
+#: LYMessages.c:180
+#, c-format
+msgid "Using %s"
+msgstr "%s kullanılıyor"
+
+#: LYMessages.c:181
+#, c-format
+msgid "Illegal URL: %s"
+msgstr "Kuraldışı URL: %s"
+
+#: LYMessages.c:182
+#, c-format
+msgid "Badly formed address %s"
+msgstr "Yanlış yazılmış adres: %s"
+
+#: LYMessages.c:183
+#, c-format
+msgid "URL: %s"
+msgstr "URL: %s"
+
+#: LYMessages.c:184
+msgid "Unable to access WWW file!!!"
+msgstr "WWW dosyasına erişilemiyor!!!"
+
+#: LYMessages.c:185
+#, c-format
+msgid "This is a searchable index. Use %s to search."
+msgstr "Bu, aranabilir bir indeks... Aramak için %s kullanınız."
+
+#. #define WWW_INDEX_MORE_MESSAGE
+#: LYMessages.c:187
+#, c-format
+msgid "--More-- This is a searchable index. Use %s to search."
+msgstr "--Devam-- Bu, aranabilir bir indeks...Aramak için %s kullanınız."
+
+#: LYMessages.c:188
+msgid "You have entered an invalid link number."
+msgstr "Geçersiz bir link numarası girdiniz."
+
+#. #define SOURCE_HELP
+#: LYMessages.c:190
+msgid "Currently viewing document source. Press '\\' to return to rendered version."
+msgstr "Halen belge kaynağı görüntüleniyor. Yorumlanmış (rendered) sürüme dönmek için '\\'a basınız."
+
+#. #define NOVICE_LINE_ONE
+#: LYMessages.c:192
+msgid " Arrow keys: Up and Down to move. Right to follow a link; Left to go back. \n"
+msgstr " Ok tuşları: Gezinmek için Yukarı ve Aşağı. Linke gitmek için Sağ; geriye gitmek için Sol. \n"
+
+#. #define NOVICE_LINE_TWO
+#: LYMessages.c:194
+msgid " H)elp O)ptions P)rint G)o M)ain screen Q)uit /=search [delete]=history list \n"
+msgstr " H)Yardım O)Seçenekler P)Yazdır G)Git M)Ana ekran Q)Çıkış /=ara [delete]=tarihçe listesi\n"
+
+#. #define NOVICE_LINE_TWO_A
+#: LYMessages.c:196
+msgid " O)ther cmds H)elp K)eymap G)oto P)rint M)ain screen o)ptions Q)uit \n"
+msgstr " O)Diğer komutlar H)Yardım K)Tuşeşlem G)Git P)Yazdır M)Ana ekran o)Seçenekler Q)Çıkış \n"
+
+#. #define NOVICE_LINE_TWO_B
+#: LYMessages.c:198
+msgid " O)ther cmds B)ack E)dit D)ownload ^R)eload ^W)ipe screen search doc: / \n"
+msgstr " O)Diğer komutlar B)Geri E)Düzenle D)İndir ^R)Geri yükle ^W)Ekranı sil belgeyi ara: / \n"
+
+#. #define NOVICE_LINE_TWO_C
+#: LYMessages.c:200
+msgid "O)ther cmds C)omment History: <backspace> Bookmarks: V)iew, A)dd, R)emove \n"
+msgstr "O)Diğer komutlar C)Yorum Tarihçe: <backspace> Yer imleri: V)Görüntüle, A)Ekle, R)Çıkart \n"
+
+#. #define FORM_NOVICELINE_ONE
+#: LYMessages.c:202
+msgid " Enter text into the field by typing on the keyboard "
+msgstr " Klavyeyi kullanarak alana metin giriniz "
+
+#. #define FORM_NOVICELINE_TWO
+#: LYMessages.c:204
+msgid " Ctrl-U to delete all text in field, [Backspace] to delete a character "
+msgstr " Alandaki tüm metni silmek için Ctrl-U, tek karakter silmek için [Backspace] "
+
+#. #define FORM_NOVICELINE_TWO_DELBL
+#: LYMessages.c:206
+msgid " Ctrl-U to delete text in field, [Backspace] to delete a character "
+msgstr " Alandaki metni silmek için Ctrl-U,tek karakter silmek için [Backspace] "
+
+#. #define FORM_NOVICELINE_TWO_VAR
+#: LYMessages.c:208
+#, c-format
+msgid " %s to delete all text in field, [Backspace] to delete a character "
+msgstr " Alandaki tüm metni silmek için %s, tek karakter silmek için [Backspace] "
+
+#. #define FORM_NOVICELINE_TWO_DELBL_VAR
+#: LYMessages.c:210
+#, c-format
+msgid " %s to delete text in field, [Backspace] to delete a character "
+msgstr " Alandaki metni silmek için %s, tek karakter silmek için [Backspace] "
+
+#. mailto
+#: LYMessages.c:213
+msgid "Malformed mailto form submission! Cancelled!"
+msgstr "Bozuk e-posta formu gönderimi! İptal edildi!"
+
+#: LYMessages.c:214
+msgid "Warning! Control codes in mail address replaced by ?"
+msgstr "Uyarı! E-posta adresindeki kontrol kodları yerine konuldu ?"
+
+#: LYMessages.c:215
+msgid "Mail disallowed! Cannot submit."
+msgstr "E-postaya izin verilmiyor! Gönderilemedi."
+
+#: LYMessages.c:216
+msgid "Mailto form submission failed!"
+msgstr "E-posta formunun gönderimi başarısız!"
+
+#: LYMessages.c:217
+msgid "Mailto form submission Cancelled!!!"
+msgstr "E-posta formunun gönderimi iptal edildi!!!"
+
+#: LYMessages.c:218
+msgid "Sending form content..."
+msgstr "Form içeriği gönderiliyor..."
+
+#: LYMessages.c:219
+msgid "No email address is present in mailto URL!"
+msgstr "E-posta URL'sinde mektup adresi yok!"
+
+#. #define MAILTO_URL_TEMPOPEN_FAILED
+#: LYMessages.c:221
+msgid "Unable to open temporary file for mailto URL!"
+msgstr "E-posta URL'si için geçici dosya açılamadı!"
+
+#. #define INC_ORIG_MSG_PROMPT
+#: LYMessages.c:223
+msgid "Do you wish to include the original message?"
+msgstr "Orijinal iletinin içerilmesini ister misiniz?"
+
+#. #define INC_PREPARSED_MSG_PROMPT
+#: LYMessages.c:225
+msgid "Do you wish to include the preparsed source?"
+msgstr "Ayrıştırılmamış kaynağın içerilmesini ister misiniz?"
+
+#. #define SPAWNING_EDITOR_FOR_MAIL
+#: LYMessages.c:227
+msgid "Spawning your selected editor to edit mail message"
+msgstr "İletinin düzenlenmesi için seçilmiş düzenleyiciniz başlatılıyor"
+
+#. #define ERROR_SPAWNING_EDITOR
+#: LYMessages.c:229
+msgid "Error spawning editor, check your editor definition in the options menu"
+msgstr "Düzenleyici başlatmada hata, seçenekler menüsündeki düzenleyici tanımınızı kontrol ediniz"
+
+#: LYMessages.c:230
+msgid "Send this comment?"
+msgstr "Bu yorum gönderilsin mi?"
+
+#: LYMessages.c:231
+msgid "Send this message?"
+msgstr "Bu ileti gönderilsin mi?"
+
+#: LYMessages.c:232
+msgid "Sending your message..."
+msgstr "İletiniz gönderiliyor..."
+
+#: LYMessages.c:233
+msgid "Sending your comment:"
+msgstr "Yorumunuz gönderiliyor:"
+
+#. textarea
+#: LYMessages.c:236
+msgid "Not in a TEXTAREA; cannot use external editor."
+msgstr "Bir METİN ALANI'nda değil(siniz); harici düzenleyici kullanılamıyor."
+
+#: LYMessages.c:237
+msgid "Not in a TEXTAREA; cannot use command."
+msgstr "Bir METİN ALANI'nda değil(siniz); komut kullanılamıyor."
+
+#: LYMessages.c:239
+msgid "file: ACTIONs are disallowed!"
+msgstr "dosya: EYLEMlere izin verilmiyor!"
+
+#. #define FILE_SERVED_LINKS_DISALLOWED
+#: LYMessages.c:241
+msgid "file: URLs via served links are disallowed!"
+msgstr "dosya: sunulan linkler aracılığıyla URL'lere izin verilmiyor!"
+
+#: LYMessages.c:242
+msgid "Access to local files denied."
+msgstr "Yerel dosyalara eriÅŸim reddedildi."
+
+#: LYMessages.c:243
+msgid "file: URLs via bookmarks are disallowed!"
+msgstr "dosya: Yer imleri aracılığıyla URL'lere izin verilmiyor!"
+
+#. #define SPECIAL_VIA_EXTERNAL_DISALLOWED
+#: LYMessages.c:245
+msgid "This special URL is not allowed in external documents!"
+msgstr "Harici belgelerde bu özel URL'ye izin verilmiyor!"
+
+#: LYMessages.c:246
+msgid "Press <return> to return to Lynx."
+msgstr "Lynx'e dönmek için <return>'e basınız."
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:249
+msgid "Spawning DCL subprocess. Use 'logout' to return to Lynx.\n"
+msgstr "DCL altsüreci başlatılıyor. Lynx'e dönmek için 'logout'u kullanınız.\n"
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:253
+msgid "Type EXIT to return to Lynx.\n"
+msgstr "Lynx'e dönmek için EXIT tuşlayınız.\n"
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:256
+msgid "Spawning your default shell. Use 'exit' to return to Lynx.\n"
+msgstr "Öntanımlı kabuğunuz başlatılıyor. Lynx'e dönmek için 'exit'i kullanınız.\n"
+
+#: LYMessages.c:259
+msgid "Spawning is currently disabled."
+msgstr "Başlatma (spawning) şu an devre dışı."
+
+#: LYMessages.c:260
+msgid "The 'd'ownload command is currently disabled."
+msgstr "İndir komutu(d) şu an devre dışı."
+
+#: LYMessages.c:261
+msgid "You cannot download an input field."
+msgstr "Bir giriş alanını indiremezsiniz."
+
+#: LYMessages.c:262
+msgid "Form has a mailto action! Cannot download."
+msgstr "Formda bir e-posta eylemi mevcut! Ä°ndirilemiyor."
+
+#: LYMessages.c:263
+msgid "You cannot download a mailto: link."
+msgstr "Bir e-posta: linkini indiremezsiniz."
+
+#: LYMessages.c:264
+msgid "You cannot download cookies."
+msgstr "Çerez indiremezsiniz."
+
+#: LYMessages.c:265
+msgid "You cannot download a printing option."
+msgstr "Bir yazdırma seçeneğini indiremezsiniz."
+
+#: LYMessages.c:266
+msgid "You cannot download an upload option."
+msgstr "Bir yükleme seçeneğini indiremezsiniz."
+
+#: LYMessages.c:267
+msgid "You cannot download an permit option."
+msgstr "Bir izin seçeneğini indiremezsiniz."
+
+#: LYMessages.c:268
+msgid "This special URL cannot be downloaded!"
+msgstr "Bu özel URL indirilemez!"
+
+#: LYMessages.c:269
+msgid "Nothing to download."
+msgstr "İndirilecek hiçbir şey yok."
+
+#: LYMessages.c:270
+msgid "Trace ON!"
+msgstr "İz(leme) AÇIK!"
+
+#: LYMessages.c:271
+msgid "Trace OFF!"
+msgstr "Ä°z(leme) KAPALI!"
+
+#. #define CLICKABLE_IMAGES_ON
+#: LYMessages.c:273
+msgid "Links will be included for all images! Reloading..."
+msgstr "Tüm resimler için link içerilecek! Yeniden yükleniyor..."
+
+#. #define CLICKABLE_IMAGES_OFF
+#: LYMessages.c:275
+msgid "Standard image handling restored! Reloading..."
+msgstr "Standart resim becerimi geri kuruldu! Yeniden yükleniyor..."
+
+#. #define PSEUDO_INLINE_ALTS_ON
+#: LYMessages.c:277
+msgid "Pseudo_ALTs will be inserted for inlines without ALT strings! Reloading..."
+msgstr "ALT dizgesi olmayan içeriğe(inline) yalancı_ALT'lar atanacak! Yeniden yükleniyor..."
+
+#. #define PSEUDO_INLINE_ALTS_OFF
+#: LYMessages.c:279
+msgid "Inlines without an ALT string specified will be ignored! Reloading..."
+msgstr "Belirtilmiş ALT dizgesi olmayan içerik(inlines) yoksayılacak! Yeniden yükleniyor..."
+
+#: LYMessages.c:280
+msgid "Raw 8-bit or CJK mode toggled OFF! Reloading..."
+msgstr "Ham 8-bit ya da CJK modu KAPATILDI! Yeniden yükleniyor..."
+
+#: LYMessages.c:281
+msgid "Raw 8-bit or CJK mode toggled ON! Reloading..."
+msgstr "Ham 8-bit ya da CJK modu AÇILDI! Yeniden yükleniyor..."
+
+#. #define HEAD_D_L_OR_CANCEL
+#: LYMessages.c:283
+msgid "Send HEAD request for D)ocument or L)ink, or C)ancel? (d,l,c): "
+msgstr "Belge(D), link(L) için BAŞLIK istemi gönderilsin mi, iptal(C) mi edilsin? (d,l,c): "
+
+#. #define HEAD_D_OR_CANCEL
+#: LYMessages.c:285
+msgid "Send HEAD request for D)ocument, or C)ancel? (d,c): "
+msgstr "Belge(D) için BAŞLIK istemi gönderilsin mi, iptal(C) mi edilsin? (d,c): "
+
+#: LYMessages.c:286
+msgid "Sorry, the document is not an http URL."
+msgstr "Üzgünüm, belge bir http URL değil..."
+
+#: LYMessages.c:287
+msgid "Sorry, the link is not an http URL."
+msgstr "Üzgünüm, link bir http URL değil..."
+
+#: LYMessages.c:288
+msgid "Sorry, the ACTION for this form is disabled."
+msgstr "Üzgünüm, bu form için EYLEM devre dışı..."
+
+#. #define FORM_ACTION_NOT_HTTP_URL
+#: LYMessages.c:290
+msgid "Sorry, the ACTION for this form is not an http URL."
+msgstr "Üzgünüm, bu form için EYLEM bir http URL değil..."
+
+#: LYMessages.c:291
+msgid "Not an http URL or form ACTION!"
+msgstr "Http URL ya da form EYLEMi deÄŸil!"
+
+#: LYMessages.c:292
+msgid "This special URL cannot be a form ACTION!"
+msgstr "Bu özel URL, bir form EYLEMi olamaz!"
+
+#: LYMessages.c:293
+msgid "URL is not in starting realm!"
+msgstr "URL, başlangıç bölgesinde değil!"
+
+#: LYMessages.c:294
+msgid "News posting is disabled!"
+msgstr "Haber gönderme devre dışı!"
+
+#: LYMessages.c:295
+msgid "File management support is disabled!"
+msgstr "Dosya yönetim desteği devre dışı!"
+
+#: LYMessages.c:296
+msgid "No jump file is currently available."
+msgstr "Mevcut hiçbir sıçrama dosyası yok."
+
+#: LYMessages.c:297
+msgid "Jump to (use '?' for list): "
+msgstr "Sıçranacak yer (liste için '?' kullanınız): "
+
+#: LYMessages.c:298
+msgid "Jumping to a shortcut URL is disallowed!"
+msgstr "Bir kısayol URL'ye sıçramaya izin verilmiyor!"
+
+#: LYMessages.c:299
+msgid "Random URL is disallowed! Use a shortcut."
+msgstr "Rastgele URL'ye izin verilmiyor! Bir kısayol kullanınız."
+
+#: LYMessages.c:300
+msgid "No random URLs have been used thus far."
+msgstr "Şimdiye dek hiç rastgele URL kullanılmadı."
+
+#: LYMessages.c:301
+msgid "Bookmark features are currently disabled."
+msgstr "Yer imi özellikleri halen devre dışı..."
+
+#: LYMessages.c:302
+msgid "Execution via bookmarks is disabled."
+msgstr "Yer imleriyle icra devre dışı..."
+
+#. #define BOOKMARK_FILE_NOT_DEFINED
+#: LYMessages.c:304
+#, c-format
+msgid "Bookmark file is not defined. Use %s to see options."
+msgstr "Yer imi dosyası tanımlanmamış. Seçenekleri görmek için %s kullanınız."
+
+#. #define NO_TEMP_FOR_HOTLIST
+#: LYMessages.c:306
+msgid "Unable to open tempfile for X Mosaic hotlist conversion."
+msgstr "X Mosaic sıcakliste dönüşümü için geçici dosya açılamadı."
+
+#: LYMessages.c:307
+msgid "ERROR - unable to open bookmark file."
+msgstr "HATA - yer imi dosyası açılamadı."
+
+#. #define BOOKMARK_OPEN_FAILED_FOR_DEL
+#: LYMessages.c:309
+msgid "Unable to open bookmark file for deletion of link."
+msgstr "Linkin silinebilmesi için yer imi dosyası açılamadı."
+
+#. #define BOOKSCRA_OPEN_FAILED_FOR_DEL
+#: LYMessages.c:311
+msgid "Unable to open scratch file for deletion of link."
+msgstr "Linkin silinebilmesi için müsvedde dosyası açılamadı."
+
+#: LYMessages.c:313
+msgid "Error renaming scratch file."
+msgstr "Müsvedde dosyasının yeniden adlandırılmasında hata..."
+
+#: LYMessages.c:315
+msgid "Error renaming temporary file."
+msgstr "Geçici dosyanın yeniden adlandırılmasında hata..."
+
+#. #define BOOKTEMP_COPY_FAIL
+#: LYMessages.c:317
+msgid "Unable to copy temporary file for deletion of link."
+msgstr "Linkin silinebilmesi için geçici dosya kopyalanamıyor."
+
+#. #define BOOKTEMP_REOPEN_FAIL_FOR_DEL
+#: LYMessages.c:319
+msgid "Unable to reopen temporary file for deletion of link."
+msgstr "Linkin silinebilmesi için geçici dosya yeniden açılamıyor."
+
+#. #define BOOKMARK_LINK_NOT_ONE_LINE
+#: LYMessages.c:322
+msgid "Link is not by itself all on one line in bookmark file."
+msgstr "Yer imi dosyasındaki link kendi başına tek satırda değil."
+
+#: LYMessages.c:323
+msgid "Bookmark deletion failed."
+msgstr "Yer iminin silinmesi başarısız."
+
+#. #define BOOKMARKS_NOT_TRAVERSED
+#: LYMessages.c:325
+msgid "Bookmark files cannot be traversed (only http URLs)."
+msgstr "Yer imi dosyaları nakledilemez (yalnızca http URL'ler edilebilir)."
+
+#. #define BOOKMARKS_NOT_OPEN
+#: LYMessages.c:327
+msgid "Unable to open bookmark file, use 'a' to save a link first"
+msgstr "Yer imi dosyası açılamadı, önce linki kaydetmek için 'a'yı kullanın"
+
+#: LYMessages.c:328
+msgid "There are no links in this bookmark file!"
+msgstr "Bu yer imi dosyasında hiç link yok!"
+
+#. #define CACHE_D_OR_CANCEL
+#: LYMessages.c:330
+msgid "D)elete cached document or C)ancel? (d,c): "
+msgstr "Önbellekteki belge silinsinD) mi, iptalC) mi edilsin? (d,c): "
+
+#. #define BOOK_D_L_OR_CANCEL
+#: LYMessages.c:332
+msgid "Save D)ocument or L)ink to bookmark file or C)ancel? (d,l,c): "
+msgstr "Yer imi dosyasına belge(D), link(L) kaydedilsin mi, iptal(C) mi edilsin? (d,l,c): "
+
+#: LYMessages.c:333
+msgid "Save D)ocument to bookmark file or C)ancel? (d,c): "
+msgstr "Yer imi dosyasına belge(D) kaydedilsin mi, iptal(C) mi edilsin? (d,c): "
+
+#: LYMessages.c:334
+msgid "Save L)ink to bookmark file or C)ancel? (l,c): "
+msgstr "Yer imi dosyasına link(L) kaydedilsin mi, iptal(C) mi edilsin? (l,c): "
+
+#. #define NOBOOK_POST_FORM
+#: LYMessages.c:336
+msgid "Documents from forms with POST content cannot be saved as bookmarks."
+msgstr "POST içerikli formdan olan belgeler, yer imi olarak kaydedilemez."
+
+#: LYMessages.c:337
+msgid "Cannot save form fields/links"
+msgstr "Form alanları/linkleri kaydedilemiyor"
+
+#. #define NOBOOK_HSML
+#: LYMessages.c:339
+msgid "History, showinfo, menu and list files cannot be saved as bookmarks."
+msgstr "Tarihçe, bilgi-göster, menü ve liste dosyaları yer imi olarak kaydedilemez."
+
+#. #define CONFIRM_BOOKMARK_DELETE
+#: LYMessages.c:341
+msgid "Do you really want to delete this link from your bookmark file?"
+msgstr "Yer imi dosyanızdan bu linki silmek istediğinize emin misiniz?"
+
+#: LYMessages.c:342
+msgid "Malformed address."
+msgstr "Bozuk adres."
+
+#. #define HISTORICAL_ON_MINIMAL_OFF
+#: LYMessages.c:344
+msgid "Historical comment parsing ON (Minimal is overridden)!"
+msgstr "Tarihsel yorum ayrıştırma AÇIK (Minimal geçersiz kılınmış)!"
+
+#. #define HISTORICAL_OFF_MINIMAL_ON
+#: LYMessages.c:346
+msgid "Historical comment parsing OFF (Minimal is in effect)!"
+msgstr "Tarihsel yorum ayrıştırma KAPALI (Minimal yürürlükte)!"
+
+#. #define HISTORICAL_ON_VALID_OFF
+#: LYMessages.c:348
+msgid "Historical comment parsing ON (Valid is overridden)!"
+msgstr "Tarihsel yorum ayrıştırma AÇIK (Valid geçersiz kılınmış)!"
+
+#. #define HISTORICAL_OFF_VALID_ON
+#: LYMessages.c:350
+msgid "Historical comment parsing OFF (Valid is in effect)!"
+msgstr "Tarihsel yorum ayrıştırma KAPALI (Valid yürürlükte)!"
+
+#. #define MINIMAL_ON_IN_EFFECT
+#: LYMessages.c:352
+msgid "Minimal comment parsing ON (and in effect)!"
+msgstr "Minimal yorum ayrıştırma AÇIK (ve yürürlükte)!"
+
+#. #define MINIMAL_OFF_VALID_ON
+#: LYMessages.c:354
+msgid "Minimal comment parsing OFF (Valid is in effect)!"
+msgstr "Minimal yorum ayrıştırma KAPALI (Valid yürürlükte)!"
+
+#. #define MINIMAL_ON_BUT_HISTORICAL
+#: LYMessages.c:356
+msgid "Minimal comment parsing ON (but Historical is in effect)!"
+msgstr "Minimal yorum ayrıştırma AÇIK (ancak Tarihsel yürürlükte)!"
+
+#. #define MINIMAL_OFF_HISTORICAL_ON
+#: LYMessages.c:358
+msgid "Minimal comment parsing OFF (Historical is in effect)!"
+msgstr "Minimal yorum ayrıştırma KAPALI (Tarihsel yürürlükte)!"
+
+#: LYMessages.c:359
+msgid "Soft double-quote parsing ON!"
+msgstr "Salt çift-tırnak ayrıştırma AÇIK!"
+
+#: LYMessages.c:360
+msgid "Soft double-quote parsing OFF!"
+msgstr "Salt çift-tırnak ayrıştırma KAPALI!"
+
+#: LYMessages.c:361
+msgid "Now using TagSoup parsing of HTML."
+msgstr "Şu an HTML'nin TagSoup ayrıştırması kullanılıyor."
+
+#: LYMessages.c:362
+msgid "Now using SortaSGML parsing of HTML!"
+msgstr "Şu an HTML'nin SortaSGML ayrıştırması kullanılıyor!"
+
+#: LYMessages.c:363
+msgid "You are already at the end of this document."
+msgstr "Zaten bu belgenin sonundasınız."
+
+#: LYMessages.c:364
+msgid "You are already at the beginning of this document."
+msgstr "Zaten bu belgenin başındasınız."
+
+#: LYMessages.c:365
+#, c-format
+msgid "You are already at page %d of this document."
+msgstr "Zaten bu belgenin %d. sayfasındasınız."
+
+#: LYMessages.c:366
+#, c-format
+msgid "Link number %d already is current."
+msgstr "%d no'lu link zaten güncel..."
+
+#: LYMessages.c:367
+msgid "You are already at the first document"
+msgstr "Zaten birinci belgedesiniz"
+
+#: LYMessages.c:368
+msgid "There are no links above this line of the document."
+msgstr "Belgenin bu satırından önce hiç link yok..."
+
+#: LYMessages.c:369
+msgid "There are no links below this line of the document."
+msgstr "Belgenin bu satırından sonra hiç link yok..."
+
+#. #define MAXLEN_REACHED_DEL_OR_MOV
+#: LYMessages.c:371
+msgid "Maximum length reached! Delete text or move off field."
+msgstr "Maksimum uzunluğa ulaşıldı! Metin silin ya da alanın dışına çıkın."
+
+#. #define NOT_ON_SUBMIT_OR_LINK
+#: LYMessages.c:373
+msgid "You are not on a form submission button or normal link."
+msgstr "Form gönderme düğmesi ya da normal bağlantı üzerinde değilsiniz."
+
+#. #define NEED_CHECKED_RADIO_BUTTON
+#: LYMessages.c:375
+msgid "One radio button must be checked at all times!"
+msgstr "Radyo düğmelerinden biri mutlaka seçilmiş olmalıdır!"
+
+#: LYMessages.c:376
+msgid "No submit button for this form, submit single text field?"
+msgstr "Formda gönder düğmesi yok, tek metin alanı gönderilsin mi?"
+
+#: LYMessages.c:377
+msgid "Do you want to go back to the previous document?"
+msgstr "Önceki belgeye dönmek ister misiniz?"
+
+#: LYMessages.c:378
+msgid "Use arrows or tab to move off of field."
+msgstr "Alanın dışına çıkmak için okları ya da sekmeyi kullanınız."
+
+#. #define ENTER_TEXT_ARROWS_OR_TAB
+#: LYMessages.c:380
+msgid "Enter text. Use arrows or tab to move off of field."
+msgstr "Metin giriniz. Alanın dışına çıkmak için okları ya da sekmeyi kullanınız."
+
+#: LYMessages.c:381
+msgid "** Bad HTML!! No form action defined. **"
+msgstr "**Bozuk HTML!! Hiçbir form eylemi tanımlanmamış. **"
+
+#: LYMessages.c:382
+msgid "Bad HTML!! Unable to create popup window!"
+msgstr "Bozuk HTML!! Beliriveren pencere oluşturulamadı!"
+
+#: LYMessages.c:383
+msgid "Unable to create popup window!"
+msgstr "Beliriveren pencere oluşturulamadı!"
+
+#: LYMessages.c:384
+msgid "Goto a random URL is disallowed!"
+msgstr "Rastgele URL'ye gitmeye izin verilmiyor!"
+
+#: LYMessages.c:385
+msgid "Goto a non-http URL is disallowed!"
+msgstr "Http olmayan URL'ye gitmeye izin verilmiyor!"
+
+#: LYMessages.c:386
+#, c-format
+msgid "You are not allowed to goto \"%s\" URLs"
+msgstr "\"%s\" URL'lere gitme izniniz yok"
+
+#: LYMessages.c:387
+msgid "URL to open: "
+msgstr "Açılacak URL: "
+
+#: LYMessages.c:388
+msgid "Edit the current Goto URL: "
+msgstr "Mevcut Gidilecek URL'yi düzenleyiniz: "
+
+#: LYMessages.c:389
+msgid "Edit the previous Goto URL: "
+msgstr "Önceki Gidilecek URL'yi düzenleyiniz: "
+
+#: LYMessages.c:390
+msgid "Edit a previous Goto URL: "
+msgstr "Önceki Gidilecek URL'lerden birini düzenleyiniz: "
+
+#: LYMessages.c:391
+msgid "Current document has POST data."
+msgstr "Mevcut belgede POST verisi var."
+
+#: LYMessages.c:392
+msgid "Edit this document's URL: "
+msgstr "Bu belgenin URL'sini düzenleyiniz: "
+
+#: LYMessages.c:393
+msgid "Edit the current link's URL: "
+msgstr "Mevcut linkin URL'sini düzenleyiniz: "
+
+#: LYMessages.c:394
+msgid "Edit the form's submit-URL: "
+msgstr "Bu formun sunma-URL'sini düzenleyiniz: "
+
+#: LYMessages.c:395
+msgid "You cannot edit File Management URLs"
+msgstr "Dosya Yönetim URL'lerini düzenleyemezsiniz"
+
+#: LYMessages.c:396
+msgid "Enter a database query: "
+msgstr "Bir veritabanı sorgusu giriniz: "
+
+#: LYMessages.c:397
+msgid "Enter a whereis query: "
+msgstr "Bir whereis sorgusu giriniz: "
+
+#: LYMessages.c:398
+msgid "Edit the current query: "
+msgstr "Mevcut sorguyu düzenleyiniz: "
+
+#: LYMessages.c:399
+msgid "Edit the previous query: "
+msgstr "Önceki sorguyu düzenleyiniz: "
+
+#: LYMessages.c:400
+msgid "Edit a previous query: "
+msgstr "Önceki sorgulardan birini düzenleyiniz: "
+
+#. #define USE_C_R_TO_RESUB_CUR_QUERY
+#: LYMessages.c:402
+msgid "Use Control-R to resubmit the current query."
+msgstr "Mevcut sorguyu yeniden göndermek için Control-R'yi kullanınız."
+
+#: LYMessages.c:403
+msgid "Edit the current shortcut: "
+msgstr "Mevcut kısayolu düzenleyiniz: "
+
+#: LYMessages.c:404
+msgid "Edit the previous shortcut: "
+msgstr "Önceki kısayolu düzenleyiniz: "
+
+#: LYMessages.c:405
+msgid "Edit a previous shortcut: "
+msgstr "Önceki kısayollardan birini düzenleyiniz: "
+
+#: LYMessages.c:406
+#, c-format
+msgid "Key '%c' is not mapped to a jump file!"
+msgstr "'%c' tuşu, herhangi bir sıçrama dosyasına eşlemlenmemiş!"
+
+#: LYMessages.c:407
+msgid "Cannot locate jump file!"
+msgstr "Sıçrama dosyası konumlandırılamıyor!"
+
+#: LYMessages.c:408
+msgid "Cannot open jump file!"
+msgstr "Sıçrama dosyası açılamıyor!"
+
+#: LYMessages.c:409
+msgid "Error reading jump file!"
+msgstr "Sıçrama dosyasının okunmasında hata!"
+
+#: LYMessages.c:410
+msgid "Out of memory reading jump file!"
+msgstr "Sıçrama dosyasının okunmasında bellek yetersiz!"
+
+#: LYMessages.c:411
+msgid "Out of memory reading jump table!"
+msgstr "Sıçrama tablosunun okunmasında bellek yetersiz!"
+
+#: LYMessages.c:412
+msgid "No index is currently available."
+msgstr "Halen hiç indeks yok."
+
+#. #define CONFIRM_MAIN_SCREEN
+#: LYMessages.c:414
+msgid "Do you really want to go to the Main screen?"
+msgstr "Ana ekrana gitmeyi gerçekten istiyor musunuz?"
+
+#: LYMessages.c:415
+msgid "You are already at main screen!"
+msgstr "Zaten ana ekrandasınız!"
+
+#. #define NOT_ISINDEX
+#: LYMessages.c:417
+msgid "Not a searchable indexed document -- press '/' to search for a text string"
+msgstr "Aranabilir indekslenmiş bir belge değil -- metin dizgesi aramak için '/'ye basınız"
+
+#. #define NO_OWNER
+#: LYMessages.c:419
+msgid "No owner is defined for this file so you cannot send a comment"
+msgstr "Bu dosya için bir sahip tanımlanmadığından yorum gönderemezsiniz"
+
+#: LYMessages.c:420
+#, c-format
+msgid "No owner is defined. Use %s?"
+msgstr "Sahip tanımlanmamış. %s kullanmak ister misiniz?"
+
+#: LYMessages.c:421
+msgid "Do you wish to send a comment?"
+msgstr "Yorum göndermek ister misiniz?"
+
+#: LYMessages.c:422
+msgid "Mail is disallowed so you cannot send a comment"
+msgstr "Mektuba izin verilmediğinden yorum gönderemezsiniz"
+
+#: LYMessages.c:423
+msgid "The 'e'dit command is currently disabled."
+msgstr "Düzenl'e' komutu halen devre dışı..."
+
+#: LYMessages.c:424
+msgid "External editing is currently disabled."
+msgstr "Harici düzenleme halen devre dışı..."
+
+#: LYMessages.c:425
+msgid "System error - failure to get status."
+msgstr "Sistem hatası - durum alımı başarısız."
+
+#: LYMessages.c:426
+msgid "No editor is defined!"
+msgstr "Hiçbir düzenleyici tanımlanmamış!"
+
+#: LYMessages.c:427
+msgid "The 'p'rint command is currently disabled."
+msgstr "Yazdır(p) komutu halen devre dışı..."
+
+#: LYMessages.c:428
+msgid "Document has no Toolbar links or Banner."
+msgstr "Belgede araç çubuğu linki ya da afiş yok..."
+
+#: LYMessages.c:429
+msgid "Unable to open traversal file."
+msgstr "Nakil dosyası açılamıyor."
+
+#: LYMessages.c:430
+msgid "Unable to open traversal found file."
+msgstr "Nakil bulunmuş dosya açılamıyor."
+
+#: LYMessages.c:431
+msgid "Unable to open reject file."
+msgstr "Red dosyası açılamıyor."
+
+#: LYMessages.c:432
+msgid "Unable to open traversal errors output file"
+msgstr "Nakil hataları çıktı dosyası açılamıyor"
+
+#: LYMessages.c:433
+msgid "TRAVERSAL WAS INTERRUPTED"
+msgstr "NAKÄ°L YARIDA KESÄ°LDÄ°"
+
+#: LYMessages.c:434
+msgid "Follow link (or goto link or page) number: "
+msgstr "Ä°zlenecek link (ya da Gidilecek link/sayfa) no: "
+
+#: LYMessages.c:435
+msgid "Select option (or page) number: "
+msgstr "Seçenek (ya da sayfa) no seçiniz: "
+
+#: LYMessages.c:436
+#, c-format
+msgid "Option number %d already is current."
+msgstr "%d no'lu seçenek zaten güncel."
+
+#. #define ALREADY_AT_OPTION_END
+#: LYMessages.c:438
+msgid "You are already at the end of this option list."
+msgstr "Zaten bu seçenek listesinin sonundasınız."
+
+#. #define ALREADY_AT_OPTION_BEGIN
+#: LYMessages.c:440
+msgid "You are already at the beginning of this option list."
+msgstr "Zaten bu seçenek listesinin başındasınız."
+
+#. #define ALREADY_AT_OPTION_PAGE
+#: LYMessages.c:442
+#, c-format
+msgid "You are already at page %d of this option list."
+msgstr "Zaten bu seçenek listesinin %d sayfasındasınız."
+
+#: LYMessages.c:443
+msgid "You have entered an invalid option number."
+msgstr "Geçersiz bir seçenek no'su girdiniz."
+
+#: LYMessages.c:444
+msgid "** Bad HTML!! Use -trace to diagnose. **"
+msgstr "** Bozuk HTML!! Tanı için -trace kullanınız. **"
+
+#: LYMessages.c:445
+msgid "Give name of file to save in"
+msgstr "İçine kaydedilecek dosya adı veriniz"
+
+#: LYMessages.c:446
+msgid "Can't save data to file -- please run WWW locally"
+msgstr "Veri, dosyaya kaydedilemiyor -- lütfen WWW'yu yerel çalıştırın"
+
+#: LYMessages.c:447
+msgid "Can't open temporary file!"
+msgstr "Geçici dosya açılamıyor!"
+
+#: LYMessages.c:448
+msgid "Can't open output file! Cancelling!"
+msgstr "Çıktı dosyası açılamıyor! İptal ediliyor!"
+
+#: LYMessages.c:449
+msgid "Execution is disabled."
+msgstr "İcra etme devre dışı..."
+
+#. #define EXECUTION_DISABLED_FOR_FILE
+#: LYMessages.c:451
+#, c-format
+msgid "Execution is not enabled for this file. See the Options menu (use %s)."
+msgstr "İcra etme, bu dosya için etkinleştirilmemiş. Seçenekler menüsüne bakınız (%s kullanın)."
+
+#. #define EXECUTION_NOT_COMPILED
+#: LYMessages.c:453
+msgid "Execution capabilities are not compiled into this version."
+msgstr "İcra etme yetileri bu sürüm içine derlenmemiş."
+
+#: LYMessages.c:454
+msgid "This file cannot be displayed on this terminal."
+msgstr "Bu dosya, bu uçbirimde görüntülenemez."
+
+#. #define CANNOT_DISPLAY_FILE_D_OR_C
+#: LYMessages.c:456
+msgid "This file cannot be displayed on this terminal: D)ownload, or C)ancel"
+msgstr "Bu dosya, bu uçbirimde görüntülenemez: İndir(D) ya da İptal et(C)"
+
+#: LYMessages.c:457
+#, c-format
+msgid "%s D)ownload, or C)ancel"
+msgstr "%s Ä°ndir(D) ya da Ä°ptal et(C)"
+
+#: LYMessages.c:458
+msgid "Cancelling file."
+msgstr "Dosya iptal ediliyor."
+
+#: LYMessages.c:459
+msgid "Retrieving file. - PLEASE WAIT -"
+msgstr "Dosya alınıyor. - LÜTFEN BEKLEYİNİZ -"
+
+#: LYMessages.c:460
+msgid "Enter a filename: "
+msgstr "Bir dosya adı giriniz: "
+
+#: LYMessages.c:461
+msgid "Edit the previous filename: "
+msgstr "Önceki dosya adını düzenleyiniz: "
+
+#: LYMessages.c:462
+msgid "Edit a previous filename: "
+msgstr "Önceki dosya adlarından birini düzenleyiniz: "
+
+#: LYMessages.c:463
+msgid "Enter a new filename: "
+msgstr "Yeni bir dosya adı giriniz: "
+
+#: LYMessages.c:464
+msgid "File name may not begin with a dot."
+msgstr "Dosya adı noktayla başlayamaz."
+
+#: LYMessages.c:466
+msgid "File exists. Create higher version?"
+msgstr "Dosya zaten var. Daha yüksek sürüm oluşturulsun mu?"
+
+#: LYMessages.c:468
+msgid "File exists. Overwrite?"
+msgstr "Dosya zaten var. Üzerine yazılsın mı?"
+
+#: LYMessages.c:470
+msgid "Cannot write to file."
+msgstr "Dosyaya yazılamıyor."
+
+#: LYMessages.c:471
+msgid "ERROR! - download command is misconfigured."
+msgstr "HATA! - indir komutu yanlış ayarlanmış."
+
+#: LYMessages.c:472
+msgid "Unable to download file."
+msgstr "Dosya indirilemiyor."
+
+#: LYMessages.c:473
+msgid "Reading directory..."
+msgstr "Dizin okunuyor..."
+
+#: LYMessages.c:474
+msgid "Building directory listing..."
+msgstr "Dizin listesi yapılanıyor..."
+
+#: LYMessages.c:475
+msgid "Saving..."
+msgstr "Kaydediliyor..."
+
+#: LYMessages.c:476
+#, c-format
+msgid "Could not edit file '%s'."
+msgstr "'%s' dosyası düzenlenemedi."
+
+#: LYMessages.c:477
+msgid "Unable to access document!"
+msgstr "Belgeye eriÅŸilemedi!"
+
+#: LYMessages.c:478
+msgid "Could not access file."
+msgstr "Dosyaya eriÅŸilemedi."
+
+#: LYMessages.c:479
+msgid "Could not access directory."
+msgstr "Dizine eriÅŸilemedi."
+
+#: LYMessages.c:480
+msgid "Could not load data."
+msgstr "Veri yüklenemedi."
+
+#. #define CANNOT_EDIT_REMOTE_FILES
+#: LYMessages.c:482
+msgid "Lynx cannot currently (e)dit remote WWW files."
+msgstr "Lynx, halen uzak WWW dosyalarını düz(e)nleyemiyor."
+
+#. #define CANNOT_EDIT_FIELD
+#: LYMessages.c:484
+msgid "This field cannot be (e)dited with an external editor."
+msgstr "Bu alan, harici bir düzenleyiciyle düz(e)nlenemez."
+
+#: LYMessages.c:485
+msgid "Bad rule"
+msgstr "Hatalı kural"
+
+#: LYMessages.c:486
+msgid "Insufficient operands:"
+msgstr "Ä°ÅŸlenenler yetersiz:"
+
+#: LYMessages.c:487
+msgid "You are not authorized to edit this file."
+msgstr "Bu dosyayı düzenleme yetkiniz yok."
+
+#: LYMessages.c:488
+msgid "Title: "
+msgstr "Başlık: "
+
+#: LYMessages.c:489
+msgid "Subject: "
+msgstr "Konu: "
+
+#: LYMessages.c:490
+msgid "Username: "
+msgstr "Kullanıcı adı: "
+
+#: LYMessages.c:491
+msgid "Password: "
+msgstr "Parola: "
+
+#: LYMessages.c:492
+msgid "lynx: Username and Password required!!!"
+msgstr "lynx: Kullanıcı adı ve Parola zorunludur!!!"
+
+#: LYMessages.c:493
+msgid "lynx: Password required!!!"
+msgstr "lynx: Parola zorunludur!!!"
+
+#: LYMessages.c:494
+msgid "Clear all authorization info for this session?"
+msgstr "Bu oturum için tüm yetkilendirme bilgisi silinsin mi?"
+
+#: LYMessages.c:495
+msgid "Authorization info cleared."
+msgstr "Yetkilendirme bilgisi silindi."
+
+#: LYMessages.c:496
+msgid "Authorization failed. Retry?"
+msgstr "Yetkilendirme başarısız. Yinele?"
+
+#: LYMessages.c:497
+msgid "cgi support has been disabled."
+msgstr "cgi desteği devre dışı..."
+
+#. #define CGI_NOT_COMPILED
+#: LYMessages.c:499
+msgid "Lynxcgi capabilities are not compiled into this version."
+msgstr "Lynxcgi yetileri bu sürüm içine derlenmemiş."
+
+#: LYMessages.c:500
+#, c-format
+msgid "Sorry, no known way of converting %s to %s."
+msgstr "Üzgünüm, %s'i %s'e dönüştürmenin bilinen yöntemi yok."
+
+#: LYMessages.c:501
+msgid "Unable to set up connection."
+msgstr "Bağlantı sağlanamıyor."
+
+#: LYMessages.c:502
+msgid "Unable to make connection"
+msgstr "Bağlantı kurulamıyor"
+
+#. #define MALFORMED_EXEC_REQUEST
+#: LYMessages.c:504
+msgid "Executable link rejected due to malformed request."
+msgstr "Bozuk istem nedeniyle icra edilebilir bağlantı geri çevrildi."
+
+#. #define BADCHAR_IN_EXEC_LINK
+#: LYMessages.c:506
+#, c-format
+msgid "Executable link rejected due to `%c' character."
+msgstr "`%c' karakteri nedeniyle icra edilebilir bağlantı geri çevrildi."
+
+#. #define RELPATH_IN_EXEC_LINK
+#: LYMessages.c:508
+msgid "Executable link rejected due to relative path string ('../')."
+msgstr "Göreli yol dizgesi ('../') nedeniyle icra edilebilir bağlantı reddedildi."
+
+#. #define BADLOCPATH_IN_EXEC_LINK
+#: LYMessages.c:510
+msgid "Executable link rejected due to location or path."
+msgstr "Konum ya da yol nedeniyle icra edilebilir bağlantı reddedildi."
+
+#: LYMessages.c:511
+msgid "Mail access is disabled!"
+msgstr "E-posta erişimi devre dışı!"
+
+#. #define ACCESS_ONLY_LOCALHOST
+#: LYMessages.c:513
+msgid "Only files and servers on the local host can be accessed."
+msgstr "Yalnızca yerel makinadaki dosya ve sunuculara erişilebilir."
+
+#: LYMessages.c:514
+msgid "Telnet access is disabled!"
+msgstr "Telnet erişimi devre dışı!"
+
+#. #define TELNET_PORT_SPECS_DISABLED
+#: LYMessages.c:516
+msgid "Telnet port specifications are disabled."
+msgstr "Telnet port belirleyicileri devre dışı..."
+
+#: LYMessages.c:517
+msgid "USENET news access is disabled!"
+msgstr "USENET haber erişimi devre dışı!"
+
+#: LYMessages.c:518
+msgid "Rlogin access is disabled!"
+msgstr "Rlogin erişimi devre dışı!"
+
+#: LYMessages.c:519
+msgid "Ftp access is disabled!"
+msgstr "Ftp erişimi devre dışı!"
+
+#: LYMessages.c:520
+msgid "There are no references from this document."
+msgstr "Bu belgeden hiç referans yok..."
+
+#: LYMessages.c:521
+msgid "There are only hidden links from this document."
+msgstr "Bu belgeden yalnızca gizli linkler var..."
+
+#: LYMessages.c:523
+msgid "Unable to open command file."
+msgstr "Komut dosyası açılamıyor."
+
+#: LYMessages.c:525
+msgid "News Post Cancelled!!!"
+msgstr "Haber Gönderimi İptal Edildi!!!"
+
+#. #define SPAWNING_EDITOR_FOR_NEWS
+#: LYMessages.c:527
+msgid "Spawning your selected editor to edit news message"
+msgstr "Haber iletisini düzenlemek için seçilmiş düzenleyici başlatılıyor"
+
+#: LYMessages.c:528
+msgid "Post this message?"
+msgstr "İleti gönderilsin mi?"
+
+#: LYMessages.c:529
+#, c-format
+msgid "Append '%s'?"
+msgstr "'%s' sona eklensin mi?"
+
+#: LYMessages.c:530
+msgid "Posting to newsgroup(s)..."
+msgstr "Haber grubu (ya da gruplarına) gönderiliyor..."
+
+#: LYMessages.c:532
+msgid "*** You have unread mail. ***"
+msgstr "*** Okunmamış mektubunuz var. ***"
+
+#: LYMessages.c:534
+msgid "*** You have mail. ***"
+msgstr "*** Mektubunuz var. ***"
+
+#: LYMessages.c:536
+msgid "*** You have new mail. ***"
+msgstr "*** Yeni mektubunuz var. ***"
+
+#: LYMessages.c:537
+msgid "File insert cancelled!!!"
+msgstr "Dosya ekleme iptal edildi!!!"
+
+#: LYMessages.c:538
+msgid "Not enough memory for file!"
+msgstr "Dosya için yeterli bellek yok!"
+
+#: LYMessages.c:539
+msgid "Can't open file for reading."
+msgstr "Okumak için dosya açılamıyor."
+
+#: LYMessages.c:540
+msgid "File does not exist."
+msgstr "Dosya mevcut deÄŸil."
+
+#: LYMessages.c:541
+msgid "File does not exist - reenter or cancel:"
+msgstr "Dosya mevcut değil - yeniden girin ya da vazgeçin:"
+
+#: LYMessages.c:542
+msgid "File is not readable."
+msgstr "Dosya okunabilir durumda deÄŸil."
+
+#: LYMessages.c:543
+msgid "File is not readable - reenter or cancel:"
+msgstr "Dosya okunabilir durumda değil - yeniden girin ya da vazgeçin:"
+
+#: LYMessages.c:544
+msgid "Nothing to insert - file is 0-length."
+msgstr "Eklenecek hiçbir şey yok - dosya 0 uzunlukta..."
+
+#: LYMessages.c:545
+msgid "Save request cancelled!!!"
+msgstr "Kaydetme istemi iptal edildi!"
+
+#: LYMessages.c:546
+msgid "Mail request cancelled!!!"
+msgstr "Mektup istemi iptal edildi!!!"
+
+#. #define CONFIRM_MAIL_SOURCE_PREPARSED
+#: LYMessages.c:548
+msgid "Viewing preparsed source. Are you sure you want to mail it?"
+msgstr "Ayrıştırma öncesi kaynak görüntüleniyor. Mektupla göndermek istediğinizden emin misiniz?"
+
+#: LYMessages.c:549
+msgid "Please wait..."
+msgstr "Lütfen bekleyiniz..."
+
+#: LYMessages.c:550
+msgid "Mailing file. Please wait..."
+msgstr "Dosya mektupla gönderiliyor. Lütfen bekleyiniz..."
+
+#: LYMessages.c:551
+msgid "ERROR - Unable to mail file"
+msgstr "HATA - Dosya mektupla gönderilemedi"
+
+#. #define CONFIRM_LONG_SCREEN_PRINT
+#: LYMessages.c:553
+#, c-format
+msgid "File is %d screens long. Are you sure you want to print?"
+msgstr "Dosya %d ekran uzunluğunda. Yazdırmak istediğinizden emin misiniz?"
+
+#: LYMessages.c:554
+msgid "Print request cancelled!!!"
+msgstr "Yazdırma istemi iptal edildi!!!"
+
+#: LYMessages.c:555
+msgid "Press <return> to begin: "
+msgstr "Başlamak için <return>'e basınız: "
+
+#: LYMessages.c:556
+msgid "Press <return> to finish: "
+msgstr "Bitirmek için <return>'e basınız: "
+
+#. #define CONFIRM_LONG_PAGE_PRINT
+#: LYMessages.c:558
+#, c-format
+msgid "File is %d pages long. Are you sure you want to print?"
+msgstr "Dosya %d sayfa uzunluğunda. Yazdırmak istediğinizden emin misiniz?"
+
+#. #define CHECK_PRINTER
+#: LYMessages.c:560
+msgid "Be sure your printer is on-line. Press <return> to start printing:"
+msgstr "Yazıcınızın çevrimiçi olduğundan emin olun. Yazdırmaya başlamak için lütfen <return>'e basınız::"
+
+#: LYMessages.c:561
+msgid "ERROR - Unable to allocate file space!!!"
+msgstr "HATA - dosya boÅŸluÄŸu tahsis edilemedi!!!"
+
+#: LYMessages.c:562
+msgid "Unable to open tempfile"
+msgstr "Geçici dosya açılamadı"
+
+#: LYMessages.c:563
+msgid "Unable to open print options file"
+msgstr "Yazdırma seçenekleri dosyası açılamadı"
+
+#: LYMessages.c:564
+msgid "Printing file. Please wait..."
+msgstr "Dosya yazdırılıyor. Lütfen bekleyiniz..."
+
+#: LYMessages.c:565
+msgid "Please enter a valid internet mail address: "
+msgstr "Lütfen geçerli bir internet mektup adresi giriniz: "
+
+#: LYMessages.c:566
+msgid "ERROR! - printer is misconfigured!"
+msgstr "HATA! - Yazıcı yanlış ayarlanmış!"
+
+#: LYMessages.c:567
+msgid "Image map from POST response not available!"
+msgstr "POST yanıtından resim eşlemi temin edilemiyor!"
+
+#: LYMessages.c:568
+msgid "Misdirected client-side image MAP request!"
+msgstr "Yanlış yönlendirilmiş alıcı-tarafı resim EŞLEM istemi!"
+
+#: LYMessages.c:569
+msgid "Client-side image MAP is not accessible!"
+msgstr "Alıcı-tarafı resim EŞLEMine erişilemez!"
+
+#: LYMessages.c:570
+msgid "No client-side image MAPs are available!"
+msgstr "Hiçbir alıcı-tarafı resim EŞLEMi yok!"
+
+#: LYMessages.c:571
+msgid "Client-side image MAP is not available!"
+msgstr "Alıcı-tarafı resim EŞLEMi yok!"
+
+#. #define OPTION_SCREEN_NEEDS_24
+#: LYMessages.c:574
+msgid "Screen height must be at least 24 lines for the Options menu!"
+msgstr "Seçenekler menüsü için ekran boyu en az 24 satır olmalıdır!"
+
+#. #define OPTION_SCREEN_NEEDS_23
+#: LYMessages.c:576
+msgid "Screen height must be at least 23 lines for the Options menu!"
+msgstr "Seçenekler menüsü için ekran boyu en az 23 satır olmalıdır!"
+
+#. #define OPTION_SCREEN_NEEDS_22
+#: LYMessages.c:578
+msgid "Screen height must be at least 22 lines for the Options menu!"
+msgstr "Seçenekler menüsü için ekran boyu en az 22 satır olmalıdır!"
+
+#: LYMessages.c:580
+msgid "That key requires Advanced User mode."
+msgstr "O tuş, İleri Düzey Kullanıcı kipi gerektirir."
+
+#: LYMessages.c:581
+#, c-format
+msgid "Content-type: %s"
+msgstr "İçerik türü: %s"
+
+#: LYMessages.c:582
+msgid "Command: "
+msgstr "Komut: "
+
+#: LYMessages.c:583
+msgid "Unknown or ambiguous command"
+msgstr "Bilinmeyen ya da belirsiz komut"
+
+#: LYMessages.c:584
+msgid " Version "
+msgstr " Sürüm "
+
+#: LYMessages.c:585
+msgid " first"
+msgstr " ilk"
+
+#: LYMessages.c:586
+msgid ", guessing..."
+msgstr ", tahmin ediliyor..."
+
+#: LYMessages.c:587
+msgid "Permissions for "
+msgstr "Ä°zinlerin sahibi "
+
+#: LYMessages.c:588
+msgid "Select "
+msgstr "Seçiniz "
+
+#: LYMessages.c:589
+msgid "capital letter"
+msgstr "büyük harf"
+
+#: LYMessages.c:590
+msgid " of option line,"
+msgstr " seçenek satırının,"
+
+#: LYMessages.c:591
+msgid " to save,"
+msgstr " kaydetmek için,"
+
+#: LYMessages.c:592
+msgid " to "
+msgstr " hedef "
+
+#: LYMessages.c:593
+msgid " or "
+msgstr " ya da "
+
+#: LYMessages.c:594
+msgid " index"
+msgstr " indeks"
+
+#: LYMessages.c:595
+msgid " to return to Lynx."
+msgstr " Lynx'e dönmek için."
+
+#: LYMessages.c:596
+msgid "Accept Changes"
+msgstr "DeÄŸiÅŸiklikleri kabul et"
+
+#: LYMessages.c:597
+msgid "Reset Changes"
+msgstr "Değişiklikleri Sıfırla"
+
+#: LYMessages.c:598
+msgid "Left Arrow cancels changes"
+msgstr "Sol Ok deÄŸiÅŸiklikleri iptal eder"
+
+#: LYMessages.c:599
+msgid "Save options to disk"
+msgstr "Seçenekleri diske Kaydet"
+
+#: LYMessages.c:600
+msgid "Hit RETURN to accept entered data."
+msgstr "Girilen veriyi kabul etmek için RETURN'e basınız."
+
+#. #define ACCEPT_DATA_OR_DEFAULT
+#: LYMessages.c:602
+msgid "Hit RETURN to accept entered data. Delete data to invoke the default."
+msgstr "Girilen veriyi kabul etmek için RETURN'e basınız. Öntanımlıyı çağırmak için veriyi siliniz."
+
+#: LYMessages.c:603
+msgid "Value accepted!"
+msgstr "DeÄŸer kabul edildi!"
+
+#. #define VALUE_ACCEPTED_WARNING_X
+#: LYMessages.c:605
+msgid "Value accepted! -- WARNING: Lynx is configured for XWINDOWS!"
+msgstr "Değer kabul edildi! -- UYARI: Lynx, XWINDOWS için ayarlanmıştır!"
+
+#. #define VALUE_ACCEPTED_WARNING_NONX
+#: LYMessages.c:607
+msgid "Value accepted! -- WARNING: Lynx is NOT configured for XWINDOWS!"
+msgstr "Değer kabul edildi! -- UYARI: Lynx, XWINDOWS için ayarlanmamıştır!"
+
+#: LYMessages.c:608
+msgid "You are not allowed to change which editor to use!"
+msgstr "Kullanılacak düzenleyiciyi değiştirmenize izin verilmiyor!"
+
+#: LYMessages.c:609
+msgid "Failed to set DISPLAY variable!"
+msgstr "DISPLAY değişkeninin atanması başarılamadı!"
+
+#: LYMessages.c:610
+msgid "Failed to clear DISPLAY variable!"
+msgstr "DISPLAY değişkeninin silinmesi başarılamadı!"
+
+#. #define BOOKMARK_CHANGE_DISALLOWED
+#: LYMessages.c:612
+msgid "You are not allowed to change the bookmark file!"
+msgstr "Yer imi dosyasını değiştirmenize izin verilmiyor!"
+
+#: LYMessages.c:613
+msgid "Terminal does not support color"
+msgstr "Uçbirim renk(li çıktıyı) desteklemiyor"
+
+#: LYMessages.c:614
+#, c-format
+msgid "Your '%s' terminal does not support color."
+msgstr "'%s' uçbiriminiz, renk(li çıktıyı) desteklemiyor."
+
+#: LYMessages.c:615
+msgid "Access to dot files is disabled!"
+msgstr "Nokta dosyalara erişim devre dışı!"
+
+#. #define UA_NO_LYNX_WARNING
+#: LYMessages.c:617
+msgid "User-Agent string does not contain \"Lynx\" or \"L_y_n_x\""
+msgstr "Kullanıcı Ajanı dizgesi \"Lynx\" ya da \"L_y_n_x\" içermiyor"
+
+#. #define UA_PLEASE_USE_LYNX
+#: LYMessages.c:619
+msgid "Use \"L_y_n_x\" or \"Lynx\" in User-Agent, or it looks like intentional deception!"
+msgstr "Kullanıcı Ajanı'nda \"L_y_n_x\" ya da \"Lynx\" kullanın, değilse kasıtlı aldatmacaya benziyor!"
+
+#. #define UA_CHANGE_DISABLED
+#: LYMessages.c:621
+msgid "Changing of the User-Agent string is disabled!"
+msgstr "Kullanıcı Ajan dizgesinin değiştirilmesi devre dışı!"
+
+#. #define CHANGE_OF_SETTING_DISALLOWED
+#: LYMessages.c:623
+msgid "You are not allowed to change this setting."
+msgstr "Bu ayarı değiştirmenize izin verilmiyor."
+
+#: LYMessages.c:624
+msgid "Saving Options..."
+msgstr "Seçenekler Kaydediliyor..."
+
+#: LYMessages.c:625
+msgid "Options saved!"
+msgstr "Seçenekler kaydedildi!"
+
+#: LYMessages.c:626
+msgid "Unable to save Options!"
+msgstr "Seçenekler kaydedilemedi!"
+
+#: LYMessages.c:627
+msgid " 'r' to return to Lynx "
+msgstr " Lynx'e dönmek için 'r' "
+
+#: LYMessages.c:628
+msgid " '>' to save, or 'r' to return to Lynx "
+msgstr " kaydetmek için '>', ya da Lynx'e dönmek için 'r' "
+
+#. #define ANY_KEY_CHANGE_RET_ACCEPT
+#: LYMessages.c:630
+msgid "Hit any key to change value; RETURN to accept."
+msgstr "Değeri değiştirmek için herhangi bir tuşa, kabul etmek için RETURNe basınız."
+
+#: LYMessages.c:631
+msgid "Error uncompressing temporary file!"
+msgstr "Geçici dosyanın genişletilmesinde hata!"
+
+#: LYMessages.c:632
+msgid "Unsupported URL scheme!"
+msgstr "Desteklenmeyen URL şeması!"
+
+#: LYMessages.c:633
+msgid "Unsupported data: URL! Use SHOWINFO, for now."
+msgstr "Desteklenmeyen veri: URL! Şimdilik SHOWINFO (bilgi-göster) kullanınız."
+
+#: LYMessages.c:634
+#, c-format
+msgid "Redirection limit of %d URL's reached."
+msgstr "Yeniden yönlendirme limiti olan %d URL'ye erişildi."
+
+#: LYMessages.c:635
+msgid "Illegal redirection URL received from server!"
+msgstr "Sunucudan kuraldışı yeniden yönlendirme URL'si alındı!"
+
+#. #define SERVER_ASKED_FOR_REDIRECTION
+#: LYMessages.c:637
+#, c-format
+msgid "Server asked for %d redirection of POST content to"
+msgstr "Sunucu, POST içeriğinin şuraya %d yeniden yönlendirilmesini istedi"
+
+#: LYMessages.c:640
+msgid "P)roceed, use G)ET or C)ancel "
+msgstr "Devam et(P), Al(G) ya da Vazgeç(C) "
+
+#: LYMessages.c:641
+msgid "P)roceed, or C)ancel "
+msgstr "Devam et(P) ya da Vazgeç(C) "
+
+#. #define ADVANCED_POST_GET_REDIRECT
+#: LYMessages.c:643
+msgid "Redirection of POST content. P)roceed, see U)RL, use G)ET or C)ancel"
+msgstr "POST içeriğinin yeniden yönlendirilmesi. Devam et(P), (U)RL'ye bak, Al(G) ya da Vazgeç(C)"
+
+#. #define ADVANCED_POST_REDIRECT
+#: LYMessages.c:645
+msgid "Redirection of POST content. P)roceed, see U)RL, or C)ancel"
+msgstr "POST içeriğinin yeniden yönlendirilmesi. Devam et(P), (U)RL'ye bak, ya da Vazgeç(C)"
+
+#. #define CONFIRM_POST_RESUBMISSION
+#: LYMessages.c:647
+msgid "Document from Form with POST content. Resubmit?"
+msgstr "POST içerikli formdan belge. Yeniden gönderilsin mi?"
+
+#. #define CONFIRM_POST_RESUBMISSION_TO
+#: LYMessages.c:649
+#, c-format
+msgid "Resubmit POST content to %s ?"
+msgstr "POST içeriği %s'e yeniden gönderilsin mi?"
+
+#. #define CONFIRM_POST_LIST_RELOAD
+#: LYMessages.c:651
+#, c-format
+msgid "List from document with POST data. Reload %s ?"
+msgstr "POST verili belgeden liste. %s yeniden yüklensin mi?"
+
+#. #define CONFIRM_POST_DOC_HEAD
+#: LYMessages.c:653
+msgid "Document from POST action, HEAD may not be understood. Proceed?"
+msgstr "POST eyleminden belge, BAŞLIK anlaşılmamış olabilir. Devam edilsin mi?"
+
+#. #define CONFIRM_POST_LINK_HEAD
+#: LYMessages.c:655
+msgid "Form submit action is POST, HEAD may not be understood. Proceed?"
+msgstr "Form gönderme eylemi POST, KAFA anlaşılmamış olabilir. Devam edilsin mi?"
+
+#: LYMessages.c:656
+msgid "Proceed without a username and password?"
+msgstr "Kullanıcı adı ve parola olmaksızın devam edecek misiniz?"
+
+#: LYMessages.c:657
+#, c-format
+msgid "Proceed (%s)?"
+msgstr "Devam edilsin mi (%s)?"
+
+#: LYMessages.c:658
+msgid "Cannot POST to this host."
+msgstr "Bu makinaya POST yapılamıyor."
+
+#: LYMessages.c:659
+msgid "POST not supported for this URL - ignoring POST data!"
+msgstr "Bu URL için POST desteklenmiyor - POST verisi yok sayılıyor!"
+
+#: LYMessages.c:660
+msgid "Discarding POST data..."
+msgstr "POST verisi siliniyor..."
+
+#: LYMessages.c:661
+msgid "Document will not be reloaded!"
+msgstr "Belge geri yüklenmeyecek!"
+
+#: LYMessages.c:662
+msgid "Location: "
+msgstr "Konum: "
+
+#: LYMessages.c:663
+#, c-format
+msgid "'%s' not found!"
+msgstr "'%s' bulunamadı!"
+
+#: LYMessages.c:664
+msgid "Default Bookmark File"
+msgstr "Öntanımlı Yer İmi Dosyası"
+
+#: LYMessages.c:665
+msgid "Screen too small! (8x35 min)"
+msgstr "Ekran çok küçük! (en az 8x35)"
+
+#: LYMessages.c:666
+msgid "Select destination or ^G to Cancel: "
+msgstr "Varış noktasını seçiniz ya da iptal etmek için ^G: "
+
+#. #define MULTIBOOKMARKS_SELECT
+#: LYMessages.c:668
+msgid "Select subbookmark, '=' for menu, or ^G to cancel: "
+msgstr "Alt yer imini seçiniz, menü için '=' ya da iptal etmek için ^G: "
+
+#. #define MULTIBOOKMARKS_SELF
+#: LYMessages.c:670
+msgid "Reproduce L)ink in this bookmark file or C)ancel? (l,c): "
+msgstr "Bu yer imi dosyasındaki bağ(L)antı çoğaltılsın mı, iptal(C) mi edilsin? (l,c): "
+
+#: LYMessages.c:671
+msgid "Multiple bookmark support is not available."
+msgstr "Çok sayıda yer imi desteği mevcut değil..."
+
+#: LYMessages.c:672
+#, c-format
+msgid " Select Bookmark (screen %d of %d)"
+msgstr " Yer imini seçiniz (%2$d ekranın %1$d.'si)"
+
+#: LYMessages.c:673
+msgid " Select Bookmark"
+msgstr " Yer İmini Seçiniz"
+
+#. #define MULTIBOOKMARKS_EHEAD_MASK
+#: LYMessages.c:675
+#, c-format
+msgid "Editing Bookmark DESCRIPTION and FILEPATH (%d of 2)"
+msgstr "Yer İmi AÇIKLAMASI ve DOSYAYOLU düzenleniyor (2'nin %d'i)"
+
+#. #define MULTIBOOKMARKS_EHEAD
+#: LYMessages.c:677
+msgid " Editing Bookmark DESCRIPTION and FILEPATH"
+msgstr " Yer İmi AÇIKLAMASI ve DOSYAYOLU düzenleniyor"
+
+#: LYMessages.c:678
+msgid "Letter: "
+msgstr "Mektup: "
+
+#. #define USE_PATH_OFF_HOME
+#: LYMessages.c:681
+msgid "Use a filepath off your login directory in SHELL syntax!"
+msgstr "KABUK sözdiziminde giriş dizininiz dışında bir dosyayolu kullanın!"
+
+#: LYMessages.c:683
+msgid "Use a filepath off your home directory!"
+msgstr "Ana dizininiz dışında bir dosyayolu kullanın!"
+
+#. #define MAXLINKS_REACHED
+#: LYMessages.c:686
+msgid "Maximum links per page exceeded! Use half-page or two-line scrolling."
+msgstr "Sayfa başına maksimum link aşıldı! Yarım sayfa ya da iki satırlık kaydırma kullanın."
+
+#: LYMessages.c:687
+msgid "No previously visited links available!"
+msgstr "Önceden uğranmış link mevcut değil!"
+
+#: LYMessages.c:688
+msgid "Memory exhausted! Program aborted!"
+msgstr "Bellek tükendi! Program yarıda kesildi!"
+
+#: LYMessages.c:689
+msgid "Memory exhausted! Aborting..."
+msgstr "Bellek tükendi! Yarıda kesiliyor..."
+
+#: LYMessages.c:690
+msgid "Not enough memory!"
+msgstr "Bellek yetersiz!"
+
+#: LYMessages.c:691
+msgid "Directory/File Manager not available"
+msgstr "Dizin/Dosya Yöneticisi mevcut değil"
+
+#: LYMessages.c:692
+msgid "Location URL is not absolute."
+msgstr "Konum URL'si mutlak deÄŸil..."
+
+#: LYMessages.c:693
+msgid "Refresh URL is not absolute."
+msgstr "Yenile URL'si mutlak deÄŸil..."
+
+#. #define SENDING_MESSAGE_WITH_BODY_TO
+#: LYMessages.c:695
+msgid ""
+"You are sending a message with body to:\n"
+" "
+msgstr ""
+"Şuraya gövdeli bir mesaj gönderiyorsunuz: \n"
+" "
+
+#: LYMessages.c:696
+msgid ""
+"You are sending a comment to:\n"
+" "
+msgstr ""
+"Şuraya bir yorum gönderiyorsunuz:\n"
+" "
+
+#: LYMessages.c:697
+msgid ""
+"\n"
+" With copy to:\n"
+" "
+msgstr ""
+"\n"
+"Åžuraya kopya ile:\n"
+" "
+
+#: LYMessages.c:698
+msgid ""
+"\n"
+" With copies to:\n"
+" "
+msgstr ""
+"\n"
+" Åžuraya kopyalar ile:\n"
+" "
+
+#. #define CTRL_G_TO_CANCEL_SEND
+#: LYMessages.c:700
+msgid ""
+"\n"
+"\n"
+"Use Ctrl-G to cancel if you do not want to send a message\n"
+msgstr ""
+"\n"
+"\n"
+"Eğer bir mesaj göndermek istemiyorsanız iptal etmek için Ctrl-G kullanın\n"
+
+#. #define ENTER_NAME_OR_BLANK
+#: LYMessages.c:702
+msgid ""
+"\n"
+" Please enter your name, or leave it blank to remain anonymous\n"
+msgstr ""
+"\n"
+" Lütfen ya adınızı girin, ya da anonim kalmak için boş bırakın\n"
+
+#. #define ENTER_MAIL_ADDRESS_OR_OTHER
+#: LYMessages.c:704
+msgid ""
+"\n"
+" Please enter a mail address or some other\n"
+msgstr ""
+"\n"
+" Lütfen bir e-posta adresi ya da benzerini girin\n"
+
+#. #define MEANS_TO_CONTACT_FOR_RESPONSE
+#: LYMessages.c:706
+msgid " means to contact you, if you desire a response.\n"
+msgstr " eğer bir yanıt arzularsanız, size ulaşma yolları.\n"
+
+#: LYMessages.c:707
+msgid ""
+"\n"
+" Please enter a subject line.\n"
+msgstr ""
+"\n"
+" Lütfen bir konu satırı giriniz. \n"
+
+#. #define ENTER_ADDRESS_FOR_CC
+#: LYMessages.c:709
+msgid ""
+"\n"
+" Enter a mail address for a CC of your message.\n"
+msgstr ""
+"\n"
+" Mesajınızın KK'sı için lütfen bir e-posta adresi giriniz.\n"
+
+#: LYMessages.c:710
+msgid " (Leave blank if you don't want a copy.)\n"
+msgstr " (Bir kopya istemiyorsanız boş bırakınız.)\n"
+
+#: LYMessages.c:711
+msgid ""
+"\n"
+" Please review the message body:\n"
+"\n"
+msgstr ""
+"\n"
+" Lütfen mesaj gövdesini gözden geçiriniz:\n"
+"\n"
+
+#: LYMessages.c:712
+msgid ""
+"\n"
+"Press RETURN to continue: "
+msgstr ""
+"\n"
+"Devam etmek için RETURN'e basınız: "
+
+#: LYMessages.c:713
+msgid ""
+"\n"
+"Press RETURN to clean up: "
+msgstr ""
+"\n"
+"Temizlemek için RETURN'e basınız: "
+
+#: LYMessages.c:714
+msgid " Use Control-U to erase the default.\n"
+msgstr " Öntanımlıyı silmek için Control-U kullanınız.\n"
+
+#: LYMessages.c:715
+msgid ""
+"\n"
+" Please enter your message below."
+msgstr ""
+"\n"
+" Lütfen mesajınızı aşağıya giriniz."
+
+#. #define ENTER_PERIOD_WHEN_DONE_A
+#: LYMessages.c:717 src/LYNews.c:360
+msgid ""
+"\n"
+" When you are done, press enter and put a single period (.)"
+msgstr ""
+"\n"
+" Bitirdiğinizde enter'a basıp, yeni satıra tek bir nokta (.)"
+
+#. #define ENTER_PERIOD_WHEN_DONE_B
+#: LYMessages.c:719 src/LYNews.c:361
+msgid ""
+"\n"
+" on a line and press enter again."
+msgstr ""
+"\n"
+" koyup tekrar enter'a basınız."
+
+#. Cookies messages
+#. #define ADVANCED_COOKIE_CONFIRMATION
+#: LYMessages.c:723
+#, c-format
+msgid "%s cookie: %.*s=%.*s Allow? (Y/N/Always/neVer)"
+msgstr "%s çerez: %.*s=%.*s İzin verir misiniz? (E/H/Daima/Asla)"
+
+#. #define INVALID_COOKIE_DOMAIN_CONFIRMATION
+#: LYMessages.c:725
+#, c-format
+msgid "Accept invalid cookie domain=%s for '%s'?"
+msgstr "'%2$s' için geçersiz çerez yöresi=%1$s kabul edilsin mi?"
+
+#. #define INVALID_COOKIE_PATH_CONFIRMATION
+#: LYMessages.c:727
+#, c-format
+msgid "Accept invalid cookie path=%s as a prefix of '%s'?"
+msgstr "'%2$s'in öneki olarak geçersiz çerez yolu=%1$s kabul edilsin mi?"
+
+#: LYMessages.c:728
+msgid "Allowing this cookie."
+msgstr "Bu çereze izin veriliyor."
+
+#: LYMessages.c:729
+msgid "Rejecting this cookie."
+msgstr "Bu çerez reddediliyor."
+
+#: LYMessages.c:730
+msgid "The Cookie Jar is empty."
+msgstr "Çerez kavanozu boş..."
+
+#: LYMessages.c:731
+msgid "The Cache Jar is empty."
+msgstr "Önbellek Kavanozu boş."
+
+#. #define ACTIVATE_TO_GOBBLE
+#: LYMessages.c:733
+msgid "Activate links to gobble up cookies or entire domains,"
+msgstr "Çerezleri veya bütün etki alanlarını silip süpürmek için bağlantıları etkinleştirin,"
+
+#: LYMessages.c:734
+msgid "or to change a domain's 'allow' setting."
+msgstr "değiştirmek için linkleri etkinleştiriniz."
+
+#: LYMessages.c:735
+msgid "(Cookies never allowed.)"
+msgstr "(Çerezlere asla izin verilmiyor.)"
+
+#: LYMessages.c:736
+msgid "(Cookies always allowed.)"
+msgstr "(Çerezlere her zaman izin veriliyor.)"
+
+#: LYMessages.c:737
+msgid "(Cookies allowed via prompt.)"
+msgstr "(Çerezlere bilgi istemi aracılığıyla izin veriliyor.)"
+
+#: LYMessages.c:738
+msgid "(Persistent Cookies.)"
+msgstr "(Kalıcı çerezler.)"
+
+#: LYMessages.c:739
+msgid "(No title.)"
+msgstr "(Başlık yok.)"
+
+#: LYMessages.c:740
+msgid "(No name.)"
+msgstr "(Ä°sim yok.)"
+
+#: LYMessages.c:741
+msgid "(No value.)"
+msgstr "(DeÄŸer yok.)"
+
+#: LYMessages.c:742 src/LYOptions.c:2482
+msgid "None"
+msgstr "Hiçbiri"
+
+#: LYMessages.c:743
+msgid "(End of session.)"
+msgstr "(Oturum sonu.)"
+
+#: LYMessages.c:744
+msgid "Delete this cookie?"
+msgstr "Bu çerez silinsin mi?"
+
+#: LYMessages.c:745
+msgid "The cookie has been eaten!"
+msgstr "Çerez yendi!"
+
+#: LYMessages.c:746
+msgid "Delete this empty domain?"
+msgstr "Bu boş yöre silinsin mi?"
+
+#: LYMessages.c:747
+msgid "The domain has been eaten!"
+msgstr "Yöre yendi!"
+
+#. #define DELETE_COOKIES_SET_ALLOW_OR_CANCEL
+#: LYMessages.c:749
+msgid "D)elete domain's cookies, set allow A)lways/P)rompt/neV)er, or C)ancel? "
+msgstr "Yörenin çerezlerini silin(D), izin verin her zaman(A)/sor(P)/asla(V), ya da vazgeç(C)? "
+
+#. #define DELETE_DOMAIN_SET_ALLOW_OR_CANCEL
+#: LYMessages.c:751
+msgid "D)elete domain, set allow A)lways/P)rompt/neV)er, or C)ancel? "
+msgstr "Yöreyi silin(D), izin verin her zaman(A)/sor(P)/asla(V), ya da vazgeç(C)? "
+
+#: LYMessages.c:752
+msgid "All cookies in the domain have been eaten!"
+msgstr "Yöredeki tüm çerezler yendi!"
+
+#: LYMessages.c:753
+#, c-format
+msgid "'A'lways allowing from domain '%s'."
+msgstr "'%s' yöresine her zaman(A) izin veriliyor."
+
+#: LYMessages.c:754
+#, c-format
+msgid "ne'V'er allowing from domain '%s'."
+msgstr "'%s' yöresine asla(V) izin verilmiyor."
+
+#: LYMessages.c:755
+#, c-format
+msgid "'P'rompting to allow from domain '%s'."
+msgstr "'%s' yöresine izin vermek için soruluyor(P)."
+
+#: LYMessages.c:756
+msgid "Delete all cookies in this domain?"
+msgstr "Bu yöredeki tüm çerezler silinsin mi?"
+
+#: LYMessages.c:757
+msgid "All of the cookies in the jar have been eaten!"
+msgstr "Kavanozdaki tüm çerezler yendi!"
+
+#: LYMessages.c:759
+msgid "Port 19 not permitted in URLs."
+msgstr "Port 19'a URL'lerde izin verilmiyor."
+
+#: LYMessages.c:760
+msgid "Port 25 not permitted in URLs."
+msgstr "Port 25'e URL'lerde izin verilmiyor."
+
+#: LYMessages.c:761
+#, c-format
+msgid "Port %lu not permitted in URLs."
+msgstr "Port %lu'e URL'lerde izin verilmiyor."
+
+#: LYMessages.c:762
+msgid "URL has a bad port field."
+msgstr "URL'de bozuk port alanı var."
+
+#: LYMessages.c:763
+msgid "Maximum nesting of HTML elements exceeded."
+msgstr "HTML bileşenlerinin maksimum içiçe geçme sınırı aşıldı."
+
+#: LYMessages.c:764
+msgid "Bad partial reference! Stripping lead dots."
+msgstr "Bozuk kısmi referans! Yol gösterici noktalar soyuluyor."
+
+#: LYMessages.c:765
+msgid "Trace Log open failed. Trace off!"
+msgstr "İzleme Kütüğünün açılması başarısız. İzleme kapatıldı!"
+
+#: LYMessages.c:766
+msgid "Lynx Trace Log"
+msgstr "Lynx İzleme Kütüğü"
+
+#: LYMessages.c:767
+msgid "No trace log has been started for this session."
+msgstr "Bu oturum için hiç izleme kütüğü başlatılmadı."
+
+#. #define MAX_TEMPCOUNT_REACHED
+#: LYMessages.c:769
+msgid "The maximum temporary file count has been reached!"
+msgstr "Maksimum geçici dosya sayısına ulaşıldı!"
+
+#. #define FORM_VALUE_TOO_LONG
+#: LYMessages.c:771
+msgid "Form field value exceeds buffer length! Trim the tail."
+msgstr "Form alanı değeri tampon uzunluğunu aşmakta! Kuyruğunu kırpın."
+
+#. #define FORM_TAIL_COMBINED_WITH_HEAD
+#: LYMessages.c:773
+msgid "Modified tail combined with head of form field value."
+msgstr "Form alanı değeri başlığıyla birleşik değiştirilmiş kuyruk."
+
+#. HTFile.c
+#: LYMessages.c:776
+msgid "Directory"
+msgstr "Dizin"
+
+#: LYMessages.c:777
+msgid "Directory browsing is not allowed."
+msgstr "Dizine göz atmaya izin verilmiyor."
+
+#: LYMessages.c:778
+msgid "Selective access is not enabled for this directory"
+msgstr "Bu dizin için seçici erişim etkinleştirilmemiş"
+
+#: LYMessages.c:779
+msgid "Multiformat: directory scan failed."
+msgstr "Çokbiçim: dizin taraması başarısız."
+
+#: LYMessages.c:780
+msgid "This directory is not readable."
+msgstr "Bu dizin okunabilir (durumda) deÄŸil."
+
+#: LYMessages.c:781
+msgid "Can't access requested file."
+msgstr "Ä°stenen dosyaya eriÅŸilemiyor."
+
+#: LYMessages.c:782
+msgid "Could not find suitable representation for transmission."
+msgstr "İletim için uygun temsil (tarzı) bulunamadı."
+
+#: LYMessages.c:783
+msgid "Could not open file for decompression!"
+msgstr "Genişletmek üzere dosya açılamadı!"
+
+#: LYMessages.c:784
+msgid "Files:"
+msgstr "Dosyalar:"
+
+#: LYMessages.c:785
+msgid "Subdirectories:"
+msgstr "Altdizinler:"
+
+#: LYMessages.c:786
+msgid " directory"
+msgstr " dizin"
+
+#: LYMessages.c:787
+msgid "Up to "
+msgstr "Üst sınır "
+
+#: LYMessages.c:788
+msgid "Current directory is "
+msgstr "Mevcut dizin "
+
+#. HTFTP.c
+#: LYMessages.c:791
+msgid "Symbolic Link"
+msgstr "Simgesel Link"
+
+#. HTGopher.c
+#: LYMessages.c:794
+msgid "No response from server!"
+msgstr "Sunucudan yanıt yok!"
+
+#: LYMessages.c:795
+msgid "CSO index"
+msgstr "CSO indeksi"
+
+#: LYMessages.c:796
+msgid ""
+"\n"
+"This is a searchable index of a CSO database.\n"
+msgstr ""
+"\n"
+"Bu, CSO veritabanının aranabilir bir indeksidir.\n"
+
+#: LYMessages.c:797
+msgid "CSO Search Results"
+msgstr "CSO Arama Sonuçları"
+
+#: LYMessages.c:798
+#, c-format
+msgid "Seek fail on %s\n"
+msgstr "Arama %s'de başarısız\n"
+
+#: LYMessages.c:799
+msgid ""
+"\n"
+"Press the 's' key and enter search keywords.\n"
+msgstr ""
+"\n"
+"'s' tuşuna basıp, anahtar sözcükleri giriniz.\n"
+
+#: LYMessages.c:800
+msgid ""
+"\n"
+"This is a searchable Gopher index.\n"
+msgstr ""
+"\n"
+"Bu, arama yapılabilen bir Gopher indeksidir.\n"
+
+#: LYMessages.c:801
+msgid "Gopher index"
+msgstr "Gopher indeksi"
+
+#: LYMessages.c:802
+msgid "Gopher Menu"
+msgstr "Gopher Menüsü"
+
+#: LYMessages.c:803
+msgid " Search Results"
+msgstr " Arama Sonuçları"
+
+#: LYMessages.c:804
+msgid "Sending CSO/PH request."
+msgstr "CSO/PH istemi gönderiliyor."
+
+#: LYMessages.c:805
+msgid "Sending Gopher request."
+msgstr "Gopher istemi gönderiliyor."
+
+#: LYMessages.c:806
+msgid "CSO/PH request sent; waiting for response."
+msgstr "CSO/PH istemi gönderildi; yanıt bekleniyor."
+
+#: LYMessages.c:807
+msgid "Gopher request sent; waiting for response."
+msgstr "Gopher istemi gönderildi; yanıt bekleniyor."
+
+#: LYMessages.c:808
+msgid ""
+"\n"
+"Please enter search keywords.\n"
+msgstr ""
+"\n"
+"Lütfen arama için anahtar sözcükleri giriniz.\n"
+
+#: LYMessages.c:809
+msgid ""
+"\n"
+"The keywords that you enter will allow you to search on a"
+msgstr ""
+"\n"
+"Girdiğiniz anahtar sözcükler, veri tabanında bir kişi adının"
+
+#: LYMessages.c:810
+msgid " person's name in the database.\n"
+msgstr " aranmasını sağlayacak.\n"
+
+#. HTNews.c
+#: LYMessages.c:813
+msgid "Connection closed ???"
+msgstr "Bağlantı kapatıldı mı ???"
+
+#: LYMessages.c:814
+msgid "Cannot open temporary file for news POST."
+msgstr "Haber POSTu için geçici dosya açılamıyor."
+
+#: LYMessages.c:815
+msgid "This client does not contain support for posting to news with SSL."
+msgstr "Bu istemci SSL'li habere postalamak için destek içermiyor."
+
+#. HTStyle.c
+#: LYMessages.c:818
+#, c-format
+msgid "Style %d `%s' SGML:%s. Font %s %.1f point.\n"
+msgstr "Stil %d `%s' SGML:%s. Yazıtipi %s %.1f boyut.\n"
+
+#: LYMessages.c:820
+#, c-format
+msgid "\tAlign=%d, %d tabs. (%.0f before, %.0f after)\n"
+msgstr "\tYaslama=%d, %d sekme. (%.0f önce, %.0f sonra)\n"
+
+#: LYMessages.c:821
+#, c-format
+msgid "\t\tTab kind=%d at %.0f\n"
+msgstr "\t\tSekme türü=%d konum %.0f\n"
+
+#. HTTP.c
+#: LYMessages.c:824
+msgid "Can't proceed without a username and password."
+msgstr "Kullanıcı adı ve parola olmadan devam edilemez."
+
+#: LYMessages.c:825
+msgid "Can't retry with authorization! Contact the server's WebMaster."
+msgstr "Yetkilendirme yeniden denenemez! Sunucunun site yöneticisiyle temas kurun."
+
+#: LYMessages.c:826
+msgid "Can't retry with proxy authorization! Contact the server's WebMaster."
+msgstr "Vekil(proxy) yetkilendirmesi yeniden denenemez! Sunucunun site yöneticisiyle temas kurun."
+
+#: LYMessages.c:827
+msgid "Retrying with proxy authorization information."
+msgstr "Vekil(proxy) yetkilendirme bilgisiyle yeniden deneniyor."
+
+#: LYMessages.c:828
+#, c-format
+msgid "SSL error:%s-Continue?"
+msgstr "SSL hatası:%s-Devam edilsin mi?"
+
+#. HTWAIS.c
+#: LYMessages.c:831
+msgid "HTWAIS: Return message too large."
+msgstr "HTWAIS: Dönüş mesajı çok büyük."
+
+#: LYMessages.c:832
+msgid "Enter WAIS query: "
+msgstr "WAIS sorgusu giriniz: "
+
+#. Miscellaneous status
+#: LYMessages.c:835
+msgid "Retrying as HTTP0 request."
+msgstr "HTTP0 istemi olarak yeniden deneniyor."
+
+#: LYMessages.c:836
+#, c-format
+msgid "Transferred %d bytes"
+msgstr "%d bayt aktarıldı"
+
+#: LYMessages.c:837
+msgid "Data transfer complete"
+msgstr "Veri aktarımı tamamlandı"
+
+#: LYMessages.c:838
+#, c-format
+msgid "Error processing line %d of %s\n"
+msgstr "%2$s satırdan %1$d.'sinin işlenmesinde hata\n"
+
+#. Lynx internal page titles
+#: LYMessages.c:841
+msgid "Address List Page"
+msgstr "Adres Listesi Sayfası"
+
+#: LYMessages.c:842
+msgid "Bookmark file"
+msgstr "Yer imi dosyası"
+
+#: LYMessages.c:843
+msgid "Configuration Definitions"
+msgstr "Ayar Tanımları"
+
+#: LYMessages.c:844
+msgid "Cookie Jar"
+msgstr "Çerez kavanozu"
+
+#: LYMessages.c:845
+msgid "Current Edit-Key Map"
+msgstr "Mevcut Düzenleme-Tuş Eşlemi"
+
+#: LYMessages.c:846
+msgid "Current Key Map"
+msgstr "Mevcut TuÅŸ EÅŸlemi"
+
+#: LYMessages.c:847
+msgid "File Management Options"
+msgstr "Dosya Yönetim Seçenekleri"
+
+#: LYMessages.c:848
+msgid "Download Options"
+msgstr "İndirme Seçenekleri"
+
+#: LYMessages.c:849
+msgid "History Page"
+msgstr "Tarihçe Sayfası"
+
+#: LYMessages.c:850
+msgid "Cache Jar"
+msgstr "Önbellek Kavanozu"
+
+#: LYMessages.c:851
+msgid "List Page"
+msgstr "Liste Sayfası"
+
+#: LYMessages.c:852
+msgid "Lynx.cfg Information"
+msgstr "Lynx.cfg Bilgileri"
+
+#: LYMessages.c:853
+msgid "Converted Mosaic Hotlist"
+msgstr "Dönüştürülmüş Mosaic Sıcaklistesi"
+
+#: LYMessages.c:854
+msgid "Options Menu"
+msgstr "Seçenekler Menüsü"
+
+#: LYMessages.c:855
+msgid "File Permission Options"
+msgstr "Dosya İzin Seçenekleri"
+
+#: LYMessages.c:856
+msgid "Printing Options"
+msgstr "Yazdırma Seçenekleri"
+
+#: LYMessages.c:857
+msgid "Information about the current document"
+msgstr "Mevcut dosya bilgileri"
+
+#: LYMessages.c:858
+msgid "Your recent statusline messages"
+msgstr "Son durumsatırı mesajlarınız"
+
+#: LYMessages.c:859
+msgid "Upload Options"
+msgstr "Yükleme Seçenekleri"
+
+#: LYMessages.c:860
+msgid "Visited Links Page"
+msgstr "Uğranmış Linkler Sayfası"
+
+#. CONFIG_DEF_TITLE subtitles
+#: LYMessages.c:863
+msgid "See also"
+msgstr "Ayrıca bakınız"
+
+#: LYMessages.c:864
+msgid "your"
+msgstr "sizin"
+
+#: LYMessages.c:865
+msgid "for runtime options"
+msgstr "yürütüm süresi seçenekleri için"
+
+#: LYMessages.c:866
+msgid "compile time options"
+msgstr "derleme süresi seçenekleri"
+
+#: LYMessages.c:867
+msgid "color-style configuration"
+msgstr "renk stili ayarlama"
+
+#: LYMessages.c:868
+msgid "latest release"
+msgstr "son dağıtım"
+
+#: LYMessages.c:869
+msgid "pre-release version"
+msgstr "dağıtım öncesi sürüm"
+
+#: LYMessages.c:870
+msgid "development version"
+msgstr "geliştirme sürümü"
+
+#. #define AUTOCONF_CONFIG_CACHE
+#: LYMessages.c:872
+msgid ""
+"The following data were derived during the automatic configuration/build\n"
+"process of this copy of Lynx. When reporting a bug, please include a copy\n"
+"of this page."
+msgstr ""
+"Aşağıdaki veri, Lynx'in bu kopyasının otomatik ayarlanma/yapılandırma süreci\n"
+"sırasında türetilmiştir. Yazılım hatası bildirirken, lütfen bu sayfanın bir\n"
+"kopyasını da dahil ediniz."
+
+#. #define AUTOCONF_LYNXCFG_H
+#: LYMessages.c:876
+msgid ""
+"The following data were used as automatically-configured compile-time\n"
+"definitions when this copy of Lynx was built."
+msgstr ""
+"Aşağıdaki veri, Lynx'in bu kopyası yapılandırılırken otomatik-ayarlanmış\n"
+"derleme süresi tanımları olarak kullanılmıştır."
+
+#. #define DIRED_NOVICELINE
+#: LYMessages.c:881
+msgid " C)reate D)ownload E)dit F)ull menu M)odify R)emove T)ag U)pload \n"
+msgstr " Oluştur(C) İndir(D) Düzenle(E) Tam menü(F) Değiştir(M) Çıkart(R) İşaretle(T) Yükle(U) \n"
+
+#: LYMessages.c:882
+msgid "Failed to obtain status of current link!"
+msgstr "Mevcut linkin durumu elde edilemedi!"
+
+#. #define INVALID_PERMIT_URL
+#: LYMessages.c:885
+msgid "Special URL only valid from current File Permission menu!"
+msgstr "Özel URL yalnızca güncel Dosya İzin menüsünden geçerlidir!"
+
+#: LYMessages.c:889
+msgid "External support is currently disabled."
+msgstr "Harici destek halen devre dışı..."
+
+#. new with 2.8.4dev.21
+#: LYMessages.c:893
+msgid "Changing working-directory is currently disabled."
+msgstr "Çalışma dizinini değiştirme şu an devre dışı."
+
+#: LYMessages.c:894
+msgid "Linewrap OFF!"
+msgstr "Satırsarma KAPALI!"
+
+#: LYMessages.c:895
+msgid "Linewrap ON!"
+msgstr "Satırsarma AÇIK!"
+
+#: LYMessages.c:896
+msgid "Parsing nested-tables toggled OFF! Reloading..."
+msgstr "İçice geçmiş-tablo ayrıştırma KAPATILDI! Yeniden yükleniyor..."
+
+#: LYMessages.c:897
+msgid "Parsing nested-tables toggled ON! Reloading..."
+msgstr "İçice geçmiş-tablo ayrıştırma AÇILDI! Yeniden yükleniyor..."
+
+#: LYMessages.c:898
+msgid "Shifting is disabled while line-wrap is in effect"
+msgstr "Satır-sarma etkinken kaydırma (shifting) devre dışıdır"
+
+#: LYMessages.c:899
+msgid "Trace not supported"
+msgstr "Ä°z(leme) desteklenmiyor"
+
+#: LYMessages.c:819
+#, c-format
+msgid "\tIndents: first=%.0f others=%.0f, Height=%.1f Desc=%.1f\n"
+msgstr "\tGirinti: ilk satır=%.0f diğerleri=%.0f, Yükseklik=%.1f Alt çıkıntı=%.1f\n"
+
+#: WWW/Library/Implementation/HTAABrow.c:575
+#, c-format
+msgid "username for realm %s changed from %s to %s"
+msgstr "kullanıcı adı bölge %s için %s'den %s'e değişti"
+
+#: WWW/Library/Implementation/HTAABrow.c:591
+#, c-format
+msgid "password for realm %s user %s changed"
+msgstr "bölge %s kullanıcı %s için parola değişti"
+
+#: WWW/Library/Implementation/HTAABrow.c:703
+#, c-format
+msgid "Username for '%s' at %s '%s%s':"
+msgstr "'%s' kullanıcısı için %s'de '%s%s':"
+
+#: WWW/Library/Implementation/HTAABrow.c:976
+msgid "This client doesn't know how to compose proxy authorization information for scheme"
+msgstr "Bu istemci şema için vekil(proxy) yetkilendirme bilgisi oluşturmayı bilmiyor"
+
+#: WWW/Library/Implementation/HTAABrow.c:1053
+msgid "This client doesn't know how to compose authorization information for scheme"
+msgstr "Bu istemci şema için yetkilendirme bilgisi oluşturmayı bilmiyor"
+
+#: WWW/Library/Implementation/HTAABrow.c:1162
+#, c-format
+msgid "Invalid header '%s%s%s%s%s'"
+msgstr "Geçersiz başlık '%s%s%s%s%s'"
+
+#: WWW/Library/Implementation/HTAABrow.c:1266
+msgid "Proxy authorization required -- retrying"
+msgstr "Vekil(proxy) yetkilendirmesi gerekli -- yeniden deneniyor"
+
+#: WWW/Library/Implementation/HTAABrow.c:1322
+msgid "Access without authorization denied -- retrying"
+msgstr "Yetkilendirilmeden eriÅŸim reddedildi -- yeniden deneniyor"
+
+#: WWW/Library/Implementation/HTAccess.c:698
+msgid "Access forbidden by rule"
+msgstr "Erişim kuralla yasaklanmış"
+
+#: WWW/Library/Implementation/HTAccess.c:800
+msgid "Document with POST content not found in cache. Resubmit?"
+msgstr "Önbellekte POST içerikli belge bulunmadı. Yeniden gönderilsin mi?"
+
+#: WWW/Library/Implementation/HTAccess.c:953
+msgid "Loading failed, use a previous copy."
+msgstr "Yükleme başarısız, önceki bir kopyayı kullanın."
+
+#: WWW/Library/Implementation/HTAccess.c:1062 src/GridText.c:8939
+msgid "Loading incomplete."
+msgstr "Yükleme tamamlanmadı."
+
+#: WWW/Library/Implementation/HTAccess.c:1093
+#, c-format
+msgid "**** HTAccess: socket or file number returned by obsolete load routine!\n"
+msgstr "**** HTAcess: Yürürlükten kalkmış yük rutini tarafından soket ya da dosya numarası döndü!\n"
+
+#: WWW/Library/Implementation/HTAccess.c:1095
+#, c-format
+msgid "**** HTAccess: Internal software error. Please mail lynx-dev@nongnu.org!\n"
+msgstr "**** HTAcess: Dahili yazılım hatası. Lütfen lynx-dev@nongnu.org adresine bildiriniz!\n"
+
+#: WWW/Library/Implementation/HTAccess.c:1096
+#, c-format
+msgid "**** HTAccess: Status returned was: %d\n"
+msgstr "**** HTAccess: Dönen durum: %d\n"
+
+#.
+#. * hack: if we fail in HTAccess.c
+#. * avoid duplicating URL, oh.
+#.
+#: WWW/Library/Implementation/HTAccess.c:1102 src/LYMainLoop.c:8076
+msgid "Can't Access"
+msgstr "EriÅŸilemiyor"
+
+#: WWW/Library/Implementation/HTAccess.c:1110
+msgid "Unable to access document."
+msgstr "Belgeye eriÅŸilemiyor."
+
+#: WWW/Library/Implementation/HTFTP.c:870
+#, c-format
+msgid "Enter password for user %s@%s:"
+msgstr "%s@%s kullanıcısı için parola giriniz:"
+
+#: WWW/Library/Implementation/HTFTP.c:898
+msgid "Unable to connect to FTP host."
+msgstr "FTP makinasına bağlanılamadı."
+
+#: WWW/Library/Implementation/HTFTP.c:1137
+msgid "close master socket"
+msgstr "ana soketi kapatınız"
+
+#: WWW/Library/Implementation/HTFTP.c:1195
+msgid "socket for master socket"
+msgstr "ana soket için soket"
+
+#: WWW/Library/Implementation/HTFTP.c:2925
+msgid "Receiving FTP directory."
+msgstr "FTP dizini alınıyor."
+
+#: WWW/Library/Implementation/HTFTP.c:3063
+#, c-format
+msgid "Transferred %d bytes (%5d)"
+msgstr "%d bayt aktarıldı (%5d)"
+
+#: WWW/Library/Implementation/HTFTP.c:3421
+msgid "connect for data"
+msgstr "veri için bağlan"
+
+#: WWW/Library/Implementation/HTFTP.c:4098
+msgid "Receiving FTP file."
+msgstr "FTP dosyası alınıyor."
+
+#: WWW/Library/Implementation/HTFinger.c:274
+msgid "Could not set up finger connection."
+msgstr "Finger bağlantısı sağlanamıyor."
+
+#: WWW/Library/Implementation/HTFinger.c:321
+msgid "Could not load data (no sitename in finger URL)"
+msgstr "Veri yüklenemiyor (finger URL'sinde site adı yok)"
+
+#: WWW/Library/Implementation/HTFinger.c:325
+msgid "Invalid port number - will only use port 79!"
+msgstr "Geçersiz port no - yalnızca port 79 kullanılacak!"
+
+#: WWW/Library/Implementation/HTFinger.c:391
+msgid "Could not access finger host."
+msgstr "Finger makinasına erişilemedi."
+
+#: WWW/Library/Implementation/HTFinger.c:399
+msgid "No response from finger server."
+msgstr "Finger sunucusundan yanıt yok."
+
+#: WWW/Library/Implementation/HTNews.c:439
+#, c-format
+msgid "Username for news host '%s':"
+msgstr "'%s' adlı haber makinası için kullanıcı adı:"
+
+#: WWW/Library/Implementation/HTNews.c:492
+msgid "Change username?"
+msgstr "Kullanıcı adı değiştirilsin mi?"
+
+#: WWW/Library/Implementation/HTNews.c:496
+msgid "Username:"
+msgstr "Kullanıcı adı:"
+
+#: WWW/Library/Implementation/HTNews.c:521
+#, c-format
+msgid "Password for news host '%s':"
+msgstr "'%s' adlı haber makinası için parola:"
+
+#: WWW/Library/Implementation/HTNews.c:604
+msgid "Change password?"
+msgstr "Parola deÄŸiÅŸtirilsin mi?"
+
+#: WWW/Library/Implementation/HTNews.c:1725
+#, c-format
+msgid "No matches for: %s"
+msgstr "%s için eşleşme yok"
+
+#: WWW/Library/Implementation/HTNews.c:1775
+msgid ""
+"\n"
+"No articles in this group.\n"
+msgstr ""
+"\n"
+"Bu grupta hiç mesaj yok.\n"
+
+#: WWW/Library/Implementation/HTNews.c:1787
+msgid ""
+"\n"
+"No articles in this range.\n"
+msgstr ""
+"\n"
+"Bu erimde hiç mesaj yok.\n"
+
+#.
+#. * Set window title.
+#.
+#: WWW/Library/Implementation/HTNews.c:1800
+#, c-format
+msgid "%s, Articles %d-%d"
+msgstr "%s, %d-%d mesaj"
+
+#: WWW/Library/Implementation/HTNews.c:1823
+msgid "Earlier articles"
+msgstr "Önceki mesajlar"
+
+#: WWW/Library/Implementation/HTNews.c:1836
+#, c-format
+msgid ""
+"\n"
+"There are about %d articles currently available in %s, IDs as follows:\n"
+"\n"
+msgstr ""
+"\n"
+"Halen %2$s'de yaklaşık %1$d mesaj mevcut, kimlikler şu şekilde:\n"
+"\n"
+
+#: WWW/Library/Implementation/HTNews.c:1898
+msgid "All available articles in "
+msgstr "Tüm mevcut mesajlar "
+
+#: WWW/Library/Implementation/HTNews.c:2112
+msgid "Later articles"
+msgstr "Sonraki mesajlar"
+
+#: WWW/Library/Implementation/HTNews.c:2135
+msgid "Post to "
+msgstr "Kime Gönderilecek "
+
+#: WWW/Library/Implementation/HTNews.c:2356
+msgid "This client does not contain support for SNEWS URLs."
+msgstr "Bu istemci SNEWS URL'ler için destek içermiyor."
+
+#: WWW/Library/Implementation/HTNews.c:2565
+msgid "No target for raw text!"
+msgstr "Ham metin için hiç hedef yok!"
+
+#: WWW/Library/Implementation/HTNews.c:2595
+msgid "Connecting to NewsHost ..."
+msgstr "Haber makinasına bağlanılıyor ..."
+
+#: WWW/Library/Implementation/HTNews.c:2647
+#, c-format
+msgid "Could not access %s."
+msgstr "%s'e eriÅŸilemiyor."
+
+#: WWW/Library/Implementation/HTNews.c:2753
+#, c-format
+msgid "Can't read news info. News host %.20s responded: %.200s"
+msgstr "Haber bilgisi okunamıyor. %.20s adlı haber makinasının yanıtı: %.200s"
+
+#: WWW/Library/Implementation/HTNews.c:2757
+#, c-format
+msgid "Can't read news info, empty response from host %s"
+msgstr "Haber bilgisi okunamıyor, %s makinasından boş yanıt"
+
+#.
+#. * List available newsgroups. - FM
+#.
+#: WWW/Library/Implementation/HTNews.c:2961
+msgid "Reading list of available newsgroups."
+msgstr "Mevcut haber gruplarının listesi okunuyor."
+
+#: WWW/Library/Implementation/HTNews.c:2982
+msgid "Reading list of articles in newsgroup."
+msgstr "Haber grubundaki mesaj listesi okunuyor."
+
+#.
+#. * Get an article from a news group. - FM
+#.
+#: WWW/Library/Implementation/HTNews.c:2988
+msgid "Reading news article."
+msgstr "Haber mesajı okunuyor."
+
+#: WWW/Library/Implementation/HTNews.c:3018
+msgid "Sorry, could not load requested news."
+msgstr "Üzgünüm, istenen haber yüklenemedi."
+
+#: WWW/Library/Implementation/HTTCP.c:1339
+msgid "Address has invalid port"
+msgstr "Adres portu geçersiz"
+
+#: WWW/Library/Implementation/HTTCP.c:1410
+msgid "Address length looks invalid"
+msgstr "Adres uzunluğu geçersiz görünüyor"
+
+#: WWW/Library/Implementation/HTTCP.c:1868
+msgid "SOCKS5: no hostname found."
+msgstr "SOCKS5: ana bilgisayar adı bulunamadı."
+
+#: WWW/Library/Implementation/HTTCP.c:1874
+msgid "SOCKS5: hostname too long."
+msgstr "SOCKS5: ana bilgisayar adı çok uzun."
+
+#: WWW/Library/Implementation/HTTCP.c:1892
+#, c-format
+msgid "(for %s at %s) SOCKS5"
+msgstr "(%s'de %s için) SOCKS5"
+
+#: WWW/Library/Implementation/HTTCP.c:1919
+#: WWW/Library/Implementation/HTTCP.c:1936
+#, c-format
+msgid "Unable to locate remote host %s."
+msgstr "%s adlı karşı makina konumlandırılamıyor."
+
+#. Not HTProgress, so warning won't be overwritten immediately;
+#. * but not HTAlert, because typically there will be other
+#. * alerts from the callers. - kw
+#.
+#: WWW/Library/Implementation/HTTCP.c:1933
+#: WWW/Library/Implementation/HTTelnet.c:115
+#, c-format
+msgid "Invalid hostname %s"
+msgstr "Geçersiz makina adı %s"
+
+#: WWW/Library/Implementation/HTTCP.c:1945
+#, c-format
+msgid "Making %s connection to %s"
+msgstr "%2$s'e %1$s bağlantısı kuruluyor"
+
+#: WWW/Library/Implementation/HTTCP.c:1955
+msgid "socket failed."
+msgstr "soket başarısız."
+
+#: WWW/Library/Implementation/HTTCP.c:1969
+#, c-format
+msgid "socket failed: family %d addr %s port %s."
+msgstr "soket başarısız: aile %d adres %s port %s."
+
+#: WWW/Library/Implementation/HTTCP.c:1992
+msgid "Could not make connection non-blocking."
+msgstr "Bağlantı engelsizleştirilemedi (non-blocking)."
+
+#: WWW/Library/Implementation/HTTCP.c:2058
+msgid "Connection failed (too many retries)."
+msgstr "Bağlantı başarısız (çok sayıda yeniden deneme)."
+
+#: WWW/Library/Implementation/HTTCP.c:2253
+msgid "Could not restore socket to blocking."
+msgstr "Soket engellemeye (blocking) geri yüklenemedi."
+
+#. RFC 1928: CONNECT request
+#: WWW/Library/Implementation/HTTCP.c:2285
+#, c-format
+msgid "SOCKS5: connecting to %s"
+msgstr "SOCKS5: %s'e baÄŸlanma"
+
+#: WWW/Library/Implementation/HTTCP.c:2314
+msgid "SOCKS server failure"
+msgstr "SOCKS sunucu hatası"
+
+#: WWW/Library/Implementation/HTTCP.c:2317
+msgid "connection not allowed by ruleset"
+msgstr "kural kümesi tarafından bağlantıya izin verilmiyor"
+
+#: WWW/Library/Implementation/HTTCP.c:2320
+msgid "network unreachable"
+msgstr "aÄŸ eriÅŸilemiyor"
+
+#: WWW/Library/Implementation/HTTCP.c:2323
+msgid "host unreachable"
+msgstr "ana bilgisayara eriÅŸilemiyor"
+
+#: WWW/Library/Implementation/HTTCP.c:2326
+msgid "connection refused"
+msgstr "bağlantı kesildi"
+
+#: WWW/Library/Implementation/HTTCP.c:2329
+msgid "TTL expired"
+msgstr "TTL süresi doldu"
+
+#: WWW/Library/Implementation/HTTCP.c:2332
+msgid "command not supported"
+msgstr "komut desteklenmiyor"
+
+#: WWW/Library/Implementation/HTTCP.c:2335
+msgid "address type not supported"
+msgstr "adres türü desteklenmiyor"
+
+#: WWW/Library/Implementation/HTTCP.c:2338
+msgid "unknown SOCKS error code"
+msgstr "bilinmeyen SOCKS hata kodu"
+
+#: WWW/Library/Implementation/HTTCP.c:2383
+msgid "unexpected reply\n"
+msgstr "beklenmeyen yanıt\n"
+
+#: WWW/Library/Implementation/HTTCP.c:2460
+msgid "Socket read failed (too many tries)."
+msgstr "Soket okuma başarısız (çok sayıda deneme)."
+
+#: WWW/Library/Implementation/HTTP.c:165
+#, c-format
+msgid "SSL callback:%s, preverify_ok=%d, ssl_okay=%d"
+msgstr "SSL geriçağırımı:%s, öndoğrulama_tamam=%d, ssl_tamam=%d"
+
+#: WWW/Library/Implementation/HTTP.c:668
+#, c-format
+msgid "User/password contains only punctuation: %s"
+msgstr "Kullanıcı/parola yalnızca noktalama işaretlerini içerir: %s"
+
+#: WWW/Library/Implementation/HTTP.c:672
+#, c-format
+msgid "User/password may be confused with hostname: '%s' (e.g, '%s')"
+msgstr "Kullanıcı/parola hostname ile karışık olabilir: '%s' (örneğin, '%s')"
+
+#: WWW/Library/Implementation/HTTP.c:733
+#, c-format
+msgid "Certificate issued by: %s"
+msgstr "Sertifikayı veren:%s"
+
+#: WWW/Library/Implementation/HTTP.c:922
+msgid "This client does not contain support for HTTPS URLs."
+msgstr "Bu istemci HTTPS URL'ler için destek içermiyor."
+
+#: WWW/Library/Implementation/HTTP.c:947
+msgid "Unable to connect to remote host."
+msgstr "Karşı makinaya bağlanılamadı."
+
+#: WWW/Library/Implementation/HTTP.c:990
+msgid "Retrying connection without TLS."
+msgstr "Bağlantı, TLS'siz tekrar deneniyor."
+
+#: WWW/Library/Implementation/HTTP.c:1042
+msgid "GnuTLS error when trying to verify certificate."
+msgstr "Sertifika onaylanırken GnuTLS hatası."
+
+#: WWW/Library/Implementation/HTTP.c:1055
+msgid "the certificate has no known issuer"
+msgstr "sertifikanın bilinen bir yayınlayıcısı yok"
+
+#: WWW/Library/Implementation/HTTP.c:1057
+msgid "no issuer was found"
+msgstr "yayınlayıcı bulunamadı"
+
+#: WWW/Library/Implementation/HTTP.c:1059
+msgid "issuer is not a CA"
+msgstr "yayınlayıcı bir CA değil"
+
+#: WWW/Library/Implementation/HTTP.c:1061
+msgid "the certificate has been revoked"
+msgstr "sertifika hükümsüz kılınmış"
+
+#: WWW/Library/Implementation/HTTP.c:1063
+msgid "the certificate is not trusted"
+msgstr "sertifikaya güvenilmiyor"
+
+#: WWW/Library/Implementation/HTTP.c:1138
+#, c-format
+msgid "Verified connection to %s (cert=%s)"
+msgstr "%1$s'e doğrulanmış bağlantı (cert=%2$s)"
+
+#: WWW/Library/Implementation/HTTP.c:1188
+#: WWW/Library/Implementation/HTTP.c:1230
+#, c-format
+msgid "Verified connection to %s (subj=%s)"
+msgstr "%s'e bağlantı doğrulandı (konu=%s)"
+
+#: WWW/Library/Implementation/HTTP.c:1260
+msgid "Can't find common name in certificate"
+msgstr "Sertifikada ortak ad bulunamadı"
+
+#: WWW/Library/Implementation/HTTP.c:1263
+#, c-format
+msgid "SSL error:host(%s)!=cert(%s)-Continue?"
+msgstr "SSL hatası:makina(%s)!=sert(%s)-Devam edilsin mi?"
+
+#: WWW/Library/Implementation/HTTP.c:1270
+msgid "SSL error"
+msgstr "SSL hatası"
+
+#: WWW/Library/Implementation/HTTP.c:1278
+#, c-format
+msgid "UNVERIFIED connection to %s (cert=%s)"
+msgstr "%s'e DOĞRULANMAMIŞ bağlantı (cert=%s)"
+
+#: WWW/Library/Implementation/HTTP.c:1287
+#, c-format
+msgid "Secure %d-bit %s (%s) HTTP connection"
+msgstr "Güvenli %d-bit %s (%s) HTTP bağlantısı"
+
+#: WWW/Library/Implementation/HTTP.c:1757
+msgid "Sending HTTP request."
+msgstr "HTTP istemi gönderiliyor."
+
+#: WWW/Library/Implementation/HTTP.c:1799
+msgid "Unexpected network write error; connection aborted."
+msgstr "Umulmadık ağa yazma hatası; bağlantı yarıda kesildi."
+
+#: WWW/Library/Implementation/HTTP.c:1805
+msgid "HTTP request sent; waiting for response."
+msgstr "HTTP istemi gönderildi; yanıt bekleniyor."
+
+#: WWW/Library/Implementation/HTTP.c:1878
+#: WWW/Library/Implementation/HTTP.c:1888
+msgid "Unexpected network read error; connection aborted."
+msgstr "Umulmadık ağa yazma hatası; bağlantı yarıda kesildi."
+
+#.
+#. * HTTP/1.1 Informational statuses.
+#. * 100 Continue.
+#. * 101 Switching Protocols.
+#. * > 101 is unknown.
+#. * We should never get these, and they have only the status
+#. * line and possibly other headers, so we'll deal with them by
+#. * showing the full header to the user as text/plain. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2091
+msgid "Got unexpected Informational Status."
+msgstr "Umulmadık Bilgisel Durum alındı."
+
+#.
+#. * Reset Content. The server has fulfilled the request but
+#. * nothing is returned and we should reset any form
+#. * content. We'll instruct the user to do that, and
+#. * restore the current document. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2125
+msgid "Request fulfilled. Reset Content."
+msgstr "İstem karşılandı. İçeriği temizle."
+
+#. Not Modified
+#.
+#. * We didn't send an "If-Modified-Since" header, so this
+#. * status is inappropriate. We'll deal with it by showing
+#. * the full header to the user as text/plain. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2242
+msgid "Got unexpected 304 Not Modified status."
+msgstr "Umulmadık 304 Değiştirilmedi durumu alındı."
+
+#: WWW/Library/Implementation/HTTP.c:2305
+msgid "Redirection of POST content requires user approval."
+msgstr "POST içeriğinin yeniden yönlendirilmesi kullanıcı onayı gerektirir."
+
+#: WWW/Library/Implementation/HTTP.c:2320
+msgid "Have POST content. Treating Permanent Redirection as Temporary.\n"
+msgstr "POST içeriği mevcut. Kalıcı Yeniden Yönlendirmeye Geçici muamelesi yapılıyor.\n"
+
+#: WWW/Library/Implementation/HTTP.c:2366
+msgid "Retrying with access authorization information."
+msgstr "EriÅŸim yetkilendirme bilgisiyle yeniden deneniyor."
+
+#: WWW/Library/Implementation/HTTP.c:2378
+msgid "Show the 401 message body?"
+msgstr "401 mesaj gövdesi gösterilsin mi?"
+
+#: WWW/Library/Implementation/HTTP.c:2422
+msgid "Show the 407 message body?"
+msgstr "407 mesaj gövdesi gösterilsin mi?"
+
+#.
+#. * Bad or unknown server_status number. Take a chance and hope
+#. * there is something to display. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2522
+msgid "Unknown status reply from server!"
+msgstr "Sunucudan bilinmeyen durum yanıtı!"
+
+#: WWW/Library/Implementation/HTTelnet.c:113
+#, c-format
+msgid "remote %s session:"
+msgstr "uzak %s oturumu:"
+
+#: WWW/Library/Implementation/HTWAIS.c:163
+msgid "Could not connect to WAIS server."
+msgstr "WAIS sunucusuna bağlanılamadı."
+
+#: WWW/Library/Implementation/HTWAIS.c:171
+msgid "Could not open WAIS connection for reading."
+msgstr "Okuma için WAIS bağlantısı açılamadı."
+
+#: WWW/Library/Implementation/HTWAIS.c:193
+msgid "Diagnostic code is "
+msgstr "Tanısal kod: "
+
+#: WWW/Library/Implementation/HTWAIS.c:460
+msgid "Index "
+msgstr "Ä°ndeks "
+
+#: WWW/Library/Implementation/HTWAIS.c:464
+#, c-format
+msgid " contains the following %d item%s relevant to \""
+msgstr " aşağıdaki ilgili %d öğe%s(y)i içerir \""
+
+#: WWW/Library/Implementation/HTWAIS.c:472
+msgid "The first figure after each entry is its relative score, "
+msgstr "Herbir girdiden sonraki ilk sayı, onun göreceli skoru, "
+
+#: WWW/Library/Implementation/HTWAIS.c:473
+msgid "the second is the number of lines in the item."
+msgstr "ikincisiyse, öğedeki satır sayısıdır."
+
+#: WWW/Library/Implementation/HTWAIS.c:515
+msgid " (bad file name)"
+msgstr " (bozuk dosya adı)"
+
+#: WWW/Library/Implementation/HTWAIS.c:541
+msgid "(bad doc id)"
+msgstr "(bozuk belge no)"
+
+#: WWW/Library/Implementation/HTWAIS.c:557
+msgid "(Short Header record, can't display)"
+msgstr "(Kısa Başlık kaydı, görüntülenemiyor)"
+
+#: WWW/Library/Implementation/HTWAIS.c:564
+msgid ""
+"\n"
+"Long Header record, can't display\n"
+msgstr ""
+"\n"
+"Uzun Başlık kaydı, görüntülenemiyor\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:571
+msgid ""
+"\n"
+"Text record\n"
+msgstr ""
+"\n"
+"Metin kaydı\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:580
+msgid ""
+"\n"
+"Headline record, can't display\n"
+msgstr ""
+"\n"
+"Başlık kaydı, görüntülenemiyor\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:588
+msgid ""
+"\n"
+"Code record, can't display\n"
+msgstr ""
+"\n"
+"Kod kaydı, görüntülenemiyor\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:692
+msgid "Syntax error in WAIS URL"
+msgstr "WAIS URL'de sözdizimi hatası"
+
+#: WWW/Library/Implementation/HTWAIS.c:764
+msgid " (WAIS Index)"
+msgstr " (WAIS Ä°ndeksi)"
+
+#: WWW/Library/Implementation/HTWAIS.c:771
+msgid "WAIS Index: "
+msgstr "WAIS Ä°ndeksi: "
+
+#: WWW/Library/Implementation/HTWAIS.c:777
+msgid "This is a link for searching the "
+msgstr "Bu, WAIS indeksini aramak için "
+
+#: WWW/Library/Implementation/HTWAIS.c:781
+msgid " WAIS Index.\n"
+msgstr " bir linktir.\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:810
+msgid ""
+"\n"
+"Enter the 's'earch command and then specify search words.\n"
+msgstr ""
+"\n"
+"Ara(s) komutunu girip arama sözcüklerini belirleyiniz.\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:832
+msgid " (in "
+msgstr " (ÅŸurada "
+
+#: WWW/Library/Implementation/HTWAIS.c:841
+msgid "WAIS Search of \""
+msgstr "WAIS Araması \""
+
+#: WWW/Library/Implementation/HTWAIS.c:845
+msgid "\" in: "
+msgstr "\" ÅŸurada: "
+
+#: WWW/Library/Implementation/HTWAIS.c:860
+msgid "HTWAIS: Request too large."
+msgstr "HTWAIS: İstem çok büyük."
+
+#: WWW/Library/Implementation/HTWAIS.c:869
+msgid "Searching WAIS database..."
+msgstr "WAIS veritabanı aranıyor..."
+
+#: WWW/Library/Implementation/HTWAIS.c:879
+msgid "Search interrupted."
+msgstr "Arama kesildi."
+
+#: WWW/Library/Implementation/HTWAIS.c:930
+msgid "Can't convert format of WAIS document"
+msgstr "WAIS belgesinin biçemi dönüştürülemiyor"
+
+#: WWW/Library/Implementation/HTWAIS.c:974
+msgid "HTWAIS: Request too long."
+msgstr "HTWAIS: İstem çok uzun."
+
+#.
+#. * Actually do the transaction given by request_message.
+#.
+#: WWW/Library/Implementation/HTWAIS.c:988
+msgid "Fetching WAIS document..."
+msgstr "WAIS belgesi getiriliyor..."
+
+#. display_search_response(target, retrieval_response,
+#. wais_database, keywords);
+#: WWW/Library/Implementation/HTWAIS.c:1027
+msgid "No text was returned!\n"
+msgstr "Hiç metin dönmedi!\n"
+
+#: WWW/Library/Implementation/HTWSRC.c:302
+msgid " NOT GIVEN in source file; "
+msgstr " kaynak dosyada VERÄ°LMEDÄ°; "
+
+#: WWW/Library/Implementation/HTWSRC.c:325
+msgid " WAIS source file"
+msgstr " WAIS kaynak dosyası"
+
+#: WWW/Library/Implementation/HTWSRC.c:332
+msgid " description"
+msgstr " açıklama"
+
+#: WWW/Library/Implementation/HTWSRC.c:342
+msgid "Access links"
+msgstr "EriÅŸim linkleri"
+
+#: WWW/Library/Implementation/HTWSRC.c:363
+msgid "Direct access"
+msgstr "Dolaysız erişim"
+
+#. * Proxy will be used if defined, so let user know that - FM *
+#: WWW/Library/Implementation/HTWSRC.c:366
+msgid " (or via proxy server, if defined)"
+msgstr " (ya da tanımlıysa, vekil(proxy) sunucu aracılığıyla)"
+
+#: WWW/Library/Implementation/HTWSRC.c:381
+msgid "Maintainer"
+msgstr "Yönetici"
+
+#: WWW/Library/Implementation/HTWSRC.c:389
+msgid "Host"
+msgstr "Bilgisayar"
+
+#: src/GridText.c:723
+msgid "Memory exhausted, display interrupted!"
+msgstr "Bellek tükendi, görüntü kesildi!"
+
+#: src/GridText.c:728
+msgid "Memory exhausted, will interrupt transfer!"
+msgstr "Bellek tükendi, aktarım kesilecek!"
+
+#: src/GridText.c:1719
+#, c-format
+msgid " (l%d of %d)"
+msgstr " (l%d of %d)"
+
+#: src/GridText.c:1728
+#, c-format
+msgid " (p%d of %d)"
+msgstr " (p%d of %d)"
+
+#: src/GridText.c:3720
+msgid " *** MEMORY EXHAUSTED ***"
+msgstr " *** BELLEK TÃœKENDÄ° ***"
+
+#: src/GridText.c:6220
+msgid "text entry field"
+msgstr "metin giriş alanı"
+
+#: src/GridText.c:6223
+msgid "password entry field"
+msgstr "parola giriş alanı"
+
+#: src/GridText.c:6226
+msgid "checkbox"
+msgstr "onay kutusu"
+
+#: src/GridText.c:6229
+msgid "radio button"
+msgstr "radyo düğmesi"
+
+#: src/GridText.c:6232
+msgid "submit button"
+msgstr "gönderme düğmesi"
+
+#: src/GridText.c:6235
+msgid "reset button"
+msgstr "temizleme düğmesi"
+
+#: src/GridText.c:6238
+msgid "script button"
+msgstr "betik düğmesi"
+
+#: src/GridText.c:6241
+msgid "popup menu"
+msgstr "açılır menü"
+
+#: src/GridText.c:6244
+msgid "hidden form field"
+msgstr "gizli form alanı"
+
+#: src/GridText.c:6247
+msgid "text entry area"
+msgstr "metin giriş alanı"
+
+#: src/GridText.c:6250
+msgid "range entry field"
+msgstr "erim giriş alanı"
+
+#: src/GridText.c:6253
+msgid "file entry field"
+msgstr "dosya giriş alanı"
+
+#: src/GridText.c:6256
+msgid "text-submit field"
+msgstr "metin-gönderme alanı"
+
+#: src/GridText.c:6259
+msgid "image-submit button"
+msgstr "resim-gönderme alanı"
+
+#: src/GridText.c:6262
+msgid "keygen field"
+msgstr "keygen alanı"
+
+#: src/GridText.c:6265
+msgid "unknown form field"
+msgstr "bilinmeyen form alanı"
+
+#: src/GridText.c:6285 src/GridText.c:6292 src/LYList.c:249
+msgid "unknown field or link"
+msgstr "bilinmeyen alan ya da link"
+
+#: src/GridText.c:10722
+msgid "Can't open file for uploading"
+msgstr "Yüklemek için dosya açılamıyor"
+
+#: src/GridText.c:11910
+#, c-format
+msgid "Submitting %s"
+msgstr "%s gönderiliyor"
+
+#. ugliness has happened; inform user and do the best we can
+#: src/GridText.c:12980
+msgid "Hang Detect: TextAnchor struct corrupted - suggest aborting!"
+msgstr "Takılma Saptandı: TextAnchor struct bozuk - sonlandırmanız önerilir!"
+
+#. don't show previous state
+#: src/GridText.c:13139
+msgid "Wrap lines to fit displayed area?"
+msgstr "Görüntülenen alana sığmak üzere satırlar sarmalansın mı?"
+
+#: src/GridText.c:13772
+msgid "Very long lines have been truncated!"
+msgstr "Çok uzun satırların sonundan kırpıldı!"
+
+#: src/HTAlert.c:164 src/LYShowInfo.c:389 src/LYShowInfo.c:393
+msgid "bytes"
+msgstr "bayt"
+
+#.
+#. * If we know the total size of the file, we can compute
+#. * a percentage, and show a corresponding progress bar.
+#.
+#: src/HTAlert.c:328 src/HTAlert.c:354
+#, c-format
+msgid "Read %s of data"
+msgstr "Verinin %s'i okundu"
+
+#: src/HTAlert.c:351
+#, c-format
+msgid "Read %s of %s of data"
+msgstr "%2$s verinin %1$s'i okundu"
+
+#: src/HTAlert.c:360
+#, c-format
+msgid ", %s/sec"
+msgstr ", %s/sn"
+
+#: src/HTAlert.c:374
+#, c-format
+msgid " (stalled for %s)"
+msgstr " (%s süresince durakladı)"
+
+#: src/HTAlert.c:378
+#, c-format
+msgid ", ETA %s"
+msgstr ", ETA %s"
+
+#: src/HTAlert.c:400
+msgid " (Press 'z' to abort)"
+msgstr " (Yarıda kesmek için 'z'ye basınız)"
+
+#. Meta-note: don't move the following note from its place right
+#. in front of the first gettext(). As it is now, it should
+#. automatically appear in generated lynx.pot files. - kw
+#.
+#. NOTE TO TRANSLATORS: If you provide a translation for "yes", lynx
+#. * will take the first byte of the translation as a positive response
+#. * to Yes/No questions. If you provide a translation for "no", lynx
+#. * will take the first byte of the translation as a negative response
+#. * to Yes/No questions. For both, lynx will also try to show the
+#. * first byte in the prompt as a character, instead of (y) or (n),
+#. * respectively. This will not work right for multibyte charsets!
+#. * Don't translate "yes" and "no" for CJK character sets (or translate
+#. * them to "yes" and "no"). For a translation using UTF-8, don't
+#. * translate if the translation would begin with anything but a 7-bit
+#. * (US_ASCII) character. That also means do not translate if the
+#. * translation would begin with anything but a 7-bit character, if
+#. * you use a single-byte character encoding (a charset like ISO-8859-n)
+#. * but anticipate that the message catalog may be used re-encoded in
+#. * UTF-8 form.
+#. * For translations using other character sets, you may also wish to
+#. * leave "yes" and "no" untranslated, if using (y) and (n) is the
+#. * preferred behavior.
+#. * Lynx will also accept y Y n N as responses unless there is a conflict
+#. * with the first letter of the "yes" or "no" translation.
+#.
+#: src/HTAlert.c:438 src/HTAlert.c:486
+msgid "yes"
+msgstr "evet"
+
+#: src/HTAlert.c:441 src/HTAlert.c:487
+msgid "no"
+msgstr "hayır"
+
+#.
+#. * Special-purpose workaround for gettext support (we should do
+#. * this in a more general way) -TD
+#. *
+#. * NOTE TO TRANSLATORS: If the prompt has been rendered into
+#. * another language, and if yes/no are distinct, assume the
+#. * translator can make an ordered list in parentheses with one
+#. * capital letter for each as we assumed in HTConfirmDefault().
+#. * The list has to be in the same order as in the original message,
+#. * and the four capital letters chosen to not match those in the
+#. * original unless they have the same position.
+#. *
+#. * Example:
+#. * (Y/N/Always/neVer) - English (original)
+#. * (O/N/Toujours/Jamais) - French
+#.
+#: src/HTAlert.c:938
+msgid "Y/N/A/V"
+msgstr "(E/H/D/A)"
+
+#: src/HTML.c:5769
+msgid "Description:"
+msgstr "Açıklama:"
+
+#: src/HTML.c:5774
+msgid "(none)"
+msgstr "(hiçbiri)"
+
+#: src/HTML.c:5778
+msgid "Filepath:"
+msgstr "Dosya yolu:"
+
+#: src/HTML.c:5784
+msgid "(unknown)"
+msgstr "(bilinmiyor)"
+
+#: src/HTML.c:7224
+msgid "Document has only hidden links. Use the 'l'ist command."
+msgstr "Belgede yalnızca gizli linkler var. Listele(l) komutunu kullanınız."
+
+#: src/HTML.c:7725
+msgid "Source cache error - disk full?"
+msgstr "Kaynak önbellek hatası - disk tamamen dolu mu?"
+
+#: src/HTML.c:7738
+msgid "Source cache error - not enough memory!"
+msgstr "Kaynak önbellek hatası - bellek yetersiz!"
+
+#: src/LYBookmark.c:167
+msgid ""
+" This file is an HTML representation of the X Mosaic hotlist file.\n"
+" Outdated or invalid links may be removed by using the\n"
+" remove bookmark command, it is usually the 'R' key but may have\n"
+" been remapped by you or your system administrator."
+msgstr ""
+" Bu dosya, X Mosaic sıcak listesinin bir HTML temsilidir.\n"
+" Kullanımdan kalkmış ya da geçersiz linkler, yer imi çıkartma\n"
+" komutu kullanılarak çıkartılabilir, bu genellikle 'R' tuşudur, ancak\n"
+" siz ya da sistem yöneticiniz tarafından yeniden eşlemlenmiş olabilir."
+
+#: src/LYBookmark.c:380
+#, c-format
+msgid ""
+" You can delete links by the 'R' key<br>\n"
+"<ol>\n"
+msgstr ""
+" Linkleri 'R' tuÅŸuyla silebilirsiniz<br>\n"
+"<ol>\n"
+
+#: src/LYBookmark.c:383
+msgid ""
+" You can delete links using the remove bookmark command. It is usually\n"
+" the 'R' key but may have been remapped by you or your system\n"
+" administrator."
+msgstr ""
+" Linkleri yer imi çıkartma komutunu kullanarak silebilirsiniz. Bu genellikle\n"
+" 'R' tuşudur, ancak siz ya da sistem yöneticiniz tarafından yeniden\n"
+" .eÅŸlemlenmiÅŸ olabilir."
+
+#: src/LYBookmark.c:387
+msgid ""
+" This file also may be edited with a standard text editor to delete\n"
+" outdated or invalid links, or to change their order."
+msgstr ""
+" Bu dosya, kullanımdan kalkmış, geçersiz linkleri silmek ya da sıralarını\n"
+" değiştirmek üzere standart bir metin düzenleyiciyle de düzenlenebilir."
+
+#: src/LYBookmark.c:390
+msgid ""
+"Note: if you edit this file manually\n"
+" you should not change the format within the lines\n"
+" or add other HTML markup.\n"
+" Make sure any bookmark link is saved as a single line."
+msgstr ""
+"Not: Eğer bu dosyayı elle düzenlerseniz\n"
+" satır içlerindeki biçimi değiştirmemeli, ya da\n"
+" baÅŸka HTML belirteci eklememelisiniz.\n"
+" Herbir linkin tek satır olarak kaydedildiğine emin olun."
+
+#: src/LYBookmark.c:686
+#, c-format
+msgid "File may be recoverable from %s during this session"
+msgstr "Dosya, bu oturum boyunca %s'den kurtarılabilir"
+
+#: src/LYCgi.c:161
+#, c-format
+msgid "Do you want to execute \"%s\"?"
+msgstr "\"%s\"'i çalıştırmak ister misiniz?"
+
+#.
+#. * Neither the path as given nor any components examined by backing up
+#. * were stat()able. - kw
+#.
+#: src/LYCgi.c:276
+msgid "Unable to access cgi script"
+msgstr "Cgi betiÄŸine eriÅŸilemiyor"
+
+#: src/LYCgi.c:709 src/LYCgi.c:712
+msgid "Good Advice"
+msgstr "İyi Öneri"
+
+#: src/LYCgi.c:716
+msgid "An excellent http server for VMS is available via"
+msgstr "VMS için kusursuz bir http sunucusu, şu link aracılığıyla"
+
+#: src/LYCgi.c:723
+msgid "this link"
+msgstr "temin edilebilir"
+
+#: src/LYCgi.c:727
+msgid "It provides state of the art CGI script support.\n"
+msgstr "Güncel CGI betik desteğini sağlar.\n"
+
+#: src/LYClean.c:115
+msgid "Exiting via interrupt:"
+msgstr "İşkesmesi aracılığıyla kapanıyor:"
+
+#: src/LYCookie.c:2651
+msgid "(from a previous session)"
+msgstr "(önceki bir oturumdan)"
+
+#: src/LYCookie.c:2712
+msgid "Maximum Gobble Date:"
+msgstr "Maksimum Silip Süpürme Tarihi:"
+
+#: src/LYCookie.c:2751
+msgid "Internal"
+msgstr "Dahili"
+
+#: src/LYCookie.c:2752
+msgid "cookie_domain_flag_set error, aborting program"
+msgstr "cookie_domain_flag_set hatası, program yarıda kesiliyor"
+
+#: src/LYCurses.c:1136
+msgid "Terminal reinitialisation failed - unknown terminal type?"
+msgstr "Uçbirim ön değer ataması başarısız - bilinmeyen uçbirim türü?"
+
+#: src/LYCurses.c:1343
+msgid "Terminal initialisation failed - unknown terminal type?"
+msgstr "Uçbirim ön değer ataması başarısız - bilinmeyen uçbirim türü?"
+
+#: src/LYCurses.c:1837
+msgid "Terminal ="
+msgstr "Uçbirim ="
+
+#: src/LYCurses.c:1841
+msgid "You must use a vt100, 200, etc. terminal with this program."
+msgstr "Bu programla bir vt100, 200 vb. uçbirim kullanmalısınız."
+
+#: src/LYCurses.c:1890
+msgid "Your Terminal type is unknown!"
+msgstr "Uçbirim türünüz bilinmiyor!"
+
+#: src/LYCurses.c:1891
+msgid "Enter a terminal type:"
+msgstr "Bir uçbirim türü giriniz:"
+
+#: src/LYCurses.c:1905
+msgid "TERMINAL TYPE IS SET TO"
+msgstr "UÇBİRİM TÜRÜ AYARI"
+
+#: src/LYCurses.c:2464
+#, c-format
+msgid ""
+"\n"
+"A Fatal error has occurred in %s Ver. %s\n"
+msgstr ""
+"\n"
+"%2$s Sür. %1$s'de ölümcül bir hata oluştu\n"
+
+#: src/LYCurses.c:2467
+#, c-format
+msgid ""
+"\n"
+"Please notify your system administrator to confirm a bug, and if\n"
+"confirmed, to notify the lynx-dev list. Bug reports should have concise\n"
+"descriptions of the command and/or URL which causes the problem, the\n"
+"operating system name with version number, the TCPIP implementation, the\n"
+"TRACEBACK if it can be captured, and any other relevant information.\n"
+msgstr ""
+"\n"
+"Lütfen sistem yöneticinize bir yazılım hatasını doğrulatmak için, ve\n"
+"eğer doğrulanırsa lynx-dev listesine bildirmesi için haber veriniz.\n"
+"Hata raporları, soruna yol açan komutun ve/veya URL'nin kısa açıklamasını,\n"
+"işletim sistemi adıyla sürüm numarasını, TCPIP uygulamasını,\n"
+"kapılabildiyse GERİİZSÜRÜMÜnü ve ilgili diğer bilgileri içermelidir.\n"
+
+#: src/LYEdit.c:272
+#, c-format
+msgid "Error starting editor, %s"
+msgstr "Düzenleyiciyi başlatmada hata, %s"
+
+#: src/LYEdit.c:275
+msgid "Editor killed by signal"
+msgstr "Düzenleyici sinyalle öldürüldü"
+
+#: src/LYEdit.c:280
+#, c-format
+msgid "Editor returned with error status %s"
+msgstr "Düzenleyici %s hata durumuyla döndü"
+
+#: src/LYDownload.c:511
+msgid "Downloaded link:"
+msgstr "Ä°ndirilmiÅŸ link:"
+
+#: src/LYDownload.c:516
+msgid "Suggested file name:"
+msgstr "Önerilen dosya adı:"
+
+#: src/LYDownload.c:521
+msgid "Standard download options:"
+msgstr "Standart indirme seçenekleri:"
+
+#: src/LYDownload.c:522
+msgid "Download options:"
+msgstr "İndirme seçenekleri:"
+
+#: src/LYDownload.c:538
+msgid "Save to disk"
+msgstr "Diske kaydet"
+
+#: src/LYDownload.c:552
+msgid "View temporary file"
+msgstr "Geçici dosyayı görüntüle"
+
+#: src/LYDownload.c:559
+msgid "Save to disk disabled."
+msgstr "Diske kaydetme devre dışı..."
+
+#: src/LYDownload.c:563 src/LYPrint.c:1331
+msgid "Local additions:"
+msgstr "Yerel eklentiler:"
+
+#: src/LYDownload.c:574 src/LYUpload.c:206
+msgid "No Name Given"
+msgstr "Ä°sim VerilmemiÅŸ"
+
+#: src/LYHistory.c:673
+msgid "You selected:"
+msgstr "Seçiminiz:"
+
+#: src/LYHistory.c:697 src/LYHistory.c:926
+msgid "(no address)"
+msgstr "(adres yok)"
+
+#: src/LYHistory.c:701
+msgid " (internal)"
+msgstr " (dahili)"
+
+#: src/LYHistory.c:703
+msgid " (was internal)"
+msgstr " (dahiliydi)"
+
+#: src/LYHistory.c:801
+msgid " (From History)"
+msgstr " (Tarihçe'den)"
+
+#: src/LYHistory.c:846
+msgid "You visited (POSTs, bookmark, menu and list files excluded):"
+msgstr "Uğradıklarınız (POSTlar, yer imi, menü ve liste dosyaları hariç):"
+
+#: src/LYHistory.c:1148
+msgid "(No messages yet)"
+msgstr "(Henüz hiç mesaj yok)"
+
+#: src/LYLeaks.c:222
+msgid "Invalid pointer detected."
+msgstr "Geçersiz imleyici saptandı."
+
+#: src/LYLeaks.c:224 src/LYLeaks.c:262
+msgid "Sequence:"
+msgstr "Sıra:"
+
+#: src/LYLeaks.c:227 src/LYLeaks.c:265
+msgid "Pointer:"
+msgstr "Ä°mleyici:"
+
+#: src/LYLeaks.c:236 src/LYLeaks.c:243 src/LYLeaks.c:284
+msgid "FileName:"
+msgstr "DosyaAdı:"
+
+#: src/LYLeaks.c:239 src/LYLeaks.c:246 src/LYLeaks.c:287 src/LYLeaks.c:298
+msgid "LineCount:"
+msgstr "SatırSayısı:"
+
+#: src/LYLeaks.c:260
+msgid "Memory leak detected."
+msgstr "Bellek sızıntısı saptandı."
+
+#: src/LYLeaks.c:268
+msgid "Contains:"
+msgstr "İçindekiler:"
+
+#: src/LYLeaks.c:281
+msgid "ByteSize:"
+msgstr "BaytÖlçüsü:"
+
+#: src/LYLeaks.c:295
+msgid "realloced:"
+msgstr "yeniden tahsil edilmiÅŸ:"
+
+#: src/LYLeaks.c:316
+msgid "Total memory leakage this run:"
+msgstr "Bu yürütmedeki toplam bellek sızıntısı:"
+
+#: src/LYLeaks.c:320
+msgid "Peak allocation"
+msgstr "Tepe ayırma"
+
+#: src/LYLeaks.c:322
+msgid "Bytes allocated"
+msgstr "Ayrılan bayt"
+
+#: src/LYLeaks.c:324
+msgid "Total mallocs"
+msgstr "Ayrılan toplam bellek"
+
+#: src/LYLeaks.c:326
+msgid "Total frees"
+msgstr "Toplam boÅŸ"
+
+#: src/LYList.c:89
+msgid "References in "
+msgstr "Bu belgedeki "
+
+#: src/LYList.c:92
+msgid "this document:"
+msgstr "referanslar:"
+
+#: src/LYList.c:98 src/LYList.c:363
+msgid "Visible links:"
+msgstr "Görünür linkler:"
+
+#: src/LYList.c:202 src/LYList.c:322
+msgid "Hidden links:"
+msgstr "Gizli Linkler:"
+
+#: src/LYList.c:359
+msgid "References"
+msgstr "Referanslar"
+
+#: src/LYLocal.c:289
+#, c-format
+msgid "Unable to get status of '%s'."
+msgstr "'%s'in durumu alınamıyor."
+
+#: src/LYLocal.c:354
+msgid "The selected item is not a file or a directory! Request ignored."
+msgstr "Seçilen öğe bir dosya ya da dizin değil! İstem yoksayıldı."
+
+#: src/LYLocal.c:456
+#, c-format
+msgid "Unable to %s due to system error!"
+msgstr "Sistem hatası nedeniyle %s yapılamıyor!"
+
+#: src/LYLocal.c:490
+#, c-format
+msgid "Probable failure to %s due to system error!"
+msgstr "Sistem hatası nedeniyle olası %s başarısızlığı!"
+
+#: src/LYLocal.c:555 src/LYLocal.c:578
+#, c-format
+msgid "remove %s"
+msgstr "%s'i çıkart"
+
+#: src/LYLocal.c:598
+#, c-format
+msgid "touch %s"
+msgstr "%s'e dokun"
+
+#: src/LYLocal.c:628
+#, c-format
+msgid "move %s to %s"
+msgstr "%s'i %s'e taşı"
+
+#: src/LYLocal.c:676
+msgid "There is already a directory with that name! Request ignored."
+msgstr "O isimde bir dizin zaten var! İstem yoksayıldı."
+
+#: src/LYLocal.c:678
+msgid "There is already a file with that name! Request ignored."
+msgstr "O isimde bir dosya zaten var! İstem yoksayıldı."
+
+#: src/LYLocal.c:680
+msgid "The specified name is already in use! Request ignored."
+msgstr "Belirtilmiş isim zaten kullanımda! İstem yoksayıldı."
+
+#: src/LYLocal.c:692
+msgid "Destination has different owner! Request denied."
+msgstr "Varış yerinin sahibi farklı! İstem reddedildi."
+
+#: src/LYLocal.c:695
+msgid "Destination is not a valid directory! Request denied."
+msgstr "Varış yeri geçerli bir dizin değil! İstem reddedildi."
+
+#: src/LYLocal.c:711
+msgid "Source and destination are the same location! Request ignored!"
+msgstr "Çıkış ve varış konumları aynı! İstem yoksayıldı!"
+
+#: src/LYLocal.c:735
+msgid "Remove all tagged files and directories?"
+msgstr "Bütün işaretlenmiş dosya ve dizinler çıkartılsın mı?"
+
+#: src/LYLocal.c:808
+msgid "Enter new location for tagged items: "
+msgstr "İşaretlenmiş öğeler için yeni konum giriniz: "
+
+#: src/LYLocal.c:906
+msgid "Enter new name for directory: "
+msgstr "Dizin için yeni isim giriniz: "
+
+#: src/LYLocal.c:908
+msgid "Enter new name for file: "
+msgstr "Dosya için yeni isim giriniz: "
+
+#: src/LYLocal.c:920
+msgid "Illegal character (path-separator) found! Request ignored."
+msgstr "Kuraldışı karakter (yol-ayracı) bulundu! İstem yoksayıldı."
+
+#: src/LYLocal.c:970
+msgid "Enter new location for directory: "
+msgstr "Dizin için yeni konum giriniz: "
+
+#: src/LYLocal.c:972
+msgid "Enter new location for file: "
+msgstr "Dosya için yeni konum giriniz: "
+
+#: src/LYLocal.c:999
+msgid "Unexpected failure - unable to find trailing path separator"
+msgstr "Umulmadık aksaklık - izleme yolu ayracı bulunamadı"
+
+#: src/LYLocal.c:1061
+msgid "Modify name, location, or permission (n, l, or p): "
+msgstr "Ä°sim(n), konum(l) ya da izin(p) deÄŸiÅŸtirme: "
+
+#: src/LYLocal.c:1063
+msgid "Modify name or location (n or l): "
+msgstr "Ä°sim(n) ya da konum(l) deÄŸiÅŸtirme: "
+
+#.
+#. * Code for changing ownership needed here.
+#.
+#: src/LYLocal.c:1092
+msgid "This feature not yet implemented!"
+msgstr "Bu nitelik daha tamamlanmadı!"
+
+#: src/LYLocal.c:1113
+msgid "Enter name of file to create: "
+msgstr "Oluşturulacak dosyanın adını giriniz: "
+
+#: src/LYLocal.c:1116 src/LYLocal.c:1153
+msgid "Illegal redirection \"//\" found! Request ignored."
+msgstr "Kuraldışı yeniden yönlendirme \"//\" bulundu! İstem yoksayıldı."
+
+#: src/LYLocal.c:1150
+msgid "Enter name for new directory: "
+msgstr "Yeni dizin için isim giriniz: "
+
+#: src/LYLocal.c:1191
+msgid "Create file or directory (f or d): "
+msgstr "Dosya(f) ya da dizin(d) oluÅŸtur: "
+
+#: src/LYLocal.c:1233
+#, c-format
+msgid "Remove directory '%s'?"
+msgstr "'%s' dizini çıkartılsın mı?"
+
+#: src/LYLocal.c:1236
+msgid "Remove directory?"
+msgstr "Dizin çıkarılsın mı?"
+
+#: src/LYLocal.c:1241
+#, c-format
+msgid "Remove file '%s'?"
+msgstr "'%s' dosyası çıkartılsın mı?"
+
+#: src/LYLocal.c:1243
+msgid "Remove file?"
+msgstr "Dosya çıkartılsın mı?"
+
+#: src/LYLocal.c:1248
+#, c-format
+msgid "Remove symbolic link '%s'?"
+msgstr "'%s' simgesel linki çıkartılsın mı?"
+
+#: src/LYLocal.c:1250
+msgid "Remove symbolic link?"
+msgstr "Simgesel link çıkartılsın mı?"
+
+#: src/LYLocal.c:1348
+msgid "Sorry, don't know how to permit non-UNIX files yet."
+msgstr "Üzgünüm, daha UNIX-dışı dosyalara nasıl izin verileceği bilinmiyor."
+
+#: src/LYLocal.c:1377
+msgid "Unable to open permit options file"
+msgstr "İzin seçenekleri dosyası açılamıyor"
+
+#: src/LYLocal.c:1405
+msgid "Specify permissions below:"
+msgstr "İzinleri aşağıda belirtin:"
+
+#: src/LYLocal.c:1406 src/LYShowInfo.c:291
+msgid "Owner:"
+msgstr "Sahip:"
+
+#: src/LYLocal.c:1422
+msgid "Group"
+msgstr "Grup"
+
+#: src/LYLocal.c:1438
+msgid "Others:"
+msgstr "DiÄŸerleri:"
+
+#: src/LYLocal.c:1456
+msgid "form to permit"
+msgstr "izin verilecek form"
+
+#: src/LYLocal.c:1552
+msgid "Invalid mode format."
+msgstr "Kip biçemi geçersiz."
+
+#: src/LYLocal.c:1556
+msgid "Invalid syntax format."
+msgstr "Betik biçemi geçersiz."
+
+#: src/LYLocal.c:1743
+msgid "Warning! UUDecoded file will exist in the directory you started Lynx."
+msgstr "Uyarı! UUçözülmüş dosya, Lynx'i başlattığınız dizinde yer alacak."
+
+#: src/LYLocal.c:1933
+msgid "NULL URL pointer"
+msgstr "BOÅž URL imleyici"
+
+#: src/LYLocal.c:2015
+#, c-format
+msgid "Executing %s "
+msgstr "%s icra ediliyor "
+
+#: src/LYLocal.c:2018
+msgid "Executing system command. This might take a while."
+msgstr "Sistem komutu icra ediliyor. Bu, bir süre alabilir."
+
+#: src/LYLocal.c:2092
+msgid "Current directory:"
+msgstr "Mevcut dizin:"
+
+#: src/LYLocal.c:2095 src/LYLocal.c:2113
+msgid "Current selection:"
+msgstr "Mevcut seçim:"
+
+#: src/LYLocal.c:2099
+msgid "Nothing currently selected."
+msgstr "Halen hiçbir şey.seçili değil."
+
+#: src/LYLocal.c:2115
+msgid "tagged item:"
+msgstr "işaretlenmiş öğe:"
+
+#: src/LYLocal.c:2116
+msgid "tagged items:"
+msgstr "işaretlenmiş öğeler:"
+
+#: src/LYLocal.c:2216 src/LYLocal.c:2225
+msgid "Illegal filename; request ignored."
+msgstr "Kuraldışı dosya adı; istem yoksayıldı."
+
+#. directory not writable
+#: src/LYLocal.c:2323 src/LYLocal.c:2382
+msgid "Install in the selected directory not permitted."
+msgstr "Seçili dizine kurmaya izin verilmiyor."
+
+#: src/LYLocal.c:2378
+msgid "The selected item is not a directory! Request ignored."
+msgstr "Seçili öğe bir dizin değil! İstem yoksayıldı."
+
+#: src/LYLocal.c:2387
+msgid "Just a moment, ..."
+msgstr "Bir dakikacık, ..."
+
+#: src/LYLocal.c:2404
+msgid "Error building install args"
+msgstr "Kurma arg'larını yapılandırmada hata"
+
+#: src/LYLocal.c:2419 src/LYLocal.c:2450
+#, c-format
+msgid "Source and target are the same: %s"
+msgstr "Kaynak ve hedef aynı: %s"
+
+#: src/LYLocal.c:2426 src/LYLocal.c:2457
+#, c-format
+msgid "Already in target directory: %s"
+msgstr "Zaten hedef dizinde: %s"
+
+#: src/LYLocal.c:2475
+msgid "Installation complete"
+msgstr "Kurma tamamlandı"
+
+#: src/LYLocal.c:2678
+msgid "Temporary URL or list would be too long."
+msgstr "Geçici URL ya da liste çok uzun olacaktı."
+
+#: src/LYMail.c:566
+msgid "Sending"
+msgstr "Gönderiliyor"
+
+#: src/LYMail.c:1050
+#, c-format
+msgid "The link %s :?: %s \n"
+msgstr "%s :?: %s bağı\n"
+
+#: src/LYMail.c:1052
+#, c-format
+msgid "called \"%s\"\n"
+msgstr "\"%s\" çağrıldı \n"
+
+#: src/LYMail.c:1053
+#, c-format
+msgid "in the file \"%s\" called \"%s\"\n"
+msgstr "\"%2$s\" adlı dosyanın içinde \"%1$s\" olup\n"
+
+#: src/LYMail.c:1054
+msgid "was requested but was not available."
+msgstr "istendi, fakat temin edilemedi."
+
+#: src/LYMail.c:1055
+msgid "Thought you might want to know."
+msgstr "Bilmek isteyeceğinizi sandım."
+
+#: src/LYMail.c:1057
+msgid "This message was automatically generated by"
+msgstr "Bu mesajı otomatik olarak oluşturan"
+
+#: src/LYMail.c:1770
+msgid "No system mailer configured"
+msgstr "Ayarlanmış sistem postacısı yok"
+
+#: src/LYMain.c:1095
+msgid "No Winsock found, sorry."
+msgstr "Winsock bulunamadı, üzgünüm."
+
+#: src/LYMain.c:1285
+msgid "You MUST define a valid TMP or TEMP area!"
+msgstr "Geçerli bir TMP ya da TEMP alanı tanımlamalısınız!"
+
+#: src/LYMain.c:1338 src/LYMainLoop.c:5285
+msgid "No such directory"
+msgstr "Böyle bir dizin yok"
+
+#: src/LYMain.c:1532
+#, c-format
+msgid ""
+"\n"
+"Configuration file \"%s\" is not available.\n"
+"\n"
+msgstr ""
+"\n"
+"Ayarlama dosyası \"%s\" temin edilemiyor.\n"
+"\n"
+
+#: src/LYMain.c:1542
+#, c-format
+msgid ""
+"\n"
+"Lynx character sets not declared.\n"
+"\n"
+msgstr ""
+"\n"
+"Lynx karakter kümeleri bildirilmemiş.\n"
+"\n"
+
+#: src/LYMain.c:1698
+#, c-format
+msgid "Ignored %d characters from standard input.\n"
+msgstr "Standart girdiden %d karakter yok sayıldı.\n"
+
+#: src/LYMain.c:1700
+#, c-format
+msgid "Use \"-stdin\" or \"-\" to tell how to handle piped input.\n"
+msgstr "Veriyolu girdisinin nasıl halledileceğini belirtmek için \"-stdin\" ya da \"-\" kullanın.\n"
+
+#: src/LYMain.c:1858
+msgid "Warning:"
+msgstr "Uyarı:"
+
+#: src/LYMain.c:2426
+msgid "persistent cookies state will be changed in next session only."
+msgstr "kalıcı çerezler durumu, yalnızca gelecek oturumda değişecek."
+
+#: src/LYMain.c:2661 src/LYMain.c:2705
+#, c-format
+msgid "Lynx: ignoring unrecognized charset=%s\n"
+msgstr "Lynx: tanınmayan karakterkümesi=%s yoksayılıyor\n"
+
+#: src/LYMain.c:3222
+#, c-format
+msgid "%s Version %s (%s)"
+msgstr "%s Sürüm %s (%s)"
+
+#: src/LYMain.c:3263
+#, c-format
+msgid "Built on %s%s.\n"
+msgstr "%s%s üzerine yapılandırıldı.\n"
+
+#: src/LYMain.c:3277
+msgid "Copyrights held by the Lynx Developers Group,"
+msgstr "Telif hakları Lynx Geliştirme Grubu,"
+
+#: src/LYMain.c:3278
+msgid "the University of Kansas, CERN, and other contributors."
+msgstr "kansas Üniversitesi, CERN ve diğer katkıda bulunanlar."
+
+#: src/LYMain.c:3279
+msgid "Distributed under the GNU General Public License (Version 2)."
+msgstr "GNU Genel Kamu Lisansı (Sürüm 2) altında dağıtılmaktadır."
+
+#: src/LYMain.c:3280
+msgid "See https://lynx.invisible-island.net/ and the online help for more information."
+msgstr "Daha fazla bilgi için https://lynx.invisible-island.net/ ve çevrim içi yardıma bakınız."
+
+#: src/LYMain.c:4139
+#, c-format
+msgid "USAGE: %s [options] [file]\n"
+msgstr "KULLANIM: %s [seçenekler] [dosya]\n"
+
+#: src/LYMain.c:4140
+#, c-format
+msgid "Options are:\n"
+msgstr "Seçenekler:\n"
+
+#: src/LYMain.c:4443
+#, c-format
+msgid "%s: Invalid Option: %s\n"
+msgstr "%s: Geçersiz Seçenek: %s\n"
+
+#: src/LYMainLoop.c:572
+#, c-format
+msgid "Internal error: Invalid mouse link %d!"
+msgstr "Dahili hata: Geçersiz fare linki %d!"
+
+#: src/LYMainLoop.c:693 src/LYMainLoop.c:5307
+msgid "A URL specified by the user"
+msgstr "Kullanıcı tarafından belirtilmiş bir URL"
+
+#: src/LYMainLoop.c:1142
+msgid "Enctype multipart/form-data not yet supported! Cannot submit."
+msgstr "Enctip çok parçalı/form verisi henüz desteklenmiyor! Gönderilemez."
+
+#.
+#. * Make a name for this help file.
+#.
+#: src/LYMainLoop.c:3197
+msgid "Help Screen"
+msgstr "Yardım Ekranı"
+
+#: src/LYMainLoop.c:3328
+msgid "System Index"
+msgstr "Sistem Ä°ndeksi"
+
+#: src/LYMainLoop.c:3577
+#, c-format
+msgid "Query parameter %d: "
+msgstr "Sorgu parametresi %d: "
+
+#: src/LYMainLoop.c:3806 src/LYMainLoop.c:5583
+msgid "Entry into main screen"
+msgstr "Ana ekrana giriÅŸ"
+
+#: src/LYMainLoop.c:4064
+msgid "No next document present"
+msgstr "Sonrasında başka belge yok"
+
+#: src/LYMainLoop.c:4359
+msgid "charset for this document specified explicitly, sorry..."
+msgstr "bu belge için karakterkümesi özgün şekilde belirtilmiştir, üzgünüm..."
+
+#: src/LYMainLoop.c:5265
+msgid "cd to:"
+msgstr "hangi dizine cd:"
+
+#: src/LYMainLoop.c:5288
+msgid "A component of path is not a directory"
+msgstr "Yolun bileÅŸenlerinden biri dizin deÄŸildir"
+
+#: src/LYMainLoop.c:5291
+msgid "failed to change directory"
+msgstr "dizin değiştirme başarısız"
+
+#: src/LYMainLoop.c:6517
+msgid "Reparsing document under current settings..."
+msgstr "Mevcut ayarlarla belge yeniden ayrıştırılıyor..."
+
+#: src/LYMainLoop.c:6811
+#, c-format
+msgid "Fatal error - could not open output file %s\n"
+msgstr "Ölümcül hata - çıktı dosyası %s açılamıyor\n"
+
+#: src/LYMainLoop.c:7153
+msgid "TABLE center enable."
+msgstr "TABLO ortala(mayı) etkinleştir."
+
+#: src/LYMainLoop.c:7156
+msgid "TABLE center disable."
+msgstr "TABLO ortala(mayı) devre dışı bırak."
+
+#: src/LYMainLoop.c:7236
+msgid "Current URL is empty."
+msgstr "Mevcut URL boÅŸ."
+
+#: src/LYMainLoop.c:7238 src/LYUtils.c:1909
+msgid "Copy to clipboard failed."
+msgstr "Panoya kopyalama başarısız."
+
+#: src/LYMainLoop.c:7240
+msgid "Document URL put to clipboard."
+msgstr "Belge URL'sini panoya koy."
+
+#: src/LYMainLoop.c:7242
+msgid "Link URL put to clipboard."
+msgstr "Link URL'sini panoya koy."
+
+#: src/LYMainLoop.c:7269
+msgid "No URL in the clipboard."
+msgstr "Panoda URL yok."
+
+#: src/LYMainLoop.c:7962 src/LYMainLoop.c:8133
+msgid "-index-"
+msgstr "-indeks-"
+
+#: src/LYMainLoop.c:8071
+msgid "lynx: Can't access startfile"
+msgstr "lynx: başlat dosyasına (startfile) erişilemiyor"
+
+#: src/LYMainLoop.c:8083
+msgid "lynx: Start file could not be found or is not text/html or text/plain"
+msgstr "lynx: Başlat dosyası bulunamıyor ya da html-metin ya da salt-metin değil"
+
+#: src/LYMainLoop.c:8084
+msgid " Exiting..."
+msgstr " Kapanıyor..."
+
+#: src/LYMainLoop.c:8127
+msgid "-more-"
+msgstr "-devam-"
+
+#. Enable scrolling.
+#: src/LYNews.c:186
+msgid "You will be posting to:"
+msgstr "Postalayacağınız yer/kişi:"
+
+#.
+#. * Get the mail address for the From header, offering personal_mail_address
+#. * as default.
+#.
+#: src/LYNews.c:195
+msgid ""
+"\n"
+"\n"
+" Please provide your mail address for the From: header\n"
+msgstr ""
+"\n"
+"\n"
+" Lütfen Gönderen: hanesi için e-posta adresinizi giriniz\n"
+
+#.
+#. * Get the Subject header, offering the current document's title as the
+#. * default if this is a followup rather than a new post. - FM
+#.
+#: src/LYNews.c:212
+msgid ""
+"\n"
+"\n"
+" Please provide or edit the Subject: header\n"
+msgstr ""
+"\n"
+"\n"
+" Lütfen Konu: hanesini giriniz ya da düzenleyiniz\n"
+
+#: src/LYNews.c:302
+msgid ""
+"\n"
+"\n"
+" Please provide or edit the Organization: header\n"
+msgstr ""
+"\n"
+"\n"
+" Lütfen Kurum: hanesini giriniz ya da düzenleyiniz\n"
+
+#.
+#. * Use the built in line editior.
+#.
+#: src/LYNews.c:359
+msgid ""
+"\n"
+"\n"
+" Please enter your message below."
+msgstr ""
+"\n"
+"\n"
+" Lütfen mesajınızı aşağıya giriniz."
+
+#: src/LYNews.c:405
+msgid "Message has no original text!"
+msgstr "Mesajda orijinal metin yok!"
+
+#: src/LYOptions.c:774
+msgid "review/edit B)ookmarks files"
+msgstr "yer imi B) dosyalarını gözden geçir/düzenle"
+
+#: src/LYOptions.c:776
+msgid "B)ookmark file: "
+msgstr "Yer imi(B) dosyası: "
+
+#: src/LYOptions.c:2131 src/LYOptions.c:2138
+msgid "ON"
+msgstr "AÇIK"
+
+#. verbose_img variable
+#. LYCollapseBRs variable
+#. LYtrimBlankLines variable
+#: src/LYOptions.c:2132 src/LYOptions.c:2137 src/LYOptions.c:2321
+#: src/LYOptions.c:2330 src/LYOptions.c:2339 src/LYOptions.c:2350
+msgid "OFF"
+msgstr "KAPALI"
+
+#: src/LYOptions.c:2133
+msgid "NEVER"
+msgstr "ASLA"
+
+#: src/LYOptions.c:2134
+msgid "ALWAYS"
+msgstr "HER ZAMAN"
+
+#: src/LYOptions.c:2150 src/LYOptions.c:2313
+msgid "ignore"
+msgstr "yoksay"
+
+#: src/LYOptions.c:2151
+msgid "ask user"
+msgstr "kullanıcıya sor"
+
+#: src/LYOptions.c:2152
+msgid "accept all"
+msgstr "tümünü kabul et"
+
+#: src/LYOptions.c:2164
+msgid "ALWAYS OFF"
+msgstr "HER ZAMAN KAPALI"
+
+#: src/LYOptions.c:2165
+msgid "FOR LOCAL FILES ONLY"
+msgstr "YALNIZCA YEREL DOSYALAR İÇİN"
+
+#: src/LYOptions.c:2167
+msgid "ALWAYS ON"
+msgstr "HER ZAMAN AÇIK"
+
+#: src/LYOptions.c:2179
+msgid "Numbers act as arrows"
+msgstr "Rakamlar oklar gibi davranırlar"
+
+#: src/LYOptions.c:2181
+msgid "Links are numbered"
+msgstr "Linkler numaralandı"
+
+#: src/LYOptions.c:2184
+msgid "Links and form fields are numbered"
+msgstr "Linkler ve form alanları numaralandı"
+
+#: src/LYOptions.c:2187
+msgid "Form fields are numbered"
+msgstr "Form alanları numaralandı"
+
+#: src/LYOptions.c:2202
+msgid "Case insensitive"
+msgstr "Büyük/küçük harf duyarsız"
+
+#: src/LYOptions.c:2203
+msgid "Case sensitive"
+msgstr "Büyük/küçük harf duyarlı"
+
+#: src/LYOptions.c:2237
+msgid "prompt normally"
+msgstr "normal bilgi istemi"
+
+#: src/LYOptions.c:2238
+msgid "force yes-response"
+msgstr "evet-yanıtına zorla"
+
+#: src/LYOptions.c:2239
+msgid "force no-response"
+msgstr "hayır-yanıtına zorla"
+
+#: src/LYOptions.c:2249
+msgid "RFC 2109"
+msgstr "RFC 2109"
+
+#: src/LYOptions.c:2250
+msgid "RFC 2965"
+msgstr "RFC 2965"
+
+#: src/LYOptions.c:2251
+msgid "RFC 6265"
+msgstr "RFC 6265"
+
+#: src/LYOptions.c:2268
+msgid "Novice"
+msgstr "Acemi"
+
+#: src/LYOptions.c:2269
+msgid "Intermediate"
+msgstr "Orta düzey"
+
+#: src/LYOptions.c:2270
+msgid "Advanced"
+msgstr "İleri düzey"
+
+#: src/LYOptions.c:2279
+msgid "By First Visit"
+msgstr "Ä°lk Ziyaretle"
+
+#: src/LYOptions.c:2281
+msgid "By First Visit Reversed"
+msgstr "Ä°lk Ziyaretle-Tersten"
+
+#: src/LYOptions.c:2282
+msgid "As Visit Tree"
+msgstr "Ziyaret Ağacı Gibi"
+
+#: src/LYOptions.c:2283
+msgid "By Last Visit"
+msgstr "Son Ziyaretle"
+
+#: src/LYOptions.c:2285
+msgid "By Last Visit Reversed"
+msgstr "Son Ziyaretle-Tersten"
+
+#. Old_DTD variable
+#: src/LYOptions.c:2296
+msgid "relaxed (TagSoup mode)"
+msgstr "gevÅŸek (TagSoup kipi)"
+
+#: src/LYOptions.c:2297
+msgid "strict (SortaSGML mode)"
+msgstr "katı (SortaSGML kipi)"
+
+#: src/LYOptions.c:2304
+msgid "Ignore"
+msgstr "Yoksay"
+
+#: src/LYOptions.c:2305
+msgid "Add to trace-file"
+msgstr "İz dosyasına ekle"
+
+#: src/LYOptions.c:2306
+msgid "Add to LYNXMESSAGES"
+msgstr "LYNXMESSAGES'a ekle"
+
+#: src/LYOptions.c:2307
+msgid "Warn, point to trace-file"
+msgstr "Uyar, iz dosyasına yönlendir"
+
+#: src/LYOptions.c:2314
+msgid "as labels"
+msgstr "etiket gibi"
+
+#: src/LYOptions.c:2315
+msgid "as links"
+msgstr "link gibi"
+
+#: src/LYOptions.c:2322
+msgid "show filename"
+msgstr "dosya adını göster"
+
+#: src/LYOptions.c:2331
+msgid "collapse"
+msgstr "daralt"
+
+#: src/LYOptions.c:2340
+msgid "trim-lines"
+msgstr "kesme-satırları"
+
+#: src/LYOptions.c:2351
+msgid "STANDARD"
+msgstr "STANDART"
+
+#: src/LYOptions.c:2352
+msgid "ADVANCED"
+msgstr "Ä°LERÄ° DÃœZEY"
+
+#: src/LYOptions.c:2374
+msgid "IDNA 2003"
+msgstr "IDNA 2003"
+
+#: src/LYOptions.c:2375
+msgid "IDNA 2008"
+msgstr "IDNA 2008"
+
+#: src/LYOptions.c:2376
+msgid "IDNA TR46"
+msgstr "IDNA TR46"
+
+#: src/LYOptions.c:2377
+msgid "IDNA Compatible"
+msgstr "IDNA uyumlu"
+
+#: src/LYOptions.c:2398
+msgid "Directories first"
+msgstr "Önce dizinler"
+
+#: src/LYOptions.c:2399
+msgid "Files first"
+msgstr "Önce dosyalar"
+
+#: src/LYOptions.c:2400
+msgid "Mixed style"
+msgstr "Karışık stil"
+
+#: src/LYOptions.c:2408 src/LYOptions.c:2428
+msgid "By Name"
+msgstr "Ä°simle"
+
+#: src/LYOptions.c:2409 src/LYOptions.c:2429
+msgid "By Type"
+msgstr "Türle"
+
+#: src/LYOptions.c:2410 src/LYOptions.c:2430
+msgid "By Size"
+msgstr "Boyutla"
+
+#: src/LYOptions.c:2411 src/LYOptions.c:2431
+msgid "By Date"
+msgstr "Tarihle"
+
+#: src/LYOptions.c:2412
+msgid "By Mode"
+msgstr "Kiple"
+
+#: src/LYOptions.c:2414
+msgid "By User"
+msgstr "Kullanıcıyla"
+
+#: src/LYOptions.c:2415
+msgid "By Group"
+msgstr "Grupla"
+
+#: src/LYOptions.c:2440
+msgid "Do not show rate"
+msgstr "Hızı gösterme"
+
+#: src/LYOptions.c:2441 src/LYOptions.c:2442
+#, c-format
+msgid "Show %s/sec rate"
+msgstr "%s/sn hızını göster"
+
+#: src/LYOptions.c:2444 src/LYOptions.c:2445
+#, c-format
+msgid "Show %s/sec, ETA"
+msgstr "%s/sn'yi göster, ETA"
+
+#: src/LYOptions.c:2446 src/LYOptions.c:2447
+#, c-format
+msgid "Show %s/sec (2-digits), ETA"
+msgstr "%s/sn'yi (2-basamaklı) göster, ETA"
+
+#: src/LYOptions.c:2450
+msgid "Show progressbar"
+msgstr "Gelişim çubuğunu göster"
+
+#: src/LYOptions.c:2471
+msgid "Accept lynx's internal types"
+msgstr "Lynx'in dahili türlerini kabul et"
+
+#: src/LYOptions.c:2472
+msgid "Also accept lynx.cfg's types"
+msgstr "Lynx cfg'nin türlerini de kabul et"
+
+#: src/LYOptions.c:2473
+msgid "Also accept user's types"
+msgstr "Kullanıcının türlerini de kabul et"
+
+#: src/LYOptions.c:2474
+msgid "Also accept system's types"
+msgstr "Sistemin türlerini de kabul et"
+
+#: src/LYOptions.c:2475
+msgid "Accept all types"
+msgstr "Tüm türleri kabul et"
+
+#: src/LYOptions.c:2484
+msgid "gzip"
+msgstr "gzip"
+
+#: src/LYOptions.c:2485
+msgid "deflate"
+msgstr "söndür"
+
+#: src/LYOptions.c:2488
+msgid "compress"
+msgstr "sıkıştır"
+
+#: src/LYOptions.c:2491
+msgid "bzip2"
+msgstr "bzip2"
+
+#: src/LYOptions.c:2493
+msgid "All"
+msgstr "Tümü"
+
+#: src/LYOptions.c:2503
+msgid "HTTP 1.0"
+msgstr "HTTP 1.0"
+
+#: src/LYOptions.c:2504
+msgid "HTTP 1.1"
+msgstr "HTTP 1.1"
+
+#: src/LYOptions.c:2863 src/LYOptions.c:2892
+#, c-format
+msgid "Use %s to invoke the Options menu!"
+msgstr "Seçenekler menüsünü çağırmak için %s kullanınız!"
+
+#: src/LYOptions.c:3789
+msgid "(options marked with (!) will not be saved)"
+msgstr "((!) ile işaretlenmiş seçenekler kaydedilmeyecek)"
+
+#: src/LYOptions.c:3797
+msgid "General Preferences"
+msgstr "Genel Tercihler"
+
+#. ***************************************************************
+#. User Mode: SELECT
+#: src/LYOptions.c:3801
+msgid "User mode"
+msgstr "Kullanıcı kipi"
+
+#. Editor: INPUT
+#: src/LYOptions.c:3807
+msgid "Editor"
+msgstr "Düzenleyici"
+
+#. Search Type: SELECT
+#: src/LYOptions.c:3812
+msgid "Type of Search"
+msgstr "Arama Tipi"
+
+#: src/LYOptions.c:3817
+msgid "Security and Privacy"
+msgstr "Güvenlik ve Mahremiyet"
+
+#. ***************************************************************
+#. Cookies: SELECT
+#: src/LYOptions.c:3821
+msgid "Cookies"
+msgstr "Çerezler"
+
+#. Cookie Version: SELECT
+#: src/LYOptions.c:3835
+msgid "Cookie RFC-version"
+msgstr "Çerez RFC-versiyon"
+
+#. Cookie Prompting: SELECT
+#: src/LYOptions.c:3841
+msgid "Invalid-Cookie Prompting"
+msgstr "Geçersiz Çerez Bilgi İstemi"
+
+#. SSL Prompting: SELECT
+#: src/LYOptions.c:3848
+msgid "SSL Prompting"
+msgstr "SSL Bilgi Ä°stemi"
+
+#: src/LYOptions.c:3853
+msgid "SSL client certificate file"
+msgstr "SSL istemci sertifika dosyası"
+
+#: src/LYOptions.c:3857
+msgid "SSL client key file"
+msgstr "SSL istemci anahtar dosyası"
+
+#: src/LYOptions.c:3863
+msgid "Keyboard Input"
+msgstr "Klavye Girdisi"
+
+#. ***************************************************************
+#. Keypad Mode: SELECT
+#: src/LYOptions.c:3867
+msgid "Keypad mode"
+msgstr "Mini klavye(keypad) kipi"
+
+#. Emacs keys: ON/OFF
+#: src/LYOptions.c:3873
+msgid "Emacs keys"
+msgstr "Emacs tuşları"
+
+#. VI Keys: ON/OFF
+#: src/LYOptions.c:3879
+msgid "VI keys"
+msgstr "VI tuşları"
+
+#. Line edit style: SELECT
+#. well, at least 2 line edit styles available
+#: src/LYOptions.c:3886
+msgid "Line edit style"
+msgstr "Satır düzenleme stili"
+
+#. Keyboard layout: SELECT
+#: src/LYOptions.c:3898
+msgid "Keyboard layout"
+msgstr "Klavye yerleÅŸimi"
+
+#.
+#. * Display and Character Set
+#.
+#: src/LYOptions.c:3912
+msgid "Display and Character Set"
+msgstr "Görüntüleme ve Karakter Kümesi"
+
+#. Use locale-based character set: ON/OFF
+#: src/LYOptions.c:3917
+msgid "Use locale-based character set"
+msgstr "Yerel tabanlı karakter kümesini kullan"
+
+#: src/LYOptions.c:3924
+msgid "Use HTML5 charset replacements"
+msgstr "HTML5 karakter setini kullan"
+
+#. Display Character Set: SELECT
+#: src/LYOptions.c:3930
+msgid "Display character set"
+msgstr "Karakter kümesini görüntüle"
+
+#: src/LYOptions.c:3961
+msgid "Assumed document character set"
+msgstr "Varsayılan belge karakter kümesi"
+
+#: src/LYOptions.c:3977
+msgid "Internationalized domain names"
+msgstr "Uluslararasılaştırılmış alan adları"
+
+#.
+#. * Since CJK people hardly mixed with other world
+#. * we split the header to make it more readable:
+#. * "CJK mode" for CJK display charsets, and "Raw 8-bit" for others.
+#.
+#: src/LYOptions.c:3995
+msgid "CJK mode"
+msgstr "CJK kipi"
+
+#: src/LYOptions.c:3997
+msgid "Raw 8-bit"
+msgstr "Ham 8-bit"
+
+#. X Display: INPUT
+#: src/LYOptions.c:4005
+msgid "X Display"
+msgstr "X Görüntüleme"
+
+#.
+#. * Document Appearance
+#.
+#: src/LYOptions.c:4011
+msgid "Document Appearance"
+msgstr "Belge Görünümü"
+
+#: src/LYOptions.c:4017
+msgid "Show color"
+msgstr "Renkleri göster"
+
+#: src/LYOptions.c:4043
+msgid "Color style"
+msgstr "Renk stili"
+
+#: src/LYOptions.c:4053
+msgid "Default colors"
+msgstr "Öntanımlı renkler"
+
+#. Show cursor: ON/OFF
+#: src/LYOptions.c:4061
+msgid "Show cursor"
+msgstr "İmleci göster"
+
+#. Underline links: ON/OFF
+#: src/LYOptions.c:4067
+msgid "Underline links"
+msgstr "Linklerin altı çizili"
+
+#. Show scrollbar: ON/OFF
+#: src/LYOptions.c:4074
+msgid "Show scrollbar"
+msgstr "Kaydırma çubuğunu göster"
+
+#. Select Popups: ON/OFF
+#: src/LYOptions.c:4081
+msgid "Popups for select fields"
+msgstr "Seçme alanlar için açılırlar(popups)"
+
+#. HTML error recovery: SELECT
+#: src/LYOptions.c:4087
+msgid "HTML error recovery"
+msgstr "HTML hata kurtarma"
+
+#. Bad HTML messages: SELECT
+#: src/LYOptions.c:4093
+msgid "Bad HTML messages"
+msgstr "Kötü HTML mesajları"
+
+#. Show Images: SELECT
+#: src/LYOptions.c:4099
+msgid "Show images"
+msgstr "Resimleri göster"
+
+#. Verbose Images: ON/OFF
+#: src/LYOptions.c:4113
+msgid "Verbose images"
+msgstr "Resimleri dillendir"
+
+#. Collapse BR Tags: ON/OFF
+#: src/LYOptions.c:4119
+msgid "Collapse BR tags"
+msgstr "BR etiketler daralt"
+
+#. Trim blank lines: ON/OFF
+#: src/LYOptions.c:4125
+msgid "Trim blank lines"
+msgstr "Boş satırlar düzelt"
+
+#.
+#. * Headers Transferred to Remote Servers
+#.
+#: src/LYOptions.c:4133
+msgid "Headers Transferred to Remote Servers"
+msgstr "Başlıklar Karşı Sunuculara Aktarıldı"
+
+#. ***************************************************************
+#. Mail Address: INPUT
+#: src/LYOptions.c:4137
+msgid "Personal mail address"
+msgstr "KiÅŸisel mektup adresi"
+
+#: src/LYOptions.c:4142
+msgid "Personal name for mail"
+msgstr "Posta için kişisel ad"
+
+#: src/LYOptions.c:4149
+msgid "Password for anonymous ftp"
+msgstr "Anonim ftp için parola"
+
+#. Preferred content type: SELECT
+#: src/LYOptions.c:4155
+msgid "Preferred content type"
+msgstr "Tercih edilen içerik türü"
+
+#. Preferred media type: SELECT
+#: src/LYOptions.c:4161
+msgid "Preferred media type"
+msgstr "Tercih edilen ortam türü"
+
+#. Preferred encoding: SELECT
+#: src/LYOptions.c:4167
+msgid "Preferred encoding"
+msgstr "Tercih edilen kodlama"
+
+#. Preferred Document Character Set: INPUT
+#: src/LYOptions.c:4173
+msgid "Preferred document character set"
+msgstr "Tercih edilen belge karakter kümesi"
+
+#. Preferred Document Language: INPUT
+#: src/LYOptions.c:4178
+msgid "Preferred document language"
+msgstr "Tercih edilen belge dili"
+
+#. HTTP protocol SELECT
+#: src/LYOptions.c:4183
+msgid "HTTP protocol"
+msgstr "HTTP iletişim kuralı"
+
+#: src/LYOptions.c:4190
+msgid "Send User-Agent header"
+msgstr "Kullanıcı-Ajanı başlığını gönder"
+
+#: src/LYOptions.c:4192
+msgid "User-Agent header"
+msgstr "Kullanıcı-Ajanı başlığı"
+
+#.
+#. * Listing and Accessing Files
+#.
+#: src/LYOptions.c:4200
+msgid "Listing and Accessing Files"
+msgstr "Dosya Listeleme ve EriÅŸim"
+
+#. FTP sort: SELECT
+#: src/LYOptions.c:4205
+msgid "Use Passive FTP"
+msgstr "Edilgen FTP Kullan"
+
+#. FTP sort: SELECT
+#: src/LYOptions.c:4211
+msgid "FTP sort criteria"
+msgstr "FTP sıralama ölçütleri"
+
+#. Local Directory Sort: SELECT
+#: src/LYOptions.c:4219
+msgid "Local directory sort criteria"
+msgstr "Yerel dizin sıralama ölçütleri"
+
+#. Local Directory Order: SELECT
+#: src/LYOptions.c:4225
+msgid "Local directory sort order"
+msgstr "Yerel dizin sıralama ölçütleri"
+
+#: src/LYOptions.c:4234
+msgid "Show dot files"
+msgstr "Nokta dosyaları göster"
+
+#: src/LYOptions.c:4242
+msgid "Execution links"
+msgstr "Ä°cra linkleri"
+
+#: src/LYOptions.c:4260
+msgid "Pause when showing message"
+msgstr "Mesajı gösterirken durakla"
+
+#. Show transfer rate: SELECT
+#: src/LYOptions.c:4267
+msgid "Show transfer rate"
+msgstr "Aktarım hızını göster"
+
+#.
+#. * Special Files and Screens
+#.
+#: src/LYOptions.c:4287
+msgid "Special Files and Screens"
+msgstr "Özel Dosyalar ve Ekranlar"
+
+#: src/LYOptions.c:4292
+msgid "Multi-bookmarks"
+msgstr "Çoklu-yer imleri"
+
+#: src/LYOptions.c:4300
+msgid "Review/edit Bookmarks files"
+msgstr "Yer İmi dosyalarını gözden geçir/düzenle"
+
+#: src/LYOptions.c:4303
+msgid "Goto multi-bookmark menu"
+msgstr "Çoklu-yer imi menüsüne git"
+
+#: src/LYOptions.c:4305
+msgid "Bookmarks file"
+msgstr "Yer İmleri dosyası"
+
+#. Auto Session: ON/OFF
+#: src/LYOptions.c:4312
+msgid "Auto Session"
+msgstr "Otomatik Oturum"
+
+#. Session File Menu: INPUT
+#: src/LYOptions.c:4318
+msgid "Session file"
+msgstr "Oturum dosyası"
+
+#. Visited Pages: SELECT
+#: src/LYOptions.c:4324
+msgid "Visited Pages"
+msgstr "UÄŸranan Sayfalar"
+
+#: src/LYOptions.c:4329
+msgid "View the file "
+msgstr "Dosyayı görüntüle "
+
+#: src/LYPrint.c:956
+#, c-format
+msgid " Print job complete.\n"
+msgstr " Yazdırma işi tamamlandı.\n"
+
+#: src/LYPrint.c:1283
+msgid "Document:"
+msgstr "Belge:"
+
+#: src/LYPrint.c:1284
+msgid "Number of lines:"
+msgstr "Satır sayısı:"
+
+#: src/LYPrint.c:1285
+msgid "Number of pages:"
+msgstr "Sayfa sayısı:"
+
+#: src/LYPrint.c:1286
+msgid "pages"
+msgstr "sayfa"
+
+#: src/LYPrint.c:1286
+msgid "page"
+msgstr "sayfa"
+
+#: src/LYPrint.c:1287
+msgid "(approximately)"
+msgstr "(yaklaşık)"
+
+#: src/LYPrint.c:1294
+msgid "Some print functions have been disabled!"
+msgstr "Bazı yazdırma işlevleri devre dışı!"
+
+#: src/LYPrint.c:1298
+msgid "Standard print options:"
+msgstr "Standart yazdırma seçenekleri:"
+
+#: src/LYPrint.c:1299
+msgid "Print options:"
+msgstr "Yazdırma seçenekleri:"
+
+#: src/LYPrint.c:1306
+msgid "Save to a local file"
+msgstr "Yerel bir dosyaya kaydet"
+
+#: src/LYPrint.c:1308
+msgid "Save to disk disabled"
+msgstr "Diske kaydetme devre dışı"
+
+#: src/LYPrint.c:1315
+msgid "Mail the file"
+msgstr "Dosyayı postala"
+
+#: src/LYPrint.c:1322
+msgid "Print to the screen"
+msgstr "Ekrana yazdır"
+
+#: src/LYPrint.c:1327
+msgid "Print out on a printer attached to your vt100 terminal"
+msgstr "Vt100 uçbiriminize bağlı bir yazıcıya yazdırın"
+
+#: src/LYReadCFG.c:437
+#, c-format
+msgid ""
+"Syntax Error parsing COLOR in configuration file:\n"
+"The line must be of the form:\n"
+"COLOR:INTEGER:FOREGROUND:BACKGROUND\n"
+"\n"
+"Here FOREGROUND and BACKGROUND must be one of:\n"
+"The special strings 'nocolor' or 'default', or\n"
+msgstr ""
+"Ayarlama dosyasında RENK ayrıştırma Betik Hatası:\n"
+"Satır şu şekilde olmalıdır:\n"
+"RENK:TAMSAYI:ÖNPLAN:ARKAPLAN\n"
+"\n"
+"Burada ÖNPLAN ve ARKAPLAN özel dizgeler olan\n"
+"'nocolor' ya da 'default' (ya da) 'dan biri olmalıdır\n"
+
+#: src/LYReadCFG.c:450
+msgid "Offending line:"
+msgstr "İncitici satır:"
+
+#: src/LYReadCFG.c:764
+#, c-format
+msgid "key remapping of %s to %s for %s failed\n"
+msgstr "%s'in %s'e tuş yeniden eşlemlemesi %s kez başarısız\n"
+
+#: src/LYReadCFG.c:771
+#, c-format
+msgid "key remapping of %s to %s failed\n"
+msgstr "%s'in %s'e tuş yeniden eşlemlemesi başarısız\n"
+
+#: src/LYReadCFG.c:792
+#, c-format
+msgid "invalid line-editor selection %s for key %s, selecting all\n"
+msgstr "%2$s tuşu için geçersiz satır-düzenleyici seçimi %1$s, tümü seçiliyor\n"
+
+#: src/LYReadCFG.c:817 src/LYReadCFG.c:832
+#, c-format
+msgid "setting of line-editor binding for key %s (0x%x) to 0x%x for %s failed\n"
+msgstr "%s (0x%x) tuşu için 0x%x'e satır-düzenleyici bağlantısı kurulması %s kez başarısız\n"
+
+#: src/LYReadCFG.c:839
+#, c-format
+msgid "setting of line-editor binding for key %s (0x%x) for %s failed\n"
+msgstr "%s (0x%x) tuşu için satır-düzenleyici bağlantısı kurulması %s kez başarısız\n"
+
+#: src/LYReadCFG.c:937
+#, c-format
+msgid "Lynx: cannot start, CERN rules file %s is not available\n"
+msgstr "Lynx: başlayamıyor, CERN kuralları dosyası %s temin edilemiyor\n"
+
+#: src/LYReadCFG.c:938
+msgid "(no name)"
+msgstr "(isimsiz)"
+
+#: src/LYReadCFG.c:2086
+#, c-format
+msgid "More than %d nested lynx.cfg includes -- perhaps there is a loop?!?\n"
+msgstr "Lynx.cfg içermeleri %d'den çok içiçe geçmiş -- belki bir döngü olmasın?!?\n"
+
+#: src/LYReadCFG.c:2088
+#, c-format
+msgid "Last attempted include was '%s',\n"
+msgstr "Son kalkışılan içerme '%s' idi,\n"
+
+#: src/LYReadCFG.c:2089
+#, c-format
+msgid "included from '%s'.\n"
+msgstr "'%s'den içerilmişti.\n"
+
+#: src/LYReadCFG.c:2500 src/LYReadCFG.c:2513 src/LYReadCFG.c:2571
+msgid "The following is read from your lynx.cfg file."
+msgstr "Aşağıdaki, lynx.cfg dosyanızdan okunmuştur."
+
+#: src/LYReadCFG.c:2501 src/LYReadCFG.c:2514
+msgid "Please read the distribution"
+msgstr "Lütfen daha fazla yorum için"
+
+#: src/LYReadCFG.c:2507 src/LYReadCFG.c:2517
+msgid "for more comments."
+msgstr "dağıtımı okuyunuz."
+
+#: src/LYReadCFG.c:2553
+msgid "RELOAD THE CHANGES"
+msgstr "DEĞİŞİKLİKLERİ YENİDEN YÜKLE"
+
+#: src/LYReadCFG.c:2561
+msgid "Your primary configuration"
+msgstr "Birincil ayarlarınız"
+
+#: src/LYShowInfo.c:116
+msgid "URL:"
+msgstr "URL:"
+
+#: src/LYShowInfo.c:200
+msgid "Directory that you are currently viewing"
+msgstr "Halen görüntülediğiniz dizin"
+
+#: src/LYShowInfo.c:203
+msgid "Name:"
+msgstr "Ä°sim:"
+
+#: src/LYShowInfo.c:220
+msgid "Directory that you have currently selected"
+msgstr "Halen seçilmiş dizin"
+
+#: src/LYShowInfo.c:222
+msgid "File that you have currently selected"
+msgstr "Halen seçilmiş dosya"
+
+#: src/LYShowInfo.c:225
+msgid "Symbolic link that you have currently selected"
+msgstr "Halen seçilmiş simgesel link"
+
+#: src/LYShowInfo.c:228
+msgid "Item that you have currently selected"
+msgstr "Halen seçilmiş öğe"
+
+#: src/LYShowInfo.c:230
+msgid "Full name:"
+msgstr "Tam isim:"
+
+#: src/LYShowInfo.c:243
+msgid "Unable to follow link"
+msgstr "Link takip edilemiyor"
+
+#: src/LYShowInfo.c:245
+msgid "Points to file:"
+msgstr "Ä°mlediÄŸi dosya:"
+
+#: src/LYShowInfo.c:250
+msgid "Name of owner:"
+msgstr "Sahibinin adı:"
+
+#: src/LYShowInfo.c:253
+msgid "Group name:"
+msgstr "Grup adı:"
+
+#: src/LYShowInfo.c:255
+msgid "File size:"
+msgstr "Dosya boyutu:"
+
+#: src/LYShowInfo.c:257
+msgid "(bytes)"
+msgstr "(bayt)"
+
+#.
+#. * Include date and time information.
+#.
+#: src/LYShowInfo.c:262
+msgid "Creation date:"
+msgstr "OluÅŸturulma tarihi:"
+
+#: src/LYShowInfo.c:265
+msgid "Last modified:"
+msgstr "Son deÄŸiÅŸiklik:"
+
+#: src/LYShowInfo.c:268
+msgid "Last accessed:"
+msgstr "Son eriÅŸim:"
+
+#: src/LYShowInfo.c:274
+msgid "Access Permissions"
+msgstr "EriÅŸim Ä°zinleri"
+
+#: src/LYShowInfo.c:309
+msgid "Group:"
+msgstr "Grup:"
+
+#: src/LYShowInfo.c:329
+msgid "World:"
+msgstr "Dünya:"
+
+#: src/LYShowInfo.c:336
+msgid "File that you are currently viewing"
+msgstr "Halen görüntülediğiniz dosya"
+
+#: src/LYShowInfo.c:344 src/LYShowInfo.c:444
+msgid "Linkname:"
+msgstr "Link adı:"
+
+#: src/LYShowInfo.c:350 src/LYShowInfo.c:365
+msgid "Charset:"
+msgstr "Karakter Kümesi:"
+
+#: src/LYShowInfo.c:364
+msgid "(assumed)"
+msgstr "(varsayıldı)"
+
+#: src/LYShowInfo.c:371
+msgid "Server:"
+msgstr "Sunucu:"
+
+#: src/LYShowInfo.c:374
+msgid "Date:"
+msgstr "Tarih:"
+
+#: src/LYShowInfo.c:377
+msgid "Last Mod:"
+msgstr "Son Kip:"
+
+#: src/LYShowInfo.c:381
+msgid "Expires:"
+msgstr "Zamanaşımı tarihi:"
+
+#: src/LYShowInfo.c:384
+msgid "Cache-Control:"
+msgstr "Önbellek-Konrolü:"
+
+#: src/LYShowInfo.c:387
+msgid "Content-Length:"
+msgstr "İçerik Uzunluğu:"
+
+#: src/LYShowInfo.c:391
+msgid "Length:"
+msgstr "Uzunluk:"
+
+#: src/LYShowInfo.c:396
+msgid "Language:"
+msgstr "Dil:"
+
+#: src/LYShowInfo.c:402
+msgid "Post Data:"
+msgstr "Post Verisi:"
+
+#: src/LYShowInfo.c:405
+msgid "Post Content Type:"
+msgstr "Post İçerik Tipi:"
+
+#: src/LYShowInfo.c:408
+msgid "Owner(s):"
+msgstr "Sahip(ler):"
+
+#: src/LYShowInfo.c:413
+msgid "size:"
+msgstr "boyut:"
+
+#: src/LYShowInfo.c:415
+msgid "lines"
+msgstr "satır"
+
+#: src/LYShowInfo.c:419
+msgid "forms mode"
+msgstr "form kipi"
+
+#: src/LYShowInfo.c:421
+msgid "source"
+msgstr "kaynak"
+
+#: src/LYShowInfo.c:422
+msgid "normal"
+msgstr "normal"
+
+#: src/LYShowInfo.c:424
+msgid ", safe"
+msgstr ", güvenli"
+
+#: src/LYShowInfo.c:426
+msgid ", via internal link"
+msgstr ", dahili link aracılığıyla"
+
+#: src/LYShowInfo.c:430
+msgid ", no-cache"
+msgstr ", ön belleksiz"
+
+#: src/LYShowInfo.c:432
+msgid ", ISMAP script"
+msgstr ", ISMAP betiÄŸi"
+
+#: src/LYShowInfo.c:434
+msgid ", bookmark file"
+msgstr ", yer imi dosyası"
+
+#: src/LYShowInfo.c:437
+msgid "mode:"
+msgstr "kip:"
+
+#: src/LYShowInfo.c:443
+msgid "Link that you currently have selected"
+msgstr "Halen seçmiş olduğunuz link"
+
+#: src/LYShowInfo.c:452
+msgid "Method:"
+msgstr "Yöntem:"
+
+#: src/LYShowInfo.c:456
+msgid "Enctype:"
+msgstr "Enctipi:"
+
+#: src/LYShowInfo.c:462
+msgid "Action:"
+msgstr "Eylem:"
+
+#: src/LYShowInfo.c:468
+msgid "(Form field)"
+msgstr "(Form alanı)"
+
+#: src/LYShowInfo.c:478
+msgid "No Links on the current page"
+msgstr "Mevcut sayfada link yok"
+
+#: src/LYShowInfo.c:483
+msgid "Server Headers:"
+msgstr "Sunucu Başlıkları:"
+
+#: src/LYStyle.c:332
+#, c-format
+msgid ""
+"Syntax Error parsing style in lss file:\n"
+"[%s]\n"
+"The line must be of the form:\n"
+"OBJECT:MONO:COLOR (ie em:bold:brightblue:white)\n"
+"where OBJECT is one of EM,STRONG,B,I,U,BLINK etc.\n"
+"\n"
+msgstr ""
+"Lss dosyası tarz ayrıştırma Betik Hatası:\n"
+"[%s]\n"
+"Satır şu şekilde olmalıdır:\n"
+"NESNE:MONO:RENK (yani em:kalın:açıkmavi:beyaz)\n"
+"burada NESNE EM,STRONG,B,I,U,BLINK vs'den biri olmalıdır.\n"
+"\n"
+
+#: src/LYStyle.c:941
+#, c-format
+msgid ""
+"\n"
+"Lynx file \"%s\" is not available.\n"
+"\n"
+msgstr ""
+"\n"
+"Lynx dosyası \"%s\" temin edilemiyor.\n"
+"\n"
+
+#: src/LYTraversal.c:111
+msgid "here is a list of the history stack so that you may rebuild"
+msgstr "yeniden yapılandırabilmeniz için işte bir tarihçe yığını listesi"
+
+#: src/LYUpload.c:77
+msgid "ERROR! - upload command is misconfigured"
+msgstr "HATA! - yükle komutu yanlış ayarlanmış"
+
+#: src/LYUpload.c:98
+msgid "Illegal redirection \"../\" found! Request ignored."
+msgstr "Kuraldışı yeniden yönlendirme \" /\" bulundu! İstem yoksayıldı."
+
+#: src/LYUpload.c:101
+msgid "Illegal character \"/\" found! Request ignored."
+msgstr "Kuraldışı karakter \"/\" bulundu! İstem yoksayıldı."
+
+#: src/LYUpload.c:104
+msgid "Illegal redirection using \"~\" found! Request ignored."
+msgstr "\"~\" kullanan kuraldışı yeniden yönlendirme bulundu! İstem yoksayıldı."
+
+#: src/LYUpload.c:157
+msgid "Unable to upload file."
+msgstr "Dosya yüklenemiyor."
+
+#: src/LYUpload.c:196
+msgid "Upload To:"
+msgstr "Yüklenecek yer:"
+
+#: src/LYUpload.c:197
+msgid "Upload options:"
+msgstr "Yükleme seçenekleri:"
+
+#: src/LYUtils.c:1911
+msgid "Download document URL put to clipboard."
+msgstr "Belge indirme URL'sini panoya koy."
+
+#: src/LYUtils.c:2658
+msgid "Unexpected access protocol for this URL scheme."
+msgstr "Bu URL şeması için umulmadık erişim protokolü."
+
+#: src/LYUtils.c:3571
+msgid "Too many tempfiles"
+msgstr "Çok sayıda geçici dosya"
+
+#: src/LYUtils.c:3871
+msgid "unknown restriction"
+msgstr "bilinmeyen kısıtlama"
+
+#: src/LYUtils.c:3902
+#, c-format
+msgid "No restrictions set.\n"
+msgstr "Hiçbir kısıtlama kurulmamış.\n"
+
+#: src/LYUtils.c:3905
+#, c-format
+msgid "Restrictions set:\n"
+msgstr "Kurulmuş kısıtlamalar:\n"
+
+#: src/LYUtils.c:5202
+msgid "Cannot find HOME directory"
+msgstr "EV dizini bulunamıyor"
+
+#: src/LYrcFile.c:16
+msgid "Normally disabled. See ENABLE_LYNXRC in lynx.cfg\n"
+msgstr "Normalde devre dışıdır. Bkz. lynx.cfg'de ENABLE_LYNXRC\n"
+
+#: src/LYrcFile.c:373
+msgid ""
+"accept_all_cookies allows the user to tell Lynx to automatically\n"
+"accept all cookies if desired. The default is \"FALSE\" which will\n"
+"prompt for each cookie. Set accept_all_cookies to \"TRUE\" to accept\n"
+"all cookies.\n"
+msgstr ""
+"accept_all_cookies, arzu edildiğinde kullanıcının Lynx'e tüm çerezleri\n"
+"otomatikman kabul etmesini söylemesini sağlar. Öntanımlı \"FALSE\" (yanlış)\n"
+"olup, her çerez için sorulmasını sağlar. Tüm çerezleri kabul etmek için\n"
+"accept_all_cookies'i \"TRUE\" (doğru)ya ayarlayın.\n"
+
+#: src/LYrcFile.c:381
+msgid ""
+"anonftp_password allows the user to tell Lynx to use the personal\n"
+"email address as the password for anonymous ftp. If no value is given,\n"
+"Lynx will use the personal email address. Set anonftp_password\n"
+"to a different value if you choose.\n"
+msgstr ""
+"anonftp_password ile kullanıcı Lynx'e kişisel e-posta adresini\n"
+"anonim ftp için parola olarak kullanmasını bildirir. Eğer bir değer verilmezse,\n"
+"Lynx kişisel e-posta adresini kullanacaktır. anonftp_password'ü başka bir değere kurmayı seçebilirsiniz.\n"
+
+#: src/LYrcFile.c:390
+msgid ""
+"bookmark_file specifies the name and location of the default bookmark\n"
+"file into which the user can paste links for easy access at a later\n"
+"date.\n"
+msgstr ""
+"bookmark_file, kullanıcının daha sonraki bir tarihte kolay erişim\n"
+"için linkleri içine yapıştırdığı öntanımlı yer imi dosyasının adı\n"
+"ve konumunu belirtir.\n"
+
+#: src/LYrcFile.c:395
+msgid ""
+"If case_sensitive_searching is \"on\" then when the user invokes a search\n"
+"using the 's' or '/' keys, the search performed will be case sensitive\n"
+"instead of case INsensitive. The default is usually \"off\".\n"
+msgstr ""
+"Case_sensitive_searching \"on\" (açık)a ayarlanmışsa, kullanıcı 's' ya da '/' tuşlarıyla\n"
+"bir arama başlattığında, arama büyük/küçük harfe duyarSIZ olmak yerine duyarlı\n"
+"olarak yapılacaktır. Öntanımlısı genellikle \"off\" (kapalı)dır.\n"
+
+#: src/LYrcFile.c:400
+msgid ""
+"The character_set definition controls the representation of 8 bit\n"
+"characters for your terminal. If 8 bit characters do not show up\n"
+"correctly on your screen you may try changing to a different 8 bit\n"
+"set or using the 7 bit character approximations.\n"
+"Current valid characters sets are:\n"
+msgstr ""
+"Character_set tanımı 8 bit karakterlerin uçbiriminizde gösterilmesini\n"
+"denetler. Eğer ekranınızda 8 bit karakterler doğru şekilde\n"
+"gösterilmiyorsa başka bir 8 bit kümesi ya da 7 bit karakter\n"
+"yaklaşıklıklarını deneyebilirsiniz.\n"
+"Mevcut geçerli karakter kümeleri şunlardır:\n"
+
+#: src/LYrcFile.c:408
+msgid ""
+"cookie_accept_domains and cookie_reject_domains are comma-delimited\n"
+"lists of domains from which Lynx should automatically accept or reject\n"
+"all cookies. If a domain is specified in both options, rejection will\n"
+"take precedence. The accept_all_cookies parameter will override any\n"
+"settings made here.\n"
+msgstr ""
+"cookie_accept_domains ve cookie_reject_domains, Lynx'in sırasıyla, otomatikman\n"
+"tüm çerezleri kabul ya da reddedeceği yörelerin virgülle ayrılmış\n"
+"listeleridir. Eğer bir yöre, her iki listede de belirtildiyse, reddetme\n"
+"öncelik taşır. accept_all_cookies parametresi, burada yapılan tüm ayarları\n"
+"geçersiz kılar.\n"
+
+#: src/LYrcFile.c:416
+msgid ""
+"cookie_file specifies the file from which to read persistent cookies.\n"
+"The default is ~/"
+msgstr ""
+"cookie_file kalıcı çerezlerin okunacağı dosyayı belirler.\n"
+"Öntanımlısı ~/'dir"
+
+#: src/LYrcFile.c:421
+msgid ""
+"cookie_loose_invalid_domains, cookie_strict_invalid_domains, and\n"
+"cookie_query_invalid_domains are comma-delimited lists of which domains\n"
+"should be subjected to varying degrees of validity checking. If a\n"
+"domain is set to strict checking, strict conformance to RFC2109 will\n"
+"be applied. A domain with loose checking will be allowed to set cookies\n"
+"with an invalid path or domain attribute. All domains will default to\n"
+"querying the user for an invalid path or domain.\n"
+msgstr ""
+"cookie_loose_invalid_domains, cookie_strict_invalid_domains ve\n"
+"cookie_query_invalid_domains, hangi yörenin hangi derecede geçerlilik\n"
+"kontrolüne uğrayacağını belirleyen virgülle ayrılmış yöre listeleridir.\n"
+"Eğer bir yöre katı(strict) kontrole tabi tutuluyorsa, RFC2109'a katı\n"
+"uyumluluk uygulanacaktır. Gevşek(loose) kontrollü bir yöreye, geçersiz\n"
+"yol ya da yöre öznitelikli çerez kurma izni verilir. Tüm yöreler, öntanımlı\n"
+"olarak, geçersiz bir yol ya da yöre (özniteliğini) kullanıcıya sorgulatır.\n"
+
+#: src/LYrcFile.c:435
+msgid ""
+"dir_list_order specifies the directory list order under DIRED_SUPPORT\n"
+"(if implemented). The default is \"ORDER_BY_NAME\"\n"
+msgstr ""
+"dir_list_order (eğer mevcutsa) DIRED_SUPPORT altındaki dizin listesi\n"
+"sırasını belirler. Öntanımlısı \"ORDER_BY_NAME\"'dir\n"
+
+#: src/LYrcFile.c:440
+msgid ""
+"dir_list_styles specifies the directory list style under DIRED_SUPPORT\n"
+"(if implemented). The default is \"MIXED_STYLE\", which sorts both\n"
+"files and directories together. \"FILES_FIRST\" lists files first and\n"
+"\"DIRECTORIES_FIRST\" lists directories first.\n"
+msgstr ""
+"dir_list_styles, (eğer yerine getirilmişse) DIRED_SUPPORT altında\n"
+"dizin liste tarzını belirler. Öntanımlı, \"MIXED_STYLE\" olup, dosya\n"
+"ve dizinleri birlikte sıralar. \"FILES_FIRST\" önce dosyaları,\n"
+"\"DIRECTORIES_FIRST\" önce dizinleri sıralar.\n"
+
+#: src/LYrcFile.c:448
+msgid ""
+"If emacs_keys is to \"on\" then the normal EMACS movement keys:\n"
+" ^N = down ^P = up\n"
+" ^B = left ^F = right\n"
+"will be enabled.\n"
+msgstr ""
+"Eğer emacs_keys \"on\" (açık)sa, o zaman normal EMACS gezinme tuşları olan\n"
+" ^N = aşağı ^P = yukarı\n"
+" ^B = sol ^F = saÄŸ\n"
+"etkinleÅŸtirilecektir.\n"
+
+#: src/LYrcFile.c:454
+msgid ""
+"file_editor specifies the editor to be invoked when editing local files\n"
+"or sending mail. If no editor is specified, then file editing is disabled\n"
+"unless it is activated from the command line, and the built-in line editor\n"
+"will be used for sending mail.\n"
+msgstr ""
+"file_editor yerel dosyalar düzenlenirken ya da posta gönderilirken\n"
+"çağrılacak düzenleyiciyi belirtir. Eğer bir düzenleyici belirtilmemişse, komut satırından\n"
+"etkinleştirilmedikçe dosya düzenleme devre dışı kalır ve posta göndermek için yerleşik satır\n"
+"düzenleyici kullanılır.\n"
+
+#: src/LYrcFile.c:461
+msgid ""
+"The file_sorting_method specifies which value to sort on when viewing\n"
+"file lists such as FTP directories. The options are:\n"
+" BY_FILENAME -- sorts on the name of the file\n"
+" BY_TYPE -- sorts on the type of the file\n"
+" BY_SIZE -- sorts on the size of the file\n"
+" BY_DATE -- sorts on the date of the file\n"
+msgstr ""
+"File_sorting_method, FTP dizinleri gibi dosya listeleri görüntülenirken\n"
+"hangi değere göre sıralama yapılacağını belirler. Seçenekler:\n"
+" BY_FILENAME -- dosya adına göre sıralar\n"
+" BY_TYPE -- dosya türüne göre sıralar\n"
+" BY_SIZE -- dosya boyutuna göre sıralar\n"
+" BY_DATE -- dosyanın tarihine göre sıralar\n"
+
+#: src/LYrcFile.c:492
+msgid ""
+"lineedit_mode specifies the key binding used for inputting strings in\n"
+"prompts and forms. If lineedit_mode is set to \"Default Binding\" then\n"
+"the following control characters are used for moving and deleting:\n"
+"\n"
+" Prev Next Enter = Accept input\n"
+" Move char: <- -> ^G = Cancel input\n"
+" Move word: ^P ^N ^U = Erase line\n"
+" Delete char: ^H ^R ^A = Beginning of line\n"
+" Delete word: ^B ^F ^E = End of line\n"
+"\n"
+"Current lineedit modes are:\n"
+msgstr ""
+"lineedit_mode, bilgi istemi ve formlara dizge girişi için kullanılan\n"
+"tuş karşılıklarını belirler. Eğer lineedit_mode \"Default Binding\"e\n"
+"ayarlanırsa, gezinme ve silme için aşağıdaki kontrol karakterleri kullanılır:\n"
+"\n"
+" Önceki Sonraki Enter = Girdiyi kabul et\n"
+" Kark'i taşı: <- -> ^G = Girdiyi iptal et\n"
+" Sözc'ü taşı: ^P ^N ^U = Satır sil\n"
+" Kark'i sil: ^H ^R ^A = Satır başı\n"
+" Sözc'ü sil: ^B ^F ^E = Satır sonu\n"
+"\n"
+"Mevcut satır düzenleme kipleri şunlardır:\n"
+
+#: src/LYrcFile.c:510
+msgid ""
+"The following allow you to define sub-bookmark files and descriptions.\n"
+"The format is multi_bookmark<capital_letter>=<filename>,<description>\n"
+"Up to 26 bookmark files (for the English capital letters) are allowed.\n"
+"We start with \"multi_bookmarkB\" since 'A' is the default (see above).\n"
+msgstr ""
+"Aşağıdaki, sizin alt-yer imi dosya ve açıklamalarını tanımlamanızı sağlayacaktır.\n"
+"Biçem, multi_bookmark<büyük_harf>=<dosya_adı>,<açıklama> şeklindedir.\n"
+"26 yer imi dosyasına (İngilizce'deki büyük harfler) kadar izin verilir.\n"
+"\"multi_bookmarkB\" ile başlanır, zira 'A' öntanımlı olandır (yukarıya bkz).\n"
+
+#: src/LYrcFile.c:516
+msgid ""
+"personal_mail_address specifies your personal mail address. The\n"
+"address will be sent during HTTP file transfers for authorization and\n"
+"logging purposes, and for mailed comments.\n"
+"If you do not want this information given out, set the NO_FROM_HEADER\n"
+"to TRUE in lynx.cfg, or use the -nofrom command line switch. You also\n"
+"could leave this field blank, but then you won't have it included in\n"
+"your mailed comments.\n"
+msgstr ""
+"personal_mail_address, sizin kiÅŸisel e-posta adresinizi belirler. Bu adres,\n"
+"HTTP dosya aktarımları sırasında yetkilendirme ve oturum açma amaçlı olarak, ve\n"
+"yorum postalama sırasında gönderilecektir.\n"
+"Eğer bu bilginin verilmesini istemiyorsanız, lynx.cfg'de NO_FROM_HEADER'ı TRUE\n"
+"olarak ayarlayın, ya da -nofrom\n"
+" komut satır seçeneğini kullanın. Bu alanı\n"
+"boş da bırakabilirsiniz, ama o zaman gönderilmiş yorumlarınızda da\n"
+"bu alan içerilmeyecektir.\n"
+
+#: src/LYrcFile.c:525
+msgid ""
+"personal_mail_name specifies your personal name, for mail. The\n"
+"name is sent for mailed comments. Lynx will prompt for this,\n"
+"showing the configured value as a default when sending mail.\n"
+"This is not necessarily the same as a name provided as part of the\n"
+"personal_mail_address.\n"
+"Lynx does not save your changes to that default value as a side-effect\n"
+"of sending email. To update the default value, you must use the options\n"
+"menu, or modify this file directly.\n"
+msgstr ""
+"personal_mail_name postai için sizin kişisel adınızı belirler. Postalanmış\n"
+"yorumlarınız için ad gönderilir. Posta gönderirken Lynx, ayarlanmış değeri\n"
+"öntanımlı olarak göstererek bilgi isteminde bulunacaktır. Bu, personal_mail_address\n"
+"'in bir parçası olarak kullanılan adla aynı olmak zorunda değildir.\n"
+"Lynx, eposta göndermenin bir yan etkisi olarak, değişikliklerinizi öntanımlı\n"
+"değere kaydetmez. Öntanımlı değeri güncellemek için ya seçenekler menüsünü\n"
+"kullanmalı, ya da direkt olarak bu dosyayı değiştirmelisiniz.\n"
+
+#: src/LYrcFile.c:535
+msgid ""
+"preferred_charset specifies the character set in MIME notation (e.g.,\n"
+"ISO-8859-2, ISO-8859-5) which Lynx will indicate you prefer in requests\n"
+"to http servers using an Accept-Charset header. The value should NOT\n"
+"include ISO-8859-1 or US-ASCII, since those values are always assumed\n"
+"by default. May be a comma-separated list.\n"
+"If a file in that character set is available, the server will send it.\n"
+"If no Accept-Charset header is present, the default is that any\n"
+"character set is acceptable. If an Accept-Charset header is present,\n"
+"and if the server cannot send a response which is acceptable\n"
+"according to the Accept-Charset header, then the server SHOULD send\n"
+"an error response, though the sending of an unacceptable response\n"
+"is also allowed.\n"
+msgstr ""
+"preferred_charset, MIME gösterimindeki karakter kümesini belirler\n"
+"(örn, ISO-8859-2, ISO-8859-5), Lynx bunu, http sunucularından yaptığınız\n"
+"istemlerde sizin tercihiniz olarak bir Accept-Charset başlığıyla belirtir.\n"
+"Değer, ISO-8859-1 ya da US-ASCII'yi, bunlar her zaman öntanımlı olarak\n"
+"varsayıldığından, içermemelidir. Virgülle ayrılmış bir liste olabilir.\n"
+"Eğer o karakter kümesinde bir dosya mevcutsa, sunucu onu gönderecektir.\n"
+"Eğer Accept-Charset başlığı yoksa öntanımlı olan, tüm karakter kümelerinin\n"
+"kabul edilebilirliğidir. Eğer bir Accept-Charset başlığı var ve sunucu bu\n"
+"başlık uyarınca kabul edilebilir bir yanıt gönderemiyorsa, sunucunun bir\n"
+"hata yanıtı göndermesi gerekmekle birlikte, bir kabul edilemez yanıtının\n"
+"gönderimine de izin verilir.\n"
+"\n"
+
+#: src/LYrcFile.c:553
+msgid ""
+"preferred_language specifies the language in MIME notation (e.g., en,\n"
+"fr, may be a comma-separated list in decreasing preference)\n"
+"which Lynx will indicate you prefer in requests to http servers.\n"
+"If a file in that language is available, the server will send it.\n"
+"Otherwise, the server will send the file in its default language.\n"
+msgstr ""
+"preferred_language, MIME gösterimindeki dili belirler (örn, en,fr,\n"
+"tercih sırasına göre virgülle ayrılmış bir liste olabilir); Lynx bunu\n"
+"http sunucularından istemde bulunurken sizin tercihiniz olarak belirtir.\n"
+"O dilde bir dosya mevcutsa, sunucu onu gönderecektir.\n"
+"Aksi halde, sunucu öntanımlı dilindeki dosyayı gönderir.\n"
+
+#: src/LYrcFile.c:564
+msgid ""
+"If run_all_execution_links is set \"on\" then all local execution links\n"
+"will be executed when they are selected.\n"
+"\n"
+"WARNING - This is potentially VERY dangerous. Since you may view\n"
+" information that is written by unknown and untrusted sources\n"
+" there exists the possibility that Trojan horse links could be\n"
+" written. Trojan horse links could be written to erase files\n"
+" or compromise security. This should only be set to \"on\" if\n"
+" you are viewing trusted source information.\n"
+msgstr ""
+"Eğer run_all_execution_links \"on\" (açık)a ayarlanırsa, tüm yerel icraat linkleri\n"
+"seçildiklerinde icra edilecektir.\n"
+"\n"
+"UYARI - Bu, potansiyel olarak çok tehlikelidir. Bilinmeyen ve güvenilmez\n"
+" kaynaklar tarafından yazılmış bilgileri görüntüleyebileceğinizden dolayı\n"
+" Truva atı linklerinin yazılma olasılığı mevcuttur. Truva atı linkleri\n"
+" dosyaları silmek ya da güvenliği zayıflatmak için yazılabilir. Bu ayar\n"
+" yalnızca güvenilir kaynak bilgisi görüntülediğiniz koşulda \"on\" (açık)a\n"
+" ayarlanmalıdır.\n"
+
+#: src/LYrcFile.c:575
+msgid ""
+"If run_execution_links_on_local_files is set \"on\" then all local\n"
+"execution links that are found in LOCAL files will be executed when they\n"
+"are selected. This is different from run_all_execution_links in that\n"
+"only files that reside on the local system will have execution link\n"
+"permissions.\n"
+"\n"
+"WARNING - This is potentially dangerous. Since you may view\n"
+" information that is written by unknown and untrusted sources\n"
+" there exists the possibility that Trojan horse links could be\n"
+" written. Trojan horse links could be written to erase files\n"
+" or compromise security. This should only be set to \"on\" if\n"
+" you are viewing trusted source information.\n"
+msgstr ""
+"Eğer run_execution_links_on_local_files \"on\" (açık)a ayarlanırsa YEREL\n"
+"dosyalarda bulunan tüm yerel icraat linkleri seçildiklerinde icra edilecektir.\n"
+"Bu, run_all_execution_links'ten farklı olup, yalnızca yerel sistemde yerleşik\n"
+"bulunan dosyaların icraat link izinleri vardır.\n"
+"\n"
+"UYARI - Bu, potansiyel olarak çok tehlikelidir. Bilinmeyen ve güvenilmez\n"
+" kaynaklar tarafından yazılmış bilgileri görüntüleyebileceğinizden dolayı\n"
+" Truva atı linklerinin yazılma olasılığı mevcuttur. Truva atı linkleri\n"
+" dosyaları silmek ya da güvenliği zayıflatmak için yazılabilir. Bu ayar\n"
+" yalnızca güvenilir kaynak bilgisi görüntülediğiniz koşulda \"on\" (açık)a\n"
+" ayarlanmalıdır.\n"
+
+#: src/LYrcFile.c:593
+msgid ""
+"select_popups specifies whether the OPTIONs in a SELECT block which\n"
+"lacks a MULTIPLE attribute are presented as a vertical list of radio\n"
+"buttons or via a popup menu. Note that if the MULTIPLE attribute is\n"
+"present in the SELECT start tag, Lynx always will create a vertical list\n"
+"of checkboxes for the OPTIONs. A value of \"on\" will set popup menus\n"
+"as the default while a value of \"off\" will set use of radio boxes.\n"
+"The default can be overridden via the -popup command line toggle.\n"
+msgstr ""
+"select_popups, MULTIPLE özniteliğinden yoksun olan SELECT bloğundaki\n"
+"OPTIONların dikey bir radyo düğmesi listesi olarak mı, yoksa açılır menü \n"
+"olarak mı gösterileceğini belirler. MULTIPLE özniteliğinin SELECT başlangıç\n"
+"etiketinde yer almasının, Lynx'in OPTIONlar için her zaman dikey onay kutusu\n"
+"listesi oluşturmasına yol açacağını kaydediniz. Bir \"on\" (açık) değeri, öntanımlı\n"
+"olarak açılır menüler kurarken, \"off\" (kapalı), radyo kutuları kullanımını kuracaktır.\n"
+"Öntanımlı, -popup komut satır anahtarıyla geçersiz kılınabilir.\n"
+
+#: src/LYrcFile.c:604
+msgid ""
+"show_color specifies how to set the color mode at startup. A value of\n"
+"\"never\" will force color mode off (treat the terminal as monochrome)\n"
+"at startup even if the terminal appears to be color capable. A value of\n"
+"\"always\" will force color mode on even if the terminal appears to be\n"
+"monochrome, if this is supported by the library used to build lynx.\n"
+"A value of \"default\" will yield the behavior of assuming\n"
+"a monochrome terminal unless color capability is inferred at startup\n"
+"based on the terminal type, or the -color command line switch is used, or\n"
+"the COLORTERM environment variable is set. The default behavior always is\n"
+"used in anonymous accounts or if the \"option_save\" restriction is set.\n"
+"The effect of the saved value can be overridden via\n"
+"the -color and -nocolor command line switches.\n"
+"The mode set at startup can be changed via the \"show color\" option in\n"
+"the 'o'ptions menu. If the option settings are saved, the \"on\" and\n"
+"\"off\" \"show color\" settings will be treated as \"default\".\n"
+msgstr ""
+"show_color, başlangıçta renk kipinin nasıl ayarlanacağını belirler. Bir\n"
+"\"never\" (asla) değeri, uçbirim renk yetisine sahip olsa da, renk kipini kapanmaya\n"
+"zorlayacaktır (uçbirime siyah/beyaz muamelesi yapacaktır). Bir \"always\"\n"
+"(her zaman) değeri, uçbirim siyah/beyaz görünse de, lynx yapılandırılırken kullanılan \n"
+"kitaplık desteklediği takdirde renkli kipe zorlayacaktır. Bir \"default\"\n"
+"(öntanımlı) değeri, renk yetisi başlangıçta uçbirim türüne dayandırılarak çıkarsanmış,\n"
+"-color komut satırı seçeneği, ya da COLORTERM çevre değişkeniyle atanmış\n"
+"olmadıkça, siyah/beyaz bir uçbirim varsayma davranışı sergileyecektir.\n"
+"Öntanımlı davranış, anonim hesaplarda ya da \"option_save\" kısıtlaması\n"
+"kurulduğunda her zaman kullanılır. Kaydedilmiş değerin etkisi, -color ve\n"
+"-nocolor komut satır seçenekleriyle geçersiz kılınabilir.\n"
+"Başlangıçtaki kip ayarı, seçenekler(o) menüsündeki \"renkleri göster\"\n"
+"seçeneği aracılığıyla değiştirilebilir. Eğer seçenek ayarları kaydedilmişse,\n"
+"\"on\" (açık) \"off\" (kapalı) ve \"show color\" (renk göster) ayarları \"default\"\n"
+"(öntanımlı) olarak muamele görecektir.\n"
+
+#: src/LYrcFile.c:621
+msgid ""
+"show_cursor specifies whether to 'hide' the cursor to the right (and\n"
+"bottom, if possible) of the screen, or to place it to the left of the\n"
+"current link in documents, or current option in select popup windows.\n"
+"Positioning the cursor to the left of the current link or option is\n"
+"helpful for speech or braille interfaces, and when the terminal is\n"
+"one which does not distinguish the current link based on highlighting\n"
+"or color. A value of \"on\" will set positioning to the left as the\n"
+"default while a value of \"off\" will set 'hiding' of the cursor.\n"
+"The default can be overridden via the -show_cursor command line toggle.\n"
+msgstr ""
+"show_cursor, imlecin ekranın (mümkünse) sağına mı, yoksa belgelerdeki\n"
+"linkin ya da seçkin beliriveren pencerelerdeki mevcut seçeneğin\n"
+"soluna mı yerleştirileceğini belirler. İmleci mevcut link ya da\n"
+"seçeneğin soluna yerleştirmek, konuşma ya da körler alfabesi arayüzleri\n"
+"için, ayrıca uçbirimin parlaklaştırarak ya da renkle mevcut linki\n"
+"ayırdetmediği durumlarda yararlıdır. Bir \"on\" (açık) değeri,\n"
+"konumlandırmayı öntanımlı olarak sola yönlendirirken, \"off\" (kapalı) değeri,\n"
+"imlecin gizlenmesini saÄŸlar.\n"
+"Öntanımlı, -show_cursor komut satır anahtarıyla geçersiz kılınabilir.\n"
+
+#: src/LYrcFile.c:632
+msgid ""
+"show_dotfiles specifies that the directory listing should include\n"
+"\"hidden\" (dot) files/directories. If set \"on\", this will be\n"
+"honored only if enabled via userdefs.h and/or lynx.cfg, and not\n"
+"restricted via a command line switch. If display of hidden files\n"
+"is disabled, creation of such files via Lynx also is disabled.\n"
+msgstr ""
+"show_dotfiles dizin listelemenin \"hidden\" (nokta) dosyalar/dizinleri içerip\n"
+"içermeyeceğini belirler. Eğer \"on\" (açık)a ayarlanırsa, yalnızca userdefs.h ve/veya\n"
+"lynx.cfg aracılığıyla etkinleştirildiğinde bu onurlandırma sağlanacak ve komut\n"
+"satır seçeneğiyle kısıtlanmayacaktır. Eğer gizli dosyaların gösterimi devre dışı\n"
+"bırakılırsa, Lynx aracılığıyla bu tür dosyaların oluşturulması da devre dışı kalacaktır.\n"
+
+#: src/LYrcFile.c:643
+msgid ""
+"If sub_bookmarks is not turned \"off\", and multiple bookmarks have\n"
+"been defined (see below), then all bookmark operations will first\n"
+"prompt the user to select an active sub-bookmark file. If the default\n"
+"Lynx bookmark_file is defined (see above), it will be used as the\n"
+"default selection. When this option is set to \"advanced\", and the\n"
+"user mode is advanced, the 'v'iew bookmark command will invoke a\n"
+"statusline prompt instead of the menu seen in novice and intermediate\n"
+"user modes. When this option is set to \"standard\", the menu will be\n"
+"presented regardless of user mode.\n"
+msgstr ""
+"Eğer sub_bookmarks \"off\" (kapalı) değilse ve çok sayıda yer imi tanımlanmışsa\n"
+"(aşağıya bkz), tüm yer imi işlemleri ilk olarak kullanıcıdan etkin bir\n"
+"alt-yer imi dosyası seçmesini ister. Eğer öntanımlı Lynx yer imi dosyası\n"
+"tanımlanmışsa (yukarıya bkz) bu, öntanımlı seçim olarak kullanılacaktır.\n"
+"Bu seçenek \"advanced\" (ileri düzey)e ayarlanmış ve kullanıcı kipi de ileri düzeyse,\n"
+"yer imini göster(v) komutu, acemi ve orta düzey kullanıcı kiplerinde görülen\n"
+"menü yerine bir durumsatırı bilgi istemi çağıracaktır. Bu seçenek\n"
+"\"standard\"a ayarlandığında menü, kullanıcı kipinden bağımsız olarak\n"
+"görüntülenecektir.\n"
+
+#: src/LYrcFile.c:658
+msgid ""
+"user_mode specifies the users level of knowledge with Lynx. The\n"
+"default is \"NOVICE\" which displays two extra lines of help at the\n"
+"bottom of the screen to aid the user in learning the basic Lynx\n"
+"commands. Set user_mode to \"INTERMEDIATE\" to turn off the extra info.\n"
+"Use \"ADVANCED\" to see the URL of the currently selected link at the\n"
+"bottom of the screen.\n"
+msgstr ""
+"user_mode, kullanıcının Lynx bilgi düzeyini belirler. Öntanımlı \"NOVICE\"\n"
+"(acemi) olup, kullanıcının temel Lynx komutlarını öğrenmesine yardımcı\n"
+"olmak için ekranın en altında iki satırlık yardım (mesajları) görüntüler.\n"
+"Bu fazladan bilgiyi kapatmak için user_mode'u \"INTERMEDIATE\" (orta düzey)e\n"
+"ayarlayınız. Ekranın en altında mevcut seçilmiş linkin URL'sini görmek için\n"
+"\"ADVANCED\" (ileri düzey)i kullanın.\n"
+
+#: src/LYrcFile.c:667
+msgid ""
+"If verbose_images is \"on\", lynx will print the name of the image\n"
+"source file in place of [INLINE], [LINK] or [IMAGE]\n"
+"See also VERBOSE_IMAGES in lynx.cfg\n"
+msgstr ""
+"Eğer verbose_images \"on\" (açık) ise lynx, [INLINE], [LINK] ya da\n"
+"[IMAGE] yerine resim kaynak dosyasının ismini yazacaktır.\n"
+"Ayrıca lynx.cfg'deki VERBOSE_IMAGES'a bkz\n"
+
+#: src/LYrcFile.c:672
+msgid ""
+"If vi_keys is set to \"on\", then the normal VI movement keys:\n"
+" j = down k = up\n"
+" h = left l = right\n"
+"will be enabled. These keys are only lower case.\n"
+"Capital 'H', 'J' and 'K will still activate help, jump shortcuts,\n"
+"and the keymap display, respectively.\n"
+msgstr ""
+"Eğer vi_keys \"on\" (açık)a ayarlandıysa, o zaman normal VI gezinme tuşları olan\n"
+" j = aşağı k = yukarı\n"
+" h = sol l = saÄŸ\n"
+"etkinleştirilecektir. Bu tuşlar yalnızca küçük harf şeklinde kullanılır.\n"
+"Büyük 'H', 'J' ve 'K', hâlâ sırasıyla yardım, kısayollara\n"
+"sıçrama ve tuşeşlem görüntülemeyi etkinleştireceklerdir.\n"
+
+#: src/LYrcFile.c:680
+msgid ""
+"The visited_links setting controls how Lynx organizes the information\n"
+"in the Visited Links Page.\n"
+msgstr ""
+"Visited_links ayarı, Lynx'in Uğranmış Linkler Sayfası'ndaki bilgiyi\n"
+"nasıl düzenleyeceğini denetler.\n"
+
+#: src/LYrcFile.c:924
+msgid ""
+"If keypad_mode is set to \"NUMBERS_AS_ARROWS\", then the numbers on\n"
+"your keypad when the numlock is on will act as arrow keys:\n"
+" 8 = Up Arrow\n"
+" 4 = Left Arrow 6 = Right Arrow\n"
+" 2 = Down Arrow\n"
+"and the corresponding keyboard numbers will act as arrow keys,\n"
+"regardless of whether numlock is on.\n"
+msgstr ""
+"Eğer keypad_mode \"NUMBERS_AS_ARROWS\"a ayarlanırsa, mini klavyenizdeki\n"
+"rakamlar, numlock açık olduğunda ok tuşları gibi davranacaktır:\n"
+" 8 = Yukarı Ok\n"
+" 4 = Sol Ok 6 = SaÄŸ Ok\n"
+" 2 = Aşağı Ok\n"
+"ve karşılık gelen klavye rakamları, numlock'ın açık olup olmadığından\n"
+"bağımsız olarak ok tuşları gibi davranacaktır.\n"
+
+#: src/LYrcFile.c:933
+msgid ""
+"If keypad_mode is set to \"LINKS_ARE_NUMBERED\", then numbers will\n"
+"appear next to each link and numbers are used to select links.\n"
+msgstr ""
+"Eğer keypad_mode \"LINKS_ARE_NUMBERED\"e ayarlanırsa, her linkin yanında\n"
+"numaralar belirecek ve bu numaralar linkleri seçmekte kullanılacaktır.\n"
+
+#: src/LYrcFile.c:937
+msgid ""
+"If keypad_mode is set to \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\", then\n"
+"numbers will appear next to each link and visible form input field.\n"
+"Numbers are used to select links, or to move the \"current link\" to a\n"
+"form input field or button. In addition, options in popup menus are\n"
+"indexed so that the user may type an option number to select an option in\n"
+"a popup menu, even if the option isn't visible on the screen. Reference\n"
+"lists and output from the list command also enumerate form inputs.\n"
+msgstr ""
+"Eğer keypad_mode \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\"e ayarlanırsa,\n"
+"her link ve görünür form girdi alanının yanında numaralar belirecektir.\n"
+"Bu numaralar, linkleri seçmede ya da \"current link\"(mevcut link)i bir form girdi\n"
+"alanı ya da düğmesine taşımakta kullanılır. Ek olarak, açılır menülerdeki\n"
+"seçenekler indekslenmiş olup, kullanıcı, seçenek ekranda görünmese bile\n"
+"bir seçenek no'su tuşlayarak seçeneği seçebilir. Referans listeleri ve\n"
+"list komutu çıktısı da form girdilerini numaralandırır.\n"
+
+#: src/LYrcFile.c:946
+msgid ""
+"NOTE: Some fixed format documents may look disfigured when\n"
+"\"LINKS_ARE_NUMBERED\" or \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\" are\n"
+"enabled.\n"
+msgstr ""
+"NOT: \"LINKS_ARE_NUMBERED\" ya da \"LINKS_AND_FORM_FIELDS_ARE NUMBERED\"\n"
+"etkinleştirildiğinde, bazı sabit biçemli belgeler bozuk şekilde\n"
+"görünebilir.\n"
+
+#: src/LYrcFile.c:978
+msgid ""
+"Lynx User Defaults File\n"
+"\n"
+msgstr ""
+"Lynx Kullanıcı Öntanımlıları Dosyası\n"
+"\n"
+
+#: src/LYrcFile.c:987
+msgid ""
+"This file contains options saved from the Lynx Options Screen (normally\n"
+"with the 'o' key). To save options with that screen, you must select the\n"
+"checkbox:\n"
+msgstr ""
+"Bu dosya Lynx Seçenekleri Ekranı'ndan kaydedilen seçenekleri içerir (normalde\n"
+"'o' tuşuyla birlikte). O ekranla seçenekleri kaydetmek için onay\n"
+"kutusunu seçmelisiniz:\n"
+
+#: src/LYrcFile.c:994
+msgid ""
+"You must then save the settings using the link on the line above the\n"
+"checkbox:\n"
+msgstr ""
+"Daha sonra da onay kutusunun üstünde bulunan satırdaki linki kullanarak\n"
+"ayarları kaydetmelisiniz:\n"
+
+#: src/LYrcFile.c:1001
+msgid ""
+"You may also use the command-line option \"-forms_options\", which displays\n"
+"the simpler Options Menu instead. Save options with that using the '>' key.\n"
+"\n"
+msgstr ""
+"\"-forms_options\" komut satırı seçeneğini de kullanabilirsiniz, bu, daha basit\n"
+"Seçenekler Menüsünü gösterecektir. Seçenekleri buradan '>' tuşunu kullanarak kaydedebilirsiniz.\n"
+"\n"
+
+#: src/LYrcFile.c:1008
+msgid ""
+"This file contains options saved from the Lynx Options Screen (normally\n"
+"with the '>' key).\n"
+"\n"
+msgstr ""
+"Bu dosya Lynx Seçenekler Ekranı'ndan kaydedilmiş seçenekleri içerir (normalde\n"
+"'>' tuÅŸuyla).\n"
+"\n"
+
+#: src/LYrcFile.c:1015
+msgid ""
+"There is normally no need to edit this file manually, since the defaults\n"
+"here can be controlled from the Options Screen, and the next time options\n"
+"are saved from the Options Screen this file will be completely rewritten.\n"
+"You have been warned...\n"
+"\n"
+"If you are looking for the general configuration file - it is normally\n"
+"called \"lynx.cfg\". It has different content and a different format.\n"
+"It is not this file.\n"
+msgstr ""
+"Buradaki öntanımlılar Seçenekler Ekranı'ndan kontrol edilebildiği ve seçenekler,\n"
+" Seçenekler Ekranı'ndan bir sonraki sefer kaydedildiğinde bu dosya\n"
+" tümüyle yeniden yazılacağından, normalde bu dosyayı elle düzenlemek gerekmez.\n"
+"Uyarılmış oldunuz...\n"
+"\n"
+"Eğer genel ayarlama dosyasını arıyorsanız - normalde \"lynx.cfg\"\n"
+"olarak anılır. Onun farklı bir içeriği ve biçemi vardır.\n"
+"O, bu dosya deÄŸildir.\n"
+
+#~ msgid "HREF in BASE tag is not an absolute URL."
+#~ msgstr "BASE etiketindeki HREF mutlak bir URL deÄŸil."
+
+#~ msgid "Visible links"
+#~ msgstr "Görünür linkler"
+
+#~ msgid "Address contains a username: %s"
+#~ msgstr "Adres bir kullanıcı adı içeriyor: %s"
+
+#~ msgid ""
+#~ "\n"
+#~ "Lynx edit map not declared.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Lynx düzenleme eşlemi bildirilmemiş.\n"
+#~ "\n"
+
+#~ msgid "Very long lines have been wrapped!"
+#~ msgstr "Çok uzun satırlar sarmalandı!"
+
+#~ msgid "Path too long"
+#~ msgstr "Yol çok uzun"
+
+#~ msgid "Source and destination are the same location - request ignored!"
+#~ msgstr "Çıkış ve varış konumları aynı - istem yoksayıldı!"
diff --git a/po/uk.po b/po/uk.po
new file mode 100644
index 0000000..b70f0ef
--- /dev/null
+++ b/po/uk.po
@@ -0,0 +1,6131 @@
+# ðÅÒÅËÌÁÄ Lynx ÎÁ ÕËÒÁ§ÎÓØËÕ
+# Copyright (C) 2003 Free Software Foundation, Inc.
+# Volodymyr M. Lisivka <lvm@mystery.lviv.net>, 2003
+# Dmytro O. Redchuk <dor@kiev-online.net>, 2001-2002
+# Olexander Kunytsa <kunia@snark.ukma.kiev.ua>, 2000-2001
+# $LynxId: uk.po,v 1.33 2008/12/15 00:21:55 tom Exp $
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: lynx 2.8.5pre9\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-12-07 20:02-0500\n"
+"PO-Revision-Date: 2003-01-22 18:21EEST\n"
+"Last-Translator: Volodymyr M. Lisivka <lvm@mystery.lviv.net>\n"
+"Language-Team: Ukrainian <translation-team-uk@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=koi8-u\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. ******************************************************************
+#. * The following definitions are for status line prompts, messages, or
+#. * warnings issued by Lynx during program execution. You can modify
+#. * them to make them more appropriate for your site. We recommend that
+#. * you extend these definitions to other languages using the gettext
+#. * library. There are also scattered uses of 'gettext()' throughout the
+#. * Lynx source, covering all but those messages which (a) are used for
+#. * debugging (CTRACE) or (b) are constants used in interaction with
+#. * other programs.
+#. *
+#. * Links to collections of alternate definitions, developed by the Lynx
+#. * User Community, are maintained in Lynx links:
+#. *
+#. * http://www.subir.com/lynx.html
+#. *
+#. * See ABOUT-NLS and po/readme for details and location of contributed
+#. * translations. When no translation is available, the English default is
+#. * used.
+#.
+#: LYMessages.c:32
+#, c-format
+msgid "Alert!: %s"
+msgstr "ïÊ!: %s"
+
+#: LYMessages.c:33
+msgid "Welcome"
+msgstr "ìÁÓËÁ×Ï ÐÒÏÓÉÍÏ"
+
+# @ glade- konsole lynx
+# * Yuriy Syrota <yuri@renome.rovno.ua>
+#: LYMessages.c:34
+msgid "Are you sure you want to quit?"
+msgstr "÷É ×ÐÅ×ÎÅΦ, ÝÏ ÈÏÞÅÔÅ ×ÉÊÔÉ?"
+
+#: LYMessages.c:36
+msgid "Really exit from Lynx?"
+msgstr "óÐÒÁ×Ħ ×ÉÊÔÉ Ú Lynx?"
+
+#: LYMessages.c:38
+msgid "Connection interrupted."
+msgstr "ú'¤ÄÎÁÎÎÑ ÒÏÚ¦Ò×ÁÎÏ."
+
+#: LYMessages.c:39
+msgid "Data transfer interrupted."
+msgstr "ïÂͦΠÄÁÎÉÍÉ ÐÅÒÅÒ×ÁÎÏ."
+
+#: LYMessages.c:40
+msgid "Cancelled!!!"
+msgstr "óËÁÓÏ×ÁÎÏ!!!"
+
+#: LYMessages.c:41
+msgid "Cancelling!"
+msgstr "óËÁÓÏ×ÕÀ!"
+
+#: LYMessages.c:42
+msgid "Excellent!!!"
+msgstr "þÕÄÏ×Ï!!!"
+
+#: LYMessages.c:43
+msgid "OK"
+msgstr "çÁÒÁÚÄ"
+
+#: LYMessages.c:44
+msgid "Done!"
+msgstr "úÒÏÂÌÅÎÏ!"
+
+# :-) îÅ ÐÒÉÎÃÉÐÏ×Ï -- ÑË ÚÁÌÉÛÉÛ, ÔÁË ¦ ÂÕÄÅ.
+# :-) îÅ ÐÒÉÎÃÉÐÏ×Ï -- ÑË ÚÁÌÉÛÉÛ, ÔÁË ¦ ÂÕÄÅ.
+#: LYMessages.c:45
+msgid "Bad request!"
+msgstr "îÅÚÒÏÚÕͦÌÉÊ ÚÁÐÉÔ!"
+
+#: LYMessages.c:46
+msgid "previous"
+msgstr "ÐÏÐÅÒÅÄΦÊ"
+
+#: LYMessages.c:47
+msgid "next screen"
+msgstr "ÎÁÓÔÕÐÎÉÊ ÅËÒÁÎ"
+
+#: LYMessages.c:48
+msgid "HELP!"
+msgstr "äï÷¶äëá!"
+
+#: LYMessages.c:49
+msgid ", help on "
+msgstr ", ÄÏצÄËÁ ÐÏ "
+
+#. #define HELP
+#: LYMessages.c:51
+msgid "Commands: Use arrow keys to move, '?' for help, 'q' to quit, '<-' to go back."
+msgstr "ëÏÍÁÎÄÉ: óÔÒ¦ÌËÉ - ÐÅÒÅͦÝÅÎÎÑ, '?' - ÄÏצÄËÁ, 'q' - ×ÉȦÄ, '<-' - ÎÁÚÁÄ."
+
+#. #define MOREHELP
+#: LYMessages.c:53
+msgid "-- press space for more, use arrow keys to move, '?' for help, 'q' to quit."
+msgstr "-- ÐÒÏÂ¦Ì - ÄÁ̦, ÓÔÒ¦ÌËÉ - ÐÅÒÅͦÝÅÎÎÑ, '?' - ÄÏצÄËÁ, 'q' - ×ÉȦÄ."
+
+# ÞÏÍÕ "ÄÌÑ ÎÁÓÔÕÐÎϧ ÓÔÏÒ¦ÎËÉ" ? ×ÏÎÏ §Ê ÔÒÅÂÁ?-)
+# ÞÏÍÕ "ÄÌÑ ÎÁÓÔÕÐÎϧ ÓÔÏÒ¦ÎËÉ" ? ×ÏÎÏ §Ê ÔÒÅÂÁ?-)
+#: LYMessages.c:54
+msgid "-- press space for next page --"
+msgstr "-- ÎÁÔÉÓΦÔØ ÐÒÏÂ¦Ì ÄÌÑ ÐÅÒÅÈÏÄÕ ÎÁ ÎÁÓÔÕÐÎÕ ÓÔÏÒ¦ÎËÕ --"
+
+#: LYMessages.c:55
+msgid "URL too long"
+msgstr "úÁÄÏ×ÇÉÊ URL"
+
+#. Inactive input fields, messages used with -tna option - kw
+#. #define FORM_LINK_TEXT_MESSAGE_INA
+#: LYMessages.c:61
+msgid "(Text entry field) Inactive. Press <return> to activate."
+msgstr "(ôÅËÓÔÏ×Á ÒÑÄÏË) îÅÁËÔÉ×ÎÁ. îÁÔÉÓΦÔØ <×צÄ> ÝÏ ÁËÔÉצÚÕ×ÁÔÉ."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_INA
+#: LYMessages.c:63
+msgid "(Textarea) Inactive. Press <return> to activate."
+msgstr "(ôÅËÓÔÏ×Á ÏÂÌÁÓÔØ) îÅÁËÔÉ×ÎÅ. îÁÔÉÓΦÔØ <×צÄ> ÝÏ ÁËÔÉצÚÕ×ÁÔÉ."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_INA_E
+#: LYMessages.c:65
+#, c-format
+msgid "(Textarea) Inactive. Press <return> to activate (%s for editor)."
+msgstr "(ôÅËÓÔÏ×Á ÏÂÌÁÓÔØ) îÅÁËÔÉ×ÎÅ. <÷צÄ> ÁËÔÉצÚÕ¤ (%s -ÒÅÄÁËÔÏÒ)."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE_INA
+#: LYMessages.c:67
+msgid "(Form field) Inactive. Use <return> to edit."
+msgstr "(ðÏÌÅ ÆÏÒÍÉ) îÅÁËÔÉ×ÎÅ. îÁÔÉÓΦÔØ <×צÄ> ÝÏ ÒÅÄÁÇÕ×ÁÔÉ."
+
+#. #define FORM_TEXT_SUBMIT_MESSAGE_INA_X
+#: LYMessages.c:69
+#, c-format
+msgid "(Form field) Inactive. Use <return> to edit (%s to submit with no cache)."
+msgstr "(ðÏÌÅ ÆÏÒÍÉ) îÅÁËÔÉ×ÎÅ. <÷צÄ> - ÒÅÄÁÇÕ×ÁÔÉ (%s - צĦÓÌÁÔÉ ÂÅÚ ËÅÛÁ)."
+
+#. #define FORM_TEXT_RESUBMIT_MESSAGE_INA
+#: LYMessages.c:71
+msgid "(Form field) Inactive. Press <return> to edit, press <return> twice to submit."
+msgstr "(ðÏÌÅ ÆÏÒÍÉ) îÅÁËÔÉ×ÎÅ. <÷צÄ> - ÒÅÄÁÇÕ×ÁÔÉ, <×צÄ> Äצަ - צĦÓÌÁÔÉ."
+
+#. #define FORM_TEXT_SUBMIT_MAILTO_MSG_INA
+#: LYMessages.c:73
+msgid "(mailto form field) Inactive. Press <return> to change."
+msgstr "(ðÏÌÅ mailto) îÅÁËÔÉ×ÎÅ. îÁÔÉÓΦÔØ <×צÄ> ÝÏ ÚͦÎÉÔÉ."
+
+#. #define FORM_LINK_PASSWORD_MESSAGE_INA
+#: LYMessages.c:75
+msgid "(Password entry field) Inactive. Press <return> to activate."
+msgstr "(ðÏÌÅ ÄÌÑ ÐÁÒÏÌÑ) îÅÁËÔÉ×ÎÅ. îÁÔÉÓΦÔØ <×צÄ> ÝÏ ÁËÔÉצÚÕ×ÁÔÉ."
+
+#. #define FORM_LINK_FILE_UNM_MSG
+#: LYMessages.c:78
+msgid "UNMODIFIABLE file entry field. Use UP or DOWN arrows or tab to move off."
+msgstr "îåúí¶îîå ÐÏÌÅ ÄÌÑ ÆÁÊÌÕ. óÔÒ¦ÌËÉ ÷çïòõ/÷îéú, ÞÉ ôáâõìñã¶ñ - Ú¦ÊÔÉ."
+
+#. #define FORM_LINK_FILE_MESSAGE
+#: LYMessages.c:80
+msgid "(File entry field) Enter filename. Use UP or DOWN arrows or tab to move off."
+msgstr "(ðÏÌÅ ÄÌÑ ÆÁÊÌÕ) ÷×ÅĦÔØ ¦Í'Ñ ÆÁÊÌÕ. óÔÒ¦ÌËÉ ÷çïòõ/÷îéú, ÞÉ ôáâõìñã¶ñ - Ú¦ÊÔÉ."
+
+# Ñ ÂÉ ÚÁÌÉÛÉ× "Ó×Ϥ", ÂÏ ÔÅËÓÔÏ×Å ÐÏÌÅ Õ ÍÅÎÅ textarea
+#. #define FORM_LINK_TEXT_MESSAGE
+#: LYMessages.c:82
+msgid "(Text entry field) Enter text. Use UP or DOWN arrows or tab to move off."
+msgstr "(ôÅËÓÔÏ×ÉÊ ÒÑÄÏË) ÷×ÅĦÔØ ÔÅËÓÔ. óÔÒ¦ÌËÉ ÷çïòõ/÷îéú, ÞÉ ôáâõìñã¶ñ - Ú¦ÊÔÉ."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE
+#: LYMessages.c:84
+msgid "(Textarea) Enter text. Use UP/DOWN arrows or TAB to move off."
+msgstr "(ôÅËÓÔÏ×Á ÏÂÌÁÓÔØ) úÁÐÏ×ΦÔØ. óÔÒ¦ÌËÉ ÷çïòõ/÷îéú, ÞÉ ôáâõìñã¶ñ - Ú¦ÊÔÉ."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_E
+#: LYMessages.c:86
+#, c-format
+msgid "(Textarea) Enter text. Use UP/DOWN arrows or TAB to move off (%s for editor)."
+msgstr "(ôÅËÓÔÏ×Á ÏÂÌÁÓÔØ) úÁÐÏ×ΦÔØ. óÔÒ¦ÌËÉ ÷çïòõ/÷îéú, ÞÉ ôáâ - Ú¦ÊÔÉ (%s - ÒÅÄÁËÔÏÒ)."
+
+#. #define FORM_LINK_TEXT_UNM_MSG
+#: LYMessages.c:88
+msgid "UNMODIFIABLE form text field. Use UP or DOWN arrows or tab to move off."
+msgstr "îåúí¶îîå ÔÅËÓÔÏ×Å ÐÏÌÅ. óÔÒ¦ÌËÉ ÷çïòõ/÷îéú, ÞÉ ôáâõìñã¶ñ - Ú¦ÊÔÉ."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE
+#: LYMessages.c:90
+msgid "(Form field) Enter text. Use <return> to submit."
+msgstr "(ðÏÌÅ ÆÏÒÍÉ) ÷×ÅĦÔØ ÔÅËÓÔ. <÷צÄ> ÝÏ צĦÓÌÁÔÉ ÆÏÒÍÕ."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE_X
+#: LYMessages.c:92
+#, c-format
+msgid "(Form field) Enter text. Use <return> to submit (%s for no cache)."
+msgstr "(ðÏÌÅ ÆÏÒÍÉ) ÷×ÅĦÔØ ÔÅËÓÔ. <÷צÄ> ÝÏ צĦÓÌÁÔÉ (%s - ÂÅÚ ËÅÛÁ)."
+
+#. #define FORM_LINK_TEXT_RESUBMIT_MESSAGE
+#: LYMessages.c:94
+msgid "(Form field) Enter text. Use <return> to submit, arrows or tab to move off."
+msgstr "(ðÏÌÅ ÆÏÒÍÉ) ÷×ÅĦÔØ ÔÅËÓÔ. <÷צÄ> - צÄÓÉÌÁ¤, ÓÔÒ¦ÌËÉ/ÔÁÂÕÌÑÃ¦Ñ - Ú¦ÊÔÉ."
+
+#. #define FORM_LINK_TEXT_SUBMIT_UNM_MSG
+#: LYMessages.c:96
+msgid "UNMODIFIABLE form field. Use UP or DOWN arrows or tab to move off."
+msgstr "îåúí¶îîå ÐÏÌÅ ÆÏÒÍÉ. óÔÒ¦ÌËÉ ÷çïòõ/÷îéú, ÞÉ ôáâõìñã¶ñ - Ú¦ÊÔÉ."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MAILTO_MSG
+#: LYMessages.c:98
+msgid "(mailto form field) Enter text. Use <return> to submit, arrows to move off."
+msgstr "(ðÏÌÅ mailto) ÷×ÅĦÔØ ÔÅËÓÔ. <÷צÄ> - צĦÓÌÁÔÉ, ÓÔÒ¦ÌËÉ - Ú¦ÊÔÉ."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MAILTO_DIS_MSG
+#: LYMessages.c:100
+msgid "(mailto form field) Mail is disallowed so you cannot submit."
+msgstr "(ðÏÌÅ mailto) îÁÄÓÉÌÁÎÎÑ ÐÏÛÔÉ ÚÁÂÏÒÏÎÅÎÅ, צĦÓÌÁÔÉ ÎÅÍÏÖÌÉ×Ï."
+
+#. #define FORM_LINK_PASSWORD_MESSAGE
+#: LYMessages.c:102
+msgid "(Password entry field) Enter text. Use UP or DOWN arrows or tab to move off."
+msgstr "(ðÏÌÅ ××ÏÄÕ ÐÁÒÏÌÑ) ÷×ÅĦÔØ ÔÅËÓÔ. óÔÒ¦ÌËÉ ÷çïòõ/÷îéú, ÞÉ ôáâõìñã¶ñ - Ú¦ÊÔÉ."
+
+#. #define FORM_LINK_PASSWORD_UNM_MSG
+#: LYMessages.c:104
+msgid "UNMODIFIABLE form password. Use UP or DOWN arrows or tab to move off."
+msgstr "îåúí¶îîå ÐÏÌÅ ××ÏÄÕ ÐÁÒÏÌÑ. óÔÒ¦ÌËÉ ÷çïòõ/÷îéú, ÞÉ ôáâõìñã¶ñ - Ú¦ÊÔÉ."
+
+#. #define FORM_LINK_CHECKBOX_MESSAGE
+#: LYMessages.c:106
+msgid "(Checkbox Field) Use right-arrow or <return> to toggle."
+msgstr "(ðÏÌÅ \"ÐÅÒÅÍÉËÁÞ\") ðÒÁ×Á ÓÔÒ¦ÌËÁ ÞÉ <×צÄ> ÐÅÒÅÍÉËÁ¤ ÓÔÁÎ."
+
+#. #define FORM_LINK_CHECKBOX_UNM_MSG
+#: LYMessages.c:108
+msgid "UNMODIFIABLE form checkbox. Use UP or DOWN arrows or tab to move off."
+msgstr "îåúí¶îîéê ÐÅÒÅÍÉËÁÞ. óÔÒ¦ÌËÉ ÷çïòõ/÷îéú, ÞÉ ôáâõìñã¶ñ - Ú¦ÊÔÉ."
+
+#. #define FORM_LINK_RADIO_MESSAGE
+#: LYMessages.c:110
+msgid "(Radio Button) Use right-arrow or <return> to toggle."
+msgstr "(òÁĦÏËÎÏÐËÁ) ðÒÁ×Á ÓÔÒ¦ÌËÁ ÞÉ <×צÄ> ÐÅÒÅÍÉËÁ¤."
+
+#. #define FORM_LINK_RADIO_UNM_MSG
+#: LYMessages.c:112
+msgid "UNMODIFIABLE form radio button. Use UP or DOWN arrows or tab to move off."
+msgstr "îåúí¶îîá ÒÁĦÏËÎÏÐËÁ. óÔÒ¦ÌËÉ ÷çïòõ/÷îéú, ÞÉ ôáâõìñã¶ñ - Ú¦ÊÔÉ."
+
+# ôåòí¶îïìïç¶ñ!!! ôÒÅÂÁ ÏÂÇÏ×ÏÒÀ×ÁÔÉ.
+# íÅΦ ǦÒÛÅ "÷¦Ä¦ÓÌÁÔÉ", ÂÏ ÔÏĦ ÎÅ×ÉÐÒÁ×ÄÁÎÁ ÔÁ×ÔÏÌÏÇ¦Ñ Õ LYMessages.c:127
+# ôåòí¶îïìïç¶ñ!!! ôÒÅÂÁ ÏÂÇÏ×ÏÒÀ×ÁÔÉ.
+# íÅΦ ǦÒÛÅ "÷¦Ä¦ÓÌÁÔÉ", ÂÏ ÔÏĦ ÎÅ×ÉÐÒÁ×ÄÁÎÁ ÔÁ×ÔÏÌÏÇ¦Ñ Õ LYMessages.c:127
+#. #define FORM_LINK_SUBMIT_PREFIX
+#: LYMessages.c:114
+msgid "Submit ('x' for no cache) to "
+msgstr "úÁÔ×ÅÒÄÉÔÉ ('x' - ÂÅÚ ËÅÛÁ) ÎÁ "
+
+#. #define FORM_LINK_RESUBMIT_PREFIX
+#: LYMessages.c:116
+msgid "Submit to "
+msgstr "úÁÔ×ÅÒÄÉÔÉ ÎÁ "
+
+#. #define FORM_LINK_SUBMIT_MESSAGE
+#: LYMessages.c:118
+msgid "(Form submit button) Use right-arrow or <return> to submit ('x' for no cache)."
+msgstr "(ëÎÏÐËÁ צÄÓÉÌÁÎÎÑ ÆÏÒÍÉ) ÷¦Ä¦ÓÌÁÔÉ - ÓÔÒ¦ÌËÁ ×ÐÒÁ×Ï ÞÉ <×צÄ> ('x' - ÂÅÚ ËÅÛÁ)"
+
+#. #define FORM_LINK_RESUBMIT_MESSAGE
+#: LYMessages.c:120
+msgid "(Form submit button) Use right-arrow or <return> to submit."
+msgstr "(ëÎÏÐËÁ צÄÓÉÌÁÎÎÑ ÆÏÒÍÉ) ÷¦Ä¦ÓÌÁÔÉ - ÓÔÒ¦ÌËÁ ×ÐÒÁ×Ï ÞÉ <×צÄ>."
+
+#. #define FORM_LINK_SUBMIT_DIS_MSG
+#: LYMessages.c:122
+msgid "DISABLED form submit button. Use UP or DOWN arrows or tab to move off."
+msgstr "úáâìïëï÷áîá ËÎÏÐËÁ ÚÁÔ×ÅÒÄÖÅÎÎÑ. óÔÒ¦ÌËÉ ÷çïòõ/÷îéú, ÞÉ ôáâ - Ú¦ÊÔÉ."
+
+#. #define FORM_LINK_SUBMIT_MAILTO_PREFIX
+#: LYMessages.c:124
+msgid "Submit mailto form to "
+msgstr "úÁÔ×ÅÒÄÉÔÉ mailto ÎÁ "
+
+#. #define FORM_LINK_SUBMIT_MAILTO_MSG
+#: LYMessages.c:126
+msgid "(mailto form submit button) Use right-arrow or <return> to submit."
+msgstr "(ëÎÏÐËÁ צÄÓÉÌÁÎÎÑ ÞÅÒÅÚ mailto) ÷¦Ä¦ÓÌÁÔÉ - ÓÔÒ¦ÌËÁ ×ÐÒÁ×Ï ÞÉ <×צÄ>."
+
+#. #define FORM_LINK_SUBMIT_MAILTO_DIS_MSG
+#: LYMessages.c:128
+msgid "(mailto form submit button) Mail is disallowed so you cannot submit."
+msgstr "(ëÎÏÐËÁ צÄÓÉÌÁÎÎÑ ÞÅÒÅÚ mailto) îÁÄÓÉÌÁÔÉ ÐÏÛÔÕ ÚÁÂÏÒÏÎÅÎÏ, צĦÓÌÁÔÉ ÎÅÍÏÖÌÉ×Ï."
+
+#. #define FORM_LINK_RESET_MESSAGE
+#: LYMessages.c:130
+msgid "(Form reset button) Use right-arrow or <return> to reset form to defaults."
+msgstr "(ëÎÏÐËÁ צÄÎÏ×ÌÅÎÎÑ ÆÏÒÍÉ) óÔÒ¦ÌËÁ ×ÐÒÁ×Ï ÞÉ <×צÄ> - ÄÏ ÐÏÞÁÔËÏ×ÏÇÏ ÓÔÁÎÕ."
+
+#. #define FORM_LINK_RESET_DIS_MSG
+#: LYMessages.c:132
+msgid "DISABLED form reset button. Use UP or DOWN arrows or tab to move off."
+msgstr "úáâìïëï÷áîá ËÎÏÐËÁ צÄÎÏ×ÌÅÎÎÑ. óÔÒ¦ÌËÉ ÷çïòõ/÷îéú, ÞÉ ôáâ - Ú¦ÊÔÉ."
+
+#. #define FORM_LINK_OPTION_LIST_MESSAGE
+#: LYMessages.c:134
+msgid "(Option list) Hit return and use arrow keys and return to select option."
+msgstr "(óÐÉÓÏË ×ÁÒ¦ÁÎÔ¦×) îÁÔÉÓΦÔØ ×צÄ, ×ÉÂÅÒ¦ÔØ ÓÔÒ¦ÌËÁÍÉ ÔÁ ÎÁÔÉÓΦÔØ ×צÄ."
+
+#. #define CHOICE_LIST_MESSAGE
+#: LYMessages.c:136
+msgid "(Choice list) Hit return and use arrow keys and return to select option."
+msgstr "(óÐÉÓÏË ×ÁÒ¦ÁÎÔ¦×) îÁÔÉÓΦÔØ ×צÄ, ×ÉÂÅÒ¦ÔØ ÓÔÒ¦ÌËÁÍÉ ÔÁ ÎÁÔÉÓΦÔØ ×צÄ."
+
+#. #define FORM_LINK_OPTION_LIST_UNM_MSG
+#: LYMessages.c:138
+msgid "UNMODIFIABLE option list. Use return or arrow keys to review or leave."
+msgstr "îåúí¶îîéê ÓÐÉÓÏË ×ÁÒ¦ÁÎÔ¦×. óÔÒ¦ÌËÉ ÞÉ ××¦Ä - ÐÒÏÄÉ×ÉÔÉÓÑ Ê Ú¦ÊÔÉ."
+
+#. #define CHOICE_LIST_UNM_MSG
+#: LYMessages.c:140
+msgid "UNMODIFIABLE choice list. Use return or arrow keys to review or leave."
+msgstr "úáâìïëï÷áîéê ÓÐÉÓÏË ×ÁÒ¦ÁÎÔ¦×. óÔÒ¦ÌËÉ ÞÉ ××¦Ä - ÐÒÏÄÉ×ÉÔÉÓÑ Ê Ú¦ÊÔÉ."
+
+#: LYMessages.c:141
+msgid "Submitting form..."
+msgstr "úÁÔ×ÅÒÄÖÕ¤ÍÏ ÆÏÒÍÕ..."
+
+#: LYMessages.c:142
+msgid "Resetting form..."
+msgstr "÷¦ÄÎÏ×ÌÀ¤ÍÏ ÆÏÒÍÕ..."
+
+#. #define RELOADING_FORM
+#: LYMessages.c:144
+msgid "Reloading document. Any form entries will be lost!"
+msgstr "ðÅÒÅÚÁ×ÁÎÔÁÖÕ¤ÍÏ ÄÏËÕÍÅÎÔ. õÓ¦ ××ÅÄÅΦ ÚÎÁÞÅÎÎÑ ÂÕÄÕÔØ ×ÔÒÁÞÅΦ!"
+
+#: LYMessages.c:145
+#, c-format
+msgid "Warning: Cannot transcode form data to charset %s!"
+msgstr "õ×ÁÇÁ: îÅÍÏÖÌÉ×Ï ÐÅÒÅËÏÄÕ×ÁÔÉ ÄÁΦ Õ %s!"
+
+#. #define NORMAL_LINK_MESSAGE
+#: LYMessages.c:148
+msgid "(NORMAL LINK) Use right-arrow or <return> to activate."
+msgstr "(ðïóéìáîîñ) áËÔÉ×ÕÊÔÅ ÓÔÒ¦ÌËÏÀ ×ÐÒÁ×Ï ÞÉ <×צÄ>'ÏÍ"
+
+#: LYMessages.c:149
+msgid "The resource requested is not available at this time."
+msgstr "ãÅÊ ÒÅÓÕÒÓ ÎÁÒÁÚ¦ ÎÅÄÏÓÔÕÐÎÉÊ."
+
+#: LYMessages.c:150
+msgid "Enter Lynx keystroke command: "
+msgstr "÷×ÅĦÔØ ËÏÍÁÎÄÕ Lynx: "
+
+#: LYMessages.c:151
+msgid "Looking up "
+msgstr "ûÕËÁ¤ÍÏ "
+
+#: LYMessages.c:152
+#, c-format
+msgid "Getting %s"
+msgstr "ïÔÒÉÍÕ¤ÍÏ %s"
+
+#: LYMessages.c:153
+#, c-format
+msgid "Skipping %s"
+msgstr "ðÒÏÐÕÓËÁ¤ÍÏ %s"
+
+#: LYMessages.c:154
+#, c-format
+msgid "Using %s"
+msgstr "÷ÉËÏÒÉÓÔÏ×Õ¤ÍÏ %s"
+
+#: LYMessages.c:155
+#, c-format
+msgid "Illegal URL: %s"
+msgstr "îÅצÒÎÉÊ URL: %s"
+
+#: LYMessages.c:156
+#, c-format
+msgid "Badly formed address %s"
+msgstr "îÅÐÒÁ×ÉÌØÎÏ ÓÆÏÒÍÏ×ÁÎÁ ÁÄÒÅÓÁ %s"
+
+#: LYMessages.c:157
+#, c-format
+msgid "URL: %s"
+msgstr "URL: %s"
+
+#: LYMessages.c:158
+msgid "Unable to access WWW file!!!"
+msgstr "îÅÍÏÖÌÉ×Ï Ä¦ÓÔÁÔÉÓÑ ÄÏ WWW ÆÁÊÌÕ!!!"
+
+#: LYMessages.c:159
+#, c-format
+msgid "This is a searchable index. Use %s to search."
+msgstr "ãÅ ¦ÎÄÅËÓ ¦Ú ÐÏÛÕËÏÍ. ÷ÉËÏÒÉÓÔÏ×ÕÊÔÅ ÄÌÑ ÐÏÛÕËÕ %s."
+
+#. #define WWW_INDEX_MORE_MESSAGE
+#: LYMessages.c:161
+#, c-format
+msgid "--More-- This is a searchable index. Use %s to search."
+msgstr "--äÁ̦-- ãÅ ¦ÎÄÅËÓ ¦Ú ÐÏÛÕËÏÍ. ÷ÉËÏÒÉÓÔÏ×ÕÊÔÅ ÄÌÑ ÐÏÛÕËÕ %s."
+
+#: LYMessages.c:162
+msgid "You have entered an invalid link number."
+msgstr "÷É ××ÅÌÉ ÎÅצÒÎÉÊ ÎÏÍÅÒ ÐÏÓÉÌÁÎÎÑ."
+
+# "ÚÇÅÎÅÒÏ×ÁÎϧ ×ÅÒÓ¦§" ??
+# "ÚÇÅÎÅÒÏ×ÁÎϧ ×ÅÒÓ¦§" ??
+#. #define SOURCE_HELP
+#: LYMessages.c:164
+msgid "Currently viewing document source. Press '\\' to return to rendered version."
+msgstr "ãÅ ÄÖÅÒÅÌÏ ÄÏËÕÍÅÎÔÁ. îÁÔÉÓΦÔØ '\\' ÝÏ ÐÏ×ÅÒÎÕÔÉÓÑ ÄÏ ÏÐÒÁÃØÏ×ÁÎϧ ×ÅÒÓ¦§."
+
+#. #define NOVICE_LINE_ONE
+#: LYMessages.c:166
+msgid " Arrow keys: Up and Down to move. Right to follow a link; Left to go back. \n"
+msgstr " óÔÒ¦ÌËÉ: ×ÇÏÒÕ/×ÎÉÚ - ÐÅÒÅͦÝÅÎÎÑ, ×ÐÒÁ×Ï - ÚÁ ÐÏÓÉÌÁÎÎÑÍ, ×̦×Ï - ÎÁÚÁÄ. \n"
+
+#. #define NOVICE_LINE_TWO
+#: LYMessages.c:168
+msgid " H)elp O)ptions P)rint G)o M)ain screen Q)uit /=search [delete]=history list \n"
+msgstr " H)elp O)ptions P)rint G)o M)ain screen Q)uit /=ÐÏÛÕË [delete]=history list \n"
+
+#. #define NOVICE_LINE_TWO_A
+#: LYMessages.c:170
+msgid " O)ther cmds H)elp K)eymap G)oto P)rint M)ain screen o)ptions Q)uit \n"
+msgstr ""
+
+#. #define NOVICE_LINE_TWO_B
+#: LYMessages.c:172
+msgid " O)ther cmds B)ack E)dit D)ownload ^R)eload ^W)ipe screen search doc: / \n"
+msgstr ""
+
+#. #define NOVICE_LINE_TWO_C
+#: LYMessages.c:174
+msgid "O)ther cmds C)omment History: <backspace> Bookmarks: V)iew, A)dd, R)emove \n"
+msgstr "O)¦ÎÛ¦ ËÍ C)ËÏÍÅÎÔÁÒ¦ ¶ÓÔÏÒ¦Ñ: <ÚÁ¦Ê> úÁËÌÁÄËÉ: V)ÐÅÒÅÇÌÑÄ A)ÄÏÄÁÔÉ R)×ÉÄÁÌÉÔÉ\n"
+
+#. #define FORM_NOVICELINE_ONE
+#: LYMessages.c:176
+msgid " Enter text into the field by typing on the keyboard "
+msgstr " ÷×ÅĦÔØ ÔÅËÓÔ Ú ËÌÁצÁÔÕÒÉ "
+
+# Õ ÓÔÒ¦Þæ, Õ ÒÑÄËÕ -- ÍÅΦ ÔÒÅÂÁ ×ÉÚÎÁÞÉÔÉÓÑ.
+# Ñ ×ÖÅ ÎÁÚÉ×Á× textfield ÔÅËÓÔÏ×ÏÀ ÓÔÒ¦ÞËÏÀ, ÔÒÅÂÁ ÒÏÚ¦ÂÒÁÔÉÓÑ
+# Õ ÓÔÒ¦Þæ, Õ ÒÑÄËÕ -- ÍÅΦ ÔÒÅÂÁ ×ÉÚÎÁÞÉÔÉÓÑ.
+# Ñ ×ÖÅ ÎÁÚÉ×Á× textfield ÔÅËÓÔÏ×ÏÀ ÓÔÒ¦ÞËÏÀ, ÔÒÅÂÁ ÒÏÚ¦ÂÒÁÔÉÓÑ
+#. #define FORM_NOVICELINE_TWO
+#: LYMessages.c:178
+msgid " Ctrl-U to delete all text in field, [Backspace] to delete a character "
+msgstr " Ctrl-U - ÓÔÅÒÔÉ ×ÅÓØ ÔÅËÓÔ Õ ÒÑÄËÕ, [úÁ¦Ê] - ÓÔÅÒÔÉ ÏÄÉÎ ÓÉÍ×ÏÌ "
+
+# Õ ÓÔÒ¦Þæ, Õ ÒÑÄËÕ -- ÍÅΦ ÔÒÅÂÁ ×ÉÚÎÁÞÉÔÉÓÑ.
+# Ñ ×ÖÅ ÎÁÚÉ×Á× textfield ÔÅËÓÔÏ×ÏÀ ÓÔÒ¦ÞËÏÀ, ÔÒÅÂÁ ÒÏÚ¦ÂÒÁÔÉÓÑ
+#. #define FORM_NOVICELINE_TWO_DELBL
+#: LYMessages.c:180
+msgid " Ctrl-U to delete text in field, [Backspace] to delete a character "
+msgstr " Ctrl-U - ÓÔÅÒÔÉ ×ÅÓØ ÔÅËÓÔ Õ ÒÑÄËÕ, [úÁ¦Ê] - ÓÔÅÒÔÉ ÏÄÉÎ ÓÉÍ×ÏÌ "
+
+# Õ ÓÔÒ¦Þæ, Õ ÒÑÄËÕ -- ÍÅΦ ÔÒÅÂÁ ×ÉÚÎÁÞÉÔÉÓÑ.
+# Ñ ×ÖÅ ÎÁÚÉ×Á× textfield ÔÅËÓÔÏ×ÏÀ ÓÔÒ¦ÞËÏÀ, ÔÒÅÂÁ ÒÏÚ¦ÂÒÁÔÉÓÑ
+#. #define FORM_NOVICELINE_TWO_VAR
+#: LYMessages.c:182
+#, c-format
+msgid " %s to delete all text in field, [Backspace] to delete a character "
+msgstr " %s - ÓÔÅÒÔÉ ×ÅÓØ ÔÅËÓÔ Õ ÒÑÄËÕ, [úÁ¦Ê] - ÓÔÅÒÔÉ ÏÄÉÎ ÓÉÍ×ÏÌ "
+
+# Õ ÓÔÒ¦Þæ, Õ ÒÑÄËÕ -- ÍÅΦ ÔÒÅÂÁ ×ÉÚÎÁÞÉÔÉÓÑ.
+# Ñ ×ÖÅ ÎÁÚÉ×Á× textfield ÔÅËÓÔÏ×ÏÀ ÓÔÒ¦ÞËÏÀ, ÔÒÅÂÁ ÒÏÚ¦ÂÒÁÔÉÓÑ
+#. #define FORM_NOVICELINE_TWO_DELBL_VAR
+#: LYMessages.c:184
+#, c-format
+msgid " %s to delete text in field, [Backspace] to delete a character "
+msgstr " %s - ÓÔÅÒÔÉ ×ÅÓØ ÔÅËÓÔ Õ ÒÑÄËÕ, [úÁ¦Ê] - ÓÔÅÒÔÉ ÏÄÉÎ ÓÉÍ×ÏÌ "
+
+#. mailto
+#: LYMessages.c:187
+msgid "Malformed mailto form submission! Cancelled!"
+msgstr "îÅÐÒÁ×ÉÌØÎÏ ÓÆÏÒÍÏ×ÁÎÅ ÚÁÔ×ÅÒÄÖÅÎÎÑ ÆÏÒÍÉ mailto! óËÁÓÏ×ÁÎÏ!"
+
+#: LYMessages.c:188
+msgid "Warning! Control codes in mail address replaced by ?"
+msgstr "õ×ÁÇÁ! ëÏÄÉ ËÅÒÕ×ÁÎÎÑ Õ ÐÏÛÔÏ×¦Ê ÁÄÒÅÓ¦ ÚÁͦÎÅÎÏ ÎÁ ?"
+
+#: LYMessages.c:189
+msgid "Mail disallowed! Cannot submit."
+msgstr "îÁÄÓÉÌÁÎÎÑ ÐÏÛÔÉ ÚÁÂÏÒÏÎÅÎÅ! úÁÔ×ÅÒÄÖÅÎÎÑ ÎÅÍÏÖÌÉ×Å."
+
+#: LYMessages.c:190
+msgid "Mailto form submission failed!"
+msgstr "îÅ×ÄÁÞÁ ÚÁÔ×ÅÒÄÖÅÎÎÑ ÆÏÒÍÉ mailto!"
+
+#: LYMessages.c:191
+msgid "Mailto form submission Cancelled!!!"
+msgstr "úÁÔ×ÅÒÄÖÅÎÎÑ ÆÏÒÍÉ mailto ÓËÁÓÏ×ÁÎÏ!!!"
+
+#: LYMessages.c:192
+msgid "Sending form content..."
+msgstr "÷¦ÄÐÒÁ×ÌѤÍÏ ÚÁÐÏ×ÎÅÎÕ ÆÏÒÍÕ..."
+
+#: LYMessages.c:193
+msgid "No email address is present in mailto URL!"
+msgstr "îÅÍÁ ÐÏÛÔÏ×ϧ ÁÄÒÅÓÉ Õ mailto URL!"
+
+#. #define MAILTO_URL_TEMPOPEN_FAILED
+#: LYMessages.c:195
+msgid "Unable to open temporary file for mailto URL!"
+msgstr "îÅÍÏÖÌÉ×Ï ×¦ÄËÒÉÔÉ ÔÉÍÞÁÓÏ×ÉÊ ÆÁÊÌ ÄÌÑ mailto URL!"
+
+#. #define INC_ORIG_MSG_PROMPT
+#: LYMessages.c:197
+msgid "Do you wish to include the original message?"
+msgstr "þÉ ÂÁÖÁ¤ÔÅ ÄÏÄÁÔÉ ÏÔÒÉÍÁÎÏÇÏ ÌÉÓÔÁ?"
+
+#. #define INC_PREPARSED_MSG_PROMPT
+#: LYMessages.c:199
+msgid "Do you wish to include the preparsed source?"
+msgstr "þÉ ÂÁÖÁ¤ÔÅ ÄÏÄÁÔÉ ÏÂÒÏÂÌÅÎÅ ÄÖÅÒÅÌÏ ÌÉÓÔÁ?"
+
+#. #define SPAWNING_EDITOR_FOR_MAIL
+#: LYMessages.c:201
+msgid "Spawning your selected editor to edit mail message"
+msgstr "úÁÐÕÓËÁ¤ÍÏ ×ÉÂÒÁÎÏÇÏ ×ÁÍÉ ÒÅÄÁËÔÏÒÁ ÄÌÑ ÒÅÄÁÇÕ×ÁÎÎÑ ÌÉÓÔÁ"
+
+#. #define ERROR_SPAWNING_EDITOR
+#: LYMessages.c:203
+msgid "Error spawning editor, check your editor definition in the options menu"
+msgstr "ðÏÍÉÌËÁ ÚÁÐÕÓËÕ ÒÅÄÁËÔÏÒÁ, ÐÅÒÅצÒÔÅ ÕÓÔÁÎÏ×ËÉ Õ ÍÅÎÀ ÎÁÌÁÛÔÕ×ÁÎØ"
+
+#: LYMessages.c:204
+msgid "Send this comment?"
+msgstr "÷¦Ä¦ÓÌÁÔÉ ÃÅÊ ËÏÍÅÎÔÁÒ?"
+
+#: LYMessages.c:205
+msgid "Send this message?"
+msgstr "÷¦Ä¦ÓÌÁÔÉ ÃÅ ÐÏצÄÏÍÌÅÎÎÑ?"
+
+#: LYMessages.c:206
+msgid "Sending your message..."
+msgstr "÷¦ÄÓÉÌÁÎÎÑ ×ÁÛÏÇÏ ÐÏצÄÏÍÌÅÎÎÑ..."
+
+#: LYMessages.c:207
+msgid "Sending your comment:"
+msgstr "÷¦ÄÓÉÌÁÎÎÑ ×ÁÛÏÇÏ ËÏÍÅÎÔÁÒÑ:"
+
+#. textarea
+#: LYMessages.c:210
+msgid "Not in a TEXTAREA; cannot use external editor."
+msgstr "ãÅ ÎÅ ôåëóôï÷á ïâìáóôø; ×ÉËÏÒÉÓÔÁÎÎÑ ÚÏ×ΦÛÎØÏÇÏ ÒÅÄÁËÔÏÒÁ ÎÅÍÏÖÌÉ×Å."
+
+#: LYMessages.c:211
+msgid "Not in a TEXTAREA; cannot use command."
+msgstr "ãÅ ÎÅ ôåëóôï÷á ïâìáóôø; ×ÉËÏÒÉÓÔÁÎÎÑ ËÏÍÁÎÄÉ ÎÅÍÏÖÌÉ×Å."
+
+#: LYMessages.c:213
+msgid "file: ACTIONs are disallowed!"
+msgstr "file: 䶷 (ACTIONs) ÚÁÂÏÒÏÎÅΦ!"
+
+#. #define FILE_SERVED_LINKS_DISALLOWED
+#: LYMessages.c:215
+msgid "file: URLs via served links are disallowed!"
+msgstr ""
+
+#: LYMessages.c:216
+msgid "Access to local files denied."
+msgstr "äÏÓÔÕÐ ÄÏ ÌÏËÁÌØÎÉÈ ÆÁÊÌ¦× ÚÁÂÏÒÏÎÅÎÏ."
+
+#: LYMessages.c:217
+msgid "file: URLs via bookmarks are disallowed!"
+msgstr "file: URL ÞÅÒÅÚ ÚÁËÌÁÄÉÎËÉ ÚÁÂÏÒÏÎÅÎÏ!"
+
+#. #define SPECIAL_VIA_EXTERNAL_DISALLOWED
+#: LYMessages.c:219
+msgid "This special URL is not allowed in external documents!"
+msgstr "ãÅÊ ÓÐÅæÁÌØÎÉÊ URL ÎÅ ÄÏÚ×ÏÌÅÎÉÊ Õ ÚÏ×ΦÛÎ¦È ÄÏËÕÍÅÎÔÁÈ!"
+
+#: LYMessages.c:220
+msgid "Press <return> to return to Lynx."
+msgstr "îÁÔÉÓΦÔØ <×צÄ> ÄÌÑ ÐÏ×ÅÒÎÅÎÎÑ ÄÏ Lynx'Á."
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:223
+msgid "Spawning DCL subprocess. Use 'logout' to return to Lynx.\n"
+msgstr "úÁÐÕÓËÁ¤ÍÏ Ð¦ÄÐÒÏÃÅÓ DCL. 'logout' ÐÏ×ÅÒÎÅ ×ÁÓ ÄÏ Lynx.\n"
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:227
+msgid "Type EXIT to return to Lynx.\n"
+msgstr "îÁÂÅÒ¦ÔØ exit ÄÌÑ ÐÏ×ÅÒÎÅÎÎÑ ÄÏ Lynx'Á.\n"
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:230
+msgid "Spawning your default shell. Use 'exit' to return to Lynx.\n"
+msgstr "úÁÐÕÓËÁ¤ÍÏ ËÏÍÁÎÄÎÕ ÏÂÏÌÏÎËÕ. 'exit' ÐÏ×ÅÒÎÅ ×ÁÓ ÄÏ Lynx.\n"
+
+#: LYMessages.c:233
+msgid "Spawning is currently disabled."
+msgstr "úÁÐÕÓË Ð¦ÄÐÒÏÃÅÓ¦× ÎÁÒÁÚ¦ ÚÁÂÏÒÏÎÅÎÏ."
+
+#: LYMessages.c:234
+msgid "The 'd'ownload command is currently disabled."
+msgstr "ëÏÍÁÎÄÁ 'd'ownload ÎÁÒÁÚ¦ ÚÁÂÏÒÏÎÅÎÁ."
+
+#: LYMessages.c:235
+msgid "You cannot download an input field."
+msgstr "÷É ÎÅ ÍÏÖÅÔÅ ÚÁ×ÁÎÔÁÖÉÔÉ ÐÏÌÅ input."
+
+#: LYMessages.c:236
+msgid "Form has a mailto action! Cannot download."
+msgstr "æÏÒÍÁ ÍÁ¤ ĦÀ \"mailto\"! úÁ×ÁÎÔÁÖÅÎÎÑ ÎÅÍÏÖÌÉ×Å."
+
+#: LYMessages.c:237
+msgid "You cannot download a mailto: link."
+msgstr "÷É ÎÅ ÍÏÖÅÔÅ ÚÁ×ÁÎÔÁÖÉÔÉ ÐÏÓÉÌÁÎÎÑ \"mailto:\"."
+
+#: LYMessages.c:238
+msgid "You cannot download cookies."
+msgstr "÷É ÎÅ ÍÏÖÅÔÅ ÚÁ×ÁÎÔÁÖÉÔÉ ëÕËÉ."
+
+#: LYMessages.c:239
+msgid "You cannot download a printing option."
+msgstr "÷É ÎÅ ÍÏÖÅÔÅ ÚÁ×ÁÎÔÁÖÉÔÉ ËÏÍÁÎÄÕ ÄÒÕËÕ."
+
+#: LYMessages.c:240
+msgid "You cannot download an upload option."
+msgstr "÷É ÎÅ ÍÏÖÅÔÅ ÚÁ×ÁÎÔÁÖÉÔÉ ËÏÍÁÎÄÕ ÐÅÒÅÓÉÌÁÎÎÑ."
+
+#: LYMessages.c:241
+msgid "You cannot download an permit option."
+msgstr "÷É ÎÅ ÍÏÖÅÔÅ \"ÚÁ×ÁÎÔÁÖÉÔÉ\" ÏÐæÀ \"permit\"."
+
+#: LYMessages.c:242
+msgid "This special URL cannot be downloaded!"
+msgstr "ãÅÊ ÎÅÔÉÐÏ×ÉÊ URL ÚÁ×ÁÎÔÁÖÉÔÉ ÎÅÍÏÖÌÉ×Ï!"
+
+# (Ñ ÎÅ ÚÎÁÀ, ΦÑËÉÈ ÕÐÏÄÏÂÁÎØ, ÄÁ×ÁÊ ÏÂÇÏ×ÏÒÀ×ÁÔÉ;)
+# (Ñ ÎÅ ÚÎÁÀ, ΦÑËÉÈ ÕÐÏÄÏÂÁÎØ, ÄÁ×ÁÊ ÏÂÇÏ×ÏÒÀ×ÁÔÉ;)
+#: LYMessages.c:243
+msgid "Nothing to download."
+msgstr "îÅÍÁ ÞÏÇÏ ÚÁ×ÁÎÔÁÖÕ×ÁÔÉ."
+
+# ÎÁÇÏÌÏÓ ÎÁ "õ÷¶íëîåîï!"
+# ÎÁÇÏÌÏÓ ÎÁ "õ÷¶íëîåîï!"
+#: LYMessages.c:244
+msgid "Trace ON!"
+msgstr "ôÒÁÓÕ×ÁÎÎÑ õ÷¶íëîåîï!"
+
+#: LYMessages.c:245
+msgid "Trace OFF!"
+msgstr "ôÒÁÓÕ×ÁÎÎÑ ÷éíëîåîï!"
+
+#. #define CLICKABLE_IMAGES_ON
+#: LYMessages.c:247
+msgid "Links will be included for all images! Reloading..."
+msgstr "ðÏÓÉÌÁÎÎÑ ÂÕÄÕÔØ ÄÏÄÁΦ ÄÌÑ ÕÓ¦È ÚÏÂÒÁÖÅÎØ! ðÅÒÅÚÁ×ÁÎÔÁÖÕ¤ÍÏ..."
+
+#. #define CLICKABLE_IMAGES_OFF
+#: LYMessages.c:249
+msgid "Standard image handling restored! Reloading..."
+msgstr "óÔÁÎÄÁÒÔΦ ÍÁΦÐÕÌÑæ§ ¦Ú ÚÏÂÒÁÖÅÎÎÑÍÉ ÐÏÎÏ×ÌÅÎÏ! ðÅÒÅÚÁ×ÁÎÔÁÖÕ¤ÍÏ..."
+
+#. #define PSEUDO_INLINE_ALTS_ON
+#: LYMessages.c:251
+msgid "Pseudo_ALTs will be inserted for inlines without ALT strings! Reloading..."
+msgstr "ðÓÅ×ÄÏ-ALT ÂÕÄÅ ×ÓÔÁ×ÌÅÎÏ ÄÌÑ ÚÏÂÒÁÖÅÎØ ÂÅÚ ×ËÁÚÁÎÉÈ ALT! ðÅÒÅÚÁ×ÁÎÔÁÖÕ¤ÍÏ..."
+
+#. #define PSEUDO_INLINE_ALTS_OFF
+#: LYMessages.c:253
+msgid "Inlines without an ALT string specified will be ignored! Reloading..."
+msgstr "úÏÂÒÁÖÅÎÎÑ ÂÅÚ ×ËÁÚÁÎÉÈ ALT ÂÕÄÅ ÐÒϦÇÎÏÒÏ×ÁÎÏ! ðÅÒÅÚÁ×ÁÎÔÁÖÕ¤ÍÏ..."
+
+#: LYMessages.c:254
+msgid "Raw 8-bit or CJK mode toggled OFF! Reloading..."
+msgstr "òÅÖÉÍ Raw 8-bit ÞÉ CJK ÷éíëîåîï! ðÅÒÅÚÁ×ÁÎÔÁÖÕ¤ÍÏ..."
+
+#: LYMessages.c:255
+msgid "Raw 8-bit or CJK mode toggled ON! Reloading..."
+msgstr "òÅÖÉÍ Raw 8-bit ÞÉ CJK õ÷¶íëîåîï! ðÅÒÅÚÁ×ÁÎÔÁÖÕ¤ÍÏ..."
+
+#. #define HEAD_D_L_OR_CANCEL
+#: LYMessages.c:257
+msgid "Send HEAD request for D)ocument or L)ink, or C)ancel? (d,l,c): "
+msgstr "îÁĦÓÌÁÔÉ ÚÁÐÉÔ HEAD ÄÌÑ D)ÏËÕÍÅÎÔÁ ÞÉ L)ink, ÞÉ C)ËÁÓÕ×ÁÔÉ? (d,l,c): "
+
+#. #define HEAD_D_OR_CANCEL
+#: LYMessages.c:259
+msgid "Send HEAD request for D)ocument, or C)ancel? (d,c): "
+msgstr "îÁĦÓÌÁÔÉ ÚÁÐÉÔ HEAD ÄÌÑ D)ÏËÕÍÅÎÔÁ, ÞÉ C)ËÁÓÕ×ÁÔÉ? (d,c): "
+
+#: LYMessages.c:260
+msgid "Sorry, the document is not an http URL."
+msgstr "÷ÉÂÁÞÔÅ, ÄÏËÕÍÅÎÔ ÎÅ ¤ http URL."
+
+#: LYMessages.c:261
+msgid "Sorry, the link is not an http URL."
+msgstr "÷ÉÂÁÞÔÅ, ÐÏÓÉÌÁÎÎÑ ÎÅ ¤ http URL."
+
+#: LYMessages.c:262
+msgid "Sorry, the ACTION for this form is disabled."
+msgstr "÷ÉÂÁÞÔÅ ä¶à (ACTION) ÄÌÑ Ã¦¤§ ÆÏÒÍÉ ÚÁÂÏÒÏÎÅÎÏ."
+
+#. #define FORM_ACTION_NOT_HTTP_URL
+#: LYMessages.c:264
+msgid "Sorry, the ACTION for this form is not an http URL."
+msgstr "÷ÉÂÁÞÔÅ, ä¶ñ (ACTION) ÄÌÑ Ã¦¤§ ÆÏÒÍÉ ÎÅ ¤ http URL."
+
+#: LYMessages.c:265
+msgid "Not an http URL or form ACTION!"
+msgstr "ãÅ ÎÅ http URL ÞÉ ä¶ñ (ACTION) ÆÏÒÍÉ!"
+
+#: LYMessages.c:266
+msgid "This special URL cannot be a form ACTION!"
+msgstr "ãÅÊ ÎÅÔÉÐÏ×ÉÊ URL ÎÅ ÍÏÖÅ ÂÕÔÉ ä¶´à (ACTION) ÆÏÒÍÉ!"
+
+#: LYMessages.c:267
+msgid "URL is not in starting realm!"
+msgstr "URL ÚÁ ÍÅÖÁÍÉ ÐÏÞÁÔËÏ×ϧ ÏÂÌÁÓÔ¦ ÄÏÓÔÕÐÕ!"
+
+#: LYMessages.c:268
+msgid "News posting is disabled!"
+msgstr "îÁÄÓÉÌÁÎÎÑ ÎÏ×ÉÎ ÚÁÂÏÒÏÎÅÎÏ!"
+
+#: LYMessages.c:269
+msgid "File management support is disabled!"
+msgstr "ð¦ÄÔÒÉÍËÕ ÕÐÒÁ×̦ÎÎÑ ÆÁÊÌÁÍÉ ÚÁÂÏÒÏÎÅÎÏ!"
+
+#: LYMessages.c:270
+msgid "No jump file is currently available."
+msgstr ""
+
+#: LYMessages.c:271
+msgid "Jump to (use '?' for list): "
+msgstr "óÔÒÉÂÎÕÔÉ ÄÏ ('?' ÐÏËÁÖÅ ÓÐÉÓÏË): "
+
+#: LYMessages.c:272
+msgid "Jumping to a shortcut URL is disallowed!"
+msgstr "óÔÒÉÂÁÔÉ ÄÏ shortcut URL ÚÁÂÏÒÏÎÅÎÏ!"
+
+#: LYMessages.c:273
+msgid "Random URL is disallowed! Use a shortcut."
+msgstr ""
+
+#: LYMessages.c:274
+msgid "No random URLs have been used thus far."
+msgstr ""
+
+#: LYMessages.c:275
+msgid "Bookmark features are currently disabled."
+msgstr "ïÐÅÒÁæ§ ¦Ú ÚÁËÌÁÄÉÎËÁÍÉ ÎÁÒÁÚ¦ ÚÁÂÏÒÏÎÅÎÏ."
+
+#: LYMessages.c:276
+msgid "Execution via bookmarks is disabled."
+msgstr "úÁÐÕÓËÁÔÉ ÐÒÏÇÒÁÍÉ ÞÅÒÅÚ ÚÁËÌÁÄÉÎËÉ ÚÁÂÏÒÏÎÅÎÏ."
+
+#. #define BOOKMARK_FILE_NOT_DEFINED
+#: LYMessages.c:278
+#, c-format
+msgid "Bookmark file is not defined. Use %s to see options."
+msgstr "æÁÊÌÁ ÚÁËÌÁÄÉÎÏË ÎÅ ×ÉÚÎÁÞÅÎÏ. %s ÐÏËÁÖÅ ×ÁÒ¦ÁÎÔÉ."
+
+#. #define NO_TEMP_FOR_HOTLIST
+#: LYMessages.c:280
+msgid "Unable to open tempfile for X Mosaic hotlist conversion."
+msgstr "îÅÍÏÖÌÉ×Ï ×¦ÄËÒÉÔÉ ÔÉÍÞÁÓÏ×ÉÊ ÆÁÊÌ ÄÌÑ ËÏÎ×ÅÒÓ¦§ X Mosaic hotlist."
+
+#: LYMessages.c:281
+msgid "ERROR - unable to open bookmark file."
+msgstr "ðïíéìëá - ÎÅÍÏÖÌÉ×Ï ×¦ÄËÒÉÔÉ ÆÁÊÌ ÚÁËÌÁÄÉÎÏË."
+
+#. #define BOOKMARK_OPEN_FAILED_FOR_DEL
+#: LYMessages.c:283
+msgid "Unable to open bookmark file for deletion of link."
+msgstr "îÅÍÏÖÌÉ×Ï ×¦ÄËÒÉÔÉ ÆÁÊÌ ÚÁËÌÁÄÉÎÏË ÄÌÑ ×ÉÄÁÌÅÎÎÑ ÐÏÓÉÌÁÎÎÑ."
+
+#. #define BOOKSCRA_OPEN_FAILED_FOR_DEL
+#: LYMessages.c:285
+msgid "Unable to open scratch file for deletion of link."
+msgstr "îÅÍÏÖÌÉ×Ï ×¦ÄËÒÉÔÉ ÔÉÍÞÁÓÏ×ÉÊ ÆÁÊÌ ÄÌÑ ×ÉÄÁÌÅÎÎÑ ÐÏÓÉÌÁÎÎÑ."
+
+#: LYMessages.c:287
+msgid "Error renaming scratch file."
+msgstr "ðÏÍÉÌËÁ ÐÅÒÅÊÍÅÎÕ×ÁÎÎÑ ÔÉÍÞÁÓÏ×ÏÇÏ ÆÁÊÌÕ."
+
+#: LYMessages.c:289
+msgid "Error renaming temporary file."
+msgstr "ðÏÍÉÌËÁ ÐÅÒÅÊÍÅÎÕ×ÁÎÎÑ ÔÉÍÞÁÓÏ×ÏÇÏ ÆÁÊÌÕ."
+
+#. #define BOOKTEMP_COPY_FAIL
+#: LYMessages.c:291
+msgid "Unable to copy temporary file for deletion of link."
+msgstr "îÅÍÏÖÌÉ×Ï ÓËÏЦÀ×ÁÔÉ ÔÉÍÞÁÓÏ×ÉÊ ÆÁÊÌ ÄÌÑ ×ÉÄÁÌÅÎÎÑ ÐÏÓÉÌÁÎÎÑ."
+
+#. #define BOOKTEMP_REOPEN_FAIL_FOR_DEL
+#: LYMessages.c:293
+msgid "Unable to reopen temporary file for deletion of link."
+msgstr "îÅÍÏÖÌÉ×Ï ÐÅÒÅצÄËÒÉÔÉ ÔÉÍÞÁÓÏ×ÉÊ ÆÁÊÌ ÄÌÑ ×ÉÄÁÌÅÎÎÑ ÐÏÓÉÌÁÎÎÑ."
+
+#. #define BOOKMARK_LINK_NOT_ONE_LINE
+#: LYMessages.c:296
+msgid "Link is not by itself all on one line in bookmark file."
+msgstr "ðÏÓÉÌÁÎÎÑ ÚÁÊÍÁ¤ ¦ÌØÛÅ ÏÄÎÏÇÏ ÒÑÄËÁ Õ ÆÁÊ̦ ÚÁËÌÁÄÉÎÏË."
+
+#: LYMessages.c:297
+msgid "Bookmark deletion failed."
+msgstr "÷ÉÄÁÌÉÔÉ ÚÁËÌÁÄÉÎËÕ ÎÅ ×ÄÁÌÏÓÑ."
+
+#. #define BOOKMARKS_NOT_TRAVERSED
+#: LYMessages.c:299
+msgid "Bookmark files cannot be traversed (only http URLs)."
+msgstr ""
+
+#. #define BOOKMARKS_NOT_OPEN
+#: LYMessages.c:301
+msgid "Unable to open bookmark file, use 'a' to save a link first"
+msgstr "îÅÍÏÖÌÉ×Ï ×¦ÄËÒÉÔÉ ÆÁÊÌ ÚÁËÌÁÄÉÎÏË, ÓÐÅÒÛÕ ÚÂÅÒÅÖ¦ÔØ ÔÁÍ ÝÏÓØ ('a')"
+
+#: LYMessages.c:302
+msgid "There are no links in this bookmark file!"
+msgstr "õ ÆÁÊ̦ ÚÁËÌÁÄÉÎÏË ÎÅÍÁ¤ ÐÏÓÉÌÁÎØ!"
+
+#. #define CACHE_D_OR_CANCEL
+#: LYMessages.c:304
+#, fuzzy
+msgid "D)elete cached document or C)ancel? (d,c): "
+msgstr "îÁĦÓÌÁÔÉ ÚÁÐÉÔ HEAD ÄÌÑ D)ÏËÕÍÅÎÔÁ, ÞÉ C)ËÁÓÕ×ÁÔÉ? (d,c): "
+
+#. #define BOOK_D_L_OR_CANCEL
+#: LYMessages.c:306
+msgid "Save D)ocument or L)ink to bookmark file or C)ancel? (d,l,c): "
+msgstr "úÂÅÒÅÇÔÉ D)ÏËÕÍÅÎÔ, ÚÒÏÂÉÔÉ ÚÁËL)ÁÄÉÎËÕ ÞÉ C)ËÁÓÕ×ÁÔÉ? (d,l,c): "
+
+#: LYMessages.c:307
+msgid "Save D)ocument to bookmark file or C)ancel? (d,c): "
+msgstr "úÂÅÒÅÇÔÉ D)ÏËÕÍÅÎÔ Õ ÆÁÊ̦ ÚÁËÌÁÄÉÎÏË ÞÉ C)ËÁÓÕ×ÁÔÉ? (d,c): "
+
+#: LYMessages.c:308
+msgid "Save L)ink to bookmark file or C)ancel? (l,c): "
+msgstr "úÂÅÒÅÇÔÉ ÐÏÓÉL)ÁÎÎÑ Õ ÆÁÊ̦ ÚÁËÌÁÄÉÎÏË ÞÉ C)ËÁÓÕ×ÁÔÉ? (l,c): "
+
+#. #define NOBOOK_POST_FORM
+#: LYMessages.c:310
+msgid "Documents from forms with POST content cannot be saved as bookmarks."
+msgstr "äÏËÕÍÅÎÔÉ, ÏÔÒÉÍÁΦ ÞÅÒÅÚ ÆÏÒÍÕ POST, ÎÅÍÏÖÌÉ×Ï ÚÂÅÒÅÇÔÉ ÑË ÚÁËÌÁÄÉÎËÉ."
+
+#: LYMessages.c:311
+msgid "Cannot save form fields/links"
+msgstr "îÅÍÏÖÌÉ×Ï ÚÂÅÒÅÇÔÉ ÐÏÌÑ/ÐÏÓÉÌÁÎÎÑ ÆÏÒÍÉ"
+
+#. #define NOBOOK_HSML
+#: LYMessages.c:313
+msgid "History, showinfo, menu and list files cannot be saved as bookmarks."
+msgstr "¶ÓÔÏÒ¦À, showinfo, ÍÅÎÀ ÔÁ ÆÁÊÌÉ ÓÐÉÓË¦× ÎÅÍÏÖÌÉ×Ï ÚÂÅÒ¦ÇÁÔÉ ÑË ÚÁËÌÁÄÉÎËÉ."
+
+#. #define CONFIRM_BOOKMARK_DELETE
+#: LYMessages.c:315
+msgid "Do you really want to delete this link from your bookmark file?"
+msgstr "þÉ ×É Ä¦ÊÓÎÏ ÂÁÖÁ¤ÔÅ ÚÎÉÝÉÔÉ ÃÅ ÐÏÓÉÌÁÎÎÑ ¦Ú ÆÁÊÌÕ ÚÁËÌÁÄÉÎÏË?"
+
+#: LYMessages.c:316
+msgid "Malformed address."
+msgstr "îÅצÒÎÏ ÓÆÏÒÍÏ×ÁÎÁ ÁÄÒÅÓÁ."
+
+#. #define HISTORICAL_ON_MINIMAL_OFF
+#: LYMessages.c:318
+msgid "Historical comment parsing ON (Minimal is overridden)!"
+msgstr ""
+
+#. #define HISTORICAL_OFF_MINIMAL_ON
+#: LYMessages.c:320
+msgid "Historical comment parsing OFF (Minimal is in effect)!"
+msgstr ""
+
+#. #define HISTORICAL_ON_VALID_OFF
+#: LYMessages.c:322
+msgid "Historical comment parsing ON (Valid is overridden)!"
+msgstr ""
+
+#. #define HISTORICAL_OFF_VALID_ON
+#: LYMessages.c:324
+msgid "Historical comment parsing OFF (Valid is in effect)!"
+msgstr ""
+
+#. #define MINIMAL_ON_IN_EFFECT
+#: LYMessages.c:326
+msgid "Minimal comment parsing ON (and in effect)!"
+msgstr ""
+
+#. #define MINIMAL_OFF_VALID_ON
+#: LYMessages.c:328
+msgid "Minimal comment parsing OFF (Valid is in effect)!"
+msgstr ""
+
+#. #define MINIMAL_ON_BUT_HISTORICAL
+#: LYMessages.c:330
+msgid "Minimal comment parsing ON (but Historical is in effect)!"
+msgstr ""
+
+#. #define MINIMAL_OFF_HISTORICAL_ON
+#: LYMessages.c:332
+msgid "Minimal comment parsing OFF (Historical is in effect)!"
+msgstr ""
+
+#: LYMessages.c:333
+msgid "Soft double-quote parsing ON!"
+msgstr "\"í'ÑËÉÊ\" ÒÅÖÉÍ ÏÂÒÏÂËÉ ÐÏÄצÊÎÉÈ ÌÁÐÏË õ÷¶íëîåîï!"
+
+#: LYMessages.c:334
+msgid "Soft double-quote parsing OFF!"
+msgstr "\"í'ÑËÉÊ\" ÒÅÖÉÍ ÏÂÒÏÂËÉ ÐÏÄצÊÎÉÈ ÌÁÐÏË ÷éíëîåîï!"
+
+#: LYMessages.c:335
+msgid "Now using TagSoup parsing of HTML."
+msgstr "÷ÉËÏÒÉÓÔÏ×Õ¤ÍÏ TagSoup-ÏÂÒÏÂËÕ HTML."
+
+#: LYMessages.c:336
+msgid "Now using SortaSGML parsing of HTML!"
+msgstr "÷ÉËÏÒÉÓÔÏ×Õ¤ÍÏ SortaSGML-ÏÂÒÏÂËÕ HTML!"
+
+#: LYMessages.c:337
+msgid "You are already at the end of this document."
+msgstr "÷É ×ÖÅ × Ë¦Îæ ÃØÏÇÏ ÄÏËÕÍÅÎÔÁ."
+
+#: LYMessages.c:338
+msgid "You are already at the beginning of this document."
+msgstr "÷É ×ÖÅ ÎÁ ÐÏÞÁÔËÕ ÃØÏÇÏ ÄÏËÕÍÅÎÔÁ."
+
+#: LYMessages.c:339
+#, c-format
+msgid "You are already at page %d of this document."
+msgstr "÷É ×ÖÅ ÎÁ ÓÔÏÒ¦Îæ %d ÃØÏÇÏ ÄÏËÕÍÅÎÔÁ."
+
+#: LYMessages.c:340
+#, c-format
+msgid "Link number %d already is current."
+msgstr "ðÏÓÉÌÁÎÎÑ Ú ÎÏÍÅÒÏÍ %d ÑËÒÁÚ ¤ ÐÏÔÏÞÎÉÍ."
+
+# ÍÅΦ ÎÅ ÐÏÄÏÂÁ¤ÔØÓÑ "ÎÁ ÄÏËÕÍÅÎÔ¦"
+# ÍÅΦ ÎÅ ÐÏÄÏÂÁ¤ÔØÓÑ "ÎÁ ÄÏËÕÍÅÎÔ¦"
+#: LYMessages.c:341
+msgid "You are already at the first document"
+msgstr "÷É ×ÖÅ ÂÁÞÉÔÅ ÐÅÒÛÉÊ ÄÏËÕÍÅÎÔ"
+
+#: LYMessages.c:342
+msgid "There are no links above this line of the document."
+msgstr "îÁÄ ÃÉÍ ÒÑÄËÏÍ ÄÏËÕÍÅÎÔÁ ÐÏÓÉÌÁÎØ ÎÅÍÁ¤."
+
+#: LYMessages.c:343
+msgid "There are no links below this line of the document."
+msgstr "ð¦Ä ÃÉÍ ÒÑÄËÏÍ ÄÏËÕÍÅÎÔÁ ÐÏÓÉÌÁÎØ ÎÅÍÁ¤."
+
+#. #define MAXLEN_REACHED_DEL_OR_MOV
+#: LYMessages.c:345
+msgid "Maximum length reached! Delete text or move off field."
+msgstr "äÏÓÑÇÎÕÔÏ ÍÁËÓÉÍÁÌØÎϧ ÄÏ×ÖÉÎÉ! ú¦ÔÒ¦ÔØ ÔÅËÓÔ ÞÉ ÚÁÌÉÛÔÅ ÐÏÌÅ."
+
+#. #define NOT_ON_SUBMIT_OR_LINK
+#: LYMessages.c:347
+msgid "You are not on a form submission button or normal link."
+msgstr "÷É ÎÅ ÎÁ ËÎÏÐæ ÚÁÔ×ÅÒÄÖÅÎÎÑ ÆÏÒÍÉ ÞÉ Ú×ÉÞÁÊÎÏÍÕ ÐÏÓÉÌÁÎΦ."
+
+#. #define NEED_CHECKED_RADIO_BUTTON
+#: LYMessages.c:349
+msgid "One radio button must be checked at all times!"
+msgstr "ïÄÎÁ ÒÁĦÏËÎÏÐËÁ ÚÁ×ÖÄÉ ÍÕÓÉÔØ ÂÕÔÉ ÁËÔÉ×Ï×ÁÎÁ!"
+
+#: LYMessages.c:350
+msgid "No submit button for this form, submit single text field?"
+msgstr "îÅÍÁ ËÎÏÐËÉ ×¦ÄÓÉÌÁÎÎÑ Ã¦¤§ ÆÏÒÍÉ, צĦÓÌÁÔÉ ÌÉÛÅ ÔÅËÓÔÏ×Å ÐÏÌÅ?"
+
+#: LYMessages.c:351
+msgid "Do you want to go back to the previous document?"
+msgstr "âÁÖÁ¤ÔÅ ÐÏ×ÅÒÎÕÔÉÓÑ ÄÏ ÐÏÐÅÒÅÄÎØÏÇÏ ÄÏËÕÍÅÎÔÁ?"
+
+#: LYMessages.c:352
+msgid "Use arrows or tab to move off of field."
+msgstr "÷ÉËÏÒÉÓÔÏ×ÕÊÔÅ ÓÔÒ¦ÌËÉ ÞÉ ÔÁÂÕÌÑæÀ ÝÏ ڦÊÔÉ Ú ÐÏÌÑ ÆÏÒÍÉ."
+
+#. #define ENTER_TEXT_ARROWS_OR_TAB
+#: LYMessages.c:354
+msgid "Enter text. Use arrows or tab to move off of field."
+msgstr "÷×ÅĦÔØ ÔÅËÓÔ. ÷ÉËÏÒÉÓÔÏ×ÕÊÔÅ ÓÔÒ¦ÌËÉ ÞÉ ÔÁÂÕÌÑæÀ, ÝÏ ڦÊÔÉ."
+
+#: LYMessages.c:355
+msgid "** Bad HTML!! No form action defined. **"
+msgstr "** ðÏÇÁÎÉÊ HTML!! îÅ ×ÉÚÎÁÞÅÎÏ ä¶à ÆÏÒÍÉ. **"
+
+#: LYMessages.c:356
+msgid "Bad HTML!! Unable to create popup window!"
+msgstr "** äÕÒÎÉÊ HTML!! îÅÍÏÖÌÉ×Ï ÓÔ×ÏÒÉÔÉ ÓÐÌÉ×ÁÀÞŠצËÎÏ!"
+
+#: LYMessages.c:357
+msgid "Unable to create popup window!"
+msgstr "îÅÍÏÖÌÉ×Ï ÓÔ×ÏÒÉÔÉ ÓÐÌÉ×ÁÀÞŠצËÎÏ!"
+
+#: LYMessages.c:358
+msgid "Goto a random URL is disallowed!"
+msgstr "ðÅÒÅÈÏÄÉ ÎÁ ×ÉÐÁÄËÏצ URL'¦ ÚÁÂÏÒÏÎÅΦ!"
+
+#: LYMessages.c:359
+msgid "Goto a non-http URL is disallowed!"
+msgstr "ðÅÒÅÈÏÄÉ ÎÁ ÎÅ-http URL'¦ ÚÁÂÏÒÏÎÅΦ!"
+
+#: LYMessages.c:360
+#, c-format
+msgid "You are not allowed to goto \"%s\" URLs"
+msgstr "÷ÁÍ ÎÅ ÄÏÚ×ÏÌÅÎÏ ÐÅÒÅÈÏÄÉÔÉ ÄÏ \"%s:\" URL'¦×"
+
+#: LYMessages.c:361
+msgid "URL to open: "
+msgstr "÷×ÅĦÔØ ÁÄÒÅÓÕ: "
+
+#: LYMessages.c:362
+msgid "Edit the current Goto URL: "
+msgstr "úËÏÒÉÇÕÊÔÅ ÃÀ ÁÄÒÅÓÕ: "
+
+#: LYMessages.c:363
+msgid "Edit the previous Goto URL: "
+msgstr "úËÏÒÉÇÕÊÔÅ ÐÏÐÅÒÅÄÎÀ ÁÄÒÅÓÕ: "
+
+#: LYMessages.c:364
+msgid "Edit a previous Goto URL: "
+msgstr "úËÏÒÉÇÕÊÔÅ ÐÏÐÅÒÅÄÎÀ ÁÄÒÅÓÕ: "
+
+#: LYMessages.c:365
+msgid "Current document has POST data."
+msgstr "ãÅÊ ÄÏËÕÍÅÎÔ Í¦ÓÔÉÔØ ÄÁΦ ÄÌÑ POST"
+
+#: LYMessages.c:366
+msgid "Edit this document's URL: "
+msgstr "úËÏÒÉÇÕÊÔÅ ÁÄÒÅÓÕ ÃØÏÇÏ ÄÏËÕÍÅÎÔÁ: "
+
+#: LYMessages.c:367
+msgid "Edit the current link's URL: "
+msgstr "úËÏÒÉÇÕÊÔÅ ÁÄÒÅÓÕ ÃØÏÇÏ ÐÏÓÉÌÁÎÎÑ: "
+
+#: LYMessages.c:368
+msgid "You cannot edit File Management URLs"
+msgstr "÷É ÎÅ ÍÏÖÅÔÅ ÒÅÄÁÇÕ×ÁÔÉ URL'¦ ËÅÒÕ×ÁÎÎÑ ÆÁÊÌÁÍÉ"
+
+#: LYMessages.c:369
+msgid "Enter a database query: "
+msgstr "÷×ÅĦÔØ ÚÁÐÉÔ ÄÏ ÂÁÚÉ ÄÁÎÉÈ: "
+
+#: LYMessages.c:370
+msgid "Enter a whereis query: "
+msgstr "÷×ÅĦÔØ ÚÁÐÉÔ whereis: "
+
+#: LYMessages.c:371
+msgid "Edit the current query: "
+msgstr "úËÏÒÉÇÕÊÔÅ ÃÅÊ ÚÁÐÉÔ: "
+
+#: LYMessages.c:372
+msgid "Edit the previous query: "
+msgstr "úËÏÒÉÇÕÊÔÅ ÐÏÐÅÒÅÄÎ¦Ê ÚÁÐÉÔ: "
+
+#: LYMessages.c:373
+msgid "Edit a previous query: "
+msgstr "úËÏÒÉÇÕÊÔÅ ÐÏÐÅÒÅÄÎ¦Ê ÚÁÐÉÔ: "
+
+#. #define USE_C_R_TO_RESUB_CUR_QUERY
+#: LYMessages.c:375
+msgid "Use Control-R to resubmit the current query."
+msgstr "îÁÔÉÓΦÔØ Control-R ÄÌÑ ÐÅÒÅÚÁÔ×ÅÒÄÖÅÎÎÑ ÃØÏÇÏ ÚÁÐÉÔÕ."
+
+#: LYMessages.c:376
+msgid "Edit the current shortcut: "
+msgstr "úËÏÒÉÇÕÊÔÅ ÃÀ ÚÁËÌÁÄÉÎËÕ: "
+
+#: LYMessages.c:377
+msgid "Edit the previous shortcut: "
+msgstr "úËÏÒÉÇÕÊÔÅ ÐÏÐÅÒÅÄÎÀ ÚÁËÌÁÄÉÎËÕ: "
+
+#: LYMessages.c:378
+msgid "Edit a previous shortcut: "
+msgstr "úËÏÒÉÇÕÊÔÅ ÐÏÐÅÒÅÄÎÀ ÚÁËÌÁÄÉÎËÕ: "
+
+#: LYMessages.c:379
+#, c-format
+msgid "Key '%c' is not mapped to a jump file!"
+msgstr ""
+
+#: LYMessages.c:380
+msgid "Cannot locate jump file!"
+msgstr "îÅ ÍÏÖÕ ÚÎÁÊÔÉ jump file!"
+
+#: LYMessages.c:381
+msgid "Cannot open jump file!"
+msgstr "îÅ ÍÏÖÕ ×¦ÄËÒÉÔÉ jump file!"
+
+#: LYMessages.c:382
+msgid "Error reading jump file!"
+msgstr "ðÏÍÉÌËÁ ÞÉÔÁÎÎÑ jump file!"
+
+#: LYMessages.c:383
+msgid "Out of memory reading jump file!"
+msgstr "îÅ ×ÉÓÔÁÞÉÌÏ ÐÁÍ'ÑÔ¦ ÐÒÉ ÞÉÔÁÎΦ jump file!"
+
+#: LYMessages.c:384
+msgid "Out of memory reading jump table!"
+msgstr "îÅ ×ÉÓÔÁÞÉÌÏ ÐÁÍ'ÑÔ¦ ÐÒÉ ÞÉÔÁÎΦ jump table!"
+
+#: LYMessages.c:385
+msgid "No index is currently available."
+msgstr "öÏÄÅÎ ¦ÎÄÅËÓ ÎÁÒÁÚ¦ ÎÅÄÏÓÔÕÐÎÉÊ."
+
+# ÐÅÒÅÊÔÉ ÎÁ ÅËÒÁÎ - ÃÅ ÝÏÓØ Ë¦ÎÏÛÎÅ ;)
+# ÐÅÒÅÊÔÉ ÎÁ ÅËÒÁÎ - ÃÅ ÝÏÓØ Ë¦ÎÏÛÎÅ ;)
+#. #define CONFIRM_MAIN_SCREEN
+#: LYMessages.c:387
+msgid "Do you really want to go to the Main screen?"
+msgstr "÷É ÓÐÒÁ×Ħ ÈÏÞÅÔÅ ÐÅÒÅÊÔÉ ÄÏ ÇÏÌÏ×ÎÏÇÏ ÅËÒÁÎÕ?"
+
+# ÎÁ ÅËÒÁΦ - ÃÅ ÝÏÓØ Ë¦ÎÏÛÎÅ ;)
+# ÎÁ ÅËÒÁΦ - ÃÅ ÝÏÓØ Ë¦ÎÏÛÎÅ ;)
+#: LYMessages.c:388
+msgid "You are already at main screen!"
+msgstr "÷É ÑËÒÁÚ ÂÁÞÉÔÅ ÇÏÌÏ×ÎÉÊ ÅËÒÁÎ!"
+
+#. #define NOT_ISINDEX
+#: LYMessages.c:390
+msgid "Not a searchable indexed document -- press '/' to search for a text string"
+msgstr ""
+
+#. #define NO_OWNER
+#: LYMessages.c:392
+msgid "No owner is defined for this file so you cannot send a comment"
+msgstr "÷ÌÁÓÎÉËÁ ÃØÏÇÏ ÆÁÊÌÕ ÎÅ ×ÉÚÎÁÞÅÎÏ, ÏÔÖÅ ÎÅÍÏÖÌÉ×Ï ÎÁĦÓÌÁÔÉ ËÏÍÅÎÔÁÒ"
+
+#: LYMessages.c:393
+#, c-format
+msgid "No owner is defined. Use %s?"
+msgstr "÷ÌÁÓÎÉËÁ ÎÅ ×ÉÚÎÁÞÅÎÏ. ÷ÉËÏÒÉÓÔÁÔÉ %s?"
+
+#: LYMessages.c:394
+msgid "Do you wish to send a comment?"
+msgstr "÷É ÂÁÖÁ¤ÔŠצĦÓÌÁÔÉ ËÏÍÅÎÔÁÒ?"
+
+#: LYMessages.c:395
+msgid "Mail is disallowed so you cannot send a comment"
+msgstr "îÁÄÓÉÌÁÔÉ ÐÏÛÔÕ ÚÁÂÏÒÏÎÅÎÏ, ÔÏÖ ×É ÎÅ ÍÏÖÅÔŠצĦÓÌÁÔÉ ËÏÍÅÎÔÁÒ."
+
+#: LYMessages.c:396
+msgid "The 'e'dit command is currently disabled."
+msgstr "ëÏÍÁÎÄÕ Ò'Å'ÄÁÇÕ×ÁÔÉ ÎÁÒÁÚ¦ ÚÁÂÏÒÏÎÅÎÏ."
+
+#: LYMessages.c:397
+msgid "External editing is currently disabled."
+msgstr "úÏ×ΦÛΤ ÒÅÄÁÇÕ×ÁÎÎÑ ÎÁÒÁÚ¦ ÚÁÂÏÒÏÎÅÎÏ."
+
+#: LYMessages.c:398
+msgid "System error - failure to get status."
+msgstr "óÉÓÔÅÍÎÁ ÐÏÍÉÌËÁ - ÎÅ ×ÄÁÌÏÓÑ ÏÔÒÉÍÁÔÉ ÓÔÁÔÕÓ."
+
+#: LYMessages.c:399
+msgid "No editor is defined!"
+msgstr "îÅ ×ÉÚÎÁÞÅÎÏ ÐÒÏÇÒÁÍÕ ÄÌÑ ÒÅÄÁÇÕ×ÁÎÎÑ!"
+
+#: LYMessages.c:400
+msgid "The 'p'rint command is currently disabled."
+msgstr "ëÏÍÁÎÄÕ Ä'Ò'ÕËÕ×ÁÔÉ ÎÁÒÁÚ¦ ÚÁÂÏÒÏÎÅÎÏ."
+
+#: LYMessages.c:401
+msgid "Document has no Toolbar links or Banner."
+msgstr "äÏËÕÍÅÎÔ ÎŠͦÓÔÉÔØ ÐÏÓÉÌÁÎØ ÐÁÎÅ̦ ¦ÎÓÔÒÕÍÅÎÔ¦× ÞÉ ÂÁÎÅÒ¦×."
+
+#: LYMessages.c:402
+msgid "Unable to open traversal file."
+msgstr "îÅ ÍÏÖÕ ×¦ÄËÒÉÔÉ traversal file."
+
+#: LYMessages.c:403
+msgid "Unable to open traversal found file."
+msgstr "îÅ ÍÏÖÕ ×¦ÄËÒÉÔÉ traversal found file."
+
+#: LYMessages.c:404
+msgid "Unable to open reject file."
+msgstr "îÅ ÍÏÖÕ ×¦ÄËÒÉÔÉ reject file."
+
+#: LYMessages.c:405
+msgid "Unable to open traversal errors output file"
+msgstr "îÅ ÍÏÖÕ ×¦ÄËÒÉÔÉ traversal errors output file"
+
+#: LYMessages.c:406
+msgid "TRAVERSAL WAS INTERRUPTED"
+msgstr ""
+
+#: LYMessages.c:407
+msgid "Follow link (or goto link or page) number: "
+msgstr "êÔÉ ÚÁ ÐÏÓÉÌÁÎÎÑÍ (ÁÂÏ ÐÅÒÅÊÔÉ ÎÁ ÓÔÏÒ¦ÎËÕ) ¦Ú ÎÏÍÅÒÏÍ: "
+
+#: LYMessages.c:408
+msgid "Select option (or page) number: "
+msgstr "÷ËÁÖ¦ÔØ ÎÏÍÅÒ ×ÁÒ¦ÁÎÔÕ ÞÉ ÓÔÏÒ¦ÎËÉ: "
+
+#: LYMessages.c:409
+#, c-format
+msgid "Option number %d already is current."
+msgstr "÷ÁÒ¦ÁÎÔ ÎÏÍÅÒ %d ÑËÒÁÚ ¤ ÐÏÔÏÞÎÉÍ."
+
+#. #define ALREADY_AT_OPTION_END
+#: LYMessages.c:411
+msgid "You are already at the end of this option list."
+msgstr "÷É ×ÖÅ × Ë¦Îæ ÃØÏÇÏ ÓÐÉÓËÕ."
+
+#. #define ALREADY_AT_OPTION_BEGIN
+#: LYMessages.c:413
+msgid "You are already at the beginning of this option list."
+msgstr "÷É ×ÖÅ ÎÁ ÐÏÞÁÔËÕ ÃØÏÇÏ ÓÐÉÓËÕ."
+
+#. #define ALREADY_AT_OPTION_PAGE
+#: LYMessages.c:415
+#, c-format
+msgid "You are already at page %d of this option list."
+msgstr "÷É ×ÖÅ ÑËÒÁÚ ÓÔÏÒ¦Îæ %d ÃØÏÇÏ ÓÐÉÓËÕ."
+
+#: LYMessages.c:416
+msgid "You have entered an invalid option number."
+msgstr "÷É ××ÅÌÉ ÎÅצÒÎÉÊ ÎÏÍÅÒ ×ÁÒ¦ÁÎÔÕ."
+
+#: LYMessages.c:417
+msgid "** Bad HTML!! Use -trace to diagnose. **"
+msgstr "** ðÏÇÁÎÉÊ HTML!! äÌÑ Ä¦ÁÇÎÏÓÔÉËÉ ×ÉËÏÒÉÓÔÁÊÔÅ ÐÁÒÁÍÅÔÒ -trace. **"
+
+#: LYMessages.c:418
+msgid "Give name of file to save in"
+msgstr "÷ËÁÖ¦ÔØ ¦Í'Ñ ÆÁÊÌÕ, Õ ÑËÏÍÕ ÚÂÅÒÅÇÔÉ"
+
+#: LYMessages.c:419
+msgid "Can't save data to file -- please run WWW locally"
+msgstr ""
+
+#: LYMessages.c:420
+msgid "Can't open temporary file!"
+msgstr "îÅÍÏÖÌÉ×Ï ×¦ÄËÒÉÔÉ ÔÉÍÞÁÓÏ×ÉÊ ÆÁÊÌ!"
+
+#: LYMessages.c:421
+msgid "Can't open output file! Cancelling!"
+msgstr "îÅÍÏÖÌÉ×Ï ×¦ÄËÒÉÔÉ ×ÉȦÄÎÉÊ ÆÁÊÌ! ÷¦ÄͦÎÅÎÏ!"
+
+#: LYMessages.c:422
+msgid "Execution is disabled."
+msgstr "úÁÐÕÓËÁÔÉ ËÏÍÁÎÄÉ ÚÁÂÏÒÏÎÅÎÏ."
+
+#. #define EXECUTION_DISABLED_FOR_FILE
+#: LYMessages.c:424
+#, c-format
+msgid "Execution is not enabled for this file. See the Options menu (use %s)."
+msgstr "÷ÉËÏÎÁÎÎÑ ÎÅ ÄÏÚ×ÏÌÅÎÅ ÄÌÑ ÃØÏÇÏ ÆÁÊÌÕ. äÉ×ÉÓØ ÍÅÎÀ ÐÁÒÁÍÅÔÒ¦× (%s)."
+
+#. #define EXECUTION_NOT_COMPILED
+#: LYMessages.c:426
+msgid "Execution capabilities are not compiled into this version."
+msgstr "íÏÖÌÉצÓÔØ ÚÁÐÕÓËÁÎÎÑ ÐÒÏÇÒÁÍ ÎÅ ÓËÏÍЦÌØÏ×ÁÎÁ × Ã¦Ê ×ÅÒÓ¦§."
+
+#: LYMessages.c:427
+msgid "This file cannot be displayed on this terminal."
+msgstr "ãÅÊ ÆÁÊÌ ÎÅÍÏÖÌÉ×Ï ÐÏËÁÚÁÔÉ ÎÁ ÔÁËÏÍÕ ÔÅÒͦÎÁ̦."
+
+#. #define CANNOT_DISPLAY_FILE_D_OR_C
+#: LYMessages.c:429
+msgid "This file cannot be displayed on this terminal: D)ownload, or C)ancel"
+msgstr "ãÅÊ ÆÁÊÌ ÎÅÍÏÖÌÉ×Ï ÐÏËÁÚÁÔÉ ÎÁ ÔÅÒͦÎÁ̦: D) ÔÑÇÔÉ ÞÉ C)ËÁÓÕ×ÁÔÉ"
+
+# nothing to say
+# nothing to say
+#: LYMessages.c:430
+#, c-format
+msgid "%s D)ownload, or C)ancel"
+msgstr "%s D) ÔÑÇÔÉ ÞÉ C)ËÁÓÕ×ÁÔÉ"
+
+#: LYMessages.c:431
+msgid "Cancelling file."
+msgstr "æÁÊÌ ÓËÁÓÏ×ÁÎÏ."
+
+#: LYMessages.c:432
+msgid "Retrieving file. - PLEASE WAIT -"
+msgstr "ôÑÇÎÅÍÏ ÆÁÊÌ. - úáþåëáêôå -"
+
+#: LYMessages.c:433
+msgid "Enter a filename: "
+msgstr "÷×ÅĦÔØ ¦Í'Ñ ÆÁÊÌÕ: "
+
+#: LYMessages.c:434
+msgid "Edit the previous filename: "
+msgstr "÷×ÅĦÔØ ÐÏÐÅÒÅÄΤ ¦Í'Ñ ÆÁÊÌÕ: "
+
+#: LYMessages.c:435
+msgid "Edit a previous filename: "
+msgstr "úËÏÒÉÇÕÊÔÅ ÐÏÐÅÒÅÄΤ ¦Í'Ñ ÆÁÊÌÁ: "
+
+#: LYMessages.c:436
+msgid "Enter a new filename: "
+msgstr "÷×ÅĦÔØ ÎÏ×Å ¦Í'Ñ ÆÁÊÌÕ: "
+
+#: LYMessages.c:437
+msgid "File name may not begin with a dot."
+msgstr "îÅ ÍÏÖÎÁ ÐÏÞÉÎÁÔÉ ¦Í'Ñ ÆÁÊÌÕ Ú ËÒÁÐËÉ."
+
+#: LYMessages.c:439
+msgid "File exists. Create higher version?"
+msgstr "æÁÊÌ ¦ÓÎÕ¤. óÔ×ÏÒÉÔÉ ÎÏ×Õ ×ÅÒÓ¦À?"
+
+# ÎÅÐÒÉÎÃÉÐÏ×Ï - ÑË ÚÁÌÉÛÉÛ. Õ ÏÒÉǦÎÁ̦ Ä×Á ÐÒϦÌÉ ;)
+# ÎÅÐÒÉÎÃÉÐÏ×Ï - ÑË ÚÁÌÉÛÉÛ. Õ ÏÒÉǦÎÁ̦ Ä×Á ÐÒϦÌÉ ;)
+#: LYMessages.c:441
+msgid "File exists. Overwrite?"
+msgstr "æÁÊÌ ¦ÓÎÕ¤. ðÅÒÅÚÁÐÉÓÁÔÉ?"
+
+#: LYMessages.c:443
+msgid "Cannot write to file."
+msgstr "îÅÍÏÖÌÉ×Ï ÚÁÐÉÓÁÔÉ Õ ÆÁÊÌ."
+
+#: LYMessages.c:444
+msgid "ERROR! - download command is misconfigured."
+msgstr "ðïíéìëá! - ËÏÍÁÎÄÕ ÚÁÔÑÇÕ×ÁÎÎÑ ÎÅ ÓËÏÎƦÇÕÒÏ×ÁÎÏ."
+
+#: LYMessages.c:445
+msgid "Unable to download file."
+msgstr "îÅÍÏÖÌÉ×Ï ÚÁÔÑÇÔÉ ÆÁÊÌ."
+
+# ôåòí¶îïìïç¶ñ (Á ÝÏ ËÁÖÅ ÐÒÏÅËÔ ÓÌÏ×ÎÉËÁ?)
+# ôåòí¶îïìïç¶ñ (Á ÝÏ ËÁÖÅ ÐÒÏÅËÔ ÓÌÏ×ÎÉËÁ?)
+#: LYMessages.c:446
+msgid "Reading directory..."
+msgstr "þÉÔÁ¤ÍÏ ËÁÔÁÌÏÇ..."
+
+#: LYMessages.c:447
+msgid "Building directory listing..."
+msgstr "âÕÄÕÀ ÓÐÉÓÏË ÆÁÊÌ¦× Õ ËÁÔÁÌÏÚ¦..."
+
+# úÂÅÒÅÖÅÎÎÑ - ÐÒÏÃÅÓ, ÚÁÐÉÓ - ÏÂ'¤ËÔ (Õ ÂÌÏËÎÏÔ¦, ÎÁÐÒÉËÌÁÄ)
+# úÂÅÒÅÖÅÎÎÑ - ÐÒÏÃÅÓ, ÚÁÐÉÓ - ÏÂ'¤ËÔ (Õ ÂÌÏËÎÏÔ¦, ÎÁÐÒÉËÌÁÄ)
+#: LYMessages.c:448
+msgid "Saving..."
+msgstr "úÂÅÒÅÖÅÎÎÑ..."
+
+#: LYMessages.c:449
+#, c-format
+msgid "Could not edit file '%s'."
+msgstr "îÅ ÍÏÖÕ ÒÅÄÁÇÕ×ÁÔÉ ÆÁÊÌ '%s'."
+
+#: LYMessages.c:450
+msgid "Unable to access document!"
+msgstr "îÅ ÍÏÖÕ Ä¦ÓÔÁÔÉÓÑ ÄÏ ÄÏËÕÍÅÎÔÁ!"
+
+#: LYMessages.c:451
+msgid "Could not access file."
+msgstr "îÅ ÍÏÖÕ Ä¦ÓÔÁÔÉÓÑ ÄÏ ÆÁÊÌÕ."
+
+#: LYMessages.c:452
+msgid "Could not access directory."
+msgstr "îÅ ÍÏÖÕ Ä¦ÓÔÁÔÉÓÑ ÄÏ ËÁÔÁÌÏÇÕ."
+
+#: LYMessages.c:453
+msgid "Could not load data."
+msgstr "îÅ ÍÏÖÕ ÚÁ×ÁÎÔÁÖÉÔÉ ÄÁΦ."
+
+#. #define CANNOT_EDIT_REMOTE_FILES
+#: LYMessages.c:455
+msgid "Lynx cannot currently (e)dit remote WWW files."
+msgstr "Lynx ÝÅ ÎÅ ÚÄÁÔÎÉÊ Ò(e)ÄÁÇÕ×ÁÔÉ ×¦ÄÄÁÌÅΦ WWW ÆÁÊÌÉ."
+
+#. #define CANNOT_EDIT_FIELD
+#: LYMessages.c:457
+msgid "This field cannot be (e)dited with an external editor."
+msgstr "ãÅ ÐÏÌÅ ÎÅÍÏÖÌÉ×Ï ×¦ÄÒ(e)ÄÁÇÕ×ÁÔÉ ÚÏ×ΦÛÎ¦Í ÒÅÄÁËÔÏÒÏÍ."
+
+#: LYMessages.c:458
+msgid "Bad rule"
+msgstr "ðÏÇÁÎÅ ÐÒÁ×ÉÌÏ"
+
+#: LYMessages.c:459
+msgid "Insufficient operands:"
+msgstr "îÅÄÏÓÔÁÔÎØÏ ÏÐÅÒÁÎĦ×:"
+
+#: LYMessages.c:460
+msgid "You are not authorized to edit this file."
+msgstr "÷ÁÍ ÎÅ ÄÏÚ×ÏÌÅÎÏ ÒÅÄÁÇÕ×ÁÔÉ ÃÅÊ ÆÁÊÌ."
+
+#: LYMessages.c:461
+msgid "Title: "
+msgstr "úÁÇÏÌÏ×ÏË: "
+
+#: LYMessages.c:462
+msgid "Subject: "
+msgstr "ôÅÍÁ: "
+
+#: LYMessages.c:463
+msgid "Username: "
+msgstr "¶Í'Ñ ËÏÒÉÓÔÕ×ÁÞÁ: "
+
+#: LYMessages.c:464
+msgid "Password: "
+msgstr "ðÁÒÏÌØ: "
+
+#: LYMessages.c:465
+msgid "lynx: Username and Password required!!!"
+msgstr "lynx: îÅÏÂȦÄΦ ¦Í'Ñ ËÏÒÉÓÔÕ×ÁÞÁ ÔÁ ÐÁÒÏÌØ!!!"
+
+#: LYMessages.c:466
+msgid "lynx: Password required!!!"
+msgstr "lynx: ôÒÅÂÁ ÐÁÒÏÌØ!!!"
+
+#: LYMessages.c:467
+msgid "Clear all authorization info for this session?"
+msgstr "úÁÂÕÔÉ ÄÁΦ Á×ÔÏÒÉÚÁæ§ ÄÌÑ Ã¦¤§ ÓÅÓ¦§?"
+
+#: LYMessages.c:468
+msgid "Authorization info cleared."
+msgstr "äÁΦ Á×ÔÏÒÉÚÁæ§ ÚÁÂÕÔÏ."
+
+#: LYMessages.c:469
+msgid "Authorization failed. Retry?"
+msgstr "îÅ ×ÄÁÌÏÓÑ Á×ÔÏÒÉÚÕ×ÁÔÉÓÑ. ðÒÏÂÕ¤ÍÏ ÝÅ?"
+
+#: LYMessages.c:470
+msgid "cgi support has been disabled."
+msgstr "ð¦ÄÔÒÉÍËÕ cgi ÂÕÌÏ ÚÁÂÏÒÏÎÅÎÏ."
+
+#. #define CGI_NOT_COMPILED
+#: LYMessages.c:472
+msgid "Lynxcgi capabilities are not compiled into this version."
+msgstr "íÏÖÌÉ×ÏÓÔ¦ Lynxcgi ÎÅ ÓËÏÍЦÌØÏ×ÁΦ Õ Ã¦Ê ×ÅÒÓ¦§."
+
+#: LYMessages.c:473
+#, c-format
+msgid "Sorry, no known way of converting %s to %s."
+msgstr "÷ÉÂÁÞÔÅ, ÎÅ ÚÎÁÀ, ÑË ÓËÏÎ×ÅÒÔÕ×ÁÔÉ %s Õ %s."
+
+#: LYMessages.c:474
+msgid "Unable to set up connection."
+msgstr "îÅ ÍÏÖÕ ×ÓÔÁÎÏ×ÉÔÉ Ú'¤ÄÎÁÎÎÑ."
+
+#: LYMessages.c:475
+msgid "Unable to make connection"
+msgstr "îÅ ÍÏÖÕ ×ÓÔÁÎÏ×ÉÔÉ Ú'¤ÄÎÁÎÎÑ"
+
+#. #define MALFORMED_EXEC_REQUEST
+#: LYMessages.c:477
+msgid "Executable link rejected due to malformed request."
+msgstr "ðÏÓÉÌÁÎÎÑ ¦Ú ×ÉËÏÎÁÎÎÑÍ ×¦ÄËÉÎÕÔÏ ÞÅÒÅÚ ÐÏÇÁÎÏ ÓÆÏÒÍÏ×ÁÎÉÊ ÚÁÐÉÔ."
+
+#. #define BADCHAR_IN_EXEC_LINK
+#: LYMessages.c:479
+#, c-format
+msgid "Executable link rejected due to `%c' character."
+msgstr "ðÏÓÉÌÁÎÎÑ ¦Ú ×ÉËÏÎÁÎÎÑÍ ×¦ÄËÉÎÕÔÏ ÞÅÒÅÚ ÓÉÍ×ÏÌ \"%c\"."
+
+#. #define RELPATH_IN_EXEC_LINK
+#: LYMessages.c:481
+msgid "Executable link rejected due to relative path string ('../')."
+msgstr "ðÏÓÉÌÁÎÎÑ ¦Ú ×ÉËÏÎÁÎÎÑÍ ×¦ÄËÉÎÕÔÏ ÞÅÒÅÚ ÒÑÄÏË ×¦ÄÎÏÓÎÏÇÏ ÛÌÑÈÕ ('../')."
+
+#. #define BADLOCPATH_IN_EXEC_LINK
+#: LYMessages.c:483
+msgid "Executable link rejected due to location or path."
+msgstr "ðÏÓÉÌÁÎÎÑ ¦Ú ×ÉËÏÎÁÎÎÑÍ ×¦ÄËÉÎÕÔÏ Ú ÐÒÉÞÉÎ, ÝÏ ÓÔÏÓÕÀÔØÓÑ Í¦ÓÃÑ ÞÉ ÛÌÑÈÕ."
+
+#: LYMessages.c:484
+msgid "Mail access is disabled!"
+msgstr "ìÉÓÔÕ×ÁÎÎÑ ÚÁÂÏÒÏÎÅÎÅ!"
+
+#. #define ACCESS_ONLY_LOCALHOST
+#: LYMessages.c:486
+msgid "Only files and servers on the local host can be accessed."
+msgstr "ìÉÛÅ ÆÁÊÌÉ ÔÁ ÓÅÒ×ÅÒÉ ÎÁ ÌÏËÁÌØÎ¦Ê ÍÁÛÉΦ ÍÏÖÕÔØ ÂÕÔÉ ÄÏÓÔÕÐÎÉÍÉ."
+
+#: LYMessages.c:487
+msgid "Telnet access is disabled!"
+msgstr "ôÅÌÎÅÔÁ ÚÁÂÏÒÏÎÅÎÏ!"
+
+#. #define TELNET_PORT_SPECS_DISABLED
+#: LYMessages.c:489
+msgid "Telnet port specifications are disabled."
+msgstr "÷ËÁÚÕ×ÁÔÉ ÐÏÒÔ ÔÅÌÎÅÔÁ ÚÁÂÏÒÏÎÅÎÏ."
+
+#: LYMessages.c:490
+msgid "USENET news access is disabled!"
+msgstr "äÏÓÔÕÐ ÄÏ ÎÏ×ÉÎ USENET ÚÁÂÏÒÏÎÅÎÉÊ!"
+
+#: LYMessages.c:491
+msgid "Rlogin access is disabled!"
+msgstr "äÏÓÔÕÐ rlogin ÚÁÂÏÒÏÎÅÎÉÊ!"
+
+#: LYMessages.c:492
+msgid "Ftp access is disabled!"
+msgstr "äÏÓÔÕÐ FTP ÚÁÂÏÒÏÎÅÎÉÊ!"
+
+#: LYMessages.c:493
+msgid "There are no references from this document."
+msgstr "îÅÍÁ¤ ÐÏÓÉÌÁÎØ Ú ÃØÏÇÏ ÄÏËÕÍÅÎÔÁ."
+
+#: LYMessages.c:494
+msgid "There are only hidden links from this document."
+msgstr "ìÉÛÅ ÓÈÏ×ÁΦ ÐÏÓÉÌÁÎÎÑ Ú ÃØÏÇÏ ÄÏËÕÍÅÎÔÁ."
+
+#: LYMessages.c:496
+msgid "Unable to open command file."
+msgstr "îÅÍÏÖÌÉ×Ï ×¦ÄËÒÉÔÉ ËÏÍÁÎÄÎÏÇÏ ÆÁÊÌÕ."
+
+#: LYMessages.c:498
+msgid "News Post Cancelled!!!"
+msgstr "îÁÄÓÉÌÁÎÎÑ ÌÉÓÔÁ îÏ×ÉÎ óËÁÓÏ×ÁÎÏ!!!"
+
+#. #define SPAWNING_EDITOR_FOR_NEWS
+#: LYMessages.c:500
+msgid "Spawning your selected editor to edit news message"
+msgstr "úÁÐÕÓËÁ¤ÍÏ ÏÂÒÁÎÏÇÏ ×ÁÍÉ ÒÅÄÁËÔÏÒÁ ÄÌÑ ÒÅÄÁÇÕ×ÁÎÎÑ ÌÉÓÔÁ"
+
+#: LYMessages.c:501
+msgid "Post this message?"
+msgstr "÷¦Ä¦ÓÌÁÔÉ ÃÅ ÐÏצÄÏÍÌÅÎÎÑ?"
+
+#: LYMessages.c:502
+#, c-format
+msgid "Append '%s'?"
+msgstr "äÏÄÁÔÉ '%s'?"
+
+#: LYMessages.c:503
+msgid "Posting to newsgroup(s)..."
+msgstr "îÁÄÓÉÌÁ¤ÍÏ ÄÏ ÇÒÕÐ(É) ÎÏ×ÉÎ..."
+
+#: LYMessages.c:505
+msgid "*** You have unread mail. ***"
+msgstr "*** õ ×ÁÓ ¤ ÎÅÐÒÏÞÉÔÁÎÁ ÐÏÛÔÁ. ***"
+
+#: LYMessages.c:507
+msgid "*** You have mail. ***"
+msgstr "*** õ ×ÁÓ ¤ ÐÏÛÔÁ. ***"
+
+#: LYMessages.c:509
+msgid "*** You have new mail. ***"
+msgstr "*** õ ×ÁÓ ¤ ÎÏ×Á ÐÏÛÔÁ. ***"
+
+#: LYMessages.c:510
+msgid "File insert cancelled!!!"
+msgstr "÷ÓÔÁ×ÌÑÎÎÑ ÆÁÊÌÕ ×¦ÄͦÎÅÎÅ!!!"
+
+#: LYMessages.c:511
+msgid "Not enough memory for file!"
+msgstr "îÅÄÏÓÔÁÔÎØÏ ÐÁÍ'ÑÔ¦ ÄÌÑ ÆÁÊÌÕ!"
+
+#: LYMessages.c:512
+msgid "Can't open file for reading."
+msgstr "îÅÍÏÖÌÉ×Ï ×¦ÄËÒÉÔÉ ÆÁÊÌ ÄÌÑ ÞÉÔÁÎÎÑ."
+
+# "æÁÊÌ" - ÚÎÁÞÉÔØ, *ÆÁÊÌ*, ÑË ¦Ú the Õ ÁÎÇÌ. ÍÏצ. áÌÅ ÊÏÇÏ Ö ÎÅÍÁ!
+# äÕÍÁÀ, ËÒÁÝÅ "ôÁËÏÇÏ ÆÁÊÌÕ ÎÅ ¦ÓÎÕ¤."
+#: LYMessages.c:513
+msgid "File does not exist."
+msgstr "ôÁËÏÇÏ ÆÁÊÌÕ ÎÅ ¦ÓÎÕ¤."
+
+#: LYMessages.c:514
+msgid "File does not exist - reenter or cancel:"
+msgstr "ôÁËÏÇÏ ÆÁÊÌÕ ÎÅ ¦ÓÎÕ¤ - ××ÅÄÕÔØ ÚÎÏ×Õ ÞÉ ÓËÁÓÕÊÔÅ:"
+
+#: LYMessages.c:515
+msgid "File is not readable."
+msgstr "æÁÊÌ ÎÅÍÏÖÌÉ×Ï ÐÒÏÞÉÔÁÔÉ."
+
+#: LYMessages.c:516
+msgid "File is not readable - reenter or cancel:"
+msgstr "æÁÊÌ ÎÅÍÏÖÌÉ×Ï ÐÒÏÞÉÔÁÔÉ - ××ÅĦÔØ ÝÅ ÒÁÚ ÞÉ ÓËÁÓÕÊÔÅ:"
+
+#: LYMessages.c:517
+msgid "Nothing to insert - file is 0-length."
+msgstr "îÅÍÁ ÞÏÇÏ ×ÓÔÁ×ÌÑÔÉ - ÆÁÊÌ ÚÁ×ÄÏ×ÖËÉ 0 ÂÁÊÔ."
+
+#: LYMessages.c:518
+msgid "Save request cancelled!!!"
+msgstr "úÁÐÉÔ ÎÁ ÚÂÅÒÅÖÅÎÎÑ ÓËÁÓÏ×ÁÎÏ!!!"
+
+#: LYMessages.c:519
+msgid "Mail request cancelled!!!"
+msgstr "úÁÐÉÔ ÎÁ צÄÐÒÁ×ËÕ ÌÉÓÔÁ ÓËÁÓÏ×ÁÎÏ!!!"
+
+#. #define CONFIRM_MAIL_SOURCE_PREPARSED
+#: LYMessages.c:521
+msgid "Viewing preparsed source. Are you sure you want to mail it?"
+msgstr "ðÏËÁÚÕÀ ÎÅÏÐÒÁÃØÏ×ÁΦ ÓÉÒæ. ÷É Ä¦ÊÓÎÏ ÈÏÞÅÔÅ ÎÁĦÓÌÁÔÉ ÓÁÍÅ §È?"
+
+# @ ark drakconf evolution gimp lynx
+# * Yuri Syrota <rasta@renome.rovno.ua>
+#: LYMessages.c:522
+msgid "Please wait..."
+msgstr "âÕÄØ ÌÁÓËÁ, ÚÁÞÅËÁÊÔÅ..."
+
+#: LYMessages.c:523
+msgid "Mailing file. Please wait..."
+msgstr "îÁÄÓÉÌÁ¤ÍÏ ÆÁÊÌ. âÕÄØÔÅ ÌÁÓËÁצ, ÚÁÞÅËÁÊÔÅ..."
+
+#: LYMessages.c:524
+msgid "ERROR - Unable to mail file"
+msgstr "ðïíéìëá - ÎÅ ×ÄÁÌÏÓÑ ÎÁĦÓÌÁÔÉ ÆÁÊÌ"
+
+#. #define CONFIRM_LONG_SCREEN_PRINT
+#: LYMessages.c:526
+#, c-format
+msgid "File is %d screens long. Are you sure you want to print?"
+msgstr "ãÅÊ ÆÁÊÌ ÚÁ×ÄÏ×ÖËÉ %d ÅËÒÁΦ×. ÷É ×ÐÅ×ÎÅΦ, ÝÏ ÂÁÖÁ¤ÔÅ ÊÏÇÏ ÄÒÕËÕ×ÁÔÉ?"
+
+#: LYMessages.c:527
+msgid "Print request cancelled!!!"
+msgstr "äÒÕËÕ×ÁÎÎÑ ÓËÁÓÏ×ÁÎÏ!!!"
+
+#: LYMessages.c:528
+msgid "Press <return> to begin: "
+msgstr "îÁÔÉÓΦÔØ <×צÄ> ÝÏ ÐÏÞÁÔÉ: "
+
+#: LYMessages.c:529
+msgid "Press <return> to finish: "
+msgstr "îÁÔÉÓΦÔØ <×צÄ> ÝÏ ÚÁ˦ÎÞÉÔÉ: "
+
+#. #define CONFIRM_LONG_PAGE_PRINT
+#: LYMessages.c:531
+#, c-format
+msgid "File is %d pages long. Are you sure you want to print?"
+msgstr "ãÅÊ ÆÁÊÌ ÚÁ×ÄÏ×ÖËÉ %d ÓÔÏÒ¦ÎÏË. ÷É ×ÐÅ×ÎÅΦ, ÝÏ ÂÁÖÁ¤ÔÅ ÊÏÇÏ ÄÒÕËÕ×ÁÔÉ?"
+
+#. #define CHECK_PRINTER
+#: LYMessages.c:533
+msgid "Be sure your printer is on-line. Press <return> to start printing:"
+msgstr "÷ÐÅ×ΦÔØÓÑ, ÝÏ ÄÒÕËÁÒËÁ ÇÏÔÏ×Á. îÁÔÉÓΦÔØ <×צÄ> ÝÏ ÐÏÞÁÔÉ ÄÒÕË:"
+
+#: LYMessages.c:534
+msgid "ERROR - Unable to allocate file space!!!"
+msgstr "ðïíéìëá - îÅÍÏÖÌÉ×Ï ×ÉĦÌÉÔÉ Í¦ÓÃÅ ÄÌÑ ÆÁÊÌÁ!!!"
+
+#: LYMessages.c:535
+msgid "Unable to open tempfile"
+msgstr "îÅ ÍÏÖÕ ×¦ÄËÒÉÔÉ ÔÉÍÞÁÓÏ×ÉÊ ÆÁÊÌ"
+
+#: LYMessages.c:536
+msgid "Unable to open print options file"
+msgstr "îÅ ÍÏÖÕ ×¦ÄËÒÉÔÉ ÆÁÊÌ ÎÁÌÁÛÔÕ×ÁÎØ ÄÒÕËÁÒËÉ"
+
+#: LYMessages.c:537
+msgid "Printing file. Please wait..."
+msgstr "äÒÕËÕ¤ÍÏ ÆÁÊÌ. âÕÄØÔÅ ÌÁÓËÁצ, ÚÁÞÅËÁÊÔÅ..."
+
+#: LYMessages.c:538
+msgid "Please enter a valid internet mail address: "
+msgstr "âÕÄØ ÌÁÓËÁ, ××ÅĦÔØ ×¦ÒÎÕ ÐÏÛÔÏ×Õ ÁÄÒÅÓÕ: "
+
+#: LYMessages.c:539
+msgid "ERROR! - printer is misconfigured!"
+msgstr "ðïíéìëá - ÄÒÕËÁÒËÕ ÎÅ ÓËÏÎƦÇÕÒÏ×ÁÎÏ!"
+
+#: LYMessages.c:540
+msgid "Image map from POST response not available!"
+msgstr ""
+
+#: LYMessages.c:541
+msgid "Misdirected client-side image MAP request!"
+msgstr ""
+
+#: LYMessages.c:542
+msgid "Client-side image MAP is not accessible!"
+msgstr ""
+
+#: LYMessages.c:543
+msgid "No client-side image MAPs are available!"
+msgstr ""
+
+#: LYMessages.c:544
+msgid "Client-side image MAP is not available!"
+msgstr ""
+
+#. #define OPTION_SCREEN_NEEDS_24
+#: LYMessages.c:547
+msgid "Screen height must be at least 24 lines for the Options menu!"
+msgstr "äÌÑ ÍÅÎÀ îÁÌÁÛÔÕ×ÁÎØ ÅËÒÁÎ ÍÕÓÉÔØ ÂÕÔÉ ÎÅ ÍÅÎÛ, Î¦Ö 24 ÒÑÄËÉ!"
+
+#. #define OPTION_SCREEN_NEEDS_23
+#: LYMessages.c:549
+msgid "Screen height must be at least 23 lines for the Options menu!"
+msgstr "äÌÑ ÍÅÎÀ îÁÌÁÛÔÕ×ÁÎØ ÅËÒÁÎ ÍÕÓÉÔØ ÂÕÔÉ ÎÅ ÍÅÎÛ, Î¦Ö 23-É ÒÑÄËÉ!"
+
+#. #define OPTION_SCREEN_NEEDS_22
+#: LYMessages.c:551
+msgid "Screen height must be at least 22 lines for the Options menu!"
+msgstr "äÌÑ ÍÅÎÀ îÁÌÁÛÔÕ×ÁÎØ ÅËÒÁÎ ÍÕÓÉÔØ ÂÕÔÉ ÎÅ ÍÅÎÛ, Î¦Ö 22-Á ÒÑÄËÁ!"
+
+#: LYMessages.c:553
+msgid "That key requires Advanced User mode."
+msgstr "ãÑ ËÏÍÁÎÄÁ ÐÒÁÃÀ¤ ÌÉÛÅ Õ ÒÅÖÉͦ ËÏÒÉÓÔÕ×ÁÎÎÑ Advanced."
+
+#: LYMessages.c:554
+#, c-format
+msgid "Content-type: %s"
+msgstr "ôÉÐ ×ͦÓÔÕ: %s"
+
+#: LYMessages.c:555
+msgid "Command: "
+msgstr "ëÏÍÁÎÄÁ: "
+
+#: LYMessages.c:556
+msgid "Unknown or ambiguous command"
+msgstr "îÅצÄÏÍÁ ÞÉ ÎÅÏÄÎÏÚÎÁÞÎÁ ËÏÍÁÎÄÁ"
+
+#: LYMessages.c:557
+msgid " Version "
+msgstr " ÷ÅÒÓ¦Ñ "
+
+# ôÑÇÎÅÍÏ http://enigma.x-telecom.net/ ×ÐÅÒÛÅ (ÍÉ ÔÁÍ ÝÅ ÎÅ ÂÕÌÉ)
+# ôÑÇÎÅÍÏ http://enigma.x-telecom.net/ ×ÐÅÒÛÅ (ÍÉ ÔÁÍ ÝÅ ÎÅ ÂÕÌÉ)
+#: LYMessages.c:558
+msgid " first"
+msgstr " ×ÐÅÒÛÅ"
+
+# # FIXME: of course, I'm not sure:
+# of course, I'm not sure:
+# msgstr ", ЦÄÓÔÁÎÏ×ËÁ..."
+#: LYMessages.c:559
+msgid ", guessing..."
+msgstr ", ÚÄÏÇÁÄÕ¤ÍÏÓÑ..."
+
+#: LYMessages.c:560
+msgid "Permissions for "
+msgstr "ðÒÁ×Á ÄÏÓÔÕÐÕ ÄÏ "
+
+#: LYMessages.c:561
+msgid "Select "
+msgstr "÷ÉÂÒÁÔÉ "
+
+#: LYMessages.c:562
+msgid "capital letter"
+msgstr "×ÅÌÉËÁ ̦ÔÅÒÁ"
+
+#: LYMessages.c:563
+msgid " of option line,"
+msgstr ""
+
+#: LYMessages.c:564
+msgid " to save,"
+msgstr " ÝÏÂ ÚÂÅÒÅÇÔÉ,"
+
+#: LYMessages.c:565
+msgid " to "
+msgstr " ÄÏ "
+
+#: LYMessages.c:566
+msgid " or "
+msgstr " ÞÉ "
+
+#: LYMessages.c:567
+msgid " index"
+msgstr " ¦ÎÄÅËÓ"
+
+# # FIXME: of course, I'm not sure:
+#: LYMessages.c:568
+msgid " to return to Lynx."
+msgstr " ÝÏ ÐÏ×ÅÒÎÕÔÉÓÑ ÄÏ Lynx."
+
+# msgstr "ðÒÉÊÎÑÔÉ"
+# ÍÍÍÍ... ÎÅ ÚÎÁÀ. (ËÏÎÔÒ)ÁÒÇÕÍÅÎÔÉ?
+#: LYMessages.c:569
+msgid "Accept Changes"
+msgstr "úÁÐÒÏ×ÁÄÉÔÉ ÚͦÎÉ"
+
+# msgstr "ðÒÉÊÎÑÔÉ úͦÎÉ"
+#: LYMessages.c:570
+msgid "Reset Changes"
+msgstr "óËÁÓÕ×ÁÔÉ"
+
+# msgstr "÷¦ÄͦÎÉÔÉ úͦÎÉ"
+#: LYMessages.c:571
+msgid "Left Arrow cancels changes"
+msgstr "ÓÔÒ¦ÌËÁ ×̦×Ï ÓËÁÓÏ×Õ¤ ÚͦÎÉ"
+
+#: LYMessages.c:572
+msgid "Save options to disk"
+msgstr "úÂÅÒÅÇÔÉ ÐÁÒÁÍÅÔÒÉ ÎÁ ÄÉÓËÕ"
+
+#: LYMessages.c:573
+msgid "Hit RETURN to accept entered data."
+msgstr "îÁÔÉÓΦÔØ RETURN ÝÏ ЦÄÔ×ÅÒÄÉÔÉ ××ÅÄÅΦ ÄÁΦ."
+
+#. #define ACCEPT_DATA_OR_DEFAULT
+#: LYMessages.c:575
+msgid "Hit RETURN to accept entered data. Delete data to invoke the default."
+msgstr "<÷צÄ> ЦÄÔ×ÅÒÄÉÔØ ××ÅÄÅΦ ÄÁΦ. ÷ÉÄÁ̦ÔØ ÕÓÅ ÄÌÑ ÐÏ×ÅÒÎÅÎÎÑ ÄÏ ÐÏÞÁÔËÕ."
+
+#: LYMessages.c:576
+msgid "Value accepted!"
+msgstr "úÎÁÞÅÎÎÑ ÓÐÒÉÊÎÑÔÏ!"
+
+#. #define VALUE_ACCEPTED_WARNING_X
+#: LYMessages.c:578
+msgid "Value accepted! -- WARNING: Lynx is configured for XWINDOWS!"
+msgstr "úÎÁÞÅÎÎÑ ÓÐÒÉÊÎÑÔÏ! -- õ÷áçá: Lynx ÓËÏÎƦÇÕÒÏ×ÁÎÏ ÄÌÑ XWINDOWS!"
+
+#. #define VALUE_ACCEPTED_WARNING_NONX
+#: LYMessages.c:580
+msgid "Value accepted! -- WARNING: Lynx is NOT configured for XWINDOWS!"
+msgstr "úÎÁÞÅÎÎÑ ÓÐÒÉÊÎÑÔÏ! -- õ÷áçá: Lynx îå ÓËÏÎƦÇÕÒÏ×ÁÎÏ ÄÌÑ XWINDOWS!"
+
+#: LYMessages.c:581
+msgid "You are not allowed to change which editor to use!"
+msgstr "÷ÁÍ ÎÅ ÍÏÖÎÁ ×ÉÂÉÒÁÔÉ ÒÅÄÁËÔÏÒÁ!"
+
+#: LYMessages.c:582
+msgid "Failed to set DISPLAY variable!"
+msgstr "îÅ ×ÄÁÌÏÓÑ ×ÓÔÁÎÏ×ÉÔÉ ÚͦÎÎÕ DISPLAY!"
+
+#: LYMessages.c:583
+msgid "Failed to clear DISPLAY variable!"
+msgstr "îÅ ×ÄÁÌÏÓÑ ÏÞÉÓÔÉÔÉ ÚͦÎÎÕ DISPLAY!"
+
+#. #define BOOKMARK_CHANGE_DISALLOWED
+#: LYMessages.c:585
+msgid "You are not allowed to change the bookmark file!"
+msgstr "÷ÁÍ ÎÅ ÄÏÚ×ÏÌÅÎÏ ÚͦÎÀ×ÁÔÉ ÆÁÊÌ ÚÁËÌÁÄÉÎÏË!"
+
+#: LYMessages.c:586
+msgid "Terminal does not support color"
+msgstr "ôÅÒͦÎÁÌ ÎŠЦÄÔÒÉÍÕ¤ ËÏÌØÏÒÉ"
+
+#: LYMessages.c:587
+#, c-format
+msgid "Your '%s' terminal does not support color."
+msgstr "÷ÁÛ ÔÅÒͦÎÁÌ '%s' ΊЦÄÔÒÉÍÕ¤ ËÏÌØÏÒÉ."
+
+#: LYMessages.c:588
+msgid "Access to dot files is disabled!"
+msgstr "äÏÓÔÕÐ ÄÏ ÓÈÏ×ÁÎÉÈ ÆÁÊÌ¦× ÚÁÂÌÏËÏ×ÁÎÏ!"
+
+#. #define UA_NO_LYNX_WARNING
+#: LYMessages.c:590
+msgid "User-Agent string does not contain \"Lynx\" or \"L_y_n_x\""
+msgstr "óÔÒ¦ÞËÁ User-Agent ΊͦÓÔÉÔØ \"Lynx\" ÞÉ \"L_y_n_x\""
+
+#. #define UA_PLEASE_USE_LYNX
+#: LYMessages.c:592
+msgid "Use \"L_y_n_x\" or \"Lynx\" in User-Agent, or it looks like intentional deception!"
+msgstr "÷ÐÉÛ¦ÔØ \"L_y_n_x\" ÞÉ \"Lynx\" ÄÏ ÒÑÄËÁ User-Agent, ¦ÎÁËÛÅ ×É ÍÁÔÉÍÅÔÅ ×ÉÇÌÑÄ ÐÒÏÊÄÉÓצÔÁ!"
+
+#. #define UA_CHANGE_DISABLED
+#: LYMessages.c:594
+msgid "Changing of the User-Agent string is disabled!"
+msgstr "í¦ÎÑÔÉ ÒÑÄÏË User-Agent ÚÁÂÏÒÏÎÅÎÏ!"
+
+#. #define CHANGE_OF_SETTING_DISALLOWED
+#: LYMessages.c:596
+msgid "You are not allowed to change this setting."
+msgstr "÷ÁÍ ÎÅ ÄÏÚ×ÏÌÅÎÏ Í¦ÎÑÔÉ Ã¦ ÕÓÔÁÎÏ×ËÉ."
+
+#: LYMessages.c:597
+msgid "Saving Options..."
+msgstr "úÂÅÒÅÖÅÎÎÑ ÐÁÒÁÍÅÔÒ¦×..."
+
+#: LYMessages.c:598
+msgid "Options saved!"
+msgstr "ðÁÒÁÍÅÔÒÉ ÚÂÅÒÅÖÅÎÏ!"
+
+#: LYMessages.c:599
+msgid "Unable to save Options!"
+msgstr "îÅ ÍÏÖÕ ÚÂÅÒÅÇÔÉ ðÁÒÁÍÅÔÒÉ!"
+
+#: LYMessages.c:600
+msgid " 'r' to return to Lynx "
+msgstr " 'r' ÐÏ×ÅÒÔÁ¤ ÄÏ Lynx "
+
+#: LYMessages.c:601
+msgid " '>' to save, or 'r' to return to Lynx "
+msgstr " '>' ÚÂÅÒ¦ÇÁ¤, 'r' ÐÏ×ÅÒÔÁ¤ ÄÏ Lynx "
+
+#. #define ANY_KEY_CHANGE_RET_ACCEPT
+#: LYMessages.c:603
+msgid "Hit any key to change value; RETURN to accept."
+msgstr "îÁÔÉÓΦÔØ ÂÕÄØ-ÝÏ, ÝÏ ÚͦÎÉÔÉ; RETURN, ÝÏ ÐÏÇÏÄÉÔÉÓÑ."
+
+#: LYMessages.c:604
+msgid "Error uncompressing temporary file!"
+msgstr "ðÏÍÉÌËÁ ÒÏÚÔÉÓËÁÎÎÑ ÔÉÍÞÁÓÏ×ÏÇÏ ÆÁÊÌÕ!"
+
+#: LYMessages.c:605
+msgid "Unsupported URL scheme!"
+msgstr "ôÁËÉÊ URL ΊЦÄÔÒÉÍÕ¤ÔØÓÑ!"
+
+#: LYMessages.c:606
+msgid "Unsupported data: URL! Use SHOWINFO, for now."
+msgstr ""
+
+#: LYMessages.c:607
+msgid "Redirection limit of 10 URL's reached."
+msgstr ""
+
+#: LYMessages.c:608
+msgid "Illegal redirection URL received from server!"
+msgstr ""
+
+#. #define SERVER_ASKED_FOR_REDIRECTION
+#: LYMessages.c:610
+#, c-format
+msgid "Server asked for %d redirection of POST content to"
+msgstr ""
+
+#: LYMessages.c:613
+msgid "P)roceed, use G)ET or C)ancel "
+msgstr "ÐP)ÏÄÏ×ÖÉÔÉ, ÞÉ ×ÉÔÑG)ÔÉ ÞÉ C)ËÁÓÕ×ÁÔÉ "
+
+#: LYMessages.c:614
+msgid "P)roceed, or C)ancel "
+msgstr "ÐP)ÏÄÏ×ÖÉÔÉ ÞÉ C)ËÁÓÕ×ÁÔÉ "
+
+#. #define ADVANCED_POST_GET_REDIRECT
+#: LYMessages.c:616
+msgid "Redirection of POST content. P)roceed, see U)RL, use G)ET or C)ancel"
+msgstr "ðÅÒÅÎÁÐÒÁ×ÌÅÎÎÑ POST. ÐP)ÏÄÏ×ÖÉÔÉ, ÄÉ×. U)RL, ×ÉÔÑG)ÔÉ ÞÉ C)ËÁÓÕ×ÁÔÉ"
+
+#. #define ADVANCED_POST_REDIRECT
+#: LYMessages.c:618
+msgid "Redirection of POST content. P)roceed, see U)RL, or C)ancel"
+msgstr "ðÅÒÅÎÁÐÒÁ×ÌÅÎÎÑ ×ͦÓÔÕ POST. ÐP)ÏÄÏ×ÖÉÔÉ, ÄÉ×ÉÔÉÓÑ U)RL ÞÉ C)ËÁÓÕ×ÁÔÉ"
+
+#. #define CONFIRM_POST_RESUBMISSION
+#: LYMessages.c:620
+msgid "Document from Form with POST content. Resubmit?"
+msgstr "äÏËÕÍÅÎÔ Ú æÏÒÍÉ ¦Ú ×ͦÓÔÏÍ POST. ÷¦Ä¦ÓÌÁÔÉ ÚÁÎÏ×Ï?"
+
+#. #define CONFIRM_POST_RESUBMISSION_TO
+#: LYMessages.c:622
+#, c-format
+msgid "Resubmit POST content to %s ?"
+msgstr "ðÅÒÅÚÁÔ×ÅÒÄÉÔÉ ×ͦÓÔ POST ÄÏ %s?"
+
+#. #define CONFIRM_POST_LIST_RELOAD
+#: LYMessages.c:624
+#, c-format
+msgid "List from document with POST data. Reload %s ?"
+msgstr ""
+
+#. #define CONFIRM_POST_DOC_HEAD
+#: LYMessages.c:626
+msgid "Document from POST action, HEAD may not be understood. Proceed?"
+msgstr ""
+
+#. #define CONFIRM_POST_LINK_HEAD
+#: LYMessages.c:628
+msgid "Form submit action is POST, HEAD may not be understood. Proceed?"
+msgstr ""
+
+#: LYMessages.c:629
+msgid "Proceed without a username and password?"
+msgstr "ðÒÏÄÏ×ÖÉÔÉ ÂÅÚ ¦ÍÅΦ ËÏÒÉÓÔÕ×ÁÞÁ ÔÁ ÐÁÒÏÌÑ?"
+
+#: LYMessages.c:630
+#, c-format
+msgid "Proceed (%s)?"
+msgstr "ðÒÏÄÏ×ÖÉÔÉ (%s)?"
+
+#: LYMessages.c:631
+msgid "Cannot POST to this host."
+msgstr "îÅÍÏÖÌÉ×Ï ×¦ÄÐÒÁ×ÉÔÉ ÄÁΦ POST ÎÁ ÃÅÊ ÓÅÒ×ÅÒ."
+
+#: LYMessages.c:632
+msgid "POST not supported for this URL - ignoring POST data!"
+msgstr ""
+
+#: LYMessages.c:633
+msgid "Discarding POST data..."
+msgstr "÷¦ÄËÉÄÁ¤ÍÏ ÄÁΦ POST..."
+
+# msgstr "äÏËÕÍÅÎÔ ÎÅ ÂÕÄÅ ÐÅÒÅÚÁ×ÁÎÔÁÖÅÎÏ!"
+# ËÁÔÅÇÏÒÉÞΦÛÅ :)
+#: LYMessages.c:634
+msgid "Document will not be reloaded!"
+msgstr "äÏËÕÍÅÎÔ ÐÅÒÅÚÁ×ÁÎÔÁÖÅÎÏ ÎÅ ÂÕÄÅ!"
+
+#: LYMessages.c:635
+msgid "Location: "
+msgstr "òÏÚͦÝÅÎÎÑ: "
+
+#: LYMessages.c:636
+#, c-format
+msgid "'%s' not found!"
+msgstr "'%s' ÎÅ ÚÎÁÊÄÅÎÏ!"
+
+#: LYMessages.c:637
+msgid "Default Bookmark File"
+msgstr "óÔÁÒÔÏ×ÉÊ ÆÁÊÌ ÚÁËÌÁÄÉÎÏË"
+
+#: LYMessages.c:638
+msgid "Screen too small! (8x35 min)"
+msgstr "úÁÍÁÌÉÊ ÅËÒÁÎ! (8x35 ͦΦÍÕÍ)"
+
+#: LYMessages.c:639
+msgid "Select destination or ^G to Cancel: "
+msgstr "÷ËÁÖ¦ÔØ, ËÕÄÉ, ÞÉ ^G ÝÏ ÓËÁÓÕ×ÁÔÉ: "
+
+#. #define MULTIBOOKMARKS_SELECT
+#: LYMessages.c:641
+msgid "Select subbookmark, '=' for menu, or ^G to cancel: "
+msgstr "÷ÉÂÅÒ¦ÔØ Ð¦ÄÆÁÊÌ ÚÁËÌÁÄÉÎÏË, '=' - ÍÅÎÀ, ÞÉ ^G - ÓËÁÓÕ×ÁÔÉ: "
+
+#. #define MULTIBOOKMARKS_SELF
+#: LYMessages.c:643
+msgid "Reproduce L)ink in this bookmark file or C)ancel? (l,c): "
+msgstr ""
+
+#: LYMessages.c:644
+msgid "Multiple bookmark support is not available."
+msgstr ""
+
+#: LYMessages.c:645
+#, c-format
+msgid " Select Bookmark (screen %d of %d)"
+msgstr " ÷ÉÂÅÒ¦ÔØ ÚÁËÌÁÄÉÎËÕ (ÅËÒÁÎ %d Ú %d)"
+
+#: LYMessages.c:646
+msgid " Select Bookmark"
+msgstr " ÷ÉÂÅÒ¦ÔØ ÚÁËÌÁÄÉÎËÕ"
+
+#. #define MULTIBOOKMARKS_EHEAD_MASK
+#: LYMessages.c:648
+#, c-format
+msgid "Editing Bookmark DESCRIPTION and FILEPATH (%d of 2)"
+msgstr "òÅÄÁÇÕ×ÁÎÎÑ ïðéóõ ÔÁ í¶óãñ æáêìá úÁËÌÁÄÉÎÏË (%d Ú 2)"
+
+#. #define MULTIBOOKMARKS_EHEAD
+#: LYMessages.c:650
+msgid " Editing Bookmark DESCRIPTION and FILEPATH"
+msgstr " òÅÄÁÇÕ×ÁÎÎÑ ïðéóõ ÔÁ ûìñèõ äï æáêìá ÚÁËÌÁÄÉÎÏË"
+
+# ?????
+# msgstr "ì¦ÔÅÒÁ: "
+#: LYMessages.c:651
+msgid "Letter: "
+msgstr "ìÉÓÔ: "
+
+#. #define USE_PATH_OFF_HOME
+#: LYMessages.c:654
+msgid "Use a filepath off your login directory in SHELL syntax!"
+msgstr ""
+
+#: LYMessages.c:656
+msgid "Use a filepath off your home directory!"
+msgstr ""
+
+#. #define MAXLINKS_REACHED
+#: LYMessages.c:659
+msgid "Maximum links per page exceeded! Use half-page or two-line scrolling."
+msgstr ""
+
+#: LYMessages.c:660
+msgid "No previously visited links available!"
+msgstr "îÅÍÁ¤ ÐÏÓÉÌÁÎØ, Ñ˦ ×É ×¦ÄצÄÕ×ÁÌÉ ÒÁΦÛÅ."
+
+# ËÒÁÝÅ "ÐÅÒÅÒ×ÁÎÏ", ÁÌÅ ÎÅ ÐÒÉÎÃÉÐÏ×Ï ËÒÁÝÅ
+# msgstr "÷ÉÞÅÒÐÁÎÏ ÐÁÍ'ÑÔØ! ðÒÏÇÒÁÍÕ Ï¦Ò×ÁÎÏ!"
+#: LYMessages.c:661
+msgid "Memory exhausted! Program aborted!"
+msgstr "îÅ ÓÔÁÌÏ ÐÁÍ'ÑÔ¦! ðÒÏÇÒÁÍÕ ÐÅÒÅÒ×ÁÎÏ!"
+
+#: LYMessages.c:662
+msgid "Memory exhausted! Aborting..."
+msgstr "îÅ ÓÔÁÌÏ ÐÁÍ'ÑÔ¦! ïÂÒÉ×Á¤ÍÏÓÑ..."
+
+#: LYMessages.c:663
+msgid "Not enough memory!"
+msgstr "îÅ ×ÉÓÔÁÞÁ¤ ÐÁÍ'ÑÔ¦!"
+
+#: LYMessages.c:664
+msgid "Directory/File Manager not available"
+msgstr ""
+
+#: LYMessages.c:665
+msgid "HREF in BASE tag is not an absolute URL."
+msgstr ""
+
+#: LYMessages.c:666
+msgid "Location URL is not absolute."
+msgstr "URL ÐÅÒÅÎÁÐÒÁ×ÌÅÎÎÑ ÎÅ ÁÂÓÏÌÀÔÎÉÊ."
+
+#: LYMessages.c:667
+msgid "Refresh URL is not absolute."
+msgstr "\"Refresh\" URL ÎÅ ÁÂÓÏÌÀÔÎÉÊ."
+
+#. #define SENDING_MESSAGE_WITH_BODY_TO
+#: LYMessages.c:669
+msgid ""
+"You are sending a message with body to:\n"
+" "
+msgstr ""
+"÷É ×¦ÄÓÉÌÁ¤ÔÅ ÐÏצÄÏÍÌÅÎÎÑ Ú Ô¦ÌÏÍ ÄÏ:\n"
+" "
+
+#: LYMessages.c:670
+msgid ""
+"You are sending a comment to:\n"
+" "
+msgstr ""
+"÷É ×¦ÄÓÉÌÁ¤ÔÅ ËÏÍÅÎÔÁÒ ÄÏ:\n"
+" "
+
+#: LYMessages.c:671
+msgid ""
+"\n"
+" With copy to:\n"
+" "
+msgstr ""
+"\n"
+" ú ËÏЦ¤À ÄÏ:\n"
+" "
+
+#: LYMessages.c:672
+msgid ""
+"\n"
+" With copies to:\n"
+" "
+msgstr ""
+"\n"
+" ú ËÏЦÑÍÉ ÄÏ:\n"
+" "
+
+#. #define CTRL_G_TO_CANCEL_SEND
+#: LYMessages.c:674
+msgid ""
+"\n"
+"\n"
+"Use Ctrl-G to cancel if you do not want to send a message\n"
+msgstr ""
+"\n"
+"\n"
+"îÁÔÉÓΦÔØ Ctrl-G, ÑËÝÏ ×É ÎÅ ÈÏÞÅÔŠצÄÓÉÌÁÔÉ ÐÏצÄÏÍÌÅÎÎÑ\n"
+
+#. #define ENTER_NAME_OR_BLANK
+#: LYMessages.c:676
+msgid ""
+"\n"
+" Please enter your name, or leave it blank to remain anonymous\n"
+msgstr ""
+"\n"
+" ÷×ÅĦÔØ ×ÁÛÅ ¦Í'Ñ, ÞÉ ÚÁÌÉÛÁÊÔÅÓØ ÁÎÏΦÍÏÍ\n"
+
+#. #define ENTER_MAIL_ADDRESS_OR_OTHER
+#: LYMessages.c:678
+msgid ""
+"\n"
+" Please enter a mail address or some other\n"
+msgstr ""
+"\n"
+" âÕÄØ ÌÁÓËÁ, ××ÅĦÔØ ÐÏÛÔÏ×Õ ÁÄÒÅÓÕ ÞÉ ÝÏÓØ ¦ÎÛÅ\n"
+
+#. #define MEANS_TO_CONTACT_FOR_RESPONSE
+#: LYMessages.c:680
+msgid " means to contact you, if you desire a response.\n"
+msgstr ""
+
+#: LYMessages.c:681
+msgid ""
+"\n"
+" Please enter a subject line.\n"
+msgstr ""
+"\n"
+" âÕÄØ ÌÁÓËÁ, ××ÅĦÔØ ÒÑÄÏË ÔÅÍÉ.\n"
+
+#. #define ENTER_ADDRESS_FOR_CC
+#: LYMessages.c:683
+msgid ""
+"\n"
+" Enter a mail address for a CC of your message.\n"
+msgstr ""
+"\n"
+" ÷×ÅĦÔØ ÐÏÛÔÏ×Õ ÁÄÒÅÓÕ ÄÌÑ ÎÁÄÓÉÌÁÎÎÑ ÔÏÞÎϧ ËÏЦ§ (CC) ÌÉÓÔÁ.\n"
+
+#: LYMessages.c:684
+msgid " (Leave blank if you don't want a copy.)\n"
+msgstr " (úÁÌÉÛÔÅ ÐÏÒÏÖΦÍ, ÑËÝÏ ÎÅ ÂÁÖÁ¤ÔÅ ÒÏÂÉÔÉ ËÏЦÀ.)\n"
+
+#: LYMessages.c:685
+msgid ""
+"\n"
+" Please review the message body:\n"
+"\n"
+msgstr ""
+"\n"
+" âÕÄØ ÌÁÓËÁ, ÐÅÒÅÇÌÑÎØÔÅ ÌÉÓÔÁ:\n"
+"\n"
+
+#: LYMessages.c:686
+msgid ""
+"\n"
+"Press RETURN to continue: "
+msgstr ""
+"\n"
+"îÁÔÉÓΦÔØ ÷÷¶ä, ÝÏ ÐÒÏÄÏ×ÖÉÔÉ: "
+
+#: LYMessages.c:687
+msgid ""
+"\n"
+"Press RETURN to clean up: "
+msgstr ""
+"\n"
+"îÁÔÉÓΦÔØ ÷÷¶ä, ÝÏ ÏÞÉÓÔÉÔÉ: "
+
+#: LYMessages.c:688
+msgid " Use Control-U to erase the default.\n"
+msgstr " ÷ÉËÏÒÉÓÔÏ×ÕÊÔÅ Control-U, ÝÏ ÓÔÅÒÔÉ ÐÏÞÁÔËÏצ ÚÎÁÞÅÎÎÑ.\n"
+
+#: LYMessages.c:689
+msgid ""
+"\n"
+" Please enter your message below."
+msgstr ""
+"\n"
+" âÕÄØ ÌÁÓËÁ, ÎÁÂÅÒ¦ÔØ ×ÁÛÅ ÐÏצÄÏÍÌÅÎÎÑ ÎÉÖÞÅ."
+
+#. #define ENTER_PERIOD_WHEN_DONE_A
+#: LYMessages.c:691 src/LYNews.c:360
+msgid ""
+"\n"
+" When you are done, press enter and put a single period (.)"
+msgstr ""
+"\n"
+" ëÏÌÉ ÚÁ˦ÎÞÉÔÅ, ÎÁÔÉÓΦÔØ ××¦Ä ÔÁ ××ÅĦÔØ ÏÄÎÕ ËÒÁÐËÕ (.)"
+
+#. #define ENTER_PERIOD_WHEN_DONE_B
+#: LYMessages.c:693 src/LYNews.c:361
+msgid ""
+"\n"
+" on a line and press enter again."
+msgstr ""
+"\n"
+" ÔÁ ÎÁÔÉÓΦÔØ ××¦Ä ÚÎÏ×Õ."
+
+#. Cookies messages
+#. #define ADVANCED_COOKIE_CONFIRMATION
+#: LYMessages.c:697
+#, c-format
+msgid "%s cookie: %.*s=%.*s Allow? (Y/N/Always/neVer)"
+msgstr "%s ËÏÒÖÉË: %.*s=%.*s äÏÚ×ÏÌÉÔÉ? (Y/N/ÚA×ÖÄÉ/neVer)"
+
+#. #define INVALID_COOKIE_DOMAIN_CONFIRMATION
+#: LYMessages.c:699
+#, c-format
+msgid "Accept invalid cookie domain=%s for '%s'?"
+msgstr "ðÒÉÊÍÁÔÉ ÐÏÌÁÍÁÎÏÇÏ ËÏÒÖÉËÁ domain=%s ÄÌÑ '%s'?"
+
+#. #define INVALID_COOKIE_PATH_CONFIRMATION
+#: LYMessages.c:701
+#, c-format
+msgid "Accept invalid cookie path=%s as a prefix of '%s'?"
+msgstr "ðÒÉÊÍÁÔÉ ÐÏÌÁÍÁÎÏÇÏ ËÏÒÖÉËÁ path=%s ÑË ÐÒÅƦËÓ %s'?"
+
+# ôåòí¶îïìïç¶ñ
+# ôåòí¶îïìïç¶ñ
+#: LYMessages.c:702
+msgid "Allowing this cookie."
+msgstr "âÅÒÅÍÏ ÃØÏÇÏ ËÏÒÖÉËÁ."
+
+# ôåòí¶îïìïç¶ñ
+# ôåòí¶îïìïç¶ñ
+#: LYMessages.c:703
+msgid "Rejecting this cookie."
+msgstr "÷¦ÄËÉÄÁ¤ÍÏ ÃØÏÇÏ ËÏÒÖÉËÁ."
+
+#: LYMessages.c:704
+msgid "The Cookie Jar is empty."
+msgstr "Jar ÄÌÑ ëÏÒÖÉË¦× ÐÏÒÏÖΦÊ."
+
+#: LYMessages.c:705
+#, fuzzy
+msgid "The Cache Jar is empty."
+msgstr "Jar ÄÌÑ ëÏÒÖÉË¦× ÐÏÒÏÖΦÊ."
+
+#. #define ACTIVATE_TO_GOBBLE
+#: LYMessages.c:707
+msgid "Activate links to gobble up cookies or entire domains,"
+msgstr ""
+
+#: LYMessages.c:708
+msgid "or to change a domain's 'allow' setting."
+msgstr ""
+
+#: LYMessages.c:709
+msgid "(Cookies never allowed.)"
+msgstr "(î¦ËÏÌÉ ÎÅ ÐÒÉÊÍÁÔÉ ËÏÒÖÉËÉ.)"
+
+#: LYMessages.c:710
+msgid "(Cookies always allowed.)"
+msgstr "(úÁ×ÖÄÉ ÂÅÒÅÍÏ ËÏÒÖÉËÉ.)"
+
+#: LYMessages.c:711
+msgid "(Cookies allowed via prompt.)"
+msgstr "(âÅÒÅÍÏ ËÏÒÖÉËÉ Ð¦ÓÌÑ ÄÏÚ×ÏÌÕ.)"
+
+#: LYMessages.c:712
+msgid "(Persistent Cookies.)"
+msgstr ""
+
+#: LYMessages.c:713
+msgid "(No title.)"
+msgstr "(âÅÚ ÚÁÇÏÌÏ×ËÁ.)"
+
+#: LYMessages.c:714
+msgid "(No name.)"
+msgstr "(âÅÚ ¦ÍÅΦ.)"
+
+#: LYMessages.c:715
+msgid "(No value.)"
+msgstr "(âÅÚ ÚÎÁÞÅÎÎÑ.)"
+
+#: LYMessages.c:716 src/LYOptions.c:2402
+msgid "None"
+msgstr "î¦ÞÏÇÏ"
+
+#: LYMessages.c:717
+msgid "(End of session.)"
+msgstr "(ë¦ÎÅÃØ ÓÅÁÎÓÕ.)"
+
+#: LYMessages.c:718
+msgid "Delete this cookie?"
+msgstr "÷ÉÄÁÌÉÔÉ ÃØÏÇÏ ËÏÒÖÉËÁ?"
+
+#: LYMessages.c:719
+msgid "The cookie has been eaten!"
+msgstr "ðÒÏËÏ×ÔÎÕÌÉ ËÏÒÖÉËÁ!"
+
+#: LYMessages.c:720
+msgid "Delete this empty domain?"
+msgstr "÷ÉÄÁÌÉÔÉ ÃÅÊ ÐÏÒÏÖÎ¦Ê ÄÏÍÅÎ?"
+
+#: LYMessages.c:721
+msgid "The domain has been eaten!"
+msgstr "äÏÍÅÎÁ Ú'§ÌÉ!"
+
+#. #define DELETE_COOKIES_SET_ALLOW_OR_CANCEL
+#: LYMessages.c:723
+msgid "D)elete domain's cookies, set allow A)lways/P)rompt/neV)er, or C)ancel? "
+msgstr "÷ÉD)ÁÌÉÔÉ ËÏÒÖ¦ ÄÏÍÅÎÁ, ×ÓÔÁÎÏ×ÉÔÉ ÄÏÚ×¦Ì ÚA)×ÖÄÉ/P)rompt/neV)er ÞÉ C)ËÁÓ.?"
+
+#. #define DELETE_DOMAIN_SET_ALLOW_OR_CANCEL
+#: LYMessages.c:725
+msgid "D)elete domain, set allow A)lways/P)rompt/neV)er, or C)ancel? "
+msgstr "÷ÉD)ÁÌÉÔÉ ÄÏÍÅÎ, ×ÓÔÁÎÏ×ÉÔÉ ÄÏÚ×¦Ì ÚA)×ÖÄÉ/P)rompt/neV)er ÞÉ C)ËÁÓÕ×.?"
+
+#: LYMessages.c:726
+msgid "All cookies in the domain have been eaten!"
+msgstr "õÓ¦ ËÏÒÖ¦ Õ ÄÏÍÅΦ ÚÖÅÒÔÏ!"
+
+#: LYMessages.c:727
+#, c-format
+msgid "'A'lways allowing from domain '%s'."
+msgstr "ú'A'×ÖÄÉ ÂÅÒÅÍÏ Ú ÄÏÍÅÎÁ '%s'."
+
+#: LYMessages.c:728
+#, c-format
+msgid "ne'V'er allowing from domain '%s'."
+msgstr "î¦ËÏÌÉ ('V') ÎÅ ÂÅÒÅÍÏ Ú ÄÏÍÅÎÁ '%s'."
+
+#: LYMessages.c:729
+#, c-format
+msgid "'P'rompting to allow from domain '%s'."
+msgstr "ðÉÔÁ¤ÍÏ ('P'), ÞÉ ÂÒÁÔÉ Ú ÄÏÍÅÎÁ '%s'."
+
+#: LYMessages.c:730
+msgid "Delete all cookies in this domain?"
+msgstr "÷ÉÄÁÌÉÔÉ ÕÓ¦ ËÏÒÖ¦ Õ ÃØÏÍÕ ÄÏÍÅΦ?"
+
+#: LYMessages.c:731
+msgid "All of the cookies in the jar have been eaten!"
+msgstr "õÓ¦ ËÏÒÖÉËÉ Ú jar Ú'§ÄÅÎÏ!"
+
+#: LYMessages.c:733
+msgid "Port 19 not permitted in URLs."
+msgstr "÷ÉËÏÒÉÓÔÏ×Õ×ÁÔÉ ÐÏÒÔ 19 Õ URL ÚÁÂÏÒÏÎÅÎÏ."
+
+#: LYMessages.c:734
+msgid "Port 25 not permitted in URLs."
+msgstr "÷ÉËÏÒÉÓÔÏ×Õ×ÁÔÉ ÐÏÒÔ 25 Õ URL ÚÁÂÏÒÏÎÅÎÏ."
+
+#: LYMessages.c:735
+#, c-format
+msgid "Port %lu not permitted in URLs."
+msgstr "÷ÉËÏÒÉÓÔÏ×Õ×ÁÔÉ ÐÏÒÔ %lu Õ URL ÚÁÂÏÒÏÎÅÎÏ."
+
+#: LYMessages.c:736
+msgid "URL has a bad port field."
+msgstr "URL ͦÓÔÉÔØ ÎÅצÒÎÉÊ ÐÏÒÔ."
+
+#: LYMessages.c:737
+msgid "Maximum nesting of HTML elements exceeded."
+msgstr ""
+
+#: LYMessages.c:738
+msgid "Bad partial reference! Stripping lead dots."
+msgstr ""
+
+#: LYMessages.c:739
+msgid "Trace Log open failed. Trace off!"
+msgstr "îÅ ×ÄÁÌÏÓÑ ×¦ÄËÒÉÔÉ ÖÕÒÎÁÌ ÔÒÁÓÕ×ÁÎÎÑ. ôÒÁÓÕ×ÁÎÎÑ ×ÉÍËÎÅÎÏ!"
+
+#: LYMessages.c:740
+msgid "Lynx Trace Log"
+msgstr "öÕÒÎÁÌ ôÒÁÓÕ×ÁÎÎÑ Lynx"
+
+#: LYMessages.c:741
+msgid "No trace log has been started for this session."
+msgstr "ôÒÁÓÕ×ÁÎÎÑ ÄÌÑ Ã¦¤§ ÓÅÓ¦§ ÎÅ ÂÕÌÏ ÐÏÞÁÔÏ."
+
+#. #define MAX_TEMPCOUNT_REACHED
+#: LYMessages.c:743
+msgid "The maximum temporary file count has been reached!"
+msgstr "äÏÓÑÇÎÕÔÏ ÍÁËÓÉÍÁÌØÎϧ ˦ÌØËÏÓÔ¦ ÔÉÍÞÁÓÏ×ÉÈ ÆÁÊ̦×!"
+
+#. #define FORM_VALUE_TOO_LONG
+#: LYMessages.c:745
+msgid "Form field value exceeds buffer length! Trim the tail."
+msgstr "úÎÁÞÅÎÎÑ ÐÏÌÑ ÆÏÒÍÉ ÐÅÒÅ×ÉÝÕ¤ ÒÏÚÍ¦Ò ÂÕÆÅÒÁ! ÷¦ÄËÉÄÁ¤ÍÏ ÚÁÊ×Å."
+
+#. #define FORM_TAIL_COMBINED_WITH_HEAD
+#: LYMessages.c:747
+msgid "Modified tail combined with head of form field value."
+msgstr ""
+
+# ôåòí¶îïìïç¶ñ
+# ôåòí¶îïìïç¶ñ
+#. HTFile.c
+#: LYMessages.c:750
+msgid "Directory"
+msgstr "ëÁÔÁÌÏÇ"
+
+#: LYMessages.c:751
+msgid "Directory browsing is not allowed."
+msgstr "ðÅÒÅÇÌÑÄ ËÁÔÁÌÏÇÕ ÚÁÂÏÒÏÎÅÎÏ."
+
+#: LYMessages.c:752
+msgid "Selective access is not enabled for this directory"
+msgstr "÷ɦÒËÏ×ÉÊ ÄÏÓÔÕÐ ÄÏ Ã¦ÌÏÇÏ ËÁÔÁÌÏÇÕ ÚÁÂÏÒÏÎÅÎÏ"
+
+#: LYMessages.c:753
+msgid "Multiformat: directory scan failed."
+msgstr ""
+
+#: LYMessages.c:754
+msgid "This directory is not readable."
+msgstr "îÅ ÍÏÖÕ ÐÒÏÞÉÔÁÔÉ ÃÅÊ ËÁÔÁÌÏÇ."
+
+#: LYMessages.c:755
+msgid "Can't access requested file."
+msgstr "îÅ ÍÏÖÕ Ä¦ÓÔÁÔÉÓÑ ÚÁÐÉÔÕ×ÁÎÏÇÏ ÆÁÊÌÕ."
+
+#: LYMessages.c:756
+msgid "Could not find suitable representation for transmission."
+msgstr ""
+
+#: LYMessages.c:757
+msgid "Could not open file for decompression!"
+msgstr "îÅ ÍÏÖÕ ×¦ÄËÒÉÔÉ ÆÁÊÌ ÄÌÑ ÒÏÚÔÉÓËÁÎÎÑ!"
+
+#: LYMessages.c:758
+msgid "Files:"
+msgstr "æÁÊÌÉ:"
+
+# ôåòí¶îïìïç¶ñ
+# ôåòí¶îïìïç¶ñ
+#: LYMessages.c:759
+msgid "Subdirectories:"
+msgstr "ð¦ÄËÁÔÁÌÏÇÉ:"
+
+# ôåòí¶îïìïç¶ñ
+# ôåòí¶îïìïç¶ñ
+#: LYMessages.c:760
+msgid " directory"
+msgstr " ËÁÔÁÌÏÇ"
+
+# 8-| ÎÅ ÚÎÁÀ...
+# msgstr "÷×ÅÒÈ ÄÏ "
+#: LYMessages.c:761
+msgid "Up to "
+msgstr "áÖ ÄÏ "
+
+# ôåòí¶îïìïç¶ñ
+# ôåòí¶îïìïç¶ñ
+#: LYMessages.c:762
+msgid "Current directory is "
+msgstr "ðÏÔÏÞÎÉÊ ËÁÔÁÌÏÇ "
+
+#. HTGopher.c
+#: LYMessages.c:765
+msgid "No response from server!"
+msgstr "óÅÒ×ÅÒ ÎŠצÄÐÏצÄÁ¤!"
+
+#: LYMessages.c:766
+msgid "CSO index"
+msgstr "CSO ¦ÎÄÅËÓ"
+
+#: LYMessages.c:767
+msgid ""
+"\n"
+"This is a searchable index of a CSO database.\n"
+msgstr ""
+
+#: LYMessages.c:768
+msgid "CSO Search Results"
+msgstr "òÅÚÕÌØÔÁÔÉ ÐÏÛÕËÕ CSO"
+
+#: LYMessages.c:769
+#, c-format
+msgid "Seek fail on %s\n"
+msgstr ""
+
+#: LYMessages.c:770
+msgid ""
+"\n"
+"Press the 's' key and enter search keywords.\n"
+msgstr ""
+"\n"
+"îÁÔÉÓΦÔØ 's' ÔÁ ××ÅĦÔØ ËÌÀÞÏצ ÓÌÏ×Á ÄÌÑ ÐÏÛÕËÕ.\n"
+
+#: LYMessages.c:771
+msgid ""
+"\n"
+"This is a searchable Gopher index.\n"
+msgstr ""
+
+#: LYMessages.c:772
+msgid "Gopher index"
+msgstr "Gopher ¦ÎÄÅËÓ"
+
+#: LYMessages.c:773
+msgid "Gopher Menu"
+msgstr "Gopher ÍÅÎÀ"
+
+#: LYMessages.c:774
+msgid " Search Results"
+msgstr " òÅÚÕÌØÔÁÔÉ ðÏÛÕËÕ"
+
+#: LYMessages.c:775
+msgid "Sending CSO/PH request."
+msgstr "îÁÄÓÉÌÁÀ ÚÁÐÉÔ CSO/PH."
+
+#: LYMessages.c:776
+msgid "Sending Gopher request."
+msgstr "îÁÄÓÉÌÁ¤ÍÏ ÚÁÐÉÔ Gopher"
+
+#: LYMessages.c:777
+msgid "CSO/PH request sent; waiting for response."
+msgstr "úÁÐÉÔ CSO/PH ÐÏÓÌÁÎÏ, ÞÅËÁÀ ÎÁ צÄÇÕË."
+
+#: LYMessages.c:778
+msgid "Gopher request sent; waiting for response."
+msgstr "úÁÐÉÔ Gopher ÎÁĦÓÌÁÎÏ: ÞÅËÁ¤ÍÏ ×¦ÄÇÕËÕ."
+
+#: LYMessages.c:779
+msgid ""
+"\n"
+"Please enter search keywords.\n"
+msgstr ""
+"\n"
+"âÕÄØ ÌÁÓËÁ, ××ÅĦÔØ ËÌÀÞÏצ ÓÌÏ×Á ÄÌÑ ÐÏÛÕËÕ.\n"
+
+#: LYMessages.c:780
+msgid ""
+"\n"
+"The keywords that you enter will allow you to search on a"
+msgstr ""
+
+#: LYMessages.c:781
+msgid " person's name in the database.\n"
+msgstr ""
+
+#. HTNews.c
+#: LYMessages.c:784
+msgid "Connection closed ???"
+msgstr "ú'¤ÄÎÁÎÎÑ ÚÁËÒÉÔÏ ???"
+
+#: LYMessages.c:785
+msgid "Cannot open temporary file for news POST."
+msgstr "îÅ ÍÏÖÕ ×¦ÄËÒÉÔÉ ÔÉÍÞÁÓÏ×ÉÊ ÆÁÊÌ ÄÌÑ ×¦ÄÐÒÁ×ËÉ ÌÉÓÔÁ ÄÏ ËÏÎÆÅÒÅÎæ§."
+
+#: LYMessages.c:786
+msgid "This client does not contain support for posting to news with SSL."
+msgstr "ãÅÊ Ë̦¤ÎÔ ÎÅ ÍÁ¤ ЦÄÔÒÉÍËÉ ÄÌÑ ÎÁÄÓÉÌÁÎÎÑ ÎÏ×ÉÎ ÞÅÒÅÚ SSL."
+
+#. HTStyle.c
+#: LYMessages.c:789
+#, c-format
+msgid "Style %d `%s' SGML:%s. Font %s %.1f point.\n"
+msgstr "óÔÉÌØ %d \"%s\" SGML:%s. ûÒÉÆÔ %s %.1f ÔÏÞÏË.\n"
+
+#: LYMessages.c:791
+#, c-format
+msgid "\tAlign=%d, %d tabs. (%.0f before, %.0f after)\n"
+msgstr ""
+
+#: LYMessages.c:792
+#, c-format
+msgid "\t\tTab kind=%d at %.0f\n"
+msgstr ""
+
+#. HTTP.c
+#: LYMessages.c:795
+msgid "Can't proceed without a username and password."
+msgstr "îÅÍÏÖÌÉ×Ï ÐÒÏÄÏ×ÖÉÔÉ ÂÅÚ ¦ÍÅΦ ËÏÒÉÓÔÕ×ÁÞÁ ÔÁ ÐÁÒÏÌÑ."
+
+#: LYMessages.c:796
+msgid "Can't retry with authorization! Contact the server's WebMaster."
+msgstr "îÅÍÏÖÌÉ×Ï ÐÏ×ÔÏÒÉÔÉ Á×ÔÏÒÉÚÁæÀ! ú×ÅÒΦÔØÓÑ ÄÏ ×ÅÂÍÁÊÓÔÒÁ ÓÅÒ×ÅÒÁ."
+
+#: LYMessages.c:797
+msgid "Can't retry with proxy authorization! Contact the server's WebMaster."
+msgstr "îÅÍÏÖÌÉ×Ï ÐÏ×ÔÏÒÉÔÉ ÐÒÏËÓ¦-Á×ÔÏÒÉÚÁæÀ! ú×ÅÒΦÔØÓÑ ÄÏ ×ÅÂÍÁÊÓÔÒÁ."
+
+#: LYMessages.c:798
+msgid "Retrying with proxy authorization information."
+msgstr ""
+
+#: LYMessages.c:799
+#, c-format
+msgid "SSL error:%s-Continue?"
+msgstr ""
+
+#. HTWAIS.c
+#: LYMessages.c:802
+msgid "HTWAIS: Return message too large."
+msgstr ""
+
+#: LYMessages.c:803
+msgid "Enter WAIS query: "
+msgstr "÷×ÅĦÔØ ÚÁÐÉÔ WAIS: "
+
+#. Miscellaneous status
+#: LYMessages.c:806
+msgid "Retrying as HTTP0 request."
+msgstr "ðÏ×ÔÏÒÀ¤ÍÏ ÑË HTTP0 ÚÁÐÉÔ."
+
+# ÐÅÒÅËÁÞÁÎÏ - ÂÏ ÎÅ ÚÎÁÀ, ËÕÄÉ, Õ ÑËÉÊ Â¦Ë.
+# ÐÅÒÅËÁÞÁÎÏ - ÂÏ ÎÅ ÚÎÁÀ, ËÕÄÉ, Õ ÑËÉÊ Â¦Ë.
+#: LYMessages.c:807
+#, c-format
+msgid "Transferred %d bytes"
+msgstr "ðÅÒÅËÁÞÁÎÏ %d ÂÁÊÔ¦×"
+
+# ÐÅÒÅËÁÞÕ×ÁÎÎÑ - ÂÏ ÎÅ ÚÎÁÀ, ËÕÄÉ, Õ ÑËÉÊ Â¦Ë.
+# (×ÖÅ ËÒÁÝÅ "ÐÅÒÅÄÁ×ÁÎÎÑ", ÂÏ ÐÅÒÅÄÁÞÁ - ÎÅ ÚÏ×Ó¦Í ÐÒÏÃÅÓ, ÎÁÞÅ)
+#: LYMessages.c:808
+msgid "Data transfer complete"
+msgstr "ðÅÒÅËÁÞÕ×ÁÎÎÑ ÄÁÎÉÈ ÚÁ×ÅÒÛÅÎÏ."
+
+#: LYMessages.c:809
+#, c-format
+msgid "Error processing line %d of %s\n"
+msgstr "ðÏÍÉÌËÁ ÏÐÒÁÃØÏ×Õ×ÁÎÎÑ ÒÑÄËÁ %d Ú %s\n"
+
+#. Lynx internal page titles
+#: LYMessages.c:812
+msgid "Address List Page"
+msgstr "óÔÏÒ¦ÎËÁ ÓÐÉÓËÕ ÁÄÒÅÓ"
+
+#: LYMessages.c:813
+msgid "Bookmark file"
+msgstr "æÁÊÌ ÚÁËÌÁÄÉÎÏË"
+
+#: LYMessages.c:814
+msgid "Configuration Definitions"
+msgstr "ëÏÎƦÇÕÒÁæÊΦ ×ÉÚÎÁÞÅÎÎÑ"
+
+#: LYMessages.c:815
+msgid "Cookie Jar"
+msgstr "Jar ÄÌÑ ëÏÒÖÉ˦×"
+
+#: LYMessages.c:816
+msgid "Current Key Map"
+msgstr ""
+
+#: LYMessages.c:817
+msgid "File Management Options"
+msgstr "ïÐÅÒÁæ§ Ú ÆÁÊÌÁÍÉ"
+
+#: LYMessages.c:818
+msgid "Download Options"
+msgstr "ðÁÒÁÍÅÔÒÉ óËÁÞÕ×ÁÎÎÑ"
+
+#: LYMessages.c:819
+msgid "History Page"
+msgstr "óÔÏÒ¦ÎËÁ ¶ÓÔÏÒ¦§"
+
+#: LYMessages.c:820
+#, fuzzy
+msgid "Cache Jar"
+msgstr "Jar ÄÌÑ ëÏÒÖÉ˦×"
+
+#: LYMessages.c:821
+msgid "List Page"
+msgstr "óÔÏÒ¦ÎËÁ ÓÐÉÓËÕ"
+
+# msgstr "IÎÆÏÒÍÁÃ¦Ñ lynx.cfg"
+# msgstr "IÎÆÏÒÍÁÃ¦Ñ lynx.cfg"
+#: LYMessages.c:822
+msgid "Lynx.cfg Information"
+msgstr "¶ÎÆÏÒÍÁÃ¦Ñ ÝÏÄÏ Lynx.cfg"
+
+#: LYMessages.c:823
+msgid "Converted Mosaic Hotlist"
+msgstr "úËÏÎ×ÅÒÔÏ×ÁÎÉÊ Mosaic Hotlist"
+
+#: LYMessages.c:824
+msgid "Options Menu"
+msgstr "íÅÎÀ ÐÁÒÁÍÅÔÒ¦×"
+
+#: LYMessages.c:825
+msgid "File Permission Options"
+msgstr "ðÁÒÁÍÅÔÒÉ ÐÒÁ× ÄÏÓÔÕÐÕ ÄÏ ÆÁÊ̦×"
+
+#: LYMessages.c:826
+msgid "Printing Options"
+msgstr "ðÁÒÁÍÅÔÒÉ ÄÒÕËÕ"
+
+#: LYMessages.c:827
+msgid "Information about the current document"
+msgstr "¶ÎÆÏÒÍÁÃ¦Ñ ÐÒÏ ÐÏÔÏÞÎÉÊ ÄÏËÕÍÅÎÔ"
+
+#: LYMessages.c:828
+msgid "Your recent statusline messages"
+msgstr "ïÓÔÁÎΦ ÐÏצÄÏÍÌÅÎÎÑ ÓÔÁÔÕÓÎÏÇÏ ÒÑÄËÕ"
+
+# * Yuri Syrota <rasta@renome.rovno.ua>
+#: LYMessages.c:829
+msgid "Upload Options"
+msgstr "ðÁÒÁÍÅÔÒÉ ×É×ÁÎÔÁÖÅÎÎÑ"
+
+#: LYMessages.c:830
+msgid "Visited Links Page"
+msgstr "óÔÏÒ¦ÎËÁ צÄצÄÁÎÉÈ ÐÏÓÉÌÁÎØ"
+
+#. CONFIG_DEF_TITLE subtitles
+#: LYMessages.c:833
+msgid "See also"
+msgstr "äÉ×. ÔÁËÏÖ"
+
+#: LYMessages.c:834
+msgid "your"
+msgstr "÷ÁÛ"
+
+#: LYMessages.c:835
+msgid "for runtime options"
+msgstr ""
+
+#: LYMessages.c:836
+msgid "compile time options"
+msgstr "ÐÁÒÁÍÅÔÒÉ ÞÁÓÕ ËÏÍЦÌÑæ§"
+
+#: LYMessages.c:837
+#, fuzzy
+msgid "color-style configuration"
+msgstr "÷ÁÛÁ ÏÓÎÏ×ÎÁ ËÏÎƦÇÕÒÁæÑ"
+
+#: LYMessages.c:838
+msgid "latest release"
+msgstr "ÏÓÔÁÎÎ¦Ê ÒÅ̦Ú"
+
+#: LYMessages.c:839
+msgid "pre-release version"
+msgstr "ÐÏÐÅÒÅÄÎÑ ×ÅÒÓ¦Ñ"
+
+#: LYMessages.c:840
+msgid "development version"
+msgstr "ÒÏÚÒÏÂÎÉÃØËÁ ×ÅÒÓ¦Ñ"
+
+#. #define AUTOCONF_CONFIG_CACHE
+#: LYMessages.c:842
+msgid ""
+"The following data were derived during the automatic configuration/build\n"
+"process of this copy of Lynx. When reporting a bug, please include a copy\n"
+"of this page."
+msgstr ""
+
+#. #define AUTOCONF_LYNXCFG_H
+#: LYMessages.c:846
+msgid ""
+"The following data were used as automatically-configured compile-time\n"
+"definitions when this copy of Lynx was built."
+msgstr ""
+
+#. #define DIRED_NOVICELINE
+#: LYMessages.c:851
+msgid " C)reate D)ownload E)dit F)ull menu M)odify R)emove T)ag U)pload \n"
+msgstr ""
+
+#: LYMessages.c:852
+msgid "Failed to obtain status of current link!"
+msgstr ""
+
+#. #define INVALID_PERMIT_URL
+#: LYMessages.c:855
+msgid "Special URL only valid from current File Permission menu!"
+msgstr ""
+
+#: LYMessages.c:859
+msgid "External support is currently disabled."
+msgstr ""
+
+#. new with 2.8.4dev.21
+#: LYMessages.c:863
+msgid "Changing working-directory is currently disabled."
+msgstr "úÁÐÕÓË Ð¦ÄÐÒÏÃÅÓ¦× ÎÁÒÁÚ¦ ÚÁÂÏÒÏÎÅÎÏ."
+
+# "ÚÁ×ÅÒÔÁÎÎÑ" - ÃÅ *ÎÁÚÁÄ*, Á ÐÅÒÅÎÏÓ ÐÏÇÁÎÏ
+# (ÂÏ ËÒÁÝÅ ÐÅÒÅÎÅÓÅÎÎÑ, ÁÌÅ ÐÅÒÅÎÅÓÅÎÎÑ ÔÅÖ ÐÏÇÁÎÏ)
+#: LYMessages.c:864
+msgid "Linewrap OFF!"
+msgstr "ðÅÒÅÎÏÓ ÒÑÄË¦× ÷éíëîåîï!"
+
+#: LYMessages.c:865
+msgid "Linewrap ON!"
+msgstr "ðÅÒÅÎÏÓ ÒÑÄË¦× õ÷¶íëîåîï!"
+
+#: LYMessages.c:866
+msgid "Parsing nested-tables toggled OFF! Reloading..."
+msgstr "òÅÖÉÍ Raw 8-bit ÞÉ CJK ÷éíëîåîï! ðÅÒÅÚÁ×ÁÎÔÁÖÕ¤ÍÏ..."
+
+#: LYMessages.c:867
+msgid "Parsing nested-tables toggled ON! Reloading..."
+msgstr "òÅÖÉÍ Raw 8-bit ÞÉ CJK õ÷¶íëîåîï! ðÅÒÅÚÁ×ÁÎÔÁÖÕ¤ÍÏ..."
+
+#: LYMessages.c:868
+msgid "Shifting is disabled while line-wrap is in effect"
+msgstr ""
+
+#: LYMessages.c:869
+msgid "Trace not supported"
+msgstr "ôÅÒͦÎÁÌ ÎŠЦÄÔÒÉÍÕ¤ ËÏÌØÏÒÉ"
+
+#: LYMessages.c:790
+#, c-format
+msgid "\tIndents: first=%.0f others=%.0f, Height=%.1f Desc=%.1f\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAABrow.c:626
+#, c-format
+msgid "Username for '%s' at %s '%s%s':"
+msgstr "¶Í'Ñ ËÏÒÉÓÔÕ×ÁÞÁ ÄÌÑ '%s' ÎÁ %s '%s%s':"
+
+#: WWW/Library/Implementation/HTAABrow.c:894
+msgid "This client doesn't know how to compose proxy authorization information for scheme"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAABrow.c:971
+msgid "This client doesn't know how to compose authorization information for scheme"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAABrow.c:1079
+#, c-format
+msgid "Invalid header '%s%s%s%s%s'"
+msgstr "îÅצÒÎÉÊ ÚÁÇÏÌÏ×ÏË '%s%s%s%s%s'"
+
+#: WWW/Library/Implementation/HTAABrow.c:1181
+msgid "Proxy authorization required -- retrying"
+msgstr "ðÏÔÒ¦ÂÎÁ Á×ÔÏÒÉÚÁÃ¦Ñ ÎÁ ÐÒÏËÓ¦ -- ÐÒÏÂÕ¤ÍÏ ÝÅ"
+
+#: WWW/Library/Implementation/HTAABrow.c:1239
+msgid "Access without authorization denied -- retrying"
+msgstr "äÏÓÔÕÐ ÂÅÚ Á×ÔÏÒÉÚÁæ§ ÚÁÂÏÒÏÎÅÎÉÊ -- ÐÒÏÂÕ¤ÍÏ ÝÅ"
+
+#: WWW/Library/Implementation/HTAccess.c:688
+msgid "Access forbidden by rule"
+msgstr "äÏÓÔÕÐ ÚÁÂÏÒÏÎÅÎÉÊ ÐÒÁ×ÉÌÏÍ"
+
+#: WWW/Library/Implementation/HTAccess.c:783
+msgid "Document with POST content not found in cache. Resubmit?"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAccess.c:938
+msgid "Loading failed, use a previous copy."
+msgstr ""
+
+#: WWW/Library/Implementation/HTAccess.c:1047 src/GridText.c:8546
+msgid "Loading incomplete."
+msgstr "úÁ×ÁÎÔÁÖÅÎÎÑ ÎÅ ÚÁ×ÅÒÛÅÎÏ."
+
+#: WWW/Library/Implementation/HTAccess.c:1078
+#, c-format
+msgid "**** HTAccess: socket or file number returned by obsolete load routine!\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAccess.c:1080
+#, c-format
+msgid "**** HTAccess: Internal software error. Please mail lynx-dev@nongnu.org!\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAccess.c:1081
+#, c-format
+msgid "**** HTAccess: Status returned was: %d\n"
+msgstr ""
+
+#.
+#. * hack: if we fail in HTAccess.c
+#. * avoid duplicating URL, oh.
+#.
+#: WWW/Library/Implementation/HTAccess.c:1087 src/LYMainLoop.c:7779
+msgid "Can't Access"
+msgstr "îÅ ÍÏÖÕ Ä¦ÓÔÁÔÉÓÑ"
+
+#: WWW/Library/Implementation/HTAccess.c:1095
+msgid "Unable to access document."
+msgstr "îÅ ÍÏÖÕ Ä¦ÓÔÁÔÉÓÑ ÄÏ ÄÏËÕÍÅÎÔÁ."
+
+#: WWW/Library/Implementation/HTFTP.c:843
+#, c-format
+msgid "Enter password for user %s@%s:"
+msgstr "÷×ÅĦÔØ ÐÁÒÏÌØ ËÏÒÉÓÔÕ×ÁÞÁ %s@%s:"
+
+#: WWW/Library/Implementation/HTFTP.c:871
+msgid "Unable to connect to FTP host."
+msgstr "îÅ ÍÏÖÕ Ð¦Ä'¤ÄÎÁÔÉÓÑ ÄÏ FTP ÓÅÒ×ÅÒÕ."
+
+#: WWW/Library/Implementation/HTFTP.c:1152
+msgid "close master socket"
+msgstr ""
+
+#: WWW/Library/Implementation/HTFTP.c:1214
+msgid "socket for master socket"
+msgstr ""
+
+# 8-| ÎÅ ÚÎÁÀ...
+# 8-| ÎÅ ÚÎÁÀ...
+#.
+#. * It's a symbolic link, does the user care about knowing if it is
+#. * symbolic? I think so since it might be a directory.
+#.
+#: WWW/Library/Implementation/HTFTP.c:1733 WWW/Library/Implementation/HTFTP.c:2350
+msgid "Symbolic Link"
+msgstr "óÉÍ×ÏÌØÎÅ ÐÏÓÉÌÁÎÎÑ"
+
+#: WWW/Library/Implementation/HTFTP.c:2707
+msgid "Receiving FTP directory."
+msgstr "ïÔÒÉÍÕ¤ÍÏ ËÁÔÁÌÏÇ FTP."
+
+# ÐÅÒÅËÁÞÁÎÏ! - ÂÏ ÎÅ ÚÎÁÀ, Õ ÑËÉÊ Â¦Ë
+# ÐÅÒÅËÁÞÁÎÏ! - ÂÏ ÎÅ ÚÎÁÀ, Õ ÑËÉÊ Â¦Ë
+#: WWW/Library/Implementation/HTFTP.c:2843
+#, c-format
+msgid "Transferred %d bytes (%5d)"
+msgstr "ðÅÒÅËÁÞÁÎÏ %d ÂÁÊÔ¦× (%5d)"
+
+#: WWW/Library/Implementation/HTFTP.c:3194
+msgid "connect for data"
+msgstr ""
+
+#: WWW/Library/Implementation/HTFTP.c:3855
+msgid "Receiving FTP file."
+msgstr "ïÔÒÉÍÕ¤ÍÏ ÆÁÊÌ FTP."
+
+#: WWW/Library/Implementation/HTFinger.c:273
+msgid "Could not set up finger connection."
+msgstr "îÅÍÏÖÌÉ×Ï ×ÓÔÁÎÏ×ÉÔÉ Ú'¤ÄÎÁÎÎÑ finger."
+
+#: WWW/Library/Implementation/HTFinger.c:320
+msgid "Could not load data (no sitename in finger URL)"
+msgstr "îÅÍÏÖÌÉ×Ï ÚÁ×ÁÎÔÁÖÉÔÉ ÄÁΦ (ÎÅÍÁ ¦ÍÅΦ ÓÅÒ×ÅÒÁ Õ finger URL)"
+
+#: WWW/Library/Implementation/HTFinger.c:326
+msgid "Invalid port number - will only use port 79!"
+msgstr "îÅצÒÎÉÊ ÎÏÍÅÒ ÐÏÒÔÕ - ×ÉËÏÒÉÓÔÏ×Õ¤ÍÏ ÌÉÛÅ ÐÏÒÔ 79!"
+
+#: WWW/Library/Implementation/HTFinger.c:392
+msgid "Could not access finger host."
+msgstr "îÅÍÏÖÌÉ×Ï Ä¦ÓÔÁÔÉÓÑ ÓÅÒ×ÅÒÁ finger."
+
+#: WWW/Library/Implementation/HTFinger.c:400
+msgid "No response from finger server."
+msgstr "Finger-ÓÅÒ×ÅÒ ÎŠצÄÐÏצÄÁ¤"
+
+#: WWW/Library/Implementation/HTNews.c:426
+#, c-format
+msgid "Username for news host '%s':"
+msgstr "¶Í'Ñ ËÏÒÉÓÔÕ×ÁÞÁ ÎÁ ÓÅÒ×ÅÒ¦ ÎÏ×ÉÎ '%s':"
+
+#: WWW/Library/Implementation/HTNews.c:479
+msgid "Change username?"
+msgstr "úͦÎÉÔÉ ¦Í'Ñ ËÏÒÉÓÔÕ×ÁÞÁ?"
+
+#: WWW/Library/Implementation/HTNews.c:483
+msgid "Username:"
+msgstr "¶Í'Ñ ËÏÒÉÓÔÕ×ÁÞÁ:"
+
+#: WWW/Library/Implementation/HTNews.c:508
+#, c-format
+msgid "Password for news host '%s':"
+msgstr "ðÁÒÏÌØ ËÏÒÉÓÔÕ×ÁÞÁ ÎÁ ÓÅÒ×ÅÒ¦ ÎÏ×ÉÎ '%s':"
+
+#: WWW/Library/Implementation/HTNews.c:591
+msgid "Change password?"
+msgstr "úͦÎÉÔÉ ÐÁÒÏÌØ?"
+
+#: WWW/Library/Implementation/HTNews.c:1711
+#, c-format
+msgid "No matches for: %s"
+msgstr "î¦ÞÏÇÏ ÓÈÏÖÏÇÏ ÎÁ %s"
+
+#: WWW/Library/Implementation/HTNews.c:1761
+msgid ""
+"\n"
+"No articles in this group.\n"
+msgstr ""
+"\n"
+"îÅÍÁ¤ ÓÔÁÔÅÊ Õ Ã¦Ê ÇÒÕЦ.\n"
+
+#: WWW/Library/Implementation/HTNews.c:1773
+msgid ""
+"\n"
+"No articles in this range.\n"
+msgstr ""
+"\n"
+"îÅÍÁ¤ ÓÔÁÔÅÊ Õ ÃØÏÍÕ Ä¦ÁÐÁÚÏΦ.\n"
+
+#.
+#. * Set window title.
+#.
+#: WWW/Library/Implementation/HTNews.c:1786
+#, c-format
+msgid "%s, Articles %d-%d"
+msgstr "%s, óÔÁÔÔ¦ %d-%d"
+
+#: WWW/Library/Implementation/HTNews.c:1809
+msgid "Earlier articles"
+msgstr "â¦ÌØÛ ÒÁÎΦ ÓÔÁÔÔ¦"
+
+#: WWW/Library/Implementation/HTNews.c:1822
+#, c-format
+msgid ""
+"\n"
+"There are about %d articles currently available in %s, IDs as follows:\n"
+"\n"
+msgstr ""
+"\n"
+"´ ÄÏÓÔÕÐÎÉÍÉ Â¦ÌÑ %d ÓÔÁÔÅÊ Õ %s, Ú ÔÁËÉÍÉ ID:\n"
+"\n"
+
+#: WWW/Library/Implementation/HTNews.c:1884
+msgid "All available articles in "
+msgstr "õÓ¦ ÄÏÓÔÕÐΦ ÓÔÁÔÔ¦ Õ "
+
+#: WWW/Library/Implementation/HTNews.c:2098
+msgid "Later articles"
+msgstr "â¦ÌØÛ Ð¦ÚΦ ÓÔÁÔÔ¦"
+
+#: WWW/Library/Implementation/HTNews.c:2121
+msgid "Post to "
+msgstr "îÁĦÓÌÁÔÉ ÓÔÁÔÔÀ ÄÏ "
+
+#: WWW/Library/Implementation/HTNews.c:2342
+msgid "This client does not contain support for SNEWS URLs."
+msgstr "ãÅÊ Ë̦¤ÎÔ ÎÅ ÍÁ¤ ЦÄÔÒÉÍËÉ SNEWS URL'¦×."
+
+#: WWW/Library/Implementation/HTNews.c:2550
+msgid "No target for raw text!"
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:2581
+msgid "Connecting to NewsHost ..."
+msgstr "ð¦Ä'¤ÄÎÕ¤ÍÏÓÑ ÄÏ óÅÒ×ÅÒÁ îÏ×ÉÎ ..."
+
+#: WWW/Library/Implementation/HTNews.c:2633
+#, c-format
+msgid "Could not access %s."
+msgstr "îÅÍÏÖÌÉ×Ï Ð¦Ä'¤ÄÎÁÔÉÓÑ ÄÏ %s."
+
+#: WWW/Library/Implementation/HTNews.c:2739
+#, c-format
+msgid "Can't read news info. News host %.20s responded: %.200s"
+msgstr "îÅÍÏÖÌÉ×Ï ÏÔÒÉÍÁÔÉ ¦ÎÆÏÒÍÁæÀ. óÅÒ×ÅÒ ÎÏ×ÉÎ %.20s ËÁÖÅ: %.200s"
+
+#: WWW/Library/Implementation/HTNews.c:2743
+#, c-format
+msgid "Can't read news info, empty response from host %s"
+msgstr "îÅÍÏÖÌÉ×Ï ÏÔÒÉÍÁÔÉ ¦ÎÆÏÒÍÁæÀ, ÐÏÒÏÖÎ¦Ê ×¦ÄÇÕË ×¦Ä ÓÅÒ×ÅÒÁ %s"
+
+#.
+#. * List available newsgroups. - FM
+#.
+#: WWW/Library/Implementation/HTNews.c:2947
+msgid "Reading list of available newsgroups."
+msgstr "þÉÔÁ¤ÍÏ ÓÐÉÓÏË ÄÏÓÔÕÐÎÉÈ ÇÒÕÐ ÎÏ×ÉÎ."
+
+#: WWW/Library/Implementation/HTNews.c:2968
+msgid "Reading list of articles in newsgroup."
+msgstr "þÉÔÁ¤ÍÏ ÓÐÉÓÏË ÓÔÁÔÅÊ Õ ËÏÎÆÅÒÅÎæ§."
+
+#.
+#. * Get an article from a news group. - FM
+#.
+#: WWW/Library/Implementation/HTNews.c:2974
+msgid "Reading news article."
+msgstr "ïÔÒÉÍÕ¤ÍÏ ÓÔÁÔÔÀ."
+
+#: WWW/Library/Implementation/HTNews.c:3004
+msgid "Sorry, could not load requested news."
+msgstr "÷ÉÂÁÞÔÅ, ÎÅ ×ÄÁÌÏÓÑ ×ÉÔÑÇÔÉ ÂÁÖÁΦ ÎÏ×ÉÎÉ."
+
+#: WWW/Library/Implementation/HTTCP.c:1282
+msgid "Address has invalid port"
+msgstr "áÄÒÅÓÁ ÍÁ¤ ÎÅצÒÎÏÇÏ ÐÏÒÔÕ"
+
+#: WWW/Library/Implementation/HTTCP.c:1358
+msgid "Address length looks invalid"
+msgstr "äÏ×ÖÉÎÁ ÁÄÒÅÓÉ, ÓÈÏÖÅ, ÎÅצÒÎÁ"
+
+#: WWW/Library/Implementation/HTTCP.c:1618 WWW/Library/Implementation/HTTCP.c:1636
+#, c-format
+msgid "Unable to locate remote host %s."
+msgstr "îÅ ÍÏÖÕ ÚÎÁÊÔÉ ×¦ÄÄÁÌÅÎÉÊ ÓÅÒ×ÅÒ %s."
+
+#. Not HTProgress, so warning won't be overwritten immediately;
+#. * but not HTAlert, because typically there will be other
+#. * alerts from the callers. - kw
+#.
+#: WWW/Library/Implementation/HTTCP.c:1633 WWW/Library/Implementation/HTTelnet.c:115
+#, c-format
+msgid "Invalid hostname %s"
+msgstr "îÅÐÒÁ×ÉÌØÎÅ ¦Í'Ñ ÍÁÛÉÎÉ %s"
+
+#: WWW/Library/Implementation/HTTCP.c:1647
+#, c-format
+msgid "Making %s connection to %s"
+msgstr "÷ÓÔÁÎÏ×ÌÀ¤ÍÏ %s Ú'¤ÄÎÁÎÎÑ ÄÏ %s"
+
+#: WWW/Library/Implementation/HTTCP.c:1658
+msgid "socket failed."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:1671
+#, c-format
+msgid "socket failed: family %d addr %s port %s."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:1695
+msgid "Could not make connection non-blocking."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:1763
+msgid "Connection failed (too many retries)."
+msgstr "ú'¤ÄÎÁÔÉÓÑ ÎÅ ×ÄÁÌÏÓÑ (ÚÁÂÁÇÁÔÏ ÓÐÒÏÂ)."
+
+#: WWW/Library/Implementation/HTTCP.c:1950
+msgid "Could not restore socket to blocking."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:2016
+#, fuzzy
+msgid "Socket read failed (too many tries)."
+msgstr "ú'¤ÄÎÁÔÉÓÑ ÎÅ ×ÄÁÌÏÓÑ (ÚÁÂÁÇÁÔÏ ÓÐÒÏÂ)."
+
+#: WWW/Library/Implementation/HTTP.c:84
+#, c-format
+msgid "SSL callback:%s, preverify_ok=%d, ssl_okay=%d"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:406
+#, c-format
+msgid "Address contains a username: %s"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:460
+#, c-format
+msgid "Certificate issued by: %s"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:620
+msgid "This client does not contain support for HTTPS URLs."
+msgstr "ãÅÊ Ë̦¤ÎÔ ÎÅ ÍÁ¤ ЦÄÔÒÉÍËÉ ÄÌÑ HTTPS URL'¦×."
+
+#: WWW/Library/Implementation/HTTP.c:645
+msgid "Unable to connect to remote host."
+msgstr "îÅÍÏÖÌÉ×Ï Ð¦Ä'¤ÄÎÁÔÉÓÑ ÄÏ ×¦ÄÄÁÌÅÎÏÇÏ ÓÅÒ×ÅÒÁ."
+
+#: WWW/Library/Implementation/HTTP.c:669
+msgid "Retrying connection without TLS."
+msgstr "÷ÓÔÁÎÏ×ÌÀ¤ÍÏ %s Ú'¤ÄÎÁÎÎÑ ÄÏ %s"
+
+#: WWW/Library/Implementation/HTTP.c:714
+msgid "no issuer was found"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:716
+msgid "issuer is not a CA"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:718
+msgid "the certificate has no known issuer"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:720
+#, fuzzy
+msgid "the certificate has been revoked"
+msgstr "ðÒÏËÏ×ÔÎÕÌÉ ËÏÒÖÉËÁ!"
+
+#: WWW/Library/Implementation/HTTP.c:722
+msgid "the certificate is not trusted"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:807
+#, c-format
+msgid "Verified connection to %s (cert=%s)"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:855 WWW/Library/Implementation/HTTP.c:901
+#, c-format
+msgid "Verified connection to %s (subj=%s)"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:931
+msgid "Can't find common name in certificate"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:934
+#, c-format
+msgid "SSL error:host(%s)!=cert(%s)-Continue?"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:947
+#, c-format
+msgid "UNVERIFIED connection to %s (cert=%s)"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:956
+#, c-format
+msgid "Secure %d-bit %s (%s) HTTP connection"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:1426
+msgid "Sending HTTP request."
+msgstr "îÁÄÓÉÌÁ¤ÍÏ ÚÁÐÉÔ HTTP."
+
+#: WWW/Library/Implementation/HTTP.c:1465
+msgid "Unexpected network write error; connection aborted."
+msgstr "îÅÓÐÏĦ×ÁÎÁ ÐÏÍÉÌËÁ ÚÁÐÉÓÕ ÄÏ ÍÅÒÅÖ¦; Ú'¤ÄÎÁÎÎÑ Ï¦Ò×ÁÎÅ."
+
+#: WWW/Library/Implementation/HTTP.c:1471
+msgid "HTTP request sent; waiting for response."
+msgstr "HTTP ÚÁÐÉÔÁ ÎÁĦÓÌÁÎÏ; ÞÅËÁ¤ÍÏ ÎÁ צÄÐÏצÄØ."
+
+#: WWW/Library/Implementation/HTTP.c:1539
+msgid "Unexpected network read error; connection aborted."
+msgstr "îÅÓÐÏĦ×ÁÎÁ ÐÏÍÉÌËÁ ÞÉÔÁÎÎÑ ¦Ú ÍÅÒÅÖ¦; Ú'¤ÄÎÁÎÎÑ Ï¦Ò×ÁÎÅ."
+
+#.
+#. * HTTP/1.1 Informational statuses.
+#. * 100 Continue.
+#. * 101 Switching Protocols.
+#. * > 101 is unknown.
+#. * We should never get these, and they have only the status
+#. * line and possibly other headers, so we'll deal with them by
+#. * showing the full header to the user as text/plain. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:1733
+msgid "Got unexpected Informational Status."
+msgstr ""
+
+#.
+#. * Reset Content. The server has fulfilled the request but
+#. * nothing is returned and we should reset any form
+#. * content. We'll instruct the user to do that, and
+#. * restore the current document. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:1767
+msgid "Request fulfilled. Reset Content."
+msgstr ""
+
+#. Not Modified
+#.
+#. * We didn't send an "If-Modified-Since" header, so this
+#. * status is inappropriate. We'll deal with it by showing
+#. * the full header to the user as text/plain. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:1884
+msgid "Got unexpected 304 Not Modified status."
+msgstr "ïÔÒÉÍÁÎÏ ÎÅÓÐÏĦ×ÁÎÏÇÏ ÓÔÁÔÕÓÁ 304 Not Modified."
+
+#: WWW/Library/Implementation/HTTP.c:1947
+msgid "Redirection of POST content requires user approval."
+msgstr "ðÅÒÅÎÁÐÒÁ×ÌÅÎÎÑ ×ͦÓÔÕ POST ×ÉÍÁÇÁ¤ ÄÏÚ×ÏÌÕ ËÏÒÉÓÔÕ×ÁÞÁ."
+
+#: WWW/Library/Implementation/HTTP.c:1962
+msgid "Have POST content. Treating Permanent Redirection as Temporary.\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:2004
+msgid "Retrying with access authorization information."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:2016
+msgid "Show the 401 message body?"
+msgstr "ðÏËÁÚÁÔÉ ÐÏצÄÏÍÌÅÎÎÑ ËÏÄÕ 401?"
+
+#: WWW/Library/Implementation/HTTP.c:2059
+msgid "Show the 407 message body?"
+msgstr "ðÏËÁÚÁÔÉ ÐÏצÄÏÍÌÅÎÎÑ ËÏÄÕ 407?"
+
+#.
+#. * Bad or unknown server_status number. Take a chance and hope
+#. * there is something to display. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2159
+msgid "Unknown status reply from server!"
+msgstr "îÅצÄÏÍÉÊ ×¦ÄÇÕË ÓÔÁÔÕÓÕ ×¦Ä ÓÅÒ×ÅÒÁ!"
+
+#: WWW/Library/Implementation/HTTelnet.c:113
+#, c-format
+msgid "remote %s session:"
+msgstr "צÄÁÌÅÎÁ %s ÓÅÓ¦Ñ:"
+
+#: WWW/Library/Implementation/HTWAIS.c:162
+msgid "Could not connect to WAIS server."
+msgstr "îÅÍÏÖÌÉ×Ï Ð¦Ä'¤ÄÎÁÔÉÓÑ ÄÏ ÓÅÒ×ÅÒÁ WAIS."
+
+#: WWW/Library/Implementation/HTWAIS.c:170
+msgid "Could not open WAIS connection for reading."
+msgstr "îÅÍÏÖÌÉ×Ï ×¦ÄËÒÉÔÉ Ú'¤ÄÎÁÎÎÑ ÄÏ WAIS ÄÌÑ ÞÉÔÁÎÎÑ."
+
+#: WWW/Library/Implementation/HTWAIS.c:192
+msgid "Diagnostic code is "
+msgstr "ëÏÄ Ä¦ÁÇÎÏÓÔÉËÉ ¤ "
+
+#: WWW/Library/Implementation/HTWAIS.c:464
+msgid "Index "
+msgstr "¶ÎÄÅËÓ "
+
+#: WWW/Library/Implementation/HTWAIS.c:468
+#, c-format
+msgid " contains the following %d item%s relevant to \""
+msgstr " ͦÓÔÉÔØ ÎÁÓÔÕÐΦ %d ÐÕÎËÔ%s ÓÔÏÓÏ×ÎÏ \""
+
+#: WWW/Library/Implementation/HTWAIS.c:476
+msgid "The first figure after each entry is its relative score, "
+msgstr "ðÅÒÛÁ ƦÇÕÒÁ ЦÓÌÑ ËÏÖÎÏÇÏ ÐÕÎËÔÕ - ÊÏÇÏ ×¦ÄÎÏÓÎÉÊ ÂÁÌ, "
+
+#: WWW/Library/Implementation/HTWAIS.c:477
+msgid "the second is the number of lines in the item."
+msgstr "ÄÒÕÇÁ - ˦ÌØ˦ÓÔØ ÒÑÄË¦× Õ ÎØÏÍÕ."
+
+#: WWW/Library/Implementation/HTWAIS.c:519
+msgid " (bad file name)"
+msgstr " (ÐÏÇÁÎÅ ¦Í'Ñ ÆÁÊÌÕ)"
+
+#: WWW/Library/Implementation/HTWAIS.c:545
+msgid "(bad doc id)"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:561
+msgid "(Short Header record, can't display)"
+msgstr "(ëÏÒÏÔËÅ ÐÏÌÅ ÚÁÇÏÌÏ×ËÁ, ÎÅÍÏÖÌÉ×Ï ×¦ÄÏÂÒÁÚÉÔÉ)"
+
+#: WWW/Library/Implementation/HTWAIS.c:568
+msgid ""
+"\n"
+"Long Header record, can't display\n"
+msgstr ""
+"\n"
+"úÁÄÏ×ÇÅ ÐÏÌÅ ÚÁÇÏÌÏ×ËÁ, ÎÅÍÏÖÌÉ×Ï ×¦ÄÏÂÒÁÚÉÔÉ\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:575
+msgid ""
+"\n"
+"Text record\n"
+msgstr ""
+"\n"
+"ôÅËÓÔÏ×Å ÐÏÌÅ\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:584
+msgid ""
+"\n"
+"Headline record, can't display\n"
+msgstr ""
+"\n"
+"ðÏÌÅ \"Headline\", ÎÅÍÏÖÌÉ×Ï ×¦ÄÏÂÒÁÚÉÔÉ\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:592
+msgid ""
+"\n"
+"Code record, can't display\n"
+msgstr ""
+"\n"
+"ðÏÌÅ \"Code\", ÎÅÍÏÖÌÉ×Ï ×¦ÄÏÂÒÁÚÉÔÉ\n"
+"\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:696
+msgid "Syntax error in WAIS URL"
+msgstr "óÉÎÔÁËÓÉÞÎÁ ÐÏÍÉÌËÁ Õ WAIS URL"
+
+#: WWW/Library/Implementation/HTWAIS.c:768
+msgid " (WAIS Index)"
+msgstr " (¶ÎÄÅËÓ WAIS)"
+
+#: WWW/Library/Implementation/HTWAIS.c:775
+msgid "WAIS Index: "
+msgstr "¶ÎÄÅËÓ WAIS: "
+
+#: WWW/Library/Implementation/HTWAIS.c:781
+msgid "This is a link for searching the "
+msgstr "ãÅ ÐÏÓÉÌÁÎÎÑ ÄÌÑ ÐÏÛÕËÕ Õ "
+
+#: WWW/Library/Implementation/HTWAIS.c:785
+msgid " WAIS Index.\n"
+msgstr " ¶ÎÄÅËÓ¦ WAIS.\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:814
+msgid ""
+"\n"
+"Enter the 's'earch command and then specify search words.\n"
+msgstr ""
+"\n"
+"÷×ÅĦÔØ 's' ÄÌÑ ÐÏÛÕËÕ ÔÁ ×ËÁÖ¦ÔØ ËÌÀÞÏצ ÓÌÏ×Á.\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:836
+msgid " (in "
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:845
+msgid "WAIS Search of \""
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:849
+msgid "\" in: "
+msgstr "\" Õ: "
+
+#: WWW/Library/Implementation/HTWAIS.c:864
+msgid "HTWAIS: Request too large."
+msgstr "HTWAIS: úÁÐÉÔ ÚÁ×ÅÌÉËÉÊ."
+
+#: WWW/Library/Implementation/HTWAIS.c:873
+msgid "Searching WAIS database..."
+msgstr "ûÕËÁ¤ÍÏ Õ ÂÁÚ¦ ÄÁÎÉÈ WAIS..."
+
+#: WWW/Library/Implementation/HTWAIS.c:883
+msgid "Search interrupted."
+msgstr "ðÏÛÕË ÐÅÒÅÒ×ÁÎÏ."
+
+#: WWW/Library/Implementation/HTWAIS.c:934
+msgid "Can't convert format of WAIS document"
+msgstr "îÅ ÍÏÖÕ ÓËÏÎ×ÅÒÔÕ×ÁÔÉ ÆÏÒÍÁÔ ÄÏËÕÍÅÎÔÁ WAIS"
+
+#: WWW/Library/Implementation/HTWAIS.c:978
+msgid "HTWAIS: Request too long."
+msgstr "HTWAIS: úÁÐÉÔ ÚÁÄÏ×ÇÉÊ."
+
+#.
+#. * Actually do the transaction given by request_message.
+#.
+#: WWW/Library/Implementation/HTWAIS.c:992
+msgid "Fetching WAIS document..."
+msgstr "ôÑÇÎÅÍÏ ÄÏËÕÍÅÎÔ WAIS..."
+
+#. display_search_response(target, retrieval_response,
+#. wais_database, keywords);
+#: WWW/Library/Implementation/HTWAIS.c:1031
+msgid "No text was returned!\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWSRC.c:296
+msgid " NOT GIVEN in source file; "
+msgstr ""
+
+#: WWW/Library/Implementation/HTWSRC.c:319
+msgid " WAIS source file"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWSRC.c:326
+msgid " description"
+msgstr " ÏÐÉÓ"
+
+#: WWW/Library/Implementation/HTWSRC.c:336
+msgid "Access links"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWSRC.c:357
+msgid "Direct access"
+msgstr "ðÒÑÍÉÊ ÄÏÓÔÕÐ"
+
+#. * Proxy will be used if defined, so let user know that - FM *
+#: WWW/Library/Implementation/HTWSRC.c:360
+msgid " (or via proxy server, if defined)"
+msgstr " (ÞÉ ÞÅÒÅÚ ÐÒÏËÓ¦, ÑËÝÏ ÊÏÇÏ ×ÉÚÎÁÞÅÎÏ)"
+
+# * Andriy Rysin <arysin@yahoo.com>
+#: WWW/Library/Implementation/HTWSRC.c:375
+msgid "Maintainer"
+msgstr "óÕÐÒÏצÄ"
+
+#: WWW/Library/Implementation/HTWSRC.c:383
+msgid "Host"
+msgstr "èÏÓÔ"
+
+#: src/GridText.c:705
+msgid "Memory exhausted, display interrupted!"
+msgstr ""
+
+#: src/GridText.c:710
+msgid "Memory exhausted, will interrupt transfer!"
+msgstr ""
+
+#: src/GridText.c:3654
+msgid " *** MEMORY EXHAUSTED ***"
+msgstr " *** ðáí'ñôø ÷éþåòðáîï ***"
+
+#: src/GridText.c:6089 src/GridText.c:6096 src/LYList.c:239
+msgid "unknown field or link"
+msgstr "ÎÅצÄÏÍÅ ÐÏÌÅ ÞÉ ÐÏÓÉÌÁÎÎÑ"
+
+#: src/GridText.c:6105
+msgid "text entry field"
+msgstr "ÔÅËÓÔÏ×Å ÐÏÌÅ"
+
+#: src/GridText.c:6108
+msgid "password entry field"
+msgstr "ÐÏÌÅ ××ÏÄÕ ÐÁÒÏÌÑ"
+
+#: src/GridText.c:6111
+msgid "checkbox"
+msgstr "ÐÅÒÅÍÉËÁÞ"
+
+#: src/GridText.c:6114
+msgid "radio button"
+msgstr "ÒÁĦÏËÎÏÐËÁ"
+
+#: src/GridText.c:6117
+msgid "submit button"
+msgstr "ËÎÏÐËÁ ÚÁÔ×ÅÒÄÖÅÎÎÑ"
+
+#: src/GridText.c:6120
+msgid "reset button"
+msgstr "ËÌÁצÛÁ צÄͦÎÉ ÚͦÎ"
+
+#: src/GridText.c:6123
+msgid "popup menu"
+msgstr "×ÓÐÌÉ×ÁÀÞÅ ÍÅÎÀ"
+
+#: src/GridText.c:6126
+msgid "hidden form field"
+msgstr "ÐÒÉÈÏ×ÁÎÅ ÐÏÌÅ ÆÏÒÍÉ"
+
+#: src/GridText.c:6129
+msgid "text entry area"
+msgstr "ÔÅËÓÔÏ×Á ÏÂÌÁÓÔØ"
+
+#: src/GridText.c:6132
+msgid "range entry field"
+msgstr ""
+
+#: src/GridText.c:6135
+msgid "file entry field"
+msgstr "ÐÏÌÅ ××ÏÄÕ ÆÁÊÌÕ"
+
+#: src/GridText.c:6138
+msgid "text-submit field"
+msgstr ""
+
+#: src/GridText.c:6141
+msgid "image-submit button"
+msgstr "ÚÏÂÒÁÖÅÎÎÑ-ËÎÏÐËÁ ÄÌÑ ×¦ÄÓÉÌËÉ"
+
+#: src/GridText.c:6144
+msgid "keygen field"
+msgstr ""
+
+#: src/GridText.c:6147
+msgid "unknown form field"
+msgstr "ÎÅצÄÏÍÅ ÐÏÌÅ ÆÏÒÍÉ"
+
+#: src/GridText.c:10279
+msgid "Can't open file for uploading"
+msgstr "îÅÍÏÖÌÉ×Ï ×¦ÄËÒÉÔÉ ÆÁÊÌ ÄÌÑ ÞÉÔÁÎÎÑ."
+
+#: src/GridText.c:11438
+#, c-format
+msgid "Submitting %s"
+msgstr "úÁÔ×ÅÒÄÖÕ¤ÍÏ %s"
+
+#. ugliness has happened; inform user and do the best we can
+#: src/GridText.c:12491
+msgid "Hang Detect: TextAnchor struct corrupted - suggest aborting!"
+msgstr ""
+
+#. don't show previous state
+#: src/GridText.c:12628
+msgid "Wrap lines to fit displayed area?"
+msgstr ""
+
+#: src/GridText.c:12680
+msgid "Very long lines have been wrapped!"
+msgstr "äÕÖÅ ÄÏ×Ǧ ÒÑÄËÉ ÂÕÌÉ ÚÁ×ÅÒÎÕÔ¦!"
+
+#: src/GridText.c:13185
+msgid "Very long lines have been truncated!"
+msgstr ""
+
+# @ Gnome-find KDat karchiver karchiver.po kwuftpd lynx red-carpet
+# * Yuri Syrota <rasta@renome.rovno.ua>
+#: src/HTAlert.c:164 src/LYShowInfo.c:360 src/LYShowInfo.c:364
+msgid "bytes"
+msgstr "ÂÁÊÔÉ"
+
+#.
+#. * If we know the total size of the file, we can compute
+#. * a percentage, and show a corresponding progress bar.
+#.
+#: src/HTAlert.c:300 src/HTAlert.c:324
+#, c-format
+msgid "Read %s of data"
+msgstr "ðÒÏÞÉÔÁÎÏ %s ÄÁÎÉÈ"
+
+#: src/HTAlert.c:321
+#, c-format
+msgid "Read %s of %s of data"
+msgstr "ðÒÏÞÉÔÁÎÏ %s Ú %s ÄÁÎÉÈ"
+
+#: src/HTAlert.c:330
+#, c-format
+msgid ", %s/sec"
+msgstr ", %s/ÓÅË"
+
+#: src/HTAlert.c:342
+#, fuzzy, c-format
+msgid " (stalled for %s)"
+msgstr " (ÐÒÉÚÕÐÉÎÅÎÏ ÎÁ %ld ÓÅË)"
+
+#: src/HTAlert.c:346
+#, fuzzy, c-format
+msgid ", ETA %s"
+msgstr ", ETA %ld ÓÅË"
+
+#: src/HTAlert.c:368
+msgid " (Press 'z' to abort)"
+msgstr " (îÁÔÉÓΦÔØ 'z' ÝÏ ÚÕÐÉÎÉÔÉ)"
+
+# @ CenterICQ Dia Gabber gnome-libs gphoto guppi kdelibs kview libgnomeui lynx mc mutt-1.4-4.src.rpm.dir_1_1_mutt-_po_uk.po
+# * Cawko Xakep <xakep@snark.ukma.kiev.ua>
+#. Meta-note: don't move the following note from its place right
+#. in front of the first gettext(). As it is now, it should
+#. automatically appear in generated lynx.pot files. - kw
+#.
+#. NOTE TO TRANSLATORS: If you provide a translation for "yes", lynx
+#. * will take the first byte of the translation as a positive response
+#. * to Yes/No questions. If you provide a translation for "no", lynx
+#. * will take the first byte of the translation as a negative response
+#. * to Yes/No questions. For both, lynx will also try to show the
+#. * first byte in the prompt as a character, instead of (y) or (n),
+#. * respectively. This will not work right for multibyte charsets!
+#. * Don't translate "yes" and "no" for CJK character sets (or translate
+#. * them to "yes" and "no"). For a translation using UTF-8, don't
+#. * translate if the translation would begin with anything but a 7-bit
+#. * (US_ASCII) character. That also means do not translate if the
+#. * translation would begin with anything but a 7-bit character, if
+#. * you use a single-byte character encoding (a charset like ISO-8859-n)
+#. * but anticipate that the message catalog may be used re-encoded in
+#. * UTF-8 form.
+#. * For translations using other character sets, you may also wish to
+#. * leave "yes" and "no" untranslated, if using (y) and (n) is the
+#. * preferred behavior.
+#. * Lynx will also accept y Y n N as responses unless there is a conflict
+#. * with the first letter of the "yes" or "no" translation.
+#.
+#: src/HTAlert.c:406 src/HTAlert.c:454
+msgid "yes"
+msgstr "ÔÁË"
+
+#: src/HTAlert.c:409 src/HTAlert.c:455
+msgid "no"
+msgstr "Φ"
+
+#.
+#. * Special-purpose workaround for gettext support (we should do
+#. * this in a more general way) -TD
+#. *
+#. * NOTE TO TRANSLATORS: If the prompt has been rendered into
+#. * another language, and if yes/no are distinct, assume the
+#. * translator can make an ordered list in parentheses with one
+#. * capital letter for each as we assumed in HTConfirmDefault().
+#. * The list has to be in the same order as in the original message,
+#. * and the four capital letters chosen to not match those in the
+#. * original unless they have the same position.
+#. *
+#. * Example:
+#. * (Y/N/Always/neVer) - English (original)
+#. * (O/N/Toujours/Jamais) - French
+#.
+#: src/HTAlert.c:911
+msgid "Y/N/A/V"
+msgstr ""
+
+#: src/HTML.c:5911
+msgid "Description:"
+msgstr "ïÐÉÓ:"
+
+# @ GIMP evolution gimp-perl guppi kcminfo kfind kfindpart kpm kppp lynx nautilus rpmdrake xmms
+# * Andriy Rysin <arysin@yahoo.com>
+#: src/HTML.c:5916
+msgid "(none)"
+msgstr "(ΦÞÏÇÏ)"
+
+#: src/HTML.c:5920
+msgid "Filepath:"
+msgstr ""
+
+#: src/HTML.c:5926
+msgid "(unknown)"
+msgstr "(ÎÅצÄÏÍÉÊ)"
+
+#: src/HTML.c:7353
+msgid "Document has only hidden links. Use the 'l'ist command."
+msgstr "äÏËÕÍÅÎÔ Í¦ÓÔÉÔØ ÌÉÛÅ ÐÒÉÈÏ×ÁΦ ÐÏÓÉÌÁÎÎÑ. ÷ÉËÏÒÉÓÔÁÊÔÅ ËÏÍÁÎÄÕ 'l'ist."
+
+#: src/HTML.c:7852
+msgid "Source cache error - disk full?"
+msgstr "ðÏÍÉÌËÁ ËÅÛÕ×ÁÎÎÑ ÄÖÅÒÅÌÁ - ÚÁÐÏ×ÎÅÎÉÊ ÄÉÓË?"
+
+#: src/HTML.c:7865
+msgid "Source cache error - not enough memory!"
+msgstr "ðÏÍÉÌËÁ ËÅÛÕ×ÁÎÎÑ ÄÖÅÒÅÌÁ - ÎÅÄÏÓÔÁÔÎØÏ ÐÁÍ'ÑÔ¦!"
+
+#: src/LYBookmark.c:164
+msgid ""
+" This file is an HTML representation of the X Mosaic hotlist file.\n"
+" Outdated or invalid links may be removed by using the\n"
+" remove bookmark command, it is usually the 'R' key but may have\n"
+" been remapped by you or your system administrator."
+msgstr ""
+
+#: src/LYBookmark.c:371
+#, c-format
+msgid ""
+" You can delete links by the 'R' key<br>\n"
+"<ol>\n"
+msgstr ""
+" úÁËÌÁÄÉÎËÕ ÍÏÖÎÁ ×ÉÄÁÌÉÔÉ ÎÁÔÉÓÎÕ×ÛÉ ËÌÁצÛÕ 'R'<br>\n"
+"<ol>\n"
+
+#: src/LYBookmark.c:374
+msgid ""
+" You can delete links using the remove bookmark command. It is usually\n"
+" the 'R' key but may have been remapped by you or your system\n"
+" administrator."
+msgstr ""
+" ÷É ÍÏÖÅÔÅ ×ÉÄÁÌÑÔÉ ÚÁËÌÁÄÉÎËÉ ÚÁ ÄÏÐÏÍÏÇÏÀ ËÏÍÁÎÄÉ ×ÉÄÁÌÅÎÎÑ. úÁÚ×ÉÞÁÊ\n"
+" ÃÅ ËÌÁצÛÁ 'R', ÈÏÞÁ ÃÅ ÍÏÖÅ ÂÕÔÉ ÚͦÎÅÎÏ ×ÁÛÉÍ ÓÉÓÔÅÍÎÉÍ\n"
+" ÁÄͦΦÓÔÒÁÔÏÒÏÍ."
+
+#: src/LYBookmark.c:378
+msgid ""
+" This file also may be edited with a standard text editor to delete\n"
+" outdated or invalid links, or to change their order."
+msgstr ""
+" ãÅÊ ÆÁÊÌ ÍÏÖÎÁ ÔÁËÏÖ ÒÅÄÁÇÕ×ÁÔÉ Ú×ÉÞÁÊÎÉÍ ÔÅËÓÔÏ×ÉÍ ÒÅÄÁËÔÏÒÏÍ, ÝÏÂ\n"
+" ×ÉÄÁÌÑÔÉ ÓÔÁÒ¦ ÞÉ ÎÅצÒΦ ÐÏÓÉÌÁÎÎÑ, ÞÉ Í¦ÎÑÔÉ §È ÐÏÒÑÄÏË."
+
+#: src/LYBookmark.c:381
+msgid ""
+"Note: if you edit this file manually\n"
+" you should not change the format within the lines\n"
+" or add other HTML markup.\n"
+" Make sure any bookmark link is saved as a single line."
+msgstr ""
+"õ×ÁÇÁ: ÑËÝÏ ×É ÒÅÄÁÇÕ¤ÔÅ ÃÅÊ ÆÁÊÌ \"×ÒÕÞÎÕ\",\n"
+" ÎÅ ÚͦÎÀÊÔÅ ÆÏÒÍÁÔ ÒÑÄ˦×\n"
+" ÔÁ ÎÅ ÄÏÄÁ×ÁÊÔÅ ¦ÎÛ¦ ÔÅÇÉ HTML.\n"
+" ÷ÐÅ×ÎÀÊÔÅÓÑ, ÝÏ ËÏÖÎÁ ÚÁËÌÁÄÉÎËÁ ÐÏÓ¦ÄÁ¤ ÏËÒÅÍÉÊ ÒÑÄÏË."
+
+#: src/LYBookmark.c:677
+#, c-format
+msgid "File may be recoverable from %s during this session"
+msgstr ""
+
+#: src/LYCgi.c:161
+#, c-format
+msgid "Do you want to execute \"%s\"?"
+msgstr ""
+
+#.
+#. * Neither the path as given nor any components examined by backing up
+#. * were stat()able. - kw
+#.
+#: src/LYCgi.c:276
+msgid "Unable to access cgi script"
+msgstr "îÅÍÏÖÌÉ×Ï Ä¦ÓÔÁÔÉÓÑ ÄÏ ÓËÒÉÐÔÁ cgi"
+
+#: src/LYCgi.c:701 src/LYCgi.c:704
+msgid "Good Advice"
+msgstr "çÁÒÎÁ ðÏÒÁÄÁ"
+
+#: src/LYCgi.c:708
+msgid "An excellent http server for VMS is available via"
+msgstr "þÕÄÏ×ÉÊ http ÓÅÒ×ÅÒ ÓÔÏÓÏ×ÎÏ VMS ÄÏÓÔÕÐÎÉÊ ÞÅÒÅÚ"
+
+#: src/LYCgi.c:715
+msgid "this link"
+msgstr "ÃÅ ÐÏÓÉÌÁÎÎÑ"
+
+#: src/LYCgi.c:719
+msgid "It provides state of the art CGI script support.\n"
+msgstr ""
+
+# msgstr "÷ÉÈ¦Ä ÞÅÒÅÚ ÐÅÒÅÒÉ×ÁÎÎÑ:"
+# msgstr "÷ÉÈ¦Ä ÞÅÒÅÚ ÐÅÒÅÒÉ×ÁÎÎÑ:"
+#: src/LYClean.c:122
+msgid "Exiting via interrupt:"
+msgstr "úÁ×ÅÒÛÕ¤ÍÏ ÚÁ ÓÉÇÎÁÌÏÍ:"
+
+#: src/LYCookie.c:2461
+msgid "(from a previous session)"
+msgstr "(Ú ÐÏÐÅÒÅÄÎØϧ ÓÅÓ¦§)"
+
+#: src/LYCookie.c:2522
+msgid "Maximum Gobble Date:"
+msgstr ""
+
+#: src/LYCookie.c:2562
+msgid "Internal"
+msgstr "÷ÎÕÔÒ¦ÛΦÊ"
+
+#: src/LYCookie.c:2563
+msgid "cookie_domain_flag_set error, aborting program"
+msgstr "ÐÏÍÉÌËÁ Õ cookie_domain_flag_set, ÕÒÉ×Á¤ÍÏ ÐÒÏÇÒÁÍÕ"
+
+#: src/LYCurses.c:1088
+msgid "Terminal initialisation failed - unknown terminal type?"
+msgstr "îÅ ×ÄÁÌÏÓÑ ¦Î¦Ã¦Á̦ÚÕ×ÁÔÉ ÔÅÒͦÎÁÌ - ÎÅצÄÏÍÉÊ ÔÉÐ ÔÅÒͦÎÁÌÕ?"
+
+#: src/LYCurses.c:1546
+msgid "Terminal ="
+msgstr "ôÅÒͦÎÁÌ ="
+
+#: src/LYCurses.c:1550
+msgid "You must use a vt100, 200, etc. terminal with this program."
+msgstr "÷É ÍÁ¤ÔÅ ×ÉËÏÒÉÓÔÏ×Õ×ÁÔÉ Ú Ã¦¤À ÐÒÏÇÒÁÍÏÀ ÔÅÒͦÎÁÌÉ vt100, 200 ÔÏÝÏ."
+
+#: src/LYCurses.c:1599
+msgid "Your Terminal type is unknown!"
+msgstr "ôÉÐ ×ÁÛÏÇÏ ÔÅÒͦÎÁÌÕ ÎÅצÄÏÍÉÊ!"
+
+#: src/LYCurses.c:1600
+msgid "Enter a terminal type:"
+msgstr "÷×ÅĦÔØ ÔÉÐ ÔÅÒͦÎÁÌÕ:"
+
+#: src/LYCurses.c:1614
+msgid "TERMINAL TYPE IS SET TO"
+msgstr "ôéð ôåòí¶îáìõ ÷óôáîï÷ìåîï õ"
+
+#: src/LYCurses.c:2127
+#, c-format
+msgid ""
+"\n"
+"A Fatal error has occurred in %s Ver. %s\n"
+msgstr ""
+"\n"
+"æÁÔÁÌØÎÁ ÐÏÍÉÌËÁ × %s, ×ÅÒÓ¦Ñ %s\n"
+
+#: src/LYCurses.c:2130
+#, c-format
+msgid ""
+"\n"
+"Please notify your system administrator to confirm a bug, and if\n"
+"confirmed, to notify the lynx-dev list. Bug reports should have concise\n"
+"descriptions of the command and/or URL which causes the problem, the\n"
+"operating system name with version number, the TCPIP implementation, the\n"
+"TRACEBACK if it can be captured, and any other relevant information.\n"
+msgstr ""
+
+#: src/LYEdit.c:266
+#, fuzzy, c-format
+msgid "Error starting editor, %s"
+msgstr "ðÏÍÉÌËÁ ÏÐÒÁÃØÏ×Õ×ÁÎÎÑ ÒÑÄËÁ %d Ú %s\n"
+
+#: src/LYEdit.c:269
+msgid "Editor killed by signal"
+msgstr "òÅÄÁËÔÏÒÁ ×ÂÉÔÏ ÓÉÇÎÁÌÏÍ"
+
+#: src/LYEdit.c:274
+#, fuzzy, c-format
+msgid "Editor returned with error status %s"
+msgstr "òÅÄÁËÔÏÒ ÐÏ×ÅÒÎÕ× ÐÏÍÉÌËÕ, %s"
+
+# ôåòí¶îïìïç¶ñ
+# ôåòí¶îïìïç¶ñ
+#: src/LYDownload.c:504
+msgid "Downloaded link:"
+msgstr "úÁ×ÁÎÔÁÖÅÎÏ ÐÏÓÉÌÁÎÎÑ:"
+
+# msgstr "ðÒÏÐÏÎÕ¤ÔØÓÑ ¦Í'Ñ ÆÁÊÌÕ:"
+# msgstr "ðÒÏÐÏÎÕ¤ÔØÓÑ ¦Í'Ñ ÆÁÊÌÕ:"
+#: src/LYDownload.c:509
+msgid "Suggested file name:"
+msgstr "úÁÐÒÏÐÏÎÏ×ÁÎÅ ¦Í'Ñ ÆÁÊÌÕ:"
+
+# ôåòí¶îïìïç¶ñ
+# ôåòí¶îïìïç¶ñ
+#: src/LYDownload.c:514
+msgid "Standard download options:"
+msgstr "óÔÁÎÄÁÒÔΦ ÐÁÒÁÍÅÔÒÉ ÚÁ×ÁÎÔÁÖÕ×ÁÎÎÑ:"
+
+#: src/LYDownload.c:515
+msgid "Download options:"
+msgstr "ðÁÒÁÍÅÔÒÉ ÚÁ×ÁÎÔÁÖÕ×ÁÎÎÑ:"
+
+# @ Galeon- drkonqi kdelibs kmail konqueror lynx
+# * Andriy Rysin <arysin@yahoo.com>
+#: src/LYDownload.c:531
+msgid "Save to disk"
+msgstr "úÂÅÒÅÇÔÉ ÎÁ ÄÉÓË"
+
+#: src/LYDownload.c:545
+#, fuzzy
+msgid "View temporary file"
+msgstr "ðÅÒÅÇÌÑÎÕÔÉ ÆÁÊÌ "
+
+#: src/LYDownload.c:552
+msgid "Save to disk disabled."
+msgstr "úÁÐÉÓÕ×ÁÔÉ ÎÁ ÄÉÓË ÚÁÂÏÒÏÎÅÎÏ."
+
+#: src/LYDownload.c:556 src/LYPrint.c:1310
+msgid "Local additions:"
+msgstr "ìÏËÁÌØΦ ÄÏÄÁÔËÉ:"
+
+#: src/LYDownload.c:567 src/LYUpload.c:211
+msgid "No Name Given"
+msgstr "¶Í'Ñ ÎÅ ÚÁÄÁÎÅ"
+
+# 8-| ÎÅ ÚÎÁÀ...
+# 8-| ÎÅ ÚÎÁÀ...
+#: src/LYHistory.c:672
+msgid "You selected:"
+msgstr "÷É ×ÉÂÒÁÌÉ:"
+
+#: src/LYHistory.c:696 src/LYHistory.c:925
+msgid "(no address)"
+msgstr "(ÂÅÚ ÁÄÒÅÓÉ)"
+
+#: src/LYHistory.c:700
+msgid " (internal)"
+msgstr " (×ÎÕÔÒ¦ÛΦÊ)"
+
+#: src/LYHistory.c:702
+msgid " (was internal)"
+msgstr " (ÂÕ× ×ÎÕÔÒ¦ÛΦÊ)"
+
+#: src/LYHistory.c:800
+msgid " (From History)"
+msgstr " (ú ÖÕÒÎÁÌÕ)"
+
+#: src/LYHistory.c:845
+msgid "You visited (POSTs, bookmark, menu and list files excluded):"
+msgstr "÷É ×¦ÄצÄÕ×ÁÌÉ (ÏËÒ¦Í POSTs, ÚÁËÌÁÄÉÎÏË, ÍÅÎÀ ÔÁ ÓÐÉÓË¦× ÆÁÊ̦×):"
+
+#: src/LYHistory.c:1138
+msgid "(No messages yet)"
+msgstr "(ìÉÓÔ¦× ÝÅ ÎÅÍÁ)"
+
+#: src/LYLeaks.c:220
+msgid "Invalid pointer detected."
+msgstr ""
+
+#: src/LYLeaks.c:222 src/LYLeaks.c:260
+msgid "Sequence:"
+msgstr ""
+
+#: src/LYLeaks.c:225 src/LYLeaks.c:263
+msgid "Pointer:"
+msgstr "÷ËÁÚ¦×ÎÉË:"
+
+#: src/LYLeaks.c:234 src/LYLeaks.c:241 src/LYLeaks.c:282
+msgid "FileName:"
+msgstr "¶Í'Ñ ÆÁÊÌÕ:"
+
+#: src/LYLeaks.c:237 src/LYLeaks.c:244 src/LYLeaks.c:285 src/LYLeaks.c:296
+msgid "LineCount:"
+msgstr "ë¦ÌØË. ÒÑÄ˦×:"
+
+#: src/LYLeaks.c:258
+msgid "Memory leak detected."
+msgstr "ðÏͦÞÅÎÏ ×ÉÔ¦Ë ÐÁÍ'ÑÔ¦."
+
+#: src/LYLeaks.c:266
+msgid "Contains:"
+msgstr "í¦ÓÔÉÔØ:"
+
+#: src/LYLeaks.c:279
+msgid "ByteSize:"
+msgstr "âÁÊÔ¦×:"
+
+#: src/LYLeaks.c:293
+msgid "realloced:"
+msgstr ""
+
+#: src/LYLeaks.c:314
+msgid "Total memory leakage this run:"
+msgstr ""
+
+#: src/LYLeaks.c:317
+msgid "Peak allocation"
+msgstr ""
+
+#: src/LYLeaks.c:318
+msgid "Bytes allocated"
+msgstr ""
+
+#: src/LYLeaks.c:319
+msgid "Total mallocs"
+msgstr ""
+
+#: src/LYLeaks.c:320
+msgid "Total frees"
+msgstr ""
+
+#: src/LYList.c:84
+msgid "References in "
+msgstr "ðÏÓÉÌÁÎØ Õ "
+
+#: src/LYList.c:87
+msgid "this document:"
+msgstr "ÃØÏÍÕ ÄÏËÕÍÅÎÔ¦:"
+
+#: src/LYList.c:93
+msgid "Visible links:"
+msgstr "÷ÉÄÉͦ ÐÏÓÉÌÁÎÎÑ:"
+
+#: src/LYList.c:194 src/LYList.c:295
+msgid "Hidden links:"
+msgstr "ðÒÉÈÏ×ÁΦ ÐÏÓÉÌÁÎÎÑ:"
+
+#: src/LYList.c:332
+msgid "References"
+msgstr "ðÏÓÉÌÁÎÎÑ"
+
+#: src/LYList.c:336
+msgid "Visible links"
+msgstr "÷ÉÄÉͦ ÐÏÓÉÌÁÎÎÑ"
+
+#: src/LYLocal.c:271
+#, c-format
+msgid "Unable to get status of '%s'."
+msgstr "îÅÍÏÖÌÉ×Ï ÏÔÒÉÍÁÔÉ ÓÔÁÔÕÓ '%s'."
+
+#: src/LYLocal.c:305
+msgid "The selected item is not a file or a directory! Request ignored."
+msgstr ""
+
+#: src/LYLocal.c:373
+#, c-format
+msgid "Unable to %s due to system error!"
+msgstr ""
+
+#: src/LYLocal.c:407
+#, c-format
+msgid "Probable failure to %s due to system error!"
+msgstr ""
+
+#: src/LYLocal.c:469 src/LYLocal.c:490
+#, c-format
+msgid "remove %s"
+msgstr "×ÉÄÁÌÉÔÉ %s"
+
+#: src/LYLocal.c:508
+#, c-format
+msgid "touch %s"
+msgstr ""
+
+#: src/LYLocal.c:536
+#, c-format
+msgid "move %s to %s"
+msgstr ""
+
+#: src/LYLocal.c:577
+msgid "There is already a directory with that name! Request ignored."
+msgstr "ëÁÔÁÌÏÇ Ú ÔÁËÉÍ ¦ÍÅÎÅÍ ÕÖÅ ¦ÓÎÕ¤! ÷ÉÍÏÇÕ ÐÒϦÇÎÏÒÏ×ÁÎÏ."
+
+#: src/LYLocal.c:579
+msgid "There is already a file with that name! Request ignored."
+msgstr "æÁÊÌ ¦Ú ÔÁËÉÍ ¦ÍÅÎÅÍ ÕÖÅ ¦ÓÎÕ¤! ÷ÉÍÏÇÕ ÐÒϦÇÎÏÒÏ×ÁÎÏ."
+
+#: src/LYLocal.c:581
+msgid "The specified name is already in use! Request ignored."
+msgstr "÷ËÁÚÁÎÅ ¦Í'Ñ ×ÖÅ × ÒÏÂÏÔ¦! ÷ÉÍÏÇÕ ÐÒϦÇÎÏÒÏ×ÁÎÏ."
+
+#: src/LYLocal.c:592
+msgid "Destination has different owner! Request denied."
+msgstr ""
+
+#: src/LYLocal.c:595
+msgid "Destination is not a valid directory! Request denied."
+msgstr ""
+
+#: src/LYLocal.c:617
+msgid "Remove all tagged files and directories?"
+msgstr "÷ÉÄÁÌÉÔÉ ÕÓ¦ ÐÏÚÎÁÞÅΦ ÆÁÊÌÉ ÔÁ ËÁÔÁÌÏÇÉ?"
+
+#: src/LYLocal.c:675
+msgid "Enter new location for tagged items: "
+msgstr "÷×ÅĦÔØ ÎÏ׊ͦÓÃÅ ÄÌÑ ÐÏÚÎÁÞÅÎÉÈ ÐÕÎËÔ¦×: "
+
+#: src/LYLocal.c:745
+msgid "Path too long"
+msgstr "úÁÄÏ×ÇÉÊ ÛÌÑÈ"
+
+#: src/LYLocal.c:776
+msgid "Source and destination are the same location - request ignored!"
+msgstr ""
+
+# ôåòí¶îïìïç¶ñ
+# ôåòí¶îïìïç¶ñ
+#: src/LYLocal.c:833
+msgid "Enter new name for directory: "
+msgstr "÷×ÅĦÔØ ÎÏ×Å ¦Í'Ñ ÄÌÑ ËÁÔÁÌÏÇÕ: "
+
+#: src/LYLocal.c:835
+msgid "Enter new name for file: "
+msgstr "÷×ÅĦÔØ ÎÏ×Å ¦Í'Ñ ÄÌÑ ÆÁÊÌÕ: "
+
+#: src/LYLocal.c:847
+msgid "Illegal character (path-separator) found! Request ignored."
+msgstr ""
+
+#: src/LYLocal.c:897
+msgid "Enter new location for directory: "
+msgstr "÷×ÅĦÔØ ÎÏ×ÉÊ ÛÌÑÈ ËÁÔÁÌÏÇÕ: "
+
+#: src/LYLocal.c:903
+msgid "Enter new location for file: "
+msgstr "÷×ÅĦÔØ ÎÏ×ÉÊ ÛÌÑÈ ÆÁÊÌÕ: "
+
+#: src/LYLocal.c:930
+msgid "Unexpected failure - unable to find trailing path separator"
+msgstr ""
+
+#: src/LYLocal.c:950
+msgid "Source and destination are the same location! Request ignored!"
+msgstr ""
+
+#: src/LYLocal.c:997
+msgid "Modify name, location, or permission (n, l, or p): "
+msgstr "úͦÎÉÔÉ ÎÁÚ×Õ(n), ÛÌÑÈ(l) ÞÉ ÐÒÁ×Á ÄÏÓÔÕÐÕ(p): "
+
+#: src/LYLocal.c:999
+msgid "Modify name or location (n or l): "
+msgstr "úͦÎÉÔÉ ÎÁÚ×Õ(n) ÞÉ ÛÌÑÈ(l): "
+
+#.
+#. * Code for changing ownership needed here.
+#.
+#: src/LYLocal.c:1028
+msgid "This feature not yet implemented!"
+msgstr "ãÀ ÍÏÖÌÉצÓÔØ ÝÅ ÎÅ ÒÅÁ̦ÚÏ×ÁÎÏ!"
+
+#: src/LYLocal.c:1048
+msgid "Enter name of file to create: "
+msgstr "÷×ÅĦÔØ ¦Í'Ñ ÆÁÊÌÕ: "
+
+#: src/LYLocal.c:1052 src/LYLocal.c:1088
+msgid "Illegal redirection \"//\" found! Request ignored."
+msgstr ""
+
+# ôåòí¶îïìïç¶ñ
+# ôåòí¶îïìïç¶ñ
+#: src/LYLocal.c:1084
+msgid "Enter name for new directory: "
+msgstr "÷×ÅĦÔØ ÎÏ×Å ¦Í'Ñ ÄÌÑ ËÁÔÁÌÏÇÕ: "
+
+# ôåòí¶îïìïç¶ñ
+# ôåòí¶îïìïç¶ñ
+#: src/LYLocal.c:1124
+msgid "Create file or directory (f or d): "
+msgstr "óÔ×ÏÒÉÔÉ ÆÁÊÌ ÞÉ ËÁÔÁÌÏÇ (f ÞÉ d): "
+
+#: src/LYLocal.c:1166
+#, fuzzy, c-format
+msgid "Remove directory '%s'?"
+msgstr "÷ÉÄÁÌÉÔÉ ÆÁÊÌ '%s'?"
+
+# ôåòí¶îïìïç¶ñ
+# ôåòí¶îïìïç¶ñ
+#: src/LYLocal.c:1169
+#, fuzzy
+msgid "Remove directory?"
+msgstr " ËÁÔÁÌÏÇ"
+
+#: src/LYLocal.c:1174
+#, c-format
+msgid "Remove file '%s'?"
+msgstr "÷ÉÄÁÌÉÔÉ ÆÁÊÌ '%s'?"
+
+#: src/LYLocal.c:1176
+msgid "Remove file?"
+msgstr "÷ÉÄÁÌÉÔÉ ÆÁÊÌ?"
+
+# 8-| ÎÅ ÚÎÁÀ...
+# 8-| ÎÅ ÚÎÁÀ...
+#: src/LYLocal.c:1181
+#, c-format
+msgid "Remove symbolic link '%s'?"
+msgstr "÷ÉÄÁÌÉÔÉ ÓÉÍ×ÏÌØÎÅ ÐÏÓÉÌÁÎÎÑ '%s'?"
+
+# 8-| ÎÅ ÚÎÁÀ...
+# 8-| ÎÅ ÚÎÁÀ...
+#: src/LYLocal.c:1183
+msgid "Remove symbolic link?"
+msgstr "÷ÉÄÁÌÉÔÉ ÓÉÍ×ÏÌØÎÅ ÐÏÓÉÌÁÎÎÑ?"
+
+#: src/LYLocal.c:1278
+msgid "Sorry, don't know how to permit non-UNIX files yet."
+msgstr ""
+
+#: src/LYLocal.c:1308
+msgid "Unable to open permit options file"
+msgstr ""
+
+#: src/LYLocal.c:1338
+msgid "Specify permissions below:"
+msgstr "÷ËÁÖ¦ÔØ ÐÒÁ×Á ÄÏÓÔÕÐÕ:"
+
+#: src/LYLocal.c:1339 src/LYShowInfo.c:261
+msgid "Owner:"
+msgstr "÷ÌÁÓÎÉË:"
+
+#: src/LYLocal.c:1355
+msgid "Group"
+msgstr "çÒÕÐÁ"
+
+#: src/LYLocal.c:1371
+msgid "Others:"
+msgstr "¶ÎÛ¦:"
+
+#: src/LYLocal.c:1389
+msgid "form to permit"
+msgstr ""
+
+#: src/LYLocal.c:1484
+msgid "Invalid mode format."
+msgstr "îÅצÒÎÉÊ ÆÏÒÍÁÔ ÒÅÖÉÍÕ."
+
+#: src/LYLocal.c:1488
+msgid "Invalid syntax format."
+msgstr "îÅצÒÎÉÊ ÆÏÒÍÁÔ ÓÉÎÔÁËÓÉÓÕ."
+
+#: src/LYLocal.c:1670
+msgid "Warning! UUDecoded file will exist in the directory you started Lynx."
+msgstr ""
+
+#: src/LYLocal.c:1860
+msgid "NULL URL pointer"
+msgstr ""
+
+#: src/LYLocal.c:1942
+#, c-format
+msgid "Executing %s "
+msgstr "÷ÉËÏÎÕÀ %s "
+
+#: src/LYLocal.c:1945
+msgid "Executing system command. This might take a while."
+msgstr "÷ÉËÏÎÕÀ ÓÉÓÔÅÍÎÕ ËÏÍÁÎÄÕ. ãÅ ÍÏÖÅ ÚÁÊÎÑÔÉ ÔÒÏÈÉ ÞÁÓÕ."
+
+# ôåòí¶îïìïç¶ñ
+# ôåòí¶îïìïç¶ñ
+#: src/LYLocal.c:2017
+msgid "Current directory:"
+msgstr "ðÏÔÏÞÎÉÊ ËÁÔÁÌÏÇ:"
+
+#: src/LYLocal.c:2020 src/LYLocal.c:2038
+msgid "Current selection:"
+msgstr "÷ÉĦÌÅÎÉÊ ÅÌÅÍÅÎÔ:"
+
+#: src/LYLocal.c:2024
+msgid "Nothing currently selected."
+msgstr "î¦ÞÏÇÏ ÎÅ ×ÉĦÌÅÎÏ"
+
+#: src/LYLocal.c:2040
+msgid "tagged item:"
+msgstr "צÄͦÞÅÎÉÊ ÅÌÅÍÅÎÔ:"
+
+#: src/LYLocal.c:2041
+msgid "tagged items:"
+msgstr "צÄͦÞÅΦ ÅÌÅÍÅÎÔÉ:"
+
+#: src/LYLocal.c:2138 src/LYLocal.c:2149
+msgid "Illegal filename; request ignored."
+msgstr "îÅצÒÎÅ ¦Í'Ñ ÆÁÊÌÕ, ÚÁÐÉÔ ×¦ÄÈÉÌÅÎÏ."
+
+#. directory not writable
+#: src/LYLocal.c:2247 src/LYLocal.c:2306
+msgid "Install in the selected directory not permitted."
+msgstr ""
+
+#: src/LYLocal.c:2302
+msgid "The selected item is not a directory! Request ignored."
+msgstr ""
+
+# msgstr "è×ÉÌÉÎÏÞËÕ, ..."
+# msgstr "è×ÉÌÉÎÏÞËÕ, ..."
+#: src/LYLocal.c:2311
+msgid "Just a moment, ..."
+msgstr "úÁÞÅËÁÊÔÅ È×ÉÌØËÕ, ..."
+
+#: src/LYLocal.c:2328
+msgid "Error building install args"
+msgstr ""
+
+#: src/LYLocal.c:2343 src/LYLocal.c:2374
+#, c-format
+msgid "Source and target are the same: %s"
+msgstr ""
+
+#: src/LYLocal.c:2350 src/LYLocal.c:2381
+#, c-format
+msgid "Already in target directory: %s"
+msgstr ""
+
+# msgstr "÷ÓÔÁÎÏ×ÌÅÎÎÑ ×ÉËÏÎÁÎÏ"
+# msgstr "÷ÓÔÁÎÏ×ÌÅÎÎÑ ×ÉËÏÎÁÎÏ"
+#: src/LYLocal.c:2399
+msgid "Installation complete"
+msgstr "¶ÎÓÔÁÌÑæÀ ÚÁ×ÅÒÛÅÎÏ"
+
+#: src/LYLocal.c:2586
+msgid "Temporary URL or list would be too long."
+msgstr ""
+
+# * Yuriy Syrota <rasta@renome.rovno.ua>
+#: src/LYMail.c:520
+msgid "Sending"
+msgstr "÷¦ÄÓÉÌÁÎÎÑ"
+
+#: src/LYMail.c:1006
+#, c-format
+msgid "The link %s :?: %s \n"
+msgstr ""
+
+#: src/LYMail.c:1008
+#, c-format
+msgid "called \"%s\"\n"
+msgstr "×ÉËÌÉËÁÎÏ \"%s\"\n"
+
+#: src/LYMail.c:1009
+#, c-format
+msgid "in the file \"%s\" called \"%s\"\n"
+msgstr "Õ ÆÁÊ̦ \"%s\" ×ÉËÌÉËÁÎÏÍÕ \"%s\"\n"
+
+#: src/LYMail.c:1010
+msgid "was requested but was not available."
+msgstr ""
+
+#: src/LYMail.c:1011
+msgid "Thought you might want to know."
+msgstr ""
+
+#: src/LYMail.c:1013
+msgid "This message was automatically generated by"
+msgstr "ãÅ ÐÏצÄÏÍÌÅÎÎÑ ÚÇÅÎÅÒÏ×ÁÎÏ Á×ÔÏÍÁÔÉÞÎÏ ÍÎÏÀ,"
+
+#: src/LYMail.c:1728
+msgid "No system mailer configured"
+msgstr ""
+
+#: src/LYMain.c:1023
+msgid "No Winsock found, sorry."
+msgstr "äÁÒÕÊÔÅ, Winsock ÎÅ ÚÎÁÊÄÅÎÏ."
+
+#: src/LYMain.c:1226
+#, fuzzy
+msgid "You MUST define a valid TMP or TEMP area!"
+msgstr "÷É íõóéôå ×ËÁÚÁÔÉ TMP ÞÉ TEMP!\n"
+
+# ôåòí¶îïìïç¶ñ
+# msgstr "îÅÍÁ¤ ÔÁËÏÇÏ ËÁÔÁÌÏÇÕ"
+#: src/LYMain.c:1279 src/LYMainLoop.c:5074
+msgid "No such directory"
+msgstr "ôÁËÏÇÏ ËÁÔÁÌÏÇÕ ÎÅÍÁ¤"
+
+#: src/LYMain.c:1464
+#, fuzzy, c-format
+msgid ""
+"\n"
+"Configuration file \"%s\" is not available.\n"
+"\n"
+msgstr ""
+"\n"
+"æÁÊÌ ËÏÎƦÇÕÒÁÃ¦Ê %s ÎÅÄÏÓÔÕÐÎÉÊ.\n"
+"\n"
+
+#: src/LYMain.c:1474
+#, c-format
+msgid ""
+"\n"
+"Lynx character sets not declared.\n"
+"\n"
+msgstr ""
+
+#: src/LYMain.c:1503
+#, c-format
+msgid ""
+"\n"
+"Lynx edit map not declared.\n"
+"\n"
+msgstr ""
+
+#: src/LYMain.c:1579
+#, fuzzy, c-format
+msgid ""
+"\n"
+"Lynx file \"%s\" is not available.\n"
+"\n"
+msgstr ""
+"\n"
+"æÁÊÌ Lynx %s ÎÅÄÏÓÔÕÐÎÉÊ.\n"
+"\n"
+
+#: src/LYMain.c:1654
+#, c-format
+msgid "Ignored %d characters from standard input.\n"
+msgstr ""
+
+#: src/LYMain.c:1656
+#, c-format
+msgid "Use \"-stdin\" or \"-\" to tell how to handle piped input.\n"
+msgstr ""
+
+#: src/LYMain.c:1804
+msgid "Warning:"
+msgstr "õ×ÁÇÁ:"
+
+#: src/LYMain.c:2372
+msgid "persistent cookies state will be changed in next session only."
+msgstr ""
+
+#: src/LYMain.c:2617 src/LYMain.c:2662
+#, c-format
+msgid "Lynx: ignoring unrecognized charset=%s\n"
+msgstr ""
+
+#: src/LYMain.c:3181
+#, fuzzy, c-format
+msgid "%s Version %s (%s)"
+msgstr "%s ÷ÅÒÓ¦Ñ %s (%s)\n"
+
+#: src/LYMain.c:3219
+#, c-format
+msgid "Built on %s %s %s\n"
+msgstr "ú¦ÂÒÁÎÏ ÎÁ %s %s %s\n"
+
+#: src/LYMain.c:3241
+msgid "Copyrights held by the Lynx Developers Group,"
+msgstr ""
+
+#: src/LYMain.c:3242
+msgid "the University of Kansas, CERN, and other contributors."
+msgstr ""
+
+#: src/LYMain.c:3243
+#, fuzzy
+msgid "Distributed under the GNU General Public License (Version 2)."
+msgstr "òÏÚÐÏ×ÓÀÄÖÕ¤ÔØÓÑ ÚǦÄÎÏ Ú GNU General Public License.\n"
+
+#: src/LYMain.c:3244
+#, fuzzy
+msgid "See http://lynx.isc.org/ and the online help for more information."
+msgstr ""
+"äÉ× http://lynx.browser.org/ ÔÁ ÏÎÌÁÊÎ-ÄÏÐÏÍÏÇÕ, ÝÏ ×ÚÎÁÔÉ Â¦ÌØÛÅ.\n"
+"\n"
+
+#: src/LYMain.c:4065
+#, c-format
+msgid "USAGE: %s [options] [file]\n"
+msgstr "÷éëïòéóôáîîñ: %s [ÐÁÒÁÍÅÔÒÉ] [ÆÁÊÌ]\n"
+
+#: src/LYMain.c:4066
+#, c-format
+msgid "Options are:\n"
+msgstr "ðÁÒÁÍÅÔÒÉ:\n"
+
+#: src/LYMain.c:4365
+#, c-format
+msgid "%s: Invalid Option: %s\n"
+msgstr "%s: îÅצÒÎÉÊ ÐÁÒÁÍÅÔÒ: %s\n"
+
+#: src/LYMainLoop.c:594
+#, c-format
+msgid "Internal error: Invalid mouse link %d!"
+msgstr ""
+
+#: src/LYMainLoop.c:714 src/LYMainLoop.c:5096
+msgid "A URL specified by the user"
+msgstr "URL ×ËÁÚÁÎÉÊ ËÏÒÉÓÔÕ×ÁÞÅÍ"
+
+#: src/LYMainLoop.c:1173
+msgid "Enctype multipart/form-data not yet supported! Cannot submit."
+msgstr ""
+
+#.
+#. * Make a name for this help file.
+#.
+#: src/LYMainLoop.c:3105
+msgid "Help Screen"
+msgstr "åËÒÁÎ äÏÐÏÍÏÇÉ"
+
+#: src/LYMainLoop.c:3226
+msgid "System Index"
+msgstr ""
+
+#: src/LYMainLoop.c:3585 src/LYMainLoop.c:5320
+msgid "Entry into main screen"
+msgstr ""
+
+#: src/LYMainLoop.c:3843
+msgid "No next document present"
+msgstr ""
+
+#: src/LYMainLoop.c:4139
+msgid "charset for this document specified explicitly, sorry..."
+msgstr ""
+
+#: src/LYMainLoop.c:5052
+msgid "cd to:"
+msgstr "ÐÅÒÅÊÔÉ ÄÏ:"
+
+#: src/LYMainLoop.c:5077
+msgid "A component of path is not a directory"
+msgstr ""
+
+#: src/LYMainLoop.c:5080
+msgid "failed to change directory"
+msgstr "îÅ ÍÏÖÕ Ä¦ÓÔÁÔÉÓÑ ÄÏ ËÁÔÁÌÏÇÕ."
+
+#: src/LYMainLoop.c:6252
+msgid "Reparsing document under current settings..."
+msgstr "ïÐÒÁÃØÏ×Õ¤ÍÏ ÄÏËÕÍÅÎÔ ÚǦÄÎÏ Ú ÐÏÔÏÞÎÉÍÉ ÕÓÔÁÎÏ×ËÁÍÉ..."
+
+#: src/LYMainLoop.c:6543
+#, c-format
+msgid "Fatal error - could not open output file %s\n"
+msgstr "æÁÔÁÌØÎÁ ÐÏÍÉÌËÁ - ÎÅÍÏÖÌÉ×Ï ×¦ÄËÒÉÔÉ ×ÉȦÄÎÉÊ ÆÁÊÌ %s\n"
+
+#: src/LYMainLoop.c:6880
+msgid "TABLE center enable."
+msgstr ""
+
+#: src/LYMainLoop.c:6883
+msgid "TABLE center disable."
+msgstr ""
+
+# ôåòí¶îïìïç¶ñ
+# ôåòí¶îïìïç¶ñ
+#: src/LYMainLoop.c:6960
+#, fuzzy
+msgid "Current URL is empty."
+msgstr "ðÏÔÏÞÎÉÊ ËÁÔÁÌÏÇ:"
+
+#: src/LYMainLoop.c:6962 src/LYUtils.c:1828
+msgid "Copy to clipboard failed."
+msgstr ""
+
+#: src/LYMainLoop.c:6964
+msgid "Document URL put to clipboard."
+msgstr ""
+
+#: src/LYMainLoop.c:6966
+msgid "Link URL put to clipboard."
+msgstr ""
+
+#: src/LYMainLoop.c:6993
+msgid "No URL in the clipboard."
+msgstr ""
+
+#: src/LYMainLoop.c:7664 src/LYMainLoop.c:7834
+msgid "-index-"
+msgstr "-¦ÎÄÅËÓ-"
+
+#: src/LYMainLoop.c:7774
+msgid "lynx: Can't access startfile"
+msgstr "lynx: îÅÍÏÖÌÉ×Ï ÚÁ×ÁÎÔÁÖÉÔÉ ÓÔÁÒÔÏ×ÉÊ ÆÁÊÌ"
+
+#: src/LYMainLoop.c:7786
+msgid "lynx: Start file could not be found or is not text/html or text/plain"
+msgstr "lynx: óÔÁÒÔÏ×ÏÇÏ ÆÁÊÌÕ ÎÅÍÁ, ÞÉ ×¦Î ÎÅ Õ ÆÏÒÍÁÔ¦ text/html (text/plain)"
+
+#: src/LYMainLoop.c:7787
+msgid " Exiting..."
+msgstr " ÷ÉÈÏÄÉÍÏ..."
+
+#: src/LYMainLoop.c:7828
+msgid "-more-"
+msgstr "-ÄÁ̦-"
+
+#. Enable scrolling.
+#: src/LYNews.c:186
+msgid "You will be posting to:"
+msgstr "÷É ÎÁÄÓÉÌÁ¤ÔÅ ÌÉÓÔÁ ÄÏ:"
+
+#.
+#. * Get the mail address for the From header, offering personal_mail_address
+#. * as default.
+#.
+#: src/LYNews.c:195
+msgid ""
+"\n"
+"\n"
+" Please provide your mail address for the From: header\n"
+msgstr ""
+"\n"
+"\n"
+" âÕÄØ ÌÁÓËÁ, ×ËÁÖ¦ÔØ ÐÏÛÔÏ×Õ ÁÄÒÅÓÕ ÄÌÑ ÚÁÇÏÌÏ×ËÁ \"÷¦Ä:\"\n"
+
+#.
+#. * Get the Subject header, offering the current document's title as the
+#. * default if this is a followup rather than a new post. - FM
+#.
+#: src/LYNews.c:212
+msgid ""
+"\n"
+"\n"
+" Please provide or edit the Subject: header\n"
+msgstr ""
+"\n"
+"\n"
+" âÕÄØ ÌÁÓËÁ, ×ËÁÖ¦ÔØ ÞÉ ×¦ÄÒÅÄÁÇÕÊÔÅ ÚÁÇÏÌÏ×ÏË \"ôÅÍÁ:\"\n"
+
+#: src/LYNews.c:302
+msgid ""
+"\n"
+"\n"
+" Please provide or edit the Organization: header\n"
+msgstr ""
+"\n"
+"\n"
+" âÕÄØ ÌÁÓËÁ, ×ËÁÖ¦ÔØ ÞÉ ×¦ÄÒÅÄÁÇÕÊÔÅ ÚÁÇÏÌÏ×ÏË \"ïÒÇÁΦÚÁæÑ:\"\n"
+
+#.
+#. * Use the built in line editior.
+#.
+#: src/LYNews.c:359
+msgid ""
+"\n"
+"\n"
+" Please enter your message below."
+msgstr ""
+"\n"
+"\n"
+" âÕÄØ ÌÁÓËÁ, ××ÅĦÔØ ×ÁÛÅ ÐÏצÄÏÍÌÅÎÎÑ ÎÉÖÞÅ."
+
+#: src/LYNews.c:405
+msgid "Message has no original text!"
+msgstr ""
+
+#: src/LYOptions.c:765
+msgid "review/edit B)ookmarks files"
+msgstr "ÐÒÏÇÌÑÎÕÔÉ/ÚͦÎÉÔÉ ÆÁÊÌ úÁËÌÁÄÉÎÏË (B)"
+
+#: src/LYOptions.c:767
+msgid "B)ookmark file: "
+msgstr "B) ÆÁÊÌ ÚÁËÌÁÄÉÎÏË: "
+
+#: src/LYOptions.c:2127 src/LYOptions.c:2134
+msgid "ON"
+msgstr ""
+
+#. verbose_img variable
+#: src/LYOptions.c:2128 src/LYOptions.c:2133 src/LYOptions.c:2285 src/LYOptions.c:2296
+msgid "OFF"
+msgstr ""
+
+#: src/LYOptions.c:2129
+msgid "NEVER"
+msgstr ""
+
+#: src/LYOptions.c:2130
+msgid "ALWAYS"
+msgstr ""
+
+#: src/LYOptions.c:2146 src/LYOptions.c:2277
+msgid "ignore"
+msgstr ""
+
+#: src/LYOptions.c:2147
+msgid "ask user"
+msgstr ""
+
+#: src/LYOptions.c:2148
+msgid "accept all"
+msgstr ""
+
+#: src/LYOptions.c:2160
+msgid "ALWAYS OFF"
+msgstr ""
+
+#: src/LYOptions.c:2161
+msgid "FOR LOCAL FILES ONLY"
+msgstr ""
+
+#: src/LYOptions.c:2163
+msgid "ALWAYS ON"
+msgstr ""
+
+#: src/LYOptions.c:2175
+msgid "Numbers act as arrows"
+msgstr ""
+
+#: src/LYOptions.c:2177
+msgid "Links are numbered"
+msgstr ""
+
+#: src/LYOptions.c:2180
+msgid "Links and form fields are numbered"
+msgstr ""
+
+#: src/LYOptions.c:2183
+msgid "Form fields are numbered"
+msgstr ""
+
+#: src/LYOptions.c:2197
+msgid "Case insensitive"
+msgstr ""
+
+#: src/LYOptions.c:2198
+msgid "Case sensitive"
+msgstr ""
+
+#: src/LYOptions.c:2222
+msgid "prompt normally"
+msgstr ""
+
+#: src/LYOptions.c:2223
+msgid "force yes-response"
+msgstr ""
+
+#: src/LYOptions.c:2224
+msgid "force no-response"
+msgstr ""
+
+#: src/LYOptions.c:2242
+#, fuzzy
+msgid "Novice"
+msgstr "î¦ÞÏÇÏ"
+
+#: src/LYOptions.c:2243
+#, fuzzy
+msgid "Intermediate"
+msgstr "÷ÎÕÔÒ¦ÛΦÊ"
+
+#: src/LYOptions.c:2244
+msgid "Advanced"
+msgstr ""
+
+#: src/LYOptions.c:2253
+msgid "By First Visit"
+msgstr ""
+
+#: src/LYOptions.c:2255
+msgid "By First Visit Reversed"
+msgstr ""
+
+#: src/LYOptions.c:2256
+msgid "As Visit Tree"
+msgstr ""
+
+#: src/LYOptions.c:2257
+msgid "By Last Visit"
+msgstr ""
+
+#: src/LYOptions.c:2259
+msgid "By Last Visit Reversed"
+msgstr ""
+
+#. Old_DTD variable
+#: src/LYOptions.c:2270
+msgid "relaxed (TagSoup mode)"
+msgstr ""
+
+#: src/LYOptions.c:2271
+msgid "strict (SortaSGML mode)"
+msgstr ""
+
+#: src/LYOptions.c:2278
+msgid "as labels"
+msgstr ""
+
+#: src/LYOptions.c:2279
+#, fuzzy
+msgid "as links"
+msgstr "ÃÅ ÐÏÓÉÌÁÎÎÑ"
+
+#: src/LYOptions.c:2286
+#, fuzzy
+msgid "show filename"
+msgstr " (ÐÏÇÁÎÅ ¦Í'Ñ ÆÁÊÌÕ)"
+
+#: src/LYOptions.c:2297
+msgid "STANDARD"
+msgstr ""
+
+#: src/LYOptions.c:2298
+msgid "ADVANCED"
+msgstr ""
+
+# ôåòí¶îïìïç¶ñ
+# ôåòí¶îïìïç¶ñ
+#: src/LYOptions.c:2329
+#, fuzzy
+msgid "Directories first"
+msgstr "ð¦ÄËÁÔÁÌÏÇÉ:"
+
+# ôÑÇÎÅÍÏ http://enigma.x-telecom.net/ ×ÐÅÒÛÅ (ÍÉ ÔÁÍ ÝÅ ÎÅ ÂÕÌÉ)
+# ôÑÇÎÅÍÏ http://enigma.x-telecom.net/ ×ÐÅÒÛÅ (ÍÉ ÔÁÍ ÝÅ ÎÅ ÂÕÌÉ)
+#: src/LYOptions.c:2330
+#, fuzzy
+msgid "Files first"
+msgstr " ×ÐÅÒÛÅ"
+
+#: src/LYOptions.c:2331
+msgid "Mixed style"
+msgstr ""
+
+# @ Dia GIMP Gabber Galeon- Ximian-setup-tools balsa control-center evolution gimp gimp-std-plugins- glade- gnome-core gnome-libs gnome-pim gnomeicu gphoto graphite guppi kandy kandy.po kateprojectmanager.po kcmemail kcmkio kde-i18n_4:2.2.2-2_kdeprintfax.po kdelibs kmail kmenuedit knode koffice korganizer ksysguard kword lynx pybliographer red-carpet rpmdrake screem userdrake xchat
+# * Yuriy Syrota <yuri@renome.rovno.ua>
+#: src/LYOptions.c:2339 src/LYOptions.c:2359
+#, fuzzy
+msgid "By Name"
+msgstr "îÁÚ×Á:"
+
+#: src/LYOptions.c:2340 src/LYOptions.c:2360
+msgid "By Type"
+msgstr ""
+
+#: src/LYOptions.c:2341 src/LYOptions.c:2361
+#, fuzzy
+msgid "By Size"
+msgstr "âÁÊÔ¦×:"
+
+#: src/LYOptions.c:2342 src/LYOptions.c:2362
+#, fuzzy
+msgid "By Date"
+msgstr "äÁÔÁ:"
+
+#: src/LYOptions.c:2343
+msgid "By Mode"
+msgstr ""
+
+#: src/LYOptions.c:2345
+msgid "By User"
+msgstr ""
+
+#: src/LYOptions.c:2346
+#, fuzzy
+msgid "By Group"
+msgstr "çÒÕÐÁ"
+
+#: src/LYOptions.c:2371
+msgid "Do not show rate"
+msgstr ""
+
+# ÐÅÒÅËÁÞÕ×ÁÎÎÑ - ÂÏ ÎÅ ÚÎÁÀ, ËÕÄÉ, Õ ÑËÉÊ Â¦Ë.
+# (×ÖÅ ËÒÁÝÅ "ÐÅÒÅÄÁ×ÁÎÎÑ", ÂÏ ÐÅÒÅÄÁÞÁ - ÎÅ ÚÏ×Ó¦Í ÐÒÏÃÅÓ, ÎÁÞÅ)
+#: src/LYOptions.c:2372 src/LYOptions.c:2373
+#, fuzzy, c-format
+msgid "Show %s/sec rate"
+msgstr "ðÅÒÅËÁÞÕ×ÁÎÎÑ ÄÁÎÉÈ ÚÁ×ÅÒÛÅÎÏ."
+
+#: src/LYOptions.c:2375 src/LYOptions.c:2376
+#, c-format
+msgid "Show %s/sec, ETA"
+msgstr ""
+
+#: src/LYOptions.c:2379
+#, fuzzy
+msgid "Show progressbar"
+msgstr "ðÏËÁÚÕ×ÁÔÉ ËÏÌØÏÒÉ"
+
+#: src/LYOptions.c:2391
+msgid "Accept lynx's internal types"
+msgstr ""
+
+#: src/LYOptions.c:2392
+msgid "Also accept lynx.cfg's types"
+msgstr ""
+
+#: src/LYOptions.c:2393
+msgid "Also accept user's types"
+msgstr ""
+
+#: src/LYOptions.c:2394
+msgid "Also accept system's types"
+msgstr ""
+
+# msgstr "ðÒÉÊÎÑÔÉ"
+# ÍÍÍÍ... ÎÅ ÚÎÁÀ. (ËÏÎÔÒ)ÁÒÇÕÍÅÎÔÉ?
+#: src/LYOptions.c:2395
+#, fuzzy
+msgid "Accept all types"
+msgstr "úÁÐÒÏ×ÁÄÉÔÉ ÚͦÎÉ"
+
+#: src/LYOptions.c:2404
+msgid "gzip"
+msgstr ""
+
+#: src/LYOptions.c:2405
+msgid "deflate"
+msgstr ""
+
+#: src/LYOptions.c:2408
+msgid "compress"
+msgstr ""
+
+#: src/LYOptions.c:2411
+msgid "bzip2"
+msgstr ""
+
+#: src/LYOptions.c:2413
+msgid "All"
+msgstr ""
+
+#: src/LYOptions.c:2681 src/LYOptions.c:2705
+#, c-format
+msgid "Use %s to invoke the Options menu!"
+msgstr "%s ×ÉËÌÉËÁ¤ íÅÎÀ îÁÌÁÛÔÕ×ÁÎØ!"
+
+#: src/LYOptions.c:3477
+msgid "(options marked with (!) will not be saved)"
+msgstr "(ÐÁÒÁÍÅÔÒÉ ×¦ÄͦÅΦ (!) ÎÅ ÂÕÄÕÔØ ÚÁÐÉÓÁΦ)"
+
+# @ GIMP lynx
+# * Yuri Syrota <rasta@renome.rovno.ua>
+#: src/LYOptions.c:3485
+msgid "General Preferences"
+msgstr "úÁÇÁÌØΦ ÎÁÌÁÛÔÕ×ÁÎÎÑ"
+
+# ¦ÌØÛÅ ÐÏÄÏÂÁ¤ÔØÓÑ "ËÏÒÉÓÔÕ×ÁÎÎÑ"
+# ¦ÌØÛÅ ÐÏÄÏÂÁ¤ÔØÓÑ "ËÏÒÉÓÔÕ×ÁÎÎÑ"
+#. ***************************************************************
+#. User Mode: SELECT
+#: src/LYOptions.c:3489
+msgid "User mode"
+msgstr "òÅÖÉÍ ËÏÒÉÓÔÕ×ÁÎÎÑ"
+
+#. Editor: INPUT
+#: src/LYOptions.c:3495
+msgid "Editor"
+msgstr "òÅÄÁËÔÏÒ"
+
+#. Search Type: SELECT
+#: src/LYOptions.c:3500
+msgid "Type of Search"
+msgstr "ôÉÐ ÐÏÛÕËÕ"
+
+#: src/LYOptions.c:3505
+msgid "Security and Privacy"
+msgstr ""
+
+#. ***************************************************************
+#. Cookies: SELECT
+#: src/LYOptions.c:3509
+msgid "Cookies"
+msgstr "ëÏÒÖÉËÉ"
+
+#. Cookie Prompting: SELECT
+#: src/LYOptions.c:3523
+msgid "Invalid-Cookie Prompting"
+msgstr ""
+
+#. SSL Prompting: SELECT
+#: src/LYOptions.c:3530
+msgid "SSL Prompting"
+msgstr ""
+
+#: src/LYOptions.c:3536
+msgid "Keyboard Input"
+msgstr "÷×¦Ä Ú ËÌÁצÁÔÕÒÉ"
+
+#. ***************************************************************
+#. Keypad Mode: SELECT
+#: src/LYOptions.c:3540
+msgid "Keypad mode"
+msgstr "ãÉÆÒÏ×Á ËÌÁצÁÔÕÒÁ"
+
+# msgstr "ëÌÁצۦ Emacs"
+# msgstr "ëÌÁצۦ Emacs"
+#. Emacs keys: ON/OFF
+#: src/LYOptions.c:3546
+msgid "Emacs keys"
+msgstr "ëÌÀÞ¦ Emacs"
+
+#. VI Keys: ON/OFF
+#: src/LYOptions.c:3552
+msgid "VI keys"
+msgstr "ëÌÀÞ¦ VI"
+
+#. Line edit style: SELECT
+#. well, at least 2 line edit styles available
+#: src/LYOptions.c:3559
+msgid "Line edit style"
+msgstr ""
+
+#. Keyboard layout: SELECT
+#: src/LYOptions.c:3571
+msgid "Keyboard layout"
+msgstr "òÏÚËÌÁÄËÁ ËÌÁצÁÔÕÒÉ"
+
+#.
+#. * Display and Character Set
+#.
+#: src/LYOptions.c:3585
+msgid "Display and Character Set"
+msgstr "äÉÓÐÌÅÊ ÔÁ ÎÁÂ¦Ò ÓÉÍ×Ï̦×"
+
+# ???
+# msgstr "îÁÂ¦Ò ÓÉÍ×ÏÌ¦× ÄÉÓÐÌÅÀ"
+# ???
+# msgstr "îÁÂ¦Ò ÓÉÍ×ÏÌ¦× ÄÉÓÐÌÅÀ"
+#. Use locale-based character set: ON/OFF
+#: src/LYOptions.c:3590
+#, fuzzy
+msgid "Use locale-based character set"
+msgstr "îÁÂ¦Ò ÓÉÍ×ÏÌ¦× ÄÉÓÐÌÅÑ"
+
+# ???
+# msgstr "îÁÂ¦Ò ÓÉÍ×ÏÌ¦× ÄÉÓÐÌÅÀ"
+# ???
+# msgstr "îÁÂ¦Ò ÓÉÍ×ÏÌ¦× ÄÉÓÐÌÅÀ"
+#. Display Character Set: SELECT
+#: src/LYOptions.c:3599
+msgid "Display character set"
+msgstr "îÁÂ¦Ò ÓÉÍ×ÏÌ¦× ÄÉÓÐÌÅÑ"
+
+#: src/LYOptions.c:3630
+msgid "Assumed document character set"
+msgstr "÷×ÁÖÁÔÉ ËÏÄÕ×ÁÎÎÑÍ ÄÏËÕÍÅÎÔÁ"
+
+#.
+#. * Since CJK people hardly mixed with other world
+#. * we split the header to make it more readable:
+#. * "CJK mode" for CJK display charsets, and "Raw 8-bit" for others.
+#.
+#: src/LYOptions.c:3650
+msgid "CJK mode"
+msgstr "òÅÖÉÍ CJK"
+
+# msgstr "óÐÒÁ×ÖΦ 8¦Ô"
+# ÍÏÖÅ "8-bit - ÑË ¤" ?-)
+#: src/LYOptions.c:3652
+msgid "Raw 8-bit"
+msgstr "òÅÖÉÍ Raw 8-bit"
+
+#. X Display: INPUT
+#: src/LYOptions.c:3660
+msgid "X Display"
+msgstr "X äÉÓÐÌÅÊ"
+
+#.
+#. * Document Appearance
+#.
+#: src/LYOptions.c:3666
+msgid "Document Appearance"
+msgstr "÷ÉÇÌÑÄ ÄÏËÕÍÅÎÔÁ"
+
+#: src/LYOptions.c:3672
+msgid "Show color"
+msgstr "ðÏËÁÚÕ×ÁÔÉ ËÏÌØÏÒÉ"
+
+#. Show cursor: ON/OFF
+#: src/LYOptions.c:3696
+msgid "Show cursor"
+msgstr "ðÏËÁÚÕ×ÁÔÉ ËÕÒÓÏÒ"
+
+#. Underline links: ON/OFF
+#: src/LYOptions.c:3702
+#, fuzzy
+msgid "Underline links"
+msgstr "ðÒÉÈÏ×ÁΦ ÐÏÓÉÌÁÎÎÑ:"
+
+#. Show scrollbar: ON/OFF
+#: src/LYOptions.c:3709
+msgid "Show scrollbar"
+msgstr "ðÏËÁÚÕ×ÁÔÉ ËÏÌØÏÒÉ"
+
+#. Select Popups: ON/OFF
+#: src/LYOptions.c:3716
+msgid "Popups for select fields"
+msgstr "òÏÚËÒÉÔÔÑ ÐÏÌ¦× ×ÉÂÏÒÕ"
+
+#. HTML error recovery: SELECT
+#: src/LYOptions.c:3722
+msgid "HTML error recovery"
+msgstr "÷ÉÐÒÁ×ÌÑÎÎÑ ÐÏÍÉÌÏË HTML"
+
+#. Show Images: SELECT
+#: src/LYOptions.c:3728
+msgid "Show images"
+msgstr "ðÏËÁÚÕ×ÁÔÉ ÚÏÂÒÁÖÅÎÎÑ"
+
+#. Verbose Images: ON/OFF
+#: src/LYOptions.c:3742
+msgid "Verbose images"
+msgstr "äÏÄÁÔËÏ×Ï ÐÒÏ ÚÏÂÒÁÖÅÎÎÑ"
+
+#.
+#. * Headers Transferred to Remote Servers
+#.
+#: src/LYOptions.c:3750
+msgid "Headers Transferred to Remote Servers"
+msgstr "úÁÇÏÌÏ×ËÉ ÄÌÑ îÁÄÓÉÌÁÎÎÑ ÎÁ óÅÒ×ÅÒÉ"
+
+# 8-| ×ÓÅ ÏÄÎÏ....
+# msgstr "áÄÒÅÓÁ ÅÌÅËÔÒÏÎÎϧ ÐÏÛÔÉ"
+# 8-| ×ÓÅ ÏÄÎÏ....
+# msgstr "áÄÒÅÓÁ ÅÌÅËÔÒÏÎÎϧ ÐÏÛÔÉ"
+#. ***************************************************************
+#. Mail Address: INPUT
+#: src/LYOptions.c:3754
+msgid "Personal mail address"
+msgstr "ðÅÒÓÏÎÁÌØÎÁ ÐÏÛÔÏ×Á ÁÄÒÅÓÁ"
+
+#: src/LYOptions.c:3760
+#, fuzzy
+msgid "Password for anonymous ftp"
+msgstr "ðÁÒÏÌØ ËÏÒÉÓÔÕ×ÁÞÁ ÎÁ ÓÅÒ×ÅÒ¦ ÎÏ×ÉÎ '%s':"
+
+# ÐÅÒÅËÁÞÁÎÏ - ÂÏ ÎÅ ÚÎÁÀ, ËÕÄÉ, Õ ÑËÉÊ Â¦Ë.
+# ÐÅÒÅËÁÞÁÎÏ - ÂÏ ÎÅ ÚÎÁÀ, ËÕÄÉ, Õ ÑËÉÊ Â¦Ë.
+#. Preferred media type: SELECT
+#: src/LYOptions.c:3766
+#, fuzzy
+msgid "Preferred media type"
+msgstr "ðÅÒÅËÁÞÁÎÏ %d ÂÁÊÔ¦×"
+
+#. Preferred encoding: SELECT
+#: src/LYOptions.c:3772
+#, fuzzy
+msgid "Preferred encoding"
+msgstr "õÌÀÂÌÅÎÁ ÍÏ×Á ÄÏËÕÍÅÎÔÁ"
+
+#. Preferred Document Character Set: INPUT
+#: src/LYOptions.c:3778
+msgid "Preferred document character set"
+msgstr "õÌÀÂÌÅÎÉÊ ÎÁÂ¦Ò ÓÉÍ×Ï̦×"
+
+#. Preferred Document Language: INPUT
+#: src/LYOptions.c:3783
+msgid "Preferred document language"
+msgstr "õÌÀÂÌÅÎÁ ÍÏ×Á ÄÏËÕÍÅÎÔÁ"
+
+#: src/LYOptions.c:3789
+msgid "User-Agent header"
+msgstr "úÁÇÏÌÏ×ÏË User-Agent"
+
+# ÏÂÉÄ×Á ÎÅ×ÄÁ̦, ÑË ÎÁ ÍÅÎÅ 8-(
+# msgstr "äÏÓÔÕÐ ÔÁ ÐÏËÁÚ ÆÁÊ̦×"
+# ÏÂÉÄ×Á ÎÅ×ÄÁ̦, ÑË ÎÁ ÍÅÎÅ 8-(
+# msgstr "äÏÓÔÕÐ ÔÁ ÐÏËÁÚ ÆÁÊ̦×"
+#.
+#. * Listing and Accessing Files
+#.
+#: src/LYOptions.c:3797
+msgid "Listing and Accessing Files"
+msgstr "óÐÉÓËÉ ÔÁ äÏÓÔÕÐ ÄÏ æÁÊ̦×"
+
+#. FTP sort: SELECT
+#: src/LYOptions.c:3802
+msgid "Use Passive FTP"
+msgstr ""
+
+#. FTP sort: SELECT
+#: src/LYOptions.c:3808
+msgid "FTP sort criteria"
+msgstr "ëÒÉÔÅÒ¦Ê ÓÏÒÔÕ×ÁÎÎÑ ËÁÔÁÌÏÇ¦× FTP"
+
+#. Local Directory Sort: SELECT
+#: src/LYOptions.c:3816
+msgid "Local directory sort criteria"
+msgstr "ëÒÉÔÅÒ¦Ê ÓÏÒÔÕ×ÁÎÎÑ ÌÏËÁÌØÎÉÈ ËÁÔÁÌÏǦ×"
+
+#. Local Directory Order: SELECT
+#: src/LYOptions.c:3822
+msgid "Local directory sort order"
+msgstr "ðÏÒÑÄÏË ÓÏÒÔÕ×ÁÎÎÑ ÌÏËÁÌØÎÉÈ ËÁÔÁÌÏǦ×"
+
+#: src/LYOptions.c:3831
+msgid "Show dot files"
+msgstr "ðÏËÁÚÕ×ÁÔÉ ÐÒÉÈÏ×ÁΦ ÆÁÊÌÉ"
+
+#: src/LYOptions.c:3839
+msgid "Execution links"
+msgstr "úÁÐÕÓËÁÎÎÑ ÐÒÏÇÒÁÍ ÚÁ ÐÏÓÉÌÁÎÎÑÍÉ"
+
+# ÐÅÒÅËÁÞÕ×ÁÎÎÑ - ÂÏ ÎÅ ÚÎÁÀ, ËÕÄÉ, Õ ÑËÉÊ Â¦Ë.
+# (×ÖÅ ËÒÁÝÅ "ÐÅÒÅÄÁ×ÁÎÎÑ", ÂÏ ÐÅÒÅÄÁÞÁ - ÎÅ ÚÏ×Ó¦Í ÐÒÏÃÅÓ, ÎÁÞÅ)
+#. Show transfer rate: SELECT
+#: src/LYOptions.c:3859
+msgid "Show transfer rate"
+msgstr "ðÅÒÅËÁÞÕ×ÁÎÎÑ ÄÁÎÉÈ ÚÁ×ÅÒÛÅÎÏ."
+
+#.
+#. * Special Files and Screens
+#.
+#: src/LYOptions.c:3879
+msgid "Special Files and Screens"
+msgstr "óÐÅæÁÌØΦ æÁÊÌÉ ÔÁ åËÒÁÎÉ"
+
+#: src/LYOptions.c:3884
+msgid "Multi-bookmarks"
+msgstr "þÉÓÅÌØΦ ÆÁÊÌÉ ÚÁËÌÁÄÉÎÏË"
+
+#: src/LYOptions.c:3892
+msgid "Review/edit Bookmarks files"
+msgstr "ðÒÏÄÉ×ÉÔÉÓÑ/òÅÄÁÇÕ×ÁÔÉ ÚÁËÌÁÄÉÎËÉ"
+
+#: src/LYOptions.c:3894
+msgid "Goto multi-bookmark menu"
+msgstr "ðÅÒÅÊÔÉ ÄÏ ÍÅÎÀ multi-bookmar"
+
+#: src/LYOptions.c:3896
+msgid "Bookmarks file"
+msgstr "æÁÊÌ ÚÁËÌÁÄÉÎÏË"
+
+#. Auto Session: ON/OFF
+#: src/LYOptions.c:3903
+msgid "Auto Session"
+msgstr ""
+
+#. Session File Menu: INPUT
+#: src/LYOptions.c:3909
+msgid "Session file"
+msgstr ""
+
+#. Visited Pages: SELECT
+#: src/LYOptions.c:3915
+msgid "Visited Pages"
+msgstr "ðÒÏÇÌÑÎÕÔ¦ ÓÔÏÒ¦ÎËÉ"
+
+#: src/LYOptions.c:3920
+msgid "View the file "
+msgstr "ðÅÒÅÇÌÑÎÕÔÉ ÆÁÊÌ "
+
+#: src/LYPrint.c:937
+#, c-format
+msgid " Print job complete.\n"
+msgstr " äÒÕË ÚÁ×ÅÒÛÅÎÏ.\n"
+
+#: src/LYPrint.c:1262
+msgid "Document:"
+msgstr "äÏËÕÍÅÎÔ:"
+
+#: src/LYPrint.c:1263
+msgid "Number of lines:"
+msgstr "ë¦ÌØ˦ÓÔØ ÒÑÄ˦×:"
+
+#: src/LYPrint.c:1264
+msgid "Number of pages:"
+msgstr "ë¦ÌØ˦ÓÔØ ÓÔÏÒ¦ÎÏË:"
+
+#: src/LYPrint.c:1265
+msgid "pages"
+msgstr "ÓÔÏÒ¦ÎÏË"
+
+#: src/LYPrint.c:1265
+msgid "page"
+msgstr "ÓÔÏÒ¦ÎËÁ"
+
+#: src/LYPrint.c:1266
+msgid "(approximately)"
+msgstr "(ÐÒÉÂÌÉÚÎÏ)"
+
+#: src/LYPrint.c:1273
+msgid "Some print functions have been disabled!"
+msgstr "äÅÑ˦ ÆÕÎËæ§ ÄÒÕËÕ ÂÕÌÏ ÚÁÂÏÒÏÎÅÎÏ!"
+
+#: src/LYPrint.c:1277
+msgid "Standard print options:"
+msgstr "óÔÁÎÄÁÒÔΦ ÐÁÒÁÍÅÔÒÉ ÄÒÕËÕ:"
+
+#: src/LYPrint.c:1278
+msgid "Print options:"
+msgstr "ðÁÒÁÍÅÔÒÉ ÄÒÕËÕ:"
+
+#: src/LYPrint.c:1285
+msgid "Save to a local file"
+msgstr "úÁÐÉÓÁÔÉ × ÌÏËÁÌØÎÉÈ ÆÁÊÌ"
+
+#: src/LYPrint.c:1287
+msgid "Save to disk disabled"
+msgstr "úÁÐÉÓÕ×ÁÔÉ ÎÁ ÄÉÓË ÚÁÂÏÒÏÎÅÎÏ"
+
+#: src/LYPrint.c:1294
+msgid "Mail the file"
+msgstr "ðÅÒÅÓÌÁÔÉ ÆÁÊÌ ÐÏÛÔÏÀ"
+
+#: src/LYPrint.c:1301
+msgid "Print to the screen"
+msgstr "òÏÚÄÒÕËÕ×ÁÔÉ ÎÁ ÅËÒÁΦ"
+
+#: src/LYPrint.c:1306
+msgid "Print out on a printer attached to your vt100 terminal"
+msgstr "òÏÚÄÒÕËÕ×ÁÔÉ ÎÁ ÐÒÉÎÔÅÒ¦, ЦÄ'¤ÄÎÁÎÏÍÕ ÄÏ ×ÁÛÏÇÏ vt100-ÔÅÒͦÎÁÌÕ"
+
+#: src/LYReadCFG.c:371
+#, c-format
+msgid ""
+"Syntax Error parsing COLOR in configuration file:\n"
+"The line must be of the form:\n"
+"COLOR:INTEGER:FOREGROUND:BACKGROUND\n"
+"\n"
+"Here FOREGROUND and BACKGROUND must be one of:\n"
+"The special strings 'nocolor' or 'default', or\n"
+msgstr ""
+
+#: src/LYReadCFG.c:384
+msgid "Offending line:"
+msgstr ""
+
+#: src/LYReadCFG.c:681
+#, c-format
+msgid "key remapping of %s to %s for %s failed\n"
+msgstr ""
+
+#: src/LYReadCFG.c:688
+#, c-format
+msgid "key remapping of %s to %s failed\n"
+msgstr ""
+
+#: src/LYReadCFG.c:709
+#, c-format
+msgid "invalid line-editor selection %s for key %s, selecting all\n"
+msgstr ""
+
+#: src/LYReadCFG.c:734 src/LYReadCFG.c:746
+#, c-format
+msgid "setting of line-editor binding for key %s (0x%x) to 0x%x for %s failed\n"
+msgstr ""
+
+#: src/LYReadCFG.c:750
+#, c-format
+msgid "setting of line-editor binding for key %s (0x%x) for %s failed\n"
+msgstr ""
+
+#: src/LYReadCFG.c:846
+#, c-format
+msgid "Lynx: cannot start, CERN rules file %s is not available\n"
+msgstr ""
+
+#: src/LYReadCFG.c:847
+msgid "(no name)"
+msgstr "(ÎÅÍÁ ¦ÍÅΦ)"
+
+#: src/LYReadCFG.c:1881
+#, c-format
+msgid "More than %d nested lynx.cfg includes -- perhaps there is a loop?!?\n"
+msgstr ""
+
+#: src/LYReadCFG.c:1883
+#, c-format
+msgid "Last attempted include was '%s',\n"
+msgstr ""
+
+#: src/LYReadCFG.c:1884
+#, c-format
+msgid "included from '%s'.\n"
+msgstr "×ËÌÀÞÅÎÏÍÕ Ú '%s'.\n"
+
+#: src/LYReadCFG.c:2292 src/LYReadCFG.c:2305 src/LYReadCFG.c:2363
+msgid "The following is read from your lynx.cfg file."
+msgstr "ïÓØ ÔÁËÅ ÂÕÌÏ ÚÎÁÊÄÅÎÏ Õ ×ÁÛÏÍÕ ÆÁÊ̦ lynx.cfg."
+
+#: src/LYReadCFG.c:2293 src/LYReadCFG.c:2306
+msgid "Please read the distribution"
+msgstr "ú×ÅÒΦÔØÓÑ ÄÏ ÄÉÓÔÒÉÂÕÔÉ×Á"
+
+#: src/LYReadCFG.c:2299 src/LYReadCFG.c:2309
+msgid "for more comments."
+msgstr "ÐÏ ÄÏÄÁÔËÏ×Õ ¦ÎÆÏÒÍÁæÀ."
+
+#: src/LYReadCFG.c:2345
+msgid "RELOAD THE CHANGES"
+msgstr "ðåòåþéôáôé"
+
+#: src/LYReadCFG.c:2353
+msgid "Your primary configuration"
+msgstr "÷ÁÛÁ ÏÓÎÏ×ÎÁ ËÏÎƦÇÕÒÁæÑ"
+
+#: src/LYShowInfo.c:173
+msgid "Directory that you are currently viewing"
+msgstr "ëÁÔÁÌÏÇ, ÑËÉÊ ×É ÚÁÒÁÚ ÐÅÒÅÇÌÑÄÁ¤ÔÅ"
+
+# @ Dia GIMP Gabber Galeon- Ximian-setup-tools balsa control-center evolution gimp gimp-std-plugins- glade- gnome-core gnome-libs gnome-pim gnomeicu gphoto graphite guppi kandy kandy.po kateprojectmanager.po kcmemail kcmkio kde-i18n_4:2.2.2-2_kdeprintfax.po kdelibs kmail kmenuedit knode koffice korganizer ksysguard kword lynx pybliographer red-carpet rpmdrake screem userdrake xchat
+# * Yuriy Syrota <yuri@renome.rovno.ua>
+#: src/LYShowInfo.c:176
+msgid "Name:"
+msgstr "îÁÚ×Á:"
+
+#: src/LYShowInfo.c:179
+msgid "URL:"
+msgstr "URL:"
+
+#: src/LYShowInfo.c:193
+msgid "Directory that you have currently selected"
+msgstr "ëÁÔÁÌÏÇ, ÑËÉÊ ÚÁÒÁÚ ×ÉĦÌÅÎÏ"
+
+#: src/LYShowInfo.c:195
+msgid "File that you have currently selected"
+msgstr "æÁÊÌ, ÑËÉÊ ÚÁÒÁÚ ×ÉĦÌÅÎÏ"
+
+#: src/LYShowInfo.c:198
+msgid "Symbolic link that you have currently selected"
+msgstr ""
+
+#: src/LYShowInfo.c:201
+msgid "Item that you have currently selected"
+msgstr ""
+
+# 8-| ÎÅ ÚÎÁÀ...
+# msgstr " ðÏ×ÎÁ ÎÁÚ×Á:"
+#: src/LYShowInfo.c:203
+msgid "Full name:"
+msgstr "ðÏ×ÎÅ ¦Í'Ñ:"
+
+#: src/LYShowInfo.c:213
+msgid "Unable to follow link"
+msgstr ""
+
+#: src/LYShowInfo.c:215
+msgid "Points to file:"
+msgstr ""
+
+#: src/LYShowInfo.c:220
+msgid "Name of owner:"
+msgstr " ÷ÌÁÓÎÉË:"
+
+# @ evolution kuser lynx
+# * Andriy Rysin <arysin@yahoo.com>
+#: src/LYShowInfo.c:223
+msgid "Group name:"
+msgstr "îÁÚ×Á ÇÒÕÐÉ:"
+
+#: src/LYShowInfo.c:225
+msgid "File size:"
+msgstr "òÏÚÍ¦Ò ÆÁÊÌÕ:"
+
+# @ Gnome-find KDat karchiver karchiver.po kwuftpd lynx red-carpet
+# * Yuri Syrota <rasta@renome.rovno.ua>
+#: src/LYShowInfo.c:227
+#, fuzzy
+msgid "(bytes)"
+msgstr "ÂÁÊÔÉ"
+
+#.
+#. * Include date and time information.
+#.
+#: src/LYShowInfo.c:232
+msgid "Creation date:"
+msgstr " óÔ×ÏÒÅÎÏ:"
+
+# @ KDat lynx
+# * Andriy Rysin <arysin@yahoo.com>
+#: src/LYShowInfo.c:235
+msgid "Last modified:"
+msgstr "ïÓÔÁÎÎÑ ÍÏÄÉƦËÁæÑ:"
+
+# @ KDat lynx
+# * Andriy Rysin <arysin@yahoo.com>
+#: src/LYShowInfo.c:238
+msgid "Last accessed:"
+msgstr "ïÓÔÁÎΤ Ú×ÅÒÎÅÎÎÑ:"
+
+#: src/LYShowInfo.c:244
+msgid "Access Permissions"
+msgstr "ðÒÁ×Á ÄÏÓÔÕÐÕ"
+
+#: src/LYShowInfo.c:279
+#, fuzzy
+msgid "Group:"
+msgstr "çÒÕÐÁ"
+
+#: src/LYShowInfo.c:299
+msgid "World:"
+msgstr ""
+
+#: src/LYShowInfo.c:306
+msgid "File that you are currently viewing"
+msgstr "æÁÊÌ, ÑËÉÊ ×É ÚÁÒÁÚ ÐÅÒÅÇÌÑÄÁ¤ÔÅ"
+
+#: src/LYShowInfo.c:314 src/LYShowInfo.c:418
+msgid "Linkname:"
+msgstr ""
+
+#: src/LYShowInfo.c:320 src/LYShowInfo.c:335
+msgid "Charset:"
+msgstr "îÁÂ¦Ò ÓÉÍ×Ï̦×:"
+
+#: src/LYShowInfo.c:334
+msgid "(assumed)"
+msgstr ""
+
+#: src/LYShowInfo.c:341
+msgid "Server:"
+msgstr "óÅÒ×ÅÒ:"
+
+#: src/LYShowInfo.c:344
+msgid "Date:"
+msgstr "äÁÔÁ:"
+
+#: src/LYShowInfo.c:347
+msgid "Last Mod:"
+msgstr ""
+
+#: src/LYShowInfo.c:352
+msgid "Expires:"
+msgstr ""
+
+#: src/LYShowInfo.c:355
+msgid "Cache-Control:"
+msgstr ""
+
+#: src/LYShowInfo.c:358
+msgid "Content-Length:"
+msgstr "äÏ×ÖÉÎÁ ×ͦÓÔÕ:"
+
+#: src/LYShowInfo.c:362
+#, fuzzy
+msgid "Length:"
+msgstr "äÏ×ÖÉÎÁ ×ͦÓÔÕ:"
+
+#: src/LYShowInfo.c:367
+msgid "Language:"
+msgstr "íÏ×Á:"
+
+#: src/LYShowInfo.c:374
+msgid "Post Data:"
+msgstr ""
+
+#: src/LYShowInfo.c:377
+msgid "Post Content Type:"
+msgstr ""
+
+#: src/LYShowInfo.c:380
+msgid "Owner(s):"
+msgstr "÷ÌÁÓÎÉË(É):"
+
+#: src/LYShowInfo.c:385
+msgid "size:"
+msgstr "ÒÏÚͦÒ:"
+
+# @ Galeon- lynx xfce
+# * Andriy Rysin <arysin@yahoo.com>
+#: src/LYShowInfo.c:387
+msgid "lines"
+msgstr "ÒÑÄËÉ"
+
+#: src/LYShowInfo.c:391
+msgid "forms mode"
+msgstr ""
+
+#: src/LYShowInfo.c:393
+msgid "source"
+msgstr "ÄÖÅÒÅÌÏ"
+
+#: src/LYShowInfo.c:394
+msgid "normal"
+msgstr "Ú×ÉÞÁÊÎÉÊ"
+
+#: src/LYShowInfo.c:396
+msgid ", safe"
+msgstr ""
+
+#: src/LYShowInfo.c:398
+msgid ", via internal link"
+msgstr ""
+
+#: src/LYShowInfo.c:403
+msgid ", no-cache"
+msgstr ""
+
+#: src/LYShowInfo.c:405
+msgid ", ISMAP script"
+msgstr ""
+
+#: src/LYShowInfo.c:407
+msgid ", bookmark file"
+msgstr ", ÆÁÊÌ ÚÁËÌÁÄÉÎÏË"
+
+#: src/LYShowInfo.c:411
+msgid "mode:"
+msgstr "ÒÅÖÉÍ:"
+
+#: src/LYShowInfo.c:417
+msgid "Link that you currently have selected"
+msgstr "ðÏÓÉÌÁÎÎÑ, ÑËÉÊ ÚÁÒÁÚ ×ÉĦÌÅÎÏ"
+
+#: src/LYShowInfo.c:426
+msgid "Method:"
+msgstr "íÅÔÏÄ:"
+
+#: src/LYShowInfo.c:430
+msgid "Enctype:"
+msgstr ""
+
+#: src/LYShowInfo.c:436
+#, fuzzy
+msgid "Action:"
+msgstr "òÏÚͦÝÅÎÎÑ: "
+
+#: src/LYShowInfo.c:441
+msgid "(Form field)"
+msgstr "(ðÏÌÅ ÆÏÒÍÉ)"
+
+#: src/LYShowInfo.c:450
+msgid "No Links on the current page"
+msgstr "îÁ Ã¦Ê ÓÔÏÒ¦Îæ ÎÅÍÁ¤ ÐÏÓÉÌÁÎØ"
+
+#: src/LYShowInfo.c:455
+#, fuzzy
+msgid "Server Headers:"
+msgstr "óÅÒ×ÅÒ:"
+
+#: src/LYStyle.c:312
+#, c-format
+msgid ""
+"Syntax Error parsing style in lss file:\n"
+"[%s]\n"
+"The line must be of the form:\n"
+"OBJECT:MONO:COLOR (ie em:bold:brightblue:white)\n"
+"where OBJECT is one of EM,STRONG,B,I,U,BLINK etc.\n"
+"\n"
+msgstr ""
+
+#: src/LYTraversal.c:108
+msgid "here is a list of the history stack so that you may rebuild"
+msgstr ""
+
+#: src/LYUpload.c:75
+msgid "ERROR! - upload command is misconfigured"
+msgstr ""
+
+#: src/LYUpload.c:96
+msgid "Illegal redirection \"../\" found! Request ignored."
+msgstr ""
+
+#: src/LYUpload.c:99
+msgid "Illegal character \"/\" found! Request ignored."
+msgstr ""
+
+#: src/LYUpload.c:102
+msgid "Illegal redirection using \"~\" found! Request ignored."
+msgstr ""
+
+#: src/LYUpload.c:159
+msgid "Unable to upload file."
+msgstr "îÅÍÏÖÌÉ×Ï ÐÅÒÅÄÁÔÉ ÆÁÊÌ."
+
+#: src/LYUpload.c:201
+msgid "Upload To:"
+msgstr "÷¦Ä×ÁÎÔÁÖÉÔÉ ÄÏ:"
+
+#: src/LYUpload.c:202
+msgid "Upload options:"
+msgstr "ðÁÒÁÍÅÔÒÉ ×¦Ä×ÁÎÔÁÖÅÎÎÑ:"
+
+#: src/LYUtils.c:1830
+msgid "Download document URL put to clipboard."
+msgstr ""
+
+#: src/LYUtils.c:2615
+msgid "Unexpected access protocol for this URL scheme."
+msgstr ""
+
+#: src/LYUtils.c:3419
+msgid "Too many tempfiles"
+msgstr ""
+
+#: src/LYUtils.c:3719
+msgid "unknown restriction"
+msgstr "ÎÅצÄÏÍÅ ÏÂÍÅÖÅÎÎÑ"
+
+#: src/LYUtils.c:3750
+#, c-format
+msgid "No restrictions set.\n"
+msgstr "ïÂÍÅÖÅÎÎÑ ×¦ÄÓÕÔΦ.\n"
+
+#: src/LYUtils.c:3753
+#, c-format
+msgid "Restrictions set:\n"
+msgstr "îÁÂ¦Ò ÏÂÍÅÖÅÎØ:\n"
+
+#: src/LYUtils.c:5131
+msgid "Cannot find HOME directory"
+msgstr "îÅ ÍÏÖÕ ÚÎÁÊÔÉ ÄÏÍÁÛÎ¦Ê ËÁÔÁÌÏÇ"
+
+#: src/LYrcFile.c:16
+msgid "Normally disabled. See ENABLE_LYNXRC in lynx.cfg\n"
+msgstr ""
+
+#: src/LYrcFile.c:317
+msgid ""
+"accept_all_cookies allows the user to tell Lynx to automatically\n"
+"accept all cookies if desired. The default is \"FALSE\" which will\n"
+"prompt for each cookie. Set accept_all_cookies to \"TRUE\" to accept\n"
+"all cookies.\n"
+msgstr ""
+
+#: src/LYrcFile.c:325
+msgid ""
+"anonftp_password allows the user to tell Lynx to use the personal\n"
+"email address as the password for anonymous ftp. If no value is given,\n"
+"Lynx will use the personal email address. Set anonftp_password\n"
+"to a different value if you choose.\n"
+msgstr ""
+
+#: src/LYrcFile.c:332
+msgid ""
+"bookmark_file specifies the name and location of the default bookmark\n"
+"file into which the user can paste links for easy access at a later\n"
+"date.\n"
+msgstr ""
+"bookmark_file ×ÉÚÎÁÞÁ¤ ¦Í'Ñ ÔÁ ÒÏÚÔÁÛÕ×ÁÎÎÑ ÐÏÞÁÔËÏ×ÏÇÏ ÆÁÊÌÕ ÚÁËÌÁÄÉÎÏË,\n"
+"ÄÏ ÑËÏÇÏ ËÏÒÉÓÔÕ×ÁÞ ÍÏÖÅ ÄÏÄÁ×ÁÔÉ ÐÏÓÉÌÁÎÎÑ ÄÌÑ Û×ÉÄËÏÇÏ ×¦ÄÎÁÊÄÅÎÎÑ\n"
+"ЦÚΦÛÅ.\n"
+
+#: src/LYrcFile.c:337
+msgid ""
+"If case_sensitive_searching is \"on\" then when the user invokes a search\n"
+"using the 's' or '/' keys, the search performed will be case sensitive\n"
+"instead of case INsensitive. The default is usually \"off\".\n"
+msgstr ""
+
+#: src/LYrcFile.c:342
+msgid ""
+"The character_set definition controls the representation of 8 bit\n"
+"characters for your terminal. If 8 bit characters do not show up\n"
+"correctly on your screen you may try changing to a different 8 bit\n"
+"set or using the 7 bit character approximations.\n"
+"Current valid characters sets are:\n"
+msgstr ""
+
+#: src/LYrcFile.c:349
+msgid ""
+"cookie_accept_domains and cookie_reject_domains are comma-delimited\n"
+"lists of domains from which Lynx should automatically accept or reject\n"
+"all cookies. If a domain is specified in both options, rejection will\n"
+"take precedence. The accept_all_cookies parameter will override any\n"
+"settings made here.\n"
+msgstr ""
+
+#: src/LYrcFile.c:357
+msgid ""
+"cookie_file specifies the file from which to read persistent cookies.\n"
+"The default is ~/"
+msgstr ""
+
+#: src/LYrcFile.c:362
+msgid ""
+"cookie_loose_invalid_domains, cookie_strict_invalid_domains, and\n"
+"cookie_query_invalid_domains are comma-delimited lists of which domains\n"
+"should be subjected to varying degrees of validity checking. If a\n"
+"domain is set to strict checking, strict conformance to RFC2109 will\n"
+"be applied. A domain with loose checking will be allowed to set cookies\n"
+"with an invalid path or domain attribute. All domains will default to\n"
+"querying the user for an invalid path or domain.\n"
+msgstr ""
+
+#: src/LYrcFile.c:376
+msgid ""
+"dir_list_order specifies the directory list order under DIRED_SUPPORT\n"
+"(if implemented). The default is \"ORDER_BY_NAME\"\n"
+msgstr ""
+
+#: src/LYrcFile.c:381
+msgid ""
+"dir_list_styles specifies the directory list style under DIRED_SUPPORT\n"
+"(if implemented). The default is \"MIXED_STYLE\", which sorts both\n"
+"files and directories together. \"FILES_FIRST\" lists files first and\n"
+"\"DIRECTORIES_FIRST\" lists directories first.\n"
+msgstr ""
+
+#: src/LYrcFile.c:389
+msgid ""
+"If emacs_keys is to \"on\" then the normal EMACS movement keys:\n"
+" ^N = down ^P = up\n"
+" ^B = left ^F = right\n"
+"will be enabled.\n"
+msgstr ""
+
+#: src/LYrcFile.c:395
+msgid ""
+"file_editor specifies the editor to be invoked when editing local files\n"
+"or sending mail. If no editor is specified, then file editing is disabled\n"
+"unless it is activated from the command line, and the built-in line editor\n"
+"will be used for sending mail.\n"
+msgstr ""
+"file_editor ×ÉÚÎÁÞÁ¤ ÒÅÄÁËÔÏÒÁ ÄÌÑ ÒÅÄÁÇÕ×ÁÎÎÑ ÌÏËÁÌØÎÉÈ ÆÁÊÌ¦× ÞÉ ÐÏÛÔÏ×ÉÈ\n"
+"ÐÏצÄÏÍÌÅÎØ. ñËÝÏ ÒÅÄÁËÔÏÒÁ ÎÅ ×ÉÚÎÁÞÅÎÏ, ÒÅÄÁÇÕ×ÁÎÎÑ ÚÁÂÏÒÏÎÅÎÅ, ȦÂÁ ÝÏ\n"
+"ÞÅÒÅÚ ×ÉËÌÉË ÒÅÄÁËÔÏÒÁ Ú ËÏÍÁÎÄÎÏÇÏ ÒÑÄËÁ; ¦ ÄÌÑ ÎÁÐÉÓÁÎÎÑ ÌÉÓÔ¦× ÂÕÄÅÍÏ\n"
+"×ÉËÏÒÉÓÔÏ×Õ×ÁÔÉ ×ÍÏÎÔÏ×ÁÎÏÇÏ ÏÄÎÏÒÑÄËÏ×ÏÇÏ ÒÅÄÁËÔÏÒÁ.\n"
+
+#: src/LYrcFile.c:402
+msgid ""
+"The file_sorting_method specifies which value to sort on when viewing\n"
+"file lists such as FTP directories. The options are:\n"
+" BY_FILENAME -- sorts on the name of the file\n"
+" BY_TYPE -- sorts on the type of the file\n"
+" BY_SIZE -- sorts on the size of the file\n"
+" BY_DATE -- sorts on the date of the file\n"
+msgstr ""
+"file_sorting_method ×ÉÚÎÁÞÁ¤, ÑË ÐÒÉ ÐÅÒÅÇÌÑĦ ÓÏÒÔÕ×ÁÔÉ ÓÐÉÓËÉ ÆÁÊ̦×,\n"
+"ÎÁÐÒÉËÌÁÄ, ËÁÔÁÌÏÇÉ FTP. íÏÖÌÉצ ×ÁÒ¦ÁÎÔÉ:\n"
+" BY_FILENAME -- ÓÏÒÔÕ×ÁÔÉ ÚÁ ¦ÍÅÎÅÍ ÆÁÊÌÕ\n"
+" BY_TYPE -- ÓÏÒÔÕ×ÁÔÉ ÚÁ ÔÉÐÏÍ ÆÁÊÌÕ\n"
+" BY_SIZE -- ÓÏÒÔÕ×ÁÔÉ ÚÁ ÒÏÚͦÒÏÍ ÆÁÊÌÕ\n"
+" BY_DATE -- ÓÏÒÔÕ×ÁÔÉ ÚÁ ÄÁÔÏÀ ÆÁÊÌÕ\n"
+
+#: src/LYrcFile.c:424
+msgid ""
+"lineedit_mode specifies the key binding used for inputting strings in\n"
+"prompts and forms. If lineedit_mode is set to \"Default Binding\" then\n"
+"the following control characters are used for moving and deleting:\n"
+"\n"
+" Prev Next Enter = Accept input\n"
+" Move char: <- -> ^G = Cancel input\n"
+" Move word: ^P ^N ^U = Erase line\n"
+" Delete char: ^H ^R ^A = Beginning of line\n"
+" Delete word: ^B ^F ^E = End of line\n"
+"\n"
+"Current lineedit modes are:\n"
+msgstr ""
+
+#: src/LYrcFile.c:442
+msgid ""
+"The following allow you to define sub-bookmark files and descriptions.\n"
+"The format is multi_bookmark<capital_letter>=<filename>,<description>\n"
+"Up to 26 bookmark files (for the English capital letters) are allowed.\n"
+"We start with \"multi_bookmarkB\" since 'A' is the default (see above).\n"
+msgstr ""
+"㦠ËÏÍÁÎÄÉ ÄÁÀÔØ ÚÍÏÇÕ ×ÉÚÎÁÞÉÔÉ sub-bookmark ÆÁÊÌÉ ÔÁ §ÈΦ ÏÐÉÓÉ.\n"
+"æÏÒÍÁÔ ÔÁËÉÊ: multi_bookmark<×ÅÌÉËÁ_̦ÔÅÒÁ>=<ÆÁÊÌ>,<ÏÐÉÓ>\n"
+"íÏÖÌÉ×Ï ×ÉÚÎÁÞÉÔÉ ÄÏ 26 ÆÁÊÌ¦× ÚÁËÌÁÄÉÎÏË (ÄÌÑ ÁÎÇ̦ÊÓØËÉÈ ×ÅÌÉËÉÈ Ì¦ÔÅÒ).\n"
+"íÉ ÐÏÞÉÎÁ¤ÍÏ Ú \"multi_bookmarkB\", ÂÏ 'A' ¤ ÓÔÁÒÔÏ×ÉÍ (ÄÉ×. ×ÉÝÅ).\n"
+
+#: src/LYrcFile.c:448
+msgid ""
+"personal_mail_address specifies your personal mail address. The\n"
+"address will be sent during HTTP file transfers for authorization and\n"
+"logging purposes, and for mailed comments.\n"
+"If you do not want this information given out, set the NO_FROM_HEADER\n"
+"to TRUE in lynx.cfg, or use the -nofrom command line switch. You also\n"
+"could leave this field blank, but then you won't have it included in\n"
+"your mailed comments.\n"
+msgstr ""
+"personal_mail_address ×ÉÚÎÁÞÁ¤ ×ÁÛÕ ×ÌÁÓÎÕ ÐÏÛÔÏ×Õ ÁÄÒÅÓÕ. áÄÒÅÓÁ ÂÕÄÅ\n"
+"ÎÁÄÓÉÌÁÔÉÓÑ Ð¦Ä ÞÁÓ ÐÅÒÅÄÁÞ¦ ÆÁÊÌ¦× ÐÏ HTTP ÄÌÑ Á×ÔÏÒÉÚÁæ§ ÔÁ ×ÈÏÄÕ\n"
+"× ÓÉÓÔÅÍÕ, ÔÁ ÄÌÑ ÎÁÄÓÉÌÁÎÎÑ ËÏÍÅÎÔÁÒ¦×.\n"
+"ñËÝÏ Ö ×É ÎÅ ÂÁÖÁ¤ÔÅ ÎÁÄÁ×ÁÔÉ ÃÀ ¦ÎÆÏÒÍÁæÀ, ×ÓÔÁÎÏצÔØ Õ ÆÁÊ̦ lynx.cfg\n"
+"\"NO_FROM_HEADER:TRUE\", ÞÉ ÚÁÐÕÓËÁÊÔÅ lynx Ú ËÌÀÞÅÍ -nofrom. ÷É ÔÁËÏÖ\n"
+"ÍÏÖÅÔÅ ÚÁÌÉÛÉÔÉ ÃÅ ÐÏÌÅ ÐÏÒÏÖΦÍ, ÁÌÅ ÔÏĦ ×ÏÎÏ ÎÅ ×ËÌÀÞÁÔÉÍÅÔØÓÑ Õ ×ÁÛ¦\n"
+"ËÏÍÅÎÔÁÒ¦ ÐÒÉ ÌÉÓÔÕ×ÁÎΦ.\n"
+
+#: src/LYrcFile.c:457
+msgid ""
+"preferred_charset specifies the character set in MIME notation (e.g.,\n"
+"ISO-8859-2, ISO-8859-5) which Lynx will indicate you prefer in requests\n"
+"to http servers using an Accept-Charset header. The value should NOT\n"
+"include ISO-8859-1 or US-ASCII, since those values are always assumed\n"
+"by default. May be a comma-separated list.\n"
+"If a file in that character set is available, the server will send it.\n"
+"If no Accept-Charset header is present, the default is that any\n"
+"character set is acceptable. If an Accept-Charset header is present,\n"
+"and if the server cannot send a response which is acceptable\n"
+"according to the Accept-Charset header, then the server SHOULD send\n"
+"an error response, though the sending of an unacceptable response\n"
+"is also allowed.\n"
+msgstr ""
+
+#: src/LYrcFile.c:473
+msgid ""
+"preferred_language specifies the language in MIME notation (e.g., en,\n"
+"fr, may be a comma-separated list in decreasing preference)\n"
+"which Lynx will indicate you prefer in requests to http servers.\n"
+"If a file in that language is available, the server will send it.\n"
+"Otherwise, the server will send the file in its default language.\n"
+msgstr ""
+
+#: src/LYrcFile.c:484
+msgid ""
+"If run_all_execution_links is set \"on\" then all local execution links\n"
+"will be executed when they are selected.\n"
+"\n"
+"WARNING - This is potentially VERY dangerous. Since you may view\n"
+" information that is written by unknown and untrusted sources\n"
+" there exists the possibility that Trojan horse links could be\n"
+" written. Trojan horse links could be written to erase files\n"
+" or compromise security. This should only be set to \"on\" if\n"
+" you are viewing trusted source information.\n"
+msgstr ""
+
+#: src/LYrcFile.c:495
+msgid ""
+"If run_execution_links_on_local_files is set \"on\" then all local\n"
+"execution links that are found in LOCAL files will be executed when they\n"
+"are selected. This is different from run_all_execution_links in that\n"
+"only files that reside on the local system will have execution link\n"
+"permissions.\n"
+"\n"
+"WARNING - This is potentially dangerous. Since you may view\n"
+" information that is written by unknown and untrusted sources\n"
+" there exists the possibility that Trojan horse links could be\n"
+" written. Trojan horse links could be written to erase files\n"
+" or compromise security. This should only be set to \"on\" if\n"
+" you are viewing trusted source information.\n"
+msgstr ""
+
+#: src/LYrcFile.c:513
+msgid ""
+"select_popups specifies whether the OPTIONs in a SELECT block which\n"
+"lacks a MULTIPLE attribute are presented as a vertical list of radio\n"
+"buttons or via a popup menu. Note that if the MULTIPLE attribute is\n"
+"present in the SELECT start tag, Lynx always will create a vertical list\n"
+"of checkboxes for the OPTIONs. A value of \"on\" will set popup menus\n"
+"as the default while a value of \"off\" will set use of radio boxes.\n"
+"The default can be overridden via the -popup command line toggle.\n"
+msgstr ""
+
+#: src/LYrcFile.c:523
+msgid ""
+"show_color specifies how to set the color mode at startup. A value of\n"
+"\"never\" will force color mode off (treat the terminal as monochrome)\n"
+"at startup even if the terminal appears to be color capable. A value of\n"
+"\"always\" will force color mode on even if the terminal appears to be\n"
+"monochrome, if this is supported by the library used to build lynx.\n"
+"A value of \"default\" will yield the behavior of assuming\n"
+"a monochrome terminal unless color capability is inferred at startup\n"
+"based on the terminal type, or the -color command line switch is used, or\n"
+"the COLORTERM environment variable is set. The default behavior always is\n"
+"used in anonymous accounts or if the \"option_save\" restriction is set.\n"
+"The effect of the saved value can be overridden via\n"
+"the -color and -nocolor command line switches.\n"
+"The mode set at startup can be changed via the \"show color\" option in\n"
+"the 'o'ptions menu. If the option settings are saved, the \"on\" and\n"
+"\"off\" \"show color\" settings will be treated as \"default\".\n"
+msgstr ""
+
+#: src/LYrcFile.c:540
+msgid ""
+"show_cursor specifies whether to 'hide' the cursor to the right (and\n"
+"bottom, if possible) of the screen, or to place it to the left of the\n"
+"current link in documents, or current option in select popup windows.\n"
+"Positioning the cursor to the left of the current link or option is\n"
+"helpful for speech or braille interfaces, and when the terminal is\n"
+"one which does not distinguish the current link based on highlighting\n"
+"or color. A value of \"on\" will set positioning to the left as the\n"
+"default while a value of \"off\" will set 'hiding' of the cursor.\n"
+"The default can be overridden via the -show_cursor command line toggle.\n"
+msgstr ""
+
+#: src/LYrcFile.c:551
+msgid ""
+"show_dotfiles specifies that the directory listing should include\n"
+"\"hidden\" (dot) files/directories. If set \"on\", this will be\n"
+"honored only if enabled via userdefs.h and/or lynx.cfg, and not\n"
+"restricted via a command line switch. If display of hidden files\n"
+"is disabled, creation of such files via Lynx also is disabled.\n"
+msgstr ""
+
+#: src/LYrcFile.c:562
+msgid ""
+"If sub_bookmarks is not turned \"off\", and multiple bookmarks have\n"
+"been defined (see below), then all bookmark operations will first\n"
+"prompt the user to select an active sub-bookmark file. If the default\n"
+"Lynx bookmark_file is defined (see above), it will be used as the\n"
+"default selection. When this option is set to \"advanced\", and the\n"
+"user mode is advanced, the 'v'iew bookmark command will invoke a\n"
+"statusline prompt instead of the menu seen in novice and intermediate\n"
+"user modes. When this option is set to \"standard\", the menu will be\n"
+"presented regardless of user mode.\n"
+msgstr ""
+"ñËÝÏ sub_bookmarks ÎÅ ×ÉÍËÎÅÎÏ (\"off\"), ÔÁ multiple bookmarks ÂÕÌÏ\n"
+"×ÉÚÎÁÞÅÎÏ (ÄÉ×ÉÓØ ÎÉÖÞÅ), ÔÏĦ ×Ó¦ ÐÒÉ ÂÕÄØ-ÑË¦Ê Ä¦§ ¦Ú ÚÁËÌÁÄÉÎËÁÍÉ\n"
+"ËÏÒÉÓÔÕ×ÁÞÅצ ÂÕÄÅ ÚÁÐÒÏÐÏÎÏ×ÁÎÏ ×ÉÂÒÁÔÉ sub-bookmark ÆÁÊÌ. ñËÝÏ\n"
+"bookmark_file ×ÉÚÎÁÞÅÎÏ (ÄÉ×ÉÓØ ×ÉÝÅ), צΠÂÕÄÅ ÚÁÐÒÏÐÏÎÏ×ÁÎÉÍ ×ÉÂÏÒÏÍ.\n"
+"ëÏÌÉ ÃÀ ÏÐæÀ ×ÓÔÁÎÏ×ÌÅÎÏ Õ \"advanced\", ÔÁ ÒÅÖÉÍ ËÏÒÉÓÔÕ×ÁÎÎÑ ÔÁËÏÖ\n"
+"advanced, ÔÏĦ ËÏÍÁÎÄÁ ÐÅÒÅÇÌÑÄÕ ÚÁËÌÁÄÉÎÏË ('v'iew) ÎÁÄÁÓÔØ ÚÁÐÒÏÛÅÎÎÑ\n"
+"Õ ÒÑÄËÕ ÓÔÁÔÕÓÕ ÚÁͦÓÔØ ÍÅÎÀ, ÑË Õ ÒÅÖÉÍÁÈ \"ÎÏ×ÁÞÏË\" ÔÁ intermediate.\n"
+"ëÏÌÉ ÃÀ ÏÐæÀ ×ÓÔÁÎÏ×ÌÅÎÏ Õ \"standard\", ÂÕÄÅ ÎÁÄÁÎÏ ÍÅÎÀ, ÎÅÚÁÌÅÖÎÏ\n"
+"×¦Ä ÒÅÖÉÍÕ ËÏÒÉÓÔÕ×ÁÎÎÑ.\n"
+
+#: src/LYrcFile.c:576
+msgid ""
+"user_mode specifies the users level of knowledge with Lynx. The\n"
+"default is \"NOVICE\" which displays two extra lines of help at the\n"
+"bottom of the screen to aid the user in learning the basic Lynx\n"
+"commands. Set user_mode to \"INTERMEDIATE\" to turn off the extra info.\n"
+"Use \"ADVANCED\" to see the URL of the currently selected link at the\n"
+"bottom of the screen.\n"
+msgstr ""
+
+#: src/LYrcFile.c:585
+msgid ""
+"If verbose_images is \"on\", lynx will print the name of the image\n"
+"source file in place of [INLINE], [LINK] or [IMAGE]\n"
+"See also VERBOSE_IMAGES in lynx.cfg\n"
+msgstr ""
+
+#: src/LYrcFile.c:590
+msgid ""
+"If vi_keys is set to \"on\", then the normal VI movement keys:\n"
+" j = down k = up\n"
+" h = left l = right\n"
+"will be enabled. These keys are only lower case.\n"
+"Capital 'H', 'J' and 'K will still activate help, jump shortcuts,\n"
+"and the keymap display, respectively.\n"
+msgstr ""
+
+#: src/LYrcFile.c:598
+msgid ""
+"The visited_links setting controls how Lynx organizes the information\n"
+"in the Visited Links Page.\n"
+msgstr ""
+"õÓÔÁÎÏ×ËÁ visted_links ×ÉÚÎÁÞÁ¤, ÑË Lynx צÄÏÂÒÁÖÁ¤ ¦ÎÆÏÒÍÁæÀ\n"
+"ÎÁ óÔÏÒ¦Îæ ÷¦ÄצÄÁÎÉÈ ðÏÓÉÌÁÎØ.\n"
+
+#: src/LYrcFile.c:819
+msgid ""
+"If keypad_mode is set to \"NUMBERS_AS_ARROWS\", then the numbers on\n"
+"your keypad when the numlock is on will act as arrow keys:\n"
+" 8 = Up Arrow\n"
+" 4 = Left Arrow 6 = Right Arrow\n"
+" 2 = Down Arrow\n"
+"and the corresponding keyboard numbers will act as arrow keys,\n"
+"regardless of whether numlock is on.\n"
+msgstr ""
+
+#: src/LYrcFile.c:828
+msgid ""
+"If keypad_mode is set to \"LINKS_ARE_NUMBERED\", then numbers will\n"
+"appear next to each link and numbers are used to select links.\n"
+msgstr ""
+
+#: src/LYrcFile.c:832
+msgid ""
+"If keypad_mode is set to \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\", then\n"
+"numbers will appear next to each link and visible form input field.\n"
+"Numbers are used to select links, or to move the \"current link\" to a\n"
+"form input field or button. In addition, options in popup menus are\n"
+"indexed so that the user may type an option number to select an option in\n"
+"a popup menu, even if the option isn't visible on the screen. Reference\n"
+"lists and output from the list command also enumerate form inputs.\n"
+msgstr ""
+
+#: src/LYrcFile.c:841
+msgid ""
+"NOTE: Some fixed format documents may look disfigured when\n"
+"\"LINKS_ARE_NUMBERED\" or \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\" are\n"
+"enabled.\n"
+msgstr ""
+
+#: src/LYrcFile.c:873
+msgid ""
+"Lynx User Defaults File\n"
+"\n"
+msgstr ""
+
+#: src/LYrcFile.c:882
+msgid ""
+"This file contains options saved from the Lynx Options Screen (normally\n"
+"with the 'o' key). To save options with that screen, you must select the\n"
+"checkbox:\n"
+msgstr ""
+
+#: src/LYrcFile.c:889
+msgid ""
+"You must then save the settings using the link on the line above the\n"
+"checkbox:\n"
+msgstr ""
+
+#: src/LYrcFile.c:896
+msgid ""
+"You may also use the command-line option \"-forms_options\", which displays\n"
+"the simpler Options Menu instead. Save options with that using the '>' key.\n"
+"\n"
+msgstr ""
+
+#: src/LYrcFile.c:903
+msgid ""
+"This file contains options saved from the Lynx Options Screen (normally\n"
+"with the '>' key).\n"
+"\n"
+msgstr ""
+
+#: src/LYrcFile.c:910
+#, fuzzy
+msgid ""
+"There is normally no need to edit this file manually, since the defaults\n"
+"here can be controlled from the Options Screen, and the next time options\n"
+"are saved from the Options Screen this file will be completely rewritten.\n"
+"You have been warned...\n"
+"\n"
+"If you are looking for the general configuration file - it is normally\n"
+"called \"lynx.cfg\". It has different content and a different format.\n"
+"It is not this file.\n"
+msgstr ""
+"æÁÊÌ ðÏÞÁÔËÏ×ÉÈ îÁÌÁÛÔÕ×ÁÎØ ëÏÒÉÓÔÕ×ÁÞÁ Lynx\n"
+"\n"
+"ãÅÊ ÆÁÊÌ Í¦ÓÔÉÔØ ÎÁÌÁÛÔÕ×ÁÎÎÑ Ú åËÒÁÎÕ îÁÌÁÛÔÕ×ÁÎØ Lynx (ÚÁÚ×ÉÞÁÊ\n"
+"Ú ËÌÀÞÅÍ '>'). úÁÚ×ÉÞÁÊ ÎÅÍÁ ΦÑËϧ ÎÅÏÂȦÄÎÏÓÔ¦ ÒÅÄÁÇÕ×ÁÔÉ ÊÏÇÏ,\n"
+"ÏÓ˦ÌØËÉ ÓÔÁÒÔÏצ ÎÁÌÁÛÔÕ×ÁÎÎÑ ×ÓÔÁÎÏ×ÌÀÀÔØ ÞÅÒÅÚ åËÒÁÎ îÁÌÁÛÔÕ×ÁÎØ, ÏÔÖÅ,\n"
+"ËÏÌÉ ÎÁÓÔÕÐÎÏÇÏ ÒÁÚÕ ×É ÚÂÅÒÅÖÅÔÅ §È Ú åËÒÁÎÕ îÁÌÁÛÔÕ×ÁÎØ, ÃÅÊ ÆÁÊÌ\n"
+"ÂÕÄÅ ÐÅÒÅÚÁÐÉÓÁÎÏ. ÷ÁÓ ÐÏÐÅÒÅÄÉÌÉ, ÍÁÊÔÅ ÎÁ Õ×ÁÚ¦...\n"
+"ñËÝÏ Ö ×É ÎÁÓÐÒÁ×Ħ ÛÕËÁ¤ÔÅ ÆÁÊÌ ÚÁÇÁÌØÎÉÈ ÎÁÌÁÛÔÕ×ÁÎØ - ÔÏ ÃÅ, ÑË ÐÒÁ×ÉÌÏ,\n"
+"ÆÁÊÌ lynx.cfg, Ê ×¦Î ÍÁ¤ ¦ÎÛÉÊ ÚͦÓÔ ÔÁ ¦ÎÛÉÊ ÆÏÒÍÁÔ.\n"
+"ôÏÖ ÃÅ ÎÅ ÔÏÊ ÆÁÊÌ ;-)\n"
+
+# @ EasyTag cupsdconf.po kfind kfindpart kppp lynx
+# * Olexander Kunytsa, <kunia@istc.kiev.ua>
+#~ msgid "KB"
+#~ msgstr "ëÂ"
+
+#~ msgid "reason unknown."
+#~ msgstr "ÐÒÉÞÉÎÁ ÎÅצÄÏÍÁ."
+
+#~ msgid "Remove '%s' and all of its contents?"
+#~ msgstr "÷ÉÄÁÌÉÔÉ '%s' ÒÁÚÏÍ ¦Ú ÕÓ¦Í ×ͦÓÔÏÍ?"
+
+#~ msgid "Remove directory and all of its contents?"
+#~ msgstr "÷ÉÄÁÌÉÔÉ ËÁÔÁÌÏÇ ÒÁÚÏÍ ¦Ú ÕÓ¦Í ×ͦÓÔÏÍ?"
+
+#~ msgid "Unable to open file management menu file."
+#~ msgstr "îÅ ÍÏÖÕ ×¦ÄËÒÉÔÉ ÆÁÊÌ ÍÅÎÀ ËÅÒÕ×ÁÎÎÑ ÆÁÊÌÁÍÉ."
diff --git a/po/vi.po b/po/vi.po
new file mode 100644
index 0000000..9a316d1
--- /dev/null
+++ b/po/vi.po
@@ -0,0 +1,6403 @@
+# Vietnamese translation for Lynx.
+# Bản dịch tiếng Việt dành cho Lynx.
+# Copyright © 2015 Free Software Foundation, Inc.
+# This file is distributed under the same license as the lynx package.
+# Phan Vĩnh Thịnh <teppi@gmail.com>, 2005.
+# Clytie Siddall <clytie@riverland.net.au>, 2008, 2009.
+# Trần Ngá»c Quân <vnwildman@gmail.com>, 2012, 2015.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: lynx 2.9.0-dev3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2019-08-23 19:59-0400\n"
+"PO-Revision-Date: 2019-08-26 14:49+0700\n"
+"Last-Translator: Trần Ngá»c Quân <vnwildman@gmail.com>\n"
+"Language-Team: Vietnamese <translation-team-vi@lists.sourceforge.net>\n"
+"Language: vi\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 2.2.3\n"
+"X-Poedit-SourceCharset: UTF-8\n"
+
+#. ******************************************************************
+#. * The following definitions are for status line prompts, messages, or
+#. * warnings issued by Lynx during program execution. You can modify
+#. * them to make them more appropriate for your site. We recommend that
+#. * you extend these definitions to other languages using the gettext
+#. * library. There are also scattered uses of 'gettext()' throughout the
+#. * Lynx source, covering all but those messages which (a) are used for
+#. * debugging (CTRACE) or (b) are constants used in interaction with
+#. * other programs.
+#. *
+#. * See ABOUT-NLS and po/readme for details and location of contributed
+#. * translations. When no translation is available, the English default is
+#. * used.
+#.
+#: LYMessages.c:28
+#, c-format
+msgid "Alert!: %s"
+msgstr "Cảnh giác!: %s"
+
+#: LYMessages.c:29
+msgid "Welcome"
+msgstr "Chào mừng bạn"
+
+#: LYMessages.c:30
+msgid "Are you sure you want to quit?"
+msgstr "Bạn có chắc muốn thoát không?"
+
+#: LYMessages.c:32
+msgid "Really exit from Lynx?"
+msgstr "Thá»±c sá»± thoát khá»i Lynx không?"
+
+#: LYMessages.c:34
+msgid "Connection interrupted."
+msgstr "Kết nối bị ngắt."
+
+#: LYMessages.c:35
+msgid "Data transfer interrupted."
+msgstr "Tiến trình truyá»n dữ liệu bị gián Ä‘oạn."
+
+#: LYMessages.c:36
+msgid "Cancelled!!!"
+msgstr "Äã bị hủy!!!"
+
+#: LYMessages.c:37
+msgid "Cancelling!"
+msgstr "Äang hủy!"
+
+#: LYMessages.c:38
+msgid "Excellent!!!"
+msgstr "Tốt lắm!!!"
+
+#: LYMessages.c:39
+msgid "OK"
+msgstr "OK"
+
+#: LYMessages.c:40
+msgid "Done!"
+msgstr "Hoàn tất!"
+
+#: LYMessages.c:41
+msgid "Bad request!"
+msgstr "Yêu cầu sai!"
+
+#: LYMessages.c:42
+msgid "previous"
+msgstr "kế trước"
+
+#: LYMessages.c:43
+msgid "next screen"
+msgstr "màn hình tiếp"
+
+#: LYMessages.c:44
+msgid "HELP!"
+msgstr "HÃY GIÚP!"
+
+#: LYMessages.c:45
+msgid ", help on "
+msgstr ", trợ giúp vỠ"
+
+#. #define HELP
+#: LYMessages.c:47
+msgid "Commands: Use arrow keys to move, '?' for help, 'q' to quit, '<-' to go back."
+msgstr "Lệnh: [mũi tên] di chuyển; [?] trợ giúp; [q] thoát; [<-] lùi lại."
+
+#. #define MOREHELP
+#: LYMessages.c:49
+msgid "-- press space for more, use arrow keys to move, '?' for help, 'q' to quit."
+msgstr "— [phím dài] xem thêm; [mũi tên] di chuyển; [?] trợ giúp, [q] thoát."
+
+#: LYMessages.c:50
+msgid "-- press space for next page --"
+msgstr "— [phím dài] trang kế tiếp —"
+
+#: LYMessages.c:51
+msgid "URL too long"
+msgstr "URL quá dài"
+
+#. Inactive input fields, messages used with -tna option - kw
+#. #define FORM_LINK_TEXT_ADV_MSG_INA
+#: LYMessages.c:57
+#, c-format
+msgid "(Textfield \"%s\"); Inactive. Press <return> to activate."
+msgstr "(TrÆ°á»ng nhập văn bản \"%s\"); Không hoạt Ä‘á»™ng. Nhấn <enter> để kích hoạt."
+
+#. #define FORM_LINK_TEXT_MESSAGE_INA
+#: LYMessages.c:59
+msgid "(Text entry field) Inactive. Press <return> to activate."
+msgstr "(TrÆ°á»ng nhập văn bản) Không hoạt Ä‘á»™ng. Nhấn <enter> để kích hoạt."
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG_INA
+#: LYMessages.c:61
+#, c-format
+msgid "(Textarea \"%s\"); Inactive. Press <return> to activate."
+msgstr "(Vùng văn bản \"%s\"); Không hoạt động. Nhấn <enter> để kích hoạt."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_INA
+#: LYMessages.c:63
+msgid "(Textarea) Inactive. Press <return> to activate."
+msgstr "(Vùng văn bản) Không hoạt động. Nhấn <Enter> để kích hoạt."
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG_INA_E
+#: LYMessages.c:65
+#, c-format
+msgid "(Textarea \"%s\"); Inactive. Press <return> to activate (%s for editor)."
+msgstr "(Vùng văn bản \"%s\"); Không hoạt động. Nhấn <Enter> để kích hoạt (%s để mở trình soạn thảo)."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_INA_E
+#: LYMessages.c:67
+#, c-format
+msgid "(Textarea) Inactive. Press <return> to activate (%s for editor)."
+msgstr "(Vùng văn bản) Không hoạt động. Nhấn <Enter> để kích hoạt (%s để mở trình soạn thảo)."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE_INA
+#: LYMessages.c:69
+msgid "(Form field) Inactive. Use <return> to edit."
+msgstr "(TrÆ°á»ng biểu mẫu) Không hoạt Ä‘á»™ng. Nhấn <Enter> để soạn thảo."
+
+#. #define FORM_TEXT_SUBMIT_MESSAGE_INA_X
+#: LYMessages.c:71
+#, c-format
+msgid "(Form field) Inactive. Use <return> to edit (%s to submit with no cache)."
+msgstr "(TrÆ°á»ng biểu mẫu) Không hoạt Ä‘á»™ng. Nhấn <Enter> để soạn thảo (%s để gá»­i Ä‘i mà không nhá»› tạm)."
+
+#. #define FORM_TEXT_RESUBMIT_MESSAGE_INA
+#: LYMessages.c:73
+msgid "(Form field) Inactive. Press <return> to edit, press <return> twice to submit."
+msgstr "(TrÆ°á»ng biểu mẫu) Không hoạt Ä‘á»™ng. Hãy nhấn <Enter> để soạn thảo, nhấn <Enter> hai lần để gá»­i Ä‘i."
+
+#. #define FORM_TEXT_SUBMIT_MAILTO_MSG_INA
+#: LYMessages.c:75
+msgid "(mailto form field) Inactive. Press <return> to change."
+msgstr "(TrÆ°á»ng biểu mẫu gá»­i thÆ°) Không hoạt Ä‘á»™ng. Hãy nhấn <Enter> để thay đổi."
+
+#. #define FORM_LINK_PASSWORD_MESSAGE_INA
+#: LYMessages.c:77
+msgid "(Password entry field) Inactive. Press <return> to activate."
+msgstr "(TrÆ°á»ng nhập mật khẩu) Không hoạt Ä‘á»™ng. Hãy nhấn <Enter> để kích hoạt."
+
+#. #define FORM_LINK_FILE_UNM_MSG
+#: LYMessages.c:80
+msgid "UNMODIFIABLE file entry field. Use UP or DOWN arrows or tab to move off."
+msgstr "TrÆ°á»ng nhập tập tin KHÔNG THỂ SỬA Äá»”I. Dùng các phím mÅ©i tên LÊN hoặc XUá»NG hoặc tab để Ä‘i tiếp."
+
+#. #define FORM_LINK_FILE_MESSAGE
+#: LYMessages.c:82
+msgid "(File entry field) Enter filename. Use UP or DOWN arrows or tab to move off."
+msgstr "(TrÆ°á»ng nhập tập tin) Hãy nhập tên tập tin. Sá»­ dụng các phím mÅ©i tên LÊN hoặc XUá»NG hoặc tab để Ä‘i tiếp."
+
+#. #define FORM_LINK_TEXT_ADV_MSG
+#. #define FORM_LINK_TEXT_MESSAGE
+#: LYMessages.c:84 LYMessages.c:86
+#, c-format
+msgid "(Textfield \"%s\"); Enter text. Use UP or DOWN arrows or tab to move off."
+msgstr "(TrÆ°á»ng nhập văn bản \"%s\"); Hãy nhập. Dùng các mÅ©i tên LÊN hoặc XUá»NG hoặc tab để Ä‘i ra ngoài."
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG
+#: LYMessages.c:88
+#, c-format
+msgid "(Textarea \"%s\"); Enter text. Use UP/DOWN arrows or TAB to move off."
+msgstr "(Vùng văn bản \"%s\") Hãy nhập. Dùng mÅ©i tên LÊN/XUá»NG hoặc tab để Ä‘i tiếp."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE
+#: LYMessages.c:90
+msgid "(Textarea) Enter text. Use UP/DOWN arrows or TAB to move off."
+msgstr "(Vùng văn bản) Hãy nhập. Dùng mÅ©i tên LÊN/XUá»NG hoặc tab để Ä‘i tiếp."
+
+#. #define FORM_LINK_TEXTAREA_ADV_MSG_E
+#: LYMessages.c:92
+#, c-format
+msgid "(Textarea \"%s\"); Enter text. Use UP/DOWN arrows or TAB to move off (%s for editor)."
+msgstr "(Vùng văn bản \"%s\") Hãy nhập. Sá»­ dụng mÅ©i tên LÊN/XUá»NG hoặc tab để Ä‘i tiếp (%s để mở trình soạn thảo)."
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_E
+#: LYMessages.c:94
+#, c-format
+msgid "(Textarea) Enter text. Use UP/DOWN arrows or TAB to move off (%s for editor)."
+msgstr "(Vùng văn bản) Hãy nhập. Sá»­ dụng mÅ©i tên LÊN/XUá»NG hoặc tab để Ä‘i tiếp (%s để mở trình soạn thảo)."
+
+#. #define FORM_LINK_TEXT_UNM_MSG
+#: LYMessages.c:96
+msgid "UNMODIFIABLE form text field. Use UP or DOWN arrows or tab to move off."
+msgstr "TrÆ°á»ng văn bản biểu mẫu KHÔNG THỂ SỬA Äá»”I. Dùng mÅ©i tên LÊN/XUá»NG hoặc tab để Ä‘i tiếp."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE
+#: LYMessages.c:98
+msgid "(Form field) Enter text. Use <return> to submit."
+msgstr "(TrÆ°á»ng biểu mẫu) Hãy nhập. Dùng <Enter> để gá»­i Ä‘i."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE_X
+#: LYMessages.c:100
+#, c-format
+msgid "(Form field) Enter text. Use <return> to submit (%s for no cache)."
+msgstr "(TrÆ°á»ng biểu mẫu) Hãy nhập. Dùng <Enter> để gá»­i Ä‘i. (%s để không nhá»› tạm)."
+
+#. #define FORM_LINK_TEXT_RESUBMIT_MESSAGE
+#: LYMessages.c:102
+msgid "(Form field) Enter text. Use <return> to submit, arrows or tab to move off."
+msgstr "(TrÆ°á»ng biểu mẫu) Hãy nhập. Dùng <Enter> để gá»­i Ä‘i, phím mÅ©i tên hoặc tab để Ä‘i tiếp."
+
+#. #define FORM_LINK_TEXT_SUBMIT_UNM_MSG
+#: LYMessages.c:104
+msgid "UNMODIFIABLE form field. Use UP or DOWN arrows or tab to move off."
+msgstr "TrÆ°á»ng biểu mẫu KHÔNG THỂ SỬA Äá»”I. Dùng mÅ©i tên LÊN/XUá»NG hoặc tab để Ä‘i tiếp."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MAILTO_MSG
+#: LYMessages.c:106
+msgid "(mailto form field) Enter text. Use <return> to submit, arrows to move off."
+msgstr "(TrÆ°á»ng biểu mẫu gá»­i thÆ°) Hãy nhập. Dùng <Enter> để gá»­i Ä‘i, phím mÅ©i tên hoặc tab để Ä‘i tiếp."
+
+#. #define FORM_LINK_TEXT_SUBMIT_MAILTO_DIS_MSG
+#: LYMessages.c:108
+msgid "(mailto form field) Mail is disallowed so you cannot submit."
+msgstr "(TrÆ°á»ng biểu mẫu gá»­i thÆ°) Không cho phép gá»­i thÆ° vì thế không thể gá»­i Ä‘i."
+
+#. #define FORM_LINK_PASSWORD_MESSAGE
+#: LYMessages.c:110
+msgid "(Password entry field) Enter text. Use UP or DOWN arrows or tab to move off."
+msgstr "(TrÆ°á»ng nhập mật khẩu) Hãy nhập. Sá»­ dụng mÅ©i tên LÊN/XUá»NG hoặc tab để Ä‘i tiếp."
+
+#. #define FORM_LINK_PASSWORD_UNM_MSG
+#: LYMessages.c:112
+msgid "UNMODIFIABLE form password. Use UP or DOWN arrows or tab to move off."
+msgstr "Mật khẩu biểu mẫu KHÔNG THỂ SỬA Äá»”I. Dùng mÅ©i tên LÊN/XUá»NG hoặc tab để Ä‘i tiếp."
+
+#. #define FORM_LINK_CHECKBOX_ADV_MSG
+#: LYMessages.c:114
+#, c-format
+msgid "(Checkbox \"%s\"); Use right-arrow or <return> to toggle."
+msgstr "(Há»™p chá»n \"%s\"); Dùng mÅ©i tên phải hoặc <Enter> để bật/tắt."
+
+#. #define FORM_LINK_CHECKBOX_MESSAGE
+#: LYMessages.c:116
+msgid "(Checkbox Field) Use right-arrow or <return> to toggle."
+msgstr "(TrÆ°á»ng há»™p chá»n) Dùng mÅ©i tên phải hoặc <Enter> để bật tắt."
+
+#. #define FORM_LINK_CHECKBOX_UNM_MSG
+#: LYMessages.c:118
+msgid "UNMODIFIABLE form checkbox. Use UP or DOWN arrows or tab to move off."
+msgstr "Há»™p lá»±a chá»n KHÔNG THỂ SỬA Äá»”I. Dùng mÅ©i tên LÊN/XUá»NG hoặc tab để Ä‘i tiếp."
+
+#. #define FORM_LINK_RADIO_ADV_MSG
+#: LYMessages.c:120
+#, c-format
+msgid "(Radio Button \"%s\"); Use right-arrow or <return> to toggle."
+msgstr "(Nút chá»n má»™t \"%s\"); Dùng mÅ©i tên phải hoặc <Enter> để bật tắt."
+
+#. #define FORM_LINK_RADIO_MESSAGE
+#: LYMessages.c:122
+msgid "(Radio Button) Use right-arrow or <return> to toggle."
+msgstr "(Nút chá»n má»™t) Dùng mÅ©i tên phải hoặc <Enter> để bật tắt."
+
+#. #define FORM_LINK_RADIO_UNM_MSG
+#: LYMessages.c:124
+msgid "UNMODIFIABLE form radio button. Use UP or DOWN arrows or tab to move off."
+msgstr "Nút chá»n má»™t biểu mẫu KHÔNG THỂ SỬA Äá»”I. Dùng mÅ©i tên LÊN/XUá»NG hoặc tab để Ä‘i tiếp."
+
+#. #define FORM_LINK_SUBMIT_PREFIX
+#: LYMessages.c:126
+msgid "Submit ('x' for no cache) to "
+msgstr "Gửi (“x†để không nhớ tạm) cho "
+
+#. #define FORM_LINK_RESUBMIT_PREFIX
+#: LYMessages.c:128
+msgid "Submit to "
+msgstr "Gá»­i cho "
+
+#. #define FORM_LINK_SUBMIT_MESSAGE
+#: LYMessages.c:130
+msgid "(Form submit button) Use right-arrow or <return> to submit ('x' for no cache)."
+msgstr "(Nút gửi đi biểu mẫu) Dùng mũi tên phải hoặc <Enter> để gửi (“x†để không nhớ tạm)."
+
+#. #define FORM_LINK_RESUBMIT_MESSAGE
+#: LYMessages.c:132
+msgid "(Form submit button) Use right-arrow or <return> to submit."
+msgstr "(Nút gửi đi biểu mẫu) Dùng mũi tên phải hoặc <Enter> để gửi đi."
+
+#. #define FORM_LINK_SUBMIT_DIS_MSG
+#: LYMessages.c:134
+msgid "DISABLED form submit button. Use UP or DOWN arrows or tab to move off."
+msgstr "Nút gá»­i Ä‘i BỊ TẮT. Dùng mÅ©i tên LÊN/XUá»NG hoặc tab để Ä‘i tiếp."
+
+#. #define FORM_LINK_SUBMIT_MAILTO_PREFIX
+#: LYMessages.c:136
+msgid "Submit mailto form to "
+msgstr "Gửi thư biểu mẫu cho "
+
+#. #define FORM_LINK_SUBMIT_MAILTO_MSG
+#: LYMessages.c:138
+msgid "(mailto form submit button) Use right-arrow or <return> to submit."
+msgstr "(nút gửi thư biểu mẫu) Dùng mũi tên phải hoặc <Enter> để gửi đi."
+
+#. #define FORM_LINK_SUBMIT_MAILTO_DIS_MSG
+#: LYMessages.c:140
+msgid "(mailto form submit button) Mail is disallowed so you cannot submit."
+msgstr "(nút gửi thư biểu mẫu) Không cho phép gửi thư vì thế không thể gửi đi."
+
+#. #define FORM_LINK_RESET_MESSAGE
+#: LYMessages.c:142
+msgid "(Form reset button) Use right-arrow or <return> to reset form to defaults."
+msgstr "(Äặt lại biểu mẫu) Dùng mÅ©i tên phải hoặc <Enter> để đặt lại biểu mẫu thành các giá trị mặc định."
+
+#. #define FORM_LINK_RESET_DIS_MSG
+#: LYMessages.c:144
+msgid "DISABLED form reset button. Use UP or DOWN arrows or tab to move off."
+msgstr "Nút đặt lại BỊ TẮT. Hãy dùng mÅ©i tên LÊN/XUá»NG hoặc tab để Ä‘i tiếp."
+
+#. #define FORM_LINK_BUTTON_MESSAGE
+#: LYMessages.c:146
+msgid "(Script button) Use UP or DOWN arrows or tab to move off."
+msgstr "Nút kịch bản (script) Sá»­ dụng phím mÅ©i tên LÊN/XUá»NG hoặc tab để Ä‘i xa."
+
+#. #define FORM_LINK_BUTTON_ADV_MSG
+#: LYMessages.c:148
+#, c-format
+msgid "(Script button \"%s\"); Use UP or DOWN arrows or tab to move off."
+msgstr "(Nút kịch bản (script) \"%s\") Sá»­ dụng phím mÅ©i tên LÊN/XUá»NG hoặc tab để Ä‘i xa."
+
+#. #define FORM_LINK_BUTTON_DIS_MSG
+#: LYMessages.c:150
+msgid "DISABLED Script button. Use UP or DOWN arrows or tab to move off."
+msgstr "TẮT nút kịch bản (script). Sá»­ dụng phím mÅ©i tên LÊN/XUá»NG hoặc tab để Ä‘i xa."
+
+#. #define FORM_LINK_OPTION_LIST_ADV_MSG
+#: LYMessages.c:152
+#, c-format
+msgid "(Option list \"%s\"); Hit return to select option."
+msgstr "(Danh sách tùy chá»n \"%s\"); Bấm Enter để đặt tùy chá»n."
+
+#. #define FORM_LINK_OPTION_LIST_MESSAGE
+#: LYMessages.c:154
+msgid "(Option list) Hit return and use arrow keys and return to select option."
+msgstr "(Danh sách tùy chá»n) Bấm Enter và dùng các phím mÅ©i tên và Enter để đặt tùy chá»n."
+
+#. #define CHOICE_LIST_ADV_MSG
+#: LYMessages.c:156
+#, c-format
+msgid "(Choice entry \"%s\"); Use arrow keys and return to select option."
+msgstr "(Danh sách lá»±a chá»n \"%s\"); Bấm Enter và dùng các phím mÅ©i tên và Enter để đặt tùy chá»n."
+
+#. #define CHOICE_LIST_MESSAGE
+#: LYMessages.c:158
+msgid "(Choice list) Hit return and use arrow keys and return to select option."
+msgstr "(Danh sách lá»±a chá»n) Bấm Enter và dùng các phím mÅ©i tên và Enter để đặt tùy chá»n."
+
+#. #define MOUSE_CHOICE_MESSAGE
+#: LYMessages.c:160
+msgid "Left mouse button or return to select, arrow keys to scroll."
+msgstr "Dùng nút chuá»™t trái hoặc phím enter để chá»n, phím mÅ©i tên để cuá»™n."
+
+#. #define FORM_LINK_OPTION_LIST_UNM_MSG
+#: LYMessages.c:162
+msgid "UNMODIFIABLE option list. Use return or arrow keys to review or leave."
+msgstr "Danh sách tùy chá»n KHÔNG THẾ SỬA Äá»”I. Hãy dùng các mÅ©i tên hoặc Enter để xem lại hoặc rá»i bá»."
+
+#. #define CHOICE_LIST_UNM_MSG
+#: LYMessages.c:164
+msgid "UNMODIFIABLE choice list. Use return or arrow keys to review or leave."
+msgstr "Danh sách lá»±a chá»n KHÔNG THẾ SỬA Äá»”I. Hãy dùng các mÅ©i tên hoặc Enter để xem lại hoặc rá»i bá»."
+
+#: LYMessages.c:165
+msgid "Submitting form..."
+msgstr "Äang gá»­i biểu mẫu…"
+
+#: LYMessages.c:166
+msgid "Resetting form..."
+msgstr "Äang đặt lại biểu mẫu…"
+
+#. #define RELOADING_FORM
+#: LYMessages.c:168
+msgid "Reloading document. Any form entries will be lost!"
+msgstr "Äang tải tài liệu. Bất kỳ mục nào trong Ä‘Æ¡n cÅ©ng sẽ mất!"
+
+#. #define LINK_NOT_IN_FORM
+#: LYMessages.c:170
+msgid "The current link is not in a FORM"
+msgstr "Liên kết hiện tại không ở trong một FORM"
+
+#: LYMessages.c:171
+#, c-format
+msgid "Warning: Cannot transcode form data to charset %s!"
+msgstr "Cảnh báo: không thể chuyển đổi từ dữ liệu sang bộ ký tự %s!"
+
+#. #define NORMAL_LINK_MESSAGE
+#: LYMessages.c:174
+msgid "(NORMAL LINK) Use right-arrow or <return> to activate."
+msgstr "(LIÊN KẾT THÔNG THƯỜNG) Dùng mũi tên sang phải hoặc <Enter> để kích hoạt."
+
+#: LYMessages.c:175
+msgid "The resource requested is not available at this time."
+msgstr "Äã yêu cầu má»™t tài nguyên mà hiện tại nó không sẵn có."
+
+#: LYMessages.c:176
+msgid "Enter Lynx keystroke command: "
+msgstr "Gõ lệnh động tác gõ phím Lynx: "
+
+#: LYMessages.c:177
+msgid "Looking up "
+msgstr "Äang tìm kiếm "
+
+#: LYMessages.c:178
+#, c-format
+msgid "Getting %s"
+msgstr "Äang lấy %s"
+
+#: LYMessages.c:179
+#, c-format
+msgid "Skipping %s"
+msgstr "Äang bá» qua %s"
+
+#: LYMessages.c:180
+#, c-format
+msgid "Using %s"
+msgstr "Äang dùng %s"
+
+#: LYMessages.c:181
+#, c-format
+msgid "Illegal URL: %s"
+msgstr "URI không hợp lệ: %s"
+
+#: LYMessages.c:182
+#, c-format
+msgid "Badly formed address %s"
+msgstr "Äịa chỉ dạng sai %s"
+
+#: LYMessages.c:183
+#, c-format
+msgid "URL: %s"
+msgstr "URL: %s"
+
+#: LYMessages.c:184
+msgid "Unable to access WWW file!!!"
+msgstr "Không thể truy cập tập tin WWW!!!"
+
+#: LYMessages.c:185
+#, c-format
+msgid "This is a searchable index. Use %s to search."
+msgstr "Äây là chỉ mục tìm kiếm được. Dùng %s để tìm kiếm."
+
+#. #define WWW_INDEX_MORE_MESSAGE
+#: LYMessages.c:187
+#, c-format
+msgid "--More-- This is a searchable index. Use %s to search."
+msgstr "—Thêm— Äây là chỉ mục tìm kiếm được. Dùng %s để tìm kiếm."
+
+#: LYMessages.c:188
+msgid "You have entered an invalid link number."
+msgstr "Bạn đã gõ một số liên kết không hợp lệ."
+
+#. #define SOURCE_HELP
+#: LYMessages.c:190
+msgid "Currently viewing document source. Press '\\' to return to rendered version."
+msgstr "Hiện tại đang xem mã nguồn của tài liệu. Nhấn “\\†để trở lại phiên bản được vẽ."
+
+#. #define NOVICE_LINE_ONE
+#: LYMessages.c:192
+msgid " Arrow keys: Up and Down to move. Right to follow a link; Left to go back. \n"
+msgstr " Mũi tên: [Trên/Xuống] di chuyển; [Phải] theo liên kết; [Trái] lùi lại.\n"
+
+#. #define NOVICE_LINE_TWO
+#: LYMessages.c:194
+msgid " H)elp O)ptions P)rint G)o M)ain screen Q)uit /=search [delete]=history list \n"
+msgstr " [H] trợ giúp; [O] tùy chá»n; [P] in; [M] màn hình chính; [Q] thoát; [/] tìm; [del] lịch sá»­\n"
+
+#. #define NOVICE_LINE_TWO_A
+#: LYMessages.c:196
+msgid " O)ther cmds H)elp K)eymap G)oto P)rint M)ain screen o)ptions Q)uit \n"
+msgstr " Lệnh khác: [H] trợ giúp; [K] sơ đồ phím; [G] đi tới; [P] in; [M] màn hình chính; [Q] thoát\n"
+
+#. #define NOVICE_LINE_TWO_B
+#: LYMessages.c:198
+msgid " O)ther cmds B)ack E)dit D)ownload ^R)eload ^W)ipe screen search doc: / \n"
+msgstr " [O]Lệnh khác: [B] lùi lại; [E] sá»­a; [D] tải vá»; [^R] tải lại [^W] xóa màn hình; [/] tìm trong tài liệu: \n"
+
+#. #define NOVICE_LINE_TWO_C
+#: LYMessages.c:200
+msgid "O)ther cmds C)omment History: <backspace> Bookmarks: V)iew, A)dd, R)emove \n"
+msgstr "O)Lệnh khác C)hú thích Lịch sá»­: <xóa lùi> Äánh dấu: [V]Xem, [A]Thêm, [R]Bá»\n"
+
+#. #define FORM_NOVICELINE_ONE
+#: LYMessages.c:202
+msgid " Enter text into the field by typing on the keyboard "
+msgstr " Hãy nhập văn bản vào trÆ°á»ng này bằng cách gõ phím "
+
+#. #define FORM_NOVICELINE_TWO
+#: LYMessages.c:204
+msgid " Ctrl-U to delete all text in field, [Backspace] to delete a character "
+msgstr " Ctrl-U để xóa tất cả văn bản trong trÆ°á»ng, [Xóa lùi] để xóa 1 ký tá»± "
+
+#. #define FORM_NOVICELINE_TWO_DELBL
+#: LYMessages.c:206
+msgid " Ctrl-U to delete text in field, [Backspace] to delete a character "
+msgstr " Ctrl-U để xóa văn bản trong trÆ°á»ng, [Xóa lùi] để xóa 1 ký tá»± "
+
+#. #define FORM_NOVICELINE_TWO_VAR
+#: LYMessages.c:208
+#, c-format
+msgid " %s to delete all text in field, [Backspace] to delete a character "
+msgstr " %s để xóa tất cả văn bản trong trÆ°á»ng, [Xóa lùi] để xóa 1 ký tá»± "
+
+#. #define FORM_NOVICELINE_TWO_DELBL_VAR
+#: LYMessages.c:210
+#, c-format
+msgid " %s to delete text in field, [Backspace] to delete a character "
+msgstr " %s để xóa văn bản trong trÆ°á»ng, [Xóa lùi] để xóa 1 ký tá»± "
+
+#. mailto
+#: LYMessages.c:213
+msgid "Malformed mailto form submission! Cancelled!"
+msgstr "Sai dạng gửi thư biểu mẫu nên bị thôi!"
+
+#: LYMessages.c:214
+msgid "Warning! Control codes in mail address replaced by ?"
+msgstr "Cảnh báo! mã Ä‘iá»u khiển trong địa chỉ thÆ° thay thế bởi?"
+
+#: LYMessages.c:215
+msgid "Mail disallowed! Cannot submit."
+msgstr "Không cho phép gửi thư! Không thể gửi đi."
+
+#: LYMessages.c:216
+msgid "Mailto form submission failed!"
+msgstr "Lỗi gửi thư biểu mẫu!"
+
+#: LYMessages.c:217
+msgid "Mailto form submission Cancelled!!!"
+msgstr "Việc gửi thư biểu mẫu bị thôi!"
+
+#: LYMessages.c:218
+msgid "Sending form content..."
+msgstr "Äang gá»­i ná»™i dung của biểu mẫu…"
+
+#: LYMessages.c:219
+msgid "No email address is present in mailto URL!"
+msgstr "URI mailto (gửi thư cho) không chứa địa chỉ thư điện tử!"
+
+#. #define MAILTO_URL_TEMPOPEN_FAILED
+#: LYMessages.c:221
+msgid "Unable to open temporary file for mailto URL!"
+msgstr "Không thể mở tập tin tạm thá»i cho URL mailto (gá»­i thÆ° cho)!"
+
+#. #define INC_ORIG_MSG_PROMPT
+#: LYMessages.c:223
+msgid "Do you wish to include the original message?"
+msgstr "Bạn có muốn trích dẫn thư gốc không?"
+
+#. #define INC_PREPARSED_MSG_PROMPT
+#: LYMessages.c:225
+msgid "Do you wish to include the preparsed source?"
+msgstr "Bạn có muốn trích dẫn mã nguồn đã phân tích sẵn không?"
+
+#. #define SPAWNING_EDITOR_FOR_MAIL
+#: LYMessages.c:227
+msgid "Spawning your selected editor to edit mail message"
+msgstr "Äang tạo và thá»±c hiện trình soạn thảo đã chá»n để soạn thảo thÆ°"
+
+#. #define ERROR_SPAWNING_EDITOR
+#: LYMessages.c:229
+msgid "Error spawning editor, check your editor definition in the options menu"
+msgstr "Lá»—i tạo và thá»±c hiện trình soạn thảo, hãy kiểm tra định nghÄ©a trình soạn thảo trong trình Ä‘Æ¡n tùy chá»n"
+
+#: LYMessages.c:230
+msgid "Send this comment?"
+msgstr "Gửi bình luận này không?"
+
+#: LYMessages.c:231
+msgid "Send this message?"
+msgstr "Gửi thư này không?"
+
+#: LYMessages.c:232
+msgid "Sending your message..."
+msgstr "Äang gá»­i thÆ° của bạn…"
+
+#: LYMessages.c:233
+msgid "Sending your comment:"
+msgstr "Äang gá»­i bình luận của bạn:"
+
+#. textarea
+#: LYMessages.c:236
+msgid "Not in a TEXTAREA; cannot use external editor."
+msgstr "Ở ngoài VÙNG VĂN BẢN, không thể dùng trình soạn thảo ngoại trú."
+
+#: LYMessages.c:237
+msgid "Not in a TEXTAREA; cannot use command."
+msgstr "Ở ngoài VÙNG VĂN BẢN, không thể dùng câu lệnh."
+
+#: LYMessages.c:239
+msgid "file: ACTIONs are disallowed!"
+msgstr "tập tin: HÀNH ÄỘNG không cho phép!"
+
+#. #define FILE_SERVED_LINKS_DISALLOWED
+#: LYMessages.c:241
+msgid "file: URLs via served links are disallowed!"
+msgstr "tập tin: URL qua liên kết đã đưa là không cho phép!"
+
+#: LYMessages.c:242
+msgid "Access to local files denied."
+msgstr "Truy cập vào tập tin cục bộ bị từ chối."
+
+#: LYMessages.c:243
+msgid "file: URLs via bookmarks are disallowed!"
+msgstr "tập tin: không cho phép URL qua Äánh dấu!"
+
+#. #define SPECIAL_VIA_EXTERNAL_DISALLOWED
+#: LYMessages.c:245
+msgid "This special URL is not allowed in external documents!"
+msgstr "Không cho phép URL đặc biệt này trong tài liệu bên ngoài!"
+
+#: LYMessages.c:246
+msgid "Press <return> to return to Lynx."
+msgstr "Bấm phím <Enter> để trở vỠLynx."
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:249
+msgid "Spawning DCL subprocess. Use 'logout' to return to Lynx.\n"
+msgstr "Äang tạo và thá»±c hiện tiến trình con DCL. Dùng “logout†để quay lại Lynx.\n"
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:253
+msgid "Type EXIT to return to Lynx.\n"
+msgstr "Gõ “EXIT†(thoát) để trở vỠLynx.\n"
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:256
+msgid "Spawning your default shell. Use 'exit' to return to Lynx.\n"
+msgstr "Äang tạo và thá»±c hiện trình bao mặc định. Hãy dùng “exit†để quay lại Lynx.\n"
+
+#: LYMessages.c:259
+msgid "Spawning is currently disabled."
+msgstr "Chức năng tạo và thực hiện hiện tại bị tắt."
+
+#: LYMessages.c:260
+msgid "The 'd'ownload command is currently disabled."
+msgstr "Câu lệnh 'd'ownload (tải vá») hiện hiện tại bị tắt."
+
+#: LYMessages.c:261
+msgid "You cannot download an input field."
+msgstr "Bạn không thể tải xuống má»™t trÆ°á»ng nhập liệu."
+
+#: LYMessages.c:262
+msgid "Form has a mailto action! Cannot download."
+msgstr "Biểu mẫu có hành động mailto (gửi thư) thì không thể tải xuống."
+
+#: LYMessages.c:263
+msgid "You cannot download a mailto: link."
+msgstr "Bạn không thể tải xuống một liên kết mailto: (gửi thư)."
+
+#: LYMessages.c:264
+msgid "You cannot download cookies."
+msgstr "Bạn không thể tải xuống cookie."
+
+#: LYMessages.c:265
+msgid "You cannot download a printing option."
+msgstr "Bạn không thể tải xuống má»™t tùy chá»n in ẩn."
+
+#: LYMessages.c:266
+msgid "You cannot download an upload option."
+msgstr "Bạn không thể tải xuống má»™t tùy chá»n tải lên."
+
+#: LYMessages.c:267
+msgid "You cannot download an permit option."
+msgstr "Bạn không thể tải xuống má»™t tùy chá»n cho phép."
+
+#: LYMessages.c:268
+msgid "This special URL cannot be downloaded!"
+msgstr "Không thể tải xuống địa chỉ URL đặc biệt này!"
+
+#: LYMessages.c:269
+msgid "Nothing to download."
+msgstr "Không có gì cần tải xuống."
+
+#: LYMessages.c:270
+msgid "Trace ON!"
+msgstr "Tìm Ä‘Æ°á»ng BẬT!"
+
+#: LYMessages.c:271
+msgid "Trace OFF!"
+msgstr "Tìm Ä‘Æ°á»ng TẮT!"
+
+#. #define CLICKABLE_IMAGES_ON
+#: LYMessages.c:273
+msgid "Links will be included for all images! Reloading..."
+msgstr "Sẽ thêm liên kết cho má»i hình ảnh! Äang tải lại…"
+
+#. #define CLICKABLE_IMAGES_OFF
+#: LYMessages.c:275
+msgid "Standard image handling restored! Reloading..."
+msgstr "Äã phục hồi sá»± Ä‘iá»u khiển hình ảnh tiêu chuẩn! Äang tải lại…"
+
+#. #define PSEUDO_INLINE_ALTS_ON
+#: LYMessages.c:277
+msgid "Pseudo_ALTs will be inserted for inlines without ALT strings! Reloading..."
+msgstr "Sẽ chèn Pseudo_ALT cho má»—i ảnh trá»±c tiếp không có chuá»—i xen kẽ ALT! Äang tải lại…"
+
+#. #define PSEUDO_INLINE_ALTS_OFF
+#: LYMessages.c:279
+msgid "Inlines without an ALT string specified will be ignored! Reloading..."
+msgstr "Ảnh trá»±c tiếp không có chuá»—i ALT sẽ bị bá» qua! Äang tải lại…"
+
+#: LYMessages.c:280
+msgid "Raw 8-bit or CJK mode toggled OFF! Reloading..."
+msgstr "Chế Ä‘á»™ 8-bit thô sÆ¡ hoặc CJK TẮT! Äang tải lại…"
+
+#: LYMessages.c:281
+msgid "Raw 8-bit or CJK mode toggled ON! Reloading..."
+msgstr "Chế Ä‘á»™ 8-bit thô sÆ¡ hoặc CJK BẬT! Äang tải lại…"
+
+#. #define HEAD_D_L_OR_CANCEL
+#: LYMessages.c:283
+msgid "Send HEAD request for D)ocument or L)ink, or C)ancel? (d,l,c): "
+msgstr "Gửi yêu cầu HEAD cho [D] tài liệu hoặc [L] liên kết, hoặc [C] thôi: "
+
+#. #define HEAD_D_OR_CANCEL
+#: LYMessages.c:285
+msgid "Send HEAD request for D)ocument, or C)ancel? (d,c): "
+msgstr "Gửi yêu cầu HEAD cho [D] tài liệu, hoặc [C] thôi: "
+
+#: LYMessages.c:286
+msgid "Sorry, the document is not an http URL."
+msgstr "Tiếc là tài liệu không phải địa chỉ URL Web (theo giao thức HTTP)."
+
+#: LYMessages.c:287
+msgid "Sorry, the link is not an http URL."
+msgstr "Tiếc là liên kết không phải địa chỉ URL Web (theo giao thức HTTP)."
+
+#: LYMessages.c:288
+msgid "Sorry, the ACTION for this form is disabled."
+msgstr "Tiếc là HÀNH VI cho biểu mẫu này đã bị tắt."
+
+#. #define FORM_ACTION_NOT_HTTP_URL
+#: LYMessages.c:290
+msgid "Sorry, the ACTION for this form is not an http URL."
+msgstr "Rất tiếc, HÀNH VI cho biểu mẫu này không phải là một URL kiểu http."
+
+#: LYMessages.c:291
+msgid "Not an http URL or form ACTION!"
+msgstr "Không phải là URL http hay biểu mẫu HÀNH VI!"
+
+#: LYMessages.c:292
+msgid "This special URL cannot be a form ACTION!"
+msgstr "URL đặc biệt này không thể là một HÀNH VI của biểu mẫu!"
+
+#: LYMessages.c:293
+msgid "URL is not in starting realm!"
+msgstr "Äịa chỉ URL không nằm trong vùng bắt đầu!"
+
+#: LYMessages.c:294
+msgid "News posting is disabled!"
+msgstr "Chức năng gửi bài tin đã bị tắt!"
+
+#: LYMessages.c:295
+msgid "File management support is disabled!"
+msgstr "Hỗ trợ quản lý tập tin đã bị tắt!"
+
+#: LYMessages.c:296
+msgid "No jump file is currently available."
+msgstr "Hiện tại không có sẵn tập tin nhảy."
+
+#: LYMessages.c:297
+msgid "Jump to (use '?' for list): "
+msgstr "Nhảy tới (dùng “?†để liệt kê): "
+
+#: LYMessages.c:298
+msgid "Jumping to a shortcut URL is disallowed!"
+msgstr "Không cho phép nhảy tới một địa chỉ URL viết tắt!"
+
+#: LYMessages.c:299
+msgid "Random URL is disallowed! Use a shortcut."
+msgstr "Không cho phép dùng địa chỉ URL ngẫu nhiên. Hãy dùng một lối tắt."
+
+#: LYMessages.c:300
+msgid "No random URLs have been used thus far."
+msgstr "Chưa dùng địa chỉ URL ngẫu nhiên."
+
+#: LYMessages.c:301
+msgid "Bookmark features are currently disabled."
+msgstr "Các tính năng Äánh dấu đã bị tắt."
+
+#: LYMessages.c:302
+msgid "Execution via bookmarks is disabled."
+msgstr "Chức năng thá»±c hiện thông qua Äánh dấu đã bị tắt."
+
+#. #define BOOKMARK_FILE_NOT_DEFINED
+#: LYMessages.c:304
+#, c-format
+msgid "Bookmark file is not defined. Use %s to see options."
+msgstr "ChÆ°a xác định tập tin Äánh dấu. Hãy dùng %s để xem tùy chá»n."
+
+#. #define NO_TEMP_FOR_HOTLIST
+#: LYMessages.c:306
+msgid "Unable to open tempfile for X Mosaic hotlist conversion."
+msgstr "Không thể mở tập tin tạm thá»i để chuyển đổi danh sách nóng Mosaic X."
+
+#: LYMessages.c:307
+msgid "ERROR - unable to open bookmark file."
+msgstr "Lá»–I — không thể mở tập tin Äánh dấu."
+
+#. #define BOOKMARK_OPEN_FAILED_FOR_DEL
+#: LYMessages.c:309
+msgid "Unable to open bookmark file for deletion of link."
+msgstr "Không thể mở tập tin Äánh dấu để xóa liên kết."
+
+#. #define BOOKSCRA_OPEN_FAILED_FOR_DEL
+#: LYMessages.c:311
+msgid "Unable to open scratch file for deletion of link."
+msgstr "Không thể mở tập tin ghi tạm để xóa liên kết."
+
+#: LYMessages.c:313
+msgid "Error renaming scratch file."
+msgstr "Gặp lỗi khi thay đổi tên của tập tin ghi tạm."
+
+#: LYMessages.c:315
+msgid "Error renaming temporary file."
+msgstr "Gặp lá»—i khi thay đổi tên của tập tin tạm thá»i."
+
+#. #define BOOKTEMP_COPY_FAIL
+#: LYMessages.c:317
+msgid "Unable to copy temporary file for deletion of link."
+msgstr "Không thể sao chép tập tin tạm thá»i để xóa liên kết."
+
+#. #define BOOKTEMP_REOPEN_FAIL_FOR_DEL
+#: LYMessages.c:319
+msgid "Unable to reopen temporary file for deletion of link."
+msgstr "Không thể mở lại tập tin tạm thá»i để xóa liên kết."
+
+#. #define BOOKMARK_LINK_NOT_ONE_LINE
+#: LYMessages.c:322
+msgid "Link is not by itself all on one line in bookmark file."
+msgstr "Liên kết không nằm riêng trên má»™t dòng trong tập tin Äánh dấu."
+
+#: LYMessages.c:323
+msgid "Bookmark deletion failed."
+msgstr "Gặp lá»—i khi xóa Äánh dấu."
+
+#. #define BOOKMARKS_NOT_TRAVERSED
+#: LYMessages.c:325
+msgid "Bookmark files cannot be traversed (only http URLs)."
+msgstr "Không Ä‘i qua được tập tin Äánh dấu (chỉ các URL http)."
+
+#. #define BOOKMARKS_NOT_OPEN
+#: LYMessages.c:327
+msgid "Unable to open bookmark file, use 'a' to save a link first"
+msgstr "Không thể mở tập tin Äánh dấu, trÆ°á»›c tiên hãy dùng “a†để lÆ°u liên kết"
+
+#: LYMessages.c:328
+msgid "There are no links in this bookmark file!"
+msgstr "Không có liên kết trong tập tin Äánh dấu này!"
+
+#. #define CACHE_D_OR_CANCEL
+#: LYMessages.c:330
+msgid "D)elete cached document or C)ancel? (d,c): "
+msgstr "[D] Xóa tài liệu đã lưu tạm, hoặc [C] thôi: "
+
+#. #define BOOK_D_L_OR_CANCEL
+#: LYMessages.c:332
+msgid "Save D)ocument or L)ink to bookmark file or C)ancel? (d,l,c): "
+msgstr "LÆ°u [D] tài liệu hoặc [L] liên kết vào tập tin Äánh dấu, hoặc [C] thôi: "
+
+#: LYMessages.c:333
+msgid "Save D)ocument to bookmark file or C)ancel? (d,c): "
+msgstr "LÆ°u [D] tài liệu vào tập tin Äánh dấu, hoặc [C] thôi: "
+
+#: LYMessages.c:334
+msgid "Save L)ink to bookmark file or C)ancel? (l,c): "
+msgstr "LÆ°u [L]iên kết vào tập tin Äánh dấu, hoặc [C] thôi? (l,c): "
+
+#. #define NOBOOK_POST_FORM
+#: LYMessages.c:336
+msgid "Documents from forms with POST content cannot be saved as bookmarks."
+msgstr "Tài liệu từ biểu mẫu có ná»™i dung POST thì không thể được lÆ°u dạng Äánh dấu."
+
+#: LYMessages.c:337
+msgid "Cannot save form fields/links"
+msgstr "Không thể lÆ°u trÆ°á»ng/liên kết của biểu mẫu"
+
+#. #define NOBOOK_HSML
+#: LYMessages.c:339
+msgid "History, showinfo, menu and list files cannot be saved as bookmarks."
+msgstr "Không thể lÆ°u dạng Äánh dấu tập tin kiểu lịch sá»­, hiển thị thông tin, trình Ä‘Æ¡n hoặc danh sách."
+
+#. #define CONFIRM_BOOKMARK_DELETE
+#: LYMessages.c:341
+msgid "Do you really want to delete this link from your bookmark file?"
+msgstr "Bạn thá»±c sá»± muốn xóa liên kết này khá»i tập tin Äánh dấu không?"
+
+#: LYMessages.c:342
+msgid "Malformed address."
+msgstr "Äịa chỉ dạng sai."
+
+#. #define HISTORICAL_ON_MINIMAL_OFF
+#: LYMessages.c:344
+msgid "Historical comment parsing ON (Minimal is overridden)!"
+msgstr "Phân tích bình luận lịch sử BẬT (Tối thiểu bị ghi đè)!"
+
+#. #define HISTORICAL_OFF_MINIMAL_ON
+#: LYMessages.c:346
+msgid "Historical comment parsing OFF (Minimal is in effect)!"
+msgstr "Phân tích bình luận lịch sử TẮT (Tối thiểu được dùng)!"
+
+#. #define HISTORICAL_ON_VALID_OFF
+#: LYMessages.c:348
+msgid "Historical comment parsing ON (Valid is overridden)!"
+msgstr "Phân tích bình luận lịch sử BẬT (Hợp lệ bị ghi đè)!"
+
+#. #define HISTORICAL_OFF_VALID_ON
+#: LYMessages.c:350
+msgid "Historical comment parsing OFF (Valid is in effect)!"
+msgstr "Phân tích bình luận lịch sử TẮT (Hợp lệ có tác động)!"
+
+#. #define MINIMAL_ON_IN_EFFECT
+#: LYMessages.c:352
+msgid "Minimal comment parsing ON (and in effect)!"
+msgstr "Phân tích bình luận tối thiểu BẬT (cũng có tác động)!"
+
+#. #define MINIMAL_OFF_VALID_ON
+#: LYMessages.c:354
+msgid "Minimal comment parsing OFF (Valid is in effect)!"
+msgstr "Phân tích bình luận tối thiểu TẮT (Hợp lệ có tác động)!"
+
+#. #define MINIMAL_ON_BUT_HISTORICAL
+#: LYMessages.c:356
+msgid "Minimal comment parsing ON (but Historical is in effect)!"
+msgstr "Phân tích bình luận tối thiểu BẬT (nhưng kiểu lịch sử có tác động)!"
+
+#. #define MINIMAL_OFF_HISTORICAL_ON
+#: LYMessages.c:358
+msgid "Minimal comment parsing OFF (Historical is in effect)!"
+msgstr "Phân tích bình luận tối thiểu TẮT (kiểu lịch sử có tác động)!"
+
+#: LYMessages.c:359
+msgid "Soft double-quote parsing ON!"
+msgstr "Phân tích dấu nháy kép má»m BẬT!"
+
+#: LYMessages.c:360
+msgid "Soft double-quote parsing OFF!"
+msgstr "Phân tích dấu nháy kép má»m TẮT!"
+
+#: LYMessages.c:361
+msgid "Now using TagSoup parsing of HTML."
+msgstr "Äang dùng phân tích TagSoup của HTML."
+
+#: LYMessages.c:362
+msgid "Now using SortaSGML parsing of HTML!"
+msgstr "Äang dùng phân tích SortaSGML của HTML!"
+
+#: LYMessages.c:363
+msgid "You are already at the end of this document."
+msgstr "Bạn ở cuối của tài liệu này."
+
+#: LYMessages.c:364
+msgid "You are already at the beginning of this document."
+msgstr "Bạn ở đầu của tài liệu này."
+
+#: LYMessages.c:365
+#, c-format
+msgid "You are already at page %d of this document."
+msgstr "Bạn ở trang %d của tài liệu này."
+
+#: LYMessages.c:366
+#, c-format
+msgid "Link number %d already is current."
+msgstr "Liên kết số %d không cần cập nhật."
+
+#: LYMessages.c:367
+msgid "You are already at the first document"
+msgstr "Bạn ở tài liệu đầu tiên"
+
+#: LYMessages.c:368
+msgid "There are no links above this line of the document."
+msgstr "Không có liên kết bên trên dòng này của tài liệu."
+
+#: LYMessages.c:369
+msgid "There are no links below this line of the document."
+msgstr "Không có liên kết bên dưới dòng này của tài liệu."
+
+#. #define MAXLEN_REACHED_DEL_OR_MOV
+#: LYMessages.c:371
+msgid "Maximum length reached! Delete text or move off field."
+msgstr "Tá»›i chiá»u dài tối Ä‘a. Hãy xóa văn bản hoặc Ä‘i tiếp."
+
+#. #define NOT_ON_SUBMIT_OR_LINK
+#: LYMessages.c:373
+msgid "You are not on a form submission button or normal link."
+msgstr "Không nằm trên má»™t nút gá»­i biểu mẫu hay má»™t liên kết thông thÆ°á»ng."
+
+#. #define NEED_CHECKED_RADIO_BUTTON
+#: LYMessages.c:375
+msgid "One radio button must be checked at all times!"
+msgstr "Có nút chá»n má»™t thì lúc nào phải chá»n má»™t của những tùy chá»n được cung cấp!"
+
+#: LYMessages.c:376
+msgid "No submit button for this form, submit single text field?"
+msgstr "Không có nút gá»­i Ä‘i cho biểu mẫu này, gá»­i Ä‘i má»™t trÆ°á»ng văn bản riêng?"
+
+#: LYMessages.c:377
+msgid "Do you want to go back to the previous document?"
+msgstr "Bạn có muốn trở vỠtài liệu trước không?"
+
+#: LYMessages.c:378
+msgid "Use arrows or tab to move off of field."
+msgstr "Sử dụng phím mũi tên hoặc tab để đi tiếp."
+
+#. #define ENTER_TEXT_ARROWS_OR_TAB
+#: LYMessages.c:380
+msgid "Enter text. Use arrows or tab to move off of field."
+msgstr "Hãy nhập văn bản. Sử dụng phím mũi tên hoặc tab để đi tiếp."
+
+#: LYMessages.c:381
+msgid "** Bad HTML!! No form action defined. **"
+msgstr "** HTML xấu!! Chưa xác định hành động biểu mẫu. **"
+
+#: LYMessages.c:382
+msgid "Bad HTML!! Unable to create popup window!"
+msgstr "HTML xấu!! Không thể tạo cửa sổ tự mở!"
+
+#: LYMessages.c:383
+msgid "Unable to create popup window!"
+msgstr "Không thể tạo cửa sổ tự mở!"
+
+#: LYMessages.c:384
+msgid "Goto a random URL is disallowed!"
+msgstr "Không cho phép đi tới một địa chỉ URL ngẫu nhiên!"
+
+#: LYMessages.c:385
+msgid "Goto a non-http URL is disallowed!"
+msgstr "Không cho phép đi tới một địa chỉ URL không phải HTTP!"
+
+#: LYMessages.c:386
+#, c-format
+msgid "You are not allowed to goto \"%s\" URLs"
+msgstr "Bạn không có quyá»n Ä‘i tá»›i địa chỉ URL kiểu “%sâ€"
+
+#: LYMessages.c:387
+msgid "URL to open: "
+msgstr "URL cần mở: "
+
+#: LYMessages.c:388
+msgid "Edit the current Goto URL: "
+msgstr "Sá»­a URL Äi Tá»›i hiện tại: "
+
+#: LYMessages.c:389
+msgid "Edit the previous Goto URL: "
+msgstr "Sá»­a URL Äi Tá»›i trÆ°á»›c: "
+
+#: LYMessages.c:390
+msgid "Edit a previous Goto URL: "
+msgstr "Sá»­a má»™t URL Äi Tá»›i trÆ°á»›c: "
+
+#: LYMessages.c:391
+msgid "Current document has POST data."
+msgstr "Tài liệu hiện tại chứa dữ liệu POST."
+
+#: LYMessages.c:392
+msgid "Edit this document's URL: "
+msgstr "Sửa URL của tài liệu này: "
+
+#: LYMessages.c:393
+msgid "Edit the current link's URL: "
+msgstr "Sửa URL của liên kết hiện tại: "
+
+#: LYMessages.c:394
+msgid "Edit the form's submit-URL: "
+msgstr "Sửa chữa URL gửi đi của form: "
+
+#: LYMessages.c:395
+msgid "You cannot edit File Management URLs"
+msgstr "Không thể chỉnh sửa địa chỉ URL kiểu Quản lý Tập tin"
+
+#: LYMessages.c:396
+msgid "Enter a database query: "
+msgstr "Nhập truy vấn cơ sở dữ liệu: "
+
+#: LYMessages.c:397
+msgid "Enter a whereis query: "
+msgstr "Nhập truy vấn whereis: "
+
+#: LYMessages.c:398
+msgid "Edit the current query: "
+msgstr "Nhập truy vấn hiện tại: "
+
+#: LYMessages.c:399
+msgid "Edit the previous query: "
+msgstr "Nhập truy vấn trước: "
+
+#: LYMessages.c:400
+msgid "Edit a previous query: "
+msgstr "Nhập một truy vấn trước: "
+
+#. #define USE_C_R_TO_RESUB_CUR_QUERY
+#: LYMessages.c:402
+msgid "Use Control-R to resubmit the current query."
+msgstr "Bấm tổ hợp phím Ctrl-R để gửi lại truy vấn hiện tại."
+
+#: LYMessages.c:403
+msgid "Edit the current shortcut: "
+msgstr "Sửa lối tắt hiện tại: "
+
+#: LYMessages.c:404
+msgid "Edit the previous shortcut: "
+msgstr "Sửa lối tắt trước: "
+
+#: LYMessages.c:405
+msgid "Edit a previous shortcut: "
+msgstr "Sửa một lối tắt trước: "
+
+#: LYMessages.c:406
+#, c-format
+msgid "Key '%c' is not mapped to a jump file!"
+msgstr "Phím “%c†không phải được ánh xạ tới một tập tin nhảy!"
+
+#: LYMessages.c:407
+msgid "Cannot locate jump file!"
+msgstr "Không thể tìm tập tin nhảy!"
+
+#: LYMessages.c:408
+msgid "Cannot open jump file!"
+msgstr "Không thể mở tập tin nhảy!"
+
+#: LYMessages.c:409
+msgid "Error reading jump file!"
+msgstr "Lá»—i Ä‘á»c tập tin nhảy!"
+
+#: LYMessages.c:410
+msgid "Out of memory reading jump file!"
+msgstr "Tràn bá»™ nhá»› khi Ä‘á»c tập tin nhảy!"
+
+#: LYMessages.c:411
+msgid "Out of memory reading jump table!"
+msgstr "Tràn bá»™ nhá»› khi Ä‘á»c bảng nhảy!"
+
+#: LYMessages.c:412
+msgid "No index is currently available."
+msgstr "Hiện tại không có sẵn chỉ mục."
+
+#. #define CONFIRM_MAIN_SCREEN
+#: LYMessages.c:414
+msgid "Do you really want to go to the Main screen?"
+msgstr "Bạn thực sự muốn chuyển đổi sang màn hình Chính không?"
+
+#: LYMessages.c:415
+msgid "You are already at main screen!"
+msgstr "Bạn ở màn hình chính!"
+
+#. #define NOT_ISINDEX
+#: LYMessages.c:417
+msgid "Not a searchable indexed document -- press '/' to search for a text string"
+msgstr "Không phải một tài liệu có chỉ mục và khả năng tìm kiếm: bấm “/†để tìm kiếm một chuỗi văn bản"
+
+#. #define NO_OWNER
+#: LYMessages.c:419
+msgid "No owner is defined for this file so you cannot send a comment"
+msgstr "Chưa xác định chủ sơ hữu cho tập tin này thì bạn không thể gửi bình luận"
+
+#: LYMessages.c:420
+#, c-format
+msgid "No owner is defined. Use %s?"
+msgstr "Chưa xác định chủ sơ hữu. Dùng %s không?"
+
+#: LYMessages.c:421
+msgid "Do you wish to send a comment?"
+msgstr "Bạn có muốn gửi bình luận không?"
+
+#: LYMessages.c:422
+msgid "Mail is disallowed so you cannot send a comment"
+msgstr "Không cho phép dùng thư vì thế bạn không thể gửi bình luận"
+
+#: LYMessages.c:423
+msgid "The 'e'dit command is currently disabled."
+msgstr "Câu lệnh chỉnh sửa (E) hiện tại bị tắt."
+
+#: LYMessages.c:424
+msgid "External editing is currently disabled."
+msgstr "Chức năng chỉnh sửa bên ngoài hiện tại bị tắt."
+
+#: LYMessages.c:425
+msgid "System error - failure to get status."
+msgstr "Lỗi hệ thống — lỗi lấy trạng thái."
+
+#: LYMessages.c:426
+msgid "No editor is defined!"
+msgstr "Chưa xác định trình soạn thảo!"
+
+#: LYMessages.c:427
+msgid "The 'p'rint command is currently disabled."
+msgstr "Câu lệnh in ẩn (P) hiện tại bị tắt."
+
+#: LYMessages.c:428
+msgid "Document has no Toolbar links or Banner."
+msgstr "Tài liệu không có liên kết Thanh công cụ hoặc Băng cá»."
+
+#: LYMessages.c:429
+msgid "Unable to open traversal file."
+msgstr "Không thể mở tập tin theo cây."
+
+#: LYMessages.c:430
+msgid "Unable to open traversal found file."
+msgstr "Không thể mở tập tin đã tìm theo cây."
+
+#: LYMessages.c:431
+msgid "Unable to open reject file."
+msgstr "Không thể mở tập tin từ chối."
+
+#: LYMessages.c:432
+msgid "Unable to open traversal errors output file"
+msgstr "Không thể mở tập tin kết xuất lỗi theo cây"
+
+#: LYMessages.c:433
+msgid "TRAVERSAL WAS INTERRUPTED"
+msgstr "TIẾN TRÃŒNH THEO CÂY ÄÃ BỊ GIÃN ÄOẠN"
+
+#: LYMessages.c:434
+msgid "Follow link (or goto link or page) number: "
+msgstr "Äi theo liên kết (hoặc Ä‘i tá»›i liên kết hay trang) số: "
+
+#: LYMessages.c:435
+msgid "Select option (or page) number: "
+msgstr "Chá»n tùy chá»n (hoặc trang) số: "
+
+#: LYMessages.c:436
+#, c-format
+msgid "Option number %d already is current."
+msgstr "Tùy chá»n số %d không cần cập nhật."
+
+#. #define ALREADY_AT_OPTION_END
+#: LYMessages.c:438
+msgid "You are already at the end of this option list."
+msgstr "Bạn ở cuối của danh sách tùy chá»n này."
+
+#. #define ALREADY_AT_OPTION_BEGIN
+#: LYMessages.c:440
+msgid "You are already at the beginning of this option list."
+msgstr "Bạn ở đầu của danh sách tùy chá»n này."
+
+#. #define ALREADY_AT_OPTION_PAGE
+#: LYMessages.c:442
+#, c-format
+msgid "You are already at page %d of this option list."
+msgstr "Bạn ở trang %d của danh sách tùy chá»n này."
+
+#: LYMessages.c:443
+msgid "You have entered an invalid option number."
+msgstr "Bạn đã nhập má»™t số thứ tá»± tùy chá»n không hợp lệ."
+
+#: LYMessages.c:444
+msgid "** Bad HTML!! Use -trace to diagnose. **"
+msgstr "** HTML xấu!! Dùng “-trace†để chẩn đoán. **"
+
+#: LYMessages.c:445
+msgid "Give name of file to save in"
+msgstr "ÄÆ°a ra tên của tập tin cần lÆ°u vào"
+
+#: LYMessages.c:446
+msgid "Can't save data to file -- please run WWW locally"
+msgstr "Không ghi được dữ liệu vào tập tin — hãy chạy WWW cục bộ"
+
+#: LYMessages.c:447
+msgid "Can't open temporary file!"
+msgstr "Không thể mở tập tin tạm thá»i!"
+
+#: LYMessages.c:448
+msgid "Can't open output file! Cancelling!"
+msgstr "Không thể mở tập tin kết xuất nên thôi!"
+
+#: LYMessages.c:449
+msgid "Execution is disabled."
+msgstr "Chức năng thực hiện bị tắt."
+
+#. #define EXECUTION_DISABLED_FOR_FILE
+#: LYMessages.c:451
+#, c-format
+msgid "Execution is not enabled for this file. See the Options menu (use %s)."
+msgstr "ChÆ°a hiệu lá»±c chức năng thá»±c hiện cho tập tin này. Xem trình Ä‘Æ¡n Tùy chá»n (dùng %s)."
+
+#. #define EXECUTION_NOT_COMPILED
+#: LYMessages.c:453
+msgid "Execution capabilities are not compiled into this version."
+msgstr "Khả năng thực hiện không phải được biên dịch vào phiên bản này."
+
+#: LYMessages.c:454
+msgid "This file cannot be displayed on this terminal."
+msgstr "Tập tin này không thể được hiển thị trên thiết bị cuối này."
+
+#. #define CANNOT_DISPLAY_FILE_D_OR_C
+#: LYMessages.c:456
+msgid "This file cannot be displayed on this terminal: D)ownload, or C)ancel"
+msgstr "Tập tin này không thể được hiển thị trên thiết bị cuối này: [D] Tải vỠ[C] Thôi"
+
+#: LYMessages.c:457
+#, c-format
+msgid "%s D)ownload, or C)ancel"
+msgstr "%s [D] Tải vỠ[C] Thôi"
+
+#: LYMessages.c:458
+msgid "Cancelling file."
+msgstr "Äang hủy bá» tập tin."
+
+#: LYMessages.c:459
+msgid "Retrieving file. - PLEASE WAIT -"
+msgstr "Äang lấy tập tin — HÃY ÄỢI —"
+
+#: LYMessages.c:460
+msgid "Enter a filename: "
+msgstr "Nhập tên tập tin: "
+
+#: LYMessages.c:461
+msgid "Edit the previous filename: "
+msgstr "Sửa tên tập tin trước: "
+
+#: LYMessages.c:462
+msgid "Edit a previous filename: "
+msgstr "Sửa một tên tập tin trước: "
+
+#: LYMessages.c:463
+msgid "Enter a new filename: "
+msgstr "Nhập tên tập tin mới: "
+
+#: LYMessages.c:464
+msgid "File name may not begin with a dot."
+msgstr "Tên tập tin không được bắt đầu với một dấu chấm."
+
+#: LYMessages.c:466
+msgid "File exists. Create higher version?"
+msgstr "Tập tin đã có. Tạo một phiên bản mới hơn?"
+
+#: LYMessages.c:468
+msgid "File exists. Overwrite?"
+msgstr "Tập tin đã có. Ghi đè?"
+
+#: LYMessages.c:470
+msgid "Cannot write to file."
+msgstr "Không thể ghi vào tập tin đó."
+
+#: LYMessages.c:471
+msgid "ERROR! - download command is misconfigured."
+msgstr "LỖI! - sai cấu hình câu lệnh tải xuống."
+
+#: LYMessages.c:472
+msgid "Unable to download file."
+msgstr "Không thể tải xuống tập tin."
+
+#: LYMessages.c:473
+msgid "Reading directory..."
+msgstr "Äang Ä‘á»c thÆ° mục…"
+
+#: LYMessages.c:474
+msgid "Building directory listing..."
+msgstr "Äang xây dá»±ng danh sách thÆ° mục…"
+
+#: LYMessages.c:475
+msgid "Saving..."
+msgstr "Äang lÆ°u…"
+
+#: LYMessages.c:476
+#, c-format
+msgid "Could not edit file '%s'."
+msgstr "Không thể chỉnh sá»­a tập tin “%sâ€."
+
+#: LYMessages.c:477
+msgid "Unable to access document!"
+msgstr "Không thể truy cập vào tài liệu!"
+
+#: LYMessages.c:478
+msgid "Could not access file."
+msgstr "Không thể truy cập vào tập tin."
+
+#: LYMessages.c:479
+msgid "Could not access directory."
+msgstr "Không thể truy cập vào thư mục."
+
+#: LYMessages.c:480
+msgid "Could not load data."
+msgstr "Không thể tải dữ liệu."
+
+#. #define CANNOT_EDIT_REMOTE_FILES
+#: LYMessages.c:482
+msgid "Lynx cannot currently (e)dit remote WWW files."
+msgstr "Hiện tại Lynx không thể chỉnh sửa (E) tập tin WWW từ xa."
+
+#. #define CANNOT_EDIT_FIELD
+#: LYMessages.c:484
+msgid "This field cannot be (e)dited with an external editor."
+msgstr "TrÆ°á»ng này không được chỉnh sá»­a (E) bằng trình soạn thảo bên ngoài."
+
+#: LYMessages.c:485
+msgid "Bad rule"
+msgstr "Quy tắc sai"
+
+#: LYMessages.c:486
+msgid "Insufficient operands:"
+msgstr "Không đủ toán hạng:"
+
+#: LYMessages.c:487
+msgid "You are not authorized to edit this file."
+msgstr "Bạn không có quyá»n chỉnh sá»­a tập tin này."
+
+#: LYMessages.c:488
+msgid "Title: "
+msgstr "Tá»±a Ä‘á»: "
+
+#: LYMessages.c:489
+msgid "Subject: "
+msgstr "Chủ Ä‘á»: "
+
+#: LYMessages.c:490
+msgid "Username: "
+msgstr "Tên ngÆ°á»i dùng: "
+
+#: LYMessages.c:491
+msgid "Password: "
+msgstr "Mật khẩu: "
+
+#: LYMessages.c:492
+msgid "lynx: Username and Password required!!!"
+msgstr "lynx: cần thiết Tên ngÆ°á»i dùng và Mật khẩu!!!"
+
+#: LYMessages.c:493
+msgid "lynx: Password required!!!"
+msgstr "lynx: cần thiết Mật khẩu!!!"
+
+#: LYMessages.c:494
+msgid "Clear all authorization info for this session?"
+msgstr "Xóa tất cả thông tin xác thực cho phiên chạy này không?"
+
+#: LYMessages.c:495
+msgid "Authorization info cleared."
+msgstr "Thông tin xác thực đã bị xóa."
+
+#: LYMessages.c:496
+msgid "Authorization failed. Retry?"
+msgstr "Lỗi xác thực. Thử lại?"
+
+#: LYMessages.c:497
+msgid "cgi support has been disabled."
+msgstr "Hỗ trợ CGI đã bị tắt."
+
+#. #define CGI_NOT_COMPILED
+#: LYMessages.c:499
+msgid "Lynxcgi capabilities are not compiled into this version."
+msgstr "Khả năng Lynxcgi không phải được biên dịch vào phiên bản này."
+
+#: LYMessages.c:500
+#, c-format
+msgid "Sorry, no known way of converting %s to %s."
+msgstr "Tiếc là không có cách đã biết để chuyển đổi %s sang %s."
+
+#: LYMessages.c:501
+msgid "Unable to set up connection."
+msgstr "Không thể cài đặt kết nối."
+
+#: LYMessages.c:502
+msgid "Unable to make connection"
+msgstr "Không thể tạo kết nối"
+
+#. #define MALFORMED_EXEC_REQUEST
+#: LYMessages.c:504
+msgid "Executable link rejected due to malformed request."
+msgstr "Liên kết có khả năng thực hiện đã bị từ chối do yêu cầu dạng sai."
+
+#. #define BADCHAR_IN_EXEC_LINK
+#: LYMessages.c:506
+#, c-format
+msgid "Executable link rejected due to `%c' character."
+msgstr "Liên kết có khả năng thá»±c hiện đã bị từ chối do ký tá»± “%câ€."
+
+#. #define RELPATH_IN_EXEC_LINK
+#: LYMessages.c:508
+msgid "Executable link rejected due to relative path string ('../')."
+msgstr "Liên kết có khả năng thá»±c hiện đã bị từ chối do chuá»—i Ä‘Æ°á»ng dẫn tÆ°Æ¡ng đối (â€../â€)."
+
+#. #define BADLOCPATH_IN_EXEC_LINK
+#: LYMessages.c:510
+msgid "Executable link rejected due to location or path."
+msgstr "Liên kết có khả năng thá»±c hiện đã bị từ chối do vị trí hay Ä‘Æ°á»ng dẫn."
+
+#: LYMessages.c:511
+msgid "Mail access is disabled!"
+msgstr "Truy cập thư bị tắt!"
+
+#. #define ACCESS_ONLY_LOCALHOST
+#: LYMessages.c:513
+msgid "Only files and servers on the local host can be accessed."
+msgstr "Chỉ truy cập được tới những tập tin và máy phục vụ trên máy cục bộ."
+
+#: LYMessages.c:514
+msgid "Telnet access is disabled!"
+msgstr "Truy cập Telnet bị tắt!"
+
+#. #define TELNET_PORT_SPECS_DISABLED
+#: LYMessages.c:516
+msgid "Telnet port specifications are disabled."
+msgstr "Äặc tả cổng Telnet bị tắt."
+
+#: LYMessages.c:517
+msgid "USENET news access is disabled!"
+msgstr "Truy cập mạng bài tin USENET bị tắt!"
+
+#: LYMessages.c:518
+msgid "Rlogin access is disabled!"
+msgstr "Truy cập Rlogin bị tắt!"
+
+#: LYMessages.c:519
+msgid "Ftp access is disabled!"
+msgstr "Truy cập FTP bị tắt!"
+
+#: LYMessages.c:520
+msgid "There are no references from this document."
+msgstr "Không có tham chiếu từ tài liệu này."
+
+#: LYMessages.c:521
+msgid "There are only hidden links from this document."
+msgstr "Chỉ có liên kết bị ẩn từ tài liệu này."
+
+#: LYMessages.c:523
+msgid "Unable to open command file."
+msgstr "Không thể mở tập tin lệnh."
+
+#: LYMessages.c:525
+msgid "News Post Cancelled!!!"
+msgstr "Äã dừng gá»­i bài tin!!!"
+
+#. #define SPAWNING_EDITOR_FOR_NEWS
+#: LYMessages.c:527
+msgid "Spawning your selected editor to edit news message"
+msgstr "Äang tạo và thá»±c hiện trình soạn thảo đã chá»n để chỉnh sá»­a bài tin"
+
+#: LYMessages.c:528
+msgid "Post this message?"
+msgstr "Gửi bài này?"
+
+#: LYMessages.c:529
+#, c-format
+msgid "Append '%s'?"
+msgstr "Nối thêm “%s�"
+
+#: LYMessages.c:530
+msgid "Posting to newsgroup(s)..."
+msgstr "Äang gá»­i cho nhóm tin…"
+
+#: LYMessages.c:532
+msgid "*** You have unread mail. ***"
+msgstr "*** Bạn có thÆ° chÆ°a Ä‘á»c. ***"
+
+#: LYMessages.c:534
+msgid "*** You have mail. ***"
+msgstr "*** Bạn có thư. ***"
+
+#: LYMessages.c:536
+msgid "*** You have new mail. ***"
+msgstr "*** Bạn có thư mới. ***"
+
+#: LYMessages.c:537
+msgid "File insert cancelled!!!"
+msgstr "Äã dừng chèn tập tin!!!"
+
+#: LYMessages.c:538
+msgid "Not enough memory for file!"
+msgstr "Không đủ bộ nhớ cho tập tin!"
+
+#: LYMessages.c:539
+msgid "Can't open file for reading."
+msgstr "Không thể mở tập tin để Ä‘á»c."
+
+#: LYMessages.c:540
+msgid "File does not exist."
+msgstr "Tập tin không tồn tại."
+
+#: LYMessages.c:541
+msgid "File does not exist - reenter or cancel:"
+msgstr "Tập tin không tồn tại — nhập lại hoặc thôi:"
+
+#: LYMessages.c:542
+msgid "File is not readable."
+msgstr "Tập tin không có khả năng Ä‘á»c."
+
+#: LYMessages.c:543
+msgid "File is not readable - reenter or cancel:"
+msgstr "Tập tin không có khả năng Ä‘á»c — nhập lại hoặc thôi:"
+
+#: LYMessages.c:544
+msgid "Nothing to insert - file is 0-length."
+msgstr "Không có gì để chèn - tập tin có chiá»u dài 0."
+
+#: LYMessages.c:545
+msgid "Save request cancelled!!!"
+msgstr "Äã dừng yêu cầu lÆ°u!!!"
+
+#: LYMessages.c:546
+msgid "Mail request cancelled!!!"
+msgstr "Äã dừng yêu cầu thÆ° tín!!!"
+
+#. #define CONFIRM_MAIL_SOURCE_PREPARSED
+#: LYMessages.c:548
+msgid "Viewing preparsed source. Are you sure you want to mail it?"
+msgstr "Äang xem mã nguồn đã phân tích sẵn. Bạn có chắc muốn gá»­i nó đính kèm thÆ° không?"
+
+#: LYMessages.c:549
+msgid "Please wait..."
+msgstr "Hãy đợi…"
+
+#: LYMessages.c:550
+msgid "Mailing file. Please wait..."
+msgstr "Äang gá»­i tập tin đính kèm thÆ°. Hãy đợi…"
+
+#: LYMessages.c:551
+msgid "ERROR - Unable to mail file"
+msgstr "LỖI — Không thể gửi tập tin đính kèm thư"
+
+#. #define CONFIRM_LONG_SCREEN_PRINT
+#: LYMessages.c:553
+#, c-format
+msgid "File is %d screens long. Are you sure you want to print?"
+msgstr "Tập tin có chiá»u dài %d màn hình. Bạn có chắc muốn in không?"
+
+#: LYMessages.c:554
+msgid "Print request cancelled!!!"
+msgstr "Äã dừng yêu cầu in!!!"
+
+#: LYMessages.c:555
+msgid "Press <return> to begin: "
+msgstr "Bấm <Enter> để bắt đầu: "
+
+#: LYMessages.c:556
+msgid "Press <return> to finish: "
+msgstr "Bấm <Enter> để kết thúc: "
+
+#. #define CONFIRM_LONG_PAGE_PRINT
+#: LYMessages.c:558
+#, c-format
+msgid "File is %d pages long. Are you sure you want to print?"
+msgstr "Tập tin có chiá»u dài %d trang. Bạn có chắc muốn in không?"
+
+#. #define CHECK_PRINTER
+#: LYMessages.c:560
+msgid "Be sure your printer is on-line. Press <return> to start printing:"
+msgstr "Kiểm tra xem máy in đã kết nối và đang chạy. Bấm <Enter> để bắt đầu in:"
+
+#: LYMessages.c:561
+msgid "ERROR - Unable to allocate file space!!!"
+msgstr "LỖI — Không thể không gian đĩa chứa tập tin!!!"
+
+#: LYMessages.c:562
+msgid "Unable to open tempfile"
+msgstr "Không thể mở tập tin tạm thá»i"
+
+#: LYMessages.c:563
+msgid "Unable to open print options file"
+msgstr "Không thể mở tập tin tùy chá»n in"
+
+#: LYMessages.c:564
+msgid "Printing file. Please wait..."
+msgstr "Äang in tập tin. Hãy đợi…"
+
+#: LYMessages.c:565
+msgid "Please enter a valid internet mail address: "
+msgstr "Hãy nhập một địa chỉ thư điện tử Internet hợp lệ: "
+
+#: LYMessages.c:566
+msgid "ERROR! - printer is misconfigured!"
+msgstr "LỖI — máy in bị cấu hình sai!"
+
+#: LYMessages.c:567
+msgid "Image map from POST response not available!"
+msgstr "Không có sẵn sÆ¡ đồ ảnh từ trả lá»i POST!"
+
+#: LYMessages.c:568
+msgid "Misdirected client-side image MAP request!"
+msgstr "Yêu cầu MAP (sơ đồ) ảnh bên khách bị hướng sai!"
+
+#: LYMessages.c:569
+msgid "Client-side image MAP is not accessible!"
+msgstr "MAP (sơ đồ) ảnh bên khách không thể truy cập được!"
+
+#: LYMessages.c:570
+msgid "No client-side image MAPs are available!"
+msgstr "Không có sẵn MAP (sơ đồ) ảnh nào bên khách!"
+
+#: LYMessages.c:571
+msgid "Client-side image MAP is not available!"
+msgstr "MAP (sơ đồ) ảnh bên khách không sẵn sàng!"
+
+#. #define OPTION_SCREEN_NEEDS_24
+#: LYMessages.c:574
+msgid "Screen height must be at least 24 lines for the Options menu!"
+msgstr "Chiá»u cao màn hình phải ít nhất là 24 dòng cho trình Ä‘Æ¡n Tùy chá»n!"
+
+#. #define OPTION_SCREEN_NEEDS_23
+#: LYMessages.c:576
+msgid "Screen height must be at least 23 lines for the Options menu!"
+msgstr "Chiá»u cao màn hình phải ít nhất là 23 dòng cho trình Ä‘Æ¡n Tùy chá»n!"
+
+#. #define OPTION_SCREEN_NEEDS_22
+#: LYMessages.c:578
+msgid "Screen height must be at least 22 lines for the Options menu!"
+msgstr "Chiá»u cao màn hình phải ít nhất là 22 dòng cho trình Ä‘Æ¡n Tùy chá»n!"
+
+#: LYMessages.c:580
+msgid "That key requires Advanced User mode."
+msgstr "Phím đó yêu cầu chế Ä‘á»™ NgÆ°á»i dùng Cắp cao."
+
+#: LYMessages.c:581
+#, c-format
+msgid "Content-type: %s"
+msgstr "Kiểu nội dung: %s"
+
+#: LYMessages.c:582
+msgid "Command: "
+msgstr "Câu lệnh: "
+
+#: LYMessages.c:583
+msgid "Unknown or ambiguous command"
+msgstr "Lệnh không rõ hoặc mơ hồ"
+
+#: LYMessages.c:584
+msgid " Version "
+msgstr " Phiên bản "
+
+#: LYMessages.c:585
+msgid " first"
+msgstr " đầu tiên"
+
+#: LYMessages.c:586
+msgid ", guessing..."
+msgstr ", đoán là…"
+
+#: LYMessages.c:587
+msgid "Permissions for "
+msgstr "Quyá»n hạn cho "
+
+#: LYMessages.c:588
+msgid "Select "
+msgstr "Chá»n "
+
+#: LYMessages.c:589
+msgid "capital letter"
+msgstr "chữ hoa"
+
+#: LYMessages.c:590
+msgid " of option line,"
+msgstr " của dòng tùy chá»n,"
+
+#: LYMessages.c:591
+msgid " to save,"
+msgstr " để lưu,"
+
+#: LYMessages.c:592
+msgid " to "
+msgstr " tá»›i "
+
+#: LYMessages.c:593
+msgid " or "
+msgstr " hoặc "
+
+#: LYMessages.c:594
+msgid " index"
+msgstr " chỉ mục"
+
+#: LYMessages.c:595
+msgid " to return to Lynx."
+msgstr " để trở vỠLynx."
+
+#: LYMessages.c:596
+msgid "Accept Changes"
+msgstr "Äồng ý vá»›i thay đổi"
+
+#: LYMessages.c:597
+msgid "Reset Changes"
+msgstr "Äặt lại thay đổi"
+
+#: LYMessages.c:598
+msgid "Left Arrow cancels changes"
+msgstr "Phím mũi tên bên trái thì hủy thay đổi"
+
+#: LYMessages.c:599
+msgid "Save options to disk"
+msgstr "LÆ°u tùy chá»n vào Ä‘Ä©a"
+
+#: LYMessages.c:600
+msgid "Hit RETURN to accept entered data."
+msgstr "Gõ Enter để chấp nhận dữ liệu đã nhập."
+
+#. #define ACCEPT_DATA_OR_DEFAULT
+#: LYMessages.c:602
+msgid "Hit RETURN to accept entered data. Delete data to invoke the default."
+msgstr "Gõ Enter để chấp nhận dữ liệu đã nhập. Xóa dữ liệu để gá»i giá trị mặc định."
+
+#: LYMessages.c:603
+msgid "Value accepted!"
+msgstr "Giá trị được chấp nhận!"
+
+#. #define VALUE_ACCEPTED_WARNING_X
+#: LYMessages.c:605
+msgid "Value accepted! -- WARNING: Lynx is configured for XWINDOWS!"
+msgstr "Äã chấp nhận giá trị! -- CẢNH BÃO: Lynx được cấu hình cho XWINDOWS!"
+
+#. #define VALUE_ACCEPTED_WARNING_NONX
+#: LYMessages.c:607
+msgid "Value accepted! -- WARNING: Lynx is NOT configured for XWINDOWS!"
+msgstr "Äã chấp nhận giá trị! -- CẢNH BÃO: Lynx không được cấu hình cho XWINDOWS!"
+
+#: LYMessages.c:608
+msgid "You are not allowed to change which editor to use!"
+msgstr "Bạn không có quyá»n thay đổi trình soạn thảo cần dùng!"
+
+#: LYMessages.c:609
+msgid "Failed to set DISPLAY variable!"
+msgstr "Lỗi đặt biến DISPLAY (trình bày)!"
+
+#: LYMessages.c:610
+msgid "Failed to clear DISPLAY variable!"
+msgstr "Lá»—i dá»n biến DISPLAY (trình bày)!"
+
+#. #define BOOKMARK_CHANGE_DISALLOWED
+#: LYMessages.c:612
+msgid "You are not allowed to change the bookmark file!"
+msgstr "Bạn không có quyá»n thay đổi tập tin Äánh dấu!"
+
+#: LYMessages.c:613
+msgid "Terminal does not support color"
+msgstr "Thiết bị cuối không hỗ trợ màu sắc"
+
+#: LYMessages.c:614
+#, c-format
+msgid "Your '%s' terminal does not support color."
+msgstr "Thiết bị cuối “%s†của bạn không hỗ trợ màu sắc."
+
+#: LYMessages.c:615
+msgid "Access to dot files is disabled!"
+msgstr "Truy cập vào tập tin “chấm†đã bị tắt!"
+
+#. #define UA_NO_LYNX_WARNING
+#: LYMessages.c:617
+msgid "User-Agent string does not contain \"Lynx\" or \"L_y_n_x\""
+msgstr "Chuá»—i User-Agent không chứa “Lynx†hay “L_y_n_xâ€"
+
+#. #define UA_PLEASE_USE_LYNX
+#: LYMessages.c:619
+msgid "Use \"L_y_n_x\" or \"Lynx\" in User-Agent, or it looks like intentional deception!"
+msgstr "Hãy dùng “L_y_n_x†hay “Lynx†trong User-Agent; không thì hình như bạn lừa dối!"
+
+#. #define UA_CHANGE_DISABLED
+#: LYMessages.c:621
+msgid "Changing of the User-Agent string is disabled!"
+msgstr "Chức năng thay đổi chuỗi User-Agent đã bị tắt!"
+
+#. #define CHANGE_OF_SETTING_DISALLOWED
+#: LYMessages.c:623
+msgid "You are not allowed to change this setting."
+msgstr "Bạn không có quyá»n thay đổi cài đặt này."
+
+#: LYMessages.c:624
+msgid "Saving Options..."
+msgstr "Äang lÆ°u Tùy chá»n…"
+
+#: LYMessages.c:625
+msgid "Options saved!"
+msgstr "Các tùy chá»n đã được lÆ°u!"
+
+#: LYMessages.c:626
+msgid "Unable to save Options!"
+msgstr "Không thể lÆ°u Tùy chá»n!"
+
+#: LYMessages.c:627
+msgid " 'r' to return to Lynx "
+msgstr " Bấm “r†để trở vỠLynx "
+
+#: LYMessages.c:628
+msgid " '>' to save, or 'r' to return to Lynx "
+msgstr " [>] lưu ; [r] trở vỠLynx "
+
+#. #define ANY_KEY_CHANGE_RET_ACCEPT
+#: LYMessages.c:630
+msgid "Hit any key to change value; RETURN to accept."
+msgstr "Gõ phím bất kỳ để thay đổi giá trị, Enter để chấp nhận."
+
+#: LYMessages.c:631
+msgid "Error uncompressing temporary file!"
+msgstr "Gặp lá»—i khi giải nén tập tin tạm thá»i!"
+
+#: LYMessages.c:632
+msgid "Unsupported URL scheme!"
+msgstr "Lược đồ URL không được hỗ trợ!"
+
+#: LYMessages.c:633
+msgid "Unsupported data: URL! Use SHOWINFO, for now."
+msgstr "Dữ liệu không há»— trợ: URL! Tạm thá»i hãy dùng SHOWINFO."
+
+#: LYMessages.c:634
+#, c-format
+msgid "Redirection limit of %d URL's reached."
+msgstr "Tới giới hạn chuyển hướng %d địa chỉ URL."
+
+#: LYMessages.c:635
+msgid "Illegal redirection URL received from server!"
+msgstr "Äịa chỉ URL chuyển hÆ°á»›ng cấm được nhận từ máy phục vụ!"
+
+#. #define SERVER_ASKED_FOR_REDIRECTION
+#: LYMessages.c:637
+#, c-format
+msgid "Server asked for %d redirection of POST content to"
+msgstr "Máy phục vụ yêu cầu chuyển hướng %d của nội dung POST tới"
+
+#: LYMessages.c:640
+msgid "P)roceed, use G)ET or C)ancel "
+msgstr "Tiế[P] tục; [G] lấy hoặc [C] thôi "
+
+#: LYMessages.c:641
+msgid "P)roceed, or C)ancel "
+msgstr "Tiế[P] tục hoặc [C] thôi "
+
+#. #define ADVANCED_POST_GET_REDIRECT
+#: LYMessages.c:643
+msgid "Redirection of POST content. P)roceed, see U)RL, use G)ET or C)ancel"
+msgstr "Chuyển hướng nội dung POST. tiế[P] tục, xem [U]RL, [G] lấy, [C] thôi"
+
+#. #define ADVANCED_POST_REDIRECT
+#: LYMessages.c:645
+msgid "Redirection of POST content. P)roceed, see U)RL, or C)ancel"
+msgstr "Chuyển hướng nội dung POST. tiế[P] tục, xem [U]RL, [C] thôi"
+
+#. #define CONFIRM_POST_RESUBMISSION
+#: LYMessages.c:647
+msgid "Document from Form with POST content. Resubmit?"
+msgstr "Tài liệu từ Biểu mẫu với nội dung POST. Gửi lại?"
+
+#. #define CONFIRM_POST_RESUBMISSION_TO
+#: LYMessages.c:649
+#, c-format
+msgid "Resubmit POST content to %s ?"
+msgstr "Gửi lại nội dung POST tới %s?"
+
+#. #define CONFIRM_POST_LIST_RELOAD
+#: LYMessages.c:651
+#, c-format
+msgid "List from document with POST data. Reload %s ?"
+msgstr "Danh sách từ tài liệu có dữ liệu POST. Nạp lại %s?"
+
+#. #define CONFIRM_POST_DOC_HEAD
+#: LYMessages.c:653
+msgid "Document from POST action, HEAD may not be understood. Proceed?"
+msgstr "Tài liệu từ hành động POST, có thể không hiểu HEAD. Tiếp tục?"
+
+#. #define CONFIRM_POST_LINK_HEAD
+#: LYMessages.c:655
+msgid "Form submit action is POST, HEAD may not be understood. Proceed?"
+msgstr "Hành động gửi đi biểu mẫu là POST, có thể không hiểu HEAD. Tiếp tục?"
+
+#: LYMessages.c:656
+msgid "Proceed without a username and password?"
+msgstr "Tiếp tục mà không có tên ngÆ°á»i dùng và mật khẩu?"
+
+#: LYMessages.c:657
+#, c-format
+msgid "Proceed (%s)?"
+msgstr "Tiếp tục (%s)?"
+
+#: LYMessages.c:658
+msgid "Cannot POST to this host."
+msgstr "Không thể POST (gửi) cho máy chủ này."
+
+#: LYMessages.c:659
+msgid "POST not supported for this URL - ignoring POST data!"
+msgstr "Không hỗ trợ POST cho địa chỉ URL này thì bỠqua dữ liệu POST!"
+
+#: LYMessages.c:660
+msgid "Discarding POST data..."
+msgstr "Äang hủy dữ liệu POST…"
+
+#: LYMessages.c:661
+msgid "Document will not be reloaded!"
+msgstr "Tài liệu sẽ không được tải lại!"
+
+#: LYMessages.c:662
+msgid "Location: "
+msgstr "Vị trí: "
+
+#: LYMessages.c:663
+#, c-format
+msgid "'%s' not found!"
+msgstr "Không tìm thấy “%sâ€!"
+
+#: LYMessages.c:664
+msgid "Default Bookmark File"
+msgstr "Tập tin Äánh dấu mặc định"
+
+#: LYMessages.c:665
+msgid "Screen too small! (8x35 min)"
+msgstr "Màn hình quá nhỠ(tối thiểu 8×35)"
+
+#: LYMessages.c:666
+msgid "Select destination or ^G to Cancel: "
+msgstr "Chá»n đích đến hoặc ^G để thôi: "
+
+#. #define MULTIBOOKMARKS_SELECT
+#: LYMessages.c:668
+msgid "Select subbookmark, '=' for menu, or ^G to cancel: "
+msgstr "Chá»n Äánh dấu con, “=†cho trình Ä‘Æ¡n, hoặc ^G để thôi: "
+
+#. #define MULTIBOOKMARKS_SELF
+#: LYMessages.c:670
+msgid "Reproduce L)ink in this bookmark file or C)ancel? (l,c): "
+msgstr "Tạo lại liên kết trong tập tin Äánh dấu này (L) hoặc thôi (C): "
+
+#: LYMessages.c:671
+msgid "Multiple bookmark support is not available."
+msgstr "Chức năng há»— trợ Ä‘a Äánh dấu không sẵn sàng."
+
+#: LYMessages.c:672
+#, c-format
+msgid " Select Bookmark (screen %d of %d)"
+msgstr " Chá»n Äánh dấu (màn hình %d trên %d)"
+
+#: LYMessages.c:673
+msgid " Select Bookmark"
+msgstr " Chá»n Äánh dấu"
+
+#. #define MULTIBOOKMARKS_EHEAD_MASK
+#: LYMessages.c:675
+#, c-format
+msgid "Editing Bookmark DESCRIPTION and FILEPATH (%d of 2)"
+msgstr "Äang sá»­a MÔ TẢ và ÄƯỜNG DẪN của Äánh dấu (%d trên 2)"
+
+#. #define MULTIBOOKMARKS_EHEAD
+#: LYMessages.c:677
+msgid " Editing Bookmark DESCRIPTION and FILEPATH"
+msgstr " Äang sá»­a MÔ TẢ và ÄƯỜNG DẪN của Äánh dấu"
+
+#: LYMessages.c:678
+msgid "Letter: "
+msgstr "Chữ: "
+
+#. #define USE_PATH_OFF_HOME
+#: LYMessages.c:681
+msgid "Use a filepath off your login directory in SHELL syntax!"
+msgstr "Sá»­ dụng má»™t Ä‘Æ°á»ng dẫn bắt nguồn từ thÆ° mục đăng nhập trong ngữ pháp SHELL (trình bao)!"
+
+#: LYMessages.c:683
+msgid "Use a filepath off your home directory!"
+msgstr "Sá»­ dụng má»™t Ä‘Æ°á»ng dẫn bắt nguồn từ thÆ° mục nhà!"
+
+#. #define MAXLINKS_REACHED
+#: LYMessages.c:686
+msgid "Maximum links per page exceeded! Use half-page or two-line scrolling."
+msgstr "Vượt quá số liên kết cho phép mỗi trang! Hãy sử dụng chức năng cuộn theo nửa trang hay hai dòng."
+
+#: LYMessages.c:687
+msgid "No previously visited links available!"
+msgstr "Không có sẵn liên kết đã thăm trước!"
+
+#: LYMessages.c:688
+msgid "Memory exhausted! Program aborted!"
+msgstr "Hết bá»™ nhá»›. ChÆ°Æ¡ng trình bị hủy bá»!"
+
+#: LYMessages.c:689
+msgid "Memory exhausted! Aborting..."
+msgstr "Hết bá»™ nhá»›. Äang hủy bá»â€¦"
+
+#: LYMessages.c:690
+msgid "Not enough memory!"
+msgstr "Không đủ bộ nhớ!"
+
+#: LYMessages.c:691
+msgid "Directory/File Manager not available"
+msgstr "Bộ Quản lý Thư mục/Tập tin không sẵn sàng"
+
+#: LYMessages.c:692
+msgid "Location URL is not absolute."
+msgstr "Äịa chỉ URL định vị không phải là tuyệt đối."
+
+#: LYMessages.c:693
+msgid "Refresh URL is not absolute."
+msgstr "Äịa chỉ URL cập nhật không phải là tuyệt đối."
+
+#. #define SENDING_MESSAGE_WITH_BODY_TO
+#: LYMessages.c:695
+msgid ""
+"You are sending a message with body to:\n"
+" "
+msgstr ""
+"Bạn đang gửi một thư có thân cho:\n"
+" "
+
+#: LYMessages.c:696
+msgid ""
+"You are sending a comment to:\n"
+" "
+msgstr ""
+"Bạn đang gửi một bình luận cho:\n"
+" "
+
+#: LYMessages.c:697
+msgid ""
+"\n"
+" With copy to:\n"
+" "
+msgstr ""
+"\n"
+" Cũng sao chép cho:\n"
+" "
+
+#: LYMessages.c:698
+msgid ""
+"\n"
+" With copies to:\n"
+" "
+msgstr ""
+"\n"
+" Cũng sao chép cho:\n"
+" "
+
+#. #define CTRL_G_TO_CANCEL_SEND
+#: LYMessages.c:700
+msgid ""
+"\n"
+"\n"
+"Use Ctrl-G to cancel if you do not want to send a message\n"
+msgstr ""
+"\n"
+"\n"
+"Dùng Ctrl-G để thôi nếu bạn không muốn gửi thư\n"
+
+#. #define ENTER_NAME_OR_BLANK
+#: LYMessages.c:702
+msgid ""
+"\n"
+" Please enter your name, or leave it blank to remain anonymous\n"
+msgstr ""
+"\n"
+" Hãy nhập tên của bạn, hoặc để trống (nặc danh)\n"
+
+#. #define ENTER_MAIL_ADDRESS_OR_OTHER
+#: LYMessages.c:704
+msgid ""
+"\n"
+" Please enter a mail address or some other\n"
+msgstr ""
+"\n"
+" Hãy nhập địa chỉ thư điện tử hoặc một phương pháp\n"
+
+#. #define MEANS_TO_CONTACT_FOR_RESPONSE
+#: LYMessages.c:706
+msgid " means to contact you, if you desire a response.\n"
+msgstr " khác để liên hệ vá»›i bạn, nếu mong muốn thÆ° trả lá»i.\n"
+
+#: LYMessages.c:707
+msgid ""
+"\n"
+" Please enter a subject line.\n"
+msgstr ""
+"\n"
+" Hãy nhập dòng chủ Ä‘á».\n"
+
+#. #define ENTER_ADDRESS_FOR_CC
+#: LYMessages.c:709
+msgid ""
+"\n"
+" Enter a mail address for a CC of your message.\n"
+msgstr ""
+"\n"
+" Hãy nhập địa chỉ thư điện tử cho đó cần sao chép (CC) thư này.\n"
+
+#: LYMessages.c:710
+msgid " (Leave blank if you don't want a copy.)\n"
+msgstr " (BỠrỗng nếu bạn không muốn sao chép.)\n"
+
+#: LYMessages.c:711
+msgid ""
+"\n"
+" Please review the message body:\n"
+"\n"
+msgstr ""
+"\n"
+" Hãy xem lại thân của thư:\n"
+
+#: LYMessages.c:712
+msgid ""
+"\n"
+"Press RETURN to continue: "
+msgstr ""
+"\n"
+" Bấm phím Enter để tiếp tục: "
+
+#: LYMessages.c:713
+msgid ""
+"\n"
+"Press RETURN to clean up: "
+msgstr ""
+"\n"
+"Bấm Enter để làm sạch: "
+
+#: LYMessages.c:714
+msgid " Use Control-U to erase the default.\n"
+msgstr " Bấm Ctrl-U để xóa giá trị mặc định.\n"
+
+#: LYMessages.c:715
+msgid ""
+"\n"
+" Please enter your message below."
+msgstr ""
+"\n"
+" Hãy nhập thông điệp bên dưới."
+
+#. #define ENTER_PERIOD_WHEN_DONE_A
+#: LYMessages.c:717 src/LYNews.c:360
+msgid ""
+"\n"
+" When you are done, press enter and put a single period (.)"
+msgstr ""
+"\n"
+" Khi hoàn thành, bấm Enter và gõ một dấu chấm (.)"
+
+#. #define ENTER_PERIOD_WHEN_DONE_B
+#: LYMessages.c:719 src/LYNews.c:361
+msgid ""
+"\n"
+" on a line and press enter again."
+msgstr ""
+"\n"
+" trên một dòng, rồi bấm lại phím Enter."
+
+#. Cookies messages
+#. #define ADVANCED_COOKIE_CONFIRMATION
+#: LYMessages.c:723
+#, c-format
+msgid "%s cookie: %.*s=%.*s Allow? (Y/N/Always/neVer)"
+msgstr "%s cookie: %.*s=%.*s Cho phép? (Có/Không/Luôn luôn/khônG bao giá»)"
+
+#. #define INVALID_COOKIE_DOMAIN_CONFIRMATION
+#: LYMessages.c:725
+#, c-format
+msgid "Accept invalid cookie domain=%s for '%s'?"
+msgstr "Chấp nhận miá»n cookie không hợp lệ = %s cho %s không?"
+
+#. #define INVALID_COOKIE_PATH_CONFIRMATION
+#: LYMessages.c:727
+#, c-format
+msgid "Accept invalid cookie path=%s as a prefix of '%s'?"
+msgstr "Chấp nhận Ä‘Æ°á»ng dẫn cookie không hợp lệ = %s làm tiá»n tố của “%s†không?"
+
+#: LYMessages.c:728
+msgid "Allowing this cookie."
+msgstr "Cho phép cookie này."
+
+#: LYMessages.c:729
+msgid "Rejecting this cookie."
+msgstr "Từ chối cookie này."
+
+#: LYMessages.c:730
+msgid "The Cookie Jar is empty."
+msgstr "Hộp cookie là rỗng."
+
+#: LYMessages.c:731
+msgid "The Cache Jar is empty."
+msgstr "Hộp lưu tạm là rỗng."
+
+#. #define ACTIVATE_TO_GOBBLE
+#: LYMessages.c:733
+msgid "Activate links to gobble up cookies or entire domains,"
+msgstr "Kích hoạt liên kết để lấy cookie hoặc cả miá»n,"
+
+#: LYMessages.c:734
+msgid "or to change a domain's 'allow' setting."
+msgstr "hoặc thay đổi cài đặt “cho phép†của má»™t miá»n."
+
+#: LYMessages.c:735
+msgid "(Cookies never allowed.)"
+msgstr "(Không bao giỠcho phép cookie.)"
+
+#: LYMessages.c:736
+msgid "(Cookies always allowed.)"
+msgstr "(Luôn luôn cho phép Cookie.)"
+
+#: LYMessages.c:737
+msgid "(Cookies allowed via prompt.)"
+msgstr "(Cho phép Cookie sau khi xác nhận.)"
+
+#: LYMessages.c:738
+msgid "(Persistent Cookies.)"
+msgstr "(Cookie vĩnh cửu.)"
+
+#: LYMessages.c:739
+msgid "(No title.)"
+msgstr "(Không tên.)"
+
+#: LYMessages.c:740
+msgid "(No name.)"
+msgstr "(Không tên.)"
+
+#: LYMessages.c:741
+msgid "(No value.)"
+msgstr "(Không có giá trị.)"
+
+#: LYMessages.c:742 src/LYOptions.c:2470
+msgid "None"
+msgstr "Không có"
+
+#: LYMessages.c:743
+msgid "(End of session.)"
+msgstr "(Kết thúc phiên chạy.)"
+
+#: LYMessages.c:744
+msgid "Delete this cookie?"
+msgstr "Xóa cookie này không?"
+
+#: LYMessages.c:745
+msgid "The cookie has been eaten!"
+msgstr "Cookie (bánh quy) đã bị ăn!"
+
+#: LYMessages.c:746
+msgid "Delete this empty domain?"
+msgstr "Xóa miá»n rá»—ng này không?"
+
+#: LYMessages.c:747
+msgid "The domain has been eaten!"
+msgstr "Miá»n các cokie (bánh quy) đã bị ăn!"
+
+#. #define DELETE_COOKIES_SET_ALLOW_OR_CANCEL
+#: LYMessages.c:749
+msgid "D)elete domain's cookies, set allow A)lways/P)rompt/neV)er, or C)ancel? "
+msgstr "[D] xóa các cookie của miá»n; đặt cho phép [A] luôn luôn [P] nếu xác nhận [V] không bao giá» ; [C] thôi? "
+
+#. #define DELETE_DOMAIN_SET_ALLOW_OR_CANCEL
+#: LYMessages.c:751
+msgid "D)elete domain, set allow A)lways/P)rompt/neV)er, or C)ancel? "
+msgstr "[D] xóa miá»n; đặt cho phép [A] luôn luôn [P] nếu xác nhận [V] không bao giá»; hoặc [C] thôi? "
+
+#: LYMessages.c:752
+msgid "All cookies in the domain have been eaten!"
+msgstr "Má»i cookie của miá»n này đã bị ăn!"
+
+#: LYMessages.c:753
+#, c-format
+msgid "'A'lways allowing from domain '%s'."
+msgstr "'A' luôn luôn cho phép từ miá»n “%sâ€."
+
+#: LYMessages.c:754
+#, c-format
+msgid "ne'V'er allowing from domain '%s'."
+msgstr "[V] không bao giá» cho phép từ miá»n “%sâ€."
+
+#: LYMessages.c:755
+#, c-format
+msgid "'P'rompting to allow from domain '%s'."
+msgstr "[P] xác nhận thì cho phép từ miá»n “%sâ€."
+
+#: LYMessages.c:756
+msgid "Delete all cookies in this domain?"
+msgstr "Xóa má»i cookie của miá»n này không?"
+
+#: LYMessages.c:757
+msgid "All of the cookies in the jar have been eaten!"
+msgstr "Má»i cookie (bánh quy) trong há»™p đã bị ăn!"
+
+#: LYMessages.c:759
+msgid "Port 19 not permitted in URLs."
+msgstr "Không cho phép địa chỉ URL chứa cổng 19."
+
+#: LYMessages.c:760
+msgid "Port 25 not permitted in URLs."
+msgstr "Không cho phép địa chỉ URL chứa cổng 25."
+
+#: LYMessages.c:761
+#, c-format
+msgid "Port %lu not permitted in URLs."
+msgstr "Không cho phép địa chỉ URL chứa cổng %lu."
+
+#: LYMessages.c:762
+msgid "URL has a bad port field."
+msgstr "Äịa chỉ URL có trÆ°á»ng cổng sai."
+
+#: LYMessages.c:763
+msgid "Maximum nesting of HTML elements exceeded."
+msgstr "Vượt quá số tối đa các phần tử HTML có thể lồng nhau."
+
+#: LYMessages.c:764
+msgid "Bad partial reference! Stripping lead dots."
+msgstr "Tham chiếu bộ phận sai nên loại bỠnhững dấu chấm đứng trước."
+
+#: LYMessages.c:765
+msgid "Trace Log open failed. Trace off!"
+msgstr "Lá»—i mở bản ghi tìm Ä‘Æ°á»ng (trace) thì tắt chức năng tìm Ä‘Æ°á»ng!"
+
+#: LYMessages.c:766
+msgid "Lynx Trace Log"
+msgstr "Bản ghi Tìm Ä‘Æ°á»ng Lynx"
+
+#: LYMessages.c:767
+msgid "No trace log has been started for this session."
+msgstr "ChÆ°a khởi chạy bản ghi tìm Ä‘Æ°á»ng cho phiên chạy này."
+
+#. #define MAX_TEMPCOUNT_REACHED
+#: LYMessages.c:769
+msgid "The maximum temporary file count has been reached!"
+msgstr "Äã đặt tá»›i số tối Ä‘a các tập tin tạm thá»i!"
+
+#. #define FORM_VALUE_TOO_LONG
+#: LYMessages.c:771
+msgid "Form field value exceeds buffer length! Trim the tail."
+msgstr "Giá trị của trÆ°á»ng biểu mẫu vượt quá chiá»u dài vùng đệm. Hãy xén phần Ä‘uôi."
+
+#. #define FORM_TAIL_COMBINED_WITH_HEAD
+#: LYMessages.c:773
+msgid "Modified tail combined with head of form field value."
+msgstr "Phần Ä‘uôi đã sá»­a kết hợp vá»›i phần đầu của giá trị trÆ°á»ng biểu mẫu."
+
+#. HTFile.c
+#: LYMessages.c:776
+msgid "Directory"
+msgstr "Thư mục"
+
+#: LYMessages.c:777
+msgid "Directory browsing is not allowed."
+msgstr "Không cho phép duyệt qua thư mục."
+
+#: LYMessages.c:778
+msgid "Selective access is not enabled for this directory"
+msgstr "Truy cập lá»±a chá»n không phải được hiệu lá»±c cho thÆ° mục này"
+
+#: LYMessages.c:779
+msgid "Multiformat: directory scan failed."
+msgstr "Äã định dạng: lá»—i quét thÆ° mục."
+
+#: LYMessages.c:780
+msgid "This directory is not readable."
+msgstr "Thư mục này không cho phép ghi."
+
+#: LYMessages.c:781
+msgid "Can't access requested file."
+msgstr "Không thể truy cập đến tập tin đã yêu cầu."
+
+#: LYMessages.c:782
+msgid "Could not find suitable representation for transmission."
+msgstr "Không tìm thấy sá»± đại diện thích hợp để truyá»n."
+
+#: LYMessages.c:783
+msgid "Could not open file for decompression!"
+msgstr "Không thể mở tập tin để giải nén!"
+
+#: LYMessages.c:784
+msgid "Files:"
+msgstr "Tập tin:"
+
+#: LYMessages.c:785
+msgid "Subdirectories:"
+msgstr "Thư mục con:"
+
+#: LYMessages.c:786
+msgid " directory"
+msgstr " thư mục"
+
+#: LYMessages.c:787
+msgid "Up to "
+msgstr "Äến "
+
+#: LYMessages.c:788
+msgid "Current directory is "
+msgstr "Thư mục hiện tại là "
+
+#. HTFTP.c
+#: LYMessages.c:791
+msgid "Symbolic Link"
+msgstr "Liên kết má»m"
+
+#. HTGopher.c
+#: LYMessages.c:794
+msgid "No response from server!"
+msgstr "Máy phục vụ không trả lá»i!"
+
+#: LYMessages.c:795
+msgid "CSO index"
+msgstr "Chỉ mục CSO"
+
+#: LYMessages.c:796
+msgid ""
+"\n"
+"This is a searchable index of a CSO database.\n"
+msgstr ""
+"\n"
+"Äây là má»™t chỉ mục tìm kiếm được của má»™t cÆ¡ sở dữ liệu CSO.\n"
+
+#: LYMessages.c:797
+msgid "CSO Search Results"
+msgstr "Kết quả tìm kiếm CSO"
+
+#: LYMessages.c:798
+#, c-format
+msgid "Seek fail on %s\n"
+msgstr "Lỗi tìm nơi trên %s\n"
+
+#: LYMessages.c:799
+msgid ""
+"\n"
+"Press the 's' key and enter search keywords.\n"
+msgstr ""
+"\n"
+"Bấm phím “S†và nhập các từ khóa tìm kiếm.\n"
+
+#: LYMessages.c:800
+msgid ""
+"\n"
+"This is a searchable Gopher index.\n"
+msgstr ""
+"\n"
+" Äây là má»™t chỉ mục Gopher tìm kiếm được.\n"
+
+#: LYMessages.c:801
+msgid "Gopher index"
+msgstr "Chỉ mục Gopher"
+
+#: LYMessages.c:802
+msgid "Gopher Menu"
+msgstr "Trình đơn Gopher"
+
+#: LYMessages.c:803
+msgid " Search Results"
+msgstr " Kết quả tìm kiếm"
+
+#: LYMessages.c:804
+msgid "Sending CSO/PH request."
+msgstr "Äang gá»­i yêu CSO/PH."
+
+#: LYMessages.c:805
+msgid "Sending Gopher request."
+msgstr "Äang gá»­i yêu cầu Gopher."
+
+#: LYMessages.c:806
+msgid "CSO/PH request sent; waiting for response."
+msgstr "Yêu cầu CSO/PH đã được gá»­i; Ä‘ang đợi trả lá»i."
+
+#: LYMessages.c:807
+msgid "Gopher request sent; waiting for response."
+msgstr "Yêu cầu Gopher đã được gá»­i; Ä‘ang đợi trả lá»i."
+
+#: LYMessages.c:808
+msgid ""
+"\n"
+"Please enter search keywords.\n"
+msgstr ""
+"\n"
+"Hãy nhập các từ khóa tìm kiếm.\n"
+
+#: LYMessages.c:809
+msgid ""
+"\n"
+"The keywords that you enter will allow you to search on a"
+msgstr ""
+"\n"
+"Từ khóa đã nhập sẽ cho phép tìm kiếm theo một"
+
+#: LYMessages.c:810
+msgid " person's name in the database.\n"
+msgstr " tên của ngÆ°á»i trong cÆ¡ sở dữ liệu.\n"
+
+#. HTNews.c
+#: LYMessages.c:813
+msgid "Connection closed ???"
+msgstr "Kết nối bị đóng ???"
+
+#: LYMessages.c:814
+msgid "Cannot open temporary file for news POST."
+msgstr "Không thể mở tập tin tạm thá»i để POST (gá»­i) bài tin."
+
+#: LYMessages.c:815
+msgid "This client does not contain support for posting to news with SSL."
+msgstr "Trình khách này không hỗ trợ chức năng gửi bài tin qua SSL."
+
+#. HTStyle.c
+#: LYMessages.c:818
+#, c-format
+msgid "Style %d `%s' SGML:%s. Font %s %.1f point.\n"
+msgstr "Kiểu %d “%s†SGML:%s. Phông %s %.1f điểm.\n"
+
+#: LYMessages.c:820
+#, c-format
+msgid "\tAlign=%d, %d tabs. (%.0f before, %.0f after)\n"
+msgstr "\tSắp=%d, %d tab. (%.0f trước, %.0f sau)\n"
+
+#: LYMessages.c:821
+#, c-format
+msgid "\t\tTab kind=%d at %.0f\n"
+msgstr "\t\tKiểu Tab=%d tại %.0f\n"
+
+#. HTTP.c
+#: LYMessages.c:824
+msgid "Can't proceed without a username and password."
+msgstr "Không thể tiếp tục khi không có tên ngÆ°á»i dùng và mật khẩu."
+
+#: LYMessages.c:825
+msgid "Can't retry with authorization! Contact the server's WebMaster."
+msgstr "Không thể thử lại với thông tin tin xác thực. Liên hệ với Chủ Web của máy phục vụ."
+
+#: LYMessages.c:826
+msgid "Can't retry with proxy authorization! Contact the server's WebMaster."
+msgstr "Không thể thử lại với thông tin tin xác thực ủy nhiệm. Liên hệ với Chủ Web của máy phục vụ."
+
+#: LYMessages.c:827
+msgid "Retrying with proxy authorization information."
+msgstr "Äang thá»­ lại vá»›i thông tin tin xác thá»±c ủy nhiệm."
+
+#: LYMessages.c:828
+#, c-format
+msgid "SSL error:%s-Continue?"
+msgstr "Lỗi SSL: %s-Tiếp tục?"
+
+#. HTWAIS.c
+#: LYMessages.c:831
+msgid "HTWAIS: Return message too large."
+msgstr "HTWAIS: Thông điệp trả lại quá lớn."
+
+#: LYMessages.c:832
+msgid "Enter WAIS query: "
+msgstr "Nhập truy vấn WAIS: "
+
+#. Miscellaneous status
+#: LYMessages.c:835
+msgid "Retrying as HTTP0 request."
+msgstr "Äang thá»­ lại dạng yêu cầu HTTP0."
+
+#: LYMessages.c:836
+#, c-format
+msgid "Transferred %d bytes"
+msgstr "Äã truyá»n %d byte"
+
+#: LYMessages.c:837
+msgid "Data transfer complete"
+msgstr "Äã truyá»n xong dữ liệu"
+
+#: LYMessages.c:838
+#, c-format
+msgid "Error processing line %d of %s\n"
+msgstr "Gặp lỗi khi xử lý dòng %d trên %s\n"
+
+#. Lynx internal page titles
+#: LYMessages.c:841
+msgid "Address List Page"
+msgstr "Trang Danh sách Äịa chỉ"
+
+#: LYMessages.c:842
+msgid "Bookmark file"
+msgstr "Tập tin Äánh dấu"
+
+#: LYMessages.c:843
+msgid "Configuration Definitions"
+msgstr "Xác định Cấu hình"
+
+#: LYMessages.c:844
+msgid "Cookie Jar"
+msgstr "Há»™p Cookie"
+
+#: LYMessages.c:845
+msgid "Current Edit-Key Map"
+msgstr "Sơ đồ phím-sửa hiện tại"
+
+#: LYMessages.c:846
+msgid "Current Key Map"
+msgstr "Sơ đồ phím hiện tại"
+
+#: LYMessages.c:847
+msgid "File Management Options"
+msgstr "Tùy chá»n Quản lý Tập tin"
+
+#: LYMessages.c:848
+msgid "Download Options"
+msgstr "Tùy chá»n Tải xuống"
+
+#: LYMessages.c:849
+msgid "History Page"
+msgstr "Trang Lịch sử"
+
+#: LYMessages.c:850
+msgid "Cache Jar"
+msgstr "Hộp lưu tạm"
+
+#: LYMessages.c:851
+msgid "List Page"
+msgstr "Trang Danh sách"
+
+#: LYMessages.c:852
+msgid "Lynx.cfg Information"
+msgstr "Thông tin Lynx.cfg"
+
+#: LYMessages.c:853
+msgid "Converted Mosaic Hotlist"
+msgstr "Danh sách nóng Mosaic đã chuyển đổi"
+
+#: LYMessages.c:854
+msgid "Options Menu"
+msgstr "Trình Ä‘Æ¡n Tùy chá»n"
+
+#: LYMessages.c:855
+msgid "File Permission Options"
+msgstr "Tùy chá»n Quyá»n hạn Tập tin"
+
+#: LYMessages.c:856
+msgid "Printing Options"
+msgstr "Tùy chá»n In"
+
+#: LYMessages.c:857
+msgid "Information about the current document"
+msgstr "Thông tin vỠtài liệu hiện tại"
+
+#: LYMessages.c:858
+msgid "Your recent statusline messages"
+msgstr "Các thông điệp trạng thái vừa xem"
+
+#: LYMessages.c:859
+msgid "Upload Options"
+msgstr "Tùy chá»n Tải lên"
+
+#: LYMessages.c:860
+msgid "Visited Links Page"
+msgstr "Trang Liên kết đã Thăm"
+
+#. CONFIG_DEF_TITLE subtitles
+#: LYMessages.c:863
+msgid "See also"
+msgstr "Xem thêm"
+
+#: LYMessages.c:864
+msgid "your"
+msgstr "của bạn"
+
+#: LYMessages.c:865
+msgid "for runtime options"
+msgstr "cho tùy chá»n lúc chạy"
+
+#: LYMessages.c:866
+msgid "compile time options"
+msgstr "tùy chá»n lúc biên dịch"
+
+#: LYMessages.c:867
+msgid "color-style configuration"
+msgstr "cấu hình kiểu dáng màu"
+
+#: LYMessages.c:868
+msgid "latest release"
+msgstr "bản phát hành mới nhất"
+
+#: LYMessages.c:869
+msgid "pre-release version"
+msgstr "phiên bản phát hành sẵn"
+
+#: LYMessages.c:870
+msgid "development version"
+msgstr "phiên bản phát triển"
+
+#. #define AUTOCONF_CONFIG_CACHE
+#: LYMessages.c:872
+msgid ""
+"The following data were derived during the automatic configuration/build\n"
+"process of this copy of Lynx. When reporting a bug, please include a copy\n"
+"of this page."
+msgstr "Dữ liệu theo đây đã được lấy trong tiến trình tự động cấu hình/xây dựng của bản sao Lynx này. Khi báo cáo lỗi, vui lòng thêm một bản sao của trang này."
+
+#. #define AUTOCONF_LYNXCFG_H
+#: LYMessages.c:876
+msgid ""
+"The following data were used as automatically-configured compile-time\n"
+"definitions when this copy of Lynx was built."
+msgstr "Dữ liệu theo đây đã được dùng làm lá»i xác định lúc biên dịch đã tá»± Ä‘á»™ng cấu hình trong khi xây dá»±ng bản sao Lynx này."
+
+#. #define DIRED_NOVICELINE
+#: LYMessages.c:881
+msgid " C)reate D)ownload E)dit F)ull menu M)odify R)emove T)ag U)pload \n"
+msgstr " [C] tạo; [D] tải vá»; [E] soạn; [F] trình Ä‘Æ¡n đầy đủ; [M] sá»­a; [R] bá» ; [T] thẻ; [U] tải lên\n"
+
+#: LYMessages.c:882
+msgid "Failed to obtain status of current link!"
+msgstr "Lỗi lấy trạng thái vỠliên kết hiện tại!"
+
+#. #define INVALID_PERMIT_URL
+#: LYMessages.c:885
+msgid "Special URL only valid from current File Permission menu!"
+msgstr "Äịa chỉ URL đặc biệt chỉ dùng được từ trình Ä‘Æ¡n Quyá»n hạn Tập tin hiện tại!"
+
+#: LYMessages.c:889
+msgid "External support is currently disabled."
+msgstr "Hỗ trợ bên ngoài hiện tại bị tắt."
+
+#. new with 2.8.4dev.21
+#: LYMessages.c:893
+msgid "Changing working-directory is currently disabled."
+msgstr "Chức năng thay đổi thư mục hoạt động hiện tại bị tắt."
+
+#: LYMessages.c:894
+msgid "Linewrap OFF!"
+msgstr "Ngắt dòng TẮT!"
+
+#: LYMessages.c:895
+msgid "Linewrap ON!"
+msgstr "Ngắt dòng BẬT!"
+
+#: LYMessages.c:896
+msgid "Parsing nested-tables toggled OFF! Reloading..."
+msgstr "Phân tích bảng lồng vào nhau TẮT! Äang tải lại…"
+
+#: LYMessages.c:897
+msgid "Parsing nested-tables toggled ON! Reloading..."
+msgstr "Phân tích bảng lồng vào nhau BẬT! Äang tải lại…"
+
+#: LYMessages.c:898
+msgid "Shifting is disabled while line-wrap is in effect"
+msgstr "Dịch chuyển tắt trong khi ngắt dòng làm việc"
+
+#: LYMessages.c:899
+msgid "Trace not supported"
+msgstr "Chức năng tìm Ä‘Æ°á»ng không được há»— trợ"
+
+#: LYMessages.c:819
+#, c-format
+msgid "\tIndents: first=%.0f others=%.0f, Height=%.1f Desc=%.1f\n"
+msgstr "\tThụt: đầu tiên=%.0f khác=%.0f, Cao=%.1f Môtả=%.1f\n"
+
+#: WWW/Library/Implementation/HTAABrow.c:575
+#, c-format
+msgid "username for realm %s changed from %s to %s"
+msgstr "tài khoản cho realm %s thay đổi từ %s thành %s"
+
+#: WWW/Library/Implementation/HTAABrow.c:591
+#, c-format
+msgid "password for realm %s user %s changed"
+msgstr "mật khẩu cho realm %s tài khoản %s đã được thay đổi"
+
+#: WWW/Library/Implementation/HTAABrow.c:703
+#, c-format
+msgid "Username for '%s' at %s '%s%s':"
+msgstr "Tên ngÆ°á»i dùng cho “%s†tại %s “%s%sâ€:"
+
+#: WWW/Library/Implementation/HTAABrow.c:976
+msgid "This client doesn't know how to compose proxy authorization information for scheme"
+msgstr "Trình khách này không biết cách cấu táo thông tin xác thực ủy nhiệm cho scheme"
+
+#: WWW/Library/Implementation/HTAABrow.c:1053
+msgid "This client doesn't know how to compose authorization information for scheme"
+msgstr "Trình khách này không biết cách cấu táo thông tin xác thực cho scheme"
+
+#: WWW/Library/Implementation/HTAABrow.c:1162
+#, c-format
+msgid "Invalid header '%s%s%s%s%s'"
+msgstr "Dòng đầu không hợp lệ “%s%s%s%s%sâ€"
+
+#: WWW/Library/Implementation/HTAABrow.c:1266
+msgid "Proxy authorization required -- retrying"
+msgstr "Cần thiết xác thực ủy nhiệm — đang thử lại"
+
+#: WWW/Library/Implementation/HTAABrow.c:1322
+msgid "Access without authorization denied -- retrying"
+msgstr "Truy cập mà không xác thực thì bị từ chối — đang thử lại"
+
+#: WWW/Library/Implementation/HTAccess.c:698
+msgid "Access forbidden by rule"
+msgstr "Truy cập bị quy tắc cấm"
+
+#: WWW/Library/Implementation/HTAccess.c:800
+msgid "Document with POST content not found in cache. Resubmit?"
+msgstr "Không tìm thấy tài liệu với nội dung POST trong bộ nhớ tạm. Gửi lại?"
+
+#: WWW/Library/Implementation/HTAccess.c:953
+msgid "Loading failed, use a previous copy."
+msgstr "Nạp không thành công, hãy sử dụng bản sao trước đây."
+
+#: WWW/Library/Implementation/HTAccess.c:1062 src/GridText.c:8928
+msgid "Loading incomplete."
+msgstr "Chưa tải xong."
+
+#: WWW/Library/Implementation/HTAccess.c:1093
+#, c-format
+msgid "**** HTAccess: socket or file number returned by obsolete load routine!\n"
+msgstr "**** HTAccess: ổ cắm hoặc số thứ tự tập tin trả lại bởi hàm tải quá cũ.\n"
+
+#: WWW/Library/Implementation/HTAccess.c:1095
+#, c-format
+msgid "**** HTAccess: Internal software error. Please mail lynx-dev@nongnu.org!\n"
+msgstr "**** HTAccess: Lá»—i phần má»m ná»™i bá»™. Xin hãy gá»­i thÆ° “lynx-dev@nongnu.orgâ€.\n"
+
+#: WWW/Library/Implementation/HTAccess.c:1096
+#, c-format
+msgid "**** HTAccess: Status returned was: %d\n"
+msgstr "**** HTAccess: Trạng thái trả lại là: %d\n"
+
+#.
+#. * hack: if we fail in HTAccess.c
+#. * avoid duplicating URL, oh.
+#.
+#: WWW/Library/Implementation/HTAccess.c:1102 src/LYMainLoop.c:8076
+msgid "Can't Access"
+msgstr "Không thể truy cập"
+
+#: WWW/Library/Implementation/HTAccess.c:1110
+msgid "Unable to access document."
+msgstr "Không thể truy cập đến tài liệu."
+
+#: WWW/Library/Implementation/HTFTP.c:870
+#, c-format
+msgid "Enter password for user %s@%s:"
+msgstr "Hãy gõ mật khẩu cho ngÆ°á»i dùng %s@%s:"
+
+#: WWW/Library/Implementation/HTFTP.c:898
+msgid "Unable to connect to FTP host."
+msgstr "Không thể kết nối tới máy chủ FTP."
+
+#: WWW/Library/Implementation/HTFTP.c:1137
+msgid "close master socket"
+msgstr "đóng ổ cắm chính"
+
+#: WWW/Library/Implementation/HTFTP.c:1194
+msgid "socket for master socket"
+msgstr "ổ cắm cho ổ cắm chính"
+
+#: WWW/Library/Implementation/HTFTP.c:2922
+msgid "Receiving FTP directory."
+msgstr "Äang nhận thÆ° mục FTP."
+
+#: WWW/Library/Implementation/HTFTP.c:3060
+#, c-format
+msgid "Transferred %d bytes (%5d)"
+msgstr "Äã truyá»n %d byte (%5d)"
+
+#: WWW/Library/Implementation/HTFTP.c:3417
+msgid "connect for data"
+msgstr "kết nối đến dữ liệu"
+
+#: WWW/Library/Implementation/HTFTP.c:4094
+msgid "Receiving FTP file."
+msgstr "Äang nhận tập tin FTP."
+
+#: WWW/Library/Implementation/HTFinger.c:274
+msgid "Could not set up finger connection."
+msgstr "Không thể cài đặt kết nối finger."
+
+#: WWW/Library/Implementation/HTFinger.c:321
+msgid "Could not load data (no sitename in finger URL)"
+msgstr "Không thể tải dữ liệu (URL finger không chứa tên nơi Web)"
+
+#: WWW/Library/Implementation/HTFinger.c:325
+msgid "Invalid port number - will only use port 79!"
+msgstr "Số thứ tự cổng không hợp lệ - sẽ chỉ dùng cổng 79!"
+
+#: WWW/Library/Implementation/HTFinger.c:391
+msgid "Could not access finger host."
+msgstr "Không thể truy cập đến máy chủ finger."
+
+#: WWW/Library/Implementation/HTFinger.c:399
+msgid "No response from finger server."
+msgstr "Máy phục vụ finger không trả lá»i."
+
+#: WWW/Library/Implementation/HTNews.c:439
+#, c-format
+msgid "Username for news host '%s':"
+msgstr "Tên ngÆ°á»i dùng cho máy chủ tin tức “%sâ€:"
+
+#: WWW/Library/Implementation/HTNews.c:492
+msgid "Change username?"
+msgstr "Thay đổi tên ngÆ°á»i dùng?"
+
+#: WWW/Library/Implementation/HTNews.c:496
+msgid "Username:"
+msgstr "Tên ngÆ°á»i dùng:"
+
+#: WWW/Library/Implementation/HTNews.c:521
+#, c-format
+msgid "Password for news host '%s':"
+msgstr "Mật khẩu cho máy chủ tin tức “%sâ€:"
+
+#: WWW/Library/Implementation/HTNews.c:604
+msgid "Change password?"
+msgstr "Thay đổi mật khẩu?"
+
+#: WWW/Library/Implementation/HTNews.c:1725
+#, c-format
+msgid "No matches for: %s"
+msgstr "Không tìm thấy: %s"
+
+#: WWW/Library/Implementation/HTNews.c:1775
+msgid ""
+"\n"
+"No articles in this group.\n"
+msgstr ""
+"\n"
+"Không có bài trong nhóm này.\n"
+
+#: WWW/Library/Implementation/HTNews.c:1787
+msgid ""
+"\n"
+"No articles in this range.\n"
+msgstr ""
+"\n"
+"Không có bài trong phạm vi này.\n"
+
+#.
+#. * Set window title.
+#.
+#: WWW/Library/Implementation/HTNews.c:1800
+#, c-format
+msgid "%s, Articles %d-%d"
+msgstr "%s, Bài %d-%d"
+
+#: WWW/Library/Implementation/HTNews.c:1823
+msgid "Earlier articles"
+msgstr "Bài cũ"
+
+#: WWW/Library/Implementation/HTNews.c:1836
+#, c-format
+msgid ""
+"\n"
+"There are about %d articles currently available in %s, IDs as follows:\n"
+"\n"
+msgstr ""
+"\n"
+"Có khoảng %d bài báo trong %s, với mã số:\n"
+"\n"
+
+#: WWW/Library/Implementation/HTNews.c:1898
+msgid "All available articles in "
+msgstr "Má»i bài sẵn sàng trong "
+
+#: WWW/Library/Implementation/HTNews.c:2112
+msgid "Later articles"
+msgstr "Bài mới"
+
+#: WWW/Library/Implementation/HTNews.c:2135
+msgid "Post to "
+msgstr "Gá»­i cho "
+
+#: WWW/Library/Implementation/HTNews.c:2356
+msgid "This client does not contain support for SNEWS URLs."
+msgstr "Trình khách này không hỗ trợ địa chỉ URL kiểu SNEWS."
+
+#: WWW/Library/Implementation/HTNews.c:2563
+msgid "No target for raw text!"
+msgstr "Không có đích cho văn bản thô!"
+
+#: WWW/Library/Implementation/HTNews.c:2593
+msgid "Connecting to NewsHost ..."
+msgstr "Äang kết nối tá»›i máy tin tức NewsHost …"
+
+#: WWW/Library/Implementation/HTNews.c:2645
+#, c-format
+msgid "Could not access %s."
+msgstr "Không thể truy cập đến %s."
+
+#: WWW/Library/Implementation/HTNews.c:2751
+#, c-format
+msgid "Can't read news info. News host %.20s responded: %.200s"
+msgstr "Không Ä‘á»c được thông tin tin tức. Máy tin tức %.20s đã trả lá»i: %.200s"
+
+#: WWW/Library/Implementation/HTNews.c:2755
+#, c-format
+msgid "Can't read news info, empty response from host %s"
+msgstr "Không Ä‘á»c được thông tin tin tức; trả lá»i rá»—ng từ máy %s"
+
+#.
+#. * List available newsgroups. - FM
+#.
+#: WWW/Library/Implementation/HTNews.c:2959
+msgid "Reading list of available newsgroups."
+msgstr "Äang Ä‘á»c danh sách các nhóm tin sẵn sàng."
+
+#: WWW/Library/Implementation/HTNews.c:2980
+msgid "Reading list of articles in newsgroup."
+msgstr "Äang Ä‘á»c danh sách các bài trong nhóm tin."
+
+#.
+#. * Get an article from a news group. - FM
+#.
+#: WWW/Library/Implementation/HTNews.c:2986
+msgid "Reading news article."
+msgstr "Äang Ä‘á»c bài tin."
+
+#: WWW/Library/Implementation/HTNews.c:3016
+msgid "Sorry, could not load requested news."
+msgstr "Tiếc là không thể tải tin tức đã yêu cầu."
+
+#: WWW/Library/Implementation/HTTCP.c:1339
+msgid "Address has invalid port"
+msgstr "Äịa chỉ có cổng không hợp lệ"
+
+#: WWW/Library/Implementation/HTTCP.c:1410
+msgid "Address length looks invalid"
+msgstr "Chiá»u dài địa chỉ hình nhÆ° không hợp lệ"
+
+#: WWW/Library/Implementation/HTTCP.c:1862
+#: WWW/Library/Implementation/HTTCP.c:1880
+#, c-format
+msgid "Unable to locate remote host %s."
+msgstr "Không thể định vị máy từ xa %s."
+
+#. Not HTProgress, so warning won't be overwritten immediately;
+#. * but not HTAlert, because typically there will be other
+#. * alerts from the callers. - kw
+#.
+#: WWW/Library/Implementation/HTTCP.c:1877
+#: WWW/Library/Implementation/HTTelnet.c:115
+#, c-format
+msgid "Invalid hostname %s"
+msgstr "Tên máy không hợp lệ %s"
+
+#: WWW/Library/Implementation/HTTCP.c:1891
+#, c-format
+msgid "Making %s connection to %s"
+msgstr "Äang tạo kết nối %s tá»›i %s"
+
+#: WWW/Library/Implementation/HTTCP.c:1902
+msgid "socket failed."
+msgstr "lỗi ổ cắm."
+
+#: WWW/Library/Implementation/HTTCP.c:1916
+#, c-format
+msgid "socket failed: family %d addr %s port %s."
+msgstr "lỗi ổ cắm: nhóm %d địa chỉ %s cổng %s."
+
+#: WWW/Library/Implementation/HTTCP.c:1940
+msgid "Could not make connection non-blocking."
+msgstr "Không thể làm cho kết nối không chặn."
+
+#: WWW/Library/Implementation/HTTCP.c:2006
+msgid "Connection failed (too many retries)."
+msgstr "Lá»—i kết nối (quá nhiá»u lần thá»­ lại)."
+
+#: WWW/Library/Implementation/HTTCP.c:2201
+msgid "Could not restore socket to blocking."
+msgstr "Không thể phục hồi ổ cắm để chặn."
+
+#: WWW/Library/Implementation/HTTCP.c:2271
+msgid "Socket read failed (too many tries)."
+msgstr "Lá»—i Ä‘á»c ổ cắm (quá nhiá»u lần thá»­ lại)."
+
+#: WWW/Library/Implementation/HTTP.c:165
+#, c-format
+msgid "SSL callback:%s, preverify_ok=%d, ssl_okay=%d"
+msgstr "SSL gá»i_ngược:%s, thẩm_tra_sẵn_ok=%d, ssl_okay=%d"
+
+#: WWW/Library/Implementation/HTTP.c:668
+#, c-format
+msgid "User/password contains only punctuation: %s"
+msgstr "Tài khoản/mật khẩu chỉ chứa dấu câu: %s"
+
+#: WWW/Library/Implementation/HTTP.c:672
+#, c-format
+msgid "User/password may be confused with hostname: '%s' (e.g, '%s')"
+msgstr "Tài khoản/mật khẩu có thể lẫn với tên máy: '%s' (vd, '%s')"
+
+#: WWW/Library/Implementation/HTTP.c:733
+#, c-format
+msgid "Certificate issued by: %s"
+msgstr "Chứng nhận được cấp bởi: %s"
+
+#: WWW/Library/Implementation/HTTP.c:920
+msgid "This client does not contain support for HTTPS URLs."
+msgstr "Trình khách này không hỗ trợ địa chỉ URL kiểu HTTPS (Web bảo mật)"
+
+#: WWW/Library/Implementation/HTTP.c:945
+msgid "Unable to connect to remote host."
+msgstr "Không thể kết nối tới mấy từ xa."
+
+#: WWW/Library/Implementation/HTTP.c:988
+msgid "Retrying connection without TLS."
+msgstr "Äang thá»­ lại kết nối mà không có TLS."
+
+#: WWW/Library/Implementation/HTTP.c:1040
+msgid "GnuTLS error when trying to verify certificate."
+msgstr "Có lỗi GnuTLS khi cố xác nhận giấy chứng nhận."
+
+#: WWW/Library/Implementation/HTTP.c:1053
+msgid "the certificate has no known issuer"
+msgstr "chứng nhận này không có nhà cấp đã biết"
+
+#: WWW/Library/Implementation/HTTP.c:1055
+msgid "no issuer was found"
+msgstr "không tìm thấy nhà cấp"
+
+#: WWW/Library/Implementation/HTTP.c:1057
+msgid "issuer is not a CA"
+msgstr "nhà cấp không phải là CA (nhà cầm quyá»n chứng nhận)"
+
+#: WWW/Library/Implementation/HTTP.c:1059
+msgid "the certificate has been revoked"
+msgstr "chứng nhận này đã bị thu hồi"
+
+#: WWW/Library/Implementation/HTTP.c:1061
+msgid "the certificate is not trusted"
+msgstr "chứng nhận này không đáng tin"
+
+#: WWW/Library/Implementation/HTTP.c:1136
+#, c-format
+msgid "Verified connection to %s (cert=%s)"
+msgstr "Äã thẩm tra kết nối tá»›i %s (chứng nhận=%s)"
+
+#: WWW/Library/Implementation/HTTP.c:1186
+#: WWW/Library/Implementation/HTTP.c:1228
+#, c-format
+msgid "Verified connection to %s (subj=%s)"
+msgstr "Äã thẩm tra kết nối tá»›i %s (chủ Ä‘á»=%s)"
+
+#: WWW/Library/Implementation/HTTP.c:1258
+msgid "Can't find common name in certificate"
+msgstr "Không thể tìm tên chung trong chứng nhận"
+
+#: WWW/Library/Implementation/HTTP.c:1261
+#, c-format
+msgid "SSL error:host(%s)!=cert(%s)-Continue?"
+msgstr "Lỗi SSL:máy(%s)!=chứng nhận(%s)-Tiếp tục?"
+
+#: WWW/Library/Implementation/HTTP.c:1268
+msgid "SSL error"
+msgstr "Lá»—i SSL"
+
+#: WWW/Library/Implementation/HTTP.c:1276
+#, c-format
+msgid "UNVERIFIED connection to %s (cert=%s)"
+msgstr "CHƯA thẩm tra kết nối tới %s (chứng nhận=%s)"
+
+#: WWW/Library/Implementation/HTTP.c:1285
+#, c-format
+msgid "Secure %d-bit %s (%s) HTTP connection"
+msgstr "Kết nối %d-bit bảo mật HTTP %s (%s)"
+
+#: WWW/Library/Implementation/HTTP.c:1755
+msgid "Sending HTTP request."
+msgstr "Äang gá»­i yêu cầu HTTP."
+
+#: WWW/Library/Implementation/HTTP.c:1797
+msgid "Unexpected network write error; connection aborted."
+msgstr "Lá»—i ghi mạng bất thÆ°á»ng; kết nối bị hủy bá»."
+
+#: WWW/Library/Implementation/HTTP.c:1803
+msgid "HTTP request sent; waiting for response."
+msgstr "Äã gá»­i yêu cầu HTTP; Ä‘ang đợi trả lá»i."
+
+#: WWW/Library/Implementation/HTTP.c:1876
+#: WWW/Library/Implementation/HTTP.c:1886
+msgid "Unexpected network read error; connection aborted."
+msgstr "Lá»—i Ä‘á»c mạng bất thÆ°á»ng; kết nối bị hủy bá»."
+
+#.
+#. * HTTP/1.1 Informational statuses.
+#. * 100 Continue.
+#. * 101 Switching Protocols.
+#. * > 101 is unknown.
+#. * We should never get these, and they have only the status
+#. * line and possibly other headers, so we'll deal with them by
+#. * showing the full header to the user as text/plain. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2089
+msgid "Got unexpected Informational Status."
+msgstr "Nhận được Trạng thái Thông tin không mong đợi."
+
+#.
+#. * Reset Content. The server has fulfilled the request but
+#. * nothing is returned and we should reset any form
+#. * content. We'll instruct the user to do that, and
+#. * restore the current document. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2123
+msgid "Request fulfilled. Reset Content."
+msgstr "Yêu cầu đã hoàn thành. Äặt lại Ná»™i dung."
+
+#. Not Modified
+#.
+#. * We didn't send an "If-Modified-Since" header, so this
+#. * status is inappropriate. We'll deal with it by showing
+#. * the full header to the user as text/plain. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2240
+msgid "Got unexpected 304 Not Modified status."
+msgstr "Nhận được trạng thái 304 ChÆ°a Sá»­a Äổi không mong đợi."
+
+#: WWW/Library/Implementation/HTTP.c:2303
+msgid "Redirection of POST content requires user approval."
+msgstr "Chuyển hÆ°á»›ng ná»™i dung POST cần sá»± tán thành của ngÆ°á»i dùng."
+
+#: WWW/Library/Implementation/HTTP.c:2318
+msgid "Have POST content. Treating Permanent Redirection as Temporary.\n"
+msgstr "Có ná»™i dung POST. Äang coi sá»± Chuyển hÆ°á»›ng cố dịnh chỉ là Tạm thá»i.\n"
+
+#: WWW/Library/Implementation/HTTP.c:2364
+msgid "Retrying with access authorization information."
+msgstr "Äang thá»­ lại vá»›i thông tin xác thá»±c truy cập."
+
+#: WWW/Library/Implementation/HTTP.c:2376
+msgid "Show the 401 message body?"
+msgstr "Hiển thị thân thư 401 không?"
+
+#: WWW/Library/Implementation/HTTP.c:2420
+msgid "Show the 407 message body?"
+msgstr "Hiển thị thân thư 407 không?"
+
+#.
+#. * Bad or unknown server_status number. Take a chance and hope
+#. * there is something to display. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2520
+msgid "Unknown status reply from server!"
+msgstr "Không rõ trạng thái đã được trả lá»i từ máy phục vụ!"
+
+#: WWW/Library/Implementation/HTTelnet.c:113
+#, c-format
+msgid "remote %s session:"
+msgstr "phiên chạy %s từ xa:"
+
+#: WWW/Library/Implementation/HTWAIS.c:163
+msgid "Could not connect to WAIS server."
+msgstr "Không thể kết nối tới máy phục vụ WAIS."
+
+#: WWW/Library/Implementation/HTWAIS.c:171
+msgid "Could not open WAIS connection for reading."
+msgstr "Không thể mở kết nối WAIS để Ä‘á»c."
+
+#: WWW/Library/Implementation/HTWAIS.c:193
+msgid "Diagnostic code is "
+msgstr "Mã chẩn đoán là "
+
+#: WWW/Library/Implementation/HTWAIS.c:460
+msgid "Index "
+msgstr "Chỉ mục "
+
+#: WWW/Library/Implementation/HTWAIS.c:464
+#, c-format
+msgid " contains the following %d item%s relevant to \""
+msgstr " chứa %d mục%s thích hợp với “"
+
+#: WWW/Library/Implementation/HTWAIS.c:472
+msgid "The first figure after each entry is its relative score, "
+msgstr "Số đầu tiên sau mỗi mục là điểm tương đối của nó, "
+
+#: WWW/Library/Implementation/HTWAIS.c:473
+msgid "the second is the number of lines in the item."
+msgstr "số thứ hai là số dòng trong mục đó."
+
+#: WWW/Library/Implementation/HTWAIS.c:515
+msgid " (bad file name)"
+msgstr " (tên tập tin sai)"
+
+#: WWW/Library/Implementation/HTWAIS.c:541
+msgid "(bad doc id)"
+msgstr "(mã số tài liệu sai)"
+
+#: WWW/Library/Implementation/HTWAIS.c:557
+msgid "(Short Header record, can't display)"
+msgstr "(Mục ghi phần đầu ngắn, không hiển thị được)"
+
+#: WWW/Library/Implementation/HTWAIS.c:564
+msgid ""
+"\n"
+"Long Header record, can't display\n"
+msgstr ""
+"\n"
+"Mục ghi phần đầu dài, không hiển thị được\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:571
+msgid ""
+"\n"
+"Text record\n"
+msgstr ""
+"\n"
+"Mục ghi văn bản\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:580
+msgid ""
+"\n"
+"Headline record, can't display\n"
+msgstr ""
+"\n"
+"Bản ghi Hàng đầu, không hiển thị được\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:588
+msgid ""
+"\n"
+"Code record, can't display\n"
+msgstr ""
+"\n"
+"Mục ghi Mã, không hiển thị được\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:692
+msgid "Syntax error in WAIS URL"
+msgstr "Lỗi cú pháp trong địa chỉ URL kiểu WAIS"
+
+#: WWW/Library/Implementation/HTWAIS.c:764
+msgid " (WAIS Index)"
+msgstr " (Chỉ mục WAIS)"
+
+#: WWW/Library/Implementation/HTWAIS.c:771
+msgid "WAIS Index: "
+msgstr "Chỉ mục WAIS: "
+
+#: WWW/Library/Implementation/HTWAIS.c:777
+msgid "This is a link for searching the "
+msgstr "Äây là má»™t liên để tìm kiếm "
+
+#: WWW/Library/Implementation/HTWAIS.c:781
+msgid " WAIS Index.\n"
+msgstr " chỉ mục WAIS.\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:810
+msgid ""
+"\n"
+"Enter the 's'earch command and then specify search words.\n"
+msgstr ""
+"\n"
+"Hãy nhập câu lệnh tìm kiếm (s), rồi ghi rõ chuỗi tìm kiếm.\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:832
+msgid " (in "
+msgstr " (trong "
+
+#: WWW/Library/Implementation/HTWAIS.c:841
+msgid "WAIS Search of \""
+msgstr "Tìm kiếm WAIS \""
+
+#: WWW/Library/Implementation/HTWAIS.c:845
+msgid "\" in: "
+msgstr "\" trong: "
+
+#: WWW/Library/Implementation/HTWAIS.c:860
+msgid "HTWAIS: Request too large."
+msgstr "HTWAIS: yêu cầu quá lớn."
+
+#: WWW/Library/Implementation/HTWAIS.c:869
+msgid "Searching WAIS database..."
+msgstr "Äang tìm kiếm qua cÆ¡ sở dữ liệu WAIS…"
+
+#: WWW/Library/Implementation/HTWAIS.c:879
+msgid "Search interrupted."
+msgstr "Tiến trình tìm kiếm bị gián đoạn."
+
+#: WWW/Library/Implementation/HTWAIS.c:930
+msgid "Can't convert format of WAIS document"
+msgstr "Không thể chuyển đổi định dạng của tài liệu WAIS"
+
+#: WWW/Library/Implementation/HTWAIS.c:974
+msgid "HTWAIS: Request too long."
+msgstr "HTWAIS: yêu cầu quá dài."
+
+#.
+#. * Actually do the transaction given by request_message.
+#.
+#: WWW/Library/Implementation/HTWAIS.c:988
+msgid "Fetching WAIS document..."
+msgstr "Äang lấy tài liệu WAIS…"
+
+#. display_search_response(target, retrieval_response,
+#. wais_database, keywords);
+#: WWW/Library/Implementation/HTWAIS.c:1027
+msgid "No text was returned!\n"
+msgstr "Chưa trả lại văn bản.\n"
+
+#: WWW/Library/Implementation/HTWSRC.c:302
+msgid " NOT GIVEN in source file; "
+msgstr " CHƯA ÄƯA RA trong tập tin mã nguồn; "
+
+#: WWW/Library/Implementation/HTWSRC.c:325
+msgid " WAIS source file"
+msgstr " Tập tin mã nguồn WAIS"
+
+#: WWW/Library/Implementation/HTWSRC.c:332
+msgid " description"
+msgstr " mô tả"
+
+#: WWW/Library/Implementation/HTWSRC.c:342
+msgid "Access links"
+msgstr "Truy cập liên kết"
+
+#: WWW/Library/Implementation/HTWSRC.c:363
+msgid "Direct access"
+msgstr "Truy cập trực tiếp"
+
+#. * Proxy will be used if defined, so let user know that - FM *
+#: WWW/Library/Implementation/HTWSRC.c:366
+msgid " (or via proxy server, if defined)"
+msgstr " (xác định máy phục vụ ủy nhiệm thì cũng có thể dùng nó)"
+
+#: WWW/Library/Implementation/HTWSRC.c:381
+msgid "Maintainer"
+msgstr "Nhà duy trì"
+
+#: WWW/Library/Implementation/HTWSRC.c:389
+msgid "Host"
+msgstr "Máy"
+
+#: src/GridText.c:723
+msgid "Memory exhausted, display interrupted!"
+msgstr "Cạn bộ nhớ, đã gián đoạn hiển thị!"
+
+#: src/GridText.c:728
+msgid "Memory exhausted, will interrupt transfer!"
+msgstr "Cạn bá»™ nhá»›, sẽ gián Ä‘oạn truyá»n tải!"
+
+#: src/GridText.c:1719
+#, c-format
+msgid " (l%d of %d)"
+msgstr " (l%d trên %d)"
+
+#: src/GridText.c:1728
+#, c-format
+msgid " (p%d of %d)"
+msgstr " (p%d trên %d)"
+
+#: src/GridText.c:3713
+msgid " *** MEMORY EXHAUSTED ***"
+msgstr " *** HẾT BỘ NHỚ ***"
+
+#: src/GridText.c:6211
+msgid "text entry field"
+msgstr "trÆ°á»ng nhập văn bản"
+
+#: src/GridText.c:6214
+msgid "password entry field"
+msgstr "trÆ°á»ng nhập mật khẩu"
+
+#: src/GridText.c:6217
+msgid "checkbox"
+msgstr "hộp kiểm tra"
+
+#: src/GridText.c:6220
+msgid "radio button"
+msgstr "nút chá»n má»™t"
+
+#: src/GridText.c:6223
+msgid "submit button"
+msgstr "nút gửi đi"
+
+#: src/GridText.c:6226
+msgid "reset button"
+msgstr "nút đặt lại"
+
+#: src/GridText.c:6229
+msgid "script button"
+msgstr "nút kịch bản"
+
+#: src/GridText.c:6232
+msgid "popup menu"
+msgstr "trình đơn tự mở"
+
+#: src/GridText.c:6235
+msgid "hidden form field"
+msgstr "trÆ°á»ng biểu mẫu bị ẩn"
+
+#: src/GridText.c:6238
+msgid "text entry area"
+msgstr "vùng nhập văn bản"
+
+#: src/GridText.c:6241
+msgid "range entry field"
+msgstr "trÆ°á»ng nhập phạm vi"
+
+#: src/GridText.c:6244
+msgid "file entry field"
+msgstr "trÆ°á»ng nhập tập tin"
+
+#: src/GridText.c:6247
+msgid "text-submit field"
+msgstr "trÆ°á»ng gá»­i văn bản Ä‘i"
+
+#: src/GridText.c:6250
+msgid "image-submit button"
+msgstr "nút gửi ảnh đi"
+
+#: src/GridText.c:6253
+msgid "keygen field"
+msgstr "trÆ°á»ng keygen"
+
+#: src/GridText.c:6256
+msgid "unknown form field"
+msgstr "trÆ°á»ng biểu mẫu không rõ"
+
+#: src/GridText.c:6276 src/GridText.c:6283 src/LYList.c:249
+msgid "unknown field or link"
+msgstr "không rõ trÆ°á»ng hoặc liên kết"
+
+#: src/GridText.c:10711
+msgid "Can't open file for uploading"
+msgstr "Không thể mở tập tin để tải lên"
+
+#: src/GridText.c:11899
+#, c-format
+msgid "Submitting %s"
+msgstr "Äang gá»­i %s"
+
+#. ugliness has happened; inform user and do the best we can
+#: src/GridText.c:12969
+msgid "Hang Detect: TextAnchor struct corrupted - suggest aborting!"
+msgstr "Tìm ra Treo: cấu trúc TextAnchor bị lỗi - đỠnghị thoát!"
+
+#. don't show previous state
+#: src/GridText.c:13128
+msgid "Wrap lines to fit displayed area?"
+msgstr "Ngắt dòng để vừa khít vùng hiển thị?"
+
+#: src/GridText.c:13758
+msgid "Very long lines have been truncated!"
+msgstr "Các dòng rất dài đã bị cắt ngắn!"
+
+#: src/HTAlert.c:164 src/LYShowInfo.c:389 src/LYShowInfo.c:393
+msgid "bytes"
+msgstr "byte"
+
+#.
+#. * If we know the total size of the file, we can compute
+#. * a percentage, and show a corresponding progress bar.
+#.
+#: src/HTAlert.c:328 src/HTAlert.c:354
+#, c-format
+msgid "Read %s of data"
+msgstr "Äã Ä‘á»c %s dữ liệu"
+
+#: src/HTAlert.c:351
+#, c-format
+msgid "Read %s of %s of data"
+msgstr "Äã Ä‘á»c %s trên %s dữ liệu"
+
+#: src/HTAlert.c:360
+#, c-format
+msgid ", %s/sec"
+msgstr ", %s/giây"
+
+#: src/HTAlert.c:374
+#, c-format
+msgid " (stalled for %s)"
+msgstr " (bị ngừng chạy trong %s)"
+
+#: src/HTAlert.c:378
+#, c-format
+msgid ", ETA %s"
+msgstr ", GiỠtới xấp xỉ %s"
+
+#: src/HTAlert.c:400
+msgid " (Press 'z' to abort)"
+msgstr " (Bấm “z†để hủy bá»)"
+
+#. Meta-note: don't move the following note from its place right
+#. in front of the first gettext(). As it is now, it should
+#. automatically appear in generated lynx.pot files. - kw
+#.
+#. NOTE TO TRANSLATORS: If you provide a translation for "yes", lynx
+#. * will take the first byte of the translation as a positive response
+#. * to Yes/No questions. If you provide a translation for "no", lynx
+#. * will take the first byte of the translation as a negative response
+#. * to Yes/No questions. For both, lynx will also try to show the
+#. * first byte in the prompt as a character, instead of (y) or (n),
+#. * respectively. This will not work right for multibyte charsets!
+#. * Don't translate "yes" and "no" for CJK character sets (or translate
+#. * them to "yes" and "no"). For a translation using UTF-8, don't
+#. * translate if the translation would begin with anything but a 7-bit
+#. * (US_ASCII) character. That also means do not translate if the
+#. * translation would begin with anything but a 7-bit character, if
+#. * you use a single-byte character encoding (a charset like ISO-8859-n)
+#. * but anticipate that the message catalog may be used re-encoded in
+#. * UTF-8 form.
+#. * For translations using other character sets, you may also wish to
+#. * leave "yes" and "no" untranslated, if using (y) and (n) is the
+#. * preferred behavior.
+#. * Lynx will also accept y Y n N as responses unless there is a conflict
+#. * with the first letter of the "yes" or "no" translation.
+#.
+#: src/HTAlert.c:438 src/HTAlert.c:486
+msgid "yes"
+msgstr "có"
+
+#: src/HTAlert.c:441 src/HTAlert.c:487
+msgid "no"
+msgstr "không"
+
+#.
+#. * Special-purpose workaround for gettext support (we should do
+#. * this in a more general way) -TD
+#. *
+#. * NOTE TO TRANSLATORS: If the prompt has been rendered into
+#. * another language, and if yes/no are distinct, assume the
+#. * translator can make an ordered list in parentheses with one
+#. * capital letter for each as we assumed in HTConfirmDefault().
+#. * The list has to be in the same order as in the original message,
+#. * and the four capital letters chosen to not match those in the
+#. * original unless they have the same position.
+#. *
+#. * Example:
+#. * (Y/N/Always/neVer) - English (original)
+#. * (O/N/Toujours/Jamais) - French
+#.
+#: src/HTAlert.c:938
+msgid "Y/N/A/V"
+msgstr "Có/Không/Luôn luôn/khônG bao giá»"
+
+#: src/HTML.c:5767
+msgid "Description:"
+msgstr "Mô tả:"
+
+#: src/HTML.c:5772
+msgid "(none)"
+msgstr "(không có)"
+
+#: src/HTML.c:5776
+msgid "Filepath:"
+msgstr "ÄÆ°á»ng dẫn tập tin:"
+
+#: src/HTML.c:5782
+msgid "(unknown)"
+msgstr "(không rõ)"
+
+#: src/HTML.c:7220
+msgid "Document has only hidden links. Use the 'l'ist command."
+msgstr "Tài liệu chỉ có các liên kết ẩn. Hãy dùng câu lệnh liệt kê [L]."
+
+#: src/HTML.c:7721
+msgid "Source cache error - disk full?"
+msgstr "Lỗi bộ nhớ tạm nguồn - đĩa đầy?"
+
+#: src/HTML.c:7734
+msgid "Source cache error - not enough memory!"
+msgstr "Lỗi bộ nhớ tạm nguồn - không đủ bộ nhớ!"
+
+#: src/LYBookmark.c:167
+msgid ""
+" This file is an HTML representation of the X Mosaic hotlist file.\n"
+" Outdated or invalid links may be removed by using the\n"
+" remove bookmark command, it is usually the 'R' key but may have\n"
+" been remapped by you or your system administrator."
+msgstr ""
+" Tập tin này là một bản đại diện HTML của danh sách nóng của Mosaic X.\n"
+" Có thể xóa các liên kết đã lá»—i thá»i hoặc không đúng bằng câu lệnh\n"
+" gỡ bá» Äánh dấu [R]."
+
+#: src/LYBookmark.c:380
+#, c-format
+msgid ""
+" You can delete links by the 'R' key<br>\n"
+"<ol>\n"
+msgstr ""
+" Có thể xóa liên kết bằng phím “Râ€<br>\n"
+"<ol>\n"
+
+#: src/LYBookmark.c:383
+msgid ""
+" You can delete links using the remove bookmark command. It is usually\n"
+" the 'R' key but may have been remapped by you or your system\n"
+" administrator."
+msgstr " Có thể xóa liên kết bằng câu lệnh gỡ bá» Äánh dấu [R]."
+
+#: src/LYBookmark.c:387
+msgid ""
+" This file also may be edited with a standard text editor to delete\n"
+" outdated or invalid links, or to change their order."
+msgstr ""
+" Cũng có thể chỉnh sửa tập tin này bằng một trình soạn thảo văn bản\n"
+" thông thÆ°á»ng để xóa Ä‘i những liên kết đã lá»—i thá»i hoặc sai, hoặc\n"
+" thay đổi thứ tự của chúng."
+
+#: src/LYBookmark.c:390
+msgid ""
+"Note: if you edit this file manually\n"
+" you should not change the format within the lines\n"
+" or add other HTML markup.\n"
+" Make sure any bookmark link is saved as a single line."
+msgstr ""
+"Chú ý: nếu sửa tập tin này thủ công\n"
+" thì đừng thay đổi định dạng trong các dòng\n"
+" hoặc thêm những thẻ HTML khác.\n"
+" Cần ghi duy nhất má»™t liên kết Äánh dấu trên má»—i dòng."
+
+#: src/LYBookmark.c:686
+#, c-format
+msgid "File may be recoverable from %s during this session"
+msgstr "Có thể phục hồi tập tin từ %s trong phiên chạy này"
+
+#: src/LYCgi.c:161
+#, c-format
+msgid "Do you want to execute \"%s\"?"
+msgstr "Bạn có muốn thực hiện “%s†không?"
+
+#.
+#. * Neither the path as given nor any components examined by backing up
+#. * were stat()able. - kw
+#.
+#: src/LYCgi.c:276
+msgid "Unable to access cgi script"
+msgstr "Không thể truy cập đến văn lệnh CGI"
+
+#: src/LYCgi.c:709 src/LYCgi.c:712
+msgid "Good Advice"
+msgstr "Gợi ý"
+
+#: src/LYCgi.c:716
+msgid "An excellent http server for VMS is available via"
+msgstr "Một máy phục vụ HTTP tuyệt với cho VMS có tại"
+
+#: src/LYCgi.c:723
+msgid "this link"
+msgstr "liên kết này"
+
+#: src/LYCgi.c:727
+msgid "It provides state of the art CGI script support.\n"
+msgstr "Nó cung cấp hỗ trợ tiên tiến nhất của văn lệnh CGI.\n"
+
+#: src/LYClean.c:115
+msgid "Exiting via interrupt:"
+msgstr "Äang thoát do bị gián Ä‘oạn:"
+
+#: src/LYCookie.c:2651
+msgid "(from a previous session)"
+msgstr "(từ một phiên chạy trước)"
+
+#: src/LYCookie.c:2712
+msgid "Maximum Gobble Date:"
+msgstr "Ngày Gobble tối đa:"
+
+#: src/LYCookie.c:2751
+msgid "Internal"
+msgstr "Ná»™i bá»™"
+
+#: src/LYCookie.c:2752
+msgid "cookie_domain_flag_set error, aborting program"
+msgstr "lỗi cookie_domain_flag_set, đang hủy bỠchương trình"
+
+#: src/LYCurses.c:1127
+msgid "Terminal reinitialisation failed - unknown terminal type?"
+msgstr "Gặp lỗi khi khởi tạo lại thiết bị cuối — không rõ kiểu thiết bị cuối?"
+
+#: src/LYCurses.c:1334
+msgid "Terminal initialisation failed - unknown terminal type?"
+msgstr "Gặp lỗi khi khởi tạo thiết bị cuối — không rõ kiểu thiết bị cuối?"
+
+#: src/LYCurses.c:1828
+msgid "Terminal ="
+msgstr "Thiết bị cuối ="
+
+#: src/LYCurses.c:1832
+msgid "You must use a vt100, 200, etc. terminal with this program."
+msgstr "Phải dùng một thiết bị cuối kiểu VT100, VT200 v.v. với chương trình này."
+
+#: src/LYCurses.c:1881
+msgid "Your Terminal type is unknown!"
+msgstr "Không rõ kiểu thiết bị cuối của bạn!"
+
+#: src/LYCurses.c:1882
+msgid "Enter a terminal type:"
+msgstr "Nhập một kiểu thiết bị cuối:"
+
+#: src/LYCurses.c:1896
+msgid "TERMINAL TYPE IS SET TO"
+msgstr "KIỂU THIẾT BỊ CUá»I ÄẶT THÀNH"
+
+#: src/LYCurses.c:2455
+#, c-format
+msgid ""
+"\n"
+"A Fatal error has occurred in %s Ver. %s\n"
+msgstr ""
+"\n"
+"Gặp lá»—i nghiêm trá»ng trong %s phiên bản %s\n"
+
+#: src/LYCurses.c:2458
+#, c-format
+msgid ""
+"\n"
+"Please notify your system administrator to confirm a bug, and if\n"
+"confirmed, to notify the lynx-dev list. Bug reports should have concise\n"
+"descriptions of the command and/or URL which causes the problem, the\n"
+"operating system name with version number, the TCPIP implementation, the\n"
+"TRACEBACK if it can be captured, and any other relevant information.\n"
+msgstr ""
+"\n"
+"Hãy xin nhà quản trị hệ thống cho phép gửi báo cáo lỗi, và nếu\n"
+"đồng ý thì gửi thư lên danh sách lynx-dev. Báo cáo lỗi cần có mô tả ngắn\n"
+"gá»i câu lệnh và/hoặc URL gây ra vấn Ä‘á», tên hệ Ä‘iá»u hành có kèm số phiên\n"
+"bản, phiên bản TCPIP, TRACEBACK nếu có thể lấy, và những thông tin\n"
+"thích hợp khác.\n"
+
+#: src/LYEdit.c:272
+#, c-format
+msgid "Error starting editor, %s"
+msgstr "Gặp lỗi khi khởi chạy trình soạn thảo, %s"
+
+#: src/LYEdit.c:275
+msgid "Editor killed by signal"
+msgstr "Trình soạn thảo do tín diệt"
+
+#: src/LYEdit.c:280
+#, c-format
+msgid "Editor returned with error status %s"
+msgstr "Trình soạn thảo đã trả vỠvới trạng thái lỗi %s"
+
+#: src/LYDownload.c:511
+msgid "Downloaded link:"
+msgstr "Liên kết đã tải vá»:"
+
+#: src/LYDownload.c:516
+msgid "Suggested file name:"
+msgstr "Tên tập tin đã đỠnghị:"
+
+#: src/LYDownload.c:521
+msgid "Standard download options:"
+msgstr "Tùy chá»n tải vá» tiêu chuẩn:"
+
+#: src/LYDownload.c:522
+msgid "Download options:"
+msgstr "Tùy chá»n tải vá»:"
+
+#: src/LYDownload.c:538
+msgid "Save to disk"
+msgstr "Lưu vào đĩa"
+
+#: src/LYDownload.c:552
+msgid "View temporary file"
+msgstr "Xem tập tin tạm thá»i"
+
+#: src/LYDownload.c:559
+msgid "Save to disk disabled."
+msgstr "Chức năng lưu vào đĩa đã bị tắt."
+
+#: src/LYDownload.c:563 src/LYPrint.c:1331
+msgid "Local additions:"
+msgstr "Äồ thêm cục bá»™:"
+
+#: src/LYDownload.c:574 src/LYUpload.c:206
+msgid "No Name Given"
+msgstr "Chưa đưa ra tên"
+
+#: src/LYHistory.c:676
+msgid "You selected:"
+msgstr "Bạn đã chá»n:"
+
+#: src/LYHistory.c:700 src/LYHistory.c:929
+msgid "(no address)"
+msgstr "(không có địa chỉ)"
+
+#: src/LYHistory.c:704
+msgid " (internal)"
+msgstr " (ná»™i bá»™)"
+
+#: src/LYHistory.c:706
+msgid " (was internal)"
+msgstr " (đã nội bộ)"
+
+#: src/LYHistory.c:804
+msgid " (From History)"
+msgstr " (Từ Lịch sử)"
+
+#: src/LYHistory.c:849
+msgid "You visited (POSTs, bookmark, menu and list files excluded):"
+msgstr "Äã viếng thăm (loại trừ POST, Äánh dấu, trình Ä‘Æ¡n và danh sách tập tin):"
+
+#: src/LYHistory.c:1151
+msgid "(No messages yet)"
+msgstr "(Chưa có thư.)"
+
+#: src/LYLeaks.c:222
+msgid "Invalid pointer detected."
+msgstr "Phát hiện con trỠkhông hợp lệ."
+
+#: src/LYLeaks.c:224 src/LYLeaks.c:262
+msgid "Sequence:"
+msgstr "Dãy:"
+
+#: src/LYLeaks.c:227 src/LYLeaks.c:265
+msgid "Pointer:"
+msgstr "Con trá»:"
+
+#: src/LYLeaks.c:236 src/LYLeaks.c:243 src/LYLeaks.c:284
+msgid "FileName:"
+msgstr "Tên_tập_tin:"
+
+#: src/LYLeaks.c:239 src/LYLeaks.c:246 src/LYLeaks.c:287 src/LYLeaks.c:298
+msgid "LineCount:"
+msgstr "Äếm_dòng:"
+
+#: src/LYLeaks.c:260
+msgid "Memory leak detected."
+msgstr "Phát hiện bộ nhớ rò rỉ."
+
+#: src/LYLeaks.c:268
+msgid "Contains:"
+msgstr "Chứa:"
+
+#: src/LYLeaks.c:281
+msgid "ByteSize:"
+msgstr "Cỡ_Byte:"
+
+#: src/LYLeaks.c:295
+msgid "realloced:"
+msgstr "cấp phát lại bộ nhớ:"
+
+#: src/LYLeaks.c:316
+msgid "Total memory leakage this run:"
+msgstr "Tổng số bộ nhớ rò rỉ lần chạy này:"
+
+#: src/LYLeaks.c:320
+msgid "Peak allocation"
+msgstr "Cấp phát cao điểm"
+
+#: src/LYLeaks.c:322
+msgid "Bytes allocated"
+msgstr "Byte cấp phát"
+
+#: src/LYLeaks.c:324
+msgid "Total mallocs"
+msgstr "Tổng lần cấp phát bộ nhớ"
+
+#: src/LYLeaks.c:326
+msgid "Total frees"
+msgstr "Tổng lần giải phóng"
+
+#: src/LYList.c:89
+msgid "References in "
+msgstr "Tham chiếu trong "
+
+#: src/LYList.c:92
+msgid "this document:"
+msgstr "tài liệu này:"
+
+#: src/LYList.c:98 src/LYList.c:362
+msgid "Visible links:"
+msgstr "Liên kết hiển thị:"
+
+#: src/LYList.c:202 src/LYList.c:321
+msgid "Hidden links:"
+msgstr "Liên kết ẩn:"
+
+#: src/LYList.c:358
+msgid "References"
+msgstr "Tham chiếu"
+
+#: src/LYLocal.c:289
+#, c-format
+msgid "Unable to get status of '%s'."
+msgstr "Không thể lấy trạng thái vỠ“%sâ€."
+
+#: src/LYLocal.c:354
+msgid "The selected item is not a file or a directory! Request ignored."
+msgstr "Bạn đã chá»n má»™t mục không phải là tập tin hoặc thÆ° mục. Yêu cầu bị bá» qua."
+
+#: src/LYLocal.c:456
+#, c-format
+msgid "Unable to %s due to system error!"
+msgstr "Không thể %s do lỗi hệ thống!"
+
+#: src/LYLocal.c:490
+#, c-format
+msgid "Probable failure to %s due to system error!"
+msgstr "%s rất có thể thất bại do lỗi hệ thống!"
+
+#: src/LYLocal.c:555 src/LYLocal.c:578
+#, c-format
+msgid "remove %s"
+msgstr "bá» %s"
+
+#: src/LYLocal.c:598
+#, c-format
+msgid "touch %s"
+msgstr "sá» %s"
+
+#: src/LYLocal.c:628
+#, c-format
+msgid "move %s to %s"
+msgstr "chuyển %s vào %s"
+
+#: src/LYLocal.c:676
+msgid "There is already a directory with that name! Request ignored."
+msgstr "Äã có má»™t thÆ° mục tên đó! Yêu cầu bị bá» qua."
+
+#: src/LYLocal.c:678
+msgid "There is already a file with that name! Request ignored."
+msgstr "Äã có má»™t tập tin tên đó! Yêu cầu bị bá» qua."
+
+#: src/LYLocal.c:680
+msgid "The specified name is already in use! Request ignored."
+msgstr "Bạn đã ghi rõ một tên đang được dùng. Yêu cầu bị bỠqua."
+
+#: src/LYLocal.c:692
+msgid "Destination has different owner! Request denied."
+msgstr "Äích đến có chủ sở hữu khác! Yêu cầu bị bá» qua."
+
+#: src/LYLocal.c:695
+msgid "Destination is not a valid directory! Request denied."
+msgstr "Äích đến không phải là thÆ° mục hợp lệ. Yêu cầu bị bá» qua."
+
+#: src/LYLocal.c:711
+msgid "Source and destination are the same location! Request ignored!"
+msgstr "Nguồn và đích là cùng một vị trí! Yêu cầu bị bỠqua!"
+
+#: src/LYLocal.c:735
+msgid "Remove all tagged files and directories?"
+msgstr "Gỡ bỠtất cả các tập tin và thư mục có thẻ?"
+
+#: src/LYLocal.c:808
+msgid "Enter new location for tagged items: "
+msgstr "Nhập vị trí mới cho các mục có thẻ: "
+
+#: src/LYLocal.c:906
+msgid "Enter new name for directory: "
+msgstr "Nhập tên mới cho thư mục: "
+
+#: src/LYLocal.c:908
+msgid "Enter new name for file: "
+msgstr "Nhập tên mới cho tập tin: "
+
+#: src/LYLocal.c:920
+msgid "Illegal character (path-separator) found! Request ignored."
+msgstr "Gặp ký tá»± (dấu tách Ä‘Æ°á»ng dẫn) không cho phép! Yêu cầu bị bá» qua."
+
+#: src/LYLocal.c:970
+msgid "Enter new location for directory: "
+msgstr "Nhập vị trí mới cho thư mục: "
+
+#: src/LYLocal.c:972
+msgid "Enter new location for file: "
+msgstr "Nhập vị trí mới cho tập tin: "
+
+#: src/LYLocal.c:999
+msgid "Unexpected failure - unable to find trailing path separator"
+msgstr "Lá»—i không mong đợi - không tìm thấy dấu tách Ä‘Æ°á»ng dẫn theo sau"
+
+#: src/LYLocal.c:1061
+msgid "Modify name, location, or permission (n, l, or p): "
+msgstr "Sá»­a [N] tên, [L] vị trí, hoặc [P] quyá»n hạn: "
+
+#: src/LYLocal.c:1063
+msgid "Modify name or location (n or l): "
+msgstr "Sửa tên hoặc vị trí (n/l): "
+
+#.
+#. * Code for changing ownership needed here.
+#.
+#: src/LYLocal.c:1092
+msgid "This feature not yet implemented!"
+msgstr "Tính năng này vẫn không được thực thi hoàn toàn!"
+
+#: src/LYLocal.c:1113
+msgid "Enter name of file to create: "
+msgstr "Hãy nhập tên của tập tin cần tạo: "
+
+#: src/LYLocal.c:1116 src/LYLocal.c:1153
+msgid "Illegal redirection \"//\" found! Request ignored."
+msgstr "Sự chuyển hướng “//†không cho phép. Yêu cầu bị bỠqua."
+
+#: src/LYLocal.c:1150
+msgid "Enter name for new directory: "
+msgstr "Nhập tên cho thư mục mới: "
+
+#: src/LYLocal.c:1191
+msgid "Create file or directory (f or d): "
+msgstr "Tạo [F] tập tin hoặc [D] thư mục: "
+
+#: src/LYLocal.c:1233
+#, c-format
+msgid "Remove directory '%s'?"
+msgstr "Gỡ bỠthư mục “%s†không?"
+
+#: src/LYLocal.c:1236
+msgid "Remove directory?"
+msgstr "Gỡ bỠthư mục không?"
+
+#: src/LYLocal.c:1241
+#, c-format
+msgid "Remove file '%s'?"
+msgstr "Gỡ bỠtập tin “%s†không?"
+
+#: src/LYLocal.c:1243
+msgid "Remove file?"
+msgstr "Gỡ bỠtập tin không?"
+
+#: src/LYLocal.c:1248
+#, c-format
+msgid "Remove symbolic link '%s'?"
+msgstr "Gỡ bá» liên kết má»m “%s†không?"
+
+#: src/LYLocal.c:1250
+msgid "Remove symbolic link?"
+msgstr "Gỡ bá» liên kết má»m không?"
+
+#: src/LYLocal.c:1348
+msgid "Sorry, don't know how to permit non-UNIX files yet."
+msgstr "Tiếc là chưa biết cho phép tập tin khác UNIX như thể nào."
+
+#: src/LYLocal.c:1377
+msgid "Unable to open permit options file"
+msgstr "Không thể mở tập tin tùy chá»n cho phép"
+
+#: src/LYLocal.c:1405
+msgid "Specify permissions below:"
+msgstr "Hãy đặt quyá»n hạn bên dÆ°á»›i:"
+
+#: src/LYLocal.c:1406 src/LYShowInfo.c:291
+msgid "Owner:"
+msgstr "Chủ:"
+
+#: src/LYLocal.c:1422
+msgid "Group"
+msgstr "Nhóm"
+
+#: src/LYLocal.c:1438
+msgid "Others:"
+msgstr "Khác:"
+
+#: src/LYLocal.c:1456
+msgid "form to permit"
+msgstr "biểu mẫu để cho phép"
+
+#: src/LYLocal.c:1552
+msgid "Invalid mode format."
+msgstr "Äịnh dạng chế Ä‘á»™ không hợp lệ."
+
+#: src/LYLocal.c:1556
+msgid "Invalid syntax format."
+msgstr "Äịnh dạng cú pháp không hợp lệ."
+
+#: src/LYLocal.c:1743
+msgid "Warning! UUDecoded file will exist in the directory you started Lynx."
+msgstr "Cảnh báo! Tập tin đã giải nén UUDecode sẽ nằm trong thư mục đã chạy Lynx."
+
+#: src/LYLocal.c:1933
+msgid "NULL URL pointer"
+msgstr "Cái chỉ URL RỖNG"
+
+#: src/LYLocal.c:2015
+#, c-format
+msgid "Executing %s "
+msgstr "Äang thá»±c hiện %s "
+
+#: src/LYLocal.c:2018
+msgid "Executing system command. This might take a while."
+msgstr "Äang thá»±c hiện câu lệnh hệ thống. Có thể hÆ¡i lâu."
+
+#: src/LYLocal.c:2092
+msgid "Current directory:"
+msgstr "Thư mục hiện tại:"
+
+#: src/LYLocal.c:2095 src/LYLocal.c:2113
+msgid "Current selection:"
+msgstr "Vùng chá»n hiện có:"
+
+#: src/LYLocal.c:2099
+msgid "Nothing currently selected."
+msgstr "ChÆ°a chá»n gì."
+
+#: src/LYLocal.c:2115
+msgid "tagged item:"
+msgstr "mục có thẻ:"
+
+#: src/LYLocal.c:2116
+msgid "tagged items:"
+msgstr "mục có thẻ:"
+
+#: src/LYLocal.c:2216 src/LYLocal.c:2225
+msgid "Illegal filename; request ignored."
+msgstr "Tên tập tin cấm: yêu cầu bị bỠqua."
+
+#. directory not writable
+#: src/LYLocal.c:2323 src/LYLocal.c:2382
+msgid "Install in the selected directory not permitted."
+msgstr "Không cho phép cài đặt vào thÆ° mục đã chá»n."
+
+#: src/LYLocal.c:2378
+msgid "The selected item is not a directory! Request ignored."
+msgstr "Bạn đã chá»n má»™t mục không phải là thÆ° mục. Yêu cầu bị bá» qua."
+
+#: src/LYLocal.c:2387
+msgid "Just a moment, ..."
+msgstr "ChỠmột giây, …"
+
+#: src/LYLocal.c:2404
+msgid "Error building install args"
+msgstr "Gặp lỗi khi xây dựng các đối số cài đặt"
+
+#: src/LYLocal.c:2419 src/LYLocal.c:2450
+#, c-format
+msgid "Source and target are the same: %s"
+msgstr "Nguồn và đích là trùng: %s"
+
+#: src/LYLocal.c:2426 src/LYLocal.c:2457
+#, c-format
+msgid "Already in target directory: %s"
+msgstr "Äã có trong thÆ° mục đích: %s"
+
+#: src/LYLocal.c:2475
+msgid "Installation complete"
+msgstr "Cài đặt hoàn tất"
+
+#: src/LYLocal.c:2678
+msgid "Temporary URL or list would be too long."
+msgstr "URL tạm thá»i hoặc danh sách quá dài."
+
+#: src/LYMail.c:566
+msgid "Sending"
+msgstr "Äang gá»­i"
+
+#: src/LYMail.c:1050
+#, c-format
+msgid "The link %s :?: %s \n"
+msgstr "Liên kết %s :?: %s \n"
+
+#: src/LYMail.c:1052
+#, c-format
+msgid "called \"%s\"\n"
+msgstr "tên “%sâ€\n"
+
+#: src/LYMail.c:1053
+#, c-format
+msgid "in the file \"%s\" called \"%s\"\n"
+msgstr "trong tập tin “%s†tên “%sâ€\n"
+
+#: src/LYMail.c:1054
+msgid "was requested but was not available."
+msgstr "đã được yêu cầu còn hiện tại không sẵn sàng."
+
+#: src/LYMail.c:1055
+msgid "Thought you might want to know."
+msgstr "Thông tin cho bạn biết."
+
+#: src/LYMail.c:1057
+msgid "This message was automatically generated by"
+msgstr "Thông điệp này đã tự động được tạo bởi"
+
+#: src/LYMail.c:1770
+msgid "No system mailer configured"
+msgstr "Chưa cấu hình trình thư cho hệ thống"
+
+#: src/LYMain.c:1088
+msgid "No Winsock found, sorry."
+msgstr "Tiếc là không tìm thấy Winsock."
+
+#: src/LYMain.c:1278
+msgid "You MUST define a valid TMP or TEMP area!"
+msgstr "PHẢI chỉ ra má»™t vùng TMP hoặc TEMP (tạm thá»i)!"
+
+#: src/LYMain.c:1331 src/LYMainLoop.c:5285
+msgid "No such directory"
+msgstr "Không có thư mục nào như vậy"
+
+#: src/LYMain.c:1525
+#, c-format
+msgid ""
+"\n"
+"Configuration file \"%s\" is not available.\n"
+"\n"
+msgstr ""
+"\n"
+"Tập tin cấu hình “%s†không sẵn sàng.\n"
+"\n"
+
+#: src/LYMain.c:1535
+#, c-format
+msgid ""
+"\n"
+"Lynx character sets not declared.\n"
+"\n"
+msgstr ""
+"\n"
+"Chưa khai báo bộ ký tự Lynx.\n"
+
+#: src/LYMain.c:1691
+#, c-format
+msgid "Ignored %d characters from standard input.\n"
+msgstr "Äã bá» qua %d ký tá»± từ đầu vào tiêu chuẩn.\n"
+
+#: src/LYMain.c:1693
+#, c-format
+msgid "Use \"-stdin\" or \"-\" to tell how to handle piped input.\n"
+msgstr "Dùng cỠ“-stdin†hay “-†để báo nên xử lý dữ liệu nhập qua ống dẫn như thế nào.\n"
+
+#: src/LYMain.c:1851
+msgid "Warning:"
+msgstr "Cảnh báo:"
+
+#: src/LYMain.c:2419
+msgid "persistent cookies state will be changed in next session only."
+msgstr "trạng thái cố định của cookie sẽ chỉ thay đổi trong phiên chạy tiếp theo."
+
+#: src/LYMain.c:2654 src/LYMain.c:2698
+#, c-format
+msgid "Lynx: ignoring unrecognized charset=%s\n"
+msgstr "Lynx: đang bỠqua “charset=%s†(bộ ký tự) không nhận ra\n"
+
+#: src/LYMain.c:3215
+#, c-format
+msgid "%s Version %s (%s)"
+msgstr "%s Phiên bản %s (%s)"
+
+#: src/LYMain.c:3256
+#, c-format
+msgid "Built on %s%s.\n"
+msgstr "Xây dựng trên %s%s.\n"
+
+#: src/LYMain.c:3270
+msgid "Copyrights held by the Lynx Developers Group,"
+msgstr "Äăng ký bản quyá»n bởi Nhóm Nhà Phát Triển Lynx,"
+
+#: src/LYMain.c:3271
+msgid "the University of Kansas, CERN, and other contributors."
+msgstr "đại há»c Kansas, CERN, và những nhà đóng góp khác."
+
+#: src/LYMain.c:3272
+msgid "Distributed under the GNU General Public License (Version 2)."
+msgstr "Äược phát hành vá»›i Ä‘iá»u kiện của Giấy Phép Công Cá»™ng GNU (GPL) phiên bản 2."
+
+#: src/LYMain.c:3273
+msgid "See https://lynx.invisible-island.net/ and the online help for more information."
+msgstr "Xin hãy ghé thăm “https://lynx.invisible-island.net/†và trợ giúp trực tuyến để xem thêm thông tin chi tiết."
+
+#: src/LYMain.c:4120
+#, c-format
+msgid "USAGE: %s [options] [file]\n"
+msgstr "Cách dùng: %s [tùy_chá»n] [tập_tin]\n"
+
+#: src/LYMain.c:4121
+#, c-format
+msgid "Options are:\n"
+msgstr "Tùy chá»n:\n"
+
+#: src/LYMain.c:4424
+#, c-format
+msgid "%s: Invalid Option: %s\n"
+msgstr "%s: Tùy chá»n không hợp lệ: %s\n"
+
+#: src/LYMainLoop.c:572
+#, c-format
+msgid "Internal error: Invalid mouse link %d!"
+msgstr "Lỗi nội bộ: liên kết con chuột không hợp lệ %d!"
+
+#: src/LYMainLoop.c:693 src/LYMainLoop.c:5307
+msgid "A URL specified by the user"
+msgstr "Má»™t địa chỉ URL được ngÆ°á»i dùng xác định"
+
+#: src/LYMainLoop.c:1142
+msgid "Enctype multipart/form-data not yet supported! Cannot submit."
+msgstr "Chưa hỗ trợ dạng bảng mã multipart/form-data (đa phần, dữ liệu biểu mẫu) nên không thể gửi đi."
+
+#.
+#. * Make a name for this help file.
+#.
+#: src/LYMainLoop.c:3197
+msgid "Help Screen"
+msgstr "Màn hình Trợ giúp"
+
+#: src/LYMainLoop.c:3328
+msgid "System Index"
+msgstr "Chỉ mục Hệ thống"
+
+#: src/LYMainLoop.c:3577
+#, c-format
+msgid "Query parameter %d: "
+msgstr "Tham số truy vấn %d: "
+
+#: src/LYMainLoop.c:3806 src/LYMainLoop.c:5583
+msgid "Entry into main screen"
+msgstr "Vào màn hình chính"
+
+#: src/LYMainLoop.c:4064
+msgid "No next document present"
+msgstr "Không có tài liệu kế tiếp"
+
+#: src/LYMainLoop.c:4359
+msgid "charset for this document specified explicitly, sorry..."
+msgstr "tiếc là bộ ký tự của tài liệu này được chỉ ra rõ ràng…"
+
+#: src/LYMainLoop.c:5265
+msgid "cd to:"
+msgstr "cd (chuyển đổi thư mục) sang:"
+
+#: src/LYMainLoop.c:5288
+msgid "A component of path is not a directory"
+msgstr "Má»™t thành phần của Ä‘Æ°á»ng dẫn không phải là thÆ° mục"
+
+#: src/LYMainLoop.c:5291
+msgid "failed to change directory"
+msgstr "lỗi chuyển đổi thư mục"
+
+#: src/LYMainLoop.c:6517
+msgid "Reparsing document under current settings..."
+msgstr "Äang phân tích lại tài liệu vá»›i cài đặt hiện tại…"
+
+#: src/LYMainLoop.c:6811
+#, c-format
+msgid "Fatal error - could not open output file %s\n"
+msgstr "Lỗi nghiêm trong — không thể mở tập tin kết xuất %s\n"
+
+#: src/LYMainLoop.c:7153
+msgid "TABLE center enable."
+msgstr "BẢNG ở giữa bật."
+
+#: src/LYMainLoop.c:7156
+msgid "TABLE center disable."
+msgstr "BẢNG ở giữa tắt."
+
+#: src/LYMainLoop.c:7236
+msgid "Current URL is empty."
+msgstr "Äịa chỉ URI hiện tại còn rá»—ng."
+
+#: src/LYMainLoop.c:7238 src/LYUtils.c:1909
+msgid "Copy to clipboard failed."
+msgstr "Lỗi sao chép vào bảng nháp."
+
+#: src/LYMainLoop.c:7240
+msgid "Document URL put to clipboard."
+msgstr "Äịa chỉ URL của tài liệu được chuyển vào bảng nháp."
+
+#: src/LYMainLoop.c:7242
+msgid "Link URL put to clipboard."
+msgstr "Äịa chỉ URL của liên kết được chuyển vào bảng nháp."
+
+#: src/LYMainLoop.c:7269
+msgid "No URL in the clipboard."
+msgstr "Không có địa chỉ URL trên bảng nháp."
+
+#: src/LYMainLoop.c:7962 src/LYMainLoop.c:8133
+msgid "-index-"
+msgstr "-chỉ mục-"
+
+#: src/LYMainLoop.c:8071
+msgid "lynx: Can't access startfile"
+msgstr "lynx: không thể truy cập đến tập tin bắt đầu (startfile)"
+
+#: src/LYMainLoop.c:8083
+msgid "lynx: Start file could not be found or is not text/html or text/plain"
+msgstr "lynx: Không tìm thấy tập tin bắt đầu hoặc không phải là text/html (văn bản/HTML) hay text/plain (văn bản thô)"
+
+#: src/LYMainLoop.c:8084
+msgid " Exiting..."
+msgstr " Äang thoát…"
+
+#: src/LYMainLoop.c:8127
+msgid "-more-"
+msgstr "-thêm-"
+
+#. Enable scrolling.
+#: src/LYNews.c:186
+msgid "You will be posting to:"
+msgstr "Bạn sẽ gửi tới:"
+
+#.
+#. * Get the mail address for the From header, offering personal_mail_address
+#. * as default.
+#.
+#: src/LYNews.c:195
+msgid ""
+"\n"
+"\n"
+" Please provide your mail address for the From: header\n"
+msgstr ""
+"\n"
+"\n"
+"Xin hãy thêm địa chỉ thư điện tử của bạn cho dòng đầu Từ: (From)\n"
+
+#.
+#. * Get the Subject header, offering the current document's title as the
+#. * default if this is a followup rather than a new post. - FM
+#.
+#: src/LYNews.c:212
+msgid ""
+"\n"
+"\n"
+" Please provide or edit the Subject: header\n"
+msgstr ""
+"\n"
+"\n"
+" Xin hãy thêm hoặc sá»­a dòng đầu Chủ Ä‘á»: (Subject)\n"
+
+#: src/LYNews.c:302
+msgid ""
+"\n"
+"\n"
+" Please provide or edit the Organization: header\n"
+msgstr ""
+"\n"
+"\n"
+" Xin hãy thêm hoặc sửa dòng đầu Tổ chức (Organization):\n"
+
+#.
+#. * Use the built in line editior.
+#.
+#: src/LYNews.c:359
+msgid ""
+"\n"
+"\n"
+" Please enter your message below."
+msgstr ""
+"\n"
+"\n"
+"Hãy gõ thư bên dưới."
+
+#: src/LYNews.c:405
+msgid "Message has no original text!"
+msgstr "Thư không có văn bản gốc!"
+
+#: src/LYOptions.c:774
+msgid "review/edit B)ookmarks files"
+msgstr "[B] xem lại/sá»­a tập tin Äánh dấu"
+
+#: src/LYOptions.c:776
+msgid "B)ookmark file: "
+msgstr "Tập tin Äánh d)ấu: "
+
+#: src/LYOptions.c:2131 src/LYOptions.c:2138
+msgid "ON"
+msgstr "BẬT"
+
+#. verbose_img variable
+#. LYCollapseBRs variable
+#. LYtrimBlankLines variable
+#: src/LYOptions.c:2132 src/LYOptions.c:2137 src/LYOptions.c:2321
+#: src/LYOptions.c:2330 src/LYOptions.c:2339 src/LYOptions.c:2350
+msgid "OFF"
+msgstr "TẮT"
+
+#: src/LYOptions.c:2133
+msgid "NEVER"
+msgstr "KHÔNG BAO GIỜ"
+
+#: src/LYOptions.c:2134
+msgid "ALWAYS"
+msgstr "LUÔN LUÔN"
+
+#: src/LYOptions.c:2150 src/LYOptions.c:2313
+msgid "ignore"
+msgstr "bá» qua"
+
+#: src/LYOptions.c:2151
+msgid "ask user"
+msgstr "há»i ngÆ°á»i dùng"
+
+#: src/LYOptions.c:2152
+msgid "accept all"
+msgstr "chấp nhận tất cả"
+
+#: src/LYOptions.c:2164
+msgid "ALWAYS OFF"
+msgstr "LUÔN LUÔN TẮT"
+
+#: src/LYOptions.c:2165
+msgid "FOR LOCAL FILES ONLY"
+msgstr "CHỈ CHO TẬP TIN CỤC BỘ"
+
+#: src/LYOptions.c:2167
+msgid "ALWAYS ON"
+msgstr "LUÔN LUÔN BẬT"
+
+#: src/LYOptions.c:2179
+msgid "Numbers act as arrows"
+msgstr "Số hoạt động như mũi tên"
+
+#: src/LYOptions.c:2181
+msgid "Links are numbered"
+msgstr "Liên kết có số thứ tự"
+
+#: src/LYOptions.c:2184
+msgid "Links and form fields are numbered"
+msgstr "Các liên kết và trÆ°á»ng biểu mẫu Ä‘á»u có số thứ tá»±"
+
+#: src/LYOptions.c:2187
+msgid "Form fields are numbered"
+msgstr "TrÆ°á»ng biểu mẫu có số thứ tá»±"
+
+#: src/LYOptions.c:2202
+msgid "Case insensitive"
+msgstr "Không phân biệt HOA/thÆ°á»ng"
+
+#: src/LYOptions.c:2203
+msgid "Case sensitive"
+msgstr "Phân biệt HOA/thÆ°á»ng"
+
+#: src/LYOptions.c:2237
+msgid "prompt normally"
+msgstr "nhắc bình thÆ°á»ng"
+
+#: src/LYOptions.c:2238
+msgid "force yes-response"
+msgstr "buá»™c trả lá»i Có"
+
+#: src/LYOptions.c:2239
+msgid "force no-response"
+msgstr "buá»™c trả lá»i Không"
+
+#: src/LYOptions.c:2249
+msgid "RFC 2109"
+msgstr "RFC 2109"
+
+#: src/LYOptions.c:2250
+msgid "RFC 2965"
+msgstr "RFC 2965"
+
+#: src/LYOptions.c:2251
+msgid "RFC 6265"
+msgstr "RFC 6265"
+
+#: src/LYOptions.c:2268
+msgid "Novice"
+msgstr "Má»›i"
+
+#: src/LYOptions.c:2269
+msgid "Intermediate"
+msgstr "Trung gian"
+
+#: src/LYOptions.c:2270
+msgid "Advanced"
+msgstr "Cấp cao"
+
+#: src/LYOptions.c:2279
+msgid "By First Visit"
+msgstr "Theo lần thăm đầu tiên"
+
+#: src/LYOptions.c:2281
+msgid "By First Visit Reversed"
+msgstr "Äảo ngược theo lần thăm đầu tiên"
+
+#: src/LYOptions.c:2282
+msgid "As Visit Tree"
+msgstr "Dạng cây thăm"
+
+#: src/LYOptions.c:2283
+msgid "By Last Visit"
+msgstr "Theo lần thăm cuối cùng"
+
+#: src/LYOptions.c:2285
+msgid "By Last Visit Reversed"
+msgstr "Äảo ngược theo lần thăm cuối cùng"
+
+#. Old_DTD variable
+#: src/LYOptions.c:2296
+msgid "relaxed (TagSoup mode)"
+msgstr "buông lá»ng (chế Ä‘á»™ TagSoup)"
+
+#: src/LYOptions.c:2297
+msgid "strict (SortaSGML mode)"
+msgstr "chặt chẽ (chế độ SortaSGML)"
+
+#: src/LYOptions.c:2304
+msgid "Ignore"
+msgstr "Bá» qua"
+
+#: src/LYOptions.c:2305
+msgid "Add to trace-file"
+msgstr "Thêm vào trace-file"
+
+#: src/LYOptions.c:2306
+msgid "Add to LYNXMESSAGES"
+msgstr "Thêm vào LYNXMESSAGES"
+
+#: src/LYOptions.c:2307
+msgid "Warn, point to trace-file"
+msgstr "Lưu ý, chỉ đến trace-file"
+
+#: src/LYOptions.c:2314
+msgid "as labels"
+msgstr "dạng nhãn"
+
+#: src/LYOptions.c:2315
+msgid "as links"
+msgstr "dạng liên kết"
+
+#: src/LYOptions.c:2322
+msgid "show filename"
+msgstr "hiện tên tập tin"
+
+#: src/LYOptions.c:2331
+msgid "collapse"
+msgstr "co lại"
+
+#: src/LYOptions.c:2340
+msgid "trim-lines"
+msgstr "trim-lines"
+
+#: src/LYOptions.c:2351
+msgid "STANDARD"
+msgstr "TIÊU CHUẨN"
+
+#: src/LYOptions.c:2352
+msgid "ADVANCED"
+msgstr "CẤP CAO"
+
+#: src/LYOptions.c:2386
+msgid "Directories first"
+msgstr "Thư mục trước"
+
+#: src/LYOptions.c:2387
+msgid "Files first"
+msgstr "Tập tin trước"
+
+#: src/LYOptions.c:2388
+msgid "Mixed style"
+msgstr "Kiểu hỗn hợp"
+
+#: src/LYOptions.c:2396 src/LYOptions.c:2416
+msgid "By Name"
+msgstr "Theo tên"
+
+#: src/LYOptions.c:2397 src/LYOptions.c:2417
+msgid "By Type"
+msgstr "Theo kiểu"
+
+#: src/LYOptions.c:2398 src/LYOptions.c:2418
+msgid "By Size"
+msgstr "Theo kích cỡ"
+
+#: src/LYOptions.c:2399 src/LYOptions.c:2419
+msgid "By Date"
+msgstr "Theo ngày"
+
+#: src/LYOptions.c:2400
+msgid "By Mode"
+msgstr "Theo chế độ"
+
+#: src/LYOptions.c:2402
+msgid "By User"
+msgstr "Theo ngÆ°á»i dùng"
+
+#: src/LYOptions.c:2403
+msgid "By Group"
+msgstr "Theo nhóm"
+
+#: src/LYOptions.c:2428
+msgid "Do not show rate"
+msgstr "Không hiện tốc độ"
+
+#: src/LYOptions.c:2429 src/LYOptions.c:2430
+#, c-format
+msgid "Show %s/sec rate"
+msgstr "Hiện tốc độ %s/giây"
+
+#: src/LYOptions.c:2432 src/LYOptions.c:2433
+#, c-format
+msgid "Show %s/sec, ETA"
+msgstr "Hiện %s/giây, GiỠtới xấp xỉ"
+
+#: src/LYOptions.c:2434 src/LYOptions.c:2435
+#, c-format
+msgid "Show %s/sec (2-digits), ETA"
+msgstr "Hiện %s/giây (hai chữ số), ETA"
+
+#: src/LYOptions.c:2438
+msgid "Show progressbar"
+msgstr "Hiện thanh tiến hành"
+
+#: src/LYOptions.c:2459
+msgid "Accept lynx's internal types"
+msgstr "Chấp nhận dạng nội bộ của lynx"
+
+#: src/LYOptions.c:2460
+msgid "Also accept lynx.cfg's types"
+msgstr "Cũng chấp dạng của lynx.cfg"
+
+#: src/LYOptions.c:2461
+msgid "Also accept user's types"
+msgstr "CÅ©ng chấp nhận dạng của ngÆ°á»i dùng"
+
+#: src/LYOptions.c:2462
+msgid "Also accept system's types"
+msgstr "Cũng chấp nhận dạng của hệ thống"
+
+#: src/LYOptions.c:2463
+msgid "Accept all types"
+msgstr "Chấp nhận má»i kiểu"
+
+#: src/LYOptions.c:2472
+msgid "gzip"
+msgstr "gzip"
+
+# Name: don't translate/Tên: đừng dịch
+#: src/LYOptions.c:2473
+msgid "deflate"
+msgstr "giải nén"
+
+#: src/LYOptions.c:2476
+msgid "compress"
+msgstr "nén"
+
+#: src/LYOptions.c:2479
+msgid "bzip2"
+msgstr "bzip2"
+
+#: src/LYOptions.c:2481
+msgid "All"
+msgstr "Tất cả"
+
+#: src/LYOptions.c:2491
+msgid "HTTP 1.0"
+msgstr "HTTP 1.0"
+
+#: src/LYOptions.c:2492
+msgid "HTTP 1.1"
+msgstr "HTTP 1.1"
+
+#: src/LYOptions.c:2851 src/LYOptions.c:2880
+#, c-format
+msgid "Use %s to invoke the Options menu!"
+msgstr "Hãy sá»­ dụng %s để gá»i trình Ä‘Æ¡n Tùy chá»n!"
+
+#: src/LYOptions.c:3772
+msgid "(options marked with (!) will not be saved)"
+msgstr "(sẽ không ghi nhá»› tùy chá»n có dấu (!))"
+
+#: src/LYOptions.c:3780
+msgid "General Preferences"
+msgstr "Tùy thích chung"
+
+#. ***************************************************************
+#. User Mode: SELECT
+#: src/LYOptions.c:3784
+msgid "User mode"
+msgstr "Chế Ä‘á»™ ngÆ°á»i dùng"
+
+#. Editor: INPUT
+#: src/LYOptions.c:3790
+msgid "Editor"
+msgstr "Bộ soạn thảo"
+
+#. Search Type: SELECT
+#: src/LYOptions.c:3795
+msgid "Type of Search"
+msgstr "Kiểu tìm kiếm"
+
+#: src/LYOptions.c:3800
+msgid "Security and Privacy"
+msgstr "Bảo mật và Riêng tư"
+
+#. ***************************************************************
+#. Cookies: SELECT
+#: src/LYOptions.c:3804
+msgid "Cookies"
+msgstr "Cookie"
+
+#. Cookie Version: SELECT
+#: src/LYOptions.c:3818
+msgid "Cookie RFC-version"
+msgstr "Cookie RFC-phiên bản"
+
+#. Cookie Prompting: SELECT
+#: src/LYOptions.c:3824
+msgid "Invalid-Cookie Prompting"
+msgstr "Sai nhắc vỠcookie"
+
+#. SSL Prompting: SELECT
+#: src/LYOptions.c:3831
+msgid "SSL Prompting"
+msgstr "Nhắc vỠSSL"
+
+#: src/LYOptions.c:3836
+msgid "SSL client certificate file"
+msgstr "Tập tin chứng thực máy khách SSL"
+
+#: src/LYOptions.c:3840
+msgid "SSL client key file"
+msgstr "Tập tin khóa máy khách SSL"
+
+#: src/LYOptions.c:3846
+msgid "Keyboard Input"
+msgstr "Nhập bàn phím"
+
+#. ***************************************************************
+#. Keypad Mode: SELECT
+#: src/LYOptions.c:3850
+msgid "Keypad mode"
+msgstr "Chế độ vùng phím"
+
+#. Emacs keys: ON/OFF
+#: src/LYOptions.c:3856
+msgid "Emacs keys"
+msgstr "Phím Emacs"
+
+#. VI Keys: ON/OFF
+#: src/LYOptions.c:3862
+msgid "VI keys"
+msgstr "Phím Vi"
+
+#. Line edit style: SELECT
+#. well, at least 2 line edit styles available
+#: src/LYOptions.c:3869
+msgid "Line edit style"
+msgstr "Kiểu sửa dòng"
+
+#. Keyboard layout: SELECT
+#: src/LYOptions.c:3881
+msgid "Keyboard layout"
+msgstr "Bố trí bàn phím"
+
+#.
+#. * Display and Character Set
+#.
+#: src/LYOptions.c:3895
+msgid "Display and Character Set"
+msgstr "Trình bày và Bộ ký tự"
+
+#. Use locale-based character set: ON/OFF
+#: src/LYOptions.c:3900
+msgid "Use locale-based character set"
+msgstr "Dùng bá»™ ký tá»± dá»±a vào miá»n địa phÆ°Æ¡ng"
+
+#: src/LYOptions.c:3907
+msgid "Use HTML5 charset replacements"
+msgstr "Sử dụng bảng mã thay thế HTML5"
+
+#. Display Character Set: SELECT
+#: src/LYOptions.c:3913
+msgid "Display character set"
+msgstr "Bộ ký tự của trình bày"
+
+#: src/LYOptions.c:3944
+msgid "Assumed document character set"
+msgstr "Bộ ký tự tài liệu đã giả sử"
+
+#.
+#. * Since CJK people hardly mixed with other world
+#. * we split the header to make it more readable:
+#. * "CJK mode" for CJK display charsets, and "Raw 8-bit" for others.
+#.
+#: src/LYOptions.c:3964
+msgid "CJK mode"
+msgstr "Chế độ Hoa/Nhật/Hàn"
+
+#: src/LYOptions.c:3966
+msgid "Raw 8-bit"
+msgstr "8-bit thô"
+
+#. X Display: INPUT
+#: src/LYOptions.c:3974
+msgid "X Display"
+msgstr "Trình bày X"
+
+#.
+#. * Document Appearance
+#.
+#: src/LYOptions.c:3980
+msgid "Document Appearance"
+msgstr "Diện mạo Tài liệu"
+
+#: src/LYOptions.c:3986
+msgid "Show color"
+msgstr "Hiện màu"
+
+#: src/LYOptions.c:4012
+msgid "Color style"
+msgstr "Kiểu dáng màu"
+
+#: src/LYOptions.c:4022
+msgid "Default colors"
+msgstr "Màu mặc định"
+
+#. Show cursor: ON/OFF
+#: src/LYOptions.c:4030
+msgid "Show cursor"
+msgstr "Hiện con chạy"
+
+#. Underline links: ON/OFF
+#: src/LYOptions.c:4036
+msgid "Underline links"
+msgstr "Gạch chân liên kết"
+
+#. Show scrollbar: ON/OFF
+#: src/LYOptions.c:4043
+msgid "Show scrollbar"
+msgstr "Hiện thanh cuộn"
+
+#. Select Popups: ON/OFF
+#: src/LYOptions.c:4050
+msgid "Popups for select fields"
+msgstr "Tá»± mở trong trÆ°á»ng đã chá»n"
+
+#. HTML error recovery: SELECT
+#: src/LYOptions.c:4056
+msgid "HTML error recovery"
+msgstr "Phục hồi sau lỗi HTML"
+
+#. Bad HTML messages: SELECT
+#: src/LYOptions.c:4062
+msgid "Bad HTML messages"
+msgstr "Thông điệp HTML lỗi"
+
+#. Show Images: SELECT
+#: src/LYOptions.c:4068
+msgid "Show images"
+msgstr "Hiện ảnh"
+
+#. Verbose Images: ON/OFF
+#: src/LYOptions.c:4082
+msgid "Verbose images"
+msgstr "Ảnh chi tiết"
+
+#. Collapse BR Tags: ON/OFF
+#: src/LYOptions.c:4088
+msgid "Collapse BR tags"
+msgstr "Co các thẻ BR"
+
+#. Trim blank lines: ON/OFF
+#: src/LYOptions.c:4094
+msgid "Trim blank lines"
+msgstr "Cắt khoảng trắng các dòng"
+
+#.
+#. * Headers Transferred to Remote Servers
+#.
+#: src/LYOptions.c:4102
+msgid "Headers Transferred to Remote Servers"
+msgstr "Phần đầu đã truyá»n tải tá»›i máy phục vụ ở xa"
+
+#. ***************************************************************
+#. Mail Address: INPUT
+#: src/LYOptions.c:4106
+msgid "Personal mail address"
+msgstr "Äịa chỉ thÆ° Ä‘iện tá»­ cá nhân"
+
+#: src/LYOptions.c:4111
+msgid "Personal name for mail"
+msgstr "Tên cá nhân cho thư điện tử"
+
+#: src/LYOptions.c:4118
+msgid "Password for anonymous ftp"
+msgstr "Mật khẩu cho FTP nặc danh"
+
+#. Preferred content type: SELECT
+#: src/LYOptions.c:4124
+msgid "Preferred content type"
+msgstr "Kiểu nội dung ưa thích"
+
+#. Preferred media type: SELECT
+#: src/LYOptions.c:4130
+msgid "Preferred media type"
+msgstr "Kiểu vật chứa ưa thích"
+
+#. Preferred encoding: SELECT
+#: src/LYOptions.c:4136
+msgid "Preferred encoding"
+msgstr "Bảng mã ưa thích"
+
+#. Preferred Document Character Set: INPUT
+#: src/LYOptions.c:4142
+msgid "Preferred document character set"
+msgstr "Bộ ký tự tài liệu ưa thích"
+
+#. Preferred Document Language: INPUT
+#: src/LYOptions.c:4147
+msgid "Preferred document language"
+msgstr "Ngôn ngữ tài liệu ưa thích"
+
+#. HTTP protocol SELECT
+#: src/LYOptions.c:4152
+msgid "HTTP protocol"
+msgstr "Giao thức HTTP"
+
+#: src/LYOptions.c:4159
+msgid "Send User-Agent header"
+msgstr "Gửi phần đầu User-Agent"
+
+#: src/LYOptions.c:4161
+msgid "User-Agent header"
+msgstr "Dòng đầu User-Agent (Tác nhân NgÆ°á»i dùng)"
+
+#.
+#. * Listing and Accessing Files
+#.
+#: src/LYOptions.c:4169
+msgid "Listing and Accessing Files"
+msgstr "Liệt kê và Truy cập Tập tin"
+
+#. FTP sort: SELECT
+#: src/LYOptions.c:4174
+msgid "Use Passive FTP"
+msgstr "Dùng FTP bị động"
+
+#. FTP sort: SELECT
+#: src/LYOptions.c:4180
+msgid "FTP sort criteria"
+msgstr "Tiêu chuẩn sắp xếp FTP"
+
+#. Local Directory Sort: SELECT
+#: src/LYOptions.c:4188
+msgid "Local directory sort criteria"
+msgstr "Tiêu chuẩn sắp xếp thư mục cục bộ"
+
+#. Local Directory Order: SELECT
+#: src/LYOptions.c:4194
+msgid "Local directory sort order"
+msgstr "Thứ tự sắp xếp thư mục cục bộ"
+
+#: src/LYOptions.c:4203
+msgid "Show dot files"
+msgstr "Hiện tập tin chấm"
+
+#: src/LYOptions.c:4211
+msgid "Execution links"
+msgstr "Liên kết thực hiện"
+
+#: src/LYOptions.c:4229
+msgid "Pause when showing message"
+msgstr "Tạm dừng khi hiển thị thông điệp"
+
+#. Show transfer rate: SELECT
+#: src/LYOptions.c:4236
+msgid "Show transfer rate"
+msgstr "Hiện tá»· lệ truyá»n"
+
+#.
+#. * Special Files and Screens
+#.
+#: src/LYOptions.c:4256
+msgid "Special Files and Screens"
+msgstr "Tập tin Äặc biệt và Màn hình"
+
+#: src/LYOptions.c:4261
+msgid "Multi-bookmarks"
+msgstr "Äánh dấu Ä‘a phần"
+
+#: src/LYOptions.c:4269
+msgid "Review/edit Bookmarks files"
+msgstr "Xem lại/Sá»­a tập tin Äánh dấu"
+
+#: src/LYOptions.c:4272
+msgid "Goto multi-bookmark menu"
+msgstr "Äi tá»›i trình Ä‘Æ¡n Äánh dấu Ä‘a phần"
+
+#: src/LYOptions.c:4274
+msgid "Bookmarks file"
+msgstr "Tập tin Äánh dấu"
+
+#. Auto Session: ON/OFF
+#: src/LYOptions.c:4281
+msgid "Auto Session"
+msgstr "Buổi hợp tự động"
+
+#. Session File Menu: INPUT
+#: src/LYOptions.c:4287
+msgid "Session file"
+msgstr "Tập tin buổi hợp"
+
+#. Visited Pages: SELECT
+#: src/LYOptions.c:4293
+msgid "Visited Pages"
+msgstr "Trang đã thăm"
+
+#: src/LYOptions.c:4298
+msgid "View the file "
+msgstr "Xem tập tin "
+
+#: src/LYPrint.c:956
+#, c-format
+msgid " Print job complete.\n"
+msgstr " Công việc in hoàn tất.\n"
+
+#: src/LYPrint.c:1283
+msgid "Document:"
+msgstr "Tài liệu:"
+
+#: src/LYPrint.c:1284
+msgid "Number of lines:"
+msgstr "Số dòng:"
+
+#: src/LYPrint.c:1285
+msgid "Number of pages:"
+msgstr "Số trang:"
+
+#: src/LYPrint.c:1286
+msgid "pages"
+msgstr "trang"
+
+#: src/LYPrint.c:1286
+msgid "page"
+msgstr "trang"
+
+#: src/LYPrint.c:1287
+msgid "(approximately)"
+msgstr "(xấp xỉ)"
+
+#: src/LYPrint.c:1294
+msgid "Some print functions have been disabled!"
+msgstr "Một số chức năng in đã bị tắt!"
+
+#: src/LYPrint.c:1298
+msgid "Standard print options:"
+msgstr "Tùy chá»n in tiêu chuẩn:"
+
+#: src/LYPrint.c:1299
+msgid "Print options:"
+msgstr "Tùy chá»n in:"
+
+#: src/LYPrint.c:1306
+msgid "Save to a local file"
+msgstr "Lưu vào tập tin cục bộ"
+
+#: src/LYPrint.c:1308
+msgid "Save to disk disabled"
+msgstr "Chức năng lưu vào đĩa đã bị tắt"
+
+#: src/LYPrint.c:1315
+msgid "Mail the file"
+msgstr "Gửi thư đính kèm tập tin"
+
+#: src/LYPrint.c:1322
+msgid "Print to the screen"
+msgstr "In ra màn hình"
+
+#: src/LYPrint.c:1327
+msgid "Print out on a printer attached to your vt100 terminal"
+msgstr "In ra máy in gắn với thiết bị cuối vt100"
+
+#: src/LYReadCFG.c:437
+#, c-format
+msgid ""
+"Syntax Error parsing COLOR in configuration file:\n"
+"The line must be of the form:\n"
+"COLOR:INTEGER:FOREGROUND:BACKGROUND\n"
+"\n"
+"Here FOREGROUND and BACKGROUND must be one of:\n"
+"The special strings 'nocolor' or 'default', or\n"
+msgstr ""
+"Gặp lỗi cú pháp khi phân tách COLOR (màu) trong tập tin cấu hình:\n"
+"Dòng phải có dạng:\n"
+"COLOR:Sá»_NGUYÊN:CẢNH_GẦN:NỀN\n"
+"\n"
+"Ở đây thì CẢNH_GẦN và NỀN phải là một của những chuỗi đặc biệt:\n"
+" * nocolor\tkhông có màu\n"
+" * default\t\tmặc định\n"
+
+#: src/LYReadCFG.c:450
+msgid "Offending line:"
+msgstr "Dòng sai:"
+
+#: src/LYReadCFG.c:764
+#, c-format
+msgid "key remapping of %s to %s for %s failed\n"
+msgstr "gặp lỗi ánh xạ lại phím %s thành %s cho %s\n"
+
+#: src/LYReadCFG.c:771
+#, c-format
+msgid "key remapping of %s to %s failed\n"
+msgstr "gặp lỗi ánh xạ lại phím %s thành %s\n"
+
+#: src/LYReadCFG.c:792
+#, c-format
+msgid "invalid line-editor selection %s for key %s, selecting all\n"
+msgstr "sai lá»±a chá»n trình soạn thảo theo dòng %s cho phím %s nên chá»n tất cả\n"
+
+#: src/LYReadCFG.c:817 src/LYReadCFG.c:829
+#, c-format
+msgid "setting of line-editor binding for key %s (0x%x) to 0x%x for %s failed\n"
+msgstr ""
+"lỗi đặt sự đóng kết trình soạn thảo theo dòng cho phím %s (0x%x)\n"
+"thành 0x%x cho %s\n"
+
+#: src/LYReadCFG.c:833
+#, c-format
+msgid "setting of line-editor binding for key %s (0x%x) for %s failed\n"
+msgstr "lỗi đặt sự đóng kết trình soạn thảo theo dòng cho phím %s (0x%x) cho %s\n"
+
+#: src/LYReadCFG.c:929
+#, c-format
+msgid "Lynx: cannot start, CERN rules file %s is not available\n"
+msgstr "Lynx: không khởi chạy được, không có sẵn tập tin quy tắc CERN %s\n"
+
+#: src/LYReadCFG.c:930
+msgid "(no name)"
+msgstr "(không tên)"
+
+#: src/LYReadCFG.c:2076
+#, c-format
+msgid "More than %d nested lynx.cfg includes -- perhaps there is a loop?!?\n"
+msgstr "Có nhiá»u hÆ¡n %d phần bao gồm lynx.cfg lồng vào nhau — có thể là vòng lặp?!?\n"
+
+#: src/LYReadCFG.c:2078
+#, c-format
+msgid "Last attempted include was '%s',\n"
+msgstr "Lần thá»­ thêm bao gồm cuối cùng là “%sâ€,\n"
+
+#: src/LYReadCFG.c:2079
+#, c-format
+msgid "included from '%s'.\n"
+msgstr "bao gồm từ “%sâ€.\n"
+
+#: src/LYReadCFG.c:2490 src/LYReadCFG.c:2503 src/LYReadCFG.c:2561
+msgid "The following is read from your lynx.cfg file."
+msgstr "Những cái sau Ä‘á»c từ tập tin lynx.cfg."
+
+#: src/LYReadCFG.c:2491 src/LYReadCFG.c:2504
+msgid "Please read the distribution"
+msgstr "Hãy Ä‘á»c bản phân phối"
+
+#: src/LYReadCFG.c:2497 src/LYReadCFG.c:2507
+msgid "for more comments."
+msgstr "để tìm thêm bình luận."
+
+#: src/LYReadCFG.c:2543
+msgid "RELOAD THE CHANGES"
+msgstr "TẢI LẠI THAY Äá»”I"
+
+#: src/LYReadCFG.c:2551
+msgid "Your primary configuration"
+msgstr "Cấu hình chính"
+
+#: src/LYShowInfo.c:116
+msgid "URL:"
+msgstr "URL:"
+
+#: src/LYShowInfo.c:200
+msgid "Directory that you are currently viewing"
+msgstr "Thư mục đang xem"
+
+#: src/LYShowInfo.c:203
+msgid "Name:"
+msgstr "Tên:"
+
+#: src/LYShowInfo.c:220
+msgid "Directory that you have currently selected"
+msgstr "ThÆ° mục được chá»n hiện tại"
+
+#: src/LYShowInfo.c:222
+msgid "File that you have currently selected"
+msgstr "Tập tin được chá»n hiện tại"
+
+#: src/LYShowInfo.c:225
+msgid "Symbolic link that you have currently selected"
+msgstr "Liên kết má»m được chá»n hiện tại"
+
+#: src/LYShowInfo.c:228
+msgid "Item that you have currently selected"
+msgstr "Mục được chá»n hiện tại"
+
+#: src/LYShowInfo.c:230
+msgid "Full name:"
+msgstr "Tên đầy đủ:"
+
+#: src/LYShowInfo.c:243
+msgid "Unable to follow link"
+msgstr "Không thể theo liên kết"
+
+#: src/LYShowInfo.c:245
+msgid "Points to file:"
+msgstr "Chỉ tới tập tin:"
+
+#: src/LYShowInfo.c:250
+msgid "Name of owner:"
+msgstr "Tên của chủ:"
+
+#: src/LYShowInfo.c:253
+msgid "Group name:"
+msgstr "Tên nhóm:"
+
+#: src/LYShowInfo.c:255
+msgid "File size:"
+msgstr "Kích cỡ tập tin:"
+
+#: src/LYShowInfo.c:257
+msgid "(bytes)"
+msgstr "(byte)"
+
+#.
+#. * Include date and time information.
+#.
+#: src/LYShowInfo.c:262
+msgid "Creation date:"
+msgstr "Ngày tạo:"
+
+#: src/LYShowInfo.c:265
+msgid "Last modified:"
+msgstr "Sửa cuối:"
+
+#: src/LYShowInfo.c:268
+msgid "Last accessed:"
+msgstr "Truy cập cuối:"
+
+#: src/LYShowInfo.c:274
+msgid "Access Permissions"
+msgstr "Quyá»n truy cập"
+
+#: src/LYShowInfo.c:309
+msgid "Group:"
+msgstr "Nhóm:"
+
+# File access context — Ngữ cảnh truy cập đến tập tin
+#: src/LYShowInfo.c:329
+msgid "World:"
+msgstr "Má»i ngÆ°á»i:"
+
+#: src/LYShowInfo.c:336
+msgid "File that you are currently viewing"
+msgstr "Tập tin đang xem"
+
+#: src/LYShowInfo.c:344 src/LYShowInfo.c:444
+msgid "Linkname:"
+msgstr "Tên liên kết:"
+
+#: src/LYShowInfo.c:350 src/LYShowInfo.c:365
+msgid "Charset:"
+msgstr "Bộ ký tự:"
+
+#: src/LYShowInfo.c:364
+msgid "(assumed)"
+msgstr "(giả sử)"
+
+#: src/LYShowInfo.c:371
+msgid "Server:"
+msgstr "Máy phục vụ:"
+
+#: src/LYShowInfo.c:374
+msgid "Date:"
+msgstr "Ngày:"
+
+#: src/LYShowInfo.c:377
+msgid "Last Mod:"
+msgstr "Sửa cuối:"
+
+#: src/LYShowInfo.c:381
+msgid "Expires:"
+msgstr "Hết hạn:"
+
+#: src/LYShowInfo.c:384
+msgid "Cache-Control:"
+msgstr "Äiá»u khiển bá»™ nhá»› tạm:"
+
+#: src/LYShowInfo.c:387
+msgid "Content-Length:"
+msgstr "BỠdài nội dung:"
+
+#: src/LYShowInfo.c:391
+msgid "Length:"
+msgstr "BỠdài:"
+
+#: src/LYShowInfo.c:396
+msgid "Language:"
+msgstr "Ngôn ngữ:"
+
+#: src/LYShowInfo.c:402
+msgid "Post Data:"
+msgstr "Gửi dữ liệu:"
+
+#: src/LYShowInfo.c:405
+msgid "Post Content Type:"
+msgstr "Gửi kiểu nội dung:"
+
+#: src/LYShowInfo.c:408
+msgid "Owner(s):"
+msgstr "Chủ:"
+
+#: src/LYShowInfo.c:413
+msgid "size:"
+msgstr "kích cỡ:"
+
+#: src/LYShowInfo.c:415
+msgid "lines"
+msgstr "dòng"
+
+#: src/LYShowInfo.c:419
+msgid "forms mode"
+msgstr "chế độ biểu mẫu"
+
+#: src/LYShowInfo.c:421
+msgid "source"
+msgstr "nguồn"
+
+#: src/LYShowInfo.c:422
+msgid "normal"
+msgstr "chuẩn"
+
+#: src/LYShowInfo.c:424
+msgid ", safe"
+msgstr ", an toàn"
+
+#: src/LYShowInfo.c:426
+msgid ", via internal link"
+msgstr ", qua liên kết nội bộ"
+
+#: src/LYShowInfo.c:430
+msgid ", no-cache"
+msgstr ", không nhớ tạm"
+
+#: src/LYShowInfo.c:432
+msgid ", ISMAP script"
+msgstr ", văn lệnh ISMAP"
+
+#: src/LYShowInfo.c:434
+msgid ", bookmark file"
+msgstr ", tập tin lưu đánh dấu"
+
+#: src/LYShowInfo.c:437
+msgid "mode:"
+msgstr "chế độ:"
+
+#: src/LYShowInfo.c:443
+msgid "Link that you currently have selected"
+msgstr "Liên kết được chá»n hiện tại"
+
+#: src/LYShowInfo.c:452
+msgid "Method:"
+msgstr "Phương thức:"
+
+#: src/LYShowInfo.c:456
+msgid "Enctype:"
+msgstr "Kiểu bảng mã:"
+
+#: src/LYShowInfo.c:462
+msgid "Action:"
+msgstr "Hành vi:"
+
+#: src/LYShowInfo.c:468
+msgid "(Form field)"
+msgstr "(TrÆ°á»ng biểu mẫu)"
+
+#: src/LYShowInfo.c:478
+msgid "No Links on the current page"
+msgstr "Không có liên kết trên trang hiện tại"
+
+#: src/LYShowInfo.c:483
+msgid "Server Headers:"
+msgstr "Phần đầu máy phục vụ:"
+
+#: src/LYStyle.c:332
+#, c-format
+msgid ""
+"Syntax Error parsing style in lss file:\n"
+"[%s]\n"
+"The line must be of the form:\n"
+"OBJECT:MONO:COLOR (ie em:bold:brightblue:white)\n"
+"where OBJECT is one of EM,STRONG,B,I,U,BLINK etc.\n"
+"\n"
+msgstr ""
+"Gặp lỗi cú pháp khi phân tích kiểu dáng trong tập tin lss:\n"
+"[%s]\n"
+"Dòng phải có dạng:\n"
+"Äá»I_TƯỢNG:MONO:COLOR\n"
+" * MONO\t\tđen trắng\n"
+" * COLOR\tmàu sắc:\n"
+"\tem\t\tnhấn mạnh\n"
+"\tbold\t\tin đậm\n"
+"\tbrightblue\tmàu xanh sáng\n"
+"\twhite\t\tmàu trắng\n"
+"mà Äá»I_TƯỢNG là má»™t của:\n"
+" * EM\t\tnhấn mạnh\n"
+" * STRONG\tmạnh\n"
+" * B\t\tin đậm\n"
+" * I\t\tin nghiêng\n"
+" * U\t\tgạch dưới\n"
+" * BLINK\tnhấp nháy v.v.\n"
+"\n"
+
+#: src/LYStyle.c:939
+#, c-format
+msgid ""
+"\n"
+"Lynx file \"%s\" is not available.\n"
+"\n"
+msgstr ""
+"\n"
+"Tập tin Lynx “%s†không sẵn sàng.\n"
+"\n"
+
+#: src/LYTraversal.c:111
+msgid "here is a list of the history stack so that you may rebuild"
+msgstr "đây là danh sách đống lịch sử để xây dựng lại"
+
+#: src/LYUpload.c:77
+msgid "ERROR! - upload command is misconfigured"
+msgstr "LỖI! - câu lệnh tải lên có cấu hình sai"
+
+#: src/LYUpload.c:98
+msgid "Illegal redirection \"../\" found! Request ignored."
+msgstr "Sai chuyển hÆ°á»›ng “../â€. Yêu cầu bị bá» qua."
+
+#: src/LYUpload.c:101
+msgid "Illegal character \"/\" found! Request ignored."
+msgstr "Gặp ký tá»± cấm “/â€. Yêu cầu bị bá» qua."
+
+#: src/LYUpload.c:104
+msgid "Illegal redirection using \"~\" found! Request ignored."
+msgstr "Sai chuyển hÆ°á»›ng sá»­ dụng “~â€. Yêu cầu bị bá» qua."
+
+#: src/LYUpload.c:157
+msgid "Unable to upload file."
+msgstr "Không thể tải tập tin lên."
+
+#: src/LYUpload.c:196
+msgid "Upload To:"
+msgstr "Tải lên:"
+
+#: src/LYUpload.c:197
+msgid "Upload options:"
+msgstr "Tùy chá»n tải lên:"
+
+#: src/LYUtils.c:1911
+msgid "Download document URL put to clipboard."
+msgstr "Tải vỠđịa chỉ URL của tài liệu nằm trên bảng nháp."
+
+#: src/LYUtils.c:2658
+msgid "Unexpected access protocol for this URL scheme."
+msgstr "Giao thức truy cập không mong đợi cho lược đồ địa chỉ URL này."
+
+#: src/LYUtils.c:3571
+msgid "Too many tempfiles"
+msgstr "Quá nhiá»u tập tin tạm thá»i"
+
+#: src/LYUtils.c:3871
+msgid "unknown restriction"
+msgstr "không rõ sự hạn chế"
+
+#: src/LYUtils.c:3902
+#, c-format
+msgid "No restrictions set.\n"
+msgstr "Chưa đặt sự hạn chế.\n"
+
+#: src/LYUtils.c:3905
+#, c-format
+msgid "Restrictions set:\n"
+msgstr "Äã đặt sá»± hạn chế:\n"
+
+#: src/LYUtils.c:5202
+msgid "Cannot find HOME directory"
+msgstr "Không tìm thấy thư mục HOME"
+
+#: src/LYrcFile.c:16
+msgid "Normally disabled. See ENABLE_LYNXRC in lynx.cfg\n"
+msgstr "ThÆ°á»ng bị tắt. Xem ENABLE_LYNXRC trong lynx.cfg\n"
+
+#: src/LYrcFile.c:363
+msgid ""
+"accept_all_cookies allows the user to tell Lynx to automatically\n"
+"accept all cookies if desired. The default is \"FALSE\" which will\n"
+"prompt for each cookie. Set accept_all_cookies to \"TRUE\" to accept\n"
+"all cookies.\n"
+msgstr ""
+"“accept_all_cookies†cho phép ngÆ°á»i dùng cấu hình để Lynx tá»± Ä‘á»™ng\n"
+"chấp nhận má»i cookies muốn. Mặc định là “FALSE†tức là sẽ há»i\n"
+"cho má»—i cookie. Äặt accept_all_cookies thành “TRUE†để chấp nhận\n"
+"má»i cookie.\n"
+
+#: src/LYrcFile.c:371
+msgid ""
+"anonftp_password allows the user to tell Lynx to use the personal\n"
+"email address as the password for anonymous ftp. If no value is given,\n"
+"Lynx will use the personal email address. Set anonftp_password\n"
+"to a different value if you choose.\n"
+msgstr ""
+"“anonftp_password†cho phép ngÆ°á»i dùng cấu hình để Lynx dùng\n"
+"địa chỉ thư điện tử cá nhân làm mật khẩu cho kết nối FTP nặc danh.\n"
+"Không đưa ra giá trị thì Lynx sẽ dùng địa chỉ thư điện tử cá nhân.\n"
+"Hãy đặt “anonftp_password†thành một giá trị khác nếu thích hợp.\n"
+
+#: src/LYrcFile.c:380
+msgid ""
+"bookmark_file specifies the name and location of the default bookmark\n"
+"file into which the user can paste links for easy access at a later\n"
+"date.\n"
+msgstr ""
+"“bookmark_file†chỉ ra tên và vị trí của tập tin Äánh dấu mặc định\n"
+"cho ngÆ°á»i dùng ghi liên kết vào để có thể truy cập nhanh và dá»… dàng\n"
+"hơn sau này.\n"
+
+#: src/LYrcFile.c:385
+msgid ""
+"If case_sensitive_searching is \"on\" then when the user invokes a search\n"
+"using the 's' or '/' keys, the search performed will be case sensitive\n"
+"instead of case INsensitive. The default is usually \"off\".\n"
+msgstr ""
+"Nếu “case_sensitive_searching†là “on†(bật), thì má»—i khi ngÆ°á»i dùng\n"
+"tìm kiếm bằng các phím “s†hay “/â€, những tìm kiếm này sẽ phụ thuá»™c\n"
+"vào kiểu chữ thay cho bá» qua chữ hoa/thÆ°á»ng. Mặc định là “off†(tắt).\n"
+
+#: src/LYrcFile.c:390
+msgid ""
+"The character_set definition controls the representation of 8 bit\n"
+"characters for your terminal. If 8 bit characters do not show up\n"
+"correctly on your screen you may try changing to a different 8 bit\n"
+"set or using the 7 bit character approximations.\n"
+"Current valid characters sets are:\n"
+msgstr ""
+"“character_set†điá»u khiển việc hiển thị các ký tá»± 8 bit\n"
+"trên thiết bị cuối. Nếu ký tự 8 bit không hiển thị đúng\n"
+"trên màn hình, thì có thể thử thay đổi thành bộ 8 bit khác\n"
+"hoặc sử dụng bộ 7 bit. Hiện tại, có các bộ ký tự sau:\n"
+
+#: src/LYrcFile.c:398
+msgid ""
+"cookie_accept_domains and cookie_reject_domains are comma-delimited\n"
+"lists of domains from which Lynx should automatically accept or reject\n"
+"all cookies. If a domain is specified in both options, rejection will\n"
+"take precedence. The accept_all_cookies parameter will override any\n"
+"settings made here.\n"
+msgstr ""
+"“cookie_accept_domains†và “cookie_reject_domains†là danh sách\n"
+"các miá»n phân cách nhau bởi dấu phẩy Lynx sẽ tá»± Ä‘á»™ng chấp nhận\n"
+"hoặc bá» Ä‘i má»i cookie. Nếu chỉ ra má»™t miá»n trong cả hai tùy chá»n,\n"
+"thì sá»± bá» Ä‘i sẽ chiếm Æ°u thế. Tham số “accept_all_cookiesâ€\n"
+"sẽ ghi chèn má»i cài đặt này.\n"
+
+#: src/LYrcFile.c:406
+msgid ""
+"cookie_file specifies the file from which to read persistent cookies.\n"
+"The default is ~/"
+msgstr ""
+"“cookie_file†chỉ ra tập tin để Ä‘á»c các cookie cố định.\n"
+"Mặc định là ~/"
+
+#: src/LYrcFile.c:411
+msgid ""
+"cookie_loose_invalid_domains, cookie_strict_invalid_domains, and\n"
+"cookie_query_invalid_domains are comma-delimited lists of which domains\n"
+"should be subjected to varying degrees of validity checking. If a\n"
+"domain is set to strict checking, strict conformance to RFC2109 will\n"
+"be applied. A domain with loose checking will be allowed to set cookies\n"
+"with an invalid path or domain attribute. All domains will default to\n"
+"querying the user for an invalid path or domain.\n"
+msgstr ""
+"cookie_loose_invalid_domains\tkhông chặt chẽ vá» miá»n cookie sai\n"
+"cookie_strict_invalid_domains\tchặt chẽ vá» miá»n cookie sai\n"
+"cookie_query_invalid_domains\thá»i vá» miá»n cookie sai\n"
+"\n"
+"là danh sách phân cách nhau bởi dấu phẩy của những miá»n\n"
+"cần kiểm tra sá»± đúng đắn. Äặt miá»n thành:\n"
+" * kiểm tra chặt chẽ thì tùy theo chặt chẽ RFC2109.\n"
+" * kiểm tra không chặt chẽ thì cho phép đặt ngay cả cookie\n"
+"\tcó thuá»™c tính sai kiểu Ä‘Æ°á»ng dẫn hay miá»n.\n"
+"Giá trị mặc định là má»i miá»n Ä‘á»u sẽ nhắc ngÆ°á»i dùng\n"
+"vá» Ä‘Æ°á»ng dẫn hoặc miá»n là sai.\n"
+
+#: src/LYrcFile.c:425
+msgid ""
+"dir_list_order specifies the directory list order under DIRED_SUPPORT\n"
+"(if implemented). The default is \"ORDER_BY_NAME\"\n"
+msgstr ""
+"“dir_list_order†chỉ ra thứ tự danh sách thư mục dưới DIRED_SUPPORT\n"
+"(nếu có). Mặc định là “ORDER_BY_NAME†(sắp xếp theo tên)\n"
+
+#: src/LYrcFile.c:430
+msgid ""
+"dir_list_styles specifies the directory list style under DIRED_SUPPORT\n"
+"(if implemented). The default is \"MIXED_STYLE\", which sorts both\n"
+"files and directories together. \"FILES_FIRST\" lists files first and\n"
+"\"DIRECTORIES_FIRST\" lists directories first.\n"
+msgstr ""
+"“dir_list_styles†chỉ ra kiểu dáng danh sách thư mục dưới DIRED_SUPPORT\n"
+"(nếu hỗ trợ):\n"
+" * MIXED_STYLE\t(mặc định) sắp xếp cả hai tập tin và thư mục với nhau\n"
+" * FILES_FIRST\t\t\tliệt kê các tập tin trước\n"
+" * DIRECTORIES_FIRST\tliệt kê các thư mục trước\n"
+
+#: src/LYrcFile.c:438
+msgid ""
+"If emacs_keys is to \"on\" then the normal EMACS movement keys:\n"
+" ^N = down ^P = up\n"
+" ^B = left ^F = right\n"
+"will be enabled.\n"
+msgstr ""
+"Nếu “emacs_keys†là “on†(bật) thì có thể dùng những phím di chuyển\n"
+"nhÆ° trong EMACS:\n"
+" ^N = xuống ^P = lên\n"
+" ^B = trái ^F = phải\n"
+
+#: src/LYrcFile.c:444
+msgid ""
+"file_editor specifies the editor to be invoked when editing local files\n"
+"or sending mail. If no editor is specified, then file editing is disabled\n"
+"unless it is activated from the command line, and the built-in line editor\n"
+"will be used for sending mail.\n"
+msgstr ""
+"“file_editor†chỉ ra trình soạn thảo sẽ gá»i khi soạn thảo tập tin\n"
+"hoặc gá»­i thÆ°. Nếu không chỉ ra trình soạn thảo nào, thì sẽ tắt bá»\n"
+"việc soạn thảo trừ khi kích hoạt từ dòng lệnh, khi đó sử dụng\n"
+"trình soạn thảo theo dòng tích hợp để gửi thư.\n"
+
+#: src/LYrcFile.c:451
+msgid ""
+"The file_sorting_method specifies which value to sort on when viewing\n"
+"file lists such as FTP directories. The options are:\n"
+" BY_FILENAME -- sorts on the name of the file\n"
+" BY_TYPE -- sorts on the type of the file\n"
+" BY_SIZE -- sorts on the size of the file\n"
+" BY_DATE -- sorts on the date of the file\n"
+msgstr ""
+"“file_sorting_method†chỉ ra giá trị để sắp xếp khi xem danh sách\n"
+"nhÆ° các thÆ° mục FTP. Có các tùy chá»n:\n"
+" BY_FILENAME\tsắp xếp theo tên tập tin\n"
+" BY_TYPE\t\tsắp xếp theo kiểu của tập tin\n"
+" BY_SIZE\t\tsắp xếp theo kích cỡ của tập tin\n"
+" BY_DATE\t\tsắp xếp theo ngày của tập tin\n"
+
+#: src/LYrcFile.c:478
+msgid ""
+"lineedit_mode specifies the key binding used for inputting strings in\n"
+"prompts and forms. If lineedit_mode is set to \"Default Binding\" then\n"
+"the following control characters are used for moving and deleting:\n"
+"\n"
+" Prev Next Enter = Accept input\n"
+" Move char: <- -> ^G = Cancel input\n"
+" Move word: ^P ^N ^U = Erase line\n"
+" Delete char: ^H ^R ^A = Beginning of line\n"
+" Delete word: ^B ^F ^E = End of line\n"
+"\n"
+"Current lineedit modes are:\n"
+msgstr ""
+"“lineedit_mode†chỉ ra các tổ hợp phím dùng để nhập chuỗi vào\n"
+"trong dấu nhắc và biểu mẫu. Nếu “lineedit_mode†đặt thành\n"
+"“Default Binding†(tổ hợp mặc định) thì những ký tá»± Ä‘iá»u khiển sau\n"
+"dùng để di chuyển và xóa\n"
+"\n"
+" Hành vi \tLùi Kế Di chuyển ký tự \t<- \t->\n"
+" Di chuyển từ\t \t^P ^N\n"
+" Xóa ký tự \t\t^H ^R\n"
+" Xóa từ \t\t\t^B ^F\n"
+"\n"
+"Phím\t Hành vi Enter\tchấp nhận dữ liệu nhập vào\n"
+" ^G\t\thủy bỠnhập gì\n"
+" ^U\t\txóa dòng\n"
+" ^A\t\tđầu dòng\n"
+" ^E\t\tcuối dòng\n"
+"\n"
+"Các chế độ sửa dòng hiện tại:\n"
+
+#: src/LYrcFile.c:496
+msgid ""
+"The following allow you to define sub-bookmark files and descriptions.\n"
+"The format is multi_bookmark<capital_letter>=<filename>,<description>\n"
+"Up to 26 bookmark files (for the English capital letters) are allowed.\n"
+"We start with \"multi_bookmarkB\" since 'A' is the default (see above).\n"
+msgstr ""
+"Những cái sau cho phép xác định tập tin Äánh dấu con và các mô tả.\n"
+"Äịnh dạng là:\n"
+"multi_bookmark<chữ_hoa>=<tên_tập_tin>,<mô_tả>\n"
+"Cho phép đến 26 tập tin Äánh dấu (đại diện 26 chữ cái hoa tiếng Anh).\n"
+"Chúng ta bắt đầu với “multi_bookmarkB†vì “A†là mặc định\n"
+"(xem ở trên).\n"
+
+#: src/LYrcFile.c:502
+msgid ""
+"personal_mail_address specifies your personal mail address. The\n"
+"address will be sent during HTTP file transfers for authorization and\n"
+"logging purposes, and for mailed comments.\n"
+"If you do not want this information given out, set the NO_FROM_HEADER\n"
+"to TRUE in lynx.cfg, or use the -nofrom command line switch. You also\n"
+"could leave this field blank, but then you won't have it included in\n"
+"your mailed comments.\n"
+msgstr ""
+"“personal_mail_address†chỉ ra địa chỉ thư điện tử cá nhân\n"
+"của ngÆ°á»i dùng. Äịa chỉ này dùng để xác thá»±c trong khi truyá»n tải\n"
+"tập tin qua HTTP và dùng với mục mục đích ghi sự kiện, và cho\n"
+"các bình luận được gửi qua thư.\n"
+"Nếu không muốn Ä‘Æ°a ra thông tin này thì đặt “NO_FROM_HEADERâ€\n"
+"thành TRUE (đúng) trong lynx.cfg, hoặc dùng tùy chá»n dòng lệnh\n"
+"“-nofromâ€. CÅ©ng có thể để trống, nhÆ°ng khi đó thì sẽ không\n"
+"có địa chỉ này trong bình luận thư.\n"
+
+#: src/LYrcFile.c:511
+msgid ""
+"personal_mail_name specifies your personal name, for mail. The\n"
+"name is sent for mailed comments. Lynx will prompt for this,\n"
+"showing the configured value as a default when sending mail.\n"
+"This is not necessarily the same as a name provided as part of the\n"
+"personal_mail_address.\n"
+"Lynx does not save your changes to that default value as a side-effect\n"
+"of sending email. To update the default value, you must use the options\n"
+"menu, or modify this file directly.\n"
+msgstr ""
+"personal_mail_name chỉ ra tên cá nhân của bạn, cho thư.\n"
+"Tên được gá»­i cho việc chuyển ghi chú. Lynx sẽ há»i cái này,\n"
+"hiển thị các giá trị đã cấu hình như là giá trị mặc định khi gửi thư.\n"
+"Äiá»u này là không cần thiết bởi đây là tên được cung cấp nhÆ° là má»™t bá»™ phận của\n"
+"personal_mail_address.\n"
+"Lynx không lưu các thay đổi của bạn thành giá trị mặc định bởi hiệu ứng lỠside-effect\n"
+"của việc gá»­i thÆ°. Äể cập nhật giá trị mặc định, bạn phải sá»­ dụng các tùy chá»n\n"
+"menu (trình đơn), hoặc là sửa tập tin một cách trực tiếp.\n"
+
+#: src/LYrcFile.c:521
+msgid ""
+"preferred_charset specifies the character set in MIME notation (e.g.,\n"
+"ISO-8859-2, ISO-8859-5) which Lynx will indicate you prefer in requests\n"
+"to http servers using an Accept-Charset header. The value should NOT\n"
+"include ISO-8859-1 or US-ASCII, since those values are always assumed\n"
+"by default. May be a comma-separated list.\n"
+"If a file in that character set is available, the server will send it.\n"
+"If no Accept-Charset header is present, the default is that any\n"
+"character set is acceptable. If an Accept-Charset header is present,\n"
+"and if the server cannot send a response which is acceptable\n"
+"according to the Accept-Charset header, then the server SHOULD send\n"
+"an error response, though the sending of an unacceptable response\n"
+"is also allowed.\n"
+msgstr ""
+"“preferred_charset†chỉ ra bộ ký tự ở dạng MIME (ví dụ,\n"
+"ISO-8859-2, UTF-8) Lynx sẽ chỉ ra trong yêu cầu gửi tới máy\n"
+"phục vụ HTTP bằng dòng đầu “Accept-Charset†(chấp nhận bộ ký tự).\n"
+"Giá trị KHÔNG được là ISO-8859-1 hay US-ASCII, vì những giá trị này\n"
+"luôn luôn là mặc định. Cũng có thể dùng một danh sách phân cách nhau\n"
+"bởi dấu phẩy. Nếu có một tập tin với bộ ký tự đó thì máy phục vụ sẽ gửi nó.\n"
+"Nếu không có dòng đầu “Accept-Charsetâ€, thì mặc định là chấp nhận\n"
+"má»i bá»™ ký tá»±. Nếu có dòng đầu “Accept-Charset†và máy phục vụ\n"
+"không gá»­i được câu trả lá»i tÆ°Æ¡ng ứng vá»›i dòng đầu, thì máy phục vụ\n"
+"PHẢI gá»­i má»™t câu trả lá»i vá» lá»—i, mặc dù có cho phép gá»­i má»™t câu trả lá»i\n"
+"không tương ứng.\n"
+
+#: src/LYrcFile.c:539
+msgid ""
+"preferred_language specifies the language in MIME notation (e.g., en,\n"
+"fr, may be a comma-separated list in decreasing preference)\n"
+"which Lynx will indicate you prefer in requests to http servers.\n"
+"If a file in that language is available, the server will send it.\n"
+"Otherwise, the server will send the file in its default language.\n"
+msgstr ""
+"“preferred_language†chỉ ra ngôn ngữ ở dạng MIME (ví dụ,\n"
+"vi, ru, ja, en, có thể là danh sách các ngôn ngữ phân cách nhau\n"
+"bởi dấu phẩy, theo thứ tự ưu tiên giảm dần) Lynx sẽ chỉ ra trong\n"
+"yêu cầu tới máy phục vụ HTTP. Nếu có tập tin với ngôn ngữ đó,\n"
+"thì máy phục vụ sẽ gửi nó. Nếu không máy phục vụ sẽ gửi tập tin\n"
+"với ngôn ngữ mặc định.\n"
+
+#: src/LYrcFile.c:550
+msgid ""
+"If run_all_execution_links is set \"on\" then all local execution links\n"
+"will be executed when they are selected.\n"
+"\n"
+"WARNING - This is potentially VERY dangerous. Since you may view\n"
+" information that is written by unknown and untrusted sources\n"
+" there exists the possibility that Trojan horse links could be\n"
+" written. Trojan horse links could be written to erase files\n"
+" or compromise security. This should only be set to \"on\" if\n"
+" you are viewing trusted source information.\n"
+msgstr ""
+"Nếu “run_all_execution_links†đặt thành “on†(bật) thì\n"
+"má»i liên kết thá»±c hiện ná»™i bá»™ sẽ thá»±c hiện khi chúng được chá»n.\n"
+"\n"
+"CẢNH BÃO - Có thể RẤT nguy hiểm. Vì có thể sẽ xem thông tin\n"
+"\ttừ những nguồn không rõ hoặc không tin tưởng có chứa\n"
+"\tnhững liên kết ngựa Troa. Liên kết ngựa Troa có thể thực hiện\n"
+"\tviệc xóa tập tin hay ảnh hưởng việc bảo mật. Chỉ nên đặt thành\n"
+" “on†(bật) nếu đang xem nguồn thông tin tin tưởng.\n"
+
+#: src/LYrcFile.c:561
+msgid ""
+"If run_execution_links_on_local_files is set \"on\" then all local\n"
+"execution links that are found in LOCAL files will be executed when they\n"
+"are selected. This is different from run_all_execution_links in that\n"
+"only files that reside on the local system will have execution link\n"
+"permissions.\n"
+"\n"
+"WARNING - This is potentially dangerous. Since you may view\n"
+" information that is written by unknown and untrusted sources\n"
+" there exists the possibility that Trojan horse links could be\n"
+" written. Trojan horse links could be written to erase files\n"
+" or compromise security. This should only be set to \"on\" if\n"
+" you are viewing trusted source information.\n"
+msgstr ""
+"Nếu “run_execution_links_on_locale_files†đặt thành “on†(bật)\n"
+"thì má»i liên thá»±c hiện ná»™i bá»™ tìm thấy trong các tập tin CỤC BỘ\n"
+"sẽ thá»±c hiện khi chúng được chá»n. Khác vá»›i “run_all_execution_linksâ€\n"
+"vì chỉ những tập tin nằm trên hệ thống cục bá»™ má»›i có quyá»n\n"
+"thực hiện liên kết.\n"
+"\n"
+"CẢNH BÃO - Có thể RẤT nguy hiểm. Vì có thể sẽ xem thông tin\n"
+"\ttừ những nguồn không rõ hoặc không tin tưởng có chứa\n"
+"\tnhững liên kết ngựa Troa. Liên kết ngựa Troa có thể thực hiện\n"
+"\tviệc xóa tập tin hay ảnh hưởng việc bảo mật. Chỉ nên đặt thành\n"
+" “on†(bật) nếu đang xem nguồn thông tin tin tưởng.\n"
+
+#: src/LYrcFile.c:579
+msgid ""
+"select_popups specifies whether the OPTIONs in a SELECT block which\n"
+"lacks a MULTIPLE attribute are presented as a vertical list of radio\n"
+"buttons or via a popup menu. Note that if the MULTIPLE attribute is\n"
+"present in the SELECT start tag, Lynx always will create a vertical list\n"
+"of checkboxes for the OPTIONs. A value of \"on\" will set popup menus\n"
+"as the default while a value of \"off\" will set use of radio boxes.\n"
+"The default can be overridden via the -popup command line toggle.\n"
+msgstr ""
+"“select_popups†cho biết các OPTION (tùy chá»n) trong má»™t khối\n"
+"SELECT (lá»±a chá»n) không có thuá»™c tính MULTIPLE (Ä‘a) được hiển thị\n"
+"nhÆ° má»™t danh sách thẳng đứng của các nút chá»n má»™t hay qua\n"
+"một trình đơn tự mở. Chú ý nếu có thuộc tính MULTIPLE trong\n"
+"thẻ bắt đầu của SELECT, Lynx sẽ luôn luôn tạo danh sách thẳng đứng\n"
+"các hộp kiểm tra cho OPTION. Giá trị “on†(bật) sẽ đặt trình đơn tự mở\n"
+"làm mặc định còn “off†(tắt) sẽ sá»­ dụng các há»™p chá»n má»™t.\n"
+"Có thể ghi chèn mặc định bằng tùy chá»n dòng lệnh “-popupâ€.\n"
+
+#: src/LYrcFile.c:590
+msgid ""
+"show_color specifies how to set the color mode at startup. A value of\n"
+"\"never\" will force color mode off (treat the terminal as monochrome)\n"
+"at startup even if the terminal appears to be color capable. A value of\n"
+"\"always\" will force color mode on even if the terminal appears to be\n"
+"monochrome, if this is supported by the library used to build lynx.\n"
+"A value of \"default\" will yield the behavior of assuming\n"
+"a monochrome terminal unless color capability is inferred at startup\n"
+"based on the terminal type, or the -color command line switch is used, or\n"
+"the COLORTERM environment variable is set. The default behavior always is\n"
+"used in anonymous accounts or if the \"option_save\" restriction is set.\n"
+"The effect of the saved value can be overridden via\n"
+"the -color and -nocolor command line switches.\n"
+"The mode set at startup can be changed via the \"show color\" option in\n"
+"the 'o'ptions menu. If the option settings are saved, the \"on\" and\n"
+"\"off\" \"show color\" settings will be treated as \"default\".\n"
+msgstr ""
+"“show_color†chỉ ra cách đặt chế độ màu vào lúc khởi chạy.\n"
+"Giá trị “never†(không bao giá») sẽ bắt buá»™c tắt dùng màu\n"
+"(coi như thiết bị cuối đen trằng) vào lúc khởi chạy thậm chỉ cả\n"
+"khi thiết bị cuối có khả năng dùng màu. Giá trị “always†(luôn luôn)\n"
+"sẽ bắt buộc chế độ màu thậm chi thiết bị cuối là đen trắng,\n"
+"nếu được há»— trợ bởi thÆ° viện dùng để biên dịch lynx. Giá trị “defaultâ€\n"
+"(mặc định) sẽ coi như thiết bị cuối là đen trắng trừ khi suy ra\n"
+"khả năng có màu khi khởi động dựa trên dạng thiết bị cuối,\n"
+"hoặc có tùy chá»n dòng lệnh “-color†(màu), hoặc đặt biến môi trÆ°á»ng\n"
+"COLORTERM. Mặc định luôn luôn được dùng cho tài khoản giấu tên\n"
+"hoặc nếu đặt giá»›i hạn “option_saveâ€. Ảnh hưởng của giá trị đã ghi\n"
+"có thể ghi chèn qua các tùy chá»n dòng lệnh “-color†(màu)\n"
+"và “-nocolor†(không màu). Có thể thay đổi chế độ lúc khởi động\n"
+"qua tùy chá»n “show color†(hiện màu) trong trình Ä‘Æ¡n Tùy chá»n [O].\n"
+"Nếu đã ghi cài đặt tùy chá»n, thì cài đặt “on†(bật), “off†(tắt),\n"
+"“show color†(hiện màu) sẽ được coi như “default†(mặc định).\n"
+
+#: src/LYrcFile.c:607
+msgid ""
+"show_cursor specifies whether to 'hide' the cursor to the right (and\n"
+"bottom, if possible) of the screen, or to place it to the left of the\n"
+"current link in documents, or current option in select popup windows.\n"
+"Positioning the cursor to the left of the current link or option is\n"
+"helpful for speech or braille interfaces, and when the terminal is\n"
+"one which does not distinguish the current link based on highlighting\n"
+"or color. A value of \"on\" will set positioning to the left as the\n"
+"default while a value of \"off\" will set 'hiding' of the cursor.\n"
+"The default can be overridden via the -show_cursor command line toggle.\n"
+msgstr ""
+"“show_cursor†xác định “ẩn†con trỠvào bên phải (và đáy,\n"
+"nếu có thể) của màn hình, hay đặt nó vào bên trái của liên kết hiện tại\n"
+"trong tài liệu, hoặc tùy chá»n hiện tại trong cá»­a sổ tá»± mở để lá»±a chá»n.\n"
+"Việc đặt con trá» vào bên trái liên kết hiện tại hay tùy chá»n có ích\n"
+"cho các giao diện nói tiếng và chữ nổi Bray cho những ngÆ°á»i có khuyết tật,\n"
+"và khi thiết bị cuối không nhận ra liên kết hiện tại dựa trên tô sáng\n"
+"hay màu sắc. Giá trị “on†(bật) sẽ đặt vị trí tới bên trái làm mặc định\n"
+"còn giá trị “off†(tắt) sẽ đặt “ẩn†con trá». Có thể ghi chèn mặc định này\n"
+"bằng tùy chá»n dòng lệnh “-show_cursor†(hiện con trá»).\n"
+
+#: src/LYrcFile.c:618
+msgid ""
+"show_dotfiles specifies that the directory listing should include\n"
+"\"hidden\" (dot) files/directories. If set \"on\", this will be\n"
+"honored only if enabled via userdefs.h and/or lynx.cfg, and not\n"
+"restricted via a command line switch. If display of hidden files\n"
+"is disabled, creation of such files via Lynx also is disabled.\n"
+msgstr ""
+"“show_dotfiles†cho biết danh sách thư mục có gồm\n"
+"các tập tin/thư mục “ẩn†(tên bắt đầu với dấu chấm) không.\n"
+"Nếu đặt “onâ€, thì sẽ hiển thị những tập tin đó chỉ nếu cho phép\n"
+"qua userdefs.h và/hoặc lynx.cfg, và không hạn chế qua tùy chá»n\n"
+"dòng lệnh. Nếu tắt bỠviệc hiển thị các tập tin ẩn, thì việc tạo\n"
+"những tập tin như vậy bằng Lynx cũng bị tắt.\n"
+
+#: src/LYrcFile.c:629
+msgid ""
+"If sub_bookmarks is not turned \"off\", and multiple bookmarks have\n"
+"been defined (see below), then all bookmark operations will first\n"
+"prompt the user to select an active sub-bookmark file. If the default\n"
+"Lynx bookmark_file is defined (see above), it will be used as the\n"
+"default selection. When this option is set to \"advanced\", and the\n"
+"user mode is advanced, the 'v'iew bookmark command will invoke a\n"
+"statusline prompt instead of the menu seen in novice and intermediate\n"
+"user modes. When this option is set to \"standard\", the menu will be\n"
+"presented regardless of user mode.\n"
+msgstr ""
+"Nếu “sub_bookmarks†không đặt thành “off†(tắt), và có xác định\n"
+"dùng nhiá»u Äánh dấu (xem dÆ°á»›i), thì má»i thao tác vá»›i Äánh dấu\n"
+"sẽ bắt đầu bằng việc nhắc ngÆ°á»i dùng chá»n tập tin Äánh dấu con để dùng.\n"
+"Nếu xác định tập tin “bookmark_file†mặc định của Lynx (xem trên),\n"
+"nó sẽ được dùng làm lá»±a chá»n mặc định. Khi tùy chá»n này đặt thành\n"
+"“advanced†(cấp cao), và chế Ä‘á»™ ngÆ°á»i dùng cÅ©ng là cấp cao, thì\n"
+"câu lệnh Xêm Äánh dấu [V] sẽ gá»i má»™t dấu nhắc dòng trạng thái\n"
+"thay cho trình Ä‘Æ¡n trong chế Ä‘á»™ ngÆ°á»i má»›i và trung gian.\n"
+"Khi tùy chá»n này đặt thành “standard†(tiêu chuẩn) thì trình Ä‘Æ¡n\n"
+"sẽ hiển thị không phụ thuá»™c vào chế Ä‘á»™ ngÆ°á»i dùng.\n"
+
+#: src/LYrcFile.c:644
+msgid ""
+"user_mode specifies the users level of knowledge with Lynx. The\n"
+"default is \"NOVICE\" which displays two extra lines of help at the\n"
+"bottom of the screen to aid the user in learning the basic Lynx\n"
+"commands. Set user_mode to \"INTERMEDIATE\" to turn off the extra info.\n"
+"Use \"ADVANCED\" to see the URL of the currently selected link at the\n"
+"bottom of the screen.\n"
+msgstr ""
+"“user_mode†chỉ ra mức Ä‘á»™ thành thạo của ngÆ°á»i dùng Lynx.\n"
+"Mặc định là “NOVICE†(ngÆ°á»i má»›i), khi đó sẽ hiển thị hai dòng\n"
+"trợ giúp mở rá»™ng tại đáy màn hình để giúp ngÆ°á»i dùng há»c\n"
+"các câu lệnh cÆ¡ bản của Lynx. Äặt “user_mode†thành\n"
+"“INTERMEDIATE†(trung gian) để bỠnhững thông tin bổ sung này.\n"
+"Dùng “ADVANCED†(cấp cao) để xem địa chỉ URL của liên kết\n"
+"đã chá»n tại đáy màn hình.\n"
+
+#: src/LYrcFile.c:653
+msgid ""
+"If verbose_images is \"on\", lynx will print the name of the image\n"
+"source file in place of [INLINE], [LINK] or [IMAGE]\n"
+"See also VERBOSE_IMAGES in lynx.cfg\n"
+msgstr ""
+"Nếu “verbose_images†là “on†(bật), lynx sẽ in ra tên\n"
+"của tập tin hình ảnh ở vị trí của [INLINE], [LINK] hoặc [IMAGE]\n"
+"Hãy xem thêm “VERBOSE_IMAGES†trong lynx.cfg\n"
+
+#: src/LYrcFile.c:658
+msgid ""
+"If vi_keys is set to \"on\", then the normal VI movement keys:\n"
+" j = down k = up\n"
+" h = left l = right\n"
+"will be enabled. These keys are only lower case.\n"
+"Capital 'H', 'J' and 'K will still activate help, jump shortcuts,\n"
+"and the keymap display, respectively.\n"
+msgstr ""
+"Nếu “vi_keys†đặt thành “on†(bật), thì có thể dụng\n"
+"các phím di chuyển như trong trình soạn thảo VI:\n"
+" j\txuống\n"
+" k\tlên\n"
+" h\tsang trái\n"
+" l\tsang phải\n"
+"Những phím này cần viết thÆ°á»ng.\n"
+" H\ttrợ giúp\n"
+" J\tlốt tắt nhảy\n"
+" K\tsÆ¡ đồ phímnhÆ° bình thÆ°á»ng.\n"
+
+#: src/LYrcFile.c:666
+msgid ""
+"The visited_links setting controls how Lynx organizes the information\n"
+"in the Visited Links Page.\n"
+msgstr ""
+"Cài đặt “visited_links†điá»u khiển cách Lynx tổ chức thông tin\n"
+"trên Trang Liên kết đã Thăm.\n"
+
+#: src/LYrcFile.c:910
+msgid ""
+"If keypad_mode is set to \"NUMBERS_AS_ARROWS\", then the numbers on\n"
+"your keypad when the numlock is on will act as arrow keys:\n"
+" 8 = Up Arrow\n"
+" 4 = Left Arrow 6 = Right Arrow\n"
+" 2 = Down Arrow\n"
+"and the corresponding keyboard numbers will act as arrow keys,\n"
+"regardless of whether numlock is on.\n"
+msgstr ""
+"Nếu “keypad_mode†là “NUMBERS_AS_ARROWS†(các số dạng mũi tên),\n"
+"thì các phím số trên vùng phím số khi đèn numlock (khóa số) bật\n"
+"sẽ làm việc như các mũi tên:\n"
+" 8 = Mũi tên lên\n"
+" 4 = Mũi tên trái 6 = Mũi tên phải\n"
+" 2 = Mũi tên xuống\n"
+"và các phím số tÆ°Æ¡ng ứng của bàn phím thông thÆ°á»ng cÅ©ng làm việc,\n"
+"như các phím mũi tên dù đèn numlock có bật hay không.\n"
+
+#: src/LYrcFile.c:919
+msgid ""
+"If keypad_mode is set to \"LINKS_ARE_NUMBERED\", then numbers will\n"
+"appear next to each link and numbers are used to select links.\n"
+msgstr ""
+"Nếu “keypad_mode†đặt thành “LINKS_ARE_NUMBEREDâ€, thì các số\n"
+"sẽ xuất hiện bên cạnh má»—i liên kết và có thể dùng để chá»n liên kết.\n"
+
+#: src/LYrcFile.c:923
+msgid ""
+"If keypad_mode is set to \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\", then\n"
+"numbers will appear next to each link and visible form input field.\n"
+"Numbers are used to select links, or to move the \"current link\" to a\n"
+"form input field or button. In addition, options in popup menus are\n"
+"indexed so that the user may type an option number to select an option in\n"
+"a popup menu, even if the option isn't visible on the screen. Reference\n"
+"lists and output from the list command also enumerate form inputs.\n"
+msgstr ""
+"Nếu “keypad_mode†đặt thành “LINKS_AND_FORM_FIELDS_ARE_NUMBEREDâ€,\n"
+"thì số sẽ nằm bên cạnh má»—i liên kết và trÆ°á»ng nhập vào biểu mẫu mà hiện rõ.\n"
+"Số dùng để chá»n liên kết, hoặc di chuyển “liên kết hiện tại†tá»›i má»™t\n"
+"trÆ°á»ng nhập vào hay nút. Thêm vào đó tùy chá»n trong trình Ä‘Æ¡n tá»± mở\n"
+"cÅ©ng được đặt chỉ mục và ngÆ°á»i dùng có thể gõ số của tùy chá»n để chá»n\n"
+"tùy chá»n đó trong trình Ä‘Æ¡n tá»± mở, thậm chí nếu không thấy tùy chá»n\n"
+"trên màn hình. Danh sách tham chiếu và kết xuất từ câu lệnh liệt kê\n"
+"đồng thá»i đánh số biểu mẫu nhập vào.\n"
+
+#: src/LYrcFile.c:932
+msgid ""
+"NOTE: Some fixed format documents may look disfigured when\n"
+"\"LINKS_ARE_NUMBERED\" or \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\" are\n"
+"enabled.\n"
+msgstr ""
+"CHÚ Ã: má»™t vài tài liệu có định dạng cố định có vẻ há»— loạn khi\n"
+"“LINKS_ARE_NUMBERED†hoặc “LINKS_AND_FORM_FIELDS_ARE_NUMBEREDâ€\n"
+"là bật.\n"
+
+#: src/LYrcFile.c:964
+msgid ""
+"Lynx User Defaults File\n"
+"\n"
+msgstr ""
+"Tập tin Giá trị Mặc định NgÆ°á»i dùng Lynx\n"
+"\n"
+
+#: src/LYrcFile.c:973
+msgid ""
+"This file contains options saved from the Lynx Options Screen (normally\n"
+"with the 'o' key). To save options with that screen, you must select the\n"
+"checkbox:\n"
+msgstr ""
+"Tập tin này chứa những tùy chá»n được lÆ°u từ Màn hình Tùy chá»n Lynx\n"
+"(bình thÆ°á»ng dùng phím “oâ€). Äể lÆ°u tùy chá»n trên màn hình đó,\n"
+"bạn cần phải để dấu vào há»™p chá»n:\n"
+
+#: src/LYrcFile.c:980
+msgid ""
+"You must then save the settings using the link on the line above the\n"
+"checkbox:\n"
+msgstr ""
+"Sau đó bạn cần phải lưu cài đặt dùng liên kết\n"
+"trên dòng nằm bên trên há»™p chá»n:\n"
+
+#: src/LYrcFile.c:987
+msgid ""
+"You may also use the command-line option \"-forms_options\", which displays\n"
+"the simpler Options Menu instead. Save options with that using the '>' key.\n"
+"\n"
+msgstr ""
+"Bạn cÅ©ng có thể sá»­ dụng tùy chá»n dòng lệnh “-forms_optionsâ€\n"
+"mà hiển thị Trình Ä‘Æ¡n Tùy chá»n Ä‘Æ¡n giản thay vào đó.\n"
+"Dùng nó thì lÆ°u tùy chá»n bằng phím “>â€.\n"
+"\n"
+
+#: src/LYrcFile.c:994
+msgid ""
+"This file contains options saved from the Lynx Options Screen (normally\n"
+"with the '>' key).\n"
+"\n"
+msgstr ""
+"Tập tin này chứa những tùy chá»n được lÆ°u từ Màn hình Tùy chá»n Lynx\n"
+"(bình thÆ°á»ng dùng phím “>â€).\n"
+"\n"
+
+#: src/LYrcFile.c:1001
+msgid ""
+"There is normally no need to edit this file manually, since the defaults\n"
+"here can be controlled from the Options Screen, and the next time options\n"
+"are saved from the Options Screen this file will be completely rewritten.\n"
+"You have been warned...\n"
+"\n"
+"If you are looking for the general configuration file - it is normally\n"
+"called \"lynx.cfg\". It has different content and a different format.\n"
+"It is not this file.\n"
+msgstr ""
+"Bình thÆ°á»ng không cần chỉnh sá»­a tập tin này bằng tay,\n"
+"vì những giá trị mặc định ở đây có thể được Ä‘iá»u khiển\n"
+"từ Màn hình Tùy chá»n, và lần kế tiếp tùy chá»n được lÆ°u\n"
+"từ Màn hình Tùy chá»n tập tin này sẽ được ghi lại hoàn toàn.\n"
+"NgÆ°á»i dùng đã được cảnh báo trÆ°á»›c.\n"
+"\n"
+"Tập tin cấu hình chung bình thÆ°á»ng có tên “lynx.cfgâ€,\n"
+"chứa nội dung khác và theo định dạng khác.\n"
+"Nó không phải là tập tin này.\n"
+
+#~ msgid "HREF in BASE tag is not an absolute URL."
+#~ msgstr "HREF trong thẻ BASE không phải là một địa chỉ URL tuyệt đối."
+
+#~ msgid "Address contains a username: %s"
+#~ msgstr "Äịa chỉ chứa má»™t tên ngÆ°á»i dùng: %s"
+
+#~ msgid "Visible links"
+#~ msgstr "Liên kết hiển thị"
+
+#~ msgid ""
+#~ "\n"
+#~ "Lynx edit map not declared.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Chưa khai báo sơ đồ soạn thảo Lynx.\n"
+#~ "\n"
+
+#~ msgid "Very long lines have been wrapped!"
+#~ msgstr "Các dòng rất dài đã bị ngắt."
+
+#~ msgid "Path too long"
+#~ msgstr "ÄÆ°á»ng dẫn quá dài"
+
+#~ msgid "Source and destination are the same location - request ignored!"
+#~ msgstr "Nguồn và đích là cùng một vị trí — yêu cầu bị bỠqua."
diff --git a/po/zh_CN.po b/po/zh_CN.po
new file mode 100644
index 0000000..6c50467
--- /dev/null
+++ b/po/zh_CN.po
@@ -0,0 +1,5246 @@
+# Lynx 2.8.5pre9 Simplified Chinese translation
+# Copyright (C) 2002, 2003 Free Software Foundation, Inc.
+# Wu XiaoGuang <xgwu@linux.net.cn>, 2002
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: lynx-2.8.5pre9\n"
+"POT-Creation-Date: 2002-10-09 15:10+0200\n"
+"PO-Revision-Date: 2002-10-15 15:13+0800\n"
+"Last-Translator: Wang Jian <lark@linux.net.cn>\n"
+"Language-Team: Chinese (simplified) <i18n-zh@googlegroups.com>\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Report-Msgid-Bugs-To: bug-gnu-lynx@gnu.org\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#. ******************************************************************
+#. * The following definitions are for status line prompts, messages, or
+#. * warnings issued by Lynx during program execution. You can modify
+#. * them to make them more appropriate for your site. We recommend that
+#. * you extend these definitions to other languages using the gettext
+#. * library. There are also scattered uses of 'gettext()' throughout the
+#. * Lynx source, covering all but those messages which (a) are used for
+#. * debugging (CTRACE) or (b) are constants used in interaction with
+#. * other programs.
+#. *
+#. * Links to collections of alternate definitions, developed by the Lynx
+#. * User Community, are maintained in Lynx links:
+#. *
+#. * http://www.trill-home.com/lynx.html
+#. *
+#. * See ABOUT-NLS and po/readme for details and location of contributed
+#. * translations. When no translation is available, the English default is
+#. * used.
+#.
+#: LYMessages.c:29
+#, c-format
+msgid "Alert!: %s"
+msgstr "警告ï¼ï¼š%s"
+
+#: LYMessages.c:30
+msgid "Welcome"
+msgstr "欢迎"
+
+#: LYMessages.c:31
+msgid "Are you sure you want to quit?"
+msgstr "您确信è¦é€€å‡ºå—?"
+
+#: LYMessages.c:33
+msgid "Really exit from Lynx?"
+msgstr "真的è¦ç¦»å¼€ Lynx ?"
+
+#: LYMessages.c:35
+msgid "Connection interrupted."
+msgstr "连接被中断。"
+
+#: LYMessages.c:36
+msgid "Data transfer interrupted."
+msgstr "æ•°æ®ä¼ è¾“被中断。"
+
+#: LYMessages.c:37
+msgid "Cancelled!!!"
+msgstr "å·²å–消ï¼"
+
+#: LYMessages.c:38
+msgid "Cancelling!"
+msgstr "正在å–消ï¼"
+
+#: LYMessages.c:39
+msgid "Excellent!!!"
+msgstr "éžå¸¸å¥½ï¼"
+
+#: LYMessages.c:40
+msgid "OK"
+msgstr ""
+
+#: LYMessages.c:41
+msgid "Done!"
+msgstr "完æˆï¼"
+
+#: LYMessages.c:42
+msgid "Bad request!"
+msgstr "请求错误ï¼"
+
+#: LYMessages.c:43
+msgid "previous"
+msgstr "å‰ä¸€ä¸ª"
+
+#: LYMessages.c:44
+msgid "next screen"
+msgstr "下一å±"
+
+#: LYMessages.c:45
+msgid "HELP!"
+msgstr "求助ï¼"
+
+#: LYMessages.c:46
+msgid ", help on "
+msgstr ",在这方é¢çš„帮助"
+
+#. #define HELP
+#: LYMessages.c:48
+msgid "Commands: Use arrow keys to move, '?' for help, 'q' to quit, '<-' to go back."
+msgstr "命令:移动用方å‘键,求助用‘?’,退出用‘q’,返回用‘<-’。"
+
+#. #define MOREHELP
+#: LYMessages.c:50
+msgid "-- press space for more, use arrow keys to move, '?' for help, 'q' to quit."
+msgstr "――更多请按空格,移动用方å‘键,求助用‘?’,退出用‘q’。"
+
+#: LYMessages.c:51
+msgid "-- press space for next page --"
+msgstr "―― 看下一页请按回车 ――"
+
+#: LYMessages.c:52
+msgid "URL too long"
+msgstr "是ä¸æ˜¯ URL 太长了 "
+
+#. Inactive input fields, messages used with -tna option - kw
+#. #define FORM_LINK_TEXT_MESSAGE_INA
+#: LYMessages.c:58
+msgid "(Text entry field) Inactive. Press <return> to activate."
+msgstr "(文本æ¡ç›®åŒºåŸŸï¼‰æœªè¢«æ¿€æ´»ï¼Œè¯·æŒ‰å›žè½¦æ¿€æ´»ã€‚"
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_INA
+#: LYMessages.c:60
+msgid "(Textarea) Inactive. Press <return> to activate."
+msgstr "(文本域)未激活,请按回车激活。"
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_INA_E
+#: LYMessages.c:62
+#, c-format
+msgid "(Textarea) Inactive. Press <return> to activate (%s for editor)."
+msgstr "(文本域)未激活,请按回车激活(编辑器用 %s )。"
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE_INA
+#: LYMessages.c:64
+msgid "(Form field) Inactive. Use <return> to edit."
+msgstr "(表å•åŒºåŸŸï¼‰æœªæ¿€æ´»ï¼Œç¼–辑按回车。"
+
+#. #define FORM_TEXT_SUBMIT_MESSAGE_INA_X
+#: LYMessages.c:66
+#, c-format
+msgid "(Form field) Inactive. Use <return> to edit (%s to submit with no cache)."
+msgstr "(表å•åŒºåŸŸï¼‰æœªæ¿€æ´»ï¼Œç¼–辑按回车( ä¸ä½œä¿®æ”¹é€’交请按 %s )。"
+
+#. #define FORM_TEXT_RESUBMIT_MESSAGE_INA
+#: LYMessages.c:68
+msgid "(Form field) Inactive. Press <return> to edit, press <return> twice to submit."
+msgstr "(表å•åŒºåŸŸï¼‰æœªæ¿€æ´»ï¼Œç¼–辑按回车,递交按两次回车。"
+
+#. #define FORM_TEXT_SUBMIT_MAILTO_MSG_INA
+#: LYMessages.c:70
+msgid "(mailto form field) Inactive. Press <return> to change."
+msgstr "( mailto 表å•åŸŸï¼‰æœªæ¿€æ´»ï¼Œä¿®æ­£æŒ‰å›žè½¦ã€‚"
+
+#. #define FORM_LINK_PASSWORD_MESSAGE_INA
+#: LYMessages.c:72
+msgid "(Password entry field) Inactive. Press <return> to activate."
+msgstr "( Password æ¡ç›®åŸŸï¼‰æœªè¢«æ¿€æ´»ï¼ŒæŒ‰å›žè½¦æ¿€æ´»ã€‚"
+
+#. #define FORM_LINK_FILE_UNM_MSG
+#: LYMessages.c:75
+msgid "UNMODIFIABLE file entry field. Use UP or DOWN arrows or tab to move off."
+msgstr "ä¸å‡†æ”¹åŠ¨çš„文件æ¡ç›®åŸŸï¼Œç¦»å¼€æŒ‰å‘上键ã€å‘上键或 Tab 键。"
+
+#. #define FORM_LINK_FILE_MESSAGE
+#: LYMessages.c:77
+msgid "(File entry field) Enter filename. Use UP or DOWN arrows or tab to move off."
+msgstr "(文件æ¡ç›®åŸŸï¼‰è¾“入文件å,离开按å‘上键ã€å‘上键或 Tab 键。"
+
+#. #define FORM_LINK_TEXT_MESSAGE
+#: LYMessages.c:79
+msgid "(Text entry field) Enter text. Use UP or DOWN arrows or tab to move off."
+msgstr "(文本æ¡ç›®åŸŸï¼‰è¾“入文字,离开按å‘上键ã€å‘上键或 Tab 键。"
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE
+#: LYMessages.c:81
+msgid "(Textarea) Enter text. Use UP/DOWN arrows or TAB to move off."
+msgstr "(文本区域)输入文字,离开按å‘上键ã€å‘上键或 Tab 键。"
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_E
+#: LYMessages.c:83
+#, c-format
+msgid "(Textarea) Enter text. Use UP/DOWN arrows or TAB to move off (%s for editor)."
+msgstr "(文本区域)输入文字,离开按å‘上键ã€å‘上键或 Tab 键(编辑器用 %s)。"
+
+#. #define FORM_LINK_TEXT_UNM_MSG
+#: LYMessages.c:85
+msgid "UNMODIFIABLE form text field. Use UP or DOWN arrows or tab to move off."
+msgstr "ä¸å‡†æ”¹åŠ¨çš„表å•æ–‡æœ¬åŒºåŸŸï¼Œç¦»å¼€æŒ‰å‘上键ã€å‘上键或 Tab 键。"
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE
+#: LYMessages.c:87
+msgid "(Form field) Enter text. Use <return> to submit."
+msgstr "(表å•åŒºåŸŸï¼‰è¾“入文字,递交按回车。"
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE_X
+#: LYMessages.c:89
+#, c-format
+msgid "(Form field) Enter text. Use <return> to submit (%s for no cache)."
+msgstr "(表å•åŒºåŸŸï¼‰è¾“入文字,递交按回车(å–消缓存用 %s)"
+
+#. #define FORM_LINK_TEXT_RESUBMIT_MESSAGE
+#: LYMessages.c:91
+msgid "(Form field) Enter text. Use <return> to submit, arrows or tab to move off."
+msgstr "(表å•åŒºåŸŸï¼‰è¾“入文字,递交按回车,离开用方å‘键或 Tab 。"
+
+#. #define FORM_LINK_TEXT_SUBMIT_UNM_MSG
+#: LYMessages.c:93
+msgid "UNMODIFIABLE form field. Use UP or DOWN arrows or tab to move off."
+msgstr "ä¸å‡†æ”¹åŠ¨çš„表å•åŸŸï¼Œç¦»å¼€ç”¨å‘上键ã€å‘上键或 Tab 键。"
+
+#. #define FORM_LINK_TEXT_SUBMIT_MAILTO_MSG
+#: LYMessages.c:95
+msgid "(mailto form field) Enter text. Use <return> to submit, arrows to move off."
+msgstr "(mailto 表å•åŸŸï¼‰è¾“入文字,递交按回车,离开按方å‘键。"
+
+#. #define FORM_LINK_TEXT_SUBMIT_MAILTO_DIS_MSG
+#: LYMessages.c:97
+msgid "(mailto form field) Mail is disallowed so you cannot submit."
+msgstr "(mailto 表å•åŸŸï¼‰ç¦æ­¢å‘信,所以您无法递交。"
+
+#. #define FORM_LINK_PASSWORD_MESSAGE
+#: LYMessages.c:99
+msgid "(Password entry field) Enter text. Use UP or DOWN arrows or tab to move off."
+msgstr "(Password æ¡ç›®åŸŸï¼‰è¾“入文字,离开用å‘上键ã€å‘上键或 Tab 键。"
+
+#. #define FORM_LINK_PASSWORD_UNM_MSG
+#: LYMessages.c:101
+msgid "UNMODIFIABLE form password. Use UP or DOWN arrows or tab to move off."
+msgstr "ä¸å‡†æ”¹åŠ¨çš„ password 表å•ï¼Œç¦»å¼€æŒ‰å‘上ã€å‘上方å‘键或 Tab 键。"
+
+#. #define FORM_LINK_CHECKBOX_MESSAGE
+#: LYMessages.c:103
+msgid "(Checkbox Field) Use right-arrow or <return> to toggle."
+msgstr "(Checkbox 域)翻å·æŒ‰å‘å³é”®æˆ–回车。"
+
+#. #define FORM_LINK_CHECKBOX_UNM_MSG
+#: LYMessages.c:105
+msgid "UNMODIFIABLE form checkbox. Use UP or DOWN arrows or tab to move off."
+msgstr "ä¸å‡†æ”¹åŠ¨çš„ chenkbox 表å•ï¼Œç¦»å¼€ç”¨å‘上键ã€å‘上键或 Tab 键。"
+
+#. #define FORM_LINK_RADIO_MESSAGE
+#: LYMessages.c:107
+msgid "(Radio Button) Use right-arrow or <return> to toggle."
+msgstr "(Radio 按钮) ç¿»å·ç”¨å‘å³é”®æˆ–回车。"
+
+#. #define FORM_LINK_RADIO_UNM_MSG
+#: LYMessages.c:109
+msgid "UNMODIFIABLE form radio button. Use UP or DOWN arrows or tab to move off."
+msgstr "ä¸å‡†æ”¹åŠ¨çš„ radio 按钮表å•ï¼Œç¦»å¼€æŒ‰å‘上键ã€å‘上键或 Tab 键。"
+
+#. #define FORM_LINK_SUBMIT_PREFIX
+#: LYMessages.c:111
+msgid "Submit ('x' for no cache) to "
+msgstr "递交(å–消缓存用‘x’)至"
+
+#. #define FORM_LINK_RESUBMIT_PREFIX
+#: LYMessages.c:113
+msgid "Submit to "
+msgstr "递交至"
+
+#. #define FORM_LINK_SUBMIT_MESSAGE
+#: LYMessages.c:115
+msgid "(Form submit button) Use right-arrow or <return> to submit ('x' for no cache)."
+msgstr "(表å•çš„ submit 按钮)递交按å‘å³æˆ–回车键(å–消缓存用‘x’)。"
+
+#. #define FORM_LINK_RESUBMIT_MESSAGE
+#: LYMessages.c:117
+msgid "(Form submit button) Use right-arrow or <return> to submit."
+msgstr "(表å•çš„ submit 按钮) 递交按å‘å³é”®æˆ–回车键。"
+
+#. #define FORM_LINK_SUBMIT_DIS_MSG
+#: LYMessages.c:119
+msgid "DISABLED form submit button. Use UP or DOWN arrows or tab to move off."
+msgstr "ç¦ç”¨è¡¨å•çš„ submit 按钮,离开按å‘上键ã€å‘上键或 Tab 键。"
+
+#. #define FORM_LINK_SUBMIT_MAILTO_PREFIX
+#: LYMessages.c:121
+msgid "Submit mailto form to "
+msgstr "å°† mailto 表å•é€’交至"
+
+#. #define FORM_LINK_SUBMIT_MAILTO_MSG
+#: LYMessages.c:123
+msgid "(mailto form submit button) Use right-arrow or <return> to submit."
+msgstr "(mailto 表å•çš„ submit 按钮)递交按å‘å³é”®æˆ–回车键。"
+
+#. #define FORM_LINK_SUBMIT_MAILTO_DIS_MSG
+#: LYMessages.c:125
+msgid "(mailto form submit button) Mail is disallowed so you cannot submit."
+msgstr "(mailto 表å•çš„ submit 按钮)Mail å·²ç¦ç”¨ ,所以您无法递交。 "
+
+#. #define FORM_LINK_RESET_MESSAGE
+#: LYMessages.c:127
+msgid "(Form reset button) Use right-arrow or <return> to reset form to defaults."
+msgstr "(表å•çš„ reset 按钮) 回å¤è‡³é»˜è®¤è¡¨å•ï¼Œè¯·æŒ‰å‘å³é”®æˆ–回车键。"
+
+#. #define FORM_LINK_RESET_DIS_MSG
+#: LYMessages.c:129
+msgid "DISABLED form reset button. Use UP or DOWN arrows or tab to move off."
+msgstr "表å•çš„ reset 按钮已ç¦ç”¨ï¼Œç¦»å¼€è¯·æŒ‰å‘上键ã€å‘上键或 Tab 键。"
+
+#. #define FORM_LINK_OPTION_LIST_MESSAGE
+#: LYMessages.c:131
+msgid "(Option list) Hit return and use arrow keys and return to select option."
+msgstr "(Option list)选择请按方å‘键,选中请按回车。"
+
+#. #define CHOICE_LIST_MESSAGE
+#: LYMessages.c:133
+msgid "(Choice list) Hit return and use arrow keys and return to select option."
+msgstr "(Choice list)选择请按方å‘键,选中请按回车。"
+
+#. #define FORM_LINK_OPTION_LIST_UNM_MSG
+#: LYMessages.c:135
+msgid "UNMODIFIABLE option list. Use return or arrow keys to review or leave."
+msgstr "ä¸å‡†æ”¹åŠ¨çš„ option list ,预览或离开请按回车åŠæ–¹å‘键。"
+
+#. #define CHOICE_LIST_UNM_MSG
+#: LYMessages.c:137
+msgid "UNMODIFIABLE choice list. Use return or arrow keys to review or leave."
+msgstr "ä¸å‡†æ”¹åŠ¨çš„ choice list ,预览或离开请按回车åŠæ–¹å‘键。"
+
+#: LYMessages.c:138
+msgid "Submitting form..."
+msgstr "表å•æ­£åœ¨é€’交中……"
+
+#: LYMessages.c:139
+msgid "Resetting form..."
+msgstr "表å•æ­£è¢«é‡ç½®â€¦â€¦"
+
+#. #define RELOADING_FORM
+#: LYMessages.c:141
+msgid "Reloading document. Any form entries will be lost!"
+msgstr "正在é‡æ–°å†å…¥æ–‡æ¡£ï¼Œå°†é—失表å•æ¡ç›®ï¼"
+
+#: LYMessages.c:142
+#, c-format
+msgid "Warning: Cannot transcode form data to charset %s!"
+msgstr "警告:无法将表å•çš„æ•°æ®è½¬æˆ %s 字符集ï¼"
+
+#. #define NORMAL_LINK_MESSAGE
+#: LYMessages.c:145
+msgid "(NORMAL LINK) Use right-arrow or <return> to activate."
+msgstr "(NORMAL LINK) 激活用å‘å³é”®æˆ–回车。"
+
+#: LYMessages.c:146
+msgid "The resource requested is not available at this time."
+msgstr "此时无法获å–被请求的资æºã€‚"
+
+#: LYMessages.c:147
+msgid "Enter Lynx keystroke command: "
+msgstr "输入 Lynx keystroke 命令:"
+
+#: LYMessages.c:148
+msgid "Looking up "
+msgstr "寻找"
+
+#: LYMessages.c:149
+#, c-format
+msgid "Getting %s"
+msgstr "获得 %s"
+
+#: LYMessages.c:150
+#, c-format
+msgid "Skipping %s"
+msgstr "忽略 %s"
+
+#: LYMessages.c:151
+#, c-format
+msgid "Using %s"
+msgstr "使用 %s"
+
+#: LYMessages.c:152
+#, c-format
+msgid "Illegal URL: %s"
+msgstr "éžæ³•çš„ URL :%s"
+
+#: LYMessages.c:153
+#, c-format
+msgid "Badly formed address %s"
+msgstr "错误的地å€æ ¼å¼ %s"
+
+#: LYMessages.c:154
+#, c-format
+msgid "URL: %s"
+msgstr ""
+
+#: LYMessages.c:155
+msgid "Unable to access WWW file!!!"
+msgstr "无法访问 WWW 文件ï¼ï¼ï¼"
+
+#: LYMessages.c:156
+#, c-format
+msgid "This is a searchable index. Use %s to search."
+msgstr "这是个å¯æœç´¢çš„ index ,请用 %s 进行æœç´¢ã€‚"
+
+#. #define WWW_INDEX_MORE_MESSAGE
+#: LYMessages.c:158
+#, c-format
+msgid "--More-- This is a searchable index. Use %s to search."
+msgstr "――More―― 这是个å¯æœç´¢çš„ index ,请用 %s 进行æœç´¢ã€‚"
+
+#: LYMessages.c:159
+msgid "You have entered an invalid link number."
+msgstr "您输入了一个éžæ³•çš„链接å·ã€‚"
+
+#. #define SOURCE_HELP
+#: LYMessages.c:161
+msgid "Currently viewing document source. Press '\\' to return to rendered version."
+msgstr "当å‰æ­£åœ¨æµè§ˆæºæ–‡ä»¶ã€‚查看效果,请按“\\â€ã€‚"
+
+#. #define NOVICE_LINE_ONE
+#: LYMessages.c:163
+msgid " Arrow keys: Up and Down to move. Right to follow a link; Left to go back. \n"
+msgstr "æ–¹å‘键:移动用上下键;选中链接用å‘å³é”®ï¼›è¿”回用å‘左键。\n"
+
+#. #define NOVICE_LINE_TWO
+#: LYMessages.c:165
+msgid " H)elp O)ptions P)rint G)o M)ain screen Q)uit /=search [delete]=history list \n"
+msgstr ""
+
+#. #define NOVICE_LINE_TWO_A
+#: LYMessages.c:167
+msgid " O)ther cmds H)elp K)eymap G)oto P)rint M)ain screen o)ptions Q)uit \n"
+msgstr ""
+
+#. #define NOVICE_LINE_TWO_B
+#: LYMessages.c:169
+msgid " O)ther cmds B)ack E)dit D)ownload ^R)eload ^W)ipe screen search doc: / \n"
+msgstr ""
+
+#. #define NOVICE_LINE_TWO_C
+#: LYMessages.c:171
+msgid "O)ther cmds C)omment History: <backspace> Bookmarks: V)iew, A)dd, R)emove \n"
+msgstr ""
+
+#. #define FORM_NOVICELINE_ONE
+#: LYMessages.c:173
+msgid " Enter text into the field by typing on the keyboard "
+msgstr "用键盘敲入文字。"
+
+#. #define FORM_NOVICELINE_TWO
+#: LYMessages.c:175
+msgid " Ctrl-U to delete all text in field, [Backspace] to delete a character "
+msgstr "删除域中的所有文字,用 Ctrl-U ï¼›åªåˆ é™¤ä¸€ä¸ªå­—符,用 [Backspace] "
+
+#. #define FORM_NOVICELINE_TWO_DELBL
+#: LYMessages.c:177
+msgid " Ctrl-U to delete text in field, [Backspace] to delete a character "
+msgstr "删除域中的所有文字,用 Ctrl-U ï¼›åªåˆ é™¤ä¸€ä¸ªå­—符,用 [Backspace]"
+
+#. #define FORM_NOVICELINE_TWO_VAR
+#: LYMessages.c:179
+#, c-format
+msgid " %s to delete all text in field, [Backspace] to delete a character "
+msgstr "删除域中的所有文字,用 %s ï¼›åªåˆ é™¤ä¸€ä¸ªå­—符,用 [Backspace]"
+
+#. #define FORM_NOVICELINE_TWO_DELBL_VAR
+#: LYMessages.c:181
+#, c-format
+msgid " %s to delete text in field, [Backspace] to delete a character "
+msgstr "删除域中的所有文字,用 %s ï¼›åªåˆ é™¤ä¸€ä¸ªå­—符,用 [Backspace]"
+
+#. mailto
+#: LYMessages.c:184
+msgid "Malformed mailto form submission! Cancelled!"
+msgstr "错误的 mailto 表å•ï¼å·²ç»å–消ï¼"
+
+#: LYMessages.c:185
+msgid "Warning! Control codes in mail address replaced by ?"
+msgstr "警告ï¼é‚®ä»¶åœ°å€ä¸­çš„控制代ç å·²ç»è¢« ?å–代"
+
+#: LYMessages.c:186
+msgid "Mail disallowed! Cannot submit."
+msgstr "ç¦ç”¨é‚®ä»¶ï¼æ— æ³•é€’交。"
+
+#: LYMessages.c:187
+msgid "Mailto form submission failed!"
+msgstr "Mailto 表å•é€’交出错ï¼"
+
+#: LYMessages.c:188
+msgid "Mailto form submission Cancelled!!!"
+msgstr "å–消了 Mailto 递交表å•"
+
+#: LYMessages.c:189
+msgid "Sending form content..."
+msgstr "正在å‘é€è¡¨å•å†…容..."
+
+#: LYMessages.c:190
+msgid "No email address is present in mailto URL!"
+msgstr "mailto URL 中没有邮件地å€ï¼"
+
+#. #define MAILTO_URL_TEMPOPEN_FAILED
+#: LYMessages.c:192
+msgid "Unable to open temporary file for mailto URL!"
+msgstr "无法为 mailto URL 打开临时文件ï¼"
+
+#. #define INC_ORIG_MSG_PROMPT
+#: LYMessages.c:194
+msgid "Do you wish to include the original message?"
+msgstr "您想è¦åŒ…å«åŽŸå§‹æ¶ˆæ¯å—?"
+
+#. #define INC_PREPARSED_MSG_PROMPT
+#: LYMessages.c:196
+msgid "Do you wish to include the preparsed source?"
+msgstr "您想è¦åŒ…å«é¢„先解æžçš„æºæ–‡ä»¶å—?"
+
+#. #define SPAWNING_EDITOR_FOR_MAIL
+#: LYMessages.c:198
+msgid "Spawning your selected editor to edit mail message"
+msgstr "正在调用您的编辑器æ¥å†™é‚®ä»¶"
+
+#. #define ERROR_SPAWNING_EDITOR
+#: LYMessages.c:200
+msgid "Error spawning editor, check your editor definition in the options menu"
+msgstr "调用编辑器出错,请核查 option menu 中的编辑器定义"
+
+#: LYMessages.c:201
+msgid "Send this comment?"
+msgstr "å‘é€è¯„语?"
+
+#: LYMessages.c:202
+msgid "Send this message?"
+msgstr "å‘é€æ¶ˆæ¯ï¼Ÿ"
+
+#: LYMessages.c:203
+msgid "Sending your message..."
+msgstr "正在å‘é€æ‚¨çš„消æ¯â€¦â€¦"
+
+#: LYMessages.c:204
+msgid "Sending your comment:"
+msgstr "正在å‘é€æ‚¨çš„评语:"
+
+#. textarea
+#: LYMessages.c:207
+msgid "Not in a TEXTAREA; cannot use external editor."
+msgstr "ä¸åœ¨æ–‡æœ¬åŸŸä¸­ï¼Œæ— æ³•ä½¿ç”¨å¤–挂的编辑器。"
+
+#: LYMessages.c:208
+msgid "Not in a TEXTAREA; cannot use command."
+msgstr "ä¸åœ¨æ–‡æœ¬åŸŸä¸­ï¼Œæ— æ³•ä½¿ç”¨å‘½ä»¤ã€‚"
+
+#: LYMessages.c:211
+msgid "file: ACTIONs are disallowed!"
+msgstr "file:ACTIONs å·²ç¦ç”¨ï¼"
+
+#. #define FILE_SERVED_LINKS_DISALLOWED
+#: LYMessages.c:213
+msgid "file: URLs via served links are disallowed!"
+msgstr "file:链接的 URLs å·²ç¦ç”¨"
+
+#: LYMessages.c:214
+msgid "Access to local files denied."
+msgstr "本地文件拒ç»è®¿é—®ã€‚"
+
+#: LYMessages.c:215
+msgid "file: URLs via bookmarks are disallowed!"
+msgstr "file:无法访问书签中的 URLs "
+
+#. #define SPECIAL_VIA_EXTERNAL_DISALLOWED
+#: LYMessages.c:217
+msgid "This special URL is not allowed in external documents!"
+msgstr "无法通过外部文档访问指定 URL ï¼"
+
+#: LYMessages.c:218
+msgid "Press <return> to return to Lynx."
+msgstr "返回 Lynx ,请按回车。"
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:221
+msgid "Spawning DCL subprocess. Use 'logout' to return to Lynx.\n"
+msgstr "正在调用 DCL å­è¿›ç¨‹ï¼Œè¿”回 Lynx ,请用 ‘logout’。\n"
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:225
+msgid "Type EXIT to return to Lynx.\n"
+msgstr "返回 Lynx ,请输入 EXIT 。\n"
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:228
+msgid "Spawning your default shell. Use 'exit' to return to Lynx.\n"
+msgstr "正在调用默认的 shell ,返回 Lynx ,请用 ‘exit’。\n"
+
+#: LYMessages.c:231
+msgid "Spawning is currently disabled."
+msgstr "当å‰æ— æ³•è°ƒç”¨ã€‚"
+
+#: LYMessages.c:232
+msgid "The 'd'ownload command is currently disabled."
+msgstr "当å‰æ— æ³•ç”¨ ‘d’ownload 命令。"
+
+#: LYMessages.c:233
+msgid "You cannot download an input field."
+msgstr "您无法下载输入域。"
+
+#: LYMessages.c:234
+msgid "Form has a mailto action! Cannot download."
+msgstr "表å•å« mailto 动作ï¼æ— æ³•ä¸‹è½½ã€‚"
+
+#: LYMessages.c:235
+msgid "You cannot download a mailto: link."
+msgstr "您无法下载一个 mailto: 链接。"
+
+#: LYMessages.c:236
+msgid "You cannot download cookies."
+msgstr "您无法下载 cookies 。"
+
+#: LYMessages.c:237
+msgid "You cannot download a printing option."
+msgstr "您无法下载一个 printing option 。"
+
+#: LYMessages.c:238
+msgid "You cannot download an upload option."
+msgstr "您无法下载一个 upload option 。"
+
+#: LYMessages.c:239
+msgid "You cannot download an permit option."
+msgstr "您无法下载一个 permit option 。"
+
+#: LYMessages.c:240
+msgid "This special URL cannot be downloaded!"
+msgstr "无法下载指定的 URL"
+
+#: LYMessages.c:241
+msgid "Nothing to download."
+msgstr "没东西下载。"
+
+#: LYMessages.c:242
+msgid "Trace ON!"
+msgstr ""
+
+#: LYMessages.c:243
+msgid "Trace OFF!"
+msgstr ""
+
+#. #define CLICKABLE_IMAGES_ON
+#: LYMessages.c:245
+msgid "Links will be included for all images! Reloading..."
+msgstr "被包å«æ‰€æœ‰å›¾åƒçš„链接ï¼æ­£åœ¨é‡æ–°è½½å…¥â€¦â€¦"
+
+#. #define CLICKABLE_IMAGES_OFF
+#: LYMessages.c:247
+msgid "Standard image handling restored! Reloading..."
+msgstr "回å¤æ ‡å‡†å›¾åƒå¤„ç†ï¼æ­£åœ¨é‡æ–°è½½å…¥â€¦â€¦"
+
+#. #define PSEUDO_INLINE_ALTS_ON
+#: LYMessages.c:249
+msgid "Pseudo_ALTs will be inserted for inlines without ALT strings! Reloading..."
+msgstr "伪 ALT é”®ä¸æ˜¯ä»¥ ALT 字符串,而是以内è”æ–¹å¼æ’å…¥ï¼æ­£åœ¨é‡æ–°è½½å…¥â€¦â€¦"
+
+#. #define PSEUDO_INLINE_ALTS_OFF
+#: LYMessages.c:251
+msgid "Inlines without an ALT string specified will be ignored! Reloading..."
+msgstr "将忽略没有 ALT 字符串指定的内è”æ–¹å¼ï¼æ­£åœ¨é‡æ–°è½½å…¥â€¦â€¦"
+
+#: LYMessages.c:252
+msgid "Raw 8-bit or CJK mode toggled OFF! Reloading..."
+msgstr "关闭原始的 8-bit 或 CJK 模å¼ï¼æ­£åœ¨é‡æ–°è½½å…¥â€¦â€¦"
+
+#: LYMessages.c:253
+msgid "Raw 8-bit or CJK mode toggled ON! Reloading..."
+msgstr "å¼€å¯åŽŸå§‹çš„ 8-bit 或 CJK 模å¼ï¼æ­£åœ¨é‡æ–°è½½å…¥â€¦â€¦"
+
+#. #define HEAD_D_L_OR_CANCEL
+#: LYMessages.c:255
+msgid "Send HEAD request for D)ocument or L)ink, or C)ancel? (d,l,c): "
+msgstr "å‘ D)ocument 还是 L)ink å‘é€ HEAD 请求,亦或 C)ancel ? (d,l,c): "
+
+#. #define HEAD_D_OR_CANCEL
+#: LYMessages.c:257
+msgid "Send HEAD request for D)ocument, or C)ancel? (d,c): "
+msgstr "å‘ D)ocument å‘é€ HEAD 请求,亦或 C)ancel ? (d,l,c): "
+
+#: LYMessages.c:258
+msgid "Sorry, the document is not an http URL."
+msgstr "æŠ±æ­‰ï¼Œè¯¥æ–‡æ¡£å¹¶éž http URL 。"
+
+#: LYMessages.c:259
+msgid "Sorry, the link is not an http URL."
+msgstr "æŠ±æ­‰ï¼Œè¯¥é“¾æŽ¥å¹¶éž http URL 。"
+
+#: LYMessages.c:260
+msgid "Sorry, the ACTION for this form is disabled."
+msgstr "抱歉,该表å•çš„ ACTION å·²ç¦ç”¨ã€‚"
+
+#. #define FORM_ACTION_NOT_HTTP_URL
+#: LYMessages.c:262
+msgid "Sorry, the ACTION for this form is not an http URL."
+msgstr "抱歉,该表å•çš„ ACTION å¹¶éž http URL 。"
+
+#: LYMessages.c:263
+msgid "Not an http URL or form ACTION!"
+msgstr "并éžä¸º http URL 或 表å•çš„ ACTION ï¼"
+
+#: LYMessages.c:264
+msgid "This special URL cannot be a form ACTION!"
+msgstr "指定的 URL ä¸æ˜¯è¡¨å•çš„ ACTION ï¼"
+
+#: LYMessages.c:265
+msgid "URL is not in starting realm!"
+msgstr "URL ä¸åœ¨å¼€å§‹çš„域中ï¼"
+
+#: LYMessages.c:266
+msgid "News posting is disabled!"
+msgstr "å·²ç¦æ­¢æ–°é—»å‘布ï¼"
+
+#: LYMessages.c:267
+msgid "File management support is disabled!"
+msgstr "å·²å–消对文件管ç†çš„支æŒï¼"
+
+#: LYMessages.c:268
+msgid "No jump file is currently available."
+msgstr "当å‰æ²¡æœ‰è·³è½¬æ–‡ä»¶ã€‚"
+
+#: LYMessages.c:269
+msgid "Jump to (use '?' for list): "
+msgstr "跳转到(‘?’将给出列表):"
+
+#: LYMessages.c:270
+msgid "Jumping to a shortcut URL is disallowed!"
+msgstr "ä¸å…许跳转到 URL å¿«æ·é”®ï¼"
+
+#: LYMessages.c:271
+msgid "Random URL is disallowed! Use a shortcut."
+msgstr "ä¸å…许éšæœºçš„ URL ï¼è¯·ç”¨å¿«æ·é”®ã€‚"
+
+#: LYMessages.c:272
+msgid "No random URLs have been used thus far."
+msgstr "ç›®å‰ä¸ºæ­¢ï¼Œè¿˜æ²¡æœ‰ä½¿ç”¨éšæœºçš„ URLs 。"
+
+#: LYMessages.c:273
+msgid "Bookmark features are currently disabled."
+msgstr "当å‰ä¹¦ç­¾åŠŸèƒ½å·²ç¦ç”¨ã€‚"
+
+#: LYMessages.c:274
+msgid "Execution via bookmarks is disabled."
+msgstr "通过书签执行已ç¦ç”¨"
+
+#. #define BOOKMARK_FILE_NOT_DEFINED
+#: LYMessages.c:276
+#, c-format
+msgid "Bookmark file is not defined. Use %s to see options."
+msgstr "没有指定书签文件。请用 %s 查看 options 。"
+
+#. #define NO_TEMP_FOR_HOTLIST
+#: LYMessages.c:278
+msgid "Unable to open tempfile for X Mosaic hotlist conversion."
+msgstr "无法打开 tempfile å®Œæˆ X Mosaic hotlist 的转æ¢ã€‚"
+
+#: LYMessages.c:279
+msgid "ERROR - unable to open bookmark file."
+msgstr "错误――无法打开书签文件。"
+
+#. #define BOOKMARK_OPEN_FAILED_FOR_DEL
+#: LYMessages.c:281
+msgid "Unable to open bookmark file for deletion of link."
+msgstr "无法打开书签文件以删去链接。"
+
+#. #define BOOKSCRA_OPEN_FAILED_FOR_DEL
+#: LYMessages.c:283
+msgid "Unable to open scratch file for deletion of link."
+msgstr "无法打开è‰ç¨¿æ–‡ä»¶ä»¥åˆ åŽ»é“¾æŽ¥ã€‚"
+
+#: LYMessages.c:285
+msgid "Error renaming scratch file."
+msgstr "é‡å‘½åè‰ç¨¿æ–‡ä»¶æ—¶å‡ºé”™ã€‚"
+
+#: LYMessages.c:287
+msgid "Error renaming temporary file."
+msgstr "é‡å‘½å临时文件时出错。"
+
+#. #define BOOKTEMP_COPY_FAIL
+#: LYMessages.c:289
+msgid "Unable to copy temporary file for deletion of link."
+msgstr "无法打开临时文件以删去链接。"
+
+#. #define BOOKTEMP_REOPEN_FAIL_FOR_DEL
+#: LYMessages.c:291
+msgid "Unable to reopen temporary file for deletion of link."
+msgstr "无法å†æ‰“开临时文件以删去链接。"
+
+#. #define BOOKMARK_LINK_NOT_ONE_LINE
+#: LYMessages.c:294
+msgid "Link is not by itself all on one line in bookmark file."
+msgstr "书签文件中的链接并éžå•ç‹¬åœ¨ä¸€è¡Œä¸­ã€‚"
+
+#: LYMessages.c:295
+msgid "Bookmark deletion failed."
+msgstr "删去书签时出错。"
+
+#. #define BOOKMARKS_NOT_TRAVERSED
+#: LYMessages.c:297
+msgid "Bookmark files cannot be traversed (only http URLs)."
+msgstr "无法é历书签文件 (åªæœ‰ http URLs)。"
+
+#. #define BOOKMARKS_NOT_OPEN
+#: LYMessages.c:299
+msgid "Unable to open bookmark file, use 'a' to save a link first"
+msgstr "无法打开书签文件,用 'a' å…ˆä¿å­˜é“¾æŽ¥"
+
+#: LYMessages.c:300
+msgid "There are no links in this bookmark file!"
+msgstr "该书签文件中没有链接ï¼"
+
+#. #define BOOK_D_L_OR_CANCEL
+#: LYMessages.c:302
+msgid "Save D)ocument or L)ink to bookmark file or C)ancel? (d,l,c): "
+msgstr ""
+
+#: LYMessages.c:303
+msgid "Save D)ocument to bookmark file or C)ancel? (d,c): "
+msgstr ""
+
+#: LYMessages.c:304
+msgid "Save L)ink to bookmark file or C)ancel? (l,c): "
+msgstr ""
+
+#. #define NOBOOK_POST_FORM
+#: LYMessages.c:306
+msgid "Documents from forms with POST content cannot be saved as bookmarks."
+msgstr "文档中å«æœ‰ POST 内容的表å•ï¼Œæ•…无法ä¿å­˜ä¸ºä¹¦ç­¾ã€‚"
+
+#: LYMessages.c:307
+msgid "Cannot save form fields/links"
+msgstr "无法ä¿å­˜è¡¨å•çš„域ï¼é“¾æŽ¥"
+
+#. #define NOBOOK_HSML
+#: LYMessages.c:309
+msgid "History, showinfo, menu and list files cannot be saved as bookmarks."
+msgstr "无法将历å²è®°å½•ã€showinfoã€menu åŠ list files ä¿å­˜ä¸ºä¹¦ç­¾ã€‚"
+
+#. #define CONFIRM_BOOKMARK_DELETE
+#: LYMessages.c:311
+msgid "Do you really want to delete this link from your bookmark file?"
+msgstr "您真的è¦å°†æ­¤é“¾æŽ¥ä»Žä¹¦ç­¾ä¸­åˆ é™¤ï¼Ÿ"
+
+#: LYMessages.c:312
+msgid "Malformed address."
+msgstr "地å€æœ‰è¯¯ã€‚"
+
+#. #define HISTORICAL_ON_MINIMAL_OFF
+#: LYMessages.c:314
+msgid "Historical comment parsing ON (Minimal is overridden)!"
+msgstr ""
+
+#. #define HISTORICAL_OFF_MINIMAL_ON
+#: LYMessages.c:316
+msgid "Historical comment parsing OFF (Minimal is in effect)!"
+msgstr ""
+
+#. #define HISTORICAL_ON_VALID_OFF
+#: LYMessages.c:318
+msgid "Historical comment parsing ON (Valid is overridden)!"
+msgstr ""
+
+#. #define HISTORICAL_OFF_VALID_ON
+#: LYMessages.c:320
+msgid "Historical comment parsing OFF (Valid is in effect)!"
+msgstr ""
+
+#. #define MINIMAL_ON_IN_EFFECT
+#: LYMessages.c:322
+msgid "Minimal comment parsing ON (and in effect)!"
+msgstr ""
+
+#. #define MINIMAL_OFF_VALID_ON
+#: LYMessages.c:324
+msgid "Minimal comment parsing OFF (Valid is in effect)!"
+msgstr ""
+
+#. #define MINIMAL_ON_BUT_HISTORICAL
+#: LYMessages.c:326
+msgid "Minimal comment parsing ON (but Historical is in effect)!"
+msgstr ""
+
+#. #define MINIMAL_OFF_HISTORICAL_ON
+#: LYMessages.c:328
+msgid "Minimal comment parsing OFF (Historical is in effect)!"
+msgstr ""
+
+#: LYMessages.c:329
+msgid "Soft double-quote parsing ON!"
+msgstr ""
+
+#: LYMessages.c:330
+msgid "Soft double-quote parsing OFF!"
+msgstr ""
+
+#: LYMessages.c:331
+msgid "Now using TagSoup parsing of HTML."
+msgstr ""
+
+#: LYMessages.c:332
+msgid "Now using SortaSGML parsing of HTML!"
+msgstr ""
+
+#: LYMessages.c:333
+msgid "You are already at the end of this document."
+msgstr "å·²ç»ä½äºŽæ–‡æ¡£åº•éƒ¨ã€‚"
+
+#: LYMessages.c:334
+msgid "You are already at the beginning of this document."
+msgstr "å·²ç»ä½äºŽæ–‡æ¡£å¼€å¤´ã€‚"
+
+#: LYMessages.c:335
+#, c-format
+msgid "You are already at page %d of this document."
+msgstr "å·²ç»ä½äºŽæ–‡æ¡£çš„第 %d 页。"
+
+#: LYMessages.c:336
+#, c-format
+msgid "Link number %d already is current."
+msgstr "当å‰å°±æ˜¯é“¾æŽ¥å· %d 。"
+
+#: LYMessages.c:337
+msgid "You are already at the first document"
+msgstr "å·²ç»ä½äºŽç¬¬ä¸€ä¸ªæ–‡æ¡£"
+
+#: LYMessages.c:338
+msgid "There are no links above this line of the document."
+msgstr "此行å‰é¢çš„文档中没有链接。"
+
+#: LYMessages.c:339
+msgid "There are no links below this line of the document."
+msgstr "此行åŽé¢çš„文档中没有链接。"
+
+#. #define MAXLEN_REACHED_DEL_OR_MOV
+#: LYMessages.c:341
+msgid "Maximum length reached! Delete text or move off field."
+msgstr "å·²ç»åˆ°è¾¾æœ€å¤§é•¿åº¦ï¼åˆ é™¤æ–‡å­—,或离开该区域。"
+
+#. #define NOT_ON_SUBMIT_OR_LINK
+#: LYMessages.c:343
+msgid "You are not on a form submission button or normal link."
+msgstr "ä¸åœ¨è¡¨æ ¼æ交按钮或普通链接上。"
+
+#. #define NEED_CHECKED_RADIO_BUTTON
+#: LYMessages.c:345
+msgid "One radio button must be checked at all times!"
+msgstr "无论如何,得在å•é€‰æ¡†ä¸­é€‰ä¸€ä¸ªï¼"
+
+#: LYMessages.c:346
+msgid "No submit button for this form, submit single text field?"
+msgstr "没有该表å•çš„æ交按钮,è¦æ交å•ç‹¬çš„文本域å—?"
+
+#: LYMessages.c:347
+msgid "Do you want to go back to the previous document?"
+msgstr "想è¦å›žåˆ°å‰ä¸€ä¸ªæ–‡æ¡£å—?"
+
+#: LYMessages.c:348
+msgid "Use arrows or tab to move off of field."
+msgstr "离开该区域,请用方å‘键或 Tab 。"
+
+#. #define ENTER_TEXT_ARROWS_OR_TAB
+#: LYMessages.c:350
+msgid "Enter text. Use arrows or tab to move off of field."
+msgstr "请输入文字。离开该区域,请用方å‘键或 Tab 。"
+
+#: LYMessages.c:351
+msgid "** Bad HTML!! No form action defined. **"
+msgstr "** HTML 有问题ï¼ï¼æ²¡æœ‰å®šä¹‰è¡¨å•åŠ¨ä½œã€‚**"
+
+#: LYMessages.c:352
+msgid "Bad HTML!! Unable to create popup window!"
+msgstr "HTML 有问题ï¼ï¼æ— æ³•æ–°å»ºå¼¹å‡ºåˆ›å£ï¼"
+
+#: LYMessages.c:353
+msgid "Unable to create popup window!"
+msgstr "无法新建弹出创å£ï¼"
+
+#: LYMessages.c:354
+msgid "Goto a random URL is disallowed!"
+msgstr "访问éšæœº URL 功能已ç¦ç”¨ï¼"
+
+#: LYMessages.c:355
+msgid "Goto a non-http URL is disallowed!"
+msgstr "ä¸å…许访问 non-http URLï¼"
+
+#: LYMessages.c:356
+#, c-format
+msgid "You are not allowed to goto \"%s\" URLs"
+msgstr "ä¸å…许访问 \\'%s\\\" URLs"
+
+#: LYMessages.c:357
+msgid "URL to open: "
+msgstr "打开 URL:"
+
+#: LYMessages.c:358
+msgid "Edit the current Goto URL: "
+msgstr "编辑当å‰çš„ URL:"
+
+#: LYMessages.c:359
+msgid "Edit the previous Goto URL: "
+msgstr "编辑上一个所在的 URL:"
+
+#: LYMessages.c:360
+msgid "Edit a previous Goto URL: "
+msgstr "编辑上一个所在的 URL:"
+
+#: LYMessages.c:361
+msgid "Current document has POST data."
+msgstr "当å‰æ–‡æ¡£å«æœ‰ POST æ•°æ®ã€‚"
+
+#: LYMessages.c:362
+msgid "Edit this document's URL: "
+msgstr "编辑此文档的 URL:"
+
+#: LYMessages.c:363
+msgid "Edit the current link's URL: "
+msgstr "编辑此链接的 URL:"
+
+#: LYMessages.c:364
+msgid "You cannot edit File Management URLs"
+msgstr "您无法编辑文件管ç†çš„ URLs"
+
+#: LYMessages.c:365
+msgid "Enter a database query: "
+msgstr "输入资料库的查询:"
+
+#: LYMessages.c:366
+msgid "Enter a whereis query: "
+msgstr "输入 whereis 查询:"
+
+#: LYMessages.c:367
+msgid "Edit the current query: "
+msgstr "编辑当å‰çš„查询:"
+
+#: LYMessages.c:368
+msgid "Edit the previous query: "
+msgstr "编辑å‰ä¸€æ¡æŸ¥è¯¢ï¼š"
+
+#: LYMessages.c:369
+msgid "Edit a previous query: "
+msgstr "编辑å‰ä¸€æ¡æŸ¥è¯¢ï¼š"
+
+#. #define USE_C_R_TO_RESUB_CUR_QUERY
+#: LYMessages.c:371
+msgid "Use Control-R to resubmit the current query."
+msgstr "é‡æ–°é€’交当å‰æŸ¥è¯¢ï¼Œè¯·ç”¨ Ctrl-R 。"
+
+#: LYMessages.c:372
+msgid "Edit the current shortcut: "
+msgstr "编辑当å‰å¿«æ·é”®ï¼š"
+
+#: LYMessages.c:373
+msgid "Edit the previous shortcut: "
+msgstr "编辑å‰ä¸€ä¸ªå¿«æ·é”®ï¼š"
+
+#: LYMessages.c:374
+msgid "Edit a previous shortcut: "
+msgstr "编辑å‰ä¸€ä¸ªå¿«æ·é”®ï¼š"
+
+#: LYMessages.c:375
+#, c-format
+msgid "Key '%c' is not mapped to a jump file!"
+msgstr "'%c' 键无法映射到一个跳转的文件ï¼"
+
+#: LYMessages.c:376
+msgid "Cannot locate jump file!"
+msgstr "无法定ä½è·³è½¬çš„文件ï¼"
+
+#: LYMessages.c:377
+msgid "Cannot open jump file!"
+msgstr "无法打开跳转的文件ï¼"
+
+#: LYMessages.c:378
+msgid "Error reading jump file!"
+msgstr "读å–跳转文件时出错ï¼"
+
+#: LYMessages.c:379
+msgid "Out of memory reading jump file!"
+msgstr "读å–跳转文件时内存ä¸å¤Ÿï¼"
+
+#: LYMessages.c:380
+msgid "Out of memory reading jump table!"
+msgstr "读å–跳转表格时内存ä¸å¤Ÿï¼"
+
+#: LYMessages.c:381
+msgid "No index is currently available."
+msgstr "当å‰æ²¡æœ‰å¯ç”¨çš„索引。"
+
+#. #define CONFIRM_MAIN_SCREEN
+#: LYMessages.c:383
+msgid "Do you really want to go to the Main screen?"
+msgstr "您真的è¦åˆ°ä¸»çª—å£å—?"
+
+#: LYMessages.c:384
+msgid "You are already at main screen!"
+msgstr "å·²ç»ä½äºŽä¸»çª—å£ï¼"
+
+#. #define NOT_ISINDEX
+#: LYMessages.c:386
+msgid "Not a searchable indexed document -- press '/' to search for a text string"
+msgstr "ä¸æ˜¯å¯æœç´¢æ–‡æ¡£ ―― æœç´¢æ–‡æœ¬å­—符串,请按 '/'"
+
+#. #define NO_OWNER
+#: LYMessages.c:388
+msgid "No owner is defined for this file so you cannot send a comment"
+msgstr "这个文件没有定义所有者,所以您无法å‘é€è¯„语"
+
+#: LYMessages.c:389
+#, c-format
+msgid "No owner is defined. Use %s?"
+msgstr "未定义所有者。用 %s ?"
+
+#: LYMessages.c:390
+msgid "Do you wish to send a comment?"
+msgstr "您想è¦å‘é€è¯„语å—?"
+
+#: LYMessages.c:391
+msgid "Mail is disallowed so you cannot send a comment"
+msgstr "ä¸å…许使用邮件,所以您无法å‘é€è¯„语"
+
+#: LYMessages.c:392
+msgid "The 'e'dit command is currently disabled."
+msgstr "å½“å‰ 'e'dit 命令已ç¦ç”¨ã€‚"
+
+#: LYMessages.c:393
+msgid "External editing is currently disabled."
+msgstr "当å‰å¤–部编辑已ç¦ç”¨ã€‚"
+
+#: LYMessages.c:394
+msgid "System error - failure to get status."
+msgstr "系统错误 ―― 无法获å–状æ€ã€‚"
+
+#: LYMessages.c:395
+msgid "No editor is defined!"
+msgstr "没有定义编辑器ï¼"
+
+#: LYMessages.c:396
+msgid "The 'p'rint command is currently disabled."
+msgstr "å½“å‰ 'p'rint 命令已ç¦ç”¨ã€‚"
+
+#: LYMessages.c:397
+msgid "Document has no Toolbar links or Banner."
+msgstr "文档没有工具æ é“¾æŽ¥æˆ– Banner 。"
+
+#: LYMessages.c:398
+msgid "Unable to open traversal file."
+msgstr "无法打开é历的文件。"
+
+#: LYMessages.c:399
+msgid "Unable to open traversal found file."
+msgstr "无法打开é历的 found 文件。"
+
+#: LYMessages.c:400
+msgid "Unable to open reject file."
+msgstr "无法打开 reject 文件。"
+
+#: LYMessages.c:401
+msgid "Unable to open traversal errors output file"
+msgstr "无法打开é历的错误输出文件"
+
+#: LYMessages.c:402
+msgid "TRAVERSAL WAS INTERRUPTED"
+msgstr "é历被中断"
+
+#: LYMessages.c:403
+msgid "Follow link (or goto link or page) number: "
+msgstr "è·Ÿéšé“¾æŽ¥ï¼ˆæˆ– goto 链接åŠé¡µé¢ï¼‰å·ç ï¼š"
+
+#: LYMessages.c:404
+msgid "Select option (or page) number: "
+msgstr "选择å¯é€‰é¡¹ï¼ˆæˆ–页é¢ï¼‰å·ç ï¼š"
+
+#: LYMessages.c:405
+#, c-format
+msgid "Option number %d already is current."
+msgstr "当å‰å°±æ˜¯å¯é€‰é¡¹å·ç  %d 。"
+
+#. #define ALREADY_AT_OPTION_END
+#: LYMessages.c:407
+msgid "You are already at the end of this option list."
+msgstr "å·²ç»ä½äºŽå¯é€‰é¡¹åˆ—表底部。"
+
+#. #define ALREADY_AT_OPTION_BEGIN
+#: LYMessages.c:409
+msgid "You are already at the beginning of this option list."
+msgstr "å·²ç»ä½äºŽå¯é€‰é¡¹åˆ—表顶部。"
+
+#. #define ALREADY_AT_OPTION_PAGE
+#: LYMessages.c:411
+#, c-format
+msgid "You are already at page %d of this option list."
+msgstr "å·²ç»ä½äºŽè¯¥å¯é€‰é¡¹åˆ—表的 %d 页。"
+
+#: LYMessages.c:412
+msgid "You have entered an invalid option number."
+msgstr "您输入了一个éžæ³•çš„å¯é€‰é¡¹å·ç ã€‚"
+
+#: LYMessages.c:413
+msgid "** Bad HTML!! Use -trace to diagnose. **"
+msgstr "** HTML 有问题ï¼ï¼ 请用 -trace 进行诊断。**"
+
+#: LYMessages.c:414
+msgid "Give name of file to save in"
+msgstr "请给出è¦ä¿å­˜çš„文件å"
+
+#: LYMessages.c:415
+msgid "Can't save data to file -- please run WWW locally"
+msgstr "无法将数æ®ä¿å­˜åˆ°æ–‡ä»¶ ―― 请在本地è¿è¡Œ WWW"
+
+#: LYMessages.c:416
+msgid "Can't open temporary file!"
+msgstr "无法打开临时文件ï¼"
+
+#: LYMessages.c:417
+msgid "Can't open output file! Cancelling!"
+msgstr "无法打开输出文件ï¼æ­£åœ¨å–消ï¼"
+
+#: LYMessages.c:418
+msgid "Execution is disabled."
+msgstr "ç¦æ­¢æ‰§è¡Œã€‚"
+
+#. #define EXECUTION_DISABLED_FOR_FILE
+#: LYMessages.c:420
+#, c-format
+msgid "Execution is not enabled for this file. See the Options menu (use %s)."
+msgstr "该文件没有å¯ç”¨æ‰§è¡Œï¼Œè¯·å‚看å¯é€‰é¡¹èœå•ï¼ˆç”¨ %s )。"
+
+#. #define EXECUTION_NOT_COMPILED
+#: LYMessages.c:422
+msgid "Execution capabilities are not compiled into this version."
+msgstr "此版本在编译时没有加入执行功能。"
+
+#: LYMessages.c:423
+msgid "This file cannot be displayed on this terminal."
+msgstr "该文件无法在当å‰ç»ˆç«¯ä¸­è¿è¡Œã€‚"
+
+#. #define CANNOT_DISPLAY_FILE_D_OR_C
+#: LYMessages.c:425
+msgid "This file cannot be displayed on this terminal: D)ownload, or C)ancel"
+msgstr "该文件无法在当å‰ç»ˆç«¯ä¸­è¿è¡Œï¼šD)ownload,或 C)ancel"
+
+#: LYMessages.c:426
+#, c-format
+msgid "%s D)ownload, or C)ancel"
+msgstr ""
+
+#: LYMessages.c:427
+msgid "Cancelling file."
+msgstr "正在å–消文件。"
+
+#: LYMessages.c:428
+msgid "Retrieving file. - PLEASE WAIT -"
+msgstr "é‡æ–°èŽ·å–文件,―― 请ç¨å€™ ――"
+
+#: LYMessages.c:429
+msgid "Enter a filename: "
+msgstr "请输入一个文件å:"
+
+#: LYMessages.c:430
+msgid "Edit the previous filename: "
+msgstr "编辑å‰ä¸€ä¸ªæ–‡ä»¶å:"
+
+#: LYMessages.c:431
+msgid "Edit a previous filename: "
+msgstr "编辑å‰ä¸€ä¸ªæ–‡ä»¶å:"
+
+#: LYMessages.c:432
+msgid "Enter a new filename: "
+msgstr "输入一个新的文件å:"
+
+#: LYMessages.c:433
+msgid "File name may not begin with a dot."
+msgstr "文件åä¸èƒ½ä»¥ç‚¹å·å¼€å¤´ã€‚"
+
+#: LYMessages.c:435
+msgid "File exists. Create higher version?"
+msgstr "文件已存在,è¦åˆ›å»ºæ–°ç‰ˆæœ¬å—?"
+
+#: LYMessages.c:437
+msgid "File exists. Overwrite?"
+msgstr "文件已存在,è¦è¦†ç›–å—?"
+
+#: LYMessages.c:439
+msgid "Cannot write to file."
+msgstr "无法写入文件。"
+
+#: LYMessages.c:440
+msgid "ERROR! - download command is misconfigured."
+msgstr "出错ï¼â€•â€• 下载命令é…置错误。"
+
+#: LYMessages.c:441
+msgid "Unable to download file."
+msgstr "无法下载文件。"
+
+#: LYMessages.c:442
+msgid "Reading directory..."
+msgstr "正在读å–目录……"
+
+#: LYMessages.c:443
+msgid "Building directory listing..."
+msgstr "正在建立目录列表……"
+
+#: LYMessages.c:444
+msgid "Saving..."
+msgstr "正在ä¿å­˜â€¦â€¦"
+
+#: LYMessages.c:445
+#, c-format
+msgid "Could not edit file '%s'."
+msgstr "无法编辑文件 '%s' 。"
+
+#: LYMessages.c:446
+msgid "Unable to access document!"
+msgstr "无法存å–文档ï¼"
+
+#: LYMessages.c:447
+msgid "Could not access file."
+msgstr "无法存å–文件。"
+
+#: LYMessages.c:448
+msgid "Could not access directory."
+msgstr "无法存å–目录。"
+
+#: LYMessages.c:449
+msgid "Could not load data."
+msgstr "无法载入数æ®ã€‚"
+
+#. #define CANNOT_EDIT_REMOTE_FILES
+#: LYMessages.c:451
+msgid "Lynx cannot currently (e)dit remote WWW files."
+msgstr "å½“å‰ Lynx 无法 (e)dit 远程的 WWW 文件。"
+
+#. #define CANNOT_EDIT_FIELD
+#: LYMessages.c:453
+msgid "This field cannot be (e)dited with an external editor."
+msgstr "该文件无法由外部的编辑器进行 (e)dit 。"
+
+#: LYMessages.c:454
+msgid "Bad rule"
+msgstr "规则有问题"
+
+#: LYMessages.c:455
+msgid "Insufficient operands:"
+msgstr "æ“作数ä¸å¤Ÿï¼š"
+
+#: LYMessages.c:456
+msgid "You are not authorized to edit this file."
+msgstr "您没有获得修改此文件的授æƒã€‚"
+
+#: LYMessages.c:457
+msgid "Title: "
+msgstr "标题:"
+
+#: LYMessages.c:458
+msgid "Subject: "
+msgstr "主题:"
+
+#: LYMessages.c:459
+msgid "Username: "
+msgstr "用户å:"
+
+#: LYMessages.c:460
+msgid "Password: "
+msgstr "密ç ï¼š"
+
+#: LYMessages.c:461
+msgid "lynx: Username and Password required!!!"
+msgstr "lynx:è¦æ±‚用户å和密ç ï¼ï¼ï¼"
+
+#: LYMessages.c:462
+msgid "lynx: Password required!!!"
+msgstr "lynx:è¦æ±‚密ç ï¼ï¼ï¼"
+
+#: LYMessages.c:463
+msgid "Clear all authorization info for this session?"
+msgstr "è¦æ¸…除该对è¯ä¸­çš„所有验è¯ä¿¡æ¯å—?"
+
+#: LYMessages.c:464
+msgid "Authorization info cleared."
+msgstr "验è¯ä¿¡æ¯å·²è¢«æ¸…除。"
+
+#: LYMessages.c:465
+msgid "Authorization failed. Retry?"
+msgstr "验è¯å¤±è´¥ï¼Œå†è¯•ä¸€æ¬¡ï¼Ÿ"
+
+#: LYMessages.c:466
+msgid "cgi support has been disabled."
+msgstr "å·²ç¦ç”¨ cgi 功能。"
+
+#. #define CGI_NOT_COMPILED
+#: LYMessages.c:468
+msgid "Lynxcgi capabilities are not compiled into this version."
+msgstr "此版本在编译时没有加入 Lynxcgi 功能。"
+
+#: LYMessages.c:469
+#, c-format
+msgid "Sorry, no known way of converting %s to %s."
+msgstr "抱歉,没办法将 %s 转æ¢ä¸º %s 。"
+
+#: LYMessages.c:470
+msgid "Unable to set up connection."
+msgstr "无法建立转æ¢"
+
+#: LYMessages.c:471
+msgid "Unable to make connection"
+msgstr "无法完æˆè½¬æ¢"
+
+#. #define MALFORMED_EXEC_REQUEST
+#: LYMessages.c:473
+msgid "Executable link rejected due to malformed request."
+msgstr ""
+
+#. #define BADCHAR_IN_EXEC_LINK
+#: LYMessages.c:475
+#, c-format
+msgid "Executable link rejected due to `%c' character."
+msgstr ""
+
+#. #define RELPATH_IN_EXEC_LINK
+#: LYMessages.c:477
+msgid "Executable link rejected due to relative path string ('../')."
+msgstr ""
+
+#. #define BADLOCPATH_IN_EXEC_LINK
+#: LYMessages.c:479
+msgid "Executable link rejected due to location or path."
+msgstr ""
+
+#: LYMessages.c:480
+msgid "Mail access is disabled!"
+msgstr ""
+
+#. #define ACCESS_ONLY_LOCALHOST
+#: LYMessages.c:482
+msgid "Only files and servers on the local host can be accessed."
+msgstr ""
+
+#: LYMessages.c:483
+msgid "Telnet access is disabled!"
+msgstr ""
+
+#. #define TELNET_PORT_SPECS_DISABLED
+#: LYMessages.c:485
+msgid "Telnet port specifications are disabled."
+msgstr ""
+
+#: LYMessages.c:486
+msgid "USENET news access is disabled!"
+msgstr ""
+
+#: LYMessages.c:487
+msgid "Rlogin access is disabled!"
+msgstr ""
+
+#: LYMessages.c:488
+msgid "Ftp access is disabled!"
+msgstr ""
+
+#: LYMessages.c:489
+msgid "There are no references from this document."
+msgstr ""
+
+#: LYMessages.c:490
+msgid "There are only hidden links from this document."
+msgstr ""
+
+#: LYMessages.c:492
+msgid "Unable to open command file."
+msgstr ""
+
+#: LYMessages.c:494
+msgid "News Post Cancelled!!!"
+msgstr ""
+
+#. #define SPAWNING_EDITOR_FOR_NEWS
+#: LYMessages.c:496
+msgid "Spawning your selected editor to edit news message"
+msgstr ""
+
+#: LYMessages.c:497
+msgid "Post this message?"
+msgstr ""
+
+#: LYMessages.c:498
+#, c-format
+msgid "Append '%s'?"
+msgstr ""
+
+#: LYMessages.c:499
+msgid "Posting to newsgroup(s)..."
+msgstr ""
+
+#: LYMessages.c:501
+msgid "*** You have unread mail. ***"
+msgstr ""
+
+#: LYMessages.c:503
+msgid "*** You have mail. ***"
+msgstr ""
+
+#: LYMessages.c:505
+msgid "*** You have new mail. ***"
+msgstr ""
+
+#: LYMessages.c:506
+msgid "File insert cancelled!!!"
+msgstr ""
+
+#: LYMessages.c:507
+msgid "Not enough memory for file!"
+msgstr ""
+
+#: LYMessages.c:508
+msgid "Can't open file for reading."
+msgstr ""
+
+#: LYMessages.c:509
+msgid "File does not exist."
+msgstr ""
+
+#: LYMessages.c:510
+msgid "File does not exist - reenter or cancel:"
+msgstr ""
+
+#: LYMessages.c:511
+msgid "File is not readable."
+msgstr ""
+
+#: LYMessages.c:512
+msgid "File is not readable - reenter or cancel:"
+msgstr ""
+
+#: LYMessages.c:513
+msgid "Nothing to insert - file is 0-length."
+msgstr ""
+
+#: LYMessages.c:514
+msgid "Save request cancelled!!!"
+msgstr ""
+
+#: LYMessages.c:515
+msgid "Mail request cancelled!!!"
+msgstr ""
+
+#. #define CONFIRM_MAIL_SOURCE_PREPARSED
+#: LYMessages.c:517
+msgid "Viewing preparsed source. Are you sure you want to mail it?"
+msgstr ""
+
+#: LYMessages.c:518
+msgid "Please wait..."
+msgstr ""
+
+#: LYMessages.c:519
+msgid "Mailing file. Please wait..."
+msgstr ""
+
+#: LYMessages.c:520
+msgid "ERROR - Unable to mail file"
+msgstr ""
+
+#. #define CONFIRM_LONG_SCREEN_PRINT
+#: LYMessages.c:522
+#, c-format
+msgid "File is %d screens long. Are you sure you want to print?"
+msgstr ""
+
+#: LYMessages.c:523
+msgid "Print request cancelled!!!"
+msgstr ""
+
+#: LYMessages.c:524
+msgid "Press <return> to begin: "
+msgstr ""
+
+#: LYMessages.c:525
+msgid "Press <return> to finish: "
+msgstr ""
+
+#. #define CONFIRM_LONG_PAGE_PRINT
+#: LYMessages.c:527
+#, c-format
+msgid "File is %d pages long. Are you sure you want to print?"
+msgstr ""
+
+#. #define CHECK_PRINTER
+#: LYMessages.c:529
+msgid "Be sure your printer is on-line. Press <return> to start printing:"
+msgstr ""
+
+#: LYMessages.c:530
+msgid "ERROR - Unable to allocate file space!!!"
+msgstr ""
+
+#: LYMessages.c:531
+msgid "Unable to open tempfile"
+msgstr ""
+
+#: LYMessages.c:532
+msgid "Unable to open print options file"
+msgstr ""
+
+#: LYMessages.c:533
+msgid "Printing file. Please wait..."
+msgstr ""
+
+#: LYMessages.c:534
+msgid "Please enter a valid internet mail address: "
+msgstr ""
+
+#: LYMessages.c:535
+msgid "ERROR! - printer is misconfigured!"
+msgstr ""
+
+#: LYMessages.c:536
+msgid "Image map from POST response not available!"
+msgstr ""
+
+#: LYMessages.c:537
+msgid "Misdirected client-side image MAP request!"
+msgstr ""
+
+#: LYMessages.c:538
+msgid "Client-side image MAP is not accessible!"
+msgstr ""
+
+#: LYMessages.c:539
+msgid "No client-side image MAPs are available!"
+msgstr ""
+
+#: LYMessages.c:540
+msgid "Client-side image MAP is not available!"
+msgstr ""
+
+#. #define OPTION_SCREEN_NEEDS_24
+#: LYMessages.c:543
+msgid "Screen height must be at least 24 lines for the Options menu!"
+msgstr ""
+
+#. #define OPTION_SCREEN_NEEDS_23
+#: LYMessages.c:545
+msgid "Screen height must be at least 23 lines for the Options menu!"
+msgstr ""
+
+#. #define OPTION_SCREEN_NEEDS_22
+#: LYMessages.c:547
+msgid "Screen height must be at least 22 lines for the Options menu!"
+msgstr ""
+
+#: LYMessages.c:549
+msgid "That key requires Advanced User mode."
+msgstr ""
+
+#: LYMessages.c:550
+#, c-format
+msgid "Content-type: %s"
+msgstr ""
+
+#: LYMessages.c:551
+msgid "Command: "
+msgstr ""
+
+#: LYMessages.c:552
+msgid "Unknown or ambiguous command"
+msgstr ""
+
+#: LYMessages.c:553
+msgid " Version "
+msgstr ""
+
+#: LYMessages.c:554
+msgid " first"
+msgstr ""
+
+#: LYMessages.c:555
+msgid ", guessing..."
+msgstr ""
+
+#: LYMessages.c:556
+msgid "Permissions for "
+msgstr ""
+
+#: LYMessages.c:557
+msgid "Select "
+msgstr ""
+
+#: LYMessages.c:558
+msgid "capital letter"
+msgstr ""
+
+#: LYMessages.c:559
+msgid " of option line,"
+msgstr ""
+
+#: LYMessages.c:560
+msgid " to save,"
+msgstr ""
+
+#: LYMessages.c:561
+msgid " to "
+msgstr ""
+
+#: LYMessages.c:562
+msgid " or "
+msgstr ""
+
+#: LYMessages.c:563
+msgid " index"
+msgstr ""
+
+#: LYMessages.c:564
+msgid " to return to Lynx."
+msgstr ""
+
+#: LYMessages.c:565
+msgid "Accept Changes"
+msgstr ""
+
+#: LYMessages.c:566
+msgid "Reset Changes"
+msgstr ""
+
+#: LYMessages.c:567
+msgid "Left Arrow cancels changes"
+msgstr ""
+
+#: LYMessages.c:568
+msgid "Save options to disk"
+msgstr ""
+
+#: LYMessages.c:569
+msgid "Hit RETURN to accept entered data."
+msgstr ""
+
+#. #define ACCEPT_DATA_OR_DEFAULT
+#: LYMessages.c:571
+msgid "Hit RETURN to accept entered data. Delete data to invoke the default."
+msgstr ""
+
+#: LYMessages.c:572
+msgid "Value accepted!"
+msgstr ""
+
+#. #define VALUE_ACCEPTED_WARNING_X
+#: LYMessages.c:574
+msgid "Value accepted! -- WARNING: Lynx is configured for XWINDOWS!"
+msgstr ""
+
+#. #define VALUE_ACCEPTED_WARNING_NONX
+#: LYMessages.c:576
+msgid "Value accepted! -- WARNING: Lynx is NOT configured for XWINDOWS!"
+msgstr ""
+
+#: LYMessages.c:577
+msgid "You are not allowed to change which editor to use!"
+msgstr ""
+
+#: LYMessages.c:578
+msgid "Failed to set DISPLAY variable!"
+msgstr ""
+
+#: LYMessages.c:579
+msgid "Failed to clear DISPLAY variable!"
+msgstr ""
+
+#. #define BOOKMARK_CHANGE_DISALLOWED
+#: LYMessages.c:581
+msgid "You are not allowed to change the bookmark file!"
+msgstr ""
+
+#: LYMessages.c:582
+msgid "Terminal does not support color"
+msgstr ""
+
+#: LYMessages.c:583
+#, c-format
+msgid "Your '%s' terminal does not support color."
+msgstr ""
+
+#: LYMessages.c:584
+msgid "Access to dot files is disabled!"
+msgstr ""
+
+#. #define UA_NO_LYNX_WARNING
+#: LYMessages.c:586
+msgid "User-Agent string does not contain \"Lynx\" or \"L_y_n_x\""
+msgstr ""
+
+#. #define UA_PLEASE_USE_LYNX
+#: LYMessages.c:588
+msgid "Use \"L_y_n_x\" or \"Lynx\" in User-Agent, or it looks like intentional deception!"
+msgstr ""
+
+#. #define UA_CHANGE_DISABLED
+#: LYMessages.c:590
+msgid "Changing of the User-Agent string is disabled!"
+msgstr ""
+
+#. #define CHANGE_OF_SETTING_DISALLOWED
+#: LYMessages.c:592
+msgid "You are not allowed to change this setting."
+msgstr ""
+
+#: LYMessages.c:593
+msgid "Saving Options..."
+msgstr ""
+
+#: LYMessages.c:594
+msgid "Options saved!"
+msgstr ""
+
+#: LYMessages.c:595
+msgid "Unable to save Options!"
+msgstr ""
+
+#: LYMessages.c:596
+msgid " 'r' to return to Lynx "
+msgstr ""
+
+#: LYMessages.c:597
+msgid " '>' to save, or 'r' to return to Lynx "
+msgstr ""
+
+#. #define ANY_KEY_CHANGE_RET_ACCEPT
+#: LYMessages.c:599
+msgid "Hit any key to change value; RETURN to accept."
+msgstr ""
+
+#: LYMessages.c:600
+msgid "Error uncompressing temporary file!"
+msgstr ""
+
+#: LYMessages.c:601
+msgid "Unsupported URL scheme!"
+msgstr ""
+
+#: LYMessages.c:602
+msgid "Unsupported data: URL! Use SHOWINFO, for now."
+msgstr ""
+
+#: LYMessages.c:603
+msgid "Redirection limit of 10 URL's reached."
+msgstr ""
+
+#: LYMessages.c:604
+msgid "Illegal redirection URL received from server!"
+msgstr ""
+
+#. #define SERVER_ASKED_FOR_REDIRECTION
+#: LYMessages.c:606
+#, c-format
+msgid "Server asked for %d redirection of POST content to"
+msgstr ""
+
+#: LYMessages.c:609
+msgid "P)roceed, use G)ET or C)ancel "
+msgstr ""
+
+#: LYMessages.c:610
+msgid "P)roceed, or C)ancel "
+msgstr ""
+
+#. #define ADVANCED_POST_GET_REDIRECT
+#: LYMessages.c:612
+msgid "Redirection of POST content. P)roceed, see U)RL, use G)ET or C)ancel"
+msgstr ""
+
+#. #define ADVANCED_POST_REDIRECT
+#: LYMessages.c:614
+msgid "Redirection of POST content. P)roceed, see U)RL, or C)ancel"
+msgstr ""
+
+#. #define CONFIRM_POST_RESUBMISSION
+#: LYMessages.c:616
+msgid "Document from Form with POST content. Resubmit?"
+msgstr ""
+
+#. #define CONFIRM_POST_RESUBMISSION_TO
+#: LYMessages.c:618
+#, c-format
+msgid "Resubmit POST content to %s ?"
+msgstr ""
+
+#. #define CONFIRM_POST_LIST_RELOAD
+#: LYMessages.c:620
+#, c-format
+msgid "List from document with POST data. Reload %s ?"
+msgstr ""
+
+#. #define CONFIRM_POST_DOC_HEAD
+#: LYMessages.c:622
+msgid "Document from POST action, HEAD may not be understood. Proceed?"
+msgstr ""
+
+#. #define CONFIRM_POST_LINK_HEAD
+#: LYMessages.c:624
+msgid "Form submit action is POST, HEAD may not be understood. Proceed?"
+msgstr ""
+
+#: LYMessages.c:625
+msgid "Proceed without a username and password?"
+msgstr ""
+
+#: LYMessages.c:626
+#, c-format
+msgid "Proceed (%s)?"
+msgstr ""
+
+#: LYMessages.c:627
+msgid "Cannot POST to this host."
+msgstr ""
+
+#: LYMessages.c:628
+msgid "POST not supported for this URL - ignoring POST data!"
+msgstr ""
+
+#: LYMessages.c:629
+msgid "Discarding POST data..."
+msgstr ""
+
+#: LYMessages.c:630
+msgid "Document will not be reloaded!"
+msgstr ""
+
+#: LYMessages.c:631
+msgid "Location: "
+msgstr ""
+
+#: LYMessages.c:632
+#, c-format
+msgid "'%s' not found!"
+msgstr ""
+
+#: LYMessages.c:633
+msgid "Default Bookmark File"
+msgstr ""
+
+#: LYMessages.c:634
+msgid "Screen too small! (8x35 min)"
+msgstr ""
+
+#: LYMessages.c:635
+msgid "Select destination or ^G to Cancel: "
+msgstr ""
+
+#. #define MULTIBOOKMARKS_SELECT
+#: LYMessages.c:637
+msgid "Select subbookmark, '=' for menu, or ^G to cancel: "
+msgstr ""
+
+#. #define MULTIBOOKMARKS_SELF
+#: LYMessages.c:639
+msgid "Reproduce L)ink in this bookmark file or C)ancel? (l,c): "
+msgstr ""
+
+#: LYMessages.c:640
+msgid "Multiple bookmark support is not available."
+msgstr ""
+
+#: LYMessages.c:641
+#, c-format
+msgid " Select Bookmark (screen %d of %d)"
+msgstr ""
+
+#: LYMessages.c:642
+msgid " Select Bookmark"
+msgstr ""
+
+#. #define MULTIBOOKMARKS_EHEAD_MASK
+#: LYMessages.c:644
+#, c-format
+msgid "Editing Bookmark DESCRIPTION and FILEPATH (%d of 2)"
+msgstr ""
+
+#. #define MULTIBOOKMARKS_EHEAD
+#: LYMessages.c:646
+msgid " Editing Bookmark DESCRIPTION and FILEPATH"
+msgstr ""
+
+#: LYMessages.c:647
+msgid "Letter: "
+msgstr ""
+
+#. #define USE_PATH_OFF_HOME
+#: LYMessages.c:650
+msgid "Use a filepath off your login directory in SHELL syntax!"
+msgstr ""
+
+#: LYMessages.c:652
+msgid "Use a filepath off your home directory!"
+msgstr ""
+
+#. #define MAXLINKS_REACHED
+#: LYMessages.c:655
+msgid "Maximum links per page exceeded! Use half-page or two-line scrolling."
+msgstr ""
+
+#. #define MAXHIST_REACHED
+#: LYMessages.c:657
+msgid "History List maximum reached! Document not pushed."
+msgstr ""
+
+#: LYMessages.c:658
+msgid "No previously visited links available!"
+msgstr ""
+
+#: LYMessages.c:659
+msgid "Memory exhausted! Program aborted!"
+msgstr ""
+
+#: LYMessages.c:660
+msgid "Memory exhausted! Aborting..."
+msgstr ""
+
+#: LYMessages.c:661
+msgid "Not enough memory!"
+msgstr ""
+
+#: LYMessages.c:662
+msgid "Directory/File Manager not available"
+msgstr ""
+
+#: LYMessages.c:663
+msgid "HREF in BASE tag is not an absolute URL."
+msgstr ""
+
+#: LYMessages.c:664
+msgid "Location URL is not absolute."
+msgstr ""
+
+#: LYMessages.c:665
+msgid "Refresh URL is not absolute."
+msgstr ""
+
+#. #define SENDING_MESSAGE_WITH_BODY_TO
+#: LYMessages.c:667
+msgid ""
+"You are sending a message with body to:\n"
+" "
+msgstr ""
+
+#: LYMessages.c:668
+msgid ""
+"You are sending a comment to:\n"
+" "
+msgstr ""
+
+#: LYMessages.c:669
+msgid ""
+"\n"
+" With copy to:\n"
+" "
+msgstr ""
+
+#: LYMessages.c:670
+msgid ""
+"\n"
+" With copies to:\n"
+" "
+msgstr ""
+
+#. #define CTRL_G_TO_CANCEL_SEND
+#: LYMessages.c:672
+msgid ""
+"\n"
+"\n"
+"Use Ctrl-G to cancel if you do not want to send a message\n"
+msgstr ""
+
+#. #define ENTER_NAME_OR_BLANK
+#: LYMessages.c:674
+msgid ""
+"\n"
+" Please enter your name, or leave it blank to remain anonymous\n"
+msgstr ""
+
+#. #define ENTER_MAIL_ADDRESS_OR_OTHER
+#: LYMessages.c:676
+msgid ""
+"\n"
+" Please enter a mail address or some other\n"
+msgstr ""
+
+#. #define MEANS_TO_CONTACT_FOR_RESPONSE
+#: LYMessages.c:678
+msgid " means to contact you, if you desire a response.\n"
+msgstr ""
+
+#: LYMessages.c:679
+msgid ""
+"\n"
+" Please enter a subject line.\n"
+msgstr ""
+
+#. #define ENTER_ADDRESS_FOR_CC
+#: LYMessages.c:681
+msgid ""
+"\n"
+" Enter a mail address for a CC of your message.\n"
+msgstr ""
+
+#: LYMessages.c:682
+msgid " (Leave blank if you don't want a copy.)\n"
+msgstr ""
+
+#: LYMessages.c:683
+msgid ""
+"\n"
+" Please review the message body:\n"
+"\n"
+msgstr ""
+
+#: LYMessages.c:684
+msgid ""
+"\n"
+"Press RETURN to continue: "
+msgstr ""
+
+#: LYMessages.c:685
+msgid ""
+"\n"
+"Press RETURN to clean up: "
+msgstr ""
+
+#: LYMessages.c:686
+msgid " Use Control-U to erase the default.\n"
+msgstr ""
+
+#: LYMessages.c:687
+msgid ""
+"\n"
+" Please enter your message below."
+msgstr ""
+
+#. #define ENTER_PERIOD_WHEN_DONE_A
+#: LYMessages.c:689 src/LYNews.c:361
+msgid ""
+"\n"
+" When you are done, press enter and put a single period (.)"
+msgstr ""
+
+#. #define ENTER_PERIOD_WHEN_DONE_B
+#: LYMessages.c:691 src/LYNews.c:362
+msgid ""
+"\n"
+" on a line and press enter again."
+msgstr ""
+
+#. Cookies messages
+#. #define ADVANCED_COOKIE_CONFIRMATION
+#: LYMessages.c:695
+#, c-format
+msgid "%s cookie: %.*s=%.*s Allow? (Y/N/Always/neVer)"
+msgstr ""
+
+#. #define INVALID_COOKIE_DOMAIN_CONFIRMATION
+#: LYMessages.c:697
+#, c-format
+msgid "Accept invalid cookie domain=%s for '%s'?"
+msgstr ""
+
+#. #define INVALID_COOKIE_PATH_CONFIRMATION
+#: LYMessages.c:699
+#, c-format
+msgid "Accept invalid cookie path=%s as a prefix of '%s'?"
+msgstr ""
+
+#: LYMessages.c:700
+msgid "Allowing this cookie."
+msgstr ""
+
+#: LYMessages.c:701
+msgid "Rejecting this cookie."
+msgstr ""
+
+#: LYMessages.c:702
+msgid "The Cookie Jar is empty."
+msgstr ""
+
+#. #define ACTIVATE_TO_GOBBLE
+#: LYMessages.c:704
+msgid "Activate links to gobble up cookies or entire domains,"
+msgstr ""
+
+#: LYMessages.c:705
+msgid "or to change a domain's 'allow' setting."
+msgstr ""
+
+#: LYMessages.c:706
+msgid "(Cookies never allowed.)"
+msgstr ""
+
+#: LYMessages.c:707
+msgid "(Cookies always allowed.)"
+msgstr ""
+
+#: LYMessages.c:708
+msgid "(Cookies allowed via prompt.)"
+msgstr ""
+
+#: LYMessages.c:709
+msgid "(Persistent Cookies.)"
+msgstr ""
+
+#: LYMessages.c:710
+msgid "(No title.)"
+msgstr ""
+
+#: LYMessages.c:711
+msgid "(No name.)"
+msgstr ""
+
+#: LYMessages.c:712
+msgid "(No value.)"
+msgstr ""
+
+#: LYMessages.c:713
+msgid "None"
+msgstr ""
+
+#: LYMessages.c:714
+msgid "(End of session.)"
+msgstr ""
+
+#: LYMessages.c:715
+msgid "Delete this cookie?"
+msgstr ""
+
+#: LYMessages.c:716
+msgid "The cookie has been eaten!"
+msgstr ""
+
+#: LYMessages.c:717
+msgid "Delete this empty domain?"
+msgstr ""
+
+#: LYMessages.c:718
+msgid "The domain has been eaten!"
+msgstr ""
+
+#. #define DELETE_COOKIES_SET_ALLOW_OR_CANCEL
+#: LYMessages.c:720
+msgid "D)elete domain's cookies, set allow A)lways/P)rompt/neV)er, or C)ancel? "
+msgstr ""
+
+#. #define DELETE_DOMAIN_SET_ALLOW_OR_CANCEL
+#: LYMessages.c:722
+msgid "D)elete domain, set allow A)lways/P)rompt/neV)er, or C)ancel? "
+msgstr ""
+
+#: LYMessages.c:723
+msgid "All cookies in the domain have been eaten!"
+msgstr ""
+
+#: LYMessages.c:724
+#, c-format
+msgid "'A'lways allowing from domain '%s'."
+msgstr ""
+
+#: LYMessages.c:725
+#, c-format
+msgid "ne'V'er allowing from domain '%s'."
+msgstr ""
+
+#: LYMessages.c:726
+#, c-format
+msgid "'P'rompting to allow from domain '%s'."
+msgstr ""
+
+#: LYMessages.c:727
+msgid "Delete all cookies in this domain?"
+msgstr ""
+
+#: LYMessages.c:728
+msgid "All of the cookies in the jar have been eaten!"
+msgstr ""
+
+#: LYMessages.c:730
+msgid "Port 19 not permitted in URLs."
+msgstr ""
+
+#: LYMessages.c:731
+msgid "Port 25 not permitted in URLs."
+msgstr ""
+
+#: LYMessages.c:732
+#, c-format
+msgid "Port %lu not permitted in URLs."
+msgstr ""
+
+#: LYMessages.c:733
+msgid "URL has a bad port field."
+msgstr ""
+
+#: LYMessages.c:734
+msgid "Maximum nesting of HTML elements exceeded."
+msgstr ""
+
+#: LYMessages.c:735
+msgid "Bad partial reference! Stripping lead dots."
+msgstr ""
+
+#: LYMessages.c:736
+msgid "Trace Log open failed. Trace off!"
+msgstr ""
+
+#: LYMessages.c:737
+msgid "Lynx Trace Log"
+msgstr ""
+
+#: LYMessages.c:738
+msgid "No trace log has been started for this session."
+msgstr ""
+
+#. #define MAX_TEMPCOUNT_REACHED
+#: LYMessages.c:740
+msgid "The maximum temporary file count has been reached!"
+msgstr ""
+
+#. #define FORM_VALUE_TOO_LONG
+#: LYMessages.c:742
+msgid "Form field value exceeds buffer length! Trim the tail."
+msgstr ""
+
+#. #define FORM_TAIL_COMBINED_WITH_HEAD
+#: LYMessages.c:744
+msgid "Modified tail combined with head of form field value."
+msgstr ""
+
+#. HTFile.c
+#: LYMessages.c:747
+msgid "Directory"
+msgstr ""
+
+#: LYMessages.c:748
+msgid "Directory browsing is not allowed."
+msgstr ""
+
+#: LYMessages.c:749
+msgid "Selective access is not enabled for this directory"
+msgstr ""
+
+#: LYMessages.c:750
+msgid "Multiformat: directory scan failed."
+msgstr ""
+
+#: LYMessages.c:751
+msgid "This directory is not readable."
+msgstr ""
+
+#: LYMessages.c:752
+msgid "Can't access requested file."
+msgstr ""
+
+#: LYMessages.c:753
+msgid "Could not find suitable representation for transmission."
+msgstr ""
+
+#: LYMessages.c:754
+msgid "Could not open file for decompression!"
+msgstr ""
+
+#: LYMessages.c:755
+msgid "Files:"
+msgstr ""
+
+#: LYMessages.c:756
+msgid "Subdirectories:"
+msgstr ""
+
+#: LYMessages.c:757
+msgid " directory"
+msgstr ""
+
+#: LYMessages.c:758
+msgid "Up to "
+msgstr ""
+
+#: LYMessages.c:759
+msgid "Current directory is "
+msgstr ""
+
+#. HTGopher.c
+#: LYMessages.c:762
+msgid "No response from server!"
+msgstr ""
+
+#: LYMessages.c:763
+msgid "CSO index"
+msgstr ""
+
+#: LYMessages.c:764
+msgid ""
+"\n"
+"This is a searchable index of a CSO database.\n"
+msgstr ""
+
+#: LYMessages.c:765
+msgid "CSO Search Results"
+msgstr ""
+
+#: LYMessages.c:766
+#, c-format
+msgid "Seek fail on %s\n"
+msgstr ""
+
+#: LYMessages.c:767
+msgid ""
+"\n"
+"Press the 's' key and enter search keywords.\n"
+msgstr ""
+
+#: LYMessages.c:768
+msgid ""
+"\n"
+"This is a searchable Gopher index.\n"
+msgstr ""
+
+#: LYMessages.c:769
+msgid "Gopher index"
+msgstr ""
+
+#: LYMessages.c:770
+msgid "Gopher Menu"
+msgstr ""
+
+#: LYMessages.c:771
+msgid " Search Results"
+msgstr ""
+
+#: LYMessages.c:772
+msgid "Sending CSO/PH request."
+msgstr ""
+
+#: LYMessages.c:773
+msgid "Sending Gopher request."
+msgstr ""
+
+#: LYMessages.c:774
+msgid "CSO/PH request sent; waiting for response."
+msgstr ""
+
+#: LYMessages.c:775
+msgid "Gopher request sent; waiting for response."
+msgstr ""
+
+#: LYMessages.c:776
+msgid ""
+"\n"
+"Please enter search keywords.\n"
+msgstr ""
+
+#: LYMessages.c:777
+msgid ""
+"\n"
+"The keywords that you enter will allow you to search on a"
+msgstr ""
+
+#: LYMessages.c:778
+msgid " person's name in the database.\n"
+msgstr ""
+
+#. HTNews.c
+#: LYMessages.c:781
+msgid "Connection closed ???"
+msgstr ""
+
+#: LYMessages.c:782
+msgid "Cannot open temporary file for news POST."
+msgstr ""
+
+#: LYMessages.c:783
+msgid "This client does not contain support for posting to news with SSL."
+msgstr ""
+
+#. HTStyle.c
+#: LYMessages.c:786
+#, c-format
+msgid "Style %d `%s' SGML:%s. Font %s %.1f point.\n"
+msgstr ""
+
+#: LYMessages.c:787
+#, c-format
+msgid "\tIndents: first=%.0f others=%.0f, Height=%.1f Desc=%.1f\n"
+msgstr ""
+
+#: LYMessages.c:788
+#, c-format
+msgid "\tAlign=%d, %d tabs. (%.0f before, %.0f after)\n"
+msgstr ""
+
+#: LYMessages.c:789
+#, c-format
+msgid "\t\tTab kind=%d at %.0f\n"
+msgstr ""
+
+#. HTTP.c
+#: LYMessages.c:792
+msgid "Can't proceed without a username and password."
+msgstr ""
+
+#: LYMessages.c:793
+msgid "Can't retry with authorization! Contact the server's WebMaster."
+msgstr ""
+
+#: LYMessages.c:794
+msgid "Can't retry with proxy authorization! Contact the server's WebMaster."
+msgstr ""
+
+#: LYMessages.c:795
+msgid "Retrying with proxy authorization information."
+msgstr ""
+
+#. HTWAIS.c
+#: LYMessages.c:798
+msgid "HTWAIS: Return message too large."
+msgstr ""
+
+#: LYMessages.c:799
+msgid "Enter WAIS query: "
+msgstr ""
+
+#. Miscellaneous status
+#: LYMessages.c:802
+msgid "Retrying as HTTP0 request."
+msgstr ""
+
+#: LYMessages.c:803
+#, c-format
+msgid "Transferred %d bytes"
+msgstr ""
+
+#: LYMessages.c:804
+msgid "Data transfer complete"
+msgstr ""
+
+#: LYMessages.c:805
+#, c-format
+msgid "Error processing line %d of %s\n"
+msgstr ""
+
+#. Lynx internal page titles
+#: LYMessages.c:808
+msgid "Address List Page"
+msgstr ""
+
+#: LYMessages.c:809
+msgid "Bookmark file"
+msgstr ""
+
+#: LYMessages.c:810
+msgid "Configuration Definitions"
+msgstr ""
+
+#: LYMessages.c:811
+msgid "Cookie Jar"
+msgstr ""
+
+#: LYMessages.c:812
+msgid "Current Key Map"
+msgstr ""
+
+#: LYMessages.c:813
+msgid "File Management Options"
+msgstr ""
+
+#: LYMessages.c:814
+msgid "Download Options"
+msgstr ""
+
+#: LYMessages.c:815
+msgid "History Page"
+msgstr ""
+
+#: LYMessages.c:816
+msgid "List Page"
+msgstr ""
+
+#: LYMessages.c:817
+msgid "Lynx.cfg Information"
+msgstr ""
+
+#: LYMessages.c:818
+msgid "Converted Mosaic Hotlist"
+msgstr ""
+
+#: LYMessages.c:819
+msgid "Options Menu"
+msgstr ""
+
+#: LYMessages.c:820
+msgid "File Permission Options"
+msgstr ""
+
+#: LYMessages.c:821
+msgid "Printing Options"
+msgstr ""
+
+#: LYMessages.c:822
+msgid "Information about the current document"
+msgstr ""
+
+#: LYMessages.c:823
+msgid "Your recent statusline messages"
+msgstr ""
+
+#: LYMessages.c:824
+msgid "Upload Options"
+msgstr ""
+
+#: LYMessages.c:825
+msgid "Visited Links Page"
+msgstr ""
+
+#. CONFIG_DEF_TITLE subtitles
+#: LYMessages.c:828
+msgid "See also"
+msgstr ""
+
+#: LYMessages.c:829
+msgid "your"
+msgstr ""
+
+#: LYMessages.c:830
+msgid "for runtime options"
+msgstr ""
+
+#: LYMessages.c:831
+msgid "compile time options"
+msgstr ""
+
+#: LYMessages.c:832
+msgid "latest release"
+msgstr ""
+
+#: LYMessages.c:833
+msgid "pre-release version"
+msgstr ""
+
+#: LYMessages.c:834
+msgid "development version"
+msgstr ""
+
+#. #define AUTOCONF_CONFIG_CACHE
+#: LYMessages.c:836
+msgid ""
+"The following data were derived during the automatic configuration/build\n"
+"process of this copy of Lynx. When reporting a bug, please include a copy\n"
+"of this page."
+msgstr ""
+
+#. #define AUTOCONF_LYNXCFG_H
+#: LYMessages.c:840
+msgid ""
+"The following data were used as automatically-configured compile-time\n"
+"definitions when this copy of Lynx was built."
+msgstr ""
+
+#. #define DIRED_NOVICELINE
+#: LYMessages.c:845
+msgid " C)reate D)ownload E)dit F)ull menu M)odify R)emove T)ag U)pload \n"
+msgstr ""
+
+#: LYMessages.c:846
+msgid "Failed to obtain status of current link!"
+msgstr ""
+
+#. #define INVALID_PERMIT_URL
+#: LYMessages.c:849
+msgid "Special URL only valid from current File Permission menu!"
+msgstr ""
+
+#: LYMessages.c:853
+msgid "External support is currently disabled."
+msgstr ""
+
+#. new with 2.8.4dev.21
+#: LYMessages.c:857
+msgid "Changing working-directory is currently disabled."
+msgstr ""
+
+#: LYMessages.c:858
+msgid "Linewrap OFF!"
+msgstr ""
+
+#: LYMessages.c:859
+msgid "Linewrap ON!"
+msgstr ""
+
+#: LYMessages.c:860
+msgid "Parsing nested-tables toggled OFF! Reloading..."
+msgstr ""
+
+#: LYMessages.c:861
+msgid "Parsing nested-tables toggled ON! Reloading..."
+msgstr ""
+
+#: LYMessages.c:862
+msgid "Shifting is disabled while line-wrap is in effect"
+msgstr ""
+
+#: LYMessages.c:863
+msgid "Trace not supported"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAABrow.c:648
+#, c-format
+msgid "Username for '%s' at %s '%s%s':"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAABrow.c:914
+msgid "This client doesn't know how to compose proxy authorization information for scheme"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAABrow.c:989
+msgid "This client doesn't know how to compose authorization information for scheme"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAABrow.c:1097
+#, c-format
+msgid "Invalid header '%s%s%s%s%s'"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAABrow.c:1201
+msgid "Proxy authorization required -- retrying"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAABrow.c:1260
+msgid "Access without authorization denied -- retrying"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAccess.c:677
+msgid "Access forbidden by rule"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAccess.c:779
+msgid "Document with POST content not found in cache. Resubmit?"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAccess.c:1020 src/GridText.c:8159
+msgid "Loading incomplete."
+msgstr ""
+
+#: WWW/Library/Implementation/HTAccess.c:1050
+msgid "**** HTAccess: socket or file number returned by obsolete load routine!\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAccess.c:1052
+msgid "**** HTAccess: Internal software error. Please mail lynx-dev@sig.net!\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAccess.c:1053
+#, c-format
+msgid "**** HTAccess: Status returned was: %d\n"
+msgstr ""
+
+#.
+#. * hack: if we fail in HTAccess.c
+#. * avoid duplicating URL, oh.
+#.
+#: WWW/Library/Implementation/HTAccess.c:1059 src/LYMainLoop.c:7726
+msgid "Can't Access"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAccess.c:1067
+msgid "Unable to access document."
+msgstr ""
+
+#: WWW/Library/Implementation/HTFTP.c:753
+#, c-format
+msgid "Enter password for user %s@%s:"
+msgstr ""
+
+#: WWW/Library/Implementation/HTFTP.c:781
+msgid "Unable to connect to FTP host."
+msgstr ""
+
+#: WWW/Library/Implementation/HTFTP.c:1051
+msgid "close master socket"
+msgstr ""
+
+#: WWW/Library/Implementation/HTFTP.c:1113
+msgid "socket for master socket"
+msgstr ""
+
+#.
+#. ** It's a symbolic link, does the user care about
+#. ** knowing if it is symbolic? I think so since
+#. ** it might be a directory.
+#.
+#: WWW/Library/Implementation/HTFTP.c:1627
+#: WWW/Library/Implementation/HTFTP.c:2248
+msgid "Symbolic Link"
+msgstr ""
+
+#: WWW/Library/Implementation/HTFTP.c:2609
+msgid "Receiving FTP directory."
+msgstr ""
+
+#: WWW/Library/Implementation/HTFTP.c:2751
+#, c-format
+msgid "Transferred %d bytes (%5d)"
+msgstr ""
+
+#: WWW/Library/Implementation/HTFTP.c:3088
+msgid "connect for data"
+msgstr ""
+
+#: WWW/Library/Implementation/HTFTP.c:3688
+msgid "Receiving FTP file."
+msgstr ""
+
+#: WWW/Library/Implementation/HTFinger.c:275
+msgid "Could not set up finger connection."
+msgstr ""
+
+#: WWW/Library/Implementation/HTFinger.c:320
+msgid "Could not load data (no sitename in finger URL)"
+msgstr ""
+
+#: WWW/Library/Implementation/HTFinger.c:328
+msgid "Invalid port number - will only use port 79!"
+msgstr ""
+
+#: WWW/Library/Implementation/HTFinger.c:396
+msgid "Could not access finger host."
+msgstr ""
+
+#: WWW/Library/Implementation/HTFinger.c:407
+msgid "No response from finger server."
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:373
+#, c-format
+msgid "Username for news host '%s':"
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:426
+msgid "Change username?"
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:430
+msgid "Username:"
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:454
+#, c-format
+msgid "Password for news host '%s':"
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:537
+msgid "Change password?"
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:1691
+#, c-format
+msgid "No matches for: %s"
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:1744
+msgid ""
+"\n"
+"No articles in this group.\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:1757
+msgid ""
+"\n"
+"No articles in this range.\n"
+msgstr ""
+
+#.
+#. ** Set window title.
+#.
+#: WWW/Library/Implementation/HTNews.c:1770
+#, c-format
+msgid "%s, Articles %d-%d"
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:1792
+msgid "Earlier articles"
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:1805
+#, c-format
+msgid ""
+"\n"
+"There are about %d articles currently available in %s, IDs as follows:\n"
+"\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:1865
+msgid "All available articles in "
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:2081
+msgid "Later articles"
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:2105
+msgid "Post to "
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:2323
+msgid "This client does not contain support for SNEWS URLs."
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:2531
+msgid "No target for raw text!"
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:2561
+msgid "Connecting to NewsHost ..."
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:2612
+#, c-format
+msgid "Could not access %s."
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:2712
+#, c-format
+msgid "Can't read news info. News host %.20s responded: %.200s"
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:2716
+#, c-format
+msgid "Can't read news info, empty response from host %s"
+msgstr ""
+
+#.
+#. ** List available newsgroups. - FM
+#.
+#: WWW/Library/Implementation/HTNews.c:2920
+msgid "Reading list of available newsgroups."
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:2942
+msgid "Reading list of articles in newsgroup."
+msgstr ""
+
+#.
+#. ** Get an article from a news group. - FM
+#.
+#: WWW/Library/Implementation/HTNews.c:2948
+msgid "Reading news article."
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:2978
+msgid "Sorry, could not load requested news."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:1245
+msgid "Address has invalid port"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:1333
+msgid "Address length looks invalid"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:1571
+#: WWW/Library/Implementation/HTTCP.c:1589
+#, c-format
+msgid "Unable to locate remote host %s."
+msgstr ""
+
+#. Not HTProgress, so warning won't be overwritten
+#. * immediately; but not HTAlert, because typically
+#. * there will be other alerts from the callers. - kw
+#.
+#: WWW/Library/Implementation/HTTCP.c:1586
+#: WWW/Library/Implementation/HTTelnet.c:101
+#, c-format
+msgid "Invalid hostname %s"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:1600
+#, c-format
+msgid "Making %s connection to %s"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:1616
+#, c-format
+msgid "socket failed: family %d addr %s port %s."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:1625
+msgid "socket failed."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:1645
+msgid "Could not make connection non-blocking."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:1714
+msgid "Connection failed (too many retries)."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:1907
+msgid "Could not restore socket to blocking."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:1973
+msgid "Socket read failed for 180,000 tries."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:364
+#, c-format
+msgid "Address contains a username: %s"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:517
+msgid "This client does not contain support for HTTPS URLs."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:542
+msgid "Unable to connect to remote host."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:571
+msgid "Retrying connection without TLS."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:616
+#, c-format
+msgid "SSL error:host(%s)!=cert(%s)-Continue?"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:627
+#, c-format
+msgid "Secure %d-bit %s (%s) HTTP connection"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:1089
+msgid "Sending HTTP request."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:1123
+msgid "Unexpected network write error; connection aborted."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:1129
+msgid "HTTP request sent; waiting for response."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:1193
+msgid "Unexpected network read error; connection aborted."
+msgstr ""
+
+#.
+#. ** HTTP/1.1 Informational statuses.
+#. ** 100 Continue.
+#. ** 101 Switching Protocols.
+#. ** > 101 is unknown.
+#. ** We should never get these, and they have only
+#. ** the status line and possibly other headers,
+#. ** so we'll deal with them by showing the full
+#. ** header to the user as text/plain. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:1389
+msgid "Got unexpected Informational Status."
+msgstr ""
+
+#.
+#. * Reset Content. The server has fulfilled the
+#. * request but nothing is returned and we should
+#. * reset any form content. We'll instruct the
+#. * user to do that, and restore the current
+#. * document. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:1424
+msgid "Request fulfilled. Reset Content."
+msgstr ""
+
+#. Not Modified
+#.
+#. * We didn't send an "If-Modified-Since" header,
+#. * so this status is inappropriate. We'll deal
+#. * with it by showing the full header to the user
+#. * as text/plain. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:1543
+msgid "Got unexpected 304 Not Modified status."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:1610
+msgid "Redirection of POST content requires user approval."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:1625
+msgid "Have POST content. Treating Permanent Redirection as Temporary.\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:1670
+msgid "Retrying with access authorization information."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:1682
+msgid "Show the 401 message body?"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:1727
+msgid "Show the 407 message body?"
+msgstr ""
+
+#.
+#. ** Bad or unknown server_status number.
+#. ** Take a chance and hope there is
+#. ** something to display. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:1832
+msgid "Unknown status reply from server!"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTelnet.c:99
+#, c-format
+msgid "remote %s session:"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:161
+msgid "Could not connect to WAIS server."
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:170
+msgid "Could not open WAIS connection for reading."
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:194
+msgid "Diagnostic code is "
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:463
+msgid "Index "
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:467
+#, c-format
+msgid " contains the following %d item%s relevant to \""
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:475
+msgid "The first figure after each entry is its relative score, "
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:476
+msgid "the second is the number of lines in the item."
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:517
+msgid " (bad file name)"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:542
+msgid "(bad doc id)"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:558
+msgid "(Short Header record, can't display)"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:565
+msgid ""
+"\n"
+"Long Header record, can't display\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:572
+msgid ""
+"\n"
+"Text record\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:581
+msgid ""
+"\n"
+"Headline record, can't display\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:589
+msgid ""
+"\n"
+"Code record, can't display\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:691
+msgid "Syntax error in WAIS URL"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:761
+msgid " (WAIS Index)"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:768
+msgid "WAIS Index: "
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:774
+msgid "This is a link for searching the "
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:778
+msgid " WAIS Index.\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:805
+msgid ""
+"\n"
+"Enter the 's'earch command and then specify search words.\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:827
+msgid " (in "
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:836
+msgid "WAIS Search of \""
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:840
+msgid "\" in: "
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:855
+msgid "HTWAIS: Request too large."
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:864
+msgid "Searching WAIS database..."
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:874
+msgid "Search interrupted."
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:924
+msgid "Can't convert format of WAIS document"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:968
+msgid "HTWAIS: Request too long."
+msgstr ""
+
+#.
+#. ** Actually do the transaction given by request_message.
+#.
+#: WWW/Library/Implementation/HTWAIS.c:982
+msgid "Fetching WAIS document..."
+msgstr ""
+
+#. display_search_response(target, retrieval_response,
+#. wais_database, keywords);
+#: WWW/Library/Implementation/HTWAIS.c:1021
+msgid "No text was returned!\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWSRC.c:287
+msgid " NOT GIVEN in source file; "
+msgstr ""
+
+#: WWW/Library/Implementation/HTWSRC.c:311
+msgid " WAIS source file"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWSRC.c:318
+msgid " description"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWSRC.c:328
+msgid "Access links"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWSRC.c:346
+msgid "Direct access"
+msgstr ""
+
+#. * Proxy will be used if defined, so let user know that - FM *
+#: WWW/Library/Implementation/HTWSRC.c:349
+msgid " (or via proxy server, if defined)"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWSRC.c:364
+msgid "Maintainer"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWSRC.c:372
+msgid "Host"
+msgstr ""
+
+#: src/GridText.c:723
+msgid "Memory exhausted, display interrupted!"
+msgstr ""
+
+#: src/GridText.c:728
+msgid "Memory exhausted, will interrupt transfer!"
+msgstr ""
+
+#: src/GridText.c:3476
+msgid " *** MEMORY EXHAUSTED ***"
+msgstr ""
+
+#: src/GridText.c:5854 src/GridText.c:5861 src/LYList.c:258
+msgid "unknown field or link"
+msgstr ""
+
+#: src/GridText.c:5870
+msgid "text entry field"
+msgstr ""
+
+#: src/GridText.c:5873
+msgid "password entry field"
+msgstr ""
+
+#: src/GridText.c:5876
+msgid "checkbox"
+msgstr ""
+
+#: src/GridText.c:5879
+msgid "radio button"
+msgstr ""
+
+#: src/GridText.c:5882
+msgid "submit button"
+msgstr ""
+
+#: src/GridText.c:5885
+msgid "reset button"
+msgstr ""
+
+#: src/GridText.c:5888
+msgid "popup menu"
+msgstr ""
+
+#: src/GridText.c:5891
+msgid "hidden form field"
+msgstr ""
+
+#: src/GridText.c:5894
+msgid "text entry area"
+msgstr ""
+
+#: src/GridText.c:5897
+msgid "range entry field"
+msgstr ""
+
+#: src/GridText.c:5900
+msgid "file entry field"
+msgstr ""
+
+#: src/GridText.c:5903
+msgid "text-submit field"
+msgstr ""
+
+#: src/GridText.c:5906
+msgid "image-submit button"
+msgstr ""
+
+#: src/GridText.c:5909
+msgid "keygen field"
+msgstr ""
+
+#: src/GridText.c:5912
+msgid "unknown form field"
+msgstr ""
+
+#: src/GridText.c:9890
+msgid "Can't open file for uploading"
+msgstr ""
+
+#: src/GridText.c:9916
+msgid "Short read from file, problem?"
+msgstr ""
+
+#: src/GridText.c:10779
+#, c-format
+msgid "Submitting %s"
+msgstr ""
+
+#. ugliness has happened; inform user and do the best we can
+#: src/GridText.c:11923
+msgid "Hang Detect: TextAnchor struct corrupted - suggest aborting!"
+msgstr ""
+
+#. don't show previous state
+#: src/GridText.c:12129
+msgid "Wrap lines to fit displayed area?"
+msgstr ""
+
+#: src/GridText.c:12181
+msgid "Very long lines have been wrapped!"
+msgstr ""
+
+#: src/GridText.c:12626
+msgid "Very long lines have been truncated!"
+msgstr ""
+
+#: src/HTAlert.c:159 src/LYShowInfo.c:318
+msgid "bytes"
+msgstr ""
+
+#: src/HTAlert.c:160
+msgid "KB"
+msgstr ""
+
+#: src/HTAlert.c:276
+#, c-format
+msgid "Read %s of %s of data"
+msgstr ""
+
+#: src/HTAlert.c:278
+#, c-format
+msgid "Read %s of data"
+msgstr ""
+
+#: src/HTAlert.c:283
+#, c-format
+msgid ", %s/sec"
+msgstr ""
+
+#: src/HTAlert.c:292
+#, c-format
+msgid " (stalled for %s)"
+msgstr ""
+
+#: src/HTAlert.c:296
+#, c-format
+msgid ", ETA %s"
+msgstr ""
+
+#: src/HTAlert.c:303
+msgid " (Press 'z' to abort)"
+msgstr ""
+
+#. Meta-note: don't move the following note from its place right
+#. in front of the first gettext(). As it is now, it should
+#. automatically appear in generated lynx.pot files. - kw
+#.
+#. NOTE TO TRANSLATORS: If you provide a translation for "yes", lynx
+#. * will take the first byte of the translation as a positive response
+#. * to Yes/No questions. If you provide a translation for "no", lynx
+#. * will take the first byte of the translation as a negative response
+#. * to Yes/No questions. For both, lynx will also try to show the
+#. * first byte in the prompt as a character, instead of (y) or (n),
+#. * respectively. This will not work right for multibyte charsets!
+#. * Don't translate "yes" and "no" for CJK character sets (or translate
+#. * them to "yes" and "no"). For a translation using UTF-8, don't
+#. * translate if the translation would begin with anything but a 7-bit
+#. * (US_ASCII) character. That also means do not translate if the
+#. * translation would begin with anything but a 7-bit character, if
+#. * you use a single-byte character encoding (a charset like ISO-8859-n)
+#. * but anticipate that the message catalog may be used re-encoded in
+#. * UTF-8 form.
+#. * For translations using other character sets, you may also wish to
+#. * leave "yes" and "no" untranslated, if using (y) and (n) is the
+#. * preferred behavior.
+#. * Lynx will also accept y Y n N as responses unless there is a conflict
+#. * with the first letter of the "yes" or "no" translation.
+#.
+#: src/HTAlert.c:360
+msgid "yes"
+msgstr ""
+
+#: src/HTAlert.c:361
+msgid "no"
+msgstr ""
+
+#: src/HTML.c:6354
+msgid "Description:"
+msgstr ""
+
+#: src/HTML.c:6359
+msgid "(none)"
+msgstr ""
+
+#: src/HTML.c:6363
+msgid "Filepath:"
+msgstr ""
+
+#: src/HTML.c:6368
+msgid "(unknown)"
+msgstr ""
+
+#: src/HTML.c:7817
+msgid "Document has only hidden links. Use the 'l'ist command."
+msgstr ""
+
+#: src/HTML.c:8320
+msgid "Source cache error - disk full?"
+msgstr ""
+
+#: src/HTML.c:8333
+msgid "Source cache error - not enough memory!"
+msgstr ""
+
+#: src/LYBookmark.c:166
+msgid ""
+" This file is an HTML representation of the X Mosaic hotlist file.\n"
+" Outdated or invalid links may be removed by using the\n"
+" remove bookmark command, it is usually the 'R' key but may have\n"
+" been remapped by you or your system administrator."
+msgstr ""
+
+#: src/LYBookmark.c:375
+msgid ""
+" You can delete links by the 'R' key<br>\n"
+"<ol>\n"
+msgstr ""
+
+#: src/LYBookmark.c:378
+msgid ""
+" You can delete links using the remove bookmark command. It is usually\n"
+" the 'R' key but may have been remapped by you or your system\n"
+" administrator."
+msgstr ""
+
+#: src/LYBookmark.c:382
+msgid ""
+" This file also may be edited with a standard text editor to delete\n"
+" outdated or invalid links, or to change their order."
+msgstr ""
+
+#: src/LYBookmark.c:385
+msgid ""
+"Note: if you edit this file manually\n"
+" you should not change the format within the lines\n"
+" or add other HTML markup.\n"
+" Make sure any bookmark link is saved as a single line."
+msgstr ""
+
+#: src/LYBookmark.c:676
+#, c-format
+msgid "File may be recoverable from %s during this session"
+msgstr ""
+
+#.
+#. * Neither the path as given nor any components examined by
+#. * backing up were stat()able. - kw
+#.
+#: src/LYCgi.c:231
+msgid "Unable to access cgi script"
+msgstr ""
+
+#: src/LYCgi.c:650 src/LYCgi.c:653
+msgid "Good Advice"
+msgstr ""
+
+#: src/LYCgi.c:656
+msgid "An excellent http server for VMS is available via"
+msgstr ""
+
+#: src/LYCgi.c:663
+msgid "this link"
+msgstr ""
+
+#: src/LYCgi.c:667
+msgid "It provides state of the art CGI script support.\n"
+msgstr ""
+
+#: src/LYClean.c:122
+msgid "Exiting via interrupt:"
+msgstr ""
+
+#: src/LYCookie.c:2461
+msgid "(from a previous session)"
+msgstr ""
+
+#: src/LYCookie.c:2521
+msgid "Maximum Gobble Date:"
+msgstr ""
+
+#: src/LYCookie.c:2563
+msgid "Internal"
+msgstr ""
+
+#: src/LYCookie.c:2564
+msgid "cookie_domain_flag_set error, aborting program"
+msgstr ""
+
+#: src/LYCurses.c:973
+msgid "Terminal initialisation failed - unknown terminal type?"
+msgstr ""
+
+#: src/LYCurses.c:1364
+msgid "Terminal ="
+msgstr ""
+
+#: src/LYCurses.c:1368
+msgid "You must use a vt100, 200, etc. terminal with this program."
+msgstr ""
+
+#: src/LYCurses.c:1418
+msgid "Your Terminal type is unknown!"
+msgstr ""
+
+#: src/LYCurses.c:1419
+msgid "Enter a terminal type:"
+msgstr ""
+
+#: src/LYCurses.c:1433
+msgid "TERMINAL TYPE IS SET TO"
+msgstr ""
+
+#: src/LYCurses.c:1932
+#, c-format
+msgid ""
+"\n"
+"A Fatal error has occurred in %s Ver. %s\n"
+msgstr ""
+
+#: src/LYCurses.c:1934
+msgid ""
+"\n"
+"Please notify your system administrator to confirm a bug, and if\n"
+"confirmed, to notify the lynx-dev list. Bug reports should have concise\n"
+"descriptions of the command and/or URL which causes the problem, the\n"
+"operating system name with version number, the TCPIP implementation, the\n"
+"TRACEBACK if it can be captured, and any other relevant information.\n"
+msgstr ""
+
+#: src/LYEdit.c:249
+msgid "Editor killed by signal"
+msgstr ""
+
+#: src/LYEdit.c:251
+#, c-format
+msgid "Editor returned with error status, %s"
+msgstr ""
+
+#: src/LYEdit.c:252
+msgid "reason unknown."
+msgstr ""
+
+#: src/LYDownload.c:511
+msgid "Downloaded link:"
+msgstr ""
+
+#: src/LYDownload.c:516
+msgid "Suggested file name:"
+msgstr ""
+
+#: src/LYDownload.c:521
+msgid "Standard download options:"
+msgstr ""
+
+#: src/LYDownload.c:522
+msgid "Download options:"
+msgstr ""
+
+#: src/LYDownload.c:537
+msgid "Save to disk"
+msgstr ""
+
+#: src/LYDownload.c:539
+msgid "Save to disk disabled."
+msgstr ""
+
+#: src/LYDownload.c:543 src/LYPrint.c:1332
+msgid "Local additions:"
+msgstr ""
+
+#: src/LYDownload.c:552 src/LYUpload.c:224
+msgid "No Name Given"
+msgstr ""
+
+#: src/LYHistory.c:641
+msgid "You selected:"
+msgstr ""
+
+#: src/LYHistory.c:665 src/LYHistory.c:913
+msgid "(no address)"
+msgstr ""
+
+#: src/LYHistory.c:669
+msgid " (internal)"
+msgstr ""
+
+#: src/LYHistory.c:671
+msgid " (was internal)"
+msgstr ""
+
+#: src/LYHistory.c:769
+msgid " (From History)"
+msgstr ""
+
+#: src/LYHistory.c:833
+msgid "You visited (POSTs, bookmark, menu and list files excluded):"
+msgstr ""
+
+#: src/LYHistory.c:1132
+msgid "(No messages yet)"
+msgstr ""
+
+#: src/LYLeaks.c:78
+msgid "Invalid pointer detected."
+msgstr ""
+
+#: src/LYLeaks.c:80 src/LYLeaks.c:117
+msgid "Pointer:"
+msgstr ""
+
+#: src/LYLeaks.c:91 src/LYLeaks.c:98 src/LYLeaks.c:136
+msgid "FileName:"
+msgstr ""
+
+#: src/LYLeaks.c:94 src/LYLeaks.c:101 src/LYLeaks.c:139 src/LYLeaks.c:150
+msgid "LineCount:"
+msgstr ""
+
+#: src/LYLeaks.c:115
+msgid "Memory leak detected."
+msgstr ""
+
+#: src/LYLeaks.c:120
+msgid "Contains:"
+msgstr ""
+
+#: src/LYLeaks.c:133
+msgid "ByteSize:"
+msgstr ""
+
+#: src/LYLeaks.c:147
+msgid "realloced:"
+msgstr ""
+
+#: src/LYLeaks.c:170
+msgid "Total memory leakage this run:"
+msgstr ""
+
+#: src/LYList.c:92
+msgid "References in "
+msgstr ""
+
+#: src/LYList.c:93
+msgid "this document:"
+msgstr ""
+
+#: src/LYList.c:99
+msgid "Visible links:"
+msgstr ""
+
+#: src/LYList.c:200 src/LYList.c:319
+msgid "Hidden links:"
+msgstr ""
+
+#: src/LYList.c:267
+msgid "References"
+msgstr ""
+
+#: src/LYList.c:269
+msgid "Visible links"
+msgstr ""
+
+#: src/LYLocal.c:267
+#, c-format
+msgid "Unable to get status of '%s'."
+msgstr ""
+
+#: src/LYLocal.c:301
+msgid "The selected item is not a file or a directory! Request ignored."
+msgstr ""
+
+#: src/LYLocal.c:366
+#, c-format
+msgid "Unable to %s due to system error!"
+msgstr ""
+
+#. error return
+#: src/LYLocal.c:400
+#, c-format
+msgid "Probable failure to %s due to system error!"
+msgstr ""
+
+#: src/LYLocal.c:459
+#, c-format
+msgid "remove %s"
+msgstr ""
+
+#: src/LYLocal.c:475
+#, c-format
+msgid "touch %s"
+msgstr ""
+
+#: src/LYLocal.c:500
+#, c-format
+msgid "move %s to %s"
+msgstr ""
+
+#: src/LYLocal.c:540
+msgid "There is already a directory with that name! Request ignored."
+msgstr ""
+
+#: src/LYLocal.c:542
+msgid "There is already a file with that name! Request ignored."
+msgstr ""
+
+#: src/LYLocal.c:544
+msgid "The specified name is already in use! Request ignored."
+msgstr ""
+
+#: src/LYLocal.c:555
+msgid "Destination has different owner! Request denied."
+msgstr ""
+
+#: src/LYLocal.c:558
+msgid "Destination is not a valid directory! Request denied."
+msgstr ""
+
+#: src/LYLocal.c:580
+msgid "Remove all tagged files and directories?"
+msgstr ""
+
+#: src/LYLocal.c:639
+msgid "Enter new location for tagged items: "
+msgstr ""
+
+#: src/LYLocal.c:708
+msgid "Path too long"
+msgstr ""
+
+#: src/LYLocal.c:739
+msgid "Source and destination are the same location - request ignored!"
+msgstr ""
+
+#: src/LYLocal.c:797
+msgid "Enter new name for directory: "
+msgstr ""
+
+#: src/LYLocal.c:799
+msgid "Enter new name for file: "
+msgstr ""
+
+#: src/LYLocal.c:811
+msgid "Illegal character (path-separator) found! Request ignored."
+msgstr ""
+
+#: src/LYLocal.c:863
+msgid "Enter new location for directory: "
+msgstr ""
+
+#: src/LYLocal.c:866
+msgid "Enter new location for file: "
+msgstr ""
+
+#: src/LYLocal.c:893
+msgid "Unexpected failure - unable to find trailing path separator"
+msgstr ""
+
+#: src/LYLocal.c:913
+msgid "Source and destination are the same location! Request ignored!"
+msgstr ""
+
+#: src/LYLocal.c:962
+msgid "Modify name, location, or permission (n, l, or p): "
+msgstr ""
+
+#: src/LYLocal.c:964
+msgid "Modify name or location (n or l): "
+msgstr ""
+
+#.
+#. * Code for changing ownership needed here.
+#.
+#: src/LYLocal.c:993
+msgid "This feature not yet implemented!"
+msgstr ""
+
+#: src/LYLocal.c:1011
+msgid "Enter name of file to create: "
+msgstr ""
+
+#: src/LYLocal.c:1019 src/LYLocal.c:1061
+msgid "Illegal redirection \"//\" found! Request ignored."
+msgstr ""
+
+#: src/LYLocal.c:1053
+msgid "Enter name for new directory: "
+msgstr ""
+
+#: src/LYLocal.c:1098
+msgid "Create file or directory (f or d): "
+msgstr ""
+
+#: src/LYLocal.c:1138
+#, c-format
+msgid "Remove '%s' and all of its contents?"
+msgstr ""
+
+#: src/LYLocal.c:1141
+msgid "Remove directory and all of its contents?"
+msgstr ""
+
+#: src/LYLocal.c:1145
+#, c-format
+msgid "Remove file '%s'?"
+msgstr ""
+
+#: src/LYLocal.c:1147
+msgid "Remove file?"
+msgstr ""
+
+#: src/LYLocal.c:1152
+#, c-format
+msgid "Remove symbolic link '%s'?"
+msgstr ""
+
+#: src/LYLocal.c:1154
+msgid "Remove symbolic link?"
+msgstr ""
+
+#: src/LYLocal.c:1240
+msgid "Sorry, don't know how to permit non-UNIX files yet."
+msgstr ""
+
+#: src/LYLocal.c:1269
+msgid "Unable to open permit options file"
+msgstr ""
+
+#: src/LYLocal.c:1296
+msgid "Specify permissions below:"
+msgstr ""
+
+#: src/LYLocal.c:1297 src/LYShowInfo.c:196
+msgid "Owner:"
+msgstr ""
+
+#: src/LYLocal.c:1313
+msgid "Group"
+msgstr ""
+
+#: src/LYLocal.c:1329
+msgid "Others:"
+msgstr ""
+
+#: src/LYLocal.c:1347
+msgid "form to permit"
+msgstr ""
+
+#: src/LYLocal.c:1443
+msgid "Invalid mode format."
+msgstr ""
+
+#: src/LYLocal.c:1447
+msgid "Invalid syntax format."
+msgstr ""
+
+#: src/LYLocal.c:1635
+msgid "Warning! UUDecoded file will exist in the directory you started Lynx."
+msgstr ""
+
+#: src/LYLocal.c:1800
+msgid "NULL URL pointer"
+msgstr ""
+
+#: src/LYLocal.c:1883
+#, c-format
+msgid "Executing %s "
+msgstr ""
+
+#: src/LYLocal.c:1886
+msgid "Executing system command. This might take a while."
+msgstr ""
+
+#: src/LYLocal.c:1932
+msgid "Unable to open file management menu file."
+msgstr ""
+
+#: src/LYLocal.c:1963
+msgid "Current directory:"
+msgstr ""
+
+#: src/LYLocal.c:1966 src/LYLocal.c:1984
+msgid "Current selection:"
+msgstr ""
+
+#: src/LYLocal.c:1970
+msgid "Nothing currently selected."
+msgstr ""
+
+#: src/LYLocal.c:1985
+msgid "tagged item:"
+msgstr ""
+
+#: src/LYLocal.c:1985
+msgid "tagged items:"
+msgstr ""
+
+#: src/LYLocal.c:2083 src/LYLocal.c:2094
+msgid "Illegal filename; request ignored."
+msgstr ""
+
+#: src/LYLocal.c:2239
+msgid "The selected item is not a directory! Request ignored."
+msgstr ""
+
+#. directory not writable
+#: src/LYLocal.c:2243
+msgid "Install in the selected directory not permitted."
+msgstr ""
+
+#: src/LYLocal.c:2248
+msgid "Just a moment, ..."
+msgstr ""
+
+#: src/LYLocal.c:2265
+msgid "Error buiding install args"
+msgstr ""
+
+#: src/LYLocal.c:2280 src/LYLocal.c:2309
+#, c-format
+msgid "Source and target are the same: %s"
+msgstr ""
+
+#: src/LYLocal.c:2287 src/LYLocal.c:2316
+#, c-format
+msgid "Already in target directory: %s"
+msgstr ""
+
+#: src/LYLocal.c:2334
+msgid "Installation complete"
+msgstr ""
+
+#: src/LYLocal.c:2523
+msgid "Temporary URL or list would be too long."
+msgstr ""
+
+#: src/LYMail.c:529
+msgid "Sending"
+msgstr ""
+
+#: src/LYMail.c:1015
+#, c-format
+msgid "The link %s :?: %s \n"
+msgstr ""
+
+#: src/LYMail.c:1017
+#, c-format
+msgid "called \"%s\"\n"
+msgstr ""
+
+#: src/LYMail.c:1018
+#, c-format
+msgid "in the file \"%s\" called \"%s\"\n"
+msgstr ""
+
+#: src/LYMail.c:1019
+msgid "was requested but was not available."
+msgstr ""
+
+#: src/LYMail.c:1020
+msgid "Thought you might want to know."
+msgstr ""
+
+#: src/LYMail.c:1022
+msgid "This message was automatically generated by"
+msgstr ""
+
+#: src/LYMain.c:914
+msgid "No Winsock found, sorry."
+msgstr ""
+
+#: src/LYMain.c:1114
+msgid "You MUST define a valid TMP or TEMP area!\n"
+msgstr ""
+
+#: src/LYMain.c:1168 src/LYMainLoop.c:5040
+msgid "No such directory"
+msgstr ""
+
+#: src/LYMain.c:1386
+#, c-format
+msgid ""
+"\n"
+"Configuration file %s is not available.\n"
+"\n"
+msgstr ""
+
+#: src/LYMain.c:1396
+msgid ""
+"\n"
+"Lynx character sets not declared.\n"
+"\n"
+msgstr ""
+
+#: src/LYMain.c:1425
+msgid ""
+"\n"
+"Lynx edit map not declared.\n"
+"\n"
+msgstr ""
+
+#: src/LYMain.c:1454
+#, c-format
+msgid ""
+"\n"
+"Lynx file %s is not available.\n"
+"\n"
+msgstr ""
+
+#: src/LYMain.c:1694
+msgid "Warning:"
+msgstr ""
+
+#: src/LYMain.c:2237
+msgid "persistent cookies state will be changed in next session only."
+msgstr ""
+
+#: src/LYMain.c:2481 src/LYMain.c:2529
+#, c-format
+msgid "Lynx: ignoring unrecognized charset=%s\n"
+msgstr ""
+
+#: src/LYMain.c:3064
+#, c-format
+msgid "%s Version %s (%s)\n"
+msgstr ""
+
+#: src/LYMain.c:3089
+#, c-format
+msgid "Built on %s %s %s\n"
+msgstr ""
+
+#: src/LYMain.c:3094
+msgid "Copyrights held by the University of Kansas, CERN, and other contributors.\n"
+msgstr ""
+
+#: src/LYMain.c:3096
+msgid "Distributed under the GNU General Public License.\n"
+msgstr ""
+
+#: src/LYMain.c:3098
+msgid ""
+"See http://lynx.browser.org/ and the online help for more information.\n"
+"\n"
+msgstr ""
+
+#: src/LYMain.c:3827
+#, c-format
+msgid "USAGE: %s [options] [file]\n"
+msgstr ""
+
+#: src/LYMain.c:3828
+msgid "Options are:\n"
+msgstr ""
+
+#: src/LYMain.c:4087
+#, c-format
+msgid "%s: Invalid Option: %s\n"
+msgstr ""
+
+#: src/LYMainLoop.c:538
+#, c-format
+msgid "Internal error: Invalid mouse link %d!"
+msgstr ""
+
+#.
+#. * Make a name for this new URL.
+#.
+#: src/LYMainLoop.c:653 src/LYMainLoop.c:5062
+msgid "A URL specified by the user"
+msgstr ""
+
+#: src/LYMainLoop.c:1109
+msgid "Enctype multipart/form-data not yet supported! Cannot submit."
+msgstr ""
+
+#.
+#. * Make a name for this help file.
+#.
+#: src/LYMainLoop.c:3053
+msgid "Help Screen"
+msgstr ""
+
+#: src/LYMainLoop.c:3183
+msgid "System Index"
+msgstr ""
+
+#: src/LYMainLoop.c:3557 src/LYMainLoop.c:5272
+msgid "Entry into main screen"
+msgstr ""
+
+#: src/LYMainLoop.c:3835
+msgid "No next document present"
+msgstr ""
+
+#: src/LYMainLoop.c:4142
+msgid "charset for this document specified explicitly, sorry..."
+msgstr ""
+
+#: src/LYMainLoop.c:5016
+msgid "cd to:"
+msgstr ""
+
+#: src/LYMainLoop.c:5043
+msgid "A component of path is not a directory"
+msgstr ""
+
+#: src/LYMainLoop.c:5046
+msgid "failed to change directory"
+msgstr ""
+
+#: src/LYMainLoop.c:6198
+msgid "Reparsing document under current settings..."
+msgstr ""
+
+#: src/LYMainLoop.c:6486 src/LYMainLoop.c:6490
+#, c-format
+msgid "Fatal error - could not open output file %s\n"
+msgstr ""
+
+#: src/LYMainLoop.c:7611 src/LYMainLoop.c:7784
+msgid "-index-"
+msgstr ""
+
+#: src/LYMainLoop.c:7721
+msgid "lynx: Can't access startfile"
+msgstr ""
+
+#: src/LYMainLoop.c:7734
+msgid "lynx: Start file could not be found or is not text/html or text/plain"
+msgstr ""
+
+#: src/LYMainLoop.c:7735
+msgid " Exiting..."
+msgstr ""
+
+#: src/LYMainLoop.c:7778
+msgid "-more-"
+msgstr ""
+
+#. Enable scrolling.
+#: src/LYNews.c:187
+msgid "You will be posting to:"
+msgstr ""
+
+#.
+#. * Get the mail address for the From header,
+#. * offering personal_mail_address as default.
+#.
+#: src/LYNews.c:196
+msgid ""
+"\n"
+"\n"
+" Please provide your mail address for the From: header\n"
+msgstr ""
+
+#.
+#. * Get the Subject header, offering the current
+#. * document's title as the default if this is a
+#. * followup rather than a new post. - FM
+#.
+#: src/LYNews.c:214
+msgid ""
+"\n"
+"\n"
+" Please provide or edit the Subject: header\n"
+msgstr ""
+
+#: src/LYNews.c:303
+msgid ""
+"\n"
+"\n"
+" Please provide or edit the Organization: header\n"
+msgstr ""
+
+#.
+#. * Use the built in line editior.
+#.
+#: src/LYNews.c:360
+msgid ""
+"\n"
+"\n"
+" Please enter your message below."
+msgstr ""
+
+#: src/LYNews.c:406
+msgid "Message has no original text!"
+msgstr ""
+
+#: src/LYOptions.c:746
+msgid "review/edit B)ookmarks files"
+msgstr ""
+
+#: src/LYOptions.c:748
+msgid "B)ookmark file: "
+msgstr ""
+
+#: src/LYOptions.c:2532 src/LYOptions.c:2556
+#, c-format
+msgid "Use %s to invoke the Options menu!"
+msgstr ""
+
+#: src/LYOptions.c:3238
+msgid "(options marked with (!) will not be saved)"
+msgstr ""
+
+#: src/LYOptions.c:3246
+msgid "General Preferences"
+msgstr ""
+
+#. ***************************************************************
+#. User Mode: SELECT
+#: src/LYOptions.c:3250
+msgid "User mode"
+msgstr ""
+
+#. Editor: INPUT
+#: src/LYOptions.c:3256
+msgid "Editor"
+msgstr ""
+
+#. Search Type: SELECT
+#: src/LYOptions.c:3261
+msgid "Type of Search"
+msgstr ""
+
+#. Cookies: SELECT
+#: src/LYOptions.c:3267
+msgid "Cookies"
+msgstr ""
+
+#: src/LYOptions.c:3281
+msgid "Keyboard Input"
+msgstr ""
+
+#. ***************************************************************
+#. Keypad Mode: SELECT
+#: src/LYOptions.c:3285
+msgid "Keypad mode"
+msgstr ""
+
+#. Emacs keys: ON/OFF
+#: src/LYOptions.c:3291
+msgid "Emacs keys"
+msgstr ""
+
+#. VI Keys: ON/OFF
+#: src/LYOptions.c:3297
+msgid "VI keys"
+msgstr ""
+
+#. Line edit style: SELECT
+#. well, at least 2 line edit styles available
+#: src/LYOptions.c:3304
+msgid "Line edit style"
+msgstr ""
+
+#. Keyboard layout: SELECT
+#: src/LYOptions.c:3316
+msgid "Keyboard layout"
+msgstr ""
+
+#.
+#. * Display and Character Set
+#.
+#: src/LYOptions.c:3329
+msgid "Display and Character Set"
+msgstr ""
+
+#. ***************************************************************
+#. Display Character Set: SELECT
+#: src/LYOptions.c:3333
+msgid "Display character set"
+msgstr ""
+
+#: src/LYOptions.c:3362
+msgid "Assumed document character set"
+msgstr ""
+
+#.
+#. * Since CJK people hardly mixed with other world
+#. * we split the header to make it more readable:
+#. * "CJK mode" for CJK display charsets, and "Raw 8-bit" for others.
+#.
+#: src/LYOptions.c:3382
+msgid "CJK mode"
+msgstr ""
+
+#: src/LYOptions.c:3384
+msgid "Raw 8-bit"
+msgstr ""
+
+#. X Display: INPUT
+#: src/LYOptions.c:3392
+msgid "X Display"
+msgstr ""
+
+#.
+#. * Document Appearance
+#.
+#: src/LYOptions.c:3398
+msgid "Document Appearance"
+msgstr ""
+
+#: src/LYOptions.c:3404
+msgid "Show color"
+msgstr ""
+
+#. Show cursor: ON/OFF
+#: src/LYOptions.c:3428
+msgid "Show cursor"
+msgstr ""
+
+#. Show scrollbar: ON/OFF
+#: src/LYOptions.c:3435
+msgid "Show scrollbar"
+msgstr ""
+
+#. Select Popups: ON/OFF
+#: src/LYOptions.c:3442
+msgid "Popups for select fields"
+msgstr ""
+
+#. HTML error recovery: SELECT
+#: src/LYOptions.c:3448
+msgid "HTML error recovery"
+msgstr ""
+
+#. Show Images: SELECT
+#: src/LYOptions.c:3454
+msgid "Show images"
+msgstr ""
+
+#. Verbose Images: ON/OFF
+#: src/LYOptions.c:3468
+msgid "Verbose images"
+msgstr ""
+
+#.
+#. * Headers Transferred to Remote Servers
+#.
+#: src/LYOptions.c:3476
+msgid "Headers Transferred to Remote Servers"
+msgstr ""
+
+#. ***************************************************************
+#. Mail Address: INPUT
+#: src/LYOptions.c:3480
+msgid "Personal mail address"
+msgstr ""
+
+#. Preferred Document Character Set: INPUT
+#: src/LYOptions.c:3485
+msgid "Preferred document character set"
+msgstr ""
+
+#. Preferred Document Language: INPUT
+#: src/LYOptions.c:3490
+msgid "Preferred document language"
+msgstr ""
+
+#: src/LYOptions.c:3496
+msgid "User-Agent header"
+msgstr ""
+
+#.
+#. * Listing and Accessing Files
+#.
+#: src/LYOptions.c:3504
+msgid "Listing and Accessing Files"
+msgstr ""
+
+#. ***************************************************************
+#. FTP sort: SELECT
+#: src/LYOptions.c:3508
+msgid "FTP sort criteria"
+msgstr ""
+
+#. Local Directory Sort: SELECT
+#: src/LYOptions.c:3515
+msgid "Local directory sort criteria"
+msgstr ""
+
+#. Local Directory Order: SELECT
+#: src/LYOptions.c:3521
+msgid "Local directory sort order"
+msgstr ""
+
+#: src/LYOptions.c:3530
+msgid "Show dot files"
+msgstr ""
+
+#: src/LYOptions.c:3538
+msgid "Execution links"
+msgstr ""
+
+#. Local Directory Sort: SELECT
+#: src/LYOptions.c:3558
+msgid "Show transfer rate"
+msgstr ""
+
+#.
+#. * Special Files and Screens
+#.
+#: src/LYOptions.c:3567
+msgid "Special Files and Screens"
+msgstr ""
+
+#: src/LYOptions.c:3572
+msgid "Multi-bookmarks"
+msgstr ""
+
+#: src/LYOptions.c:3580
+msgid "Review/edit Bookmarks files"
+msgstr ""
+
+#: src/LYOptions.c:3582
+msgid "Goto multi-bookmark menu"
+msgstr ""
+
+#: src/LYOptions.c:3584
+msgid "Bookmarks file"
+msgstr ""
+
+#. Visited Pages: SELECT
+#: src/LYOptions.c:3590
+msgid "Visited Pages"
+msgstr ""
+
+#: src/LYOptions.c:3597
+msgid "View the file "
+msgstr ""
+
+#: src/LYPrint.c:949
+msgid " Print job complete.\n"
+msgstr ""
+
+#: src/LYPrint.c:1286
+msgid "Document:"
+msgstr ""
+
+#: src/LYPrint.c:1287
+msgid "Number of lines:"
+msgstr ""
+
+#: src/LYPrint.c:1288
+msgid "Number of pages:"
+msgstr ""
+
+#: src/LYPrint.c:1289
+msgid "pages"
+msgstr ""
+
+#: src/LYPrint.c:1289
+msgid "page"
+msgstr ""
+
+#: src/LYPrint.c:1290
+msgid "(approximately)"
+msgstr ""
+
+#: src/LYPrint.c:1295
+msgid "Some print functions have been disabled!"
+msgstr ""
+
+#: src/LYPrint.c:1299
+msgid "Standard print options:"
+msgstr ""
+
+#: src/LYPrint.c:1300
+msgid "Print options:"
+msgstr ""
+
+#: src/LYPrint.c:1307
+msgid "Save to a local file"
+msgstr ""
+
+#: src/LYPrint.c:1309
+msgid "Save to disk disabled"
+msgstr ""
+
+#: src/LYPrint.c:1316
+msgid "Mail the file"
+msgstr ""
+
+#: src/LYPrint.c:1323
+msgid "Print to the screen"
+msgstr ""
+
+#: src/LYPrint.c:1328
+msgid "Print out on a printer attached to your vt100 terminal"
+msgstr ""
+
+#: src/LYReadCFG.c:340
+msgid ""
+"Syntax Error parsing COLOR in configuration file:\n"
+"The line must be of the form:\n"
+"COLOR:INTEGER:FOREGROUND:BACKGROUND\n"
+"\n"
+"Here FOREGROUND and BACKGROUND must be one of:\n"
+"The special strings 'nocolor' or 'default', or\n"
+msgstr ""
+
+#: src/LYReadCFG.c:353
+msgid "Offending line:"
+msgstr ""
+
+#: src/LYReadCFG.c:637
+#, c-format
+msgid "key remapping of %s to %s for %s failed\n"
+msgstr ""
+
+#: src/LYReadCFG.c:644
+#, c-format
+msgid "key remapping of %s to %s failed\n"
+msgstr ""
+
+#: src/LYReadCFG.c:665
+#, c-format
+msgid "invalid line-editor selection %s for key %s, selecting all\n"
+msgstr ""
+
+#: src/LYReadCFG.c:692 src/LYReadCFG.c:705
+#, c-format
+msgid "setting of line-editor binding for key %s (0x%x) to 0x%x for %s failed\n"
+msgstr ""
+
+#: src/LYReadCFG.c:710
+#, c-format
+msgid "setting of line-editor binding for key %s (0x%x) for %s failed\n"
+msgstr ""
+
+#: src/LYReadCFG.c:815
+#, c-format
+msgid "Lynx: cannot start, CERN rules file %s is not available\n"
+msgstr ""
+
+#: src/LYReadCFG.c:817
+msgid "(no name)"
+msgstr ""
+
+#: src/LYReadCFG.c:1725
+#, c-format
+msgid "More than %d nested lynx.cfg includes -- perhaps there is a loop?!?\n"
+msgstr ""
+
+#: src/LYReadCFG.c:1727
+#, c-format
+msgid "Last attempted include was '%s',\n"
+msgstr ""
+
+#: src/LYReadCFG.c:1728
+#, c-format
+msgid "included from '%s'.\n"
+msgstr ""
+
+#: src/LYReadCFG.c:2128 src/LYReadCFG.c:2141 src/LYReadCFG.c:2179
+msgid "The following is read from your lynx.cfg file."
+msgstr ""
+
+#: src/LYReadCFG.c:2129 src/LYReadCFG.c:2142
+msgid "Please read the distribution"
+msgstr ""
+
+#: src/LYReadCFG.c:2135 src/LYReadCFG.c:2145
+msgid "for more comments."
+msgstr ""
+
+#: src/LYReadCFG.c:2161
+msgid "RELOAD THE CHANGES"
+msgstr ""
+
+#: src/LYReadCFG.c:2170
+msgid "Your primary configuration"
+msgstr ""
+
+#: src/LYShowInfo.c:129
+msgid "Directory that you are currently viewing"
+msgstr ""
+
+#: src/LYShowInfo.c:132
+msgid "Name:"
+msgstr ""
+
+#: src/LYShowInfo.c:135
+msgid "URL:"
+msgstr ""
+
+#: src/LYShowInfo.c:146
+msgid "Directory that you have currently selected"
+msgstr ""
+
+#: src/LYShowInfo.c:149
+msgid "File that you have currently selected"
+msgstr ""
+
+#: src/LYShowInfo.c:153
+msgid "Symbolic link that you have currently selected"
+msgstr ""
+
+#: src/LYShowInfo.c:157
+msgid "Item that you have currently selected"
+msgstr ""
+
+#: src/LYShowInfo.c:159
+msgid "Full name:"
+msgstr ""
+
+#: src/LYShowInfo.c:168
+msgid "Unable to follow link"
+msgstr ""
+
+#: src/LYShowInfo.c:170
+msgid "Points to file:"
+msgstr ""
+
+#: src/LYShowInfo.c:175
+msgid "Name of owner:"
+msgstr ""
+
+#: src/LYShowInfo.c:178
+msgid "Group name:"
+msgstr ""
+
+#: src/LYShowInfo.c:181
+msgid "File size:"
+msgstr ""
+
+#: src/LYShowInfo.c:187
+msgid "Creation date:"
+msgstr ""
+
+#: src/LYShowInfo.c:190
+msgid "Last modified:"
+msgstr ""
+
+#: src/LYShowInfo.c:193
+msgid "Last accessed:"
+msgstr ""
+
+#: src/LYShowInfo.c:195
+msgid "Access Permissions"
+msgstr ""
+
+#: src/LYShowInfo.c:261
+msgid "File that you are currently viewing"
+msgstr ""
+
+#: src/LYShowInfo.c:266 src/LYShowInfo.c:375
+msgid "Linkname:"
+msgstr ""
+
+#: src/LYShowInfo.c:279 src/LYShowInfo.c:291
+msgid "Charset:"
+msgstr ""
+
+#: src/LYShowInfo.c:297
+msgid "Server:"
+msgstr ""
+
+#: src/LYShowInfo.c:300
+msgid "Date:"
+msgstr ""
+
+#: src/LYShowInfo.c:303
+msgid "Last Mod:"
+msgstr ""
+
+#: src/LYShowInfo.c:309
+msgid "&nbsp;Expires:"
+msgstr ""
+
+#: src/LYShowInfo.c:313
+msgid "Cache-Control:"
+msgstr ""
+
+#: src/LYShowInfo.c:317
+msgid "Content-Length:"
+msgstr ""
+
+#: src/LYShowInfo.c:322
+msgid "Language:"
+msgstr ""
+
+#: src/LYShowInfo.c:329
+msgid "Post Data:"
+msgstr ""
+
+#: src/LYShowInfo.c:331
+msgid "Post Content Type:"
+msgstr ""
+
+#: src/LYShowInfo.c:340
+msgid "Owner(s):"
+msgstr ""
+
+#: src/LYShowInfo.c:343
+msgid "size:"
+msgstr ""
+
+#: src/LYShowInfo.c:343
+msgid "lines"
+msgstr ""
+
+#: src/LYShowInfo.c:346
+msgid "mode:"
+msgstr ""
+
+#: src/LYShowInfo.c:348
+msgid "forms mode"
+msgstr ""
+
+#: src/LYShowInfo.c:350
+msgid "source"
+msgstr ""
+
+#: src/LYShowInfo.c:350
+msgid "normal"
+msgstr ""
+
+#: src/LYShowInfo.c:351
+msgid ", safe"
+msgstr ""
+
+#: src/LYShowInfo.c:352
+msgid ", via internal link"
+msgstr ""
+
+#: src/LYShowInfo.c:358
+msgid ", no-cache"
+msgstr ""
+
+#: src/LYShowInfo.c:360
+msgid ", ISMAP script"
+msgstr ""
+
+#: src/LYShowInfo.c:362
+msgid ", bookmark file"
+msgstr ""
+
+#: src/LYShowInfo.c:371
+msgid "Link that you currently have selected"
+msgstr ""
+
+#: src/LYShowInfo.c:384
+msgid "Method:"
+msgstr ""
+
+#: src/LYShowInfo.c:389
+msgid "Enctype:"
+msgstr ""
+
+#: src/LYShowInfo.c:401
+msgid "(Form field)"
+msgstr ""
+
+#: src/LYShowInfo.c:416
+msgid "No Links on the current page"
+msgstr ""
+
+#: src/LYStyle.c:272
+#, c-format
+msgid ""
+"Syntax Error parsing style in lss file:\n"
+"[%s]\n"
+"The line must be of the form:\n"
+"OBJECT:MONO:COLOR (ie em:bold:brightblue:white)\n"
+"where OBJECT is one of EM,STRONG,B,I,U,BLINK etc.\n"
+"\n"
+msgstr ""
+
+#: src/LYTraversal.c:107
+msgid "here is a list of the history stack so that you may rebuild"
+msgstr ""
+
+#: src/LYUpload.c:78
+msgid "ERROR! - upload command is misconfigured"
+msgstr ""
+
+#: src/LYUpload.c:100
+msgid "Illegal redirection \"../\" found! Request ignored."
+msgstr ""
+
+#: src/LYUpload.c:103
+msgid "Illegal character \"/\" found! Request ignored."
+msgstr ""
+
+#: src/LYUpload.c:106
+msgid "Illegal redirection using \"~\" found! Request ignored."
+msgstr ""
+
+#: src/LYUpload.c:163
+msgid "Unable to upload file."
+msgstr ""
+
+#: src/LYUpload.c:214
+msgid "Upload To:"
+msgstr ""
+
+#: src/LYUpload.c:215
+msgid "Upload options:"
+msgstr ""
+
+#: src/LYUtils.c:2342
+msgid "Unexpected access protocol for this URL scheme."
+msgstr ""
+
+#: src/LYUtils.c:3168
+msgid "Too many tempfiles"
+msgstr ""
+
+#: src/LYUtils.c:3469
+msgid "unknown restriction"
+msgstr ""
+
+#: src/LYUtils.c:3500
+msgid "No restrictions set.\n"
+msgstr ""
+
+#: src/LYUtils.c:3503
+msgid "Restrictions set:\n"
+msgstr ""
+
+#: src/LYUtils.c:4899
+msgid "Cannot find HOME directory"
+msgstr ""
+
+#: src/LYrcFile.c:21
+msgid "Normally disabled. See ENABLE_LYNXRC in lynx.cfg\n"
+msgstr ""
+
+#: src/LYrcFile.c:288
+msgid ""
+"accept_all_cookies allows the user to tell Lynx to automatically\n"
+"accept all cookies if desired. The default is \"FALSE\" which will\n"
+"prompt for each cookie. Set accept_all_cookies to \"TRUE\" to accept\n"
+"all cookies.\n"
+msgstr ""
+
+#: src/LYrcFile.c:295
+msgid ""
+"bookmark_file specifies the name and location of the default bookmark\n"
+"file into which the user can paste links for easy access at a later\n"
+"date.\n"
+msgstr ""
+
+#: src/LYrcFile.c:300
+msgid ""
+"If case_sensitive_searching is \"on\" then when the user invokes a search\n"
+"using the 's' or '/' keys, the search performed will be case sensitive\n"
+"instead of case INsensitive. The default is usually \"off\".\n"
+msgstr ""
+
+#: src/LYrcFile.c:305
+msgid ""
+"The character_set definition controls the representation of 8 bit\n"
+"characters for your terminal. If 8 bit characters do not show up\n"
+"correctly on your screen you may try changing to a different 8 bit\n"
+"set or using the 7 bit character approximations.\n"
+"Current valid characters sets are:\n"
+msgstr ""
+
+#: src/LYrcFile.c:312
+msgid ""
+"cookie_accept_domains and cookie_reject_domains are comma-delimited\n"
+"lists of domains from which Lynx should automatically accept or reject\n"
+"all cookies. If a domain is specified in both options, rejection will\n"
+"take precedence. The accept_all_cookies parameter will override any\n"
+"settings made here.\n"
+msgstr ""
+
+#: src/LYrcFile.c:320
+msgid ""
+"cookie_file specifies the file from which to read persistent cookies.\n"
+"The default is ~/.lynx_cookies.\n"
+msgstr ""
+
+#: src/LYrcFile.c:325
+msgid ""
+"cookie_loose_invalid_domains, cookie_strict_invalid_domains, and\n"
+"cookie_query_invalid_domains are comma-delimited lists of which domains\n"
+"should be subjected to varying degrees of validity checking. If a\n"
+"domain is set to strict checking, strict conformance to RFC2109 will\n"
+"be applied. A domain with loose checking will be allowed to set cookies\n"
+"with an invalid path or domain attribute. All domains will default to\n"
+"querying the user for an invalid path or domain.\n"
+msgstr ""
+
+#: src/LYrcFile.c:339
+msgid ""
+"dir_list_order specifies the directory list order under DIRED_SUPPORT\n"
+"(if implemented). The default is \"ORDER_BY_NAME\"\n"
+msgstr ""
+
+#: src/LYrcFile.c:344
+msgid ""
+"dir_list_styles specifies the directory list style under DIRED_SUPPORT\n"
+"(if implemented). The default is \"MIXED_STYLE\", which sorts both\n"
+"files and directories together. \"FILES_FIRST\" lists files first and\n"
+"\"DIRECTORIES_FIRST\" lists directories first.\n"
+msgstr ""
+
+#: src/LYrcFile.c:352
+msgid ""
+"If emacs_keys is to \"on\" then the normal EMACS movement keys:\n"
+" ^N = down ^P = up\n"
+" ^B = left ^F = right\n"
+"will be enabled.\n"
+msgstr ""
+
+#: src/LYrcFile.c:358
+msgid ""
+"file_editor specifies the editor to be invoked when editing local files\n"
+"or sending mail. If no editor is specified, then file editing is disabled\n"
+"unless it is activated from the command line, and the built-in line editor\n"
+"will be used for sending mail.\n"
+msgstr ""
+
+#: src/LYrcFile.c:364
+msgid ""
+"The file_sorting_method specifies which value to sort on when viewing\n"
+"file lists such as FTP directories. The options are:\n"
+" BY_FILENAME -- sorts on the name of the file\n"
+" BY_TYPE -- sorts on the type of the file\n"
+" BY_SIZE -- sorts on the size of the file\n"
+" BY_DATE -- sorts on the date of the file\n"
+msgstr ""
+
+#: src/LYrcFile.c:376
+msgid ""
+"lineedit_mode specifies the key binding used for inputting strings in\n"
+"prompts and forms. If lineedit_mode is set to \"Default Binding\" then\n"
+"the following control characters are used for moving and deleting:\n"
+"\n"
+" Prev Next Enter = Accept input\n"
+" Move char: <- -> ^G = Cancel input\n"
+" Move word: ^P ^N ^U = Erase line\n"
+" Delete char: ^H ^R ^A = Beginning of line\n"
+" Delete word: ^B ^F ^E = End of line\n"
+"\n"
+"Current lineedit modes are:\n"
+msgstr ""
+
+#: src/LYrcFile.c:391
+msgid ""
+"The following allow you to define sub-bookmark files and descriptions.\n"
+"The format is multi_bookmark<capital_letter>=<filename>,<description>\n"
+"Up to 26 bookmark files (for the English capital letters) are allowed.\n"
+"We start with \"multi_bookmarkB\" since 'A' is the default (see above).\n"
+msgstr ""
+
+#: src/LYrcFile.c:397
+msgid ""
+"personal_mail_address specifies your personal mail address. The\n"
+"address will be sent during HTTP file transfers for authorization and\n"
+"logging purposes, and for mailed comments.\n"
+"If you do not want this information given out, set the NO_FROM_HEADER\n"
+"to TRUE in lynx.cfg, or use the -nofrom command line switch. You also\n"
+"could leave this field blank, but then you won't have it included in\n"
+"your mailed comments.\n"
+msgstr ""
+
+#: src/LYrcFile.c:406
+msgid ""
+"preferred_charset specifies the character set in MIME notation (e.g.,\n"
+"ISO-8859-2, ISO-8859-5) which Lynx will indicate you prefer in requests\n"
+"to http servers using an Accept-Charset header. The value should NOT\n"
+"include ISO-8859-1 or US-ASCII, since those values are always assumed\n"
+"by default. May be a comma-separated list.\n"
+"If a file in that character set is available, the server will send it.\n"
+"If no Accept-Charset header is present, the default is that any\n"
+"character set is acceptable. If an Accept-Charset header is present,\n"
+"and if the server cannot send a response which is acceptable\n"
+"according to the Accept-Charset header, then the server SHOULD send\n"
+"an error response, though the sending of an unacceptable response\n"
+"is also allowed.\n"
+msgstr ""
+
+#: src/LYrcFile.c:420
+msgid ""
+"preferred_language specifies the language in MIME notation (e.g., en,\n"
+"fr, may be a comma-separated list in decreasing preference)\n"
+"which Lynx will indicate you prefer in requests to http servers.\n"
+"If a file in that language is available, the server will send it.\n"
+"Otherwise, the server will send the file in its default language.\n"
+msgstr ""
+
+#: src/LYrcFile.c:429
+msgid ""
+"If run_all_execution_links is set \"on\" then all local execution links\n"
+"will be executed when they are selected.\n"
+"\n"
+"WARNING - This is potentially VERY dangerous. Since you may view\n"
+" information that is written by unknown and untrusted sources\n"
+" there exists the possibility that Trojan horse links could be\n"
+" written. Trojan horse links could be written to erase files\n"
+" or compromise security. This should only be set to \"on\" if\n"
+" you are viewing trusted source information.\n"
+msgstr ""
+
+#: src/LYrcFile.c:440
+msgid ""
+"If run_execution_links_on_local_files is set \"on\" then all local\n"
+"execution links that are found in LOCAL files will be executed when they\n"
+"are selected. This is different from run_all_execution_links in that\n"
+"only files that reside on the local system will have execution link\n"
+"permissions.\n"
+"\n"
+"WARNING - This is potentially dangerous. Since you may view\n"
+" information that is written by unknown and untrusted sources\n"
+" there exists the possibility that Trojan horse links could be\n"
+" written. Trojan horse links could be written to erase files\n"
+" or compromise security. This should only be set to \"on\" if\n"
+" you are viewing trusted source information.\n"
+msgstr ""
+
+#: src/LYrcFile.c:458
+msgid ""
+"select_popups specifies whether the OPTIONs in a SELECT block which\n"
+"lacks a MULTIPLE attribute are presented as a vertical list of radio\n"
+"buttons or via a popup menu. Note that if the MULTIPLE attribute is\n"
+"present in the SELECT start tag, Lynx always will create a vertical list\n"
+"of checkboxes for the OPTIONs. A value of \"on\" will set popup menus\n"
+"as the default while a value of \"off\" will set use of radio boxes.\n"
+"The default can be overridden via the -popup command line toggle.\n"
+msgstr ""
+
+#: src/LYrcFile.c:468
+msgid ""
+"show_color specifies how to set the color mode at startup. A value of\n"
+"\"never\" will force color mode off (treat the terminal as monochrome)\n"
+"at startup even if the terminal appears to be color capable. A value of\n"
+"\"always\" will force color mode on even if the terminal appears to be\n"
+"monochrome, if this is supported by the library used to build lynx.\n"
+"A value of \"default\" will yield the behavior of assuming\n"
+"a monochrome terminal unless color capability is inferred at startup\n"
+"based on the terminal type, or the -color command line switch is used, or\n"
+"the COLORTERM environment variable is set. The default behavior always is\n"
+"used in anonymous accounts or if the \"option_save\" restriction is set.\n"
+"The effect of the saved value can be overridden via\n"
+"the -color and -nocolor command line switches.\n"
+"The mode set at startup can be changed via the \"show color\" option in\n"
+"the 'o'ptions menu. If the option settings are saved, the \"on\" and\n"
+"\"off\" \"show color\" settings will be treated as \"default\".\n"
+msgstr ""
+
+#: src/LYrcFile.c:485
+msgid ""
+"show_cursor specifies whether to 'hide' the cursor to the right (and\n"
+"bottom, if possible) of the screen, or to place it to the left of the\n"
+"current link in documents, or current option in select popup windows.\n"
+"Positioning the cursor to the left of the current link or option is\n"
+"helpful for speech or braille interfaces, and when the terminal is\n"
+"one which does not distinguish the current link based on highlighting\n"
+"or color. A value of \"on\" will set positioning to the left as the\n"
+"default while a value of \"off\" will set 'hiding' of the cursor.\n"
+"The default can be overridden via the -show_cursor command line toggle.\n"
+msgstr ""
+
+#: src/LYrcFile.c:496
+msgid ""
+"show_dotfiles specifies that the directory listing should include\n"
+"\"hidden\" (dot) files/directories. If set \"on\", this will be\n"
+"honored only if enabled via userdefs.h and/or lynx.cfg, and not\n"
+"restricted via a command line switch. If display of hidden files\n"
+"is disabled, creation of such files via Lynx also is disabled.\n"
+msgstr ""
+
+#: src/LYrcFile.c:507
+msgid ""
+"If sub_bookmarks is not turned \"off\", and multiple bookmarks have\n"
+"been defined (see below), then all bookmark operations will first\n"
+"prompt the user to select an active sub-bookmark file. If the default\n"
+"Lynx bookmark_file is defined (see above), it will be used as the\n"
+"default selection. When this option is set to \"advanced\", and the\n"
+"user mode is advanced, the 'v'iew bookmark command will invoke a\n"
+"statusline prompt instead of the menu seen in novice and intermediate\n"
+"user modes. When this option is set to \"standard\", the menu will be\n"
+"presented regardless of user mode.\n"
+msgstr ""
+
+#: src/LYrcFile.c:520
+msgid ""
+"user_mode specifies the users level of knowledge with Lynx. The\n"
+"default is \"NOVICE\" which displays two extra lines of help at the\n"
+"bottom of the screen to aid the user in learning the basic Lynx\n"
+"commands. Set user_mode to \"INTERMEDIATE\" to turn off the extra info.\n"
+"Use \"ADVANCED\" to see the URL of the currently selected link at the\n"
+"bottom of the screen.\n"
+msgstr ""
+
+#: src/LYrcFile.c:529
+msgid ""
+"If verbose_images is \"on\", lynx will print the name of the image\n"
+"source file in place of [INLINE], [LINK] or [IMAGE]\n"
+"See also VERBOSE_IMAGES in lynx.cfg\n"
+msgstr ""
+
+#: src/LYrcFile.c:534
+msgid ""
+"If vi_keys is set to \"on\", then the normal VI movement keys:\n"
+" j = down k = up\n"
+" h = left l = right\n"
+"will be enabled. These keys are only lower case.\n"
+"Capital 'H', 'J' and 'K will still activate help, jump shortcuts,\n"
+"and the keymap display, respectively.\n"
+msgstr ""
+
+#: src/LYrcFile.c:542
+msgid ""
+"The visited_links setting controls how Lynx organizes the information\n"
+"in the Visited Links Page.\n"
+msgstr ""
+
+#: src/LYrcFile.c:759
+msgid ""
+"If keypad_mode is set to \"NUMBERS_AS_ARROWS\", then the numbers on\n"
+"your keypad when the numlock is on will act as arrow keys:\n"
+" 8 = Up Arrow\n"
+" 4 = Left Arrow 6 = Right Arrow\n"
+" 2 = Down Arrow\n"
+"and the corresponding keyboard numbers will act as arrow keys,\n"
+"regardless of whether numlock is on.\n"
+msgstr ""
+
+#: src/LYrcFile.c:768
+msgid ""
+"If keypad_mode is set to \"LINKS_ARE_NUMBERED\", then numbers will\n"
+"appear next to each link and numbers are used to select links.\n"
+msgstr ""
+
+#: src/LYrcFile.c:772
+msgid ""
+"If keypad_mode is set to \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\", then\n"
+"numbers will appear next to each link and visible form input field.\n"
+"Numbers are used to select links, or to move the \"current link\" to a\n"
+"form input field or button. In addition, options in popup menus are\n"
+"indexed so that the user may type an option number to select an option in\n"
+"a popup menu, even if the option isn't visible on the screen. Reference\n"
+"lists and output from the list command also enumerate form inputs.\n"
+msgstr ""
+
+#: src/LYrcFile.c:781
+msgid ""
+"NOTE: Some fixed format documents may look disfigured when\n"
+"\"LINKS_ARE_NUMBERED\" or \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\" are\n"
+"enabled.\n"
+msgstr ""
+
+#: src/LYrcFile.c:814
+msgid ""
+"Lynx User Defaults File\n"
+"\n"
+"This file contains options saved from the Lynx Options Screen (normally\n"
+"with the '>' key). There is normally no need to edit this file manually,\n"
+"since the defaults here can be controlled from the Options Screen, and the\n"
+"next time options are saved from the Options Screen this file will be\n"
+"completely rewritten. You have been warned...\n"
+"If you are looking for the general configuration file - it is normally\n"
+"called lynx.cfg, and it has different content and a different format.\n"
+"It is not this file.\n"
+msgstr ""
diff --git a/po/zh_TW.po b/po/zh_TW.po
new file mode 100644
index 0000000..d9a3472
--- /dev/null
+++ b/po/zh_TW.po
@@ -0,0 +1,5869 @@
+# Traditional Chinese translation of lynx.
+#
+# Abel Cheung <maddog@linux.org.hk>, 2002, 2003.
+msgid ""
+msgstr ""
+"Project-Id-Version: lynx 2.8.5pre9\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-12-07 20:02-0500\n"
+"PO-Revision-Date: 2003-02-11 19:44+0800\n"
+"Last-Translator: Abel Cheung <maddog@linux.org.hk>\n"
+"Language-Team: Chinese (traditional) <zh-l10n@linux.org.tw>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. ******************************************************************
+#. * The following definitions are for status line prompts, messages, or
+#. * warnings issued by Lynx during program execution. You can modify
+#. * them to make them more appropriate for your site. We recommend that
+#. * you extend these definitions to other languages using the gettext
+#. * library. There are also scattered uses of 'gettext()' throughout the
+#. * Lynx source, covering all but those messages which (a) are used for
+#. * debugging (CTRACE) or (b) are constants used in interaction with
+#. * other programs.
+#. *
+#. * Links to collections of alternate definitions, developed by the Lynx
+#. * User Community, are maintained in Lynx links:
+#. *
+#. * http://www.subir.com/lynx.html
+#. *
+#. * See ABOUT-NLS and po/readme for details and location of contributed
+#. * translations. When no translation is available, the English default is
+#. * used.
+#.
+#: LYMessages.c:32
+#, c-format
+msgid "Alert!: %s"
+msgstr "警告ï¼ï¼š%s"
+
+#: LYMessages.c:33
+msgid "Welcome"
+msgstr "æ­¡è¿Ž"
+
+#: LYMessages.c:34
+msgid "Are you sure you want to quit?"
+msgstr "是å¦ç¢ºå®šè¦é›¢é–‹ï¼Ÿ"
+
+#: LYMessages.c:36
+msgid "Really exit from Lynx?"
+msgstr "是å¦ç¢ºå®šè¦é›¢é–‹ Lynx?"
+
+#: LYMessages.c:38
+msgid "Connection interrupted."
+msgstr "連線中斷。"
+
+#: LYMessages.c:39
+msgid "Data transfer interrupted."
+msgstr "資料傳輸中斷。"
+
+#: LYMessages.c:40
+msgid "Cancelled!!!"
+msgstr "å–消!!!"
+
+#: LYMessages.c:41
+msgid "Cancelling!"
+msgstr "å–消ï¼"
+
+#: LYMessages.c:42
+msgid "Excellent!!!"
+msgstr "好極!!!"
+
+#: LYMessages.c:43
+msgid "OK"
+msgstr "OK"
+
+#: LYMessages.c:44
+msgid "Done!"
+msgstr "完æˆï¼"
+
+#: LYMessages.c:45
+msgid "Bad request!"
+msgstr ""
+
+#: LYMessages.c:46
+msgid "previous"
+msgstr "上一é "
+
+#: LYMessages.c:47
+msgid "next screen"
+msgstr "下一é "
+
+#: LYMessages.c:48
+msgid "HELP!"
+msgstr "求助ï¼"
+
+#: LYMessages.c:49
+msgid ", help on "
+msgstr ""
+
+#. #define HELP
+#: LYMessages.c:51
+msgid "Commands: Use arrow keys to move, '?' for help, 'q' to quit, '<-' to go back."
+msgstr "指令:使用方å‘éµç§»å‹•ï¼Œ'?' 求助,'q' çµæŸï¼Œ'â†' 回å‰ä¸€é ã€‚"
+
+#. #define MOREHELP
+#: LYMessages.c:53
+msgid "-- press space for more, use arrow keys to move, '?' for help, 'q' to quit."
+msgstr "─ 按空白éµçœ‹ä¸‹ä¸€é ï¼Œä½¿ç”¨æ–¹å‘éµç§»å‹•ï¼Œ'?' 求助,'q' çµæŸã€‚"
+
+#: LYMessages.c:54
+msgid "-- press space for next page --"
+msgstr "─ 請按空白éµçœ‹ä¸‹ä¸€é  ─"
+
+#: LYMessages.c:55
+msgid "URL too long"
+msgstr "URL éŽé•·"
+
+#. Inactive input fields, messages used with -tna option - kw
+#. #define FORM_LINK_TEXT_MESSAGE_INA
+#: LYMessages.c:61
+msgid "(Text entry field) Inactive. Press <return> to activate."
+msgstr "(文字輸入欄ä½) æš«åœä½¿ç”¨ã€‚請按 <return> 開始輸入。"
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_INA
+#: LYMessages.c:63
+msgid "(Textarea) Inactive. Press <return> to activate."
+msgstr "(文字å€åŸŸ) æš«åœä½¿ç”¨ã€‚請按 <return> 開始輸入。"
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_INA_E
+#: LYMessages.c:65
+#, c-format
+msgid "(Textarea) Inactive. Press <return> to activate (%s for editor)."
+msgstr "(文字å€åŸŸ) æš«åœä½¿ç”¨ã€‚請按 <return> 開始輸入 (按 %s 啟動編輯器)。"
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE_INA
+#: LYMessages.c:67
+msgid "(Form field) Inactive. Use <return> to edit."
+msgstr ""
+
+#. #define FORM_TEXT_SUBMIT_MESSAGE_INA_X
+#: LYMessages.c:69
+#, c-format
+msgid "(Form field) Inactive. Use <return> to edit (%s to submit with no cache)."
+msgstr ""
+
+#. #define FORM_TEXT_RESUBMIT_MESSAGE_INA
+#: LYMessages.c:71
+msgid "(Form field) Inactive. Press <return> to edit, press <return> twice to submit."
+msgstr ""
+
+#. #define FORM_TEXT_SUBMIT_MAILTO_MSG_INA
+#: LYMessages.c:73
+msgid "(mailto form field) Inactive. Press <return> to change."
+msgstr "(mailto 表格欄ä½) æš«åœä½¿ç”¨ã€‚請按 <return> 開始輸入。"
+
+#. #define FORM_LINK_PASSWORD_MESSAGE_INA
+#: LYMessages.c:75
+msgid "(Password entry field) Inactive. Press <return> to activate."
+msgstr "(密碼輸入欄ä½) æš«åœä½¿ç”¨ã€‚請按 <return> 開始輸入。"
+
+#. #define FORM_LINK_FILE_UNM_MSG
+#: LYMessages.c:78
+msgid "UNMODIFIABLE file entry field. Use UP or DOWN arrows or tab to move off."
+msgstr "*ä¸å¯ä¿®æ”¹çš„* 檔案輸入欄ä½ã€‚使用 ↑ã€â†“ 或 tab éµé›¢é–‹æ¬„ä½ã€‚"
+
+#. #define FORM_LINK_FILE_MESSAGE
+#: LYMessages.c:80
+msgid "(File entry field) Enter filename. Use UP or DOWN arrows or tab to move off."
+msgstr "(檔案輸入欄ä½) 請輸入檔案å稱。使用 ↑ã€â†“ 或 tab éµé›¢é–‹æ¬„ä½ã€‚"
+
+#. #define FORM_LINK_TEXT_MESSAGE
+#: LYMessages.c:82
+msgid "(Text entry field) Enter text. Use UP or DOWN arrows or tab to move off."
+msgstr "(文字輸入欄ä½) 請輸入文字。使用 ↑ã€â†“ 或 tab éµé›¢é–‹æ¬„ä½ã€‚"
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE
+#: LYMessages.c:84
+msgid "(Textarea) Enter text. Use UP/DOWN arrows or TAB to move off."
+msgstr "(文字輸入å€åŸŸ) 請輸入文字。使用 ↑ã€â†“ 或 tab éµé›¢é–‹å€åŸŸã€‚"
+
+#. #define FORM_LINK_TEXTAREA_MESSAGE_E
+#: LYMessages.c:86
+#, c-format
+msgid "(Textarea) Enter text. Use UP/DOWN arrows or TAB to move off (%s for editor)."
+msgstr "(文字輸入å€åŸŸ) 請輸入文字。使用 ↑ã€â†“ 或 tab éµé›¢é–‹å€åŸŸ (%s 啟動編輯器)。"
+
+#. #define FORM_LINK_TEXT_UNM_MSG
+#: LYMessages.c:88
+msgid "UNMODIFIABLE form text field. Use UP or DOWN arrows or tab to move off."
+msgstr "*ä¸å¯ä¿®æ”¹çš„* 文字輸入欄ä½ã€‚使用 ↑ã€â†“ 或 tab éµé›¢é–‹æ¬„ä½ã€‚"
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE
+#: LYMessages.c:90
+msgid "(Form field) Enter text. Use <return> to submit."
+msgstr ""
+
+#. #define FORM_LINK_TEXT_SUBMIT_MESSAGE_X
+#: LYMessages.c:92
+#, c-format
+msgid "(Form field) Enter text. Use <return> to submit (%s for no cache)."
+msgstr ""
+
+#. #define FORM_LINK_TEXT_RESUBMIT_MESSAGE
+#: LYMessages.c:94
+msgid "(Form field) Enter text. Use <return> to submit, arrows or tab to move off."
+msgstr ""
+
+#. #define FORM_LINK_TEXT_SUBMIT_UNM_MSG
+#: LYMessages.c:96
+msgid "UNMODIFIABLE form field. Use UP or DOWN arrows or tab to move off."
+msgstr "*ä¸å¯ä¿®æ”¹çš„* 表格輸入欄ä½ã€‚使用 ↑ã€â†“ 或 tab éµé›¢é–‹æ¬„ä½ã€‚"
+
+#. #define FORM_LINK_TEXT_SUBMIT_MAILTO_MSG
+#: LYMessages.c:98
+msgid "(mailto form field) Enter text. Use <return> to submit, arrows to move off."
+msgstr ""
+
+#. #define FORM_LINK_TEXT_SUBMIT_MAILTO_DIS_MSG
+#: LYMessages.c:100
+msgid "(mailto form field) Mail is disallowed so you cannot submit."
+msgstr ""
+
+#. #define FORM_LINK_PASSWORD_MESSAGE
+#: LYMessages.c:102
+msgid "(Password entry field) Enter text. Use UP or DOWN arrows or tab to move off."
+msgstr "(密碼輸入欄ä½) 請輸入文字。使用 ↑ã€â†“ 或 tab éµé›¢é–‹æ¬„ä½ã€‚"
+
+#. #define FORM_LINK_PASSWORD_UNM_MSG
+#: LYMessages.c:104
+msgid "UNMODIFIABLE form password. Use UP or DOWN arrows or tab to move off."
+msgstr "*ä¸å¯ä¿®æ”¹çš„* 密碼輸入欄ä½ã€‚使用 ↑ã€â†“ 或 tab éµé›¢é–‹æ¬„ä½ã€‚"
+
+#. #define FORM_LINK_CHECKBOX_MESSAGE
+#: LYMessages.c:106
+msgid "(Checkbox Field) Use right-arrow or <return> to toggle."
+msgstr ""
+
+#. #define FORM_LINK_CHECKBOX_UNM_MSG
+#: LYMessages.c:108
+msgid "UNMODIFIABLE form checkbox. Use UP or DOWN arrows or tab to move off."
+msgstr ""
+
+#. #define FORM_LINK_RADIO_MESSAGE
+#: LYMessages.c:110
+msgid "(Radio Button) Use right-arrow or <return> to toggle."
+msgstr ""
+
+#. #define FORM_LINK_RADIO_UNM_MSG
+#: LYMessages.c:112
+msgid "UNMODIFIABLE form radio button. Use UP or DOWN arrows or tab to move off."
+msgstr ""
+
+#. #define FORM_LINK_SUBMIT_PREFIX
+#: LYMessages.c:114
+msgid "Submit ('x' for no cache) to "
+msgstr ""
+
+#. #define FORM_LINK_RESUBMIT_PREFIX
+#: LYMessages.c:116
+msgid "Submit to "
+msgstr ""
+
+#. #define FORM_LINK_SUBMIT_MESSAGE
+#: LYMessages.c:118
+msgid "(Form submit button) Use right-arrow or <return> to submit ('x' for no cache)."
+msgstr ""
+
+#. #define FORM_LINK_RESUBMIT_MESSAGE
+#: LYMessages.c:120
+msgid "(Form submit button) Use right-arrow or <return> to submit."
+msgstr ""
+
+#. #define FORM_LINK_SUBMIT_DIS_MSG
+#: LYMessages.c:122
+msgid "DISABLED form submit button. Use UP or DOWN arrows or tab to move off."
+msgstr ""
+
+#. #define FORM_LINK_SUBMIT_MAILTO_PREFIX
+#: LYMessages.c:124
+msgid "Submit mailto form to "
+msgstr ""
+
+#. #define FORM_LINK_SUBMIT_MAILTO_MSG
+#: LYMessages.c:126
+msgid "(mailto form submit button) Use right-arrow or <return> to submit."
+msgstr ""
+
+#. #define FORM_LINK_SUBMIT_MAILTO_DIS_MSG
+#: LYMessages.c:128
+msgid "(mailto form submit button) Mail is disallowed so you cannot submit."
+msgstr ""
+
+#. #define FORM_LINK_RESET_MESSAGE
+#: LYMessages.c:130
+msgid "(Form reset button) Use right-arrow or <return> to reset form to defaults."
+msgstr "(é‡è¨­è¡¨æ ¼æŒ‰éˆ•) 請按 → 或 <return> 將表格欄ä½é‡è¨­ç‚ºé è¨­å€¼ã€‚"
+
+#. #define FORM_LINK_RESET_DIS_MSG
+#: LYMessages.c:132
+msgid "DISABLED form reset button. Use UP or DOWN arrows or tab to move off."
+msgstr "*æš«åœä½¿ç”¨çš„* é‡è¨­è¡¨æ ¼æŒ‰éˆ•ã€‚使用 ↑ã€â†“ 或 tab éµé›¢é–‹æ¬„ä½ã€‚"
+
+#. #define FORM_LINK_OPTION_LIST_MESSAGE
+#: LYMessages.c:134
+msgid "(Option list) Hit return and use arrow keys and return to select option."
+msgstr "(é¸é …清單) 按 return,然後使用方å‘éµå’Œ return é¸æ“‡æ‰€éœ€çš„é¸é …。"
+
+#. #define CHOICE_LIST_MESSAGE
+#: LYMessages.c:136
+msgid "(Choice list) Hit return and use arrow keys and return to select option."
+msgstr "(é¸æ“‡æ¸…å–®) 按 return,然後使用方å‘éµå’Œ return é¸æ“‡æ‰€éœ€çš„é¸é …。"
+
+#. #define FORM_LINK_OPTION_LIST_UNM_MSG
+#: LYMessages.c:138
+msgid "UNMODIFIABLE option list. Use return or arrow keys to review or leave."
+msgstr ""
+
+#. #define CHOICE_LIST_UNM_MSG
+#: LYMessages.c:140
+msgid "UNMODIFIABLE choice list. Use return or arrow keys to review or leave."
+msgstr ""
+
+#: LYMessages.c:141
+msgid "Submitting form..."
+msgstr ""
+
+#: LYMessages.c:142
+msgid "Resetting form..."
+msgstr "é‡è¨­è¡¨æ ¼..."
+
+#. #define RELOADING_FORM
+#: LYMessages.c:144
+msgid "Reloading document. Any form entries will be lost!"
+msgstr "é‡æ–°è¼‰å…¥ç¶²é ã€‚將會失去所有修改éŽçš„表格欄ä½å…§å®¹ï¼"
+
+#: LYMessages.c:145
+#, c-format
+msgid "Warning: Cannot transcode form data to charset %s!"
+msgstr ""
+
+#. #define NORMAL_LINK_MESSAGE
+#: LYMessages.c:148
+msgid "(NORMAL LINK) Use right-arrow or <return> to activate."
+msgstr "(普通éˆçµ) 請按 → 或 <return> ç€è¦½ã€‚"
+
+#: LYMessages.c:149
+msgid "The resource requested is not available at this time."
+msgstr ""
+
+#: LYMessages.c:150
+msgid "Enter Lynx keystroke command: "
+msgstr ""
+
+#: LYMessages.c:151
+msgid "Looking up "
+msgstr "準備檢索 "
+
+#: LYMessages.c:152
+#, c-format
+msgid "Getting %s"
+msgstr ""
+
+#: LYMessages.c:153
+#, c-format
+msgid "Skipping %s"
+msgstr "ç•¥éŽ %s"
+
+#: LYMessages.c:154
+#, c-format
+msgid "Using %s"
+msgstr "使用 %s"
+
+#: LYMessages.c:155
+#, c-format
+msgid "Illegal URL: %s"
+msgstr "ä¸åˆæ³•çš„ URL:%s"
+
+#: LYMessages.c:156
+#, c-format
+msgid "Badly formed address %s"
+msgstr "åœ°å€ %s æ ¼å¼éŒ¯èª¤"
+
+#: LYMessages.c:157
+#, c-format
+msgid "URL: %s"
+msgstr "URL:%s"
+
+#: LYMessages.c:158
+msgid "Unable to access WWW file!!!"
+msgstr "ç„¡æ³•å­˜å– WWW 檔案!!!"
+
+#: LYMessages.c:159
+#, c-format
+msgid "This is a searchable index. Use %s to search."
+msgstr ""
+
+#. #define WWW_INDEX_MORE_MESSAGE
+#: LYMessages.c:161
+#, c-format
+msgid "--More-- This is a searchable index. Use %s to search."
+msgstr ""
+
+#: LYMessages.c:162
+msgid "You have entered an invalid link number."
+msgstr ""
+
+#. #define SOURCE_HELP
+#: LYMessages.c:164
+msgid "Currently viewing document source. Press '\\' to return to rendered version."
+msgstr ""
+
+#. #define NOVICE_LINE_ONE
+#: LYMessages.c:166
+msgid " Arrow keys: Up and Down to move. Right to follow a link; Left to go back. \n"
+msgstr " æ–¹å‘éµï¼š ↑/↓ 移動 → 進入éˆçµ ↠回å‰ä¸€é \n"
+
+#. #define NOVICE_LINE_TWO
+#: LYMessages.c:168
+msgid " H)elp O)ptions P)rint G)o M)ain screen Q)uit /=search [delete]=history list \n"
+msgstr " H)求助 O)é¸é … P)åˆ—å° G)移至 M)ä¸»ç•«é¢ Q)離開 /)æœå°‹ [delete])ç€è¦½ç´€éŒ„\n"
+
+#. #define NOVICE_LINE_TWO_A
+#: LYMessages.c:170
+msgid " O)ther cmds H)elp K)eymap G)oto P)rint M)ain screen o)ptions Q)uit \n"
+msgstr " O)其它指令 H)求助 K)按éµè¨­å®š G)移至 P)åˆ—å° M)ä¸»ç•«é¢ o)é¸é … Q)離開\n"
+
+#. #define NOVICE_LINE_TWO_B
+#: LYMessages.c:172
+msgid " O)ther cmds B)ack E)dit D)ownload ^R)eload ^W)ipe screen search doc: / \n"
+msgstr ""
+
+#. #define NOVICE_LINE_TWO_C
+#: LYMessages.c:174
+msgid "O)ther cmds C)omment History: <backspace> Bookmarks: V)iew, A)dd, R)emove \n"
+msgstr ""
+
+#. #define FORM_NOVICELINE_ONE
+#: LYMessages.c:176
+msgid " Enter text into the field by typing on the keyboard "
+msgstr " 請使用éµç›¤åœ¨æ¬„ä½ä¸­è¼¸å…¥æ–‡å­—"
+
+#. #define FORM_NOVICELINE_TWO
+#: LYMessages.c:178
+msgid " Ctrl-U to delete all text in field, [Backspace] to delete a character "
+msgstr " Ctrl-U 會刪除欄ä½ä¸­çš„所有文字,[Backspace] 會å‘後刪除一個字元"
+
+#. #define FORM_NOVICELINE_TWO_DELBL
+#: LYMessages.c:180
+msgid " Ctrl-U to delete text in field, [Backspace] to delete a character "
+msgstr " Ctrl-U 會刪除欄ä½ä¸­çš„文字,[Backspace] 會å‘後刪除一個字元"
+
+#. #define FORM_NOVICELINE_TWO_VAR
+#: LYMessages.c:182
+#, c-format
+msgid " %s to delete all text in field, [Backspace] to delete a character "
+msgstr " %s 會刪除欄ä½ä¸­çš„所有文字,[Backspace] 會å‘後刪除一個字元"
+
+#. #define FORM_NOVICELINE_TWO_DELBL_VAR
+#: LYMessages.c:184
+#, c-format
+msgid " %s to delete text in field, [Backspace] to delete a character "
+msgstr " %s 會刪除欄ä½ä¸­çš„文字,[Backspace] 會å‘後刪除一個字元"
+
+#. mailto
+#: LYMessages.c:187
+msgid "Malformed mailto form submission! Cancelled!"
+msgstr ""
+
+#: LYMessages.c:188
+msgid "Warning! Control codes in mail address replaced by ?"
+msgstr "è­¦å‘Šï¼ é›»éƒµåœ°å€ä¸­çš„控制字元已用 '?' å­—å…ƒå–代"
+
+#: LYMessages.c:189
+msgid "Mail disallowed! Cannot submit."
+msgstr ""
+
+#: LYMessages.c:190
+msgid "Mailto form submission failed!"
+msgstr ""
+
+#: LYMessages.c:191
+msgid "Mailto form submission Cancelled!!!"
+msgstr ""
+
+#: LYMessages.c:192
+msgid "Sending form content..."
+msgstr "正在é€å‡ºè¡¨æ ¼å…§å®¹..."
+
+#: LYMessages.c:193
+msgid "No email address is present in mailto URL!"
+msgstr "mailto URL 中沒有電郵地å€ï¼"
+
+#. #define MAILTO_URL_TEMPOPEN_FAILED
+#: LYMessages.c:195
+msgid "Unable to open temporary file for mailto URL!"
+msgstr "無法開啟 mailto URL 所需的暫存檔ï¼"
+
+#. #define INC_ORIG_MSG_PROMPT
+#: LYMessages.c:197
+msgid "Do you wish to include the original message?"
+msgstr ""
+
+#. #define INC_PREPARSED_MSG_PROMPT
+#: LYMessages.c:199
+msgid "Do you wish to include the preparsed source?"
+msgstr ""
+
+#. #define SPAWNING_EDITOR_FOR_MAIL
+#: LYMessages.c:201
+msgid "Spawning your selected editor to edit mail message"
+msgstr "準備啟動指定的編輯器來修改郵件內容"
+
+#. #define ERROR_SPAWNING_EDITOR
+#: LYMessages.c:203
+msgid "Error spawning editor, check your editor definition in the options menu"
+msgstr "啟動編輯器時出ç¾éŒ¯èª¤ï¼Œè«‹æª¢æŸ¥é¸é …設定中有關編輯器的部份"
+
+#: LYMessages.c:204
+msgid "Send this comment?"
+msgstr ""
+
+#: LYMessages.c:205
+msgid "Send this message?"
+msgstr "是å¦å‚³é€æ­¤è¨Šæ¯ï¼Ÿ"
+
+#: LYMessages.c:206
+msgid "Sending your message..."
+msgstr "準備傳é€é–£ä¸‹çš„訊æ¯..."
+
+#: LYMessages.c:207
+msgid "Sending your comment:"
+msgstr ""
+
+#. textarea
+#: LYMessages.c:210
+msgid "Not in a TEXTAREA; cannot use external editor."
+msgstr "ç›®å‰ä¸æ˜¯åœ¨æ–‡å­—編輯å€åŸŸä¸­ï¼›ç„¡æ³•ä½¿ç”¨å¤–部的編輯器。"
+
+#: LYMessages.c:211
+msgid "Not in a TEXTAREA; cannot use command."
+msgstr "ç›®å‰ä¸æ˜¯åœ¨æ–‡å­—編輯å€åŸŸä¸­ï¼›ç„¡æ³•ä½¿ç”¨æŒ‡ä»¤ã€‚"
+
+#: LYMessages.c:213
+msgid "file: ACTIONs are disallowed!"
+msgstr ""
+
+#. #define FILE_SERVED_LINKS_DISALLOWED
+#: LYMessages.c:215
+msgid "file: URLs via served links are disallowed!"
+msgstr ""
+
+#: LYMessages.c:216
+msgid "Access to local files denied."
+msgstr "拒絕存å–本機檔案。"
+
+#: LYMessages.c:217
+msgid "file: URLs via bookmarks are disallowed!"
+msgstr ""
+
+#. #define SPECIAL_VIA_EXTERNAL_DISALLOWED
+#: LYMessages.c:219
+msgid "This special URL is not allowed in external documents!"
+msgstr ""
+
+#: LYMessages.c:220
+msgid "Press <return> to return to Lynx."
+msgstr "請按 <return> 返回 Lynx。"
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:223
+msgid "Spawning DCL subprocess. Use 'logout' to return to Lynx.\n"
+msgstr ""
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:227
+msgid "Type EXIT to return to Lynx.\n"
+msgstr "請輸入 EXIT 返回 Lynx。\n"
+
+#. #define SPAWNING_MSG
+#: LYMessages.c:230
+msgid "Spawning your default shell. Use 'exit' to return to Lynx.\n"
+msgstr ""
+
+#: LYMessages.c:233
+msgid "Spawning is currently disabled."
+msgstr ""
+
+#: LYMessages.c:234
+msgid "The 'd'ownload command is currently disabled."
+msgstr "ç›®å‰ç„¡æ³•æ供「下載ã€('d') 指令。"
+
+#: LYMessages.c:235
+msgid "You cannot download an input field."
+msgstr "ä¸å¯ä¸‹è¼‰è¼¸å…¥æ¬„ä½ã€‚"
+
+#: LYMessages.c:236
+msgid "Form has a mailto action! Cannot download."
+msgstr ""
+
+#: LYMessages.c:237
+msgid "You cannot download a mailto: link."
+msgstr "ä¸å¯ä¸‹è¼‰ mailto: éˆçµã€‚"
+
+#: LYMessages.c:238
+msgid "You cannot download cookies."
+msgstr "ä¸å¯ä¸‹è¼‰ cookie。"
+
+#: LYMessages.c:239
+msgid "You cannot download a printing option."
+msgstr "ä¸å¯ä¸‹è¼‰æœ‰é—œåˆ—å°çš„é¸é …"
+
+#: LYMessages.c:240
+msgid "You cannot download an upload option."
+msgstr "ä¸å¯ä¸‹è¼‰æœ‰é—œä¸Šå‚³çš„é¸é …"
+
+#: LYMessages.c:241
+msgid "You cannot download an permit option."
+msgstr ""
+
+#: LYMessages.c:242
+msgid "This special URL cannot be downloaded!"
+msgstr "ä¸å¯ä¸‹è¼‰æ­¤ç‰¹æ®Š URLï¼"
+
+#: LYMessages.c:243
+msgid "Nothing to download."
+msgstr "沒有å¯ä¸‹è¼‰çš„資料。"
+
+#: LYMessages.c:244
+msgid "Trace ON!"
+msgstr ""
+
+#: LYMessages.c:245
+msgid "Trace OFF!"
+msgstr ""
+
+#. #define CLICKABLE_IMAGES_ON
+#: LYMessages.c:247
+msgid "Links will be included for all images! Reloading..."
+msgstr ""
+
+#. #define CLICKABLE_IMAGES_OFF
+#: LYMessages.c:249
+msgid "Standard image handling restored! Reloading..."
+msgstr ""
+
+#. #define PSEUDO_INLINE_ALTS_ON
+#: LYMessages.c:251
+msgid "Pseudo_ALTs will be inserted for inlines without ALT strings! Reloading..."
+msgstr ""
+
+#. #define PSEUDO_INLINE_ALTS_OFF
+#: LYMessages.c:253
+msgid "Inlines without an ALT string specified will be ignored! Reloading..."
+msgstr ""
+
+#: LYMessages.c:254
+msgid "Raw 8-bit or CJK mode toggled OFF! Reloading..."
+msgstr "已關閉 8-bit 原始模å¼æˆ–是 CJK 模å¼ï¼æº–å‚™é‡æ–°è¼‰å…¥..."
+
+#: LYMessages.c:255
+msgid "Raw 8-bit or CJK mode toggled ON! Reloading..."
+msgstr "已啟用 8-bit 原始模å¼æˆ–是 CJK 模å¼ï¼æº–å‚™é‡æ–°è¼‰å…¥..."
+
+#. #define HEAD_D_L_OR_CANCEL
+#: LYMessages.c:257
+msgid "Send HEAD request for D)ocument or L)ink, or C)ancel? (d,l,c): "
+msgstr ""
+
+#. #define HEAD_D_OR_CANCEL
+#: LYMessages.c:259
+msgid "Send HEAD request for D)ocument, or C)ancel? (d,c): "
+msgstr ""
+
+#: LYMessages.c:260
+msgid "Sorry, the document is not an http URL."
+msgstr "抱歉,該文件ä¸æ˜¯ http URL。"
+
+#: LYMessages.c:261
+msgid "Sorry, the link is not an http URL."
+msgstr "抱歉,該éˆçµä¸æ˜¯ http URL。"
+
+#: LYMessages.c:262
+msgid "Sorry, the ACTION for this form is disabled."
+msgstr ""
+
+#. #define FORM_ACTION_NOT_HTTP_URL
+#: LYMessages.c:264
+msgid "Sorry, the ACTION for this form is not an http URL."
+msgstr ""
+
+#: LYMessages.c:265
+msgid "Not an http URL or form ACTION!"
+msgstr ""
+
+#: LYMessages.c:266
+msgid "This special URL cannot be a form ACTION!"
+msgstr ""
+
+#: LYMessages.c:267
+msgid "URL is not in starting realm!"
+msgstr ""
+
+#: LYMessages.c:268
+msgid "News posting is disabled!"
+msgstr "æš«åœä½¿ç”¨å°‡è¨Šæ¯è²¼ä¸Šæ–°èžçµ„的功能ï¼"
+
+#: LYMessages.c:269
+msgid "File management support is disabled!"
+msgstr "æš«åœä½¿ç”¨æª”案管ç†çš„功能ï¼"
+
+#: LYMessages.c:270
+msgid "No jump file is currently available."
+msgstr ""
+
+#: LYMessages.c:271
+msgid "Jump to (use '?' for list): "
+msgstr ""
+
+#: LYMessages.c:272
+msgid "Jumping to a shortcut URL is disallowed!"
+msgstr ""
+
+#: LYMessages.c:273
+msgid "Random URL is disallowed! Use a shortcut."
+msgstr ""
+
+#: LYMessages.c:274
+msgid "No random URLs have been used thus far."
+msgstr ""
+
+#: LYMessages.c:275
+msgid "Bookmark features are currently disabled."
+msgstr "ç›®å‰ç„¡æ³•æ供書籤功能。"
+
+#: LYMessages.c:276
+msgid "Execution via bookmarks is disabled."
+msgstr ""
+
+#. #define BOOKMARK_FILE_NOT_DEFINED
+#: LYMessages.c:278
+#, c-format
+msgid "Bookmark file is not defined. Use %s to see options."
+msgstr ""
+
+#. #define NO_TEMP_FOR_HOTLIST
+#: LYMessages.c:280
+msgid "Unable to open tempfile for X Mosaic hotlist conversion."
+msgstr "ç•¶è½‰æ› X Mosaic hotlist 時無法開啟暫存檔。"
+
+#: LYMessages.c:281
+msgid "ERROR - unable to open bookmark file."
+msgstr "錯誤 ─ 無法開啟書籤檔。"
+
+#. #define BOOKMARK_OPEN_FAILED_FOR_DEL
+#: LYMessages.c:283
+msgid "Unable to open bookmark file for deletion of link."
+msgstr "無法開啟書籤檔來刪除éˆçµã€‚"
+
+#. #define BOOKSCRA_OPEN_FAILED_FOR_DEL
+#: LYMessages.c:285
+msgid "Unable to open scratch file for deletion of link."
+msgstr ""
+
+#: LYMessages.c:287
+msgid "Error renaming scratch file."
+msgstr ""
+
+#: LYMessages.c:289
+msgid "Error renaming temporary file."
+msgstr "更改暫存檔å稱時出ç¾éŒ¯èª¤ã€‚"
+
+#. #define BOOKTEMP_COPY_FAIL
+#: LYMessages.c:291
+msgid "Unable to copy temporary file for deletion of link."
+msgstr "當刪除éˆçµæ™‚無法複製暫存檔。"
+
+#. #define BOOKTEMP_REOPEN_FAIL_FOR_DEL
+#: LYMessages.c:293
+msgid "Unable to reopen temporary file for deletion of link."
+msgstr "當刪除éˆçµæ™‚無法é‡æ–°é–‹å•Ÿæš«å­˜æª”。"
+
+#. #define BOOKMARK_LINK_NOT_ONE_LINE
+#: LYMessages.c:296
+msgid "Link is not by itself all on one line in bookmark file."
+msgstr ""
+
+#: LYMessages.c:297
+msgid "Bookmark deletion failed."
+msgstr "刪除書籤失敗。"
+
+#. #define BOOKMARKS_NOT_TRAVERSED
+#: LYMessages.c:299
+msgid "Bookmark files cannot be traversed (only http URLs)."
+msgstr ""
+
+#. #define BOOKMARKS_NOT_OPEN
+#: LYMessages.c:301
+msgid "Unable to open bookmark file, use 'a' to save a link first"
+msgstr "無法開啟書籤檔,請先按‘a’儲存éˆçµ"
+
+#: LYMessages.c:302
+msgid "There are no links in this bookmark file!"
+msgstr "本書籤檔中並沒有éˆçµï¼"
+
+#. #define CACHE_D_OR_CANCEL
+#: LYMessages.c:304
+#, fuzzy
+msgid "D)elete cached document or C)ancel? (d,c): "
+msgstr "在書籤檔中儲存 D)文件,還是 C)å–消? (d,c):"
+
+#. #define BOOK_D_L_OR_CANCEL
+#: LYMessages.c:306
+msgid "Save D)ocument or L)ink to bookmark file or C)ancel? (d,l,c): "
+msgstr "在書籤檔中儲存 D)文件 或是 L)éˆçµï¼Œé‚„是 C)å–消? (d,l,c):"
+
+#: LYMessages.c:307
+msgid "Save D)ocument to bookmark file or C)ancel? (d,c): "
+msgstr "在書籤檔中儲存 D)文件,還是 C)å–消? (d,c):"
+
+#: LYMessages.c:308
+msgid "Save L)ink to bookmark file or C)ancel? (l,c): "
+msgstr "在書籤檔中儲存 L)éˆçµï¼Œé‚„是 C)å–消? (l,c):"
+
+#. #define NOBOOK_POST_FORM
+#: LYMessages.c:310
+msgid "Documents from forms with POST content cannot be saved as bookmarks."
+msgstr ""
+
+#: LYMessages.c:311
+msgid "Cannot save form fields/links"
+msgstr "ä¸å¯èƒ½å„²å­˜è¡¨æ ¼æ¬„ä½/éˆçµ"
+
+#. #define NOBOOK_HSML
+#: LYMessages.c:313
+msgid "History, showinfo, menu and list files cannot be saved as bookmarks."
+msgstr ""
+
+#. #define CONFIRM_BOOKMARK_DELETE
+#: LYMessages.c:315
+msgid "Do you really want to delete this link from your bookmark file?"
+msgstr "是å¦ç¢ºå®šè¦å¾žæ›¸ç±¤æª”中刪除本éˆçµï¼Ÿ"
+
+#: LYMessages.c:316
+msgid "Malformed address."
+msgstr "地å€æ ¼å¼ä¸æ­£ç¢ºã€‚"
+
+#. #define HISTORICAL_ON_MINIMAL_OFF
+#: LYMessages.c:318
+msgid "Historical comment parsing ON (Minimal is overridden)!"
+msgstr ""
+
+#. #define HISTORICAL_OFF_MINIMAL_ON
+#: LYMessages.c:320
+msgid "Historical comment parsing OFF (Minimal is in effect)!"
+msgstr ""
+
+#. #define HISTORICAL_ON_VALID_OFF
+#: LYMessages.c:322
+msgid "Historical comment parsing ON (Valid is overridden)!"
+msgstr ""
+
+#. #define HISTORICAL_OFF_VALID_ON
+#: LYMessages.c:324
+msgid "Historical comment parsing OFF (Valid is in effect)!"
+msgstr ""
+
+#. #define MINIMAL_ON_IN_EFFECT
+#: LYMessages.c:326
+msgid "Minimal comment parsing ON (and in effect)!"
+msgstr ""
+
+#. #define MINIMAL_OFF_VALID_ON
+#: LYMessages.c:328
+msgid "Minimal comment parsing OFF (Valid is in effect)!"
+msgstr ""
+
+#. #define MINIMAL_ON_BUT_HISTORICAL
+#: LYMessages.c:330
+msgid "Minimal comment parsing ON (but Historical is in effect)!"
+msgstr ""
+
+#. #define MINIMAL_OFF_HISTORICAL_ON
+#: LYMessages.c:332
+msgid "Minimal comment parsing OFF (Historical is in effect)!"
+msgstr ""
+
+#: LYMessages.c:333
+msgid "Soft double-quote parsing ON!"
+msgstr ""
+
+#: LYMessages.c:334
+msgid "Soft double-quote parsing OFF!"
+msgstr ""
+
+#: LYMessages.c:335
+msgid "Now using TagSoup parsing of HTML."
+msgstr "ç¾åœ¨ä½¿ç”¨ TagSoup æ–¹å¼åˆ†æž HTML 文件。"
+
+#: LYMessages.c:336
+msgid "Now using SortaSGML parsing of HTML!"
+msgstr "ç¾åœ¨ä½¿ç”¨ SortaSGML æ–¹å¼åˆ†æž HTML 文件。"
+
+#: LYMessages.c:337
+msgid "You are already at the end of this document."
+msgstr "已經在文件的末端了。"
+
+#: LYMessages.c:338
+msgid "You are already at the beginning of this document."
+msgstr "已經在文件的開始ä½ç½®äº†ã€‚"
+
+#: LYMessages.c:339
+#, c-format
+msgid "You are already at page %d of this document."
+msgstr "已經在文件的第 %d é äº†ã€‚"
+
+#: LYMessages.c:340
+#, c-format
+msgid "Link number %d already is current."
+msgstr "éˆçµç·¨è™Ÿ %d 已經是目å‰é¸å–çš„éˆçµã€‚"
+
+#: LYMessages.c:341
+msgid "You are already at the first document"
+msgstr "本文件已經是第一份文件"
+
+#: LYMessages.c:342
+msgid "There are no links above this line of the document."
+msgstr "本行以上已經沒有éˆçµã€‚"
+
+#: LYMessages.c:343
+msgid "There are no links below this line of the document."
+msgstr "本行以下已經沒有éˆçµã€‚"
+
+#. #define MAXLEN_REACHED_DEL_OR_MOV
+#: LYMessages.c:345
+msgid "Maximum length reached! Delete text or move off field."
+msgstr "已到é”文字長度的上é™ï¼è«‹åˆªé™¤æ–‡å­—或是離開本欄ä½ã€‚"
+
+#. #define NOT_ON_SUBMIT_OR_LINK
+#: LYMessages.c:347
+msgid "You are not on a form submission button or normal link."
+msgstr ""
+
+#. #define NEED_CHECKED_RADIO_BUTTON
+#: LYMessages.c:349
+msgid "One radio button must be checked at all times!"
+msgstr ""
+
+#: LYMessages.c:350
+msgid "No submit button for this form, submit single text field?"
+msgstr ""
+
+#: LYMessages.c:351
+msgid "Do you want to go back to the previous document?"
+msgstr "是å¦è¿”回已經ç€è¦½éŽçš„文件?"
+
+#: LYMessages.c:352
+msgid "Use arrows or tab to move off of field."
+msgstr ""
+
+#. #define ENTER_TEXT_ARROWS_OR_TAB
+#: LYMessages.c:354
+msgid "Enter text. Use arrows or tab to move off of field."
+msgstr "請輸入文字。使用方å‘éµæˆ– tab éµé›¢é–‹æ¬„ä½ã€‚"
+
+#: LYMessages.c:355
+msgid "** Bad HTML!! No form action defined. **"
+msgstr ""
+
+#: LYMessages.c:356
+msgid "Bad HTML!! Unable to create popup window!"
+msgstr ""
+
+#: LYMessages.c:357
+msgid "Unable to create popup window!"
+msgstr ""
+
+#: LYMessages.c:358
+msgid "Goto a random URL is disallowed!"
+msgstr "ä¸å…許進入隨機的 URLï¼"
+
+#: LYMessages.c:359
+msgid "Goto a non-http URL is disallowed!"
+msgstr "ä¸å…許ç€è¦½éž http çš„ URLï¼"
+
+#: LYMessages.c:360
+#, c-format
+msgid "You are not allowed to goto \"%s\" URLs"
+msgstr "閣下ä¸å…許進入“%sâ€é¡žåž‹çš„ URL"
+
+#: LYMessages.c:361
+msgid "URL to open: "
+msgstr "準備開啟的 URL:"
+
+#: LYMessages.c:362
+msgid "Edit the current Goto URL: "
+msgstr "修改目å‰çš„ URL:"
+
+#: LYMessages.c:363
+msgid "Edit the previous Goto URL: "
+msgstr "修改曾經ç€è¦½çš„ URL:"
+
+#: LYMessages.c:364
+msgid "Edit a previous Goto URL: "
+msgstr "修改曾經ç€è¦½çš„ URL:"
+
+#: LYMessages.c:365
+msgid "Current document has POST data."
+msgstr "ç›®å‰çš„文件載有 POST 資料。"
+
+#: LYMessages.c:366
+msgid "Edit this document's URL: "
+msgstr "修改本文件的 URL:"
+
+#: LYMessages.c:367
+msgid "Edit the current link's URL: "
+msgstr "修改目å‰é¸å–çš„éˆçµçš„ URL:"
+
+#: LYMessages.c:368
+msgid "You cannot edit File Management URLs"
+msgstr "ä¸å¯ä¿®æ”¹æœ‰é—œæª”案管ç†çš„ URL"
+
+#: LYMessages.c:369
+msgid "Enter a database query: "
+msgstr ""
+
+#: LYMessages.c:370
+msgid "Enter a whereis query: "
+msgstr "輸入準備æœå°‹çš„字串:"
+
+#: LYMessages.c:371
+msgid "Edit the current query: "
+msgstr "修改目å‰æº–å‚™æœå°‹çš„字串:"
+
+#: LYMessages.c:372
+msgid "Edit the previous query: "
+msgstr "修改之å‰æº–å‚™æœå°‹çš„字串:"
+
+#: LYMessages.c:373
+msgid "Edit a previous query: "
+msgstr "修改之å‰æº–å‚™æœå°‹çš„字串:"
+
+#. #define USE_C_R_TO_RESUB_CUR_QUERY
+#: LYMessages.c:375
+msgid "Use Control-R to resubmit the current query."
+msgstr ""
+
+#: LYMessages.c:376
+msgid "Edit the current shortcut: "
+msgstr ""
+
+#: LYMessages.c:377
+msgid "Edit the previous shortcut: "
+msgstr ""
+
+#: LYMessages.c:378
+msgid "Edit a previous shortcut: "
+msgstr ""
+
+#: LYMessages.c:379
+#, c-format
+msgid "Key '%c' is not mapped to a jump file!"
+msgstr ""
+
+#: LYMessages.c:380
+msgid "Cannot locate jump file!"
+msgstr ""
+
+#: LYMessages.c:381
+msgid "Cannot open jump file!"
+msgstr ""
+
+#: LYMessages.c:382
+msgid "Error reading jump file!"
+msgstr ""
+
+#: LYMessages.c:383
+msgid "Out of memory reading jump file!"
+msgstr ""
+
+#: LYMessages.c:384
+msgid "Out of memory reading jump table!"
+msgstr ""
+
+#: LYMessages.c:385
+msgid "No index is currently available."
+msgstr ""
+
+#. #define CONFIRM_MAIN_SCREEN
+#: LYMessages.c:387
+msgid "Do you really want to go to the Main screen?"
+msgstr "是å¦ç¢ºå®šè¦ç€è¦½ä¸»ç•«é¢ï¼Ÿ"
+
+#: LYMessages.c:388
+msgid "You are already at main screen!"
+msgstr "已經在主畫é¢äº†ï¼"
+
+#. #define NOT_ISINDEX
+#: LYMessages.c:390
+msgid "Not a searchable indexed document -- press '/' to search for a text string"
+msgstr "ä¸æ˜¯å¯é€²è¡Œæœå°‹çš„索引文件 ─ 請按‘/’æœå°‹å­—串"
+
+#. #define NO_OWNER
+#: LYMessages.c:392
+msgid "No owner is defined for this file so you cannot send a comment"
+msgstr ""
+
+#: LYMessages.c:393
+#, c-format
+msgid "No owner is defined. Use %s?"
+msgstr ""
+
+#: LYMessages.c:394
+msgid "Do you wish to send a comment?"
+msgstr ""
+
+#: LYMessages.c:395
+msgid "Mail is disallowed so you cannot send a comment"
+msgstr ""
+
+#: LYMessages.c:396
+msgid "The 'e'dit command is currently disabled."
+msgstr "æš«åœä½¿ç”¨ã€Œç·¨è¼¯ã€('e') 指令。"
+
+#: LYMessages.c:397
+msgid "External editing is currently disabled."
+msgstr "æš«åœä½¿ç”¨å¤–部的編輯器。"
+
+#: LYMessages.c:398
+msgid "System error - failure to get status."
+msgstr "系統錯誤 ─ 無法得知狀態。"
+
+#: LYMessages.c:399
+msgid "No editor is defined!"
+msgstr "未指定編輯器ï¼"
+
+#: LYMessages.c:400
+msgid "The 'p'rint command is currently disabled."
+msgstr "æš«åœä½¿ç”¨ã€Œåˆ—å°ã€('p') 指令。"
+
+#: LYMessages.c:401
+msgid "Document has no Toolbar links or Banner."
+msgstr ""
+
+#: LYMessages.c:402
+msgid "Unable to open traversal file."
+msgstr ""
+
+#: LYMessages.c:403
+msgid "Unable to open traversal found file."
+msgstr ""
+
+#: LYMessages.c:404
+msgid "Unable to open reject file."
+msgstr ""
+
+#: LYMessages.c:405
+msgid "Unable to open traversal errors output file"
+msgstr ""
+
+#: LYMessages.c:406
+msgid "TRAVERSAL WAS INTERRUPTED"
+msgstr ""
+
+#: LYMessages.c:407
+msgid "Follow link (or goto link or page) number: "
+msgstr ""
+
+#: LYMessages.c:408
+msgid "Select option (or page) number: "
+msgstr "è«‹é¸å–é¸é …編號(或é æ•¸):"
+
+#: LYMessages.c:409
+#, c-format
+msgid "Option number %d already is current."
+msgstr "é¸é …編號 %d 已經是目å‰çš„é¸é …。"
+
+#. #define ALREADY_AT_OPTION_END
+#: LYMessages.c:411
+msgid "You are already at the end of this option list."
+msgstr "已經在é¸é …清單的çµæŸéƒ¨ä»½äº†ã€‚"
+
+#. #define ALREADY_AT_OPTION_BEGIN
+#: LYMessages.c:413
+msgid "You are already at the beginning of this option list."
+msgstr "已經在é¸é …清單的開始部份了。"
+
+#. #define ALREADY_AT_OPTION_PAGE
+#: LYMessages.c:415
+#, c-format
+msgid "You are already at page %d of this option list."
+msgstr "已經在é¸é …清單的第 %d é äº†ã€‚"
+
+#: LYMessages.c:416
+msgid "You have entered an invalid option number."
+msgstr "閣下輸入了無效的é¸é …編號。"
+
+#: LYMessages.c:417
+msgid "** Bad HTML!! Use -trace to diagnose. **"
+msgstr ""
+
+#: LYMessages.c:418
+msgid "Give name of file to save in"
+msgstr ""
+
+#: LYMessages.c:419
+msgid "Can't save data to file -- please run WWW locally"
+msgstr ""
+
+#: LYMessages.c:420
+msgid "Can't open temporary file!"
+msgstr "無法開啟暫存檔ï¼"
+
+#: LYMessages.c:421
+msgid "Can't open output file! Cancelling!"
+msgstr "無法開啟輸出檔ï¼å–消輸出ï¼"
+
+#: LYMessages.c:422
+msgid "Execution is disabled."
+msgstr ""
+
+#. #define EXECUTION_DISABLED_FOR_FILE
+#: LYMessages.c:424
+#, c-format
+msgid "Execution is not enabled for this file. See the Options menu (use %s)."
+msgstr ""
+
+#. #define EXECUTION_NOT_COMPILED
+#: LYMessages.c:426
+msgid "Execution capabilities are not compiled into this version."
+msgstr ""
+
+#: LYMessages.c:427
+msgid "This file cannot be displayed on this terminal."
+msgstr "無法在本終端機顯示該檔案。"
+
+#. #define CANNOT_DISPLAY_FILE_D_OR_C
+#: LYMessages.c:429
+msgid "This file cannot be displayed on this terminal: D)ownload, or C)ancel"
+msgstr "無法在本終端機顯示該檔案: D)下載 C)å–消"
+
+#: LYMessages.c:430
+#, c-format
+msgid "%s D)ownload, or C)ancel"
+msgstr "%s D)下載 C)å–消"
+
+#: LYMessages.c:431
+msgid "Cancelling file."
+msgstr "å–消接收檔案。"
+
+#: LYMessages.c:432
+msgid "Retrieving file. - PLEASE WAIT -"
+msgstr "正在接收檔案。─ è«‹ç¨ç­‰ ─"
+
+#: LYMessages.c:433
+msgid "Enter a filename: "
+msgstr "請輸入檔案å稱:"
+
+#: LYMessages.c:434
+msgid "Edit the previous filename: "
+msgstr "修改以往使用的檔案å稱:"
+
+#: LYMessages.c:435
+msgid "Edit a previous filename: "
+msgstr "修改以往使用的檔案å稱:"
+
+#: LYMessages.c:436
+msgid "Enter a new filename: "
+msgstr "請輸入新的檔案å稱:"
+
+#: LYMessages.c:437
+msgid "File name may not begin with a dot."
+msgstr ""
+
+#: LYMessages.c:439
+msgid "File exists. Create higher version?"
+msgstr ""
+
+#: LYMessages.c:441
+msgid "File exists. Overwrite?"
+msgstr "檔案已存在。是å¦è¦†å¯«ï¼Ÿ"
+
+#: LYMessages.c:443
+msgid "Cannot write to file."
+msgstr "無法寫入檔案。"
+
+#: LYMessages.c:444
+msgid "ERROR! - download command is misconfigured."
+msgstr "錯誤ï¼â”€ 有關下載的指令ä»æœªè¨­å®šå¥½ã€‚"
+
+#: LYMessages.c:445
+msgid "Unable to download file."
+msgstr "無法下載檔案。"
+
+#: LYMessages.c:446
+msgid "Reading directory..."
+msgstr "正在讀å–目錄..."
+
+#: LYMessages.c:447
+msgid "Building directory listing..."
+msgstr "正在製作目錄清單..."
+
+#: LYMessages.c:448
+msgid "Saving..."
+msgstr "儲存中..."
+
+#: LYMessages.c:449
+#, c-format
+msgid "Could not edit file '%s'."
+msgstr "無法編輯檔案‘%s’。"
+
+#: LYMessages.c:450
+msgid "Unable to access document!"
+msgstr "無法存å–文件ï¼"
+
+#: LYMessages.c:451
+msgid "Could not access file."
+msgstr "無法存å–檔案。"
+
+#: LYMessages.c:452
+msgid "Could not access directory."
+msgstr "無法存å–目錄。"
+
+#: LYMessages.c:453
+msgid "Could not load data."
+msgstr "無法載入資料。"
+
+#. #define CANNOT_EDIT_REMOTE_FILES
+#: LYMessages.c:455
+msgid "Lynx cannot currently (e)dit remote WWW files."
+msgstr "ç›®å‰ Lynx 無法編輯é ç«¯çš„ WWW 檔案。"
+
+#. #define CANNOT_EDIT_FIELD
+#: LYMessages.c:457
+msgid "This field cannot be (e)dited with an external editor."
+msgstr "本欄ä½ç„¡æ³•ä½¿ç”¨å¤–部的編輯器來編輯。"
+
+#: LYMessages.c:458
+msgid "Bad rule"
+msgstr ""
+
+#: LYMessages.c:459
+msgid "Insufficient operands:"
+msgstr ""
+
+#: LYMessages.c:460
+msgid "You are not authorized to edit this file."
+msgstr "閣下未ç²æŽˆæ¬Šä¿®æ”¹æœ¬æª”案。"
+
+#: LYMessages.c:461
+msgid "Title: "
+msgstr "標題:"
+
+#: LYMessages.c:462
+msgid "Subject: "
+msgstr "主題:"
+
+#: LYMessages.c:463
+msgid "Username: "
+msgstr "帳戶å稱:"
+
+#: LYMessages.c:464
+msgid "Password: "
+msgstr "密碼:"
+
+#: LYMessages.c:465
+msgid "lynx: Username and Password required!!!"
+msgstr "lynx:需è¦å¸³æˆ¶å稱åŠå¯†ç¢¼!!!"
+
+#: LYMessages.c:466
+msgid "lynx: Password required!!!"
+msgstr "lynx:需è¦å¯†ç¢¼!!!"
+
+#: LYMessages.c:467
+msgid "Clear all authorization info for this session?"
+msgstr ""
+
+#: LYMessages.c:468
+msgid "Authorization info cleared."
+msgstr "已清除èªè­‰è³‡è¨Šã€‚"
+
+#: LYMessages.c:469
+msgid "Authorization failed. Retry?"
+msgstr "èªè­‰å¤±æ•—。是å¦é‡è©¦ï¼Ÿ"
+
+#: LYMessages.c:470
+msgid "cgi support has been disabled."
+msgstr "æš«åœæ”¯æ´ cgi 功能。"
+
+#. #define CGI_NOT_COMPILED
+#: LYMessages.c:472
+msgid "Lynxcgi capabilities are not compiled into this version."
+msgstr "編譯時並沒有加入 lynxcgi 功能。"
+
+#: LYMessages.c:473
+#, c-format
+msgid "Sorry, no known way of converting %s to %s."
+msgstr "抱歉,沒有已知的方法å¯ä»¥å°‡ %s 轉æ›è‡³ %s。"
+
+#: LYMessages.c:474
+msgid "Unable to set up connection."
+msgstr "無法建立連線。"
+
+#: LYMessages.c:475
+msgid "Unable to make connection"
+msgstr "無法建立連線。"
+
+#. #define MALFORMED_EXEC_REQUEST
+#: LYMessages.c:477
+msgid "Executable link rejected due to malformed request."
+msgstr ""
+
+#. #define BADCHAR_IN_EXEC_LINK
+#: LYMessages.c:479
+#, c-format
+msgid "Executable link rejected due to `%c' character."
+msgstr ""
+
+#. #define RELPATH_IN_EXEC_LINK
+#: LYMessages.c:481
+msgid "Executable link rejected due to relative path string ('../')."
+msgstr ""
+
+#. #define BADLOCPATH_IN_EXEC_LINK
+#: LYMessages.c:483
+msgid "Executable link rejected due to location or path."
+msgstr ""
+
+#: LYMessages.c:484
+msgid "Mail access is disabled!"
+msgstr ""
+
+#. #define ACCESS_ONLY_LOCALHOST
+#: LYMessages.c:486
+msgid "Only files and servers on the local host can be accessed."
+msgstr ""
+
+#: LYMessages.c:487
+msgid "Telnet access is disabled!"
+msgstr ""
+
+#. #define TELNET_PORT_SPECS_DISABLED
+#: LYMessages.c:489
+msgid "Telnet port specifications are disabled."
+msgstr ""
+
+#: LYMessages.c:490
+msgid "USENET news access is disabled!"
+msgstr ""
+
+#: LYMessages.c:491
+msgid "Rlogin access is disabled!"
+msgstr ""
+
+#: LYMessages.c:492
+msgid "Ftp access is disabled!"
+msgstr ""
+
+#: LYMessages.c:493
+msgid "There are no references from this document."
+msgstr ""
+
+#: LYMessages.c:494
+msgid "There are only hidden links from this document."
+msgstr ""
+
+#: LYMessages.c:496
+msgid "Unable to open command file."
+msgstr ""
+
+#: LYMessages.c:498
+msgid "News Post Cancelled!!!"
+msgstr ""
+
+#. #define SPAWNING_EDITOR_FOR_NEWS
+#: LYMessages.c:500
+msgid "Spawning your selected editor to edit news message"
+msgstr ""
+
+#: LYMessages.c:501
+msgid "Post this message?"
+msgstr ""
+
+#: LYMessages.c:502
+#, c-format
+msgid "Append '%s'?"
+msgstr ""
+
+#: LYMessages.c:503
+msgid "Posting to newsgroup(s)..."
+msgstr ""
+
+#: LYMessages.c:505
+msgid "*** You have unread mail. ***"
+msgstr "*** 有未讀的郵件。 ***"
+
+#: LYMessages.c:507
+msgid "*** You have mail. ***"
+msgstr "*** 有郵件。 ***"
+
+#: LYMessages.c:509
+msgid "*** You have new mail. ***"
+msgstr "*** 有新郵件。 ***"
+
+#: LYMessages.c:510
+msgid "File insert cancelled!!!"
+msgstr ""
+
+#: LYMessages.c:511
+msgid "Not enough memory for file!"
+msgstr "記憶體ä¸è¶³ä»¥è¼‰å…¥æª”案ï¼"
+
+#: LYMessages.c:512
+msgid "Can't open file for reading."
+msgstr "無法開啟準備讀入的檔案。"
+
+#: LYMessages.c:513
+msgid "File does not exist."
+msgstr "檔案ä¸å­˜åœ¨ã€‚"
+
+#: LYMessages.c:514
+msgid "File does not exist - reenter or cancel:"
+msgstr "檔案ä¸å­˜åœ¨ ─ è«‹é‡æ–°è¼¸å…¥æˆ–å–消:"
+
+#: LYMessages.c:515
+msgid "File is not readable."
+msgstr ""
+
+#: LYMessages.c:516
+msgid "File is not readable - reenter or cancel:"
+msgstr ""
+
+#: LYMessages.c:517
+msgid "Nothing to insert - file is 0-length."
+msgstr ""
+
+#: LYMessages.c:518
+msgid "Save request cancelled!!!"
+msgstr "å·²å–消儲存的è¦æ±‚!!!"
+
+#: LYMessages.c:519
+msgid "Mail request cancelled!!!"
+msgstr ""
+
+#. #define CONFIRM_MAIL_SOURCE_PREPARSED
+#: LYMessages.c:521
+msgid "Viewing preparsed source. Are you sure you want to mail it?"
+msgstr ""
+
+#: LYMessages.c:522
+msgid "Please wait..."
+msgstr "è«‹ç¨ç­‰..."
+
+#: LYMessages.c:523
+msgid "Mailing file. Please wait..."
+msgstr "正在寄出檔案。請ç¨ç­‰..."
+
+#: LYMessages.c:524
+msgid "ERROR - Unable to mail file"
+msgstr "錯誤 ─ 無法寄出檔案"
+
+#. #define CONFIRM_LONG_SCREEN_PRINT
+#: LYMessages.c:526
+#, c-format
+msgid "File is %d screens long. Are you sure you want to print?"
+msgstr "檔案長度為 %d 個畫é¢ã€‚是å¦ç¢ºå®šè¦åˆ—å°ï¼Ÿ"
+
+#: LYMessages.c:527
+msgid "Print request cancelled!!!"
+msgstr "å·²å–消列å°çš„è¦æ±‚!!!"
+
+#: LYMessages.c:528
+msgid "Press <return> to begin: "
+msgstr "請按 <return> 開始:"
+
+#: LYMessages.c:529
+msgid "Press <return> to finish: "
+msgstr "請按 <return> çµæŸï¼š"
+
+#. #define CONFIRM_LONG_PAGE_PRINT
+#: LYMessages.c:531
+#, c-format
+msgid "File is %d pages long. Are you sure you want to print?"
+msgstr "檔案長度為 %d é ã€‚是å¦ç¢ºå®šè¦åˆ—å°ï¼Ÿ"
+
+#. #define CHECK_PRINTER
+#: LYMessages.c:533
+msgid "Be sure your printer is on-line. Press <return> to start printing:"
+msgstr ""
+
+#: LYMessages.c:534
+msgid "ERROR - Unable to allocate file space!!!"
+msgstr "錯誤 ─ 無法分é…檔案空間!!!"
+
+#: LYMessages.c:535
+msgid "Unable to open tempfile"
+msgstr "無法開啟暫存檔"
+
+#: LYMessages.c:536
+msgid "Unable to open print options file"
+msgstr ""
+
+#: LYMessages.c:537
+msgid "Printing file. Please wait..."
+msgstr "正在列å°æª”案。請ç¨ç­‰..."
+
+#: LYMessages.c:538
+msgid "Please enter a valid internet mail address: "
+msgstr "請輸入有效的電郵地å€ï¼š"
+
+#: LYMessages.c:539
+msgid "ERROR! - printer is misconfigured!"
+msgstr "éŒ¯èª¤ï¼ - å°è¡¨æ©Ÿè¨­å®šéŒ¯èª¤ï¼"
+
+#: LYMessages.c:540
+msgid "Image map from POST response not available!"
+msgstr ""
+
+#: LYMessages.c:541
+msgid "Misdirected client-side image MAP request!"
+msgstr ""
+
+#: LYMessages.c:542
+msgid "Client-side image MAP is not accessible!"
+msgstr ""
+
+#: LYMessages.c:543
+msgid "No client-side image MAPs are available!"
+msgstr ""
+
+#: LYMessages.c:544
+msgid "Client-side image MAP is not available!"
+msgstr ""
+
+#. #define OPTION_SCREEN_NEEDS_24
+#: LYMessages.c:547
+msgid "Screen height must be at least 24 lines for the Options menu!"
+msgstr "在é¸é …設定中,畫é¢é«˜åº¦å¿…須最少有 24 è¡Œï¼"
+
+#. #define OPTION_SCREEN_NEEDS_23
+#: LYMessages.c:549
+msgid "Screen height must be at least 23 lines for the Options menu!"
+msgstr "在é¸é …設定中,畫é¢é«˜åº¦å¿…須最少有 23 è¡Œï¼"
+
+#. #define OPTION_SCREEN_NEEDS_22
+#: LYMessages.c:551
+msgid "Screen height must be at least 22 lines for the Options menu!"
+msgstr "在é¸é …設定中,畫é¢é«˜åº¦å¿…須最少有 22 è¡Œï¼"
+
+#: LYMessages.c:553
+msgid "That key requires Advanced User mode."
+msgstr ""
+
+#: LYMessages.c:554
+#, c-format
+msgid "Content-type: %s"
+msgstr "Content-type:%s"
+
+#: LYMessages.c:555
+msgid "Command: "
+msgstr "指令:"
+
+#: LYMessages.c:556
+msgid "Unknown or ambiguous command"
+msgstr "ä¸æ˜Žæˆ–æ„義å«ç³Šçš„指令"
+
+#: LYMessages.c:557
+msgid " Version "
+msgstr " 版本 "
+
+#: LYMessages.c:558
+msgid " first"
+msgstr " (首先測試)"
+
+#: LYMessages.c:559
+msgid ", guessing..."
+msgstr ",正在估計..."
+
+#: LYMessages.c:560
+msgid "Permissions for "
+msgstr ""
+
+#: LYMessages.c:561
+msgid "Select "
+msgstr ""
+
+#: LYMessages.c:562
+msgid "capital letter"
+msgstr ""
+
+#: LYMessages.c:563
+msgid " of option line,"
+msgstr ""
+
+#: LYMessages.c:564
+msgid " to save,"
+msgstr " 儲存 "
+
+#: LYMessages.c:565
+msgid " to "
+msgstr ""
+
+#: LYMessages.c:566
+msgid " or "
+msgstr " 或是 "
+
+#: LYMessages.c:567
+msgid " index"
+msgstr ""
+
+#: LYMessages.c:568
+msgid " to return to Lynx."
+msgstr " 返回 Lynx。"
+
+#: LYMessages.c:569
+msgid "Accept Changes"
+msgstr "接å—更改"
+
+#: LYMessages.c:570
+msgid "Reset Changes"
+msgstr "é‡è¨­é¸é …"
+
+#: LYMessages.c:571
+msgid "Left Arrow cancels changes"
+msgstr "左箭咀éµå–消更改é¸é …"
+
+#: LYMessages.c:572
+msgid "Save options to disk"
+msgstr "å°‡é¸é …儲存於ç£ç¢Ÿä¸­"
+
+#: LYMessages.c:573
+msgid "Hit RETURN to accept entered data."
+msgstr "按 RETURN 接å—輸入的資料。"
+
+#. #define ACCEPT_DATA_OR_DEFAULT
+#: LYMessages.c:575
+msgid "Hit RETURN to accept entered data. Delete data to invoke the default."
+msgstr ""
+
+#: LYMessages.c:576
+msgid "Value accepted!"
+msgstr "已接å—設定值ï¼"
+
+#. #define VALUE_ACCEPTED_WARNING_X
+#: LYMessages.c:578
+msgid "Value accepted! -- WARNING: Lynx is configured for XWINDOWS!"
+msgstr "已接å—設定值ï¼â”€ 警告:Lynx 設定了åªåœ¨ XWINDOW é©ç”¨ï¼"
+
+#. #define VALUE_ACCEPTED_WARNING_NONX
+#: LYMessages.c:580
+msgid "Value accepted! -- WARNING: Lynx is NOT configured for XWINDOWS!"
+msgstr "已接å—設定值ï¼â”€ 警告:Lynx 設定了ä¸é©ç”¨æ–¼ XWINDOWï¼"
+
+#: LYMessages.c:581
+msgid "You are not allowed to change which editor to use!"
+msgstr "ä¸å…許自行指定使用的編輯器ï¼"
+
+#: LYMessages.c:582
+msgid "Failed to set DISPLAY variable!"
+msgstr "無法設定 DISPLAY 環境變數ï¼"
+
+#: LYMessages.c:583
+msgid "Failed to clear DISPLAY variable!"
+msgstr "無法清除 DISPLAY 環境變數ï¼"
+
+#. #define BOOKMARK_CHANGE_DISALLOWED
+#: LYMessages.c:585
+msgid "You are not allowed to change the bookmark file!"
+msgstr "ä¸å…許更改書籤檔ï¼"
+
+#: LYMessages.c:586
+msgid "Terminal does not support color"
+msgstr "終端機ä¸æ”¯æ´è‰²å½©"
+
+#: LYMessages.c:587
+#, c-format
+msgid "Your '%s' terminal does not support color."
+msgstr "‘%s’終端機ä¸æ”¯æ´è‰²å½©"
+
+#: LYMessages.c:588
+msgid "Access to dot files is disabled!"
+msgstr ""
+
+#. #define UA_NO_LYNX_WARNING
+#: LYMessages.c:590
+msgid "User-Agent string does not contain \"Lynx\" or \"L_y_n_x\""
+msgstr "User-Agent 字串ä¸åŒ…括“Lynxâ€æˆ–“L_y_n_xâ€"
+
+#. #define UA_PLEASE_USE_LYNX
+#: LYMessages.c:592
+msgid "Use \"L_y_n_x\" or \"Lynx\" in User-Agent, or it looks like intentional deception!"
+msgstr ""
+
+#. #define UA_CHANGE_DISABLED
+#: LYMessages.c:594
+msgid "Changing of the User-Agent string is disabled!"
+msgstr "ä¸å…許更改 User-Agent 字串ï¼"
+
+#. #define CHANGE_OF_SETTING_DISALLOWED
+#: LYMessages.c:596
+msgid "You are not allowed to change this setting."
+msgstr "ä¸å…許更改此項設定。"
+
+#: LYMessages.c:597
+msgid "Saving Options..."
+msgstr "正在儲存é¸é …..."
+
+#: LYMessages.c:598
+msgid "Options saved!"
+msgstr "已儲存é¸é …ï¼"
+
+#: LYMessages.c:599
+msgid "Unable to save Options!"
+msgstr "無法儲存é¸é …ï¼"
+
+#: LYMessages.c:600
+msgid " 'r' to return to Lynx "
+msgstr "請按‘r’返回 Lynx "
+
+#: LYMessages.c:601
+msgid " '>' to save, or 'r' to return to Lynx "
+msgstr "按‘>’儲存,或是按‘r’返回 Lynx "
+
+#. #define ANY_KEY_CHANGE_RET_ACCEPT
+#: LYMessages.c:603
+msgid "Hit any key to change value; RETURN to accept."
+msgstr ""
+
+#: LYMessages.c:604
+msgid "Error uncompressing temporary file!"
+msgstr "將暫存檔解壓時發生錯誤ï¼"
+
+#: LYMessages.c:605
+msgid "Unsupported URL scheme!"
+msgstr ""
+
+#: LYMessages.c:606
+msgid "Unsupported data: URL! Use SHOWINFO, for now."
+msgstr ""
+
+#: LYMessages.c:607
+msgid "Redirection limit of 10 URL's reached."
+msgstr "å·²é”到 URL é‡æ–°å°Žå‘次數的é™åˆ¶ (10 次)。"
+
+#: LYMessages.c:608
+msgid "Illegal redirection URL received from server!"
+msgstr ""
+
+#. #define SERVER_ASKED_FOR_REDIRECTION
+#: LYMessages.c:610
+#, c-format
+msgid "Server asked for %d redirection of POST content to"
+msgstr ""
+
+#: LYMessages.c:613
+msgid "P)roceed, use G)ET or C)ancel "
+msgstr ""
+
+#: LYMessages.c:614
+msgid "P)roceed, or C)ancel "
+msgstr "P)繼續 C)å–消"
+
+#. #define ADVANCED_POST_GET_REDIRECT
+#: LYMessages.c:616
+msgid "Redirection of POST content. P)roceed, see U)RL, use G)ET or C)ancel"
+msgstr ""
+
+#. #define ADVANCED_POST_REDIRECT
+#: LYMessages.c:618
+msgid "Redirection of POST content. P)roceed, see U)RL, or C)ancel"
+msgstr ""
+
+#. #define CONFIRM_POST_RESUBMISSION
+#: LYMessages.c:620
+msgid "Document from Form with POST content. Resubmit?"
+msgstr ""
+
+#. #define CONFIRM_POST_RESUBMISSION_TO
+#: LYMessages.c:622
+#, c-format
+msgid "Resubmit POST content to %s ?"
+msgstr ""
+
+#. #define CONFIRM_POST_LIST_RELOAD
+#: LYMessages.c:624
+#, c-format
+msgid "List from document with POST data. Reload %s ?"
+msgstr ""
+
+#. #define CONFIRM_POST_DOC_HEAD
+#: LYMessages.c:626
+msgid "Document from POST action, HEAD may not be understood. Proceed?"
+msgstr ""
+
+#. #define CONFIRM_POST_LINK_HEAD
+#: LYMessages.c:628
+msgid "Form submit action is POST, HEAD may not be understood. Proceed?"
+msgstr ""
+
+#: LYMessages.c:629
+msgid "Proceed without a username and password?"
+msgstr ""
+
+#: LYMessages.c:630
+#, c-format
+msgid "Proceed (%s)?"
+msgstr "是å¦ç¹¼çºŒ (%s)?"
+
+#: LYMessages.c:631
+msgid "Cannot POST to this host."
+msgstr "ç„¡æ³•å‚³é€ POST 資料至該主機。"
+
+#: LYMessages.c:632
+msgid "POST not supported for this URL - ignoring POST data!"
+msgstr ""
+
+#: LYMessages.c:633
+msgid "Discarding POST data..."
+msgstr "æ¨æ£„ POST 資料..."
+
+#: LYMessages.c:634
+msgid "Document will not be reloaded!"
+msgstr "ä¸æœƒé‡æ–°è¼‰å…¥æ–‡ä»¶ï¼"
+
+#: LYMessages.c:635
+msgid "Location: "
+msgstr "ä½ç½®ï¼š"
+
+#: LYMessages.c:636
+#, c-format
+msgid "'%s' not found!"
+msgstr "找ä¸åˆ°â€˜%s’ï¼"
+
+#: LYMessages.c:637
+msgid "Default Bookmark File"
+msgstr "é è¨­æ›¸ç±¤æª”"
+
+#: LYMessages.c:638
+msgid "Screen too small! (8x35 min)"
+msgstr "ç•«é¢å¤ªå°ï¼(æœ€å° 8x35)"
+
+#: LYMessages.c:639
+msgid "Select destination or ^G to Cancel: "
+msgstr "è«‹é¸æ“‡ç›®çš„地或按 ^G å–消:"
+
+#. #define MULTIBOOKMARKS_SELECT
+#: LYMessages.c:641
+msgid "Select subbookmark, '=' for menu, or ^G to cancel: "
+msgstr ""
+
+#. #define MULTIBOOKMARKS_SELF
+#: LYMessages.c:643
+msgid "Reproduce L)ink in this bookmark file or C)ancel? (l,c): "
+msgstr ""
+
+#: LYMessages.c:644
+msgid "Multiple bookmark support is not available."
+msgstr "無法æ供多書籤檔的支æ´ã€‚"
+
+#: LYMessages.c:645
+#, c-format
+msgid " Select Bookmark (screen %d of %d)"
+msgstr ""
+
+#: LYMessages.c:646
+msgid " Select Bookmark"
+msgstr " é¸æ“‡æ›¸ç±¤"
+
+#. #define MULTIBOOKMARKS_EHEAD_MASK
+#: LYMessages.c:648
+#, c-format
+msgid "Editing Bookmark DESCRIPTION and FILEPATH (%d of 2)"
+msgstr ""
+
+#. #define MULTIBOOKMARKS_EHEAD
+#: LYMessages.c:650
+msgid " Editing Bookmark DESCRIPTION and FILEPATH"
+msgstr " 修改有關書籤的說明åŠæª”案路徑"
+
+#: LYMessages.c:651
+msgid "Letter: "
+msgstr "å­—æ¯ï¼š"
+
+#. #define USE_PATH_OFF_HOME
+#: LYMessages.c:654
+msgid "Use a filepath off your login directory in SHELL syntax!"
+msgstr ""
+
+#: LYMessages.c:656
+msgid "Use a filepath off your home directory!"
+msgstr ""
+
+#. #define MAXLINKS_REACHED
+#: LYMessages.c:659
+msgid "Maximum links per page exceeded! Use half-page or two-line scrolling."
+msgstr ""
+
+#: LYMessages.c:660
+msgid "No previously visited links available!"
+msgstr "無法æ供之å‰ç€è¦½éŽçš„éˆçµï¼"
+
+#: LYMessages.c:661
+msgid "Memory exhausted! Program aborted!"
+msgstr "記憶體耗盡ï¼ç¨‹å¼å¿…須中止ï¼"
+
+#: LYMessages.c:662
+msgid "Memory exhausted! Aborting..."
+msgstr "記憶體耗盡ï¼ç¨‹å¼ä¸­æ­¢..."
+
+#: LYMessages.c:663
+msgid "Not enough memory!"
+msgstr "記憶體ä¸è¶³ï¼"
+
+#: LYMessages.c:664
+msgid "Directory/File Manager not available"
+msgstr "無法æ供目錄/檔案管ç†åŠŸèƒ½"
+
+#: LYMessages.c:665
+msgid "HREF in BASE tag is not an absolute URL."
+msgstr "BASE 標籤的 HREF ä¸æ˜¯æœ‰çµ•å°è·¯å¾‘çš„ URL。"
+
+#: LYMessages.c:666
+msgid "Location URL is not absolute."
+msgstr ""
+
+#: LYMessages.c:667
+msgid "Refresh URL is not absolute."
+msgstr "準備更新的 URL 中沒有絕å°è·¯å¾‘。"
+
+#. #define SENDING_MESSAGE_WITH_BODY_TO
+#: LYMessages.c:669
+msgid ""
+"You are sending a message with body to:\n"
+" "
+msgstr ""
+
+#: LYMessages.c:670
+msgid ""
+"You are sending a comment to:\n"
+" "
+msgstr ""
+
+#: LYMessages.c:671
+msgid ""
+"\n"
+" With copy to:\n"
+" "
+msgstr ""
+
+#: LYMessages.c:672
+msgid ""
+"\n"
+" With copies to:\n"
+" "
+msgstr ""
+
+#. #define CTRL_G_TO_CANCEL_SEND
+#: LYMessages.c:674
+msgid ""
+"\n"
+"\n"
+"Use Ctrl-G to cancel if you do not want to send a message\n"
+msgstr ""
+"\n"
+"\n"
+"如果ä¸æƒ³é€å‡ºè¨Šæ¯ï¼Œè«‹æŒ‰ Ctrl-G å–消\n"
+
+#. #define ENTER_NAME_OR_BLANK
+#: LYMessages.c:676
+msgid ""
+"\n"
+" Please enter your name, or leave it blank to remain anonymous\n"
+msgstr ""
+"\n"
+" 請輸入閣下的姓å,或是將å稱留空代表無åæ°\n"
+
+#. #define ENTER_MAIL_ADDRESS_OR_OTHER
+#: LYMessages.c:678
+msgid ""
+"\n"
+" Please enter a mail address or some other\n"
+msgstr ""
+"\n"
+" 如果需è¦å°æ–¹å›žè¦†ï¼Œè«‹å¡«ä¸Šé›»éƒµ\n"
+
+#. #define MEANS_TO_CONTACT_FOR_RESPONSE
+#: LYMessages.c:680
+msgid " means to contact you, if you desire a response.\n"
+msgstr " 地å€æˆ–其它è¯çµ¡æ–¹æ³•ã€‚\n"
+
+#: LYMessages.c:681
+msgid ""
+"\n"
+" Please enter a subject line.\n"
+msgstr ""
+"\n"
+" 請輸入標題。\n"
+
+#. #define ENTER_ADDRESS_FOR_CC
+#: LYMessages.c:683
+msgid ""
+"\n"
+" Enter a mail address for a CC of your message.\n"
+msgstr ""
+
+#: LYMessages.c:684
+msgid " (Leave blank if you don't want a copy.)\n"
+msgstr " (如果ä¸æƒ³æ”¶åˆ°å‰¯æœ¬è«‹å°‡æ­¤æ¬„留空。)\n"
+
+#: LYMessages.c:685
+msgid ""
+"\n"
+" Please review the message body:\n"
+"\n"
+msgstr ""
+"\n"
+" 請檢查訊æ¯å…§å®¹ï¼š\n"
+"\n"
+
+#: LYMessages.c:686
+msgid ""
+"\n"
+"Press RETURN to continue: "
+msgstr ""
+"\n"
+"請按 RETURN 繼續:"
+
+#: LYMessages.c:687
+msgid ""
+"\n"
+"Press RETURN to clean up: "
+msgstr ""
+
+#: LYMessages.c:688
+msgid " Use Control-U to erase the default.\n"
+msgstr " 請按 Control-U 清除é è¨­å€¼ã€‚\n"
+
+#: LYMessages.c:689
+msgid ""
+"\n"
+" Please enter your message below."
+msgstr ""
+"\n"
+" 請在以下的地方輸入訊æ¯ã€‚"
+
+#. #define ENTER_PERIOD_WHEN_DONE_A
+#: LYMessages.c:691 src/LYNews.c:360
+msgid ""
+"\n"
+" When you are done, press enter and put a single period (.)"
+msgstr ""
+"\n"
+" 完æˆå¾Œè«‹æŒ‰ enter,然後在下一行"
+
+#. #define ENTER_PERIOD_WHEN_DONE_B
+#: LYMessages.c:693 src/LYNews.c:361
+msgid ""
+"\n"
+" on a line and press enter again."
+msgstr ""
+"\n"
+" åªè¼¸å…¥ä¸€é»ž (.) 並且å†æŒ‰ enter。"
+
+#. Cookies messages
+#. #define ADVANCED_COOKIE_CONFIRMATION
+#: LYMessages.c:697
+#, c-format
+msgid "%s cookie: %.*s=%.*s Allow? (Y/N/Always/neVer)"
+msgstr "%s cookie:%.*s=%.*s 是å¦æŽ¥å—? (Y/N/Always/neVer)"
+
+#. #define INVALID_COOKIE_DOMAIN_CONFIRMATION
+#: LYMessages.c:699
+#, c-format
+msgid "Accept invalid cookie domain=%s for '%s'?"
+msgstr "是å¦æŽ¥å— domain=%s,一個由‘%s’發出的無效 cookie?"
+
+#. #define INVALID_COOKIE_PATH_CONFIRMATION
+#: LYMessages.c:701
+#, c-format
+msgid "Accept invalid cookie path=%s as a prefix of '%s'?"
+msgstr ""
+
+#: LYMessages.c:702
+msgid "Allowing this cookie."
+msgstr "接å—æ­¤ cookie。"
+
+#: LYMessages.c:703
+msgid "Rejecting this cookie."
+msgstr "拒絕此 cookie。"
+
+#: LYMessages.c:704
+msgid "The Cookie Jar is empty."
+msgstr "沒有儲存任何 cookie。"
+
+#: LYMessages.c:705
+#, fuzzy
+msgid "The Cache Jar is empty."
+msgstr "沒有儲存任何 cookie。"
+
+#. #define ACTIVATE_TO_GOBBLE
+#: LYMessages.c:707
+msgid "Activate links to gobble up cookies or entire domains,"
+msgstr ""
+
+#: LYMessages.c:708
+msgid "or to change a domain's 'allow' setting."
+msgstr ""
+
+#: LYMessages.c:709
+msgid "(Cookies never allowed.)"
+msgstr "(æ°¸ä¸æŽ¥å— cookie。)"
+
+#: LYMessages.c:710
+msgid "(Cookies always allowed.)"
+msgstr "(ä¸€å®šæŽ¥å— cookie。)"
+
+#: LYMessages.c:711
+msgid "(Cookies allowed via prompt.)"
+msgstr "(æ¯æ¬¡éƒ½è©¢å•ä½¿ç”¨è€…是å¦æŽ¥å— cookie。)"
+
+#: LYMessages.c:712
+msgid "(Persistent Cookies.)"
+msgstr ""
+
+#: LYMessages.c:713
+msgid "(No title.)"
+msgstr ""
+
+#: LYMessages.c:714
+msgid "(No name.)"
+msgstr ""
+
+#: LYMessages.c:715
+msgid "(No value.)"
+msgstr ""
+
+#: LYMessages.c:716 src/LYOptions.c:2402
+msgid "None"
+msgstr ""
+
+#: LYMessages.c:717
+msgid "(End of session.)"
+msgstr ""
+
+#: LYMessages.c:718
+msgid "Delete this cookie?"
+msgstr "是å¦åˆªé™¤è©² cookie?"
+
+#: LYMessages.c:719
+msgid "The cookie has been eaten!"
+msgstr "該 cookie 已經被刪除了ï¼"
+
+#: LYMessages.c:720
+msgid "Delete this empty domain?"
+msgstr "是å¦åˆªé™¤è©²ç©ºç™½çš„網域?"
+
+#: LYMessages.c:721
+msgid "The domain has been eaten!"
+msgstr "已經刪除該網域ï¼"
+
+#. #define DELETE_COOKIES_SET_ALLOW_OR_CANCEL
+#: LYMessages.c:723
+msgid "D)elete domain's cookies, set allow A)lways/P)rompt/neV)er, or C)ancel? "
+msgstr "D)刪除網域的 cookie A)ä¸€å®šæŽ¥å— cookie P)è©¢å•æ˜¯å¦æŽ¥å— V)æ°¸ä¸æŽ¥å— C)å–消"
+
+#. #define DELETE_DOMAIN_SET_ALLOW_OR_CANCEL
+#: LYMessages.c:725
+msgid "D)elete domain, set allow A)lways/P)rompt/neV)er, or C)ancel? "
+msgstr "D)刪除網域 A)ä¸€å®šæŽ¥å— cookie P)è©¢å•æ˜¯å¦æŽ¥å— V)æ°¸ä¸æŽ¥å— C)å–消"
+
+#: LYMessages.c:726
+msgid "All cookies in the domain have been eaten!"
+msgstr "已經刪除所有來自該網域的 cookieï¼"
+
+#: LYMessages.c:727
+#, c-format
+msgid "'A'lways allowing from domain '%s'."
+msgstr "一定接å—來自網域‘%s’的 cookie。"
+
+#: LYMessages.c:728
+#, c-format
+msgid "ne'V'er allowing from domain '%s'."
+msgstr "æ°¸é ä¸æŽ¥å—來自網域‘%s’的 cookie。"
+
+#: LYMessages.c:729
+#, c-format
+msgid "'P'rompting to allow from domain '%s'."
+msgstr "(æ¯æ¬¡éƒ½è©¢å•æ˜¯å¦æŽ¥å—來自網域‘%s’的 cookie。)"
+
+#: LYMessages.c:730
+msgid "Delete all cookies in this domain?"
+msgstr "是å¦åˆªé™¤æ‰€æœ‰ä¾†è‡ªè©²ç¶²åŸŸçš„ cookie?"
+
+#: LYMessages.c:731
+msgid "All of the cookies in the jar have been eaten!"
+msgstr "已經刪除所有 cookieï¼"
+
+#: LYMessages.c:733
+msgid "Port 19 not permitted in URLs."
+msgstr "URL 裡ä¸å…許使用連接埠號碼 19。"
+
+#: LYMessages.c:734
+msgid "Port 25 not permitted in URLs."
+msgstr "URL 裡ä¸å…許使用連接埠號碼 25。"
+
+#: LYMessages.c:735
+#, c-format
+msgid "Port %lu not permitted in URLs."
+msgstr "URL 裡ä¸å…許使用連接埠號碼 %lu。"
+
+#: LYMessages.c:736
+msgid "URL has a bad port field."
+msgstr ""
+
+#: LYMessages.c:737
+msgid "Maximum nesting of HTML elements exceeded."
+msgstr ""
+
+#: LYMessages.c:738
+msgid "Bad partial reference! Stripping lead dots."
+msgstr ""
+
+#: LYMessages.c:739
+msgid "Trace Log open failed. Trace off!"
+msgstr ""
+
+#: LYMessages.c:740
+msgid "Lynx Trace Log"
+msgstr ""
+
+#: LYMessages.c:741
+msgid "No trace log has been started for this session."
+msgstr ""
+
+#. #define MAX_TEMPCOUNT_REACHED
+#: LYMessages.c:743
+msgid "The maximum temporary file count has been reached!"
+msgstr "å·±é”到å¯æŽ¥å—的暫存檔數目上é™ï¼"
+
+#. #define FORM_VALUE_TOO_LONG
+#: LYMessages.c:745
+msgid "Form field value exceeds buffer length! Trim the tail."
+msgstr ""
+
+#. #define FORM_TAIL_COMBINED_WITH_HEAD
+#: LYMessages.c:747
+msgid "Modified tail combined with head of form field value."
+msgstr ""
+
+#. HTFile.c
+#: LYMessages.c:750
+msgid "Directory"
+msgstr "目錄"
+
+#: LYMessages.c:751
+msgid "Directory browsing is not allowed."
+msgstr "ä¸å…許ç€è¦½ç›®éŒ„。"
+
+#: LYMessages.c:752
+msgid "Selective access is not enabled for this directory"
+msgstr ""
+
+#: LYMessages.c:753
+msgid "Multiformat: directory scan failed."
+msgstr ""
+
+#: LYMessages.c:754
+msgid "This directory is not readable."
+msgstr "沒有讀å–該目錄的權é™ã€‚"
+
+#: LYMessages.c:755
+msgid "Can't access requested file."
+msgstr "無法存å–所è¦æ±‚的檔案。"
+
+#: LYMessages.c:756
+msgid "Could not find suitable representation for transmission."
+msgstr ""
+
+#: LYMessages.c:757
+msgid "Could not open file for decompression!"
+msgstr "無法開啟準備解壓的檔案ï¼"
+
+#: LYMessages.c:758
+msgid "Files:"
+msgstr "檔案:"
+
+#: LYMessages.c:759
+msgid "Subdirectories:"
+msgstr "副目錄:"
+
+#: LYMessages.c:760
+msgid " directory"
+msgstr " 目錄"
+
+#: LYMessages.c:761
+msgid "Up to "
+msgstr ""
+
+#: LYMessages.c:762
+msgid "Current directory is "
+msgstr "ç›®å‰çš„目錄是 "
+
+#. HTGopher.c
+#: LYMessages.c:765
+msgid "No response from server!"
+msgstr "伺æœå™¨æ²’有回應ï¼"
+
+#: LYMessages.c:766
+msgid "CSO index"
+msgstr "CSO 索引"
+
+#: LYMessages.c:767
+msgid ""
+"\n"
+"This is a searchable index of a CSO database.\n"
+msgstr ""
+
+#: LYMessages.c:768
+msgid "CSO Search Results"
+msgstr "CSO æœå°‹çµæžœ"
+
+#: LYMessages.c:769
+#, c-format
+msgid "Seek fail on %s\n"
+msgstr ""
+
+#: LYMessages.c:770
+msgid ""
+"\n"
+"Press the 's' key and enter search keywords.\n"
+msgstr ""
+"\n"
+"請按‘s’並輸入準備æœå°‹çš„é—œéµå­—。\n"
+
+#: LYMessages.c:771
+msgid ""
+"\n"
+"This is a searchable Gopher index.\n"
+msgstr ""
+"\n"
+"這是一個å¯ä»¥é€²è¡Œæœå°‹çš„ Gopher 索引。\n"
+
+#: LYMessages.c:772
+msgid "Gopher index"
+msgstr "Gopher 索引"
+
+#: LYMessages.c:773
+msgid "Gopher Menu"
+msgstr "Gopher é¸å–®"
+
+#: LYMessages.c:774
+msgid " Search Results"
+msgstr " æœå°‹çµæžœ"
+
+#: LYMessages.c:775
+msgid "Sending CSO/PH request."
+msgstr "正在é€å‡º CSO/PH è¦æ±‚。"
+
+#: LYMessages.c:776
+msgid "Sending Gopher request."
+msgstr "正在é€å‡º Gopher è¦æ±‚。"
+
+#: LYMessages.c:777
+msgid "CSO/PH request sent; waiting for response."
+msgstr "已進出 CSO/PH è¦æ±‚;正在等待回應。"
+
+#: LYMessages.c:778
+msgid "Gopher request sent; waiting for response."
+msgstr "已進出 Gopher è¦æ±‚;正在等待回應。"
+
+#: LYMessages.c:779
+msgid ""
+"\n"
+"Please enter search keywords.\n"
+msgstr ""
+"\n"
+"請輸入準備æœå°‹çš„é—œéµå­—。\n"
+
+#: LYMessages.c:780
+msgid ""
+"\n"
+"The keywords that you enter will allow you to search on a"
+msgstr ""
+
+#: LYMessages.c:781
+msgid " person's name in the database.\n"
+msgstr ""
+
+#. HTNews.c
+#: LYMessages.c:784
+msgid "Connection closed ???"
+msgstr "連線關閉了???"
+
+#: LYMessages.c:785
+msgid "Cannot open temporary file for news POST."
+msgstr ""
+
+#: LYMessages.c:786
+msgid "This client does not contain support for posting to news with SSL."
+msgstr ""
+
+#. HTStyle.c
+#: LYMessages.c:789
+#, c-format
+msgid "Style %d `%s' SGML:%s. Font %s %.1f point.\n"
+msgstr ""
+
+#: LYMessages.c:791
+#, c-format
+msgid "\tAlign=%d, %d tabs. (%.0f before, %.0f after)\n"
+msgstr ""
+
+#: LYMessages.c:792
+#, c-format
+msgid "\t\tTab kind=%d at %.0f\n"
+msgstr ""
+
+#. HTTP.c
+#: LYMessages.c:795
+msgid "Can't proceed without a username and password."
+msgstr "無法繼續,因為沒有帳戶å稱åŠå¯†ç¢¼ã€‚"
+
+#: LYMessages.c:796
+msgid "Can't retry with authorization! Contact the server's WebMaster."
+msgstr ""
+
+#: LYMessages.c:797
+msgid "Can't retry with proxy authorization! Contact the server's WebMaster."
+msgstr ""
+
+#: LYMessages.c:798
+msgid "Retrying with proxy authorization information."
+msgstr "以代ç†ä¼ºæœç¨‹å¼çš„èªè­‰è³‡è¨Šé‡æ–°å˜—試。"
+
+#: LYMessages.c:799
+#, fuzzy, c-format
+msgid "SSL error:%s-Continue?"
+msgstr "SSL 錯誤:主機(%s)ä¸ç¬¦åˆè­‰æ›¸(%s)。是å¦ç¹¼çºŒï¼Ÿ"
+
+#. HTWAIS.c
+#: LYMessages.c:802
+msgid "HTWAIS: Return message too large."
+msgstr "HTWAIS:回傳的訊æ¯éŽé•·ã€‚"
+
+#: LYMessages.c:803
+msgid "Enter WAIS query: "
+msgstr ""
+
+#. Miscellaneous status
+#: LYMessages.c:806
+msgid "Retrying as HTTP0 request."
+msgstr "以 HTTP0 æ ¼å¼é‡è©¦ã€‚"
+
+#: LYMessages.c:807
+#, c-format
+msgid "Transferred %d bytes"
+msgstr "已傳輸 %d ä½å…ƒçµ„"
+
+#: LYMessages.c:808
+msgid "Data transfer complete"
+msgstr "資料傳輸已完æˆ"
+
+#: LYMessages.c:809
+#, c-format
+msgid "Error processing line %d of %s\n"
+msgstr ""
+
+#. Lynx internal page titles
+#: LYMessages.c:812
+msgid "Address List Page"
+msgstr ""
+
+#: LYMessages.c:813
+msgid "Bookmark file"
+msgstr "書籤檔"
+
+#: LYMessages.c:814
+msgid "Configuration Definitions"
+msgstr ""
+
+#: LYMessages.c:815
+msgid "Cookie Jar"
+msgstr ""
+
+#: LYMessages.c:816
+msgid "Current Key Map"
+msgstr "ç›®å‰çš„按éµè¨­å®š"
+
+#: LYMessages.c:817
+msgid "File Management Options"
+msgstr "檔案管ç†é¸é …"
+
+#: LYMessages.c:818
+msgid "Download Options"
+msgstr "下載é¸é …"
+
+#: LYMessages.c:819
+msgid "History Page"
+msgstr "ç€è¦½ç´€éŒ„"
+
+#: LYMessages.c:820
+msgid "Cache Jar"
+msgstr ""
+
+#: LYMessages.c:821
+msgid "List Page"
+msgstr "éˆçµæ¸…å–®"
+
+#: LYMessages.c:822
+msgid "Lynx.cfg Information"
+msgstr "Lynx.cfg 資訊"
+
+#: LYMessages.c:823
+msgid "Converted Mosaic Hotlist"
+msgstr ""
+
+#: LYMessages.c:824
+msgid "Options Menu"
+msgstr "é¸é …設定"
+
+#: LYMessages.c:825
+msgid "File Permission Options"
+msgstr "檔案權é™é¸é …"
+
+#: LYMessages.c:826
+msgid "Printing Options"
+msgstr "列å°é¸é …"
+
+#: LYMessages.c:827
+msgid "Information about the current document"
+msgstr "有關目å‰çš„文件的資料"
+
+#: LYMessages.c:828
+msgid "Your recent statusline messages"
+msgstr "狀態列最近出ç¾çš„訊æ¯"
+
+#: LYMessages.c:829
+msgid "Upload Options"
+msgstr "上傳é¸é …"
+
+#: LYMessages.c:830
+msgid "Visited Links Page"
+msgstr ""
+
+#. CONFIG_DEF_TITLE subtitles
+#: LYMessages.c:833
+msgid "See also"
+msgstr ""
+
+#: LYMessages.c:834
+msgid "your"
+msgstr ""
+
+#: LYMessages.c:835
+msgid "for runtime options"
+msgstr ""
+
+#: LYMessages.c:836
+msgid "compile time options"
+msgstr "編譯é¸é …"
+
+#: LYMessages.c:837
+#, fuzzy
+msgid "color-style configuration"
+msgstr "主è¦çµ„æ…‹"
+
+#: LYMessages.c:838
+msgid "latest release"
+msgstr "最新版本"
+
+#: LYMessages.c:839
+msgid "pre-release version"
+msgstr "é è¦½ç‰ˆæœ¬"
+
+#: LYMessages.c:840
+msgid "development version"
+msgstr "開發中版本"
+
+#. #define AUTOCONF_CONFIG_CACHE
+#: LYMessages.c:842
+msgid ""
+"The following data were derived during the automatic configuration/build\n"
+"process of this copy of Lynx. When reporting a bug, please include a copy\n"
+"of this page."
+msgstr ""
+
+#. #define AUTOCONF_LYNXCFG_H
+#: LYMessages.c:846
+msgid ""
+"The following data were used as automatically-configured compile-time\n"
+"definitions when this copy of Lynx was built."
+msgstr ""
+
+#. #define DIRED_NOVICELINE
+#: LYMessages.c:851
+msgid " C)reate D)ownload E)dit F)ull menu M)odify R)emove T)ag U)pload \n"
+msgstr " C)建立 D)下載 E)編輯 F)完整é¸å–® M)修改 R)移除 T)標記 U)上傳\n"
+
+#: LYMessages.c:852
+msgid "Failed to obtain status of current link!"
+msgstr "無法ç²å–ç›®å‰çš„éˆçµçš„狀態ï¼"
+
+#. #define INVALID_PERMIT_URL
+#: LYMessages.c:855
+msgid "Special URL only valid from current File Permission menu!"
+msgstr ""
+
+#: LYMessages.c:859
+msgid "External support is currently disabled."
+msgstr ""
+
+#. new with 2.8.4dev.21
+#: LYMessages.c:863
+msgid "Changing working-directory is currently disabled."
+msgstr ""
+
+#: LYMessages.c:864
+msgid "Linewrap OFF!"
+msgstr "已關閉自動æ›è¡ŒåŠŸèƒ½ï¼"
+
+#: LYMessages.c:865
+msgid "Linewrap ON!"
+msgstr "已開啟自動æ›è¡ŒåŠŸèƒ½ï¼"
+
+#: LYMessages.c:866
+msgid "Parsing nested-tables toggled OFF! Reloading..."
+msgstr ""
+
+#: LYMessages.c:867
+msgid "Parsing nested-tables toggled ON! Reloading..."
+msgstr ""
+
+#: LYMessages.c:868
+msgid "Shifting is disabled while line-wrap is in effect"
+msgstr ""
+
+#: LYMessages.c:869
+msgid "Trace not supported"
+msgstr ""
+
+#: LYMessages.c:790
+#, c-format
+msgid "\tIndents: first=%.0f others=%.0f, Height=%.1f Desc=%.1f\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAABrow.c:626
+#, c-format
+msgid "Username for '%s' at %s '%s%s':"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAABrow.c:894
+msgid "This client doesn't know how to compose proxy authorization information for scheme"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAABrow.c:971
+msgid "This client doesn't know how to compose authorization information for scheme"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAABrow.c:1079
+#, c-format
+msgid "Invalid header '%s%s%s%s%s'"
+msgstr "無效的標頭內容‘%s%s%s%s%s’"
+
+#: WWW/Library/Implementation/HTAABrow.c:1181
+msgid "Proxy authorization required -- retrying"
+msgstr "使用代ç†ä¼ºæœå™¨å‰éœ€è¦èªè­‰ ─ é‡æ–°å˜—試"
+
+#: WWW/Library/Implementation/HTAABrow.c:1239
+msgid "Access without authorization denied -- retrying"
+msgstr "ä»æœªèªè­‰ï¼Œç„¡æ³•å­˜å–內容 ─ é‡æ–°å˜—試"
+
+#: WWW/Library/Implementation/HTAccess.c:688
+msgid "Access forbidden by rule"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAccess.c:783
+msgid "Document with POST content not found in cache. Resubmit?"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAccess.c:938
+msgid "Loading failed, use a previous copy."
+msgstr ""
+
+#: WWW/Library/Implementation/HTAccess.c:1047 src/GridText.c:8546
+msgid "Loading incomplete."
+msgstr "未完æˆè¼‰å…¥å…§å®¹ã€‚"
+
+#: WWW/Library/Implementation/HTAccess.c:1078
+#, c-format
+msgid "**** HTAccess: socket or file number returned by obsolete load routine!\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTAccess.c:1080
+#, c-format
+msgid "**** HTAccess: Internal software error. Please mail lynx-dev@nongnu.org!\n"
+msgstr "**** HTAccess:內部程å¼éŒ¯èª¤ã€‚請寄電郵至 lynx-dev@nongnu.orgï¼\n"
+
+#: WWW/Library/Implementation/HTAccess.c:1081
+#, c-format
+msgid "**** HTAccess: Status returned was: %d\n"
+msgstr "**** HTAccess:回傳的狀態為:%d\n"
+
+#.
+#. * hack: if we fail in HTAccess.c
+#. * avoid duplicating URL, oh.
+#.
+#: WWW/Library/Implementation/HTAccess.c:1087 src/LYMainLoop.c:7779
+msgid "Can't Access"
+msgstr "無法存å–"
+
+#: WWW/Library/Implementation/HTAccess.c:1095
+msgid "Unable to access document."
+msgstr "無法存å–文件。"
+
+#: WWW/Library/Implementation/HTFTP.c:843
+#, c-format
+msgid "Enter password for user %s@%s:"
+msgstr "請輸入使用者 %s@%s 的密碼:"
+
+#: WWW/Library/Implementation/HTFTP.c:871
+msgid "Unable to connect to FTP host."
+msgstr "無法è¯çµ¡ FTP 主機。"
+
+#: WWW/Library/Implementation/HTFTP.c:1152
+msgid "close master socket"
+msgstr ""
+
+#: WWW/Library/Implementation/HTFTP.c:1214
+msgid "socket for master socket"
+msgstr ""
+
+#.
+#. * It's a symbolic link, does the user care about knowing if it is
+#. * symbolic? I think so since it might be a directory.
+#.
+#: WWW/Library/Implementation/HTFTP.c:1733 WWW/Library/Implementation/HTFTP.c:2350
+msgid "Symbolic Link"
+msgstr "符號連çµ"
+
+#: WWW/Library/Implementation/HTFTP.c:2707
+msgid "Receiving FTP directory."
+msgstr "正在接收 FTP 目錄內容。"
+
+#: WWW/Library/Implementation/HTFTP.c:2843
+#, c-format
+msgid "Transferred %d bytes (%5d)"
+msgstr "å·²å‚³é€ %d ä½å…ƒçµ„ (%5d)"
+
+#: WWW/Library/Implementation/HTFTP.c:3194
+msgid "connect for data"
+msgstr ""
+
+#: WWW/Library/Implementation/HTFTP.c:3855
+msgid "Receiving FTP file."
+msgstr "正在接收 FTP 目錄。"
+
+#: WWW/Library/Implementation/HTFinger.c:273
+msgid "Could not set up finger connection."
+msgstr "無法建立 finger 連線。"
+
+#: WWW/Library/Implementation/HTFinger.c:320
+msgid "Could not load data (no sitename in finger URL)"
+msgstr ""
+
+#: WWW/Library/Implementation/HTFinger.c:326
+msgid "Invalid port number - will only use port 79!"
+msgstr "無效的連接埠號碼 ─ åªæœƒä½¿ç”¨é€£æŽ¥åŸ è™Ÿ 79ï¼"
+
+#: WWW/Library/Implementation/HTFinger.c:392
+msgid "Could not access finger host."
+msgstr "ç„¡æ³•å­˜å– finger 主機上的資料。"
+
+#: WWW/Library/Implementation/HTFinger.c:400
+msgid "No response from finger server."
+msgstr "finger 伺æœå™¨æ²’有回應。"
+
+#: WWW/Library/Implementation/HTNews.c:426
+#, c-format
+msgid "Username for news host '%s':"
+msgstr "æ–°èžçµ„主機‘%s’的帳戶å稱:"
+
+#: WWW/Library/Implementation/HTNews.c:479
+msgid "Change username?"
+msgstr "是å¦æ›´æ”¹å¸³æˆ¶å稱?"
+
+#: WWW/Library/Implementation/HTNews.c:483
+msgid "Username:"
+msgstr "帳戶å稱:"
+
+#: WWW/Library/Implementation/HTNews.c:508
+#, c-format
+msgid "Password for news host '%s':"
+msgstr "æ–°èžçµ„主機‘%s’的密碼:"
+
+#: WWW/Library/Implementation/HTNews.c:591
+msgid "Change password?"
+msgstr "是å¦æ›´æ”¹å¯†ç¢¼ï¼Ÿ"
+
+#: WWW/Library/Implementation/HTNews.c:1711
+#, c-format
+msgid "No matches for: %s"
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:1761
+msgid ""
+"\n"
+"No articles in this group.\n"
+msgstr ""
+"\n"
+"此新èžçµ„沒有任何文章。\n"
+
+#: WWW/Library/Implementation/HTNews.c:1773
+msgid ""
+"\n"
+"No articles in this range.\n"
+msgstr ""
+
+#.
+#. * Set window title.
+#.
+#: WWW/Library/Implementation/HTNews.c:1786
+#, c-format
+msgid "%s, Articles %d-%d"
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:1809
+msgid "Earlier articles"
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:1822
+#, c-format
+msgid ""
+"\n"
+"There are about %d articles currently available in %s, IDs as follows:\n"
+"\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:1884
+msgid "All available articles in "
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:2098
+msgid "Later articles"
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:2121
+msgid "Post to "
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:2342
+msgid "This client does not contain support for SNEWS URLs."
+msgstr "此版本的程å¼ä¸æ”¯æ´ SNEWS URL。"
+
+#: WWW/Library/Implementation/HTNews.c:2550
+msgid "No target for raw text!"
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:2581
+msgid "Connecting to NewsHost ..."
+msgstr "正在è¯çµ¡æ–°èžçµ„主機 ..."
+
+#: WWW/Library/Implementation/HTNews.c:2633
+#, c-format
+msgid "Could not access %s."
+msgstr "ç„¡æ³•å­˜å– %s。"
+
+#: WWW/Library/Implementation/HTNews.c:2739
+#, c-format
+msgid "Can't read news info. News host %.20s responded: %.200s"
+msgstr "無法讀å–æ–°èžçµ„資訊。新èžçµ„伺æœå™¨ %.20s 回應:%.200s"
+
+#: WWW/Library/Implementation/HTNews.c:2743
+#, c-format
+msgid "Can't read news info, empty response from host %s"
+msgstr ""
+
+#.
+#. * List available newsgroups. - FM
+#.
+#: WWW/Library/Implementation/HTNews.c:2947
+msgid "Reading list of available newsgroups."
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:2968
+msgid "Reading list of articles in newsgroup."
+msgstr "正在讀å–æ–°èžçµ„中的文章清單。"
+
+#.
+#. * Get an article from a news group. - FM
+#.
+#: WWW/Library/Implementation/HTNews.c:2974
+msgid "Reading news article."
+msgstr ""
+
+#: WWW/Library/Implementation/HTNews.c:3004
+msgid "Sorry, could not load requested news."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:1282
+msgid "Address has invalid port"
+msgstr "地å€ä¸­çš„連接埠無效"
+
+#: WWW/Library/Implementation/HTTCP.c:1358
+msgid "Address length looks invalid"
+msgstr "地å€é•·åº¦ä¼¼ä¹Žç„¡æ•ˆ"
+
+#: WWW/Library/Implementation/HTTCP.c:1618 WWW/Library/Implementation/HTTCP.c:1636
+#, c-format
+msgid "Unable to locate remote host %s."
+msgstr "找ä¸åˆ°é ç«¯ä¸»æ©Ÿ %s。"
+
+#. Not HTProgress, so warning won't be overwritten immediately;
+#. * but not HTAlert, because typically there will be other
+#. * alerts from the callers. - kw
+#.
+#: WWW/Library/Implementation/HTTCP.c:1633 WWW/Library/Implementation/HTTelnet.c:115
+#, c-format
+msgid "Invalid hostname %s"
+msgstr "無效的主機å稱 %s"
+
+#: WWW/Library/Implementation/HTTCP.c:1647
+#, c-format
+msgid "Making %s connection to %s"
+msgstr "正在建立 %s 連線,連至 %s"
+
+#: WWW/Library/Implementation/HTTCP.c:1658
+msgid "socket failed."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:1671
+#, c-format
+msgid "socket failed: family %d addr %s port %s."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:1695
+msgid "Could not make connection non-blocking."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:1763
+msgid "Connection failed (too many retries)."
+msgstr "連線失敗 (é‡è©¦æ¬¡æ•¸å¤ªå¤š)。"
+
+#: WWW/Library/Implementation/HTTCP.c:1950
+msgid "Could not restore socket to blocking."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTCP.c:2016
+#, fuzzy
+msgid "Socket read failed (too many tries)."
+msgstr "連線失敗 (é‡è©¦æ¬¡æ•¸å¤ªå¤š)。"
+
+#: WWW/Library/Implementation/HTTP.c:84
+#, c-format
+msgid "SSL callback:%s, preverify_ok=%d, ssl_okay=%d"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:406
+#, c-format
+msgid "Address contains a username: %s"
+msgstr "地止中å«æœ‰å¸³æˆ¶å稱:%s"
+
+#: WWW/Library/Implementation/HTTP.c:460
+#, c-format
+msgid "Certificate issued by: %s"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:620
+msgid "This client does not contain support for HTTPS URLs."
+msgstr "æ­¤ç€è¦½å™¨ä¸æ”¯æ´ HTTPS URL。"
+
+#: WWW/Library/Implementation/HTTP.c:645
+msgid "Unable to connect to remote host."
+msgstr "無法è¯çµ¡é ç«¯ä¸»æ©Ÿã€‚"
+
+#: WWW/Library/Implementation/HTTP.c:669
+msgid "Retrying connection without TLS."
+msgstr "嘗試以ä¸ç”¨ TLS çš„æ–¹å¼é€£ç·šã€‚"
+
+#: WWW/Library/Implementation/HTTP.c:714
+msgid "no issuer was found"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:716
+msgid "issuer is not a CA"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:718
+msgid "the certificate has no known issuer"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:720
+#, fuzzy
+msgid "the certificate has been revoked"
+msgstr "該 cookie 已經被刪除了ï¼"
+
+#: WWW/Library/Implementation/HTTP.c:722
+msgid "the certificate is not trusted"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:807
+#, c-format
+msgid "Verified connection to %s (cert=%s)"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:855 WWW/Library/Implementation/HTTP.c:901
+#, c-format
+msgid "Verified connection to %s (subj=%s)"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:931
+msgid "Can't find common name in certificate"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:934
+#, c-format
+msgid "SSL error:host(%s)!=cert(%s)-Continue?"
+msgstr "SSL 錯誤:主機(%s)ä¸ç¬¦åˆè­‰æ›¸(%s)。是å¦ç¹¼çºŒï¼Ÿ"
+
+#: WWW/Library/Implementation/HTTP.c:947
+#, c-format
+msgid "UNVERIFIED connection to %s (cert=%s)"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:956
+#, c-format
+msgid "Secure %d-bit %s (%s) HTTP connection"
+msgstr "%d ä½å…ƒ %s (%s) 安全 HTTP 連線"
+
+#: WWW/Library/Implementation/HTTP.c:1426
+msgid "Sending HTTP request."
+msgstr "正在é€å‡º HTTP è¦æ±‚。"
+
+#: WWW/Library/Implementation/HTTP.c:1465
+msgid "Unexpected network write error; connection aborted."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:1471
+msgid "HTTP request sent; waiting for response."
+msgstr "已進出 HTTP è¦æ±‚;正在等待回應。"
+
+#: WWW/Library/Implementation/HTTP.c:1539
+msgid "Unexpected network read error; connection aborted."
+msgstr ""
+
+#.
+#. * HTTP/1.1 Informational statuses.
+#. * 100 Continue.
+#. * 101 Switching Protocols.
+#. * > 101 is unknown.
+#. * We should never get these, and they have only the status
+#. * line and possibly other headers, so we'll deal with them by
+#. * showing the full header to the user as text/plain. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:1733
+msgid "Got unexpected Informational Status."
+msgstr ""
+
+#.
+#. * Reset Content. The server has fulfilled the request but
+#. * nothing is returned and we should reset any form
+#. * content. We'll instruct the user to do that, and
+#. * restore the current document. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:1767
+msgid "Request fulfilled. Reset Content."
+msgstr ""
+
+#. Not Modified
+#.
+#. * We didn't send an "If-Modified-Since" header, so this
+#. * status is inappropriate. We'll deal with it by showing
+#. * the full header to the user as text/plain. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:1884
+msgid "Got unexpected 304 Not Modified status."
+msgstr "出ç¾é æ–™ä¹‹å¤–çš„ 304 Not Modified 狀態。"
+
+#: WWW/Library/Implementation/HTTP.c:1947
+msgid "Redirection of POST content requires user approval."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:1962
+msgid "Have POST content. Treating Permanent Redirection as Temporary.\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:2004
+msgid "Retrying with access authorization information."
+msgstr ""
+
+#: WWW/Library/Implementation/HTTP.c:2016
+msgid "Show the 401 message body?"
+msgstr "是å¦é¡¯ç¤º 401 錯誤訊æ¯çš„網é å…§å®¹ï¼Ÿ"
+
+#: WWW/Library/Implementation/HTTP.c:2059
+msgid "Show the 407 message body?"
+msgstr "是å¦é¡¯ç¤º 407 錯誤訊æ¯çš„網é å…§å®¹ï¼Ÿ"
+
+#.
+#. * Bad or unknown server_status number. Take a chance and hope
+#. * there is something to display. - FM
+#.
+#: WWW/Library/Implementation/HTTP.c:2159
+msgid "Unknown status reply from server!"
+msgstr "伺æœå™¨ç™¼å‡ºä¸æ˜Žçš„狀態回應訊æ¯ï¼"
+
+#: WWW/Library/Implementation/HTTelnet.c:113
+#, c-format
+msgid "remote %s session:"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:162
+msgid "Could not connect to WAIS server."
+msgstr "無法è¯çµ¡ WAIS 伺æœå™¨ã€‚"
+
+#: WWW/Library/Implementation/HTWAIS.c:170
+msgid "Could not open WAIS connection for reading."
+msgstr "無法開啟 WAIS 連線來讀å–資料。"
+
+#: WWW/Library/Implementation/HTWAIS.c:192
+msgid "Diagnostic code is "
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:464
+msgid "Index "
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:468
+#, c-format
+msgid " contains the following %d item%s relevant to \""
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:476
+msgid "The first figure after each entry is its relative score, "
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:477
+msgid "the second is the number of lines in the item."
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:519
+msgid " (bad file name)"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:545
+msgid "(bad doc id)"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:561
+msgid "(Short Header record, can't display)"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:568
+msgid ""
+"\n"
+"Long Header record, can't display\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:575
+msgid ""
+"\n"
+"Text record\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:584
+msgid ""
+"\n"
+"Headline record, can't display\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:592
+msgid ""
+"\n"
+"Code record, can't display\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:696
+msgid "Syntax error in WAIS URL"
+msgstr "WAIS URL 中出ç¾èªžæ³•éŒ¯èª¤"
+
+#: WWW/Library/Implementation/HTWAIS.c:768
+msgid " (WAIS Index)"
+msgstr " (WAIS 索引)"
+
+#: WWW/Library/Implementation/HTWAIS.c:775
+msgid "WAIS Index: "
+msgstr "WAIS 索引:"
+
+#: WWW/Library/Implementation/HTWAIS.c:781
+msgid "This is a link for searching the "
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:785
+msgid " WAIS Index.\n"
+msgstr " WAIS 索引。\n"
+
+#: WWW/Library/Implementation/HTWAIS.c:814
+msgid ""
+"\n"
+"Enter the 's'earch command and then specify search words.\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:836
+msgid " (in "
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:845
+msgid "WAIS Search of \""
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:849
+msgid "\" in: "
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:864
+msgid "HTWAIS: Request too large."
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:873
+msgid "Searching WAIS database..."
+msgstr "正在æœå°‹ WAIS 資料庫..."
+
+#: WWW/Library/Implementation/HTWAIS.c:883
+msgid "Search interrupted."
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:934
+msgid "Can't convert format of WAIS document"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWAIS.c:978
+msgid "HTWAIS: Request too long."
+msgstr ""
+
+#.
+#. * Actually do the transaction given by request_message.
+#.
+#: WWW/Library/Implementation/HTWAIS.c:992
+msgid "Fetching WAIS document..."
+msgstr ""
+
+#. display_search_response(target, retrieval_response,
+#. wais_database, keywords);
+#: WWW/Library/Implementation/HTWAIS.c:1031
+msgid "No text was returned!\n"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWSRC.c:296
+msgid " NOT GIVEN in source file; "
+msgstr ""
+
+#: WWW/Library/Implementation/HTWSRC.c:319
+msgid " WAIS source file"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWSRC.c:326
+msgid " description"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWSRC.c:336
+msgid "Access links"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWSRC.c:357
+msgid "Direct access"
+msgstr ""
+
+#. * Proxy will be used if defined, so let user know that - FM *
+#: WWW/Library/Implementation/HTWSRC.c:360
+msgid " (or via proxy server, if defined)"
+msgstr ""
+
+#: WWW/Library/Implementation/HTWSRC.c:375
+msgid "Maintainer"
+msgstr "維護者"
+
+#: WWW/Library/Implementation/HTWSRC.c:383
+msgid "Host"
+msgstr "主機"
+
+#: src/GridText.c:705
+msgid "Memory exhausted, display interrupted!"
+msgstr "記憶體耗盡,必須中斷顯示ï¼"
+
+#: src/GridText.c:710
+msgid "Memory exhausted, will interrupt transfer!"
+msgstr "記憶體耗盡,必須中斷傳輸ï¼"
+
+#: src/GridText.c:3654
+msgid " *** MEMORY EXHAUSTED ***"
+msgstr "*** 記憶體耗盡 ***"
+
+#: src/GridText.c:6089 src/GridText.c:6096 src/LYList.c:239
+msgid "unknown field or link"
+msgstr "ä¸æ˜Žçš„欄ä½æˆ–éˆçµ"
+
+#: src/GridText.c:6105
+msgid "text entry field"
+msgstr "文字輸入欄ä½"
+
+#: src/GridText.c:6108
+msgid "password entry field"
+msgstr "密碼輸入欄ä½"
+
+#: src/GridText.c:6111
+msgid "checkbox"
+msgstr ""
+
+#: src/GridText.c:6114
+msgid "radio button"
+msgstr ""
+
+#: src/GridText.c:6117
+msgid "submit button"
+msgstr ""
+
+#: src/GridText.c:6120
+msgid "reset button"
+msgstr ""
+
+#: src/GridText.c:6123
+msgid "popup menu"
+msgstr ""
+
+#: src/GridText.c:6126
+msgid "hidden form field"
+msgstr ""
+
+#: src/GridText.c:6129
+msgid "text entry area"
+msgstr "文字輸入å€åŸŸ"
+
+#: src/GridText.c:6132
+msgid "range entry field"
+msgstr ""
+
+#: src/GridText.c:6135
+msgid "file entry field"
+msgstr "檔案å稱輸入欄ä½"
+
+#: src/GridText.c:6138
+msgid "text-submit field"
+msgstr ""
+
+#: src/GridText.c:6141
+msgid "image-submit button"
+msgstr ""
+
+#: src/GridText.c:6144
+msgid "keygen field"
+msgstr ""
+
+#: src/GridText.c:6147
+msgid "unknown form field"
+msgstr ""
+
+#: src/GridText.c:10279
+msgid "Can't open file for uploading"
+msgstr "無法開啟準備上傳的檔案"
+
+#: src/GridText.c:11438
+#, c-format
+msgid "Submitting %s"
+msgstr ""
+
+#. ugliness has happened; inform user and do the best we can
+#: src/GridText.c:12491
+msgid "Hang Detect: TextAnchor struct corrupted - suggest aborting!"
+msgstr ""
+
+#. don't show previous state
+#: src/GridText.c:12628
+msgid "Wrap lines to fit displayed area?"
+msgstr "是å¦é€²è¡Œè‡ªå‹•æ›è¡Œä¾†ç¬¦åˆç•«é¢å°ºå¯¸ï¼Ÿ"
+
+#: src/GridText.c:12680
+msgid "Very long lines have been wrapped!"
+msgstr ""
+
+#: src/GridText.c:13185
+msgid "Very long lines have been truncated!"
+msgstr ""
+
+#: src/HTAlert.c:164 src/LYShowInfo.c:360 src/LYShowInfo.c:364
+msgid "bytes"
+msgstr "ä½å…ƒçµ„"
+
+#.
+#. * If we know the total size of the file, we can compute
+#. * a percentage, and show a corresponding progress bar.
+#.
+#: src/HTAlert.c:300 src/HTAlert.c:324
+#, c-format
+msgid "Read %s of data"
+msgstr "å·²è®€å– %s 資料"
+
+#: src/HTAlert.c:321
+#, c-format
+msgid "Read %s of %s of data"
+msgstr "å·²è®€å– %s (總數 %s) 資料"
+
+#: src/HTAlert.c:330
+#, c-format
+msgid ", %s/sec"
+msgstr ",æ¯ç§’ %s"
+
+#: src/HTAlert.c:342
+#, c-format
+msgid " (stalled for %s)"
+msgstr " (åœæ­¢äº† %s)"
+
+#: src/HTAlert.c:346
+#, c-format
+msgid ", ETA %s"
+msgstr ",估計 %s 後完æˆ"
+
+#: src/HTAlert.c:368
+msgid " (Press 'z' to abort)"
+msgstr " (請按‘z’中止)"
+
+#. Meta-note: don't move the following note from its place right
+#. in front of the first gettext(). As it is now, it should
+#. automatically appear in generated lynx.pot files. - kw
+#.
+#. NOTE TO TRANSLATORS: If you provide a translation for "yes", lynx
+#. * will take the first byte of the translation as a positive response
+#. * to Yes/No questions. If you provide a translation for "no", lynx
+#. * will take the first byte of the translation as a negative response
+#. * to Yes/No questions. For both, lynx will also try to show the
+#. * first byte in the prompt as a character, instead of (y) or (n),
+#. * respectively. This will not work right for multibyte charsets!
+#. * Don't translate "yes" and "no" for CJK character sets (or translate
+#. * them to "yes" and "no"). For a translation using UTF-8, don't
+#. * translate if the translation would begin with anything but a 7-bit
+#. * (US_ASCII) character. That also means do not translate if the
+#. * translation would begin with anything but a 7-bit character, if
+#. * you use a single-byte character encoding (a charset like ISO-8859-n)
+#. * but anticipate that the message catalog may be used re-encoded in
+#. * UTF-8 form.
+#. * For translations using other character sets, you may also wish to
+#. * leave "yes" and "no" untranslated, if using (y) and (n) is the
+#. * preferred behavior.
+#. * Lynx will also accept y Y n N as responses unless there is a conflict
+#. * with the first letter of the "yes" or "no" translation.
+#.
+#: src/HTAlert.c:406 src/HTAlert.c:454
+msgid "yes"
+msgstr "yes"
+
+#: src/HTAlert.c:409 src/HTAlert.c:455
+msgid "no"
+msgstr "no"
+
+#.
+#. * Special-purpose workaround for gettext support (we should do
+#. * this in a more general way) -TD
+#. *
+#. * NOTE TO TRANSLATORS: If the prompt has been rendered into
+#. * another language, and if yes/no are distinct, assume the
+#. * translator can make an ordered list in parentheses with one
+#. * capital letter for each as we assumed in HTConfirmDefault().
+#. * The list has to be in the same order as in the original message,
+#. * and the four capital letters chosen to not match those in the
+#. * original unless they have the same position.
+#. *
+#. * Example:
+#. * (Y/N/Always/neVer) - English (original)
+#. * (O/N/Toujours/Jamais) - French
+#.
+#: src/HTAlert.c:911
+msgid "Y/N/A/V"
+msgstr ""
+
+#: src/HTML.c:5911
+msgid "Description:"
+msgstr "æ述:"
+
+#: src/HTML.c:5916
+msgid "(none)"
+msgstr "(ç„¡)"
+
+#: src/HTML.c:5920
+msgid "Filepath:"
+msgstr "檔案路徑:"
+
+#: src/HTML.c:5926
+msgid "(unknown)"
+msgstr "(ä¸æ˜Ž)"
+
+#: src/HTML.c:7353
+msgid "Document has only hidden links. Use the 'l'ist command."
+msgstr ""
+
+#: src/HTML.c:7852
+msgid "Source cache error - disk full?"
+msgstr ""
+
+#: src/HTML.c:7865
+msgid "Source cache error - not enough memory!"
+msgstr ""
+
+#: src/LYBookmark.c:164
+msgid ""
+" This file is an HTML representation of the X Mosaic hotlist file.\n"
+" Outdated or invalid links may be removed by using the\n"
+" remove bookmark command, it is usually the 'R' key but may have\n"
+" been remapped by you or your system administrator."
+msgstr ""
+
+#: src/LYBookmark.c:371
+#, c-format
+msgid ""
+" You can delete links by the 'R' key<br>\n"
+"<ol>\n"
+msgstr ""
+" å¯ä»¥ç”¨â€˜R’éµåˆªé™¤éˆçµ<br>\n"
+"<ol>\n"
+
+#: src/LYBookmark.c:374
+msgid ""
+" You can delete links using the remove bookmark command. It is usually\n"
+" the 'R' key but may have been remapped by you or your system\n"
+" administrator."
+msgstr ""
+" 閣下å¯ä»¥ä½¿ç”¨ç§»é™¤æ›¸ç±¤çš„指令來刪除éˆçµã€‚通常是用‘R’éµï¼Œä½†é–£ä¸‹æˆ–管ç†å“¡ä¹Ÿ\n"
+" 有å¯èƒ½æœƒå°‡ä¹‹é‡æ–°å®šç¾©ç‚ºå…¶å®ƒæŒ‰éµã€‚"
+
+#: src/LYBookmark.c:378
+msgid ""
+" This file also may be edited with a standard text editor to delete\n"
+" outdated or invalid links, or to change their order."
+msgstr ""
+" 此檔案也å¯ä»¥ä½¿ç”¨ä¸€èˆ¬çš„文字編輯器編輯,刪除éŽæ™‚或無效的éˆçµï¼Œæˆ–更改\n"
+" 它們的次åºã€‚"
+
+#: src/LYBookmark.c:381
+msgid ""
+"Note: if you edit this file manually\n"
+" you should not change the format within the lines\n"
+" or add other HTML markup.\n"
+" Make sure any bookmark link is saved as a single line."
+msgstr ""
+
+#: src/LYBookmark.c:677
+#, c-format
+msgid "File may be recoverable from %s during this session"
+msgstr ""
+
+#: src/LYCgi.c:161
+#, c-format
+msgid "Do you want to execute \"%s\"?"
+msgstr ""
+
+#.
+#. * Neither the path as given nor any components examined by backing up
+#. * were stat()able. - kw
+#.
+#: src/LYCgi.c:276
+msgid "Unable to access cgi script"
+msgstr "ç„¡æ³•å­˜å– cgi script。"
+
+#: src/LYCgi.c:701 src/LYCgi.c:704
+msgid "Good Advice"
+msgstr "建議"
+
+#: src/LYCgi.c:708
+msgid "An excellent http server for VMS is available via"
+msgstr ""
+
+#: src/LYCgi.c:715
+msgid "this link"
+msgstr ""
+
+#: src/LYCgi.c:719
+msgid "It provides state of the art CGI script support.\n"
+msgstr ""
+
+#: src/LYClean.c:122
+msgid "Exiting via interrupt:"
+msgstr "因以下的中斷訊號而離開程å¼ï¼š"
+
+#: src/LYCookie.c:2461
+msgid "(from a previous session)"
+msgstr ""
+
+#: src/LYCookie.c:2522
+msgid "Maximum Gobble Date:"
+msgstr ""
+
+#: src/LYCookie.c:2562
+msgid "Internal"
+msgstr "內部"
+
+#: src/LYCookie.c:2563
+msgid "cookie_domain_flag_set error, aborting program"
+msgstr "cookie_domain_flag_set 錯誤,中止程å¼"
+
+#: src/LYCurses.c:1088
+msgid "Terminal initialisation failed - unknown terminal type?"
+msgstr "無法åˆå§‹åŒ–終端機 ─ 終端機類型ä¸è©³ï¼Ÿ"
+
+#: src/LYCurses.c:1546
+msgid "Terminal ="
+msgstr "終端機類型 ="
+
+#: src/LYCurses.c:1550
+msgid "You must use a vt100, 200, etc. terminal with this program."
+msgstr "使用本程å¼æ™‚終端機的類型必須是 vt100ã€200 等等。"
+
+#: src/LYCurses.c:1599
+msgid "Your Terminal type is unknown!"
+msgstr "終端機類型ä¸æ˜Žï¼"
+
+#: src/LYCurses.c:1600
+msgid "Enter a terminal type:"
+msgstr "請輸入終端機類型:"
+
+#: src/LYCurses.c:1614
+msgid "TERMINAL TYPE IS SET TO"
+msgstr "終端機類型已設定為"
+
+#: src/LYCurses.c:2127
+#, c-format
+msgid ""
+"\n"
+"A Fatal error has occurred in %s Ver. %s\n"
+msgstr ""
+"\n"
+"在 %s 版本 %s 出ç¾åš´é‡éŒ¯èª¤\n"
+
+#: src/LYCurses.c:2130
+#, c-format
+msgid ""
+"\n"
+"Please notify your system administrator to confirm a bug, and if\n"
+"confirmed, to notify the lynx-dev list. Bug reports should have concise\n"
+"descriptions of the command and/or URL which causes the problem, the\n"
+"operating system name with version number, the TCPIP implementation, the\n"
+"TRACEBACK if it can be captured, and any other relevant information.\n"
+msgstr ""
+"\n"
+"請通知系統管ç†å“¡ç¢ºèªç¨‹å¼æ˜¯å¦å‡ºç¾éŒ¯èª¤ï¼Œå¦‚果答案是肯定的,請將報告\n"
+"寄給 lynx-dev 電郵論壇。錯誤報告中應該附上引致å•é¡Œå‡ºç¾çš„指令åŠ/或\n"
+"URL 的準確æè¿°ã€ä½œæ¥­ç³»çµ±åŠå…¶ç‰ˆæœ¬ã€TCPIP 版本ã€éŒ¯èª¤çš„追蹤紀錄 (如果\n"
+"å¯ä»¥ç²å–的話),åŠå…¶å®ƒç›¸é—œè³‡è¨Šã€‚\n"
+
+#: src/LYEdit.c:266
+#, c-format
+msgid "Error starting editor, %s"
+msgstr ""
+
+#: src/LYEdit.c:269
+msgid "Editor killed by signal"
+msgstr "編輯器因訊號而中止"
+
+#: src/LYEdit.c:274
+#, fuzzy, c-format
+msgid "Editor returned with error status %s"
+msgstr "編輯器的回傳錯誤狀態,%s"
+
+#: src/LYDownload.c:504
+msgid "Downloaded link:"
+msgstr "已下載的éˆçµï¼š"
+
+#: src/LYDownload.c:509
+msgid "Suggested file name:"
+msgstr "建議的檔案å稱:"
+
+#: src/LYDownload.c:514
+msgid "Standard download options:"
+msgstr "標準的下載處ç†æ–¹å¼ï¼š"
+
+#: src/LYDownload.c:515
+msgid "Download options:"
+msgstr "下載é¸é …:"
+
+#: src/LYDownload.c:531
+msgid "Save to disk"
+msgstr "儲存至ç£ç¢Ÿ"
+
+#: src/LYDownload.c:545
+#, fuzzy
+msgid "View temporary file"
+msgstr "無法開啟暫存檔ï¼"
+
+#: src/LYDownload.c:552
+msgid "Save to disk disabled."
+msgstr "ç¦æ­¢å°‡å…§å®¹å„²å­˜è‡³ç£ç¢Ÿã€‚"
+
+#: src/LYDownload.c:556 src/LYPrint.c:1310
+msgid "Local additions:"
+msgstr "é¡å¤–的處ç†æ–¹å¼ï¼š"
+
+#: src/LYDownload.c:567 src/LYUpload.c:211
+msgid "No Name Given"
+msgstr "未指定å稱"
+
+#: src/LYHistory.c:672
+msgid "You selected:"
+msgstr "è«‹é¸æ“‡ï¼š"
+
+#: src/LYHistory.c:696 src/LYHistory.c:925
+msgid "(no address)"
+msgstr ""
+
+#: src/LYHistory.c:700
+msgid " (internal)"
+msgstr ""
+
+#: src/LYHistory.c:702
+msgid " (was internal)"
+msgstr ""
+
+#: src/LYHistory.c:800
+msgid " (From History)"
+msgstr ""
+
+#: src/LYHistory.c:845
+msgid "You visited (POSTs, bookmark, menu and list files excluded):"
+msgstr ""
+
+#: src/LYHistory.c:1138
+msgid "(No messages yet)"
+msgstr ""
+
+#: src/LYLeaks.c:220
+msgid "Invalid pointer detected."
+msgstr ""
+
+#: src/LYLeaks.c:222 src/LYLeaks.c:260
+msgid "Sequence:"
+msgstr ""
+
+#: src/LYLeaks.c:225 src/LYLeaks.c:263
+msgid "Pointer:"
+msgstr "Pointer:"
+
+#: src/LYLeaks.c:234 src/LYLeaks.c:241 src/LYLeaks.c:282
+msgid "FileName:"
+msgstr "檔案å稱:"
+
+#: src/LYLeaks.c:237 src/LYLeaks.c:244 src/LYLeaks.c:285 src/LYLeaks.c:296
+msgid "LineCount:"
+msgstr "行數:"
+
+#: src/LYLeaks.c:258
+msgid "Memory leak detected."
+msgstr ""
+
+#: src/LYLeaks.c:266
+msgid "Contains:"
+msgstr ""
+
+#: src/LYLeaks.c:279
+msgid "ByteSize:"
+msgstr ""
+
+#: src/LYLeaks.c:293
+msgid "realloced:"
+msgstr ""
+
+#: src/LYLeaks.c:314
+msgid "Total memory leakage this run:"
+msgstr ""
+
+#: src/LYLeaks.c:317
+msgid "Peak allocation"
+msgstr ""
+
+#: src/LYLeaks.c:318
+msgid "Bytes allocated"
+msgstr ""
+
+#: src/LYLeaks.c:319
+msgid "Total mallocs"
+msgstr ""
+
+#: src/LYLeaks.c:320
+msgid "Total frees"
+msgstr ""
+
+#: src/LYList.c:84
+msgid "References in "
+msgstr "以下的éˆçµå±¬æ–¼ç¶²é ï¼š"
+
+#: src/LYList.c:87
+msgid "this document:"
+msgstr "(地å€ä¸æ˜Ž)"
+
+#: src/LYList.c:93
+msgid "Visible links:"
+msgstr "ä¸éš±è—çš„éˆçµï¼š"
+
+#: src/LYList.c:194 src/LYList.c:295
+msgid "Hidden links:"
+msgstr "éš±è—çš„éˆçµï¼š"
+
+#: src/LYList.c:332
+msgid "References"
+msgstr ""
+
+#: src/LYList.c:336
+msgid "Visible links"
+msgstr "ä¸éš±è—çš„éˆçµ"
+
+#: src/LYLocal.c:271
+#, c-format
+msgid "Unable to get status of '%s'."
+msgstr "無法ç²å–‘%s’的狀態。"
+
+#: src/LYLocal.c:305
+msgid "The selected item is not a file or a directory! Request ignored."
+msgstr "é¸å–çš„é …ç›®ä¸æ˜¯æª”案或目錄ï¼å¿½ç•¥è©²è¦æ±‚。"
+
+#: src/LYLocal.c:373
+#, c-format
+msgid "Unable to %s due to system error!"
+msgstr "因為系統錯誤而無法%sï¼"
+
+#: src/LYLocal.c:407
+#, c-format
+msgid "Probable failure to %s due to system error!"
+msgstr "å¯èƒ½å› ç‚ºç³»çµ±éŒ¯èª¤è€Œç„¡æ³•%sï¼"
+
+#: src/LYLocal.c:469 src/LYLocal.c:490
+#, c-format
+msgid "remove %s"
+msgstr "移除 %s"
+
+#: src/LYLocal.c:508
+#, c-format
+msgid "touch %s"
+msgstr ""
+
+#: src/LYLocal.c:536
+#, c-format
+msgid "move %s to %s"
+msgstr "將 %s 移動至 %s"
+
+#: src/LYLocal.c:577
+msgid "There is already a directory with that name! Request ignored."
+msgstr "åŒä¸€å稱的目錄已經存在ï¼å¿½ç•¥è©²è¦æ±‚。"
+
+#: src/LYLocal.c:579
+msgid "There is already a file with that name! Request ignored."
+msgstr "åŒä¸€å稱的檔案已經存在ï¼å¿½ç•¥è©²è¦æ±‚。"
+
+#: src/LYLocal.c:581
+msgid "The specified name is already in use! Request ignored."
+msgstr "指定的檔案已在使用中ï¼å¿½ç•¥è©²è¦æ±‚。"
+
+#: src/LYLocal.c:592
+msgid "Destination has different owner! Request denied."
+msgstr "目的地的æ“有者ä¸åŒï¼æ‹’絕該è¦æ±‚。"
+
+#: src/LYLocal.c:595
+msgid "Destination is not a valid directory! Request denied."
+msgstr "目的地ä¸æ˜¯æœ‰æ•ˆçš„目錄ï¼æ‹’絕該è¦æ±‚。"
+
+#: src/LYLocal.c:617
+msgid "Remove all tagged files and directories?"
+msgstr "確定移除所有加上標記的檔案åŠç›®éŒ„?"
+
+#: src/LYLocal.c:675
+msgid "Enter new location for tagged items: "
+msgstr "輸入加上標記的項目的新ä½ç½®ï¼š"
+
+#: src/LYLocal.c:745
+msgid "Path too long"
+msgstr "路徑éŽé•·"
+
+#: src/LYLocal.c:776
+msgid "Source and destination are the same location - request ignored!"
+msgstr "來æºåŠç›®çš„地ä½ç½®ç›¸åŒ ─ 忽略該è¦æ±‚ï¼"
+
+#: src/LYLocal.c:833
+msgid "Enter new name for directory: "
+msgstr "輸入目錄的新å稱:"
+
+#: src/LYLocal.c:835
+msgid "Enter new name for file: "
+msgstr "輸入檔案的新å稱:"
+
+#: src/LYLocal.c:847
+msgid "Illegal character (path-separator) found! Request ignored."
+msgstr "出ç¾ä¸åˆæ³•çš„å­—å…ƒ (路徑分隔字元)ï¼å¿½ç•¥è©²è¦æ±‚。"
+
+#: src/LYLocal.c:897
+msgid "Enter new location for directory: "
+msgstr "輸入目錄的新ä½ç½®ï¼š"
+
+#: src/LYLocal.c:903
+msgid "Enter new location for file: "
+msgstr "輸入檔案的新ä½ç½®ï¼š"
+
+#: src/LYLocal.c:930
+msgid "Unexpected failure - unable to find trailing path separator"
+msgstr ""
+
+#: src/LYLocal.c:950
+msgid "Source and destination are the same location! Request ignored!"
+msgstr "來æºåŠç›®çš„地ä½ç½®ç›¸åŒï¼å¿½ç•¥è©²è¦æ±‚ï¼"
+
+#: src/LYLocal.c:997
+msgid "Modify name, location, or permission (n, l, or p): "
+msgstr "修改å稱ã€ä½ç½®æˆ–æ¬Šé™ (nã€l 或 p):"
+
+#: src/LYLocal.c:999
+msgid "Modify name or location (n or l): "
+msgstr "修改å稱或ä½ç½® (n 或 l):"
+
+#.
+#. * Code for changing ownership needed here.
+#.
+#: src/LYLocal.c:1028
+msgid "This feature not yet implemented!"
+msgstr "此功能ä»æœªå®Œæˆï¼"
+
+#: src/LYLocal.c:1048
+msgid "Enter name of file to create: "
+msgstr "輸入準備建立的檔案å稱:"
+
+#: src/LYLocal.c:1052 src/LYLocal.c:1088
+msgid "Illegal redirection \"//\" found! Request ignored."
+msgstr "出ç¾ä¸åˆæ³•çš„é‡æ–°å°Žå‘ \"//\"ï¼å¿½ç•¥è©²è¦æ±‚。"
+
+#: src/LYLocal.c:1084
+msgid "Enter name for new directory: "
+msgstr "輸入新目錄的å稱:"
+
+#: src/LYLocal.c:1124
+msgid "Create file or directory (f or d): "
+msgstr "建立檔案或目錄 (f 或 d):"
+
+#: src/LYLocal.c:1166
+#, fuzzy, c-format
+msgid "Remove directory '%s'?"
+msgstr "是å¦ç§»é™¤æª”案‘%s’?"
+
+#: src/LYLocal.c:1169
+#, fuzzy
+msgid "Remove directory?"
+msgstr " 目錄"
+
+#: src/LYLocal.c:1174
+#, c-format
+msgid "Remove file '%s'?"
+msgstr "是å¦ç§»é™¤æª”案‘%s’?"
+
+#: src/LYLocal.c:1176
+msgid "Remove file?"
+msgstr "是å¦ç§»é™¤æª”案?"
+
+#: src/LYLocal.c:1181
+#, c-format
+msgid "Remove symbolic link '%s'?"
+msgstr "是å¦ç§»é™¤ç¬¦è™Ÿé€£çµâ€˜%s’?"
+
+#: src/LYLocal.c:1183
+msgid "Remove symbolic link?"
+msgstr "是å¦ç§»é™¤ç¬¦è™Ÿé€£çµï¼Ÿ"
+
+#: src/LYLocal.c:1278
+msgid "Sorry, don't know how to permit non-UNIX files yet."
+msgstr ""
+
+#: src/LYLocal.c:1308
+msgid "Unable to open permit options file"
+msgstr ""
+
+#: src/LYLocal.c:1338
+msgid "Specify permissions below:"
+msgstr "請指定以下的權é™ï¼š"
+
+#: src/LYLocal.c:1339 src/LYShowInfo.c:261
+msgid "Owner:"
+msgstr "æ“有者:"
+
+#: src/LYLocal.c:1355
+msgid "Group"
+msgstr "所屬群組"
+
+#: src/LYLocal.c:1371
+msgid "Others:"
+msgstr "其它:"
+
+#: src/LYLocal.c:1389
+msgid "form to permit"
+msgstr ""
+
+#: src/LYLocal.c:1484
+msgid "Invalid mode format."
+msgstr ""
+
+#: src/LYLocal.c:1488
+msgid "Invalid syntax format."
+msgstr "無效的語法格å¼ã€‚"
+
+#: src/LYLocal.c:1670
+msgid "Warning! UUDecoded file will exist in the directory you started Lynx."
+msgstr "警告ï¼å·²ç¶“ UUDecode 的檔案會放在執行 Lynx 時的目錄。"
+
+#: src/LYLocal.c:1860
+msgid "NULL URL pointer"
+msgstr ""
+
+#: src/LYLocal.c:1942
+#, c-format
+msgid "Executing %s "
+msgstr "正在執行 %s "
+
+#: src/LYLocal.c:1945
+msgid "Executing system command. This might take a while."
+msgstr "正在執行系統指令。å¯èƒ½éœ€è¦ç¨ç­‰ä¸€æ®µæ™‚間。"
+
+#: src/LYLocal.c:2017
+msgid "Current directory:"
+msgstr "ç›®å‰çš„目錄:"
+
+#: src/LYLocal.c:2020 src/LYLocal.c:2038
+msgid "Current selection:"
+msgstr "ç›®å‰é¸æ“‡çš„項目:"
+
+#: src/LYLocal.c:2024
+msgid "Nothing currently selected."
+msgstr "未é¸å–任何項目。"
+
+#: src/LYLocal.c:2040
+msgid "tagged item:"
+msgstr "個加上標記的項目:"
+
+#: src/LYLocal.c:2041
+msgid "tagged items:"
+msgstr "個加上標記的項目:"
+
+#: src/LYLocal.c:2138 src/LYLocal.c:2149
+msgid "Illegal filename; request ignored."
+msgstr "ä¸åˆæ³•çš„檔案å稱;忽略該è¦æ±‚。"
+
+#. directory not writable
+#: src/LYLocal.c:2247 src/LYLocal.c:2306
+msgid "Install in the selected directory not permitted."
+msgstr ""
+
+#: src/LYLocal.c:2302
+msgid "The selected item is not a directory! Request ignored."
+msgstr "é¸å–çš„é …ç›®ä¸æ˜¯ç›®éŒ„ï¼å¿½ç•¥è©²è¦æ±‚。"
+
+#: src/LYLocal.c:2311
+msgid "Just a moment, ..."
+msgstr "è«‹ç¨ç­‰ï¼Œ..."
+
+#: src/LYLocal.c:2328
+msgid "Error building install args"
+msgstr ""
+
+#: src/LYLocal.c:2343 src/LYLocal.c:2374
+#, c-format
+msgid "Source and target are the same: %s"
+msgstr "來æºåŠç›®çš„地相åŒï¼š%s"
+
+#: src/LYLocal.c:2350 src/LYLocal.c:2381
+#, c-format
+msgid "Already in target directory: %s"
+msgstr ""
+
+#: src/LYLocal.c:2399
+msgid "Installation complete"
+msgstr "安è£å®Œæˆ"
+
+#: src/LYLocal.c:2586
+msgid "Temporary URL or list would be too long."
+msgstr ""
+
+#: src/LYMail.c:520
+msgid "Sending"
+msgstr ""
+
+#: src/LYMail.c:1006
+#, c-format
+msgid "The link %s :?: %s \n"
+msgstr ""
+
+#: src/LYMail.c:1008
+#, c-format
+msgid "called \"%s\"\n"
+msgstr ""
+
+#: src/LYMail.c:1009
+#, c-format
+msgid "in the file \"%s\" called \"%s\"\n"
+msgstr ""
+
+#: src/LYMail.c:1010
+msgid "was requested but was not available."
+msgstr ""
+
+#: src/LYMail.c:1011
+msgid "Thought you might want to know."
+msgstr ""
+
+#: src/LYMail.c:1013
+msgid "This message was automatically generated by"
+msgstr ""
+
+#: src/LYMail.c:1728
+msgid "No system mailer configured"
+msgstr ""
+
+#: src/LYMain.c:1023
+msgid "No Winsock found, sorry."
+msgstr "找ä¸åˆ° Winsock,抱歉。"
+
+#: src/LYMain.c:1226
+msgid "You MUST define a valid TMP or TEMP area!"
+msgstr "閣下 *å¿…é ˆ* 指定有效的 TMP 或 TEMP ä½ç½®ï¼"
+
+#: src/LYMain.c:1279 src/LYMainLoop.c:5074
+msgid "No such directory"
+msgstr "該目錄ä¸å­˜åœ¨"
+
+#: src/LYMain.c:1464
+#, c-format
+msgid ""
+"\n"
+"Configuration file \"%s\" is not available.\n"
+"\n"
+msgstr ""
+"\n"
+"設定檔 %s ä¸å­˜åœ¨ã€‚\n"
+"\n"
+
+#: src/LYMain.c:1474
+#, c-format
+msgid ""
+"\n"
+"Lynx character sets not declared.\n"
+"\n"
+msgstr ""
+"\n"
+"未宣告 Lynx 所用的字元集。\n"
+"\n"
+
+#: src/LYMain.c:1503
+#, c-format
+msgid ""
+"\n"
+"Lynx edit map not declared.\n"
+"\n"
+msgstr ""
+
+#: src/LYMain.c:1579
+#, c-format
+msgid ""
+"\n"
+"Lynx file \"%s\" is not available.\n"
+"\n"
+msgstr ""
+"\n"
+"Lynx 檔案 %s ä¸å­˜åœ¨ã€‚\n"
+"\n"
+
+#: src/LYMain.c:1654
+#, c-format
+msgid "Ignored %d characters from standard input.\n"
+msgstr ""
+
+#: src/LYMain.c:1656
+#, c-format
+msgid "Use \"-stdin\" or \"-\" to tell how to handle piped input.\n"
+msgstr ""
+
+#: src/LYMain.c:1804
+msgid "Warning:"
+msgstr "警告:"
+
+#: src/LYMain.c:2372
+msgid "persistent cookies state will be changed in next session only."
+msgstr ""
+
+#: src/LYMain.c:2617 src/LYMain.c:2662
+#, c-format
+msgid "Lynx: ignoring unrecognized charset=%s\n"
+msgstr "Lynx:忽略無法識別的字元集 %s\n"
+
+#: src/LYMain.c:3181
+#, fuzzy, c-format
+msgid "%s Version %s (%s)"
+msgstr "%s 版本 %s (%s)\n"
+
+#: src/LYMain.c:3219
+#, c-format
+msgid "Built on %s %s %s\n"
+msgstr "編譯於 %s %s %s\n"
+
+#: src/LYMain.c:3241
+msgid "Copyrights held by the Lynx Developers Group,"
+msgstr ""
+
+#: src/LYMain.c:3242
+#, fuzzy
+msgid "the University of Kansas, CERN, and other contributors."
+msgstr "版權所有:University of Kansasã€CERN åŠå…¶å®ƒæœ‰è²¢ç»è€…。"
+
+#: src/LYMain.c:3243
+#, fuzzy
+msgid "Distributed under the GNU General Public License (Version 2)."
+msgstr "使用 GNU General Public License 發佈。"
+
+#: src/LYMain.c:3244
+msgid "See http://lynx.isc.org/ and the online help for more information."
+msgstr "若需è¦æ›´å¤šè³‡æ–™ï¼Œè«‹ç€è¦½ http://lynx.isc.org/ åŠç¶²ä¸Šçš„說明文件。"
+
+#: src/LYMain.c:4065
+#, c-format
+msgid "USAGE: %s [options] [file]\n"
+msgstr "用法:%s [é¸é …] [檔案]\n"
+
+#: src/LYMain.c:4066
+#, c-format
+msgid "Options are:\n"
+msgstr "é¸é …包括:\n"
+
+#: src/LYMain.c:4365
+#, c-format
+msgid "%s: Invalid Option: %s\n"
+msgstr "%s:無效的é¸é …:%s\n"
+
+#: src/LYMainLoop.c:594
+#, c-format
+msgid "Internal error: Invalid mouse link %d!"
+msgstr ""
+
+#: src/LYMainLoop.c:714 src/LYMainLoop.c:5096
+msgid "A URL specified by the user"
+msgstr "由使用者指定的 URL"
+
+#: src/LYMainLoop.c:1173
+msgid "Enctype multipart/form-data not yet supported! Cannot submit."
+msgstr ""
+
+#.
+#. * Make a name for this help file.
+#.
+#: src/LYMainLoop.c:3105
+msgid "Help Screen"
+msgstr "求助說明畫é¢"
+
+#: src/LYMainLoop.c:3226
+msgid "System Index"
+msgstr ""
+
+#: src/LYMainLoop.c:3585 src/LYMainLoop.c:5320
+msgid "Entry into main screen"
+msgstr ""
+
+#: src/LYMainLoop.c:3843
+msgid "No next document present"
+msgstr ""
+
+#: src/LYMainLoop.c:4139
+msgid "charset for this document specified explicitly, sorry..."
+msgstr "抱歉,該文件已經特地指定了字元集..."
+
+#: src/LYMainLoop.c:5052
+msgid "cd to:"
+msgstr "準備進入的目錄:"
+
+#: src/LYMainLoop.c:5077
+msgid "A component of path is not a directory"
+msgstr "路徑中的一部份ä¸æ˜¯ç›®éŒ„"
+
+#: src/LYMainLoop.c:5080
+msgid "failed to change directory"
+msgstr "無法進入目錄"
+
+#: src/LYMainLoop.c:6252
+msgid "Reparsing document under current settings..."
+msgstr "根據目å‰çš„設定é‡æ–°åˆ†æžæ–‡ä»¶..."
+
+#: src/LYMainLoop.c:6543
+#, c-format
+msgid "Fatal error - could not open output file %s\n"
+msgstr "åš´é‡éŒ¯èª¤ ─ 無法開啟輸出檔 %s\n"
+
+#: src/LYMainLoop.c:6880
+msgid "TABLE center enable."
+msgstr ""
+
+#: src/LYMainLoop.c:6883
+msgid "TABLE center disable."
+msgstr ""
+
+#: src/LYMainLoop.c:6960
+#, fuzzy
+msgid "Current URL is empty."
+msgstr "ç›®å‰çš„目錄:"
+
+#: src/LYMainLoop.c:6962 src/LYUtils.c:1828
+msgid "Copy to clipboard failed."
+msgstr ""
+
+#: src/LYMainLoop.c:6964
+msgid "Document URL put to clipboard."
+msgstr ""
+
+#: src/LYMainLoop.c:6966
+msgid "Link URL put to clipboard."
+msgstr ""
+
+#: src/LYMainLoop.c:6993
+msgid "No URL in the clipboard."
+msgstr ""
+
+#: src/LYMainLoop.c:7664 src/LYMainLoop.c:7834
+msgid "-index-"
+msgstr "─索引─"
+
+#: src/LYMainLoop.c:7774
+msgid "lynx: Can't access startfile"
+msgstr "lynx:無法存å–開始的網é "
+
+#: src/LYMainLoop.c:7786
+msgid "lynx: Start file could not be found or is not text/html or text/plain"
+msgstr ""
+
+#: src/LYMainLoop.c:7787
+msgid " Exiting..."
+msgstr " 準備離開..."
+
+#: src/LYMainLoop.c:7828
+msgid "-more-"
+msgstr "─還有內容─"
+
+#. Enable scrolling.
+#: src/LYNews.c:186
+msgid "You will be posting to:"
+msgstr ""
+
+#.
+#. * Get the mail address for the From header, offering personal_mail_address
+#. * as default.
+#.
+#: src/LYNews.c:195
+msgid ""
+"\n"
+"\n"
+" Please provide your mail address for the From: header\n"
+msgstr ""
+"\n"
+"\n"
+" 請在 From: 標頭中æ供閣下的電郵地å€\n"
+
+#.
+#. * Get the Subject header, offering the current document's title as the
+#. * default if this is a followup rather than a new post. - FM
+#.
+#: src/LYNews.c:212
+msgid ""
+"\n"
+"\n"
+" Please provide or edit the Subject: header\n"
+msgstr ""
+"\n"
+"\n"
+" è«‹æ供或修改 Subject: 標頭\n"
+
+#: src/LYNews.c:302
+msgid ""
+"\n"
+"\n"
+" Please provide or edit the Organization: header\n"
+msgstr ""
+"\n"
+"\n"
+" è«‹æ供或修改 Organization: 標頭\n"
+
+#.
+#. * Use the built in line editior.
+#.
+#: src/LYNews.c:359
+msgid ""
+"\n"
+"\n"
+" Please enter your message below."
+msgstr ""
+"\n"
+"\n"
+" 請在以下的ä½ç½®è¼¸å…¥è¨Šæ¯ã€‚"
+
+#: src/LYNews.c:405
+msgid "Message has no original text!"
+msgstr ""
+
+#: src/LYOptions.c:765
+msgid "review/edit B)ookmarks files"
+msgstr ""
+
+#: src/LYOptions.c:767
+msgid "B)ookmark file: "
+msgstr "B)書籤檔:"
+
+#: src/LYOptions.c:2127 src/LYOptions.c:2134
+msgid "ON"
+msgstr ""
+
+#. verbose_img variable
+#: src/LYOptions.c:2128 src/LYOptions.c:2133 src/LYOptions.c:2285 src/LYOptions.c:2296
+msgid "OFF"
+msgstr ""
+
+#: src/LYOptions.c:2129
+msgid "NEVER"
+msgstr ""
+
+#: src/LYOptions.c:2130
+msgid "ALWAYS"
+msgstr ""
+
+#: src/LYOptions.c:2146 src/LYOptions.c:2277
+msgid "ignore"
+msgstr ""
+
+#: src/LYOptions.c:2147
+msgid "ask user"
+msgstr ""
+
+#: src/LYOptions.c:2148
+msgid "accept all"
+msgstr ""
+
+#: src/LYOptions.c:2160
+msgid "ALWAYS OFF"
+msgstr ""
+
+#: src/LYOptions.c:2161
+msgid "FOR LOCAL FILES ONLY"
+msgstr ""
+
+#: src/LYOptions.c:2163
+msgid "ALWAYS ON"
+msgstr ""
+
+#: src/LYOptions.c:2175
+msgid "Numbers act as arrows"
+msgstr ""
+
+#: src/LYOptions.c:2177
+msgid "Links are numbered"
+msgstr ""
+
+#: src/LYOptions.c:2180
+msgid "Links and form fields are numbered"
+msgstr ""
+
+#: src/LYOptions.c:2183
+msgid "Form fields are numbered"
+msgstr ""
+
+#: src/LYOptions.c:2197
+msgid "Case insensitive"
+msgstr ""
+
+#: src/LYOptions.c:2198
+msgid "Case sensitive"
+msgstr ""
+
+#: src/LYOptions.c:2222
+msgid "prompt normally"
+msgstr ""
+
+#: src/LYOptions.c:2223
+msgid "force yes-response"
+msgstr ""
+
+#: src/LYOptions.c:2224
+msgid "force no-response"
+msgstr ""
+
+#: src/LYOptions.c:2242
+msgid "Novice"
+msgstr ""
+
+#: src/LYOptions.c:2243
+#, fuzzy
+msgid "Intermediate"
+msgstr "內部"
+
+#: src/LYOptions.c:2244
+msgid "Advanced"
+msgstr ""
+
+#: src/LYOptions.c:2253
+msgid "By First Visit"
+msgstr ""
+
+#: src/LYOptions.c:2255
+msgid "By First Visit Reversed"
+msgstr ""
+
+#: src/LYOptions.c:2256
+msgid "As Visit Tree"
+msgstr ""
+
+#: src/LYOptions.c:2257
+msgid "By Last Visit"
+msgstr ""
+
+#: src/LYOptions.c:2259
+msgid "By Last Visit Reversed"
+msgstr ""
+
+#. Old_DTD variable
+#: src/LYOptions.c:2270
+msgid "relaxed (TagSoup mode)"
+msgstr ""
+
+#: src/LYOptions.c:2271
+msgid "strict (SortaSGML mode)"
+msgstr ""
+
+#: src/LYOptions.c:2278
+msgid "as labels"
+msgstr ""
+
+#: src/LYOptions.c:2279
+#, fuzzy
+msgid "as links"
+msgstr "ä¸éš±è—çš„éˆçµ"
+
+#: src/LYOptions.c:2286
+#, fuzzy
+msgid "show filename"
+msgstr "建議的檔案å稱:"
+
+#: src/LYOptions.c:2297
+msgid "STANDARD"
+msgstr ""
+
+#: src/LYOptions.c:2298
+msgid "ADVANCED"
+msgstr ""
+
+#: src/LYOptions.c:2329
+#, fuzzy
+msgid "Directories first"
+msgstr "副目錄:"
+
+#: src/LYOptions.c:2330
+#, fuzzy
+msgid "Files first"
+msgstr " (首先測試)"
+
+#: src/LYOptions.c:2331
+#, fuzzy
+msgid "Mixed style"
+msgstr "文字編輯模å¼"
+
+#: src/LYOptions.c:2339 src/LYOptions.c:2359
+#, fuzzy
+msgid "By Name"
+msgstr "å稱:"
+
+#: src/LYOptions.c:2340 src/LYOptions.c:2360
+msgid "By Type"
+msgstr ""
+
+#: src/LYOptions.c:2341 src/LYOptions.c:2361
+msgid "By Size"
+msgstr ""
+
+#: src/LYOptions.c:2342 src/LYOptions.c:2362
+#, fuzzy
+msgid "By Date"
+msgstr "日期:"
+
+#: src/LYOptions.c:2343
+msgid "By Mode"
+msgstr ""
+
+#: src/LYOptions.c:2345
+msgid "By User"
+msgstr ""
+
+#: src/LYOptions.c:2346
+#, fuzzy
+msgid "By Group"
+msgstr "所屬群組"
+
+#: src/LYOptions.c:2371
+msgid "Do not show rate"
+msgstr ""
+
+#: src/LYOptions.c:2372 src/LYOptions.c:2373
+#, fuzzy, c-format
+msgid "Show %s/sec rate"
+msgstr "顯示傳輸速率"
+
+#: src/LYOptions.c:2375 src/LYOptions.c:2376
+#, c-format
+msgid "Show %s/sec, ETA"
+msgstr ""
+
+#: src/LYOptions.c:2379
+#, fuzzy
+msgid "Show progressbar"
+msgstr "顯示æ²å‹•åˆ—"
+
+#: src/LYOptions.c:2391
+msgid "Accept lynx's internal types"
+msgstr ""
+
+#: src/LYOptions.c:2392
+msgid "Also accept lynx.cfg's types"
+msgstr ""
+
+#: src/LYOptions.c:2393
+msgid "Also accept user's types"
+msgstr ""
+
+#: src/LYOptions.c:2394
+msgid "Also accept system's types"
+msgstr ""
+
+#: src/LYOptions.c:2395
+#, fuzzy
+msgid "Accept all types"
+msgstr "接å—更改"
+
+#: src/LYOptions.c:2404
+msgid "gzip"
+msgstr ""
+
+#: src/LYOptions.c:2405
+msgid "deflate"
+msgstr ""
+
+#: src/LYOptions.c:2408
+msgid "compress"
+msgstr ""
+
+#: src/LYOptions.c:2411
+msgid "bzip2"
+msgstr ""
+
+#: src/LYOptions.c:2413
+msgid "All"
+msgstr ""
+
+#: src/LYOptions.c:2681 src/LYOptions.c:2705
+#, c-format
+msgid "Use %s to invoke the Options menu!"
+msgstr ""
+
+#: src/LYOptions.c:3477
+msgid "(options marked with (!) will not be saved)"
+msgstr ""
+
+#: src/LYOptions.c:3485
+msgid "General Preferences"
+msgstr "一般å好設定"
+
+#. ***************************************************************
+#. User Mode: SELECT
+#: src/LYOptions.c:3489
+msgid "User mode"
+msgstr "使用者模å¼"
+
+#. Editor: INPUT
+#: src/LYOptions.c:3495
+msgid "Editor"
+msgstr "編輯器"
+
+#. Search Type: SELECT
+#: src/LYOptions.c:3500
+msgid "Type of Search"
+msgstr "æœå°‹æ–¹å¼"
+
+#: src/LYOptions.c:3505
+msgid "Security and Privacy"
+msgstr ""
+
+#. ***************************************************************
+#. Cookies: SELECT
+#: src/LYOptions.c:3509
+msgid "Cookies"
+msgstr "Cookie"
+
+#. Cookie Prompting: SELECT
+#: src/LYOptions.c:3523
+msgid "Invalid-Cookie Prompting"
+msgstr ""
+
+#. SSL Prompting: SELECT
+#: src/LYOptions.c:3530
+msgid "SSL Prompting"
+msgstr ""
+
+#: src/LYOptions.c:3536
+msgid "Keyboard Input"
+msgstr "éµç›¤è¼¸å…¥"
+
+#. ***************************************************************
+#. Keypad Mode: SELECT
+#: src/LYOptions.c:3540
+msgid "Keypad mode"
+msgstr "數字éµç›¤æ¨¡å¼"
+
+#. Emacs keys: ON/OFF
+#: src/LYOptions.c:3546
+msgid "Emacs keys"
+msgstr "Emacs 組åˆéµ"
+
+#. VI Keys: ON/OFF
+#: src/LYOptions.c:3552
+msgid "VI keys"
+msgstr "VI 組åˆéµ"
+
+#. Line edit style: SELECT
+#. well, at least 2 line edit styles available
+#: src/LYOptions.c:3559
+msgid "Line edit style"
+msgstr "文字編輯模å¼"
+
+#. Keyboard layout: SELECT
+#: src/LYOptions.c:3571
+msgid "Keyboard layout"
+msgstr "éµç›¤é…ç½®"
+
+#.
+#. * Display and Character Set
+#.
+#: src/LYOptions.c:3585
+msgid "Display and Character Set"
+msgstr "顯示åŠå­—元集"
+
+#. Use locale-based character set: ON/OFF
+#: src/LYOptions.c:3590
+#, fuzzy
+msgid "Use locale-based character set"
+msgstr "後備的字元集"
+
+#. Display Character Set: SELECT
+#: src/LYOptions.c:3599
+msgid "Display character set"
+msgstr "é è¨­é¡¯ç¤ºçš„字元集"
+
+#: src/LYOptions.c:3630
+msgid "Assumed document character set"
+msgstr "後備的字元集"
+
+#.
+#. * Since CJK people hardly mixed with other world
+#. * we split the header to make it more readable:
+#. * "CJK mode" for CJK display charsets, and "Raw 8-bit" for others.
+#.
+#: src/LYOptions.c:3650
+msgid "CJK mode"
+msgstr "CJK 模å¼"
+
+#: src/LYOptions.c:3652
+msgid "Raw 8-bit"
+msgstr "8-bit 原始模å¼"
+
+#. X Display: INPUT
+#: src/LYOptions.c:3660
+msgid "X Display"
+msgstr "X ç•«é¢"
+
+#.
+#. * Document Appearance
+#.
+#: src/LYOptions.c:3666
+msgid "Document Appearance"
+msgstr "文件外觀"
+
+#: src/LYOptions.c:3672
+msgid "Show color"
+msgstr "顯示色彩"
+
+#. Show cursor: ON/OFF
+#: src/LYOptions.c:3696
+msgid "Show cursor"
+msgstr "顯示游標"
+
+#. Underline links: ON/OFF
+#: src/LYOptions.c:3702
+#, fuzzy
+msgid "Underline links"
+msgstr "éš±è—çš„éˆçµï¼š"
+
+#. Show scrollbar: ON/OFF
+#: src/LYOptions.c:3709
+msgid "Show scrollbar"
+msgstr "顯示æ²å‹•åˆ—"
+
+#. Select Popups: ON/OFF
+#: src/LYOptions.c:3716
+msgid "Popups for select fields"
+msgstr ""
+
+#. HTML error recovery: SELECT
+#: src/LYOptions.c:3722
+msgid "HTML error recovery"
+msgstr ""
+
+#. Show Images: SELECT
+#: src/LYOptions.c:3728
+msgid "Show images"
+msgstr "顯示圖åƒ"
+
+#. Verbose Images: ON/OFF
+#: src/LYOptions.c:3742
+msgid "Verbose images"
+msgstr "圖åƒè©³ç´°è³‡æ–™"
+
+#.
+#. * Headers Transferred to Remote Servers
+#.
+#: src/LYOptions.c:3750
+msgid "Headers Transferred to Remote Servers"
+msgstr "傳é€è‡³é ç«¯ä¼ºæœå™¨çš„標頭資料"
+
+#. ***************************************************************
+#. Mail Address: INPUT
+#: src/LYOptions.c:3754
+msgid "Personal mail address"
+msgstr "個人電郵地å€"
+
+#: src/LYOptions.c:3760
+#, fuzzy
+msgid "Password for anonymous ftp"
+msgstr "æ–°èžçµ„主機‘%s’的密碼:"
+
+#. Preferred media type: SELECT
+#: src/LYOptions.c:3766
+#, fuzzy
+msgid "Preferred media type"
+msgstr "已傳輸 %d ä½å…ƒçµ„"
+
+#. Preferred encoding: SELECT
+#: src/LYOptions.c:3772
+#, fuzzy
+msgid "Preferred encoding"
+msgstr "優先使用的語言"
+
+#. Preferred Document Character Set: INPUT
+#: src/LYOptions.c:3778
+msgid "Preferred document character set"
+msgstr "優先使用的字元集"
+
+#. Preferred Document Language: INPUT
+#: src/LYOptions.c:3783
+msgid "Preferred document language"
+msgstr "優先使用的語言"
+
+#: src/LYOptions.c:3789
+msgid "User-Agent header"
+msgstr "User-Agent 標頭"
+
+#.
+#. * Listing and Accessing Files
+#.
+#: src/LYOptions.c:3797
+msgid "Listing and Accessing Files"
+msgstr "列出åŠå­˜å–檔案"
+
+#. FTP sort: SELECT
+#: src/LYOptions.c:3802
+msgid "Use Passive FTP"
+msgstr ""
+
+#. FTP sort: SELECT
+#: src/LYOptions.c:3808
+msgid "FTP sort criteria"
+msgstr "FTP 項目排åºæ¢ä»¶"
+
+#. Local Directory Sort: SELECT
+#: src/LYOptions.c:3816
+msgid "Local directory sort criteria"
+msgstr "本地端目錄排åºæ¢ä»¶"
+
+#. Local Directory Order: SELECT
+#: src/LYOptions.c:3822
+msgid "Local directory sort order"
+msgstr "本地端目錄排列次åº"
+
+#: src/LYOptions.c:3831
+msgid "Show dot files"
+msgstr "顯示隱è—檔"
+
+#: src/LYOptions.c:3839
+msgid "Execution links"
+msgstr ""
+
+#. Show transfer rate: SELECT
+#: src/LYOptions.c:3859
+msgid "Show transfer rate"
+msgstr "顯示傳輸速率"
+
+#.
+#. * Special Files and Screens
+#.
+#: src/LYOptions.c:3879
+msgid "Special Files and Screens"
+msgstr "特殊檔案åŠç•«é¢"
+
+#: src/LYOptions.c:3884
+msgid "Multi-bookmarks"
+msgstr "多書籤檔模å¼"
+
+#: src/LYOptions.c:3892
+msgid "Review/edit Bookmarks files"
+msgstr "å¯ç€è¦½æˆ–編輯書籤檔"
+
+#: src/LYOptions.c:3894
+msgid "Goto multi-bookmark menu"
+msgstr "進入多書籤檔模å¼é¸å–®"
+
+#: src/LYOptions.c:3896
+msgid "Bookmarks file"
+msgstr "書籤檔"
+
+#. Auto Session: ON/OFF
+#: src/LYOptions.c:3903
+msgid "Auto Session"
+msgstr ""
+
+#. Session File Menu: INPUT
+#: src/LYOptions.c:3909
+msgid "Session file"
+msgstr ""
+
+#. Visited Pages: SELECT
+#: src/LYOptions.c:3915
+msgid "Visited Pages"
+msgstr "曾經ç€è¦½çš„網é "
+
+#: src/LYOptions.c:3920
+msgid "View the file "
+msgstr ""
+
+#: src/LYPrint.c:937
+#, c-format
+msgid " Print job complete.\n"
+msgstr " 完æˆåˆ—å°ç¨‹åºã€‚\n"
+
+#: src/LYPrint.c:1262
+msgid "Document:"
+msgstr "文件:"
+
+#: src/LYPrint.c:1263
+msgid "Number of lines:"
+msgstr "行數:"
+
+#: src/LYPrint.c:1264
+msgid "Number of pages:"
+msgstr "é æ•¸ï¼š"
+
+#: src/LYPrint.c:1265
+msgid "pages"
+msgstr "é "
+
+#: src/LYPrint.c:1265
+msgid "page"
+msgstr "é "
+
+#: src/LYPrint.c:1266
+msgid "(approximately)"
+msgstr "(粗略估計)"
+
+#: src/LYPrint.c:1273
+msgid "Some print functions have been disabled!"
+msgstr "å·²ç¦æ­¢ä½¿ç”¨æŸéƒ¨ä»½çš„列å°åŠŸèƒ½ï¼"
+
+#: src/LYPrint.c:1277
+msgid "Standard print options:"
+msgstr "標準的列å°è™•ç†æ–¹å¼ï¼š"
+
+#: src/LYPrint.c:1278
+msgid "Print options:"
+msgstr "列å°é¸é …:"
+
+#: src/LYPrint.c:1285
+msgid "Save to a local file"
+msgstr "儲存至本機的檔案"
+
+#: src/LYPrint.c:1287
+msgid "Save to disk disabled"
+msgstr "ç¦æ­¢å°‡å…§å®¹å„²å­˜è‡³ç£ç¢Ÿ"
+
+#: src/LYPrint.c:1294
+msgid "Mail the file"
+msgstr "郵寄檔案"
+
+#: src/LYPrint.c:1301
+msgid "Print to the screen"
+msgstr "在畫é¢å°å‡ºè³‡æ–™"
+
+#: src/LYPrint.c:1306
+msgid "Print out on a printer attached to your vt100 terminal"
+msgstr "在連接 vt100 終端機的å°è¡¨æ©Ÿåˆ—å°è³‡æ–™"
+
+#: src/LYReadCFG.c:371
+#, c-format
+msgid ""
+"Syntax Error parsing COLOR in configuration file:\n"
+"The line must be of the form:\n"
+"COLOR:INTEGER:FOREGROUND:BACKGROUND\n"
+"\n"
+"Here FOREGROUND and BACKGROUND must be one of:\n"
+"The special strings 'nocolor' or 'default', or\n"
+msgstr ""
+
+#: src/LYReadCFG.c:384
+msgid "Offending line:"
+msgstr ""
+
+#: src/LYReadCFG.c:681
+#, c-format
+msgid "key remapping of %s to %s for %s failed\n"
+msgstr ""
+
+#: src/LYReadCFG.c:688
+#, c-format
+msgid "key remapping of %s to %s failed\n"
+msgstr ""
+
+#: src/LYReadCFG.c:709
+#, c-format
+msgid "invalid line-editor selection %s for key %s, selecting all\n"
+msgstr ""
+
+#: src/LYReadCFG.c:734 src/LYReadCFG.c:746
+#, c-format
+msgid "setting of line-editor binding for key %s (0x%x) to 0x%x for %s failed\n"
+msgstr ""
+
+#: src/LYReadCFG.c:750
+#, c-format
+msgid "setting of line-editor binding for key %s (0x%x) for %s failed\n"
+msgstr ""
+
+#: src/LYReadCFG.c:846
+#, c-format
+msgid "Lynx: cannot start, CERN rules file %s is not available\n"
+msgstr ""
+
+#: src/LYReadCFG.c:847
+msgid "(no name)"
+msgstr ""
+
+#: src/LYReadCFG.c:1881
+#, c-format
+msgid "More than %d nested lynx.cfg includes -- perhaps there is a loop?!?\n"
+msgstr ""
+
+#: src/LYReadCFG.c:1883
+#, c-format
+msgid "Last attempted include was '%s',\n"
+msgstr ""
+
+#: src/LYReadCFG.c:1884
+#, c-format
+msgid "included from '%s'.\n"
+msgstr ""
+
+#: src/LYReadCFG.c:2292 src/LYReadCFG.c:2305 src/LYReadCFG.c:2363
+msgid "The following is read from your lynx.cfg file."
+msgstr "以下是從閣下的 lynx.cfg 檔案讀å–的設定。"
+
+#: src/LYReadCFG.c:2293 src/LYReadCFG.c:2306
+msgid "Please read the distribution"
+msgstr ""
+
+#: src/LYReadCFG.c:2299 src/LYReadCFG.c:2309
+msgid "for more comments."
+msgstr ""
+
+#: src/LYReadCFG.c:2345
+msgid "RELOAD THE CHANGES"
+msgstr "é‡æ–°è¼‰å…¥æ›´æ”¹å¾Œçš„設定"
+
+#: src/LYReadCFG.c:2353
+msgid "Your primary configuration"
+msgstr "主è¦çµ„æ…‹"
+
+#: src/LYShowInfo.c:173
+msgid "Directory that you are currently viewing"
+msgstr "ç›®å‰ç€è¦½çš„目錄"
+
+#: src/LYShowInfo.c:176
+msgid "Name:"
+msgstr "å稱:"
+
+#: src/LYShowInfo.c:179
+msgid "URL:"
+msgstr "URL:"
+
+#: src/LYShowInfo.c:193
+msgid "Directory that you have currently selected"
+msgstr "ç›®å‰é¸å–的目錄"
+
+#: src/LYShowInfo.c:195
+msgid "File that you have currently selected"
+msgstr "ç›®å‰é¸å–的檔案"
+
+#: src/LYShowInfo.c:198
+msgid "Symbolic link that you have currently selected"
+msgstr "ç›®å‰é¸å–的符號連çµ"
+
+#: src/LYShowInfo.c:201
+msgid "Item that you have currently selected"
+msgstr "ç›®å‰é¸å–çš„é …ç›®"
+
+#: src/LYShowInfo.c:203
+msgid "Full name:"
+msgstr "完整å稱:"
+
+#: src/LYShowInfo.c:213
+msgid "Unable to follow link"
+msgstr ""
+
+#: src/LYShowInfo.c:215
+msgid "Points to file:"
+msgstr ""
+
+#: src/LYShowInfo.c:220
+msgid "Name of owner:"
+msgstr "æ“有者å稱:"
+
+#: src/LYShowInfo.c:223
+msgid "Group name:"
+msgstr "群組å稱:"
+
+#: src/LYShowInfo.c:225
+msgid "File size:"
+msgstr "檔案大å°ï¼š"
+
+#: src/LYShowInfo.c:227
+#, fuzzy
+msgid "(bytes)"
+msgstr "ä½å…ƒçµ„"
+
+#.
+#. * Include date and time information.
+#.
+#: src/LYShowInfo.c:232
+msgid "Creation date:"
+msgstr "製作日期:"
+
+#: src/LYShowInfo.c:235
+msgid "Last modified:"
+msgstr "最後修改時間:"
+
+#: src/LYShowInfo.c:238
+msgid "Last accessed:"
+msgstr "最後存å–時間:"
+
+#: src/LYShowInfo.c:244
+msgid "Access Permissions"
+msgstr "å­˜å–的權é™"
+
+#: src/LYShowInfo.c:279
+#, fuzzy
+msgid "Group:"
+msgstr "所屬群組"
+
+#: src/LYShowInfo.c:299
+msgid "World:"
+msgstr ""
+
+#: src/LYShowInfo.c:306
+msgid "File that you are currently viewing"
+msgstr "ç›®å‰æ­£åœ¨ç€è¦½çš„檔案"
+
+#: src/LYShowInfo.c:314 src/LYShowInfo.c:418
+msgid "Linkname:"
+msgstr "éˆçµå稱:"
+
+#: src/LYShowInfo.c:320 src/LYShowInfo.c:335
+msgid "Charset:"
+msgstr "字元集:"
+
+#: src/LYShowInfo.c:334
+msgid "(assumed)"
+msgstr ""
+
+#: src/LYShowInfo.c:341
+msgid "Server:"
+msgstr "伺æœå™¨ï¼š"
+
+#: src/LYShowInfo.c:344
+msgid "Date:"
+msgstr "日期:"
+
+#: src/LYShowInfo.c:347
+msgid "Last Mod:"
+msgstr "最後修改:"
+
+#: src/LYShowInfo.c:352
+msgid "Expires:"
+msgstr ""
+
+#: src/LYShowInfo.c:355
+msgid "Cache-Control:"
+msgstr ""
+
+#: src/LYShowInfo.c:358
+msgid "Content-Length:"
+msgstr ""
+
+#: src/LYShowInfo.c:362
+msgid "Length:"
+msgstr ""
+
+#: src/LYShowInfo.c:367
+msgid "Language:"
+msgstr "語言:"
+
+#: src/LYShowInfo.c:374
+msgid "Post Data:"
+msgstr ""
+
+#: src/LYShowInfo.c:377
+msgid "Post Content Type:"
+msgstr ""
+
+#: src/LYShowInfo.c:380
+msgid "Owner(s):"
+msgstr "æ“有者:"
+
+#: src/LYShowInfo.c:385
+msgid "size:"
+msgstr "大å°ï¼š"
+
+#: src/LYShowInfo.c:387
+msgid "lines"
+msgstr "行"
+
+#: src/LYShowInfo.c:391
+msgid "forms mode"
+msgstr ""
+
+#: src/LYShowInfo.c:393
+msgid "source"
+msgstr ""
+
+#: src/LYShowInfo.c:394
+msgid "normal"
+msgstr ""
+
+#: src/LYShowInfo.c:396
+msgid ", safe"
+msgstr ""
+
+#: src/LYShowInfo.c:398
+msgid ", via internal link"
+msgstr ""
+
+#: src/LYShowInfo.c:403
+msgid ", no-cache"
+msgstr ""
+
+#: src/LYShowInfo.c:405
+msgid ", ISMAP script"
+msgstr ""
+
+#: src/LYShowInfo.c:407
+msgid ", bookmark file"
+msgstr ""
+
+#: src/LYShowInfo.c:411
+msgid "mode:"
+msgstr "模å¼ï¼š"
+
+#: src/LYShowInfo.c:417
+msgid "Link that you currently have selected"
+msgstr "ç›®å‰å·²é¸å–çš„éˆçµ"
+
+#: src/LYShowInfo.c:426
+msgid "Method:"
+msgstr ""
+
+#: src/LYShowInfo.c:430
+msgid "Enctype:"
+msgstr "編碼方å¼ï¼š"
+
+#: src/LYShowInfo.c:436
+#, fuzzy
+msgid "Action:"
+msgstr "ä½ç½®ï¼š"
+
+#: src/LYShowInfo.c:441
+msgid "(Form field)"
+msgstr ""
+
+#: src/LYShowInfo.c:450
+msgid "No Links on the current page"
+msgstr "該é é¢æ²’有任何éˆçµ"
+
+#: src/LYShowInfo.c:455
+#, fuzzy
+msgid "Server Headers:"
+msgstr "伺æœå™¨ï¼š"
+
+#: src/LYStyle.c:312
+#, c-format
+msgid ""
+"Syntax Error parsing style in lss file:\n"
+"[%s]\n"
+"The line must be of the form:\n"
+"OBJECT:MONO:COLOR (ie em:bold:brightblue:white)\n"
+"where OBJECT is one of EM,STRONG,B,I,U,BLINK etc.\n"
+"\n"
+msgstr ""
+
+#: src/LYTraversal.c:108
+msgid "here is a list of the history stack so that you may rebuild"
+msgstr ""
+
+#: src/LYUpload.c:75
+msgid "ERROR! - upload command is misconfigured"
+msgstr "錯誤ï¼â”€ 未有正確地設定用來上傳檔案的指令"
+
+#: src/LYUpload.c:96
+msgid "Illegal redirection \"../\" found! Request ignored."
+msgstr "出ç¾ä¸åˆæ³•çš„é‡æ–°å°Žå‘“../â€ï¼å¿½ç•¥è©²è¦æ±‚。"
+
+#: src/LYUpload.c:99
+msgid "Illegal character \"/\" found! Request ignored."
+msgstr "出ç¾ä¸åˆæ³•çš„字元“/â€ï¼å¿½ç•¥è©²è¦æ±‚。"
+
+#: src/LYUpload.c:102
+msgid "Illegal redirection using \"~\" found! Request ignored."
+msgstr "出ç¾ä¸åˆæ³•è€Œä¸”使用“~â€çš„é‡æ–°å°Žå‘è¦æ±‚ï¼å¿½ç•¥è©²è¦æ±‚。"
+
+#: src/LYUpload.c:159
+msgid "Unable to upload file."
+msgstr "無法上傳檔案。"
+
+#: src/LYUpload.c:201
+msgid "Upload To:"
+msgstr "上傳至:"
+
+#: src/LYUpload.c:202
+msgid "Upload options:"
+msgstr "上傳é¸é …:"
+
+#: src/LYUtils.c:1830
+msgid "Download document URL put to clipboard."
+msgstr ""
+
+#: src/LYUtils.c:2615
+msgid "Unexpected access protocol for this URL scheme."
+msgstr ""
+
+#: src/LYUtils.c:3419
+msgid "Too many tempfiles"
+msgstr "太多暫存檔"
+
+#: src/LYUtils.c:3719
+msgid "unknown restriction"
+msgstr ""
+
+#: src/LYUtils.c:3750
+#, c-format
+msgid "No restrictions set.\n"
+msgstr ""
+
+#: src/LYUtils.c:3753
+#, c-format
+msgid "Restrictions set:\n"
+msgstr ""
+
+#: src/LYUtils.c:5131
+msgid "Cannot find HOME directory"
+msgstr "找ä¸åˆ°å€‹äººç›®éŒ„"
+
+#: src/LYrcFile.c:16
+msgid "Normally disabled. See ENABLE_LYNXRC in lynx.cfg\n"
+msgstr "一般ä¸æœƒå•Ÿç”¨ã€‚è«‹åƒè€ƒ lynx.cfg 中的 ENABLE_LYNXRC\n"
+
+#: src/LYrcFile.c:317
+msgid ""
+"accept_all_cookies allows the user to tell Lynx to automatically\n"
+"accept all cookies if desired. The default is \"FALSE\" which will\n"
+"prompt for each cookie. Set accept_all_cookies to \"TRUE\" to accept\n"
+"all cookies.\n"
+msgstr ""
+
+#: src/LYrcFile.c:325
+msgid ""
+"anonftp_password allows the user to tell Lynx to use the personal\n"
+"email address as the password for anonymous ftp. If no value is given,\n"
+"Lynx will use the personal email address. Set anonftp_password\n"
+"to a different value if you choose.\n"
+msgstr ""
+
+#: src/LYrcFile.c:332
+msgid ""
+"bookmark_file specifies the name and location of the default bookmark\n"
+"file into which the user can paste links for easy access at a later\n"
+"date.\n"
+msgstr ""
+
+#: src/LYrcFile.c:337
+msgid ""
+"If case_sensitive_searching is \"on\" then when the user invokes a search\n"
+"using the 's' or '/' keys, the search performed will be case sensitive\n"
+"instead of case INsensitive. The default is usually \"off\".\n"
+msgstr ""
+
+#: src/LYrcFile.c:342
+msgid ""
+"The character_set definition controls the representation of 8 bit\n"
+"characters for your terminal. If 8 bit characters do not show up\n"
+"correctly on your screen you may try changing to a different 8 bit\n"
+"set or using the 7 bit character approximations.\n"
+"Current valid characters sets are:\n"
+msgstr ""
+
+#: src/LYrcFile.c:349
+msgid ""
+"cookie_accept_domains and cookie_reject_domains are comma-delimited\n"
+"lists of domains from which Lynx should automatically accept or reject\n"
+"all cookies. If a domain is specified in both options, rejection will\n"
+"take precedence. The accept_all_cookies parameter will override any\n"
+"settings made here.\n"
+msgstr ""
+
+#: src/LYrcFile.c:357
+msgid ""
+"cookie_file specifies the file from which to read persistent cookies.\n"
+"The default is ~/"
+msgstr ""
+
+#: src/LYrcFile.c:362
+msgid ""
+"cookie_loose_invalid_domains, cookie_strict_invalid_domains, and\n"
+"cookie_query_invalid_domains are comma-delimited lists of which domains\n"
+"should be subjected to varying degrees of validity checking. If a\n"
+"domain is set to strict checking, strict conformance to RFC2109 will\n"
+"be applied. A domain with loose checking will be allowed to set cookies\n"
+"with an invalid path or domain attribute. All domains will default to\n"
+"querying the user for an invalid path or domain.\n"
+msgstr ""
+
+#: src/LYrcFile.c:376
+msgid ""
+"dir_list_order specifies the directory list order under DIRED_SUPPORT\n"
+"(if implemented). The default is \"ORDER_BY_NAME\"\n"
+msgstr ""
+
+#: src/LYrcFile.c:381
+msgid ""
+"dir_list_styles specifies the directory list style under DIRED_SUPPORT\n"
+"(if implemented). The default is \"MIXED_STYLE\", which sorts both\n"
+"files and directories together. \"FILES_FIRST\" lists files first and\n"
+"\"DIRECTORIES_FIRST\" lists directories first.\n"
+msgstr ""
+
+#: src/LYrcFile.c:389
+msgid ""
+"If emacs_keys is to \"on\" then the normal EMACS movement keys:\n"
+" ^N = down ^P = up\n"
+" ^B = left ^F = right\n"
+"will be enabled.\n"
+msgstr ""
+"如果將 emacs_keys 設定為“onâ€ï¼Œå‰‡æœƒå•Ÿç”¨ä¸€èˆ¬çš„ EMACS æ–¹å‘按éµï¼š\n"
+" ^N = 下移 ^P = 上移\n"
+" ^B = 左移 ^F = å³ç§»\n"
+
+#: src/LYrcFile.c:395
+msgid ""
+"file_editor specifies the editor to be invoked when editing local files\n"
+"or sending mail. If no editor is specified, then file editing is disabled\n"
+"unless it is activated from the command line, and the built-in line editor\n"
+"will be used for sending mail.\n"
+msgstr ""
+
+#: src/LYrcFile.c:402
+msgid ""
+"The file_sorting_method specifies which value to sort on when viewing\n"
+"file lists such as FTP directories. The options are:\n"
+" BY_FILENAME -- sorts on the name of the file\n"
+" BY_TYPE -- sorts on the type of the file\n"
+" BY_SIZE -- sorts on the size of the file\n"
+" BY_DATE -- sorts on the date of the file\n"
+msgstr ""
+
+#: src/LYrcFile.c:424
+msgid ""
+"lineedit_mode specifies the key binding used for inputting strings in\n"
+"prompts and forms. If lineedit_mode is set to \"Default Binding\" then\n"
+"the following control characters are used for moving and deleting:\n"
+"\n"
+" Prev Next Enter = Accept input\n"
+" Move char: <- -> ^G = Cancel input\n"
+" Move word: ^P ^N ^U = Erase line\n"
+" Delete char: ^H ^R ^A = Beginning of line\n"
+" Delete word: ^B ^F ^E = End of line\n"
+"\n"
+"Current lineedit modes are:\n"
+msgstr ""
+
+#: src/LYrcFile.c:442
+msgid ""
+"The following allow you to define sub-bookmark files and descriptions.\n"
+"The format is multi_bookmark<capital_letter>=<filename>,<description>\n"
+"Up to 26 bookmark files (for the English capital letters) are allowed.\n"
+"We start with \"multi_bookmarkB\" since 'A' is the default (see above).\n"
+msgstr ""
+
+#: src/LYrcFile.c:448
+msgid ""
+"personal_mail_address specifies your personal mail address. The\n"
+"address will be sent during HTTP file transfers for authorization and\n"
+"logging purposes, and for mailed comments.\n"
+"If you do not want this information given out, set the NO_FROM_HEADER\n"
+"to TRUE in lynx.cfg, or use the -nofrom command line switch. You also\n"
+"could leave this field blank, but then you won't have it included in\n"
+"your mailed comments.\n"
+msgstr ""
+
+#: src/LYrcFile.c:457
+msgid ""
+"preferred_charset specifies the character set in MIME notation (e.g.,\n"
+"ISO-8859-2, ISO-8859-5) which Lynx will indicate you prefer in requests\n"
+"to http servers using an Accept-Charset header. The value should NOT\n"
+"include ISO-8859-1 or US-ASCII, since those values are always assumed\n"
+"by default. May be a comma-separated list.\n"
+"If a file in that character set is available, the server will send it.\n"
+"If no Accept-Charset header is present, the default is that any\n"
+"character set is acceptable. If an Accept-Charset header is present,\n"
+"and if the server cannot send a response which is acceptable\n"
+"according to the Accept-Charset header, then the server SHOULD send\n"
+"an error response, though the sending of an unacceptable response\n"
+"is also allowed.\n"
+msgstr ""
+
+#: src/LYrcFile.c:473
+msgid ""
+"preferred_language specifies the language in MIME notation (e.g., en,\n"
+"fr, may be a comma-separated list in decreasing preference)\n"
+"which Lynx will indicate you prefer in requests to http servers.\n"
+"If a file in that language is available, the server will send it.\n"
+"Otherwise, the server will send the file in its default language.\n"
+msgstr ""
+
+#: src/LYrcFile.c:484
+msgid ""
+"If run_all_execution_links is set \"on\" then all local execution links\n"
+"will be executed when they are selected.\n"
+"\n"
+"WARNING - This is potentially VERY dangerous. Since you may view\n"
+" information that is written by unknown and untrusted sources\n"
+" there exists the possibility that Trojan horse links could be\n"
+" written. Trojan horse links could be written to erase files\n"
+" or compromise security. This should only be set to \"on\" if\n"
+" you are viewing trusted source information.\n"
+msgstr ""
+
+#: src/LYrcFile.c:495
+msgid ""
+"If run_execution_links_on_local_files is set \"on\" then all local\n"
+"execution links that are found in LOCAL files will be executed when they\n"
+"are selected. This is different from run_all_execution_links in that\n"
+"only files that reside on the local system will have execution link\n"
+"permissions.\n"
+"\n"
+"WARNING - This is potentially dangerous. Since you may view\n"
+" information that is written by unknown and untrusted sources\n"
+" there exists the possibility that Trojan horse links could be\n"
+" written. Trojan horse links could be written to erase files\n"
+" or compromise security. This should only be set to \"on\" if\n"
+" you are viewing trusted source information.\n"
+msgstr ""
+
+#: src/LYrcFile.c:513
+msgid ""
+"select_popups specifies whether the OPTIONs in a SELECT block which\n"
+"lacks a MULTIPLE attribute are presented as a vertical list of radio\n"
+"buttons or via a popup menu. Note that if the MULTIPLE attribute is\n"
+"present in the SELECT start tag, Lynx always will create a vertical list\n"
+"of checkboxes for the OPTIONs. A value of \"on\" will set popup menus\n"
+"as the default while a value of \"off\" will set use of radio boxes.\n"
+"The default can be overridden via the -popup command line toggle.\n"
+msgstr ""
+
+#: src/LYrcFile.c:523
+msgid ""
+"show_color specifies how to set the color mode at startup. A value of\n"
+"\"never\" will force color mode off (treat the terminal as monochrome)\n"
+"at startup even if the terminal appears to be color capable. A value of\n"
+"\"always\" will force color mode on even if the terminal appears to be\n"
+"monochrome, if this is supported by the library used to build lynx.\n"
+"A value of \"default\" will yield the behavior of assuming\n"
+"a monochrome terminal unless color capability is inferred at startup\n"
+"based on the terminal type, or the -color command line switch is used, or\n"
+"the COLORTERM environment variable is set. The default behavior always is\n"
+"used in anonymous accounts or if the \"option_save\" restriction is set.\n"
+"The effect of the saved value can be overridden via\n"
+"the -color and -nocolor command line switches.\n"
+"The mode set at startup can be changed via the \"show color\" option in\n"
+"the 'o'ptions menu. If the option settings are saved, the \"on\" and\n"
+"\"off\" \"show color\" settings will be treated as \"default\".\n"
+msgstr ""
+
+#: src/LYrcFile.c:540
+msgid ""
+"show_cursor specifies whether to 'hide' the cursor to the right (and\n"
+"bottom, if possible) of the screen, or to place it to the left of the\n"
+"current link in documents, or current option in select popup windows.\n"
+"Positioning the cursor to the left of the current link or option is\n"
+"helpful for speech or braille interfaces, and when the terminal is\n"
+"one which does not distinguish the current link based on highlighting\n"
+"or color. A value of \"on\" will set positioning to the left as the\n"
+"default while a value of \"off\" will set 'hiding' of the cursor.\n"
+"The default can be overridden via the -show_cursor command line toggle.\n"
+msgstr ""
+
+#: src/LYrcFile.c:551
+msgid ""
+"show_dotfiles specifies that the directory listing should include\n"
+"\"hidden\" (dot) files/directories. If set \"on\", this will be\n"
+"honored only if enabled via userdefs.h and/or lynx.cfg, and not\n"
+"restricted via a command line switch. If display of hidden files\n"
+"is disabled, creation of such files via Lynx also is disabled.\n"
+msgstr ""
+
+#: src/LYrcFile.c:562
+msgid ""
+"If sub_bookmarks is not turned \"off\", and multiple bookmarks have\n"
+"been defined (see below), then all bookmark operations will first\n"
+"prompt the user to select an active sub-bookmark file. If the default\n"
+"Lynx bookmark_file is defined (see above), it will be used as the\n"
+"default selection. When this option is set to \"advanced\", and the\n"
+"user mode is advanced, the 'v'iew bookmark command will invoke a\n"
+"statusline prompt instead of the menu seen in novice and intermediate\n"
+"user modes. When this option is set to \"standard\", the menu will be\n"
+"presented regardless of user mode.\n"
+msgstr ""
+
+#: src/LYrcFile.c:576
+msgid ""
+"user_mode specifies the users level of knowledge with Lynx. The\n"
+"default is \"NOVICE\" which displays two extra lines of help at the\n"
+"bottom of the screen to aid the user in learning the basic Lynx\n"
+"commands. Set user_mode to \"INTERMEDIATE\" to turn off the extra info.\n"
+"Use \"ADVANCED\" to see the URL of the currently selected link at the\n"
+"bottom of the screen.\n"
+msgstr ""
+
+#: src/LYrcFile.c:585
+msgid ""
+"If verbose_images is \"on\", lynx will print the name of the image\n"
+"source file in place of [INLINE], [LINK] or [IMAGE]\n"
+"See also VERBOSE_IMAGES in lynx.cfg\n"
+msgstr ""
+
+#: src/LYrcFile.c:590
+msgid ""
+"If vi_keys is set to \"on\", then the normal VI movement keys:\n"
+" j = down k = up\n"
+" h = left l = right\n"
+"will be enabled. These keys are only lower case.\n"
+"Capital 'H', 'J' and 'K will still activate help, jump shortcuts,\n"
+"and the keymap display, respectively.\n"
+msgstr ""
+
+#: src/LYrcFile.c:598
+msgid ""
+"The visited_links setting controls how Lynx organizes the information\n"
+"in the Visited Links Page.\n"
+msgstr ""
+
+#: src/LYrcFile.c:819
+msgid ""
+"If keypad_mode is set to \"NUMBERS_AS_ARROWS\", then the numbers on\n"
+"your keypad when the numlock is on will act as arrow keys:\n"
+" 8 = Up Arrow\n"
+" 4 = Left Arrow 6 = Right Arrow\n"
+" 2 = Down Arrow\n"
+"and the corresponding keyboard numbers will act as arrow keys,\n"
+"regardless of whether numlock is on.\n"
+msgstr ""
+
+#: src/LYrcFile.c:828
+msgid ""
+"If keypad_mode is set to \"LINKS_ARE_NUMBERED\", then numbers will\n"
+"appear next to each link and numbers are used to select links.\n"
+msgstr ""
+
+#: src/LYrcFile.c:832
+msgid ""
+"If keypad_mode is set to \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\", then\n"
+"numbers will appear next to each link and visible form input field.\n"
+"Numbers are used to select links, or to move the \"current link\" to a\n"
+"form input field or button. In addition, options in popup menus are\n"
+"indexed so that the user may type an option number to select an option in\n"
+"a popup menu, even if the option isn't visible on the screen. Reference\n"
+"lists and output from the list command also enumerate form inputs.\n"
+msgstr ""
+
+#: src/LYrcFile.c:841
+msgid ""
+"NOTE: Some fixed format documents may look disfigured when\n"
+"\"LINKS_ARE_NUMBERED\" or \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\" are\n"
+"enabled.\n"
+msgstr ""
+
+#: src/LYrcFile.c:873
+msgid ""
+"Lynx User Defaults File\n"
+"\n"
+msgstr ""
+
+#: src/LYrcFile.c:882
+msgid ""
+"This file contains options saved from the Lynx Options Screen (normally\n"
+"with the 'o' key). To save options with that screen, you must select the\n"
+"checkbox:\n"
+msgstr ""
+
+#: src/LYrcFile.c:889
+msgid ""
+"You must then save the settings using the link on the line above the\n"
+"checkbox:\n"
+msgstr ""
+
+#: src/LYrcFile.c:896
+msgid ""
+"You may also use the command-line option \"-forms_options\", which displays\n"
+"the simpler Options Menu instead. Save options with that using the '>' key.\n"
+"\n"
+msgstr ""
+
+#: src/LYrcFile.c:903
+msgid ""
+"This file contains options saved from the Lynx Options Screen (normally\n"
+"with the '>' key).\n"
+"\n"
+msgstr ""
+
+#: src/LYrcFile.c:910
+msgid ""
+"There is normally no need to edit this file manually, since the defaults\n"
+"here can be controlled from the Options Screen, and the next time options\n"
+"are saved from the Options Screen this file will be completely rewritten.\n"
+"You have been warned...\n"
+"\n"
+"If you are looking for the general configuration file - it is normally\n"
+"called \"lynx.cfg\". It has different content and a different format.\n"
+"It is not this file.\n"
+msgstr ""
+
+#~ msgid "reason unknown."
+#~ msgstr "原因ä¸è©³ã€‚"
+
+#~ msgid "KB"
+#~ msgstr "KB"
+
+#~ msgid "Remove '%s' and all of its contents?"
+#~ msgstr "移除‘%s’åŠå…¶ä¸­æ‰€æœ‰çš„內容?"
+
+#~ msgid "Remove directory and all of its contents?"
+#~ msgstr "移除該目錄åŠå…¶ä¸­æ‰€æœ‰çš„內容?"
+
+#~ msgid "Unable to open file management menu file."
+#~ msgstr "無法開啟檔案管ç†é¸å–®æª”案。"
diff --git a/samples/blue-background.lss b/samples/blue-background.lss
new file mode 100644
index 0000000..9c5d492
--- /dev/null
+++ b/samples/blue-background.lss
@@ -0,0 +1,95 @@
+# From: Sergey Svishchev <svs@ropnet.ru>
+# Notes:
+# I use this in OS/2 VIO window, and occasionally on Linux console.
+
+# Setting the normal and default types lets us keep (almost) the same colors
+# whether the terminal's default colors are white-on-black or black-on-white.
+# It is not exact since the default "white" is not necessarily the same color
+# as the ANSI lightgray, but is as close as we can get in a standard way.
+#
+# If you really want the terminal's default colors, and if lynx is built using
+# ncurses' default-color support, remove these two lines:
+normal: normal: lightgray: blue
+default: normal: white: blue
+
+# Normal type styles correspond to HTML tags.
+#
+# The next line (beginning with "em") means: use bold if mono, otherwise
+# brightblue on <defaultbackground>
+em: bold: brightgreen: blue
+strong: bold: brightred: blue
+b: bold: white: blue
+i: bold: yellow: blue
+alink: reverse: white: cyan
+a: bold: cyan: blue
+img: dim: gray: blue
+status: reverse: white: green
+fig: normal: gray: blue
+caption: reverse: brown: blue
+hr: normal: yellow: blue
+blockquote: normal: brightblue: blue
+#ul:normal: brown:blue
+address: normal: magenta: blue
+#title: normal:magenta:blue
+tt: dim: gray: blue
+h1: bold: yellow: blue
+label: normal: magenta: blue
+value: normal: green: blue
+q: normal: yellow: magenta
+small: dim: gray: blue
+big: bold: yellow: blue
+sup: bold: yellow: blue
+sub: dim: gray: blue
+
+# glitch fixes
+area: normal: lightgray: blue
+body: normal: lightgray: blue
+br: normal: lightgray: blue
+center: normal: lightgray: blue
+center.header: normal: lightgray: blue
+div: normal: lightgray: blue
+font: normal: lightgray: blue
+font.letter: normal: lightgray: blue
+h2: normal: lightgray: blue
+h3: normal: lightgray: blue
+h4: normal: lightgray: blue
+h5: normal: lightgray: blue
+h6: normal: lightgray: blue
+head: normal: lightgray: blue
+link: normal: lightgray: blue
+map: normal: lightgray: blue
+meta: normal: lightgray: blue
+p: normal: lightgray: blue
+table: normal: lightgray: blue
+td: normal: lightgray: blue
+tr: normal: lightgray: blue
+title: normal: lightgray: blue
+
+form: normal: lightgray: blue
+input: normal: lightgray: blue
+input.submit: normal: cyan: blue
+select: normal: lightgray: blue
+option: normal: lightgray: blue
+
+pre: normal: lightgray: blue
+dd: normal: lightgray: blue
+dt: normal: lightgray: blue
+ul: normal: lightgray: blue
+li: normal: lightgray: blue
+
+base: normal: lightgray: blue
+iframe: normal: lightgray: blue
+cite: normal: yellow: blue
+
+span.htmlsrc_comment:normal: green: blue
+span.htmlsrc_tag:normal: brightgreen: blue
+span.htmlsrc_attrib:normal: brightcyan: blue
+span.htmlsrc_attrval:normal: white: blue
+span.htmlsrc_abracket:normal: brightgreen: blue
+span.htmlsrc_entity:normal: white: blue
+##span.htmlsrc_href:
+##span.htmlsrc_entire:
+span.htmlsrc_badseq:normal: red: blue
+span.htmlsrc_badtag:normal: red: blue
+span.htmlsrc_badattr:normal: red: blue
+span.htmlsrc_sgmlspecial:normal: yellow: blue
diff --git a/samples/bright-blue.lss b/samples/bright-blue.lss
new file mode 100644
index 0000000..534e9c1
--- /dev/null
+++ b/samples/bright-blue.lss
@@ -0,0 +1,77 @@
+# From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+#
+# Colors: black, red, green, brown, blue, magenta, cyan,
+# lightgray, gray, brightred, brightgreen, yellow, brightblue,
+# brightmagenta, brightcyan, white.
+#
+# On some terminals combination of background and foreground of different
+# brightness is not supported.
+#
+# Normal type styles correspond to HTML tags.
+#
+# default should be the *last* line
+normal: normal: brightcyan: blue
+default: normal: brightcyan: blue
+
+# match "link":
+input: normal: green
+textarea: normal: white: cyan
+
+input.type.submit:normal: blue: black
+# type-less input is the same as type=text (similar to textarea)
+input.type.: normal: white: cyan
+input.type.text:normal: white: cyan
+input.type.password:normal: white: cyan
+input.type.file:normal: brightred: cyan
+
+# Shows gray on black?!
+edit.current:normal: yellow: lightgray
+#edit.current:normal:yellow:white
+edit.active:normal: black: white
+edit.active.marked:normal: white: black
+edit.prompt:normal: white: gray
+edit.prompt.marked:normal: black: white
+edit.active.arrow:normal: red: white
+edit.prompt.arrow:normal: red: gray
+edit.active.pad:normal: red: lightgray
+edit.prompt.pad:normal: white: black
+
+option:normal: red: black
+#alink:normal:red:green
+
+scroll.arrow: bold: white: default
+scroll.noarrow: normal: black: default
+scroll.bar: bold: white
+#scroll.back:reverse:green:red
+
+status: reverse: yellow: black
+h1: bold: yellow: black
+em: bold: white
+title: normal: magenta: black
+i: bold: white
+table: normal: white
+blockquote: normal: white
+
+menu.bg: normal: black: lightgray
+menu.frame: normal: black: lightgray
+menu.entry: normal: white: gray
+menu.n: normal: white: gray
+menu.active: normal: white: black
+menu.sb: normal: brightred: lightgray
+
+forwbackw.arrow:bold: red: default
+hot.paste: normal: brightred: gray
+
+# FIXME: what are these?
+em.a: reverse: black: blue
+em.b: reverse: white: black
+font.letter: normal: default: black
+link.blue: bold: white: brightblue
+link.blue.prev: bold: yellow: brightblue
+li.blue: bold: blue: black
+link.blue.next: bold: blue: black
+
+INCLUDE:lynx.lss
+
+# default should be the *last* line
+#?default: normal: brightcyan: blue
diff --git a/samples/cernrules.txt b/samples/cernrules.txt
new file mode 100644
index 0000000..6df8b30
--- /dev/null
+++ b/samples/cernrules.txt
@@ -0,0 +1,640 @@
+# This files contains examples and an explanation for the RULESFILE / RULE
+# feature.
+#
+# Rules for Lynx are experimental. They provide a rudimentary capability
+# for URL rejection and substitution based on string matching.
+# Most users and most installations will not need this feature, it is here
+# in case you find it useful. Note that this may change or go away in
+# future releases of Lynx; if you find it useful, consider describing your
+# use of it in a message to <lynx-dev@nongnu.org>.
+#
+# Syntax:
+# =======
+# Summary of common forms:
+#
+# Fail URL1
+# Map URL1 URL2 [CONDITION]
+# Pass URL1 [URL2] [CONDITION]
+# Redirect URL1 URL2 [CONDITION]
+# RedirectPerm URL1 URL2 [CONDITION]
+# UseProxy URL1 PROXYURL [CONDITION]
+# UseProxy URL1 "none" [CONDITION]
+#
+# Alert URL1 MESSAGE [CONDITION]
+# AlwaysAlert URL1 MESSAGE [CONDITION]
+# UserMsg URL1 MESSAGE [CONDITION]
+# InfoMsg URL1 MESSAGE [CONDITION]
+# Progress URL1 MESSAGE [CONDITION]
+#
+# As you may have guessed, comments are introduced by a '#' character.
+# Rules have the general form
+# Operator Operand1 [Operand2] [CONDITION]
+# with words separated by whitespace. Words containing space can be quoted
+# with "double quotes". Although normally this should not be necessary
+# necessary for URLs, it has to be used for MESSAGE Operands in Alert etc.
+# See below for an explanation of the optional CONDITION.
+#
+# Recognized operators are
+#
+# Fail URL1
+# Reject access to this URL, stop processing further rules.
+#
+# Map URL1 URL2
+# Change the current URL to URL2, then continue processing.
+#
+# Pass URL1 [URL2]
+# Accept this URL and stop processing further rules; if URL2
+# is given, apply this as the last mapping.
+# See the next item for reasons why you generally don't want to "pass"
+# a changed URL.
+#
+# RedirectTemp URL1 URL2
+# RedirectPerm URL1 URL2
+# Redirect [STATUS] URL1 URL2
+# Stop processing further rules and redirect to URL2, just as if lynx had
+# received a HTTP redirection with URL2 as the new location. This means that
+# URL2 is subject to any applicable permission checking, if it passes a new
+# request will be issued (which may result in a new round of rules checking,
+# with a new "current URL") or the new URL might be taken from the cache, and,
+# after successful loading, lynx's idea of what the loaded document's URL is
+# will be fully updated. All this does not happen if you just "pass" a changed
+# URL (or let it fall through), so this is generally the preferred way for
+# substituting URLs.
+# If the RedirectPerm variant is used, or if the optional word is supplied and
+# is either "permanent" or "301", act as if lynx had received a permanent
+# redirection (with HTTP status 301). In most cases this will not make a
+# noticeable difference. Lynx may cache the location in a special way for 301
+# redirections, so that the redirection is followed immediately the next time
+# the same original URL is accessed, without re-checking of rules. Therefore
+# the permanent variant should never be used if the desired outcome of rules
+# processing depends on variable conditions (see CONDITIONS below) or on
+# setting a special flag (see next item).
+#
+# PermitRedirection URL1
+# Mark following redirection as permitted, and continue processing. Some
+# redirection locations are normally not allowed, because permitting them in a
+# response from an arbitrary remote server would open a security hole, and
+# others are not allowed if certain restrictions options are in effect. Among
+# redirection locations normally always forbidden are lynxprog: and lynxexec:
+# schemes. With "default" anonymous restrictions in effect, many URL schemes
+# are disallowed if the user would not be allowed to use them with 'g'oto.
+# This rule allows to override the permission checking if rules processing ends
+# with a Redirect (including the RedirectPerm or RedirectTemp forms). It is
+# ignored otherwise, in particular, it does not influence acceptance if rules
+# processing ends with a "Pass" and a real redirection is received in the
+# subsequent HTTP request. If redirections are chained, it only applies to the
+# redirection that ends the same rules cycle. Note that the new URL is still
+# subject to other permission checks that are not specific to redirections; but
+# using this rule may still weaken the expected effect of -anonymous,
+# -validate, -realm, and other restriction options, including TRUSTED_EXEC and
+# similar in lynx.cfg, so be careful where you redirect to if restrictions are
+# important!
+#
+# UseProxy URL1 PROXYURL
+# Stop processing further rules, and force access through the proxy given by
+# PROXYURL. PROXYURL should have the same form as required for foo_proxy
+# environment variables and lynx.cfg options, i.e., (unless you are trying to
+# do something unusual) "http://some.proxy-server.dom:port/". This rule
+# overrides any use of a proxy (or external gateway) that might otherwise apply
+# because of environment variables or lynx.cfg options, it also overrides any
+# "no_proxy" settings.
+#
+# UseProxy URL1 none
+# Mark request as NOT using any proxy (or external gateway), and continue
+# processing(!). For a request marked this way, any subsequent UseProxy
+# rule with a PROXYURL will be ignored, and any use of a proxy (or external
+# gateway) that might otherwise apply because of environment variables or
+# lynx.cfg options will be overridden. Note that the marking will not
+# survive a Redirect rule (since that will result, if successful, in a
+# new request).
+#
+# Alert URL1 MESSAGE
+# AlwaysAlert URL1 MESSAGE
+# UserMsg URL1 MESSAGE
+# InfoMsg URL1 MESSAGE
+# Progress URL1 MESSAGE
+# These produce various kinds of statusline messages, differing in whether
+# a pause is enforced and in its duration, immediately when the rule is
+# applied. AlwaysAlert shows the message text even in non-interactive mode
+# (-dump, -source, etc.). Rule processing continues after the message is
+# shown. As usual, these rules only apply if URL1 matches. MESSAGE is
+# the text to be displayed, it can contain one occurrence of "%s" which
+# will be replaced by the current URL, literal '%' characters should be
+# doubled as "%%".
+#
+# Rules are processed sequentially first to last for each request, a rule
+# applies if the current URL matches URL1. The current URL is initially the
+# URL for the resource the user is trying to access, but may change as the
+# result of applied Map rules. case-sensitive (!) string comparison is used,
+# in addition URL1 can contain one '*' which is interpreted as a wildcard
+# matching 0 or more characters. So if for example
+# "http://example.com/dir/doc.html" is requested, it would match any of
+# the following:
+# Pass http:*
+# Pass http://example.com/*.html
+# Pass http://example.com/*
+# Pass http://example*
+# Pass http://*/doc.html
+# but not:
+# Pass http://example/*
+# Pass http://Example.COM/dir/doc.html
+# Pass http://Example.COM/*
+#
+# If a URL2 is given and also contains a '*', that character will be
+# replaced by whatever matched in URL1. Processing stops with the
+# first matching "Fail" or "Pass" or when the end of the rules is reached.
+# If the end is reached without a "Fail" or "Pass", the URL is allowed
+# (equivalent to a final "Pass *").
+#
+# The requested URL will have been transformed to Lynx's normal
+# representation. This means that local file resources should be
+# expected in the form "file://localhost/<path using slash separators>",
+# not in the machine's native representation for filenames.
+#
+# Anyone with experience configuring the venerable CERN httpd server will
+# recognize some of the syntax - in fact, the code implementing rules goes
+# back to a common ancestor. But note the differences: all URLs and URL-
+# patterns here have to be given as absolute URLs, even for local files.
+# (Absolute URLs don't imply proxying.)
+#
+# CONDITIONS
+# ----------
+# All rules mentioned can be followed by an optional CONDITION, which can
+# be used to further restrict when the rule should be applied (in addition
+# to the match on URL1). A CONDITION takes one of the forms
+# "if" CONDITIONFLAG
+# "unless" CONDITIONFLAG
+# and currently two condition flags are recognized:
+# "userspecified" (or abbreviated "userspec")
+# "redirected"
+# To explain these, first some terms need to be defined. A "request"
+# is...
+#
+# A user action (like following a link, or entering a 'g'oto URL) can either be
+# rejected immediately (for example, because of restrictions in effect, or
+# because of invalid input), or can generate a "request". For the purpose of
+# this discussion, a "request" is the sequence of processing done by lynx,
+# which might ultimately lead to an actual network request and loading and
+# display of data; a request can also result in rejection (for example, some
+# restrictions are checked at this stage), or in a redirection. A redirection
+# in turn can be rejected (which makes the request fail), or can automatically
+# generate a new request. A "request chain" is the sequence of one or more
+# requests triggered by the same user event that are chained together by
+# redirections.
+# For each request, some URL schemes are handled (or rejected) specially, see
+# Limitation 1 below, the others are passed to the generic access code. Rules
+# processing occurs at the beginning of the generic access code, before a
+# request is dispatched to the scheme-specific protocol module (but after
+# checking whether the request can be satisfied by re-displaying an already
+# cached document).
+# With these definitions, the meaning of the possible CONDITIONFLAGS:
+#
+# if redirected
+# The rule applies if the current request results from a redirection;
+# whether that was a real HTTP redirection or one generated by a rule
+# in the previous request makes no difference. In other words, the
+# condition is true if the current request is not the first one in the
+# request chain.
+#
+# if userspecified
+# The rule applies if the initial URL of the request chain was specified
+# by the user. Lynx marks a request as "user specified" for URLs that
+# come from 'g'oto prompts, as well as for following links in a bookmark
+# or Jump file and some other special (lynx-generated) pages that may
+# contain URLs that were typed in by the user.
+# Note that this is not a property of the request, but of the whole request
+# chain (based on where the first request's URL came from). The current
+# URL may differ from what the user typed
+# - because of initial fixups, including conversion of Guess-URLs and file
+# paths to full URLs,
+# - because of Map rules applied, and/or
+# - because of a previous redirection.
+# So to make reasonably sure a suspicious or potentially dangerous URL has
+# been entered by the user, i.e. is not a link or external redirection
+# location that cannot be trusted, a combination of "userspecified" and
+# "redirected" flags should be used, for example
+# Fail URL1 unless userspecified
+# Fail URL1 if redirected
+# ...
+#
+# CAVEAT
+# ======
+# First, to squash any false expectations, an example for what NOT TO DO.
+# It might be expected that a rule like
+# Fail file://localhost/etc/passwd # <- DON'T RELY ON THIS
+# could be used to prevent access to the file "/etc/passwd". This might
+# fool a naive user, but the more sophisticated user could still gain
+# access, by experimenting with other forms like (@@@ untested)
+# "file://<machine's domain name>/etc/passwd" or "/etc//passwd"
+# or "/etc/p%61asswd" or "/etc/passwd?" or "/etc/passwd#X" and so on.
+# There are many URL forms for accessing the same resource, and Lynx
+# just doesn't guarantee that URLs for the same resource will look the
+# same way.
+#
+# The same reservation applies to any attempts to block access to unwanted
+# sites and so on. This isn't the right place for implementing it.
+# (Lynx has a number of mechanisms documented elsewhere to restrict access,
+# see the INSTALLATION file, lynx.cfg, lynx -help, lynx -restrictions.)
+#
+# Some more useful applications:
+#
+# 1. Disabling URLs by access scheme
+# ----------------------------------
+# Fail gopher:*
+# Fail finger:*
+# Fail lynxcgi:*
+# Fail LYNXIMGMAP:*
+# This should work (but no guarantees) because Lynx canonicalizes
+# the case of recognized access schemes and does not interpret
+# %-escaping in the scheme part (@@@ always?)
+#
+# Note that for many access schemes Lynx already has mechanisms to
+# restrict access (see lynx.cfg, -help, -restrictions, etc.), others
+# have to be specifically enabled. Those mechanisms should be used
+# in preference.
+# Note especially Limitation 1 below.
+# This can be used for the remaining cases, or in addition by the
+# more paranoid. Note that disabling "file:*" will also make many
+# of the special pages generated by lynx as temporary files (INFO,
+# history, ...) inaccessible, on the other hand it doesn't prevent
+# _writing_ of various temp files - probably not what you want.
+#
+# You could also direct access for a scheme to a brief text explaining
+# why it's not available:
+# Redirect news:* http://localhost/texts/newsserver-is-broken.html
+#
+# 2. Preventing accidental access
+# -------------------------------
+# If there is a page or site you don't want to access for whatever
+# reason (say there's a link to it that crashes Lynx [don't forget to
+# report a bug], or if that starts sending you a 5 Mb file you don't
+# want, or you just don't like the people...), you can prevent yourself
+# from accidentally accessing it:
+# Fail http://bad.site.com/*
+#
+# 3. Compressed files
+# -------------------
+# You have downloaded a bunch of HTML documents, and compressed them
+# to save space. Then you discover that links between the files don't
+# work, because they all use the names of the uncompressed files. The
+# following kind of rule will allow you to navigate, invisibly accessing
+# the compressed files:
+# Map file://localhost/somedir/*.html file://localhost/somedir/*.html.gz
+# or, perhaps better:
+# Redirect file://localhost/somedir/*.html file://localhost/somedir/*.html.gz
+#
+# 4. Use local copies
+# -------------------
+# You have downloaded a tree of HTML documents, but there are many links
+# between them that still point to the remote location. You want to access
+# the local copies instead, after all that's why you downloaded them. You
+# could start editing the HTML, but the following might be simpler:
+# Map http://remote.com/docs/*.html file://localhost/home/me/docs/*.html
+# Or even combine this with compressing the files:
+# Map http://remote.com/docs/*.html file://localhost/home/me/docs/*.html.gz
+#
+# Again, replacing the "Map" with "Redirect" is probably better - it will
+# allow you to see the _real_ location on the lynx INFO screen or in the
+# HISTORY list, will avoid duplicates in the cache if the same document is
+# loaded with two different URLs, and may allow you to 'e'dit the local
+# from within lynx if you feel like it.
+#
+# 5. Broken links etc.
+# --------------------
+# A user has moved from http://www.siteA.com/~jdoe to http://siteB.org/john,
+# or http://www.provider.com/company/ has moved to their own server
+# http://www.company.com, but there are still links to the old location
+# all over the place; they now are broken or lead to a stupid "this page
+# has moved, please update your bookmarks. Refresh in 5 seconds" page
+# which you're tired of seeing. This will not fix your bookmarks, and
+# it will let you see the outdated URLs for longer (Limitation 3 below),
+# but for a quick fix:
+# Redirect http://www.siteA.com/~jdoe/* http://siteB.org/john/*
+# Redirect http://www.provider.com/company/* http://www.company.com/*
+#
+# You could use "Map" instead of "Redirect", but this would let you see the
+# outdated URLs for longer and even bookmark them, and you are likely to
+# create invalid links if not all documents from a site are mapped
+# (Limitation 3).
+#
+# 6. DNS troubles
+# ---------------
+# A special case of broken links. If a site is inaccessible because the
+# name cannot be resolved (your or their name server is broken, or the
+# name registry once again made a mistake, or they really didn't pay in
+# time...) but you still somehow know the address; or if name lookups are
+# just too slow:
+# Map http://www.somesite.com/* http://10.1.2.3/*
+# (You could do the equivalent more cleanly by adding an entry to the hosts
+# file, if you have access to it.)
+#
+# Or, if a name resolves to several addresses of which one is down, and the
+# DNS hasn't caught up:
+# Map http://www.w3.org/* http://www12.w3.org/*
+#
+# Note that this can break access to some name-based virtually hosted sites.
+#
+# In this case use of "Map" is probably preferred over "Redirect", as long
+# as the URL on the left side contains the real and preferred hostname or
+# the problem is only temporary.
+#
+# 7. Avoid redirections
+# ---------------------
+# Some sites have a habit to provide links that don't go to the destination
+# directly but always force redirection via some intermediate URL. The
+# delay imposed by this, especially for users with slower connections and
+# for overloaded servers, can be avoided if the intermediate URLs always
+# follow some simple pattern: we can then anticipate the redirect that will
+# inevitably follow and generate it internally. For example,
+# Redirect http://lwn.net/cgi-bin/vr/* http://*
+#
+# Warning: The page authors may not like this circumvention. Often the
+# redirection is wanted by them to track access, sometimes in connection
+# with cookies. Some sites may employ mechanisms that defeat the shortcut.
+# It is your responsibility to decide whether use of this feature is
+# acceptable. (But note that the same effect can be achieved anyway for
+# any link by editing the URL, e.g. with the ELGOTO ('E') key in Lynx, so
+# a shortcut like this does not create some new kind of intrusion.)
+#
+# 8. Detailed proxy selection
+# ---------------------------
+# Basic use for this one should be obvious, if you have a need for it.
+# It simply allows selecting use (or non-use) of proxies on a more detailed
+# level than the traditional <scheme>_proxy and no_proxy variables, as well
+# as using different proxies for different sites.
+# For example, to request access through an anonymizing proxy for all pages
+# on a "suspicious" site:
+# UseProxy http://suspicious.site/* http://anonymyzing.proxy.dom/
+# (as long as all URLs really have a matching form, not some alternative
+# like <http://suspicious.site:80/> or <http://SuSpIcIoUs.site/>!)
+#
+# To access some site through a local squid proxy, running on the same host
+# as lynx, except for some image types (say because you rarely access images
+# with lynx anyway, and if you do, you don't want them cached by the proxy):
+# UseProxy http://some.site/*.gif none
+# UseProxy http://some.site/*.jpg none
+# UseProxy http://some.site/* http://localhost:3128/
+# Note that order is important here.
+#
+# To exempt a local address from all proxying:
+# UseProxy http://local.site/* none
+#
+# Note however that for some purposes the "no_proxy" setting may be better
+# suited than "UseProxy ... none", because of its different matching logic
+# (see comments in lynx.cfg).
+#
+# 9. Invent your own scheme
+# -------------------------
+# Suppose you want to teach lynx to handle a completely new URL scheme.
+# If what's required for the new scheme is already available in lynx in
+# _some_ way, this may be possible with some inventive use of rules.
+# As an example, let's assume you want to introduce a simple "man:" scheme
+# for showing manual pages, so (for a Unix-like system, at least) "man:lynx"
+# would display the same help information as the "man lynx" command and so
+# on (we ignore section numbers etc. for simplicity here).
+# First, since lynx doesn't know anything about a "man:" scheme, it will
+# normally reject any such URLs at an early stage. However, a trick exists
+# to bypass that hurdle: define a man_proxy environment variable *outside of
+# lynx, before starting lynx* (it won't work in lynx.cfg), the actual value
+# is unimportant and won't actually be used. For example, in your shell:
+# export man_proxy=X
+#
+# If you already have some kind of HTTP-accessible man gateway available,
+# the task then probably just amounts to transforming the URL into the right
+# form. For one such gateway (in this case, a CGI script running on the
+# local machine), the rule
+# Redirect man:* http://localhost/cgi-bin/dwww?type=runman&location=*/
+# or, alternatively,
+# UseProxy man:* none
+# Map man:* http://localhost/cgi-bin/dwww?type=runman&location=*/
+# does it, for other setups the right-hand side just has to be modified
+# appropriately. The "UseProxy" is to make sure the bogus man_proxy gets
+# ignored.
+#
+# If no CGI-like access is available, you might want to invoke your system's
+# man command directly for a man: URL. Here is some discussion of how this
+# could be done, and why ultimately you may not want to do it; this is also
+# an opportunity to show examples for how some of the rules and conditions
+# can be used that haven't been discussed in detail elsewhere.
+# Lynx provides the lynxexec: (and the similar lynxprog:) scheme for running
+# (nearly) arbitrary commands locally. At the heart of employing it for
+# man: would be a rule like this:
+# Redirect man:* "lynxexec:/usr/bin/man *"
+# (It is a peculiarity of this scheme that the literal space and quoting
+# are necessary here. Also note that Map cannot be used here instead of
+# Redirect, since lynxexec, as a special kind of URL, needs to be handled
+# "early" in a request.)
+# Of course, execution of arbitrary commands is a potentially dangerous
+# thing. lynxexec has to be specifically enabled at compile time and in
+# lynx.cfg (or with command line options), and there are various levels
+# of control, too much to go into here. It is assumed in the following that
+# lynxexec has been enabled to the degree necessary (allow /usr/bin/man
+# execution) but hopefully not too much.
+# What needs to be prevented is that allowing local execution of the man
+# command might unintentionally open up unwanted execution of other commands,
+# possibly by some trick that could be exploited. For example, redirecting
+# man:* as above, the URL "man:lynx;rm -r *" could result in the command
+# "man lynx;rm -r *" executed by the system, with obvious disastrous results.
+# (This particular example won't actually work, for several reasons; but
+# for the purpose of discussion let's assume it did, there may be similar
+# ones that do.)
+# Because of such dangers, redirection to a lynxexec: is normally never
+# accepted by lynx. We need at least a PermitRedirection rule to override
+# this protective limitation:
+# PermitRedirection man:*
+# Redirect man:* "lynxexec:/usr/bin/man *"
+# But now we have potentially opened up local execution more than is
+# acceptable via the man: scheme, so this needs to be examined.
+# There are two aspects to security here: (1) restricting the user, and (2)
+# protecting the user. The first could also be phrased as protecting the
+# system from the user; the second as preventing lynx (and the system) from
+# doing things the user doesn't really want. Aspect (1) is very important
+# for setups providing anonymous guest accounts and similarly restricted
+# environments. (Otherwise shell access is normally allowed, and trying to
+# protect the system in lynx would be rather pointless.) As far as access
+# to some URLs is concerned, the difference can be characterized in terms of
+# which sources of URLs are trusted enough to allow access: for (1), only
+# links occurring in a limited number of documents are trusted enough for
+# some (or all) URLs, user input at 'g'oto prompts and the like is not (if
+# not completely disabled). For (2) and assuming a user with normal shell
+# privileges, the user may be trusted enough to accept any URL explicitly
+# entered, but URLs from arbitrary external sources are not - someone might
+# try to use them to trick the user (by following an innocent-looking link)
+# or lynx (by following a redirection) into doing something undesirable.
+#
+# In the following we are concerned with (2); it is assumed that providers
+# of anonymous accounts would not want to follow this path, and would have
+# no need for additional schemes that imply local execution anyway. (For
+# one thing, with the man example they would have to carefully check that
+# users cannot break out of the man command to a local shell prompt.)
+#
+# Getting back to the example, it was already mentioned that lynx does not
+# allow redirections to lynxexec. In fact this continues to be disallowed
+# for real redirection received from HTTP servers. But we have introduced
+# a new man: scheme, and the lynx code that does the redirection checking
+# doesn't know anything about special considerations for man: URLs, so
+# an external HTTP server might send a redirection message with "Location:
+# man:<something>", which lynx would allow, and which would in turn be
+# redirected by our rule to "lynxexec:/usr/bin/man <something>". Unless
+# we are 100% sure that either this can never happen or that the lynxexec
+# URL resulting from this can have no harmful effect, this needs to be
+# prevented. It can be done by checking for the "redirected" condition,
+# either by putting something like (the first line is of course optional)
+# Alert man:* "Redirection to man: not allowed" if redirected
+# Fail man:* if redirected
+# somewhere before the Redirect rule, or, reversing the logic, by adding
+# a condition to the redirection rules, i.e. they become
+# PermitRedirection man:* unless redirected
+# Redirect man:* "lynxexec:/usr/bin/man *" unless redirected
+# (actually, putting the condition on either one of the rules would be
+# sufficient). The second variant assumes that the attempted access to
+# man: via redirection will ultimately fail because there is no other way
+# to handle such URLs.
+#
+# The above should take care of rejecting man: URLs from redirections, but
+# what about regular links in HTML (like <A HREF="man:...">)? As long as
+# it can be assumed that the user will always inspect each and every link
+# before following it, and never follow a link that can have harmful effect,
+# no further restrictions are necessary. But this is a very big assumption,
+# unrealistic except perhaps in some single-user setups where the user is
+# is identical with the rule writer. So normally most links have to be
+# regarded as suspect, and only URLs entered by the user can be accepted:
+# Alert man:* "Redirection to man: not allowed" if redirected
+# Fail man:* if redirected
+# Alert man:* "Link to man: not allowed" unless userspecified
+# Fail man:* unless userspecified
+#
+# With these restrictions we have limited the ways our new man: scheme can
+# be used rather severely, to the point where its usefulness is questionable.
+# In addition to 'g'oto prompts, it may work in Jump files; also, should
+# links to man:<something> appear in HTML text, the user could retype them
+# manually or use the ELGOTO ('E') command with some trivial editing (like
+# adding a space) to "confirm" the URL. Even if the precautions outlined
+# above are followed: THIS TEXT DOES NOT IMPLY ANY PROMISE THAT, BY FOLLOWING
+# THE EXAMPLES, LYNX WILL BE SAFE. On the other hand, some of the precautions
+# *may* not be necessary: it is possible that careful use of TRUSTED_EXEC
+# options in lynx.cfg could offer enough protection while making the new
+# scheme more useful.
+#
+# If all this seems a bit too scary, that's intentional; it should be noted
+# that these considerations are not in general necessary for "harmless" URL
+# schemes, but appropriate for this "extreme" example. One last remark
+# regarding the hypothetical man scheme: instead of implementing it through
+# "lynxexec:" or "lynxprog:", it would be somewhat safer to use "lynxcgi:"
+# instead if it is supported. A simple lynxcgi script would have to write
+# the man page to stdout (either converted to text/html or as plain text,
+# preceded by an appropriate Content-Type header line), and all necessary
+# checking for special shell characters would be done within the script -
+# lynx does not use the system() function to run the script.
+#
+# Other Limitations
+# =================
+# First, see CAVEAT above. There are other limitations:
+#
+# 1. Applicable URL schemes
+# -------------------------
+# Rules processing does not apply to all URL schemes. Some are
+# handled differently from the generic access code, therefore rules
+# for such URLs will never be "seen". This limitation applies at
+# least to lynxexec:, lynxprog:, mailto:, LYNXHIST:, LYNXMESSAGES:,
+# LYNXCFG:, and LYNXCOMPILEOPTS: URLs. You shouldn't be tempted
+# to try to redirect most of these schemes anyway, but this also
+# makes it impossible to disable them with "Fail" rules.
+#
+# Also, a scheme has to be known to Lynx in order to get as far as
+# applying rules - you cannot just define your own new foobar: scheme
+# and then map it to something here, but see Application 9, above,
+# for a workaround.
+#
+# 2. No re-checking
+# -----------------
+# When a URL is mapped to a different one, the new URL is not checked
+# again for compliance with most restrictions established by -anonymous,
+# -restrictions, lynx.cfg and so on. This can be regarded as a feature:
+# it allows specific exceptions. Of course it means that users for
+# whom any restrictions must be enforced cannot have write access to a
+# personal rules file, but that should be obvious anyway!
+# This limitation does not applies if "Redirect" is used, in that case
+# the new URL will always be re-examined.
+#
+# 3. Mappings are invisible
+# -------------------------
+# Changing the URL with "Map" or "Pass" rules will in general not be
+# visible to the user, because it happens at a late stage of processing
+# a request (similar to directing a request through a proxy). One
+# can think of two kinds of URL for every resource: a "Document URL" as
+# the user sees it (on INFO page, history list, status line, etc.), and
+# a "physical URL" used for the actual access. Rules change only the
+# physical URL. This is different from the effect of HTTP redirection.
+# Often this is bad, sometimes it may be desirable.
+#
+# Changing the URL can create broken links if a document has relative URLs,
+# since they are taken to be relative to the "Document URL" (if no BASE tag
+# is present) when the HTML is parsed.
+#
+# This limitation does not apply if "Redirect" is used - the new location
+# will be visible to the user, and will be used by lynx for resolving
+# relative URLs within the document.
+#
+# 4. Interaction with proxying
+# ----------------------------
+# Rules processing is done after most other access checks, but before
+# proxy (and gateway) settings are examined. A "Fail" rule works
+# as expected, but when the URL has been mapped to a different one,
+# the subsequent proxy checking can get confused. If it decides that
+# access is through a proxy or gateway, it will generally use the
+# original URL to construct the "physical" URL, effectively overriding
+# the mapping rules. If the mapping is to a different access scheme
+# or hostname, proxy checking could also be fooled to use a proxy when
+# it shouldn't, to not use one when it should, or (if different proxies
+# are used for different schemes) to use the wrong proxy. So "just
+# don't do that"; in some cases setting the no_proxy variable will help.
+# Example 3 happens to work nicely if there is a http_proxy but no
+# ftp_proxy.
+#
+# This limitation does not come into play if a "UseProxy" rule is applied,
+# in either of its two forms: with a PROXYURL, proxying is fully under
+# the control of the rules author, and with "none", subsequent proxy
+# and gateway checking is completely disabled. It is therefore a good
+# idea to combine any "Map" and "Pass" rules that might result in passing
+# the changed URL with explicit "UseProxy" rules, if the rules file is
+# expected to be used together with proxying; or else always use "Redirect"
+# instead of simple passing.
+#
+# 5. Case-sensitive matching
+# --------------------------
+# The matching logic is generic string-based. It doesn't know anything
+# about URL syntax, and so it cannot know in which parts of a URL case
+# matters and where it doesn't. As a result, all comparisons are case-
+# sensitive. If (a limited number of) case variations of a URL need
+# to be dealt with, several rules can be used instead of one.
+# In particular, this makes "UseProxy ... none" in some ways more limited
+# than a no_proxy setting.
+#
+# 6. Redirection differences
+# --------------------------
+# For some URLs lynx does never check after a request whether a redirection
+# occurs; that makes the "Redirect" rule useless for such URLs (in addition
+# to those mentioned under limitation 1.). Some of them are some gopher
+# types, telnet: and similar in most situations, newspost: and similar,
+# lynxcgi:, and some other private types. Trying to redirect these will
+# make access fail. You probable don't want to change such URLs anyway,
+# but if you feel you must, try using "Map" and "Pass" instead.
+#
+# The -noredir command line option only applies for real HTTP redirection
+# responses, Redirect rules are still applied. Also for certain other
+# command line options (-mime_header, -head) and command keys (HEAD) lynx
+# shows the redirection message (or part of it) in case of a real HTTP
+# redirection, instead of following the redirection. Here, too, a Redirect
+# rule remains effective (there is no redirection message to show, after all).
+#
+# 7. URLs required
+# ----------------
+# Full absolute URLs (modulo possible "*" matching wildcards) are required
+# in rules. Strings like "www.somewhere.com" or "/some/dir/some.file" or
+# "www.somewhere.com/some/dir/some.file" are not URLs. Lynx may accept
+# them as user input, as abbreviated forms for URLs; but by the time the
+# rules get checked, those have been converted to full URLs, if they can
+# be recognized. This also means that rules cannot influence which strings
+# typed at a 'g'oto prompt are recognized for URLs - rules processing kicks
+# in later.
diff --git a/samples/home.htm b/samples/home.htm
new file mode 100644
index 0000000..b262821
--- /dev/null
+++ b/samples/home.htm
@@ -0,0 +1,31 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!--
+ $LynxId: home.htm,v 1.4 2008/01/06 20:53:04 tom Exp $
+ vile:dos
+ -->
+<html>
+ <head>
+ <title>
+ :: hello ::
+ </title>
+ <meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+ </head>
+ <body>
+ <table width="100%" summary="Lynx home page" align="right">
+ <tr>
+ <td width="100%" align="right">
+ <b>Lynx browser...</b>
+ <p>
+ &nbsp;
+ </p>
+ <p>
+ ...for quicker &amp; saver browsing...
+ </p>
+ <p>
+ Light-height, fast and secure text browser.
+ </p>
+ </td>
+ </tr>
+ </table>
+ </body>
+</html>
diff --git a/samples/installdirs.html b/samples/installdirs.html
new file mode 100644
index 0000000..c3f63c4
--- /dev/null
+++ b/samples/installdirs.html
@@ -0,0 +1,18 @@
+<HTML>
+<TITLE>File Management Install Targets</TITLE>
+<!-- This is an example file for the Lynx dired "install" functionality.
+ Lynx needs to be compiled with dired support and OK_INSTALL defined.
+ For the dired "install" function to work, this file has to exist
+ in the HOME directory under the name ".installdirs.html" or (for
+ 8+3, i.e. DOS-like, filesystems) "instdirs.htm".
+ -->
+<BODY>
+<H1>Install Target directories</H1>
+<UL>
+<LH>Choose destination:</LH>
+<LI><A HREF="LYNXDIRED://INSTALL_DEST/~/">install in Home directory</A>
+<LI><A HREF="LYNXDIRED://INSTALL_DEST/~/bin">install in ~/bin</A>
+<LI><A HREF="LYNXDIRED://INSTALL_DEST/tmp">install in /tmp</A>
+</UL>
+</BODY>
+</HTML>
diff --git a/samples/jumps.htm b/samples/jumps.htm
new file mode 100644
index 0000000..57ac56c
--- /dev/null
+++ b/samples/jumps.htm
@@ -0,0 +1,33 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+
+<html>
+<head>
+ <meta name="generator" content=
+ "HTML Tidy for Linux (vers 25 March 2009), see www.w3.org">
+ <meta http-equiv="content-type" content=
+ "text/html; charset=us-ascii">
+
+ <title>Jumps file</title>
+</head>
+
+<body>
+ <dl>
+ <dt>?</dt>
+
+ <dd><a href="file://localhost/Programme/lynx/jumps.htm">This
+ Shortcut List</a></dd>
+
+ <dt>g</dt>
+
+ <dd><a href="http://www.google.com/">Google</a></dd>
+
+ <dt>nf</dt>
+
+ <dd><a href="http://newsforge.com/">newsforge</a></dd>
+
+ <dt>sf</dt>
+
+ <dd><a href="http://sourceforge.net/">sourceforge</a></dd>
+ </dl>
+</body>
+</html>
diff --git a/samples/jumpsUnix.html b/samples/jumpsUnix.html
new file mode 100644
index 0000000..77b1fea
--- /dev/null
+++ b/samples/jumpsUnix.html
@@ -0,0 +1,56 @@
+<html>
+<head>
+<title>Shortcut List</title>
+<link rev="made" href="mailto:WebMaster@foo.blah.dom">
+</head>
+<body>
+ <h1>Shortcut List</h1>
+ This is a sample jumps file created in the early days of Lynx:
+ you should use it as a template, replacing with your own choices.
+ See Users Guide for details of how the `j' command works.
+<p>
+ *** IMPORTANT *** If you want to use `?' with `j' to recall
+ your own list of abbreviations, you must make sure
+ you always have the correct URL corresponding to `?' below:
+ otherwise, Lynx may display an incorrect list with misleading results.
+<p>
+ *** ALSO *** The entries must be in alphabetic order, with `?' first:
+ otherwise, Lynx may not be able to find them all.
+<p>
+ <b>Name</b>&nbsp;&nbsp;&nbsp;<b>Link</b>
+<!-- The list *MUST* be kept SORTED, one entry per line -->
+<dl compact>
+<dt>?<dd><a href="file://localhost/CFN/info/jumps.html">This Shortcut List</a>
+<dt>agreement<dd><a href="file://localhost/CFN/UserAgree.html">Chebucto FreeNet User Agreement</a>
+<dt>board<dd><a href="file://localhost/CFN/BOD.html">MetroCAN Board of Directors</a>
+<dt>browser<dd><a href="file://localhost/~/">Personal File Browser</a>
+<dt>docteam<dd><a href="file://localhost/CFN/SAT/WorkArea.html">Documentation Team Work Area</a>
+<dt>events<dd><a href="file://localhost/CFN/Utilities/search-events.html">Search all event schedules by time and keyword</a>
+<dt>files<dd><a href="file://localhost/~/">Personal File Browser</a>
+<dt>forward<dd><a href="lynxexec:/cfn/bin/mail-forward">Forward your mail</a>
+<dt>freenets<dd><a href="http://duke.usask.ca/~scottp/free.html">FreeNets around the World</a>
+<dt>help<dd><a href="file://localhost/CFN/Help/UserHelpDesk.html">Help Desk</a>
+<dt>home<dd><a href="file://localhost/CFN/Home.html">Chebucto FreeNet Home Page</a>
+<dt>info<dd><a href="file://localhost/CFN/Utilities/FindingInfo.html">Finding Information</a>
+<dt>ip<dd><a href="file://localhost/CFN/IP/InformationProvider.html">Information Providers Committee</a>
+<dt>lists<dd><a href="file://localhost/CFN/Services/MailListHome.html">Mailing Lists and Archives</a>
+<dt>mail<dd><a href="lynxprog:/cfn/bin/mail">Read and/or send mail</a>
+<dt>metrocan<dd><a href="file://localhost/CFN/MetroCAN.html">Metro*CAN Society</a>
+<dt>new<dd><a href="file://localhost/CFN/Current/WhatsNew.html">What's New</a>
+<dt>news<dd><a href="lynxprog:/cfn/bin/news">Read and Send News</a>
+<dt>newsgroups<dd><a href="file://localhost/CFN/Current/newsgroups.html">List Global Newsgroups</a>
+<dt>password<dd><a href="lynxexec:/cfn/bin/passwd">Change your password</a>
+<dt>people<dd><a href="file://localhost/CFN/Utilities/search-user.html">Find other people</a>
+<dt>profile<dd><a href="lynxprog:/cfn/bin/editor public_html/Profile.html">Update your personal profile</a>
+<dt>quota<dd><a href="lynxexec:/cfn/bin/quota">View your disk usage and quota</a>
+<dt>recent<dd><a href="http://www.cfn.cs.dal.ca/cgi-bin/recent">Recently Changed Documents on CFN</a>
+<dt>register<dd><a href="file://localhost/CFN/AccountRegister.html">New User Registration</a>
+<dt>search<dd><a href="file://localhost/CFN/Utilities/search-all.html">Search every document on CFN by keyword.</a>
+<dt>technical<dd><a href="file://localhost/CFN/Technical/Technical.html">Metro*CAN Technical Committee</a>
+<dt>terminal<dd><a href="lynxexec:/cfn/bin/set-term">Set your terminal type</a>
+<dt>volunteer<dd><a href="file://localhost/CFN/Membership/NewVolunteer.html">Volunteer with CFN</a>
+<dt>who<dd><a href="http://www.cfn.cs.dal.ca/cgi-bin/cfn-who">Find out who is online now</a>
+<dt>xsearch<dd><a href="file://localhost/CFN/Utilities/xsearch.html">Search every document on CFN by keyword.</a>
+</dl>
+</body>
+</html>
diff --git a/samples/jumpsVMS.html b/samples/jumpsVMS.html
new file mode 100644
index 0000000..b68412f
--- /dev/null
+++ b/samples/jumpsVMS.html
@@ -0,0 +1,28 @@
+<html>
+<head>
+<title>Shortcut List</title>
+<link rev="made" href="mailto:WebMaster@foo.blah.dom">
+</head>
+<body>
+ <h1>Shortcut List</h1>
+ Following is a list of shortcut names and the target links associated
+ with them. In Lynx, pressing J followed by one of these shortcut names
+ will jump you directly to the link. This list will expand over time.<p>
+ <b>Name</b>&nbsp;&nbsp;&nbsp;<b>Link</b>
+<!-- The list *MUST* be kept SORTED, one entry per line -->
+<dl compact>
+<dt>?<dd><a href="file://localhost/Lynx_Dir/jumps.html">This Shortcut List</a>
+<dt>freenets<dd><a href="http://duke.usask.ca/~scottp/free.html">FreeNets around the World</a>
+<dt>genhelp<dd><a href="http://www.wfeb.edu/HELP/@GCGHELP:GENHELP">GCG GenHelp</a>
+<dt>genman<dd><a href="http://www.wfeb.edu/HELP/@GCGHELP:GENMANUAL">GCG GenManual</a>
+<dt>home<dd><a href="http://www.wfeb.edu/">WFEB Home Page</a>
+<dt>mail<dd><a href="lynxprog:mail">Read and/or send mail</a>
+<dt>multinet<dd><a href="http://www.wfeb.edu/HELP/@MULTINET:MULTINET">MultiNet Help</a>
+<dt>news<dd><a href="lynxprog:news">Read and Send News</a>
+<dt>swing<dd><a href="lynxprog:swing sys$login">SWING File/Directory Manager</a>
+<dt>swinghelp<dd><a href="http://www.wfeb.edu/HELP/@CSWING:CSWING/SWING">SWING Help</a>
+<dt>vmshelp<dd><a href="http://www.wfeb.edu/HELP">VMS Help</a>
+<dt>who<dd><a href="lynxexec:show users">Find out who is online now</a>
+</dl>
+</body>
+</html>
diff --git a/samples/keepviewer b/samples/keepviewer
new file mode 100755
index 0000000..f5c0b2c
--- /dev/null
+++ b/samples/keepviewer
@@ -0,0 +1,20 @@
+#!/bin/sh
+# This script can be invoked as a wrapper for an external viewer by lynx, e.g.,
+# given this line in lynx.cfg
+# XLOADIMAGE_COMMAND:keepviewer xli %s &
+# it will invoke xli on a hardlink to the file (which is assumed to be in the
+# temporary directory created by lynx), and clean up when the viewer exits.
+#
+# Parameters:
+# $1 is viewer
+# $2 is filename
+if test $# = 2 ; then
+ chmod 600 $2
+ myfile=`echo $2 | sed -e 's@\(.*/tmp/\)\([^/]*/\)\?\(.*\)@\1my\3@'`
+ ln $2 $myfile || exit 1
+ trap "rm -f $myfile" 0 1 2 5 15
+ eval $1 $myfile
+else
+ echo "Usage: keepviewer <viewer> <filename>"
+ exit 1
+fi
diff --git a/samples/lynx-demo.cfg b/samples/lynx-demo.cfg
new file mode 100644
index 0000000..3a7fe88
--- /dev/null
+++ b/samples/lynx-demo.cfg
@@ -0,0 +1,46 @@
+# $LynxId: lynx-demo.cfg,v 1.6 2018/07/08 15:22:44 tom Exp $
+# vile:cfgmode
+# From: claudio santambrogio <claudio.santambrogio@tiscali.it>
+
+STARTFILE:file://localhost/~/home.htm
+HELPFILE:file://localhost/~/help/lynx_help_main.html.gz
+DEFAULT_INDEX_FILE:https://lynx.invisible-island.net/
+
+CHARACTER_SET:cp850
+ASSUME_CHARSET:utf-8
+
+FORCE_SSL_COOKIES_SECURE:TRUE
+COOKIE_REJECT_DOMAINS:ad.doubleclick.net
+PERSISTENT_COOKIES:TRUE
+COOKIE_FILE:~/.lynx_cookies
+COOKIE_SAVE_FILE:~/.lynx_cookies
+
+DEFAULT_CACHE_SIZE:100
+DEFAULT_VIRTUAL_MEMORY_SIZE:5120000
+SOURCE_CACHE:memory
+
+DEFAULT_USER_MODE:INTERMEDIATE
+VERBOSE_IMAGES:FALSE
+MAKE_PSEUDO_ALTS_FOR_INLINES:FALSE
+MINIMAL_COMMENTS:TRUE
+
+COLOR:0:lightgray:black
+COLOR:1:red:black
+COLOR:2:yellow:blue
+COLOR:4:green:black
+COLOR:5:brown:black
+COLOR:6:brightred:black
+COLOR:7:white:brightgreen
+
+PRETTYSRC:TRUE
+HTMLSRC_TAGNAME_XFORM:0
+HTMLSRC_ATTRNAME_XFORM:0
+
+# set these to empty strings to eliminate dependency on external programs
+CHMOD_PATH:
+COPY_PATH:
+MKDIR_PATH:
+MV_PATH:
+RMDIR_PATH:
+RM_PATH:
+TOUCH_PATH:
diff --git a/samples/lynx-keymaps b/samples/lynx-keymaps
new file mode 100644
index 0000000..2801bb7
--- /dev/null
+++ b/samples/lynx-keymaps
@@ -0,0 +1,161 @@
+# $LynxId: lynx-keymaps,v 1.7 2013/10/13 20:40:00 tom Exp $
+#
+# This is a sample key sequence definition file. It is used by Lynx when
+# built with ncurses or slang, to augment the definitions from your terminal's
+# termcap or terminfo description.
+
+# (Lynx implements this mechanism only if USE_KEYMAPS is defined during
+# compilation, which has nothing to do with the KEYMAP directives in lynx.cfg,
+# see source file LYCurses.h.)
+
+# Lines that start with a '#' are comment lines. Blank lines are ignored.
+
+# The 'setkey' function may be used in two ways:
+#
+# 1. setkey ESC-SEQUENCE KEYSYM
+# 2. setkey ESC-SEQUENCE KEYSYM_NAME
+#
+# where KEYSYM is an integer. A keysym is essentially with the lynx.cfg
+# file calls a 'keystroke', but I think that keysym is a more appropriate
+# name. The keysym is an integer and may be expressed in various ways:
+#
+# as a decimal integer: 97
+# hexadecimal: 0x61
+# Octal: 0141
+# as an ASCII character: 'a'
+#
+# Some keysyms may be expressed symbolically as a keysym name using the
+# second form. The currently recognized symbolic names are:
+#
+# UPARROW
+# DNARROW
+# RTARROW
+# LTARROW
+# PGDOWN
+# PGUP
+# HOME
+# END
+# F1
+# F2
+# F3
+# F4
+# F5
+# F6
+# F7
+# F8
+# F9
+# F10
+# F11
+# F12
+# DO_KEY
+# FIND_KEY
+# SELECT_KEY
+# INSERT_KEY
+# REMOVE_KEY
+# DO_NOTHING
+#
+# It does not matter if your keyboard does not have some of the keys
+# implied by the above names. The fact is that lynx uses these keys as an
+# an intermediate representation.
+#
+# The ESC-SEQUENCE should be enclosed in double quotes. The '^' character
+# is special and indicates a control character, e.g., ^K is Ctrl-K. An ESC
+# character (ascii 27) may be represented as ^[. As an example, many
+# terminals have arrow keys that emit 'ESC [ A' for the UP arrow. This may
+# be represented as the escape sequence "^[[A". The default keymapping is
+# given below:
+#
+setkey "\033[A" UPARROW
+setkey "\033OA" UPARROW
+setkey "\033[B" DNARROW
+setkey "\033OB" DNARROW
+setkey "\033[C" RTARROW
+setkey "\033OC" RTARROW
+setkey "\033[D" LTARROW
+setkey "\033OD" LTARROW
+setkey "\033[1~" FIND_KEY
+setkey "\033[2~" INSERT_KEY
+setkey "\033[3~" REMOVE_KEY
+setkey "\033[4~" SELECT_KEY
+setkey "\033[5~" PGUP
+setkey "\033[6~" PGDOWN
+setkey "\033[8~" END
+setkey "\033[7~" HOME
+setkey "\033[28~" F1
+setkey "\033[29~" DO_KEY
+#
+# All other keys map to themselves, e.g,
+#
+setkey "a" 'a'
+#
+# Now suppose that your terminal produces different escape sequences for
+# HOME and END. In particular, suppose that the home key produces 'ESC [
+# H' and that the end key produces 'ESC [ K'. Then these may be defined to
+# map to lynx HOME and END keys via
+#
+setkey "^[[H" HOME
+setkey "^[[K" END
+#
+# Similarly, we may map emacs-like sequences to these functions:
+#
+setkey "^[<" HOME
+setkey "^[>" END
+#
+# Note that it may be impossible to map several sequences to the same
+# keysym (NCURSES only?), in that case the mapping occurring last wins.
+#
+# The following maps a sequence commonly used for Shift+Tab to the
+# corresponding code. It should not be needed if the terminfo file
+# has the correct info for kcbt.
+#
+setkey "^[[Z" 0x10F
+#
+# Other special escapes:
+# \a bell
+# \b backspace
+# \f form-feed
+# \n newline (line-feed)
+# \r carriage-return
+# \t tab
+# \v vertical tab
+# \<number> octal number, up to 3 digits, e.g., "\033".
+# \d<number> decimal number, up to 3 digits, e.g., "\d99"
+# \x<number> hexadecimal number, up to 2 digits, e.g., "\xFF"
+#
+# For Unix-systems (which have termcap or terminfo) you may also use symbols
+# that refer to the termcap/terminfo, by referencing the name bracketed by
+# "^(" and ")", e.g.,
+setkey "^(cuu1)" UPARROW
+setkey "^(up)" UPARROW
+#
+# The following extension, introduced after lynx2.8.2, allows to force
+# recognition of meta (ESC) prefixes - especially useful with the
+# "Bash-like" lineeditor binding. Its use is unnecessary in most
+# cases if Lynx was built with ncurses, but is probably necessary for
+# all keys that should recognize ESC as a prefix if Lynx was built with
+# slang.
+#
+# setkey ESC-SEQUENCE Meta-LETTER
+# setkey ESC-SEQUENCE Meta-KEYSYM
+# setkey ESC-SEQUENCE Meta-KEYSYM_NAME
+#
+# for example
+#setkey "\033b" Meta-b
+#setkey "\033e" Meta-'e'
+#setkey "\033\033[28~" Meta-F1
+#
+# The following extensions, introduced after lynx2.8.2, allow mapping
+# escape sequences directly to key commands (lynxactioncodes).
+#
+# setkey ESC-SEQUENCE LAC:LYNX_ACTION
+# setkey ESC-SEQUENCE LAC:LYNX_ACTION:LYNX_EDITACTION
+#
+# where LYNX_ACTION is a key command specified as for lynx.cfg KEYMAP
+# options and as listed on the KEYMAP ('K') screen, and LYNX_EDITACTION
+# is a line-editor action specified as for KEYMAP and as listed in Line
+# Editor help pages. Using this form makes remapping according to user
+# preference with KEYMAP impossible, and should thus be used sparingly
+# (in general, use KEYMAP with PASS instead, if the goal is to force
+# recognition of a key in form text fields). For example:
+#
+#setkey "\033e" LAC:EDITTEXTAREA:PASS
diff --git a/samples/lynx.bat b/samples/lynx.bat
new file mode 100644
index 0000000..417cd74
--- /dev/null
+++ b/samples/lynx.bat
@@ -0,0 +1,31 @@
+@echo off
+@rem $LynxId: lynx.bat,v 1.9 2018/03/21 16:10:36 tom Exp $
+@rem demonstrate lynx with color-style
+setlocal
+
+ set TERM=vt100
+rem Set HOME to make URLs in config work, though this prevents -trace
+ set HOME=%~dp0
+ set PATH=%HOME%;%PATH%
+
+rem We need a temporary directory
+ if not "x%LYNX_TEMP_SPACE%"=="x" goto :do_cfg
+ if "x%TEMP%"=="x" set LYNX_TEMP_SPACE=%TEMP%
+ if not "x%TEMP%"=="x" goto :do_cfg
+ if "x%TMP%"=="x" set LYNX_TEMP_SPACE=%TMP%
+ if not "x%TMP%"=="x" goto :do_cfg
+
+ set LYNX_TEMP_SPACE=%HOMEDRIVE%%HOMEPATH%tmp
+ mkdir "%LYNX_TEMP_SPACE%"
+ if not errorlevel 0 goto :do_cfg
+
+ echo Cannot make temp-directory
+ goto :eof
+
+:do_cfg
+ set LYNX_CFG_PATH=%HOME%
+ set LYNX_CFG=%HOME%lynx-demo.cfg
+ set LYNX_LSS=%HOME%lynx.lss
+
+ lynx.exe %1 %2 %3 %4 %5 %6 %7 %8 %9
+endlocal
diff --git a/samples/lynx.com b/samples/lynx.com
new file mode 100644
index 0000000..568d3e2
--- /dev/null
+++ b/samples/lynx.com
@@ -0,0 +1,59 @@
+$ ! LYNX.COM
+$ ! sets up lynx as a command so that it will accept command line arguments
+$ ! It is assumed that this file is located in the same place as the LYNX
+$ ! Image. If it is not then you must change the lynx symbol.
+$ ! Written by Danny Mayer, Digital Equipment Corporation
+$ !
+$ !
+$ THIS_PATH = F$PARSE(F$ENV("PROCEDURE"),,,"DEVICE") + -
+ F$PARSE(F$ENV("PROCEDURE"),,,"DIRECTORY")
+$ alpha = F$GETSYI("HW_MODEL") .GT. 1023
+$ !
+$ CPU := VAX
+$ IF alpha THEN CPU :== AXP
+$ lynx:==$'THIS_PATH'lynx_'CPU'.exe
+$!
+$! fill in another gateway if you wish
+$!
+$define "WWW_wais_GATEWAY" "http://www.w3.org:8001"
+$!
+$! fill in your NNTP news server here
+$!
+$ !define "NNTPSERVER" "news"
+$ !
+$ ! Set up the Proxy Information Here
+$ !
+$ ! no_proxy environmental variable
+$ ! The no_proxy environmental variable is checked to get the list of
+$ ! of hosts for which the proxy server is not consulted.
+$ ! NOTE: THE no_proxy VARIABLE MUST BE IN LOWER CASE. On VMS systems
+$ ! this is accomplished by defining a logical name in double-quotes.
+$ !
+$ ! The no_proxy environmental variable is a comma-separated or
+$ ! space-separated list of machine or domain names, with optional
+$ ! :port part. If no :port part is present, it applies to all ports
+$ ! on that domain.
+$ !
+$ ! Example:
+$ ! define "no_proxy" "cern.ch,some.domain:8001"
+$ !
+$ !
+$ define "no_proxy" "yourorg.com" ! Use only for outside of yourorg
+$ !
+$ ! proxy server environmental variables
+$ ! In Lynx, each protocol needs an environmental variable defined for
+$ ! it in order for it to use a proxy server set up for that protocol.
+$ ! The proxy environmental variable is of the form:
+$ ! protocol_proxy where protocol is the protocol name part of the URL,
+$ ! for example: http or ftp. NOTE: the protocol server proxy variable
+$ ! MUST BE IN LOWER CASE.
+$ ! Example:
+$ ! define "http_proxy" "http://your_proxy.yourorg:8080/"
+$ !
+$ Proxy_Server = "http://your_proxy.yourorg:8080/"
+$ define "http_proxy" "''Proxy_Server'"
+$ define "ftp_proxy" "''Proxy_Server'"
+$ define "gopher_proxy" "''Proxy_Server'"
+$ define "news_proxy" "''Proxy_Server'"
+$ define "wais_proxy" "''Proxy_Server'"
+$ !
diff --git a/samples/lynx.ico b/samples/lynx.ico
new file mode 100644
index 0000000..2bde5f8
--- /dev/null
+++ b/samples/lynx.ico
Binary files differ
diff --git a/samples/lynx.lss b/samples/lynx.lss
new file mode 100644
index 0000000..2d02eb1
--- /dev/null
+++ b/samples/lynx.lss
@@ -0,0 +1,115 @@
+# Setting the normal and default types lets us keep (almost) the same colors
+# whether the terminal's default colors are white-on-black or black-on-white.
+# It is not exact since the default "white" is not necessarily the same color
+# as the ANSI lightgray, but is as close as we can get in a standard way.
+#
+# If you really want the terminal's default colors, and if lynx is built using
+# ncurses' default-color support, remove these two lines:
+normal: normal: lightgray:black
+default: normal: white:black
+
+# Normal type styles correspond to HTML tags.
+#
+# The next line (beginning with "em") means: use bold if mono, otherwise
+# brightblue on <defaultbackground>
+em: bold: brightblue
+strong: bold: brightred
+b: bold: red
+i: bold: brightblue
+a: bold: green
+img: dim: brown
+fig: normal: gray
+caption: reverse: brown
+hr: normal: yellow
+blockquote: normal: brightblue
+ul: normal: brown
+address: normal: magenta
+title: normal: magenta
+tt: dim: brightmagenta: black
+h1: bold: yellow: blue
+label: normal: magenta
+q: normal: yellow: magenta
+small: dim: default
+big: bold: yellow
+sup: bold: yellow
+sub: dim: gray
+li: normal: magenta
+code: normal: cyan
+cite: normal: cyan
+
+table: normal: brightcyan
+tr: bold: brown
+td: normal: default
+br: normal: default
+
+# Special styles - not corresponding directly to HTML tags
+# alert - status bar, when message begins "Alert".
+# alink - active link
+# normal - default attributes
+# status - status bar
+# whereis - whereis search target
+#
+#normal:normal:default:blue
+alink: reverse: yellow: black
+status: reverse: yellow: blue
+alert: bold: yellow: red
+whereis: reverse+underline: magenta: cyan
+# currently not used
+#value:normal:green
+
+menu.bg: normal: black: lightgray
+menu.frame: normal: black: lightgray
+menu.entry: normal: lightgray: black
+menu.n: normal: red: gray
+menu.active: normal: yellow: black
+menu.sb: normal: brightred: lightgray
+
+forwbackw.arrow:reverse
+hot.paste: normal: brightred: gray
+
+# Styles with classes - <ul class=red> etc.
+ul.red: underline: brightred
+ul.blue: bold: brightblue
+li.red: reverse: red: yellow
+li.blue: bold: blue
+strong.a: bold: black: red
+em.a: reverse: black: blue
+strong.b: bold: white: red
+em.b: reverse: white: blue
+strong.debug: reverse: green
+font.letter: normal: white: blue
+input.submit: normal: cyan
+tr.baone: bold: yellow
+tr.batwo: bold: green
+tr.bathree: bold: red
+#
+# Special handling for link.
+link: normal: white
+link.green: bold: brightgreen
+link.red: bold: black: red
+link.blue: bold: white: blue
+link.toc: bold: black: white
+# Special cases for link - the rel or title is appended after the class.
+# <link rel=next class=red href="1">
+link.red.next: bold: red
+link.red.prev: bold: yellow: red
+link.blue.prev: bold: yellow: blue
+link.blue.next: bold: blue
+link.green.toc: bold: white: green
+#
+# Define styles that will be used when syntax highlighting is requested
+# (commandline option -prettysrc).
+span.htmlsrc_comment:normal: white
+span.htmlsrc_tag:normal: white
+#If you don't like that the tag name and attribute name are displayed
+#in different colors, comment the following line.
+span.htmlsrc_attrib:normal: cyan
+span.htmlsrc_attrval:normal: magenta
+span.htmlsrc_abracket:normal: white
+span.htmlsrc_entity:normal: white
+##span.htmlsrc_href:
+##span.htmlsrc_entire:
+span.htmlsrc_badseq:normal: red
+span.htmlsrc_badtag:normal: red
+span.htmlsrc_badattr:normal: red
+span.htmlsrc_sgmlspecial:normal: yellow
diff --git a/samples/lynx_bookmarks.htm b/samples/lynx_bookmarks.htm
new file mode 100644
index 0000000..378f28c
--- /dev/null
+++ b/samples/lynx_bookmarks.htm
@@ -0,0 +1,13 @@
+<head>
+<meta http-equiv="content-type" content="text/html;charset=windows-1252">
+<title>Bookmark file</title>
+</head>
+ You can delete links by the 'R' key<br>
+<ol>
+<li><a href="https://lynx.invisible-island.net/">Lynx homepage</a>
+<li><a href="http://home.pacific.net.sg/~kennethkwok/lynx/">Lynx Browser for Windows 9x/NT/2000/XP</a>
+<li><a href="http://www.fdisk.com/doslynx/lynxport.htm">Lynx for DOS 386 and Win32</a>
+<li><a href="http://www.chass.utoronto.ca/~purslow/lhfb.html">Lynx Help for Beginners</a>
+<li><a href="http://www.hicom.net/~oedipus/weave.html">HTML Authoring and Accessibility Resources for Lynx</a>
+<li><a href="http://perso.club-internet.fr/dominique.guebey/tekno/lynx.htm">La page navigateur LYNX</a>
+<li><a href="https://lynx.invisible-island.net/release/">Current Lynx Release</a>
diff --git a/samples/lynxdump b/samples/lynxdump
new file mode 100755
index 0000000..a0e9ae2
--- /dev/null
+++ b/samples/lynxdump
@@ -0,0 +1,16 @@
+#!/bin/sh
+# lynx -dump w/o numbers
+: ${TMPDIR-/tmp}
+: ${HOME-`pwd`}
+oldmask=`umask`
+umask 077
+MYTMP=$TMPDIR/mytmp$$
+mkdir $MYTMP || exit 1
+trap 'cd /; rm -rf $MYTMP' 0 1 2 5 15
+if test $HOME/.lynxrc ; then
+ cp $HOME/.lynxrc $MYTMP/.lynxrc
+fi
+echo 'keypad_mode=NUMBERS_AS_ARROWS' >> $MYTMP/.lynxrc
+HOME=$MYTMP; export HOME
+umask $oldmask
+lynx -justify -dump -force_html -with_backspaces -nolist $*
diff --git a/samples/mailcap b/samples/mailcap
new file mode 100644
index 0000000..8f47338
--- /dev/null
+++ b/samples/mailcap
@@ -0,0 +1,99 @@
+# Copyright (c) 1991 Bell Communications Research, Inc. (Bellcore)
+#
+# Permission to use, copy, modify, and distribute this material
+# for any purpose and without fee is hereby granted, provided
+# that the above copyright notice and this permission notice
+# appear in all copies, and that the name of Bellcore not be
+# used in advertising or publicity pertaining to this
+# material without the specific, prior written permission
+# of an authorized representative of Bellcore. BELLCORE
+# MAKES NO REPRESENTATIONS ABOUT THE ACCURACY OR SUITABILITY
+# OF THIS MATERIAL FOR ANY PURPOSE. IT IS PROVIDED "AS IS",
+# WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES.
+#
+# Prototype Mailcap file
+# Note that support for text & multipart are "built in" to metamail,
+# as are rudimentary support for message, and application.
+# However, any of these may be overridden in mailcap.
+#
+# Note that users may override or extend this with a .mailcap
+# file in their own directory. However, there is NO NEED
+# for them to copy entries from this file, as metamail will
+# pick up entries from both the system and personal mailcap files.
+#
+
+# NOTE: This file has been heavily modified for use as an example
+# configuration file for Lynx
+
+# In the samples given test=test -n "$DISPLAY" is used to
+# determine if the current session is X capable by checking
+# for the existence of a DISPLAY environment variable.
+# Lynx actually uses a getenv() call for DISPLAY (DECW$DISPLAY
+# on VMS) when it encounters test=test -n "$DISPLAY" or
+# test=test -z "$DISPLAY" in a viewer assignment, instead of
+# spawning to execute "test" via a system() call, i.e., those
+# two strings, respectively, are handled equivalently to the
+# :XWINDOWS and :NON_XWINDOWS flags for VIEWER: assignments
+# in lynx.cfg. Any system without the DISPLAY (or DECW$DISPLAY)
+# environment variable will be assumed to be Non-X.
+
+# You can append a ';' followed by "q=#.#", e.g., ; q=0.002
+# to set the quality parameter for the Content-Type, which can be
+# included in the Accept: header Lynx sends to http servers (the
+# default quality value is 1.0, and Lynx appends the parameter
+# to the Content-Type only if the value is less than 1.0).
+
+# You can append a ';' followed by "mxb=#", e.g., ; mxb=1000000
+# to set the maxbytes parameter for the Content-Type, which can be
+# included in the Accept: header Lynx sends to http servers (the
+# default maxbytes value is 0, meaning no maximum, and Lynx appends
+# the parameter to the Content-Type only if the value exceeds 0).
+
+# The following line is for sites where xv understands jpeg but xloadimage
+# is preferred.
+#
+# the test line specifies that this viewer should only be used if
+# the display variable is set.
+image/jpeg; xv %s; test=test -n "$DISPLAY"
+
+# The following sends all other image subtypes to xloadimage
+#image/*; xloadimage %s; ; test=test -n "$DISPLAY"
+
+# The following sends all other image subtypes to xv
+image/*; xv %s; ; test=test -n "$DISPLAY"
+
+
+# If you have an interactive Postscript interpreter, you should think carefully
+# before replacing lpr with it in the following line, because PostScript
+# can be an enormous security hole. It is RELATIVELY harmless
+# when sent to the printer...
+
+# This one is for NON-X
+#application/postscript; lpr %s \; echo SENT FILE TO PRINTER; ;test=test -z "$DISPLAY"
+
+# This one is for X. It's already the default via src/HTInit.c.
+#application/postscript; ghostview %s; ; test=test -n "$DISPLAY"
+
+# The following should be commented out if you do NOT have safe-tcl
+# and should be uncommented if you DO have safe-tcl
+#application/safe-tcl; swish -safe -messaging -f %s
+
+# A common problem with the mailcap mechanism is getting differential
+# behavior from different programs. This problem is compounded by the fact
+# that some programs, notably Mosaic, do not implement the "test" clause in
+# mailcap files. If you are using Lynx and X Mosaic together you should
+# place all X-centric entries before non-X entries. X Mosaic will use
+# whichever entry is defined first so further entries will be ignored.
+#
+# Lynx exports the environment variable LYNX_VERSION, so it can be tested
+# by scripts to determine if Lynx is running or not. However, the string
+# test=test -n "$LYNX_VERSION"
+# is handled simply as a flag which yields success when Lynx encounters it
+# in the mailcap file (i.e., Lynx does not bother to execute "test" via a
+# system() call to find out if it's running, because it obviously is).
+# Inclusion of the string for that test can be used to prevent other
+# software which reads the mailcap file from acting on assignments intended
+# only for Lynx. The string
+# test=test -z "$LYNX_VERSION"
+# similarly is treated by Lynx simply as a flag which yields failure.
+
diff --git a/samples/mailto-form.pl b/samples/mailto-form.pl
new file mode 100755
index 0000000..5afffc8
--- /dev/null
+++ b/samples/mailto-form.pl
@@ -0,0 +1,280 @@
+#! /usr/bin/perl -w
+# Some scripts for handling mailto URLs within lynx via an interactive form
+#
+# Warning: this is a quick demo, to show what kinds of things are possible
+# by hooking some external commands into lynx. Use at your own risk.
+#
+# Requirements:
+#
+# - Perl and CGI.pm.
+# - A "sendmail" command for actually sending mail (if you need some
+# other interface, change the code below in sub sendit appropriately).
+# - Lynx compiled with support for lynxcgi, that means EXEC_CGI must have
+# been defined at compilation, usually done with
+# ./configure --enable-cgi-links
+# - Lynx must have support for CERN-style rules as of 2.8.3, which must
+# not have been disabled at compilation (it is enabled by default).
+#
+# Instructions:
+# (This is for people without lynxcgi experience; if you are already
+# use lynxcgi, you don't have to follow everything literally, use
+# common sense for picking appropriate file locations in your situation.)
+#
+# - Make a subdirectory 'lynxcgi' under you home directory, i.e.
+# mkdir ~/lynxcgi
+# - Put this three script file mailto-form.pl there and make it
+# executable. For example,
+# cp mailto-form.pl ~/lynxcgi
+# chmod a+x ~/lynxcgi/mailto-form.pl
+# - Edit mailto-form.pl (THIS FILE), there are some strings that
+# that need to be changed, see ### Configurable variables ###
+# below.
+# - Allow lynx to execute lynxcgi files in that directory, for example,
+# put in your lynx.cfg file:
+# TRUSTED_LYNXCGI:<tab>/home/myhomedir/lynxcgi/mailto-form.pl
+# where <tab> is a real TAB character and you have to put the real
+# location of your directory in place of "myhomedir", of course.
+# The '~' abbreviation cannot be used.
+# You could also just enable execution of all lynxcgi scripts, by
+# not having any TRUSTED_LYNXCGI options in lynx.cfg at all, but
+# that can't be recommended.
+# - Tell lynx to actually use the lynxcgi scripts for mailto URLs.
+# There are two variants:
+# a) Redirect "mailto"
+# Requires patched lynx, currently not yet in the developent code.
+# Use the following two lines in the file that is configured as
+# RULESFILE in lynxcfg:
+# PermitRedirection mailto:*
+# Redirect mailto:* lynxcgi:/home/myhomedir/lynxcgi/mailto-form.pl?from=myname@myhost&to=*
+# You can also put them directly in lynx.cfg, prefixing each with
+# "RULE:". Replace ""myhomedir", "myname", and "myhost" with your
+# correct values, of course.
+# b) Redirect "xmailto"
+# Requires defining a fake proxy before starting lynx, like
+# export xmailto_proxy=dummy # or for csh: setenv xmailto_proxy dummy
+# Requires that you change "mailto" to "xmailto" each time you want
+# to activate a mailto link. This can be done conveniently with
+# a few keys: 'E', ^A, 'x', Enter.
+# Use the following two lines in the file that is configured as
+# RULESFILE in lynxcfg:
+# PermitRedirection xmailto:*
+# Redirect xmailto:* lynxcgi:/home/myhomedir/lynxcgi/mailto-form.pl?from=myname@myhost&to=*
+# You can also put them directly in lynx.cfg, prefixing each with
+# "RULE:". Replace ""myhomedir", "myname", and "myhost" with your
+# correct values, of course.
+#
+# Limitations:
+#
+# - Only applies to mailto URLs that appear as links or are entered at
+# a 'g'oto prompt. Does not apply to other ways of sending mail, like
+# the 'c' (COMMENT) key, mailto as a FORM action, or mailing a file
+# from the 'P'rinting Options screen.
+# - Nothing is done for charset labelling, content-transfer-encoding
+# of non-ASCII characters, and other MIME niceties.
+#
+# Klaus Weide 20000712
+
+########################################################################
+########## Configurable variables ######################################
+
+$SENDMAIL = '/usr/sbin/sendmail';
+# The location of your sendmail binary
+$SELFURL = 'lynxcgi:/home/lynxdev/lynxcgi/mailto-form.pl';
+# Where this script lives in URL space
+$SEND_TOKEN = '/vJhOp6eQ';
+# When found in the PATH_INFO part of the URL,
+# this causes the script to actually send mail
+# by calling $SENDMAIL instead of just throwing
+# up a form. CHANGE IT! And don't tell anyone!
+# Treat it like a password.
+# Must start with '/', probably should have only
+# alphanumeric ASCII characters.
+
+## Also, make sure the first line of this script points
+## to your PERL binary
+
+########## Nothing else to change - I hope #############################
+########################################################################
+
+use CGI;
+
+$|=1;
+
+### Upcase first character
+##sub ucfirst {
+## s/^./\U$1/;
+##}
+
+# If there are multiple occurrences of the same thing, how to join them
+# into one string
+%joiner = (from => ', ',
+ to => ', ',
+ cc => ', ',
+ subject => '; ',
+ body => "\n\n"
+ );
+sub joiner {
+ my ($key) = @_;
+ if ($joiner{$key}) {
+ $joiner{$key};
+ } else {
+ " ";
+ }
+}
+
+# Here we check whether this script is called for actual sending, rather
+# than form generation. If so, all the rest is handled by sub sendit, below.
+$pathinfo = $ENV{'PATH_INFO'};
+if (defined($pathinfo) && $pathinfo eq $SEND_TOKEN) {
+ $q = new CGI;
+ print $q->header('text/plain');
+ sendit();
+ exit;
+}
+
+$method = $ENV{'REQUEST_METHOD'};
+$querystring = $ENV{'QUERY_STRING'};
+if ($querystring) {
+ if ($method && $method eq "POST" && $ENV{'CONTENT_LENGTH'}) {
+ $querystring =~ s/((^|\&)to=[^?&]*)\?/$1&/;
+ $q0 = new CGI;
+ $q = new CGI($querystring);
+ @fields = $q0->param();
+ foreach $key (@fields) {
+ @vals = $q0->param($key);
+# print "Content-type: text/html\n\n";
+# print "Appending $key to \$q...\n";
+ $q->append($key, @vals);
+# print "<H2>Current Values in \$q0</H2>\n";
+# print $q0->dump;
+# print "<H2>Current Values in \$q</H2>\n";
+# print $q->dump;
+
+ }
+
+ } else {
+ $querystring =~ s/((^|\&)to=[^?&]*)\?/$1&/;
+ $q = new CGI($querystring);
+ }
+} else {
+ $q = new CGI;
+}
+
+print $q->header;
+
+$long_title = $ENV{'QUERY_STRING'};
+$long_title =~ s/^from=([^&]*)\&to=//;
+$long_title = "someone" unless $long_title;
+$long_title = "Compose mail for $long_title";
+if (length($long_title) > 72) {
+ $title = substr($long_title,0,72) . "...";
+} else {
+ $title = $long_title;
+}
+$long_title =~ s/&/&amp;/g;
+$long_title =~ s/</&lt;/g;
+print
+ $q->start_html($title), "\n",
+ $q->h1($long_title), "\n",
+ $q->start_form(-method=>'POST', -action => $SELFURL . $SEND_TOKEN), "\n";
+
+print "<TABLE>\n";
+@fields = $q->param();
+foreach $key (@fields) {
+ @vals = $q->param($key);
+ if (scalar(@vals) != 1) {
+ print "multiple values " . scalar(@vals) ." for $key!\n";
+ $q->param($key, join (joiner($key), @vals));
+ }
+}
+foreach $key (@fields) {
+ $_ = lc($key);
+ if ($_ ne $key) {
+ print "noncanonical case for $key!\n";
+ $val=$q->param($key);
+ $q->delete($key);
+ if (!$q->param($_)) {
+ $q->param($_, $val);
+ } else {
+ $q->param($_, $q->param($_) . joiner($_) . "$val");
+ }
+ }
+}
+foreach $key ('from', 'to', 'cc', 'subject') {
+ print $q->Tr,
+ $q->td(ucfirst($key) . ":"),
+ $q->td($q->textfield(-name=>$key,
+ -size=>60,
+ -default=>$q->param($key))), "\n";
+ $q->delete($key);
+}
+
+# Also pass on any unrecognized header fields that were specified.
+# This may not be a good idea for general use!
+# At least some dangerous header fields may have to be suppressed.
+@keys = $q->param();
+if (scalar(@keys) > (($q->param('body')) ? 1 : 0)) {
+ print "<TR><TD colspan=2><EM>Additional headers:</EM>\n";
+ foreach $key ($q->param()) {
+ if ($key ne 'body') {
+ print $q->Tr,
+ $q->td(ucfirst($key) . ":"),
+ $q->td($q->textfield(-name=>$key,
+ -size=>60,
+ -default=>$q->param($key))), "\n";
+ }
+ }
+}
+print "</TABLE>\n";
+print $q->textarea(-name=>'body',
+ -default=>$q->param('body')), "\n";
+print "<PRE>\n\n</PRE>", "\n",
+ $q->submit(-value=>"Send the message"), "\n",
+ $q->endform, "\n";
+
+print "\n";
+exit;
+
+# This is for header field values.
+sub sanitize_field_value {
+ my($val) = @_;
+ $val =~ s/\0/./g;
+ $val =~ s/\r\n/\n/g;
+ $val =~ s/\r/\n/g;
+ $val =~ s/\n*$//g;
+ $val =~ s/\n+/\n/g;
+ $val =~ s/\n(\S)/\n\t$1/g;
+ $val;
+}
+
+sub sendit {
+ open (MAIL, "| $SENDMAIL -t -oi -v") || die ("$0: Can't run sendmail: $!\n");
+ @fields = $q->param();
+ foreach $key (@fields) {
+ @vals = $q->param($key);
+ if (scalar(@vals) != 1) {
+ print "multiple values " . scalar(@vals) ." for $key!\n";
+ $q->param($key, join (joiner($key), @vals));
+ }
+ }
+ foreach $key (@fields) {
+ if ($key ne 'body') {
+ if ($key =~ /[^A-Za-z0-9_-]/) {
+ print "$0: Ignoring malformed header field named '$key'!\n";
+ next;
+ }
+ print MAIL ucfirst($key) . ": " .
+ sanitize_field_value($q->param($key)) . "\n"
+ or die ("$0: Feeding header to sendmail failed: $!\n");
+ }
+ }
+ print MAIL "\n"
+ or die ("$0: Ending header for sendmail failed: $!\n");
+ print MAIL $q->param('body'), "\n"
+ or die ("$0: Feeding body to sendmail failed: $!\n");
+ close(MAIL)
+ or warn $! ? "Error closing pipe to sendmail: $!"
+ : ($? & 127) ? ("Sendmail killed by signal " . ($? & 127) .
+ ($? & 127) ? ", core dumped" : "")
+ : "Return value " . ($? >> 8) . " from sendmail";
+}
diff --git a/samples/midnight.lss b/samples/midnight.lss
new file mode 100644
index 0000000..8ecb772
--- /dev/null
+++ b/samples/midnight.lss
@@ -0,0 +1,84 @@
+# From: claudio santambrogio <claudio.santambrogio@tiscali.it>
+
+em:bold:green:blue
+strong:bold:red:blue
+b:bold:white:blue
+i:bold:yellow:blue
+alink:reverse:brightgreen:blue
+a:bold:cyan:blue
+img:dim:gray:blue
+status:reverse:brightblue:blue
+forwbackw.arrow:bold:brightblue:blue
+alert:bold:red:blue
+fig:normal:gray:blue
+caption:reverse:brown:blue
+hr:normal:yellow:blue
+blockquote:normal:brightblue:blue
+#ul:normal:brown:blue
+address:normal:magenta:blue
+title:normal:grey:blue
+tt:dim:gray:blue
+h1:bold:brightblue:blue
+label:normal:magenta:blue
+value:normal:green:blue
+high:bold:brightmagenta:blue
+q:normal:yellow:magenta
+small:dim:gray:blue
+big:bold:yellow:blue
+sup:bold:yellow:blue
+sub:dim:gray:blue
+lh:bold:yellow:magenta
+
+area:normal:default:blue
+body:normal:default:blue
+br:normal:default:blue
+center:normal:default:blue
+center.header:normal:default:blue
+div:normal:default:blue
+font:normal:default:blue
+font.letter:normal:default:blue
+h2:normal:default:blue
+h3:normal:default:blue
+h4:normal:default:blue
+h5:normal:default:blue
+h6:normal:default:blue
+head:normal:default:blue
+link:normal:default:blue
+map:normal:default:blue
+meta:normal:default:blue
+p:normal:default:blue
+table:normal:default:blue
+td:normal:default:blue
+tr:normal:default:blue
+title:normal:default:blue
+
+form:normal:default:blue
+input:normal:default:blue
+input.submit:normal:cyan:blue
+select:normal:default:blue
+option:normal:default:blue
+
+pre:normal:default:blue
+dd:normal:default:blue
+dt:normal:default:blue
+ul:normal:default:blue
+li:normal:default:blue
+
+base:normal:default:blue
+iframe:normal:red:blue
+cite:normal:yellow:blue
+
+span.htmlsrc_comment:normal:green:blue
+span.htmlsrc_tag:normal:brightgreen:blue
+span.htmlsrc_attrib:normal:cyan:blue
+span.htmlsrc_attrval:normal:white:blue
+span.htmlsrc_abracket:normal:brightgreen:blue
+span.htmlsrc_entity:normal:white:blue
+##span.htmlsrc_href:
+##span.htmlsrc_entire:
+span.htmlsrc_badseq:normal:red:blue
+span.htmlsrc_badtag:normal:red:blue
+span.htmlsrc_badattr:normal:red:blue
+span.htmlsrc_sgmlspecial:normal:yellow:blue
+
+normal:normal:default:blue \ No newline at end of file
diff --git a/samples/mild-colors.lss b/samples/mild-colors.lss
new file mode 100644
index 0000000..2807e50
--- /dev/null
+++ b/samples/mild-colors.lss
@@ -0,0 +1,59 @@
+# From: Vlad Harchev <hvv@hippo.ru>
+# Setting the normal and default types lets us keep (almost) the same colors
+# whether the terminal's default colors are white-on-black or black-on-white.
+# It is not exact since the default "white" is not necessarily the same color
+# as the ANSI lightgray, but is as close as we can get in a standard way.
+#
+# If you really want the terminal's default colors, and if lynx is built using
+# ncurses' default-color support, remove these two lines:
+normal: normal: lightgray:black
+default: normal: white:black
+
+# Notes:
+# better for eyes - it sets black background with mild colors that
+# have approximately the same intensity.
+#
+# grey normal text on black background with green links and brightgreen
+# highlighted links.
+em: bold: cyan
+strong: bold: cyan
+dt: bold: cyan
+var: bold: cyan
+samp: bold: cyan
+b: bold: cyan
+i: bold: cyan
+alink: reverse: brightgreen: black
+a: bold: green
+img: dim: cyan: black
+status: reverse: cyan: black
+fig: normal: gray
+caption: reverse: cyan
+hr: normal: gray
+blockquote: normal: cyan: black
+address: normal: cyan
+title: normal: cyan: black
+tt: normal: white: black
+h1: bold: cyan: black
+label: normal: cyan
+value: normal: cyan
+q: normal: cyan
+small: dim: cyan
+big: bold: cyan
+sup: bold: cyan
+sub: dim: cyan
+code: normal: cyan
+
+span.htmlsrc_comment:normal:white
+span.htmlsrc_tag:normal:cyan
+##the following makes no difference (except increasing the speed) since tag
+##is already in cyan.
+#span.htmlsrc_attrib:normal:cyan
+#span.htmlsrc_attrval:normal:magenta
+span.htmlsrc_abracket:normal:cyan
+span.htmlsrc_entity:normal:white
+##span.htmlsrc_href:
+##span.htmlsrc_entire:
+span.htmlsrc_badseq:normal:red
+span.htmlsrc_badtag:normal:red
+span.htmlsrc_badattr:normal:red
+span.htmlsrc_sgmlspecial:normal:yellow
diff --git a/samples/mime.types b/samples/mime.types
new file mode 100644
index 0000000..6393c30
--- /dev/null
+++ b/samples/mime.types
@@ -0,0 +1,26 @@
+# example mime.types file.
+# see the NCSA X Mosaic documentation at
+# http://www.ncsa.uiuc.edu/SDG/Software/Mosaic/Docs/extension-map.html
+# for more details
+# [Lynx uses mime.types mapping for ftp and local files only,
+# http server does specify MIME type in the Content-Type header].
+
+application/postscript ai eps ps
+application/rtf rtf
+application/x-tex tex
+application/x-texinfo texinfo texi
+application/x-troff t tr roff
+audio/basic au snd
+audio/x-aiff aif aiff aifc
+audio/x-wav wav
+image/gif gif
+image/ief ief
+image/jpeg jpeg jpg jpe
+image/tiff tiff tif
+image/x-xwindowdump xwd
+text/html html
+text/plain txt c cc h
+video/mpeg mpeg mpg mpe
+video/quicktime qt mov
+video/x-msvideo avi
+video/x-sgi-movie movie
diff --git a/samples/oldlynx b/samples/oldlynx
new file mode 100755
index 0000000..79721b1
--- /dev/null
+++ b/samples/oldlynx
@@ -0,0 +1,24 @@
+#!/bin/sh
+# invoke lynx built with color-style, overriding the color options to use the
+# non-color-style scheme -TD
+
+my_cfg=${TMPDIR:-/tmp}/lynxcfg$$
+my_lss=${TMPDIR:-/tmp}/lynxlss$$
+trap "rm -f $my_lss $my_cfg" 0 1 2 5 15
+
+echo >$my_lss
+
+rm -f "$my_cfg"
+echo "DEFAULT_COLORS:off" >>$my_cfg
+if test -n "$LYNX_CFG" ; then
+ echo "include:$LYNX_CFG" >>$my_cfg
+fi
+echo "COLOR_STYLE:" >>$my_cfg
+echo "NESTED_TABLES:off" >>$my_cfg
+
+LYNX_CFG=$my_cfg
+export LYNX_CFG
+LYNX_LSS=$my_lss
+export LYNX_LSS
+
+${LYNX_PROG-lynx} "$@"
diff --git a/samples/oldlynx.bat b/samples/oldlynx.bat
new file mode 100644
index 0000000..976b3a8
--- /dev/null
+++ b/samples/oldlynx.bat
@@ -0,0 +1,44 @@
+@ECHO off
+@rem $LynxId: oldlynx.bat,v 1.8 2018/03/21 16:08:49 tom Exp $
+@rem demonstrate lynx without color-style
+setlocal
+
+ set TERM=vt100
+rem Set HOME to make URLs in config work, though this prevents -trace
+ set HOME=%~dp0
+ set PATH=%HOME%;%PATH%
+
+rem We need a temporary directory
+ if not "x%LYNX_TEMP_SPACE%"=="x" goto :do_cfg
+ if "x%TEMP%"=="x" set LYNX_TEMP_SPACE=%TEMP%
+ if not "x%TEMP%"=="x" goto :do_cfg
+ if "x%TMP%"=="x" set LYNX_TEMP_SPACE=%TMP%
+ if not "x%TMP%"=="x" goto :do_cfg
+
+ set LYNX_TEMP_SPACE=%HOMEDRIVE%%HOMEPATH%tmp
+ mkdir "%LYNX_TEMP_SPACE%"
+ if not errorlevel 0 goto :do_cfg
+
+ echo Cannot make temp-directory
+ goto :eof
+
+:do_cfg
+ lynx.exe -help 2>&1 | find "-lss" >NUL
+ if not errorlevel 1 goto :do_cfg2
+ echo This copy of Lynx was not compiled with color-style.
+ goto :eof
+
+:do_cfg2
+ set LYNX_CFG_PATH=%HOME%
+ set LYNX_CFG=%LYNX_TEMP_SPACE%\oldlynx.cfg
+ set LYNX_LSS=
+
+ echo DEFAULT_COLORS:off >>"%LYNX_CFG%"
+ echo include:lynx-demo.cfg >>"%LYNX_CFG%"
+ echo COLOR_STYLE: >>"%LYNX_CFG%"
+ echo NESTED_TABLES:off >>"%LYNX_CFG%"
+
+:do_exe
+ lynx.exe -lss="" %1 %2 %3 %4 %5 %6 %7 %8 %9
+ erase %LYNX_CFG%
+endlocal
diff --git a/samples/opaque.lss b/samples/opaque.lss
new file mode 100644
index 0000000..80e3969
--- /dev/null
+++ b/samples/opaque.lss
@@ -0,0 +1,48 @@
+# From: claudio santambrogio <claudio.santambrogio@tiscali.it>
+
+em:bold:cyan
+strong:bold:cyan
+dt:bold:cyan
+var:bold:cyan
+samp:bold:cyan
+b:bold:cyan
+i:bold:cyan
+alink:reverse:brightgreen:red
+a:bold:green
+img:dim:cyan:default
+status:reverse:cyan:default
+fig:normal:gray
+caption:reverse:cyan
+hr:normal:gray
+blockquote:normal:cyan:default
+address:normal:cyan
+title:normal:cyan:default
+tt:normal:white:default
+h1:bold:cyan:default
+label:normal:cyan
+value:normal:cyan
+high:bold:cyan
+q:normal:cyan
+small:dim:cyan
+big:bold:cyan
+sup:bold:cyan
+sub:dim:cyan
+lh:bold:cyan
+code:normal:cyan
+alert:bold:red
+normal:normal:brown:black
+
+span.htmlsrc_comment:normal:white
+span.htmlsrc_tag:normal:cyan
+##the following makes no difference (except increasing the speed) since tag
+##is already in cyan.
+#span.htmlsrc_attrib:normal:cyan
+#span.htmlsrc_attrval:normal:magenta
+span.htmlsrc_abracket:normal:cyan
+span.htmlsrc_entity:normal:green
+##span.htmlsrc_href:
+##span.htmlsrc_entire:
+span.htmlsrc_badseq:normal:red
+span.htmlsrc_badtag:normal:red
+span.htmlsrc_badattr:normal:red
+span.htmlsrc_sgmlspecial:normal:yellow
diff --git a/scripts/cfg2html.pl b/scripts/cfg2html.pl
new file mode 100755
index 0000000..44ad36e
--- /dev/null
+++ b/scripts/cfg2html.pl
@@ -0,0 +1,620 @@
+#!/usr/bin/perl -w
+# $LynxId: cfg2html.pl,v 1.21 2014/01/08 22:49:46 tom Exp $
+#
+# This script uses embedded formatting directives in the lynx.cfg file to
+# guide it in extracting comments and related information to construct a
+# set of HTML files. Comments begin with '#', and directives with '.'.
+# Directives implemented:
+#
+# h1 {Text}
+# major heading. You may specify the same major heading in
+# more than one place.
+# h2 {Text}
+# minor heading, i.e. a keyword.
+# ex [number]
+# the following line(s) are an example. The [number] defaults
+# to 1.
+# nf [number]
+# turn justification off for the given number of lines, defaulting
+# to the remainder of the file.
+# fi
+# turn justification back on
+# url text
+# embed an HREF to external site.
+#
+use strict;
+
+use Getopt::Std;
+
+use vars qw($opt_a $opt_m $opt_s);
+
+use vars qw(@cats);
+use vars qw(%cats);
+
+use vars qw(@settings_avail);
+use vars qw(%settings_avail);
+
+# Options:
+# -a show all options, not only those that are available.
+# -m mark unavailable options with an '*'. Data for this is read
+# from standard input.
+# -s sort entries in body.html
+&getopts('ams');
+
+if ( defined $opt_m ) {
+ my $l;
+ my @settings_ = <STDIN>;
+ %settings_avail = ();
+ foreach $l (@settings_) {
+ chop $l;
+ if ( $l =~ /^[[:alpha:]_][[:alnum:]_]*$/ ) {
+ $settings_avail{ uc $l } = 1;
+ }
+ }
+}
+else {
+ $opt_a = 1;
+}
+
+# This sub tells whether the support for the given setting was enabled at
+# compile time.
+sub ok {
+ my ($name) = @_;
+ my $ret = defined( $settings_avail{ uc $name } ) + 0;
+ $ret;
+}
+
+if ( $#ARGV < 0 ) {
+ &doit("lynx.cfg");
+}
+else {
+ while ( $#ARGV >= 0 ) {
+ &doit( shift @ARGV );
+ }
+}
+exit(0);
+
+# process a Lynx configuration-file
+sub doit {
+ my ($name) = @_;
+ my $n;
+
+ # Ignore our own backup files
+ if ( $name =~ ".*~" ) {
+ return;
+ }
+
+ # Read the file into an array in memory.
+ open( FP, $name ) || do {
+ print STDERR "Can't open $name: $!\n";
+ return;
+ };
+ my (@input) = <FP>;
+ close(FP);
+
+ for $n ( 0 .. $#input ) {
+ chop $input[$n]; # trim newlines
+ $input[$n] =~ s/\s*$//; # trim trailing blanks
+ $input[$n] =~ s/^\s*//; # trim leading blanks
+ }
+
+ &gen_alphatoc(@input);
+ @cats = &gen_cattoc(@input);
+ &gen_body(@input);
+}
+
+sub gen_alphatoc {
+ my (@input) = @_;
+ my @minor;
+ my ( $n, $m, $c, $d, $need_p );
+ my $output = "alphatoc.html";
+ open( FP, ">$output" ) || do {
+ print STDERR "Can't open $output: $!\n";
+ return;
+ };
+ print FP <<'EOF';
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<link rev="made" href="mailto:lynx-dev@nongnu.org">
+<title>lynx.cfg settings by name</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<meta name="description" content=
+"This is a table of Lynx's settings in lynx.cfg, listed alphabetically. Some settings are disabled at compile-time.">
+</head>
+<body>
+EOF
+ $m = 0;
+ for $n ( 0 .. $#input ) {
+ if ( $input[$n] =~ /^\.h2\s*[[:upper:]][[:upper:][:digit:]_]*$/ ) {
+ $minor[$m] = $input[$n];
+ $minor[$m] =~ s/^.h2\s*//;
+ $m++ if ( ok( $minor[$m] ) || defined $opt_a );
+ }
+ }
+ @minor = sort @minor;
+
+ # index by the first character of each keyword
+ $c = ' ';
+ $need_p = 1;
+ for $n ( 0 .. $#minor ) {
+ $d = substr( $minor[$n], 0, 1 );
+ if ( $d ne $c ) {
+ if ($need_p) {
+ printf FP "<p>";
+ $need_p = 0;
+ }
+ printf FP "<a href=\"#%s\">%s</a> \n", $d, $d;
+ $c = $d;
+ }
+ }
+
+ # index by the first character of each keyword
+ $c = ' ';
+ for $n ( 0 .. $#minor ) {
+ $d = substr( $minor[$n], 0, 1 );
+ if ( $d ne $c ) {
+ printf FP "<h2><a name=%s>%s</a></h2>\n", $d, $d;
+ $need_p = 1;
+ $c = $d;
+ }
+ my $avail = ok( $minor[$n] );
+ my $mark = ( !$avail && defined $opt_m ) ? "*" : "";
+ if ( defined $opt_a || $avail ) {
+ if ($need_p) {
+ printf FP "<p>";
+ $need_p = 0;
+ }
+ printf FP "<a href=\"body.html#%s\">%s</a>&nbsp;&nbsp;\n",
+ $minor[$n], $minor[$n] . $mark;
+ }
+ }
+ my $str = <<'EOF'
+<p>
+<a href=cattoc.html>To list of settings by category</a>
+EOF
+ . (
+ defined $opt_a && defined $opt_m
+ ? "<p>Support for all settings suffixed with '*' was disabled at compile time.\n"
+ : ""
+ )
+ . <<'EOF'
+</body>
+</html>
+EOF
+ ;
+ print FP $str;
+ close(FP);
+}
+
+# This uses the associative array $cats{} to store HREF values pointing into
+# the cattoc file.
+#
+# We could generate this file in alphabetic order as well, but choose to use
+# the order of entries in lynx.cfg, since some people expect that arrangement.
+sub gen_body {
+ my @input = @_;
+ my ( $n, $c );
+ my @h2;
+ my $output = "body.html";
+ open( FP, ">$output" ) || do {
+ print STDERR "Can't open $output: $!\n";
+ return;
+ };
+ print FP <<'EOF';
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<link rev="made" href="mailto:lynx-dev@nongnu.org">
+<title>Description of settings in lynx configuration file</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<meta name="description" content=
+"This is a list of each of Lynx's settings in lynx.cfg, with full description and their default values indicated.">
+</head>
+<body>
+EOF
+ my $l;
+ my $t;
+ my $d = -1;
+ my $p = 0;
+ my $m = 0;
+ my $h1 = "";
+ my $sp = ' ';
+ my $ex = 0;
+ my $nf = 0;
+ my $any = 0;
+ my $first = 0;
+ my $next = 0;
+ my $left = 0;
+ my $needp = 0;
+ my %keys;
+ undef %keys;
+
+ my @optnames;
+ my %optname_to_fname; #this maps optname to fname - will be used
+ #for alphabetical output of the content
+ my $curfilename = "tmp000"; #will be incremented each time
+ my $tmpdir = "./"; #temp files will be created there
+ close(FP);
+
+ for $n ( 0 .. $#input ) {
+ if ($next) {
+ $next--;
+ next;
+ }
+ $c = $input[$n];
+ my $count = $#input;
+ my $once = 1;
+ if ( $c =~ /^\.h1\s/ ) {
+ $h1 = 1;
+ $h1 = $c;
+ $h1 =~ s/^.h1\s*//;
+ $m = 0;
+ $first = 1;
+ undef %keys;
+ next;
+ }
+ elsif ( $c =~ /^\.h2\s/ ) {
+ $c =~ s/^.h2\s*//;
+ $h2[$m] = $c;
+ $keys{$c} = 1;
+ $m++;
+ next;
+ }
+ elsif ( $c =~ /^\./ ) {
+ my $s = $c;
+ $s =~ s/^\.[[:lower:]]+\s//;
+ if ( $s =~ /^[[:digit:]]+$/ ) {
+ $count = $s;
+ $once = $s;
+ }
+ }
+ if ( $c =~ /^\.ex/ ) {
+ $ex = $once;
+ printf FP "<h3><em>Example%s:</em></h3>\n", $ex > 1 ? "s" : "";
+ $needp = 1;
+ }
+ elsif ( $c =~ /^\.url/ ) {
+ my $url = $c;
+ $url =~ s/^\.url\s+//;
+ printf FP "<blockquote><p><a href=\"%s\">%s</a></p></blockquote>\n",
+ $url, $url;
+ $needp = 1;
+ }
+ elsif ( $c =~ /^\.nf/ ) {
+ $needp = 0;
+ printf FP "<pre>\n";
+ $nf = $count;
+ }
+ elsif ( $c =~ /^\.fi/ ) {
+ printf FP "</pre>\n";
+ $nf = 0;
+ $needp = 1;
+ }
+ elsif ( $c =~ /^$/ ) {
+ if ( $m > 1 ) {
+ my $j;
+ for $j ( 1 .. $#h2 ) {
+ close(FP);
+ ++$curfilename;
+ push @optnames, $h2[$j];
+ open( FP, ">$tmpdir/$curfilename" ) || do {
+ print STDERR "Can't open tmpfile: $!\n";
+ return;
+ };
+ $optname_to_fname{ $h2[$j] } = $curfilename;
+
+ printf FP "<hr>\n";
+ printf FP "<h2><kbd><a name=\"%s\">%s</a></kbd>\n", $h2[$j],
+ $h2[$j];
+ if ( $h1 ne "" ) {
+ printf FP " &ndash; <a href=\"cattoc.html#%s\">%s</a>",
+ $cats{$h1}, $h1;
+ }
+ printf FP "</h2>\n";
+ printf FP "<h3><em>Description</em></h3>\n";
+ printf FP "<p>Please see the description of "
+ . "<a href=\"#%s\">%s</a>\n",
+ $h2[0], $h2[0];
+ $needp = 0;
+ }
+ @h2 = "";
+ }
+ $m = 0;
+ $first = 1;
+ }
+ elsif ( $c =~ /^[#[:alpha:]]/ && $m != 0 ) {
+ if ($first) {
+ close(FP);
+ ++$curfilename;
+ push @optnames, $h2[0];
+ open( FP, ">$tmpdir/$curfilename" ) || do {
+ print STDERR "Can't open tmpfile: $!\n";
+ return;
+ };
+ $optname_to_fname{ $h2[0] } = $curfilename;
+
+ if ($any) {
+ printf FP "<hr>\n";
+ }
+ printf FP "<h2><kbd><a name=\"%s\">%s</a></kbd>\n", $h2[0],
+ $h2[0];
+ if ( $h1 ne "" ) {
+ printf FP " &ndash; <a href=\"cattoc.html#%s\">%s</a>",
+ $cats{$h1}, $h1;
+ }
+ printf FP "</h2>\n";
+ printf FP "<h3><em>Description</em></h3>\n";
+ $needp = 1;
+ $any++;
+ $first = 0;
+ }
+
+ # Convert tabs first, to retain relative alignment
+ $c =~ s#^\t#' 'x8#e;
+ while ( $c =~ /\t/ ) {
+ $c =~ s#(^[^\t]+)\t#$1 . $sp x (9 - (length($1) % 8 ))#e;
+ }
+
+ # Strip off the comment marker
+ $c =~ s/^#//;
+
+ # and convert simple expressions:
+ $c =~ s/&/&amp;/g;
+ $c =~ s/>/&gt;/g;
+ $c =~ s/</&lt;/g;
+
+ #hvv - something wrong was with next statement
+ $c =~ s/'([^ ])'/"<strong>$1<\/strong>"/g;
+
+ my $k = 0;
+ if ( $c =~ /^[[:alpha:]_][[:alnum:]_]+:/ ) {
+ $t = $c;
+ $t =~ s/:.*//;
+ $k = $keys{$t};
+ }
+
+ if ( $c =~ /^$/ ) {
+ if ($nf) {
+ printf FP "\n";
+ }
+ else {
+ $p = 1;
+ }
+ }
+ elsif ( $ex != 0 ) {
+ printf FP "%s", $needp ? "<p>" : "<br>";
+ $needp = 0;
+ printf FP "<code>%s</code><br>\n", $c;
+ $ex--;
+ }
+ elsif ($k) {
+ if ( $d != $n && !$nf ) {
+ printf FP "<h3><em>Default value</em></h3>\n";
+ printf FP "<p>";
+ $needp = 0;
+ }
+ $c =~ s/:$/:<em>none<\/em>/;
+ $c =~ s/:/<\/code>:<code>/;
+ $c = "<code>" . $c . "</code>";
+ if ( !$nf ) {
+ $c .= "<br>";
+ }
+ printf FP "%s\n", $c;
+ $d = $n + 1;
+ }
+ else {
+ if ( $p && !$nf ) {
+ printf FP "<p>\n";
+ $needp = 0;
+ }
+ $p = 0;
+ if ( $input[ $n + 1 ] =~ /^#\s*==/ ) {
+ $c = "<br><em>$c</em>";
+ if ( !$nf ) {
+ $c .= "<br>";
+ }
+ $next++;
+ }
+ printf FP "<p>" if $needp;
+ $needp = 0;
+ printf FP "%s\n", $c;
+ }
+ if ( $nf != 0 && $nf-- == 0 ) {
+ printf FP "</pre>\n";
+ }
+ }
+ }
+ close(FP);
+
+ # Here we collect files with description of needed lynx.cfg
+ # options in the proper (natural or sorted) order.
+ open( FP, ">>$output" ) || do {
+ print STDERR "Can't open $output: $!\n";
+ return;
+ };
+ {
+ my @ordered =
+ ( defined $opt_s ? ( sort keys(%optname_to_fname) ) : @optnames );
+ printf FP "<p>";
+ if ( defined $opt_s ) {
+ print FP "Options are sorted by name.\n";
+ }
+ else {
+ print FP "Options are in the same order as lynx.cfg.\n";
+ }
+ foreach $l (@ordered) {
+ my $fnm = $tmpdir . $optname_to_fname{$l};
+ open( FP1, "<$fnm" ) || do {
+ print STDERR "Can't open $fnm: $!\n";
+ return;
+ };
+ my $avail = ok($l);
+ if ( defined $opt_a || $avail ) {
+ my @lines = <FP1>;
+ print FP @lines;
+ if ( !$avail && defined $opt_m ) {
+ print FP <<'EOF';
+<p>Support for this setting was disabled at compile-time.
+EOF
+ }
+ }
+ close(FP1);
+ }
+ foreach $l ( values(%optname_to_fname) ) {
+ unlink $l;
+ }
+ }
+
+ print FP <<'EOF';
+</body>
+</html>
+EOF
+ close(FP);
+}
+
+sub gen_cattoc {
+ my @input = @_;
+ my @major;
+ my %descs;
+ my %index;
+ my ( $n, $m, $c, $d, $found, $h1, $nf, $ex, $count, $once );
+ my $output = "cattoc.html";
+
+ open( FP, ">$output" ) || do {
+ print STDERR "Can't open $output: $!\n";
+ return;
+ };
+ print FP <<'EOF';
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<link rev="made" href="mailto:lynx-dev@nongnu.org">
+<title>lynx.cfg settings by category</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<meta name="description" content=
+"These are the categories for Lynx's settings in lynx.cfg, with summary descriptions and links to each setting.">
+</head>
+<body>
+<p>These are the major categories of configuration settings in Lynx:
+<ul>
+EOF
+ $m = -1;
+ $h1 = 0;
+ $nf = 0;
+ for $n ( 0 .. $#input ) {
+ my $count = $#input;
+ my $once = 1;
+ $c = $input[$n];
+ if ( $input[$n] =~ /^\.h1\s/ ) {
+ $h1 = 1;
+ $c =~ s/^.h1\s*//;
+ $m = $#major + 1;
+ $d = 0;
+ $found = 0;
+ while ( $d <= $#major && !$found ) {
+ if ( $major[$d] eq $c ) {
+ $m = $d;
+ $found = 1;
+ }
+ $d++;
+ }
+ if ( !$found ) {
+ $major[$m] = $c;
+ $descs{ $major[$m] } = "";
+ $index{ $major[$m] } = "";
+ }
+ next;
+ }
+ elsif ( $h1 != 0 ) {
+ if ( $c =~ /^\.(nf|ex)/ ) {
+ my $s = $c;
+ $s =~ s/^\.[[:lower:]]+\s//;
+ if ( $s =~ /^[[:digit:]]+$/ ) {
+ $count = $s;
+ $once = $s;
+ }
+ }
+ if ( $input[$n] =~ /^$/ ) {
+ $h1 = 0;
+ }
+ elsif ( $input[$n] =~ /^\.nf/ ) {
+ $descs{ $major[$m] } .= "<pre>" . "\n";
+ $nf = $count;
+ }
+ elsif ( $input[$n] =~ /^\.fi/ ) {
+ $descs{ $major[$m] } .= "</pre>" . "\n";
+ $nf = 0;
+ }
+ elsif ( $input[$n] =~ /^\.ex/ ) {
+ $ex = $once;
+ $descs{ $major[$m] } .=
+ "<h3><em>Example"
+ . ( $ex > 1 ? "s" : "" )
+ . ":</em></h3>\n" . "\n";
+ }
+ elsif ( $input[$n] =~ /^\s*#/ ) {
+ $c = $input[$n];
+ $c =~ s/^\s*#\s*//;
+ $descs{ $major[$m] } .= $c . "\n";
+ }
+ }
+ if ( $m >= 0 && $input[$n] =~ /^\.h2\s/ ) {
+ $c = $input[$n];
+ $c =~ s/^.h2\s*//;
+ $index{ $major[$m] } .= $c . "\n"
+ if ( defined $opt_a || ok($c) );
+ $h1 = 0;
+ }
+ if ( $nf != 0 && $nf-- == 0 ) {
+ $descs{ $major[$m] } .= "</pre>\n";
+ }
+ }
+ @major = sort @major;
+ for $n ( 0 .. $#major ) {
+ $cats{ $major[$n] } = sprintf( "header%03d", $n );
+ printf FP "<li><a href=\"#%s\">%s</a>\n", $cats{ $major[$n] },
+ $major[$n];
+ }
+ printf FP "</ul>\n";
+ for $n ( 0 .. $#major ) {
+ printf FP "\n";
+ printf FP "<h2><a name=\"%s\">%s</a></h2>\n", $cats{ $major[$n] },
+ $major[$n];
+ if ( $descs{ $major[$n] } !~ /^$/ ) {
+ printf FP "<h3>Description</h3>\n<p>%s\n", $descs{ $major[$n] };
+ }
+ $c = $index{ $major[$n] };
+ if ( $c ne "" ) {
+ my @c = split( /\n/, $c );
+ @c = sort @c;
+ printf FP
+ "<p>Here is a list of settings that belong to this category\n";
+ printf FP "<ul>\n";
+ for $m ( 0 .. $#c ) {
+ my $avail = ok( $c[$m] );
+ my $mark = ( !$avail && defined $opt_m ) ? "*" : "";
+ printf FP "<li><a href=\"body.html#%s\">%s</a>\n", $c[$m],
+ $c[$m] . $mark;
+ }
+ printf FP "</ul>\n";
+ }
+ }
+ my $str = <<'EOF'
+<p>
+<a href=alphatoc.html>To list of settings by name</a>
+EOF
+ . (
+ defined $opt_a && defined $opt_m
+ ? "<p>Support for all settings suffixed with '*' was disabled at compile time."
+ : ""
+ )
+ . <<'EOF'
+</body>
+</html>
+EOF
+ ;
+ print FP $str;
+ close(FP);
+ return @cats;
+}
diff --git a/scripts/cfg_defs.sh b/scripts/cfg_defs.sh
new file mode 100755
index 0000000..560dfc4
--- /dev/null
+++ b/scripts/cfg_defs.sh
@@ -0,0 +1,51 @@
+#!/bin/sh
+# $LynxId: cfg_defs.sh,v 1.2 2021/01/07 00:38:05 tom Exp $
+# Translate the lynx_cfg.h and config.cache data into a table, useful for
+# display at runtime.
+
+TOP="${1-.}"
+OUT=cfg_defs.h
+
+# just in case we want to run this outside the makefile
+: "${SHELL:=/bin/sh}"
+
+{
+cat <<EOF
+#ifndef CFG_DEFS_H
+#define CFG_DEFS_H 1
+
+static const struct {
+ const char *name;
+ const char *value;
+} config_cache[] = {
+EOF
+
+sed \
+ -e '/^#/d' \
+ -e 's/^.[^=]*_cv_//' \
+ -e 's/=\${.*=/=/' \
+ -e 's/}$//' \
+ config.cache | $SHELL "$TOP/scripts/cfg_edit.sh"
+
+cat <<EOF
+};
+
+static const struct {
+ const char *name;
+ const char *value;
+} config_defines[] = {
+EOF
+${FGREP-fgrep} '#define' lynx_cfg.h |
+sed -e 's@ @ @g' \
+ -e 's@ @ @g' \
+ -e 's@^[ ]*#define[ ]*@@' \
+ -e 's@[ ]*/\*.*\*/@@' \
+ -e 's@[ ][ ]*@=@' \
+ | $SHELL "$TOP/scripts/cfg_edit.sh"
+
+cat <<EOF
+};
+
+#endif /* CFG_DEFS_H */
+EOF
+} >$OUT
diff --git a/scripts/cfg_edit.sh b/scripts/cfg_edit.sh
new file mode 100755
index 0000000..99f00be
--- /dev/null
+++ b/scripts/cfg_edit.sh
@@ -0,0 +1,17 @@
+#!/bin/sh
+# Invoked from cfg_defs.sh as a filter
+# Strip leading and trailing whitespace
+# Escape any iternal '\'
+# Escape any iternal '"'
+# Entify any iternal '&', '<' or '>'
+# Append a '=' if none present'
+# Break into two strings at '='
+# Prefix ' { "' and suffix '" },'
+LC_ALL=C sort |
+sed -e 's!^[ ]*!!' -e 's![ ]*$!!' \
+ -e 's!\\!\\\\!g' \
+ -e 's!"!\\"!g' \
+ -e 's!&!\&amp;!g' -e 's!<!\&lt;!g' -e 's!>!\&gt;!g' \
+ -e 's!^[^=]*$!&=!' \
+ -e 's!=!", "!' \
+ -e 's!^! { "!' -e 's!$!" },!'
diff --git a/scripts/cfg_path.sh b/scripts/cfg_path.sh
new file mode 100755
index 0000000..321f5b9
--- /dev/null
+++ b/scripts/cfg_path.sh
@@ -0,0 +1,5 @@
+#!/bin/sh
+# Use this script for substituting the configured path into lynx.cfg -
+# not all paths begin with a slash.
+SECOND=`echo "$2" | sed -e 's,^/,,'`
+sed -e "/^[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_]*:file:/s,/PATH_TO/$1,/$SECOND,"
diff --git a/scripts/collapse-br b/scripts/collapse-br
new file mode 100755
index 0000000..a3378b5
--- /dev/null
+++ b/scripts/collapse-br
@@ -0,0 +1,162 @@
+#!/usr/bin/env perl
+# $LynxId: collapse-br,v 1.8 2017/07/04 19:35:45 tom Exp $
+# Generate a series of HTML files containing a mixture of text and <br> tags,
+# comparing dumps of those to w3m and elinks.
+
+use warnings;
+use strict;
+use diagnostics;
+
+$| = 1;
+
+use Getopt::Std;
+use File::Temp qw/ tempdir /;
+
+our ( $opt_C, $opt_T, $opt_e, $opt_l, $opt_p, $opt_t, $opt_w );
+our $tempdir = tempdir( CLEANUP => 1 );
+
+sub dumpit($$) {
+ my $prog = shift;
+ my $html = shift;
+ my $opts = "-dump";
+ $html =
+ "<html>"
+ . "<head><title>T</title></head>"
+ . "<body>$html</body>"
+ . "</html>"
+ if ($opt_t);
+ my @result;
+ if ( $prog =~ /lynx$/ ) {
+ my $name = "$tempdir/lynx.cfg";
+ $opts .= " -cfg=$name";
+ open my $fh, ">$name";
+ printf $fh "collapse_br_tags:%s\n", $opt_C ? "false" : "true";
+ printf $fh "trim_blank_lines:%s\n", $opt_T ? "false" : "true";
+ close $fh;
+ }
+ if ($opt_p) {
+ $opts .= " -stdin" if ( $prog =~ /lynx$/ );
+ $opts .= " -force-html" if ( $prog =~ /elinks$/ );
+ $opts .= " -T text/html" if ( $prog =~ /w3m$/ );
+ if ( open my $fh, "echo '$html' | $prog $opts |" ) {
+ @result = <$fh>;
+ close $fh;
+ }
+ }
+ else {
+ my $name = "$tempdir/foobar.html";
+ open my $fh, ">$name";
+ printf $fh "%s", $html;
+ close $fh;
+
+ $opts .= " $name";
+ if ( open my $fh, "$prog $opts |" ) {
+ @result = <$fh>;
+ close $fh;
+ }
+ }
+ for my $n ( 0 .. $#result ) {
+ chomp $result[$n];
+ }
+
+ if ( open my $fh, "echo '$html' | $prog $opts |" ) {
+ @result = <$fh>;
+ close $fh;
+ for my $n ( 0 .. $#result ) {
+ chomp $result[$n];
+ }
+ }
+ $result[0] = "OOPS" unless ( $#result >= 0 );
+ return @result;
+}
+
+sub header($) {
+ my @cols = @{ $_[0] };
+ my $text = "";
+ for my $c ( 0 .. $#cols ) {
+ $text .= sprintf "%-8s", $cols[$c];
+ }
+ printf "\t %s\n", $text;
+}
+
+sub doit() {
+ my $length = 1;
+ my $state = -1;
+
+ my @tokens;
+ $tokens[0] = " ";
+ $tokens[1] = "X";
+ $tokens[2] = "<br>";
+ my $tokens = $#tokens + 1;
+
+ my @progs;
+ $progs[ $#progs + 1 ] = "lynx";
+
+ $progs[ $#progs + 1 ] = "w3m" if ($opt_w);
+ $progs[ $#progs + 1 ] = "elinks" if ($opt_e);
+ $progs[ $#progs + 1 ] = "./lynx" if ( -f "./lynx" );
+
+ while ( $length <= $opt_l ) {
+ my $bits = "";
+ my $html = "";
+ my $value = ++$state;
+ $length = 0;
+ while ( $value >= 0 ) {
+ my $digit = $value % $tokens;
+ my $update = ( $value - $digit ) / $tokens;
+ last if ( ( $update <= 0 ) and ( $value <= 0 ) and $length > 0 );
+ $bits .= sprintf "%d", $digit;
+ $length++;
+ $html .= $tokens[$digit];
+ $value = $update;
+ }
+
+ # skip the non-interesting cases
+ next if ( $bits =~ /00/ );
+ next if ( $bits =~ /11/ );
+ next unless ( $bits =~ /2/ );
+ printf "%-*s '%s'\n", $opt_l, $bits, $html;
+ my @listing;
+ for my $p ( 0 .. $#progs ) {
+ my @q = &dumpit( $progs[$p], $html );
+ my $l = $p * 8;
+ for my $r ( 0 .. $#q ) {
+
+ $listing[$r] = "" unless ( $listing[$r] );
+ $listing[$r] = sprintf "%-*s", $l, $listing[$r] if ( $l > 0 );
+ $listing[$r] .= sprintf "|%s",
+ substr( $q[$r] . "........", 0, 7 );
+ }
+ }
+ &header( \@progs );
+ for my $r ( 0 .. $#listing ) {
+ printf "\t%2d %s|\n", $r, $listing[$r];
+ }
+ }
+}
+
+sub main::HELP_MESSAGE() {
+ printf STDERR <<EOF
+Usage: $0 [options]
+
+Options:
+ -C do not collapse BR-tags (lynx only)
+ -T do not trim blank lines (lynx only)
+ -e compare with elinks
+ -l NUM generate test-cases up to this length (default: 3)
+ -p pipe HTML to the program rather than reading a file
+ -t add dummy title
+ -w compare with w3m
+
+EOF
+ ;
+ exit;
+}
+
+&getopts('CTel:ptw') || main::HELP_MESSAGE;
+
+$opt_l = 3 unless ($opt_l);
+
+&doit;
+
+1;
diff --git a/scripts/conf.mingw.sh b/scripts/conf.mingw.sh
new file mode 100755
index 0000000..3828a98
--- /dev/null
+++ b/scripts/conf.mingw.sh
@@ -0,0 +1,38 @@
+#!/bin/bash.exe
+# $LynxId: conf.mingw.sh,v 1.2 2014/02/13 13:30:54 tom Exp $
+
+LYNX_DEV=d
+LYNX_TOP=/cygwin/mingw/lynx2.8.7dev.13
+LYNX_ETC=$LYNX_TOP/lynx-conf
+
+LDFLAGS="-mno-cygwin -static -L/mingw/lib" \
+LIBS="-lwsock32 -lgdi32 -lmsvcrt -liconv" \
+CFLAGS="-mno-cygwin -I/mingw/include -I/mingw/include/openssl -W -Wall -O3 -D_WINDOWS -DSH_EX -DWIN_EX -DNOUSERS -DNOSIGHUP -DDOSPATH -DUSE_ALT_BLAT_MAILER -DBOXHORI=0 -DBOXVERT=0" \
+CPPFLAGS="-mno-cygwin -I/mingw/include -I/mingw/include/openssl" \
+./configure --prefix=/$LYNX_DEV$LYNX_ETC \
+--host=mingw32 \
+--disable-dired-override \
+--disable-full-paths \
+--enable-addrlist-page \
+--enable-change-exec \
+--enable-charset-choice \
+--enable-default-colors \
+--enable-exec-links \
+--enable-externs \
+--enable-file-upload \
+--enable-gzip-help \
+--enable-nested-tables \
+--enable-nls \
+--enable-vertrace \
+--includedir=/mingw/include \
+--sysconfdir=/$LYNX_DEV$LYNX_ETC \
+--datadir=/$LYNX_DEV$LYNX_ETC \
+--with-bzlib \
+--with-cfg-file=$LYNX_DEV:$LYNX_ETC/lynx.cfg \
+--with-lss-file=$LYNX_DEV:$LYNX_ETC/lynx.lss \
+--with-mime-libdir=c:/ \
+--with-nls-datadir=d:/cygwin/mingw/share \
+--with-pkg-config=no \
+--with-screen=curses \
+--with-ssl=/mingw/lib \
+--with-zlib
diff --git a/scripts/config.djgpp.sh b/scripts/config.djgpp.sh
new file mode 100755
index 0000000..fa4dcfe
--- /dev/null
+++ b/scripts/config.djgpp.sh
@@ -0,0 +1,24 @@
+#!/bin/sh
+CFLAGS="-g -gcoff -O2 -W -Wall -I/dev/env/DJDIR/pdcur_cvs/PDCurses -I/dev/env/DJDIR/watt32/inc" \
+CPPFLAGS="-DBOXHORI=0 -DBOXVERT=0 -I/dev/env/DJDIR/pdcur_cvs/PDCurses -I/dev/env/DJDIR/watt32/inc" \
+LIBS="-L/dev/env/DJDIR/pdcur_cvs/PDCurses/lib -L/dev/env/DJDIR/watt32/lib -lwmemu" \
+/dev/env/DJDIR/bin/bash.exe ./configure \
+--datadir=/dev/env/DJDIR/lib \
+--sysconfdir=/dev/env/DJDIR/lib \
+--disable-dired-override \
+--disable-full-paths \
+--enable-addrlist-page \
+--enable-change-exec \
+--enable-cgi-links \
+--enable-charset-choice \
+--enable-exec-links \
+--enable-externs \
+--enable-nested-tables \
+--enable-nls \
+--enable-scrollbar \
+--enable-vertrace \
+--with-bzlib \
+--with-mime-libdir=/dev/env/DJDIR/lib \
+--with-screen=curses \
+--with-ssl \
+--with-zlib
diff --git a/scripts/fixtext.sh b/scripts/fixtext.sh
new file mode 100755
index 0000000..a6f53b6
--- /dev/null
+++ b/scripts/fixtext.sh
@@ -0,0 +1,11 @@
+#!/bin/sh
+# $LynxId: fixtext.sh,v 1.2 2021/01/07 00:21:03 tom Exp $
+
+# xgettext only processes literal strings. Someone with a poor sense of humor
+# decided to ignore strings in preprocessor lines. So we construct a fake
+# ".c" file with the definitions turned into literals.
+
+sed -e 's/")/");/' \
+ -e 's/^#define[ ]*\([^ ]*\)[ ]*gettext/char *\1 = gettext/' \
+ -e 's,^#define[ ]*\([^ ]*\)[ ]*\\,/* #define \1 */char *\1 = \\,' \
+ "$@"
diff --git a/scripts/indent.sh b/scripts/indent.sh
new file mode 100755
index 0000000..8933084
--- /dev/null
+++ b/scripts/indent.sh
@@ -0,0 +1,153 @@
+#!/bin/sh
+# $LynxId: indent.sh,v 1.6 2021/01/07 00:23:01 tom Exp $
+# Indent LYNX files (for reference). See "lnx-indent" from
+# https://invisible-island.net/cindent/
+NOOP=no
+OPTS='
+--blank-lines-after-declarations
+--blank-lines-after-procedures
+--braces-on-if-line
+--continue-at-parentheses
+--cuddle-else
+--dont-break-procedure-type
+--indent-level4
+--leave-preprocessor-space
+--line-length80
+--no-space-after-function-call-names
+--parameter-indentation4
+--space-after-cast
+--space-special-semicolon
+--swallow-optional-blank-lines
+-T AddressDefList
+-T BOOL
+-T BOOLEAN
+-T CSOfield_info
+-T DIR
+-T DocAddress
+-T DocInfo
+-T DocObj
+-T EntryInfo
+-T EditFieldData
+-T FILE
+-T GCC_NORETURN
+-T GCC_UNUSED
+-T GLOBALREF
+-T GroupDef
+-T GroupDefList
+-T HTAAFailReasonType
+-T HTAAProt
+-T HTAARealm
+-T HTAAServer
+-T HTAssoc
+-T HTAssocList
+-T HTAtom
+-T HTBTElement
+-T HTBTree
+-T HTChildAnchor
+-T HTChunk
+-T HTConverter
+-T HTFormat
+-T HTLine
+-T HTLinkType
+-T HTList
+-T HTParentAnchor
+-T HTParentAnchor0
+-T HTPresentation
+-T HTStream
+-T HTStyle
+-T HTStyleChange
+-T HTStyleSheet
+-T HText
+-T HyperDoc
+-T InitResponseAPDU
+-T Item
+-T ItemList
+-T LYNX_ADDRINFO
+-T LYNX_HOSTENT
+-T LYUCcharset
+-T LexItem
+-T ProgramPaths
+-T STable_cellinfo
+-T STable_info
+-T STable_rowinfo
+-T STable_states
+-T SearchAPDU
+-T SearchResponseAPDU
+-T TextAnchor
+-T UCode_t
+-T UserDefList
+-T WAISDocumentCodes
+-T WAISDocumentHeader
+-T WAISDocumentHeadlines
+-T WAISDocumentLongHeader
+-T WAISDocumentShortHeader
+-T WAISDocumentText
+-T WAISInitResponse
+-T WAISSearch
+-T _cdecl
+-T any
+-T bit_map
+-T boolean
+-T bstring
+-T data_tag
+-T eServerType
+-T lynx_list_item_type
+-T pdu_type
+-T query_term
+-nbacc
+'
+for name in "$@"
+do
+ case $name in
+ -n) NOOP=yes
+ OPTS="$OPTS -v"
+ ;;
+ -*)
+ OPTS="$OPTS $name"
+ ;;
+ *.[ch])
+ save="${name}".a$$
+ test="${name}".b$$
+ rm -f "$save" "$test"
+ mv "$name" "$save"
+ sed \
+ -e '/MODULE_ID(/s/)$/);/' \
+ -e 's,)[ ]*\<GCC_PRINTFLIKE,);//GCC_PRINTFLIKE,' \
+ -e 's,[ ]*\<GCC_NORETURN;,;//GCC_NORETURN;,' \
+ -e 's,[ ]*\<GCC_UNUSED;,;//GCC_UNUSED;,' \
+ "$save" >"$test"
+ cp "$test" "$name"
+ chmod u+w "$name"
+ ${INDENT_PROG-indent} -npro $OPTS "$name"
+ sed \
+ -e '/MODULE_ID(/s/);$/)/' \
+ -e 's,;[ ]*//GCC_UNUSED;, GCC_UNUSED;,' \
+ -e 's,;[ ]*//GCC_NORETURN;, GCC_NORETURN;,' \
+ -e 's,);[ ]*//GCC_PRINTFLIKE,) GCC_PRINTFLIKE,' \
+ "$name" >"$test"
+ mv "$test" "$name"
+ rm -f "${name}~"
+ if test $NOOP = yes ; then
+ if ! ( cmp -s "$name" "$save" )
+ then
+ diff -u "$save" "$name"
+ fi
+ mv "$save" "$name"
+ rm -f "${name}~"
+ else
+ if ( cmp -s "$name" "$save" )
+ then
+ echo "** unchanged $name"
+ rm -f "${name}" "${name}~"
+ mv "$save" "$name"
+ else
+ echo "** updated $name"
+ rm -f "$save"
+ fi
+ fi
+ ;;
+ *)
+ echo "** ignored: $name"
+ ;;
+ esac
+done
diff --git a/scripts/install-cfg.sh b/scripts/install-cfg.sh
new file mode 100755
index 0000000..6faa21a
--- /dev/null
+++ b/scripts/install-cfg.sh
@@ -0,0 +1,89 @@
+#!/bin/sh
+# $LynxId: install-cfg.sh,v 1.5 2021/01/07 00:31:20 tom Exp $
+# install lynx.cfg, ensuring the old config-file is saved to a unique file,
+# and prepending customizations to the newly-installed file.
+#
+# $1 = install program
+# $2 = file to install
+# $3 = where to install it
+PRG="$1"
+SRC=$2
+DST=$3
+
+LANG=C; export LANG
+LC_ALL=C; export LC_ALL
+LC_CTYPE=C; export LC_CTYPE
+LANGUAGE=C; export LANGUAGE
+
+if test -f "$DST" ; then
+ echo "** checking if you have customized $DST"
+ OLD=lynx-cfg.old
+ NEW=lynx-cfg.new
+ TST=lynx-cfg.tst
+ TMP=lynx-cfg.tmp
+ trap 'rm -f $OLD $NEW $TST $TMP; exit 9' INT QUIT TERM HUP
+ rm -f $OLD $NEW $TST $TMP
+
+ # avoid propagating obsolete URLs into new installs
+ {
+ echo lynx.isc.org;
+ echo lynx.browser.org;
+ echo www.trill-home.com;
+ echo www.cc.ukans.edu;
+ echo www.ukans.edu;
+ echo www.slcc.edu;
+ echo sol.slcc.edu;
+ }>$TMP
+
+ # Make a list of the settings which are in the original lynx.cfg
+ # Do not keep the user's HELPFILE setting since we modify that in
+ # a different makefile rule.
+ ${EGREP-egrep} '^[ ]*[A-Za-z]' "$SRC" |sed -e 's/^[ ]*HELPFILE:.*/HELPFILE:/' >>$TMP
+ ${EGREP-egrep} '^[ ]*[A-Za-z]' "$SRC" |${FGREP-fgrep} -v -f $TMP >$OLD
+ ${EGREP-egrep} '^[ ]*[A-Za-z]' "$DST" |${FGREP-fgrep} -v -f $TMP >$TST
+
+ if test -s $TST ; then
+ cat >$TMP <<EOF
+## The following lines were saved from your previous configuration.
+
+EOF
+ cat "$TST" >>$TMP
+ cat "$SRC" >$NEW
+ cat "$TMP" >>$NEW
+
+ # See if we have saved this information before (ignoring the
+ # HELPFILE line).
+ if cmp -s $NEW $OLD
+ then
+ echo "... installed $DST would not be changed"
+ else
+ NUM=1
+ while test -f "${DST}-${NUM}"
+ do
+ if cmp -s "$NEW" "${DST}-${NUM}"
+ then
+ break
+ fi
+ NUM=`expr "$NUM" + 1`
+ done
+ if test ! -f "${DST}-${NUM}"
+ then
+ echo "... saving old config as ${DST}-${NUM}"
+ mv "$DST" "${DST}-${NUM}" || exit 1
+ fi
+ echo "** installing $NEW as $DST"
+ eval "$PRG" "$NEW" "$DST" || exit 1
+ fi
+ else
+ echo "... no customizations found"
+ echo "** installing $SRC as $DST"
+ eval "$PRG" "$SRC" "$DST" || exit 1
+ fi
+ rm -f "$SKIP" "$OLD" "$NEW" "$TST" "$TMP"
+elif cmp -s "$SRC" "$DST"
+then
+ echo "... installed $DST would not be changed"
+else
+ echo "** installing $SRC as $DST"
+ eval "$PRG" "$SRC" "$DST" || exit 1
+fi
diff --git a/scripts/install-lss.sh b/scripts/install-lss.sh
new file mode 100755
index 0000000..eb9694a
--- /dev/null
+++ b/scripts/install-lss.sh
@@ -0,0 +1,38 @@
+#!/bin/sh
+# $LynxId: install-lss.sh,v 1.2 2021/01/07 00:32:39 tom Exp $
+# install lynx.lss, ensuring the old config-file is saved to a backup file.
+#
+# $1 = install program
+# $2 = file to install
+# $3 = where to install it
+PRG="$1"
+SRC=$2
+DST=$3
+
+if test -f "$DST" ; then
+ # See if we have saved this information before
+ if cmp -s "$SRC" "$DST"
+ then
+ echo "... installed $DST would not be changed"
+ else
+ NUM=1
+ while test -f "${DST}-${NUM}"
+ do
+ if cmp -s "$SRC" "${DST}-${NUM}"
+ then
+ break
+ fi
+ NUM=`expr "$NUM" + 1`
+ done
+ if test ! -f "${DST}-${NUM}"
+ then
+ echo "... saving old config as ${DST}-${NUM}"
+ mv "$DST" "${DST}-${NUM}" || exit 1
+ fi
+ echo "** installing $SRC as $DST"
+ eval "$PRG" "$SRC" "$DST" || exit 1
+ fi
+else
+ echo "** installing $SRC as $DST"
+ eval "$PRG" "$SRC" "$DST" || exit 1
+fi
diff --git a/scripts/man2hlp.sh b/scripts/man2hlp.sh
new file mode 100755
index 0000000..cc1653c
--- /dev/null
+++ b/scripts/man2hlp.sh
@@ -0,0 +1,22 @@
+#!/bin/sh
+# $LynxId: man2hlp.sh,v 1.4 2021/01/07 00:34:48 tom Exp $
+# This script uses rman (Rosetta Man), which complements TkMan, to strip
+# nroff headers from a manpage file, and format the result into a VMS help
+# file.
+
+LANG=C; export LANG
+LC_ALL=C; export LC_ALL
+LC_CTYPE=C; export LC_CTYPE
+LANGUAGE=C; export LANGUAGE
+
+for name in "$@"
+do
+ NAME=`echo "$name" |sed -e 's/\.man$/.1/'`
+ (echo 1 "`echo \"$NAME\" | sed -e 's/^.*\///' -e 's/\..*$//' | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`" ; \
+ (echo '.hy 0'; cat "$name") |\
+ nroff -Tascii -man |\
+ rman -n"$NAME" |\
+ sed -e 's/^[1-9].*$//' \
+ -e 's/^\([A-Z]\)/2 \1/' |\
+ uniq)
+done
diff --git a/scripts/tbl2html.pl b/scripts/tbl2html.pl
new file mode 100755
index 0000000..ba8ae09
--- /dev/null
+++ b/scripts/tbl2html.pl
@@ -0,0 +1,364 @@
+#!/usr/bin/perl -w
+# $LynxId: tbl2html.pl,v 1.5 2011/05/21 15:18:16 tom Exp $
+#
+# Translate one or more ".tbl" files into ".html" files which can be used to
+# test the charset support in lynx. Each of the ".html" files will use the
+# charset that corresponds to the input ".tbl" file.
+
+use strict;
+
+use Getopt::Std;
+use File::Basename;
+use POSIX qw(strtod);
+
+sub field($$) {
+ my $value = $_[0];
+ my $count = $_[1];
+
+ while ( $count > 0 ) {
+ $count -= 1;
+ $value =~ s/^\S*\s*//;
+ }
+ $value =~ s/\s.*//;
+ return $value;
+}
+
+sub notes($) {
+ my $value = $_[0];
+
+ $value =~ s/^[^#]*//;
+ $value =~ s/^#//;
+ $value =~ s/^\s+//;
+
+ return $value;
+}
+
+sub make_header($$$) {
+ my $source = $_[0];
+ my $charset = $_[1];
+ my $official = $_[2];
+
+ printf FP "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n";
+ printf FP "<HTML>\n";
+ printf FP "<HEAD>\n";
+ printf FP "<!-- $source -->\n";
+ printf FP "<TITLE>%s table</TITLE>\n", &escaped($official);
+ printf FP "<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=%s\">\n", &escaped($charset);
+ printf FP "</HEAD>\n";
+ printf FP "\n";
+ printf FP "<BODY> \n";
+ printf FP "\n";
+ printf FP "<H1 ALIGN=center>%s table</H1> \n", &escaped($charset);
+ printf FP "\n";
+ printf FP "<PRE>\n";
+ printf FP "Code Char Entity Render Description\n";
+}
+
+sub make_mark() {
+ printf FP "---- ---- ------ ------ -----------------------------------\n";
+}
+
+sub escaped($) {
+ my $result = $_[0];
+ $result =~ s/&/&amp;/g;
+ $result =~ s/</&lt;/g;
+ $result =~ s/>/&gt;/g;
+ return $result;
+}
+
+sub make_row($$$) {
+ my $old_code = $_[0];
+ my $new_code = $_[1];
+ my $comments = $_[2];
+
+ # printf "# make_row %d %d %s\n", $old_code, $new_code, $comments;
+ my $visible = sprintf("&amp;#%d; ", $new_code);
+ if ($old_code < 256) {
+ printf FP "%4x %c %.13s &#%d; %s\n",
+ $old_code, $old_code,
+ $visible, $new_code,
+ &escaped($comments);
+ } else {
+ printf FP "%4x . %.13s &#%d; %s\n",
+ $old_code,
+ $visible, $new_code,
+ &escaped($comments);
+ }
+}
+
+sub null_row($$) {
+ my $old_code = $_[0];
+ my $comments = $_[1];
+
+ if ($old_code < 256) {
+ printf FP "%4x %c %s\n",
+ $old_code, $old_code,
+ &escaped($comments);
+ } else {
+ printf FP "%4x . %s\n",
+ $old_code,
+ &escaped($comments);
+ }
+}
+
+sub make_footer() {
+ printf FP "</PRE>\n";
+ printf FP "</BODY>\n";
+ printf FP "</HTML>\n";
+}
+
+# return true if the string describes a range
+sub is_range($) {
+ return ($_[0] =~ /.*-.*/);
+}
+
+# convert the U+'s to 0x's so strtod() can convert them.
+sub zeroxes($) {
+ my $result = $_[0];
+ $result =~ s/^U\+/0x/;
+ $result =~ s/-U\+/-0x/;
+ return $result;
+}
+
+# convert a string to a number (-1's are outside the range of Unicode).
+sub value_of($) {
+ my ($result, $oops) = strtod($_[0]);
+ $result = -1 if ($oops ne 0);
+ return $result;
+}
+
+# return the first number in a range
+sub first_of($) {
+ my $range = &zeroxes($_[0]);
+ $range =~ s/-.*//;
+ return &value_of($range);
+}
+
+# return the last number in a range
+sub last_of($) {
+ my $range = &zeroxes($_[0]);
+ $range =~ s/^.*-//;
+ return &value_of($range);
+}
+
+sub one_many($$$) {
+ my $oldcode = $_[0];
+ my $newcode = &zeroxes($_[1]);
+ my $comment = $_[2];
+
+ my $old_code = &value_of($oldcode);
+ if ( $old_code lt 0 ) {
+ printf "? Problem with number \"%s\"\n", $oldcode;
+ } else {
+ &make_mark if (( $old_code % 8 ) == 0 );
+
+ if ( $newcode =~ /^#.*/ ) {
+ &null_row($old_code, $comment);
+ } elsif ( &is_range($newcode) ) {
+ my $first_item = &first_of($newcode);
+ my $last_item = &last_of($newcode);
+ my $item;
+
+ if ( $first_item lt 0 or $last_item lt 0 ) {
+ printf "? Problem with one:many numbers \"%s\"\n", $newcode;
+ } else {
+ if ( $comment =~ /^$/ ) {
+ $comment = sprintf("mapped: %#x to %#x..%#x", $old_code, $first_item, $last_item);
+ } else {
+ $comment = $comment . " (range)";
+ }
+ for $item ( $first_item..$last_item) {
+ &make_row($old_code, $item, $comment);
+ }
+ }
+ } else {
+ my $new_code = &value_of($newcode);
+ if ( $new_code lt 0 ) {
+ printf "? Problem with number \"%s\"\n", $newcode;
+ } else {
+ if ( $comment =~ /^$/ ) {
+ $comment = sprintf("mapped: %#x to %#x", $old_code, $new_code);
+ }
+ &make_row($old_code, $new_code, $comment);
+ }
+ }
+ }
+}
+
+sub many_many($$$) {
+ my $oldcode = $_[0];
+ my $newcode = $_[1];
+ my $comment = $_[2];
+
+ my $first_old = &first_of($oldcode);
+ my $last_old = &last_of($oldcode);
+ my $item;
+
+ if (&is_range($newcode)) {
+ my $first_new = &first_of($newcode);
+ my $last_new = &last_of($newcode);
+ for $item ( $first_old..$last_old) {
+ &one_many($item, $first_new, $comment);
+ $first_new += 1;
+ }
+ } else {
+ for $item ( $first_old..$last_old) {
+ &one_many($item, $newcode, $comment);
+ }
+ }
+}
+
+sub approximate($$$) {
+ my $values = $_[0];
+ my $expect = sprintf("%-8s", $_[1]);
+ my $comment = $_[2];
+ my $escaped = &escaped($expect);
+ my $left;
+ my $this;
+ my $next;
+
+ $escaped =~ s/\\134/\\/g;
+ $escaped =~ s/\\015/\&#13\;/g;
+ $escaped =~ s/\\012/\&#10\;/g;
+
+ while ( $escaped =~ /^.*\\[0-7]{3}.*$/ ) {
+ $left = $escaped;
+ $left =~ s/\\[0-7]{3}.*//;
+ $this = substr $escaped,length($left)+1,3;
+ $next = substr $escaped,length($left)+4;
+ $escaped = sprintf("%s&#%d;%s", $left, oct $this, $next);
+ }
+
+ my $visible = sprintf("&amp;#%d; ", $values);
+ if ($values < 256) {
+ printf FP "%4x %c %.13s &#%d; approx: %s\n",
+ $values, $values,
+ $visible,
+ $values,
+ $escaped;
+ } else {
+ printf FP "%4x . %.13s &#%d; approx: %s\n",
+ $values,
+ $visible,
+ $values,
+ $escaped;
+ }
+}
+
+sub doit($) {
+ my $source = $_[0];
+
+ printf "** %s\n", $source;
+
+ my $target = basename($source, ".tbl");
+
+ # Read the file into an array in memory.
+ open(FP,$source) || do {
+ print STDERR "Can't open input $source: $!\n";
+ return;
+ };
+ my (@input) = <FP>;
+ chomp @input;
+ close(FP);
+
+ my $n;
+ my $charset = "";
+ my $official = "";
+ my $empty = 1;
+
+ for $n (0..$#input) {
+ $input[$n] =~ s/\s*$//; # trim trailing blanks
+ $input[$n] =~ s/^\s*//; # trim leading blanks
+ $input[$n] =~ s/^#0x/0x/; # uncomment redundant stuff
+
+ next if $input[$n] =~ /^$/;
+ next if $input[$n] =~ /^#.*$/;
+
+ if ( $empty
+ and ( $input[$n] =~ /^\d/
+ or $input[$n] =~ /^U\+/ ) ) {
+ $target = $charset . ".html";
+ printf "=> %s\n", $target;
+ open(FP,">$target") || do {
+ print STDERR "Can't open output $target: $!\n";
+ return;
+ };
+ &make_header($source, $charset, $official);
+ $empty = 0;
+ }
+
+ if ( $input[$n] =~ /^M.*/ ) {
+ $charset = $input[$n];
+ $charset =~ s/^.//;
+ } elsif ( $input[$n] =~ /^O.*/ ) {
+ $official = $input[$n];
+ $official =~ s/^.//;
+ } elsif ( $input[$n] =~ /^\d/ ) {
+
+ my $newcode = &field($input[$n], 1);
+
+ next if ( $newcode eq "idem" );
+ next if ( $newcode eq "" );
+
+ my $oldcode = &field($input[$n], 0);
+ if ( &is_range($oldcode) ) {
+ &many_many($oldcode, $newcode, &notes($input[$n]));
+ } else {
+ &one_many($oldcode, $newcode, &notes($input[$n]));
+ }
+ } elsif ( $input[$n] =~ /^U\+/ ) {
+ if ( $input[$n] =~ /^U\+\w+:/ ) {
+ my $values = $input[$n];
+ my $expect = $input[$n];
+
+ $values =~ s/:.*//;
+ $values = &zeroxes($values);
+ $expect =~ s/^[^:]+://;
+
+ if ( &is_range($values) ) {
+ printf "fixme:%s(%s)(%s)\n", $input[$n], $values, $expect;
+ } else {
+ &approximate(&value_of($values), $expect, &notes($input[$n]));
+ }
+ } else {
+ my $value = $input[$n];
+ $value =~ s/\s*".*//;
+ $value = &value_of(&zeroxes($value));
+ if ($value gt 0) {
+ my $quote = $input[$n];
+ my $comment = &notes($input[$n]);
+ $quote =~ s/^[^"]*"//;
+ $quote =~ s/".*//;
+ &approximate($value, $quote, $comment);
+ } else {
+ printf "fixme:%d(%s)\n", $n, $input[$n];
+ }
+ }
+ } else {
+ # printf "skipping line %d:%s\n", $n + 1, $input[$n];
+ }
+ }
+ if ( ! $empty ) {
+ &make_footer();
+ }
+ close FP;
+}
+
+sub usage() {
+ print <<USAGE;
+Usage: $0 [tbl-files]
+
+The script writes a new ".html" file for each input, using
+the same name as the input, stripping the ".tbl" suffix.
+USAGE
+ exit(1);
+}
+
+if ( $#ARGV < 0 ) {
+ usage();
+} else {
+ while ( $#ARGV >= 0 ) {
+ &doit ( shift @ARGV );
+ }
+}
+exit (0);
diff --git a/src/AttrList.h b/src/AttrList.h
new file mode 100644
index 0000000..cf38261
--- /dev/null
+++ b/src/AttrList.h
@@ -0,0 +1,62 @@
+/*
+ * $LynxId: AttrList.h,v 1.17 2013/05/03 20:54:09 tom Exp $
+ */
+#if !defined(__ATTRLIST_H)
+#define __ATTRLIST_H
+
+#include <HText.h>
+#include <HTMLDTD.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ enum {
+ ABS_OFF = 0,
+ STACK_OFF = 0,
+ STACK_ON,
+ ABS_ON
+ };
+
+#define STARTAT 8
+
+ enum {
+ DSTYLE_LINK = HTML_A + STARTAT,
+ DSTYLE_STATUS = HTML_ELEMENTS + STARTAT,
+ DSTYLE_ALINK, /* active link */
+ DSTYLE_NORMAL, /* default attributes */
+ DSTYLE_OPTION, /* option on the option screen */
+ DSTYLE_VALUE, /* value on the option screen */
+ DSTYLE_CANDY, /* possibly going to vanish */
+ DSTYLE_WHEREIS, /* whereis search target */
+ DSTYLE_ELEMENTS
+ };
+
+ typedef struct {
+ int color; /* color highlighting to be done */
+ int mono; /* mono highlighting to be done */
+ int cattr; /* attributes to go with the color */
+ } HTCharStyle;
+
+#if 0
+#define HText_characterStyle CTRACE((tfp,"HTC called from %s/%d\n",__FILE__,__LINE__));_internal_HTC
+#else
+#define HText_characterStyle _internal_HTC
+#endif
+
+#if defined(USE_COLOR_STYLE)
+ extern void _internal_HTC(HText *text, int style, int dir);
+
+#define TEMPSTRINGSIZE 256
+ extern char class_string[TEMPSTRINGSIZE + 1];
+
+/* stack of attributes during page rendering */
+#define MAX_LAST_STYLES 128
+ extern int last_styles[MAX_LAST_STYLES + 1];
+ extern int last_colorattr_ptr;
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/src/DefaultStyle.c b/src/DefaultStyle.c
new file mode 100644
index 0000000..3dc17f7
--- /dev/null
+++ b/src/DefaultStyle.c
@@ -0,0 +1,504 @@
+/*
+ * $LynxId: DefaultStyle.c,v 1.20 2009/11/27 13:04:27 tom Exp $
+ *
+ * A real style sheet for the Character Grid browser
+ *
+ * The dimensions are all in characters!
+ */
+
+#include <HTUtils.h>
+#include <HTFont.h>
+#include <HTStyle.h>
+
+#include <LYGlobalDefs.h>
+#include <LYLeaks.h>
+
+/* Tab arrays:
+*/
+static const HTTabStop tabs_8[] =
+{
+ {0, 8},
+ {0, 16},
+ {0, 24},
+ {0, 32},
+ {0, 40},
+ {0, 48},
+ {0, 56},
+ {0, 64},
+ {0, 72},
+ {0, 80},
+ {0, 88},
+ {0, 96},
+ {0, 104},
+ {0, 112},
+ {0, 120},
+ {0, 128},
+ {0, 136},
+ {0, 144},
+ {0, 152},
+ {0, 160},
+ {0, 168},
+ {0, 176},
+ {0, 0} /* Terminate */
+};
+
+/* Template:
+ * link to next, name, name id (enum), tag,
+ * font, size, colour, superscript, anchor id,
+ * indents: 1st, left, right, alignment lineheight, descent, tabs,
+ * word wrap, free format, space: before, after, flags.
+ */
+
+static HTStyle HTStyleNormal =
+HTStyleInit(
+ 0, Normal, "P",
+ HT_FONT, 1, HT_BLACK, 0, 0,
+ 3, 3, 6, HT_LEFT, 1, 0, tabs_8,
+ YES, YES, 1, 0, 0);
+
+static HTStyle HTStyleDivCenter =
+HTStyleInit(
+ &HTStyleNormal, DivCenter, "DCENTER",
+ HT_FONT, 1, HT_BLACK, 0, 0,
+ 3, 3, 6, HT_CENTER, 1, 0, tabs_8,
+ YES, YES, 1, 0, 0);
+
+static HTStyle HTStyleDivLeft =
+HTStyleInit(
+ &HTStyleDivCenter, DivLeft, "DLEFT",
+ HT_FONT, 1, HT_BLACK, 0, 0,
+ 3, 3, 6, HT_LEFT, 1, 0, tabs_8,
+ YES, YES, 1, 0, 0);
+
+static HTStyle HTStyleDivRight =
+HTStyleInit(
+ &HTStyleDivLeft, DivRight, "DRIGHT",
+ HT_FONT, 1, HT_BLACK, 0, 0,
+ 3, 3, 6, HT_RIGHT, 1, 0, tabs_8,
+ YES, YES, 1, 0, 0);
+
+static HTStyle HTStyleBanner =
+HTStyleInit(
+ &HTStyleDivRight, Banner, "BANNER",
+ HT_FONT, 1, HT_BLACK, 0, 0,
+ 3, 3, 6, HT_LEFT, 1, 0, tabs_8,
+ YES, YES, 1, 0, 0);
+
+static HTStyle HTStyleBlockquote =
+HTStyleInit(
+ &HTStyleBanner, Blockquote, "BLOCKQUOTE",
+ HT_FONT, 1, HT_BLACK, 0, 0,
+ 5, 5, 7, HT_LEFT, 1, 0, tabs_8,
+ YES, YES, 1, 0, 0);
+
+static HTStyle HTStyleBq =
+HTStyleInit( /* HTML 3.0 BLOCKQUOTE - FM */
+ &HTStyleBlockquote, Bq, "BQ",
+ HT_FONT, 1, HT_BLACK, 0, 0,
+ 5, 5, 7, HT_LEFT, 1, 0, tabs_8,
+ YES, YES, 1, 0, 0);
+
+static HTStyle HTStyleFootnote =
+HTStyleInit( /* HTML 3.0 FN - FM */
+ &HTStyleBq, Footnote, "FN",
+ HT_FONT, 1, HT_BLACK, 0, 0,
+ 5, 5, 7, HT_LEFT, 1, 0, tabs_8,
+ YES, YES, 1, 0, 0);
+
+static HTStyle HTStyleList =
+HTStyleInit(
+ &HTStyleFootnote, List, "UL",
+ HT_FONT, 1, HT_BLACK, 0, 0,
+ 3, 7, 6, HT_LEFT, 1, 0, 0,
+ YES, YES, 0, 0, 0);
+
+static HTStyle HTStyleList1 =
+HTStyleInit(
+ &HTStyleList, List1, "UL",
+ HT_FONT, 1, HT_BLACK, 0, 0,
+ 8, 12, 6, HT_LEFT, 1, 0, 0,
+ YES, YES, 0, 0, 0);
+
+static HTStyle HTStyleList2 =
+HTStyleInit(
+ &HTStyleList1, List2, "UL",
+ HT_FONT, 1, HT_BLACK, 0, 0,
+ 13, 17, 6, HT_LEFT, 1, 0, 0,
+ YES, YES, 0, 0, 0);
+
+static HTStyle HTStyleList3 =
+HTStyleInit(
+ &HTStyleList2, List3, "UL",
+ HT_FONT, 1, HT_BLACK, 0, 0,
+ 18, 22, 6, HT_LEFT, 1, 0, 0,
+ YES, YES, 0, 0, 0);
+
+static HTStyle HTStyleList4 =
+HTStyleInit(
+ &HTStyleList3, List4, "UL",
+ HT_FONT, 1, HT_BLACK, 0, 0,
+ 23, 27, 6, HT_LEFT, 1, 0, 0,
+ YES, YES, 0, 0, 0);
+
+static HTStyle HTStyleList5 =
+HTStyleInit(
+ &HTStyleList4, List5, "UL",
+ HT_FONT, 1, HT_BLACK, 0, 0,
+ 28, 32, 6, HT_LEFT, 1, 0, 0,
+ YES, YES, 0, 0, 0);
+
+static HTStyle HTStyleList6 =
+HTStyleInit(
+ &HTStyleList5, List6, "UL",
+ HT_FONT, 1, HT_BLACK, 0, 0,
+ 33, 37, 6, HT_LEFT, 1, 0, 0,
+ YES, YES, 0, 0, 0);
+
+static HTStyle HTStyleMenu =
+HTStyleInit(
+ &HTStyleList6, Menu, "MENU",
+ HT_FONT, 1, HT_BLACK, 0, 0,
+ 3, 7, 6, HT_LEFT, 1, 0, 0,
+ YES, YES, 0, 0, 0
+);
+
+static HTStyle HTStyleMenu1 =
+HTStyleInit(
+ &HTStyleMenu, Menu1, "MENU",
+ HT_FONT, 1, HT_BLACK, 0, 0,
+ 8, 12, 6, HT_LEFT, 1, 0, 0,
+ YES, YES, 0, 0, 0
+);
+
+static HTStyle HTStyleMenu2 =
+HTStyleInit(
+ &HTStyleMenu1, Menu2, "MENU",
+ HT_FONT, 1, HT_BLACK, 0, 0,
+ 13, 17, 6, HT_LEFT, 1, 0, 0,
+ YES, YES, 0, 0, 0
+);
+
+static HTStyle HTStyleMenu3 =
+HTStyleInit(
+ &HTStyleMenu2, Menu3, "MENU",
+ HT_FONT, 1, HT_BLACK, 0, 0,
+ 18, 22, 6, HT_LEFT, 1, 0, 0,
+ YES, YES, 0, 0, 0
+);
+
+static HTStyle HTStyleMenu4 =
+HTStyleInit(
+ &HTStyleMenu3, Menu4, "MENU",
+ HT_FONT, 1, HT_BLACK, 0, 0,
+ 23, 27, 6, HT_LEFT, 1, 0, 0,
+ YES, YES, 0, 0, 0
+);
+
+static HTStyle HTStyleMenu5 =
+HTStyleInit(
+ &HTStyleMenu4, Menu5, "MENU",
+ HT_FONT, 1, HT_BLACK, 0, 0,
+ 28, 33, 6, HT_LEFT, 1, 0, 0,
+ YES, YES, 0, 0, 0
+);
+
+static HTStyle HTStyleMenu6 =
+HTStyleInit(
+ &HTStyleMenu5, Menu6, "MENU",
+ HT_FONT, 1, HT_BLACK, 0, 0,
+ 33, 38, 6, HT_LEFT, 1, 0, 0,
+ YES, YES, 0, 0, 0
+);
+
+static HTStyle HTStyleGlossary =
+HTStyleInit(
+ &HTStyleMenu6, Glossary, "DL",
+ HT_FONT, 1, HT_BLACK, 0, 0,
+ 3, 10, 6, HT_LEFT, 1, 0, 0,
+ YES, YES, 1, 1, 0
+);
+
+static HTStyle HTStyleGlossary1 =
+HTStyleInit(
+ &HTStyleGlossary, Glossary1, "DL",
+ HT_FONT, 1, HT_BLACK, 0, 0,
+ 8, 16, 6, HT_LEFT, 1, 0, 0,
+ YES, YES, 1, 1, 0
+);
+
+static HTStyle HTStyleGlossary2 =
+HTStyleInit(
+ &HTStyleGlossary1, Glossary2, "DL",
+ HT_FONT, 1, HT_BLACK, 0, 0,
+ 14, 22, 6, HT_LEFT, 1, 0, 0,
+ YES, YES, 1, 1, 0
+);
+
+static HTStyle HTStyleGlossary3 =
+HTStyleInit(
+ &HTStyleGlossary2, Glossary3, "DL",
+ HT_FONT, 1, HT_BLACK, 0, 0,
+ 20, 28, 6, HT_LEFT, 1, 0, 0,
+ YES, YES, 1, 1, 0
+);
+
+static HTStyle HTStyleGlossary4 =
+HTStyleInit(
+ &HTStyleGlossary3, Glossary4, "DL",
+ HT_FONT, 1, HT_BLACK, 0, 0,
+ 26, 34, 6, HT_LEFT, 1, 0, 0,
+ YES, YES, 1, 1, 0
+);
+
+static HTStyle HTStyleGlossary5 =
+HTStyleInit(
+ &HTStyleGlossary4, Glossary5, "DL",
+ HT_FONT, 1, HT_BLACK, 0, 0,
+ 32, 40, 6, HT_LEFT, 1, 0, 0,
+ YES, YES, 1, 1, 0
+);
+
+static HTStyle HTStyleGlossary6 =
+HTStyleInit(
+ &HTStyleGlossary5, Glossary6, "DL",
+ HT_FONT, 1, HT_BLACK, 0, 0,
+ 38, 46, 6, HT_LEFT, 1, 0, 0,
+ YES, YES, 1, 1, 0
+);
+
+static HTStyle HTStyleGlossaryCompact =
+HTStyleInit(
+ &HTStyleGlossary6, GlossaryCompact, "DLC",
+ HT_FONT, 1, HT_BLACK, 0, 0,
+ 3, 10, 6, HT_LEFT, 1, 0, 0,
+ YES, YES, 0, 0, 0
+);
+
+static HTStyle HTStyleGlossaryCompact1 =
+HTStyleInit(
+ &HTStyleGlossaryCompact,
+ GlossaryCompact1, "DLC",
+ HT_FONT, 1, HT_BLACK, 0, 0,
+ 8, 15, 6, HT_LEFT, 1, 0, 0,
+ YES, YES, 0, 0, 0
+);
+
+static HTStyle HTStyleGlossaryCompact2 =
+HTStyleInit(
+ &HTStyleGlossaryCompact1,
+ GlossaryCompact2, "DLC",
+ HT_FONT, 1, HT_BLACK, 0, 0,
+ 13, 20, 6, HT_LEFT, 1, 0, 0,
+ YES, YES, 0, 0, 0
+);
+
+static HTStyle HTStyleGlossaryCompact3 =
+HTStyleInit(
+ &HTStyleGlossaryCompact2,
+ GlossaryCompact3, "DLC",
+ HT_FONT, 1, HT_BLACK, 0, 0,
+ 18, 25, 6, HT_LEFT, 1, 0, 0,
+ YES, YES, 0, 0, 0
+);
+
+static HTStyle HTStyleGlossaryCompact4 =
+HTStyleInit(
+ &HTStyleGlossaryCompact3,
+ GlossaryCompact4, "DLC",
+ HT_FONT, 1, HT_BLACK, 0, 0,
+ 23, 30, 6, HT_LEFT, 1, 0, 0,
+ YES, YES, 0, 0, 0
+);
+
+static HTStyle HTStyleGlossaryCompact5 =
+HTStyleInit(
+ &HTStyleGlossaryCompact4,
+ GlossaryCompact5, "DLC",
+ HT_FONT, 1, HT_BLACK, 0, 0,
+ 28, 35, 6, HT_LEFT, 1, 0, 0,
+ YES, YES, 0, 0, 0
+);
+
+static HTStyle HTStyleGlossaryCompact6 =
+HTStyleInit(
+ &HTStyleGlossaryCompact5,
+ GlossaryCompact6, "DLC",
+ HT_FONT, 1, HT_BLACK, 0, 0,
+ 33, 40, 6, HT_LEFT, 1, 0, 0,
+ YES, YES, 0, 0, 0
+);
+
+static HTStyle HTStyleExample =
+HTStyleInit(
+ &HTStyleGlossaryCompact6,
+ Example, "XMP",
+ HT_FONT, 1, HT_BLACK, 0, 0,
+ 0, 0, 0, HT_LEFT, 1, 0, tabs_8,
+ NO, NO, 0, 0, 0
+);
+
+static HTStyle HTStylePreformatted =
+HTStyleInit(
+ &HTStyleExample,
+ Preformatted, "PRE",
+ HT_FONT, 1, HT_BLACK, 0, 0,
+ 0, 0, 0, HT_LEFT, 1, 0, tabs_8,
+ NO, NO, 0, 0, 0
+);
+
+static HTStyle HTStyleListing =
+HTStyleInit(
+ &HTStylePreformatted, Listing, "LISTING",
+ HT_FONT, 1, HT_BLACK, 0, 0,
+ 0, 0, 0, HT_LEFT, 1, 0, tabs_8,
+ NO, NO, 0, 0, 0);
+
+static HTStyle HTStyleAddress =
+HTStyleInit(
+ &HTStyleListing, Address, "ADDRESS",
+ HT_FONT, 1, HT_BLACK, 0, 0,
+ 4, 4, 7, HT_LEFT, 1, 0, tabs_8,
+ YES, YES, 2, 0, 0);
+
+static HTStyle HTStyleNote =
+HTStyleInit( /* HTML 3.0 NOTE - FM */
+ &HTStyleAddress, Note, "NOTE",
+ HT_FONT, 1, HT_BLACK, 0, 0,
+ 5, 5, 7, HT_LEFT, 1, 0, tabs_8,
+ YES, YES, 1, 0, 0);
+
+static HTStyle HTStyleHeading1 =
+HTStyleInit(
+ &HTStyleNote, Heading1, "H1",
+ HT_FONT + HT_BOLD, 1, HT_BLACK, 0, 0,
+ 0, 0, 0, HT_CENTER, 1, 0, 0,
+ YES, YES, 1, 1, 0);
+
+static HTStyle HTStyleHeading2 =
+HTStyleInit(
+ &HTStyleHeading1, Heading2, "H2",
+ HT_FONT + HT_BOLD, 1, HT_BLACK, 0, 0,
+ 0, 0, 0, HT_LEFT, 1, 0, 0,
+ YES, YES, 1, 1, 0);
+
+static HTStyle HTStyleHeading3 =
+HTStyleInit(
+ &HTStyleHeading2, Heading3, "H3",
+ HT_FONT + HT_BOLD, 1, HT_BLACK, 0, 0,
+ 2, 2, 0, HT_LEFT, 1, 0, 0,
+ YES, YES, 1, 0, 0);
+
+static HTStyle HTStyleHeading4 =
+HTStyleInit(
+ &HTStyleHeading3, Heading4, "H4",
+ HT_FONT + HT_BOLD, 1, HT_BLACK, 0, 0,
+ 4, 4, 0, HT_LEFT, 1, 0, 0,
+ YES, YES, 1, 0, 0);
+
+static HTStyle HTStyleHeading5 =
+HTStyleInit(
+ &HTStyleHeading4, Heading5, "H5",
+ HT_FONT + HT_BOLD, 1, HT_BLACK, 0, 0,
+ 6, 6, 0, HT_LEFT, 1, 0, 0,
+ YES, YES, 1, 0, 0);
+
+static HTStyle HTStyleHeading6 =
+HTStyleInit(
+ &HTStyleHeading5, Heading6, "H6",
+ HT_FONT + HT_BOLD, 1, HT_BLACK, 0, 0,
+ 8, 8, 0, HT_LEFT, 1, 0, 0,
+ YES, YES, 1, 0, 0);
+
+static HTStyle HTStyleHeadingCenter =
+HTStyleInit(
+ &HTStyleHeading6, HeadingCenter, "HCENTER",
+ HT_FONT + HT_BOLD, 1, HT_BLACK, 0, 0,
+ 0, 0, 3, HT_CENTER, 1, 0, tabs_8,
+ YES, YES, 1, 0, 0);
+
+static HTStyle HTStyleHeadingLeft =
+HTStyleInit(
+ &HTStyleHeadingCenter, HeadingLeft, "HLEFT",
+ HT_FONT + HT_BOLD, 1, HT_BLACK, 0, 0,
+ 0, 0, 3, HT_LEFT, 1, 0, tabs_8,
+ YES, YES, 1, 0, 0);
+
+static HTStyle HTStyleHeadingRight =
+HTStyleInit(
+ &HTStyleHeadingLeft, HeadingRight, "HRIGHT",
+ HT_FONT + HT_BOLD, 1, HT_BLACK, 0, 0,
+ 0, 0, 3, HT_RIGHT, 1, 0, tabs_8,
+ YES, YES, 1, 0, 0);
+
+/* Style sheet points to the last in the list:
+*/
+static HTStyleSheet sheet =
+{"default.style",
+ &HTStyleHeadingRight}; /* sheet */
+
+static HTStyle *st_array[ST_HeadingRight + 1] =
+{NULL};
+
+static HTStyleSheet *result = NULL;
+
+#ifdef LY_FIND_LEAKS
+static void FreeDefaultStyle(void)
+{
+ HTStyle *style;
+
+ while ((style = result->styles) != 0) {
+ result->styles = style->next;
+ FREE(style);
+ }
+ FREE(result);
+}
+#endif /* LY_FIND_LEAKS */
+
+HTStyleSheet *DefaultStyle(HTStyle ***result_array)
+{
+ HTStyle *p, *q;
+
+ /*
+ * The first time we're called, allocate a copy of the 'sheet' linked
+ * list. Thereafter, simply copy the data from 'sheet' into our copy
+ * (preserving the copy's linked-list pointers). We do this to reset the
+ * parameters of a style that might be altered while processing a page.
+ */
+ if (result == 0) { /* allocate & copy */
+ result = HTStyleSheetNew();
+ *result = sheet;
+ result->styles = 0;
+#ifdef LY_FIND_LEAKS
+ atexit(FreeDefaultStyle);
+#endif
+ for (p = sheet.styles; p != 0; p = p->next) {
+ q = HTStyleNew();
+ *q = *p;
+ if (no_margins) {
+ q->indent1st = 0;
+ q->leftIndent = 0;
+ q->rightIndent = 0;
+ }
+ st_array[q->id] = q;
+ q->next = result->styles;
+ result->styles = q;
+ }
+ } else { /* recopy the data */
+ for (q = result->styles, p = sheet.styles;
+ p != 0 && q != 0;
+ p = p->next, q = q->next) {
+ HTStyle *r = q->next;
+
+ *q = *p;
+ if (no_margins) {
+ q->indent1st = 0;
+ q->leftIndent = 0;
+ q->rightIndent = 0;
+ }
+ st_array[q->id] = q;
+ q->next = r;
+ }
+ }
+ *result_array = st_array;
+ return result;
+}
diff --git a/src/GridText.c b/src/GridText.c
new file mode 100644
index 0000000..48696c3
--- /dev/null
+++ b/src/GridText.c
@@ -0,0 +1,15049 @@
+/*
+ * $LynxId: GridText.c,v 1.342 2023/01/05 09:17:47 tom Exp $
+ *
+ * Character grid hypertext object
+ * ===============================
+ */
+
+#include <HTUtils.h>
+#include <HTString.h>
+#include <HTAccess.h>
+#include <HTAnchor.h>
+#include <HTParse.h>
+#include <HTTP.h>
+#include <HTAlert.h>
+#include <HTCJK.h>
+#include <HTFile.h>
+#include <UCDefs.h>
+#include <UCAux.h>
+#include <HText.h>
+
+#include <assert.h>
+
+#include <GridText.h>
+#include <LYCurses.h>
+#include <LYUtils.h>
+#include <LYStrings.h>
+#include <LYStructs.h>
+#include <LYGlobalDefs.h>
+#include <LYGetFile.h>
+#include <LYClean.h>
+#include <LYMail.h>
+#include <LYList.h>
+#include <LYCharSets.h>
+#include <LYCharUtils.h> /* LYUCTranslateBack... */
+#include <UCMap.h>
+#include <LYEdit.h>
+#include <LYPrint.h>
+#include <LYPrettySrc.h>
+#include <LYSearch.h>
+#include <TRSTable.h>
+#include <LYHistory.h>
+#ifdef EXP_CHARTRANS_AUTOSWITCH
+#include <UCAuto.h>
+#endif /* EXP_CHARTRANS_AUTOSWITCH */
+
+#include <LYexit.h>
+#include <LYLeaks.h>
+
+#ifdef USE_COLOR_STYLE
+#include <AttrList.h>
+#include <LYHash.h>
+#include <LYStyle.h>
+#endif
+
+#ifdef EXP_WCWIDTH_SUPPORT
+# ifdef HAVE_WCWIDTH
+# ifdef HAVE_WCHAR_H
+# include <wchar.h>
+# endif
+# else
+# include <wcwidth.h>
+# define wcwidth(n) mk_wcwidth(n)
+# endif
+#endif
+
+#include <LYJustify.h>
+
+#define is_CJK2(b) (IS_CJK_TTY && is8bits(UCH(b)))
+
+#ifdef USE_CURSES_PADS
+# define DISPLAY_COLS (LYwideLines ? MAX_COLS : LYcols)
+# define WRAP_COLS(text) ((text)->stbl ? \
+ (LYtableCols <= 0 \
+ ? DISPLAY_COLS \
+ : (LYtableCols * LYcols)/12) - LYbarWidth \
+ : LYcolLimit)
+#else
+# define DISPLAY_COLS LYcols
+# define WRAP_COLS(text) LYcolLimit
+#endif
+
+#define FirstHTLine(text) ((text)->last_line->next)
+#define LastHTLine(text) ((text)->last_line)
+
+static void HText_trimHightext(HText *text, int final, int stop_before);
+
+#define IS_UTF_FIRST(ch) (text->T.output_utf8 && \
+ (UCH((ch))&0xc0) == 0xc0)
+
+#define IS_UTF_EXTRA(ch) (text->T.output_utf8 && \
+ (UCH((ch))&0xc0) == 0x80)
+
+#define IS_UTF8_EXTRA(ch) (!(text && text->T.output_utf8) || \
+ !is8bits(ch) || \
+ (UCH(line->data[i] & 0xc0) == 0xc0))
+
+/* a test in compact form: how many extra UTF-8 chars after initial? - kw */
+#define UTF8_XNEGLEN(c) (c&0xC0? 0 :c&32? 1 :c&16? 2 :c&8? 3 :c&4? 4 :c&2? 5:0)
+#define UTF_XLEN(c) UTF8_XNEGLEN(((char)~(c)))
+
+#ifdef KANJI_CODE_OVERRIDE
+HTkcode last_kcode = NOKANJI; /* 1997/11/14 (Fri) 09:09:26 */
+#endif
+
+#undef CHAR_WIDTH
+
+#ifdef CJK_EX
+#define CHAR_WIDTH 6
+#else
+#define CHAR_WIDTH 1
+#endif
+
+/* Exports
+*/
+HText *HTMainText = NULL; /* Equivalent of main window */
+HTParentAnchor *HTMainAnchor = NULL; /* Anchor for HTMainText */
+
+const char *HTAppName = LYNX_NAME; /* Application name */
+const char *HTAppVersion = LYNX_VERSION; /* Application version */
+
+static int HTFormNumber = 0;
+static int HTFormFields = 0;
+static char *HTCurSelectGroup = NULL; /* Form select group name */
+static int HTCurSelectGroupCharset = -1; /* ... and name's charset */
+int HTCurSelectGroupType = F_RADIO_TYPE; /* Group type */
+char *HTCurSelectGroupSize = NULL; /* Length of select */
+static char *HTCurSelectedOptionValue = NULL; /* Select choice */
+
+const char *checked_box = "[X]";
+const char *unchecked_box = "[ ]";
+const char *checked_radio = "(*)";
+const char *unchecked_radio = "( )";
+
+static BOOLEAN underline_on = FALSE;
+static BOOLEAN bold_on = FALSE;
+
+#ifdef USE_SOURCE_CACHE
+int LYCacheSource = SOURCE_CACHE_NONE;
+int LYCacheSourceForAborted = SOURCE_CACHE_FOR_ABORTED_DROP;
+#endif
+
+#ifdef USE_SCROLLBAR
+BOOLEAN LYShowScrollbar = FALSE;
+BOOLEAN LYsb_arrow = TRUE;
+int LYsb_begin = -1;
+int LYsb_end = -1;
+#endif
+
+#ifndef VMS /* VMS has a better way - right? - kw */
+#define CHECK_FREE_MEM
+#endif
+
+#ifdef CHECK_FREE_MEM
+static void *LY_check_calloc(size_t nmemb, size_t size);
+
+#define LY_CALLOC LY_check_calloc
+#else
+ /* using the regular calloc */
+#define LY_CALLOC calloc
+#endif
+
+/*
+ * The HTPool.data[] array has to align the same as malloc() would, to make the
+ * ALLOC_POOL scheme portable. For many platforms, that is the same as the
+ * number of bytes in a pointer. It may be larger, e.g., on machines which
+ * have more stringent requirements for floating point. 32-bits are plenty for
+ * representing styles, but we may need 64-bit or 128-bit alignment.
+ *
+ * The real issue is that performance is degraded if the alignment is not met,
+ * and some platforms such as Tru64 generate lots of warning messages.
+ */
+#ifndef ALIGN_SIZE
+#define ALIGN_SIZE sizeof(double)
+#endif
+
+#define BITS_DIR 2
+#define BITS_POS 14
+
+#define MASK_DIR ((1U << BITS_DIR) - 1)
+#define CAST_DIR(n) ((MASK_DIR) & (unsigned)(n))
+
+#define MASK_POS ((1U << BITS_POS) - 1)
+#define CAST_POS(n) ((MASK_POS) & (unsigned)(n))
+
+typedef struct {
+ unsigned sc_direction:BITS_DIR; /* on or off */
+ unsigned sc_horizpos:BITS_POS; /* horizontal position of this change */
+ unsigned sc_style:16; /* which style to change to */
+} HTStyleChange;
+
+#if defined(USE_COLOR_STYLE)
+#define MAX_STYLES_ON_LINE 64
+ /* buffers used when current line is being aggregated, in split_line() */
+static HTStyleChange stylechanges_buffers[2][MAX_STYLES_ON_LINE];
+#endif
+
+typedef HTStyleChange pool_data;
+
+enum {
+ POOL_SIZE = ((8192
+ - 4 * sizeof(void *)
+ - sizeof(struct _HTPool *)
+ - sizeof(int))
+ / sizeof(pool_data))
+};
+
+typedef struct _HTPool {
+ pool_data data[POOL_SIZE];
+ struct _HTPool *prev;
+ unsigned used;
+} HTPool;
+
+/************************************************************************
+These are generic macros for any pools (provided those structures have the
+same members as HTPool). Pools are used for allocation of groups of
+objects of the same type T. Pools are represented as a list of structures of
+type P (called pool chunks here). Structure P has an array of N objects of
+type T named 'data' (the number N in the array can be chosen arbitrary),
+pointer to the previous pool chunk named 'prev', and the number of used items
+in that pool chunk named 'used'. Here is a definition of the structure P:
+ struct P
+ {
+ T data[N];
+ struct P* prev;
+ int used;
+ };
+ It's recommended that sizeof(P) be memory page size minus 32 in order malloc'd
+chunks to fit in machine page size.
+ Allocation of 'n' items in the pool is implemented by incrementing member
+'used' by 'n' if (used+n <= N), or malloc a new pool chunk and
+allocating 'n' items in that new chunk. It's the task of the programmer to
+assert that 'n' is <= N. Only entire pool may be freed - this limitation makes
+allocation algorithms trivial and fast - so the use of pools is limited to
+objects that are freed in batch, that are not deallocated not in the batch, and
+not reallocated.
+ Pools greatly reduce memory fragmentation and memory allocation/deallocation
+speed due to the simple algorithms used. Due to the fact that memory is
+'allocated' in array, alignment overhead is minimal. Allocating strings in a
+pool provided their length will never exceed N and is much smaller than N seems
+to be very efficient.
+ [Several types of memory-hungry objects are stored in the pool now: styles,
+lines, anchors, and FormInfo. Arrays of HTStyleChange are stored as is,
+other objects are stored using a cast.]
+
+ Pool is referenced by the pointer to the last chunk that contains free slots.
+Functions that allocate memory in the pool update that pointer if needed.
+There are 3 functions - POOL_NEW, POOL_FREE, and ALLOC_IN_POOL.
+
+ - VH
+
+*************************************************************************/
+
+#define POOLallocstyles(ptr, n) ptr = ALLOC_IN_POOL(&HTMainText->pool, (unsigned) ((n) * sizeof(pool_data)))
+#define POOLallocHTLine(ptr, size) ptr = (HTLine*) ALLOC_IN_POOL(&HTMainText->pool, (unsigned) LINE_SIZE(size))
+#define POOLallocstring(ptr, len) ptr = (char*) ALLOC_IN_POOL(&HTMainText->pool, (unsigned) ((len) + 1))
+#define POOLtypecalloc(T, ptr) ptr = (T*) ALLOC_IN_POOL(&HTMainText->pool, (unsigned) sizeof(T))
+
+/**************************************************************************/
+/*
+ * Allocates 'n' items in the pool of type 'HTPool' pointed by 'poolptr'.
+ * Returns a pointer to the "allocated" memory if successful.
+ * Updates 'poolptr' if necessary.
+ */
+static void *ALLOC_IN_POOL(HTPool ** ppoolptr, unsigned request)
+{
+ HTPool *pool = *ppoolptr;
+ pool_data *ptr;
+ unsigned n;
+ unsigned j;
+
+ if (!pool) {
+ outofmem(__FILE__, "ALLOC_IN_POOL");
+ } else {
+ n = request;
+ if (n == 0)
+ n = 1;
+ j = (n % ALIGN_SIZE);
+ if (j != 0)
+ n += (unsigned) (ALIGN_SIZE - j);
+ n /= sizeof(pool_data);
+
+ if (POOL_SIZE >= (pool->used + n)) {
+ ptr = pool->data + pool->used;
+ pool->used += n;
+ } else {
+ HTPool *newpool = (HTPool *) LY_CALLOC((size_t) 1, sizeof(HTPool));
+
+ if (!newpool) {
+ outofmem(__FILE__, "ALLOC_IN_POOL");
+ } else {
+ newpool->prev = pool;
+ newpool->used = n;
+ ptr = newpool->data;
+ *ppoolptr = newpool;
+ }
+ }
+ }
+ return ptr;
+}
+
+/*
+ * Returns a pointer to initialized pool of type 'HTPool', or NULL if fails.
+ */
+static HTPool *POOL_NEW(void)
+{
+ HTPool *poolptr = (HTPool *) LY_CALLOC((size_t) 1, sizeof(HTPool));
+
+ if (poolptr) {
+ poolptr->prev = NULL;
+ poolptr->used = 0;
+ }
+ return poolptr;
+}
+
+/*
+ * Frees a pool of type 'HTPool' pointed by poolptr.
+ */
+static void POOL_FREE(HTPool * poolptr)
+{
+ HTPool *cur = poolptr;
+ HTPool *prev;
+
+ while (cur) {
+ prev = cur->prev;
+ free(cur);
+ cur = prev;
+ }
+}
+
+/**************************************************************************/
+/**************************************************************************/
+
+typedef struct _line {
+ struct _line *next;
+ struct _line *prev;
+ unsigned short offset; /* Implicit initial spaces */
+ unsigned short size; /* Number of characters */
+#if defined(USE_COLOR_STYLE)
+ HTStyleChange *styles;
+ unsigned short numstyles;
+#endif
+ char data[1]; /* Space for terminator at least! */
+} HTLine;
+
+ /* Allow for terminator */
+#define LINE_SIZE(size) (sizeof(HTLine) + (size_t)(size))
+
+#ifndef HTLINE_NOT_IN_POOL
+#define HTLINE_NOT_IN_POOL 0 /* debug with this set to 1 */
+#endif
+
+#if HTLINE_NOT_IN_POOL
+#define allocHTLine(ptr, size) { ptr = (HTLine *)calloc(1, LINE_SIZE(size)); }
+#define freeHTLine(self, ptr) { \
+ if (ptr && ptr != TEMP_LINE(self, 0) && ptr != TEMP_LINE(self, 1)) \
+ FREE(ptr); \
+ }
+#else
+#define allocHTLine(ptr, size) POOLallocHTLine(ptr, size)
+#define freeHTLine(self, ptr) {}
+#endif
+
+/*
+ * Last line buffer; the second is used in split_line(). Not in pool!
+ * We cannot wrap in middle of multibyte sequences, so allocate 2 extra
+ * for a workspace. This is stored in the HText, to prevent confusion
+ * between different documents. Note also that it is declared with an
+ * HTLine at the beginning so pointers will be properly aligned.
+ */
+typedef struct {
+ HTLine base;
+ char data[MAX_LINE + 2];
+} HTLineTemp;
+
+#define TEMP_LINE(p,n) ((HTLine *)&(p->temp_line[n]))
+
+typedef struct _TextAnchor {
+ struct _TextAnchor *next;
+ struct _TextAnchor *prev; /* www_user_search only! */
+ int sgml_offset; /* used for updating position after reparsing */
+ int number; /* For user interface */
+ int show_number; /* For user interface (unique-urls) */
+ int line_num; /* Place in document */
+ short line_pos; /* Bytes/chars - extent too */
+ short extent; /* (see HText_trimHightext) */
+ BOOL show_anchor; /* Show the anchor? */
+ BOOL inUnderline; /* context is underlined */
+ BOOL expansion_anch; /* TEXTAREA edit new anchor */
+ char link_type; /* Normal, internal, or form? */
+ FormInfo *input_field; /* Info for form links */
+ HiliteList lites;
+
+ HTChildAnchor *anchor;
+} TextAnchor;
+
+typedef struct {
+ char *name; /* ID value of TAB */
+ int column; /* Zero-based column value */
+} HTTabID;
+
+typedef enum {
+ S_text,
+ S_esc,
+ S_dollar,
+ S_paren,
+ S_nonascii_text,
+ S_dollar_paren,
+ S_jisx0201_text
+} eGridState; /* Escape sequence? */
+
+#ifdef USE_TH_JP_AUTO_DETECT
+typedef enum { /* Detected Kanji code */
+ DET_SJIS,
+ DET_EUC,
+ DET_NOTYET,
+ DET_MIXED
+} eDetectedKCode;
+
+typedef enum {
+ SJIS_state_neutral,
+ SJIS_state_in_kanji,
+ SJIS_state_has_bad_code
+} eSJIS_status;
+
+typedef enum {
+ EUC_state_neutral,
+ EUC_state_in_kanji,
+ EUC_state_in_kana,
+ EUC_state_has_bad_code
+} eEUC_status;
+#endif
+
+/* Notes on struct _HText:
+ * next_line is valid if stale is false.
+ * top_of_screen line means the line at the top of the screen
+ * or just under the title if there is one.
+ */
+struct _HText {
+ HTParentAnchor *node_anchor;
+
+ HTLine *last_line;
+ HTLineTemp temp_line[2];
+ int Lines; /* Number of them */
+ TextAnchor *first_anchor; /* double-linked on demand */
+ TextAnchor *last_anchor;
+ TextAnchor *last_anchor_before_stbl;
+ TextAnchor *last_anchor_before_split;
+ HTList *forms; /* also linked internally */
+ int last_anchor_number; /* user number */
+ BOOL source; /* Is the text source? */
+ BOOL toolbar; /* Toolbar set? */
+ HTList *tabs; /* TAB IDs */
+ HTList *hidden_links; /* Content-less links ... */
+ int hiddenlinkflag; /* ... and how to treat them */
+ BOOL no_cache; /* Always refresh? */
+#ifdef EXP_JAPANESE_SPACES
+ char LastChars[7]; /* utf-8 buffer */
+#else
+ char LastChar; /* For absorbing white space */
+#endif
+
+/* For Internal use: */
+ HTStyle *style; /* Current style */
+ int display_on_the_fly; /* Lines left */
+ int top_of_screen; /* Line number */
+ HTLine *top_of_screen_line; /* Top */
+ HTLine *next_line; /* Bottom + 1 */
+ unsigned permissible_split; /* in last line */
+ BOOL in_line_1; /* of paragraph */
+ BOOL stale; /* Must refresh */
+ BOOL page_has_target; /* has target on screen */
+ BOOL has_utf8; /* has utf-8 on screen or line */
+ BOOL had_utf8; /* had utf-8 when last displayed */
+ int next_number; /* next a->number value */
+#ifdef DISP_PARTIAL
+ int first_lineno_last_disp_partial;
+ int last_lineno_last_disp_partial;
+#endif
+ STable_info *stbl;
+ HTList *enclosed_stbl;
+
+ HTkcode kcode; /* Kanji code? */
+ HTkcode specified_kcode; /* Specified Kanji code */
+#ifdef USE_TH_JP_AUTO_DETECT
+ eDetectedKCode detected_kcode;
+ eSJIS_status SJIS_status;
+ eEUC_status EUC_status;
+#endif
+ eGridState state; /* Escape sequence? */
+ int kanji_buf; /* Lead multibyte */
+ int in_sjis; /* SJIS flag */
+ int halted; /* emergency halt */
+
+ BOOL have_8bit_chars; /* Any non-ASCII chars? */
+ LYUCcharset *UCI; /* node_anchor UCInfo */
+ int UCLYhndl; /* charset we are fed */
+ UCTransParams T;
+
+ HTStream *target; /* Output stream */
+ HTStreamClass targetClass; /* Output routines */
+
+ HTPool *pool; /* this HText memory pool */
+
+#ifdef USE_SOURCE_CACHE
+ /*
+ * Parse settings when this HText was generated.
+ */
+ BOOL clickable_images;
+ BOOL pseudo_inline_alts;
+ BOOL verbose_img;
+ BOOL raw_mode;
+ BOOL historical_comments;
+ BOOL minimal_comments;
+ BOOL soft_dquotes;
+ short old_dtd;
+ short keypad_mode;
+ short disp_lines; /* Screen size */
+ short disp_cols; /* Used for reports only */
+#endif
+};
+
+/* exported */
+void *HText_pool_calloc(HText *text, unsigned size)
+{
+ return (void *) ALLOC_IN_POOL(&text->pool, size);
+}
+
+static void HText_AddHiddenLink(HText *text, TextAnchor *textanchor);
+
+#ifdef USE_JUSTIFY_ELTS
+BOOL can_justify_here;
+BOOL can_justify_here_saved;
+
+BOOL can_justify_this_line; /* =FALSE if line contains form objects */
+int wait_for_this_stacked_elt; /* -1 if can justify contents of the
+
+ element on the op of stack. If positive - specifies minimal stack depth
+ plus 1 at which we can justify element (can be MAX_LINE+2 if
+ ok_justify ==FALSE or in psrcview. */
+BOOL form_in_htext; /*to indicate that we are in form (since HTML_FORM is
+
+ not stacked in the HTML.c */
+BOOL in_DT = FALSE;
+
+#ifdef DEBUG_JUSTIFY
+BOOL can_justify_stack_depth; /* can be 0 or 1 if all code is correct */
+#endif
+
+typedef struct {
+ int byte_len; /*length in bytes */
+ int cell_len; /*length in cells */
+} ht_run_info;
+
+static int justify_start_position; /* this is an index of char from which
+
+ justification can start (eg after "* " preceding <li> text) */
+
+static int ht_num_runs; /*the number of runs filled */
+static ht_run_info ht_runs[MAX_LINE];
+static BOOL this_line_was_split;
+static TextAnchor *last_anchor_of_previous_line;
+static BOOL have_raw_nbsps = FALSE;
+
+void ht_justify_cleanup(void)
+{
+ wait_for_this_stacked_elt = !ok_justify
+# ifdef USE_PRETTYSRC
+ || psrc_view
+# endif
+ ? 30000 /*MAX_NESTING */ + 2 /*some unreachable value */
+ : -1;
+ can_justify_here = TRUE;
+ can_justify_this_line = TRUE;
+ form_in_htext = FALSE;
+
+ last_anchor_of_previous_line = NULL;
+ this_line_was_split = FALSE;
+ in_DT = FALSE;
+ have_raw_nbsps = FALSE;
+}
+
+void mark_justify_start_position(void *text)
+{
+ if (text && ((HText *) text)->last_line)
+ justify_start_position = ((HText *) text)->last_line->size;
+}
+
+#define REALLY_CAN_JUSTIFY(text) ( (wait_for_this_stacked_elt<0) && \
+ ( text->style->alignment == HT_LEFT || \
+ text->style->alignment == HT_JUSTIFY) && \
+ !IS_CJK_TTY && !in_DT && \
+ can_justify_here && can_justify_this_line && !form_in_htext )
+
+#endif /* USE_JUSTIFY_ELTS */
+
+/*
+ * Boring static variable used for moving cursor across
+ */
+#define UNDERSCORES(n) \
+ ((n) >= MAX_LINE ? underscore_string : &underscore_string[(MAX_LINE-1)] - (n))
+
+static char underscore_string[MAX_LINE + 1];
+char star_string[MAX_LINE + 1];
+
+static int ctrl_chars_on_this_line = 0; /* num of ctrl chars in current line */
+static int utfxtra_on_this_line = 0; /* num of UTF-8 extra bytes in line,
+ they *also* count as ctrl chars. */
+#ifdef EXP_WCWIDTH_SUPPORT
+static int utfxtracells_on_this_line = 0; /* num of UTF-8 extra cells in line */
+#endif
+
+#ifdef WIDEC_CURSES
+# ifdef EXP_WCWIDTH_SUPPORT /* TODO: support for !WIDEC_CURSES */
+#define UTFXTRA_ON_THIS_LINE utfxtracells_on_this_line
+# else
+#define UTFXTRA_ON_THIS_LINE 0
+# endif
+#else
+#define UTFXTRA_ON_THIS_LINE utfxtra_on_this_line
+#endif
+
+static HTStyle default_style =
+{0, NULL, "(Unstyled)", 0, NULL, "",
+ (HTFont) 0, 1, HT_BLACK, 0, 0,
+ 0, 0, 0, HT_LEFT, 1, 0, 0,
+ NO, NO, 0, 0, 0};
+
+static HTList *loaded_texts = NULL; /* A list of all those in memory */
+HTList *search_queries = NULL; /* isindex and whereis queries */
+
+#ifdef LY_FIND_LEAKS
+static void free_all_texts(void);
+#endif
+
+static BOOL HText_TrueEmptyLine(HTLine *line, HText *text, int IgnoreSpaces);
+
+static int HText_TrueLineSize(HTLine *line, HText *text, int IgnoreSpaces);
+
+#ifdef CHECK_FREE_MEM
+
+/*
+ * text->halted = 1: have set fake 'Z' and output a message
+ * 2: next time when HText_appendCharacter is called
+ * it will append *** MEMORY EXHAUSTED ***, then set
+ * to 3.
+ * 3: normal text output will be suppressed (but not anchors,
+ * form fields etc.)
+ */
+static void HText_halt(void)
+{
+ if (HTFormNumber > 0)
+ HText_DisableCurrentForm();
+ if (!HTMainText)
+ return;
+ if (HTMainText->halted < 2)
+ HTMainText->halted = 2;
+}
+
+#define MIN_NEEDED_MEM 5000
+
+/*
+ * Check whether factor*min(bytes,MIN_NEEDED_MEM) is available,
+ * or bytes if factor is 0.
+ * MIN_NEEDED_MEM and factor together represent a security margin,
+ * to take account of all the memory allocations where we don't check
+ * and of buffers which may be emptied before HTCheckForInterupt()
+ * is (maybe) called and other things happening, with some chance of
+ * success.
+ * This just tries to malloc() the to-be-checked-for amount of memory,
+ * which might make the situation worse depending how allocation works.
+ * There should be a better way... - kw
+ */
+static BOOL mem_is_avail(int factor, size_t bytes)
+{
+ void *p;
+
+ if (bytes < MIN_NEEDED_MEM && factor > 0)
+ bytes = MIN_NEEDED_MEM;
+ if (factor == 0)
+ factor = 1;
+ p = malloc((size_t) factor * bytes);
+ if (p) {
+ FREE(p);
+ return YES;
+ } else {
+ return NO;
+ }
+}
+
+/*
+ * Replacement for calloc which checks for "enough" free memory
+ * (with some security margins) and tries various recovery actions
+ * if deemed necessary. - kw
+ */
+static void *LY_check_calloc(size_t nmemb, size_t size)
+{
+ int i, n;
+
+ if (mem_is_avail(4, nmemb * size)) {
+ return (calloc(nmemb, size));
+ }
+ n = HTList_count(loaded_texts);
+ for (i = n - 1; i > 0; i--) {
+ HText *t = (HText *) HTList_objectAt(loaded_texts, i);
+
+ CTRACE((tfp,
+ "\nBUG *** Emergency freeing document %d/%d for '%s'%s!\n",
+ i + 1, n,
+ ((t && t->node_anchor &&
+ t->node_anchor->address) ?
+ t->node_anchor->address : "unknown anchor"),
+ ((t && t->node_anchor &&
+ t->node_anchor->post_data) ?
+ " with POST data" : "")));
+ HTList_removeObjectAt(loaded_texts, i);
+ HText_free(t);
+ if (mem_is_avail(4, nmemb * size)) {
+ return (calloc(nmemb, size));
+ }
+ }
+ LYFakeZap(YES);
+ if (!HTMainText || HTMainText->halted <= 1) {
+ if (!mem_is_avail(2, nmemb * size)) {
+ HText_halt();
+ if (mem_is_avail(0, (size_t) 700)) {
+ HTAlert(gettext("Memory exhausted, display interrupted!"));
+ }
+ } else {
+ if ((!HTMainText || HTMainText->halted == 0) &&
+ mem_is_avail(0, (size_t) 700)) {
+ HTAlert(gettext("Memory exhausted, will interrupt transfer!"));
+ if (HTMainText)
+ HTMainText->halted = 1;
+ }
+ }
+ }
+ return (calloc(nmemb, size));
+}
+
+#endif /* CHECK_FREE_MEM */
+
+#ifdef EXP_WCWIDTH_SUPPORT
+static int utfextracells(const char *s)
+{
+ UCode_t ucs = UCGetUniFromUtf8String(&s);
+ int result = 0;
+
+ if (ucs > 0) {
+ int cells = wcwidth((wchar_t) ucs);
+
+ if (cells > 1)
+ result = (cells - 1);
+ }
+ return result;
+}
+
+static void permit_split_after_CJchar(HText *text, const char *s, unsigned short pos)
+{
+ /* Can split after almost any CJ char (Korean uses space) */
+ /* TODO: UAX#14 Unicode Line Breaking Algorithm (use ICU4C?) */
+ if (isUTF8CJChar(s))
+ text->permissible_split = pos;
+}
+#endif /* EXP_WCWIDTH_SUPPORT */
+
+#if defined(EXP_WCWIDTH_SUPPORT) || defined(EXP_JAPANESE_SPACES)
+BOOL isUTF8CJChar(const char *s)
+{
+ UCode_t u = UCGetUniFromUtf8String(&s);
+
+ if ((u >= 0x4e00 && u <= 0x9fff) || /* CJK Unified Ideographs */
+ (u >= 0x3000 && u <= 0x30ff) || /* CJK Symbols and Punctuation, Hiragana, Katakana */
+ (u >= 0xff00 && u <= 0xffef) || /* Halfwidth and Fullwidth Forms. Fullwidth ?! are often used */
+ /* rare characters */
+ (u >= 0x3400 && u <= 0x4dbf) || /* CJK Unified Ideographs Extension A */
+ (u >= 0xf900 && u <= 0xfaff) || /* CJK Compatibility Ideographs */
+ (u >= 0x20000 && u <= 0x3ffff)) /* {Supplementary,Tertiary} Ideographic Plane */
+ return YES;
+ return NO;
+}
+#endif /* EXP_WCWIDTH_SUPPORT || EXP_JAPANESE_SPACES */
+
+#ifdef USE_COLOR_STYLE
+/*
+ * Color style information is stored with the multibyte-character offset into
+ * the string at which the style would apply. Compute the corresponding column
+ * so we can compare it with the updated column value after writing strings
+ * with curses.
+ *
+ * The offsets count multibyte characters. Other parts of the code assume each
+ * character uses one cell, but some CJK (or UTF-8) codes use two cells. We
+ * need to know the number of cells.
+ */
+static int StyleToCols(HText *text, HTLine *line, int nstyle)
+{
+ int result = line->offset; /* this much is spaces one byte/cell */
+ int nchars = line->styles[nstyle].sc_horizpos;
+ char *data = line->data;
+ char *last = line->size + data;
+ int utf_extra;
+
+ while (nchars > 0 && data < last) {
+ if (IsSpecialAttrChar(*data) && *data != LY_SOFT_NEWLINE) {
+ ++data;
+ } else {
+ utf_extra = (int) utf8_length(text->T.output_utf8, data);
+ if (utf_extra++) {
+ result += LYstrExtent(data, utf_extra, 2);
+ data += utf_extra;
+ } else if (is_CJK2(*data)) {
+ data += 2;
+ result += 2;
+ } else {
+ ++data;
+ ++result;
+ }
+ --nchars;
+ }
+ }
+
+ return result;
+}
+#endif
+
+/*
+ * Clear highlight information for a given anchor
+ * (text was allocated in the pool).
+ */
+static void LYClearHiText(TextAnchor *a)
+{
+ a->lites.hl_info = NULL;
+ a->lites.hl_base.hl_text = NULL;
+ a->lites.hl_len = 0;
+}
+
+#define LYFreeHiText(a) FREE((a)->lites.hl_info)
+
+/*
+ * Set the initial highlight information for a given anchor.
+ */
+static void LYSetHiText(TextAnchor *a,
+ const char *text,
+ unsigned len)
+{
+ if (text != NULL) {
+ POOLallocstring(a->lites.hl_base.hl_text, len + 1);
+ memcpy(a->lites.hl_base.hl_text, text, (size_t) len);
+ *(a->lites.hl_base.hl_text + len) = '\0';
+
+ a->lites.hl_len = 1;
+ }
+}
+
+/*
+ * Add highlight information for the next line of a anchor.
+ */
+static void LYAddHiText(TextAnchor *a,
+ const char *text,
+ int x)
+{
+ HiliteInfo *have = a->lites.hl_info;
+ size_t need = (unsigned) (a->lites.hl_len - 1);
+ size_t want;
+
+ a->lites.hl_len = (short) (a->lites.hl_len + 1);
+ want = (size_t) (a->lites.hl_len) * sizeof(HiliteInfo);
+ if (have != NULL) {
+ have = (HiliteInfo *) realloc(have, want);
+ } else {
+ have = (HiliteInfo *) malloc(want);
+ }
+ a->lites.hl_info = have;
+
+ POOLallocstring(have[need].hl_text, strlen(text) + 1);
+ strcpy(have[need].hl_text, text);
+ have[need].hl_x = (short) x;
+}
+
+/*
+ * Return an offset to skip leading blanks in the highlighted link. That is
+ * needed to avoid having the color-style paint the leading blanks.
+ */
+#ifdef USE_COLOR_STYLE
+static int LYAdjHiTextPos(TextAnchor *a, int count)
+{
+ char *result;
+
+ if (count >= a->lites.hl_len)
+ result = NULL;
+ else if (count > 0)
+ result = a->lites.hl_info[count - 1].hl_text;
+ else
+ result = a->lites.hl_base.hl_text;
+
+ return (result != NULL) ? (int) (LYSkipBlanks(result) - result) : 0;
+}
+
+#else
+#define LYAdjHiTextPos(a,count) 0
+#endif
+
+/*
+ * Get the highlight text, counting from zero.
+ */
+static char *LYGetHiTextStr(TextAnchor *a, int count)
+{
+ char *result;
+
+ if (count >= a->lites.hl_len)
+ result = NULL;
+ else if (count > 0)
+ result = a->lites.hl_info[count - 1].hl_text;
+ else
+ result = a->lites.hl_base.hl_text;
+ result += LYAdjHiTextPos(a, count);
+ return result;
+}
+
+/*
+ * Get the X-ordinate at which to draw the corresponding highlight-text
+ */
+static int LYGetHiTextPos(TextAnchor *a, int count)
+{
+ int result;
+
+ if (count >= a->lites.hl_len)
+ result = -1;
+ else if (count > 0)
+ result = a->lites.hl_info[count - 1].hl_x;
+ else
+ result = a->line_pos;
+ result += LYAdjHiTextPos(a, count);
+ return result;
+}
+
+/*
+ * Copy highlighting information from anchor 'b' to 'a'.
+ */
+static void LYCopyHiText(TextAnchor *a, TextAnchor *b)
+{
+ int count;
+ char *s;
+
+ LYClearHiText(a);
+ for (count = 0;; ++count) {
+ if ((s = LYGetHiTextStr(b, count)) == NULL)
+ break;
+ if (count == 0) {
+ LYSetHiText(a, s, (unsigned) strlen(s));
+ } else {
+ LYAddHiText(a, s, LYGetHiTextPos(b, count));
+ }
+ }
+}
+
+static void HText_getChartransInfo(HText *me)
+{
+ me->UCLYhndl = HTAnchor_getUCLYhndl(me->node_anchor, UCT_STAGE_HTEXT);
+ if (me->UCLYhndl < 0) {
+ int chndl = current_char_set;
+
+ HTAnchor_setUCInfoStage(me->node_anchor, chndl,
+ UCT_STAGE_HTEXT, UCT_SETBY_STRUCTURED);
+ me->UCLYhndl = HTAnchor_getUCLYhndl(me->node_anchor,
+ UCT_STAGE_HTEXT);
+ }
+ me->UCI = HTAnchor_getUCInfoStage(me->node_anchor, UCT_STAGE_HTEXT);
+}
+
+static void PerFormInfo_free(PerFormInfo * form)
+{
+ if (form) {
+ FREE(form->data.submit_action);
+ FREE(form->data.submit_enctype);
+ FREE(form->data.submit_title);
+ FREE(form->accept_cs);
+ FREE(form->thisacceptcs);
+ FREE(form);
+ }
+}
+
+static void free_form_fields(FormInfo * input_field)
+{
+ /*
+ * Free form fields.
+ */
+ if (input_field->type == F_OPTION_LIST_TYPE &&
+ input_field->select_list != NULL) {
+ /*
+ * Free off option lists if present.
+ * It should always be present for F_OPTION_LIST_TYPE
+ * unless we had invalid markup which prevented
+ * HText_setLastOptionValue from finishing its job
+ * and left the input field in an insane state. - kw
+ */
+ OptionType *optptr = input_field->select_list;
+ OptionType *tmp;
+
+ while (optptr) {
+ tmp = optptr;
+ optptr = tmp->next;
+ FREE(tmp->name);
+ FREE(tmp->cp_submit_value);
+ FREE(tmp);
+ }
+ input_field->select_list = NULL;
+ /*
+ * Don't free the value field on option
+ * lists since it points to a option value
+ * same for orig value.
+ */
+ input_field->value = NULL;
+ input_field->orig_value = NULL;
+ input_field->cp_submit_value = NULL;
+ input_field->orig_submit_value = NULL;
+ } else {
+ FREE(input_field->value);
+ FREE(input_field->orig_value);
+ FREE(input_field->cp_submit_value);
+ FREE(input_field->orig_submit_value);
+ }
+ FREE(input_field->name);
+ FREE(input_field->submit_action);
+ FREE(input_field->submit_enctype);
+ FREE(input_field->submit_title);
+
+ FREE(input_field->accept_cs);
+}
+
+static void FormList_delete(HTList *forms)
+{
+ HTList *cur = forms;
+ PerFormInfo *form;
+
+ while ((form = (PerFormInfo *) HTList_nextObject(cur)) != NULL)
+ PerFormInfo_free(form);
+ HTList_delete(forms);
+}
+
+#ifdef DISP_PARTIAL
+static void ResetPartialLinenos(HText *text)
+{
+ if (text != 0) {
+ text->first_lineno_last_disp_partial = -1;
+ text->last_lineno_last_disp_partial = -1;
+ }
+}
+#endif
+
+/* Creation Method
+ * ---------------
+ */
+HText *HText_new(HTParentAnchor *anchor)
+{
+#if defined(VMS) && defined(VAXC) && !defined(__DECC)
+#include <lib$routines.h>
+ int status, VMType = 3, VMTotal;
+#endif /* VMS && VAXC && !__DECC */
+ HTLine *line = NULL;
+ HText *self = typecalloc(HText);
+
+ if (!self)
+ outofmem(__FILE__, "HText_New");
+
+ CTRACE((tfp, "GridText: start HText_new\n"));
+
+#if defined(VMS) && defined (VAXC) && !defined(__DECC)
+ status = lib$stat_vm(&VMType, &VMTotal);
+ CTRACE((tfp, "GridText: VMTotal = %d\n", VMTotal));
+#endif /* VMS && VAXC && !__DECC */
+
+ /*
+ * If the previously shown text had UTF-8 characters on screen,
+ * remember this in the newly created object. Do this now, before
+ * the previous object may become invalid. - kw
+ */
+ if (HTMainText) {
+ self->had_utf8 = HTMainText->has_utf8;
+ HTMainText->has_utf8 = NO;
+ }
+
+ if (!loaded_texts) {
+ loaded_texts = HTList_new();
+#ifdef LY_FIND_LEAKS
+ atexit(free_all_texts);
+#endif
+ }
+
+ /*
+ * Links between anchors & documents are a 1-1 relationship. If
+ * an anchor is already linked to a document we didn't call
+ * HTuncache_current_document(), so we'll check now
+ * and free it before reloading. - Dick Wesseling (ftu@fi.ruu.nl)
+ */
+ if (anchor->document) {
+ HTList_removeObject(loaded_texts, anchor->document);
+ CTRACE((tfp, "GridText: Auto-uncaching\n"));
+
+ HTAnchor_delete_links(anchor);
+ ((HText *) anchor->document)->node_anchor = NULL;
+ HText_free((HText *) anchor->document);
+ anchor->document = NULL;
+ }
+
+ HTList_addObject(loaded_texts, self);
+#if defined(VMS) && defined(VAXC) && !defined(__DECC)
+ while (HTList_count(loaded_texts) > HTCacheSize &&
+ VMTotal > HTVirtualMemorySize)
+#else
+ if (HTList_count(loaded_texts) > HTCacheSize)
+#endif /* VMS && VAXC && !__DECC */
+ {
+ CTRACE((tfp, "GridText: Freeing off cached doc.\n"));
+ HText_free((HText *) HTList_removeFirstObject(loaded_texts));
+#if defined(VMS) && defined (VAXC) && !defined(__DECC)
+ status = lib$stat_vm(&VMType, &VMTotal);
+ CTRACE((tfp, "GridText: VMTotal reduced to %d\n", VMTotal));
+#endif /* VMS && VAXC && !__DECC */
+ }
+
+ self->pool = POOL_NEW();
+ if (!self->pool)
+ outofmem(__FILE__, "HText_New");
+
+ line = self->last_line = TEMP_LINE(self, 0);
+ line->next = line->prev = line;
+ line->offset = line->size = 0;
+ line->data[line->size] = '\0';
+#ifdef USE_COLOR_STYLE
+ line->numstyles = 0;
+ line->styles = stylechanges_buffers[0];
+#endif
+ self->Lines = 0;
+ self->first_anchor = self->last_anchor = NULL;
+ self->last_anchor_before_split = NULL;
+ self->style = &default_style;
+ self->top_of_screen = 0;
+ self->node_anchor = anchor;
+ self->last_anchor_number = 0; /* Numbering of them for references */
+ self->stale = YES;
+ self->toolbar = NO;
+ self->tabs = NULL;
+ self->next_number = 1;
+#ifdef USE_SOURCE_CACHE
+ /*
+ * Remember the parse settings.
+ */
+ self->clickable_images = clickable_images;
+ self->pseudo_inline_alts = pseudo_inline_alts;
+ self->verbose_img = verbose_img;
+ self->raw_mode = LYUseDefaultRawMode;
+ self->historical_comments = historical_comments;
+ self->minimal_comments = minimal_comments;
+ self->soft_dquotes = soft_dquotes;
+ self->old_dtd = (short) Old_DTD;
+ self->keypad_mode = (short) keypad_mode;
+ self->disp_lines = (short) LYlines;
+ self->disp_cols = (short) DISPLAY_COLS;
+#endif
+ /*
+ * If we are going to render the List Page, always merge in hidden
+ * links to get the numbering consistent if form fields are numbered
+ * and show up as hidden links in the list of links.
+ * If we are going to render a bookmark file, also always merge in
+ * hidden links, to get the link numbers consistent with the counting
+ * in remove_bookmark_link(). Normally a bookmark file shouldn't
+ * contain any entries with empty titles, but it might happen. - kw
+ */
+ if (anchor->bookmark ||
+ LYIsUIPage3(anchor->address, UIP_LIST_PAGE, 0) ||
+ LYIsUIPage3(anchor->address, UIP_ADDRLIST_PAGE, 0))
+ self->hiddenlinkflag = HIDDENLINKS_MERGE;
+ else
+ self->hiddenlinkflag = LYHiddenLinks;
+ self->hidden_links = NULL;
+ self->no_cache = (BOOLEAN) ((anchor->no_cache ||
+ anchor->post_data)
+ ? YES
+ : NO);
+#ifdef EXP_JAPANESE_SPACES
+ memset(self->LastChars, 0, sizeof(self->LastChars));
+#else
+ self->LastChar = '\0';
+#endif
+
+#ifndef USE_PRETTYSRC
+ if (HTOutputFormat == WWW_SOURCE)
+ self->source = YES;
+ else
+ self->source = NO;
+#else
+ /* mark_htext_as_source == TRUE if we are parsing html file (and psrc_view
+ * is set temporary to false at creation time)
+ *
+ * psrc_view == TRUE if source of the text produced by some lynx module
+ * (like ftp browsers) is requested). - VH
+ */
+ self->source = (BOOL) (LYpsrc
+ ? mark_htext_as_source || psrc_view
+ : HTOutputFormat == WWW_SOURCE);
+ mark_htext_as_source = FALSE;
+#endif
+ HTAnchor_setDocument(anchor, (HyperDoc *) self);
+ HTFormNumber = 0; /* no forms started yet */
+ HTMainText = self;
+ HTMainAnchor = anchor;
+ self->display_on_the_fly = 0;
+ self->kcode = NOKANJI;
+ self->specified_kcode = NOKANJI;
+#ifdef USE_TH_JP_AUTO_DETECT
+ self->detected_kcode = DET_NOTYET;
+ self->SJIS_status = SJIS_state_neutral;
+ self->EUC_status = EUC_state_neutral;
+#endif
+ self->state = S_text;
+ self->kanji_buf = '\0';
+ self->in_sjis = 0;
+ self->have_8bit_chars = NO;
+ HText_getChartransInfo(self);
+ UCSetTransParams(&self->T,
+ self->UCLYhndl, self->UCI,
+ current_char_set,
+ &LYCharSet_UC[current_char_set]);
+
+ /*
+ * Check the kcode setting if the anchor has a charset element. -FM
+ */
+ HText_setKcode(self, anchor->charset,
+ HTAnchor_getUCInfoStage(anchor, UCT_STAGE_HTEXT));
+
+ /*
+ * Check to see if our underline and star_string need initialization
+ * if the underline is not filled with dots.
+ */
+ if (underscore_string[0] != '.') {
+ /*
+ * Create an array of dots for the UNDERSCORES macro. -FM
+ */
+ memset(underscore_string, '.', (size_t) (MAX_LINE - 1));
+ underscore_string[(MAX_LINE - 1)] = '\0';
+ underscore_string[MAX_LINE] = '\0';
+ /*
+ * Create an array of underscores for the STARS macro. -FM
+ */
+ memset(star_string, '_', (size_t) (MAX_LINE - 1));
+ star_string[(MAX_LINE - 1)] = '\0';
+ star_string[MAX_LINE] = '\0';
+ }
+
+ underline_on = FALSE; /* reset */
+ bold_on = FALSE;
+
+#ifdef DISP_PARTIAL
+ /*
+ * By this function we create HText object
+ * so we may start displaying the document while downloading. - LP
+ */
+ if (display_partial_flag) {
+ display_partial = TRUE; /* enable HTDisplayPartial() */
+ NumOfLines_partial = 0; /* initialize */
+ }
+
+ /*
+ * These two fields should only be set to valid line numbers
+ * by calls of display_page during partial displaying. This
+ * is just so that the FIRST display_page AFTER that can avoid
+ * repainting the same lines on the screen. - kw
+ */
+ ResetPartialLinenos(self);
+#endif
+
+#ifdef USE_JUSTIFY_ELTS
+ ht_justify_cleanup();
+#endif
+ return self;
+}
+
+/* Creation Method 2
+ * ---------------
+ *
+ * Stream is assumed open and left open.
+ */
+HText *HText_new2(HTParentAnchor *anchor,
+ HTStream *stream)
+{
+ HText *result = HText_new(anchor);
+
+ if (stream) {
+ result->target = stream;
+ result->targetClass = *stream->isa; /* copy action procedures */
+ }
+ return result;
+}
+
+/* Free Entire Text
+ * ----------------
+ */
+void HText_free(HText *self)
+{
+ if (!self)
+ return;
+
+#if HTLINE_NOT_IN_POOL
+ {
+ HTLine *f = FirstHTLine(self);
+ HTLine *l = self->last_line;
+
+ while (l != f) { /* Free off line array */
+ self->last_line = l->prev;
+ freeHTLine(self, l);
+ l = self->last_line;
+ }
+ freeHTLine(self, f);
+ }
+#endif
+
+ while (self->first_anchor) { /* Free off anchor array */
+ TextAnchor *l = self->first_anchor;
+
+ self->first_anchor = l->next;
+
+ if (l->link_type == INPUT_ANCHOR && l->input_field) {
+ free_form_fields(l->input_field);
+ }
+
+ LYFreeHiText(l);
+ }
+ FormList_delete(self->forms);
+
+ /*
+ * Free the tabs list. -FM
+ */
+ if (self->tabs) {
+ HTTabID *Tab = NULL;
+ HTList *cur = self->tabs;
+
+ while (NULL != (Tab = (HTTabID *) HTList_nextObject(cur))) {
+ FREE(Tab->name);
+ FREE(Tab);
+ }
+ HTList_delete(self->tabs);
+ self->tabs = NULL;
+ }
+
+ /*
+ * Free the hidden links list. -FM
+ */
+ if (self->hidden_links) {
+ LYFreeStringList(self->hidden_links);
+ self->hidden_links = NULL;
+ }
+
+ /*
+ * Invoke HTAnchor_delete() to free the node_anchor
+ * if it is not a destination of other links. -FM
+ */
+ if (self->node_anchor) {
+ HTAnchor_resetUCInfoStage(self->node_anchor, -1, UCT_STAGE_STRUCTURED,
+ UCT_SETBY_NONE);
+ HTAnchor_resetUCInfoStage(self->node_anchor, -1, UCT_STAGE_HTEXT,
+ UCT_SETBY_NONE);
+#ifdef USE_SOURCE_CACHE
+ /* Remove source cache files and chunks always, even if the
+ * HTAnchor_delete call does not actually remove the anchor.
+ * Keeping them would just be a waste of space - they won't
+ * be used any more after the anchor has been disassociated
+ * from a HText structure. - kw
+ */
+ HTAnchor_clearSourceCache(self->node_anchor);
+#endif
+
+ HTAnchor_delete_links(self->node_anchor);
+
+ HTAnchor_setDocument(self->node_anchor, (HyperDoc *) 0);
+
+ if (HTAnchor_delete(self->node_anchor->parent))
+ /*
+ * Make sure HTMainAnchor won't point
+ * to an invalid structure. - KW
+ */
+ HTMainAnchor = NULL;
+ }
+
+ POOL_FREE(self->pool);
+ FREE(self);
+}
+
+/* Display Methods
+ * ---------------
+ */
+
+/* Output a line
+ * -------------
+ */
+static int display_line(HTLine *line,
+ HText *text,
+ int scrline GCC_UNUSED,
+ const char *target GCC_UNUSED)
+{
+ register int i, j;
+ char buffer[7];
+ char *data;
+ size_t utf_extra = 0;
+ char LastDisplayChar = ' ';
+
+#ifdef USE_COLOR_STYLE
+ int current_style = 0;
+
+#define inunderline NO
+#define inbold NO
+#else
+ BOOL inbold = NO, inunderline = NO;
+#endif
+#if defined(SHOW_WHEREIS_TARGETS) && !defined(USE_COLOR_STYLE)
+ const char *cp_tgt;
+ int i_start_tgt = 0, i_after_tgt;
+ int HitOffset, LenNeeded;
+ BOOL intarget = NO;
+
+#else
+#define intarget NO
+#endif /* SHOW_WHEREIS_TARGETS && !USE_COLOR_STYLE */
+
+#if !(defined(NCURSES_VERSION) || defined(WIDEC_CURSES))
+ text->has_utf8 = NO; /* use as per-line flag, except with ncurses */
+#endif
+
+#if defined(WIDEC_CURSES)
+ /*
+ * FIXME: this should not be necessary, but in some wide-character pages
+ * the output line wraps, foiling our attempt to just use newlines to
+ * advance to the next page.
+ */
+ LYmove(scrline + (no_title ? 0 : TITLE_LINES) - 1, 0);
+#endif
+
+ /*
+ * Set up the multibyte character buffer,
+ * and clear the line to which we will be
+ * writing.
+ */
+ buffer[0] = buffer[1] = buffer[2] = '\0';
+ LYclrtoeol();
+
+ /*
+ * Add offset, making sure that we do not
+ * go over the COLS limit on the display.
+ */
+ j = (int) line->offset;
+ if (j >= DISPLAY_COLS)
+ j = DISPLAY_COLS - 1;
+#ifdef USE_SLANG
+ SLsmg_forward(j);
+ i = j;
+#else
+#ifdef USE_COLOR_STYLE
+ if (line->size == 0)
+ i = j;
+ else
+#endif
+ for (i = 0; i < j; i++)
+ LYaddch(' ');
+#endif /* USE_SLANG */
+
+ /*
+ * Add the data, making sure that we do not
+ * go over the COLS limit on the display.
+ */
+ data = line->data;
+ i++;
+
+#ifndef USE_COLOR_STYLE
+#if defined(SHOW_WHEREIS_TARGETS)
+ /*
+ * If the target is on this line, it will be emphasized.
+ */
+ i_after_tgt = i;
+ if (target) {
+ cp_tgt = LYno_attr_mb_strstr(data,
+ target,
+ text->T.output_utf8, YES,
+ &HitOffset,
+ &LenNeeded);
+ if (cp_tgt) {
+ if (((int) line->offset + LenNeeded) >= DISPLAY_COLS) {
+ cp_tgt = NULL;
+ } else {
+ text->page_has_target = YES;
+ i_start_tgt = i + HitOffset;
+ i_after_tgt = i + LenNeeded;
+ }
+ }
+ } else {
+ cp_tgt = NULL;
+ }
+#endif /* SHOW_WHEREIS_TARGETS */
+#endif /* USE_COLOR_STYLE */
+
+ while ((i <= DISPLAY_COLS) && ((buffer[0] = *data) != '\0')) {
+
+#ifndef USE_COLOR_STYLE
+#if defined(SHOW_WHEREIS_TARGETS)
+ if (cp_tgt && i >= i_after_tgt) {
+ if (intarget) {
+ cp_tgt = LYno_attr_mb_strstr(data,
+ target,
+ text->T.output_utf8, YES,
+ &HitOffset,
+ &LenNeeded);
+ if (cp_tgt) {
+ i_start_tgt = i + HitOffset;
+ i_after_tgt = i + LenNeeded;
+ }
+ if (!cp_tgt || i_start_tgt != i) {
+ LYstopTargetEmphasis();
+ intarget = NO;
+ if (inbold)
+ lynx_start_bold();
+ if (inunderline)
+ lynx_start_underline();
+ }
+ }
+ }
+#endif /* SHOW_WHEREIS_TARGETS */
+#endif /* USE_COLOR_STYLE */
+
+ data++;
+
+#if defined(USE_COLOR_STYLE)
+#define CStyle line->styles[current_style]
+
+ while (current_style < line->numstyles &&
+ i >= (int) (CStyle.sc_horizpos + line->offset + 1)) {
+ LynxChangeStyle(CStyle.sc_style, CStyle.sc_direction);
+ current_style++;
+ }
+#endif
+ switch (buffer[0]) {
+
+#ifndef USE_COLOR_STYLE
+ case LY_UNDERLINE_START_CHAR:
+ if (dump_output_immediately && use_underscore) {
+ LYaddch('_');
+ i++;
+ } else {
+ inunderline = YES;
+ if (!intarget) {
+#if defined(PDCURSES)
+ if (LYShowColor == SHOW_COLOR_NEVER)
+ lynx_start_bold();
+ else
+ lynx_start_underline();
+#else
+ lynx_start_underline();
+#endif /* PDCURSES */
+ }
+ }
+ break;
+
+ case LY_UNDERLINE_END_CHAR:
+ if (dump_output_immediately && use_underscore) {
+ LYaddch('_');
+ i++;
+ } else {
+ inunderline = NO;
+ if (!intarget) {
+#if defined(PDCURSES)
+ if (LYShowColor == SHOW_COLOR_NEVER)
+ lynx_stop_bold();
+ else
+ lynx_stop_underline();
+#else
+ lynx_stop_underline();
+#endif /* PDCURSES */
+ }
+ }
+ break;
+
+ case LY_BOLD_START_CHAR:
+ inbold = YES;
+ if (!intarget)
+ lynx_start_bold();
+ break;
+
+ case LY_BOLD_END_CHAR:
+ inbold = NO;
+ if (!intarget)
+ lynx_stop_bold();
+ break;
+
+#endif /* !USE_COLOR_STYLE */
+ case LY_SOFT_NEWLINE:
+ if (!dump_output_immediately) {
+ LYaddch('+');
+ i++;
+#if defined(SHOW_WHEREIS_TARGETS) && !defined(USE_COLOR_STYLE)
+ i_after_tgt++;
+#endif
+ }
+ break;
+
+ case LY_SOFT_HYPHEN:
+ if (*data != '\0' ||
+ isspace(UCH(LastDisplayChar)) ||
+ LastDisplayChar == '-') {
+ /*
+ * Ignore the soft hyphen if it is not the last character in
+ * the line. Also ignore it if is first character following
+ * the margin, or if it is preceded by a white character (we
+ * loaded 'M' into LastDisplayChar if it was a multibyte
+ * character) or hyphen, though it should have been excluded by
+ * HText_appendCharacter() or by split_line() in those cases.
+ * -FM
+ */
+ break;
+ } else {
+ /*
+ * Make it a hard hyphen and fall through. -FM
+ */
+ buffer[0] = '-';
+ }
+ /* FALLTHRU */
+
+ default:
+#ifndef USE_COLOR_STYLE
+#if defined(SHOW_WHEREIS_TARGETS)
+ if (!intarget && cp_tgt && i >= i_start_tgt) {
+ /*
+ * Start the emphasis.
+ */
+ if (data > cp_tgt) {
+ LYstartTargetEmphasis();
+ intarget = YES;
+ }
+ }
+#endif /* SHOW_WHEREIS_TARGETS */
+#endif /* USE_COLOR_STYLE */
+ if (text->T.output_utf8 && is8bits(buffer[0])) {
+ text->has_utf8 = YES;
+ utf_extra = utf8_length(text->T.output_utf8, data - 1);
+ LastDisplayChar = 'M';
+ }
+ if (utf_extra) {
+ LYStrNCpy(&buffer[1], data, utf_extra);
+ LYaddstr(buffer);
+ buffer[1] = '\0';
+ data += utf_extra;
+ utf_extra = 0;
+ } else if (is_CJK2(buffer[0])) {
+ /*
+ * For CJK strings, by Masanobu Kimura.
+ */
+ if (i <= DISPLAY_COLS) {
+ buffer[1] = *data;
+ buffer[2] = '\0';
+ data++;
+ i++;
+ LYaddstr(buffer);
+ buffer[1] = '\0';
+ /*
+ * For now, load 'M' into LastDisplayChar, but we should
+ * check whether it's white and if so, use ' '. I don't
+ * know if there actually are white CJK characters, and
+ * we're loading ' ' for multibyte spacing characters in
+ * this code set, but this will become an issue when the
+ * development code set's multibyte character handling is
+ * used. -FM
+ */
+ LastDisplayChar = 'M';
+#ifndef USE_SLANG
+ {
+ int y, x;
+
+ getyx(LYwin, y, x);
+ (void) y;
+ if (x >= DISPLAY_COLS || x == 0)
+ break;
+ }
+#endif
+ }
+ } else {
+ LYaddstr(buffer);
+ LastDisplayChar = buffer[0];
+ }
+ i++;
+ } /* end of switch */
+ } /* end of while */
+
+#if !(defined(NCURSES_VERSION) || defined(WIDEC_CURSES))
+ if (text->has_utf8) {
+ LYtouchline(scrline);
+ text->has_utf8 = NO; /* we had some, but have dealt with it. */
+ }
+#endif
+ /*
+ * Add the return.
+ */
+ LYaddch('\n');
+
+#if defined(SHOW_WHEREIS_TARGETS) && !defined(USE_COLOR_STYLE)
+ if (intarget)
+ LYstopTargetEmphasis();
+#else
+#undef intarget
+#endif /* SHOW_WHEREIS_TARGETS && !USE_COLOR_STYLE */
+#ifndef USE_COLOR_STYLE
+ lynx_stop_underline();
+ lynx_stop_bold();
+#else
+ while (current_style < line->numstyles) {
+ LynxChangeStyle(CStyle.sc_style, CStyle.sc_direction);
+ current_style++;
+ }
+#undef CStyle
+#endif
+ return (0);
+}
+
+/* Output the title line
+ * ---------------------
+ */
+static void display_title(HText *text)
+{
+ char *title = NULL;
+ char percent[40];
+ unsigned char *tmp = NULL;
+ int i = 0, j = 0;
+ int limit;
+
+#ifdef USE_COLOR_STYLE
+ int toolbar = 0;
+#endif
+
+ /*
+ * Make sure we have a text structure. -FM
+ */
+ if (!text)
+ return;
+
+ lynx_start_title_color();
+#ifdef USE_COLOR_STYLE
+/* turn the TITLE style on */
+ if (last_colorattr_ptr > 0) {
+ LynxChangeStyle(s_title, STACK_ON);
+ } else {
+ LynxChangeStyle(s_title, ABS_ON);
+ }
+#endif /* USE_COLOR_STYLE */
+
+ /*
+ * Load the title field. -FM
+ */
+ StrAllocCopy(title,
+ (HTAnchor_title(text->node_anchor) ?
+ HTAnchor_title(text->node_anchor) : " ")); /* "" -> " " */
+ LYReduceBlanks(title);
+
+ /*
+ * Generate the page indicator (percent) string.
+ */
+ limit = LYscreenWidth();
+ if (limit < 10) {
+ percent[0] = '\0';
+ } else if ((display_lines) <= 0 && LYlines > 0 &&
+ text->top_of_screen <= 99999 && text->Lines <= 999999) {
+ sprintf(percent, gettext(" (l%d of %d)"),
+ text->top_of_screen, text->Lines);
+ } else if ((text->Lines >= display_lines) && (display_lines > 0)) {
+ int total_pages = ((text->Lines + display_lines)
+ / display_lines);
+ int start_of_last_page = ((text->Lines <= display_lines)
+ ? 0
+ : (text->Lines - display_lines));
+
+ sprintf(percent, gettext(" (p%d of %d)"),
+ ((text->top_of_screen > start_of_last_page)
+ ? total_pages
+ : ((text->top_of_screen + display_lines) / (display_lines))),
+ total_pages);
+ } else {
+ percent[0] = '\0';
+ }
+
+ /* Update the terminal-emulator title */
+ if (update_term_title) {
+ CTRACE((tfp, "update_term_title:%s\n", title));
+ fprintf(stderr, "\033]0;%s%sLynx\007", title, *title ? " - " : "");
+ fflush(stderr);
+ }
+
+ /*
+ * Generate and display the title string, with page indicator
+ * if appropriate, preceded by the toolbar token if appropriate,
+ * and truncated if necessary. -FM & KW
+ */
+ if (IS_CJK_TTY) {
+ if (*title &&
+ (tmp = typecallocn(unsigned char, (strlen(title) * 2 + 256)))) {
+ if (kanji_code == EUC) {
+ TO_EUC((unsigned char *) title, tmp);
+ } else if (kanji_code == SJIS) {
+ TO_SJIS((unsigned char *) title, tmp);
+ } else {
+ for (i = 0, j = 0; title[i]; i++) {
+ if (title[i] != CH_ESC) { /* S/390 -- gil -- 1487 */
+ tmp[j++] = UCH(title[i]);
+ }
+ }
+ tmp[j] = '\0';
+ }
+ StrAllocCopy(title, (const char *) tmp);
+ FREE(tmp);
+ }
+ }
+ LYmove(0, 0);
+ LYclrtoeol();
+#if defined(SH_EX) && defined(KANJI_CODE_OVERRIDE)
+ LYaddstr(str_kcode(last_kcode));
+#endif
+ if (HText_hasToolbar(text)) {
+ LYaddch('#');
+#ifdef USE_COLOR_STYLE
+ toolbar = 1;
+#endif
+ }
+#ifdef USE_COLOR_STYLE
+ if (s_forw_backw != NOSTYLE && user_mode != MINIMAL_MODE &&
+ (nhist || nhist_extra > 1)) {
+ chtype c = nhist ? ACS_LARROW : ' ';
+
+ /* turn the FORWBACKW.ARROW style on */
+ LynxChangeStyle(s_forw_backw, STACK_ON);
+ if (nhist) {
+ LYaddch(c);
+ LYaddch(c);
+ LYaddch(c);
+ } else
+ LYmove(0, 3 + toolbar);
+ if (nhist_extra > 1) {
+ LYaddch(ACS_RARROW);
+ LYaddch(ACS_RARROW);
+ LYaddch(ACS_RARROW);
+ }
+ LynxChangeStyle(s_forw_backw, STACK_OFF);
+ }
+#endif /* USE_COLOR_STYLE */
+#ifdef WIDEC_CURSES
+ i = limit - LYbarWidth - (int) strlen(percent) - LYstrCells(title);
+ if (i <= 0) { /* title is truncated */
+ i = limit - LYbarWidth - (int) strlen(percent) - 3;
+ if (i <= 0) { /* no room at all */
+ title[0] = '\0';
+ } else {
+ strcpy(title + LYstrFittable(title, i), "...");
+ }
+ i = 0;
+ }
+ LYmove(0, i);
+#else
+ i = (limit - 1) - (int) (strlen(percent) + strlen(title));
+ if (i >= CHAR_WIDTH) {
+ LYmove(0, i);
+ } else {
+ /*
+ * Truncation takes into account the possibility that
+ * multibyte characters might be present. -HS (H. Senshu)
+ */
+ int last;
+
+ last = (int) strlen(percent) + CHAR_WIDTH;
+ if (limit - 3 >= last) {
+ title[(limit - 3) - last] = '.';
+ title[(limit - 2) - last] = '.';
+ title[(limit - 1) - last] = '\0';
+ } else {
+ title[(limit - 1) - last] = '\0';
+ }
+ LYmove(0, CHAR_WIDTH);
+ }
+#endif
+ LYaddstr(title);
+ if (percent[0] != '\0')
+ LYaddstr(percent);
+ LYaddch('\n');
+ FREE(title);
+
+#if defined(USE_COLOR_STYLE) && defined(CAN_CUT_AND_PASTE)
+ if (s_hot_paste != NOSTYLE) { /* Only if the user set the style */
+ LYmove(0, LYcolLimit);
+ LynxChangeStyle(s_hot_paste, STACK_ON);
+ LYaddch(ACS_RARROW);
+ LynxChangeStyle(s_hot_paste, STACK_OFF);
+ LYmove(1, 0); /* As after \n */
+ }
+#endif /* USE_COLOR_STYLE */
+
+#ifdef USE_COLOR_STYLE
+/* turn the TITLE style off */
+ LynxChangeStyle(s_title, STACK_OFF);
+#endif /* USE_COLOR_STYLE */
+ lynx_stop_title_color();
+
+ return;
+}
+
+/* Output the scrollbar
+ * ---------------------
+ */
+#ifdef USE_SCROLLBAR
+static void display_scrollbar(HText *text)
+{
+ int i;
+ int h = display_lines - 2 * (LYsb_arrow != 0); /* Height of the scrollbar */
+ int off = (LYsb_arrow != 0); /* Start of the scrollbar */
+ int top_skip, bot_skip, sh, shown;
+
+ LYsb_begin = LYsb_end = -1;
+ if (!LYShowScrollbar || !text || h <= 2
+ || text->Lines <= display_lines)
+ return;
+
+ if (text->top_of_screen >= text->Lines - display_lines) {
+ /* Only part of the screen shows actual text */
+ shown = text->Lines - text->top_of_screen;
+
+ if (shown <= 0)
+ shown = 1;
+ } else
+ shown = display_lines;
+ /* Each cell of scrollbar represents text->Lines/h lines of text. */
+ /* Always smaller than h */
+ sh = (shown * h + text->Lines / 2) / text->Lines;
+ if (sh <= 0)
+ sh = 1;
+ if (sh >= h - 1)
+ sh = h - 2; /* Position at ends indicates BEG and END */
+
+ if (text->top_of_screen == 0)
+ top_skip = 0;
+ else if (text->Lines - (text->top_of_screen + display_lines - 1) <= 0)
+ top_skip = h - sh;
+ else {
+ /* text->top_of_screen between 1 and text->Lines - display_lines
+ corresponds to top_skip between 1 and h - sh - 1 */
+ /* Use rounding to get as many positions into top_skip==h - sh - 1
+ as into top_skip == 1:
+ 1--->1, text->Lines - display_lines + 1--->h - sh. */
+ top_skip = (int) (1 +
+ 1. * (h - sh - 1) * text->top_of_screen
+ / (text->Lines - display_lines + 1));
+ }
+ bot_skip = h - sh - top_skip;
+
+ LYsb_begin = top_skip;
+ LYsb_end = h - bot_skip;
+
+ if (LYsb_arrow) {
+#ifdef USE_COLOR_STYLE
+ int s = top_skip ? s_sb_aa : s_sb_naa;
+
+ if (last_colorattr_ptr > 0) {
+ LynxChangeStyle(s, STACK_ON);
+ } else {
+ LynxChangeStyle(s, ABS_ON);
+ }
+#endif /* USE_COLOR_STYLE */
+ LYmove(1, LYcolLimit + LYshiftWin);
+ addch_raw(ACS_UARROW);
+#ifdef USE_COLOR_STYLE
+ LynxChangeStyle(s, STACK_OFF);
+#endif /* USE_COLOR_STYLE */
+ }
+#ifdef USE_COLOR_STYLE
+ if (last_colorattr_ptr > 0) {
+ LynxChangeStyle(s_sb_bg, STACK_ON);
+ } else {
+ LynxChangeStyle(s_sb_bg, ABS_ON);
+ }
+#endif /* USE_COLOR_STYLE */
+
+ for (i = 1; i <= h; i++) {
+#ifdef USE_COLOR_STYLE
+ if (i - 1 <= top_skip && i > top_skip)
+ LynxChangeStyle(s_sb_bar, STACK_ON);
+ if (i - 1 <= h - bot_skip && i > h - bot_skip)
+ LynxChangeStyle(s_sb_bar, STACK_OFF);
+#endif /* USE_COLOR_STYLE */
+ LYmove(i + off, LYcolLimit + LYshiftWin);
+ if (i > top_skip && i <= h - bot_skip) {
+ LYaddch(ACS_BLOCK);
+ } else {
+ LYaddch(ACS_CKBOARD);
+ }
+ }
+#ifdef USE_COLOR_STYLE
+ LynxChangeStyle(s_sb_bg, STACK_OFF);
+#endif /* USE_COLOR_STYLE */
+
+ if (LYsb_arrow) {
+#ifdef USE_COLOR_STYLE
+ int s = bot_skip ? s_sb_aa : s_sb_naa;
+
+ if (last_colorattr_ptr > 0) {
+ LynxChangeStyle(s, STACK_ON);
+ } else {
+ LynxChangeStyle(s, ABS_ON);
+ }
+#endif /* USE_COLOR_STYLE */
+ LYmove(h + 2, LYcolLimit + LYshiftWin);
+ addch_raw(ACS_DARROW);
+#ifdef USE_COLOR_STYLE
+ LynxChangeStyle(s, STACK_OFF);
+#endif /* USE_COLOR_STYLE */
+ }
+ return;
+}
+#else
+#define display_scrollbar(text) /*nothing */
+#endif /* USE_SCROLLBAR */
+
+/* Output a page
+ * -------------
+ */
+static void display_page(HText *text,
+ int line_number,
+ const char *target)
+{
+ HTLine *line = NULL;
+ int i;
+ int title_lines = TITLE_LINES;
+
+#if defined(USE_COLOR_STYLE) && defined(SHOW_WHEREIS_TARGETS)
+ const char *cp;
+#endif
+ char tmp[7];
+ TextAnchor *Anchor_ptr = NULL;
+ int stop_before_for_anchors;
+ FormInfo *FormInfo_ptr;
+ BOOL display_flag = FALSE;
+ HTAnchor *link_dest;
+ HTAnchor *link_dest_intl = NULL;
+ static int last_nlinks = 0;
+ static int charset_last_displayed = -1;
+
+#ifdef DISP_PARTIAL
+ int last_disp_partial = -1;
+#endif
+
+ lynx_mode = NORMAL_LYNX_MODE;
+
+ if (text == NULL) {
+ /*
+ * Check whether to force a screen clear to enable scrollback,
+ * or as a hack to fix a reverse clear screen problem for some
+ * curses packages. - shf@access.digex.net & seldon@eskimo.com
+ */
+ if (enable_scrollback) {
+ LYaddch('*');
+ LYrefresh();
+ LYclear();
+ }
+ LYaddstr("\n\nError accessing document!\nNo data available!\n");
+ LYrefresh();
+ nlinks = 0; /* set number of links to 0 */
+ return;
+ }
+#ifdef DISP_PARTIAL
+ if (display_partial || recent_sizechange || text->stale) {
+ /* Reset them, will be set near end if all is okay. - kw */
+ ResetPartialLinenos(text);
+ }
+#endif /* DISP_PARTIAL */
+
+ tmp[0] = tmp[1] = tmp[2] = '\0';
+ if (target && *target == '\0')
+ target = NULL;
+ text->page_has_target = NO;
+ if (display_lines <= 0) {
+ /* No screen space to display anything!
+ * returning here makes it more likely we will survive if
+ * an xterm is temporarily made very small. - kw */
+ return;
+ }
+
+ line_number = HText_getPreferredTopLine(text, line_number);
+
+ for (i = 0, line = FirstHTLine(text); /* Find line */
+ i < line_number && (line != text->last_line);
+ i++, line = line->next) { /* Loop */
+#ifndef VMS
+ if (!LYNoCore) {
+ assert(line->next != NULL);
+ } else if (line->next == NULL) {
+ if (enable_scrollback) {
+ LYaddch('*');
+ LYrefresh();
+ LYclear();
+ }
+ LYaddstr("\n\nError drawing page!\nBad HText structure!\n");
+ LYrefresh();
+ nlinks = 0; /* set number of links to 0 */
+ return;
+ }
+#else
+ assert(line->next != NULL);
+#endif /* !VMS */
+ } /* Loop */
+
+ if (LYlowest_eightbit[current_char_set] <= 255 &&
+ (current_char_set != charset_last_displayed) &&
+ /*
+ * current_char_set has changed since last invocation,
+ * and it's not just 7-bit.
+ * Also we don't want to do this for -dump and -source etc.
+ */
+ LYCursesON) {
+#ifdef EXP_CHARTRANS_AUTOSWITCH
+ UCChangeTerminalCodepage(current_char_set,
+ &LYCharSet_UC[current_char_set]);
+#endif /* EXP_CHARTRANS_AUTOSWITCH */
+ charset_last_displayed = current_char_set;
+ }
+
+ /*
+ * Check whether to force a screen clear to enable scrollback,
+ * or as a hack to fix a reverse clear screen problem for some
+ * curses packages. - shf@access.digex.net & seldon@eskimo.com
+ */
+ if (enable_scrollback) {
+ LYaddch('*');
+ LYrefresh();
+ LYclear();
+ }
+#ifdef USE_COLOR_STYLE
+ /*
+ * Reset stack of color attribute changes to avoid color leaking,
+ * except if what we last displayed from this text was the previous
+ * screenful, in which case carrying over the state might be beneficial
+ * (although it shouldn't generally be needed any more). - kw
+ */
+ if (text->stale ||
+ line_number != text->top_of_screen + (display_lines)) {
+ last_colorattr_ptr = 0;
+ }
+#endif
+
+ text->top_of_screen = line_number;
+ text->top_of_screen_line = line;
+ if (no_title) {
+ LYmove(0, 0);
+ title_lines = 0;
+ } else {
+ display_title(text); /* will move cursor to top of screen */
+ }
+ display_flag = TRUE;
+
+#ifdef USE_COLOR_STYLE
+#ifdef DISP_PARTIAL
+ if (display_partial ||
+ line_number != text->first_lineno_last_disp_partial ||
+ line_number > text->last_lineno_last_disp_partial)
+#endif /* DISP_PARTIAL */
+ ResetCachedStyles();
+#endif /* USE_COLOR_STYLE */
+
+#ifdef DISP_PARTIAL
+ if (display_partial && text->stbl) {
+ stop_before_for_anchors = Stbl_getStartLineDeep(text->stbl);
+ if (stop_before_for_anchors > line_number + (display_lines))
+ stop_before_for_anchors = line_number + (display_lines);
+ } else
+#endif
+ stop_before_for_anchors = line_number + (display_lines);
+
+ /*
+ * Output the page.
+ */
+ if (line) {
+#if defined(USE_COLOR_STYLE) && defined(SHOW_WHEREIS_TARGETS)
+ char *data;
+ int offset, LenNeeded;
+#endif
+#ifdef DISP_PARTIAL
+ if (display_partial ||
+ line_number != text->first_lineno_last_disp_partial)
+ text->has_utf8 = NO;
+#else
+ text->has_utf8 = NO;
+#endif
+ for (i = 0; i < (display_lines); i++) {
+ /*
+ * Verify and display each line.
+ */
+#ifndef VMS
+ if (!LYNoCore) {
+ assert(line != NULL);
+ } else if (line == NULL) {
+ if (enable_scrollback) {
+ LYaddch('*');
+ LYrefresh();
+ LYclear();
+ }
+ LYaddstr("\n\nError drawing page!\nBad HText structure!\n");
+ LYrefresh();
+ nlinks = 0; /* set number of links to 0 */
+ return;
+ }
+#else
+ assert(line != NULL);
+#endif /* !VMS */
+
+#ifdef DISP_PARTIAL
+ if (!display_partial &&
+ line_number == text->first_lineno_last_disp_partial &&
+ i + line_number <= text->last_lineno_last_disp_partial)
+ LYmove((i + title_lines + 1), 0);
+ else
+#endif
+ display_line(line, text, i + 1, target);
+
+#if defined(SHOW_WHEREIS_TARGETS)
+#ifdef USE_COLOR_STYLE /* otherwise done in display_line - kw */
+ /*
+ * If the target is on this line, recursively
+ * seek and emphasize it. -FM
+ */
+ data = (char *) line->data;
+ offset = (int) line->offset;
+ while (non_empty(target) &&
+ (cp = LYno_attr_mb_strstr(data,
+ target,
+ text->T.output_utf8, YES,
+ NULL,
+ &LenNeeded)) != NULL &&
+ ((int) line->offset + LenNeeded) <= DISPLAY_COLS) {
+ size_t itmp = 0;
+ size_t written = 0;
+ int x_off = offset + (int) (cp - data);
+ size_t len = strlen(target);
+ size_t utf_extra = 0;
+
+ text->page_has_target = YES;
+
+ /*
+ * Start the emphasis.
+ */
+ LYstartTargetEmphasis();
+
+ /*
+ * Output the target characters.
+ */
+ for (;
+ written < len && (tmp[0] = data[itmp]) != '\0';
+ itmp++) {
+ if (IsSpecialAttrChar(tmp[0]) && tmp[0] != LY_SOFT_NEWLINE) {
+ /*
+ * Ignore special characters.
+ */
+ x_off--;
+
+ } else if (&data[itmp] >= cp) {
+ if (cp == &data[itmp]) {
+ /*
+ * First printable character of target.
+ */
+ LYmove((i + title_lines),
+ line->offset + LYstrExtent2(line->data,
+ x_off - line->offset));
+ }
+ /*
+ * Output all the printable target chars.
+ */
+ utf_extra = utf8_length(text->T.output_utf8, data + itmp);
+ if (utf_extra) {
+ LYStrNCpy(&tmp[1], &line->data[itmp + 1], utf_extra);
+ itmp += utf_extra;
+ LYaddstr(tmp);
+ tmp[1] = '\0';
+ written += (utf_extra + 1);
+ } else if (IS_CJK_TTY && is8bits(tmp[0])) {
+ /*
+ * For CJK strings, by Masanobu Kimura.
+ */
+ tmp[1] = data[++itmp];
+ LYaddstr(tmp);
+ tmp[1] = '\0';
+ written += 2;
+ } else {
+ LYaddstr(tmp);
+ written++;
+ }
+ }
+ }
+
+ /*
+ * Stop the emphasis, and reset the offset and
+ * data pointer for our current position in the
+ * line. -FM
+ */
+ LYstopTargetEmphasis();
+ data = (char *) &data[itmp];
+ offset = (int) (data - line->data + line->offset);
+
+ } /* end while */
+ LYmove((i + title_lines + 1), 0);
+#endif /* USE_COLOR_STYLE */
+#endif /* SHOW_WHEREIS_TARGETS */
+
+ /*
+ * Stop if this is the last line. Otherwise, make sure
+ * display_flag is set and process the next line. -FM
+ */
+ if (line == text->last_line) {
+ /*
+ * Clear remaining lines of display.
+ */
+ for (i++; i < (display_lines); i++) {
+ LYmove((i + title_lines), 0);
+ LYclrtoeol();
+ }
+ break;
+ }
+#ifdef DISP_PARTIAL
+ if (display_partial) {
+ /*
+ * Remember as fully shown during last partial display,
+ * if it was not the last text line. - kw
+ */
+ last_disp_partial = i + line_number;
+ }
+#endif /* DISP_PARTIAL */
+ display_flag = TRUE;
+ line = line->next;
+ } /* end of "Verify and display each line." loop */
+ }
+ /* end "Output the page." */
+ text->next_line = line; /* Line after screen */
+ text->stale = NO; /* Display is up-to-date */
+
+ /*
+ * Add the anchors to Lynx structures.
+ */
+ nlinks = 0;
+ for (Anchor_ptr = text->first_anchor;
+ Anchor_ptr != NULL && Anchor_ptr->line_num <= stop_before_for_anchors;
+ Anchor_ptr = Anchor_ptr->next) {
+
+ if (Anchor_ptr->line_num >= line_number
+ && Anchor_ptr->line_num < stop_before_for_anchors) {
+ char *hi_string = LYGetHiTextStr(Anchor_ptr, 0);
+
+ /*
+ * Load normal hypertext anchors.
+ */
+ if (Anchor_ptr->show_anchor
+ && non_empty(hi_string)
+ && (Anchor_ptr->link_type & HYPERTEXT_ANCHOR)) {
+ int count;
+ char *s;
+
+ for (count = 0;; ++count) {
+ s = LYGetHiTextStr(Anchor_ptr, count);
+ if (count == 0)
+ LYSetHilite(nlinks, s);
+ if (s == NULL)
+ break;
+ if (count != 0) {
+ LYAddHilite(nlinks, s, LYGetHiTextPos(Anchor_ptr, count));
+ }
+ }
+
+ links[nlinks].inUnderline = Anchor_ptr->inUnderline;
+
+ links[nlinks].sgml_offset = Anchor_ptr->sgml_offset;
+ links[nlinks].anchor_number = Anchor_ptr->number;
+ links[nlinks].anchor_line_num = Anchor_ptr->line_num;
+
+ link_dest = HTAnchor_followLink(Anchor_ptr->anchor);
+ {
+ auto char *cp_AnchorAddress = NULL;
+
+ if (traversal) {
+ cp_AnchorAddress = stub_HTAnchor_address(link_dest);
+ } else if (track_internal_links) {
+ if (Anchor_ptr->link_type == INTERNAL_LINK_ANCHOR) {
+ link_dest_intl = HTAnchor_followTypedLink(Anchor_ptr->anchor,
+ HTInternalLink);
+ if (link_dest_intl && link_dest_intl != link_dest) {
+
+ CTRACE((tfp,
+ "GridText: display_page: unexpected typed link to %s!\n",
+ link_dest_intl->parent->address));
+ link_dest_intl = NULL;
+ }
+ } else {
+ link_dest_intl = NULL;
+ }
+ if (link_dest_intl) {
+ char *cp2 = HTAnchor_address(link_dest_intl);
+
+ cp_AnchorAddress = cp2;
+ } else {
+ cp_AnchorAddress = HTAnchor_address(link_dest);
+ }
+ } else {
+ cp_AnchorAddress = HTAnchor_address(link_dest);
+ }
+ FREE(links[nlinks].lname);
+
+ if (cp_AnchorAddress != NULL)
+ links[nlinks].lname = cp_AnchorAddress;
+ else
+ StrAllocCopy(links[nlinks].lname, empty_string);
+ }
+
+ links[nlinks].lx = Anchor_ptr->line_pos;
+ links[nlinks].ly = ((Anchor_ptr->line_num + 1) - line_number);
+ if (link_dest_intl)
+ links[nlinks].type = WWW_INTERN_LINK_TYPE;
+ else
+ links[nlinks].type = WWW_LINK_TYPE;
+ links[nlinks].target = empty_string;
+ links[nlinks].l_form = NULL;
+
+ nlinks++;
+ display_flag = TRUE;
+
+ } else if (Anchor_ptr->link_type == INPUT_ANCHOR
+ && Anchor_ptr->input_field->type != F_HIDDEN_TYPE) {
+ /*
+ * Handle form fields.
+ */
+ lynx_mode = FORMS_LYNX_MODE;
+
+ FormInfo_ptr = Anchor_ptr->input_field;
+
+ links[nlinks].sgml_offset = Anchor_ptr->sgml_offset;
+ links[nlinks].anchor_number = Anchor_ptr->number;
+ links[nlinks].anchor_line_num = Anchor_ptr->line_num;
+
+ links[nlinks].l_form = FormInfo_ptr;
+ links[nlinks].lx = Anchor_ptr->line_pos;
+ links[nlinks].ly = ((Anchor_ptr->line_num + 1) - line_number);
+ links[nlinks].type = WWW_FORM_LINK_TYPE;
+ links[nlinks].inUnderline = Anchor_ptr->inUnderline;
+ links[nlinks].target = empty_string;
+ StrAllocCopy(links[nlinks].lname, empty_string);
+
+ if (FormInfo_ptr->type == F_RADIO_TYPE) {
+ LYSetHilite(nlinks,
+ FormInfo_ptr->num_value
+ ? checked_radio
+ : unchecked_radio);
+ } else if (FormInfo_ptr->type == F_CHECKBOX_TYPE) {
+ LYSetHilite(nlinks,
+ FormInfo_ptr->num_value
+ ? checked_box
+ : unchecked_box);
+ } else if (FormInfo_ptr->type == F_PASSWORD_TYPE) {
+ LYSetHilite(nlinks,
+ STARS(LYstrCells(FormInfo_ptr->value)));
+ } else { /* TEXT type */
+ LYSetHilite(nlinks,
+ FormInfo_ptr->value);
+ }
+
+ nlinks++;
+ /*
+ * Bold the link after incrementing nlinks.
+ */
+ LYhighlight(FALSE, (nlinks - 1), target);
+
+ display_flag = TRUE;
+
+ } else {
+ /*
+ * Not showing anchor.
+ */
+ if (non_empty(hi_string))
+ CTRACE((tfp,
+ "\nGridText: Not showing link, hightext=%s\n",
+ hi_string));
+ }
+ }
+
+ if (nlinks == MAXLINKS) {
+ /*
+ * Links array is full. If interactive, tell user
+ * to use half-page or two-line scrolling. -FM
+ */
+ if (LYCursesON) {
+ HTAlert(MAXLINKS_REACHED);
+ }
+ CTRACE((tfp, "\ndisplay_page: MAXLINKS reached.\n"));
+ break;
+ }
+ } /* end of loop "Add the anchors to Lynx structures." */
+
+ /*
+ * Free any un-reallocated links[] entries
+ * from the previous page draw. -FM
+ */
+ LYFreeHilites(nlinks, last_nlinks);
+ last_nlinks = nlinks;
+
+ /*
+ * If Anchor_ptr is not NULL and is not pointing to the last
+ * anchor, then there are anchors farther down in the document,
+ * and we need to flag this for traversals.
+ */
+ more_links = FALSE;
+ if (traversal && Anchor_ptr) {
+ if (Anchor_ptr->next)
+ more_links = TRUE;
+ }
+
+ if (!display_flag) {
+ /*
+ * Nothing on the page.
+ */
+ LYaddstr("\n Document is empty");
+ }
+ display_scrollbar(text);
+
+#ifdef DISP_PARTIAL
+ if (display_partial && display_flag &&
+ last_disp_partial >= text->top_of_screen &&
+ !enable_scrollback &&
+ !recent_sizechange) { /* really remember them if ok - kw */
+ text->first_lineno_last_disp_partial = text->top_of_screen;
+ text->last_lineno_last_disp_partial = last_disp_partial;
+ } else {
+ ResetPartialLinenos(text);
+ }
+#endif /* DISP_PARTIAL */
+
+#if !defined(WIDEC_CURSES)
+ if (text->has_utf8 || text->had_utf8) {
+ /*
+ * For other than ncurses, repainting is taken care of
+ * by touching lines in display_line and highlight. - kw 1999-10-07
+ */
+ text->had_utf8 = text->has_utf8;
+ clearok(curscr, TRUE);
+ } else if (IS_CJK_TTY) {
+ /*
+ * For non-multibyte curses.
+ *
+ * Full repainting is necessary, otherwise only part of a multibyte
+ * character sequence might be written because of curses output
+ * optimizations.
+ */
+ clearok(curscr, TRUE);
+ }
+#endif /* WIDEC_CURSES */
+
+ LYrefresh();
+ return;
+}
+
+/* Object Building methods
+ * -----------------------
+ *
+ * These are used by a parser to build the text in an object
+ */
+void HText_beginAppend(HText *text)
+{
+ text->permissible_split = 0;
+ text->in_line_1 = YES;
+
+}
+
+/*
+ * LYcols_cu is the notion that the display library has of the screen width.
+ * Checks of the line length (as the non-UTF-8-aware display library would see
+ * it) against LYcols_cu are used to try to prevent lines with UTF-8 chars from
+ * being wrapped by the library when they shouldn't. If there is no display
+ * library involved, i.e., dump_output_immediately, no such limit should be
+ * imposed. MAX_COLS should be just as good as any other large value. (But
+ * don't use INT_MAX or something close to it to, avoid over/underflow.) - kw
+ */
+#ifdef USE_SLANG
+#define LYcols_cu(text) (dump_output_immediately ? MAX_COLS : SLtt_Screen_Cols)
+#else
+#ifdef WIDEC_CURSES
+#define LYcols_cu(text) WRAP_COLS(text)
+#else
+#define LYcols_cu(text) (dump_output_immediately ? MAX_COLS : DISPLAY_COLS)
+#endif
+#endif
+
+/* Add a new line of text
+ * ----------------------
+ *
+ * On entry,
+ *
+ * split is zero for newline function, else number of characters
+ * before split.
+ * text->display_on_the_fly
+ * may be set to indicate direct output of the finished line.
+ * On exit,
+ * A new line has been made, justified according to the
+ * current style. Text after the split (if split nonzero)
+ * is taken over onto the next line.
+ *
+ * If display_on_the_fly is set, then it is decremented and
+ * the finished line is displayed.
+ */
+
+static int set_style_by_embedded_chars(char *s,
+ char *e,
+ unsigned start_c,
+ unsigned end_c)
+{
+ int ret = NO;
+
+ while (--e >= s) {
+ if (UCH(*e) == UCH(end_c))
+ break;
+ if (UCH(*e) == UCH(start_c)) {
+ ret = YES;
+ break;
+ }
+ }
+ return ret;
+}
+
+static void move_anchors_in_region(HTLine *line, int line_number,
+ TextAnchor **prev_anchor, /*updates++ */
+ int *prev_head_processed,
+ int sbyte,
+ int ebyte,
+ int shift) /* Likewise */
+{
+ /*
+ * Update anchor positions for anchors that start on this line. Note: we
+ * rely on a->line_pos counting bytes, not characters. That's one reason
+ * why HText_trimHightext has to be prevented from acting on these anchors
+ * in partial display mode before we get a chance to deal with them here.
+ */
+ TextAnchor *a;
+ int head_processed = *prev_head_processed;
+
+ /*
+ * We need to know whether (*prev_anchor)->line_pos is "in new coordinates"
+ * or in old ones. If prev_anchor' head was touched on the previous
+ * iteration, we set head_processed. The tail may need to be treated now.
+ */
+ for (a = *prev_anchor;
+ a && a->line_num <= line_number;
+ a = a->next, head_processed = 0) {
+ /* extent==0 needs to be special-cased; happens if no text for
+ the anchor was processed yet. */
+ /* Subtract one so that the space is not inserted at the end
+ of the anchor... */
+ int last = a->line_pos + (a->extent ? a->extent - 1 : 0);
+
+ /* Include the anchors started on the previous line */
+ if (a->line_num < line_number - 1)
+ continue;
+ if (a->line_num == line_number - 1)
+ last -= line->prev->size + 1; /* Fake "\n" "between" lines counted too */
+ if (last < sbyte) /* Completely before the start */
+ continue;
+
+ if (!head_processed /* a->line_pos is not edited yet */
+ && a->line_num == line_number
+ && a->line_pos >= ebyte) /* Completely after the end */
+ break;
+ /* Now we know that the anchor context intersects the chunk */
+
+ /* Fix the start */
+ if (!head_processed && a->line_num == line_number
+ && a->line_pos >= sbyte) {
+ a->line_pos = (short) (a->line_pos + shift);
+ a->extent = (short) (a->extent - shift);
+ head_processed = 1;
+ }
+ /* Fix the end */
+ if (last < ebyte) {
+ a->extent = (short) (a->extent + shift);
+ } else {
+ break; /* Keep this `a' for the next step */
+ }
+ }
+ *prev_anchor = a;
+ *prev_head_processed = head_processed;
+}
+
+/*
+ * Given a line and two int arrays of old/now position, this function
+ * creates a new line where spaces have been inserted/removed
+ * in appropriate places - so that characters at/after the old
+ * position end up at/after the new position, for each pair, if possible.
+ * Some necessary changes for anchors starting on this line are also done
+ * here if needed. Updates 'prev_anchor' internally.
+ * Returns a newly allocated HTLine* if changes were made
+ * (caller has to free the old one).
+ * Returns NULL if no changes needed. (Remove-spaces code may be buggy...)
+ * - kw
+ */
+static HTLine *insert_blanks_in_line(HTLine *line, int line_number,
+ HText *text,
+ TextAnchor **prev_anchor, /*updates++ */
+ int ninserts,
+ int *oldpos, /* Measured in cells */
+ int *newpos) /* Likewise */
+{
+ int ioldc = 0; /* count visible characters */
+ int ip; /* count insertion pairs */
+
+#if defined(USE_COLOR_STYLE)
+ int istyle = 0;
+#endif
+ int added_chars = 0;
+ int shift = 0;
+ int head_processed;
+ HTLine *mod_line;
+ char *newdata;
+ char *s = line->data;
+ char *pre = s;
+ char *copied = line->data, *t;
+
+ if (!(line && line->size && ninserts))
+ return NULL;
+ for (ip = 0; ip < ninserts; ip++)
+ if (newpos[ip] > oldpos[ip] &&
+ (newpos[ip] - oldpos[ip]) > added_chars)
+ added_chars = newpos[ip] - oldpos[ip];
+ if (line->size + added_chars > MAX_LINE - 2)
+ return NULL;
+ if (line == text->last_line) {
+ if (line == TEMP_LINE(text, 0))
+ mod_line = TEMP_LINE(text, 1);
+ else
+ mod_line = TEMP_LINE(text, 0);
+ } else {
+ allocHTLine(mod_line, (unsigned) (line->size + added_chars));
+ }
+ if (!mod_line)
+ return NULL;
+ if (!*prev_anchor)
+ *prev_anchor = text->first_anchor;
+ head_processed = (*prev_anchor && (*prev_anchor)->line_num < line_number);
+ memcpy(mod_line, line, LINE_SIZE(0));
+ t = newdata = mod_line->data;
+ ip = 0;
+ while (ip <= ninserts) {
+ /* line->size is in bytes, so it may be larger than needed... */
+ int curlim = (ip < ninserts
+ ? oldpos[ip]
+ : ((int) line->size <= MAX_LINE
+ ? MAX_LINE + 1
+ : (int) line->size + 1));
+
+ pre = s;
+
+ /* Fast forward to char==curlim or EOL. Stop *before* the
+ style-change chars. */
+ while (*s) {
+ if (text && text->T.output_utf8
+ && UCH(*s) >= 0x80 && UCH(*s) < 0xC0) {
+ pre = s + 1;
+ } else if (!IsSpecialAttrChar(*s)) { /* At a "displayed" char */
+ if (ioldc >= curlim)
+ break;
+ ioldc++;
+ pre = s + 1;
+#ifdef EXP_WCWIDTH_SUPPORT
+ if (text && text->T.output_utf8 && IS_UTF_FIRST(*s))
+ ioldc += utfextracells(s);
+#endif
+ }
+ s++;
+ }
+
+ /* Now s is at the "displayed" char, pre is before the style change */
+ if (ip) /* Fix anchor positions */
+ move_anchors_in_region(line, line_number, prev_anchor /*updates++ */ ,
+ &head_processed,
+ (int) (copied - line->data), (int) (pre - line->data),
+ shift);
+#if defined(USE_COLOR_STYLE) /* Move styles too */
+#define NStyle mod_line->styles[istyle]
+ for (;
+ istyle < line->numstyles && (int) NStyle.sc_horizpos < curlim;
+ istyle++)
+ /* Should not we include OFF-styles at curlim? */
+ NStyle.sc_horizpos = CAST_POS(NStyle.sc_horizpos + shift);
+#endif
+ while (copied < pre) /* Copy verbatim to byte == pre */
+ *t++ = *copied++;
+ if (ip < ninserts) { /* Insert spaces */
+ int delta = newpos[ip] - oldpos[ip] - shift;
+
+ if (delta < 0) { /* Not used yet? */
+ while (delta++ < 0 && t > newdata && t[-1] == ' ')
+ t--, shift--;
+ } else
+ shift = newpos[ip] - oldpos[ip];
+ while (delta-- > 0)
+ *t++ = ' ';
+ }
+ ip++;
+ }
+ while (pre < s) /* Copy remaining style-codes */
+ *t++ = *pre++;
+ /* Check whether the last anchor continues on the next line */
+ if (head_processed
+ && *prev_anchor
+ && (*prev_anchor)->line_num == line_number) {
+ (*prev_anchor)->extent = (short) ((*prev_anchor)->extent + shift);
+ }
+ *t = '\0';
+ mod_line->size = (unsigned short) (t - newdata);
+ return mod_line;
+}
+
+#if defined(USE_COLOR_STYLE)
+#define direction2s(d) ((d) == STACK_OFF \
+ ? "OFF" \
+ : ((d) == STACK_ON \
+ ? "ON" \
+ : "*ON"))
+
+/*
+ * Found an OFF change not part of an adjacent matched pair.
+ *
+ * Walk backward looking for the corresponding ON change.
+ * Move everything after split_pos to be at split_pos.
+ *
+ * This can only work correctly if all changes are correctly nested! If this
+ * fails, assume it is safer to leave whatever comes before the OFF on the
+ * previous line alone.
+ */
+static HTStyleChange *skip_matched_and_correct_offsets(HTStyleChange *end,
+ HTStyleChange *start,
+ unsigned split_pos)
+{
+ HTStyleChange *result = 0;
+ int level = 0;
+ HTStyleChange *tmp = end;
+
+ CTRACE_STYLE((tfp, "SKIP Style %d %d (%s), split %u\n",
+ tmp->sc_horizpos,
+ tmp->sc_style,
+ direction2s(tmp->sc_direction),
+ split_pos));
+ for (; tmp >= start; tmp--) {
+ CTRACE_STYLE((tfp, "... %d %d (%s)\n",
+ tmp->sc_horizpos,
+ tmp->sc_style,
+ direction2s(tmp->sc_direction)));
+ if (tmp->sc_style == end->sc_style) {
+ if (tmp->sc_direction == STACK_OFF) {
+ level--;
+ } else if (tmp->sc_direction == STACK_ON) {
+ if (++level == 0) {
+ result = tmp;
+ break;
+ }
+ } else {
+ break;
+ }
+ }
+ if (tmp->sc_horizpos > split_pos) {
+ tmp->sc_horizpos = CAST_POS(split_pos);
+ }
+ }
+ return result;
+}
+#endif /* USE_COLOR_STYLE */
+
+#define reset_horizpos(value) value = 0, value ^= MASK_POS
+
+static void split_line(HText *text, unsigned split)
+{
+ HTStyle *style = text->style;
+ int spare;
+ int indent = (text->in_line_1
+ ? text->style->indent1st
+ : text->style->leftIndent);
+ int new_offset;
+ short alignment;
+ TextAnchor *a;
+ int CurLine = text->Lines;
+ int HeadTrim = 0;
+ int SpecialAttrChars = 0;
+ int TailTrim = 0;
+ int s, s_post, s_pre, t_underline = underline_on, t_bold = bold_on;
+ char *p;
+ char *cp;
+ int ctrl_chars_on_previous_line = 0;
+
+#ifndef WIDEC_CURSES
+ int utfxtra_on_previous_line = UTFXTRA_ON_THIS_LINE;
+#endif
+
+ HTLine *previous = text->last_line;
+ HTLine *line;
+
+ /*
+ * Set new line.
+ */
+ if (previous == TEMP_LINE(text, 0))
+ line = TEMP_LINE(text, 1);
+ else
+ line = TEMP_LINE(text, 0);
+ if (line == NULL)
+ return;
+ memset(line, 0, (size_t) LINE_SIZE(0));
+
+ ctrl_chars_on_this_line = 0; /*reset since we are going to a new line */
+ utfxtra_on_this_line = 0; /*reset too, we'll count them */
+#ifdef EXP_WCWIDTH_SUPPORT
+ utfxtracells_on_this_line = 0;
+#endif
+ HText_setLastChar(text, ' ');
+
+#ifdef DEBUG_APPCH
+ CTRACE((tfp, "GridText: split_line(%p,%d) called\n", text, split));
+ CTRACE((tfp, " previous=%s\n", previous->data));
+ CTRACE((tfp, " bold_on=%d, underline_on=%d\n", bold_on, underline_on));
+#endif
+
+ cp = previous->data;
+
+ /* Float LY_SOFT_NEWLINE to the start */
+ if (cp[0] == LY_BOLD_START_CHAR
+ || cp[0] == LY_UNDERLINE_START_CHAR) {
+ switch (cp[1]) {
+ case LY_SOFT_NEWLINE:
+ cp[1] = cp[0];
+ cp[0] = LY_SOFT_NEWLINE;
+ break;
+ case LY_BOLD_START_CHAR:
+ case LY_UNDERLINE_START_CHAR:
+ if (cp[2] == LY_SOFT_NEWLINE) {
+ cp[2] = cp[1];
+ cp[1] = cp[0];
+ cp[0] = LY_SOFT_NEWLINE;
+ }
+ break;
+ }
+ }
+ if (split > previous->size) {
+ CTRACE((tfp,
+ "*** split_line: split==%u greater than last_line->size==%d !\n",
+ split, previous->size));
+ if (split > MAX_LINE) {
+ split = previous->size;
+ if ((cp = strrchr(previous->data, ' ')) &&
+ cp - previous->data > 1)
+ split = (unsigned) (cp - previous->data);
+ CTRACE((tfp, " split adjusted to %u.\n", split));
+ }
+ }
+
+ text->Lines++;
+
+ previous->next->prev = line;
+ line->prev = previous;
+ line->next = previous->next;
+ previous->next = line;
+ text->last_line = line;
+ line->size = 0;
+ line->offset = 0;
+ text->permissible_split = 0; /* 12/13/93 */
+ line->data[0] = '\0';
+
+ alignment = style->alignment;
+
+ if (split > 0) { /* Restore flags to the value at the splitting point */
+ if (!(dump_output_immediately && use_underscore))
+ t_underline = set_style_by_embedded_chars(previous->data,
+ previous->data + split,
+ LY_UNDERLINE_START_CHAR, LY_UNDERLINE_END_CHAR);
+
+ t_bold = set_style_by_embedded_chars(previous->data,
+ previous->data + split,
+ LY_BOLD_START_CHAR, LY_BOLD_END_CHAR);
+
+ }
+
+ if (!(dump_output_immediately && use_underscore) && t_underline) {
+ line->data[line->size++] = LY_UNDERLINE_START_CHAR;
+ line->data[line->size] = '\0';
+ ctrl_chars_on_this_line++;
+ SpecialAttrChars++;
+ }
+ if (t_bold) {
+ line->data[line->size++] = LY_BOLD_START_CHAR;
+ line->data[line->size] = '\0';
+ ctrl_chars_on_this_line++;
+ SpecialAttrChars++;
+ }
+
+ /*
+ * Split at required point
+ */
+ if (split > 0) { /* Delete space at "split" splitting line */
+ char *prevdata = previous->data, *linedata = line->data;
+ unsigned plen;
+ int i, j;
+
+ /* Split the line. -FM */
+ prevdata[previous->size] = '\0';
+ previous->size = (unsigned short) split;
+
+ /*
+ * Trim any spaces or soft hyphens from the beginning
+ * of our new line. -FM
+ */
+ p = prevdata + split;
+ while (((*p == ' '
+#ifdef USE_JUSTIFY_ELTS
+ /* if justification is allowed for prev line, then raw
+ * HT_NON_BREAK_SPACE are still present in data[] (they'll be
+ * substituted at the end of this function with ' ') - VH
+ */
+ || *p == HT_NON_BREAK_SPACE
+#endif
+ )
+ && (HeadTrim || text->first_anchor ||
+ underline_on || bold_on ||
+ alignment != HT_LEFT ||
+ style->wordWrap || style->freeFormat ||
+ style->spaceBefore || style->spaceAfter)) ||
+ *p == LY_SOFT_HYPHEN) {
+ p++;
+ HeadTrim++;
+ }
+
+ plen = (unsigned) strlen(p);
+ if (plen) { /* Count funny characters */
+ for (i = (int) (plen - 1); i >= 0; i--) {
+ if (p[i] == LY_UNDERLINE_START_CHAR ||
+ p[i] == LY_UNDERLINE_END_CHAR ||
+ p[i] == LY_BOLD_START_CHAR ||
+ p[i] == LY_BOLD_END_CHAR ||
+ p[i] == LY_SOFT_HYPHEN) {
+ ctrl_chars_on_this_line++;
+ } else if (IS_UTF_EXTRA(p[i])) {
+ utfxtra_on_this_line++;
+#ifdef EXP_WCWIDTH_SUPPORT
+ } else if (IS_UTF_FIRST(p[i])) {
+ utfxtracells_on_this_line += utfextracells(&p[i]);
+#endif
+ }
+ if (p[i] == LY_SOFT_HYPHEN &&
+ (int) text->permissible_split < i)
+ text->permissible_split = (unsigned) (i + 1);
+ }
+ ctrl_chars_on_this_line += utfxtra_on_this_line;
+
+ /* Add the data to the new line. -FM */
+ for (i = 0, j = (int) strlen(linedata);
+ (linedata[j++] = p[i++]) != '\0';
+ ) ;
+ line->size = (unsigned short) (line->size + plen);
+ }
+ }
+
+ /*
+ * Economize on space.
+ */
+ p = previous->data + previous->size - 1;
+ while (p >= previous->data
+ && (*p == ' '
+#ifdef USE_JUSTIFY_ELTS
+ /* if justification is allowed for prev line, then raw
+ * HT_NON_BREAK_SPACE are still present in data[] (they'll be
+ * substituted at the end of this function with ' ') - VH
+ */
+ || *p == HT_NON_BREAK_SPACE
+#endif
+ )
+#ifdef USE_PRETTYSRC
+ && !psrc_view /*don't strip trailing whites - since next line can
+ start with LY_SOFT_NEWLINE - so we don't lose spaces when
+ 'p'rinting this text to file -VH */
+#endif
+ && (ctrl_chars_on_this_line || HeadTrim || text->first_anchor ||
+ underline_on || bold_on ||
+ alignment != HT_LEFT ||
+ style->wordWrap || style->freeFormat ||
+ style->spaceBefore || style->spaceAfter)) {
+ p--; /* Strip trailers. */
+ }
+ /* Strip trailers. */
+ TailTrim = (int) (previous->data + previous->size - 1 - p);
+ previous->size = (unsigned short) (previous->size - TailTrim);
+ p[1] = '\0';
+
+ /*
+ * s is the effective split position, given by either a non-zero
+ * value of split or by the size of the previous line before
+ * trimming. - kw
+ */
+ if (split == 0) {
+ s = previous->size + TailTrim; /* the original size */
+ } else {
+ s = (int) split;
+ }
+ s_post = s + HeadTrim;
+ s_pre = s - TailTrim;
+
+#ifdef DEBUG_SPLITLINE
+#ifdef DEBUG_APPCH
+ if (s != (int) split)
+#endif
+ CTRACE((tfp, "GridText: split_line(%u [now:%d]) called\n", split, s));
+#endif
+
+#if defined(USE_COLOR_STYLE)
+ if (previous->styles == stylechanges_buffers[0])
+ line->styles = stylechanges_buffers[1];
+ else
+ line->styles = stylechanges_buffers[0];
+ line->numstyles = 0;
+ {
+ HTStyleChange *from = previous->styles + previous->numstyles - 1;
+ HTStyleChange *to = line->styles + MAX_STYLES_ON_LINE - 1;
+ HTStyleChange *scan, *at_end;
+
+ /* Color style changes after the split position
+ * are transferred to the new line. Ditto for changes
+ * in the trimming region, but we stop when we reach an OFF change.
+ * The second loop below may then handle remaining changes. - kw */
+ while (from >= previous->styles && to >= line->styles) {
+ *to = *from;
+ if ((int) to->sc_horizpos > s_post) {
+ to->sc_horizpos = CAST_POS(to->sc_horizpos
+ + SpecialAttrChars
+ - s_post);
+ } else if ((int) to->sc_horizpos > s_pre &&
+ (to->sc_direction == STACK_ON ||
+ to->sc_direction == ABS_ON)) {
+ if ((int) to->sc_horizpos < s)
+ to->sc_horizpos = 0;
+ else
+ to->sc_horizpos = CAST_POS(SpecialAttrChars);
+ } else {
+ break;
+ }
+ to--;
+ from--;
+ }
+ /* FROM may be invalid, otherwise it is either an ON change at or
+ before s_pre, or is an OFF change at or before s_post. */
+
+ scan = from;
+ at_end = from;
+ /* Now on the previous line we have a correctly nested but
+ possibly non-terminated sequence of style changes.
+ Terminate it, and duplicate unterminated changes at the
+ beginning of the new line. */
+ while (scan >= previous->styles && at_end >= previous->styles) {
+ /* The algorithm: scan back though the styles on the previous line.
+ a) If OFF, skip the matched group.
+ Report a bug on failure.
+ b) If ON, (try to) cancel the corresponding ON at at_end,
+ and the corresponding OFF at to;
+ If not, put the corresponding OFF at at_end, and copy to to;
+ */
+ if (scan->sc_direction == STACK_OFF) {
+ scan = skip_matched_and_correct_offsets(scan, previous->styles,
+ (unsigned) s_pre);
+ if (!scan) {
+ CTRACE((tfp, "BUG: styles improperly nested.\n"));
+ break;
+ }
+ } else if (scan->sc_direction == STACK_ON) {
+ if (at_end->sc_direction == STACK_ON
+ && at_end->sc_style == scan->sc_style
+ && (int) at_end->sc_horizpos >= s_pre)
+ at_end--;
+ else if (at_end >= previous->styles + MAX_STYLES_ON_LINE - 1) {
+ CTRACE((tfp, "BUG: style overflow before split_line.\n"));
+ break;
+ } else {
+ at_end++;
+ at_end->sc_direction = STACK_OFF;
+ at_end->sc_style = scan->sc_style;
+ at_end->sc_horizpos = CAST_POS(s_pre);
+ CTRACE_STYLE((tfp,
+ "split_line, %d:style[%d] %d (dir=%d)\n",
+ s_pre,
+ (int) (at_end - from),
+ scan->sc_style,
+ at_end->sc_direction));
+ }
+ if (to < line->styles + MAX_STYLES_ON_LINE - 1
+ && to[1].sc_direction == STACK_OFF
+ && to[1].sc_horizpos <= (unsigned) SpecialAttrChars
+ && to[1].sc_style == scan->sc_style)
+ to++;
+ else if (to >= line->styles) {
+ *to = *scan;
+ to->sc_horizpos = CAST_POS(SpecialAttrChars);
+ to--;
+ } else {
+ CTRACE((tfp, "BUG: style overflow after split_line.\n"));
+ break;
+ }
+ }
+ if ((int) scan->sc_horizpos > s_pre) {
+ scan->sc_horizpos = CAST_POS(s_pre);
+ }
+ scan--;
+ }
+ line->numstyles = (unsigned short) (line->styles
+ + MAX_STYLES_ON_LINE
+ - 1 - to);
+ if (line->numstyles > 0 && line->numstyles < MAX_STYLES_ON_LINE) {
+ int n;
+
+ for (n = 0; n < line->numstyles; n++)
+ line->styles[n] = to[n + 1];
+ } else if (line->numstyles == 0) {
+ reset_horizpos(line->styles[0].sc_horizpos);
+ }
+ previous->numstyles = (unsigned short) (at_end - previous->styles + 1);
+ if (previous->numstyles == 0) {
+ reset_horizpos(previous->styles[0].sc_horizpos);
+ }
+ }
+#endif /*USE_COLOR_STYLE */
+
+ {
+ HTLine *temp;
+
+ allocHTLine(temp, previous->size);
+ if (!temp)
+ outofmem(__FILE__, "split_line_2");
+
+ memcpy(temp, previous, LINE_SIZE(previous->size));
+#if defined(USE_COLOR_STYLE)
+ POOLallocstyles(temp->styles, previous->numstyles);
+ if (!temp->styles)
+ outofmem(__FILE__, "split_line_2");
+ memcpy(temp->styles, previous->styles, sizeof(HTStyleChange) * previous->numstyles);
+#endif
+ previous = temp;
+ }
+
+ previous->prev->next = previous; /* Link in new line */
+ previous->next->prev = previous; /* Could be same node of course */
+
+ /*
+ * Terminate finished line for printing.
+ */
+ previous->data[previous->size] = '\0';
+
+ /*
+ * Align left, right or center.
+ */
+ spare = 0;
+ if (
+#ifdef USE_JUSTIFY_ELTS
+ this_line_was_split ||
+#endif
+ (alignment == HT_CENTER ||
+ alignment == HT_RIGHT) || text->stbl) {
+ /* Calculate spare character positions if needed */
+ for (cp = previous->data; *cp; cp++) {
+ if (*cp == LY_UNDERLINE_START_CHAR ||
+ *cp == LY_UNDERLINE_END_CHAR ||
+ *cp == LY_BOLD_START_CHAR ||
+ *cp == LY_BOLD_END_CHAR ||
+#ifndef WIDEC_CURSES
+ IS_UTF_EXTRA(*cp) ||
+#endif
+ *cp == LY_SOFT_HYPHEN) {
+ ctrl_chars_on_previous_line++;
+ }
+ }
+ if ((previous->size > 0) &&
+ (int) (previous->data[previous->size - 1] == LY_SOFT_HYPHEN))
+ ctrl_chars_on_previous_line--;
+
+ /* @@ first line indent */
+#ifdef WIDEC_CURSES
+ spare = WRAP_COLS(text)
+ - (int) style->rightIndent
+ - indent
+ + ctrl_chars_on_previous_line
+ - LYstrExtent2(previous->data, previous->size);
+ if (spare < 0 && LYwideLines) /* Can be wider than screen */
+ spare = 0;
+#else
+ spare = WRAP_COLS(text)
+ - (int) style->rightIndent
+ - indent
+ + ctrl_chars_on_previous_line
+ - previous->size;
+ if (spare < 0 && LYwideLines) /* Can be wider than screen */
+ spare = 0;
+
+ if (spare > 0 && !dump_output_immediately &&
+ text->T.output_utf8 && ctrl_chars_on_previous_line) {
+ utfxtra_on_previous_line -= UTFXTRA_ON_THIS_LINE;
+ if (utfxtra_on_previous_line) {
+ int spare_cu = (LYcols_cu(text) -
+ utfxtra_on_previous_line - indent +
+ ctrl_chars_on_previous_line - previous->size);
+
+ /*
+ * Shift non-leftaligned UTF-8 lines that would be
+ * mishandled by the display library towards the left
+ * if this would make them fit. The resulting display
+ * will not be as intended, but this is better than
+ * having them split by curses. (Curses cursor movement
+ * optimization may still cause wrong positioning within
+ * the line, in particular after a sequence of spaces).
+ * - kw
+ */
+ if (spare_cu < spare) {
+ if (spare_cu >= 0) {
+ if (alignment == HT_CENTER &&
+ (int) (previous->offset + indent + spare / 2 +
+ previous->size)
+ - ctrl_chars_on_previous_line
+ + utfxtra_on_previous_line <= LYcols_cu(text))
+ /* do nothing - it still fits - kw */ ;
+ else {
+ spare = spare_cu;
+ }
+ } else if (indent + (int) previous->offset + spare_cu >= 0) { /* subtract overdraft from effective indentation */
+ indent += (int) previous->offset + spare_cu;
+ previous->offset = 0;
+ spare = 0;
+ }
+ }
+ }
+ }
+#endif
+ }
+
+ new_offset = previous->offset;
+ switch (style->alignment) {
+ case HT_CENTER:
+ new_offset += indent + spare / 2;
+ break;
+ case HT_RIGHT:
+ new_offset += indent + spare;
+ break;
+ case HT_LEFT:
+ case HT_JUSTIFY: /* Not implemented */
+ default:
+ new_offset += indent;
+ break;
+ } /* switch */
+ previous->offset = (unsigned short) ((new_offset < 0) ? 0 : new_offset);
+
+ if (text->stbl) {
+ /*
+ * Notify simple table stuff of line split, so that it can
+ * set the last cell's length. The last cell should and
+ * its row should really end here, or on one of the following
+ * lines with no more characters added after the break.
+ * We don't know whether a cell has been started, so ignore
+ * errors here.
+ * This call is down here because we need the
+ * ctrl_chars_on_previous_line, which have just been re-
+ * counted above. - kw
+ */
+ Stbl_lineBreak(text->stbl,
+ text->Lines - 1,
+ previous->offset,
+ previous->size - ctrl_chars_on_previous_line);
+ }
+
+ text->in_line_1 = NO; /* unless caller sets it otherwise */
+
+ /*
+ * If we split the line, adjust the anchor
+ * structure values for the new line. -FM
+ */
+
+ if (s > 0) { /* if not completely empty */
+ int moved = 0;
+
+ /* In the algorithm below we move or not move anchors between
+ lines using some heuristic criteria. However, it is
+ desirable not to have two consequent anchors on different
+ lines *in a wrong order*! (How can this happen?)
+ So when the "reasonable choice" is not unique, we use the
+ MOVED flag to choose one.
+ */
+ /* Our operations can make a non-empty all-whitespace link
+ empty. So what? */
+ if ((a = text->last_anchor_before_split) == 0)
+ a = text->first_anchor;
+
+ for (; a; a = a->next) {
+ if (a->line_num == CurLine) {
+ int len = a->extent, n = a->number, start = a->line_pos;
+ int end = start + len;
+
+ text->last_anchor_before_split = a;
+
+ /* Which anchors do we leave on the previous line?
+ a) empty finished (We need a cut-off value.
+ "Just because": those before s;
+ this is the only case when we use s, not s_pre/s_post);
+ b) Those which start before s_pre;
+ */
+ if (start < s_pre) {
+ if (end <= s_pre)
+ continue; /* No problem */
+
+ CTRACE_SPLITLINE((tfp, "anchor %d: no relocation", n));
+ if (end > s_post) {
+ CTRACE_SPLITLINE((tfp, " of the start.\n"));
+ a->extent = (short) (a->extent
+ - (TailTrim + HeadTrim)
+ + SpecialAttrChars);
+ } else {
+ CTRACE_SPLITLINE((tfp, ", cut the end.\n"));
+ a->extent = (short) (s_pre - start);
+ }
+ continue;
+ } else if (start < s && !len
+ && (!n || (a->show_anchor && !moved))) {
+ CTRACE_SPLITLINE((tfp,
+ "anchor %d: no relocation, empty-finished",
+ n));
+ a->line_pos = (short) s_pre; /* Leave at the end of line */
+ continue;
+ }
+
+ /* The rest we relocate */
+ moved = 1;
+ a->line_num++;
+ CTRACE_SPLITLINE((tfp,
+ "anchor %d: (T,H,S)=(%d,%d,%d); (line,pos,ext):(%d,%d,%d), ",
+ n, TailTrim, HeadTrim, SpecialAttrChars,
+ a->line_num, a->line_pos, a->extent));
+ if (end < s_post) { /* Move the end to s_post */
+ CTRACE_SPLITLINE((tfp, "Move end +%d, ", s_post - end));
+ len += s_post - end;
+ }
+ if (start < s_post) { /* Move the start to s_post */
+ CTRACE_SPLITLINE((tfp, "Move start +%d, ", s_post - start));
+ len -= s_post - start;
+ start = s_post;
+ }
+ a->line_pos = (short) (start - s_post + SpecialAttrChars);
+ a->extent = (short) len;
+
+ CTRACE_SPLITLINE((tfp, "->(%d,%d,%d)\n",
+ a->line_num, a->line_pos, a->extent));
+ } else if (a->line_num > CurLine)
+ break;
+ }
+ }
+#ifdef USE_JUSTIFY_ELTS
+ /* now perform justification - by VH */
+
+ if (this_line_was_split
+ && spare > 0
+ && !text->stbl /* We don't inform TRST on the cell width change yet */
+ && justify_max_void_percent > 0
+ && justify_max_void_percent <= 100
+ && justify_max_void_percent >= ((100 * spare)
+ / (WRAP_COLS(text)
+ - (int) style->rightIndent
+ - indent
+ + ctrl_chars_on_previous_line))) {
+ /* this is the only case when we need justification */
+ char *jp = previous->data + justify_start_position;
+ ht_run_info *r = ht_runs;
+ char c;
+ int d_, r_;
+ HTLine *jline;
+
+ ht_num_runs = 0;
+ r->byte_len = r->cell_len = 0;
+
+ for (; (c = *jp) != 0; ++jp) {
+ if (c == ' ') {
+ ++r;
+ ++ht_num_runs;
+ r->byte_len = r->cell_len = 0;
+ continue;
+ }
+ ++r->byte_len;
+ if (IsSpecialAttrChar(c))
+ continue;
+
+ ++r->cell_len;
+ if (c == HT_NON_BREAK_SPACE) {
+ *jp = ' '; /* substitute it */
+ continue;
+ }
+ if (text->T.output_utf8 && is8bits(c)) {
+ int utf_extra = (int) utf8_length(text->T.output_utf8, jp);
+
+ r->byte_len += utf_extra;
+ jp += utf_extra;
+ }
+ }
+ ++ht_num_runs;
+
+ if (ht_num_runs != 1) {
+ int *oldpos = (int *) malloc(sizeof(int)
+ * 2 * (size_t) (ht_num_runs - 1));
+ int *newpos = oldpos + ht_num_runs - 1;
+ int i = 1;
+
+ if (oldpos == NULL)
+ outofmem(__FILE__, "split_line_3");
+
+ d_ = spare / (ht_num_runs - 1);
+ r_ = spare % (ht_num_runs - 1);
+
+ /* The first run is not moved, proceed to the second one */
+ oldpos[0] = justify_start_position + ht_runs[0].cell_len + 1;
+ newpos[0] = oldpos[0] + (d_ + (r_-- > 0));
+ while (i < ht_num_runs - 1) {
+ int delta = ht_runs[i].cell_len + 1;
+
+ oldpos[i] = oldpos[i - 1] + delta;
+ newpos[i] = newpos[i - 1] + delta + (d_ + (r_-- > 0));
+ i++;
+ }
+ jline = insert_blanks_in_line(previous, CurLine, text,
+ &last_anchor_of_previous_line /*updates++ */ ,
+ ht_num_runs - 1, oldpos, newpos);
+ free(oldpos);
+ if (jline == NULL)
+ outofmem(__FILE__, "split_line_4");
+ previous->next->prev = jline;
+ previous->prev->next = jline;
+
+ freeHTLine(text, previous);
+
+ previous = jline;
+ }
+ if (justify_start_position) {
+ char *p2 = previous->data;
+
+ for (; p2 < previous->data + justify_start_position; ++p2)
+ *p2 = (char) (*p2 == HT_NON_BREAK_SPACE ? ' ' : *p2);
+ }
+ } else {
+ if (REALLY_CAN_JUSTIFY(text)) {
+ char *p2;
+
+ /* it was permitted to justify line, but this function was called
+ * to end paragraph - we must substitute HT_NON_BREAK_SPACEs with
+ * spaces in previous line
+ */
+ if (line->size && !text->stbl) {
+ CTRACE((tfp,
+ "BUG: justification: shouldn't happen - new line is not empty!\n\t'%.*s'\n",
+ line->size, line->data));
+ }
+
+ for (p2 = previous->data; *p2; ++p2)
+ if (*p2 == HT_NON_BREAK_SPACE)
+ *p2 = ' ';
+ } else if (have_raw_nbsps) {
+ /* this is very rare case, that can happen in forms placed in
+ table cells */
+ unsigned i;
+
+ for (i = 0; i < previous->size; ++i)
+ if (previous->data[i] == HT_NON_BREAK_SPACE)
+ previous->data[i] = ' ';
+
+ /*next line won't be justified, so substitute nbsps in it too */
+ for (i = 0; i < line->size; ++i)
+ if (line->data[i] == HT_NON_BREAK_SPACE)
+ line->data[i] = ' ';
+ }
+
+ /* else HT_NON_BREAK_SPACEs were substituted with spaces in
+ HText_appendCharacter */
+ }
+ /* cleanup */
+ can_justify_this_line = TRUE;
+ justify_start_position = 0;
+ this_line_was_split = FALSE;
+ have_raw_nbsps = FALSE;
+#endif /* USE_JUSTIFY_ELTS */
+ return;
+} /* split_line */
+
+#ifdef DEBUG_SPLITLINE
+static void do_new_line(HText *text, const char *fn, int ln)
+{
+ CTRACE_SPLITLINE((tfp, "new_line %s@%d\n", fn, ln));
+ split_line(text, 0);
+}
+
+#define new_line(text) do_new_line(text, __FILE__, __LINE__)
+#else
+#define new_line(text) split_line(text, 0)
+#endif
+
+/* Allow vertical blank space
+ * --------------------------
+ */
+static void blank_lines(HText *text, int newlines)
+{
+ if (HText_TrueEmptyLine(text->last_line, text, FALSE)) { /* No text on current line */
+ HTLine *line = text->last_line->prev;
+ BOOL first = (BOOL) (line == text->last_line);
+
+ if (no_title && first)
+ return;
+
+#ifdef USE_COLOR_STYLE
+ /* Style-change petty requests at the start of the document: */
+ if (first && newlines == 1)
+ return; /* Do not add a blank line at start */
+#endif
+
+ while (line != NULL &&
+ line != text->last_line &&
+ HText_TrueEmptyLine(line, text, FALSE)) {
+ if (newlines == 0)
+ break;
+ newlines--; /* Don't bother: already blank */
+ line = line->prev;
+ }
+ } else {
+ newlines++; /* Need also to finish this line */
+ }
+
+ for (; newlines; newlines--) {
+ new_line(text);
+ }
+ text->in_line_1 = YES;
+}
+
+/* New paragraph in current style
+ * ------------------------------
+ * See also: setStyle.
+ */
+void HText_appendParagraph(HText *text)
+{
+ int after = text->style->spaceAfter;
+ int before = text->style->spaceBefore;
+
+ blank_lines(text, ((after > before) ? after : before));
+}
+
+/* Set Style
+ * ---------
+ *
+ * Does not filter unnecessary style changes.
+ */
+void HText_setStyle(HText *text, HTStyle *style)
+{
+ int after, before;
+
+ if (!style)
+ return; /* Safety */
+ after = text->style->spaceAfter;
+ before = style->spaceBefore;
+
+ CTRACE((tfp, "GridText: Change to style %s\n", GetHTStyleName(style)));
+
+ blank_lines(text, ((after > before) ? after : before));
+
+ text->style = style;
+}
+
+/* Append a character to the text object
+ * -------------------------------------
+ */
+void HText_appendCharacter(HText *text, int ch)
+{
+ HTLine *line;
+ HTStyle *style;
+ int indent;
+ int actual;
+
+#ifdef DEBUG_APPCH
+#ifdef CJK_EX
+ static unsigned char save_ch = 0;
+#endif
+
+ if (TRACE) {
+ char *special = NULL; /* make trace a little more readable */
+
+ switch (ch) {
+ case HT_NON_BREAK_SPACE:
+ special = "HT_NON_BREAK_SPACE";
+ break;
+ case HT_EN_SPACE:
+ special = "HT_EN_SPACE";
+ break;
+ case LY_UNDERLINE_START_CHAR:
+ special = "LY_UNDERLINE_START_CHAR";
+ break;
+ case LY_UNDERLINE_END_CHAR:
+ special = "LY_UNDERLINE_END_CHAR";
+ break;
+ case LY_BOLD_START_CHAR:
+ special = "LY_BOLD_START_CHAR";
+ break;
+ case LY_BOLD_END_CHAR:
+ special = "LY_BOLD_END_CHAR";
+ break;
+ case LY_SOFT_HYPHEN:
+ special = "LY_SOFT_HYPHEN";
+ break;
+ case LY_SOFT_NEWLINE:
+ special = "LY_SOFT_NEWLINE";
+ break;
+ default:
+ special = NULL;
+ break;
+ }
+
+ if (special != NULL) {
+ CTRACE((tfp, "add(%s %d special char) %d/%d\n", special, ch,
+ HTisDocumentSource(), HTOutputFormat != WWW_SOURCE));
+ } else {
+#ifdef CJK_EX /* 1998/08/30 (Sun) 13:26:23 */
+ if (save_ch == 0) {
+ if (IS_SJIS_HI1(ch) || IS_SJIS_HI2(ch)) {
+ save_ch = ch;
+ } else {
+ CTRACE((tfp, "add(%c) %d/%d\n", ch,
+ HTisDocumentSource(), HTOutputFormat != WWW_SOURCE));
+ }
+ } else {
+ CTRACE((tfp, "add(%c%c) %d/%d\n", save_ch, ch,
+ HTisDocumentSource(), HTOutputFormat != WWW_SOURCE));
+ save_ch = 0;
+ }
+#else
+ if (UCH(ch) < 0x80) {
+ CTRACE((tfp, "add(%c) %d/%d\n", UCH(ch),
+ HTisDocumentSource(), HTOutputFormat != WWW_SOURCE));
+ } else {
+ CTRACE((tfp, "add(%02x) %d/%d\n", UCH(ch),
+ HTisDocumentSource(), HTOutputFormat != WWW_SOURCE));
+ }
+#endif /* CJK_EX */
+ }
+ } /* trace only */
+#endif /* DEBUG_APPCH */
+
+ /*
+ * Make sure we don't crash on NULLs.
+ */
+ if (!text)
+ return;
+
+ if (text->halted > 1) {
+ /*
+ * We should stop outputting more text, because low memory was
+ * detected. - kw
+ */
+ if (text->halted == 2) {
+ /*
+ * But if we haven't done so yet, first append a warning.
+ * We should still have a few bytes left for that :).
+ * We temporarily reset test->halted to 0 for this, since
+ * this function will get called recursively. - kw
+ */
+ text->halted = 0;
+ text->kanji_buf = '\0';
+ HText_appendText(text, gettext(" *** MEMORY EXHAUSTED ***"));
+ }
+ text->halted = 3;
+ return;
+ }
+#ifdef USE_TH_JP_AUTO_DETECT
+ if ((HTCJK == JAPANESE) && (text->detected_kcode != DET_MIXED) &&
+ (text->specified_kcode != SJIS) && (text->specified_kcode != EUC)) {
+ unsigned char c;
+ eDetectedKCode save_d_kcode;
+
+ c = UCH(ch);
+ save_d_kcode = text->detected_kcode;
+ switch (text->SJIS_status) {
+ case SJIS_state_has_bad_code:
+ break;
+ case SJIS_state_neutral:
+ if (IS_SJIS_HI1(c) || IS_SJIS_HI2(c)) {
+ text->SJIS_status = SJIS_state_in_kanji;
+ } else if ((c & 0x80) && !IS_SJIS_X0201KANA(c)) {
+ text->SJIS_status = SJIS_state_has_bad_code;
+ if (text->EUC_status == EUC_state_has_bad_code)
+ text->detected_kcode = DET_MIXED;
+ else
+ text->detected_kcode = DET_EUC;
+ }
+ break;
+ case SJIS_state_in_kanji:
+ if (IS_SJIS_LO(c)) {
+ text->SJIS_status = SJIS_state_neutral;
+ } else {
+ text->SJIS_status = SJIS_state_has_bad_code;
+ if (text->EUC_status == EUC_state_has_bad_code)
+ text->detected_kcode = DET_MIXED;
+ else
+ text->detected_kcode = DET_EUC;
+ }
+ break;
+ }
+ switch (text->EUC_status) {
+ case EUC_state_has_bad_code:
+ break;
+ case EUC_state_neutral:
+ if (IS_EUC_HI(c)) {
+ text->EUC_status = EUC_state_in_kanji;
+ } else if (c == 0x8e) {
+ text->EUC_status = EUC_state_in_kana;
+ } else if (c & 0x80) {
+ text->EUC_status = EUC_state_has_bad_code;
+ if (text->SJIS_status == SJIS_state_has_bad_code)
+ text->detected_kcode = DET_MIXED;
+ else
+ text->detected_kcode = DET_SJIS;
+ }
+ break;
+ case EUC_state_in_kanji:
+ if (IS_EUC_LOX(c)) {
+ text->EUC_status = EUC_state_neutral;
+ } else {
+ text->EUC_status = EUC_state_has_bad_code;
+ if (text->SJIS_status == SJIS_state_has_bad_code)
+ text->detected_kcode = DET_MIXED;
+ else
+ text->detected_kcode = DET_SJIS;
+ }
+ break;
+ case EUC_state_in_kana:
+ if ((0xA1 <= c) && (c <= 0xDF)) {
+ text->EUC_status = EUC_state_neutral;
+ } else {
+ text->EUC_status = EUC_state_has_bad_code;
+ if (text->SJIS_status == SJIS_state_has_bad_code)
+ text->detected_kcode = DET_MIXED;
+ else
+ text->detected_kcode = DET_SJIS;
+ }
+ break;
+ }
+ if (save_d_kcode != text->detected_kcode) {
+ switch (text->detected_kcode) {
+ case DET_SJIS:
+ CTRACE((tfp,
+ "TH_JP_AUTO_DETECT: This document's kcode seems SJIS.\n"));
+ break;
+ case DET_EUC:
+ CTRACE((tfp,
+ "TH_JP_AUTO_DETECT: This document's kcode seems EUC.\n"));
+ break;
+ case DET_MIXED:
+ CTRACE((tfp,
+ "TH_JP_AUTO_DETECT: This document's kcode seems mixed!\n"));
+ break;
+ default:
+ CTRACE((tfp,
+ "TH_JP_AUTO_DETECT: This document's kcode is unexpected!\n"));
+ break;
+ }
+ }
+ }
+#endif /* USE_TH_JP_AUTO_DETECT */
+ /*
+ * Make sure we don't hang on escape sequences.
+ */
+ if (ch == CH_ESC && !IS_CJK_TTY) { /* decimal 27 S/390 -- gil -- 1504 */
+ return;
+ }
+#ifndef USE_SLANG
+ /*
+ * Block 8-bit chars not allowed by the current display character
+ * set if they are below what LYlowest_eightbit indicates.
+ * Slang used its own replacements, so for USE_SLANG blocking here
+ * is not necessary to protect terminals from those characters.
+ * They should have been filtered out or translated by an earlier
+ * processing stage anyway. - kw
+ */
+#ifndef EBCDIC /* S/390 -- gil -- 1514 */
+ if (is8bits(ch) && !IS_CJK_TTY &&
+ !text->T.transp && !text->T.output_utf8 &&
+ UCH(ch) < LYlowest_eightbit[current_char_set]) {
+ return;
+ }
+#endif /* EBCDIC */
+#endif /* !USE_SLANG */
+ if (UCH(ch) == 155 && !IS_CJK_TTY) { /* octal 233 */
+ if (!HTPassHighCtrlRaw &&
+ !text->T.transp && !text->T.output_utf8 &&
+ (155 < LYlowest_eightbit[current_char_set])) {
+ return;
+ }
+ }
+
+ line = text->last_line;
+ style = text->style;
+
+ indent = text->in_line_1 ? (int) style->indent1st : (int) style->leftIndent;
+
+ if (IS_CJK_TTY) {
+ switch (text->state) {
+ case S_text:
+ if (ch == CH_ESC) { /* S/390 -- gil -- 1536 */
+ /*
+ * Setting up for CJK escape sequence handling (based on
+ * Takuya ASADA's (asada@three-a.co.jp) CJK Lynx). -FM
+ */
+ text->state = S_esc;
+ text->kanji_buf = '\0';
+ return;
+ }
+ break;
+
+ case S_esc:
+ /*
+ * Expecting '$'or '(' following CJK ESC.
+ */
+ if (ch == '$') {
+ text->state = S_dollar;
+ return;
+ } else if (ch == '(') {
+ text->state = S_paren;
+ return;
+ } else {
+ text->state = S_text;
+ }
+ /* FALLTHRU */
+
+ case S_dollar:
+ /*
+ * Expecting '@', 'B', 'A' or '(' after CJK "ESC$".
+ */
+ if (ch == '@' || ch == 'B' || ch == 'A') {
+ text->state = S_nonascii_text;
+ if (ch == '@' || ch == 'B')
+ text->kcode = JIS;
+ return;
+ } else if (ch == '(') {
+ text->state = S_dollar_paren;
+ return;
+ } else {
+ text->state = S_text;
+ }
+ break;
+
+ case S_dollar_paren:
+ /*
+ * Expecting 'C' after CJK "ESC$(".
+ */
+ if (ch == 'C') {
+ text->state = S_nonascii_text;
+ return;
+ } else {
+ text->state = S_text;
+ }
+ break;
+
+ case S_paren:
+ /*
+ * Expecting 'B', 'J', 'T' or 'I' after CJK "ESC(".
+ */
+ if (ch == 'B' || ch == 'J' || ch == 'T') {
+ /*
+ * Can split here. -FM
+ */
+ text->permissible_split = text->last_line->size;
+ text->state = S_text;
+ return;
+ } else if (ch == 'I') {
+ text->state = S_jisx0201_text;
+ /*
+ * Can split here. -FM
+ */
+ text->permissible_split = text->last_line->size;
+ text->kcode = JIS;
+ return;
+ } else {
+ text->state = S_text;
+ }
+ break;
+
+ case S_nonascii_text:
+ /*
+ * Expecting CJK ESC after non-ASCII text.
+ */
+ if (ch == CH_ESC) { /* S/390 -- gil -- 1553 */
+ text->state = S_esc;
+ text->kanji_buf = '\0';
+ if (HTCJK == JAPANESE) {
+ text->kcode = NOKANJI;
+ }
+ return;
+ } else if (UCH(ch) < 32) {
+ text->state = S_text;
+ text->kanji_buf = '\0';
+ if (HTCJK == JAPANESE) {
+ text->kcode = NOKANJI;
+ }
+ } else {
+ ch |= 0200;
+ }
+ break;
+
+ /*
+ * JIS X0201 Kana in JIS support. - by ASATAKU
+ */
+ case S_jisx0201_text:
+ if (ch == CH_ESC) { /* S/390 -- gil -- 1570 */
+ text->state = S_esc;
+ text->kanji_buf = '\0';
+ text->kcode = NOKANJI;
+ return;
+ } else {
+ text->kanji_buf = '\216';
+ ch |= 0200;
+ }
+ break;
+ } /* end switch */
+
+ if (!text->kanji_buf) {
+ if ((ch & 0200) != 0) {
+ /*
+ * JIS X0201 Kana in SJIS support. - by ASATAKU
+ */
+ if ((text->kcode != JIS)
+#ifdef USE_TH_JP_AUTO_DETECT
+ && (text->specified_kcode != EUC)
+ && (text->detected_kcode != DET_EUC)
+#endif
+ && (
+#ifdef KANJI_CODE_OVERRIDE
+ (last_kcode == SJIS) ||
+ ((last_kcode == NOKANJI) &&
+#endif
+ ((text->kcode == SJIS) ||
+#ifdef USE_TH_JP_AUTO_DETECT
+ ((text->detected_kcode == DET_SJIS) &&
+ (text->specified_kcode == NOKANJI)) ||
+#endif
+ ((text->kcode == NOKANJI) &&
+ (text->specified_kcode == SJIS)))
+#ifdef KANJI_CODE_OVERRIDE
+ )
+#endif
+ ) &&
+ (UCH(ch) >= 0xA1) &&
+ (UCH(ch) <= 0xDF)) {
+ if (conv_jisx0201kana) {
+ unsigned char c = UCH(ch);
+ unsigned char kb = UCH(text->kanji_buf);
+
+ JISx0201TO0208_SJIS(c,
+ (unsigned char *) &kb,
+ (unsigned char *) &c);
+ ch = (char) c;
+ text->kanji_buf = kb;
+ }
+ /* 1998/01/19 (Mon) 09:06:15 */
+ text->permissible_split = (int) text->last_line->size;
+ } else {
+ text->kanji_buf = ch;
+ /*
+ * Can split here. -FM
+ */
+ text->permissible_split = text->last_line->size;
+ return;
+ }
+ }
+ } else {
+ goto check_WrapSource;
+ }
+ } else if (ch == CH_ESC) { /* S/390 -- gil -- 1587 */
+ return;
+ }
+#ifdef CJK_EX /* MOJI-BAKE Fix! 1997/10/12 -- 10/31 (Fri) 00:22:57 - JH7AYN */
+ if (IS_CJK_TTY && /* added condition - kw */
+ (ch == LY_BOLD_START_CHAR || ch == LY_BOLD_END_CHAR)) {
+ text->permissible_split = (int) line->size; /* Can split here */
+ if (HTCJK == JAPANESE)
+ text->kcode = NOKANJI;
+ }
+#endif
+
+ if (IsSpecialAttrChar(ch) && ch != LY_SOFT_NEWLINE) {
+#if !defined(USE_COLOR_STYLE) || !defined(NO_DUMP_WITH_BACKSPACES)
+ if (line->size >= (MAX_LINE - 1)) {
+ return;
+ }
+#if defined(USE_COLOR_STYLE) && !defined(NO_DUMP_WITH_BACKSPACES)
+ if (with_backspaces && !IS_CJK_TTY && !text->T.output_utf8) {
+#endif
+ if (ch == LY_UNDERLINE_START_CHAR) {
+ line->data[line->size++] = LY_UNDERLINE_START_CHAR;
+ line->data[line->size] = '\0';
+ underline_on = TRUE;
+ if (!(dump_output_immediately && use_underscore))
+ ctrl_chars_on_this_line++;
+ return;
+ } else if (ch == LY_UNDERLINE_END_CHAR) {
+ line->data[line->size++] = LY_UNDERLINE_END_CHAR;
+ line->data[line->size] = '\0';
+ underline_on = FALSE;
+ if (!(dump_output_immediately && use_underscore))
+ ctrl_chars_on_this_line++;
+ return;
+ } else if (ch == LY_BOLD_START_CHAR) {
+ line->data[line->size++] = LY_BOLD_START_CHAR;
+ line->data[line->size] = '\0';
+ bold_on = TRUE;
+ ctrl_chars_on_this_line++;
+ return;
+ } else if (ch == LY_BOLD_END_CHAR) {
+ line->data[line->size++] = LY_BOLD_END_CHAR;
+ line->data[line->size] = '\0';
+ bold_on = FALSE;
+ ctrl_chars_on_this_line++;
+ return;
+ } else if (ch == LY_SOFT_HYPHEN) {
+ int i;
+
+ /*
+ * Ignore the soft hyphen if it is the first character
+ * on the line, or if it is preceded by a space or
+ * hyphen. -FM
+ */
+ if (line->size < 1 || text->permissible_split >= line->size) {
+ return;
+ }
+
+ for (i = (int) (text->permissible_split + 1);
+ line->data[i];
+ i++) {
+ if (!IsSpecialAttrChar(UCH(line->data[i])) &&
+ !isspace(UCH(line->data[i])) &&
+ UCH(line->data[i]) != '-' &&
+ UCH(line->data[i]) != HT_NON_BREAK_SPACE &&
+ UCH(line->data[i]) != HT_EN_SPACE) {
+ break;
+ }
+ }
+ if (line->data[i] == '\0') {
+ return;
+ }
+ }
+#if defined(USE_COLOR_STYLE) && !defined(NO_DUMP_WITH_BACKSPACES)
+ } else {
+ /* if (with_backspaces && HTCJK==HTNOCJK && !text->T.output_utf8) */
+ return;
+ }
+#endif
+
+#else
+ return;
+#endif
+ } else if (ch == LY_SOFT_NEWLINE) {
+ if (line->size < MAX_LINE) {
+ line->data[line->size++] = LY_SOFT_NEWLINE;
+ line->data[line->size] = '\0';
+ }
+ return;
+ }
+
+ if (text->T.output_utf8) {
+ /*
+ * Some extra checks for UTF-8 output here to make sure
+ * memory is not overrun. For a non-first char, append
+ * to the line here and return. - kw
+ */
+ if (IS_UTF_EXTRA(ch)) {
+ if ((line->size > (MAX_LINE - 1))
+ || (indent + (int) (line->offset + line->size)
+ + UTFXTRA_ON_THIS_LINE
+ - ctrl_chars_on_this_line
+ + ((line->size > 0) &&
+ (int) (line->data[line->size - 1] ==
+ LY_SOFT_HYPHEN ?
+ 1 : 0)) >= LYcols_cu(text))
+ ) {
+ if (!text->permissible_split || text->source) {
+ text->permissible_split = line->size;
+ while (text->permissible_split > 0 &&
+ IS_UTF_EXTRA(line->data[text->permissible_split - 1]))
+ text->permissible_split--;
+ if (text->permissible_split &&
+ (line->data[text->permissible_split - 1] & 0x80))
+ text->permissible_split--;
+ if (text->permissible_split == line->size)
+ text->permissible_split = 0;
+ }
+ split_line(text, text->permissible_split);
+ line = text->last_line;
+ if (text->source && line->size - ctrl_chars_on_this_line
+ + UTFXTRA_ON_THIS_LINE == 0)
+ HText_appendCharacter(text, LY_SOFT_NEWLINE);
+ }
+ if (line->size < MAX_LINE) {
+ line->data[line->size++] = (char) ch;
+ line->data[line->size] = '\0';
+ utfxtra_on_this_line++;
+ ctrl_chars_on_this_line++;
+ }
+#ifdef EXP_WCWIDTH_SUPPORT
+ /* update utfxtracells_on_this_line on last byte of UTF-8 sequence */
+ {
+ /* find start position of UTF-8 sequence */
+ int utff = line->size - 2;
+ int utf_xlen;
+
+ while (utff > 0 && IS_UTF_EXTRA(line->data[utff]))
+ utff--;
+ utf_xlen = UTF_XLEN(line->data[utff]);
+
+ if (line->size - utff == utf_xlen + 1) { /* have last byte */
+ utfxtracells_on_this_line += utfextracells(&(line->data[utff]));
+ permit_split_after_CJchar(text, &(line->data[utff]), line->size);
+ }
+ }
+#endif
+ return;
+ } else if (ch & 0x80) { /* a first char of UTF-8 sequence - kw */
+ if ((line->size > (MAX_LINE - 7))) {
+ if (!text->permissible_split || text->source) {
+ text->permissible_split = line->size;
+ while (text->permissible_split > 0 &&
+ (line->data[text->permissible_split - 1] & 0xc0)
+ == 0x80) {
+ text->permissible_split--;
+ }
+ if (text->permissible_split == line->size)
+ text->permissible_split = 0;
+ }
+ split_line(text, text->permissible_split);
+ line = text->last_line;
+ if (text->source && line->size - ctrl_chars_on_this_line
+ + UTFXTRA_ON_THIS_LINE == 0)
+ HText_appendCharacter(text, LY_SOFT_NEWLINE);
+ }
+ }
+ }
+
+ /*
+ * New Line.
+ */
+ if (ch == '\n') {
+ new_line(text);
+ text->in_line_1 = YES; /* First line of new paragraph */
+ /*
+ * There are some pages written in
+ * different kanji codes. - TA & kw
+ */
+ if (HTCJK == JAPANESE)
+ text->kcode = NOKANJI;
+ return;
+ }
+
+ /*
+ * Convert EN_SPACE to a space here so that it doesn't get collapsed.
+ */
+ if (ch == HT_EN_SPACE)
+ ch = ' ';
+
+#ifdef SH_EX /* 1997/11/01 (Sat) 12:08:54 */
+ if (ch == 0x0b) { /* ^K ??? */
+ ch = '\r';
+ }
+ if (ch == 0x1a) { /* ^Z ??? */
+ ch = '\r';
+ }
+#endif
+
+ /*
+ * I'm going to cheat here in a BIG way. Since I know that all
+ * \r's will be trapped by HTML_put_character I'm going to use
+ * \r to mean go down a line but don't start a new paragraph.
+ * i.e., use the second line indenting.
+ */
+ if (ch == '\r') {
+ new_line(text);
+ text->in_line_1 = NO;
+ /*
+ * There are some pages written in
+ * different kanji codes. - TA & kw
+ */
+ if (HTCJK == JAPANESE)
+ text->kcode = NOKANJI;
+ return;
+ }
+
+ /*
+ * Tabs.
+ */
+ if (ch == '\t') {
+ const HTTabStop *Tab;
+ int target, target_cu; /* Where to tab to */
+ int here, here_cu; /* in _cu we try to guess what curses thinks */
+
+ if (line->size > 0 && line->data[line->size - 1] == LY_SOFT_HYPHEN) {
+ /*
+ * A tab shouldn't follow a soft hyphen, so
+ * if one does, we'll dump the soft hyphen. -FM
+ */
+ line->data[--line->size] = '\0';
+ ctrl_chars_on_this_line--;
+ }
+ here = ((int) (line->size + line->offset) + indent)
+ - ctrl_chars_on_this_line; /* Consider special chars GAB */
+ here_cu = here + UTFXTRA_ON_THIS_LINE;
+ if (style->tabs) { /* Use tab table */
+ for (Tab = style->tabs;
+ Tab->position <= here;
+ Tab++) {
+ if (!Tab->position) {
+ new_line(text);
+ return;
+ }
+ }
+ target = Tab->position;
+ } else if (text->in_line_1) { /* Use 2nd indent */
+ if (here >= (int) style->leftIndent) {
+ new_line(text); /* wrap */
+ return;
+ } else {
+ target = (int) style->leftIndent;
+ }
+ } else { /* Default tabs align with left indent mod 8 */
+#ifdef DEFAULT_TABS_8
+ target = (((int) line->offset + (int) line->size + 8) & (-8))
+ + (int) style->leftIndent;
+#else
+ new_line(text);
+ return;
+#endif
+ }
+
+ if (target >= here)
+ target_cu = target;
+ else
+ target_cu = target + (here_cu - here);
+
+ if (target > WRAP_COLS(text) - (int) style->rightIndent &&
+ HTOutputFormat != WWW_SOURCE) {
+ new_line(text);
+ } else {
+ /*
+ * Can split here. -FM
+ */
+ text->permissible_split = line->size;
+ if (target_cu > WRAP_COLS(text))
+ target -= target_cu - WRAP_COLS(text);
+ if (line->size == 0) {
+ line->offset = (unsigned short) (line->offset + (target - here));
+ } else {
+ for (; here < target; here++) {
+ /* Put character into line */
+ if (line->size >= MAX_LINE)
+ break;
+ line->data[line->size++] = ' ';
+ line->data[line->size] = '\0';
+ }
+ }
+ }
+ return;
+ }
+ /* if tab */
+ check_WrapSource:
+ if ((text->source || dont_wrap_pre) && text == HTMainText) {
+ /*
+ * If we're displaying document source, wrap long lines to keep all of
+ * the source visible.
+ */
+ int target = (int) (line->offset + line->size) - ctrl_chars_on_this_line;
+ int target_cu = target + UTFXTRA_ON_THIS_LINE;
+
+ if (target >= WRAP_COLS(text) - style->rightIndent -
+ ((IS_CJK_TTY && text->kanji_buf) ? 1 : 0) ||
+ (text->T.output_utf8 &&
+ target_cu + UTF_XLEN(ch) >= LYcols_cu(text))) {
+ int saved_kanji_buf;
+ eGridState saved_state;
+ BOOL add_blank = (dont_wrap_pre
+ && line->size
+ && (line->data[line->size - 1] == ' '));
+
+ new_line(text);
+ line = text->last_line;
+
+ saved_kanji_buf = text->kanji_buf;
+ saved_state = text->state;
+ text->kanji_buf = '\0';
+ text->state = S_text;
+ HText_appendCharacter(text, LY_SOFT_NEWLINE);
+ if (add_blank)
+ HText_appendCharacter(text, ' ');
+ text->kanji_buf = saved_kanji_buf;
+ text->state = saved_state;
+ }
+ }
+
+ if (ch == ' ') {
+ /*
+ * Can split here. -FM
+ */
+ text->permissible_split = text->last_line->size;
+ /*
+ * There are some pages written in
+ * different kanji codes. - TA
+ */
+ if (HTCJK == JAPANESE)
+ text->kcode = NOKANJI;
+ }
+
+ /*
+ * Check for end of line.
+ *
+ * Notes:
+ * 1) text->permissible_split is nonzero if we found a place to split the
+ * line. If there is no such place, we still will wrap at the display
+ * limits (the comparison against LYcols_cu). Furthermore, if the
+ * curses-pads feature is active, we will ignore the first comparison
+ * (against WRAP_COLS) to allow wide preformatted text to be displayed
+ * without wrapping.
+ * 2) ctrl_chars_on_this_line are nonprintable bytes used for formatting.
+ */
+ actual = ((indent + (int) line->offset + (int) line->size) +
+ ((line->size > 0) &&
+ (int) (line->data[line->size - 1] == LY_SOFT_HYPHEN ? 1 : 0))
+ - ctrl_chars_on_this_line);
+
+ if ((
+#if !defined(USE_SLANG) && !defined(PDCURSES)
+ (text->permissible_split
+#ifdef USE_CURSES_PADS
+ || !LYwideLines
+#endif
+ ) &&
+#endif
+ (actual
+ + (int) style->rightIndent
+ + ((IS_CJK_TTY && text->kanji_buf) ? 1 : 0)
+#ifdef EXP_WCWIDTH_SUPPORT
+ + utfxtracells_on_this_line
+#endif
+ ) >= WRAP_COLS(text))
+ || (text->T.output_utf8
+ && ((actual
+ + UTFXTRA_ON_THIS_LINE
+ + UTF_XLEN(ch)
+ ) > (LYcols_cu(text) - 1)))) {
+
+ if (style->wordWrap && HTOutputFormat != WWW_SOURCE) {
+#ifdef USE_JUSTIFY_ELTS
+ if (REALLY_CAN_JUSTIFY(text))
+ this_line_was_split = TRUE;
+#endif
+ split_line(text, text->permissible_split);
+ if (ch == ' ') {
+ return; /* Ignore space causing split */
+ }
+
+ } else if (HTOutputFormat == WWW_SOURCE) {
+ /*
+ * For source output we don't want to wrap this stuff
+ * unless absolutely necessary. - LJM
+ * !
+ * If we don't wrap here we might get a segmentation fault.
+ * but let's see what happens
+ */
+ if ((int) line->size >= (int) (MAX_LINE - 1)) {
+ new_line(text); /* try not to linewrap */
+ }
+ } else {
+ /*
+ * For normal stuff like pre let's go ahead and
+ * wrap so the user can see all of the text.
+ */
+ if ((dump_output_immediately || (crawl && traversal))
+ && dont_wrap_pre) {
+ if ((int) line->size >= (int) (MAX_LINE - 1)) {
+ new_line(text);
+ }
+ } else {
+ new_line(text);
+ }
+ }
+ } else if ((int) line->size >= (int) (MAX_LINE - 1)) {
+ /*
+ * Never overrun memory if DISPLAY_COLS is set to a large value - KW
+ */
+ new_line(text);
+ }
+
+ /*
+ * Insert normal characters.
+ */
+ if (ch == HT_NON_BREAK_SPACE
+#ifdef USE_JUSTIFY_ELTS
+ && !REALLY_CAN_JUSTIFY(text)
+#endif
+ )
+ ch = ' ';
+#ifdef USE_JUSTIFY_ELTS
+ else
+ have_raw_nbsps = TRUE;
+#endif
+
+ /* we leave raw HT_NON_BREAK_SPACE otherwise (we'll substitute it later) */
+
+ if (ch & 0x80)
+ text->have_8bit_chars = YES;
+
+ /*
+ * Kanji character handling.
+ */
+ {
+ HTFont font = style->font;
+ unsigned char hi, lo, tmp[2];
+
+ line = text->last_line; /* May have changed */
+
+ if (line->size >= MAX_LINE) {
+ ;
+ } else if (IS_CJK_TTY && text->kanji_buf) {
+ hi = UCH(text->kanji_buf);
+ lo = UCH(ch);
+
+ if (HTCJK == JAPANESE) {
+ if (text->kcode != JIS) {
+ if (IS_SJIS_2BYTE(hi, lo)) {
+ if (IS_EUC(hi, lo)) {
+#ifdef KANJI_CODE_OVERRIDE
+ if (last_kcode != NOKANJI)
+ text->kcode = last_kcode;
+ else
+#endif
+ if (text->specified_kcode != NOKANJI)
+ text->kcode = text->specified_kcode;
+#ifdef USE_TH_JP_AUTO_DETECT
+ else if (text->detected_kcode == DET_EUC)
+ text->kcode = EUC;
+ else if (text->detected_kcode == DET_SJIS)
+ text->kcode = SJIS;
+#endif
+ else if (IS_EUC_X0201KANA(hi, lo) &&
+ (text->kcode != EUC))
+ text->kcode = SJIS;
+ } else
+ text->kcode = SJIS;
+ } else if (IS_EUC(hi, lo))
+ text->kcode = EUC;
+ else
+ text->kcode = NOKANJI;
+ }
+
+ switch (kanji_code) {
+ case EUC:
+ if (text->kcode == SJIS) {
+ SJIS_TO_EUC1(hi, lo, tmp);
+ line->data[line->size++] = (char) tmp[0];
+ line->data[line->size++] = (char) tmp[1];
+ } else if (IS_EUC(hi, lo)) {
+ if (conv_jisx0201kana) {
+ JISx0201TO0208_EUC(hi, lo, &hi, &lo);
+ }
+ line->data[line->size++] = (char) hi;
+ line->data[line->size++] = (char) lo;
+ } else {
+ CTRACE((tfp,
+ "This character (%X:%X) doesn't seem Japanese\n",
+ hi, lo));
+ line->data[line->size++] = '=';
+ line->data[line->size++] = '=';
+ }
+ break;
+
+ case SJIS:
+ if ((text->kcode == EUC) || (text->kcode == JIS)) {
+ if (!conv_jisx0201kana && IS_EUC_X0201KANA(hi, lo))
+ line->data[line->size++] = (char) lo;
+ else {
+ EUC_TO_SJIS1(hi, lo, tmp);
+ line->data[line->size++] = (char) tmp[0];
+ line->data[line->size++] = (char) tmp[1];
+ }
+ } else if (IS_SJIS_2BYTE(hi, lo)) {
+ line->data[line->size++] = (char) hi;
+ line->data[line->size++] = (char) lo;
+ } else {
+ line->data[line->size++] = '=';
+ line->data[line->size++] = '=';
+ CTRACE((tfp,
+ "This character (%X:%X) doesn't seem Japanese\n",
+ hi, lo));
+ }
+ break;
+
+ default:
+ break;
+ }
+ } else {
+ line->data[line->size++] = (char) hi;
+ line->data[line->size++] = (char) lo;
+ }
+ text->kanji_buf = 0;
+ } else if (!conv_jisx0201kana
+ && (HTCJK == JAPANESE)
+ && IS_SJIS_X0201KANA(UCH((ch))) &&
+ (kanji_code == EUC)) {
+ line->data[line->size++] = (char) UCH(0x8e);
+ line->data[line->size++] = (char) ch;
+ } else if (IS_CJK_TTY) {
+ line->data[line->size++] = (char) ((kanji_code != NOKANJI) ?
+ ch :
+ (font & HT_CAPITALS) ?
+ TOUPPER(ch) : ch);
+ } else {
+ line->data[line->size++] = /* Put character into line */
+ (char) (font & HT_CAPITALS ? TOUPPER(ch) : ch);
+ }
+ line->data[line->size] = '\0';
+ if (font & HT_DOUBLE) /* Do again if doubled */
+ HText_appendCharacter(text, HT_NON_BREAK_SPACE);
+ /* NOT a permissible split */
+
+ if (ch == LY_SOFT_HYPHEN) {
+ ctrl_chars_on_this_line++;
+ /*
+ * Can split here. -FM
+ */
+ text->permissible_split = text->last_line->size;
+ }
+ if (ch == LY_SOFT_NEWLINE) {
+ ctrl_chars_on_this_line++;
+ }
+ }
+ return;
+}
+
+#ifdef USE_COLOR_STYLE
+/* Insert a style change into the current line
+ * -------------------------------------------
+ */
+void _internal_HTC(HText *text, int style, int dir)
+{
+ HTLine *line;
+
+ /* can't change style if we have no text to change style with */
+ if (text != 0) {
+
+ line = text->last_line;
+
+ if (line->numstyles > 0 && dir == 0 &&
+ line->styles[line->numstyles - 1].sc_direction &&
+ line->styles[line->numstyles - 1].sc_style == (unsigned) style &&
+ (int) line->styles[line->numstyles - 1].sc_horizpos
+ == (int) line->size - ctrl_chars_on_this_line) {
+ /*
+ * If this is an OFF change directly preceded by an
+ * ON for the same style, just remove the previous one. - kw
+ */
+ line->numstyles--;
+ } else if (line->numstyles < MAX_STYLES_ON_LINE) {
+ line->styles[line->numstyles].sc_horizpos = CAST_POS(line->size);
+ /*
+ * Special chars for bold and underlining usually don't
+ * occur with color style, but soft hyphen can.
+ * And in UTF-8 display mode all non-initial bytes are
+ * counted as ctrl_chars. - kw
+ */
+ if ((int) line->styles[line->numstyles].sc_horizpos >= ctrl_chars_on_this_line) {
+ line->styles[line->numstyles].sc_horizpos =
+ CAST_POS(line->styles[line->numstyles].sc_horizpos
+ - ctrl_chars_on_this_line);
+ }
+ line->styles[line->numstyles].sc_style = (unsigned short) style;
+ line->styles[line->numstyles].sc_direction = CAST_DIR(dir);
+ CTRACE_STYLE((tfp, "internal_HTC %d:style[%d] %d (dir=%d)\n",
+ line->size,
+ line->numstyles,
+ style,
+ dir));
+ line->numstyles++;
+ }
+ }
+}
+#endif
+
+/* Set LastChar element in the text object.
+ * ----------------------------------------
+ */
+void HText_setLastChar(HText *text, int ch)
+{
+ if (!text)
+ return;
+
+#ifdef EXP_JAPANESE_SPACES
+ if (IS_UTF_EXTRA(ch) && IS_UTF_FIRST(text->LastChars[0])) {
+ int i;
+
+ for (i = 1;
+ text->LastChars[i] != '\0' && i < sizeof(text->LastChars) - 1;
+ i++) {
+ ;
+ }
+ text->LastChars[i] = (char) ch;
+ text->LastChars[i + 1] = '\0';
+ return;
+ }
+ memset(text->LastChars, 0, sizeof(text->LastChars));
+ text->LastChars[0] = (char) ch;
+#else
+ text->LastChar = (char) ch;
+#endif
+}
+
+/* Get LastChar element in the text object.
+ * ----------------------------------------
+ */
+char HText_getLastChar(HText *text)
+{
+ if (!text)
+ return ('\0');
+
+#ifdef EXP_JAPANESE_SPACES
+ if (IS_UTF_FIRST(text->LastChars[0])) {
+ int i;
+
+ for (i = 1;
+ text->LastChars[i] != '\0' && i < sizeof(text->LastChars);
+ i++) {
+ ;
+ }
+ return ((char) text->LastChars[i - 1]);
+ }
+ return ((char) text->LastChars[0]);
+#else
+ return ((char) text->LastChar);
+#endif
+}
+
+#ifdef EXP_JAPANESE_SPACES
+BOOL HText_checkLastChar_needSpaceOnJoinLines(HText *text)
+{
+ if (!text)
+ return YES;
+
+ if (IS_UTF_FIRST(text->LastChars[0]) && isUTF8CJChar(text->LastChars))
+ return NO;
+ if ((HTCJK == CHINESE || HTCJK == JAPANESE) && is8bits(text->LastChars[0])) {
+ /* TODO: support 2nd byte of some SJIS kanji (!is8bits && IS_SJIS_LO) */
+ return NO;
+ }
+ if (text->LastChars[0] != ' ')
+ return YES;
+ return NO;
+}
+#endif
+
+/* Simple table handling - private
+ * -------------------------------
+ */
+
+/*
+ * HText_insertBlanksInStblLines fixes up table lines when simple table
+ * processing is closed, by calling insert_blanks_in_line for lines
+ * that need fixup. Also recalculates alignment for those lines,
+ * does additional updating of anchor positions, and makes sure the
+ * display of the lines on screen will be updated after partial display
+ * upon return to mainloop. - kw
+ */
+static int HText_insertBlanksInStblLines(HText *me, int ncols)
+{
+ HTLine *line;
+ HTLine *mod_line, *first_line = NULL;
+ int *oldpos;
+ int *newpos;
+ int ninserts, lineno;
+ int last_lineno, first_lineno_pass2;
+
+#ifdef EXP_NESTED_TABLES
+ int last_nonempty = -1;
+#endif
+ int lines_changed = 0;
+ int max_width = 0, indent, spare, table_offset;
+ HTStyle *style;
+ short alignment;
+ int i = 0;
+
+ lineno = Stbl_getStartLine(me->stbl);
+ if (lineno < 0 || lineno > me->Lines)
+ return -1;
+ /*
+ * oldpos, newpos: allocate space for two int arrays.
+ */
+ oldpos = typecallocn(int, 2 * (size_t)ncols);
+ if (!oldpos)
+ return -1;
+ else
+ newpos = oldpos + ncols;
+ for (line = FirstHTLine(me); i < lineno; line = line->next, i++) {
+ if (!line) {
+ free(oldpos);
+ return -1;
+ }
+ }
+ first_lineno_pass2 = last_lineno = me->Lines;
+ for (; line && lineno <= last_lineno; line = line->next, lineno++) {
+ ninserts = Stbl_getFixupPositions(me->stbl, lineno, oldpos, newpos);
+ if (ninserts < 0)
+ continue;
+ if (!first_line) {
+ first_line = line;
+ first_lineno_pass2 = lineno;
+ if (TRACE) {
+ int ip;
+
+ CTRACE((tfp, "line %d first to adjust -- newpos:", lineno));
+ for (ip = 0; ip < ncols; ip++)
+ CTRACE((tfp, " %d", newpos[ip]));
+ CTRACE((tfp, "\n"));
+ }
+ }
+ if (line == me->last_line) {
+ if (line->size == 0 || HText_TrueEmptyLine(line, me, FALSE))
+ continue;
+ /*
+ * Last ditch effort to end the table with a line break,
+ * if HTML_end_element didn't do it. - kw
+ */
+ if (first_line == line) /* obscure: all table on last line... */
+ first_line = NULL;
+ new_line(me);
+ line = me->last_line->prev;
+ if (first_line == NULL)
+ first_line = line;
+ }
+ if (ninserts == 0) {
+ /* Do it also for no positions (but not error) */
+ int width = HText_TrueLineSize(line, me, FALSE);
+
+ if (width > max_width)
+ max_width = width;
+#ifdef EXP_NESTED_TABLES
+ if (nested_tables) {
+ if (width && last_nonempty < lineno)
+ last_nonempty = lineno;
+ }
+#endif
+ CTRACE((tfp, "line %d true/max width:%d/%d oldpos: NONE\n",
+ lineno, width, max_width));
+ continue;
+ }
+ mod_line = insert_blanks_in_line(line, lineno, me,
+ &me->last_anchor_before_stbl /*updates++ */ ,
+ ninserts, oldpos, newpos);
+ if (mod_line) {
+ if (line == me->last_line) {
+ me->last_line = mod_line;
+ }
+ line->prev->next = mod_line;
+ line->next->prev = mod_line;
+ lines_changed++;
+ if (line == first_line)
+ first_line = mod_line;
+ freeHTLine(me, line);
+ line = mod_line;
+#ifdef DISP_PARTIAL
+ /*
+ * Make sure modified lines get fully re-displayed after
+ * loading with partial display is done.
+ */
+ if (me->first_lineno_last_disp_partial >= 0) {
+ if (me->first_lineno_last_disp_partial >= lineno) {
+ ResetPartialLinenos(me);
+ } else if (me->last_lineno_last_disp_partial >= lineno) {
+ me->last_lineno_last_disp_partial = lineno - 1;
+ }
+ }
+#endif
+ } {
+ int width = HText_TrueLineSize(line, me, FALSE);
+
+ if (width > max_width)
+ max_width = width;
+#ifdef EXP_NESTED_TABLES
+ if (nested_tables) {
+ if (width && last_nonempty < lineno)
+ last_nonempty = lineno;
+ }
+#endif
+ if (TRACE) {
+ int ip;
+
+ CTRACE((tfp, "line %d true/max width:%d/%d oldpos:",
+ lineno, width, max_width));
+ for (ip = 0; ip < ninserts; ip++)
+ CTRACE((tfp, " %d", oldpos[ip]));
+ CTRACE((tfp, "\n"));
+ }
+ }
+ }
+ /*
+ * Line offsets have been set based on the paragraph style, and
+ * have already been updated for centering or right-alignment
+ * for each line in split_line. Here we want to undo all that, and
+ * align the table as a whole (i.e. all lines for which
+ * Stbl_getFixupPositions returned >= 0). All those lines have to
+ * get the same offset, for the simple table formatting mechanism
+ * to make sense, and that may not actually be the case at this point.
+ *
+ * What indentation and alignment do we want for the table as
+ * a whole? Let's take most style properties from me->style.
+ * With some luck, it is the appropriate style for the element
+ * enclosing the TABLE. But let's take alignment from the attribute
+ * of the TABLE itself instead, if it was specified.
+ *
+ * Note that this logic assumes that all lines have been finished
+ * by split_line. The order of calls made by HTML_end_element for
+ * HTML_TABLE should take care of this.
+ */
+ style = me->style;
+ alignment = Stbl_getAlignment(me->stbl);
+ if (alignment == HT_ALIGN_NONE)
+ alignment = style->alignment;
+ indent = style->leftIndent;
+ /* Calculate spare character positions */
+ spare = WRAP_COLS(me) -
+ (int) style->rightIndent - indent - max_width;
+ if (spare < 0 && (int) style->rightIndent + spare >= 0) {
+ /*
+ * Not enough room! But we can fit if we ignore right indentation,
+ * so let's do that.
+ */
+ spare = 0;
+ } else if (spare < 0) {
+ spare += style->rightIndent; /* ignore right indent, but need more */
+ }
+ if (spare < 0 && indent + spare >= 0) {
+ /*
+ * Still not enough room. But we can move to the left.
+ */
+ indent += spare;
+ spare = 0;
+ } else if (spare < 0) {
+ /*
+ * Still not enough. Something went wrong. Try the best we
+ * can do.
+ */
+ CTRACE((tfp,
+ "BUG: insertBlanks: resulting table too wide by %d positions!\n",
+ -spare));
+ indent = spare = 0;
+ }
+ /*
+ * Align left, right or center.
+ */
+ switch (alignment) {
+ case HT_CENTER:
+ table_offset = indent + spare / 2;
+ break;
+ case HT_RIGHT:
+ table_offset = indent + spare;
+ break;
+ case HT_LEFT:
+ case HT_JUSTIFY:
+ default:
+ table_offset = indent;
+ break;
+ } /* switch */
+
+ CTRACE((tfp, "changing offsets"));
+ for (line = first_line, lineno = first_lineno_pass2;
+ line && lineno <= last_lineno && line != me->last_line;
+ line = line->next, lineno++) {
+ ninserts = Stbl_getFixupPositions(me->stbl, lineno, oldpos, newpos);
+ if (ninserts >= 0 && (int) line->offset != table_offset) {
+#ifdef DISP_PARTIAL
+ /* As above make sure modified lines get fully re-displayed */
+ if (me->first_lineno_last_disp_partial >= 0) {
+ if (me->first_lineno_last_disp_partial >= lineno) {
+ ResetPartialLinenos(me);
+ } else if (me->last_lineno_last_disp_partial >= lineno) {
+ me->last_lineno_last_disp_partial = lineno - 1;
+ }
+ }
+#endif
+ CTRACE((tfp, " %d:%d", lineno, table_offset - line->offset));
+ line->offset = (unsigned short) (table_offset > 0
+ ? table_offset
+ : 0);
+ }
+ }
+#ifdef EXP_NESTED_TABLES
+ if (nested_tables) {
+ if (max_width)
+ Stbl_update_enclosing(me->stbl, max_width, last_nonempty);
+ }
+#endif
+ CTRACE((tfp, " %d:done\n", lineno));
+ free(oldpos);
+ return lines_changed;
+}
+
+/* Simple table handling - public functions
+ * ----------------------------------------
+ */
+
+/* Cancel simple table handling
+*/
+void HText_cancelStbl(HText *me)
+{
+ if (!me || !me->stbl) {
+ CTRACE((tfp, "cancelStbl: ignored.\n"));
+ return;
+ }
+ CTRACE((tfp, "cancelStbl: ok, will do.\n"));
+#ifdef EXP_NESTED_TABLES
+ if (nested_tables) {
+ STable_info *stbl = me->stbl;
+
+ while (stbl) {
+ STable_info *enclosing = Stbl_get_enclosing(stbl);
+
+ Stbl_free(stbl);
+ stbl = enclosing;
+ }
+ } else
+#endif
+ Stbl_free(me->stbl);
+ me->stbl = NULL;
+}
+
+/* Start simple table handling
+*/
+void HText_startStblTABLE(HText *me, int alignment)
+{
+ if (me) {
+#ifdef EXP_NESTED_TABLES
+ STable_info *current = me->stbl;
+#endif
+
+#ifdef EXP_NESTED_TABLES
+ if (nested_tables) {
+ if (current)
+ new_line(me);
+ } else
+#endif
+ {
+ if (me->stbl) {
+ HText_cancelStbl(me); /* auto cancel previously open table */
+ }
+ }
+
+ me->stbl = Stbl_startTABLE(alignment);
+ if (me->stbl) {
+ CTRACE((tfp, "startStblTABLE: started.\n"));
+#ifdef EXP_NESTED_TABLES
+ if (nested_tables) {
+ Stbl_set_enclosing(me->stbl, current, me->last_anchor_before_stbl);
+ }
+#endif
+ me->last_anchor_before_stbl = me->last_anchor;
+ } else {
+ CTRACE((tfp, "startStblTABLE: failed.\n"));
+ }
+ }
+}
+
+#ifdef EXP_NESTED_TABLES
+static void free_enclosed_stbl(HText *me)
+{
+ if (me != NULL && me->enclosed_stbl != NULL) {
+ HTList *list = me->enclosed_stbl;
+ STable_info *stbl;
+
+ while (NULL != (stbl = (STable_info *) HTList_nextObject(list))) {
+ CTRACE((tfp, "endStblTABLE: finally free %p\n", (void *) me->stbl));
+ Stbl_free(stbl);
+ }
+ HTList_delete(me->enclosed_stbl);
+ me->enclosed_stbl = NULL;
+ }
+}
+
+#else
+#define free_enclosed_stbl(me) /* nothing */
+#endif
+
+/* Finish simple table handling
+ * Return TRUE if the table is nested inside another table.
+ */
+BOOLEAN HText_endStblTABLE(HText *me)
+{
+ int ncols, lines_changed = 0;
+ STable_info *enclosing = NULL;
+
+ if (!me || !me->stbl) {
+ CTRACE((tfp, "endStblTABLE: ignored.\n"));
+ free_enclosed_stbl(me);
+ return FALSE;
+ }
+ CTRACE((tfp, "endStblTABLE: ok, will try.\n"));
+
+ ncols = Stbl_finishTABLE(me->stbl);
+ CTRACE((tfp, "endStblTABLE: ncols = %d.\n", ncols));
+
+ if (ncols > 0) {
+ lines_changed = HText_insertBlanksInStblLines(me, ncols);
+ CTRACE((tfp, "endStblTABLE: changed %d lines, done.\n", lines_changed));
+#ifdef DISP_PARTIAL
+ /* allow HTDisplayPartial() to redisplay the changed lines.
+ * There is no harm if we got several stbl in the document, hope so.
+ */
+ NumOfLines_partial -= lines_changed; /* fake */
+#endif /* DISP_PARTIAL */
+ }
+#ifdef EXP_NESTED_TABLES
+ if (nested_tables) {
+ enclosing = Stbl_get_enclosing(me->stbl);
+ me->last_anchor_before_stbl = Stbl_get_last_anchor_before(me->stbl);
+ if (enclosing == NULL) {
+ Stbl_free(me->stbl);
+ free_enclosed_stbl(me);
+ } else {
+ if (me->enclosed_stbl == NULL)
+ me->enclosed_stbl = HTList_new();
+ HTList_addObject(me->enclosed_stbl, me->stbl);
+ CTRACE((tfp, "endStblTABLE: postpone free %p\n", (void *) me->stbl));
+ }
+ me->stbl = enclosing;
+ } else {
+ Stbl_free(me->stbl);
+ me->stbl = NULL;
+ }
+#else
+ Stbl_free(me->stbl);
+ me->stbl = NULL;
+#endif
+
+ CTRACE((tfp, "endStblTABLE: have%s enclosing table (%p)\n",
+ enclosing == 0 ? " NO" : "", (void *) enclosing));
+
+ return (BOOLEAN) (enclosing != 0);
+}
+
+/* Start simple table row
+*/
+void HText_startStblTR(HText *me, int alignment)
+{
+ if (!me || !me->stbl)
+ return;
+ if (Stbl_addRowToTable(me->stbl, alignment, me->Lines) < 0) {
+ HText_cancelStbl(me); /* give up */
+ }
+}
+
+/* Finish simple table row
+*/
+void HText_endStblTR(HText *me)
+{
+ if (!me || !me->stbl)
+ return;
+ /* should this do something?? */
+}
+
+/* Start simple table cell
+*/
+void HText_startStblTD(HText *me, int colspan,
+ int rowspan,
+ int alignment,
+ int isheader)
+{
+ if (!me || !me->stbl)
+ return;
+ if (colspan < 0)
+ colspan = 1;
+ if (colspan > TRST_MAXCOLSPAN) {
+ CTRACE((tfp, "*** COLSPAN=%d is too large, ignored!\n", colspan));
+ colspan = 1;
+ }
+ if (rowspan > TRST_MAXROWSPAN) {
+ CTRACE((tfp, "*** ROWSPAN=%d is too large, ignored!\n", rowspan));
+ rowspan = 1;
+ }
+ if (Stbl_addCellToTable(me->stbl, colspan, rowspan, alignment, isheader,
+ me->Lines,
+ HText_LastLineOffset(me),
+ HText_LastLineSize(me, FALSE)) < 0) {
+ HText_cancelStbl(me); /* give up */
+ }
+}
+
+/* Finish simple table cell
+*/
+void HText_endStblTD(HText *me)
+{
+ if (!me || !me->stbl)
+ return;
+ if (Stbl_finishCellInTable(me->stbl, TRST_ENDCELL_ENDTD,
+ me->Lines,
+ HText_LastLineOffset(me),
+ HText_LastLineSize(me, FALSE)) < 0) {
+ HText_cancelStbl(me); /* give up */
+ }
+}
+
+/* Remember COL info / Start a COLGROUP and remember info
+*/
+void HText_startStblCOL(HText *me, int span,
+ int alignment,
+ int isgroup)
+{
+ if (!me || !me->stbl)
+ return;
+ if (span <= 0)
+ span = 1;
+ if (span > TRST_MAXCOLSPAN) {
+ CTRACE((tfp, "*** SPAN=%d is too large, ignored!\n", span));
+ span = 1;
+ }
+ if (Stbl_addColInfo(me->stbl, span, alignment, isgroup) < 0) {
+ HText_cancelStbl(me); /* give up */
+ }
+}
+
+/* Finish a COLGROUP
+*/
+void HText_endStblCOLGROUP(HText *me)
+{
+ if (!me || !me->stbl)
+ return;
+ if (Stbl_finishColGroup(me->stbl) < 0) {
+ HText_cancelStbl(me); /* give up */
+ }
+}
+
+/* Start a THEAD / TFOOT / TBODY - remember its alignment info
+*/
+void HText_startStblRowGroup(HText *me, int alignment)
+{
+ if (!me || !me->stbl)
+ return;
+ if (Stbl_addRowGroup(me->stbl, alignment) < 0) {
+ HText_cancelStbl(me); /* give up */
+ }
+}
+
+static void compute_show_number(TextAnchor *a)
+{
+ HTAnchor *cur, *tst;
+ TextAnchor *b;
+ int match;
+
+ a->show_number = a->number;
+ if (unique_urls
+ && HTMainText != 0
+ && HTMainText->first_anchor != 0
+ && a->anchor != 0
+ && (cur = a->anchor->dest) != 0
+ && cur->parent != 0
+ && cur->parent->address != 0) {
+
+ match = 0;
+ for (b = HTMainText->first_anchor; b != a; b = b->next) {
+ if (b->anchor != 0
+ && (tst = b->anchor->dest) != 0
+ && tst->parent != 0
+ && tst->parent->address != 0
+ && !strcmp(cur->parent->address,
+ tst->parent->address)
+ && !strcmp(NonNull(a->anchor->tag), NonNull(b->anchor->tag))) {
+ match = b->show_number;
+ break;
+ }
+ }
+ if (match)
+ a->show_number = match;
+ else
+ a->show_number = HTMainText->next_number++;
+ }
+}
+
+/* Anchor handling
+ * ---------------
+ */
+static void add_link_number(HText *text, TextAnchor *a, int save_position)
+{
+ char marker[32];
+
+ /*
+ * If we are doing link_numbering add the link number.
+ */
+ if ((a->number > 0)
+#ifdef USE_PRETTYSRC
+ && (text->source ? !psrcview_no_anchor_numbering : 1)
+#endif
+ && links_are_numbered()) {
+ char saved_lastchar = HText_getLastChar(text);
+ int saved_linenum = text->Lines;
+ HTAnchor *link_dest;
+ char *link_text;
+
+ compute_show_number(a);
+
+ if (dump_links_inline
+ && (link_dest = HTAnchor_followLink(a->anchor)) != 0
+ && (link_text = HTAnchor_address(link_dest)) != 0) {
+ HText_appendText(text, "[");
+ HText_appendText(text, link_text);
+ HText_appendText(text, "]");
+ } else {
+ sprintf(marker, "[%d]", a->show_number);
+ HText_appendText(text, marker);
+ }
+ if (saved_linenum && text->Lines && saved_lastchar != ' ')
+ HText_setLastChar(text, ']'); /* if marker not after space caused split */
+ if (save_position) {
+ a->line_num = text->Lines;
+ a->line_pos = (short) text->last_line->size;
+ }
+ }
+}
+
+/* Start an anchor field
+*/
+int HText_beginAnchor(HText *text, int underline,
+ HTChildAnchor *anc)
+{
+ TextAnchor *a;
+
+ POOLtypecalloc(TextAnchor, a);
+
+ if (a == NULL)
+ outofmem(__FILE__, "HText_beginAnchor");
+
+ a->inUnderline = (BOOLEAN) underline;
+
+ a->sgml_offset = SGML_offset();
+ a->line_num = text->Lines;
+ a->line_pos = (short) text->last_line->size;
+ if (text->last_anchor) {
+ text->last_anchor->next = a;
+ } else {
+ text->first_anchor = a;
+ }
+ a->next = 0;
+ a->anchor = anc;
+ a->extent = 0;
+ a->link_type = HYPERTEXT_ANCHOR;
+ text->last_anchor = a;
+
+ if (track_internal_links
+ && HTAnchor_followTypedLink(anc, HTInternalLink)) {
+ a->number = ++(text->last_anchor_number);
+ a->link_type = INTERNAL_LINK_ANCHOR;
+ } else if (HTAnchor_followLink(anc)) {
+ a->number = ++(text->last_anchor_number);
+ } else {
+ a->number = 0;
+ }
+ a->show_number = 0;
+
+ if (number_links_on_left)
+ add_link_number(text, a, TRUE);
+ return (a->number);
+}
+
+/* If !really, report whether the anchor is empty. */
+static BOOL HText_endAnchor0(HText *text, int number,
+ int really)
+{
+ TextAnchor *a;
+
+ /*
+ * The number argument is set to 0 in HTML.c and
+ * LYCharUtils.c when we want to end the anchor
+ * for the immediately preceding HText_beginAnchor()
+ * call. If it's greater than 0, we want to handle
+ * a particular anchor. This allows us to set links
+ * for positions indicated by NAME or ID attributes,
+ * without needing to close any anchor with an HREF
+ * within which that link might be embedded. -FM
+ */
+ if (number <= 0 || number == text->last_anchor->number) {
+ a = text->last_anchor;
+ } else {
+ for (a = text->first_anchor; a; a = a->next) {
+ if (a->number == number) {
+ break;
+ }
+ }
+ if (a == NULL) {
+ /*
+ * There's no anchor with that number,
+ * so we'll default to the last anchor,
+ * and cross our fingers. -FM
+ */
+ a = text->last_anchor;
+ }
+ }
+
+ CTRACE((tfp, "GridText:HText_endAnchor0: number:%d link_type:%d\n",
+ a->number, a->link_type));
+ if (a->link_type == INPUT_ANCHOR) {
+ /*
+ * Shouldn't happen, but put test here anyway to be safe. - LE
+ */
+
+ CTRACE((tfp,
+ "BUG: HText_endAnchor0: internal error: last anchor was input field!\n"));
+ return FALSE;
+ }
+
+ if (a->number) {
+ /*
+ * If it goes somewhere...
+ */
+ int i, j, k, l;
+ BOOL remove_numbers_on_empty = (BOOL) ((links_are_numbered() &&
+ ((text->hiddenlinkflag != HIDDENLINKS_MERGE)
+ || (LYNoISMAPifUSEMAP &&
+ !(text->node_anchor && text->node_anchor->bookmark)
+ && HTAnchor_isISMAPScript
+ (HTAnchor_followLink(a->anchor))))));
+ HTLine *last = text->last_line;
+ HTLine *prev = text->last_line->prev;
+ HTLine *start = last;
+ int CurBlankExtent = 0;
+ int BlankExtent = 0;
+ int extent_adjust = 0;
+
+ /* Find the length taken by the anchor */
+ l = text->Lines; /* lineno of last */
+
+ /* the last line of an anchor may contain a trailing blank,
+ * which will be trimmed later. Discount it from the extent.
+ */
+ if (l > a->line_num) {
+ for (i = start->size; i > 0; --i) {
+ if (isspace(UCH(start->data[i - 1]))) {
+ --extent_adjust;
+ } else {
+ break;
+ }
+ }
+ }
+
+ while (l > a->line_num) {
+ extent_adjust += start->size;
+ start = start->prev;
+ l--;
+ }
+ /* Now start is the start line of the anchor */
+ extent_adjust += start->size - a->line_pos;
+ start = last; /* Used later */
+
+ /*
+ * Check if the anchor content has only
+ * white and special characters, starting
+ * with the content on the last line. -FM
+ */
+ a->extent = (short) (a->extent + extent_adjust);
+ if (a->extent > (int) last->size) {
+ /*
+ * The anchor extends over more than one line,
+ * so set up to check the entire last line. -FM
+ */
+ i = last->size;
+ } else {
+ /*
+ * The anchor is restricted to the last line,
+ * so check from the start of the anchor. -FM
+ */
+ i = a->extent;
+ }
+ k = j = (last->size - i);
+ while (j < (int) last->size) {
+ if (!IsSpecialAttrChar(last->data[j]) &&
+ !isspace(UCH(last->data[j])) &&
+ last->data[j] != HT_NON_BREAK_SPACE &&
+ last->data[j] != HT_EN_SPACE)
+ break;
+ i--;
+ j++;
+ }
+ if (i == 0) {
+ if (a->extent > (int) last->size) {
+ /*
+ * The anchor starts on a preceding line, and
+ * the last line has only white and special
+ * characters, so declare the entire extent
+ * of the last line as blank. -FM
+ */
+ CurBlankExtent = BlankExtent = last->size;
+ } else {
+ /*
+ * The anchor starts on the last line, and
+ * has only white or special characters, so
+ * declare the anchor's extent as blank. -FM
+ */
+ CurBlankExtent = BlankExtent = a->extent;
+ }
+ }
+ /*
+ * While the anchor starts on a line preceding
+ * the one we just checked, and the one we just
+ * checked has only white and special characters,
+ * check whether the anchor's content on the
+ * immediately preceding line also has only
+ * white and special characters. -FM
+ */
+ while (i == 0 &&
+ (a->extent > CurBlankExtent ||
+ (a->extent == CurBlankExtent &&
+ k == 0 &&
+ prev != text->last_line &&
+ (prev->size == 0 ||
+ prev->data[prev->size - 1] == ']')))) {
+ start = prev;
+ k = j = prev->size - a->extent + CurBlankExtent;
+ if (j < 0) {
+ /*
+ * The anchor starts on a preceding line,
+ * so check all of this line. -FM
+ */
+ j = 0;
+ i = prev->size;
+ } else {
+ /*
+ * The anchor starts on this line. -FM
+ */
+ i = a->extent - CurBlankExtent;
+ }
+ while (j < (int) prev->size) {
+ if (!IsSpecialAttrChar(prev->data[j]) &&
+ !isspace(UCH(prev->data[j])) &&
+ prev->data[j] != HT_NON_BREAK_SPACE &&
+ prev->data[j] != HT_EN_SPACE)
+ break;
+ i--;
+ j++;
+ }
+ if (i == 0) {
+ if (a->extent > (CurBlankExtent + (int) prev->size) ||
+ (a->extent == CurBlankExtent + (int) prev->size &&
+ k == 0 &&
+ prev->prev != text->last_line &&
+ (prev->prev->size == 0 ||
+ prev->prev->data[prev->prev->size - 1] == ']'))) {
+ /*
+ * This line has only white and special
+ * characters, so treat its entire extent
+ * as blank, and decrement the pointer for
+ * the line to be analyzed. -FM
+ */
+ CurBlankExtent += prev->size;
+ BlankExtent = CurBlankExtent;
+ prev = prev->prev;
+ } else {
+ /*
+ * The anchor starts on this line, and it
+ * has only white or special characters, so
+ * declare the anchor's extent as blank. -FM
+ */
+ BlankExtent = a->extent;
+ break;
+ }
+ }
+ }
+ if (!really) { /* Just report whether it is empty */
+ a->extent = (short) (a->extent - extent_adjust);
+ return (BOOL) (i == 0);
+ }
+ if (i == 0) {
+ /*
+ * It's an invisible anchor probably from an ALT=""
+ * or an ignored ISMAP attribute due to a companion
+ * USEMAP. -FM
+ */
+ a->show_anchor = NO;
+
+ CTRACE((tfp,
+ "HText_endAnchor0: hidden (line,pos,ext,BlankExtent):(%d,%d,%d,%d)",
+ a->line_num, a->line_pos, a->extent,
+ BlankExtent));
+
+ /*
+ * If links are numbered, then try to get rid of the
+ * numbered bracket and adjust the anchor count. -FM
+ *
+ * Well, let's do this only if -hiddenlinks=merged is not in
+ * effect, or if we can be reasonably sure that
+ * this is the result of an intentional non-generation of
+ * anchor text via NO_ISMAP_IF_USEMAP. In other cases it can
+ * actually be a feature that numbered links alert the viewer
+ * to the presence of a link which is otherwise not selectable -
+ * possibly caused by HTML errors. - kw
+ */
+ if (remove_numbers_on_empty) {
+ int NumSize = 0;
+ TextAnchor *anc;
+
+ /*
+ * Set start->data[j] to the close-square-bracket,
+ * or to the beginning of the line on which the
+ * anchor start. -FM
+ */
+ if (start == last) {
+ /*
+ * The anchor starts on the last line. -FM
+ */
+ j = (last->size - a->extent - 1);
+ } else {
+ /*
+ * The anchor starts on a previous line. -FM
+ */
+ prev = start->prev;
+ j = (start->size - a->extent + CurBlankExtent - 1);
+ }
+ if (j < 0)
+ j = 0;
+ i = j;
+
+ /*
+ * If start->data[j] is a close-square-bracket, verify
+ * that it's the end of the numbered bracket, and if so,
+ * strip the numbered bracket. If start->data[j] is not
+ * a close-square-bracket, check whether we had a wrap
+ * and the close-square-bracket is at the end of the
+ * previous line. If so, strip the numbered bracket
+ * from that line. -FM
+ */
+ if (start->data[j] == ']') {
+ j--;
+ NumSize++;
+ while (j >= 0 && isdigit(UCH(start->data[j]))) {
+ j--;
+ NumSize++;
+ }
+ while (j < 0) {
+ j++;
+ NumSize--;
+ }
+ if (start->data[j] == '[') {
+ /*
+ * The numbered bracket is entirely
+ * on this line. -FM
+ */
+ NumSize++;
+ if (start == last && (int) text->permissible_split > j) {
+ if ((int) text->permissible_split - NumSize < j)
+ text->permissible_split = (unsigned) j;
+ else
+ text->permissible_split -= (unsigned) NumSize;
+ }
+ k = j + NumSize;
+ while (k < (int) start->size)
+ start->data[j++] = start->data[k++];
+ for (anc = a; anc; anc = anc->next) {
+ if (anc->line_num == a->line_num &&
+ anc->line_pos >= NumSize) {
+ anc->line_pos = (short) (anc->line_pos - NumSize);
+ }
+ }
+ start->size = (unsigned short) j;
+ start->data[j++] = '\0';
+ while (j < k)
+ start->data[j++] = '\0';
+ } else if (prev && prev->size > 1) {
+ k = (i + 1);
+ j = (prev->size - 1);
+ while ((j >= 0) && IsSpecialAttrChar(prev->data[j]))
+ j--;
+ i = (j + 1);
+ while (j >= 0 &&
+ isdigit(UCH(prev->data[j]))) {
+ j--;
+ NumSize++;
+ }
+ while (j < 0) {
+ j++;
+ NumSize--;
+ }
+ if (prev->data[j] == '[') {
+ /*
+ * The numbered bracket started on the
+ * previous line, and part of it was
+ * wrapped to this line. -FM
+ */
+ while (i < (int) prev->size)
+ prev->data[j++] = prev->data[i++];
+ prev->size = (unsigned short) j;
+ prev->data[j] = '\0';
+ while (j < i)
+ prev->data[j++] = '\0';
+ if (start == last && text->permissible_split > 0) {
+ if ((int) text->permissible_split < k)
+ text->permissible_split = 0;
+ else
+ text->permissible_split -= (unsigned) k;
+ }
+ j = 0;
+ i = k;
+ while (k < (int) start->size)
+ start->data[j++] = start->data[k++];
+ for (anc = a; anc; anc = anc->next) {
+ if (anc->line_num == a->line_num &&
+ anc->line_pos >= i) {
+ anc->line_pos = (short) (anc->line_pos - i);
+ }
+ }
+ start->size = (unsigned short) j;
+ start->data[j++] = '\0';
+ while (j < k)
+ start->data[j++] = '\0';
+ } else {
+ /*
+ * Shucks! We didn't find the
+ * numbered bracket. -FM
+ */
+ a->show_anchor = YES;
+ }
+ } else {
+ /*
+ * Shucks! We didn't find the
+ * numbered bracket. -FM
+ */
+ a->show_anchor = YES;
+ }
+ } else if (prev && prev->size > 2) {
+ j = (prev->size - 1);
+ while ((j >= 0) && IsSpecialAttrChar(prev->data[j]))
+ j--;
+ if (j < 0)
+ j = 0;
+ if ((j >= 2) &&
+ (prev->data[j] == ']' &&
+ isdigit(UCH(prev->data[j - 1])))) {
+ j--;
+ NumSize++;
+ while (j >= 0 &&
+ isdigit(UCH(prev->data[j]))) {
+ j--;
+ NumSize++;
+ }
+ while (j < 0) {
+ j++;
+ NumSize--;
+ }
+ if (prev->data[j] == '[') {
+ /*
+ * The numbered bracket is all on the
+ * previous line, and the anchor content
+ * was wrapped to the last line. -FM
+ */
+ NumSize++;
+ k = j + NumSize;
+ while (k < (int) prev->size)
+ prev->data[j++] = prev->data[k++];
+ prev->size = (unsigned short) j;
+ prev->data[j++] = '\0';
+ while (j < k)
+ prev->data[j++] = '\0';
+ } else {
+ /*
+ * Shucks! We didn't find the
+ * numbered bracket. -FM
+ */
+ a->show_anchor = YES;
+ }
+ } else {
+ /*
+ * Shucks! We didn't find the
+ * numbered bracket. -FM
+ */
+ a->show_anchor = YES;
+ }
+ } else {
+ /*
+ * Shucks! We didn't find the
+ * numbered bracket. -FM
+ */
+ a->show_anchor = YES;
+ }
+ }
+ } else {
+ if (!number_links_on_left)
+ add_link_number(text, a, FALSE);
+ /*
+ * The anchor's content is not restricted to only
+ * white and special characters, so we'll show it
+ * as a link. -FM
+ */
+ a->show_anchor = YES;
+ if (BlankExtent) {
+ CTRACE((tfp,
+ "HText_endAnchor0: blanks (line,pos,ext,BlankExtent):(%d,%d,%d,%d)",
+ a->line_num, a->line_pos, a->extent,
+ BlankExtent));
+ }
+ }
+ if (a->show_anchor == NO) {
+ /*
+ * The anchor's content is restricted to white
+ * and special characters, so set its number
+ * and extent to zero, decrement the visible
+ * anchor number counter, and add this anchor
+ * to the hidden links list. -FM
+ */
+ a->extent = 0;
+ if (text->hiddenlinkflag != HIDDENLINKS_MERGE) {
+ a->number = 0;
+ text->last_anchor_number--;
+ HText_AddHiddenLink(text, a);
+ }
+ } else {
+ /*
+ * The anchor's content is not restricted to white
+ * and special characters, so we'll display the
+ * content, but shorten its extent by any trailing
+ * blank lines we've detected. -FM
+ */
+ a->extent = (short) (a->extent - ((BlankExtent < a->extent)
+ ? BlankExtent
+ : 0));
+ }
+ if (BlankExtent || a->extent <= 0 || a->number <= 0) {
+ CTRACE((tfp,
+ "->[%d](%d,%d,%d,%d)\n",
+ a->number,
+ a->line_num, a->line_pos, a->extent,
+ BlankExtent));
+ }
+ } else {
+ if (!really) /* Just report whether it is empty */
+ return FALSE;
+ /*
+ * It's a named anchor without an HREF, so it
+ * should be registered but not shown as a
+ * link. -FM
+ */
+ a->show_anchor = NO;
+ a->extent = 0;
+ }
+ return FALSE;
+}
+
+void HText_endAnchor(HText *text, int number)
+{
+ HText_endAnchor0(text, number, 1);
+}
+
+/*
+ This returns whether the given anchor has blank content. Shamelessly copied
+ from HText_endAnchor. The values returned are meaningful only for "normal"
+ links - like ones produced by <a href=".">foo</a>, no inputs, etc. - VH
+*/
+#ifdef MARK_HIDDEN_LINKS
+BOOL HText_isAnchorBlank(HText *text, int number)
+{
+ return HText_endAnchor0(text, number, 0);
+}
+#endif /* MARK_HIDDEN_LINKS */
+
+void HText_appendText(HText *text, const char *str)
+{
+ const char *p;
+
+ if (str != NULL &&
+ text != NULL &&
+ text->halted != 3) {
+ for (p = str; *p; p++) {
+ HText_appendCharacter(text, *p);
+ }
+ }
+}
+
+static int remove_special_attr_chars(char *buf)
+{
+ register char *cp;
+ register int soft_newline_count = 0;
+
+ for (cp = buf; *cp != '\0'; cp++) {
+ /*
+ * Don't print underline chars.
+ */
+ soft_newline_count += (*cp == LY_SOFT_NEWLINE);
+ if (!IsSpecialAttrChar(*cp)) {
+ *buf++ = *cp;
+ }
+ }
+ *buf = '\0';
+ return soft_newline_count;
+}
+
+/*
+ * This function trims blank lines from the end of the document, and
+ * then gets the hightext from the text by finding the char position,
+ * and brings the anchors in line with the text by adding the text
+ * offset to each of the anchors.
+ */
+void HText_endAppend(HText *text)
+{
+ HTLine *line_ptr;
+
+ if (!text)
+ return;
+
+ CTRACE((tfp, "GridText: Entering HText_endAppend\n"));
+
+ /*
+ * Create a blank line at the bottom.
+ */
+ new_line(text);
+
+ if (text->halted) {
+ if (text->stbl) {
+ HText_cancelStbl(text);
+ }
+ /*
+ * If output was stopped because memory was low, and we made
+ * it to the end of the document, reset those flags and hope
+ * things are better now. - kw
+ */
+ LYFakeZap(NO);
+ text->halted = 0;
+ } else if (text->stbl) {
+ /*
+ * Could happen if TABLE end tag was missing.
+ * Alternatively we could cancel in this case. - kw
+ */
+ HText_endStblTABLE(text);
+ }
+
+ /*
+ * Get the first line.
+ */
+ if (LYtrimBlankLines && (line_ptr = FirstHTLine(text)) != 0) {
+ /*
+ * Remove blank lines at the end of the document.
+ */
+ while (text->last_line->data[0] == '\0' && text->Lines > 0) {
+ HTLine *next_to_the_last_line = text->last_line->prev;
+
+ CTRACE((tfp, "GridText: Removing bottom blank line: `%s'\n",
+ text->last_line->data));
+ /*
+ * line_ptr points to the first line.
+ */
+ next_to_the_last_line->next = line_ptr;
+ line_ptr->prev = next_to_the_last_line;
+ freeHTLine(text, text->last_line);
+ text->last_line = next_to_the_last_line;
+ text->Lines--;
+ CTRACE((tfp, "GridText: New bottom line: `%s'\n",
+ text->last_line->data));
+ }
+ }
+
+ /*
+ * Fix up the anchor structure values and
+ * create the hightext strings. -FM
+ */
+ HText_trimHightext(text, TRUE, -1);
+}
+
+/*
+ * This function gets the hightext from the text by finding the char
+ * position, and brings the anchors in line with the text by adding the text
+ * offset to each of the anchors.
+ *
+ * `Forms input' fields cannot be displayed properly without this function
+ * to be invoked (detected in display_partial mode).
+ *
+ * If final is set, this is the final fixup; if not set, we don't have
+ * to do everything because there should be another call later.
+ *
+ * BEFORE this function has treated a TextAnchor, its line_pos and
+ * extent fields are counting bytes in the HTLine data, including
+ * invisible special attribute chars and counting UTF-8 multibyte
+ * characters as multiple bytes.
+ *
+ * AFTER the adjustment, the anchor line_pos (and hightext offset if
+ * applicable) fields indicate x positions in terms of displayed character
+ * cells, and the extent field apparently is unimportant; the anchor text has
+ * been copied to the hightext fields (which should have been NULL up to that
+ * point), with special attribute chars removed.
+ *
+ * This needs to be done so that display_page finds the anchors in the
+ * form it expects when it sets the links[] elements.
+ */
+static void HText_trimHightext(HText *text,
+ int final,
+ int stop_before)
+{
+ int cur_line, cur_shift;
+ TextAnchor *anchor_ptr;
+ TextAnchor *prev_a = NULL;
+ HTLine *line_ptr;
+ HTLine *line_ptr2;
+ unsigned char ch;
+ char *hilite_str;
+ int hilite_len;
+ int actual_len;
+ int count_line;
+
+ if (!text)
+ return;
+
+ if (final) {
+ CTRACE((tfp, "GridText: Entering HText_trimHightext (final)\n"));
+ } else {
+ if (stop_before < 0 || stop_before > text->Lines)
+ stop_before = text->Lines;
+ CTRACE((tfp,
+ "GridText: Entering HText_trimHightext (partial: 0..%d/%d)\n",
+ stop_before, text->Lines));
+ }
+
+ /*
+ * Get the first line.
+ */
+ line_ptr = FirstHTLine(text);
+ cur_line = 0;
+
+ /*
+ * Fix up the anchor structure values and
+ * create the hightext strings. -FM
+ */
+ for (anchor_ptr = text->first_anchor;
+ anchor_ptr != NULL;
+ prev_a = anchor_ptr, anchor_ptr = anchor_ptr->next) {
+ int anchor_col;
+
+ re_parse:
+ /*
+ * Find the right line.
+ */
+ for (; line_ptr != NULL && anchor_ptr->line_num > cur_line;
+ line_ptr = line_ptr->next, cur_line++) {
+ ; /* null body */
+ }
+ if (line_ptr == NULL)
+ continue;
+
+ if (!final) {
+ /*
+ * If this is not the final call, stop when we have reached
+ * the last line, or the very end of preceding line.
+ * The last line is probably still not finished. - kw
+ */
+ if (cur_line >= stop_before)
+ break;
+ if (anchor_ptr->line_num >= text->Lines - 1
+ && anchor_ptr->line_pos >= (int) text->last_line->prev->size)
+ break;
+ /*
+ * Also skip this anchor if it looks like HText_endAnchor
+ * is not yet done with it. - kw
+ */
+ if (!anchor_ptr->extent && anchor_ptr->number &&
+ (anchor_ptr->link_type & HYPERTEXT_ANCHOR) &&
+ !anchor_ptr->show_anchor &&
+ anchor_ptr->number == text->last_anchor_number)
+ continue;
+ }
+
+ /*
+ * If hightext has already been set, then we must have already
+ * done the trimming & adjusting for this anchor, so avoid
+ * doing it a second time. - kw
+ */
+ if (LYGetHiTextStr(anchor_ptr, 0) != NULL)
+ continue;
+
+ if (anchor_ptr->line_pos > (int) line_ptr->size) {
+ anchor_ptr->line_pos = (short) line_ptr->size;
+ }
+ if (anchor_ptr->line_pos < 0) {
+ anchor_ptr->line_pos = 0;
+ anchor_ptr->line_num = cur_line;
+ }
+ CTRACE((tfp,
+ "GridText: Anchor found on line:%d col:%d [%05d:%d] ext:%d\n",
+ cur_line,
+ anchor_ptr->line_pos,
+ anchor_ptr->sgml_offset,
+ anchor_ptr->number,
+ anchor_ptr->extent));
+
+ cur_shift = 0;
+ /*
+ * Strip off any spaces or SpecialAttrChars at the beginning,
+ * if they exist, but only on HYPERTEXT_ANCHORS.
+ */
+ if (anchor_ptr->link_type & HYPERTEXT_ANCHOR) {
+ ch = UCH(line_ptr->data[anchor_ptr->line_pos]);
+ while (isspace(ch) ||
+ IsSpecialAttrChar(ch)) {
+ anchor_ptr->line_pos++;
+ anchor_ptr->extent--;
+ cur_shift++;
+ ch = UCH(line_ptr->data[anchor_ptr->line_pos]);
+ }
+ }
+ if (anchor_ptr->extent < 0) {
+ anchor_ptr->extent = 0;
+ }
+
+ CTRACE((tfp, "anchor text: '%s'\n", line_ptr->data));
+ /*
+ * If the link begins with an end of line and we have more lines, then
+ * start the highlighting on the next line. -FM.
+ *
+ * But if an empty anchor is at the end of line and empty, keep it
+ * where it is, unless the previous anchor in the list (if any) already
+ * starts later. - kw
+ */
+ if ((unsigned) anchor_ptr->line_pos >= strlen(line_ptr->data)) {
+ if (cur_line < text->Lines &&
+ (anchor_ptr->extent ||
+ anchor_ptr->line_pos != (int) line_ptr->size ||
+ (prev_a && /* How could this happen? */
+ (prev_a->line_num > anchor_ptr->line_num)))) {
+ anchor_ptr->line_num++;
+ anchor_ptr->line_pos = 0;
+ CTRACE((tfp, "found anchor at end of line\n"));
+ goto re_parse;
+ } else {
+ CTRACE((tfp, "found anchor at end of line, leaving it there\n"));
+ }
+ }
+
+ /*
+ * Copy the link name into the data structure.
+ */
+ if (anchor_ptr->extent > 0
+ && anchor_ptr->line_pos >= 0) {
+ int size = (int) line_ptr->size - anchor_ptr->line_pos;
+
+ if (size > anchor_ptr->extent)
+ size = anchor_ptr->extent;
+ LYClearHiText(anchor_ptr);
+ LYSetHiText(anchor_ptr,
+ &line_ptr->data[anchor_ptr->line_pos],
+ (unsigned) size);
+ } else {
+ LYClearHiText(anchor_ptr);
+ LYSetHiText(anchor_ptr, "", 0);
+ }
+
+ /*
+ * If the anchor extends over more than one line, copy that into the
+ * data structure.
+ */
+ hilite_str = LYGetHiTextStr(anchor_ptr, 0);
+ hilite_len = (int) strlen(hilite_str);
+ actual_len = anchor_ptr->extent;
+
+ line_ptr2 = line_ptr;
+ assert(line_ptr2 != 0);
+
+ count_line = cur_line;
+ while (actual_len > hilite_len) {
+ HTLine *old_line_ptr2 = line_ptr2;
+
+ count_line++;
+ if ((line_ptr2 = line_ptr2->next) == NULL)
+ break;
+
+ if (!final
+ && count_line >= stop_before) {
+ LYClearHiText(anchor_ptr);
+ break;
+ } else if (old_line_ptr2 == text->last_line) {
+ break;
+ }
+
+ /*
+ * Double check that we have a line pointer, and if so, copy into
+ * highlight text.
+ */
+ if (line_ptr2) {
+ char *hi_string = NULL;
+ int hi_offset = line_ptr2->offset;
+
+ StrnAllocCopy(hi_string,
+ line_ptr2->data,
+ (size_t) (actual_len - hilite_len));
+ actual_len -= (int) strlen(hi_string);
+ /*handle LY_SOFT_NEWLINEs -VH */
+ hi_offset += remove_special_attr_chars(hi_string);
+
+ if (anchor_ptr->link_type & HYPERTEXT_ANCHOR) {
+ LYTrimTrailing(hi_string);
+ }
+ if (non_empty(hi_string)) {
+ LYAddHiText(anchor_ptr, hi_string, hi_offset);
+ } else if (actual_len > hilite_len) {
+ LYAddHiText(anchor_ptr, "", hi_offset);
+ }
+ FREE(hi_string);
+ }
+ }
+
+ if (!final
+ && count_line >= stop_before) {
+ break;
+ }
+
+ hilite_str = LYGetHiTextStr(anchor_ptr, 0);
+ remove_special_attr_chars(hilite_str);
+ if (anchor_ptr->link_type & HYPERTEXT_ANCHOR) {
+ LYTrimTrailing(hilite_str);
+ }
+
+ /*
+ * Save the offset (bytes) of the anchor in the line's data.
+ */
+ anchor_col = anchor_ptr->line_pos;
+
+ /*
+ * Subtract any formatting characters from the x position of the link.
+ */
+#ifdef WIDEC_CURSES
+ if (anchor_ptr->line_pos > 0) {
+ /*
+ * LYstrExtent filters out the formatting characters, so we do not
+ * have to count them here, except for soft newlines.
+ */
+ anchor_ptr->line_pos = (short) LYstrExtent2(line_ptr->data, anchor_col);
+ if (line_ptr->data[0] == LY_SOFT_NEWLINE)
+ anchor_ptr->line_pos = (short) (anchor_ptr->line_pos + 1);
+ }
+#else /* 8-bit curses, etc. */
+ if (anchor_ptr->line_pos > 0) {
+ register int offset = 0, i = 0;
+ int have_soft_newline_in_1st_line = 0;
+
+ for (; i < anchor_col; i++) {
+ if (IS_UTF_EXTRA(line_ptr->data[i]) ||
+ IsSpecialAttrChar(line_ptr->data[i])) {
+ offset++;
+ have_soft_newline_in_1st_line += (line_ptr->data[i] == LY_SOFT_NEWLINE);
+ }
+ }
+ anchor_ptr->line_pos = (short) (anchor_ptr->line_pos - offset);
+ /*handle LY_SOFT_NEWLINEs -VH */
+ anchor_ptr->line_pos = (short) (anchor_ptr->line_pos + have_soft_newline_in_1st_line);
+ }
+#endif /* WIDEC_CURSES */
+
+ /*
+ * Set the line number.
+ */
+ anchor_ptr->line_pos = (short) (anchor_ptr->line_pos + line_ptr->offset);
+ anchor_ptr->line_num = cur_line;
+
+ CTRACE((tfp, "GridText: add link on line %d col %d [%d] %s\n",
+ cur_line, anchor_ptr->line_pos,
+ anchor_ptr->number, "in HText_trimHightext"));
+ }
+}
+
+/* Return the anchor associated with this node
+*/
+HTParentAnchor *HText_nodeAnchor(HText *text)
+{
+ return text->node_anchor;
+}
+
+/* GridText specials
+ * =================
+ */
+
+/*
+ * HText_childNextNumber() returns the anchor with index [number],
+ * using a pointer from the previous number (=optimization) or NULL.
+ */
+HTChildAnchor *HText_childNextNumber(int number, void **prev)
+{
+ /* Sorry, TextAnchor is not declared outside this file, use a cast. */
+ TextAnchor *a = (TextAnchor *) *prev;
+
+ if (!HTMainText || number <= 0)
+ return (HTChildAnchor *) 0; /* Fail */
+ if (number == 1 || !a)
+ a = HTMainText->first_anchor;
+
+ /* a strange thing: positive a->number's are sorted,
+ * and between them several a->number's may be 0 -- skip them
+ */
+ for (; a && a->number != number; a = a->next) ;
+
+ if (!a)
+ return (HTChildAnchor *) 0; /* Fail */
+ *prev = (void *) a;
+ return a->anchor;
+}
+
+/*
+ * For the -unique-urls option, find the anchor-number of the first occurrence
+ * of a given address.
+ */
+int HText_findAnchorNumber(void *avoid)
+{
+ TextAnchor *a = (TextAnchor *) avoid;
+
+ if (a->number > 0 && a->show_number == 0)
+ compute_show_number(a);
+
+ return a->show_number;
+}
+
+static const char *inputFieldDesc(FormInfo * input)
+{
+ const char *result = 0;
+
+ switch (input->type) {
+ case F_TEXT_TYPE:
+ result = gettext("text entry field");
+ break;
+ case F_PASSWORD_TYPE:
+ result = gettext("password entry field");
+ break;
+ case F_CHECKBOX_TYPE:
+ result = gettext("checkbox");
+ break;
+ case F_RADIO_TYPE:
+ result = gettext("radio button");
+ break;
+ case F_SUBMIT_TYPE:
+ result = gettext("submit button");
+ break;
+ case F_RESET_TYPE:
+ result = gettext("reset button");
+ break;
+ case F_BUTTON_TYPE:
+ result = gettext("script button");
+ break;
+ case F_OPTION_LIST_TYPE:
+ result = gettext("popup menu");
+ break;
+ case F_HIDDEN_TYPE:
+ result = gettext("hidden form field");
+ break;
+ case F_TEXTAREA_TYPE:
+ result = gettext("text entry area");
+ break;
+ case F_RANGE_TYPE:
+ result = gettext("range entry field");
+ break;
+ case F_FILE_TYPE:
+ result = gettext("file entry field");
+ break;
+ case F_TEXT_SUBMIT_TYPE:
+ result = gettext("text-submit field");
+ break;
+ case F_IMAGE_SUBMIT_TYPE:
+ result = gettext("image-submit button");
+ break;
+ case F_KEYGEN_TYPE:
+ result = gettext("keygen field");
+ break;
+ default:
+ result = gettext("unknown form field");
+ break;
+ }
+ return result;
+}
+
+/*
+ * HText_FormDescNumber() returns a description of the form field
+ * with index N. The index corresponds to the [number] we print
+ * for the field. -FM & LE
+ */
+void HText_FormDescNumber(int number,
+ const char **desc)
+{
+ TextAnchor *a;
+
+ if (!desc)
+ return;
+
+ if (!(HTMainText && HTMainText->first_anchor) || number <= 0) {
+ *desc = gettext("unknown field or link");
+ return;
+ }
+
+ for (a = HTMainText->first_anchor; a; a = a->next) {
+ if (a->number == number) {
+ if (!(a->input_field && a->input_field->type)) {
+ *desc = gettext("unknown field or link");
+ return;
+ }
+ break;
+ }
+ }
+
+ if (a != NULL)
+ *desc = inputFieldDesc(a->input_field);
+}
+
+/* HTGetRelLinkNum returns the anchor number to which follow_link_number()
+ * is to jump (input was 123+ or 123- or 123+g or 123-g or 123 or 123g)
+ * num is the number specified
+ * rel is 0 or '+' or '-'
+ * cur is the current link
+ */
+int HTGetRelLinkNum(int num,
+ int rel,
+ int cur)
+{
+ TextAnchor *a, *l = 0;
+ int scrtop = HText_getTopOfScreen(); /*XXX +1? */
+ int curline = links[cur].anchor_line_num;
+ int curpos = links[cur].lx;
+ int on_screen = (curline >= scrtop && curline < (scrtop + display_lines));
+
+ /* curanchor may or may not be the "current link", depending whether it's
+ * on the current screen
+ */
+ int curanchor = links[cur].anchor_number;
+
+ CTRACE((tfp, "HTGetRelLinkNum(%d,%d,%d) -- HTMainText=%p\n",
+ num, rel, cur, (void *) HTMainText));
+ CTRACE((tfp,
+ " scrtop=%d, curline=%d, curanchor=%d, display_lines=%d, %s\n",
+ scrtop, curline, curanchor, display_lines,
+ on_screen ? "on_screen" : "0"));
+ if (!HTMainText)
+ return 0;
+ if (rel == 0)
+ return num;
+
+ /* if cur numbered link is on current page, use it */
+ if (on_screen && curanchor) {
+ CTRACE((tfp, "curanchor=%d at line %d on screen\n", curanchor, curline));
+ if (rel == '+')
+ return curanchor + num;
+ else if (rel == '-')
+ return curanchor - num;
+ else
+ return num; /* shouldn't happen */
+ }
+
+ /* no current link on screen, or current link is not numbered
+ * -- find previous closest numbered link
+ */
+ for (a = HTMainText->first_anchor; a; a = a->next) {
+ CTRACE((tfp, " a->line_num=%d, a->number=%d\n", a->line_num, a->number));
+ if (a->line_num >= scrtop)
+ break;
+ if (a->number == 0)
+ continue;
+ l = a;
+ curanchor = l->number;
+ }
+ CTRACE((tfp, " a=%p, l=%p, curanchor=%d\n", (void *) a, (void *) l, curanchor));
+ if (on_screen) { /* on screen but not a numbered link */
+ for (; a; a = a->next) {
+ if (a->number) {
+ l = a;
+ curanchor = l->number;
+ }
+ if (curline == a->line_num && curpos == a->line_pos)
+ break;
+ }
+ }
+ if (rel == '+') {
+ return curanchor + num;
+ } else if (rel == '-') {
+ if (l)
+ return curanchor + 1 - num;
+ else {
+ for (; a && a->number == 0; a = a->next) ;
+ return a ? a->number - num : 0;
+ }
+ } else
+ return num; /* shouldn't happen */
+}
+
+/*
+ * HTGetLinkInfo returns some link info based on the number.
+ *
+ * If want_go is not 0, caller requests to know a line number for
+ * the link indicated by number. It will be returned in *go_line, and
+ * *linknum will be set to an index into the links[] array, to use after
+ * the line in *go_line has been made the new top screen line.
+ * *hightext and *lname are unchanged. - KW
+ *
+ * If want_go is 0 and the number doesn't represent an input field, info
+ * on the link indicated by number is deposited in *hightext and *lname.
+ */
+int HTGetLinkInfo(int number,
+ int want_go,
+ int *go_line,
+ int *linknum,
+ char **hightext,
+ char **lname)
+{
+ TextAnchor *a;
+ HTAnchor *link_dest;
+
+ HTAnchor *link_dest_intl = NULL;
+ int anchors_this_line = 0, anchors_this_screen = 0;
+ int prev_anchor_line = -1, prev_prev_anchor_line = -1;
+
+ if (!HTMainText)
+ return (NO);
+
+ for (a = HTMainText->first_anchor; a; a = a->next) {
+ /*
+ * Count anchors, first on current line if there is more
+ * than one. We have to count all links, including form
+ * field anchors and others with a->number == 0, because
+ * they are or will be included in the links[] array.
+ * The exceptions are hidden form fields and anchors with
+ * show_anchor not set, because they won't appear in links[]
+ * and don't count towards nlinks. - KW
+ */
+ if ((a->show_anchor) &&
+ !(a->link_type == INPUT_ANCHOR
+ && a->input_field->type == F_HIDDEN_TYPE)) {
+ if (a->line_num == prev_anchor_line) {
+ anchors_this_line++;
+ } else {
+ /*
+ * This anchor is on a different line than the previous one.
+ * Remember which was the line number of the previous anchor,
+ * for use in screen positioning later. - KW
+ */
+ anchors_this_line = 1;
+ prev_prev_anchor_line = prev_anchor_line;
+ prev_anchor_line = a->line_num;
+ }
+ if (a->line_num >= HTMainText->top_of_screen) {
+ /*
+ * Count all anchors starting with the top line of the
+ * currently displayed screen. Just keep on counting
+ * beyond this screen's bottom line - we'll know whether
+ * a found anchor is below the current screen by a check
+ * against nlinks later. - KW
+ */
+ anchors_this_screen++;
+ }
+ }
+
+ if (a->number == number) {
+ /*
+ * We found it. Now process it, depending
+ * on what kind of info is requested. - KW
+ */
+ if (want_go || a->link_type == INPUT_ANCHOR) {
+ if (a->show_anchor == NO) {
+ /*
+ * The number requested has been assigned to an anchor
+ * without any selectable text, so we cannot position
+ * on it. The code for suppressing such anchors in
+ * HText_endAnchor() may not have applied, or it may
+ * have failed. Return a failure indication so that
+ * the user will notice that something is wrong,
+ * instead of positioning on some other anchor which
+ * might result in inadvertent activation. - KW
+ */
+ return (NO);
+ }
+ if (anchors_this_screen > 0 &&
+ anchors_this_screen <= nlinks &&
+ a->line_num >= HTMainText->top_of_screen &&
+ a->line_num < HTMainText->top_of_screen + (display_lines)) {
+ /*
+ * If the requested anchor is within the current screen,
+ * just set *go_line so that the screen window won't move
+ * (keep it as it is), and set *linknum to the index of
+ * this link in the current links[] array. - KW
+ */
+ *go_line = HTMainText->top_of_screen;
+ if (linknum)
+ *linknum = anchors_this_screen - 1;
+ } else {
+ /*
+ * if the requested anchor is not within the currently
+ * displayed screen, set *go_line such that the top line
+ * will be either
+ * (1) the line immediately below the previous
+ * anchor, or
+ * (2) about one third of a screenful above the line
+ * with the target, or
+ * (3) the first line of the document -
+ * whichever comes last. In all cases the line with our
+ * target will end up being the first line with any links
+ * on the new screen, so that we can use the
+ * anchors_this_line counter to point to the anchor in
+ * the new links[] array. - kw
+ */
+ int max_offset = SEARCH_GOAL_LINE - 1;
+
+ if (max_offset < 0)
+ max_offset = 0;
+ else if (max_offset >= display_lines)
+ max_offset = display_lines - 1;
+ *go_line = prev_anchor_line - max_offset;
+ if (*go_line <= prev_prev_anchor_line)
+ *go_line = prev_prev_anchor_line + 1;
+ if (*go_line < 0)
+ *go_line = 0;
+ if (linknum)
+ *linknum = anchors_this_line - 1;
+ }
+ return (LINK_LINE_FOUND);
+ } else {
+ *hightext = LYGetHiTextStr(a, 0);
+ link_dest = HTAnchor_followLink(a->anchor);
+ {
+ char *cp_freeme = NULL;
+
+ if (traversal) {
+ cp_freeme = stub_HTAnchor_address(link_dest);
+ } else if (track_internal_links) {
+ if (a->link_type == INTERNAL_LINK_ANCHOR) {
+ link_dest_intl =
+ HTAnchor_followTypedLink(a->anchor, HTInternalLink);
+ if (link_dest_intl && link_dest_intl != link_dest) {
+
+ CTRACE((tfp,
+ "HTGetLinkInfo: unexpected typed link to %s!\n",
+ link_dest_intl->parent->address));
+ link_dest_intl = NULL;
+ }
+ }
+ if (link_dest_intl) {
+ char *cp2 = HTAnchor_address(link_dest_intl);
+
+ FREE(*lname);
+ *lname = cp2;
+ return (WWW_INTERN_LINK_TYPE);
+ } else {
+ cp_freeme = HTAnchor_address(link_dest);
+ }
+ } else {
+ cp_freeme = HTAnchor_address(link_dest);
+ }
+ StrAllocCopy(*lname, cp_freeme);
+ FREE(cp_freeme);
+ }
+ return (WWW_LINK_TYPE);
+ }
+ }
+ }
+ return (NO);
+}
+
+static BOOLEAN same_anchor_or_field(int numberA,
+ FormInfo * formA,
+ int numberB,
+ FormInfo * formB,
+ int ta_same)
+{
+ if (numberA > 0 || numberB > 0) {
+ if (numberA == numberB)
+ return (YES);
+ else if (!ta_same)
+ return (NO);
+ }
+ if (formA || formB) {
+ if (formA == formB) {
+ return (YES);
+ } else if (!ta_same) {
+ return (NO);
+ } else if (!(formA && formB)) {
+ return (NO);
+ }
+ } else {
+ return (NO);
+ }
+ if (formA->type != formB->type ||
+ formA->type != F_TEXTAREA_TYPE ||
+ formB->type != F_TEXTAREA_TYPE) {
+ return (NO);
+ }
+ if (formA->number != formB->number)
+ return (NO);
+ if (!formA->name || !formB->name)
+ return (YES);
+ return (BOOL) (strcmp(formA->name, formB->name) == 0);
+}
+
+#define same_anchor_as_link(i,a,ta_same) (BOOL) (i >= 0 && a && \
+ same_anchor_or_field(links[i].anchor_number,\
+ (links[i].type == WWW_FORM_LINK_TYPE) ? links[i].l_form : NULL,\
+ a->number,\
+ (a->link_type == INPUT_ANCHOR) ? a->input_field : NULL,\
+ ta_same))
+#define same_anchors(a1,a2,ta_same) (BOOL) (a1 && a2 && \
+ same_anchor_or_field(a1->number,\
+ (a1->link_type == INPUT_ANCHOR) ? a1->input_field : NULL,\
+ a2->number,\
+ (a2->link_type == INPUT_ANCHOR) ? a2->input_field : NULL,\
+ ta_same))
+
+/*
+ * Are there more textarea lines belonging to the same textarea before
+ * (direction < 0) or after (direction > 0) the current one?
+ * On entry, curlink must be the index in links[] of a textarea field. - kw
+ */
+BOOL HText_TAHasMoreLines(int curlink,
+ int direction)
+{
+ TextAnchor *a;
+ TextAnchor *prev_a = NULL;
+
+ if (!HTMainText)
+ return (NO);
+ if (direction < 0) {
+ for (a = HTMainText->first_anchor; a; prev_a = a, a = a->next) {
+ if (a->link_type == INPUT_ANCHOR &&
+ links[curlink].l_form == a->input_field) {
+ return same_anchors(a, prev_a, TRUE);
+ }
+ if (links[curlink].anchor_number &&
+ a->number >= links[curlink].anchor_number)
+ break;
+ }
+ return NO;
+ } else {
+ for (a = HTMainText->first_anchor; a; a = a->next) {
+ if (a->link_type == INPUT_ANCHOR &&
+ links[curlink].l_form == a->input_field) {
+ return same_anchors(a, a->next, TRUE);
+ }
+ if (links[curlink].anchor_number &&
+ a->number >= links[curlink].anchor_number)
+ break;
+ }
+ return NO;
+ }
+}
+
+/*
+ * HTGetLinkOrFieldStart - moving to previous or next link or form field.
+ *
+ * On input,
+ * curlink: current link, as index in links[] array (-1 if none)
+ * direction: whether to move up or down (or stay where we are)
+ * ta_skip: if FALSE, input fields belonging to the same textarea are
+ * are treated as different fields, as usual;
+ * if TRUE, fields of the same textarea are treated as a
+ * group for skipping.
+ * The caller wants information for positioning on the new link to be
+ * deposited in *go_line and (if linknum is not NULL) *linknum.
+ *
+ * On failure (no more links in the requested direction) returns NO
+ * and doesn't change *go_line or *linknum. Otherwise, LINK_DO_ARROWUP
+ * may be returned, and *go_line and *linknum not changed, to indicate that
+ * the caller should use a normal PREV_LINK or PREV_PAGE mechanism.
+ * Otherwise:
+ * The number (0-based counting) for the new top screen line will be returned
+ * in *go_line, and *linknum will be set to an index into the links[] array,
+ * to use after the line in *go_line has been made the new top screen
+ * line. - kw
+ */
+int HTGetLinkOrFieldStart(int curlink,
+ int *go_line,
+ int *linknum,
+ int direction,
+ int ta_skip)
+{
+ TextAnchor *a;
+ int anchors_this_line = 0;
+ int prev_anchor_line = -1, prev_prev_anchor_line = -1;
+
+ struct agroup {
+ TextAnchor *anc;
+ int prev_anchor_line;
+ int anchors_this_line;
+ int anchors_this_group;
+ } previous, current;
+ struct agroup *group_to_go = NULL;
+
+ if (!HTMainText)
+ return (NO);
+
+ previous.anc = current.anc = NULL;
+ previous.prev_anchor_line = current.prev_anchor_line = -1;
+ previous.anchors_this_line = current.anchors_this_line = 0;
+ previous.anchors_this_group = current.anchors_this_group = 0;
+
+ for (a = HTMainText->first_anchor; a; a = a->next) {
+ /*
+ * Count anchors, first on current line if there is more
+ * than one. We have to count all links, including form
+ * field anchors and others with a->number == 0, because
+ * they are or will be included in the links[] array.
+ * The exceptions are hidden form fields and anchors with
+ * show_anchor not set, because they won't appear in links[]
+ * and don't count towards nlinks. - KW
+ */
+ if ((a->show_anchor) &&
+ !(a->link_type == INPUT_ANCHOR
+ && a->input_field->type == F_HIDDEN_TYPE)) {
+ if (a->line_num == prev_anchor_line) {
+ anchors_this_line++;
+ } else {
+ /*
+ * This anchor is on a different line than the previous one.
+ * Remember which was the line number of the previous anchor,
+ * for use in screen positioning later. - KW
+ */
+ anchors_this_line = 1;
+ prev_prev_anchor_line = prev_anchor_line;
+ prev_anchor_line = a->line_num;
+ }
+
+ if (!same_anchors(current.anc, a, ta_skip)) {
+ previous.anc = current.anc;
+ previous.prev_anchor_line = current.prev_anchor_line;
+ previous.anchors_this_line = current.anchors_this_line;
+ previous.anchors_this_group = current.anchors_this_group;
+ current.anc = a;
+ current.prev_anchor_line = prev_prev_anchor_line;
+ current.anchors_this_line = anchors_this_line;
+ current.anchors_this_group = 1;
+ } else {
+ current.anchors_this_group++;
+ }
+ if (curlink >= 0) {
+ if (same_anchor_as_link(curlink, a, ta_skip)) {
+ if (direction == -1) {
+ group_to_go = &previous;
+ break;
+ } else if (direction == 0) {
+ group_to_go = &current;
+ break;
+ }
+ } else if (direction > 0 &&
+ same_anchor_as_link(curlink, previous.anc, ta_skip)) {
+ group_to_go = &current;
+ break;
+ }
+ } else {
+ if (a->line_num >= HTMainText->top_of_screen) {
+ if (direction < 0) {
+ group_to_go = &previous;
+ break;
+ } else if (direction == 0) {
+ if (previous.anc) {
+ group_to_go = &previous;
+ break;
+ } else {
+ group_to_go = &current;
+ break;
+ }
+ } else {
+ group_to_go = &current;
+ break;
+ }
+ }
+ }
+ }
+ }
+ if (!group_to_go && curlink < 0 && direction <= 0) {
+ group_to_go = &current;
+ }
+ if (group_to_go) {
+ a = group_to_go->anc;
+ if (a) {
+ int max_offset;
+
+ /*
+ * We know where to go; most of the stuff below is just
+ * tweaks to try to position the new screen in a specific
+ * way.
+ *
+ * In some cases going to a previous link can be done
+ * via the normal LYK_PREV_LINK action, which may give
+ * better positioning of the new screen. - kw
+ */
+ if (a->line_num < HTMainText->top_of_screen &&
+ a->line_num >= HTMainText->top_of_screen - (display_lines)) {
+ if ((curlink < 0 &&
+ group_to_go->anchors_this_group == 1) ||
+ (direction < 0 &&
+ group_to_go != &current &&
+ current.anc &&
+ current.anc->line_num >= HTMainText->top_of_screen &&
+ group_to_go->anchors_this_group == 1) ||
+ (a->next &&
+ a->next->line_num >= HTMainText->top_of_screen)) {
+ return (LINK_DO_ARROWUP);
+ }
+ }
+ /*
+ * The fundamental limitation of the current anchors_this_line
+ * counter method is that we only can set *linknum to the right
+ * index into the future links[] array if the line with our link
+ * ends up being the first line with any links (that count) on
+ * the new screen. Subject to that restriction we still have
+ * some vertical liberty (sometimes), and try to make the best
+ * of it. It may be a question of taste though. - kw
+ */
+ if (a->line_num <= (display_lines)) {
+ max_offset = 0;
+ } else if (a->line_num < HTMainText->top_of_screen) {
+ int screensback =
+ (HTMainText->top_of_screen - a->line_num + (display_lines) - 1)
+ / (display_lines);
+
+ max_offset = a->line_num - (HTMainText->top_of_screen -
+ screensback * (display_lines));
+ } else if (HTMainText->Lines - a->line_num <= (display_lines)) {
+ max_offset = a->line_num - (HTMainText->Lines + 1
+ - (display_lines));
+ } else if (a->line_num >=
+ HTMainText->top_of_screen + (display_lines)) {
+ int screensahead =
+ (a->line_num - HTMainText->top_of_screen) / (display_lines);
+
+ max_offset = a->line_num - HTMainText->top_of_screen -
+ screensahead * (display_lines);
+ } else {
+ max_offset = SEARCH_GOAL_LINE - 1;
+ }
+
+ /* Stuff below should remain unchanged if line positioning
+ is tweaked. - kw */
+ if (max_offset < 0)
+ max_offset = 0;
+ else if (max_offset >= display_lines)
+ max_offset = display_lines - 1;
+ *go_line = a->line_num - max_offset;
+ if (*go_line <= group_to_go->prev_anchor_line)
+ *go_line = group_to_go->prev_anchor_line + 1;
+
+ if (*go_line < 0)
+ *go_line = 0;
+ if (linknum)
+ *linknum = group_to_go->anchors_this_line - 1;
+ return (LINK_LINE_FOUND);
+ }
+ }
+ return (NO);
+}
+
+/*
+ * This function finds the line indicated by line_num in the
+ * HText structure indicated by text, and searches that line
+ * for the first hit with the string indicated by target. If
+ * there is no hit, FALSE is returned. If there is a hit, then
+ * a copy of the line starting at that first hit is loaded into
+ * *data with all IsSpecial characters stripped, its offset and
+ * the printable target length (without IsSpecial, or extra CJK
+ * or utf8 characters) are loaded into *offset and *tLen, and
+ * TRUE is returned. -FM
+ */
+BOOL HText_getFirstTargetInLine(HText *text, int line_num,
+ int utf_flag,
+ int *offset,
+ int *tLen,
+ char **data,
+ const char *target)
+{
+ HTLine *line;
+ char *LineData;
+ int LineOffset, HitOffset, LenNeeded, i;
+ const char *cp;
+
+ /*
+ * Make sure we have an HText structure, that line_num is
+ * in its range, and that we have a target string. -FM
+ */
+ if (!(text &&
+ line_num >= 0 &&
+ line_num <= text->Lines &&
+ non_empty(target))) {
+ return (FALSE);
+ }
+
+ /*
+ * Find the line and set up its data and offset -FM
+ */
+ for (i = 0, line = FirstHTLine(text);
+ i < line_num && (line != text->last_line);
+ i++, line = line->next) {
+ if (line->next == NULL) {
+ return (FALSE);
+ }
+ }
+ if (!(line && line->data[0]))
+ return (FALSE);
+ LineData = (char *) line->data;
+ LineOffset = (int) line->offset;
+
+ /*
+ * If the target is on the line, load the offset of
+ * its first character and the subsequent line data,
+ * strip any special characters from the loaded line
+ * data, and return TRUE. -FM
+ */
+ if (((cp = LYno_attr_mb_strstr(LineData,
+ target,
+ utf_flag, YES,
+ &HitOffset,
+ &LenNeeded)) != NULL) &&
+ (LineOffset + LenNeeded) <= DISPLAY_COLS) {
+ /*
+ * We had a hit so load the results,
+ * remove IsSpecial characters from
+ * the allocated data string, and
+ * return TRUE. -FM
+ */
+ *offset = (LineOffset + HitOffset);
+ *tLen = (LenNeeded - HitOffset);
+ StrAllocCopy(*data, cp);
+ remove_special_attr_chars(*data);
+ return (TRUE);
+ }
+
+ /*
+ * The line does not contain the target. -FM
+ */
+ return (FALSE);
+}
+
+/*
+ * HText_getNumOfLines returns the number of lines in the
+ * current document.
+ */
+int HText_getNumOfLines(void)
+{
+ return (HTMainText ? HTMainText->Lines : 0);
+}
+
+/*
+ * HText_getNumOfBytes returns the size of the document, as rendered. This
+ * may be different from the original filesize.
+ */
+int HText_getNumOfBytes(void)
+{
+ int result = -1;
+ HTLine *line = NULL;
+
+ if (HTMainText != 0) {
+ for (line = FirstHTLine(HTMainText);
+ line != HTMainText->last_line;
+ line = line->next) {
+ result += 1 + (int) strlen(line->data);
+ }
+ }
+ return result;
+}
+
+/*
+ * HText_getTitle returns the title of the
+ * current document.
+ */
+const char *HText_getTitle(void)
+{
+ return (HTMainText ?
+ HTAnchor_title(HTMainText->node_anchor) : 0);
+}
+
+#ifdef USE_COLOR_STYLE
+const char *HText_getStyle(void)
+{
+ return (HTMainText ?
+ HTAnchor_style(HTMainText->node_anchor) : 0);
+}
+#endif
+
+/*
+ * HText_getSugFname returns the suggested filename of the current
+ * document (normally derived from a Content-Disposition header with
+ * attachment; filename=name.suffix). -FM
+ */
+const char *HText_getSugFname(void)
+{
+ return (HTMainText ?
+ HTAnchor_SugFname(HTMainText->node_anchor) : 0);
+}
+
+/*
+ * HTCheckFnameForCompression receives the address of an allocated
+ * string containing a filename, and an anchor pointer, and expands
+ * or truncates the string's suffix if appropriate, based on whether
+ * the anchor indicates that the file is compressed. We assume
+ * that the file was not uncompressed (as when downloading), and
+ * believe the headers about whether it's compressed or not. -FM
+ *
+ * Added third arg - if strip_ok is FALSE, we don't trust the anchor
+ * info enough to remove a compression suffix if the anchor object
+ * does not indicate compression. - kw
+ */
+void HTCheckFnameForCompression(char **fname,
+ HTParentAnchor *anchor,
+ int strip_ok)
+{
+ char *fn = *fname;
+ char *dot = NULL;
+ char *cp = NULL;
+ const char *suffix = "";
+ CompressFileType method;
+ CompressFileType second;
+
+ /*
+ * Make sure we have a string and anchor. -FM
+ */
+ if (!(fn && anchor))
+ return;
+
+ /*
+ * Make sure we have a file, not directory, name. -FM
+ */
+ if (*(fn = LYPathLeaf(fn)) == '\0')
+ return;
+
+ method = HTContentToCompressType(anchor);
+
+ /*
+ * If no Content-Encoding has been detected via the anchor
+ * pointer, but strip_ok is not set, there is nothing left
+ * to do. - kw
+ */
+ if ((method == cftNone) && !strip_ok)
+ return;
+
+ /*
+ * Treat .tgz specially
+ */
+ if ((dot = strrchr(fn, '.')) != NULL
+ && !strcasecomp(dot, ".tgz")) {
+ if (method == cftNone) {
+ strcpy(dot, ".tar");
+ }
+ return;
+ }
+
+ /*
+ * Seek the last dot, and check whether
+ * we have a gzip or compress suffix. -FM
+ */
+ if ((dot = strrchr(fn, '.')) != NULL) {
+ int rootlen = 0;
+
+ if (HTCompressFileType(fn, ".", &rootlen) != cftNone) {
+ if (method == cftNone) {
+ /*
+ * It has a suffix which signifies a gzipped
+ * or compressed file for us, but the anchor
+ * claims otherwise, so tweak the suffix. -FM
+ */
+ *dot = '\0';
+ }
+ return;
+ }
+ if ((second = HTCompressFileType(fn, "-_", &rootlen)) != cftNone) {
+ cp = fn + rootlen;
+ if (method == cftNone) {
+ /*
+ * It has a tail which signifies a gzipped
+ * file for us, but the anchor claims otherwise,
+ * so tweak the suffix. -FM
+ */
+ if (cp == dot + 1)
+ cp--;
+ *cp = '\0';
+ } else {
+ /*
+ * The anchor claims it's gzipped, and we
+ * believe it, so force this tail to the
+ * conventional suffix. -FM
+ */
+#ifdef VMS
+ *cp = '-';
+#else
+ *cp = '.';
+#endif /* VMS */
+ if (second == cftCompress)
+ LYUpperCase(cp);
+ else
+ LYLowerCase(cp);
+ }
+ return;
+ }
+ }
+
+ suffix = HTCompressTypeToSuffix(method);
+
+ /*
+ * Add the appropriate suffix. -FM
+ */
+ if (*suffix) {
+ if (!dot) {
+ StrAllocCat(*fname, suffix);
+ } else if (*++dot == '\0') {
+ StrAllocCat(*fname, suffix + 1);
+ } else {
+ StrAllocCat(*fname, suffix);
+#ifdef VMS
+ (*fname)[strlen(*fname) - strlen(suffix)] = '-';
+#endif /* !VMS */
+ }
+ }
+}
+
+/*
+ * HText_getLastModified returns the Last-Modified header
+ * if available, for the current document. -FM
+ */
+const char *HText_getLastModified(void)
+{
+ return (HTMainText ?
+ HTAnchor_last_modified(HTMainText->node_anchor) : 0);
+}
+
+/*
+ * HText_getDate returns the Date header
+ * if available, for the current document. -FM
+ */
+const char *HText_getDate(void)
+{
+ return (HTMainText ?
+ HTAnchor_date(HTMainText->node_anchor) : 0);
+}
+
+/*
+ * HText_getServer returns the Server header
+ * if available, for the current document. -FM
+ */
+const char *HText_getServer(void)
+{
+ return (HTMainText ?
+ HTAnchor_server(HTMainText->node_anchor) : 0);
+}
+
+/*
+ * Returns the full text of HTTP headers, if available, for the current
+ * document.
+ */
+const char *HText_getHttpHeaders(void)
+{
+ return (HTMainText ?
+ HTAnchor_http_headers(HTMainText->node_anchor) : 0);
+}
+
+/*
+ * HText_pageDisplay displays a screen of text
+ * starting from the line 'line_num'-1.
+ * This is the primary call for lynx.
+ */
+void HText_pageDisplay(int line_num,
+ char *target)
+{
+#ifdef DISP_PARTIAL
+ if (debug_display_partial || (LYTraceLogFP != NULL)) {
+ CTRACE((tfp, "GridText: HText_pageDisplay at line %d started\n", line_num));
+ }
+
+ if (display_partial) {
+ int stop_before = -1;
+
+ /*
+ * Garbage is reported from forms input fields in incremental mode.
+ * So we start HText_trimHightext() to forget this side effect.
+ * This function was split-out from HText_endAppend().
+ * It may not be the best solution but it works. - LP
+ *
+ * (FALSE = indicate that we are in partial mode)
+ * Multiple calls of HText_trimHightext works without problem now.
+ */
+ if (HTMainText && HTMainText->stbl)
+ stop_before = Stbl_getStartLineDeep(HTMainText->stbl);
+ HText_trimHightext(HTMainText, FALSE, stop_before);
+ }
+#endif
+ display_page(HTMainText, line_num - 1, target);
+
+#ifdef DISP_PARTIAL
+ if (display_partial && debug_display_partial)
+ LYSleepMsg();
+#endif
+
+ is_www_index = HTAnchor_isIndex(HTMainAnchor);
+
+#ifdef DISP_PARTIAL
+ if (debug_display_partial || (LYTraceLogFP != NULL)) {
+ CTRACE((tfp, "GridText: HText_pageDisplay finished\n"));
+ }
+#endif
+}
+
+/*
+ * Return YES if we have a whereis search target on the displayed
+ * page. - kw
+ */
+BOOL HText_pageHasPrevTarget(void)
+{
+ if (!HTMainText)
+ return NO;
+ else
+ return HTMainText->page_has_target;
+}
+
+/*
+ * Find the number of the closest anchor to the given document offset. Used
+ * in reparsing, this will usually find an exact match, as a link shifts around
+ * on the display. It will not find a match when (for example) the source view
+ * shows images that are not links in the html.
+ */
+int HText_closestAnchor(HText *text, int offset)
+{
+ int result = -1;
+ int absdiff = 0;
+ int newdiff;
+ TextAnchor *Anchor_ptr = NULL;
+ TextAnchor *closest = NULL;
+
+ for (Anchor_ptr = text->first_anchor;
+ Anchor_ptr != NULL;
+ Anchor_ptr = Anchor_ptr->next) {
+ if (Anchor_ptr->sgml_offset == offset) {
+ result = Anchor_ptr->number;
+ break;
+ } else {
+ newdiff = abs(Anchor_ptr->sgml_offset - offset);
+ if (absdiff == 0 || absdiff > newdiff) {
+ absdiff = newdiff;
+ closest = Anchor_ptr;
+ }
+ }
+ }
+ if (result < 0 && closest != 0) {
+ result = closest->number;
+ }
+
+ return result;
+}
+
+/*
+ * Find the offset for the given anchor, e.g., the inverse of
+ * HText_closestAnchor().
+ */
+int HText_locateAnchor(HText *text, int anchor_number)
+{
+ int result = -1;
+ TextAnchor *Anchor_ptr = NULL;
+
+ for (Anchor_ptr = text->first_anchor;
+ Anchor_ptr != NULL;
+ Anchor_ptr = Anchor_ptr->next) {
+ if (Anchor_ptr->number == anchor_number) {
+ result = Anchor_ptr->sgml_offset;
+ break;
+ }
+ }
+
+ return result;
+}
+
+/*
+ * This is supposed to give the same result as the inline checks in
+ * display_page(), so we can decide which anchors will be visible.
+ */
+static BOOL anchor_is_numbered(TextAnchor *Anchor_ptr)
+{
+ BOOL result = FALSE;
+
+ if (Anchor_ptr->show_anchor
+ && (Anchor_ptr->link_type & HYPERTEXT_ANCHOR)) {
+ result = TRUE;
+ } else if (Anchor_ptr->link_type == INPUT_ANCHOR
+ && Anchor_ptr->input_field->type != F_HIDDEN_TYPE) {
+ result = TRUE;
+ }
+ return result;
+}
+
+/*
+ * Return the absolute line number (counting from the beginning of the
+ * document) for the given absolute anchor number. Normally line numbers are
+ * computed within the screen, and for that we use the links[] array. A few
+ * uses require the absolute anchor number. For example, reparsing a document,
+ * e.g., switching between normal and source views will alter the line numbers
+ * of each link, and may require adjusting the top line number used for the
+ * display, before we recompute the links[] array.
+ */
+int HText_getAbsLineNumber(HText *text,
+ int anchor_number)
+{
+ int result = -1;
+
+ if (anchor_number >= 0 && text != 0) {
+ TextAnchor *Anchor_ptr = NULL;
+
+ for (Anchor_ptr = text->first_anchor;
+ Anchor_ptr != NULL;
+ Anchor_ptr = Anchor_ptr->next) {
+ if (anchor_is_numbered(Anchor_ptr)
+ && Anchor_ptr->number == anchor_number) {
+ result = Anchor_ptr->line_num;
+ break;
+ }
+ }
+ }
+ return result;
+}
+
+/*
+ * Compute the link-number in a page, given the top line number of the page and
+ * the absolute anchor number.
+ */
+int HText_anchorRelativeTo(HText *text, int top_lineno, int anchor_number)
+{
+ int result = 0;
+ int from_top = 0;
+ TextAnchor *Anchor_ptr = NULL;
+
+ for (Anchor_ptr = text->first_anchor;
+ Anchor_ptr != NULL;
+ Anchor_ptr = Anchor_ptr->next) {
+ if (Anchor_ptr->number == anchor_number) {
+ result = from_top;
+ break;
+ }
+ if (!anchor_is_numbered(Anchor_ptr))
+ continue;
+ if (Anchor_ptr->line_num >= top_lineno) {
+ ++from_top;
+ }
+ }
+ return result;
+}
+
+/*
+ * HText_LinksInLines returns the number of links in the
+ * 'Lines' number of lines beginning with 'line_num'-1. -FM
+ */
+int HText_LinksInLines(HText *text,
+ int line_num,
+ int Lines)
+{
+ int total = 0;
+ int start = (line_num - 1);
+ int end = (start + Lines);
+ TextAnchor *Anchor_ptr = NULL;
+
+ if (!text)
+ return total;
+
+ for (Anchor_ptr = text->first_anchor;
+ Anchor_ptr != NULL && Anchor_ptr->line_num <= end;
+ Anchor_ptr = Anchor_ptr->next) {
+ if (Anchor_ptr->line_num >= start &&
+ Anchor_ptr->line_num < end &&
+ Anchor_ptr->show_anchor &&
+ !(Anchor_ptr->link_type == INPUT_ANCHOR
+ && Anchor_ptr->input_field->type == F_HIDDEN_TYPE))
+ ++total;
+ }
+
+ return total;
+}
+
+void HText_setStale(HText *text)
+{
+ text->stale = YES;
+}
+
+void HText_refresh(HText *text)
+{
+ if (text->stale)
+ display_page(text, text->top_of_screen, "");
+}
+
+int HText_sourceAnchors(HText *text)
+{
+ return (text ? text->last_anchor_number : -1);
+}
+
+BOOL HText_canScrollUp(HText *text)
+{
+ return (BOOL) (text->top_of_screen != 0);
+}
+
+/*
+ * Check if there is more info below this page.
+ */
+BOOL HText_canScrollDown(void)
+{
+ HText *text = HTMainText;
+
+ return (BOOL) ((text != 0)
+ && ((text->top_of_screen + display_lines) <= text->Lines));
+}
+
+/* Scroll actions
+*/
+void HText_scrollTop(HText *text)
+{
+ display_page(text, 0, "");
+}
+
+void HText_scrollDown(HText *text)
+{
+ display_page(text, text->top_of_screen + display_lines, "");
+}
+
+void HText_scrollUp(HText *text)
+{
+ display_page(text, text->top_of_screen - display_lines, "");
+}
+
+void HText_scrollBottom(HText *text)
+{
+ display_page(text, text->Lines - display_lines, "");
+}
+
+/* Browsing functions
+ * ==================
+ */
+
+/* Bring to front and highlight it
+*/
+BOOL HText_select(HText *text)
+{
+ if (text != HTMainText) {
+ /*
+ * Reset flag for whereis search string - cannot be true here
+ * since text is not our HTMainText. - kw
+ */
+ if (text)
+ text->page_has_target = NO;
+
+#ifdef DISP_PARTIAL
+ /* Reset these for the previous and current text. - kw */
+ ResetPartialLinenos(text);
+ ResetPartialLinenos(HTMainText);
+#endif /* DISP_PARTIAL */
+
+#ifdef CAN_SWITCH_DISPLAY_CHARSET
+ /* text->UCLYhndl is not reset by META, so use a more circumvent way */
+ if (text->node_anchor->UCStages->s[UCT_STAGE_HTEXT].LYhndl
+ != current_char_set)
+ Switch_Display_Charset(text->node_anchor->UCStages->s[UCT_STAGE_HTEXT].LYhndl, SWITCH_DISPLAY_CHARSET_MAYBE);
+#endif
+ assert(text != NULL);
+ if (HTMainText) {
+ if (HText_hasUTF8OutputSet(HTMainText) &&
+ HTLoadedDocumentEightbit() &&
+ IS_UTF8_TTY) {
+ text->had_utf8 = HTMainText->has_utf8;
+ } else {
+ text->had_utf8 = NO;
+ }
+ HTMainText->has_utf8 = NO;
+ text->has_utf8 = NO;
+ }
+
+ HTMainText = text;
+ HTMainAnchor = text->node_anchor;
+
+ /*
+ * Make this text the most current in the loaded texts list. -FM
+ */
+ if (loaded_texts && HTList_removeObject(loaded_texts, text))
+ HTList_addObject(loaded_texts, text);
+ }
+ return YES;
+}
+
+/*
+ * This function returns TRUE if doc's post_data, address
+ * and isHEAD elements are identical to those of a loaded
+ * (memory cached) text. -FM
+ */
+BOOL HText_POSTReplyLoaded(DocInfo *doc)
+{
+ HText *text = NULL;
+ HTList *cur = loaded_texts;
+ bstring *post_data;
+ char *address;
+ BOOL is_head;
+
+ /*
+ * Make sure we have the structures. -FM
+ */
+ if (!cur || !doc)
+ return (FALSE);
+
+ /*
+ * Make sure doc is for a POST reply. -FM
+ */
+ if ((post_data = doc->post_data) == NULL ||
+ (address = doc->address) == NULL)
+ return (FALSE);
+ is_head = doc->isHEAD;
+
+ /*
+ * Loop through the loaded texts looking for a
+ * POST reply match. -FM
+ */
+ while (NULL != (text = (HText *) HTList_nextObject(cur))) {
+ if (text->node_anchor &&
+ text->node_anchor->post_data &&
+ BINEQ(post_data, text->node_anchor->post_data) &&
+ text->node_anchor->address &&
+ !strcmp(address, text->node_anchor->address) &&
+ is_head == text->node_anchor->isHEAD) {
+ return (TRUE);
+ }
+ }
+
+ return (FALSE);
+}
+
+BOOL HTFindPoundSelector(const char *selector)
+{
+ TextAnchor *a;
+
+ CTRACE((tfp, "FindPound: searching for \"%s\"\n", selector));
+ for (a = HTMainText->first_anchor; a != 0; a = a->next) {
+
+ if (a->anchor && a->anchor->tag) {
+ if (!strcmp(a->anchor->tag, selector)) {
+
+ www_search_result = a->line_num + 1;
+
+ CTRACE((tfp, "FindPound: Selecting anchor [%d] at line %d\n",
+ a->number, www_search_result));
+ if (!strcmp(selector, LYToolbarName)) {
+ --www_search_result;
+ }
+ return (YES);
+ }
+ }
+ }
+ return (NO);
+}
+
+BOOL HText_selectAnchor(HText *text, HTChildAnchor *anchor)
+{
+ TextAnchor *a;
+ int l;
+
+ for (a = text->first_anchor; a; a = a->next) {
+ if (a->anchor == anchor)
+ break;
+ }
+ if (!a) {
+ CTRACE((tfp, "HText: No such anchor in this text!\n"));
+ return NO;
+ }
+
+ if (text != HTMainText) { /* Comment out by ??? */
+ HTMainText = text; /* Put back in by tbl 921208 */
+ HTMainAnchor = text->node_anchor;
+ }
+ l = a->line_num;
+
+ CTRACE((tfp, "HText: Selecting anchor [%d] at line %d\n",
+ a->number, l));
+
+ if (!text->stale &&
+ (l >= text->top_of_screen) &&
+ (l < text->top_of_screen + display_lines + 1))
+ return YES;
+
+ www_search_result = l - (display_lines / 3); /* put in global variable */
+
+ return YES;
+}
+
+/* Editing functions - NOT IMPLEMENTED
+ * =================
+ *
+ * These are called from the application. There are many more functions
+ * not included here from the original text object.
+ */
+
+/* Style handling:
+*/
+/* Apply this style to the selection
+*/
+void HText_applyStyle(HText *me GCC_UNUSED, HTStyle *style GCC_UNUSED)
+{
+
+}
+
+/* Update all text with changed style.
+*/
+void HText_updateStyle(HText *me GCC_UNUSED, HTStyle *style GCC_UNUSED)
+{
+
+}
+
+/* Return style of selection
+*/
+HTStyle *HText_selectionStyle(HText *me GCC_UNUSED, HTStyleSheet *sheet GCC_UNUSED)
+{
+ return 0;
+}
+
+/* Paste in styled text
+*/
+void HText_replaceSel(HText *me GCC_UNUSED, const char *aString GCC_UNUSED,
+ HTStyle *aStyle GCC_UNUSED)
+{
+}
+
+/* Apply this style to the selection and all similarly formatted text
+ * (style recovery only)
+ */
+void HTextApplyToSimilar(HText *me GCC_UNUSED, HTStyle *style GCC_UNUSED)
+{
+
+}
+
+/* Select the first unstyled run.
+ * (style recovery only)
+ */
+void HTextSelectUnstyled(HText *me GCC_UNUSED, HTStyleSheet *sheet GCC_UNUSED)
+{
+
+}
+
+/* Anchor handling:
+*/
+void HText_unlinkSelection(HText *me GCC_UNUSED)
+{
+
+}
+
+HTAnchor *HText_referenceSelected(HText *me GCC_UNUSED)
+{
+ return 0;
+}
+
+int HText_getTopOfScreen(void)
+{
+ HText *text = HTMainText;
+
+ return text != 0 ? text->top_of_screen : 0;
+}
+
+int HText_getLines(HText *text)
+{
+ return text->Lines;
+}
+
+/*
+ * Constrain the line number to be within the document. The line number is
+ * zero-based.
+ */
+int HText_getPreferredTopLine(HText *text, int line_number)
+{
+ int last_screen = text->Lines - (display_lines - 2);
+
+ if (text->Lines < display_lines) {
+ line_number = 0;
+ } else if (line_number > text->Lines) {
+ line_number = last_screen;
+ } else if (line_number < 0) {
+ line_number = 0;
+ }
+ return line_number;
+}
+
+HTAnchor *HText_linkSelTo(HText *me GCC_UNUSED,
+ HTAnchor * anchor GCC_UNUSED)
+{
+ return 0;
+}
+
+/*
+ * Utility for freeing the list of previous isindex and whereis queries. -FM
+ */
+void HTSearchQueries_free(void)
+{
+ LYFreeStringList(search_queries);
+ search_queries = NULL;
+}
+
+/*
+ * Utility for listing isindex and whereis queries, making
+ * any repeated queries the most current in the list. -FM
+ */
+void HTAddSearchQuery(char *query)
+{
+ char *new_query = NULL;
+ char *old;
+ HTList *cur;
+
+ if (!non_empty(query))
+ return;
+
+ StrAllocCopy(new_query, query);
+
+ if (!search_queries) {
+ search_queries = HTList_new();
+#ifdef LY_FIND_LEAKS
+ atexit(HTSearchQueries_free);
+#endif
+ HTList_addObject(search_queries, new_query);
+ return;
+ }
+
+ cur = search_queries;
+ while (NULL != (old = (char *) HTList_nextObject(cur))) {
+ if (!strcmp(old, new_query)) {
+ HTList_removeObject(search_queries, old);
+ FREE(old);
+ break;
+ }
+ }
+ HTList_addObject(search_queries, new_query);
+
+ return;
+}
+
+int do_www_search(DocInfo *doc)
+{
+ bstring *searchstring = NULL;
+ bstring *temp = NULL;
+ char *cp;
+ char *tmpaddress = NULL;
+ int ch;
+ RecallType recall;
+ int QueryTotal;
+ int QueryNum;
+ BOOLEAN PreviousSearch = FALSE;
+ int code;
+
+ /*
+ * Load the default query buffer
+ */
+ if ((cp = StrChr(doc->address, '?')) != NULL) {
+ /*
+ * This is an index from a previous search.
+ * Use its query as the default.
+ */
+ PreviousSearch = TRUE;
+ BStrCopy0(searchstring, ++cp);
+ for (cp = searchstring->str; *cp; cp++)
+ if (*cp == '+')
+ *cp = ' ';
+ HTUnEscape(searchstring->str);
+ BStrCopy(temp, searchstring);
+ /*
+ * Make sure it's treated as the most recent query. -FM
+ */
+ HTAddSearchQuery(searchstring->str);
+ } else {
+ /*
+ * New search; no default.
+ */
+ BStrCopy0(searchstring, "");
+ BStrCopy0(temp, "");
+ }
+
+ /*
+ * Prompt for a query string.
+ */
+ if (isBEmpty(searchstring)) {
+ if (HTMainAnchor->isIndexPrompt)
+ _statusline(HTMainAnchor->isIndexPrompt);
+ else
+ _statusline(ENTER_DATABASE_QUERY);
+ } else
+ _statusline(EDIT_CURRENT_QUERY);
+ QueryTotal = (search_queries ? HTList_count(search_queries) : 0);
+ recall = (((PreviousSearch && QueryTotal >= 2) ||
+ (!PreviousSearch && QueryTotal >= 1)) ? RECALL_URL : NORECALL);
+ QueryNum = QueryTotal;
+
+ get_query:
+ if ((ch = LYgetBString(&searchstring, FALSE, 0, recall)) < 0 ||
+ isBEmpty(searchstring) ||
+ ch == UPARROW_KEY ||
+ ch == DNARROW_KEY) {
+
+ if (recall && ch == UPARROW_KEY) {
+ if (PreviousSearch) {
+ /*
+ * Use the second to last query in the list. -FM
+ */
+ QueryNum = 1;
+ PreviousSearch = FALSE;
+ } else {
+ /*
+ * Go back to the previous query in the list. -FM
+ */
+ QueryNum++;
+ }
+ if (QueryNum >= QueryTotal)
+ /*
+ * Roll around to the last query in the list. -FM
+ */
+ QueryNum = 0;
+ if ((cp = (char *) HTList_objectAt(search_queries,
+ QueryNum)) != NULL) {
+ BStrCopy0(searchstring, cp);
+ if (!isBEmpty(temp) &&
+ !strcmp(temp->str, searchstring->str)) {
+ _statusline(EDIT_CURRENT_QUERY);
+ } else if ((!isBEmpty(temp) && QueryTotal == 2) ||
+ (isBEmpty(temp) && QueryTotal == 1)) {
+ _statusline(EDIT_THE_PREV_QUERY);
+ } else {
+ _statusline(EDIT_A_PREV_QUERY);
+ }
+ goto get_query;
+ }
+ } else if (recall && ch == DNARROW_KEY) {
+ if (PreviousSearch) {
+ /*
+ * Use the first query in the list. -FM
+ */
+ QueryNum = QueryTotal - 1;
+ PreviousSearch = FALSE;
+ } else {
+ /*
+ * Advance to the next query in the list. -FM
+ */
+ QueryNum--;
+ }
+ if (QueryNum < 0)
+ /*
+ * Roll around to the first query in the list. -FM
+ */
+ QueryNum = QueryTotal - 1;
+ if ((cp = (char *) HTList_objectAt(search_queries,
+ QueryNum)) != NULL) {
+ BStrCopy0(searchstring, cp);
+ if (!isBEmpty(temp) &&
+ !strcmp(temp->str, searchstring->str)) {
+ _statusline(EDIT_CURRENT_QUERY);
+ } else if ((!isBEmpty(temp) && QueryTotal == 2) ||
+ (isBEmpty(temp) && QueryTotal == 1)) {
+ _statusline(EDIT_THE_PREV_QUERY);
+ } else {
+ _statusline(EDIT_A_PREV_QUERY);
+ }
+ goto get_query;
+ }
+ }
+
+ /*
+ * Search cancelled.
+ */
+ HTInfoMsg(CANCELLED);
+ code = NULLFILE;
+ } else {
+
+ LYTrimLeading(searchstring->str);
+ LYTrimTrailing(searchstring->str);
+ if (isBEmpty(searchstring)) {
+ HTInfoMsg(CANCELLED);
+ code = NULLFILE;
+ } else if (!LYforce_no_cache &&
+ !isBEmpty(temp) &&
+ !strcmp(temp->str, searchstring->str)) {
+ /*
+ * Don't resubmit the same query unintentionally.
+ */
+ HTUserMsg(USE_C_R_TO_RESUB_CUR_QUERY);
+ code = NULLFILE;
+ } else {
+
+ /*
+ * Add searchstring to the query list,
+ * or make it the most current. -FM
+ */
+ HTAddSearchQuery(searchstring->str);
+
+ /*
+ * Show the URL with the new query.
+ */
+ if ((cp = StrChr(doc->address, '?')) != NULL)
+ *cp = '\0';
+ StrAllocCopy(tmpaddress, doc->address);
+ StrAllocCat(tmpaddress, "?");
+ StrAllocCat(tmpaddress, searchstring->str);
+ user_message(WWW_WAIT_MESSAGE, tmpaddress);
+#ifdef SYSLOG_REQUESTED_URLS
+ LYSyslog(tmpaddress);
+#endif
+ FREE(tmpaddress);
+ if (cp)
+ *cp = '?';
+
+ /*
+ * OK, now we do the search.
+ */
+ if (HTSearch(searchstring->str, HTMainAnchor)) {
+ auto char *cp_freeme = NULL;
+
+ if (traversal)
+ cp_freeme = stub_HTAnchor_address((HTAnchor *) HTMainAnchor);
+ else
+ cp_freeme = HTAnchor_address((HTAnchor *) HTMainAnchor);
+ StrAllocCopy(doc->address, cp_freeme);
+ FREE(cp_freeme);
+
+ CTRACE((tfp, "\ndo_www_search: newfile: %s\n", doc->address));
+
+ /*
+ * Yah, the search succeeded.
+ */
+ code = NORMAL;
+ } else {
+
+ /*
+ * Either the search failed (Yuk), or we got redirection.
+ * If it's redirection, use_this_url_instead is set, and
+ * mainloop() will deal with it such that security features
+ * and restrictions are checked before acting on the URL, or
+ * rejecting it. -FM
+ */
+ code = NOT_FOUND;
+ }
+ }
+ }
+ BStrFree(searchstring);
+ BStrFree(temp);
+ return code;
+}
+
+static void write_offset(FILE *fp, HTLine *line)
+{
+ int i;
+
+ if (line->data[0]) {
+ for (i = 0; i < (int) line->offset; i++) {
+ fputc(' ', fp);
+ }
+ }
+}
+
+static void write_hyphen(FILE *fp)
+{
+ if (dump_output_immediately &&
+ LYRawMode &&
+ LYlowest_eightbit[current_char_set] <= 173 &&
+ (LYCharSet_UC[current_char_set].enc == UCT_ENC_8859 ||
+ (LYCharSet_UC[current_char_set].like8859 & UCT_R_8859SPECL)) != 0) {
+ fputc(0xad, fp); /* the iso8859 byte for SHY */
+ } else {
+ fputc('-', fp);
+ }
+}
+
+/*
+ * Returns the length after trimming trailing blanks. Modify the string as
+ * needed so that any special character which follows a trailing blank is moved
+ * before the (trimmed) blank, so the result which will be dumped has no
+ * trailing blanks.
+ */
+static int TrimmedLength(char *string)
+{
+ int result = (int) strlen(string);
+
+ if (!HTisDocumentSource()) {
+ int adjust = result;
+ int ch;
+
+ while (adjust > 0) {
+ ch = UCH(string[adjust - 1]);
+ if (isspace(ch) || IsSpecialAttrChar(ch)) {
+ --adjust;
+ } else {
+ break;
+ }
+ }
+ if (result != adjust) {
+ char *dst = string + adjust;
+ char *src = dst;
+
+ for (;;) {
+ src = LYSkipBlanks(src);
+ if ((*dst++ = *src++) == '\0')
+ break;
+ }
+ result = (int) (dst - string - 1);
+ }
+ }
+ return result;
+}
+
+typedef struct _AnchorIndex {
+ struct _AnchorIndex *next;
+ int type; /* field type */
+ int size; /* character-width of field */
+ int length; /* byte-count for field's data */
+ int offset; /* byte-offset in line's data */
+ char filler; /* character to use for filler */
+ const char *value; /* field's value */
+} AnchorIndex;
+
+static unsigned countHTLines(void)
+{
+ unsigned result = 0;
+ HTLine *line = FirstHTLine(HTMainText);
+
+ while (line != 0) {
+ ++result;
+ if (line == HTMainText->last_line)
+ break;
+ line = line->next;
+ }
+ CTRACE((tfp, "countHTLines %u\n", result));
+ return result;
+}
+
+/*
+ * The TextAnchor list is not organized to allow efficient dumping of a page.
+ * Make an array with one item per line of the page, and store (by byte-offset)
+ * pointers to the TextAnchor's we want to use.
+ */
+static AnchorIndex **allocAnchorIndex(unsigned *size)
+{
+ AnchorIndex **result = NULL;
+ AnchorIndex *p, *q;
+ TextAnchor *anchor = NULL;
+ FormInfo *input = NULL;
+
+ *size = countHTLines();
+ if (*size != 0) {
+ result = typecallocn(AnchorIndex *, *size + 1);
+ if (result == NULL)
+ outofmem(__FILE__, "allocAnchorIndex");
+
+ for (anchor = HTMainText->first_anchor;
+ anchor != NULL;
+ anchor = anchor->next) {
+
+ if (anchor->link_type == INPUT_ANCHOR
+ && anchor->show_anchor
+ && anchor->line_num < (int) *size
+ && (input = anchor->input_field) != NULL) {
+ CTRACE2(TRACE_GRIDTEXT,
+ (tfp, "line %d.%d %d %s->%s(%s)\n",
+ anchor->line_num,
+ anchor->line_pos,
+ input->size,
+ inputFieldDesc(input),
+ input->value,
+ input->orig_value));
+ switch (input->type) {
+ case F_SUBMIT_TYPE:
+ case F_RESET_TYPE:
+ case F_TEXT_SUBMIT_TYPE:
+ case F_IMAGE_SUBMIT_TYPE:
+ CTRACE2(TRACE_GRIDTEXT, (tfp, "skipping\n"));
+ continue;
+ case F_TEXT_TYPE:
+ case F_PASSWORD_TYPE:
+ case F_CHECKBOX_TYPE:
+ case F_RADIO_TYPE:
+ case F_OPTION_LIST_TYPE:
+ case F_TEXTAREA_TYPE:
+ case F_RANGE_TYPE:
+ case F_FILE_TYPE:
+ p = typecalloc(AnchorIndex);
+ if (p == NULL)
+ outofmem(__FILE__, "allocAnchorIndex");
+
+ p->type = input->type;
+ p->size = input->size;
+ p->offset = anchor->line_pos;
+ p->value = input->value;
+
+ switch (input->type) {
+ case F_TEXTAREA_TYPE:
+ case F_TEXT_TYPE:
+ case F_PASSWORD_TYPE:
+ p->filler = '_';
+ break;
+ case F_OPTION_LIST_TYPE:
+ p->filler = '_';
+ break;
+ case F_CHECKBOX_TYPE:
+ p->value = (input->num_value
+ ? checked_box
+ : unchecked_box);
+ break;
+ case F_RADIO_TYPE:
+ p->value = (input->num_value
+ ? checked_radio
+ : unchecked_radio);
+ break;
+ default:
+ p->filler = ' ';
+ break;
+ }
+ p->length = p->value ? (int) strlen(p->value) : 0;
+
+ if ((q = result[anchor->line_num]) != NULL) {
+ /* insert, ordering by offset */
+ if (q->offset < p->offset) {
+ while (q->next != NULL
+ && q->next->offset < p->offset) {
+ q = q->next;
+ }
+ p->next = q->next;
+ q->next = p;
+ } else {
+ p->next = q;
+ result[anchor->line_num] = p;
+ }
+ } else {
+ result[anchor->line_num] = p;
+ }
+ break;
+ }
+ }
+ }
+ }
+ return result;
+}
+
+/*
+ * Free the data allocated in allocAnchorIndex().
+ */
+static void freeAnchorIndex(AnchorIndex ** inx, unsigned inx_size)
+{
+ AnchorIndex *cur;
+ unsigned num;
+
+ if (inx != 0) {
+ if (inx_size != 0) {
+ for (num = 0; num < inx_size; ++num) {
+ while ((cur = inx[num]) != NULL) {
+ inx[num] = cur->next;
+ free(cur);
+ }
+ }
+ }
+ free(inx);
+ }
+}
+
+/*
+ * Return the column (counting from zero) at which a field should be overlaid
+ * on the form.
+ */
+static int FieldFirst(AnchorIndex * p, int wrap)
+{
+ return (wrap ? 0 : (p)->offset);
+}
+
+/*
+ * Return the column (counting from zero) just past the field in a form.
+ */
+static int FieldLast(AnchorIndex * p, int wrap)
+{
+ return ((p)->size - wrap) + FieldFirst(p, wrap);
+}
+
+/*
+ * Print the contents of the file in HTMainText to
+ * the file descriptor fp.
+ * If is_email is TRUE add ">" before each "From " line.
+ * If is_reply is TRUE add ">" to the beginning of each
+ * line to specify the file is a reply to message.
+ */
+void print_wwwfile_to_fd(FILE *fp,
+ int is_email,
+ int is_reply)
+{
+ int line_num, byte_num, byte_count, byte_offset;
+ int first = TRUE;
+ HTLine *line;
+ AnchorIndex **inx; /* sorted index of input-fields */
+ AnchorIndex *cur = 0; /* current input-field */
+ unsigned inx_size; /* number of entries in inx[] */
+ int in_field = -1; /* if positive, is index in cur->value[] */
+ int this_wrap = 0; /* current wrapping point of cur->value[] */
+ int next_wrap = 0; /* next wrapping point of cur->value[] */
+
+#ifndef NO_DUMP_WITH_BACKSPACES
+ HText *text = HTMainText;
+ BOOL in_b = FALSE;
+ BOOL in_u = FALSE;
+ BOOL bs = (BOOL) (!is_email && !is_reply
+ && text != 0
+ && with_backspaces
+ && !IS_CJK_TTY
+ && !text->T.output_utf8);
+#endif
+
+ if (!HTMainText)
+ return;
+
+ /*
+ * Build an index of anchors for each line, so we can override the
+ * static text which is stored in the list of HTLine's.
+ */
+ inx = allocAnchorIndex(&inx_size);
+
+ line = FirstHTLine(HTMainText);
+ for (line_num = 0; line != NULL; ++line_num, line = line->next) {
+ if (in_field >= 0) {
+ this_wrap = next_wrap;
+ next_wrap = 0; /* FIXME - allow for multiple continuations */
+ CTRACE2(TRACE_GRIDTEXT,
+ (tfp, "wrap %d:%d, offset %d\n",
+ in_field, cur ? cur->length : -1, this_wrap));
+ } else {
+ cur = inx[line_num];
+ }
+
+ CTRACE2(TRACE_GRIDTEXT, (tfp, "dump %d:%s\n", line_num, line->data));
+
+ if (first) {
+ first = FALSE;
+ if (is_reply) {
+ fputc('>', fp);
+ } else if (is_email && !StrNCmp(line->data, "From ", 5)) {
+ fputc('>', fp);
+ }
+ } else if (line->data[0] != LY_SOFT_NEWLINE) {
+ fputc('\n', fp);
+ /*
+ * Add news-style quotation if requested. -FM
+ */
+ if (is_reply) {
+ fputc('>', fp);
+ } else if (is_email && !StrNCmp(line->data, "From ", 5)) {
+ fputc('>', fp);
+ }
+ }
+
+ write_offset(fp, line);
+
+ /*
+ * Add data.
+ */
+ byte_offset = line->offset;
+ byte_count = TrimmedLength(line->data);
+ for (byte_num = 0; byte_num < byte_count; byte_num += 1) {
+ int cell_chr, temp_chr;
+ size_t cell_len, temp_len;
+ const char *cell_ptr, *temp_ptr, *try_utf8;
+
+ cell_ptr = &line->data[byte_num];
+ cell_len = 1;
+ cell_chr = UCH(*cell_ptr);
+
+ while (cur != 0 && FieldLast(cur, this_wrap) < byte_offset) {
+ CTRACE2(TRACE_GRIDTEXT,
+ (tfp, "skip field since last %d < %d\n",
+ FieldLast(cur, this_wrap), byte_offset));
+ cur = cur->next;
+ in_field = -1;
+ }
+ if (cur != 0 && in_field >= 0) {
+ CTRACE2(TRACE_GRIDTEXT,
+ (tfp, "compare %d to [%d..%d]\n",
+ byte_offset,
+ FieldFirst(cur, this_wrap),
+ FieldLast(cur, this_wrap) - 1));
+ }
+ if (cur != 0
+ && FieldFirst(cur, this_wrap) <= byte_offset
+ && FieldLast(cur, this_wrap) > byte_offset) {
+ int off2 = ((in_field > 0)
+ ? in_field
+ : (byte_offset - FieldFirst(cur, this_wrap)));
+
+ /*
+ * On the first time (for each line that the field appears on),
+ * check if this field wraps. If it does, save the offset into
+ * the field which will be used to adjust the beginning of the
+ * continuation line.
+ */
+ if (byte_offset == FieldFirst(cur, this_wrap)) {
+ next_wrap = 0;
+ if (cur->size - this_wrap + byte_num > byte_count) {
+ CTRACE((tfp, "size %d, offset %d, length %d\n",
+ cur->size,
+ cur->offset,
+ cur->length));
+ CTRACE((tfp, "byte_count %d, byte_num %d\n",
+ byte_count, byte_num));
+ next_wrap = byte_count - byte_num;
+ CTRACE2(TRACE_GRIDTEXT,
+ (tfp, "field will wrap: %d\n", next_wrap));
+ }
+ }
+
+ if (off2 >= 0 && off2 < cur->length) {
+ temp_ptr = &(cur->value[off2]);
+ try_utf8 = temp_ptr;
+ temp_chr = (int) UCGetUniFromUtf8String(&try_utf8);
+ if (temp_chr > 127) {
+ temp_len = (size_t) (try_utf8 - temp_ptr) + 1;
+ } else {
+ temp_chr = UCH(*temp_ptr);
+ temp_len = 1;
+ }
+ } else {
+ temp_ptr = &(cur->filler);
+ temp_len = 1;
+ temp_chr = UCH(*temp_ptr);
+ }
+
+ if (cell_chr != temp_chr) {
+ CTRACE2(TRACE_GRIDTEXT,
+ (tfp, "line %d %d/%d [%d..%d] map %d %04X->%04X\n",
+ line_num,
+ off2, cur->length,
+ FieldFirst(cur, this_wrap),
+ FieldLast(cur, this_wrap) - 1,
+ byte_offset,
+ (unsigned) cell_chr,
+ (unsigned) temp_chr));
+ cell_chr = temp_chr;
+ cell_ptr = temp_ptr;
+ cell_len = temp_len;
+ }
+ off2 += (int) temp_len;
+ byte_offset += (int) temp_len;
+ if ((off2 >= cur->size) &&
+ (off2 >= cur->length || F_TEXTLIKE(cur->type))) {
+ in_field = -1;
+ this_wrap = 0;
+ next_wrap = 0;
+ } else {
+ in_field = off2;
+ }
+ } else {
+ byte_offset++;
+ }
+
+ if (!IsSpecialAttrChar(cell_chr)) {
+#ifndef NO_DUMP_WITH_BACKSPACES
+ size_t n;
+
+ if (in_b) {
+ IGNORE_RC(fwrite(cell_ptr, sizeof(char), cell_len, fp));
+
+ for (n = 0; n < cell_len; ++n) {
+ fputc('\b', fp);
+ }
+ IGNORE_RC(fwrite(cell_ptr, sizeof(char), cell_len, fp));
+ } else if (in_u) {
+ for (n = 0; n < cell_len; ++n) {
+ fputc('_', fp);
+ }
+ for (n = 0; n < cell_len; ++n) {
+ fputc('\b', fp);
+ }
+ IGNORE_RC(fwrite(cell_ptr, sizeof(char), cell_len, fp));
+ } else
+#endif
+ IGNORE_RC(fwrite(cell_ptr, sizeof(char), cell_len, fp));
+ } else if (cell_chr == LY_SOFT_HYPHEN &&
+ (byte_num + 1) >= byte_count) {
+ write_hyphen(fp);
+ } else if (dump_output_immediately && use_underscore) {
+ switch (cell_chr) {
+ case LY_UNDERLINE_START_CHAR:
+ case LY_UNDERLINE_END_CHAR:
+ fputc('_', fp);
+ break;
+ case LY_BOLD_START_CHAR:
+ case LY_BOLD_END_CHAR:
+ break;
+ }
+ }
+#ifndef NO_DUMP_WITH_BACKSPACES
+ else if (bs) {
+ switch (cell_chr) {
+ case LY_UNDERLINE_START_CHAR:
+ if (!in_b)
+ in_u = TRUE; /*favor bold over underline */
+ break;
+ case LY_UNDERLINE_END_CHAR:
+ in_u = FALSE;
+ break;
+ case LY_BOLD_START_CHAR:
+ if (in_u)
+ in_u = FALSE; /* turn it off */
+ in_b = TRUE;
+ break;
+ case LY_BOLD_END_CHAR:
+ in_b = FALSE;
+ break;
+ }
+ }
+#endif
+ }
+
+ if (line == HTMainText->last_line)
+ break;
+
+#ifdef VMS
+ if (HadVMSInterrupt)
+ break;
+#endif /* VMS */
+ }
+ fputc('\n', fp);
+
+ freeAnchorIndex(inx, inx_size);
+}
+
+/*
+ * Print the contents of the file in HTMainText to
+ * the file descriptor fp.
+ * First output line is "thelink", ie, the URL for this file.
+ */
+void print_crawl_to_fd(FILE *fp, char *thelink,
+ char *thetitle)
+{
+ register int i;
+ int first = TRUE;
+ int limit;
+ HTLine *line;
+
+ if (!HTMainText)
+ return;
+
+ line = FirstHTLine(HTMainText);
+ fprintf(fp, "THE_URL:%s\n", thelink);
+ if (thetitle != NULL) {
+ fprintf(fp, "THE_TITLE:%s\n", thetitle);
+ }
+
+ for (;; line = line->next) {
+ if (!first && line->data[0] != LY_SOFT_NEWLINE)
+ fputc('\n', fp);
+ first = FALSE;
+ write_offset(fp, line);
+
+ /*
+ * Add data.
+ */
+ limit = TrimmedLength(line->data);
+ for (i = 0; i < limit; i++) {
+ int ch = UCH(line->data[i]);
+
+ if (!IsSpecialAttrChar(ch)) {
+ fputc(ch, fp);
+ } else if (ch == LY_SOFT_HYPHEN &&
+ (i + 1) >= limit) { /* last char on line */
+ write_hyphen(fp);
+ }
+ }
+
+ if (!HTMainText || (line == HTMainText->last_line)) {
+ break;
+ }
+ }
+ fputc('\n', fp);
+
+ /*
+ * Add the References list if appropriate
+ */
+ if ((no_list == FALSE) &&
+ (dump_links_inline == FALSE) &&
+ links_are_numbered()) {
+ printlist(fp, FALSE);
+ }
+#ifdef VMS
+ HadVMSInterrupt = FALSE;
+#endif /* VMS */
+}
+
+static void adjust_search_result(DocInfo *doc, int tentative_result,
+ int start_line)
+{
+ if (tentative_result > 0) {
+ int anch_line = -1;
+ TextAnchor *a;
+ int nl_closest = -1;
+ int goal = SEARCH_GOAL_LINE;
+ int max_offset;
+ BOOL on_screen = (BOOL) (tentative_result > HTMainText->top_of_screen &&
+ tentative_result <= HTMainText->top_of_screen +
+ display_lines);
+
+ if (goal < 1)
+ goal = 1;
+ else if (goal > display_lines)
+ goal = display_lines;
+ max_offset = goal - 1;
+
+ if (on_screen && nlinks > 0) {
+ int i;
+
+ for (i = 0; i < nlinks; i++) {
+ if (doc->line + links[i].ly - 1 <= tentative_result)
+ nl_closest = i;
+ if (doc->line + links[i].ly - 1 >= tentative_result)
+ break;
+ }
+ if (nl_closest >= 0 &&
+ doc->line + links[nl_closest].ly - 1 == tentative_result) {
+ www_search_result = doc->line;
+ doc->link = nl_closest;
+ return;
+ }
+ }
+
+ /* find last anchor before or on target line */
+ for (a = HTMainText->first_anchor;
+ a && a->line_num <= tentative_result - 1; a = a->next) {
+ anch_line = a->line_num + 1;
+ }
+ /* position such that the anchor found is on first screen line,
+ if it is not too far above the target line; but also try to
+ make sure we move forward. */
+ if (anch_line >= 0 &&
+ anch_line >= tentative_result - max_offset &&
+ (anch_line > start_line ||
+ tentative_result <= HTMainText->top_of_screen)) {
+ www_search_result = anch_line;
+ } else if (tentative_result - start_line > 0 &&
+ tentative_result - (start_line + 1) <= max_offset) {
+ www_search_result = start_line + 1;
+ } else if (tentative_result > HTMainText->top_of_screen &&
+ tentative_result <= start_line && /* have wrapped */
+ tentative_result <= HTMainText->top_of_screen + goal) {
+ www_search_result = HTMainText->top_of_screen + 1;
+ } else if (tentative_result <= goal)
+ www_search_result = 1;
+ else
+ www_search_result = tentative_result - max_offset;
+ if (www_search_result == doc->line) {
+ if (nl_closest >= 0) {
+ doc->link = nl_closest;
+ return;
+ }
+ }
+ }
+}
+
+/*
+ * see also link_has_target
+ */
+static BOOL anchor_has_target(TextAnchor *a, char *target)
+{
+ char *text = NULL;
+ const char *last = "?";
+ int count;
+
+ /*
+ * Combine the parts of the link's text using the highlighting information,
+ * and compare the target against that.
+ */
+ for (count = 0; count < 10; ++count) {
+ const char *part = LYGetHiTextStr(a, count);
+
+ if (part == NULL || part == last) {
+ if (text != NULL && LYno_attr_strstr(text, target)) {
+ return TRUE;
+ }
+ break;
+ }
+ StrAllocCat(text, part);
+ last = part;
+ }
+
+ return field_has_target(a->input_field, target);
+}
+
+static TextAnchor *line_num_to_anchor(int line_num)
+{
+ TextAnchor *a;
+
+ if (HTMainText != 0) {
+ a = HTMainText->first_anchor;
+ while (a != 0 && a->line_num < line_num) {
+ a = a->next;
+ }
+ } else {
+ a = 0;
+ }
+ return a;
+}
+
+static int line_num_in_text(HText *text, HTLine *line)
+{
+ int result = 1;
+ HTLine *temp = FirstHTLine(text);
+
+ while (temp != line) {
+ temp = temp->next;
+ ++result;
+ }
+ return result;
+}
+
+/* Computes the 'prev' pointers on demand, and returns the one for the given
+ * anchor.
+ */
+static TextAnchor *get_prev_anchor(TextAnchor *a)
+{
+ TextAnchor *p, *q;
+
+ if (a->prev == 0) {
+ if ((p = HTMainText->first_anchor) != 0) {
+ while ((q = p->next) != 0) {
+ q->prev = p;
+ p = q;
+ }
+ }
+ }
+ return a->prev;
+}
+
+static int www_search_forward(int start_line,
+ DocInfo *doc,
+ char *target,
+ HTLine *line,
+ int count)
+{
+ int wrapped = 0;
+ TextAnchor *a = line_num_to_anchor(count - 1);
+ int tentative_result = -1;
+
+ for (;;) {
+ while ((a != NULL) && a->line_num == (count - 1)) {
+ if (a->show_anchor &&
+ !(a->link_type == INPUT_ANCHOR
+ && a->input_field->type == F_HIDDEN_TYPE)) {
+ if (anchor_has_target(a, target)) {
+ adjust_search_result(doc, count, start_line);
+ return 1;
+ }
+ }
+ a = a->next;
+ }
+
+ if (LYno_attr_strstr(line->data, target)) {
+ tentative_result = count;
+ break;
+ } else if ((count == start_line && wrapped) || wrapped > 1) {
+ HTUserMsg2(STRING_NOT_FOUND, target);
+ return -1;
+ } else if (line == HTMainText->last_line) {
+ count = 0;
+ wrapped++;
+ a = HTMainText->first_anchor;
+ }
+ line = line->next;
+ count++;
+ }
+ if (tentative_result > 0) {
+ adjust_search_result(doc, tentative_result, start_line);
+ }
+ return 0;
+}
+
+static int www_search_backward(int start_line,
+ DocInfo *doc,
+ char *target,
+ HTLine *line,
+ int count)
+{
+ int wrapped = 0;
+ TextAnchor *a = line_num_to_anchor(count - 1);
+ int tentative_result = -1;
+
+ for (;;) {
+ while ((a != NULL) && a->line_num == (count - 1)) {
+ if (a->show_anchor &&
+ !(a->link_type == INPUT_ANCHOR
+ && a->input_field->type == F_HIDDEN_TYPE)) {
+ if (anchor_has_target(a, target)) {
+ adjust_search_result(doc, count, start_line);
+ return 1;
+ }
+ }
+ a = get_prev_anchor(a);
+ }
+
+ if (LYno_attr_strstr(line->data, target)) {
+ tentative_result = count;
+ break;
+ } else if ((count == start_line && wrapped) || wrapped > 1) {
+ HTUserMsg2(STRING_NOT_FOUND, target);
+ return -1;
+ } else if (line == FirstHTLine(HTMainText)) {
+ count = line_num_in_text(HTMainText, LastHTLine(HTMainText)) + 1;
+ wrapped++;
+ a = HTMainText->last_anchor;
+ }
+ line = line->prev;
+ count--;
+ }
+ if (tentative_result > 0) {
+ adjust_search_result(doc, tentative_result, start_line);
+ }
+ return 0;
+}
+
+void www_user_search(int start_line,
+ DocInfo *doc,
+ char *target,
+ int direction)
+{
+ HTLine *line;
+ int count;
+
+ if (!HTMainText) {
+ return;
+ }
+
+ /*
+ * Advance to the start line.
+ */
+ line = FirstHTLine(HTMainText);
+ if (start_line + direction > 0) {
+ for (count = 1;
+ count < start_line + direction;
+ line = line->next, count++) {
+ if (line == HTMainText->last_line) {
+ line = FirstHTLine(HTMainText);
+ count = 1;
+ break;
+ }
+ }
+ } else {
+ line = HTMainText->last_line;
+ count = line_num_in_text(HTMainText, line);
+ }
+
+ if (direction >= 0)
+ www_search_forward(start_line, doc, target, line, count);
+ else
+ www_search_backward(start_line, doc, target, line, count);
+}
+
+void user_message(const char *message,
+ const char *argument)
+{
+ if (message == NULL) {
+ mustshow = FALSE;
+ } else {
+ char *temp = NULL;
+
+ HTSprintf0(&temp, message, NonNull(argument));
+ statusline(temp);
+ FREE(temp);
+ }
+}
+
+/*
+ * HText_getOwner returns the owner of the
+ * current document.
+ */
+const char *HText_getOwner(void)
+{
+ return (HTMainText ?
+ HTAnchor_owner(HTMainText->node_anchor) : 0);
+}
+
+/*
+ * HText_setMainTextOwner sets the owner for the
+ * current document.
+ */
+void HText_setMainTextOwner(const char *owner)
+{
+ if (!HTMainText)
+ return;
+
+ HTAnchor_setOwner(HTMainText->node_anchor, owner);
+}
+
+/*
+ * HText_getRevTitle returns the RevTitle element of the
+ * current document, used as the subject for mailto comments
+ * to the owner.
+ */
+const char *HText_getRevTitle(void)
+{
+ return (HTMainText ?
+ HTAnchor_RevTitle(HTMainText->node_anchor) : 0);
+}
+
+/*
+ * HText_getContentBase returns the Content-Base header
+ * of the current document.
+ */
+const char *HText_getContentBase(void)
+{
+ return (HTMainText ?
+ HTAnchor_content_base(HTMainText->node_anchor) : 0);
+}
+
+/*
+ * HText_getContentLocation returns the Content-Location header
+ * of the current document.
+ */
+const char *HText_getContentLocation(void)
+{
+ return (HTMainText ?
+ HTAnchor_content_location(HTMainText->node_anchor) : 0);
+}
+
+/*
+ * HText_getMessageID returns the Message-ID of the
+ * current document.
+ */
+const char *HText_getMessageID(void)
+{
+ return (HTMainText ?
+ HTAnchor_messageID(HTMainText->node_anchor) : NULL);
+}
+
+void HTuncache_current_document(void)
+{
+ /*
+ * Should remove current document from memory.
+ */
+ if (HTMainText) {
+ HTParentAnchor *htmain_anchor = HTMainText->node_anchor;
+
+ if (htmain_anchor) {
+ if (!(HTOutputFormat && HTOutputFormat == WWW_SOURCE)) {
+ FREE(htmain_anchor->UCStages);
+ }
+ }
+ CTRACE((tfp, "\nHTuncache.. freeing document for '%s'%s\n",
+ ((htmain_anchor &&
+ htmain_anchor->address) ?
+ htmain_anchor->address : "unknown anchor"),
+ ((htmain_anchor &&
+ htmain_anchor->post_data)
+ ? " with POST data"
+ : "")));
+ HTList_removeObject(loaded_texts, HTMainText);
+ HText_free(HTMainText);
+ HTMainText = NULL;
+ } else {
+ CTRACE((tfp, "HTuncache.. HTMainText already is NULL!\n"));
+ }
+}
+
+/*
+ * This magic FREE(anchor->UCStages) call
+ * stolen from HTuncache_current_document() above.
+ */
+static void magicUncache(void)
+{
+ if (!(HTOutputFormat && HTOutputFormat == WWW_SOURCE)) {
+ FREE(HTMainAnchor->UCStages);
+ }
+ /* avoid null-reference later */
+ if (!HTOutputFormat)
+ HTOutputFormat = WWW_SOURCE;
+}
+
+#ifdef USE_SOURCE_CACHE
+
+/* dummy - kw */
+static HTProtocol scm =
+{
+ "source-cache-mem", 0, 0
+};
+
+static BOOLEAN useSourceCache(void)
+{
+ BOOLEAN result = FALSE;
+
+ if (LYCacheSource == SOURCE_CACHE_FILE) {
+ result = (BOOLEAN) (HTMainAnchor->source_cache_file != 0);
+ CTRACE((tfp, "SourceCache: file-cache%s found\n",
+ result ? "" : " not"));
+ }
+ return result;
+}
+
+static BOOLEAN useMemoryCache(void)
+{
+ BOOLEAN result = FALSE;
+
+ if (LYCacheSource == SOURCE_CACHE_MEMORY) {
+ result = (BOOLEAN) (HTMainAnchor->source_cache_chunk != 0);
+ CTRACE((tfp, "SourceCache: memory-cache%s found\n",
+ result ? "" : " not"));
+ }
+ return result;
+}
+
+BOOLEAN HTreparse_document(void)
+{
+ BOOLEAN ok = FALSE;
+
+ if (!HTMainAnchor || LYCacheSource == SOURCE_CACHE_NONE) {
+ CTRACE((tfp, "HTreparse_document returns FALSE\n"));
+ } else if (useSourceCache()) {
+ FILE *fp;
+ HTFormat format;
+ int ret;
+
+ CTRACE((tfp, "SourceCache: Reparsing file %s\n",
+ HTMainAnchor->source_cache_file));
+
+ magicUncache();
+
+ /*
+ * This is more or less copied out of HTLoadFile(), except we don't
+ * get a content encoding. This may be overkill. -dsb
+ */
+ if (HTMainAnchor->content_type) {
+ format = HTAtom_for(HTMainAnchor->content_type);
+ } else {
+ format = HTFileFormat(HTMainAnchor->source_cache_file, NULL, NULL);
+ format = HTCharsetFormat(format, HTMainAnchor,
+ UCLYhndl_for_unspec);
+ /* not UCLYhndl_HTFile_for_unspec - we are talking about remote
+ * documents...
+ */
+ }
+ CTRACE((tfp, " Content type is \"%s\"\n", format->name));
+
+ fp = fopen(HTMainAnchor->source_cache_file, "r");
+ if (!fp) {
+ CTRACE((tfp, " Cannot read file %s\n", HTMainAnchor->source_cache_file));
+ (void) LYRemoveTemp(HTMainAnchor->source_cache_file);
+ FREE(HTMainAnchor->source_cache_file);
+ } else {
+
+ if (HText_HaveUserChangedForms(HTMainText)) {
+ /*
+ * Issue a warning. Will not restore changed forms, currently.
+ */
+ HTAlert(RELOADING_FORM);
+ }
+ /* Set HTMainAnchor->protocol or HTMainAnchor->physical to convince
+ * the SourceCacheWriter to not regenerate the cache file (which
+ * would be an unnecessary "loop"). - kw
+ */
+ HTAnchor_setProtocol(HTMainAnchor, &HTFile);
+ ret = HTParseFile(format, HTOutputFormat, HTMainAnchor, fp, NULL);
+ LYCloseInput(fp);
+ if (ret == HT_PARTIAL_CONTENT) {
+ HTInfoMsg(gettext("Loading incomplete."));
+ CTRACE((tfp,
+ "SourceCache: `%s' has been accessed, partial content.\n",
+ HTLoadedDocumentURL()));
+ }
+ ok = (BOOL) (ret == HT_LOADED || ret == HT_PARTIAL_CONTENT);
+
+ CTRACE((tfp, "Reparse file %s\n", (ok ? "succeeded" : "failed")));
+ }
+ } else if (useMemoryCache()) {
+ HTFormat format = WWW_HTML;
+ int ret;
+
+ CTRACE((tfp, "SourceCache: Reparsing from memory chunk %p\n",
+ (void *) HTMainAnchor->source_cache_chunk));
+
+ magicUncache();
+
+ if (HTMainAnchor->content_type) {
+ format = HTAtom_for(HTMainAnchor->content_type);
+ } else {
+ /*
+ * This is only done to make things aligned with SOURCE_CACHE_NONE
+ * and SOURCE_CACHE_FILE when switching to source mode since the
+ * original document's charset will be LYPushAssumed() and then
+ * LYPopAssumed(). See LYK_SOURCE in mainloop if you change
+ * something here. No user-visible benefits, seems just '=' Info
+ * Page will show source's effective charset as "(assumed)".
+ */
+ format = HTCharsetFormat(format, HTMainAnchor,
+ UCLYhndl_for_unspec);
+ }
+ /* not UCLYhndl_HTFile_for_unspec - we are talking about remote documents... */
+
+ if (HText_HaveUserChangedForms(HTMainText)) {
+ /*
+ * Issue a warning. Will not restore changed forms, currently.
+ */
+ HTAlert(RELOADING_FORM);
+ }
+ /* Set HTMainAnchor->protocol or HTMainAnchor->physical to convince
+ * the SourceCacheWriter to not regenerate the cache chunk (which
+ * would be an unnecessary "loop"). - kw
+ */
+ HTAnchor_setProtocol(HTMainAnchor, &scm); /* cheating -
+ anything != &HTTP or &HTTPS would do - kw */
+ ret = HTParseMem(format, HTOutputFormat, HTMainAnchor,
+ HTMainAnchor->source_cache_chunk, NULL);
+ ok = (BOOL) (ret == HT_LOADED);
+
+ CTRACE((tfp, "Reparse memory %s\n", (ok ? "succeeded" : "failed")));
+ }
+
+ return ok;
+}
+
+BOOLEAN HTcan_reparse_document(void)
+{
+ BOOLEAN result = FALSE;
+
+ if (!HTMainAnchor || LYCacheSource == SOURCE_CACHE_NONE) {
+ result = FALSE;
+ } else if (useSourceCache()) {
+ result = LYCanReadFile(HTMainAnchor->source_cache_file);
+ } else if (useMemoryCache()) {
+ result = TRUE;
+ }
+
+ CTRACE((tfp, "HTcan_reparse_document -> %d\n", result));
+ return result;
+}
+
+static void trace_setting_change(const char *name,
+ int prev_setting,
+ int new_setting)
+{
+ if (prev_setting != new_setting)
+ CTRACE((tfp,
+ "HTdocument_settings_changed: %s setting has changed (was %d, now %d)\n",
+ name, prev_setting, new_setting));
+}
+
+BOOLEAN HTdocument_settings_changed(void)
+{
+ /*
+ * Annoying Hack(TM): If we don't have a source cache, we can't
+ * reparse anyway, so pretend the settings haven't changed.
+ */
+ if (!HTMainText || !HTcan_reparse_document())
+ return FALSE;
+
+ if (TRACE) {
+ /*
+ * If we're tracing, note everying that has changed.
+ */
+ trace_setting_change("CLICKABLE_IMAGES",
+ HTMainText->clickable_images, clickable_images);
+ trace_setting_change("PSEUDO_INLINE_ALTS",
+ HTMainText->pseudo_inline_alts,
+ pseudo_inline_alts);
+ trace_setting_change("VERBOSE_IMG",
+ HTMainText->verbose_img,
+ verbose_img);
+ trace_setting_change("RAW_MODE", HTMainText->raw_mode,
+ LYUseDefaultRawMode);
+ trace_setting_change("HISTORICAL_COMMENTS",
+ HTMainText->historical_comments,
+ historical_comments);
+ trace_setting_change("MINIMAL_COMMENTS",
+ HTMainText->minimal_comments, minimal_comments);
+ trace_setting_change("SOFT_DQUOTES",
+ HTMainText->soft_dquotes, soft_dquotes);
+ trace_setting_change("OLD_DTD", HTMainText->old_dtd, Old_DTD);
+ trace_setting_change("KEYPAD_MODE",
+ HTMainText->keypad_mode, keypad_mode);
+ if (HTMainText->disp_lines != LYlines || HTMainText->disp_cols != DISPLAY_COLS)
+ CTRACE((tfp,
+ "HTdocument_settings_changed: Screen size has changed (was %dx%d, now %dx%d)\n",
+ HTMainText->disp_cols,
+ HTMainText->disp_lines,
+ DISPLAY_COLS,
+ LYlines));
+ }
+
+ return (BOOLEAN) (HTMainText->clickable_images != clickable_images ||
+ HTMainText->pseudo_inline_alts != pseudo_inline_alts ||
+ HTMainText->verbose_img != verbose_img ||
+ HTMainText->raw_mode != LYUseDefaultRawMode ||
+ HTMainText->historical_comments != historical_comments ||
+ (HTMainText->minimal_comments != minimal_comments &&
+ !historical_comments) ||
+ HTMainText->soft_dquotes != soft_dquotes ||
+ HTMainText->old_dtd != Old_DTD ||
+ HTMainText->keypad_mode != keypad_mode ||
+ HTMainText->disp_cols != DISPLAY_COLS);
+}
+#endif
+
+int HTisDocumentSource(void)
+{
+ return (HTMainText != 0) ? HTMainText->source : FALSE;
+}
+
+const char *HTLoadedDocumentURL(void)
+{
+ if (!HTMainText)
+ return ("");
+
+ if (HTMainText->node_anchor && HTMainText->node_anchor->address)
+ return (HTMainText->node_anchor->address);
+ else
+ return ("");
+}
+
+bstring *HTLoadedDocumentPost_data(void)
+{
+ if (HTMainText
+ && HTMainText->node_anchor
+ && HTMainText->node_anchor->post_data)
+ return (HTMainText->node_anchor->post_data);
+ else
+ return (0);
+}
+
+const char *HTLoadedDocumentTitle(void)
+{
+ if (!HTMainText)
+ return ("");
+
+ if (HTMainText->node_anchor && HTMainText->node_anchor->title)
+ return (HTMainText->node_anchor->title);
+ else
+ return ("");
+}
+
+BOOLEAN HTLoadedDocumentIsHEAD(void)
+{
+ if (!HTMainText)
+ return (FALSE);
+
+ if (HTMainText->node_anchor && HTMainText->node_anchor->isHEAD)
+ return (HTMainText->node_anchor->isHEAD);
+ else
+ return (FALSE);
+}
+
+BOOLEAN HTLoadedDocumentIsSafe(void)
+{
+ if (!HTMainText)
+ return (FALSE);
+
+ if (HTMainText->node_anchor && HTMainText->node_anchor->safe)
+ return (HTMainText->node_anchor->safe);
+ else
+ return (FALSE);
+}
+
+const char *HTLoadedDocumentCharset(void)
+{
+ const char *result = NULL;
+
+ if (HTMainText &&
+ HTMainText->node_anchor) {
+ result = HTMainText->node_anchor->charset;
+ }
+
+ return result;
+}
+
+BOOL HTLoadedDocumentEightbit(void)
+{
+ if (!HTMainText)
+ return (NO);
+ else
+ return (HTMainText->have_8bit_chars);
+}
+
+void HText_setNodeAnchorBookmark(const char *bookmark)
+{
+ if (!HTMainText)
+ return;
+
+ if (HTMainText->node_anchor)
+ HTAnchor_setBookmark(HTMainText->node_anchor, bookmark);
+}
+
+const char *HTLoadedDocumentBookmark(void)
+{
+ if (!HTMainText)
+ return (NULL);
+
+ if (HTMainText->node_anchor && HTMainText->node_anchor->bookmark)
+ return (HTMainText->node_anchor->bookmark);
+ else
+ return (NULL);
+}
+
+int HText_LastLineSize(HText *text, int IgnoreSpaces)
+{
+ if (!text || !text->last_line || !text->last_line->size)
+ return 0;
+ return HText_TrueLineSize(text->last_line, text, IgnoreSpaces);
+}
+
+BOOL HText_LastLineEmpty(HText *text, int IgnoreSpaces)
+{
+ if (!text || !text->last_line || !text->last_line->size)
+ return TRUE;
+ return HText_TrueEmptyLine(text->last_line, text, IgnoreSpaces);
+}
+
+int HText_LastLineOffset(HText *text)
+{
+ if (!text || !text->last_line)
+ return 0;
+ return text->last_line->offset;
+}
+
+int HText_PreviousLineSize(HText *text, int IgnoreSpaces)
+{
+ HTLine *line;
+
+ if (!text || !text->last_line)
+ return 0;
+ if (!(line = text->last_line->prev))
+ return 0;
+ return HText_TrueLineSize(line, text, IgnoreSpaces);
+}
+
+BOOL HText_PreviousLineEmpty(HText *text, int IgnoreSpaces)
+{
+ HTLine *line;
+
+ if (!text || !text->last_line)
+ return TRUE;
+ if (!(line = text->last_line->prev))
+ return TRUE;
+ return HText_TrueEmptyLine(line, text, IgnoreSpaces);
+}
+
+/*
+ * Compute the "true" line size.
+ */
+static int HText_TrueLineSize(HTLine *line, HText *text, int IgnoreSpaces)
+{
+ size_t i;
+ int true_size = 0;
+
+ if (!(line && line->size))
+ return 0;
+
+ if (IgnoreSpaces) {
+ for (i = 0; i < line->size; i++) {
+ if (!IsSpecialAttrChar(UCH(line->data[i])) &&
+ IS_UTF8_EXTRA(line->data[i]) &&
+ !isspace(UCH(line->data[i])) &&
+ UCH(line->data[i]) != HT_NON_BREAK_SPACE &&
+ UCH(line->data[i]) != HT_EN_SPACE) {
+ true_size++;
+#ifdef EXP_WCWIDTH_SUPPORT
+ if (text && text->T.output_utf8 &&
+ IS_UTF_FIRST(line->data[i])) {
+ true_size += utfextracells(&(line->data[i]));
+ }
+#endif
+ }
+ }
+ } else {
+ for (i = 0; i < line->size; i++) {
+ if (!IsSpecialAttrChar(line->data[i]) &&
+ IS_UTF8_EXTRA(line->data[i])) {
+ true_size++;
+#ifdef EXP_WCWIDTH_SUPPORT
+ if (text && text->T.output_utf8 &&
+ IS_UTF_FIRST(line->data[i])) {
+ true_size += utfextracells(&(line->data[i]));
+ }
+#endif
+ }
+ }
+ }
+ return true_size;
+}
+
+/*
+ * Tell if the line is really empty. This is invoked much more often than
+ * HText_TrueLineSize(), and most lines are not empty. So it is faster to
+ * do this check than to check if the line size happens to be zero.
+ */
+static BOOL HText_TrueEmptyLine(HTLine *line, HText *text, int IgnoreSpaces)
+{
+ size_t i;
+
+ if (!(line && line->size))
+ return TRUE;
+
+ if (IgnoreSpaces) {
+ for (i = 0; i < line->size; i++) {
+ if (!IsSpecialAttrChar(UCH(line->data[i])) &&
+ IS_UTF8_EXTRA(line->data[i]) &&
+ !isspace(UCH(line->data[i])) &&
+ UCH(line->data[i]) != HT_NON_BREAK_SPACE &&
+ UCH(line->data[i]) != HT_EN_SPACE) {
+ return FALSE;
+ }
+ }
+ } else {
+ for (i = 0; i < line->size; i++) {
+ if (!IsSpecialAttrChar(line->data[i]) &&
+ IS_UTF8_EXTRA(line->data[i])) {
+ return FALSE;
+ }
+ }
+ }
+ return TRUE;
+}
+
+void HText_NegateLineOne(HText *text)
+{
+ if (text) {
+ text->in_line_1 = NO;
+ }
+ return;
+}
+
+BOOL HText_inLineOne(HText *text)
+{
+ if (text) {
+ return text->in_line_1;
+ }
+ return YES;
+}
+
+/*
+ * This function is for removing the first of two
+ * successive blank lines. It should be called after
+ * checking the situation with HText_LastLineSize()
+ * and HText_PreviousLineSize(). Any characters in
+ * the removed line (i.e., control characters, or it
+ * wouldn't have tested blank) should have been
+ * reiterated by split_line() in the retained blank
+ * line. -FM
+ */
+void HText_RemovePreviousLine(HText *text)
+{
+ HTLine *line, *previous;
+
+ if (!(text && text->Lines > 1))
+ return;
+
+ line = text->last_line->prev;
+ previous = line->prev;
+ previous->next = text->last_line;
+ text->last_line->prev = previous;
+ text->Lines--;
+ freeHTLine(text, line);
+}
+
+/*
+ * NOTE: This function presently is correct only if the
+ * alignment is HT_LEFT. The offset is still zero,
+ * because that's not determined for HT_CENTER or
+ * HT_RIGHT until subsequent characters are received
+ * and split_line() is called. -FM
+ */
+int HText_getCurrentColumn(HText *text)
+{
+ int column = 0;
+ BOOL IgnoreSpaces = FALSE;
+
+ if (text) {
+ column = ((text->in_line_1
+ ? (int) text->style->indent1st
+ : (int) text->style->leftIndent)
+ + (int) text->last_line->offset
+ + HText_LastLineSize(text, IgnoreSpaces));
+ }
+ return column;
+}
+
+int HText_getMaximumColumn(HText *text)
+{
+ int column = DISPLAY_COLS;
+
+ if (text) {
+ column -= (int) text->style->rightIndent;
+ }
+ return column;
+}
+
+/*
+ * NOTE: This function uses HText_getCurrentColumn() which
+ * presently is correct only if the alignment is
+ * HT_LEFT. -FM
+ */
+void HText_setTabID(HText *text, const char *name)
+{
+ HTTabID *Tab = NULL;
+ HTList *cur = text->tabs;
+ HTList *last = NULL;
+
+ if (!text || isEmpty(name))
+ return;
+
+ if (!cur) {
+ cur = text->tabs = HTList_new();
+ } else {
+ while (NULL != (Tab = (HTTabID *) HTList_nextObject(cur))) {
+ if (Tab->name && !strcmp(Tab->name, name))
+ return; /* Already set. Keep the first value. */
+ last = cur;
+ }
+ if (last)
+ cur = last;
+ }
+ if (!Tab) { /* New name. Create a new node */
+ Tab = typecalloc(HTTabID);
+ if (Tab == NULL)
+ outofmem(__FILE__, "HText_setTabID");
+ HTList_addObject(cur, Tab);
+ StrAllocCopy(Tab->name, name);
+ }
+
+ Tab->column = HText_getCurrentColumn(text);
+ return;
+}
+
+int HText_getTabIDColumn(HText *text, const char *name)
+{
+ int column = 0;
+ HTTabID *Tab;
+ HTList *cur = text->tabs;
+
+ if (text && non_empty(name) && cur) {
+ while (NULL != (Tab = (HTTabID *) HTList_nextObject(cur))) {
+ if (Tab->name && !strcmp(Tab->name, name))
+ break;
+ }
+ if (Tab)
+ column = Tab->column;
+ }
+ return column;
+}
+
+/*
+ * This function is for saving the address of a link
+ * which had an attribute in the markup that resolved
+ * to a URL (i.e., not just a NAME or ID attribute),
+ * but was found in HText_endAnchor() to have no visible
+ * content for use as a link name. It loads the address
+ * into text->hidden_links, whose count can be determined
+ * via HText_HiddenLinks(), below. The addresses can be
+ * retrieved via HText_HiddenLinkAt(), below, based on
+ * count. -FM
+ */
+static void HText_AddHiddenLink(HText *text, TextAnchor *textanchor)
+{
+ HTAnchor *dest;
+
+ /*
+ * Make sure we have an HText structure and anchor. -FM
+ */
+ if (!(text && textanchor && textanchor->anchor))
+ return;
+
+ /*
+ * Create the hidden links list
+ * if it hasn't been already. -FM
+ */
+ if (text->hidden_links == NULL)
+ text->hidden_links = HTList_new();
+
+ /*
+ * Store the address, in reverse list order
+ * so that first in will be first out on
+ * retrievals. -FM
+ */
+ if ((dest = HTAnchor_followLink(textanchor->anchor)) &&
+ (text->hiddenlinkflag != HIDDENLINKS_IGNORE ||
+ HTList_isEmpty(text->hidden_links))) {
+ char *value = HTAnchor_address(dest);
+ BOOL ignore = FALSE;
+
+ if (unique_urls) {
+ int cnt;
+ char *check;
+
+ for (cnt = 0;; ++cnt) {
+
+ check = (char *) HTList_objectAt(text->hidden_links, cnt);
+ if (check == 0)
+ break;
+ if (!strcmp(check, value)) {
+ ignore = TRUE;
+ break;
+ }
+ }
+ }
+ if (ignore) {
+ FREE(value);
+ } else {
+ HTList_appendObject(text->hidden_links, value);
+ }
+ }
+
+ return;
+}
+
+/*
+ * This function returns the number of addresses
+ * that are loaded in text->hidden_links. -FM
+ */
+int HText_HiddenLinkCount(HText *text)
+{
+ int count = 0;
+
+ if (text && text->hidden_links)
+ count = HTList_count((HTList *) text->hidden_links);
+
+ return (count);
+}
+
+/*
+ * This function returns the address, corresponding to
+ * a hidden link, at the position (zero-based) in the
+ * text->hidden_links list of the number argument. -FM
+ */
+const char *HText_HiddenLinkAt(HText *text, int number)
+{
+ char *href = NULL;
+
+ if (text && text->hidden_links && number >= 0)
+ href = (char *) HTList_objectAt((HTList *) text->hidden_links, number);
+
+ return (href);
+}
+
+/*
+ * Form methods
+ * These routines are used to build forms consisting
+ * of input fields
+ */
+static BOOLEAN HTFormDisabled = FALSE;
+static PerFormInfo *HTCurrentForm;
+
+static BOOLEAN addFormAction(FormInfo * f)
+{
+ BOOLEAN result = FALSE;
+
+ if (HTCurrentForm != NULL) {
+ result = TRUE;
+ f->submit_action = NULL;
+ StrAllocCopy(f->submit_action, HTCurrentForm->data.submit_action);
+ if (HTCurrentForm->data.submit_enctype != NULL)
+ StrAllocCopy(f->submit_enctype, HTCurrentForm->data.submit_enctype);
+ if (HTCurrentForm->data.submit_title != NULL)
+ StrAllocCopy(f->submit_title, HTCurrentForm->data.submit_title);
+ f->submit_method = HTCurrentForm->data.submit_method;
+ }
+ return result;
+}
+
+void HText_beginForm(char *action,
+ char *method,
+ char *enctype,
+ char *title,
+ const char *accept_cs)
+{
+ PerFormInfo *newform;
+ int HTFormMethod = URL_GET_METHOD;
+ char *HTFormAction = NULL;
+ char *HTFormEnctype = NULL;
+ char *HTFormTitle = NULL;
+ char *HTFormAcceptCharset = NULL;
+
+ HTFormNumber++;
+
+ HTFormFields = 0;
+ HTFormDisabled = FALSE;
+
+ /*
+ * Check the ACTION. -FM
+ */
+ if (action != NULL) {
+ if (isMAILTO_URL(action)) {
+ HTFormMethod = URL_MAIL_METHOD;
+ }
+ StrAllocCopy(HTFormAction, action);
+ } else
+ StrAllocCopy(HTFormAction, HTLoadedDocumentURL());
+
+ /*
+ * Check the METHOD. -FM
+ */
+ if (method != NULL && HTFormMethod != URL_MAIL_METHOD)
+ if (!strcasecomp(method, "post") || !strcasecomp(method, "pget"))
+ HTFormMethod = URL_POST_METHOD;
+
+ /*
+ * Check the ENCTYPE. -FM
+ */
+ if (non_empty(enctype)) {
+ StrAllocCopy(HTFormEnctype, enctype);
+ if (HTFormMethod != URL_MAIL_METHOD &&
+ !strncasecomp(enctype, "multipart/form-data", 19))
+ HTFormMethod = URL_POST_METHOD;
+ } else {
+ FREE(HTFormEnctype);
+ }
+
+ /*
+ * Check the TITLE. -FM
+ */
+ if (non_empty(title))
+ StrAllocCopy(HTFormTitle, title);
+ else
+ FREE(HTFormTitle);
+
+ /*
+ * Check for an ACCEPT_CHARSET. If present, store it and
+ * convert to lowercase and collapse spaces. - kw
+ */
+ if (accept_cs != NULL) {
+ StrAllocCopy(HTFormAcceptCharset, accept_cs);
+ LYRemoveBlanks(HTFormAcceptCharset);
+ LYLowerCase(HTFormAcceptCharset);
+ }
+
+ /*
+ * Create a new "PerFormInfo" structure to hold info on the current form.
+ * This will be appended to the forms list kept by the HText object if and
+ * when we reach a HText_endForm.
+ */
+ newform = typecalloc(PerFormInfo);
+ if (newform == NULL)
+ outofmem(__FILE__, "HText_beginForm");
+
+ PerFormInfo_free(HTCurrentForm); /* shouldn't happen here - kw */
+ HTCurrentForm = newform;
+
+ newform->number = HTFormNumber;
+ newform->data.submit_action = HTFormAction;
+ newform->data.submit_enctype = HTFormEnctype;
+ newform->data.submit_method = HTFormMethod;
+ newform->data.submit_title = HTFormTitle;
+ newform->accept_cs = HTFormAcceptCharset;
+
+ CTRACE((tfp, "BeginForm: action:%s Method:%d%s%s%s%s%s%s\n",
+ HTFormAction, HTFormMethod,
+ (HTFormTitle ? " Title:" : ""),
+ NonNull(HTFormTitle),
+ (HTFormEnctype ? " Enctype:" : ""),
+ NonNull(HTFormEnctype),
+ (HTFormAcceptCharset ? " Accept-charset:" : ""),
+ NonNull(HTFormAcceptCharset)));
+}
+
+void HText_endForm(HText *text)
+{
+ if (text != NULL) {
+ if (HTFormFields == 1 && text->first_anchor) {
+ /*
+ * Support submission of a single text input field in
+ * the form via <return> instead of a submit button. -FM
+ */
+ TextAnchor *a;
+
+ /*
+ * Go through list of anchors and get our input field. -FM
+ */
+ for (a = text->first_anchor; a != NULL; a = a->next) {
+ if (a->link_type == INPUT_ANCHOR &&
+ a->input_field->number == HTFormNumber &&
+ a->input_field->type != F_TEXTAREA_TYPE &&
+ F_TEXTLIKE(a->input_field->type)) {
+ /*
+ * Got it. Make it submitting. -FM
+ */
+ if (addFormAction(a->input_field)) {
+ a->input_field->type = F_TEXT_SUBMIT_TYPE;
+ if (HTFormDisabled)
+ a->input_field->disabled = TRUE;
+ }
+ break;
+ }
+ }
+ }
+
+ /*
+ * Append info on the current form to the HText object's list of forms.
+ * HText_beginInput call will have set some of the data in the
+ * PerFormInfo structure (if there were any form fields at all).
+ */
+ if (HTCurrentForm) {
+ if (HTFormDisabled)
+ HTCurrentForm->disabled = TRUE;
+ if (!text->forms)
+ text->forms = HTList_new();
+ HTList_appendObject(text->forms, HTCurrentForm);
+ HTCurrentForm = NULL;
+ } else {
+ CTRACE((tfp, "endForm: HTCurrentForm is missing!\n"));
+ }
+ } else {
+ CTRACE((tfp, "endForm: HText is missing!\n"));
+ }
+
+ FREE(HTCurSelectGroup);
+ FREE(HTCurSelectGroupSize);
+ FREE(HTCurSelectedOptionValue);
+ HTFormFields = 0;
+ HTFormDisabled = FALSE;
+}
+
+void HText_beginSelect(char *name,
+ int name_cs,
+ int multiple,
+ char *size)
+{
+ /*
+ * Save the group name.
+ */
+ StrAllocCopy(HTCurSelectGroup, name);
+ HTCurSelectGroupCharset = name_cs;
+
+ /*
+ * If multiple then all options are actually checkboxes.
+ */
+ if (multiple)
+ HTCurSelectGroupType = F_CHECKBOX_TYPE;
+ /*
+ * If not multiple then all options are radio buttons.
+ */
+ else
+ HTCurSelectGroupType = F_RADIO_TYPE;
+
+ /*
+ * Length of an option list.
+ */
+ StrAllocCopy(HTCurSelectGroupSize, size);
+
+ CTRACE((tfp, "HText_beginSelect: name=%s type=%d size=%s\n",
+ ((HTCurSelectGroup == NULL) ?
+ "<NULL>" : HTCurSelectGroup),
+ HTCurSelectGroupType,
+ ((HTCurSelectGroupSize == NULL) ?
+ "<NULL>" : HTCurSelectGroupSize)));
+ CTRACE((tfp, "HText_beginSelect: name_cs=%d \"%s\"\n",
+ HTCurSelectGroupCharset,
+ (HTCurSelectGroupCharset >= 0 ?
+ LYCharSet_UC[HTCurSelectGroupCharset].MIMEname : "<UNKNOWN>")));
+}
+
+/*
+ * This function returns the number of the option whose
+ * value currently is being accumulated for a select
+ * block. - LE && FM
+ */
+int HText_getOptionNum(HText *text)
+{
+ TextAnchor *a;
+ OptionType *op;
+ int n = 1; /* start count at 1 */
+
+ if (!(text && text->last_anchor))
+ return (0);
+
+ a = text->last_anchor;
+ if (!(a->link_type == INPUT_ANCHOR && a->input_field &&
+ a->input_field->type == F_OPTION_LIST_TYPE))
+ return (0);
+
+ for (op = a->input_field->select_list; op; op = op->next)
+ n++;
+ CTRACE((tfp, "HText_getOptionNum: Got number '%d'.\n", n));
+ return (n);
+}
+
+/*
+ * This function checks for a numbered option pattern
+ * as the prefix for an option value. If present, and
+ * we are in the correct keypad mode, it returns a
+ * pointer to the actual value, following that prefix.
+ * Otherwise, it returns the original pointer.
+ */
+static char *HText_skipOptionNumPrefix(char *opname)
+{
+ /*
+ * Check if we are in the correct keypad mode.
+ */
+ if (fields_are_numbered()) {
+ /*
+ * Skip the option number embedded in the option name so the
+ * extra chars won't mess up cgi scripts processing the value.
+ * The format is (nnn)__ where nnn is a number and there is a
+ * minimum of 5 chars (no underscores if (nnn) exceeds 5 chars).
+ * See HTML.c. If the chars don't exactly match this format,
+ * just use all of opname. - LE
+ */
+ char *cp = opname;
+
+ if ((non_empty(cp) && *cp++ == '(') &&
+ *cp && isdigit(UCH(*cp++))) {
+ while (*cp && isdigit(UCH(*cp)))
+ ++cp;
+ if (*cp && *cp++ == ')') {
+ int i = (int) (cp - opname);
+
+ while (i < 5) {
+ if (*cp != '_')
+ break;
+ i++;
+ cp++;
+ }
+ if (i < 5) {
+ cp = opname;
+ }
+ } else {
+ cp = opname;
+ }
+ } else {
+ cp = opname;
+ }
+ return (cp);
+ }
+
+ return (opname);
+}
+
+/*
+ * We couldn't set the value field for the previous option tag so we have to do
+ * it now. Assume that the last anchor was the previous options' tag.
+ */
+char *HText_setLastOptionValue(HText *text, char *value,
+ char *submit_value,
+ int order,
+ int checked,
+ int val_cs,
+ int submit_val_cs)
+{
+ char *cp, *cp1;
+ char *ret_Value = NULL;
+ unsigned char *tmp = NULL;
+ int number = 0, i, j;
+
+ if (!(value
+ && text
+ && text->last_anchor
+ && text->last_anchor->input_field
+ && text->last_anchor->link_type == INPUT_ANCHOR)) {
+ CTRACE((tfp, "HText_setLastOptionValue: invalid call! value:%s!\n",
+ (value ? value : "<NULL>")));
+ return NULL;
+ }
+
+ CTRACE((tfp,
+ "Entering HText_setLastOptionValue: value:\"%s\", checked:%s\n",
+ value, (checked ? "on" : "off")));
+
+ /*
+ * Strip end spaces, newline is also whitespace.
+ */
+ if (*value) {
+ cp = &value[strlen(value) - 1];
+ while ((cp >= value) && (isspace(UCH(*cp)) ||
+ IsSpecialAttrChar(UCH(*cp))))
+ cp--;
+ *(cp + 1) = '\0';
+ }
+
+ /*
+ * Find first non space
+ */
+ cp = value;
+ while (isspace(UCH(*cp)) ||
+ IsSpecialAttrChar(UCH(*cp)))
+ cp++;
+ if (HTCurSelectGroupType == F_RADIO_TYPE &&
+ LYSelectPopups &&
+ fields_are_numbered()) {
+ /*
+ * Collapse any space between the popup option
+ * prefix and actual value. -FM
+ */
+ if ((cp1 = HText_skipOptionNumPrefix(cp)) > cp) {
+ i = 0, j = (int) (cp1 - cp);
+ while (isspace(UCH(cp1[i])) ||
+ IsSpecialAttrChar(UCH(cp1[i]))) {
+ i++;
+ }
+ if (i > 0) {
+ while (cp1[i] != '\0')
+ cp[j++] = cp1[i++];
+ cp[j] = '\0';
+ }
+ }
+ }
+
+ if (HTCurSelectGroupType == F_CHECKBOX_TYPE) {
+ StrAllocCopy(text->last_anchor->input_field->value, cp);
+ text->last_anchor->input_field->value_cs = val_cs;
+ /*
+ * Put the text on the screen as well.
+ */
+ HText_appendText(text, cp);
+
+ } else if (LYSelectPopups == FALSE) {
+ StrAllocCopy(text->last_anchor->input_field->value,
+ (submit_value ? submit_value : cp));
+ text->last_anchor->input_field->value_cs = (submit_value ?
+ submit_val_cs : val_cs);
+ /*
+ * Put the text on the screen as well.
+ */
+ HText_appendText(text, cp);
+
+ } else {
+ /*
+ * Create a linked list of option values.
+ */
+ OptionType *op_ptr = text->last_anchor->input_field->select_list;
+ OptionType *new_ptr = NULL;
+ BOOLEAN first_option = FALSE;
+
+ /*
+ * Deal with newlines or tabs.
+ */
+ LYReduceBlanks(value);
+
+ if (!op_ptr) {
+ /*
+ * No option items yet.
+ */
+ if (text->last_anchor->input_field->type != F_OPTION_LIST_TYPE) {
+ CTRACE((tfp,
+ "HText_setLastOptionValue: last input_field not F_OPTION_LIST_TYPE (%d)\n",
+ F_OPTION_LIST_TYPE));
+ CTRACE((tfp, " but %d, ignoring!\n",
+ text->last_anchor->input_field->type));
+ return NULL;
+ }
+
+ new_ptr = typecalloc(OptionType);
+ if (new_ptr == NULL)
+ outofmem(__FILE__, "HText_setLastOptionValue");
+
+ text->last_anchor->input_field->select_list = new_ptr;
+ first_option = TRUE;
+ } else {
+ while (op_ptr->next) {
+ number++;
+ op_ptr = op_ptr->next;
+ }
+ number++; /* add one more */
+
+ op_ptr->next = new_ptr = typecalloc(OptionType);
+ if (new_ptr == NULL)
+ outofmem(__FILE__, "HText_setLastOptionValue");
+ }
+
+ new_ptr->name = NULL;
+ new_ptr->cp_submit_value = NULL;
+ new_ptr->next = NULL;
+ /*
+ * Find first non-space again, convert_to_spaces above may have
+ * changed the string. - kw
+ */
+ cp = value;
+ while (isspace(UCH(*cp)) ||
+ IsSpecialAttrChar(UCH(*cp)))
+ cp++;
+ for (i = 0, j = 0; cp[i]; i++) {
+ if (cp[i] == HT_NON_BREAK_SPACE ||
+ cp[i] == HT_EN_SPACE) {
+ cp[j++] = ' ';
+ } else if (cp[i] != LY_SOFT_HYPHEN &&
+ !IsSpecialAttrChar(UCH(cp[i]))) {
+ cp[j++] = cp[i];
+ }
+ }
+ cp[j] = '\0';
+ if (IS_CJK_TTY) {
+ if ((tmp = typecallocn(unsigned char, strlen(cp) * 2 + 1)) != 0) {
+ if (kanji_code == EUC) {
+ TO_EUC((unsigned char *) cp, tmp);
+ val_cs = current_char_set;
+ } else if (kanji_code == SJIS) {
+ TO_SJIS((unsigned char *) cp, tmp);
+ val_cs = current_char_set;
+ } else {
+ for (i = 0, j = 0; cp[i]; i++) {
+ if (cp[i] != CH_ESC) { /* S/390 -- gil -- 1604 */
+ tmp[j++] = UCH(cp[i]);
+ }
+ }
+ }
+ StrAllocCopy(new_ptr->name, (const char *) tmp);
+ FREE(tmp);
+ } else {
+ outofmem(__FILE__, "HText_setLastOptionValue");
+ }
+ } else {
+ StrAllocCopy(new_ptr->name, cp);
+ }
+ StrAllocCopy(new_ptr->cp_submit_value,
+ (submit_value ? submit_value :
+ HText_skipOptionNumPrefix(new_ptr->name)));
+ new_ptr->value_cs = (submit_value ? submit_val_cs : val_cs);
+
+ if (first_option) {
+ FormInfo *last_input = text->last_anchor->input_field;
+
+ StrAllocCopy(HTCurSelectedOptionValue, new_ptr->name);
+ last_input->num_value = 0;
+ /*
+ * If this is the first option in a popup select list,
+ * HText_beginInput may have allocated the value and
+ * cp_submit_value fields, so free them now to avoid
+ * a memory leak. - kw
+ */
+ FREE(last_input->value);
+ FREE(last_input->cp_submit_value);
+
+ last_input->value = last_input->select_list->name;
+ last_input->orig_value = last_input->select_list->name;
+ last_input->cp_submit_value = last_input->select_list->cp_submit_value;
+ last_input->orig_submit_value = last_input->select_list->cp_submit_value;
+ last_input->value_cs = new_ptr->value_cs;
+ } else {
+ int newlen = (int) strlen(new_ptr->name);
+ int curlen = (int) (HTCurSelectedOptionValue
+ ? strlen(HTCurSelectedOptionValue)
+ : 0);
+
+ /*
+ * Make the selected Option Value as long as
+ * the longest option.
+ */
+ if (newlen > curlen)
+ StrAllocCat(HTCurSelectedOptionValue,
+ UNDERSCORES(newlen - curlen));
+ }
+
+ if (checked) {
+ int curlen = (int) strlen(new_ptr->name);
+ int newlen = (HTCurSelectedOptionValue
+ ? (int) strlen(HTCurSelectedOptionValue)
+ : 0);
+ FormInfo *last_input = text->last_anchor->input_field;
+
+ /*
+ * Set the default option as this one.
+ */
+ last_input->num_value = number;
+ last_input->value = new_ptr->name;
+ last_input->orig_value = new_ptr->name;
+ last_input->cp_submit_value = new_ptr->cp_submit_value;
+ last_input->orig_submit_value = new_ptr->cp_submit_value;
+ last_input->value_cs = new_ptr->value_cs;
+ StrAllocCopy(HTCurSelectedOptionValue, new_ptr->name);
+ if (newlen > curlen)
+ StrAllocCat(HTCurSelectedOptionValue,
+ UNDERSCORES(newlen - curlen));
+ }
+
+ /*
+ * Return the selected Option value to be sent to the screen.
+ */
+ if (order == LAST_ORDER) {
+ /*
+ * Change the value.
+ */
+ if (HTCurSelectedOptionValue == 0)
+ StrAllocCopy(HTCurSelectedOptionValue, "");
+ text->last_anchor->input_field->size =
+ (int) strlen(HTCurSelectedOptionValue);
+ ret_Value = HTCurSelectedOptionValue;
+ }
+ }
+
+ if (TRACE) {
+ CTRACE((tfp, "HText_setLastOptionValue:%s value=\"%s\"\n",
+ (order == LAST_ORDER) ? " LAST_ORDER" : "",
+ value));
+ CTRACE((tfp, " val_cs=%d \"%s\"",
+ val_cs,
+ (val_cs >= 0 ?
+ LYCharSet_UC[val_cs].MIMEname : "<UNKNOWN>")));
+ if (submit_value) {
+ CTRACE((tfp, " (submit_val_cs %d \"%s\") submit_value%s=\"%s\"\n",
+ submit_val_cs,
+ (submit_val_cs >= 0 ?
+ LYCharSet_UC[submit_val_cs].MIMEname : "<UNKNOWN>"),
+ (HTCurSelectGroupType == F_CHECKBOX_TYPE) ?
+ "(ignored)" : "",
+ submit_value));
+ } else {
+ CTRACE((tfp, "\n"));
+ }
+ }
+ return (ret_Value);
+}
+
+/*
+ * Assign a form input anchor.
+ * Returns the number of characters to leave
+ * blank so that the input field can fit.
+ */
+int HText_beginInput(HText *text,
+ int underline,
+ InputFieldData * I)
+{
+ TextAnchor *a;
+ FormInfo *f;
+ const char *cp_option = NULL;
+ char *IValue = NULL;
+ unsigned char *tmp = NULL;
+ int i, j;
+ int adjust_marker = 0;
+ int MaximumSize;
+ char marker[16];
+
+ CTRACE((tfp, "GridText: Entering HText_beginInput type=%s\n", NonNull(I->type)));
+
+ POOLtypecalloc(TextAnchor, a);
+
+ POOLtypecalloc(FormInfo, f);
+ if (a == NULL || f == NULL)
+ outofmem(__FILE__, "HText_beginInput");
+
+ a->sgml_offset = SGML_offset();
+ a->inUnderline = (BOOLEAN) underline;
+ a->line_num = text->Lines;
+ a->line_pos = (short) text->last_line->size;
+
+ /*
+ * If this is a radio button, or an OPTION we're converting
+ * to a radio button, and it's the first with this name, make
+ * sure it's checked by default. Otherwise, if it's checked,
+ * uncheck the default or any preceding radio button with this
+ * name that was checked. -FM
+ */
+ if (I->type != NULL && !strcmp(I->type, "OPTION") &&
+ HTCurSelectGroupType == F_RADIO_TYPE && LYSelectPopups == FALSE) {
+ I->type = "RADIO";
+ I->name = HTCurSelectGroup;
+ I->name_cs = HTCurSelectGroupCharset;
+ }
+ if (I->name && I->type && !strcasecomp(I->type, "radio")) {
+ if (!text->last_anchor) {
+ I->checked = TRUE;
+ } else {
+ TextAnchor *b;
+ int i2 = 0;
+
+ for (b = text->first_anchor; b != NULL; b = b->next) {
+ if (b->link_type == INPUT_ANCHOR &&
+ b->input_field->type == F_RADIO_TYPE &&
+ b->input_field->number == HTFormNumber) {
+ if (!strcmp(b->input_field->name, I->name)) {
+ if (I->checked && b->input_field->num_value) {
+ b->input_field->num_value = 0;
+ StrAllocCopy(b->input_field->orig_value, "0");
+ break;
+ }
+ i2++;
+ }
+ }
+ }
+ if (i2 == 0)
+ I->checked = TRUE;
+ }
+ }
+
+ a->next = 0;
+ a->anchor = NULL;
+ a->link_type = INPUT_ANCHOR;
+ a->show_anchor = YES;
+
+ LYClearHiText(a);
+ a->extent = 2;
+
+ a->input_field = f;
+
+ f->select_list = 0;
+ f->number = HTFormNumber;
+ f->disabled = HTFormDisabled || I->disabled;
+ f->readonly = I->readonly;
+ f->no_cache = NO;
+
+ HTFormFields++;
+
+ /*
+ * Set up VALUE.
+ */
+ if (I->value) {
+ StrAllocCopy(IValue, I->value);
+ }
+ if (IValue &&
+ IS_CJK_TTY &&
+ ((I->type == NULL) || strcasecomp(I->type, "hidden"))) {
+ if ((tmp = typecallocn(unsigned char, strlen(IValue) * 2 + 1)) != 0) {
+ if (kanji_code == EUC) {
+ TO_EUC((unsigned char *) IValue, tmp);
+ I->value_cs = current_char_set;
+ } else if (kanji_code == SJIS) {
+ TO_SJIS((unsigned char *) IValue, tmp);
+ I->value_cs = current_char_set;
+ } else {
+ for (i = 0, j = 0; IValue[i]; i++) {
+ if (IValue[i] != CH_ESC) { /* S/390 -- gil -- 1621 */
+ tmp[j++] = UCH(IValue[i]);
+ }
+ }
+ }
+ StrAllocCopy(IValue, (const char *) tmp);
+ FREE(tmp);
+ }
+ }
+
+ /*
+ * Special case of OPTION.
+ * Is handled above if radio type and LYSelectPopups is FALSE.
+ */
+ /* set the values and let the parsing below do the work */
+ if (I->type != NULL && !strcmp(I->type, "OPTION")) {
+ cp_option = I->type;
+ if (HTCurSelectGroupType == F_RADIO_TYPE)
+ I->type = "OPTION_LIST";
+ else
+ I->type = "CHECKBOX";
+ I->name = HTCurSelectGroup;
+ I->name_cs = HTCurSelectGroupCharset;
+
+ /*
+ * The option's size parameter actually gives the length and not
+ * the width of the list. Perform the conversion here
+ * and get rid of the allocated HTCurSelect....
+ * 0 is ok as it means any length (arbitrary decision).
+ */
+ if (HTCurSelectGroupSize != NULL) {
+ f->size_l = atoi(HTCurSelectGroupSize);
+ FREE(HTCurSelectGroupSize);
+ }
+ }
+
+ /*
+ * Set SIZE.
+ */
+ if (I->size != 0) {
+ f->size = I->size;
+ /*
+ * Leave at zero for option lists.
+ */
+ if (f->size == 0 && cp_option == NULL) {
+ f->size = 20; /* default */
+ }
+ } else {
+ f->size = 20; /* default */
+ }
+
+ /*
+ * Set MAXLENGTH.
+ */
+ if (I->maxlength != NULL) {
+ f->maxlength = (unsigned) atoi(I->maxlength);
+ } else {
+ f->maxlength = 0; /* 0 means infinite */
+ }
+
+ /*
+ * Set CHECKED
+ * (num_value is only relevant to check and radio types).
+ */
+ if (I->checked == TRUE)
+ f->num_value = 1;
+ else
+ f->num_value = 0;
+
+ /*
+ * Set TYPE.
+ */
+ if (I->type != NULL) {
+ if (!strcasecomp(I->type, "password")) {
+ f->type = F_PASSWORD_TYPE;
+ } else if (!strcasecomp(I->type, "checkbox")) {
+ f->type = F_CHECKBOX_TYPE;
+ } else if (!strcasecomp(I->type, "radio")) {
+ f->type = F_RADIO_TYPE;
+ } else if (!strcasecomp(I->type, "submit")) {
+ f->type = F_SUBMIT_TYPE;
+ } else if (!strcasecomp(I->type, "image")) {
+ f->type = F_IMAGE_SUBMIT_TYPE;
+ } else if (!strcasecomp(I->type, "reset")) {
+ f->type = F_RESET_TYPE;
+ } else if (!strcasecomp(I->type, "OPTION_LIST")) {
+ f->type = F_OPTION_LIST_TYPE;
+ } else if (!strcasecomp(I->type, "hidden")) {
+ f->type = F_HIDDEN_TYPE;
+ HTFormFields--;
+ f->size = 0;
+ } else if (!strcasecomp(I->type, "textarea")) {
+ f->type = F_TEXTAREA_TYPE;
+ } else if (!strcasecomp(I->type, "range")) {
+ f->type = F_RANGE_TYPE;
+ } else if (!strcasecomp(I->type, "file")) {
+ f->type = F_FILE_TYPE;
+ CTRACE((tfp, "ok, got a file uploader\n"));
+ } else if (!strcasecomp(I->type, "keygen")) {
+ f->type = F_KEYGEN_TYPE;
+ } else if (!strcasecomp(I->type, "button")) {
+ f->type = F_BUTTON_TYPE;
+ } else {
+ /*
+ * Note that TYPE="scribble" defaults to TYPE="text". -FM
+ */
+ f->type = F_TEXT_TYPE; /* default */
+ }
+ } else {
+ f->type = F_TEXT_TYPE;
+ }
+
+ /*
+ * Set NAME.
+ */
+ if (I->name != NULL) {
+ StrAllocCopy(f->name, I->name);
+ f->name_cs = I->name_cs;
+ } else {
+ if (f->type == F_RESET_TYPE ||
+ f->type == F_SUBMIT_TYPE ||
+ f->type == F_IMAGE_SUBMIT_TYPE) {
+ /*
+ * Set name to empty string.
+ */
+ StrAllocCopy(f->name, "");
+ } else {
+ /*
+ * Error! NAME must be present.
+ */
+ CTRACE((tfp,
+ "GridText: No name present in input field; not displaying\n"));
+ FREE(IValue);
+ return (0);
+ }
+ }
+
+ /*
+ * Add this anchor to the anchor list
+ */
+ if (text->last_anchor) {
+ text->last_anchor->next = a;
+ } else {
+ text->first_anchor = a;
+ }
+
+ /*
+ * Set VALUE, if it exists. Otherwise, if it's not
+ * an option list make it a zero-length string. -FM
+ */
+ if (IValue != NULL) {
+ /*
+ * OPTION VALUE is not actually the value to be seen but is to
+ * be sent....
+ */
+ if (f->type == F_OPTION_LIST_TYPE ||
+ f->type == F_CHECKBOX_TYPE) {
+ /*
+ * Fill both with the value. The f->value may be
+ * overwritten in HText_setLastOptionValue....
+ */
+ StrAllocCopy(f->value, IValue);
+ StrAllocCopy(f->cp_submit_value, IValue);
+ } else {
+ StrAllocCopy(f->value, IValue);
+ }
+ f->value_cs = I->value_cs;
+ } else if (f->type != F_OPTION_LIST_TYPE) {
+ StrAllocCopy(f->value, "");
+ /*
+ * May be an empty INPUT field. The text entered will then
+ * probably be in the current display character set. - kw
+ */
+ f->value_cs = current_char_set;
+ }
+
+ /*
+ * Run checks and fill in necessary values.
+ */
+ if (f->type == F_RESET_TYPE) {
+ if (non_empty(f->value)) {
+ f->size = (int) strlen(f->value);
+ } else {
+ StrAllocCopy(f->value, "Reset");
+ f->size = 5;
+ }
+ } else if (f->type == F_BUTTON_TYPE) {
+ if (non_empty(f->value)) {
+ f->size = (int) strlen(f->value);
+ } else {
+ StrAllocCopy(f->value, "BUTTON");
+ f->size = 5;
+ }
+ } else if (f->type == F_IMAGE_SUBMIT_TYPE ||
+ f->type == F_SUBMIT_TYPE) {
+ if (non_empty(f->value)) {
+ f->size = (int) strlen(f->value);
+ } else if (f->type == F_IMAGE_SUBMIT_TYPE) {
+ StrAllocCopy(f->value, "[IMAGE]-Submit");
+ f->size = 14;
+ } else {
+ StrAllocCopy(f->value, "Submit");
+ f->size = 6;
+ }
+ addFormAction(f);
+ } else if (f->type == F_RADIO_TYPE || f->type == F_CHECKBOX_TYPE) {
+ f->size = 3;
+ if (IValue == NULL)
+ StrAllocCopy(f->value, (f->type == F_CHECKBOX_TYPE ? "on" : ""));
+
+ }
+ FREE(IValue);
+
+ /*
+ * Set original values.
+ */
+ if (f->type == F_RADIO_TYPE || f->type == F_CHECKBOX_TYPE) {
+ if (f->num_value)
+ StrAllocCopy(f->orig_value, "1");
+ else
+ StrAllocCopy(f->orig_value, "0");
+ } else if (f->type == F_OPTION_LIST_TYPE) {
+ f->orig_value = NULL;
+ } else {
+ StrAllocCopy(f->orig_value, f->value);
+ }
+
+ /*
+ * Store accept-charset if present, converting to lowercase
+ * and collapsing spaces. - kw
+ */
+ if (I->accept_cs) {
+ StrAllocCopy(f->accept_cs, I->accept_cs);
+ LYRemoveBlanks(f->accept_cs);
+ LYLowerCase(f->accept_cs);
+ }
+
+ /*
+ * Add numbers to form fields if needed. - LE & FM
+ */
+ switch (f->type) {
+ /*
+ * Do not supply number for hidden fields, nor
+ * for types that are not yet implemented.
+ */
+ case F_HIDDEN_TYPE:
+#ifndef USE_FILE_UPLOAD
+ case F_FILE_TYPE:
+#endif
+ case F_RANGE_TYPE:
+ case F_KEYGEN_TYPE:
+ case F_BUTTON_TYPE:
+ a->number = 0;
+ break;
+
+ default:
+ if (fields_are_numbered())
+ a->number = ++(text->last_anchor_number);
+ else
+ a->number = 0;
+ break;
+ }
+ if (fields_are_numbered() && (a->number > 0)) {
+ if (HTMainText != 0) {
+ HText_findAnchorNumber(a);
+ } else {
+ a->show_number = a->number;
+ }
+ sprintf(marker, "[%d]", a->show_number);
+ adjust_marker = (int) strlen(marker);
+ if (number_fields_on_left) {
+ BOOL had_bracket = (BOOL) (f->type == F_OPTION_LIST_TYPE);
+
+ HText_appendText(text, had_bracket ? (marker + 1) : marker);
+ if (had_bracket)
+ HText_appendCharacter(text, '[');
+ }
+ a->line_num = text->Lines;
+ a->line_pos = (short) text->last_line->size;
+ } else {
+ *marker = '\0';
+ }
+
+ /*
+ * Restrict SIZE to maximum allowable size.
+ */
+ MaximumSize = WRAP_COLS(text) + 1 - adjust_marker;
+ switch (f->type) {
+
+ case F_SUBMIT_TYPE:
+ case F_IMAGE_SUBMIT_TYPE:
+ case F_RESET_TYPE:
+ case F_TEXT_TYPE:
+ case F_TEXTAREA_TYPE:
+ /*
+ * For submit and reset buttons, and for text entry
+ * fields and areas, we limit the size element to that
+ * of one line for the current style because that's
+ * the most we could highlight on overwrites, and/or
+ * handle in the line editor. The actual values for
+ * text entry lines can be long, and will be scrolled
+ * horizontally within the editing window. -FM
+ */
+ MaximumSize -= (1 +
+ (int) text->style->leftIndent +
+ (int) text->style->rightIndent);
+
+ /* If we are numbering form links, place is taken by [nn] */
+ if (fields_are_numbered()) {
+ if (!number_fields_on_left
+ && f->type == F_TEXT_TYPE
+ && MaximumSize > a->line_pos + 10)
+ MaximumSize -= a->line_pos;
+ else
+ MaximumSize -= (int) strlen(marker);
+ }
+
+ /*
+ * Save value for submit/reset buttons so they
+ * will be visible when printing the page. - LE
+ */
+ if (f->type == F_SUBMIT_TYPE)
+ FREE(I->value);
+ I->value = f->value;
+ break;
+
+ default:
+ /*
+ * For all other fields we limit the size element to
+ * 10 less than the screen width, because either they
+ * are types with small placeholders, and/or are a
+ * type which is handled via a popup window. -FM
+ */
+ MaximumSize -= 10;
+ break;
+ }
+
+ if (MaximumSize < 1)
+ MaximumSize = 1;
+
+ if (f->size > MaximumSize)
+ f->size = MaximumSize;
+
+ /*
+ * Add this anchor to the anchor list
+ */
+ text->last_anchor = a;
+
+ if (HTCurrentForm) { /* should always apply! - kw */
+ if (!HTCurrentForm->first_field) {
+ HTCurrentForm->first_field = f;
+ }
+ HTCurrentForm->last_field = f;
+ HTCurrentForm->nfields++; /* will count hidden fields - kw */
+ /*
+ * Set the no_cache flag if the METHOD is POST. -FM
+ */
+ if (HTCurrentForm->data.submit_method == URL_POST_METHOD)
+ f->no_cache = TRUE;
+ /*
+ * Propagate form field's accept-charset attribute to enclosing
+ * form if the form itself didn't have an accept-charset - kw
+ */
+ if (f->accept_cs && !HTCurrentForm->accept_cs) {
+ StrAllocCopy(HTCurrentForm->accept_cs, f->accept_cs);
+ }
+ if (!text->forms) {
+ text->forms = HTList_new();
+ }
+ } else {
+ CTRACE((tfp, "beginInput: HTCurrentForm is missing!\n"));
+ }
+
+ CTRACE((tfp, "Input link: name=%s\nvalue=%s\nsize=%d\n",
+ f->name,
+ NonNull(f->value),
+ f->size));
+ CTRACE((tfp, "Input link: name_cs=%d \"%s\" (from %d \"%s\")\n",
+ f->name_cs,
+ (f->name_cs >= 0 ?
+ LYCharSet_UC[f->name_cs].MIMEname : "<UNKNOWN>"),
+ I->name_cs,
+ (I->name_cs >= 0 ?
+ LYCharSet_UC[I->name_cs].MIMEname : "<UNKNOWN>")));
+ CTRACE((tfp, " value_cs=%d \"%s\" (from %d \"%s\")\n",
+ f->value_cs,
+ (f->value_cs >= 0 ?
+ LYCharSet_UC[f->value_cs].MIMEname : "<UNKNOWN>"),
+ I->value_cs,
+ (I->value_cs >= 0 ?
+ LYCharSet_UC[I->value_cs].MIMEname : "<UNKNOWN>")));
+
+ /*
+ * Return the SIZE of the input field.
+ */
+ if (I->size && f->size > adjust_marker) {
+ f->size -= adjust_marker;
+ }
+ return (f->size);
+}
+
+/*
+ * If we're numbering fields on the right, do it. Note that some fields may
+ * be too long for the line - we'll lose the marker in that case rather than
+ * truncate the field.
+ */
+void HText_endInput(HText *text)
+{
+ if (fields_are_numbered()
+ && !number_fields_on_left
+ && text != NULL
+ && text->last_anchor != NULL
+ && text->last_anchor->number > 0) {
+ char marker[20];
+
+ sprintf(marker, "[%d]", text->last_anchor->show_number);
+ HText_appendText(text, marker);
+ }
+}
+
+/*
+ * Get a translation (properly: transcoding) quality, factoring in
+ * our ability to translate (an UCTQ_t) and a possible q parameter
+ * on the given charset string, for cs_from -> givenmime.
+ * The parsed input string will be mutilated on exit(!).
+ * Note that results are not normalised to 1.0, but results from
+ * different calls of this function can be compared. - kw
+ *
+ * Obsolete, it was planned to use here a quality parameter UCTQ_t,
+ * which is boolean now.
+ */
+static double get_trans_q(int cs_from,
+ char *givenmime)
+{
+ double df = 1.0;
+ BOOL tq;
+ char *p;
+
+ if (!givenmime || !(*givenmime))
+ return 0.0;
+ if ((p = StrChr(givenmime, ';')) != NULL) {
+ *p++ = '\0';
+ }
+ if (!strcmp(givenmime, "*"))
+ tq = UCCanTranslateFromTo(cs_from,
+ UCGetLYhndl_byMIME("utf-8"));
+ else
+ tq = UCCanTranslateFromTo(cs_from,
+ UCGetLYhndl_byMIME(givenmime));
+ if (!tq)
+ return 0.0;
+ if (non_empty(p)) {
+ char *pair, *field = p, *pval, *ptok;
+
+ /* Get all the parameters to the Charset */
+ while ((pair = HTNextTok(&field, ";", "\"", NULL)) != NULL) {
+ if ((ptok = HTNextTok(&pair, "= ", NULL, NULL)) != NULL &&
+ (pval = HTNextField(&pair)) != NULL) {
+ if (0 == strcasecomp(ptok, "q")) {
+ df = strtod(pval, NULL);
+ break;
+ }
+ }
+ }
+ return (df * tq);
+ } else {
+ return tq;
+ }
+}
+
+/*
+ * Find the best charset for submission, if we have an ACCEPT_CHARSET
+ * list. It factors in how well we can translate (just as guess, and
+ * not a very good one..) and possible ";q=" factors. Yes this is
+ * more general than it needs to be here.
+ *
+ * Input is cs_in and acceptstring.
+ *
+ * Will return charset handle as int.
+ * best_csname will point to a newly allocated MIME string for the
+ * charset corresponding to the return value if return value >= 0.
+ * - kw
+ */
+static int find_best_target_cs(char **best_csname,
+ int cs_from,
+ const char *acceptstring)
+{
+ char *paccept = NULL;
+ double bestq = -1.0;
+ char *bestmime = NULL;
+ char *field, *nextfield;
+
+ StrAllocCopy(paccept, acceptstring);
+ nextfield = paccept;
+ while ((field = HTNextTok(&nextfield, ",", "\"", NULL)) != NULL) {
+ double q;
+
+ if (*field != '\0') {
+ /* Get the Charset */
+ q = get_trans_q(cs_from, field);
+ if (q > bestq) {
+ bestq = q;
+ bestmime = field;
+ }
+ }
+ }
+ if (bestmime) {
+ if (!strcmp(bestmime, "*")) /* non-standard for HTML attribute.. */
+ StrAllocCopy(*best_csname, "utf-8");
+ else
+ StrAllocCopy(*best_csname, bestmime);
+ FREE(paccept);
+ if (bestq > 0)
+ return (UCGetLYhndl_byMIME(*best_csname));
+ else
+ return (-1);
+ }
+ FREE(paccept);
+ return (-1);
+}
+
+#ifdef USE_FILE_UPLOAD
+static void load_a_file(const char *val_used,
+ bstring **result)
+{
+ FILE *fd;
+ size_t bytes;
+ char bfr[BUFSIZ + 1];
+
+ CTRACE((tfp, "Ok, about to convert \"%s\" to mime/thingy\n", val_used));
+
+ if (*val_used) { /* ignore empty form field */
+ if ((fd = fopen(val_used, BIN_R)) == 0) {
+ HTAlert(gettext("Can't open file for uploading"));
+ } else {
+ while ((bytes = fread(bfr, sizeof(char), sizeof(bfr) - 1, fd)) != 0) {
+ HTSABCat(result, bfr, (int) bytes);
+ }
+ LYCloseInput(fd);
+ }
+ }
+}
+
+static const char *guess_content_type(const char *filename)
+{
+ HTAtom *encoding;
+ const char *desc;
+ HTFormat format = HTFileFormat(filename, &encoding, &desc);
+
+ return (format != 0 && non_empty(format->name))
+ ? format->name
+ : STR_PLAINTEXT;
+}
+#endif /* USE_FILE_UPLOAD */
+
+static void cannot_transcode(BOOL *had_warning,
+ const char *target_csname)
+{
+ if (*had_warning == NO) {
+ *had_warning = YES;
+ _user_message(CANNOT_TRANSCODE_FORM,
+ target_csname ? target_csname : "UNKNOWN");
+ LYSleepAlert();
+ }
+}
+
+#define SPECIAL_8BIT 1
+#define SPECIAL_FORM 2
+
+static unsigned check_form_specialchars(const char *value)
+{
+ unsigned result = 0;
+ const char *p;
+
+ for (p = value;
+ non_empty(p) && (result != (SPECIAL_8BIT | SPECIAL_FORM));
+ p++) {
+ if ((*p == HT_NON_BREAK_SPACE) ||
+ (*p == HT_EN_SPACE) ||
+ (*p == LY_SOFT_HYPHEN)) {
+ result |= SPECIAL_FORM;
+ } else if ((*p & 0x80) != 0) {
+ result |= SPECIAL_8BIT;
+ }
+ }
+ return result;
+}
+
+/*
+ * Scan the given data, adding characters to the MIME-boundary to keep it from
+ * matching any part of the data.
+ */
+static void UpdateBoundary(char **Boundary,
+ bstring *data)
+{
+ size_t j;
+ size_t have = strlen(*Boundary);
+ size_t last = (size_t) BStrLen(data);
+ char *text = BStrData(data);
+ char *want = *Boundary;
+
+ for (j = 0; (long) j <= (long) (last - have); ++j) {
+ if (want[0] == text[j]
+ && !memcmp(want, text + j, have)) {
+ char temp[2];
+
+ temp[0] = (char) (isdigit(UCH(text[have + j])) ? 'a' : '0');
+ temp[1] = '\0';
+ StrAllocCat(want, temp);
+ ++have;
+ }
+ }
+ *Boundary = want;
+}
+
+/*
+ * Convert a string to base64
+ */
+static char *convert_to_base64(const char *src,
+ size_t len)
+{
+#define B64_LINE 76
+
+ static const char basis_64[] =
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+
+ char *dest;
+ size_t rlen; /* length of result string */
+ unsigned char c1, c2, c3;
+ const char *eol;
+ char *r;
+ const char *str;
+ size_t eollen;
+ int chunk;
+
+ str = src;
+ eol = "\n";
+ eollen = 1;
+
+ /* calculate the length of the result */
+ rlen = (len + 2) / 3 * 4; /* encoded bytes */
+ if (rlen) {
+ /* add space for EOL */
+ rlen += ((rlen - 1) / B64_LINE + 1) * eollen;
+ }
+
+ /* allocate a result buffer */
+ if ((dest = (char *) malloc(rlen + 1)) == NULL) {
+ outofmem(__FILE__, "convert_to_base64");
+ }
+ r = dest;
+
+ /* encode */
+ for (chunk = 0; len > 0; len -= 3, chunk++) {
+ if (chunk == (B64_LINE / 4)) {
+ const char *c = eol;
+ const char *e = eol + eollen;
+
+ while (c < e)
+ *r++ = *c++;
+ chunk = 0;
+ }
+ c1 = UCH(*str++);
+ c2 = UCH(*str++);
+ *r++ = basis_64[c1 >> 2];
+ *r++ = basis_64[((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4)];
+ if (len > 2) {
+ c3 = UCH(*str++);
+ *r++ = basis_64[((c2 & 0xF) << 2) | ((c3 & 0xC0) >> 6)];
+ *r++ = basis_64[c3 & 0x3F];
+ } else if (len == 2) {
+ *r++ = basis_64[(c2 & 0xF) << 2];
+ *r++ = '=';
+ } else { /* len == 1 */
+ *r++ = '=';
+ *r++ = '=';
+ }
+ }
+ if (rlen) {
+ /* append eol to the result string */
+ const char *c = eol;
+ const char *e = eol + eollen;
+
+ while (c < e)
+ *r++ = *c++;
+ }
+ *r = '\0';
+
+ return dest;
+}
+
+typedef enum {
+ NO_QUOTE /* no quoting needed */
+ ,QUOTE_MULTI /* multipart */
+ ,QUOTE_BASE64 /* encode as base64 */
+ ,QUOTE_SPECIAL /* escape special characters only */
+} QuoteData;
+
+typedef struct {
+ int type; /* the type of this field */
+ BOOL first; /* true if this begins a submission part */
+ char *name; /* the name of this field */
+ char *value; /* the nominal value of this field */
+ bstring *data; /* its data, which is usually the same as the value */
+ QuoteData quote; /* how to quote/translate the data */
+} PostData;
+
+static char *escape_or_quote_name(const char *name,
+ QuoteData quoting,
+ const char *MultipartContentType)
+{
+ char *escaped1 = NULL;
+
+ switch (quoting) {
+ case NO_QUOTE:
+ StrAllocCopy(escaped1, name);
+ break;
+ case QUOTE_MULTI:
+ case QUOTE_BASE64:
+ StrAllocCopy(escaped1, "Content-Disposition: form-data");
+ HTSprintf(&escaped1, "; name=\"%s\"", name);
+ if (MultipartContentType)
+ HTSprintf(&escaped1, MultipartContentType, STR_PLAINTEXT);
+ if (quoting == QUOTE_BASE64)
+ StrAllocCat(escaped1, "\r\nContent-Transfer-Encoding: base64");
+ StrAllocCat(escaped1, "\r\n\r\n");
+ break;
+ case QUOTE_SPECIAL:
+ escaped1 = HTEscapeSP(name, URL_XALPHAS);
+ break;
+ }
+ return escaped1;
+}
+
+static char *escape_or_quote_value(const char *value,
+ QuoteData quoting)
+{
+ char *escaped2 = NULL;
+
+ switch (quoting) {
+ case NO_QUOTE:
+ case QUOTE_MULTI:
+ StrAllocCopy(escaped2, NonNull(value));
+ break;
+ case QUOTE_BASE64:
+ /* FIXME: this is redundant */
+ escaped2 = convert_to_base64(value, strlen(value));
+ break;
+ case QUOTE_SPECIAL:
+ escaped2 = HTEscapeSP(value, URL_XALPHAS);
+ break;
+ }
+ return escaped2;
+}
+
+/*
+ * Check if we should encode the data in base64. We can, only if we're using
+ * a multipart content type. We should, if we're sending mail and the data
+ * contains long lines or nonprinting characters.
+ */
+static int check_if_base64_needed(int submit_method,
+ bstring *data)
+{
+ int width = 0;
+ BOOL printable = TRUE;
+ char *text = BStrData(data);
+
+ if (text != 0) {
+ int col = 0;
+ int n;
+ int length = BStrLen(data);
+
+ for (n = 0; n < length; ++n) {
+ int ch = UCH(text[n]);
+
+ if (is8bits(ch) || ((ch < 32 && ch != '\n'))) {
+ CTRACE((tfp, "nonprintable %d:%#x\n", n, (unsigned) ch));
+ printable = FALSE;
+ }
+ if (ch == '\n' || ch == '\r') {
+ if (width < col)
+ width = col;
+ col = 0;
+ } else {
+ ++col;
+ }
+ }
+ if (width < col)
+ width = col;
+ }
+ return !printable && ((submit_method == URL_MAIL_METHOD) && (width > 72));
+}
+
+PerFormInfo *HText_PerFormInfo(int number)
+{
+ return (PerFormInfo *) HTList_objectAt(HTMainText->forms, number - 1);
+}
+
+/*
+ * HText_SubmitForm - generate submit data from form fields.
+ * For mailto forms, send the data.
+ * For other methods, set fields in structure pointed to by doc
+ * appropriately for next request.
+ * Returns 1 if *doc set appropriately for next request,
+ * 0 otherwise. - kw
+ */
+int HText_SubmitForm(FormInfo * submit_item, DocInfo *doc,
+ const char *link_name,
+ const char *link_value)
+{
+ BOOL had_chartrans_warning = NO;
+ BOOL have_accept_cs = NO;
+ BOOL success;
+ BOOLEAN PlainText = FALSE;
+ BOOLEAN SemiColon = FALSE;
+ BOOL skip_field = FALSE;
+ const char *out_csname;
+ const char *target_csname = NULL;
+ PerFormInfo *thisform;
+ PostData *my_data = NULL;
+ TextAnchor *anchor_ptr;
+ bstring *my_query = NULL;
+ char *Boundary = NULL;
+ char *MultipartContentType = NULL;
+ char *content_type_out = NULL;
+ char *copied_name_used = NULL;
+ char *copied_val_used = NULL;
+ char *escaped1 = NULL;
+ char *escaped2 = NULL;
+ char *last_textarea_name = NULL;
+ const char *name_used = "";
+ char *previous_blanks = NULL;
+ const char *val_used = "";
+ int anchor_count = 0;
+ int anchor_limit = 0;
+ int form_number = submit_item->number;
+ int result = 0;
+ int target_cs = -1;
+ int textarea_lineno = 0;
+ unsigned form_is_special = 0;
+
+ CTRACE((tfp, "SubmitForm\n link_name=%s\n link_value=%s\n", link_name, link_value));
+ if (!HTMainText)
+ return 0;
+
+ thisform = HText_PerFormInfo(form_number);
+ /* Sanity check */
+ if (!thisform) {
+ CTRACE((tfp, "SubmitForm: form %d not in HTMainText's list!\n",
+ form_number));
+ } else if (thisform->number != form_number) {
+ CTRACE((tfp, "SubmitForm: failed sanity check, %d!=%d !\n",
+ thisform->number, form_number));
+ thisform = NULL;
+ }
+
+ if (isEmpty(submit_item->submit_action)) {
+ CTRACE((tfp, "SubmitForm: no action given\n"));
+ return 0;
+ }
+
+ /*
+ * If we're mailing, make sure it's a mailto ACTION. -FM
+ */
+ if ((submit_item->submit_method == URL_MAIL_METHOD) &&
+ !isMAILTO_URL(submit_item->submit_action)) {
+ HTAlert(BAD_FORM_MAILTO);
+ return 0;
+ }
+
+ /*
+ * Check the ENCTYPE and set up the appropriate variables. -FM
+ */
+ if (submit_item->submit_enctype &&
+ !strncasecomp(submit_item->submit_enctype, STR_PLAINTEXT, 10)) {
+ /*
+ * Do not hex escape, and use physical newlines
+ * to separate name=value pairs. -FM
+ */
+ PlainText = TRUE;
+ } else if (submit_item->submit_enctype &&
+ !strncasecomp(submit_item->submit_enctype,
+ "application/sgml-form-urlencoded", 32)) {
+ /*
+ * Use semicolons instead of ampersands as the
+ * separators for name=value pairs. -FM
+ */
+ SemiColon = TRUE;
+ } else if (submit_item->submit_enctype &&
+ !strncasecomp(submit_item->submit_enctype,
+ "multipart/form-data", 19)) {
+ /*
+ * Use the multipart MIME format. Later we will ensure it does not
+ * occur within the content.
+ */
+ StrAllocCopy(Boundary, "xnyLAaB03X");
+ }
+
+ /*
+ * Determine in what character encoding (aka. charset) we should
+ * submit. We call this target_cs and the MIME name for it
+ * target_csname.
+ * TODO: - actually use ACCEPT-CHARSET stuff from FORM
+ * TODO: - deal with list in ACCEPT-CHARSET, find a "best"
+ * charset to submit
+ */
+
+ /* Look at ACCEPT-CHARSET on the submitting field if we have one. */
+ if (thisform && submit_item->accept_cs &&
+ strcasecomp(submit_item->accept_cs, "UNKNOWN")) {
+ have_accept_cs = YES;
+ target_cs = find_best_target_cs(&thisform->thisacceptcs,
+ current_char_set,
+ submit_item->accept_cs);
+ }
+ /* Look at ACCEPT-CHARSET on form as a whole if submitting field
+ * didn't have one. */
+ if (thisform && !have_accept_cs && thisform->accept_cs &&
+ strcasecomp(thisform->accept_cs, "UNKNOWN")) {
+ have_accept_cs = YES;
+ target_cs = find_best_target_cs(&thisform->thisacceptcs,
+ current_char_set,
+ thisform->accept_cs);
+ }
+ if (have_accept_cs && (target_cs >= 0) && thisform->thisacceptcs) {
+ target_csname = thisform->thisacceptcs;
+ }
+
+ if (target_cs < 0 &&
+ non_empty(HTMainText->node_anchor->charset)) {
+ target_cs = UCGetLYhndl_byMIME(HTMainText->node_anchor->charset);
+ if (target_cs >= 0) {
+ target_csname = HTMainText->node_anchor->charset;
+ } else {
+ target_cs = UCLYhndl_for_unspec; /* always >= 0 */
+ target_csname = LYCharSet_UC[target_cs].MIMEname;
+ }
+ }
+ if (target_cs < 0) {
+ target_cs = UCLYhndl_for_unspec; /* always >= 0 */
+ }
+
+ /*
+ * Go through list of anchors and get a "max." charset parameter - kw
+ */
+ for (anchor_ptr = HTMainText->first_anchor;
+ anchor_ptr != NULL;
+ anchor_ptr = anchor_ptr->next) {
+
+ if (anchor_ptr->link_type != INPUT_ANCHOR)
+ continue;
+
+ if (anchor_ptr->input_field->number == form_number &&
+ !anchor_ptr->input_field->disabled) {
+
+ FormInfo *form_ptr = anchor_ptr->input_field;
+ char *val = (form_ptr->cp_submit_value != NULL
+ ? form_ptr->cp_submit_value
+ : form_ptr->value);
+
+ unsigned field_is_special = check_form_specialchars(val);
+ unsigned name_is_special = check_form_specialchars(form_ptr->name);
+
+ form_is_special = (field_is_special | name_is_special);
+
+ if (field_is_special == 0) {
+ /* already ok */
+ } else if (target_cs < 0) {
+ /* already confused */
+ } else if ((field_is_special & SPECIAL_8BIT) == 0
+ && (LYCharSet_UC[target_cs].enc == UCT_ENC_8859
+ || (LYCharSet_UC[target_cs].like8859 & UCT_R_8859SPECL))) {
+ /* those specials will be trivial */
+ } else if (UCNeedNotTranslate(form_ptr->value_cs, target_cs)) {
+ /* already ok */
+ } else if (UCCanTranslateFromTo(form_ptr->value_cs, target_cs)) {
+ /* also ok */
+ } else if (UCCanTranslateFromTo(target_cs, form_ptr->value_cs)) {
+ target_cs = form_ptr->value_cs; /* try this */
+ target_csname = NULL; /* will be set after loop */
+ } else {
+ target_cs = -1; /* don't know what to do */
+ }
+
+ /* Same for name */
+ if (name_is_special == 0) {
+ /* already ok */
+ } else if (target_cs < 0) {
+ /* already confused */
+ } else if ((name_is_special & SPECIAL_8BIT) == 0
+ && (LYCharSet_UC[target_cs].enc == UCT_ENC_8859
+ || (LYCharSet_UC[target_cs].like8859 & UCT_R_8859SPECL))) {
+ /* those specials will be trivial */
+ } else if (UCNeedNotTranslate(form_ptr->name_cs, target_cs)) {
+ /* already ok */
+ } else if (UCCanTranslateFromTo(form_ptr->name_cs, target_cs)) {
+ /* also ok */
+ } else if (UCCanTranslateFromTo(target_cs, form_ptr->name_cs)) {
+ target_cs = form_ptr->value_cs; /* try this */
+ target_csname = NULL; /* will be set after loop */
+ } else {
+ target_cs = -1; /* don't know what to do */
+ }
+
+ ++anchor_limit;
+ } else if (anchor_ptr->input_field->number > form_number) {
+ break;
+ }
+ }
+
+ /*
+ * If we have input fields (we expect this), make an array of them so we
+ * can organize the data.
+ */
+ if (anchor_limit != 0) {
+ my_data = typecallocn(PostData, (size_t) anchor_limit);
+ if (my_data == 0)
+ outofmem(__FILE__, "HText_SubmitForm");
+ }
+
+ if (target_csname == NULL) {
+ if (target_cs >= 0) {
+ if ((form_is_special & SPECIAL_8BIT) != 0) {
+ target_csname = LYCharSet_UC[target_cs].MIMEname;
+ } else if ((form_is_special & SPECIAL_FORM) != 0) {
+ target_csname = LYCharSet_UC[target_cs].MIMEname;
+ } else {
+ target_csname = "us-ascii";
+ }
+ } else {
+ target_csname = "us-ascii";
+ target_cs = UCLYhndl_for_unspec; /* always >= 0 */
+ }
+ } else if (target_cs < 0) {
+ target_cs = UCLYhndl_for_unspec; /* always >= 0 */
+ }
+
+ if (submit_item->submit_method == URL_GET_METHOD && Boundary == NULL) {
+ char *temp = NULL;
+
+ StrAllocCopy(temp, submit_item->submit_action);
+ /*
+ * Method is GET. Clip out any anchor in the current URL.
+ */
+ strtok(temp, "#");
+ /*
+ * Clip out any old query in the current URL.
+ */
+ strtok(temp, "?");
+ /*
+ * Add the lead question mark for the new URL.
+ */
+ StrAllocCat(temp, "?");
+ BStrCat0(my_query, temp);
+ free(temp);
+ } else {
+ /*
+ * We are submitting POST content to a server,
+ * so load content_type_out. This will be put in
+ * the post_content_type element if all goes well. -FM, kw
+ */
+ if (SemiColon == TRUE) {
+ StrAllocCopy(content_type_out,
+ "application/sgml-form-urlencoded");
+ } else if (PlainText == TRUE) {
+ StrAllocCopy(content_type_out,
+ STR_PLAINTEXT);
+ } else if (Boundary != NULL) {
+ StrAllocCopy(content_type_out,
+ "multipart/form-data");
+ } else {
+ StrAllocCopy(content_type_out,
+ "application/x-www-form-urlencoded");
+ }
+
+ /*
+ * If the ENCTYPE is not multipart/form-data, append the
+ * charset we'll be sending to the post_content_type, IF
+ * (1) there was an explicit accept-charset attribute, OR
+ * (2) we have 8-bit or special chars, AND the document had
+ * an explicit (recognized and accepted) charset parameter,
+ * AND it or target_csname is different from iso-8859-1,
+ * OR
+ * (3) we have 8-bit or special chars, AND the document had
+ * no explicit (recognized and accepted) charset parameter,
+ * AND target_cs is different from the currently effective
+ * assumed charset (which should have been set by the user
+ * so that it reflects what the server is sending, if the
+ * document is rendered correctly).
+ * For multipart/form-data the equivalent will be done later,
+ * separately for each form field. - kw
+ */
+ if (have_accept_cs
+ || ((form_is_special & SPECIAL_8BIT) != 0
+ || (form_is_special & SPECIAL_FORM) != 0)) {
+ if (target_cs >= 0 && target_csname) {
+ if (Boundary == NULL) {
+ if ((HTMainText->node_anchor->charset &&
+ (strcmp(HTMainText->node_anchor->charset,
+ "iso-8859-1") ||
+ strcmp(target_csname, "iso-8859-1"))) ||
+ (!HTMainText->node_anchor->charset &&
+ target_cs != UCLYhndl_for_unspec)) {
+ HTSprintf(&content_type_out, "; charset=%s", target_csname);
+ }
+ }
+ } else {
+ cannot_transcode(&had_chartrans_warning, target_csname);
+ }
+ }
+ }
+
+ out_csname = target_csname;
+
+ /*
+ * Build up a list of the input fields and their associated values.
+ */
+ for (anchor_ptr = HTMainText->first_anchor;
+ anchor_ptr != NULL;
+ anchor_ptr = anchor_ptr->next) {
+
+ if (anchor_ptr->link_type != INPUT_ANCHOR)
+ continue;
+
+ if (anchor_ptr->input_field->number == form_number &&
+ !anchor_ptr->input_field->disabled) {
+
+ FormInfo *form_ptr = anchor_ptr->input_field;
+ int out_cs;
+ QuoteData quoting = (PlainText
+ ? NO_QUOTE
+ : (Boundary
+ ? QUOTE_MULTI
+ : QUOTE_SPECIAL));
+
+ assert(my_data != NULL);
+
+ if (form_ptr->type != F_TEXTAREA_TYPE)
+ textarea_lineno = 0;
+
+ CTRACE((tfp, "SubmitForm[%d/%d]: ",
+ anchor_count + 1, anchor_limit));
+
+ name_used = NonNull(form_ptr->name);
+
+ switch (form_ptr->type) {
+ case F_RESET_TYPE:
+ CTRACE((tfp, "reset\n"));
+ break;
+#ifdef USE_FILE_UPLOAD
+ case F_FILE_TYPE:
+ val_used = NonNull(form_ptr->value);
+ CTRACE((tfp, "I will submit \"%s\" (from %s)\n",
+ val_used, name_used));
+ break;
+#endif
+ case F_SUBMIT_TYPE:
+ case F_TEXT_SUBMIT_TYPE:
+ case F_IMAGE_SUBMIT_TYPE:
+ if (!(non_empty(form_ptr->name) &&
+ !strcmp(form_ptr->name, link_name))) {
+ CTRACE((tfp, "skipping submit field with "));
+ CTRACE((tfp, "name \"%s\" for link_name \"%s\", %s.\n",
+ form_ptr->name ? form_ptr->name : "???",
+ link_name ? link_name : "???",
+ non_empty(form_ptr->name) ?
+ "not current link" : "no field name"));
+ break;
+ }
+ if (!(form_ptr->type == F_TEXT_SUBMIT_TYPE ||
+ (non_empty(form_ptr->value) &&
+ !strcmp(form_ptr->value, link_value)))) {
+ CTRACE((tfp, "skipping submit field with "));
+ CTRACE((tfp, "name \"%s\" for link_name \"%s\", %s!\n",
+ form_ptr->name ? form_ptr->name : "???",
+ link_name ? link_name : "???",
+ "values are different"));
+ break;
+ }
+ /* FALLTHRU */
+ case F_RADIO_TYPE:
+ case F_CHECKBOX_TYPE:
+ case F_TEXTAREA_TYPE:
+ case F_PASSWORD_TYPE:
+ case F_TEXT_TYPE:
+ case F_OPTION_LIST_TYPE:
+ case F_HIDDEN_TYPE:
+ /*
+ * Be sure to actually look at the option submit value.
+ */
+ if (form_ptr->cp_submit_value != NULL) {
+ val_used = form_ptr->cp_submit_value;
+ } else {
+ val_used = form_ptr->value;
+ }
+
+ /*
+ * Charset-translate value now, because we need to know the
+ * charset parameter for multipart bodyparts. - kw
+ */
+ if (check_form_specialchars(val_used) != 0) {
+ /* We should translate back. */
+ StrAllocCopy(copied_val_used, val_used);
+ success = FALSE;
+ if (HTCJK == JAPANESE) {
+ if ((0 <= target_cs) &&
+ !strcmp(LYCharSet_UC[target_cs].MIMEname, "euc-jp")) {
+ TO_EUC((const unsigned char *) val_used,
+ (unsigned char *) copied_val_used);
+ success = YES;
+ } else if ((0 <= target_cs) &&
+ !strcmp(LYCharSet_UC[target_cs].MIMEname,
+ "shift_jis")) {
+ TO_SJIS((const unsigned char *) val_used,
+ (unsigned char *) copied_val_used);
+ success = YES;
+ }
+ }
+ if (!success) {
+ success = LYUCTranslateBackFormData(&copied_val_used,
+ form_ptr->value_cs,
+ target_cs, PlainText);
+ }
+ CTRACE((tfp, "field \"%s\" %d %s -> %d %s %s\n",
+ NonNull(form_ptr->name),
+ form_ptr->value_cs,
+ ((form_ptr->value_cs >= 0)
+ ? LYCharSet_UC[form_ptr->value_cs].MIMEname
+ : "???"),
+ target_cs,
+ target_csname ? target_csname : "???",
+ success ? "OK" : "FAILED"));
+ if (success) {
+ val_used = copied_val_used;
+ }
+ } else { /* We can use the value directly. */
+ CTRACE((tfp, "field \"%s\" %d %s OK\n",
+ NonNull(form_ptr->name),
+ target_cs,
+ target_csname ? target_csname : "???"));
+ success = YES;
+ }
+ if (!success) {
+ cannot_transcode(&had_chartrans_warning, target_csname);
+ out_cs = form_ptr->value_cs;
+ } else {
+ out_cs = target_cs;
+ }
+ if (out_cs >= 0)
+ out_csname = LYCharSet_UC[out_cs].MIMEname;
+ if (Boundary) {
+ StrAllocCopy(MultipartContentType,
+ "\r\nContent-Type: %s");
+ if (!success && form_ptr->value_cs < 0) {
+ /* This is weird. */
+ out_csname = "UNKNOWN-8BIT";
+ } else if (!success) {
+ target_csname = NULL;
+ } else {
+ if (!target_csname) {
+ target_csname = LYCharSet_UC[target_cs].MIMEname;
+ }
+ }
+ if (strcmp(out_csname, "iso-8859-1"))
+ HTSprintf(&MultipartContentType, "; charset=%s", out_csname);
+ }
+
+ /*
+ * Charset-translate name now, because we need to know the
+ * charset parameter for multipart bodyparts. - kw
+ */
+ if (form_ptr->type == F_TEXTAREA_TYPE) {
+ textarea_lineno++;
+ if (textarea_lineno > 1 &&
+ last_textarea_name && form_ptr->name &&
+ !strcmp(last_textarea_name, form_ptr->name)) {
+ break;
+ }
+ }
+
+ if (check_form_specialchars(name_used) != 0) {
+ /* We should translate back. */
+ StrAllocCopy(copied_name_used, name_used);
+ success = LYUCTranslateBackFormData(&copied_name_used,
+ form_ptr->name_cs,
+ target_cs, PlainText);
+ CTRACE((tfp, "name \"%s\" %d %s -> %d %s %s\n",
+ NonNull(form_ptr->name),
+ form_ptr->name_cs,
+ ((form_ptr->name_cs >= 0)
+ ? LYCharSet_UC[form_ptr->name_cs].MIMEname
+ : "???"),
+ target_cs,
+ target_csname ? target_csname : "???",
+ success ? "OK" : "FAILED"));
+ if (success) {
+ name_used = copied_name_used;
+ }
+ if (Boundary) {
+ if (!success) {
+ StrAllocCopy(MultipartContentType, "");
+ target_csname = NULL;
+ } else {
+ if (!target_csname)
+ target_csname = LYCharSet_UC[target_cs].MIMEname;
+ }
+ }
+ } else { /* We can use the name directly. */
+ CTRACE((tfp, "name \"%s\" %d %s OK\n",
+ NonNull(form_ptr->name),
+ target_cs,
+ target_csname ? target_csname : "???"));
+ success = YES;
+ if (Boundary) {
+ StrAllocCopy(copied_name_used, name_used);
+ }
+ }
+ if (!success) {
+ cannot_transcode(&had_chartrans_warning, target_csname);
+ }
+ if (Boundary) {
+ /*
+ * According to RFC 1867, Non-ASCII field names
+ * "should be encoded according to the prescriptions
+ * of RFC 1522 [...]. I don't think RFC 1522 actually
+ * is meant to apply to parameters like this, and it
+ * is unknown whether any server would make sense of
+ * it, so for now just use some quoting/escaping and
+ * otherwise leave 8-bit values as they are.
+ * Non-ASCII characters in form field names submitted
+ * as multipart/form-data can only occur if the form
+ * provider specifically asked for it anyway. - kw
+ */
+ HTMake822Word(&copied_name_used, FALSE);
+ name_used = copied_name_used;
+ }
+
+ break;
+ default:
+ CTRACE((tfp, "What type is %d?\n", form_ptr->type));
+ break;
+ }
+
+ skip_field = FALSE;
+ my_data[anchor_count].first = TRUE;
+ my_data[anchor_count].type = form_ptr->type;
+
+ /*
+ * Using the values of 'name_used' and 'val_used' computed in the
+ * previous case-statement, compute the 'first' and 'data' values
+ * for the current input field.
+ */
+ switch (form_ptr->type) {
+
+ default:
+ skip_field = TRUE;
+ break;
+
+#ifdef USE_FILE_UPLOAD
+ case F_FILE_TYPE:
+ load_a_file(val_used, &(my_data[anchor_count].data));
+ break;
+#endif /* USE_FILE_UPLOAD */
+
+ case F_SUBMIT_TYPE:
+ case F_TEXT_SUBMIT_TYPE:
+ case F_IMAGE_SUBMIT_TYPE:
+ if ((non_empty(form_ptr->name) &&
+ !strcmp(form_ptr->name, link_name)) &&
+ (form_ptr->type == F_TEXT_SUBMIT_TYPE ||
+ (non_empty(form_ptr->value) &&
+ !strcmp(form_ptr->value, link_value)))) {
+ ;
+ } else {
+ skip_field = TRUE;
+ }
+ break;
+
+ case F_RADIO_TYPE:
+ case F_CHECKBOX_TYPE:
+ /*
+ * Only add if selected.
+ */
+ if (form_ptr->num_value) {
+ ;
+ } else {
+ skip_field = TRUE;
+ }
+ break;
+
+ case F_TEXTAREA_TYPE:
+ if (!last_textarea_name ||
+ strcmp(last_textarea_name, form_ptr->name)) {
+ textarea_lineno = 1;
+ last_textarea_name = form_ptr->name;
+ } else {
+ my_data[anchor_count].first = FALSE;
+ }
+ break;
+
+ case F_PASSWORD_TYPE:
+ case F_TEXT_TYPE:
+ case F_OPTION_LIST_TYPE:
+ case F_HIDDEN_TYPE:
+ break;
+ }
+
+ /*
+ * If we did not decide to skip the current field, populate the
+ * values in the array for it.
+ */
+ if (!skip_field) {
+ StrAllocCopy(my_data[anchor_count].name, name_used);
+ StrAllocCopy(my_data[anchor_count].value, val_used);
+ if (my_data[anchor_count].data == 0)
+ BStrCat0(my_data[anchor_count].data, val_used);
+ my_data[anchor_count].quote = quoting;
+ if (quoting == QUOTE_MULTI
+ && check_if_base64_needed(submit_item->submit_method,
+ my_data[anchor_count].data)) {
+ CTRACE((tfp, "will encode as base64\n"));
+ my_data[anchor_count].quote = QUOTE_BASE64;
+ escaped2 =
+ convert_to_base64(BStrData(my_data[anchor_count].data),
+ (size_t)
+ BStrLen(my_data[anchor_count].data));
+ BStrCopy0(my_data[anchor_count].data, escaped2);
+ FREE(escaped2);
+ }
+ }
+ ++anchor_count;
+
+ FREE(copied_name_used);
+ FREE(copied_val_used);
+
+ } else if (anchor_ptr->input_field->number > form_number) {
+ break;
+ }
+ }
+
+ FREE(copied_name_used);
+
+ if (my_data != 0) {
+ BOOL first_one = TRUE;
+
+ /*
+ * If we're using a MIME-boundary, make it unique.
+ */
+ if (content_type_out != 0 && Boundary != 0) {
+ Boundary = 0;
+ StrAllocCopy(Boundary, "LYNX");
+ for (anchor_count = 0; anchor_count < anchor_limit; ++anchor_count) {
+ if (my_data[anchor_count].data != 0) {
+ UpdateBoundary(&Boundary, my_data[anchor_count].data);
+ }
+ }
+ HTSprintf(&content_type_out, "; boundary=%s", Boundary);
+ }
+
+ for (anchor_count = 0; anchor_count < anchor_limit; ++anchor_count) {
+
+ if (my_data[anchor_count].name != 0
+ && my_data[anchor_count].value != 0) {
+
+ CTRACE((tfp,
+ "processing [%d:%d] name=%s(first:%d, value=%s, data=%p)\n",
+ anchor_count + 1,
+ anchor_limit,
+ NonNull(my_data[anchor_count].name),
+ my_data[anchor_count].first,
+ NonNull(my_data[anchor_count].value),
+ (void *) my_data[anchor_count].data));
+
+ if (my_data[anchor_count].first) {
+ if (first_one) {
+ if (Boundary) {
+ HTBprintf(&my_query, "--%s\r\n", Boundary);
+ }
+ first_one = FALSE;
+ } else {
+ if (PlainText) {
+ BStrCat0(my_query, "\n");
+ } else if (SemiColon) {
+ BStrCat0(my_query, ";");
+ } else if (Boundary) {
+ HTBprintf(&my_query, "\r\n--%s\r\n", Boundary);
+ } else {
+ BStrCat0(my_query, "&");
+ }
+ }
+ }
+
+ /* append a null to the string */
+ HTSABCat(&(my_data[anchor_count].data), "", 1);
+ name_used = my_data[anchor_count].name;
+ val_used = my_data[anchor_count].value;
+
+ } else {
+ /* there is no data to send */
+ continue;
+ }
+
+ switch (my_data[anchor_count].type) {
+ case F_TEXT_TYPE:
+ case F_PASSWORD_TYPE:
+ case F_OPTION_LIST_TYPE:
+ case F_HIDDEN_TYPE:
+ escaped1 = escape_or_quote_name(my_data[anchor_count].name,
+ my_data[anchor_count].quote,
+ MultipartContentType);
+
+ escaped2 = escape_or_quote_value(val_used,
+ my_data[anchor_count].quote);
+
+ HTBprintf(&my_query,
+ "%s%s%s%s%s",
+ escaped1,
+ (Boundary ? "" : "="),
+ (PlainText ? "\n" : ""),
+ escaped2,
+ ((PlainText && *escaped2) ? "\n" : ""));
+ break;
+ case F_CHECKBOX_TYPE:
+ case F_RADIO_TYPE:
+ escaped1 = escape_or_quote_name(my_data[anchor_count].name,
+ my_data[anchor_count].quote,
+ MultipartContentType);
+
+ escaped2 = escape_or_quote_value(val_used,
+ my_data[anchor_count].quote);
+
+ HTBprintf(&my_query,
+ "%s%s%s%s%s",
+ escaped1,
+ (Boundary ? "" : "="),
+ (PlainText ? "\n" : ""),
+ escaped2,
+ ((PlainText && *escaped2) ? "\n" : ""));
+ break;
+ case F_SUBMIT_TYPE:
+ case F_TEXT_SUBMIT_TYPE:
+ case F_IMAGE_SUBMIT_TYPE:
+ /*
+ * If it has a non-zero length name (e.g., because
+ * its IMAGE_SUBMIT_TYPE is to be handled homologously
+ * to an image map, or a SUBMIT_TYPE in a set of
+ * multiple submit buttons, or a single type="text"
+ * that's been converted to a TEXT_SUBMIT_TYPE),
+ * include the name=value pair, or fake name.x=0 and
+ * name.y=0 pairs for IMAGE_SUBMIT_TYPE. -FM
+ */
+ escaped1 = escape_or_quote_name(my_data[anchor_count].name,
+ my_data[anchor_count].quote,
+ MultipartContentType);
+
+ escaped2 = escape_or_quote_value(val_used,
+ my_data[anchor_count].quote);
+
+ if (my_data[anchor_count].type == F_IMAGE_SUBMIT_TYPE) {
+ /*
+ * It's a clickable image submit button. Fake a 0,0
+ * coordinate pair, which typically returns the image's
+ * default. -FM
+ */
+ if (Boundary) {
+ *(StrChr(escaped1, '=') + 1) = '\0';
+ HTBprintf(&my_query,
+ "%s\"%s.x\"\r\n\r\n0\r\n--%s\r\n%s\"%s.y\"\r\n\r\n0",
+ escaped1,
+ my_data[anchor_count].name,
+ Boundary,
+ escaped1,
+ my_data[anchor_count].name);
+ } else {
+ HTBprintf(&my_query,
+ "%s.x=0%s%s.y=0%s",
+ escaped1,
+ (PlainText ?
+ "\n" : (SemiColon ?
+ ";" : "&")),
+ escaped1,
+ ((PlainText && *escaped1) ?
+ "\n" : ""));
+ }
+ } else {
+ /*
+ * It's a standard submit button. Use the name=value
+ * pair. = FM
+ */
+ HTBprintf(&my_query,
+ "%s%s%s%s%s",
+ escaped1,
+ (Boundary ? "" : "="),
+ (PlainText ? "\n" : ""),
+ escaped2,
+ ((PlainText && *escaped2) ? "\n" : ""));
+ }
+ break;
+ case F_RESET_TYPE:
+ /* ignore */
+ break;
+ case F_TEXTAREA_TYPE:
+ escaped2 = escape_or_quote_value(val_used,
+ my_data[anchor_count].quote);
+
+ if (my_data[anchor_count].first) {
+ /*
+ * Names are different so this is the first textarea or a
+ * different one from any before it.
+ */
+ if (PlainText) {
+ FREE(previous_blanks);
+ } else if (Boundary) {
+ StrAllocCopy(previous_blanks, "\r\n");
+ } else {
+ StrAllocCopy(previous_blanks, "%0d%0a");
+ }
+ escaped1 = escape_or_quote_name(name_used,
+ my_data[anchor_count].quote,
+ MultipartContentType);
+
+ HTBprintf(&my_query,
+ "%s%s%s%s%s",
+ escaped1,
+ (Boundary ? "" : "="),
+ (PlainText ? "\n" : ""),
+ escaped2,
+ ((PlainText && *escaped2) ? "\n" : ""));
+ } else {
+ const char *marker = (PlainText
+ ? "\n"
+ : (Boundary
+ ? "\r\n"
+ : "%0d%0a"));
+
+ /*
+ * This is a continuation of a previous textarea.
+ */
+ if (escaped2[0] != '\0') {
+ if (previous_blanks) {
+ BStrCat0(my_query, previous_blanks);
+ FREE(previous_blanks);
+ }
+ BStrCat0(my_query, escaped2);
+ if (PlainText || Boundary)
+ BStrCat0(my_query, marker);
+ else
+ StrAllocCopy(previous_blanks, marker);
+ } else {
+ StrAllocCat(previous_blanks, marker);
+ }
+ }
+ break;
+ case F_RANGE_TYPE:
+ /* not implemented */
+ break;
+#ifdef USE_FILE_UPLOAD
+ case F_FILE_TYPE:
+ if (PlainText) {
+ StrAllocCopy(escaped1, my_data[anchor_count].name);
+ } else if (Boundary) {
+ const char *t = guess_content_type(val_used);
+ char *copied_fname = NULL;
+
+ StrAllocCopy(escaped1, "Content-Disposition: form-data");
+ HTSprintf(&escaped1, "; name=\"%s\"",
+ my_data[anchor_count].name);
+
+ StrAllocCopy(copied_fname, val_used);
+ HTMake822Word(&copied_fname, FALSE);
+ HTSprintf(&escaped1, "; filename=\"%s\"", copied_fname);
+ FREE(copied_fname);
+
+ /* Should we take into account the encoding? */
+ HTSprintf(&escaped1, "\r\nContent-Type: %s", t);
+ if (my_data[anchor_count].quote == QUOTE_BASE64)
+ StrAllocCat(escaped1,
+ "\r\nContent-Transfer-Encoding: base64");
+ StrAllocCat(escaped1, "\r\n\r\n");
+ } else {
+ escaped1 = HTEscapeSP(my_data[anchor_count].name, URL_XALPHAS);
+ }
+
+ HTBprintf(&my_query,
+ "%s%s%s",
+ escaped1,
+ (Boundary ? "" : "="),
+ (PlainText ? "\n" : ""));
+ /*
+ * If we have anything more than the trailing null we added,
+ * append the file-data to the query.
+ */
+ if (BStrLen(my_data[anchor_count].data) > 1) {
+ HTSABCat(&my_query,
+ BStrData(my_data[anchor_count].data),
+ BStrLen(my_data[anchor_count].data) - 1);
+ if (PlainText)
+ HTBprintf(&my_query, "\n");
+ }
+ break;
+#endif /* USE_FILE_UPLOAD */
+ case F_KEYGEN_TYPE:
+ case F_BUTTON_TYPE:
+ /* not implemented */
+ break;
+ }
+
+ FREE(escaped1);
+ FREE(escaped2);
+ }
+ if (Boundary) {
+ HTBprintf(&my_query, "\r\n--%s--\r\n", Boundary);
+ }
+ if (TRACE) {
+ CTRACE((tfp, "Query %d{", BStrLen(my_query)));
+ trace_bstring(my_query);
+ CTRACE((tfp, "}\n"));
+ }
+ }
+
+ if (submit_item->submit_method == URL_MAIL_METHOD) {
+ HTUserMsg2(gettext("Submitting %s"), submit_item->submit_action);
+ HTSABCat(&my_query, "", 1); /* append null */
+ mailform((submit_item->submit_action + 7),
+ (isEmpty(submit_item->submit_title)
+ ? NonNull(HText_getTitle())
+ : submit_item->submit_title),
+ BStrData(my_query),
+ content_type_out);
+ result = 0;
+ BStrFree(my_query);
+ FREE(content_type_out);
+ } else {
+ _statusline(SUBMITTING_FORM);
+
+ /*
+ * File-URLs (whether via GET or POST) cannot provide search queries.
+ * The relevant RFCs 1630, 1738 are silent on what to do with
+ * unexpected query parameters in a file-URL.
+ *
+ * Internet Explorer trims the query string here (after all, a "?" is
+ * not a legal part of a Windows filename), and other browsers copy the
+ * behavior. We do this for compatibility, in case someone cares.
+ */
+ if (my_query != 0 &&
+ my_query->len > 5 &&
+ !strncmp(my_query->str, "file:", (size_t) 5)) {
+ strtok(my_query->str, "?");
+ }
+ if (submit_item->submit_method == URL_POST_METHOD || Boundary) {
+ LYFreePostData(doc);
+ doc->post_data = my_query;
+ doc->post_content_type = content_type_out; /* don't free c_t_out */
+ CTRACE((tfp, "GridText - post_data set:\n%s\n", content_type_out));
+ StrAllocCopy(doc->address, submit_item->submit_action);
+ } else { /* GET_METHOD */
+ HTSABCat(&my_query, "", 1); /* append null */
+ StrAllocCopy(doc->address, BStrData(my_query));
+ LYFreePostData(doc);
+ FREE(content_type_out);
+ HTSABFree(&my_query);
+ }
+ result = 1;
+ }
+
+ FREE(MultipartContentType);
+ FREE(previous_blanks);
+ FREE(Boundary);
+ if (my_data != 0) {
+ for (anchor_count = 0; anchor_count < anchor_limit; ++anchor_count) {
+ FREE(my_data[anchor_count].name);
+ FREE(my_data[anchor_count].value);
+ BStrFree(my_data[anchor_count].data);
+ }
+ FREE(my_data);
+ }
+
+ return (result);
+}
+
+void HText_DisableCurrentForm(void)
+{
+ TextAnchor *anchor_ptr;
+
+ HTFormDisabled = TRUE;
+ if (HTMainText != NULL) {
+ /*
+ * Go through list of anchors and set the disabled flag.
+ */
+ for (anchor_ptr = HTMainText->first_anchor;
+ anchor_ptr != NULL;
+ anchor_ptr = anchor_ptr->next) {
+
+ if (anchor_ptr->link_type == INPUT_ANCHOR &&
+ anchor_ptr->input_field->number == HTFormNumber) {
+
+ anchor_ptr->input_field->disabled = TRUE;
+ }
+ }
+ }
+ return;
+}
+
+void HText_ResetForm(FormInfo * form)
+{
+ TextAnchor *anchor_ptr;
+
+ _statusline(RESETTING_FORM);
+ if (HTMainText == 0)
+ return;
+
+ /*
+ * Go through list of anchors and reset values.
+ */
+ for (anchor_ptr = HTMainText->first_anchor;
+ anchor_ptr != NULL;
+ anchor_ptr = anchor_ptr->next) {
+ if (anchor_ptr->link_type == INPUT_ANCHOR) {
+ if (anchor_ptr->input_field->number == form->number) {
+
+ if (anchor_ptr->input_field->type == F_RADIO_TYPE ||
+ anchor_ptr->input_field->type == F_CHECKBOX_TYPE) {
+
+ if (anchor_ptr->input_field->orig_value[0] == '0')
+ anchor_ptr->input_field->num_value = 0;
+ else
+ anchor_ptr->input_field->num_value = 1;
+
+ } else if (anchor_ptr->input_field->type ==
+ F_OPTION_LIST_TYPE) {
+ anchor_ptr->input_field->value =
+ anchor_ptr->input_field->orig_value;
+
+ anchor_ptr->input_field->cp_submit_value =
+ anchor_ptr->input_field->orig_submit_value;
+
+ } else {
+ StrAllocCopy(anchor_ptr->input_field->value,
+ anchor_ptr->input_field->orig_value);
+ }
+ } else if (anchor_ptr->input_field->number > form->number) {
+ break;
+ }
+ }
+ }
+}
+
+/*
+ * This function is called before reloading/reparsing current document to find
+ * whether any forms content was changed by user so any information will be
+ * lost.
+ */
+BOOLEAN HText_HaveUserChangedForms(HText *text)
+{
+ TextAnchor *anchor_ptr;
+
+ if (text == 0)
+ return FALSE;
+
+ /*
+ * Go through list of anchors to check if any value was changed.
+ * This code based on HText_ResetForm()
+ */
+ for (anchor_ptr = text->first_anchor;
+ anchor_ptr != NULL;
+ anchor_ptr = anchor_ptr->next) {
+ if (anchor_ptr->link_type == INPUT_ANCHOR) {
+
+ if (anchor_ptr->input_field->type == F_RADIO_TYPE ||
+ anchor_ptr->input_field->type == F_CHECKBOX_TYPE) {
+
+ if ((anchor_ptr->input_field->orig_value[0] == '0' &&
+ anchor_ptr->input_field->num_value == 1) ||
+ (anchor_ptr->input_field->orig_value[0] != '0' &&
+ anchor_ptr->input_field->num_value == 0))
+ return TRUE;
+
+ } else if (anchor_ptr->input_field->type == F_OPTION_LIST_TYPE) {
+ if (strcmp(anchor_ptr->input_field->value,
+ anchor_ptr->input_field->orig_value))
+ return TRUE;
+
+ if (strcmp(anchor_ptr->input_field->cp_submit_value,
+ anchor_ptr->input_field->orig_submit_value))
+ return TRUE;
+
+ } else {
+ if (strcmp(anchor_ptr->input_field->value,
+ anchor_ptr->input_field->orig_value))
+ return TRUE;
+ }
+ }
+ }
+ return FALSE;
+}
+
+void HText_activateRadioButton(FormInfo * form)
+{
+ TextAnchor *anchor_ptr;
+ int form_number = form->number;
+
+ if (!HTMainText)
+ return;
+ for (anchor_ptr = HTMainText->first_anchor;
+ anchor_ptr != NULL;
+ anchor_ptr = anchor_ptr->next) {
+ if (anchor_ptr->link_type == INPUT_ANCHOR &&
+ anchor_ptr->input_field->type == F_RADIO_TYPE) {
+
+ if (anchor_ptr->input_field->number == form_number) {
+
+ /* if it has the same name and its on */
+ if (!strcmp(anchor_ptr->input_field->name, form->name) &&
+ anchor_ptr->input_field->num_value) {
+ anchor_ptr->input_field->num_value = 0;
+ break;
+ }
+ } else if (anchor_ptr->input_field->number > form_number) {
+ break;
+ }
+
+ }
+ }
+
+ form->num_value = 1;
+}
+
+#ifdef LY_FIND_LEAKS
+/*
+ * Purpose: Free all currently loaded HText objects in memory.
+ * Arguments: void
+ * Return Value: void
+ * Remarks/Portability/Dependencies/Restrictions:
+ * Usage of this function should really be limited to program
+ * termination.
+ * Revision History:
+ * 05-27-94 created Lynx 2-3-1 Garrett Arch Blythe
+ */
+static void free_all_texts(void)
+{
+ HText *cur = NULL;
+
+ if (!loaded_texts)
+ return;
+
+ /*
+ * Simply loop through the loaded texts list killing them off.
+ */
+ while (loaded_texts && !HTList_isEmpty(loaded_texts)) {
+ if ((cur = (HText *) HTList_removeLastObject(loaded_texts)) != NULL) {
+ HText_free(cur);
+ }
+ }
+
+ /*
+ * Get rid of the text list.
+ */
+ if (loaded_texts) {
+ HTList_delete(loaded_texts);
+ }
+
+ /*
+ * Insurance for bad HTML.
+ */
+ FREE(HTCurSelectGroup);
+ FREE(HTCurSelectGroupSize);
+ FREE(HTCurSelectedOptionValue);
+ PerFormInfo_free(HTCurrentForm);
+
+ return;
+}
+#endif /* LY_FIND_LEAKS */
+
+/*
+ * stub_HTAnchor_address is like HTAnchor_address, but it returns the
+ * parent address for child links. This is only useful for traversal's
+ * where one does not want to index a text file N times, once for each
+ * of N internal links. Since the parent link has already been taken,
+ * it won't go again, hence the (incorrect) links won't cause problems.
+ */
+char *stub_HTAnchor_address(HTAnchor * me)
+{
+ char *addr = NULL;
+
+ if (me)
+ StrAllocCopy(addr, me->parent->address);
+ return addr;
+}
+
+void HText_setToolbar(HText *text)
+{
+ if (text)
+ text->toolbar = TRUE;
+ return;
+}
+
+BOOL HText_hasToolbar(HText *text)
+{
+ return (BOOL) ((text && text->toolbar) ? TRUE : FALSE);
+}
+
+void HText_setNoCache(HText *text)
+{
+ if (text)
+ text->no_cache = TRUE;
+ return;
+}
+
+BOOL HText_hasNoCacheSet(HText *text)
+{
+ return (BOOL) ((text && text->no_cache) ? TRUE : FALSE);
+}
+
+BOOL HText_hasUTF8OutputSet(HText *text)
+{
+ return (BOOL) ((text && text->T.output_utf8) ? TRUE : FALSE);
+}
+
+/*
+ * Check charset and set the kcode element. -FM
+ * Info on the input charset may be passed in in two forms,
+ * as a string (if given explicitly) and as a pointer to
+ * a LYUCcharset (from chartrans mechanism); either can be NULL.
+ * For Japanese the kcode will be reset at a space or explicit
+ * line or paragraph break, so what we set here may not last for
+ * long. It's potentially more important not to set HTCJK to
+ * NOCJK unless we are sure. - kw
+ */
+void HText_setKcode(HText *text, const char *charset,
+ LYUCcharset *p_in)
+{
+ BOOL charset_explicit;
+
+ if (!text)
+ return;
+
+ /*
+ * Check whether we have some kind of info. - kw
+ */
+ if (!charset && !p_in) {
+ return;
+ }
+ charset_explicit = (BOOLEAN) (charset ? TRUE : FALSE);
+ /*
+ * If no explicit charset string, use the implied one. - kw
+ */
+ if (isEmpty(charset)) {
+ charset = p_in->MIMEname;
+ }
+ /*
+ * Check whether we have a specified charset. -FM
+ */
+ if (isEmpty(charset)) {
+ return;
+ }
+
+ /*
+ * We've included the charset, and not forced a download offer,
+ * only if the currently selected character set can handle it,
+ * so check the charset value and set the text->kcode element
+ * appropriately. -FM
+ */
+ /* If charset isn't specified explicitly nor assumed,
+ * p_in->MIMEname would be set as display charset.
+ * So text->kcode sholud be set as SJIS or EUC here only if charset
+ * is specified explicitly, otherwise text->kcode would cause
+ * mishandling Japanese strings. -- TH
+ */
+ if (charset_explicit && (!strcmp(charset, "shift_jis") ||
+ !strcmp(charset, "x-sjis") || /* 1997/11/28 (Fri) 18:11:33 */
+ !strcmp(charset, "x-shift-jis"))) {
+ text->kcode = SJIS;
+ } else if (charset_explicit
+#ifdef USE_JAPANESEUTF8_SUPPORT
+ && strcmp(charset, "utf-8")
+#endif
+ && ((p_in && (p_in->enc == UCT_ENC_CJK)) ||
+ !strcmp(charset, "x-euc") || /* 1997/11/28 (Fri) 18:11:24 */
+ !strcmp(charset, "euc-jp") ||
+ !StrNCmp(charset, "x-euc-", 6) ||
+ !strcmp(charset, "euc-kr") ||
+ !strcmp(charset, "iso-2022-kr") ||
+ !strcmp(charset, "big5") ||
+ !strcmp(charset, "cn-big5") ||
+ !strcmp(charset, "euc-cn") ||
+ !strcmp(charset, "gb2312") ||
+ !StrNCmp(charset, "cn-gb", 5) ||
+ !strcmp(charset, "iso-2022-cn"))) {
+ text->kcode = EUC;
+ } else {
+ /*
+ * If we get to here, it's not CJK, so disable that if
+ * it is enabled. But only if we are quite sure. -FM & kw
+ */
+ text->kcode = NOKANJI;
+ if (IS_CJK_TTY) {
+ if (!p_in || ((p_in->enc != UCT_ENC_CJK)
+#ifdef USE_JAPANESEUTF8_SUPPORT
+ && (p_in->enc != UCT_ENC_UTF8)
+#endif
+ )) {
+ HTCJK = NOCJK;
+ }
+ }
+ }
+
+ if (charset_explicit
+#ifdef USE_JAPANESEUTF8_SUPPORT
+ && strcmp(charset, "utf-8")
+#endif
+ ) {
+ text->specified_kcode = text->kcode;
+ } else {
+ if (UCAssume_MIMEcharset) {
+ if (!strcmp(UCAssume_MIMEcharset, "euc-jp"))
+ text->kcode = text->specified_kcode = EUC;
+ else if (!strcmp(UCAssume_MIMEcharset, "shift_jis"))
+ text->kcode = text->specified_kcode = SJIS;
+ }
+ }
+
+ return;
+}
+
+/*
+ * Set a permissible split at the current end of the last line. -FM
+ */
+void HText_setBreakPoint(HText *text)
+{
+ if (!text)
+ return;
+
+ /*
+ * Can split here. -FM
+ */
+ text->permissible_split = text->last_line->size;
+
+ return;
+}
+
+/*
+ * This function determines whether a document which
+ * would be sought via the a URL that has a fragment
+ * directive appended is otherwise identical to the
+ * currently loaded document, and if so, returns
+ * FALSE, so that any no_cache directives can be
+ * overridden "safely", on the grounds that we are
+ * simply acting on the equivalent of a paging
+ * command. Otherwise, it returns TRUE, i.e, that
+ * the target document might differ from the current,
+ * based on any caching directives or analyses which
+ * claimed or suggested this. -FM
+ */
+BOOL HText_AreDifferent(HTParentAnchor *anchor,
+ const char *full_address)
+{
+ HTParentAnchor *MTanc;
+ char *MTaddress;
+ char *MTpound;
+
+ /*
+ * Do we have a loaded document and both
+ * arguments for this function?
+ */
+ if (!(HTMainText && anchor && full_address))
+ return TRUE;
+
+ /*
+ * Do we have both URLs?
+ */
+ MTanc = HTMainText->node_anchor;
+ if (!(MTanc->address && anchor->address))
+ return (TRUE);
+
+ /*
+ * Do we have a fragment associated with the target?
+ */
+ if (findPoundSelector(full_address) == NULL)
+ return (TRUE);
+
+ /*
+ * Always treat client-side image map menus
+ * as potentially stale, so we'll create a
+ * fresh menu from the LynxMaps HTList.
+ */
+ if (isLYNXIMGMAP(anchor->address))
+ return (TRUE);
+
+ /*
+ * Do the docs differ in the type of request?
+ */
+ if (MTanc->isHEAD != anchor->isHEAD)
+ return (TRUE);
+
+ /*
+ * Are the actual URLs different, after factoring
+ * out a "LYNXIMGMAP:" leader in the MainText URL
+ * and its fragment, if present?
+ */
+ MTaddress = (isLYNXIMGMAP(MTanc->address)
+ ? MTanc->address + LEN_LYNXIMGMAP
+ : MTanc->address);
+ MTpound = trimPoundSelector(MTaddress);
+ if (strcmp(MTaddress, anchor->address)) {
+ restorePoundSelector(MTpound);
+ return (TRUE);
+ }
+ restorePoundSelector(MTpound);
+
+ /*
+ * If the MainText is not an image map menu,
+ * do the docs have different POST contents?
+ */
+ if (MTaddress == MTanc->address) {
+ if (MTanc->post_data) {
+ if (anchor->post_data) {
+ if (!BINEQ(MTanc->post_data, anchor->post_data)) {
+ /*
+ * Both have contents, and they differ.
+ */
+ return (TRUE);
+ }
+ } else {
+ /*
+ * The loaded document has content, but the
+ * target doesn't, so they're different.
+ */
+ return (TRUE);
+ }
+ } else if (anchor->post_data) {
+ /*
+ * The loaded document does not have content, but
+ * the target does, so they're different.
+ */
+ return (TRUE);
+ }
+ }
+
+ /*
+ * We'll assume the target is a position in the currently
+ * displayed document, and thus can ignore any header, META,
+ * or other directives not to use a cached rendition. -FM
+ */
+ return (FALSE);
+}
+
+#define CanTrimTextArea(c) \
+ (LYtrimInputFields ? isspace(c) : ((c) == '\r' || (c) == '\n'))
+
+/*
+ * Re-render the text of a tagged ("[123]") HTLine (arg1), with the tag
+ * number incremented by some value (arg5). The re-rendered string may
+ * be allowed to expand in the event of a tag width change (eg, 99 -> 100)
+ * as controlled by arg6 (CHOP or NOCHOP). Arg4 is either (the address
+ * of) a value which must match, in order for the tag to be incremented,
+ * or (the address of) a 0-value, which will match any value, and cause
+ * any valid tag to be incremented. Arg2 is a pointer to the first/only
+ * anchor that exists on the line; we may need to adjust their position(s)
+ * on the line. Arg3 when non-0 indicates the number of new digits that
+ * were added to the 2nd line in a line crossing pair.
+ *
+ * All tags fields in a line which individually match an expected new value,
+ * are incremented. Line crossing [tags] are handled (PITA).
+ *
+ * Untagged or improperly tagged lines are not altered.
+ *
+ * Returns the number of chars added to the original string's length, if
+ * any.
+ *
+ * --KED 02/03/99
+ */
+static int increment_tagged_htline(HTLine *ht, TextAnchor *a, int *lx_val,
+ int *old_val,
+ int incr,
+ int mode)
+{
+ char buf[MAX_LINE];
+ char lxbuf[MAX_LINE * 2];
+
+ TextAnchor *st_anchor = a;
+ TextAnchor *nxt_anchor;
+
+ char *p = ht->data;
+ char *s = buf;
+ char *lx = lxbuf;
+ char *t;
+
+ BOOLEAN plx = FALSE;
+ BOOLEAN valid;
+
+ int val;
+ int n;
+ int new_n;
+ int pre_n;
+ int post_n;
+ int fixup = 0;
+
+ /*
+ * Cleanup for the 2nd half of a line crosser, whose number of tag
+ * digits grew by some number of places (usually 1 when it does
+ * happen, though it *could* be more). The tag chars were already
+ * rendered into the 2nd line of the pair, but the positioning and
+ * other effects haven't been rippled through any other anchors on
+ * the (2nd) line. So we do that here, as a special case, since
+ * the part of the tag that's in the 2nd line of the pair, will not
+ * be found by the tag string parsing code. Double PITA.
+ *
+ * [see comments below on line crosser caused problems]
+ */
+ if (*lx_val != 0) {
+ nxt_anchor = st_anchor;
+ while ((nxt_anchor) && (nxt_anchor->line_num == a->line_num)) {
+ nxt_anchor->line_pos = (short) (nxt_anchor->line_pos + *lx_val);
+ nxt_anchor = nxt_anchor->next;
+ }
+ fixup = *lx_val;
+ *lx_val = 0;
+ if (st_anchor)
+ st_anchor = st_anchor->next;
+ }
+
+ /*
+ * Walk thru the line looking for tags (ie, "[nnn]" strings).
+ */
+ while (*p != '\0') {
+ if (*p != '[') {
+ *s++ = *p++;
+ continue;
+
+ } else {
+ *s++ = *p++;
+ t = p;
+ n = 0;
+ valid = TRUE; /* p = t = byte after '[' */
+
+ /*
+ * Make sure there are only digits between "[" and "]".
+ */
+ while (*t != ']') {
+ if (*t == '\0') { /* uhoh - we have a potential line crosser */
+ valid = FALSE;
+ plx = TRUE;
+ break;
+ }
+ if (isdigit(UCH(*t++))) {
+ n++;
+ continue;
+ } else {
+ valid = FALSE;
+ break;
+ }
+ }
+
+ /*
+ * If the format is OK, we check to see if the value is what
+ * we expect. If not, we have a random [nn] string in the text,
+ * and leave it alone.
+ *
+ * [It is *possible* to have a false match here, *if* there are
+ * two identical [nn] strings (including the numeric value of
+ * nn), one of which is the [tag], and the other being part of
+ * a document. In such a case, the 1st [nn] string will get
+ * incremented; the 2nd one won't, which makes it a 50-50 chance
+ * of being correct, if and when such an unlikely juxtaposition
+ * of text ever occurs. Further validation tests of the [nnn]
+ * string are probably not possible, since little of the actual
+ * anchor-associated-text is retained in the TextAnchor or the
+ * FormInfo structs. Fortunately, I think the current method is
+ * more than adequate to weed out 99.999% of any possible false
+ * matches, just as it stands. Caveat emptor.]
+ */
+ if ((valid) && (n > 0)) {
+ val = atoi(p);
+ if ((val == *old_val) || (*old_val == 0)) { /* 0 matches all */
+ if (*old_val != 0)
+ (*old_val)++;
+ val += incr;
+ sprintf(s, "%d", val);
+ new_n = (int) strlen(s);
+ s += new_n;
+ p += n;
+
+ /*
+ * If the number of digits in an existing [tag] increased
+ * (eg, [99] --> [100], etc), we need to "adjust" its
+ * horizontal position, and that of all subsequent tags
+ * that may be on the same line. PITA.
+ *
+ * [This seems to work as long as a tag isn't a line
+ * crosser; when it is, the position of anchors on either
+ * side of the split tag, seem to "float" and try to be
+ * as "centered" as possible. Which means that simply
+ * incrementing the line_pos by the fixed value of the
+ * number of digits that got added to some tag in either
+ * line doesn't work quite right, and the text for (say)
+ * a button may get stomped on by another copy of itself,
+ * but offset by a few chars, when it is selected (eg,
+ * "Box Office" may end up looking like "BoBox Office" or
+ * "Box Officece", etc.
+ *
+ * Dunno how to fix that behavior ATT, but at least the
+ * tag numbers themselves are correct. -KED /\oo/\ ]
+ */
+ if ((new_n -= n) != 0) {
+ nxt_anchor = st_anchor;
+ while ((nxt_anchor) &&
+ (nxt_anchor->line_num == a->line_num)) {
+ nxt_anchor->line_pos = (short) (nxt_anchor->line_pos
+ + new_n);
+ nxt_anchor = nxt_anchor->next;
+ }
+ if (st_anchor)
+ st_anchor = st_anchor->next;
+ }
+ }
+ }
+
+ /*
+ * Unfortunately, valid [tag] strings *can* be split across two
+ * lines. Perhaps it would be best to just prevent that from
+ * happening, but a look into that code, makes me wonder. Anyway,
+ * we can handle such tags without *too* much trouble in here [I
+ * think], though since such animals are rather rare, it makes it
+ * a bit difficult to test thoroughly (ie, Beyond here, there be
+ * Dragons).
+ *
+ * We use lxbuf[] to deal with the two lines involved.
+ */
+ pre_n = (int) strlen(p); /* count of 1st part chars in this line */
+ post_n = (int) strlen(ht->next->data);
+ if (plx
+ && (pre_n + post_n + 2 < (int) sizeof(lxbuf))) {
+ strcpy(lx, p); /* <- 1st part of a possible lx'ing tag */
+ strcat(lx, ht->next->data); /* tack on NEXT line */
+
+ t = lx;
+ n = 0;
+ valid = TRUE;
+
+ /*
+ * Go hunting again for just digits, followed by tag end ']'.
+ */
+ while (*t != ']') {
+ if (isdigit(UCH(*t++))) {
+ n++;
+ continue;
+ } else {
+ valid = FALSE;
+ break;
+ }
+ }
+
+ /*
+ * It *looks* like a line crosser; now we value test it to
+ * find out for sure [but see the "false match" warning,
+ * above], and if it matches, increment it into the buffer,
+ * along with the 2nd line's text.
+ */
+ if ((valid)
+ && (n > 0)
+ && (n + post_n + 2) < MAX_LINE) {
+ val = atoi(lx);
+ if ((val == *old_val) || (*old_val == 0)) {
+ const char *r;
+
+ if (*old_val != 0)
+ (*old_val)++;
+ val += incr;
+ sprintf(lx, "%d", val);
+ new_n = (int) strlen(lx);
+ if ((r = StrChr(ht->next->data, ']')) == 0) {
+ r = "";
+ }
+ strcat(lx, r);
+
+ /*
+ * We keep the the same number of chars from the
+ * adjusted tag number in the current line; any
+ * extra chars due to a digits increase, will be
+ * stuffed into the next line.
+ *
+ * Keep track of any digits added, for the next
+ * pass through.
+ */
+ s = StrNCpy(s, lx, pre_n) + pre_n;
+ lx += pre_n;
+ strcpy(ht->next->data, lx);
+
+ *lx_val = new_n - n;
+ }
+ }
+ break; /* had an lx'er, so we're done with this line */
+ }
+ }
+ }
+
+ *s = '\0';
+
+ n = (int) strlen(ht->data);
+ if (mode == CHOP) {
+ *(buf + n) = '\0';
+ } else if (strlen(buf) > ht->size) {
+ /* we didn't allocate enough space originally - increase it */
+ HTLine *temp;
+
+ allocHTLine(temp, strlen(buf));
+ if (!temp)
+ outofmem(__FILE__, "increment_tagged_htline");
+
+ memcpy(temp, ht, LINE_SIZE(0));
+#if defined(USE_COLOR_STYLE)
+ POOLallocstyles(temp->styles, ht->numstyles);
+ if (!temp->styles)
+ outofmem(__FILE__, "increment_tagged_htline");
+ memcpy(temp->styles, ht->styles, sizeof(HTStyleChange) * ht->numstyles);
+#endif
+ ht = temp;
+ ht->prev->next = ht; /* Link in new line */
+ ht->next->prev = ht; /* Could be same node of course */
+ }
+ strcpy(ht->data, buf);
+
+ return ((int) strlen(buf) - n + fixup);
+}
+
+/*
+ * Creates a new anchor and associated struct's appropriate for a form
+ * TEXTAREA, and links them into the lists following the current anchor
+ * position (as specified by arg1).
+ *
+ * Exits with arg1 now pointing at the new TextAnchor, and arg2 pointing
+ * at the new, associated HTLine.
+ *
+ * --KED 02/13/99
+ */
+static void insert_new_textarea_anchor(TextAnchor **curr_anchor, HTLine **exit_htline)
+{
+ TextAnchor *anchor = *curr_anchor;
+ HTLine *htline;
+
+ TextAnchor *a = 0;
+ FormInfo *f = 0;
+ HTLine *l = 0;
+
+ int curr_tag = 0; /* 0 ==> match any [tag] number */
+ int lx = 0; /* 0 ==> no line crossing [tag]; it's a new line */
+ int i;
+
+ /*
+ * Find line in the text that matches ending anchorline of
+ * the TEXTAREA.
+ *
+ * [Yes, Virginia ... we *do* have to go thru this for each
+ * anchor being added, since there is NOT a 1-to-1 mapping
+ * between anchors and htlines. I suppose we could create
+ * YAS (Yet Another Struct), but there are too many structs{}
+ * floating around in here, as it is. IMNSHO.]
+ */
+ for (htline = FirstHTLine(HTMainText), i = 0; anchor->line_num != i; i++) {
+ htline = htline->next;
+ if (htline == HTMainText->last_line)
+ break;
+ }
+
+ /*
+ * Clone and initialize the struct's needed to add a new TEXTAREA
+ * anchor.
+ */
+ allocHTLine(l, MAX_LINE);
+ POOLtypecalloc(TextAnchor, a);
+
+ POOLtypecalloc(FormInfo, f);
+ if (a == NULL || l == NULL || f == NULL)
+ outofmem(__FILE__, "insert_new_textarea_anchor");
+
+ /* Init all the fields in the new TextAnchor. */
+ /* [anything "special" needed based on ->show_anchor value ?] */
+ a->next = anchor->next;
+ a->number = anchor->number;
+ a->line_pos = anchor->line_pos;
+ a->extent = anchor->extent;
+ a->sgml_offset = SGML_offset();
+ a->line_num = anchor->line_num + 1;
+ LYCopyHiText(a, anchor);
+ a->link_type = anchor->link_type;
+ a->input_field = f;
+ a->show_anchor = anchor->show_anchor;
+ a->inUnderline = anchor->inUnderline;
+ a->expansion_anch = TRUE;
+ a->anchor = NULL;
+
+ /* Just the (seemingly) relevant fields in the new FormInfo. */
+ /* [do we need to do anything "special" based on ->disabled] */
+ StrAllocCopy(f->name, anchor->input_field->name);
+ f->number = anchor->input_field->number;
+ f->type = anchor->input_field->type;
+ StrAllocCopy(f->orig_value, "");
+ f->size = anchor->input_field->size;
+ f->maxlength = anchor->input_field->maxlength;
+ f->no_cache = anchor->input_field->no_cache;
+ f->disabled = anchor->input_field->disabled;
+ f->readonly = anchor->input_field->readonly;
+ f->value_cs = current_char_set; /* use current setting - kw */
+
+ /* Init all the fields in the new HTLine (but see the #if). */
+ l->next = htline->next;
+ l->prev = htline;
+ l->offset = htline->offset;
+ l->size = htline->size;
+#if defined(USE_COLOR_STYLE)
+ /* dup styles[] if needed [no need in TEXTAREA (?); leave 0's] */
+ l->numstyles = htline->numstyles;
+ /*we fork the pointers! */
+ l->styles = htline->styles;
+#endif
+ strcpy(l->data, htline->data);
+
+ /*
+ * Link in the new HTLine.
+ */
+ htline->next->prev = l;
+ htline->next = l;
+
+ if (fields_are_numbered()) {
+ a->number++;
+ increment_tagged_htline(l, a, &lx, &curr_tag, 1, CHOP);
+ }
+
+ /*
+ * If we're at the tail end of the TextAnchor or HTLine list(s),
+ * the new node becomes the last node.
+ */
+ if (anchor == HTMainText->last_anchor)
+ HTMainText->last_anchor = a;
+ if (htline == HTMainText->last_line)
+ HTMainText->last_line = l;
+
+ /*
+ * Link in the new TextAnchor and point the entry anchor arg at it;
+ * point the entry HTLine arg at it, too.
+ */
+ anchor->next = a;
+ *curr_anchor = a;
+
+ *exit_htline = l->next;
+
+ return;
+}
+
+/*
+ * If new anchors were added to expand a TEXTAREA, we need to ripple the
+ * new line numbers [and char counts ?] thru the subsequent anchors.
+ *
+ * If form lines are getting [nnn] tagged, we need to update the displayed
+ * tag values to match (which means rerendering them ... sigh).
+ *
+ * Finally, we need to update various HTMainText and other counts, etc.
+ *
+ * [dunno if the char counts really *need* to be done, or if we're using
+ * the exactly proper values/algorithms ... seems to be OK though ...]
+ *
+ * --KED 02/13/99
+ */
+static void update_subsequent_anchors(int newlines,
+ TextAnchor *start_anchor,
+ HTLine *start_htline,
+ int start_tag)
+{
+ TextAnchor *anchor;
+ HTLine *htline = start_htline;
+
+ int line_adj = 0;
+ int lx = 0;
+ int hang = 0; /* for HANG detection of a nasty intermittent */
+ int hang_detect = 100000; /* ditto */
+
+ CTRACE((tfp, "GridText: adjusting struct's to add %d new line(s)\n", newlines));
+
+ /*
+ * Update numeric fields of the rest of the anchors.
+ *
+ * [We bypass bumping ->number if it has a value of 0, which takes care
+ * of the ->input_field->type == F_HIDDEN_TYPE (as well as any other
+ * "hidden" anchors, if such things exist). Seems like the "right
+ * thing" to do. I think.]
+ */
+ anchor = start_anchor->next; /* begin updating with the NEXT anchor */
+ while (anchor) {
+ if (fields_are_numbered() &&
+ (anchor->number != 0))
+ anchor->number += newlines;
+ anchor->line_num += newlines;
+ anchor = anchor->next;
+ }
+
+ /*
+ * Update/rerender anchor [tags], if they are being numbered.
+ *
+ * [If a number tag (eg, "[177]") is itself broken across a line
+ * boundary, this fixup only partially works. While the tag
+ * numbering is done properly across the pair of lines, the
+ * horizontal positioning on *either* side of the split, can get
+ * out of sync by a char or two when it gets selected. See the
+ * [comments] in increment_tagged_htline() for some more detail.
+ *
+ * I suppose THE fix is to prevent such tag-breaking in the first
+ * place (dunno where yet, though). Ah well ... at least the tag
+ * numbers themselves are correct from top to bottom now.
+ *
+ * All that said, about the only time this will be a problem in
+ * *practice*, is when a page has near 1000 links or more (possibly
+ * after a TEXTAREA expansion), and has line crossing tag(s), and
+ * the tag numbers in a line crosser go from initially all 3 digit
+ * numbers, to some mix of 3 and 4 digits (or all 4 digits) as a
+ * result of the expansion process. Oh, you also need a "clump" of
+ * anchors all on the same lines.
+ *
+ * Yes, it *can* happen, but in real life, it probably won't be
+ * seen very much ...]
+ *
+ * [This may also be an artifact of bumping into the right hand
+ * screen edge (or RHS margin), since we don't even *think* about
+ * relocating an anchor to the following line, when [tag] digits
+ * expansion pushes things too far in that direction.]
+ */
+ if (fields_are_numbered()) {
+ anchor = start_anchor->next;
+ while (htline != FirstHTLine(HTMainText)) {
+
+ while (anchor) {
+ if ((anchor->number - newlines) == start_tag)
+ break;
+
+ /*** A HANG (infinite loop) *has* occurred here, with */
+ /*** the values of anchor and anchor->next being the */
+ /*** the same, OR with anchor->number "magically" and */
+ /*** suddenly taking on an anchor-pointer-like value. */
+ /*** */
+ /*** The same code and same doc have both passed and */
+ /*** failed at different times, which indicates some */
+ /*** sort of content/html dependency, or some kind of */
+ /*** a "race" condition, but I'll be damned if I can */
+ /*** find it after tons of CTRACE's, printf()'s, gdb */
+ /*** breakpoints and watchpoints, etc. */
+ /*** */
+ /*** I have added a hang detector (with error msg and */
+ /*** beep) here, to break the loop and warn the user, */
+ /*** until it can be isolated and fixed. */
+ /*** */
+ /*** [One UGLY intermittent .. gak ..! 02/22/99 KED] */
+
+ hang++;
+ if ((anchor == anchor->next) || (hang >= hang_detect))
+ goto hang_detected;
+
+ anchor = anchor->next;
+ }
+
+ if (anchor) {
+ line_adj = increment_tagged_htline(htline, anchor, &lx,
+ &start_tag, newlines,
+ NOCHOP);
+ htline->size = (unsigned short) (htline->size + line_adj);
+
+ } else {
+
+ break; /* out of anchors ... we're done */
+ }
+
+ htline = htline->next;
+ }
+ }
+
+ finish:
+ /*
+ * Fixup various global variables.
+ */
+ nlinks += newlines;
+ HTMainText->Lines += newlines;
+ HTMainText->last_anchor_number += newlines;
+
+ more_text = HText_canScrollDown();
+
+ CTRACE((tfp, "GridText: TextAnchor and HTLine struct's adjusted\n"));
+
+ return;
+
+ hang_detected: /* ugliness has happened; inform user and do the best we can */
+
+ HTAlert(gettext("Hang Detect: TextAnchor struct corrupted - suggest aborting!"));
+ goto finish;
+}
+
+/*
+ * Check if the given anchor is a TEXTAREA belonging to the given form.
+ *
+ * KED's note -
+ * [Finding the TEXTAREA we're actually *in* with these attributes isn't
+ * foolproof. The form number isn't unique to a given TEXTAREA, and there
+ * *could* be TEXTAREA's with the same "name". If that should ever be true,
+ * we'll actually get the data from the *1st* TEXTAREA in the page that
+ * matches. We should probably assign a unique id to each TEXTAREA in a page,
+ * and match on that, to avoid this (potential) problem.
+ *
+ * Since the odds of "false matches" *actually* happening in real life seem
+ * rather small though, we'll hold off doing this, for a rainy day ...]
+ */
+static BOOLEAN IsFormsTextarea(FormInfo * form, TextAnchor *anchor_ptr)
+{
+ return (BOOLEAN) ((anchor_ptr->link_type == INPUT_ANCHOR) &&
+ (anchor_ptr->input_field->type == F_TEXTAREA_TYPE) &&
+ (anchor_ptr->input_field->number == form->number) &&
+ !strcmp(anchor_ptr->input_field->name, form->name));
+}
+
+static char *readEditedFile(char *ed_temp)
+{
+ struct stat stat_info;
+ size_t size;
+
+ FILE *fp;
+
+ char *ebuf;
+
+ CTRACE((tfp, "GridText: entered HText_EditTextArea()\n"));
+
+ /*
+ * Read back the edited temp file into our buffer.
+ */
+ if ((stat(ed_temp, &stat_info) < 0) ||
+ !S_ISREG(stat_info.st_mode) ||
+ ((size = (size_t) stat_info.st_size) == 0)) {
+ size = 0;
+ ebuf = typecalloc(char);
+
+ if (!ebuf)
+ outofmem(__FILE__, "HText_EditTextArea");
+ } else {
+ ebuf = typecallocn(char, size + 1);
+
+ if (!ebuf) {
+ /*
+ * This could be huge - don't exit if we don't have enough
+ * memory for it. With some luck, the user may be even able
+ * to recover the file manually from the temp space while
+ * the lynx session is not over. - kw
+ */
+ HTAlwaysAlert(NULL, MEMORY_EXHAUSTED_FILE);
+ return 0;
+ }
+
+ if ((fp = fopen(ed_temp, "r")) != 0) {
+ size = fread(ebuf, (size_t) 1, size, fp);
+ LYCloseInput(fp);
+ ebuf[size] = '\0'; /* Terminate! - kw */
+ } else {
+ size = 0;
+ }
+ }
+
+ /*
+ * Nuke any blank lines from the end of the edited data.
+ */
+ while ((size != 0)
+ && (CanTrimTextArea(UCH(ebuf[size - 1])) || (ebuf[size - 1] == '\0')))
+ ebuf[--size] = '\0';
+
+ return ebuf;
+}
+
+static int finish_ExtEditForm(LinkInfo * form_link, TextAnchor *start_anchor,
+ char *ed_temp,
+ int orig_cnt)
+{
+ TextAnchor *anchor_ptr;
+ TextAnchor *end_anchor = NULL;
+ BOOLEAN wrapalert = FALSE;
+
+ int entry_line = form_link->anchor_line_num;
+ int exit_line = 0;
+ int line_cnt = 1;
+
+ HTLine *htline = NULL;
+
+ char *ebuf;
+ char *line;
+ char *lp;
+ char *cp;
+ int match_tag = 0;
+ int newlines = 0;
+ int len, len0;
+ int display_size;
+ int wanted_fieldlen_wrap = -1; /* not yet asked; 0 means don't. */
+ char *skip_at = NULL;
+ int skip_num = 0, i;
+ size_t line_used = MAX_LINE;
+
+ CTRACE((tfp, "GridText: entered HText_EditTextArea()\n"));
+
+ if ((ebuf = readEditedFile(ed_temp)) == 0) {
+ return 0;
+ }
+
+ /*
+ * Copy each line from the temp file into the corresponding anchor
+ * struct. Add new lines to the TEXTAREA if needed. (Always leave
+ * the user with a blank line at the end of the TEXTAREA.)
+ */
+ if ((line = typeMallocn(char, line_used)) == 0)
+ outofmem(__FILE__, "HText_EditTextArea");
+
+ anchor_ptr = start_anchor;
+ display_size = anchor_ptr->input_field->size;
+ if (display_size <= 4 ||
+ display_size >= MAX_LINE)
+ wanted_fieldlen_wrap = 0;
+
+ len = 0;
+ lp = ebuf;
+
+ while ((line_cnt <= orig_cnt) || (*lp) || ((len != 0) && (*lp == '\0'))) {
+
+ if (skip_at) {
+ len0 = (int) (skip_at - lp);
+ LYStrNCpy(line, lp, len0);
+ lp = skip_at + skip_num;
+ skip_at = NULL;
+ skip_num = 0;
+
+ assert(lp != NULL);
+ } else {
+ len0 = 0;
+ }
+ line[len0] = '\0';
+
+ if ((cp = StrChr(lp, '\n')) != 0)
+ len = (int) (cp - lp);
+ else
+ len = (int) strlen(lp);
+
+ if (wanted_fieldlen_wrap < 0 &&
+ !wrapalert &&
+ len0 + len >= display_size &&
+ (cp = StrChr(lp, ' ')) != NULL &&
+ (cp - lp) < display_size - 1) {
+
+ LYFixCursesOn("ask for confirmation:");
+ LYerase(); /* don't show previous state */
+ if (HTConfirmDefault(gettext("Wrap lines to fit displayed area?"),
+ NO)) {
+ wanted_fieldlen_wrap = display_size - 1;
+ } else {
+ wanted_fieldlen_wrap = 0;
+ }
+ }
+
+ if (wanted_fieldlen_wrap > 0 &&
+ len0 + len > wanted_fieldlen_wrap) {
+
+ for (i = wanted_fieldlen_wrap - len0;
+ i + len0 >= wanted_fieldlen_wrap / 4; i--) {
+
+ if (isspace(UCH(lp[i]))) {
+ len = i + 1;
+ cp = lp + i;
+ if (cp[1] != '\n' &&
+ isspace(UCH(cp[1])) &&
+ !isspace(UCH(cp[2]))) {
+ len++;
+ cp++;
+ }
+ if (!isspace(UCH(cp[1]))) {
+ while (*cp && *cp != '\r' && *cp != '\n' &&
+ (cp - lp) <= len + (3 * wanted_fieldlen_wrap / 4))
+ cp++; /* search for next line break */
+ if (*cp == '\r' && cp[1] == '\n')
+ cp++;
+ if (*cp == '\n' &&
+ (cp[1] == '\r' || cp[1] == '\n' ||
+ !isspace(UCH(cp[1])))) {
+ *cp = ' ';
+ while (isspace(UCH(*(cp - 1)))) {
+ skip_num++;
+ cp--;
+ }
+ skip_at = cp;
+ }
+ }
+ break;
+ }
+ }
+ }
+
+ if (wanted_fieldlen_wrap > 0 &&
+ (len0 + len) > wanted_fieldlen_wrap) {
+
+ i = len - 1;
+ while (len0 + i + 1 > wanted_fieldlen_wrap &&
+ isspace(UCH(lp[i])))
+ i--;
+ if (len0 + i + 1 > wanted_fieldlen_wrap)
+ len = wanted_fieldlen_wrap - len0;
+ }
+
+ /*
+ * Check if the new text will fit in the buffer. HTML does not define
+ * a "maxlength" attribute for TEXTAREA; its data can grow as needed.
+ * Lynx will not adjust the display to reflect larger amounts of text;
+ * it relies on the rows/cols attributes as well as the initial content
+ * of the text area for the layout.
+ */
+ if ((size_t) (len0 + len) >= line_used) {
+ line_used = (size_t) (3 * (len0 + len)) / 2;
+ if ((line = typeRealloc(char, line, line_used)) == 0)
+ outofmem(__FILE__, "HText_EditTextArea");
+ }
+
+ strncat(line, lp, (size_t) len);
+ *(line + len0 + len) = '\0';
+
+ /*
+ * If there are more lines in the edit buffer than were in the
+ * original TEXTAREA, we need to add a new line/anchor, continuing
+ * on until the edit buffer is empty.
+ */
+ if (line_cnt > orig_cnt) {
+ insert_new_textarea_anchor(&end_anchor, &htline);
+
+ assert(end_anchor != NULL);
+ assert(end_anchor->input_field != NULL);
+
+ anchor_ptr = end_anchor; /* make the new anchor current */
+ newlines++;
+ }
+
+ assert(anchor_ptr != NULL);
+
+ /*
+ * Finally copy the new line from the edit buffer into the anchor.
+ */
+ StrAllocCopy(anchor_ptr->input_field->value, line);
+
+ /*
+ * Keep track of 1st blank line in any trailing blank lines, for
+ * later cursor repositioning.
+ */
+ if (len0 + len > 0)
+ exit_line = 0;
+ else if (exit_line == 0)
+ exit_line = anchor_ptr->line_num;
+
+ /*
+ * And do the next line of edited text, for the next anchor ...
+ */
+ lp += len;
+ if (*lp && isspace(UCH(*lp)))
+ lp++;
+
+ end_anchor = anchor_ptr;
+ anchor_ptr = anchor_ptr->next;
+
+ if (anchor_ptr)
+ match_tag = anchor_ptr->number;
+
+ line_cnt++;
+ }
+
+ CTRACE((tfp, "GridText: edited text inserted into lynx struct's\n"));
+
+ /*
+ * If we've added any new lines/anchors, we need to adjust various
+ * things in all anchor-bearing lines following the last newly added
+ * line/anchor. The fun stuff starts here ...
+ */
+ if (newlines > 0)
+ update_subsequent_anchors(newlines, end_anchor, htline, match_tag);
+
+ /*
+ * Cleanup time.
+ */
+ FREE(line);
+ FREE(ebuf);
+
+ /*
+ * Return the offset needed to move the cursor from its current
+ * (on entry) line number, to the 1st blank line of the trailing
+ * (group of) blank line(s), which is where we want to be. Let
+ * the caller deal with moving us there, however ... :-) ...
+ */
+ return (exit_line - entry_line);
+}
+
+/*
+ * Transfer the initial contents of a TEXTAREA to a temp file, invoke the
+ * user's editor on that file, then transfer the contents of the resultant
+ * edited file back into the TEXTAREA (expanding the size of the area, if
+ * required).
+ *
+ * Returns the number of lines that the cursor should be moved so that it
+ * will end up on the 1st blank line of whatever number of trailing blank
+ * lines there are in the TEXTAREA (there will *always* be at least one).
+ *
+ * --KED 02/01/99
+ */
+int HText_EditTextArea(LinkInfo * form_link)
+{
+ char *ed_temp;
+ FILE *fp;
+
+ TextAnchor *anchor_ptr;
+ TextAnchor *start_anchor = NULL;
+ BOOLEAN firstanchor = TRUE;
+
+ char ed_offset[DigitsOf(int) + 3];
+ int start_line = 0;
+ int entry_line = form_link->anchor_line_num;
+ int orig_cnt = 0;
+ int offset = 0;
+
+ FormInfo *form = form_link->l_form;
+
+ CTRACE((tfp, "GridText: entered HText_EditTextArea()\n"));
+
+ if ((ed_temp = typeMallocn(char, LY_MAXPATH)) == 0) {
+ outofmem(__FILE__, "HText_EditTextArea");
+ } else if ((fp = LYOpenTemp(ed_temp, "", "w")) != 0) {
+
+ /*
+ * Begin at the beginning, to find 1st anchor in the TEXTAREA, then
+ * write all of its lines (anchors) out to the edit temp file.
+ */
+ anchor_ptr = HTMainText->first_anchor;
+
+ while (anchor_ptr) {
+
+ if (IsFormsTextarea(form, anchor_ptr)) {
+
+ if (firstanchor) {
+ firstanchor = FALSE;
+ start_anchor = anchor_ptr;
+ start_line = anchor_ptr->line_num;
+ }
+ orig_cnt++;
+
+ /*
+ * Write the anchors' text to the temp edit file.
+ */
+ fputs(anchor_ptr->input_field->value, fp);
+ fputc('\n', fp);
+
+ } else {
+
+ if (!firstanchor)
+ break;
+ }
+ anchor_ptr = anchor_ptr->next;
+ }
+ LYCloseTempFP(fp);
+
+ if (start_anchor != 0) {
+ CTRACE((tfp, "GridText: TEXTAREA name=|%s| dumped to tempfile\n", form->name));
+ CTRACE((tfp, "GridText: invoking editor (%s) on tempfile\n", editor));
+
+ /*
+ * Go edit the TEXTAREA temp file, with the initial editor line
+ * corresponding to the TEXTAREA line the cursor is on (if such
+ * positioning is supported by the editor [as lynx knows it]).
+ */
+ ed_offset[0] = 0; /* pre-ANSI compilers don't initialize aggregates - TD */
+ if (((entry_line - start_line) > 0) && editor_can_position())
+ sprintf(ed_offset, "%d", ((entry_line - start_line) + 1));
+
+ edit_temporary_file(ed_temp, ed_offset, NULL);
+
+ CTRACE((tfp, "GridText: returned from editor (%s)\n", editor));
+
+ if (!form->disabled)
+ offset = finish_ExtEditForm(form_link, start_anchor, ed_temp, orig_cnt);
+
+ CTRACE((tfp, "GridText: exiting HText_EditTextArea()\n"));
+ }
+ (void) LYRemoveTemp(ed_temp);
+ FREE(ed_temp);
+ }
+
+ /*
+ * Return the offset needed to move the cursor from its current
+ * (on entry) line number, to the 1st blank line of the trailing
+ * (group of) blank line(s), which is where we want to be. Let
+ * the caller deal with moving us there, however ... :-) ...
+ */
+ return offset;
+}
+
+/*
+ * Similar to HText_EditTextArea, but assume a single-line text field -TD
+ */
+void HText_EditTextField(LinkInfo * form_link)
+{
+ char *ed_temp;
+ FILE *fp;
+
+ FormInfo *form = form_link->l_form;
+
+ CTRACE((tfp, "GridText: entered HText_EditTextField()\n"));
+
+ ed_temp = typeMallocn(char, LY_MAXPATH);
+
+ if ((fp = LYOpenTemp(ed_temp, "", "w")) == 0) {
+ FREE(ed_temp);
+ return;
+ }
+
+ /*
+ * Write the anchors' text to the temp edit file.
+ */
+ fputs(form->value, fp);
+ fputc('\n', fp);
+
+ LYCloseTempFP(fp);
+
+ CTRACE((tfp, "GridText: text field |%s| dumped to tempfile\n", form_link->lname));
+ CTRACE((tfp, "GridText: invoking editor (%s) on tempfile\n", editor));
+
+ edit_temporary_file(ed_temp, "", NULL);
+
+ CTRACE((tfp, "GridText: returned from editor (%s)\n", editor));
+
+ if (!form->disabled) {
+ char *ebuf;
+ char *p;
+
+ if ((ebuf = readEditedFile(ed_temp)) != 0) {
+ /*
+ * Only use the first line of the result.
+ */
+ for (p = ebuf; *p != '\0'; ++p) {
+ if (*p == '\n' || *p == '\r') {
+ *p = '\0';
+ break;
+ }
+ }
+ StrAllocCopy(form->value, ebuf);
+ FREE(ebuf);
+ }
+ }
+
+ (void) LYRemoveTemp(ed_temp);
+ FREE(ed_temp);
+
+ CTRACE((tfp, "GridText: exiting HText_EditTextField()\n"));
+}
+
+/*
+ * Expand the size of a TEXTAREA by a fixed number of lines (as specified
+ * by arg2).
+ *
+ * --KED 02/14/99
+ */
+void HText_ExpandTextarea(LinkInfo * form_link, int newlines)
+{
+ TextAnchor *anchor_ptr;
+ TextAnchor *end_anchor = NULL;
+ BOOLEAN firstanchor = TRUE;
+
+ FormInfo *form = form_link->l_form;
+
+ HTLine *htline = NULL;
+
+ int match_tag = 0;
+ int i;
+
+ CTRACE((tfp, "GridText: entered HText_ExpandTextarea()\n"));
+
+ if (newlines < 1)
+ return;
+
+ /*
+ * Begin at the beginning, to find the TEXTAREA, then on to find
+ * the last line (anchor) in it.
+ */
+ anchor_ptr = HTMainText->first_anchor;
+
+ while (anchor_ptr) {
+
+ if (IsFormsTextarea(form, anchor_ptr)) {
+
+ if (firstanchor)
+ firstanchor = FALSE;
+
+ end_anchor = anchor_ptr;
+
+ } else {
+
+ if (!firstanchor)
+ break;
+ }
+ anchor_ptr = anchor_ptr->next;
+ }
+
+ if (end_anchor == NULL)
+ return;
+
+ for (i = 1; i <= newlines; i++) {
+ insert_new_textarea_anchor(&end_anchor, &htline);
+
+ /*
+ * Make the new line blank.
+ */
+ StrAllocCopy(end_anchor->input_field->value, "");
+
+ /*
+ * And go add another line ...
+ */
+ if (end_anchor->next)
+ match_tag = end_anchor->next->number;
+ }
+
+ CTRACE((tfp, "GridText: %d blank line(s) added to TEXTAREA name=|%s|\n",
+ newlines, form->name));
+
+ /*
+ * We need to adjust various things in all anchor bearing lines
+ * following the last newly added line/anchor. Fun stuff.
+ */
+ update_subsequent_anchors(newlines, end_anchor, htline, match_tag);
+
+ CTRACE((tfp, "GridText: exiting HText_ExpandTextarea()\n"));
+
+ return;
+}
+
+/*
+ * Insert the contents of a file into a TEXTAREA between the cursor line,
+ * and the line preceding it.
+ *
+ * Returns the number of lines that the cursor should be moved so that it
+ * will end up on the 1st line in the TEXTAREA following the inserted file
+ * (if we decide to do that).
+ *
+ * --KED 02/21/99
+ */
+int HText_InsertFile(LinkInfo * form_link)
+{
+ struct stat stat_info;
+ size_t size;
+
+ FILE *fp;
+ char *fn;
+
+ TextAnchor *anchor_ptr;
+ TextAnchor *prev_anchor = NULL;
+ TextAnchor *end_anchor = NULL;
+ BOOLEAN firstanchor = TRUE;
+ BOOLEAN truncalert = FALSE;
+
+ FormInfo *form = form_link->l_form;
+
+ HTLine *htline = NULL;
+
+ TextAnchor *a = 0;
+ FormInfo *f = 0;
+ HTLine *l = 0;
+
+ char *fbuf = 0;
+ char *line = 0;
+ char *lp;
+ char *cp;
+ int entry_line = form_link->anchor_line_num;
+ int file_cs;
+ int match_tag = 0;
+ int newlines = 0;
+ int len;
+ int i;
+
+ CTRACE((tfp, "GridText: entered HText_InsertFile()\n"));
+
+ /*
+ * Get the filename of the insert file.
+ */
+ if (!(fn = GetFileName())) {
+ HTInfoMsg(FILE_INSERT_CANCELLED);
+ CTRACE((tfp,
+ "GridText: file insert cancelled - no filename provided\n"));
+ return (0);
+ }
+ if (no_dotfiles || !show_dotfiles) {
+ if (*LYPathLeaf(fn) == '.') {
+ HTUserMsg(FILENAME_CANNOT_BE_DOT);
+ return (0);
+ }
+ }
+
+ /*
+ * Read it into our buffer (abort on 0-length file).
+ */
+ if ((stat(fn, &stat_info) < 0) ||
+ ((size = (size_t) stat_info.st_size) == 0)) {
+ HTInfoMsg(FILE_INSERT_0_LENGTH);
+ CTRACE((tfp,
+ "GridText: file insert aborted - file=|%s|- was 0-length\n",
+ fn));
+ FREE(fn);
+ return (0);
+
+ } else {
+
+ if ((fbuf = typecallocn(char, size + 1)) == NULL) {
+ /*
+ * This could be huge - don't exit if we don't have enough
+ * memory for it. - kw
+ */
+ free(fn);
+ HTAlert(MEMORY_EXHAUSTED_FILE);
+ return 0;
+ }
+
+ /* Try to make the same assumption for the charset of the inserted
+ * file as we would for normal loading of that file, i.e. taking
+ * assume_local_charset and suffix mappings into account.
+ * If there is a mismatch with the display character set, characters
+ * may be displayed wrong, too bad; but the user has a chance to
+ * correct this by editing the lines, which will update f->value_cs
+ * again. - kw
+ */
+ LYGetFileInfo(fn, 0, 0, 0, 0, 0, &file_cs);
+
+ fp = fopen(fn, "r");
+ if (!fp) {
+ free(fbuf);
+ free(fn);
+ HTAlert(FILE_CANNOT_OPEN_R);
+ return 0;
+ }
+ size = fread(fbuf, (size_t) 1, size, fp);
+ LYCloseInput(fp);
+ FREE(fn);
+ fbuf[size] = '\0'; /* Terminate! - kw */
+ }
+
+ /*
+ * Begin at the beginning, to find the TEXTAREA we're in, then
+ * the current cursorline.
+ */
+ anchor_ptr = HTMainText->first_anchor;
+
+ while (anchor_ptr) {
+
+ if (IsFormsTextarea(form, anchor_ptr)) {
+ if (anchor_ptr->line_num == entry_line)
+ break;
+ }
+ prev_anchor = anchor_ptr;
+ anchor_ptr = anchor_ptr->next;
+ }
+
+ if (anchor_ptr == NULL) {
+ CTRACE((tfp, "BUG: could not find anchor for TEXTAREA.\n"));
+ FREE(line);
+ FREE(fbuf);
+ return 0;
+ }
+
+ /*
+ * Clone a new TEXTAREA line/anchor using the cursorline anchor as
+ * a template, but link it in BEFORE the cursorline anchor/htline.
+ *
+ * [We can probably combine this with insert_new_textarea_anchor()
+ * along with a flag to indicate "insert before" as we do here,
+ * or the "normal" mode of operation (add after "current" anchor/
+ * line). Beware of the differences ... some are a bit subtle to
+ * notice.]
+ */
+ for (htline = FirstHTLine(HTMainText), i = 0;
+ anchor_ptr->line_num != i; i++) {
+ htline = htline->next;
+ if (htline == HTMainText->last_line)
+ break;
+ }
+
+ allocHTLine(l, MAX_LINE);
+ POOLtypecalloc(TextAnchor, a);
+
+ POOLtypecalloc(FormInfo, f);
+ if (a == NULL || l == NULL || f == NULL)
+ outofmem(__FILE__, "HText_InsertFile");
+
+ /* Init all the fields in the new TextAnchor. */
+ /* [anything "special" needed based on ->show_anchor value ?] */
+ /* *INDENT-EQLS* */
+ a->next = anchor_ptr;
+ a->number = anchor_ptr->number;
+ a->show_number = anchor_ptr->show_number;
+ a->line_pos = anchor_ptr->line_pos;
+ a->extent = anchor_ptr->extent;
+ a->sgml_offset = SGML_offset();
+ a->line_num = anchor_ptr->line_num;
+ LYCopyHiText(a, anchor_ptr);
+ a->link_type = anchor_ptr->link_type;
+ a->input_field = f;
+ a->show_anchor = anchor_ptr->show_anchor;
+ a->inUnderline = anchor_ptr->inUnderline;
+ a->expansion_anch = TRUE;
+ a->anchor = NULL;
+
+ /* Just the (seemingly) relevant fields in the new FormInfo. */
+ /* [do we need to do anything "special" based on ->disabled] */
+ StrAllocCopy(f->name, anchor_ptr->input_field->name);
+ f->number = anchor_ptr->input_field->number;
+ f->type = anchor_ptr->input_field->type;
+ StrAllocCopy(f->orig_value, "");
+ f->size = anchor_ptr->input_field->size;
+ f->maxlength = anchor_ptr->input_field->maxlength;
+ f->no_cache = anchor_ptr->input_field->no_cache;
+ f->disabled = anchor_ptr->input_field->disabled;
+ f->readonly = anchor_ptr->input_field->readonly;
+ f->value_cs = (file_cs >= 0) ? file_cs : current_char_set;
+
+ /* Init all the fields in the new HTLine (but see the #if). */
+ l->offset = htline->offset;
+ l->size = htline->size;
+#if defined(USE_COLOR_STYLE)
+ /* dup styles[] if needed [no need in TEXTAREA (?); leave 0's] */
+ l->numstyles = htline->numstyles;
+ /*we fork the pointers! */
+ l->styles = htline->styles;
+#endif
+ strcpy(l->data, htline->data);
+
+ /*
+ * If we're at the head of the TextAnchor list, the new node becomes
+ * the first node.
+ */
+ if (anchor_ptr == HTMainText->first_anchor)
+ HTMainText->first_anchor = a;
+
+ /*
+ * Link in the new TextAnchor, and corresponding HTLine.
+ */
+ if (prev_anchor)
+ prev_anchor->next = a;
+
+ htline = htline->prev;
+ l->next = htline->next;
+ l->prev = htline;
+ htline->next->prev = l;
+ htline->next = l;
+
+ /*
+ * update_subsequent_anchors() expects htline to point to 1st potential
+ * line needing fixup; we need to do this just in case the inserted file
+ * was only a single line (yes, it's pathological ... ).
+ */
+ htline = htline->next; /* ->new (current) htline, for 1st inserted line */
+ htline = htline->next; /* ->1st potential (following) [tag] fixup htline */
+
+ anchor_ptr = a;
+ newlines++;
+
+ /*
+ * Copy each line from the insert file into the corresponding anchor
+ * struct.
+ *
+ * Begin with the new line/anchor we just added (above the cursorline).
+ */
+ if ((line = typeMallocn(char, MAX_LINE)) == 0)
+ outofmem(__FILE__, "HText_InsertFile");
+
+ match_tag = anchor_ptr->number;
+
+ lp = fbuf;
+
+ while (*lp) {
+
+ if ((cp = StrChr(lp, '\n')) != 0)
+ len = (int) (cp - lp);
+ else
+ len = (int) strlen(lp);
+
+ if (len >= MAX_LINE) {
+ if (!truncalert) {
+ HTAlert(gettext("Very long lines have been truncated!"));
+ truncalert = TRUE;
+ }
+ len = MAX_LINE - 1;
+ if (lp[len])
+ lp[len + 1] = '\0'; /* prevent next iteration */
+ }
+ LYStrNCpy(line, lp, len);
+
+ /*
+ * If not the first line from the insert file, we need to add
+ * a new line/anchor, continuing on until the buffer is empty.
+ */
+ if (!firstanchor) {
+ insert_new_textarea_anchor(&end_anchor, &htline);
+ anchor_ptr = end_anchor; /* make the new anchor current */
+ newlines++;
+ }
+
+ /*
+ * Copy the new line from the buffer into the anchor.
+ */
+ StrAllocCopy(anchor_ptr->input_field->value, line);
+
+ /*
+ * insert_new_textarea_anchor always uses current_char_set,
+ * we may want something else, so fix it up. - kw
+ */
+ if (file_cs >= 0)
+ anchor_ptr->input_field->value_cs = file_cs;
+
+ /*
+ * And do the next line of insert text, for the next anchor ...
+ */
+ lp += len;
+ if (*lp)
+ lp++;
+
+ firstanchor = FALSE;
+ end_anchor = anchor_ptr;
+ anchor_ptr = anchor_ptr->next;
+ }
+
+ CTRACE((tfp, "GridText: file inserted into lynx struct's\n"));
+
+ /*
+ * Now adjust various things in all anchor-bearing lines following the
+ * last newly added line/anchor. Some say this is the fun part ...
+ */
+ update_subsequent_anchors(newlines, end_anchor, htline, match_tag);
+
+ /*
+ * Cleanup time.
+ */
+ FREE(line);
+ FREE(fbuf);
+
+ CTRACE((tfp, "GridText: exiting HText_InsertFile()\n"));
+
+ return (newlines);
+}
+
+#ifdef USE_COLOR_STYLE
+static int GetColumn(void)
+{
+ int result;
+
+#ifdef USE_SLANG
+ result = SLsmg_get_column();
+#else
+ int y, x;
+
+ LYGetYX(y, x);
+ result = x;
+ (void) y;
+#endif
+ return result;
+}
+
+static BOOL DidWrap(int y0, int x0)
+{
+ BOOL result = NO;
+
+#ifndef USE_SLANG
+ int y, x;
+
+ LYGetYX(y, x);
+ (void) x0;
+ if (x >= DISPLAY_COLS || ((x == 0) && (y != y0)))
+ result = YES;
+#endif
+ return result;
+}
+#endif /* USE_COLOR_STYLE */
+
+/*
+ * This function draws the part of line 'line', pointed by 'str' (which can be
+ * non terminated with null - i.e., is line->data+N) drawing 'len' bytes (not
+ * characters) of it. It doesn't check whether the 'len' bytes crosses a
+ * character boundary (if multibyte chars are in string). Assumes that the
+ * cursor is positioned in the place where the 1st char of string should be
+ * drawn.
+ *
+ * This code is based on display_line. This code was tested with ncurses only
+ * (since no support for lss is available for Slang) -HV.
+ */
+#ifdef USE_COLOR_STYLE
+static void redraw_part_of_line(HTLine *line, const char *str,
+ int len,
+ HText *text)
+{
+ register int i;
+ char buffer[7];
+ const char *data, *end_of_data;
+ size_t utf_extra = 0;
+
+#ifdef USE_COLOR_STYLE
+ int current_style = 0;
+ int tcols, scols;
+#endif
+ char LastDisplayChar = ' ';
+ int YP, XP;
+
+ LYGetYX(YP, XP);
+
+ i = XP;
+
+ /* Set up the multibyte character buffer */
+ buffer[0] = buffer[1] = buffer[2] = '\0';
+
+ data = str;
+ end_of_data = data + len;
+ i++;
+
+ /* this assumes that the part of line to be drawn fits in the screen */
+ while (data < end_of_data) {
+ buffer[0] = *data;
+ data++;
+
+#if defined(USE_COLOR_STYLE)
+#define CStyle line->styles[current_style]
+
+ tcols = GetColumn();
+ scols = StyleToCols(text, line, current_style);
+
+ while (current_style < line->numstyles &&
+ tcols >= scols) {
+ LynxChangeStyle(CStyle.sc_style, CStyle.sc_direction);
+ current_style++;
+ scols = StyleToCols(text, line, current_style);
+ }
+#endif
+ switch (buffer[0]) {
+
+#ifndef USE_COLOR_STYLE
+ case LY_UNDERLINE_START_CHAR:
+ if (dump_output_immediately && use_underscore) {
+ LYaddch('_');
+ i++;
+ } else {
+ lynx_start_underline();
+ }
+ break;
+
+ case LY_UNDERLINE_END_CHAR:
+ if (dump_output_immediately && use_underscore) {
+ LYaddch('_');
+ i++;
+ } else {
+ lynx_stop_underline();
+ }
+ break;
+
+ case LY_BOLD_START_CHAR:
+ lynx_start_bold();
+ break;
+
+ case LY_BOLD_END_CHAR:
+ lynx_stop_bold();
+ break;
+
+#endif
+ case LY_SOFT_NEWLINE:
+ if (!dump_output_immediately) {
+ LYaddch('+');
+ i++;
+ }
+ break;
+
+ case LY_SOFT_HYPHEN:
+ if (*data != '\0' ||
+ isspace(UCH(LastDisplayChar)) ||
+ LastDisplayChar == '-') {
+ /*
+ * Ignore the soft hyphen if it is not the last character in
+ * the line. Also ignore it if it first character following
+ * the margin, or if it is preceded by a white character (we
+ * loaded 'M' into LastDisplayChar if it was a multibyte
+ * character) or hyphen, though it should have been excluded by
+ * HText_appendCharacter() or by split_line() in those cases.
+ * -FM
+ */
+ break;
+ } else {
+ /*
+ * Make it a hard hyphen and fall through. -FM
+ */
+ buffer[0] = '-';
+ }
+ /* FALLTHRU */
+
+ default:
+ if (text->T.output_utf8 && is8bits(buffer[0])) {
+ utf_extra = utf8_length(text->T.output_utf8, data - 1);
+ LastDisplayChar = 'M';
+ }
+ if (utf_extra) {
+ LYStrNCpy(&buffer[1], data, utf_extra);
+ LYaddstr(buffer);
+ buffer[1] = '\0';
+ data += utf_extra;
+ utf_extra = 0;
+ } else if (is_CJK2(buffer[0])) {
+ /*
+ * For CJK strings, by Masanobu Kimura.
+ */
+ if (i <= DISPLAY_COLS) {
+ buffer[1] = *data;
+ buffer[2] = '\0';
+ data++;
+ i++;
+ LYaddstr(buffer);
+ buffer[1] = '\0';
+ /*
+ * For now, load 'M' into LastDisplayChar, but we should
+ * check whether it's white and if so, use ' '. I don't
+ * know if there actually are white CJK characters, and
+ * we're loading ' ' for multibyte spacing characters in
+ * this code set, but this will become an issue when the
+ * development code set's multibyte character handling is
+ * used. -FM
+ */
+ LastDisplayChar = 'M';
+ }
+ } else {
+ LYaddstr(buffer);
+ LastDisplayChar = buffer[0];
+ }
+ if (DidWrap(YP, XP))
+ break;
+ i++;
+ } /* end of switch */
+ } /* end of while */
+
+#ifndef USE_COLOR_STYLE
+ lynx_stop_underline();
+ lynx_stop_bold();
+#else
+
+ while (current_style < line->numstyles) {
+ LynxChangeStyle(CStyle.sc_style, CStyle.sc_direction);
+ current_style++;
+ }
+
+#undef CStyle
+#endif
+ return;
+}
+#endif /* USE_COLOR_STYLE */
+
+#ifndef USE_COLOR_STYLE
+/*
+ * Function move_to_glyph is called from LYMoveToLink and does all
+ * the real work for it.
+ * The pair LYMoveToLink()/move_to_glyph() is similar to the pair
+ * redraw_lines_of_link()/redraw_part_of_line(), some key differences:
+ * LYMoveToLink/move_to_glyph redraw_*
+ * -----------------------------------------------------------------
+ * - used without color style - used with color style
+ * - handles showing WHEREIS target - WHEREIS handled elsewhere
+ * - handles only one line - handles first two lines for
+ * hypertext anchors
+ * - right columns position for UTF-8
+ * by redrawing as necessary
+ * - currently used for highlight - currently used for highlight
+ * ON and OFF OFF
+ *
+ * Eventually the two sets of function should be unified, and should handle
+ * UTF-8 positioning, both lines of hypertext anchors, and WHEREIS in all
+ * cases. If possible. The complex WHEREIS target logic in LYhighlight()
+ * could then be completely removed. - kw
+ */
+static void move_to_glyph(int YP,
+ int XP,
+ int XP_draw_min,
+ const char *data,
+ int datasize,
+ unsigned offset,
+ const char *target,
+ const char *hightext,
+ int flags,
+ int utf_flag)
+{
+ char buffer[7];
+ const char *end_of_data;
+ size_t utf_extra = 0;
+
+#if defined(SHOW_WHEREIS_TARGETS)
+ const char *cp_tgt;
+ int i_start_tgt = 0, i_after_tgt;
+ int HitOffset, LenNeeded;
+#endif /* SHOW_WHEREIS_TARGETS */
+ BOOL intarget = NO;
+ BOOL inunderline = NO;
+ BOOL inbold = NO;
+ BOOL drawing = NO;
+ BOOL inU = NO;
+ BOOL hadutf8 = NO;
+ BOOL incurlink = NO;
+ BOOL drawingtarget = NO;
+ BOOL flag = NO;
+ const char *sdata = data;
+ char LastDisplayChar = ' ';
+
+ int i = (int) offset; /* FIXME: should be columns, not offset? */
+ int last_i = DISPLAY_COLS;
+ int XP_link = XP; /* column of link */
+ int XP_next = XP; /* column to move to when done drawing */
+ int linkvlen;
+
+ int len;
+
+ if (no_title)
+ YP -= TITLE_LINES;
+
+ if (flags & 1)
+ flag = YES;
+ if (flags & 2)
+ inU = YES;
+ /* Set up the multibyte character buffer */
+ buffer[0] = buffer[1] = buffer[2] = '\0';
+ /*
+ * Add offset, making sure that we do not
+ * go over the COLS limit on the display.
+ */
+ if (hightext != 0) {
+#ifdef WIDEC_CURSES
+ last_i = i + LYstrExtent2(data, datasize);
+#endif
+ linkvlen = LYmbcsstrlen(hightext, utf_flag, YES);
+ } else {
+ linkvlen = 0;
+ }
+ if (i >= last_i)
+ i = last_i - 1;
+
+ /*
+ * Scan through the data, making sure that we do not
+ * go over the COLS limit on the display etc.
+ */
+ len = datasize;
+ end_of_data = data + len;
+
+#if defined(SHOW_WHEREIS_TARGETS)
+ /*
+ * If the target overlaps with the part of this line that
+ * we are drawing, it will be emphasized.
+ */
+ i_after_tgt = i;
+ if (target) {
+ cp_tgt = LYno_attr_mb_strstr(sdata,
+ target,
+ utf_flag, YES,
+ &HitOffset,
+ &LenNeeded);
+ if (cp_tgt) {
+ if ((int) offset + LenNeeded > last_i ||
+ ((int) offset + HitOffset >= XP + linkvlen)) {
+ cp_tgt = NULL;
+ } else {
+ i_start_tgt = i + HitOffset;
+ i_after_tgt = i + LenNeeded;
+ }
+ }
+ } else {
+ cp_tgt = NULL;
+ }
+#endif /* SHOW_WHEREIS_TARGETS */
+
+ /*
+ * Iterate through the line data from the start, keeping track of
+ * the display ("glyph") position in i. Drawing will be turned
+ * on when either the first UTF-8 sequence (that occurs after
+ * XP_draw_min) is found, or when we reach the link itself (if
+ * highlight is non-NULL). - kw
+ */
+ while ((i <= last_i) && data < end_of_data && (*data != '\0')) {
+
+ if (hightext && i >= XP && !incurlink) {
+
+ /*
+ * We reached the position of link itself, and hightext is
+ * non-NULL. We switch data from being a pointer into the HTLine
+ * to being a pointer into hightext. Normally (as long as this
+ * routine is applied to normal hyperlink anchors) the text in
+ * hightext will be identical to that part of the HTLine that
+ * data was already pointing to, except that special attribute
+ * chars LY_BOLD_START_CHAR etc., have been stripped out (see
+ * HText_trimHightext). So the switching should not result in
+ * any different display, but it ensures that it doesn't go
+ * unnoticed if somehow hightext got messed up somewhere else.
+ * This is also useful in preparation for using this function
+ * for something else than normal hyperlink anchors, i.e., form
+ * fields.
+ * Turn on drawing here or make sure it gets turned on before the
+ * next actual normal character is handled. - kw
+ */
+ data = hightext;
+ len = (int) strlen(hightext);
+ end_of_data = hightext + len;
+ last_i = i + len;
+ XP_next += linkvlen;
+ incurlink = YES;
+#ifdef SHOW_WHEREIS_TARGETS
+ if (cp_tgt) {
+ if (flag && i_after_tgt >= XP)
+ i_after_tgt = XP - 1;
+ }
+#endif
+ /*
+ * The logic of where to set in-target drawing target etc.
+ * and when to react to it should be cleaned up (here and
+ * further below). For now this seems to work but isn't
+ * very clear. The complications arise from reproducing
+ * the behavior (previously done in LYhighlight()) for target
+ * strings that fall into or overlap a link: use target
+ * emphasis for the target string, except for the first
+ * and last character of the anchor text if the anchor is
+ * highlighted as "current link". - kw
+ */
+ if (!drawing) {
+#ifdef SHOW_WHEREIS_TARGETS
+ if (intarget) {
+ if (i_after_tgt > i) {
+ LYmove(YP, i);
+ if (flag) {
+ drawing = YES;
+ drawingtarget = NO;
+ if (inunderline)
+ inU = YES;
+ lynx_start_link_color(flag, inU);
+ } else {
+ drawing = YES;
+ drawingtarget = YES;
+ LYstartTargetEmphasis();
+ }
+ }
+ }
+#endif /* SHOW_WHEREIS_TARGETS */
+ } else {
+#ifdef SHOW_WHEREIS_TARGETS
+ if (intarget && i_after_tgt > i) {
+ if (flag && (data == hightext)) {
+ drawingtarget = NO;
+ LYstopTargetEmphasis();
+ }
+ } else if (!intarget)
+#endif /* SHOW_WHEREIS_TARGETS */
+ {
+ if (inunderline)
+ inU = YES;
+ if (inunderline)
+ lynx_stop_underline();
+ if (inbold)
+ lynx_stop_bold();
+ lynx_start_link_color(flag, inU);
+ }
+
+ }
+ }
+ if (i >= last_i || data >= end_of_data)
+ break;
+ if ((buffer[0] = *data) == '\0')
+ break;
+#if defined(SHOW_WHEREIS_TARGETS)
+ /*
+ * Look for a subsequent occurrence of the target string,
+ * if we had a previous one and have now stepped past it. - kw
+ */
+ if (cp_tgt && i >= i_after_tgt) {
+ if (intarget) {
+
+ if (incurlink && flag && i == last_i - 1)
+ cp_tgt = NULL;
+ else
+ cp_tgt = LYno_attr_mb_strstr(sdata,
+ target,
+ utf_flag, YES,
+ &HitOffset,
+ &LenNeeded);
+ if (cp_tgt) {
+ i_start_tgt = i + HitOffset;
+ i_after_tgt = i + LenNeeded;
+ if (incurlink) {
+ if (flag && i_start_tgt == XP_link)
+ i_start_tgt++;
+ if (flag && i_start_tgt == last_i - 1)
+ i_start_tgt++;
+ if (flag && i_after_tgt >= last_i)
+ i_after_tgt = last_i - 1;
+ if (flag && i_start_tgt >= last_i)
+ cp_tgt = NULL;
+ } else if (i_start_tgt == last_i) {
+ if (flag)
+ i_start_tgt++;
+ }
+ }
+ if (!cp_tgt || i_start_tgt != i) {
+ intarget = NO;
+ if (drawing) {
+ if (drawingtarget) {
+ drawingtarget = NO;
+ LYstopTargetEmphasis();
+ if (incurlink) {
+ lynx_start_link_color(flag, inU);
+ }
+ }
+ if (!incurlink) {
+ if (inbold)
+ lynx_start_bold();
+ if (inunderline)
+ lynx_start_underline();
+ }
+ }
+ }
+ }
+ }
+#endif /* SHOW_WHEREIS_TARGETS */
+
+ /*
+ * Advance data to point to the next input char (for the
+ * next round). Advance sdata, used for searching for a
+ * target string, so that they stay in synch. As long
+ * as we are not within the highlight text, data and sdata
+ * have identical values. After we have switched data to
+ * point into hightext, sdata remains a pointer into the
+ * HTLine (so that we don't miss a partial target match at
+ * the end of the anchor text). So sdata has to sometimes
+ * skip additional special attribute characters that are
+ * not present in highlight in order to stay in synch. - kw
+ */
+ data++;
+ if (incurlink) {
+ while (IsNormalChar(*sdata)) {
+ ++sdata;
+ }
+ }
+
+ switch (buffer[0]) {
+
+ case LY_UNDERLINE_START_CHAR:
+ if (!drawing || !incurlink)
+ inunderline = YES;
+ if (drawing && !intarget && !incurlink)
+ lynx_start_underline();
+ break;
+
+ case LY_UNDERLINE_END_CHAR:
+ inunderline = NO;
+ if (drawing && !intarget && !incurlink)
+ lynx_stop_underline();
+ break;
+
+ case LY_BOLD_START_CHAR:
+ if (!drawing || !incurlink)
+ inbold = YES;
+ if (drawing && !intarget && !incurlink)
+ lynx_start_bold();
+ break;
+
+ case LY_BOLD_END_CHAR:
+ inbold = NO;
+ if (drawing && !intarget && !incurlink)
+ lynx_stop_bold();
+ break;
+
+ case LY_SOFT_NEWLINE:
+ if (drawing) {
+ LYaddch('+');
+ }
+ i++;
+ break;
+
+ case LY_SOFT_HYPHEN:
+ if (*data != '\0' ||
+ isspace(UCH(LastDisplayChar)) ||
+ LastDisplayChar == '-') {
+ /*
+ * Ignore the soft hyphen if it is not the last
+ * character in the line. Also ignore it if it
+ * first character following the margin, or if it
+ * is preceded by a white character (we loaded 'M'
+ * into LastDisplayChar if it was a multibyte
+ * character) or hyphen, though it should have
+ * been excluded by HText_appendCharacter() or by
+ * split_line() in those cases. -FM
+ */
+ break;
+ } else {
+ /*
+ * Make it a hard hyphen and fall through. -FM
+ */
+ buffer[0] = '-';
+ }
+ /* FALLTHRU */
+
+ default:
+ /*
+ * We have got an actual normal displayable character, or
+ * the start of one. Before proceeding check whether
+ * drawing needs to be turned on now. - kw
+ */
+#if defined(SHOW_WHEREIS_TARGETS)
+ if (incurlink && intarget && flag && i_after_tgt > i) {
+ if (i == last_i - 1) {
+ i_after_tgt = i;
+ } else if (i == last_i - 2 && IS_CJK_TTY &&
+ is8bits(buffer[0])) {
+ i_after_tgt = i;
+ cp_tgt = NULL;
+ if (drawing) {
+ if (drawingtarget) {
+ LYstopTargetEmphasis();
+ drawingtarget = NO;
+ lynx_start_link_color(flag, inU);
+ }
+ }
+ }
+ }
+ if (cp_tgt && i >= i_start_tgt && sdata > cp_tgt) {
+ if (!intarget ||
+ (intarget && incurlink && !drawingtarget)) {
+
+ if (incurlink && drawing &&
+ !(flag &&
+ (i == XP_link || i == last_i - 1))) {
+ lynx_stop_link_color(flag, inU);
+ }
+ if (incurlink && !drawing) {
+ LYmove(YP, i);
+ if (inunderline)
+ inU = YES;
+ if (flag && (i == XP_link || i == last_i - 1)) {
+ lynx_start_link_color(flag, inU);
+ drawingtarget = NO;
+ } else {
+ LYstartTargetEmphasis();
+ drawingtarget = YES;
+ }
+ drawing = YES;
+ } else if (incurlink && drawing &&
+ intarget && !drawingtarget &&
+ (flag &&
+ (i == XP_link))) {
+ if (inunderline)
+ inU = YES;
+ lynx_start_link_color(flag, inU);
+ } else if (drawing &&
+ !(flag &&
+ (i == XP_link || (incurlink && i == last_i - 1)))) {
+ LYstartTargetEmphasis();
+ drawingtarget = YES;
+ }
+ intarget = YES;
+ }
+ } else
+#endif /* SHOW_WHEREIS_TARGETS */
+ if (incurlink) {
+ if (!drawing) {
+ LYmove(YP, i);
+ if (inunderline)
+ inU = YES;
+ lynx_start_link_color(flag, inU);
+ drawing = YES;
+ }
+ }
+
+ i++;
+#ifndef WIDEC_CURSES
+ if (utf_flag && is8bits(buffer[0])) {
+ hadutf8 = YES;
+ utf_extra = utf8_length(utf_flag, data - 1);
+ LastDisplayChar = 'M';
+ }
+#endif
+ if (utf_extra) {
+ LYStrNCpy(&buffer[1], data, utf_extra);
+ if (!drawing && i >= XP_draw_min) {
+ LYmove(YP, i - 1);
+ drawing = YES;
+#if defined(SHOW_WHEREIS_TARGETS)
+ if (intarget) {
+ drawingtarget = YES;
+ LYstartTargetEmphasis();
+ } else
+#endif /* SHOW_WHEREIS_TARGETS */
+ {
+ if (inbold)
+ lynx_start_bold();
+ if (inunderline)
+ lynx_start_underline();
+ }
+ }
+ LYaddstr(buffer);
+ buffer[1] = '\0';
+ sdata += utf_extra;
+ data += utf_extra;
+ utf_extra = 0;
+ } else if (IS_CJK_TTY && is8bits(buffer[0])
+ && (!conv_jisx0201kana && (kanji_code != SJIS))) {
+ /*
+ * For CJK strings, by Masanobu Kimura.
+ */
+ if (drawing && (i <= last_i)) {
+ buffer[1] = *data;
+ LYaddstr(buffer);
+ buffer[1] = '\0';
+ }
+ i++;
+ sdata++;
+ data++;
+ /*
+ * For now, load 'M' into LastDisplayChar, but we should
+ * check whether it's white and if so, use ' '. I don't
+ * know if there actually are white CJK characters, and
+ * we're loading ' ' for multibyte spacing characters in
+ * this code set, but this will become an issue when the
+ * development code set's multibyte character handling is
+ * used. -FM
+ */
+ LastDisplayChar = 'M';
+ } else {
+ if (drawing) {
+ LYaddstr(buffer);
+ }
+ LastDisplayChar = buffer[0];
+ }
+ } /* end of switch */
+ } /* end of while */
+
+ if (!drawing) {
+ LYmove(YP, XP_next);
+ lynx_start_link_color(flag, inU);
+ } else {
+#if defined(SHOW_WHEREIS_TARGETS)
+ if (drawingtarget) {
+ LYstopTargetEmphasis();
+ lynx_start_link_color(flag, inU);
+ }
+#endif /* SHOW_WHEREIS_TARGETS */
+ if (hadutf8) {
+ LYtouchline(YP);
+ }
+ }
+ return;
+}
+#endif /* !USE_COLOR_STYLE */
+
+#ifndef USE_COLOR_STYLE
+/*
+ * Move cursor position to a link's place in the display.
+ * The "moving to" is done by scanning through the line's
+ * character data in the corresponding HTLine of HTMainText,
+ * and starting to draw when a UTF-8 encoded non-ASCII character
+ * is encountered before the link (with some protection against
+ * overwriting form fields). This refreshing of preceding data is
+ * necessary for preventing curses's or slang's display logic from
+ * getting too clever; their logic counts character positions wrong
+ * since they don't know about multi-byte characters that take up
+ * only one screen position. So we have to make them forget their
+ * idea of what's in a screen line drawn previously.
+ * If hightext is non-NULL, it should be the anchor text for a normal
+ * link as stored in a links[] element, and the anchor text will be
+ * drawn too, with appropriate attributes. - kw
+ */
+void LYMoveToLink(int cur,
+ const char *target,
+ const char *hightext,
+ int flag,
+ int inU,
+ int utf_flag)
+{
+#define pvtTITLE_HEIGHT 1
+ HTLine *todr;
+ int i, n = 0;
+ int XP_draw_min = 0;
+ int flags = ((flag == TRUE) ? 1 : 0) | (inU ? 2 : 0);
+
+ /*
+ * We need to protect changed form text fields preceding this
+ * link on the same line against overwriting. - kw
+ */
+ for (i = cur - 1; i >= 0; i++) {
+ if (links[i].ly < links[cur].ly)
+ break;
+ if (links[i].type == WWW_FORM_LINK_TYPE) {
+ XP_draw_min = links[i].ly + links[i].l_form->size;
+ break;
+ }
+ }
+
+ /* Find the right HTLine. */
+ if (!HTMainText) {
+ todr = NULL;
+ } else if (HTMainText->stale) {
+ todr = FirstHTLine(HTMainText);
+ n = links[cur].ly - pvtTITLE_HEIGHT + HTMainText->top_of_screen;
+ } else {
+ todr = HTMainText->top_of_screen_line;
+ n = links[cur].ly - pvtTITLE_HEIGHT;
+ }
+ for (i = 0; i < n && todr; i++) {
+ todr = (todr == HTMainText->last_line) ? NULL : todr->next;
+ }
+ if (todr) {
+ if (target && *target == '\0')
+ target = NULL;
+ move_to_glyph(links[cur].ly, links[cur].lx, XP_draw_min,
+ todr->data, todr->size, todr->offset,
+ target, hightext, flags, utf_flag);
+ } else {
+ /* This should not happen. */
+ move_to_glyph(links[cur].ly, links[cur].lx, XP_draw_min,
+ "", 0, (unsigned) links[cur].lx,
+ target, hightext, flags, utf_flag);
+ }
+}
+#endif /* !USE_COLOR_STYLE */
+
+/*
+ * This is used only if compiled with lss support. It's called to redraw a
+ * regular link when it's being unhighlighted in LYhighlight().
+ */
+#ifdef USE_COLOR_STYLE
+void redraw_lines_of_link(int cur)
+{
+#define pvtTITLE_HEIGHT 1
+ HTLine *todr1;
+ int lines_back;
+ int row, col, count;
+ const char *text;
+
+ if (HTMainText->next_line == HTMainText->last_line) {
+ /* we are at the last page - that is partially filled */
+ lines_back = HTMainText->Lines - (links[cur].ly - pvtTITLE_HEIGHT +
+ HTMainText->top_of_screen);
+ } else {
+ lines_back = display_lines - (links[cur].ly - pvtTITLE_HEIGHT);
+ }
+ todr1 = HTMainText->next_line;
+ while (lines_back-- > 0)
+ todr1 = todr1->prev;
+
+ row = links[cur].ly;
+ if (no_title)
+ row -= TITLE_LINES;
+
+ for (count = 0;
+ row <= display_lines && (text = LYGetHiliteStr(cur, count)) != NULL;
+ ++count) {
+ col = LYGetHilitePos(cur, count);
+ if (col >= 0) {
+ LYmove(row, col);
+ redraw_part_of_line(todr1, text, (int) strlen(text), HTMainText);
+ }
+ todr1 = todr1->next;
+ row++;
+ }
+#undef pvtTITLE_HEIGHT
+ return;
+}
+#endif
+
+#ifdef USE_PRETTYSRC
+void HTMark_asSource(void)
+{
+ if (HTMainText)
+ HTMainText->source = TRUE;
+}
+#endif
+
+HTkcode HText_getKcode(HText *text)
+{
+ return text->kcode;
+}
+
+void HText_updateKcode(HText *text, HTkcode kcode)
+{
+ text->kcode = kcode;
+}
+
+HTkcode HText_getSpecifiedKcode(HText *text)
+{
+ return text->specified_kcode;
+}
+
+void HText_updateSpecifiedKcode(HText *text, HTkcode kcode)
+{
+ text->specified_kcode = kcode;
+}
+
+int HTMainText_Get_UCLYhndl(void)
+{
+ return (HTMainText ?
+ HTAnchor_getUCLYhndl(HTMainText->node_anchor, UCT_STAGE_MIME)
+ : -1);
+}
+
+#ifdef USE_CACHEJAR
+static int LYHandleCache(const char *arg,
+ HTParentAnchor *anAnchor,
+ HTFormat format_out,
+ HTStream *sink)
+{
+ HTFormat format_in = WWW_HTML;
+ HTStream *target = NULL;
+ char c;
+ char *buf = NULL;
+ char *title = NULL;
+ char *address = NULL;
+ char *content_type = NULL;
+ char *content_language = NULL;
+ char *content_encoding = NULL;
+ char *content_location = NULL;
+ char *content_disposition = NULL;
+ char *content_md5 = NULL;
+ char *message_id = NULL;
+ char *date = NULL;
+ char *owner = NULL;
+ char *subject = NULL;
+ char *expires = NULL;
+ char *ETag = NULL;
+ char *server = NULL;
+ char *FileCache = NULL;
+ char *last_modified = NULL;
+ char *cache_control = NULL;
+
+#ifdef USE_SOURCE_CACHE
+ char *source_cache_file = NULL;
+#endif
+ off_t Size = 0;
+ int x = -1;
+
+ /*
+ * Check if there is something to do.
+ */
+ if (HTList_count(loaded_texts) == 0) {
+ HTProgress(CACHE_JAR_IS_EMPTY);
+ LYSleepMsg();
+ HTNoDataOK = 1;
+ return (HT_NO_DATA);
+ }
+
+ /*
+ * If # of LYNXCACHE:/# is number ask user if he/she want to delete it.
+ */
+ if (sscanf(arg, STR_LYNXCACHE "/%d", &x) == 1 && x > 0) {
+ CTRACE((tfp, "LYNXCACHE number is %d\n", x));
+ _statusline(CACHE_D_OR_CANCEL);
+ c = (char) LYgetch_single();
+ if (c == 'D') {
+ HText *t = (HText *) HTList_objectAt(loaded_texts, x - 1);
+
+ HTList_removeObjectAt(loaded_texts, x - 1);
+ HText_free(t);
+ }
+ return (HT_NO_DATA);
+ }
+
+ /*
+ * If we get to here, it was a LYNXCACHE:/ URL for creating and displaying
+ * the Cache Jar Page.
+ * Set up an HTML stream and return an updated Cache Jar Page.
+ */
+ target = HTStreamStack(format_in,
+ format_out,
+ sink, anAnchor);
+ if (target == NULL) {
+ HTSprintf0(&buf, CANNOT_CONVERT_I_TO_O,
+ HTAtom_name(format_in), HTAtom_name(format_out));
+ HTAlert(buf);
+ FREE(buf);
+ return (HT_NOT_LOADED);
+ }
+
+ /*
+ * Load HTML strings into buf and pass buf to the target for parsing and
+ * rendering.
+ */
+#define PUTS(buf) (*target->isa->put_block)(target, buf, (int) strlen(buf))
+
+ HTSprintf0(&buf,
+ "<html>\n<head>\n<title>%s</title>\n</head>\n<body>\n",
+ CACHE_JAR_TITLE);
+ PUTS(buf);
+ HTSprintf0(&buf, "<h1>%s (%s)%s<a href=\"%s%s\">%s</a></h1>\n",
+ LYNX_NAME, LYNX_VERSION,
+ HELP_ON_SEGMENT,
+ helpfilepath, CACHE_JAR_HELP, CACHE_JAR_TITLE);
+ PUTS(buf);
+
+ /*
+ * Max number of cached documents is always same as HTCacheSize.
+ * We count them from oldest to newest. Currently cached document
+ * is *never* listed, resulting in maximal entries of Cache Jar
+ * to be HTCacheSize - 1
+ */
+ for (x = HTList_count(loaded_texts) - 1; x > 0; x--) {
+ /*
+ * The number of the document in the cache list, its title in a link,
+ * and its address and memory allocated for each cached document.
+ */
+ HText *cachedoc = (HText *) HTList_objectAt(loaded_texts, x);
+
+ if (cachedoc != 0) {
+ HTParentAnchor *docanchor = cachedoc->node_anchor;
+
+ if (docanchor != 0) {
+#ifdef USE_SOURCE_CACHE
+ source_cache_file = docanchor->source_cache_file;
+#endif
+ Size = docanchor->content_length;
+ StrAllocCopy(title, docanchor->title);
+ StrAllocCopy(address, docanchor->address);
+ content_type = docanchor->content_type;
+ content_language = docanchor->content_language;
+ content_encoding = docanchor->content_encoding;
+ content_location = docanchor->content_location;
+ content_disposition = docanchor->content_disposition;
+ content_md5 = docanchor->content_md5;
+ message_id = docanchor->message_id;
+ owner = docanchor->owner;
+ StrAllocCopy(subject, docanchor->subject);
+ date = docanchor->date;
+ expires = docanchor->expires;
+ ETag = docanchor->ETag;
+ StrAllocCopy(server, docanchor->server);
+ FileCache = docanchor->FileCache;
+ last_modified = docanchor->last_modified;
+ cache_control = docanchor->cache_control;
+ }
+ }
+
+ LYEntify(&address, TRUE);
+ if (isEmpty(title))
+ StrAllocCopy(title, NO_TITLE);
+ else
+ LYEntify(&title, TRUE);
+
+ HTSprintf0(&buf,
+ "<p><em>%d.</em> Title: <a href=\"%s%d\">%s</a><br />URL: <a href=\"%s\">%s</a><br />",
+ x, STR_LYNXCACHE, x, title, address, address);
+ PUTS(buf);
+ if (Size > 0) {
+ HTSprintf0(&buf, "Size: %" PRI_off_t " ", CAST_off_t (Size));
+
+ PUTS(buf);
+ }
+ if (cachedoc != NULL && cachedoc->Lines > 0) {
+ HTSprintf0(&buf, "Lines: %d ", cachedoc->Lines);
+ PUTS(buf);
+ }
+ if (FileCache != NULL) {
+ HTSprintf0(&buf, "File-Cache: <a href=\"file://%s\">%s</a> ",
+ FileCache, FileCache);
+ PUTS(buf);
+ }
+ if (cache_control != NULL) {
+ HTSprintf0(&buf, "Cache-Control: %s ", cache_control);
+ PUTS(buf);
+ }
+ if (content_type != NULL) {
+ HTSprintf0(&buf, "Content-Type: %s ", content_type);
+ PUTS(buf);
+ }
+ if (content_language != NULL) {
+ HTSprintf0(&buf, "Content-Language: %s ", content_language);
+ PUTS(buf);
+ }
+ if (content_encoding != NULL) {
+ HTSprintf0(&buf, "Content-Encoding: %s ", content_encoding);
+ PUTS(buf);
+ }
+ if (content_location != NULL) {
+ HTSprintf0(&buf, "Content-Location: %s ", content_location);
+ PUTS(buf);
+ }
+ if (content_disposition != NULL) {
+ HTSprintf0(&buf, "Content-Disposition: %s ", content_disposition);
+ PUTS(buf);
+ }
+ if (content_md5 != NULL) {
+ HTSprintf0(&buf, "Content-MD5: %s ", content_md5);
+ PUTS(buf);
+ }
+ if (message_id != NULL) {
+ HTSprintf0(&buf, "Message-ID: %s ", message_id);
+ PUTS(buf);
+ }
+ if (subject != NULL) {
+ LYEntify(&subject, TRUE);
+ HTSprintf0(&buf, "Subject: %s ", subject);
+ PUTS(buf);
+ }
+ if (owner != NULL) {
+ HTSprintf0(&buf, "Owner: <a href=%s>%s</a> ", owner, owner);
+ PUTS(buf);
+ }
+ if (date != NULL) {
+ HTSprintf0(&buf, "Date: %s ", date);
+ PUTS(buf);
+ }
+ if (expires != NULL) {
+ HTSprintf0(&buf, "Expires: %s ", expires);
+ PUTS(buf);
+ }
+ if (last_modified != NULL) {
+ HTSprintf0(&buf, "Last-Modified: %s ", last_modified);
+ PUTS(buf);
+ }
+ if (ETag != NULL) {
+ HTSprintf0(&buf, "ETag: %s ", ETag);
+ PUTS(buf);
+ }
+ if (server != NULL) {
+ LYEntify(&server, TRUE);
+ HTSprintf0(&buf, "Server: <em>%s</em> ", server);
+ PUTS(buf);
+ }
+#ifdef USE_SOURCE_CACHE
+ if (source_cache_file != NULL) {
+ HTSprintf0(&buf,
+ "Source-Cache-File: <a href=\"file://%s\">%s</a>",
+ source_cache_file, source_cache_file);
+ PUTS(buf);
+ }
+#endif
+ HTSprintf0(&buf, "<br />");
+ PUTS(buf);
+ }
+ HTSprintf0(&buf, "</body></html>");
+ PUTS(buf);
+ FREE(subject);
+ FREE(title);
+ FREE(address);
+ FREE(server);
+
+ /*
+ * Free the target to complete loading of the Cache Jar Page, and report a
+ * successful load.
+ */
+ (*target->isa->_free) (target);
+ FREE(buf);
+ return (HT_LOADED);
+}
+
+#ifdef GLOBALDEF_IS_MACRO
+#define _LYCACHE_C_GLOBALDEF_1_INIT { "LYNXCACHE",LYHandleCache,0}
+GLOBALDEF(HTProtocol, LYLynxCache, _LYCACHE_C_GLOBALDEF_1_INIT);
+#else
+GLOBALDEF HTProtocol LYLynxCache =
+{"LYNXCACHE", LYHandleCache, 0};
+#endif /* GLOBALDEF_IS_MACRO */
+#endif /* USE_CACHEJAR */
diff --git a/src/GridText.h b/src/GridText.h
new file mode 100644
index 0000000..9c68d3d
--- /dev/null
+++ b/src/GridText.h
@@ -0,0 +1,302 @@
+/*
+ * $LynxId: GridText.h,v 1.70 2022/06/12 16:38:03 KIHARA.Hideto Exp $
+ *
+ * Specialities of GridText as subclass of HText
+ */
+#ifndef LYGRIDTEXT_H
+#define LYGRIDTEXT_H
+
+#include <HText.h> /* Superclass */
+
+#ifndef HTFORMS_H
+#include <HTForms.h>
+#endif /* HTFORMS_H */
+
+#include <HTFont.h>
+
+#include <HTCJK.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define TABSTOP 8
+#define SPACES " " /* must be at least TABSTOP spaces long */
+#define SPLAT '.'
+#define NOCHOP 0
+#define CHOP 1
+/* just for information:
+US-ASCII control characters <32 which are not defined in Unicode standard
+=00 U+0000 NULL
+=01 U+0001 START OF HEADING
+=02 U+0002 START OF TEXT
+=03 U+0003 END OF TEXT
+=04 U+0004 END OF TRANSMISSION
+=05 U+0005 ENQUIRY
+=06 U+0006 ACKNOWLEDGE
+=07 U+0007 BELL
+=08 U+0008 BACKSPACE
+=09 U+0009 HORIZONTAL TABULATION
+=0A U+000A LINE FEED
+=0B U+000B VERTICAL TABULATION
+=0C U+000C FORM FEED
+=0D U+000D CARRIAGE RETURN
+=0E U+000E SHIFT OUT
+=0F U+000F SHIFT IN
+=10 U+0010 DATA LINK ESCAPE
+=11 U+0011 DEVICE CONTROL ONE
+=12 U+0012 DEVICE CONTROL TWO
+=13 U+0013 DEVICE CONTROL THREE
+=14 U+0014 DEVICE CONTROL FOUR
+=15 U+0015 NEGATIVE ACKNOWLEDGE
+=16 U+0016 SYNCHRONOUS IDLE
+=17 U+0017 END OF TRANSMISSION BLOCK
+=18 U+0018 CANCEL
+=19 U+0019 END OF MEDIUM
+=1A U+001A SUBSTITUTE
+=1B U+001B ESCAPE
+=1C U+001C FILE SEPARATOR
+=1D U+001D GROUP SEPARATOR
+=1E U+001E RECORD SEPARATOR
+=1F U+001F UNIT SEPARATOR
+=7F U+007F DELETE
+*/ extern int HTCurSelectGroupType;
+ extern char *HTCurSelectGroupSize;
+
+#if defined(VMS) && defined(VAXC) && !defined(__DECC)
+ extern int HTVirtualMemorySize;
+#endif /* VMS && VAXC && !__DECC */
+
+ extern HTChildAnchor *HText_childNextNumber(int n, void **prev);
+ extern int HText_findAnchorNumber(void *avoid);
+ extern void HText_FormDescNumber(int n, const char **desc);
+
+/* Is there any file left?
+*/
+ extern BOOL HText_canScrollUp(HText *text);
+ extern BOOL HText_canScrollDown(void);
+
+/* Move display within window
+*/
+ extern void HText_scrollUp(HText *text); /* One page */
+ extern void HText_scrollDown(HText *text); /* One page */
+ extern void HText_scrollTop(HText *text);
+ extern void HText_scrollBottom(HText *text);
+ extern void HText_pageDisplay(int line_num, char *target);
+ extern BOOL HText_pageHasPrevTarget(void);
+
+ extern int HText_LinksInLines(HText *text, int line_num, int Lines);
+
+ extern int HText_getAbsLineNumber(HText *text, int anchor_number);
+ extern int HText_closestAnchor(HText *text, int offset);
+ extern int HText_locateAnchor(HText *text, int anchor_number);
+ extern int HText_anchorRelativeTo(HText *text, int top_lineno, int anchor_num);
+
+ extern void HText_setLastChar(HText *text, int ch);
+ extern char HText_getLastChar(HText *text);
+#ifdef EXP_JAPANESE_SPACES
+ extern BOOL HText_checkLastChar_needSpaceOnJoinLines(HText *text);
+#endif
+
+ extern int HText_sourceAnchors(HText *text);
+ extern void HText_setStale(HText *text);
+ extern void HText_refresh(HText *text);
+ extern const char *HText_getTitle(void);
+ extern const char *HText_getSugFname(void);
+ extern void HTCheckFnameForCompression(char **fname,
+ HTParentAnchor *anchor,
+ int strip_ok);
+ extern const char *HText_getLastModified(void);
+ extern const char *HText_getDate(void);
+ extern const char *HText_getHttpHeaders(void);
+ extern const char *HText_getServer(void);
+ extern const char *HText_getOwner(void);
+ extern const char *HText_getContentBase(void);
+ extern const char *HText_getContentLocation(void);
+ extern const char *HText_getMessageID(void);
+ extern const char *HText_getRevTitle(void);
+
+#ifdef USE_COLOR_STYLE
+ extern const char *HText_getStyle(void);
+#endif
+ extern void HText_setMainTextOwner(const char *owner);
+ extern void print_wwwfile_to_fd(FILE *fp, int is_email, int is_reply);
+ extern BOOL HText_select(HText *text);
+ extern BOOL HText_POSTReplyLoaded(DocInfo *doc);
+ extern BOOL HTFindPoundSelector(const char *selector);
+ extern int HTGetRelLinkNum(int num, int rel, int cur);
+ extern int HTGetLinkInfo(int number,
+ int want_go,
+ int *go_line,
+ int *linknum,
+ char **hightext,
+ char **lname);
+ extern BOOL HText_TAHasMoreLines(int curlink,
+ int direction);
+ extern int HTGetLinkOrFieldStart(int curlink,
+ int *go_line,
+ int *linknum,
+ int direction,
+ int ta_skip);
+ extern BOOL HText_getFirstTargetInLine(HText *text,
+ int line_num,
+ int utf_flag,
+ int *offset,
+ int *tLen,
+ char **data,
+ const char *target);
+ extern int HTisDocumentSource(void);
+ extern void HTuncache_current_document(void);
+
+#ifdef USE_SOURCE_CACHE
+ extern BOOLEAN HTreparse_document(void);
+ extern BOOLEAN HTcan_reparse_document(void);
+ extern BOOLEAN HTdocument_settings_changed(void);
+#endif
+
+ extern BOOL HTLoadedDocumentEightbit(void);
+ extern BOOL HText_LastLineEmpty(HText *me, int IgnoreSpaces);
+ extern BOOL HText_PreviousLineEmpty(HText *me, int IgnoreSpaces);
+ extern BOOL HText_inLineOne(HText *text);
+ extern BOOLEAN HTLoadedDocumentIsHEAD(void);
+ extern BOOLEAN HTLoadedDocumentIsSafe(void);
+ extern bstring *HTLoadedDocumentPost_data(void);
+ extern const char *HTLoadedDocumentBookmark(void);
+ extern const char *HTLoadedDocumentCharset(void);
+ extern const char *HTLoadedDocumentTitle(void);
+ extern const char *HTLoadedDocumentURL(void);
+ extern const char *HText_HiddenLinkAt(HText *text, int number);
+ extern int HText_HiddenLinkCount(HText *text);
+ extern int HText_LastLineOffset(HText *me);
+ extern int HText_LastLineSize(HText *me, int IgnoreSpaces);
+ extern int HText_PreviousLineSize(HText *me, int IgnoreSpaces);
+ extern int HText_getCurrentColumn(HText *text);
+ extern int HText_getLines(HText *text);
+ extern int HText_getMaximumColumn(HText *text);
+ extern int HText_getNumOfBytes(void);
+ extern int HText_getNumOfLines(void);
+ extern int HText_getPreferredTopLine(HText *text, int line_number);
+ extern int HText_getTabIDColumn(HText *text, const char *name);
+ extern int HText_getTopOfScreen(void);
+ extern int do_www_search(DocInfo *doc);
+ extern void HText_NegateLineOne(HText *text);
+ extern void HText_RemovePreviousLine(HText *text);
+ extern void HText_setNodeAnchorBookmark(const char *bookmark);
+ extern void HText_setTabID(HText *text, const char *name);
+ extern void *HText_pool_calloc(HText *text, unsigned size);
+
+/* "simple table" stuff */
+ extern BOOLEAN HText_endStblTABLE(HText *);
+ extern int HText_trimCellLines(HText *text);
+ extern void HText_cancelStbl(HText *);
+ extern void HText_endStblCOLGROUP(HText *);
+ extern void HText_endStblTD(HText *);
+ extern void HText_endStblTR(HText *);
+ extern void HText_startStblCOL(HText *, int, int, int);
+ extern void HText_startStblRowGroup(HText *, int);
+ extern void HText_startStblTABLE(HText *, int);
+ extern void HText_startStblTD(HText *, int, int, int, int);
+ extern void HText_startStblTR(HText *, int);
+
+/* forms stuff */
+ extern void HText_beginForm(char *action,
+ char *method,
+ char *enctype,
+ char *title,
+ const char *accept_cs);
+ extern void HText_endForm(HText *text);
+ extern void HText_beginSelect(char *name,
+ int name_cs,
+ int multiple,
+ char *len);
+ extern int HText_getOptionNum(HText *text);
+ extern char *HText_setLastOptionValue(HText *text,
+ char *value,
+ char *submit_value,
+ int order,
+ int checked,
+ int val_cs,
+ int submit_val_cs);
+ extern int HText_beginInput(HText *text,
+ int underline,
+ InputFieldData * I);
+ extern void HText_endInput(HText *text);
+ extern PerFormInfo *HText_PerFormInfo(int number);
+ extern int HText_SubmitForm(FormInfo * submit_item, DocInfo *doc,
+ const char *link_name,
+ const char *link_value);
+ extern void HText_DisableCurrentForm(void);
+ extern void HText_ResetForm(FormInfo * form);
+ extern void HText_activateRadioButton(FormInfo * form);
+ extern BOOLEAN HText_HaveUserChangedForms(HText *text);
+
+ extern HTList *search_queries; /* Previous isindex and whereis queries */
+ extern void HTSearchQueries_free(void);
+ extern void HTAddSearchQuery(char *query);
+
+ extern void user_message(const char *message,
+ const char *argument);
+
+#define _user_message(msg, arg) mustshow = TRUE, user_message(msg, arg)
+
+ extern void www_user_search(int start_line,
+ DocInfo *doc,
+ char *target,
+ int direction);
+
+ extern void print_crawl_to_fd(FILE *fp,
+ char *thelink,
+ char *thetitle);
+ extern char *stub_HTAnchor_address(HTAnchor * me);
+
+ extern void HText_setToolbar(HText *text);
+ extern BOOL HText_hasToolbar(HText *text);
+
+ extern void HText_setNoCache(HText *text);
+ extern BOOL HText_hasNoCacheSet(HText *text);
+
+ extern BOOL HText_hasUTF8OutputSet(HText *text);
+ extern void HText_setKcode(HText *text,
+ const char *charset,
+ LYUCcharset *p_in);
+
+ extern void HText_setBreakPoint(HText *text);
+
+ extern BOOL HText_AreDifferent(HTParentAnchor *anchor,
+ const char *full_address);
+
+ extern int HText_EditTextArea(LinkInfo * form_link);
+ extern void HText_EditTextField(LinkInfo * form_link);
+ extern void HText_ExpandTextarea(LinkInfo * form_link, int newlines);
+ extern int HText_InsertFile(LinkInfo * form_link);
+
+ extern void redraw_lines_of_link(int cur);
+ extern void LYMoveToLink(int cur,
+ const char *target,
+ const char *hightext,
+ int flag,
+ int inU,
+ int utf_flag);
+
+#ifdef USE_PRETTYSRC
+ extern void HTMark_asSource(void);
+#endif
+
+ extern int HTMainText_Get_UCLYhndl(void);
+
+#ifdef KANJI_CODE_OVERRIDE
+ extern HTkcode last_kcode;
+#endif
+
+ extern HTkcode HText_getKcode(HText *text);
+ extern void HText_updateKcode(HText *text, HTkcode kcode);
+ extern HTkcode HText_getSpecifiedKcode(HText *text);
+ extern void HText_updateSpecifiedKcode(HText *text, HTkcode kcode);
+
+#if defined(EXP_WCWIDTH_SUPPORT) || defined(EXP_JAPANESE_SPACES)
+ extern BOOL isUTF8CJChar(const char *s);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* LYGRIDTEXT_H */
diff --git a/src/HTAlert.c b/src/HTAlert.c
new file mode 100644
index 0000000..81594cf
--- /dev/null
+++ b/src/HTAlert.c
@@ -0,0 +1,1201 @@
+/*
+ * $LynxId: HTAlert.c,v 1.103 2017/07/02 19:54:30 tom Exp $
+ *
+ * Displaying messages and getting input for Lynx Browser
+ * ==========================================================
+ *
+ * REPLACE THIS MODULE with a GUI version in a GUI environment!
+ *
+ * History:
+ * Jun 92 Created May 1992 By C.T. Barker
+ * Feb 93 Simplified, portablised TBL
+ *
+ */
+
+#include <HTUtils.h>
+#include <HTAlert.h>
+#include <LYGlobalDefs.h>
+#include <LYCurses.h>
+#include <LYStrings.h>
+#include <LYUtils.h>
+#include <LYClean.h>
+#include <GridText.h>
+#include <LYCookie.h>
+#include <LYHistory.h> /* store statusline messages */
+
+#include <LYLeaks.h>
+
+#include <HTParse.h>
+
+#undef timezone /* U/Win defines this in time.h, hides implementation detail */
+
+#if defined(HAVE_FTIME) && defined(HAVE_SYS_TIMEB_H)
+#include <sys/timeb.h>
+#endif
+
+/*
+ * 'napms()' is preferable to 'sleep()' in any case because it does not
+ * interfere with output, but also because it can be less than a second.
+ */
+#ifdef HAVE_NAPMS
+#define LYSleep(n) napms(n)
+#else
+#define LYSleep(n) sleep((unsigned)n)
+#endif
+
+/* Issue a message about a problem. HTAlert()
+ * --------------------------------
+ */
+void HTAlert(const char *Msg)
+{
+ CTRACE((tfp, "\nAlert!: %s\n\n", Msg));
+ CTRACE_FLUSH(tfp);
+ _user_message(ALERT_FORMAT, Msg);
+ LYstore_message2(ALERT_FORMAT, Msg);
+
+ if (dump_output_immediately && dump_to_stderr) {
+ fflush(stdout);
+ fprintf(stderr, ALERT_FORMAT, Msg);
+ fputc('\n', stderr);
+ fflush(stderr);
+ }
+
+ LYSleepAlert();
+}
+
+void HTAlwaysAlert(const char *extra_prefix,
+ const char *Msg)
+{
+ if (!dump_output_immediately && LYCursesON) {
+ HTAlert(Msg);
+ } else {
+ if (extra_prefix) {
+ fprintf(((TRACE) ? stdout : stderr),
+ "%s %s!\n",
+ extra_prefix, Msg);
+ fflush(stdout);
+ LYstore_message2(ALERT_FORMAT, Msg);
+ LYSleepAlert();
+ } else {
+ fprintf(((TRACE) ? stdout : stderr), ALERT_FORMAT, NonNull(Msg));
+ fflush(stdout);
+ LYstore_message2(ALERT_FORMAT, Msg);
+ LYSleepAlert();
+ fprintf(((TRACE) ? stdout : stderr), "\n");
+ }
+ CTRACE((tfp, "\nAlert!: %s\n\n", Msg));
+ CTRACE_FLUSH(tfp);
+ }
+}
+
+/* Issue an informational message. HTInfoMsg()
+ * --------------------------------
+ */
+void HTInfoMsg(const char *Msg)
+{
+ _statusline(Msg);
+ if (non_empty(Msg)) {
+ CTRACE((tfp, "Info message: %s\n", Msg));
+ LYstore_message(Msg);
+ LYSleepInfo();
+ }
+}
+
+void HTInfoMsg2(const char *Msg2, const char *Arg)
+{
+ _user_message(Msg2, Arg);
+ if (non_empty(Msg2)) {
+ CTRACE((tfp, "Info message: "));
+ CTRACE((tfp, Msg2, Arg));
+ CTRACE((tfp, "\n"));
+ LYstore_message2(Msg2, Arg);
+ LYSleepInfo();
+ }
+}
+
+/* Issue an important message. HTUserMsg()
+ * --------------------------------
+ */
+void HTUserMsg(const char *Msg)
+{
+ _statusline(Msg);
+ if (non_empty(Msg)) {
+ CTRACE((tfp, "User message: %s\n", Msg));
+ LYstore_message(Msg);
+#if !(defined(USE_SLANG) || defined(WIDEC_CURSES))
+ if (IS_CJK_TTY) {
+ clearok(curscr, TRUE);
+ LYrefresh();
+ }
+#endif
+ LYSleepMsg();
+ }
+}
+
+void HTUserMsg2(const char *Msg2, const char *Arg)
+{
+ _user_message(Msg2, Arg);
+ if (non_empty(Msg2)) {
+ CTRACE((tfp, "User message: "));
+ CTRACE((tfp, Msg2, Arg));
+ CTRACE((tfp, "\n"));
+ LYstore_message2(Msg2, Arg);
+ LYSleepMsg();
+ }
+}
+
+/* Issue a progress message. HTProgress()
+ * -------------------------
+ */
+void HTProgress(const char *Msg)
+{
+ statusline(Msg);
+ LYstore_message(Msg);
+ CTRACE((tfp, "%s\n", Msg));
+ LYSleepDelay();
+}
+
+const char *HTProgressUnits(int rate)
+{
+ static const char *bunits = 0;
+ static const char *kbunits = 0;
+
+ if (!bunits) {
+ bunits = gettext("bytes");
+ kbunits = gettext(LYTransferName);
+ }
+ return ((rate == rateKB)
+#ifdef USE_READPROGRESS
+ || (rate == rateEtaKB)
+ || (rate == rateEtaKB2)
+#endif
+ )? kbunits : bunits;
+}
+
+static const char *sprint_bytes(char *s, off_t n, const char *was_units)
+{
+ static off_t kb_units = 1024;
+ const char *u = HTProgressUnits(LYTransferRate);
+
+ if (isRateInKB(LYTransferRate)) {
+ if (n >= 10 * kb_units) {
+ sprintf(s, "%" PRI_off_t, CAST_off_t (n / kb_units));
+ } else if (n > 999) { /* Avoid switching between 1016b/s and 1K/s */
+ sprintf(s, "%.2g", ((double) n) / (double) kb_units);
+ } else {
+ sprintf(s, "%" PRI_off_t, CAST_off_t (n));
+
+ u = HTProgressUnits(rateBYTES);
+ }
+ } else {
+ sprintf(s, "%" PRI_off_t, CAST_off_t (n));
+ }
+
+ if (!was_units || was_units != u)
+ sprintf(s + strlen(s), " %s", u);
+ return u;
+}
+
+#ifdef USE_READPROGRESS
+#define TIME_HMS_LENGTH (36)
+static char *sprint_tbuf(char *s, long t)
+{
+ const char *format = ((LYTransferRate == rateEtaBYTES2 ||
+ LYTransferRate == rateEtaKB2)
+ ? "% 2ld%c"
+ : "%ld%c");
+ char *base = s;
+
+ if (t < 0) {
+ strcpy(s, "forever");
+ } else {
+ if (t > (3600 * 24)) {
+ sprintf(s, format, t / (3600 * 24), 'd');
+ s += strlen(s);
+ t %= (3600 * 24);
+ }
+ if (t > 3600) {
+ sprintf(s, format, t / 3600, 'h');
+ s += strlen(s);
+ t %= 3600;
+ }
+ if (t > 60) {
+ sprintf(s, format, t / 60, 'm');
+ s += strlen(s);
+ t %= 60;
+ }
+ if (s == base) {
+ sprintf(s, "% 2ld sec", t);
+ } else if (t != 0) {
+ sprintf(s, format, t, 's');
+ }
+ }
+ return base;
+}
+#endif /* USE_READPROGRESS */
+
+/* Issue a read-progress message. HTReadProgress()
+ * ------------------------------
+ */
+void HTReadProgress(off_t bytes, off_t total)
+{
+ static off_t bytes_last, total_last;
+ static off_t transfer_rate = 0;
+ static char *line = NULL;
+ char bytesp[80], totalp[80], transferp[80];
+ int renew = 0;
+ const char *was_units;
+
+#ifdef HAVE_GETTIMEOFDAY
+ struct timeval tv;
+ double now;
+ static double first, last, last_active;
+
+ gettimeofday(&tv, (struct timezone *) 0);
+ now = (double) tv.tv_sec + (double) tv.tv_usec / 1000000.;
+#else
+#if defined(HAVE_FTIME) && defined(HAVE_SYS_TIMEB_H)
+ static double now, first, last, last_active;
+ struct timeb tb;
+
+ ftime(&tb);
+ now = tb.time + (double) tb.millitm / 1000;
+#else
+ time_t now = time((time_t *) 0); /* once per second */
+ static time_t first, last, last_active;
+#endif
+#endif
+
+ if (!LYShowTransferRate)
+ LYTransferRate = rateOFF;
+
+ if (bytes == 0) {
+ first = last = last_active = now;
+ bytes_last = bytes;
+ } else if (bytes < 0) { /* stalled */
+ bytes = bytes_last;
+ total = total_last;
+ }
+
+ /* 1 sec delay for transfer_rate calculation without g-t-o-d */
+ if ((bytes > 0) &&
+ (now > first)) {
+ if (transfer_rate <= 0) { /* the very first time */
+ transfer_rate = (off_t) ((double) (bytes) / (now - first));
+ /* bytes/sec */
+ }
+ total_last = total;
+
+ /*
+ * Optimal refresh time: every 0.2 sec
+ */
+#if defined(HAVE_GETTIMEOFDAY) || (defined(HAVE_FTIME) && defined(HAVE_SYS_TIMEB_H))
+ if (now >= last + 0.2)
+ renew = 1;
+#else
+ /*
+ * Use interpolation. (The transfer rate may be not constant
+ * when we have partial content in a proxy. We adjust transfer_rate
+ * once a second to minimize interpolation error below.)
+ */
+ if ((now != last) || ((bytes - bytes_last) > (transfer_rate / 5))) {
+ renew = 1;
+ bytes_last += (transfer_rate / 5); /* until we got next second */
+ }
+#endif
+ if (renew) {
+ if (now > last) {
+ last = now;
+ if (bytes_last != bytes)
+ last_active = now;
+ bytes_last = bytes;
+ transfer_rate = (off_t) ((double) bytes / (now - first)); /* more accurate value */
+ }
+
+ if (total > 0)
+ was_units = sprint_bytes(totalp, total, 0);
+ else
+ was_units = 0;
+ sprint_bytes(bytesp, bytes, was_units);
+
+ switch ((TransferRate) LYTransferRate) {
+#ifdef USE_PROGRESSBAR
+ case rateBAR:
+ /*
+ * If we know the total size of the file, we can compute
+ * a percentage, and show a corresponding progress bar.
+ */
+ HTSprintf0(&line, gettext("Read %s of data"), bytesp);
+
+ if (total > 0) {
+ float percent = (float) bytes / (float) total;
+ int meter = (int) (((float) LYcolLimit * percent) - 5);
+
+ CTRACE((tfp, "rateBAR: bytes: %" PRI_off_t ", total: "
+ "%" PRI_off_t "\n",
+ CAST_off_t (bytes),
+ CAST_off_t (total)));
+ CTRACE((tfp, "meter = %d\n", meter));
+
+ HTSprintf0(&line, "%d%% ", (int) (percent * 100));
+ while (meter-- > 0)
+ StrAllocCat(line, "I");
+
+ CTRACE((tfp, "%s\n", line));
+ CTRACE_FLUSH(tfp);
+ }
+ break;
+#endif
+ default:
+ if (total > 0) {
+ HTSprintf0(&line, gettext("Read %s of %s of data"),
+ bytesp, totalp);
+ } else {
+ HTSprintf0(&line, gettext("Read %s of data"), bytesp);
+ }
+
+ if (LYTransferRate != rateOFF
+ && transfer_rate > 0) {
+ sprint_bytes(transferp, transfer_rate, 0);
+ HTSprintf(&line, gettext(", %s/sec"), transferp);
+ }
+ break;
+ }
+
+#ifdef USE_READPROGRESS
+ if (LYTransferRate == rateEtaBYTES
+ || LYTransferRate == rateEtaKB
+ || LYTransferRate == rateEtaBYTES2
+ || LYTransferRate == rateEtaKB2) {
+ char tbuf[TIME_HMS_LENGTH];
+
+ if (now - last_active >= 5)
+ HTSprintf(&line,
+ gettext(" (stalled for %s)"),
+ sprint_tbuf(tbuf, (long) (now - last_active)));
+ if (total > 0 && transfer_rate)
+ HTSprintf(&line,
+ gettext(", ETA %s"),
+ sprint_tbuf(tbuf, (long) ((total - bytes) / transfer_rate)));
+ }
+#endif
+
+ switch ((TransferRate) LYTransferRate) {
+#ifdef USE_PROGRESSBAR
+ case rateBAR:
+ /*
+ * If we were not able to show a progress bar, just show
+ * a "." for progress.
+ */
+ if (total <= 0)
+ StrAllocCat(line, ".");
+ break;
+#endif
+ default:
+ StrAllocCat(line, ".");
+ break;
+ }
+
+ if (total < -1)
+ StrAllocCat(line, gettext(" (Press 'z' to abort)"));
+
+ /* do not store the message for history page. */
+ statusline(line);
+ CTRACE((tfp, "%s\n", line));
+ }
+ }
+#ifdef LY_FIND_LEAKS
+ FREE(line);
+#endif
+}
+
+static BOOL conf_cancelled = NO; /* used by HTConfirm only - kw */
+
+BOOL HTLastConfirmCancelled(void)
+{
+ if (conf_cancelled) {
+ conf_cancelled = NO; /* reset */
+ return (YES);
+ } else {
+ return (NO);
+ }
+}
+
+/*
+ * Prompt for yes/no response, but let a configuration variable override
+ * the prompt entirely.
+ */
+int HTForcedPrompt(int option, const char *msg, int dft)
+{
+ int result = FALSE;
+ const char *show = NULL;
+ char *msg2 = NULL;
+
+ if (option == FORCE_PROMPT_DFT) {
+ result = HTConfirmDefault(msg, dft);
+ } else {
+ if (option == FORCE_PROMPT_YES) {
+ show = gettext("yes");
+ result = YES;
+ } else if (option == FORCE_PROMPT_NO) {
+ show = gettext("no");
+ result = NO;
+ } else {
+ return HTConfirmDefault(msg, dft); /* bug... */
+ }
+ HTSprintf(&msg2, "%s %s", msg, show);
+ HTUserMsg(msg2);
+ free(msg2);
+ }
+ return result;
+}
+
+#define DFT_CONFIRM ~(YES|NO)
+
+/* Seek confirmation with default answer. HTConfirmDefault()
+ * --------------------------------------
+ */
+int HTConfirmDefault(const char *Msg, int Dft)
+{
+/* Meta-note: don't move the following note from its place right
+ in front of the first gettext(). As it is now, it should
+ automatically appear in generated lynx.pot files. - kw
+ */
+
+/* NOTE TO TRANSLATORS: If you provide a translation for "yes", lynx
+ * will take the first byte of the translation as a positive response
+ * to Yes/No questions. If you provide a translation for "no", lynx
+ * will take the first byte of the translation as a negative response
+ * to Yes/No questions. For both, lynx will also try to show the
+ * first byte in the prompt as a character, instead of (y) or (n),
+ * respectively. This will not work right for multibyte charsets!
+ * Don't translate "yes" and "no" for CJK character sets (or translate
+ * them to "yes" and "no"). For a translation using UTF-8, don't
+ * translate if the translation would begin with anything but a 7-bit
+ * (US_ASCII) character. That also means do not translate if the
+ * translation would begin with anything but a 7-bit character, if
+ * you use a single-byte character encoding (a charset like ISO-8859-n)
+ * but anticipate that the message catalog may be used re-encoded in
+ * UTF-8 form.
+ * For translations using other character sets, you may also wish to
+ * leave "yes" and "no" untranslated, if using (y) and (n) is the
+ * preferred behavior.
+ * Lynx will also accept y Y n N as responses unless there is a conflict
+ * with the first letter of the "yes" or "no" translation.
+ */
+ const char *msg_yes = gettext("yes");
+ const char *msg_no = gettext("no");
+ int result = -1;
+
+ /* If they're not really distinct in the first letter, revert to English */
+ if (TOUPPER(*msg_yes) == TOUPPER(*msg_no)) {
+ msg_yes = "yes";
+ msg_no = "no";
+ }
+
+ conf_cancelled = NO;
+ if (dump_output_immediately) { /* Non-interactive, can't respond */
+ if (Dft == DFT_CONFIRM) {
+ CTRACE((tfp, "Confirm: %s (%c/%c) ", Msg, *msg_yes, *msg_no));
+ } else {
+ CTRACE((tfp, "Confirm: %s (%c) ", Msg, (Dft == YES) ? *msg_yes : *msg_no));
+ }
+ CTRACE((tfp, "- NO, not interactive.\n"));
+ result = NO;
+ } else {
+ char *msg = NULL;
+ char fallback_y = 'y'; /* English letter response as fallback */
+ char fallback_n = 'n'; /* English letter response as fallback */
+
+ if (fallback_y == *msg_yes || fallback_y == *msg_no)
+ fallback_y = '\0'; /* conflict or duplication, don't use */
+ if (fallback_n == *msg_yes || fallback_n == *msg_no)
+ fallback_n = '\0'; /* conflict or duplication, don't use */
+
+ if (Dft == DFT_CONFIRM)
+ HTSprintf0(&msg, "%s (%c/%c) ", Msg, *msg_yes, *msg_no);
+ else
+ HTSprintf0(&msg, "%s (%c) ", Msg, (Dft == YES) ? *msg_yes : *msg_no);
+ if (LYTraceLogFP) {
+ CTRACE((tfp, "Confirm: %s", msg));
+ }
+ _statusline(msg);
+ FREE(msg);
+
+ while (result < 0) {
+ int c = LYgetch_single();
+
+#ifdef VMS
+ if (HadVMSInterrupt) {
+ HadVMSInterrupt = FALSE;
+ c = TOUPPER(*msg_no);
+ }
+#endif /* VMS */
+ if (c == TOUPPER(*msg_yes)) {
+ result = YES;
+ } else if (c == TOUPPER(*msg_no)) {
+ result = NO;
+ } else if (fallback_y && c == fallback_y) {
+ result = YES;
+ } else if (fallback_n && c == fallback_n) {
+ result = NO;
+ } else if (LYCharIsINTERRUPT(c)) { /* remember we had ^G or ^C */
+ conf_cancelled = YES;
+ result = NO;
+ } else if (Dft != DFT_CONFIRM) {
+ result = Dft;
+ break;
+ }
+ }
+ CTRACE((tfp, "- %s%s.\n",
+ (result != NO) ? "YES" : "NO",
+ conf_cancelled ? ", cancelled" : ""));
+ }
+ return (result);
+}
+
+/* Seek confirmation. HTConfirm()
+ * ------------------
+ */
+BOOL HTConfirm(const char *Msg)
+{
+ return (BOOL) HTConfirmDefault(Msg, DFT_CONFIRM);
+}
+
+/*
+ * Ask a post resubmission prompt with some indication of what would
+ * be resubmitted, useful especially for going backward in history.
+ * Try to use parts of the address or, if given, the title, depending
+ * on how much fits on the statusline.
+ * if_imgmap and if_file indicate how to handle an address that is
+ * a "LYNXIMGMAP:", or a "file:" URL (presumably the List Page file),
+ * respectively: 0: auto-deny, 1: auto-confirm, 2: prompt.
+ * - kw
+ */
+
+BOOL confirm_post_resub(const char *address,
+ const char *title,
+ int if_imgmap,
+ int if_file)
+{
+ size_t len1;
+ const char *msg = CONFIRM_POST_RESUBMISSION_TO;
+ char buf[240];
+ char *temp = NULL;
+ BOOL res;
+ size_t maxlen = (size_t) (LYcolLimit - 5);
+
+ if (!address) {
+ return (NO);
+ } else if (isLYNXIMGMAP(address)) {
+ if (if_imgmap <= 0)
+ return (NO);
+ else if (if_imgmap == 1)
+ return (YES);
+ else
+ msg = CONFIRM_POST_LIST_RELOAD;
+ } else if (isFILE_URL(address)) {
+ if (if_file <= 0)
+ return (NO);
+ else if (if_file == 1)
+ return (YES);
+ else
+ msg = CONFIRM_POST_LIST_RELOAD;
+ } else if (dump_output_immediately) {
+ return (NO);
+ }
+ if (maxlen >= sizeof(buf))
+ maxlen = sizeof(buf) - 1;
+ if ((len1 = strlen(msg)) +
+ strlen(address) <= maxlen) {
+ sprintf(buf, msg, address);
+ return HTConfirm(buf);
+ }
+ if (len1 + strlen(temp = HTParse(address, "",
+ PARSE_ACCESS + PARSE_HOST + PARSE_PATH
+ + PARSE_PUNCTUATION)) <= maxlen) {
+ sprintf(buf, msg, temp);
+ res = HTConfirm(buf);
+ FREE(temp);
+ return (res);
+ }
+ FREE(temp);
+ if (title && (len1 + strlen(title) <= maxlen)) {
+ sprintf(buf, msg, title);
+ return HTConfirm(buf);
+ }
+ if (len1 + strlen(temp = HTParse(address, "",
+ PARSE_ACCESS + PARSE_HOST
+ + PARSE_PUNCTUATION)) <= maxlen) {
+ sprintf(buf, msg, temp);
+ res = HTConfirm(buf);
+ FREE(temp);
+ return (res);
+ }
+ FREE(temp);
+ if ((temp = HTParse(address, "", PARSE_HOST)) && *temp &&
+ len1 + strlen(temp) <= maxlen) {
+ sprintf(buf, msg, temp);
+ res = HTConfirm(buf);
+ FREE(temp);
+ return (res);
+ }
+ FREE(temp);
+ return HTConfirm(CONFIRM_POST_RESUBMISSION);
+}
+
+/* Prompt for answer and get text back. HTPrompt()
+ * ------------------------------------
+ */
+char *HTPrompt(const char *Msg, const char *deflt)
+{
+ char *rep = NULL;
+ bstring *data = NULL;
+
+ _statusline(Msg);
+ BStrCopy0(data, deflt ? deflt : "");
+
+ if (!dump_output_immediately)
+ (void) LYgetBString(&data, FALSE, 0, NORECALL);
+
+ StrAllocCopy(rep, data->str);
+
+ BStrFree(data);
+ return rep;
+}
+
+/*
+ * Prompt for password without echoing the reply. HTPromptPassword()
+ * ----------------------------------------------
+ */
+char *HTPromptPassword(const char *Msg, const char *given)
+{
+ char *result = NULL;
+ bstring *data = NULL;
+
+ if (isEmpty(given))
+ given = "";
+ if (!dump_output_immediately) {
+ _statusline(Msg ? Msg : PASSWORD_PROMPT);
+ BStrCopy0(data, given);
+ (void) LYgetBString(&data, TRUE, 0, NORECALL);
+ StrAllocCopy(result, data->str);
+ BStrFree(data);
+ } else {
+ printf("\n%s\n", PASSWORD_REQUIRED);
+ StrAllocCopy(result, given);
+ }
+ return result;
+}
+
+/* Prompt both username and password. HTPromptUsernameAndPassword()
+ * ----------------------------------
+ *
+ * On entry,
+ * Msg is the prompting message.
+ * *username and
+ * *password are char pointers which contain default
+ * or zero-length strings; they are changed
+ * to point to result strings.
+ * IsProxy should be TRUE if this is for
+ * proxy authentication.
+ *
+ * If *username is not NULL, it is taken
+ * to point to a default value.
+ * Initial value of *password is
+ * completely discarded.
+ *
+ * On exit,
+ * *username and *password point to newly allocated
+ * strings -- original strings pointed to by them
+ * are NOT freed.
+ *
+ */
+void HTPromptUsernameAndPassword(const char *Msg,
+ char **username,
+ char **password,
+ int IsProxy)
+{
+ if ((IsProxy == FALSE &&
+ authentication_info[0] && authentication_info[1]) ||
+ (IsProxy == TRUE &&
+ proxyauth_info[0] && proxyauth_info[1])) {
+ /*
+ * The -auth or -pauth parameter gave us both the username
+ * and password to use for the first realm or proxy server,
+ * respectively, so just use them without any prompting. - FM
+ */
+ StrAllocCopy(*username, (IsProxy ?
+ proxyauth_info[0] : authentication_info[0]));
+ if (IsProxy) {
+ FREE(proxyauth_info[0]);
+ } else {
+ FREE(authentication_info[0]);
+ }
+ StrAllocCopy(*password, (IsProxy ?
+ proxyauth_info[1] : authentication_info[1]));
+ if (IsProxy) {
+ FREE(proxyauth_info[1]);
+ } else {
+ FREE(authentication_info[1]);
+ }
+ } else if (dump_output_immediately) {
+ /*
+ * We are not interactive and don't have both the
+ * username and password from the command line,
+ * but might have one or the other. - FM
+ */
+ if ((IsProxy == FALSE && authentication_info[0]) ||
+ (IsProxy == TRUE && proxyauth_info[0])) {
+ /*
+ * Use the command line username. - FM
+ */
+ StrAllocCopy(*username, (IsProxy ?
+ proxyauth_info[0] : authentication_info[0]));
+ if (IsProxy) {
+ FREE(proxyauth_info[0]);
+ } else {
+ FREE(authentication_info[0]);
+ }
+ } else if (isEmpty(*username)) {
+ /*
+ * Default to "WWWuser". - FM
+ */
+ StrAllocCopy(*username, "WWWuser");
+ }
+ if ((IsProxy == FALSE && authentication_info[1]) ||
+ (IsProxy == TRUE && proxyauth_info[1])) {
+ /*
+ * Use the command line password. - FM
+ */
+ StrAllocCopy(*password, (IsProxy ?
+ proxyauth_info[1] : authentication_info[1]));
+ if (IsProxy) {
+ FREE(proxyauth_info[1]);
+ } else {
+ FREE(authentication_info[1]);
+ }
+ } else if (isEmpty(*password)) {
+ /*
+ * Default to a zero-length string. - FM
+ */
+ StrAllocCopy(*password, "");
+ }
+ printf("\n%s\n", USERNAME_PASSWORD_REQUIRED);
+
+ } else {
+ /*
+ * We are interactive and don't have both the
+ * username and password from the command line,
+ * but might have one or the other. - FM
+ */
+ if ((IsProxy == FALSE && authentication_info[0]) ||
+ (IsProxy == TRUE && proxyauth_info[0])) {
+ /*
+ * Offer the command line username in the
+ * prompt for the first realm. - FM
+ */
+ StrAllocCopy(*username, (IsProxy ?
+ proxyauth_info[0] : authentication_info[0]));
+ if (IsProxy) {
+ FREE(proxyauth_info[0]);
+ } else {
+ FREE(authentication_info[0]);
+ }
+ }
+ /*
+ * Prompt for confirmation or entry of the username. - FM
+ */
+ if (Msg != NULL) {
+ *username = HTPrompt(Msg, *username);
+ } else {
+ *username = HTPrompt(USERNAME_PROMPT, *username);
+ }
+ if ((IsProxy == FALSE && authentication_info[1]) ||
+ (IsProxy == TRUE && proxyauth_info[1])) {
+ /*
+ * Use the command line password for the first realm. - FM
+ */
+ StrAllocCopy(*password, (IsProxy ?
+ proxyauth_info[1] : authentication_info[1]));
+ if (IsProxy) {
+ FREE(proxyauth_info[1]);
+ } else {
+ FREE(authentication_info[1]);
+ }
+ } else if (non_empty(*username)) {
+ *password = HTPromptPassword(PASSWORD_PROMPT, *password);
+ } else {
+ /*
+ * Return a zero-length password. - FM
+ */
+ StrAllocCopy(*password, "");
+ }
+ }
+}
+
+/* Confirm a cookie operation. HTConfirmCookie()
+ * ---------------------------
+ *
+ * On entry,
+ * server is the server sending the Set-Cookie.
+ * domain is the domain of the cookie.
+ * path is the path of the cookie.
+ * name is the name of the cookie.
+ * value is the value of the cookie.
+ *
+ * On exit,
+ * Returns FALSE on cancel,
+ * TRUE if the cookie should be set.
+ */
+BOOL HTConfirmCookie(domain_entry * de, const char *server,
+ const char *name,
+ const char *value)
+{
+ int ch;
+ const char *prompt = ADVANCED_COOKIE_CONFIRMATION;
+
+ if (de == NULL)
+ return FALSE;
+
+ /* If the user has specified a list of domains to allow or deny
+ * from the config file, then they'll already have de->bv set to
+ * ACCEPT_ALWAYS or REJECT_ALWAYS so we can relax and let the
+ * default cookie handling code cope with this fine.
+ */
+
+ /*
+ * If the user has specified a constant action, don't prompt at all.
+ */
+ if (de->bv == ACCEPT_ALWAYS)
+ return TRUE;
+ if (de->bv == REJECT_ALWAYS)
+ return FALSE;
+
+ if (dump_output_immediately) {
+ /*
+ * Non-interactive, can't respond. Use the LYSetCookies value
+ * based on its compilation or configuration setting, or on the
+ * command line toggle. - FM
+ */
+ return LYSetCookies;
+ }
+
+ /*
+ * Estimate how much of the cookie we can show.
+ */
+ if (!LYAcceptAllCookies) {
+ int namelen, valuelen, space_free, percentage;
+ char *message = 0;
+
+ space_free = (LYcolLimit
+ - (LYstrCells(prompt)
+ - 10) /* %s and %.*s and %.*s chars */
+ -(int) strlen(server));
+ if (space_free < 0)
+ space_free = 0;
+ namelen = (int) strlen(name);
+ valuelen = (int) strlen(value);
+ if ((namelen + valuelen) > space_free) {
+ /*
+ * Argh... there isn't enough space on our single line for
+ * the whole cookie. Reduce them both by a percentage.
+ * This should be smarter.
+ */
+ percentage = (100 * space_free) / (namelen + valuelen);
+ namelen = (percentage * namelen) / 100;
+ valuelen = (percentage * valuelen) / 100;
+ }
+ HTSprintf(&message, prompt, server, namelen, name, valuelen, value);
+ _statusline(message);
+ FREE(message);
+ }
+ for (;;) {
+ if (LYAcceptAllCookies) {
+ ch = 'A';
+ } else {
+ ch = LYgetch_single();
+#if defined(LOCALE) && defined(HAVE_GETTEXT)
+ {
+#define L_PAREN '('
+#define R_PAREN ')'
+ /*
+ * Special-purpose workaround for gettext support (we should do
+ * this in a more general way) -TD
+ *
+ * NOTE TO TRANSLATORS: If the prompt has been rendered into
+ * another language, and if yes/no are distinct, assume the
+ * translator can make an ordered list in parentheses with one
+ * capital letter for each as we assumed in HTConfirmDefault().
+ * The list has to be in the same order as in the original message,
+ * and the four capital letters chosen to not match those in the
+ * original unless they have the same position.
+ *
+ * Example:
+ * (Y/N/Always/neVer) - English (original)
+ * (O/N/Toujours/Jamais) - French
+ */
+ char *p = gettext("Y/N/A/V"); /* placeholder for comment */
+ const char *s = "YNAV\007\003"; /* see ADVANCED_COOKIE_CONFIRMATION */
+
+ if (StrChr(s, ch) == 0
+ && isalpha(ch)
+ && (p = strrchr(prompt, L_PAREN)) != 0) {
+
+ CTRACE((tfp, "Looking for %c in %s\n", ch, p));
+ while (*p != R_PAREN && *p != 0 && isalpha(UCH(*s))) {
+ if (isalpha(UCH(*p)) && (*p == TOUPPER(*p))) {
+ CTRACE((tfp, "...testing %c/%c\n", *p, *s));
+ if (*p == ch) {
+ ch = *s;
+ break;
+ }
+ ++s;
+ }
+ ++p;
+ }
+ }
+ }
+#endif
+ }
+#ifdef VMS
+ if (HadVMSInterrupt) {
+ HadVMSInterrupt = FALSE;
+ ch = 'N';
+ }
+#endif /* VMS */
+ switch (ch) {
+ case 'A':
+ /*
+ * Set to accept all cookies for this domain.
+ */
+ de->bv = ACCEPT_ALWAYS;
+ HTUserMsg2(ALWAYS_ALLOWING_COOKIES, de->domain);
+ return TRUE;
+
+ case 'N':
+ /*
+ * Reject the cookie.
+ */
+ reject:
+ HTUserMsg(REJECTING_COOKIE);
+ return FALSE;
+
+ case 'V':
+ /*
+ * Set to reject all cookies from this domain.
+ */
+ de->bv = REJECT_ALWAYS;
+ HTUserMsg2(NEVER_ALLOWING_COOKIES, de->domain);
+ return FALSE;
+
+ case 'Y':
+ /*
+ * Accept the cookie.
+ */
+ HTInfoMsg(ALLOWING_COOKIE);
+ return TRUE;
+
+ default:
+ if (LYCharIsINTERRUPT(ch))
+ goto reject;
+ continue;
+ }
+ }
+}
+
+/* Confirm redirection of POST. HTConfirmPostRedirect()
+ * ----------------------------
+ *
+ * On entry,
+ * Redirecting_url is the Location.
+ * server_status is the server status code.
+ *
+ * On exit,
+ * Returns 0 on cancel,
+ * 1 for redirect of POST with content,
+ * 303 for redirect as GET without content
+ */
+int HTConfirmPostRedirect(const char *Redirecting_url, int server_status)
+{
+ int result = -1;
+ char *show_POST_url = NULL;
+ char *StatusInfo = 0;
+ char *url = 0;
+ int on_screen = 0; /* 0 - show menu
+
+ * 1 - show url
+ * 2 - menu is already on screen */
+
+ if (server_status == 303 ||
+ server_status == 302) {
+ /*
+ * HTTP.c should not have called us for either of
+ * these because we're treating 302 as historical,
+ * so just return 303. - FM
+ */
+ return 303;
+ }
+
+ if (dump_output_immediately) {
+ if (server_status == 301) {
+ /*
+ * Treat 301 as historical, i.e., like 303 (GET
+ * without content), when not interactive. - FM
+ */
+ return 303;
+ } else {
+ /*
+ * Treat anything else (e.g., 305, 306 or 307) as too
+ * dangerous to redirect without confirmation, and thus
+ * cancel when not interactive. - FM
+ */
+ return 0;
+ }
+ }
+
+ if (user_mode == NOVICE_MODE) {
+ on_screen = 2;
+ LYmove(LYlines - 2, 0);
+ HTSprintf0(&StatusInfo, SERVER_ASKED_FOR_REDIRECTION, server_status);
+ LYaddstr(StatusInfo);
+ LYclrtoeol();
+ LYmove(LYlines - 1, 0);
+ HTSprintf0(&url, "URL: %.*s",
+ (LYcols < 250 ? LYcolLimit - 5 : 250), Redirecting_url);
+ LYaddstr(url);
+ LYclrtoeol();
+ if (server_status == 301) {
+ _statusline(PROCEED_GET_CANCEL);
+ } else {
+ _statusline(PROCEED_OR_CANCEL);
+ }
+ } else {
+ HTSprintf0(&StatusInfo, "%d %.*s",
+ server_status,
+ 251,
+ ((server_status == 301) ?
+ ADVANCED_POST_GET_REDIRECT :
+ ADVANCED_POST_REDIRECT));
+ StrAllocCopy(show_POST_url, LOCATION_HEADER);
+ StrAllocCat(show_POST_url, Redirecting_url);
+ }
+ while (result < 0) {
+ int c;
+
+ switch (on_screen) {
+ case 0:
+ _statusline(StatusInfo);
+ break;
+ case 1:
+ _statusline(show_POST_url);
+ }
+ c = LYgetch_single();
+ switch (c) {
+ case 'P':
+ /*
+ * Proceed with 301 or 307 redirect of POST
+ * with same method and POST content. - FM
+ */
+ FREE(show_POST_url);
+ result = 1;
+ break;
+
+ case 7:
+ case 'C':
+ /*
+ * Cancel request.
+ */
+ FREE(show_POST_url);
+ result = 0;
+ break;
+
+ case 'U':
+ /*
+ * Show URL for intermediate or advanced mode.
+ */
+ if (user_mode != NOVICE_MODE) {
+ if (on_screen == 1) {
+ on_screen = 0;
+ } else {
+ on_screen = 1;
+ }
+ }
+ break;
+
+ case 'G':
+ if (server_status == 301) {
+ /*
+ * Treat as 303 (GET without content).
+ */
+ FREE(show_POST_url);
+ result = 303;
+ break;
+ }
+ /* FALLTHRU */
+
+ default:
+ /*
+ * Get another character.
+ */
+ if (on_screen == 1) {
+ on_screen = 0;
+ } else {
+ on_screen = 2;
+ }
+ }
+ }
+ FREE(StatusInfo);
+ FREE(url);
+ return (result);
+}
+
+#define okToSleep() (!crawl && !traversal && LYCursesON && !no_pause)
+
+/*
+ * Sleep for the given message class's time.
+ */
+void LYSleepAlert(void)
+{
+ if (okToSleep())
+ LYSleep(AlertSecs);
+}
+
+void LYSleepDelay(void)
+{
+ if (okToSleep())
+ LYSleep(DelaySecs);
+}
+
+void LYSleepInfo(void)
+{
+ if (okToSleep())
+ LYSleep(InfoSecs);
+}
+
+void LYSleepMsg(void)
+{
+ if (okToSleep())
+ LYSleep(MessageSecs);
+}
+
+#ifdef USE_CMD_LOGGING
+void LYSleepReplay(void)
+{
+ if (okToSleep())
+ LYSleep(ReplaySecs);
+}
+#endif /* USE_CMD_LOGGING */
+
+/*
+ * LYstrerror emulates the ANSI strerror() function.
+ */
+#ifndef LYStrerror
+char *LYStrerror(int code)
+{
+ static char temp[80];
+
+ sprintf(temp, "System errno is %d.\r\n", code);
+ return temp;
+}
+#endif /* HAVE_STRERROR */
diff --git a/src/HTAlert.h b/src/HTAlert.h
new file mode 100644
index 0000000..03106f5
--- /dev/null
+++ b/src/HTAlert.h
@@ -0,0 +1,168 @@
+/*
+ * $LynxId: HTAlert.h,v 1.35 2016/11/24 23:44:49 tom Exp $
+ *
+ * Displaying messages and getting input for WWW Library
+ * =====================================================
+ *
+ * May 92 Created By C.T. Barker
+ * Feb 93 Portablized etc TBL
+ */
+
+#ifndef HTALERT_H
+#define HTALERT_H 1
+
+#include <LYCookie.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define ALERT_PREFIX_LEN 5
+/* Display a message and get the input
+ *
+ * On entry,
+ * Msg is the message.
+ *
+ * On exit,
+ * Return value is malloc'd string which must be freed.
+ */ extern char *HTPrompt(const char *Msg, const char *deflt);
+
+/* Display a message, don't wait for input
+ *
+ * On entry,
+ * The input is a list of parameters for printf.
+ */
+ extern void HTAlert(const char *Msg);
+ extern void HTAlwaysAlert(const char *extra_prefix, const char *Msg);
+ extern void HTInfoMsg(const char *Msg);
+ extern void HTInfoMsg2(const char *Msg, const char *Arg);
+ extern void HTUserMsg(const char *Msg);
+ extern void HTUserMsg2(const char *Msg, const char *Arg);
+
+/* Display a progress message for information (and diagnostics) only
+ *
+ * On entry,
+ * The input is a list of parameters for printf.
+ */
+ extern const char *HTProgressUnits(int kilobytes);
+ extern void HTProgress(const char *Msg);
+ extern void HTReadProgress(off_t bytes, off_t total);
+
+#define _HTProgress(msg) mustshow = TRUE, HTProgress(msg)
+
+/*
+ * Indicates whether last HTConfirm was cancelled (^G or ^C) and
+ * resets flag. (so only call once!) - kw
+ */
+ extern BOOL HTLastConfirmCancelled(void);
+
+/*
+ * Supports logic for forced yes/no prompt results.
+ */
+ extern int HTForcedPrompt(int Opt, const char *Msg, int Dft);
+
+/* Display a message, then wait for 'yes' or 'no', allowing default
+ * response if a return or left-arrow is used.
+ *
+ * On entry,
+ * Takes a list of parameters for printf.
+ *
+ * On exit,
+ * If the user enters 'YES', returns TRUE, returns FALSE
+ * otherwise.
+ */
+ extern int HTConfirmDefault(const char *Msg, int Dft);
+
+/* Display a message, then wait for 'yes' or 'no'.
+ *
+ * On entry,
+ * Takes a list of parameters for printf.
+ *
+ * On exit,
+ * If the user enters 'YES', returns TRUE, returns FALSE
+ * otherwise.
+ */
+ extern BOOL HTConfirm(const char *Msg);
+
+ extern BOOL confirm_post_resub(const char *address,
+ const char *title,
+ int if_imgmap,
+ int if_file);
+
+/* Prompt for password without echoing the reply
+ */
+ extern char *HTPromptPassword(const char *Msg, const char *given);
+
+/* Prompt both username and password HTPromptUsernameAndPassword()
+ * ---------------------------------
+ * On entry,
+ * Msg is the prompting message.
+ * *username and
+ * *password are char pointers; they are changed
+ * to point to result strings.
+ * IsProxy should be TRUE if this is for
+ * proxy authentication.
+ *
+ * If *username is not NULL, it is taken
+ * to point to a default value.
+ * Initial value of *password is
+ * completely discarded.
+ *
+ * On exit,
+ * *username and *password point to newly allocated
+ * strings -- original strings pointed to by them
+ * are NOT freed.
+ *
+ */
+ extern void HTPromptUsernameAndPassword(const char *Msg,
+ char **username,
+ char **password,
+ int IsProxy);
+
+/* Confirm a cookie operation. HTConfirmCookie()
+ * ---------------------------
+ *
+ * On entry,
+ * server is the server sending the Set-Cookie.
+ * domain is the domain of the cookie.
+ * path is the path of the cookie.
+ * name is the name of the cookie.
+ * value is the value of the cookie.
+ *
+ * On exit,
+ * Returns FALSE on cancel,
+ * TRUE if the cookie should be set.
+ */
+ extern BOOL HTConfirmCookie(domain_entry * dp, const char *server,
+ const char *name,
+ const char *value);
+
+/* Confirm redirection of POST. HTConfirmPostRedirect()
+ * ----------------------------
+ * On entry,
+ * Redirecting_url is the Location.
+ * server_status is the server status code.
+ *
+ * On exit,
+ * Returns 0 on cancel,
+ * 1 for redirect of POST with content,
+ * 303 for redirect as GET without content
+ */
+ extern int HTConfirmPostRedirect(const char *Redirecting_url,
+ int server_status);
+
+ extern void LYSleepAlert(void);
+ extern void LYSleepDelay(void);
+ extern void LYSleepInfo(void);
+ extern void LYSleepMsg(void);
+ extern void LYSleepReplay(void);
+
+#ifdef HAVE_STRERROR
+#define LYStrerror strerror
+#else
+ extern char *LYStrerror(int code);
+#endif /* HAVE_STRERROR */
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* HTALERT_H */
diff --git a/src/HTFWriter.c b/src/HTFWriter.c
new file mode 100644
index 0000000..9b7c0c6
--- /dev/null
+++ b/src/HTFWriter.c
@@ -0,0 +1,1516 @@
+/*
+ * $LynxId: HTFWriter.c,v 1.124 2022/07/25 00:16:38 tom Exp $
+ *
+ * FILE WRITER HTFWrite.h
+ * ===========
+ *
+ * This version of the stream object just writes to a C file.
+ * The file is assumed open and left open.
+ *
+ * Bugs:
+ * strings written must be less than buffer size.
+ */
+
+#define HTSTREAM_INTERNAL 1
+
+#include <HTUtils.h>
+#include <LYCurses.h>
+#include <HTFWriter.h>
+#include <HTSaveToFile.h>
+
+#ifdef WIN_EX
+#include <HTParse.h>
+#endif
+
+#include <HTFormat.h>
+#include <UCDefs.h>
+#include <HTAlert.h>
+#include <HTFile.h>
+#include <HTInit.h>
+#include <HTPlain.h>
+
+#include <LYStrings.h>
+#include <LYUtils.h>
+#include <LYGlobalDefs.h>
+#include <LYClean.h>
+#include <GridText.h>
+#include <LYExtern.h>
+#include <LYexit.h>
+#include <LYLeaks.h>
+#include <LYKeymap.h>
+#include <LYGetFile.h>
+#include <LYHistory.h> /* store statusline messages */
+
+#ifdef USE_PERSISTENT_COOKIES
+#include <LYCookie.h>
+#endif
+
+/* contains the name of the temp file which is being downloaded into */
+char *WWW_Download_File = NULL;
+BOOLEAN LYCancelDownload = FALSE; /* exported to HTFormat.c in libWWW */
+
+#ifdef VMS
+static char *FIXED_RECORD_COMMAND = NULL;
+
+#ifdef USE_COMMAND_FILE /* Keep this as an option. - FM */
+#define FIXED_RECORD_COMMAND_MASK "@Lynx_Dir:FIXED512 %s"
+#else
+#define FIXED_RECORD_COMMAND_MASK "%s"
+static unsigned long LYVMS_FixedLengthRecords(char *filename);
+#endif /* USE_COMMAND_FILE */
+#endif /* VMS */
+
+HTStream *HTSaveToFile(HTPresentation *pres,
+ HTParentAnchor *anchor,
+ HTStream *sink);
+
+/* Stream Object
+ * -------------
+ */
+struct _HTStream {
+ const HTStreamClass *isa;
+
+ FILE *fp; /* The file we've opened */
+ char *end_command; /* What to do on _free. */
+ char *remove_command; /* What to do on _abort. */
+ char *viewer_command; /* Saved external viewer */
+ HTFormat input_format; /* Original pres->rep */
+ HTFormat output_format; /* Original pres->rep_out */
+ HTParentAnchor *anchor; /* Original stream's anchor. */
+ HTStream *sink; /* Original stream's sink. */
+#ifdef FNAMES_8_3
+ BOOLEAN idash; /* remember position to become '.' */
+#endif
+};
+
+/*_________________________________________________________________________
+ *
+ * A C T I O N R O U T I N E S
+ * Bug:
+ * Most errors are ignored.
+ */
+
+/* Error handling
+ * ------------------
+ */
+static void HTFWriter_error(HTStream *me, const char *id)
+{
+ char buf[200];
+
+ sprintf(buf, "%.60s: %.60s: %.60s",
+ id,
+ me->isa->name,
+ LYStrerror(errno));
+ HTAlert(buf);
+/*
+ * Only disaster results from:
+ * me->isa->_abort(me, NULL);
+ */
+}
+
+/* Character handling
+ * ------------------
+ */
+static void HTFWriter_put_character(HTStream *me, int c)
+{
+ if (me->fp) {
+ putc(c, me->fp);
+ }
+}
+
+/* String handling
+ * ---------------
+ */
+static void HTFWriter_put_string(HTStream *me, const char *s)
+{
+ if (me->fp) {
+ fputs(s, me->fp);
+ }
+}
+
+/* Buffer write. Buffers can (and should!) be big.
+ * ------------
+ */
+static void HTFWriter_write(HTStream *me, const char *s, int l)
+{
+ size_t result;
+
+ if (me->fp) {
+ result = fwrite(s, (size_t) 1, (size_t) l, me->fp);
+ if (result != (size_t) l) {
+ HTFWriter_error(me, "HTFWriter_write");
+ }
+ }
+}
+
+static void decompress_gzip(HTStream *me)
+{
+ char *in_name = me->anchor->FileCache;
+ char copied[LY_MAXPATH];
+ FILE *fp = LYOpenTemp(copied, ".tmp.gz", BIN_W);
+
+ if (fp != 0) {
+#ifdef USE_ZLIB
+ char buffer[BUFSIZ];
+ gzFile gzfp;
+ int status;
+
+ CTRACE((tfp, "decompressing '%s'\n", in_name));
+ if ((gzfp = gzopen(in_name, BIN_R)) != 0) {
+ BOOL success = TRUE;
+ size_t actual = 0;
+
+ CTRACE((tfp, "...opened '%s'\n", copied));
+ while ((status = gzread(gzfp, buffer, sizeof(buffer))) > 0) {
+ size_t want = (size_t) status;
+ size_t have = fwrite(buffer, sizeof(char), want, fp);
+
+ actual += have;
+ if (want != have) {
+ success = FALSE;
+ break;
+ }
+ }
+ gzclose(gzfp);
+ LYCloseTempFP(fp);
+ CTRACE((tfp, "...decompress %" PRI_off_t " to %lu\n",
+ CAST_off_t (me->anchor->actual_length),
+ (unsigned long)actual));
+ if (success) {
+ if (LYRenameFile(copied, in_name) == 0)
+ me->anchor->actual_length = (off_t) actual;
+ (void) LYRemoveTemp(copied);
+ }
+ }
+#else
+#define FMT "%s %s"
+ const char *program;
+
+ if (LYCopyFile(in_name, copied) == 0) {
+ char expanded[LY_MAXPATH];
+ char *command = NULL;
+
+ if ((program = HTGetProgramPath(ppUNCOMPRESS)) != NULL) {
+ HTAddParam(&command, FMT, 1, program);
+ HTAddParam(&command, FMT, 2, copied);
+ HTEndParam(&command, FMT, 2);
+ }
+ if (LYSystem(command) == 0) {
+ struct stat stat_buf;
+
+ strcpy(expanded, copied);
+ *strrchr(expanded, '.') = '\0';
+ if (LYRenameFile(expanded, in_name) != 0) {
+ CTRACE((tfp, "rename failed %s to %s\n", expanded, in_name));
+ } else if (stat(in_name, &stat_buf) != 0) {
+ CTRACE((tfp, "stat failed for %s\n", in_name));
+ } else {
+ me->anchor->actual_length = stat_buf.st_size;
+ }
+ } else {
+ CTRACE((tfp, "command failed: %s\n", command));
+ }
+ free(command);
+ (void) LYRemoveTemp(copied);
+ }
+#undef FMT
+#endif
+ }
+}
+
+/* Free an HTML object
+ * -------------------
+ *
+ * Note that the SGML parsing context is freed, but the created
+ * object is not,
+ * as it takes on an existence of its own unless explicitly freed.
+ */
+static void HTFWriter_free(HTStream *me)
+{
+ int len;
+ char *path = NULL;
+ char *addr = NULL;
+ BOOL use_zread = NO;
+ BOOLEAN found = FALSE;
+
+#ifdef WIN_EX
+ HANDLE cur_handle;
+
+ cur_handle = GetForegroundWindow();
+#endif
+
+ if (me->fp)
+ fflush(me->fp);
+ if (me->end_command) { /* Temp file */
+ LYCloseTempFP(me->fp);
+ /*
+ * Handle a special case where the server used "Content-Type: gzip".
+ * Normally that feeds into the presentation stages, but if the link
+ * happens to point to something that will not be presented, but
+ * instead offered as a download, it comes here. In that case, ungzip
+ * the content before prompting the user for the place to store it.
+ */
+ if (me->anchor->FileCache != NULL
+ && me->anchor->no_content_encoding == FALSE
+ && me->input_format == HTAtom_for("application/x-gzip")
+ && !strcmp(me->anchor->content_encoding, "gzip")) {
+ decompress_gzip(me);
+ }
+#ifdef VMS
+ if (0 == strcmp(me->end_command, "SaveVMSBinaryFile")) {
+ /*
+ * It's a binary file saved to disk on VMS, which
+ * we want to convert to fixed records format. - FM
+ */
+#ifdef USE_COMMAND_FILE
+ LYSystem(FIXED_RECORD_COMMAND);
+#else
+ LYVMS_FixedLengthRecords(FIXED_RECORD_COMMAND);
+#endif /* USE_COMMAND_FILE */
+ FREE(FIXED_RECORD_COMMAND);
+
+ if (me->remove_command) {
+ /* NEVER REMOVE THE FILE unless during an abort! */
+ FREE(me->remove_command);
+ }
+ } else
+#endif /* VMS */
+ if (me->input_format == HTAtom_for("www/compressed")) {
+ /*
+ * It's a compressed file supposedly cached to
+ * a temporary file for uncompression. - FM
+ */
+ if (me->anchor->FileCache != NULL) {
+ BOOL skip_loadfile = (BOOL) (me->viewer_command != NULL);
+
+ /*
+ * Save the path with the "gz" or "Z" suffix trimmed,
+ * and remove any previous uncompressed copy. - FM
+ */
+ StrAllocCopy(path, me->anchor->FileCache);
+ if ((len = (int) strlen(path)) > 3 &&
+ (!strcasecomp(&path[len - 2], "gz") ||
+ !strcasecomp(&path[len - 2], "zz"))) {
+#ifdef USE_ZLIB
+ if (!skip_loadfile) {
+ use_zread = YES;
+ } else
+#endif /* USE_ZLIB */
+ {
+ path[len - 3] = '\0';
+ (void) remove(path);
+ }
+ } else if (len > 4 && !strcasecomp(&path[len - 3], "bz2")) {
+#ifdef USE_BZLIB
+ if (!skip_loadfile) {
+ use_zread = YES;
+ } else
+#endif /* USE_BZLIB */
+ {
+ path[len - 4] = '\0';
+ (void) remove(path);
+ }
+ } else if (len > 3 && !strcasecomp(&path[len - 2], "br")) {
+#ifdef USE_BROTLI
+ if (!skip_loadfile) {
+ use_zread = YES;
+ } else
+#endif /* USE_BROTLI */
+ {
+ path[len - 3] = '\0';
+ (void) remove(path);
+ }
+ } else if (len > 2 && !strcasecomp(&path[len - 1], "Z")) {
+ path[len - 2] = '\0';
+ (void) remove(path);
+ }
+ if (!use_zread) {
+ if (!dump_output_immediately) {
+ /*
+ * Tell user what's happening. - FM
+ */
+ _HTProgress(me->end_command);
+ }
+ /*
+ * Uncompress it. - FM
+ */
+ if (!isEmpty(me->end_command))
+ LYSystem(me->end_command);
+ found = LYCanReadFile(me->anchor->FileCache);
+ }
+ if (found) {
+ /*
+ * It's still there with the "gz" or "Z" suffix,
+ * so the uncompression failed. - FM
+ */
+ if (!dump_output_immediately) {
+ lynx_force_repaint();
+ LYrefresh();
+ }
+ HTAlert(ERROR_UNCOMPRESSING_TEMP);
+ (void) LYRemoveTemp(me->anchor->FileCache);
+ FREE(me->anchor->FileCache);
+ } else {
+ /*
+ * Succeeded! Create a complete address
+ * for the uncompressed file and invoke
+ * HTLoadFile() to handle it. - FM
+ */
+#ifdef FNAMES_8_3
+ /*
+ * Assuming we have just uncompressed e.g.
+ * FILE-mpeg.gz -> FILE-mpeg, restore/shorten
+ * the name to be fit for passing to an external
+ * viewer, by renaming FILE-mpeg -> FILE.mpe - kw
+ */
+ if (skip_loadfile) {
+ char *new_path = NULL;
+ char *the_dash = me->idash ? strrchr(path, '-') : 0;
+
+ if (the_dash != 0) {
+ unsigned off = (the_dash - path);
+
+ StrAllocCopy(new_path, path);
+ new_path[off] = '.';
+ if (strlen(new_path + off) > 4)
+ new_path[off + 4] = '\0';
+ if (LYRenameFile(path, new_path) == 0) {
+ FREE(path);
+ path = new_path;
+ } else {
+ FREE(new_path);
+ }
+ }
+ }
+#endif /* FNAMES_8_3 */
+ LYLocalFileToURL(&addr, path);
+ if (!use_zread) {
+ LYRenamedTemp(me->anchor->FileCache, path);
+ StrAllocCopy(me->anchor->FileCache, path);
+ StrAllocCopy(me->anchor->content_encoding, "binary");
+ }
+ FREE(path);
+ if (!skip_loadfile) {
+ /*
+ * Lock the chartrans info we may possibly have,
+ * so HTCharsetFormat() will not apply the default
+ * for local files. - KW
+ */
+ if (HTAnchor_getUCLYhndl(me->anchor,
+ UCT_STAGE_PARSER) < 0) {
+ /*
+ * If not yet set - KW
+ */
+ HTAnchor_copyUCInfoStage(me->anchor,
+ UCT_STAGE_PARSER,
+ UCT_STAGE_MIME,
+ UCT_SETBY_DEFAULT + 1);
+ }
+ HTAnchor_copyUCInfoStage(me->anchor,
+ UCT_STAGE_PARSER,
+ UCT_STAGE_MIME, -1);
+ }
+ /*
+ * Create a complete address for
+ * the uncompressed file. - FM
+ */
+ if (!dump_output_immediately) {
+ /*
+ * Tell user what's happening. - FM
+ * HTInfoMsg2(WWW_USING_MESSAGE, addr);
+ * but only in the history, not on screen -RS
+ */
+ LYstore_message2(WWW_USING_MESSAGE, addr);
+ }
+
+ if (skip_loadfile) {
+ /*
+ * It's a temporary file we're passing to a viewer or
+ * helper application. Loading the temp file through
+ * HTLoadFile() would result in yet another HTStream
+ * (created with HTSaveAndExecute()) which would just
+ * copy the temp file to another temp file (or even the
+ * same!). We can skip this needless duplication by
+ * using the viewer_command which has already been
+ * determined when the HTCompressed stream was created.
+ * - kw
+ */
+ FREE(me->end_command);
+
+ HTAddParam(&(me->end_command), me->viewer_command, 1, me->anchor->FileCache);
+ HTEndParam(&(me->end_command), me->viewer_command, 1);
+
+ if (!dump_output_immediately) {
+ /*
+ * Tell user what's happening. - FM
+ */
+ HTProgress(me->end_command);
+#ifndef WIN_EX
+ stop_curses();
+#endif
+ }
+#ifdef _WIN_CC
+ exec_command(me->end_command, FALSE);
+#else
+ LYSystem(me->end_command);
+#endif
+ if (me->remove_command) {
+ /* NEVER REMOVE THE FILE unless during an abort!!! */
+ FREE(me->remove_command);
+ }
+ if (!dump_output_immediately) {
+#ifdef WIN_EX
+ if (focus_window) {
+ HTInfoMsg(gettext("Set focus1"));
+ (void) SetForegroundWindow(cur_handle);
+ }
+#else
+ start_curses();
+#endif
+ }
+ } else {
+ (void) HTLoadFile(addr,
+ me->anchor,
+ me->output_format,
+ me->sink);
+ }
+ if (dump_output_immediately &&
+ me->output_format == WWW_PRESENT) {
+ FREE(addr);
+ (void) remove(me->anchor->FileCache);
+ FREE(me->anchor->FileCache);
+ FREE(me->remove_command);
+ FREE(me->end_command);
+ FREE(me->viewer_command);
+ FREE(me);
+ return;
+ }
+ }
+ FREE(addr);
+ }
+ if (me->remove_command) {
+ /* NEVER REMOVE THE FILE unless during an abort!!! */
+ FREE(me->remove_command);
+ }
+ } else if (strcmp(me->end_command, "SaveToFile")) {
+ /*
+ * It's a temporary file we're passing to a viewer or helper
+ * application. - FM
+ */
+ if (!dump_output_immediately) {
+ /*
+ * Tell user what's happening. - FM
+ */
+ _HTProgress(me->end_command);
+#ifndef WIN_EX
+ stop_curses();
+#endif
+ }
+#ifdef _WIN_CC
+ exec_command(me->end_command, wait_viewer_termination);
+#else
+ LYSystem(me->end_command);
+#endif
+
+ if (me->remove_command) {
+ /* NEVER REMOVE THE FILE unless during an abort!!! */
+ FREE(me->remove_command);
+ }
+ if (!dump_output_immediately) {
+#ifdef WIN_EX
+ if (focus_window) {
+ HTInfoMsg(gettext("Set focus2"));
+ (void) SetForegroundWindow(cur_handle);
+ }
+#else
+ start_curses();
+#endif
+ }
+ } else {
+ /*
+ * It's a file we saved to disk for handling via a menu. - FM
+ */
+ if (me->remove_command) {
+ /* NEVER REMOVE THE FILE unless during an abort!!! */
+ FREE(me->remove_command);
+ }
+ if (!dump_output_immediately) {
+#ifdef WIN_EX
+ if (focus_window) {
+ HTInfoMsg(gettext("Set focus3"));
+ (void) SetForegroundWindow(cur_handle);
+ }
+#else
+ start_curses();
+#endif
+ }
+ }
+ FREE(me->end_command);
+ }
+ FREE(me->viewer_command);
+
+ if (dump_output_immediately) {
+ if (me->anchor->FileCache)
+ (void) remove(me->anchor->FileCache);
+ FREE(me);
+#ifdef USE_PERSISTENT_COOKIES
+ /*
+ * We want to save cookies picked up when in source mode. ...
+ */
+ if (persistent_cookies)
+ LYStoreCookies(LYCookieSaveFile);
+#endif /* USE_PERSISTENT_COOKIES */
+ exit_immediately(EXIT_SUCCESS);
+ }
+
+ FREE(me);
+ return;
+}
+
+#ifdef VMS
+# define REMOVE_COMMAND "delete/noconfirm/nolog %s;"
+#else
+# define REMOVE_COMMAND "%s"
+#endif /* VMS */
+
+/* Abort writing
+ * -------------
+ */
+static void HTFWriter_abort(HTStream *me, HTError e GCC_UNUSED)
+{
+ CTRACE((tfp, "HTFWriter_abort called\n"));
+ LYCloseTempFP(me->fp);
+ FREE(me->viewer_command);
+ if (me->end_command) { /* Temp file */
+ CTRACE((tfp, "HTFWriter: Aborting: file not executed or saved.\n"));
+ FREE(me->end_command);
+ if (me->remove_command) {
+#ifdef VMS
+ LYSystem(me->remove_command);
+#else
+ (void) chmod(me->remove_command, 0600); /* Ignore errors */
+ if (0 != unlink(me->remove_command)) {
+ char buf[560];
+
+ sprintf(buf, "%.60s '%.400s': %.60s",
+ gettext("Error deleting file"),
+ me->remove_command, LYStrerror(errno));
+ HTAlert(buf);
+ }
+#endif
+ FREE(me->remove_command);
+ }
+ }
+
+ FREE(WWW_Download_File);
+
+ FREE(me);
+}
+
+/* Structured Object Class
+ * -----------------------
+ */
+static const HTStreamClass HTFWriter = /* As opposed to print etc */
+{
+ "FileWriter",
+ HTFWriter_free,
+ HTFWriter_abort,
+ HTFWriter_put_character,
+ HTFWriter_put_string,
+ HTFWriter_write
+};
+
+/* Subclass-specific Methods
+ * -------------------------
+ */
+HTStream *HTFWriter_new(FILE *fp)
+{
+ HTStream *me;
+
+ if (!fp)
+ return NULL;
+
+ me = typecalloc(HTStream);
+ if (me == NULL)
+ outofmem(__FILE__, "HTFWriter_new");
+
+ me->isa = &HTFWriter;
+
+ me->fp = fp;
+ me->end_command = NULL;
+ me->remove_command = NULL;
+ me->anchor = NULL;
+ me->sink = NULL;
+
+ return me;
+}
+
+/* Make system command from template
+ * ---------------------------------
+ *
+ * See mailcap spec for description of template.
+ */
+static char *mailcap_substitute(HTParentAnchor *anchor,
+ HTPresentation *pres,
+ char *fnam)
+{
+ char *result = LYMakeMailcapCommand(pres->command,
+ anchor->content_type_params,
+ fnam);
+
+#if defined(UNIX)
+ /* if we don't have a "%s" token, expect to provide the file via stdin */
+ if (!LYMailcapUsesPctS(pres->command)) {
+ char *prepend = 0;
+ const char *format = "( %s ) < %s";
+
+ HTSprintf(&prepend, "( %s", result); /* ...avoid quoting */
+ HTAddParam(&prepend, format, 2, fnam); /* ...to quote if needed */
+ FREE(result);
+ result = prepend;
+ }
+#endif
+ return result;
+}
+
+/* Take action using a system command
+ * ----------------------------------
+ *
+ * originally from Ghostview handling by Marc Andreseen.
+ * Creates temporary file, writes to it, executes system command
+ * on end-document. The suffix of the temp file can be given
+ * in case the application is fussy, or so that a generic opener can
+ * be used.
+ */
+HTStream *HTSaveAndExecute(HTPresentation *pres,
+ HTParentAnchor *anchor,
+ HTStream *sink)
+{
+ char fnam[LY_MAXPATH];
+ const char *suffix;
+ HTStream *me;
+
+ if (traversal) {
+ LYCancelledFetch = TRUE;
+ return (NULL);
+ }
+#if defined(EXEC_LINKS) || defined(EXEC_SCRIPTS)
+ if (pres->quality >= 999.0) { /* exec link */
+ if (dump_output_immediately) {
+ LYCancelledFetch = TRUE;
+ return (NULL);
+ }
+ if (no_exec) {
+ HTAlert(EXECUTION_DISABLED);
+ return HTPlainPresent(pres, anchor, sink);
+ }
+ if (!local_exec) {
+ if (local_exec_on_local_files &&
+ (LYJumpFileURL ||
+ !StrNCmp(anchor->address, "file://localhost", 16))) {
+ /* allow it to continue */
+ ;
+ } else {
+ char *buf = 0;
+
+ HTSprintf0(&buf, EXECUTION_DISABLED_FOR_FILE,
+ key_for_func(LYK_OPTIONS));
+ HTAlert(buf);
+ FREE(buf);
+ return HTPlainPresent(pres, anchor, sink);
+ }
+ }
+ }
+#endif /* EXEC_LINKS || EXEC_SCRIPTS */
+
+ if (dump_output_immediately) {
+ return (HTSaveToFile(pres, anchor, sink));
+ }
+
+ me = typecalloc(HTStream);
+ if (me == NULL)
+ outofmem(__FILE__, "HTSaveAndExecute");
+
+ me->isa = &HTFWriter;
+ me->input_format = pres->rep;
+ me->output_format = pres->rep_out;
+ me->anchor = anchor;
+ me->sink = sink;
+
+ if (LYCachedTemp(fnam, &(anchor->FileCache))) {
+ /* This used to be LYNewBinFile(fnam); changed to a different call so
+ * that the open fp gets registered in the list keeping track of temp
+ * files, equivalent to when LYOpenTemp() gets called below. This
+ * avoids a file descriptor leak caused by LYCloseTempFP() not being
+ * able to find the fp. The binary suffix is expected to not be used,
+ * it's only for fallback in unusual error cases. - kw
+ */
+ me->fp = LYOpenTempRewrite(fnam, BIN_SUFFIX, BIN_W);
+ } else {
+#if defined(WIN_EX) && !defined(__CYGWIN__) /* 1998/01/04 (Sun) */
+ if (!StrNCmp(anchor->address, "file://localhost", 16)) {
+
+ /* 1998/01/23 (Fri) 17:38:26 */
+ char *cp, *view_fname;
+
+ me->fp = NULL;
+
+ view_fname = fnam + 3;
+ LYStrNCpy(view_fname, anchor->address + 17, sizeof(fnam) - 5);
+ HTUnEscape(view_fname);
+
+ if (StrChr(view_fname, ':') == NULL) {
+ fnam[0] = windows_drive[0];
+ fnam[1] = windows_drive[1];
+ fnam[2] = '/';
+ view_fname = fnam;
+ }
+
+ /* 1998/04/21 (Tue) 11:04:16 */
+ cp = view_fname;
+ while (*cp) {
+ if (IS_SJIS_HI1(UCH(*cp)) || IS_SJIS_HI2(UCH(*cp))) {
+ cp += 2;
+ continue;
+ } else if (*cp == '/') {
+ *cp = '\\';
+ }
+ cp++;
+ }
+ if (StrChr(view_fname, ' '))
+ view_fname = quote_pathname(view_fname);
+
+ StrAllocCopy(me->viewer_command, pres->command);
+
+ me->end_command = mailcap_substitute(anchor, pres, view_fname);
+ me->remove_command = NULL;
+
+ return me;
+ }
+#endif
+ /*
+ * Check for a suffix.
+ * Save the file under a suitably suffixed name.
+ */
+ if (!strcasecomp(pres->rep->name, STR_HTML)) {
+ suffix = HTML_SUFFIX;
+ } else if (!strncasecomp(pres->rep->name, "text/", 5)) {
+ suffix = TEXT_SUFFIX;
+ } else if ((suffix = HTFileSuffix(pres->rep,
+ anchor->content_encoding)) == 0
+ || *suffix != '.') {
+ if (!strncasecomp(pres->rep->name, "application/", 12)) {
+ suffix = BIN_SUFFIX;
+ } else {
+ suffix = HTML_SUFFIX;
+ }
+ }
+ me->fp = LYOpenTemp(fnam, suffix, BIN_W);
+ }
+
+ if (!me->fp) {
+ HTAlert(CANNOT_OPEN_TEMP);
+ FREE(me);
+ return NULL;
+ }
+
+ StrAllocCopy(me->viewer_command, pres->command);
+ /*
+ * Make command to process file.
+ */
+ me->end_command = mailcap_substitute(anchor, pres, fnam);
+
+ /*
+ * Make command to delete file.
+ */
+ me->remove_command = NULL;
+ HTAddParam(&(me->remove_command), REMOVE_COMMAND, 1, fnam);
+ HTEndParam(&(me->remove_command), REMOVE_COMMAND, 1);
+
+ StrAllocCopy(anchor->FileCache, fnam);
+ return me;
+}
+
+/* Format Converter using system command
+ * -------------------------------------
+ */
+
+/* @@@@@@@@@@@@@@@@@@@@@@ */
+
+/* Save to a local file LJM!!!
+ * --------------------
+ *
+ * usually a binary file that can't be displayed
+ *
+ * originally from Ghostview handling by Marc Andreseen.
+ * Asks the user if he wants to continue, creates a temporary
+ * file, and writes to it. In HTSaveToFile_Free
+ * the user will see a list of choices for download
+ */
+HTStream *HTSaveToFile(HTPresentation *pres,
+ HTParentAnchor *anchor,
+ HTStream *sink)
+{
+ HTStream *ret_obj;
+ char fnam[LY_MAXPATH];
+ const char *suffix;
+ char *cp;
+ int c = 0;
+
+#ifdef VMS
+ BOOL IsBinary = TRUE;
+#endif
+
+ ret_obj = typecalloc(HTStream);
+
+ if (ret_obj == NULL)
+ outofmem(__FILE__, "HTSaveToFile");
+
+ ret_obj->isa = &HTFWriter;
+ ret_obj->remove_command = NULL;
+ ret_obj->end_command = NULL;
+ ret_obj->input_format = pres->rep;
+ ret_obj->output_format = pres->rep_out;
+ ret_obj->anchor = anchor;
+ ret_obj->sink = sink;
+
+ if (dump_output_immediately) {
+ ret_obj->fp = stdout; /* stdout */
+ if (HTOutputFormat == WWW_DOWNLOAD)
+ goto Prepend_BASE;
+ return ret_obj;
+ }
+
+ LYCancelDownload = FALSE;
+ if (HTOutputFormat != WWW_DOWNLOAD) {
+ if (traversal ||
+ (no_download && !override_no_download && no_disk_save)) {
+ if (!traversal) {
+ HTAlert(CANNOT_DISPLAY_FILE);
+ }
+ LYCancelDownload = TRUE;
+ if (traversal)
+ LYCancelledFetch = TRUE;
+ FREE(ret_obj);
+ return (NULL);
+ }
+
+ if (((cp = StrChr(pres->rep->name, ';')) != NULL) &&
+ strstr((cp + 1), "charset") != NULL) {
+ _user_message(MSG_DOWNLOAD_OR_CANCEL, pres->rep->name);
+ } else if (*(pres->rep->name) != '\0') {
+ _user_message(MSG_DOWNLOAD_OR_CANCEL, pres->rep->name);
+ } else {
+ _statusline(CANNOT_DISPLAY_FILE_D_OR_C);
+ }
+
+ while (c != 'D' && c != 'C' && !LYCharIsINTERRUPT(c)) {
+ c = LYgetch_single();
+#ifdef VMS
+ /*
+ * 'C'ancel on Control-C or Control-Y and
+ * a 'N'o to the "really exit" query. - FM
+ */
+ if (HadVMSInterrupt) {
+ HadVMSInterrupt = FALSE;
+ c = 'C';
+ }
+#endif /* VMS */
+ }
+
+ /*
+ * Cancel on 'C', 'c' or Control-G or Control-C.
+ */
+ if (c == 'C' || LYCharIsINTERRUPT(c)) {
+ _statusline(CANCELLING_FILE);
+ LYCancelDownload = TRUE;
+ FREE(ret_obj);
+ return (NULL);
+ }
+ }
+
+ /*
+ * Set up a 'D'ownload.
+ */
+ if (LYCachedTemp(fnam, &(anchor->FileCache))) {
+ /* This used to be LYNewBinFile(fnam); changed to a different call so
+ * that the open fp gets registered in the list keeping track of temp
+ * files, equivalent to when LYOpenTemp() gets called below. This
+ * avoids a file descriptor leak caused by LYCloseTempFP() not being
+ * able to find the fp. The binary suffix is expected to not be used,
+ * it's only for fallback in unusual error cases. - kw
+ */
+ ret_obj->fp = LYOpenTempRewrite(fnam, BIN_SUFFIX, BIN_W);
+ } else {
+ /*
+ * Check for a suffix.
+ * Save the file under a suitably suffixed name.
+ */
+ if (!strcasecomp(pres->rep->name, STR_HTML)) {
+ suffix = HTML_SUFFIX;
+ } else if (!strncasecomp(pres->rep->name, "text/", 5)) {
+ suffix = TEXT_SUFFIX;
+ } else if (!strncasecomp(pres->rep->name, "application/", 12)) {
+ suffix = BIN_SUFFIX;
+ } else if ((suffix = HTFileSuffix(pres->rep,
+ anchor->content_encoding)) == 0
+ || *suffix != '.') {
+ suffix = HTML_SUFFIX;
+ }
+ ret_obj->fp = LYOpenTemp(fnam, suffix, BIN_W);
+ }
+
+ if (!ret_obj->fp) {
+ HTAlert(CANNOT_OPEN_OUTPUT);
+ FREE(ret_obj);
+ return NULL;
+ }
+
+ if (0 == strncasecomp(pres->rep->name, "text/", 5) ||
+ 0 == strcasecomp(pres->rep->name, "application/postscript") ||
+ 0 == strcasecomp(pres->rep->name, "application/x-RUNOFF-MANUAL"))
+ /*
+ * It's a text file requested via 'd'ownload. Keep adding others to
+ * the above list, 'til we add a configurable procedure. - FM
+ */
+#ifdef VMS
+ IsBinary = FALSE;
+#endif
+
+ /*
+ * Any "application/foo" or other non-"text/foo" types that are actually
+ * text but not checked, above, will be treated as binary, so show the type
+ * to help sort that out later. Unix folks don't need to know this, but
+ * we'll show it to them, too. - FM
+ */
+ HTInfoMsg2(CONTENT_TYPE_MSG, pres->rep->name);
+
+ StrAllocCopy(WWW_Download_File, fnam);
+
+ /*
+ * Make command to delete file.
+ */
+ ret_obj->remove_command = NULL;
+ HTAddParam(&(ret_obj->remove_command), REMOVE_COMMAND, 1, fnam);
+ HTEndParam(&(ret_obj->remove_command), REMOVE_COMMAND, 1);
+
+#ifdef VMS
+ if (IsBinary && UseFixedRecords) {
+ StrAllocCopy(ret_obj->end_command, "SaveVMSBinaryFile");
+ FIXED_RECORD_COMMAND = 0;
+ HTAddParam(&FIXED_RECORD_COMMAND, FIXED_RECORD_COMMAND_MASK, 1, fnam);
+ HTEndParam(&FIXED_RECORD_COMMAND, FIXED_RECORD_COMMAND_MASK, 1);
+
+ } else {
+#endif /* VMS */
+ StrAllocCopy(ret_obj->end_command, "SaveToFile");
+#ifdef VMS
+ }
+#endif /* VMS */
+
+ _statusline(RETRIEVING_FILE);
+
+ StrAllocCopy(anchor->FileCache, fnam);
+ Prepend_BASE:
+ if (LYPrependBaseToSource &&
+ !strncasecomp(pres->rep->name, STR_HTML, 9) &&
+ !anchor->content_encoding) {
+ /*
+ * Add the document's base as a BASE tag at the top of the file, so
+ * that any partial or relative URLs within it will be resolved
+ * relative to that if no BASE tag is present and replaces it. Note
+ * that the markup will be technically invalid if a DOCTYPE
+ * declaration, or HTML or HEAD tags, are present, and thus the file
+ * may need editing for perfection. - FM
+ *
+ * Add timestamp (last reload).
+ */
+ char *temp = NULL;
+
+ if (non_empty(anchor->content_base)) {
+ StrAllocCopy(temp, anchor->content_base);
+ } else if (non_empty(anchor->content_location)) {
+ StrAllocCopy(temp, anchor->content_location);
+ }
+ if (temp) {
+ LYRemoveBlanks(temp);
+ if (!is_url(temp)) {
+ FREE(temp);
+ }
+ }
+
+ fprintf(ret_obj->fp,
+ "<!-- X-URL: %s -->\n", anchor->address);
+ if (non_empty(anchor->date)) {
+ fprintf(ret_obj->fp,
+ "<!-- Date: %s -->\n", anchor->date);
+ if (non_empty(anchor->last_modified)
+ && strcmp(anchor->last_modified, anchor->date)
+ && strcmp(anchor->last_modified,
+ "Thu, 01 Jan 1970 00:00:01 GMT")) {
+ fprintf(ret_obj->fp,
+ "<!-- Last-Modified: %s -->\n", anchor->last_modified);
+ }
+ }
+ fprintf(ret_obj->fp,
+ "<BASE HREF=\"%s\">\n\n", (temp ? temp : anchor->address));
+ FREE(temp);
+ }
+ if (LYPrependCharsetToSource &&
+ !strncasecomp(pres->rep->name, STR_HTML, 9) &&
+ !anchor->content_encoding) {
+ /*
+ * Add the document's charset as a META CHARSET tag at the top of the
+ * file, so HTTP charset header will not be forgotten when a document
+ * saved as local file. We add this line only(!) if HTTP charset
+ * present. - LP Note that the markup will be technically invalid if a
+ * DOCTYPE declaration, or HTML or HEAD tags, are present, and thus the
+ * file may need editing for perfection. - FM
+ */
+ char *temp = NULL;
+
+ if (non_empty(anchor->charset)) {
+ StrAllocCopy(temp, anchor->charset);
+ LYRemoveBlanks(temp);
+ fprintf(ret_obj->fp,
+ "<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"" STR_HTML
+ "; charset=%s\">\n\n",
+ temp);
+ }
+ FREE(temp);
+ }
+ return ret_obj;
+}
+
+/* Set up stream for uncompressing - FM
+ * -------------------------------
+ */
+HTStream *HTCompressed(HTPresentation *pres,
+ HTParentAnchor *anchor,
+ HTStream *sink)
+{
+ HTStream *me;
+ HTFormat format;
+ char *type = NULL;
+ HTPresentation *Pres = NULL;
+ HTPresentation *Pnow = NULL;
+ int n, i;
+ BOOL can_present = FALSE;
+ char fnam[LY_MAXPATH];
+ char temp[LY_MAXPATH]; /* actually stores just a suffix */
+ const char *suffix;
+ char *uncompress_mask = NULL;
+ const char *compress_suffix = "";
+ const char *middle;
+
+ /*
+ * Deal with any inappropriate invocations of this function, or a download
+ * request, in which case we won't bother to uncompress the file. - FM
+ */
+ if (!(anchor->content_encoding && anchor->content_type)) {
+ /*
+ * We have no idea what we're dealing with, so treat it as a binary
+ * stream. - FM
+ */
+ format = HTAtom_for(STR_BINARY);
+ me = HTStreamStack(format, pres->rep_out, sink, anchor);
+ return me;
+ }
+ n = HTList_count(HTPresentations);
+ for (i = 0; i < n; i++) {
+ Pnow = (HTPresentation *) HTList_objectAt(HTPresentations, i);
+ if (!strcasecomp(Pnow->rep->name, anchor->content_type) &&
+ Pnow->rep_out == WWW_PRESENT) {
+ const char *program = "";
+
+ /*
+ * Pick the best presentation. User-defined mappings are at the
+ * end of the list, and unless the quality is lower, we prefer
+ * those.
+ */
+ if (Pres == 0)
+ Pres = Pnow;
+ else if (Pres->quality > Pnow->quality)
+ continue;
+ else
+ Pres = Pnow;
+ /*
+ * We have a presentation mapping for it. - FM
+ */
+ can_present = TRUE;
+ switch (HTEncodingToCompressType(anchor->content_encoding)) {
+ case cftGzip:
+ if ((program = HTGetProgramPath(ppGZIP)) != NULL) {
+ /*
+ * It's compressed with the modern gzip. - FM
+ */
+ StrAllocCopy(uncompress_mask, program);
+ StrAllocCat(uncompress_mask, " -d --no-name %s");
+ compress_suffix = "gz";
+ }
+ break;
+ case cftDeflate:
+ if ((program = HTGetProgramPath(ppINFLATE)) != NULL) {
+ /*
+ * It's compressed with a zlib wrapper.
+ */
+ StrAllocCopy(uncompress_mask, program);
+ StrAllocCat(uncompress_mask, " %s");
+ compress_suffix = "zz";
+ }
+ break;
+ case cftBzip2:
+ if ((program = HTGetProgramPath(ppBZIP2)) != NULL) {
+ StrAllocCopy(uncompress_mask, program);
+ StrAllocCat(uncompress_mask, " -d %s");
+ compress_suffix = "bz2";
+ }
+ break;
+ case cftBrotli:
+ if ((program = HTGetProgramPath(ppBROTLI)) != NULL) {
+ StrAllocCopy(uncompress_mask, program);
+ StrAllocCat(uncompress_mask, " -j -d %s");
+ compress_suffix = "br";
+ }
+ break;
+ case cftCompress:
+ if ((program = HTGetProgramPath(ppUNCOMPRESS)) != NULL) {
+ /*
+ * It's compressed the old fashioned Unix way. - FM
+ */
+ StrAllocCopy(uncompress_mask, program);
+ StrAllocCat(uncompress_mask, " %s");
+ compress_suffix = "Z";
+ }
+ break;
+ case cftNone:
+ break;
+ }
+ }
+ }
+ if (can_present == FALSE || /* no presentation mapping */
+ uncompress_mask == NULL || /* not gzip or compress */
+ StrChr(anchor->content_type, ';') || /* wrong charset */
+ HTOutputFormat == WWW_DOWNLOAD || /* download */
+ !strcasecomp(pres->rep_out->name, STR_DOWNLOAD) || /* download */
+ (traversal && /* only handle html or plain text for traversals */
+ strcasecomp(anchor->content_type, STR_HTML) &&
+ strcasecomp(anchor->content_type, STR_PLAINTEXT))) {
+ /*
+ * Cast the Content-Encoding to a Content-Type and pass it back to be
+ * handled as that type. - FM
+ */
+ if (StrChr(anchor->content_encoding, '/') == NULL) {
+ /*
+ * Use "x-" prefix, none of the types we are likely to construct
+ * here are official. That is we generate "application/x-gzip" and
+ * so on. - kw
+ */
+ if (!strncasecomp(anchor->content_encoding, "x-", 2))
+ StrAllocCopy(type, "application/");
+ else
+ StrAllocCopy(type, "application/x-");
+ StrAllocCat(type, anchor->content_encoding);
+ } else {
+ StrAllocCopy(type, anchor->content_encoding);
+ }
+ format = HTAtom_for(type);
+ FREE(type);
+ FREE(uncompress_mask);
+ me = HTStreamStack(format, pres->rep_out, sink, anchor);
+ return me;
+ }
+
+ /*
+ * Set up the stream structure for uncompressing and then handling based on
+ * the uncompressed Content-Type.- FM
+ */
+ me = typecalloc(HTStream);
+ if (me == NULL)
+ outofmem(__FILE__, "HTCompressed");
+
+ me->isa = &HTFWriter;
+ me->input_format = pres->rep;
+ me->output_format = pres->rep_out;
+ me->anchor = anchor;
+ me->sink = sink;
+#ifdef FNAMES_8_3
+ me->idash = FALSE;
+#endif
+
+ /*
+ * Remove any old versions of the file. - FM
+ */
+ if (anchor->FileCache) {
+ (void) LYRemoveTemp(anchor->FileCache);
+ FREE(anchor->FileCache);
+ }
+
+ /*
+ * Get a new temporary filename and substitute a suitable suffix. - FM
+ */
+ middle = NULL;
+ if (!strcasecomp(anchor->content_type, STR_HTML)) {
+ middle = HTML_SUFFIX;
+ middle++; /* point to 'h' of .htm(l) - kw */
+ } else if (!strncasecomp(anchor->content_type, "text/", 5)) {
+ middle = &TEXT_SUFFIX[1];
+ } else if (!strncasecomp(anchor->content_type, "application/", 12)) {
+ /* FIXME: why is this BEFORE HTFileSuffix? */
+ middle = &BIN_SUFFIX[1];
+ } else if ((suffix =
+ HTFileSuffix(HTAtom_for(anchor->content_type), NULL)) &&
+ *suffix == '.') {
+#if defined(VMS) || defined(FNAMES_8_3)
+ if (StrChr(suffix + 1, '.') == NULL)
+#endif
+ middle = suffix + 1;
+ }
+
+ temp[0] = 0; /* construct the suffix */
+ if (middle) {
+#ifdef FNAMES_8_3
+ me->idash = TRUE; /* remember position of '-' - kw */
+ strcat(temp, "-"); /* NAME-htm, NAME-txt, etc. - hack for DOS */
+#else
+ strcat(temp, "."); /* NAME.html, NAME-txt etc. */
+#endif /* FNAMES_8_3 */
+ strcat(temp, middle);
+#ifdef VMS
+ strcat(temp, "-"); /* NAME.html-gz, NAME.txt-gz, NAME.txt-Z etc. */
+#else
+ strcat(temp, "."); /* NAME-htm.gz (DOS), NAME.html.gz (UNIX)etc. */
+#endif /* VMS */
+ }
+ strcat(temp, compress_suffix);
+
+ /*
+ * Open the file for receiving the compressed input stream. - FM
+ */
+ me->fp = LYOpenTemp(fnam, temp, BIN_W);
+ if (!me->fp) {
+ HTAlert(CANNOT_OPEN_TEMP);
+ FREE(uncompress_mask);
+ FREE(me);
+ return NULL;
+ }
+
+ /*
+ * me->viewer_command will be NULL if the converter Pres found above is not
+ * for an external viewer but an internal HTStream converter. We also
+ * don't set it under conditions where HTSaveAndExecute would disallow
+ * execution of the command. - KW
+ */
+ if (!dump_output_immediately && !traversal
+#if defined(EXEC_LINKS) || defined(EXEC_SCRIPTS)
+ && (Pres->quality < 999.0 ||
+ (!no_exec && /* allowed exec link or script ? */
+ (local_exec ||
+ (local_exec_on_local_files &&
+ (LYJumpFileURL ||
+ !StrNCmp(anchor->address, "file://localhost", 16))))))
+#endif /* EXEC_LINKS || EXEC_SCRIPTS */
+ ) {
+ StrAllocCopy(me->viewer_command, Pres->command);
+ }
+
+ /*
+ * Make command to process file. - FM
+ */
+#ifdef USE_BROTLI
+ if (compress_suffix[0] == 'b' /* e.g., ".br" */
+ && compress_suffix[1] == 'r'
+ && !me->viewer_command) {
+ /*
+ * We won't call brotli externally, so we don't need to supply a
+ * command for it.
+ */
+ StrAllocCopy(me->end_command, "");
+ } else
+#endif
+#ifdef USE_BZLIB
+ if (compress_suffix[0] == 'b' /* must be bzip2 */
+ && compress_suffix[1] == 'z'
+ && !me->viewer_command) {
+ /*
+ * We won't call bzip2 externally, so we don't need to supply a command
+ * for it.
+ */
+ StrAllocCopy(me->end_command, "");
+ } else
+#endif
+#ifdef USE_ZLIB
+ /* FIXME: allow deflate here, e.g., 'z' */
+ if (compress_suffix[0] == 'g' /* must be gzip */
+ && !me->viewer_command) {
+ /*
+ * We won't call gzip or compress externally, so we don't need to
+ * supply a command for it.
+ */
+ StrAllocCopy(me->end_command, "");
+ } else
+#endif /* USE_ZLIB */
+ {
+ me->end_command = NULL;
+ HTAddParam(&(me->end_command), uncompress_mask, 1, fnam);
+ HTEndParam(&(me->end_command), uncompress_mask, 1);
+ }
+ FREE(uncompress_mask);
+
+ /*
+ * Make command to delete file. - FM
+ */
+ me->remove_command = NULL;
+ HTAddParam(&(me->remove_command), REMOVE_COMMAND, 1, fnam);
+ HTEndParam(&(me->remove_command), REMOVE_COMMAND, 1);
+
+ /*
+ * Save the filename and return the structure. - FM
+ */
+ StrAllocCopy(anchor->FileCache, fnam);
+ return me;
+}
+
+/* Dump output to stdout - LJM & FM
+ * ---------------------
+ *
+ */
+HTStream *HTDumpToStdout(HTPresentation *pres GCC_UNUSED,
+ HTParentAnchor *anchor,
+ HTStream *sink GCC_UNUSED)
+{
+ HTStream *ret_obj;
+
+ ret_obj = typecalloc(HTStream);
+
+ if (ret_obj == NULL)
+ outofmem(__FILE__, "HTDumpToStdout");
+
+ ret_obj->isa = &HTFWriter;
+ ret_obj->remove_command = NULL;
+ ret_obj->end_command = NULL;
+ ret_obj->anchor = anchor;
+
+ ret_obj->fp = stdout; /* stdout */
+ return ret_obj;
+}
+
+#if defined(VMS) && !defined(USE_COMMAND_FILE)
+#include <fab.h>
+#include <rmsdef.h> /* RMS status codes */
+#include <iodef.h> /* I/O function codes */
+#include <fibdef.h> /* file information block defs */
+#include <atrdef.h> /* attribute request codes */
+#ifdef NOTDEFINED /*** Not all versions of VMS compilers have these. ***/
+#include <fchdef.h> /* file characteristics */
+#include <fatdef.h> /* file attribute defs */
+#else /*** So we'll define what we need from them ourselves. ***/
+#define FCH$V_CONTIGB 0x005 /* pos of cont best try bit */
+#define FCH$M_CONTIGB (1 << FCH$V_CONTIGB) /* contig best try bit mask */
+/* VMS I/O User's Reference Manual: Part I (V5.x doc set) */
+struct fatdef {
+ unsigned char fat$b_rtype, fat$b_rattrib;
+ unsigned short fat$w_rsize;
+ unsigned long fat$l_hiblk, fat$l_efblk;
+ unsigned short fat$w_ffbyte;
+ unsigned char fat$b_bktsize, fat$b_vfcsize;
+ unsigned short fat$w_maxrec, fat$w_defext, fat$w_gbc;
+ unsigned:16,:32,:16; /* 6 bytes reserved, 2 bytes not used */
+ unsigned short fat$w_versions;
+};
+#endif /* NOTDEFINED */
+
+/* arbitrary descriptor without type and class info */
+typedef struct dsc {
+ unsigned short len, mbz;
+ void *adr;
+} Desc;
+
+extern unsigned long sys$open(), sys$qiow(), sys$dassgn();
+
+#define syswork(sts) ((sts) & 1)
+#define sysfail(sts) (!syswork(sts))
+
+/*
+ * 25-Jul-1995 - Pat Rankin (rankin@eql.caltech.edu)
+ *
+ * Force a file to be marked as having fixed-length, 512 byte records
+ * without implied carriage control, and with best_try_contiguous set.
+ */
+static unsigned long LYVMS_FixedLengthRecords(char *filename)
+{
+ struct FAB fab; /* RMS file access block */
+ struct fibdef fib; /* XQP file information block */
+ struct fatdef recattr; /* XQP file "record" attributes */
+ struct atrdef attr_rqst_list[3]; /* XQP attribute request itemlist */
+
+ Desc fib_dsc;
+ unsigned short channel, iosb[4];
+ unsigned long fchars, sts, tmp;
+
+ /* initialize file access block */
+ fab = cc$rms_fab;
+ fab.fab$l_fna = filename;
+ fab.fab$b_fns = (unsigned char) strlen(filename);
+ fab.fab$l_fop = FAB$M_UFO; /* user file open; no further RMS processing */
+ fab.fab$b_fac = FAB$M_PUT; /* need write access */
+ fab.fab$b_shr = FAB$M_NIL; /* exclusive access */
+
+ sts = sys$open(&fab); /* channel in stv; $dassgn to close */
+ if (sts == RMS$_FLK) {
+ /* For MultiNet, at least, if the file was just written by a remote
+ NFS client, the local NFS server might still have it open, and the
+ failed access attempt will provoke it to be closed, so try again. */
+ sts = sys$open(&fab);
+ }
+ if (sysfail(sts))
+ return sts;
+
+ /* RMS supplies a user-mode channel (see FAB$L_FOP FAB$V_UFO doc) */
+ channel = (unsigned short) fab.fab$l_stv;
+
+ /* set up ACP interface structures */
+ /* file information block, passed by descriptor; it's okay to start with
+ an empty FIB after RMS has accessed the file for us */
+ fib_dsc.len = sizeof fib;
+ fib_dsc.mbz = 0;
+ fib_dsc.adr = &fib;
+ memset((void *) &fib, 0, sizeof fib);
+ /* attribute request list */
+ attr_rqst_list[0].atr$w_size = sizeof recattr;
+ attr_rqst_list[0].atr$w_type = ATR$C_RECATTR;
+ *(void **) &attr_rqst_list[0].atr$l_addr = (void *) &recattr;
+ attr_rqst_list[1].atr$w_size = sizeof fchars;
+ attr_rqst_list[1].atr$w_type = ATR$C_UCHAR;
+ *(void **) &attr_rqst_list[1].atr$l_addr = (void *) &fchars;
+ attr_rqst_list[2].atr$w_size = attr_rqst_list[2].atr$w_type = 0;
+ attr_rqst_list[2].atr$l_addr = 0;
+ /* file "record" attributes */
+ memset((void *) &recattr, 0, sizeof recattr);
+ fchars = 0; /* file characteristics */
+
+ /* get current attributes */
+ sts = sys$qiow(0, channel, IO$_ACCESS, iosb, (void (*)()) 0, 0,
+ &fib_dsc, 0, 0, 0, attr_rqst_list, 0);
+ if (syswork(sts))
+ sts = iosb[0];
+
+ /* set desired attributes */
+ if (syswork(sts)) {
+ recattr.fat$b_rtype = FAB$C_SEQ | FAB$C_FIX; /* org=seq, rfm=fix */
+ recattr.fat$w_rsize = recattr.fat$w_maxrec = 512; /* lrl=mrs=512 */
+ recattr.fat$b_rattrib = 0; /* rat=none */
+ fchars |= FCH$M_CONTIGB; /* contiguous-best-try */
+ sts = sys$qiow(0, channel, IO$_DEACCESS, iosb, (void (*)()) 0, 0,
+ &fib_dsc, 0, 0, 0, attr_rqst_list, 0);
+ if (syswork(sts))
+ sts = iosb[0];
+ }
+
+ /* all done */
+ tmp = sys$dassgn(channel);
+ if (syswork(sts))
+ sts = tmp;
+ return sts;
+}
+#endif /* VMS && !USE_COMMAND_FILE */
diff --git a/src/HTFont.h b/src/HTFont.h
new file mode 100644
index 0000000..90c2b9e
--- /dev/null
+++ b/src/HTFont.h
@@ -0,0 +1,50 @@
+/* The portable font concept (!?*)
+*/
+
+/* Line mode browser version:
+*/
+#ifndef HTFONT_H
+#define HTFONT_H
+
+typedef long int HTMLFont; /* For now */
+
+#define HT_FONT 0
+#define HT_CAPITALS 1
+#define HT_BOLD 2
+#define HT_UNDERLINE 4
+#define HT_INVERSE 8
+#define HT_DOUBLE 0x10
+
+#define HT_BLACK 0
+#define HT_WHITE 1
+
+/*
+ * Lynx internal character representations.
+ */
+#define HT_NON_BREAK_SPACE ((char)1)
+#define HT_EN_SPACE ((char)2)
+#define LY_UNDERLINE_START_CHAR '\003'
+#define LY_UNDERLINE_END_CHAR '\004'
+
+/* Turn about is fair play ASCII platforms use EBCDIC tab;
+ EBCDIC platforms use ASCII tab for LY_BOLD_START_CHAR.
+*/
+#ifdef EBCDIC
+#define LY_BOLD_START_CHAR '\011'
+#else
+#define LY_BOLD_START_CHAR '\005'
+#endif
+
+#define LY_BOLD_END_CHAR '\006'
+#define LY_SOFT_HYPHEN ((char)7)
+#define LY_SOFT_NEWLINE ((char)8)
+
+#ifdef EBCDIC
+#define IsSpecialAttrChar(a) (((a) > '\002') && ((a) <= '\011') && ((a)!='\t'))
+#else
+#define IsSpecialAttrChar(a) (((a) > '\002') && ((a) <= '\010'))
+#endif
+
+#define IsNormalChar(a) ((a) != '\0' && !IsSpecialAttrChar(a))
+
+#endif /* HTFONT_H */
diff --git a/src/HTForms.h b/src/HTForms.h
new file mode 100644
index 0000000..17f7491
--- /dev/null
+++ b/src/HTForms.h
@@ -0,0 +1,174 @@
+/*
+ * $LynxId: HTForms.h,v 1.34 2018/05/04 22:50:54 tom Exp $
+ */
+#ifndef HTFORMS_H
+#define HTFORMS_H
+
+#ifndef LYSTRUCTS_H
+#include <LYStructs.h>
+#endif /* LYSTRUCTS_H */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+/* change_form_link() calls change_form_link_ex() with all its args and FALSE
+ * as last arg
+ */ extern int change_form_link(int cur,
+ DocInfo *newdoc,
+ BOOLEAN *refresh_screen,
+ int use_last_tfpos,
+ int immediate_submit);
+
+ extern int change_form_link_ex(int cur,
+ DocInfo *newdoc,
+ BOOLEAN *refresh_screen,
+ int use_last_tfpos,
+ int immediate_submit,
+ int draw_only);
+
+/* InputFieldData is used to pass the info between HTML.c and Gridtext.c in
+ * HText_beginInput()
+ */
+ typedef struct _InputFieldData {
+ const char *accept;
+ const char *align;
+ int checked;
+ const char *iclass;
+ int disabled;
+ int readonly;
+ const char *error;
+ const char *height;
+ const char *id;
+ const char *lang;
+ const char *max;
+ const char *maxlength;
+ const char *md;
+ const char *min;
+ const char *name;
+ int size;
+ const char *src;
+ const char *type;
+ char *value;
+ const char *width;
+ int name_cs; /* charset handle for name */
+ int value_cs; /* charset handle for value */
+ const char *accept_cs;
+ } InputFieldData;
+
+/* The OptionType structure is for a linked list of option entries
+ */
+ typedef struct _OptionType {
+ char *name; /* the name of the entry */
+ char *cp_submit_value; /* the value to submit */
+ int value_cs; /* charset value is in */
+ struct _OptionType *next; /* the next entry */
+ } OptionType;
+
+/*
+ * The FormInfo structure is used to contain the form field data within each
+ * anchor. A pointer to this structure is in the TextAnchor struct.
+ */
+ typedef struct _FormInfo {
+ char *name; /* the name of the link */
+ int number; /* which form is the link within */
+ int type; /* string, int, etc. */
+ char *value; /* user entered string data */
+ char *orig_value; /* the original value */
+ int size; /* width on the screen */
+ unsigned maxlength; /* max width of data */
+ int group; /* a group associated with the link
+ * this is used for select's
+ */
+ int num_value; /* value of the numerical fields */
+ int hrange; /* high numerical range */
+ int lrange; /* low numerical range */
+ OptionType *select_list; /* array of option choices */
+ char *submit_action; /* form's action */
+ int submit_method; /* form's method */
+ char *submit_enctype; /* form's entype */
+ char *submit_title; /* form's title */
+ BOOL no_cache; /* Always resubmit? */
+ char *cp_submit_value; /* option value to submit */
+ char *orig_submit_value; /* original submit value */
+ int size_l; /* The length of the option list */
+ int disabled; /* If YES, can't change values */
+ int readonly; /* If YES, can't change values */
+ int name_cs;
+ int value_cs;
+ char *accept_cs;
+ } FormInfo;
+
+#define FormIsReadonly(form) ((form) && ((form)->disabled || (form)->readonly))
+
+/*
+ * As structure for info associated with a form. There is some redundancy
+ * here, this shouldn't waste too much memory since the total number of forms
+ * (as opposed to form fields) per doc is expected to be rather small. More
+ * things which are per form rather than per field could be moved here. - kw
+ */
+ typedef struct _PerFormInfo {
+ int number; /* form number, see GridText.c */
+ int disabled; /* If YES, can't change values */
+ FormInfo data;
+ struct _PerFormInfo *next; /* pointer to next form in doc */
+ int nfields; /* number of fields */
+ FormInfo *first_field;
+ FormInfo *last_field; /* pointer to last field in form */
+ char *accept_cs;
+ char *thisacceptcs; /* used during submit */
+ } PerFormInfo;
+
+#define HYPERTEXT_ANCHOR 1
+#define INPUT_ANCHOR 2 /* forms mode input fields */
+#define INTERNAL_LINK_ANCHOR 5 /* 1+4, can be used as bitflag... - kw */
+
+ typedef enum {
+ F_UNKNOWN = 0,
+ F_TEXT_TYPE,
+ F_PASSWORD_TYPE,
+ F_CHECKBOX_TYPE,
+ F_RADIO_TYPE,
+ F_SUBMIT_TYPE,
+ F_RESET_TYPE,
+ F_OPTION_LIST_TYPE,
+ F_HIDDEN_TYPE,
+ F_TEXTAREA_TYPE,
+ F_RANGE_TYPE,
+ F_FILE_TYPE,
+ F_TEXT_SUBMIT_TYPE,
+ F_IMAGE_SUBMIT_TYPE,
+ F_KEYGEN_TYPE,
+ F_BUTTON_TYPE
+ } FieldTypes;
+
+#define F_SUBMITLIKE(type) ((type) == F_SUBMIT_TYPE || \
+ (type) == F_IMAGE_SUBMIT_TYPE || \
+ (type) == F_TEXT_SUBMIT_TYPE)
+
+#define F_TEXTLIKE(type) ((type) == F_TEXT_TYPE || \
+ (type) == F_TEXT_SUBMIT_TYPE || \
+ (type) == F_PASSWORD_TYPE || \
+ (type) == F_FILE_TYPE || \
+ (type) == F_TEXTAREA_TYPE)
+
+#define WWW_FORM_LINK_TYPE 1
+#define WWW_LINK_TYPE 2
+#define WWW_INTERN_LINK_TYPE 6 /* can be used as a bitflag... - kw */
+#define LINK_LINE_FOUND 8 /* used in follow_link_number, others - kw */
+#define LINK_DO_ARROWUP 16 /* returned by HTGetLinkOrFieldStart - kw */
+
+/* #define different lynx modes */
+#define NORMAL_LYNX_MODE 1
+#define FORMS_LYNX_MODE 2
+
+#define FIRST_ORDER 1
+#define MIDDLE_ORDER 2
+#define LAST_ORDER 3
+
+/* in LYForms.c */
+ extern void show_formlink_statusline(const FormInfo * form,
+ int for_what);
+#ifdef __cplusplus
+}
+#endif
+#endif /* HTFORMS_H */
diff --git a/src/HTInit.c b/src/HTInit.c
new file mode 100644
index 0000000..466bc72
--- /dev/null
+++ b/src/HTInit.c
@@ -0,0 +1,1503 @@
+/*
+ * $LynxId: HTInit.c,v 1.98 2022/06/12 21:17:37 tom Exp $
+ *
+ * Configuration-specific Initialization HTInit.c
+ * ----------------------------------------
+ */
+
+/* Define a basic set of suffixes and presentations
+ * ------------------------------------------------
+ */
+
+#include <HTUtils.h>
+
+/* Implements:
+*/
+#include <HTInit.h>
+
+#include <HTML.h>
+#include <HTPlain.h>
+#include <HTMLGen.h>
+#include <HTFile.h>
+#include <HTFormat.h>
+#include <HTMIME.h>
+#include <HTWSRC.h>
+
+#include <HTSaveToFile.h> /* LJM */
+#include <LYStrings.h>
+#include <LYUtils.h>
+#include <LYGlobalDefs.h>
+
+#include <LYexit.h>
+#include <LYLeaks.h>
+
+#define CTrace(p) CTRACE2(TRACE_CFG, p)
+
+static int HTLoadTypesConfigFile(char *fn, AcceptMedia media);
+static int HTLoadExtensionsConfigFile(char *fn);
+
+#define SET_SUFFIX1(suffix, description, type) \
+ HTSetSuffix(suffix, description, type, 1.0)
+
+#define SET_SUFFIX5(suffix, mimetype, type, description) \
+ HTSetSuffix5(suffix, mimetype, type, description, 1.0)
+
+#define SET_PRESENT(mimetype, command, quality, delay) \
+ HTSetPresentation(mimetype, command, 0, quality, delay, 0.0, 0L, media)
+
+#define SET_EXTERNL(rep_in, rep_out, command, quality) \
+ HTSetConversion(rep_in, rep_out, command, quality, 3.0, 0.0, 0L, mediaEXT)
+
+#define SET_INTERNL(rep_in, rep_out, command, quality) \
+ HTSetConversion(rep_in, rep_out, command, quality, 0.0, 0.0, 0L, mediaINT)
+
+void HTFormatInit(void)
+{
+ AcceptMedia media = mediaEXT;
+
+ CTrace((tfp, "HTFormatInit\n"));
+#ifdef NeXT
+ SET_PRESENT("application/postscript", "open %s", 1.0, 2.0);
+ SET_PRESENT("image/x-tiff", "open %s", 2.0, 2.0);
+ SET_PRESENT("image/tiff", "open %s", 1.0, 2.0);
+ SET_PRESENT("audio/basic", "open %s", 1.0, 2.0);
+ SET_PRESENT("*", "open %s", 1.0, 0.0);
+#else
+ if (LYgetXDisplay() != 0) { /* Must have X11 */
+ SET_PRESENT("application/postscript", "ghostview %s&", 1.0, 3.0);
+ if (non_empty(XLoadImageCommand)) {
+ /* *INDENT-OFF* */
+ SET_PRESENT("image/gif", XLoadImageCommand, 1.0, 3.0);
+ SET_PRESENT("image/x-xbm", XLoadImageCommand, 1.0, 3.0);
+ SET_PRESENT("image/x-xbitmap", XLoadImageCommand, 1.0, 3.0);
+ SET_PRESENT("image/x-png", XLoadImageCommand, 2.0, 3.0);
+ SET_PRESENT("image/png", XLoadImageCommand, 1.0, 3.0);
+ SET_PRESENT("image/x-rgb", XLoadImageCommand, 1.0, 3.0);
+ SET_PRESENT("image/x-tiff", XLoadImageCommand, 2.0, 3.0);
+ SET_PRESENT("image/tiff", XLoadImageCommand, 1.0, 3.0);
+ SET_PRESENT("image/jpeg", XLoadImageCommand, 1.0, 3.0);
+ /* *INDENT-ON* */
+
+ }
+ SET_PRESENT("video/mpeg", "mpeg_play %s &", 1.0, 3.0);
+
+ }
+#endif
+
+#ifdef EXEC_SCRIPTS
+ /* set quality to 999.0 for protected exec applications */
+#ifndef VMS
+ SET_PRESENT("application/x-csh", "csh %s", 999.0, 3.0);
+ SET_PRESENT("application/x-sh", "sh %s", 999.0, 3.0);
+ SET_PRESENT("application/x-ksh", "ksh %s", 999.0, 3.0);
+#else
+ SET_PRESENT("application/x-VMS_script", "@%s", 999.0, 3.0);
+#endif /* not VMS */
+#endif /* EXEC_SCRIPTS */
+
+ /*
+ * Add our header handlers.
+ */
+ SET_INTERNL("message/x-http-redirection", "*", HTMIMERedirect, 2.0);
+ SET_INTERNL("message/x-http-redirection", STR_PRESENT, HTMIMERedirect, 2.0);
+ SET_INTERNL("message/x-http-redirection", "www/debug", HTMIMERedirect, 1.0);
+ SET_INTERNL("www/mime", STR_PRESENT, HTMIMEConvert, 1.0);
+ SET_INTERNL("www/mime", STR_DOWNLOAD, HTMIMEConvert, 1.0);
+ SET_INTERNL("www/mime", STR_SOURCE, HTMIMEConvert, 1.0);
+ SET_INTERNL("www/mime", STR_DUMP, HTMIMEConvert, 1.0);
+
+ /*
+ * Add our compressed file handlers.
+ */
+ SET_INTERNL("www/compressed", STR_DOWNLOAD, HTCompressed, 1.0);
+ SET_INTERNL("www/compressed", STR_PRESENT, HTCompressed, 1.0);
+ SET_INTERNL("www/compressed", STR_SOURCE, HTCompressed, 1.0);
+ SET_INTERNL("www/compressed", STR_DUMP, HTCompressed, 1.0);
+
+ /*
+ * The following support some content types seen here/there:
+ */
+ SET_INTERNL("application/html", "text/x-c", HTMLToC, 0.5);
+ SET_INTERNL("application/html", STR_PLAINTEXT, HTMLToPlain, 0.5);
+ SET_INTERNL("application/html", STR_PRESENT, HTMLPresent, 2.0);
+ SET_INTERNL("application/html", STR_SOURCE, HTPlainPresent, 1.0);
+ SET_INTERNL("application/xml", STR_PRESENT, HTMLPresent, 2.0);
+ SET_INTERNL("application/x-wais-source", STR_SOURCE, HTPlainPresent, 1.0);
+ SET_INTERNL("application/x-wais-source", STR_PRESENT, HTWSRCConvert, 2.0);
+ SET_INTERNL("application/x-wais-source", STR_DOWNLOAD, HTWSRCConvert, 1.0);
+ SET_INTERNL("application/x-wais-source", STR_DUMP, HTWSRCConvert, 1.0);
+
+ /*
+ * Save all unknown mime types to disk.
+ */
+ SET_EXTERNL(STR_SOURCE, STR_PRESENT, HTSaveToFile, 1.0);
+ SET_EXTERNL(STR_SOURCE, STR_SOURCE, HTSaveToFile, 1.0);
+ SET_EXTERNL(STR_SOURCE, STR_DOWNLOAD, HTSaveToFile, 1.0);
+ SET_EXTERNL(STR_SOURCE, "*", HTSaveToFile, 1.0);
+
+ /*
+ * Output all www/dump presentations to stdout.
+ */
+ SET_EXTERNL(STR_SOURCE, STR_DUMP, HTDumpToStdout, 1.0);
+
+ /*
+ * Other internal types, which must precede the "www/present" entries
+ * below (otherwise, they will be filtered out in HTFilterPresentations()).
+ */
+ SET_INTERNL("text/css", STR_PLAINTEXT, HTMLToPlain, 0.5);
+ SET_INTERNL(STR_HTML, STR_PLAINTEXT, HTMLToPlain, 0.5);
+ SET_INTERNL(STR_HTML, "text/x-c", HTMLToC, 0.5);
+ SET_INTERNL(STR_HTML, STR_SOURCE, HTPlainPresent, 1.0);
+ SET_INTERNL(STR_PLAINTEXT, STR_SOURCE, HTPlainPresent, 1.0);
+ SET_INTERNL("text/sgml", STR_SOURCE, HTPlainPresent, 1.0);
+ SET_INTERNL("text/x-sgml", STR_SOURCE, HTPlainPresent, 1.0);
+
+ /*
+ * Now add our basic conversions. These include the types which will
+ * be listed in a "Accept:" line sent to a server. These criteria are
+ * used in HTFilterPresentations() to select acceptable types:
+ *
+ * a) input is not "www/mime" or "www/compressed"
+ * b) output is "www/present"
+ * c) quality is in the range 0.0 to 1.0, i.e., excludes the 2.0's.
+ *
+ * For reference:
+ * RFC 1874 - text/sgml
+ * RFC 2046 - text/plain
+ * RFC 2318 - text/css
+ * RFC 3023 - text/xml
+ * obsolete - text/x-sgml
+ *
+ * as well as
+ * http://www.iana.org/assignments/media-types/media-types.xhtml
+ *
+ * and
+ * http://www.w3.org/TR/xhtml-media-types/
+ *
+ * which describes
+ * application/xhtml+xml
+ * text/html
+ */
+ SET_INTERNL("application/xhtml+xml", STR_PRESENT, XHTMLPresent, 1.0);
+ SET_INTERNL("application/xhtml+xml", STR_SOURCE, HTPlainPresent, 1.0);
+ SET_INTERNL("text/css", STR_PRESENT, HTPlainPresent, 1.0);
+ SET_INTERNL(STR_HTML, STR_PRESENT, HTMLPresent, 1.0);
+ SET_INTERNL(STR_PLAINTEXT, STR_PRESENT, HTPlainPresent, 1.0);
+ SET_INTERNL("text/sgml", STR_PRESENT, HTMLPresent, 1.0);
+ SET_INTERNL("text/x-sgml", STR_PRESENT, HTMLPresent, 2.0);
+ SET_INTERNL("text/xml", STR_PRESENT, HTMLPresent, 2.0);
+
+ if (LYisAbsPath(global_type_map)) {
+ /* These should override the default types as necessary. */
+ HTLoadTypesConfigFile(global_type_map, mediaSYS);
+ }
+
+ /*
+ * Load the local maps.
+ */
+ if (IsOurFile(LYAbsOrHomePath(&personal_type_map))
+ && LYCanReadFile(personal_type_map)) {
+ /* These should override everything else. */
+ HTLoadTypesConfigFile(personal_type_map, mediaUSR);
+ }
+
+ /*
+ * Put text/html and text/plain at beginning of list. - kw
+ */
+ HTReorderPresentation(WWW_PLAINTEXT, WWW_PRESENT);
+ HTReorderPresentation(WWW_HTML, WWW_PRESENT);
+
+ /*
+ * Analyze the list, and set 'get_accept' for those whose representations
+ * are not redundant.
+ */
+ HTFilterPresentations();
+}
+
+void HTPreparsedFormatInit(void)
+{
+ CTrace((tfp, "HTPreparsedFormatInit\n"));
+ if (LYPreparsedSource) {
+ SET_INTERNL(STR_HTML, STR_SOURCE, HTMLParsedPresent, 1.0);
+ SET_INTERNL(STR_HTML, STR_DUMP, HTMLParsedPresent, 1.0);
+ }
+}
+
+/* Some of the following is taken from: */
+
+/*
+Copyright (c) 1991 Bell Communications Research, Inc. (Bellcore)
+
+Permission to use, copy, modify, and distribute this material
+for any purpose and without fee is hereby granted, provided
+that the above copyright notice and this permission notice
+appear in all copies, and that the name of Bellcore not be
+used in advertising or publicity pertaining to this
+material without the specific, prior written permission
+of an authorized representative of Bellcore. BELLCORE
+MAKES NO REPRESENTATIONS ABOUT THE ACCURACY OR SUITABILITY
+OF THIS MATERIAL FOR ANY PURPOSE. IT IS PROVIDED "AS IS",
+WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES.
+*/
+/******************************************************
+ Metamail -- A tool to help diverse mail readers
+ cope with diverse multimedia mail formats.
+
+ Author: Nathaniel S. Borenstein, Bellcore
+
+ ******************************************************* */
+
+struct MailcapEntry {
+ char *contenttype;
+ char *command;
+ char *testcommand;
+ int needsterminal;
+ int copiousoutput;
+ int needtofree;
+ char *label;
+ char *printcommand;
+ char *nametemplate;
+ float quality;
+ long int maxbytes;
+};
+
+static int ExitWithError(const char *txt);
+static int PassesTest(struct MailcapEntry *mc);
+
+static char *GetCommand(char *s, char **t)
+{
+ char *s2;
+ int quoted = 0;
+
+ s = LYSkipBlanks(s);
+ /* marca -- added + 1 for error case -- oct 24, 1993. */
+ s2 = typeMallocn(char, strlen(s) * 2 + 1); /* absolute max, if all % signs */
+
+ if (!s2)
+ ExitWithError(MEMORY_EXHAUSTED_ABORT);
+
+ *t = s2;
+ while (non_empty(s)) {
+ if (quoted) {
+ if (*s == '%')
+ *s2++ = '%'; /* Quote through next level, ugh! */
+
+ *s2++ = *s++;
+ quoted = 0;
+ } else {
+ if (*s == ';') {
+ *s2 = '\0';
+ return (++s);
+ }
+ if (*s == ESCAPE) {
+ quoted = 1;
+ ++s;
+ } else {
+ *s2++ = *s++;
+ }
+ }
+ }
+ *s2 = '\0';
+ return (NULL);
+}
+
+/* no leading or trailing space, all lower case */
+static char *Cleanse(char *s)
+{
+ LYTrimLeading(s);
+ LYTrimTrailing(s);
+ LYLowerCase(s);
+ return (s);
+}
+
+/* remove unnecessary (unquoted) blanks in a shell command */
+static void TrimCommand(char *command)
+{
+ LYTrimTrailing(command);
+#ifdef UNIX
+ {
+ char *s = command;
+ char *d = command;
+ int ch;
+ int c0 = ' ';
+ BOOL escape = FALSE;
+ BOOL dquote = FALSE;
+ BOOL squote = FALSE;
+
+ while ((ch = *s++) != '\0') {
+ if (escape) {
+ escape = FALSE;
+ } else if (squote) {
+ if (ch == SQUOTE)
+ squote = FALSE;
+ } else if (dquote) {
+ switch (ch) {
+ case DQUOTE:
+ dquote = FALSE;
+ break;
+ case ESCAPE:
+ escape = TRUE;
+ break;
+ }
+ } else {
+ switch (ch) {
+ case DQUOTE:
+ dquote = TRUE;
+ break;
+ case SQUOTE:
+ squote = TRUE;
+ break;
+ }
+ }
+ if (!escape && !dquote && !squote) {
+ if (ch == '\t')
+ ch = ' ';
+ if (ch == ' ') {
+ if (c0 == ' ')
+ continue;
+ }
+ }
+ *d++ = (char) ch;
+ c0 = ch;
+ }
+ *d = '\0';
+ }
+#endif
+}
+
+static int ProcessMailcapEntry(FILE *fp, struct MailcapEntry *mc, AcceptMedia media)
+{
+ size_t rawentryalloc = 2000, len, need;
+ char *rawentry, *s, *t;
+ char *LineBuf = NULL;
+
+ rawentry = (char *) malloc(rawentryalloc);
+ if (!rawentry)
+ ExitWithError(MEMORY_EXHAUSTED_ABORT);
+
+ *rawentry = '\0';
+ while (LYSafeGets(&LineBuf, fp) != 0) {
+ LYTrimNewline(LineBuf);
+ if (LineBuf[0] == '#' || LineBuf[0] == '\0')
+ continue;
+ len = strlen(LineBuf);
+ need = len + strlen(rawentry) + 1;
+ if (need > rawentryalloc) {
+ rawentryalloc += (2000 + need);
+ rawentry = typeRealloc(char, rawentry, rawentryalloc);
+
+ if (!rawentry)
+ ExitWithError(MEMORY_EXHAUSTED_ABORT);
+ }
+ if (len > 0 && LineBuf[len - 1] == ESCAPE) {
+ LineBuf[len - 1] = '\0';
+ strcat(rawentry, LineBuf);
+ } else {
+ strcat(rawentry, LineBuf);
+ break;
+ }
+ }
+ FREE(LineBuf);
+
+ t = s = LYSkipBlanks(rawentry);
+ if (!*s) {
+ /* totally blank entry -- quietly ignore */
+ FREE(rawentry);
+ return (0);
+ }
+ s = StrChr(rawentry, ';');
+ if (s == NULL) {
+ CTrace((tfp,
+ "ProcessMailcapEntry: Ignoring invalid mailcap entry: %s\n",
+ rawentry));
+ FREE(rawentry);
+ return (0);
+ }
+ *s++ = '\0';
+ if (!strncasecomp(t, STR_HTML, 9) ||
+ !strncasecomp(t, STR_PLAINTEXT, 10)) {
+ --s;
+ *s = ';';
+ CTrace((tfp, "ProcessMailcapEntry: Ignoring mailcap entry: %s\n",
+ rawentry));
+ FREE(rawentry);
+ return (0);
+ }
+ LYRemoveBlanks(rawentry);
+ LYLowerCase(rawentry);
+
+ mc->needsterminal = 0;
+ mc->copiousoutput = 0;
+ mc->needtofree = 1;
+ mc->testcommand = NULL;
+ mc->label = NULL;
+ mc->printcommand = NULL;
+ mc->contenttype = NULL;
+ StrAllocCopy(mc->contenttype, rawentry);
+ mc->quality = (float) 1.0;
+ mc->maxbytes = 0;
+ t = GetCommand(s, &mc->command);
+ if (!t) {
+ goto assign_presentation;
+ }
+ s = LYSkipBlanks(t);
+ while (s) {
+ char *arg, *eq, *mallocd_string;
+
+ t = GetCommand(s, &mallocd_string);
+ arg = mallocd_string;
+ eq = StrChr(arg, '=');
+ if (eq) {
+ *eq++ = '\0';
+ eq = LYSkipBlanks(eq);
+ }
+ if (non_empty(arg)) {
+ arg = Cleanse(arg);
+ if (!strcmp(arg, "needsterminal")) {
+ mc->needsterminal = 1;
+ } else if (!strcmp(arg, "copiousoutput")) {
+ mc->copiousoutput = 1;
+ } else if (eq && !strcmp(arg, "test")) {
+ mc->testcommand = NULL;
+ StrAllocCopy(mc->testcommand, eq);
+ TrimCommand(mc->testcommand);
+ CTrace((tfp, "ProcessMailcapEntry: Found testcommand:%s\n",
+ mc->testcommand));
+ } else if (eq && !strcmp(arg, "description")) {
+ mc->label = eq; /* ignored */
+ } else if (eq && !strcmp(arg, "label")) {
+ mc->label = eq; /* ignored: bogus old name for description */
+ } else if (eq && !strcmp(arg, "print")) {
+ mc->printcommand = eq; /* ignored */
+ } else if (eq && !strcmp(arg, "textualnewlines")) {
+ /* no support for now. What does this do anyways? */
+ /* ExceptionalNewline(mc->contenttype, atoi(eq)); */
+ } else if (eq && !strcmp(arg, "q")) {
+ mc->quality = (float) atof(eq);
+ if (mc->quality > 0.000 && mc->quality < 0.001)
+ mc->quality = (float) 0.001;
+ } else if (eq && !strcmp(arg, "mxb")) {
+ mc->maxbytes = atol(eq);
+ if (mc->maxbytes < 0)
+ mc->maxbytes = 0;
+ } else if (strcmp(arg, "notes")) { /* IGNORE notes field */
+ if (*arg)
+ CTrace((tfp,
+ "ProcessMailcapEntry: Ignoring mailcap flag '%s'.\n",
+ arg));
+ }
+
+ }
+ FREE(mallocd_string);
+ s = t;
+ }
+
+ assign_presentation:
+ FREE(rawentry);
+
+ if (PassesTest(mc)) {
+ CTrace((tfp, "ProcessMailcapEntry Setting up conversion %s : %s\n",
+ mc->contenttype, mc->command));
+ HTSetPresentation(mc->contenttype,
+ mc->command,
+ mc->testcommand,
+ mc->quality,
+ 3.0, 0.0, mc->maxbytes, media);
+ }
+ FREE(mc->command);
+ FREE(mc->testcommand);
+ FREE(mc->contenttype);
+
+ return (1);
+}
+
+#define L_CURL '{'
+#define R_CURL '}'
+
+static const char *LYSkipQuoted(const char *s)
+{
+ int escaped = 0;
+
+ ++s; /* skip first quote */
+ while (*s != 0) {
+ if (escaped) {
+ escaped = 0;
+ } else if (*s == ESCAPE) {
+ escaped = 1;
+ } else if (*s == DQUOTE) {
+ ++s;
+ break;
+ }
+ ++s;
+ }
+ return s;
+}
+
+/*
+ * Note: the tspecials[] here are those defined for Content-Type header, so
+ * this function is not really general-purpose.
+ */
+static const char *LYSkipToken(const char *s)
+{
+ static const char tspecials[] = "\"()<>@,;:\\/[]?.=";
+
+ while (*s != '\0' && !WHITE(*s) && StrChr(tspecials, *s) == 0) {
+ ++s;
+ }
+ return s;
+}
+
+static const char *LYSkipValue(const char *s)
+{
+ if (*s == DQUOTE)
+ s = LYSkipQuoted(s);
+ else
+ s = LYSkipToken(s);
+ return s;
+}
+
+/*
+ * Copy the value from the source, dequoting if needed.
+ */
+static char *LYCopyValue(const char *s)
+{
+ const char *t;
+ char *result = 0;
+ int j, k;
+
+ if (*s == DQUOTE) {
+ t = LYSkipQuoted(s);
+ StrAllocCopy(result, s + 1);
+ result[t - s - 2] = '\0';
+ for (j = k = 0;; ++j, ++k) {
+ if (result[j] == ESCAPE) {
+ ++j;
+ }
+ if ((result[k] = result[j]) == '\0')
+ break;
+ }
+ } else {
+ t = LYSkipToken(s);
+ StrAllocCopy(result, s);
+ result[t - s] = '\0';
+ }
+ return result;
+}
+
+/*
+ * The "Content-Type:" field, contains zero or more parameters after a ';'.
+ * Return the value of the named parameter, or null.
+ */
+static char *LYGetContentType(const char *name,
+ const char *params)
+{
+ char *result = 0;
+
+ if (params != 0) {
+ if (name != 0) {
+ size_t length = strlen(name);
+ const char *test = StrChr(params, ';'); /* skip type/subtype */
+ const char *next;
+
+ while (test != 0) {
+ BOOL found = FALSE;
+
+ ++test; /* skip the ';' */
+ test = LYSkipCBlanks(test);
+ next = LYSkipToken(test);
+ if ((next - test) == (int) length
+ && !StrNCmp(test, name, length)) {
+ found = TRUE;
+ }
+ test = LYSkipCBlanks(next);
+ if (*test == '=') {
+ ++test;
+ test = LYSkipCBlanks(test);
+ if (found) {
+ result = LYCopyValue(test);
+ break;
+ } else {
+ test = LYSkipValue(test);
+ }
+ test = LYSkipCBlanks(test);
+ }
+ if (*test != ';') {
+ break; /* we're lost */
+ }
+ }
+ } else { /* return the content-type */
+ StrAllocCopy(result, params);
+ *LYSkipNonBlanks(result) = '\0';
+ }
+ }
+ return result;
+}
+
+/*
+ * Check if the command uses a "%s" substitution. We need to know this, to
+ * decide when to create temporary files, etc.
+ */
+BOOL LYMailcapUsesPctS(const char *controlstring)
+{
+ BOOL result = FALSE;
+ const char *from;
+ const char *next;
+ int prefixed = 0;
+ int escaped = 0;
+
+ for (from = controlstring; *from != '\0'; from++) {
+ if (escaped) {
+ escaped = 0;
+ } else if (*from == ESCAPE) {
+ escaped = 1;
+ } else if (prefixed) {
+ prefixed = 0;
+ switch (*from) {
+ case '%': /* not defined */
+ case 'n':
+ case 'F':
+ case 't':
+ break;
+ case 's':
+ result = TRUE;
+ break;
+ case L_CURL:
+ next = StrChr(from, R_CURL);
+ if (next != 0) {
+ from = next;
+ break;
+ }
+ /* FALLTHRU */
+ default:
+ break;
+ }
+ } else if (*from == '%') {
+ prefixed = 1;
+ }
+ }
+ return result;
+}
+
+/*
+ * Build the command string for testing or executing a mailcap entry.
+ * If a substitution from the Content-Type header is requested but no
+ * parameters are available, return -1, otherwise 0.
+ *
+ * This does not support multipart %n or %F (does this apply to lynx?)
+ */
+static int BuildCommand(HTChunk *cmd,
+ const char *controlstring,
+ const char *TmpFileName,
+ const char *params)
+{
+ int result = 0;
+ size_t TmpFileLen = strlen(TmpFileName);
+ const char *from;
+ const char *next;
+ char *name, *value;
+ int prefixed = 0;
+ int escaped = 0;
+
+ for (from = controlstring; *from != '\0'; from++) {
+ if (escaped) {
+ escaped = 0;
+ HTChunkPutc(cmd, UCH(*from));
+ } else if (*from == ESCAPE) {
+ escaped = 1;
+ } else if (prefixed) {
+ prefixed = 0;
+ switch (*from) {
+ case '%': /* not defined */
+ HTChunkPutc(cmd, UCH(*from));
+ break;
+ case 'n':
+ /* FALLTHRU */
+ case 'F':
+ CTrace((tfp, "BuildCommand: Bad mailcap \"test\" clause: %s\n",
+ controlstring));
+ break;
+ case 't':
+ if ((value = LYGetContentType(NULL, params)) != 0) {
+ HTChunkPuts(cmd, value);
+ FREE(value);
+ }
+ break;
+ case 's':
+ if (TmpFileLen) {
+ HTChunkPuts(cmd, TmpFileName);
+ }
+ break;
+ case L_CURL:
+ next = StrChr(from, R_CURL);
+ if (next != 0) {
+ if (params != 0) {
+ ++from;
+ name = 0;
+ HTSprintf0(&name, "%.*s", (int) (next - from), from);
+ if ((value = LYGetContentType(name, params)) != 0) {
+ HTChunkPuts(cmd, value);
+ FREE(value);
+ } else if (name) {
+ if (!strcmp(name, "charset")) {
+ HTChunkPuts(cmd, "ISO-8859-1");
+ } else {
+ CTrace((tfp, "BuildCommand no value for %s\n", name));
+ }
+ }
+ FREE(name);
+ } else {
+ result = -1;
+ }
+ from = next;
+ break;
+ }
+ /* FALLTHRU */
+ default:
+ CTrace((tfp,
+ "BuildCommand: Ignoring unrecognized format code in mailcap file '%%%c'.\n",
+ *from));
+ break;
+ }
+ } else if (*from == '%') {
+ prefixed = 1;
+ } else {
+ HTChunkPutc(cmd, UCH(*from));
+ }
+ }
+ HTChunkTerminate(cmd);
+ return result;
+}
+
+/*
+ * Build the mailcap test-command and execute it. This is only invoked when
+ * we cannot tell just by looking at the command if it would succeed.
+ *
+ * Returns 0 for success, -1 for error and 1 for deferred.
+ */
+int LYTestMailcapCommand(const char *testcommand,
+ const char *params)
+{
+ int result;
+ char TmpFileName[LY_MAXPATH];
+ HTChunk *expanded = 0;
+
+ if (LYMailcapUsesPctS(testcommand)) {
+ if (LYOpenTemp(TmpFileName, HTML_SUFFIX, "w") == 0)
+ ExitWithError(CANNOT_OPEN_TEMP);
+ LYCloseTemp(TmpFileName);
+ } else {
+ /* We normally don't need a temp file name - kw */
+ TmpFileName[0] = '\0';
+ }
+ expanded = HTChunkCreate(1024);
+ if (BuildCommand(expanded, testcommand, TmpFileName, params) != 0) {
+ result = 1;
+ CTrace((tfp, "PassesTest: Deferring test command: %s\n", expanded->data));
+ } else {
+ CTrace((tfp, "PassesTest: Executing test command: %s\n", expanded->data));
+ if ((result = LYSystem(expanded->data)) != 0) {
+ result = -1;
+ CTrace((tfp, "PassesTest: Test failed!\n"));
+ } else {
+ CTrace((tfp, "PassesTest: Test passed!\n"));
+ }
+ }
+
+ HTChunkFree(expanded);
+ (void) LYRemoveTemp(TmpFileName);
+
+ return result;
+}
+
+char *LYMakeMailcapCommand(const char *command,
+ const char *params,
+ const char *filename)
+{
+ HTChunk *expanded = 0;
+ char *result = 0;
+
+ expanded = HTChunkCreate(1024);
+ BuildCommand(expanded, command, filename, params);
+ StrAllocCopy(result, expanded->data);
+ HTChunkFree(expanded);
+ return result;
+}
+
+#define RTR_forget 0
+#define RTR_lookup 1
+#define RTR_add 2
+
+static int RememberTestResult(int mode, char *cmd, int result)
+{
+ struct cmdlist_s {
+ char *cmd;
+ int result;
+ struct cmdlist_s *next;
+ };
+ static struct cmdlist_s *cmdlist = NULL;
+ struct cmdlist_s *cur;
+
+ switch (mode) {
+ case RTR_forget:
+ while (cmdlist) {
+ cur = cmdlist->next;
+ FREE(cmdlist->cmd);
+ FREE(cmdlist);
+ cmdlist = cur;
+ }
+ break;
+ case RTR_lookup:
+ for (cur = cmdlist; cur; cur = cur->next)
+ if (!strcmp(cmd, cur->cmd))
+ return cur->result;
+ return -1;
+ case RTR_add:
+ cur = typecalloc(struct cmdlist_s);
+
+ if (cur == NULL)
+ outofmem(__FILE__, "RememberTestResult");
+
+ cur->next = cmdlist;
+ StrAllocCopy(cur->cmd, cmd);
+ cur->result = result;
+ cmdlist = cur;
+ break;
+ }
+ return 0;
+}
+
+/* FIXME: this sometimes used caseless comparison, e.g., strcasecomp */
+#define SameCommand(tst,ref) !strcmp(tst,ref)
+
+static int PassesTest(struct MailcapEntry *mc)
+{
+ int result;
+
+ /*
+ * Make sure we have a command
+ */
+ if (!mc->testcommand)
+ return (1);
+
+ /*
+ * Save overhead of system() calls by faking these. - FM
+ */
+ if (SameCommand(mc->testcommand, "test \"$DISPLAY\"") ||
+ SameCommand(mc->testcommand, "test \"$DISPLAY\" != \"\"") ||
+ SameCommand(mc->testcommand, "test -n \"$DISPLAY\"")) {
+ FREE(mc->testcommand);
+ CTrace((tfp, "PassesTest: Testing for XWINDOWS environment.\n"));
+ if (LYgetXDisplay() != NULL) {
+ CTrace((tfp, "PassesTest: Test passed!\n"));
+ return (0 == 0);
+ } else {
+ CTrace((tfp, "PassesTest: Test failed!\n"));
+ return (-1 == 0);
+ }
+ }
+ if (SameCommand(mc->testcommand, "test -z \"$DISPLAY\"")) {
+ FREE(mc->testcommand);
+ CTrace((tfp, "PassesTest: Testing for NON_XWINDOWS environment.\n"));
+ if (LYgetXDisplay() == NULL) {
+ CTrace((tfp, "PassesTest: Test passed!\n"));
+ return (0 == 0);
+ } else {
+ CTrace((tfp, "PassesTest: Test failed!\n"));
+ return (-1 == 0);
+ }
+ }
+
+ /*
+ * Why do anything but return success for this one! - FM
+ */
+ if (SameCommand(mc->testcommand, "test -n \"$LYNX_VERSION\"")) {
+ FREE(mc->testcommand);
+ CTrace((tfp, "PassesTest: Testing for LYNX environment.\n"));
+ CTrace((tfp, "PassesTest: Test passed!\n"));
+ return (0 == 0);
+ } else
+ /*
+ * ... or failure for this one! - FM
+ */
+ if (SameCommand(mc->testcommand, "test -z \"$LYNX_VERSION\"")) {
+ FREE(mc->testcommand);
+ CTrace((tfp, "PassesTest: Testing for non-LYNX environment.\n"));
+ CTrace((tfp, "PassesTest: Test failed!\n"));
+ return (-1 == 0);
+ }
+
+ result = RememberTestResult(RTR_lookup, mc->testcommand, 0);
+ if (result == -1) {
+ result = LYTestMailcapCommand(mc->testcommand, NULL);
+ RememberTestResult(RTR_add, mc->testcommand, result ? 1 : 0);
+ }
+
+ /*
+ * Free the test command as well since
+ * we won't be needing it anymore.
+ */
+ if (result != 1)
+ FREE(mc->testcommand);
+
+ if (result < 0) {
+ CTrace((tfp, "PassesTest: Test failed!\n"));
+ } else if (result == 0) {
+ CTrace((tfp, "PassesTest: Test passed!\n"));
+ }
+
+ return (result >= 0);
+}
+
+static int ProcessMailcapFile(char *file, AcceptMedia media)
+{
+ struct MailcapEntry mc;
+ FILE *fp;
+
+ CTrace((tfp, "ProcessMailcapFile: Loading file '%s'.\n",
+ file));
+ if ((fp = fopen(file, TXT_R)) == NULL) {
+ CTrace((tfp, "ProcessMailcapFile: Could not open '%s'.\n",
+ file));
+ return (-1 == 0);
+ }
+
+ while (fp && !feof(fp)) {
+ ProcessMailcapEntry(fp, &mc, media);
+ }
+ LYCloseInput(fp);
+ RememberTestResult(RTR_forget, NULL, 0);
+ return (0 == 0);
+}
+
+static int ExitWithError(const char *txt)
+{
+ if (txt)
+ fprintf(tfp, "Lynx: %s\n", txt);
+ exit_immediately(EXIT_FAILURE);
+ return (-1);
+}
+
+/* Reverse the entries from each mailcap after it has been read, so that
+ * earlier entries have precedence. Set to 0 to get traditional lynx
+ * behavior, which means that the last match wins. - kw */
+static int reverse_mailcap = 1;
+
+static int HTLoadTypesConfigFile(char *fn, AcceptMedia media)
+{
+ int result = 0;
+ HTList *saved = HTPresentations;
+
+ if (reverse_mailcap) { /* temporarily hide existing list */
+ HTPresentations = NULL;
+ }
+
+ result = ProcessMailcapFile(fn, media);
+
+ if (reverse_mailcap) {
+ if (result && HTPresentations) {
+ HTList_reverse(HTPresentations);
+ HTList_appendList(HTPresentations, saved);
+ FREE(saved);
+ } else {
+ HTPresentations = saved;
+ }
+ }
+ return result;
+}
+
+/* ------------------------------------------------------------------------ */
+/* ------------------------------------------------------------------------ */
+/* ------------------------------------------------------------------------ */
+
+/* Define a basic set of suffixes
+ * ------------------------------
+ *
+ * The LAST suffix for a type is that used for temporary files
+ * of that type.
+ * The quality is an apriori bias as to whether the file should be
+ * used. Not that different suffixes can be used to represent files
+ * which are of the same format but are originals or regenerated,
+ * with different values.
+ */
+/*
+ * Additional notes: the encoding parameter may be taken into account when
+ * looking for a match; for that purpose "7bit", "8bit", and "binary" are
+ * equivalent.
+ *
+ * Use of mixed case and of pseudo MIME types with embedded spaces should be
+ * avoided. It was once necessary for getting the fancy strings into type
+ * labels in FTP directory listings, but that can now be done with the
+ * description field (using HTSetSuffix5). AFAIK the only effect of such
+ * "fancy" (and mostly invalid) types that cannot be reproduced by using a
+ * description fields is some statusline messages in SaveToFile (HTFWriter.c).
+ * And showing the user an invalid MIME type as the 'Content-type:' is not such
+ * a hot idea anyway, IMO. Still, if you want it, it is still possible (even
+ * in lynx.cfg now), but use of it in the defaults below has been reduced.
+ *
+ * Case variations rely on peculiar behavior of HTAtom.c for matching. They
+ * lead to surprising behavior, Lynx retains the case of a string in the form
+ * first encountered after starting up. So while later suffix rules generally
+ * override or modify earlier ones, the case used for a MIME time is determined
+ * by the first suffix rule (or other occurrence). Matching in HTAtom_for is
+ * effectively case insensitive, except for the first character of the string
+ * which is treated as case-sensitive by the hash function there; best not to
+ * rely on that, rather convert MIME types to lowercase on input as is already
+ * done in most places (And HTAtom could become consistently case-sensitive, as
+ * in newer W3C libwww).
+ * - kw 1999-10-12
+ */
+void HTFileInit(void)
+{
+#ifdef BUILTIN_SUFFIX_MAPS
+ if (LYUseBuiltinSuffixes) {
+ CTrace((tfp, "HTFileInit: Loading default (HTInit) extension maps.\n"));
+
+ /* default suffix interpretation */
+ SET_SUFFIX1("*", STR_PLAINTEXT, "8bit");
+ SET_SUFFIX1("*.*", STR_PLAINTEXT, "8bit");
+
+#ifdef EXEC_SCRIPTS
+ /*
+ * define these extensions for exec scripts.
+ */
+#ifndef VMS
+ /* for csh exec links */
+ HTSetSuffix(".csh", "application/x-csh", "8bit", 0.8);
+ HTSetSuffix(".sh", "application/x-sh", "8bit", 0.8);
+ HTSetSuffix(".ksh", "application/x-ksh", "8bit", 0.8);
+#else
+ HTSetSuffix(".com", "application/x-VMS_script", "8bit", 0.8);
+#endif /* !VMS */
+#endif /* EXEC_SCRIPTS */
+
+ /*
+ * Some of the old incarnation of the mappings is preserved and can be had
+ * by defining TRADITIONAL_SUFFIXES. This is for some cases where I felt
+ * the old rules might be preferred by someone, for some reason. It's not
+ * done consistently. A lot more of this stuff could probably be changed
+ * too or omitted, now that nearly the equivalent functionality is
+ * available in lynx.cfg. - kw 1999-10-12
+ */
+ /* *INDENT-OFF* */
+ SET_SUFFIX1(".saveme", "application/x-Binary", "binary");
+ SET_SUFFIX1(".dump", "application/x-Binary", "binary");
+ SET_SUFFIX1(".bin", "application/x-Binary", "binary");
+
+ SET_SUFFIX1(".arc", "application/x-Compressed", "binary");
+
+ SET_SUFFIX1(".alpha-exe", "application/x-Executable", "binary");
+ SET_SUFFIX1(".alpha_exe", "application/x-Executable", "binary");
+ SET_SUFFIX1(".AXP-exe", "application/x-Executable", "binary");
+ SET_SUFFIX1(".AXP_exe", "application/x-Executable", "binary");
+ SET_SUFFIX1(".VAX-exe", "application/x-Executable", "binary");
+ SET_SUFFIX1(".VAX_exe", "application/x-Executable", "binary");
+ SET_SUFFIX5(".exe", STR_BINARY, "binary", "Executable");
+
+#ifdef TRADITIONAL_SUFFIXES
+ SET_SUFFIX1(".exe.Z", "application/x-Comp. Executable", "binary");
+ SET_SUFFIX1(".Z", "application/UNIX Compressed", "binary");
+ SET_SUFFIX1(".tar_Z", "application/UNIX Compr. Tar", "binary");
+ SET_SUFFIX1(".tar.Z", "application/UNIX Compr. Tar", "binary");
+#else
+ SET_SUFFIX5(".Z", "application/x-compress", "binary", "UNIX Compressed");
+ SET_SUFFIX5(".Z", NULL, "compress", "UNIX Compressed");
+ SET_SUFFIX5(".exe.Z", STR_BINARY, "compress", "Executable");
+ SET_SUFFIX5(".tar_Z", "application/x-tar", "compress", "UNIX Compr. Tar");
+ SET_SUFFIX5(".tar.Z", "application/x-tar", "compress", "UNIX Compr. Tar");
+#endif
+
+#ifdef TRADITIONAL_SUFFIXES
+ SET_SUFFIX1("-gz", "application/GNU Compressed", "binary");
+ SET_SUFFIX1("_gz", "application/GNU Compressed", "binary");
+ SET_SUFFIX1(".gz", "application/GNU Compressed", "binary");
+
+ SET_SUFFIX5(".tar.gz", "application/x-tar", "binary", "GNU Compr. Tar");
+ SET_SUFFIX5(".tgz", "application/x-tar", "gzip", "GNU Compr. Tar");
+#else
+ SET_SUFFIX5("-gz", "application/x-gzip", "binary", "GNU Compressed");
+ SET_SUFFIX5("_gz", "application/x-gzip", "binary", "GNU Compressed");
+ SET_SUFFIX5(".gz", "application/x-gzip", "binary", "GNU Compressed");
+ SET_SUFFIX5("-gz", NULL, "gzip", "GNU Compressed");
+ SET_SUFFIX5("_gz", NULL, "gzip", "GNU Compressed");
+ SET_SUFFIX5(".gz", NULL, "gzip", "GNU Compressed");
+
+ SET_SUFFIX5(".tar.gz", "application/x-tar", "gzip", "GNU Compr. Tar");
+ SET_SUFFIX5(".tgz", "application/x-tar", "gzip", "GNU Compr. Tar");
+#endif
+
+#ifdef TRADITIONAL_SUFFIXES
+ SET_SUFFIX1(".src", "application/x-WAIS-source", "8bit");
+ SET_SUFFIX1(".wsrc", "application/x-WAIS-source", "8bit");
+#else
+ SET_SUFFIX5(".wsrc", "application/x-wais-source", "8bit", "WAIS-source");
+#endif
+
+ SET_SUFFIX5(".zip", "application/zip", "binary", "Zip File");
+
+ SET_SUFFIX1(".zz", "application/x-deflate", "binary");
+ SET_SUFFIX1(".zz", "application/deflate", "binary");
+
+ SET_SUFFIX1(".bz2", "application/x-bzip2", "binary");
+ SET_SUFFIX1(".bz2", "application/bzip2", "binary");
+
+ SET_SUFFIX1(".br", "application/x-brotli", "binary");
+
+ SET_SUFFIX1(".xz", "application/x-xz", "binary");
+
+ SET_SUFFIX1(".lz", "application/x-lzip", "binary");
+ SET_SUFFIX1(".lzma", "application/x-lzma", "binary");
+
+#ifdef TRADITIONAL_SUFFIXES
+ SET_SUFFIX1(".uu", "application/x-UUencoded", "8bit");
+
+ SET_SUFFIX1(".hqx", "application/x-Binhex", "8bit");
+
+ SET_SUFFIX1(".o", "application/x-Prog. Object", "binary");
+ SET_SUFFIX1(".a", "application/x-Prog. Library", "binary");
+#else
+ SET_SUFFIX5(".uu", "application/x-uuencoded", "7bit", "UUencoded");
+
+ SET_SUFFIX5(".hqx", "application/mac-binhex40", "8bit", "Mac BinHex");
+
+ HTSetSuffix5(".o", STR_BINARY, "binary", "Prog. Object", 0.5);
+ HTSetSuffix5(".a", STR_BINARY, "binary", "Prog. Library", 0.5);
+ HTSetSuffix5(".so", STR_BINARY, "binary", "Shared Lib", 0.5);
+#endif
+
+ SET_SUFFIX5(".oda", "application/oda", "binary", "ODA");
+
+ SET_SUFFIX5(".pdf", "application/pdf", "binary", "PDF");
+
+ SET_SUFFIX5(".eps", "application/postscript", "8bit", "Postscript");
+ SET_SUFFIX5(".ai", "application/postscript", "8bit", "Postscript");
+ SET_SUFFIX5(".ps", "application/postscript", "8bit", "Postscript");
+
+ SET_SUFFIX5(".rtf", "application/rtf", "8bit", "RTF");
+
+ SET_SUFFIX5(".dvi", "application/x-dvi", "8bit", "DVI");
+
+ SET_SUFFIX5(".hdf", "application/x-hdf", "8bit", "HDF");
+
+ SET_SUFFIX1(".cdf", "application/x-netcdf", "8bit");
+ SET_SUFFIX1(".nc", "application/x-netcdf", "8bit");
+
+#ifdef TRADITIONAL_SUFFIXES
+ SET_SUFFIX1(".latex", "application/x-Latex", "8bit");
+ SET_SUFFIX1(".tex", "application/x-Tex", "8bit");
+ SET_SUFFIX1(".texinfo", "application/x-Texinfo", "8bit");
+ SET_SUFFIX1(".texi", "application/x-Texinfo", "8bit");
+#else
+ SET_SUFFIX5(".latex", "application/x-latex", "8bit", "LaTeX");
+ SET_SUFFIX5(".tex", "text/x-tex", "8bit", "TeX");
+ SET_SUFFIX5(".texinfo", "application/x-texinfo", "8bit", "Texinfo");
+ SET_SUFFIX5(".texi", "application/x-texinfo", "8bit", "Texinfo");
+#endif
+
+#ifdef TRADITIONAL_SUFFIXES
+ SET_SUFFIX1(".t", "application/x-Troff", "8bit");
+ SET_SUFFIX1(".tr", "application/x-Troff", "8bit");
+ SET_SUFFIX1(".roff", "application/x-Troff", "8bit");
+
+ SET_SUFFIX1(".man", "application/x-Troff-man", "8bit");
+ SET_SUFFIX1(".me", "application/x-Troff-me", "8bit");
+ SET_SUFFIX1(".ms", "application/x-Troff-ms", "8bit");
+#else
+ SET_SUFFIX5(".t", "application/x-troff", "8bit", "Troff");
+ SET_SUFFIX5(".tr", "application/x-troff", "8bit", "Troff");
+ SET_SUFFIX5(".roff", "application/x-troff", "8bit", "Troff");
+
+ SET_SUFFIX5(".man", "application/x-troff-man", "8bit", "Man Page");
+ SET_SUFFIX5(".me", "application/x-troff-me", "8bit", "Troff me");
+ SET_SUFFIX5(".ms", "application/x-troff-ms", "8bit", "Troff ms");
+#endif
+
+ SET_SUFFIX1(".zoo", "application/x-Zoo File", "binary");
+
+#if defined(TRADITIONAL_SUFFIXES) || defined(VMS)
+ SET_SUFFIX1(".bak", "application/x-VMS BAK File", "binary");
+ SET_SUFFIX1(".bkp", "application/x-VMS BAK File", "binary");
+ SET_SUFFIX1(".bck", "application/x-VMS BAK File", "binary");
+
+ SET_SUFFIX5(".bkp_gz", STR_BINARY, "gzip", "GNU BAK File");
+ SET_SUFFIX5(".bkp-gz", STR_BINARY, "gzip", "GNU BAK File");
+ SET_SUFFIX5(".bck_gz", STR_BINARY, "gzip", "GNU BAK File");
+ SET_SUFFIX5(".bck-gz", STR_BINARY, "gzip", "GNU BAK File");
+
+ SET_SUFFIX5(".bkp-Z", STR_BINARY, "compress", "Comp. BAK File");
+ SET_SUFFIX5(".bkp_Z", STR_BINARY, "compress", "Comp. BAK File");
+ SET_SUFFIX5(".bck-Z", STR_BINARY, "compress", "Comp. BAK File");
+ SET_SUFFIX5(".bck_Z", STR_BINARY, "compress", "Comp. BAK File");
+#else
+ HTSetSuffix5(".bak", NULL, "binary", "Backup", 0.5);
+ SET_SUFFIX5(".bkp", STR_BINARY, "binary", "VMS BAK File");
+ SET_SUFFIX5(".bck", STR_BINARY, "binary", "VMS BAK File");
+#endif
+
+#if defined(TRADITIONAL_SUFFIXES) || defined(VMS)
+ SET_SUFFIX1(".hlb", "application/x-VMS Help Libr.", "binary");
+ SET_SUFFIX1(".olb", "application/x-VMS Obj. Libr.", "binary");
+ SET_SUFFIX1(".tlb", "application/x-VMS Text Libr.", "binary");
+ SET_SUFFIX1(".obj", "application/x-VMS Prog. Obj.", "binary");
+ SET_SUFFIX1(".decw$book", "application/x-DEC BookReader", "binary");
+ SET_SUFFIX1(".mem", "application/x-RUNOFF-MANUAL", "8bit");
+#else
+ SET_SUFFIX5(".hlb", STR_BINARY, "binary", "VMS Help Libr.");
+ SET_SUFFIX5(".olb", STR_BINARY, "binary", "VMS Obj. Libr.");
+ SET_SUFFIX5(".tlb", STR_BINARY, "binary", "VMS Text Libr.");
+ SET_SUFFIX5(".obj", STR_BINARY, "binary", "Prog. Object");
+ SET_SUFFIX5(".decw$book", STR_BINARY, "binary", "DEC BookReader");
+ SET_SUFFIX5(".mem", "text/x-runoff-manual", "8bit", "RUNOFF-MANUAL");
+#endif
+
+ SET_SUFFIX1(".vsd", "application/visio", "binary");
+
+ SET_SUFFIX5(".lha", "application/x-lha", "binary", "lha File");
+ SET_SUFFIX5(".lzh", "application/x-lzh", "binary", "lzh File");
+ SET_SUFFIX5(".sea", "application/x-sea", "binary", "sea File");
+#ifdef TRADITIONAL_SUFFIXES
+ SET_SUFFIX5(".sit", "application/x-sit", "binary", "sit File");
+#else
+ SET_SUFFIX5(".sit", "application/x-stuffit", "binary", "StuffIt");
+#endif
+ SET_SUFFIX5(".dms", "application/x-dms", "binary", "dms File");
+ SET_SUFFIX5(".iff", "application/x-iff", "binary", "iff File");
+
+ SET_SUFFIX1(".bcpio", "application/x-bcpio", "binary");
+ SET_SUFFIX1(".cpio", "application/x-cpio", "binary");
+
+#ifdef TRADITIONAL_SUFFIXES
+ SET_SUFFIX1(".gtar", "application/x-gtar", "binary");
+#endif
+
+ SET_SUFFIX1(".shar", "application/x-shar", "8bit");
+ SET_SUFFIX1(".share", "application/x-share", "8bit");
+
+#ifdef TRADITIONAL_SUFFIXES
+ SET_SUFFIX1(".sh", "application/x-sh", "8bit"); /* xtra */
+#endif
+
+ SET_SUFFIX1(".sv4cpio", "application/x-sv4cpio", "binary");
+ SET_SUFFIX1(".sv4crc", "application/x-sv4crc", "binary");
+
+ SET_SUFFIX5(".tar", "application/x-tar", "binary", "Tar File");
+ SET_SUFFIX1(".ustar", "application/x-ustar", "binary");
+
+ SET_SUFFIX1(".snd", "audio/basic", "binary");
+ SET_SUFFIX1(".au", "audio/basic", "binary");
+
+ SET_SUFFIX1(".aifc", "audio/x-aiff", "binary");
+ SET_SUFFIX1(".aif", "audio/x-aiff", "binary");
+ SET_SUFFIX1(".aiff", "audio/x-aiff", "binary");
+ SET_SUFFIX1(".wav", "audio/x-wav", "binary");
+ SET_SUFFIX1(".midi", "audio/midi", "binary");
+ SET_SUFFIX1(".mod", "audio/mod", "binary");
+
+ SET_SUFFIX1(".gif", "image/gif", "binary");
+ SET_SUFFIX1(".ief", "image/ief", "binary");
+ SET_SUFFIX1(".jfif", "image/jpeg", "binary"); /* xtra */
+ SET_SUFFIX1(".jfif-tbnl", "image/jpeg", "binary"); /* xtra */
+ SET_SUFFIX1(".jpe", "image/jpeg", "binary");
+ SET_SUFFIX1(".jpg", "image/jpeg", "binary");
+ SET_SUFFIX1(".jpeg", "image/jpeg", "binary");
+ SET_SUFFIX1(".tif", "image/tiff", "binary");
+ SET_SUFFIX1(".tiff", "image/tiff", "binary");
+ SET_SUFFIX1(".ham", "image/ham", "binary");
+ SET_SUFFIX1(".ras", "image/x-cmu-rast", "binary");
+ SET_SUFFIX1(".pnm", "image/x-portable-anymap", "binary");
+ SET_SUFFIX1(".pbm", "image/x-portable-bitmap", "binary");
+ SET_SUFFIX1(".pgm", "image/x-portable-graymap", "binary");
+ SET_SUFFIX1(".ppm", "image/x-portable-pixmap", "binary");
+ SET_SUFFIX1(".png", "image/png", "binary");
+ SET_SUFFIX1(".rgb", "image/x-rgb", "binary");
+ SET_SUFFIX1(".xbm", "image/x-xbitmap", "binary");
+ SET_SUFFIX1(".xpm", "image/x-xpixmap", "binary");
+ SET_SUFFIX1(".xwd", "image/x-xwindowdump", "binary");
+
+ SET_SUFFIX1(".rtx", "text/richtext", "8bit");
+ SET_SUFFIX1(".tsv", "text/tab-separated-values", "8bit");
+ SET_SUFFIX1(".etx", "text/x-setext", "8bit");
+
+ SET_SUFFIX1(".mpg", "video/mpeg", "binary");
+ SET_SUFFIX1(".mpe", "video/mpeg", "binary");
+ SET_SUFFIX1(".mpeg", "video/mpeg", "binary");
+ SET_SUFFIX1(".mov", "video/quicktime", "binary");
+ SET_SUFFIX1(".qt", "video/quicktime", "binary");
+ SET_SUFFIX1(".avi", "video/x-msvideo", "binary");
+ SET_SUFFIX1(".movie", "video/x-sgi-movie", "binary");
+ SET_SUFFIX1(".mv", "video/x-sgi-movie", "binary");
+
+ SET_SUFFIX1(".mime", "message/rfc822", "8bit");
+
+ SET_SUFFIX1(".c", STR_PLAINTEXT, "8bit");
+ SET_SUFFIX1(".cc", STR_PLAINTEXT, "8bit");
+ SET_SUFFIX1(".c++", STR_PLAINTEXT, "8bit");
+ SET_SUFFIX1(".css", STR_PLAINTEXT, "8bit");
+ SET_SUFFIX1(".h", STR_PLAINTEXT, "8bit");
+ SET_SUFFIX1(".pl", STR_PLAINTEXT, "8bit");
+ SET_SUFFIX1(".text", STR_PLAINTEXT, "8bit");
+ SET_SUFFIX1(".txt", STR_PLAINTEXT, "8bit");
+
+ SET_SUFFIX1(".php", STR_HTML, "8bit");
+ SET_SUFFIX1(".php3", STR_HTML, "8bit");
+ SET_SUFFIX1(".html3", STR_HTML, "8bit");
+ SET_SUFFIX1(".ht3", STR_HTML, "8bit");
+ SET_SUFFIX1(".phtml", STR_HTML, "8bit");
+ SET_SUFFIX1(".shtml", STR_HTML, "8bit");
+ SET_SUFFIX1(".sht", STR_HTML, "8bit");
+ SET_SUFFIX1(".htmlx", STR_HTML, "8bit");
+ SET_SUFFIX1(".htm", STR_HTML, "8bit");
+ SET_SUFFIX1(".html", STR_HTML, "8bit");
+ /* *INDENT-ON* */
+
+ } else { /* LYSuffixRules */
+ /*
+ * Note that even .html -> text/html, .htm -> text/html are omitted if
+ * default maps are compiled in but then skipped because of a
+ * configuration file directive. Whoever changes the config file in
+ * this way can easily also add the SUFFIX rules there. - kw
+ */
+ CTrace((tfp,
+ "HTFileInit: Skipping all default (HTInit) extension maps!\n"));
+ } /* LYSuffixRules */
+
+#else /* BUILTIN_SUFFIX_MAPS */
+
+ CTrace((tfp,
+ "HTFileInit: Default (HTInit) extension maps not compiled in.\n"));
+ /*
+ * The following two are still used if BUILTIN_SUFFIX_MAPS was undefined.
+ * Without one of them, lynx would always need to have a mapping specified
+ * in a lynx.cfg or mime.types file to be usable for local HTML files at
+ * all. That includes many of the generated user interface pages. - kw
+ */
+ SET_SUFFIX1(".htm", STR_HTML, "8bit");
+ SET_SUFFIX1(".html", STR_HTML, "8bit");
+#endif /* BUILTIN_SUFFIX_MAPS */
+
+ if (LYisAbsPath(global_extension_map)) {
+ /* These should override the default extensions as necessary. */
+ HTLoadExtensionsConfigFile(global_extension_map);
+ }
+
+ /*
+ * Load the local maps.
+ */
+ if (IsOurFile(LYAbsOrHomePath(&personal_extension_map))
+ && LYCanReadFile(personal_extension_map)) {
+ /* These should override everything else. */
+ HTLoadExtensionsConfigFile(personal_extension_map);
+ }
+}
+
+/* -------------------- Extension config file reading --------------------- */
+
+/*
+ * The following is lifted from NCSA httpd 1.0a1, by Rob McCool;
+ * NCSA httpd is in the public domain, as is this code.
+ *
+ * Modified Oct 97 - KW
+ */
+
+#define MAX_STRING_LEN 256
+
+static int HTGetLine(char *s, int n, FILE *f)
+{
+ register int i = 0, r;
+
+ if (!f)
+ return (1);
+
+ while (1) {
+ r = fgetc(f);
+ s[i] = (char) r;
+
+ if (s[i] == CR) {
+ r = fgetc(f);
+ if (r == LF)
+ s[i] = (char) r;
+ else if (r != EOF)
+ ungetc(r, f);
+ }
+
+ if ((r == EOF) || (s[i] == LF) || (s[i] == CR) || (i == (n - 1))) {
+ s[i] = '\0';
+ return (feof(f) ? 1 : 0);
+ }
+ ++i;
+ }
+}
+
+static void HTGetWord(char *word, char *line, int stop, int stop2)
+{
+ int x = 0, y;
+
+ for (x = 0; (line[x]
+ && UCH(line[x]) != UCH(stop)
+ && UCH(line[x]) != UCH(stop2)); x++) {
+ word[x] = line[x];
+ }
+
+ word[x] = '\0';
+ if (line[x])
+ ++x;
+ y = 0;
+
+ while ((line[y++] = line[x++])) {
+ ;
+ }
+
+ return;
+}
+
+static int HTLoadExtensionsConfigFile(char *fn)
+{
+ char line[MAX_STRING_LEN];
+ char word[MAX_STRING_LEN];
+ char *ct;
+ FILE *f;
+ int count = 0;
+
+ CTrace((tfp, "HTLoadExtensionsConfigFile: Loading file '%s'.\n", fn));
+
+ if ((f = fopen(fn, TXT_R)) == NULL) {
+ CTrace((tfp, "HTLoadExtensionsConfigFile: Could not open '%s'.\n", fn));
+ return count;
+ }
+
+ while (!(HTGetLine(line, (int) sizeof(line), f))) {
+ HTGetWord(word, line, ' ', '\t');
+ if (line[0] == '\0' || word[0] == '#')
+ continue;
+ ct = NULL;
+ StrAllocCopy(ct, word);
+ LYLowerCase(ct);
+
+ while (line[0]) {
+ HTGetWord(word, line, ' ', '\t');
+ if (word[0] && (word[0] != ' ')) {
+ char *ext = NULL;
+
+ HTSprintf0(&ext, ".%s", word);
+ LYLowerCase(ext);
+
+ CTrace((tfp, "setting suffix '%s' to '%s'.\n", ext, ct));
+
+ if (strstr(ct, "tex") != NULL ||
+ strstr(ct, "postscript") != NULL ||
+ strstr(ct, "sh") != NULL ||
+ strstr(ct, "troff") != NULL ||
+ strstr(ct, "rtf") != NULL)
+ SET_SUFFIX1(ext, ct, "8bit");
+ else
+ SET_SUFFIX1(ext, ct, "binary");
+ count++;
+
+ FREE(ext);
+ }
+ }
+ FREE(ct);
+ }
+ LYCloseInput(f);
+
+ return count;
+}
diff --git a/src/HTML.c b/src/HTML.c
new file mode 100644
index 0000000..5c57a07
--- /dev/null
+++ b/src/HTML.c
@@ -0,0 +1,8198 @@
+/*
+ * $LynxId: HTML.c,v 1.200 2022/07/22 20:22:13 tom Exp $
+ *
+ * Structured stream to Rich hypertext converter
+ * ============================================
+ *
+ * This generates a hypertext object. It converts from the
+ * structured stream interface of HTML events into the style-
+ * oriented interface of the HText.h interface. This module is
+ * only used in clients and should not be linked into servers.
+ *
+ * Override this module if making a new GUI browser.
+ *
+ * Being Overridden
+ *
+ */
+
+#define HTSTREAM_INTERNAL 1
+
+#include <HTUtils.h>
+
+#define Lynx_HTML_Handler
+#include <HTChunk.h>
+#include <HText.h>
+#include <HTStyle.h>
+#include <HTML.h>
+
+#include <HTCJK.h>
+#include <HTAtom.h>
+#include <HTAnchor.h>
+#include <HTMLGen.h>
+#include <HTParse.h>
+#include <HTList.h>
+#include <UCMap.h>
+#include <UCDefs.h>
+#include <UCAux.h>
+
+#include <LYGlobalDefs.h>
+#include <LYCharUtils.h>
+#include <LYCharSets.h>
+
+#include <HTAlert.h>
+#include <HTForms.h>
+#include <HTNestedList.h>
+#include <GridText.h>
+#include <LYStrings.h>
+#include <LYUtils.h>
+#include <LYMap.h>
+#include <LYList.h>
+#include <LYBookmark.h>
+#include <LYHistory.h>
+
+#ifdef VMS
+#include <LYCurses.h>
+#endif /* VMS */
+
+#ifdef USE_PRETTYSRC
+#include <LYPrettySrc.h>
+#endif
+
+#ifdef USE_COLOR_STYLE
+#include <SGML.h>
+#include <AttrList.h>
+#include <LYHash.h>
+#include <LYStyle.h>
+#undef SELECTED_STYLES
+#define pHText_changeStyle(X,Y,Z) {}
+#endif /* USE_COLOR_STYLE */
+
+#ifdef USE_SOURCE_CACHE
+#include <HTAccess.h>
+#endif
+
+#include <LYCurses.h>
+#include <LYJustify.h>
+
+#include <LYexit.h>
+#include <LYLeaks.h>
+
+#define STACKLEVEL(me) ((me->stack + MAX_NESTING - 1) - me->sp)
+
+#define DFT_TEXTAREA_COLS 60
+#define DFT_TEXTAREA_ROWS 4
+
+#define MAX_TEXTAREA_COLS LYcolLimit
+#define MAX_TEXTAREA_ROWS (3 * LYlines)
+
+#define LimitValue(name, value) \
+ if (name > value) { \
+ CTRACE((tfp, "Limited " #name " to %d, was %d\n", \
+ value, name)); \
+ name = value; \
+ }
+
+struct _HTStream {
+ const HTStreamClass *isa;
+#ifdef USE_SOURCE_CACHE
+ HTParentAnchor *anchor;
+ FILE *fp;
+ char *filename;
+ HTChunk *chunk;
+ HTChunk *last_chunk; /* the last chunk in a chain! */
+ const HTStreamClass *actions;
+ HTStream *target;
+ int status;
+#else
+ /* .... */
+#endif
+};
+
+static HTStyleSheet *styleSheet = NULL; /* Application-wide */
+
+/* Module-wide style cache
+*/
+static HTStyle *styles[HTML_ELEMENTS + LYNX_HTML_EXTRA_ELEMENTS];
+
+ /* adding 24 nested list styles */
+ /* and 3 header alignment styles */
+ /* and 3 div alignment styles */
+static HTStyle *default_style = NULL;
+
+const char *LYToolbarName = "LynxPseudoToolbar";
+
+/* used to turn off a style if the HTML author forgot to
+static int i_prior_style = -1;
+ */
+
+/*
+ * Private function....
+ */
+static int HTML_end_element(HTStructured * me, int element_number,
+ char **include);
+
+static int HTML_start_element(HTStructured * me, int element_number,
+ const BOOL *present,
+ STRING2PTR value,
+ int tag_charset,
+ char **include);
+
+/*
+ * If we have verbose_img set, display labels for images.
+ */
+#define VERBOSE_IMG(value,src_type,string) \
+ ((verbose_img) ? (newtitle = MakeNewTitle(value,src_type)): string)
+
+static char *MakeNewTitle(STRING2PTR value, int src_type);
+static char *MakeNewImageValue(STRING2PTR value);
+static char *MakeNewMapValue(STRING2PTR value, const char *mapstr);
+
+/* Set an internal flag that the next call to a stack-affecting method
+ * is only internal and the stack manipulation should be skipped. - kw
+ */
+#define SET_SKIP_STACK(el_num) if (HTML_dtd.tags[el_num].contents != SGML_EMPTY) \
+ { me->skip_stack++; }
+
+void strtolower(char *i)
+{
+ if (!i)
+ return;
+ while (*i) {
+ *i = (char) TOLOWER(*i);
+ i++;
+ }
+}
+
+/* Flattening the style structure
+ * ------------------------------
+ *
+ * On the NeXT, and on any read-only browser, it is simpler for the text to
+ * have a sequence of styles, rather than a nested tree of styles. In this
+ * case we have to flatten the structure as it arrives from SGML tags into a
+ * sequence of styles.
+ */
+
+/*
+ * If style really needs to be set, call this.
+ */
+void actually_set_style(HTStructured * me)
+{
+ if (!me->text) { /* First time through */
+ LYGetChartransInfo(me);
+ UCSetTransParams(&me->T,
+ me->UCLYhndl, me->UCI,
+ HTAnchor_getUCLYhndl(me->node_anchor,
+ UCT_STAGE_HTEXT),
+ HTAnchor_getUCInfoStage(me->node_anchor,
+ UCT_STAGE_HTEXT));
+ me->text = HText_new2(me->node_anchor, me->target);
+ HText_beginAppend(me->text);
+ HText_setStyle(me->text, me->new_style);
+ me->in_word = NO;
+ LYCheckForContentBase(me);
+ } else {
+ HText_setStyle(me->text, me->new_style);
+ }
+
+ me->old_style = me->new_style;
+ me->style_change = NO;
+}
+
+/*
+ * If you THINK you need to change style, call this.
+ */
+static void change_paragraph_style(HTStructured * me, HTStyle *style)
+{
+ if (me->new_style != style) {
+ me->style_change = YES;
+ me->new_style = style;
+ }
+ me->in_word = NO;
+}
+
+/*
+ * Return true if we should write a message (to LYNXMESSAGES, or the trace
+ * file) telling about some bad HTML that we've found.
+ */
+BOOL LYBadHTML(HTStructured * me)
+{
+ BOOL code = FALSE;
+
+ switch ((enumBadHtml) cfg_bad_html) {
+ case BAD_HTML_IGNORE:
+ break;
+ case BAD_HTML_TRACE:
+ code = TRUE;
+ break;
+ case BAD_HTML_MESSAGE:
+ code = TRUE;
+ break;
+ case BAD_HTML_WARN:
+ /*
+ * If we're already tracing, do not add a warning.
+ */
+ if (!TRACE && !me->inBadHTML) {
+ HTUserMsg(BAD_HTML_USE_TRACE);
+ me->inBadHTML = TRUE;
+ }
+ code = TRACE;
+ break;
+ }
+ return code;
+}
+
+/*
+ * Handle the formatted message.
+ */
+void LYShowBadHTML(const char *message)
+{
+ if (dump_output_immediately && dump_to_stderr)
+ fprintf(stderr, "%s", message);
+
+ switch ((enumBadHtml) cfg_bad_html) {
+ case BAD_HTML_IGNORE:
+ break;
+ case BAD_HTML_TRACE:
+ case BAD_HTML_MESSAGE:
+ case BAD_HTML_WARN:
+ CTRACE((tfp, "%s", message));
+ break;
+ }
+
+ switch ((enumBadHtml) cfg_bad_html) {
+ case BAD_HTML_IGNORE:
+ case BAD_HTML_TRACE:
+ case BAD_HTML_WARN:
+ break;
+ case BAD_HTML_MESSAGE:
+ LYstore_message(message);
+ break;
+ }
+}
+
+/*_________________________________________________________________________
+ *
+ * A C T I O N R O U T I N E S
+ */
+
+/* Character handling
+ * ------------------
+ */
+void HTML_put_character(HTStructured * me, int c)
+{
+ unsigned uc = UCH(c);
+
+ /*
+ * Ignore all non-MAP content when just scanning a document for MAPs. - FM
+ */
+ if (LYMapsOnly && me->sp[0].tag_number != HTML_OBJECT)
+ return;
+
+ c = (int) uc;
+
+ /*
+ * Do EOL conversion if needed. - FM
+ *
+ * Convert EOL styles:
+ * macintosh: cr --> lf
+ * ascii: cr-lf --> lf
+ * unix: lf --> lf
+ */
+ if ((me->lastraw == '\r') && c == '\n') {
+ me->lastraw = -1;
+ return;
+ }
+ me->lastraw = c;
+ if (c == '\r') {
+ c = '\n';
+ uc = UCH(c);
+ }
+
+ /*
+ * Handle SGML_LITTERAL tags that have HTChunk elements. - FM
+ */
+ switch (me->sp[0].tag_number) {
+
+ case HTML_COMMENT:
+ return; /* Do Nothing */
+
+ case HTML_TITLE:
+ if (c == LY_SOFT_HYPHEN)
+ return;
+ if (c != '\n' && c != '\t' && c != '\r') {
+ HTChunkPutc(&me->title, uc);
+#ifdef EXP_JAPANESE_SPACES
+ } else if (c == '\t') {
+ HTChunkPutc(&me->title, ' ');
+ /* don't replace '\n' with ' ' if Chinese or Japanese - HN */
+ } else if (me->title.size > 0 &&
+ is8bits(me->title.data[me->title.size - 1])) {
+ if (HTCJK == CHINESE || HTCJK == JAPANESE) {
+ /* TODO: support 2nd byte of SJIS (!is8bits && IS_SJIS_LO) */
+ return;
+ } else if (IS_UTF8_TTY) {
+ /* find start position of UTF-8 sequence */
+ int i = me->title.size - 1;
+
+ while (i > 0 && (me->title.data[i] & 0xc0) == 0x80) /* UTF_EXTRA */
+ i--;
+ if (isUTF8CJChar(&(me->title.data[i])))
+ return;
+ }
+ HTChunkPutc(&me->title, ' ');
+#endif
+ } else {
+ HTChunkPutc(&me->title, ' ');
+ }
+ return;
+
+ case HTML_STYLE:
+ HTChunkPutc(&me->style_block, uc);
+ return;
+
+ case HTML_SCRIPT:
+ HTChunkPutc(&me->script, uc);
+ return;
+
+ case HTML_OBJECT:
+ HTChunkPutc(&me->object, uc);
+ return;
+
+ case HTML_TEXTAREA:
+ HTChunkPutc(&me->textarea, uc);
+ return;
+
+ case HTML_SELECT:
+ case HTML_OPTION:
+ HTChunkPutc(&me->option, uc);
+ return;
+
+ case HTML_MATH:
+ HTChunkPutc(&me->math, uc);
+ return;
+
+ default:
+ if (me->inSELECT) {
+ /*
+ * If we are within a SELECT not caught by the cases above -
+ * HTML_SELECT or HTML_OPTION may not be the last element pushed on
+ * the style stack if there were invalid markup tags within a
+ * SELECT element. For error recovery, treat text as part of the
+ * OPTION text, it is probably meant to show up as user-visible
+ * text. Having A as an open element while in SELECT is really
+ * sick, don't make anchor text part of the option text in that
+ * case since the option text will probably just be discarded. -
+ * kw
+ */
+ if (me->sp[0].tag_number == HTML_A)
+ break;
+ HTChunkPutc(&me->option, uc);
+ return;
+ }
+ break;
+ } /* end first switch */
+
+ /*
+ * Handle all other tag content. - FM
+ */
+ switch (me->sp[0].tag_number) {
+
+ case HTML_PRE: /* Formatted text */
+ /*
+ * We guarantee that the style is up-to-date in begin_litteral. But we
+ * still want to strip \r's.
+ */
+ if (c != '\r' &&
+ !(c == '\n' && me->inLABEL && !me->inP) &&
+ !(c == '\n' && !me->inPRE)) {
+ me->inP = TRUE;
+ me->inLABEL = FALSE;
+ HText_appendCharacter(me->text, c);
+ }
+ me->inPRE = TRUE;
+ break;
+
+ case HTML_LISTING: /* Literal text */
+ case HTML_XMP:
+ case HTML_PLAINTEXT:
+ /*
+ * We guarantee that the style is up-to-date in begin_litteral. But we
+ * still want to strip \r's.
+ */
+ if (c != '\r') {
+ me->inP = TRUE;
+ me->inLABEL = FALSE;
+ HText_appendCharacter(me->text, c);
+ }
+ break;
+
+ default:
+ /*
+ * Free format text.
+ */
+ if (me->sp->style->id == ST_Preformatted) {
+ if (c != '\r' &&
+ !(c == '\n' && me->inLABEL && !me->inP) &&
+ !(c == '\n' && !me->inPRE)) {
+ me->inP = TRUE;
+ me->inLABEL = FALSE;
+ HText_appendCharacter(me->text, c);
+ }
+ me->inPRE = TRUE;
+
+ } else if (me->sp->style->id == ST_Listing ||
+ me->sp->style->id == ST_Example) {
+ if (c != '\r') {
+ me->inP = TRUE;
+ me->inLABEL = FALSE;
+ HText_appendCharacter(me->text, c);
+ }
+
+ } else {
+ if (me->style_change) {
+ if ((c == '\n') || (c == ' '))
+ return; /* Ignore it */
+ UPDATE_STYLE;
+ }
+ if (c == '\n') {
+ if (me->in_word) {
+#ifdef EXP_JAPANESE_SPACES
+ if (HText_checkLastChar_needSpaceOnJoinLines(me->text)) {
+#else
+ if (HText_getLastChar(me->text) != ' ') {
+#endif
+ me->inP = TRUE;
+ me->inLABEL = FALSE;
+ HText_appendCharacter(me->text, ' ');
+ }
+ me->in_word = NO;
+ }
+
+ } else if (c == ' ' || c == '\t') {
+ if (HText_getLastChar(me->text) != ' ') {
+ me->inP = TRUE;
+ me->inLABEL = FALSE;
+ HText_appendCharacter(me->text, ' ');
+ }
+
+ } else if (c == '\r') {
+ /* ignore */
+
+ } else {
+ me->inP = TRUE;
+ me->inLABEL = FALSE;
+ HText_appendCharacter(me->text, c);
+ me->in_word = YES;
+ }
+ }
+ } /* end second switch */
+
+ if (c == '\n' || c == '\t') {
+ HText_setLastChar(me->text, ' '); /* set it to a generic separator */
+ } else {
+ HText_setLastChar(me->text, c);
+ }
+}
+
+/* String handling
+ * ---------------
+ *
+ * This is written separately from put_character because the loop can
+ * in some cases be promoted to a higher function call level for speed.
+ */
+void HTML_put_string(HTStructured * me, const char *s)
+{
+ HTChunk *target = NULL;
+
+#ifdef USE_PRETTYSRC
+ char *translated_string = NULL;
+#endif
+
+ if (s == NULL || (LYMapsOnly && me->sp[0].tag_number != HTML_OBJECT))
+ return;
+#ifdef USE_PRETTYSRC
+ if (psrc_convert_string) {
+ StrAllocCopy(translated_string, s);
+ TRANSLATE_AND_UNESCAPE_ENTITIES(&translated_string, TRUE, FALSE);
+ s = (const char *) translated_string;
+ }
+#endif
+
+ switch (me->sp[0].tag_number) {
+
+ case HTML_COMMENT:
+ break; /* Do Nothing */
+
+ case HTML_TITLE:
+ target = &me->title;
+ break;
+
+ case HTML_STYLE:
+ target = &me->style_block;
+ break;
+
+ case HTML_SCRIPT:
+ target = &me->script;
+ break;
+
+ case HTML_PRE: /* Formatted text */
+ case HTML_LISTING: /* Literal text */
+ case HTML_XMP:
+ case HTML_PLAINTEXT:
+ /*
+ * We guarantee that the style is up-to-date in begin_litteral
+ */
+ HText_appendText(me->text, s);
+ break;
+
+ case HTML_OBJECT:
+ target = &me->object;
+ break;
+
+ case HTML_TEXTAREA:
+ target = &me->textarea;
+ break;
+
+ case HTML_SELECT:
+ case HTML_OPTION:
+ target = &me->option;
+ break;
+
+ case HTML_MATH:
+ target = &me->math;
+ break;
+
+ default: /* Free format text? */
+ if (!me->sp->style->freeFormat) {
+ /*
+ * If we are within a preformatted text style not caught by the
+ * cases above (HTML_PRE or similar may not be the last element
+ * pushed on the style stack). - kw
+ */
+#ifdef USE_PRETTYSRC
+ if (psrc_view) {
+ /*
+ * We do this so that a raw '\r' in the string will not be
+ * interpreted as an internal request to break a line - passing
+ * '\r' to HText_appendText is treated by it as a request to
+ * insert a blank line - VH
+ */
+ for (; *s; ++s)
+ HTML_put_character(me, *s);
+ } else
+#endif
+ HText_appendText(me->text, s);
+ break;
+ } else {
+ const char *p = s;
+ char c;
+
+ if (me->style_change) {
+ for (; *p && ((*p == '\n') || (*p == '\r') ||
+ (*p == ' ') || (*p == '\t')); p++) ; /* Ignore leaders */
+ if (!*p)
+ break;
+ UPDATE_STYLE;
+ }
+ for (; *p; p++) {
+ if (*p == 13 && p[1] != 10) {
+ /*
+ * Treat any '\r' which is not followed by '\n' as '\n', to
+ * account for macintosh lineend in ALT attributes etc. -
+ * kw
+ */
+ c = '\n';
+ } else {
+ c = *p;
+ }
+ if (me->style_change) {
+ if ((c == '\n') || (c == ' ') || (c == '\t'))
+ continue; /* Ignore it */
+ UPDATE_STYLE;
+ }
+ if (c == '\n') {
+ if (me->in_word) {
+#ifdef EXP_JAPANESE_SPACES
+ if (HText_checkLastChar_needSpaceOnJoinLines(me->text))
+#else
+ if (HText_getLastChar(me->text) != ' ')
+#endif
+ HText_appendCharacter(me->text, ' ');
+ me->in_word = NO;
+ }
+
+ } else if (c == ' ' || c == '\t') {
+ if (HText_getLastChar(me->text) != ' ')
+ HText_appendCharacter(me->text, ' ');
+
+ } else if (c == '\r') {
+ /* ignore */
+ } else {
+ HText_appendCharacter(me->text, c);
+ me->in_word = YES;
+ }
+
+ /* set the Last Character */
+ if (c == '\n' || c == '\t') {
+ /* set it to a generic separator */
+ HText_setLastChar(me->text, ' ');
+ } else if (c == '\r' &&
+ HText_getLastChar(me->text) == ' ') {
+ /*
+ * \r's are ignored. In order to keep collapsing spaces
+ * correctly, we must default back to the previous
+ * separator, if there was one. So we set LastChar to a
+ * generic separator.
+ */
+ HText_setLastChar(me->text, ' ');
+ } else {
+ HText_setLastChar(me->text, c);
+ }
+
+ } /* for */
+ }
+ } /* end switch */
+
+ if (target != NULL) {
+ if (target->data == s) {
+ CTRACE((tfp, "BUG: appending chunk to itself: `%.*s'\n",
+ target->size, target->data));
+ } else {
+ HTChunkPuts(target, s);
+ }
+ }
+#ifdef USE_PRETTYSRC
+ if (psrc_convert_string) {
+ psrc_convert_string = FALSE;
+ FREE(translated_string);
+ }
+#endif
+}
+
+/* Buffer write
+ * ------------
+ */
+void HTML_write(HTStructured * me, const char *s, int l)
+{
+ const char *p;
+ const char *e = s + l;
+
+ if (LYMapsOnly && me->sp[0].tag_number != HTML_OBJECT)
+ return;
+
+ for (p = s; p < e; p++)
+ HTML_put_character(me, *p);
+}
+
+/*
+ * "Internal links" are hyperlinks whose source and destination are
+ * within the same document, and for which the destination is given
+ * as a URL Reference with an empty URL, but possibly with a non-empty
+ * #fragment. (This terminology re URL-Reference vs. URL follows the
+ * Fielding URL syntax and semantics drafts).
+ * Differences:
+ * (1) The document's base (in whatever way it is given) is not used for
+ * resolving internal link references.
+ * (2) Activating an internal link should not result in a new retrieval
+ * of a copy of the document.
+ * (3) Internal links are the only way to refer with a hyperlink to a document
+ * (or a location in it) which is only known as the result of a POST
+ * request (doesn't have a URL from which the document can be retrieved
+ * with GET), and can only be used from within that document.
+ *
+ * *If track_internal_links is true, we keep track of whether a
+ * link destination was given as an internal link. This information is
+ * recorded in the type of the link between anchor objects, and is available
+ * to the HText object and the mainloop from there. URL References to
+ * internal destinations are still resolved into an absolute form before
+ * being passed on, but using the current stream's retrieval address instead
+ * of the base URL.
+ * Examples: (replace [...] to have a valid absolute URL)
+ * In document retrieved from [...]/mypath/mydoc.htm w/ base [...]/otherpath/
+ * a. HREF="[...]/mypath/mydoc.htm" -> [...]/mypath/mydoc.htm
+ * b. HREF="[...]/mypath/mydoc.htm#frag" -> [...]/mypath/mydoc.htm#frag
+ * c. HREF="mydoc.htm" -> [...]/otherpath/mydoc.htm
+ * d. HREF="mydoc.htm#frag" -> [...]/otherpath/mydoc.htm#frag
+ * e. HREF="" -> [...]/mypath/mydoc.htm (marked internal)
+ * f. HREF="#frag" -> [...]/mypath/mydoc.htm#frag (marked internal)
+ *
+ * *If track_internal_links is false, URL-less URL-References are
+ * resolved differently from URL-References with a non-empty URL (using the
+ * current stream's retrieval address instead of the base), but we make no
+ * further distinction. Resolution is then as in the examples above, execept
+ * that there is no "(marked internal)".
+ *
+ * *Note that this doesn't apply to form ACTIONs (always resolved using base,
+ * never marked internal). Also other references encountered or generated
+ * are not marked internal, whether they have a URL or not, if in a given
+ * context an internal link makes no sense (e.g., IMG SRC=).
+ */
+
+/* A flag is used to keep track of whether an "URL reference" encountered
+ had a real "URL" or not. In the latter case, it will be marked as
+ "internal". The flag is set before we start messing around with the
+ string (resolution of relative URLs etc.). This variable only used
+ locally here, don't confuse with LYinternal_flag which is for
+ overriding non-caching similar to LYoverride_no_cache. - kw */
+#define CHECK_FOR_INTERN(flag,s) \
+ flag = (BOOLEAN) (((s) && (*(s)=='#' || *(s)=='\0')) ? TRUE : FALSE)
+
+/* Last argument to pass to HTAnchor_findChildAndLink() calls,
+ just an abbreviation. - kw */
+#define INTERN_CHK(flag) (HTLinkType *)((flag) ? HTInternalLink : NULL)
+#define INTERN_LT INTERN_CHK(intern_flag)
+
+#ifdef USE_COLOR_STYLE
+static char *Style_className = 0;
+static char *Style_className_end = 0;
+static size_t Style_className_len = 0;
+static int hcode;
+
+#ifdef LY_FIND_LEAKS
+static void free_Style_className(void)
+{
+ FREE(Style_className);
+}
+#endif
+
+static void addClassName(const char *prefix,
+ const char *actual,
+ size_t length)
+{
+ size_t offset = strlen(prefix);
+ size_t have = (unsigned) (Style_className_end - Style_className);
+ size_t need = (offset + length + 1);
+
+ if ((have + need) >= Style_className_len) {
+ Style_className_len += 1024 + 2 * (have + need);
+ if (Style_className == 0) {
+ Style_className = typeMallocn(char, Style_className_len);
+ } else {
+ Style_className = typeRealloc(char, Style_className, Style_className_len);
+ }
+ if (Style_className == NULL)
+ outofmem(__FILE__, "addClassName");
+ Style_className_end = Style_className + have;
+ }
+ if (offset)
+ strcpy(Style_className_end, prefix);
+ if (length)
+ memcpy(Style_className_end + offset, actual, length);
+ Style_className_end[offset + length] = '\0';
+ strtolower(Style_className_end);
+
+ Style_className_end += (offset + length);
+}
+#else
+#define addClassName(prefix, actual, length) /* nothing */
+#endif
+
+static void LYStartArea(HTStructured * obj, const char *href,
+ const char *alt,
+ const char *title,
+ int tag_charset)
+{
+ BOOL new_present[HTML_AREA_ATTRIBUTES];
+ const char *new_value[HTML_AREA_ATTRIBUTES];
+ int i;
+
+ for (i = 0; i < HTML_AREA_ATTRIBUTES; i++)
+ new_present[i] = NO;
+
+ if (alt) {
+ new_present[HTML_AREA_ALT] = YES;
+ new_value[HTML_AREA_ALT] = (const char *) alt;
+ }
+ if (non_empty(title)) {
+ new_present[HTML_AREA_TITLE] = YES;
+ new_value[HTML_AREA_TITLE] = (const char *) title;
+ }
+ if (href) {
+ new_present[HTML_AREA_HREF] = YES;
+ new_value[HTML_AREA_HREF] = (const char *) href;
+ }
+
+ (*obj->isa->start_element) (obj, HTML_AREA, new_present, new_value,
+ tag_charset, 0);
+}
+
+static void LYHandleFIG(HTStructured * me, const BOOL *present,
+ STRING2PTR value,
+ int isobject,
+ int imagemap,
+ const char *id,
+ const char *src,
+ int convert,
+ int start,
+ BOOL *intern_flag GCC_UNUSED)
+{
+ if (start == TRUE) {
+ me->inFIG = TRUE;
+ if (me->inA) {
+ SET_SKIP_STACK(HTML_A);
+ HTML_end_element(me, HTML_A, NULL);
+ }
+ if (!isobject) {
+ LYEnsureDoubleSpace(me);
+ LYResetParagraphAlignment(me);
+ me->inFIGwithP = TRUE;
+ } else {
+ me->inFIGwithP = FALSE;
+ HTML_put_character(me, ' '); /* space char may be ignored */
+ }
+ if (non_empty(id)) {
+ if (present && convert) {
+ CHECK_ID(HTML_FIG_ID);
+ } else
+ LYHandleID(me, id);
+ }
+ me->in_word = NO;
+ me->inP = FALSE;
+
+ if (clickable_images && non_empty(src)) {
+ char *href = NULL;
+
+ StrAllocCopy(href, src);
+ CHECK_FOR_INTERN(*intern_flag, href);
+ LYLegitimizeHREF(me, &href, TRUE, TRUE);
+ if (*href) {
+ me->CurrentA = HTAnchor_findChildAndLink(me->node_anchor, /* Parent */
+ NULL, /* Tag */
+ href, /* Address */
+ INTERN_CHK(*intern_flag)); /* Type */
+ HText_beginAnchor(me->text, me->inUnderline, me->CurrentA);
+ if (me->inBoldH == FALSE)
+ HText_appendCharacter(me->text, LY_BOLD_START_CHAR);
+ HTML_put_string(me, (isobject
+ ? (imagemap
+ ? "(IMAGE)"
+ : "(OBJECT)")
+ : "[FIGURE]"));
+ if (me->inBoldH == FALSE)
+ HText_appendCharacter(me->text, LY_BOLD_END_CHAR);
+ HText_endAnchor(me->text, 0);
+ HTML_put_character(me, '-');
+ HTML_put_character(me, ' '); /* space char may be ignored */
+ me->in_word = NO;
+ }
+ FREE(href);
+ }
+ } else { /* handle end tag */
+ if (me->inFIGwithP) {
+ LYEnsureDoubleSpace(me);
+ } else {
+ HTML_put_character(me, ' '); /* space char may be ignored */
+ }
+ LYResetParagraphAlignment(me);
+ me->inFIGwithP = FALSE;
+ me->inFIG = FALSE;
+ change_paragraph_style(me, me->sp->style); /* Often won't really change */
+ if (me->List_Nesting_Level >= 0) {
+ UPDATE_STYLE;
+ HText_NegateLineOne(me->text);
+ }
+ }
+}
+
+static void clear_objectdata(HTStructured * me)
+{
+ if (me) {
+ HTChunkClear(&me->object);
+ me->object_started = FALSE;
+ me->object_declare = FALSE;
+ me->object_shapes = FALSE;
+ me->object_ismap = FALSE;
+ FREE(me->object_usemap);
+ FREE(me->object_id);
+ FREE(me->object_title);
+ FREE(me->object_data);
+ FREE(me->object_type);
+ FREE(me->object_classid);
+ FREE(me->object_codebase);
+ FREE(me->object_codetype);
+ FREE(me->object_name);
+ }
+}
+
+#define HTParseALL(pp,pconst) \
+ { char* free_me = *pp; \
+ *pp = HTParse(*pp, pconst, PARSE_ALL); \
+ FREE(free_me); \
+ }
+
+/* Start Element
+ * -------------
+ */
+static int HTML_start_element(HTStructured * me, int element_number,
+ const BOOL *present,
+ STRING2PTR value,
+ int tag_charset,
+ char **include)
+{
+ char *alt_string = NULL;
+ char *id_string = NULL;
+ char *newtitle = NULL;
+ char **pdoctitle = NULL;
+ char *href = NULL;
+ char *map_href = NULL;
+ char *title = NULL;
+ char *I_value = NULL;
+ char *I_name = NULL;
+ char *temp = NULL;
+ const char *Base = NULL;
+ int dest_char_set = -1;
+ HTParentAnchor *dest = NULL; /* An anchor's destination */
+ BOOL dest_ismap = FALSE; /* Is dest an image map script? */
+ HTChildAnchor *ID_A = NULL; /* HTML_foo_ID anchor */
+ int url_type = 0, i = 0;
+ char *cp = NULL;
+ HTMLElement ElementNumber = (HTMLElement) element_number;
+ BOOL intern_flag = FALSE;
+ short stbl_align = HT_ALIGN_NONE;
+ int status = HT_OK;
+
+#ifdef USE_COLOR_STYLE
+ const char *class_name;
+ const char *prefix_string;
+ BOOL class_used = FALSE;
+#endif
+
+ if (LYMapsOnly) {
+ if (!(ElementNumber == HTML_MAP || ElementNumber == HTML_AREA ||
+ ElementNumber == HTML_BASE || ElementNumber == HTML_OBJECT ||
+ ElementNumber == HTML_A)) {
+ return HT_OK;
+ }
+ } else if (!me->text) {
+ UPDATE_STYLE;
+ } {
+ /* me->tag_charset is charset for attribute values. */
+ int j = ((tag_charset < 0) ? me->UCLYhndl : tag_charset);
+
+ if ((me->tag_charset != j) || (j < 0 /* for trace entry */ )) {
+ CTRACE((tfp, "me->tag_charset: %d -> %d", me->tag_charset, j));
+ CTRACE((tfp, " (me->UCLYhndl: %d, tag_charset: %d)\n",
+ me->UCLYhndl, tag_charset));
+ me->tag_charset = j;
+ }
+ }
+
+/* this should be done differently */
+#if defined(USE_COLOR_STYLE)
+
+ addClassName(";",
+ HTML_dtd.tags[element_number].name,
+ (size_t) HTML_dtd.tags[element_number].name_len);
+
+ class_name = (force_classname ? forced_classname : class_string);
+ force_classname = FALSE;
+
+ if (force_current_tag_style == FALSE) {
+ current_tag_style = (non_empty(class_name)
+ ? -1
+ : cached_tag_styles[element_number]);
+ } else {
+ force_current_tag_style = FALSE;
+ }
+
+ CTRACE2(TRACE_STYLE, (tfp, "CSS.elt:<%s>\n", HTML_dtd.tags[element_number].name));
+
+ prefix_string = "";
+ if (current_tag_style == -1) { /* Append class_name */
+ hcode = color_style_1(HTML_dtd.tags[element_number].name);
+ if (non_empty(class_name)) {
+ int ohcode = hcode;
+
+ prefix_string = HTML_dtd.tags[element_number].name;
+ hcode = color_style_3(prefix_string, ".", class_name);
+ if (!hashStyles[hcode].used) { /* None such -> classless version */
+ hcode = ohcode;
+ prefix_string = "";
+ CTRACE2(TRACE_STYLE,
+ (tfp,
+ "STYLE.start_element: <%s> (class <%s> not configured), hcode=%d.\n",
+ HTML_dtd.tags[element_number].name, class_name, hcode));
+ } else {
+ addClassName(".", class_name, strlen(class_name));
+
+ CTRACE2(TRACE_STYLE,
+ (tfp, "STYLE.start_element: <%s>.<%s>, hcode=%d.\n",
+ prefix_string, class_name, hcode));
+ class_used = TRUE;
+ }
+ }
+
+ class_string[0] = '\0';
+
+ } else { /* (current_tag_style!=-1) */
+ if (non_empty(class_name)) {
+ addClassName(".", class_name, strlen(class_name));
+ class_string[0] = '\0';
+ }
+ hcode = current_tag_style;
+ if (hcode >= 0 && hashStyles[hcode].used) {
+ prefix_string = hashStyles[hcode].name;
+ }
+ CTRACE2(TRACE_STYLE,
+ (tfp, "STYLE.start_element: <%s>, hcode=%d.\n",
+ HTML_dtd.tags[element_number].name, hcode));
+ current_tag_style = -1;
+ }
+
+ if (!class_used && ElementNumber == HTML_INPUT) { /* For some other too? */
+ const char *type = "";
+ int ohcode = hcode;
+
+ if (present && present[HTML_INPUT_TYPE] && value[HTML_INPUT_TYPE])
+ type = value[HTML_INPUT_TYPE];
+
+ hcode = color_style_3(prefix_string, ".type.", type);
+ if (!hashStyles[hcode].used) { /* None such -> classless version */
+ hcode = ohcode;
+ CTRACE2(TRACE_STYLE,
+ (tfp, "STYLE.start_element: type <%s> not configured.\n",
+ type));
+ } else {
+ addClassName(".type.", type, strlen(type));
+
+ CTRACE2(TRACE_STYLE,
+ (tfp, "STYLE.start_element: <%s>.type.<%s>, hcode=%d.\n",
+ HTML_dtd.tags[element_number].name, type, hcode));
+ }
+ }
+
+ HText_characterStyle(me->text, hcode, STACK_ON);
+#endif /* USE_COLOR_STYLE */
+
+ /*
+ * Handle the start tag. - FM
+ */
+ switch (ElementNumber) {
+
+ case HTML_HTML:
+ break;
+
+ case HTML_HEAD:
+ break;
+
+ case HTML_BASE:
+ if (present && present[HTML_BASE_HREF] && !local_host_only &&
+ non_empty(value[HTML_BASE_HREF])) {
+ char *base = NULL;
+ const char *related = NULL;
+
+ StrAllocCopy(base, value[HTML_BASE_HREF]);
+ CTRACE((tfp, "*HTML_BASE: initial href=`%s'\n", NonNull(base)));
+
+ if (!(url_type = LYLegitimizeHREF(me, &base, TRUE, TRUE))) {
+ CTRACE((tfp, "HTML: BASE '%s' is not an absolute URL.\n",
+ NonNull(base)));
+ }
+
+ if (url_type == LYNXIMGMAP_URL_TYPE) {
+ /*
+ * These have a non-standard form, basically strip the prefix
+ * or the code below would insert a nonsense host into the
+ * pseudo URL. These should never occur where they would be
+ * used for resolution of relative URLs anyway. We can also
+ * strip the #map part. - kw
+ */
+ temp = base;
+ base = HTParse(base + 11, "", PARSE_ALL_WITHOUT_ANCHOR);
+ FREE(temp);
+ }
+
+ /*
+ * Get parent's address for defaulted fields.
+ */
+ related = me->node_anchor->address;
+
+ /*
+ * Create the access field.
+ */
+ temp = HTParse(base, related, PARSE_ACCESS + PARSE_PUNCTUATION);
+ StrAllocCopy(me->base_href, temp);
+ FREE(temp);
+
+ /*
+ * Create the host[:port] field.
+ */
+ temp = HTParse(base, "", PARSE_HOST + PARSE_PUNCTUATION);
+ if (!StrNCmp(temp, "//", 2)) {
+ StrAllocCat(me->base_href, temp);
+ if (!strcmp(me->base_href, "file://")) {
+ StrAllocCat(me->base_href, "localhost");
+ }
+ } else {
+ if (isFILE_URL(me->base_href)) {
+ StrAllocCat(me->base_href, "//localhost");
+ } else if (strcmp(me->base_href, STR_NEWS_URL)) {
+ FREE(temp);
+ StrAllocCat(me->base_href, (temp = HTParse(related, "",
+ PARSE_HOST + PARSE_PUNCTUATION)));
+ }
+ }
+ FREE(temp);
+
+ /*
+ * Create the path field.
+ */
+ temp = HTParse(base, "", PARSE_PATH + PARSE_PUNCTUATION);
+ if (*temp != '\0') {
+ char *p = StrChr(temp, '?');
+
+ if (p)
+ *p = '\0';
+ p = strrchr(temp, '/');
+ if (p)
+ *(p + 1) = '\0'; /* strip after the last slash */
+
+ StrAllocCat(me->base_href, temp);
+ } else if (!strcmp(me->base_href, STR_NEWS_URL)) {
+ StrAllocCat(me->base_href, "*");
+ } else if (isNEWS_URL(me->base_href) ||
+ isNNTP_URL(me->base_href) ||
+ isSNEWS_URL(me->base_href)) {
+ StrAllocCat(me->base_href, "/*");
+ } else {
+ StrAllocCat(me->base_href, "/");
+ }
+ FREE(temp);
+ FREE(base);
+
+ me->inBASE = TRUE;
+ me->node_anchor->inBASE = TRUE;
+ StrAllocCopy(me->node_anchor->content_base, me->base_href);
+ /* me->base_href is a valid URL */
+
+ CTRACE((tfp, "*HTML_BASE: final href=`%s'\n", me->base_href));
+ }
+ break;
+
+ case HTML_META:
+ if (present)
+ LYHandleMETA(me, present, value, include);
+ break;
+
+ case HTML_TITLE:
+ HTChunkClear(&me->title);
+ break;
+
+ case HTML_LINK:
+ intern_flag = FALSE;
+ if (present && present[HTML_LINK_HREF]) {
+ CHECK_FOR_INTERN(intern_flag, value[HTML_LINK_HREF]);
+ /*
+ * Prepare to do housekeeping on the reference. - FM
+ */
+ if (isEmpty(value[HTML_LINK_HREF])) {
+ Base = (me->inBASE)
+ ? me->base_href
+ : me->node_anchor->address;
+ StrAllocCopy(href, Base);
+ } else {
+ StrAllocCopy(href, value[HTML_LINK_HREF]);
+ (void) LYLegitimizeHREF(me, &href, TRUE, TRUE);
+
+ Base = (me->inBASE && *href != '\0' && *href != '#')
+ ? me->base_href
+ : me->node_anchor->address;
+ HTParseALL(&href, Base);
+ }
+
+ /*
+ * Handle links with a REV attribute. - FM
+ * Handle REV="made" or REV="owner". - LM & FM
+ * Handle REL="author" -TD
+ */
+ if (present &&
+ ((present[HTML_LINK_REV] &&
+ value[HTML_LINK_REV] &&
+ (!strcasecomp("made", value[HTML_LINK_REV]) ||
+ !strcasecomp("owner", value[HTML_LINK_REV]))) ||
+ (present[HTML_LINK_REL] &&
+ value[HTML_LINK_REL] &&
+ (!strcasecomp("author", value[HTML_LINK_REL]))))) {
+ /*
+ * Load the owner element. - FM
+ */
+ HTAnchor_setOwner(me->node_anchor, href);
+ CTRACE((tfp, "HTML: DOC OWNER '%s' found\n", href));
+ FREE(href);
+
+ /*
+ * Load the RevTitle element if a TITLE attribute and value
+ * are present. - FM
+ */
+ if (present && present[HTML_LINK_TITLE] &&
+ value[HTML_LINK_TITLE] &&
+ *value[HTML_LINK_TITLE] != '\0') {
+ StrAllocCopy(title, value[HTML_LINK_TITLE]);
+ TRANSLATE_AND_UNESCAPE_ENTITIES(&title, TRUE, FALSE);
+ LYTrimHead(title);
+ LYTrimTail(title);
+ if (*title != '\0')
+ HTAnchor_setRevTitle(me->node_anchor, title);
+ FREE(title);
+ }
+ break;
+ }
+
+ /*
+ * Handle REL links. - FM
+ */
+
+ if (present &&
+ present[HTML_LINK_REL] && value[HTML_LINK_REL]) {
+ /*
+ * Ignore style sheets, for now. - FM
+ *
+ * lss and css have different syntax - lynx shouldn't try to
+ * parse them now (it tries to parse them as lss, so it exits
+ * with error message on the 1st non-empty line) - VH
+ */
+#ifndef USE_COLOR_STYLE
+ if (!strcasecomp(value[HTML_LINK_REL], "StyleSheet") ||
+ !strcasecomp(value[HTML_LINK_REL], "Style")) {
+ CTRACE2(TRACE_STYLE,
+ (tfp, "HTML: StyleSheet link found.\n"));
+ CTRACE2(TRACE_STYLE,
+ (tfp, " StyleSheets not yet implemented.\n"));
+ FREE(href);
+ break;
+ }
+#endif /* ! USE_COLOR_STYLE */
+
+ /*
+ * Ignore anything not registered in the 28-Mar-95 IETF HTML
+ * 3.0 draft and W3C HTML 3.2 draft, or not appropriate for
+ * Lynx banner links in the expired Maloney and Quin relrev
+ * draft. We'll make this more efficient when the situation
+ * stabilizes, and for now, we'll treat "Banner" as another
+ * toolbar element. - FM
+ */
+ if (!strcasecomp(value[HTML_LINK_REL], "Home") ||
+ !strcasecomp(value[HTML_LINK_REL], "ToC") ||
+ !strcasecomp(value[HTML_LINK_REL], "Contents") ||
+ !strcasecomp(value[HTML_LINK_REL], "Index") ||
+ !strcasecomp(value[HTML_LINK_REL], "Glossary") ||
+ !strcasecomp(value[HTML_LINK_REL], "Copyright") ||
+ !strcasecomp(value[HTML_LINK_REL], "Help") ||
+ !strcasecomp(value[HTML_LINK_REL], "Search") ||
+ !strcasecomp(value[HTML_LINK_REL], "Bookmark") ||
+ !strcasecomp(value[HTML_LINK_REL], "Banner") ||
+ !strcasecomp(value[HTML_LINK_REL], "Top") ||
+ !strcasecomp(value[HTML_LINK_REL], "Origin") ||
+ !strcasecomp(value[HTML_LINK_REL], "Navigator") ||
+ !strcasecomp(value[HTML_LINK_REL], "Disclaimer") ||
+ !strcasecomp(value[HTML_LINK_REL], "Author") ||
+ !strcasecomp(value[HTML_LINK_REL], "Editor") ||
+ !strcasecomp(value[HTML_LINK_REL], "Publisher") ||
+ !strcasecomp(value[HTML_LINK_REL], "Trademark") ||
+ !strcasecomp(value[HTML_LINK_REL], "Hotlist") ||
+ !strcasecomp(value[HTML_LINK_REL], "Begin") ||
+ !strcasecomp(value[HTML_LINK_REL], "First") ||
+ !strcasecomp(value[HTML_LINK_REL], "End") ||
+ !strcasecomp(value[HTML_LINK_REL], "Last") ||
+ !strcasecomp(value[HTML_LINK_REL], "Documentation") ||
+ !strcasecomp(value[HTML_LINK_REL], "Biblioentry") ||
+ !strcasecomp(value[HTML_LINK_REL], "Bibliography") ||
+ !strcasecomp(value[HTML_LINK_REL], "Start") ||
+ !strcasecomp(value[HTML_LINK_REL], "Appendix")) {
+ StrAllocCopy(title, value[HTML_LINK_REL]);
+ pdoctitle = &title; /* for setting HTAnchor's title */
+ } else if (!strcasecomp(value[HTML_LINK_REL], "Up") ||
+ !strcasecomp(value[HTML_LINK_REL], "Next") ||
+ !strcasecomp(value[HTML_LINK_REL], "Previous") ||
+ !strcasecomp(value[HTML_LINK_REL], "Prev") ||
+ !strcasecomp(value[HTML_LINK_REL], "Child") ||
+ !strcasecomp(value[HTML_LINK_REL], "Sibling") ||
+ !strcasecomp(value[HTML_LINK_REL], "Parent") ||
+ !strcasecomp(value[HTML_LINK_REL], "Meta") ||
+ !strcasecomp(value[HTML_LINK_REL], "URC") ||
+ !strcasecomp(value[HTML_LINK_REL], "Pointer") ||
+ !strcasecomp(value[HTML_LINK_REL], "Translation") ||
+ !strcasecomp(value[HTML_LINK_REL], "Definition") ||
+ !strcasecomp(value[HTML_LINK_REL], "Alternate") ||
+ !strcasecomp(value[HTML_LINK_REL], "Section") ||
+ !strcasecomp(value[HTML_LINK_REL], "Subsection") ||
+ !strcasecomp(value[HTML_LINK_REL], "Chapter")) {
+ StrAllocCopy(title, value[HTML_LINK_REL]);
+ /* not setting target HTAnchor's title, for these
+ links of highly relative character. Instead,
+ try to remember the REL attribute as a property
+ of the link (but not the destination), in the
+ (otherwise underused) link type in a special format;
+ the LIST page generation code may later use it. - kw */
+ if (!intern_flag) {
+ StrAllocCopy(temp, "RelTitle: ");
+ StrAllocCat(temp, value[HTML_LINK_REL]);
+ }
+#ifndef DISABLE_BIBP
+ } else if (!strcasecomp(value[HTML_LINK_REL], "citehost")) {
+ /* Citehost determination for bibp links. - RDC */
+ HTAnchor_setCitehost(me->node_anchor, href);
+ CTRACE((tfp, "HTML: citehost '%s' found\n", href));
+ FREE(href);
+ break;
+#endif
+ } else {
+ CTRACE((tfp, "HTML: LINK with REL=\"%s\" ignored.\n",
+ value[HTML_LINK_REL]));
+ FREE(href);
+ break;
+ }
+ }
+ } else if (present &&
+ present[HTML_LINK_REL] && value[HTML_LINK_REL]) {
+ /*
+ * If no HREF was specified, handle special REL links with
+ * self-designated HREFs. - FM
+ */
+ if (!strcasecomp(value[HTML_LINK_REL], "Home")) {
+ StrAllocCopy(href, LynxHome);
+ } else if (!strcasecomp(value[HTML_LINK_REL], "Help")) {
+ StrAllocCopy(href, helpfile);
+ } else if (!strcasecomp(value[HTML_LINK_REL], "Index")) {
+ StrAllocCopy(href, indexfile);
+ } else {
+ CTRACE((tfp,
+ "HTML: LINK with REL=\"%s\" and no HREF ignored.\n",
+ value[HTML_LINK_REL]));
+ break;
+ }
+ StrAllocCopy(title, value[HTML_LINK_REL]);
+ pdoctitle = &title;
+ }
+ if (href) {
+ /*
+ * Create a title (link name) from the TITLE value, if present, or
+ * default to the REL value that was loaded into title. - FM
+ */
+ if (present && present[HTML_LINK_TITLE] &&
+ non_empty(value[HTML_LINK_TITLE])) {
+ StrAllocCopy(title, value[HTML_LINK_TITLE]);
+ TRANSLATE_AND_UNESCAPE_ENTITIES(&title, TRUE, FALSE);
+ LYTrimHead(title);
+ LYTrimTail(title);
+ pdoctitle = &title;
+ FREE(temp); /* forget about recording RelTitle - kw */
+ }
+ if (isEmpty(title)) {
+ FREE(href);
+ FREE(title);
+ break;
+ }
+
+ if (me->inA) {
+ /*
+ * Ugh! The LINK tag, which is a HEAD element, is in an
+ * Anchor, which is BODY element. All we can do is close the
+ * Anchor and cross our fingers. - FM
+ */
+ SET_SKIP_STACK(HTML_A);
+ HTML_end_element(me, HTML_A, include);
+ }
+
+ /*
+ * Create anchors for the links that simulate a toolbar. - FM
+ */
+ me->CurrentA = HTAnchor_findChildAndLink(me->node_anchor, /* Parent */
+ NULL, /* Tag */
+ href, /* Address */
+ (temp
+ ? (HTLinkType *)
+ HTAtom_for(temp)
+ : INTERN_LT)); /* Type */
+ FREE(temp);
+ if ((dest = HTAnchor_parent(HTAnchor_followLink(me->CurrentA)
+ )) != NULL) {
+ if (pdoctitle && !HTAnchor_title(dest))
+ HTAnchor_setTitle(dest, *pdoctitle);
+
+ /* Don't allow CHARSET attribute to change *this* document's
+ charset assumption. - kw */
+ if (dest == me->node_anchor)
+ dest = NULL;
+ if (present[HTML_LINK_CHARSET] &&
+ non_empty(value[HTML_LINK_CHARSET])) {
+ dest_char_set = UCGetLYhndl_byMIME(value[HTML_LINK_CHARSET]);
+ if (dest_char_set < 0)
+ dest_char_set = UCLYhndl_for_unrec;
+ }
+ if (dest && dest_char_set >= 0)
+ HTAnchor_setUCInfoStage(dest, dest_char_set,
+ UCT_STAGE_PARSER,
+ UCT_SETBY_LINK);
+ }
+ UPDATE_STYLE;
+ if (!HText_hasToolbar(me->text) &&
+ (ID_A = HTAnchor_findChildAndLink(me->node_anchor, /* Parent */
+ LYToolbarName, /* Tag */
+ NULL, /* Address */
+ (HTLinkType *) 0))) { /* Type */
+ HText_appendCharacter(me->text, '#');
+ HText_setLastChar(me->text, ' '); /* absorb white space */
+ HText_beginAnchor(me->text, me->inUnderline, ID_A);
+ HText_endAnchor(me->text, 0);
+ HText_setToolbar(me->text);
+ } else {
+ /*
+ * Add collapsible space to separate link from previous
+ * generated links. - kw
+ */
+ HTML_put_character(me, ' ');
+ }
+ HText_beginAnchor(me->text, me->inUnderline, me->CurrentA);
+ if (me->inBoldH == FALSE)
+ HText_appendCharacter(me->text, LY_BOLD_START_CHAR);
+#ifdef USE_COLOR_STYLE
+ if (present && present[HTML_LINK_CLASS] &&
+ non_empty(value[HTML_LINK_CLASS])) {
+ char *tmp = 0;
+ int hcode2;
+
+ HTSprintf0(&tmp, "link.%s.%s", value[HTML_LINK_CLASS], title);
+ hcode2 = color_style_1(tmp);
+ CTRACE2(TRACE_STYLE,
+ (tfp, "STYLE.link: using style <%s>\n", tmp));
+
+ HText_characterStyle(me->text, hcode2, STACK_ON);
+ HTML_put_string(me, title);
+ HTML_put_string(me, " (");
+ HTML_put_string(me, value[HTML_LINK_CLASS]);
+ HTML_put_string(me, ")");
+ HText_characterStyle(me->text, hcode2, STACK_OFF);
+ FREE(tmp);
+ } else
+#endif
+ HTML_put_string(me, title);
+ if (me->inBoldH == FALSE)
+ HText_appendCharacter(me->text, LY_BOLD_END_CHAR);
+ HText_endAnchor(me->text, 0);
+ }
+ FREE(href);
+ FREE(title);
+ break;
+
+ case HTML_ISINDEX:
+ if (((present)) &&
+ ((present[HTML_ISINDEX_HREF] && value[HTML_ISINDEX_HREF]) ||
+ (present[HTML_ISINDEX_ACTION] && value[HTML_ISINDEX_ACTION]))) {
+ /*
+ * Lynx was supporting ACTION, which never made it into the HTML
+ * 2.0 specs. HTML 3.0 uses HREF, so we'll use that too, but allow
+ * use of ACTION as an alternate until people have fully switched
+ * over. - FM
+ */
+ if (present[HTML_ISINDEX_HREF] && value[HTML_ISINDEX_HREF])
+ StrAllocCopy(href, value[HTML_ISINDEX_HREF]);
+ else
+ StrAllocCopy(href, value[HTML_ISINDEX_ACTION]);
+ LYLegitimizeHREF(me, &href, TRUE, TRUE);
+
+ Base = (me->inBASE && *href != '\0' && *href != '#')
+ ? me->base_href
+ : me->node_anchor->address;
+ HTParseALL(&href, Base);
+ HTAnchor_setIndex(me->node_anchor, href);
+ FREE(href);
+
+ } else {
+ Base = (me->inBASE) ?
+ me->base_href : me->node_anchor->address;
+ HTAnchor_setIndex(me->node_anchor, Base);
+ }
+ /*
+ * Support HTML 3.0 PROMPT attribute. - FM
+ */
+ if (present &&
+ present[HTML_ISINDEX_PROMPT] &&
+ non_empty(value[HTML_ISINDEX_PROMPT])) {
+ StrAllocCopy(temp, value[HTML_ISINDEX_PROMPT]);
+ TRANSLATE_AND_UNESCAPE_ENTITIES(&temp, TRUE, FALSE);
+ LYTrimHead(temp);
+ LYTrimTail(temp);
+ if (*temp != '\0') {
+ StrAllocCat(temp, " ");
+ HTAnchor_setPrompt(me->node_anchor, temp);
+ } else {
+ HTAnchor_setPrompt(me->node_anchor, ENTER_DATABASE_QUERY);
+ }
+ FREE(temp);
+ } else {
+ HTAnchor_setPrompt(me->node_anchor, ENTER_DATABASE_QUERY);
+ }
+ break;
+
+ case HTML_NEXTID:
+ break;
+
+ case HTML_STYLE:
+ /*
+ * We're getting it as Literal text, which, for now, we'll just ignore.
+ * - FM
+ */
+ HTChunkClear(&me->style_block);
+ break;
+
+ case HTML_SCRIPT:
+ /*
+ * We're getting it as Literal text, which, for now, we'll just ignore.
+ * - FM
+ */
+ HTChunkClear(&me->script);
+ break;
+
+ case HTML_BODY:
+ CHECK_ID(HTML_BODY_ID);
+ if (HText_hasToolbar(me->text))
+ HText_appendParagraph(me->text);
+ break;
+
+ case HTML_SECTION:
+ case HTML_ARTICLE:
+ case HTML_MAIN:
+ case HTML_ASIDE:
+ case HTML_HEADER:
+ case HTML_FOOTER:
+ case HTML_NAV:
+ CHECK_ID(HTML_GEN5_ID);
+ if (HText_hasToolbar(me->text))
+ HText_appendParagraph(me->text);
+ break;
+
+ case HTML_FIGURE:
+ CHECK_ID(HTML_GEN5_ID);
+ break;
+
+ case HTML_FRAMESET:
+ break;
+
+ case HTML_FRAME:
+ if (present && present[HTML_FRAME_NAME] &&
+ non_empty(value[HTML_FRAME_NAME])) {
+ StrAllocCopy(id_string, value[HTML_FRAME_NAME]);
+ TRANSLATE_AND_UNESCAPE_ENTITIES(&id_string, TRUE, FALSE);
+ LYTrimHead(id_string);
+ LYTrimTail(id_string);
+ }
+ if (present && present[HTML_FRAME_SRC] &&
+ non_empty(value[HTML_FRAME_SRC])) {
+ StrAllocCopy(href, value[HTML_FRAME_SRC]);
+ LYLegitimizeHREF(me, &href, TRUE, TRUE);
+
+ if (me->inA) {
+ SET_SKIP_STACK(HTML_A);
+ HTML_end_element(me, HTML_A, include);
+ }
+ me->CurrentA = HTAnchor_findChildAndLink(me->node_anchor, /* Parent */
+ NULL, /* Tag */
+ href, /* Address */
+ (HTLinkType *) 0); /* Type */
+ CAN_JUSTIFY_PUSH(FALSE);
+ LYEnsureSingleSpace(me);
+ if (me->inUnderline == FALSE)
+ HText_appendCharacter(me->text, LY_UNDERLINE_START_CHAR);
+ HTML_put_string(me, "FRAME:");
+ if (me->inUnderline == FALSE)
+ HText_appendCharacter(me->text, LY_UNDERLINE_END_CHAR);
+ HTML_put_character(me, ' ');
+
+ me->in_word = NO;
+ CHECK_ID(HTML_FRAME_ID);
+ HText_beginAnchor(me->text, me->inUnderline, me->CurrentA);
+ if (me->inBoldH == FALSE)
+ HText_appendCharacter(me->text, LY_BOLD_START_CHAR);
+ HTML_put_string(me, (id_string ? id_string : href));
+ FREE(href);
+ if (me->inBoldH == FALSE)
+ HText_appendCharacter(me->text, LY_BOLD_END_CHAR);
+ HText_endAnchor(me->text, 0);
+ LYEnsureSingleSpace(me);
+ CAN_JUSTIFY_POP;
+ } else {
+ CHECK_ID(HTML_FRAME_ID);
+ }
+ FREE(id_string);
+ break;
+
+ case HTML_NOFRAMES:
+ LYEnsureDoubleSpace(me);
+ LYResetParagraphAlignment(me);
+ break;
+
+ case HTML_IFRAME:
+ if (present && present[HTML_IFRAME_NAME] &&
+ non_empty(value[HTML_IFRAME_NAME])) {
+ StrAllocCopy(id_string, value[HTML_IFRAME_NAME]);
+ TRANSLATE_AND_UNESCAPE_ENTITIES(&id_string, TRUE, FALSE);
+ LYTrimHead(id_string);
+ LYTrimTail(id_string);
+ }
+ if (present && present[HTML_IFRAME_SRC] &&
+ non_empty(value[HTML_IFRAME_SRC])) {
+ StrAllocCopy(href, value[HTML_IFRAME_SRC]);
+ LYLegitimizeHREF(me, &href, TRUE, TRUE);
+
+ if (me->inA)
+ HTML_end_element(me, HTML_A, include);
+
+ me->CurrentA = HTAnchor_findChildAndLink(me->node_anchor, /* Parent */
+ NULL, /* Tag */
+ href, /* Address */
+ (HTLinkType *) 0); /* Type */
+ LYEnsureDoubleSpace(me);
+ CAN_JUSTIFY_PUSH_F
+ LYResetParagraphAlignment(me);
+ if (me->inUnderline == FALSE)
+ HText_appendCharacter(me->text, LY_UNDERLINE_START_CHAR);
+ HTML_put_string(me, "IFRAME:");
+ if (me->inUnderline == FALSE)
+ HText_appendCharacter(me->text, LY_UNDERLINE_END_CHAR);
+ HTML_put_character(me, ' ');
+
+ me->in_word = NO;
+ CHECK_ID(HTML_IFRAME_ID);
+ HText_beginAnchor(me->text, me->inUnderline, me->CurrentA);
+ if (me->inBoldH == FALSE)
+ HText_appendCharacter(me->text, LY_BOLD_START_CHAR);
+ HTML_put_string(me, (id_string ? id_string : href));
+ FREE(href);
+ if (me->inBoldH == FALSE)
+ HText_appendCharacter(me->text, LY_BOLD_END_CHAR);
+ HText_endAnchor(me->text, 0);
+ LYEnsureSingleSpace(me);
+ CAN_JUSTIFY_POP;
+ } else {
+ CHECK_ID(HTML_IFRAME_ID);
+ }
+ FREE(id_string);
+ break;
+
+ case HTML_BANNER:
+ case HTML_MARQUEE:
+ change_paragraph_style(me, styles[HTML_BANNER]);
+ UPDATE_STYLE;
+ if (me->sp->tag_number == (int) ElementNumber)
+ LYEnsureDoubleSpace(me);
+ /*
+ * Treat this as a toolbar if we don't have one yet, and we are in the
+ * first half of the first page. - FM
+ */
+ if ((!HText_hasToolbar(me->text) &&
+ HText_getLines(me->text) < (display_lines / 2)) &&
+ (ID_A = HTAnchor_findChildAndLink(me->node_anchor, /* Parent */
+ LYToolbarName, /* Tag */
+ NULL, /* Address */
+ (HTLinkType *) 0))) { /* Type */
+ HText_beginAnchor(me->text, me->inUnderline, ID_A);
+ HText_endAnchor(me->text, 0);
+ HText_setToolbar(me->text);
+ }
+ CHECK_ID(HTML_GEN_ID);
+ break;
+
+ case HTML_CENTER:
+ case HTML_DIV:
+ if (me->Division_Level < (MAX_NESTING - 1)) {
+ me->Division_Level++;
+ } else {
+ CTRACE((tfp,
+ "HTML: ****** Maximum nesting of %d divisions exceeded!\n",
+ MAX_NESTING));
+ }
+ if (me->inP)
+ LYEnsureSingleSpace(me); /* always at least break line - kw */
+ if (ElementNumber == HTML_CENTER) {
+ me->DivisionAlignments[me->Division_Level] = HT_CENTER;
+ change_paragraph_style(me, styles[HTML_DCENTER]);
+ UPDATE_STYLE;
+ me->current_default_alignment = styles[HTML_DCENTER]->alignment;
+ } else if (me->List_Nesting_Level >= 0 &&
+ !(present && present[HTML_DIV_ALIGN] &&
+ value[HTML_DIV_ALIGN] &&
+ (!strcasecomp(value[HTML_DIV_ALIGN], "center") ||
+ !strcasecomp(value[HTML_DIV_ALIGN], "right")))) {
+ if (present && present[HTML_DIV_ALIGN])
+ me->current_default_alignment = HT_LEFT;
+ else if (me->Division_Level == 0)
+ me->current_default_alignment = HT_LEFT;
+ else if (me->sp[0].tag_number == HTML_UL ||
+ me->sp[0].tag_number == HTML_OL ||
+ me->sp[0].tag_number == HTML_MENU ||
+ me->sp[0].tag_number == HTML_DIR ||
+ me->sp[0].tag_number == HTML_LI ||
+ me->sp[0].tag_number == HTML_LH ||
+ me->sp[0].tag_number == HTML_DD)
+ me->current_default_alignment = HT_LEFT;
+ LYHandlePlike(me, present, value, include, HTML_DIV_ALIGN, TRUE);
+ me->DivisionAlignments[me->Division_Level] = (short)
+ me->current_default_alignment;
+ } else if (present && present[HTML_DIV_ALIGN] &&
+ non_empty(value[HTML_DIV_ALIGN])) {
+ if (!strcasecomp(value[HTML_DIV_ALIGN], "center")) {
+ me->DivisionAlignments[me->Division_Level] = HT_CENTER;
+ change_paragraph_style(me, styles[HTML_DCENTER]);
+ UPDATE_STYLE;
+ me->current_default_alignment = styles[HTML_DCENTER]->alignment;
+ } else if (!strcasecomp(value[HTML_DIV_ALIGN], "right")) {
+ me->DivisionAlignments[me->Division_Level] = HT_RIGHT;
+ change_paragraph_style(me, styles[HTML_DRIGHT]);
+ UPDATE_STYLE;
+ me->current_default_alignment = styles[HTML_DRIGHT]->alignment;
+ } else {
+ me->DivisionAlignments[me->Division_Level] = HT_LEFT;
+ change_paragraph_style(me, styles[HTML_DLEFT]);
+ UPDATE_STYLE;
+ me->current_default_alignment = styles[HTML_DLEFT]->alignment;
+ }
+ } else {
+ me->DivisionAlignments[me->Division_Level] = HT_LEFT;
+ change_paragraph_style(me, styles[HTML_DLEFT]);
+ UPDATE_STYLE;
+ me->current_default_alignment = styles[HTML_DLEFT]->alignment;
+ }
+ CHECK_ID(HTML_DIV_ID);
+ break;
+
+ case HTML_H1:
+ case HTML_H2:
+ case HTML_H3:
+ case HTML_H4:
+ case HTML_H5:
+ case HTML_H6:
+ /*
+ * Close the previous style if not done by HTML doc. Added to get rid
+ * of core dumps in BAD HTML on the net.
+ * GAB 07-07-94
+ * But then again, these are actually allowed to nest. I guess I have
+ * to depend on the HTML writers correct style.
+ * GAB 07-12-94
+ if (i_prior_style != -1) {
+ HTML_end_element(me, i_prior_style);
+ }
+ i_prior_style = ElementNumber;
+ */
+
+ /*
+ * Check whether we have an H# in a list, and if so, treat it as an LH.
+ * - FM
+ */
+ if ((me->List_Nesting_Level >= 0) &&
+ (me->sp[0].tag_number == HTML_UL ||
+ me->sp[0].tag_number == HTML_OL ||
+ me->sp[0].tag_number == HTML_MENU ||
+ me->sp[0].tag_number == HTML_DIR ||
+ me->sp[0].tag_number == HTML_LI)) {
+ if (HTML_dtd.tags[HTML_LH].contents == SGML_EMPTY) {
+ ElementNumber = HTML_LH;
+ } else {
+ me->new_style = me->sp[0].style;
+ ElementNumber = (HTMLElement) me->sp[0].tag_number;
+ UPDATE_STYLE;
+ }
+ /*
+ * Some authors use H# headers as a substitute for FONT, so check
+ * if this one immediately followed an LI. If so, both me->inP and
+ * me->in_word will be FALSE (though the line might not be empty
+ * due to a bullet and/or nbsp) and we can assume it is just for a
+ * FONT change. We thus will not create another line break nor add
+ * to the current left indentation. - FM
+ */
+ if (!(me->inP == FALSE && me->in_word == NO)) {
+ HText_appendParagraph(me->text);
+ HTML_put_character(me, HT_NON_BREAK_SPACE);
+ HText_setLastChar(me->text, ' ');
+ me->in_word = NO;
+ me->inP = FALSE;
+ }
+ CHECK_ID(HTML_H_ID);
+ break;
+ }
+
+ if (present && present[HTML_H_ALIGN] &&
+ non_empty(value[HTML_H_ALIGN])) {
+ if (!strcasecomp(value[HTML_H_ALIGN], "center"))
+ change_paragraph_style(me, styles[HTML_HCENTER]);
+ else if (!strcasecomp(value[HTML_H_ALIGN], "right"))
+ change_paragraph_style(me, styles[HTML_HRIGHT]);
+ else if (!strcasecomp(value[HTML_H_ALIGN], "left") ||
+ !strcasecomp(value[HTML_H_ALIGN], "justify"))
+ change_paragraph_style(me, styles[HTML_HLEFT]);
+ else
+ change_paragraph_style(me, styles[ElementNumber]);
+ } else if (me->Division_Level >= 0) {
+ if (me->DivisionAlignments[me->Division_Level] == HT_CENTER) {
+ change_paragraph_style(me, styles[HTML_HCENTER]);
+ } else if (me->DivisionAlignments[me->Division_Level] == HT_LEFT) {
+ change_paragraph_style(me, styles[HTML_HLEFT]);
+ } else if (me->DivisionAlignments[me->Division_Level] == HT_RIGHT) {
+ change_paragraph_style(me, styles[HTML_HRIGHT]);
+ }
+ } else {
+ change_paragraph_style(me, styles[ElementNumber]);
+ }
+ UPDATE_STYLE;
+ CHECK_ID(HTML_H_ID);
+
+ if ((bold_headers == TRUE ||
+ (ElementNumber == HTML_H1 && bold_H1 == TRUE)) &&
+ (styles[ElementNumber]->font & HT_BOLD)) {
+ if (me->inBoldA == FALSE && me->inBoldH == FALSE) {
+ HText_appendCharacter(me->text, LY_BOLD_START_CHAR);
+ }
+ me->inBoldH = TRUE;
+ }
+ break;
+
+ case HTML_P:
+ LYHandlePlike(me, present, value, include, HTML_P_ALIGN, TRUE);
+ CHECK_ID(HTML_P_ID);
+ break;
+
+ case HTML_BR:
+ UPDATE_STYLE;
+ CHECK_ID(HTML_GEN_ID);
+ /* Add a \r (new line) if these conditions are true:
+ * * We are not collapsing BR's (and either we are not trimming
+ * blank lines, or the preceding line is non-empty), or
+ * * The current line has text on it.
+ * Otherwise, don't do anything. -DH 19980814, TD 19980827/20170704
+ */
+ if ((LYCollapseBRs == FALSE &&
+ (!LYtrimBlankLines ||
+ !HText_PreviousLineEmpty(me->text, FALSE))) ||
+ !HText_LastLineEmpty(me->text, FALSE)) {
+ HText_setLastChar(me->text, ' '); /* absorb white space */
+ HText_appendCharacter(me->text, '\r');
+ }
+ me->in_word = NO;
+ me->inP = FALSE;
+ break;
+
+ case HTML_WBR:
+ UPDATE_STYLE;
+ CHECK_ID(HTML_GEN_ID);
+ HText_setBreakPoint(me->text);
+ break;
+
+ case HTML_HY:
+ case HTML_SHY:
+ UPDATE_STYLE;
+ CHECK_ID(HTML_GEN_ID);
+ HText_appendCharacter(me->text, LY_SOFT_HYPHEN);
+ break;
+
+ case HTML_HR:
+ {
+ int width;
+
+ /*
+ * Start a new line only if we had printable characters following
+ * the previous newline, or remove the previous line if both it and
+ * the last line are blank. - FM
+ */
+ UPDATE_STYLE;
+ if (!HText_LastLineEmpty(me->text, FALSE)) {
+ HText_setLastChar(me->text, ' '); /* absorb white space */
+ HText_appendCharacter(me->text, '\r');
+ } else if (HText_PreviousLineEmpty(me->text, FALSE)) {
+ HText_RemovePreviousLine(me->text);
+ }
+ me->in_word = NO;
+ me->inP = FALSE;
+
+ /*
+ * Add an ID link if needed. - FM
+ */
+ CHECK_ID(HTML_HR_ID);
+
+ /*
+ * Center lines within the current margins, if a right or left
+ * ALIGNment is not specified. If WIDTH="#%" is given and not
+ * garbage, use that to calculate the width, otherwise use the
+ * default width. - FM
+ */
+ if (present && present[HTML_HR_ALIGN] && value[HTML_HR_ALIGN]) {
+ if (!strcasecomp(value[HTML_HR_ALIGN], "right")) {
+ me->sp->style->alignment = HT_RIGHT;
+ } else if (!strcasecomp(value[HTML_HR_ALIGN], "left")) {
+ me->sp->style->alignment = HT_LEFT;
+ } else {
+ me->sp->style->alignment = HT_CENTER;
+ }
+ } else {
+ me->sp->style->alignment = HT_CENTER;
+ }
+ width = LYcolLimit -
+ me->new_style->leftIndent - me->new_style->rightIndent;
+ if (present && present[HTML_HR_WIDTH] && value[HTML_HR_WIDTH] &&
+ isdigit(UCH(*value[HTML_HR_WIDTH])) &&
+ value[HTML_HR_WIDTH][strlen(value[HTML_HR_WIDTH]) - 1] == '%') {
+ char *percent = NULL;
+ int Percent, Width;
+
+ StrAllocCopy(percent, value[HTML_HR_WIDTH]);
+ percent[strlen(percent) - 1] = '\0';
+ Percent = atoi(percent);
+ if (Percent > 100 || Percent < 1)
+ width -= 5;
+ else {
+ Width = (width * Percent) / 100;
+ if (Width < 1)
+ width = 1;
+ else
+ width = Width;
+ }
+ FREE(percent);
+ } else {
+ width -= 5;
+ }
+ for (i = 0; i < width; i++)
+ HTML_put_character(me, '_');
+ HText_appendCharacter(me->text, '\r');
+ me->in_word = NO;
+ me->inP = FALSE;
+
+ /*
+ * Reset the alignment appropriately for the division and/or block.
+ * - FM
+ */
+ if (me->List_Nesting_Level < 0 &&
+ me->Division_Level >= 0) {
+ me->sp->style->alignment =
+ me->DivisionAlignments[me->Division_Level];
+ } else if (me->sp->style->id == ST_HeadingCenter ||
+ me->sp->style->id == ST_Heading1) {
+ me->sp->style->alignment = HT_CENTER;
+ } else if (me->sp->style->id == ST_HeadingRight) {
+ me->sp->style->alignment = HT_RIGHT;
+ } else {
+ me->sp->style->alignment = HT_LEFT;
+ }
+
+ /*
+ * Add a blank line and set the second line indentation for lists
+ * and addresses, or a paragraph separator for other blocks. - FM
+ */
+ if (me->List_Nesting_Level >= 0 ||
+ me->sp[0].tag_number == HTML_ADDRESS) {
+ HText_setLastChar(me->text, ' '); /* absorb white space */
+ HText_appendCharacter(me->text, '\r');
+ } else {
+ HText_appendParagraph(me->text);
+ }
+ }
+ break;
+
+ case HTML_TAB:
+ if (!present) { /* Bad tag. Must have at least one attribute. - FM */
+ CTRACE((tfp, "HTML: TAB tag has no attributes. Ignored.\n"));
+ break;
+ }
+ /*
+ * If page author is using TAB within a TABLE, it's probably formatted
+ * specifically to work well for Lynx without simple table tracking
+ * code. Cancel tracking, it would only make things worse. - kw
+ */
+ HText_cancelStbl(me->text);
+ UPDATE_STYLE;
+
+ CANT_JUSTIFY_THIS_LINE;
+ if (present[HTML_TAB_ALIGN] && value[HTML_TAB_ALIGN] &&
+ (strcasecomp(value[HTML_TAB_ALIGN], "left") ||
+ !(present[HTML_TAB_TO] || present[HTML_TAB_INDENT]))) {
+ /*
+ * Just ensure a collapsible space, until we have the ALIGN and DP
+ * attributes implemented. - FM
+ */
+ HTML_put_character(me, ' ');
+ CTRACE((tfp,
+ "HTML: ALIGN not 'left'. Using space instead of TAB.\n"));
+
+ } else if (!LYoverride_default_alignment(me) &&
+ me->current_default_alignment != HT_LEFT) {
+ /*
+ * Just ensure a collapsible space, until we can replace
+ * HText_getCurrentColumn() in GridText.c with code which doesn't
+ * require that the alignment be HT_LEFT. - FM
+ */
+ HTML_put_character(me, ' ');
+ CTRACE((tfp, "HTML: Not HT_LEFT. Using space instead of TAB.\n"));
+
+ } else if ((present[HTML_TAB_TO] &&
+ non_empty(value[HTML_TAB_TO])) ||
+ (present[HTML_TAB_INDENT] &&
+ value[HTML_TAB_INDENT] &&
+ isdigit(UCH(*value[HTML_TAB_INDENT])))) {
+ int column, target = -1;
+ int enval = 2;
+
+ column = HText_getCurrentColumn(me->text);
+ if (present[HTML_TAB_TO] &&
+ non_empty(value[HTML_TAB_TO])) {
+ /*
+ * TO has priority over INDENT if both are present. - FM
+ */
+ StrAllocCopy(temp, value[HTML_TAB_TO]);
+ TRANSLATE_AND_UNESCAPE_TO_STD(&temp);
+ if (*temp) {
+ target = HText_getTabIDColumn(me->text, temp);
+ }
+ } else if (isEmpty(temp) && present[HTML_TAB_INDENT] &&
+ value[HTML_TAB_INDENT] &&
+ isdigit(UCH(*value[HTML_TAB_INDENT]))) {
+ /*
+ * The INDENT value is in "en" (enval per column) units.
+ * Divide it by enval, rounding odd values up. - FM
+ */
+ target =
+ (int) (((1.0 * atoi(value[HTML_TAB_INDENT])) / enval) + (0.5));
+ }
+ FREE(temp);
+ /*
+ * If we are being directed to a column too far to the left or
+ * right, just add a collapsible space, otherwise, add the
+ * appropriate number of spaces. - FM
+ */
+
+ if (target < column ||
+ target > HText_getMaximumColumn(me->text)) {
+ HTML_put_character(me, ' ');
+ CTRACE((tfp,
+ "HTML: Column out of bounds. Using space instead of TAB.\n"));
+ } else {
+ for (i = column; i < target; i++)
+ HText_appendCharacter(me->text, ' ');
+ HText_setLastChar(me->text, ' '); /* absorb white space */
+ }
+ }
+ me->in_word = NO;
+
+ /*
+ * If we have an ID attribute, save it together with the value of the
+ * column we've reached. - FM
+ */
+ if (present[HTML_TAB_ID] &&
+ non_empty(value[HTML_TAB_ID])) {
+ StrAllocCopy(temp, value[HTML_TAB_ID]);
+ TRANSLATE_AND_UNESCAPE_TO_STD(&temp);
+ if (*temp)
+ HText_setTabID(me->text, temp);
+ FREE(temp);
+ }
+ break;
+
+ case HTML_BASEFONT:
+ break;
+
+ case HTML_FONT:
+
+ /*
+ * FONT *may* have been declared SGML_EMPTY in HTMLDTD.c, and
+ * SGML_character() in SGML.c *may* check for a FONT end tag to call
+ * HTML_end_element() directly (with a check in that to bypass
+ * decrementing of the HTML parser's stack). Or this may have been
+ * really a </FONT> end tag, for which some incarnations of SGML.c
+ * would fake a <FONT> start tag instead. - fm & kw
+ *
+ * But if we have an open FONT, DON'T close that one now, since FONT
+ * tags can be legally nested AFAIK, and Lynx currently doesn't do
+ * anything with them anyway... - kw
+ */
+#ifdef NOTUSED_FOTEMODS
+ if (me->inFONT == TRUE)
+ HTML_end_element(me, HTML_FONT, &include);
+#endif /* NOTUSED_FOTEMODS */
+
+ /*
+ * Set flag to know we are in a FONT container, and add code to do
+ * something about it, someday. - FM
+ */
+ me->inFONT = TRUE;
+ break;
+
+ case HTML_B: /* Physical character highlighting */
+ case HTML_BLINK:
+ case HTML_I:
+ case HTML_U:
+
+ case HTML_CITE: /* Logical character highlighting */
+ case HTML_EM:
+ case HTML_STRONG:
+ UPDATE_STYLE;
+ me->Underline_Level++;
+ CHECK_ID(HTML_GEN_ID);
+ /*
+ * Ignore this if inside of a bold anchor or header. Can't display
+ * both underline and bold at same time.
+ */
+ if (me->inBoldA == TRUE || me->inBoldH == TRUE) {
+ CTRACE((tfp, "Underline Level is %d\n", me->Underline_Level));
+ break;
+ }
+ if (me->inUnderline == FALSE) {
+ HText_appendCharacter(me->text, LY_UNDERLINE_START_CHAR);
+ me->inUnderline = TRUE;
+ CTRACE((tfp, "Beginning underline\n"));
+ } else {
+ CTRACE((tfp, "Underline Level is %d\n", me->Underline_Level));
+ }
+ break;
+
+ case HTML_ABBR: /* Miscellaneous character containers */
+ case HTML_ACRONYM:
+ case HTML_AU:
+ case HTML_AUTHOR:
+ case HTML_BIG:
+ case HTML_CODE:
+ case HTML_DFN:
+ case HTML_KBD:
+ case HTML_SAMP:
+ case HTML_SMALL:
+ case HTML_TT:
+ case HTML_VAR:
+ CHECK_ID(HTML_GEN_ID);
+ break; /* ignore */
+
+ case HTML_SUP:
+ HText_appendCharacter(me->text, '^');
+ CHECK_ID(HTML_GEN_ID);
+ break;
+
+ case HTML_SUB:
+ HText_appendCharacter(me->text, '[');
+ CHECK_ID(HTML_GEN_ID);
+ break;
+
+ case HTML_DEL_2:
+ case HTML_DEL:
+ case HTML_S:
+ case HTML_STRIKE:
+ CHECK_ID(HTML_GEN_ID);
+ if (me->inUnderline == FALSE)
+ HText_appendCharacter(me->text, LY_UNDERLINE_START_CHAR);
+ HTML_put_string(me, "[DEL:");
+ if (me->inUnderline == FALSE)
+ HText_appendCharacter(me->text, LY_UNDERLINE_END_CHAR);
+ HTML_put_character(me, ' ');
+ me->in_word = NO;
+ break;
+
+ case HTML_INS_2:
+ case HTML_INS:
+ CHECK_ID(HTML_GEN_ID);
+ if (me->inUnderline == FALSE)
+ HText_appendCharacter(me->text, LY_UNDERLINE_START_CHAR);
+ HTML_put_string(me, "[INS:");
+ if (me->inUnderline == FALSE)
+ HText_appendCharacter(me->text, LY_UNDERLINE_END_CHAR);
+ HTML_put_character(me, ' ');
+ me->in_word = NO;
+ break;
+
+ case HTML_Q:
+ CHECK_ID(HTML_GEN_ID);
+ /*
+ * Should check LANG and/or DIR attributes, and the
+ * me->node_anchor->charset and/or yet to be added structure elements,
+ * to determine whether we should use chevrons, but for now we'll
+ * always use double- or single-quotes. - FM
+ */
+ if (!(me->Quote_Level & 1))
+ HTML_put_character(me, '"');
+ else
+ HTML_put_character(me, '`');
+ me->Quote_Level++;
+ break;
+
+ case HTML_PRE: /* Formatted text */
+ /*
+ * Set our inPRE flag to FALSE so that a newline immediately following
+ * the PRE start tag will be ignored. HTML_put_character() will set it
+ * to TRUE when the first character within the PRE block is received.
+ * - FM
+ */
+ me->inPRE = FALSE;
+ /* FALLTHRU */
+ case HTML_LISTING: /* Literal text */
+ /* FALLTHRU */
+ case HTML_XMP:
+ /* FALLTHRU */
+ case HTML_PLAINTEXT:
+ change_paragraph_style(me, styles[ElementNumber]);
+ UPDATE_STYLE;
+ CHECK_ID(HTML_GEN_ID);
+ if (me->comment_end)
+ HText_appendText(me->text, me->comment_end);
+ break;
+
+ case HTML_BLOCKQUOTE:
+ case HTML_BQ:
+ change_paragraph_style(me, styles[ElementNumber]);
+ UPDATE_STYLE;
+ if (me->sp->tag_number == (int) ElementNumber)
+ LYEnsureDoubleSpace(me);
+ CHECK_ID(HTML_BQ_ID);
+ break;
+
+ case HTML_NOTE:
+ change_paragraph_style(me, styles[ElementNumber]);
+ UPDATE_STYLE;
+ if (me->sp->tag_number == (int) ElementNumber)
+ LYEnsureDoubleSpace(me);
+ CHECK_ID(HTML_NOTE_ID);
+ {
+ char *note = NULL;
+
+ /*
+ * Indicate the type of NOTE.
+ */
+ if (present && present[HTML_NOTE_CLASS] &&
+ value[HTML_NOTE_CLASS] &&
+ (!strcasecomp(value[HTML_NOTE_CLASS], "CAUTION") ||
+ !strcasecomp(value[HTML_NOTE_CLASS], "WARNING"))) {
+ StrAllocCopy(note, value[HTML_NOTE_CLASS]);
+ LYUpperCase(note);
+ StrAllocCat(note, ":");
+ } else if (present && present[HTML_NOTE_ROLE] &&
+ value[HTML_NOTE_ROLE] &&
+ (!strcasecomp(value[HTML_NOTE_ROLE], "CAUTION") ||
+ !strcasecomp(value[HTML_NOTE_ROLE], "WARNING"))) {
+ StrAllocCopy(note, value[HTML_NOTE_ROLE]);
+ LYUpperCase(note);
+ StrAllocCat(note, ":");
+ } else {
+ StrAllocCopy(note, "NOTE:");
+ }
+ if (me->inUnderline == FALSE)
+ HText_appendCharacter(me->text, LY_UNDERLINE_START_CHAR);
+ HTML_put_string(me, note);
+ if (me->inUnderline == FALSE)
+ HText_appendCharacter(me->text, LY_UNDERLINE_END_CHAR);
+ HTML_put_character(me, ' ');
+ CAN_JUSTIFY_START;
+ FREE(note);
+ }
+ CAN_JUSTIFY_START;
+ me->inLABEL = TRUE;
+ me->in_word = NO;
+ me->inP = FALSE;
+ break;
+
+ case HTML_ADDRESS:
+ if (me->List_Nesting_Level < 0) {
+ change_paragraph_style(me, styles[ElementNumber]);
+ UPDATE_STYLE;
+ if (me->sp->tag_number == (int) ElementNumber)
+ LYEnsureDoubleSpace(me);
+ } else {
+ LYHandlePlike(me, present, value, include, -1, TRUE);
+ }
+ CHECK_ID(HTML_ADDRESS_ID);
+ break;
+
+ case HTML_DL:
+ me->List_Nesting_Level++; /* increment the List nesting level */
+ if (me->List_Nesting_Level <= 0) {
+ change_paragraph_style(me, present && present[HTML_DL_COMPACT]
+ ? styles[HTML_DLC] : styles[HTML_DL]);
+
+ } else if (me->List_Nesting_Level >= 6) {
+ change_paragraph_style(me, present && present[HTML_DL_COMPACT]
+ ? styles[HTML_DLC6] : styles[HTML_DL6]);
+
+ } else {
+ change_paragraph_style(me, present && present[HTML_DL_COMPACT]
+ ? styles[(HTML_DLC1 - 1) + me->List_Nesting_Level]
+ : styles[(HTML_DL1 - 1) + me->List_Nesting_Level]);
+ }
+ UPDATE_STYLE; /* update to the new style */
+ CHECK_ID(HTML_DL_ID);
+
+ break;
+
+ case HTML_DLC:
+ me->List_Nesting_Level++; /* increment the List nesting level */
+ if (me->List_Nesting_Level <= 0) {
+ change_paragraph_style(me, styles[HTML_DLC]);
+
+ } else if (me->List_Nesting_Level >= 6) {
+ change_paragraph_style(me, styles[HTML_DLC6]);
+
+ } else {
+ change_paragraph_style(me,
+ styles[(HTML_DLC1 - 1) + me->List_Nesting_Level]);
+ }
+ UPDATE_STYLE; /* update to the new style */
+ CHECK_ID(HTML_DL_ID);
+ break;
+
+ case HTML_DT:
+ CHECK_ID(HTML_GEN_ID);
+ if (!me->style_change) {
+ BOOL in_line_1 = HText_inLineOne(me->text);
+ HTCoord saved_spaceBefore = me->sp->style->spaceBefore;
+ HTCoord saved_spaceAfter = me->sp->style->spaceAfter;
+
+ /*
+ * If there are several DT elements and this is not the first, and
+ * the preceding DT element's first (and normally only) line has
+ * not yet been ended, suppress intervening blank line by
+ * temporarily modifying the paragraph style in place. Ugly but
+ * there's ample precedence. - kw
+ */
+ if (in_line_1) {
+ me->sp->style->spaceBefore = 0; /* temporary change */
+ me->sp->style->spaceAfter = 0; /* temporary change */
+ }
+ HText_appendParagraph(me->text);
+ me->sp->style->spaceBefore = saved_spaceBefore; /* undo */
+ me->sp->style->spaceAfter = saved_spaceAfter; /* undo */
+ me->in_word = NO;
+ me->sp->style->alignment = HT_LEFT;
+ }
+ me->inP = FALSE;
+ break;
+
+ case HTML_DD:
+ CHECK_ID(HTML_GEN_ID);
+ HText_setLastChar(me->text, ' '); /* absorb white space */
+ if (!me->style_change) {
+ if (!HText_LastLineEmpty(me->text, FALSE)) {
+ HText_appendCharacter(me->text, '\r');
+ } else {
+ HText_NegateLineOne(me->text);
+ }
+ } else {
+ UPDATE_STYLE;
+ HText_appendCharacter(me->text, '\t');
+ }
+ me->sp->style->alignment = HT_LEFT;
+ me->in_word = NO;
+ me->inP = FALSE;
+ break;
+
+ case HTML_OL:
+ /*
+ * Set the default TYPE.
+ */
+ me->OL_Type[(me->List_Nesting_Level < 11 ?
+ me->List_Nesting_Level + 1 : 11)] = '1';
+
+ /*
+ * Check whether we have a starting sequence number, or want to
+ * continue the numbering from a previous OL in this nest. - FM
+ */
+ if (present && (present[HTML_OL_SEQNUM] || present[HTML_OL_START])) {
+ int seqnum;
+
+ /*
+ * Give preference to the valid HTML 3.0 SEQNUM attribute name over
+ * the Netscape START attribute name (too bad the Netscape
+ * developers didn't read the HTML 3.0 specs before re-inventing
+ * the "wheel" as "we'll"). - FM
+ */
+ if (present[HTML_OL_SEQNUM] &&
+ non_empty(value[HTML_OL_SEQNUM])) {
+ seqnum = atoi(value[HTML_OL_SEQNUM]);
+ } else if (present[HTML_OL_START] &&
+ non_empty(value[HTML_OL_START])) {
+ seqnum = atoi(value[HTML_OL_START]);
+ } else {
+ seqnum = 1;
+ }
+
+ /*
+ * Don't allow negative numbers less than or equal to our flags, or
+ * numbers less than 1 if an Alphabetic or Roman TYPE. - FM
+ */
+ if (present[HTML_OL_TYPE] && value[HTML_OL_TYPE]) {
+ if (*value[HTML_OL_TYPE] == 'A') {
+ me->OL_Type[(me->List_Nesting_Level < 11 ?
+ me->List_Nesting_Level + 1 : 11)] = 'A';
+ if (seqnum < 1)
+ seqnum = 1;
+ } else if (*value[HTML_OL_TYPE] == 'a') {
+ me->OL_Type[(me->List_Nesting_Level < 11 ?
+ me->List_Nesting_Level + 1 : 11)] = 'a';
+ if (seqnum < 1)
+ seqnum = 1;
+ } else if (*value[HTML_OL_TYPE] == 'I') {
+ me->OL_Type[(me->List_Nesting_Level < 11 ?
+ me->List_Nesting_Level + 1 : 11)] = 'I';
+ if (seqnum < 1)
+ seqnum = 1;
+ } else if (*value[HTML_OL_TYPE] == 'i') {
+ me->OL_Type[(me->List_Nesting_Level < 11 ?
+ me->List_Nesting_Level + 1 : 11)] = 'i';
+ if (seqnum < 1)
+ seqnum = 1;
+ } else {
+ if (seqnum <= OL_VOID)
+ seqnum = OL_VOID + 1;
+ }
+ } else if (seqnum <= OL_VOID) {
+ seqnum = OL_VOID + 1;
+ }
+
+ me->OL_Counter[(me->List_Nesting_Level < 11 ?
+ me->List_Nesting_Level + 1 : 11)] = seqnum;
+
+ } else if (present && present[HTML_OL_CONTINUE]) {
+ me->OL_Counter[me->List_Nesting_Level < 11 ?
+ me->List_Nesting_Level + 1 : 11] = OL_CONTINUE;
+
+ } else {
+ me->OL_Counter[(me->List_Nesting_Level < 11 ?
+ me->List_Nesting_Level + 1 : 11)] = 1;
+ if (present && present[HTML_OL_TYPE] && value[HTML_OL_TYPE]) {
+ if (*value[HTML_OL_TYPE] == 'A') {
+ me->OL_Type[(me->List_Nesting_Level < 11 ?
+ me->List_Nesting_Level + 1 : 11)] = 'A';
+ } else if (*value[HTML_OL_TYPE] == 'a') {
+ me->OL_Type[(me->List_Nesting_Level < 11 ?
+ me->List_Nesting_Level + 1 : 11)] = 'a';
+ } else if (*value[HTML_OL_TYPE] == 'I') {
+ me->OL_Type[(me->List_Nesting_Level < 11 ?
+ me->List_Nesting_Level + 1 : 11)] = 'I';
+ } else if (*value[HTML_OL_TYPE] == 'i') {
+ me->OL_Type[(me->List_Nesting_Level < 11 ?
+ me->List_Nesting_Level + 1 : 11)] = 'i';
+ }
+ }
+ }
+ me->List_Nesting_Level++;
+
+ if (me->List_Nesting_Level <= 0) {
+ change_paragraph_style(me, styles[ElementNumber]);
+
+ } else if (me->List_Nesting_Level >= 6) {
+ change_paragraph_style(me, styles[HTML_OL6]);
+
+ } else {
+ change_paragraph_style(me,
+ styles[HTML_OL1 + me->List_Nesting_Level - 1]);
+ }
+ UPDATE_STYLE; /* update to the new style */
+ CHECK_ID(HTML_OL_ID);
+ break;
+
+ case HTML_UL:
+ me->List_Nesting_Level++;
+
+ if (me->List_Nesting_Level <= 0) {
+ if (!(present && present[HTML_UL_PLAIN]) &&
+ !(present && present[HTML_UL_TYPE] &&
+ value[HTML_UL_TYPE] &&
+ 0 == strcasecomp(value[HTML_UL_TYPE], "PLAIN"))) {
+ change_paragraph_style(me, styles[ElementNumber]);
+ } else {
+ change_paragraph_style(me, styles[HTML_DIR]);
+ ElementNumber = HTML_DIR;
+ }
+
+ } else if (me->List_Nesting_Level >= 6) {
+ if (!(present && present[HTML_UL_PLAIN]) &&
+ !(present && present[HTML_UL_TYPE] &&
+ value[HTML_UL_TYPE] &&
+ 0 == strcasecomp(value[HTML_UL_TYPE], "PLAIN"))) {
+ change_paragraph_style(me, styles[HTML_OL6]);
+ } else {
+ change_paragraph_style(me, styles[HTML_MENU6]);
+ ElementNumber = HTML_DIR;
+ }
+
+ } else {
+ if (!(present && present[HTML_UL_PLAIN]) &&
+ !(present && present[HTML_UL_TYPE] &&
+ value[HTML_UL_TYPE] &&
+ 0 == strcasecomp(value[HTML_UL_TYPE], "PLAIN"))) {
+ change_paragraph_style(me,
+ styles[HTML_OL1 + me->List_Nesting_Level
+ - 1]);
+ } else {
+ change_paragraph_style(me,
+ styles[HTML_MENU1 + me->List_Nesting_Level
+ - 1]);
+ ElementNumber = HTML_DIR;
+ }
+ }
+ UPDATE_STYLE; /* update to the new style */
+ CHECK_ID(HTML_UL_ID);
+ break;
+
+ case HTML_MENU:
+ case HTML_DIR:
+ me->List_Nesting_Level++;
+
+ if (me->List_Nesting_Level <= 0) {
+ change_paragraph_style(me, styles[ElementNumber]);
+
+ } else if (me->List_Nesting_Level >= 6) {
+ change_paragraph_style(me, styles[HTML_MENU6]);
+
+ } else {
+ change_paragraph_style(me,
+ styles[HTML_MENU1 + me->List_Nesting_Level
+ - 1]);
+ }
+ UPDATE_STYLE; /* update to the new style */
+ CHECK_ID(HTML_UL_ID);
+ break;
+
+ case HTML_LH:
+ UPDATE_STYLE; /* update to the new style */
+ HText_appendParagraph(me->text);
+ CHECK_ID(HTML_GEN_ID);
+ HTML_put_character(me, HT_NON_BREAK_SPACE);
+ HText_setLastChar(me->text, ' ');
+ me->in_word = NO;
+ me->inP = FALSE;
+ break;
+
+ case HTML_LI:
+ UPDATE_STYLE; /* update to the new style */
+ HText_appendParagraph(me->text);
+ me->sp->style->alignment = HT_LEFT;
+ CHECK_ID(HTML_LI_ID);
+ {
+ int surrounding_tag_number = me->sp[0].tag_number;
+
+ /*
+ * No, a LI should never occur directly within another LI, but this
+ * may result from incomplete error recovery. So check one more
+ * surrounding level in this case. - kw
+ */
+ if (surrounding_tag_number == HTML_LI &&
+ me->sp < (me->stack + MAX_NESTING - 1))
+ surrounding_tag_number = me->sp[1].tag_number;
+ if (surrounding_tag_number == HTML_OL) {
+ char number_string[20];
+ int counter, seqnum;
+ char seqtype;
+
+ counter = me->List_Nesting_Level < 11 ?
+ me->List_Nesting_Level : 11;
+ if (present && present[HTML_LI_TYPE] && value[HTML_LI_TYPE]) {
+ if (*value[HTML_LI_TYPE] == '1') {
+ me->OL_Type[counter] = '1';
+ } else if (*value[HTML_LI_TYPE] == 'A') {
+ me->OL_Type[counter] = 'A';
+ } else if (*value[HTML_LI_TYPE] == 'a') {
+ me->OL_Type[counter] = 'a';
+ } else if (*value[HTML_LI_TYPE] == 'I') {
+ me->OL_Type[counter] = 'I';
+ } else if (*value[HTML_LI_TYPE] == 'i') {
+ me->OL_Type[counter] = 'i';
+ }
+ }
+ if (present && present[HTML_LI_VALUE] &&
+ ((value[HTML_LI_VALUE] != NULL) &&
+ (*value[HTML_LI_VALUE] != '\0')) &&
+ ((isdigit(UCH(*value[HTML_LI_VALUE]))) ||
+ (*value[HTML_LI_VALUE] == '-' &&
+ isdigit(UCH(*(value[HTML_LI_VALUE] + 1)))))) {
+ seqnum = atoi(value[HTML_LI_VALUE]);
+ if (seqnum <= OL_VOID)
+ seqnum = OL_VOID + 1;
+ seqtype = me->OL_Type[counter];
+ if (seqtype != '1' && seqnum < 1)
+ seqnum = 1;
+ me->OL_Counter[counter] = seqnum + 1;
+ } else if (me->OL_Counter[counter] >= OL_VOID) {
+ seqnum = me->OL_Counter[counter]++;
+ seqtype = me->OL_Type[counter];
+ if (seqtype != '1' && seqnum < 1) {
+ seqnum = 1;
+ me->OL_Counter[counter] = seqnum + 1;
+ }
+ } else {
+ seqnum = me->Last_OL_Count + 1;
+ seqtype = me->Last_OL_Type;
+ for (i = (counter - 1); i >= 0; i--) {
+ if (me->OL_Counter[i] > OL_VOID) {
+ seqnum = me->OL_Counter[i]++;
+ seqtype = me->OL_Type[i];
+ i = 0;
+ }
+ }
+ }
+ if (seqtype == 'A') {
+ strcpy(number_string, LYUppercaseA_OL_String(seqnum));
+ } else if (seqtype == 'a') {
+ strcpy(number_string, LYLowercaseA_OL_String(seqnum));
+ } else if (seqtype == 'I') {
+ strcpy(number_string, LYUppercaseI_OL_String(seqnum));
+ } else if (seqtype == 'i') {
+ strcpy(number_string, LYLowercaseI_OL_String(seqnum));
+ } else {
+ sprintf(number_string, "%2d.", seqnum);
+ }
+ me->Last_OL_Count = seqnum;
+ me->Last_OL_Type = seqtype;
+ /*
+ * Hack, because there is no append string!
+ */
+ for (i = 0; number_string[i] != '\0'; i++)
+ if (number_string[i] == ' ')
+ HTML_put_character(me, HT_NON_BREAK_SPACE);
+ else
+ HTML_put_character(me, number_string[i]);
+
+ /*
+ * Use HTML_put_character so that any other spaces coming
+ * through will be collapsed. We'll use nbsp, so it won't
+ * break at the spacing character if there are no spaces in the
+ * subsequent text up to the right margin, but will declare it
+ * as a normal space to ensure collapsing if a normal space
+ * does immediately follow it. - FM
+ */
+ HTML_put_character(me, HT_NON_BREAK_SPACE);
+ HText_setLastChar(me->text, ' ');
+ } else if (surrounding_tag_number == HTML_UL) {
+ /*
+ * Hack, because there is no append string!
+ */
+ HTML_put_character(me, HT_NON_BREAK_SPACE);
+ HTML_put_character(me, HT_NON_BREAK_SPACE);
+ switch (me->List_Nesting_Level % 7) {
+ case 0:
+ HTML_put_character(me, '*');
+ break;
+ case 1:
+ HTML_put_character(me, '+');
+ break;
+ case 2:
+ HTML_put_character(me, 'o');
+ break;
+ case 3:
+ HTML_put_character(me, '#');
+ break;
+ case 4:
+ HTML_put_character(me, '@');
+ break;
+ case 5:
+ HTML_put_character(me, '-');
+ break;
+ case 6:
+ HTML_put_character(me, '=');
+ break;
+
+ }
+ /*
+ * Keep using HTML_put_character so that any other spaces
+ * coming through will be collapsed. We use nbsp, so we won't
+ * wrap at the spacing character if there are no spaces in the
+ * subsequent text up to the right margin, but will declare it
+ * as a normal space to ensure collapsing if a normal space
+ * does immediately follow it. - FM
+ */
+ HTML_put_character(me, HT_NON_BREAK_SPACE);
+ HText_setLastChar(me->text, ' ');
+ } else {
+ /*
+ * Hack, because there is no append string!
+ */
+ HTML_put_character(me, HT_NON_BREAK_SPACE);
+ HTML_put_character(me, HT_NON_BREAK_SPACE);
+ HText_setLastChar(me->text, ' ');
+ }
+ }
+ CAN_JUSTIFY_START;
+ me->in_word = NO;
+ me->inP = FALSE;
+ break;
+
+ case HTML_SPAN:
+ CHECK_ID(HTML_GEN_ID);
+ /*
+ * Should check LANG and/or DIR attributes, and the
+ * me->node_anchor->charset and/or yet to be added structure elements,
+ * and do something here. - FM
+ */
+ break;
+
+ case HTML_BDO:
+ CHECK_ID(HTML_GEN_ID);
+ /*
+ * Should check DIR (and LANG) attributes, and the
+ * me->node_anchor->charset and/or yet to be added structure elements,
+ * and do something here. - FM
+ */
+ break;
+
+ case HTML_SPOT:
+ CHECK_ID(HTML_GEN_ID);
+ break;
+
+ case HTML_FN:
+ change_paragraph_style(me, styles[ElementNumber]);
+ UPDATE_STYLE;
+ if (me->sp->tag_number == (int) ElementNumber)
+ LYEnsureDoubleSpace(me);
+ CHECK_ID(HTML_GEN_ID);
+ if (me->inUnderline == FALSE)
+ HText_appendCharacter(me->text, LY_UNDERLINE_START_CHAR);
+ HTML_put_string(me, "FOOTNOTE:");
+ if (me->inUnderline == FALSE)
+ HText_appendCharacter(me->text, LY_UNDERLINE_END_CHAR);
+ HTML_put_character(me, ' ');
+ CAN_JUSTIFY_START
+ me->inLABEL = TRUE;
+ me->in_word = NO;
+ me->inP = FALSE;
+ break;
+
+ case HTML_A:
+ /*
+ * If we are looking for client-side image maps, then handle an A
+ * within a MAP that has a COORDS attribute as an AREA tag.
+ * Unfortunately we lose the anchor text this way for the LYNXIMGMAP,
+ * we would have to do much more parsing to collect it. After
+ * potentially handling the A as AREA, always return immediately if
+ * only looking for image maps, without pushing anything on the style
+ * stack. - kw
+ */
+ if (me->map_address && present && present[HTML_A_COORDS])
+ LYStartArea(me,
+ present[HTML_A_HREF] ? value[HTML_A_HREF] : NULL,
+ NULL,
+ present[HTML_A_TITLE] ? value[HTML_A_TITLE] : NULL,
+ tag_charset);
+ if (LYMapsOnly) {
+ return HT_OK;
+ }
+ /*
+ * A may have been declared SGML_EMPTY in HTMLDTD.c, and
+ * SGML_character() in SGML.c may check for an A end tag to call
+ * HTML_end_element() directly (with a check in that to bypass
+ * decrementing of the HTML parser's stack), so if we have an open A,
+ * close that one now. - FM & kw
+ */
+ if (me->inA) {
+ SET_SKIP_STACK(HTML_A);
+ HTML_end_element(me, HTML_A, include);
+ }
+ /*
+ * Set to know we are in an anchor.
+ */
+ me->inA = TRUE;
+
+ /*
+ * Load id_string if we have an ID or NAME. - FM
+ */
+ if (present && present[HTML_A_ID] &&
+ non_empty(value[HTML_A_ID])) {
+ StrAllocCopy(id_string, value[HTML_A_ID]);
+ } else if (present && present[HTML_A_NAME] &&
+ non_empty(value[HTML_A_NAME])) {
+ StrAllocCopy(id_string, value[HTML_A_NAME]);
+ }
+ if (id_string)
+ TRANSLATE_AND_UNESCAPE_TO_STD(&id_string);
+
+ /*
+ * Handle the reference. - FM
+ */
+ if (present && present[HTML_A_HREF]) {
+ /*
+ * Set to know we are making the content bold.
+ */
+ me->inBoldA = TRUE;
+
+ if (isEmpty(value[HTML_A_HREF]))
+ StrAllocCopy(href, "#");
+ else
+ StrAllocCopy(href, value[HTML_A_HREF]);
+ CHECK_FOR_INTERN(intern_flag, href); /* '#' */
+
+ if (intern_flag) { /*** FAST WAY: ***/
+ TRANSLATE_AND_UNESCAPE_TO_STD(&href);
+
+ } else {
+ url_type = LYLegitimizeHREF(me, &href, TRUE, TRUE);
+
+ /*
+ * Deal with our ftp gateway kludge. - FM
+ */
+ if (!url_type && !StrNCmp(href, "/foo/..", 7) &&
+ (isFTP_URL(me->node_anchor->address) ||
+ isFILE_URL(me->node_anchor->address))) {
+ for (i = 0; (href[i] = href[i + 7]) != 0; i++) ;
+ }
+ }
+
+ if (present[HTML_A_ISMAP]) /*??? */
+ intern_flag = FALSE;
+ } else {
+ if (bold_name_anchors == TRUE) {
+ me->inBoldA = TRUE;
+ }
+ }
+
+ if (present && present[HTML_A_TYPE] && value[HTML_A_TYPE]) {
+ StrAllocCopy(temp, value[HTML_A_TYPE]);
+ if (!intern_flag &&
+ !strcasecomp(value[HTML_A_TYPE], HTAtom_name(HTInternalLink)) &&
+ !LYIsUIPage3(me->node_anchor->address, UIP_LIST_PAGE, 0) &&
+ !LYIsUIPage3(me->node_anchor->address, UIP_ADDRLIST_PAGE, 0) &&
+ !isLYNXIMGMAP(me->node_anchor->address)) {
+ /* Some kind of spoof?
+ * Found TYPE="internal link" but not in a valid context
+ * where we have written it. - kw
+ */
+ CTRACE((tfp, "HTML: Found invalid HREF=\"%s\" TYPE=\"%s\"!\n",
+ href, temp));
+ FREE(temp);
+ }
+ }
+
+ me->CurrentA = HTAnchor_findChildAndLink(me->node_anchor, /* Parent */
+ id_string, /* Tag */
+ href, /* Address */
+ (temp
+ ? (HTLinkType *)
+ HTAtom_for(temp)
+ : INTERN_LT)); /* Type */
+ FREE(temp);
+ FREE(id_string);
+
+ if (me->CurrentA && present) {
+ if (present[HTML_A_TITLE] &&
+ non_empty(value[HTML_A_TITLE])) {
+ StrAllocCopy(title, value[HTML_A_TITLE]);
+ TRANSLATE_AND_UNESCAPE_ENTITIES(&title, TRUE, FALSE);
+ LYTrimHead(title);
+ LYTrimTail(title);
+ if (*title == '\0') {
+ FREE(title);
+ }
+ }
+ if (present[HTML_A_ISMAP])
+ dest_ismap = TRUE;
+ if (present[HTML_A_CHARSET] &&
+ non_empty(value[HTML_A_CHARSET])) {
+ /*
+ * Set up to load the anchor's chartrans structures
+ * appropriately for the current display character set if it
+ * can handle what's claimed. - FM
+ */
+ StrAllocCopy(temp, value[HTML_A_CHARSET]);
+ TRANSLATE_AND_UNESCAPE_TO_STD(&temp);
+ dest_char_set = UCGetLYhndl_byMIME(temp);
+ if (dest_char_set < 0) {
+ dest_char_set = UCLYhndl_for_unrec;
+ }
+ }
+ if (title != NULL || dest_ismap == TRUE || dest_char_set >= 0) {
+ dest = HTAnchor_parent(HTAnchor_followLink(me->CurrentA)
+ );
+ }
+ if (dest && title != NULL && HTAnchor_title(dest) == NULL)
+ HTAnchor_setTitle(dest, title);
+ if (dest && dest_ismap)
+ dest->isISMAPScript = TRUE;
+ /* Don't allow CHARSET attribute to change *this* document's
+ charset assumption. - kw */
+ if (dest && dest != me->node_anchor && dest_char_set >= 0) {
+ /*
+ * Load the anchor's chartrans structures. This should be done
+ * more intelligently when setting up the structured object,
+ * but it gets the job done for now. - FM
+ */
+ HTAnchor_setUCInfoStage(dest, dest_char_set,
+ UCT_STAGE_MIME,
+ UCT_SETBY_DEFAULT);
+ HTAnchor_setUCInfoStage(dest, dest_char_set,
+ UCT_STAGE_PARSER,
+ UCT_SETBY_LINK);
+ }
+ FREE(temp);
+ dest = NULL;
+ FREE(title);
+ }
+ me->CurrentANum = HText_beginAnchor(me->text,
+ me->inUnderline, me->CurrentA);
+ if (me->inBoldA == TRUE && me->inBoldH == FALSE)
+ HText_appendCharacter(me->text, LY_BOLD_START_CHAR);
+#if defined(NOTUSED_FOTEMODS)
+ /*
+ * Close an HREF-less NAMED-ed now if we aren't making their content
+ * bold, and let the check in HTML_end_element() deal with any dangling
+ * end tag this creates. - FM
+ */
+ if (href == NULL && me->inBoldA == FALSE) {
+ SET_SKIP_STACK(HTML_A);
+ HTML_end_element(me, HTML_A, include);
+ }
+#else
+ /*Close an HREF-less NAMED-ed now if force_empty_hrefless_a was
+ requested - VH */
+ if (href == NULL && force_empty_hrefless_a) {
+ SET_SKIP_STACK(HTML_A);
+ HTML_end_element(me, HTML_A, include);
+ }
+#endif
+ FREE(href);
+ break;
+
+ case HTML_IMG: /* Images */
+ /*
+ * If we're in an anchor, get the destination, and if it's a clickable
+ * image for the current anchor, set our flags for faking a 0,0
+ * coordinate pair, which typically returns the image's default. - FM
+ */
+ if (me->inA && me->CurrentA) {
+ if ((dest = HTAnchor_parent(HTAnchor_followLink(me->CurrentA)
+ )) != NULL) {
+ if (dest->isISMAPScript == TRUE) {
+ dest_ismap = TRUE;
+ CTRACE((tfp, "HTML: '%s' is an ISMAP script\n",
+ dest->address));
+ } else if (present && present[HTML_IMG_ISMAP]) {
+ dest_ismap = TRUE;
+ dest->isISMAPScript = TRUE;
+ CTRACE((tfp, "HTML: Designating '%s' as an ISMAP script\n",
+ dest->address));
+ }
+ }
+ }
+
+ intern_flag = FALSE; /* unless set below - kw */
+ /*
+ * If there's a USEMAP, resolve it. - FM
+ */
+ if (present && present[HTML_IMG_USEMAP] &&
+ non_empty(value[HTML_IMG_USEMAP])) {
+ StrAllocCopy(map_href, value[HTML_IMG_USEMAP]);
+ CHECK_FOR_INTERN(intern_flag, map_href);
+ (void) LYLegitimizeHREF(me, &map_href, TRUE, TRUE);
+ /*
+ * If map_href ended up zero-length or otherwise doesn't have a
+ * hash, it can't be valid, so ignore it. - FM
+ */
+ if (findPoundSelector(map_href) == NULL) {
+ FREE(map_href);
+ }
+ }
+
+ /*
+ * Handle a MAP reference if we have one at this point. - FM
+ */
+ if (map_href) {
+ /*
+ * If the MAP reference doesn't yet begin with a scheme, check
+ * whether a base tag is in effect. - FM
+ */
+ /*
+ * If the USEMAP value is a lone fragment and LYSeekFragMAPinCur is
+ * set, we'll use the current document's URL for resolving.
+ * Otherwise use the BASE. - kw
+ */
+ Base = ((me->inBASE &&
+ !(*map_href == '#' && LYSeekFragMAPinCur == TRUE))
+ ? me->base_href
+ : me->node_anchor->address);
+ HTParseALL(&map_href, Base);
+
+ /*
+ * Prepend our client-side MAP access field. - FM
+ */
+ StrAllocCopy(temp, STR_LYNXIMGMAP);
+ StrAllocCat(temp, map_href);
+ StrAllocCopy(map_href, temp);
+ FREE(temp);
+ }
+
+ /*
+ * Check whether we want to suppress the server-side ISMAP link if a
+ * client-side MAP is present. - FM
+ */
+ if (LYNoISMAPifUSEMAP && map_href && dest_ismap) {
+ dest_ismap = FALSE;
+ dest = NULL;
+ }
+
+ /*
+ * Check for a TITLE attribute. - FM
+ */
+ if (present && present[HTML_IMG_TITLE] &&
+ non_empty(value[HTML_IMG_TITLE])) {
+ StrAllocCopy(title, value[HTML_IMG_TITLE]);
+ TRANSLATE_AND_UNESCAPE_ENTITIES(&title, TRUE, FALSE);
+ LYTrimHead(title);
+ LYTrimTail(title);
+ if (*title == '\0') {
+ FREE(title);
+ }
+ }
+
+ /*
+ * If there's an ALT string, use it, unless the ALT string is
+ * zero-length or just spaces and we are making all SRCs links or have
+ * a USEMAP link. - FM
+ */
+ if (((present) &&
+ (present[HTML_IMG_ALT] && value[HTML_IMG_ALT])) &&
+ (!clickable_images ||
+ ((clickable_images || map_href) &&
+ *value[HTML_IMG_ALT] != '\0'))) {
+ StrAllocCopy(alt_string, value[HTML_IMG_ALT]);
+ TRANSLATE_AND_UNESCAPE_ENTITIES(&alt_string,
+ me->UsePlainSpace, me->HiddenValue);
+ /*
+ * If it's all spaces and we are making SRC or USEMAP links, treat
+ * it as zero-length. - FM
+ */
+ if (clickable_images || map_href) {
+ LYTrimHead(alt_string);
+ LYTrimTail(alt_string);
+ if (*alt_string == '\0') {
+ if (map_href) {
+ StrAllocCopy(alt_string, (title ? title :
+ (temp = MakeNewMapValue(value,
+ "USEMAP"))));
+ FREE(temp);
+ } else if (dest_ismap) {
+ StrAllocCopy(alt_string, (title ? title :
+ (temp = MakeNewMapValue(value,
+ "ISMAP"))));
+ FREE(temp);
+
+ } else if (me->inA == TRUE && dest) {
+ StrAllocCopy(alt_string, (title ?
+ title :
+ VERBOSE_IMG(value, HTML_IMG_SRC,
+ "[LINK]")));
+
+ } else {
+ StrAllocCopy(alt_string,
+ (title ? title :
+ ((present &&
+ present[HTML_IMG_ISOBJECT]) ?
+ "(OBJECT)" :
+ VERBOSE_IMG(value, HTML_IMG_SRC,
+ "[INLINE]"))));
+ }
+ }
+ }
+
+ } else if (map_href) {
+ StrAllocCopy(alt_string, (title ? title :
+ (temp = MakeNewMapValue(value, "USEMAP"))));
+ FREE(temp);
+
+ } else if ((dest_ismap == TRUE) ||
+ (me->inA && present && present[HTML_IMG_ISMAP])) {
+ StrAllocCopy(alt_string, (title ? title :
+ (temp = MakeNewMapValue(value, "ISMAP"))));
+ FREE(temp);
+
+ } else if (me->inA == TRUE && dest) {
+ StrAllocCopy(alt_string, (title ?
+ title :
+ VERBOSE_IMG(value, HTML_IMG_SRC,
+ "[LINK]")));
+
+ } else {
+ if (pseudo_inline_alts || clickable_images)
+ StrAllocCopy(alt_string, (title ? title :
+ ((present &&
+ present[HTML_IMG_ISOBJECT]) ?
+ "(OBJECT)" :
+ VERBOSE_IMG(value, HTML_IMG_SRC,
+ "[INLINE]"))));
+ else
+ StrAllocCopy(alt_string, NonNull(title));
+ }
+ if (*alt_string == '\0' && map_href) {
+ StrAllocCopy(alt_string, (temp = MakeNewMapValue(value, "USEMAP")));
+ FREE(temp);
+ }
+
+ CTRACE((tfp, "HTML IMG: USEMAP=%d ISMAP=%d ANCHOR=%d PARA=%d\n",
+ map_href ? 1 : 0,
+ (dest_ismap == TRUE) ? 1 : 0,
+ me->inA, me->inP));
+
+ /*
+ * Check for an ID attribute. - FM
+ */
+ if (present && present[HTML_IMG_ID] &&
+ non_empty(value[HTML_IMG_ID])) {
+ StrAllocCopy(id_string, value[HTML_IMG_ID]);
+ TRANSLATE_AND_UNESCAPE_TO_STD(&id_string);
+ if (*id_string == '\0') {
+ FREE(id_string);
+ }
+ }
+
+ /*
+ * Create links to the SRC for all images, if desired. - FM
+ */
+ if (clickable_images &&
+ present && present[HTML_IMG_SRC] &&
+ non_empty(value[HTML_IMG_SRC])) {
+ StrAllocCopy(href, value[HTML_IMG_SRC]);
+ LYLegitimizeHREF(me, &href, TRUE, TRUE);
+
+ /*
+ * If it's an ISMAP and/or USEMAP, or graphic for an anchor, end
+ * that anchor and start one for the SRC. - FM
+ */
+ if (me->inA) {
+ /*
+ * If we have a USEMAP, end this anchor and start a new one for
+ * the client-side MAP. - FM
+ */
+ if (map_href) {
+ if (dest_ismap) {
+ HTML_put_character(me, ' ');
+ me->in_word = NO;
+ HTML_put_string(me,
+ (temp = MakeNewMapValue(value, "ISMAP")));
+ FREE(temp);
+ } else if (dest) {
+ HTML_put_character(me, ' ');
+ me->in_word = NO;
+ HTML_put_string(me, "[LINK]");
+ }
+ if (me->inBoldA == TRUE && me->inBoldH == FALSE) {
+ HText_appendCharacter(me->text, LY_BOLD_END_CHAR);
+ }
+ me->inBoldA = FALSE;
+ HText_endAnchor(me->text, me->CurrentANum);
+ me->CurrentANum = 0;
+ if (dest_ismap || dest)
+ HTML_put_character(me, '-');
+ if (id_string) {
+ if ((ID_A = HTAnchor_findChildAndLink(me->node_anchor, /* Parent */
+ id_string, /* Tag */
+ NULL, /* Address */
+ 0)) != NULL) { /* Type */
+ HText_beginAnchor(me->text, me->inUnderline, ID_A);
+ HText_endAnchor(me->text, 0);
+ }
+ }
+ me->CurrentA = HTAnchor_findChildAndLink(me->node_anchor, /* Parent */
+ NULL, /* Tag */
+ map_href, /* Address */
+ INTERN_LT); /* Type */
+ if (me->CurrentA && title) {
+ if ((dest = HTAnchor_parent(HTAnchor_followLink(me->CurrentA)
+ )) != NULL) {
+ if (!HTAnchor_title(dest))
+ HTAnchor_setTitle(dest, title);
+ }
+ }
+ me->CurrentANum = HText_beginAnchor(me->text,
+ me->inUnderline,
+ me->CurrentA);
+ if (me->inBoldA == FALSE && me->inBoldH == FALSE) {
+ HText_appendCharacter(me->text, LY_BOLD_START_CHAR);
+ }
+ me->inBoldA = TRUE;
+ } else {
+ HTML_put_character(me, ' '); /* space char may be ignored */
+ me->in_word = NO;
+ }
+ HTML_put_string(me, alt_string);
+ if (me->inBoldA == TRUE && me->inBoldH == FALSE) {
+ HText_appendCharacter(me->text, LY_BOLD_END_CHAR);
+ }
+ me->inBoldA = FALSE;
+ HText_endAnchor(me->text, me->CurrentANum);
+ me->CurrentANum = 0;
+ HTML_put_character(me, '-');
+ FREE(newtitle);
+ StrAllocCopy(alt_string,
+ ((present &&
+ present[HTML_IMG_ISOBJECT]) ?
+ ((map_href || dest_ismap) ?
+ "(IMAGE)" : "(OBJECT)") :
+ VERBOSE_IMG(value, HTML_IMG_SRC, "[IMAGE]")));
+ if (id_string && !map_href) {
+ if ((ID_A = HTAnchor_findChildAndLink(me->node_anchor, /* Parent */
+ id_string, /* Tag */
+ NULL, /* Address */
+ 0)) != NULL) { /* Type */
+ HText_beginAnchor(me->text, me->inUnderline, ID_A);
+ HText_endAnchor(me->text, 0);
+ }
+ }
+ } else if (map_href) {
+ HTML_put_character(me, ' '); /* space char may be ignored */
+ me->in_word = NO;
+ if (id_string) {
+ if ((ID_A = HTAnchor_findChildAndLink(me->node_anchor, /* Parent */
+ id_string, /* Tag */
+ NULL, /* Address */
+ 0)) != NULL) { /* Type */
+ HText_beginAnchor(me->text, me->inUnderline, ID_A);
+ HText_endAnchor(me->text, 0);
+ }
+ }
+ me->CurrentA = HTAnchor_findChildAndLink(me->node_anchor, /* Parent */
+ NULL, /* Tag */
+ map_href, /* Address */
+ INTERN_LT); /* Type */
+ if (me->CurrentA && title) {
+ if ((dest = HTAnchor_parent(HTAnchor_followLink(me->CurrentA)
+ )) != NULL) {
+ if (!HTAnchor_title(dest))
+ HTAnchor_setTitle(dest, title);
+ }
+ }
+ me->CurrentANum = HText_beginAnchor(me->text,
+ me->inUnderline,
+ me->CurrentA);
+ if (me->inBoldA == FALSE && me->inBoldH == FALSE)
+ HText_appendCharacter(me->text, LY_BOLD_START_CHAR);
+ me->inBoldA = TRUE;
+ HTML_put_string(me, alt_string);
+ if (me->inBoldA == TRUE && me->inBoldH == FALSE) {
+ HText_appendCharacter(me->text, LY_BOLD_END_CHAR);
+ }
+ me->inBoldA = FALSE;
+ HText_endAnchor(me->text, me->CurrentANum);
+ me->CurrentANum = 0;
+ HTML_put_character(me, '-');
+ FREE(newtitle);
+ StrAllocCopy(alt_string,
+ ((present &&
+ present[HTML_IMG_ISOBJECT]) ?
+ "(IMAGE)" :
+ VERBOSE_IMG(value, HTML_IMG_SRC, "[IMAGE]")));
+ } else {
+ HTML_put_character(me, ' '); /* space char may be ignored */
+ me->in_word = NO;
+ if (id_string) {
+ if ((ID_A = HTAnchor_findChildAndLink(me->node_anchor, /* Parent */
+ id_string, /* Tag */
+ NULL, /* Address */
+ 0)) != NULL) { /* Type */
+ HText_beginAnchor(me->text, me->inUnderline, ID_A);
+ HText_endAnchor(me->text, 0);
+ }
+ }
+ }
+
+ /*
+ * Create the link to the SRC. - FM
+ */
+ me->CurrentA = HTAnchor_findChildAndLink(me->node_anchor, /* Parent */
+ NULL, /* Tag */
+ href, /* Address */
+ (HTLinkType *) 0); /* Type */
+ FREE(href);
+ me->CurrentANum = HText_beginAnchor(me->text,
+ me->inUnderline,
+ me->CurrentA);
+ if (me->inBoldH == FALSE)
+ HText_appendCharacter(me->text, LY_BOLD_START_CHAR);
+ HTML_put_string(me, alt_string);
+ if (!me->inA) {
+ if (me->inBoldH == FALSE)
+ HText_appendCharacter(me->text, LY_BOLD_END_CHAR);
+ HText_endAnchor(me->text, me->CurrentANum);
+ me->CurrentANum = 0;
+ HTML_put_character(me, ' '); /* space char may be ignored */
+ me->in_word = NO;
+ } else {
+ HTML_put_character(me, ' '); /* space char may be ignored */
+ me->in_word = NO;
+ me->inBoldA = TRUE;
+ }
+ } else if (map_href) {
+ if (me->inA) {
+ /*
+ * We're in an anchor and have a USEMAP, so end the anchor and
+ * start a new one for the client-side MAP. - FM
+ */
+ if (dest_ismap) {
+ HTML_put_character(me, ' '); /* space char may be ignored */
+ me->in_word = NO;
+ HTML_put_string(me, (temp = MakeNewMapValue(value, "ISMAP")));
+ FREE(temp);
+ } else if (dest) {
+ HTML_put_character(me, ' '); /* space char may be ignored */
+ me->in_word = NO;
+ HTML_put_string(me, "[LINK]");
+ }
+ if (me->inBoldA == TRUE && me->inBoldH == FALSE) {
+ HText_appendCharacter(me->text, LY_BOLD_END_CHAR);
+ }
+ me->inBoldA = FALSE;
+ HText_endAnchor(me->text, me->CurrentANum);
+ me->CurrentANum = 0;
+ if (dest_ismap || dest) {
+ HTML_put_character(me, '-');
+ }
+ } else {
+ HTML_put_character(me, ' ');
+ me->in_word = NO;
+ }
+ me->CurrentA = HTAnchor_findChildAndLink(me->node_anchor, /* Parent */
+ NULL, /* Tag */
+ map_href, /* Address */
+ INTERN_LT); /* Type */
+ if (me->CurrentA && title) {
+ if ((dest = HTAnchor_parent(HTAnchor_followLink(me->CurrentA)
+ )) != NULL) {
+ if (!HTAnchor_title(dest))
+ HTAnchor_setTitle(dest, title);
+ }
+ }
+ me->CurrentANum = HText_beginAnchor(me->text,
+ me->inUnderline,
+ me->CurrentA);
+ if (me->inBoldA == FALSE && me->inBoldH == FALSE) {
+ HText_appendCharacter(me->text, LY_BOLD_START_CHAR);
+ }
+ me->inBoldA = TRUE;
+ HTML_put_string(me, alt_string);
+ if (!me->inA) {
+ if (me->inBoldA == TRUE && me->inBoldH == FALSE) {
+ HText_appendCharacter(me->text, LY_BOLD_END_CHAR);
+ }
+ me->inBoldA = FALSE;
+ HText_endAnchor(me->text, me->CurrentANum);
+ me->CurrentANum = 0;
+ }
+ } else {
+ /*
+ * Just put in the ALT or pseudo-ALT string for the current anchor
+ * or inline, with an ID link if indicated. - FM
+ */
+ HTML_put_character(me, ' '); /* space char may be ignored */
+ me->in_word = NO;
+ if (id_string) {
+ if ((ID_A = HTAnchor_findChildAndLink(me->node_anchor, /* Parent */
+ id_string, /* Tag */
+ NULL, /* Address */
+ (HTLinkType *) 0)) != NULL) { /* Type */
+ HText_beginAnchor(me->text, me->inUnderline, ID_A);
+ HText_endAnchor(me->text, 0);
+ }
+ }
+ HTML_put_string(me, alt_string);
+ HTML_put_character(me, ' '); /* space char may be ignored */
+ me->in_word = NO;
+ }
+ FREE(map_href);
+ FREE(alt_string);
+ FREE(id_string);
+ FREE(title);
+ FREE(newtitle);
+ dest = NULL;
+ break;
+
+ case HTML_MAP:
+ /*
+ * Load id_string if we have a NAME or ID. - FM
+ */
+ if (present && present[HTML_MAP_NAME] &&
+ non_empty(value[HTML_MAP_NAME])) {
+ StrAllocCopy(id_string, value[HTML_MAP_NAME]);
+ } else if (present && present[HTML_MAP_ID] &&
+ non_empty(value[HTML_MAP_ID])) {
+ StrAllocCopy(id_string, value[HTML_MAP_ID]);
+ }
+ if (id_string) {
+ TRANSLATE_AND_UNESCAPE_TO_STD(&id_string);
+ if (*id_string == '\0') {
+ FREE(id_string);
+ }
+ }
+
+ /*
+ * Generate a target anchor in this place in the containing document.
+ * MAP can now contain block markup, if it doesn't contain any AREAs
+ * (or A anchors with COORDS converted to AREAs) the current location
+ * can be used as a fallback for following a USEMAP link. - kw
+ */
+ if (!LYMapsOnly)
+ LYHandleID(me, id_string);
+
+ /*
+ * Load map_address. - FM
+ */
+ if (id_string) {
+ /*
+ * The MAP must be in the current stream, even if it had a BASE
+ * tag, so we'll use its address here, but still use the BASE, if
+ * present, when resolving the AREA elements in it's content,
+ * unless the AREA's HREF is a lone fragment and
+ * LYSeekFragAREAinCur is set. - FM && KW
+ */
+ StrAllocCopy(me->map_address, me->node_anchor->address);
+ if ((cp = StrChr(me->map_address, '#')) != NULL)
+ *cp = '\0';
+ StrAllocCat(me->map_address, "#");
+ StrAllocCat(me->map_address, id_string);
+ FREE(id_string);
+ if (present && present[HTML_MAP_TITLE] &&
+ non_empty(value[HTML_MAP_TITLE])) {
+ StrAllocCopy(title, value[HTML_MAP_TITLE]);
+ TRANSLATE_AND_UNESCAPE_ENTITIES(&title, TRUE, FALSE);
+ LYTrimHead(title);
+ LYTrimTail(title);
+ if (*title == '\0') {
+ FREE(title);
+ }
+ }
+ LYAddImageMap(me->map_address, title, me->node_anchor);
+ FREE(title);
+ }
+ break;
+
+ case HTML_AREA:
+ if (me->map_address &&
+ present && present[HTML_AREA_HREF] &&
+ non_empty(value[HTML_AREA_HREF])) {
+ /*
+ * Resolve the HREF. - FM
+ */
+ StrAllocCopy(href, value[HTML_AREA_HREF]);
+ CHECK_FOR_INTERN(intern_flag, href);
+ (void) LYLegitimizeHREF(me, &href, TRUE, TRUE);
+
+ /*
+ * Check whether a BASE tag is in effect, and use it for resolving,
+ * even though we used this stream's address for locating the MAP
+ * itself, unless the HREF is a lone fragment and
+ * LYSeekFragAREAinCur is set. - FM
+ */
+ Base = (((me->inBASE && *href != '\0') &&
+ !(*href == '#' && LYSeekFragAREAinCur == TRUE))
+ ? me->base_href
+ : me->node_anchor->address);
+ HTParseALL(&href, Base);
+
+ /*
+ * Check for an ALT. - FM
+ */
+ if (present[HTML_AREA_ALT] &&
+ non_empty(value[HTML_AREA_ALT])) {
+ StrAllocCopy(alt_string, value[HTML_AREA_ALT]);
+ } else if (present[HTML_AREA_TITLE] &&
+ non_empty(value[HTML_AREA_TITLE])) {
+ /*
+ * Use the TITLE as an ALT. - FM
+ */
+ StrAllocCopy(alt_string, value[HTML_AREA_TITLE]);
+ }
+ if (alt_string != NULL) {
+ TRANSLATE_AND_UNESCAPE_ENTITIES(&alt_string,
+ me->UsePlainSpace,
+ me->HiddenValue);
+ /*
+ * Make sure it's not just space(s). - FM
+ */
+ LYTrimHead(alt_string);
+ LYTrimTail(alt_string);
+ if (*alt_string == '\0') {
+ StrAllocCopy(alt_string, href);
+ }
+ } else {
+ /*
+ * Use the HREF as an ALT. - FM
+ */
+ StrAllocCopy(alt_string, href);
+ }
+
+ LYAddMapElement(me->map_address, href, alt_string,
+ me->node_anchor, intern_flag);
+ FREE(href);
+ FREE(alt_string);
+ }
+ break;
+
+ case HTML_PARAM:
+ /*
+ * We may need to look at this someday to deal with MAPs, OBJECTs or
+ * APPLETs optimally, but just ignore it for now. - FM
+ */
+ break;
+
+ case HTML_BODYTEXT:
+ CHECK_ID(HTML_BODYTEXT_ID);
+ /*
+ * We may need to look at this someday to deal with OBJECTs optimally,
+ * but just ignore it for now. - FM
+ */
+ break;
+
+ case HTML_TEXTFLOW:
+ CHECK_ID(HTML_BODYTEXT_ID);
+ /*
+ * We may need to look at this someday to deal with APPLETs optimally,
+ * but just ignore it for now. - FM
+ */
+ break;
+
+ case HTML_FIG:
+ if (present)
+ LYHandleFIG(me, present, value,
+ present[HTML_FIG_ISOBJECT],
+ present[HTML_FIG_IMAGEMAP],
+ present[HTML_FIG_ID] ? value[HTML_FIG_ID] : NULL,
+ present[HTML_FIG_SRC] ? value[HTML_FIG_SRC] : NULL,
+ YES, TRUE, &intern_flag);
+ else
+ LYHandleFIG(me, NULL, NULL,
+ 0,
+ 0,
+ NULL,
+ NULL, YES, TRUE, &intern_flag);
+ break;
+
+ case HTML_OBJECT:
+ if (!me->object_started) {
+ /*
+ * This is an outer OBJECT start tag, i.e., not a nested OBJECT, so
+ * save its relevant attributes. - FM
+ */
+ if (present) {
+ if (present[HTML_OBJECT_DECLARE])
+ me->object_declare = TRUE;
+ if (present[HTML_OBJECT_SHAPES])
+ me->object_shapes = TRUE;
+ if (present[HTML_OBJECT_ISMAP])
+ me->object_ismap = TRUE;
+ if (present[HTML_OBJECT_USEMAP] &&
+ non_empty(value[HTML_OBJECT_USEMAP])) {
+ StrAllocCopy(me->object_usemap, value[HTML_OBJECT_USEMAP]);
+ TRANSLATE_AND_UNESCAPE_TO_STD(&me->object_usemap);
+ if (*me->object_usemap == '\0') {
+ FREE(me->object_usemap);
+ }
+ }
+ if (present[HTML_OBJECT_ID] &&
+ non_empty(value[HTML_OBJECT_ID])) {
+ StrAllocCopy(me->object_id, value[HTML_OBJECT_ID]);
+ TRANSLATE_AND_UNESCAPE_TO_STD(&me->object_id);
+ if (*me->object_id == '\0') {
+ FREE(me->object_id);
+ }
+ }
+ if (present[HTML_OBJECT_TITLE] &&
+ non_empty(value[HTML_OBJECT_TITLE])) {
+ StrAllocCopy(me->object_title, value[HTML_OBJECT_TITLE]);
+ TRANSLATE_AND_UNESCAPE_ENTITIES(&me->object_title, TRUE, FALSE);
+ LYTrimHead(me->object_title);
+ LYTrimTail(me->object_title);
+ if (*me->object_title == '\0') {
+ FREE(me->object_title);
+ }
+ }
+ if (present[HTML_OBJECT_DATA] &&
+ non_empty(value[HTML_OBJECT_DATA])) {
+ StrAllocCopy(me->object_data, value[HTML_OBJECT_DATA]);
+ TRANSLATE_AND_UNESCAPE_TO_STD(&me->object_data);
+ if (*me->object_data == '\0') {
+ FREE(me->object_data);
+ }
+ }
+ if (present[HTML_OBJECT_TYPE] &&
+ non_empty(value[HTML_OBJECT_TYPE])) {
+ StrAllocCopy(me->object_type, value[HTML_OBJECT_TYPE]);
+ TRANSLATE_AND_UNESCAPE_ENTITIES(&me->object_type, TRUE, FALSE);
+ LYTrimHead(me->object_type);
+ LYTrimTail(me->object_type);
+ if (*me->object_type == '\0') {
+ FREE(me->object_type);
+ }
+ }
+ if (present[HTML_OBJECT_CLASSID] &&
+ non_empty(value[HTML_OBJECT_CLASSID])) {
+ StrAllocCopy(me->object_classid,
+ value[HTML_OBJECT_CLASSID]);
+ TRANSLATE_AND_UNESCAPE_ENTITIES(&me->object_classid, TRUE, FALSE);
+ LYTrimHead(me->object_classid);
+ LYTrimTail(me->object_classid);
+ if (*me->object_classid == '\0') {
+ FREE(me->object_classid);
+ }
+ }
+ if (present[HTML_OBJECT_CODEBASE] &&
+ non_empty(value[HTML_OBJECT_CODEBASE])) {
+ StrAllocCopy(me->object_codebase,
+ value[HTML_OBJECT_CODEBASE]);
+ TRANSLATE_AND_UNESCAPE_TO_STD(&me->object_codebase);
+ if (*me->object_codebase == '\0') {
+ FREE(me->object_codebase);
+ }
+ }
+ if (present[HTML_OBJECT_CODETYPE] &&
+ non_empty(value[HTML_OBJECT_CODETYPE])) {
+ StrAllocCopy(me->object_codetype,
+ value[HTML_OBJECT_CODETYPE]);
+ TRANSLATE_AND_UNESCAPE_ENTITIES(&me->object_codetype,
+ TRUE,
+ FALSE);
+ LYTrimHead(me->object_codetype);
+ LYTrimTail(me->object_codetype);
+ if (*me->object_codetype == '\0') {
+ FREE(me->object_codetype);
+ }
+ }
+ if (present[HTML_OBJECT_NAME] &&
+ non_empty(value[HTML_OBJECT_NAME])) {
+ StrAllocCopy(me->object_name, value[HTML_OBJECT_NAME]);
+ TRANSLATE_AND_UNESCAPE_ENTITIES(&me->object_name, TRUE, FALSE);
+ LYTrimHead(me->object_name);
+ LYTrimTail(me->object_name);
+ if (*me->object_name == '\0') {
+ FREE(me->object_name);
+ }
+ }
+ }
+ /*
+ * If we can determine now that we are not going to do anything
+ * special to the OBJECT element's SGML contents, like skipping it
+ * completely or collecting it up in order to add something after
+ * it, then generate any output that should be emitted in the place
+ * of the OBJECT start tag NOW, then don't initialize special
+ * handling but return, letting our SGML parser know that further
+ * content is to be parsed normally not literally. We could defer
+ * this until we have collected the contents and then recycle the
+ * contents (as was previously always done), but that has a higher
+ * chance of completely losing content in case of nesting errors in
+ * the input, incomplete transmissions, etc. - kw
+ */
+ if ((!present ||
+ (me->object_declare == FALSE && me->object_name == NULL &&
+ me->object_shapes == FALSE && me->object_usemap == NULL))) {
+ if (!LYMapsOnly) {
+ if (!clickable_images || me->object_data == NULL ||
+ !(me->object_data != NULL &&
+ me->object_classid == NULL &&
+ me->object_codebase == NULL &&
+ me->object_codetype == NULL))
+ FREE(me->object_data);
+ if (me->object_data) {
+ HTStartAnchor5(me,
+ (me->object_id
+ ? value[HTML_OBJECT_ID]
+ : NULL),
+ value[HTML_OBJECT_DATA],
+ value[HTML_OBJECT_TYPE],
+ tag_charset);
+ if ((me->object_type != NULL) &&
+ !strncasecomp(me->object_type, "image/", 6))
+ HTML_put_string(me, "(IMAGE)");
+ else
+ HTML_put_string(me, "(OBJECT)");
+ HTML_end_element(me, HTML_A, NULL);
+ } else if (me->object_id)
+ LYHandleID(me, me->object_id);
+ }
+ clear_objectdata(me);
+ /*
+ * We do NOT want the HTML_put_* functions that are going to be
+ * called for the OBJECT's character content to add to the
+ * chunk, so we don't push on the stack. Instead we keep a
+ * counter for open OBJECT tags that are treated this way, so
+ * HTML_end_element can skip handling the corresponding end tag
+ * that is going to arrive unexpectedly as far as our stack is
+ * concerned.
+ */
+ status = HT_PARSER_OTHER_CONTENT;
+ if (me->sp[0].tag_number == HTML_FIG &&
+ me->objects_figged_open > 0) {
+ ElementNumber = (HTMLElement) HTML_OBJECT_M;
+ } else {
+ me->objects_mixed_open++;
+ SET_SKIP_STACK(HTML_OBJECT);
+ }
+ } else if (me->object_declare == FALSE && me->object_name == NULL &&
+ me->object_shapes == TRUE) {
+ LYHandleFIG(me, present, value,
+ 1,
+ 1 || me->object_ismap,
+ me->object_id,
+ ((me->object_data && !me->object_classid)
+ ? value[HTML_OBJECT_DATA]
+ : NULL),
+ NO, TRUE, &intern_flag);
+ clear_objectdata(me);
+ status = HT_PARSER_OTHER_CONTENT;
+ me->objects_figged_open++;
+ ElementNumber = HTML_FIG;
+
+ } else {
+ /*
+ * Set flag that we are accumulating OBJECT content. - FM
+ */
+ me->object_started = TRUE;
+ }
+ }
+ break;
+
+ case HTML_OVERLAY:
+ if (clickable_images && me->inFIG &&
+ present && present[HTML_OVERLAY_SRC] &&
+ non_empty(value[HTML_OVERLAY_SRC])) {
+ StrAllocCopy(href, value[HTML_OVERLAY_SRC]);
+ LYLegitimizeHREF(me, &href, TRUE, TRUE);
+ if (*href) {
+
+ if (me->inA) {
+ SET_SKIP_STACK(HTML_A);
+ HTML_end_element(me, HTML_A, include);
+ }
+ me->CurrentA = HTAnchor_findChildAndLink(me->node_anchor, /* Parent */
+ NULL, /* Tag */
+ href, /* Address */
+ (HTLinkType *) 0); /* Type */
+ HTML_put_character(me, ' ');
+ HText_appendCharacter(me->text, '+');
+ me->CurrentANum = HText_beginAnchor(me->text,
+ me->inUnderline,
+ me->CurrentA);
+ if (me->inBoldH == FALSE)
+ HText_appendCharacter(me->text, LY_BOLD_START_CHAR);
+ HTML_put_string(me, "[OVERLAY]");
+ if (me->inBoldH == FALSE)
+ HText_appendCharacter(me->text, LY_BOLD_END_CHAR);
+ HText_endAnchor(me->text, me->CurrentANum);
+ HTML_put_character(me, ' ');
+ me->in_word = NO;
+ }
+ FREE(href);
+ }
+ break;
+
+ case HTML_APPLET:
+ me->inAPPLET = TRUE;
+ me->inAPPLETwithP = FALSE;
+ HTML_put_character(me, ' '); /* space char may be ignored */
+ /*
+ * Load id_string if we have an ID or NAME. - FM
+ */
+ if (present && present[HTML_APPLET_ID] &&
+ non_empty(value[HTML_APPLET_ID])) {
+ StrAllocCopy(id_string, value[HTML_APPLET_ID]);
+ } else if (present && present[HTML_APPLET_NAME] &&
+ non_empty(value[HTML_APPLET_NAME])) {
+ StrAllocCopy(id_string, value[HTML_APPLET_NAME]);
+ }
+ if (id_string) {
+ TRANSLATE_AND_UNESCAPE_TO_STD(&id_string);
+ LYHandleID(me, id_string);
+ FREE(id_string);
+ }
+ me->in_word = NO;
+
+ /*
+ * If there's an ALT string, use it, unless the ALT string is
+ * zero-length and we are making all sources links. - FM
+ */
+ if (present && present[HTML_APPLET_ALT] && value[HTML_APPLET_ALT] &&
+ (!clickable_images ||
+ (clickable_images && *value[HTML_APPLET_ALT] != '\0'))) {
+ StrAllocCopy(alt_string, value[HTML_APPLET_ALT]);
+ TRANSLATE_AND_UNESCAPE_ENTITIES(&alt_string,
+ me->UsePlainSpace, me->HiddenValue);
+ /*
+ * If it's all spaces and we are making sources links, treat it as
+ * zero-length. - FM
+ */
+ if (clickable_images) {
+ LYTrimHead(alt_string);
+ LYTrimTail(alt_string);
+ if (*alt_string == '\0') {
+ StrAllocCopy(alt_string, "[APPLET]");
+ }
+ }
+
+ } else {
+ if (clickable_images)
+ StrAllocCopy(alt_string, "[APPLET]");
+ else
+ StrAllocCopy(alt_string, "");
+ }
+
+ /*
+ * If we're making all sources links, get the source. - FM
+ */
+ if (clickable_images && present && present[HTML_APPLET_CODE] &&
+ non_empty(value[HTML_APPLET_CODE])) {
+ char *base = NULL;
+
+ Base = (me->inBASE)
+ ? me->base_href
+ : me->node_anchor->address;
+ /*
+ * Check for a CODEBASE attribute. - FM
+ */
+ if (present[HTML_APPLET_CODEBASE] &&
+ non_empty(value[HTML_APPLET_CODEBASE])) {
+ StrAllocCopy(base, value[HTML_APPLET_CODEBASE]);
+ LYRemoveBlanks(base);
+ TRANSLATE_AND_UNESCAPE_TO_STD(&base);
+ /*
+ * Force it to be a directory. - FM
+ */
+ if (*base == '\0')
+ StrAllocCopy(base, "/");
+ LYAddHtmlSep(&base);
+ LYLegitimizeHREF(me, &base, TRUE, FALSE);
+
+ HTParseALL(&base, Base);
+ }
+
+ StrAllocCopy(href, value[HTML_APPLET_CODE]);
+ LYLegitimizeHREF(me, &href, TRUE, FALSE);
+ HTParseALL(&href, (base ? base : Base));
+ FREE(base);
+
+ if (*href) {
+ if (me->inA) {
+ if (me->inBoldA == TRUE && me->inBoldH == FALSE)
+ HText_appendCharacter(me->text, LY_BOLD_END_CHAR);
+ HText_endAnchor(me->text, me->CurrentANum);
+ HTML_put_character(me, '-');
+ }
+ me->CurrentA = HTAnchor_findChildAndLink(me->node_anchor, /* Parent */
+ NULL, /* Tag */
+ href, /* Address */
+ (HTLinkType *) 0); /* Type */
+ me->CurrentANum = HText_beginAnchor(me->text,
+ me->inUnderline,
+ me->CurrentA);
+ if (me->inBoldH == FALSE)
+ HText_appendCharacter(me->text, LY_BOLD_START_CHAR);
+ HTML_put_string(me, alt_string);
+ if (me->inA == FALSE) {
+ if (me->inBoldH == FALSE)
+ HText_appendCharacter(me->text, LY_BOLD_END_CHAR);
+ HText_endAnchor(me->text, me->CurrentANum);
+ me->CurrentANum = 0;
+ }
+ HTML_put_character(me, ' '); /* space char may be ignored */
+ me->in_word = NO;
+ }
+ FREE(href);
+ } else if (*alt_string) {
+ /*
+ * Just put up the ALT string, if non-zero. - FM
+ */
+ HTML_put_string(me, alt_string);
+ HTML_put_character(me, ' '); /* space char may be ignored */
+ me->in_word = NO;
+ }
+ FREE(alt_string);
+ FREE(id_string);
+ break;
+
+ case HTML_BGSOUND:
+ /*
+ * If we're making all sources links, get the source. - FM
+ */
+ if (clickable_images && present && present[HTML_BGSOUND_SRC] &&
+ non_empty(value[HTML_BGSOUND_SRC])) {
+ StrAllocCopy(href, value[HTML_BGSOUND_SRC]);
+ LYLegitimizeHREF(me, &href, TRUE, TRUE);
+ if (*href == '\0') {
+ FREE(href);
+ break;
+ }
+
+ if (me->inA) {
+ if (me->inBoldA == TRUE && me->inBoldH == FALSE)
+ HText_appendCharacter(me->text, LY_BOLD_END_CHAR);
+ HText_endAnchor(me->text, me->CurrentANum);
+ HTML_put_character(me, '-');
+ } else {
+ HTML_put_character(me, ' '); /* space char may be ignored */
+ me->in_word = NO;
+ }
+ me->CurrentA = HTAnchor_findChildAndLink(me->node_anchor, /* Parent */
+ NULL, /* Tag */
+ href, /* Address */
+ (HTLinkType *) 0); /* Type */
+ me->CurrentANum = HText_beginAnchor(me->text,
+ me->inUnderline,
+ me->CurrentA);
+ if (me->inBoldH == FALSE)
+ HText_appendCharacter(me->text, LY_BOLD_START_CHAR);
+ HTML_put_string(me, "[BGSOUND]");
+ if (me->inA == FALSE) {
+ if (me->inBoldH == FALSE)
+ HText_appendCharacter(me->text, LY_BOLD_END_CHAR);
+ HText_endAnchor(me->text, me->CurrentANum);
+ me->CurrentANum = 0;
+ }
+ HTML_put_character(me, ' '); /* space char may be ignored */
+ me->in_word = NO;
+ FREE(href);
+ }
+ break;
+
+ case HTML_EMBED:
+ if (pseudo_inline_alts || clickable_images)
+ HTML_put_character(me, ' '); /* space char may be ignored */
+ /*
+ * Load id_string if we have an ID or NAME. - FM
+ */
+ if (present && present[HTML_EMBED_ID] &&
+ non_empty(value[HTML_EMBED_ID])) {
+ StrAllocCopy(id_string, value[HTML_EMBED_ID]);
+ } else if (present && present[HTML_EMBED_NAME] &&
+ non_empty(value[HTML_EMBED_NAME])) {
+ StrAllocCopy(id_string, value[HTML_EMBED_NAME]);
+ }
+ if (id_string) {
+ TRANSLATE_AND_UNESCAPE_TO_STD(&id_string);
+ LYHandleID(me, id_string);
+ FREE(id_string);
+ }
+ if (pseudo_inline_alts || clickable_images)
+ me->in_word = NO;
+
+ /*
+ * If there's an ALT string, use it, unless the ALT string is
+ * zero-length and we are making all sources links. - FM
+ */
+ if (present && present[HTML_EMBED_ALT] && value[HTML_EMBED_ALT] &&
+ (!clickable_images ||
+ (clickable_images && *value[HTML_EMBED_ALT] != '\0'))) {
+ StrAllocCopy(alt_string, value[HTML_EMBED_ALT]);
+ TRANSLATE_AND_UNESCAPE_ENTITIES(&alt_string,
+ me->UsePlainSpace, me->HiddenValue);
+ /*
+ * If it's all spaces and we are making sources links, treat it as
+ * zero-length. - FM
+ */
+ if (clickable_images) {
+ LYTrimHead(alt_string);
+ LYTrimTail(alt_string);
+ if (*alt_string == '\0') {
+ StrAllocCopy(alt_string, "[EMBED]");
+ }
+ }
+ } else {
+ if (pseudo_inline_alts || clickable_images)
+ StrAllocCopy(alt_string, "[EMBED]");
+ else
+ StrAllocCopy(alt_string, "");
+ }
+
+ /*
+ * If we're making all sources links, get the source. - FM
+ */
+ if (clickable_images && present && present[HTML_EMBED_SRC] &&
+ non_empty(value[HTML_EMBED_SRC])) {
+ StrAllocCopy(href, value[HTML_EMBED_SRC]);
+ LYLegitimizeHREF(me, &href, TRUE, TRUE);
+ if (*href) {
+ if (me->inA) {
+ if (me->inBoldA == TRUE && me->inBoldH == FALSE)
+ HText_appendCharacter(me->text, LY_BOLD_END_CHAR);
+ HText_endAnchor(me->text, me->CurrentANum);
+ HTML_put_character(me, '-');
+ }
+ me->CurrentA = HTAnchor_findChildAndLink(me->node_anchor, /* Parent */
+ NULL, /* Tag */
+ href, /* Address */
+ (HTLinkType *) 0); /* Type */
+ me->CurrentANum = HText_beginAnchor(me->text,
+ me->inUnderline,
+ me->CurrentA);
+ if (me->inBoldH == FALSE)
+ HText_appendCharacter(me->text, LY_BOLD_START_CHAR);
+ HTML_put_string(me, alt_string);
+ if (me->inBoldH == FALSE)
+ HText_appendCharacter(me->text, LY_BOLD_END_CHAR);
+ if (me->inA == FALSE) {
+ if (me->inBoldH == FALSE)
+ HText_appendCharacter(me->text, LY_BOLD_END_CHAR);
+ HText_endAnchor(me->text, me->CurrentANum);
+ me->CurrentANum = 0;
+ }
+ HTML_put_character(me, ' ');
+ me->in_word = NO;
+ }
+ FREE(href);
+ } else if (*alt_string) {
+ /*
+ * Just put up the ALT string, if non-zero. - FM
+ */
+ HTML_put_string(me, alt_string);
+ HTML_put_character(me, ' '); /* space char may be ignored */
+ me->in_word = NO;
+ }
+ FREE(alt_string);
+ FREE(id_string);
+ break;
+
+ case HTML_CREDIT:
+ LYEnsureDoubleSpace(me);
+ LYResetParagraphAlignment(me);
+ me->inCREDIT = TRUE;
+ CHECK_ID(HTML_GEN_ID);
+ if (me->inUnderline == FALSE)
+ HText_appendCharacter(me->text, LY_UNDERLINE_START_CHAR);
+ HTML_put_string(me, "CREDIT:");
+ if (me->inUnderline == FALSE)
+ HText_appendCharacter(me->text, LY_UNDERLINE_END_CHAR);
+ HTML_put_character(me, ' ');
+ CAN_JUSTIFY_START;
+
+ if (me->inFIG)
+ /*
+ * Assume all text in the FIG container is intended to be
+ * paragraphed. - FM
+ */
+ me->inFIGwithP = TRUE;
+
+ if (me->inAPPLET)
+ /*
+ * Assume all text in the APPLET container is intended to be
+ * paragraphed. - FM
+ */
+ me->inAPPLETwithP = TRUE;
+
+ me->inLABEL = TRUE;
+ me->in_word = NO;
+ me->inP = FALSE;
+ break;
+
+ case HTML_CAPTION:
+ LYEnsureDoubleSpace(me);
+ LYResetParagraphAlignment(me);
+ me->inCAPTION = TRUE;
+ CHECK_ID(HTML_CAPTION_ID);
+ if (me->inUnderline == FALSE)
+ HText_appendCharacter(me->text, LY_UNDERLINE_START_CHAR);
+ HTML_put_string(me, "CAPTION:");
+ if (me->inUnderline == FALSE)
+ HText_appendCharacter(me->text, LY_UNDERLINE_END_CHAR);
+ HTML_put_character(me, ' ');
+ CAN_JUSTIFY_START;
+
+ if (me->inFIG)
+ /*
+ * Assume all text in the FIG container is intended to be
+ * paragraphed. - FM
+ */
+ me->inFIGwithP = TRUE;
+
+ if (me->inAPPLET)
+ /*
+ * Assume all text in the APPLET container is intended to be
+ * paragraphed. - FM
+ */
+ me->inAPPLETwithP = TRUE;
+
+ me->inLABEL = TRUE;
+ me->in_word = NO;
+ me->inP = FALSE;
+ break;
+
+ case HTML_FORM:
+ {
+ char *action = NULL;
+ char *method = NULL;
+ char *enctype = NULL;
+ const char *accept_cs = NULL;
+
+ HTChildAnchor *source;
+ HTAnchor *link_dest;
+
+ /*
+ * FORM may have been declared SGML_EMPTY in HTMLDTD.c, and
+ * SGML_character() in SGML.c may check for a FORM end tag to call
+ * HTML_end_element() directly (with a check in that to bypass
+ * decrementing of the HTML parser's stack), so if we have an open
+ * FORM, close that one now. - FM
+ */
+ if (me->inFORM) {
+ CTRACE((tfp, "HTML: Missing FORM end tag. Faking it!\n"));
+ SET_SKIP_STACK(HTML_FORM);
+ HTML_end_element(me, HTML_FORM, include);
+ }
+
+ /*
+ * Set to know we are in a new form.
+ */
+ me->inFORM = TRUE;
+ EMIT_IFDEF_USE_JUSTIFY_ELTS(form_in_htext = TRUE);
+
+ if (present && present[HTML_FORM_ACCEPT_CHARSET]) {
+ accept_cs = (value[HTML_FORM_ACCEPT_CHARSET]
+ ? value[HTML_FORM_ACCEPT_CHARSET]
+ : "UNKNOWN");
+ }
+
+ Base = (me->inBASE)
+ ? me->base_href
+ : me->node_anchor->address;
+
+ if (present && present[HTML_FORM_ACTION] &&
+ value[HTML_FORM_ACTION]) {
+
+ StrAllocCopy(action, value[HTML_FORM_ACTION]);
+ LYLegitimizeHREF(me, &action, TRUE, TRUE);
+
+ /*
+ * Check whether a base tag is in effect. Note that actions
+ * always are resolved w.r.t. to the base, even if the action
+ * is empty. - FM
+ */
+ HTParseALL(&action, Base);
+
+ } else {
+ StrAllocCopy(action, Base);
+ }
+
+ source = HTAnchor_findChildAndLink(me->node_anchor,
+ NULL,
+ action,
+ (HTLinkType *) 0);
+ if ((link_dest = HTAnchor_followLink(source)) != NULL) {
+ /*
+ * Memory leak fixed. 05-28-94 Lynx 2-3-1 Garrett Arch Blythe
+ */
+ char *cp_freeme = HTAnchor_address(link_dest);
+
+ if (cp_freeme != NULL) {
+ StrAllocCopy(action, cp_freeme);
+ FREE(cp_freeme);
+ } else {
+ StrAllocCopy(action, "");
+ }
+ }
+
+ if (present && present[HTML_FORM_METHOD])
+ StrAllocCopy(method, (value[HTML_FORM_METHOD]
+ ? value[HTML_FORM_METHOD]
+ : "GET"));
+
+ if (present && present[HTML_FORM_ENCTYPE] &&
+ non_empty(value[HTML_FORM_ENCTYPE])) {
+ StrAllocCopy(enctype, value[HTML_FORM_ENCTYPE]);
+ LYLowerCase(enctype);
+ }
+
+ if (present) {
+ /*
+ * Check for a TITLE attribute, and if none is present, check
+ * for a SUBJECT attribute as a synonym. - FM
+ */
+ if (present[HTML_FORM_TITLE] &&
+ non_empty(value[HTML_FORM_TITLE])) {
+ StrAllocCopy(title, value[HTML_FORM_TITLE]);
+ } else if (present[HTML_FORM_SUBJECT] &&
+ non_empty(value[HTML_FORM_SUBJECT])) {
+ StrAllocCopy(title, value[HTML_FORM_SUBJECT]);
+ }
+ if (non_empty(title)) {
+ TRANSLATE_AND_UNESCAPE_ENTITIES(&title, TRUE, FALSE);
+ LYTrimHead(title);
+ LYTrimTail(title);
+ if (*title == '\0') {
+ FREE(title);
+ }
+ }
+ }
+
+ HText_beginForm(action, method, enctype, title, accept_cs);
+
+ FREE(action);
+ FREE(method);
+ FREE(enctype);
+ FREE(title);
+ }
+ CHECK_ID(HTML_FORM_ID);
+ break;
+
+ case HTML_FIELDSET:
+ LYEnsureDoubleSpace(me);
+ LYResetParagraphAlignment(me);
+ CHECK_ID(HTML_GEN_ID);
+ break;
+
+ case HTML_LEGEND:
+ LYEnsureDoubleSpace(me);
+ LYResetParagraphAlignment(me);
+ CHECK_ID(HTML_CAPTION_ID);
+ break;
+
+ case HTML_LABEL:
+ CHECK_ID(HTML_LABEL_ID);
+ break;
+
+ case HTML_KEYGEN:
+ CHECK_ID(HTML_KEYGEN_ID);
+ break;
+
+ case HTML_BUTTON:
+ {
+ InputFieldData I;
+ int chars;
+ BOOL faked_button = FALSE;
+
+ /* init */
+ memset(&I, 0, sizeof(I));
+ I.name_cs = ATTR_CS_IN;
+ I.value_cs = ATTR_CS_IN;
+
+ UPDATE_STYLE;
+ if (present &&
+ present[HTML_BUTTON_TYPE] &&
+ value[HTML_BUTTON_TYPE]) {
+ if (!strcasecomp(value[HTML_BUTTON_TYPE], "submit") ||
+ !strcasecomp(value[HTML_BUTTON_TYPE], "reset")) {
+ /*
+ * It's a button for submitting or resetting a form. - FM
+ */
+ I.type = value[HTML_BUTTON_TYPE];
+ } else {
+ /*
+ * Ugh, it's a button for a script. - FM
+ */
+ I.type = value[HTML_BUTTON_TYPE];
+ CTRACE((tfp, "found button for a script\n"));
+ }
+ } else {
+ /* default, if no type given, is a submit button */
+ I.type = "submit";
+ }
+
+ /*
+ * Before any input field, add a collapsible space if we're not in
+ * a PRE block, to promote a wrap there for any long values that
+ * would extend past the right margin from our current position in
+ * the line. If we are in a PRE block, start a new line if the
+ * last line already is within 6 characters of the wrap point for
+ * PRE blocks. - FM
+ */
+ if (me->sp[0].tag_number != HTML_PRE && !me->inPRE &&
+ me->sp->style->freeFormat) {
+ HTML_put_character(me, ' ');
+ me->in_word = NO;
+ } else if (HText_LastLineSize(me->text, FALSE) > (LYcolLimit - 6)) {
+ HTML_put_character(me, '\n');
+ me->in_word = NO;
+ }
+ HTML_put_character(me, '(');
+
+ if (!(present && present[HTML_BUTTON_NAME] &&
+ value[HTML_BUTTON_NAME])) {
+ I.name = "";
+ } else if (StrChr(value[HTML_BUTTON_NAME], '&') == NULL) {
+ I.name = value[HTML_BUTTON_NAME];
+ } else {
+ StrAllocCopy(I_name, value[HTML_BUTTON_NAME]);
+ UNESCAPE_FIELDNAME_TO_STD(&I_name);
+ I.name = I_name;
+ }
+
+ if (present && present[HTML_BUTTON_VALUE] &&
+ non_empty(value[HTML_BUTTON_VALUE])) {
+ /*
+ * Convert any HTML entities or decimal escaping. - FM
+ */
+ StrAllocCopy(I.value, value[HTML_BUTTON_VALUE]);
+ me->UsePlainSpace = TRUE;
+ TRANSLATE_AND_UNESCAPE_ENTITIES(&I.value, TRUE, me->HiddenValue);
+ me->UsePlainSpace = FALSE;
+ /*
+ * Convert any newlines or tabs to spaces, and trim any lead or
+ * trailing spaces. - FM
+ */
+ LYReduceBlanks(I.value);
+ } else if (!strcasecomp(I.type, "button")) {
+ if (non_empty(I.name)) {
+ StrAllocCopy(I.value, I.name);
+ } else {
+ StrAllocCopy(I.value, "BUTTON");
+ faked_button = TRUE;
+ }
+ } else if (I.value == 0) {
+ StrAllocCopy(I.value, "BUTTON");
+ }
+
+ if (present && present[HTML_BUTTON_READONLY])
+ I.readonly = YES;
+
+ if (present && present[HTML_BUTTON_DISABLED])
+ I.disabled = YES;
+
+ if (present && present[HTML_BUTTON_CLASS] && /* Not yet used. */
+ non_empty(value[HTML_BUTTON_CLASS]))
+ I.iclass = value[HTML_BUTTON_CLASS];
+
+ if (present && present[HTML_BUTTON_ID] &&
+ non_empty(value[HTML_BUTTON_ID])) {
+ I.id = value[HTML_BUTTON_ID];
+ CHECK_ID(HTML_BUTTON_ID);
+ }
+
+ if (present && present[HTML_BUTTON_LANG] && /* Not yet used. */
+ non_empty(value[HTML_BUTTON_LANG]))
+ I.lang = value[HTML_BUTTON_LANG];
+
+ chars = HText_beginInput(me->text, me->inUnderline, &I);
+ /*
+ * Submit and reset buttons have values which don't change, so
+ * HText_beginInput() sets I.value to the string which should be
+ * displayed, and we'll enter that instead of underscore
+ * placeholders into the HText structure to see it instead of
+ * underscores when dumping or printing. We also won't worry about
+ * a wrap in PRE blocks, because the line editor never is invoked
+ * for submit or reset buttons. - LE & FM
+ */
+ if (me->sp[0].tag_number == HTML_PRE ||
+ !me->sp->style->freeFormat) {
+ /*
+ * We have a submit or reset button in a PRE block, so output
+ * the entire value from the markup. If it extends to the
+ * right margin, it will wrap there, and only the portion
+ * before that wrap will be highlighted on screen display
+ * (Yuk!) but we may as well show the rest of the full value on
+ * the next or more lines. - FM
+ */
+ while (I.value[i])
+ HTML_put_character(me, I.value[i++]);
+ } else {
+ /*
+ * The submit or reset button is not in a PRE block. Note that
+ * if a wrap occurs before outputting the entire value, the
+ * wrapped portion will not be highlighted or clearly indicated
+ * as part of the link for submission or reset (Yuk!). We'll
+ * replace any spaces in the submit or reset button value with
+ * nbsp, to promote a wrap at the space we ensured would be
+ * present before the start of the string, as when we use all
+ * underscores instead of the INPUT's actual value, but we
+ * could still get a wrap at the right margin, instead, if the
+ * value is greater than a line width for the current style.
+ * Also, if chars somehow ended up longer than the length of
+ * the actual value (shouldn't have), we'll continue padding
+ * with nbsp up to the length of chars. - FM
+ */
+ for (i = 0; I.value[i]; i++) {
+ HTML_put_character(me,
+ (char) ((I.value[i] == ' ')
+ ? HT_NON_BREAK_SPACE
+ : I.value[i]));
+ }
+ while (i++ < chars) {
+ HTML_put_character(me, HT_NON_BREAK_SPACE);
+ }
+ }
+ HTML_put_character(me, ')');
+ if (me->sp[0].tag_number != HTML_PRE &&
+ me->sp->style->freeFormat) {
+ HTML_put_character(me, ' ');
+ me->in_word = NO;
+ }
+ if (faked_button)
+ FREE(I.value);
+ FREE(I_name);
+ }
+ break;
+
+ case HTML_INPUT:
+ {
+ InputFieldData I;
+ int chars;
+ BOOL UseALTasVALUE = FALSE;
+ BOOL HaveSRClink = FALSE;
+ char *ImageSrc = NULL;
+ BOOL IsSubmitOrReset = FALSE;
+ HTkcode kcode = NOKANJI;
+ HTkcode specified_kcode = NOKANJI;
+
+ /* init */
+ memset(&I, 0, sizeof(I));
+ I.name_cs = ATTR_CS_IN;
+ I.value_cs = ATTR_CS_IN;
+
+ UPDATE_STYLE;
+
+ /*
+ * Before any input field, add a collapsible space if we're not in
+ * a PRE block, to promote a wrap there for any long values that
+ * would extend past the right margin from our current position in
+ * the line. If we are in a PRE block, start a new line if the
+ * last line already is within 6 characters of the wrap point for
+ * PRE blocks. - FM
+ */
+ if (me->sp[0].tag_number != HTML_PRE && !me->inPRE &&
+ me->sp->style->freeFormat) {
+ HTML_put_character(me, ' ');
+ me->in_word = NO;
+ } else if (HText_LastLineSize(me->text, FALSE) > (LYcolLimit - 6)) {
+ HTML_put_character(me, '\n');
+ me->in_word = NO;
+ }
+
+ /*
+ * Get the TYPE and make sure we can handle it. - FM
+ */
+ if (present && present[HTML_INPUT_TYPE] &&
+ non_empty(value[HTML_INPUT_TYPE])) {
+ const char *not_impl = NULL;
+ char *usingval = NULL;
+
+ I.type = value[HTML_INPUT_TYPE];
+
+ if (!strcasecomp(I.type, "range")) {
+ if (present[HTML_INPUT_MIN] &&
+ non_empty(value[HTML_INPUT_MIN]))
+ I.min = value[HTML_INPUT_MIN];
+ if (present[HTML_INPUT_MAX] &&
+ non_empty(value[HTML_INPUT_MAX]))
+ I.max = value[HTML_INPUT_MAX];
+ /*
+ * Not yet implemented.
+ */
+#ifdef NOTDEFINED
+ not_impl = "[RANGE Input]";
+ if (me->inFORM)
+ HText_DisableCurrentForm();
+#endif /* NOTDEFINED */
+ CTRACE((tfp, "HTML: Ignoring TYPE=\"range\"\n"));
+ break;
+
+ } else if (!strcasecomp(I.type, "file")) {
+ if (present[HTML_INPUT_ACCEPT] &&
+ non_empty(value[HTML_INPUT_ACCEPT]))
+ I.accept = value[HTML_INPUT_ACCEPT];
+#ifndef USE_FILE_UPLOAD
+ not_impl = "[FILE Input]";
+ CTRACE((tfp, "Attempting to fake as: %s\n", I.type));
+#ifdef NOTDEFINED
+ if (me->inFORM)
+ HText_DisableCurrentForm();
+#endif /* NOTDEFINED */
+ CTRACE((tfp, "HTML: Ignoring TYPE=\"file\"\n"));
+#endif /* USE_FILE_UPLOAD */
+
+ } else if (!strcasecomp(I.type, "button")) {
+ /*
+ * Ugh, a button for a script.
+ */
+ not_impl = "[BUTTON Input]";
+ }
+ if (not_impl != NULL) {
+ if (me->inUnderline == FALSE) {
+ HText_appendCharacter(me->text,
+ LY_UNDERLINE_START_CHAR);
+ }
+ HTML_put_string(me, not_impl);
+ if (usingval != NULL) {
+ HTML_put_string(me, usingval);
+ FREE(usingval);
+ } else {
+ HTML_put_string(me, " (not implemented)");
+ }
+ if (me->inUnderline == FALSE) {
+ HText_appendCharacter(me->text,
+ LY_UNDERLINE_END_CHAR);
+ }
+ }
+ }
+
+ CTRACE((tfp, "Ok, we're trying type=[%s]\n", NONNULL(I.type)));
+
+ /*
+ * Check for an unclosed TEXTAREA.
+ */
+ if (me->inTEXTAREA) {
+ if (LYBadHTML(me)) {
+ LYShowBadHTML("Bad HTML: Missing TEXTAREA end tag.\n");
+ }
+ }
+
+ /*
+ * Check for an unclosed SELECT, try to close it if found.
+ */
+ if (me->inSELECT) {
+ CTRACE((tfp, "HTML: Missing SELECT end tag, faking it...\n"));
+ if (me->sp->tag_number != HTML_SELECT) {
+ SET_SKIP_STACK(HTML_SELECT);
+ }
+ HTML_end_element(me, HTML_SELECT, include);
+ }
+
+ /*
+ * Handle the INPUT as for a FORM. - FM
+ */
+ if (!(present && present[HTML_INPUT_NAME] &&
+ non_empty(value[HTML_INPUT_NAME]))) {
+ I.name = "";
+ } else if (StrChr(value[HTML_INPUT_NAME], '&') == NULL) {
+ I.name = value[HTML_INPUT_NAME];
+ } else {
+ StrAllocCopy(I_name, value[HTML_INPUT_NAME]);
+ UNESCAPE_FIELDNAME_TO_STD(&I_name);
+ I.name = I_name;
+ }
+
+ if ((present && present[HTML_INPUT_ALT] &&
+ non_empty(value[HTML_INPUT_ALT]) &&
+ I.type && !strcasecomp(I.type, "image")) &&
+ !(present && present[HTML_INPUT_VALUE] &&
+ non_empty(value[HTML_INPUT_VALUE]))) {
+ /*
+ * This is a TYPE="image" using an ALT rather than VALUE
+ * attribute to indicate the link string for text clients or
+ * GUIs with image loading off, so set the flag to use that as
+ * if it were a VALUE attribute. - FM
+ */
+ UseALTasVALUE = TRUE;
+ }
+ if (verbose_img && !clickable_images &&
+ present && present[HTML_INPUT_SRC] &&
+ non_empty(value[HTML_INPUT_SRC]) &&
+ I.type && !strcasecomp(I.type, "image")) {
+ ImageSrc = MakeNewImageValue(value);
+ } else if (clickable_images == TRUE &&
+ present && present[HTML_INPUT_SRC] &&
+ non_empty(value[HTML_INPUT_SRC]) &&
+ I.type && !strcasecomp(I.type, "image")) {
+ StrAllocCopy(href, value[HTML_INPUT_SRC]);
+ /*
+ * We have a TYPE="image" with a non-zero-length SRC attribute
+ * and want clickable images. Make the SRC's value a link if
+ * it's still not zero-length legitimizing it. - FM
+ */
+ LYLegitimizeHREF(me, &href, TRUE, TRUE);
+ if (*href) {
+
+ if (me->inA) {
+ SET_SKIP_STACK(HTML_A);
+ HTML_end_element(me, HTML_A, include);
+ }
+ me->CurrentA = HTAnchor_findChildAndLink(me->node_anchor, /* Parent */
+ NULL, /* Tag */
+ href, /* Address */
+ (HTLinkType *) 0); /* Type */
+ HText_beginAnchor(me->text, me->inUnderline, me->CurrentA);
+ if (me->inBoldH == FALSE)
+ HText_appendCharacter(me->text, LY_BOLD_START_CHAR);
+ HTML_put_string(me, VERBOSE_IMG(value,
+ HTML_INPUT_SRC,
+ "[IMAGE]"));
+ FREE(newtitle);
+ if (me->inBoldH == FALSE)
+ HText_appendCharacter(me->text, LY_BOLD_END_CHAR);
+ HText_endAnchor(me->text, 0);
+ HTML_put_character(me, '-');
+ HaveSRClink = TRUE;
+ }
+ FREE(href);
+ }
+ CTRACE((tfp, "2.Ok, we're trying type=[%s] (present=%p)\n",
+ NONNULL(I.type),
+ (const void *) present));
+ /* text+file don't go in here */
+ if ((UseALTasVALUE == TRUE) ||
+ (present && present[HTML_INPUT_VALUE] &&
+ value[HTML_INPUT_VALUE] &&
+ (*value[HTML_INPUT_VALUE] ||
+ (I.type && (!strcasecomp(I.type, "checkbox") ||
+ !strcasecomp(I.type, "radio")))))) {
+
+ /*
+ * Convert any HTML entities or decimal escaping. - FM
+ */
+ int CurrentCharSet = current_char_set;
+ BOOL CurrentEightBitRaw = HTPassEightBitRaw;
+ BOOLEAN CurrentUseDefaultRawMode = LYUseDefaultRawMode;
+ HTCJKlang CurrentHTCJK = HTCJK;
+
+ if (I.type && !strcasecomp(I.type, "hidden")) {
+ me->HiddenValue = TRUE;
+ current_char_set = LATIN1; /* Default ISO-Latin1 */
+ LYUseDefaultRawMode = TRUE;
+ HTMLSetCharacterHandling(current_char_set);
+ }
+
+ CTRACE((tfp, "3.Ok, we're trying type=[%s]\n", NONNULL(I.type)));
+ if (!I.type)
+ me->UsePlainSpace = TRUE;
+ else if (!strcasecomp(I.type, "text") ||
+#ifdef USE_FILE_UPLOAD
+ !strcasecomp(I.type, "file") ||
+#endif
+ !strcasecomp(I.type, "submit") ||
+ !strcasecomp(I.type, "image") ||
+ !strcasecomp(I.type, "reset")) {
+ CTRACE((tfp, "normal field type: %s\n", NONNULL(I.type)));
+ me->UsePlainSpace = TRUE;
+ }
+
+ StrAllocCopy(I_value,
+ ((UseALTasVALUE == TRUE)
+ ? value[HTML_INPUT_ALT]
+ : value[HTML_INPUT_VALUE]));
+ if (me->UsePlainSpace && !me->HiddenValue) {
+ I.value_cs = current_char_set;
+ }
+ CTRACE((tfp, "4.Ok, we're trying type=[%s]\n", NONNULL(I.type)));
+ TRANSLATE_AND_UNESCAPE_ENTITIES6(&I_value,
+ ATTR_CS_IN,
+ I.value_cs,
+ (BOOL) (me->UsePlainSpace &&
+ !me->HiddenValue),
+ me->UsePlainSpace,
+ me->HiddenValue);
+ I.value = I_value;
+ if (me->UsePlainSpace == TRUE) {
+ /*
+ * Convert any newlines or tabs to spaces, and trim any
+ * lead or trailing spaces. - FM
+ */
+ LYReduceBlanks(I.value);
+ }
+ me->UsePlainSpace = FALSE;
+
+ if (I.type && !strcasecomp(I.type, "hidden")) {
+ me->HiddenValue = FALSE;
+ current_char_set = CurrentCharSet;
+ LYUseDefaultRawMode = CurrentUseDefaultRawMode;
+ HTMLSetCharacterHandling(current_char_set);
+ HTPassEightBitRaw = CurrentEightBitRaw;
+ HTCJK = CurrentHTCJK;
+ }
+ } else if (HaveSRClink == TRUE) {
+ /*
+ * We put up an [IMAGE] link and '-' for a TYPE="image" and
+ * didn't get a VALUE or ALT string, so fake a "Submit" value.
+ * If we didn't put up a link, then HText_beginInput() will use
+ * "[IMAGE]-Submit". - FM
+ */
+ StrAllocCopy(I_value, "Submit");
+ I.value = I_value;
+ } else if (ImageSrc) {
+ /* [IMAGE]-Submit with verbose images and not clickable images.
+ * Use ImageSrc if no other alt or value is supplied. --LE
+ */
+ I.value = ImageSrc;
+ }
+ if (present && present[HTML_INPUT_READONLY])
+ I.readonly = YES;
+ if (present && present[HTML_INPUT_CHECKED])
+ I.checked = YES;
+ if (present && present[HTML_INPUT_SIZE] &&
+ non_empty(value[HTML_INPUT_SIZE]))
+ I.size = atoi(value[HTML_INPUT_SIZE]);
+ LimitValue(I.size, MAX_LINE);
+ if (present && present[HTML_INPUT_MAXLENGTH] &&
+ non_empty(value[HTML_INPUT_MAXLENGTH]))
+ I.maxlength = value[HTML_INPUT_MAXLENGTH];
+ if (present && present[HTML_INPUT_DISABLED])
+ I.disabled = YES;
+
+ if (present && present[HTML_INPUT_ACCEPT_CHARSET]) { /* Not yet used. */
+ I.accept_cs = (value[HTML_INPUT_ACCEPT_CHARSET]
+ ? value[HTML_INPUT_ACCEPT_CHARSET]
+ : "UNKNOWN");
+ }
+ if (present && present[HTML_INPUT_ALIGN] && /* Not yet used. */
+ non_empty(value[HTML_INPUT_ALIGN]))
+ I.align = value[HTML_INPUT_ALIGN];
+ if (present && present[HTML_INPUT_CLASS] && /* Not yet used. */
+ non_empty(value[HTML_INPUT_CLASS]))
+ I.iclass = value[HTML_INPUT_CLASS];
+ if (present && present[HTML_INPUT_ERROR] && /* Not yet used. */
+ non_empty(value[HTML_INPUT_ERROR]))
+ I.error = value[HTML_INPUT_ERROR];
+ if (present && present[HTML_INPUT_HEIGHT] && /* Not yet used. */
+ non_empty(value[HTML_INPUT_HEIGHT]))
+ I.height = value[HTML_INPUT_HEIGHT];
+ if (present && present[HTML_INPUT_WIDTH] && /* Not yet used. */
+ non_empty(value[HTML_INPUT_WIDTH]))
+ I.width = value[HTML_INPUT_WIDTH];
+ if (present && present[HTML_INPUT_ID] &&
+ non_empty(value[HTML_INPUT_ID])) {
+ I.id = value[HTML_INPUT_ID];
+ CHECK_ID(HTML_INPUT_ID);
+ }
+ if (present && present[HTML_INPUT_LANG] && /* Not yet used. */
+ non_empty(value[HTML_INPUT_LANG]))
+ I.lang = value[HTML_INPUT_LANG];
+ if (present && present[HTML_INPUT_MD] && /* Not yet used. */
+ non_empty(value[HTML_INPUT_MD]))
+ I.md = value[HTML_INPUT_MD];
+
+ chars = HText_beginInput(me->text, me->inUnderline, &I);
+ CTRACE((tfp,
+ "I.%s have %d chars, or something\n",
+ NONNULL(I.type),
+ chars));
+ /*
+ * Submit and reset buttons have values which don't change, so
+ * HText_beginInput() sets I.value to the string which should be
+ * displayed, and we'll enter that instead of underscore
+ * placeholders into the HText structure to see it instead of
+ * underscores when dumping or printing. We also won't worry about
+ * a wrap in PRE blocks, because the line editor never is invoked
+ * for submit or reset buttons. - LE & FM
+ */
+ if (I.type &&
+ (!strcasecomp(I.type, "submit") ||
+ !strcasecomp(I.type, "reset") ||
+ !strcasecomp(I.type, "image")))
+ IsSubmitOrReset = TRUE;
+
+ if (I.type && chars == 3 &&
+ !strcasecomp(I.type, "radio")) {
+ /*
+ * Put a (_) placeholder, and one space (collapsible) before
+ * the label that is expected to follow. - FM
+ */
+ HTML_put_string(me, "(_)");
+ HText_endInput(me->text);
+ chars = 0;
+ me->in_word = YES;
+ if (me->sp[0].tag_number != HTML_PRE &&
+ me->sp->style->freeFormat) {
+ HTML_put_character(me, ' ');
+ me->in_word = NO;
+ }
+ } else if (I.type && chars == 3 &&
+ !strcasecomp(I.type, "checkbox")) {
+ /*
+ * Put a [_] placeholder, and one space (collapsible) before
+ * the label that is expected to follow. - FM
+ */
+ HTML_put_string(me, "[_]");
+ HText_endInput(me->text);
+ chars = 0;
+ me->in_word = YES;
+ if (me->sp[0].tag_number != HTML_PRE &&
+ me->sp->style->freeFormat) {
+ HTML_put_character(me, ' ');
+ me->in_word = NO;
+ }
+ } else if ((me->sp[0].tag_number == HTML_PRE ||
+ !me->sp->style->freeFormat)
+ && chars > 6 &&
+ IsSubmitOrReset == FALSE) {
+ /*
+ * This is not a submit or reset button, and we are in a PRE
+ * block with a field intended to exceed 6 character widths.
+ * The code inadequately handles INPUT fields in PRE tags if
+ * wraps occur (at the right margin) for the underscore
+ * placeholders. We'll put up a minimum of 6 underscores,
+ * since we should have wrapped artificially, above, if the
+ * INPUT begins within 6 columns of the right margin, and if
+ * any more would exceed the wrap column, we'll ignore them.
+ * Note that if we somehow get tripped up and a wrap still does
+ * occur before all 6 of the underscores are output, the
+ * wrapped ones won't be treated as part of the editing window,
+ * nor be highlighted when not editing (Yuk!). - FM
+ */
+ for (i = 0; i < 6; i++) {
+ HTML_put_character(me, '_');
+ chars--;
+ }
+ }
+ CTRACE((tfp, "I.%s, %d\n", NONNULL(I.type), IsSubmitOrReset));
+ if (IsSubmitOrReset == FALSE) {
+ /*
+ * This is not a submit or reset button, so output the rest of
+ * the underscore placeholders, if any more are needed. - FM
+ */
+ if (chars > 0) {
+ for (; chars > 0; chars--)
+ HTML_put_character(me, '_');
+ HText_endInput(me->text);
+ }
+ } else {
+ if (HTCJK == JAPANESE) {
+ kcode = HText_getKcode(me->text);
+ HText_updateKcode(me->text, kanji_code);
+ specified_kcode = HText_getSpecifiedKcode(me->text);
+ HText_updateSpecifiedKcode(me->text, kanji_code);
+ }
+ if (me->sp[0].tag_number == HTML_PRE ||
+ !me->sp->style->freeFormat) {
+ /*
+ * We have a submit or reset button in a PRE block, so
+ * output the entire value from the markup. If it extends
+ * to the right margin, it will wrap there, and only the
+ * portion before that wrap will be highlighted on screen
+ * display (Yuk!) but we may as well show the rest of the
+ * full value on the next or more lines. - FM
+ */
+ while (I.value[i])
+ HTML_put_character(me, I.value[i++]);
+ } else {
+ /*
+ * The submit or reset button is not in a PRE block. Note
+ * that if a wrap occurs before outputting the entire
+ * value, the wrapped portion will not be highlighted or
+ * clearly indicated as part of the link for submission or
+ * reset (Yuk!). We'll replace any spaces in the submit or
+ * reset button value with nbsp, to promote a wrap at the
+ * space we ensured would be present before the start of
+ * the string, as when we use all underscores instead of
+ * the INPUT's actual value, but we could still get a wrap
+ * at the right margin, instead, if the value is greater
+ * than a line width for the current style. Also, if chars
+ * somehow ended up longer than the length of the actual
+ * value (shouldn't have), we'll continue padding with nbsp
+ * up to the length of chars. - FM
+ */
+ for (i = 0; I.value[i]; i++)
+ HTML_put_character(me,
+ (char) (I.value[i] == ' '
+ ? HT_NON_BREAK_SPACE
+ : I.value[i]));
+ while (i++ < chars)
+ HTML_put_character(me, HT_NON_BREAK_SPACE);
+ }
+ if (HTCJK == JAPANESE) {
+ HText_updateKcode(me->text, kcode);
+ HText_updateSpecifiedKcode(me->text, specified_kcode);
+ }
+ }
+ if (chars != 0) {
+ HText_endInput(me->text);
+ }
+ FREE(ImageSrc);
+ if (strcasecomp(NonNull(I.type), "submit"))
+ FREE(I_value);
+ FREE(I_name);
+ }
+ break;
+
+ case HTML_TEXTAREA:
+ /*
+ * Set to know we are in a textarea.
+ */
+ me->inTEXTAREA = TRUE;
+
+ /*
+ * Get ready for the value.
+ */
+ HTChunkClear(&me->textarea);
+ if (present && present[HTML_TEXTAREA_NAME] &&
+ value[HTML_TEXTAREA_NAME]) {
+ StrAllocCopy(me->textarea_name, value[HTML_TEXTAREA_NAME]);
+ me->textarea_name_cs = ATTR_CS_IN;
+ if (StrChr(value[HTML_TEXTAREA_NAME], '&') != NULL) {
+ UNESCAPE_FIELDNAME_TO_STD(&me->textarea_name);
+ }
+ } else {
+ StrAllocCopy(me->textarea_name, "");
+ }
+
+ if (present && present[HTML_TEXTAREA_ACCEPT_CHARSET]) {
+ if (value[HTML_TEXTAREA_ACCEPT_CHARSET]) {
+ StrAllocCopy(me->textarea_accept_cs, value[HTML_TEXTAREA_ACCEPT_CHARSET]);
+ TRANSLATE_AND_UNESCAPE_TO_STD(&me->textarea_accept_cs);
+ } else {
+ StrAllocCopy(me->textarea_accept_cs, "UNKNOWN");
+ }
+ } else {
+ FREE(me->textarea_accept_cs);
+ }
+
+ if (present && present[HTML_TEXTAREA_COLS] &&
+ value[HTML_TEXTAREA_COLS] &&
+ isdigit(UCH(*value[HTML_TEXTAREA_COLS]))) {
+ me->textarea_cols = atoi(value[HTML_TEXTAREA_COLS]);
+ } else {
+ int width;
+
+ width = LYcolLimit -
+ me->new_style->leftIndent - me->new_style->rightIndent;
+ if (dump_output_immediately) /* don't waste too much for this */
+ width = HTMIN(width, DFT_TEXTAREA_COLS);
+ if (width > 1 && (width - 1) * 6 < MAX_LINE - 3 -
+ me->new_style->leftIndent - me->new_style->rightIndent)
+ me->textarea_cols = width;
+ else
+ me->textarea_cols = DFT_TEXTAREA_COLS;
+ }
+ LimitValue(me->textarea_cols, MAX_TEXTAREA_COLS);
+
+ if (present && present[HTML_TEXTAREA_ROWS] &&
+ value[HTML_TEXTAREA_ROWS] &&
+ isdigit(UCH(*value[HTML_TEXTAREA_ROWS]))) {
+ me->textarea_rows = atoi(value[HTML_TEXTAREA_ROWS]);
+ } else {
+ me->textarea_rows = DFT_TEXTAREA_ROWS;
+ }
+ LimitValue(me->textarea_rows, MAX_TEXTAREA_ROWS);
+
+ /*
+ * Lynx treats disabled and readonly textarea's the same -
+ * unmodifiable in either case.
+ */
+ me->textarea_readonly = NO;
+ if (present && present[HTML_TEXTAREA_READONLY])
+ me->textarea_readonly = YES;
+
+ me->textarea_disabled = NO;
+ if (present && present[HTML_TEXTAREA_DISABLED])
+ me->textarea_disabled = YES;
+
+ if (present && present[HTML_TEXTAREA_ID]
+ && non_empty(value[HTML_TEXTAREA_ID])) {
+ StrAllocCopy(id_string, value[HTML_TEXTAREA_ID]);
+ TRANSLATE_AND_UNESCAPE_TO_STD(&id_string);
+ if ((*id_string != '\0') &&
+ (ID_A = HTAnchor_findChildAndLink(me->node_anchor, /* Parent */
+ id_string, /* Tag */
+ NULL, /* Address */
+ (HTLinkType *) 0))) { /* Type */
+ HText_beginAnchor(me->text, me->inUnderline, ID_A);
+ HText_endAnchor(me->text, 0);
+ StrAllocCopy(me->textarea_id, id_string);
+ } else {
+ FREE(me->textarea_id);
+ }
+ FREE(id_string);
+ } else {
+ FREE(me->textarea_id);
+ }
+ break;
+
+ case HTML_SELECT:
+ /*
+ * Check for an already open SELECT block. - FM
+ */
+ if (me->inSELECT) {
+ if (LYBadHTML(me)) {
+ LYShowBadHTML("Bad HTML: SELECT start tag in SELECT element. Faking SELECT end tag. *****\n");
+ }
+ if (me->sp->tag_number != HTML_SELECT) {
+ SET_SKIP_STACK(HTML_SELECT);
+ }
+ HTML_end_element(me, HTML_SELECT, include);
+ }
+
+ /*
+ * Start a new SELECT block. - FM
+ */
+ LYHandleSELECT(me,
+ present, (STRING2PTR) value,
+ include,
+ TRUE);
+ break;
+
+ case HTML_OPTION:
+ {
+ /*
+ * An option is a special case of an input field.
+ */
+ InputFieldData I;
+
+ /*
+ * Make sure we're in a select tag.
+ */
+ if (!me->inSELECT) {
+ if (LYBadHTML(me)) {
+ LYShowBadHTML("Bad HTML: OPTION tag not within SELECT tag\n");
+ }
+
+ /*
+ * Too likely to cause a crash, so we'll ignore it. - FM
+ */
+ break;
+ }
+
+ if (!me->first_option) {
+ /*
+ * Finish the data off.
+ */
+ HTChunkTerminate(&me->option);
+
+ /*
+ * Finish the previous option @@@@@
+ */
+ HText_setLastOptionValue(me->text,
+ me->option.data,
+ me->LastOptionValue,
+ MIDDLE_ORDER,
+ me->LastOptionChecked,
+ me->UCLYhndl,
+ ATTR_CS_IN);
+ }
+
+ /*
+ * If it's not a multiple option list and select popups are
+ * enabled, then don't use the checkbox/button method, and don't
+ * put anything on the screen yet.
+ */
+ if (me->first_option ||
+ HTCurSelectGroupType == F_CHECKBOX_TYPE ||
+ LYSelectPopups == FALSE) {
+ if (HTCurSelectGroupType == F_CHECKBOX_TYPE ||
+ LYSelectPopups == FALSE) {
+ /*
+ * Start a newline before each option.
+ */
+ LYEnsureSingleSpace(me);
+ } else {
+ /*
+ * Add option list designation character.
+ */
+ HText_appendCharacter(me->text, '[');
+ me->in_word = YES;
+ }
+
+ /*
+ * Inititialize.
+ */
+ memset(&I, 0, sizeof(I));
+ I.name_cs = -1;
+ I.value_cs = current_char_set;
+
+ I.type = "OPTION";
+
+ if ((present && present[HTML_OPTION_SELECTED]) ||
+ (me->first_option && LYSelectPopups == FALSE &&
+ HTCurSelectGroupType == F_RADIO_TYPE))
+ I.checked = YES;
+
+ if (present && present[HTML_OPTION_VALUE] &&
+ value[HTML_OPTION_VALUE]) {
+ /*
+ * Convert any HTML entities or decimal escaping. - FM
+ */
+ StrAllocCopy(I_value, value[HTML_OPTION_VALUE]);
+ me->HiddenValue = TRUE;
+ TRANSLATE_AND_UNESCAPE_ENTITIES6(&I_value,
+ ATTR_CS_IN,
+ ATTR_CS_IN,
+ NO,
+ me->UsePlainSpace, me->HiddenValue);
+ I.value_cs = ATTR_CS_IN;
+ me->HiddenValue = FALSE;
+
+ I.value = I_value;
+ }
+
+ if (me->select_disabled ||
+ (0 && present && present[HTML_OPTION_DISABLED])) {
+ /* 2009/5/25 - suppress check for "disabled" attribute
+ * for Debian #525934 -TD
+ */
+ I.disabled = YES;
+ }
+
+ if (present && present[HTML_OPTION_ID]
+ && non_empty(value[HTML_OPTION_ID])) {
+ if ((ID_A = HTAnchor_findChildAndLink(me->node_anchor, /* Parent */
+ value[HTML_OPTION_ID], /* Tag */
+ NULL, /* Address */
+ 0)) != NULL) { /* Type */
+ HText_beginAnchor(me->text, me->inUnderline, ID_A);
+ HText_endAnchor(me->text, 0);
+ I.id = value[HTML_OPTION_ID];
+ }
+ }
+
+ HText_beginInput(me->text, me->inUnderline, &I);
+
+ if (HTCurSelectGroupType == F_CHECKBOX_TYPE) {
+ /*
+ * Put a "[_]" placeholder, and one space (collapsible)
+ * before the label that is expected to follow. - FM
+ */
+ HText_appendCharacter(me->text, '[');
+ HText_appendCharacter(me->text, '_');
+ HText_appendCharacter(me->text, ']');
+ HText_appendCharacter(me->text, ' ');
+ HText_setLastChar(me->text, ' '); /* absorb white space */
+ me->in_word = NO;
+ } else if (LYSelectPopups == FALSE) {
+ /*
+ * Put a "(_)" placeholder, and one space (collapsible)
+ * before the label that is expected to follow. - FM
+ */
+ HText_appendCharacter(me->text, '(');
+ HText_appendCharacter(me->text, '_');
+ HText_appendCharacter(me->text, ')');
+ HText_appendCharacter(me->text, ' ');
+ HText_setLastChar(me->text, ' '); /* absorb white space */
+ me->in_word = NO;
+ }
+ }
+
+ /*
+ * Get ready for the next value.
+ */
+ HTChunkClear(&me->option);
+ if ((present && present[HTML_OPTION_SELECTED]) ||
+ (me->first_option && LYSelectPopups == FALSE &&
+ HTCurSelectGroupType == F_RADIO_TYPE))
+ me->LastOptionChecked = TRUE;
+ else
+ me->LastOptionChecked = FALSE;
+ me->first_option = FALSE;
+
+ if (present && present[HTML_OPTION_VALUE] &&
+ value[HTML_OPTION_VALUE]) {
+ if (!I_value) {
+ /*
+ * Convert any HTML entities or decimal escaping. - FM
+ */
+ StrAllocCopy(I_value, value[HTML_OPTION_VALUE]);
+ me->HiddenValue = TRUE;
+ TRANSLATE_AND_UNESCAPE_ENTITIES6(&I_value,
+ ATTR_CS_IN,
+ ATTR_CS_IN,
+ NO,
+ me->UsePlainSpace, me->HiddenValue);
+ me->HiddenValue = FALSE;
+ }
+ StrAllocCopy(me->LastOptionValue, I_value);
+ } else {
+ StrAllocCopy(me->LastOptionValue, me->option.data);
+ }
+
+ /*
+ * If this is a popup option, print its option for use in selecting
+ * option by number. - LE
+ */
+ if (HTCurSelectGroupType == F_RADIO_TYPE &&
+ LYSelectPopups &&
+ fields_are_numbered()) {
+ char marker[8];
+ int opnum = HText_getOptionNum(me->text);
+
+ if (opnum > 0 && opnum < 100000) {
+ sprintf(marker, "(%d)", opnum);
+ HTML_put_string(me, marker);
+ for (i = (int) strlen(marker); i < 5; ++i) {
+ HTML_put_character(me, '_');
+ }
+ }
+ }
+ FREE(I_value);
+ }
+ break;
+
+ case HTML_TABLE:
+ /*
+ * Not fully implemented. Just treat as a division with respect to any
+ * ALIGN attribute, with a default of HT_LEFT, or leave as a PRE block
+ * if we are presently in one. - FM
+ *
+ * Also notify simple table tracking code unless in a preformatted
+ * section, or (currently) non-left alignment.
+ *
+ * If page author is using a TABLE within PRE, it's probably formatted
+ * specifically to work well for Lynx without simple table tracking
+ * code. Cancel tracking, it would only make things worse. - kw
+ */
+#ifdef EXP_NESTED_TABLES
+ if (!nested_tables)
+#endif
+ {
+ HText_cancelStbl(me->text);
+ }
+
+ if (me->inA) {
+ SET_SKIP_STACK(HTML_A);
+ HTML_end_element(me, HTML_A, include);
+ }
+ if (me->Underline_Level > 0) {
+ SET_SKIP_STACK(HTML_U);
+ HTML_end_element(me, HTML_U, include);
+ }
+ me->inTABLE = TRUE;
+ if (me->sp->style->id == ST_Preformatted) {
+ UPDATE_STYLE;
+ CHECK_ID(HTML_TABLE_ID);
+ break;
+ }
+ if (me->Division_Level < (MAX_NESTING - 1)) {
+ me->Division_Level++;
+ } else {
+ CTRACE((tfp,
+ "HTML: ****** Maximum nesting of %d divisions/tables exceeded!\n",
+ MAX_NESTING));
+ }
+ if (present && present[HTML_TABLE_ALIGN] &&
+ non_empty(value[HTML_TABLE_ALIGN])) {
+ if (!strcasecomp(value[HTML_TABLE_ALIGN], "center")) {
+ if (no_table_center) {
+ me->DivisionAlignments[me->Division_Level] = HT_LEFT;
+ change_paragraph_style(me, styles[HTML_DLEFT]);
+ UPDATE_STYLE;
+ me->current_default_alignment =
+ styles[HTML_DLEFT]->alignment;
+ } else {
+ me->DivisionAlignments[me->Division_Level] = HT_CENTER;
+ change_paragraph_style(me, styles[HTML_DCENTER]);
+ UPDATE_STYLE;
+ me->current_default_alignment =
+ styles[HTML_DCENTER]->alignment;
+ }
+
+ stbl_align = HT_CENTER;
+
+ } else if (!strcasecomp(value[HTML_TABLE_ALIGN], "right")) {
+ me->DivisionAlignments[me->Division_Level] = HT_RIGHT;
+ change_paragraph_style(me, styles[HTML_DRIGHT]);
+ UPDATE_STYLE;
+ me->current_default_alignment = styles[HTML_DRIGHT]->alignment;
+ stbl_align = HT_RIGHT;
+ } else {
+ me->DivisionAlignments[me->Division_Level] = HT_LEFT;
+ change_paragraph_style(me, styles[HTML_DLEFT]);
+ UPDATE_STYLE;
+ me->current_default_alignment = styles[HTML_DLEFT]->alignment;
+ if (!strcasecomp(value[HTML_TABLE_ALIGN], "left") ||
+ !strcasecomp(value[HTML_TABLE_ALIGN], "justify"))
+ stbl_align = HT_LEFT;
+ }
+ } else {
+ me->DivisionAlignments[me->Division_Level] = HT_LEFT;
+ change_paragraph_style(me, styles[HTML_DLEFT]);
+ UPDATE_STYLE;
+ me->current_default_alignment = styles[HTML_DLEFT]->alignment;
+ /* stbl_align remains HT_ALIGN_NONE */
+ }
+ CHECK_ID(HTML_TABLE_ID);
+ HText_startStblTABLE(me->text, stbl_align);
+ break;
+
+ case HTML_TR:
+ /*
+ * Not fully implemented. Just start a new row, if needed, act on an
+ * ALIGN attribute if present, and check for an ID link. - FM
+ * Also notify simple table tracking code. - kw
+ */
+ if (me->inA) {
+ SET_SKIP_STACK(HTML_A);
+ HTML_end_element(me, HTML_A, include);
+ }
+ if (me->Underline_Level > 0) {
+ SET_SKIP_STACK(HTML_U);
+ HTML_end_element(me, HTML_U, include);
+ }
+ UPDATE_STYLE;
+ if (!HText_LastLineEmpty(me->text, FALSE)) {
+ HText_setLastChar(me->text, ' '); /* absorb white space */
+ HText_appendCharacter(me->text, '\r');
+ }
+ me->in_word = NO;
+
+ if (me->sp->style->id == ST_Preformatted) {
+ CHECK_ID(HTML_TR_ID);
+ me->inP = FALSE;
+ break;
+ }
+ if (LYoverride_default_alignment(me)) {
+ me->sp->style->alignment = styles[me->sp[0].tag_number]->alignment;
+ } else if (me->List_Nesting_Level >= 0 ||
+ ((me->Division_Level < 0) &&
+ (me->sp->style->id == ST_Normal ||
+ me->sp->style->id == ST_Preformatted))) {
+ me->sp->style->alignment = HT_LEFT;
+ } else {
+ me->sp->style->alignment = (short) me->current_default_alignment;
+ }
+ if (present && present[HTML_TR_ALIGN] && value[HTML_TR_ALIGN]) {
+ if (!strcasecomp(value[HTML_TR_ALIGN], "center") &&
+ !(me->List_Nesting_Level >= 0 && !me->inP)) {
+ if (no_table_center)
+ me->sp->style->alignment = HT_LEFT;
+ else
+ me->sp->style->alignment = HT_CENTER;
+ stbl_align = HT_CENTER;
+ } else if (!strcasecomp(value[HTML_TR_ALIGN], "right") &&
+ !(me->List_Nesting_Level >= 0 && !me->inP)) {
+ me->sp->style->alignment = HT_RIGHT;
+ stbl_align = HT_RIGHT;
+ } else if (!strcasecomp(value[HTML_TR_ALIGN], "left") ||
+ !strcasecomp(value[HTML_TR_ALIGN], "justify")) {
+ me->sp->style->alignment = HT_LEFT;
+ stbl_align = HT_LEFT;
+ }
+ }
+
+ CHECK_ID(HTML_TR_ID);
+ me->inP = FALSE;
+ HText_startStblTR(me->text, stbl_align);
+ break;
+
+ case HTML_THEAD:
+ case HTML_TFOOT:
+ case HTML_TBODY:
+ HText_endStblTR(me->text);
+ /*
+ * Not fully implemented. Just check for an ID link. - FM
+ */
+ if (me->inA) {
+ SET_SKIP_STACK(HTML_A);
+ HTML_end_element(me, HTML_A, include);
+ }
+ if (me->Underline_Level > 0) {
+ SET_SKIP_STACK(HTML_U);
+ HTML_end_element(me, HTML_U, include);
+ }
+ UPDATE_STYLE;
+ if (me->inTABLE) {
+ if (present && present[HTML_TR_ALIGN] && value[HTML_TR_ALIGN]) {
+ if (!strcasecomp(value[HTML_TR_ALIGN], "center")) {
+ stbl_align = HT_CENTER;
+ } else if (!strcasecomp(value[HTML_TR_ALIGN], "right")) {
+ stbl_align = HT_RIGHT;
+ } else if (!strcasecomp(value[HTML_TR_ALIGN], "left") ||
+ !strcasecomp(value[HTML_TR_ALIGN], "justify")) {
+ stbl_align = HT_LEFT;
+ }
+ }
+ HText_startStblRowGroup(me->text, stbl_align);
+ }
+ CHECK_ID(HTML_TR_ID);
+ break;
+
+ case HTML_COL:
+ case HTML_COLGROUP:
+ /*
+ * Not fully implemented. Just check for an ID link. - FM
+ */
+ if (me->inA) {
+ SET_SKIP_STACK(HTML_A);
+ HTML_end_element(me, HTML_A, include);
+ }
+ if (me->Underline_Level > 0) {
+ SET_SKIP_STACK(HTML_U);
+ HTML_end_element(me, HTML_U, include);
+ }
+ UPDATE_STYLE;
+ if (me->inTABLE) {
+ int span = 1;
+
+ if (present && present[HTML_COL_SPAN] &&
+ value[HTML_COL_SPAN] &&
+ isdigit(UCH(*value[HTML_COL_SPAN])))
+ span = atoi(value[HTML_COL_SPAN]);
+ if (present && present[HTML_COL_ALIGN] && value[HTML_COL_ALIGN]) {
+ if (!strcasecomp(value[HTML_COL_ALIGN], "center")) {
+ stbl_align = HT_CENTER;
+ } else if (!strcasecomp(value[HTML_COL_ALIGN], "right")) {
+ stbl_align = HT_RIGHT;
+ } else if (!strcasecomp(value[HTML_COL_ALIGN], "left") ||
+ !strcasecomp(value[HTML_COL_ALIGN], "justify")) {
+ stbl_align = HT_LEFT;
+ }
+ }
+ HText_startStblCOL(me->text, span, stbl_align,
+ (BOOL) (ElementNumber == HTML_COLGROUP));
+ }
+ CHECK_ID(HTML_COL_ID);
+ break;
+
+ case HTML_TH:
+ case HTML_TD:
+ if (me->inA) {
+ SET_SKIP_STACK(HTML_A);
+ HTML_end_element(me, HTML_A, include);
+ }
+ if (me->Underline_Level > 0) {
+ SET_SKIP_STACK(HTML_U);
+ HTML_end_element(me, HTML_U, include);
+ }
+ UPDATE_STYLE;
+ CHECK_ID(HTML_TD_ID);
+ /*
+ * Not fully implemented. Just add a collapsible space and break - FM
+ * Also notify simple table tracking code. - kw
+ */
+ HTML_put_character(me, ' ');
+ {
+ int colspan = 1, rowspan = 1;
+
+ if (present && present[HTML_TD_COLSPAN] &&
+ value[HTML_TD_COLSPAN] &&
+ isdigit(UCH(*value[HTML_TD_COLSPAN])))
+ colspan = atoi(value[HTML_TD_COLSPAN]);
+ if (present && present[HTML_TD_ROWSPAN] &&
+ value[HTML_TD_ROWSPAN] &&
+ isdigit(UCH(*value[HTML_TD_ROWSPAN])))
+ rowspan = atoi(value[HTML_TD_ROWSPAN]);
+ if (present && present[HTML_TD_ALIGN] && value[HTML_TD_ALIGN]) {
+ if (!strcasecomp(value[HTML_TD_ALIGN], "center")) {
+ stbl_align = HT_CENTER;
+ } else if (!strcasecomp(value[HTML_TD_ALIGN], "right")) {
+ stbl_align = HT_RIGHT;
+ } else if (!strcasecomp(value[HTML_TD_ALIGN], "left") ||
+ !strcasecomp(value[HTML_TD_ALIGN], "justify")) {
+ stbl_align = HT_LEFT;
+ }
+ }
+ HText_startStblTD(me->text, colspan, rowspan, stbl_align,
+ (BOOL) (ElementNumber == HTML_TH));
+ }
+ me->in_word = NO;
+ break;
+
+ case HTML_MATH:
+ /*
+ * We're getting it as Literal text, which, until we can process it,
+ * we'll display as is, within brackets to alert the user. - FM
+ */
+ HTChunkClear(&me->math);
+ CHECK_ID(HTML_GEN_ID);
+ break;
+
+ default:
+ break;
+
+ } /* end switch */
+
+ if (ElementNumber >= HTML_ELEMENTS ||
+ HTML_dtd.tags[ElementNumber].contents != SGML_EMPTY) {
+ if (me->skip_stack > 0) {
+ CTRACE((tfp,
+ "HTML:begin_element: internal call (level %d), leaving on stack - `%s'\n",
+ me->skip_stack, NONNULL(GetHTStyleName(me->sp->style))));
+ me->skip_stack--;
+ return status;
+ }
+ if (me->sp == me->stack) {
+ if (me->stack_overrun == FALSE) {
+ HTAlert(HTML_STACK_OVERRUN);
+ CTRACE((tfp,
+ "HTML: ****** Maximum nesting of %d tags exceeded!\n",
+ MAX_NESTING));
+ me->stack_overrun = TRUE;
+ }
+ return HT_ERROR;
+ }
+
+ CTRACE((tfp,
+ "HTML:begin_element[%d]: adding style to stack - %s (%s)\n",
+ (int) STACKLEVEL(me),
+ NONNULL(GetHTStyleName(me->new_style)),
+ HTML_dtd.tags[ElementNumber].name));
+ (me->sp)--;
+ me->sp[0].style = me->new_style; /* Stack new style */
+ me->sp[0].tag_number = ElementNumber;
+#ifdef USE_JUSTIFY_ELTS
+ if (wait_for_this_stacked_elt < 0 &&
+ HTML_dtd.tags[ElementNumber].can_justify == FALSE)
+ wait_for_this_stacked_elt = (int) (me->stack - me->sp) + MAX_NESTING;
+#endif
+ }
+#ifdef USE_JUSTIFY_ELTS
+ if (in_DT && ElementNumber == HTML_DD)
+ in_DT = FALSE;
+ else if (ElementNumber == HTML_DT)
+ in_DT = TRUE;
+#endif
+
+#if defined(USE_COLOR_STYLE)
+/* end really empty tags straight away */
+
+ if (ReallyEmptyTagNum(element_number)) {
+ CTRACE2(TRACE_STYLE,
+ (tfp, "STYLE.begin_element:ending \"EMPTY\" element style\n"));
+ HText_characterStyle(me->text, hcode, STACK_OFF);
+
+ FastTrimColorClass(HTML_dtd.tags[element_number].name,
+ HTML_dtd.tags[element_number].name_len,
+ Style_className,
+ &Style_className_end, &hcode);
+ }
+#endif /* USE_COLOR_STYLE */
+ return status;
+}
+
+/* End Element
+ * -----------
+ *
+ * When we end an element, the style must be returned to that
+ * in effect before that element. Note that anchors (etc?)
+ * don't have an associated style, so that we must scan down the
+ * stack for an element with a defined style. (In fact, the styles
+ * should be linked to the whole stack not just the top one.)
+ * TBL 921119
+ */
+static int HTML_end_element(HTStructured * me, int element_number,
+ char **include)
+{
+ static char empty[1];
+
+ int i = 0;
+ int status = HT_OK;
+ char *temp = NULL, *cp = NULL;
+ BOOL BreakFlag = FALSE;
+ BOOL intern_flag = FALSE;
+
+#ifdef USE_COLOR_STYLE
+ BOOL skip_stack_requested = FALSE;
+#endif
+ EMIT_IFDEF_USE_JUSTIFY_ELTS(BOOL reached_awaited_stacked_elt = FALSE);
+
+ if ((me->sp >= (me->stack + MAX_NESTING - 1) ||
+ element_number != me->sp[0].tag_number) &&
+ HTML_dtd.tags[element_number].contents != SGML_EMPTY) {
+ CTRACE((tfp,
+ "HTML: end of element %s when expecting end of %s\n",
+ HTML_dtd.tags[element_number].name,
+ (me->sp == me->stack + MAX_NESTING - 1) ? "none" :
+ (me->sp->tag_number < 0) ? "*invalid tag*" :
+ (me->sp->tag_number >= HTML_ELEMENTS) ? "special tag" :
+ HTML_dtd.tags[me->sp->tag_number].name));
+ }
+
+ /*
+ * If we're seeking MAPs, skip everything that's not a MAP or AREA tag. -
+ * FM
+ */
+ if (LYMapsOnly) {
+ if (!(element_number == HTML_MAP || element_number == HTML_AREA ||
+ element_number == HTML_OBJECT)) {
+ return HT_OK;
+ }
+ }
+
+ /*
+ * Pop state off stack if we didn't declare the element SGML_EMPTY in
+ * HTMLDTD.c. - FM & KW
+ */
+ if (HTML_dtd.tags[element_number].contents != SGML_EMPTY) {
+#ifdef USE_COLOR_STYLE
+ skip_stack_requested = (BOOL) (me->skip_stack > 0);
+#endif
+ if ((element_number != me->sp[0].tag_number) &&
+ me->skip_stack <= 0 &&
+ HTML_dtd.tags[HTML_LH].contents != SGML_EMPTY &&
+ (me->sp[0].tag_number == HTML_UL ||
+ me->sp[0].tag_number == HTML_OL ||
+ me->sp[0].tag_number == HTML_MENU ||
+ me->sp[0].tag_number == HTML_DIR ||
+ me->sp[0].tag_number == HTML_LI) &&
+ (element_number == HTML_H1 ||
+ element_number == HTML_H2 ||
+ element_number == HTML_H3 ||
+ element_number == HTML_H4 ||
+ element_number == HTML_H5 ||
+ element_number == HTML_H6)) {
+ /*
+ * Set the break flag if we're popping a dummy HTML_LH substituted
+ * for an HTML_H# encountered in a list.
+ */
+ BreakFlag = TRUE;
+ }
+ if (me->skip_stack == 0 && element_number == HTML_OBJECT &&
+ me->sp[0].tag_number == HTML_OBJECT_M &&
+ (me->sp < (me->stack + MAX_NESTING - 1)))
+ me->sp[0].tag_number = HTML_OBJECT;
+ if (me->skip_stack > 0) {
+ CTRACE2(TRACE_STYLE,
+ (tfp,
+ "HTML:end_element: Internal call (level %d), leaving on stack - %s\n",
+ me->skip_stack, NONNULL(GetHTStyleName(me->sp->style))));
+ me->skip_stack--;
+ } else if (element_number == HTML_OBJECT &&
+ me->sp[0].tag_number != HTML_OBJECT &&
+ me->sp[0].tag_number != HTML_OBJECT_M &&
+ me->objects_mixed_open > 0 &&
+ !(me->objects_figged_open > 0 &&
+ me->sp[0].tag_number == HTML_FIG)) {
+ /*
+ * Ignore non-corresponding OBJECT tags that we didn't push because
+ * the SGML parser was supposed to go on parsing the contents
+ * non-literally. - kw
+ */
+ CTRACE2(TRACE_STYLE,
+ (tfp, "HTML:end_element[%d]: %s (level %d), %s - %s\n",
+ (int) STACKLEVEL(me),
+ "Special OBJECT handling", me->objects_mixed_open,
+ "leaving on stack",
+ NONNULL(GetHTStyleName(me->sp->style))));
+ me->objects_mixed_open--;
+ } else if (me->stack_overrun == TRUE &&
+ element_number != me->sp[0].tag_number) {
+ /*
+ * Ignore non-corresponding tags if we had a stack overrun. This
+ * is not a completely fail-safe strategy for protection against
+ * any seriously adverse consequences of a stack overrun, and the
+ * rendering of the document will not be as intended, but we expect
+ * overruns to be rare, and this should offer reasonable protection
+ * against crashes if an overrun does occur. - FM
+ */
+ return HT_OK; /* let's pretend... */
+ } else if (element_number == HTML_SELECT &&
+ me->sp[0].tag_number != HTML_SELECT) {
+ /*
+ * Ignore non-corresponding SELECT tags, since we probably popped
+ * it and closed the SELECT block to deal with markup which amounts
+ * to a nested SELECT, or an out of order FORM end tag. - FM
+ */
+ return HT_OK;
+ } else if ((element_number != me->sp[0].tag_number) &&
+ HTML_dtd.tags[HTML_LH].contents == SGML_EMPTY &&
+ (me->sp[0].tag_number == HTML_UL ||
+ me->sp[0].tag_number == HTML_OL ||
+ me->sp[0].tag_number == HTML_MENU ||
+ me->sp[0].tag_number == HTML_DIR ||
+ me->sp[0].tag_number == HTML_LI) &&
+ (element_number == HTML_H1 ||
+ element_number == HTML_H2 ||
+ element_number == HTML_H3 ||
+ element_number == HTML_H4 ||
+ element_number == HTML_H5 ||
+ element_number == HTML_H6)) {
+ /*
+ * It's an H# for which we substituted an HTML_LH, which we've
+ * declared as SGML_EMPTY, so just return. - FM
+ */
+ return HT_OK;
+ } else if (me->sp < (me->stack + MAX_NESTING - 1)) {
+#ifdef USE_JUSTIFY_ELTS
+ if (wait_for_this_stacked_elt == me->stack - me->sp + MAX_NESTING)
+ reached_awaited_stacked_elt = TRUE;
+#endif
+ if (element_number == HTML_OBJECT) {
+ if (me->sp[0].tag_number == HTML_FIG &&
+ me->objects_figged_open > 0) {
+ /*
+ * It's an OBJECT for which we substituted a FIG, so pop
+ * the FIG and pretend that's what we are being called for.
+ * - kw
+ */
+ CTRACE2(TRACE_STYLE,
+ (tfp,
+ "HTML:end_element[%d]: %s (level %d), %s - %s\n",
+ (int) STACKLEVEL(me),
+ "Special OBJECT->FIG handling",
+ me->objects_figged_open,
+ "treating as end FIG",
+ NONNULL(GetHTStyleName(me->sp->style))));
+ me->objects_figged_open--;
+ element_number = HTML_FIG;
+ }
+ }
+ (me->sp)++;
+ CTRACE2(TRACE_STYLE,
+ (tfp,
+ "HTML:end_element[%d]: Popped style off stack - %s\n",
+ (int) STACKLEVEL(me),
+ NONNULL(GetHTStyleName(me->sp->style))));
+ } else {
+ CTRACE2(TRACE_STYLE, (tfp,
+ "Stack underflow error! Tried to pop off more styles than exist in stack\n"));
+ }
+ }
+ if (BreakFlag == TRUE) {
+#ifdef USE_JUSTIFY_ELTS
+ if (reached_awaited_stacked_elt)
+ wait_for_this_stacked_elt = -1;
+#endif
+ return HT_OK; /* let's pretend... */
+ }
+
+ /*
+ * Check for unclosed TEXTAREA. - FM
+ */
+ if (me->inTEXTAREA && element_number != HTML_TEXTAREA) {
+ if (LYBadHTML(me)) {
+ LYShowBadHTML("Bad HTML: Missing TEXTAREA end tag\n");
+ }
+ }
+
+ if (!me->text && !LYMapsOnly) {
+ UPDATE_STYLE;
+ }
+
+ /*
+ * Handle the end tag. - FM
+ */
+ switch (element_number) {
+
+ case HTML_HTML:
+ if (me->inA || me->inSELECT || me->inTEXTAREA) {
+ if (LYBadHTML(me)) {
+ char *msg = NULL;
+
+ HTSprintf0(&msg,
+ "Bad HTML: %s%s%s%s%s not closed before HTML end tag *****\n",
+ me->inSELECT ? "SELECT" : "",
+ (me->inSELECT && me->inTEXTAREA) ? ", " : "",
+ me->inTEXTAREA ? "TEXTAREA" : "",
+ (((me->inSELECT || me->inTEXTAREA) && me->inA)
+ ? ", "
+ : ""),
+ me->inA ? "A" : "");
+ LYShowBadHTML(msg);
+ FREE(msg);
+ }
+ }
+ break;
+
+ case HTML_HEAD:
+ if (me->inBASE &&
+ (LYIsUIPage3(me->node_anchor->address, UIP_LIST_PAGE, 0) ||
+ LYIsUIPage3(me->node_anchor->address, UIP_ADDRLIST_PAGE, 0))) {
+ /* If we are parsing the List Page, and have a BASE after we are
+ * done with the HEAD element, propagate it back to the node_anchor
+ * object. The base should have been inserted by showlist() to
+ * record what document the List Page is about, and other functions
+ * may later look for it in the anchor. - kw
+ */
+ StrAllocCopy(me->node_anchor->content_base, me->base_href);
+ }
+ if (HText_hasToolbar(me->text))
+ HText_appendParagraph(me->text);
+ break;
+
+ case HTML_TITLE:
+ HTChunkTerminate(&me->title);
+ HTAnchor_setTitle(me->node_anchor, me->title.data);
+ HTChunkClear(&me->title);
+ /*
+ * Check if it's a bookmark file, and if so, and multiple bookmark
+ * support is on, or it's off but this isn't the default bookmark file
+ * (e.g., because it was on before, and this is another bookmark file
+ * that has been retrieved as a previous document), insert the current
+ * description string and filepath for it. We pass the strings back to
+ * the SGML parser so that any 8 bit or multibyte/CJK characters will
+ * be handled by the parser's state and charset routines. - FM
+ */
+ if (non_empty(me->node_anchor->bookmark)) {
+ if ((LYMultiBookmarks != MBM_OFF) ||
+ (non_empty(bookmark_page) &&
+ strcmp(me->node_anchor->bookmark, bookmark_page))) {
+ if (!include)
+ include = &me->xinclude;
+ for (i = 0; i <= MBM_V_MAXFILES; i++) {
+ if (MBM_A_subbookmark[i] &&
+ !strcmp(MBM_A_subbookmark[i],
+ me->node_anchor->bookmark)) {
+ StrAllocCat(*include, "<H2><EM>");
+ StrAllocCat(*include, gettext("Description:"));
+ StrAllocCat(*include, "</EM> ");
+ StrAllocCopy(temp,
+ ((MBM_A_subdescript[i] &&
+ *MBM_A_subdescript[i]) ?
+ MBM_A_subdescript[i] : gettext("(none)")));
+ LYEntify(&temp, TRUE);
+ StrAllocCat(*include, temp);
+ StrAllocCat(*include, "<BR><EM>&nbsp;&nbsp;&nbsp;");
+ StrAllocCat(*include, gettext("Filepath:"));
+ StrAllocCat(*include, "</EM> ");
+ StrAllocCopy(temp,
+ ((MBM_A_subbookmark[i] &&
+ *MBM_A_subbookmark[i])
+ ? MBM_A_subbookmark[i]
+ : gettext("(unknown)")));
+ LYEntify(&temp, TRUE);
+ StrAllocCat(*include, temp);
+ FREE(temp);
+ StrAllocCat(*include, "</H2>");
+ break;
+ }
+ }
+ }
+ }
+ break;
+
+ case HTML_STYLE:
+ /*
+ * We're getting it as Literal text, which, for now, we'll just ignore.
+ * - FM
+ */
+ HTChunkTerminate(&me->style_block);
+ CTRACE2(TRACE_STYLE,
+ (tfp, "HTML: STYLE content =\n%s\n",
+ me->style_block.data));
+ HTChunkClear(&me->style_block);
+ break;
+
+ case HTML_SCRIPT:
+ /*
+ * We're getting it as Literal text, which, for now, we'll just ignore.
+ * - FM
+ */
+ HTChunkTerminate(&me->script);
+ CTRACE((tfp, "HTML: SCRIPT content =\n%s\n",
+ me->script.data));
+ HTChunkClear(&me->script);
+ break;
+
+ case HTML_BODY:
+ if (me->inA || me->inSELECT || me->inTEXTAREA) {
+ if (LYBadHTML(me)) {
+ char *msg = NULL;
+
+ HTSprintf0(&msg,
+ "Bad HTML: %s%s%s%s%s not closed before BODY end tag *****\n",
+ me->inSELECT ? "SELECT" : "",
+ (me->inSELECT && me->inTEXTAREA) ? ", " : "",
+ me->inTEXTAREA ? "TEXTAREA" : "",
+ (((me->inSELECT || me->inTEXTAREA) && me->inA)
+ ? ", "
+ : ""),
+ me->inA ? "A" : "");
+ LYShowBadHTML(msg);
+ FREE(msg);
+ }
+ }
+ break;
+
+ case HTML_FRAMESET:
+ change_paragraph_style(me, me->sp->style); /* Often won't really change */
+ break;
+
+ case HTML_NOFRAMES:
+ case HTML_IFRAME:
+ LYEnsureDoubleSpace(me);
+ LYResetParagraphAlignment(me);
+ change_paragraph_style(me, me->sp->style); /* Often won't really change */
+ break;
+
+ case HTML_BANNER:
+ case HTML_MARQUEE:
+ case HTML_BLOCKQUOTE:
+ case HTML_BQ:
+ case HTML_ADDRESS:
+ /*
+ * Set flag to know that style has ended. Fall through.
+ i_prior_style = -1;
+ */
+ change_paragraph_style(me, me->sp->style);
+ UPDATE_STYLE;
+ if (me->sp->tag_number == element_number)
+ LYEnsureDoubleSpace(me);
+ if (me->List_Nesting_Level >= 0)
+ HText_NegateLineOne(me->text);
+ break;
+
+ case HTML_CENTER:
+ case HTML_DIV:
+ if (me->Division_Level >= 0)
+ me->Division_Level--;
+ if (me->Division_Level >= 0) {
+ if (me->sp->style->alignment !=
+ me->DivisionAlignments[me->Division_Level]) {
+ if (me->inP)
+ LYEnsureSingleSpace(me);
+ me->sp->style->alignment =
+ me->DivisionAlignments[me->Division_Level];
+ }
+ }
+ change_paragraph_style(me, me->sp->style);
+ if (me->style_change) {
+ actually_set_style(me);
+ if (me->List_Nesting_Level >= 0)
+ HText_NegateLineOne(me->text);
+ } else if (me->inP)
+ LYEnsureSingleSpace(me);
+ me->current_default_alignment = me->sp->style->alignment;
+ break;
+
+ case HTML_H1: /* header styles */
+ case HTML_H2:
+ case HTML_H3:
+ case HTML_H4:
+ case HTML_H5:
+ case HTML_H6:
+ if (me->Division_Level >= 0) {
+ me->sp->style->alignment =
+ me->DivisionAlignments[me->Division_Level];
+ } else if (me->sp->style->id == ST_HeadingCenter ||
+ me->sp->style->id == ST_Heading1) {
+ me->sp->style->alignment = HT_CENTER;
+ } else if (me->sp->style->id == ST_HeadingRight) {
+ me->sp->style->alignment = HT_RIGHT;
+ } else {
+ me->sp->style->alignment = HT_LEFT;
+ }
+ change_paragraph_style(me, me->sp->style);
+ UPDATE_STYLE;
+ if (styles[element_number]->font & HT_BOLD) {
+ if (me->inBoldA == FALSE && me->inBoldH == TRUE) {
+ HText_appendCharacter(me->text, LY_BOLD_END_CHAR);
+ }
+ me->inBoldH = FALSE;
+ }
+ if (me->List_Nesting_Level >= 0)
+ HText_NegateLineOne(me->text);
+ if (me->Underline_Level > 0 && me->inUnderline == FALSE) {
+ HText_appendCharacter(me->text, LY_UNDERLINE_START_CHAR);
+ me->inUnderline = TRUE;
+ }
+ break;
+
+ case HTML_P:
+ LYHandlePlike(me,
+ (const BOOL *) 0, (STRING2PTR) 0,
+ include, 0,
+ FALSE);
+ break;
+
+ case HTML_FONT:
+ me->inFONT = FALSE;
+ break;
+
+ case HTML_B: /* Physical character highlighting */
+ case HTML_BLINK:
+ case HTML_I:
+ case HTML_U:
+
+ case HTML_CITE: /* Logical character highlighting */
+ case HTML_EM:
+ case HTML_STRONG:
+ /*
+ * Ignore any emphasis end tags if the Underline_Level is not set. -
+ * FM
+ */
+ if (me->Underline_Level <= 0)
+ break;
+
+ /*
+ * Adjust the Underline level counter, and turn off underlining if
+ * appropriate. - FM
+ */
+ me->Underline_Level--;
+ if (me->inUnderline && me->Underline_Level < 1) {
+ HText_appendCharacter(me->text, LY_UNDERLINE_END_CHAR);
+ me->inUnderline = FALSE;
+ CTRACE((tfp, "Ending underline\n"));
+ } else {
+ CTRACE((tfp, "Underline Level is %d\n", me->Underline_Level));
+ }
+ break;
+
+ case HTML_ABBR: /* Miscellaneous character containers */
+ case HTML_ACRONYM:
+ case HTML_AU:
+ case HTML_AUTHOR:
+ case HTML_BIG:
+ case HTML_CODE:
+ case HTML_DFN:
+ case HTML_KBD:
+ case HTML_SAMP:
+ case HTML_SMALL:
+ case HTML_SUP:
+ case HTML_TT:
+ case HTML_VAR:
+ break;
+
+ case HTML_SUB:
+ HText_appendCharacter(me->text, ']');
+ break;
+
+ case HTML_DEL_2:
+ case HTML_DEL:
+ case HTML_S:
+ case HTML_STRIKE:
+ HTML_put_character(me, ' ');
+ if (me->inUnderline == FALSE)
+ HText_appendCharacter(me->text, LY_UNDERLINE_START_CHAR);
+ HTML_put_string(me, ":DEL]");
+ if (me->inUnderline == FALSE)
+ HText_appendCharacter(me->text, LY_UNDERLINE_END_CHAR);
+ HTML_put_character(me, ' ');
+ me->in_word = NO;
+ break;
+
+ case HTML_INS_2:
+ case HTML_INS:
+ HTML_put_character(me, ' ');
+ if (me->inUnderline == FALSE)
+ HText_appendCharacter(me->text, LY_UNDERLINE_START_CHAR);
+ HTML_put_string(me, ":INS]");
+ if (me->inUnderline == FALSE)
+ HText_appendCharacter(me->text, LY_UNDERLINE_END_CHAR);
+ HTML_put_character(me, ' ');
+ me->in_word = NO;
+ break;
+
+ case HTML_Q:
+ if (me->Quote_Level > 0)
+ me->Quote_Level--;
+ /*
+ * Should check LANG and/or DIR attributes, and the
+ * me->node_anchor->charset and/or yet to be added structure elements,
+ * to determine whether we should use chevrons, but for now we'll
+ * always use double- or single-quotes. - FM
+ */
+ if (!(me->Quote_Level & 1))
+ HTML_put_character(me, '"');
+ else
+ HTML_put_character(me, '\'');
+ break;
+
+ case HTML_PRE: /* Formatted text */
+ /*
+ * Set to know that we are no longer in a PRE block.
+ */
+ HText_appendCharacter(me->text, '\n');
+ me->inPRE = FALSE;
+ /* FALLTHRU */
+ case HTML_LISTING: /* Literal text */
+ /* FALLTHRU */
+ case HTML_XMP:
+ /* FALLTHRU */
+ case HTML_PLAINTEXT:
+ if (me->comment_start)
+ HText_appendText(me->text, me->comment_start);
+ change_paragraph_style(me, me->sp->style); /* Often won't really change */
+ if (me->List_Nesting_Level >= 0) {
+ UPDATE_STYLE;
+ HText_NegateLineOne(me->text);
+ }
+ break;
+
+ case HTML_NOTE:
+ case HTML_FN:
+ change_paragraph_style(me, me->sp->style); /* Often won't really change */
+ UPDATE_STYLE;
+ if (me->sp->tag_number == element_number)
+ LYEnsureDoubleSpace(me);
+ if (me->List_Nesting_Level >= 0)
+ HText_NegateLineOne(me->text);
+ me->inLABEL = FALSE;
+ break;
+
+ case HTML_OL:
+ me->OL_Counter[me->List_Nesting_Level < 11 ?
+ me->List_Nesting_Level : 11] = OL_VOID;
+ /* FALLTHRU */
+ case HTML_DL:
+ /* FALLTHRU */
+ case HTML_UL:
+ /* FALLTHRU */
+ case HTML_MENU:
+ /* FALLTHRU */
+ case HTML_DIR:
+ me->List_Nesting_Level--;
+ CTRACE((tfp, "HTML_end_element: Reducing List Nesting Level to %d\n",
+ me->List_Nesting_Level));
+#ifdef USE_JUSTIFY_ELTS
+ if (element_number == HTML_DL)
+ in_DT = FALSE; /*close the term that was without definition. */
+#endif
+ change_paragraph_style(me, me->sp->style); /* Often won't really change */
+ UPDATE_STYLE;
+ if (me->List_Nesting_Level >= 0)
+ LYEnsureSingleSpace(me);
+ break;
+
+ case HTML_SPAN:
+ /*
+ * Should undo anything we did based on LANG and/or DIR attributes, and
+ * the me->node_anchor->charset and/or yet to be added structure
+ * elements. - FM
+ */
+ break;
+
+ case HTML_BDO:
+ /*
+ * Should undo anything we did based on DIR (and/or LANG) attributes,
+ * and the me->node_anchor->charset and/or yet to be added structure
+ * elements. - FM
+ */
+ break;
+
+ case HTML_A:
+ /*
+ * Ignore any spurious A end tags. - FM
+ */
+ if (me->inA == FALSE)
+ break;
+ /*
+ * Set to know that we are no longer in an anchor.
+ */
+ me->inA = FALSE;
+#ifdef MARK_HIDDEN_LINKS
+ if (non_empty(hidden_link_marker) &&
+ HText_isAnchorBlank(me->text, me->CurrentANum)) {
+ HText_appendText(me->text, hidden_link_marker);
+ }
+#endif
+ UPDATE_STYLE;
+ if (me->inBoldA == TRUE && me->inBoldH == FALSE)
+ HText_appendCharacter(me->text, LY_BOLD_END_CHAR);
+ HText_endAnchor(me->text, me->CurrentANum);
+ me->CurrentANum = 0;
+ me->inBoldA = FALSE;
+ if (me->Underline_Level > 0 && me->inUnderline == FALSE) {
+ HText_appendCharacter(me->text, LY_UNDERLINE_START_CHAR);
+ me->inUnderline = TRUE;
+ }
+ break;
+
+ case HTML_MAP:
+ FREE(me->map_address);
+ break;
+
+ case HTML_BODYTEXT:
+ /*
+ * We may need to look at this someday to deal with OBJECTs optimally,
+ * but just ignore it for now. - FM
+ */
+ change_paragraph_style(me, me->sp->style); /* Often won't really change */
+ break;
+
+ case HTML_TEXTFLOW:
+ /*
+ * We may need to look at this someday to deal with APPLETs optimally,
+ * but just ignore it for now. - FM
+ */
+ change_paragraph_style(me, me->sp->style); /* Often won't really change */
+ break;
+
+ case HTML_FIG:
+ LYHandleFIG(me, NULL, NULL,
+ 0,
+ 0,
+ NULL,
+ NULL, NO, FALSE, &intern_flag);
+ break;
+
+ case HTML_OBJECT:
+ /*
+ * Finish the data off.
+ */
+ {
+ int s = 0, e = 0;
+ char *start = NULL, *first_end = NULL, *last_end = NULL;
+ char *first_map = NULL, *last_map = NULL;
+ BOOL have_param = FALSE;
+ char *data = NULL;
+
+ HTChunkTerminate(&me->object);
+ data = me->object.data;
+ while ((cp = StrChr(data, '<')) != NULL) {
+ /*
+ * Look for nested OBJECTs. This procedure could get tripped
+ * up if invalid comments are present in the content, or if an
+ * OBJECT end tag is present in a quoted attribute. - FM
+ */
+ if (!StrNCmp(cp, "<!--", 4)) {
+ data = LYFindEndOfComment(cp);
+ cp = data;
+ } else if (s == 0 && !strncasecomp(cp, "<PARAM", 6) &&
+ !IsNmChar(cp[6])) {
+ have_param = TRUE;
+ } else if (!strncasecomp(cp, "<OBJECT", 7) &&
+ !IsNmChar(cp[7])) {
+ if (s == 0)
+ start = cp;
+ s++;
+ } else if (!strncasecomp(cp, "</OBJECT", 8) &&
+ !IsNmChar(cp[8])) {
+ if (e == 0)
+ first_end = cp;
+ last_end = cp;
+ e++;
+ } else if (!strncasecomp(cp, "<MAP", 4) &&
+ !IsNmChar(cp[4])) {
+ if (!first_map)
+ first_map = cp;
+ last_map = cp;
+ } else if (!strncasecomp(cp, "</MAP", 5) &&
+ !IsNmChar(cp[5])) {
+ last_map = cp;
+ }
+ data = ++cp;
+ }
+ if (s < e) {
+ /*
+ * We had more end tags than start tags, so we have bad HTML or
+ * otherwise misparsed. - FM
+ */
+ if (LYBadHTML(me)) {
+ char *msg = NULL;
+
+ HTSprintf0(&msg,
+ "Bad HTML: Unmatched OBJECT start and end tags. Discarding content:\n%s\n",
+ me->object.data);
+ LYShowBadHTML(msg);
+ FREE(msg);
+ }
+ goto End_Object;
+ }
+ if (s > e) {
+ if (!me->object_declare && !me->object_name &&
+ !(me->object_shapes && !LYMapsOnly) &&
+ !(me->object_usemap != NULL && !LYMapsOnly) &&
+ !(clickable_images && !LYMapsOnly &&
+ me->object_data != NULL &&
+ !have_param &&
+ me->object_classid == NULL &&
+ me->object_codebase == NULL &&
+ me->object_codetype == NULL)) {
+ /*
+ * We have nested OBJECT tags, and not yet all of the end
+ * tags, but have a case where the content needs to be
+ * parsed again (not dropped) and where we don't want to
+ * output anything special at the point when we
+ * *do* have accumulated all the end tags. So recycle
+ * the incomplete contents now, and signal the SGML parser
+ * that it should not regard the current OBJECT ended but
+ * should treat its contents as mixed. Normally these
+ * cases would have already handled in the real
+ * start_element call, so this block may not be necessary.
+ * - kw
+ */
+ CTRACE((tfp, "%s:\n%s\n",
+ "HTML: Nested OBJECT tags. Recycling incomplete contents",
+ me->object.data));
+ status = HT_PARSER_OTHER_CONTENT;
+ me->object.size--;
+ HTChunkPuts(&me->object, "</OBJECT>");
+ if (!include) /* error, should not happen */
+ include = &me->xinclude;
+ StrnAllocCat(*include, me->object.data, (size_t) me->object.size);
+ clear_objectdata(me);
+ /* an internal fake call to keep our stack happy: */
+ HTML_start_element(me, HTML_OBJECT, NULL, NULL,
+ me->tag_charset, include);
+ break;
+ }
+ /*
+ * We have nested OBJECT tags, and not yet all of the end tags,
+ * and we want the end tags. So restore an end tag to the
+ * content, and signal to the SGML parser that it should resume
+ * the accumulation of OBJECT content (after calling back to
+ * start_element) in a way that is equivalent to passing it a
+ * dummy start tag. - FM, kw
+ */
+ CTRACE((tfp, "HTML: Nested OBJECT tags. Recycling.\n"));
+ status = HT_PARSER_REOPEN_ELT;
+ me->object.size--;
+ HTChunkPuts(&me->object, "</OBJECT>");
+ if (!LYMapsOnly)
+ change_paragraph_style(me, me->sp->style);
+ break;
+ }
+
+ /*
+ * OBJECT start and end tags are fully matched, assuming we weren't
+ * tripped up by comments or quoted attributes. - FM
+ */
+ CTRACE((tfp, "HTML:OBJECT content:\n%s\n", me->object.data));
+
+ /*
+ * OBJECTs with DECLARE should be saved but not instantiated, and
+ * if nested, can have only other DECLAREd OBJECTs. Until we have
+ * code to handle these, we'll just create an anchor for the ID, if
+ * present, and discard the content (sigh 8-). - FM
+ */
+ if (me->object_declare == TRUE) {
+ if (non_empty(me->object_id) && !LYMapsOnly)
+ LYHandleID(me, me->object_id);
+ CTRACE((tfp, "HTML: DECLAREd OBJECT. Ignoring!\n"));
+ goto End_Object;
+ }
+
+ /*
+ * OBJECTs with NAME are for FORM submissions. We'll just create
+ * an anchor for the ID, if present, and discard the content until
+ * we have code to handle these. (sigh 8-). - FM
+ */
+ if (me->object_name != NULL && !LYMapsOnly) {
+ if (non_empty(me->object_id))
+ LYHandleID(me, me->object_id);
+ CTRACE((tfp, "HTML: NAMEd OBJECT. Ignoring!\n"));
+ goto End_Object;
+ }
+
+ /*
+ * Deal with any nested OBJECTs by descending to the inner-most
+ * OBJECT. - FM
+ */
+ if (s > 0) {
+ if (start != NULL &&
+ first_end != NULL && first_end > start) {
+ /*
+ * Minimum requirements for the ad hoc parsing to have
+ * succeeded are met. We'll hope that it did succeed. -
+ * FM
+ */
+ if (LYMapsOnly) {
+ /*
+ * Well we don't need to do this any more, nested
+ * objects should either not get here any more at all
+ * or can be handled fine by other code below. Leave
+ * in place for now as a special case for LYMapsOnly.
+ * - kw
+ */
+ if (LYMapsOnly && (!last_map || last_map < first_end))
+ *first_end = '\0';
+ else
+ e = 0;
+ data = NULL;
+ if (LYMapsOnly && (!first_map || first_map > start))
+ StrAllocCopy(data, start);
+ else
+ StrAllocCopy(data, me->object.data);
+ if (e > 0) {
+ for (i = e; i > 0; i--) {
+ StrAllocCat(data, "</OBJECT>");
+ }
+ }
+ if (!include) /* error, should not happen */
+ include = &me->xinclude;
+ StrAllocCat(*include, data);
+ CTRACE((tfp, "HTML: Recycling nested OBJECT%s.\n",
+ (s > 1) ? "s" : ""));
+ FREE(data);
+ goto End_Object;
+ }
+ } else {
+ if (LYBadHTML(me)) {
+ LYShowBadHTML("Bad HTML: Unmatched OBJECT start and end tags. Discarding content.\n");
+ }
+ goto End_Object;
+ }
+ }
+
+ /*
+ * If its content has SHAPES, convert it to FIG. - FM
+ *
+ * This is now handled in our start_element without using include
+ * if the SGML parser cooperates, so this block may be unnecessary.
+ * - kw
+ */
+ if (me->object_shapes == TRUE && !LYMapsOnly) {
+ CTRACE((tfp, "HTML: OBJECT has SHAPES. Converting to FIG.\n"));
+ if (!include) /* error, should not happen */
+ include = &me->xinclude;
+ StrAllocCat(*include, "<FIG ISOBJECT IMAGEMAP");
+ if (me->object_ismap == TRUE)
+ StrAllocCat(*include, " IMAGEMAP");
+ if (me->object_id != NULL) {
+ StrAllocCat(*include, " ID=\"");
+ StrAllocCat(*include, me->object_id);
+ StrAllocCat(*include, "\"");
+ }
+ if (me->object_data != NULL &&
+ me->object_classid == NULL) {
+ StrAllocCat(*include, " SRC=\"");
+ StrAllocCat(*include, me->object_data);
+ StrAllocCat(*include, "\"");
+ }
+ StrAllocCat(*include, ">");
+ me->object.size--;
+ HTChunkPuts(&me->object, "</FIG>");
+ HTChunkTerminate(&me->object);
+ StrAllocCat(*include, me->object.data);
+ goto End_Object;
+ }
+
+ /*
+ * If it has a USEMAP attribute and didn't have SHAPES, convert it
+ * to IMG. - FM
+ */
+ if (me->object_usemap != NULL && !LYMapsOnly) {
+ CTRACE((tfp, "HTML: OBJECT has USEMAP. Converting to IMG.\n"));
+
+ if (!include) /* error, should not happen */
+ include = &me->xinclude;
+ StrAllocCat(*include, "<IMG ISOBJECT");
+ if (me->object_id != NULL) {
+ /*
+ * Pass the ID. - FM
+ */
+ StrAllocCat(*include, " ID=\"");
+ StrAllocCat(*include, me->object_id);
+ StrAllocCat(*include, "\"");
+ }
+ if (me->object_data != NULL &&
+ me->object_classid == NULL) {
+ /*
+ * We have DATA with no CLASSID, so let's hope it'
+ * equivalent to an SRC. - FM
+ */
+ StrAllocCat(*include, " SRC=\"");
+ StrAllocCat(*include, me->object_data);
+ StrAllocCat(*include, "\"");
+ }
+ if (me->object_title != NULL) {
+ /*
+ * Use the TITLE for both the MAP and the IMGs ALT. - FM
+ */
+ StrAllocCat(*include, " TITLE=\"");
+ StrAllocCat(*include, me->object_title);
+ StrAllocCat(*include, "\" ALT=\"");
+ StrAllocCat(*include, me->object_title);
+ StrAllocCat(*include, "\"");
+ }
+ /*
+ * Add the USEMAP, and an ISMAP if present. - FM
+ */
+ if (me->object_usemap != NULL) {
+ StrAllocCat(*include, " USEMAP=\"");
+ StrAllocCat(*include, me->object_usemap);
+ if (me->object_ismap == TRUE)
+ StrAllocCat(*include, "\" ISMAP>");
+ else
+ StrAllocCat(*include, "\">");
+ } else {
+ StrAllocCat(*include, ">");
+ }
+ /*
+ * Add the content if it has <MAP, since that may be the MAP
+ * this usemap points to. But if we have nested objects, try
+ * to eliminate portions that cannot contribute to the quest
+ * for MAP. This is not perfect, we may get too much content;
+ * this seems preferable over losing too much. - kw
+ */
+ if (first_map) {
+ if (s == 0) {
+ StrAllocCat(*include, me->object.data);
+ CTRACE((tfp,
+ "HTML: MAP found, recycling object contents.\n"));
+ goto End_Object;
+ }
+ /* s > 0 and s == e */
+ data = NULL;
+ if (last_map < start) {
+ *start = '\0';
+ i = 0;
+ } else if (last_map < first_end) {
+ *first_end = '\0';
+ i = e;
+ } else if (last_map < last_end) {
+ *last_end = '\0';
+ i = 1;
+ } else {
+ i = 0;
+ }
+ if (first_map > last_end) {
+ /* fake empty object to keep stacks stack happy */
+ StrAllocCopy(data, "<OBJECT><");
+ StrAllocCat(data, last_end + 1);
+ i = 0;
+ } else if (first_map > start) {
+ StrAllocCopy(data, start);
+ } else {
+ StrAllocCopy(data, me->object.data);
+ }
+ for (; i > 0; i--) {
+ StrAllocCat(data, "</OBJECT>");
+ }
+ CTRACE((tfp, "%s:\n%s\n",
+ "HTML: MAP and nested OBJECT tags. Recycling parts",
+ data));
+ StrAllocCat(*include, data);
+ FREE(data);
+ }
+ goto End_Object;
+ }
+
+ /*
+ * Add an ID link if needed. - FM
+ */
+ if (non_empty(me->object_id) && !LYMapsOnly)
+ LYHandleID(me, me->object_id);
+
+ /*
+ * Add the OBJECTs content if not empty. - FM
+ */
+ if (me->object.size > 1) {
+ if (!include) /* error, should not happen */
+ include = &me->xinclude;
+ StrAllocCat(*include, me->object.data);
+ }
+
+ /*
+ * Create a link to the DATA, if desired, and we can rule out that
+ * it involves scripting code. This a risky thing to do, but we
+ * can toggle clickable_images mode off if it really screws things
+ * up, and so we may as well give it a try. - FM
+ */
+ if (clickable_images) {
+ if (!LYMapsOnly &&
+ me->object_data != NULL &&
+ !have_param &&
+ me->object_classid == NULL &&
+ me->object_codebase == NULL &&
+ me->object_codetype == NULL) {
+ /*
+ * We have a DATA value and no need for scripting code, so
+ * close the current Anchor, if one is open, and add an
+ * Anchor for this source. If we also have a TYPE value,
+ * check whether it's an image or not, and set the link
+ * name accordingly. - FM
+ */
+ if (!include) /* error, should not happen */
+ include = &me->xinclude;
+ if (me->inA)
+ StrAllocCat(*include, "</A>");
+ StrAllocCat(*include, " -<A HREF=\"");
+ StrAllocCat(*include, me->object_data);
+ StrAllocCat(*include, "\">");
+ if ((me->object_type != NULL) &&
+ !strncasecomp(me->object_type, "image/", 6)) {
+ StrAllocCat(*include, "(IMAGE)");
+ } else {
+ StrAllocCat(*include, "(OBJECT)");
+ }
+ StrAllocCat(*include, "</A> ");
+ }
+ }
+ }
+
+ /*
+ * Re-intialize all of the OBJECT elements. - FM
+ */
+ End_Object:
+ clear_objectdata(me);
+
+ if (!LYMapsOnly)
+ change_paragraph_style(me, me->sp->style); /* Often won't really change */
+ break;
+
+ case HTML_APPLET:
+ if (me->inAPPLETwithP) {
+ LYEnsureDoubleSpace(me);
+ } else {
+ HTML_put_character(me, ' '); /* space char may be ignored */
+ }
+ LYResetParagraphAlignment(me);
+ me->inAPPLETwithP = FALSE;
+ me->inAPPLET = FALSE;
+ change_paragraph_style(me, me->sp->style); /* Often won't really change */
+ break;
+
+ case HTML_CAPTION:
+ LYEnsureDoubleSpace(me);
+ LYResetParagraphAlignment(me);
+ me->inCAPTION = FALSE;
+ change_paragraph_style(me, me->sp->style); /* Often won't really change */
+ me->inLABEL = FALSE;
+ break;
+
+ case HTML_CREDIT:
+ LYEnsureDoubleSpace(me);
+ LYResetParagraphAlignment(me);
+ me->inCREDIT = FALSE;
+ change_paragraph_style(me, me->sp->style); /* Often won't really change */
+ me->inLABEL = FALSE;
+ break;
+
+ case HTML_FORM:
+ /*
+ * Check if we had a FORM start tag, and issue a message if not, but
+ * fall through to check for an open SELECT and ensure that the
+ * FORM-related globals in GridText.c are initialized. - FM
+ */
+ if (!me->inFORM) {
+ if (LYBadHTML(me)) {
+ LYShowBadHTML("Bad HTML: Unmatched FORM end tag\n");
+ }
+ }
+ EMIT_IFDEF_USE_JUSTIFY_ELTS(form_in_htext = FALSE);
+
+ /*
+ * Check if we still have a SELECT element open. FORM may have been
+ * declared SGML_EMPTY in HTMLDTD.c, and in that case SGML_character()
+ * in SGML.c is not able to ensure correct nesting; or it may have
+ * failed to enforce valid nesting. If a SELECT is open, issue a
+ * message, then call HTML_end_element() directly (with a check in that
+ * to bypass decrementing of the HTML parser's stack) to close the
+ * SELECT. - kw
+ */
+ if (me->inSELECT) {
+ if (LYBadHTML(me)) {
+ LYShowBadHTML("Bad HTML: Open SELECT at FORM end. Faking SELECT end tag. *****\n");
+ }
+ if (me->sp->tag_number != HTML_SELECT) {
+ SET_SKIP_STACK(HTML_SELECT);
+ }
+ HTML_end_element(me, HTML_SELECT, include);
+ }
+
+ /*
+ * Set to know that we are no longer in an form.
+ */
+ me->inFORM = FALSE;
+
+ HText_endForm(me->text);
+ /*
+ * If we are in a list and are on the first line with no text following
+ * a bullet or number, don't force a newline. This could happen if we
+ * were called from HTML_start_element() due to a missing FORM end tag.
+ * - FM
+ */
+ if (!(me->List_Nesting_Level >= 0 && !me->inP))
+ LYEnsureSingleSpace(me);
+ break;
+
+ case HTML_FIELDSET:
+ LYEnsureDoubleSpace(me);
+ LYResetParagraphAlignment(me);
+ change_paragraph_style(me, me->sp->style); /* Often won't really change */
+ break;
+
+ case HTML_LEGEND:
+ LYEnsureDoubleSpace(me);
+ LYResetParagraphAlignment(me);
+ change_paragraph_style(me, me->sp->style); /* Often won't really change */
+ break;
+
+ case HTML_LABEL:
+ break;
+
+ case HTML_BUTTON:
+ break;
+
+ case HTML_TEXTAREA:
+ {
+ InputFieldData I;
+ int chars;
+ char *data;
+
+ /*
+ * Make sure we had a textarea start tag.
+ */
+ if (!me->inTEXTAREA) {
+ if (LYBadHTML(me)) {
+ LYShowBadHTML("Bad HTML: Unmatched TEXTAREA end tag\n");
+ }
+ break;
+ }
+
+ /*
+ * Set to know that we are no longer in a textarea tag.
+ */
+ me->inTEXTAREA = FALSE;
+
+ /*
+ * Initialize.
+ */
+ memset(&I, 0, sizeof(I));
+ I.value_cs = current_char_set;
+
+ UPDATE_STYLE;
+ /*
+ * Before any input field add a space if necessary.
+ */
+ HTML_put_character(me, ' ');
+ me->in_word = NO;
+ /*
+ * Add a return.
+ */
+ HText_appendCharacter(me->text, '\r');
+
+ /*
+ * Finish the data off.
+ */
+ HTChunkTerminate(&me->textarea);
+ FREE(temp);
+
+ I.type = "textarea";
+ I.size = me->textarea_cols;
+ I.name = me->textarea_name;
+ I.name_cs = me->textarea_name_cs;
+ I.accept_cs = me->textarea_accept_cs;
+ me->textarea_accept_cs = NULL;
+ I.disabled = me->textarea_disabled;
+ I.readonly = me->textarea_readonly;
+ I.id = me->textarea_id;
+
+ /*
+ * Transform the TEXTAREA content as needed, then parse it into
+ * individual lines to be handled as a series series of INPUT
+ * fields (ugh!). Any raw 8-bit or multibyte characters already
+ * have been handled in relation to the display character set in
+ * SGML_character().
+ *
+ * If TEXTAREA is handled as SGML_LITTERAL (the old way), we need
+ * to SGML-unescape any character references and NCRs here.
+ * Otherwise this will already have happened in the SGML.c parsing.
+ * - kw
+ */
+ me->UsePlainSpace = TRUE;
+
+ if (HTML_dtd.tags[element_number].contents == SGML_LITTERAL) {
+ TRANSLATE_AND_UNESCAPE_ENTITIES6(&me->textarea.data,
+ me->UCLYhndl,
+ current_char_set,
+ NO,
+ me->UsePlainSpace, me->HiddenValue);
+ } else {
+ /*
+ * This shouldn't have anything to do, normally, but just in
+ * case... There shouldn't be lynx special character codes in
+ * the chunk ("DTD" flag Tgf_nolyspcl tells SGML.c not to
+ * generate them). If there were, we could set the last
+ * parameter ('Back') below to YES, which would take them out
+ * of the data. The data may however contain non break space,
+ * soft hyphen, or en space etc., in the me->UCLYhndl character
+ * encoding. If that's a problem, perhaps for the (line or
+ * other) editor, setting 'Back' to YES should also help to
+ * always convert them to plain spaces (or drop them). - kw
+ */
+ TRANSLATE_HTML7(&me->textarea.data,
+ me->UCLYhndl,
+ current_char_set,
+ NO,
+ me->UsePlainSpace, me->HiddenValue,
+ NO);
+ }
+ data = me->textarea.data;
+
+ /*
+ * Trim any trailing newlines and skip any lead newlines. - FM
+ */
+ if (*data != '\0') {
+ cp = (data + strlen(data)) - 1;
+ while (cp >= data && *cp == '\n') {
+ *cp-- = '\0';
+ }
+ while (*data == '\n') {
+ data++;
+ }
+ }
+ /*
+ * Load the first text line, or set up for all blank rows. - FM
+ */
+ if ((cp = StrChr(data, '\n')) != NULL) {
+ *cp = '\0';
+ StrAllocCopy(temp, data);
+ *cp = '\n';
+ data = NULL; /* HTML_put_characters may overwrite this */
+ StrAllocCopy(data, cp + 1);
+ } else {
+ if (*data != '\0') {
+ StrAllocCopy(temp, data);
+ } else {
+ FREE(temp);
+ }
+ data = empty;
+ }
+ /*
+ * Display at least the requested number of text lines and/or blank
+ * rows. - FM
+ */
+ for (i = 0; i < me->textarea_rows; i++) {
+ int j;
+
+ for (j = 0; temp && temp[j]; j++) {
+ if (temp[j] == '\r')
+ temp[j] = (char) (temp[j + 1] ? ' ' : '\0');
+ }
+ I.value = temp;
+ chars = HText_beginInput(me->text, me->inUnderline, &I);
+ for (; chars > 0; chars--)
+ HTML_put_character(me, '_');
+ HText_appendCharacter(me->text, '\r');
+ if (*data != '\0') {
+ if (*data == '\n') {
+ FREE(temp);
+ data++;
+ } else if ((cp = StrChr(data, '\n')) != NULL) {
+ *cp = '\0';
+ StrAllocCopy(temp, data);
+ *cp = '\n';
+ data = (cp + 1);
+ } else {
+ StrAllocCopy(temp, data);
+ data = empty;
+ }
+ } else {
+ FREE(temp);
+ }
+ }
+ /*
+ * Check for more data lines than the rows attribute. We add them
+ * to the display, because we support only horizontal and not also
+ * vertical scrolling. - FM
+ */
+ while (*data != '\0' || temp != NULL) {
+ int j;
+
+ for (j = 0; temp && temp[j]; j++) {
+ if (temp[j] == '\r')
+ temp[j] = (char) (temp[j + 1] ? ' ' : '\0');
+ }
+ I.value = temp;
+ (void) HText_beginInput(me->text, me->inUnderline, &I);
+ for (chars = me->textarea_cols; chars > 0; chars--)
+ HTML_put_character(me, '_');
+ HText_appendCharacter(me->text, '\r');
+ if (*data == '\n') {
+ FREE(temp);
+ data++;
+ } else if ((cp = StrChr(data, '\n')) != NULL) {
+ *cp = '\0';
+ StrAllocCopy(temp, data);
+ *cp = '\n';
+ data = (cp + 1);
+ } else if (*data != '\0') {
+ StrAllocCopy(temp, data);
+ data = empty;
+ } else {
+ FREE(temp);
+ }
+ }
+ if (data != empty) {
+ FREE(data);
+ }
+ FREE(temp);
+ cp = NULL;
+ me->UsePlainSpace = FALSE;
+
+ HTChunkClear(&me->textarea);
+ FREE(me->textarea_name);
+ me->textarea_name_cs = -1;
+ FREE(me->textarea_id);
+ break;
+ }
+
+ case HTML_SELECT:
+ {
+ char *ptr = NULL;
+
+ /*
+ * Make sure we had a select start tag.
+ */
+ if (!me->inSELECT) {
+ if (LYBadHTML(me)) {
+ LYShowBadHTML("Bad HTML: Unmatched SELECT end tag *****\n");
+ }
+ break;
+ }
+
+ /*
+ * Set to know that we are no longer in a select tag.
+ */
+ me->inSELECT = FALSE;
+
+ /*
+ * Clear the disable attribute.
+ */
+ me->select_disabled = FALSE;
+
+ /*
+ * Make sure we're in a form.
+ */
+ if (!me->inFORM) {
+ if (LYBadHTML(me)) {
+ LYShowBadHTML("Bad HTML: SELECT end tag not within FORM element *****\n");
+ }
+ /*
+ * Hopefully won't crash, so we'll ignore it. - kw
+ */
+ }
+
+ /*
+ * Finish the data off.
+ */
+ HTChunkTerminate(&me->option);
+ /*
+ * Finish the previous option.
+ */
+ if (!me->first_option)
+ ptr = HText_setLastOptionValue(me->text,
+ me->option.data,
+ me->LastOptionValue,
+ LAST_ORDER,
+ me->LastOptionChecked,
+ me->UCLYhndl,
+ ATTR_CS_IN);
+ FREE(me->LastOptionValue);
+
+ me->LastOptionChecked = FALSE;
+
+ if (HTCurSelectGroupType == F_CHECKBOX_TYPE ||
+ LYSelectPopups == FALSE) {
+ /*
+ * Start a newline after the last checkbox/button option.
+ */
+ LYEnsureSingleSpace(me);
+ } else {
+ /*
+ * Output popup box with the default option to screen, but use
+ * non-breaking spaces for output.
+ */
+ if (ptr &&
+ (me->sp[0].tag_number == HTML_PRE || me->inPRE == TRUE ||
+ !me->sp->style->freeFormat) &&
+ strlen(ptr) > 6) {
+ /*
+ * The code inadequately handles OPTION fields in PRE tags.
+ * We'll put up a minimum of 6 characters, and if any more
+ * would exceed the wrap column, we'll ignore them.
+ */
+ for (i = 0; i < 6; i++) {
+ if (*ptr == ' ')
+ HText_appendCharacter(me->text, HT_NON_BREAK_SPACE);
+ else
+ HText_appendCharacter(me->text, *ptr);
+ ptr++;
+ }
+ }
+ for (; non_empty(ptr); ptr++) {
+ if (*ptr == ' ')
+ HText_appendCharacter(me->text, HT_NON_BREAK_SPACE);
+ else {
+ HTkcode kcode = NOKANJI;
+ HTkcode specified_kcode = NOKANJI;
+
+ if (HTCJK == JAPANESE) {
+ kcode = HText_getKcode(me->text);
+ HText_updateKcode(me->text, kanji_code);
+ specified_kcode = HText_getSpecifiedKcode(me->text);
+ HText_updateSpecifiedKcode(me->text, kanji_code);
+ }
+ HText_appendCharacter(me->text, *ptr);
+ if (HTCJK == JAPANESE) {
+ HText_updateKcode(me->text, kcode);
+ HText_updateSpecifiedKcode(me->text, specified_kcode);
+ }
+ }
+ }
+ /*
+ * Add end option character.
+ */
+ if (!me->first_option) {
+ HText_appendCharacter(me->text, ']');
+ HText_endInput(me->text);
+ HText_setLastChar(me->text, ']');
+ me->in_word = YES;
+ }
+ }
+ HTChunkClear(&me->option);
+
+ if (me->Underline_Level > 0 && me->inUnderline == FALSE) {
+ HText_appendCharacter(me->text, LY_UNDERLINE_START_CHAR);
+ me->inUnderline = TRUE;
+ }
+ if (me->needBoldH == TRUE && me->inBoldH == FALSE) {
+ HText_appendCharacter(me->text, LY_BOLD_START_CHAR);
+ me->inBoldH = TRUE;
+ me->needBoldH = FALSE;
+ }
+ }
+ break;
+
+ case HTML_TABLE:
+#ifdef EXP_NESTED_TABLES
+ if (!nested_tables)
+#endif
+ me->inTABLE = FALSE;
+
+ if (me->sp->style->id == ST_Preformatted) {
+ break;
+ }
+ if (me->Division_Level >= 0)
+ me->Division_Level--;
+ if (me->Division_Level >= 0)
+ me->sp->style->alignment =
+ me->DivisionAlignments[me->Division_Level];
+ change_paragraph_style(me, me->sp->style);
+ UPDATE_STYLE;
+
+#ifdef EXP_NESTED_TABLES
+ if (nested_tables) {
+ me->inTABLE = HText_endStblTABLE(me->text);
+ } else {
+ HText_endStblTABLE(me->text);
+ }
+#else
+ HText_endStblTABLE(me->text);
+#endif
+
+ me->current_default_alignment = me->sp->style->alignment;
+ if (me->List_Nesting_Level >= 0)
+ HText_NegateLineOne(me->text);
+ break;
+
+/* These TABLE related elements may now not be SGML_EMPTY. - kw */
+ case HTML_TR:
+ HText_endStblTR(me->text);
+ if (!HText_LastLineEmpty(me->text, FALSE)) {
+ HText_setLastChar(me->text, ' '); /* absorb next white space */
+ HText_appendCharacter(me->text, '\r');
+ }
+ me->in_word = NO;
+ break;
+
+ case HTML_THEAD:
+ case HTML_TFOOT:
+ case HTML_TBODY:
+ break;
+
+ case HTML_COLGROUP:
+ if (me->inTABLE)
+ HText_endStblCOLGROUP(me->text);
+ break;
+
+ case HTML_TH:
+ case HTML_TD:
+ HText_endStblTD(me->text);
+ break;
+
+/* More stuff that may now not be SGML_EMPTY any more: */
+ case HTML_DT:
+ case HTML_DD:
+ case HTML_LH:
+ case HTML_LI:
+ case HTML_OVERLAY:
+ break;
+
+ case HTML_MATH:
+ /*
+ * We're getting it as Literal text, which, until we can process it,
+ * we'll display as is, within brackets to alert the user. - FM
+ */
+ HTChunkPutc(&me->math, ' ');
+ HTChunkTerminate(&me->math);
+ if (me->math.size > 2) {
+ LYEnsureSingleSpace(me);
+ if (me->inUnderline == FALSE)
+ HText_appendCharacter(me->text, LY_UNDERLINE_START_CHAR);
+ HTML_put_string(me, "[MATH:");
+ HText_appendCharacter(me->text, LY_UNDERLINE_END_CHAR);
+ HTML_put_character(me, ' ');
+ HTML_put_string(me, me->math.data);
+ HText_appendCharacter(me->text, LY_UNDERLINE_START_CHAR);
+ HTML_put_string(me, ":MATH]");
+ if (me->inUnderline == FALSE)
+ HText_appendCharacter(me->text, LY_UNDERLINE_END_CHAR);
+ LYEnsureSingleSpace(me);
+ }
+ HTChunkClear(&me->math);
+ break;
+
+ default:
+ change_paragraph_style(me, me->sp->style); /* Often won't really change */
+ break;
+
+ } /* switch */
+
+#ifdef USE_JUSTIFY_ELTS
+ if (reached_awaited_stacked_elt)
+ wait_for_this_stacked_elt = -1;
+#endif
+
+ if (me->xinclude) {
+ HText_appendText(me->text, " *** LYNX ERROR ***\rUnparsed data:\r");
+ HText_appendText(me->text, me->xinclude);
+ FREE(me->xinclude);
+ }
+#ifdef USE_COLOR_STYLE
+ if (!skip_stack_requested) { /*don't emit stylechanges if skipped stack element - VH */
+ FastTrimColorClass(HTML_dtd.tags[element_number].name,
+ HTML_dtd.tags[element_number].name_len,
+ Style_className,
+ &Style_className_end, &hcode);
+
+ if (!ReallyEmptyTagNum(element_number)) {
+ CTRACE2(TRACE_STYLE,
+ (tfp,
+ "STYLE.end_element: ending non-\"EMPTY\" style <%s...>\n",
+ HTML_dtd.tags[element_number].name));
+ HText_characterStyle(me->text, hcode, STACK_OFF);
+ }
+ }
+#endif /* USE_COLOR_STYLE */
+ return status;
+}
+
+/* Expanding entities
+ * ------------------
+ */
+/* (In fact, they all shrink!)
+*/
+int HTML_put_entity(HTStructured * me, int entity_number)
+{
+ int nent = (int) HTML_dtd.number_of_entities;
+
+ if (entity_number < nent) {
+ HTML_put_string(me, p_entity_values[entity_number]);
+ return HT_OK;
+ }
+ return HT_CANNOT_TRANSLATE;
+}
+
+/* Free an HTML object
+ * -------------------
+ *
+ * If the document is empty, the text object will not yet exist.
+ * So we could in fact abandon creating the document and return
+ * an error code. In fact an empty document is an important type
+ * of document, so we don't.
+ *
+ * If non-interactive, everything is freed off. No: crashes -listrefs
+ * Otherwise, the interactive object is left.
+ */
+static void HTML_free(HTStructured * me)
+{
+ char *include = NULL;
+
+ if (LYMapsOnly && !me->text) {
+ /*
+ * We only handled MAP, AREA and BASE tags, and didn't create an HText
+ * structure for the document nor want one now, so just make sure we
+ * free anything that might have been allocated. - FM
+ */
+ FREE(me->base_href);
+ FREE(me->map_address);
+ clear_objectdata(me);
+ FREE(me->xinclude);
+ FREE(me);
+ return;
+ }
+
+ UPDATE_STYLE; /* Creates empty document here! */
+ if (me->comment_end)
+ HTML_put_string(me, me->comment_end);
+ if (me->text) {
+ /*
+ * Emphasis containers, A, FONT, and FORM may be declared SGML_EMPTY in
+ * HTMLDTD.c, and SGML_character() in SGML.c may check for their end
+ * tags to call HTML_end_element() directly (with a check in that to
+ * bypass decrementing of the HTML parser's stack). So if we still
+ * have the emphasis (Underline) on, or any open A, FONT, or FORM
+ * containers, turn it off or close them now. - FM & kw
+ *
+ * IF those tags are not declared SGML_EMPTY, but we let the SGML.c
+ * parser take care of correctly stacked ordering, and of correct
+ * wind-down on end-of-stream (in SGML_free SGML_abort), THEN these and
+ * other checks here in HTML.c should not be necessary. Still it can't
+ * hurt to include them. - kw
+ */
+ if (me->inUnderline) {
+ HText_appendCharacter(me->text, LY_UNDERLINE_END_CHAR);
+ me->inUnderline = FALSE;
+ me->Underline_Level = 0;
+ CTRACE((tfp, "HTML_free: Ending underline\n"));
+ }
+ if (me->inA) {
+ HTML_end_element(me, HTML_A, &include);
+ me->inA = FALSE;
+ CTRACE((tfp, "HTML_free: Ending HTML_A\n"));
+ }
+ if (me->inFONT) {
+ HTML_end_element(me, HTML_FONT, &include);
+ me->inFONT = FALSE;
+ }
+ if (me->inFORM) {
+ HTML_end_element(me, HTML_FORM, &include);
+ me->inFORM = FALSE;
+ }
+ if (me->option.size > 0) {
+ /*
+ * If we still have data in the me->option chunk after forcing a
+ * close of a still-open form, something must have gone very wrong.
+ * - kw
+ */
+ if (LYBadHTML(me)) {
+ LYShowBadHTML("Bad HTML: SELECT or OPTION not ended properly *****\n");
+ }
+ HTChunkTerminate(&me->option);
+ /*
+ * Output the left-over data as text, maybe it was invalid markup
+ * meant to be shown somewhere. - kw
+ */
+ CTRACE((tfp, "HTML_free: ***** leftover option data: %s\n",
+ me->option.data));
+ HTML_put_string(me, me->option.data);
+ HTChunkClear(&me->option);
+ }
+ if (me->textarea.size > 0) {
+ /*
+ * If we still have data in the me->textarea chunk after forcing a
+ * close of a still-open form, something must have gone very wrong.
+ * - kw
+ */
+ if (LYBadHTML(me)) {
+ LYShowBadHTML("Bad HTML: TEXTAREA not used properly *****\n");
+ }
+ HTChunkTerminate(&me->textarea);
+ /*
+ * Output the left-over data as text, maybe it was invalid markup
+ * meant to be shown somewhere. - kw
+ */
+ CTRACE((tfp, "HTML_free: ***** leftover textarea data: %s\n",
+ me->textarea.data));
+ HTML_put_string(me, me->textarea.data);
+ HTChunkClear(&me->textarea);
+ }
+ /*
+ * If we're interactive and have hidden links but no visible links, add
+ * a message informing the user about this and suggesting use of the
+ * 'l'ist command. - FM
+ */
+ if (!dump_output_immediately &&
+ HText_sourceAnchors(me->text) < 1 &&
+ HText_HiddenLinkCount(me->text) > 0) {
+ HTML_start_element(me, HTML_P, 0, 0, -1, &include);
+ HTML_put_character(me, '[');
+ HTML_start_element(me, HTML_EM, 0, 0, -1, &include);
+ HTML_put_string(me,
+ gettext("Document has only hidden links. Use the 'l'ist command."));
+ HTML_end_element(me, HTML_EM, &include);
+ HTML_put_character(me, ']');
+ HTML_end_element(me, HTML_P, &include);
+ }
+ if (me->xinclude) {
+ HText_appendText(me->text, " *** LYNX ERROR ***\rUnparsed data:\r");
+ HText_appendText(me->text, me->xinclude);
+ FREE(me->xinclude);
+ }
+
+ /*
+ * Now call the cleanup function. - FM
+ */
+ HText_endAppend(me->text);
+ }
+ if (me->option.size > 0) {
+ /*
+ * If we still have data in the me->option chunk after forcing a close
+ * of a still-open form, something must have gone very wrong. - kw
+ */
+ if (LYBadHTML(me)) {
+ LYShowBadHTML("Bad HTML: SELECT or OPTION not ended properly *****\n");
+ }
+ if (TRACE) {
+ HTChunkTerminate(&me->option);
+ CTRACE((tfp, "HTML_free: ***** leftover option data: %s\n",
+ me->option.data));
+ }
+ HTChunkClear(&me->option);
+ }
+ if (me->textarea.size > 0) {
+ /*
+ * If we still have data in the me->textarea chunk after forcing a
+ * close of a still-open form, something must have gone very wrong. -
+ * kw
+ */
+ if (LYBadHTML(me)) {
+ LYShowBadHTML("Bad HTML: TEXTAREA not used properly *****\n");
+ }
+ if (TRACE) {
+ HTChunkTerminate(&me->textarea);
+ CTRACE((tfp, "HTML_free: ***** leftover textarea data: %s\n",
+ me->textarea.data));
+ }
+ HTChunkClear(&me->textarea);
+ }
+
+ if (me->target) {
+ (*me->targetClass._free) (me->target);
+ }
+ if (me->sp && me->sp->style && GetHTStyleName(me->sp->style)) {
+ if (me->sp->style->id == ST_DivCenter ||
+ me->sp->style->id == ST_HeadingCenter ||
+ me->sp->style->id == ST_Heading1) {
+ me->sp->style->alignment = HT_CENTER;
+ } else if (me->sp->style->id == ST_DivRight ||
+ me->sp->style->id == ST_HeadingRight) {
+ me->sp->style->alignment = HT_RIGHT;
+ } else {
+ me->sp->style->alignment = HT_LEFT;
+ }
+ styles[HTML_PRE]->alignment = HT_LEFT;
+ }
+ FREE(me->base_href);
+ FREE(me->map_address);
+ FREE(me->LastOptionValue);
+ clear_objectdata(me);
+ FREE(me);
+}
+
+static void HTML_abort(HTStructured * me, HTError e)
+{
+ char *include = NULL;
+
+ if (me->text) {
+ /*
+ * If we have emphasis on, or open A, FONT, or FORM containers, turn it
+ * off or close them now. - FM
+ */
+ if (me->inUnderline) {
+ HText_appendCharacter(me->text, LY_UNDERLINE_END_CHAR);
+ me->inUnderline = FALSE;
+ me->Underline_Level = 0;
+ }
+ if (me->inA) {
+ HTML_end_element(me, HTML_A, &include);
+ me->inA = FALSE;
+ }
+ if (me->inFONT) {
+ HTML_end_element(me, HTML_FONT, &include);
+ me->inFONT = FALSE;
+ }
+ if (me->inFORM) {
+ HTML_end_element(me, HTML_FORM, &include);
+ me->inFORM = FALSE;
+ }
+
+ /*
+ * Now call the cleanup function. - FM
+ */
+ HText_endAppend(me->text);
+ }
+
+ if (me->option.size > 0) {
+ /*
+ * If we still have data in the me->option chunk after forcing a close
+ * of a still-open form, something must have gone very wrong. - kw
+ */
+ if (TRACE) {
+ CTRACE((tfp,
+ "HTML_abort: SELECT or OPTION not ended properly *****\n"));
+ HTChunkTerminate(&me->option);
+ CTRACE((tfp, "HTML_abort: ***** leftover option data: %s\n",
+ me->option.data));
+ }
+ HTChunkClear(&me->option);
+ }
+ if (me->textarea.size > 0) {
+ /*
+ * If we still have data in the me->textarea chunk after forcing a
+ * close of a still-open form, something must have gone very wrong. -
+ * kw
+ */
+ if (TRACE) {
+ CTRACE((tfp, "HTML_abort: TEXTAREA not used properly *****\n"));
+ HTChunkTerminate(&me->textarea);
+ CTRACE((tfp, "HTML_abort: ***** leftover textarea data: %s\n",
+ me->textarea.data));
+ }
+ HTChunkClear(&me->textarea);
+ }
+
+ if (me->target) {
+ (*me->targetClass._abort) (me->target, e);
+ }
+ if (me->sp && me->sp->style && GetHTStyleName(me->sp->style)) {
+ if (me->sp->style->id == ST_DivCenter ||
+ me->sp->style->id == ST_HeadingCenter ||
+ me->sp->style->id == ST_Heading1) {
+ me->sp->style->alignment = HT_CENTER;
+ } else if (me->sp->style->id == ST_DivRight ||
+ me->sp->style->id == ST_HeadingRight) {
+ me->sp->style->alignment = HT_RIGHT;
+ } else {
+ me->sp->style->alignment = HT_LEFT;
+ }
+ styles[HTML_PRE]->alignment = HT_LEFT;
+ }
+ FREE(me->base_href);
+ FREE(me->map_address);
+ FREE(me->textarea_name);
+ FREE(me->textarea_accept_cs);
+ FREE(me->textarea_id);
+ FREE(me->LastOptionValue);
+ FREE(me->xinclude);
+ clear_objectdata(me);
+ FREE(me);
+}
+
+/* Get Styles from style sheet
+ * ---------------------------
+ */
+static void get_styles(void)
+{
+ HTStyle **st = NULL;
+
+ styleSheet = DefaultStyle(&st); /* sets st[] array */
+
+ default_style = st[ST_Normal];
+
+ styles[HTML_H1] = st[ST_Heading1];
+ styles[HTML_H2] = st[ST_Heading2];
+ styles[HTML_H3] = st[ST_Heading3];
+ styles[HTML_H4] = st[ST_Heading4];
+ styles[HTML_H5] = st[ST_Heading5];
+ styles[HTML_H6] = st[ST_Heading6];
+ styles[HTML_HCENTER] = st[ST_HeadingCenter];
+ styles[HTML_HLEFT] = st[ST_HeadingLeft];
+ styles[HTML_HRIGHT] = st[ST_HeadingRight];
+
+ styles[HTML_DCENTER] = st[ST_DivCenter];
+ styles[HTML_DLEFT] = st[ST_DivLeft];
+ styles[HTML_DRIGHT] = st[ST_DivRight];
+
+ styles[HTML_DL] = st[ST_Glossary];
+ /* nested list styles */
+ styles[HTML_DL1] = st[ST_Glossary1];
+ styles[HTML_DL2] = st[ST_Glossary2];
+ styles[HTML_DL3] = st[ST_Glossary3];
+ styles[HTML_DL4] = st[ST_Glossary4];
+ styles[HTML_DL5] = st[ST_Glossary5];
+ styles[HTML_DL6] = st[ST_Glossary6];
+
+ styles[HTML_UL] =
+ styles[HTML_OL] = st[ST_List];
+ /* nested list styles */
+ styles[HTML_OL1] = st[ST_List1];
+ styles[HTML_OL2] = st[ST_List2];
+ styles[HTML_OL3] = st[ST_List3];
+ styles[HTML_OL4] = st[ST_List4];
+ styles[HTML_OL5] = st[ST_List5];
+ styles[HTML_OL6] = st[ST_List6];
+
+ styles[HTML_MENU] =
+ styles[HTML_DIR] = st[ST_Menu];
+ /* nested list styles */
+ styles[HTML_MENU1] = st[ST_Menu1];
+ styles[HTML_MENU2] = st[ST_Menu2];
+ styles[HTML_MENU3] = st[ST_Menu3];
+ styles[HTML_MENU4] = st[ST_Menu4];
+ styles[HTML_MENU5] = st[ST_Menu5];
+ styles[HTML_MENU6] = st[ST_Menu6];
+
+ styles[HTML_DLC] = st[ST_GlossaryCompact];
+ /* nested list styles */
+ styles[HTML_DLC1] = st[ST_GlossaryCompact1];
+ styles[HTML_DLC2] = st[ST_GlossaryCompact2];
+ styles[HTML_DLC3] = st[ST_GlossaryCompact3];
+ styles[HTML_DLC4] = st[ST_GlossaryCompact4];
+ styles[HTML_DLC5] = st[ST_GlossaryCompact5];
+ styles[HTML_DLC6] = st[ST_GlossaryCompact6];
+
+ styles[HTML_ADDRESS] = st[ST_Address];
+ styles[HTML_BANNER] = st[ST_Banner];
+ styles[HTML_BLOCKQUOTE] = st[ST_Blockquote];
+ styles[HTML_BQ] = st[ST_Bq];
+ styles[HTML_FN] = st[ST_Footnote];
+ styles[HTML_NOTE] = st[ST_Note];
+ styles[HTML_PLAINTEXT] =
+ styles[HTML_XMP] = st[ST_Example];
+ styles[HTML_PRE] = st[ST_Preformatted];
+ styles[HTML_LISTING] = st[ST_Listing];
+}
+
+/*
+ * If we're called from another module, make sure we've initialized styles
+ * array first.
+ */
+HTStyle *LYstyles(int style_number)
+{
+ if (styles[style_number] == 0)
+ get_styles();
+ return styles[style_number];
+}
+
+/* P U B L I C
+*/
+
+/* Structured Object Class
+ * -----------------------
+ */
+const HTStructuredClass HTMLPresentation = /* As opposed to print etc */
+{
+ "Lynx_HTML_Handler",
+ HTML_free,
+ HTML_abort,
+ HTML_put_character, HTML_put_string, HTML_write,
+ HTML_start_element, HTML_end_element,
+ HTML_put_entity
+};
+
+/* New Structured Text object
+ * --------------------------
+ *
+ * The structured stream can generate either presentation,
+ * or plain text, or HTML.
+ */
+HTStructured *HTML_new(HTParentAnchor *anchor,
+ HTFormat format_out,
+ HTStream *stream)
+{
+
+ HTStructured *me;
+
+ CTRACE((tfp, "start HTML_new(parent %s, format %s)\n",
+ ((anchor)
+ ? NONNULL(anchor->address)
+ : "<NULL>"),
+ HTAtom_name(format_out)));
+
+ if (format_out != WWW_PLAINTEXT && format_out != WWW_PRESENT) {
+ HTStream *intermediate = HTStreamStack(WWW_HTML, format_out,
+ stream, anchor);
+
+ if (intermediate)
+ return HTMLGenerator(intermediate);
+ fprintf(stderr, "\n** Internal error: can't parse HTML to %s\n",
+ HTAtom_name(format_out));
+ exit_immediately(EXIT_FAILURE);
+ }
+
+ me = typecalloc(HTStructured);
+ if (me == NULL)
+ outofmem(__FILE__, "HTML_new");
+
+ /*
+ * This used to call 'get_styles()' only on the first time through this
+ * function. However, if the user reloads a page with ^R, the styles[]
+ * array is not necessarily the same as it was from 'get_styles()'. So
+ * we reinitialize the whole thing.
+ */
+ get_styles();
+
+ me->isa = &HTMLPresentation;
+ me->node_anchor = anchor;
+
+ me->CurrentA = NULL;
+ me->CurrentANum = 0;
+ me->base_href = NULL;
+ me->map_address = NULL;
+
+ HTChunkInit(&me->title, 128);
+
+ HTChunkInit(&me->object, 128);
+ me->object_started = FALSE;
+ me->object_declare = FALSE;
+ me->object_shapes = FALSE;
+ me->object_ismap = FALSE;
+ me->object_id = NULL;
+ me->object_title = NULL;
+ me->object_data = NULL;
+ me->object_type = NULL;
+ me->object_classid = NULL;
+ me->object_codebase = NULL;
+ me->object_codetype = NULL;
+ me->object_usemap = NULL;
+ me->object_name = NULL;
+
+ HTChunkInit(&me->option, 128);
+ me->first_option = TRUE;
+ me->LastOptionValue = NULL;
+ me->LastOptionChecked = FALSE;
+ me->select_disabled = FALSE;
+
+ HTChunkInit(&me->textarea, 128);
+ me->textarea_name = NULL;
+ me->textarea_name_cs = -1;
+ me->textarea_accept_cs = NULL;
+ me->textarea_cols = 0;
+ me->textarea_rows = 4;
+ me->textarea_id = NULL;
+
+ HTChunkInit(&me->math, 128);
+
+ HTChunkInit(&me->style_block, 128);
+
+ HTChunkInit(&me->script, 128);
+
+ me->text = 0;
+ me->style_change = YES; /* Force check leading to text creation */
+ me->new_style = default_style;
+ me->old_style = 0;
+ me->current_default_alignment = HT_LEFT;
+ me->sp = (me->stack + MAX_NESTING - 1);
+ me->skip_stack = 0;
+ me->sp->tag_number = -1; /* INVALID */
+ me->sp->style = default_style; /* INVALID */
+ me->sp->style->alignment = HT_LEFT;
+ me->stack_overrun = FALSE;
+
+ me->Division_Level = -1;
+ me->Underline_Level = 0;
+ me->Quote_Level = 0;
+
+ me->UsePlainSpace = FALSE;
+ me->HiddenValue = FALSE;
+ me->lastraw = -1;
+
+ /*
+ * Used for nested lists. - FM
+ */
+ me->List_Nesting_Level = -1; /* counter for list nesting level */
+ LYZero_OL_Counter(me); /* Initializes OL_Counter[] and OL_Type[] */
+ me->Last_OL_Count = 0; /* last count in ordered lists */
+ me->Last_OL_Type = '1'; /* last type in ordered lists */
+
+ me->inA = FALSE;
+ me->inAPPLET = FALSE;
+ me->inAPPLETwithP = FALSE;
+ me->inBadHREF = FALSE;
+ me->inBadHTML = FALSE;
+ me->inBASE = FALSE;
+ me->node_anchor->inBASE = FALSE;
+ me->inBoldA = FALSE;
+ me->inBoldH = FALSE;
+ me->inCAPTION = FALSE;
+ me->inCREDIT = FALSE;
+ me->inFIG = FALSE;
+ me->inFIGwithP = FALSE;
+ me->inFONT = FALSE;
+ me->inFORM = FALSE;
+ me->inLABEL = FALSE;
+ me->inP = FALSE;
+ me->inPRE = FALSE;
+ me->inSELECT = FALSE;
+ me->inTABLE = FALSE;
+ me->inUnderline = FALSE;
+
+ me->needBoldH = FALSE;
+
+ me->comment_start = NULL;
+ me->comment_end = NULL;
+
+#ifdef USE_COLOR_STYLE
+#ifdef LY_FIND_LEAKS
+ if (Style_className == 0) {
+ atexit(free_Style_className);
+ }
+#endif
+ addClassName("", "", (size_t) 0);
+ class_string[0] = '\0';
+#endif
+
+ /*
+ * Create a chartrans stage info structure for the anchor, if it does not
+ * exist already (in which case the default MIME stage info will be loaded
+ * as well), and load the HTML stage info into me->UCI and me->UCLYhndl. -
+ * FM
+ */
+ LYGetChartransInfo(me);
+ UCTransParams_clear(&me->T);
+
+ /*
+ * Load the existing or default input charset info into the holding
+ * elements. We'll believe what is indicated for UCT_STAGE_PARSER. - FM
+ */
+ me->inUCLYhndl = HTAnchor_getUCLYhndl(me->node_anchor,
+ UCT_STAGE_PARSER);
+ if (me->inUCLYhndl < 0) {
+ me->inUCLYhndl = HTAnchor_getUCLYhndl(me->node_anchor,
+ UCT_STAGE_MIME);
+ me->inUCI = HTAnchor_getUCInfoStage(me->node_anchor,
+ UCT_STAGE_MIME);
+ } else {
+ me->inUCI = HTAnchor_getUCInfoStage(me->node_anchor,
+ UCT_STAGE_PARSER);
+ }
+
+ /*
+ * Load the existing or default output charset info into the holding
+ * elements, UCT_STAGE_STRUCTURED should be the same as UCT_STAGE_TEXT at
+ * this point, but we could check, perhaps. - FM
+ */
+ me->outUCI = HTAnchor_getUCInfoStage(me->node_anchor,
+ UCT_STAGE_STRUCTURED);
+ me->outUCLYhndl = HTAnchor_getUCLYhndl(me->node_anchor,
+ UCT_STAGE_STRUCTURED);
+
+ me->target = stream;
+ if (stream)
+ me->targetClass = *stream->isa; /* Copy pointers */
+
+ return (HTStructured *) me;
+}
+
+#ifdef USE_SOURCE_CACHE
+
+/*
+ * A flag set by a file write error. Used for only generating an alert the
+ * first time such an error happens, since Lynx should still be usable if the
+ * temp space becomes full, and an alert each time a cache file cannot be
+ * written would be annoying. Reset when lynx.cfg is being reloaded (user may
+ * change SOURCE_CACHE setting). - kw
+ */
+BOOLEAN source_cache_file_error = FALSE;
+
+/*
+ * Pass-thru cache HTStream
+ */
+
+static void CacheThru_do_free(HTStream *me)
+{
+ if (me->anchor->source_cache_file) {
+ CTRACE((tfp, "SourceCacheWriter: Removing previous file %s\n",
+ me->anchor->source_cache_file));
+ (void) LYRemoveTemp(me->anchor->source_cache_file);
+ FREE(me->anchor->source_cache_file);
+ }
+ if (me->anchor->source_cache_chunk) {
+ CTRACE((tfp, "SourceCacheWriter: Removing previous memory chunk %p\n",
+ (void *) me->anchor->source_cache_chunk));
+ HTChunkFree(me->anchor->source_cache_chunk);
+ me->anchor->source_cache_chunk = NULL;
+ }
+ if (me->fp) {
+ fflush(me->fp);
+ if (ferror(me->fp))
+ me->status = HT_ERROR;
+ LYCloseTempFP(me->fp);
+ if (me->status == HT_OK) {
+ char *cp_freeme = 0;
+
+ me->anchor->source_cache_file = me->filename;
+ CTRACE((tfp,
+ "SourceCacheWriter: Committing file %s for URL %s to anchor\n",
+ me->filename,
+ cp_freeme = HTAnchor_address((HTAnchor *) me->anchor)));
+ FREE(cp_freeme);
+ } else {
+ if (source_cache_file_error == FALSE) {
+ HTAlert(gettext("Source cache error - disk full?"));
+ source_cache_file_error = TRUE;
+ }
+ (void) LYRemoveTemp(me->filename);
+ me->anchor->source_cache_file = NULL;
+ }
+ } else if (me->status != HT_OK) {
+ if (me->chunk) {
+ CTRACE((tfp, "SourceCacheWriter: memory chunk %p had errors.\n",
+ (void *) me->chunk));
+ HTChunkFree(me->chunk);
+ me->chunk = me->last_chunk = NULL;
+ }
+ HTAlert(gettext("Source cache error - not enough memory!"));
+ }
+ if (me->chunk) {
+ char *cp_freeme = NULL;
+
+ me->anchor->source_cache_chunk = me->chunk;
+ CTRACE((tfp,
+ "SourceCacheWriter: Committing memory chunk %p for URL %s to anchor\n",
+ (void *) me->chunk,
+ cp_freeme = HTAnchor_address((HTAnchor *) me->anchor)));
+ FREE(cp_freeme);
+ }
+}
+
+static void CacheThru_free(HTStream *me)
+{
+ CacheThru_do_free(me);
+ (*me->actions->_free) (me->target);
+ FREE(me);
+}
+
+static void CacheThru_abort(HTStream *me, HTError e)
+{
+ if (me->fp)
+ LYCloseTempFP(me->fp);
+ if (LYCacheSourceForAborted == SOURCE_CACHE_FOR_ABORTED_DROP) {
+ if (me->filename) {
+ CTRACE((tfp, "SourceCacheWriter: Removing active file %s\n",
+ me->filename));
+ (void) LYRemoveTemp(me->filename);
+ FREE(me->filename);
+ }
+ if (me->chunk) {
+ CTRACE((tfp,
+ "SourceCacheWriter: Removing active memory chunk %p\n",
+ (void *) me->chunk));
+ HTChunkFree(me->chunk);
+ }
+ } else {
+ me->status = HT_OK; /*fake it */
+ CacheThru_do_free(me);
+ }
+ (*me->actions->_abort) (me->target, e);
+ FREE(me);
+}
+
+/*
+ * FIXME: never used!
+ */
+static void CacheThru_put_character(HTStream *me, int c_in)
+{
+ if (me->status == HT_OK) {
+ if (me->fp) {
+ fputc(c_in, me->fp);
+ } else if (me->chunk) {
+ me->last_chunk = HTChunkPutc2(me->last_chunk, c_in);
+ if (me->last_chunk == NULL || me->last_chunk->allocated == 0)
+ me->status = HT_ERROR;
+ }
+ }
+ (*me->actions->put_character) (me->target, c_in);
+}
+
+/*
+ * FIXME: never used!
+ */
+static void CacheThru_put_string(HTStream *me, const char *str)
+{
+ if (me->status == HT_OK) {
+ if (me->fp) {
+ fputs(str, me->fp);
+ } else if (me->chunk) {
+ me->last_chunk = HTChunkPuts2(me->last_chunk, str);
+ if (me->last_chunk == NULL || me->last_chunk->allocated == 0)
+ me->status = HT_ERROR;
+ }
+ }
+ (*me->actions->put_string) (me->target, str);
+}
+
+static void CacheThru_write(HTStream *me, const char *str, int l)
+{
+ if (me->status == HT_OK && l != 0) {
+ if (me->fp) {
+ if (fwrite(str, (size_t) 1, (size_t) l, me->fp) < (size_t) l
+ || ferror(me->fp)) {
+ me->status = HT_ERROR;
+ }
+ } else if (me->chunk) {
+ me->last_chunk = HTChunkPutb2(me->last_chunk, str, l);
+ if (me->last_chunk == NULL || me->last_chunk->allocated == 0)
+ me->status = HT_ERROR;
+ }
+ }
+ (*me->actions->put_block) (me->target, str, l);
+}
+
+static const HTStreamClass PassThruCache =
+{
+ "PassThruCache",
+ CacheThru_free,
+ CacheThru_abort,
+ CacheThru_put_character,
+ CacheThru_put_string,
+ CacheThru_write
+};
+
+static HTStream *CacheThru_new(HTParentAnchor *anchor,
+ HTStream *target)
+{
+ char *cp_freeme = NULL;
+ char filename[LY_MAXPATH];
+ HTStream *stream = NULL;
+ HTProtocol *p = (HTProtocol *) anchor->protocol;
+
+ /*
+ * Neatly and transparently vanish if source caching is disabled.
+ */
+ if (LYCacheSource == SOURCE_CACHE_NONE)
+ return target;
+
+#ifndef DEBUG_SOURCE_CACHE
+ /* Only remote HTML documents may benefit from HTreparse_document(), */
+ /* oh, assume http protocol: */
+ if (strcmp(p->name, "http") != 0
+ && strcmp(p->name, "https") != 0) {
+ CTRACE((tfp, "SourceCacheWriter: Protocol is \"%s\"; not cached\n", p->name));
+ return target;
+ }
+#else
+ /* all HTStreams will be cached */
+#endif
+
+ CTRACE((tfp, "start CacheThru_new\n"));
+
+ stream = (HTStream *) malloc(sizeof(*stream));
+ if (!stream)
+ outofmem(__FILE__, "CacheThru_new");
+
+ stream->isa = &PassThruCache;
+ stream->anchor = anchor;
+ stream->fp = NULL;
+ stream->filename = NULL;
+ stream->chunk = NULL;
+ stream->target = target;
+ stream->actions = target->isa;
+ stream->status = HT_OK;
+
+ if (LYCacheSource == SOURCE_CACHE_FILE) {
+
+ if (anchor->source_cache_file) {
+ CTRACE((tfp,
+ "SourceCacheWriter: If successful, will replace source cache file %s\n",
+ anchor->source_cache_file));
+ }
+
+ /*
+ * We open the temp file in binary mode to make sure that
+ * end-of-line stuff and high-bit Latin-1 (or other) characters
+ * don't get munged; this way, the file should (knock on wood)
+ * contain exactly what came in from the network.
+ */
+ if (!(stream->fp = LYOpenTemp(filename, HTML_SUFFIX, BIN_W))) {
+ CTRACE((tfp,
+ "SourceCacheWriter: Cannot open source cache file for URL %s\n",
+ cp_freeme = HTAnchor_address((HTAnchor *) anchor)));
+ FREE(stream);
+ FREE(cp_freeme);
+ return target;
+ }
+
+ StrAllocCopy(stream->filename, filename);
+
+ CTRACE((tfp,
+ "SourceCacheWriter: Caching source for URL %s in file %s\n",
+ cp_freeme = HTAnchor_address((HTAnchor *) anchor),
+ filename));
+ FREE(cp_freeme);
+ }
+
+ if (LYCacheSource == SOURCE_CACHE_MEMORY) {
+ if (anchor->source_cache_chunk) {
+ CTRACE((tfp,
+ "SourceCacheWriter: If successful, will replace memory chunk %p\n",
+ (void *) anchor->source_cache_chunk));
+ }
+ stream->chunk = stream->last_chunk = HTChunkCreateMayFail(4096, 1);
+ if (!stream->chunk) /* failed already? pretty bad... - kw */
+ stream->status = HT_ERROR;
+
+ CTRACE((tfp,
+ "SourceCacheWriter: Caching source for URL %s in memory chunk %p\n",
+ cp_freeme = HTAnchor_address((HTAnchor *) anchor),
+ (void *) stream->chunk));
+ FREE(cp_freeme);
+ }
+
+ return stream;
+}
+#else
+#define CacheThru_new(anchor, target) target
+#endif
+
+/* HTConverter for HTML to plain text
+ * ----------------------------------
+ *
+ * This will convert from HTML to presentation or plain text.
+ *
+ * It is registered in HTInit.c, but never actually used by lynx.
+ * - kw 1999-03-15
+ */
+HTStream *HTMLToPlain(HTPresentation *pres,
+ HTParentAnchor *anchor,
+ HTStream *sink)
+{
+ CTRACE((tfp, "HTMLToPlain calling CacheThru_new\n"));
+ return CacheThru_new(anchor,
+ SGML_new(&HTML_dtd, anchor,
+ HTML_new(anchor, pres->rep_out, sink), FALSE));
+}
+
+/* HTConverter for HTML source to plain text
+ * -----------------------------------------
+ *
+ * This will preparse HTML and convert back to presentation or plain text.
+ *
+ * It is registered in HTInit.c and used by lynx if invoked with
+ * -preparsed. The stream generated here will be fed with HTML text,
+ * It feeds that to the SGML.c parser, which in turn feeds an HTMLGen.c
+ * structured stream for regenerating flat text; the latter should
+ * end up being handled as text/plain. - kw
+ */
+HTStream *HTMLParsedPresent(HTPresentation *pres,
+ HTParentAnchor *anchor,
+ HTStream *sink)
+{
+ HTStream *intermediate = sink;
+
+ if (!intermediate) {
+ /*
+ * Trick to prevent HTPlainPresent from translating again. Temporarily
+ * change UCT_STAGE_PARSER setting in anchor while the HTPlain stream
+ * is initialized, so that HTPlain sees its input and output charsets
+ * as the same. - kw
+ */
+ int old_parser_cset = HTAnchor_getUCLYhndl(anchor, UCT_STAGE_PARSER);
+ int structured_cset = HTAnchor_getUCLYhndl(anchor, UCT_STAGE_STRUCTURED);
+
+ if (structured_cset < 0)
+ structured_cset = HTAnchor_getUCLYhndl(anchor, UCT_STAGE_HTEXT);
+ if (structured_cset < 0)
+ structured_cset = current_char_set;
+ HTAnchor_setUCInfoStage(anchor, structured_cset,
+ UCT_STAGE_PARSER, UCT_SETBY_MIME);
+ if (pres->rep_out == WWW_SOURCE) {
+ /* same effect as
+ intermediate = HTPlainPresent(pres, anchor, NULL);
+ just written in a more general way:
+ */
+ intermediate = HTStreamStack(WWW_PLAINTEXT, WWW_PRESENT,
+ NULL, anchor);
+ } else {
+ /* this too should amount to calling HTPlainPresent: */
+ intermediate = HTStreamStack(WWW_PLAINTEXT, pres->rep_out,
+ NULL, anchor);
+ }
+ if (old_parser_cset != structured_cset) {
+ HTAnchor_resetUCInfoStage(anchor, old_parser_cset,
+ UCT_STAGE_PARSER, UCT_SETBY_NONE);
+ if (old_parser_cset >= 0) {
+ HTAnchor_setUCInfoStage(anchor, old_parser_cset,
+ UCT_STAGE_PARSER,
+ UCT_SETBY_DEFAULT + 1);
+ }
+ }
+ }
+ if (!intermediate)
+ return NULL;
+ CTRACE((tfp, "HTMLParsedPresent calling CacheThru_new\n"));
+ return CacheThru_new(anchor,
+ SGML_new(&HTML_dtd, anchor,
+ HTMLGenerator(intermediate), FALSE));
+}
+
+/* HTConverter for HTML to C code
+ * ------------------------------
+ *
+ * C code is like plain text but all non-preformatted code
+ * is commented out.
+ * This will convert from HTML to presentation or plain text.
+ *
+ * It is registered in HTInit.c, but normally not used by lynx.
+ * - kw 1999-03-15
+ */
+HTStream *HTMLToC(HTPresentation *pres GCC_UNUSED,
+ HTParentAnchor *anchor,
+ HTStream *sink)
+{
+ HTStructured *html;
+
+ if (sink)
+ (*sink->isa->put_string) (sink, "/* "); /* Before even title */
+ html = HTML_new(anchor, WWW_PLAINTEXT, sink);
+ html->comment_start = "/* ";
+ html->comment_end = " */\n"; /* Must start in col 1 for cpp */
+ if (!sink)
+ HTML_put_string(html, html->comment_start);
+ CTRACE((tfp, "HTMLToC calling CacheThru_new\n"));
+ return CacheThru_new(anchor,
+ SGML_new(&HTML_dtd, anchor, html, FALSE));
+}
+
+/* Presenter for HTML
+ * ------------------
+ *
+ * This will convert from HTML to presentation or plain text.
+ *
+ * (Comment from original libwww:)
+ * Override this if you have a windows version
+ */
+#ifndef GUI
+HTStream *HTMLPresent(HTPresentation *pres GCC_UNUSED,
+ HTParentAnchor *anchor,
+ HTStream *sink GCC_UNUSED)
+{
+ CTRACE((tfp, "HTMLPresent calling CacheThru_new\n"));
+ return CacheThru_new(anchor,
+ SGML_new(&HTML_dtd, anchor,
+ HTML_new(anchor, WWW_PRESENT, NULL), FALSE));
+}
+
+HTStream *XHTMLPresent(HTPresentation *pres GCC_UNUSED,
+ HTParentAnchor *anchor,
+ HTStream *sink GCC_UNUSED)
+{
+ CTRACE((tfp, "XHTMLPresent calling CacheThru_new\n"));
+ return CacheThru_new(anchor,
+ SGML_new(&HTML_dtd, anchor,
+ HTML_new(anchor, WWW_PRESENT, NULL), TRUE));
+}
+#endif /* !GUI */
+
+/* (Comments from original libwww:) */
+/* Record error message as a hypertext object
+ * ------------------------------------------
+ *
+ * The error message should be marked as an error so that
+ * it can be reloaded later.
+ * This implementation just throws up an error message
+ * and leaves the document unloaded.
+ * A smarter implementation would load an error document,
+ * marking at such so that it is retried on reload.
+ *
+ * On entry,
+ * sink is a stream to the output device if any
+ * number is the HTTP error number
+ * message is the human readable message.
+ *
+ * On exit,
+ * returns a negative number to indicate lack of success in the load.
+ */
+/* (We don't actually do any of that hypertext stuff for errors,
+ the trivial implementation for lynx just generates a message
+ and returns. - kw 1999-03-15)
+*/
+int HTLoadError(HTStream *sink GCC_UNUSED, int number,
+ const char *message)
+{
+ HTAlert(message); /* @@@@@@@@@@@@@@@@@@@ */
+ return -number;
+}
+
+static char *MakeNewTitle(STRING2PTR value, int src_type)
+{
+ char *ptr;
+ char *newtitle = NULL;
+
+ StrAllocCopy(newtitle, "[");
+ if (value != 0 && value[src_type] != 0) {
+ ptr = strrchr(value[src_type], '/');
+ if (!ptr) {
+ StrAllocCat(newtitle, value[src_type]);
+ } else {
+ StrAllocCat(newtitle, ptr + 1);
+ }
+ } else {
+ ptr = 0;
+ }
+#ifdef SH_EX /* 1998/04/02 (Thu) 16:02:00 */
+
+ /* for proxy server 1998/12/19 (Sat) 11:53:30 */
+ if (AS_casecomp(newtitle + 1, "internal-gopher-menu") == 0) {
+ StrAllocCopy(newtitle, "+");
+ } else if (AS_casecomp(newtitle + 1, "internal-gopher-unknown") == 0) {
+ StrAllocCopy(newtitle, " ");
+ } else {
+ /* normal title */
+ ptr = strrchr(newtitle, '.');
+ if (ptr) {
+ if (AS_casecomp(ptr, ".gif") == 0)
+ *ptr = '\0';
+ else if (AS_casecomp(ptr, ".jpg") == 0)
+ *ptr = '\0';
+ else if (AS_casecomp(ptr, ".jpeg") == 0)
+ *ptr = '\0';
+ }
+ StrAllocCat(newtitle, "]");
+ }
+#else
+ StrAllocCat(newtitle, "]");
+#endif
+ return newtitle;
+}
+
+static char *MakeNewImageValue(STRING2PTR value)
+{
+ char *ptr;
+ char *newtitle = NULL;
+
+ StrAllocCopy(newtitle, "[");
+ ptr = (value[HTML_INPUT_SRC]
+ ? strrchr(value[HTML_INPUT_SRC], '/')
+ : 0);
+ if (!ptr) {
+ StrAllocCat(newtitle, value[HTML_INPUT_SRC]);
+ } else {
+ StrAllocCat(newtitle, ptr + 1);
+ }
+ StrAllocCat(newtitle, "]-Submit");
+ return newtitle;
+}
+
+static char *MakeNewMapValue(STRING2PTR value, const char *mapstr)
+{
+ char *ptr;
+ char *newtitle = NULL;
+
+ StrAllocCopy(newtitle, "[");
+ StrAllocCat(newtitle, mapstr); /* ISMAP or USEMAP */
+ if (verbose_img && non_empty(value[HTML_IMG_SRC])) {
+ StrAllocCat(newtitle, ":");
+ ptr = strrchr(value[HTML_IMG_SRC], '/');
+ if (!ptr) {
+ StrAllocCat(newtitle, value[HTML_IMG_SRC]);
+ } else {
+ StrAllocCat(newtitle, ptr + 1);
+ }
+ }
+ StrAllocCat(newtitle, "]");
+ return newtitle;
+}
diff --git a/src/HTML.h b/src/HTML.h
new file mode 100644
index 0000000..6e5ebc3
--- /dev/null
+++ b/src/HTML.h
@@ -0,0 +1,283 @@
+/*
+ * $LynxId: HTML.h,v 1.36 2022/07/22 20:22:13 tom Exp $
+ *
+ * HTML to rich text converter for libwww
+ *
+ * THE HTML TO RTF OBJECT CONVERTER
+ *
+ * This interprets the HTML semantics.
+ */
+#ifndef HTML_H
+#define HTML_H
+
+#ifndef HTUTILS_H
+#include <HTUtils.h>
+#endif /* HTUTILS_H */
+
+#include <UCDefs.h>
+#include <UCAux.h>
+#include <HTAnchor.h>
+#include <HTMLDTD.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+/* #define ATTR_CS_IN (me->T.output_utf8 ? me->UCLYhndl : 0) */
+#define ATTR_CS_IN me->tag_charset
+#define TRANSLATE_AND_UNESCAPE_ENTITIES(s, p, h) \
+ LYUCTranslateHTMLString(s, ATTR_CS_IN, current_char_set, YES, p, h, st_HTML)
+#define TRANSLATE_AND_UNESCAPE_ENTITIES5(s,cs_from,cs_to,p,h) \
+ LYUCTranslateHTMLString(s, cs_from, cs_to, YES, p, h, st_HTML)
+#define TRANSLATE_AND_UNESCAPE_ENTITIES6(s,cs_from,cs_to,spcls,p,h) \
+ LYUCTranslateHTMLString(s, cs_from, cs_to, spcls, p, h, st_HTML)
+#define TRANSLATE_HTML(s,p,h) \
+ LYUCFullyTranslateString(s, me->UCLYhndl, current_char_set, NO, YES, p, h, NO, st_HTML)
+#define TRANSLATE_HTML5(s,cs_from,cs_to,p,h) \
+ LYUCFullyTranslateString(s, cs_from, cs_to, NO, YES, p, h, NO, st_HTML)
+#define TRANSLATE_HTML7(s,cs_from,cs_to,spcls,p,h,Back) \
+ LYUCFullyTranslateString(s, cs_from, cs_to, NO, spcls, p, h, Back, st_HTML)
+/*
+ * Strings from attributes which should be converted to some kind of "standard"
+ * representation (character encoding), was Latin-1, esp. URLs (incl.
+ * #fragments) and HTML NAME and ID stuff.
+ */
+#define TRANSLATE_AND_UNESCAPE_TO_STD(s) \
+ LYUCTranslateHTMLString(s, ATTR_CS_IN, ATTR_CS_IN, NO, NO, YES, st_URL)
+#define UNESCAPE_FIELDNAME_TO_STD(s) \
+ LYUCTranslateHTMLString(s, ATTR_CS_IN, ATTR_CS_IN, NO, NO, YES, st_HTML)
+ extern const HTStructuredClass HTMLPresentation;
+
+#ifdef Lynx_HTML_Handler
+/*
+ * This section is semi-private to HTML.c and it's helper modules. - FM
+ * --------------------------------------------------------------------
+ */
+
+ typedef struct _stack_element {
+ HTStyle *style;
+ int tag_number;
+ } stack_element;
+
+/* HTML Object
+ * -----------
+ */
+#define MAX_NESTING 800 /* Should be checked by parser */
+
+ struct _HTStructured {
+ const HTStructuredClass *isa;
+ HTParentAnchor *node_anchor;
+ HText *text;
+
+ HTStream *target; /* Output stream */
+ HTStreamClass targetClass; /* Output routines */
+
+ HTChildAnchor *CurrentA; /* current HTML_A anchor */
+ int CurrentANum; /* current HTML_A number */
+ char *base_href; /* current HTML_BASE href */
+ char *map_address; /* current HTML_MAP address */
+
+ HTChunk title; /* Grow by 128 */
+ HTChunk object; /* Grow by 128 */
+ BOOL object_started;
+ BOOL object_declare;
+ BOOL object_shapes;
+ BOOL object_ismap;
+ char *object_usemap;
+ char *object_id;
+ char *object_title;
+ char *object_data;
+ char *object_type;
+ char *object_classid;
+ char *object_codebase;
+ char *object_codetype;
+ char *object_name;
+ int objects_mixed_open, objects_figged_open;
+ HTChunk option; /* Grow by 128 */
+ BOOL first_option; /* First OPTION in SELECT? */
+ char *LastOptionValue;
+ BOOL LastOptionChecked;
+ BOOL select_disabled;
+ HTChunk textarea; /* Grow by 128 */
+ char *textarea_name;
+ int textarea_name_cs;
+ char *textarea_accept_cs;
+ int textarea_cols;
+ int textarea_rows;
+ int textarea_disabled;
+ int textarea_readonly;
+ char *textarea_id;
+ HTChunk math; /* Grow by 128 */
+ HTChunk style_block; /* Grow by 128 */
+ HTChunk script; /* Grow by 128 */
+
+ /*
+ * Used for nested lists. - FM
+ */
+ int List_Nesting_Level; /* counter for list nesting level */
+ int OL_Counter[12]; /* counter for ordered lists */
+ char OL_Type[12]; /* types for ordered lists */
+ int Last_OL_Count; /* last count in ordered lists */
+ char Last_OL_Type; /* last type in ordered lists */
+
+ int Division_Level;
+ short DivisionAlignments[MAX_NESTING];
+ int Underline_Level;
+ int Quote_Level;
+
+ BOOL UsePlainSpace;
+ BOOL HiddenValue;
+ int lastraw;
+
+ const char *comment_start; /* for literate programming */
+ const char *comment_end;
+
+ HTTag *current_tag;
+ BOOL style_change;
+ HTStyle *new_style;
+ HTStyle *old_style;
+ int current_default_alignment;
+ BOOL in_word; /* Have just had a non-white char */
+ stack_element stack[MAX_NESTING];
+ stack_element *sp; /* Style stack pointer */
+ BOOL stack_overrun; /* Was MAX_NESTING exceeded? */
+ int skip_stack; /* flag to skip next style stack operation */
+
+ /*
+ * Track if we are in an anchor, paragraph, address, base, etc.
+ */
+ BOOL inA;
+ BOOL inAPPLET;
+ BOOL inAPPLETwithP;
+ BOOL inBadHREF;
+ BOOL inBadHTML;
+ BOOL inBASE;
+ BOOL inBoldA;
+ BOOL inBoldH;
+ BOOL inCAPTION;
+ BOOL inCREDIT;
+ BOOL inFIG;
+ BOOL inFIGwithP;
+ BOOL inFONT;
+ BOOL inFORM;
+ BOOL inLABEL;
+ BOOL inP;
+ BOOL inPRE;
+ BOOL inSELECT;
+ BOOL inTABLE;
+ BOOL inTEXTAREA;
+ BOOL inUnderline;
+
+ BOOL needBoldH;
+
+ char *xinclude; /* if no include strin address passed */
+ /*
+ * UCI and UCLYhndl give the UCInfo and charset registered for the HTML
+ * parser in the node_anchor's UCStages structure. It indicates what is
+ * fed to the HTML parser as the stream of character data (not necessarily
+ * tags and attributes). It should currently always be set to be the same
+ * as UCI and UCLhndl for the HTEXT stage in the node_anchor's UCStages
+ * structure, since the HTML parser sends its input character data to the
+ * output without further charset translation.
+ */
+ LYUCcharset *UCI;
+ int UCLYhndl;
+ /*
+ * inUCI and inUCLYhndl indicate the UCInfo and charset which the HTML
+ * parser treats at the input charset. It is normally set to the UCI and
+ * UCLhndl for the SGML parser in the node_anchor's UCStages structure
+ * (which may be a dummy, based on the MIME parser's UCI and UCLhndl in
+ * that structure, when we are handling a local file or non-http(s)
+ * gateway). It could be changed temporarily by the HTML parser, for
+ * conversions of attribute strings, but should be reset once done. - FM
+ */
+ LYUCcharset *inUCI;
+ int inUCLYhndl;
+ /*
+ * outUCI and outUCLYhndl indicate the UCInfo and charset which the HTML
+ * parser treats as the output charset. It is normally set to its own UCI
+ * and UCLhndl. It could be changed for conversions of attribute strings,
+ * but should be reset once done. - FM
+ */
+ LYUCcharset *outUCI;
+ int outUCLYhndl;
+ /*
+ * T holds the transformation rules for conversions of strings between the
+ * input and output charsets by the HTML parser. - FM
+ */
+ UCTransParams T;
+
+ int tag_charset; /* charset for attribute values etc. */
+ };
+
+ extern HTStyle *LYstyles(int style_number);
+ extern BOOL LYBadHTML(HTStructured * me);
+ extern void LYShowBadHTML(const char *s);
+
+/*
+ * Semi-Private functions. - FM
+ */
+ extern void HTML_put_character(HTStructured * me, int c);
+ extern void HTML_put_string(HTStructured * me, const char *s);
+ extern void HTML_write(HTStructured * me, const char *s, int l);
+ extern int HTML_put_entity(HTStructured * me, int entity_number);
+ extern void actually_set_style(HTStructured * me);
+
+/* Style buffering avoids dummy paragraph begin/ends.
+*/
+#define UPDATE_STYLE if (me->style_change) { actually_set_style(me); }
+#endif /* Lynx_HTML_Handler */
+
+ extern void strtolower(char *i);
+
+/* P U B L I C
+*/
+
+/*
+ * HTConverter to present HTML
+ */
+ extern HTStream *HTMLToPlain(HTPresentation *pres,
+ HTParentAnchor *anchor,
+ HTStream *sink);
+
+ extern HTStream *HTMLParsedPresent(HTPresentation *pres,
+ HTParentAnchor *anchor,
+ HTStream *sink);
+
+ extern HTStream *HTMLToC(HTPresentation *pres,
+ HTParentAnchor *anchor,
+ HTStream *sink);
+
+ extern HTStream *HTMLPresent(HTPresentation *pres,
+ HTParentAnchor *anchor,
+ HTStream *sink);
+
+ extern HTStream *XHTMLPresent(HTPresentation *pres,
+ HTParentAnchor *anchor,
+ HTStream *sink);
+
+ extern HTStructured *HTML_new(HTParentAnchor *anchor,
+ HTFormat format_out,
+ HTStream *target);
+
+/*
+ * Record error message as a hypertext object.
+ *
+ * The error message should be marked as an error so that it can be reloaded
+ * later. This implementation just throws up an error message and leaves the
+ * document unloaded.
+ *
+ * On entry,
+ * sink is a stream to the output device if any
+ * number is the HTTP error number
+ * message is the human readable message.
+ * On exit,
+ * a return code like HT_LOADED if object exists else 60; 0
+ */
+ extern int HTLoadError(HTStream *sink,
+ int number,
+ const char *message);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* HTML_H */
diff --git a/src/HTNestedList.h b/src/HTNestedList.h
new file mode 100644
index 0000000..5a5f103
--- /dev/null
+++ b/src/HTNestedList.h
@@ -0,0 +1,44 @@
+#ifndef HTNESTEDLIST_H
+#define HTNESTEDLIST_H
+
+#define HTML_OL1 (HTML_ELEMENTS+1)
+#define HTML_OL2 (HTML_ELEMENTS+2)
+#define HTML_OL3 (HTML_ELEMENTS+3)
+#define HTML_OL4 (HTML_ELEMENTS+4)
+#define HTML_OL5 (HTML_ELEMENTS+5)
+#define HTML_OL6 (HTML_ELEMENTS+6)
+
+#define HTML_MENU1 (HTML_ELEMENTS+7)
+#define HTML_MENU2 (HTML_ELEMENTS+8)
+#define HTML_MENU3 (HTML_ELEMENTS+9)
+#define HTML_MENU4 (HTML_ELEMENTS+10)
+#define HTML_MENU5 (HTML_ELEMENTS+11)
+#define HTML_MENU6 (HTML_ELEMENTS+12)
+
+#define HTML_DL1 (HTML_ELEMENTS+13)
+#define HTML_DL2 (HTML_ELEMENTS+14)
+#define HTML_DL3 (HTML_ELEMENTS+15)
+#define HTML_DL4 (HTML_ELEMENTS+16)
+#define HTML_DL5 (HTML_ELEMENTS+17)
+#define HTML_DL6 (HTML_ELEMENTS+18)
+
+#define HTML_DLC1 (HTML_ELEMENTS+19)
+#define HTML_DLC2 (HTML_ELEMENTS+20)
+#define HTML_DLC3 (HTML_ELEMENTS+21)
+#define HTML_DLC4 (HTML_ELEMENTS+22)
+#define HTML_DLC5 (HTML_ELEMENTS+23)
+#define HTML_DLC6 (HTML_ELEMENTS+24)
+
+#define HTML_HCENTER (HTML_ELEMENTS+25)
+#define HTML_HLEFT (HTML_ELEMENTS+26)
+#define HTML_HRIGHT (HTML_ELEMENTS+27)
+
+#define HTML_DCENTER (HTML_ELEMENTS+28)
+#define HTML_DLEFT (HTML_ELEMENTS+29)
+#define HTML_DRIGHT (HTML_ELEMENTS+30)
+
+#define HTML_OBJECT_M (HTML_ELEMENTS+31)
+
+#define LYNX_HTML_EXTRA_ELEMENTS 31
+
+#endif /* HTNESTEDLIST_H */
diff --git a/src/HTSaveToFile.h b/src/HTSaveToFile.h
new file mode 100644
index 0000000..35ce390
--- /dev/null
+++ b/src/HTSaveToFile.h
@@ -0,0 +1,29 @@
+#ifndef HTSAVETOFILE_H
+#define HTSAVETOFILE_H
+
+#ifndef HTUTILS_H
+#include <HTUtils.h>
+#endif
+
+#include <HTStream.h>
+#include <HTFormat.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ extern HTStream *HTSaveToFile(HTPresentation *pres,
+ HTParentAnchor *anchor,
+ HTStream *sink);
+
+ extern HTStream *HTDumpToStdout(HTPresentation *pres,
+ HTParentAnchor *anchor,
+ HTStream *sink);
+
+ extern HTStream *HTCompressed(HTPresentation *pres,
+ HTParentAnchor *anchor,
+ HTStream *sink);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* HTSAVETOFILE_H */
diff --git a/src/LYBookmark.c b/src/LYBookmark.c
new file mode 100644
index 0000000..ee88cf9
--- /dev/null
+++ b/src/LYBookmark.c
@@ -0,0 +1,1169 @@
+/*
+ * $LynxId: LYBookmark.c,v 1.88 2023/01/07 16:09:53 tom Exp $
+ */
+#include <HTUtils.h>
+#include <HTAlert.h>
+#include <HTFile.h>
+#include <LYUtils.h>
+#include <LYStrings.h>
+#include <LYBookmark.h>
+#include <LYGlobalDefs.h>
+#include <LYClean.h>
+#include <LYKeymap.h>
+#include <LYCharUtils.h> /* need for META charset */
+#include <UCAux.h>
+#include <LYCharSets.h> /* need for LYHaveCJKCharacterSet */
+#include <LYCurses.h>
+#include <GridText.h>
+#include <HTCJK.h>
+
+#ifdef _WINDOWS
+#include <io.h> /* for _chsize() */
+#endif
+
+#ifdef VMS
+#include <nam.h>
+#endif /* VMS */
+
+#include <LYLeaks.h>
+
+char *MBM_A_subbookmark[MBM_V_MAXFILES + 1];
+char *MBM_A_subdescript[MBM_V_MAXFILES + 1];
+
+static BOOLEAN is_mosaic_hotlist = FALSE;
+static const char *convert_mosaic_bookmark_file(const char *filename_buffer);
+
+unsigned LYindex2MBM(int n)
+{
+ static char MBMcodes[MBM_V_MAXFILES + 2] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+
+ return n >= 0 && n <= MBM_V_MAXFILES ? UCH(MBMcodes[n]) : UCH('?');
+}
+
+int LYMBM2index(int ch)
+{
+ if ((ch = TOUPPER(ch)) > 0) {
+ const char *letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+ const char *result = StrChr(letters, ch);
+
+ if (result != 0
+ && (result - letters) <= MBM_V_MAXFILES)
+ return (int) (result - letters);
+ }
+ return -1;
+}
+
+static void show_bookmark_not_defined(void)
+{
+ char *string_buffer = 0;
+
+ HTSprintf0(&string_buffer,
+ BOOKMARK_FILE_NOT_DEFINED,
+ key_for_func(LYK_OPTIONS));
+ LYMBM_statusline(string_buffer);
+ FREE(string_buffer);
+}
+
+/*
+ * Tries to open a bookmark file for reading, which may be the default, or
+ * based on offering the user a choice from the MBM_A_subbookmark[] array. If
+ * successful the file is closed, and the filename in system path specs is
+ * returned, the URL is allocated into *URL, and the MBM_A_subbookmark[]
+ * filepath is allocated into the BookmarkPage global. Returns a zero-length
+ * pointer to flag a cancel, or a space to flag an undefined selection, without
+ * allocating into *URL or BookmarkPage. Returns NULL with allocating into
+ * BookmarkPage but not *URL is the selection is valid but the file doesn't yet
+ * exist. - FM
+ */
+const char *get_bookmark_filename(char **URL)
+{
+ static char filename_buffer[LY_MAXPATH];
+ char *string_buffer = 0;
+ FILE *fp;
+ int MBM_tmp;
+
+ /*
+ * Multi_Bookmarks support. - FMG & FM
+ * Let user select a bookmark file.
+ */
+ MBM_tmp = select_multi_bookmarks();
+ if (MBM_tmp == -2)
+ /*
+ * Zero-length pointer flags a cancel. - FM
+ */
+ return ("");
+ if (MBM_tmp == -1) {
+ show_bookmark_not_defined();
+ /*
+ * Space flags an undefined selection. - FMG
+ */
+ return (" ");
+ } else {
+ /*
+ * Save the filepath as a global. The system path will be loaded into
+ * to the (static) filename_buffer as the return value, the URL will be
+ * allocated into *URL, and we also need the filepath available to
+ * calling functions. This is all pitifully non-reentrant, a la the
+ * original Lynx, and should be redesigned someday. - FM
+ */
+ StrAllocCopy(BookmarkPage, MBM_A_subbookmark[MBM_tmp]);
+ }
+
+ /*
+ * Seek it in the home path. - FM
+ */
+ LYAddPathToHome(filename_buffer,
+ sizeof(filename_buffer),
+ BookmarkPage);
+ CTRACE((tfp, "\nget_bookmark_filename: SEEKING %s\n AS %s\n\n",
+ BookmarkPage, filename_buffer));
+ if ((fp = fopen(filename_buffer, TXT_R)) != NULL) {
+ /*
+ * We now have the file open.
+ * Check if it is a mosaic hotlist.
+ */
+ if (LYSafeGets(&string_buffer, fp) != 0
+ && *LYTrimNewline(string_buffer) != '\0'
+ && !StrNCmp(string_buffer, "ncsa-xmosaic-hotlist-format-1", 29)) {
+ const char *newname;
+
+ /*
+ * It is a mosaic hotlist file.
+ */
+ is_mosaic_hotlist = TRUE;
+ newname = convert_mosaic_bookmark_file(filename_buffer);
+ LYLocalFileToURL(URL, newname);
+ } else {
+ is_mosaic_hotlist = FALSE;
+ LYLocalFileToURL(URL, filename_buffer);
+ }
+ FREE(string_buffer);
+ LYCloseInput(fp);
+
+ return (filename_buffer); /* bookmark file exists */
+ }
+ return (NULL);
+
+} /* big end */
+
+/*
+ * Converts a Mosaic hotlist file into an HTML file for handling as a Lynx
+ * bookmark file. - FM
+ */
+static const char *convert_mosaic_bookmark_file(const char *filename_buffer)
+{
+ static char newfile[LY_MAXPATH];
+ FILE *fp, *nfp;
+ char *buf = NULL;
+ int line = -2;
+
+ (void) LYRemoveTemp(newfile);
+ if ((nfp = LYOpenTemp(newfile, HTML_SUFFIX, "w")) == NULL) {
+ LYMBM_statusline(NO_TEMP_FOR_HOTLIST);
+ LYSleepAlert();
+ return ("");
+ }
+
+ if ((fp = fopen(filename_buffer, TXT_R)) == NULL)
+ return (""); /* should always open */
+
+ fprintf(nfp, "<head>\n<title>%s</title>\n</head>\n", MOSAIC_BOOKMARK_TITLE);
+ fprintf(nfp, "%s\n\n<p>\n<ol>\n", gettext("\
+ This file is an HTML representation of the X Mosaic hotlist file.\n\
+ Outdated or invalid links may be removed by using the\n\
+ remove bookmark command, it is usually the 'R' key but may have\n\
+ been remapped by you or your system administrator."));
+
+ while ((LYSafeGets(&buf, fp)) != NULL) {
+ if (line >= 0) {
+ LYTrimNewline(buf);
+ if ((line % 2) == 0) { /* even lines */
+ if (*buf != '\0') {
+ strtok(buf, " "); /* kill everything after the space */
+ fprintf(nfp, "<li><a href=\"%s\">", buf); /* the URL */
+ }
+ } else { /* odd lines */
+ fprintf(nfp, "%s</a></li>\n", buf); /* the title */
+ }
+ }
+ /* else - ignore the line (this gets rid of first two lines) */
+ line++;
+ }
+ LYCloseTempFP(nfp);
+ LYCloseInput(fp);
+ return (newfile);
+}
+
+static BOOLEAN havevisible(const char *Title);
+static BOOLEAN have8bit(const char *Title);
+static char *title_convert8bit(const char *Title);
+
+#if defined(_WINDOWS) && !defined(ftruncate)
+#define ftruncate(fd, len) _chsize(fd, len)
+#endif
+
+/*
+ * Adds a link to a bookmark file, creating the file if it doesn't already
+ * exist, and making sure that no_cache is set for a pre-existing, cached file,
+ * so that the change will be evident on return to to that file. - FM
+ */
+void save_bookmark_link(const char *address,
+ const char *title)
+{
+ FILE *fp;
+ BOOLEAN first_time = FALSE;
+ const char *filename;
+ char *bookmark_URL = NULL;
+ char filename_buffer[LY_MAXPATH];
+ char *Address = NULL;
+ char *Title = NULL;
+ int i, c;
+ bstring *string_data = NULL;
+ bstring *tmp_data = NULL;
+ DocAddress WWWDoc;
+ HTParentAnchor *tmpanchor;
+ HText *text;
+
+ /*
+ * Make sure we were passed something to save. - FM
+ */
+ if (isEmpty(address)) {
+ HTAlert(MALFORMED_ADDRESS);
+ return;
+ }
+
+ /*
+ * Offer a choice of bookmark files, or get the default. - FMG
+ */
+ filename = get_bookmark_filename(&bookmark_URL);
+
+ /*
+ * If filename is NULL, must create a new file. If filename is a space, an
+ * invalid bookmark file was selected, or if zero-length, the user
+ * cancelled. Ignore request in both cases. Otherwise, make a copy before
+ * anything might change the static get_bookmark_filename() buffer. - FM
+ */
+ if (filename == NULL) {
+ first_time = TRUE;
+ filename_buffer[0] = '\0';
+ } else {
+ if (*filename == '\0' || !strcmp(filename, " ")) {
+ FREE(bookmark_URL);
+ return;
+ }
+ LYStrNCpy(filename_buffer, filename, sizeof(filename_buffer) - 1);
+ }
+
+ /*
+ * If BookmarkPage is NULL, something went wrong, so ignore the request. -
+ * FM
+ */
+ if (isEmpty(BookmarkPage)) {
+ FREE(bookmark_URL);
+ return;
+ }
+
+ /*
+ * If the link will be added to the same bookmark file, get confirmation.
+ * - FM
+ */
+ if (LYMultiBookmarks != MBM_OFF) {
+ const char *url = HTLoadedDocumentURL();
+ const char *page = ((*BookmarkPage == '.')
+ ? (BookmarkPage + 1)
+ : BookmarkPage);
+
+ if (strstr(url, page) != NULL) {
+ LYMBM_statusline(MULTIBOOKMARKS_SELF);
+ c = LYgetch_single();
+ if (c != 'L') {
+ FREE(bookmark_URL);
+ return;
+ }
+ }
+ }
+
+ /*
+ * Allow user to change the title. - FM
+ */
+ do {
+ if (HTCJK == JAPANESE) {
+ switch (kanji_code) {
+ case EUC:
+ BStrAlloc(tmp_data, MAX_LINE + 2 * (int) strlen(title));
+ TO_EUC((const unsigned char *) title, (unsigned char *) tmp_data->str);
+ break;
+ case SJIS:
+ BStrAlloc(tmp_data, MAX_LINE + (int) strlen(title));
+ TO_SJIS((const unsigned char *) title, (unsigned char *) tmp_data->str);
+ break;
+ default:
+ break;
+ }
+ BStrCopy0(string_data, tmp_data ? tmp_data->str : title);
+ } else {
+ BStrCopy0(string_data, title);
+ }
+ LYReduceBlanks(string_data->str);
+ LYMBM_statusline(TITLE_PROMPT);
+ LYgetBString(&string_data, FALSE, 0, NORECALL);
+ if (isBEmpty(string_data)) {
+ LYMBM_statusline(CANCELLED);
+ LYSleepMsg();
+ FREE(bookmark_URL);
+ BStrFree(tmp_data);
+ return;
+ }
+ } while (!havevisible(string_data->str));
+
+ /*
+ * Create the Title with any left-angle-brackets converted to &lt; entities
+ * and any ampersands converted to &amp; entities. - FM
+ *
+ * Convert 8-bit letters to &#xUUUU to avoid dependencies from display
+ * character set which may need changing. Do NOT convert any 8-bit chars
+ * if we have CJK display. - LP
+ */
+ LYformTitle(&Title, string_data->str);
+ LYEntify(&Title, TRUE);
+ if (UCSaveBookmarksInUnicode &&
+ have8bit(Title) && (!LYHaveCJKCharacterSet)) {
+ char *p = title_convert8bit(Title);
+
+ if (p != 0) {
+ FREE(Title);
+ Title = p;
+ }
+ }
+
+ /*
+ * Create the bookmark file, if it doesn't exist already, Otherwise, open
+ * the pre-existing bookmark file. - FM
+ */
+ SetDefaultMode(O_TEXT);
+ if (first_time) {
+ /*
+ * Seek it in the home path. - FM
+ */
+ LYAddPathToHome(filename_buffer,
+ sizeof(filename_buffer),
+ BookmarkPage);
+ }
+ CTRACE((tfp, "\nsave_bookmark_link: SEEKING %s\n AS %s\n\n",
+ BookmarkPage, filename_buffer));
+ if ((fp = fopen(filename_buffer, (first_time ? TXT_W : TXT_A))) == NULL) {
+ LYMBM_statusline(BOOKMARK_OPEN_FAILED);
+ LYSleepAlert();
+ FREE(Title);
+ FREE(bookmark_URL);
+ BStrFree(tmp_data);
+ return;
+ }
+
+ /*
+ * Convert all ampersands in the address to &amp; entities. - FM
+ */
+ StrAllocCopy(Address, address);
+ LYEntify(&Address, FALSE);
+
+ if (!first_time) {
+ BOOLEAN empty_file = TRUE;
+ FILE *bp = tmpfile();
+ char *buffer = NULL;
+
+ rewind(fp);
+ while (LYSafeGets(&buffer, fp)) {
+ empty_file = FALSE;
+ if (LYstrstr(buffer, "</ol>"))
+ break;
+ fprintf(bp, "%s", buffer);
+ }
+
+ fflush(bp);
+ rewind(bp);
+
+ rewind(fp);
+ ftruncate(fileno(fp), 0);
+
+ while (LYSafeGets(&buffer, bp)) {
+ fprintf(fp, "%s", buffer);
+ }
+ fclose(bp);
+
+ if (empty_file)
+ first_time = TRUE;
+ }
+
+ /*
+ * If we created a new bookmark file, write the headers. - FM
+ * Once and forever...
+ */
+ if (first_time) {
+ fprintf(fp, "%s\n", LYNX_DOCTYPE);
+ fprintf(fp, "<html>\n");
+ fprintf(fp, "<head>\n");
+#if defined(SH_EX) && !defined(_WINDOWS) /* 1997/12/11 (Thu) 19:13:40 */
+ if (HTCJK != JAPANESE)
+ LYAddMETAcharsetToFD(fp, -1);
+ else
+ fprintf(fp, "<meta %s %s>\n",
+ "http-equiv=\"content-type\"",
+ "content=\"" STR_HTML ";charset=iso-2022-jp\"");
+#else
+ LYAddMETAcharsetToFD(fp, -1);
+#endif /* !_WINDOWS */
+ fprintf(fp, "<title>%s</title>\n</head>\n", BOOKMARK_TITLE);
+ fprintf(fp, "<body>\n");
+#ifdef _WINDOWS
+ fprintf(fp, "<p>%s",
+ gettext(" You can delete links by the 'R' key<br>\n<ol>\n"));
+#else
+ fprintf(fp, "<p>%s<br>\n%s\n\n<!--\n%s\n--></p>\n\n<ol>\n",
+ gettext("\
+ You can delete links using the remove bookmark command. It is usually\n\
+ the 'R' key but may have been remapped by you or your system\n\
+ administrator."),
+ gettext("\
+ This file also may be edited with a standard text editor to delete\n\
+ outdated or invalid links, or to change their order."),
+ gettext("\
+Note: if you edit this file manually\n\
+ you should not change the format within the lines\n\
+ or add other HTML markup.\n\
+ Make sure any bookmark link is saved as a single line."));
+#endif /* _WINDOWS */
+ }
+
+ /*
+ * Add the bookmark link, in Mosaic hotlist or Lynx format. - FM
+ */
+ if (is_mosaic_hotlist) {
+ time_t NowTime = time(NULL);
+ char *TimeString = (char *) ctime(&NowTime);
+
+ /*
+ * TimeString has a \n at the end.
+ */
+ fprintf(fp, "%s %s%s\n", Address, TimeString, Title);
+ } else {
+ fprintf(fp, "<li><a href=\"%s\">%s</a></li>\n", Address, Title);
+ fprintf(fp, "</ol></body></html>\n");
+ }
+ LYCloseOutput(fp);
+
+ SetDefaultMode(O_BINARY);
+ /*
+ * If this is a cached bookmark file, set nocache for it so we'll see the
+ * new bookmark link when that cache is retrieved. - FM
+ */
+ if (!first_time && nhist > 0 && bookmark_URL) {
+ for (i = 0; i < nhist; i++) {
+ if (HDOC(i).bookmark &&
+ !strcmp(HDOC(i).address, bookmark_URL)) {
+ WWWDoc.address = HDOC(i).address;
+ WWWDoc.post_data = NULL;
+ WWWDoc.post_content_type = NULL;
+ WWWDoc.bookmark = HDOC(i).bookmark;
+ WWWDoc.isHEAD = FALSE;
+ WWWDoc.safe = FALSE;
+ tmpanchor = HTAnchor_findAddress(&WWWDoc);
+ if ((text = (HText *) HTAnchor_document(tmpanchor)) != NULL) {
+ HText_setNoCache(text);
+ }
+ break;
+ }
+ }
+ }
+
+ /*
+ * Clean up and report success.
+ */
+ BStrFree(string_data);
+ BStrFree(tmp_data);
+ FREE(Title);
+ FREE(Address);
+ FREE(bookmark_URL);
+ LYMBM_statusline(OPERATION_DONE);
+ LYSleepMsg();
+}
+
+/*
+ * Remove a link from a bookmark file. The calling function is expected to
+ * have used get_filename_link(), pass us the link number as cur, the
+ * MBM_A_subbookmark[] string as cur_bookmark_page, and to have set up no_cache
+ * itself. - FM
+ */
+void remove_bookmark_link(int cur,
+ char *cur_bookmark_page)
+{
+ FILE *fp, *nfp;
+ char *buf = NULL;
+ int n;
+
+#ifdef VMS
+ char filename_buffer[NAM$C_MAXRSS + 12];
+ char newfile[NAM$C_MAXRSS + 12];
+
+#define keep_tempfile FALSE
+#else
+ char filename_buffer[LY_MAXPATH];
+ char newfile[LY_MAXPATH];
+ BOOLEAN keep_tempfile = FALSE;
+
+#ifdef UNIX
+ struct stat stat_buf;
+ BOOLEAN regular = FALSE;
+#endif /* UNIX */
+#endif /* VMS */
+ char homepath[LY_MAXPATH];
+
+ CTRACE((tfp, "remove_bookmark_link: deleting link number: %d\n", cur));
+
+ if (!cur_bookmark_page)
+ return;
+ LYAddPathToHome(filename_buffer,
+ sizeof(filename_buffer),
+ cur_bookmark_page);
+ CTRACE((tfp, "\nremove_bookmark_link: SEEKING %s\n AS %s\n\n",
+ cur_bookmark_page, filename_buffer));
+ if ((fp = fopen(filename_buffer, TXT_R)) == NULL) {
+ HTAlert(BOOKMARK_OPEN_FAILED_FOR_DEL);
+ return;
+ }
+
+ LYAddPathToHome(homepath, sizeof(homepath), "");
+ if ((nfp = LYOpenScratch(newfile, homepath)) == 0) {
+ LYCloseInput(fp);
+ HTAlert(BOOKSCRA_OPEN_FAILED_FOR_DEL);
+ return;
+ }
+#ifdef UNIX
+ /*
+ * Explicitly preserve bookmark file mode on Unix. - DSL
+ */
+ if (stat(filename_buffer, &stat_buf) == 0) {
+ regular = (BOOLEAN) (S_ISREG(stat_buf.st_mode) && stat_buf.st_nlink == 1);
+ (void) chmod(newfile, HIDE_CHMOD);
+ if ((nfp = LYReopenTemp(newfile)) == NULL) {
+ (void) LYCloseInput(fp);
+ HTAlert(BOOKTEMP_REOPEN_FAIL_FOR_DEL);
+ return;
+ }
+ }
+#endif /* UNIX */
+
+ if (is_mosaic_hotlist) {
+ int del_line = cur * 2; /* two lines per entry */
+
+ n = -3; /* skip past cookie and name lines */
+ while (LYSafeGets(&buf, fp) != NULL) {
+ n++;
+ if (n == del_line || n == del_line + 1)
+ continue; /* remove two lines */
+ if (fputs(buf, nfp) == EOF)
+ goto failure;
+ }
+
+ } else {
+ char *cp;
+ BOOLEAN retain;
+ int seen;
+
+ n = -1;
+ while (LYSafeGets(&buf, fp) != NULL) {
+ int keep_ol = FALSE;
+
+ retain = TRUE;
+ seen = 0;
+ cp = buf;
+ if ((cur == 0) && LYstrstr(cp, "<ol><li>"))
+ keep_ol = TRUE; /* Do not erase, this corrects a bug in an
+ older version */
+ while (n < cur && (cp = LYstrstr(cp, "<a href="))) {
+ seen++;
+ if (++n == cur) {
+ if (seen != 1 || !LYstrstr(buf, "</a>") ||
+ LYstrstr((cp + 1), "<a href=")) {
+ HTAlert(BOOKMARK_LINK_NOT_ONE_LINE);
+ goto failure;
+ }
+ CTRACE((tfp, "remove_bookmark_link: skipping link %d\n", n));
+ if (keep_ol)
+ fprintf(nfp, "<ol>\n");
+ retain = FALSE;
+ }
+ cp += 8;
+ }
+ if (retain && fputs(buf, nfp) == EOF)
+ goto failure;
+ }
+ }
+
+ FREE(buf);
+ CTRACE((tfp, "remove_bookmark_link: files: %s %s\n",
+ newfile, filename_buffer));
+
+ LYCloseInput(fp);
+ fp = NULL;
+ if (fflush(nfp) == EOF) {
+ CTRACE((tfp, "fflush(nfp): %s", LYStrerror(errno)));
+ goto failure;
+ }
+ LYCloseTempFP(nfp);
+ nfp = NULL;
+#if defined(DOSPATH) || defined(__EMX__)
+ remove(filename_buffer);
+#endif /* DOSPATH */
+
+#ifdef UNIX
+ /*
+ * By copying onto the bookmark file, rather than renaming it, we can
+ * preserve the original ownership of the file, provided that it is
+ * writable by the current process.
+ *
+ * Changed to copy 1998-04-26 -- gil
+ *
+ * But if the copy fails, for example because the filesystem is full, we
+ * are left with a corrupt bookmark file. Changed back to use the previous
+ * mechanism [try rename(), then mv for EXDEV], except in usual cases (not
+ * a regular file e.g., symbolic link, or has hard links). This will let
+ * bookmarks survive a filesystem full condition in the "normal" case
+ * (bookmark is on same filesystem as home directory, is a regular file,
+ * has no additional hard links).
+ *
+ * If we first tried LYCopyFile, and that fails, also fall back to trying
+ * the other stuff. That gives a chance to recover in case the LYCopyFile
+ * left a corrupt target file.
+ *
+ * If there is an error, and that error may mean that the bookmark file has
+ * been corrupted, don't remove the temporary newfile (which should always
+ * be uncorrupted) in place, it may still be used to recover manually. If
+ * this applies, produce an additional message to that effect. The temp
+ * file will still be removed by normal program exit cleanup. - kw
+ * 1999-11-12
+ */
+ if (!regular) {
+ if (LYCopyFile(newfile, filename_buffer) == 0) {
+ (void) LYRemoveTemp(newfile);
+ return;
+ }
+ LYSleepAlert(); /* give a chance to see error from cp - kw */
+ HTUserMsg(BOOKTEMP_COPY_FAIL);
+ keep_tempfile = TRUE;
+ }
+#endif /* UNIX */
+
+ if (rename(newfile, filename_buffer) != -1) {
+#ifdef MULTI_USER_UNIX
+ if (regular)
+ chmod(filename_buffer, stat_buf.st_mode & 07777);
+#endif
+ HTSYS_purge(filename_buffer);
+ return;
+ } else {
+#ifndef VMS
+ /*
+ * Rename won't work across file systems. Check if this is the case
+ * and do something appropriate. Used to be ODD_RENAME
+ */
+#if defined(_WINDOWS) || defined(WIN_EX)
+#if defined(WIN_EX)
+ if (GetLastError() == ERROR_NOT_SAME_DEVICE)
+#else /* !_WIN_EX */
+ if (errno == ENOTSAM)
+#endif /* _WIN_EX */
+ {
+ if (rename(newfile, filename_buffer) != 0) {
+ if (LYCopyFile(newfile, filename_buffer) == 0)
+ remove(newfile);
+ }
+ }
+#else
+ if (errno == EXDEV) {
+ static const char MV_FMT[] = "%s %s %s";
+ char *buffer = 0;
+ const char *program;
+
+ if ((program = HTGetProgramPath(ppMV)) != NULL) {
+ HTAddParam(&buffer, MV_FMT, 1, program);
+ HTAddParam(&buffer, MV_FMT, 2, newfile);
+ HTAddParam(&buffer, MV_FMT, 3, filename_buffer);
+ HTEndParam(&buffer, MV_FMT, 3);
+ if (LYSystem(buffer) == 0) {
+#ifdef MULTI_USER_UNIX
+ if (regular)
+ chmod(filename_buffer, stat_buf.st_mode & 07777);
+#endif
+ FREE(buffer);
+ return;
+ }
+ }
+ FREE(buffer);
+ keep_tempfile = TRUE;
+ goto failure;
+ }
+ CTRACE((tfp, "rename(): %s", LYStrerror(errno)));
+#endif /* _WINDOWS */
+#endif /* !VMS */
+
+#ifdef VMS
+ HTAlert(ERROR_RENAMING_SCRA);
+#else
+ HTAlert(ERROR_RENAMING_TEMP);
+#endif /* VMS */
+ if (TRACE)
+ perror("renaming the file");
+ }
+
+ failure:
+ FREE(buf);
+ HTAlert(BOOKMARK_DEL_FAILED);
+ if (nfp)
+ LYCloseTempFP(nfp);
+ if (fp != NULL)
+ LYCloseInput(fp);
+ if (keep_tempfile) {
+ HTUserMsg2(gettext("File may be recoverable from %s during this session"),
+ newfile);
+ } else {
+ (void) LYRemoveTemp(newfile);
+ }
+}
+
+/*
+ * Allows user to select sub-bookmarks files. - FMG & FM
+ */
+int select_multi_bookmarks(void)
+{
+ int c;
+
+ /*
+ * If not enabled, pick the "default" (0).
+ */
+ if (LYMultiBookmarks == MBM_OFF || LYHaveSubBookmarks() == FALSE) {
+ if (MBM_A_subbookmark[0]) /* If it exists! */
+ return (0);
+ else
+ return (-1);
+ }
+
+ /*
+ * For ADVANCED users, we can just mess with the status line to save the 2
+ * redraws of the screen, if LYMBMAdvnced is TRUE. '=' will still show the
+ * screen and let them do it the "long" way.
+ */
+ if (LYMultiBookmarks == MBM_ADVANCED && (user_mode == ADVANCED_MODE)) {
+ LYMBM_statusline(MULTIBOOKMARKS_SELECT);
+ get_advanced_choice:
+ c = LYgetch();
+#ifdef VMS
+ if (HadVMSInterrupt) {
+ HadVMSInterrupt = FALSE;
+ c = LYCharINTERRUPT2;
+ }
+#endif /* VMS */
+ if (LYisNonAlnumKeyname(c, LYK_PREV_DOC) || LYCharIsINTERRUPT_HARD(c)) {
+ /*
+ * Treat left-arrow, ^G, or ^C as cancel.
+ */
+ return (-2);
+ }
+ if (LYisNonAlnumKeyname(c, LYK_REFRESH)) {
+ /*
+ * Refresh the screen.
+ */
+ lynx_force_repaint();
+ LYrefresh();
+ goto get_advanced_choice;
+ }
+ if (LYisNonAlnumKeyname(c, LYK_ACTIVATE)) {
+ /*
+ * Assume default bookmark file on ENTER or right-arrow.
+ */
+ return (MBM_A_subbookmark[0] ? 0 : -1);
+ }
+ switch (c) {
+ case '=':
+ /*
+ * Get the choice via the menu.
+ */
+ return (select_menu_multi_bookmarks());
+
+ default:
+ /*
+ * Convert to an array index, act on it if valid.
+ * Otherwise, get another keystroke.
+ */
+ if ((c = LYMBM2index(c)) < 0) {
+ goto get_advanced_choice;
+ }
+ }
+ /*
+ * See if we have a bookmark like that.
+ */
+ return (MBM_A_subbookmark[c] ? c : -1);
+ } else {
+ /*
+ * Get the choice via the menu.
+ */
+ return (select_menu_multi_bookmarks());
+ }
+}
+
+/*
+ * Allows user to select sub-bookmarks files. - FMG & FM
+ */
+int select_menu_multi_bookmarks(void)
+{
+ int c, d, MBM_tmp_count, MBM_allow;
+ int MBM_screens, MBM_from, MBM_to, MBM_current;
+
+ /*
+ * If not enabled, pick the "default" (0).
+ */
+ if (LYMultiBookmarks == MBM_OFF)
+ return (0);
+
+ /*
+ * Filip M. Gieszczykiewicz (filipg@paranoia.com) & FM
+ * ---------------------------------------------------
+ * MBM_A_subbookmark[n] - Hold values of the respective "multi_bookmarkn"
+ * in the lynxrc file.
+ *
+ * MBM_A_subdescript[n] - Hold description entries in the lynxrc file.
+ *
+ * Note: MBM_A_subbookmark[0] is defined to be same value as
+ * "bookmark_file" in the lynxrc file and/or the startup
+ * "bookmark_page".
+ *
+ * We make the display of bookmarks depend on rows we have available.
+ *
+ * We load BookmarkPage with the valid MBM_A_subbookmark[n] via
+ * get_bookmark_filename(). Otherwise, that function returns a zero-length
+ * string to indicate a cancel, a single space to indicate an invalid
+ * choice, or NULL to indicate an inaccessible file.
+ */
+ MBM_allow = (LYlines - 7); /* We need 7 for header and footer */
+ /*
+ * Screen big enough?
+ */
+ if (MBM_allow <= 0) {
+ /*
+ * Too small.
+ */
+ HTAlert(MULTIBOOKMARKS_SMALL);
+ return (-2);
+ }
+
+ MBM_screens = (MBM_V_MAXFILES / MBM_allow) + 1; /* int rounds off low. */
+
+ MBM_current = 1; /* Gotta start somewhere :-) */
+
+ for (;;) {
+ MBM_from = MBM_allow * MBM_current - MBM_allow;
+ if (MBM_from < 0)
+ MBM_from = 0; /* 0 is default bookmark... */
+ if (MBM_current != 1)
+ MBM_from++;
+
+ MBM_to = (MBM_allow * MBM_current);
+ if (MBM_to > MBM_V_MAXFILES)
+ MBM_to = MBM_V_MAXFILES;
+
+ /*
+ * Display menu of bookmarks. NOTE that we avoid printw()'s to
+ * increase the chances that any non-ASCII or multibyte/CJK characters
+ * will be handled properly. - FM
+ */
+ LYclear();
+ LYmove(1, 5);
+ lynx_start_h1_color();
+ if (MBM_screens > 1) {
+ char *shead_buffer = 0;
+
+ HTSprintf0(&shead_buffer,
+ MULTIBOOKMARKS_SHEAD_MASK, MBM_current, MBM_screens);
+ LYaddstr(shead_buffer);
+ FREE(shead_buffer);
+ } else {
+ LYaddstr(MULTIBOOKMARKS_SHEAD);
+ }
+
+ lynx_stop_h1_color();
+
+ MBM_tmp_count = 0;
+ for (c = MBM_from; c <= MBM_to; c++) {
+ LYmove(3 + MBM_tmp_count, 5);
+ LYaddch(UCH(LYindex2MBM(c)));
+ LYaddstr(" : ");
+ if (MBM_A_subdescript[c])
+ LYaddstr(MBM_A_subdescript[c]);
+ LYmove(3 + MBM_tmp_count, 36);
+ LYaddch('(');
+ if (MBM_A_subbookmark[c])
+ LYaddstr(MBM_A_subbookmark[c]);
+ LYaddch(')');
+ MBM_tmp_count++;
+ }
+
+ /*
+ * Don't need to show it if it all fits on one screen!
+ */
+ if (MBM_screens > 1) {
+ LYmove(LYlines - 2, 0);
+ LYaddstr("'");
+ lynx_start_bold();
+ LYaddstr("[");
+ lynx_stop_bold();
+ LYaddstr("' ");
+ LYaddstr(PREVIOUS);
+ LYaddstr(", '");
+ lynx_start_bold();
+ LYaddstr("]");
+ lynx_stop_bold();
+ LYaddstr("' ");
+ LYaddstr(NEXT_SCREEN);
+ }
+
+ LYMBM_statusline(MULTIBOOKMARKS_SAVE);
+
+ for (;;) {
+ c = LYgetch();
+#ifdef VMS
+ if (HadVMSInterrupt) {
+ HadVMSInterrupt = FALSE;
+ c = 7;
+ }
+#endif /* VMS */
+
+ if ((d = LYMBM2index(c)) >= 0) {
+ /*
+ * See if we have a bookmark like that.
+ */
+ if (non_empty(MBM_A_subbookmark[d]))
+ return (d);
+
+ show_bookmark_not_defined();
+ LYMBM_statusline(MULTIBOOKMARKS_SAVE);
+ } else if (LYisNonAlnumKeyname(c, LYK_PREV_DOC) ||
+ c == 7 || c == 3) {
+ /*
+ * Treat left-arrow, ^G, or ^C as cancel.
+ */
+ return (-2);
+ } else if (LYisNonAlnumKeyname(c, LYK_REFRESH)) {
+ /*
+ * Refresh the screen.
+ */
+ lynx_force_repaint();
+ LYrefresh();
+ } else if (LYisNonAlnumKeyname(c, LYK_ACTIVATE)) {
+ /*
+ * Assume default bookmark file on ENTER or right-arrow.
+ */
+ return (MBM_A_subbookmark[0] ? 0 : -1);
+ } else if ((c == ']' || LYisNonAlnumKeyname(c, LYK_NEXT_PAGE)) &&
+ MBM_screens > 1) {
+ /*
+ * Next range, if available.
+ */
+ if (++MBM_current > MBM_screens)
+ MBM_current = 1;
+ break;
+ }
+
+ else if ((c == '[' || LYisNonAlnumKeyname(c, LYK_PREV_PAGE)) &&
+ MBM_screens > 1) {
+ /*
+ * Previous range, if available.
+ */
+ if (--MBM_current <= 0)
+ MBM_current = MBM_screens;
+ break;
+ }
+ }
+ }
+}
+
+/*
+ * This function returns TRUE if we have sub-bookmarks defined. Otherwise
+ * (i.e., only the default bookmark file is defined), it returns FALSE. - FM
+ */
+BOOLEAN LYHaveSubBookmarks(void)
+{
+ int i;
+
+ for (i = 1; i < MBM_V_MAXFILES; i++) {
+ if (non_empty(MBM_A_subbookmark[i]))
+ return (TRUE);
+ }
+
+ return (FALSE);
+}
+
+/*
+ * This function passes a string to _statusline(), making sure it is at the
+ * bottom of the screen if LYMultiBookmarks is not MBM_OFF, otherwise, letting
+ * it go to the normal statusline position based on the current user mode. We
+ * want to use _statusline() so that any multibyte/CJK characters in the string
+ * will be handled properly. - FM
+ */
+void LYMBM_statusline(const char *text)
+{
+ if (LYMultiBookmarks != MBM_OFF && user_mode == NOVICE_MODE) {
+ LYStatusLine = (LYlines - 1);
+ _statusline(text);
+ LYStatusLine = -1;
+ } else {
+ _statusline(text);
+ }
+}
+
+/*
+ * Check whether we have any visible (non-blank) chars.
+ */
+static BOOLEAN havevisible(const char *Title)
+{
+ BOOLEAN result = FALSE;
+ const char *p = Title;
+ unsigned char c;
+ long unicode;
+
+ for (; *p; p++) {
+ c = UCH(TOASCII(*p));
+ if (c > 32 && c < 127) {
+ result = TRUE;
+ break;
+ }
+ if (c <= 32 || c == 127)
+ continue;
+ if (LYHaveCJKCharacterSet || !UCCanUniTranslateFrom(current_char_set)) {
+ result = TRUE;
+ break;
+ }
+ unicode = UCTransToUni(*p, current_char_set);
+ if (unicode == ucNeedMore)
+ continue;
+ if (unicode > 32 && unicode < 127) {
+ result = TRUE;
+ break;
+ }
+ if (unicode <= 32 || unicode == 0xa0 || unicode == 0xad)
+ continue;
+ if (unicode < 0x2000 || unicode >= 0x200f) {
+ result = TRUE;
+ break;
+ }
+ }
+ return (result);
+}
+
+/*
+ * Check whether string have 8 bit chars.
+ */
+static BOOLEAN have8bit(const char *Title)
+{
+ const char *p = Title;
+
+ for (; *p; p++) {
+ if (UCH(*p) > 127)
+ return (TRUE);
+ }
+ return (FALSE); /* if we came here */
+}
+
+/*
+ * Ok, title have 8-bit characters and they are in display charset. Bookmarks
+ * is a permanent file. To avoid dependencies from display character set which
+ * may be changed with time we store 8-bit characters as numeric character
+ * reference (NCR), so where the character encoded as unicode number in form of
+ * &#xUUUU;
+ *
+ * To make bookmarks more readable for human (&#xUUUU certainly not) we add a
+ * comment with '7-bit approximation' from the converted string. This is a
+ * valid HTML and bookmarks code.
+ *
+ * We do not want use META charset tag in bookmarks file: it will never be
+ * changed later :-(
+ *
+ * NCR's translation is part of I18N and HTML4.0 supported starting with Lynx
+ * 2.7.2, Netscape 4.0 and MSIE 4.0. Older versions fail.
+ */
+static char *title_convert8bit(const char *Title)
+{
+ const char *p = Title;
+ char *p0;
+ char *q;
+ char *comment = NULL;
+ char *ncr = NULL;
+ char *buf = NULL;
+ int charset_in = current_char_set;
+ int charset_out = UCGetLYhndl_byMIME("us-ascii");
+
+ for (; *p; p++) {
+ char temp[2];
+
+ LYStrNCpy(temp, p, sizeof(temp) - 1);
+ if (UCH(*temp) <= 127) {
+ StrAllocCat(comment, temp);
+ StrAllocCat(ncr, temp);
+ } else if (charset_out >= 0) {
+ long unicode;
+ char replace_buf[32];
+
+ if (UCTransCharStr(replace_buf, (int) sizeof(replace_buf), *temp,
+ charset_in, charset_out, YES) > 0)
+ StrAllocCat(comment, replace_buf);
+
+ unicode = UCTransToUni(*temp, charset_in);
+
+ StrAllocCat(ncr, "&#");
+ sprintf(replace_buf, "%ld", unicode);
+ StrAllocCat(ncr, replace_buf);
+ StrAllocCat(ncr, ";");
+ }
+ }
+
+ if (comment != NULL) {
+ /*
+ * Cleanup comment, collapse multiple dashes into one dash, skip '>'.
+ */
+ for (q = p0 = comment; *p0; p0++) {
+ if (UCH(TOASCII(*p0)) >= 32 &&
+ *p0 != '>' &&
+ (q == comment || *p0 != '-' || *(q - 1) != '-')) {
+ *q++ = *p0;
+ }
+ }
+ *q = '\0';
+
+ /*
+ * valid bookmark should be a single line (no linebreaks!).
+ */
+ StrAllocCat(buf, "<!-- ");
+ StrAllocCat(buf, comment);
+ StrAllocCat(buf, " -->");
+ StrAllocCat(buf, ncr);
+
+ FREE(comment);
+ }
+ FREE(ncr);
+ return (buf);
+}
+
+/*
+ * Since this is the "Default Bookmark File", we save it as a global, and as
+ * the first MBM_A_subbookmark entry.
+ */
+void set_default_bookmark_page(char *value)
+{
+ if (value != 0) {
+ if (bookmark_page == NULL
+ || strcmp(bookmark_page, value)) {
+ StrAllocCopy(bookmark_page, value);
+ }
+ StrAllocCopy(BookmarkPage, bookmark_page);
+ StrAllocCopy(MBM_A_subbookmark[0], bookmark_page);
+ StrAllocCopy(MBM_A_subdescript[0], MULTIBOOKMARKS_DEFAULT);
+ }
+}
diff --git a/src/LYBookmark.h b/src/LYBookmark.h
new file mode 100644
index 0000000..a9eb494
--- /dev/null
+++ b/src/LYBookmark.h
@@ -0,0 +1,25 @@
+#ifndef LYBOOKMARK_H
+#define LYBOOKMARK_H
+
+#ifndef LYSTRUCTS_H
+#include <LYStructs.h>
+#endif /* LYSTRUCTS_H */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ extern BOOLEAN LYHaveSubBookmarks(void);
+ extern const char *get_bookmark_filename(char **name);
+ extern int LYMBM2index(int ch);
+ extern unsigned LYindex2MBM(int n);
+ extern int select_menu_multi_bookmarks(void);
+ extern int select_multi_bookmarks(void);
+ extern void LYMBM_statusline(const char *text);
+ extern void remove_bookmark_link(int cur, char *cur_bookmark_page);
+ extern void save_bookmark_link(const char *address, const char *title);
+ extern void set_default_bookmark_page(char *value);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* LYBOOKMARK_H */
diff --git a/src/LYCgi.c b/src/LYCgi.c
new file mode 100644
index 0000000..72493b2
--- /dev/null
+++ b/src/LYCgi.c
@@ -0,0 +1,757 @@
+/*
+ * $LynxId: LYCgi.c,v 1.72 2018/03/18 18:56:05 tom Exp $
+ * Lynx CGI support LYCgi.c
+ * ================
+ *
+ * Authors
+ * GL George Lindholm <George.Lindholm@ubc.ca>
+ *
+ * History
+ * 15 Jun 95 Created as way to provide a lynx based service with
+ * dynamic pages without the need for a http daemon. GL
+ * 27 Jun 95 Added <index> (command line) support. Various cleanup
+ * and bug fixes. GL
+ * 04 Sep 97 Added support for PATH_INFO scripts. JKT
+ *
+ * Bugs
+ * If the called scripts aborts before sending the mime headers then
+ * lynx hangs.
+ *
+ * Should do something about SIGPIPE, (but then it should never happen)
+ *
+ * No support for redirection. Or mime-types.
+ *
+ * Should try and parse for a HTTP 1.1 header in case we are "calling" a
+ * nph- script.
+ */
+
+#include <HTUtils.h>
+#include <HTTP.h>
+#include <HTParse.h>
+#include <HTTCP.h>
+#include <HTFormat.h>
+#include <HTFile.h>
+#include <HTAlert.h>
+#include <HTMIME.h>
+#include <HTAABrow.h>
+
+#include <LYGlobalDefs.h>
+#include <LYUtils.h>
+#include <HTML.h>
+#include <HTInit.h>
+#include <LYGetFile.h>
+#include <LYBookmark.h>
+#include <GridText.h>
+#include <LYCgi.h>
+#include <LYStrings.h>
+#include <LYLocal.h>
+
+#include <LYLeaks.h>
+#include <www_wait.h>
+
+static char **env = NULL; /* Environment variables */
+static unsigned envc_size = 0; /* Slots in environment array */
+static unsigned envc = 0; /* Slots used so far */
+static HTList *alloced = NULL;
+
+#if defined(LYNXCGI_LINKS) && !defined(__MINGW32__)
+static char *user_agent = NULL;
+static char *server_software = NULL;
+static char *accept_language = NULL;
+static char *post_len = NULL;
+#endif /* LYNXCGI_LINKS */
+
+static void add_environment_value(const char *env_value);
+
+#define PERROR(msg) CTRACE((tfp, "LYNXCGI: %s: %s\n", msg, LYStrerror(errno)))
+
+#define PUTS(buf) (*target->isa->put_block)(target, buf, strlen(buf))
+
+#ifdef LY_FIND_LEAKS
+static void free_alloced_lynxcgi(void)
+{
+ void *ptr;
+
+ while ((ptr = HTList_removeLastObject(alloced)) != NULL) {
+ FREE(ptr);
+ }
+ FREE(alloced);
+#ifdef LYNXCGI_LINKS
+ FREE(user_agent);
+ FREE(server_software);
+#endif
+}
+#endif /* LY_FIND_LEAKS */
+
+static void remember_alloced(void *ptr)
+{
+ if (!alloced) {
+ alloced = HTList_new();
+#ifdef LY_FIND_LEAKS
+ atexit(free_alloced_lynxcgi);
+#endif
+ }
+ HTList_addObject(alloced, ptr);
+}
+
+/*
+ * Simple routine for expanding the environment array and adding a value to
+ * it
+ */
+static void add_environment_value(const char *env_value)
+{
+ if (envc == envc_size) { /* Need some more slots */
+ envc_size += 10;
+ if (env) {
+ env = (char **) realloc(env,
+ sizeof(env[0]) * (envc_size + 2));
+ /* + terminator and base 0 */
+ } else {
+ env = (char **) malloc(sizeof(env[0]) * (envc_size + 2));
+ /* + terminator and base 0 */
+ remember_alloced(env);
+ }
+ if (env == NULL) {
+ outofmem(__FILE__, "LYCgi");
+ }
+ }
+
+ env[envc++] = DeConst(env_value);
+ env[envc] = NULL; /* Make sure it is always properly terminated */
+}
+
+/*
+ * Add the value of an existing environment variable to those passed on to the
+ * lynxcgi script.
+ */
+void add_lynxcgi_environment(const char *variable_name)
+{
+ char *env_value;
+
+ env_value = LYGetEnv(variable_name);
+ if (env_value != NULL) {
+ char *add_value = NULL;
+
+ HTSprintf0(&add_value, "%s=%s", variable_name, env_value);
+ add_environment_value(add_value);
+ remember_alloced(add_value);
+ }
+}
+
+#ifdef __MINGW32__
+static int LYLoadCGI(const char *arg,
+ HTParentAnchor *anAnchor,
+ HTFormat format_out,
+ HTStream *sink)
+{
+ (void) arg;
+ (void) anAnchor;
+ (void) format_out;
+ (void) sink;
+ return -1;
+}
+#else
+#ifdef LYNXCGI_LINKS
+/*
+ * Wrapper for exec_ok(), confirming with user if the link text is not visible
+ * in the status line.
+ */
+static BOOL can_exec_cgi(const char *linktext, const char *linkargs)
+{
+ const char *format = gettext("Do you want to execute \"%s\"?");
+ char *message = NULL;
+ char *command = NULL;
+ char *p;
+ BOOL result = TRUE;
+
+ if (!exec_ok(HTLoadedDocumentURL(), linktext, CGI_PATH)) {
+ /* exec_ok gives out msg. */
+ result = FALSE;
+ } else {
+ StrAllocCopy(command, linktext);
+ if (non_empty(linkargs)) {
+ HTSprintf(&command, " %s", linkargs);
+ }
+ HTUnEscape(command);
+ for (p = command; *p; ++p)
+ if (*p == '+')
+ *p = ' ';
+ HTSprintf0(&message, format, command);
+ result = HTConfirm(message);
+ FREE(message);
+ FREE(command);
+ }
+ return result;
+}
+#endif /* LYNXCGI_LINKS */
+
+static int LYLoadCGI(const char *arg,
+ HTParentAnchor *anAnchor,
+ HTFormat format_out,
+ HTStream *sink)
+{
+ int status = 0;
+
+#ifdef LYNXCGI_LINKS
+#ifndef VMS
+ char *cp;
+ struct stat stat_buf;
+ char *pgm = NULL; /* executable */
+ char *pgm_args = NULL; /* and its argument(s) */
+ int statrv;
+ char *orig_pgm = NULL; /* Path up to ? as given, URL-escaped */
+ char *document_root = NULL; /* Corrected value of DOCUMENT_ROOT */
+ char *path_info = NULL; /* PATH_INFO extracted from pgm */
+ char *pgm_buff = NULL; /* PATH_INFO extraction buffer */
+ char *path_translated; /* From document_root/path_info */
+
+ if (isEmpty(arg) || strlen(arg) <= 8) {
+ HTAlert(BAD_REQUEST);
+ status = -2;
+ return (status);
+
+ } else {
+ if (StrNCmp(arg, "lynxcgi://localhost", 19) == 0) {
+ StrAllocCopy(pgm, arg + 19);
+ } else {
+ StrAllocCopy(pgm, arg + 8);
+ }
+ if ((cp = StrChr(pgm, '?')) != NULL) { /* Need to terminate executable */
+ *cp++ = '\0';
+ pgm_args = cp;
+ }
+ }
+
+ StrAllocCopy(orig_pgm, pgm);
+ if (trimPoundSelector(pgm) != NULL) {
+ /*
+ * Strip a #fragment from path. In this case any pgm_args found above
+ * will also be bogus, since the '?' came after the '#' and is part of
+ * the fragment. Note that we don't handle the case where a '#'
+ * appears after a '?' properly according to URL rules. - kw
+ */
+ pgm_args = NULL;
+ }
+ HTUnEscape(pgm);
+
+ /* BEGIN WebSter Mods */
+ /* If pgm is not stat-able, see if PATH_INFO data is at the end of pgm */
+ if ((statrv = stat(pgm, &stat_buf)) < 0) {
+ StrAllocCopy(pgm_buff, pgm);
+ while (statrv < 0 || (statrv = stat(pgm_buff, &stat_buf)) < 0) {
+ if ((cp = strrchr(pgm_buff, '/')) != NULL) {
+ *cp = '\0';
+ statrv = 1; /* force new stat() - kw */
+ } else {
+ PERROR("strrchr(pgm_buff, '/') returned NULL");
+ break;
+ }
+ }
+
+ if (statrv < 0) {
+ /* Did not find PATH_INFO data */
+ PERROR("stat() of pgm_buff failed");
+ } else {
+ /* Found PATH_INFO data. Strip it off of pgm and into path_info. */
+ StrAllocCopy(path_info, pgm + strlen(pgm_buff));
+ /* The following is safe since pgm_buff was derived from pgm
+ by stripping stuff off its end and by HTUnEscaping, so we
+ know we have enough memory allocated for pgm. Note that
+ pgm_args may still point into that memory, so we cannot
+ reallocate pgm here. - kw */
+ strcpy(pgm, pgm_buff);
+ CTRACE((tfp,
+ "LYNXCGI: stat() of %s succeeded, path_info=\"%s\".\n",
+ pgm_buff, path_info));
+ }
+ FREE(pgm_buff);
+ }
+ /* END WebSter Mods */
+
+ if (statrv != 0) {
+ /*
+ * Neither the path as given nor any components examined by backing up
+ * were stat()able. - kw
+ */
+ HTAlert(gettext("Unable to access cgi script"));
+ PERROR("stat() failed");
+ status = -4;
+
+ } else
+#ifdef _WINDOWS /* 1998/01/14 (Wed) 09:16:04 */
+#define isExecutable(mode) (mode & (S_IXUSR))
+#else
+#define isExecutable(mode) (mode & (S_IXUSR|S_IXGRP|S_IXOTH))
+#endif
+ if (!(S_ISREG(stat_buf.st_mode) && isExecutable(stat_buf.st_mode))) {
+ /*
+ * Not a runnable file, See if we can load it using "file:" code.
+ */
+ char *new_arg = NULL;
+
+ /*
+ * But try "file:" only if the file we are looking at is the path as
+ * given (no path_info was extracted), otherwise it will be to
+ * confusing to know just what file is loaded. - kw
+ */
+ if (path_info) {
+ CTRACE((tfp,
+ "%s is not a file and %s not an executable, giving up.\n",
+ orig_pgm, pgm));
+ FREE(path_info);
+ FREE(pgm);
+ FREE(orig_pgm);
+ status = -4;
+ return (status);
+ }
+
+ LYLocalFileToURL(&new_arg, orig_pgm);
+
+ CTRACE((tfp, "%s is not an executable file, passing the buck.\n", arg));
+ status = HTLoadFile(new_arg, anAnchor, format_out, sink);
+ FREE(new_arg);
+
+ } else if (path_info &&
+ anAnchor != HTMainAnchor &&
+ !(reloading && anAnchor->document) &&
+ strcmp(arg, HTLoadedDocumentURL()) &&
+ HText_AreDifferent(anAnchor, arg) &&
+ HTUnEscape(orig_pgm) &&
+ !can_exec_cgi(orig_pgm, "")) {
+ /*
+ * If we have extra path info and are not just reloading the current,
+ * check the full file path (after unescaping) now to catch forbidden
+ * segments. - kw
+ */
+ status = HT_NOT_LOADED;
+
+ } else if (no_lynxcgi) {
+ HTUserMsg(CGI_DISABLED);
+ status = HT_NOT_LOADED;
+
+ } else if (no_bookmark_exec &&
+ anAnchor != HTMainAnchor &&
+ !(reloading && anAnchor->document) &&
+ strcmp(arg, HTLoadedDocumentURL()) &&
+ HText_AreDifferent(anAnchor, arg) &&
+ HTLoadedDocumentBookmark()) {
+ /*
+ * If we are reloading a lynxcgi document that had already been loaded,
+ * the various checks above should allow it even if no_bookmark_exec is
+ * TRUE an we are not now coming from a bookmark page. - kw
+ */
+ HTUserMsg(BOOKMARK_EXEC_DISABLED);
+ status = HT_NOT_LOADED;
+
+ } else if (anAnchor != HTMainAnchor &&
+ !(reloading && anAnchor->document) &&
+ strcmp(arg, HTLoadedDocumentURL()) &&
+ HText_AreDifferent(anAnchor, arg) &&
+ !can_exec_cgi(pgm, pgm_args)) {
+ /*
+ * If we are reloading a lynxcgi document that had already been loaded,
+ * the various checks above should allow it even if exec_ok() would
+ * reject it because we are not now coming from a document with a URL
+ * allowed by TRUSTED_LYNXCGI rules. - kw
+ */
+ status = HT_NOT_LOADED;
+
+ } else {
+ HTFormat format_in;
+ HTStream *target = NULL; /* Unconverted data */
+ int fd1[2], fd2[2];
+ char buf[MAX_LINE];
+ int pid;
+
+#ifdef HAVE_TYPE_UNIONWAIT
+ union wait wstatus;
+
+#else
+ int wstatus;
+#endif
+
+ fd1[0] = -1;
+ fd1[1] = -1;
+ fd2[0] = -1;
+ fd2[1] = -1;
+
+ if (anAnchor->isHEAD || keep_mime_headers) {
+
+ /* Show output as plain text */
+ format_in = WWW_PLAINTEXT;
+ } else {
+
+ /* Decode full HTTP response */
+ format_in = HTAtom_for("www/mime");
+ }
+
+ target = HTStreamStack(format_in,
+ format_out,
+ sink, anAnchor);
+
+ if (target == NULL) {
+ char *tmp = 0;
+
+ HTSprintf0(&tmp, CANNOT_CONVERT_I_TO_O,
+ HTAtom_name(format_in),
+ HTAtom_name(format_out));
+ HTAlert(tmp);
+ FREE(tmp);
+ status = HT_NOT_LOADED;
+
+ } else if (anAnchor->post_data && pipe(fd1) < 0) {
+ HTAlert(CONNECT_SET_FAILED);
+ PERROR("pipe() failed");
+ status = -3;
+
+ } else if (pipe(fd2) < 0) {
+ HTAlert(CONNECT_SET_FAILED);
+ PERROR("pipe() failed");
+ close(fd1[0]);
+ close(fd1[1]);
+ status = -3;
+
+ } else {
+ static BOOL first_time = TRUE; /* One time setup flag */
+
+ if (first_time) { /* Set up static environment variables */
+ first_time = FALSE; /* Only once */
+
+ add_environment_value("REMOTE_HOST=localhost");
+ add_environment_value("REMOTE_ADDR=127.0.0.1");
+
+ HTSprintf0(&user_agent, "HTTP_USER_AGENT=%s/%s libwww/%s",
+ LYNX_NAME, LYNX_VERSION, HTLibraryVersion);
+ add_environment_value(user_agent);
+
+ HTSprintf0(&server_software, "SERVER_SOFTWARE=%s/%s",
+ LYNX_NAME, LYNX_VERSION);
+ add_environment_value(server_software);
+ }
+ fflush(stdout);
+ fflush(stderr);
+ CTRACE_FLUSH(tfp);
+
+ if ((pid = fork()) > 0) { /* The good, */
+ ssize_t chars;
+ off_t total_chars;
+
+ close(fd2[1]);
+
+ if (anAnchor->post_data) {
+ ssize_t written;
+ int remaining, total_written = 0;
+
+ close(fd1[0]);
+
+ /* We have form data to push across the pipe */
+ if (TRACE) {
+ CTRACE((tfp,
+ "LYNXCGI: Doing post, content-type '%s'\n",
+ anAnchor->post_content_type));
+ CTRACE((tfp, "LYNXCGI: Writing:\n"));
+ trace_bstring(anAnchor->post_data);
+ CTRACE((tfp, "----------------------------------\n"));
+ }
+ remaining = BStrLen(anAnchor->post_data);
+ while ((written = write(fd1[1],
+ BStrData(anAnchor->post_data) + total_written,
+ (size_t) remaining)) != 0) {
+ if (written < 0) {
+#ifdef EINTR
+ if (errno == EINTR)
+ continue;
+#endif /* EINTR */
+#ifdef ERESTARTSYS
+ if (errno == ERESTARTSYS)
+ continue;
+#endif /* ERESTARTSYS */
+ PERROR("write() of POST data failed");
+ break;
+ }
+ CTRACE((tfp, "LYNXCGI: Wrote %d bytes of POST data.\n",
+ (int) written));
+ total_written += (int) written;
+ remaining -= (int) written;
+ if (remaining == 0)
+ break;
+ }
+ if (remaining != 0) {
+ CTRACE((tfp, "LYNXCGI: %d bytes remain unwritten!\n",
+ remaining));
+ }
+ close(fd1[1]);
+ }
+
+ HTReadProgress(total_chars = 0, (off_t) 0);
+ while ((chars = read(fd2[0], buf, sizeof(buf))) != 0) {
+ if (chars < 0) {
+#ifdef EINTR
+ if (errno == EINTR)
+ continue;
+#endif /* EINTR */
+#ifdef ERESTARTSYS
+ if (errno == ERESTARTSYS)
+ continue;
+#endif /* ERESTARTSYS */
+ PERROR("read() of CGI output failed");
+ break;
+ }
+ total_chars += (int) chars;
+ HTReadProgress(total_chars, (off_t) 0);
+ CTRACE((tfp, "LYNXCGI: Rx: %.*s\n", (int) chars, buf));
+ (*target->isa->put_block) (target, buf, (int) chars);
+ }
+
+ if (chars < 0 && total_chars == 0) {
+ status = HT_NOT_LOADED;
+ (*target->isa->_abort) (target, NULL);
+ target = NULL;
+ } else if (chars != 0) {
+ status = HT_PARTIAL_CONTENT;
+ } else {
+ status = HT_LOADED;
+ }
+
+#ifndef HAVE_WAITPID
+ while (wait(&wstatus) != pid) ; /* do nothing */
+#else
+ while (-1 == waitpid(pid, &wstatus, 0)) { /* wait for child */
+#ifdef EINTR
+ if (errno == EINTR)
+ continue;
+#endif /* EINTR */
+#ifdef ERESTARTSYS
+ if (errno == ERESTARTSYS)
+ continue;
+#endif /* ERESTARTSYS */
+ break;
+ }
+#endif /* !HAVE_WAITPID */
+ close(fd2[0]);
+
+ } else if (pid == 0) { /* The Bad, */
+ char **argv = NULL;
+ int argv_cnt = 3; /* name, one arg and terminator */
+ char **cur_argv = NULL;
+ int exec_errno;
+
+ /* Set up output pipe */
+ close(fd2[0]);
+ dup2(fd2[1], fileno(stdout)); /* Should check success code */
+ dup2(fd2[1], fileno(stderr));
+ close(fd2[1]);
+
+ if (non_empty(language)) {
+ HTSprintf0(&accept_language, "HTTP_ACCEPT_LANGUAGE=%s", language);
+ add_environment_value(accept_language);
+ }
+
+ if (non_empty(pref_charset)) {
+ cp = NULL;
+ StrAllocCopy(cp, "HTTP_ACCEPT_CHARSET=");
+ StrAllocCat(cp, pref_charset);
+ add_environment_value(cp);
+ }
+
+ if (anAnchor->post_data &&
+ anAnchor->post_content_type) {
+ cp = NULL;
+ StrAllocCopy(cp, "CONTENT_TYPE=");
+ StrAllocCat(cp, anAnchor->post_content_type);
+ add_environment_value(cp);
+ }
+
+ if (anAnchor->post_data) { /* post script, read stdin */
+ close(fd1[1]);
+ dup2(fd1[0], fileno(stdin));
+ close(fd1[0]);
+
+ /* Build environment variables */
+
+ add_environment_value("REQUEST_METHOD=POST");
+
+ HTSprintf0(&post_len, "CONTENT_LENGTH=%d",
+ BStrLen(anAnchor->post_data));
+ add_environment_value(post_len);
+ } else {
+ close(fileno(stdin));
+
+ if (anAnchor->isHEAD) {
+ add_environment_value("REQUEST_METHOD=HEAD");
+ }
+ }
+
+ /*
+ * Set up argument line, mainly for <index> scripts
+ */
+ if (pgm_args != NULL) {
+ for (cp = pgm_args; *cp != '\0'; cp++) {
+ if (*cp == '+') {
+ argv_cnt++;
+ }
+ }
+ }
+
+ argv = (char **) malloc((unsigned) argv_cnt * sizeof(char *));
+
+ if (argv == NULL) {
+ outofmem(__FILE__, "LYCgi");
+ }
+
+ cur_argv = argv + 1; /* For argv[0] */
+ if (pgm_args != NULL) {
+ char *cr;
+
+ /* Data for a get/search form */
+ if (is_www_index) {
+ add_environment_value("REQUEST_METHOD=SEARCH");
+ } else if (!anAnchor->isHEAD && !anAnchor->post_data) {
+ add_environment_value("REQUEST_METHOD=GET");
+ }
+
+ cp = NULL;
+ StrAllocCopy(cp, "QUERY_STRING=");
+ StrAllocCat(cp, pgm_args);
+ add_environment_value(cp);
+
+ /*
+ * Split up arguments into argv array
+ */
+ cp = pgm_args;
+ cr = cp;
+ while (1) {
+ if (*cp == '\0') {
+ *(cur_argv++) = HTUnEscape(cr);
+ break;
+
+ } else if (*cp == '+') {
+ *cp++ = '\0';
+ *(cur_argv++) = HTUnEscape(cr);
+ cr = cp;
+ }
+ cp++;
+ }
+ } else if (!anAnchor->isHEAD && !anAnchor->post_data) {
+ add_environment_value("REQUEST_METHOD=GET");
+ }
+ *cur_argv = NULL; /* Terminate argv */
+ argv[0] = pgm;
+
+ /* Begin WebSter Mods -jkt */
+ if (non_empty(LYCgiDocumentRoot)) {
+ /* Add DOCUMENT_ROOT to env */
+ cp = NULL;
+ StrAllocCopy(cp, "DOCUMENT_ROOT=");
+ StrAllocCat(cp, LYCgiDocumentRoot);
+ add_environment_value(cp);
+ }
+ if (path_info != NULL) {
+ /* Add PATH_INFO to env */
+ cp = NULL;
+ StrAllocCopy(cp, "PATH_INFO=");
+ StrAllocCat(cp, path_info);
+ add_environment_value(cp);
+ }
+ if (non_empty(LYCgiDocumentRoot) && path_info != NULL) {
+ /* Construct and add PATH_TRANSLATED to env */
+ StrAllocCopy(document_root, LYCgiDocumentRoot);
+ LYTrimHtmlSep(document_root);
+ path_translated = document_root;
+ StrAllocCat(path_translated, path_info);
+ cp = NULL;
+ StrAllocCopy(cp, "PATH_TRANSLATED=");
+ StrAllocCat(cp, path_translated);
+ add_environment_value(cp);
+ FREE(path_translated);
+ }
+ /* End WebSter Mods -jkt */
+
+ execve(argv[0], argv, env);
+ exec_errno = errno;
+ PERROR("execve failed");
+ printf("Content-Type: " STR_PLAINTEXT "\r\n\r\n");
+ if (!anAnchor->isHEAD) {
+ printf("exec of %s failed", pgm);
+ printf(": %s.\r\n", LYStrerror(exec_errno));
+ }
+ fflush(stdout);
+ fflush(stderr);
+ _exit(1);
+
+ } else { /* and the Ugly */
+ HTAlert(CONNECT_FAILED);
+ PERROR("fork() failed");
+ close(fd1[0]);
+ close(fd1[1]);
+ close(fd2[0]);
+ close(fd2[1]);
+ status = -1;
+ }
+
+ }
+ if (target != NULL) {
+ (*target->isa->_free) (target);
+ }
+ }
+ FREE(path_info);
+ FREE(pgm);
+ FREE(orig_pgm);
+#else /* VMS */
+ HTStream *target;
+ char *buf = 0;
+
+ target = HTStreamStack(WWW_HTML,
+ format_out,
+ sink, anAnchor);
+
+ HTSprintf0(&buf, "<html>\n<head>\n<title>%s</title>\n</head>\n<body>\n",
+ gettext("Good Advice"));
+ PUTS(buf);
+
+ HTSprintf0(&buf, "<h1>%s</h1>\n", gettext("Good Advice"));
+ PUTS(buf);
+
+ HTSprintf0(&buf, "%s <a\n",
+ gettext("An excellent http server for VMS is available via"));
+ PUTS(buf);
+
+ HTSprintf0(&buf,
+ "href=\"http://www.ecr6.ohio-state.edu/www/doc/serverinfo.html\"\n");
+ PUTS(buf);
+
+ HTSprintf0(&buf, ">%s</a>.\n", gettext("this link"));
+ PUTS(buf);
+
+ HTSprintf0(&buf, "<p>%s\n",
+ gettext("It provides state of the art CGI script support.\n"));
+ PUTS(buf);
+
+ HTSprintf0(&buf, "</body>\n</html>\n");
+ PUTS(buf);
+
+ (*target->isa->_free) (target);
+ FREE(buf);
+ status = HT_LOADED;
+#endif /* VMS */
+#else /* LYNXCGI_LINKS */
+ HTUserMsg(CGI_NOT_COMPILED);
+ status = HT_NOT_LOADED;
+#endif /* LYNXCGI_LINKS */
+
+ (void) arg;
+ (void) anAnchor;
+ (void) format_out;
+ (void) sink;
+
+ return (status);
+}
+#endif /* __MINGW32__ */
+
+#ifdef GLOBALDEF_IS_MACRO
+#define _LYCGI_C_GLOBALDEF_1_INIT { "lynxcgi", LYLoadCGI, 0 }
+GLOBALDEF(HTProtocol, LYLynxCGI, _LYCGI_C_GLOBALDEF_1_INIT);
+#else
+GLOBALDEF HTProtocol LYLynxCGI =
+{"lynxcgi", LYLoadCGI, 0};
+#endif /* GLOBALDEF_IS_MACRO */
diff --git a/src/LYCgi.h b/src/LYCgi.h
new file mode 100644
index 0000000..6b90f2d
--- /dev/null
+++ b/src/LYCgi.h
@@ -0,0 +1,16 @@
+#ifndef LYCGI_H
+#define LYCGI_H
+
+#ifndef HTUTILS_H
+#include <HTUtils.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ extern void add_lynxcgi_environment(const char *variable_name);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* LYGETFILE_H */
diff --git a/src/LYCharSets.c b/src/LYCharSets.c
new file mode 100644
index 0000000..94b7a04
--- /dev/null
+++ b/src/LYCharSets.c
@@ -0,0 +1,1157 @@
+/*
+ * $LynxId: LYCharSets.c,v 1.71 2021/06/29 22:01:12 tom Exp $
+ */
+#include <HTUtils.h>
+#include <HTCJK.h>
+#include <HTMLDTD.h>
+
+#include <LYGlobalDefs.h>
+#include <UCMap.h>
+#include <UCdomap.h>
+#include <UCDefs.h>
+#include <LYCharSets.h>
+#include <GridText.h>
+#include <LYCurses.h>
+#include <LYStrings.h>
+
+#include <LYLeaks.h>
+
+HTkcode kanji_code = NOKANJI;
+BOOLEAN LYHaveCJKCharacterSet = FALSE;
+BOOLEAN DisplayCharsetMatchLocale = TRUE;
+BOOL force_old_UCLYhndl_on_reload = FALSE;
+int forced_UCLYhdnl;
+int LYNumCharsets = 0; /* Will be initialized later by UC_Register. */
+int current_char_set = -1; /* will be initialized later in LYMain.c */
+int linedrawing_char_set = -1;
+STRING2PTR p_entity_values = NULL; /* Pointer, for HTML_put_entity() */
+
+ /* obsolete and probably not used(???) */
+ /* will be initialized in HTMLUseCharacterSet */
+#ifdef USE_CHARSET_CHOICE
+charset_subset_t charset_subsets[MAXCHARSETS];
+BOOL custom_display_charset = FALSE;
+BOOL custom_assumed_doc_charset = FALSE;
+
+#ifndef ALL_CHARSETS_IN_O_MENU_SCREEN
+int display_charset_map[MAXCHARSETS];
+int assumed_doc_charset_map[MAXCHARSETS];
+
+const char *display_charset_choices[MAXCHARSETS + 1];
+const char *assumed_charset_choices[MAXCHARSETS + 1];
+int displayed_display_charset_idx;
+#endif
+#endif /* USE_CHARSET_CHOICE */
+
+/*
+ * New character sets now declared with UCInit() in UCdomap.c
+ *
+ * INSTRUCTIONS for adding new character sets which do not have
+ * Unicode tables now in UCdomap.h
+ *
+ *
+ * [We hope you need not correct/add old-style mapping below as in ISO_LATIN1[]
+ * or SevenBitApproximations[] any more - it works now via new chartrans
+ * mechanism, but kept for compatibility only: we should cleanup the stuff,
+ * but this is not so easy...]
+ *
+ * Currently we only declare some charset's properties here (such as MIME
+ * names, etc.), it does not include real mapping.
+ *
+ * There is a place marked "Add your new character sets HERE" in this file.
+ * Make up a character set and add it in the same style as the ISO_LATIN1 set
+ * below, giving it a unique name.
+ *
+ * Add the name of the set to LYCharSets. Similarly add the appropriate
+ * information to the tables below: LYchar_set_names, LYCharSet_UC,
+ * LYlowest_eightbit. These 4 tables all MUST have the same order. (And this
+ * is the order you will see in Lynx Options Menu, which is why few
+ * unicode-based charsets are listed here).
+ *
+ */
+
+/* Entity values -- for ISO Latin 1 local representation
+ *
+ * This MUST match exactly the table referred to in the DTD!
+ */
+static const char *ISO_Latin1[] =
+{
+ "\306", /* capital AE diphthong (ligature) (&#198;) - AElig */
+ "\301", /* capital A, acute accent (&#193;) - Aacute */
+ "\302", /* capital A, circumflex accent (&#194;) - Acirc */
+ "\300", /* capital A, grave accent (&#192;) - Agrave */
+ "\305", /* capital A, ring - Aring (&#197;) */
+ "\303", /* capital A, tilde - Atilde (&#195;) */
+ "\304", /* capital A, dieresis or umlaut mark (&#196;) - Auml */
+ "\307", /* capital C, cedilla - Ccedil (&#199;) */
+ "\320", /* capital Eth or D with stroke (&#208;) - Dstrok */
+ "\320", /* capital Eth, Icelandic (&#208;) - ETH */
+ "\311", /* capital E, acute accent (&#201;) - Eacute */
+ "\312", /* capital E, circumflex accent (&#202;) - Ecirc */
+ "\310", /* capital E, grave accent (&#200;) - Egrave */
+ "\313", /* capital E, dieresis or umlaut mark (&#203;) - Euml */
+ "\315", /* capital I, acute accent (&#205;) - Iacute */
+ "\316", /* capital I, circumflex accent (&#206;) - Icirc */
+ "\314", /* capital I, grave accent (&#204;) - Igrave */
+ "\317", /* capital I, dieresis or umlaut mark (&#207;) - Iuml */
+ "\321", /* capital N, tilde (&#209;) - Ntilde */
+ "\323", /* capital O, acute accent (&#211;) - Oacute */
+ "\324", /* capital O, circumflex accent (&#212;) - Ocirc */
+ "\322", /* capital O, grave accent (&#210;) - Ograve */
+ "\330", /* capital O, slash (&#216;) - Oslash */
+ "\325", /* capital O, tilde (&#213;) - Otilde */
+ "\326", /* capital O, dieresis or umlaut mark (&#214;) - Ouml */
+ "\336", /* capital THORN, Icelandic (&#222;) - THORN */
+ "\332", /* capital U, acute accent (&#218;) - Uacute */
+ "\333", /* capital U, circumflex accent (&#219;) - Ucirc */
+ "\331", /* capital U, grave accent (&#217;) - Ugrave */
+ "\334", /* capital U, dieresis or umlaut mark (&#220;) - Uuml */
+ "\335", /* capital Y, acute accent (&#221;) - Yacute */
+ "\341", /* small a, acute accent (&#225;) - aacute */
+ "\342", /* small a, circumflex accent (&#226;) - acirc */
+ "\264", /* spacing acute (&#180;) - acute */
+ "\346", /* small ae diphthong (ligature) (&#230;) - aelig */
+ "\340", /* small a, grave accent (&#224;) - agrave */
+ "\046", /* ampersand (&#38;) - amp */
+ "\345", /* small a, ring (&#229;) - aring */
+ "\343", /* small a, tilde (&#227;) - atilde */
+ "\344", /* small a, dieresis or umlaut mark (&#228;) - auml */
+ "\246", /* broken vertical bar (&#166;) - brkbar */
+ "\246", /* broken vertical bar (&#166;) - brvbar */
+ "\347", /* small c, cedilla (&#231;) - ccedil */
+ "\270", /* spacing cedilla (&#184;) - cedil */
+ "\242", /* cent sign (&#162;) - cent */
+ "\251", /* copyright sign (&#169;) - copy */
+ "\244", /* currency sign (&#164;) - curren */
+ "\260", /* degree sign (&#176;) - deg */
+ "\250", /* spacing dieresis (&#168;) - die */
+ "\367", /* division sign (&#247;) - divide */
+ "\351", /* small e, acute accent (&#233;) - eacute */
+ "\352", /* small e, circumflex accent (&#234;) - ecirc */
+ "\350", /* small e, grave accent (&#232;) - egrave */
+ "-", /* dash the width of emsp - emdash */
+ "\002", /* emsp, em space - not collapsed NEVER CHANGE THIS - emsp */
+ "-", /* dash the width of ensp - endash */
+ "\002", /* ensp, en space - not collapsed NEVER CHANGE THIS - ensp */
+ "\360", /* small eth, Icelandic (&#240;) - eth */
+ "\353", /* small e, dieresis or umlaut mark (&#235;) - euml */
+ "\275", /* fraction 1/2 (&#189;) - frac12 */
+ "\274", /* fraction 1/4 (&#188;) - frac14 */
+ "\276", /* fraction 3/4 (&#190;) - frac34 */
+ "\076", /* greater than (&#62;) - gt */
+ "\257", /* spacing macron (&#175;) - hibar */
+ "\355", /* small i, acute accent (&#237;) - iacute */
+ "\356", /* small i, circumflex accent (&#238;) - icirc */
+ "\241", /* inverted exclamation mark (&#161;) - iexcl */
+ "\354", /* small i, grave accent (&#236;) - igrave */
+ "\277", /* inverted question mark (&#191;) - iquest */
+ "\357", /* small i, dieresis or umlaut mark (&#239;) - iuml */
+ "\253", /* angle quotation mark, left (&#171;) - laquo */
+ "\074", /* less than (&#60;) - lt */
+ "\257", /* spacing macron (&#175;) - macr */
+ "-", /* dash the width of emsp - mdash */
+ "\265", /* micro sign (&#181;) - micro */
+ "\267", /* middle dot (&#183;) - middot */
+ "\001", /* nbsp non-breaking space NEVER CHANGE THIS - nbsp */
+ "-", /* dash the width of ensp - ndash */
+ "\254", /* negation sign (&#172;) - not */
+ "\361", /* small n, tilde (&#241;) - ntilde */
+ "\363", /* small o, acute accent (&#243;) - oacute */
+ "\364", /* small o, circumflex accent (&#244;) - ocirc */
+ "\362", /* small o, grave accent (&#242;) - ograve */
+ "\252", /* feminine ordinal indicator (&#170;) - ordf */
+ "\272", /* masculine ordinal indicator (&#186;) - ordm */
+ "\370", /* small o, slash (&#248;) - oslash */
+ "\365", /* small o, tilde (&#245;) - otilde */
+ "\366", /* small o, dieresis or umlaut mark (&#246;) - ouml */
+ "\266", /* paragraph sign (&#182;) - para */
+ "\261", /* plus-or-minus sign (&#177;) - plusmn */
+ "\243", /* pound sign (&#163;) - pound */
+ "\042", /* quote '"' (&#34;) - quot */
+ "\273", /* angle quotation mark, right (&#187;) - raquo */
+ "\256", /* circled R registered sign (&#174;) - reg */
+ "\247", /* section sign (&#167;) - sect */
+ "\007", /* soft hyphen (&#173;) NEVER CHANGE THIS - shy */
+ "\271", /* superscript 1 (&#185;) - sup1 */
+ "\262", /* superscript 2 (&#178;) - sup2 */
+ "\263", /* superscript 3 (&#179;) - sup3 */
+ "\337", /* small sharp s, German (sz ligature) (&#223;) - szlig */
+ "\002", /* thin space - not collapsed NEVER CHANGE THIS - thinsp */
+ "\376", /* small thorn, Icelandic (&#254;) - thorn */
+ "\327", /* multiplication sign (&#215;) - times */
+ "(TM)", /* circled TM trade mark sign (&#8482;) - trade */
+ "\372", /* small u, acute accent (&#250;) - uacute */
+ "\373", /* small u, circumflex accent (&#251;) - ucirc */
+ "\371", /* small u, grave accent (&#249;) - ugrave */
+ "\250", /* spacing dieresis (&#168;) - uml */
+ "\374", /* small u, dieresis or umlaut mark (&#252;) - uuml */
+ "\375", /* small y, acute accent (&#253;) - yacute */
+ "\245", /* yen sign (&#165;) - yen */
+ "\377", /* small y, dieresis or umlaut mark (&#255;) - yuml */
+};
+
+/* Entity values -- 7 bit character approximations
+ *
+ * This MUST match exactly the table referred to in the DTD!
+ */
+const char *SevenBitApproximations[] =
+{
+ "AE", /* capital AE diphthong (ligature) (&#198;) - AElig */
+ "A", /* capital A, acute accent (&#193;) - Aacute */
+ "A", /* capital A, circumflex accent (&#194;) - Acirc */
+ "A", /* capital A, grave accent (&#192;) - Agrave */
+ "A", /* capital A, ring - Aring (&#197;) */
+ "A", /* capital A, tilde - Atilde (&#195;) */
+#ifdef LY_UMLAUT
+ "Ae", /* capital A, dieresis or umlaut mark (&#196;) - Auml */
+#else
+ "A", /* capital A, dieresis or umlaut mark (&#196;) - Auml */
+#endif /* LY_UMLAUT */
+ "C", /* capital C, cedilla (&#199;) - Ccedil */
+ "Dj", /* capital D with stroke (&#208;) - Dstrok */
+ "DH", /* capital Eth, Icelandic (&#208;) - ETH */
+ "E", /* capital E, acute accent (&#201;) - Eacute */
+ "E", /* capital E, circumflex accent (&#202;) - Ecirc */
+ "E", /* capital E, grave accent (&#200;) - Egrave */
+ "E", /* capital E, dieresis or umlaut mark (&#203;) - Euml */
+ "I", /* capital I, acute accent (&#205;) - Iacute */
+ "I", /* capital I, circumflex accent (&#206;) - Icirc */
+ "I", /* capital I, grave accent (&#204;) - Igrave */
+ "I", /* capital I, dieresis or umlaut mark (&#207;) - Iuml */
+ "N", /* capital N, tilde - Ntilde (&#209;) */
+ "O", /* capital O, acute accent (&#211;) - Oacute */
+ "O", /* capital O, circumflex accent (&#212;) - Ocirc */
+ "O", /* capital O, grave accent (&#210;) - Ograve */
+ "O", /* capital O, slash (&#216;) - Oslash */
+ "O", /* capital O, tilde (&#213;) - Otilde */
+#ifdef LY_UMLAUT
+ "Oe", /* capital O, dieresis or umlaut mark (&#214;) - Ouml */
+#else
+ "O", /* capital O, dieresis or umlaut mark (&#214;) - Ouml */
+#endif /* LY_UMLAUT */
+ "P", /* capital THORN, Icelandic (&#222;) - THORN */
+ "U", /* capital U, acute accent (&#218;) - Uacute */
+ "U", /* capital U, circumflex accent (&#219;) - Ucirc */
+ "U", /* capital U, grave accent (&#217;) - Ugrave */
+#ifdef LY_UMLAUT
+ "Ue", /* capital U, dieresis or umlaut mark (&#220;) - Uuml */
+#else
+ "U", /* capital U, dieresis or umlaut mark (&#220;) - Uuml */
+#endif /* LY_UMLAUT */
+ "Y", /* capital Y, acute accent (&#221;) - Yacute */
+ "a", /* small a, acute accent (&#225;) - aacute */
+ "a", /* small a, circumflex accent (&#226;) - acirc */
+ "'", /* spacing acute (&#180;) - acute */
+ "ae", /* small ae diphthong (ligature) (&#230;) - aelig */
+ "`a", /* small a, grave accent (&#232;) - agrave */
+ "&", /* ampersand (&#38;) - amp */
+ "a", /* small a, ring (&#229;) - aring */
+ "a", /* small a, tilde (&#227;) - atilde */
+#ifdef LY_UMLAUT
+ "ae", /* small a, dieresis or umlaut mark (&#228;) - auml */
+#else
+ "a", /* small a, dieresis or umlaut mark (&#228;) - auml */
+#endif /* LY_UMLAUT */
+ "|", /* broken vertical bar (&#166;) - brkbar */
+ "|", /* broken vertical bar (&#166;) - brvbar */
+ "c", /* small c, cedilla (&#231;) - ccedil */
+ ",", /* spacing cedilla (&#184;) - cedil */
+ "-c-", /* cent sign (&#162;) - cent */
+ "(c)", /* copyright sign (&#169;) - copy */
+ "CUR", /* currency sign (&#164;) - curren */
+ "DEG", /* degree sign (&#176;) - deg */
+ "\042", /* spacing dieresis (&#168;) - die */
+ "/", /* division sign (&#247;) - divide */
+ "e", /* small e, acute accent (&#233;) - eacute */
+ "e", /* small e, circumflex accent (&#234;) - ecirc */
+ "e", /* small e, grave accent (&#232;) - egrave */
+ "-", /* dash the width of emsp - emdash */
+ "\002", /* emsp NEVER CHANGE THIS - emsp */
+ "-", /* dash the width of ensp - endash */
+ "\002", /* ensp NEVER CHANGE THIS - ensp */
+ "dh", /* small eth, Icelandic eth (&#240;) */
+ "e", /* small e, dieresis or umlaut mark (&#235;) - euml */
+ " 1/2", /* fraction 1/2 (&#189;) - frac12 */
+ " 1/4", /* fraction 1/4 (&#188;) - frac14 */
+ " 3/4", /* fraction 3/4 (&#190;) - frac34 */
+ ">", /* greater than (&#62;) - gt */
+ "-", /* spacing macron (&#175;) - hibar */
+ "i", /* small i, acute accent (&#237;) - iacute */
+ "i", /* small i, circumflex accent (&#238;) - icirc */
+ "!", /* inverted exclamation mark (&#161;) - iexcl */
+ "`i", /* small i, grave accent (&#236;) - igrave */
+ "?", /* inverted question mark (&#191;) - iquest */
+ "i", /* small i, dieresis or umlaut mark (&#239;) - iuml */
+ "<<", /* angle quotation mark, left (&#171;) - laquo */
+ "<", /* less than - lt (&#60;) */
+ "-", /* spacing macron (&#175;) - macr */
+ "-", /* dash the width of emsp - mdash */
+ "u", /* micro sign (&#181;) - micro */
+ ".", /* middle dot (&#183;) - middot */
+ "\001", /* nbsp non-breaking space NEVER CHANGE THIS - nbsp */
+ "-", /* dash the width of ensp - ndash */
+ "NOT", /* negation sign (&#172;) - not */
+ "n", /* small n, tilde (&#241;) - ntilde */
+ "o", /* small o, acute accent (&#243;) - oacute */
+ "o", /* small o, circumflex accent (&#244;) - ocirc */
+ "o", /* small o, grave accent (&#242;) - ograve */
+ "-a", /* feminine ordinal indicator (&#170;) - ordf */
+ "-o", /* masculine ordinal indicator (&#186;) - ordm */
+ "o", /* small o, slash (&#248;) - oslash */
+ "o", /* small o, tilde (&#245;) - otilde */
+#ifdef LY_UMLAUT
+ "oe", /* small o, dieresis or umlaut mark (&#246;) - ouml */
+#else
+ "o", /* small o, dieresis or umlaut mark (&#246;) - ouml */
+#endif /* LY_UMLAUT */
+ "P:", /* paragraph sign (&#182;) - para */
+ "+-", /* plus-or-minus sign (&#177;) - plusmn */
+ "-L-", /* pound sign (&#163;) - pound */
+ "\"", /* quote '"' (&#34;) - quot */
+ ">>", /* angle quotation mark, right (&#187;) - raquo */
+ "(R)", /* circled R registered sign (&#174;) - reg */
+ "S:", /* section sign (&#167;) - sect */
+ "\007", /* soft hyphen (&#173;) NEVER CHANGE THIS - shy */
+ "^1", /* superscript 1 (&#185;) - sup1 */
+ "^2", /* superscript 2 (&#178;) - sup2 */
+ "^3", /* superscript 3 (&#179;) - sup3 */
+ "ss", /* small sharp s, German (sz ligature) (&#223;) - szlig */
+ "\002", /* thin space - not collapsed NEVER CHANGE THIS - thinsp */
+ "p", /* small thorn, Icelandic (&#254;) - thorn */
+ "*", /* multiplication sign (&#215;) - times */
+ "(TM)", /* circled TM trade mark sign (&#8482;) - trade */
+ "u", /* small u, acute accent (&#250;) - uacute */
+ "u", /* small u, circumflex accent (&#251;) - ucirc */
+ "u", /* small u, grave accent (&#249;) - ugrave */
+ "\042", /* spacing dieresis (&#168;) - uml */
+#ifdef LY_UMLAUT
+ "ue", /* small u, dieresis or umlaut mark (&#252;) - uuml */
+#else
+ "u", /* small u, dieresis or umlaut mark (&#252;) - uuml */
+#endif /* LY_UMLAUT */
+ "y", /* small y, acute accent (&#253;) - yacute */
+ "YEN", /* yen sign (&#165;) - yen */
+ "y", /* small y, dieresis or umlaut mark (&#255;) - yuml */
+};
+
+/*
+ * Add your new character sets HERE (but only if you can't construct Unicode
+ * tables for them). - FM
+ */
+
+/*
+ * Add the array name to LYCharSets
+ */
+STRING2PTR LYCharSets[MAXCHARSETS] =
+{
+ ISO_Latin1, /* ISO Latin 1 */
+ SevenBitApproximations, /* 7 Bit Approximations */
+};
+
+/*
+ * Add the name that the user will see below. The order of LYCharSets and
+ * LYchar_set_names MUST be the same
+ */
+const char *LYchar_set_names[MAXCHARSETS + 1] =
+{
+ "Western (ISO-8859-1)",
+ "7 bit approximations (US-ASCII)",
+ (char *) 0
+};
+
+/*
+ * Associate additional pieces of info with each of the charsets listed above.
+ * Will be automatically modified (and extended) by charset translations which
+ * are loaded using the chartrans mechanism. Most important piece of info to
+ * put here is a MIME charset name. Used for chartrans (see UCDefs.h). The
+ * order of LYCharSets and LYCharSet_UC MUST be the same.
+ *
+ * Note that most of the charsets added by the new mechanism in src/chrtrans
+ * don't show up here at all. They don't have to.
+ */
+LYUCcharset LYCharSet_UC[MAXCHARSETS] =
+{
+ /*
+ * Zero position placeholder and HTMLGetEntityUCValue() reference. - FM
+ */
+ {-1, "iso-8859-1", UCT_ENC_8BIT, 0,
+ UCT_REP_IS_LAT1,
+ UCT_CP_IS_LAT1, UCT_R_LAT1, UCT_R_LAT1},
+
+ /*
+ * Placeholders for Unicode tables. - FM
+ */
+ {-1, "us-ascii", UCT_ENC_7BIT, 0,
+ UCT_REP_SUBSETOF_LAT1,
+ UCT_CP_SUBSETOF_LAT1, UCT_R_ASCII, UCT_R_ASCII},
+
+};
+
+/*
+ * Add the code of the the lowest character with the high bit set that can be
+ * directly displayed. The order of LYCharSets and LYlowest_eightbit MUST be
+ * the same.
+ *
+ * (If charset have chartrans unicode table, LYlowest_eightbit will be
+ * verified/modified anyway.)
+ */
+int LYlowest_eightbit[MAXCHARSETS] =
+{
+ 160, /* ISO Latin 1 */
+ 999, /* 7 bit approximations */
+};
+
+/*
+ * Function to set the handling of selected character sets based on the current
+ * LYUseDefaultRawMode value. - FM
+ */
+void HTMLSetCharacterHandling(int i)
+{
+ int chndl = safeUCGetLYhndl_byMIME(UCAssume_MIMEcharset);
+ BOOLEAN LYRawMode_flag = LYRawMode;
+ int UCLYhndl_for_unspec_flag = UCLYhndl_for_unspec;
+
+ if (LYCharSet_UC[i].enc != UCT_ENC_CJK) {
+ HTCJK = NOCJK;
+ kanji_code = NOKANJI;
+ if (i == chndl)
+ LYRawMode = LYUseDefaultRawMode;
+ else
+ LYRawMode = (BOOL) (!LYUseDefaultRawMode);
+
+ HTPassEightBitNum = (BOOL) ((LYCharSet_UC[i].codepoints & UCT_CP_SUPERSETOF_LAT1)
+ || (LYCharSet_UC[i].like8859 & UCT_R_HIGH8BIT));
+
+ if (LYRawMode) {
+ HTPassEightBitRaw = (BOOL) (LYlowest_eightbit[i] <= 160);
+ } else {
+ HTPassEightBitRaw = FALSE;
+ }
+ if (LYRawMode || i == chndl) {
+ HTPassHighCtrlRaw = (BOOL) (LYlowest_eightbit[i] <= 130);
+ } else {
+ HTPassHighCtrlRaw = FALSE;
+ }
+
+ HTPassHighCtrlNum = FALSE;
+
+ } else { /* CJK encoding: */
+ const char *mime = LYCharSet_UC[i].MIMEname;
+
+ if (!strcmp(mime, "euc-cn")) {
+ HTCJK = CHINESE;
+ kanji_code = EUC;
+ } else if (!strcmp(mime, "euc-jp")) {
+ HTCJK = JAPANESE;
+ kanji_code = EUC;
+ } else if (!strcmp(mime, "shift_jis")) {
+ HTCJK = JAPANESE;
+ kanji_code = SJIS;
+ } else if (!strcmp(mime, "euc-kr")) {
+ HTCJK = KOREAN;
+ kanji_code = EUC;
+ } else if (!strcmp(mime, "big5")) {
+ HTCJK = TAIPEI;
+ kanji_code = EUC;
+ }
+
+ /* for any CJK: */
+ if (!LYUseDefaultRawMode)
+ HTCJK = NOCJK;
+ LYRawMode = (BOOL) (IS_CJK_TTY ? TRUE : FALSE);
+ HTPassEightBitRaw = FALSE;
+ HTPassEightBitNum = FALSE;
+ HTPassHighCtrlRaw = (BOOL) (IS_CJK_TTY ? TRUE : FALSE);
+ HTPassHighCtrlNum = FALSE;
+ }
+
+ /*
+ * Comment for coding below:
+ * UCLYhndl_for_unspec is "current" state with LYRawMode, but
+ * UCAssume_MIMEcharset is independent from LYRawMode: holds the history
+ * and may be changed from 'O'ptions menu only. - LP
+ */
+ if (LYRawMode) {
+ UCLYhndl_for_unspec = i; /* UCAssume_MIMEcharset not changed! */
+ } else {
+ if (chndl != i &&
+ (LYCharSet_UC[i].enc != UCT_ENC_CJK ||
+ LYCharSet_UC[chndl].enc != UCT_ENC_CJK)) {
+ UCLYhndl_for_unspec = chndl; /* fall to UCAssume_MIMEcharset */
+ } else {
+ UCLYhndl_for_unspec = LATIN1; /* UCAssume_MIMEcharset not changed! */
+ }
+ }
+
+#ifdef USE_SLANG
+ if (LYlowest_eightbit[i] > 191) {
+ /*
+ * Higher than this may output cntrl chars to screen. - KW
+ */
+ SLsmg_Display_Eight_Bit = 191;
+ } else {
+ SLsmg_Display_Eight_Bit = LYlowest_eightbit[i];
+ }
+#endif /* USE_SLANG */
+
+ ena_csi(LYlowest_eightbit[current_char_set] > 155);
+
+ /* some diagnostics */
+ if (TRACE) {
+ if (LYRawMode_flag != LYRawMode)
+ CTRACE((tfp,
+ "HTMLSetCharacterHandling: LYRawMode changed %s -> %s\n",
+ (LYRawMode_flag ? "ON" : "OFF"),
+ (LYRawMode ? "ON" : "OFF")));
+ if (UCLYhndl_for_unspec_flag != UCLYhndl_for_unspec)
+ CTRACE((tfp,
+ "HTMLSetCharacterHandling: UCLYhndl_for_unspec changed %d -> %d\n",
+ UCLYhndl_for_unspec_flag,
+ UCLYhndl_for_unspec));
+ }
+
+ return;
+}
+
+/*
+ * Function to set HTCJK based on "in" and "out" charsets.
+ */
+void Set_HTCJK(const char *inMIMEname,
+ const char *outMIMEname)
+{
+ /* need not check for synonyms: MIMEname's got from LYCharSet_UC */
+
+ if (LYRawMode) {
+ if ((!strcmp(inMIMEname, "euc-jp") ||
+#ifdef USE_JAPANESEUTF8_SUPPORT
+ !strcmp(inMIMEname, "utf-8") ||
+#endif
+ !strcmp(inMIMEname, "shift_jis")) &&
+ (!strcmp(outMIMEname, "euc-jp") ||
+ !strcmp(outMIMEname, "shift_jis"))) {
+ HTCJK = JAPANESE;
+ } else if (!strcmp(inMIMEname, "euc-cn") &&
+ !strcmp(outMIMEname, "euc-cn")) {
+ HTCJK = CHINESE;
+ } else if (!strcmp(inMIMEname, "big5") &&
+ !strcmp(outMIMEname, "big5")) {
+ HTCJK = TAIPEI;
+ } else if (!strcmp(inMIMEname, "euc-kr") &&
+ !strcmp(outMIMEname, "euc-kr")) {
+ HTCJK = KOREAN;
+ } else {
+ HTCJK = NOCJK;
+ }
+ } else {
+ HTCJK = NOCJK;
+ }
+}
+
+/*
+ * Function to set the LYDefaultRawMode value based on the selected character
+ * set. - FM
+ *
+ * Currently unused: the default value so obvious that LYUseDefaultRawMode
+ * utilized directly by someone's mistake. - LP
+ */
+static void HTMLSetRawModeDefault(int i)
+{
+ LYDefaultRawMode = (BOOL) (LYCharSet_UC[i].enc == UCT_ENC_CJK);
+ return;
+}
+
+/*
+ * Function to set the LYUseDefaultRawMode value based on the selected
+ * character set and the current LYRawMode value. - FM
+ */
+void HTMLSetUseDefaultRawMode(int i,
+ int modeflag)
+{
+ if (LYCharSet_UC[i].enc != UCT_ENC_CJK) {
+
+ int chndl = safeUCGetLYhndl_byMIME(UCAssume_MIMEcharset);
+
+ if (i == chndl)
+ LYUseDefaultRawMode = (BOOLEAN) modeflag;
+ else
+ LYUseDefaultRawMode = (BOOL) (!modeflag);
+ } else /* CJK encoding: */
+ LYUseDefaultRawMode = (BOOLEAN) modeflag;
+
+ return;
+}
+
+/*
+ * Function to set the LYHaveCJKCharacterSet value based on the selected
+ * character set. - FM
+ */
+static void HTMLSetHaveCJKCharacterSet(int i)
+{
+ LYHaveCJKCharacterSet = (BOOL) (LYCharSet_UC[i].enc == UCT_ENC_CJK);
+ return;
+}
+
+/*
+ * Function to set the DisplayCharsetMatchLocale value based on the selected
+ * character set. It is used in UPPER8 for 8bit case-insensitive search by
+ * matching def7_uni.tbl images. - LP
+ */
+static void HTMLSetDisplayCharsetMatchLocale(int i)
+{
+ BOOLEAN match;
+
+ if (LYHaveCJKCharacterSet) {
+ /*
+ * We have no intention to pass CJK via UCTransChar if that happened.
+ * Let someone from CJK correct this if necessary.
+ */
+ DisplayCharsetMatchLocale = TRUE; /* old-style */
+ return;
+
+ } else if (strncasecomp(LYCharSet_UC[i].MIMEname, "cp", 2) ||
+ strncasecomp(LYCharSet_UC[i].MIMEname, "windows", 7)) {
+ /*
+ * Assume dos/windows displays usually on remote terminal, hence it
+ * rarely matches locale. (In fact, MS Windows codepoints locale are
+ * never seen on UNIX).
+ */
+ match = FALSE;
+ } else {
+ match = TRUE; /* guess, but see below */
+
+#if !defined(LOCALE)
+ if (LYCharSet_UC[i].enc != UCT_ENC_UTF8)
+ /*
+ * Leave true for utf-8 display - the code doesn't deal very well
+ * with this case. - kw
+ */
+ match = FALSE;
+#else
+ if (UCForce8bitTOUPPER) {
+ /*
+ * Force disable locale (from lynx.cfg)
+ */
+ match = FALSE;
+ }
+#endif
+ }
+
+ DisplayCharsetMatchLocale = match;
+ return;
+}
+
+/*
+ * lynx 2.8/2.7.2(and more early) compatibility code: "human-readable" charset
+ * names changes with time so we map that history names to MIME here to get old
+ * lynx.cfg and (especially) .lynxrc always recognized. Please update this
+ * table when you change "fullname" of any present charset.
+ */
+typedef struct _names_pairs {
+ const char *fullname;
+ const char *MIMEname;
+} names_pairs;
+/* *INDENT-OFF* */
+static const names_pairs OLD_charset_names[] =
+{
+ {"ISO Latin 1", "iso-8859-1"},
+ {"ISO Latin 2", "iso-8859-2"},
+ {"WinLatin1 (cp1252)", "windows-1252"},
+ {"DEC Multinational", "dec-mcs"},
+ {"Macintosh (8 bit)", "macintosh"},
+ {"NeXT character set", "next"},
+ {"KOI8-R Cyrillic", "koi8-r"},
+ {"Chinese", "euc-cn"},
+ {"Japanese (EUC)", "euc-jp"},
+ {"Japanese (SJIS)", "shift_jis"},
+ {"Korean", "euc-kr"},
+ {"Taipei (Big5)", "big5"},
+ {"Vietnamese (VISCII)", "viscii"},
+ {"7 bit approximations", "us-ascii"},
+ {"Transparent", "x-transparent"},
+ {"DosLatinUS (cp437)", "cp437"},
+ {"IBM PC character set", "cp437"},
+ {"DosLatin1 (cp850)", "cp850"},
+ {"IBM PC codepage 850", "cp850"},
+ {"DosLatin2 (cp852)", "cp852"},
+ {"PC Latin2 CP 852", "cp852"},
+ {"DosCyrillic (cp866)", "cp866"},
+ {"DosArabic (cp864)", "cp864"},
+ {"DosGreek (cp737)", "cp737"},
+ {"DosBaltRim (cp775)", "cp775"},
+ {"DosGreek2 (cp869)", "cp869"},
+ {"DosHebrew (cp862)", "cp862"},
+ {"WinLatin2 (cp1250)", "windows-1250"},
+ {"WinCyrillic (cp1251)", "windows-1251"},
+ {"WinGreek (cp1253)", "windows-1253"},
+ {"WinHebrew (cp1255)", "windows-1255"},
+ {"WinArabic (cp1256)", "windows-1256"},
+ {"WinBaltRim (cp1257)", "windows-1257"},
+ {"ISO Latin 3", "iso-8859-3"},
+ {"ISO Latin 4", "iso-8859-4"},
+ {"ISO 8859-5 Cyrillic", "iso-8859-5"},
+ {"ISO 8859-6 Arabic", "iso-8859-6"},
+ {"ISO 8859-7 Greek", "iso-8859-7"},
+ {"ISO 8859-8 Hebrew", "iso-8859-8"},
+ {"ISO-8859-8-I", "iso-8859-8"},
+ {"ISO-8859-8-E", "iso-8859-8"},
+ {"ISO 8859-9 (Latin 5)", "iso-8859-9"},
+ {"ISO 8859-10", "iso-8859-10"},
+ {"UNICODE UTF 8", "utf-8"},
+ {"RFC 1345 w/o Intro", "mnemonic+ascii+0"},
+ {"RFC 1345 Mnemonic", "mnemonic"},
+ {NULL, NULL}, /* terminated with NULL */
+};
+/* *INDENT-ON* */
+
+/*
+ * lynx 2.8/2.7.2 compatibility code: read "character_set" parameter from
+ * lynx.cfg and .lynxrc in both MIME name and "human-readable" name (old and
+ * new style). Returns -1 if not recognized.
+ */
+int UCGetLYhndl_byAnyName(char *value)
+{
+ int i;
+
+ if (value == NULL)
+ return -1;
+
+ LYTrimTrailing(value);
+ CTRACE((tfp, "UCGetLYhndl_byAnyName(%s)\n", value));
+
+ /* search by name */
+ for (i = 0; (i < MAXCHARSETS && LYchar_set_names[i]); i++) {
+ if (!strcmp(value, LYchar_set_names[i])) {
+ return i; /* OK */
+ }
+ }
+
+ /* search by old name from 2.8/2.7.2 version */
+ for (i = 0; (OLD_charset_names[i].fullname); i++) {
+ if (!strcmp(value, OLD_charset_names[i].fullname)) {
+ return UCGetLYhndl_byMIME(OLD_charset_names[i].MIMEname); /* OK */
+ }
+ }
+
+ return UCGetLYhndl_byMIME(value); /* by MIME */
+}
+
+/*
+ * Entity names -- Ordered by ISO Latin 1 value.
+ * ---------------------------------------------
+ * For conversions of DECIMAL escaped entities.
+ * Must be in order of ascending value.
+ */
+static const char *LYEntityNames[] =
+{
+/* NAME DECIMAL VALUE */
+ "nbsp", /* 160, non breaking space */
+ "iexcl", /* 161, inverted exclamation mark */
+ "cent", /* 162, cent sign */
+ "pound", /* 163, pound sign */
+ "curren", /* 164, currency sign */
+ "yen", /* 165, yen sign */
+ "brvbar", /* 166, broken vertical bar, (brkbar) */
+ "sect", /* 167, section sign */
+ "uml", /* 168, spacing dieresis */
+ "copy", /* 169, copyright sign */
+ "ordf", /* 170, feminine ordinal indicator */
+ "laquo", /* 171, angle quotation mark, left */
+ "not", /* 172, negation sign */
+ "shy", /* 173, soft hyphen */
+ "reg", /* 174, circled R registered sign */
+ "hibar", /* 175, spacing macron */
+ "deg", /* 176, degree sign */
+ "plusmn", /* 177, plus-or-minus sign */
+ "sup2", /* 178, superscript 2 */
+ "sup3", /* 179, superscript 3 */
+ "acute", /* 180, spacing acute (96) */
+ "micro", /* 181, micro sign */
+ "para", /* 182, paragraph sign */
+ "middot", /* 183, middle dot */
+ "cedil", /* 184, spacing cedilla */
+ "sup1", /* 185, superscript 1 */
+ "ordm", /* 186, masculine ordinal indicator */
+ "raquo", /* 187, angle quotation mark, right */
+ "frac14", /* 188, fraction 1/4 */
+ "frac12", /* 189, fraction 1/2 */
+ "frac34", /* 190, fraction 3/4 */
+ "iquest", /* 191, inverted question mark */
+ "Agrave", /* 192, capital A, grave accent */
+ "Aacute", /* 193, capital A, acute accent */
+ "Acirc", /* 194, capital A, circumflex accent */
+ "Atilde", /* 195, capital A, tilde */
+ "Auml", /* 196, capital A, dieresis or umlaut mark */
+ "Aring", /* 197, capital A, ring */
+ "AElig", /* 198, capital AE diphthong (ligature) */
+ "Ccedil", /* 199, capital C, cedilla */
+ "Egrave", /* 200, capital E, grave accent */
+ "Eacute", /* 201, capital E, acute accent */
+ "Ecirc", /* 202, capital E, circumflex accent */
+ "Euml", /* 203, capital E, dieresis or umlaut mark */
+ "Igrave", /* 204, capital I, grave accent */
+ "Iacute", /* 205, capital I, acute accent */
+ "Icirc", /* 206, capital I, circumflex accent */
+ "Iuml", /* 207, capital I, dieresis or umlaut mark */
+ "ETH", /* 208, capital Eth, Icelandic (or Latin2 Dstrok) */
+ "Ntilde", /* 209, capital N, tilde */
+ "Ograve", /* 210, capital O, grave accent */
+ "Oacute", /* 211, capital O, acute accent */
+ "Ocirc", /* 212, capital O, circumflex accent */
+ "Otilde", /* 213, capital O, tilde */
+ "Ouml", /* 214, capital O, dieresis or umlaut mark */
+ "times", /* 215, multiplication sign */
+ "Oslash", /* 216, capital O, slash */
+ "Ugrave", /* 217, capital U, grave accent */
+ "Uacute", /* 218, capital U, acute accent */
+ "Ucirc", /* 219, capital U, circumflex accent */
+ "Uuml", /* 220, capital U, dieresis or umlaut mark */
+ "Yacute", /* 221, capital Y, acute accent */
+ "THORN", /* 222, capital THORN, Icelandic */
+ "szlig", /* 223, small sharp s, German (sz ligature) */
+ "agrave", /* 224, small a, grave accent */
+ "aacute", /* 225, small a, acute accent */
+ "acirc", /* 226, small a, circumflex accent */
+ "atilde", /* 227, small a, tilde */
+ "auml", /* 228, small a, dieresis or umlaut mark */
+ "aring", /* 229, small a, ring */
+ "aelig", /* 230, small ae diphthong (ligature) */
+ "ccedil", /* 231, small c, cedilla */
+ "egrave", /* 232, small e, grave accent */
+ "eacute", /* 233, small e, acute accent */
+ "ecirc", /* 234, small e, circumflex accent */
+ "euml", /* 235, small e, dieresis or umlaut mark */
+ "igrave", /* 236, small i, grave accent */
+ "iacute", /* 237, small i, acute accent */
+ "icirc", /* 238, small i, circumflex accent */
+ "iuml", /* 239, small i, dieresis or umlaut mark */
+ "eth", /* 240, small eth, Icelandic */
+ "ntilde", /* 241, small n, tilde */
+ "ograve", /* 242, small o, grave accent */
+ "oacute", /* 243, small o, acute accent */
+ "ocirc", /* 244, small o, circumflex accent */
+ "otilde", /* 245, small o, tilde */
+ "ouml", /* 246, small o, dieresis or umlaut mark */
+ "divide", /* 247, division sign */
+ "oslash", /* 248, small o, slash */
+ "ugrave", /* 249, small u, grave accent */
+ "uacute", /* 250, small u, acute accent */
+ "ucirc", /* 251, small u, circumflex accent */
+ "uuml", /* 252, small u, dieresis or umlaut mark */
+ "yacute", /* 253, small y, acute accent */
+ "thorn", /* 254, small thorn, Icelandic */
+ "yuml", /* 255, small y, dieresis or umlaut mark */
+};
+
+/*
+ * Function to return the entity names of ISO-8859-1 8-bit characters. - FM
+ */
+const char *HTMLGetEntityName(UCode_t code)
+{
+#define IntValue code
+ int MaxValue = (TABLESIZE(LYEntityNames) - 1);
+
+ if (IntValue < 0 || IntValue > MaxValue) {
+ return "";
+ }
+
+ return LYEntityNames[IntValue];
+}
+
+/*
+ * Function to return the UCode_t (long int) value for entity names. It
+ * returns 0 if not found.
+ *
+ * unicode_entities[] handles all the names from old style entities[] too.
+ * Lynx now calls unicode_entities[] only through this function:
+ * HTMLGetEntityUCValue(). Note, we need not check for special characters here
+ * in function or even before it, we should check them *after* invoking this
+ * function, see put_special_unicodes() in SGML.c.
+ *
+ * In the future we will try to isolate all calls to entities[] in favor of new
+ * unicode-based chartrans scheme. - LP
+ */
+UCode_t HTMLGetEntityUCValue(const char *name)
+{
+#include <entities.h>
+
+ UCode_t value = 0;
+ size_t i, high, low;
+ int diff = 0;
+ size_t number_of_unicode_entities = TABLESIZE(unicode_entities);
+
+ /*
+ * Make sure we have a non-zero length name. - FM
+ */
+ if (isEmpty(name))
+ return (value);
+
+ /*
+ * Try UC_entity_info unicode_entities[].
+ */
+ for (low = 0, high = number_of_unicode_entities;
+ high > low;
+ diff < 0 ? (low = i + 1) : (high = i)) {
+ /*
+ * Binary search.
+ */
+ i = (low + (high - low) / 2);
+ diff = AS_cmp(unicode_entities[i].name, name); /* Case sensitive! */
+ if (diff == 0) {
+ value = unicode_entities[i].code;
+ break;
+ }
+ }
+ return (value);
+}
+
+/*
+ * Original comment -
+ * Assume these are Microsoft code points, inflicted on us by FrontPage. - FM
+ *
+ * MS FrontPage uses syntax like &#153; in 128-159 range and doesn't follow
+ * Unicode standards for this area. Windows-1252 codepoints are assumed here.
+ *
+ * However see -
+ * http://www.whatwg.org/specs/web-apps/current-work/multipage/infrastructure.html#character-encodings-0
+ */
+UCode_t LYcp1252ToUnicode(UCode_t code)
+{
+ if ((code == 1) ||
+ (code > 127 && code < 160)) {
+ switch (code) {
+ case 1:
+ /*
+ * WHITE SMILING FACE
+ */
+ code = 0x263a;
+ break;
+ case 128:
+ /*
+ * EURO currency sign
+ */
+ code = 0x20ac;
+ break;
+ case 130:
+ /*
+ * SINGLE LOW-9 QUOTATION MARK (sbquo)
+ */
+ code = 0x201a;
+ break;
+ case 131:
+ /*
+ * LATIN SMALL LETTER F WITH HOOK
+ */
+ code = 0x192;
+ break;
+ case 132:
+ /*
+ * DOUBLE LOW-9 QUOTATION MARK (bdquo)
+ */
+ code = 0x201e;
+ break;
+ case 133:
+ /*
+ * HORIZONTAL ELLIPSIS (hellip)
+ */
+ code = 0x2026;
+ break;
+ case 134:
+ /*
+ * DAGGER (dagger)
+ */
+ code = 0x2020;
+ break;
+ case 135:
+ /*
+ * DOUBLE DAGGER (Dagger)
+ */
+ code = 0x2021;
+ break;
+ case 136:
+ /*
+ * MODIFIER LETTER CIRCUMFLEX ACCENT
+ */
+ code = 0x2c6;
+ break;
+ case 137:
+ /*
+ * PER MILLE SIGN (permil)
+ */
+ code = 0x2030;
+ break;
+ case 138:
+ /*
+ * LATIN CAPITAL LETTER S WITH CARON
+ */
+ code = 0x160;
+ break;
+ case 139:
+ /*
+ * SINGLE LEFT-POINTING ANGLE QUOTATION MARK (lsaquo)
+ */
+ code = 0x2039;
+ break;
+ case 140:
+ /*
+ * LATIN CAPITAL LIGATURE OE
+ */
+ code = 0x152;
+ break;
+ case 142:
+ /*
+ * LATIN CAPITAL LETTER Z WITH CARON
+ */
+ code = 0x17d;
+ break;
+ case 145:
+ /*
+ * LEFT SINGLE QUOTATION MARK (lsquo)
+ */
+ code = 0x2018;
+ break;
+ case 146:
+ /*
+ * RIGHT SINGLE QUOTATION MARK (rsquo)
+ */
+ code = 0x2019;
+ break;
+ case 147:
+ /*
+ * LEFT DOUBLE QUOTATION MARK (ldquo)
+ */
+ code = 0x201c;
+ break;
+ case 148:
+ /*
+ * RIGHT DOUBLE QUOTATION MARK (rdquo)
+ */
+ code = 0x201d;
+ break;
+ case 149:
+ /*
+ * BULLET (bull)
+ */
+ code = 0x2022;
+ break;
+ case 150:
+ /*
+ * EN DASH (ndash)
+ */
+ code = 0x2013;
+ break;
+ case 151:
+ /*
+ * EM DASH (mdash)
+ */
+ code = 0x2014;
+ break;
+ case 152:
+ /*
+ * SMALL TILDE (tilde)
+ */
+ code = 0x02dc;
+ break;
+ case 153:
+ /*
+ * TRADE MARK SIGN (trade)
+ */
+ code = 0x2122;
+ break;
+ case 154:
+ /*
+ * LATIN SMALL LETTER S WITH CARON
+ */
+ code = 0x161;
+ break;
+ case 155:
+ /*
+ * SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (rsaquo)
+ */
+ code = 0x203a;
+ break;
+ case 156:
+ /*
+ * LATIN SMALL LIGATURE OE
+ */
+ code = 0x153;
+ break;
+ case 158:
+ /*
+ * LATIN SMALL LETTER Z WITH CARON
+ */
+ code = 0x17e;
+ break;
+ case 159:
+ /*
+ * LATIN CAPITAL LETTER Y WITH DIAERESIS
+ */
+ code = 0x178;
+ break;
+ default:
+ /*
+ * Undefined (by convention, use the replacement character).
+ */
+ code = UCS_REPL;
+ break;
+ }
+ }
+ return code;
+}
+
+/*
+ * Function to select a character set and then set the character handling and
+ * LYHaveCJKCharacterSet flag. - FM
+ */
+void HTMLUseCharacterSet(int i)
+{
+ HTMLSetRawModeDefault(i);
+ p_entity_values = LYCharSets[i];
+ HTMLSetCharacterHandling(i); /* set LYRawMode and CJK attributes */
+ HTMLSetHaveCJKCharacterSet(i);
+ HTMLSetDisplayCharsetMatchLocale(i);
+ return;
+}
+
+/*
+ * Initializer, calls initialization function for the CHARTRANS handling. - KW
+ */
+int LYCharSetsDeclared(void)
+{
+ UCInit();
+
+ return UCInitialized;
+}
+
+#ifdef USE_CHARSET_CHOICE
+void init_charset_subsets(void)
+{
+ int i, n;
+ int cur_display = 0;
+ int cur_assumed = 0;
+
+ /* add them to displayed values */
+ charset_subsets[UCLYhndl_for_unspec].hide_assumed = FALSE;
+ charset_subsets[current_char_set].hide_display = FALSE;
+
+#ifndef ALL_CHARSETS_IN_O_MENU_SCREEN
+ /*all this stuff is for supporting old menu screen... */
+ for (i = 0; i < LYNumCharsets; ++i) {
+ if (charset_subsets[i].hide_display == FALSE) {
+ n = cur_display++;
+ if (i == current_char_set)
+ displayed_display_charset_idx = n;
+ display_charset_map[n] = i;
+ display_charset_choices[n] = LYchar_set_names[i];
+ }
+ if (charset_subsets[i].hide_assumed == FALSE) {
+ n = cur_assumed++;
+ assumed_doc_charset_map[n] = i;
+ assumed_charset_choices[n] = LYCharSet_UC[i].MIMEname;
+ charset_subsets[i].assumed_idx = n;
+ }
+ display_charset_choices[cur_display] = NULL;
+ assumed_charset_choices[cur_assumed] = NULL;
+ }
+#endif
+}
+#endif /* USE_CHARSET_CHOICE */
diff --git a/src/LYCharSets.h b/src/LYCharSets.h
new file mode 100644
index 0000000..c0d1553
--- /dev/null
+++ b/src/LYCharSets.h
@@ -0,0 +1,154 @@
+/*
+ * $LynxId: LYCharSets.h,v 1.34 2012/02/10 18:43:40 tom Exp $
+ */
+#ifndef LYCHARSETS_H
+#define LYCHARSETS_H
+
+#ifndef HTUTILS_H
+#include <HTUtils.h>
+#endif
+
+#include <UCDefs.h>
+
+#ifndef UCMAP_H
+#include <UCMap.h>
+#endif /* !UCMAP_H */
+
+#include <HTCJK.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ extern BOOL HTPassEightBitRaw;
+ extern BOOL HTPassEightBitNum;
+ extern BOOL HTPassHighCtrlRaw;
+ extern BOOL HTPassHighCtrlNum;
+ extern BOOLEAN LYHaveCJKCharacterSet;
+ extern BOOLEAN DisplayCharsetMatchLocale;
+
+ extern HTkcode kanji_code;
+
+/*
+ * currently active character set (internal handler)
+ */
+ extern int current_char_set;
+/*
+ * character set where it is safe to draw lines on boxes.
+ */
+ extern int linedrawing_char_set;
+
+/*
+ * Initializer, calls initialization function for the
+ * CHARTRANS handling. - KW
+ */
+ extern int LYCharSetsDeclared(void);
+
+ extern STRING2PTR LYCharSets[];
+ extern const char *SevenBitApproximations[];
+ extern STRING2PTR p_entity_values;
+ extern const char *LYchar_set_names[]; /* Full name, not MIME */
+ extern int LYlowest_eightbit[];
+ extern int LYNumCharsets;
+ extern LYUCcharset LYCharSet_UC[];
+ extern int UCGetLYhndl_byAnyName(char *value);
+ extern void HTMLSetCharacterHandling(int i);
+ extern void HTMLSetUseDefaultRawMode(int i, int modeflag);
+ extern void HTMLUseCharacterSet(int i);
+ extern UCode_t HTMLGetEntityUCValue(const char *name);
+ extern void Set_HTCJK(const char *inMIMEname, const char *outMIMEname);
+
+ extern const char *HTMLGetEntityName(UCode_t code);
+
+ UCode_t LYcp1252ToUnicode(UCode_t code);
+
+/*
+ * HTMLGetEntityName calls LYEntityNames for iso-8859-1 entity names only.
+ * This is an obsolete technique but widely used in the code. Note that
+ * unicode number in general may have several equivalent entity names because
+ * of synonyms.
+ */
+ extern BOOL force_old_UCLYhndl_on_reload;
+ extern int forced_UCLYhdnl;
+
+#ifndef USE_CHARSET_CHOICE
+# define ALL_CHARSETS_IN_O_MENU_SCREEN 1
+#endif
+
+#ifdef USE_CHARSET_CHOICE
+ typedef struct {
+ BOOL hide_display; /* if FALSE, show in "display-charset" menu */
+ BOOL hide_assumed; /* if FALSE, show in "assumed-charset" menu */
+#ifndef ALL_CHARSETS_IN_O_MENU_SCREEN
+ int assumed_idx; /* only this field is needed */
+#endif
+ } charset_subset_t;
+
+/* each element corresponds to charset in LYCharSets */
+ extern charset_subset_t charset_subsets[];
+
+/* all zeros by default - i.e., all charsets allowed */
+
+/*
+ * true if the charset choices for display charset were requested by user via
+ * lynx.cfg. It will remain FALSE if no "display_charset_choice" settings were
+ * encountered in lynx.cfg
+ */
+ extern BOOL custom_display_charset;
+
+/* similar to custom_display_charset */
+ extern BOOL custom_assumed_doc_charset;
+
+#ifndef ALL_CHARSETS_IN_O_MENU_SCREEN
+
+/* this stuff is initialized after reading lynx.cfg and .lynxrc */
+
+/*
+ * These arrays map index of charset shown in menu to the index in LYCharsets[]
+ */
+ extern int display_charset_map[];
+ extern int assumed_doc_charset_map[];
+
+/* these arrays are NULL terminated */
+ extern const char *display_charset_choices[];
+ extern const char *assumed_charset_choices[];
+
+ extern int displayed_display_charset_idx;
+
+#endif
+/* this will be called after lynx.cfg and .lynxrc are read */
+ extern void init_charset_subsets(void);
+#endif /* USE_CHARSET_CHOICE */
+
+#if !defined(NO_AUTODETECT_DISPLAY_CHARSET)
+# ifdef __EMX__
+# define CAN_AUTODETECT_DISPLAY_CHARSET
+# ifdef EXP_CHARTRANS_AUTOSWITCH
+# define CAN_SWITCH_DISPLAY_CHARSET
+# endif
+# endif
+#endif
+
+#ifdef CAN_AUTODETECT_DISPLAY_CHARSET
+ extern int auto_display_charset;
+#endif
+
+#ifdef CAN_SWITCH_DISPLAY_CHARSET
+ enum switch_display_charset_t {
+ SWITCH_DISPLAY_CHARSET_MAYBE,
+ SWITCH_DISPLAY_CHARSET_REALLY,
+ SWITCH_DISPLAY_CHARSET_RESIZE
+ };
+ extern int Switch_Display_Charset(int ord, enum switch_display_charset_t really);
+ extern int Find_Best_Display_Charset(int ord);
+ extern char *charsets_directory;
+ extern char *charset_switch_rules;
+ extern int switch_display_charsets;
+ extern int auto_other_display_charset;
+ extern int codepages[2];
+ extern int real_charsets[2]; /* Non "auto-" charsets for the codepages */
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* LYCHARSETS_H */
diff --git a/src/LYCharUtils.c b/src/LYCharUtils.c
new file mode 100644
index 0000000..0013989
--- /dev/null
+++ b/src/LYCharUtils.c
@@ -0,0 +1,3419 @@
+/*
+ * $LynxId: LYCharUtils.c,v 1.137 2021/10/24 00:47:08 tom Exp $
+ *
+ * Functions associated with LYCharSets.c and the Lynx version of HTML.c - FM
+ * ==========================================================================
+ */
+#include <HTUtils.h>
+#include <SGML.h>
+
+#define Lynx_HTML_Handler
+#include <HTChunk.h>
+#include <HText.h>
+#include <HTStyle.h>
+#include <HTMIME.h>
+#include <HTML.h>
+
+#include <HTCJK.h>
+#include <HTAtom.h>
+#include <HTMLGen.h>
+#include <HTParse.h>
+#include <UCMap.h>
+#include <UCDefs.h>
+#include <UCAux.h>
+
+#include <LYGlobalDefs.h>
+#include <LYCharUtils.h>
+#include <LYCharSets.h>
+
+#include <HTAlert.h>
+#include <HTForms.h>
+#include <HTNestedList.h>
+#include <GridText.h>
+#include <LYStrings.h>
+#include <LYUtils.h>
+#include <LYMap.h>
+#include <LYBookmark.h>
+#include <LYCurses.h>
+#include <LYCookie.h>
+
+#include <LYexit.h>
+#include <LYLeaks.h>
+
+/*
+ * Used for nested lists. - FM
+ */
+int OL_CONTINUE = -29999; /* flag for whether CONTINUE is set */
+int OL_VOID = -29998; /* flag for whether a count is set */
+
+static size_t count_char(const char *value, int ch)
+{
+ const char *found;
+ size_t result = 0;
+
+ while ((*value != '\0') && (found = StrChr(value, ch)) != NULL) {
+ ++result;
+ value = (found + 1);
+ }
+ return result;
+}
+
+/*
+ * This function converts any ampersands in a pre-allocated string to "&amp;".
+ * If brackets is TRUE, it also converts any angle-brackets to "&lt;" or "&gt;".
+ */
+void LYEntify(char **in_out,
+ int brackets)
+{
+ char *source = *in_out;
+ char *target;
+ char *result = NULL;
+ size_t count_AMPs = 0;
+ size_t count_LTs = 0;
+ size_t count_GTs = 0;
+
+#ifdef CJK_EX
+ enum _state {
+ S_text,
+ S_esc,
+ S_dollar,
+ S_paren,
+ S_nonascii_text,
+ S_dollar_paren
+ } state = S_text;
+ int in_sjis = 0;
+#endif
+
+ if (non_empty(source)) {
+ count_AMPs = count_char(*in_out, '&');
+ if (brackets) {
+ count_LTs = count_char(*in_out, '<');
+ count_GTs = count_char(*in_out, '>');
+ }
+
+ if (count_AMPs != 0 || count_LTs != 0 || count_GTs != 0) {
+
+ target = typecallocn(char,
+ (strlen(*in_out)
+ + (4 * count_AMPs)
+ + (3 * count_LTs)
+ + (3 * count_GTs) + 1));
+
+ if ((result = target) == NULL)
+ outofmem(__FILE__, "LYEntify");
+
+ for (source = *in_out; *source; source++) {
+#ifdef CJK_EX
+ if (IS_CJK_TTY) {
+ switch (state) {
+ case S_text:
+ if (*source == '\033') {
+ state = S_esc;
+ *target++ = *source;
+ continue;
+ }
+ break;
+
+ case S_esc:
+ if (*source == '$') {
+ state = S_dollar;
+ } else if (*source == '(') {
+ state = S_paren;
+ } else {
+ state = S_text;
+ }
+ *target++ = *source;
+ continue;
+
+ case S_dollar:
+ if (*source == '@' || *source == 'B' || *source == 'A') {
+ state = S_nonascii_text;
+ } else if (*source == '(') {
+ state = S_dollar_paren;
+ } else {
+ state = S_text;
+ }
+ *target++ = *source;
+ continue;
+
+ case S_dollar_paren:
+ if (*source == 'C') {
+ state = S_nonascii_text;
+ } else {
+ state = S_text;
+ }
+ *target++ = *source;
+ continue;
+
+ case S_paren:
+ if (*source == 'B' || *source == 'J' || *source == 'T') {
+ state = S_text;
+ } else if (*source == 'I') {
+ state = S_nonascii_text;
+ } else if (*source == '\033') {
+ state = S_esc;
+ }
+ *target++ = *source;
+ continue;
+
+ case S_nonascii_text:
+ if (*source == '\033')
+ state = S_esc;
+ *target++ = *source;
+ continue;
+
+ default:
+ break;
+ }
+ if (*(source + 1) != '\0' &&
+ (IS_EUC(UCH(*source), UCH(*(source + 1))) ||
+ IS_SJIS(UCH(*source), UCH(*(source + 1)), in_sjis) ||
+ IS_BIG5(UCH(*source), UCH(*(source + 1))))) {
+ *target++ = *source++;
+ *target++ = *source;
+ continue;
+ }
+ }
+#endif
+ switch (*source) {
+ case '&':
+ *target++ = '&';
+ *target++ = 'a';
+ *target++ = 'm';
+ *target++ = 'p';
+ *target++ = ';';
+ break;
+ case '<':
+ if (brackets) {
+ *target++ = '&';
+ *target++ = 'l';
+ *target++ = 't';
+ *target++ = ';';
+ break;
+ }
+ /* FALLTHRU */
+ case '>':
+ if (brackets) {
+ *target++ = '&';
+ *target++ = 'g';
+ *target++ = 't';
+ *target++ = ';';
+ break;
+ }
+ /* FALLTHRU */
+ default:
+ *target++ = *source;
+ break;
+ }
+ }
+ *target = '\0';
+ FREE(*in_out);
+ *in_out = result;
+ }
+ }
+}
+
+/*
+ * Callers to LYEntifyTitle/LYEntifyValue do not look at the 'target' param.
+ * Optimize things a little by avoiding the memory allocation if not needed,
+ * as is usually the case.
+ */
+static BOOL MustEntify(const char *source)
+{
+ BOOL result;
+
+#ifdef CJK_EX
+ if (IS_CJK_TTY && StrChr(source, '\033') != 0) {
+ result = TRUE;
+ } else
+#endif
+ {
+ size_t length = strlen(source);
+ size_t reject = strcspn(source, "<&>");
+
+ result = (BOOL) (length != reject);
+ }
+
+ return result;
+}
+
+/*
+ * Wrappers for LYEntify() which do not assume that the source was allocated,
+ * e.g., output from gettext().
+ */
+const char *LYEntifyTitle(char **target, const char *source)
+{
+ const char *result = 0;
+
+ if (MustEntify(source)) {
+ StrAllocCopy(*target, source);
+ LYEntify(target, TRUE);
+ result = *target;
+ } else {
+ result = source;
+ }
+ return result;
+}
+
+const char *LYEntifyValue(char **target, const char *source)
+{
+ const char *result = 0;
+
+ if (MustEntify(source)) {
+ StrAllocCopy(*target, source);
+ LYEntify(target, FALSE);
+ result = *target;
+ } else {
+ result = source;
+ }
+ return result;
+}
+
+/*
+ * This function trims characters <= that of a space (32),
+ * including HT_NON_BREAK_SPACE (1) and HT_EN_SPACE (2),
+ * but not ESC, from the heads of strings. - FM
+ */
+void LYTrimHead(char *str)
+{
+ const char *s = str;
+
+ if (isEmpty(s))
+ return;
+
+ while (*s && WHITE(*s) && UCH(*s) != UCH(CH_ESC)) /* S/390 -- gil -- 1669 */
+ s++;
+ if (s > str) {
+ char *ns = str;
+
+ while (*s) {
+ *ns++ = *s++;
+ }
+ *ns = '\0';
+ }
+}
+
+/*
+ * This function trims characters <= that of a space (32),
+ * including HT_NON_BREAK_SPACE (1), HT_EN_SPACE (2), and
+ * ESC from the tails of strings. - FM
+ */
+void LYTrimTail(char *str)
+{
+ int i;
+
+ if (isEmpty(str))
+ return;
+
+ i = (int) strlen(str) - 1;
+ while (i >= 0) {
+ if (WHITE(str[i]))
+ str[i] = '\0';
+ else
+ break;
+ i--;
+ }
+}
+
+/*
+ * This function should receive a pointer to the start
+ * of a comment. It returns a pointer to the end ('>')
+ * character of comment, or it's best guess if the comment
+ * is invalid. - FM
+ */
+char *LYFindEndOfComment(char *str)
+{
+ char *cp, *cp1;
+ enum comment_state {
+ start1,
+ start2,
+ end1,
+ end2
+ } state;
+
+ if (str == NULL)
+ /*
+ * We got NULL, so return NULL. - FM
+ */
+ return NULL;
+
+ if (StrNCmp(str, "<!--", 4))
+ /*
+ * We don't have the start of a comment, so return the beginning of the
+ * string. - FM
+ */
+ return str;
+
+ cp = (str + 4);
+ if (*cp == '>')
+ /*
+ * It's an invalid comment, so
+ * return this end character. - FM
+ */
+ return cp;
+
+ if ((cp1 = StrChr(cp, '>')) == NULL)
+ /*
+ * We don't have an end character, so return the beginning of the
+ * string. - FM
+ */
+ return str;
+
+ if (*cp == '-')
+ /*
+ * Ugh, it's a "decorative" series of dashes, so return the next end
+ * character. - FM
+ */
+ return cp1;
+
+ /*
+ * OK, we're ready to start parsing. - FM
+ */
+ state = start2;
+ while (*cp != '\0') {
+ switch (state) {
+ case start1:
+ if (*cp == '-')
+ state = start2;
+ else
+ /*
+ * Invalid comment, so return the first '>' from the start of
+ * the string. - FM
+ */
+ return cp1;
+ break;
+
+ case start2:
+ if (*cp == '-')
+ state = end1;
+ break;
+
+ case end1:
+ if (*cp == '-')
+ state = end2;
+ else
+ /*
+ * Invalid comment, so return the first '>' from the start of
+ * the string. - FM
+ */
+ return cp1;
+ break;
+
+ case end2:
+ if (*cp == '>')
+ /*
+ * Valid comment, so return the end character. - FM
+ */
+ return cp;
+ if (*cp == '-') {
+ state = start1;
+ } else if (!(WHITE(*cp) && UCH(*cp) != UCH(CH_ESC))) { /* S/390 -- gil -- 1686 */
+ /*
+ * Invalid comment, so return the first '>' from the start of
+ * the string. - FM
+ */
+ return cp1;
+ }
+ break;
+
+ default:
+ break;
+ }
+ cp++;
+ }
+
+ /*
+ * Invalid comment, so return the first '>' from the start of the string.
+ * - FM
+ */
+ return cp1;
+}
+
+/*
+ * If an HREF, itself or if resolved against a base,
+ * represents a file URL, and the host is defaulted,
+ * force in "//localhost". We need this until
+ * all the other Lynx code which performs security
+ * checks based on the "localhost" string is changed
+ * to assume "//localhost" when a host field is not
+ * present in file URLs - FM
+ */
+void LYFillLocalFileURL(char **href,
+ const char *base)
+{
+ char *temp = NULL;
+
+ if (isEmpty(*href))
+ return;
+
+ if (!strcmp(*href, "//") || !StrNCmp(*href, "///", 3)) {
+ if (base != NULL && isFILE_URL(base)) {
+ StrAllocCopy(temp, STR_FILE_URL);
+ StrAllocCat(temp, *href);
+ StrAllocCopy(*href, temp);
+ }
+ }
+ if (isFILE_URL(*href)) {
+ if (*(*href + 5) == '\0') {
+ StrAllocCat(*href, "//localhost");
+ } else if (!strcmp(*href, "file://")) {
+ StrAllocCat(*href, "localhost");
+ } else if (!StrNCmp(*href, "file:///", 8)) {
+ StrAllocCopy(temp, (*href + 7));
+ LYLocalFileToURL(href, temp);
+ } else if (!StrNCmp(*href, "file:/", 6) && !LYIsHtmlSep(*(*href + 6))) {
+ StrAllocCopy(temp, (*href + 5));
+ LYLocalFileToURL(href, temp);
+ }
+ }
+#if defined(USE_DOS_DRIVES)
+ if (LYIsDosDrive(*href)) {
+ /*
+ * If it's a local DOS path beginning with drive letter,
+ * add file://localhost/ prefix and go ahead.
+ */
+ StrAllocCopy(temp, *href);
+ LYLocalFileToURL(href, temp);
+ }
+
+ /* use below: strlen("file://localhost/") = 17 */
+ if (!StrNCmp(*href, "file://localhost/", 17)
+ && (strlen(*href) == 19)
+ && LYIsDosDrive(*href + 17)) {
+ /*
+ * Terminate DOS drive letter with a slash to surf root successfully.
+ * Here seems a proper place to do so.
+ */
+ LYAddPathSep(href);
+ }
+#endif /* USE_DOS_DRIVES */
+
+ /*
+ * No path in a file://localhost URL means a
+ * directory listing for the current default. - FM
+ */
+ if (!strcmp(*href, "file://localhost")) {
+ const char *temp2;
+
+#ifdef VMS
+ temp2 = HTVMS_wwwName(LYGetEnv("PATH"));
+#else
+ char curdir[LY_MAXPATH];
+
+ temp2 = wwwName(Current_Dir(curdir));
+#endif /* VMS */
+ if (!LYIsHtmlSep(*temp2))
+ LYAddHtmlSep(href);
+ /*
+ * Check for pathological cases - current dir has chars which MUST BE
+ * URL-escaped - kw
+ */
+ if (StrChr(temp2, '%') != NULL || StrChr(temp2, '#') != NULL) {
+ FREE(temp);
+ temp = HTEscape(temp2, URL_PATH);
+ StrAllocCat(*href, temp);
+ } else {
+ StrAllocCat(*href, temp2);
+ }
+ }
+#ifdef VMS
+ /*
+ * On VMS, a file://localhost/ URL means
+ * a listing for the login directory. - FM
+ */
+ if (!strcmp(*href, "file://localhost/"))
+ StrAllocCat(*href, (HTVMS_wwwName(Home_Dir()) + 1));
+#endif /* VMS */
+
+ FREE(temp);
+ return;
+}
+
+void LYAddMETAcharsetToStream(HTStream *target, int disp_chndl)
+{
+ char *buf = 0;
+
+ if (disp_chndl == -1)
+ /*
+ * -1 means use current_char_set.
+ */
+ disp_chndl = current_char_set;
+
+ if (target != 0 && disp_chndl >= 0) {
+ HTSprintf0(&buf, "<META %s content=\"" STR_HTML ";charset=%s\">\n",
+ "http-equiv=\"content-type\"",
+ LYCharSet_UC[disp_chndl].MIMEname);
+ (*target->isa->put_string) (target, buf);
+ FREE(buf);
+ }
+}
+
+/*
+ * This function writes a line with a META tag to an open file,
+ * which will specify a charset parameter to use when the file is
+ * read back in. It is meant for temporary HTML files used by the
+ * various special pages which may show titles of documents. When those
+ * files are created, the title strings normally have been translated and
+ * expanded to the display character set, so we have to make sure they
+ * don't get translated again.
+ * If the user has changed the display character set during the lifetime
+ * of the Lynx session (or, more exactly, during the time the title
+ * strings to be written were generated), they may now have different
+ * character encodings and there is currently no way to get it all right.
+ * To change this, we would have to add a variable for each string which
+ * keeps track of its character encoding.
+ * But at least we can try to ensure that reading the file after future
+ * display character set changes will give reasonable output.
+ *
+ * The META tag is not written if the display character set (passed as
+ * disp_chndl) already corresponds to the charset assumption that
+ * would be made when the file is read. - KW
+ *
+ * Currently this function is used for temporary files like "Lynx Info Page"
+ * and for one permanent - bookmarks (so it may be a problem if you change
+ * the display charset later: new bookmark entries may be mistranslated).
+ * - LP
+ */
+void LYAddMETAcharsetToFD(FILE *fd, int disp_chndl)
+{
+ if (disp_chndl == -1)
+ /*
+ * -1 means use current_char_set.
+ */
+ disp_chndl = current_char_set;
+
+ if (fd == NULL || disp_chndl < 0)
+ /*
+ * Should not happen.
+ */
+ return;
+
+ if (UCLYhndl_HTFile_for_unspec == disp_chndl)
+ /*
+ * Not need to do, so we don't.
+ */
+ return;
+
+ if (LYCharSet_UC[disp_chndl].enc == UCT_ENC_7BIT)
+ /*
+ * There shouldn't be any 8-bit characters in this case.
+ */
+ return;
+
+ /*
+ * In other cases we don't know because UCLYhndl_for_unspec may change
+ * during the lifetime of the file (by toggling raw mode or changing the
+ * display character set), so proceed.
+ */
+ fprintf(fd, "<META %s content=\"" STR_HTML ";charset=%s\">\n",
+ "http-equiv=\"content-type\"",
+ LYCharSet_UC[disp_chndl].MIMEname);
+}
+
+/*
+ * This function returns OL TYPE="A" strings in
+ * the range of " A." (1) to "ZZZ." (18278). - FM
+ */
+char *LYUppercaseA_OL_String(int seqnum)
+{
+ static char OLstring[8];
+
+ if (seqnum <= 1) {
+ strcpy(OLstring, " A.");
+ return OLstring;
+ }
+ if (seqnum < 27) {
+ sprintf(OLstring, " %c.", (seqnum + 64));
+ return OLstring;
+ }
+ if (seqnum < 703) {
+ sprintf(OLstring, "%c%c.", ((seqnum - 1) / 26 + 64),
+ (seqnum - ((seqnum - 1) / 26) * 26 + 64));
+ return OLstring;
+ }
+ if (seqnum < 18279) {
+ sprintf(OLstring, "%c%c%c.", ((seqnum - 27) / 676 + 64),
+ (((seqnum - ((seqnum - 27) / 676) * 676) - 1) / 26 + 64),
+ (seqnum - ((seqnum - 1) / 26) * 26 + 64));
+ return OLstring;
+ }
+ strcpy(OLstring, "ZZZ.");
+ return OLstring;
+}
+
+/*
+ * This function returns OL TYPE="a" strings in
+ * the range of " a." (1) to "zzz." (18278). - FM
+ */
+char *LYLowercaseA_OL_String(int seqnum)
+{
+ static char OLstring[8];
+
+ if (seqnum <= 1) {
+ strcpy(OLstring, " a.");
+ return OLstring;
+ }
+ if (seqnum < 27) {
+ sprintf(OLstring, " %c.", (seqnum + 96));
+ return OLstring;
+ }
+ if (seqnum < 703) {
+ sprintf(OLstring, "%c%c.", ((seqnum - 1) / 26 + 96),
+ (seqnum - ((seqnum - 1) / 26) * 26 + 96));
+ return OLstring;
+ }
+ if (seqnum < 18279) {
+ sprintf(OLstring, "%c%c%c.", ((seqnum - 27) / 676 + 96),
+ (((seqnum - ((seqnum - 27) / 676) * 676) - 1) / 26 + 96),
+ (seqnum - ((seqnum - 1) / 26) * 26 + 96));
+ return OLstring;
+ }
+ strcpy(OLstring, "zzz.");
+ return OLstring;
+}
+
+/*
+ * This function returns OL TYPE="I" strings in the
+ * range of " I." (1) to "MMM." (3000).- FM
+ * Maximum length: 16 -TD
+ */
+char *LYUppercaseI_OL_String(int seqnum)
+{
+ static char OLstring[20];
+ int Arabic = seqnum;
+
+ if (Arabic >= 3000) {
+ strcpy(OLstring, "MMM.");
+ return OLstring;
+ }
+
+ switch (Arabic) {
+ case 1:
+ strcpy(OLstring, " I.");
+ return OLstring;
+ case 5:
+ strcpy(OLstring, " V.");
+ return OLstring;
+ case 10:
+ strcpy(OLstring, " X.");
+ return OLstring;
+ case 50:
+ strcpy(OLstring, " L.");
+ return OLstring;
+ case 100:
+ strcpy(OLstring, " C.");
+ return OLstring;
+ case 500:
+ strcpy(OLstring, " D.");
+ return OLstring;
+ case 1000:
+ strcpy(OLstring, " M.");
+ return OLstring;
+ default:
+ OLstring[0] = '\0';
+ break;
+ }
+
+ while (Arabic >= 1000) {
+ strcat(OLstring, "M");
+ Arabic -= 1000;
+ }
+
+ if (Arabic >= 900) {
+ strcat(OLstring, "CM");
+ Arabic -= 900;
+ }
+
+ if (Arabic >= 500) {
+ strcat(OLstring, "D");
+ Arabic -= 500;
+ }
+
+ if (Arabic >= 400) {
+ strcat(OLstring, "CD");
+ Arabic -= 400;
+ }
+
+ while (Arabic >= 100) {
+ strcat(OLstring, "C");
+ Arabic -= 100;
+ }
+
+ if (Arabic >= 90) {
+ strcat(OLstring, "XC");
+ Arabic -= 90;
+ }
+
+ if (Arabic >= 50) {
+ strcat(OLstring, "L");
+ Arabic -= 50;
+ }
+
+ if (Arabic >= 40) {
+ strcat(OLstring, "XL");
+ Arabic -= 40;
+ }
+
+ while (Arabic > 10) {
+ strcat(OLstring, "X");
+ Arabic -= 10;
+ }
+
+ switch (Arabic) {
+ case 1:
+ strcat(OLstring, "I.");
+ break;
+ case 2:
+ strcat(OLstring, "II.");
+ break;
+ case 3:
+ strcat(OLstring, "III.");
+ break;
+ case 4:
+ strcat(OLstring, "IV.");
+ break;
+ case 5:
+ strcat(OLstring, "V.");
+ break;
+ case 6:
+ strcat(OLstring, "VI.");
+ break;
+ case 7:
+ strcat(OLstring, "VII.");
+ break;
+ case 8:
+ strcat(OLstring, "VIII.");
+ break;
+ case 9:
+ strcat(OLstring, "IX.");
+ break;
+ case 10:
+ strcat(OLstring, "X.");
+ break;
+ default:
+ strcat(OLstring, ".");
+ break;
+ }
+
+ return OLstring;
+}
+
+/*
+ * This function returns OL TYPE="i" strings in
+ * range of " i." (1) to "mmm." (3000).- FM
+ * Maximum length: 16 -TD
+ */
+char *LYLowercaseI_OL_String(int seqnum)
+{
+ static char OLstring[20];
+ int Arabic = seqnum;
+
+ if (Arabic >= 3000) {
+ strcpy(OLstring, "mmm.");
+ return OLstring;
+ }
+
+ switch (Arabic) {
+ case 1:
+ strcpy(OLstring, " i.");
+ return OLstring;
+ case 5:
+ strcpy(OLstring, " v.");
+ return OLstring;
+ case 10:
+ strcpy(OLstring, " x.");
+ return OLstring;
+ case 50:
+ strcpy(OLstring, " l.");
+ return OLstring;
+ case 100:
+ strcpy(OLstring, " c.");
+ return OLstring;
+ case 500:
+ strcpy(OLstring, " d.");
+ return OLstring;
+ case 1000:
+ strcpy(OLstring, " m.");
+ return OLstring;
+ default:
+ OLstring[0] = '\0';
+ break;
+ }
+
+ while (Arabic >= 1000) {
+ strcat(OLstring, "m");
+ Arabic -= 1000;
+ }
+
+ if (Arabic >= 900) {
+ strcat(OLstring, "cm");
+ Arabic -= 900;
+ }
+
+ if (Arabic >= 500) {
+ strcat(OLstring, "d");
+ Arabic -= 500;
+ }
+
+ if (Arabic >= 400) {
+ strcat(OLstring, "cd");
+ Arabic -= 400;
+ }
+
+ while (Arabic >= 100) {
+ strcat(OLstring, "c");
+ Arabic -= 100;
+ }
+
+ if (Arabic >= 90) {
+ strcat(OLstring, "xc");
+ Arabic -= 90;
+ }
+
+ if (Arabic >= 50) {
+ strcat(OLstring, "l");
+ Arabic -= 50;
+ }
+
+ if (Arabic >= 40) {
+ strcat(OLstring, "xl");
+ Arabic -= 40;
+ }
+
+ while (Arabic > 10) {
+ strcat(OLstring, "x");
+ Arabic -= 10;
+ }
+
+ switch (Arabic) {
+ case 1:
+ strcat(OLstring, "i.");
+ break;
+ case 2:
+ strcat(OLstring, "ii.");
+ break;
+ case 3:
+ strcat(OLstring, "iii.");
+ break;
+ case 4:
+ strcat(OLstring, "iv.");
+ break;
+ case 5:
+ strcat(OLstring, "v.");
+ break;
+ case 6:
+ strcat(OLstring, "vi.");
+ break;
+ case 7:
+ strcat(OLstring, "vii.");
+ break;
+ case 8:
+ strcat(OLstring, "viii.");
+ break;
+ case 9:
+ strcat(OLstring, "ix.");
+ break;
+ case 10:
+ strcat(OLstring, "x.");
+ break;
+ default:
+ strcat(OLstring, ".");
+ break;
+ }
+
+ return OLstring;
+}
+
+/*
+ * This function initializes the Ordered List counter. - FM
+ */
+void LYZero_OL_Counter(HTStructured * me)
+{
+ int i;
+
+ if (!me)
+ return;
+
+ for (i = 0; i < 12; i++) {
+ me->OL_Counter[i] = OL_VOID;
+ me->OL_Type[i] = '1';
+ }
+
+ me->Last_OL_Count = 0;
+ me->Last_OL_Type = '1';
+
+ return;
+}
+
+/*
+ * This function is used by the HTML Structured object. - KW
+ */
+void LYGetChartransInfo(HTStructured * me)
+{
+ me->UCLYhndl = HTAnchor_getUCLYhndl(me->node_anchor,
+ UCT_STAGE_STRUCTURED);
+ if (me->UCLYhndl < 0) {
+ int chndl = HTAnchor_getUCLYhndl(me->node_anchor, UCT_STAGE_HTEXT);
+
+ if (chndl < 0) {
+ chndl = current_char_set;
+ HTAnchor_setUCInfoStage(me->node_anchor, chndl,
+ UCT_STAGE_HTEXT,
+ UCT_SETBY_STRUCTURED);
+ }
+ HTAnchor_setUCInfoStage(me->node_anchor, chndl,
+ UCT_STAGE_STRUCTURED,
+ UCT_SETBY_STRUCTURED);
+ me->UCLYhndl = HTAnchor_getUCLYhndl(me->node_anchor,
+ UCT_STAGE_STRUCTURED);
+ }
+ me->UCI = HTAnchor_getUCInfoStage(me->node_anchor,
+ UCT_STAGE_STRUCTURED);
+}
+
+ /* as in HTParse.c, saves some calls - kw */
+static const char *hex = "0123456789ABCDEF";
+
+/*
+ * Any raw 8-bit or multibyte characters already have been
+ * handled in relation to the display character set
+ * in SGML_character(), including named and numeric entities.
+ *
+ * This function used for translations HTML special fields inside tags
+ * (ALT=, VALUE=, etc.) from charset `cs_from' to charset `cs_to'.
+ * It also unescapes non-ASCII characters from URL (#fragments !)
+ * if st_URL is active.
+ *
+ * If `do_ent' is YES, it converts named entities
+ * and numeric character references (NCRs) to their `cs_to' replacements.
+ *
+ * Named entities converted to unicodes. NCRs (unicodes) converted
+ * by UCdomap.c chartrans functions.
+ * ???NCRs with values in the ISO-8859-1 range 160-255 may be converted
+ * to their HTML entity names (via old-style entities) and then translated
+ * according to the LYCharSets.c array for `cs_out'???.
+ *
+ * Some characters (see descriptions in `put_special_unicodes' from SGML.c)
+ * translated in relation with the state of boolean variables
+ * `use_lynx_specials', `plain_space' and `hidden'. It is not clear yet:
+ *
+ * If plain_space is TRUE, nbsp (160) will be treated as an ASCII
+ * space (32). If hidden is TRUE, entities will be translated
+ * (if `do_ent' is YES) but escape sequences will be passed unaltered.
+ * If `hidden' is FALSE, some characters are converted to Lynx special
+ * codes (see `put_special_unicodes') or ASCII space if `plain_space'
+ * applies). @@ is `use_lynx_specials' needed, does it have any effect? @@
+ * If `use_lynx_specials' is YES, translate byte values 160 and 173
+ * meaning U+00A0 and U+00AD given as or converted from raw char input
+ * are converted to HT_NON_BREAK_SPACE and LY_SOFT_HYPHEN, respectively
+ * (unless input and output charset are both iso-8859-1, for compatibility
+ * with previous usage in HTML.c) even if `hidden' or `plain_space' is set.
+ *
+ * If `Back' is YES, the reverse is done instead i.e., Lynx special codes
+ * in the input are translated back to character values.
+ *
+ * If `Back' is YES, an attempt is made to use UCReverseTransChar() for
+ * back translation which may be more efficient. (?)
+ *
+ * If `stype' is st_URL, non-ASCII characters are URL-encoded instead.
+ * The sequence of bytes being URL-encoded is the raw input character if
+ * we couldn't translate it from `cs_in' (CJK etc.); otherwise it is the
+ * UTF-8 representation if either `cs_to' requires this or if the
+ * character's Unicode value is > 255, otherwise it should be the iso-8859-1
+ * representation.
+ * No general URL-encoding occurs for displayable ASCII characters and
+ * spaces and some C0 controls valid in HTML (LF, TAB), it is expected
+ * that other functions will take care of that as appropriate.
+ *
+ * Escape characters (0x1B, '\033') are
+ * - URL-encoded if `stype' is st_URL, otherwise
+ * - dropped if `stype' is st_other, otherwise (i.e., st_HTML)
+ * - passed if `hidden' is TRUE or HTCJK is set, otherwise
+ * - dropped.
+ *
+ * (If `stype' is st_URL or st_other most of the parameters really predefined:
+ * cs_from=cs_to, use_lynx_specials=plain_space=NO, and hidden=YES)
+ *
+ *
+ * Returns pointer to the char** passed in
+ * if string translated or translation unnecessary,
+ * NULL otherwise
+ * (in which case something probably went wrong.)
+ *
+ *
+ * In general, this somehow ugly function (KW)
+ * cover three functions from v.2.7.2 (FM):
+ * extern void LYExpandString (
+ * HTStructured * me,
+ * char ** str);
+ * extern void LYUnEscapeEntities (
+ * HTStructured * me,
+ * char ** str);
+ * extern void LYUnEscapeToLatinOne (
+ * HTStructured * me,
+ * char ** str,
+ * BOOLEAN isURL);
+ */
+
+char **LYUCFullyTranslateString(char **str,
+ int cs_from,
+ int cs_to,
+ int do_ent,
+ int use_lynx_specials,
+ int plain_space,
+ int hidden,
+ int Back,
+ CharUtil_st stype)
+{
+ char *p;
+ char *q, *qs;
+ HTChunk *chunk = NULL;
+ char *cp = 0;
+ char cpe = 0;
+ char *esc = NULL;
+ char replace_buf[64];
+ int uck;
+ int lowest_8;
+ UCode_t code = 0;
+ BOOL output_utf8 = 0, repl_translated_C0 = 0;
+ size_t len;
+ const char *name = NULL;
+ BOOLEAN no_bytetrans;
+ UCTransParams T;
+ BOOL from_is_utf8 = FALSE;
+ char *puni = 0;
+ enum _state {
+ S_text,
+ S_esc,
+ S_dollar,
+ S_paren,
+ S_nonascii_text,
+ S_dollar_paren,
+ S_trans_byte,
+ S_check_ent,
+ S_ncr,
+ S_check_uni,
+ S_named,
+ S_check_name,
+ S_recover,
+ S_got_oututf8,
+ S_got_outstring,
+ S_put_urlstring,
+ S_got_outchar,
+ S_put_urlchar,
+ S_next_char,
+ S_done
+ } state = S_text;
+ enum _parsing_what {
+ P_text,
+ P_utf8,
+ P_hex,
+ P_decimal,
+ P_named
+ } what = P_text;
+
+#ifdef KANJI_CODE_OVERRIDE
+ static unsigned char sjis_1st = '\0';
+
+ unsigned char sjis_str[3];
+#endif
+
+ /*
+ * Make sure we have a non-empty string. - FM
+ */
+ if (isEmpty(*str))
+ return str;
+
+ if (cs_from < 0 || cs_to < 0) {
+ CTRACE((tfp, "BUG: LYUCFullyTranslateString from=%d, to=%d\n",
+ cs_from, cs_to));
+ return str;
+ }
+
+ /*
+ * FIXME: something's wrong with the limit checks here (clearing the
+ * buffer helps).
+ */
+ memset(replace_buf, 0, sizeof(replace_buf));
+
+ /*
+ * Don't do byte translation if original AND target character sets are both
+ * iso-8859-1 (and we are not called to back-translate), or if we are in
+ * CJK mode.
+ */
+ if (IS_CJK_TTY
+#ifdef USE_JAPANESEUTF8_SUPPORT
+ && (strcmp(LYCharSet_UC[cs_from].MIMEname, "utf-8") != 0)
+ && (strcmp(LYCharSet_UC[cs_to].MIMEname, "utf-8") != 0)
+#endif
+ ) {
+ no_bytetrans = TRUE;
+ } else if (cs_to <= 0 && cs_from == cs_to && (!Back || cs_to < 0)) {
+ no_bytetrans = TRUE;
+ } else {
+ /* No need to translate or examine the string any further */
+ no_bytetrans = (BOOL) (!use_lynx_specials && !Back &&
+ UCNeedNotTranslate(cs_from, cs_to));
+ }
+ /*
+ * Save malloc/calloc overhead in simple case - kw
+ */
+ if (do_ent && hidden && (stype != st_URL) && (StrChr(*str, '&') == NULL))
+ do_ent = FALSE;
+
+ /* Can't do, caller should figure out what to do... */
+ if (!UCCanTranslateFromTo(cs_from, cs_to)) {
+ if (cs_to < 0)
+ return NULL;
+ if (!do_ent && no_bytetrans)
+ return NULL;
+ no_bytetrans = TRUE;
+ } else if (cs_to < 0) {
+ do_ent = FALSE;
+ }
+
+ if (!do_ent && no_bytetrans)
+ return str;
+ p = *str;
+
+ if (!no_bytetrans) {
+ UCTransParams_clear(&T);
+ UCSetTransParams(&T, cs_from, &LYCharSet_UC[cs_from],
+ cs_to, &LYCharSet_UC[cs_to]);
+ from_is_utf8 = (BOOL) (LYCharSet_UC[cs_from].enc == UCT_ENC_UTF8);
+ output_utf8 = T.output_utf8;
+ repl_translated_C0 = T.repl_translated_C0;
+ puni = p;
+ } else if (do_ent) {
+ output_utf8 = (BOOL) (LYCharSet_UC[cs_to].enc == UCT_ENC_UTF8 ||
+ HText_hasUTF8OutputSet(HTMainText));
+ repl_translated_C0 = (BOOL) (LYCharSet_UC[cs_to].enc == UCT_ENC_8BIT_C0);
+ }
+
+ lowest_8 = LYlowest_eightbit[cs_to];
+
+ /*
+ * Create a buffer string seven times the length of the original, so we
+ * have plenty of room for expansions. - FM
+ */
+ len = strlen(p) + 16;
+ q = p;
+
+ qs = q;
+
+/* Create the HTChunk only if we need it */
+#define CHUNK (chunk ? chunk : (chunk = HTChunkCreate2(128, len+1)))
+
+#define REPLACE_STRING(s) \
+ if (q != qs) HTChunkPutb(CHUNK, qs, (int) (q - qs)); \
+ HTChunkPuts(CHUNK, s); \
+ qs = q = *str
+
+#define REPLACE_CHAR(c) if (q > p) { \
+ HTChunkPutb(CHUNK, qs, (int) (q - qs)); \
+ qs = q = *str; \
+ *q++ = c; \
+ } else \
+ *q++ = c
+
+ /*
+ * Loop through string, making conversions as needed.
+ *
+ * The while() checks for a non-'\0' char only for the normal text states
+ * since other states may temporarily modify p or *p (which should be
+ * restored before S_done!) - kw
+ */
+ while (*p || (state != S_text && state != S_nonascii_text)) {
+ switch (state) {
+ case S_text:
+ code = UCH(*p);
+#ifdef KANJI_CODE_OVERRIDE
+ if (HTCJK == JAPANESE && last_kcode == SJIS) {
+ if (sjis_1st == '\0' && (IS_SJIS_HI1(code) || IS_SJIS_HI2(code))) {
+ sjis_1st = UCH(code);
+ } else if (sjis_1st && IS_SJIS_LO(code)) {
+ sjis_1st = '\0';
+ } else {
+ if (conv_jisx0201kana && 0xA1 <= code && code <= 0xDF) {
+ sjis_str[2] = '\0';
+ JISx0201TO0208_SJIS(UCH(code),
+ sjis_str, sjis_str + 1);
+ REPLACE_STRING(sjis_str);
+ p++;
+ continue;
+ }
+ }
+ }
+#endif
+ if (*p == '\033') {
+ if ((IS_CJK_TTY && !hidden) || stype != st_HTML) {
+ state = S_esc;
+ if (stype == st_URL) {
+ REPLACE_STRING("%1B");
+ p++;
+ continue;
+ } else if (stype != st_HTML) {
+ p++;
+ continue;
+ } else {
+ *q++ = *p++;
+ continue;
+ }
+ } else if (!hidden) {
+ /*
+ * CJK handling not on, and not a hidden INPUT, so block
+ * escape. - FM
+ */
+ state = S_next_char;
+ } else {
+ state = S_trans_byte;
+ }
+ } else {
+ state = (do_ent ? S_check_ent : S_trans_byte);
+ }
+ break;
+
+ case S_esc:
+ if (*p == '$') {
+ state = S_dollar;
+ *q++ = *p++;
+ continue;
+ } else if (*p == '(') {
+ state = S_paren;
+ *q++ = *p++;
+ continue;
+ } else {
+ state = S_text;
+ }
+ break;
+
+ case S_dollar:
+ if (*p == '@' || *p == 'B' || *p == 'A') {
+ state = S_nonascii_text;
+ *q++ = *p++;
+ continue;
+ } else if (*p == '(') {
+ state = S_dollar_paren;
+ *q++ = *p++;
+ continue;
+ } else {
+ state = S_text;
+ }
+ break;
+
+ case S_dollar_paren:
+ if (*p == 'C') {
+ state = S_nonascii_text;
+ *q++ = *p++;
+ continue;
+ } else {
+ state = S_text;
+ }
+ break;
+
+ case S_paren:
+ if (*p == 'B' || *p == 'J' || *p == 'T') {
+ state = S_text;
+ *q++ = *p++;
+ continue;
+ } else if (*p == 'I') {
+ state = S_nonascii_text;
+ *q++ = *p++;
+ continue;
+ } else {
+ state = S_text;
+ }
+ break;
+
+ case S_nonascii_text:
+ if (*p == '\033') {
+ if ((IS_CJK_TTY && !hidden) || stype != st_HTML) {
+ state = S_esc;
+ if (stype == st_URL) {
+ REPLACE_STRING("%1B");
+ p++;
+ continue;
+ } else if (stype != st_HTML) {
+ p++;
+ continue;
+ }
+ }
+ }
+ *q++ = *p++;
+ continue;
+
+ case S_trans_byte:
+ /* character translation goes here */
+ /*
+ * Don't do anything if we have no string, or if original AND
+ * target character sets are both iso-8859-1, or if we are in CJK
+ * mode.
+ */
+ if (*p == '\0' || no_bytetrans) {
+ state = S_got_outchar;
+ break;
+ }
+
+ if (Back) {
+ int rev_c;
+
+ if ((*p) == HT_NON_BREAK_SPACE ||
+ (*p) == HT_EN_SPACE) {
+ if (plain_space) {
+ code = *p = ' ';
+ state = S_got_outchar;
+ break;
+ } else {
+ code = 160;
+ if (LYCharSet_UC[cs_to].enc == UCT_ENC_8859 ||
+ (LYCharSet_UC[cs_to].like8859 & UCT_R_8859SPECL)) {
+ state = S_got_outchar;
+ break;
+ } else if (!(LYCharSet_UC[cs_from].enc == UCT_ENC_8859
+ || (LYCharSet_UC[cs_from].like8859 & UCT_R_8859SPECL))) {
+ state = S_check_uni;
+ break;
+ } else {
+ *(unsigned char *) p = UCH(160);
+ }
+ }
+ } else if ((*p) == LY_SOFT_HYPHEN) {
+ code = 173;
+ if (LYCharSet_UC[cs_to].enc == UCT_ENC_8859 ||
+ (LYCharSet_UC[cs_to].like8859 & UCT_R_8859SPECL)) {
+ state = S_got_outchar;
+ break;
+ } else if (!(LYCharSet_UC[cs_from].enc == UCT_ENC_8859
+ || (LYCharSet_UC[cs_from].like8859 & UCT_R_8859SPECL))) {
+ state = S_check_uni;
+ break;
+ } else {
+ *(unsigned char *) p = UCH(173);
+ }
+#ifdef USE_JAPANESEUTF8_SUPPORT
+ } else if (output_utf8) {
+ if ((!strcmp(LYCharSet_UC[cs_from].MIMEname, "euc-jp") &&
+ (IS_EUC((unsigned char) (*p),
+ (unsigned char) (*(p + 1))))) ||
+ (!strcmp(LYCharSet_UC[cs_from].MIMEname, "shift_jis") &&
+ (IS_SJIS_2BYTE((unsigned char) (*p),
+ (unsigned char) (*(p + 1)))))) {
+ code = UCTransJPToUni(p, 2, cs_from);
+ p++;
+ state = S_check_uni;
+ break;
+ }
+#endif
+ } else if (code < 127 || T.transp) {
+ state = S_got_outchar;
+ break;
+ }
+ rev_c = UCReverseTransChar(*p, cs_to, cs_from);
+ if (rev_c > 127) {
+ *p = (char) rev_c;
+ code = rev_c;
+ state = S_got_outchar;
+ break;
+ }
+ } else if (code < 127) {
+ state = S_got_outchar;
+ break;
+ }
+
+ if (from_is_utf8) {
+ if (((*p) & 0xc0) == 0xc0) {
+ const char *pq = p;
+
+ puni = p;
+ code = UCGetUniFromUtf8String(&pq);
+ if (code <= 0) {
+ code = UCH(*p);
+ } else {
+ what = P_utf8;
+ puni += (pq - (const char *) p);
+ }
+ }
+ } else if (use_lynx_specials && !Back &&
+ (code == 160 || code == 173) &&
+ (LYCharSet_UC[cs_from].enc == UCT_ENC_8859 ||
+ (LYCharSet_UC[cs_from].like8859 & UCT_R_8859SPECL))) {
+ if (code == 160)
+ code = *p = HT_NON_BREAK_SPACE;
+ else if (code == 173)
+ code = *p = LY_SOFT_HYPHEN;
+ state = S_got_outchar;
+ break;
+ } else if (T.trans_to_uni) {
+ code = UCTransToUni(*p, cs_from);
+ if (code <= 0) {
+ /* What else can we do? */
+ code = UCH(*p);
+ }
+ } else if (!T.trans_from_uni) {
+ state = S_got_outchar;
+ break;
+ }
+ /*
+ * Substitute Lynx special character for 160 (nbsp) if
+ * use_lynx_specials is set.
+ */
+ if (use_lynx_specials && !Back &&
+ (code == 160 || code == 173)) {
+ code = ((code == 160 ? HT_NON_BREAK_SPACE : LY_SOFT_HYPHEN));
+ state = S_got_outchar;
+ break;
+ }
+
+ state = S_check_uni;
+ break;
+
+ case S_check_ent:
+ if (*p == '&') {
+ char *pp = p + 1;
+
+ len = strlen(pp);
+ /*
+ * Check for a numeric entity. - FM
+ */
+ if (*pp == '#' && len > 2 &&
+ (*(pp + 1) == 'x' || *(pp + 1) == 'X') &&
+ UCH(*(pp + 2)) < 127 &&
+ isxdigit(UCH(*(pp + 2)))) {
+ what = P_hex;
+ state = S_ncr;
+ } else if (*pp == '#' && len > 2 &&
+ UCH(*(pp + 1)) < 127 &&
+ isdigit(UCH(*(pp + 1)))) {
+ what = P_decimal;
+ state = S_ncr;
+ } else if (UCH(*pp) < 127 &&
+ isalpha(UCH(*pp))) {
+ what = P_named;
+ state = S_named;
+ } else {
+ state = S_trans_byte;
+ }
+ } else {
+ state = S_trans_byte;
+ }
+ break;
+
+ case S_ncr:
+ if (what == P_hex) {
+ p += 3;
+ } else { /* P_decimal */
+ p += 2;
+ }
+ cp = p;
+ while (*p && UCH(*p) < 127 &&
+ (what == P_hex ? isxdigit(UCH(*p)) :
+ isdigit(UCH(*p)))) {
+ p++;
+ }
+ /*
+ * Save the terminator and isolate the digit(s). - FM
+ */
+ cpe = *p;
+ if (*p)
+ *p++ = '\0';
+ /*
+ * Show the numeric entity if the value:
+ * (1) Is greater than 255 and unhandled Unicode.
+ * (2) Is less than 32, and not valid and we don't have HTCJK set.
+ * (3) Is 127 and we don't have HTPassHighCtrlRaw or HTCJK set.
+ * (4) Is 128 - 159 and we don't have HTPassHighCtrlNum set.
+ */
+ if (UCScanCode(&code, cp, (BOOL) (what == P_hex))) {
+ code = LYcp1252ToUnicode(code);
+ state = S_check_uni;
+ } else {
+ state = S_recover;
+ break;
+ }
+ break;
+
+ case S_check_uni:
+ /*
+ * Show the numeric entity if the value:
+ * (2) Is less than 32, and not valid and we don't have HTCJK set.
+ * (3) Is 127 and we don't have HTPassHighCtrlRaw or HTCJK set.
+ * (4) Is 128 - 159 and we don't have HTPassHighCtrlNum set.
+ */
+ if ((code < 32 &&
+ code != 9 && code != 10 && code != 13 &&
+ !IS_CJK_TTY) ||
+ (code == 127 &&
+ !(HTPassHighCtrlRaw || IS_CJK_TTY)) ||
+ (code > 127 && code < 160 &&
+ !HTPassHighCtrlNum)) {
+ state = S_recover;
+ break;
+ }
+ /*
+ * Convert the value as an unsigned char, hex escaped if isURL is
+ * set and it's 8-bit, and then recycle the terminator if it is not
+ * a semicolon. - FM
+ */
+ if (code > 159 && stype == st_URL) {
+ state = S_got_oututf8;
+ break;
+ }
+ /*
+ * For 160 (nbsp), use that value if it's a hidden INPUT, otherwise
+ * use an ASCII space (32) if plain_space is TRUE, otherwise use
+ * the Lynx special character. - FM
+ */
+ if (code == 160) {
+ if (plain_space) {
+ code = ' ';
+ state = S_got_outchar;
+ break;
+ } else if (use_lynx_specials) {
+ code = HT_NON_BREAK_SPACE;
+ state = S_got_outchar;
+ break;
+ } else if ((hidden && !Back)
+ || (LYCharSet_UC[cs_to].codepoints & UCT_CP_SUPERSETOF_LAT1)
+ || LYCharSet_UC[cs_to].enc == UCT_ENC_8859
+ || (LYCharSet_UC[cs_to].like8859 &
+ UCT_R_8859SPECL)) {
+ state = S_got_outchar;
+ break;
+ } else if (
+ (LYCharSet_UC[cs_to].repertoire & UCT_REP_SUPERSETOF_LAT1)) {
+ ; /* nothing, may be translated later */
+ } else {
+ code = ' ';
+ state = S_got_outchar;
+ break;
+ }
+ }
+ /*
+ * For 173 (shy), use that value if it's a hidden INPUT, otherwise
+ * ignore it if plain_space is TRUE, otherwise use the Lynx special
+ * character. - FM
+ */
+ if (code == 173) {
+ if (plain_space) {
+ replace_buf[0] = '\0';
+ state = S_got_outstring;
+ break;
+ } else if (Back &&
+ !(LYCharSet_UC[cs_to].enc == UCT_ENC_8859 ||
+ (LYCharSet_UC[cs_to].like8859 &
+ UCT_R_8859SPECL))) {
+ ; /* nothing, may be translated later */
+ } else if (hidden || Back) {
+ state = S_got_outchar;
+ break;
+ } else if (use_lynx_specials) {
+ code = LY_SOFT_HYPHEN;
+ state = S_got_outchar;
+ break;
+ }
+ }
+ /*
+ * Seek a translation from the chartrans tables.
+ */
+ if ((uck = UCTransUniChar(code,
+ cs_to)) >= 32 &&
+ uck < 256 &&
+ (uck < 127 || uck >= lowest_8)) {
+ code = uck;
+ state = S_got_outchar;
+ break;
+ } else if ((uck == -4 ||
+ (repl_translated_C0 &&
+ uck > 0 && uck < 32)) &&
+ /*
+ * Not found; look for replacement string.
+ */
+ UCTransUniCharStr(replace_buf,
+ 60, code,
+ cs_to,
+ 0) >= 0) {
+ state = S_got_outstring;
+ break;
+ }
+ if (output_utf8 &&
+ code > 127 && code < 0x7fffffffL) {
+ state = S_got_oututf8;
+ break;
+ }
+ /*
+ * For 8194 (ensp), 8195 (emsp), or 8201 (thinsp), use the
+ * character reference if it's a hidden INPUT, otherwise use an
+ * ASCII space (32) if plain_space is TRUE, otherwise use the Lynx
+ * special character. - FM
+ */
+ if (code == 8194 || code == 8195 || code == 8201) {
+ if (hidden) {
+ state = S_recover;
+ } else if (plain_space) {
+ code = ' ';
+ state = S_got_outchar;
+ } else {
+ code = HT_EN_SPACE;
+ state = S_got_outchar;
+ }
+ break;
+ /*
+ * Ignore 8204 (zwnj), 8205 (zwj) 8206 (lrm), and 8207 (rlm),
+ * for now, if we got this far without finding a representation
+ * for them.
+ */
+ } else if (code == 8204 || code == 8205 ||
+ code == 8206 || code == 8207) {
+ CTRACE((tfp, "LYUCFullyTranslateString: Ignoring '%"
+ PRI_UCode_t "'.\n", CAST_UCode_t (code)));
+ replace_buf[0] = '\0';
+ state = S_got_outstring;
+ break;
+ /*
+ * Show the numeric entity if the value: (1) Is greater than
+ * 255 and unhandled Unicode.
+ */
+ } else if (code > 255) {
+ /*
+ * Illegal or not yet handled value. Return "&#" verbatim and
+ * continue from there. - FM
+ */
+ state = S_recover;
+ break;
+ /*
+ * If it's ASCII, or is 8-bit but HTPassEightBitNum is set or
+ * the character set is "ISO Latin 1", use it's value. - FM
+ */
+ } else if (code < 161 ||
+ (code < 256 &&
+ (HTPassEightBitNum || cs_to == LATIN1))) {
+ /*
+ * No conversion needed.
+ */
+ state = S_got_outchar;
+ break;
+
+ /* The following disabled section doesn't make sense any more.
+ * It used to make sense in the past, when S_check_named would
+ * look in "old style" tables in addition to what it does now.
+ * Disabling of going to S_check_name here prevents endless
+ * looping between S_check_uni and S_check_names states, which
+ * could occur here for Latin 1 codes for some cs_to if they
+ * had no translation in that cs_to. Normally all cs_to
+ * *should* now have valid translations via UCTransUniChar or
+ * UCTransUniCharStr for all Latin 1 codes, so that we would
+ * not get here anyway, and no loop could occur. Still, if we
+ * *do* get here, FALL THROUGH to case S_recover now. - kw
+ */
+#if 0
+ /*
+ * If we get to here, convert and handle the character as a
+ * named entity. - FM
+ */
+ } else {
+ name = HTMLGetEntityName(code - 160);
+ state = S_check_name;
+ break;
+#endif
+ }
+ /* FALLTHRU */
+
+ case S_recover:
+ if (what == P_decimal || what == P_hex) {
+ /*
+ * Illegal or not yet handled value. Return "&#" verbatim and
+ * continue from there. - FM
+ */
+ *q++ = '&';
+ *q++ = '#';
+ if (what == P_hex)
+ *q++ = 'x';
+ if (cpe != '\0')
+ *(p - 1) = cpe;
+ p = cp;
+ state = S_done;
+ } else if (what == P_named) {
+ *cp = cpe;
+ *q++ = '&';
+ state = S_done;
+ } else if (!T.output_utf8 && stype == st_HTML && !hidden &&
+ !(HTPassEightBitRaw &&
+ UCH(*p) >= lowest_8)) {
+ sprintf(replace_buf, "U%.2" PRI_UCode_t "", CAST_UCode_t (code));
+
+ state = S_got_outstring;
+ } else {
+ puni = p;
+ code = UCH(*p);
+ state = S_got_outchar;
+ }
+ break;
+
+ case S_named:
+ cp = ++p;
+ while (*cp && UCH(*cp) < 127 &&
+ isalnum(UCH(*cp)))
+ cp++;
+ cpe = *cp;
+ *cp = '\0';
+ name = p;
+ state = S_check_name;
+ break;
+
+ case S_check_name:
+ /*
+ * Seek the Unicode value for the named entity.
+ *
+ * !!!! We manually recover the case of '=' terminator which is
+ * commonly found on query to CGI-scripts enclosed as href= URLs
+ * like "somepath/?x=1&yz=2" Without this dirty fix, submission of
+ * such URLs was broken if &yz string happened to be a recognized
+ * entity name. - LP
+ */
+ if (((code = HTMLGetEntityUCValue(name)) > 0) &&
+ !((cpe == '=') && (stype == st_URL))) {
+ state = S_check_uni;
+ break;
+ }
+ /*
+ * Didn't find the entity. Return verbatim.
+ */
+ state = S_recover;
+ break;
+
+ /* * * O U T P U T S T A T E S * * */
+
+ case S_got_oututf8:
+ if (code > 255 ||
+ (code >= 128 && LYCharSet_UC[cs_to].enc == UCT_ENC_UTF8)) {
+ UCConvertUniToUtf8(code, replace_buf);
+ state = S_got_outstring;
+ } else {
+ state = S_got_outchar;
+ }
+ break;
+ case S_got_outstring:
+ if (what == P_decimal || what == P_hex) {
+ if (cpe != ';' && cpe != '\0')
+ *(--p) = cpe;
+ p--;
+ } else if (what == P_named) {
+ *cp = cpe;
+ p = (*cp != ';') ? (cp - 1) : cp;
+ } else if (what == P_utf8) {
+ p = puni;
+ }
+ if (replace_buf[0] == '\0') {
+ state = S_next_char;
+ break;
+ }
+ if (stype == st_URL) {
+ code = replace_buf[0]; /* assume string OK if first char is */
+ if (code >= 127 ||
+ (code < 32 && (code != 9 && code != 10 && code != 0))) {
+ state = S_put_urlstring;
+ break;
+ }
+ }
+ REPLACE_STRING(replace_buf);
+ state = S_next_char;
+ break;
+ case S_put_urlstring:
+ esc = HTEscape(replace_buf, URL_XALPHAS);
+ REPLACE_STRING(esc);
+ FREE(esc);
+ state = S_next_char;
+ break;
+ case S_got_outchar:
+ if (what == P_decimal || what == P_hex) {
+ if (cpe != ';' && cpe != '\0')
+ *(--p) = cpe;
+ p--;
+ } else if (what == P_named) {
+ *cp = cpe;
+ p = (*cp != ';') ? (cp - 1) : cp;
+ } else if (what == P_utf8) {
+ p = puni;
+ }
+ if (stype == st_URL &&
+ /* Not a full HTEscape, only for 8bit and ctrl chars */
+ (TOASCII(code) >= 127 || /* S/390 -- gil -- 1925 */
+ (code < ' ' && (code != '\t' && code != '\n')))) {
+ state = S_put_urlchar;
+ break;
+ } else if (!hidden && code == 10 && *p == 10
+ && q != qs && *(q - 1) == 13) {
+ /*
+ * If this is not a hidden string, and the current char is the
+ * LF ('\n') of a CRLF pair, drop the CR ('\r'). - KW
+ */
+ *(q - 1) = *p++;
+ state = S_done;
+ break;
+ }
+ *q++ = (char) code;
+ state = S_next_char;
+ break;
+ case S_put_urlchar:
+ *q++ = '%';
+ REPLACE_CHAR(hex[(TOASCII(code) >> 4) & 15]); /* S/390 -- gil -- 1944 */
+ REPLACE_CHAR(hex[(TOASCII(code) & 15)]);
+ /* fall through */
+ case S_next_char:
+ p++; /* fall through */
+ case S_done:
+ state = S_text;
+ what = P_text;
+ /* for next round */
+ }
+ }
+
+ *q = '\0';
+ if (chunk) {
+ HTChunkPutb(CHUNK, qs, (int) (q - qs + 1)); /* also terminates */
+ if (stype == st_URL || stype == st_other) {
+ LYTrimHead(chunk->data);
+ LYTrimTail(chunk->data);
+ }
+ StrAllocCopy(*str, chunk->data);
+ HTChunkFree(chunk);
+ } else {
+ if (stype == st_URL || stype == st_other) {
+ LYTrimHead(qs);
+ LYTrimTail(qs);
+ }
+ }
+ return str;
+}
+
+#undef REPLACE_CHAR
+#undef REPLACE_STRING
+
+BOOL LYUCTranslateHTMLString(char **str,
+ int cs_from,
+ int cs_to,
+ int use_lynx_specials,
+ int plain_space,
+ int hidden,
+ CharUtil_st stype)
+{
+ BOOL ret = YES;
+
+ /* May reallocate *str even if cs_to == 0 */
+ if (!LYUCFullyTranslateString(str, cs_from, cs_to, TRUE,
+ use_lynx_specials, plain_space, hidden,
+ NO, stype)) {
+ ret = NO;
+ }
+ return ret;
+}
+
+BOOL LYUCTranslateBackFormData(char **str,
+ int cs_from,
+ int cs_to,
+ int plain_space)
+{
+ char **ret;
+
+ /* May reallocate *str */
+ ret = (LYUCFullyTranslateString(str, cs_from, cs_to, FALSE,
+ NO, plain_space, YES,
+ YES, st_HTML));
+ return (BOOL) (ret != NULL);
+}
+
+/*
+ * Parse a parameter from an HTML META tag, i.e., the CONTENT.
+ */
+char *LYParseTagParam(char *from,
+ const char *name)
+{
+ size_t len = strlen(name);
+ char *result = NULL;
+ char *string = from;
+
+ do {
+ if ((string = StrChr(string, ';')) == NULL)
+ return NULL;
+ while (*string != '\0' && (*string == ';' || isspace(UCH(*string)))) {
+ string++;
+ }
+ if (strlen(string) < len)
+ return NULL;
+ } while (strncasecomp(string, name, (int) len) != 0);
+ string += len;
+ while (*string != '\0' && (isspace(UCH(*string)) || *string == '=')) {
+ string++;
+ }
+
+ StrAllocCopy(result, string);
+ len = 0;
+ while (isprint(UCH(string[len])) && !isspace(UCH(string[len]))) {
+ len++;
+ }
+ result[len] = '\0';
+
+ /*
+ * Strip single quotes, just in case.
+ */
+ if (len > 2 && result[0] == '\'' && result[len - 1] == result[0]) {
+ result[len - 1] = '\0';
+ for (string = result; (string[0] = string[1]) != '\0'; ++string) ;
+ }
+ return result;
+}
+
+/*
+ * Given a refresh-URL content string, parses the delay time and the URL
+ * string. Ignore the remainder of the content.
+ */
+void LYParseRefreshURL(char *content,
+ char **p_seconds,
+ char **p_address)
+{
+ char *cp;
+ char *cp1 = NULL;
+ char *Seconds = NULL;
+
+ /*
+ * Look for the Seconds field. - FM
+ */
+ cp = LYSkipBlanks(content);
+ if (*cp && isdigit(UCH(*cp))) {
+ cp1 = cp;
+ while (*cp1 && isdigit(UCH(*cp1)))
+ cp1++;
+ StrnAllocCopy(Seconds, cp, (size_t) (cp1 - cp));
+ }
+ *p_seconds = Seconds;
+ *p_address = LYParseTagParam(content, "URL");
+
+ CTRACE((tfp,
+ "LYParseRefreshURL\n\tcontent: %s\n\tseconds: %s\n\taddress: %s\n",
+ content, NonNull(*p_seconds), NonNull(*p_address)));
+}
+
+/*
+ * This function processes META tags in HTML streams. - FM
+ */
+void LYHandleMETA(HTStructured * me, const BOOL *present,
+ STRING2PTR value,
+ char **include GCC_UNUSED)
+{
+ char *http_equiv = NULL, *name = NULL, *content = NULL, *charset = NULL;
+ char *href = NULL, *id_string = NULL, *temp = NULL;
+ char *cp, *cp0, *cp1 = NULL;
+ int url_type = 0;
+
+ if (!me || !present)
+ return;
+
+ /*
+ * Load the attributes for possible use by Lynx. - FM
+ */
+ if (present[HTML_META_HTTP_EQUIV] &&
+ non_empty(value[HTML_META_HTTP_EQUIV])) {
+ StrAllocCopy(http_equiv, value[HTML_META_HTTP_EQUIV]);
+ convert_to_spaces(http_equiv, TRUE);
+ LYUCTranslateHTMLString(&http_equiv, me->tag_charset, me->tag_charset,
+ NO, NO, YES, st_other);
+ if (*http_equiv == '\0') {
+ FREE(http_equiv);
+ }
+ }
+ if (present[HTML_META_NAME] &&
+ non_empty(value[HTML_META_NAME])) {
+ StrAllocCopy(name, value[HTML_META_NAME]);
+ convert_to_spaces(name, TRUE);
+ LYUCTranslateHTMLString(&name, me->tag_charset, me->tag_charset,
+ NO, NO, YES, st_other);
+ if (*name == '\0') {
+ FREE(name);
+ }
+ }
+ if (present[HTML_META_CONTENT] &&
+ non_empty(value[HTML_META_CONTENT])) {
+ /*
+ * Technically, we should be creating a comma-separated list, but META
+ * tags come one at a time, and we'll handle (or ignore) them as each
+ * is received. Also, at this point, we only trim leading and trailing
+ * blanks from the CONTENT value, without translating any named
+ * entities or numeric character references, because how we should do
+ * that depends on what type of information it contains, and whether or
+ * not any of it might be sent to the screen. - FM
+ */
+ StrAllocCopy(content, value[HTML_META_CONTENT]);
+ convert_to_spaces(content, FALSE);
+ LYTrimHead(content);
+ LYTrimTail(content);
+ if (*content == '\0') {
+ FREE(content);
+ }
+ }
+ if (present[HTML_META_CHARSET] &&
+ non_empty(value[HTML_META_CHARSET])) {
+ StrAllocCopy(charset, value[HTML_META_CHARSET]);
+ convert_to_spaces(charset, TRUE);
+ LYUCTranslateHTMLString(&charset, me->tag_charset, me->tag_charset,
+ NO, NO, YES, st_other);
+ if (*charset == '\0') {
+ FREE(charset);
+ }
+ }
+ CTRACE((tfp,
+ "LYHandleMETA: HTTP-EQUIV=\"%s\" NAME=\"%s\" CONTENT=\"%s\" CHARSET=\"%s\"\n",
+ NONNULL(http_equiv),
+ NONNULL(name),
+ NONNULL(content),
+ NONNULL(charset)));
+
+ /*
+ * Check for a text/html Content-Type with a charset directive, if we
+ * didn't already set the charset via a server's header. - AAC & FM
+ */
+ if (isEmpty(me->node_anchor->charset) &&
+ (charset ||
+ (!strcasecomp(NonNull(http_equiv), "Content-Type") && content))) {
+ LYUCcharset *p_in = NULL;
+ LYUCcharset *p_out = NULL;
+
+ if (charset) {
+ LYLowerCase(charset);
+ } else {
+ LYUCTranslateHTMLString(&content, me->tag_charset, me->tag_charset,
+ NO, NO, YES, st_other);
+ LYLowerCase(content);
+ }
+
+ if ((cp1 = charset) != NULL ||
+ (cp1 = strstr(content, "charset")) != NULL) {
+ BOOL chartrans_ok = NO;
+ char *cp3 = NULL, *cp4;
+ int chndl;
+
+ if (!charset)
+ cp1 += 7;
+ while (*cp1 == ' ' || *cp1 == '=' || *cp1 == '"')
+ cp1++;
+
+ StrAllocCopy(cp3, cp1); /* copy to mutilate more */
+ for (cp4 = cp3; (*cp4 != '\0' && *cp4 != '"' &&
+ *cp4 != ';' && *cp4 != ':' &&
+ !WHITE(*cp4)); cp4++) {
+ ; /* do nothing */
+ }
+ *cp4 = '\0';
+ cp4 = cp3;
+ chndl = UCGetLYhndl_byMIME(cp3);
+
+#ifdef CAN_SWITCH_DISPLAY_CHARSET
+ /* Allow a switch to a more suitable display charset */
+ if (Switch_Display_Charset(chndl, SWITCH_DISPLAY_CHARSET_MAYBE)) {
+ /* UCT_STAGE_STRUCTURED and UCT_STAGE_HTEXT
+ should have the same setting for UCInfoStage. */
+ HTAnchor_getUCInfoStage(me->node_anchor, UCT_STAGE_STRUCTURED);
+
+ me->outUCLYhndl = current_char_set;
+ HTAnchor_setUCInfoStage(me->node_anchor,
+ current_char_set,
+ UCT_STAGE_HTEXT,
+ UCT_SETBY_MIME); /* highest priority! */
+ HTAnchor_setUCInfoStage(me->node_anchor,
+ current_char_set,
+ UCT_STAGE_STRUCTURED,
+ UCT_SETBY_MIME); /* highest priority! */
+ me->outUCI = HTAnchor_getUCInfoStage(me->node_anchor,
+ UCT_STAGE_HTEXT);
+ /* The SGML stage will be reset in change_chartrans_handling */
+ }
+#endif
+
+ if (UCCanTranslateFromTo(chndl, current_char_set)) {
+ chartrans_ok = YES;
+ StrAllocCopy(me->node_anchor->charset, cp4);
+ HTAnchor_setUCInfoStage(me->node_anchor, chndl,
+ UCT_STAGE_PARSER,
+ UCT_SETBY_STRUCTURED);
+ } else if (chndl < 0) {
+ /*
+ * Got something but we don't recognize it.
+ */
+ chndl = UCLYhndl_for_unrec;
+ if (chndl < 0) /* UCLYhndl_for_unrec not defined :-( */
+ chndl = UCLYhndl_for_unspec; /* always >= 0 */
+ if (UCCanTranslateFromTo(chndl, current_char_set)) {
+ chartrans_ok = YES;
+ HTAnchor_setUCInfoStage(me->node_anchor, chndl,
+ UCT_STAGE_PARSER,
+ UCT_SETBY_STRUCTURED);
+ }
+ }
+ if (chartrans_ok) {
+ p_in = HTAnchor_getUCInfoStage(me->node_anchor,
+ UCT_STAGE_PARSER);
+ p_out = HTAnchor_setUCInfoStage(me->node_anchor,
+ current_char_set,
+ UCT_STAGE_HTEXT,
+ UCT_SETBY_DEFAULT);
+ if (!p_out) {
+ /*
+ * Try again.
+ */
+ p_out = HTAnchor_getUCInfoStage(me->node_anchor,
+ UCT_STAGE_HTEXT);
+ }
+ if (!strcmp(p_in->MIMEname, "x-transparent")) {
+ HTPassEightBitRaw = TRUE;
+ HTAnchor_setUCInfoStage(me->node_anchor,
+ HTAnchor_getUCLYhndl(me->node_anchor,
+ UCT_STAGE_HTEXT),
+ UCT_STAGE_PARSER,
+ UCT_SETBY_DEFAULT);
+ }
+ if (!strcmp(p_out->MIMEname, "x-transparent")) {
+ HTPassEightBitRaw = TRUE;
+ HTAnchor_setUCInfoStage(me->node_anchor,
+ HTAnchor_getUCLYhndl(me->node_anchor,
+ UCT_STAGE_PARSER),
+ UCT_STAGE_HTEXT,
+ UCT_SETBY_DEFAULT);
+ }
+ if ((p_in->enc != UCT_ENC_CJK)
+#ifdef USE_JAPANESEUTF8_SUPPORT
+ && (p_in->enc != UCT_ENC_UTF8)
+#endif
+ ) {
+ HTCJK = NOCJK;
+ if (!(p_in->codepoints &
+ UCT_CP_SUBSETOF_LAT1) &&
+ chndl == current_char_set) {
+ HTPassEightBitRaw = TRUE;
+ }
+ } else if (p_out->enc == UCT_ENC_CJK) {
+ Set_HTCJK(p_in->MIMEname, p_out->MIMEname);
+ }
+ LYGetChartransInfo(me);
+ /*
+ * Update the chartrans info homologously to a Content-Type
+ * MIME header with a charset parameter. - FM
+ */
+ if (me->UCLYhndl != chndl) {
+ HTAnchor_setUCInfoStage(me->node_anchor, chndl,
+ UCT_STAGE_MIME,
+ UCT_SETBY_STRUCTURED);
+ HTAnchor_setUCInfoStage(me->node_anchor, chndl,
+ UCT_STAGE_PARSER,
+ UCT_SETBY_STRUCTURED);
+ me->inUCLYhndl = HTAnchor_getUCLYhndl(me->node_anchor,
+ UCT_STAGE_PARSER);
+ me->inUCI = HTAnchor_getUCInfoStage(me->node_anchor,
+ UCT_STAGE_PARSER);
+ }
+ UCSetTransParams(&me->T,
+ me->inUCLYhndl, me->inUCI,
+ me->outUCLYhndl, me->outUCI);
+ } else {
+ /*
+ * Cannot translate. If according to some heuristic the given
+ * charset and the current display character both are likely to
+ * be like ISO-8859 in structure, pretend we have some kind of
+ * match.
+ */
+ BOOL given_is_8859 = (BOOL) (!StrNCmp(cp4, "iso-8859-", 9) &&
+ isdigit(UCH(cp4[9])));
+ BOOL given_is_8859like = (BOOL) (given_is_8859
+ || !StrNCmp(cp4, "windows-", 8)
+ || !StrNCmp(cp4, "cp12", 4)
+ || !StrNCmp(cp4, "cp-12", 5));
+ BOOL given_and_display_8859like = (BOOL) (given_is_8859like &&
+ (strstr(LYchar_set_names[current_char_set],
+ "ISO-8859") ||
+ strstr(LYchar_set_names[current_char_set],
+ "windows-")));
+
+ if (given_is_8859) {
+ cp1 = &cp4[10];
+ while (*cp1 &&
+ isdigit(UCH((*cp1))))
+ cp1++;
+ *cp1 = '\0';
+ }
+ if (given_and_display_8859like) {
+ StrAllocCopy(me->node_anchor->charset, cp4);
+ HTPassEightBitRaw = TRUE;
+ }
+ HTAlert(*cp4 ? cp4 : me->node_anchor->charset);
+
+ }
+ FREE(cp3);
+
+ if (me->node_anchor->charset) {
+ CTRACE((tfp,
+ "LYHandleMETA: New charset: %s\n",
+ me->node_anchor->charset));
+ }
+ }
+ /*
+ * Set the kcode element based on the charset. - FM
+ */
+ HText_setKcode(me->text, me->node_anchor->charset, p_in);
+ }
+
+ /*
+ * Make sure we have META name/value pairs to handle. - FM
+ */
+ if (!(http_equiv || name) || !content)
+ goto free_META_copies;
+
+ /*
+ * Check for a no-cache Pragma
+ * or Cache-Control directive. - FM
+ */
+ if (!strcasecomp(NonNull(http_equiv), "Pragma") ||
+ !strcasecomp(NonNull(http_equiv), "Cache-Control")) {
+ LYUCTranslateHTMLString(&content, me->tag_charset, me->tag_charset,
+ NO, NO, YES, st_other);
+ if (!strcasecomp(content, "no-cache")) {
+ me->node_anchor->no_cache = TRUE;
+ HText_setNoCache(me->text);
+ }
+
+ /*
+ * If we didn't get a Cache-Control MIME header, and the META has one,
+ * convert to lowercase, store it in the anchor element, and if we
+ * haven't yet set no_cache, check whether we should. - FM
+ */
+ if ((!me->node_anchor->cache_control) &&
+ !strcasecomp(NonNull(http_equiv), "Cache-Control")) {
+ LYLowerCase(content);
+ StrAllocCopy(me->node_anchor->cache_control, content);
+ if (me->node_anchor->no_cache == FALSE) {
+ cp0 = content;
+ while ((cp = strstr(cp0, "no-cache")) != NULL) {
+ cp += 8;
+ while (*cp != '\0' && WHITE(*cp))
+ cp++;
+ if (*cp == '\0' || *cp == ';') {
+ me->node_anchor->no_cache = TRUE;
+ HText_setNoCache(me->text);
+ break;
+ }
+ cp0 = cp;
+ }
+ if (me->node_anchor->no_cache == TRUE)
+ goto free_META_copies;
+ cp0 = content;
+ while ((cp = strstr(cp0, "max-age")) != NULL) {
+ cp += 7;
+ while (*cp != '\0' && WHITE(*cp))
+ cp++;
+ if (*cp == '=') {
+ cp++;
+ while (*cp != '\0' && WHITE(*cp))
+ cp++;
+ if (isdigit(UCH(*cp))) {
+ cp0 = cp;
+ while (isdigit(UCH(*cp)))
+ cp++;
+ if (*cp0 == '0' && cp == (cp0 + 1)) {
+ me->node_anchor->no_cache = TRUE;
+ HText_setNoCache(me->text);
+ break;
+ }
+ }
+ }
+ cp0 = cp;
+ }
+ }
+ }
+
+ /*
+ * Check for an Expires directive. - FM
+ */
+ } else if (!strcasecomp(NonNull(http_equiv), "Expires")) {
+ /*
+ * If we didn't get an Expires MIME header, store it in the anchor
+ * element, and if we haven't yet set no_cache, check whether we
+ * should. Note that we don't accept a Date header via META tags,
+ * because it's likely to be untrustworthy, but do check for a Date
+ * header from a server when making the comparison. - FM
+ */
+ LYUCTranslateHTMLString(&content, me->tag_charset, me->tag_charset,
+ NO, NO, YES, st_other);
+ StrAllocCopy(me->node_anchor->expires, content);
+ if (me->node_anchor->no_cache == FALSE) {
+ if (!strcmp(content, "0")) {
+ /*
+ * The value is zero, which we treat as an absolute no-cache
+ * directive. - FM
+ */
+ me->node_anchor->no_cache = TRUE;
+ HText_setNoCache(me->text);
+ } else if (me->node_anchor->date != NULL) {
+ /*
+ * We have a Date header, so check if the value is less than or
+ * equal to that. - FM
+ */
+ if (LYmktime(content, TRUE) <=
+ LYmktime(me->node_anchor->date, TRUE)) {
+ me->node_anchor->no_cache = TRUE;
+ HText_setNoCache(me->text);
+ }
+ } else if (LYmktime(content, FALSE) == 0) {
+ /*
+ * We don't have a Date header, and the value is in past for
+ * us. - FM
+ */
+ me->node_anchor->no_cache = TRUE;
+ HText_setNoCache(me->text);
+ }
+ }
+
+ /*
+ * Check for a Refresh directive. - FM
+ */
+ } else if (!strcasecomp(NonNull(http_equiv), "Refresh")) {
+ char *Seconds = NULL;
+
+ LYUCTranslateHTMLString(&content, me->tag_charset, me->tag_charset,
+ NO, NO, YES, st_other);
+ LYParseRefreshURL(content, &Seconds, &href);
+
+ if (Seconds) {
+ if (href) {
+ /*
+ * We found a URL field, so check it out. - FM
+ */
+ if (!LYLegitimizeHREF(me, &href, TRUE, FALSE)) {
+ /*
+ * The specs require a complete URL, but this is a
+ * Netscapism, so don't expect the author to know that. -
+ * FM
+ */
+ HTUserMsg(REFRESH_URL_NOT_ABSOLUTE);
+ /*
+ * Use the document's address as the base. - FM
+ */
+ if (*href != '\0') {
+ temp = HTParse(href,
+ me->node_anchor->address, PARSE_ALL);
+ StrAllocCopy(href, temp);
+ FREE(temp);
+ } else {
+ StrAllocCopy(href, me->node_anchor->address);
+ HText_setNoCache(me->text);
+ }
+
+ } else {
+ /*
+ * Check whether to fill in localhost. - FM
+ */
+ LYFillLocalFileURL(&href,
+ (me->inBASE ?
+ me->base_href : me->node_anchor->address));
+ }
+
+ /*
+ * Set the no_cache flag if the Refresh URL is the same as the
+ * document's address. - FM
+ */
+ if (!strcmp(href, me->node_anchor->address)) {
+ HText_setNoCache(me->text);
+ }
+ } else {
+ /*
+ * We didn't find a URL field, so use the document's own
+ * address and set the no_cache flag. - FM
+ */
+ StrAllocCopy(href, me->node_anchor->address);
+ HText_setNoCache(me->text);
+ }
+ /*
+ * Check for an anchor in http or https URLs. - FM
+ */
+ cp = NULL;
+ /* id_string seems to be used wrong below if given.
+ not that it matters much. avoid setting it here. - kw */
+ if (track_internal_links &&
+ (StrNCmp(href, "http", 4) == 0) &&
+ (cp = StrChr(href, '#')) != NULL) {
+ StrAllocCopy(id_string, cp);
+ *cp = '\0';
+ }
+ if (me->inA) {
+ /*
+ * Ugh! The META tag, which is a HEAD element, is in an
+ * Anchor, which is BODY element. All we can do is close the
+ * Anchor and cross our fingers. - FM
+ */
+ if (me->inBoldA == TRUE && me->inBoldH == FALSE)
+ HText_appendCharacter(me->text, LY_BOLD_END_CHAR);
+ me->inBoldA = FALSE;
+ HText_endAnchor(me->text, me->CurrentANum);
+ me->inA = FALSE;
+ me->CurrentANum = 0;
+ }
+ me->CurrentA = HTAnchor_findChildAndLink
+ (
+ me->node_anchor, /* Parent */
+ id_string, /* Tag */
+ href, /* Address */
+ (HTLinkType *) 0); /* Type */
+ if (id_string)
+ *cp = '#';
+ FREE(id_string);
+ LYEnsureSingleSpace(me);
+ if (me->inUnderline == FALSE)
+ HText_appendCharacter(me->text, LY_UNDERLINE_START_CHAR);
+ HTML_put_string(me, "REFRESH(");
+ HTML_put_string(me, Seconds);
+ HTML_put_string(me, " sec):");
+ FREE(Seconds);
+ if (me->inUnderline == FALSE)
+ HText_appendCharacter(me->text, LY_UNDERLINE_END_CHAR);
+ HTML_put_character(me, ' ');
+ me->in_word = NO;
+ HText_beginAnchor(me->text, me->inUnderline, me->CurrentA);
+ if (me->inBoldH == FALSE)
+ HText_appendCharacter(me->text, LY_BOLD_START_CHAR);
+ HTML_put_string(me, href);
+ FREE(href);
+ if (me->inBoldH == FALSE)
+ HText_appendCharacter(me->text, LY_BOLD_END_CHAR);
+ HText_endAnchor(me->text, 0);
+ LYEnsureSingleSpace(me);
+ }
+
+ /*
+ * Check for a suggested filename via a Content-Disposition with a
+ * filename=name.suffix in it, if we don't already have it via a server
+ * header. - FM
+ */
+ } else if (isEmpty(me->node_anchor->SugFname) &&
+ !strcasecomp((http_equiv ?
+ http_equiv : ""), "Content-Disposition")) {
+ cp = content;
+ while (*cp != '\0' && strncasecomp(cp, "filename", 8))
+ cp++;
+ if (*cp != '\0') {
+ cp = LYSkipBlanks(cp + 8);
+ if (*cp == '=')
+ cp++;
+ cp = LYSkipBlanks(cp);
+ if (*cp != '\0') {
+ StrAllocCopy(me->node_anchor->SugFname, cp);
+ if (*me->node_anchor->SugFname == '"') {
+ if ((cp = StrChr((me->node_anchor->SugFname + 1),
+ '"')) != NULL) {
+ *(cp + 1) = '\0';
+ HTMIME_TrimDoubleQuotes(me->node_anchor->SugFname);
+ if (isEmpty(me->node_anchor->SugFname)) {
+ FREE(me->node_anchor->SugFname);
+ }
+ } else {
+ FREE(me->node_anchor->SugFname);
+ }
+ }
+#if defined(UNIX) && !defined(DOSPATH)
+ /*
+ * If blanks are not legal for local filenames, replace them
+ * with underscores.
+ */
+ if ((cp = me->node_anchor->SugFname) != NULL) {
+ while (*cp != '\0') {
+ if (isspace(UCH(*cp)))
+ *cp = '_';
+ ++cp;
+ }
+ }
+#endif
+ }
+ }
+ /*
+ * Check for a Set-Cookie directive. - AK
+ */
+ } else if (!strcasecomp(NonNull(http_equiv), "Set-Cookie")) {
+ /*
+ * This will need to be updated when Set-Cookie/Set-Cookie2 handling is
+ * finalized. For now, we'll still assume "historical" cookies in META
+ * directives. - FM
+ */
+ url_type = is_url(me->inBASE ?
+ me->base_href : me->node_anchor->address);
+ if (url_type == HTTP_URL_TYPE || url_type == HTTPS_URL_TYPE) {
+ LYSetCookie(content,
+ NULL,
+ (me->inBASE ?
+ me->base_href : me->node_anchor->address));
+ }
+ }
+
+ /*
+ * Free the copies. - FM
+ */
+ free_META_copies:
+ FREE(http_equiv);
+ FREE(name);
+ FREE(content);
+ FREE(charset);
+}
+
+/*
+ * This function handles P elements in HTML streams.
+ * If start is TRUE it handles a start tag, and if
+ * FALSE, an end tag. We presently handle start
+ * and end tags identically, but this can lead to
+ * a different number of blank lines between the
+ * current paragraph and subsequent text when a P
+ * end tag is present or not in the markup. - FM
+ */
+void LYHandlePlike(HTStructured * me, const BOOL *present,
+ STRING2PTR value,
+ char **include GCC_UNUSED,
+ int align_idx,
+ int start)
+{
+ /*
+ * FIG content should be a true block, which like P inherits the current
+ * style. APPLET is like character elements or an ALT attribute, unless
+ * its content contains a block element. If we encounter a P in either's
+ * content, we set flags to treat the content as a block - FM
+ */
+ if (start) {
+ if (me->inFIG)
+ me->inFIGwithP = TRUE;
+
+ if (me->inAPPLET)
+ me->inAPPLETwithP = TRUE;
+ }
+
+ UPDATE_STYLE;
+ if (me->List_Nesting_Level >= 0) {
+ /*
+ * We're in a list. Treat P as an instruction to create one blank
+ * line, if not already present, then fall through to handle
+ * attributes, with the "second line" margins - FM
+ */
+ if (me->inP) {
+ if (me->inFIG || me->inAPPLET ||
+ me->inCAPTION || me->inCREDIT ||
+ me->sp->style->spaceAfter > 0 ||
+ (start && me->sp->style->spaceBefore > 0)) {
+ LYEnsureDoubleSpace(me);
+ } else {
+ LYEnsureSingleSpace(me);
+ }
+ }
+ } else if (me->sp[0].tag_number == HTML_ADDRESS) {
+ /*
+ * We're in an ADDRESS. Treat P as an instruction to start a newline,
+ * if needed, then fall through to handle attributes - FM
+ */
+ if (!HText_LastLineEmpty(me->text, FALSE)) {
+ HText_setLastChar(me->text, ' '); /* absorb white space */
+ HText_appendCharacter(me->text, '\r');
+ }
+ } else {
+ if (start) {
+ if (!(me->inLABEL && !me->inP)) {
+ HText_appendParagraph(me->text);
+ }
+ } else if (me->sp->style->spaceAfter > 0) {
+ LYEnsureDoubleSpace(me);
+ } else {
+ LYEnsureSingleSpace(me);
+ }
+ me->inLABEL = FALSE;
+ }
+ me->in_word = NO;
+
+ if (LYoverride_default_alignment(me)) {
+ me->sp->style->alignment = LYstyles(me->sp[0].tag_number)->alignment;
+ } else if ((me->List_Nesting_Level >= 0 &&
+ (me->sp->style->id == ST_DivCenter ||
+ me->sp->style->id == ST_DivLeft ||
+ me->sp->style->id == ST_DivRight)) ||
+ ((me->Division_Level < 0) &&
+ (me->sp->style->id == ST_Normal ||
+ me->sp->style->id == ST_Preformatted))) {
+ me->sp->style->alignment = HT_LEFT;
+ } else {
+ me->sp->style->alignment = (short) me->current_default_alignment;
+ }
+
+ if (start && align_idx >= 0) {
+ if (present && present[align_idx] && value[align_idx]) {
+ if (!strcasecomp(value[align_idx], "center") &&
+ !(me->List_Nesting_Level >= 0 && !me->inP))
+ me->sp->style->alignment = HT_CENTER;
+ else if (!strcasecomp(value[align_idx], "right") &&
+ !(me->List_Nesting_Level >= 0 && !me->inP))
+ me->sp->style->alignment = HT_RIGHT;
+ else if (!strcasecomp(value[align_idx], "left") ||
+ !strcasecomp(value[align_idx], "justify"))
+ me->sp->style->alignment = HT_LEFT;
+ }
+
+ }
+
+ /*
+ * Mark that we are starting a new paragraph and don't have any of its
+ * text yet - FM
+ */
+ me->inP = FALSE;
+
+ return;
+}
+
+/*
+ * This function handles SELECT elements in HTML streams.
+ * If start is TRUE it handles a start tag, and if FALSE,
+ * an end tag. - FM
+ */
+void LYHandleSELECT(HTStructured * me, const BOOL *present,
+ STRING2PTR value,
+ char **include GCC_UNUSED,
+ int start)
+{
+ int i;
+
+ if (start == TRUE) {
+ char *name = NULL;
+ BOOLEAN multiple = NO;
+ char *size = NULL;
+
+ /*
+ * Initialize the disable attribute.
+ */
+ me->select_disabled = FALSE;
+
+ /*
+ * Check for unclosed TEXTAREA.
+ */
+ if (me->inTEXTAREA) {
+ if (LYBadHTML(me)) {
+ LYShowBadHTML("Bad HTML: Missing TEXTAREA end tag\n");
+ }
+ }
+
+ /*
+ * Set to know we are in a select tag.
+ */
+ me->inSELECT = TRUE;
+
+ if (!(present && present[HTML_SELECT_NAME] &&
+ non_empty(value[HTML_SELECT_NAME]))) {
+ StrAllocCopy(name, "");
+ } else if (StrChr(value[HTML_SELECT_NAME], '&') == NULL) {
+ StrAllocCopy(name, value[HTML_SELECT_NAME]);
+ } else {
+ StrAllocCopy(name, value[HTML_SELECT_NAME]);
+ UNESCAPE_FIELDNAME_TO_STD(&name);
+ }
+ if (present && present[HTML_SELECT_MULTIPLE])
+ multiple = YES;
+ if (present && present[HTML_SELECT_DISABLED])
+ me->select_disabled = TRUE;
+ if (present && present[HTML_SELECT_SIZE] &&
+ non_empty(value[HTML_SELECT_SIZE])) {
+ /*
+ * Let the size be determined by the number of OPTIONs. - FM
+ */
+ CTRACE((tfp, "LYHandleSELECT: Ignoring SIZE=\"%s\" for SELECT.\n",
+ value[HTML_SELECT_SIZE]));
+ }
+
+ if (me->inBoldH == TRUE &&
+ (multiple == NO || LYSelectPopups == FALSE)) {
+ HText_appendCharacter(me->text, LY_BOLD_END_CHAR);
+ me->inBoldH = FALSE;
+ me->needBoldH = TRUE;
+ }
+ if (me->inUnderline == TRUE &&
+ (multiple == NO || LYSelectPopups == FALSE)) {
+ HText_appendCharacter(me->text, LY_UNDERLINE_END_CHAR);
+ me->inUnderline = FALSE;
+ }
+
+ if ((multiple == NO && LYSelectPopups == TRUE) &&
+ (me->sp[0].tag_number == HTML_PRE || me->inPRE == TRUE ||
+ !me->sp->style->freeFormat) &&
+ HText_LastLineSize(me->text, FALSE) > (LYcolLimit - 7)) {
+ /*
+ * Force a newline when we're using a popup in a PRE block and are
+ * within 7 columns from the right margin. This will allow for the
+ * '[' popup designator and help avoid a wrap in the underscore
+ * placeholder for the retracted popup entry in the HText
+ * structure. - FM
+ */
+ HTML_put_character(me, '\n');
+ me->in_word = NO;
+ }
+
+ LYCheckForID(me, present, value, (int) HTML_SELECT_ID);
+
+ HText_beginSelect(name, ATTR_CS_IN, multiple, size);
+ FREE(name);
+ FREE(size);
+
+ me->first_option = TRUE;
+ } else {
+ /*
+ * Handle end tag.
+ */
+ char *ptr;
+
+ /*
+ * Make sure we had a select start tag.
+ */
+ if (!me->inSELECT) {
+ if (LYBadHTML(me)) {
+ LYShowBadHTML("Bad HTML: Unmatched SELECT end tag\n");
+ }
+ return;
+ }
+
+ /*
+ * Set to know that we are no longer in a select tag.
+ */
+ me->inSELECT = FALSE;
+
+ /*
+ * Clear the disable attribute.
+ */
+ me->select_disabled = FALSE;
+
+ /*
+ * Finish the data off.
+ */
+ HTChunkTerminate(&me->option);
+ /*
+ * Finish the previous option.
+ */
+ ptr = HText_setLastOptionValue(me->text,
+ me->option.data,
+ me->LastOptionValue,
+ LAST_ORDER,
+ me->LastOptionChecked,
+ me->UCLYhndl,
+ ATTR_CS_IN);
+ FREE(me->LastOptionValue);
+
+ me->LastOptionChecked = FALSE;
+
+ if (HTCurSelectGroupType == F_CHECKBOX_TYPE ||
+ LYSelectPopups == FALSE) {
+ /*
+ * Start a newline after the last checkbox/button option.
+ */
+ LYEnsureSingleSpace(me);
+ } else {
+ /*
+ * Output popup box with the default option to screen, but use
+ * non-breaking spaces for output.
+ */
+ if (ptr &&
+ me->sp[0].tag_number == HTML_PRE && strlen(ptr) > 6) {
+ /*
+ * The code inadequately handles OPTION fields in PRE tags.
+ * We'll put up a minimum of 6 characters, and if any more
+ * would exceed the wrap column, we'll ignore them.
+ */
+ for (i = 0; i < 6; i++) {
+ if (*ptr == ' ')
+ HText_appendCharacter(me->text, HT_NON_BREAK_SPACE);
+ else
+ HText_appendCharacter(me->text, *ptr);
+ ptr++;
+ }
+ }
+ for (; non_empty(ptr); ptr++) {
+ if (*ptr == ' ')
+ HText_appendCharacter(me->text, HT_NON_BREAK_SPACE);
+ else
+ HText_appendCharacter(me->text, *ptr);
+ }
+ /*
+ * Add end option character.
+ */
+ if (!me->first_option) {
+ HText_appendCharacter(me->text, ']');
+ HText_setLastChar(me->text, ']');
+ me->in_word = YES;
+ }
+ }
+ HTChunkClear(&me->option);
+
+ if (me->Underline_Level > 0 && me->inUnderline == FALSE) {
+ HText_appendCharacter(me->text, LY_UNDERLINE_START_CHAR);
+ me->inUnderline = TRUE;
+ }
+ if (me->needBoldH == TRUE && me->inBoldH == FALSE) {
+ HText_appendCharacter(me->text, LY_BOLD_START_CHAR);
+ me->inBoldH = TRUE;
+ me->needBoldH = FALSE;
+ }
+ }
+}
+
+/*
+ * This function strips white characters and
+ * generally fixes up attribute values that
+ * were received from the SGML parser and
+ * are to be treated as partial or absolute
+ * URLs. - FM
+ */
+int LYLegitimizeHREF(HTStructured * me, char **href,
+ int force_slash,
+ int strip_dots)
+{
+ int url_type = 0;
+ char *p = NULL;
+ char *pound = NULL;
+ const char *Base = NULL;
+
+ if (!me || !href || isEmpty(*href))
+ return (url_type);
+
+ if (!LYTrimStartfile(*href)) {
+ /*
+ * Collapse spaces in the actual URL, but just protect against tabs or
+ * newlines in the fragment, if present. This seeks to cope with
+ * atrocities inflicted on the Web by authoring tools such as
+ * Frontpage. - FM
+ */
+
+ /* Before working on spaces check if we have any, usually none. */
+ p = LYSkipNonBlanks(*href);
+
+ if (*p) { /* p == first space character */
+ /* no reallocs below, all converted in place */
+
+ pound = findPoundSelector(*href);
+
+ if (pound != NULL && pound < p) {
+ convert_to_spaces(p, FALSE); /* done */
+
+ } else {
+ if (pound != NULL)
+ *pound = '\0'; /* mark */
+
+ /*
+ * No blanks really belong in the HREF,
+ * but if it refers to an actual file,
+ * it may actually have blanks in the name.
+ * Try to accommodate. See also HTParse().
+ */
+ if (LYRemoveNewlines(p) || StrChr(p, '\t') != 0) {
+ LYRemoveBlanks(p); /* a compromise... */
+ }
+
+ if (pound != NULL) {
+ p = StrChr(p, '\0');
+ *pound = '#'; /* restore */
+ convert_to_spaces(pound, FALSE);
+ if (p < pound) {
+ int n;
+
+ for (n = 0; (p[n] = pound[n]) != '\0'; ++n) ;
+ }
+ }
+ }
+ }
+ }
+ if (**href == '\0')
+ return (url_type);
+
+ TRANSLATE_AND_UNESCAPE_TO_STD(href);
+
+ Base = me->inBASE ?
+ me->base_href : me->node_anchor->address;
+
+ url_type = is_url(*href);
+ if (!url_type && force_slash && **href == '.' &&
+ (!strcmp(*href, ".") || !strcmp(*href, "..")) &&
+ !isFILE_URL(Base)) {
+ /*
+ * The Fielding RFC/ID for resolving partial HREFs says that a slash
+ * should be on the end of the preceding symbolic element for "." and
+ * "..", but all tested browsers only do that for an explicit "./" or
+ * "../", so we'll respect the RFC/ID only if force_slash was TRUE and
+ * it's not a file URL. - FM
+ */
+ StrAllocCat(*href, "/");
+ }
+ if ((!url_type && LYStripDotDotURLs && strip_dots && **href == '.') &&
+ !strncasecomp(Base, "http", 4)) {
+ /*
+ * We will be resolving a partial reference versus an http or https
+ * URL, and it has lead dots, which may be retained when resolving via
+ * HTParse(), but the request would fail if the first element of the
+ * resultant path is two dots, because no http or https server accepts
+ * such paths, and the current URL draft, likely to become an RFC, says
+ * that it's optional for the UA to strip them as a form of error
+ * recovery. So we will, recursively, for http/https URLs, like the
+ * "major market browsers" which made this problem so common on the
+ * Web, but we'll also issue a message about it, such that the bad
+ * partial reference might get corrected by the document provider. -
+ * FM
+ */
+ char *temp = NULL, *path = NULL, *cp;
+ const char *str = "";
+
+ temp = HTParse(*href, Base, PARSE_ALL);
+ path = HTParse(temp, "", PARSE_PATH + PARSE_PUNCTUATION);
+ if (!StrNCmp(path, "/..", 3)) {
+ cp = (path + 3);
+ if (LYIsHtmlSep(*cp) || *cp == '\0') {
+ if (Base[4] == 's') {
+ str = "s";
+ }
+ CTRACE((tfp,
+ "LYLegitimizeHREF: Bad value '%s' for http%s URL.\n",
+ *href, str));
+ CTRACE((tfp, " Stripping lead dots.\n"));
+ if (!me->inBadHREF) {
+ HTUserMsg(BAD_PARTIAL_REFERENCE);
+ me->inBadHREF = TRUE;
+ }
+ }
+ if (*cp == '\0') {
+ StrAllocCopy(*href, "/");
+ } else if (LYIsHtmlSep(*cp)) {
+ while (!StrNCmp(cp, "/..", 3)) {
+ if (*(cp + 3) == '/') {
+ cp += 3;
+ continue;
+ } else if (*(cp + 3) == '\0') {
+ *(cp + 1) = '\0';
+ *(cp + 2) = '\0';
+ }
+ break;
+ }
+ StrAllocCopy(*href, cp);
+ }
+ }
+ FREE(temp);
+ FREE(path);
+ }
+ return (url_type);
+}
+
+/*
+ * This function checks for a Content-Base header,
+ * and if not present, a Content-Location header
+ * which is an absolute URL, and sets the BASE
+ * accordingly. If set, it will be replaced by
+ * any BASE tag in the HTML stream, itself. - FM
+ */
+void LYCheckForContentBase(HTStructured * me)
+{
+ char *cp = NULL;
+ BOOL present[HTML_BASE_ATTRIBUTES];
+ const char *value[HTML_BASE_ATTRIBUTES];
+ int i;
+
+ if (!(me && me->node_anchor))
+ return;
+
+ if (me->node_anchor->content_base != NULL) {
+ /*
+ * We have a Content-Base value. Use it if it's non-zero length. - FM
+ */
+ if (*me->node_anchor->content_base == '\0')
+ return;
+ StrAllocCopy(cp, me->node_anchor->content_base);
+ LYRemoveBlanks(cp);
+ } else if (me->node_anchor->content_location != NULL) {
+ /*
+ * We didn't have a Content-Base value, but do have a Content-Location
+ * value. Use it if it's an absolute URL. - FM
+ */
+ if (*me->node_anchor->content_location == '\0')
+ return;
+ StrAllocCopy(cp, me->node_anchor->content_location);
+ LYRemoveBlanks(cp);
+ if (!is_url(cp)) {
+ FREE(cp);
+ return;
+ }
+ } else {
+ /*
+ * We had neither a Content-Base nor Content-Location value. - FM
+ */
+ return;
+ }
+
+ /*
+ * If we collapsed to a zero-length value, ignore it. - FM
+ */
+ if (*cp == '\0') {
+ FREE(cp);
+ return;
+ }
+
+ /*
+ * Pass the value to HTML_start_element as the HREF of a BASE tag. - FM
+ */
+ for (i = 0; i < HTML_BASE_ATTRIBUTES; i++)
+ present[i] = NO;
+ present[HTML_BASE_HREF] = YES;
+ value[HTML_BASE_HREF] = (const char *) cp;
+ (*me->isa->start_element) (me, HTML_BASE, present, value,
+ 0, 0);
+ FREE(cp);
+}
+
+/*
+ * This function creates NAMEd Anchors if a non-zero-length NAME
+ * or ID attribute was present in the tag. - FM
+ */
+void LYCheckForID(HTStructured * me, const BOOL *present,
+ STRING2PTR value,
+ int attribute)
+{
+ HTChildAnchor *ID_A = NULL;
+ char *temp = NULL;
+
+ if (!(me && me->text))
+ return;
+
+ if (present && present[attribute]
+ && non_empty(value[attribute])) {
+ /*
+ * Translate any named or numeric character references. - FM
+ */
+ StrAllocCopy(temp, value[attribute]);
+ LYUCTranslateHTMLString(&temp, me->tag_charset, me->tag_charset,
+ NO, NO, YES, st_URL);
+
+ /*
+ * Create the link if we still have a non-zero-length string. - FM
+ */
+ if ((temp[0] != '\0') &&
+ (ID_A = HTAnchor_findChildAndLink
+ (
+ me->node_anchor, /* Parent */
+ temp, /* Tag */
+ NULL, /* Address */
+ (HTLinkType *) 0))) { /* Type */
+ HText_beginAnchor(me->text, me->inUnderline, ID_A);
+ HText_endAnchor(me->text, 0);
+ }
+ FREE(temp);
+ }
+}
+
+/*
+ * This function creates a NAMEd Anchor for the ID string
+ * passed to it directly as an argument. It assumes the
+ * does not need checking for character references. - FM
+ */
+void LYHandleID(HTStructured * me, const char *id)
+{
+ HTChildAnchor *ID_A = NULL;
+
+ if (!(me && me->text) ||
+ isEmpty(id))
+ return;
+
+ /*
+ * Create the link if we still have a non-zero-length string. - FM
+ */
+ if ((ID_A = HTAnchor_findChildAndLink
+ (
+ me->node_anchor, /* Parent */
+ id, /* Tag */
+ NULL, /* Address */
+ (HTLinkType *) 0)) != NULL) { /* Type */
+ HText_beginAnchor(me->text, me->inUnderline, ID_A);
+ HText_endAnchor(me->text, 0);
+ }
+}
+
+/*
+ * This function checks whether we want to override
+ * the current default alignment for paragraphs and
+ * instead use that specified in the element's style
+ * sheet. - FM
+ */
+BOOLEAN LYoverride_default_alignment(HTStructured * me)
+{
+ if (!me)
+ return NO;
+
+ switch (me->sp[0].tag_number) {
+ case HTML_BLOCKQUOTE:
+ case HTML_BQ:
+ case HTML_NOTE:
+ case HTML_FN:
+ case HTML_ADDRESS:
+ me->sp->style->alignment = HT_LEFT;
+ return YES;
+
+ default:
+ break;
+ }
+ return NO;
+}
+
+/*
+ * This function inserts newlines if needed to create double spacing,
+ * and sets the left margin for subsequent text to the second line
+ * indentation of the current style. - FM
+ */
+void LYEnsureDoubleSpace(HTStructured * me)
+{
+ if (!me || !me->text)
+ return;
+
+ if (!HText_LastLineEmpty(me->text, FALSE)) {
+ HText_setLastChar(me->text, ' '); /* absorb white space */
+ HText_appendCharacter(me->text, '\r');
+ HText_appendCharacter(me->text, '\r');
+ } else if (!HText_PreviousLineEmpty(me->text, FALSE)) {
+ HText_setLastChar(me->text, ' '); /* absorb white space */
+ HText_appendCharacter(me->text, '\r');
+ } else if (me->List_Nesting_Level >= 0) {
+ HText_NegateLineOne(me->text);
+ }
+ me->in_word = NO;
+ return;
+}
+
+/*
+ * This function inserts a newline if needed to create single spacing,
+ * and sets the left margin for subsequent text to the second line
+ * indentation of the current style. - FM
+ */
+void LYEnsureSingleSpace(HTStructured * me)
+{
+ if (!me || !me->text)
+ return;
+
+ if (!HText_LastLineEmpty(me->text, FALSE)) {
+ HText_setLastChar(me->text, ' '); /* absorb white space */
+ HText_appendCharacter(me->text, '\r');
+ } else if (me->List_Nesting_Level >= 0) {
+ HText_NegateLineOne(me->text);
+ }
+ me->in_word = NO;
+ return;
+}
+
+/*
+ * This function resets paragraph alignments for block
+ * elements which do not have a defined style sheet. - FM
+ */
+void LYResetParagraphAlignment(HTStructured * me)
+{
+ if (!me)
+ return;
+
+ if (me->List_Nesting_Level >= 0 ||
+ ((me->Division_Level < 0) &&
+ (me->sp->style->id == ST_Normal ||
+ me->sp->style->id == ST_Preformatted))) {
+ me->sp->style->alignment = HT_LEFT;
+ } else {
+ me->sp->style->alignment = (short) me->current_default_alignment;
+ }
+ return;
+}
+
+/*
+ * This example function checks whether the given anchor has
+ * an address with a file scheme, and if so, loads it into the
+ * the SGML parser's context->url element, which was passed as
+ * the second argument. The handle_comment() calling function in
+ * SGML.c then calls LYDoCSI() in LYUtils.c to insert HTML markup
+ * into the corresponding stream, homologously to an SSI by an
+ * HTTP server. - FM
+ *
+ * For functions similar to this but which depend on details of
+ * the HTML handler's internal data, the calling interface should
+ * be changed, and functions in SGML.c would have to make sure not
+ * to call such functions inappropriately (e.g., calling a function
+ * specific to the Lynx_HTML_Handler when SGML.c output goes to
+ * some other HTStructured object like in HTMLGen.c), or the new
+ * functions could be added to the SGML.h interface.
+ */
+BOOLEAN LYCheckForCSI(HTParentAnchor *anchor,
+ char **url)
+{
+ if (!(anchor && anchor->address))
+ return FALSE;
+
+ if (!isFILE_URL(anchor->address))
+ return FALSE;
+
+ if (!LYisLocalHost(anchor->address))
+ return FALSE;
+
+ StrAllocCopy(*url, anchor->address);
+ return TRUE;
+}
+
+/*
+ * This function is called from the SGML parser to look at comments
+ * and see whether we should collect some info from them. Currently
+ * it only looks for comments with Message-Id and Subject info, in the
+ * exact form generated by MHonArc for archived mailing list. If found,
+ * the info is stored in the document's HTParentAnchor. It can later be
+ * used for generating a mail response.
+ *
+ * We are extra picky here because there isn't any official definition
+ * for these kinds of comments - we might (and still can) misinterpret
+ * arbitrary comments as something they aren't.
+ *
+ * If something doesn't look right, for example invalid characters, the
+ * strings are not stored. Mail responses will use something else as
+ * the subject, probably the document URL, and will not have an
+ * In-Reply-To header.
+ *
+ * All this is a hack - to do this the right way, mailing list archivers
+ * would have to agree on some better mechanism to make this kind of info
+ * from original mail headers available, for example using LINK. - kw
+ */
+BOOLEAN LYCommentHacks(HTParentAnchor *anchor,
+ const char *comment)
+{
+ const char *cp;
+ size_t len;
+
+ if (comment == NULL)
+ return FALSE;
+
+ if (!(anchor && anchor->address))
+ return FALSE;
+
+ if (StrNCmp(comment, "!--X-Message-Id: ", 17) == 0) {
+ char *messageid = NULL;
+ char *p;
+
+ for (cp = comment + 17; *cp; cp++) {
+ if (UCH(*cp) >= 127 || !isgraph(UCH(*cp))) {
+ break;
+ }
+ }
+ if (strcmp(cp, " --")) {
+ return FALSE;
+ }
+ cp = comment + 17;
+ StrAllocCopy(messageid, cp);
+ /* This should be ok - message-id should only contain 7-bit ASCII */
+ if (!LYUCTranslateHTMLString(&messageid, 0, 0, NO, NO, YES, st_URL))
+ return FALSE;
+ for (p = messageid; *p; p++) {
+ if (UCH(*p) >= 127 || !isgraph(UCH(*p))) {
+ break;
+ }
+ }
+ if (strcmp(p, " --")) {
+ FREE(messageid);
+ return FALSE;
+ }
+ if ((p = StrChr(messageid, '@')) == NULL || p[1] == '\0') {
+ FREE(messageid);
+ return FALSE;
+ }
+ p = messageid;
+ if ((len = strlen(p)) >= 8 && !strcmp(&p[len - 3], " --")) {
+ p[len - 3] = '\0';
+ } else {
+ FREE(messageid);
+ return FALSE;
+ }
+ if (HTAnchor_setMessageID(anchor, messageid)) {
+ FREE(messageid);
+ return TRUE;
+ } else {
+ FREE(messageid);
+ return FALSE;
+ }
+ }
+ if (StrNCmp(comment, "!--X-Subject: ", 14) == 0) {
+ char *subject = NULL;
+ char *p;
+
+ for (cp = comment + 14; *cp; cp++) {
+ if (UCH(*cp) >= 127 || !isprint(UCH(*cp))) {
+ return FALSE;
+ }
+ }
+ cp = comment + 14;
+ StrAllocCopy(subject, cp);
+ /* @@@
+ * This may not be the right thing for the subject - but mail
+ * subjects shouldn't contain 8-bit characters in raw form anyway.
+ * We have to unescape character entities, since that's what MHonArc
+ * seems to generate. But if after that there are 8-bit characters
+ * the string is rejected. We would probably not know correctly
+ * what charset to assume anyway - the mail sender's can differ from
+ * the archive's. And the code for sending mail cannot deal well
+ * with 8-bit characters - we should not put them in the Subject
+ * header in raw form, but don't have MIME encoding implemented.
+ * Someone may want to do more about this... - kw
+ */
+ if (!LYUCTranslateHTMLString(&subject, 0, 0, NO, YES, NO, st_HTML))
+ return FALSE;
+ for (p = subject; *p; p++) {
+ if (UCH(*p) >= 127 || !isprint(UCH(*p))) {
+ FREE(subject);
+ return FALSE;
+ }
+ }
+ p = subject;
+ if ((len = strlen(p)) >= 4 && !strcmp(&p[len - 3], " --")) {
+ p[len - 3] = '\0';
+ } else {
+ FREE(subject);
+ return FALSE;
+ }
+ if (HTAnchor_setSubject(anchor, subject)) {
+ FREE(subject);
+ return TRUE;
+ } else {
+ FREE(subject);
+ return FALSE;
+ }
+ }
+
+ return FALSE;
+}
+
+ /*
+ * Create the Title with any left-angle-brackets converted to &lt; entities
+ * and any ampersands converted to &amp; entities. - FM
+ *
+ * Convert 8-bit letters to &#xUUUU to avoid dependencies from display
+ * character set which may need changing. Do NOT convert any 8-bit chars
+ * if we have CJK display. - LP
+ */
+void LYformTitle(char **dst,
+ const char *src)
+{
+ if (HTCJK == JAPANESE) {
+ char *tmp_buffer = NULL;
+
+ if ((tmp_buffer = (char *) malloc(strlen(src) + 1)) == 0)
+ outofmem(__FILE__, "LYformTitle");
+
+ switch (kanji_code) { /* 1997/11/22 (Sat) 09:28:00 */
+ case EUC:
+ TO_EUC((const unsigned char *) src, (unsigned char *) tmp_buffer);
+ break;
+ case SJIS:
+ TO_SJIS((const unsigned char *) src, (unsigned char *) tmp_buffer);
+ break;
+ default:
+ CTRACE((tfp, "\nLYformTitle: kanji_code is an unexpected value."));
+ strcpy(tmp_buffer, src);
+ break;
+ }
+ StrAllocCopy(*dst, tmp_buffer);
+ FREE(tmp_buffer);
+ } else {
+ StrAllocCopy(*dst, src);
+ }
+}
diff --git a/src/LYCharUtils.h b/src/LYCharUtils.h
new file mode 100644
index 0000000..2b9ca88
--- /dev/null
+++ b/src/LYCharUtils.h
@@ -0,0 +1,109 @@
+/*
+ * $LynxId: LYCharUtils.h,v 1.28 2012/02/10 18:36:39 tom Exp $
+ */
+#ifndef LYCHARUTILS_H
+#define LYCHARUTILS_H
+
+#ifndef HTUTILS_H
+#include <HTUtils.h>
+#endif /* HTUTILS_H */
+
+#ifndef HTSTREAM_H
+#include <HTStream.h>
+#endif /* HTSTREAM_H */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define CHECK_ID(code) LYCheckForID(me, present, value, (int)code)
+ typedef enum {
+ st_HTML = 0, /* attributes and content found in HTML, probably meant for display */
+ st_URL, /* URLs, fragments, NAME and ID */
+ st_other
+ } CharUtil_st;
+
+ extern char **LYUCFullyTranslateString(char **str,
+ int cs_from,
+ int cs_to,
+ int do_ent,
+ int use_lynx_specials,
+ int plain_space,
+ int hidden,
+ int Back,
+ CharUtil_st stype);
+ extern BOOL LYUCTranslateHTMLString(char **str,
+ int cs_from,
+ int cs_to,
+ int use_lynx_specials,
+ int plain_space,
+ int hidden,
+ CharUtil_st stype);
+ extern BOOL LYUCTranslateBackFormData(char **str,
+ int cs_from,
+ int cs_to,
+ int plain_space);
+ extern void LYEntify(char **str,
+ int isTITLE);
+ extern const char *LYEntifyTitle(char **target, const char *source);
+ extern const char *LYEntifyValue(char **target, const char *source);
+ extern void LYTrimHead(char *str);
+ extern void LYTrimTail(char *str);
+ extern char *LYFindEndOfComment(char *str);
+ extern void LYFillLocalFileURL(char **href,
+ const char *base);
+ extern void LYAddMETAcharsetToFD(FILE *fd,
+ int disp_chndl);
+ extern void LYAddMETAcharsetToStream(HTStream *target,
+ int disp_chndl);
+ extern void LYformTitle(char **dst,
+ const char *src);
+ extern char *LYParseTagParam(char *from,
+ const char *name);
+ extern void LYParseRefreshURL(char *content,
+ char **p_seconds,
+ char **p_address);
+
+#ifdef Lynx_HTML_Handler
+ extern int OL_CONTINUE; /* flag for whether CONTINUE is set */
+ extern int OL_VOID; /* flag for whether a count is set */
+ extern void LYZero_OL_Counter(HTStructured * me);
+ extern char *LYUppercaseA_OL_String(int seqnum);
+ extern char *LYLowercaseA_OL_String(int seqnum);
+ extern char *LYUppercaseI_OL_String(int seqnum);
+ extern char *LYLowercaseI_OL_String(int seqnum);
+ extern void LYGetChartransInfo(HTStructured * me);
+ extern void LYHandleMETA(HTStructured * me, const BOOL *present,
+ STRING2PTR value,
+ char **include);
+ extern void LYHandlePlike(HTStructured * me, const BOOL *present,
+ STRING2PTR value,
+ char **include,
+ int align_idx,
+ int start);
+ extern void LYHandleSELECT(HTStructured * me, const BOOL *present,
+ STRING2PTR value,
+ char **include,
+ int start);
+ extern int LYLegitimizeHREF(HTStructured * me, char **href,
+ int force_slash,
+ int strip_dots);
+ extern void LYCheckForContentBase(HTStructured * me);
+ extern void LYCheckForID(HTStructured * me, const BOOL *present,
+ STRING2PTR value,
+ int attribute);
+ extern void LYHandleID(HTStructured * me, const char *id);
+ extern BOOLEAN LYoverride_default_alignment(HTStructured * me);
+ extern void LYEnsureDoubleSpace(HTStructured * me);
+ extern void LYEnsureSingleSpace(HTStructured * me);
+ extern void LYResetParagraphAlignment(HTStructured * me);
+ extern BOOLEAN LYCheckForCSI(HTParentAnchor *anchor,
+ char **url);
+
+#endif /* Lynx_HTML_Handler */
+
+#define LYUCTranslateBackHeaderText LYUCTranslateBackFormData
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* LYCHARUTILS_H */
diff --git a/src/LYCharVals.h b/src/LYCharVals.h
new file mode 100644
index 0000000..43fac15
--- /dev/null
+++ b/src/LYCharVals.h
@@ -0,0 +1,34 @@
+#ifndef LYCHARVALS_H
+#define LYCHARVALS_H 1
+
+#ifndef HTUTILS_H
+#include <HTUtils.h>
+#endif
+
+/*
+ * Use integer values for character constants rather than '\octal' form, since
+ * not all compilers agree that those will fit in a character, even when cast.
+ */
+#ifndef CH_ESC
+#ifdef EBCDIC
+#define CH_DEL 0x07
+#define CH_ESC 0x27
+#define CH_ESC_PAR 0x27
+#define CH_HICTL 0x3f
+#define CH_NBSP 0x41
+#define CH_SHY 0xca
+#define LYCharINTERRUPT1 0x03 /* Control-C */
+#define LYCharINTERRUPT2 0x2f /* Control-G */
+#else /* EBCDIC */
+#define CH_ESC 0033
+#define CH_DEL 0177
+#define CH_ESC_PAR 0233
+#define CH_HICTL 0237
+#define CH_NBSP 0240
+#define CH_SHY 0255
+#define LYCharINTERRUPT1 0003 /* Control-C */
+#define LYCharINTERRUPT2 0007 /* Control-G */
+#endif /* EBCDIC */
+#endif /* CH_ESC */
+
+#endif /* LYCHARVALS_H */
diff --git a/src/LYClean.c b/src/LYClean.c
new file mode 100644
index 0000000..3679d87
--- /dev/null
+++ b/src/LYClean.c
@@ -0,0 +1,203 @@
+/* $LynxId: LYClean.c,v 1.40 2013/10/10 23:47:25 tom Exp $ */
+#include <HTUtils.h>
+#include <LYCurses.h>
+#include <LYUtils.h>
+#include <LYSignal.h>
+#include <LYClean.h>
+#include <LYMainLoop.h>
+#include <LYGlobalDefs.h>
+#include <LYTraversal.h>
+#include <LYHistory.h>
+#include <LYCookie.h>
+#include <LYSession.h>
+#include <UCAuto.h>
+#include <HTAlert.h>
+
+#include <LYexit.h>
+#include <LYLeaks.h>
+
+#ifdef DJGPP
+extern void sig_handler_watt(int);
+#endif /* DJGPP */
+
+#ifdef VMS
+BOOLEAN HadVMSInterrupt = FALSE;
+#endif /* VMS */
+
+/*
+ * Interrupt handler. Stop curses and exit gracefully.
+ */
+void cleanup_sig(int sig)
+{
+#ifdef IGNORE_CTRL_C
+ if (sig == SIGINT) {
+ /*
+ * Need to rearm the signal.
+ */
+#ifdef DJGPP
+ if (wathndlcbrk) {
+ sig_handler_watt(sig); /* Use WATT-32 signal handler */
+ }
+#endif /* DJGPP */
+ signal(SIGINT, cleanup_sig);
+ sigint = TRUE;
+#ifdef DJGPP
+ _eth_release();
+ _eth_init();
+#endif /* DJGPP */
+ return;
+ }
+#endif /* IGNORE_CTRL_C */
+
+#ifdef VMS
+ if (!dump_output_immediately) {
+
+ /*
+ * Reassert the AST.
+ */
+ (void) signal(SIGINT, cleanup_sig);
+ if (LYCursesON) {
+ lynx_force_repaint(); /* wipe away the "cancel" message */
+ LYrefresh();
+
+ /*
+ * Ask if exit is intended.
+ */
+ if (LYQuitDefaultYes == TRUE) {
+ int Dft = ((LYQuitDefaultYes == TRUE) ? YES : NO);
+ int c = HTConfirmDefault(REALLY_EXIT, Dft);
+
+ HadVMSInterrupt = TRUE;
+ if (c != Dft) {
+ return;
+ }
+ }
+ } else {
+ return;
+ }
+ }
+#endif /* VMS */
+
+ /*
+ * Ignore signals from terminal.
+ */
+#ifndef NOSIGHUP
+ (void) signal(SIGHUP, SIG_IGN);
+#endif /* NOSIGHUP */
+
+#ifdef VMS
+ /*
+ * Use ttclose() from cleanup() for VMS if not dumping.
+ */
+ if (dump_output_immediately)
+ (void) signal(SIGTERM, SIG_IGN);
+#else /* Unix: */
+ (void) signal(SIGINT, SIG_IGN);
+ (void) signal(SIGTERM, SIG_IGN);
+#endif /* VMS */
+
+ if (traversal)
+ dump_traversal_history();
+
+#ifndef NOSIGHUP
+ if (sig != SIGHUP) {
+#endif /* NOSIGHUP */
+
+ if (!dump_output_immediately) {
+ /*
+ * cleanup() also calls cleanup_files().
+ */
+ cleanup();
+ }
+ if (sig != 0) {
+ SetOutputMode(O_TEXT);
+ printf("\n\n%s %d\n\n",
+ gettext("Exiting via interrupt:"),
+ sig);
+ fflush(stdout);
+ }
+#ifndef NOSIGHUP
+ } else {
+#ifdef USE_SESSIONS
+ /*
+ * It is useful to save the session if a user closed lynx in a
+ * nonstandard way, such as closing xterm window or in even a crash.
+ */
+ SaveSession();
+#endif /* USE_SESSIONS */
+ cleanup_files();
+ }
+#endif /* NOSIGHUP */
+ if (sig != 0) {
+ exit_immediately(EXIT_SUCCESS);
+ } else {
+ reset_signals();
+ }
+}
+
+/*
+ * Called by interrupt handler or at quit-time, this erases the temporary files
+ * that lynx created.
+ */
+void cleanup_files(void)
+{
+ LYCleanupTemp();
+ FREE(lynx_temp_space);
+}
+
+void cleanup(void)
+{
+ /*
+ * Ignore signals from terminal.
+ */
+#ifndef NOSIGHUP
+ (void) signal(SIGHUP, SIG_IGN);
+#endif /* NOSIGHUP */
+#ifndef VMS /* use ttclose() from cleanup() for VMS */
+ (void) signal(SIGINT, SIG_IGN);
+#endif /* !VMS */
+ (void) signal(SIGTERM, SIG_IGN);
+
+ if (LYCursesON) {
+ LYParkCursor();
+ lynx_stop_all_colors();
+ LYrefresh();
+
+ stop_curses();
+ }
+#ifdef EXP_CHARTRANS_AUTOSWITCH
+ /*
+ * Currently implemented only for LINUX: Restore original font.
+ */ UCChangeTerminalCodepage(-1, (LYUCcharset *) 0);
+#endif /* EXP_CHARTRANS_AUTOSWITCH */
+
+#ifdef USE_PERSISTENT_COOKIES
+ /*
+ * This can go right here for now. We need to work up a better place
+ * to save cookies for the next release, preferably whenever a new
+ * persistent cookie is received or used. Some sort of protocol to
+ * handle two processes writing to the cookie file needs to be worked
+ * out as well.
+ */
+ if (persistent_cookies)
+ LYStoreCookies(LYCookieSaveFile);
+#endif
+#ifdef USE_SESSIONS
+ SaveSession();
+#endif /* USE_SESSIONS */
+
+ cleanup_files();
+#ifdef VMS
+ ttclose();
+ DidCleanup = TRUE;
+#endif /* VMS */
+
+ /*
+ * If we're looking at memory leaks, hang onto the trace file, since there
+ * is no memory freed in this function, and it is a nuisance to not be able
+ * to trace the cleanup activity -TD
+ */
+#ifndef LY_FIND_LEAKS
+ LYCloseTracelog();
+#endif
+}
diff --git a/src/LYClean.h b/src/LYClean.h
new file mode 100644
index 0000000..d7f54be
--- /dev/null
+++ b/src/LYClean.h
@@ -0,0 +1,25 @@
+#ifndef LYCLEAN_H
+#define LYCLEAN_H
+
+#ifndef HTUTILS_H
+#include <HTUtils.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#ifdef VMS
+ extern BOOLEAN DidCleanup;
+ extern BOOLEAN HadVMSInterrupt;
+#endif
+
+ extern void cleanup_sig(int sig);
+ extern void cleanup(void);
+ extern void cleanup_files(void);
+ extern void set_alarm(int sig);
+ extern void reset_alarm(void);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* LYCLEAN_H */
diff --git a/src/LYCookie.c b/src/LYCookie.c
new file mode 100644
index 0000000..6755829
--- /dev/null
+++ b/src/LYCookie.c
@@ -0,0 +1,2898 @@
+/*
+ * $LynxId: LYCookie.c,v 1.147 2019/01/26 00:50:13 tom Exp $
+ *
+ * Lynx Cookie Support LYCookie.c
+ * ===================
+ *
+ * Author: AMK A.M. Kuchling (amk@magnet.com) 12/25/96
+ *
+ * Incorporated with mods by FM 01/16/97
+ *
+ * Based on:
+ * http://www.ics.uci.edu/pub/ietf/http/draft-ietf-http-state-mgmt-05.txt
+ *
+ * Updated for:
+ * http://www.ics.uci.edu/pub/ietf/http/draft-ietf-http-state-man-mec-02.txt
+ * - FM 1997-07-09
+ *
+ * Updated for:
+ * ftp://ds.internic.net/internet-drafts/draft-ietf-http-state-man-mec-03.txt
+ * - FM 1997-08-02
+ *
+ * Partially checked against:
+ * http://www.ietf.org/internet-drafts/draft-ietf-http-state-man-mec-10.txt
+ * - kw 1998-12-11
+ *
+ * Modified to follow RFC-6265 regarding leading dot of Domain, and
+ * matching of hostname vs domain (2011/06/10 -TD)
+ *
+ * Modified to address differences between RFC-6262 versus RFC-2109 and
+ * RFC-2965 by making the older behavior optional (2019/01/25 -TD)
+ *
+ * FM's TO DO: (roughly in order of decreasing priority)
+ * Persistent cookies are still experimental. Presently cookies
+ lose many pieces of information that distinguish
+ version 1 from version 0 cookies. There is no easy way around
+ that with the current cookie file format. Ports are currently
+ not stored persistently at all which is clearly wrong.
+ * We currently don't do anything special for unverifiable
+ transactions to third-party hosts.
+ * We currently don't use effective host names or check for
+ Domain=.local.
+ * Hex escaping isn't considered at all. Any semi-colons, commas,
+ or spaces actually in cookie names or values (i.e., not serving
+ as punctuation for the overall Set-Cookie value) should be hex
+ escaped if not quoted, but presumably the server is expecting
+ them to be hex escaped in our Cookie request header as well, so
+ in theory we need not unescape them. We'll see how this works
+ out in practice.
+ * The prompt should show more information about the cookie being
+ set in Novice mode.
+ * The truncation heuristic in HTConfirmCookie should probably be
+ smarter, smart enough to leave a really short name/value string
+ alone.
+ * We protect against denial-of-service attacks (see section 6.3.1 of the
+ draft) by limiting the number of cookies from a domain, limiting the
+ total number of cookies, and limiting the number of bytes from a
+ processed cookie, but we count on the normal garbage collections to
+ bring us back down under the limits, rather than actively removing
+ cookies and/or domains based on age or frequency of use.
+ * If a cookie has the secure flag set, we presently treat only SSL
+ connections as secure. This may need to be expanded for other
+ secure communication protocols that become standardized.
+*/
+
+#include <HTUtils.h>
+#include <HTAccess.h>
+#include <HTParse.h>
+#include <HTAlert.h>
+#include <LYCurses.h>
+#include <LYUtils.h>
+#include <LYCharUtils.h>
+#include <LYClean.h>
+#include <LYGlobalDefs.h>
+#include <LYEdit.h>
+#include <LYStrings.h>
+#include <GridText.h>
+#include <LYCookie.h>
+
+#include <LYLeaks.h>
+
+/* default for new domains, one of the invcheck_behaviour_t values: */
+#define DEFAULT_INVCHECK_BV INVCHECK_QUERY
+
+#define CTrace(p) CTRACE2(TRACE_COOKIES, p)
+
+#define LeadingDot(s) ((s)[0] == '.')
+#define SkipLeadingDot(s) (LeadingDot(s) ? ((s) + 1) : (s))
+
+#define AssumeCookieVersion(p) \
+ if (USE_RFC_2965 && (p)->version < 1) { \
+ (p)->version = 1; \
+ }
+
+/*
+ * The first level of the cookie list is a list indexed by the domain
+ * string; cookies with the same domain will be placed in the same
+ * list. Thus, finding the cookies that apply to a given URL is a
+ * two-level scan; first we check each domain to see if it applies,
+ * and if so, then we check the paths of all the cookies on that
+ * list. We keep a running total of cookies as we add or delete
+ * them
+ */
+static HTList *domain_list = NULL;
+static HTList *cookie_list = NULL;
+static int total_cookies = 0;
+
+struct _cookie {
+ char *lynxID; /* Lynx cookie identifier */
+ char *name; /* Name of this cookie */
+ char *value; /* Value of this cookie */
+ int version; /* Cookie protocol version (=1) */
+ char *comment; /* Comment to show to user */
+ char *commentURL; /* URL for comment to show to user */
+ char *domain; /* Domain for which this cookie is valid */
+ char *ddomain; /* Domain without leading "." */
+ int port; /* Server port from which this cookie was given (usu. 80) */
+ char *PortList; /* List of ports for which cookie can be sent */
+ char *path; /* Path prefix for which this cookie is valid */
+ int pathlen; /* Length of the path */
+ int flags; /* Various flags */
+ time_t expires; /* The time when this cookie expires */
+ BOOL quoted; /* Was a value quoted in the Set-Cookie header? */
+};
+typedef struct _cookie cookie;
+
+#define COOKIE_FLAG_SECURE 1 /* If set, cookie requires secure links */
+#define COOKIE_FLAG_DISCARD 2 /* If set, expire at end of session */
+#define COOKIE_FLAG_EXPIRES_SET 4 /* If set, an expiry date was set */
+#define COOKIE_FLAG_DOMAIN_SET 8 /* If set, an non-default domain was set */
+#define COOKIE_FLAG_PATH_SET 16 /* If set, an non-default path was set */
+#define COOKIE_FLAG_FROM_FILE 32 /* If set, this cookie was persistent */
+
+static void MemAllocCopy(char **dest,
+ const char *start,
+ const char *end)
+{
+ char *temp;
+
+ if (!(start && end) || (end <= start)) {
+ HTSACopy(dest, "");
+ return;
+ }
+
+ temp = typecallocn(char, (unsigned)(end - start) + 1);
+ if (temp == NULL)
+ outofmem(__FILE__, "MemAllocCopy");
+ LYStrNCpy(temp, start, (end - start));
+ HTSACopy(dest, temp);
+ FREE(temp);
+}
+
+static cookie *newCookie(void)
+{
+ cookie *p = typecalloc(cookie);
+
+ if (p == NULL)
+ outofmem(__FILE__, "newCookie");
+
+ HTSprintf0(&(p->lynxID), "%p", (void *) p);
+ p->port = 80;
+ return p;
+}
+
+static void freeCookie(cookie * co)
+{
+ if (co) {
+ FREE(co->lynxID);
+ FREE(co->name);
+ FREE(co->value);
+ FREE(co->comment);
+ FREE(co->commentURL);
+ FREE(co->domain);
+ FREE(co->ddomain);
+ FREE(co->path);
+ FREE(co->PortList);
+ FREE(co);
+ }
+}
+
+static void freeCookies(domain_entry * de)
+{
+ FREE(de->domain);
+ FREE(de->ddomain);
+ HTList_delete(de->cookie_list);
+ de->cookie_list = NULL;
+}
+
+#ifdef LY_FIND_LEAKS
+static void LYCookieJar_free(void)
+{
+ HTList *dl = domain_list;
+ domain_entry *de = NULL;
+ HTList *cl = NULL, *next = NULL;
+ cookie *co = NULL;
+
+ CTrace((tfp, "LYCookieJar_free\n"));
+ while (dl) {
+ if ((de = dl->object) != NULL) {
+ CTrace((tfp, "...LYCookieJar_free domain %s\n", NonNull(de->ddomain)));
+ cl = de->cookie_list;
+ while (cl) {
+ next = cl->next;
+ co = cl->object;
+ if (co) {
+ HTList_removeObject(de->cookie_list, co);
+ freeCookie(co);
+ }
+ cl = next;
+ }
+ freeCookies(de);
+ FREE(dl->object);
+ }
+ dl = dl->next;
+ }
+ cookie_list = NULL;
+ HTList_delete(domain_list);
+ domain_list = NULL;
+}
+#endif /* LY_FIND_LEAKS */
+
+/*
+ * RFC 2109 -
+ * 4.2.2 Set-Cookie Syntax
+ * An explicitly specified domain must always start with a dot.
+ * 4.3.2 Rejecting Cookies
+ * ...rejects a cookie (shall not store its information) if any of the
+ * following is true:
+ * ...
+ * The value for the Domain attribute contains no embedded dots or does not
+ * start with a dot.
+ *
+ * RFC 2965 -
+ * 3.2.2 Set-Cookie2 Syntax
+ * Domain=value
+ * OPTIONAL. The value of the Domain attribute specifies the domain
+ * for which the cookie is valid. If an explicitly specified value
+ * does not start with a dot, the user agent supplies a leading dot.
+ */
+static BOOLEAN has_embedded_dot(const char *value)
+{
+ BOOLEAN leading = NO;
+ BOOLEAN embedded = NO;
+ const char *p;
+
+ for (p = value; *p != '\0'; ++p) {
+ if (*p == '.') {
+ if (p == value) {
+ leading = YES;
+ } else if (p[1] != '\0') {
+ embedded = YES;
+ } else {
+ embedded = NO;
+ }
+ }
+ }
+ return (leading || USE_RFC_2965) && embedded;
+}
+
+/*
+ * RFC 6265 -
+ * 4.1.2.3. The Domain Attribute
+ * (Note that a leading %x2E ("."), if present, is ignored even though that
+ * character is not permitted, but a trailing %x2E ("."), if present, will
+ * cause the user agent to ignore the attribute.)
+ */
+static BOOLEAN has_trailing_dot(const char *value)
+{
+ BOOLEAN result = NO;
+ const char *p;
+
+ for (p = value; *p != '\0'; ++p) {
+ if (*p == '.') {
+ if (p[1] == '\0') {
+ result = YES;
+ break;
+ }
+ }
+ }
+ return result;
+}
+
+/*
+ * Compare a string against a domain as specified in RFC-6265 Section 5.1.3
+ */
+static BOOLEAN domain_matches(const char *value,
+ const char *domain)
+{
+ BOOLEAN result = NO;
+
+ if (isEmpty(value)) {
+ CTrace((tfp, "BUG: comparing empty value in domain_matches\n"));
+ } else if (isEmpty(domain)) {
+ CTrace((tfp, "BUG: comparing empty domain in domain_matches\n"));
+ } else {
+ if (!strcasecomp(value, domain)) {
+ result = YES;
+ } else {
+ int value_len = (int) strlen(value);
+ int suffix_len = (int) strlen(domain);
+ int offset = value_len - suffix_len;
+
+ if (offset > 1
+ && value[offset - 1] == '.'
+ && !strcasecomp(value + offset, domain)) {
+ result = YES;
+ }
+ }
+ }
+ return result;
+}
+
+/*
+ * Compare the current port with a port list as specified in Section 4.3 of:
+ * http://www.ics.uci.edu/pub/ietf/http/draft-ietf-http-state-man-mec-02.txt
+ * - FM
+ */
+static BOOLEAN port_matches(int port,
+ const char *list)
+{
+ const char *number = list;
+
+ if (!(number && isdigit(UCH(*number))))
+ return (FALSE);
+
+ while (*number != '\0') {
+ if (atoi(number) == port) {
+ return (TRUE);
+ }
+ while (isdigit(UCH(*number))) {
+ number++;
+ }
+ while (*number != '\0' && !isdigit(UCH(*number))) {
+ number++;
+ }
+ }
+
+ return (FALSE);
+}
+
+/*
+ * Returns the length of the given path ignoring trailing slashes.
+ */
+static int ignore_trailing_slash(const char *a)
+{
+ int len = (int) strlen(a);
+
+ while (len > 1 && a[len - 1] == '/')
+ --len;
+ return len;
+}
+
+/*
+ * Check if the path 'a' is a prefix of path 'b', ignoring trailing slashes
+ * in either, since they denote an empty component.
+ */
+static BOOL is_prefix(const char *a, const char *b)
+{
+ int len_a = ignore_trailing_slash(a);
+ int len_b = ignore_trailing_slash(b);
+
+ if (len_a > len_b) {
+ return FALSE;
+ } else {
+ if (StrNCmp(a, b, (unsigned) len_a) != 0) {
+ return FALSE;
+ }
+ if (len_a < len_b && (len_a > 1 || a[0] != '/')) {
+ if (b[len_a] != '\0'
+ && b[len_a] != '/') {
+ return FALSE;
+ }
+ }
+ }
+ return TRUE;
+}
+
+/*
+ * Find the domain-entry for the given name.
+ */
+static domain_entry *find_domain_entry(const char *name)
+{
+ HTList *hl;
+ domain_entry *de = NULL;
+ const char *find;
+
+ if (name != 0
+ && *(find = SkipLeadingDot(name)) != '\0') {
+ for (hl = domain_list; hl != NULL; hl = hl->next) {
+ de = (domain_entry *) hl->object;
+ if (de != NULL && de->domain != NULL && de->ddomain != NULL) {
+ CTrace((tfp,
+ "...test_domain_entry(%s) ->(%s) bv:%u, invcheck_bv:%u\n",
+ find,
+ NonNull(de->ddomain),
+ de->bv,
+ de->invcheck_bv));
+ if (!strcasecomp(find, de->ddomain)) {
+ break;
+ }
+ }
+ de = NULL;
+ }
+ }
+ CTrace((tfp, "find_domain_entry(%s) bv:%d, invcheck_bv:%d\n",
+ name,
+ de ? (int) de->bv : -1,
+ de ? (int) de->invcheck_bv : -1));
+ return de;
+}
+
+static void SetCookieDomain(cookie * co, const char *domain)
+{
+ StrAllocCopy(co->ddomain, SkipLeadingDot(domain));
+ CTrace((tfp, "SetCookieDomain(%s)\n", co->ddomain));
+}
+
+/*
+ * Store a cookie somewhere in the domain list. - AK & FM
+ */
+static void store_cookie(cookie * co, const char *hostname,
+ const char *path)
+{
+ HTList *hl, *next;
+ cookie *c2;
+ time_t now = time(NULL);
+ int pos;
+ const char *ptr;
+ domain_entry *de = NULL;
+ BOOL Replacement = FALSE;
+ int invprompt_reasons = 0; /* what is wrong with this cookie - kw */
+
+#define FAILS_COND1 0x01
+#define FAILS_COND4 0x02
+
+ if (co == NULL)
+ return;
+
+ /*
+ * Ensure that the domain list exists.
+ */
+ if (domain_list == NULL) {
+#ifdef LY_FIND_LEAKS
+ atexit(LYCookieJar_free);
+#endif
+ domain_list = HTList_new();
+ total_cookies = 0;
+ }
+
+ /*
+ * Look through domain_list to see if the cookie's domain is already
+ * listed.
+ */
+ cookie_list = NULL;
+ if ((de = find_domain_entry(co->domain)) != NULL)
+ cookie_list = de->cookie_list;
+
+ /*
+ * Apply sanity checks.
+ *
+ * RFC 2109 -
+ * Section 4.3.2, condition 1: The value for the Path attribute is not a
+ * prefix of the request-URI.
+ *
+ * If cookie checking for this domain is set to INVCHECK_LOOSE, then we
+ * want to bypass this check. The user should be queried if set to
+ * INVCHECK_QUERY.
+ *
+ * RFC 6265 -
+ * Section 4.1.2.4 describes Path, but omits any mention of the user agent
+ * rejecting a cookie because of Path. Instead, it deals only with the
+ * cases where a cookie returned by the user agent would be valid, based on
+ * Path. In section 8.6, RFC 6265 presents an example which would not have
+ * been valid with RFC 2109 to claim that the Path attribute is unreliable
+ * from the standpoint of the user agent.
+ *
+ * RFC 6265 does not go into any detail regarding its differences from the
+ * older RFCs 2109 / 2965. The relevant text covering all of these changes
+ * is just this (no case studies are cited):
+ * User agents MUST implement the more liberal processing rules defined in
+ * Section 5, in order to maximize interoperability with existing servers
+ * that do not conform to the well-behaved profile defined in Section 4.
+ */
+ if (!USE_RFC_6265 && !is_prefix(co->path, path)) {
+ invcheck_behaviour_t invcheck_bv = (de ? de->invcheck_bv
+ : DEFAULT_INVCHECK_BV);
+
+ switch (invcheck_bv) {
+ case INVCHECK_LOOSE:
+ break; /* continue as if nothing were wrong */
+
+ case INVCHECK_QUERY:
+ /* will prompt later if we get that far */
+ invprompt_reasons |= FAILS_COND1;
+ break;
+
+ case INVCHECK_STRICT:
+ CTrace((tfp,
+ "store_cookie: Rejecting because '%s' is not a prefix of '%s'.\n",
+ co->path, path));
+ freeCookie(co);
+ return;
+ }
+ }
+
+ /*
+ * The next 4 conditions do NOT apply if the domain is still
+ * the default of request-host. (domains - case insensitive).
+ */
+ if (strcasecomp(co->domain, hostname) != 0) {
+ /*
+ * The hostname does not contain a dot.
+ */
+ if (StrChr(hostname, '.') == NULL) {
+ CTrace((tfp, "store_cookie: Rejecting because '%s' has no dot.\n",
+ hostname));
+ freeCookie(co);
+ return;
+ }
+
+ /*
+ * RFC 2109 -
+ * Section 4.3.2, condition 2: The value for the Domain attribute
+ * contains no embedded dots or does not start with a dot. (A dot is
+ * embedded if it's neither the first nor last character.) Note that we
+ * added a lead dot ourselves if a domain attribute value otherwise
+ * qualified. - FM
+ *
+ * RFC 6265 -
+ * If the first character of the attribute-value string is %x2E ("."):
+ *
+ * Let cookie-domain be the attribute-value without the leading %x2E
+ * (".") character.
+ *
+ * Otherwise:
+ *
+ * Let cookie-domain be the entire attribute-value.
+ *
+ * Convert the cookie-domain to lower case.
+ */
+ SetCookieDomain(co, co->domain);
+ if (isEmpty(co->ddomain)) {
+ CTrace((tfp, "store_cookie: Rejecting domain '%s'.\n", co->ddomain));
+ freeCookie(co);
+ return;
+ }
+ if (!USE_RFC_6265) {
+ if (!has_embedded_dot(co->ddomain)) {
+ CTrace((tfp, "store_cookie: Rejecting domain '%s'.\n", co->ddomain));
+ freeCookie(co);
+ return;
+ }
+ } else {
+ if (has_trailing_dot(co->ddomain)) {
+ CTrace((tfp, "store_cookie: Rejecting domain '%s'.\n", co->ddomain));
+ freeCookie(co);
+ return;
+ }
+ }
+
+ /*
+ * RFC 2109 -
+ * Section 4.3.2, condition 3: The value for the request-host does not
+ * domain-match the Domain attribute.
+ *
+ * RFC 6265 -
+ * Section 4.1.2.3,
+ * The user agent will reject cookies unless the Domain attribute
+ * specifies a scope for the cookie that would include the origin
+ * server.
+ */
+ if (!domain_matches(hostname, co->ddomain)) {
+ CTrace((tfp,
+ "store_cookie: Rejecting domain '%s' for host '%s'.\n",
+ co->ddomain, hostname));
+ freeCookie(co);
+ return;
+ }
+
+ /*
+ * RFC 2109 -
+ * Section 4.3.2, condition 4: The request-host is an HDN (not IP
+ * address) and has the form HD, where D is the value of the Domain
+ * attribute, and H is a string that contains one or more dots.
+ *
+ * If cookie checking for this domain is set to INVCHECK_LOOSE, then we
+ * want to bypass this check. The user should be queried if set to
+ * INVCHECK_QUERY.
+ *
+ * RFC 6265 -
+ * There is nothing comparable in RFC 6265, since this check appears to
+ * have reflected assumptions about how domain names were constructed
+ * when RFC 2109 was written. Section 5.1.3. (Domain Matching) is
+ * loosely related to these assumptions.
+ */
+ if (!USE_RFC_6265) {
+ ptr = ((hostname + strlen(hostname)) - strlen(co->domain));
+ if (StrChr(hostname, '.') < ptr) {
+ invcheck_behaviour_t invcheck_bv = (de ? de->invcheck_bv
+ : DEFAULT_INVCHECK_BV);
+
+ switch (invcheck_bv) {
+ case INVCHECK_LOOSE:
+ break; /* continue as if nothing were wrong */
+
+ case INVCHECK_QUERY:
+ invprompt_reasons |= FAILS_COND4;
+ break; /* will prompt later if we get that far */
+
+ case INVCHECK_STRICT:
+ CTrace((tfp,
+ "store_cookie: Rejecting because '%s' is not a prefix of '%s'.\n",
+ co->path, path));
+ freeCookie(co);
+ return;
+ }
+ }
+ }
+ }
+
+ /*
+ * If we found reasons for issuing an invalid cookie confirmation prompt,
+ * do that now. Rejection by the user here is the last chance to
+ * completely ignore this cookie; after it passes this hurdle, it may at
+ * least supersede a previous cookie (even if it finally gets rejected). -
+ * kw
+ */
+ if (invprompt_reasons) {
+ char *msg = 0;
+
+ if (invprompt_reasons & FAILS_COND4) {
+ HTSprintf0(&msg,
+ INVALID_COOKIE_DOMAIN_CONFIRMATION,
+ co->ddomain,
+ hostname);
+ if (!HTForcedPrompt(cookie_noprompt, msg, NO)) {
+ CTrace((tfp,
+ "store_cookie: Rejecting domain '%s' for host '%s'.\n",
+ co->ddomain,
+ hostname));
+ freeCookie(co);
+ FREE(msg);
+ return;
+ }
+ }
+ if (invprompt_reasons & FAILS_COND1) {
+ HTSprintf0(&msg,
+ INVALID_COOKIE_PATH_CONFIRMATION,
+ co->path, path);
+ if (!HTForcedPrompt(cookie_noprompt, msg, NO)) {
+ CTrace((tfp,
+ "store_cookie: Rejecting because '%s' is not a prefix of '%s'.\n",
+ co->path, path));
+ freeCookie(co);
+ FREE(msg);
+ return;
+ }
+ }
+ FREE(msg);
+ }
+
+ if (de == NULL) {
+ /*
+ * Domain not found; add a new entry for this domain.
+ */
+ de = typecalloc(domain_entry);
+ if (de == NULL)
+ outofmem(__FILE__, "store_cookie");
+
+ de->bv = QUERY_USER;
+ de->invcheck_bv = DEFAULT_INVCHECK_BV; /* should this go here? */
+ cookie_list = de->cookie_list = HTList_new();
+ StrAllocCopy(de->domain, co->domain);
+ StrAllocCopy(de->ddomain, co->ddomain);
+ HTList_appendObject(domain_list, de);
+ }
+
+ /*
+ * Loop over the cookie list, deleting expired and matching cookies.
+ */
+ hl = cookie_list;
+ pos = 0;
+ while (hl) {
+ c2 = (cookie *) hl->object;
+ next = hl->next;
+ /*
+ * Check if this cookie has expired.
+ */
+ if ((c2 != NULL) &&
+ (c2->flags & COOKIE_FLAG_EXPIRES_SET) &&
+ c2->expires <= now) {
+ HTList_removeObject(cookie_list, c2);
+ freeCookie(c2);
+ c2 = NULL;
+ total_cookies--;
+
+ /*
+ * Check if this cookie matches the one we're inserting.
+ */
+ } else if ((c2) &&
+ !strcasecomp(co->ddomain, c2->ddomain) &&
+ !strcmp(co->path, c2->path) &&
+ !strcmp(co->name, c2->name)) {
+ HTList_removeObject(cookie_list, c2);
+ freeCookie(c2);
+ c2 = NULL;
+ total_cookies--;
+ Replacement = TRUE;
+
+ } else if ((c2) && (c2->pathlen) >= (co->pathlen)) {
+ /*
+ * This comparison determines the (tentative) position of the new
+ * cookie in the list such that it comes before existing cookies
+ * with a less specific path, but after existing cookies of equal
+ * (or greater) path length. Thus it should normally preserve the
+ * order of new cookies with the same path as they are received,
+ * although this is not required.
+ *
+ * From RFC 2109 4.3.4:
+ *
+ * If multiple cookies satisfy the criteria above, they are ordered
+ * in the Cookie header such that those with more specific Path
+ * attributes precede those with less specific. Ordering with
+ * respect to other attributes (e.g., Domain) is unspecified.
+ */
+ pos++;
+ }
+ hl = next;
+ }
+
+ /*
+ * Don't bother to add the cookie if it's already expired.
+ */
+ if ((co->flags & COOKIE_FLAG_EXPIRES_SET) && co->expires <= now) {
+ freeCookie(co);
+ co = NULL;
+
+ /*
+ * Don't add the cookie if we're over the domain's limit. - FM
+ */
+ } else if (HTList_count(cookie_list) > max_cookies_domain) {
+ CTrace((tfp,
+ "store_cookie: Domain's cookie limit exceeded! Rejecting cookie.\n"));
+ freeCookie(co);
+ co = NULL;
+
+ /*
+ * Don't add the cookie if we're over the total cookie limit. - FM
+ */
+ } else if (total_cookies > max_cookies_global) {
+ CTrace((tfp,
+ "store_cookie: Total cookie limit exceeded! Rejecting cookie.\n"));
+ freeCookie(co);
+ co = NULL;
+
+ /*
+ * Don't add the cookie if the value is NULL. - BJP
+ */
+ /*
+ * Presence of value is now needed (indicated normally by '='),
+ * but it can now be an empty string.
+ * - kw 1999-06-24
+ */
+ } else if (co->value == NULL) { /* should not happen - kw */
+ CTrace((tfp, "store_cookie: Value is NULL! Not storing cookie.\n"));
+ freeCookie(co);
+ co = NULL;
+
+ /*
+ * If it's a replacement for a cookie that had not expired, and never
+ * allow has not been set, add it again without confirmation. - FM
+ */
+ } else if ((Replacement == TRUE) && de->bv != REJECT_ALWAYS) {
+ HTList_insertObjectAt(cookie_list, co, pos);
+ total_cookies++;
+
+ /*
+ * Get confirmation if we need it, and add cookie if confirmed or
+ * 'allow' is set to always. - FM
+ *
+ * Cookies read from file are accepted without confirmation prompting.
+ * (Prompting may actually not be possible if LYLoadCookies is called
+ * before curses is setup.) Maybe this should instead depend on
+ * LYSetCookies and/or LYCookieAcceptDomains and/or
+ * LYCookieRejectDomains and/or LYAcceptAllCookies and/or some other
+ * settings. -kw
+ */
+ } else if ((co->flags & COOKIE_FLAG_FROM_FILE)
+ || HTConfirmCookie(de, hostname, co->name, co->value)) {
+ /*
+ * Insert the new cookie so that more specific paths (longer
+ * pathlen) come first in the list. - kw
+ */
+ HTList_insertObjectAt(cookie_list, co, pos);
+ total_cookies++;
+ } else {
+ freeCookie(co);
+ co = NULL;
+ }
+}
+
+/*
+ * Scan a domain's cookie_list for any cookies we should
+ * include in a Cookie: request header. - AK & FM
+ */
+static char *scan_cookie_sublist(char *hostname,
+ char *path,
+ int port,
+ HTList *sublist,
+ char *header,
+ int secure)
+{
+ HTList *hl, *next;
+ cookie *co;
+ time_t now = time(NULL);
+ char crlftab[8];
+
+ sprintf(crlftab, "%c%c%c", CR, LF, '\t');
+ for (hl = sublist; hl != NULL; hl = next) {
+ next = hl->next;
+ co = (cookie *) hl->object;
+
+ if (co == NULL) {
+ continue;
+ }
+
+ /* speed-up host_matches() and limit trace output */
+ if (LYstrstr(hostname, co->ddomain) != NULL) {
+ CTrace((tfp, "Checking cookie %p %s=%s\n",
+ (void *) hl,
+ (co->name ? co->name : "(no name)"),
+ (co->value ? co->value : "(no value)")));
+ CTrace((tfp, "\t%s %s %d %s %s %d%s\n",
+ hostname,
+ (co->ddomain ? co->ddomain : "(no domain)"),
+ domain_matches(hostname, co->ddomain),
+ path, co->path,
+ (co->pathlen > 0)
+ ? !is_prefix(co->path, path)
+ : 0,
+ (co->flags & COOKIE_FLAG_SECURE)
+ ? " secure"
+ : ""));
+ }
+ /*
+ * Check if this cookie has expired, and if so, delete it.
+ */
+ if ((co->flags & COOKIE_FLAG_EXPIRES_SET) &&
+ co->expires <= now) {
+ next = hl->next;
+ HTList_removeObject(sublist, co);
+ freeCookie(co);
+ total_cookies--;
+ if (next)
+ continue;
+ break;
+ }
+
+ /*
+ * Check if we have a unexpired match, and handle if we do.
+ */
+ if (co->domain != 0 &&
+ co->name != 0 &&
+ domain_matches(hostname, co->ddomain) &&
+ (co->pathlen == 0 || is_prefix(co->path, path))) {
+ /*
+ * Skip if the secure flag is set and we don't have a secure
+ * connection. HTTP.c presently treats only SSL connections as
+ * secure. - FM
+ */
+ if ((co->flags & COOKIE_FLAG_SECURE) && secure == FALSE) {
+ continue;
+ }
+
+ /*
+ * Skip if we have a port list and the current port is not listed.
+ * - FM
+ */
+ if (USE_RFC_2965
+ && co->PortList
+ && !port_matches(port, co->PortList)) {
+ continue;
+ }
+
+ /*
+ * Start or append to the request header.
+ */
+ if (header == NULL) {
+ if (co->version > 0) {
+ /*
+ * For Version 1 (or greater) cookies, the version number
+ * goes before the first cookie.
+ */
+ HTSprintf0(&header, "$Version=\"%d\"; ", co->version);
+ }
+ } else {
+ /*
+ * There's already cookie data there, so add a separator
+ * (always use a semi-colon for "backward compatibility"). -
+ * FM
+ */
+ StrAllocCat(header, "; ");
+ /*
+ * Check if we should fold the header. - FM
+ */
+
+ /*
+ * Section 2.2 of RFC1945 says:
+ *
+ * HTTP/1.0 headers may be folded onto multiple lines if each
+ * continuation line begins with a space or horizontal tab.
+ * All linear whitespace, including folding, has the same
+ * semantics as SP. [...] However, folding of header lines is
+ * not expected by some applications, and should not be
+ * generated by HTTP/1.0 applications.
+ *
+ * This code was causing problems. Let's not use it. -BJP
+ */
+
+ /* if (len > 800) { */
+ /* StrAllocCat(header, crlftab); */
+ /* } */
+
+ }
+ /*
+ * Include the cookie name=value pair.
+ */
+ StrAllocCat(header, co->name);
+ StrAllocCat(header, "=");
+ if (co->quoted) {
+ StrAllocCat(header, "\"");
+ }
+ StrAllocCat(header, co->value);
+ if (co->quoted) {
+ StrAllocCat(header, "\"");
+ }
+ /*
+ * For Version 1 (or greater) cookies, add $PATH, $PORT and/or
+ * $DOMAIN attributes for the cookie if they were specified via a
+ * server reply header. - FM
+ */
+ if (co->version > 0) {
+ if (co->path && (co->flags & COOKIE_FLAG_PATH_SET)) {
+ HTSprintf(&header, "; $Path=\"%s\"", co->path);
+ }
+ if (co->PortList && isdigit(UCH(*co->PortList))) {
+ HTSprintf(&header, "; $Port=\"%s\"", co->PortList);
+ }
+ if (co->domain && (co->flags & COOKIE_FLAG_DOMAIN_SET)) {
+ HTSprintf(&header, "; $Domain=\"%s\"", co->domain);
+ }
+ }
+ }
+ }
+
+ return (header);
+}
+
+/*
+ * Presence of value is needed (indicated normally by '=') to start a cookie,
+ * but it can be an empty string. - kw 1999-06-24
+ */
+static char *alloc_attr_value(const char *value_start,
+ const char *value_end)
+{
+ char *value = NULL;
+
+ if (value_start && value_end >= value_start) {
+ int value_len = (int) (value_end - value_start);
+
+ if (value_len > max_cookies_buffer) {
+ value_len = max_cookies_buffer;
+ }
+ value = typecallocn(char, (unsigned) value_len + 1);
+
+ if (value == NULL)
+ outofmem(__FILE__, "LYProcessSetCookies");
+ LYStrNCpy(value, value_start, value_len);
+ }
+ return value;
+}
+
+#define FLAGS_INVALID_PORT 1
+#define FLAGS_KNOWN_ATTR 2
+#define FLAGS_MAXAGE_ATTR 4
+
+#define is_attr(s, len) attr_len == len && !strncasecomp(attr_start, s, len)
+
+/*
+ * Attribute-names are matched ignoring case.
+ *
+ * Attribute RFC-2109 (1997) RFC-2965 (2000) RFC-6265 (2011)
+ * ---------------------------------------------------------------
+ * comment yes yes -
+ * commentURL - yes -
+ * discard - yes -
+ * domain yes yes yes
+ * expires yes yes yes
+ * httponly - - yes
+ * max-age yes yes yes
+ * path yes yes yes
+ * port - yes -
+ * secure yes yes yes
+ * version yes yes -
+ * ---------------------------------------------------------------
+ */
+static unsigned parse_attribute(unsigned flags,
+ cookie * cur_cookie,
+ int *cookie_len,
+ const char *attr_start,
+ int attr_len,
+ char *value,
+ const char *address,
+ char *hostname,
+ int port)
+{
+ BOOLEAN known_attr = NO;
+ int url_type;
+
+ CTrace((tfp, "parse_attribute %.*s\n", attr_len, attr_start));
+
+ flags &= (unsigned) (~FLAGS_KNOWN_ATTR);
+ if (is_attr("secure", 6)) {
+ if (value == NULL) {
+ known_attr = YES;
+ if (cur_cookie != NULL) {
+ cur_cookie->flags |= COOKIE_FLAG_SECURE;
+ }
+ } else {
+ /*
+ * If secure has a value, assume someone misused it as cookie name.
+ * - FM
+ */
+ known_attr = NO;
+ }
+ } else if (USE_RFC_6265 && is_attr("httponly", 8)) {
+ if (value == NULL) {
+ known_attr = YES; /* known, but irrelevant to lynx */
+ } else {
+ known_attr = NO;
+ }
+ } else if (USE_RFC_2965 && is_attr("discard", 7)) {
+ if (value == NULL) {
+ known_attr = YES;
+ if (cur_cookie != NULL) {
+ cur_cookie->flags |= COOKIE_FLAG_DISCARD;
+ }
+ } else {
+ /*
+ * If discard has a value, assume someone used it as a cookie name.
+ * - FM
+ */
+ known_attr = NO;
+ }
+ } else if ((USE_RFC_2109 || USE_RFC_2965) && is_attr("comment", 7)) {
+ known_attr = YES;
+ if (cur_cookie != NULL && value &&
+ /*
+ * Don't process a repeat comment. - FM
+ */
+ cur_cookie->comment == NULL) {
+ StrAllocCopy(cur_cookie->comment, value);
+ *cookie_len += (int) strlen(cur_cookie->comment);
+ }
+ } else if (USE_RFC_2965 && is_attr("commentURL", 10)) {
+ known_attr = YES;
+ if (cur_cookie != NULL && value &&
+ /*
+ * Don't process a repeat commentURL. - FM
+ */
+ cur_cookie->commentURL == NULL) {
+ /*
+ * We should get only absolute URLs as values, but will resolve
+ * versus the request's URL just in case. - FM
+ */
+ cur_cookie->commentURL = HTParse(value,
+ address,
+ PARSE_ALL);
+ /*
+ * Accept only URLs for http or https servers. - FM
+ */
+ if ((url_type = is_url(cur_cookie->commentURL)) &&
+ (url_type == HTTP_URL_TYPE ||
+ url_type == HTTPS_URL_TYPE)) {
+ *cookie_len += (int) strlen(cur_cookie->commentURL);
+ } else {
+ CTrace((tfp,
+ "LYProcessSetCookies: Rejecting commentURL value '%s'\n",
+ cur_cookie->commentURL));
+ FREE(cur_cookie->commentURL);
+ }
+ }
+ } else if (is_attr("domain", 6)) {
+ known_attr = YES;
+ if (cur_cookie != NULL && value &&
+ /*
+ * Don't process a repeat domain. - FM
+ */
+ !(cur_cookie->flags & COOKIE_FLAG_DOMAIN_SET)) {
+ *cookie_len -= (int) strlen(cur_cookie->domain);
+ /*
+ * If the value does not have a lead dot, but does have an embedded
+ * dot, and is not an exact match to the hostname, nor is a numeric
+ * IP address, add a lead dot. Otherwise, use the value as is. -
+ * FM (domains - case insensitive).
+ */
+ if (value[0] != '.' && value[0] != '\0' &&
+ value[1] != '\0' && strcasecomp(value, hostname)) {
+ char *ptr = StrChr(value, '.');
+
+ if (ptr != NULL && ptr[1] != '\0') {
+ ptr = value;
+ while (*ptr == '.' ||
+ isdigit(UCH(*ptr)))
+ ptr++;
+ if (*ptr != '\0') {
+ CTrace((tfp,
+ "LYProcessSetCookies: Adding lead dot for domain value '%s'\n",
+ value));
+ HTSprintf0(&(cur_cookie->domain), ".%s", value);
+ } else {
+ StrAllocCopy(cur_cookie->domain, value);
+ }
+ } else {
+ StrAllocCopy(cur_cookie->domain, value);
+ }
+ } else {
+ StrAllocCopy(cur_cookie->domain, value);
+ }
+ *cookie_len += (int) strlen(cur_cookie->domain);
+ cur_cookie->flags |= COOKIE_FLAG_DOMAIN_SET;
+ SetCookieDomain(cur_cookie, cur_cookie->domain);
+ }
+ } else if (is_attr("path", 4)) {
+ known_attr = YES;
+ if (cur_cookie != NULL && value &&
+ /*
+ * Don't process a repeat path. - FM
+ */
+ !(cur_cookie->flags & COOKIE_FLAG_PATH_SET)) {
+ *cookie_len -= (int) strlen(cur_cookie->path);
+ StrAllocCopy(cur_cookie->path, value);
+ *cookie_len += (cur_cookie->pathlen = (int) strlen(cur_cookie->path));
+ cur_cookie->flags |= COOKIE_FLAG_PATH_SET;
+ CTrace((tfp, " ->%.*s\n", cur_cookie->pathlen, cur_cookie->path));
+ }
+ } else if (USE_RFC_2965 && is_attr("port", 4)) {
+ if (cur_cookie != NULL && value &&
+ /*
+ * Don't process a repeat port. - FM
+ */
+ cur_cookie->PortList == NULL) {
+ char *cp = value;
+
+ while ((*cp != '\0') &&
+ (isdigit(UCH(*cp)) ||
+ *cp == ',' || *cp == ' ')) {
+ cp++;
+ }
+ if (*cp == '\0') {
+ if (!port_matches(port, value)) {
+ flags |= FLAGS_INVALID_PORT;
+ } else {
+ StrAllocCopy(cur_cookie->PortList, value);
+ *cookie_len += (int) strlen(cur_cookie->PortList);
+ CTrace((tfp, " ->%s\n", cur_cookie->PortList));
+ }
+ known_attr = YES;
+ } else {
+ known_attr = NO;
+ }
+ } else if (cur_cookie != NULL) {
+ /*
+ * Don't process a repeat port. - FM
+ */
+ if (cur_cookie->PortList == NULL) {
+ HTSprintf0(&(cur_cookie->PortList), "%d", port);
+ *cookie_len += (int) strlen(cur_cookie->PortList);
+ }
+ known_attr = YES;
+ }
+ } else if ((USE_RFC_2109 || USE_RFC_2965) && is_attr("version", 7)) {
+ known_attr = YES;
+ if (cur_cookie != NULL && value &&
+ /*
+ * Don't process a repeat version. - FM
+ */
+ cur_cookie->version < 1) {
+ int temp = (int) strtol(value, NULL, 10);
+
+ if (errno != -ERANGE) {
+ cur_cookie->version = temp;
+ }
+ }
+ } else if (is_attr("max-age", 7)) {
+ known_attr = YES;
+ /*
+ * Don't process a repeat max-age. - FM
+ */
+ if (cur_cookie != NULL && value &&
+ !(flags & FLAGS_MAXAGE_ATTR)) {
+ long temp = strtol(value, NULL, 10);
+
+ cur_cookie->flags |= COOKIE_FLAG_EXPIRES_SET;
+ if (errno == -ERANGE) {
+ cur_cookie->expires = (time_t) 0;
+ } else {
+ cur_cookie->expires = (time(NULL) + temp);
+ CTrace((tfp, "LYSetCookie: expires %" PRI_time_t ", %s",
+ CAST_time_t (cur_cookie->expires),
+ ctime(&cur_cookie->expires)));
+ }
+ flags |= FLAGS_MAXAGE_ATTR;
+ }
+ } else if (is_attr("expires", 7)) {
+ /*
+ * Convert an 'expires' attribute value if we haven't received a
+ * 'max-age'. Note that 'expires' should not be used in Version 1
+ * cookies, but it might be used for "backward compatibility", and, in
+ * turn, ill-informed people surely would start using it instead of,
+ * rather than in addition to, 'max-age'. - FM
+ */
+ known_attr = YES;
+ if ((cur_cookie != NULL && !(flags & FLAGS_MAXAGE_ATTR)) &&
+ !(cur_cookie->flags & COOKIE_FLAG_EXPIRES_SET)) {
+ if (value) {
+ cur_cookie->flags |= COOKIE_FLAG_EXPIRES_SET;
+ cur_cookie->expires = LYmktime(value, FALSE);
+ if (cur_cookie->expires > 0) {
+ CTrace((tfp, "LYSetCookie: expires %" PRI_time_t ", %s",
+ CAST_time_t (cur_cookie->expires),
+ ctime(&cur_cookie->expires)));
+ }
+ }
+ }
+ }
+ if (known_attr)
+ flags |= FLAGS_KNOWN_ATTR;
+ return flags;
+}
+
+/*
+ * Process potentially concatenated Set-Cookie2 and/or Set-Cookie
+ * headers. - FM
+ */
+static void LYProcessSetCookies(const char *SetCookie,
+ const char *SetCookie2,
+ const char *address,
+ char *hostname,
+ char *path,
+ int port)
+{
+ const char *p, *attr_start, *attr_end, *value_start, *value_end;
+ HTList *CombinedCookies = NULL, *cl = NULL;
+ cookie *cur_cookie = NULL, *co = NULL;
+ int cookie_len = 0;
+ int NumCookies = 0;
+ BOOL Quoted = FALSE;
+ unsigned parse_flags = 0;
+
+ if (isEmpty(SetCookie) &&
+ isEmpty(SetCookie2)) {
+ /*
+ * Yuk! Garbage in, so nothing out. - FM
+ */
+ return;
+ }
+
+ /*
+ * If we have both Set-Cookie and Set-Cookie2 headers. process the
+ * Set-Cookie2 header. Otherwise, process whichever of the two headers we
+ * do have. Note that if more than one instance of a valued attribute for
+ * the same cookie is encountered, the value for the first instance is
+ * retained.
+ */
+ CombinedCookies = HTList_new();
+
+ /*
+ * Process the Set-Cookie2 header, if present and not zero-length, adding
+ * each cookie to the CombinedCookies list. - FM
+ */
+ p = NonNull(SetCookie2);
+ if (SetCookie && *p) {
+ CTrace((tfp, "LYProcessSetCookies: Using Set-Cookie2 header.\n"));
+ }
+ while (NumCookies <= max_cookies_domain && *p) {
+ value_start = value_end = NULL;
+ p = LYSkipCBlanks(p);
+ /*
+ * Get the attribute name.
+ */
+ attr_start = p;
+ while (*p != '\0' && !isspace(UCH(*p)) &&
+ *p != '=' && *p != ';' && *p != ',')
+ p++;
+ attr_end = p;
+ p = LYSkipCBlanks(p);
+
+ /*
+ * Check for an '=' delimiter, or an 'expires' name followed by white,
+ * since Netscape's bogus parser doesn't require an '=' delimiter, and
+ * 'expires' attributes are being encountered without them. These
+ * shouldn't be in a Set-Cookie2 header, but we'll assume it's an
+ * expires attribute rather a cookie with that name, since the
+ * attribute mistake rather than name mistake seems more likely to be
+ * made by providers. - FM
+ */
+ if (*p == '=' ||
+ !strncasecomp(attr_start, "Expires", 7)) {
+ /*
+ * Get the value string.
+ */
+ if (*p == '=') {
+ p++;
+ }
+ p = LYSkipCBlanks(p);
+ /*
+ * Hack alert! We must handle Netscape-style cookies with
+ * "Expires=Mon, 01-Jan-96 13:45:35 GMT" or
+ * "Expires=Mon, 1 Jan 1996 13:45:35 GMT".
+ * No quotes, but there are spaces. Argh... Anyway, we know it
+ * will have at least 3 space separators within it, and two dashes
+ * or two more spaces, so this code looks for a space after the 5th
+ * space separator or dash to mark the end of the value. - FM
+ */
+ if ((attr_end - attr_start) == 7 &&
+ !strncasecomp(attr_start, "Expires", 7)) {
+ int spaces = 6;
+
+ value_start = p;
+ if (isdigit(UCH(*p))) {
+ /*
+ * No alphabetic day field. - FM
+ */
+ spaces--;
+ } else {
+ /*
+ * Skip the alphabetic day field. - FM
+ */
+ while (*p != '\0' && isalpha(UCH(*p))) {
+ p++;
+ }
+ while (*p == ',' || isspace(UCH(*p))) {
+ p++;
+ }
+ spaces--;
+ }
+ while (*p != '\0' && *p != ';' && *p != ',' && spaces) {
+ p++;
+ if (isspace(UCH(*p))) {
+ while (isspace(UCH(*(p + 1))))
+ p++;
+ spaces--;
+ } else if (*p == '-') {
+ spaces--;
+ }
+ }
+ value_end = p;
+ /*
+ * Hack Alert! The port attribute can take a comma separated
+ * list of numbers as a value, and such values should be
+ * quoted, but if not, make sure we don't treat a number in the
+ * list as the start of a new cookie. - FM
+ */
+ } else if ((attr_end - attr_start) == 4 &&
+ !strncasecomp(attr_start, "port", 4) &&
+ isdigit(UCH(*p))) {
+ /*
+ * The value starts as an unquoted number.
+ */
+ const char *cp, *cp1;
+
+ value_start = p;
+ while (1) {
+ while (isdigit(UCH(*p)))
+ p++;
+ value_end = p;
+ p = LYSkipCBlanks(p);
+ if (*p == '\0' || *p == ';')
+ break;
+ if (*p == ',') {
+ cp = LYSkipCBlanks(p + 1);
+ if (*cp != '\0' && isdigit(UCH(*cp))) {
+ cp1 = cp;
+ while (isdigit(UCH(*cp1)))
+ cp1++;
+ cp1 = LYSkipCBlanks(cp1);
+ if (*cp1 == '\0' || *cp1 == ',' || *cp1 == ';') {
+ p = cp;
+ continue;
+ }
+ }
+ }
+ while (*p != '\0' && *p != ';' && *p != ',')
+ p++;
+ value_end = p;
+ /*
+ * Trim trailing spaces.
+ */
+ if ((value_end > value_start) &&
+ isspace(UCH(*(value_end - 1)))) {
+ value_end--;
+ while ((value_end > (value_start + 1)) &&
+ isspace(UCH(*value_end)) &&
+ isspace(UCH(*(value_end - 1)))) {
+ value_end--;
+ }
+ }
+ break;
+ }
+ } else if (*p == '"') {
+ BOOLEAN escaped = FALSE;
+
+ /*
+ * It looks like quoted string.
+ */
+ p++;
+ value_start = p;
+ while (*p != '\0' && (*p != '"' || escaped)) {
+ escaped = (BOOL) (!escaped && *p == '\\');
+ p++;
+ }
+ if (p != value_start && *p == '"' && !escaped) {
+ value_end = p;
+ p++;
+ Quoted = TRUE;
+ } else {
+ value_start--;
+ value_end = p;
+ if (*p)
+ p++;
+ Quoted = FALSE;
+ }
+ } else {
+ /*
+ * Otherwise, it's an unquoted string.
+ */
+ value_start = p;
+ while (*p != '\0' && *p != ';' && *p != ',')
+ p++;
+ value_end = p;
+ /*
+ * Trim trailing spaces.
+ */
+ if ((value_end > value_start) &&
+ isspace(UCH(*(value_end - 1)))) {
+ value_end--;
+ while ((value_end > (value_start + 1)) &&
+ isspace(UCH(*value_end)) &&
+ isspace(UCH(*(value_end - 1)))) {
+ value_end--;
+ }
+ }
+ }
+ }
+
+ /*
+ * Check for a separator character, and skip it.
+ */
+ if (*p == ';' || *p == ',')
+ p++;
+
+ /*
+ * Now, we can handle this attribute/value pair.
+ */
+ if (attr_end > attr_start) {
+ char *value = alloc_attr_value(value_start, value_end);
+
+ parse_flags = parse_attribute(parse_flags,
+ cur_cookie,
+ &cookie_len,
+ attr_start,
+ (int) (attr_end - attr_start),
+ value,
+ address,
+ hostname,
+ port);
+
+ /*
+ * Presence of value is needed (indicated normally by '='),
+ * but it can be an empty string. - kw 1999-06-24
+ */
+ if (!(parse_flags & FLAGS_KNOWN_ATTR)
+ && value
+ && value_end >= value_start) {
+ /*
+ * If we've started a cookie, and it's not too big, save it in
+ * the CombinedCookies list. - FM
+ */
+ if (cookie_len <= max_cookies_buffer
+ && cur_cookie != NULL
+ && !(parse_flags & FLAGS_INVALID_PORT)) {
+ AssumeCookieVersion(cur_cookie);
+ HTList_appendObject(CombinedCookies, cur_cookie);
+ } else if (cur_cookie != NULL) {
+ CTrace((tfp,
+ "LYProcessSetCookies: Rejecting Set-Cookie2: %s=%s\n",
+ (cur_cookie->name ?
+ cur_cookie->name : "[no name]"),
+ (cur_cookie->value ?
+ cur_cookie->value : "[no value]")));
+ CTrace((tfp,
+ (parse_flags & FLAGS_INVALID_PORT) ?
+ " due to excessive length!\n"
+ : " due to invalid port!\n"));
+ if (parse_flags & FLAGS_INVALID_PORT) {
+ NumCookies--;
+ }
+ freeCookie(cur_cookie);
+ cur_cookie = NULL;
+ }
+ /*
+ * Start a new cookie. - FM
+ */
+ cur_cookie = newCookie();
+ cookie_len = 0;
+ NumCookies++;
+ MemAllocCopy(&(cur_cookie->name), attr_start, attr_end);
+ cookie_len += (int) strlen(cur_cookie->name);
+ MemAllocCopy(&(cur_cookie->value), value_start, value_end);
+ cookie_len += (int) strlen(cur_cookie->value);
+ StrAllocCopy(cur_cookie->domain, hostname);
+ cookie_len += (int) strlen(hostname);
+ StrAllocCopy(cur_cookie->path, path);
+ cookie_len += (cur_cookie->pathlen = (int) strlen(cur_cookie->path));
+ cur_cookie->port = port;
+ parse_flags = 0;
+ cur_cookie->quoted = TRUE;
+ SetCookieDomain(cur_cookie, hostname);
+ }
+ FREE(value);
+ }
+ }
+
+ /*
+ * Add any final SetCookie2 cookie to the CombinedCookie list if we are
+ * within the length limit. - FM
+ */
+ if (NumCookies <= max_cookies_domain
+ && cookie_len <= max_cookies_buffer
+ && cur_cookie != NULL && !(parse_flags & FLAGS_INVALID_PORT)) {
+ AssumeCookieVersion(cur_cookie);
+ HTList_appendObject(CombinedCookies, cur_cookie);
+ } else if (cur_cookie != NULL && !(parse_flags & FLAGS_INVALID_PORT)) {
+ CTrace((tfp, "LYProcessSetCookies: Rejecting Set-Cookie2: %s=%s\n",
+ (cur_cookie->name ? cur_cookie->name : "[no name]"),
+ (cur_cookie->value ? cur_cookie->value : "[no value]")));
+ CTrace((tfp, " due to excessive %s%s%s\n",
+ (cookie_len > max_cookies_buffer ? "length" : ""),
+ (cookie_len > max_cookies_buffer &&
+ NumCookies > max_cookies_domain
+ ? " and "
+ : ""),
+ (NumCookies > max_cookies_domain ? "number!\n" : "!\n")));
+ freeCookie(cur_cookie);
+ cur_cookie = NULL;
+ } else if (cur_cookie != NULL) { /* invalidport */
+ CTrace((tfp, "LYProcessSetCookies: Rejecting Set-Cookie2: %s=%s\n",
+ (cur_cookie->name ? cur_cookie->name : "[no name]"),
+ (cur_cookie->value ? cur_cookie->value : "[no value]")));
+ CTrace((tfp, " due to invalid port!\n"));
+ NumCookies--;
+ freeCookie(cur_cookie);
+ cur_cookie = NULL;
+ }
+
+ /*
+ * Process the Set-Cookie header, if no non-zero-length Set-Cookie2 header
+ * was present. - FM
+ */
+ cookie_len = 0;
+ NumCookies = 0;
+ cur_cookie = NULL;
+ p = ((SetCookie && isEmpty(SetCookie2)) ? SetCookie : "");
+ if (SetCookie2 && *p) {
+ CTrace((tfp, "LYProcessSetCookies: Using Set-Cookie header.\n"));
+ }
+ while (NumCookies <= max_cookies_domain && *p) {
+ value_start = value_end = NULL;
+ p = LYSkipCBlanks(p);
+ /*
+ * Get the attribute name.
+ */
+ attr_start = p;
+ while (*p != '\0' && !isspace(UCH(*p)) &&
+ *p != '=' && *p != ';' && *p != ',')
+ p++;
+ attr_end = p;
+ p = LYSkipCBlanks(p);
+
+ /*
+ * Check for an '=' delimiter, or an 'expires' name followed by white,
+ * since Netscape's bogus parser doesn't require an '=' delimiter, and
+ * 'expires' attributes are being encountered without them. - FM
+ */
+ if (*p == '=' ||
+ !strncasecomp(attr_start, "Expires", 7)) {
+ /*
+ * Get the value string.
+ */
+ if (*p == '=') {
+ p++;
+ }
+ p = LYSkipCBlanks(p);
+ /*
+ * Hack alert! We must handle Netscape-style cookies with
+ * "Expires=Mon, 01-Jan-96 13:45:35 GMT" or
+ * "Expires=Mon, 1 Jan 1996 13:45:35 GMT".
+ * No quotes, but there are spaces. Argh... Anyway, we know it
+ * will have at least 3 space separators within it, and two dashes
+ * or two more spaces, so this code looks for a space after the 5th
+ * space separator or dash to mark the end of the value. - FM
+ */
+ if ((attr_end - attr_start) == 7 &&
+ !strncasecomp(attr_start, "Expires", 7)) {
+ int spaces = 6;
+
+ value_start = p;
+ if (isdigit(UCH(*p))) {
+ /*
+ * No alphabetic day field. - FM
+ */
+ spaces--;
+ } else {
+ /*
+ * Skip the alphabetic day field. - FM
+ */
+ while (*p != '\0' && isalpha(UCH(*p))) {
+ p++;
+ }
+ while (*p == ',' || isspace(UCH(*p))) {
+ p++;
+ }
+ spaces--;
+ }
+ while (*p != '\0' && *p != ';' && *p != ',' && spaces) {
+ p++;
+ if (isspace(UCH(*p))) {
+ while (isspace(UCH(*(p + 1))))
+ p++;
+ spaces--;
+ } else if (*p == '-') {
+ spaces--;
+ }
+ }
+ value_end = p;
+ /*
+ * Hack Alert! The port attribute can take a comma separated
+ * list of numbers as a value, and such values should be
+ * quoted, but if not, make sure we don't treat a number in the
+ * list as the start of a new cookie. - FM
+ */
+ } else if ((attr_end - attr_start) == 4 &&
+ !strncasecomp(attr_start, "port", 4) &&
+ isdigit(UCH(*p))) {
+ /*
+ * The value starts as an unquoted number.
+ */
+ const char *cp, *cp1;
+
+ value_start = p;
+ while (1) {
+ while (isdigit(UCH(*p)))
+ p++;
+ value_end = p;
+ p = LYSkipCBlanks(p);
+ if (*p == '\0' || *p == ';')
+ break;
+ if (*p == ',') {
+ cp = LYSkipCBlanks(p + 1);
+ if (*cp != '\0' && isdigit(UCH(*cp))) {
+ cp1 = cp;
+ while (isdigit(UCH(*cp1)))
+ cp1++;
+ cp1 = LYSkipCBlanks(cp1);
+ if (*cp1 == '\0' || *cp1 == ',' || *cp1 == ';') {
+ p = cp;
+ continue;
+ }
+ }
+ }
+ while (*p != '\0' && *p != ';' && *p != ',')
+ p++;
+ value_end = p;
+ /*
+ * Trim trailing spaces.
+ */
+ if ((value_end > value_start) &&
+ isspace(UCH(*(value_end - 1)))) {
+ value_end--;
+ while ((value_end > (value_start + 1)) &&
+ isspace(UCH(*value_end)) &&
+ isspace(UCH(*(value_end - 1)))) {
+ value_end--;
+ }
+ }
+ break;
+ }
+ } else if (*p == '"') {
+ BOOLEAN escaped = FALSE;
+
+ /*
+ * It looks like quoted string.
+ */
+ p++;
+ value_start = p;
+ while (*p != '\0' && (*p != '"' || escaped)) {
+ escaped = (BOOL) (!escaped && *p == '\\');
+ p++;
+ }
+ if (p != value_start && *p == '"' && !escaped) {
+ value_end = p;
+ p++;
+ Quoted = TRUE;
+ } else {
+ value_start--;
+ value_end = p;
+ if (*p)
+ p++;
+ Quoted = FALSE;
+ }
+ } else {
+ /*
+ * Otherwise, it's an unquoted string.
+ */
+ value_start = p;
+ while (*p != '\0' && *p != ';' && *p != ',')
+ p++;
+ value_end = p;
+ /*
+ * Trim trailing spaces.
+ */
+ if ((value_end > value_start) &&
+ isspace(UCH(*(value_end - 1)))) {
+ value_end--;
+ while ((value_end > (value_start + 1)) &&
+ isspace(UCH(*value_end)) &&
+ isspace(UCH(*(value_end - 1)))) {
+ value_end--;
+ }
+ }
+ }
+ }
+
+ /*
+ * Check for a separator character, and skip it.
+ */
+ if (*p == ';' || *p == ',')
+ p++;
+
+ /*
+ * Now, we can handle this attribute/value pair.
+ */
+ if (attr_end > attr_start) {
+ char *value = alloc_attr_value(value_start, value_end);
+
+ parse_flags = parse_attribute(parse_flags,
+ cur_cookie,
+ &cookie_len,
+ attr_start,
+ (int) (attr_end - attr_start),
+ value,
+ address,
+ hostname,
+ port);
+
+ /*
+ * Presence of value is needed (indicated normally by '='),
+ * but it can be an empty string. - kw 1999-06-24
+ */
+ if (!(parse_flags & FLAGS_KNOWN_ATTR)
+ && value
+ && value_end >= value_start) {
+ /*
+ * If we've started a cookie, and it's not too big, save it in
+ * the CombinedCookies list. - FM
+ */
+ if (cookie_len <= max_cookies_buffer
+ && cur_cookie != NULL) {
+ /*
+ * If we had a Set-Cookie2 header, make sure the version is
+ * at least 1, and mark it for quoting. - FM
+ */
+ if (SetCookie2 != NULL) {
+ AssumeCookieVersion(cur_cookie);
+ cur_cookie->quoted = TRUE;
+ }
+ HTList_appendObject(CombinedCookies, cur_cookie);
+ } else if (cur_cookie != NULL) {
+ CTrace((tfp,
+ "LYProcessSetCookies: Rejecting Set-Cookie: %s=%s\n",
+ (cur_cookie->name ?
+ cur_cookie->name : "[no name]"),
+ (cur_cookie->value ?
+ cur_cookie->value : "[no value]")));
+ CTrace((tfp,
+ " due to excessive length!\n"));
+ freeCookie(cur_cookie);
+ cur_cookie = NULL;
+ }
+ /*
+ * Start a new cookie. - FM
+ */
+ cur_cookie = newCookie();
+ NumCookies++;
+ cookie_len = 0;
+ MemAllocCopy(&(cur_cookie->name), attr_start, attr_end);
+ cookie_len += (int) strlen(cur_cookie->name);
+ MemAllocCopy(&(cur_cookie->value), value_start, value_end);
+ cookie_len += (int) strlen(cur_cookie->value);
+ StrAllocCopy(cur_cookie->domain, hostname);
+ cookie_len += (int) strlen(hostname);
+ StrAllocCopy(cur_cookie->path, path);
+ cookie_len += (cur_cookie->pathlen = (int) strlen(cur_cookie->path));
+ cur_cookie->port = port;
+ parse_flags = 0;
+ cur_cookie->quoted = Quoted;
+ Quoted = FALSE;
+ SetCookieDomain(cur_cookie, hostname);
+ }
+ FREE(value);
+ }
+ }
+
+ /*
+ * Handle the final Set-Cookie cookie if within length limit. - FM
+ */
+ if (NumCookies <= max_cookies_domain
+ && cookie_len <= max_cookies_buffer
+ && cur_cookie != NULL) {
+ if (SetCookie2 != NULL) {
+ AssumeCookieVersion(cur_cookie);
+ cur_cookie->quoted = TRUE;
+ }
+ HTList_appendObject(CombinedCookies, cur_cookie);
+ } else if (cur_cookie != NULL) {
+ CTrace((tfp, "LYProcessSetCookies: Rejecting Set-Cookie: %s=%s\n",
+ (cur_cookie->name ? cur_cookie->name : "[no name]"),
+ (cur_cookie->value ? cur_cookie->value : "[no value]")));
+ CTrace((tfp, " due to excessive %s%s%s\n",
+ (cookie_len > max_cookies_buffer ? "length" : ""),
+ (cookie_len > max_cookies_buffer && NumCookies > max_cookies_domain
+ ? " and "
+ : ""),
+ (NumCookies > max_cookies_domain ? "number!\n" : "!\n")));
+ freeCookie(cur_cookie);
+ cur_cookie = NULL;
+ }
+
+ /*
+ * OK, now we can actually store any cookies in the CombinedCookies list.
+ * - FM
+ */
+ cl = CombinedCookies;
+ while (NULL != (co = (cookie *) HTList_nextObject(cl))) {
+ CTrace((tfp, "LYProcessSetCookie: attr=value pair: '%s=%s'\n",
+ (co->name ? co->name : "[no name]"),
+ (co->value ? co->value : "[no value]")));
+ if (co->expires > 0) {
+ CTrace((tfp, " expires: %" PRI_time_t ", %s\n",
+ CAST_time_t (co->expires),
+ ctime(&co->expires)));
+ }
+ if (isHTTPS_URL(address) &&
+ LYForceSSLCookiesSecure == TRUE &&
+ !(co->flags & COOKIE_FLAG_SECURE)) {
+ co->flags |= COOKIE_FLAG_SECURE;
+ CTrace((tfp, " Forced the 'secure' flag on.\n"));
+ }
+ store_cookie(co, hostname, path);
+ }
+ HTList_delete(CombinedCookies);
+ CombinedCookies = NULL;
+
+ return;
+}
+
+/*
+ * Entry function for handling Set-Cookie: and/or Set-Cookie2:
+ * reply headers. They may have been concatenated as comma
+ * separated lists in HTTP.c or HTMIME.c. - FM
+ */
+void LYSetCookie(const char *SetCookie,
+ const char *SetCookie2,
+ const char *address)
+{
+ BOOL BadHeaders = FALSE;
+ char *hostname = NULL, *path = NULL, *ptr;
+ int port = 80;
+
+ /*
+ * Get the hostname, port and path of the address, and report the
+ * Set-Cookie and/or Set-Cookie2 header(s) if trace mode is on, but set the
+ * cookie(s) only if LYSetCookies is TRUE. - FM
+ */
+ if (((hostname = HTParse(address, "", PARSE_HOST)) != NULL) &&
+ (ptr = StrChr(hostname, ':')) != NULL) {
+ /*
+ * Replace default port number.
+ */
+ *ptr = '\0';
+ ptr++;
+ port = atoi(ptr);
+ } else if (isHTTPS_URL(address)) {
+ port = 443;
+ }
+
+ /*
+ * Get the path from the request URI.
+ */
+ if ((path = HTParse(address, "", PARSE_PATH | PARSE_PUNCTUATION)) != NULL) {
+ /*
+ * Trim off any parameters to provide something that we can compare
+ * against the cookie's path for verifying if it has the proper prefix.
+ */
+ if ((ptr = StrChr(path, '?')) != NULL) {
+ CTrace((tfp, "discarding params \"%s\" in request URI\n", ptr));
+ *ptr = '\0';
+ }
+ /* trim a trailing slash, unless we have only a "/" */
+ if ((ptr = strrchr(path, '/')) != NULL) {
+ if (ptr == path) {
+ ++ptr;
+ }
+ CTrace((tfp, "discarding \"%s\" from request URI\n", ptr));
+ *ptr = '\0';
+ }
+ }
+
+ if (isEmpty(SetCookie) &&
+ isEmpty(SetCookie2)) {
+ /*
+ * Yuk, something must have gone wrong in HTMIME.c or HTTP.c because
+ * both SetCookie and SetCookie2 are NULL or zero-length. - FM
+ */
+ BadHeaders = TRUE;
+ }
+ CTrace((tfp, "LYSetCookie called with host '%s', path '%s',\n",
+ NonNull(hostname),
+ NonNull(path)));
+ if (SetCookie) {
+ CTrace((tfp, " and Set-Cookie: '%s'\n", SetCookie));
+ }
+ if (SetCookie2) {
+ CTrace((tfp, " and Set-Cookie2: '%s'\n", SetCookie2));
+ }
+ if (LYSetCookies == FALSE || BadHeaders == TRUE) {
+ CTrace((tfp, " Ignoring this Set-Cookie/Set-Cookie2 request.\n"));
+ }
+
+ /*
+ * We're done if LYSetCookies is off or we have bad headers. - FM
+ */
+ if (LYSetCookies == FALSE || BadHeaders == TRUE) {
+ FREE(hostname);
+ FREE(path);
+ return;
+ }
+
+ /*
+ * Process the header(s).
+ */
+ LYProcessSetCookies(SetCookie, SetCookie2, address, hostname, path, port);
+ FREE(hostname);
+ FREE(path);
+ return;
+}
+
+/*
+ * Entry function from creating a Cookie: request header
+ * if needed. - AK & FM
+ */
+char *LYAddCookieHeader(char *hostname,
+ char *path,
+ int port,
+ int secure)
+{
+ char *header = NULL;
+ HTList *hl = domain_list, *next = NULL;
+ domain_entry *de;
+
+ CTrace((tfp, "LYCookie: Searching for '%s:%d', '%s'.\n",
+ NONNULL(hostname),
+ port,
+ NONNULL(path)));
+
+ /*
+ * Search the cookie_list elements in the domain_list for any cookies
+ * associated with the //hostname:port/path
+ */
+ while (hl) {
+ de = (domain_entry *) hl->object;
+ next = hl->next;
+
+ if (de != NULL) {
+ if (!HTList_isEmpty(de->cookie_list)) {
+ /*
+ * Scan the domain's cookie_list for any cookies we should
+ * include in our request header.
+ */
+ header = scan_cookie_sublist(hostname, path, port,
+ de->cookie_list, header, secure);
+ } else if (de->bv == QUERY_USER && de->invcheck_bv == DEFAULT_INVCHECK_BV) {
+ /*
+ * No cookies in this domain, and no default accept/reject
+ * choice was set by the user, so delete the domain. - FM
+ */
+ freeCookies(de);
+ HTList_removeObject(domain_list, de);
+ FREE(de);
+ }
+ }
+ hl = next;
+ }
+ if (header)
+ return (header);
+
+ return (NULL);
+}
+
+#ifdef USE_PERSISTENT_COOKIES
+static int number_of_file_cookies = 0;
+
+/* rjp - cookie loading */
+void LYLoadCookies(char *cookie_file)
+{
+ FILE *cookie_handle;
+ char *buf = NULL;
+ static char domain[256], path[LY_MAXPATH], name[256], value[4100];
+ static char what[8], secure[8], expires_a[16];
+ /* *INDENT-OFF* */
+ static struct {
+ char *s;
+ size_t n;
+ } tok_values[] = {
+ { domain, sizeof(domain) },
+ { what, sizeof(what) },
+ { path, sizeof(path) },
+ { secure, sizeof(secure) },
+ { expires_a, sizeof(expires_a) },
+ { name, sizeof(name) },
+ { value, sizeof(value) },
+ { NULL, 0 }
+ };
+ /* *INDENT-ON* */
+
+ time_t expires;
+
+ cookie_handle = fopen(cookie_file, TXT_R);
+ if (!cookie_handle)
+ return;
+
+ CTrace((tfp, "LYLoadCookies: reading cookies from %s\n", cookie_file));
+
+ number_of_file_cookies = 0;
+ while (LYSafeGets(&buf, cookie_handle) != 0) {
+ cookie *moo;
+ int tok_loop;
+ char *tok_out, *tok_ptr;
+
+ LYTrimNewline(buf);
+ if (buf[0] == '\0' || buf[0] == '#') {
+ continue;
+ }
+
+ number_of_file_cookies++;
+
+ strcat(buf, "\t"); /* add sep after line if enough space - kw */
+
+ /*
+ * Tokenise the cookie line into its component parts -
+ * this only works for Netscape style cookie files at the
+ * moment. It may be worth investigating an alternative
+ * format for Lynx because the Netscape format isn't all
+ * that useful, or future-proof. - RP
+ *
+ * 'fixed' by using strsep instead of strtok. No idea
+ * what kind of platform problems this might introduce. - RP
+ */
+ /*
+ * This fails when the path is blank
+ *
+ * sscanf(buf, "%s\t%s\t%s\t%s\t%d\t%s\t%[ -~]",
+ * domain, what, path, secure, &expires, name, value);
+ */
+ CTrace((tfp, "LYLoadCookies: tokenising %s\n", buf));
+ tok_ptr = buf;
+ tok_out = LYstrsep(&tok_ptr, "\t");
+ for (tok_loop = 0; tok_out && tok_values[tok_loop].s; tok_loop++) {
+ CTrace((tfp, "\t%d:[%03d]:[%s]\n",
+ tok_loop, (int) (tok_out - buf), tok_out));
+ LYStrNCpy(tok_values[tok_loop].s,
+ tok_out,
+ (int) tok_values[tok_loop].n);
+ /*
+ * It looks like strtok ignores a leading delimiter,
+ * which makes things a bit more interesting. Something
+ * like "FALSE\t\tFALSE\t" translates to FALSE,FALSE
+ * instead of FALSE,,FALSE. - RP
+ */
+ tok_out = LYstrsep(&tok_ptr, "\t");
+ }
+
+ if (tok_values[tok_loop].s) {
+ /* tok_out in above loop must have been NULL prematurely - kw */
+ CTrace((tfp,
+ "*** wrong format: not enough tokens, ignoring line!\n"));
+ continue;
+ }
+
+ expires = atol(expires_a);
+ CTrace((tfp, "expires:\t%s\n", ctime(&expires)));
+ moo = newCookie();
+ StrAllocCopy(moo->domain, domain);
+ SetCookieDomain(moo, domain);
+ StrAllocCopy(moo->path, path);
+ StrAllocCopy(moo->name, name);
+ if (value[0] == '"' &&
+ value[1] && value[strlen(value) - 1] == '"' &&
+ value[strlen(value) - 2] != '\\') {
+ value[strlen(value) - 1] = '\0';
+ StrAllocCopy(moo->value, value + 1);
+ moo->quoted = TRUE;
+ } else {
+ StrAllocCopy(moo->value, value);
+ }
+ moo->pathlen = (int) strlen(moo->path);
+ /*
+ * Justification for following flags:
+ * COOKIE_FLAG_FROM_FILE So we know were it comes from.
+ * COOKIE_FLAG_EXPIRES_SET It must have had an explicit
+ * expiration originally, otherwise
+ * it would not be in the file.
+ * COOKIE_FLAG_DOMAIN_SET, We don't know whether these were
+ * COOKIE_FLAG_PATH_SET explicit or implicit, but this
+ * only matters for sending version 1
+ * cookies; the cookies read from the
+ * file are currently treated all like
+ * version 0 (we don't set moo->version)
+ * so $Domain= and $Path= will normally
+ * not be sent to the server. But if
+ * these cookies somehow get mixed with
+ * new version 1 cookies we may end up
+ * sending version 1 to the server, and
+ * in that case we should send $Domain
+ * and $Path. The state-man-mec drafts
+ * and RFC 2109 say that $Domain and
+ * $Path SHOULD be omitted if they were
+ * not given explicitly, but not that
+ * they MUST be omitted.
+ * See 8.2 Cookie Spoofing in draft -10
+ * for a good reason to send them.
+ * However, an explicit domain should be
+ * now prefixed with a dot (unless it is
+ * for a single host), so we check for
+ * that.
+ * COOKIE_FLAG_SECURE Should have "FALSE" for normal,
+ * otherwise set it.
+ */
+ moo->flags |= COOKIE_FLAG_FROM_FILE | COOKIE_FLAG_EXPIRES_SET |
+ COOKIE_FLAG_PATH_SET;
+ if (LeadingDot(domain))
+ moo->flags |= COOKIE_FLAG_DOMAIN_SET;
+ if (secure[0] != 'F')
+ moo->flags |= COOKIE_FLAG_SECURE;
+ /* @@@ Should we set port to 443 if secure is set? @@@ */
+ moo->expires = expires;
+ /*
+ * I don't like using this to store the cookies because it's
+ * designed to store cookies that have been received from an
+ * HTTP request, not from a persistent cookie jar. Hence the
+ * mucking about with the COOKIE_FLAG_FROM_FILE above. - RP
+ */
+ store_cookie(moo, domain, path);
+ }
+ LYCloseInput(cookie_handle);
+}
+
+static FILE *NewCookieFile(char *cookie_file)
+{
+ CTrace((tfp, "LYStoreCookies: save cookies to %s on exit\n", cookie_file));
+ return LYNewTxtFile(cookie_file);
+}
+
+/* rjp - persistent cookie support */
+void LYStoreCookies(char *cookie_file)
+{
+ HTList *dl, *cl;
+ domain_entry *de;
+ cookie *co;
+ FILE *cookie_handle = NULL;
+ time_t now = time(NULL); /* system specific? - RP */
+
+ if (isEmpty(cookie_file) || !strcmp(cookie_file, "/dev/null")) {
+ /* We give /dev/null the Unix meaning, regardless of OS */
+ return;
+ }
+
+ /*
+ * Check whether we have something to do. - FM
+ */
+ if (HTList_isEmpty(domain_list) &&
+ number_of_file_cookies == 0) {
+ /* No cookies now, and haven't read any,
+ * so don't bother updating the file.
+ */
+ return;
+ }
+
+ /* if we read cookies from the file, we'll update it even if now empty */
+ if (number_of_file_cookies != 0) {
+ cookie_handle = NewCookieFile(cookie_file);
+ if (cookie_handle == NULL)
+ return;
+ }
+
+ for (dl = domain_list; dl != NULL; dl = dl->next) {
+ de = (domain_entry *) (dl->object);
+ if (de == NULL)
+ /*
+ * Fote says the first object is NULL. Go with that.
+ */
+ continue;
+
+ /*
+ * Show the domain's cookies. - FM
+ */
+ for (cl = de->cookie_list; cl != NULL; cl = cl->next) {
+ /*
+ * First object is always NULL. - FM
+ */
+ if ((co = (cookie *) cl->object) == NULL)
+ continue;
+
+ CTrace((tfp, "LYStoreCookies: %" PRI_time_t " %s %" PRI_time_t " ",
+ CAST_time_t (now),
+ (now < co->expires) ? "<" : ">",
+ CAST_time_t (co->expires)));
+
+ if ((co->flags & COOKIE_FLAG_DISCARD)) {
+ CTrace((tfp, "not stored - DISCARD\n"));
+ continue;
+ } else if (!(co->flags & COOKIE_FLAG_EXPIRES_SET)) {
+ CTrace((tfp, "not stored - no expiration time\n"));
+ continue;
+ } else if (co->expires <= now) {
+ CTrace((tfp, "not stored - EXPIRED\n"));
+ continue;
+ }
+
+ /* when we're sure we'll write to the file - open it */
+ if (cookie_handle == NULL) {
+ cookie_handle = NewCookieFile(cookie_file);
+ if (cookie_handle == NULL)
+ return;
+ }
+
+ fprintf(cookie_handle, "%s\t%s\t%s\t%s\t%" PRI_time_t
+ "\t%s\t%s%s%s\n",
+ de->ddomain,
+ (co->flags & COOKIE_FLAG_DOMAIN_SET) ? "TRUE" : "FALSE",
+ co->path,
+ (co->flags & COOKIE_FLAG_SECURE) ? "TRUE" : "FALSE",
+ CAST_time_t (co->expires), co->name,
+ (co->quoted ? "\"" : ""),
+ NonNull(co->value),
+ (co->quoted ? "\"" : ""));
+
+ CTrace((tfp, "STORED %s\n", de->ddomain));
+ }
+ }
+ if (cookie_handle != NULL) {
+ LYCloseOutput(cookie_handle);
+ HTSYS_purge(cookie_file);
+ }
+}
+#endif
+
+/*
+ * Check if the given string is completely US-ASCII. If so (and if the
+ * original were hex-encoded), it is likely to be more useful in a decoded
+ * form.
+ */
+static BOOLEAN valueNonAscii(const char *value)
+{
+ BOOLEAN result = FALSE;
+
+ while (*value != '\0') {
+ int ch = UCH(*value++);
+
+ if (ch < 32 || ch > 126) {
+ result = TRUE;
+ break;
+ }
+ }
+
+ return result;
+}
+
+/* LYHandleCookies - F.Macrides (macrides@sci.wfeb.edu)
+ * ---------------
+ *
+ * Lists all cookies by domain, and allows deletions of
+ * individual cookies or entire domains, and changes of
+ * 'allow' settings. The list is invoked via the COOKIE_JAR
+ * command (Ctrl-K), and deletions or changes of 'allow'
+ * settings are done by activating links in that list.
+ * The procedure uses a LYNXCOOKIE: internal URL scheme.
+ *
+ * Semantics:
+ * LYNXCOOKIE:/ Create and load the Cookie Jar Page.
+ * LYNXCOOKIE://domain Manipulate the domain.
+ * LYNXCOOKIE://domain/lynxID Delete cookie with lynxID in domain.
+ *
+ * New functions can be added as extensions to the path, and/or by
+ * assigning meanings to ;parameters, a ?searchpart, and/or #fragments.
+ */
+static int LYHandleCookies(const char *arg,
+ HTParentAnchor *anAnchor,
+ HTFormat format_out,
+ HTStream *sink)
+{
+ HTFormat format_in = WWW_HTML;
+ HTStream *target = NULL;
+ char *buf = NULL;
+ char *domain = NULL;
+ char *lynxID = NULL;
+ HTList *dl, *cl, *next;
+ domain_entry *de;
+ cookie *co;
+ char *name = NULL, *value = NULL, *path = NULL;
+ char *comment = NULL, *Address = NULL, *Title = NULL;
+ int ch;
+
+ /*
+ * Check whether we have something to do. - FM
+ */
+ if (HTList_isEmpty(domain_list)) {
+ HTProgress(COOKIE_JAR_IS_EMPTY);
+ LYSleepMsg();
+ HTNoDataOK = 1;
+ return (HT_NO_DATA);
+ }
+
+ /*
+ * If there's a domain string in the "host" field of the LYNXCOOKIE: URL,
+ * this is a request to delete something or change and 'allow' setting. -
+ * FM
+ */
+ if ((domain = HTParse(arg, "", PARSE_HOST)) != NULL) {
+ if (*domain == '\0') {
+ FREE(domain);
+ } else {
+ /*
+ * If there is a path string (not just a slash) in the LYNXCOOKIE:
+ * URL, that's a cookie's lynxID and this is a request to delete it
+ * from the Cookie Jar. - FM
+ */
+ if ((lynxID = HTParse(arg, "", PARSE_PATH)) != NULL) {
+ if (*lynxID == '\0') {
+ FREE(lynxID);
+ }
+ }
+ }
+ }
+ if (domain) {
+ /*
+ * Seek the domain in the domain_list structure. - FM
+ */
+ if ((de = find_domain_entry(domain)) != NULL) {
+ FREE(domain);
+ /*
+ * We found the domain. Check whether a lynxID is present. - FM
+ */
+ if (lynxID) {
+ /*
+ * Seek and delete the cookie with this lynxID in the domain's
+ * cookie list. - FM
+ */
+ for (cl = de->cookie_list; cl != NULL; cl = cl->next) {
+ if ((co = (cookie *) cl->object) == NULL)
+ /*
+ * First object is always empty. - FM
+ */
+ continue;
+ if (!strcmp(lynxID, co->lynxID)) {
+ /*
+ * We found the cookie. Delete it if confirmed. - FM
+ */
+ if (HTConfirm(DELETE_COOKIE_CONFIRMATION) == FALSE) {
+ FREE(lynxID);
+ HTNoDataOK = 1;
+ return (HT_NO_DATA);
+ }
+ HTList_removeObject(de->cookie_list, co);
+ freeCookie(co);
+ co = NULL;
+ total_cookies--;
+ if ((de->bv == QUERY_USER &&
+ HTList_isEmpty(de->cookie_list)) &&
+ HTConfirm(DELETE_EMPTY_DOMAIN_CONFIRMATION)) {
+ /*
+ * No more cookies in this domain, no default
+ * accept/reject choice was set by the user, and
+ * got confirmation on deleting the domain, so do
+ * it. - FM
+ */
+ freeCookies(de);
+ HTList_removeObject(domain_list, de);
+ FREE(de);
+ HTProgress(DOMAIN_EATEN);
+ } else {
+ HTProgress(COOKIE_EATEN);
+ }
+ LYSleepMsg();
+ HTNoDataOK = 1;
+ break;
+ }
+ }
+ } else {
+ /*
+ * Prompt whether to delete all of the cookies in this domain,
+ * or the domain if no cookies in it, or to change its 'allow'
+ * setting, or to cancel, and then act on the user's response.
+ * - FM
+ */
+ if (HTList_isEmpty(de->cookie_list)) {
+ _statusline(DELETE_DOMAIN_SET_ALLOW_OR_CANCEL);
+ } else {
+ _statusline(DELETE_COOKIES_SET_ALLOW_OR_CANCEL);
+ }
+ HTNoDataOK = 1;
+ while (1) {
+ ch = LYgetch_single();
+#ifdef VMS
+ if (HadVMSInterrupt) {
+ HadVMSInterrupt = FALSE;
+ ch = 'C';
+ }
+#endif /* VMS */
+ switch (ch) {
+ case 'A':
+ /*
+ * Set to accept all cookies from this domain. - FM
+ */
+ de->bv = ACCEPT_ALWAYS;
+ HTUserMsg2(ALWAYS_ALLOWING_COOKIES, de->ddomain);
+ return (HT_NO_DATA);
+
+ case 'C':
+ /*
+ * Cancelled. - FM
+ */
+ reject:
+ HTUserMsg(CANCELLED);
+ return (HT_NO_DATA);
+
+ case 'D':
+ if (HTList_isEmpty(de->cookie_list)) {
+ /*
+ * We had an empty domain, so we were asked to
+ * delete it. - FM
+ */
+ freeCookies(de);
+ HTList_removeObject(domain_list, de);
+ FREE(de);
+ HTProgress(DOMAIN_EATEN);
+ LYSleepMsg();
+ break;
+ }
+ Delete_all_cookies_in_domain:
+ /*
+ * Delete all cookies in this domain. - FM
+ */
+ cl = de->cookie_list;
+ while (cl) {
+ next = cl->next;
+ co = (cookie *) (cl->object);
+ if (co) {
+ HTList_removeObject(de->cookie_list, co);
+ freeCookie(co);
+ co = NULL;
+ total_cookies--;
+ }
+ cl = next;
+ }
+ HTProgress(DOMAIN_COOKIES_EATEN);
+ LYSleepMsg();
+ /*
+ * If a default accept/reject choice is set, we're
+ * done. - FM
+ */
+ if (de->bv != QUERY_USER)
+ return (HT_NO_DATA);
+ /*
+ * Check whether to delete the empty domain. - FM
+ */
+ if (HTConfirm(DELETE_EMPTY_DOMAIN_CONFIRMATION)) {
+ freeCookies(de);
+ HTList_removeObject(domain_list, de);
+ FREE(de);
+ HTProgress(DOMAIN_EATEN);
+ LYSleepMsg();
+ }
+ break;
+
+ case 'P':
+ /*
+ * Set to prompt for cookie acceptance from this
+ * domain. - FM
+ */
+ de->bv = QUERY_USER;
+ HTUserMsg2(PROMPTING_TO_ALLOW_COOKIES, de->ddomain);
+ return (HT_NO_DATA);
+
+ case 'V':
+ /*
+ * Set to reject all cookies from this domain. - FM
+ */
+ de->bv = REJECT_ALWAYS;
+ HTUserMsg2(NEVER_ALLOWING_COOKIES, de->ddomain);
+ if ((!HTList_isEmpty(de->cookie_list)) &&
+ HTConfirm(DELETE_ALL_COOKIES_IN_DOMAIN))
+ goto Delete_all_cookies_in_domain;
+ return (HT_NO_DATA);
+
+ default:
+ if (LYCharIsINTERRUPT(ch))
+ goto reject;
+ continue;
+ }
+ break;
+ }
+ }
+ }
+ if (HTList_isEmpty(domain_list)) {
+ /*
+ * There are no more domains left. Don't delete the domain_list,
+ * otherwise atexit may be called multiple times. - kw
+ */
+ HTProgress(ALL_COOKIES_EATEN);
+ LYSleepMsg();
+ }
+ FREE(domain);
+ FREE(lynxID);
+ return (HT_NO_DATA);
+ }
+
+ /*
+ * If we get to here, it was a LYNXCOOKIE:/ URL for creating and displaying
+ * the Cookie Jar Page, or we didn't find the domain or cookie in a
+ * deletion request. Set up an HTML stream and return an updated Cookie
+ * Jar Page. - FM
+ */
+ target = HTStreamStack(format_in,
+ format_out,
+ sink, anAnchor);
+ if (target == NULL) {
+ HTSprintf0(&buf, CANNOT_CONVERT_I_TO_O,
+ HTAtom_name(format_in), HTAtom_name(format_out));
+ HTAlert(buf);
+ FREE(buf);
+ return (HT_NOT_LOADED);
+ }
+
+ /*
+ * Load HTML strings into buf and pass buf to the target for parsing and
+ * rendering. - FM
+ */
+#define PUTS(buf) (*target->isa->put_block)(target, buf, (int) strlen(buf))
+
+ WriteStreamTitle(target, COOKIE_JAR_TITLE);
+ HTSprintf0(&buf, "<h1>%s (%s)%s<a href=\"%s%s\">%s</a></h1>\n",
+ LYNX_NAME, LYNX_VERSION,
+ HELP_ON_SEGMENT,
+ helpfilepath, COOKIE_JAR_HELP, COOKIE_JAR_TITLE);
+ PUTS(buf);
+
+ HTSprintf0(&buf, "<div><em>Note:</em> %s\n", ACTIVATE_TO_GOBBLE);
+ PUTS(buf);
+ HTSprintf0(&buf, "%s</div>\n", OR_CHANGE_ALLOW);
+ PUTS(buf);
+
+ HTSprintf0(&buf, "<dl compact>\n");
+ PUTS(buf);
+ for (dl = domain_list; dl != NULL; dl = dl->next) {
+ de = (domain_entry *) (dl->object);
+ if (de == NULL)
+ /*
+ * First object always is NULL. - FM
+ */
+ continue;
+
+ /*
+ * Show the domain link and 'allow' setting. - FM
+ */
+ HTSprintf0(&buf,
+ "<dt>%s<dd><a href=\"%s//%s/\"><em>Domain:</em> %s</a>\n",
+ de->ddomain, STR_LYNXCOOKIE, de->ddomain, de->ddomain);
+ PUTS(buf);
+ switch (de->bv) {
+ case (ACCEPT_ALWAYS):
+ HTSprintf0(&buf, COOKIES_ALWAYS_ALLOWED);
+ break;
+ case (REJECT_ALWAYS):
+ HTSprintf0(&buf, COOKIES_NEVER_ALLOWED);
+ break;
+ case (QUERY_USER):
+ HTSprintf0(&buf, COOKIES_ALLOWED_VIA_PROMPT);
+ break;
+ }
+ PUTS(buf);
+ HTSprintf0(&buf, "\n");
+ PUTS(buf);
+
+ /*
+ * Show the domain's cookies. - FM
+ */
+ for (cl = de->cookie_list; cl != NULL; cl = cl->next) {
+ if ((co = (cookie *) cl->object) == NULL)
+ /*
+ * First object is always NULL. - FM
+ */
+ continue;
+
+ /*
+ * Show the name=value pair. - FM
+ */
+ if (co->name) {
+ StrAllocCopy(name, co->name);
+ LYEntify(&name, TRUE);
+ } else {
+ StrAllocCopy(name, NO_NAME);
+ }
+ if (co->value) {
+ StrAllocCopy(value, co->value);
+ HTUnEscape(value);
+ if (valueNonAscii(value))
+ strcpy(value, co->value);
+ LYEntify(&value, TRUE);
+ } else {
+ StrAllocCopy(value, NO_VALUE);
+ }
+ HTSprintf0(&buf, "<dd><a href=\"%s//%s/%s\"><em>%s</em>=%s</a>\n",
+ STR_LYNXCOOKIE, de->ddomain, co->lynxID, name, value);
+ FREE(name);
+ FREE(value);
+ PUTS(buf);
+
+ if (co->flags & COOKIE_FLAG_FROM_FILE) {
+ HTSprintf0(&buf, "%s\n",
+ gettext("(from a previous session)"));
+ PUTS(buf);
+ }
+
+ /*
+ * Show the path, port, secure and discard setting. - FM
+ */
+ if (co->path) {
+ StrAllocCopy(path, co->path);
+ LYEntify(&path, TRUE);
+ } else {
+ StrAllocCopy(path, "/");
+ }
+ HTSprintf0(&buf,
+ "<dd><em>Path:</em> %s\n<dd><em>Port:</em> %d <em>Secure:</em> %s <em>Discard:</em> %s\n",
+ path, co->port,
+ ((co->flags & COOKIE_FLAG_SECURE) ? "YES" : "NO"),
+ ((co->flags & COOKIE_FLAG_DISCARD) ? "YES" : "NO"));
+ FREE(path);
+ PUTS(buf);
+
+ /*
+ * Show the list of acceptable ports, if present. - FM
+ */
+ if (co->PortList) {
+ HTSprintf0(&buf, "<dd><em>PortList:</em> \"%s\"\n", co->PortList);
+ PUTS(buf);
+ }
+
+ /*
+ * Show the commentURL, if we have one. - FM
+ */
+ if (co->commentURL) {
+ StrAllocCopy(Address, co->commentURL);
+ LYEntify(&Address, FALSE);
+ StrAllocCopy(Title, co->commentURL);
+ LYEntify(&Title, TRUE);
+ HTSprintf0(&buf,
+ "<dd><em>CommentURL:</em> <a href=\"%s\">%s</a>\n",
+ Address,
+ Title);
+ FREE(Address);
+ FREE(Title);
+ PUTS(buf);
+ }
+
+ /*
+ * Show the comment, if we have one. - FM
+ */
+ if (co->comment) {
+ StrAllocCopy(comment, co->comment);
+ LYEntify(&comment, TRUE);
+ HTSprintf0(&buf, "<dd><em>Comment:</em> %s\n", comment);
+ FREE(comment);
+ PUTS(buf);
+ }
+
+ /*
+ * Show the Maximum Gobble Date. - FM
+ */
+ HTSprintf0(&buf, "<dd><em>%s</em> %s%s",
+ gettext("Maximum Gobble Date:"),
+ ((co->flags & COOKIE_FLAG_EXPIRES_SET)
+ ?
+ ctime(&co->expires) : END_OF_SESSION),
+ ((co->flags & COOKIE_FLAG_EXPIRES_SET)
+ ?
+ "" : "\n"));
+ PUTS(buf);
+ }
+ HTSprintf0(&buf, "\n");
+ PUTS(buf);
+ }
+ HTSprintf0(&buf, "</dl>\n</body>\n</html>\n");
+ PUTS(buf);
+
+ /*
+ * Free the target to complete loading of the Cookie Jar Page, and report a
+ * successful load. - FM
+ */
+ (*target->isa->_free) (target);
+ FREE(buf);
+ return (HT_LOADED);
+}
+
+/* cookie_domain_flag_set
+ * ----------------------
+ * All purpose function to handle setting domain flags for a
+ * comma-delimited list of domains. cookie_domain_flags handles
+ * invcheck behavior, as well as accept/reject behavior. - BJP
+ */
+static void cookie_domain_flag_set(char *domainstr,
+ int flag)
+{
+ domain_entry *de = NULL;
+ char **str = typecalloc(char *);
+ char *dstr = NULL;
+ char *strsmall = NULL;
+
+ if (str == NULL) {
+ HTAlwaysAlert(gettext("Internal"),
+ gettext("cookie_domain_flag_set error, aborting program"));
+ exit_immediately(EXIT_FAILURE);
+ }
+
+ /*
+ * Is this the first domain we're handling? If so, initialize domain_list.
+ */
+ if (domain_list == NULL) {
+#ifdef LY_FIND_LEAKS
+ atexit(LYCookieJar_free);
+#endif
+ domain_list = HTList_new();
+ total_cookies = 0;
+ }
+
+ StrAllocCopy(dstr, domainstr);
+
+ *str = dstr;
+
+ while ((strsmall = LYstrsep(str, ",")) != 0) {
+
+ if (*strsmall == '\0')
+ /* Never add a domain for empty string. It would actually
+ * make more sense to use strtok here. - kw */
+ continue;
+
+ /*
+ * Check the list of existing domains to see if this is a
+ * re-setting of an already existing domain -- if so, just
+ * change the behavior, if not, create a new domain entry.
+ */
+
+ if ((de = find_domain_entry(strsmall)) == NULL) {
+ de = typecalloc(domain_entry);
+ if (de == NULL)
+ outofmem(__FILE__, "cookie_domain_flag_set");
+
+ de->bv = ACCEPT_ALWAYS;
+ de->invcheck_bv = INVCHECK_QUERY;
+
+ switch (flag) {
+ case (FLAG_ACCEPT_ALWAYS):
+ de->invcheck_bv = DEFAULT_INVCHECK_BV;
+ break;
+ case (FLAG_REJECT_ALWAYS):
+ de->invcheck_bv = DEFAULT_INVCHECK_BV;
+ break;
+ case (FLAG_QUERY_USER):
+ de->invcheck_bv = DEFAULT_INVCHECK_BV;
+ break;
+ case (FLAG_INVCHECK_QUERY):
+ de->bv = QUERY_USER;
+ break;
+ case (FLAG_INVCHECK_STRICT):
+ de->bv = QUERY_USER;
+ break;
+ case (FLAG_INVCHECK_LOOSE):
+ de->bv = QUERY_USER;
+ break;
+ }
+
+ StrAllocCopy(de->domain, strsmall);
+ StrAllocCopy(de->ddomain, SkipLeadingDot(strsmall));
+ de->cookie_list = HTList_new();
+ HTList_appendObject(domain_list, de);
+ }
+ switch (flag) {
+ case (FLAG_ACCEPT_ALWAYS):
+ de->bv = ACCEPT_ALWAYS;
+ break;
+ case (FLAG_REJECT_ALWAYS):
+ de->bv = REJECT_ALWAYS;
+ break;
+ case (FLAG_QUERY_USER):
+ de->bv = QUERY_USER;
+ break;
+ case (FLAG_INVCHECK_QUERY):
+ de->invcheck_bv = INVCHECK_QUERY;
+ break;
+ case (FLAG_INVCHECK_STRICT):
+ de->invcheck_bv = INVCHECK_STRICT;
+ break;
+ case (FLAG_INVCHECK_LOOSE):
+ de->invcheck_bv = INVCHECK_LOOSE;
+ break;
+ }
+ CTrace((tfp,
+ "cookie_domain_flag_set (%s, bv=%u, invcheck_bv=%u)\n",
+ strsmall, de->bv, de->invcheck_bv));
+ }
+
+ FREE(strsmall);
+ FREE(str);
+ FREE(dstr);
+}
+
+/*
+ * If any COOKIE_{ACCEPT,REJECT}_DOMAINS have been defined, process them.
+ * These are comma delimited lists of domains. - BJP
+ *
+ * And for query/strict/loose invalid cookie checking. - BJP
+ */
+void LYConfigCookies(void)
+{
+ static const struct {
+ char **domain;
+ int flag;
+ int once;
+ } table[] = {
+ /* *INDENT-OFF* */
+ { &LYCookieSAcceptDomains, FLAG_ACCEPT_ALWAYS, TRUE },
+ { &LYCookieSRejectDomains, FLAG_REJECT_ALWAYS, TRUE },
+ { &LYCookieSStrictCheckDomains, FLAG_INVCHECK_STRICT, TRUE },
+ { &LYCookieSLooseCheckDomains, FLAG_INVCHECK_LOOSE, TRUE },
+ { &LYCookieSQueryCheckDomains, FLAG_INVCHECK_QUERY, TRUE },
+ { &LYCookieAcceptDomains, FLAG_ACCEPT_ALWAYS, FALSE },
+ { &LYCookieRejectDomains, FLAG_REJECT_ALWAYS, FALSE },
+ { &LYCookieStrictCheckDomains, FLAG_INVCHECK_STRICT, FALSE },
+ { &LYCookieLooseCheckDomains, FLAG_INVCHECK_LOOSE, FALSE },
+ { &LYCookieQueryCheckDomains, FLAG_INVCHECK_QUERY, FALSE },
+ /* *INDENT-ON* */
+
+ };
+ unsigned n;
+
+ CTrace((tfp, "LYConfigCookies\n"));
+ for (n = 0; n < TABLESIZE(table); n++) {
+ if (*(table[n].domain) != NULL) {
+ cookie_domain_flag_set(*(table[n].domain), table[n].flag);
+ /*
+ * Discard the value for system settings after we've used them.
+ * The local settings will be merged with the contents of .lynxrc
+ */
+ if (table[n].once) {
+ FREE(*(table[n].domain));
+ }
+ }
+ }
+}
+
+#ifdef GLOBALDEF_IS_MACRO
+#define _LYCOOKIE_C_GLOBALDEF_1_INIT { "LYNXCOOKIE",LYHandleCookies,0}
+GLOBALDEF(HTProtocol, LYLynxCookies, _LYCOOKIE_C_GLOBALDEF_1_INIT);
+#else
+GLOBALDEF HTProtocol LYLynxCookies =
+{"LYNXCOOKIE", LYHandleCookies, 0};
+#endif /* GLOBALDEF_IS_MACRO */
diff --git a/src/LYCookie.h b/src/LYCookie.h
new file mode 100644
index 0000000..ecbf930
--- /dev/null
+++ b/src/LYCookie.h
@@ -0,0 +1,59 @@
+/* $LynxId: LYCookie.h,v 1.20 2011/06/07 08:29:39 tom Exp $ */
+#ifndef LYCOOKIES_H
+#define LYCOOKIES_H
+
+#ifndef HTUTILS_H
+#include <HTUtils.h>
+#endif
+
+#include <HTList.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ typedef enum {
+ ACCEPT_ALWAYS = 0
+ ,REJECT_ALWAYS
+ ,QUERY_USER
+ } behaviour_t;
+
+ typedef enum {
+ INVCHECK_QUERY = 0
+ ,INVCHECK_STRICT
+ ,INVCHECK_LOOSE
+ } invcheck_behaviour_t;
+
+ typedef enum {
+ FLAG_ACCEPT_ALWAYS = 0
+ ,FLAG_REJECT_ALWAYS
+ ,FLAG_QUERY_USER
+ ,FLAG_FROM_FILE
+ ,FLAG_INVCHECK_QUERY
+ ,FLAG_INVCHECK_STRICT
+ ,FLAG_INVCHECK_LOOSE
+ } cookie_domain_flags;
+
+ struct _domain_entry {
+ char *domain; /* Domain for which these cookies are valid */
+ char *ddomain; /* Domain without leading "." */
+ behaviour_t bv;
+ invcheck_behaviour_t invcheck_bv;
+ HTList *cookie_list;
+ };
+ typedef struct _domain_entry domain_entry;
+
+ extern void LYSetCookie(const char *SetCookie,
+ const char *SetCookie2,
+ const char *address);
+ extern char *LYAddCookieHeader(char *hostname,
+ char *partialpath,
+ int port,
+ int secure);
+ extern void LYStoreCookies(char *cookie_file);
+ extern void LYLoadCookies(char *cookie_file);
+ extern void LYConfigCookies(void);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* LYCOOKIES_H */
diff --git a/src/LYCurses.c b/src/LYCurses.c
new file mode 100644
index 0000000..8857d1c
--- /dev/null
+++ b/src/LYCurses.c
@@ -0,0 +1,3277 @@
+/* $LynxId: LYCurses.c,v 1.200 2023/01/02 23:52:18 tom Exp $ */
+#include <HTUtils.h>
+#include <HTAlert.h>
+
+#ifdef __MINGW32__
+#ifdef UNIX
+#undef UNIX
+#endif /* UNIX */
+#endif /* __MINGW32__ */
+
+#ifdef __DJGPP__
+#include <pc.h>
+#endif /* __DJGPP__ */
+
+#include <LYCurses.h>
+#include <LYStyle.h>
+#include <LYUtils.h>
+#include <LYGlobalDefs.h>
+#include <LYSignal.h>
+#include <LYClean.h>
+#include <LYReadCFG.h>
+#include <LYStrings.h>
+#include <LYCharSets.h>
+#include <UCAux.h>
+#include <HTFont.h>
+
+#include <LYexit.h>
+#include <LYLeaks.h>
+
+#ifdef VMS
+#include <LYMainLoop.h>
+#endif
+
+#if defined(VMS) && defined(__GNUC__)
+#include <gnu_hacks.h>
+#undef LINES
+#undef COLS
+#define LINES lines
+#define COLS cols
+extern int _NOSHARE(LINES);
+extern int _NOSHARE(COLS);
+#endif /* VMS && __GNUC__ */
+
+#ifdef USE_COLOR_STYLE
+#include <AttrList.h>
+#include <LYHash.h>
+#endif
+
+#ifdef NEED_WCHAR_H
+#include <wchar.h>
+#endif
+
+#if defined(COLOR_CURSES)
+int lynx_has_color = FALSE;
+#endif
+
+#ifdef HAVE_XCURSES
+char *XCursesProgramName = "Lynx";
+#endif
+
+#ifdef PDCURSES
+#undef HAVE_NEWTERM /* not needed, since /dev/tty is unused */
+#endif
+
+#if defined(USE_COLOR_STYLE) && !defined(USE_COLOR_TABLE)
+#define COLOR_BKGD ((s_normal != NOSTYLE) ? hashStyles[s_normal].color : A_NORMAL)
+#else
+#define COLOR_BKGD ((COLOR_PAIRS >= 9) ? (chtype) get_color_pair(9) : A_NORMAL)
+#endif
+
+#ifdef USE_CURSES_PADS
+WINDOW *LYwin = 0;
+int LYshiftWin = 0;
+int LYwideLines = FALSE;
+int LYtableCols = 0; /* in 1/12 of screen width */
+BOOLEAN LYuseCursesPads = TRUE; /* use pads for left/right shifting */
+#endif
+
+/*
+ * These are routines to start and stop curses and to cleanup the screen at the
+ * end.
+ */
+
+static int dumbterm(char *terminal);
+BOOLEAN LYCursesON = FALSE;
+
+#if defined(USE_BLINK) && defined(__EMX__)
+static void make_blink_boldbg(void);
+#endif
+
+#if defined(USE_COLOR_TABLE) || defined(USE_SLANG)
+int Current_Attr;
+static int Masked_Attr;
+#endif
+
+#ifdef USE_SLANG
+unsigned Lynx_Color_Flags = 0;
+BOOLEAN FullRefresh = FALSE;
+int curscr = 0;
+
+void LY_SLrefresh(void)
+{
+ if (FullRefresh) {
+ SLsmg_suspend_smg();
+ SLsmg_resume_smg();
+ FullRefresh = FALSE;
+ } else {
+ SLsmg_refresh();
+ }
+
+ return;
+}
+
+/* the following renamed from LY_SLclear since it is more like erase()
+ described in curses man pages than like clear(); but for USE_SLANG
+ clear() is still a macro calling this, and will do the same thing as
+ erase(). - kw */
+void LY_SLerase(void)
+{
+ SLsmg_gotorc(0, 0);
+ SLsmg_erase_eos();
+}
+
+#ifdef VMS
+void VTHome(void)
+{
+ printf("\033[;H");
+
+ return;
+}
+#endif /* VMS */
+
+void LYaddAttr(int a)
+{
+ Current_Attr |= a;
+ SLsmg_set_color((SLsmg_Color_Type) (Current_Attr & ~Masked_Attr));
+}
+
+void LYsubAttr(int a)
+{
+ Current_Attr &= ~a;
+ SLsmg_set_color((SLsmg_Color_Type) (Current_Attr & ~Masked_Attr));
+}
+
+static void lynx_setup_attrs(void)
+{
+ static int monoattr[] =
+ {
+ 0,
+ SLTT_BOLD_MASK,
+ SLTT_REV_MASK,
+ SLTT_REV_MASK | SLTT_BOLD_MASK,
+ SLTT_ULINE_MASK,
+ SLTT_ULINE_MASK | SLTT_BOLD_MASK,
+ SLTT_ULINE_MASK | SLTT_REV_MASK,
+ SLTT_ULINE_MASK | SLTT_BOLD_MASK | SLTT_REV_MASK
+ };
+ int n;
+
+ for (n = 1; n <= 7; n++)
+ SLtt_set_mono(n, NULL, (SLtt_Char_Type) (monoattr[n] & ~Masked_Attr));
+}
+
+void lynx_setup_colors(void)
+{
+ CTRACE((tfp, "lynx_setup_colors\n"));
+ SLtt_set_color(0, NULL, DEFAULT_FG, DEFAULT_BG);
+ SLtt_set_color(1, NULL, "blue", DEFAULT_BG); /* bold */
+ SLtt_set_color(2, NULL, "yellow", "blue"); /* reverse */
+ SLtt_set_color(4, NULL, "magenta", DEFAULT_BG); /* underline */
+ /*
+ * The other objects are '|'ed together to get rest.
+ */
+ SLtt_set_color(3, NULL, "green", DEFAULT_BG); /* bold-reverse */
+ SLtt_set_color(5, NULL, "blue", DEFAULT_BG); /* bold-underline */
+ SLtt_set_color(6, NULL, "red", DEFAULT_BG); /* reverse-underline */
+ SLtt_set_color(7, NULL, "magenta", "cyan"); /* reverse-underline-bold */
+ /*
+ * Now set monochrome attributes.
+ */
+ lynx_setup_attrs();
+}
+
+static void sl_suspend(int sig)
+{
+#ifdef SIGSTOP
+#ifndef VMS
+ int r, c;
+
+ lynx_enable_mouse(0);
+ if (sig == SIGTSTP)
+ SLsmg_suspend_smg();
+ SLang_reset_tty();
+ kill(getpid(), SIGSTOP);
+#if SLANG_VERSION > 9929
+ SLang_init_tty(-1, 0, 1);
+#else
+ SLang_init_tty(3, 0, 1);
+#endif /* SLANG_VERSION > 9929 */
+ signal(SIGTSTP, sl_suspend);
+#if defined(REAL_UNIX_SYSTEM) && !defined(__CYGWIN__)
+ SLtty_set_suspend_state(1);
+#endif
+ if (sig == SIGTSTP)
+ SLsmg_resume_smg();
+ /*
+ * Get new window size in case it changed.
+ */
+ r = SLtt_Screen_Rows;
+ c = SLtt_Screen_Cols;
+ size_change(0);
+ if ((r != SLtt_Screen_Rows) || (c != SLtt_Screen_Cols)) {
+ recent_sizechange = TRUE;
+ }
+ lynx_enable_mouse(1);
+#endif /* !VMS */
+#endif /* SIGSTOP */
+ return;
+}
+#else
+
+#ifdef FANCY_CURSES
+
+#ifndef VMS
+/* *INDENT-OFF* */
+/* definitions for the mono attributes we can use */
+static struct {
+ const char *name;
+ int code;
+} Mono_Attrs[7] =
+{
+ { "normal", A_NORMAL },
+ { "bold", A_BOLD },
+ { "reverse", A_REVERSE },
+ { "underline", A_UNDERLINE },
+ { "standout", A_STANDOUT },
+ { "blink", A_BLINK },
+ { "dim", A_DIM },
+};
+/* *INDENT-ON* */
+
+int string_to_attr(const char *name)
+{
+ unsigned i;
+
+ for (i = 0; i < TABLESIZE(Mono_Attrs); i++) {
+ if (!strcasecomp(Mono_Attrs[i].name, name)) {
+ return Mono_Attrs[i].code;
+ }
+ }
+ return 0;
+}
+#endif /* VMS */
+
+#ifdef USE_COLOR_STYLE
+static char *attr_to_string(int code)
+{
+ static char *result;
+
+ if (code >= 0) {
+ unsigned i;
+ int pair = PAIR_NUMBER((unsigned) code);
+ int bold = (pair != 0 && ((unsigned) code & A_BOLD) != 0);
+
+ StrAllocCopy(result, "");
+
+ if (bold)
+ code &= (int) ~A_BOLD;
+
+ for (i = 0; i < TABLESIZE(Mono_Attrs); i++) {
+ if (Mono_Attrs[i].code & code) {
+ if (non_empty(result))
+ StrAllocCat(result, "+");
+ StrAllocCat(result, Mono_Attrs[i].name);
+ }
+ }
+ if (pair != 0) {
+ short f, b;
+
+ if (pair_content((short) pair, &f, &b) != ERR) {
+ if (non_empty(result))
+ StrAllocCat(result, "+");
+ StrAllocCat(result, lookup_color(bold ? f + COLORS : f));
+ StrAllocCat(result, "/");
+ StrAllocCat(result, lookup_color(b));
+ }
+ }
+ } else {
+ FREE(result);
+ }
+ return result;
+}
+#endif /* USE_COLOR_STYLE */
+#endif /* FANCY_CURSES */
+#endif /* USE_SLANG */
+
+/*
+ * This function boxes windows for (n)curses.
+ */
+void LYbox(WINDOW * win, int formfield GCC_UNUSED)
+{
+#ifdef USE_SLANG
+ SLsmg_draw_box(win->top_y,
+ win->left_x,
+ (unsigned) win->height,
+ (unsigned) win->width + 4);
+#else
+#ifdef VMS
+ /*
+ * This should work for VAX-C and DEC-C, since they both have the same
+ * win._max_y and win._max_x members -TD
+ *
+ * (originally VMSbox by FM)
+ */
+ int i;
+
+ wmove(win, 0, 0);
+ waddstr(win, "\033)0\016l");
+ for (i = 1; i < win->_max_x; i++)
+ waddch(win, 'q');
+ waddch(win, 'k');
+ for (i = 1; i < win->_max_y - 1; i++) {
+ wmove(win, i, 0);
+ waddch(win, 'x');
+ wmove(win, i, win->_max_x - 1);
+ waddch(win, 'x');
+ }
+ wmove(win, i, 0);
+ waddch(win, 'm');
+ for (i = 1; i < win->_max_x; i++)
+ waddch(win, 'q');
+ waddstr(win, "j\017");
+#else /* !VMS */
+ int boxvert, boxhori;
+
+ UCSetBoxChars(current_char_set, &boxvert, &boxhori, BOXVERT, BOXHORI);
+#ifdef CSS
+ if (formfield)
+ wcurses_css(win, "frame", ABS_ON);
+#endif
+ /*
+ * If we don't have explicitly specified characters for either vertical or
+ * horizontal lines, the characters that box() would use for the corners
+ * probably also won't work well. So we specify our own ASCII characters
+ * for the corners and call wborder() instead of box(). - kw
+ */
+ LynxWChangeStyle(win, s_menu_frame, STACK_ON);
+#ifdef HAVE_WBORDER
+ if (!boxvert || !boxhori) {
+ box(win,
+ (chtype) boxvert,
+ (chtype) boxhori);
+ } else if (boxvert == '*' || boxhori == '*') {
+ wborder(win,
+ (chtype) boxvert,
+ (chtype) boxvert,
+ (chtype) boxhori,
+ (chtype) boxhori,
+ '*', '*', '*', '*');
+ } else {
+ wborder(win,
+ (chtype) boxvert,
+ (chtype) boxvert,
+ (chtype) boxhori,
+ (chtype) boxhori,
+ '/', '\\', '\\', '/');
+ }
+#else
+ box(win, boxvert, boxhori);
+#endif
+ LynxWChangeStyle(win, s_menu_frame, STACK_OFF);
+#ifdef CSS
+ if (formfield)
+ wcurses_css(win, "frame", ABS_OFF);
+#endif
+#endif /* VMS */
+ wrefresh(win);
+#endif /* USE_SLANG */
+}
+
+#if defined(USE_COLOR_STYLE)
+/* Ok, explanation of the USE_COLOR_STYLE styles. The basic styles (ie non
+ * HTML) are set the same as the SLANG version for ease of programming. The
+ * other styles are simply the HTML enum from HTMLDTD.h + 16.
+ */
+HTCharStyle displayStyles[DSTYLE_ELEMENTS];
+
+/*
+ * set a style's attributes - RP
+ */
+void setStyle(int style,
+ int color,
+ int cattr,
+ int mono)
+{
+ displayStyles[style].color = color;
+ displayStyles[style].cattr = cattr;
+ displayStyles[style].mono = mono;
+}
+
+void setHashStyle(int style,
+ int color,
+ int cattr,
+ int mono,
+ const char *element)
+{
+ bucket *ds = &hashStyles[style];
+
+ CTRACE2(TRACE_STYLE,
+ (tfp, "CSS(SET): <%s> hash=%d, ca=%#x, ma=%#x\n",
+ element, style, (unsigned) color, (unsigned) mono));
+
+ ds->used = TRUE;
+ ds->color = color;
+ ds->cattr = cattr;
+ ds->mono = mono;
+}
+
+/*
+ * set the curses attributes to be color or mono - RP
+ */
+static void LYAttrset(WINDOW * win, int color,
+ int mono)
+{
+ char *shown = NULL;
+
+ if (lynx_has_color
+ && LYShowColor >= SHOW_COLOR_ON
+ && color >= 0) {
+ CTRACE2(TRACE_STYLE, (tfp, "CSS:LYAttrset color %#x -> (%s)\n",
+ (unsigned) color,
+ shown = attr_to_string(color)));
+ (void) wattrset(win, color);
+ } else if (mono >= 0) {
+ CTRACE2(TRACE_STYLE, (tfp, "CSS:LYAttrset mono %#x -> (%s)\n",
+ (unsigned) mono,
+ shown = attr_to_string(mono)));
+ (void) wattrset(win, mono);
+ } else {
+ CTRACE2(TRACE_STYLE, (tfp, "CSS:LYAttrset (A_NORMAL)\n"));
+ (void) wattrset(win, A_NORMAL);
+ }
+ if (shown != NULL)
+ (void) attr_to_string(-1);
+}
+
+void curses_w_style(WINDOW * win, int style,
+ int dir)
+{
+ int YP, XP;
+ bucket *ds;
+ BOOL free_ds = TRUE;
+
+ switch (style) {
+ case NOSTYLE:
+ ds = nostyle_bucket();
+ break;
+ default:
+ ds = &hashStyles[style];
+ free_ds = FALSE;
+ break;
+ }
+
+ if (!ds->used) {
+ CTRACE2(TRACE_STYLE, (tfp, "CSS.CS:Style %d not configured\n", style));
+ if (free_ds)
+ free(ds);
+ return;
+ }
+
+ CTRACE2(TRACE_STYLE, (tfp, "CSS.CS:<%s%s> style %d color %#x\n",
+ (dir ? "" : "/"),
+ ds->name,
+ style,
+ (unsigned) ds->color));
+
+ getyx(win, YP, XP);
+
+ if (style == s_normal && dir) {
+ LYAttrset(win, ds->color, ds->mono);
+ if (win == LYwin)
+ SetCachedStyle(YP, XP, (unsigned) s_normal);
+ if (free_ds)
+ free(ds);
+ return;
+ }
+
+ switch (dir) {
+ /* ABS_OFF is the same as STACK_OFF for the moment */
+ case STACK_OFF:
+ if (last_colorattr_ptr) {
+ int last_attr = last_styles[--last_colorattr_ptr];
+
+ LYAttrset(win, last_attr, last_attr);
+ } else
+ LYAttrset(win, A_NORMAL, -1);
+ break;
+
+ case STACK_ON: /* remember the current attributes */
+ if (last_colorattr_ptr >= MAX_LAST_STYLES) {
+ CTRACE2(TRACE_STYLE, (tfp, "........... %s (0x%x) %s\r\n",
+ "attribute cache FULL, dropping last",
+ (unsigned) last_styles[last_colorattr_ptr],
+ "in LynxChangeStyle(curses_w_style)"));
+ last_colorattr_ptr = MAX_LAST_STYLES - 1;
+ }
+ last_styles[last_colorattr_ptr++] = (int) LYgetattrs(win);
+ /* don't cache style changes for active links */
+ /* FALL THROUGH */
+ case ABS_ON: /* change without remembering the previous style */
+ /* don't cache style changes for active links and edits */
+ if (style != s_alink
+ && style != s_curedit
+ && style != s_aedit
+ && style != s_aedit_sel
+ && style != s_aedit_pad
+ && style != s_aedit_arr) {
+ CTRACE2(TRACE_STYLE, (tfp, "CACHED: <%s> @(%d,%d)\n",
+ ds->name, YP, XP));
+ if (win == LYwin)
+ SetCachedStyle(YP, XP, (unsigned) style);
+ }
+ LYAttrset(win, ds->color, ds->mono);
+ break;
+ }
+
+ if (free_ds)
+ free(ds);
+
+ return;
+}
+
+/*
+ * wrapper function to set on-screen styles - RP
+ */
+void wcurses_css(WINDOW * win, char *name,
+ int dir)
+{
+ int try_again = 1;
+
+ while (try_again) {
+ int tmpHash = color_style_1(name);
+
+ CTRACE2(TRACE_STYLE, (tfp, "CSSTRIM:trying to set [%s] style - ", name));
+ if (tmpHash == NOSTYLE) {
+ char *pclass = strrchr(name, '.');
+
+ CTRACE2(TRACE_STYLE, (tfp, "undefined, trimming at %p\n", (void *) pclass));
+ if (pclass)
+ *pclass = '\0';
+ else
+ try_again = 0;
+ } else {
+ CTRACE2(TRACE_STYLE, (tfp, "ok (%d)\n", tmpHash));
+ curses_w_style(win, tmpHash, dir);
+ try_again = 0;
+ }
+ }
+}
+
+void curses_css(char *name,
+ int dir)
+{
+ wcurses_css(LYwin, name, dir);
+}
+
+void curses_style(int style,
+ int dir)
+{
+ curses_w_style(LYwin, style, dir);
+}
+#endif /* USE_COLOR_STYLE */
+
+static BOOL lynx_called_initscr = FALSE;
+
+#if defined(USE_COLOR_TABLE) && defined(COLOR_CURSES)
+#define COLOR_CFG_MAX 8
+
+/*
+ * This block of code is designed to produce the same color effects using SVr4
+ * curses as the slang library's implementation in this module. That maps the
+ * SGR codes into a 0-7 index into the color table, with special treatment for
+ * backgrounds. There's a bit of convoluted (but necessary) code handling the
+ * special case of initialization before 'initscr()' is called.
+ * 1997/1/19 - T.E.Dickey <dickey@clark.net>
+ */
+/* *INDENT-OFF* */
+#define COLOR_CFG(c) c, (c) == DEFAULT_COLOR
+static struct {
+ int fg, dft_fg, bg, dft_bg;
+} lynx_color_cfg[] = {
+ /*0*/ { COLOR_CFG(DEFAULT_FG), COLOR_CFG(DEFAULT_BG)},
+ /*1*/ { COLOR_CFG(COLOR_BLUE), COLOR_CFG(DEFAULT_BG)},
+ /*2*/ { COLOR_CFG((COLOR_YELLOW)+8), COLOR_CFG(COLOR_BLUE)},
+ /*3*/ { COLOR_CFG(COLOR_GREEN), COLOR_CFG(DEFAULT_BG)},
+ /*4*/ { COLOR_CFG(COLOR_MAGENTA), COLOR_CFG(DEFAULT_BG)},
+ /*5*/ { COLOR_CFG(COLOR_BLUE), COLOR_CFG(DEFAULT_BG)},
+ /*6*/ { COLOR_CFG(COLOR_RED), COLOR_CFG(DEFAULT_BG)},
+ /*7*/ { COLOR_CFG(COLOR_MAGENTA), COLOR_CFG(COLOR_CYAN)}
+};
+/* *INDENT-ON* */
+
+#define COLOR_PAIRS_MAX (COLOR_CFG_MAX * 3 + 1)
+
+/*
+ * Hold the codes for color-pairs here until 'initscr()' is called.
+ */
+static struct {
+ int fg;
+ int bg;
+} lynx_color_pairs[COLOR_PAIRS_MAX];
+
+/*
+ * If we find an exact match for the given default colors, force curses to use
+ * color pair 0, which corresponds to the terminal's default colors. Normally
+ * curses assumes white-on-black, but we can override the assumption with this
+ * function.
+ */
+static int get_color_pair(int n)
+{
+#ifdef USE_CURSES_PAIR_0
+ if ((n < (int) TABLESIZE(lynx_color_pairs))
+ && lynx_color_pairs[n].fg == default_fg
+ && lynx_color_pairs[n].bg == default_bg)
+ return 0;
+#endif
+ return (int) COLOR_PAIR(n);
+}
+
+/*
+ * Lynx "knows" about 16 colors. ANSI colors (and most color terminal
+ * emulators) only go to 8, though some curses implementations (ncurses and
+ * PDCurses) handle 16. If lynx's configuration calls for a color past the
+ * number of colors that the terminal handles (COLORS), map the extra value
+ * to bold.
+ */
+#define is_boldc(c) ((c) > (COLORS-1))
+#define map2bold(c) (is_boldc(c) ? ((c) & (COLORS-1)) : (c))
+
+/*
+ * Return the extra color as A_BOLD.
+ * If there is no extra color, return A_NORMAL.
+ */
+static int lynx_color_cfg_attr(int code)
+{
+ int result = A_NORMAL;
+
+ if (code >= 0 && code < COLOR_CFG_MAX) {
+ int fg = lynx_color_cfg[code].fg;
+
+ if (is_boldc(fg) && (fg & COLORS))
+ result = A_BOLD;
+ }
+ return result;
+}
+
+static int encode_color_attr(int color_attr)
+{
+ int result;
+ int code = 0;
+ int offs = 1;
+
+ if ((unsigned) color_attr & A_BOLD)
+ code |= 1;
+ if ((unsigned) color_attr & (A_REVERSE | A_DIM))
+ code |= 2;
+ if ((unsigned) color_attr & A_UNDERLINE)
+ code |= 4;
+ result = lynx_color_cfg_attr(code);
+
+ if (code + offs < COLOR_PAIRS) {
+ result |= get_color_pair(code + offs);
+ }
+ return result;
+}
+
+static int decode_mono_code(int mono_code)
+{
+ unsigned result = 0;
+
+ if (mono_code & 1)
+ result |= A_BOLD;
+ if (mono_code & 2)
+ result |= A_REVERSE;
+ if (mono_code & 4)
+ result |= A_UNDERLINE;
+
+ return (int) result;
+}
+
+/*
+ * Map the SGR attributes (0-7) into ANSI colors, modified with the actual BOLD
+ * attribute to get 16 colors.
+ */
+int LYgetTableAttr(void)
+{
+ int result;
+
+ if (lynx_has_color && LYShowColor >= SHOW_COLOR_ON) {
+ result = encode_color_attr(Current_Attr);
+ } else {
+ result = Current_Attr;
+ }
+ return result & ~Masked_Attr;
+}
+
+#ifdef USE_COLOR_STYLE
+/*
+ * Return a string that corresponds to the attributes that would be returned by
+ * LYgetTableAttr().
+ */
+char *LYgetTableString(int code)
+{
+ int mask = decode_mono_code(code);
+ int second = encode_color_attr(mask);
+ int pair = PAIR_NUMBER((unsigned) second);
+ int mono = (int) ((unsigned) mask & A_ATTRIBUTES);
+ int fg = lynx_color_pairs[pair].fg;
+ int bg = lynx_color_pairs[pair].bg;
+ unsigned n;
+ char *result = 0;
+
+ CTRACE((tfp, "LYgetTableString(%d)\n", code));
+
+ if (fg == 0 && bg == 0) {
+ fg = COLOR_WHITE;
+ }
+
+ CTRACE((tfp, "%#x -> %#x (mono %#x pair %d) fg=%d, bg=%d\n",
+ (unsigned) mask,
+ (unsigned) second,
+ (unsigned) mono,
+ pair, fg, bg));
+
+ for (n = 0; n < TABLESIZE(Mono_Attrs); ++n) {
+ if ((Mono_Attrs[n].code & mono) != 0) {
+ if (result != 0)
+ StrAllocCat(result, "+");
+ StrAllocCat(result, Mono_Attrs[n].name);
+ }
+ }
+ if (result == 0)
+ StrAllocCopy(result, "normal");
+ StrAllocCat(result, ":");
+ StrAllocCat(result, lookup_color(fg));
+ if (bg >= 0) {
+ StrAllocCat(result, ":");
+ StrAllocCat(result, lookup_color(bg));
+ }
+ CTRACE((tfp, "->%s\n", result));
+ return result;
+}
+#endif
+
+/*
+ * Initialize a curses color-pair based on our configured color values.
+ */
+static void lynx_init_color_pair(int n)
+{
+#ifdef USE_COLOR_STYLE
+ (void) n; /* we only use lynx_color_pairs[] data */
+#else
+ int m;
+
+ if (lynx_called_initscr) {
+ for (m = 0; m <= 16; m += 8) {
+ int pair = n + m + 1;
+
+ if (pair < COLOR_PAIRS)
+ init_pair((short) pair,
+ (short) map2bold(lynx_color_pairs[pair].fg),
+ (short) map2bold(lynx_color_pairs[pair].bg));
+ }
+ if (n == 0 && LYShowColor >= SHOW_COLOR_ON) {
+ wbkgd(LYwin, COLOR_BKGD | ' ');
+ }
+ }
+#endif
+}
+
+static void lynx_map_color(int n)
+{
+ int j;
+
+ CTRACE((tfp, "lynx_map_color(%d)\n", n));
+
+ if (n + 1 < (int) TABLESIZE(lynx_color_pairs)
+ && n < (int) TABLESIZE(lynx_color_cfg)) {
+ for (j = n + 1; j < COLOR_PAIRS_MAX; j += COLOR_CFG_MAX) {
+ lynx_color_pairs[j].fg = lynx_color_cfg[n].fg;
+ lynx_color_pairs[j].bg = lynx_color_cfg[n].bg;
+ }
+
+ /* special case (does not apply to 3rd set) */
+ lynx_color_pairs[n + 1 + COLOR_CFG_MAX].bg = lynx_color_cfg[0].bg;
+ }
+
+ lynx_init_color_pair(n);
+}
+
+/*
+ * Change a configured color value. This may be called before initscr(), so
+ * we may not be able to call init_pair() to finish the change.
+ */
+int lynx_chg_color(int color,
+ int fg,
+ int bg)
+{
+ CTRACE((tfp, "lynx_chg_color(color=%d, fg=%d, bg=%d)\n", color, fg, bg));
+
+ if (fg == ERR_COLOR || bg == ERR_COLOR)
+ return -1;
+ if (color >= 0 && color < COLOR_CFG_MAX) {
+ lynx_color_cfg[color].fg = fg;
+ lynx_color_cfg[color].bg = bg;
+ lynx_map_color(color);
+ } else {
+ return -1;
+ }
+ return 0;
+}
+
+void lynx_set_color(int a)
+{
+ if (lynx_has_color && LYShowColor >= SHOW_COLOR_ON) {
+ (void) wattrset(LYwin, lynx_color_cfg_attr(a)
+ | (((a + 1) < COLOR_PAIRS)
+ ? get_color_pair(a + 1)
+ : (int) A_NORMAL));
+ }
+}
+
+void lynx_standout(int flag)
+{
+ if (flag)
+ LYaddAttr(A_REVERSE);
+ else
+ LYsubAttr(A_REVERSE);
+}
+
+static void lynx_init_colors(void)
+{
+ if (lynx_has_color) {
+ size_t n;
+
+ CTRACE((tfp, "lynx_init_colors (default %d/%d)\n",
+ default_fg, default_bg));
+
+ lynx_color_cfg[0].fg = default_fg;
+ lynx_color_cfg[0].bg = default_bg;
+
+ for (n = 0; n < TABLESIZE(lynx_color_cfg); n++) {
+ lynx_init_color_pair((int) n);
+ }
+ } else if (LYShowColor != SHOW_COLOR_NEVER) {
+ LYShowColor = SHOW_COLOR_OFF;
+ }
+}
+
+void lynx_setup_colors(void)
+{
+ int n;
+
+ CTRACE((tfp, "lynx_setup_colors\n"));
+#ifdef USE_DEFAULT_COLORS
+ if (!LYuse_default_colors) {
+ for (n = 0; n < COLOR_CFG_MAX; n++) {
+ if (lynx_color_cfg[n].dft_fg)
+ lynx_color_cfg[n].fg = COLOR_BLACK;
+ if (lynx_color_cfg[n].dft_bg)
+ lynx_color_cfg[n].bg = COLOR_WHITE;
+ }
+ }
+#endif
+ for (n = 0; n < COLOR_CFG_MAX; n++)
+ lynx_map_color(n);
+}
+#endif /* USE_COLOR_TABLE */
+
+void LYnoVideo(int a)
+{
+ CTRACE((tfp, "LYnoVideo(%d)\n", a));
+#ifdef USE_SLANG
+ if (a & 1)
+ Masked_Attr |= (int) SLTT_BOLD_MASK;
+ if (a & 2)
+ Masked_Attr |= (int) SLTT_REV_MASK;
+ if (a & 4)
+ Masked_Attr |= (int) SLTT_ULINE_MASK;
+ lynx_setup_attrs();
+#else
+#ifdef USE_COLOR_TABLE
+ Masked_Attr = decode_mono_code(a);
+#endif
+#endif
+}
+
+#define NEWTERM_NAME "newterm"
+
+#ifndef USE_SLANG
+static WINDOW *my_subwindow;
+
+#define delete_subwindow() if (my_subwindow) { delwin(my_subwindow); my_subwindow = NULL; }
+#endif
+
+#ifdef WIDEC_CURSES
+static WINDOW *fake_win;
+static int fake_max;
+
+#define delete_fake_win() if (fake_win) { delwin(fake_win); fake_win = NULL; fake_max = 0; }
+#else
+#define delete_fake_win() /* nothing */
+#endif
+
+#if !defined(VMS) && !defined(USE_SLANG)
+#if defined(NCURSES) && defined(HAVE_RESIZETERM)
+
+static SCREEN *LYscreen = NULL;
+
+static void delete_screen(SCREEN * screen)
+{
+ delete_fake_win();
+ delete_subwindow();
+ delscreen(screen);
+}
+
+#define LYDELSCR() /* ncurses does not need this */
+
+#elif defined(HAVE_NEWTERM) && defined(HAVE_DELSCREEN)
+
+static SCREEN *LYscreen = NULL;
+
+#if defined(USE_DEFAULT_COLORS)
+static void delete_screen(SCREEN * screen)
+{
+ delete_fake_win();
+ delete_subwindow();
+ delscreen(screen);
+}
+#endif
+
+#define LYDELSCR() { \
+if (recent_sizechange) { \
+ CTRACE((tfp, "Screen size: delscreen()\n")); \
+ delete_screen(LYscreen); \
+ LYscreen = NULL; } }
+
+#else /* HAVE_NEWTERM */
+
+ /*
+ * If newterm is not defined, assume a curses subset which
+ * supports only initscr. --gil
+ */
+static WINDOW *LYscreen = NULL;
+
+#undef NEWTERM_NAME
+#define NEWTERM_NAME "initscr"
+#undef newterm
+#define newterm(type, out, in) (initscr())
+#define LYDELSCR() /* nothing */
+#endif /* HAVE_NEWTERM */
+
+#else /* !defined(VMS) && !defined(USE_SLANG) */
+
+ /*
+ * Provide last recourse definitions of LYscreen and LYDELSCR for
+ * stop_curses, which only tests LYscreen for zero/nonzero but
+ * never uses it as a pointer or L-value.
+ */
+#define LYscreen TRUE
+#define LYDELSCR() /* nothing */
+#endif /* !defined(VMS) && !defined(USE_SLANG) */
+
+#if defined(PDCURSES) && defined(PDC_BUILD) && PDC_BUILD >= 2401
+int saved_scrsize_x = 0;
+int saved_scrsize_y = 0;
+
+int saved_scrsize_x2 = 0;
+int saved_scrsize_y2 = 0;
+int saved_winpos_x2 = 0;
+int saved_winpos_y2 = 0;
+
+static int LYresize_term(int nlines, int ncols)
+{
+#ifdef _WINDOWS
+ HANDLE hConsole;
+ CONSOLE_SCREEN_BUFFER_INFO csbi;
+ SMALL_RECT srWindowRect;
+
+ hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
+ GetConsoleScreenBufferInfo(hConsole, &csbi);
+ srWindowRect.Right = min(ncols, csbi.dwSize.X) - 1;
+ srWindowRect.Bottom = min(nlines, csbi.dwSize.Y) - 1;
+ srWindowRect.Left = srWindowRect.Top = (SHORT) 0;
+ SetConsoleWindowInfo(hConsole, TRUE, &srWindowRect);
+#endif
+ return resize_term(nlines, ncols);
+}
+#endif
+
+#ifdef USE_MAXSCREEN_TOGGLE
+static HWND currentWindowHandle = NULL;
+static char dummyWindowTitle[256];
+
+static int CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
+{
+ char this_title[256];
+
+ (void) lParam;
+ if (GetWindowText(hwnd, this_title, sizeof(this_title) - 1) &&
+ (strncmp(dummyWindowTitle, this_title, 256) == 0)) {
+ currentWindowHandle = hwnd;
+ return FALSE;
+ }
+ return TRUE;
+}
+
+static void setCurrentWindowHandle(void)
+{
+ char org_title[256];
+ DWORD pid;
+ int i;
+
+ if (currentWindowHandle != NULL) {
+ return;
+ }
+ pid = GetCurrentProcessId();
+ sprintf(dummyWindowTitle, "Lynx for Win32 (pid=%ld)", pid);
+ GetConsoleTitle(org_title, sizeof(org_title) - 1);
+ SetConsoleTitle(dummyWindowTitle);
+ for (i = 0; i < 10; i++) {
+ EnumWindows(EnumWindowsProc, (LPARAM) 0);
+ if (currentWindowHandle != NULL) {
+ break;
+ }
+ CTRACE((tfp,
+ "Failed to get current window handle. Try again...(%d)\n", i));
+ Sleep(100);
+ }
+ SetConsoleTitle(org_title);
+}
+
+static void moveWindowHXY(HWND hwnd, int x, int y)
+{
+ int win_height, win_width;
+ RECT winrect;
+
+ GetWindowRect(hwnd, &winrect);
+ win_width = winrect.right - winrect.left;
+ win_height = winrect.bottom - winrect.top;
+
+ if ((x != winrect.left) || (y != winrect.top)) {
+ MoveWindow(hwnd, x, y, win_width, win_height, TRUE);
+ CTRACE((tfp, "move window from (%d,%d) to (%d,%d).\n",
+ (int) winrect.left,
+ (int) winrect.top, x, y));
+ }
+}
+
+static void adjustWindowPos(void)
+{
+ int disp_height, disp_width, win_height, win_width;
+ int newwin_left, newwin_top;
+ RECT winrect;
+ DWORD pid;
+
+ setCurrentWindowHandle();
+ if (currentWindowHandle == NULL) {
+ return;
+ }
+ GetWindowThreadProcessId(currentWindowHandle, &pid);
+ disp_width = GetSystemMetrics(SM_CXFULLSCREEN);
+ disp_height = GetSystemMetrics(SM_CYFULLSCREEN);
+ Sleep(100); /* If not, GetWindowRect sometimes return wrong value. */
+ GetWindowRect(currentWindowHandle, &winrect);
+ win_width = winrect.right - winrect.left;
+ win_height = winrect.bottom - winrect.top;
+ CTRACE((tfp, "Display Size: (%4d,%3d)\n", disp_width, disp_height));
+ CTRACE((tfp, "Orig WinRect: (%4d,%4d,%3d,%3d), ",
+ (int) winrect.left, (int) winrect.right,
+ (int) winrect.top, (int) winrect.bottom));
+ CTRACE((tfp, "Size: (%4d,%3d)\n", win_width, win_height));
+
+ newwin_left = winrect.left;
+ newwin_top = winrect.top;
+ if (disp_width < winrect.right) {
+ if (win_width <= disp_width) {
+ newwin_left = disp_width - win_width;
+ } else {
+ newwin_left = 0;
+ }
+ }
+ if (disp_height < winrect.bottom) {
+ if (win_height <= disp_height) {
+ newwin_top = disp_height - win_height;
+ } else {
+ newwin_top = 0;
+ }
+ }
+
+ moveWindowHXY(currentWindowHandle, newwin_left, newwin_top);
+}
+
+void maxmizeWindowSize(void)
+{
+ RECT winrect;
+ HANDLE hConsole;
+ COORD coordScreen;
+
+ setCurrentWindowHandle();
+ if (currentWindowHandle == NULL) {
+ return;
+ }
+ GetWindowRect(currentWindowHandle, &winrect);
+ saved_winpos_x2 = winrect.left;
+ saved_winpos_y2 = winrect.top;
+
+ hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
+ coordScreen = GetLargestConsoleWindowSize(hConsole);
+
+ LYcols = scrsize_x = coordScreen.X - 1;
+ LYlines = scrsize_y = coordScreen.Y - 1;
+ LYlines--;
+ CTRACE((tfp, "Request maximum screen size: %dx%d\n",
+ scrsize_x, scrsize_y));
+ LYresize_term(scrsize_y, scrsize_x);
+ Sleep(100);
+ moveWindowHXY(currentWindowHandle, 0, 0);
+ LYlines = LYscreenHeight();
+ LYcols = LYscreenWidth();
+ CTRACE((tfp, "...actual maximum screen size: %dx%d\n",
+ LYcols, LYlines));
+ LYStatusLine = -1;
+ recent_sizechange = TRUE;
+}
+
+void recoverWindowSize(void)
+{
+ if ((0 < saved_scrsize_x2) && (0 < saved_scrsize_y2)) {
+ LYcols = scrsize_x = saved_scrsize_x2;
+ LYlines = scrsize_y = saved_scrsize_y2;
+ LYlines--;
+ LYStatusLine = -1;
+ wclear(curscr);
+ doupdate();
+ LYresize_term(scrsize_y, scrsize_x);
+
+ setCurrentWindowHandle();
+ if (currentWindowHandle != NULL) {
+ Sleep(100);
+ moveWindowHXY(currentWindowHandle, saved_winpos_x2, saved_winpos_y2);
+ }
+ recent_sizechange = TRUE;
+ } else {
+ CTRACE((tfp, "scrsize_{xy} is not saved yet.\n"));
+ }
+}
+#endif
+
+#if defined(USE_DEFAULT_COLORS)
+void restart_curses(void)
+{
+ SCREEN *oldscreen = LYscreen;
+
+ if (!(LYscreen = newterm(NULL, stdout, stdin))) { /* start curses */
+ fprintf(tfp, "%s\n",
+ gettext("Terminal reinitialisation failed - unknown terminal type?"));
+ exit_immediately(EXIT_FAILURE);
+ }
+
+ /* force xterm mouse-mode off in the physical terminal */
+ lynx_enable_mouse(0);
+ keypad(LYwin, FALSE);
+ wrefresh(LYwin);
+
+ LYwin = stdscr;
+ /* re-enable xterm mouse-mode in the new screen */
+ keypad(LYwin, TRUE);
+ lynx_enable_mouse(1);
+
+#if defined(USE_KEYMAPS)
+ if (-1 == lynx_initialize_keymaps()) {
+ endwin();
+ exit_immediately(EXIT_FAILURE);
+ }
+#endif
+ if (has_colors()) {
+ start_color();
+ }
+
+ delete_screen(oldscreen);
+}
+#endif
+
+void start_curses(void)
+{
+#ifdef USE_SLANG
+ static int slinit;
+
+ if (LYCursesON) {
+ CTRACE((tfp, "start_curses: Hmm, already ON.\n"));
+ return;
+ }
+
+ if (slinit == 0) {
+#if defined(HAVE_TTYNAME)
+ if (isatty(fileno(stdout)) && LYReopenInput() < 0) {
+ fprintf(stderr, "Cannot open tty input\n");
+ exit_immediately(EXIT_FAILURE);
+ }
+#endif
+#if defined(USE_KEYMAPS)
+ if (-1 == lynx_initialize_keymaps())
+ exit_immediately(EXIT_FAILURE);
+#else
+ SLtt_get_terminfo();
+#endif
+#if (defined(__DJGPP__) && !defined(DJGPP_KEYHANDLER)) || defined(__CYGWIN__)
+ SLkp_init();
+#endif /* __DJGPP__ && !DJGPP_KEYHANDLER */
+
+#if defined(REAL_UNIX_SYSTEM) && !defined(__CYGWIN__)
+#if SLANG_VERSION >= 9935
+ SLang_TT_Read_FD = fileno(stdin);
+#endif /* SLANG_VERSION >= 9935 */
+#endif /* REAL_UNIX_SYSTEM && !__CYGWIN__ */
+
+#if !defined(USE_KEYMAPS) && defined(ENHANCED_LINEEDIT) && defined(ESCDELAY)
+ /* way to get ESC that's not part of a recognized sequence through */
+ ESCDELAY = 2000;
+#endif
+ /*
+ * Check whether a saved show_color:off override is in effect. - kw
+ */
+ if (LYrcShowColor == SHOW_COLOR_NEVER) {
+ SLtt_Use_Ansi_Colors = 0;
+ }
+ /*
+ * Check whether we're forcing color on. - FM
+ */
+ if ((LYShowColor > 1) && (Lynx_Color_Flags & SL_LYNX_USE_COLOR))
+ SLtt_Use_Ansi_Colors = 1;
+ /*
+ * Check whether a -nocolor override is in effect. - kw
+ */
+ if (Lynx_Color_Flags & SL_LYNX_OVERRIDE_COLOR)
+ SLtt_Use_Ansi_Colors = 0;
+ /*
+ * Make sure our flags are in register. - FM
+ */
+ if (SLtt_Use_Ansi_Colors == 1) {
+ if (LYShowColor != SHOW_COLOR_ALWAYS) {
+ LYShowColor = SHOW_COLOR_ON;
+ }
+ } else {
+ if (LYShowColor != SHOW_COLOR_NEVER) {
+ LYShowColor = SHOW_COLOR_OFF;
+ }
+ }
+ size_change(0);
+
+#if (defined(VMS) || defined(REAL_UNIX_SYSTEM)) && !defined(__CYGWIN__)
+ if ((Masked_Attr & (int) SLTT_ULINE_MASK) == 0) {
+ SLtt_add_color_attribute(4, SLTT_ULINE_MASK);
+ SLtt_add_color_attribute(5, SLTT_ULINE_MASK);
+ }
+ /*
+ * If set, the blink escape sequence will turn on high intensity
+ * background (rxvt and maybe Linux console).
+ */
+ SLtt_Blink_Mode = term_blink_is_boldbg;
+#endif /* (VMS || REAL_UNIX_SYSTEM) && !__CYGWIN__ */
+ }
+#ifdef __DJGPP__
+ _eth_init();
+#endif /* __DJGPP__ */
+
+ slinit = 1;
+ Current_Attr = 0;
+#ifndef VMS
+#if SLANG_VERSION > 9929
+ SLang_init_tty(-1, 0, 1);
+#else
+ SLang_init_tty(3, 0, 1);
+#endif /* SLANG_VERSION > 9929 */
+#endif /* !VMS */
+ SLsmg_init_smg();
+ SLsmg_Display_Eight_Bit = LYlowest_eightbit[current_char_set];
+ if (SLsmg_Display_Eight_Bit > 191)
+ SLsmg_Display_Eight_Bit = 191; /* may print ctrl chars otherwise - kw */
+ scrollok(0, 0);
+ SLsmg_Backspace_Moves = 1;
+#if SLANG_VERSION > 10306
+ SLsmg_touch_screen();
+#endif
+#ifndef VMS
+#if defined(REAL_UNIX_SYSTEM) && !defined(__CYGWIN__)
+ SLtty_set_suspend_state(1);
+#endif /* REAL_UNIX_SYSTEM && !__CYGWIN__ */
+#ifdef SIGTSTP
+ if (!no_suspend)
+ signal(SIGTSTP, sl_suspend);
+#endif /* SIGTSTP */
+ signal(SIGINT, cleanup_sig);
+#endif /* !VMS */
+
+ lynx_enable_mouse(1);
+
+#else /* USE_SLANG; Now using curses: */
+ int keypad_on = 0;
+
+#ifdef VMS
+ /*
+ * If we are VMS then do initscr() every time start_curses() is called!
+ */
+ CTRACE((tfp, "Screen size: initscr()\n"));
+ initscr(); /* start curses */
+#else /* Unix: */
+
+#if defined(HAVE_TTYNAME)
+ if (isatty(fileno(stdout)) && LYReopenInput() < 0) {
+ fprintf(stderr, "Cannot open tty input\n");
+ exit_immediately(EXIT_FAILURE);
+ }
+#endif
+
+#ifdef __CYGWIN__
+ /*
+ * Workaround for buggy Cygwin, which breaks subprocesses of a
+ * full-screen application (tested with cygwin dll, dated
+ * 2002/6/23 -TD)
+ */
+ if (!lynx_called_initscr) {
+ FILE *fp = fopen("/dev/tty", "w");
+
+ if (fp != 0)
+ stdout = fp;
+ }
+#endif
+
+ if (!LYscreen) {
+ /*
+ * If we're not VMS then only do initscr() one time, and one time only!
+ */
+#if defined(HAVE_NEWTERM)
+#if !(defined(NCURSES) && !defined(HAVE_RESIZETERM))
+ BOOLEAN savesize;
+
+ savesize = recent_sizechange;
+ size_change(0);
+ recent_sizechange = savesize; /* avoid extra redraw */
+#if defined(__MVS__)
+ {
+ /*
+ * The requirement to do this may be a bug in OS/390.
+ *
+ * Put screen geometry in environment variables used by
+ * XOpen curses before calling newterm(). I believe this
+ * completes work left unfinished by AJL & FM -- gil
+ */
+ static char lines_putenv[] = "LINES=abcde", cols_putenv[] = "COLUMNS=abcde";
+
+ sprintf(lines_putenv + 6, "%d", LYlines & 0xfff);
+ sprintf(cols_putenv + 8, "%d", LYcols & 0xfff);
+ putenv(lines_putenv);
+ putenv(cols_putenv);
+ CTRACE((tfp, "start_curses putenv %s, %s\n", lines_putenv, cols_putenv));
+ }
+#endif /* defined(__MVS__) */
+#endif /* !(defined(NCURSES) && defined(HAVE_RESIZETERM)) */
+ CTRACE((tfp, "Screen size: %s()\n", NEWTERM_NAME));
+ if (!(LYscreen = newterm(NULL, stdout, stdin))) { /* start curses */
+ fprintf(tfp, "%s\n",
+ gettext("Terminal initialisation failed - unknown terminal type?"));
+ exit_immediately(EXIT_FAILURE);
+ }
+#else
+ CTRACE((tfp, "Screen size: initscr()\n"));
+ initscr();
+#endif /* HAVE_NEWTERM */
+ lynx_called_initscr = TRUE;
+ LYlines = LYscreenHeight();
+ LYcols = LYscreenWidth();
+
+#if defined(SIGWINCH) && defined(NCURSES_VERSION)
+ size_change(0);
+ recent_sizechange = FALSE; /* prevent mainloop drawing 1st doc twice */
+#endif /* SIGWINCH */
+ CTRACE((tfp, "Screen size is now %d x %d\n", LYcols, LYlines));
+
+#ifdef USE_CURSES_PADS
+ if (LYuseCursesPads) {
+ CTRACE((tfp, "using curses-pads\n"));
+ LYwin = newpad(LYlines, MAX_COLS);
+ LYshiftWin = 0;
+ LYwideLines = FALSE;
+ } else {
+ LYwin = stdscr;
+ }
+#endif
+
+#if defined(USE_KEYMAPS) && defined(NCURSES_VERSION)
+# ifdef HAVE_KEYPAD
+ /* Need to switch keypad on before initializing keymaps, otherwise
+ when the keypad is switched on, some keybindings may be overridden. */
+ keypad(LYwin, TRUE);
+ keypad_on = 1;
+# endif /* HAVE_KEYPAD */
+
+ if (-1 == lynx_initialize_keymaps()) {
+ endwin();
+ exit_immediately(EXIT_FAILURE);
+ }
+#endif /* ncurses-keymaps */
+
+ /*
+ * This is a workaround for a bug in SVr4 curses, observed on Solaris
+ * 2.4: if your terminal's alternate-character set contains codes in
+ * the range 128-255, they'll be sign-extended in the acs_map[] table,
+ * which in turn causes their values to be emitted as 255 (0xff).
+ * "Fix" this by forcing the table to 8-bit codes (it has to be
+ * anyway).
+ */
+#if defined(ALT_CHAR_SET) && !defined(NCURSES_VERSION)
+ {
+ int n;
+
+ for (n = 0; n < 128; n++)
+ if (ALT_CHAR_SET[n] & 0x80) {
+ ALT_CHAR_SET[n] &= 0xff;
+ ALT_CHAR_SET[n] |= A_ALTCHARSET;
+ }
+ }
+#endif
+
+#if defined(USE_COLOR_STYLE) || defined(USE_COLOR_TABLE)
+ if (has_colors()) {
+ lynx_has_color = TRUE;
+ start_color();
+
+#ifndef COLORS
+ /* map2boldc() relies on COLORS being a power of 2 */
+ if (COLORS > 16)
+ COLORS = 16;
+ if (COLORS < 8)
+ COLORS = 2;
+ if (COLORS > 8 && COLORS != 16)
+ COLORS = 8;
+#endif
+
+#ifdef USE_DEFAULT_COLORS
+ update_default_colors();
+ if (LYuse_default_colors) {
+#if defined(EXP_ASSUMED_COLOR) && defined(USE_COLOR_TABLE)
+ /*
+ * Adjust the color mapping table to match the ASSUMED_COLOR
+ * setting in lynx.cfg
+ */
+ if (assume_default_colors(default_fg, default_bg) != OK) {
+ default_fg = COLOR_WHITE;
+ default_bg = COLOR_BLACK;
+ }
+ CTRACE((tfp, "initializing default colors %d/%d\n",
+ default_fg, default_bg));
+ if (default_fg >= 0 || default_bg >= 0) {
+ unsigned n;
+
+ for (n = 0; n < TABLESIZE(lynx_color_cfg); n++) {
+ if (default_fg >= 0 && lynx_color_cfg[n].fg < 0)
+ lynx_color_cfg[n].fg = default_fg;
+ if (default_bg >= 0 && lynx_color_cfg[n].bg < 0)
+ lynx_color_cfg[n].bg = default_bg;
+ CTRACE((tfp, "color_cfg[%u] = %d/%d\n", n,
+ lynx_color_cfg[n].fg,
+ lynx_color_cfg[n].bg));
+ }
+ lynx_setup_colors();
+ }
+#else
+#if defined(HAVE_USE_DEFAULT_COLORS)
+ if (!default_color_reset) {
+ if (lynx_called_initscr) {
+ if (LYuse_default_colors && (use_default_colors() == OK)) {
+ default_fg = DEFAULT_COLOR;
+ default_bg = DEFAULT_COLOR;
+ } else {
+ default_fg = COLOR_WHITE;
+ default_bg = COLOR_BLACK;
+ default_color_reset = TRUE;
+ }
+ }
+ }
+#endif /* HAVE_USE_DEFAULT_COLORS */
+#endif /* EXP_ASSUMED_COLOR */
+ }
+#endif /* USE_DEFAULT_COLORS */
+ }
+#endif /* USE_COLOR_STYLE || USE_COLOR_TABLE */
+
+#ifdef USE_COLOR_STYLE
+ /* Curses forgets color settings when we call delscreen() */
+ if (non_empty(lynx_lss_file) && LYCanReadFile(lynx_lss_file)) {
+ style_readFromFile(lynx_lss_file);
+ }
+ parse_userstyles();
+#endif
+#ifdef USE_COLOR_TABLE
+ lynx_init_colors();
+#endif
+ }
+#ifdef __DJGPP__
+ _eth_init();
+#endif /* __DJGPP__ */
+#endif /* not VMS */
+
+#ifdef VMS
+ crmode();
+ raw();
+#else
+#ifdef HAVE_CBREAK
+ cbreak();
+#else
+ crmode();
+#endif /* HAVE_CBREAK */
+ signal(SIGINT, cleanup_sig);
+#endif /* VMS */
+
+ noecho();
+
+#ifdef HAVE_KEYPAD
+ if (!keypad_on)
+ keypad(LYwin, TRUE);
+#endif /* HAVE_KEYPAD */
+
+ lynx_enable_mouse(1);
+
+ fflush(stdin);
+ fflush(stdout);
+ fflush(stderr);
+#endif /* USE_SLANG */
+
+#if defined(WIN_EX)
+ LYclear();
+#endif
+
+#if defined(USE_BLINK) && defined(__EMX__)
+ if (term_blink_is_boldbg) /* Now actually make it so! */
+ make_blink_boldbg();
+#endif
+
+ LYCursesON = TRUE;
+#if defined(PDCURSES) && defined(PDC_BUILD) && PDC_BUILD >= 2401
+ if ((scrsize_x != 0) && (scrsize_y != 0)) {
+ if (saved_scrsize_x == 0) {
+ saved_scrsize_x = COLS;
+ saved_scrsize_y = LINES + 1;
+ }
+ CTRACE((tfp, "resize_term: x=%d, y=%d\n", scrsize_x, scrsize_y));
+ CTRACE((tfp, "saved terminal size: x=%d, y=%d\n", saved_scrsize_x, saved_scrsize_y));
+ LYresize_term(scrsize_y, scrsize_x);
+ LYlines = LYscreenHeight();
+ LYcols = LYscreenWidth();
+ LYStatusLine = -1;
+ LYclear();
+#ifdef _WINDOWS
+ adjustWindowPos();
+#endif
+ }
+ if (saved_scrsize_x2 == 0) {
+ if (saved_scrsize_x == 0) {
+ saved_scrsize_x2 = COLS;
+ saved_scrsize_y2 = LINES + 1;
+ } else {
+ saved_scrsize_x2 = scrsize_x;
+ saved_scrsize_y2 = scrsize_y;
+ }
+ }
+#endif
+ CTRACE((tfp, "start_curses: done.\n"));
+} /* end of start_curses() */
+
+void lynx_enable_mouse(int state)
+{
+#ifdef USE_MOUSE
+/***********************************************************************/
+
+#if defined(WIN_EX)
+/* modify lynx_enable_mouse() for pdcurses configuration so that mouse support
+ is disabled unless -use_mouse is specified
+*/
+ HANDLE hConIn = INVALID_HANDLE_VALUE;
+
+ hConIn = GetStdHandle(STD_INPUT_HANDLE);
+ if (LYUseMouse == 0) {
+ SetConsoleMode(hConIn, ENABLE_WINDOW_INPUT);
+ FlushConsoleInputBuffer(hConIn);
+ return;
+ }
+#endif
+
+ (void) state;
+
+ if (LYUseMouse == 0)
+ return;
+
+#if defined(USE_SLANG)
+ SLtt_set_mouse_mode(state, 0);
+ SLtt_flush_output();
+#else
+
+#if defined(WIN_EX) && defined(PDCURSES)
+ if (state) {
+ SetConsoleMode(hConIn, ENABLE_MOUSE_INPUT | ENABLE_WINDOW_INPUT);
+ FlushConsoleInputBuffer(hConIn);
+ }
+#else
+#if defined(NCURSES)
+ if (state) {
+ /* Compensate for small value of maxclick in ncurses. */
+ static int was = 0;
+
+ if (!was) {
+ int old = mouseinterval(-1);
+
+ was++;
+ if (old < 200) /* Default 166 */
+ mouseinterval(300);
+ }
+ /* Inform ncurses which mouse events we're interested in.
+ * We shouldn't need to include BUTTONn_PRESSED and BUTTONn_RELEASED
+ * events, since ncurses should translate them to click events. - kw
+ * However, if we do not include them, then ncurses effectively
+ * ignores mouseinterval(), thus translates *any* sequence of
+ * press/release to a click, which leads to inconveniences.
+ * We special-case these events in LYStrings.c.
+ */
+ mousemask(BUTTON_CTRL | BUTTON_ALT
+ | BUTTON1_PRESSED | BUTTON1_RELEASED
+ | BUTTON1_CLICKED
+ | BUTTON1_DOUBLE_CLICKED | BUTTON1_TRIPLE_CLICKED
+ | BUTTON2_PRESSED | BUTTON2_RELEASED
+ | BUTTON2_CLICKED
+ | BUTTON3_PRESSED | BUTTON3_RELEASED
+ | BUTTON3_CLICKED
+ | BUTTON3_DOUBLE_CLICKED | BUTTON3_TRIPLE_CLICKED
+#if NCURSES_MOUSE_VERSION >= 2
+ | BUTTON4_PRESSED | BUTTON4_RELEASED
+ | BUTTON4_CLICKED
+ | BUTTON4_DOUBLE_CLICKED | BUTTON4_TRIPLE_CLICKED
+ | BUTTON5_PRESSED | BUTTON5_RELEASED
+ | BUTTON5_CLICKED
+ | BUTTON5_DOUBLE_CLICKED | BUTTON5_TRIPLE_CLICKED
+#endif
+ ,NULL);
+ } else
+ mousemask(0, NULL);
+#endif /* NCURSES */
+#endif /* WIN_EX and PDCURSES */
+
+#if defined(PDCURSES)
+ if (state)
+ mouse_set(
+ BUTTON1_CLICKED | BUTTON1_PRESSED | BUTTON1_RELEASED |
+ BUTTON2_CLICKED | BUTTON2_PRESSED | BUTTON2_RELEASED |
+ BUTTON3_CLICKED | BUTTON3_PRESSED | BUTTON3_RELEASED);
+#endif
+#endif /* NOT USE_SLANG */
+
+/***********************************************************************/
+#endif /* USE_MOUSE */
+}
+
+/*
+ * SVr4 curses (and ncurses) initialize the terminal I/O to raw mode, and
+ * simulate other modes in the library. This means that when running, it
+ * simulates the OCRNL setting. Normally that is not a problem. However, when
+ * spawning a subprocess (e.g., xli), the subprocess may write to the screen.
+ * Fine so far - curses resets the terminal I/O to the normal state on exit.
+ * But the subprocess's messages can still be coming to the screen when lynx
+ * returns to the screen mode. This function delays restoring OCRNL until
+ * after the first getch() call.
+ *
+ * The OCRNL setting is controlled by nl()/nonl() of course - but we do not
+ * want to give up that optimization since it would be a bit slower. (Note -
+ * slang does not use this optimization; if it did, the same screen glitch
+ * would occur).
+ *
+ * FIXME: for simplicity, only ncurses is implemented here - the TTY and
+ * SET_TTY definitions are ncurses-specific. The same effect could be done for
+ * other curses implementations, since the "cur_term->Nttyb" part is common to
+ * SVr4 curses.
+ */
+void lynx_nl2crlf(int normal GCC_UNUSED)
+{
+#if defined(NCURSES_VERSION_PATCH) && defined(SET_TTY) && defined(TERMIOS) && defined(ONLCR)
+ static struct termios saved_tty;
+ static int did_save = FALSE;
+ static int waiting = FALSE;
+ static int can_fix = TRUE;
+
+ if (!did_save) {
+ if (cur_term == 0) {
+ can_fix = FALSE;
+ } else {
+ tcgetattr(fileno(stdout), &saved_tty);
+ did_save = TRUE;
+ if ((saved_tty.c_oflag & ONLCR))
+ can_fix = FALSE;
+#if NCURSES_VERSION_PATCH < 20010529
+ /* workaround for optimizer bug with nonl() */
+ if ((tigetstr("cud1") != 0 && *tigetstr("cud1") == '\n')
+ || (tigetstr("ind") != 0 && *tigetstr("ind") == '\n'))
+ can_fix = FALSE;
+#endif
+ }
+ }
+ if (can_fix) {
+ if (normal) {
+ if (!waiting) {
+ struct termios alter_tty = saved_tty;
+
+ alter_tty.c_oflag |= ONLCR;
+ tcsetattr(fileno(stdout), TCSAFLUSH, &alter_tty);
+ def_prog_mode();
+ waiting = TRUE;
+ nonl();
+ }
+ } else {
+ if (waiting) {
+ tcsetattr(fileno(stdout), TCSAFLUSH, &saved_tty);
+ def_prog_mode();
+ waiting = FALSE;
+ nl();
+ LYrefresh();
+ }
+ }
+ }
+#endif
+}
+
+void stop_curses(void)
+{
+ if (LYCursesON) {
+#ifdef USE_COLOR_STYLE
+ FreeCachedStyles();
+#endif
+ echo();
+ }
+#if defined(PDCURSES) && defined(PDC_BUILD) && PDC_BUILD >= 2401
+ resetty();
+#endif
+
+#ifdef __DJGPP__
+ _eth_release();
+#endif /* __DJGPP__ */
+
+/* ifdef's for non-Unix curses or slang */
+#if defined(__MINGW32__)
+ {
+ chtype bb;
+
+ bb = getbkgd(stdscr);
+ bkgdset(0);
+ clear();
+ refresh();
+ bkgdset(bb);
+ }
+#if defined(PDCURSES)
+ endwin();
+#endif /* PDCURSES */
+
+#elif defined(DOSPATH) && !(defined(USE_SLANG) || defined(_WIN_CC))
+
+#if defined(PDCURSES)
+ endwin();
+#endif /* PDCURSES */
+
+#ifdef __DJGPP__
+ ScreenClear();
+#elif !defined(PDCURSES) /* some flavor of win32? */
+ clrscr();
+#endif /* win32 */
+
+#else /* Unix, etc */
+
+ if (LYCursesON == TRUE) {
+ lynx_nl2crlf(TRUE);
+ lynx_enable_mouse(0);
+ if (LYscreen || lynx_called_initscr) {
+ endwin(); /* stop curses */
+ LYDELSCR();
+ }
+ } else {
+#ifdef SH_EX
+ int i;
+
+ for (i = 0; i <= 3; i++) {
+ printf("\r\n");
+ }
+#endif
+ }
+
+ fflush(stdout);
+#endif /* ifdef's for non-Unix curses or slang */
+ fflush(stderr);
+
+ LYCursesON = FALSE;
+ CTRACE((tfp, "stop_curses: done.\n"));
+
+#if defined(SIGTSTP) && defined(USE_SLANG)
+#ifndef VMS
+ if (!no_suspend)
+ signal(SIGTSTP, SIG_DFL);
+#endif /* !VMS */
+#endif /* SIGTSTP && USE_SLANG */
+
+#ifndef VMS
+ signal(SIGINT, SIG_DFL);
+#endif /* !VMS */
+}
+
+#ifdef VMS
+
+#ifdef USE_SLANG
+extern void longname(char *, char *);
+#endif /* USE_SLANG */
+
+/*
+ * Check terminal type, start curses & setup terminal.
+ */
+BOOLEAN setup(char *terminal)
+{
+ int c;
+ int status;
+ char *dummy = 0, *cp, term[81];
+
+ /*
+ * If the display was not set by a command line option then see if it is
+ * available from the environment.
+ */
+ if ((cp = LYgetXDisplay()) != 0) {
+ StrAllocCopy(x_display, cp);
+ } else {
+ FREE(x_display);
+ }
+
+ /*
+ * Get terminal type, and convert to lower case.
+ */
+ term[0] = '\0';
+ longname(dummy, term);
+ if (term[0] == '\0' &&
+ (non_empty(form_get_data) ||
+ non_empty(form_post_data))) {
+ /*
+ * Some yoyo used these under conditions which require -dump, so force
+ * that mode here. - FM
+ */
+ dump_output_immediately = TRUE;
+ LYcols = DFT_COLS;
+ if (keypad_mode == NUMBERS_AS_ARROWS)
+ keypad_mode = LINKS_ARE_NUMBERED;
+ status = mainloop();
+ exit_immediately(status);
+ }
+ LYLowerCase(term);
+
+ printf("%s%s\n", gettext("Terminal ="), term);
+ if ((strlen(term) < 5) ||
+ StrNCmp(term, "vt", 2) || !isdigit(term[2])) {
+ printf("%s\n",
+ gettext("You must use a vt100, 200, etc. terminal with this program."));
+ printf(CONFIRM_PROCEED, "n/y");
+ c = getchar();
+ if (c != 'y' && c != 'Y') {
+ printf("\n");
+ return (FALSE);
+ }
+ strcpy(term, "vt100");
+ }
+
+ ttopen();
+ start_curses();
+
+ LYlines = LYscreenHeight();
+ LYcols = LYscreenWidth();
+
+ return (TRUE);
+}
+
+#else /* Not VMS: */
+
+/*
+ * Check terminal type, start curses & setup terminal.
+ */
+BOOLEAN setup(char *terminal)
+{
+ char *term_putenv = NULL;
+ char *buffer = NULL;
+ char *cp;
+
+ /*
+ * If the display was not set by a command line option then see if it is
+ * available from the environment .
+ */
+ if ((cp = LYgetXDisplay()) != NULL) {
+ StrAllocCopy(x_display, cp);
+ } else {
+ FREE(x_display);
+ }
+
+ if (terminal != NULL) {
+ HTSprintf0(&term_putenv, "TERM=%.106s", terminal);
+ (void) putenv(term_putenv);
+ }
+
+ /*
+ * Query the terminal type.
+ */
+ if (dumbterm(LYGetEnv("TERM"))) {
+ printf("\n\n %s\n\n", gettext("Your Terminal type is unknown!"));
+ printf(" %s [vt100] ", gettext("Enter a terminal type:"));
+
+ if (LYSafeGets(&buffer, stdin) != 0) {
+ LYTrimLeading(buffer);
+ LYTrimTrailing(buffer);
+ }
+
+ if (isEmpty(buffer))
+ StrAllocCopy(buffer, "vt100");
+
+ HTSprintf0(&term_putenv, "TERM=%.106s", buffer);
+ FREE(buffer);
+
+ (void) putenv(term_putenv);
+ printf("\n%s %s\n", gettext("TERMINAL TYPE IS SET TO"),
+ LYGetEnv("TERM"));
+ LYSleepMsg();
+ }
+
+ start_curses();
+
+#ifdef HAVE_TTYTYPE
+ /*
+ * Account for lossage on the 'sun' terminal type (80x24) Sun text console
+ * driver. It only supports reverse video, but all SGR sequences produce
+ * that same reverse video, and the terminfo entry lists different SGRs for
+ * 'bold' and 'rev'. As a result, the current link is indistinguishable
+ * from all other links. The workaround here is to disable the 'rev'
+ * capability.
+ */
+ if ((StrNCmp((const char *) ttytype, "sun", 3) == 0)) {
+ LYnoVideo(2);
+ }
+#endif /* HAVE_TTYTYPE */
+
+ LYlines = LYscreenHeight();
+ LYcols = LYscreenWidth();
+
+ return (1);
+}
+
+static int dumbterm(char *terminal)
+{
+ int dumb = FALSE;
+
+ /*
+ * Began checking for terminal == NULL in case that TERM environment
+ * variable is not set. Thanks to Dick Wesseling (ftu@fi.ruu.nl).
+ */
+ if (terminal == NULL ||
+ !strcasecomp(terminal, "network") ||
+ !strcasecomp(terminal, "unknown") ||
+ !strcasecomp(terminal, "dialup") ||
+ !strcasecomp(terminal, "dumb") ||
+ !strcasecomp(terminal, "switch") ||
+ !strcasecomp(terminal, "ethernet"))
+ dumb = TRUE;
+ return (dumb);
+}
+
+#ifdef FANCY_CURSES
+#ifndef USE_COLOR_STYLE
+#ifdef USE_COLOR_TABLE
+static void LYsetWAttr(WINDOW * win)
+{
+ (void) wattrset(win, LYgetTableAttr());
+}
+
+void LYaddWAttr(WINDOW * win, int a)
+{
+ Current_Attr |= a;
+ LYsetWAttr(win);
+}
+
+void LYaddAttr(int a)
+{
+ LYaddWAttr(LYwin, a);
+}
+
+void LYsubWAttr(WINDOW * win, int a)
+{
+ Current_Attr &= ~a;
+ LYsetWAttr(win);
+}
+
+void LYsubAttr(int a)
+{
+ LYsubWAttr(LYwin, a);
+}
+#endif /* USE_COLOR_TABLE */
+#endif /* !USE_COLOR_STYLE */
+#endif /* FANCY_CURSES */
+#endif /* VMS */
+
+/* Use this rather than the 'wprintw()' function to write a blank-padded
+ * string to the given window, since someone's asserted that printw doesn't
+ * handle 8-bit characters unlike addstr (though more info would be useful).
+ *
+ * We're blank-filling so that with SVr4 curses, it'll show the background
+ * color to a uniform width in the popup-menu.
+ */
+#ifndef USE_SLANG
+void LYpaddstr(WINDOW * the_window, int width, const char *the_string)
+{
+ int y, x1, x2;
+ int length = (int) strlen(the_string);
+
+#ifdef WIDEC_CURSES
+ int actual = (int) LYstrCells(the_string);
+#endif
+
+ getyx(the_window, y, x1);
+ (void) y;
+ if (width + x1 > LYcolLimit)
+ width = LYcolLimit - x1;
+#ifdef WIDEC_CURSES
+ if (actual > width) {
+ actual = width;
+ /* FIXME: a binary search might be faster */
+ while (LYstrExtent(the_string, length, length) > actual) {
+ --length;
+ }
+ }
+#endif
+ LYwaddnstr(the_window, the_string, (size_t) length);
+ getyx(the_window, y, x2);
+ width -= (x2 - x1);
+ while (width-- > 0)
+ waddstr(the_window, " ");
+}
+
+/*
+ * Work around limitation of curses's order-of-refresh by setting a pointer to
+ * the topmost window that should be displayed.
+ *
+ * FIXME: the associated call on 'keypad()' is not needed for Unix, but
+ * something in the OS/2 EMX port requires it.
+ */
+void LYsubwindow(WINDOW * param)
+{
+ if (param != 0) {
+ my_subwindow = param;
+#if defined(NCURSES) || defined(PDCURSES)
+ keypad(my_subwindow, TRUE);
+#if defined(USE_COLOR_STYLE)
+ LynxWChangeStyle(my_subwindow, s_menu_bg, STACK_ON);
+ {
+ long b = LYgetattrs(my_subwindow);
+
+ wbkgd(my_subwindow, (chtype) (b | ' '));
+ }
+ LynxWChangeStyle(my_subwindow, s_menu_bg, STACK_OFF);
+#elif defined(HAVE_GETBKGD) /* not defined in ncurses 1.8.7 */
+ wbkgd(my_subwindow, getbkgd(LYwin));
+#endif
+#endif
+ scrollok(my_subwindow, TRUE);
+ } else {
+ touchwin(LYwin);
+ delwin(my_subwindow);
+ my_subwindow = 0;
+ }
+}
+
+WINDOW *LYtopwindow(void)
+{
+ return (my_subwindow ? my_subwindow : LYwin);
+}
+#endif
+
+WINDOW *LYstartPopup(int *top_y,
+ int *left_x,
+ int *height,
+ int *width)
+{
+ WINDOW *form_window = 0;
+
+#ifdef USE_SLANG
+ static WINDOW fake_window;
+
+ if (*left_x < 1 || (*left_x + *width + 4) >= LYcolLimit) {
+ *left_x = 1;
+ *width = LYcolLimit - 5;
+ }
+
+ SLsmg_fill_region(*top_y,
+ *left_x - 1,
+ (unsigned) *height,
+ (unsigned) *width + 4,
+ ' ');
+ form_window = &fake_window;
+ form_window->top_y = *top_y;
+ form_window->left_x = *left_x;
+ form_window->height = *height;
+ form_window->width = *width;
+#else
+ if (*left_x > 0 && (*left_x + *width + 4) < LYcolLimit)
+ form_window = newwin(*height, *width + 4, *top_y, *left_x - 1);
+ if (form_window == 0) {
+ if (*width > LYcolLimit - 4) {
+ *width = LYcolLimit - 4;
+ *left_x = 1;
+ } else {
+ *left_x = LYcolLimit - 4 - *width;
+ if (*left_x <= 0)
+ *left_x = 1;
+ }
+ form_window = newwin(*height, *width + 4, *top_y, *left_x - 1);
+ }
+ if (form_window == 0) {
+ HTAlert(POPUP_FAILED);
+ } else {
+ LYsubwindow(form_window);
+ }
+#endif /* USE_SLANG */
+ return form_window;
+}
+
+void LYstartTargetEmphasis(void)
+{
+#ifdef USE_COLOR_STYLE
+ if (s_whereis != NOSTYLE) {
+ curses_style(s_whereis, STACK_ON);
+ return;
+ }
+#endif
+#if defined(FANCY_CURSES) || defined(USE_SLANG)
+ lynx_start_bold();
+ lynx_start_reverse();
+#endif /* FANCY_CURSES || USE_SLANG */
+ lynx_start_underline();
+}
+
+void LYstopTargetEmphasis(void)
+{
+#ifdef USE_COLOR_STYLE
+ if (s_whereis != NOSTYLE) {
+ curses_style(s_whereis, STACK_OFF);
+ return;
+ }
+#endif
+ lynx_stop_underline();
+#if defined(FANCY_CURSES) || defined(USE_SLANG)
+ lynx_stop_reverse();
+ lynx_stop_bold();
+#endif /* FANCY_CURSES || USE_SLANG */
+}
+
+/*
+ * Accommodate the different flavors of touchline
+ */
+void LYtouchline(int row)
+{
+#if defined(HAVE_WREDRAWLN) && !defined(NCURSES_VERSION)
+ wredrawln(LYwin, row, 1);
+#else
+#if defined(HAVE_TOUCHLINE)
+ /* touchline() is not available on VMS before version 7.0, and then only on
+ * Alpha, since prior ports of curses were broken. BSD touchline() has a
+ * 4th parameter since it is used internally by touchwin().
+ */
+#if defined(HAVE_BSD_TOUCHLINE)
+ touchline(LYwin, row, 0, COLS);
+#else
+ touchline(LYwin, row, 1);
+#endif
+#else
+#if !defined(USE_SLANG)
+ touchwin(LYwin);
+#else
+ SLsmg_touch_lines(row, 1);
+#endif
+#endif
+#endif
+}
+
+/*
+ * Wrapper for waddnstr().
+ */
+void LYwaddnstr(WINDOW * w GCC_UNUSED,
+ const char *src,
+ size_t len)
+{
+ int y0, x0;
+ int y, x;
+ size_t inx;
+
+ (void) y;
+ (void) y0;
+#ifdef USE_CURSES_PADS
+ /*
+ * If we've configured to use pads for left/right scrolling, that can
+ * interfere with calls to this function that assume they're wrapping.
+ * Writing to a pad which is wider than the screen will simply not wrap.
+ *
+ * Link-highlighting uses wrapping. You can see this by viewing the
+ * options screen in a terminal which is narrower than 80 columns.
+ *
+ * Check for that case, and use curses's wrapping in a derived window to
+ * simplify things, e.g., in case the string contains multibyte or
+ * multicolumn characters.
+ */
+ getyx(LYwin, y0, x0);
+
+ if (LYuseCursesPads
+ && (LYwin == w)
+ && (LYshiftWin == 0)
+ && LYwideLines == FALSE
+ && ((int) len > (LYcolLimit - x0))
+ && (y0 >= 0)
+ && (x0 >= 0)
+ && (x0 < LYcolLimit)) {
+ WINDOW *sub = derwin(LYwin, LYlines, LYcolLimit, 0, 0);
+
+ if (sub != 0) {
+ wmove(sub, y0, x0);
+ LYwideLines = TRUE;
+ LYwaddnstr(sub, src, len);
+ getyx(sub, y0, x0);
+ delwin(sub);
+ wmove(LYwin, y0, x0);
+ }
+ LYwideLines = FALSE;
+
+ return;
+ }
+#endif
+ /*
+ * We only want to trace this function for the color-style code. It would
+ * be too much logging if not needed.
+ */
+#ifdef USE_COLOR_STYLE
+ if (TRACE) {
+ LYGetYX(y, x);
+ CTRACE2(TRACE_STYLE, (tfp, "[%2d,%2d] LYwaddnstr(%.*s, %u)\n",
+ y, x, (int) len, src, (unsigned) len));
+ }
+#endif
+ LYGetYX(y0, x0);
+
+ for (inx = 0; inx < len; ++inx) {
+ /*
+ * Do tab-expansion relative to the base of the string (rather than
+ * the screen) so that tabs in a TEXTAREA will look right.
+ */
+ if (src[inx] == '\t') {
+ LYGetYX(y, x);
+ while ((++x - x0) % 8)
+ waddch(w, ' ');
+ waddch(w, ' ');
+ } else {
+ waddch(w, UCH(src[inx]));
+ }
+ }
+}
+
+/*
+ * Determine the number of cells the given string would take up on the screen,
+ * limited (in the case of wide characters) by the maxCells parameter.
+ *
+ * If the returnCellNum parameter is TRUE, return the number of cells;
+ * otherwise, return the length (limited by the len parameter) of the prefix of
+ * the string that fits in maxCells cells.
+ */
+static
+int LYstrExtent0(const char *string,
+ int len,
+ int maxCells GCC_UNUSED,
+ int retCellNum GCC_UNUSED)
+{
+ int used, result;
+
+ if (isEmpty(string)) {
+ used = ((len > 0) ? len : 0);
+ } else {
+ used = ((len < 0) ? (int) strlen(string) : len);
+ }
+ result = used;
+#ifdef WIDEC_CURSES
+ if (non_empty(string) && used > 0 && lynx_called_initscr) {
+ if (fake_max < maxCells) {
+ fake_max = (maxCells + 1) * 2;
+ if (fake_win != 0) {
+ delwin(fake_win);
+ fake_win = 0;
+ }
+ }
+ if (fake_win == 0) {
+ fake_win = newwin(2, fake_max, 0, 0);
+ }
+ if (fake_win != 0) {
+ int new_x = 0;
+ int new_y = 0;
+ int x = 0;
+ int n;
+
+ wmove(fake_win, 0, 0);
+ for (n = 0; n < used; ++n) {
+ if (IsNormalChar(string[n])) {
+ waddch(fake_win, UCH(string[n]));
+ getyx(fake_win, new_y, new_x);
+ if (new_y > 0 || new_x > maxCells)
+ break;
+ x = new_x;
+ }
+ }
+ result = (retCellNum ? x : n);
+ }
+ }
+#endif
+ return result;
+}
+
+/*
+ * Determine the number of cells the given string would take up on the screen,
+ * limited by the maxCells parameter. This is used for constructing aligned
+ * text in the options and similar forms.
+ *
+ * FIXME: make this account for wrapping, too.
+ * FIXME: make this useful for "lynx -dump", which hasn't initialized curses.
+ */
+int LYstrExtent(const char *string, int len, int maxCells)
+{
+ int result = LYstrExtent0(string, len, maxCells, TRUE);
+
+ return (result > maxCells ? maxCells : result);
+}
+
+/*
+ * Return the number of cells in the first 'len' bytes of the string.
+ *
+ * This relies upon the coincidence that multicell characters use at least as
+ * many bytes as cells. But we have to account for tab, which can use 8, and
+ * control characters which use 2.
+ */
+int LYstrExtent2(const char *string, int len)
+{
+ return LYstrExtent(string, len, 8 * len);
+}
+
+/*
+ * Determine the longest prefix of a string that fits in a given number of
+ * cells and return its length.
+ */
+int LYstrFittable(const char *string, int maxCells)
+{
+ return LYstrExtent0(string, -1, maxCells, FALSE);
+}
+
+/*
+ * Returns the total number of cells that the string would use.
+ */
+int LYstrCells(const char *string)
+{
+ return LYstrExtent2(string, (int) strlen(string));
+}
+
+#ifdef VMS
+/*
+ * Cut-down termio --
+ * Do character-oriented stream input for Jeff.
+ * Code ripped off from Micro-Emacs 3.7 by Daniel Lawrence.
+ *
+ * Ever-so-slightly modified by Kathryn Huxtable. 29-Jan-1991.
+ * Cut down for Lou. 8 Sep 1992.
+ * Cut down farther for Lou. 19 Apr 1993.
+ * We don't set PASSALL or PASTHRU since we don't
+ * want to block CTRL/C, CTRL/Y, CTRL/S or CTRL/Q.
+ * Simply setting NOECHO and doing timed reads
+ * is sufficient.
+ * Further mods by Fote. 29-June-1993
+ * ttopen() and ttclose() are now terminal initialization
+ * and restoration procedures, called once at startup
+ * and at exit, respectively, of the LYNX image.
+ * ttclose() should be called before an exit from LYNX
+ * no matter how the exit is invoked.
+ * setup(terminal) does the ttopen().
+ * cleanup() calls cleanup_files() and ttclose().
+ * ttgetc() now handles NOECHO and NOFLITR (instead of
+ * setting the terminal itself to NOECHO in ttopen()).
+ * VMSsignal() added for handling both Ctrl-C *and* Ctrl-Y
+ * interrupts, and disabling system response to Ctrl-T.
+ * Further mods by Fote. 15-Dec-1993
+ * Added edit handler in ttopen() which will invoke
+ * VMSexit() and behave intelligently on ACCVIO's.
+ * Further mods by Fote. 29-Dec-1993
+ * Simplified ttgetc().
+ * Further mods by Fote. 16-Jan-1994
+ * Added code in ttopen() which will invoke VMSVersion()
+ * to get the version of VMS as VersionVMS for use by
+ * by new or modified interrupt or spawning routines.
+ * Further mods by Fote. 27-Jan-1994
+ * Added back a typeahead() which supports 'z' or 'Z' as
+ * an "Zap transfer" command via HTCheckForInterrupt()
+ * in LYUtils.c.
+ */
+
+#include <descrip.h>
+#include <iodef.h>
+#include <ssdef.h>
+#include <msgdef.h>
+#include <ttdef.h>
+#include <tt2def.h>
+#include <libclidef.h>
+#include <lib$routines.h>
+#include <starlet.h>
+#include <clidef.h>
+#include <syidef.h>
+#ifdef signal
+#undef signal
+#endif /* signal */
+#include <signal.h>
+#ifdef system
+#undef system
+#endif /* system */
+#include <processes.h>
+#include <LYVMSdef.h>
+
+#define EFN 0 /* Event flag */
+
+static unsigned char buffer[20]; /* Input buffer */
+static int in_pos, in_len; /* For escape sequences */
+static int oldmode[3]; /* Old TTY mode bits */
+static int newmode[3]; /* New TTY mode bits */
+static short iochan; /* TTY I/O channel */
+static $DESCRIPTOR(term_nam_dsc, "TT"); /* Descriptor for iochan */
+static unsigned long mask = LIB$M_CLI_CTRLY | LIB$M_CLI_CTRLT; /* ^Y and ^T */
+static unsigned long old_msk; /* Saved control mask */
+static short trap_flag = FALSE; /* TRUE if AST is set */
+BOOLEAN DidCleanup = FALSE; /* Exit handler flag */
+static char VersionVMS[20]; /* Version of VMS */
+
+int VMSVersion(char *VerString,
+ int VerLen)
+{
+ unsigned long status, itm_cod = SYI$_VERSION;
+ int i, verlen = 0;
+ struct dsc$descriptor version;
+ char *m;
+
+ version.dsc$a_pointer = VerString;
+ version.dsc$w_length = VerLen - 1;
+ version.dsc$b_dtype = DSC$K_DTYPE_B;
+ version.dsc$b_class = DSC$K_CLASS_S;
+
+ status = lib$getsyi(&itm_cod, 0, &version, &verlen, 0, 0);
+ if (!(status & 1) || verlen == 0)
+ return 0;
+
+ /*
+ * Cut out trailing spaces
+ */
+ for (m = VerString + verlen, i = verlen - 1; i > 0 && VerString[i] == ' '; --i)
+ *(--m) = '\0';
+
+ return strlen(VerString) + 1; /* Transmit ending 0 too */
+}
+
+void VMSexit(void)
+{
+ /*
+ * If we get here and DidCleanup is not set, it was via an ACCVIO, or
+ * outofmemory forced exit, so make *sure* we attempt a cleanup and reset
+ * the terminal.
+ */
+ if (!DidCleanup) {
+ if (LYOutOfMemory == FALSE) {
+ fprintf(stderr,
+ gettext("\nA Fatal error has occurred in %s Ver. %s\n"),
+ LYNX_NAME, LYNX_VERSION);
+ fprintf(stderr,
+ gettext("\nPlease notify your system administrator to confirm a bug, and if\n\
+confirmed, to notify the lynx-dev list. Bug reports should have concise\n\
+descriptions of the command and/or URL which causes the problem, the\n\
+operating system name with version number, the TCPIP implementation, the\n\
+TRACEBACK if it can be captured, and any other relevant information.\n"));
+
+ if (LYTraceLogFP == NULL) {
+ fprintf(stderr, RETURN_TO_CLEANUP);
+ (void) getchar();
+ }
+ } else if (LYCursesON) {
+ HTAlert(MEMORY_EXHAUSTED_ABORT);
+ }
+ cleanup();
+ }
+ if (LYOutOfMemory == TRUE) {
+ printf("\r\n%s\r\n\r\n", MEMORY_EXHAUSTED_ABORT);
+ fflush(stdout);
+ fflush(stderr);
+ }
+}
+
+/*
+ * TTOPEN --
+ * This function is called once to set up the terminal
+ * device streams. It translates TT until it finds
+ * the terminal, then assigns a channel to it, sets it
+ * to EDIT, and sets up the Ctrl-C and Ctrl-Y interrupt
+ * handling.
+ */
+int ttopen(void)
+{
+ int iosb[2];
+ int status;
+ static unsigned long condition;
+ static struct _exit_block {
+ unsigned long forward;
+ unsigned long address;
+ unsigned long zero;
+ unsigned long condition;
+ } exit_handler_block;
+
+ status = sys$assign(&term_nam_dsc, &iochan, 0, 0);
+ if (status != SS$_NORMAL)
+ exit_immediately(status);
+
+ status = sys$qiow(EFN, iochan, IO$_SENSEMODE, &iosb, 0, 0,
+ &oldmode, sizeof(oldmode), 0, 0, 0, 0);
+ if (status != SS$_NORMAL)
+ exit_immediately(status);
+
+ status = iosb[0] & 0xFFFF;
+ if (status != SS$_NORMAL)
+ exit_immediately(status);
+
+ newmode[0] = oldmode[0];
+ newmode[1] = oldmode[1];
+ newmode[2] = oldmode[2] | TT2$M_EDIT;
+
+ status = sys$qiow(EFN, iochan, IO$_SETMODE, &iosb, 0, 0,
+ &newmode, sizeof(newmode), 0, 0, 0, 0);
+ if (status != SS$_NORMAL)
+ exit_immediately(status);
+
+ status = iosb[0] & 0xFFFF;
+ if (status != SS$_NORMAL)
+ exit_immediately(status);
+
+ /*
+ * Declare the exit handler block.
+ */
+ exit_handler_block.forward = 0;
+ exit_handler_block.address = (unsigned long) &VMSexit;
+ exit_handler_block.zero = 0;
+ exit_handler_block.condition = (unsigned long) &condition;
+ status = sys$dclexh(&exit_handler_block);
+ if (status != SS$_NORMAL)
+ exit_immediately(status);
+
+ /*
+ * Set the AST.
+ */
+ lib$disable_ctrl(&mask, &old_msk);
+ trap_flag = TRUE;
+ status = sys$qiow(EFN, iochan,
+ IO$_SETMODE | IO$M_CTRLCAST | IO$M_CTRLYAST,
+ &iosb, 0, 0,
+ &cleanup_sig, SIGINT, 0, 0, 0, 0);
+ if (status != SS$_NORMAL) {
+ lib$enable_ctrl(&old_msk);
+ exit_immediately(status);
+ }
+
+ /*
+ * Get the version of VMS.
+ */
+ if (VMSVersion(VersionVMS, 20) < 3)
+ /*
+ * Load zeros on error.
+ */
+ strcpy(VersionVMS, "V0.0-0");
+
+ return (0);
+} /* ttopen */
+
+/*
+ * TTCLOSE --
+ * This function gets called just before we go back home
+ * to the command interpreter. It puts the terminal back
+ * in a reasonable state.
+ */
+int ttclose(void)
+{
+ int status;
+ int iosb[1];
+
+ status = sys$qiow(EFN, iochan, IO$_SETMODE, &iosb, 0, 0,
+ &oldmode, sizeof(oldmode), 0, 0, 0, 0);
+
+ if (status != SS$_NORMAL || (iosb[0] & 0xFFFF) != SS$_NORMAL)
+ exit_immediately(status);
+
+ if (trap_flag) {
+ status = sys$dassgn(iochan);
+ status = lib$enable_ctrl(&old_msk);
+ trap_flag = FALSE;
+ }
+ return (0);
+} /* ttclose */
+
+/*
+ * TTGETC --
+ * Read a character from the terminal, with NOECHO and NOFILTR.
+ */
+int ttgetc(void)
+{
+ int status;
+ unsigned short iosb[4];
+
+ if (in_pos < in_len)
+ return (buffer[in_pos++]);
+
+ status = sys$qiow(EFN, iochan,
+ IO$_READVBLK | IO$M_NOECHO | IO$M_NOFILTR,
+ &iosb, 0, 0,
+ &buffer, 1, 0, 0, 0, 0);
+ if ((status & 1) == 1)
+ status = iosb[0];
+ if (status == SS$_PARTESCAPE) {
+ /*
+ * Escape sequence in progress. Fake a successful read.
+ */
+ status = 1;
+ }
+ if ((status & 1) != 1 && status != SS$_DATAOVERUN)
+ exit_immediately(status);
+ in_pos = 1;
+ in_len = iosb[1] + iosb[3];
+ return (buffer[0]);
+}
+
+/*
+ * TYPEAHEAD -- Fote Macrides 27-Jan-1994
+ * Check whether a keystroke has been entered, and return
+ * it, or -1 if none was entered.
+ */
+int typeahead(void)
+{
+ int status;
+ unsigned short iosb[4];
+
+ if (dump_output_immediately)
+ return -1;
+
+ if (in_pos < in_len)
+ return (buffer[in_pos++]);
+
+ again:
+ status = sys$qiow(EFN, iochan,
+ IO$_READVBLK | IO$M_TIMED | IO$M_NOECHO | IO$M_NOFILTR,
+ &iosb, 0, 0,
+ &buffer, 1, 0, 0, 0, 0);
+ if ((status & 1) == 1)
+ status = iosb[0];
+ if (status == SS$_PARTESCAPE) {
+ /*
+ * Escape sequence in progress, finish reading it.
+ */
+ goto again;
+ }
+
+ in_pos = 1;
+ in_len = iosb[1] + iosb[3];
+ if (status == SS$_TIMEOUT || status == SS$_DATAOVERUN)
+ return (-1);
+ return (buffer[0]);
+}
+
+/*
+ * VMSSIGNAL -- Fote Macrides 29-Jun-1993
+ * Sets up AST for both Ctrl-C and Ctrl-Y, with system response
+ * to Ctrl-T disabled. If called with a sig other than SIGINT,
+ * it will use the C library's system(sig, func).
+ * The equivalent of VMSsignal(SIGINT, cleanup_sig) is done on
+ * initialization by ttopen(), so don't do it again.
+ * VMSsignal(SIGINT, SIG_DFL) is treated as a call to ttclose().
+ * Call VMSsignal(SIGINT, SIG_IGN) before system() calls to
+ * enable Ctrl-C and Ctrl-Y in the subprocess, and then call
+ * VMSsignal(SIG_INT, cleanup_sig) on return from the subprocess.
+ * For func's which set flags and do not invoke an exit from
+ * LYNX, the func should reassert itself.
+ * The VMS signal() calls do not fully emulate the Unix calls,
+ * and VMSsignal() is just a "helper", also not a full emulation.
+ */
+
+void VMSsignal(int sig,
+ void (*func) ())
+{
+ int status;
+ short iosb[4];
+ static int SIG_IGN_flag;
+
+ /*
+ * Pass all signals other than SIGINT to signal().
+ * Also pass SIGINT to signal() if we're dumping.
+ */
+ if (sig != SIGINT || dump_output_immediately) {
+ signal(sig, func);
+ return;
+ }
+
+ /*
+ * If func is SIG_DFL, treat it as ttclose().
+ */
+ if (func == SIG_DFL) {
+ ttclose();
+ return;
+ }
+
+ /*
+ * Clear any previous AST.
+ */
+ if (trap_flag) {
+ status = sys$dassgn(iochan);
+ status = lib$enable_ctrl(&old_msk);
+ trap_flag = FALSE;
+ }
+
+ /*
+ * If func is SIG_IGN, leave the TT channel closed and the system response
+ * to interrupts enabled for system() calls.
+ */
+ if (func == SIG_IGN)
+ return;
+
+ /*
+ * If we get to here, we have a LYNX func, so set the AST.
+ */
+ lib$disable_ctrl(&mask, &old_msk);
+ trap_flag = TRUE;
+ status = sys$assign(&term_nam_dsc, &iochan, 0, 0);
+ status = sys$qiow(EFN, iochan,
+ IO$_SETMODE | IO$M_CTRLCAST | IO$M_CTRLYAST,
+ &iosb, 0, 0,
+ func, SIGINT, 0, 0, 0, 0);
+
+} /* VMSsignal */
+
+/*
+ * DCLspawn_exception, spawn_DCLprocess, DCLsystem -- F.Macrides 16-Jan-1994
+ * Exception-handler routines for regulating interrupts and enabling
+ * Control-T during spawns. Includes TRUSTED flag for versions of VMS
+ * which require it in captive accounts. This code should be used
+ * instead of the VAXC or DECC system(), by including LYUtils.h in
+ * modules which have system() calls. It helps ensure that we return
+ * to Lynx instead of breaking out to DCL if a user issues interrupts
+ * or generates an ACCVIO during spawns.
+ */
+#ifdef __DECC
+static unsigned int DCLspawn_exception(void *sigarr,
+ void *mecharr)
+#else
+static int DCLspawn_exception(void *sigarr,
+ void *mecharr)
+#endif /* __DECC */
+{
+ int status;
+
+ status = lib$sig_to_ret(sigarr, mecharr);
+ return (SS$_UNWIND);
+}
+
+static int spawn_DCLprocess(char *command)
+{
+ int status;
+ unsigned long Status = 0;
+
+ /*
+ * Keep DECC from complaining.
+ */
+ struct dsc$descriptor_s command_desc;
+
+ command_desc.dsc$w_length = strlen(command);
+ command_desc.dsc$b_class = DSC$K_CLASS_S;
+ command_desc.dsc$b_dtype = DSC$K_DTYPE_T;
+ command_desc.dsc$a_pointer = command;
+
+ VAXC$ESTABLISH(DCLspawn_exception);
+
+#ifdef __ALPHA /** OpenVMS/AXP lacked the TRUSTED flag before v6.1 **/
+ if (VersionVMS[1] > '6' ||
+ (VersionVMS[1] == '6' && VersionVMS[2] == '.' &&
+ VersionVMS[3] >= '1'))
+#else
+ if (VersionVMS[1] >= '6')
+#endif /* __ALPHA */
+ {
+ /*
+ * Include TRUSTED flag.
+ */
+ unsigned long trusted = CLI$M_TRUSTED;
+
+ status = lib$spawn(&command_desc, 0, 0, &trusted,
+ 0, 0, &Status);
+ /*
+ * If it was invalid, try again without the flag.
+ */
+ if (status == LIB$_INVARG)
+ status = lib$spawn(&command_desc, 0, 0, 0,
+ 0, 0, &Status);
+ } else
+ status = lib$spawn(&command_desc, 0, 0, 0,
+ 0, 0, &Status);
+ /*
+ * Return -1 on error.
+ */
+ if ((status & 1) != 1 || (Status & 1) != 1)
+ return (-1);
+ /*
+ * Return 0 on success.
+ */
+ return (0);
+}
+
+int DCLsystem(char *command)
+{
+ int status;
+
+ VMSsignal(SIGINT, SIG_IGN);
+ status = spawn_DCLprocess(command);
+ VMSsignal(SIGINT, cleanup_sig);
+ /*
+ * Returns 0 on success, -1 any error.
+ */
+ return (status);
+}
+#endif /* VMS */
+
+/*
+ * Return the physical screen dimensions that we're allowed to use.
+ */
+int LYscreenHeight(void)
+{
+ int result = LINES;
+
+ if (result <= 0)
+ result = DFT_ROWS;
+ return result;
+}
+
+int LYscreenWidth(void)
+{
+ int result = COLS;
+
+#if defined(PDCURSES_EXP) && defined(WIN_EX) && defined(CJK_EX) /* 1999/08/26 (Thu) 17:53:38 */
+ {
+ extern int current_codepage; /* PDCurses lib. */
+
+ if (current_codepage == 932)
+ result--;
+ }
+#endif
+ if (result <= 0)
+ result = DFT_COLS;
+ return result;
+}
+
+/*
+ * Set the window's background color (make the pad's color agree), e.g., when
+ * we have just parsed it from the config file, or after clearing the screen.
+ */
+void LYnormalColor(void)
+{
+#if defined(USE_COLOR_STYLE) && defined(USE_CURSES_PADS)
+ if (LYwin != stdscr) {
+ int color = displayStyles[DSTYLE_NORMAL].color;
+
+ if (color >= 0) {
+ wbkgd(LYwin, (chtype) (color | ' '));
+ LYrefresh();
+ }
+ }
+#endif
+}
+
+/*
+ * The functions ifdef'd with USE_CURSES_PADS are implemented that way so we
+ * don't break the slang configuration.
+ */
+void LYclear(void)
+{
+#ifdef USE_CURSES_PADS
+ wclear(LYwin);
+#else
+ clear();
+#endif
+ LYnormalColor();
+}
+
+void LYclrtoeol(void)
+{
+#ifdef USE_CURSES_PADS
+ wclrtoeol(LYwin);
+#else
+ clrtoeol();
+#endif
+}
+
+void LYerase(void)
+{
+#ifdef USE_CURSES_PADS
+ werase(LYwin);
+#else
+ erase();
+#endif
+ LYnormalColor();
+}
+
+void LYmove(int y, int x)
+{
+#ifdef USE_CURSES_PADS
+ wmove(LYwin, y, x);
+#else
+ move(y, x);
+#endif
+}
+
+void LYrefresh(void)
+{
+#ifdef USE_CURSES_PADS
+ if (LYwin != stdscr) {
+ /*
+ * Workaround for special case where lynx is prompting for a mailto,
+ * and has a subject line that is wider than the screen. The
+ * wnoutrefresh() call resets newscr's position to match stdscr's,
+ * which happens to be the window's origin because we were not updating
+ * that, and other stray wmove's in lynx fail because the coordinate
+ * is on/after the right margin. Force things to look ok here.
+ */
+ int y, x;
+
+ getyx(LYwin, y, x);
+ if (y < 0)
+ y = 0;
+ if (x < 0)
+ x = 0;
+ if (x > LYcolLimit)
+ x = LYcolLimit;
+ wmove(stdscr, y, x);
+
+ wnoutrefresh(stdscr);
+ pnoutrefresh(LYwin, 0, LYshiftWin, 0, 0, LYlines, LYscreenWidth() - 1);
+
+ /*
+ * Keep a popup window visible. This can happen if the user presses
+ * '/' to do a search within a popup.
+ */
+ if (my_subwindow != 0) {
+ touchwin(my_subwindow);
+ wnoutrefresh(my_subwindow);
+ }
+ doupdate();
+ } else {
+ refresh();
+ }
+#else
+ refresh();
+#endif
+}
+
+void lynx_force_repaint(void)
+{
+ clearok(curscr, TRUE);
+}
+
+void lynx_start_title_color(void)
+{
+#ifdef SH_EX
+ lynx_start_reverse();
+#endif
+}
+
+void lynx_stop_title_color(void)
+{
+#ifdef SH_EX
+ lynx_stop_reverse();
+#endif
+}
+
+void lynx_start_link_color(int flag,
+ int pending)
+{
+ if (flag) {
+ /* makes some terminals work wrong because
+ * they can't handle two attributes at the
+ * same time
+ */
+ /* lynx_start_bold(); */
+ lynx_start_reverse();
+#if defined(USE_SLANG)
+#ifndef __DJGPP__
+ if (SLtt_Use_Ansi_Colors)
+#endif /* !__DJGPP__ */
+ lynx_start_underline();
+#endif /* USE_SLANG */
+#if defined(FANCY_CURSES) && defined(COLOR_CURSES)
+ if (lynx_has_color && LYShowColor >= SHOW_COLOR_ON)
+ lynx_start_underline();
+#endif /* USE_SLANG */
+ } else {
+ lynx_start_bold();
+ /*
+ * Make sure when flag is OFF that "unhighlighted" links will be
+ * underlined if appropriate. - LE & FM
+ */
+ if (pending)
+ lynx_start_underline();
+ }
+}
+
+void lynx_stop_link_color(int flag,
+ int pending GCC_UNUSED)
+{
+#ifdef USE_COLOR_STYLE
+ LynxChangeStyle(flag == TRUE ? s_alink : s_a, ABS_OFF);
+#else
+ if (flag) {
+ lynx_stop_reverse();
+#if defined(USE_SLANG)
+#ifndef __DJGPP__
+ if (SLtt_Use_Ansi_Colors)
+#endif /* !__DJGPP__ */
+ lynx_stop_underline();
+#endif /* USE_SLANG */
+#if defined(FANCY_CURSES) && defined(COLOR_CURSES)
+ if (lynx_has_color && LYShowColor >= SHOW_COLOR_ON)
+ lynx_stop_underline();
+#endif /* FANCY_CURSES && COLOR_CURSES */
+ } else {
+ lynx_stop_bold();
+ /*
+ * If underlining was turned on above, turn it off. - LE & FM
+ */
+ if (pending)
+ lynx_stop_underline();
+ }
+#endif
+}
+
+/* FIXME: consider inlining these */
+
+void lynx_stop_target_color(void)
+{
+ lynx_stop_underline();
+ lynx_stop_reverse();
+ lynx_stop_bold();
+}
+
+void lynx_start_target_color(void)
+{
+ lynx_start_bold();
+ lynx_start_reverse();
+ lynx_start_underline();
+}
+
+void lynx_start_status_color(void)
+{
+#if defined(USE_COLOR_TABLE) && defined(COLOR_CURSES)
+ if (lynx_has_color && LYShowColor >= SHOW_COLOR_ON)
+ lynx_set_color(2);
+ else
+#endif
+ lynx_start_reverse();
+}
+
+void lynx_stop_status_color(void)
+{
+#if defined(USE_COLOR_TABLE) && defined(COLOR_CURSES)
+ if (lynx_has_color && LYShowColor >= SHOW_COLOR_ON)
+ lynx_set_color(0);
+ else
+#endif
+ lynx_stop_reverse();
+}
+
+void lynx_start_h1_color(void)
+{
+ if (bold_H1 || bold_headers)
+ lynx_start_bold();
+}
+
+void lynx_stop_h1_color(void)
+{
+ if (bold_H1 || bold_headers)
+ lynx_stop_bold();
+}
+
+void lynx_start_prompt_color(void)
+{
+ lynx_start_reverse();
+}
+
+void lynx_stop_prompt_color(void)
+{
+ lynx_stop_reverse();
+}
+
+void lynx_start_radio_color(void)
+{
+ lynx_start_bold();
+}
+
+void lynx_stop_radio_color(void)
+{
+ lynx_stop_bold();
+}
+
+void lynx_stop_all_colors(void)
+{
+ lynx_stop_underline();
+ lynx_stop_reverse();
+ lynx_stop_bold();
+}
+
+/*
+ * Wrappers for LYUnderlineLinks flag.
+ */
+void lynx_start_bold(void)
+{
+ start_bold();
+}
+
+void lynx_start_reverse(void)
+{
+ start_reverse();
+}
+
+void lynx_start_underline(void)
+{
+ start_underline();
+}
+
+void lynx_stop_bold(void)
+{
+ stop_bold();
+}
+
+void lynx_stop_reverse(void)
+{
+ stop_reverse();
+}
+
+void lynx_stop_underline(void)
+{
+ stop_underline();
+}
+
+void LYSetDisplayLines(void)
+{
+ if (!no_title) {
+ if (user_mode == NOVICE_MODE)
+ display_lines = LYlines - 4;
+ else
+ display_lines = LYlines - 2;
+ } else if (user_mode == NOVICE_MODE) {
+ display_lines = LYlines - 3;
+ } else {
+ display_lines = LYlines - 1;
+ }
+}
+
+/*
+ * If LYShowCursor is ON, move the cursor to the left of the current option, so
+ * that blind users, who are most likely to have LYShowCursor ON, will have
+ * it's string spoken or passed to the braille interface as each option is made
+ * current. Otherwise, move it to the bottom, right column of the screen, to
+ * "hide" the cursor as for the main document, and let sighted users rely on
+ * the current option's highlighting or color without the distraction of a
+ * blinking cursor in the window. - FM
+ */
+void LYstowCursor(WINDOW * win, int row, int col)
+{
+ if (LYShowCursor) {
+ wmove(win, row, col);
+ } else {
+ LYHideCursor();
+ }
+#ifdef USE_SLANG
+ SLsmg_refresh();
+#else
+ wrefresh(win);
+#endif /* USE_SLANG */
+}
+
+#if defined(USE_BLINK) && defined(__EMX__) /* Can't put it earlier due to BOOLEAN conflict */
+# define BOOLEAN os2BOOLEAN
+# define INCL_VIO
+# include "os2.h"
+static void make_blink_boldbg(void)
+{
+ VIOINTENSITY buf; /* VIO windows have it anyway, */
+
+ /* but FS session need a switch */
+ buf.cb = sizeof(buf);
+ buf.type = 2; /* VIOINTENSITY request */
+ buf.fs = 1; /* Intensity == boldbg */
+ VioSetState(&buf, 0);
+}
+#endif
+
+#if defined(HAVE_WATTR_GET)
+/*
+ * getattrs() is not in X/Open curses, but it is more convenient than this.
+ */
+long LYgetattrs(WINDOW * win)
+{
+ long result;
+
+#if ( defined(HAVE_GETATTRS) && ( !defined(NCURSES_VERSION_MAJOR) || NCURSES_VERSION_MAJOR < 5 ) )
+
+ result = getattrs(win);
+#else
+ attr_t attrs = 0;
+ short pair = 0;
+
+ /*
+ * FIXME: this ignores the color-pair, which for most implementations is
+ * not stored in the attribute value.
+ */
+ (void) (wattr_get) (win, &attrs, &pair, NULL);
+ result = (long) attrs;
+#endif
+ return result;
+}
+#endif /* HAVE_WATTR_GET */
+
+#if defined(NCURSES_VERSION_PATCH) && NCURSES_VERSION_PATCH > 20021012
+#ifndef HAVE_USE_LEGACY_CODING
+/*
+ * Between ncurses 5.3 and 5.4 as part of fixes for wide-character mode, the
+ * locale support no longer allows characters in the range 128-159 to be
+ * treated as printable characters. Here is a workaround to fool
+ * waddch_nosync() into treating "all" 8-bit characters as printable.
+ */
+NCURSES_CONST char *unctrl(chtype ch)
+{
+ static char result[3];
+ unsigned data = (unsigned char) ch;
+
+ if (data < 32) {
+ result[0] = '^';
+ result[1] = ch | '@';
+ result[2] = 0;
+ } else if (data == 127) {
+ result[0] = '^';
+ result[1] = '?';
+ result[2] = 0;
+ } else {
+ result[0] = data;
+ result[1] = 0;
+ }
+ return result;
+}
+#endif /* HAVE_USE_LEGACY_CODING */
+#endif
diff --git a/src/LYCurses.h b/src/LYCurses.h
new file mode 100644
index 0000000..e8b52d6
--- /dev/null
+++ b/src/LYCurses.h
@@ -0,0 +1,841 @@
+/* $LynxId: LYCurses.h,v 1.96 2018/03/11 22:19:36 tom Exp $ */
+#ifndef LYCURSES_H
+#define LYCURSES_H
+
+#ifndef HTUTILS_H
+#include <HTUtils.h>
+#endif
+
+/*
+ * Because we have to configure PDCURSES last, we may get bogus definitions
+ * from the system curses library - cancel these now.
+ */
+#ifdef HAVE_XCURSES
+
+#undef ASSUME_DEFAULT_COLORS
+#undef COLOR_CURSES
+#undef FANCY_CURSES
+#undef HAVE_CBREAK
+#undef HAVE_RESIZETERM
+#undef HAVE_USE_DEFAULT_COLORS
+#undef NCURSES
+#undef USE_DEFAULT_COLORS
+
+#define HAVE_CBREAK 1
+#define COLOR_CURSES 1
+#define FANCY_CURSES 1
+
+#endif
+
+/*
+ * The simple color scheme maps the 8 combinations of bold/underline/reverse
+ * to the standard 8 ANSI colors (with some variations based on context).
+ */
+#undef USE_COLOR_TABLE
+
+#ifdef USE_COLOR_STYLE
+#define USE_COLOR_TABLE 1 /* default color logic is used */
+#else
+#if defined(USE_SLANG) || defined(COLOR_CURSES)
+#define USE_COLOR_TABLE 1
+#endif
+#endif
+
+#ifdef TRUE
+#undef TRUE /* to prevent parse error :( */
+#endif /* TRUE */
+#ifdef FALSE
+#undef FALSE /* to prevent parse error :( */
+#endif /* FALSE */
+
+#ifdef USE_SLANG
+#define ENABLE_SLFUTURE_CONST 1
+#include <slang.h>
+#ifndef SLFUTURE_CONST
+#define SLFUTURE_CONST /* nothing */
+#endif
+typedef unsigned long chtype;
+
+#undef WINDOW
+typedef struct {
+ int top_y;
+ int left_x;
+ int height;
+ int width;
+} WINDOW;
+
+/* slang doesn't really do windows... */
+#define waddch(w,c) LYaddch(c)
+#define waddstr(w,s) addstr(s)
+#define wmove(win, row, col) SLsmg_gotorc(((win)?(win)->top_y:0) + (row), ((win)?(win)->left_x:0) + (col))
+
+#ifndef SLSMG_UARROW_CHAR
+#define SLSMG_UARROW_CHAR '^'
+#endif
+
+#ifndef SLSMG_DARROW_CHAR
+#define SLSMG_DARROW_CHAR 'v'
+#endif
+
+#ifndef SLSMG_LARROW_CHAR
+#define SLSMG_LARROW_CHAR '<'
+#endif
+
+#ifndef SLSMG_RARROW_CHAR
+#define SLSMG_RARROW_CHAR '>'
+#endif
+
+#ifndef SLSMG_CKBRD_CHAR
+#define SLSMG_CKBRD_CHAR '#'
+#endif
+
+#ifndef SLSMG_BLOCK_CHAR
+#define SLSMG_BLOCK_CHAR '#'
+#endif
+
+#ifndef ACS_UARROW
+#define ACS_UARROW SLSMG_UARROW_CHAR
+#endif
+
+#ifndef ACS_DARROW
+#define ACS_DARROW SLSMG_DARROW_CHAR
+#endif
+
+#ifndef ACS_LARROW
+#define ACS_LARROW SLSMG_LARROW_CHAR
+#endif
+
+#ifndef ACS_RARROW
+#define ACS_RARROW SLSMG_RARROW_CHAR
+#endif
+
+#ifndef ACS_CKBOARD
+#define ACS_CKBOARD SLSMG_CKBRD_CHAR
+#endif
+
+#ifndef ACS_BLOCK
+#define ACS_BLOCK SLSMG_BLOCK_CHAR
+#endif
+
+#else /* Using curses: */
+
+#ifdef VMS
+#define FANCY_CURSES
+
+#endif /* VMS */
+
+#ifndef HAVE_TYPE_CHTYPE
+
+#ifdef __PDCURSES__
+#define HAVE_TYPE_CHTYPE 1
+#endif
+
+#if defined(_VMS_CURSES) || defined(VMS)
+typedef char chtype;
+
+#define HAVE_TYPE_CHTYPE 1
+#endif
+
+#endif /* ! HAVE_TYPE_CHTYPE */
+
+/*
+ * CR may be defined before the curses.h include occurs.
+ * There is a conflict between the termcap char *CR and the define.
+ * Assuming that the definition of CR will always be carriage return.
+ * 06-09-94 Lynx 2-3-1 Garrett Arch Blythe
+ */
+#ifdef CR
+#undef CR /* to prevent parse error :( */
+#define REDEFINE_CR
+#endif /* CR */
+
+#ifdef HZ
+#undef HZ /* to prevent parse error :( */
+#endif /* HZ */
+
+/* SunOS 4.x has a redefinition between ioctl.h and termios.h */
+#if defined(sun) && !defined(__SVR4)
+#undef NL0
+#undef NL1
+#undef CR0
+#undef CR1
+#undef CR2
+#undef CR3
+#undef TAB0
+#undef TAB1
+#undef TAB2
+#undef XTABS
+#undef BS0
+#undef BS1
+#undef FF0
+#undef FF1
+#undef ECHO
+#undef NOFLSH
+#undef TOSTOP
+#undef FLUSHO
+#undef PENDIN
+#endif
+
+#if defined(_MSC_VER)
+#undef MOUSE_MOVED /* conflict between PDCURSES and _WIN32 */
+#endif /* _MSC_VER */
+
+/*
+ * Do this to build with glibc 2.1.3 (apparently it was not used to build a
+ * system before release).
+ */
+#include <signal.h>
+
+#undef CS /* some BSD versions of curses use this */
+#define CS curses_CS /* ...but we don't */
+
+#ifdef ERR
+#undef ERR /* all versions of curses define this */
+#endif
+
+#ifdef KEY_EVENT
+#undef KEY_EVENT /* wincon.h or Cygwin's copy of it */
+#endif
+
+#ifdef MOUSE_MOVED
+#undef MOUSE_MOVED /* wincon.h or MINGW32's copy of it */
+#endif
+
+#ifdef HAVE_CONFIG_H
+# ifdef HAVE_NCURSESW_NCURSES_H
+# undef GCC_PRINTFLIKE /* <libutf8.h> may define 'printf' */
+# include <ncursesw/ncurses.h>
+# undef printf /* but we don't want that... */
+# else
+# ifdef HAVE_NCURSES_NCURSES_H
+# include <ncurses/ncurses.h>
+# else
+# ifdef HAVE_NCURSES_H
+# include <ncurses.h>
+# else
+# ifdef HAVE_CURSESX_H
+# include <cursesX.h> /* Ultrix */
+# else
+# ifdef HAVE_JCURSES_H
+# include <jcurses.h> /* sony_news */
+# else
+# ifdef HAVE_XCURSES
+# include <xcurses.h> /* PDCurses' UNIX port */
+# else
+# include <curses.h> /* default */
+# endif
+# endif
+# endif
+# endif
+# endif
+# endif
+
+# if defined(wgetbkgd) && !defined(getbkgd)
+# define getbkgd(w) wgetbkgd(w) /* workaround pre-1.9.9g bug */
+# endif
+
+# ifdef FANCY_CURSES
+# if defined(NCURSES) && defined(HAVE_NCURSESW_TERM_H)
+# include <ncursesw/term.h>
+# else
+# if defined(NCURSES) && defined(HAVE_NCURSES_TERM_H)
+# include <ncurses/term.h>
+# else
+# if defined(HAVE_NCURSESW_NCURSES_H) || defined(HAVE_NCURSES_NCURSES_H) || defined(HAVE_XCURSES)
+# undef HAVE_TERM_H /* only use one in comparable path! */
+# endif
+# if defined(HAVE_TERM_H)
+# include <term.h>
+# endif
+# endif
+# endif
+# endif
+
+# if defined(NCURSES_VERSION) && defined(HAVE_DEFINE_KEY)
+# define USE_KEYMAPS 1
+# endif
+
+#else
+# if defined(VMS) && defined(__GNUC__)
+# include <LYGCurses.h>
+# else
+# include <curses.h> /* everything else */
+# endif /* VMS && __GNUC__ */
+#endif /* HAVE_CONFIG_H */
+
+/*
+ * PDCurses' mouse code does nothing in the DJGPP configuration.
+ */
+#if defined(PDCURSES) && !defined(__DJGPP__) && !defined(HAVE_XCURSES)
+#define USE_MOUSE 1
+#endif
+
+/*
+ * Pick up the native ncurses name:
+ */
+#if defined(NCURSES_MOUSE_VERSION)
+#define USE_MOUSE 1
+#endif
+
+/*
+ * For systems where select() does not work for TTY's, we can poll using
+ * curses.
+ */
+#if defined(_WINDOWS) || defined(__MINGW32__)
+#if defined(PDCURSES) && defined(PDC_BUILD) && PDC_BUILD >= 2401
+#define USE_CURSES_NODELAY 1
+#endif
+
+#if defined(NCURSES_VERSION)
+#define USE_CURSES_NODELAY 1
+#endif
+#endif /* _WINDOWS || __MINGW32__ */
+
+#if defined(NCURSES_VERSION) && defined(__BEOS__)
+#define USE_CURSES_NODELAY 1
+#endif
+
+/*
+ * If we have pads, use them to implement left/right scrolling.
+ */
+#if defined(HAVE_NEWPAD) && defined(HAVE_PNOUTREFRESH) && !defined(PDCURSES)
+#define USE_CURSES_PADS 1
+#endif
+
+/*
+ * ncurses 1.9.9e won't work for pads, but 4.2 does (1.9.9g doesn't have a
+ * convenient ifdef, though it would work).
+ */
+#if defined(NCURSES_VERSION) && !defined(NCURSES_VERSION_MAJOR)
+#undef USE_CURSES_PADS
+#endif
+
+/*
+ * Most implementations of curses treat pair 0 specially, as the default
+ * foreground and background color. Also, the COLORS variable corresponds to
+ * the total number of colors.
+ *
+ * PDCurses does not follow these rules. Its COLORS variable claims it has
+ * 8 colors, but it actually implements 16. That makes it hard to optimize
+ * color settings against color pair 0 in a portable fashion.
+ */
+#if defined(COLOR_CURSES)
+#if defined(PDCURSES) || defined(HAVE_XCURSES)
+#define COLORS 16 /* should be a variable... */
+#else
+#define USE_CURSES_PAIR_0
+#endif
+#endif
+
+#if defined(_WINDOWS) && defined(PDCURSES) && defined(PDC_BUILD) && PDC_BUILD >= 2401
+#define USE_MAXSCREEN_TOGGLE 1
+extern void maxmizeWindowSize(void);
+extern void recoverWindowSize(void);
+#endif
+
+#endif /* USE_SLANG */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#ifdef USE_SLANG
+#define LYstopPopup() /* nothing */
+#define LYtopwindow() LYwin
+#else
+ extern void LYsubwindow(WINDOW * param);
+ extern WINDOW *LYtopwindow(void);
+
+#define LYstopPopup() LYsubwindow(0)
+#endif /* NCURSES */
+
+ extern void LYbox(WINDOW * win, int formfield);
+ extern WINDOW *LYstartPopup(int *top_y, int *left_x, int *height, int *width);
+
+/*
+ * Useful macros not in PDCurses or very old ncurses headers.
+ */
+#if !defined(HAVE_GETBEGX) && !defined(getbegx)
+#define getbegx(win) ((win)->_begx)
+#endif
+#if !defined(HAVE_GETBEGY) && !defined(getbegy)
+#define getbegy(win) ((win)->_begy)
+#endif
+#if !defined(HAVE_GETBKGD) && !defined(getbkgd)
+#define getbkgd(win) ((win)->_bkgd)
+#endif
+
+#if defined(HAVE_WATTR_GET)
+ extern long LYgetattrs(WINDOW * win);
+
+#else
+#if defined(HAVE_GETATTRS) || defined(getattrs)
+#define LYgetattrs(win) getattrs(win)
+#else
+#define LYgetattrs(win) ((win)->_attrs)
+#endif
+#endif /* HAVE_WATTR_GET */
+
+#if defined(PDCURSES)
+#define HAVE_GETBKGD 1 /* can use fallback definition */
+#define HAVE_NAPMS 1 /* can use millisecond-delays */
+# if defined(PDC_BUILD) && PDC_BUILD >= 2401
+ extern int saved_scrsize_x;
+ extern int saved_scrsize_y;
+# endif
+#endif
+
+#ifdef HAVE_NAPMS
+#define SECS2Secs(n) (1000 * (n))
+#define Secs2SECS(n) ((n) / 1000.0)
+#define SECS_FMT "%.3f"
+#else
+#define SECS2Secs(n) (n)
+#define Secs2SECS(n) (n)
+#define SECS_FMT "%.0f"
+#endif
+
+#ifdef NCURSES_VERSION
+ extern void _nc_freeall(void); /* HAVE__NC_FREEALL */
+ extern void _nc_free_and_exit(int); /* HAVE__NC_FREE_AND_EXIT */
+#endif
+
+/* Both slang and curses: */
+#ifndef TRUE
+#define TRUE 1
+#endif /* !TRUE */
+#ifndef FALSE
+#define FALSE 0
+#endif /* !FALSE */
+
+#ifdef REDEFINE_CR
+#define CR FROMASCII('\015')
+#endif /* REDEFINE_CR */
+
+#ifdef ALT_CHAR_SET
+#define BOXVERT 0 /* use alt char set for popup window vertical borders */
+#define BOXHORI 0 /* use alt char set for popup window vertical borders */
+#endif
+
+#ifndef BOXVERT
+#define BOXVERT '*' /* character for popup window vertical borders */
+#endif
+#ifndef BOXHORI
+#define BOXHORI '*' /* character for popup window horizontal borders */
+#endif
+
+#ifndef KEY_DOWN
+#undef HAVE_KEYPAD /* avoid confusion with bogus 'keypad()' */
+#endif
+
+ extern int LYlines; /* replaces LINES */
+ extern int LYcols; /* replaces COLS */
+
+/*
+ * The scrollbar, if used, occupies the rightmost column.
+ */
+#ifdef USE_SCROLLBAR
+#define LYbarWidth (LYShowScrollbar ? 1 : 0)
+#else
+#define LYbarWidth 0
+#endif
+
+/*
+ * Usable limits for display:
+ */
+#if defined(FANCY_CURSES) || defined(USE_SLANG)
+#if defined(PDCURSES)
+#define LYcolLimit (LYcols - LYbarWidth - 1) /* PDCurses wrapping is buggy */
+#else
+#define LYcolLimit (LYcols - LYbarWidth)
+#endif
+#else
+#define LYcolLimit (LYcols - 1)
+#endif
+
+#ifdef USE_CURSES_PADS
+ extern WINDOW *LYwin;
+ extern int LYshiftWin;
+ extern int LYwideLines;
+ extern int LYtableCols;
+ extern BOOLEAN LYuseCursesPads;
+
+#else
+#define LYwin stdscr
+#define LYshiftWin 0
+#define LYwideLines 0
+#define LYtableCols 0
+#endif
+
+ extern BOOLEAN setup(char *terminal);
+ extern int LYscreenHeight(void);
+ extern int LYscreenWidth(void);
+ extern int LYstrExtent(const char *string, int len, int maxCells);
+ extern int LYstrExtent2(const char *string, int len);
+ extern int LYstrFittable(const char *string, int maxCells);
+ extern int LYstrCells(const char *string);
+ extern void LYclear(void);
+ extern void LYclrtoeol(void);
+ extern void LYerase(void);
+ extern void LYmove(int y, int x);
+ extern void LYnoVideo(int mask);
+ extern void LYnormalColor(void);
+ extern void LYpaddstr(WINDOW * w, int width, const char *s);
+ extern void LYrefresh(void);
+ extern void LYstartTargetEmphasis(void);
+ extern void LYstopTargetEmphasis(void);
+ extern void LYtouchline(int row);
+ extern void LYwaddnstr(WINDOW * w, const char *s, size_t len);
+ extern void start_curses(void);
+ extern void stop_curses(void);
+
+#define LYaddstr(s) LYwaddnstr(LYwin, s, strlen(s))
+
+#ifdef VMS
+ extern int DCLsystem(char *command);
+ extern void VMSexit();
+ extern int ttopen();
+ extern int ttclose();
+ extern int ttgetc();
+ extern void VMSsignal(int sig, void (*func) ());
+#endif /* VMS */
+
+#if defined(USE_COLOR_STYLE)
+ extern void add_to_lss_list(const char *source, const char *resolved);
+ extern void clear_lss_list(void);
+ extern void curses_css(char *name, int dir);
+ extern void curses_style(int style, int dir);
+ extern void curses_w_style(WINDOW * win, int style, int dir);
+ extern void init_color_styles(char **from_cmdline, const char *default_styles);
+ extern void reinit_color_styles(void);
+ extern void setHashStyle(int style, int color, int cattr, int mono, const char *element);
+ extern void setStyle(int style, int color, int cattr, int mono);
+ extern void update_color_style(void);
+ extern void wcurses_css(WINDOW * win, char *name, int dir);
+
+# define LynxChangeStyle(style,dir) curses_style(style,dir)
+# define LynxWChangeStyle(win,style,dir) curses_w_style(win,style,dir)
+#else
+# define LynxWChangeStyle(win,style,dir) (void)1
+#endif /* USE_COLOR_STYLE */
+
+#ifdef USE_COLOR_TABLE
+ extern void LYaddAttr(int a);
+ extern void LYsubAttr(int a);
+ extern void lynx_setup_colors(void);
+ extern unsigned Lynx_Color_Flags;
+#endif
+
+#if defined(USE_COLOR_TABLE) || defined(USE_SLANG)
+ extern int Current_Attr;
+#endif
+
+#ifdef USE_SLANG
+#define SHOW_WHEREIS_TARGETS 1
+
+#if !defined(VMS) && !defined(DJGPP)
+#define USE_MOUSE 1
+#endif
+
+#if !defined(__DJGPP__) && !defined(__CYGWIN__)
+#define USE_KEYMAPS 1
+#endif
+
+#define SL_LYNX_USE_COLOR 1
+#define SL_LYNX_OVERRIDE_COLOR 2
+
+#define start_bold() LYaddAttr(LYUnderlineLinks ? 4 : 1)
+#define start_reverse() LYaddAttr(2)
+#define start_underline() LYaddAttr(LYUnderlineLinks ? 1 : 4)
+#define stop_bold() LYsubAttr(LYUnderlineLinks ? 4 : 1)
+#define stop_reverse() LYsubAttr(2)
+#define stop_underline() LYsubAttr(LYUnderlineLinks ? 1 : 4)
+
+#ifdef FANCY_CURSES
+#undef FANCY_CURSES
+#endif /* FANCY_CURSES */
+
+/*
+ * Map some curses functions to slang functions.
+ */
+#define stdscr ((WINDOW *)0)
+#define COLS SLtt_Screen_Cols
+#define LINES SLtt_Screen_Rows
+#define move SLsmg_gotorc
+#define addstr SLsmg_write_string
+ extern void LY_SLerase(void);
+
+#define erase LY_SLerase
+#define clear LY_SLerase
+#define standout SLsmg_reverse_video
+#define standend SLsmg_normal_video
+#define clrtoeol SLsmg_erase_eol
+
+#ifdef SLSMG_NEWLINE_SCROLLS
+#define scrollok(a,b) SLsmg_Newline_Behavior \
+ = ((b) ? SLSMG_NEWLINE_SCROLLS : SLSMG_NEWLINE_MOVES)
+#else
+#define scrollok(a,b) SLsmg_Newline_Moves = ((b) ? 1 : -1)
+#endif
+
+#define LYaddch(ch) SLsmg_write_char(ch)
+
+#if SLANG_VERSION >= 20000
+#define addch_raw(ch) do { \
+ SLsmg_Char_Type buf; \
+ buf.nchars = 1; \
+ buf.wchars[0] = ch; \
+ buf.color = Current_Attr; \
+ SLsmg_write_raw (&buf, 1); \
+ } while (0)
+#else
+#define addch_raw(ch) do { \
+ SLsmg_Char_Type buf; \
+ buf = (ch) | (Current_Attr << 4); \
+ SLsmg_write_raw (&buf, 1); \
+ } while (0)
+#endif /* SLANG_VERSION >= 20000 */
+
+#define echo()
+#define printw SLsmg_printf
+
+ extern int curscr;
+ extern BOOLEAN FullRefresh;
+
+#ifdef clearok
+#undef clearok
+#endif /* clearok */
+#define clearok(a,b) { FullRefresh = (BOOLEAN)b; }
+ extern void LY_SLrefresh(void);
+
+#ifdef refresh
+#undef refresh
+#endif /* refresh */
+#define refresh LY_SLrefresh
+
+#ifdef VMS
+ extern void VTHome(void);
+
+#define endwin() LYclear(),refresh(),SLsmg_reset_smg(),VTHome()
+#else
+#define endwin SLsmg_reset_smg(),SLang_reset_tty
+#endif /* VMS */
+
+#else /* Define curses functions: */
+
+#ifdef FANCY_CURSES
+#define SHOW_WHEREIS_TARGETS 1
+
+#ifdef VMS
+/*
+ * For VMS curses, [w]setattr() and [w]clrattr()
+ * add and subtract, respectively, the attributes
+ * _UNDERLINE, _BOLD, _REVERSE, and _BLINK. - FM
+ */
+#define start_bold() setattr(LYUnderlineLinks ? _UNDERLINE : _BOLD)
+#define stop_bold() clrattr(LYUnderlineLinks ? _UNDERLINE : _BOLD)
+#define start_underline() setattr(LYUnderlineLinks ? _BOLD : _UNDERLINE)
+#define stop_underline() clrattr(LYUnderlineLinks ? _BOLD : _UNDERLINE)
+#define start_reverse() setattr(_REVERSE)
+#define wstart_reverse(w) wsetattr(w, _REVERSE)
+#define stop_reverse() clrattr(_REVERSE)
+#define wstop_reverse(w) wclrattr(w, _REVERSE)
+
+#else /* Not VMS: */
+
+ extern int string_to_attr(const char *name);
+
+/*
+ * For Unix FANCY_FANCY curses we interpose
+ * our own functions to add or subtract the
+ * A_foo attributes. - FM
+ */
+#if defined(USE_COLOR_TABLE) && !defined(USE_COLOR_STYLE)
+ extern void LYaddWAttr(WINDOW * win, int a);
+ extern void LYsubWAttr(WINDOW * win, int a);
+ extern void LYaddWAttr(WINDOW * win, int a);
+ extern void LYsubWAttr(WINDOW * win, int a);
+
+#undef standout
+#define standout() lynx_standout(TRUE)
+#undef standend
+#define standend() lynx_standout(FALSE)
+#else
+#define LYaddAttr(attr) LYaddWAttr(LYwin,attr)
+#define LYaddWAttr(win,attr) wattron(win,attr)
+#define LYsubAttr(attr) LYsubWAttr(LYwin,attr)
+#define LYsubWAttr(win,attr) wattroff(win,attr)
+#endif
+
+#if defined(USE_COLOR_TABLE)
+ extern void lynx_set_color(int a);
+ extern void lynx_standout(int a);
+ extern char *LYgetTableString(int code);
+ extern int LYgetTableAttr(void);
+ extern int lynx_chg_color(int, int, int);
+#endif
+
+#define start_bold() LYaddAttr(LYUnderlineLinks ? A_UNDERLINE : A_BOLD)
+#define stop_bold() LYsubAttr(LYUnderlineLinks ? A_UNDERLINE : A_BOLD)
+#define start_underline() LYaddAttr(LYUnderlineLinks ? A_BOLD : A_UNDERLINE)
+#define stop_underline() LYsubAttr(LYUnderlineLinks ? A_BOLD : A_UNDERLINE)
+
+#define start_reverse() LYaddAttr(A_REVERSE)
+#define wstart_reverse(w) LYaddWAttr(w, A_REVERSE)
+#define stop_reverse() LYsubAttr(A_REVERSE)
+#define wstop_reverse(w) LYsubWAttr(w, A_REVERSE)
+
+#endif /* VMS */
+
+#else /* Not FANCY_CURSES: */
+/* *INDENT-OFF* */
+#ifdef COLOR_CURSES
+#undef COLOR_CURSES
+Error FANCY_CURSES
+There is a problem with the configuration. We expect to have FANCY_CURSES
+defined when COLOR_CURSES is defined, since we build on the attributes used in
+FANCY_CURSES. Check your config.log to see why the FANCY_CURSES test failed.
+#endif
+/* *INDENT-ON* */
+
+/*
+ * We only have [w]standout() and [w]standin(),
+ * so we'll use them synonymously for bold and
+ * reverse, and ignore underline. - FM
+ */
+#define start_bold() standout()
+#define start_underline() /* nothing */
+#define start_reverse() standout()
+#define wstart_reverse(a) wstandout(a)
+#define stop_bold() standend()
+#define stop_underline() /* nothing */
+#define stop_reverse() standend()
+#define wstop_reverse(a) wstandend(a)
+
+#endif /* FANCY_CURSES */
+
+#ifdef __hpux /* FIXME: configure check */
+#undef ACS_UARROW
+#undef ACS_DARROW
+#undef ACS_LARROW
+#undef ACS_RARROW
+#undef ACS_BLOCK
+#undef ACS_CKBOARD
+#endif
+
+#ifndef ACS_UARROW
+#define ACS_UARROW '^'
+#endif
+
+#ifndef ACS_DARROW
+#define ACS_DARROW 'V'
+#endif
+
+#ifndef ACS_LARROW
+#define ACS_LARROW '{'
+#endif
+
+#ifndef ACS_RARROW
+#define ACS_RARROW '}'
+#endif
+
+#ifndef ACS_BLOCK
+#define ACS_BLOCK '}'
+#endif
+
+#ifndef ACS_CKBOARD
+#define ACS_CKBOARD '}'
+#endif
+
+#define LYaddch(ch) waddch(LYwin, ch)
+
+#define addch_raw(ch) LYaddch(ch)
+
+#endif /* USE_SLANG */
+
+#ifdef USE_SLANG
+#define LYGetYX(y, x) y = SLsmg_get_row(), x = SLsmg_get_column()
+#else
+#ifdef getyx
+#define LYGetYX(y, x) getyx(LYwin, y, x)
+#else
+#define LYGetYX(y, x) y = LYwin->_cury, x = LYwin->_curx
+#endif /* getyx */
+#endif /* USE_SLANG */
+
+/*
+ * If the screen library allows us to specify "default" color, allow user to
+ * control it.
+ */
+#ifdef USE_DEFAULT_COLORS
+#if defined(USE_SLANG) || defined(HAVE_ASSUME_DEFAULT_COLORS)
+#define EXP_ASSUMED_COLOR 1
+#endif
+#endif
+
+ extern void lynx_enable_mouse(int);
+ extern void lynx_force_repaint(void);
+ extern void lynx_nl2crlf(int normal);
+ extern void lynx_start_title_color(void);
+ extern void lynx_stop_title_color(void);
+ extern void lynx_start_link_color(int flag, int pending);
+ extern void lynx_stop_link_color(int flag, int pending);
+ extern void lynx_stop_target_color(void);
+ extern void lynx_start_target_color(void);
+ extern void lynx_start_status_color(void);
+ extern void lynx_stop_status_color(void);
+ extern void lynx_start_h1_color(void);
+ extern void lynx_stop_h1_color(void);
+ extern void lynx_start_prompt_color(void);
+ extern void lynx_stop_prompt_color(void);
+ extern void lynx_start_radio_color(void);
+ extern void lynx_stop_radio_color(void);
+ extern void lynx_stop_all_colors(void);
+
+ extern void lynx_start_bold(void);
+ extern void lynx_start_reverse(void);
+ extern void lynx_start_underline(void);
+ extern void lynx_stop_bold(void);
+ extern void lynx_stop_reverse(void);
+ extern void lynx_stop_underline(void);
+
+ extern void restart_curses(void);
+
+/*
+ * To prevent corrupting binary data on DOS, MS-WINDOWS or OS/2 we open files
+ * and stdout in BINARY mode by default. Where necessary we should open and
+ * (close!) TEXT mode.
+ *
+ * Note: EMX has no corresponding variable like _fmode on DOS, but it does
+ * have setmode.
+ */
+#if defined(_WINDOWS) || defined(DJGPP) || defined(__EMX__) || defined(WIN_EX)
+#define SetOutputMode(mode) fflush(stdout), setmode(fileno(stdout), mode)
+#else
+#define SetOutputMode(mode) /* nothing */
+#endif
+
+#if defined(_WINDOWS) || defined(DJGPP)
+#define SetDefaultMode(mode) _fmode = mode
+#else
+#define SetDefaultMode(mode) /* nothing */
+#endif
+
+/*
+ * Very old versions of curses cannot put the cursor on the lower right corner.
+ * Adjust our "hidden" cursor position accordingly.
+ */
+#if defined(FANCY_CURSES) || defined(USE_SLANG)
+#define LYHideCursor() LYmove((LYlines - 1), (LYcolLimit - 1))
+#else
+#define LYHideCursor() LYmove((LYlines - 1), (LYcolLimit - 2))
+#endif
+
+#define LYParkCursor() LYmove((LYlines - 1), 0); LYclrtoeol()
+
+ extern void LYstowCursor(WINDOW * win, int row, int col);
+ extern void LYSetDisplayLines(void);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* LYCURSES_H */
diff --git a/src/LYDownload.c b/src/LYDownload.c
new file mode 100644
index 0000000..afd6638
--- /dev/null
+++ b/src/LYDownload.c
@@ -0,0 +1,591 @@
+/* $LynxId: LYDownload.c,v 1.72 2021/07/29 20:30:00 tom Exp $ */
+#include <HTUtils.h>
+#include <HTParse.h>
+#include <HTList.h>
+#include <HTAlert.h>
+#include <LYCurses.h>
+#include <LYUtils.h>
+#include <LYGlobalDefs.h>
+#include <LYStrings.h>
+#include <LYDownload.h>
+
+#include <LYLeaks.h>
+
+/*
+ * LYDownload takes a URL and downloads it using a user selected download
+ * program
+ *
+ * It parses an incoming link that looks like
+ *
+ * LYNXDOWNLOAD://Method=<#>/File=<STRING>/SugFile=<STRING>
+ */
+#ifdef VMS
+BOOLEAN LYDidRename = FALSE;
+#endif /* VMS */
+
+static char LYValidDownloadFile[LY_MAXPATH] = "\0";
+
+void LYDownload(char *line)
+{
+ char *Line = NULL, *method, *file, *sug_file = NULL;
+ int method_number;
+ int count;
+ char *the_command = 0;
+ bstring *buffer = NULL;
+ bstring *command = NULL;
+ char *cp;
+ lynx_list_item_type *download_command = 0;
+ int ch;
+ RecallType recall;
+ int FnameTotal;
+ int FnameNum;
+ BOOLEAN FirstRecall = TRUE;
+ BOOLEAN SecondS = FALSE;
+
+#ifdef VMS
+ LYDidRename = FALSE;
+#endif /* VMS */
+
+ /*
+ * Make sure we have a valid download file comparison string loaded via the
+ * download options menu. - FM
+ */
+ if (LYValidDownloadFile[0] == '\0') {
+ goto failed;
+ }
+
+ /*
+ * Make a copy of the LYNXDOWNLOAD internal URL for parsing. - FM
+ */
+ if (StrAllocCopy(Line, line) == 0)
+ goto failed;
+
+ /*
+ * Parse out the File, sug_file, and the Method.
+ */
+ if ((file = LYstrstr(Line, "/File=")) == NULL)
+ goto failed;
+ *file = '\0';
+ /*
+ * Go past "File=".
+ */
+ file += 6;
+
+ if ((sug_file = LYstrstr(file + 1, "/SugFile=")) != NULL) {
+ *sug_file = '\0';
+ /*
+ * Go past "SugFile=".
+ */
+ sug_file += 9;
+ HTUnEscape(sug_file);
+ }
+
+ /*
+ * Make sure that the file string is the one from the last displayed
+ * download options menu. - FM
+ */
+ if (strcmp(file, LYValidDownloadFile)) {
+ goto failed;
+ }
+#if defined(DIRED_SUPPORT)
+ /* FIXME: use HTLocalName */
+ if (!StrNCmp(file, "file://localhost", 16)) {
+#ifdef __DJGPP__
+ if (!StrNCmp(file + 16, "/dev/", 5))
+ file += 16;
+ else {
+ file += 17;
+ file = HTDOS_name(file);
+ }
+#else
+ file += 16;
+#endif /* __DJGPP__ */
+ } else if (isFILE_URL(file))
+ file += LEN_FILE_URL;
+ HTUnEscape(file);
+#else
+#if defined(_WINDOWS) /* 1997/10/15 (Wed) 16:27:38 */
+ if (!StrNCmp(file, "file://localhost/", 17))
+ file += 17;
+ else if (!StrNCmp(file, "file:/", 6))
+ file += 6;
+ HTUnEscape(file);
+#endif /* _WINDOWS */
+#endif /* DIRED_SUPPORT */
+
+ if ((method = LYstrstr(Line, "Method=")) == NULL)
+ goto failed;
+ /*
+ * Go past "Method=".
+ */
+ method += 7;
+ method_number = atoi(method);
+
+ /*
+ * Set up the sug_filenames recall buffer.
+ */
+ FnameTotal = (sug_filenames ? HTList_count(sug_filenames) : 0);
+ recall = ((FnameTotal >= 1) ? RECALL_URL : NORECALL);
+ FnameNum = FnameTotal;
+
+ if (method_number < 0) {
+ /*
+ * Write to local file.
+ */
+ _statusline(FILENAME_PROMPT);
+ retry:
+ if (sug_file) {
+ BStrCopy0(buffer, sug_file);
+ } else {
+ BStrCopy0(buffer, "");
+ }
+
+ check_recall:
+ if ((ch = LYgetBString(&buffer, FALSE, 0, recall)) < 0 ||
+ isBEmpty(buffer) ||
+ ch == UPARROW_KEY ||
+ ch == DNARROW_KEY) {
+
+ if (recall && ch == UPARROW_KEY) {
+ if (FirstRecall) {
+ FirstRecall = FALSE;
+ /*
+ * Use the last Fname in the list. - FM
+ */
+ FnameNum = 0;
+ } else {
+ /*
+ * Go back to the previous Fname in the list. - FM
+ */
+ FnameNum++;
+ }
+ if (FnameNum >= FnameTotal) {
+ /*
+ * Reset the FirstRecall flag, and use sug_file or a blank.
+ * - FM
+ */
+ FirstRecall = TRUE;
+ FnameNum = FnameTotal;
+ _statusline(FILENAME_PROMPT);
+ goto retry;
+ } else if ((cp = (char *) HTList_objectAt(sug_filenames,
+ FnameNum)) != NULL) {
+ BStrCopy0(buffer, cp);
+ if (FnameTotal == 1) {
+ _statusline(EDIT_THE_PREV_FILENAME);
+ } else {
+ _statusline(EDIT_A_PREV_FILENAME);
+ }
+ goto check_recall;
+ }
+ } else if (recall && ch == DNARROW_KEY) {
+ if (FirstRecall) {
+ FirstRecall = FALSE;
+ /*
+ * Use the first Fname in the list. - FM
+ */
+ FnameNum = FnameTotal - 1;
+ } else {
+ /*
+ * Advance to the next Fname in the list. - FM
+ */
+ FnameNum--;
+ }
+ if (FnameNum < 0) {
+ /*
+ * Set the FirstRecall flag, and use sug_file or a blank.
+ * - FM
+ */
+ FirstRecall = TRUE;
+ FnameNum = FnameTotal;
+ _statusline(FILENAME_PROMPT);
+ goto retry;
+ } else if ((cp = (char *) HTList_objectAt(sug_filenames,
+ FnameNum)) != NULL) {
+ BStrCopy0(buffer, cp);
+ if (FnameTotal == 1) {
+ _statusline(EDIT_THE_PREV_FILENAME);
+ } else {
+ _statusline(EDIT_A_PREV_FILENAME);
+ }
+ goto check_recall;
+ }
+ }
+
+ /*
+ * Save cancelled.
+ */
+ goto cancelled;
+ }
+
+ BStrCopy(command, buffer);
+ if (!LYValidateFilename(&buffer, &command))
+ goto cancelled;
+#ifdef HAVE_POPEN
+ else if (LYIsPipeCommand(buffer->str)) {
+ /* I don't know how to download to a pipe */
+ HTAlert(CANNOT_WRITE_TO_FILE);
+ _statusline(NEW_FILENAME_PROMPT);
+ FirstRecall = TRUE;
+ FnameNum = FnameTotal;
+ goto retry;
+ }
+#endif
+
+ /*
+ * See if it already exists.
+ */
+ switch (LYValidateOutput(buffer->str)) {
+ case 'Y':
+ break;
+ case 'N':
+ _statusline(NEW_FILENAME_PROMPT);
+ FirstRecall = TRUE;
+ FnameNum = FnameTotal;
+ goto retry;
+ default:
+ goto cleanup;
+ }
+
+ /*
+ * See if we can write to it.
+ */
+ CTRACE((tfp, "LYDownload: filename is %s\n", buffer->str));
+
+ SecondS = TRUE;
+
+ HTInfoMsg(SAVING);
+#ifdef VMS
+ /*
+ * Try rename() first. - FM
+ */
+ CTRACE((tfp, "command: rename(%s, %s)\n", file, buffer->str));
+ if (rename(file, buffer->str)) {
+ /*
+ * Failed. Use spawned COPY_COMMAND. - FM
+ */
+ CTRACE((tfp, " FAILED!\n"));
+ LYCopyFile(file, buffer->str);
+ } else {
+ /*
+ * We don't have the temporary file (it was renamed to a permanent
+ * file), so set a flag to pop out of the download menu. - FM
+ */
+ LYDidRename = TRUE;
+ }
+ chmod(buffer->str, HIDE_CHMOD);
+#else /* Unix: */
+
+ LYCopyFile(file, buffer->str);
+ LYRelaxFilePermissions(buffer->str);
+#endif /* VMS */
+
+ } else {
+ /*
+ * Use configured download commands.
+ */
+ BStrCopy0(buffer, "");
+ for (count = 0, download_command = downloaders;
+ count < method_number;
+ count++, download_command = download_command->next) ; /* null body */
+
+ /*
+ * Commands have the form "command %s [etc]" where %s is the filename.
+ */
+ if (download_command->command != NULL) {
+ /*
+ * Check for two '%s' and ask for the local filename if there is.
+ */
+ if (HTCountCommandArgs(download_command->command) >= 2) {
+ _statusline(FILENAME_PROMPT);
+
+ again:
+ if (sug_file) {
+ BStrCopy0(buffer, sug_file);
+ } else {
+ BStrCopy0(buffer, "");
+ }
+
+ check_again:
+ if ((ch = LYgetBString(&buffer, FALSE, 0, recall)) < 0 ||
+ isBEmpty(buffer) ||
+ ch == UPARROW_KEY ||
+ ch == DNARROW_KEY) {
+
+ if (recall && ch == UPARROW_KEY) {
+ if (FirstRecall) {
+ FirstRecall = FALSE;
+ /*
+ * Use the last Fname in the list. - FM
+ */
+ FnameNum = 0;
+ } else {
+ /*
+ * Go back to the previous Fname in the list. - FM
+ */
+ FnameNum++;
+ }
+ if (FnameNum >= FnameTotal) {
+ /*
+ * Reset the FirstRecall flag, and use sug_file or
+ * a blank. - FM
+ */
+ FirstRecall = TRUE;
+ FnameNum = FnameTotal;
+ _statusline(FILENAME_PROMPT);
+ goto again;
+ } else if ((cp = (char *) HTList_objectAt(sug_filenames,
+ FnameNum))
+ != NULL) {
+ BStrCopy0(buffer, cp);
+ if (FnameTotal == 1) {
+ _statusline(EDIT_THE_PREV_FILENAME);
+ } else {
+ _statusline(EDIT_A_PREV_FILENAME);
+ }
+ goto check_again;
+ }
+ } else if (recall && ch == DNARROW_KEY) {
+ if (FirstRecall) {
+ FirstRecall = FALSE;
+ /*
+ * Use the first Fname in the list. - FM
+ */
+ FnameNum = FnameTotal - 1;
+ } else {
+ /*
+ * Advance to the next Fname in the list. - FM
+ */
+ FnameNum--;
+ }
+ if (FnameNum < 0) {
+ /*
+ * Set the FirstRecall flag, and use sug_file or a
+ * blank. - FM
+ */
+ FirstRecall = TRUE;
+ FnameNum = FnameTotal;
+ _statusline(FILENAME_PROMPT);
+ goto again;
+ } else if ((cp = (char *) HTList_objectAt(sug_filenames,
+ FnameNum))
+ != NULL) {
+ BStrCopy0(buffer, cp);
+ if (FnameTotal == 1) {
+ _statusline(EDIT_THE_PREV_FILENAME);
+ } else {
+ _statusline(EDIT_A_PREV_FILENAME);
+ }
+ goto check_again;
+ }
+ }
+
+ /*
+ * Download cancelled.
+ */
+ goto cancelled;
+ }
+
+ if (no_dotfiles || !show_dotfiles) {
+ if (*LYPathLeaf(buffer->str) == '.') {
+ HTAlert(FILENAME_CANNOT_BE_DOT);
+ _statusline(NEW_FILENAME_PROMPT);
+ goto again;
+ }
+ }
+ /*
+ * Cancel if the user entered "/dev/null" on Unix, or an "nl:"
+ * path on VMS. - FM
+ */
+ if (LYIsNullDevice(buffer->str)) {
+ goto cancelled;
+ }
+ SecondS = TRUE;
+ }
+
+ /*
+ * The following is considered a bug by the community. If the
+ * command only takes one argument on the command line, then the
+ * suggested file name is not used. It actually is not a bug at
+ * all and does as it should, putting both names on the command
+ * line.
+ */
+ count = 1;
+ HTAddParam(&the_command, download_command->command, count, file);
+ if (HTCountCommandArgs(download_command->command) > 1)
+ HTAddParam(&the_command, download_command->command, ++count, buffer->str);
+ HTEndParam(&the_command, download_command->command, count);
+
+ } else {
+ HTAlert(MISCONF_DOWNLOAD_COMMAND);
+ goto failed;
+ }
+
+ CTRACE((tfp, "command: %s\n", the_command));
+ stop_curses();
+ LYSystem(the_command);
+ FREE(the_command);
+ start_curses();
+ /* don't remove(file); */
+ }
+
+ if (SecondS == TRUE) {
+#ifdef VMS
+ if (0 == strncasecomp(buffer->str, "sys$disk:", 9)) {
+ if (0 == StrNCmp((buffer->str + 9), "[]", 2)) {
+ HTAddSugFilename(buffer->str + 11);
+ } else {
+ HTAddSugFilename(buffer->str + 9);
+ }
+ } else {
+ HTAddSugFilename(buffer->str);
+ }
+#else
+ HTAddSugFilename(buffer->str);
+#endif /* VMS */
+ }
+ goto cleanup;
+
+ failed:
+ HTAlert(CANNOT_DOWNLOAD_FILE);
+ goto cleanup;
+
+ cancelled:
+ HTInfoMsg(CANCELLING);
+
+ cleanup:
+ FREE(Line);
+ BStrFree(buffer);
+ BStrFree(command);
+ return;
+}
+
+/*
+ * Compare a filename with a given suffix, which we have set to give a rough
+ * idea of its content.
+ */
+static int SuffixIs(char *filename, const char *suffix)
+{
+ size_t have = strlen(filename);
+ size_t need = strlen(suffix);
+
+ return have > need && !strcmp(filename + have - need, suffix);
+}
+
+/*
+ * LYdownload_options writes out the current download choices to a file so that
+ * the user can select downloaders in the same way that they select all other
+ * links. Download links look like:
+ * LYNXDOWNLOAD://Method=<#>/File=<STRING>/SugFile=<STRING>
+ */
+int LYdownload_options(char **newfile, char *data_file)
+{
+ static char tempfile[LY_MAXPATH] = "\0";
+ char *downloaded_url = NULL;
+ char *sug_filename = NULL;
+ FILE *fp0;
+ lynx_list_item_type *cur_download;
+ int count;
+
+ /*
+ * Get a suggested filename.
+ */
+ StrAllocCopy(sug_filename, *newfile);
+ change_sug_filename(sug_filename);
+
+ if ((fp0 = InternalPageFP(tempfile, TRUE)) == 0)
+ return (-1);
+
+ StrAllocCopy(downloaded_url, *newfile);
+ LYLocalFileToURL(newfile, tempfile);
+
+ LYStrNCpy(LYValidDownloadFile,
+ data_file,
+ (sizeof(LYValidDownloadFile) - 1));
+ LYforce_no_cache = TRUE; /* don't cache this doc */
+
+ BeginInternalPage(fp0, DOWNLOAD_OPTIONS_TITLE, DOWNLOAD_OPTIONS_HELP);
+
+ fprintf(fp0, "<pre>\n");
+ fprintf(fp0, "<em>%s</em> %s\n",
+ gettext("Downloaded link:"),
+ downloaded_url);
+ FREE(downloaded_url);
+
+ fprintf(fp0, "<em>%s</em> %s\n",
+ gettext("Suggested file name:"),
+ sug_filename);
+
+ fprintf(fp0, "\n%s\n",
+ (user_mode == NOVICE_MODE)
+ ? gettext("Standard download options:")
+ : gettext("Download options:"));
+
+ if (!no_disk_save) {
+#if defined(DIRED_SUPPORT)
+ /*
+ * Disable save to disk option for local files.
+ */
+ if (!lynx_edit_mode)
+#endif /* DIRED_SUPPORT */
+ {
+ fprintf(fp0,
+ " <a href=\"%s//Method=-1/File=%s/SugFile=%s%s\">%s</a>\n",
+ STR_LYNXDOWNLOAD,
+ data_file,
+ NonNull(lynx_save_space),
+ sug_filename,
+ gettext("Save to disk"));
+ /*
+ * If it is not a binary file, offer the opportunity to view the
+ * downloaded temporary file (see HTSaveToFile).
+ */
+ if (SuffixIs(data_file, HTML_SUFFIX)
+ || SuffixIs(data_file, TEXT_SUFFIX)) {
+ char *target = NULL;
+ char *source = LYAddPathToSave(data_file);
+
+ LYLocalFileToURL(&target, source);
+ fprintf(fp0,
+ " <a href=\"%s\">%s</a>\n",
+ target,
+ gettext("View temporary file"));
+
+ FREE(source);
+ FREE(target);
+ }
+ }
+ } else {
+ fprintf(fp0, " <em>%s</em>\n", gettext("Save to disk disabled."));
+ }
+
+ if (user_mode == NOVICE_MODE)
+ fprintf(fp0, "\n%s\n", gettext("Local additions:"));
+
+ if (downloaders != NULL) {
+ for (count = 0, cur_download = downloaders; cur_download != NULL;
+ cur_download = cur_download->next, count++) {
+ if (!no_download || cur_download->always_enabled) {
+ fprintf(fp0,
+ " <a href=\"%s//Method=%d/File=%s/SugFile=%s\">",
+ STR_LYNXDOWNLOAD, count, data_file, sug_filename);
+ fprintf(fp0, "%s", (cur_download->name
+ ? cur_download->name
+ : gettext("No Name Given")));
+ fprintf(fp0, "</a>\n");
+ }
+ }
+ }
+
+ fprintf(fp0, "</pre>\n");
+ EndInternalPage(fp0);
+ LYCloseTempFP(fp0);
+ LYRegisterUIPage(*newfile, UIP_DOWNLOAD_OPTIONS);
+
+ /*
+ * Free off temp copy.
+ */
+ FREE(sug_filename);
+
+ return (0);
+}
diff --git a/src/LYDownload.h b/src/LYDownload.h
new file mode 100644
index 0000000..5926df8
--- /dev/null
+++ b/src/LYDownload.h
@@ -0,0 +1,21 @@
+#ifndef LYDOWNLOAD_H
+#define LYDOWNLOAD_H
+
+#ifndef LYSTRUCTS_H
+#include <LYStructs.h>
+#endif /* LYSTRUCTS_H */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ extern void LYDownload(char *line);
+ extern int LYdownload_options(char **newfile, char *data_file);
+
+#ifdef VMS
+ extern BOOLEAN LYDidRename;
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* LYDOWNLOAD_H */
diff --git a/src/LYEdit.c b/src/LYEdit.c
new file mode 100644
index 0000000..304bb4e
--- /dev/null
+++ b/src/LYEdit.c
@@ -0,0 +1,298 @@
+/* $LynxId: LYEdit.c,v 1.43 2021/06/09 21:39:57 tom Exp $ */
+#include <HTUtils.h>
+#include <HTParse.h>
+#include <HTAlert.h>
+#include <LYCurses.h>
+#include <LYUtils.h>
+#include <LYGlobalDefs.h>
+#include <LYStrings.h>
+#include <LYEdit.h>
+#ifdef VMS
+#include <unixio.h>
+#endif /* VMS */
+
+#include <LYLeaks.h>
+#include <www_wait.h>
+
+BOOLEAN editor_can_position(void)
+{
+ char *value;
+ HTList *p = positionable_editor;
+ static const char *table[] =
+ {
+#ifdef VMS
+ "sedt",
+#else
+ "emacs", /* + xemacs */
+ "jed",
+ "jmacs",
+ "joe", /* + rjoe */
+ "jove",
+ "jstar",
+ "nano",
+ "pico", /* + jpico */
+ "vi" /* + vim, xvi, vile, elvis, view... + likely false matches */
+#endif
+ };
+ unsigned n;
+
+ for (n = 0; n < TABLESIZE(table); n++) {
+ if (LYstrstr(editor, table[n]) != 0) {
+ return TRUE;
+ }
+ }
+ /*
+ * This really isn't right. LYstrstr() might be too lax,
+ * but this should at least match basename to basename...
+ */
+ if (positionable_editor != NULL) {
+ while ((value = (char *) HTList_nextObject(p)) != NULL) {
+ if (strcmp(editor, value) == 0) {
+ return TRUE;
+ }
+ }
+ }
+ return FALSE;
+}
+
+/*
+ * In edit mode invoke the given (or default) editor to display and edit the
+ * current file. For editors listed in 'editor_can_position()', Lynx will open
+ * the file to the same line that the screen cursor is on (or close...) when
+ * editing is invoked.
+ *
+ * Returns FALSE if file is uneditable.
+ */
+int edit_current_file(char *newfile,
+ int cur,
+ int lineno)
+{
+ int result = FALSE;
+ char *filename = NULL;
+
+#if !(defined(VMS) || defined(USE_DOS_DRIVES))
+ char *colon;
+#endif
+ char *number_sign;
+ char position[80];
+
+#if defined(VMS) || defined(CANT_EDIT_UNWRITABLE_FILES)
+ FILE *fp;
+#endif
+
+ CTRACE((tfp, "edit_current_file(newfile=%s, cur=%d, lineno=%d)\n",
+ newfile, cur, lineno));
+
+ /*
+ * If it's a remote file then we can't edit it.
+ */
+ if (!LYisLocalFile(newfile)) {
+ HTUserMsg(CANNOT_EDIT_REMOTE_FILES);
+ return FALSE;
+ }
+
+ /*
+ * If there's a fragment, trim it. - FM
+ */
+ number_sign = trimPoundSelector(newfile);
+
+ /*
+ * On Unix, first try to open it as a completely referenced file, then via
+ * the path alone.
+ *
+ * On VMS, only try the path.
+ */
+#if defined (VMS) || defined (USE_DOS_DRIVES)
+ filename = HTParse(newfile, "", PARSE_PATH + PARSE_PUNCTUATION);
+ HTUnEscape(filename);
+ StrAllocCopy(filename, HTSYS_name(filename));
+ if (!LYCanReadFile(filename)) {
+#ifdef SH_EX
+ HTUserMsg2(COULD_NOT_EDIT_FILE, filename);
+#else
+ HTAlert(COULD_NOT_ACCESS_FILE);
+#endif
+ CTRACE((tfp, "filename: '%s'\n", filename));
+ goto done;
+ }
+#else /* something like UNIX */
+ if (StrNCmp(newfile, "file://localhost/", 16) == 0)
+ colon = newfile + 16;
+ else
+ colon = StrChr(newfile, ':');
+ StrAllocCopy(filename, (colon + 1));
+ HTUnEscape(filename);
+ if (!LYCanReadFile(filename)) {
+ FREE(filename);
+ filename = HTParse(newfile, "", PARSE_PATH + PARSE_PUNCTUATION);
+ HTUnEscape(filename);
+ if (!LYCanReadFile(HTSYS_name(filename))) {
+ HTAlert(COULD_NOT_ACCESS_FILE);
+ goto done;
+ }
+ }
+#endif
+
+#if defined(VMS) || defined(CANT_EDIT_UNWRITABLE_FILES)
+ /*
+ * Don't allow editing if user lacks append access.
+ */
+ if ((fp = fopen(filename, TXT_A)) == NULL) {
+ HTUserMsg(NOAUTH_TO_EDIT_FILE);
+ goto done;
+ }
+ fclose(fp);
+#endif /* VMS || CANT_EDIT_UNWRITABLE_FILES */
+
+ /*
+ * Make sure cur is at least zero. - FM
+ */
+ if (cur < 0) {
+ cur = 0;
+ }
+
+ /*
+ * Set up the command for the editor. - FM
+ */
+ if (lineno >= 0) {
+ *position = 0;
+#ifdef VMS
+ lineno--;
+#endif
+ lineno += (nlinks ? links[cur].ly : 0);
+ if (lineno > 0)
+ sprintf(position, "%d", lineno);
+ } else {
+ *position = '\0';
+ }
+
+ edit_temporary_file(filename, position, NULL);
+ result = TRUE;
+
+ done:
+ /*
+ * Restore the fragment if there was one. - FM
+ */
+ restorePoundSelector(number_sign);
+
+ FREE(filename);
+ CTRACE((tfp, "edit_current_file returns %d\n", result));
+ return (result);
+}
+
+void edit_temporary_file(char *filename,
+ const char *position,
+ const char *message)
+{
+#ifdef UNIX
+ struct stat stat_info;
+#endif
+ const char *format = "%s %s";
+ char *command = NULL;
+ const char *editor_arg = "";
+ int params = 1;
+ int rv;
+
+ if (LYstrstr(editor, "pico")) {
+ editor_arg = " -t"; /* No prompt for filename to use */
+ }
+ if (editor_can_position() && *position) {
+#ifdef VMS
+ format = "%s %s -%s%s";
+ HTAddXpand(&command, format, params++, editor);
+ HTAddParam(&command, format, params++, filename);
+ HTAddParam(&command, format, params++, position);
+ HTAddParam(&command, format, params++, editor_arg);
+ HTEndParam(&command, format, params);
+#else
+ format = "%s +%s%s %s";
+ HTAddXpand(&command, format, params++, editor);
+ HTAddParam(&command, format, params++, position);
+ HTAddParam(&command, format, params++, editor_arg);
+ HTAddParam(&command, format, params++, filename);
+ HTEndParam(&command, format, params);
+#endif
+ }
+#ifdef DOSPATH
+ else if (StrNCmp(editor, "VZ", 2) == 0) {
+ /* for Vz editor */
+ format = "%s %s -%s";
+ HTAddXpand(&command, format, params++, editor);
+ HTAddParam(&command, format, params++, HTDOS_short_name(filename));
+ HTAddParam(&command, format, params++, position);
+ HTEndParam(&command, format, params);
+ } else if (StrNCmp(editor, "edit", 4) == 0) {
+ /* for standard editor */
+ HTAddXpand(&command, format, params++, editor);
+ HTAddParam(&command, format, params++, HTDOS_short_name(filename));
+ HTEndParam(&command, format, params);
+ }
+#endif
+ else {
+#ifdef _WINDOWS
+ if (StrChr(editor, ' '))
+ HTAddXpand(&command, format, params++, HTDOS_short_name(editor));
+ else
+ HTAddXpand(&command, format, params++, editor);
+#else
+ HTAddXpand(&command, format, params++, editor);
+#endif
+ HTAddParam(&command, format, params++, filename);
+ HTEndParam(&command, format, params);
+ }
+ if (message != NULL) {
+ _statusline(message);
+ }
+
+ CTRACE((tfp, "LYEdit: %s\n", command));
+ CTRACE_SLEEP(MessageSecs);
+
+ stop_curses();
+
+#ifdef UNIX
+ set_errno(0);
+#endif
+ if ((rv = LYSystem(command)) != 0) { /* Spawn Editor */
+ start_curses();
+ /*
+ * If something went wrong, we should probably return soon; currently
+ * we don't, but at least put out a message. - kw
+ */
+ {
+#if defined(UNIX) && defined(WIFEXITED)
+ int save_err = errno;
+
+ CTRACE((tfp, "ExtEditForm: system() returned %d (0x%x), %s\n",
+ rv, (unsigned) rv,
+ (save_err
+ ? LYStrerror(save_err)
+ : "reason unknown")));
+ LYFixCursesOn("show error warning:");
+ if (rv == -1) {
+ HTUserMsg2(gettext("Error starting editor, %s"),
+ LYStrerror(save_err));
+ } else if (WIFSIGNALED(rv)) {
+ HTAlwaysAlert(NULL, gettext("Editor killed by signal"));
+ } else if (WIFEXITED(rv) && WEXITSTATUS(rv) != 127) {
+ char exitcode[80];
+
+ sprintf(exitcode, "%d", WEXITSTATUS(rv));
+ HTUserMsg2(gettext("Editor returned with error status %s"),
+ exitcode);
+ } else
+#endif
+ HTAlwaysAlert(NULL, ERROR_SPAWNING_EDITOR);
+ }
+ } else {
+ start_curses();
+ }
+#ifdef UNIX
+ /*
+ * Delete backup file, if that's your style.
+ */
+ HTSprintf0(&command, "%s~", filename);
+ if (stat(command, &stat_info) == 0)
+ remove(command);
+#endif
+ FREE(command);
+}
diff --git a/src/LYEdit.h b/src/LYEdit.h
new file mode 100644
index 0000000..3c07062
--- /dev/null
+++ b/src/LYEdit.h
@@ -0,0 +1,18 @@
+#ifndef LYEDIT_H
+#define LYEDIT_H
+
+#ifndef HTUTILS_H
+#include <HTUtils.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ extern BOOLEAN editor_can_position(void);
+ extern int edit_current_file(char *newfile, int cur, int lineno);
+ extern void edit_temporary_file(char *filename, const char *position, const char *message);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* LYEDIT_H */
diff --git a/src/LYEditmap.c b/src/LYEditmap.c
new file mode 100644
index 0000000..dec2ac9
--- /dev/null
+++ b/src/LYEditmap.c
@@ -0,0 +1,1931 @@
+/*
+ * $LynxId: LYEditmap.c,v 1.76 2018/12/27 10:33:52 tom Exp $
+ *
+ * LYEditMap.c
+ * Keybindings for line and form editing.
+ */
+
+#include <HTUtils.h>
+#include <HTAlert.h>
+#include <HTFile.h>
+#include <LYGlobalDefs.h>
+#include <LYCharUtils.h>
+#include <LYStrings.h>
+#include <LYKeymap.h> /* KEYMAP_SIZE, LKC_*, LYK_* - kw */
+#include <LYLeaks.h>
+
+#define PUTS(buf) (*target->isa->put_string)(target, buf)
+
+/* * * * * LynxEditactionCodes * * * * */
+#ifdef USE_ALT_BINDINGS
+
+/* Last valid index for the (lynxkeycode+modifier -> lynxeditactioncode)
+ * tables. Currently all three tables are the same. - kw
+ */
+#define LAST_MOD1_LKC 0x111
+#define LAST_MOD2_LKC 0x111
+#define LAST_MOD3_LKC 0x111
+
+/* Get (lynxkeycode+modifier -> lynxeditactioncode) mapping, intermediate.
+ */
+#define LKC_TO_LEC_M1(c) ((c)>LAST_MOD1_LKC? (int)LYE_UNMOD: Mod1Binding[c])
+#define LKC_TO_LEC_M2(c) ((c)>LAST_MOD2_LKC? (int)LYE_UNMOD: Mod2Binding[c])
+#define LKC_TO_LEC_M3(c) ((c)>LAST_MOD3_LKC? (int)LYE_UNMOD: Mod3Binding[c])
+
+#endif /* USE_ALT_BINDINGS */
+
+int current_lineedit = 0; /* Index into LYLineEditors[] */
+
+int escape_bound = 0; /* User wanted Escape to perform actions? */
+
+/*
+ * See LYStrings.h for the LYE definitions.
+ */
+/* *INDENT-OFF* */
+struct emap {
+ const char *name;
+ const int code;
+ const char *descr;
+};
+
+#define SEPARATOR {"", -1, ""}
+
+static struct emap ekmap[] = {
+ {"NOP", LYE_NOP, "Do Nothing"},
+ {"CHAR", LYE_CHAR, "Insert printable char"},
+ SEPARATOR,
+ {"ENTER", LYE_ENTER, "Input complete, return char"},
+ {"TAB", LYE_TAB, "Input complete, return TAB"},
+ {"STOP", LYE_STOP, "Input deactivated"},
+ {"ABORT", LYE_ABORT, "Input cancelled"},
+ SEPARATOR,
+ {"PASS", LYE_FORM_PASS, "Fields only: input complete"},
+ SEPARATOR,
+ {"DELBL", LYE_DELBL, "Delete back to BOL"},
+ {"DELEL", LYE_DELEL, "Delete thru EOL"},
+ {"DELN", LYE_DELN, "Delete next/curr char"},
+ {"DELP", LYE_DELP, "Delete prev char"},
+ {"DELNW", LYE_DELNW, "Delete next word"},
+ {"DELPW", LYE_DELPW, "Delete prev word"},
+ SEPARATOR,
+
+ {"ERASE", LYE_ERASE, "Erase the line"},
+ SEPARATOR,
+ {"BOL", LYE_BOL, "Go to begin of line"},
+ {"EOL", LYE_EOL, "Go to end of line"},
+ {"FORW", LYE_FORW, "Cursor forwards"},
+ {"FORW_RL", LYE_FORW_RL, "Cursor forwards or right link"},
+ {"BACK", LYE_BACK, "Cursor backwards"},
+ {"BACK_LL", LYE_BACK_LL, "Cursor backwards or left link"},
+ {"FORWW", LYE_FORWW, "Word forward"},
+ {"BACKW", LYE_BACKW, "Word back"},
+ SEPARATOR,
+ {"LOWER", LYE_LOWER, "Lower case the line"},
+ {"UPPER", LYE_UPPER, "Upper case the line"},
+ SEPARATOR,
+ {"LKCMD", LYE_LKCMD, "Invoke command prompt"},
+ {"SWMAP", LYE_SWMAP, "Switch input keymap"},
+ SEPARATOR,
+ {"C1CHAR", LYE_C1CHAR, "Insert C1 char if printable"},
+ {"SETM1", LYE_SETM1, "Set modifier 1 flag"},
+ {"SETM2", LYE_SETM2, "Set modifier 2 flag"},
+ {"UNMOD", LYE_UNMOD, "Fall back to no-modifier command"},
+ SEPARATOR,
+ {"TPOS", LYE_TPOS, "Transpose characters"},
+ {"SETMARK", LYE_SETMARK, "emacs-like set-mark-command"},
+ {"XPMARK", LYE_XPMARK, "emacs-like exchange-point-and-mark"},
+ {"KILLREG", LYE_KILLREG, "emacs-like kill-region"},
+ {"YANK", LYE_YANK, "emacs-like yank"},
+#ifdef CAN_CUT_AND_PASTE
+ SEPARATOR,
+ {"PASTE", LYE_PASTE, "ClipBoard to Lynx"},
+#endif
+ SEPARATOR,
+ {"AIX", LYE_AIX, "Hex 97"},
+ {0, -1, 0},
+};
+#undef SEPARATOR
+/* *INDENT-ON* */
+
+static LYEditCode DefaultEditBinding[KEYMAP_SIZE];
+
+#ifdef USE_ALT_BINDINGS
+static LYEditCode BetterEditBinding[KEYMAP_SIZE];
+static LYEditCode BashlikeEditBinding[KEYMAP_SIZE];
+
+/*
+ * If a modifier bit is set in a lynxkeycode, it is first looked up here.
+ *
+ * Currently this table isn't specific to the current_lineedit value, it is
+ * shared by all alternative "Bindings" to save space. However, if the
+ * modifier flag is set only by a LYE_SETMn lynxeditaction, this table can have
+ * effect only for those Bindings that map a lynxkeycode to LYE_SETMn. ( This
+ * doesn't apply if the modifier is already being set in LYgetch(). ) - kw
+ */
+static LYEditCode Mod1Binding[KEYMAP_SIZE];
+
+/* Two more tables here, but currently they are all the same.
+ In other words, we are cheating to save space, until there
+ is a need for different tables. - kw */
+static LYEditCode *Mod2Binding = Mod1Binding;
+static LYEditCode *Mod3Binding = Mod1Binding;
+
+static const LYEditInit initMod1Binding[] =
+{
+ {CTL('A'), LYE_BOL},
+ {CTL('B'), LYE_BACKW},
+ {CTL('C'), LYE_UNMOD},
+ {CTL('D'), LYK_NEXT_LINK | LYE_FORM_LAC},
+ {CTL('E'), LYK_EDITTEXTAREA | LYE_FORM_LAC},
+ {CTL('F'), LYE_FORWW},
+ {CTL('G'), LYE_ABORT},
+ {CTL('H'), LYE_DELPW},
+ {CTL('I'), LYE_UNMOD},
+ {CTL('J'), LYE_ENTER},
+ {CTL('K'), LYK_LPOS_NEXT_LINK | LYE_FORM_LAC},
+ {CTL('L'), LYE_FORM_PASS},
+ {CTL('M'), LYE_ENTER},
+ {CTL('N'), LYE_FORWW},
+ {CTL('O'), LYE_UNMOD},
+ {CTL('P'), LYE_BACKW},
+ {CTL('R'), LYE_BACKW},
+ {CTL('U'), LYE_FORM_PASS},
+ {CTL('W'), LYE_KILLREG},
+ {CTL('X'), LYE_XPMARK},
+ {CTL('Y'), LYE_UNMOD},
+ {CTL('Z'), LYE_FORM_PASS},
+ {CTL('\\'), LYE_FORM_PASS},
+ {CTL(']'), LYE_FORM_PASS},
+ {CTL('^'), LYE_UNMOD},
+ {' ', LYE_UNMOD},
+ {'!', LYE_UNMOD},
+ {'"', LYE_UNMOD},
+ {'#', LYE_UNMOD},
+ {'$', LYE_UNMOD},
+ {'%', LYE_UNMOD},
+ {'&', LYE_UNMOD},
+ {'\'', LYE_UNMOD},
+ {'(', LYE_UNMOD},
+ {')', LYE_UNMOD},
+ {'*', LYE_UNMOD},
+ {'+', LYE_UNMOD},
+ {',', LYE_UNMOD},
+ {'-', LYE_UNMOD},
+ {'.', LYE_UNMOD},
+ {'/', LYE_FORM_PASS},
+ {'0', LYE_UNMOD},
+ {'1', LYE_UNMOD},
+ {'2', LYE_UNMOD},
+ {'3', LYE_UNMOD},
+ {'4', LYE_UNMOD},
+ {'5', LYE_UNMOD},
+ {'6', LYE_UNMOD},
+ {'7', LYE_UNMOD},
+ {'8', LYE_UNMOD},
+ {'9', LYE_UNMOD},
+ {':', LYE_UNMOD},
+ {';', LYE_UNMOD},
+ {'<', LYK_HOME | LYE_FORM_LAC},
+ {'=', LYE_UNMOD},
+ {'>', LYK_END | LYE_FORM_LAC},
+ {'?', LYE_UNMOD},
+ {'@', LYE_C1CHAR},
+ {'A', LYE_C1CHAR},
+ {'B', LYE_C1CHAR},
+ {'C', LYE_C1CHAR},
+ {'D', LYE_C1CHAR},
+ {'E', LYE_C1CHAR},
+ {'F', LYE_C1CHAR},
+ {'G', LYE_C1CHAR},
+ {'H', LYE_C1CHAR},
+ {'I', LYE_C1CHAR},
+ {'J', LYE_C1CHAR},
+ {'K', LYE_C1CHAR},
+ {'L', LYE_C1CHAR},
+ {'M', LYE_C1CHAR},
+ {'N', LYE_C1CHAR},
+ {'O', LYE_C1CHAR},
+ {'P', LYE_C1CHAR},
+ {'Q', LYE_C1CHAR},
+ {'R', LYE_C1CHAR},
+ {'S', LYE_C1CHAR},
+ {'T', LYE_C1CHAR},
+ {'U', LYE_C1CHAR},
+ {'V', LYE_C1CHAR},
+ {'W', LYE_C1CHAR},
+ {'X', LYE_C1CHAR},
+ {'Y', LYE_C1CHAR},
+ {'Z', LYE_C1CHAR},
+ {'[', LYE_C1CHAR},
+ {'\\', LYE_C1CHAR},
+ {']', LYE_C1CHAR},
+ {'^', LYE_C1CHAR},
+ {'_', LYE_C1CHAR},
+ {'`', LYE_UNMOD},
+ {'a', LYE_BOL},
+ {'b', LYE_BACKW},
+ {'c', LYE_UNMOD},
+ {'d', LYE_DELNW},
+ {'e', LYK_EDITTEXTAREA | LYE_FORM_LAC},
+ {'f', LYE_FORWW},
+ {'g', LYK_GROWTEXTAREA | LYE_FORM_LAC},
+ {'h', LYE_CHAR},
+ {'i', LYK_INSERTFILE | LYE_FORM_LAC},
+ {'j', LYE_CHAR},
+ {'k', LYE_ERASE},
+ {'l', LYE_LOWER},
+ {'m', LYE_CHAR},
+ {'n', LYE_FORM_PASS},
+ {'o', LYE_UNMOD},
+ {'p', LYE_CHAR},
+ {'u', LYE_UPPER},
+ {'z', LYE_UNMOD},
+ {'{', LYE_UNMOD},
+ {'|', LYE_UNMOD},
+ {'}', LYE_UNMOD},
+ {'~', LYE_UNMOD},
+ {DEL_KEY, LYE_DELPW},
+ {160, LYE_UNMOD},
+ {161, LYE_UNMOD},
+ {162, LYE_UNMOD},
+ {163, LYE_UNMOD},
+ {164, LYE_UNMOD},
+ {165, LYE_UNMOD},
+ {166, LYE_UNMOD},
+ {167, LYE_UNMOD},
+ {168, LYE_UNMOD},
+ {169, LYE_UNMOD},
+ {170, LYE_UNMOD},
+ {171, LYE_UNMOD},
+ {172, LYE_UNMOD},
+ {173, LYE_UNMOD},
+ {174, LYE_UNMOD},
+ {175, LYE_UNMOD},
+ {176, LYE_UNMOD},
+ {177, LYE_UNMOD},
+ {178, LYE_UNMOD},
+ {179, LYE_UNMOD},
+ {180, LYE_UNMOD},
+ {181, LYE_UNMOD},
+ {182, LYE_UNMOD},
+ {183, LYE_UNMOD},
+ {184, LYE_UNMOD},
+ {185, LYE_UNMOD},
+ {186, LYE_UNMOD},
+ {187, LYE_UNMOD},
+ {188, LYE_UNMOD},
+ {189, LYE_UNMOD},
+ {190, LYE_UNMOD},
+ {191, LYE_UNMOD},
+ {192, LYE_UNMOD},
+ {193, LYE_UNMOD},
+ {194, LYE_UNMOD},
+ {195, LYE_UNMOD},
+ {196, LYE_UNMOD},
+ {197, LYE_UNMOD},
+ {198, LYE_UNMOD},
+ {199, LYE_UNMOD},
+ {200, LYE_UNMOD},
+ {201, LYE_UNMOD},
+ {202, LYE_UNMOD},
+ {203, LYE_UNMOD},
+ {204, LYE_UNMOD},
+ {205, LYE_UNMOD},
+ {206, LYE_UNMOD},
+ {207, LYE_UNMOD},
+ {208, LYE_UNMOD},
+ {209, LYE_UNMOD},
+ {210, LYE_UNMOD},
+ {211, LYE_UNMOD},
+ {212, LYE_UNMOD},
+ {213, LYE_UNMOD},
+ {214, LYE_UNMOD},
+ {215, LYE_UNMOD},
+ {216, LYE_UNMOD},
+ {217, LYE_UNMOD},
+ {218, LYE_UNMOD},
+ {219, LYE_UNMOD},
+ {220, LYE_UNMOD},
+ {221, LYE_UNMOD},
+ {222, LYE_UNMOD},
+ {223, LYE_UNMOD},
+ {224, LYE_UNMOD},
+ {225, LYE_UNMOD},
+ {226, LYE_UNMOD},
+ {227, LYE_UNMOD},
+ {228, LYE_UNMOD},
+ {229, LYE_UNMOD},
+ {230, LYE_UNMOD},
+ {231, LYE_UNMOD},
+ {232, LYE_UNMOD},
+ {233, LYE_UNMOD},
+ {234, LYE_UNMOD},
+ {235, LYE_UNMOD},
+ {236, LYE_UNMOD},
+ {237, LYE_UNMOD},
+ {238, LYE_UNMOD},
+ {239, LYE_UNMOD},
+ {240, LYE_UNMOD},
+ {241, LYE_UNMOD},
+ {242, LYE_UNMOD},
+ {243, LYE_UNMOD},
+ {244, LYE_UNMOD},
+ {245, LYE_UNMOD},
+ {246, LYE_UNMOD},
+ {247, LYE_UNMOD},
+ {248, LYE_UNMOD},
+ {249, LYE_UNMOD},
+ {250, LYE_UNMOD},
+ {251, LYE_UNMOD},
+ {252, LYE_UNMOD},
+ {253, LYE_UNMOD},
+ {254, LYE_UNMOD},
+ {255, LYE_UNMOD},
+ {UPARROW_KEY, LYE_UNMOD},
+ {DNARROW_KEY, LYE_UNMOD},
+ {RTARROW_KEY, LYE_UNMOD},
+ {LTARROW_KEY, LYE_UNMOD},
+ {PGDOWN_KEY, LYE_UNMOD},
+ {PGUP_KEY, LYE_UNMOD},
+ {HOME_KEY, LYE_FORM_PASS},
+ {END_KEY, LYE_FORM_PASS},
+ {F1_KEY, LYK_DWIMHELP | LYE_FORM_LAC},
+ {DO_KEY, LYE_UNMOD},
+#if (defined(_WINDOWS) || defined(__DJGPP__))
+ {FIND_KEY, LYE_UNMOD},
+ {SELECT_KEY, LYE_UNMOD},
+#else
+ {FIND_KEY, LYK_WHEREIS | LYE_FORM_LAC},
+ {SELECT_KEY, LYK_NEXT | LYE_FORM_LAC},
+#endif
+ {INSERT_KEY, LYE_UNMOD},
+ {DO_NOTHING, LYE_UNMOD},
+ {BACKTAB_KEY, LYE_UNMOD},
+#if (defined(_WINDOWS) || defined(__DJGPP__)) && defined(USE_SLANG) && !defined(DJGPP_KEYHANDLER)
+ {272, LYE_DELPW},
+#else
+ {272, LYE_UNMOD},
+#endif
+ {273, LYE_UNMOD},
+ {-1, LYE_UNKNOWN}
+};
+
+LYEditConfig LYModifierBindings[] =
+{
+ {"Modifier Binding", initMod1Binding, Mod1Binding},
+};
+
+#endif /* USE_ALT_BINDINGS */
+
+static const LYEditInit initDefaultEditor[] =
+{
+ {CTL('A'), LYE_BOL},
+ {CTL('B'), LYE_DELPW},
+ {CTL('C'), LYE_ABORT},
+ {CTL('D'), LYE_DELN},
+ {CTL('E'), LYE_EOL},
+ {CTL('F'), LYE_DELNW},
+ {CTL('G'), LYE_ABORT},
+ {CTL('H'), LYE_DELP},
+ {CTL('I'), LYE_TAB},
+ {CTL('J'), LYE_ENTER},
+ {CTL('K'), LYE_LOWER},
+ {CTL('M'), LYE_ENTER},
+ {CTL('N'), LYE_FORWW},
+ {CTL('O'), LYE_ABORT},
+ {CTL('P'), LYE_BACKW},
+ {CTL('R'), LYE_DELN},
+ {CTL('T'), LYE_UPPER},
+ {CTL('U'), LYE_ERASE},
+ {CTL('V'), LYE_LKCMD},
+#ifdef CAN_CUT_AND_PASTE
+ {CTL('W'), LYE_PASTE},
+#endif
+ {CTL('X'), LYE_SETM1},
+ {CTL('^'), LYE_SWMAP},
+ {CTL('_'), LYE_DELEL},
+ {' ', LYE_CHAR},
+ {'!', LYE_CHAR},
+ {'"', LYE_CHAR},
+ {'#', LYE_CHAR},
+ {'$', LYE_CHAR},
+ {'%', LYE_CHAR},
+ {'&', LYE_CHAR},
+ {'\'', LYE_CHAR},
+ {'(', LYE_CHAR},
+ {')', LYE_CHAR},
+ {'*', LYE_CHAR},
+ {'+', LYE_CHAR},
+ {',', LYE_CHAR},
+ {'-', LYE_CHAR},
+ {'.', LYE_CHAR},
+ {'/', LYE_CHAR},
+ {'0', LYE_CHAR},
+ {'1', LYE_CHAR},
+ {'2', LYE_CHAR},
+ {'3', LYE_CHAR},
+ {'4', LYE_CHAR},
+ {'5', LYE_CHAR},
+ {'6', LYE_CHAR},
+ {'7', LYE_CHAR},
+ {'8', LYE_CHAR},
+ {'9', LYE_CHAR},
+ {':', LYE_CHAR},
+ {';', LYE_CHAR},
+ {'<', LYE_CHAR},
+ {'=', LYE_CHAR},
+ {'>', LYE_CHAR},
+ {'?', LYE_CHAR},
+ {'@', LYE_CHAR},
+ {'A', LYE_CHAR},
+ {'B', LYE_CHAR},
+ {'C', LYE_CHAR},
+ {'D', LYE_CHAR},
+ {'E', LYE_CHAR},
+ {'F', LYE_CHAR},
+ {'G', LYE_CHAR},
+ {'H', LYE_CHAR},
+ {'I', LYE_CHAR},
+ {'J', LYE_CHAR},
+ {'K', LYE_CHAR},
+ {'L', LYE_CHAR},
+ {'M', LYE_CHAR},
+ {'N', LYE_CHAR},
+ {'O', LYE_CHAR},
+ {'P', LYE_CHAR},
+ {'Q', LYE_CHAR},
+ {'R', LYE_CHAR},
+ {'S', LYE_CHAR},
+ {'T', LYE_CHAR},
+ {'U', LYE_CHAR},
+ {'V', LYE_CHAR},
+ {'W', LYE_CHAR},
+ {'X', LYE_CHAR},
+ {'Y', LYE_CHAR},
+ {'Z', LYE_CHAR},
+ {'[', LYE_CHAR},
+ {'\\', LYE_CHAR},
+ {']', LYE_CHAR},
+ {'^', LYE_CHAR},
+ {'_', LYE_CHAR},
+ {'`', LYE_CHAR},
+ {'a', LYE_CHAR},
+ {'b', LYE_CHAR},
+ {'c', LYE_CHAR},
+ {'d', LYE_CHAR},
+ {'e', LYE_CHAR},
+ {'f', LYE_CHAR},
+ {'g', LYE_CHAR},
+ {'h', LYE_CHAR},
+ {'i', LYE_CHAR},
+ {'j', LYE_CHAR},
+ {'k', LYE_CHAR},
+ {'l', LYE_CHAR},
+ {'m', LYE_CHAR},
+ {'n', LYE_CHAR},
+ {'o', LYE_CHAR},
+ {'p', LYE_CHAR},
+ {'q', LYE_CHAR},
+ {'r', LYE_CHAR},
+ {'s', LYE_CHAR},
+ {'t', LYE_CHAR},
+ {'u', LYE_CHAR},
+ {'v', LYE_CHAR},
+ {'w', LYE_CHAR},
+ {'x', LYE_CHAR},
+ {'y', LYE_CHAR},
+ {'z', LYE_CHAR},
+ {'{', LYE_CHAR},
+ {'|', LYE_CHAR},
+ {'}', LYE_CHAR},
+ {'~', LYE_CHAR},
+ {DEL_KEY, LYE_DELP},
+ {128, LYE_CHAR},
+ {129, LYE_CHAR},
+ {130, LYE_CHAR},
+ {131, LYE_CHAR},
+ {132, LYE_CHAR},
+ {133, LYE_CHAR},
+ {134, LYE_CHAR},
+ {135, LYE_CHAR},
+ {136, LYE_CHAR},
+ {137, LYE_CHAR},
+ {138, LYE_CHAR},
+ {139, LYE_CHAR},
+ {140, LYE_CHAR},
+ {141, LYE_CHAR},
+#ifdef CJK_EX /* 1997/11/03 (Mon) 20:30:54 */
+ {142, LYE_CHAR},
+#else
+ {142, LYE_AIX},
+#endif
+ {143, LYE_CHAR},
+ {144, LYE_CHAR},
+ {145, LYE_CHAR},
+ {146, LYE_CHAR},
+ {147, LYE_CHAR},
+ {148, LYE_CHAR},
+ {149, LYE_CHAR},
+ {150, LYE_CHAR},
+ {151, LYE_CHAR},
+ {152, LYE_CHAR},
+ {153, LYE_CHAR},
+ {154, LYE_CHAR},
+ {155, LYE_CHAR},
+ {156, LYE_CHAR},
+ {157, LYE_CHAR},
+ {158, LYE_CHAR},
+ {159, LYE_CHAR},
+ {160, LYE_CHAR},
+ {161, LYE_CHAR},
+ {162, LYE_CHAR},
+ {163, LYE_CHAR},
+ {164, LYE_CHAR},
+ {165, LYE_CHAR},
+ {166, LYE_CHAR},
+ {167, LYE_CHAR},
+ {168, LYE_CHAR},
+ {169, LYE_CHAR},
+ {170, LYE_CHAR},
+ {171, LYE_CHAR},
+ {172, LYE_CHAR},
+ {173, LYE_CHAR},
+ {174, LYE_CHAR},
+ {175, LYE_CHAR},
+ {176, LYE_CHAR},
+ {177, LYE_CHAR},
+ {178, LYE_CHAR},
+ {179, LYE_CHAR},
+ {180, LYE_CHAR},
+ {181, LYE_CHAR},
+ {182, LYE_CHAR},
+ {183, LYE_CHAR},
+ {184, LYE_CHAR},
+ {185, LYE_CHAR},
+ {186, LYE_CHAR},
+ {187, LYE_CHAR},
+ {188, LYE_CHAR},
+ {189, LYE_CHAR},
+ {190, LYE_CHAR},
+ {191, LYE_CHAR},
+ {192, LYE_CHAR},
+ {193, LYE_CHAR},
+ {194, LYE_CHAR},
+ {195, LYE_CHAR},
+ {196, LYE_CHAR},
+ {197, LYE_CHAR},
+ {198, LYE_CHAR},
+ {199, LYE_CHAR},
+ {200, LYE_CHAR},
+ {201, LYE_CHAR},
+ {202, LYE_CHAR},
+ {203, LYE_CHAR},
+ {204, LYE_CHAR},
+ {205, LYE_CHAR},
+ {206, LYE_CHAR},
+ {207, LYE_CHAR},
+ {208, LYE_CHAR},
+ {209, LYE_CHAR},
+ {210, LYE_CHAR},
+ {211, LYE_CHAR},
+ {212, LYE_CHAR},
+ {213, LYE_CHAR},
+ {214, LYE_CHAR},
+ {215, LYE_CHAR},
+ {216, LYE_CHAR},
+ {217, LYE_CHAR},
+ {218, LYE_CHAR},
+ {219, LYE_CHAR},
+ {220, LYE_CHAR},
+ {221, LYE_CHAR},
+ {222, LYE_CHAR},
+ {223, LYE_CHAR},
+ {224, LYE_CHAR},
+ {225, LYE_CHAR},
+ {226, LYE_CHAR},
+ {227, LYE_CHAR},
+ {228, LYE_CHAR},
+ {229, LYE_CHAR},
+ {230, LYE_CHAR},
+ {231, LYE_CHAR},
+ {232, LYE_CHAR},
+ {233, LYE_CHAR},
+ {234, LYE_CHAR},
+ {235, LYE_CHAR},
+ {236, LYE_CHAR},
+ {237, LYE_CHAR},
+ {238, LYE_CHAR},
+ {239, LYE_CHAR},
+ {240, LYE_CHAR},
+ {241, LYE_CHAR},
+ {242, LYE_CHAR},
+ {243, LYE_CHAR},
+ {244, LYE_CHAR},
+ {245, LYE_CHAR},
+ {246, LYE_CHAR},
+ {247, LYE_CHAR},
+ {248, LYE_CHAR},
+ {249, LYE_CHAR},
+ {250, LYE_CHAR},
+ {251, LYE_CHAR},
+ {252, LYE_CHAR},
+ {253, LYE_CHAR},
+ {254, LYE_CHAR},
+ {255, LYE_CHAR},
+ {UPARROW_KEY, LYE_FORM_PASS},
+ {DNARROW_KEY, LYE_FORM_PASS},
+ {RTARROW_KEY, LYE_FORW},
+ {LTARROW_KEY, LYE_BACK},
+ {PGDOWN_KEY, LYE_FORM_PASS},
+ {PGUP_KEY, LYE_FORM_PASS},
+ {HOME_KEY, LYE_BOL},
+ {END_KEY, LYE_EOL},
+ {F1_KEY, LYE_FORM_PASS},
+#if !(defined(_WINDOWS) || defined(__DJGPP__))
+ {DO_KEY, LYE_TAB},
+ {FIND_KEY, LYE_BOL},
+ {SELECT_KEY, LYE_EOL},
+#endif
+ {REMOVE_KEY, LYE_DELP},
+ {BACKTAB_KEY, LYE_FORM_PASS},
+#if (defined(_WINDOWS) || defined(__DJGPP__)) && defined(USE_SLANG) && !defined(DJGPP_KEYHANDLER)
+ {272, LYE_DELP},
+ {273, LYE_ENTER},
+#endif
+ {-1, LYE_UNKNOWN}
+};
+
+#ifdef USE_ALT_BINDINGS
+static const LYEditInit initBetterEditor[] =
+{
+ {CTL('A'), LYE_BOL},
+ {CTL('B'), LYE_BACK},
+ {CTL('C'), LYE_ABORT},
+ {CTL('D'), LYE_DELN},
+ {CTL('E'), LYE_EOL},
+ {CTL('F'), LYE_FORW},
+ {CTL('G'), LYE_ABORT},
+ {CTL('H'), LYE_DELP},
+ {CTL('I'), LYE_ENTER},
+ {CTL('J'), LYE_ENTER},
+ {CTL('K'), LYE_DELEL},
+ {CTL('M'), LYE_ENTER},
+ {CTL('N'), LYE_FORWW},
+ {CTL('O'), LYE_ABORT},
+ {CTL('P'), LYE_BACKW},
+ {CTL('R'), LYE_DELPW},
+ {CTL('T'), LYE_DELNW},
+ {CTL('U'), LYE_ERASE},
+ {CTL('V'), LYE_LKCMD},
+#ifdef CAN_CUT_AND_PASTE
+ {CTL('W'), LYE_PASTE},
+#endif
+ {CTL('X'), LYE_SETM1},
+ {CTL('^'), LYE_UPPER},
+ {CTL('_'), LYE_LOWER},
+ {' ', LYE_CHAR},
+ {'!', LYE_CHAR},
+ {'"', LYE_CHAR},
+ {'#', LYE_CHAR},
+ {'$', LYE_CHAR},
+ {'%', LYE_CHAR},
+ {'&', LYE_CHAR},
+ {'\'', LYE_CHAR},
+ {'(', LYE_CHAR},
+ {')', LYE_CHAR},
+ {'*', LYE_CHAR},
+ {'+', LYE_CHAR},
+ {',', LYE_CHAR},
+ {'-', LYE_CHAR},
+ {'.', LYE_CHAR},
+ {'/', LYE_CHAR},
+ {'0', LYE_CHAR},
+ {'1', LYE_CHAR},
+ {'2', LYE_CHAR},
+ {'3', LYE_CHAR},
+ {'4', LYE_CHAR},
+ {'5', LYE_CHAR},
+ {'6', LYE_CHAR},
+ {'7', LYE_CHAR},
+ {'8', LYE_CHAR},
+ {'9', LYE_CHAR},
+ {':', LYE_CHAR},
+ {';', LYE_CHAR},
+ {'<', LYE_CHAR},
+ {'=', LYE_CHAR},
+ {'>', LYE_CHAR},
+ {'?', LYE_CHAR},
+ {'@', LYE_CHAR},
+ {'A', LYE_CHAR},
+ {'B', LYE_CHAR},
+ {'C', LYE_CHAR},
+ {'D', LYE_CHAR},
+ {'E', LYE_CHAR},
+ {'F', LYE_CHAR},
+ {'G', LYE_CHAR},
+ {'H', LYE_CHAR},
+ {'I', LYE_CHAR},
+ {'J', LYE_CHAR},
+ {'K', LYE_CHAR},
+ {'L', LYE_CHAR},
+ {'M', LYE_CHAR},
+ {'N', LYE_CHAR},
+ {'O', LYE_CHAR},
+ {'P', LYE_CHAR},
+ {'Q', LYE_CHAR},
+ {'R', LYE_CHAR},
+ {'S', LYE_CHAR},
+ {'T', LYE_CHAR},
+ {'U', LYE_CHAR},
+ {'V', LYE_CHAR},
+ {'W', LYE_CHAR},
+ {'X', LYE_CHAR},
+ {'Y', LYE_CHAR},
+ {'Z', LYE_CHAR},
+ {'[', LYE_CHAR},
+ {'\\', LYE_CHAR},
+ {']', LYE_CHAR},
+ {'^', LYE_CHAR},
+ {'_', LYE_CHAR},
+ {'`', LYE_CHAR},
+ {'a', LYE_CHAR},
+ {'b', LYE_CHAR},
+ {'c', LYE_CHAR},
+ {'d', LYE_CHAR},
+ {'e', LYE_CHAR},
+ {'f', LYE_CHAR},
+ {'g', LYE_CHAR},
+ {'h', LYE_CHAR},
+ {'i', LYE_CHAR},
+ {'j', LYE_CHAR},
+ {'k', LYE_CHAR},
+ {'l', LYE_CHAR},
+ {'m', LYE_CHAR},
+ {'n', LYE_CHAR},
+ {'o', LYE_CHAR},
+ {'p', LYE_CHAR},
+ {'q', LYE_CHAR},
+ {'r', LYE_CHAR},
+ {'s', LYE_CHAR},
+ {'t', LYE_CHAR},
+ {'u', LYE_CHAR},
+ {'v', LYE_CHAR},
+ {'w', LYE_CHAR},
+ {'x', LYE_CHAR},
+ {'y', LYE_CHAR},
+ {'z', LYE_CHAR},
+ {'{', LYE_CHAR},
+ {'|', LYE_CHAR},
+ {'}', LYE_CHAR},
+ {'~', LYE_CHAR},
+ {DEL_KEY, LYE_DELP},
+ {128, LYE_CHAR},
+ {129, LYE_CHAR},
+ {130, LYE_CHAR},
+ {131, LYE_CHAR},
+ {132, LYE_CHAR},
+ {133, LYE_CHAR},
+ {134, LYE_CHAR},
+ {135, LYE_CHAR},
+ {136, LYE_CHAR},
+ {137, LYE_CHAR},
+ {138, LYE_CHAR},
+ {139, LYE_CHAR},
+ {140, LYE_CHAR},
+ {141, LYE_CHAR},
+#ifdef CJK_EX /* 1997/11/03 (Mon) 20:30:54 */
+ {142, LYE_CHAR},
+#else
+ {142, LYE_AIX},
+#endif
+ {143, LYE_CHAR},
+ {144, LYE_CHAR},
+ {145, LYE_CHAR},
+ {146, LYE_CHAR},
+ {147, LYE_CHAR},
+ {148, LYE_CHAR},
+ {149, LYE_CHAR},
+ {150, LYE_CHAR},
+ {151, LYE_CHAR},
+ {152, LYE_CHAR},
+ {153, LYE_CHAR},
+ {154, LYE_CHAR},
+ {155, LYE_CHAR},
+ {156, LYE_CHAR},
+ {157, LYE_CHAR},
+ {158, LYE_CHAR},
+ {159, LYE_CHAR},
+ {160, LYE_CHAR},
+ {161, LYE_CHAR},
+ {162, LYE_CHAR},
+ {163, LYE_CHAR},
+ {164, LYE_CHAR},
+ {165, LYE_CHAR},
+ {166, LYE_CHAR},
+ {167, LYE_CHAR},
+ {168, LYE_CHAR},
+ {169, LYE_CHAR},
+ {170, LYE_CHAR},
+ {171, LYE_CHAR},
+ {172, LYE_CHAR},
+ {173, LYE_CHAR},
+ {174, LYE_CHAR},
+ {175, LYE_CHAR},
+ {176, LYE_CHAR},
+ {177, LYE_CHAR},
+ {178, LYE_CHAR},
+ {179, LYE_CHAR},
+ {180, LYE_CHAR},
+ {181, LYE_CHAR},
+ {182, LYE_CHAR},
+ {183, LYE_CHAR},
+ {184, LYE_CHAR},
+ {185, LYE_CHAR},
+ {186, LYE_CHAR},
+ {187, LYE_CHAR},
+ {188, LYE_CHAR},
+ {189, LYE_CHAR},
+ {190, LYE_CHAR},
+ {191, LYE_CHAR},
+ {192, LYE_CHAR},
+ {193, LYE_CHAR},
+ {194, LYE_CHAR},
+ {195, LYE_CHAR},
+ {196, LYE_CHAR},
+ {197, LYE_CHAR},
+ {198, LYE_CHAR},
+ {199, LYE_CHAR},
+ {200, LYE_CHAR},
+ {201, LYE_CHAR},
+ {202, LYE_CHAR},
+ {203, LYE_CHAR},
+ {204, LYE_CHAR},
+ {205, LYE_CHAR},
+ {206, LYE_CHAR},
+ {207, LYE_CHAR},
+ {208, LYE_CHAR},
+ {209, LYE_CHAR},
+ {210, LYE_CHAR},
+ {211, LYE_CHAR},
+ {212, LYE_CHAR},
+ {213, LYE_CHAR},
+ {214, LYE_CHAR},
+ {215, LYE_CHAR},
+ {216, LYE_CHAR},
+ {217, LYE_CHAR},
+ {218, LYE_CHAR},
+ {219, LYE_CHAR},
+ {220, LYE_CHAR},
+ {221, LYE_CHAR},
+ {222, LYE_CHAR},
+ {223, LYE_CHAR},
+ {224, LYE_CHAR},
+ {225, LYE_CHAR},
+ {226, LYE_CHAR},
+ {227, LYE_CHAR},
+ {228, LYE_CHAR},
+ {229, LYE_CHAR},
+ {230, LYE_CHAR},
+ {231, LYE_CHAR},
+ {232, LYE_CHAR},
+ {233, LYE_CHAR},
+ {234, LYE_CHAR},
+ {235, LYE_CHAR},
+ {236, LYE_CHAR},
+ {237, LYE_CHAR},
+ {238, LYE_CHAR},
+ {239, LYE_CHAR},
+ {240, LYE_CHAR},
+ {241, LYE_CHAR},
+ {242, LYE_CHAR},
+ {243, LYE_CHAR},
+ {244, LYE_CHAR},
+ {245, LYE_CHAR},
+ {246, LYE_CHAR},
+ {247, LYE_CHAR},
+ {248, LYE_CHAR},
+ {249, LYE_CHAR},
+ {250, LYE_CHAR},
+ {251, LYE_CHAR},
+ {252, LYE_CHAR},
+ {253, LYE_CHAR},
+ {254, LYE_CHAR},
+ {255, LYE_CHAR},
+ {UPARROW_KEY, LYE_FORM_PASS},
+ {DNARROW_KEY, LYE_FORM_PASS},
+ {RTARROW_KEY, LYE_FORW},
+ {LTARROW_KEY, LYE_BACK},
+ {PGDOWN_KEY, LYE_FORM_PASS},
+ {PGUP_KEY, LYE_FORM_PASS},
+ {HOME_KEY, LYE_BOL},
+ {END_KEY, LYE_EOL},
+ {F1_KEY, LYE_FORM_PASS},
+#if !(defined(_WINDOWS) || defined(__DJGPP__))
+ {DO_KEY, LYE_TAB},
+ {FIND_KEY, LYE_BOL},
+ {SELECT_KEY, LYE_EOL},
+#endif
+ {REMOVE_KEY, LYE_DELP},
+ {BACKTAB_KEY, LYE_FORM_PASS},
+#if (defined(_WINDOWS) || defined(__DJGPP__)) && defined(USE_SLANG) && !defined(DJGPP_KEYHANDLER)
+ {272, LYE_DELP},
+ {273, LYE_ENTER},
+#endif
+ {-1, LYE_UNKNOWN}
+};
+
+static const LYEditInit initBashlikeEditor[] =
+{
+ {CTL('@'), LYE_SETMARK},
+ {CTL('A'), LYE_BOL},
+ {CTL('B'), LYE_BACK},
+ {CTL('C'), LYE_ABORT},
+ {CTL('D'), LYE_DELN},
+ {CTL('E'), LYE_EOL | LYE_DF},
+ {CTL('F'), LYE_FORW},
+ {CTL('G'), LYE_ABORT},
+ {CTL('H'), LYE_DELP},
+ {CTL('I'), LYE_TAB},
+ {CTL('J'), LYE_ENTER},
+ {CTL('K'), LYE_DELEL | LYE_DF},
+ {CTL('L'), LYE_FORM_PASS},
+ {CTL('M'), LYE_ENTER},
+ {CTL('N'), LYE_FORM_PASS},
+ {CTL('O'), LYE_FORM_PASS},
+ {CTL('P'), LYE_FORM_PASS},
+ {CTL('R'), LYE_BACKW},
+ {CTL('S'), LYE_FORWW},
+ {CTL('T'), LYE_TPOS},
+ {CTL('U'), LYE_DELBL},
+ {CTL('V'), LYE_LKCMD},
+ {CTL('W'), LYE_DELPW},
+ {CTL('X'), LYE_SETM1},
+ {CTL('Y'), LYE_YANK},
+ {CTL('Z'), LYE_FORM_PASS},
+ {CTL('['), LYE_SETM2},
+ {CTL('\\'), LYE_FORM_PASS},
+ {CTL(']'), LYE_FORM_PASS},
+ {CTL('^'), LYE_SWMAP},
+ {CTL('_'), LYE_ABORT},
+ {' ', LYE_CHAR},
+ {'!', LYE_CHAR},
+ {'"', LYE_CHAR},
+ {'#', LYE_CHAR},
+ {'$', LYE_CHAR},
+ {'%', LYE_CHAR},
+ {'&', LYE_CHAR},
+ {'\'', LYE_CHAR},
+ {'(', LYE_CHAR},
+ {')', LYE_CHAR},
+ {'*', LYE_CHAR},
+ {'+', LYE_CHAR},
+ {',', LYE_CHAR},
+ {'-', LYE_CHAR},
+ {'.', LYE_CHAR},
+ {'/', LYE_CHAR},
+ {'0', LYE_CHAR},
+ {'1', LYE_CHAR},
+ {'2', LYE_CHAR},
+ {'3', LYE_CHAR},
+ {'4', LYE_CHAR},
+ {'5', LYE_CHAR},
+ {'6', LYE_CHAR},
+ {'7', LYE_CHAR},
+ {'8', LYE_CHAR},
+ {'9', LYE_CHAR},
+ {':', LYE_CHAR},
+ {';', LYE_CHAR},
+ {'<', LYE_CHAR},
+ {'=', LYE_CHAR},
+ {'>', LYE_CHAR},
+ {'?', LYE_CHAR},
+ {'@', LYE_CHAR},
+ {'A', LYE_CHAR},
+ {'B', LYE_CHAR},
+ {'C', LYE_CHAR},
+ {'D', LYE_CHAR},
+ {'E', LYE_CHAR},
+ {'F', LYE_CHAR},
+ {'G', LYE_CHAR},
+ {'H', LYE_CHAR},
+ {'I', LYE_CHAR},
+ {'J', LYE_CHAR},
+ {'K', LYE_CHAR},
+ {'L', LYE_CHAR},
+ {'M', LYE_CHAR},
+ {'N', LYE_CHAR},
+ {'O', LYE_CHAR},
+ {'P', LYE_CHAR},
+ {'Q', LYE_CHAR},
+ {'R', LYE_CHAR},
+ {'S', LYE_CHAR},
+ {'T', LYE_CHAR},
+ {'U', LYE_CHAR},
+ {'V', LYE_CHAR},
+ {'W', LYE_CHAR},
+ {'X', LYE_CHAR},
+ {'Y', LYE_CHAR},
+ {'Z', LYE_CHAR},
+ {'[', LYE_CHAR},
+ {'\\', LYE_CHAR},
+ {']', LYE_CHAR},
+ {'^', LYE_CHAR},
+ {'_', LYE_CHAR},
+ {'`', LYE_CHAR},
+ {'a', LYE_CHAR},
+ {'b', LYE_CHAR},
+ {'c', LYE_CHAR},
+ {'d', LYE_CHAR},
+ {'e', LYE_CHAR},
+ {'f', LYE_CHAR},
+ {'g', LYE_CHAR},
+ {'h', LYE_CHAR},
+ {'i', LYE_CHAR},
+ {'j', LYE_CHAR},
+ {'k', LYE_CHAR},
+ {'l', LYE_CHAR},
+ {'m', LYE_CHAR},
+ {'n', LYE_CHAR},
+ {'o', LYE_CHAR},
+ {'p', LYE_CHAR},
+ {'q', LYE_CHAR},
+ {'r', LYE_CHAR},
+ {'s', LYE_CHAR},
+ {'t', LYE_CHAR},
+ {'u', LYE_CHAR},
+ {'v', LYE_CHAR},
+ {'w', LYE_CHAR},
+ {'x', LYE_CHAR},
+ {'y', LYE_CHAR},
+ {'z', LYE_CHAR},
+ {'{', LYE_CHAR},
+ {'|', LYE_CHAR},
+ {'}', LYE_CHAR},
+ {'~', LYE_CHAR},
+ {DEL_KEY, LYE_DELP},
+ {128, LYE_CHAR},
+ {129, LYE_CHAR},
+ {130, LYE_CHAR},
+ {131, LYE_CHAR},
+ {132, LYE_CHAR},
+ {133, LYE_CHAR},
+ {134, LYE_CHAR},
+ {135, LYE_CHAR},
+ {136, LYE_CHAR},
+ {137, LYE_CHAR},
+ {138, LYE_CHAR},
+ {139, LYE_CHAR},
+ {140, LYE_CHAR},
+ {141, LYE_CHAR},
+ {142, LYE_CHAR},
+ {143, LYE_CHAR},
+ {144, LYE_CHAR},
+ {145, LYE_CHAR},
+ {146, LYE_CHAR},
+ {147, LYE_CHAR},
+ {148, LYE_CHAR},
+ {149, LYE_CHAR},
+ {150, LYE_CHAR},
+ {151, LYE_AIX},
+ {152, LYE_CHAR},
+ {153, LYE_CHAR},
+ {154, LYE_CHAR},
+ {155, LYE_CHAR},
+ {156, LYE_CHAR},
+ {157, LYE_CHAR},
+ {158, LYE_CHAR},
+ {159, LYE_CHAR},
+ {160, LYE_CHAR},
+ {161, LYE_CHAR},
+ {162, LYE_CHAR},
+ {163, LYE_CHAR},
+ {164, LYE_CHAR},
+ {165, LYE_CHAR},
+ {166, LYE_CHAR},
+ {167, LYE_CHAR},
+ {168, LYE_CHAR},
+ {169, LYE_CHAR},
+ {170, LYE_CHAR},
+ {171, LYE_CHAR},
+ {172, LYE_CHAR},
+ {173, LYE_CHAR},
+ {174, LYE_CHAR},
+ {175, LYE_CHAR},
+ {176, LYE_CHAR},
+ {177, LYE_CHAR},
+ {178, LYE_CHAR},
+ {179, LYE_CHAR},
+ {180, LYE_CHAR},
+ {181, LYE_CHAR},
+ {182, LYE_CHAR},
+ {183, LYE_CHAR},
+ {184, LYE_CHAR},
+ {185, LYE_CHAR},
+ {186, LYE_CHAR},
+ {187, LYE_CHAR},
+ {188, LYE_CHAR},
+ {189, LYE_CHAR},
+ {190, LYE_CHAR},
+ {191, LYE_CHAR},
+ {192, LYE_CHAR},
+ {193, LYE_CHAR},
+ {194, LYE_CHAR},
+ {195, LYE_CHAR},
+ {196, LYE_CHAR},
+ {197, LYE_CHAR},
+ {198, LYE_CHAR},
+ {199, LYE_CHAR},
+ {200, LYE_CHAR},
+ {201, LYE_CHAR},
+ {202, LYE_CHAR},
+ {203, LYE_CHAR},
+ {204, LYE_CHAR},
+ {205, LYE_CHAR},
+ {206, LYE_CHAR},
+ {207, LYE_CHAR},
+ {208, LYE_CHAR},
+ {209, LYE_CHAR},
+ {210, LYE_CHAR},
+ {211, LYE_CHAR},
+ {212, LYE_CHAR},
+ {213, LYE_CHAR},
+ {214, LYE_CHAR},
+ {215, LYE_CHAR},
+ {216, LYE_CHAR},
+ {217, LYE_CHAR},
+ {218, LYE_CHAR},
+ {219, LYE_CHAR},
+ {220, LYE_CHAR},
+ {221, LYE_CHAR},
+ {222, LYE_CHAR},
+ {223, LYE_CHAR},
+ {224, LYE_CHAR},
+ {225, LYE_CHAR},
+ {226, LYE_CHAR},
+ {227, LYE_CHAR},
+ {228, LYE_CHAR},
+ {229, LYE_CHAR},
+ {230, LYE_CHAR},
+ {231, LYE_CHAR},
+ {232, LYE_CHAR},
+ {233, LYE_CHAR},
+ {234, LYE_CHAR},
+ {235, LYE_CHAR},
+ {236, LYE_CHAR},
+ {237, LYE_CHAR},
+ {238, LYE_CHAR},
+ {239, LYE_CHAR},
+ {240, LYE_CHAR},
+ {241, LYE_CHAR},
+ {242, LYE_CHAR},
+ {243, LYE_CHAR},
+ {244, LYE_CHAR},
+ {245, LYE_CHAR},
+ {246, LYE_CHAR},
+ {247, LYE_CHAR},
+ {248, LYE_CHAR},
+ {249, LYE_CHAR},
+ {250, LYE_CHAR},
+ {251, LYE_CHAR},
+ {252, LYE_CHAR},
+ {253, LYE_CHAR},
+ {254, LYE_CHAR},
+ {255, LYE_CHAR},
+ {UPARROW_KEY, LYE_FORM_PASS},
+ {DNARROW_KEY, LYE_FORM_PASS},
+ {RTARROW_KEY, LYE_FORW},
+ {LTARROW_KEY, LYE_BACK},
+ {PGDOWN_KEY, LYE_FORM_PASS},
+ {PGUP_KEY, LYE_FORM_PASS},
+ {HOME_KEY, LYE_BOL},
+ {END_KEY, LYE_EOL},
+ {F1_KEY, LYE_FORM_PASS},
+#if !(defined(_WINDOWS) || defined(__DJGPP__))
+ {DO_KEY, LYE_TAB},
+ {FIND_KEY, LYE_BOL},
+ {SELECT_KEY, LYE_EOL},
+#endif
+ {REMOVE_KEY, LYE_DELN},
+ {BACKTAB_KEY, LYE_FORM_PASS},
+#if (defined(_WINDOWS) || defined(__DJGPP__)) && defined(USE_SLANG) && !defined(DJGPP_KEYHANDLER)
+ {272, LYE_DELP},
+ {273, LYE_ENTER},
+#endif
+ {-1, LYE_UNKNOWN}
+};
+#endif /* USE_ALT_BINDINGS */
+
+LYEditConfig LYLineEditors[] =
+{
+ {"Default Binding", initDefaultEditor, DefaultEditBinding},
+#ifdef USE_ALT_BINDINGS
+ {"Alternate Bindings", initBetterEditor, BetterEditBinding},
+ {"Bash-like Bindings", initBashlikeEditor, BashlikeEditBinding},
+#endif
+};
+
+const char *LYEditorNames[TABLESIZE(LYLineEditors) + 1];
+
+/*
+ * Add the URL (relative to helpfilepath) used for context-dependent
+ * help on form field editing.
+ *
+ * The order must correspond to that of LYLineditNames.
+ */
+const char *LYLineeditHelpURLs[] =
+{
+ EDIT_HELP,
+#ifdef USE_ALT_BINDINGS
+ ALT_EDIT_HELP,
+ BASHLIKE_EDIT_HELP,
+#endif
+ (char *) 0
+};
+
+static struct emap *name2emap(const char *name)
+{
+ struct emap *mp;
+ struct emap *result = 0;
+
+ if (non_empty(name)) {
+ for (mp = ekmap; mp->name != NULL; mp++) {
+ if (strcasecomp(mp->name, name) == 0) {
+ result = mp;
+ break;
+ }
+ }
+ }
+ return result;
+}
+
+static struct emap *code2emap(int code)
+{
+ struct emap *mp;
+ struct emap *result = 0;
+
+ for (mp = ekmap; mp->name != NULL; mp++) {
+ if (mp->code == code) {
+ result = mp;
+ break;
+ }
+ }
+ return result;
+}
+
+/*
+ * Return editactioncode whose name is the string func. func must be present
+ * in the ekmap table. returns -1 if not found. - kw
+ */
+int lecname_to_lec(const char *func)
+{
+ struct emap *mp;
+ int result = -1;
+
+ if ((mp = name2emap(func)) != 0) {
+ result = mp->code;
+ }
+ return result;
+}
+
+const char *lec_to_lecname(int code)
+{
+ struct emap *mp;
+ const char *result = 0;
+
+ if ((mp = code2emap(code)) != 0) {
+ result = mp->name;
+ }
+ return result;
+}
+
+int EditBinding(int xlkc)
+{
+ int editaction, xleac = LYE_UNMOD;
+ int c = xlkc & LKC_MASK;
+
+ if (xlkc == -1)
+ return LYE_NOP; /* maybe LYE_ABORT? or LYE_FORM_LAC|LYK_UNKNOWN? */
+#ifdef NOT_ASCII
+ if (c < 256) {
+ c = TOASCII(c);
+ }
+#endif
+#ifdef USE_ALT_BINDINGS
+ /*
+ * Get intermediate code from one of the lynxkeycode+modifier tables if
+ * applicable, otherwise get the lynxeditactioncode directly. If we have
+ * more than one modifier bits, the first currently wins. - kw
+ */
+ if (xlkc & LKC_ISLECLAC) {
+ return LKC2_TO_LEC(xlkc);
+ } else if (xlkc & LKC_MOD1) {
+ xleac = LKC_TO_LEC_M1(c);
+ } else if (xlkc & LKC_MOD2) {
+ xleac = LKC_TO_LEC_M2(c);
+ } else if (xlkc & LKC_MOD3) {
+ xleac = LKC_TO_LEC_M3(c);
+ } else {
+ xleac = UCH(CurrentLineEditor()[c]);
+ }
+#endif
+ /*
+ * If we have an intermediate code that says "same as without modifier",
+ * look that up now; otherwise we are already done. - kw
+ */
+ if (xleac == LYE_UNMOD) {
+ editaction = CurrentLineEditor()[c];
+ } else {
+ editaction = xleac;
+ }
+ return editaction;
+}
+
+/*
+ * Install lec as the lynxeditaction for lynxkeycode xlkc. func must be
+ * present in the revmap table. For normal (non-modifier) lynxkeycodes,
+ * select_edi selects which of the alternative line-editor binding tables is
+ * modified. If select_edi is positive, only the table given by it is modified
+ * (the DefaultEditBinding table is numbered 1). If select_edi is 0, all
+ * tables are modified. If select_edi is negative, all tables except the one
+ * given by abs(select_edi) are modified. returns TRUE if the mapping was
+ * made, FALSE if not. Note that this remapping cannot be undone (as might be
+ * desirable as a result of re-parsing lynx.cfg), we don't remember the
+ * original editaction from the Bindings tables anywhere. - kw
+ */
+BOOL LYRemapEditBinding(int xlkc,
+ int lec,
+ int select_edi)
+{
+ int j;
+ int c = xlkc & LKC_MASK;
+ BOOLEAN success = FALSE;
+
+ if (xlkc >= 0 && !(xlkc & LKC_ISLAC) && (c < KEYMAP_SIZE)) {
+ LYEditCode code = (LYEditCode) lec;
+
+#ifdef USE_ALT_BINDINGS
+ if (xlkc & LKC_MOD1) {
+ if (c <= LAST_MOD1_LKC) {
+ Mod1Binding[c] = code;
+ success = TRUE;
+ }
+ } else if (xlkc & LKC_MOD2) {
+ if (c <= LAST_MOD2_LKC) {
+ Mod2Binding[c] = code;
+ success = TRUE;
+ }
+ } else if (xlkc & LKC_MOD3) {
+ if (c <= LAST_MOD3_LKC) {
+ Mod3Binding[c] = code;
+ success = TRUE;
+ }
+ } else
+#endif /* USE_ALT_BINDINGS */
+ {
+#ifndef UCHAR_MAX
+#define UCHAR_MAX 255
+#endif
+ if ((unsigned int) lec <= UCHAR_MAX) {
+ if (select_edi > 0) {
+ if ((unsigned int) select_edi < TABLESIZE(LYLineEditors)) {
+ LYLineEditors[select_edi - 1].used[c] = code;
+ success = TRUE;
+ }
+ } else {
+ for (j = 0; j < (int) TABLESIZE(LYLineEditors); j++) {
+ success = TRUE;
+ if ((select_edi < 0) && ((j + 1 + select_edi) == 0))
+ continue;
+ LYLineEditors[j].used[c] = code;
+ }
+ }
+ }
+ }
+ }
+ return success;
+}
+
+/*
+ * Macro to walk through lkc-indexed tables up to imax, in the (ASCII) order
+ * 97 - 122 ('a' - 'z'),
+ * 32 - 96 (' ' - '`', includes 'A' - 'Z'),
+ * 123 - 126 ('{' - '~'),
+ * 0 - 31 (^@ - ^_),
+ * 256 - imax,
+ * 127 - 255
+ */
+#define NEXT_I(i,imax) ((i==122) ? 32 : (i==96) ? 123 : (i==126) ? 0 :\
+ (i==31) ? 256 : (i==imax) ? 127 :\
+ (i==255) ? (-1) :i+1)
+#define FIRST_I 97
+
+int LYKeyForEditAction(int lec)
+{
+ int editaction, i;
+
+ for (i = FIRST_I; i >= 0; i = NEXT_I(i, KEYMAP_SIZE - 1)) {
+ editaction = CurrentLineEditor()[i];
+ if (editaction == lec) {
+#ifdef NOT_ASCII
+ if (i < 256) {
+ return FROMASCII(i);
+ } else
+#endif
+ return i;
+ }
+ }
+ return (-1);
+}
+
+/*
+ * Given a lynxactioncode, return a key (lynxkeycode) or sequence of two keys
+ * that results in the given action while forms-editing. The main keycode is
+ * returned as function value, possibly with modifier bits set; in addition, if
+ * applicable, a key that sets the required modifier flag is returned in
+ * *pmodkey if (pmodkey!=NULL). Non-lineediting bindings that would require
+ * typing LYE_LKCMD (default ^V) to activate are not checked here, the caller
+ * should do that separately if required. If no key is bound by current
+ * line-editor bindings to the action, -1 is returned.
+ *
+ * This is all a bit long - it is general enough to continue to work should the
+ * three Mod<N>Binding[] become different tables. - kw
+ */
+int LYEditKeyForAction(int lac,
+ int *pmodkey)
+{
+ int editaction, i, c;
+ int mod1found = -1, mod2found = -1, mod3found = -1;
+
+ if (pmodkey)
+ *pmodkey = -1;
+ for (i = FIRST_I; i >= 0; i = NEXT_I(i, KEYMAP_SIZE - 1)) {
+ editaction = CurrentLineEditor()[i];
+#ifdef NOT_ASCII
+ if (i < 256) {
+ c = FROMASCII(i);
+ } else
+#endif
+ c = i;
+ if (editaction == (lac | LYE_FORM_LAC))
+ return c;
+ if (editaction == LYE_FORM_PASS) {
+#if defined(DIRED_SUPPORT) && defined(OK_OVERRIDE)
+ if (lynx_edit_mode && !no_dired_support && lac &&
+ LKC_TO_LAC(key_override, c) == lac)
+ return c;
+#endif /* DIRED_SUPPORT && OK_OVERRIDE */
+ if (LKC_TO_LAC(keymap, c) == lac)
+ return c;
+ }
+ if (editaction == LYE_TAB) {
+#if defined(DIRED_SUPPORT) && defined(OK_OVERRIDE)
+ if (lynx_edit_mode && !no_dired_support && lac &&
+ LKC_TO_LAC(key_override, '\t') == lac)
+ return c;
+#endif /* DIRED_SUPPORT && OK_OVERRIDE */
+ if (LKC_TO_LAC(keymap, '\t') == lac)
+ return c;
+ }
+ if (editaction == LYE_SETM1 && mod1found < 0)
+ mod1found = i;
+ if (editaction == LYE_SETM2 && mod2found < 0)
+ mod2found = i;
+ if ((editaction & LYE_DF) && mod3found < 0)
+ mod3found = i;
+ }
+#ifdef USE_ALT_BINDINGS
+ if (mod3found >= 0) {
+ for (i = mod3found; i >= 0; i = NEXT_I(i, LAST_MOD3_LKC)) {
+ editaction = CurrentLineEditor()[i];
+ if (!(editaction & LYE_DF))
+ continue;
+ editaction = Mod3Binding[i];
+#ifdef NOT_ASCII
+ if (i < 256) {
+ c = FROMASCII(i);
+ } else
+#endif
+ c = i;
+ if (pmodkey)
+ *pmodkey = c;
+ if (editaction == (lac | LYE_FORM_LAC))
+ return (c | LKC_MOD3);
+ if (editaction == LYE_FORM_PASS) {
+#if defined(DIRED_SUPPORT) && defined(OK_OVERRIDE)
+ if (lynx_edit_mode && !no_dired_support && lac &&
+ LKC_TO_LAC(key_override, c) == lac)
+ return (c | LKC_MOD3);
+#endif /* DIRED_SUPPORT && OK_OVERRIDE */
+ if (LKC_TO_LAC(keymap, c) == lac)
+ return (c | LKC_MOD3);
+ }
+ if (editaction == LYE_TAB) {
+#if defined(DIRED_SUPPORT) && defined(OK_OVERRIDE)
+ if (lynx_edit_mode && !no_dired_support && lac &&
+ LKC_TO_LAC(key_override, '\t') == lac)
+ return (c | LKC_MOD3);
+#endif /* DIRED_SUPPORT && OK_OVERRIDE */
+ if (LKC_TO_LAC(keymap, '\t') == lac)
+ return (c | LKC_MOD3);
+ }
+ }
+ }
+ if (mod1found >= 0) {
+ if (pmodkey) {
+#ifdef NOT_ASCII
+ if (mod1found < 256) {
+ *pmodkey = FROMASCII(mod1found);
+ } else
+#endif
+ *pmodkey = mod1found;
+ }
+ for (i = FIRST_I; i >= 0; i = NEXT_I(i, LAST_MOD1_LKC)) {
+ editaction = Mod1Binding[i];
+#ifdef NOT_ASCII
+ if (i < 256) {
+ c = FROMASCII(i);
+ } else
+#endif
+ c = i;
+ if (editaction == (lac | LYE_FORM_LAC))
+ return (c | LKC_MOD1);
+ if (editaction == LYE_FORM_PASS) {
+#if defined(DIRED_SUPPORT) && defined(OK_OVERRIDE)
+ if (lynx_edit_mode && !no_dired_support && lac &&
+ LKC_TO_LAC(key_override, c) == lac)
+ return (c | LKC_MOD1);
+#endif /* DIRED_SUPPORT && OK_OVERRIDE */
+ if (LKC_TO_LAC(keymap, c) == lac)
+ return (c | LKC_MOD1);
+ }
+ if (editaction == LYE_TAB) {
+#if defined(DIRED_SUPPORT) && defined(OK_OVERRIDE)
+ if (lynx_edit_mode && !no_dired_support && lac &&
+ LKC_TO_LAC(key_override, '\t') == lac)
+ return (c | LKC_MOD1);
+#endif /* DIRED_SUPPORT && OK_OVERRIDE */
+ if (LKC_TO_LAC(keymap, '\t') == lac)
+ return (c | LKC_MOD1);
+ }
+ }
+ }
+ if (mod2found >= 0) {
+ if (pmodkey) {
+#ifdef NOT_ASCII
+ if (mod1found < 256) {
+ *pmodkey = FROMASCII(mod1found);
+ } else
+#endif
+ *pmodkey = mod1found;
+ }
+ for (i = FIRST_I; i >= 0; i = NEXT_I(i, LAST_MOD2_LKC)) {
+ editaction = Mod2Binding[i];
+#ifdef NOT_ASCII
+ if (i < 256) {
+ c = FROMASCII(i);
+ } else
+#endif
+ c = i;
+ if (editaction == (lac | LYE_FORM_LAC))
+ return (c | LKC_MOD2);
+ if (editaction == LYE_FORM_PASS) {
+#if defined(DIRED_SUPPORT) && defined(OK_OVERRIDE)
+ if (lynx_edit_mode && !no_dired_support && lac &&
+ LKC_TO_LAC(key_override, c) == lac)
+ return (c | LKC_MOD2);
+#endif /* DIRED_SUPPORT && OK_OVERRIDE */
+ if (LKC_TO_LAC(keymap, c) == lac)
+ return (c | LKC_MOD2);
+ }
+ if (editaction == LYE_TAB) {
+#if defined(DIRED_SUPPORT) && defined(OK_OVERRIDE)
+ if (lynx_edit_mode && !no_dired_support && lac &&
+ LKC_TO_LAC(key_override, '\t') == lac)
+ return (c | LKC_MOD2);
+#endif /* DIRED_SUPPORT && OK_OVERRIDE */
+ if (LKC_TO_LAC(keymap, '\t') == lac)
+ return (c | LKC_MOD2);
+ }
+ }
+ }
+#endif /* USE_ALT_BINDINGS */
+ if (pmodkey)
+ *pmodkey = -1;
+ return (-1);
+}
+
+#if 0
+/*
+ * This function was useful in converting the hand-crafted key-bindings to
+ * their reusable form in 2.8.8 -TD
+ */
+static void checkEditMap(LYEditConfig * table)
+{
+ unsigned j, k;
+ char comment[80];
+ int first = TRUE;
+
+ for (j = 0; table->init[j].code >= 0; ++j) {
+ int code = table->init[j].code;
+
+ if (table->init[j].edit != table->used[code]) {
+ if (first) {
+ printf("TABLE %s\n", table->name);
+ first = FALSE;
+ }
+ printf("%u: init %d vs used %d\n",
+ j,
+ table->init[j].edit,
+ table->used[code]);
+ }
+ }
+ for (j = 0; j < KEYMAP_SIZE; ++j) {
+ int code = (int) j;
+ BOOL found = FALSE;
+
+ for (k = 0; table->init[k].code >= 0; ++k) {
+ if (code == table->init[k].code) {
+ found = TRUE;
+ break;
+ }
+ }
+ if (!found) {
+ if (table->used[j] != 0) {
+ int edit = table->used[j];
+ int has_DF = (edit & LYE_DF);
+ int has_LAC = (edit & LYE_FORM_LAC);
+ const char *prefix = "LYE_";
+ const char *name = 0;
+
+ edit &= 0x7f;
+ if (has_LAC) {
+ Kcmd *cmd = LYKeycodeToKcmd(edit);
+
+ if (cmd != 0) {
+ prefix = "LYK_";
+ name = cmd->name;
+ }
+ } else {
+ name = lec_to_lecname(edit);
+ }
+
+ if (j < 32) {
+ char temp[80];
+ const char *what = 0;
+
+ switch (j) {
+ case 0:
+ what = "nul";
+ break;
+ case 17:
+ what = "XON";
+ break;
+ case 19:
+ what = "XOFF";
+ break;
+ default:
+ sprintf(temp, "^%c", j + 'A');
+ what = temp;
+ break;
+ }
+ sprintf(comment, "\t/* %s */", what);
+ } else if (j < 127) {
+ sprintf(comment, "\t/* %c */", j);
+ } else {
+ const char *what = LYextraKeysToName(j);
+
+ if (Non_Empty(what)) {
+ sprintf(comment, "\t/* %s%s */", what,
+ ((StrChr(what, '_') != 0)
+ ? ""
+ : "_KEY"));
+ } else {
+ strcpy(comment, "");
+ }
+ }
+ if (name == 0) {
+ name = "XXX";
+ } else if (!strcasecomp(name, "PASS")) {
+ name = "FORM_PASS";
+ }
+ if (first) {
+ printf("TABLE %s\n", table->name);
+ first = FALSE;
+ }
+ printf("\t{ %d, %s%s%s%s },%s\n", code, prefix, name,
+ has_DF ? "|LYE_DF" : "",
+ has_LAC ? "|LYE_FORM_LAC" : "",
+ comment);
+ }
+ }
+ }
+}
+
+#else
+#define checkEditMap(table) /* nothing */
+#endif
+
+static void initLineEditor(LYEditConfig * table)
+{
+ unsigned k;
+ LYEditCode *used = table->used;
+ const LYEditInit *init = table->init;
+
+ memset(used, 0, sizeof(LYEditCode) * KEYMAP_SIZE);
+
+ for (k = 0; init[k].code >= 0; ++k) {
+ int code = init[k].code;
+
+ used[code] = init[k].edit;
+ }
+ checkEditMap(table);
+}
+
+/*
+ * Reset the editor bindings to their default values.
+ */
+void LYinitEditmap(void)
+{
+ unsigned j;
+
+ for (j = 0; j < TABLESIZE(LYLineEditors); ++j) {
+ LYEditorNames[j] = LYLineEditors[j].name;
+ initLineEditor(&LYLineEditors[j]);
+ }
+#ifdef USE_ALT_BINDINGS
+ for (j = 0; j < TABLESIZE(LYModifierBindings); ++j) {
+ initLineEditor(&LYModifierBindings[j]);
+ }
+#endif
+}
+
+static char *showRanges(int *state)
+{
+ char *result = 0;
+ int range[2];
+ int i;
+
+ range[0] = range[1] = -1;
+ for (i = 0; i < KEYMAP_SIZE; ++i) {
+ if (!state[i]) {
+ int code = CurrentLineEditor()[i];
+
+ if (code == LYE_CHAR) {
+ if (range[0] < 0)
+ range[0] = i;
+ range[1] = i;
+ state[i] = 3;
+ } else if (range[0] >= 0) {
+ if (non_empty(result))
+ StrAllocCat(result, ", ");
+ HTSprintf(&result, "%d-%d", range[0], range[1]);
+ range[0] = range[1] = -1;
+ }
+ }
+ }
+ return result;
+}
+
+static int LYLoadEditmap(const char *arg GCC_UNUSED,
+ HTParentAnchor *anAnchor,
+ HTFormat format_out,
+ HTStream *sink)
+{
+#define FORMAT " %-*s %-*s - %s\n"
+ HTFormat format_in = WWW_HTML;
+ HTStream *target;
+ int state[KEYMAP_SIZE];
+ int width[2];
+ char *buf = 0;
+ char *ranges = 0;
+ struct emap *mp;
+ int i;
+ int hanging;
+ int wrapped;
+ int had_output = FALSE;
+ int result;
+
+ if ((target = HTStreamStack(format_in, format_out, sink, anAnchor)) != 0) {
+ anAnchor->no_cache = TRUE;
+
+ HTSprintf0(&buf,
+ "<html>\n<head>\n<title>%s</title>\n</head>\n<body>\n",
+ CURRENT_EDITMAP_TITLE);
+ PUTS(buf);
+ HTSprintf0(&buf, "<pre>\n");
+ PUTS(buf);
+
+ /* determine the column-widths we will use for showing bindings */
+ width[0] = 0;
+ width[1] = 0;
+ for (i = 0; i < KEYMAP_SIZE; ++i) {
+ int code = CurrentLineEditor()[i];
+
+ if (code == LYE_NOP) {
+ state[i] = 1;
+ } else {
+ int need;
+
+ if ((mp = code2emap(code)) != 0) {
+ state[i] = 0;
+ if ((need = (int) strlen(mp->name)) > width[0])
+ width[0] = need;
+ if ((need = (int) strlen(mp->descr)) > width[1])
+ width[1] = need;
+ } else {
+ state[i] = 2;
+ }
+ }
+ }
+ hanging = 2 + width[0] + 2 + width[1] + 5;
+ wrapped = hanging;
+
+ /*
+ * Tell which set of bindings we are showing, and link to the
+ * handcrafted page, which adds explanations.
+ */
+ PUTS(gettext("These are the current edit-bindings:"));
+ HTSprintf0(&buf,
+ " <a href=\"%s\">%s</a>\n\n",
+ LYLineeditHelpURL(),
+ LYEditorNames[current_lineedit]);
+ PUTS(buf);
+
+ /* Show by groups to match the arrangement in the handmade files. */
+ for (mp = ekmap; mp->name != 0; ++mp) {
+ if (isEmpty(mp->name)) {
+ if (had_output) {
+ PUTS("\n");
+ had_output = FALSE;
+ }
+ } else if (mp->code == LYE_CHAR) {
+ ranges = showRanges(state);
+ HTSprintf0(&buf, FORMAT,
+ width[0], mp->name,
+ width[1], mp->descr,
+ ranges);
+ FREE(ranges);
+ PUTS(buf);
+ had_output = TRUE;
+ } else {
+ for (i = 0; i < KEYMAP_SIZE; ++i) {
+ int code = CurrentLineEditor()[i];
+
+ if ((code == mp->code) && !state[i]) {
+ char *value = LYKeycodeToString(i, (i >= 160 &&
+ i <= 255));
+ int before = wrapped + (ranges ? ((int)
+ strlen(ranges)) : 0);
+ int after = before;
+
+ if (non_empty(ranges)) {
+ StrAllocCat(ranges, ", ");
+ after += 2;
+ }
+ after += (int) strlen(value) + 2;
+ if ((before / LYcols) != (after / LYcols)) {
+ wrapped += (LYcols - (before % LYcols));
+ HTSprintf(&ranges, "\n%-*s", hanging, " ");
+ }
+ StrAllocCat(ranges, value);
+ }
+ }
+ if (non_empty(ranges)) {
+ LYEntify(&ranges, TRUE);
+ HTSprintf0(&buf, FORMAT,
+ width[0], mp->name,
+ width[1], mp->descr,
+ ranges);
+ PUTS(buf);
+ FREE(ranges);
+ had_output = TRUE;
+ }
+ }
+ }
+
+ HTSprintf0(&buf, "</pre>\n</body>\n</html>\n");
+ PUTS(buf);
+
+ (*target->isa->_free) (target);
+ result = HT_LOADED;
+ } else {
+ HTSprintf0(&buf, CANNOT_CONVERT_I_TO_O,
+ HTAtom_name(format_in), HTAtom_name(format_out));
+ HTAlert(buf);
+ result = HT_NOT_LOADED;
+ }
+ FREE(ranges);
+ FREE(buf);
+ return result;
+#undef FORMAT
+}
+
+#ifdef GLOBALDEF_IS_MACRO
+#define _LYEDITMAP_C_GLOBALDEF_1_INIT { "LYNXEDITMAP", LYLoadEditmap, 0}
+GLOBALDEF(HTProtocol, LYLynxEditmap, _LYEDITMAP_C_GLOBALDEF_1_INIT);
+#else
+GLOBALDEF HTProtocol LYLynxEditmap =
+{
+ "LYNXEDITMAP", LYLoadEditmap, 0
+};
+#endif /* GLOBALDEF_IS_MACRO */
diff --git a/src/LYExtern.c b/src/LYExtern.c
new file mode 100644
index 0000000..d36ba0b
--- /dev/null
+++ b/src/LYExtern.c
@@ -0,0 +1,443 @@
+/*
+ * $LynxId: LYExtern.c,v 1.55 2018/02/15 01:53:07 tom Exp $
+ *
+ External application support.
+ This feature allows lynx to pass a given URL to an external program.
+ It was written for three reasons.
+ 1) To overcome the deficiency of Lynx_386 not supporting ftp and news.
+ External programs can be used instead by passing the URL.
+
+ 2) To allow for background transfers in multitasking systems.
+ I use wget for http and ftp transfers via the external command.
+
+ 3) To allow for new URLs to be used through lynx.
+ URLs can be made up such as mymail: to spawn desired applications
+ via the external command.
+
+ See lynx.cfg for other info.
+*/
+
+#include <LYUtils.h>
+
+#ifdef USE_EXTERNALS
+
+#include <HTAlert.h>
+#include <LYGlobalDefs.h>
+#include <LYExtern.h>
+#include <LYLeaks.h>
+#include <LYCurses.h>
+#include <LYReadCFG.h>
+#include <LYStrings.h>
+
+#ifdef WIN_EX
+/* ASCII char -> HEX digit */
+#define ASC2HEXD(x) ((UCH(x) >= '0' && UCH(x) <= '9') ? \
+ (UCH(x) - '0') : (toupper(UCH(x)) - 'A' + 10))
+
+/* Decodes the forms %xy in a URL to the character the hexadecimal
+ code of which is xy. xy are hexadecimal digits from
+ [0123456789ABCDEF] (case-insensitive). If x or y are not hex-digits
+ or '%' is near '\0', the whole sequence is inserted literally. */
+
+static char *decode_string(char *s)
+{
+ char *save_s;
+ char *p = s;
+
+ save_s = s;
+ for (; *s; s++, p++) {
+ if (*s != '%')
+ *p = *s;
+ else {
+ /* Do nothing if at the end of the string. Or if the chars
+ are not hex-digits. */
+ if (!*(s + 1) || !*(s + 2)
+ || !(isxdigit(UCH(*(s + 1))) && isxdigit(UCH(*(s + 2))))) {
+ *p = *s;
+ continue;
+ }
+ *p = (char) ((ASC2HEXD(*(s + 1)) << 4) + ASC2HEXD(*(s + 2)));
+ s += 2;
+ }
+ }
+ *p = '\0';
+ return save_s;
+}
+#endif /* WIN_EX */
+
+#ifdef WIN_EX
+/*
+ * Delete dangerous characters as local path.
+ * We delete '<>|' and also '%"'.
+ * '%' should be deleted because it's difficut to escape for all cases.
+ * So we can't treat paths which include '%'.
+ * '"' should be deleted because it's a obstacle to quote whole path.
+ */
+static void delete_danger_characters(char *src)
+{
+ char *dst;
+
+ for (dst = src; *src != '\0'; src++) {
+ if (StrChr("<>|%\"", *src) == NULL) {
+ *dst = *src;
+ dst++;
+ }
+ }
+ *dst = '\0';
+}
+
+static char *escapeParameter(CONST char *parameter)
+{
+ size_t i;
+ size_t last = strlen(parameter);
+ size_t n = 0;
+ size_t encoded = 0;
+ size_t escaped = 0;
+ char *result;
+ char *needs_encoded = "<>|";
+ char *needs_escaped = "%";
+ char *needs_escaped_NT = "%&^";
+
+ for (i = 0; i < last; ++i) {
+ if (StrChr(needs_encoded, parameter[i]) != NULL) {
+ ++encoded;
+ }
+ if (system_is_NT) {
+ if (StrChr(needs_escaped_NT, parameter[i]) != NULL) {
+ ++escaped;
+ }
+ } else if (StrChr(needs_escaped, parameter[i]) != NULL) {
+ ++escaped;
+ }
+ }
+
+ result = (char *) malloc(last + encoded * 2 + escaped + 1);
+ if (result == NULL)
+ outofmem(__FILE__, "escapeParameter");
+
+ n = 0;
+ for (i = 0; i < last; i++) {
+ if (StrChr(needs_encoded, parameter[i]) != NULL) {
+ sprintf(result + n, "%%%02X", (unsigned char) parameter[i]);
+ n += 3;
+ continue;
+ }
+ if (system_is_NT) {
+ if (StrChr(needs_escaped_NT, parameter[i]) != NULL) {
+ result[n++] = '^';
+ result[n++] = parameter[i];
+ continue;
+ }
+ } else if (StrChr(needs_escaped, parameter[i]) != NULL) {
+ result[n++] = '%'; /* parameter[i] is '%' */
+ result[n++] = parameter[i];
+ continue;
+ }
+ result[n++] = parameter[i];
+ }
+ result[n] = '\0';
+
+ return result;
+}
+#endif /* WIN_EX */
+
+static void format(char **result,
+ char *fmt,
+ char *parm)
+{
+ *result = NULL;
+ HTAddParam(result, fmt, 1, parm);
+ HTEndParam(result, fmt, 1);
+}
+
+/*
+ * Format the given command into a buffer, returning the resulting string.
+ *
+ * It is too dangerous to leave any URL that may come along unquoted. They
+ * often contain '&', ';', and '?' chars, and who knows what else may occur.
+ * Prevent spoofing of the shell. Dunno how this needs to be modified for VMS
+ * or DOS. - kw
+ */
+static char *format_command(char *command,
+ char *param)
+{
+ char *cmdbuf = NULL;
+
+#if defined(WIN_EX)
+ char pram_string[LY_MAXPATH];
+ char *escaped = NULL;
+
+ if (strncasecomp("file://localhost/", param, 17) == 0) {
+ /* decode local path parameter for programs to be
+ able to interpret - TH */
+ LYStrNCpy(pram_string, param, sizeof(pram_string) - 1);
+ decode_string(pram_string);
+ param = pram_string;
+ } else {
+ /* encode or escape URL parameter - TH */
+ escaped = escapeParameter(param);
+ param = escaped;
+ }
+
+ if (isMAILTO_URL(param)) {
+ format(&cmdbuf, command, param + 7);
+ } else if (strncasecomp("telnet://", param, 9) == 0) {
+ char host[sizeof(pram_string)];
+ int last_pos;
+
+ LYStrNCpy(host, param + 9, sizeof(host));
+ last_pos = (int) strlen(host) - 1;
+ if (last_pos > 1 && host[last_pos] == '/')
+ host[last_pos] = '\0';
+
+ format(&cmdbuf, command, host);
+ } else if (strncasecomp("file://localhost/", param, 17) == 0) {
+ char e_buff[LY_MAXPATH], *p;
+
+ p = param + 17;
+ delete_danger_characters(p);
+ *e_buff = 0;
+ if (StrChr(p, ':') == NULL) {
+ sprintf(e_buff, "%.3s/", windows_drive);
+ }
+ strncat(e_buff, p, sizeof(e_buff) - strlen(e_buff) - 1);
+ p = strrchr(e_buff, '.');
+ if (p) {
+ trimPoundSelector(p);
+ }
+
+ /* Less ==> short filename with backslashes,
+ * less ==> long filename with forward slashes, may be quoted
+ */
+ if (ISUPPER(command[0])) {
+ char *short_name = HTDOS_short_name(e_buff);
+
+ p = quote_pathname(short_name);
+ format(&cmdbuf, command, p);
+ FREE(p);
+ } else {
+ p = quote_pathname(e_buff);
+ format(&cmdbuf, command, p);
+ FREE(p);
+ }
+ } else {
+ format(&cmdbuf, command, param);
+ }
+ FREE(escaped);
+#else
+ format(&cmdbuf, command, param);
+#endif
+ return cmdbuf;
+}
+
+/*
+ * Find the EXTERNAL command which matches the given name 'param'. If there is
+ * more than one possibility, make a popup menu of the matching commands and
+ * allow the user to select one. Return the selected command.
+ */
+static char *lookup_external(char *param,
+ int only_overriders)
+{
+ int pass, num_disabled, num_matched, num_choices, cur_choice;
+ size_t length = 0;
+ char *cmdbuf = NULL;
+ char **actions = 0;
+ char **choices = 0;
+ lynx_list_item_type *ptr = 0;
+
+ for (pass = 0; pass < 2; pass++) {
+ num_disabled = 0;
+ num_matched = 0;
+ num_choices = 0;
+ for (ptr = externals; ptr != 0; ptr = ptr->next) {
+
+ if (match_item_by_name(ptr, param, only_overriders)) {
+ ++num_matched;
+ CTRACE((tfp, "EXTERNAL: '%s' <==> '%s'\n", ptr->name, param));
+ if (no_externals && !ptr->always_enabled && !only_overriders) {
+ ++num_disabled;
+ } else {
+ if (pass == 0) {
+ length++;
+ } else if (pass != 0) {
+ cmdbuf = format_command(ptr->command, param);
+ if (length > 1) {
+ actions[num_choices] = cmdbuf;
+ choices[num_choices] =
+ format_command(ptr->menu_name, param);
+ }
+ }
+ num_choices++;
+ }
+ }
+ }
+ if (length > 1) {
+ if (pass == 0) {
+ actions = typecallocn(char *, length + 1);
+ choices = typecallocn(char *, length + 1);
+
+ if (actions == 0 || choices == 0)
+ outofmem(__FILE__, "lookup_external");
+ } else {
+ actions[num_choices] = 0;
+ choices[num_choices] = 0;
+ }
+ }
+ }
+
+ if (num_disabled != 0
+ && num_disabled == num_matched) {
+ HTUserMsg(EXTERNALS_DISABLED);
+ } else if (num_choices > 1) {
+ int old_y, old_x;
+
+ LYGetYX(old_y, old_x);
+ cur_choice = LYhandlePopupList(-1,
+ 0,
+ old_x,
+ (STRING2PTR) choices,
+ -1,
+ -1,
+ FALSE,
+ TRUE);
+ wmove(LYwin, old_y, old_x);
+ CTRACE((tfp, "selected choice %d of %d\n", cur_choice, num_choices));
+ if (cur_choice < 0) {
+ HTInfoMsg(CANCELLED);
+ cmdbuf = 0;
+ }
+ for (pass = 0; choices[pass] != 0; pass++) {
+ if (pass == cur_choice) {
+ cmdbuf = actions[pass];
+ } else {
+ FREE(actions[pass]);
+ }
+ FREE(choices[pass]);
+ }
+ }
+
+ if (actions) {
+ for (pass = 0; actions[pass] != 0; ++pass) {
+ if (actions[pass] != cmdbuf)
+ FREE(actions[pass]);
+ }
+ FREE(actions);
+ }
+
+ if (choices) {
+ for (pass = 0; choices[pass] != 0; ++pass) {
+ FREE(choices[pass]);
+ }
+ FREE(choices);
+ }
+
+ return cmdbuf;
+}
+
+BOOL run_external(char *param,
+ int only_overriders)
+{
+#ifdef WIN_EX
+ int status;
+#endif
+ int redraw_flag = TRUE;
+ char *cmdbuf = NULL;
+ BOOL found = FALSE;
+ int confirmed = TRUE;
+
+ if (externals == NULL)
+ return 0;
+
+#ifdef WIN_EX /* 1998/01/26 (Mon) 09:16:13 */
+ if (param == NULL) {
+ HTInfoMsg(gettext("External command is null"));
+ return 0;
+ }
+#endif
+
+ cmdbuf = lookup_external(param, only_overriders);
+ if (non_empty(cmdbuf)) {
+#ifdef WIN_EX /* 1997/10/17 (Fri) 14:07:50 */
+ int len;
+ char buff[LY_MAXPATH];
+
+ CTRACE((tfp, "Lynx EXTERNAL: '%s'\n", cmdbuf));
+#ifdef WIN_GUI /* 1997/11/06 (Thu) 14:17:15 */
+ confirmed = MessageBox(GetForegroundWindow(), cmdbuf,
+ "Lynx (EXTERNAL COMMAND EXEC)",
+ MB_ICONQUESTION | MB_SETFOREGROUND | MB_OKCANCEL)
+ != IDCANCEL;
+#else
+ confirmed = HTConfirm(LYElideString(cmdbuf, 40)) != NO;
+#endif
+ if (confirmed) {
+ len = (int) strlen(cmdbuf);
+ if (len > 255) {
+ sprintf(buff, "Lynx: command line too long (%d > 255)", len);
+#ifdef WIN_GUI /* 1997/11/06 (Thu) 14:17:02 */
+ MessageBox(GetForegroundWindow(), buff,
+ "Lynx (EXTERNAL COMMAND EXEC)",
+ MB_ICONEXCLAMATION | MB_SETFOREGROUND | MB_OK);
+ SetConsoleTitle("Lynx for Win32");
+#else
+ HTConfirm(LYElideString(buff, 40));
+#endif
+ confirmed = FALSE;
+ } else {
+ SetConsoleTitle(cmdbuf);
+ }
+ }
+
+ if (strncasecomp(cmdbuf, "start ", 6) == 0)
+ redraw_flag = FALSE;
+ else
+ redraw_flag = TRUE;
+#else
+ HTUserMsg(cmdbuf);
+#endif
+ found = TRUE;
+ if (confirmed) {
+ if (redraw_flag) {
+ stop_curses();
+ fflush(stdout);
+ }
+
+ /* command running. */
+#ifdef WIN_EX /* 1997/10/17 (Fri) 14:07:50 */
+#if defined(__CYGWIN__) || defined(__MINGW32__)
+ status = system(cmdbuf);
+#else
+ status = xsystem(cmdbuf);
+#endif
+ if (status != 0) {
+ sprintf(buff,
+ "EXEC code = %04x (%2d, %2d)\r\n"
+ "'%s'",
+ status, (status / 256), (status & 0xff),
+ cmdbuf);
+#ifdef SH_EX /* WIN_GUI for ERROR only */
+ MessageBox(GetForegroundWindow(), buff,
+ "Lynx (EXTERNAL COMMAND EXEC)",
+ MB_ICONSTOP | MB_SETFOREGROUND | MB_OK);
+#else
+ HTConfirm(LYElideString(buff, 40));
+#endif /* 1 */
+ }
+#else /* Not WIN_EX */
+ LYSystem(cmdbuf);
+#endif /* WIN_EX */
+
+#if defined(WIN_EX)
+ SetConsoleTitle("Lynx for Win32");
+#endif
+ if (redraw_flag) {
+ fflush(stdout);
+ start_curses();
+ }
+ }
+ }
+
+ FREE(cmdbuf);
+ return found;
+}
+#endif /* USE_EXTERNALS */
diff --git a/src/LYExtern.h b/src/LYExtern.h
new file mode 100644
index 0000000..89c84c9
--- /dev/null
+++ b/src/LYExtern.h
@@ -0,0 +1,16 @@
+/* $LynxId: LYExtern.h,v 1.14 2010/09/24 09:39:20 tom Exp $ */
+#ifndef EXTERNALS_H
+#define EXTERNALS_H
+
+#ifndef LYSTRUCTS_H
+#include <LYStructs.h>
+#endif /* LYSTRUCTS_H */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ extern BOOL run_external(char *c, int only_overriders);
+#ifdef __cplusplus
+}
+#endif
+#endif /* EXTERNALS_H */
diff --git a/src/LYForms.c b/src/LYForms.c
new file mode 100644
index 0000000..3f9c111
--- /dev/null
+++ b/src/LYForms.c
@@ -0,0 +1,1086 @@
+/* $LynxId: LYForms.c,v 1.119 2022/04/02 00:13:32 Paul.G.Fox Exp $ */
+#include <HTUtils.h>
+#include <HTCJK.h>
+#include <HTTP.h>
+#include <HTAlert.h>
+#include <LYCurses.h>
+#include <GridText.h>
+#include <LYCharSets.h>
+#include <UCAux.h>
+#include <LYGlobalDefs.h>
+#include <LYUtils.h>
+#include <LYStrings.h>
+#include <LYKeymap.h>
+#include <LYClean.h>
+
+#include <LYLeaks.h>
+
+#ifdef USE_COLOR_STYLE
+#include <AttrList.h>
+#include <LYHash.h>
+#endif
+
+#if defined(VMS) && !defined(USE_SLANG)
+#define RepaintKey() 12 /* CTRL-L for repaint */
+#else
+#define RepaintKey() ((!enable_scrollback) ? 23 : 12) /* CTRL-W or CTRL-L */
+#endif /* VMS && !USE_SLANG */
+
+static int form_getstr(int cur,
+ int use_last_tfpos,
+ int redraw_only);
+
+/*
+ * Returns an array of pointers to the given list
+ */
+static char **options_list(OptionType * opt_ptr)
+{
+ char **result = 0;
+ size_t len;
+ int pass;
+ OptionType *tmp_ptr;
+
+ for (pass = 0; pass < 2; pass++) {
+ for (tmp_ptr = opt_ptr, len = 0; tmp_ptr != 0; tmp_ptr = tmp_ptr->next) {
+ if (pass != 0)
+ result[len] = tmp_ptr->name;
+ len++;
+ }
+ if (pass == 0) {
+ len++;
+ result = typecallocn(char *, len);
+
+ if (result == 0)
+ outofmem(__FILE__, "options_list");
+ } else {
+ result[len] = 0;
+ }
+ }
+
+ return result;
+}
+
+int change_form_link_ex(int cur,
+ DocInfo *newdoc,
+ BOOLEAN *refresh_screen,
+ int use_last_tfpos,
+ int immediate_submit,
+ int redraw_only)
+{
+ FormInfo *form = links[cur].l_form;
+ char *link_name;
+ char *link_value;
+ int newdoc_changed = 0;
+ int c = DO_NOTHING;
+ int title_adjust = (no_title ? -TITLE_LINES : 0);
+ char **my_data = 0;
+
+ /*
+ * If there is no form to perform action on, don't do anything.
+ */
+ if (form == NULL) {
+ return (c);
+ }
+ link_name = form->name;
+ link_value = form->value;
+ my_data = options_list(form->select_list);
+
+ /*
+ * Move to the link position.
+ */
+ LYmove(links[cur].ly + title_adjust, links[cur].lx);
+
+ switch (form->type) {
+ case F_CHECKBOX_TYPE:
+ if (FormIsReadonly(form))
+ break;
+ LYSetHilite(cur, form->num_value ? unchecked_box : checked_box);
+ form->num_value = !form->num_value;
+ break;
+
+ case F_OPTION_LIST_TYPE:
+ if (form->select_list == 0) {
+ HTAlert(BAD_HTML_NO_POPUP);
+ c = DO_NOTHING;
+ break;
+ }
+
+ if (FormIsReadonly(form)) {
+ (void) LYhandlePopupList(form->num_value,
+ links[cur].ly,
+ links[cur].lx,
+ (STRING2PTR) my_data,
+ form->size,
+ form->size_l,
+ FormIsReadonly(form),
+ FALSE);
+ c = RepaintKey();
+ break;
+ }
+ form->num_value = LYhandlePopupList(form->num_value,
+ links[cur].ly,
+ links[cur].lx,
+ (STRING2PTR) my_data,
+ form->size,
+ form->size_l,
+ FormIsReadonly(form),
+ FALSE);
+ {
+ OptionType *opt_ptr = form->select_list;
+ int i;
+
+ for (i = 0; i < form->num_value; i++, opt_ptr = opt_ptr->next) ; /* null body */
+ /*
+ * Set the name.
+ */
+ form->value = opt_ptr->name;
+ /*
+ * Set the value.
+ */
+ form->cp_submit_value = opt_ptr->cp_submit_value;
+ /*
+ * Set charset in which we have the submit value. - kw
+ */
+ form->value_cs = opt_ptr->value_cs;
+ }
+ c = RepaintKey();
+ break;
+
+ case F_RADIO_TYPE:
+ if (FormIsReadonly(form))
+ break;
+ /*
+ * Radio buttons must have one and only one down at a time!
+ */
+ if (form->num_value) {
+ if (user_mode == NOVICE_MODE) {
+ HTUserMsg(NEED_CHECKED_RADIO_BUTTON);
+ }
+ } else {
+ int i;
+
+ /*
+ * Run though list of the links on the screen and unselect any that
+ * are selected. :)
+ */
+ lynx_start_radio_color();
+ for (i = 0; i < nlinks; i++) {
+ if (links[i].type == WWW_FORM_LINK_TYPE
+ && links[i].l_form->type == F_RADIO_TYPE
+ && links[i].l_form->number == form->number
+ /*
+ * If it has the same name and its on...
+ */
+ && !strcmp(links[i].l_form->name, form->name)
+ && links[i].l_form->num_value) {
+ LYmove(links[i].ly, links[i].lx);
+ LYaddstr(unchecked_radio);
+ LYSetHilite(i, unchecked_radio);
+ }
+ }
+ lynx_stop_radio_color();
+ /*
+ * Will unselect other button and select this one.
+ */
+ HText_activateRadioButton(form);
+ /*
+ * Now highlight this one.
+ */
+ LYSetHilite(cur, checked_radio);
+ }
+ break;
+
+ case F_FILE_TYPE:
+ case F_TEXT_TYPE:
+ case F_TEXTAREA_TYPE:
+ case F_PASSWORD_TYPE:
+ c = form_getstr(cur, use_last_tfpos, redraw_only);
+ LYSetHilite(cur, ((form->type == F_PASSWORD_TYPE)
+ ? STARS(LYstrCells(form->value))
+ : form->value));
+ break;
+
+ case F_RESET_TYPE:
+ if (FormIsReadonly(form))
+ break;
+ HText_ResetForm(form);
+ *refresh_screen = TRUE;
+ break;
+
+ case F_TEXT_SUBMIT_TYPE:
+ if (redraw_only) {
+ c = form_getstr(cur, use_last_tfpos, TRUE);
+ break;
+ }
+ if (!immediate_submit)
+ c = form_getstr(cur, use_last_tfpos, FALSE);
+ if (FormIsReadonly(form) &&
+ (c == '\r' || c == '\n' || immediate_submit)) {
+ if (peek_mouse_link() >= 0)
+ c = LAC_TO_LKC0(LYK_ACTIVATE);
+ else
+ c = '\t';
+ break;
+ }
+ /*
+ * If immediate_submit is set, we didn't enter the line editor above,
+ * and will now try to call HText_SubmitForm() directly. If
+ * immediate_submit is not set, c is the lynxkeycode returned from line
+ * editing. Then if c indicates that a key was pressed that means we
+ * should submit, but with some extra considerations (i.e. NOCACHE,
+ * DOWNLOAD, different from simple Enter), or if we should act on some
+ * *other* link selected with the mouse, we'll just return c and leave
+ * it to mainloop() to do the right thing; if everything checks out, it
+ * should call this function again, with immediate_submit set.
+ *
+ * If c indicates that line editing ended with Enter, we still defer to
+ * mainloop() for further checking if the submit action URL could
+ * require more checks than we do here. Only in the remaining cases do
+ * we proceed to call HText_SubmitForm() directly before returning. -
+ * kw
+ */
+ if (immediate_submit ||
+ ((c == '\r' ||
+ c == '\n' ||
+ c == LAC_TO_LKC0(LYK_MOUSE_SUBMIT)) &&
+ peek_mouse_link() == -1)) {
+ LYSetHilite(cur, form->value);
+#ifdef TEXT_SUBMIT_CONFIRM_WANTED
+ if (!immediate_submit && (c == '\r' || c == '\n') &&
+ !HTConfirmDefault(NO_SUBMIT_BUTTON_QUERY, YES)) {
+ /* User was prompted and declined; if canceled with ^G
+ * let mainloop stay on this field, otherwise move on to
+ * the next field or link. - kw
+ */
+ if (HTLastConfirmCancelled())
+ c = DO_NOTHING;
+ else
+ c = LAC_TO_LKC(LYK_NEXT_LINK);
+ break;
+ }
+#endif
+ if (isEmpty(form->submit_action)) {
+ HTUserMsg(NO_FORM_ACTION);
+ c = DO_NOTHING;
+ break;
+ } else if (form->submit_method == URL_MAIL_METHOD && no_mail) {
+ HTAlert(FORM_MAILTO_DISALLOWED);
+ c = DO_NOTHING;
+ break;
+ } else if (!immediate_submit &&
+ ((no_file_url &&
+ isFILE_URL(form->submit_action)) ||
+ !strncasecomp(form->submit_action, "lynx", 4))) {
+ c = LAC_TO_LKC0(LYK_MOUSE_SUBMIT);
+ break;
+ } else {
+ if (form->no_cache &&
+ form->submit_method != URL_MAIL_METHOD) {
+ LYforce_no_cache = TRUE;
+ reloading = TRUE;
+ }
+ newdoc_changed =
+ HText_SubmitForm(form, newdoc, link_name, form->value);
+ }
+ if (form->submit_method == URL_MAIL_METHOD) {
+ *refresh_screen = TRUE;
+ } else {
+ /*
+ * Returns new document URL.
+ */
+ newdoc->link = 0;
+ newdoc->internal_link = FALSE;
+ }
+ c = DO_NOTHING;
+ break;
+ } else {
+ LYSetHilite(cur, form->value);
+ }
+ break;
+
+ case F_SUBMIT_TYPE:
+ case F_IMAGE_SUBMIT_TYPE:
+ if (FormIsReadonly(form))
+ break;
+ if (form->no_cache &&
+ form->submit_method != URL_MAIL_METHOD) {
+ LYforce_no_cache = TRUE;
+ reloading = TRUE;
+ }
+ newdoc_changed =
+ HText_SubmitForm(form, newdoc, link_name, link_value);
+ if (form->submit_method == URL_MAIL_METHOD)
+ *refresh_screen = TRUE;
+ else {
+ /* returns new document URL */
+ newdoc->link = 0;
+ newdoc->internal_link = FALSE;
+ }
+ break;
+
+ }
+
+ if (newdoc_changed) {
+ c = LKC_DONE;
+ } else {
+ /*
+ * These flags may have been set in mainloop, anticipating that a
+ * request will be submitted. But if we haven't filled in newdoc, that
+ * won't actually be the case, so unset them. - kw
+ */
+ LYforce_no_cache = FALSE;
+ reloading = FALSE;
+ }
+ FREE(my_data);
+ return (c);
+}
+
+int change_form_link(int cur,
+ DocInfo *newdoc,
+ BOOLEAN *refresh_screen,
+ int use_last_tfpos,
+ int immediate_submit)
+{
+ /*pass all our args and FALSE as last arg */
+ return change_form_link_ex(cur,
+ newdoc,
+ refresh_screen,
+ use_last_tfpos,
+ immediate_submit,
+ FALSE /*redraw_only */ );
+}
+
+static int LastTFPos = -1; /* remember last text field position */
+
+static void LYSetLastTFPos(int pos)
+{
+ LastTFPos = pos;
+}
+
+static int form_getstr(int cur,
+ int use_last_tfpos,
+ int redraw_only)
+{
+ FormInfo *form = links[cur].l_form;
+ char *link_value = form->value;
+ int ch;
+ int far_col;
+ int startcol, startline;
+ int action, repeat;
+ int last_xlkc = -1;
+
+#ifdef SUPPORT_MULTIBYTE_EDIT
+ BOOL refresh_mb = TRUE;
+#endif
+
+ FieldEditor MyEdit, *edit = &MyEdit;
+ BOOLEAN Edited = FALSE; /* Value might be updated? */
+
+ /*
+ * Get the initial position of the cursor.
+ */
+ LYGetYX(startline, startcol);
+ if (startline < 0)
+ startline = 0;
+ if (startcol < 0)
+ startcol = 0;
+ if ((startcol + form->size) > LYcolLimit)
+ far_col = LYcolLimit;
+ else
+ far_col = (startcol + form->size);
+
+ /*
+ * Make sure the form field value does not exceed our buffer. - FM
+ */
+ if (form->maxlength != 0 &&
+ strlen(form->value) > form->maxlength) {
+ /*
+ * We can't fit the entire value into the editing buffer, so enter as
+ * much of the tail as fits. - FM
+ */
+ link_value += (strlen(form->value) - form->maxlength);
+ if (!FormIsReadonly(form) &&
+ !(form->submit_method == URL_MAIL_METHOD && no_mail)) {
+ /*
+ * If we can edit it, report that we are using the tail. - FM
+ */
+ HTUserMsg(FORM_VALUE_TOO_LONG);
+ show_formlink_statusline(form, redraw_only ? FOR_PANEL : FOR_INPUT);
+ LYmove(startline, startcol);
+ }
+ }
+
+ /*
+ * Print panned line
+ */
+ LYSetupEdit(edit, link_value, form->maxlength, (far_col - startcol));
+ edit->efPadChar = '_';
+ edit->efIsMasked = (BOOL) (form->type == F_PASSWORD_TYPE);
+ if (use_last_tfpos &&
+ LastTFPos >= 0 &&
+ LastTFPos < (int) edit->efBufInUse) {
+#if defined(TEXTFIELDS_MAY_NEED_ACTIVATION) && defined(INACTIVE_INPUT_STYLE_VH)
+ if (redraw_only) {
+ if (!((int) edit->efBufInUse >= edit->efWidth &&
+ LastTFPos >= edit->efWidth - edit->efPanMargin)) {
+ edit->efEditAt = LastTFPos;
+ if ((int) edit->efBufInUse >= edit->efWidth)
+ textinput_redrawn = FALSE;
+ }
+ } else
+#endif /* TEXTFIELDS_MAY_NEED_ACTIVATION && INACTIVE_INPUT_STYLE_VH */
+ edit->efEditAt = LastTFPos;
+#ifdef ENHANCED_LINEEDIT
+ if (edit->efEditAt == 0)
+ /* Do not show the region. */
+ edit->efEditMark = -(int) (1 + edit->efBufInUse);
+#endif
+ }
+ /* Try to prepare for setting position based on the last mouse event */
+#if defined(TEXTFIELDS_MAY_NEED_ACTIVATION) && defined(INACTIVE_INPUT_STYLE_VH)
+ if (!redraw_only) {
+ if (peek_mouse_levent()) {
+ if (!use_last_tfpos && !textinput_redrawn) {
+ edit->efEditAt = 0;
+ }
+ }
+ textinput_redrawn = FALSE;
+ }
+#else
+ if (peek_mouse_levent()) {
+ if (!use_last_tfpos)
+ edit->efEditAt = 0;
+ }
+#endif /* TEXTFIELDS_MAY_NEED_ACTIVATION && INACTIVE_INPUT_STYLE_VH */
+ LYRefreshEdit(edit);
+ if (redraw_only) {
+ LYFinishEdit(edit);
+ return 0; /*return value won't be analysed */
+ }
+#ifdef FEPCTRL
+ fep_on();
+#endif
+ /*
+ * And go for it!
+ */
+ for (;;) {
+ again:
+ repeat = -1;
+ get_mouse_link(); /* Reset mouse_link. */
+
+ ch = LYgetch_input();
+#ifdef SUPPORT_MULTIBYTE_EDIT
+ if (!refresh_mb
+ && (EditBinding(ch) != LYE_CHAR)
+#ifndef WIN_EX
+ && (EditBinding(ch) != LYE_AIX)
+#endif
+ )
+ goto again;
+#endif /* SUPPORT_MULTIBYTE_EDIT */
+#ifdef VMS
+ if (HadVMSInterrupt) {
+ HadVMSInterrupt = FALSE;
+ ch = LYCharINTERRUPT2;
+ }
+#endif /* VMS */
+
+ action = 0;
+#ifdef USE_MOUSE
+# if defined(NCURSES) || defined(PDCURSES)
+ if (ch != -1 && (ch & LKC_ISLAC) && !(ch & LKC_ISLECLAC)) /* already lynxactioncode? */
+ break; /* @@@ maybe move these 2 lines outside ifdef -kw */
+ if (ch == MOUSE_KEY) { /* Need to process ourselves */
+#if defined(PDCURSES)
+ int curx, cury;
+
+ request_mouse_pos();
+ LYGetYX(cury, curx);
+ if (MOUSE_Y_POS == cury) {
+ repeat = MOUSE_X_POS - curx;
+ if (repeat < 0) {
+ action = LYE_BACK;
+ repeat = -repeat;
+ } else
+ action = LYE_FORW;
+ }
+#else
+ MEVENT event;
+ int curx, cury;
+
+ getmouse(&event);
+ LYGetYX(cury, curx);
+ if (event.y == cury) {
+ repeat = event.x - curx;
+ if (repeat < 0) {
+ action = LYE_BACK;
+ repeat = -repeat;
+ } else
+ action = LYE_FORW;
+ }
+#endif /* PDCURSES */
+ else {
+ /* Mouse event passed to us as MOUSE_KEY, and apparently not on
+ * this field's line? Something is not as it should be...
+ *
+ * A call to statusline() may have happened, possibly from
+ * within a mouse menu. Let's at least make sure here that the
+ * cursor position gets restored. - kw
+ */
+ edit->efIsDirty = TRUE;
+ }
+ } else
+# endif /* NCURSES || PDCURSES */
+#endif /* USE_MOUSE */
+
+ {
+ if (!(ch & LKC_ISLECLAC))
+ ch |= edit->efInputMods;
+ edit->efInputMods = 0;
+ if (last_xlkc != -1) {
+ if (ch == last_xlkc)
+ ch |= LKC_MOD3;
+ }
+ }
+ if (peek_mouse_link() != -1)
+ break;
+
+ if (!action)
+ action = EditBinding(ch);
+ if ((action & LYE_DF) && !(action & LYE_FORM_LAC)) {
+ last_xlkc = ch;
+ action &= ~LYE_DF;
+ } else {
+ last_xlkc = -1;
+ }
+
+ if (action == LYE_SETM1) {
+ /*
+ * Set flag for modifier 1.
+ */
+ edit->efInputMods |= LKC_MOD1;
+ continue;
+ }
+ if (action == LYE_SETM2) {
+ /*
+ * Set flag for modifier 2.
+ */
+ edit->efInputMods |= LKC_MOD2;
+ continue;
+ }
+ /*
+ * Filter out global navigation keys that should not be passed to line
+ * editor, and LYK_REFRESH.
+ */
+ if (action == LYE_ENTER)
+ break;
+ if (action == LYE_FORM_PASS)
+ break;
+ if (action & LYE_FORM_LAC) {
+ ch = (action & LAC_MASK) | LKC_ISLAC;
+ break;
+ }
+ if (action == LYE_LKCMD) {
+ _statusline(ENTER_LYNX_COMMAND);
+ ch = LYgetch();
+#ifdef VMS
+ if (HadVMSInterrupt) {
+ HadVMSInterrupt = FALSE;
+ ch = LYCharINTERRUPT2;
+ }
+#endif /* VMS */
+ break;
+ }
+#ifdef CAN_CUT_AND_PASTE /* 1998/10/01 (Thu) 19:19:22 */
+ if (action == LYE_PASTE) {
+ unsigned char *s = (unsigned char *) get_clip_grab(), *e;
+ char *buf = NULL;
+ int len;
+
+ if (!s)
+ break;
+ len = (int) strlen((const char *) s);
+ e = s + len;
+
+ if (len > 0) {
+ unsigned char *e1 = s;
+
+ while (e1 < e) {
+ if (*e1 < ' ') { /* Stop here? */
+ if (e1 > s)
+ LYEditInsert(edit, s, (int) (e1 - s), -1, TRUE);
+ s = e1;
+ if (*e1 == '\t') { /* Replace by space */
+ LYEditInsert(edit, (unsigned const char *) " ", 1,
+ -1, TRUE);
+ s = ++e1;
+ } else
+ break;
+ } else
+ ++e1;
+ }
+ if (e1 > s)
+ LYEditInsert(edit, s, (int) (e1 - s), -1, TRUE);
+ while (e1 < e && *e1 == '\r')
+ e1++;
+ if (e1 + 1 < e && *e1 == '\n')
+ StrAllocCopy(buf, (char *) e1 + 1); /* Survive _release() */
+ get_clip_release();
+ _statusline(ENTER_TEXT_ARROWS_OR_TAB);
+ if (strcmp(link_value, edit->efBuffer) != 0) {
+ Edited = TRUE;
+ }
+ if (buf) {
+ put_clip(buf);
+ FREE(buf);
+ ch = '\n'; /* Sometimes moves to the next line */
+ break;
+ }
+ LYRefreshEdit(edit);
+ } else {
+ HTInfoMsg(gettext("Clipboard empty or Not text data."));
+#ifdef FEPCTRL
+ fep_off();
+#endif
+ continue;
+ }
+ }
+#endif
+#ifndef WIN_EX
+ if (action == LYE_AIX &&
+ (!IS_CJK_TTY && LYlowest_eightbit[current_char_set] > 0x97))
+ break;
+#endif
+ if (action == LYE_TAB) {
+ ch = (int) ('\t');
+ break;
+ }
+ if (action == LYE_ABORT) {
+#ifdef FEPCTRL
+ fep_off();
+#endif
+ LYFinishEdit(edit);
+ return (DO_NOTHING);
+ }
+ if (action == LYE_STOP) {
+#ifdef TEXTFIELDS_MAY_NEED_ACTIVATION
+ textfields_need_activation = TRUE;
+ break;
+#else
+#ifdef ENHANCED_LINEEDIT
+ if (edit->efEditMark >= 0)
+ /* Disable. */
+ edit->efEditMark = -(int) (1 + edit->efBufInUse);
+#endif
+#endif
+ }
+ if (action == LYE_NOP && LKC_TO_LAC(keymap, ch) == LYK_REFRESH)
+ break;
+#ifdef SH_EX
+/* ASATAKU emacskey hack 1997/08/26 (Tue) 09:19:23 */
+ if (emacs_keys &&
+ (EditBinding(ch) == LYE_FORWW || EditBinding(ch) == LYE_BACKW))
+ goto breakfor;
+/* ASATAKU emacskey hack */
+#endif
+ switch (ch) {
+ default:
+ /* [ 1999/04/14 (Wed) 15:01:33 ]
+ * Left arrow in column 0 deserves special treatment here, else
+ * you can get trapped in a form without submit button!
+ */
+ if (action == LYE_BACK && edit->efEditAt == 0 && repeat == -1) {
+ int c = YES; /* Go back immediately if no changes */
+
+ if (textfield_prompt_at_left_edge) {
+ c = HTConfirmDefault(PREV_DOC_QUERY, NO);
+ } else if (strcmp(edit->efBuffer, link_value)) {
+ c = HTConfirmDefault(PREV_DOC_QUERY, NO);
+ }
+ if (c == YES) {
+#ifdef FEPCTRL
+ fep_off();
+#endif
+ LYFinishEdit(edit);
+ return (ch);
+ } else {
+ if (FormIsReadonly(form))
+ _statusline(ARROWS_OR_TAB_TO_MOVE);
+ else
+ _statusline(ENTER_TEXT_ARROWS_OR_TAB);
+ }
+ }
+ if (FormIsReadonly(form)) {
+ /*
+ * Allow actions that don't modify the contents even in
+ * disabled form fields, so the user can scroll through the
+ * line for reading if necessary. - kw
+ */
+ switch (action) {
+ case LYE_BOL:
+ case LYE_EOL:
+ case LYE_FORW:
+ case LYE_FORW_RL:
+ case LYE_BACK:
+ case LYE_BACK_LL:
+ case LYE_FORWW:
+ case LYE_BACKW:
+#ifdef EXP_KEYBOARD_LAYOUT
+ case LYE_SWMAP:
+#endif
+#ifdef ENHANCED_LINEEDIT
+ case LYE_SETMARK:
+ case LYE_XPMARK:
+#endif
+ break;
+ default:
+ goto again;
+ }
+ }
+ /*
+ * Make sure the statusline uses editmode help.
+ */
+ if (repeat < 0)
+ repeat = 1;
+ while (repeat--) {
+ int rc = LYDoEdit(edit, ch, action & ~LYE_DF, TRUE);
+
+ if (rc < 0) {
+ ch = -rc;
+ /* FORW_RL and BACK_LL may require special attention.
+ BACK_LL wanted to switch to the previous link on
+ the same line. However, if there is no such link,
+ then we would either disactivate the form
+ (with -tna), or will reenter the form, thus we jump
+ to the end of the line; both are counterintuitive.
+ Unfortunately, we do not have access to curdoc.link,
+ so we deduce it ourselves. We don't have the info
+ to do it inside LYLineEdit().
+ This should work for prompts too. */
+ switch (action) {
+ case LYE_BACK_LL:
+ if (cur > 0
+ && links[cur - 1].ly == links[cur].ly) {
+ goto breakfor;
+ }
+ break;
+ case LYE_FORW_RL:
+ if (cur >= 0
+ && cur < nlinks - 1
+ && links[cur + 1].ly == links[cur].ly) {
+ goto breakfor;
+ }
+ break;
+ default:
+ goto breakfor;
+ }
+ }
+#ifdef SUPPORT_MULTIBYTE_EDIT
+ if (rc == 0) {
+ if (IS_CJK_TTY && (0x80 <= ch)
+ && (ch <= 0xfe) && refresh_mb)
+ refresh_mb = FALSE;
+ else
+ refresh_mb = TRUE;
+ } else {
+ if (!refresh_mb) {
+ LYDoEdit(edit, 0, LYE_DELP, TRUE);
+ }
+ }
+#endif /* SUPPORT_MULTIBYTE_EDIT */
+ }
+ _statusline(ENTER_TEXT_ARROWS_OR_TAB);
+ if (strcmp(link_value, edit->efBuffer)) {
+ Edited = TRUE;
+ }
+#ifdef SUPPORT_MULTIBYTE_EDIT
+ if (refresh_mb)
+#endif
+ LYRefreshEdit(edit);
+ LYSetLastTFPos(edit->efEditAt);
+ }
+ }
+ breakfor:
+ if (Edited) {
+
+ /*
+ * Load the new value.
+ */
+ if (link_value == form->value) {
+ /*
+ * The previous value did fit in the line buffer, so replace it
+ * with the new value. - FM
+ */
+ StrAllocCopy(form->value, edit->efBuffer);
+ } else {
+ int old_len = (int) strlen(form->value);
+ int new_len = (int) strlen(link_value);
+
+ /*
+ * Combine the modified tail with the unmodified head. - FM
+ */
+ form->value[(old_len > new_len) ? (old_len - new_len) : 0] = '\0';
+ StrAllocCat(form->value, edit->efBuffer);
+ HTUserMsg(FORM_TAIL_COMBINED_WITH_HEAD);
+ }
+
+ /* 2.8.4pre.3 - most browsers appear to preserve trailing spaces -VH */
+ /*
+ * Remove trailing spaces
+ *
+ * Do we really need to do that here? Trailing spaces will only be
+ * there if user keyed them in. Rather rude to throw away their hard
+ * earned spaces. Better deal with trailing spaces when submitting the
+ * form????
+ */
+ if (LYtrimInputFields) {
+ LYTrimTrailing(form->value);
+ }
+
+ /*
+ * If the field has been changed, assume that it is now in current
+ * display character set, even if for some reason it wasn't! Hopefully
+ * a user will only submit the form if the non-ASCII characters are
+ * displayed correctly, which means (assuming that the display
+ * character set has been set truthfully) the user confirms by changing
+ * the field that the character encoding is right. - kw
+ */
+ if (non_empty(form->value))
+ form->value_cs = current_char_set;
+ }
+#ifdef FEPCTRL
+ fep_off();
+#endif
+ LYFinishEdit(edit);
+ return (ch);
+}
+
+#ifdef TEXTFIELDS_MAY_NEED_ACTIVATION
+#define TMA_PANEL(fp,np) ((for_what == FOR_PANEL) ? fp : np)
+#else
+#define TMA_PANEL(fp,np) np
+#endif
+
+/*
+ * Display statusline info tailored for the current form field.
+ */
+void show_formlink_statusline(const FormInfo * form,
+ int for_what)
+{
+ switch (form->type) {
+ case F_PASSWORD_TYPE:
+ if (FormIsReadonly(form))
+ statusline(FORM_LINK_PASSWORD_UNM_MSG);
+ else
+ statusline(TMA_PANEL(FORM_LINK_PASSWORD_MESSAGE_INA,
+ FORM_LINK_PASSWORD_MESSAGE));
+ break;
+ case F_OPTION_LIST_TYPE:
+ if (FormIsReadonly(form)) {
+ statusline(FORM_LINK_OPTION_LIST_UNM_MSG);
+ } else if (fields_are_named()) {
+ char *submit_str = NULL;
+
+ HTSprintf0(&submit_str, FORM_LINK_OPTION_LIST_ADV_MSG, form->name);
+ statusline(submit_str);
+ FREE(submit_str);
+ } else {
+ statusline(FORM_LINK_OPTION_LIST_MESSAGE);
+ }
+ break;
+ case F_CHECKBOX_TYPE:
+ if (FormIsReadonly(form)) {
+ statusline(FORM_LINK_CHECKBOX_UNM_MSG);
+ } else if (fields_are_named()) {
+ char *submit_str = NULL;
+
+ HTSprintf0(&submit_str, FORM_LINK_CHECKBOX_ADV_MSG, form->name);
+ statusline(submit_str);
+ FREE(submit_str);
+ } else {
+ statusline(FORM_LINK_CHECKBOX_MESSAGE);
+ }
+ break;
+ case F_RADIO_TYPE:
+ if (FormIsReadonly(form)) {
+ statusline(FORM_LINK_RADIO_UNM_MSG);
+ } else if (fields_are_named()) {
+ char *submit_str = NULL;
+
+ HTSprintf0(&submit_str, FORM_LINK_RADIO_ADV_MSG, form->name);
+ statusline(submit_str);
+ FREE(submit_str);
+ } else {
+ statusline(FORM_LINK_RADIO_MESSAGE);
+ }
+ break;
+ case F_TEXT_SUBMIT_TYPE:
+ if (FormIsReadonly(form)) {
+ statusline(FORM_LINK_TEXT_SUBMIT_UNM_MSG);
+ } else if (form->submit_method ==
+ URL_MAIL_METHOD) {
+ if (no_mail)
+ statusline(FORM_LINK_TEXT_SUBMIT_MAILTO_DIS_MSG);
+ else
+ statusline(TMA_PANEL(FORM_TEXT_SUBMIT_MAILTO_MSG_INA,
+ FORM_LINK_TEXT_SUBMIT_MAILTO_MSG));
+ } else if (form->no_cache) {
+ statusline(TMA_PANEL(FORM_TEXT_RESUBMIT_MESSAGE_INA,
+ FORM_LINK_TEXT_RESUBMIT_MESSAGE));
+ } else {
+ char *submit_str = NULL;
+ char *xkey_info = key_for_func_ext(LYK_NOCACHE, for_what);
+
+ if (non_empty(xkey_info)) {
+ HTSprintf0(&submit_str,
+ TMA_PANEL(FORM_TEXT_SUBMIT_MESSAGE_INA_X,
+ FORM_LINK_TEXT_SUBMIT_MESSAGE_X),
+ xkey_info);
+ statusline(submit_str);
+ FREE(submit_str);
+ } else {
+ statusline(TMA_PANEL(FORM_LINK_TEXT_SUBMIT_MESSAGE_INA,
+ FORM_LINK_TEXT_SUBMIT_MESSAGE));
+ }
+ FREE(xkey_info);
+ }
+ break;
+ case F_SUBMIT_TYPE:
+ case F_IMAGE_SUBMIT_TYPE:
+ if (FormIsReadonly(form)) {
+ statusline(FORM_LINK_SUBMIT_DIS_MSG);
+ } else if (form->submit_method ==
+ URL_MAIL_METHOD) {
+ if (no_mail) {
+ statusline(FORM_LINK_SUBMIT_MAILTO_DIS_MSG);
+ } else {
+ if (user_mode == MINIMAL_MODE) {
+ statusline("");
+ } else if (user_mode == ADVANCED_MODE) {
+ char *submit_str = NULL;
+
+ StrAllocCopy(submit_str, FORM_LINK_SUBMIT_MAILTO_PREFIX);
+ StrAllocCat(submit_str, form->submit_action);
+ statusline(submit_str);
+ FREE(submit_str);
+ } else {
+ statusline(FORM_LINK_SUBMIT_MAILTO_MSG);
+ }
+ }
+ } else if (form->no_cache) {
+ if (user_mode == MINIMAL_MODE) {
+ statusline("");
+ } else if (user_mode == ADVANCED_MODE) {
+ char *submit_str = NULL;
+
+ StrAllocCopy(submit_str, FORM_LINK_RESUBMIT_PREFIX);
+ StrAllocCat(submit_str, form->submit_action);
+ statusline(submit_str);
+ FREE(submit_str);
+ } else {
+ statusline(FORM_LINK_RESUBMIT_MESSAGE);
+ }
+ } else {
+ if (user_mode == MINIMAL_MODE) {
+ statusline("");
+ } else if (user_mode == ADVANCED_MODE) {
+ char *submit_str = NULL;
+
+ StrAllocCopy(submit_str, FORM_LINK_SUBMIT_PREFIX);
+ StrAllocCat(submit_str, form->submit_action);
+ statusline(submit_str);
+ FREE(submit_str);
+ } else {
+ statusline(FORM_LINK_SUBMIT_MESSAGE);
+ }
+ }
+ break;
+ case F_RESET_TYPE:
+ if (FormIsReadonly(form))
+ statusline(FORM_LINK_RESET_DIS_MSG);
+ else
+ statusline(FORM_LINK_RESET_MESSAGE);
+ break;
+ case F_BUTTON_TYPE:
+ if (FormIsReadonly(form)) {
+ statusline(FORM_LINK_BUTTON_DIS_MSG);
+ } else if (fields_are_named()) {
+ char *submit_str = NULL;
+
+ HTSprintf0(&submit_str, FORM_LINK_BUTTON_ADV_MSG, form->name);
+ statusline(submit_str);
+ FREE(submit_str);
+ } else {
+ statusline(FORM_LINK_BUTTON_MESSAGE);
+ }
+ break;
+ case F_FILE_TYPE:
+ if (FormIsReadonly(form))
+ statusline(FORM_LINK_FILE_UNM_MSG);
+ else
+ statusline(FORM_LINK_FILE_MESSAGE);
+ break;
+ case F_TEXT_TYPE:
+ if (FormIsReadonly(form)) {
+ statusline(FORM_LINK_TEXT_UNM_MSG);
+ } else if (fields_are_named()) {
+ char *submit_str = NULL;
+
+ HTSprintf0(&submit_str,
+ TMA_PANEL(FORM_LINK_TEXT_ADV_MSG_INA,
+ FORM_LINK_TEXT_ADV_MSG),
+ form->name);
+ statusline(submit_str);
+ FREE(submit_str);
+ } else {
+ statusline(TMA_PANEL(FORM_LINK_TEXT_MESSAGE_INA,
+ FORM_LINK_TEXT_MESSAGE));
+ }
+ break;
+ case F_TEXTAREA_TYPE:
+ if (FormIsReadonly(form)) {
+ statusline(FORM_LINK_TEXT_UNM_MSG);
+ } else {
+ char *submit_str = NULL;
+ char *xkey_info = NULL;
+
+ if (!no_editor && non_empty(editor)) {
+ xkey_info = key_for_func_ext(LYK_EDITTEXTAREA, for_what);
+#ifdef TEXTAREA_AUTOEXTEDIT
+ if (!xkey_info)
+ xkey_info = key_for_func_ext(LYK_DWIMEDIT, for_what);
+#endif
+ }
+ if (non_empty(xkey_info)) {
+ if (fields_are_named()) {
+ HTSprintf0(&submit_str,
+ TMA_PANEL(FORM_LINK_TEXTAREA_ADV_MSG_INA_E,
+ FORM_LINK_TEXTAREA_ADV_MSG_E),
+ form->name,
+ xkey_info);
+ } else {
+ HTSprintf0(&submit_str,
+ TMA_PANEL(FORM_LINK_TEXTAREA_MESSAGE_INA_E,
+ FORM_LINK_TEXTAREA_MESSAGE_E),
+ xkey_info);
+ }
+ statusline(submit_str);
+ FREE(submit_str);
+ } else {
+ if (fields_are_named()) {
+ HTSprintf0(&submit_str,
+ TMA_PANEL(FORM_LINK_TEXTAREA_ADV_MSG_INA,
+ FORM_LINK_TEXTAREA_ADV_MSG),
+ form->name);
+ statusline(submit_str);
+ FREE(submit_str);
+ } else {
+ statusline(TMA_PANEL(FORM_LINK_TEXTAREA_MESSAGE_INA,
+ FORM_LINK_TEXTAREA_MESSAGE));
+ }
+ }
+ FREE(xkey_info);
+ }
+ break;
+ }
+}
diff --git a/src/LYGCurses.h b/src/LYGCurses.h
new file mode 100644
index 0000000..ce5303c
--- /dev/null
+++ b/src/LYGCurses.h
@@ -0,0 +1,246 @@
+#ifndef __CURSES_LOADED
+#define __CURSES_LOADED 1
+
+#include <ssdef.h>
+#include <stdio.h>
+#include <smgdef.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define reg register
+#ifndef TRUE
+#define TRUE (1)
+#define FALSE (0)
+#endif
+#define ERR (0)
+#define OK (1)
+#define _SUBWIN 0001
+#define _ENDLINE 0002
+#define _FULLWIN 0004
+#define _SCROLLWIN 0010
+#define _FLUSH 0020
+#define _STANDOUT 0200
+#define _NOECHO 001
+#define _NONL 002
+#define _NOCRMODE 004
+#define _NORAW 010
+#define _BLINK SMG$M_BLINK
+#define _BOLD SMG$M_BOLD
+#define _REVERSE SMG$M_REVERSE
+#define _UNDERLINE SMG$M_UNDERLINE
+ struct _win_st {
+ int _cur_y, _cur_x;
+ int _max_y, _max_x;
+ int _beg_y, _beg_x;
+ short _flags;
+ char _clear, _leave, _scroll, _wrap;
+ char **_y;
+ short *_firstch, *_lastch;
+ struct _win_st *_next, *_parent, *_child;
+ int _id;
+ };
+
+ struct _kb_st {
+ int _id;
+ unsigned char _flags;
+ struct {
+ unsigned short length;
+ unsigned char type;
+ unsigned char pclass;
+ char *address;
+ } _buffer_desc;
+ int _count;
+ char *_ptr;
+ };
+
+ struct _pb_st {
+ int _id;
+ int _rows, _cols;
+ union SMGDEF *_attr;
+ int _attr_size;
+ };
+
+#define _KEYBOARD struct _kb_st
+#define WINDOW struct _win_st
+#define _PASTEBOARD struct _pb_st
+
+ extern int LINES __asm("_$$PsectAttributes_NOSHR$$LINES");
+ extern int COLS __asm("_$$PsectAttributes_NOSHR$$COLS");
+ extern WINDOW *stdscr __asm("_$$PsectAttributes_NOSHR$$stdscr");
+ extern WINDOW *curscr __asm("_$$PsectAttributes_NOSHR$$curscr");
+ extern _KEYBOARD *stdkb __asm("_$$PsectAttributes_NOSHR$$stdkb");
+ extern _PASTEBOARD *stdpb __asm("_$$PsectAttributes_NOSHR$$stdpb");
+
+#define getch() wgetch (stdscr)
+#define addch(ch) waddch (stdscr, ch)
+#define addstr(string) waddstr (stdscr, string)
+#define move(y, x) wmove (stdscr, y, x)
+#define refresh() wrefresh (stdscr)
+#define clear() wclear (stdscr)
+#define clrtobot() wclrtobot (stdscr)
+#define clrtoeol() wclrtoeol (stdscr)
+#define delch() wdelch (stdscr)
+#define erase() werase (stdscr)
+#define insch(ch) winsch (stdscr, ch)
+#define insertln() winsertln (stdscr)
+#define standout() wstandout (stdscr)
+#define standend() wstandend (stdscr)
+#define getstr(string) wgetstr (stdscr, string)
+#define inch() winch (stdscr)
+#define setattr(attr) wsetattr (stdscr, attr)
+#define clrattr(attr) wclrattr (stdscr, attr)
+#define deleteln() wdeleteln (stdscr)
+#define insstr(string) winsstr (stdscr, string)
+
+#define mvwaddch(win,y,x,ch) (wmove(win,y,x)==ERR)?ERR:waddch(win,ch)
+#define mvwgetch(win,y,x) (wmove(win,y,x)==ERR)?ERR:wgetch(win)
+#define mvwaddstr(win,y,x,str) (wmove(win,y,x)==ERR)?ERR:waddstr(win,str)
+#define mvwinsstr(win,y,x,str) (wmove(win,y,x)==ERR)?ERR:winsstr(win,str)
+#define mvwgetstr(win,y,x,str) (wmove(win,y,x)==ERR)?ERR:wgetstr(win,str)
+#define mvwinch(win,y,x) (wmove(win,y,x)==ERR)?ERR:winch(win)
+#define mvwdelch(win,y,x) (wmove(win,y,x)==ERR)?ERR:wdelch(win)
+#define mvwinsch(win,y,x,ch) (wmove(win,y,x)==ERR)?ERR:winsch(win,ch)
+#define mvwdeleteln(win,y,x) (wmove(win,y,x)==ERR)?ERR:wdeleteln(win)
+#define mvaddch(y,x,ch) mvwaddch (stdscr, y, x, ch)
+#define mvgetch(y,x) mvwgetch (stdscr, y, x)
+#define mvaddstr(y,x,str) mvwaddstr (stdscr, y, x, str)
+#define mvinsstr(y,x,str) mvwinsstr (stdscr, y, x, str)
+#define mvgetstr(y,x,str) mvwgetstr (stdscr, y, x, str)
+#define mvinch(y,x) mvwinch (stdscr, y, x)
+#define mvdelch(y,x) mvwdelch (stdscr, y, x)
+#define mvinsch(y,x,ch) mvwinsch (stdscr, y, x, ch)
+#define mvdeleteln(y,x) mvwdeleteln (stdscr, y, x)
+#define mvcur(ly,lx,ny,nx) wmove (stdscr, ny, nx)
+#pragma standard
+
+#define clearok(win, bf) (win->_clear = bf)
+#define leaveok(win, bf) (win->_leave = bf)
+#define scrollok(win, bf) (win->_scroll = bf)
+#define wrapok(win, bf) (win->_wrap = bf)
+#define flushok(win,bf) (bf ? win->_flags |= _FLUSH : (win->_flags &= ~_FLUSH))
+#define getyx(win,y,x) y = win->_cur_y, x = win->_cur_x
+
+#define echo() (stdkb->_flags &= ~_NOECHO)
+#define noecho() (stdkb->_flags |= _NOECHO)
+#define nl() (stdkb->_flags &= ~_NONL)
+#define nonl() (stdkb->_flags |= _NONL)
+#define crmode() ((stdkb->_flags &= ~_NOCRMODE), nonl ())
+#define nocrmode() (stdkb->_flags |= _NOCRMODE)
+#define raw() (stdkb->_flags &= ~_NORAW)
+#define noraw() (stdkb->_flags |= _NORAW)
+
+#define check(status) if (!(status & SS$_NORMAL)) \
+ { c$$translate (status); \
+ return ERR; \
+ }
+
+#define bool int
+
+ int waddch(WINDOW * win, char ch);
+
+ int waddstr(WINDOW * win, char *str);
+
+ int box(WINDOW * win, char vert, char hor);
+
+ int wclear(WINDOW * win);
+
+ int wclrattr(WINDOW * win, int attr);
+
+ int wclrtobot(WINDOW * win);
+
+ int wclrtoeol(WINDOW * win);
+
+ int wdelch(WINDOW * win);
+
+ int wdeleteln(WINDOW * win);
+
+ int delwin(WINDOW * win);
+
+ int endwin(void);
+
+ int werase(WINDOW * win);
+
+ int wgetch(WINDOW * win);
+
+ int wgetstr(WINDOW * win, char *str);
+
+ char winch(WINDOW * win);
+
+ WINDOW *initscr(void);
+
+ int winsch(WINDOW * win, char ch);
+
+ int winsertln(WINDOW * win);
+
+ int winsstr(WINDOW * win, char *str);
+
+ int longname(char *termbuf, char *name);
+
+ int mvwin(WINDOW * win, int st_row, int st_col);
+
+ int wmove(WINDOW * win, int y, int x);
+
+ WINDOW *newwin(int numlines, int numcols, int begin_y, int begin_x);
+
+ int overlay(WINDOW * win1, WINDOW * win2);
+
+ int overwrite(WINDOW * win1, WINDOW * win2);
+
+#pragma NOSTANDARD
+#undef printw
+#undef wprintw
+#undef wscanw
+#undef scanw
+#pragma STANDARD
+
+ int printw(char *format_spec, ...);
+
+ int wprintw(WINDOW * win, char *format_spec, ...);
+
+ int wrefresh(WINDOW * win);
+
+ int wscanw(WINDOW * win, char *format_spec, ...);
+
+ int scanw(char *fmt, int arg1);
+
+ int scroll(WINDOW * win);
+
+ int wsetattr(WINDOW * win, int attr);
+
+ WINDOW *subwin(WINDOW * win, int numlines, int numcols,
+ int begin_y, int begin_x);
+
+ int wstandend(WINDOW * win);
+
+ int wstandout(WINDOW * win);
+
+ int touchwin(WINDOW * win);
+
+#if defined(CC$mixed_float) || defined(CC$VAXCSHR)
+
+#ifndef CC$gfloat
+#define CC$gfloat 0
+#endif
+
+#if CC$gfloat
+
+#define printw vaxc$gprintw
+#define scanw vaxc$gscanw
+#define wprintw vaxc$gwprintw
+#define wscanw vaxc$gwscanw
+
+#else
+
+#define printw vaxc$dprintw
+#define scanw vaxc$dscanw
+#define wprintw vaxc$dwprintw
+#define wscanw vaxc$dwscanw
+
+#endif
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* __CURSES_LOADED */
diff --git a/src/LYGetFile.c b/src/LYGetFile.c
new file mode 100644
index 0000000..22b43ce
--- /dev/null
+++ b/src/LYGetFile.c
@@ -0,0 +1,1569 @@
+/* $LynxId: LYGetFile.c,v 1.96 2018/04/01 15:27:18 tom Exp $ */
+#include <HTUtils.h>
+#include <HTTP.h>
+#include <HTAnchor.h> /* Anchor class */
+#include <HTAccess.h>
+#include <HTParse.h>
+#include <LYCurses.h>
+#include <GridText.h>
+#include <LYGlobalDefs.h>
+#include <LYUtils.h>
+#include <LYCharSets.h>
+#include <LYCharUtils.h>
+#include <HTAlert.h>
+#include <LYSignal.h>
+#include <LYGetFile.h>
+#include <LYPrint.h>
+#include <LYOptions.h>
+#include <LYStrings.h>
+#include <LYClean.h>
+#include <LYDownload.h>
+#include <LYNews.h>
+#include <LYMail.h>
+#include <LYKeymap.h>
+#include <LYBookmark.h>
+#include <LYMap.h>
+#include <LYList.h>
+#ifdef DIRED_SUPPORT
+#include <LYLocal.h>
+#endif /* DIRED_SUPPORT */
+#include <LYReadCFG.h>
+#include <LYHistory.h>
+#include <LYPrettySrc.h>
+
+#include <LYexit.h>
+#include <LYLeaks.h>
+
+static int fix_httplike_urls(DocInfo *doc, UrlTypes type);
+
+#ifdef VMS
+#define STRNADDRCOMP strncasecomp
+#else
+#define STRNADDRCOMP strncmp
+#endif /* !VMS */
+
+int HTNoDataOK = 0;
+
+/*
+ * getfile is the main mechanism to load a new document (or a previously loaded
+ * one whose rendering is cached in a HText structure) from mainloop, nearly
+ * everything goes through it.
+ * It should return one of the values
+ * NORMAL - requested document loaded successfully, usually [always?]
+ * its rendering is available as HTMainText. It can be an
+ * HTTP error message page or similar, we make no
+ * distinction here.
+ * NOT_FOUND - requested document cannot be accessed, and the reason
+ * is a real error (as may be caused by an invalid link),
+ * not just that lynx disallows access because of some
+ * permission restrictions, and we have no error page
+ * to show for it either.
+ * NULLFILE - requested document not loaded into HTMainText, either
+ * some interactive protocol was requested (like telnet),
+ * or lynx does not allow access.
+ * The distinction between NOT_FOUND and NULLFILE is not very crucial, but
+ * getting it right prevents mainloop from exiting with the wrong message if it
+ * happens for the first file, and from logging (or not logging) errors
+ * inappropriately with -traversal, and from sending bogus error mail with
+ * MAIL_SYSTEM_ERROR_LOGGING:TRUE. - kw
+ */
+int getfile(DocInfo *doc, int *target)
+{
+ UrlTypes url_type = NOT_A_URL_TYPE;
+ char *pound;
+ char *cp = NULL;
+ char *temp = NULL;
+ DocAddress WWWDoc; /* a WWW absolute doc address struct */
+
+ /*
+ * Reset LYCancelDownload to prevent unwanted delayed effect. - KW
+ */
+ if (LYCancelDownload) {
+ CTRACE((tfp, "getfile: resetting LYCancelDownload to FALSE\n"));
+ LYCancelDownload = FALSE;
+ }
+
+ /*
+ * Reset fake 'Z' to prevent unwanted delayed effect. - kw
+ */
+ LYFakeZap(NO);
+
+ /*
+ * Reset redirection counter to prevent bogus TOO_MANY_REDIRECTIONS in rare
+ * situations if the previous cycle got to the limit, but did not fail for
+ * that reason because the URL of the final location was handled specially,
+ * not via HTLoadAbsolute. - kw
+ */
+ redirection_attempts = 0;
+
+ Try_Redirected_URL:
+ /*
+ * Load the WWWDoc struct in case we need to use it.
+ */
+ WWWDoc.address = doc->address;
+ WWWDoc.post_data = doc->post_data;
+ WWWDoc.post_content_type = doc->post_content_type;
+ WWWDoc.bookmark = doc->bookmark;
+ WWWDoc.isHEAD = doc->isHEAD;
+ WWWDoc.safe = doc->safe;
+
+ /*
+ * Reset HTPermitRedir, it has done its job if it was set. - kw
+ */
+ HTPermitRedir = FALSE;
+
+ /*
+ * Reset WWW_Download_File just in case.
+ */
+ FREE(WWW_Download_File);
+
+ /*
+ * Reset redirect_post_content just in case.
+ */
+ redirect_post_content = FALSE;
+
+ /*
+ * This flag is a hack to allow us to pass on the fact that 'no data' may
+ * not really be an error although HTLoadAbsolute returned NO. There
+ * should be a better way... HT_NO_DATA should always mean 'not data but
+ * not an error', and be passed on to us as that, but current usage if
+ * HT_NO_DATA vs HT_NOT_LOADED has to be reviewed everywhere. Anyway, some
+ * protocol module can set it to say 'I really mean it', we have to reset
+ * it here. - kw
+ */
+ HTNoDataOK = 0;
+
+ CTRACE((tfp, "getfile: getting %s\n\n", doc->address));
+
+ /*
+ * Protect against denial of service attacks via the port 19 CHARGEN
+ * service, and block connections to the port 25 ESMTP service. Also
+ * reject any likely spoof attempts via wrap arounds at 65536. - FM
+ */
+ if ((temp = HTParse(doc->address, "", PARSE_HOST)) != NULL &&
+ strlen(temp) > 3) {
+ char *cp1;
+
+ if ((cp1 = StrChr(temp, '@')) == NULL)
+ cp1 = temp;
+ if ((cp = strrchr(cp1, ':')) != NULL) {
+ long int value;
+
+ cp++;
+ if (sscanf(cp, "%ld", &value) == 1) {
+ if (value == 19 || value == 65555) {
+ HTAlert(PORT_NINETEEN_INVALID);
+ FREE(temp);
+ return (NULLFILE);
+ } else if (value == 25 || value == 65561) {
+ HTAlert(PORT_TWENTYFIVE_INVALID);
+ FREE(temp);
+ return (NULLFILE);
+ } else if (value > 65535 || value < 0) {
+ char *msg = 0;
+
+ HTSprintf0(&msg, PORT_INVALID, (unsigned long) value);
+ HTAlert(msg);
+ FREE(msg);
+ FREE(temp);
+ return (NULLFILE);
+ }
+ } else if (isdigit(UCH(*cp))) {
+ HTAlert(URL_PORT_BAD);
+ FREE(temp);
+ return (NULLFILE);
+ }
+ }
+ }
+ cp = NULL;
+ FREE(temp);
+
+ /*
+ * Check to see if this is a universal document ID that lib WWW wants to
+ * handle.
+ *
+ * Some special URL's we handle ourselves. :)
+ */
+ if ((url_type = is_url(doc->address)) != 0) {
+ if (LYValidate && !LYPermitURL) {
+ if (!(url_type == HTTP_URL_TYPE ||
+ url_type == HTTPS_URL_TYPE ||
+ url_type == LYNXHIST_URL_TYPE ||
+ url_type == LYNXEDITMAP_URL_TYPE ||
+ url_type == LYNXKEYMAP_URL_TYPE ||
+ url_type == LYNXIMGMAP_URL_TYPE ||
+ url_type == LYNXCOOKIE_URL_TYPE ||
+#ifdef USE_CACHEJAR
+ url_type == LYNXCACHE_URL_TYPE ||
+#endif
+ url_type == LYNXMESSAGES_URL_TYPE ||
+ (url_type == LYNXOPTIONS_URL_TYPE &&
+ WWWDoc.post_data) ||
+ (non_empty(helpfilepath) &&
+ 0 == STRNADDRCOMP(WWWDoc.address, helpfilepath,
+ strlen(helpfilepath))) ||
+ (non_empty(lynxlistfile) &&
+ 0 == STRNADDRCOMP(WWWDoc.address, lynxlistfile,
+ strlen(lynxlistfile))) ||
+ (non_empty(lynxlinksfile) &&
+ 0 == STRNADDRCOMP(WWWDoc.address, lynxlinksfile,
+ strlen(lynxlinksfile))) ||
+ (non_empty(lynxjumpfile) &&
+ 0 == STRNADDRCOMP(WWWDoc.address, lynxjumpfile,
+ strlen(lynxjumpfile))))) {
+ HTUserMsg(NOT_HTTP_URL_OR_ACTION);
+ return (NULLFILE);
+ }
+ }
+ if (traversal) {
+ /*
+ * Only traverse http URLs.
+ */
+ if (url_type != HTTP_URL_TYPE &&
+ url_type != LYNXIMGMAP_URL_TYPE) {
+ return (NULLFILE);
+ }
+ } else if (check_realm && !LYPermitURL && !LYJumpFileURL) {
+ if (!(0 == StrNCmp(startrealm, WWWDoc.address,
+ strlen(startrealm)) ||
+ url_type == LYNXHIST_URL_TYPE ||
+ url_type == LYNXEDITMAP_URL_TYPE ||
+ url_type == LYNXKEYMAP_URL_TYPE ||
+ url_type == LYNXIMGMAP_URL_TYPE ||
+ url_type == LYNXCOOKIE_URL_TYPE ||
+#ifdef USE_CACHEJAR
+ url_type == LYNXCACHE_URL_TYPE ||
+#endif
+ url_type == LYNXPRINT_URL_TYPE ||
+ url_type == LYNXOPTIONS_URL_TYPE ||
+ url_type == LYNXCFG_URL_TYPE ||
+ url_type == LYNXCOMPILE_OPTS_URL_TYPE ||
+ url_type == LYNXMESSAGES_URL_TYPE ||
+ url_type == LYNXDOWNLOAD_URL_TYPE ||
+ url_type == MAILTO_URL_TYPE ||
+ url_type == NEWSPOST_URL_TYPE ||
+ url_type == NEWSREPLY_URL_TYPE ||
+ url_type == SNEWSPOST_URL_TYPE ||
+ url_type == SNEWSREPLY_URL_TYPE ||
+ (!LYUserSpecifiedURL &&
+ (url_type == LYNXEXEC_URL_TYPE ||
+ url_type == LYNXPROG_URL_TYPE ||
+ url_type == LYNXCGI_URL_TYPE)) ||
+ (WWWDoc.bookmark != NULL &&
+ *WWWDoc.bookmark != '\0') ||
+ 0 == STRNADDRCOMP(WWWDoc.address, helpfilepath,
+ strlen(helpfilepath)) ||
+ (lynxlistfile != NULL &&
+ 0 == STRNADDRCOMP(WWWDoc.address, lynxlistfile,
+ strlen(lynxlistfile))) ||
+ (lynxjumpfile != NULL &&
+ 0 == STRNADDRCOMP(WWWDoc.address, lynxjumpfile,
+ strlen(lynxjumpfile))))) {
+ HTUserMsg(NOT_IN_STARTING_REALM);
+ return (NULLFILE);
+ }
+ }
+ if (WWWDoc.post_data &&
+ url_type != HTTP_URL_TYPE &&
+ url_type != HTTPS_URL_TYPE &&
+ url_type != LYNXCGI_URL_TYPE &&
+ url_type != LYNXIMGMAP_URL_TYPE &&
+ url_type != GOPHER_URL_TYPE &&
+ url_type != CSO_URL_TYPE &&
+ url_type != PROXY_URL_TYPE &&
+ url_type != LYNXOPTIONS_URL_TYPE &&
+ !(url_type == FILE_URL_TYPE &&
+ (LYIsUIPage(WWWDoc.address, UIP_LIST_PAGE) ||
+ LYIsUIPage(WWWDoc.address, UIP_ADDRLIST_PAGE)))) {
+ CTRACE((tfp, "getfile: dropping post_data!\n"));
+ HTAlert(IGNORED_POST);
+ LYFreePostData(doc);
+ WWWDoc.post_data = NULL;
+ WWWDoc.post_content_type = NULL;
+ }
+#ifdef SYSLOG_REQUESTED_URLS
+ LYSyslog(doc->address);
+#endif
+ if (url_type == UNKNOWN_URL_TYPE ||
+ url_type == AFS_URL_TYPE ||
+ url_type == PROSPERO_URL_TYPE) {
+ HTAlert(UNSUPPORTED_URL_SCHEME);
+ return (NULLFILE);
+
+ } else if (url_type == DATA_URL_TYPE) {
+ HTAlert(UNSUPPORTED_DATA_URL);
+ return (NULLFILE);
+
+ } else if (url_type == LYNXPRINT_URL_TYPE) {
+ return (printfile(doc));
+
+#ifndef NO_OPTION_FORMS
+ } else if (url_type == LYNXOPTIONS_URL_TYPE) {
+ /* proceed forms-based options menu */
+ return (postoptions(doc));
+#endif
+
+ } else if (url_type == LYNXCFG_URL_TYPE &&
+ !no_lynxcfg_info) {
+ /* @@@ maybe we should generate a specific error message
+ if attempted but restricted. - kw */
+ /* show/change/reload lynx.cfg settings */
+ return (lynx_cfg_infopage(doc));
+
+#if defined(HAVE_CONFIG_H) && !defined(NO_CONFIG_INFO)
+ } else if (url_type == LYNXCOMPILE_OPTS_URL_TYPE &&
+ !no_compileopts_info) {
+ /* @@@ maybe we should generate a specific error message
+ if attempted but restricted or not supported. - kw */
+ /* show compile-time settings */
+ return (lynx_compile_opts(doc));
+#endif
+
+#ifndef DISABLE_NEWS
+ } else if (url_type == NEWSPOST_URL_TYPE ||
+ url_type == NEWSREPLY_URL_TYPE ||
+ url_type == SNEWSPOST_URL_TYPE ||
+ url_type == SNEWSREPLY_URL_TYPE) {
+
+ if (no_newspost) {
+ HTUserMsg(NEWSPOSTING_DISABLED);
+ return (NULLFILE);
+ } else if (!news_ok && (url_type == NEWSPOST_URL_TYPE ||
+ url_type == NEWSREPLY_URL_TYPE)) {
+ HTUserMsg(NEWS_DISABLED);
+ return (NULLFILE);
+ } else {
+ HTLoadAbsolute(&WWWDoc);
+ return (NULLFILE);
+ }
+#endif
+
+ } else if (url_type == LYNXDOWNLOAD_URL_TYPE) {
+ LYDownload(doc->address);
+#ifdef VMS
+ if (LYDidRename) {
+ /*
+ * The temporary file was saved to disk via a rename(), so we
+ * can't access the temporary file again via the download menu.
+ * Clear the flag, and return NULLFILE to pop. - FM
+ */
+ LYDidRename = FALSE;
+ return (NULLFILE);
+ }
+#endif /* VMS */
+ return (NORMAL);
+ } else if (url_type == LYNXDIRED_URL_TYPE) {
+#ifdef DIRED_SUPPORT
+ if (!no_dired_support) {
+ local_dired(doc);
+ WWWDoc.address = doc->address;
+ WWWDoc.post_data = doc->post_data;
+ WWWDoc.post_content_type = doc->post_content_type;
+ WWWDoc.bookmark = doc->bookmark;
+ WWWDoc.isHEAD = doc->isHEAD;
+ WWWDoc.safe = doc->safe;
+
+ if (!HTLoadAbsolute(&WWWDoc)) {
+ return (NOT_FOUND);
+ }
+ return (NORMAL);
+ }
+#endif /* DIRED_SUPPORT */
+ HTUserMsg(DIRED_DISABLED);
+ return (NULLFILE);
+ }
+
+ if (LYNoRefererHeader == FALSE &&
+ LYNoRefererForThis == FALSE) {
+ const char *ref_url = HTLoadedDocumentURL();
+
+ if (isLYNXIMGMAP(ref_url))
+ ref_url += LEN_LYNXIMGMAP;
+ if (no_filereferer == TRUE && isFILE_URL(ref_url)) {
+ LYNoRefererForThis = TRUE;
+ }
+ if (LYNoRefererForThis == FALSE &&
+ (cp = StrChr(ref_url, '?')) != NULL &&
+ StrChr(cp, '=') != NULL) {
+ /*
+ * Don't send a Referer header if the URL is the reply from a
+ * form with method GET, in case the content has personal data
+ * (e.g., a password or credit card number) which would become
+ * visible in logs. - FM
+ *
+ * Changed 1999-11-01 to be controlled by REFERER_WITH_QUERY
+ * option. - kw
+ */
+ if (LYRefererWithQuery == 'S') { /* SEND */
+ StrAllocCopy(LYRequestReferer, ref_url);
+ } else if (LYRefererWithQuery == 'P') { /* PARTIAL */
+ FREE(LYRequestReferer); /* just to be sure */
+ LYRequestReferer = HTParse(ref_url, "",
+ PARSE_ACCESS
+ | PARSE_HOST
+ | PARSE_STRICTPATH
+ | PARSE_PUNCTUATION);
+ } else { /* Everything else - don't send Referer */
+ LYNoRefererForThis = TRUE;
+ }
+ cp = NULL;
+ } else if (LYNoRefererForThis == FALSE) {
+ StrAllocCopy(LYRequestReferer, ref_url);
+ }
+ } else {
+ StrAllocCopy(LYRequestReferer, HTLoadedDocumentURL());
+ }
+ if (url_type == LYNXHIST_URL_TYPE) {
+ /*
+ * 'doc' will change to the new file if we had a successful
+ * LYpop_num(), and the return value will be FALSE if we had a
+ * cancel. - FM
+ */
+ if ((historytarget(doc) == FALSE) ||
+ !doc || !doc->address) {
+ return (NOT_FOUND);
+ }
+
+ /*
+ * We changed it so reload.
+ */
+ WWWDoc.address = doc->address;
+ WWWDoc.post_data = doc->post_data;
+ WWWDoc.post_content_type = doc->post_content_type;
+ WWWDoc.bookmark = doc->bookmark;
+ WWWDoc.isHEAD = doc->isHEAD;
+ WWWDoc.safe = doc->safe;
+ if (track_internal_links && doc->internal_link && !reloading) {
+ LYinternal_flag = TRUE;
+ }
+#ifdef DIRED_SUPPORT
+ lynx_edit_mode = FALSE;
+#endif /* DIRED_SUPPORT */
+ if (!HTLoadAbsolute(&WWWDoc)) {
+ return (NOT_FOUND);
+ }
+ return (NORMAL);
+
+ } else if (url_type == LYNXEXEC_URL_TYPE ||
+ url_type == LYNXPROG_URL_TYPE) {
+#ifdef EXEC_LINKS
+ if (no_exec &&
+ !exec_ok(HTLoadedDocumentURL(),
+ doc->address + 9, ALWAYS_EXEC_PATH)) {
+ HTUserMsg(EXECUTION_DISABLED);
+ } else if (no_bookmark_exec &&
+ HTLoadedDocumentBookmark()) {
+ HTUserMsg(BOOKMARK_EXEC_DISABLED);
+ } else if (local_exec || (local_exec_on_local_files &&
+ exec_ok(HTLoadedDocumentURL(),
+ doc->address + 9, EXEC_PATH))) {
+
+ char *p = NULL;
+
+ /*
+ * Bug puts slash on end if none is in the string.
+ */
+ char *last_slash = strrchr(doc->address, '/');
+
+ if (last_slash - doc->address
+ == (int) strlen(doc->address) - 1)
+ doc->address[strlen(doc->address) - 1] = '\0';
+
+ /*
+ * Convert '~' to $HOME.
+ */
+ StrAllocCopy(p, doc->address);
+ LYTildeExpand(&p, TRUE);
+
+ /*
+ * Show URL before executing it.
+ */
+ HTInfoMsg(doc->address);
+ stop_curses();
+ /*
+ * Run the command.
+ */
+ if (strstr(p, "//") == p + 9)
+ LYSystem(p + 11);
+ else
+ LYSystem(p + 9);
+ FREE(p);
+
+ if (url_type != LYNXPROG_URL_TYPE) {
+ /*
+ * Make sure user gets to see screen output.
+ */
+#ifndef VMS
+ signal(SIGINT, SIG_IGN);
+#endif /* !VMS */
+ printf("\n%s", RETURN_TO_LYNX);
+ fflush(stdout);
+ (void) LYgetch();
+#ifdef VMS
+ HadVMSInterrupt = FALSE;
+#endif /* VMS */
+ }
+ if (!dump_output_immediately) {
+ start_curses();
+ LYAddVisitedLink(doc);
+ }
+
+ } else {
+ char *buf = 0;
+
+ HTSprintf0(&buf,
+ EXECUTION_DISABLED_FOR_FILE,
+ key_for_func(LYK_OPTIONS));
+ HTAlert(buf);
+ FREE(buf);
+ }
+#else /* no exec_links */
+ HTUserMsg(EXECUTION_NOT_COMPILED);
+#endif /* EXEC_LINKS */
+ return (NULLFILE);
+
+ } else if (url_type == MAILTO_URL_TYPE) {
+ if (no_mail) {
+ HTUserMsg(MAIL_DISABLED);
+ } else if (!dump_output_immediately) {
+ HTParentAnchor *tmpanchor = HTAnchor_findAddress(&WWWDoc);
+ const char *title;
+ char *tmptitle = NULL;
+
+ title = "";
+ if (HTAnchor_title(tmpanchor)) {
+ title = HTAnchor_title(tmpanchor);
+ } else if (HTMainAnchor && !LYUserSpecifiedURL) {
+ title = HTAnchor_subject(HTMainAnchor);
+ if (non_empty(title)) {
+ if (strncasecomp(title, "Re:", 3)) {
+ StrAllocCopy(tmptitle, "Re: ");
+ StrAllocCat(tmptitle, title);
+ title = tmptitle;
+ }
+ } else {
+ title = "";
+ }
+ }
+ cp = StrChr(doc->address, ':') + 1;
+ reply_by_mail(cp,
+ ((HTMainAnchor && !LYUserSpecifiedURL)
+ ? (char *) HTMainAnchor->address
+ : (char *) doc->address),
+ title,
+ (HTMainAnchor && !LYUserSpecifiedURL)
+ ? HTMainAnchor->message_id
+ : NULL);
+ FREE(tmptitle);
+ }
+ return (NULLFILE);
+
+ /*
+ * From here on we could have a remote host, so check if that's
+ * allowed.
+ */
+ } else if (local_host_only &&
+ url_type != LYNXEDITMAP_URL_TYPE &&
+ url_type != LYNXKEYMAP_URL_TYPE &&
+ url_type != LYNXIMGMAP_URL_TYPE &&
+ url_type != LYNXCOOKIE_URL_TYPE &&
+ url_type != LYNXMESSAGES_URL_TYPE &&
+#ifdef USE_CACHEJAR
+ url_type != LYNXCACHE_URL_TYPE &&
+#endif
+ url_type != LYNXCGI_URL_TYPE &&
+ !(url_type == NEWS_URL_TYPE &&
+ StrNCmp(doc->address, "news://", 7)) &&
+ !(LYisLocalHost(doc->address) ||
+ LYisLocalAlias(doc->address))) {
+ HTUserMsg(ACCESS_ONLY_LOCALHOST);
+ return (NULLFILE);
+
+ /*
+ * Disable www telnet access if not telnet_ok.
+ */
+ } else if (url_type == TELNET_URL_TYPE ||
+ url_type == TN3270_URL_TYPE ||
+ url_type == TELNET_GOPHER_URL_TYPE) {
+ char *proxy;
+
+ if (!telnet_ok) {
+ HTUserMsg(TELNET_DISABLED);
+ return (NULLFILE);
+ } else if (no_telnet_port && StrChr(doc->address + 7, ':')) {
+ HTUserMsg(TELNET_PORT_SPECS_DISABLED);
+ return (NULLFILE);
+ /*
+ * Detect weird case where interactive protocol would be
+ * proxied, and to a non-interactive protocol at that.
+ */
+ } else if ((proxy = LYGetEnv(((url_type == TN3270_URL_TYPE)
+ ? "tn3270_proxy"
+ :
+ ((url_type == TELNET_GOPHER_URL_TYPE)
+ ? "gopher_proxy"
+ : "telnet_proxy")))) != NULL &&
+ !override_proxy(doc->address) &&
+ (!isTELNET_URL(proxy) &&
+ !isTN3270_URL(proxy) &&
+ !isRLOGIN_URL(proxy))) {
+ /* Do nothing, fall through to generic code - kw */
+ } else {
+ stop_curses();
+ HTLoadAbsolute(&WWWDoc);
+ if (!dump_output_immediately) {
+ start_curses();
+ fflush(stdout);
+ LYAddVisitedLink(doc);
+ }
+ return (NULLFILE);
+ }
+
+ /*
+ * Disable www news access if not news_ok.
+ */
+#ifndef DISABLE_NEWS
+ } else if (!news_ok && (url_type == NEWS_URL_TYPE ||
+ url_type == NNTP_URL_TYPE)) {
+ HTUserMsg(NEWS_DISABLED);
+ return (NULLFILE);
+#endif
+
+ } else if (url_type == RLOGIN_URL_TYPE) {
+ char *proxy;
+
+ if (!rlogin_ok) {
+ HTUserMsg(RLOGIN_DISABLED);
+ return (NULLFILE);
+ /*
+ * Detect weird case where interactive protocol would be
+ * proxied, and to a non-interactive protocol at that.
+ */
+ } else if ((proxy = LYGetEnv("rlogin_proxy")) != NULL &&
+ !override_proxy(doc->address) &&
+ (!isTELNET_URL(proxy) &&
+ !isTN3270_URL(proxy) &&
+ !isRLOGIN_URL(proxy))) {
+ /* Do nothing, fall through to generic code - kw */
+ } else {
+ stop_curses();
+ HTLoadAbsolute(&WWWDoc);
+ fflush(stdout);
+ if (!dump_output_immediately) {
+ start_curses();
+ LYAddVisitedLink(doc);
+ }
+ return (NULLFILE);
+ }
+
+ /*
+ * If it's a gopher index type and there isn't a search term
+ * already attached then do this. Otherwise just load it!
+ */
+ } else if (url_type == INDEX_GOPHER_URL_TYPE &&
+ StrChr(doc->address, '?') == NULL) {
+ int status;
+
+ /*
+ * Make sure we don't have a gopher+ escaped tab instead of a
+ * gopher0 question mark delimiting the search term. - FM
+ */
+ if ((cp = strstr(doc->address, "%09")) != NULL) {
+ *cp = '\0';
+ StrAllocCopy(temp, doc->address);
+ cp += 3;
+ if (*cp && StrNCmp(cp, "%09", 3)) {
+ StrAllocCat(temp, "?");
+ StrAllocCat(temp, cp);
+ if ((cp = strstr(temp, "%09")) != NULL) {
+ *cp = '\0';
+ }
+ }
+ StrAllocCopy(doc->address, temp);
+ FREE(temp);
+ goto Try_Redirected_URL;
+ }
+ /*
+ * Load it because the do_www_search routine uses the base url of
+ * the currently loaded document :(
+ */
+ if (!HTLoadAbsolute(&WWWDoc)) {
+ return (NOT_FOUND);
+ }
+ status = do_www_search(doc);
+ if (status == NULLFILE) {
+ LYpop(doc);
+ WWWDoc.address = doc->address;
+ WWWDoc.post_data = doc->post_data;
+ WWWDoc.post_content_type = doc->post_content_type;
+ WWWDoc.bookmark = doc->bookmark;
+ WWWDoc.isHEAD = doc->isHEAD;
+ WWWDoc.safe = doc->safe;
+ status = HTLoadAbsolute(&WWWDoc);
+#ifdef DIRED_SUPPORT
+ } else {
+ lynx_edit_mode = FALSE;
+#endif /* DIRED_SUPPORT */
+ }
+ return (status);
+ }
+
+ if (!ftp_ok
+ && (url_type == FTP_URL_TYPE
+ || url_type == NCFTP_URL_TYPE)) {
+ HTUserMsg(FTP_DISABLED);
+ return (NULLFILE);
+ } else if (url_type == HTML_GOPHER_URL_TYPE) {
+ char *tmp = NULL;
+
+ /*
+ * If tuple's Path=GET%20/... convert to an http URL.
+ */
+ if ((cp = StrChr(doc->address + 9, '/')) != NULL &&
+ 0 == StrNCmp(++cp, "hGET%20/", 8)) {
+ StrAllocCopy(tmp, "http://");
+ CTRACE((tfp, "getfile: URL '%s'\n",
+ doc->address));
+ *cp = '\0';
+ StrAllocCat(tmp, doc->address + 9);
+ /*
+ * If the port is defaulted, it should stay 70.
+ */
+ if (StrChr(tmp + 6, ':') == NULL) {
+ StrAllocCat(tmp, "70/");
+ tmp[strlen(tmp) - 4] = ':';
+ }
+ if (strlen(cp + 7) > 1)
+ StrAllocCat(tmp, cp + 8);
+ StrAllocCopy(doc->address, tmp);
+ CTRACE((tfp, " changed to '%s'\n",
+ doc->address));
+ FREE(tmp);
+ url_type = HTTP_URL_TYPE;
+ }
+ }
+
+ if (url_type == HTTP_URL_TYPE ||
+ url_type == HTTPS_URL_TYPE ||
+ url_type == FTP_URL_TYPE ||
+ url_type == NCFTP_URL_TYPE ||
+ url_type == CSO_URL_TYPE) {
+ fix_httplike_urls(doc, url_type);
+ }
+
+ WWWDoc.address = doc->address; /* possible reload */
+#ifdef DIRED_SUPPORT
+ lynx_edit_mode = FALSE;
+#endif /* DIRED_SUPPORT */
+
+#ifndef DISABLE_BIBP
+ if (url_type == BIBP_URL_TYPE) {
+ char *bibpTmp = NULL;
+
+ if (!BibP_bibhost_checked)
+ LYCheckBibHost();
+ if (BibP_bibhost_available) {
+ StrAllocCopy(bibpTmp, BibP_bibhost);
+ } else if (HTMainAnchor && HTAnchor_citehost(HTMainAnchor)) {
+ StrAllocCopy(bibpTmp, HTAnchor_citehost(HTMainAnchor));
+ } else {
+ StrAllocCopy(bibpTmp, BibP_globalserver);
+ }
+ if (HTMainAnchor && HTAnchor_citehost(HTMainAnchor)) {
+ StrAllocCat(bibpTmp, "bibp1.0/resolve?citehost=");
+ StrAllocCat(bibpTmp, HTAnchor_citehost(HTMainAnchor));
+ StrAllocCat(bibpTmp, "&usin=");
+ } else {
+ StrAllocCat(bibpTmp, "bibp1.0/resolve?usin=");
+ }
+ StrAllocCat(bibpTmp, doc->address + 5); /* USIN after bibp: */
+ StrAllocCopy(doc->address, bibpTmp);
+ WWWDoc.address = doc->address;
+ FREE(bibpTmp);
+ }
+#endif /* !DISABLE_BIBP */
+
+ if (url_type == FILE_URL_TYPE) {
+ /*
+ * If a file URL has a '~' as the lead character of its first
+ * symbolic element, convert the '~' to Home_Dir(), then append
+ * the rest of of path, if present, skipping "user" if "~user"
+ * was entered, simplifying, and eliminating any residual
+ * relative elements. - FM
+ */
+ LYTildeExpand(&(doc->address), TRUE);
+ WWWDoc.address = doc->address;
+ }
+ CTRACE_SLEEP(MessageSecs);
+ user_message(WWW_WAIT_MESSAGE, doc->address);
+
+ if (TRACE) {
+#ifdef USE_SLANG
+ if (LYCursesON) {
+ LYaddstr("*\n");
+ LYrefresh();
+ }
+#endif /* USE_SLANG */
+ CTRACE((tfp, "\n"));
+ }
+
+ if (!HTLoadAbsolute(&WWWDoc)) {
+ /*
+ * Check for redirection.
+ */
+ if (use_this_url_instead != NULL) {
+ if (!is_url(use_this_url_instead)) {
+ /*
+ * The server did not return a complete URL in its
+ * Location: header, probably due to a FORM or other
+ * CGI script written by someone who doesn't know that
+ * the http protocol requires that it be a complete
+ * URL, or using a server which does not treat such a
+ * redirect string from the script as an instruction to
+ * resolve it versus the initial request, check
+ * authentication with that URL, and then act on it
+ * without returning redirection to us. We'll violate
+ * the http protocol and resolve it ourselves using the
+ * URL of the original request as the BASE, rather than
+ * doing the RIGHT thing and returning an invalid
+ * address message. - FM
+ */
+ HTUserMsg(LOCATION_NOT_ABSOLUTE);
+ temp = HTParse(use_this_url_instead,
+ WWWDoc.address,
+ PARSE_ALL);
+ if (non_empty(temp)) {
+ StrAllocCopy(use_this_url_instead, temp);
+ }
+ FREE(temp);
+ }
+ url_type = is_url(use_this_url_instead);
+ if (!HTPermitRedir &&
+ (url_type == LYNXDOWNLOAD_URL_TYPE ||
+ url_type == LYNXEXEC_URL_TYPE ||
+ url_type == LYNXPROG_URL_TYPE ||
+#ifdef DIRED_SUPPORT
+ url_type == LYNXDIRED_URL_TYPE ||
+#endif /* DIRED_SUPPORT */
+ url_type == LYNXPRINT_URL_TYPE ||
+ url_type == LYNXOPTIONS_URL_TYPE ||
+ url_type == LYNXCFG_URL_TYPE ||
+ url_type == LYNXCOMPILE_OPTS_URL_TYPE ||
+ url_type == LYNXHIST_URL_TYPE ||
+ url_type == LYNXCOOKIE_URL_TYPE ||
+#ifdef USE_CACHEJAR
+ url_type == LYNXCACHE_URL_TYPE ||
+#endif
+ url_type == LYNXMESSAGES_URL_TYPE ||
+ (LYValidate &&
+ url_type != HTTP_URL_TYPE &&
+ url_type != HTTPS_URL_TYPE) ||
+ ((no_file_url || no_goto_file) &&
+ url_type == FILE_URL_TYPE) ||
+ (no_goto_lynxcgi &&
+ url_type == LYNXCGI_URL_TYPE) ||
+#ifndef DISABLE_BIBP
+ (no_goto_bibp &&
+ url_type == BIBP_URL_TYPE) ||
+#endif
+ (no_goto_cso &&
+ url_type == CSO_URL_TYPE) ||
+ (no_goto_finger &&
+ url_type == FINGER_URL_TYPE) ||
+ (no_goto_ftp &&
+ (url_type == FTP_URL_TYPE ||
+ url_type == NCFTP_URL_TYPE)) ||
+ (no_goto_gopher &&
+ url_type == GOPHER_URL_TYPE) ||
+ (no_goto_http &&
+ url_type == HTTP_URL_TYPE) ||
+ (no_goto_https &&
+ url_type == HTTPS_URL_TYPE) ||
+ (no_goto_mailto &&
+ url_type == MAILTO_URL_TYPE) ||
+#ifndef DISABLE_NEWS
+ (no_goto_news &&
+ url_type == NEWS_URL_TYPE) ||
+ (no_goto_nntp &&
+ url_type == NNTP_URL_TYPE) ||
+#endif
+ (no_goto_rlogin &&
+ url_type == RLOGIN_URL_TYPE) ||
+#ifndef DISABLE_NEWS
+ (no_goto_snews &&
+ url_type == SNEWS_URL_TYPE) ||
+#endif
+ (no_goto_telnet &&
+ url_type == TELNET_URL_TYPE) ||
+ (no_goto_tn3270 &&
+ url_type == TN3270_URL_TYPE) ||
+ (no_goto_wais &&
+ url_type == WAIS_URL_TYPE))) {
+ /*
+ * Some schemes are not acceptable from server
+ * redirections. - KW & FM
+ */
+ HTAlert(ILLEGAL_REDIRECTION_URL);
+ if (LYCursesON) {
+ HTUserMsg2(WWW_ILLEGAL_URL_MESSAGE,
+ use_this_url_instead);
+ } else {
+ fprintf(stderr,
+ WWW_ILLEGAL_URL_MESSAGE,
+ use_this_url_instead);
+ }
+ FREE(use_this_url_instead);
+ return (NULLFILE);
+ }
+ if ((pound = findPoundSelector(doc->address)) != NULL
+ && findPoundSelector(use_this_url_instead) == NULL) {
+ /*
+ * Our requested URL had a fragment associated with it,
+ * and the redirection URL doesn't, so we'll append the
+ * fragment associated with the original request. If
+ * it's bogus for the redirection URL, we'll be
+ * positioned at the top of that document, so there's
+ * no harm done. - FM
+ */
+ CTRACE((tfp,
+ "getfile: Adding fragment '%s' to redirection URL.\n",
+ pound));
+ StrAllocCat(use_this_url_instead, pound);
+ doc->link = -1;
+ }
+ CTRACE_SLEEP(MessageSecs);
+ HTUserMsg2(WWW_USING_MESSAGE, use_this_url_instead);
+ CTRACE((tfp, "\n"));
+ StrAllocCopy(doc->address,
+ use_this_url_instead);
+ FREE(use_this_url_instead);
+ if (redirect_post_content == FALSE) {
+ /*
+ * Freeing the content also yields a GET request. - FM
+ */
+ LYFreePostData(doc);
+ }
+ /*
+ * Go to top to check for URL's which get special handling
+ * and/or security checks in Lynx. - FM
+ */
+ goto Try_Redirected_URL;
+ }
+ if (HTNoDataOK) {
+ return (NULLFILE);
+ } else {
+ return (NOT_FOUND);
+ }
+ } else {
+
+ lynx_mode = NORMAL_LYNX_MODE;
+
+ /*
+ * Some URL's don't actually return a document; compare
+ * doc->address with the document that is actually loaded and
+ * return NULLFILE if not loaded. If www_search_result is not -1
+ * then this is a reference to a named anchor within the same
+ * document; do NOT return NULLFILE in that case.
+ */
+
+ /*
+ * Check for a #fragment selector.
+ */
+ pound = findPoundSelector(doc->address);
+
+ /*
+ * Check to see if there is a temp file waiting for us to
+ * download.
+ */
+ if (WWW_Download_File) {
+ HTParentAnchor *tmpanchor = HTAnchor_findAddress(&WWWDoc);
+ char *fname = NULL;
+
+ /*
+ * Check for a suggested filename from the
+ * Content-Disposition header. - FM
+ */
+ if (HTAnchor_SugFname(tmpanchor) != NULL) {
+ StrAllocCopy(fname, HTAnchor_SugFname(tmpanchor));
+ } else {
+ StrAllocCopy(fname, doc->address);
+ }
+ /*
+ * Check whether this is a compressed file, which we don't
+ * uncompress for downloads, and adjust any suffix
+ * appropriately. - FM
+ */
+ HTCheckFnameForCompression(&fname, tmpanchor, FALSE);
+
+ if (LYdownload_options(&fname,
+ WWW_Download_File) < 0) {
+ FREE(fname);
+ return (NOT_FOUND);
+ }
+ LYAddVisitedLink(doc);
+ StrAllocCopy(doc->address, fname);
+ FREE(fname);
+ doc->internal_link = FALSE;
+ WWWDoc.address = doc->address;
+ LYFreePostData(doc);
+ WWWDoc.post_data = NULL;
+ WWWDoc.post_content_type = NULL;
+ WWWDoc.bookmark = doc->bookmark = FALSE;
+ WWWDoc.isHEAD = doc->isHEAD = FALSE;
+ WWWDoc.safe = doc->safe = FALSE;
+ HTOutputFormat = WWW_PRESENT;
+ if (!HTLoadAbsolute(&WWWDoc)) {
+ return (NOT_FOUND);
+ } else {
+ return (NORMAL);
+ }
+
+ } else if (pound == NULL &&
+ /*
+ * HTAnchor hash-table searches are now case-sensitive
+ * (hopefully, without anchor deletion problems), so this
+ * is too. - FM
+ */
+ (strcmp(doc->address,
+ HTLoadedDocumentURL()) ||
+ /*
+ * Also check the post_data elements. - FM
+ */
+ !BINEQ(doc->post_data,
+ HTLoadedDocumentPost_data()) ||
+ /*
+ * Also check the isHEAD element. - FM
+ */
+ doc->isHEAD != HTLoadedDocumentIsHEAD())) {
+ /*
+ * Nothing needed to be shown.
+ */
+ LYAddVisitedLink(doc);
+ return (NULLFILE);
+
+ } else {
+ if (pound != NULL) {
+ if (!HTMainText) { /* this should not happen... */
+ return (NULLFILE); /* but it can. - kw */
+ }
+ /*
+ * May set www_search_result.
+ */
+ if (HTFindPoundSelector(pound + 1)) {
+ *target = www_search_result;
+ doc->link = -1;
+ }
+ }
+ return (NORMAL);
+ }
+ }
+ } else {
+ CTRACE_SLEEP(MessageSecs);
+ HTUserMsg2(WWW_BAD_ADDR_MESSAGE, doc->address);
+ CTRACE((tfp, "\n"));
+ return (NULLFILE);
+ }
+}
+
+/*
+ * Set source mode for the next retrieval via getfile or HTreparse_document.
+ * mode == -1: force normal presentation
+ * mode == 1: force source presentation
+ * mode == 0: reset to normal if it was set to source
+ * - kw
+ */
+void srcmode_for_next_retrieval(int mode)
+{
+ if (mode < 0) {
+ HTOutputFormat = WWW_PRESENT;
+#ifdef USE_PRETTYSRC
+ psrc_view = FALSE;
+#endif
+
+ } else if (mode == 0) {
+ if (HTOutputFormat == WWW_SOURCE)
+ HTOutputFormat = WWW_PRESENT;
+#ifdef USE_PRETTYSRC
+ else if (LYpsrc)
+ psrc_view = FALSE;
+#endif
+
+ } else {
+#ifdef USE_PRETTYSRC
+ if (LYpsrc)
+ psrc_view = TRUE;
+ else
+ HTOutputFormat = WWW_SOURCE;
+#else
+ HTOutputFormat = WWW_SOURCE;
+#endif
+ }
+}
+
+/*
+ * The user wants to select a link or page by number.
+ *
+ * If follow_link_number returns DO_LINK_STUFF do_link will be run immediately
+ * following its execution.
+ *
+ * If follow_link_number returns DO_GOTOLINK_STUFF it has updated the passed in
+ * doc for positioning on a link.
+ *
+ * If follow_link_number returns DO_GOTOPAGE_STUFF it has set doc->line to the
+ * top line of the desired page for displaying that page.
+ *
+ * If follow_link_number returns PRINT_ERROR an error message will be given to
+ * the user.
+ *
+ * If follow_link_number returns DO_FORMS_STUFF some forms stuff will be done.
+ * (Not yet implemented.)
+ *
+ * If follow_link_number returns DO_NOTHING nothing special will run after it.
+ */
+int follow_link_number(int c,
+ int cur,
+ DocInfo *doc,
+ int *num)
+{
+ bstring *temp = NULL;
+ char *p;
+ int rel = 0;
+ int new_top, new_link;
+ BOOL want_go;
+ int curline = *num; /* passed in from mainloop() */
+ int code;
+
+ CTRACE((tfp, "follow_link_number(%d,%d,...)\n", c, cur));
+ BStrCopy0(temp, "?");
+ temp->str[0] = (char) c;
+ *num = -1;
+ _statusline(FOLLOW_LINK_NUMBER);
+
+ /*
+ * Get the number, possibly with a letter suffix, from the user.
+ */
+ if (LYgetBString(&temp, FALSE, 120, NORECALL) < 0 ||
+ isBEmpty(temp)) {
+ HTInfoMsg(CANCELLED);
+ return (DO_NOTHING);
+ }
+
+ p = temp->str;
+ *num = atoi(p);
+ while (isdigit(UCH(*p)))
+ ++p;
+ c = *p; /* reuse c; 0 or g or p or + or - */
+ switch (c) {
+ case '+':
+ case '-':
+ /* 123+ or 123- */
+ rel = c;
+ c = *++p;
+ break;
+ default:
+ rel = *++p;
+ break;
+ case 0:
+ break;
+ }
+ /* don't currently check for errors typing suffix */
+
+ CTRACE((tfp, " temp=%s, *num=%d, rel='%c'\n", temp->str, *num, rel));
+ /*
+ * Check if we had a 'p' or 'P' following the number as a flag for
+ * displaying the page with that number. - FM
+ */
+ if ((c == 'p' || c == 'P') && display_lines == 0) {
+ CTRACE((tfp, " curline=%d, LYlines=%d, display too small!\n",
+ curline, LYlines));
+ code = PRINT_ERROR;
+ } else if (c == 'p' || c == 'P') {
+ int nlines = HText_getNumOfLines();
+ int npages = (((nlines + 1) > display_lines)
+ ? (((nlines + 1) + (display_lines - 1)) / (display_lines))
+ : 1);
+ int curpage = (((curline + 1) > display_lines)
+ ? (((curline + 1) + (display_lines - 1)) / (display_lines))
+ : 1);
+
+ CTRACE((tfp, " nlines=%d, npages=%d, curline=%d, curpage=%d\n",
+ nlines, npages, curline, curpage));
+ if (*num < 1)
+ *num = rel ? 0 : 1;
+ if (rel == '+')
+ *num = curpage + *num;
+ else if (rel == '-')
+ *num = curpage - *num;
+ doc->line = ((npages <= 1)
+ ? 1
+ : ((*num <= npages)
+ ? (((*num - 1) * display_lines) + 1)
+ : (((npages - 1) * display_lines) + 1)));
+ code = DO_GOTOPAGE_STUFF;
+ } else {
+
+ /*
+ * Check if we want to make the link corresponding to the number the
+ * current link, rather than ACTIVATE-ing it.
+ */
+ want_go = (BOOL) (c == 'g' || c == 'G');
+
+ /* If rel, add or subtract num from current link, or
+ * nearest previous/subsequent link if current link is not on screen.
+ */
+ if (rel)
+ *num = HTGetRelLinkNum(*num, rel, cur);
+ /*
+ * If we have a valid number, act on it.
+ */
+ if (*num > 0) {
+ int info;
+ char *text = NULL;
+
+ /*
+ * Get the lname, and hightext, directly from www structures and
+ * add it to the cur link so that we can pass it transparently on
+ * to getfile(), and load new_top and new_link if we instead want
+ * to make the link number current. These things are done so that
+ * a link can be selected anywhere in the current document, whether
+ * it is displayed on the screen or not!
+ */
+ info = HTGetLinkInfo(*num,
+ want_go,
+ &new_top,
+ &new_link,
+ &text,
+ &links[cur].lname);
+ if (text != NULL)
+ LYSetHilite(cur, text);
+
+ if (info == WWW_INTERN_LINK_TYPE) {
+ links[cur].type = WWW_INTERN_LINK_TYPE;
+ code = DO_LINK_STUFF;
+ } else if (info == LINK_LINE_FOUND) {
+ doc->line = new_top + 1;
+ doc->link = new_link;
+ code = DO_GOTOLINK_STUFF;
+ } else if (info) {
+ links[cur].type = WWW_LINK_TYPE;
+ code = DO_LINK_STUFF;
+ } else {
+ code = PRINT_ERROR;
+ }
+ } else {
+ code = PRINT_ERROR;
+ }
+ }
+ BStrFree(temp);
+ return code;
+}
+
+#if defined(EXEC_LINKS) || defined(LYNXCGI_LINKS)
+
+struct trust {
+ char *src;
+ char *path;
+ int type;
+ struct trust *next;
+};
+
+static struct trust *trusted_exec = 0;
+static struct trust *always_trusted_exec;
+static struct trust *trusted_cgi = 0;
+
+static struct trust *new_trust(const char *src, const char *path, int type)
+{
+ struct trust *tp;
+
+ tp = typecalloc(struct trust);
+
+ if (tp == NULL)
+ outofmem(__FILE__, "new_trust");
+
+ tp->type = type;
+ StrAllocCopy(tp->src, src);
+ StrAllocCopy(tp->path, path);
+
+ return tp;
+}
+
+static struct trust *get_trust(struct trust **table, const char *src, int type)
+{
+ if (*table == 0) {
+ *table = new_trust(src, "", type);
+ }
+ return *table;
+}
+
+#ifdef LY_FIND_LEAKS
+static void free_data(struct trust **data)
+{
+ struct trust *cur = (*data);
+ struct trust *next;
+
+ while (cur) {
+ FREE(cur->src);
+ FREE(cur->path);
+ next = cur->next;
+ FREE(cur);
+ cur = next;
+ }
+ *data = NULL;
+}
+
+static void LYTrusted_free(void)
+{
+ free_data(&trusted_exec);
+ free_data(&always_trusted_exec);
+ free_data(&trusted_cgi);
+
+ return;
+}
+#endif /* LY_FIND_LEAKS */
+
+void add_trusted(char *str,
+ int type)
+{
+ struct trust *tp;
+ char *path;
+ char *src = str;
+ const char *after_tab;
+ int Type = type;
+ static BOOLEAN first = TRUE;
+
+ if (!src)
+ return;
+ if (first) {
+#ifdef LY_FIND_LEAKS
+ atexit(LYTrusted_free);
+#endif
+ first = FALSE;
+ }
+
+ path = StrChr(src, '\t');
+ if (path) {
+ *path++ = '\0';
+ after_tab = path;
+ } else {
+ after_tab = "";
+ }
+
+ tp = new_trust(src, after_tab, Type);
+
+ if (Type == EXEC_PATH) {
+ tp->next = trusted_exec;
+ trusted_exec = tp;
+ } else if (Type == ALWAYS_EXEC_PATH) {
+ tp->next = always_trusted_exec;
+ always_trusted_exec = tp;
+ } else if (Type == CGI_PATH) {
+ tp->next = trusted_cgi;
+ trusted_cgi = tp;
+ }
+}
+
+/*
+ * Check to see if the supplied paths is allowed to be executed.
+ */
+BOOLEAN exec_ok(const char *source,
+ const char *linktext,
+ int type)
+{
+ struct trust *tp;
+ const char *cp;
+ const char *allowed_extra_chars;
+ int Type = type;
+
+ /*
+ * Always OK if it is a jump file shortcut.
+ */
+ if (LYJumpFileURL)
+ return TRUE;
+
+ /*
+ * Choose the trust structure based on the type.
+ */
+ if (Type == EXEC_PATH) {
+ tp = get_trust(&trusted_exec, "file://localhost/", EXEC_PATH);
+ } else if (Type == ALWAYS_EXEC_PATH) {
+ tp = get_trust(&always_trusted_exec, "none", ALWAYS_EXEC_PATH);
+ } else if (Type == CGI_PATH) {
+ tp = get_trust(&trusted_cgi, "none", CGI_PATH);
+ } else {
+ HTAlert(MALFORMED_EXEC_REQUEST);
+ return FALSE;
+ }
+
+#ifdef VMS
+ /*
+ * Security: reject on relative path.
+ */
+ if ((cp = StrChr(linktext, '[')) != NULL) {
+ char *cp1;
+
+ if (((cp1 = StrChr(cp, '-')) != NULL) &&
+ StrChr(cp1, ']') != NULL) {
+ while (cp1[1] == '-')
+ cp1++;
+ if (cp1[1] == ']' ||
+ cp1[1] == '.') {
+ HTAlert(RELPATH_IN_EXEC_LINK);
+ return FALSE;
+ }
+ }
+ }
+#else
+ /*
+ * Security: reject on relative path.
+ */
+ if (strstr(linktext, "../") != NULL) {
+ HTAlert(RELPATH_IN_EXEC_LINK);
+ return FALSE;
+ }
+
+ /*
+ * Security: reject on strange character.
+ */
+ if (Type == CGI_PATH)
+ allowed_extra_chars = " _-:./@~$&+=\t";
+ else
+ allowed_extra_chars = " _-:./@~$+=\t";
+ for (cp = linktext; *cp != '\0'; cp++) {
+ if (!isalnum(UCH(*cp)) && !StrChr(allowed_extra_chars, *cp)) {
+ char *buf = 0;
+
+ HTSprintf0(&buf,
+ BADCHAR_IN_EXEC_LINK,
+ *cp);
+ HTAlert(buf);
+ FREE(buf);
+ return FALSE;
+ }
+ }
+#endif /* VMS */
+
+ check_tp_for_entry:
+ while (tp) {
+ if (tp->type == Type) {
+ char const *command = linktext;
+
+ if (strstr(command, "//") == linktext) {
+ command += 2;
+ }
+ CTRACE((tfp, "comparing source\n\t'%s'\n\t'%s'\n", source, tp->src));
+ CTRACE((tfp, "comparing command\n\t'%s'\n\t'%s'\n", command, tp->path));
+ if (STRNADDRCOMP(source, tp->src, strlen(tp->src)) == 0 &&
+ STRNADDRCOMP(command, tp->path, strlen(tp->path)) == 0)
+ return TRUE;
+ }
+ tp = tp->next;
+ }
+ if (Type == EXEC_PATH &&
+ always_trusted_exec->next != 0) {
+ Type = ALWAYS_EXEC_PATH;
+ tp = always_trusted_exec;
+ goto check_tp_for_entry;
+ }
+ if (!(no_exec && type == ALWAYS_EXEC_PATH))
+ HTAlert(BADLOCPATH_IN_EXEC_LINK);
+ return FALSE;
+}
+#endif /* EXEC_LINKS || LYNXCGI_LINKS */
+
+static int fix_httplike_urls(DocInfo *doc, UrlTypes type)
+{
+ char *slash;
+
+ /*
+ * If there's a fragment present, our simplistic methods won't work. - kw
+ */
+ if (findPoundSelector(doc->address) != NULL)
+ return 0;
+
+#ifndef DISABLE_FTP
+ /*
+ * If it's an ftp URL with a trailing slash, trim it off.
+ */
+ if (type == FTP_URL_TYPE &&
+ LYIsHtmlSep(doc->address[strlen(doc->address) - 1])) {
+ char *path = HTParse(doc->address, "", PARSE_PATH | PARSE_PUNCTUATION);
+
+ /*
+ * If the path is a lone slash, we're done. - FM
+ */
+ if (path) {
+ if (LYIsHtmlSep(path[0]) && path[1] == '\0') {
+ FREE(path);
+ return 0;
+ }
+ FREE(path);
+ }
+
+ /*
+ * If we're proxying ftp, don't trim anything. - KW
+ */
+ if ((LYGetEnv("ftp_proxy") != NULL) &&
+ !override_proxy(doc->address))
+ return 0;
+
+ /*
+ * If we get to here, trim the trailing slash. - FM
+ */
+ CTRACE((tfp, "fix_httplike_urls: URL '%s'\n", doc->address));
+ LYTrimHtmlSep(doc->address);
+ CTRACE((tfp, " changed to '%s'\n", doc->address));
+ CTRACE_SLEEP(MessageSecs);
+ } else if (type == NCFTP_URL_TYPE) {
+ char *path = NULL;
+ char *first = doc->address;
+ char *second = StrChr(first, ':');
+
+ CTRACE((tfp, "fix_httplike_urls: URL '%s'\n", doc->address));
+ if (second == 0)
+ second = first + strlen(first);
+ else
+ *second++ = '\0';
+ HTSprintf0(&path, "%s//%s%s", STR_FTP_URL, first, second);
+ FREE(doc->address);
+ doc->address = path;
+
+ CTRACE((tfp, " changed to '%s'\n", doc->address));
+ CTRACE_SLEEP(MessageSecs);
+ }
+#endif /* DISABLE_FTP */
+
+ /*
+ * If there isn't a slash besides the two at the beginning, append one.
+ */
+ if ((slash = strrchr(doc->address, '/')) != NULL) {
+ if (!LYIsHtmlSep(*(slash - 1)) || *(slash - 2) != ':') {
+ return (0);
+ }
+ if (type == HTTP_URL_TYPE ||
+ type == HTTPS_URL_TYPE) {
+ if ((slash - 2) != StrChr(doc->address, ':')) {
+ /*
+ * Turns out we were not looking at the right slash after all,
+ * there must have been more than one "://" which is valid at
+ * least for http URLs (later occurrences can be part of a
+ * query string, for example), so leave this alone, too. - kw
+ */
+ return (0);
+ }
+ if (StrChr(doc->address, '?')) {
+ /*
+ * If there is a question mark that appears to be part of the
+ * hostname, don't append anything either. Leave it to HTParse
+ * to interpret the question mark as ending the hostname. - kw
+ */
+ return (0);
+ }
+ }
+ }
+ CTRACE((tfp, "fix_httplike_urls: URL '%s'\n", doc->address));
+ LYAddHtmlSep(&(doc->address));
+ CTRACE((tfp, " changed to '%s'\n", doc->address));
+ CTRACE_SLEEP(MessageSecs);
+
+ return (1);
+}
diff --git a/src/LYGetFile.h b/src/LYGetFile.h
new file mode 100644
index 0000000..f204d07
--- /dev/null
+++ b/src/LYGetFile.h
@@ -0,0 +1,38 @@
+#ifndef LYGETFILE_H
+#define LYGETFILE_H
+
+#include <LYStructs.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define NOT_FOUND 0
+#define NORMAL 1
+#define NULLFILE 3
+ extern int getfile(DocInfo *doc, int *target);
+ extern void srcmode_for_next_retrieval(int);
+ extern int follow_link_number(int c,
+ int cur,
+ DocInfo *doc,
+ int *num);
+ extern void add_trusted(char *str, int type);
+ extern BOOLEAN exec_ok(const char *source, const char *linkpath, int type);
+
+ extern char *WWW_Download_File;
+
+/* values for follow_link_number() */
+#define DO_LINK_STUFF 1
+#define DO_GOTOLINK_STUFF 2
+#define DO_GOTOPAGE_STUFF 3
+#define DO_FORMS_STUFF 4
+#define PRINT_ERROR 5
+
+/* values for add_trusted() and exec_ok() */
+#define EXEC_PATH 0
+#define ALWAYS_EXEC_PATH 1
+#define CGI_PATH 2
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* LYGETFILE_H */
diff --git a/src/LYGlobalDefs.h b/src/LYGlobalDefs.h
new file mode 100644
index 0000000..2802814
--- /dev/null
+++ b/src/LYGlobalDefs.h
@@ -0,0 +1,739 @@
+/*
+ * $LynxId: LYGlobalDefs.h,v 1.154 2022/04/02 00:12:18 Paul.G.Fox Exp $
+ *
+ * global variable definitions
+ */
+
+#ifndef LYGLOBALDEFS_H
+#define LYGLOBALDEFS_H
+
+#ifndef HTUTILS_H
+#include <HTUtils.h>
+#endif /* HTUTILS_H */
+
+#ifndef LYSTRUCTS_H
+#include <LYStructs.h>
+#endif /* LYSTRUCTS_H */
+
+/* Of the following definitions, currently unused are and could
+ be removed (at least):
+ CURRENT_KEYMAP_HELP
+*/
+#if defined(HAVE_CONFIG_H) && defined(HAVE_LYHELP_H)
+#include <LYHelp.h>
+#else
+#define ALT_EDIT_HELP "keystrokes/alt_edit_help.html"
+#define BASHLIKE_EDIT_HELP "keystrokes/bashlike_edit_help.html"
+#define COOKIE_JAR_HELP "Lynx_users_guide.html#Cookies"
+#define CACHE_JAR_HELP "Lynx_users_guide.html#Cache"
+#define CURRENT_KEYMAP_HELP "keystrokes/keystroke_help.html"
+#define DIRED_MENU_HELP "keystrokes/dired_help.html"
+#define DOWNLOAD_OPTIONS_HELP "Lynx_users_guide.html#RemoteSource"
+#define EDIT_HELP "keystrokes/edit_help.html"
+#define HISTORY_PAGE_HELP "keystrokes/history_help.html"
+#define LIST_PAGE_HELP "keystrokes/follow_help.html"
+#define LYNXCFG_HELP "lynx.cfg"
+#define OPTIONS_HELP "keystrokes/option_help.html"
+#define PRINT_OPTIONS_HELP "keystrokes/print_help.html"
+#define UPLOAD_OPTIONS_HELP "Lynx_users_guide.html#DirEd"
+#define VISITED_LINKS_HELP "keystrokes/visited_help.html"
+#endif /* LYHELP_H */
+
+#ifdef USE_SOURCE_CACHE
+#include <HTChunk.h>
+#endif
+
+#include <LYMail.h> /* to get ifdef's for mail-variables */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#ifdef SOCKS
+ extern BOOLEAN socks_flag;
+ extern unsigned long socks_bind_remoteAddr;
+#endif /* SOCKS */
+
+#ifdef IGNORE_CTRL_C
+ extern BOOLEAN sigint;
+#endif /* IGNORE_CTRL_C */
+
+#if USE_VMS_MAILER
+ extern char *mail_adrs;
+ extern BOOLEAN UseFixedRecords; /* convert binary files to FIXED 512 records */
+#endif /* VMS */
+
+#ifndef VMS
+ extern char *list_format;
+#endif /* !VMS */
+ extern char *ftp_format;
+
+ typedef enum {
+ BAD_HTML_IGNORE = 0
+ ,BAD_HTML_TRACE
+ ,BAD_HTML_MESSAGE
+ ,BAD_HTML_WARN
+ } enumBadHtml;
+
+ extern int cfg_bad_html; /* enumBadHtml */
+
+#ifdef DIRED_SUPPORT
+
+ typedef enum {
+ DIRS_FIRST = 0
+ ,FILES_FIRST
+ ,MIXED_STYLE
+ } enumDirListStyle;
+
+ typedef enum {
+ ORDER_BY_NAME
+ ,ORDER_BY_SIZE
+ ,ORDER_BY_DATE
+ ,ORDER_BY_MODE
+ ,ORDER_BY_TYPE
+ ,ORDER_BY_USER
+ ,ORDER_BY_GROUP
+ } enumDirListOrder;
+
+ extern BOOLEAN lynx_edit_mode;
+ extern BOOLEAN no_dired_support;
+ extern HTList *tagged;
+ extern int LYAutoUncacheDirLists;
+ extern int dir_list_style; /* enumDirListStyle */
+ extern int dir_list_order; /* enumDirListOrder */
+
+#ifdef OK_OVERRIDE
+ extern BOOLEAN prev_lynx_edit_mode;
+#endif /* OK_OVERRIDE */
+
+#ifdef OK_PERMIT
+ extern BOOLEAN no_change_exec_perms;
+#endif /* OK_PERMIT */
+
+#endif /* DIRED_SUPPORT */
+
+ extern int HTCacheSize; /* the number of documents cached in memory */
+
+#if defined(VMS) && defined(VAXC) && !defined(__DECC)
+ extern int HTVirtualMemorySize; /* bytes allocated and not yet freed */
+#endif /* VMS && VAXC && !__DECC */
+
+#if defined(EXEC_LINKS) || defined(EXEC_SCRIPTS)
+ extern BOOLEAN local_exec; /* TRUE to enable local program execution */
+ extern BOOLEAN local_exec_on_local_files; /* TRUE to enable local program *
+
+ * execution in local files only */
+#endif /* defined(EXEC_LINKS) || defined(EXEC_SCRIPTS) */
+
+#if defined(LYNXCGI_LINKS) && !defined(VMS) /* WebSter Mods -jkt */
+ extern char *LYCgiDocumentRoot; /* DOCUMENT_ROOT in the lynxcgi env */
+#endif /* LYNXCGI_LINKS */
+
+/* Values to which keypad_mode can be set */
+#define NUMBERS_AS_ARROWS 0
+#define LINKS_ARE_NUMBERED 1
+#define LINKS_AND_FIELDS_ARE_NUMBERED 2
+#define FIELDS_ARE_NUMBERED 3
+
+#define links_are_numbered() \
+ (keypad_mode == LINKS_ARE_NUMBERED || \
+ keypad_mode == LINKS_AND_FIELDS_ARE_NUMBERED)
+
+#define fields_are_numbered() \
+ (keypad_mode == FIELDS_ARE_NUMBERED || \
+ keypad_mode == LINKS_AND_FIELDS_ARE_NUMBERED)
+#define fields_are_named() \
+ (user_mode == ADVANCED_MODE)
+
+#define HIDDENLINKS_MERGE 0
+#define HIDDENLINKS_SEPARATE 1
+#define HIDDENLINKS_IGNORE 2
+
+#define NOVICE_MODE 0
+#define INTERMEDIATE_MODE 1
+#define ADVANCED_MODE 2
+#define MINIMAL_MODE 3
+ extern BOOLEAN LYUseNoviceLineTwo; /* True if TOGGLE_HELP is not mapped */
+
+#define MAX_LINE 1024 /* No window can be wider than this */
+#define MAX_COLS (MAX_LINE-10) /* we don't expect wider than this */
+#define DFT_COLS 80 /* ...and normally only this */
+#define DFT_ROWS 24 /* ...corresponding nominal height */
+
+ extern char star_string[MAX_LINE + 1]; /* from GridText.c */
+
+#define STARS(n) \
+ ((n) >= MAX_LINE ? star_string : &star_string[(MAX_LINE-1)] - (n))
+
+ typedef enum {
+ SHOW_COLOR_UNKNOWN = -1
+ ,SHOW_COLOR_NEVER = 0 /* positive numbers are index in LYOptions.c */
+ ,SHOW_COLOR_OFF
+ ,SHOW_COLOR_ON
+ ,SHOW_COLOR_ALWAYS
+ } enumShowColor;
+
+ extern int LYShowColor; /* Show color or monochrome? */
+ extern int LYrcShowColor; /* ... as read or last written */
+
+ typedef enum {
+ MBM_OFF = 0
+ ,MBM_STANDARD
+ ,MBM_ADVANCED
+ } enumMultiBookmarks;
+
+#if !defined(NO_OPTION_FORMS) && !defined(NO_OPTION_MENU)
+ extern BOOLEAN LYUseFormsOptions; /* use Forms-based options menu */
+
+#else
+#define LYUseFormsOptions FALSE /* simplify ifdef'ing in LYMainLoop.c */
+#endif
+
+ typedef enum {
+ rateOFF = 0
+ ,rateBYTES = 1
+ ,rateKB
+#ifdef USE_READPROGRESS
+ ,rateEtaBYTES
+ ,rateEtaKB
+ ,rateEtaBYTES2
+ ,rateEtaKB2
+#endif
+#ifdef USE_PROGRESSBAR
+ ,rateBAR
+#endif
+ } TransferRate;
+
+#ifdef USE_READPROGRESS
+# define isRateInKB(n) ((n) == rateKB || (n) == rateEtaKB || (n) == rateEtaKB2)
+#else
+# define isRateInKB(n) ((n) == rateKB)
+#endif
+
+#define TITLE_LINES 1
+
+ extern BOOLEAN LYCursesON; /* start_curses()->TRUE, stop_curses()->FALSE */
+ extern BOOLEAN LYJumpFileURL; /* URL from the jump file shortcuts? */
+ extern BOOLEAN LYNewsPosting; /* News posting supported if TRUE */
+ extern BOOLEAN LYAutoSession; /* Auto restore/save session? */
+ extern BOOLEAN LYShowCursor; /* Show the cursor or hide it? */
+ extern BOOLEAN LYShowTransferRate;
+ extern BOOLEAN LYUnderlineLinks; /* Show the links underlined vs bold */
+ extern BOOLEAN LYUseDefShoCur; /* Command line -show_cursor toggle */
+ extern BOOLEAN LYUserSpecifiedURL; /* URL from a goto or document? */
+ extern BOOLEAN LYfind_leaks;
+ extern BOOLEAN LYforce_HTML_mode;
+ extern BOOLEAN LYforce_no_cache;
+ extern BOOLEAN LYinternal_flag; /* don't need fresh copy, was internal link */
+ extern BOOLEAN LYoverride_no_cache; /* don't need fresh copy, from history */
+ extern BOOLEAN LYresubmit_posts;
+ extern BOOLEAN LYtrimBlankLines;
+ extern BOOLEAN LYtrimInputFields;
+ extern BOOLEAN LYxhtml_parsing;
+ extern BOOLEAN bold_H1;
+ extern BOOLEAN bold_headers;
+ extern BOOLEAN bold_name_anchors;
+ extern BOOLEAN LYcase_sensitive; /* TRUE to turn on case sensitive search */
+ extern BOOLEAN check_mail; /* TRUE to report unread/new mail messages */
+ extern BOOLEAN child_lynx; /* TRUE to exit with an arrow */
+ extern BOOLEAN dump_links_decoded;
+ extern BOOLEAN dump_links_inline;
+ extern BOOLEAN dump_links_only;
+ extern BOOLEAN dump_output_immediately;
+ extern BOOLEAN dump_to_stderr;
+ extern BOOLEAN emacs_keys; /* TRUE to turn on emacs-like key movement */
+ extern BOOLEAN error_logging; /* TRUE to mail error messages */
+ extern BOOLEAN ftp_ok;
+ extern BOOLEAN goto_buffer; /* TRUE if offering default goto URL */
+ extern BOOLEAN is_www_index;
+ extern BOOLEAN jump_buffer; /* TRUE if offering default shortcut */
+ extern BOOLEAN long_url_ok;
+ extern BOOLEAN lynx_mode;
+ extern BOOLEAN more_text; /* is there more document to display? */
+ extern BOOLEAN news_ok;
+ extern BOOLEAN number_fields_on_left;
+ extern BOOLEAN number_links_on_left;
+ extern BOOLEAN recent_sizechange;
+ extern BOOLEAN rlogin_ok;
+ extern BOOLEAN syslog_requested_urls;
+ extern BOOLEAN system_editor; /* True if locked-down editor */
+ extern BOOLEAN telnet_ok;
+ extern BOOLEAN verbose_img; /* display filenames of images? */
+ extern BOOLEAN vi_keys; /* TRUE to turn on vi-like key movement */
+
+ extern HTList *Goto_URLs;
+ extern HTList *positionable_editor;
+
+ extern char *LYRequestReferer; /* Referer, may be set in getfile() */
+ extern char *LYRequestTitle; /* newdoc.title in calls to getfile() */
+ extern char *LYTransferName; /* abbreviation for Kilobytes */
+ extern char *LynxHome;
+#ifdef USE_SESSIONS
+ extern char *LYSessionFile; /* file for auto-session */
+ extern char *session_file; /* file for -session= */
+ extern char *sessionin_file; /* file for -sessionin= */
+ extern char *sessionout_file; /* file for -sessionout= */
+#endif
+ extern char *LynxSigFile; /* Signature file, in or off home */
+ extern char *helpfile;
+ extern char *helpfilepath;
+ extern char *jumpprompt; /* The default jump statusline prompt */
+ extern char *language;
+ extern char *lynx_cfg_file; /* location of active lynx.cfg file */
+ extern char *lynx_cmd_logfile; /* file to write keystroke commands, if any */
+ extern char *lynx_cmd_script; /* file to read keystroke commands, if any */
+ extern char *lynx_save_space;
+ extern char *lynx_temp_space;
+ extern char *lynxjumpfile;
+ extern char *lynxlinksfile;
+ extern char *lynxlistfile;
+ extern char *original_dir;
+ extern char *pref_charset; /* Lynx's preferred character set - MM */
+ extern char *startfile;
+ extern char *syslog_txt; /* syslog arb text for session */
+ extern char *system_mail;
+ extern char *system_mail_flags;
+ extern char *x_display;
+ extern char empty_string[];
+
+ extern const char *checked_box; /* form boxes */
+ extern const char *checked_radio; /* form radio buttons */
+ extern const char *unchecked_box; /* form boxes */
+ extern const char *unchecked_radio; /* form radio buttons */
+
+ extern int LYAcceptEncoding;
+ extern int LYAcceptMedia;
+ extern int LYContentType;
+ extern const char *ContentTypes[];
+ extern int LYTransferRate; /* see enum TransferRate */
+ extern int display_lines; /* number of lines in the display */
+ extern int dump_output_width;
+ extern int dump_server_status;
+ extern int keypad_mode; /* NUMBERS_AS_ARROWS or LINKS_ARE_NUMBERED */
+ extern int lynx_temp_subspace;
+ extern int max_cookies_buffer;
+ extern int max_cookies_domain;
+ extern int max_cookies_global;
+ extern int max_uri_size;
+#ifdef USE_SESSIONS
+ extern short session_limit; /* maximal entries saved/restored
+ in session file */
+#endif
+ extern int user_mode; /* novice or advanced */
+ extern int www_search_result;
+
+ extern BOOLEAN exec_frozen;
+ extern BOOLEAN had_restrictions_all; /* parsed these restriction options */
+ extern BOOLEAN had_restrictions_default; /* flags to note whether we have... */
+ extern BOOLEAN no_bookmark;
+ extern BOOLEAN no_bookmark_exec;
+ extern BOOLEAN no_chdir;
+ extern BOOLEAN no_compileopts_info;
+ extern BOOLEAN no_disk_save;
+ extern BOOLEAN no_dotfiles;
+ extern BOOLEAN no_download;
+ extern BOOLEAN no_editor;
+ extern BOOLEAN no_exec;
+ extern BOOLEAN no_file_url;
+ extern BOOLEAN no_goto;
+ extern BOOLEAN no_goto_configinfo;
+ extern BOOLEAN no_goto_cso;
+ extern BOOLEAN no_goto_file;
+ extern BOOLEAN no_goto_finger;
+ extern BOOLEAN no_goto_ftp;
+ extern BOOLEAN no_goto_gopher;
+ extern BOOLEAN no_goto_http;
+ extern BOOLEAN no_goto_https;
+ extern BOOLEAN no_goto_lynxcgi;
+ extern BOOLEAN no_goto_lynxexec;
+ extern BOOLEAN no_goto_lynxprog;
+ extern BOOLEAN no_goto_mailto;
+ extern BOOLEAN no_goto_news;
+ extern BOOLEAN no_goto_nntp;
+ extern BOOLEAN no_goto_rlogin;
+ extern BOOLEAN no_goto_snews;
+ extern BOOLEAN no_goto_telnet;
+ extern BOOLEAN no_goto_tn3270;
+ extern BOOLEAN no_goto_wais;
+ extern BOOLEAN no_inside_ftp;
+ extern BOOLEAN no_inside_news;
+ extern BOOLEAN no_inside_rlogin;
+ extern BOOLEAN no_inside_telnet; /* this and following are restrictions */
+ extern BOOLEAN no_jump;
+ extern BOOLEAN no_lynxcfg_info;
+ extern BOOLEAN no_lynxcfg_xinfo;
+ extern BOOLEAN no_lynxcgi;
+ extern BOOLEAN no_mail;
+ extern BOOLEAN no_multibook;
+ extern BOOLEAN no_newspost;
+ extern BOOLEAN no_option_save;
+ extern BOOLEAN no_outside_ftp;
+ extern BOOLEAN no_outside_news;
+ extern BOOLEAN no_outside_rlogin;
+ extern BOOLEAN no_outside_telnet;
+ extern BOOLEAN no_print; /* TRUE to disable printing */
+ extern BOOLEAN no_shell;
+ extern BOOLEAN no_suspend;
+ extern BOOLEAN no_telnet_port;
+ extern BOOLEAN no_useragent;
+
+ extern BOOLEAN no_statusline;
+ extern BOOLEAN no_filereferer;
+ extern char LYRefererWithQuery; /* 'S', 'P', or 'D' */
+ extern BOOLEAN local_host_only;
+ extern BOOLEAN override_no_download;
+ extern BOOLEAN show_dotfiles; /* From rcfile if no_dotfiles is false */
+ extern char *indexfile;
+ extern char *anonftp_password;
+ extern char *personal_mail_address;
+ extern char *personal_mail_name;
+ extern char *homepage; /* startfile or command line argument */
+ extern char *editor; /* if non empty it enables edit mode with
+
+ * the editor that is named */
+ extern char *jumpfile;
+ extern char *bookmark_page;
+ extern char *BookmarkPage;
+ extern char *personal_type_map;
+ extern char *global_type_map;
+ extern char *global_extension_map;
+ extern char *personal_extension_map;
+ extern char *LYHostName;
+ extern char *LYLocalDomain;
+ extern BOOLEAN LYGuessScheme;
+ extern BOOLEAN unique_urls;
+ extern BOOLEAN use_underscore;
+ extern BOOLEAN no_list;
+ extern BOOLEAN no_margins;
+ extern BOOLEAN no_pause;
+ extern BOOLEAN no_title;
+ extern BOOLEAN update_term_title;
+ extern BOOLEAN historical_comments;
+ extern BOOLEAN html5_charsets;
+ extern BOOLEAN minimal_comments;
+ extern BOOLEAN soft_dquotes;
+
+#ifdef USE_SOURCE_CACHE
+ extern BOOLEAN source_cache_file_error;
+ extern int LYCacheSource;
+
+#define SOURCE_CACHE_NONE 0
+#define SOURCE_CACHE_FILE 1
+#define SOURCE_CACHE_MEMORY 2
+
+ extern int LYCacheSourceForAborted;
+
+#define SOURCE_CACHE_FOR_ABORTED_KEEP 1
+#define SOURCE_CACHE_FOR_ABORTED_DROP 0
+#endif
+
+ extern BOOLEAN LYCancelDownload;
+ extern BOOLEAN LYRestricted; /* whether we had -anonymous option */
+ extern BOOLEAN LYValidate;
+ extern BOOLEAN LYPermitURL;
+ extern BOOLEAN track_internal_links;
+ extern BOOLEAN enable_scrollback; /* Clear screen before displaying new page */
+ extern BOOLEAN keep_mime_headers; /* Include mime headers and *
+
+ * force source dump */
+ extern BOOLEAN no_url_redirection; /* Don't follow URL redirections */
+
+#ifdef DISP_PARTIAL
+ extern BOOLEAN display_partial; /* Display document while loading */
+ extern int NumOfLines_partial; /* -//- "current" number of lines */
+ extern int partial_threshold;
+ extern BOOLEAN debug_display_partial; /* show with MessageSecs delay */
+ extern BOOLEAN display_partial_flag; /* permanent flag, not mutable */
+#endif
+ extern char *socks5_proxy;
+ extern char *form_post_data; /* User data for post form */
+ extern char *form_get_data; /* User data for get form */
+ extern char *http_error_file; /* Place HTTP status code in this file */
+ extern char *authentication_info[2]; /* Id:Password for protected documents */
+ extern char *proxyauth_info[2]; /* Id:Password for protected proxy server */
+ extern BOOLEAN HEAD_request; /* Do a HEAD request */
+ extern BOOLEAN scan_for_buried_news_references;
+ extern BOOLEAN bookmark_start; /* Use bookmarks as startfile */
+ extern BOOLEAN clickable_images;
+ extern BOOLEAN nested_tables;
+ extern BOOLEAN pseudo_inline_alts;
+ extern BOOLEAN crawl;
+ extern BOOLEAN traversal;
+ extern BOOLEAN check_realm;
+ extern char *startrealm;
+ extern BOOLEAN more_links;
+ extern int crawl_count;
+ extern BOOLEAN LYCancelledFetch;
+ extern const char *LYToolbarName;
+
+ extern BOOLEAN nomore;
+ extern int AlertSecs;
+ extern int InfoSecs;
+ extern int MessageSecs;
+ extern int DelaySecs;
+ extern int ReplaySecs;
+
+ extern char *LYUserAgent; /* Lynx User-Agent header */
+ extern char *LYUserAgentDefault; /* Lynx default User-Agent header */
+ extern BOOLEAN LYNoRefererHeader; /* Never send Referer header? */
+ extern BOOLEAN LYNoRefererForThis; /* No Referer header for this URL? */
+ extern BOOLEAN LYNoFromHeader; /* Never send From header? */
+ extern BOOLEAN LYSendUserAgent; /* send Lynx User-Agent header? */
+ extern BOOLEAN LYListNewsNumbers;
+ extern BOOLEAN LYUseMouse;
+ extern BOOLEAN LYListNewsDates;
+
+ extern BOOLEAN LYRawMode;
+ extern BOOLEAN LYDefaultRawMode;
+ extern BOOLEAN LYUseDefaultRawMode;
+ extern char *UCAssume_MIMEcharset;
+ extern BOOLEAN UCSaveBookmarksInUnicode; /* in titles, chars >127 save as &#xUUUU */
+ extern BOOLEAN UCForce8bitTOUPPER; /* disable locale case-conversion for >127 */
+ extern int outgoing_mail_charset; /* translate outgoing mail to this charset */
+
+ extern BOOLEAN LYisConfiguredForX;
+ extern char *URLDomainPrefixes;
+ extern char *URLDomainSuffixes;
+ extern BOOLEAN startfile_ok;
+ extern BOOLEAN LYSelectPopups; /* Cast popups to radio buttons? */
+ extern BOOLEAN LYUseDefSelPop; /* Command line -popup toggle */
+ extern int LYMultiBookmarks; /* Multi bookmark support on? */
+ extern BOOLEAN LYMBMBlocked; /* Force MBM support off? */
+ extern int LYStatusLine; /* Line for statusline() or -1 */
+ extern BOOLEAN LYCollapseBRs; /* Collapse serial BRs? */
+ extern BOOLEAN LYSetCookies; /* Process Set-Cookie headers? */
+ extern BOOLEAN LYAcceptAllCookies; /* accept ALL cookies? */
+
+ extern char *LYCookieAcceptDomains; /* domains to accept all cookies */
+ extern char *LYCookieRejectDomains; /* domains to reject all cookies */
+ extern char *LYCookieStrictCheckDomains; /* domains to check strictly */
+ extern char *LYCookieLooseCheckDomains; /* domains to check loosely */
+ extern char *LYCookieQueryCheckDomains; /* domains to check w/a query */
+ extern char *LYCookieSAcceptDomains; /* domains to accept all cookies */
+ extern char *LYCookieSRejectDomains; /* domains to reject all cookies */
+ extern char *LYCookieSStrictCheckDomains; /* domains to check strictly */
+ extern char *LYCookieSLooseCheckDomains; /* domains to check loosely */
+ extern char *LYCookieSQueryCheckDomains; /* domains to check w/a query */
+
+#ifndef DISABLE_BIBP
+ extern BOOLEAN no_goto_bibp;
+ extern char *BibP_globalserver; /* global server for bibp: links */
+ extern char *BibP_bibhost; /* local server for bibp: links */
+ extern BOOLEAN BibP_bibhost_checked; /* bibhost has been checked */
+ extern BOOLEAN BibP_bibhost_available; /* bibhost is responding */
+#endif
+
+#ifndef DISABLE_FTP
+ extern BOOLEAN ftp_local_passive;
+ extern BOOLEAN ftp_passive; /* TRUE if we want to use passive mode ftp */
+ extern HTList *broken_ftp_epsv;
+ extern HTList *broken_ftp_retr;
+ extern char *ftp_lasthost;
+#endif
+
+#ifdef USE_PERSISTENT_COOKIES
+ extern BOOLEAN persistent_cookies;
+ extern char *LYCookieFile; /* cookie read file */
+ extern char *LYCookieSaveFile; /* cookie save file */
+#endif /* USE_PERSISTENT_COOKIES */
+
+ extern char *XLoadImageCommand; /* Default image viewer for X */
+
+#ifdef USE_EXTERNALS
+ extern BOOLEAN no_externals; /* don't allow the use of externals */
+#endif
+
+ extern BOOLEAN LYNoISMAPifUSEMAP; /* Omit ISMAP link if MAP present? */
+ extern int LYHiddenLinks;
+
+ extern char *SSL_cert_file; /* Default CA CERT file */
+ extern char *SSL_client_cert_file; /* Default client CERT file */
+ extern char *SSL_client_key_file; /* Default client key file */
+
+ typedef enum {
+ HTTP_1_0
+ ,HTTP_1_1
+ } HTTP_LEVEL;
+
+ extern int HTprotocolLevel;
+
+ extern int Old_DTD;
+
+#define MBM_V_MAXFILES 25 /* Max number of sub-bookmark files */
+
+/*
+ * Arrays that holds the names of sub-bookmark files
+ * and their descriptions.
+ */
+ extern char *MBM_A_subbookmark[MBM_V_MAXFILES + 1];
+ extern char *MBM_A_subdescript[MBM_V_MAXFILES + 1];
+
+ extern BOOLEAN LYForceSSLCookiesSecure;
+ extern BOOLEAN LYNoCc;
+ extern BOOLEAN LYNonRestartingSIGWINCH;
+ extern BOOLEAN LYPreparsedSource; /* Show source as preparsed? */
+ extern BOOLEAN LYPrependBaseToSource;
+ extern BOOLEAN LYPrependCharsetToSource;
+ extern BOOLEAN LYQuitDefaultYes;
+ extern BOOLEAN LYReuseTempfiles;
+ extern BOOLEAN LYSeekFragAREAinCur;
+ extern BOOLEAN LYSeekFragMAPinCur;
+ extern BOOLEAN LYStripDotDotURLs; /* Try to fix ../ in some URLs? */
+ extern BOOLEAN LYUseBuiltinSuffixes;
+ extern BOOLEAN dont_wrap_pre;
+
+ extern int cookie_noprompt;
+
+ typedef enum {
+ FORCE_PROMPT_DFT /* force a prompt, use the result */
+ ,FORCE_PROMPT_YES /* assume "yes" where a prompt would be used */
+ ,FORCE_PROMPT_NO /* assume "no" where a prompt would be used */
+ } FORCE_PROMPT;
+
+ extern int cookie_version;
+
+ typedef enum {
+ COOKIES_RFC_2109
+ ,COOKIES_RFC_2965
+ ,COOKIES_RFC_6265
+ } COOKIES_VERSION;
+
+#define USE_RFC_2109 (cookie_version == (COOKIES_RFC_2109))
+#define USE_RFC_2965 (cookie_version == (COOKIES_RFC_2965))
+#define USE_RFC_6265 (cookie_version == (COOKIES_RFC_6265))
+
+#ifdef USE_SSL
+ extern int ssl_noprompt;
+#endif
+
+ extern int LYNoZapKey; /* 0: off (do 'z' checking), 1: full, 2: initially */
+
+#ifdef USE_JUSTIFY_ELTS
+ extern BOOLEAN ok_justify;
+ extern int justify_max_void_percent;
+#endif
+
+#ifdef USE_LOCALE_CHARSET
+ extern BOOLEAN LYLocaleCharset;
+#endif
+ extern BOOLEAN assumed_charset;
+
+#ifndef NO_DUMP_WITH_BACKSPACES
+ extern BOOLEAN with_backspaces;
+#endif
+
+#if defined(PDCURSES) && defined(PDC_BUILD) && PDC_BUILD >= 2401
+ extern int scrsize_x;
+ extern int scrsize_y;
+#endif
+
+ extern BOOLEAN conv_jisx0201kana;
+ extern BOOLEAN wait_viewer_termination;
+
+#ifndef NO_LYNX_TRACE
+ extern FILE *LYTraceLogFP; /* Pointer for TRACE log */
+ extern char *LYTraceLogPath; /* Path for TRACE log */
+#endif
+ extern BOOLEAN LYUseTraceLog; /* Use a TRACE log? */
+
+ extern BOOLEAN force_empty_hrefless_a;
+ extern int connect_timeout;
+ extern int reading_timeout;
+
+#ifdef TEXTFIELDS_MAY_NEED_ACTIVATION
+ extern BOOL textfields_need_activation;
+ extern BOOLEAN textfields_activation_option;
+
+#ifdef INACTIVE_INPUT_STYLE_VH
+ extern BOOL textinput_redrawn;
+#endif
+#else
+#define textfields_need_activation FALSE
+#endif /* TEXTFIELDS_MAY_NEED_ACTIVATION */
+
+ extern BOOLEAN textfield_prompt_at_left_edge;
+
+#ifndef VMS
+ extern BOOLEAN LYNoCore;
+ extern BOOLEAN restore_sigpipe_for_children;
+#endif /* !VMS */
+
+#if defined(USE_COLOR_STYLE)
+ extern int LYuse_color_style; /* color-style vs oldlynx */
+ extern char *lynx_lss_file;
+#endif
+
+#ifdef USE_DEFAULT_COLORS
+ extern BOOLEAN LYuse_default_colors;
+#endif
+
+ extern int HTNoDataOK; /* HT_NO_DATA-is-ok hack */
+ extern BOOLEAN FileInitAlreadyDone;
+
+#ifdef USE_PROGRAM_DIR
+ extern char *program_dir;
+#endif
+
+#ifdef __DJGPP__
+ extern BOOLEAN watt_debug;
+ extern BOOLEAN dj_is_bash;
+#endif /* __DJGPP__ */
+
+#ifdef WIN_EX
+/* LYMain.c */
+ extern BOOLEAN focus_window;
+ extern BOOLEAN system_is_NT;
+ extern char windows_drive[4];
+ extern int lynx_timeout;
+ extern CRITICAL_SECTION critSec_READ;
+#endif /* _WINDOWS */
+
+ extern BOOLEAN show_cfg;
+ extern BOOLEAN no_table_center;
+
+#if USE_BLAT_MAILER
+ extern BOOLEAN mail_is_altblat;
+ extern BOOLEAN mail_is_blat;
+#endif
+
+#if defined(__CYGWIN__)
+#include <io.h>
+#endif
+
+#if !defined(__CYGWIN__) && defined(__CYGWIN32__)
+#define __CYGWIN__
+
+#define cygwin_conv_to_full_win32_path(p, q) \
+ cygwin32_conv_to_full_win32_path(p, q)
+
+#define cygwin_conv_to_full_posix_path(p, q) \
+ cygwin32_conv_to_full_posix_path(p, q)
+#endif
+
+#ifdef __CYGWIN__
+#define ConvertToWin32Path(p, q) \
+ cygwin_conv_to_full_win32_path(p, q);
+#else
+#define ConvertToWin32Path(p, q) \
+ q = p
+#endif
+
+#ifdef USE_SCROLLBAR
+/* GridText.c */
+ extern BOOLEAN LYShowScrollbar;
+ extern BOOLEAN LYsb_arrow;
+ extern int LYsb_begin;
+ extern int LYsb_end;
+#endif
+
+#ifdef MARK_HIDDEN_LINKS
+ extern char *hidden_link_marker;
+#endif
+
+#ifdef USE_BLINK
+ extern BOOLEAN term_blink_is_boldbg;
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* LYGLOBALDEFS_H */
diff --git a/src/LYHash.c b/src/LYHash.c
new file mode 100644
index 0000000..f419c7e
--- /dev/null
+++ b/src/LYHash.c
@@ -0,0 +1,144 @@
+/*
+ * $LynxId: LYHash.c,v 1.39 2018/03/29 00:38:59 tom Exp $
+ *
+ * A hash table for the (fake) CSS support in Lynx-rp
+ * (c) 1996 Rob Partington
+ * rewritten 1997 by Klaus Weide.
+ * rewritten 2018 -TD
+ */
+#include <LYHash.h>
+#include <LYUtils.h>
+#include <LYLeaks.h>
+#include <LYStrings.h>
+#include <LYGlobalDefs.h>
+
+#ifdef USE_COLOR_STYLE
+
+#undef HASH_TYPE
+
+#define HASH_SIZE CSHASHSIZE
+#define HASH_TYPE int
+#define HASH_OF(h, v) ((HASH_TYPE)((h) * 3 + UCH(v)) % HASH_SIZE)
+
+static int count_bump;
+static size_t limit;
+static char *buffer;
+
+static char *get_buffer(size_t need)
+{
+ if (++need > limit) {
+ char *test = realloc(buffer, (limit = (1 + need) * 2));
+
+ if (test == 0)
+ outofmem(__FILE__, "LYHash");
+ buffer = test;
+ }
+ return buffer;
+}
+
+/*
+ * This is the same algorithm as the private anchor_hash() in HTAnchor.c, but
+ * with a different value for HASH_SIZE.
+ */
+static HASH_TYPE cs_hash(const char *string)
+{
+ HASH_TYPE hash = 0;
+ HASH_TYPE best, n;
+ bucket *data;
+ const char *p;
+
+ for (p = string; *p; p++)
+ hash = HASH_OF(hash, *p);
+
+ /*
+ * The computed hash-code is only a starting point. Check for collision.
+ */
+ best = hash;
+ for (n = 0; n < HASH_SIZE; n++) {
+ int nn = (n + hash) % HASH_SIZE;
+
+ data = &hashStyles[nn];
+ if (data->name == 0 || !strcmp(string, data->name)) {
+ best = nn;
+ hash = nn;
+ break;
+ }
+ ++count_bump;
+ }
+ data = &hashStyles[best];
+ if (data->name != 0) {
+ if (strcmp(string, data->name)) {
+ CTRACE_STYLE((tfp, "cs_hash(%s) overwriting %d\n", string, data->name));
+ FREE(data->name);
+ StrAllocCopy(data->name, string);
+ }
+ } else {
+ StrAllocCopy(data->name, string);
+ }
+
+ CTRACE_STYLE((tfp, "cs_hash(%s) = %d\n", string, hash));
+ return hash;
+}
+
+int color_style_1(const char *string)
+{
+ int hash;
+
+ if (dump_output_immediately) {
+ hash = 0;
+ } else {
+ get_buffer(strlen(string));
+ strcpy(buffer, string);
+ LYLowerCase(buffer);
+ hash = cs_hash(buffer);
+ }
+ return hash;
+}
+
+int color_style_3(const char *p, const char *q, const char *r)
+{
+ int hash;
+
+ if (dump_output_immediately) {
+ hash = 0;
+ } else {
+ get_buffer(strlen(p) + strlen(q) + strlen(r));
+ strcpy(buffer, p);
+ strcat(buffer, q);
+ strcat(buffer, r);
+ LYLowerCase(buffer);
+ hash = cs_hash(buffer);
+ }
+ return hash;
+}
+
+void report_hashStyles(void)
+{
+ int i;
+ int count_name = 0;
+ int count_used = 0;
+
+ for (i = 0; i < CSHASHSIZE; i++) {
+ count_name += (hashStyles[i].name != 0);
+ count_used += (hashStyles[i].used != 0);
+ }
+ CTRACE((tfp, "Style hash:\n"));
+ CTRACE((tfp, "%5d names allocated\n", count_name));
+ CTRACE((tfp, "%5d buckets used\n", count_used));
+ CTRACE((tfp, "%5d hash collisions\n", count_bump));
+}
+
+void free_hashStyles(void)
+{
+ int i;
+
+ for (i = 0; i < CSHASHSIZE; i++) {
+ FREE(hashStyles[i].name);
+ hashStyles[i].used = FALSE;
+ }
+ FREE(buffer);
+ limit = 0;
+ count_bump = 0;
+}
+
+#endif /* USE_COLOR_STYLE */
diff --git a/src/LYHash.h b/src/LYHash.h
new file mode 100644
index 0000000..e0e369b
--- /dev/null
+++ b/src/LYHash.h
@@ -0,0 +1,67 @@
+/* $LynxId: LYHash.h,v 1.40 2018/03/10 01:47:33 tom Exp $ */
+#ifndef _LYHASH_H_
+#define _LYHASH_H_ 1
+
+#ifndef HTUTILS_H
+#include <HTUtils.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ typedef struct {
+ char *name; /* name of this item */
+ BOOL used; /* color/attributes have been assigned */
+ int color; /* color highlighting to be done */
+ int mono; /* mono highlighting to be done */
+ int cattr; /* attributes to go with the color */
+ } bucket;
+
+#define CSHASHSIZE 9973 /* Arbitrary prime. Memory/speed tradeoff */
+
+#define NOSTYLE -1
+
+ extern bucket hashStyles[CSHASHSIZE];
+ extern bucket *nostyle_bucket(void);
+
+ extern int color_style_1(const char *string);
+ extern int color_style_3(const char *p, const char *q, const char *r);
+ extern void free_hashStyles(void);
+ extern void report_hashStyles(void);
+
+ extern int s_a;
+ extern int s_aedit;
+ extern int s_aedit_arr;
+ extern int s_aedit_pad;
+ extern int s_aedit_sel;
+ extern int s_alert;
+ extern int s_alink;
+ extern int s_curedit;
+ extern int s_forw_backw;
+ extern int s_hot_paste;
+ extern int s_menu_active;
+ extern int s_menu_bg;
+ extern int s_menu_entry;
+ extern int s_menu_frame;
+ extern int s_menu_number;
+ extern int s_menu_sb;
+ extern int s_normal;
+ extern int s_prompt_edit;
+ extern int s_prompt_edit_arr;
+ extern int s_prompt_edit_pad;
+ extern int s_prompt_sel;
+ extern int s_status;
+ extern int s_title;
+ extern int s_whereis;
+
+#ifdef USE_SCROLLBAR
+ extern int s_sb_aa;
+ extern int s_sb_bar;
+ extern int s_sb_bg;
+ extern int s_sb_naa;
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* _LYHASH_H_ */
diff --git a/src/LYHistory.c b/src/LYHistory.c
new file mode 100644
index 0000000..4fd5567
--- /dev/null
+++ b/src/LYHistory.c
@@ -0,0 +1,1163 @@
+/*
+ * $LynxId: LYHistory.c,v 1.94 2021/06/09 22:55:43 tom Exp $
+ */
+#include <HTUtils.h>
+#include <HTTP.h>
+#include <GridText.h>
+#include <HTAlert.h>
+#include <HText.h>
+#include <LYGlobalDefs.h>
+#include <LYUtils.h>
+#include <LYHistory.h>
+#include <LYPrint.h>
+#include <LYDownload.h>
+#include <LYOptions.h>
+#include <LYKeymap.h>
+#include <LYList.h>
+#include <LYShowInfo.h>
+#include <LYStrings.h>
+#include <LYCharUtils.h>
+#include <LYCharSets.h>
+#include <LYrcFile.h>
+#ifdef DISP_PARTIAL
+#include <LYMainLoop.h>
+#endif
+
+#ifdef DIRED_SUPPORT
+#include <LYUpload.h>
+#include <LYLocal.h>
+#endif /* DIRED_SUPPORT */
+
+#include <LYexit.h>
+#include <LYLeaks.h>
+#include <HTCJK.h>
+
+HTList *Visited_Links = NULL; /* List of safe popped docs. */
+int Visited_Links_As = VISITED_LINKS_AS_LATEST | VISITED_LINKS_REVERSE;
+
+static VisitedLink *PrevVisitedLink = NULL; /* NULL on auxiliary */
+static VisitedLink *PrevActiveVisitedLink = NULL; /* Last non-auxillary */
+static VisitedLink Latest_first;
+static VisitedLink Latest_last;
+static VisitedLink *Latest_tree;
+static VisitedLink *First_tree;
+static VisitedLink *Last_by_first;
+
+int nhist_extra;
+
+#ifdef LY_FIND_LEAKS
+static int already_registered_free_messages_stack = 0;
+static int already_registered_clean_all_history = 0;
+#endif
+
+#ifdef LY_FIND_LEAKS
+/*
+ * Utility for freeing the list of visited links. - FM
+ */
+static void Visited_Links_free(void)
+{
+ VisitedLink *vl;
+ HTList *cur = Visited_Links;
+
+ PrevVisitedLink = NULL;
+ PrevActiveVisitedLink = NULL;
+ if (!cur)
+ return;
+
+ while (NULL != (vl = (VisitedLink *) HTList_nextObject(cur))) {
+ FREE(vl->address);
+ FREE(vl->title);
+ FREE(vl);
+ }
+ HTList_delete(Visited_Links);
+ Visited_Links = NULL;
+ Latest_last.prev_latest = &Latest_first;
+ Latest_first.next_latest = &Latest_last;
+ Last_by_first = Latest_tree = First_tree = 0;
+ return;
+}
+#endif /* LY_FIND_LEAKS */
+
+#ifdef DEBUG
+static void trace_history(const char *tag)
+{
+ if (TRACE) {
+ CTRACE((tfp, "HISTORY %s %d/%u (%d extra)\n",
+ tag, nhist, size_history, nhist_extra));
+ CTRACE_FLUSH(tfp);
+ }
+}
+#else
+#define trace_history(tag) /* nothing */
+#endif /* DEBUG */
+
+/*
+ * Utility for listing visited links, making any repeated links the most
+ * current in the list. - FM
+ */
+void LYAddVisitedLink(DocInfo *doc)
+{
+ VisitedLink *tmp;
+ HTList *cur;
+ const char *title = (doc->title ? doc->title : NO_TITLE);
+
+ if (isEmpty(doc->address)) {
+ PrevVisitedLink = NULL;
+ return;
+ }
+
+ /*
+ * Exclude POST or HEAD replies, and bookmark, menu or list files. - FM
+ */
+ if (doc->post_data || doc->isHEAD || doc->bookmark ||
+ ( /* special url or a temp file */
+ (!StrNCmp(doc->address, "LYNX", 4) ||
+ !StrNCmp(doc->address, "file://localhost/", 17)))) {
+ int related = 1; /* First approximation only */
+
+ if (LYIsUIPage(doc->address, UIP_HISTORY) ||
+ LYIsUIPage(doc->address, UIP_VLINKS) ||
+ LYIsUIPage(doc->address, UIP_SHOWINFO) ||
+ isLYNXMESSAGES(doc->address) ||
+ ((related = 0) != 0) ||
+#ifdef DIRED_SUPPORT
+ LYIsUIPage(doc->address, UIP_DIRED_MENU) ||
+ LYIsUIPage(doc->address, UIP_UPLOAD_OPTIONS) ||
+ LYIsUIPage(doc->address, UIP_PERMIT_OPTIONS) ||
+#endif /* DIRED_SUPPORT */
+ LYIsUIPage(doc->address, UIP_PRINT_OPTIONS) ||
+ LYIsUIPage(doc->address, UIP_DOWNLOAD_OPTIONS) ||
+ LYIsUIPage(doc->address, UIP_OPTIONS_MENU) ||
+ isLYNXEDITMAP(doc->address) ||
+ isLYNXKEYMAP(doc->address) ||
+ LYIsUIPage(doc->address, UIP_LIST_PAGE) ||
+#ifdef USE_ADDRLIST_PAGE
+ LYIsUIPage(doc->address, UIP_ADDRLIST_PAGE) ||
+#endif
+ LYIsUIPage(doc->address, UIP_CONFIG_DEF) ||
+ LYIsUIPage(doc->address, UIP_LYNXCFG) ||
+ isLYNXCOOKIE(doc->address) ||
+ LYIsUIPage(doc->address, UIP_TRACELOG)) {
+ if (!related)
+ PrevVisitedLink = NULL;
+ return;
+ }
+ }
+
+ if (!Visited_Links) {
+ Visited_Links = HTList_new();
+#ifdef LY_FIND_LEAKS
+ atexit(Visited_Links_free);
+#endif
+ Latest_last.prev_latest = &Latest_first;
+ Latest_first.next_latest = &Latest_last;
+ Latest_last.next_latest = NULL; /* Find bugs quick! */
+ Latest_first.prev_latest = NULL;
+ Last_by_first = Latest_tree = First_tree = NULL;
+ }
+
+ cur = Visited_Links;
+ while (NULL != (tmp = (VisitedLink *) HTList_nextObject(cur))) {
+ if (!strcmp(NonNull(tmp->address),
+ NonNull(doc->address))) {
+ PrevVisitedLink = PrevActiveVisitedLink = tmp;
+ /* Already visited. Update the last-visited info. */
+ if (tmp->next_latest == &Latest_last) /* optimization */
+ return;
+
+ /* Remove from "latest" chain */
+ tmp->prev_latest->next_latest = tmp->next_latest;
+ tmp->next_latest->prev_latest = tmp->prev_latest;
+
+ /* Insert at the end of the "latest" chain */
+ Latest_last.prev_latest->next_latest = tmp;
+ tmp->prev_latest = Latest_last.prev_latest;
+ tmp->next_latest = &Latest_last;
+ Latest_last.prev_latest = tmp;
+ return;
+ }
+ }
+
+ if ((tmp = typecalloc(VisitedLink)) == NULL)
+ outofmem(__FILE__, "LYAddVisitedLink");
+
+ StrAllocCopy(tmp->address, doc->address);
+ LYformTitle(&(tmp->title), title);
+
+ /* First-visited chain */
+ HTList_appendObject(Visited_Links, tmp); /* At end */
+ tmp->prev_first = Last_by_first;
+ Last_by_first = tmp;
+
+ /* Tree structure */
+ if (PrevVisitedLink) {
+ VisitedLink *a = PrevVisitedLink;
+ VisitedLink *b = a->next_tree;
+ int l = PrevVisitedLink->level;
+
+ /* Find last on the deeper levels */
+ while (b && b->level > l)
+ a = b, b = b->next_tree;
+
+ if (!b) /* a == Latest_tree */
+ Latest_tree = tmp;
+ tmp->next_tree = a->next_tree;
+ a->next_tree = tmp;
+
+ tmp->level = PrevVisitedLink->level + 1;
+ } else {
+ if (Latest_tree)
+ Latest_tree->next_tree = tmp;
+ tmp->level = 0;
+ tmp->next_tree = NULL;
+ Latest_tree = tmp;
+ }
+ PrevVisitedLink = PrevActiveVisitedLink = tmp;
+ if (!First_tree)
+ First_tree = tmp;
+
+ /* "latest" chain */
+ Latest_last.prev_latest->next_latest = tmp;
+ tmp->prev_latest = Latest_last.prev_latest;
+ tmp->next_latest = &Latest_last;
+ Latest_last.prev_latest = tmp;
+
+ return;
+}
+
+/*
+ * Returns true if this is a page that we would push onto the stack if not
+ * forced. If docurl is NULL, only the title is considered; otherwise also
+ * check the URL whether it is (likely to be) a generated special page.
+ */
+BOOLEAN LYwouldPush(const char *title,
+ const char *docurl)
+{
+ BOOLEAN rc = FALSE;
+
+ /*
+ * All non-pushable generated pages have URLs that begin with
+ * "file://localhost/" and end with HTML_SUFFIX. - kw
+ */
+ if (docurl) {
+ size_t ulen;
+
+ if (StrNCmp(docurl, "file://localhost/", 17) != 0 ||
+ (ulen = strlen(docurl)) <= strlen(HTML_SUFFIX) ||
+ strcmp(docurl + ulen - strlen(HTML_SUFFIX), HTML_SUFFIX) != 0) {
+ /*
+ * If it is not a local HTML file, it may be a Web page that
+ * accidentally has the same title. So return TRUE now. - kw
+ */
+ return TRUE;
+ }
+ }
+
+ if (docurl) {
+ rc = (BOOLEAN)
+ !(LYIsUIPage(docurl, UIP_HISTORY)
+ || LYIsUIPage(docurl, UIP_PRINT_OPTIONS)
+#ifdef DIRED_SUPPORT
+ || LYIsUIPage(docurl, UIP_DIRED_MENU)
+ || LYIsUIPage(docurl, UIP_UPLOAD_OPTIONS)
+ || LYIsUIPage(docurl, UIP_PERMIT_OPTIONS)
+#endif /* DIRED_SUPPORT */
+ );
+ } else {
+ rc = (BOOLEAN)
+ !(!strcmp(title, HISTORY_PAGE_TITLE)
+ || !strcmp(title, PRINT_OPTIONS_TITLE)
+#ifdef DIRED_SUPPORT
+ || !strcmp(title, DIRED_MENU_TITLE)
+ || !strcmp(title, UPLOAD_OPTIONS_TITLE)
+ || !strcmp(title, PERMIT_OPTIONS_TITLE)
+#endif /* DIRED_SUPPORT */
+ );
+ }
+ return rc;
+}
+
+/*
+ * Free post-data for 'DocInfo'
+ */
+void LYFreePostData(DocInfo *doc)
+{
+ BStrFree(doc->post_data);
+ FREE(doc->post_content_type);
+}
+
+/*
+ * Free strings associated with a 'DocInfo' struct.
+ */
+void LYFreeDocInfo(DocInfo *doc)
+{
+ FREE(doc->title);
+ FREE(doc->address);
+ FREE(doc->bookmark);
+ LYFreePostData(doc);
+}
+
+/*
+ * Free the information in the last history entry.
+ */
+static void clean_extra_history(void)
+{
+ trace_history("clean_extra_history");
+ nhist += nhist_extra;
+ while (nhist_extra > 0) {
+ nhist--;
+ LYFreeDocInfo(&HDOC(nhist));
+ nhist_extra--;
+ }
+ trace_history("...clean_extra_history");
+}
+
+/*
+ * Free the entire history stack, for auditing memory leaks.
+ */
+#ifdef LY_FIND_LEAKS
+static void clean_all_history(void)
+{
+ trace_history("clean_all_history");
+ clean_extra_history();
+ while (nhist > 0) {
+ nhist--;
+ LYFreeDocInfo(&HDOC(nhist));
+ }
+ trace_history("...clean_all_history");
+}
+#endif
+
+/* FIXME What is the relationship to are_different() from the mainloop?! */
+static int are_identical(HistInfo * doc, DocInfo *doc1)
+{
+ return (STREQ(doc1->address, doc->hdoc.address)
+ && BINEQ(doc1->post_data, doc->hdoc.post_data)
+ && !strcmp(NonNull(doc1->bookmark),
+ NonNull(doc->hdoc.bookmark))
+ && doc1->isHEAD == doc->hdoc.isHEAD);
+}
+
+void LYAllocHistory(unsigned entries)
+{
+ CTRACE((tfp, "LYAllocHistory %u vs %u\n", entries, size_history));
+ if (entries + 1 >= size_history) {
+ size_t want;
+ unsigned save = size_history;
+
+ size_history += (entries + 2) * 2;
+ want = ((size_t) size_history) * sizeof(*history);
+
+ if (history == 0) {
+ history = typecallocn(HistInfo, want);
+ } else {
+ history = typeRealloc(HistInfo, history, want);
+ memset(&history[save], 0, size_history - save);
+ }
+ if (history == 0)
+ outofmem(__FILE__, "LYAllocHistory");
+ }
+ CTRACE((tfp, "...LYAllocHistory %u vs %u\n", entries, size_history));
+}
+
+/*
+ * Push the current filename, link and line number onto the history list.
+ */
+int LYpush(DocInfo *doc, int force_push)
+{
+ /*
+ * Don't push NULL file names.
+ */
+ if (*doc->address == '\0')
+ return 0;
+
+ /*
+ * Check whether this is a document we don't push unless forced. - FM
+ */
+ if (!force_push) {
+ /*
+ * Don't push the history, printer, or download lists.
+ */
+ if (!LYwouldPush(doc->title, doc->address)) {
+ if (!LYforce_no_cache)
+ LYoverride_no_cache = TRUE;
+ return 0;
+ }
+ }
+
+ /*
+ * If file is identical to one before it, don't push it.
+ * But do not duplicate it if there is only one on the stack,
+ * note that HDOC() starts from 0, so nhist should be > 0.
+ */
+ if (nhist >= 1 && are_identical(&(history[nhist - 1]), doc)) {
+ if (HDOC(nhist - 1).internal_link == doc->internal_link) {
+ /* But it is nice to have the last position remembered!
+ - kw */
+ HDOC(nhist - 1).link = doc->link;
+ HDOC(nhist - 1).line = doc->line;
+ return 0;
+ }
+ }
+
+ /*
+ * If file is identical to the current document, just move the pointer.
+ */
+ if (nhist_extra >= 1 && are_identical(&(history[nhist]), doc)) {
+ HDOC(nhist).link = doc->link;
+ HDOC(nhist).line = doc->line;
+ nhist_extra--;
+ LYAllocHistory((unsigned) nhist);
+ nhist++;
+ trace_history("LYpush: just move the cursor");
+ return 1;
+ }
+
+ clean_extra_history();
+#ifdef LY_FIND_LEAKS
+ if (!already_registered_clean_all_history) {
+ already_registered_clean_all_history = 1;
+ atexit(clean_all_history);
+ }
+#endif
+
+ /*
+ * OK, push it...
+ */
+ LYAllocHistory((unsigned) nhist);
+ HDOC(nhist).link = doc->link;
+ HDOC(nhist).line = doc->line;
+
+ HDOC(nhist).title = NULL;
+ LYformTitle(&(HDOC(nhist).title), doc->title);
+
+ HDOC(nhist).address = NULL;
+ StrAllocCopy(HDOC(nhist).address, doc->address);
+
+ HDOC(nhist).post_data = NULL;
+ BStrCopy(HDOC(nhist).post_data, doc->post_data);
+
+ HDOC(nhist).post_content_type = NULL;
+ StrAllocCopy(HDOC(nhist).post_content_type, doc->post_content_type);
+
+ HDOC(nhist).bookmark = NULL;
+ StrAllocCopy(HDOC(nhist).bookmark, doc->bookmark);
+
+ HDOC(nhist).isHEAD = doc->isHEAD;
+ HDOC(nhist).safe = doc->safe;
+
+ HDOC(nhist).internal_link = FALSE; /* by default */
+ history[nhist].intern_seq_start = -1; /* by default */
+ if (doc->internal_link) {
+ /* Now some tricky stuff: if the caller thinks that the doc
+ to push was the result of following an internal
+ (fragment) link, we check whether we believe it.
+ It is only accepted as valid if the immediately preceding
+ item on the history stack is actually the same document
+ except for fragment and location info. I.e. the Parent
+ Anchors are the same.
+ Also of course this requires that this is not the first
+ history item. - kw */
+ if (nhist > 0) {
+ DocAddress WWWDoc;
+ HTParentAnchor *thisparent, *thatparent = NULL;
+
+ WWWDoc.address = doc->address;
+ WWWDoc.post_data = doc->post_data;
+ WWWDoc.post_content_type = doc->post_content_type;
+ WWWDoc.bookmark = doc->bookmark;
+ WWWDoc.isHEAD = doc->isHEAD;
+ WWWDoc.safe = doc->safe;
+ thisparent =
+ HTAnchor_findAddress(&WWWDoc);
+ /* Now find the ParentAnchor for the previous history
+ * item - kw
+ */
+ if (thisparent) {
+ /* If the last-pushed item is a LYNXIMGMAP but THIS one
+ * isn't, compare the physical URLs instead. - kw
+ */
+ if (isLYNXIMGMAP(HDOC(nhist - 1).address) &&
+ !isLYNXIMGMAP(doc->address)) {
+ WWWDoc.address = HDOC(nhist - 1).address + LEN_LYNXIMGMAP;
+ /*
+ * If THIS item is a LYNXIMGMAP but the last-pushed one
+ * isn't, fake it by using THIS item's address for
+ * thatparent... - kw
+ */
+ } else if (isLYNXIMGMAP(doc->address) &&
+ !isLYNXIMGMAP(HDOC(nhist - 1).address)) {
+ char *temp = NULL;
+
+ StrAllocCopy(temp, STR_LYNXIMGMAP);
+ StrAllocCat(temp, doc->address + LEN_LYNXIMGMAP);
+ WWWDoc.address = temp;
+ WWWDoc.post_content_type = HDOC(nhist - 1).post_content_type;
+ WWWDoc.bookmark = HDOC(nhist - 1).bookmark;
+ WWWDoc.isHEAD = HDOC(nhist - 1).isHEAD;
+ WWWDoc.safe = HDOC(nhist - 1).safe;
+ thatparent =
+ HTAnchor_findAddress(&WWWDoc);
+ FREE(temp);
+ } else {
+ WWWDoc.address = HDOC(nhist - 1).address;
+ }
+ if (!thatparent) { /* if not yet done */
+ WWWDoc.post_data = HDOC(nhist - 1).post_data;
+ WWWDoc.post_content_type = HDOC(nhist - 1).post_content_type;
+ WWWDoc.bookmark = HDOC(nhist - 1).bookmark;
+ WWWDoc.isHEAD = HDOC(nhist - 1).isHEAD;
+ WWWDoc.safe = HDOC(nhist - 1).safe;
+ thatparent =
+ HTAnchor_findAddress(&WWWDoc);
+ }
+ /* In addition to equality of the ParentAnchors, require
+ * that IF we have a HTMainText (i.e., it wasn't just
+ * HTuncache'd by mainloop), THEN it has to be consistent
+ * with what we are trying to push.
+ *
+ * This may be overkill... - kw
+ */
+ if (thatparent == thisparent &&
+ (!HTMainText || HTMainAnchor == thisparent)
+ ) {
+ HDOC(nhist).internal_link = TRUE;
+ history[nhist].intern_seq_start =
+ history[nhist - 1].intern_seq_start >= 0 ?
+ history[nhist - 1].intern_seq_start : nhist - 1;
+ CTRACE((tfp, "\nLYpush: pushed as internal link, OK\n"));
+ }
+ }
+ }
+ if (!HDOC(nhist).internal_link) {
+ CTRACE((tfp, "\nLYpush: push as internal link requested, %s\n",
+ "but didn't check out!"));
+ }
+ }
+ CTRACE((tfp, "\nLYpush[%d]: address:%s\n title:%s\n",
+ nhist, doc->address, doc->title));
+ nhist++;
+ return 1;
+}
+
+/*
+ * Pop the previous filename, link and line number from the history list.
+ */
+void LYpop(DocInfo *doc)
+{
+ if (nhist > 0) {
+ clean_extra_history();
+ nhist--;
+
+ LYFreeDocInfo(doc);
+
+ *doc = HDOC(nhist);
+
+#ifdef DISP_PARTIAL
+ /* assume we pop the 'doc' to show it soon... */
+ LYSetNewline(doc->line); /* reinitialize */
+#endif /* DISP_PARTIAL */
+ CTRACE((tfp, "LYpop[%d]: address:%s\n title:%s\n",
+ nhist, doc->address, doc->title));
+ }
+}
+
+/*
+ * Move to the previous filename, link and line number from the history list.
+ */
+void LYhist_prev(DocInfo *doc)
+{
+ trace_history("LYhist_prev");
+ if (nhist > 0 && (nhist_extra || (unsigned) nhist < size_history)) {
+ nhist--;
+ nhist_extra++;
+ LYpop_num(nhist, doc);
+ trace_history("...LYhist_prev");
+ }
+}
+
+/*
+ * Called before calling LYhist_prev().
+ */
+void LYhist_prev_register(DocInfo *doc)
+{
+ trace_history("LYhist_prev_register");
+ if (nhist > 1) {
+ if (nhist_extra) { /* Make something to return back */
+ /* Store the new position */
+ HDOC(nhist).link = doc->link;
+ HDOC(nhist).line = doc->line;
+ } else if (LYpush(doc, 0)) {
+ nhist--;
+ nhist_extra++;
+ }
+ trace_history("...LYhist_prev_register");
+ }
+}
+
+/*
+ * Move to the next filename, link and line number from the history.
+ */
+int LYhist_next(DocInfo *doc, DocInfo *newdoc)
+{
+ if (nhist_extra <= 1) /* == 1 when we are the last one */
+ return 0;
+ /* Store the new position */
+ HDOC(nhist).link = doc->link;
+ HDOC(nhist).line = doc->line;
+ LYAllocHistory((unsigned) nhist);
+ nhist++;
+ nhist_extra--;
+ LYpop_num(nhist, newdoc);
+ return 1;
+}
+
+/*
+ * Pop the specified hist entry, link and line number from the history list but
+ * don't actually remove the entry, just return it.
+ * (This procedure is badly named :)
+ */
+void LYpop_num(int number,
+ DocInfo *doc)
+{
+ if (number >= 0 && (nhist + nhist_extra) > number) {
+ doc->link = HDOC(number).link;
+ doc->line = HDOC(number).line;
+ StrAllocCopy(doc->title, HDOC(number).title);
+ StrAllocCopy(doc->address, HDOC(number).address);
+ BStrCopy(doc->post_data, HDOC(number).post_data);
+ StrAllocCopy(doc->post_content_type, HDOC(number).post_content_type);
+ StrAllocCopy(doc->bookmark, HDOC(number).bookmark);
+ doc->isHEAD = HDOC(number).isHEAD;
+ doc->safe = HDOC(number).safe;
+ doc->internal_link = HDOC(number).internal_link; /* ?? */
+#ifdef DISP_PARTIAL
+ /* assume we pop the 'doc' to show it soon... */
+ LYSetNewline(doc->line); /* reinitialize */
+#endif /* DISP_PARTIAL */
+ if (TRACE) {
+ CTRACE((tfp, "LYpop_num(%d)\n", number));
+ CTRACE((tfp, " link %d\n", doc->link));
+ CTRACE((tfp, " line %d\n", doc->line));
+ CTRACE((tfp, " title %s\n", NonNull(doc->title)));
+ CTRACE((tfp, " address %s\n", NonNull(doc->address)));
+ }
+ }
+}
+
+/*
+ * This procedure outputs the history buffer into a temporary file.
+ */
+int showhistory(char **newfile)
+{
+ static char tempfile[LY_MAXPATH] = "\0";
+ char *Title = NULL;
+ int x = 0;
+ FILE *fp0;
+
+ if ((fp0 = InternalPageFP(tempfile, TRUE)) == 0)
+ return (-1);
+
+ LYLocalFileToURL(newfile, tempfile);
+
+ LYforce_HTML_mode = TRUE; /* force this file to be HTML */
+ LYforce_no_cache = TRUE; /* force this file to be new */
+
+ BeginInternalPage(fp0, HISTORY_PAGE_TITLE, HISTORY_PAGE_HELP);
+
+ fprintf(fp0, "<p align=right> <a href=\"%s\">[%s]</a>\n",
+ STR_LYNXMESSAGES, STATUSLINES_TITLE);
+
+ fprintf(fp0, "<pre>\n");
+
+ fprintf(fp0, "<em>%s</em>\n", gettext("You selected:"));
+ for (x = nhist + nhist_extra - 1; x >= 0; x--) {
+ /*
+ * The number of the document in the hist stack, its title in a link,
+ * and its address. - FM
+ */
+ if (HDOC(x).title != NULL) {
+ StrAllocCopy(Title, HDOC(x).title);
+ LYEntify(&Title, TRUE);
+ LYTrimLeading(Title);
+ LYTrimTrailing(Title);
+ if (*Title == '\0')
+ StrAllocCopy(Title, NO_TITLE);
+ } else {
+ StrAllocCopy(Title, NO_TITLE);
+ }
+ fprintf(fp0,
+ "%s<em>%d</em>. <tab id=t%d><a href=\"%s%d\">%s</a>\n",
+ (x > 99 ? "" : x < 10 ? " " : " "),
+ x, x, STR_LYNXHIST, x, Title);
+ if (HDOC(x).address != NULL) {
+ StrAllocCopy(Title, HDOC(x).address);
+ LYEntify(&Title, TRUE);
+ } else {
+ StrAllocCopy(Title, gettext("(no address)"));
+ }
+ if (HDOC(x).internal_link) {
+ if (history[x].intern_seq_start == history[nhist - 1].intern_seq_start)
+ StrAllocCat(Title, gettext(" (internal)"));
+ else
+ StrAllocCat(Title, gettext(" (was internal)"));
+ }
+ fprintf(fp0, "<tab to=t%d>%s\n", x, Title);
+ }
+ fprintf(fp0, "</pre>\n");
+ EndInternalPage(fp0);
+
+ LYCloseTempFP(fp0);
+ FREE(Title);
+ return (0);
+}
+
+/*
+ * This function makes the history page seem like any other type of file since
+ * more info is needed than can be provided by the normal link structure. We
+ * saved out the history number to a special URL.
+ *
+ * The info looks like: LYNXHIST:#
+ */
+BOOLEAN historytarget(DocInfo *newdoc)
+{
+ int number;
+ DocAddress WWWDoc;
+ HTParentAnchor *tmpanchor;
+ HText *text;
+ BOOLEAN treat_as_intern = FALSE;
+
+ if ((!newdoc || !newdoc->address) ||
+ strlen(newdoc->address) < 10 || !isdigit(UCH(*(newdoc->address + 9))))
+ return (FALSE);
+
+ if ((number = atoi(newdoc->address + 9)) > nhist + nhist_extra || number < 0)
+ return (FALSE);
+
+ /*
+ * Optimization: assume we came from the History Page,
+ * so never return back - always a new version next time.
+ * But check first whether HTMainText is really the History
+ * Page document - in some obscure situations this may not be
+ * the case. If HTMainText seems to be a History Page document,
+ * also check that it really hasn't been pushed. - LP, kw
+ */
+ if (HTMainText && nhist > 0 &&
+ !strcmp(HTLoadedDocumentTitle(), HISTORY_PAGE_TITLE) &&
+ LYIsUIPage3(HTLoadedDocumentURL(), UIP_HISTORY, 0) &&
+ strcmp(HTLoadedDocumentURL(), HDOC(nhist - 1).address)) {
+ HTuncache_current_document(); /* don't waste the cache */
+ }
+
+ LYpop_num(number, newdoc);
+ if (((newdoc->internal_link &&
+ history[number].intern_seq_start == history[nhist - 1].intern_seq_start)
+ || (number < nhist - 1 &&
+ HDOC(nhist - 1).internal_link &&
+ number == history[nhist - 1].intern_seq_start))
+ && !(LYforce_no_cache == TRUE && LYoverride_no_cache == FALSE)) {
+ if (track_internal_links) {
+ LYforce_no_cache = FALSE;
+ LYinternal_flag = TRUE;
+ newdoc->internal_link = TRUE;
+ treat_as_intern = TRUE;
+ }
+ } else {
+ newdoc->internal_link = FALSE;
+ }
+ /*
+ * If we have POST content, and have LYresubmit_posts set or have no_cache
+ * set or do not still have the text cached, ask the user whether to
+ * resubmit the form. - FM
+ */
+ if (newdoc->post_data != NULL) {
+ WWWDoc.address = newdoc->address;
+ WWWDoc.post_data = newdoc->post_data;
+ WWWDoc.post_content_type = newdoc->post_content_type;
+ WWWDoc.bookmark = newdoc->bookmark;
+ WWWDoc.isHEAD = newdoc->isHEAD;
+ WWWDoc.safe = newdoc->safe;
+ tmpanchor = HTAnchor_findAddress(&WWWDoc);
+ text = (HText *) HTAnchor_document(tmpanchor);
+ if (((((LYresubmit_posts == TRUE) ||
+ (LYforce_no_cache == TRUE &&
+ LYoverride_no_cache == FALSE)) &&
+ !(treat_as_intern && !reloading)) ||
+ text == NULL) &&
+ (isLYNXIMGMAP(newdoc->address) ||
+ HTConfirm(CONFIRM_POST_RESUBMISSION) == TRUE)) {
+ LYforce_no_cache = TRUE;
+ LYoverride_no_cache = FALSE;
+ } else if (text != NULL) {
+ LYforce_no_cache = FALSE;
+ LYoverride_no_cache = TRUE;
+ } else {
+ HTInfoMsg(CANCELLED);
+ return (FALSE);
+ }
+ }
+
+ if (number != 0)
+ StrAllocCat(newdoc->title, gettext(" (From History)"));
+ return (TRUE);
+}
+
+/*
+ * This procedure outputs the Visited Links list into a temporary file. - FM
+ * Returns links's number to make active (1-based), or 0 if not required.
+ */
+int LYShowVisitedLinks(char **newfile)
+{
+ static char tempfile[LY_MAXPATH] = "\0";
+ char *Title = NULL;
+ char *Address = NULL;
+ int x, tot;
+ FILE *fp0;
+ VisitedLink *vl;
+ HTList *cur = Visited_Links;
+ int offset;
+ int ret = 0;
+ const char *arrow, *post_arrow;
+
+ if (!cur)
+ return (-1);
+
+ if ((fp0 = InternalPageFP(tempfile, TRUE)) == 0)
+ return (-1);
+
+ LYLocalFileToURL(newfile, tempfile);
+ LYRegisterUIPage(*newfile, UIP_VLINKS);
+
+ LYforce_HTML_mode = TRUE; /* force this file to be HTML */
+ LYforce_no_cache = TRUE; /* force this file to be new */
+
+ BeginInternalPage(fp0, VISITED_LINKS_TITLE, VISITED_LINKS_HELP);
+
+#ifndef NO_OPTION_FORMS
+ fprintf(fp0, "<form action=\"%s\" method=\"post\">\n", STR_LYNXOPTIONS);
+ LYMenuVisitedLinks(fp0, FALSE);
+ fprintf(fp0, "<input type=\"submit\" value=\"Accept Changes\">\n");
+ fprintf(fp0, "</form>\n");
+ fprintf(fp0, "<P>\n");
+#endif
+
+ fprintf(fp0, "<pre>\n");
+ fprintf(fp0, "<em>%s</em>\n",
+ gettext("You visited (POSTs, bookmark, menu and list files excluded):"));
+ if (Visited_Links_As & VISITED_LINKS_REVERSE)
+ tot = x = HTList_count(Visited_Links);
+ else
+ tot = x = -1;
+
+ if (Visited_Links_As & VISITED_LINKS_AS_TREE) {
+ vl = First_tree;
+ } else if (Visited_Links_As & VISITED_LINKS_AS_LATEST) {
+ if (Visited_Links_As & VISITED_LINKS_REVERSE)
+ vl = Latest_last.prev_latest;
+ else
+ vl = Latest_first.next_latest;
+ if (vl == &Latest_last || vl == &Latest_first)
+ vl = NULL;
+ } else {
+ if (Visited_Links_As & VISITED_LINKS_REVERSE)
+ vl = Last_by_first;
+ else
+ vl = (VisitedLink *) HTList_nextObject(cur);
+ }
+ while (NULL != vl) {
+ /*
+ * The number of the document (most recent highest), its title in a
+ * link, and its address. - FM
+ */
+ post_arrow = arrow = "";
+ if (Visited_Links_As & VISITED_LINKS_REVERSE)
+ x--;
+ else
+ x++;
+ if (vl == PrevActiveVisitedLink) {
+ if (Visited_Links_As & VISITED_LINKS_REVERSE)
+ ret = tot - x + 2;
+ else
+ ret = x + 3;
+ }
+ if (vl == PrevActiveVisitedLink) {
+ post_arrow = "<A NAME=current></A>";
+ /* Otherwise levels 0 and 1 look the same when with arrow: */
+ arrow = (vl->level && (Visited_Links_As & VISITED_LINKS_AS_TREE))
+ ? "==>" : "=>";
+ StrAllocCat(*newfile, "#current");
+ }
+ if (Visited_Links_As & VISITED_LINKS_AS_TREE) {
+ offset = 2 * vl->level;
+ if (offset > 24)
+ offset = (offset + 24) / 2;
+ if (offset > LYcols * 3 / 4)
+ offset = LYcols * 3 / 4;
+ } else
+ offset = (x > 99 ? 0 : x < 10 ? 2 : 1);
+ if (non_empty(vl->title)) {
+ StrAllocCopy(Title, vl->title);
+ LYEntify(&Title, TRUE);
+ LYTrimLeading(Title);
+ LYTrimTrailing(Title);
+ if (*Title == '\0')
+ StrAllocCopy(Title, NO_TITLE);
+ } else {
+ StrAllocCopy(Title, NO_TITLE);
+ }
+ if (non_empty(vl->address)) {
+ StrAllocCopy(Address, vl->address);
+ LYEntify(&Address, FALSE);
+ fprintf(fp0,
+ "%-*s%s<em>%d</em>. <tab id=t%d><a href=\"%s\">%s</a>\n",
+ offset, arrow, post_arrow,
+ x, x, Address, Title);
+ } else {
+ fprintf(fp0,
+ "%-*s%s<em>%d</em>. <tab id=t%d><em>%s</em>\n",
+ offset, arrow, post_arrow,
+ x, x, Title);
+ }
+ if (Address != NULL) {
+ StrAllocCopy(Address, vl->address);
+ LYEntify(&Address, TRUE);
+ }
+ fprintf(fp0, "<tab to=t%d>%s\n", x,
+ ((Address != NULL) ? Address : gettext("(no address)")));
+ if (Visited_Links_As & VISITED_LINKS_AS_TREE)
+ vl = vl->next_tree;
+ else if (Visited_Links_As & VISITED_LINKS_AS_LATEST) {
+ if (Visited_Links_As & VISITED_LINKS_REVERSE)
+ vl = vl->prev_latest;
+ else
+ vl = vl->next_latest;
+ if (vl == &Latest_last || vl == &Latest_first)
+ vl = NULL;
+ } else {
+ if (Visited_Links_As & VISITED_LINKS_REVERSE)
+ vl = vl->prev_first;
+ else
+ vl = (VisitedLink *) HTList_nextObject(cur);
+ }
+ }
+ fprintf(fp0, "</pre>\n");
+ EndInternalPage(fp0);
+
+ LYCloseTempFP(fp0);
+ FREE(Title);
+ FREE(Address);
+ return (ret);
+}
+
+/*
+ * Keep cycled buffer for statusline messages.
+ * But allow user to change how big it will be from userdefs.h
+ */
+#ifndef STATUSBUFSIZE
+#define STATUSBUFSIZE 40
+#endif
+
+int status_buf_size = STATUSBUFSIZE;
+
+static char **buffstack;
+static int topOfStack = 0;
+
+#ifdef LY_FIND_LEAKS
+static void free_messages_stack(void)
+{
+ if (buffstack != 0) {
+ topOfStack = status_buf_size;
+
+ while (--topOfStack >= 0) {
+ FREE(buffstack[topOfStack]);
+ }
+ FREE(buffstack);
+ }
+}
+#endif
+
+static void to_stack(char *str)
+{
+ /*
+ * Cycle buffer:
+ */
+ if (topOfStack >= status_buf_size) {
+ topOfStack = 0;
+ }
+
+ /*
+ * Register string.
+ */
+ if (buffstack == 0)
+ buffstack = typecallocn(char *, (size_t) status_buf_size);
+
+ FREE(buffstack[topOfStack]);
+ buffstack[topOfStack] = str;
+ topOfStack++;
+#ifdef LY_FIND_LEAKS
+ if (!already_registered_free_messages_stack) {
+ already_registered_free_messages_stack = 1;
+ atexit(free_messages_stack);
+ }
+#endif
+ if (topOfStack >= status_buf_size) {
+ topOfStack = 0;
+ }
+}
+
+/*
+ * Dump statusline messages into the buffer.
+ * Called from mainloop() when exit immediately with an error:
+ * can not access startfile (first_file) so a couple of alert messages
+ * will be very useful on exit.
+ * (Don't expect everyone will look a trace log in case of difficulties:))
+ */
+void LYstatusline_messages_on_exit(char **buf)
+{
+ int i;
+
+ if (buffstack != 0) {
+ StrAllocCat(*buf, "\n");
+ /* print messages in chronological order:
+ * probably a single message but let's do it.
+ */
+ i = topOfStack - 1;
+ while (++i < status_buf_size) {
+ if (buffstack[i] != NULL) {
+ StrAllocCat(*buf, buffstack[i]);
+ StrAllocCat(*buf, "\n");
+ }
+ }
+ i = -1;
+ while (++i < topOfStack) {
+ if (buffstack[i] != NULL) {
+ StrAllocCat(*buf, buffstack[i]);
+ StrAllocCat(*buf, "\n");
+ }
+ }
+ }
+}
+
+void LYstore_message2(const char *message,
+ const char *argument)
+{
+
+ if (message != NULL) {
+ char *temp = NULL;
+
+ HTSprintf0(&temp, message, NonNull(argument));
+ to_stack(temp);
+ }
+}
+
+void LYstore_message(const char *message)
+{
+ if (message != NULL) {
+ char *temp = NULL;
+
+ StrAllocCopy(temp, message);
+ to_stack(temp);
+ }
+}
+
+/* LYLoadMESSAGES
+ * --------------
+ * Create a text/html stream with a list of recent statusline messages.
+ * LYNXMESSAGES:/ internal page.
+ * [implementation based on LYLoadKeymap()].
+ */
+
+static int LYLoadMESSAGES(const char *arg GCC_UNUSED,
+ HTParentAnchor *anAnchor,
+ HTFormat format_out,
+ HTStream *sink)
+{
+ HTFormat format_in = WWW_HTML;
+ HTStream *target = NULL;
+ char *buf = NULL;
+ int nummsg = 0;
+
+ int i;
+ char *temp = NULL;
+
+ if (buffstack != 0) {
+ i = status_buf_size;
+ while (--i >= 0) {
+ if (buffstack[i] != NULL)
+ nummsg++;
+ }
+ }
+
+ /*
+ * Set up the stream. - FM
+ */
+ target = HTStreamStack(format_in, format_out, sink, anAnchor);
+
+ if (target == NULL) {
+ HTSprintf0(&buf, CANNOT_CONVERT_I_TO_O,
+ HTAtom_name(format_in), HTAtom_name(format_out));
+ HTAlert(buf);
+ FREE(buf);
+ return (HT_NOT_LOADED);
+ }
+ anAnchor->no_cache = TRUE;
+
+#define PUTS(buf) (*target->isa->put_block)(target, buf, (int) strlen(buf))
+
+ HTSprintf0(&buf, "<html>\n<head>\n");
+ PUTS(buf);
+ /*
+ * This page is a list of messages in display character set.
+ */
+ HTSprintf0(&buf, "<META %s content=\"" STR_HTML ";charset=%s\">\n",
+ "http-equiv=\"content-type\"",
+ LYCharSet_UC[current_char_set].MIMEname);
+ PUTS(buf);
+ HTSprintf0(&buf, "<title>%s</title>\n</head>\n<body>\n",
+ STATUSLINES_TITLE);
+ PUTS(buf);
+
+ if (nummsg != 0) {
+ HTSprintf0(&buf, "<ol>\n");
+ PUTS(buf);
+ /* print messages in reverse order: */
+ i = topOfStack;
+ while (--i >= 0) {
+ if (buffstack[i] != NULL) {
+ StrAllocCopy(temp, buffstack[i]);
+ LYEntify(&temp, TRUE);
+ HTSprintf0(&buf, "<li value=%d> <em>%s</em>\n", nummsg, temp);
+ nummsg--;
+ PUTS(buf);
+ }
+ }
+ i = status_buf_size;
+ while (--i >= topOfStack) {
+ if (buffstack[i] != NULL) {
+ StrAllocCopy(temp, buffstack[i]);
+ LYEntify(&temp, TRUE);
+ HTSprintf0(&buf, "<li value=%d> <em>%s</em>\n", nummsg, temp);
+ nummsg--;
+ PUTS(buf);
+ }
+ }
+ FREE(temp);
+ HTSprintf0(&buf, "</ol>\n</body>\n</html>\n");
+ } else {
+ HTSprintf0(&buf, "<p>%s\n</body>\n</html>\n",
+ gettext("(No messages yet)"));
+ }
+ PUTS(buf);
+
+ (*target->isa->_free) (target);
+ FREE(buf);
+ return (HT_LOADED);
+}
+
+#ifdef GLOBALDEF_IS_MACRO
+#define _LYMESSAGES_C_GLOBALDEF_1_INIT { "LYNXMESSAGES", LYLoadMESSAGES, 0}
+GLOBALDEF(HTProtocol, LYLynxStatusMessages, _LYMESSAGES_C_GLOBALDEF_1_INIT);
+#else
+GLOBALDEF HTProtocol LYLynxStatusMessages =
+{"LYNXMESSAGES", LYLoadMESSAGES, 0};
+#endif /* GLOBALDEF_IS_MACRO */
diff --git a/src/LYHistory.h b/src/LYHistory.h
new file mode 100644
index 0000000..a8f2b1c
--- /dev/null
+++ b/src/LYHistory.h
@@ -0,0 +1,39 @@
+/*
+ * $LynxId: LYHistory.h,v 1.22 2021/06/09 22:33:06 tom Exp $
+ */
+#ifndef LYHISTORY_H
+#define LYHISTORY_H
+
+#ifndef LYSTRUCTS_H
+#include <LYStructs.h>
+#endif /* LYSTRUCTS_H */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ extern BOOLEAN LYwouldPush(const char *title, const char *docurl);
+ extern BOOLEAN historytarget(DocInfo *newdoc);
+ extern int LYShowVisitedLinks(char **newfile);
+ extern int LYhist_next(DocInfo *doc, DocInfo *newdoc);
+ extern int LYpush(DocInfo *doc, int force_push);
+ extern int showhistory(char **newfile);
+ extern void LYAddVisitedLink(DocInfo *doc);
+ extern void LYAllocHistory(unsigned entries);
+ extern void LYFreePostData(DocInfo *data);
+ extern void LYFreeDocInfo(DocInfo *data);
+ extern void LYhist_prev(DocInfo *doc);
+ extern void LYhist_prev_register(DocInfo *doc);
+ extern void LYpop(DocInfo *doc);
+ extern void LYpop_num(int number, DocInfo *doc);
+ extern void LYstatusline_messages_on_exit(char **buf);
+ extern void LYstore_message(const char *message);
+ extern void LYstore_message2(const char *message, const char *argument);
+
+ extern HTList *Visited_Links;
+ extern int nhist_extra;
+ extern int status_buf_size;
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* LYHISTORY_H */
diff --git a/src/LYIcon.rc b/src/LYIcon.rc
new file mode 100644
index 0000000..113a5eb
--- /dev/null
+++ b/src/LYIcon.rc
@@ -0,0 +1,34 @@
+// $LynxId: LYIcon.rc,v 1.55 2023/01/03 00:18:32 tom Exp $
+
+#include <windows.h>
+
+100 ICON "../samples/lynx.ico"
+
+VS_VERSION_INFO VERSIONINFO
+FILEVERSION 2,9,0,1012
+PRODUCTVERSION 2,9,0,1012
+FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
+FILEFLAGS 0
+FILEOS VOS_NT_WINDOWS32
+FILETYPE VFT_APP
+FILESUBTYPE VFT2_UNKNOWN
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904B0"
+ BEGIN
+ VALUE "CompanyName", "https://invisible-island.net/lynx"
+ VALUE "FileDescription", "Lynx - web browser"
+ VALUE "FileVersion", "2.9.0.1012"
+ VALUE "InternalName", "Lynx"
+ VALUE "LegalCopyright", "©1997-2023 Thomas E. Dickey"
+ VALUE "OriginalFilename", "lynx.exe"
+ VALUE "ProductName", "Lynx - web browser"
+ VALUE "ProductVersion", "2.9.0.1012"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+END
diff --git a/src/LYJump.c b/src/LYJump.c
new file mode 100644
index 0000000..877d532
--- /dev/null
+++ b/src/LYJump.c
@@ -0,0 +1,504 @@
+/*
+ * $LynxId: LYJump.c,v 1.52 2018/03/18 19:17:00 tom Exp $
+ */
+#include <HTUtils.h>
+#include <HTAlert.h>
+#include <LYUtils.h>
+#include <LYStrings.h>
+#include <LYGlobalDefs.h>
+#include <LYJump.h>
+#include <LYKeymap.h>
+#include <GridText.h>
+
+#include <LYLeaks.h>
+
+#ifdef _WINDOWS
+#include <stdlib.h> /* bsearch() */
+#endif
+
+#ifdef VMS
+#include <fab.h>
+#endif /* VMS */
+
+struct JumpTable *JThead = NULL;
+
+static int LYCompare(const void *e1, const void *e2);
+static unsigned LYRead_Jumpfile(struct JumpTable *jtp);
+
+void LYJumpTable_free(void)
+{
+ struct JumpTable *cur = JThead;
+ struct JumpTable *next;
+
+ while (cur) {
+ next = cur->next;
+ FREE(cur->msg);
+ FREE(cur->file);
+ FREE(cur->shortcut);
+ if (cur->history) {
+ LYFreeStringList(cur->history);
+ cur->history = NULL;
+ }
+ FREE(cur->table);
+ FREE(cur->mp);
+ FREE(cur);
+ cur = next;
+ }
+ JThead = NULL;
+ return;
+}
+
+/*
+ * Utility for listing shortcuts, making any repeated
+ * shortcut the most current in the list. - FM
+ */
+void LYAddJumpShortcut(HTList *historyp, char *shortcut)
+{
+ char *tmp = NULL;
+ char *old;
+ HTList *cur = historyp;
+
+ if (!historyp || isEmpty(shortcut))
+ return;
+
+ StrAllocCopy(tmp, shortcut);
+
+ while (NULL != (old = (char *) HTList_nextObject(cur))) {
+ if (!strcmp(old, tmp)) {
+ HTList_removeObject(historyp, old);
+ FREE(old);
+ break;
+ }
+ }
+ HTList_addObject(historyp, tmp);
+
+ return;
+}
+
+BOOL LYJumpInit(char *config)
+{
+ struct JumpTable *jtp;
+ char *cp;
+
+ /*
+ * Create a JumpTable structure.
+ */
+ jtp = typecalloc(struct JumpTable);
+
+ if (jtp == NULL) {
+ outofmem(__FILE__, "LYJumpInit");
+ }
+
+ /*
+ * config is JUMPFILE:path[:optional_key[:optional_prompt]]
+ *
+ * Skip JUMPFILE.
+ */
+ cp = strtok(config, ":\n");
+ if (!cp) {
+ FREE(jtp);
+ return FALSE;
+ }
+
+ /*
+ * Get the path.
+ */
+ cp = strtok(NULL, ":\n");
+ if (!cp) {
+ FREE(jtp);
+ return FALSE;
+ }
+ StrAllocCopy(jtp->file, cp);
+#ifdef LY_FIND_LEAKS
+ if (!JThead)
+ atexit(LYJumpTable_free);
+#endif /* LY_FIND_LEAKS */
+
+ /*
+ * Get the key, if present.
+ */
+ cp = strtok(NULL, ":\n");
+
+ /*
+ * If no key, check whether we are resetting the default jumps file.
+ */
+ if (!cp && JThead) {
+ struct JumpTable *jtptmp = JThead;
+
+ jumpfile = jtp->file;
+ FREE(jtp);
+ while (jtptmp && jtptmp->key)
+ jtptmp = jtptmp->next;
+ if (!jtptmp)
+ return FALSE;
+ StrAllocCopy(jtptmp->file, jumpfile);
+ StrAllocCopy(jtptmp->msg, jumpprompt);
+ return TRUE;
+ }
+
+ /*
+ * If a key is present and we have no default, create one,
+ * using the path from config, and the current jumpprompt.
+ */
+ if (cp && !JThead) {
+ JThead = jtp;
+ StrAllocCopy(JThead->msg, jumpprompt);
+ if (isEmpty(jumpfile))
+ StrAllocCopy(jumpfile, JThead->file);
+ jtp = typecalloc(struct JumpTable);
+
+ if (jtp == NULL) {
+ outofmem(__FILE__, "LYJumpInit");
+ }
+
+ StrAllocCopy(jtp->file, JThead->file);
+ }
+
+ /*
+ * Complete the initialization of config.
+ */
+ if (cp) {
+ jtp->key = remap(cp, "JUMP", FALSE); /* key is present, (re)map it */
+ cp = strtok(NULL, "\n"); /* get prompt, if present */
+ if (non_empty(cp))
+ StrAllocCopy(jtp->msg, cp); /* prompt is present, load it */
+ else
+ cp = NULL;
+ }
+ if (!cp) /* no prompt, use default */
+ StrAllocCopy(jtp->msg, jumpprompt);
+ if (jtp->msg[strlen(jtp->msg) - 1] != ' ') /* ensure a trailing space */
+ StrAllocCat(jtp->msg, " ");
+ jtp->history = HTList_new();
+ jtp->next = JThead;
+ JThead = jtp;
+ return TRUE;
+}
+
+char *LYJump(int key)
+{
+ static bstring *buf = NULL;
+
+ JumpDatum seeking;
+ JumpDatum *found;
+ char *bp, *cp;
+ struct JumpTable *jtp;
+ int ch;
+ RecallType recall;
+ int ShortcutTotal;
+ int ShortcutNum;
+ BOOLEAN FirstShortcutRecall = TRUE;
+
+ if (!JThead)
+ return NULL;
+ jtp = JThead;
+ while (jtp && jtp->key && jtp->key != key)
+ jtp = jtp->next;
+ if (!jtp) {
+ char *msg = 0;
+
+ HTSprintf0(&msg, KEY_NOT_MAPPED_TO_JUMP_FILE, key);
+ HTAlert(msg);
+ FREE(msg);
+ return NULL;
+ }
+ if (!jtp->table)
+ jtp->nel = LYRead_Jumpfile(jtp);
+ if (jtp->nel == 0)
+ return NULL;
+
+ if (!jump_buffer || isEmpty(jtp->shortcut)) {
+ BStrCopy0(buf, "");
+ } else if (non_empty(jtp->shortcut)) {
+ size_t len = (size_t) BStrLen(buf);
+
+ if (strlen(jtp->shortcut) > len) {
+ jtp->shortcut[len] = '\0';
+ BStrCopy0(buf, jtp->shortcut);
+ }
+ }
+
+ ShortcutTotal = (jtp->history ? HTList_count(jtp->history) : 0);
+ if (jump_buffer && !isBEmpty(buf)) {
+ recall = ((ShortcutTotal > 1) ? RECALL_URL : NORECALL);
+ ShortcutNum = 0;
+ FirstShortcutRecall = FALSE;
+ } else {
+ recall = ((ShortcutTotal >= 1) ? RECALL_URL : NORECALL);
+ ShortcutNum = ShortcutTotal;
+ FirstShortcutRecall = TRUE;
+ }
+
+ statusline(jtp->msg);
+ if ((ch = LYgetBString(&buf, FALSE, 0, recall)) < 0) {
+ /*
+ * User cancelled the Jump via ^G. - FM
+ */
+ HTInfoMsg(CANCELLED);
+ return NULL;
+ }
+
+ check_recall:
+ bp = buf->str;
+ if (TOUPPER(key) == 'G' && StrNCmp(buf->str, "o ", 2) == 0)
+ bp++;
+ bp = LYSkipBlanks(bp);
+ if (*bp == '\0' &&
+ !(recall && (ch == UPARROW_KEY || ch == DNARROW_KEY))) {
+ /*
+ * User cancelled the Jump via a zero-length string. - FM
+ */
+ BStrCopy0(buf, "");
+ StrAllocCopy(jtp->shortcut, buf->str);
+ HTInfoMsg(CANCELLED);
+ return NULL;
+ }
+#ifdef PERMIT_GOTO_FROM_JUMP
+ if (StrChr(bp, ':') || StrChr(bp, '/')) {
+ char *temp = NULL;
+
+ LYJumpFileURL = FALSE;
+ if (no_goto) {
+ BStrCopy0(buf, "");
+ StrAllocCopy(jtp->shortcut, buf->str);
+ HTUserMsg(RANDOM_URL_DISALLOWED);
+ return NULL;
+ }
+ HTSprintf0(&temp, "Go %s", bp);
+ BStrCopy0(buf, temp);
+ FREE(temp);
+ return (bp = buf->str);
+ }
+#endif /* PERMIT_GOTO_FROM_JUMP */
+
+ if (recall && ch == UPARROW_KEY) {
+ if (FirstShortcutRecall) {
+ /*
+ * Use last Shortcut in the list. - FM
+ */
+ FirstShortcutRecall = FALSE;
+ ShortcutNum = 0;
+ } else {
+ /*
+ * Go back to the previous Shortcut in the list. - FM
+ */
+ ShortcutNum++;
+ }
+ if (ShortcutNum >= ShortcutTotal)
+ /*
+ * Roll around to the last Shortcut in the list. - FM
+ */
+ ShortcutNum = 0;
+ if ((cp = (char *) HTList_objectAt(jtp->history,
+ ShortcutNum)) != NULL) {
+ BStrCopy0(buf, cp);
+ if (jump_buffer && jtp->shortcut &&
+ !strcmp(buf->str, jtp->shortcut)) {
+ _statusline(EDIT_CURRENT_SHORTCUT);
+ } else if ((jump_buffer && ShortcutTotal == 2) ||
+ (!jump_buffer && ShortcutTotal == 1)) {
+ _statusline(EDIT_THE_PREV_SHORTCUT);
+ } else {
+ _statusline(EDIT_A_PREV_SHORTCUT);
+ }
+ if ((ch = LYgetBString(&buf, FALSE, 0, recall)) < 0) {
+ /*
+ * User cancelled the jump via ^G.
+ */
+ HTInfoMsg(CANCELLED);
+ return NULL;
+ }
+ goto check_recall;
+ }
+ } else if (recall && ch == DNARROW_KEY) {
+ if (FirstShortcutRecall) {
+ /*
+ * Use the first Shortcut in the list. - FM
+ */
+ FirstShortcutRecall = FALSE;
+ ShortcutNum = ShortcutTotal - 1;
+ } else {
+ /*
+ * Advance to the next Shortcut in the list. - FM
+ */
+ ShortcutNum--;
+ }
+ if (ShortcutNum < 0)
+ /*
+ * Roll around to the first Shortcut in the list. - FM
+ */
+ ShortcutNum = ShortcutTotal - 1;
+ if ((cp = (char *) HTList_objectAt(jtp->history,
+ ShortcutNum)) != NULL) {
+ BStrCopy0(buf, cp);
+ if (jump_buffer && jtp->shortcut &&
+ !strcmp(buf->str, jtp->shortcut)) {
+ _statusline(EDIT_CURRENT_SHORTCUT);
+ } else if ((jump_buffer && ShortcutTotal == 2) ||
+ (!jump_buffer && ShortcutTotal == 1)) {
+ _statusline(EDIT_THE_PREV_SHORTCUT);
+ } else {
+ _statusline(EDIT_A_PREV_SHORTCUT);
+ }
+ if ((ch = LYgetBString(&buf, FALSE, 0, recall)) < 0) {
+ /*
+ * User cancelled the jump via ^G.
+ */
+ HTInfoMsg(CANCELLED);
+ return NULL;
+ }
+ goto check_recall;
+ }
+ }
+
+ seeking.key = bp;
+ found = (JumpDatum *) bsearch((char *) &seeking, (char *) jtp->table,
+ (size_t) jtp->nel, sizeof(JumpDatum), LYCompare);
+ if (!found) {
+ user_message("Unknown target '%s'", buf->str);
+ LYSleepAlert();
+ }
+
+ StrAllocCopy(jtp->shortcut, bp);
+ LYAddJumpShortcut(jtp->history, jtp->shortcut);
+ return found ? found->url : NULL;
+}
+
+static unsigned LYRead_Jumpfile(struct JumpTable *jtp)
+{
+ struct stat st;
+ unsigned int nel;
+ char *mp;
+ int fd;
+
+#ifdef VMS
+ int blocksize = 1024;
+ FILE *fp;
+ BOOL IsStream_LF = TRUE;
+#endif /* VMS */
+ char *cp;
+ unsigned i;
+
+ if (isEmpty(jtp->file))
+ return 0;
+
+ CTRACE((tfp, "Read Jumpfile %s\n", jtp->file));
+ if (stat(jtp->file, &st) < 0) {
+ HTAlert(CANNOT_LOCATE_JUMP_FILE);
+ return 0;
+ }
+
+ /* allocate storage to read entire file */
+ if ((mp = typecallocn(char, (size_t) st.st_size + 1)) == NULL) {
+ HTAlert(OUTOF_MEM_FOR_JUMP_FILE);
+ return 0;
+ }
+#ifdef VMS
+ if (st.st_fab_rfm != (char) FAB$C_STMLF) {
+ /** It's a record-oriented file. **/
+ IsStream_LF = FALSE;
+ if ((fp = fopen(jtp->file, "r", "mbc=32")) == NULL) {
+ HTAlert(CANNOT_OPEN_JUMP_FILE);
+ FREE(mp);
+ return 0;
+ }
+ } else if ((fd = open(jtp->file, O_RDONLY, "mbc=32")) < 0)
+#else
+ if ((fd = open(jtp->file, O_RDONLY)) < 0)
+#endif /* VMS */
+ {
+ HTAlert(CANNOT_OPEN_JUMP_FILE);
+ FREE(mp);
+ return 0;
+ }
+#ifdef VMS
+ if (IsStream_LF) {
+ /** Handle as a stream. **/
+#endif /* VMS */
+ if (read(fd, mp, (size_t) st.st_size) != st.st_size) {
+ HTAlert(ERROR_READING_JUMP_FILE);
+ FREE(mp);
+ close(fd);
+ return 0;
+ }
+ mp[st.st_size] = '\0';
+ close(fd);
+#ifdef VMS
+ } else {
+ /** Handle as a series of records. **/
+ if (fgets(mp, blocksize, fp) == NULL) {
+ HTAlert(ERROR_READING_JUMP_FILE);
+ FREE(mp);
+ close(fd);
+ return 0;
+ } else {
+ while (fgets(mp + strlen(mp), blocksize, fp) != NULL) {
+ ;
+ }
+ }
+ LYCloseInput(fp);
+ close(fd);
+ }
+#endif /* VMS */
+
+ /* quick scan for approximate number of entries */
+ nel = 0;
+ cp = mp;
+ while ((cp = StrChr(cp, '\n')) != NULL) {
+ nel++;
+ cp++;
+ }
+
+ jtp->table = (JumpDatum *) malloc((nel + 1) * sizeof(JumpDatum));
+ if (jtp->table == NULL) {
+ HTAlert(OUTOF_MEM_FOR_JUMP_TABLE);
+ FREE(mp);
+ return 0;
+ }
+
+ cp = jtp->mp = mp;
+ for (i = 0; i < nel;) {
+ if (StrNCmp(cp, "<!--", 4) == 0 || StrNCmp(cp, "<dl>", 4) == 0) {
+ cp = StrChr(cp, '\n');
+ if (cp == NULL)
+ break;
+ cp++;
+ continue;
+ }
+ cp = LYstrstr(cp, "<dt>");
+ if (cp == NULL)
+ break;
+ cp += 4;
+ jtp->table[i].key = cp;
+ cp = LYstrstr(cp, "<dd>");
+ if (cp == NULL)
+ break;
+ *cp = '\0';
+ cp += 4;
+ cp = LYstrstr(cp, "href=\"");
+ if (cp == NULL)
+ break;
+ cp += 6;
+ jtp->table[i].url = cp;
+ cp = StrChr(cp, '"');
+ if (cp == NULL)
+ break;
+ *cp = '\0';
+ cp++;
+ cp = StrChr(cp, '\n');
+ if (cp == NULL)
+ break;
+ cp++;
+ CTRACE((tfp, "Read jumpfile[%u] key='%s', url='%s'\n",
+ i, jtp->table[i].key, jtp->table[i].url));
+ i++;
+ }
+
+ return i;
+}
+
+static int LYCompare(const void *e1, const void *e2)
+{
+ return strcasecomp(((const JumpDatum *) e1)->key,
+ ((const JumpDatum *) e2)->key);
+}
diff --git a/src/LYJump.h b/src/LYJump.h
new file mode 100644
index 0000000..159bdd6
--- /dev/null
+++ b/src/LYJump.h
@@ -0,0 +1,36 @@
+/* $LynxId: LYJump.h,v 1.8 2009/01/01 22:41:42 tom Exp $ */
+#ifndef LYJUMP_H
+#define LYJUMP_H
+
+#include <HTList.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ typedef struct _JumpDatum {
+ char *key;
+ char *url;
+ } JumpDatum;
+
+ struct JumpTable {
+ int key;
+ unsigned nel;
+ char *msg;
+ char *file;
+ char *shortcut;
+ HTList *history;
+ JumpDatum *table;
+ struct JumpTable *next;
+ char *mp;
+ };
+
+ extern struct JumpTable *JThead;
+ extern void LYJumpTable_free(void);
+ extern void LYAddJumpShortcut(HTList *the_history, char *shortcut);
+ extern BOOL LYJumpInit(char *config);
+ extern char *LYJump(int key);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* LYJUMP_H */
diff --git a/src/LYJustify.h b/src/LYJustify.h
new file mode 100644
index 0000000..997cd05
--- /dev/null
+++ b/src/LYJustify.h
@@ -0,0 +1,83 @@
+/*
+ * $LynxId: LYJustify.h,v 1.8 2009/11/21 15:24:48 tom Exp $
+ *
+ * Justification for lynx - implemented by Vlad Harchev <hvv@hippo.ru>
+ * 11 July 1999
+ */
+
+#ifndef LYJUSTIFY_H
+#define LYJUSTIFY_H
+
+#include <HTUtils.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#ifdef USE_JUSTIFY_ELTS
+ extern BOOL can_justify_here;
+ extern BOOL can_justify_here_saved;
+
+ extern BOOL can_justify_this_line;
+ extern int wait_for_this_stacked_elt;
+ extern BOOL form_in_htext;
+
+/* this is the element with SGML_EMPTY content, so it won't get on the stack,
+ * so we can't trap it with wait_for_this_stacked_elt
+ */
+ extern BOOL in_DT;
+
+/*disabled by default*/
+/*#define DEBUG_JUSTIFY*/
+#ifdef DEBUG_JUSTIFY
+ extern BOOL can_justify_stack_depth; /* can be 0 or 1 if all code is correct */
+
+# define CAN_JUSTIFY_STACK_INC ++can_justify_stack_depth;\
+ assert(can_justify_stack_depth < 2 && can_justify_stack_depth >=0 );
+# define CAN_JUSTIFY_STACK_DEC --can_justify_stack_depth;\
+ assert(can_justify_stack_depth < 2 && can_justify_stack_depth >=0 );
+#else
+# define CAN_JUSTIFY_STACK_INC /* nothing */
+# define CAN_JUSTIFY_STACK_DEC /* nothing */
+#endif
+
+#define CAN_JUSTIFY_PUSH(x) can_justify_here_saved=can_justify_here;\
+ can_justify_here=(x); CAN_JUSTIFY_STACK_INC
+#define CAN_JUSTIFY_POP can_justify_here=can_justify_here_saved;\
+ CAN_JUSTIFY_STACK_INC
+#define CAN_JUSTIFY_SET(x) can_justify_here=(x);
+
+/*
+ * This is used to indicate that starting from the current offset in current
+ * line justification can take place (in order the gap between some prefix and
+ * the word not to be enlarged.
+ * For example, when forming OL,
+ * 1.21 foo
+ * ^justification can start here so that gap between 1.21 and "foo"
+ * will not be enlarged.
+ * This is a macro (that uses 'me').
+ */
+#define CAN_JUSTIFY_START mark_justify_start_position(me->text);
+#define CANT_JUSTIFY_THIS_LINE can_justify_this_line = FALSE
+#define EMIT_IFDEF_USE_JUSTIFY_ELTS(x) x
+ /*defined in order not to wrap single line of code into #ifdef/#endif */
+
+ extern void ht_justify_cleanup(void);
+ extern void mark_justify_start_position(void *text);
+
+#else /* ! USE_JUSTIFY_ELTS */
+/*
+ * define empty macros so that they can be used without wrapping them in
+ * #ifdef USE_JUSTIFY_ELTS/#endif
+ */
+#define CAN_JUSTIFY_PUSH(x)
+#define CAN_JUSTIFY_POP
+#define CAN_JUSTIFY_SET(x)
+#define CAN_JUSTIFY_START
+#define CANT_JUSTIFY_THIS_LINE
+#define EMIT_IFDEF_USE_JUSTIFY_ELTS(x)
+#endif /* USE_JUSTIFY_ELTS */
+#define CAN_JUSTIFY_PUSH_F CAN_JUSTIFY_PUSH(FALSE)
+#ifdef __cplusplus
+}
+#endif
+#endif /* LYJUSTIFY_H */
diff --git a/src/LYKeymap.c b/src/LYKeymap.c
new file mode 100644
index 0000000..b05d0a3
--- /dev/null
+++ b/src/LYKeymap.c
@@ -0,0 +1,1539 @@
+/* $LynxId: LYKeymap.c,v 1.122 2021/06/09 21:58:11 tom Exp $ */
+#include <HTUtils.h>
+#include <LYUtils.h>
+#include <LYGlobalDefs.h>
+#include <LYKeymap.h>
+#include <LYCharSets.h> /* for LYlowest_eightbit - kw */
+#include <HTAccess.h>
+#include <HTFormat.h>
+#include <HTAlert.h>
+#include <LYStrings.h> /* for USE_KEYMAP stuff - kw */
+
+#include <LYLeaks.h>
+
+#ifdef EXP_KEYBOARD_LAYOUT
+#include <jcuken_kb.h>
+#include <yawerty_kb.h>
+#include <rot13_kb.h>
+#endif
+
+#define PUTS(buf) (*target->isa->put_block)(target, buf, (int) strlen(buf))
+
+#ifdef EXP_KEYBOARD_LAYOUT
+int current_layout = 0; /* Index into LYKbLayouts[] */
+
+LYKbLayout_t *LYKbLayouts[] =
+{
+ kb_layout_rot13,
+ kb_layout_jcuken,
+ kb_layout_yawerty
+};
+
+const char *LYKbLayoutNames[] =
+{
+ "ROT13'd keyboard layout",
+ "JCUKEN Cyrillic, for AT 101-key kbd",
+ "YAWERTY Cyrillic, for DEC LK201 kbd",
+ (char *) 0
+};
+#endif /* EXP_KEYBOARD_LAYOUT */
+
+/* * * Tables mapping LynxKeyCodes to LynxActionCodes * * */
+
+/*
+ * Lynxkeycodes include all single-byte keys as well as codes for function keys
+ * and some special purposes. See LYStrings.h. Extended lynxkeycode values
+ * can also contain flags for modifiers and other purposes, but here only the
+ * base values are mapped to lynxactioncodes. They are called `keystrokes' in
+ * lynx.cfg.
+ *
+ * Lynxactioncodes (confusingly, constants are named LYK_foo and typed as
+ * specify key `functions', see LYKeymap.h.
+ */
+
+/* the character gets 1 added to it before lookup,
+ * so that EOF maps to 0
+ */
+LYKeymap_t keymap[KEYMAP_SIZE];
+
+static const LYEditInit initKeymapData[] =
+{
+ {KTL('@'), LYK_DO_NOTHING},
+ {KTL('A'), LYK_HOME},
+ {KTL('B'), LYK_PREV_PAGE},
+ {KTL('D'), LYK_ABORT},
+ {KTL('E'), LYK_END},
+ {KTL('F'), LYK_NEXT_PAGE},
+ {KTL('H'), LYK_HISTORY},
+ {KTL('I'), LYK_FASTFORW_LINK},
+ {KTL('J'), LYK_ACTIVATE},
+ {KTL('K'), LYK_COOKIE_JAR},
+ {KTL('L'), LYK_REFRESH},
+ {KTL('M'), LYK_ACTIVATE},
+ {KTL('N'), LYK_DOWN_TWO},
+ {KTL('P'), LYK_UP_TWO},
+ {KTL('Q'), LYK_CHANGE_CENTER},
+ {KTL('R'), LYK_RELOAD},
+ {KTL('S'), LYK_TO_CLIPBOARD},
+ {KTL('T'), LYK_TRACE_TOGGLE},
+ {KTL('U'), LYK_NEXT_DOC},
+ {KTL('V'), LYK_SWITCH_DTD},
+ {KTL('W'), LYK_REFRESH},
+ {KTL('X'), LYK_CACHE_JAR},
+ {KTL('Z'), LYK_MAXSCREEN_TOGGLE},
+ {KHR(' '), LYK_NEXT_PAGE},
+ {KHR('!'), LYK_SHELL},
+ {KHR('"'), LYK_SOFT_DQUOTES},
+ {KHR('#'), LYK_TOOLBAR},
+ {KHR('$'), LYK_LAST_LINK},
+ {KHR('\''), LYK_HISTORICAL},
+ {KHR('('), LYK_UP_HALF},
+ {KHR(')'), LYK_DOWN_HALF},
+ {KHR('*'), LYK_IMAGE_TOGGLE},
+ {KHR('+'), LYK_NEXT_PAGE},
+ {KHR(','), LYK_EXTERN_PAGE},
+ {KHR('-'), LYK_PREV_PAGE},
+ {KHR('.'), LYK_EXTERN_LINK},
+ {KHR('/'), LYK_WHEREIS},
+ {KHR('0'), LYK_F_LINK_NUM},
+ {KHR('1'), LYK_1},
+ {KHR('2'), LYK_2},
+ {KHR('3'), LYK_3},
+ {KHR('4'), LYK_4},
+ {KHR('5'), LYK_5},
+ {KHR('6'), LYK_6},
+ {KHR('7'), LYK_7},
+ {KHR('8'), LYK_8},
+ {KHR('9'), LYK_9},
+ {KHR(':'), LYK_COMMAND},
+ {KHR(';'), LYK_TRACE_LOG},
+ {KHR('<'), LYK_UP_LINK},
+ {KHR('='), LYK_INFO},
+ {KHR('>'), LYK_DOWN_LINK},
+ {KHR('?'), LYK_HELP},
+ {KHR('@'), LYK_RAW_TOGGLE},
+ {KHR('A'), LYK_ADDRLIST},
+ {KHR('B'), LYK_PREV_PAGE},
+#ifdef SUPPORT_CHDIR
+ {KHR('C'), LYK_CHDIR},
+#else
+ {KHR('C'), LYK_COMMENT},
+#endif
+ {KHR('D'), LYK_DOWNLOAD},
+ {KHR('E'), LYK_ELGOTO},
+ {KHR('F'), LYK_DIRED_MENU},
+ {KHR('G'), LYK_ECGOTO},
+ {KHR('H'), LYK_HELP},
+ {KHR('I'), LYK_INDEX},
+#ifdef KANJI_CODE_OVERRIDE
+ {KHR('J'), LYK_CHANGE_KCODE},
+#else
+ {KHR('J'), LYK_JUMP},
+#endif
+ {KHR('K'), LYK_KEYMAP},
+ {KHR('L'), LYK_LIST},
+ {KHR('M'), LYK_MAIN_MENU},
+ {KHR('N'), LYK_PREV},
+ {KHR('O'), LYK_OPTIONS},
+ {KHR('P'), LYK_PRINT},
+ {KHR('Q'), LYK_ABORT},
+ {KHR('R'), LYK_DEL_BOOKMARK},
+ {KHR('S'), LYK_INDEX_SEARCH},
+ {KHR('T'), LYK_TAG_LINK},
+ {KHR('U'), LYK_PREV_DOC},
+ {KHR('V'), LYK_VLINKS},
+ {KHR('X'), LYK_NOCACHE},
+ {KHR('Z'), LYK_INTERRUPT},
+ {KHR('['), LYK_INLINE_TOGGLE},
+ {KHR('\\'), LYK_SOURCE},
+ {KHR(']'), LYK_HEAD},
+ {KHR('^'), LYK_FIRST_LINK},
+ {KHR('_'), LYK_CLEAR_AUTH},
+ {KHR('`'), LYK_MINIMAL},
+ {KHR('a'), LYK_ADD_BOOKMARK},
+ {KHR('b'), LYK_PREV_PAGE},
+ {KHR('c'), LYK_COMMENT},
+ {KHR('d'), LYK_DOWNLOAD},
+ {KHR('e'), LYK_EDIT},
+ {KHR('f'), LYK_DIRED_MENU},
+ {KHR('g'), LYK_GOTO},
+ {KHR('h'), LYK_HELP},
+ {KHR('i'), LYK_INDEX},
+ {KHR('j'), LYK_JUMP},
+ {KHR('k'), LYK_KEYMAP},
+ {KHR('l'), LYK_LIST},
+ {KHR('m'), LYK_MAIN_MENU},
+ {KHR('n'), LYK_NEXT},
+ {KHR('o'), LYK_OPTIONS},
+ {KHR('p'), LYK_PRINT},
+ {KHR('q'), LYK_QUIT},
+ {KHR('r'), LYK_DEL_BOOKMARK},
+ {KHR('s'), LYK_INDEX_SEARCH},
+ {KHR('t'), LYK_TAG_LINK},
+ {KHR('u'), LYK_PREV_DOC},
+ {KHR('v'), LYK_VIEW_BOOKMARK},
+ {KHR('x'), LYK_NOCACHE},
+ {KHR('z'), LYK_INTERRUPT},
+ {KHR('{'), LYK_SHIFT_LEFT},
+ {KHR('|'), LYK_LINEWRAP_TOGGLE},
+ {KHR('}'), LYK_SHIFT_RIGHT},
+ {KHR('~'), LYK_NESTED_TABLES},
+ {KHR(DEL_KEY), LYK_HISTORY},
+ {KHR(UPARROW_KEY), LYK_PREV_LINK},
+ {KHR(DNARROW_KEY), LYK_NEXT_LINK},
+ {KHR(RTARROW_KEY), LYK_ACTIVATE},
+ {KHR(LTARROW_KEY), LYK_PREV_DOC},
+ {KHR(PGDOWN_KEY), LYK_NEXT_PAGE},
+ {KHR(PGUP_KEY), LYK_PREV_PAGE},
+ {KHR(HOME_KEY), LYK_HOME},
+ {KHR(END_KEY), LYK_END},
+ {KHR(F1_KEY), LYK_DWIMHELP},
+#if !(defined(_WINDOWS) || defined(__DJGPP__))
+ {KHR(DO_KEY), LYK_ACTIVATE},
+ {KHR(FIND_KEY), LYK_HOME},
+ {KHR(SELECT_KEY), LYK_END},
+#endif
+ {KHR(INSERT_KEY), LYK_UP_TWO},
+ {KHR(REMOVE_KEY), LYK_DOWN_TWO},
+ {KHR(DO_NOTHING), LYK_DO_NOTHING},
+ {KHR(BACKTAB_KEY), LYK_FASTBACKW_LINK},
+ {KHR(F11_KEY), LYK_DO_NOTHING},
+#ifdef DJGPP_KEYHANDLER
+ {302, LYK_ABORT},
+#endif /* DJGPP_KEYHANDLER */
+#if (defined(_WINDOWS) || defined(__DJGPP__) || defined(__CYGWIN__)) && !defined(USE_SLANG) /* PDCurses */
+ {441, LYK_ABORT}, /* ALT_X */
+ {459, LYK_WHEREIS}, /* KP_SLASH */
+ {464, LYK_IMAGE_TOGGLE}, /* KP_* */
+ {465, LYK_PREV_PAGE}, /* KP_- */
+ {466, LYK_NEXT_PAGE}, /* KP_+ */
+#endif
+ {657, LYK_CHANGE_LINK},
+ {-1, LYE_UNKNOWN}
+};
+
+static LYEditConfig myKeymapData =
+{
+ "Key Map", initKeymapData, keymap
+};
+
+#if defined(DIRED_SUPPORT) && defined(OK_OVERRIDE)
+/*
+ * This table is used to override the standard keyboard assignments
+ * when lynx_edit_mode is in effect and keyboard overrides have been
+ * allowed at compile time.
+ */
+
+LYKeymap_t key_override[KEYMAP_SIZE];
+
+static const LYEditInit initOverrideData[] =
+{
+ {22, LYK_NEXT_DOC}, /* ^V */
+ {47, LYK_TAG_LINK}, /* . */
+#ifndef SUPPORT_CHDIR
+ {68, LYK_CREATE}, /* C */
+#else
+ {68, LYK_CHDIR}, /* C */
+#endif
+ {71, LYK_DIRED_MENU}, /* F */
+ {78, LYK_MODIFY}, /* M */
+ {83, LYK_REMOVE}, /* R */
+ {85, LYK_TAG_LINK}, /* T */
+ {86, LYK_UPLOAD}, /* U */
+ {100, LYK_CREATE}, /* c */
+ {103, LYK_DIRED_MENU}, /* f */
+ {110, LYK_MODIFY}, /* m */
+ {115, LYK_REMOVE}, /* r */
+ {117, LYK_TAG_LINK}, /* t */
+ {118, LYK_UPLOAD}, /* u */
+ {271, LYK_DO_NOTHING}, /* DO_NOTHING */
+ {-1, LYE_UNKNOWN}
+};
+
+static LYEditConfig myOverrideData =
+{
+ "Key Override", initOverrideData, key_override
+};
+#endif /* DIRED_SUPPORT && OK_OVERRIDE */
+
+#define DATA(code, name, doc) { code, name, doc }
+/* The order of this array must match the LYKeymapCode enum in LYKeymap.h */
+static Kcmd revmap[] =
+{
+ DATA(
+ LYK_UNKNOWN, "UNMAPPED",
+ NULL),
+ DATA(
+ LYK_COMMAND, "COMMAND",
+ "prompt for, execute a command"),
+ DATA(
+ LYK_1, "1",
+ NULL),
+ DATA(
+ LYK_2, "2",
+ NULL),
+ DATA(
+ LYK_3, "3",
+ NULL),
+ DATA(
+ LYK_4, "4",
+ NULL),
+ DATA(
+ LYK_5, "5",
+ NULL),
+ DATA(
+ LYK_6, "6",
+ NULL),
+ DATA(
+ LYK_7, "7",
+ NULL),
+ DATA(
+ LYK_8, "8",
+ NULL),
+ DATA(
+ LYK_9, "9",
+ NULL),
+ DATA(
+ LYK_SOURCE, "SOURCE",
+ "toggle source/presentation for current document"),
+ DATA(
+ LYK_RELOAD, "RELOAD",
+ "reload the current document"),
+ DATA(
+ LYK_QUIT, "QUIT",
+ "quit the browser"),
+ DATA(
+ LYK_ABORT, "ABORT",
+ "quit the browser unconditionally"),
+ DATA(
+ LYK_NEXT_PAGE, "NEXT_PAGE",
+ "view the next page of the document"),
+ DATA(
+ LYK_PREV_PAGE, "PREV_PAGE",
+ "view the previous page of the document"),
+ DATA(
+ LYK_UP_TWO, "UP_TWO",
+ "go back two lines in the document"),
+ DATA(
+ LYK_DOWN_TWO, "DOWN_TWO",
+ "go forward two lines in the document"),
+ DATA(
+ LYK_UP_HALF, "UP_HALF",
+ "go back half a page in the document"),
+ DATA(
+ LYK_DOWN_HALF, "DOWN_HALF",
+ "go forward half a page in the document"),
+ DATA(
+ LYK_REFRESH, "REFRESH",
+ "refresh the screen to clear garbled text"),
+ DATA(
+ LYK_HOME, "HOME",
+ "go to the beginning of the current document"),
+ DATA(
+ LYK_END, "END",
+ "go to the end of the current document"),
+ DATA(
+ LYK_FIRST_LINK, "FIRST_LINK",
+ "make the first link on the line current"),
+ DATA(
+ LYK_LAST_LINK, "LAST_LINK",
+ "make the last link on the line current"),
+ DATA(
+ LYK_PREV_LINK, "PREV_LINK",
+ "make the previous link current"),
+ DATA(
+ LYK_NEXT_LINK, "NEXT_LINK",
+ "make the next link current"),
+ DATA(
+ LYK_LPOS_PREV_LINK, "LPOS_PREV_LINK",
+ "make previous link current, same column for input"),
+ DATA(
+ LYK_LPOS_NEXT_LINK, "LPOS_NEXT_LINK",
+ "make next link current, same column for input"),
+ DATA(
+ LYK_FASTBACKW_LINK, "FASTBACKW_LINK",
+ "previous link or text area, only stops on links"),
+ DATA(
+ LYK_FASTFORW_LINK, "FASTFORW_LINK",
+ "next link or text area, only stops on links"),
+ DATA(
+ LYK_UP_LINK, "UP_LINK",
+ "move up the page to a previous link"),
+ DATA(
+ LYK_DOWN_LINK, "DOWN_LINK",
+ "move down the page to another link"),
+ DATA(
+ LYK_RIGHT_LINK, "RIGHT_LINK",
+ "move right to another link"),
+ DATA(
+ LYK_LEFT_LINK, "LEFT_LINK",
+ "move left to a previous link"),
+ DATA(
+ LYK_HISTORY, "HISTORY",
+ "display stack of currently-suspended documents"),
+ DATA(
+ LYK_PREV_DOC, "PREV_DOC",
+ "go back to the previous document"),
+ DATA(
+ LYK_NEXT_DOC, "NEXT_DOC",
+ "undo going back to the previous document"),
+ DATA(
+ LYK_ACTIVATE, "ACTIVATE",
+ "go to the document given by the current link"),
+ DATA(
+ LYK_MOUSE_SUBMIT, "MOUSE_SUBMIT",
+ "DO NOT MAP: follow current link, submit"),
+ DATA(
+ LYK_SUBMIT, "SUBMIT",
+ "prompt and submit form"),
+ DATA(
+ LYK_RESET, "RESET",
+ "reset fields on current form"),
+ DATA(
+ LYK_GOTO, "GOTO",
+ "go to a document given as a URL"),
+ DATA(
+ LYK_ECGOTO, "ECGOTO",
+ "edit the current document's URL and go to it"),
+ DATA(
+ LYK_HELP, "HELP",
+ "display help on using the browser"),
+ DATA(
+ LYK_DWIMHELP, "DWIMHELP",
+ "display help page that may depend on context"),
+ DATA(
+ LYK_INDEX, "INDEX",
+ "display an index of potentially useful documents"),
+ DATA(
+ LYK_NOCACHE, "NOCACHE",
+ "force submission of form or link with no-cache"),
+ DATA(
+ LYK_INTERRUPT, "INTERRUPT",
+ "interrupt network connection or transmission"),
+ DATA(
+ LYK_MAIN_MENU, "MAIN_MENU",
+ "return to the first screen (home page)"),
+ DATA(
+ LYK_OPTIONS, "OPTIONS",
+ "display and change option settings"),
+ DATA(
+ LYK_INDEX_SEARCH, "INDEX_SEARCH",
+ "allow searching of an index"),
+ DATA(
+ LYK_WHEREIS, "WHEREIS",
+ "search within the current document"),
+ DATA(
+ LYK_PREV, "PREV",
+ "search for the previous occurrence"),
+ DATA(
+ LYK_NEXT, "NEXT",
+ "search for the next occurrence"),
+ DATA(
+ LYK_COMMENT, "COMMENT",
+ "send a comment to the author of the current document"),
+ DATA(
+ LYK_EDIT, "EDIT",
+ "edit the current document or a form's textarea"),
+ DATA(
+ LYK_INFO, "INFO",
+ "display information on the current document and link"),
+ DATA(
+ LYK_PRINT, "PRINT",
+ "display choices for printing the current document"),
+ DATA(
+ LYK_ADD_BOOKMARK, "ADD_BOOKMARK",
+ "add to your personal bookmark list"),
+ DATA(
+ LYK_DEL_BOOKMARK, "DEL_BOOKMARK",
+ "delete from your personal bookmark list"),
+ DATA(
+ LYK_VIEW_BOOKMARK, "VIEW_BOOKMARK",
+ "view your personal bookmark list"),
+ DATA(
+ LYK_VLINKS, "VLINKS",
+ "list links visited during the current Lynx session"),
+ DATA(
+ LYK_SHELL, "SHELL",
+ "escape from the browser to the system"),
+ DATA(
+ LYK_DOWNLOAD, "DOWNLOAD",
+ "download the current link to your computer"),
+ DATA(
+ LYK_TRACE_TOGGLE, "TRACE_TOGGLE",
+ "toggle tracing of browser operations"),
+ DATA(
+ LYK_TRACE_LOG, "TRACE_LOG",
+ "view trace log if started in the current session"),
+ DATA(
+ LYK_IMAGE_TOGGLE, "IMAGE_TOGGLE",
+ "toggle handling of all images as links"),
+ DATA(
+ LYK_INLINE_TOGGLE, "INLINE_TOGGLE",
+ "toggle pseudo-ALTs for inlines with no ALT string"),
+ DATA(
+ LYK_HEAD, "HEAD",
+ "send a HEAD request for the current document or link"),
+ DATA(
+ LYK_DO_NOTHING, "DO_NOTHING",
+ NULL),
+ DATA(
+ LYK_TOGGLE_HELP, "TOGGLE_HELP",
+ "show other commands in the novice help menu"),
+ DATA(
+ LYK_JUMP, "JUMP",
+ "go directly to a target document or action"),
+ DATA(
+ LYK_EDITMAP, "EDITMAP",
+ "display the current edit-key map"),
+ DATA(
+ LYK_KEYMAP, "KEYMAP",
+ "display the current key map"),
+ DATA(
+ LYK_LIST, "LIST",
+ "list the references (links) in the current document"),
+ DATA(
+ LYK_TOOLBAR, "TOOLBAR",
+ "go to Toolbar or Banner in the current document"),
+ DATA(
+ LYK_HISTORICAL, "HISTORICAL",
+ "toggle historical vs. valid/minimal comment parsing"),
+ DATA(
+ LYK_MINIMAL, "MINIMAL",
+ "toggle minimal vs. valid comment parsing"),
+ DATA(
+ LYK_SOFT_DQUOTES, "SOFT_DQUOTES",
+ "toggle valid vs. soft double-quote parsing"),
+ DATA(
+ LYK_RAW_TOGGLE, "RAW_TOGGLE",
+ "toggle raw 8-bit translations or CJK mode ON or OFF"),
+ DATA(
+ LYK_COOKIE_JAR, "COOKIE_JAR",
+ "examine the Cookie Jar"),
+ DATA(
+ LYK_F_LINK_NUM, "F_LINK_NUM",
+ "invoke the 'Follow link (or page) number:' prompt"),
+ DATA(
+ LYK_CLEAR_AUTH, "CLEAR_AUTH",
+ "clear all authorization info for this session"),
+ DATA(
+ LYK_SWITCH_DTD, "SWITCH_DTD",
+ "switch between two ways of parsing HTML"),
+ DATA(
+ LYK_ELGOTO, "ELGOTO",
+ "edit the current link's URL or ACTION and go to it"),
+ DATA(
+ LYK_CHANGE_LINK, "CHANGE_LINK",
+ "force reset of the current link on the page"),
+ DATA(
+ LYK_DWIMEDIT, "DWIMEDIT",
+ "use external editor for context-dependent purpose"),
+ DATA(
+ LYK_EDITTEXTAREA, "EDITTEXTAREA",
+ "use an external editor to edit a form's textarea"),
+ DATA(
+ LYK_GROWTEXTAREA, "GROWTEXTAREA",
+ "add 5 new blank lines to the bottom of a textarea"),
+ DATA(
+ LYK_INSERTFILE, "INSERTFILE",
+ "insert file into a textarea (just above cursorline)"),
+#ifdef USE_ADDRLIST_PAGE
+ DATA(
+ LYK_ADDRLIST, "ADDRLIST",
+ "like LIST command, but always shows the links' URLs"),
+#endif
+#ifdef USE_EXTERNALS
+ DATA(
+ LYK_EXTERN_LINK, "EXTERN_LINK",
+ "run external program with current link"),
+ DATA(
+ LYK_EXTERN_PAGE, "EXTERN_PAGE",
+ "run external program with current page"),
+#endif
+#ifdef VMS
+ DATA(
+ LYK_DIRED_MENU, "DIRED_MENU",
+ "invoke File/Directory Manager, if available"),
+#else
+#ifdef DIRED_SUPPORT
+ DATA(
+ LYK_DIRED_MENU, "DIRED_MENU",
+ "display a full menu of file operations"),
+ DATA(
+ LYK_CREATE, "CREATE",
+ "create a new file or directory"),
+ DATA(
+ LYK_REMOVE, "REMOVE",
+ "remove a file or directory"),
+ DATA(
+ LYK_MODIFY, "MODIFY",
+ "modify the name or location of a file or directory"),
+ DATA(
+ LYK_TAG_LINK, "TAG_LINK",
+ "tag a file or directory for later action"),
+ DATA(
+ LYK_UPLOAD, "UPLOAD",
+ "upload from your computer to the current directory"),
+ DATA(
+ LYK_INSTALL, "INSTALL",
+ "install file or tagged files into a system area"),
+#endif /* DIRED_SUPPORT */
+ DATA(
+ LYK_CHANGE_CENTER, "CHANGE_CENTER",
+ "toggle center alignment in HTML TABLE"),
+#ifdef KANJI_CODE_OVERRIDE
+ DATA(
+ LYK_CHANGE_KCODE, "CHANGE_KCODE",
+ "Change Kanji code"),
+#endif
+#endif /* VMS */
+#ifdef SUPPORT_CHDIR
+ DATA(
+ LYK_CHDIR, "CHDIR",
+ "change current directory"),
+ DATA(
+ LYK_PWD, "PWD",
+ "print current directory"),
+#endif
+#ifdef USE_CURSES_PADS
+ DATA(
+ LYK_SHIFT_LEFT, "SHIFT_LEFT",
+ "shift the screen left"),
+ DATA(
+ LYK_SHIFT_RIGHT, "SHIFT_RIGHT",
+ "shift the screen right"),
+ DATA(
+ LYK_LINEWRAP_TOGGLE, "LINEWRAP_TOGGLE",
+ "toggle linewrap on/off"),
+#endif
+#ifdef CAN_CUT_AND_PASTE
+ DATA(
+ LYK_PASTE_URL, "PASTE_URL",
+ "Goto the URL in the clipboard"),
+ DATA(
+ LYK_TO_CLIPBOARD, "TO_CLIPBOARD",
+ "link's URL to Clip Board"),
+#endif
+#ifdef EXP_NESTED_TABLES
+ DATA(
+ LYK_NESTED_TABLES, "NESTED_TABLES",
+ "toggle nested-table parsing on/off"),
+#endif
+#ifdef USE_CACHEJAR
+ DATA(
+ LYK_CACHE_JAR, "CACHE_JAR",
+ "examine list of cached documents"),
+#endif
+#ifdef USE_MAXSCREEN_TOGGLE
+ DATA(
+ LYK_MAXSCREEN_TOGGLE, "MAXSCREEN_TOGGLE",
+ "toggle max screen and normal"),
+#endif
+ DATA(
+ LYK_UNKNOWN, NULL,
+ "")
+};
+
+
+#undef DATA
+/* *INDENT-OFF* */
+static const struct {
+ int key;
+ const char *name;
+} named_keys[] = {
+ { '\t', "<tab>" },
+ { '\r', "<return>" },
+ { CH_ESC, "ESC" },
+ { ' ', "<space>" },
+ { '<', "<" },
+ { '>', ">" },
+ /* LYExtraKeys */
+ { CH_DEL, "<delete>" },
+ { UPARROW_KEY, "Up Arrow" },
+ { DNARROW_KEY, "Down Arrow" },
+ { RTARROW_KEY, "Right Arrow" },
+ { LTARROW_KEY, "Left Arrow" },
+ { PGDOWN_KEY, "Page Down" },
+ { PGUP_KEY, "Page Up" },
+ { HOME_KEY, "Home" },
+ { END_KEY, "End" },
+ { F1_KEY, "F1" },
+ { F2_KEY, "F2" },
+ { F3_KEY, "F3" },
+ { F4_KEY, "F4" },
+ { F5_KEY, "F5" },
+ { F6_KEY, "F6" },
+ { F7_KEY, "F7" },
+ { F8_KEY, "F8" },
+ { F9_KEY, "F9" },
+ { F10_KEY, "F10" },
+ { F11_KEY, "F11" },
+ { F12_KEY, "F12" },
+ { DO_KEY, "Do key" },
+ { FIND_KEY, "Find key" },
+ { SELECT_KEY, "Select key" },
+ { INSERT_KEY, "Insert key" },
+ { REMOVE_KEY, "Remove key" },
+ { DO_NOTHING, "(DO_NOTHING)" },
+ { BACKTAB_KEY, "Back Tab" },
+ { MOUSE_KEY, "mouse pseudo key" },
+};
+/* *INDENT-ON* */
+
+/*
+ * Build a list of Lynx's commands, for use in the tab-completion in LYgetstr.
+ */
+HTList *LYcommandList(void)
+{
+ static HTList *myList = NULL;
+
+ if (myList == NULL) {
+ unsigned j;
+
+ myList = HTList_new();
+ for (j = 0; revmap[j].name != 0; j++) {
+ if (revmap[j].doc != 0) {
+ char *data = NULL;
+
+ StrAllocCopy(data, revmap[j].name);
+ HTList_addObject(myList, data);
+ }
+ }
+ }
+ return myList;
+}
+
+/*
+ * Find the given keycode.
+ */
+Kcmd *LYKeycodeToKcmd(LYKeymapCode code)
+{
+ unsigned j;
+ Kcmd *result = 0;
+
+ if (code > LYK_UNKNOWN) {
+ for (j = 0; revmap[j].name != 0; j++) {
+ if (revmap[j].code == code) {
+ result = revmap + j;
+ break;
+ }
+ }
+ }
+ return result;
+}
+
+/*
+ * Find the given command-name, accepting an abbreviation if it is unique.
+ */
+Kcmd *LYStringToKcmd(const char *name)
+{
+ size_t need = strlen(name);
+ size_t j;
+ BOOL exact = FALSE;
+ Kcmd *result = 0;
+ Kcmd *maybe = 0;
+
+ if (non_empty(name)) {
+ for (j = 0; revmap[j].name != 0; j++) {
+ if (!strcasecomp(revmap[j].name, name)) {
+ result = revmap + j;
+ break;
+ } else if (!exact
+ && !strncasecomp(revmap[j].name, name, (int) need)) {
+ if (maybe == 0) {
+ maybe = revmap + j;
+ } else {
+ if (revmap[j].name[need] != 0
+ && maybe->name[need] != 0) {
+ maybe = 0;
+ exact = TRUE;
+ }
+ }
+ }
+ }
+ }
+ return (result != 0) ? result : maybe;
+}
+
+char *LYKeycodeToString(int c,
+ int upper8)
+{
+ static char buf[30];
+ unsigned n;
+ BOOLEAN named = FALSE;
+
+ for (n = 0; n < TABLESIZE(named_keys); n++) {
+ if (named_keys[n].key == c) {
+ named = TRUE;
+ LYStrNCpy(buf, named_keys[n].name, sizeof(buf) - 1);
+ break;
+ }
+ }
+
+ if (!named) {
+ if (c <= 0377
+ && TOASCII(c) > TOASCII(' ')
+ && TOASCII(c) < 0177)
+ sprintf(buf, "%c", c);
+ else if (upper8
+ && TOASCII(c) > TOASCII(' ')
+ && c <= 0377
+ && c <= LYlowest_eightbit[current_char_set])
+ sprintf(buf, "%c", c);
+ else if (TOASCII(c) < TOASCII(' '))
+ sprintf(buf, "^%c", FROMASCII(TOASCII(c) | 0100));
+ else if (c >= 0400)
+ sprintf(buf, "key-0x%x", (unsigned) c);
+ else
+ sprintf(buf, "0x%x", (unsigned) c);
+ }
+ return buf;
+}
+
+int LYStringToKeycode(char *src)
+{
+ unsigned n;
+ int key = -1;
+ int len = (int) strlen(src);
+
+ if (len == 1) {
+ key = *src;
+ } else if (len == 2 && *src == '^') {
+ key = src[1] & 0x1f;
+ } else if (len > 2 && !strncasecomp(src, "0x", 2)) {
+ char *dst = 0;
+
+ key = (int) strtol(src, &dst, 0);
+ if (non_empty(dst))
+ key = -1;
+ } else if (len > 6 && !strncasecomp(src, "key-", 4)) {
+ char *dst = 0;
+
+ key = (int) strtol(src + 4, &dst, 0);
+ if (isEmpty(dst))
+ key = -1;
+ }
+ if (key < 0) {
+ for (n = 0; n < TABLESIZE(named_keys); n++) {
+ if (!strcasecomp(named_keys[n].name, src)) {
+ key = named_keys[n].key;
+ break;
+ }
+ }
+ }
+ return key;
+}
+
+#define PRETTY_LEN 11
+
+static char *pretty_html(int c)
+{
+ char *src = LYKeycodeToString(c, TRUE);
+
+ if (src != 0) {
+ /* *INDENT-OFF* */
+ static const struct {
+ int code;
+ const char *name;
+ } table[] = {
+ { '<', "&lt;" },
+ { '>', "&gt;" },
+ { '"', "&quot;" },
+ { '&', "&amp;" }
+ };
+ /* *INDENT-ON* */
+
+ static char buf[30];
+ char *dst = buf;
+ int adj = 0;
+ unsigned n;
+ BOOLEAN found;
+
+ while ((c = *src++) != 0) {
+ found = FALSE;
+ for (n = 0; n < TABLESIZE(table); n++) {
+ if (c == table[n].code) {
+ found = TRUE;
+ LYStrNCpy(dst,
+ table[n].name,
+ sizeof(buf) - (size_t) ((dst - buf) - 1));
+ adj += (int) strlen(dst) - 1;
+ dst += (int) strlen(dst);
+ break;
+ }
+ }
+ if (!found) {
+ *dst++ = (char) c;
+ }
+ }
+ adj -= (int) (dst - buf) - PRETTY_LEN;
+ while (adj-- > 0)
+ *dst++ = ' ';
+ *dst = 0;
+ return buf;
+ }
+
+ return 0;
+}
+
+static char *format_binding(LYKeymap_t *table, int i)
+{
+ LYKeymap_t the_key = table[i];
+ char *buf = 0;
+ char *formatted;
+ Kcmd *rmap = LYKeycodeToKcmd((LYKeymapCode) the_key);
+
+ if (rmap != 0
+ && rmap->name != 0
+ && rmap->doc != 0
+ && (formatted = pretty_html(i - 1)) != 0) {
+ HTSprintf0(&buf, "%-*s %-13s %s\n",
+ PRETTY_LEN, formatted,
+ rmap->name,
+ rmap->doc);
+ return buf;
+ }
+ return 0;
+}
+
+/* if both is true, produce an additional line for the corresponding
+ uppercase key if its binding is different. - kw */
+static void print_binding(HTStream *target, int i, int both)
+{
+ char *buf;
+ LYKeymap_t lac1 = LYK_UNKNOWN; /* 0 */
+
+#if defined(DIRED_SUPPORT) && defined(OK_OVERRIDE)
+ if (prev_lynx_edit_mode && !no_dired_support &&
+ (lac1 = key_override[i]) != LYK_UNKNOWN) {
+ if ((buf = format_binding(key_override, i)) != 0) {
+ PUTS(buf);
+ FREE(buf);
+ }
+ } else
+#endif /* DIRED_SUPPORT && OK_OVERRIDE */
+ if ((buf = format_binding(keymap, i)) != 0) {
+ lac1 = keymap[i];
+ PUTS(buf);
+ FREE(buf);
+ }
+
+ if (!both)
+ return;
+ i -= ' '; /* corresponding uppercase key */
+
+#if defined(DIRED_SUPPORT) && defined(OK_OVERRIDE)
+ if (prev_lynx_edit_mode && !no_dired_support && key_override[i]) {
+ if (key_override[i] != lac1 &&
+ (buf = format_binding(key_override, i)) != 0) {
+ PUTS(buf);
+ FREE(buf);
+ }
+ } else
+#endif /* DIRED_SUPPORT && OK_OVERRIDE */
+ if (keymap[i] != lac1 && (buf = format_binding(keymap, i)) != 0) {
+ PUTS(buf);
+ FREE(buf);
+ }
+}
+
+/*
+ * Return lynxactioncode whose name is the string func. returns -1 if not
+ * found. - kw
+ */
+int lacname_to_lac(const char *func)
+{
+ Kcmd *mp = LYStringToKcmd(func);
+
+ return (mp != 0) ? (int) mp->code : -1;
+}
+
+/*
+ * Return lynxkeycode represented by string src. returns -1 if not valid.
+ *
+ * This is simpler than what map_string_to_keysym() does for USE_KEYMAP, but
+ * compatible with revmap() used for processing KEYMAP options in the
+ * configuration file. - kw
+ */
+int lkcstring_to_lkc(const char *src)
+{
+ int c = -1;
+
+ if (strlen(src) == 1) {
+ c = *src;
+ } else if (strlen(src) == 2 && *src == '^') {
+ c = src[1] & 037;
+ } else if (strlen(src) >= 2 && isdigit(UCH(*src))) {
+ char *next = 0;
+
+ c = (int) strtol(src, &next, 0);
+ if (next != 0 && *next != '\0')
+ c = (-1);
+#ifdef USE_KEYMAPS
+ } else {
+ map_string_to_keysym(src, &c, TRUE);
+#ifndef USE_SLANG
+ if (c >= 0) {
+ /* make curses-keys mapped from Keysym_Strings[] available here */
+ if ((c & LKC_MASK) > 255)
+ c &= ~LKC_ISLKC;
+ }
+#endif
+#endif
+ }
+
+ if (c == CH_ESC) {
+ escape_bound = 1;
+ } else if (c < -1) {
+ c = (-1);
+ }
+
+ return c;
+}
+
+static int LYLoadKeymap(const char *arg GCC_UNUSED,
+ HTParentAnchor *anAnchor,
+ HTFormat format_out,
+ HTStream *sink)
+{
+ HTFormat format_in = WWW_HTML;
+ HTStream *target;
+ char *buf = 0;
+ int i;
+
+ /*
+ * Set up the stream. - FM
+ */
+ target = HTStreamStack(format_in, format_out, sink, anAnchor);
+ if (target == NULL) {
+ HTSprintf0(&buf, CANNOT_CONVERT_I_TO_O,
+ HTAtom_name(format_in), HTAtom_name(format_out));
+ HTAlert(buf);
+ FREE(buf);
+ return (HT_NOT_LOADED);
+ }
+ anAnchor->no_cache = TRUE;
+
+ HTSprintf0(&buf, "<html>\n<head>\n<title>%s</title>\n</head>\n<body>\n",
+ CURRENT_KEYMAP_TITLE);
+ PUTS(buf);
+ HTSprintf0(&buf, "<pre>\n");
+ PUTS(buf);
+
+ for (i = 'a' + 1; i <= 'z' + 1; i++) {
+ print_binding(target, i, TRUE);
+ }
+ for (i = 1; i < KEYMAP_SIZE; i++) {
+ /*
+ * Don't show CHANGE_LINK if mouse not enabled.
+ */
+ if ((i >= 0200 || i <= ' ' || !isalpha(i - 1)) &&
+ (LYUseMouse || (keymap[i] != LYK_CHANGE_LINK))) {
+ print_binding(target, i, FALSE);
+ }
+ }
+
+ HTSprintf0(&buf, "</pre>\n</body>\n</html>\n");
+ PUTS(buf);
+
+ (*target->isa->_free) (target);
+ FREE(buf);
+ return (HT_LOADED);
+}
+
+#ifdef GLOBALDEF_IS_MACRO
+#define _LYKEYMAP_C_GLOBALDEF_1_INIT { "LYNXKEYMAP", LYLoadKeymap, 0}
+GLOBALDEF(HTProtocol, LYLynxKeymap, _LYKEYMAP_C_GLOBALDEF_1_INIT);
+#else
+GLOBALDEF HTProtocol LYLynxKeymap =
+{"LYNXKEYMAP", LYLoadKeymap, 0};
+#endif /* GLOBALDEF_IS_MACRO */
+
+/*
+ * Install func as the mapping for key.
+ * If for_dired is TRUE, install it in the key_override[] table
+ * for Dired mode, otherwise in the general keymap[] table.
+ * If DIRED_SUPPORT or OK_OVERRIDE is not defined, don't do anything
+ * when for_dired is requested.
+ * returns lynxkeycode value != 0 if the mapping was made, 0 if not.
+ */
+int remap(char *key,
+ const char *func,
+ int for_dired)
+{
+ Kcmd *mp;
+ int c;
+ int result = 0;
+
+#if !defined(DIRED_SUPPORT) || !defined(OK_OVERRIDE)
+ if (for_dired) {
+ return result;
+ }
+#endif
+ if (func != NULL) {
+ c = lkcstring_to_lkc(key);
+ if ((c >= 0) && (c < KEYMAP_SIZE)) {
+ /* Remapping of key actions is supported only for basic
+ * lynxkeycodes, without modifiers etc.! If we get somehow
+ * called for an invalid lynxkeycode, fail or silently ignore
+ * modifiers -KW
+ */
+ if (!(c & (LKC_ISLECLAC | LKC_ISLAC))) {
+ c &= LKC_MASK;
+ if ((mp = LYStringToKcmd(func)) != 0) {
+#if defined(DIRED_SUPPORT) && defined(OK_OVERRIDE)
+ if (for_dired)
+ key_override[c + 1] = mp->code;
+ else
+#endif
+ keymap[c + 1] = (LYKeymap_t) mp->code;
+ /* don't return 0, successful */
+ result = (c ? c : (int) LAC_TO_LKC0(mp->code));
+ }
+ }
+ }
+ }
+ return result;
+}
+
+typedef struct {
+ int code;
+ LYKeymap_t map;
+ LYKeymap_t save;
+} ANY_KEYS;
+
+/*
+ * Save the given keys in the table, setting them to the map'd value.
+ */
+static void set_any_keys(ANY_KEYS * table, size_t size)
+{
+ size_t j, k;
+
+ for (j = 0; j < size; ++j) {
+ k = (size_t) (table[j].code + 1);
+ table[j].save = keymap[k];
+ keymap[k] = table[j].map;
+ }
+}
+
+/*
+ * Restore the given keys from the table.
+ */
+static void reset_any_keys(ANY_KEYS * table, size_t size)
+{
+ size_t j, k;
+
+ for (j = 0; j < size; ++j) {
+ k = (size_t) (table[j].code + 1);
+ keymap[k] = table[j].save;
+ }
+}
+
+static ANY_KEYS vms_keys_table[] =
+{
+ {26, LYK_ABORT, 0}, /* control-Z */
+ {'$', LYK_SHELL, 0},
+};
+
+void set_vms_keys(void)
+{
+ set_any_keys(vms_keys_table, TABLESIZE(vms_keys_table));
+}
+
+static ANY_KEYS vi_keys_table[] =
+{
+ {'h', LYK_PREV_DOC, 0},
+ {'j', LYK_NEXT_LINK, 0},
+ {'k', LYK_PREV_LINK, 0},
+ {'l', LYK_ACTIVATE, 0},
+};
+
+static BOOLEAN did_vi_keys;
+
+void set_vi_keys(void)
+{
+ set_any_keys(vi_keys_table, TABLESIZE(vi_keys_table));
+ did_vi_keys = TRUE;
+}
+
+void reset_vi_keys(void)
+{
+ if (did_vi_keys) {
+ reset_any_keys(vi_keys_table, TABLESIZE(vi_keys_table));
+ did_vi_keys = FALSE;
+ }
+}
+
+static ANY_KEYS emacs_keys_table[] =
+{
+ {2, LYK_PREV_DOC, 0}, /* ^B */
+ {14, LYK_NEXT_LINK, 0}, /* ^N */
+ {16, LYK_PREV_LINK, 0}, /* ^P */
+ {6, LYK_ACTIVATE, 0}, /* ^F */
+};
+
+static BOOLEAN did_emacs_keys;
+
+void set_emacs_keys(void)
+{
+ set_any_keys(emacs_keys_table, TABLESIZE(emacs_keys_table));
+ did_emacs_keys = TRUE;
+}
+
+void reset_emacs_keys(void)
+{
+ if (did_emacs_keys) {
+ reset_any_keys(emacs_keys_table, TABLESIZE(emacs_keys_table));
+ did_emacs_keys = FALSE;
+ }
+}
+
+/*
+ * Map numbers to functions as labeled on the IBM Enhanced keypad, and save
+ * their original mapping for reset_numbers_as_arrows(). - FM
+ */
+static ANY_KEYS number_keys_table[] =
+{
+ {'1', LYK_END, 0},
+ {'2', LYK_NEXT_LINK, 0},
+ {'3', LYK_NEXT_PAGE, 0},
+ {'4', LYK_PREV_DOC, 0},
+ {'5', LYK_DO_NOTHING, 0},
+ {'6', LYK_ACTIVATE, 0},
+ {'7', LYK_HOME, 0},
+ {'8', LYK_PREV_LINK, 0},
+ {'9', LYK_PREV_PAGE, 0},
+};
+
+static BOOLEAN did_number_keys;
+
+void set_numbers_as_arrows(void)
+{
+ set_any_keys(number_keys_table, TABLESIZE(number_keys_table));
+ did_number_keys = TRUE;
+}
+
+void reset_numbers_as_arrows(void)
+{
+ if (did_number_keys) {
+ reset_any_keys(number_keys_table, TABLESIZE(number_keys_table));
+ did_number_keys = FALSE;
+ }
+}
+
+char *key_for_func(int func)
+{
+ static char *buf;
+ int i;
+ char *formatted;
+
+ if ((i = LYReverseKeymap(func)) >= 0) {
+ formatted = LYKeycodeToString(i, TRUE);
+ StrAllocCopy(buf, formatted != 0 ? formatted : "?");
+ } else if (buf == 0) {
+ StrAllocCopy(buf, "");
+ }
+ return buf;
+}
+
+/*
+ * Given one or two keys as lynxkeycodes, returns an allocated string
+ * representing the key(s) suitable for statusline messages, or NULL if no
+ * valid lynxkeycode is passed in (i.e., lkc_first < 0 or some other failure).
+ * The caller must free the string. - kw
+ */
+char *fmt_keys(int lkc_first,
+ int lkc_second)
+{
+ char *buf = NULL;
+ BOOLEAN quotes = FALSE;
+ char *fmt_first;
+ char *fmt_second;
+
+ if (lkc_first < 0)
+ return NULL;
+ fmt_first = LYKeycodeToString(lkc_first, TRUE);
+ if (fmt_first && strlen(fmt_first) == 1 && *fmt_first != '\'') {
+ quotes = TRUE;
+ }
+ if (quotes) {
+ if (lkc_second < 0) {
+ HTSprintf0(&buf, "'%s'", fmt_first);
+ return buf;
+ } else {
+ HTSprintf0(&buf, "'%s", fmt_first);
+ }
+ } else {
+ StrAllocCopy(buf, fmt_first);
+ }
+ if (lkc_second >= 0) {
+ fmt_second = LYKeycodeToString(lkc_second, TRUE);
+ if (!fmt_second) {
+ FREE(buf);
+ return NULL;
+ }
+ HTSprintf(&buf, "%s%s%s",
+ (((strlen(fmt_second) > 2 && *fmt_second != '<') ||
+ (strlen(buf) > 2 && buf[strlen(buf) - 1] != '>'))
+ ? " "
+ : ""),
+ fmt_second, quotes ? "'" : "");
+ }
+ return buf;
+}
+
+/*
+ * This function returns the (int)ch mapped to the LYK_foo value passed to it
+ * as an argument. It is like LYReverseKeymap, only the order of search is
+ * different; e.g., small ASCII letters will be returned in preference to
+ * capital ones. Cf. LYKeyForEditAction, LYEditKeyForAction in LYEditmap.c
+ * which use the same order to find a best key. In addition, this function
+ * takes the dired override map into account while LYReverseKeymap doesn't.
+ * The caller must free the returned string. - kw
+ */
+#define FIRST_I 97
+#define NEXT_I(i,imax) ((i==122) ? 32 : (i==96) ? 123 : (i==126) ? 0 :\
+ (i==31) ? 256 : (i==imax) ? 127 :\
+ (i==255) ? (-1) :i+1)
+static int best_reverse_keymap(int lac)
+{
+ int i, c;
+
+ for (i = FIRST_I; i >= 0; i = NEXT_I(i, KEYMAP_SIZE - 1)) {
+#ifdef NOT_ASCII
+ if (i < 256) {
+ c = FROMASCII(i);
+ } else
+#endif
+ c = i;
+#if defined(DIRED_SUPPORT) && defined(OK_OVERRIDE)
+ if (lynx_edit_mode && !no_dired_support && lac &&
+ LKC_TO_LAC(key_override, c) == lac)
+ return c;
+#endif /* DIRED_SUPPORT && OK_OVERRIDE */
+ if (LKC_TO_LAC(keymap, c) == lac) {
+ return c;
+ }
+ }
+
+ return (-1);
+}
+
+/*
+ * This function returns a string representing a key mapped to a LYK_foo
+ * function, or NULL if not found. The string may represent a pair of keys.
+ * if context_code is FOR_INPUT, an appropriate binding for use while in the
+ * (forms) line editor is sought. - kw
+ */
+char *key_for_func_ext(int lac,
+ int context_code)
+{
+ int lkc, modkey = -1;
+
+ if (context_code == FOR_INPUT) {
+ lkc = LYEditKeyForAction(lac, &modkey);
+ if (lkc >= 0) {
+ if (lkc & (LKC_MOD1 | LKC_MOD2 | LKC_MOD3)) {
+ return fmt_keys(modkey, lkc & ~(LKC_MOD1 | LKC_MOD2 | LKC_MOD3));
+ } else {
+ return fmt_keys(lkc, -1);
+ }
+ }
+ }
+ lkc = best_reverse_keymap(lac);
+ if (lkc < 0)
+ return NULL;
+ if (context_code == FOR_INPUT) {
+ modkey = LYKeyForEditAction(LYE_LKCMD);
+ if (modkey < 0)
+ return NULL;
+ return fmt_keys(modkey, lkc);
+ } else {
+ return fmt_keys(lkc, -1);
+ }
+}
+
+/*
+ * This function returns TRUE if the ch is non-alphanumeric and maps to KeyName
+ * (LYK_foo in the keymap[] array). - FM
+ */
+BOOLEAN LYisNonAlnumKeyname(int ch,
+ int KeyName)
+{
+ BOOLEAN result = FALSE;
+
+ if (ch >= 0 && (ch + 1) < KEYMAP_SIZE) {
+ if ((ch <= 0
+ || StrChr("0123456789"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ "abcdefghijklmnopqrstuvwxyz", ch) == NULL)
+ && (keymap[ch + 1] == KeyName)) {
+ result = TRUE;
+ }
+ }
+ return result;
+}
+
+/*
+ * This function returns the (int)ch mapped to the LYK_foo value passed to it
+ * as an argument. - FM
+ */
+int LYReverseKeymap(int KeyName)
+{
+ int i;
+ int result = -1;
+
+ for (i = 1; i < KEYMAP_SIZE; i++) {
+ if (keymap[i] == KeyName) {
+ result = (i - 1);
+ break;
+ }
+ }
+
+ return result;
+}
+
+#ifdef EXP_KEYBOARD_LAYOUT
+BOOLEAN LYSetKbLayout(char *layout_id)
+{
+ int i;
+ BOOLEAN result = FALSE;
+
+ for (i = 0; i < (int) TABLESIZE(LYKbLayoutNames) - 1; i++) {
+ if (!strcasecomp(LYKbLayoutNames[i], layout_id)) {
+ current_layout = i;
+ result = TRUE;
+ break;
+ }
+ }
+
+ return result;
+}
+#endif
+
+#if 0
+/*
+ * This function was useful in converting the hand-crafted key-bindings to
+ * their reusable form in 2.8.8 -TD
+ */
+static void checkKeyMap(LYEditConfig * table)
+{
+ unsigned j, k;
+ char comment[80];
+ int first = TRUE;
+
+ for (j = 0; table->init[j].code >= 0; ++j) {
+ int code = table->init[j].code;
+
+ if (table->init[j].edit != table->used[code]) {
+ if (first) {
+ printf("TABLE %s\n", table->name);
+ first = FALSE;
+ }
+ printf("%u: init %d vs used %d\n",
+ j,
+ table->init[j].edit,
+ table->used[code]);
+ }
+ }
+ for (j = 0; j < KEYMAP_SIZE; ++j) {
+ int code = (int) j;
+ BOOL found = FALSE;
+
+ for (k = 0; table->init[k].code >= 0; ++k) {
+ if (code == table->init[k].code) {
+ found = TRUE;
+ break;
+ }
+ }
+ if (!found) {
+ if (table->used[j] != 0) {
+ unsigned used = (j - 1);
+ int edit = table->used[j];
+ const char *prefix = "LYK_";
+ const char *name = 0;
+ Kcmd *cmd = LYKeycodeToKcmd(edit + 0);
+
+ if (cmd != 0) {
+ name = cmd->name;
+ }
+
+ if (used < 32) {
+ char temp[80];
+ const char *what = 0;
+
+ switch (used) {
+ case 0:
+ what = "nul";
+ break;
+ case 17:
+ what = "XON";
+ break;
+ case 19:
+ what = "XOFF";
+ break;
+ default:
+ sprintf(temp, "^%c", used + 'A');
+ what = temp;
+ break;
+ }
+ sprintf(comment, "\t/* %s */", what);
+ } else if (used < 127) {
+ sprintf(comment, "\t/* %c */", used);
+ } else if (used == 127) {
+ strcpy(comment, "\t/* DEL */");
+ } else {
+ const char *what = LYextraKeysToName(used);
+
+ if (non_empty(what)) {
+ sprintf(comment, "\t/* %s%s */", what,
+ ((StrChr(what, '_') != 0)
+ ? ""
+ : "_KEY"));
+ } else {
+ strcpy(comment, "");
+ }
+ }
+ if (name == 0) {
+ name = "XXX";
+ }
+ if (first) {
+ printf("TABLE %s\n", table->name);
+ first = FALSE;
+ }
+ printf("\t{ %d, %s%s },%s\n", code, prefix, name, comment);
+ }
+ }
+ }
+}
+
+#else
+#define checkKeyMap(table) /* nothing */
+#endif
+
+static void initKeyMap(LYEditConfig * table)
+{
+ unsigned k;
+ LYEditCode *used = table->used;
+ const LYEditInit *init = table->init;
+
+ memset(used, 0, sizeof(LYEditCode) * KEYMAP_SIZE);
+
+ for (k = 0; init[k].code >= 0; ++k) {
+ int code = init[k].code;
+
+ used[code] = init[k].edit;
+ }
+ checkKeyMap(table);
+}
+
+/*
+ * Reset the key bindings to their default values.
+ */
+void LYinitKeymap(void)
+{
+ CTRACE((tfp, "LYinitKeymap\n"));
+ initKeyMap(&myKeymapData);
+#if defined(DIRED_SUPPORT) && defined(OK_OVERRIDE)
+ initKeyMap(&myOverrideData);
+#endif
+}
diff --git a/src/LYKeymap.h b/src/LYKeymap.h
new file mode 100644
index 0000000..a06db04
--- /dev/null
+++ b/src/LYKeymap.h
@@ -0,0 +1,307 @@
+/* $LynxId: LYKeymap.h,v 1.55 2015/10/07 23:34:55 tom Exp $ */
+#ifndef LYKEYMAP_H
+#define LYKEYMAP_H
+
+#include <HTUtils.h>
+#include <HTList.h>
+#include <LYCurses.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ extern BOOLEAN LYisNonAlnumKeyname(int ch, int KeyName);
+ extern HTList *LYcommandList(void);
+ extern const char *lec_to_lecname(int code);
+ extern char *LYKeycodeToString(int c, int upper8);
+ extern char *fmt_keys(int lkc_first, int lkc_second);
+ extern char *key_for_func(int func);
+ extern char *key_for_func_ext(int lac, int context_code);
+ extern int LYReverseKeymap(int KeyName);
+ extern int LYStringToKeycode(char *src);
+ extern int lacname_to_lac(const char *func);
+ extern int lecname_to_lec(const char *func);
+ extern int lkcstring_to_lkc(const char *src);
+ extern int remap(char *key, const char *func, int for_dired);
+ extern void print_keymap(char **newfile);
+ extern void reset_emacs_keys(void);
+ extern void reset_numbers_as_arrows(void);
+ extern void reset_vi_keys(void);
+ extern void set_emacs_keys(void);
+ extern void set_numbers_as_arrows(void);
+ extern void set_vi_keys(void);
+ extern void set_vms_keys(void);
+
+/* We only use unsigned keycodes; if there's a problem matching with enum
+ * (which is supposed to be 'int'), that would be okay, but not as clean
+ * for type-checking.
+ */
+ typedef short LYKeymap_t;
+
+#define KEYMAP_SIZE 661
+ extern LYKeymap_t keymap[KEYMAP_SIZE]; /* main keymap matrix */
+
+#ifdef EXP_KEYBOARD_LAYOUT
+ typedef unsigned short LYKbLayout_t;
+ extern int current_layout;
+ extern LYKbLayout_t *LYKbLayouts[];
+ extern const char *LYKbLayoutNames[];
+ extern BOOLEAN LYSetKbLayout(char *layout_id);
+#endif
+
+#if defined(DIRED_SUPPORT) && defined(OK_OVERRIDE)
+ extern LYKeymap_t key_override[];
+#endif
+
+/* readable mapping for characters in edit- and key-maps */
+#define CTL(c) ((c) & 0x1f)
+#define KHR(c) ((c) + 1)
+#define KTL(c) (CTL(c) + 1)
+
+/* * * LynxKeyCodes * * */
+#define LKC_ISLECLAC 0x8000 /* flag: contains lynxaction + editaction */
+#define LKC_MOD1 0x4000 /* a modifier bit - currently for ^x-map */
+#define LKC_MOD2 0x2000 /* another one - currently for esc-map */
+#define LKC_MOD3 0x1000 /* another one - currently for double-map */
+#define LKC_ISLAC 0x0800 /* flag: lynxkeycode already lynxactioncode */
+
+/* Used to distinguish internal Lynx keycodes of (say) extended ncurses once. */
+#define LKC_ISLKC 0x0400 /* flag: already lynxkeycode (not native) */
+ /* 0x0400 is MOUSE_KEYSYM for slang in LYStrings.c */
+#define LKC_MASK 0x07FF /* mask for lynxkeycode proper */
+
+#define LKC_DONE 0x07FE /* special value - operation done, not-a-key */
+
+/* * * LynxActionCodes * * */
+#define LAC_SHIFT 8 /* shift for lynxactioncode - must not
+ overwrite any assigned LYK_* values */
+#define LAC_MASK ((1<<LAC_SHIFT)-1)
+ /* mask for lynxactioncode - must cover all
+ assigned LYK_* values */
+
+/* Return lkc masking single actioncode, given an lkc masking a lac + lec */
+#define LKC2_TO_LKC(c) (((c) == -1 || !((c) & LKC_ISLECLAC)) ? (c) : \
+ (((c) & LAC_MASK) | LKC_ISLAC))
+
+/* Return lynxeditactioncode, given an lkc masking a lac + lec */
+#define LKC2_TO_LEC(c) (((c) == -1 || !((c) & LKC_ISLECLAC)) ? (c) : \
+ ((((c)&~LKC_ISLECLAC)>>LAC_SHIFT) & LAC_MASK))
+
+/* Convert lynxkeycode to lynxactioncode. Modifiers are dropped. */
+#define LKC_TO_LAC(ktab,c) (((c) == -1) ? ktab[0] : \
+ ((c) & (LKC_ISLECLAC|LKC_ISLAC)) ? ((c) & LAC_MASK) : \
+ ktab[((c) & LKC_MASK) + 1])
+
+/* Mask lynxactioncode as a lynxkeycode. */
+#define LAC_TO_LKC0(a) ((a)|LKC_ISLAC)
+
+/* Mask a lynxactioncode and an editactioncode as a lynxkeycode. */
+#define LACLEC_TO_LKC0(a,b) ((a)|((b)<<LAC_SHIFT)|LKC_ISLECLAC)
+
+/* Convert lynxactioncode to a lynxkeycode, attempting reverse mapping. */
+#define LAC_TO_LKC(a) ((LYReverseKeymap(a)>=0)?LYReverseKeymap(a):LAC_TO_LKC0(a))
+
+/* Simplify a lynxkeycode:
+ attempt reverse mapping if a single masked lynxactioncode, drop modifiers. */
+#define LKC_TO_C(c) ((c&LKC_ISLECLAC)? c : (c&LKC_ISLAC)? LAC_TO_LKC(c&LAC_MASK) : (c&LKC_MASK))
+
+#define LKC_HAS_ESC_MOD(c) (c >= 0 && !(c&LKC_ISLECLAC) && (c&LKC_MOD2))
+
+/* * The defined LynxActionCodes * */
+
+/* Variables for holding and passing around lynxactioncodes are generally of
+ * type int, the types LYKeymap_t and LYKeymapCodes are currently only used for
+ * the definitions. That could change. - kw
+ *
+ * The values in this enum are indexed against the command names in the
+ * 'revmap[]' array in LYKeymap.c
+ */
+ typedef enum {
+ LYK_UNKNOWN = 0
+ ,LYK_COMMAND
+ ,LYK_1
+ ,LYK_2
+ ,LYK_3
+ ,LYK_4
+ ,LYK_5
+ ,LYK_6
+ ,LYK_7
+ ,LYK_8
+ ,LYK_9
+ ,LYK_SOURCE
+ ,LYK_RELOAD
+ ,LYK_QUIT
+ ,LYK_ABORT
+ ,LYK_NEXT_PAGE
+ ,LYK_PREV_PAGE
+ ,LYK_UP_TWO
+ ,LYK_DOWN_TWO
+ ,LYK_UP_HALF
+ ,LYK_DOWN_HALF
+ ,LYK_REFRESH
+ ,LYK_HOME
+ ,LYK_END
+ ,LYK_FIRST_LINK
+ ,LYK_LAST_LINK
+ ,LYK_PREV_LINK
+ ,LYK_NEXT_LINK
+ ,LYK_LPOS_PREV_LINK
+ ,LYK_LPOS_NEXT_LINK
+ ,LYK_FASTBACKW_LINK
+ ,LYK_FASTFORW_LINK
+ ,LYK_UP_LINK
+ ,LYK_DOWN_LINK
+ ,LYK_RIGHT_LINK
+ ,LYK_LEFT_LINK
+ ,LYK_HISTORY
+ ,LYK_PREV_DOC
+ ,LYK_NEXT_DOC
+ ,LYK_ACTIVATE
+ ,LYK_MOUSE_SUBMIT /* mostly like LYK_ACTIVATE, for mouse use, don't map */
+ ,LYK_SUBMIT
+ ,LYK_RESET
+ ,LYK_GOTO
+ ,LYK_ECGOTO
+ ,LYK_HELP
+ ,LYK_DWIMHELP
+ ,LYK_INDEX
+ ,LYK_NOCACHE
+ ,LYK_INTERRUPT
+ ,LYK_MAIN_MENU
+ ,LYK_OPTIONS
+ ,LYK_INDEX_SEARCH
+ ,LYK_WHEREIS
+ ,LYK_PREV
+ ,LYK_NEXT
+ ,LYK_COMMENT
+ ,LYK_EDIT
+ ,LYK_INFO
+ ,LYK_PRINT
+ ,LYK_ADD_BOOKMARK
+ ,LYK_DEL_BOOKMARK
+ ,LYK_VIEW_BOOKMARK
+ ,LYK_VLINKS
+ ,LYK_SHELL
+ ,LYK_DOWNLOAD
+ ,LYK_TRACE_TOGGLE
+ ,LYK_TRACE_LOG
+ ,LYK_IMAGE_TOGGLE
+ ,LYK_INLINE_TOGGLE
+ ,LYK_HEAD
+ ,LYK_DO_NOTHING
+ ,LYK_TOGGLE_HELP
+ ,LYK_JUMP
+ ,LYK_EDITMAP
+ ,LYK_KEYMAP
+ ,LYK_LIST
+ ,LYK_TOOLBAR
+ ,LYK_HISTORICAL
+ ,LYK_MINIMAL
+ ,LYK_SOFT_DQUOTES
+ ,LYK_RAW_TOGGLE
+ ,LYK_COOKIE_JAR
+ ,LYK_F_LINK_NUM
+ ,LYK_CLEAR_AUTH
+ ,LYK_SWITCH_DTD
+ ,LYK_ELGOTO
+ ,LYK_CHANGE_LINK
+ ,LYK_DWIMEDIT
+ ,LYK_EDITTEXTAREA
+ ,LYK_GROWTEXTAREA
+ ,LYK_INSERTFILE
+
+#ifdef USE_ADDRLIST_PAGE
+ ,LYK_ADDRLIST
+#else
+#define LYK_ADDRLIST LYK_ADD_BOOKMARK
+#endif
+
+#ifdef USE_EXTERNALS
+ ,LYK_EXTERN_LINK
+ ,LYK_EXTERN_PAGE
+#else
+#define LYK_EXTERN_LINK LYK_UNKNOWN
+#define LYK_EXTERN_PAGE LYK_UNKNOWN
+#endif /* !defined(USE_EXTERNALS) */
+
+#if defined(VMS) || defined(DIRED_SUPPORT)
+ ,LYK_DIRED_MENU
+#else
+#define LYK_DIRED_MENU LYK_UNKNOWN
+#endif /* VMS || DIRED_SUPPORT */
+
+#ifdef DIRED_SUPPORT
+ ,LYK_CREATE
+ ,LYK_REMOVE
+ ,LYK_MODIFY
+ ,LYK_TAG_LINK
+ ,LYK_UPLOAD
+ ,LYK_INSTALL
+#else
+#define LYK_TAG_LINK LYK_UNKNOWN
+#endif /* DIRED_SUPPORT */
+
+ ,LYK_CHANGE_CENTER
+
+#ifdef KANJI_CODE_OVERRIDE
+ ,LYK_CHANGE_KCODE
+#endif
+
+#ifdef SUPPORT_CHDIR
+ ,LYK_CHDIR
+ ,LYK_PWD
+#endif
+
+#ifdef USE_CURSES_PADS
+ ,LYK_SHIFT_LEFT
+ ,LYK_SHIFT_RIGHT
+ ,LYK_LINEWRAP_TOGGLE
+#else
+#define LYK_SHIFT_LEFT LYK_UNKNOWN
+#define LYK_SHIFT_RIGHT LYK_UNKNOWN
+#define LYK_LINEWRAP_TOGGLE LYK_UNKNOWN
+#endif
+
+#ifdef CAN_CUT_AND_PASTE
+ ,LYK_PASTE_URL
+ ,LYK_TO_CLIPBOARD
+#else
+#define LYK_PASTE_URL LYK_UNKNOWN
+#define LYK_TO_CLIPBOARD LYK_UNKNOWN
+#endif
+
+#ifdef EXP_NESTED_TABLES
+ ,LYK_NESTED_TABLES
+#else
+#define LYK_NESTED_TABLES LYK_UNKNOWN
+#endif
+
+#ifdef USE_CACHEJAR
+ ,LYK_CACHE_JAR
+#else
+#define LYK_CACHE_JAR LYK_UNKNOWN
+#endif
+
+#ifdef USE_MAXSCREEN_TOGGLE
+ ,LYK_MAXSCREEN_TOGGLE
+#else
+#define LYK_MAXSCREEN_TOGGLE LYK_UNKNOWN
+#endif
+
+ } LYKeymapCode;
+
+/*
+ * Symbol table for internal commands.
+ */
+ typedef struct {
+ LYKeymapCode code;
+ const char *name;
+ const char *doc;
+ } Kcmd;
+
+ extern Kcmd *LYKeycodeToKcmd(LYKeymapCode code);
+ extern Kcmd *LYStringToKcmd(const char *name);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* LYKEYMAP_H */
diff --git a/src/LYLeaks.c b/src/LYLeaks.c
new file mode 100644
index 0000000..d082a77
--- /dev/null
+++ b/src/LYLeaks.c
@@ -0,0 +1,1169 @@
+/*
+ * $LynxId: LYLeaks.c,v 1.43 2018/12/27 23:48:37 Kamil.Dudka Exp $
+ *
+ * Copyright (c) 1994, University of Kansas, All Rights Reserved
+ * (this file was rewritten twice - 1998/1999 and 2003/2004)
+ *
+ * This code will be used only if LY_FIND_LEAKS is defined.
+ *
+ * Revision History:
+ * 05-26-94 created Lynx 2-3-1 Garrett Arch Blythe
+ * 10-30-97 modified to handle StrAllocCopy() and
+ * StrAllocCat(). - KW & FM
+ * 07-23-07 free leaks of THIS module too -TD
+ * 02-09-12 add bstring functions -TD
+ */
+
+/*
+ * Disable the overriding of the memory routines for this file.
+ */
+#define NO_MEMORY_TRACKING
+
+#include <HTUtils.h>
+#include <LYexit.h>
+#include <LYLeaks.h>
+#include <LYUtils.h>
+#include <LYGlobalDefs.h>
+
+#ifdef LY_FIND_LEAKS
+
+static AllocationList *ALp_RunTimeAllocations = NULL;
+
+#define LEAK_SUMMARY
+
+#ifdef LEAK_SUMMARY
+
+static size_t now_allocated = 0;
+static size_t peak_alloced = 0;
+
+static size_t total_alloced = 0;
+static size_t total_freed = 0;
+
+static long count_mallocs = 0;
+static long count_frees = 0;
+
+static void CountMallocs(size_t size)
+{
+ ++count_mallocs;
+ total_alloced += size;
+ now_allocated += size;
+ if (peak_alloced < now_allocated)
+ peak_alloced = now_allocated;
+}
+
+static void CountFrees(size_t size)
+{
+ ++count_frees;
+ total_freed += size;
+ now_allocated -= size;
+}
+
+#else
+#define CountMallocs(size) ++count_mallocs
+#define CountFrees(size) /* nothing */
+#endif
+
+/*
+ * Purpose: Add a new allocation item to the list.
+ * Arguments: ALp_new The new item to add.
+ * Return Value: void
+ * Remarks/Portability/Dependencies/Restrictions:
+ * Static function made to make code reusable in projects beyond
+ * Lynx (some might ask why not use HTList).
+ * Revision History:
+ * 05-26-94 created Lynx 2-3-1 Garrett Arch Blythe
+ */
+static void AddToList(AllocationList * ALp_new)
+{
+ /*
+ * Just make this the first item in the list.
+ */
+ ALp_new->ALp_Next = ALp_RunTimeAllocations;
+ ALp_RunTimeAllocations = ALp_new;
+}
+
+/*
+ * Purpose: Find the place in the list where vp_find is currently
+ * tracked.
+ * Arguments: vp_find A pointer to look for in the list.
+ * Return Value: AllocationList * Either vp_find's place in the
+ * list or NULL if not found.
+ * Remarks/Portability/Dependencies/Restrictions:
+ * Static function made to make code reusable in projects outside
+ * of Lynx (some might ask why not use HTList).
+ * Revision History:
+ * 05-26-94 created Lynx 2-3-1 Garrett Arch Blythe
+ */
+static AllocationList *FindInList(void *vp_find)
+{
+ AllocationList *ALp_find = ALp_RunTimeAllocations;
+
+ /*
+ * Go through the list of allocated pointers until end of list or vp_find
+ * is found.
+ */
+ while (ALp_find != NULL) {
+ if (ALp_find->vp_Alloced == vp_find) {
+ break;
+ }
+ ALp_find = ALp_find->ALp_Next;
+ }
+
+ return (ALp_find);
+}
+
+/*
+ * Purpose: Remove the specified item from the list.
+ * Arguments: ALp_del The item to remove from the list.
+ * Return Value: void
+ * Remarks/Portability/Dependencies/Restrictions:
+ * Static function made to make code reusable in projects outside
+ * of Lynx (some might ask why not use HTList).
+ * Revision History:
+ * 05-26-94 created Lynx 2-3-1 Garrett Arch Blythe
+ */
+static void RemoveFromList(AllocationList * ALp_del)
+{
+ AllocationList *ALp_findbefore = ALp_RunTimeAllocations;
+
+ /*
+ * There is one special case, where the item to remove is the first in the
+ * list.
+ */
+ if (ALp_del == ALp_findbefore) {
+ ALp_RunTimeAllocations = ALp_del->ALp_Next;
+ } else {
+
+ /*
+ * Loop through checking all of the next values, if a match don't
+ * continue. Always assume the item will be found.
+ */
+ while (ALp_findbefore->ALp_Next != ALp_del) {
+ ALp_findbefore = ALp_findbefore->ALp_Next;
+ }
+
+ /*
+ * We are one item before the one to get rid of. Get rid of it.
+ */
+ ALp_findbefore->ALp_Next = ALp_del->ALp_Next;
+ }
+}
+
+/*
+ * Make the malloc-sequence available for debugging/tracing.
+ */
+#ifndef LYLeakSequence
+long LYLeakSequence(void)
+{
+ return count_mallocs;
+}
+#endif
+
+/*
+ * Purpose: Print a report of all memory left unallocated by
+ * Lynx code or attempted unallocations on
+ * pointers that are not valid and then free
+ * all unfreed memory.
+ * Arguments: void
+ * Return Value: void
+ * Remarks/Portability/Dependencies/Restrictions:
+ * This function should be registered for execution with the
+ * atexit (stdlib.h) function as the first statement
+ * in main.
+ * All output of this function is sent to the file defined in
+ * the header LYLeaks.h (LEAKAGE_SINK).
+ */
+void LYLeaks(void)
+{
+ AllocationList *ALp_head;
+ size_t st_total = (size_t) 0;
+ FILE *Fp_leakagesink;
+
+ CTRACE((tfp, "entering LYLeaks, flag=%d\n", LYfind_leaks));
+
+ if (LYfind_leaks == FALSE) {
+ /*
+ * Free MY leaks too, in case someone else is watching.
+ */
+ while (ALp_RunTimeAllocations != NULL) {
+ ALp_head = ALp_RunTimeAllocations;
+ ALp_RunTimeAllocations = ALp_head->ALp_Next;
+ free(ALp_head);
+ }
+ return;
+ }
+
+ /*
+ * Open the leakage sink to take all the output. Recreate the file each
+ * time. Do nothing if unable to open the file.
+ */
+ Fp_leakagesink = LYNewTxtFile(LYLeaksPath);
+ if (Fp_leakagesink == NULL) {
+ return;
+ }
+
+ while (ALp_RunTimeAllocations != NULL) {
+ /*
+ * Take the head off of the run time allocation list.
+ */
+ ALp_head = ALp_RunTimeAllocations;
+ ALp_RunTimeAllocations = ALp_head->ALp_Next;
+
+ /*
+ * Print the type of leak/error. Release memory when we no longer
+ * need it.
+ */
+ if (ALp_head->vp_Alloced == NULL) {
+ /*
+ * If there is realloc information on the bad request, then it was
+ * a bad pointer value in a realloc statement.
+ */
+ fprintf(Fp_leakagesink, "%s.\n",
+ gettext("Invalid pointer detected."));
+ fprintf(Fp_leakagesink, "%s\t%ld\n",
+ gettext("Sequence:"),
+ ALp_head->st_Sequence);
+ fprintf(Fp_leakagesink, "%s\t%p\n",
+ gettext("Pointer:"), ALp_head->vp_BadRequest);
+
+ /*
+ * Don't free the bad request, it is an invalid pointer. If the
+ * free source information is empty, we should check the realloc
+ * information too since it can get passed bad pointer values also.
+ */
+ if (ALp_head->SL_memory.cp_FileName == NULL) {
+ fprintf(Fp_leakagesink, "%s\t%s\n",
+ gettext("FileName:"),
+ ALp_head->SL_realloc.cp_FileName);
+ fprintf(Fp_leakagesink, "%s\t%d\n",
+ gettext("LineCount:"),
+ ALp_head->SL_realloc.ssi_LineNumber);
+ } else {
+ fprintf(Fp_leakagesink, "%s\t%s\n",
+ gettext("FileName:"),
+ ALp_head->SL_memory.cp_FileName);
+ fprintf(Fp_leakagesink, "%s\t%d\n",
+ gettext("LineCount:"),
+ ALp_head->SL_memory.ssi_LineNumber);
+ }
+ } else {
+ size_t i_counter;
+ char *value = (char *) (ALp_head->vp_Alloced);
+
+ /*
+ * Increment the count of total memory lost and then print the
+ * information.
+ */
+ st_total += ALp_head->st_Bytes;
+
+ fprintf(Fp_leakagesink, "%s\n",
+ gettext("Memory leak detected."));
+ fprintf(Fp_leakagesink, "%s\t%ld\n",
+ gettext("Sequence:"),
+ ALp_head->st_Sequence);
+ fprintf(Fp_leakagesink, "%s\t%p\n",
+ gettext("Pointer:"),
+ ALp_head->vp_Alloced);
+ fprintf(Fp_leakagesink, "%s\t",
+ gettext("Contains:"));
+ for (i_counter = 0;
+ i_counter < ALp_head->st_Bytes &&
+ i_counter < MAX_CONTENT_LENGTH;
+ i_counter++) {
+ if (isprint(UCH(value[i_counter]))) {
+ fprintf(Fp_leakagesink, "%c", value[i_counter]);
+ } else {
+ fprintf(Fp_leakagesink, "|");
+ }
+ }
+ fprintf(Fp_leakagesink, "\n");
+ fprintf(Fp_leakagesink, "%s\t%d\n",
+ gettext("ByteSize:"),
+ (int) (ALp_head->st_Bytes));
+ fprintf(Fp_leakagesink, "%s\t%s\n",
+ gettext("FileName:"),
+ ALp_head->SL_memory.cp_FileName);
+ fprintf(Fp_leakagesink, "%s\t%d\n",
+ gettext("LineCount:"),
+ ALp_head->SL_memory.ssi_LineNumber);
+ /*
+ * Give the last time the pointer was realloced if it happened
+ * also.
+ */
+ if (ALp_head->SL_realloc.cp_FileName != NULL) {
+ fprintf(Fp_leakagesink, "%s\t%s\n",
+ gettext("realloced:"),
+ ALp_head->SL_realloc.cp_FileName);
+ fprintf(Fp_leakagesink, "%s\t%d\n",
+ gettext("LineCount:"),
+ ALp_head->SL_realloc.ssi_LineNumber);
+ }
+ fflush(Fp_leakagesink);
+ FREE(ALp_head->vp_Alloced);
+ }
+
+ /*
+ * Create a blank line and release the memory held by the item.
+ */
+ fprintf(Fp_leakagesink, "\n");
+ FREE(ALp_head);
+ }
+
+ /*
+ * Give a grand total of the leakage. Close the output file.
+ */
+ fprintf(Fp_leakagesink, "%s\t%u\n",
+ gettext("Total memory leakage this run:"),
+ (unsigned) st_total);
+#ifdef LEAK_SUMMARY
+ fprintf(Fp_leakagesink,
+ "%s\t%lu\n", gettext("Peak allocation"), (unsigned long) peak_alloced);
+ fprintf(Fp_leakagesink,
+ "%s\t%lu\n", gettext("Bytes allocated"), (unsigned long) total_alloced);
+ fprintf(Fp_leakagesink,
+ "%s\t%ld\n", gettext("Total mallocs"), count_mallocs);
+ fprintf(Fp_leakagesink,
+ "%s\t%ld\n", gettext("Total frees"), count_frees);
+#endif
+ fclose(Fp_leakagesink);
+
+ HTSYS_purge(LEAKAGE_SINK);
+}
+
+/*
+ * Purpose: Capture allocations using malloc (stdlib.h) and track
+ * the information in a list.
+ * Arguments: st_bytes The size of the allocation requested
+ * in bytes.
+ * cp_File The file from which the request for
+ * allocation came from.
+ * ssi_Line The line number in cp_File where the
+ * allocation request came from.
+ * Return Value: void * A pointer to the allocated memory or NULL on
+ * failure as per malloc (stdlib.h)
+ * Remarks/Portability/Dependencies/Restrictions:
+ * If no memory is allocated, then no entry is added to the
+ * allocation list.
+ * Revision History:
+ * 05-26-94 created Lynx 2-3-1 Garrett Arch Blythe
+ */
+void *LYLeakMalloc(size_t st_bytes, const char *cp_File,
+ const short ssi_Line)
+{
+ void *vp_malloc;
+
+ if (LYfind_leaks == FALSE) {
+ vp_malloc = (void *) malloc(st_bytes);
+ } else {
+
+ /*
+ * Do the actual allocation.
+ */
+ vp_malloc = (void *) malloc(st_bytes);
+ CountMallocs(st_bytes);
+
+ /*
+ * Only on successful allocation do we track any information.
+ */
+ if (vp_malloc != NULL) {
+ /*
+ * Further allocate memory to store the information. Just return
+ * on failure to allocate more.
+ */
+ AllocationList *ALp_new = typecalloc(AllocationList);
+
+ if (ALp_new != NULL) {
+ /*
+ * Copy over the relevant information. There is no need to
+ * allocate more memory for the file name as it is a static
+ * string anyway.
+ */
+ ALp_new->st_Sequence = count_mallocs;
+ ALp_new->vp_Alloced = vp_malloc;
+ ALp_new->st_Bytes = st_bytes;
+ ALp_new->SL_memory.cp_FileName = cp_File;
+ ALp_new->SL_memory.ssi_LineNumber = ssi_Line;
+
+ /*
+ * Add the new item to the allocation list.
+ */
+ AddToList(ALp_new);
+ }
+ }
+ }
+ return (vp_malloc);
+}
+
+/*
+ * Purpose: Add information about new allocation to the list,
+ * after a call to malloc or calloc or an equivalent
+ * function which may or may not have already created
+ * a list entry.
+ * Arguments: vp_malloc The pointer to newly allocated memory.
+ * Arguments: st_bytes The size of the allocation requested
+ * in bytes.
+ * cp_File The file from which the request for
+ * allocation came from.
+ * ssi_Line The line number in cp_File where the
+ * allocation request came from.
+ * Return Value: void * A pointer to the allocated memory or NULL on
+ * failure.
+ * Remarks/Portability/Dependencies/Restrictions:
+ * If no memory is allocated, then no entry is added to the
+ * allocation list.
+ * Revision History:
+ * 1999-02-08 created, modelled after LYLeakMalloc - kw
+ */
+AllocationList *LYLeak_mark_malloced(void *vp_malloced,
+ size_t st_bytes,
+ const char *cp_File,
+ const short ssi_Line)
+{
+ AllocationList *ALp_new = NULL;
+
+ if (LYfind_leaks != FALSE) {
+ /*
+ * The actual allocation has already been done!
+ *
+ * Only on successful allocation do we track any information.
+ */
+ if (vp_malloced != NULL) {
+ /*
+ * See if there is already an entry. If so, just update the source
+ * location info.
+ */
+ ALp_new = FindInList(vp_malloced);
+ if (ALp_new) {
+ ALp_new->SL_memory.cp_FileName = cp_File;
+ ALp_new->SL_memory.ssi_LineNumber = ssi_Line;
+ } else {
+ /*
+ * Further allocate memory to store the information. Just
+ * return on failure to allocate more.
+ */
+ ALp_new = typecalloc(AllocationList);
+ if (ALp_new != NULL) {
+ /*
+ * Copy over the relevant information.
+ */
+ ALp_new->vp_Alloced = vp_malloced;
+ ALp_new->st_Bytes = st_bytes;
+ ALp_new->SL_memory.cp_FileName = cp_File;
+ ALp_new->SL_memory.ssi_LineNumber = ssi_Line;
+
+ /*
+ * Add the new item to the allocation list.
+ */
+ AddToList(ALp_new);
+ CountMallocs(st_bytes);
+ }
+ }
+ }
+ }
+ return (ALp_new);
+}
+
+/*
+ * Purpose: Capture allocations by calloc (stdlib.h) and
+ * save relevant information in a list.
+ * Arguments: st_number The number of items to allocate.
+ * st_bytes The size of each item.
+ * cp_File The file which wants to allocation.
+ * ssi_Line The line number in cp_File requesting
+ * the allocation.
+ * Return Value: void * The allocated memory, or NULL on failure as
+ * per calloc (stdlib.h)
+ * Remarks/Portability/Dependencies/Restrictions:
+ * If no memory can be allocated, then no entry will be added
+ * to the list.
+ * Revision History:
+ * 05-26-94 created Lynx 2-3-1 Garrett Arch Blythe
+ */
+void *LYLeakCalloc(size_t st_number, size_t st_bytes, const char *cp_File,
+ const short ssi_Line)
+{
+ void *vp_calloc;
+
+ if (LYfind_leaks == FALSE) {
+ vp_calloc = (void *) calloc(st_number, st_bytes);
+ } else {
+
+ /*
+ * Allocate the requested memory.
+ */
+ vp_calloc = (void *) calloc(st_number, st_bytes);
+ CountMallocs(st_bytes * st_number);
+
+ /*
+ * Only if the allocation was a success do we track information.
+ */
+ if (vp_calloc != NULL) {
+ /*
+ * Allocate memory for the item to be in the list. If unable, just
+ * return.
+ */
+ AllocationList *ALp_new = typecalloc(AllocationList);
+
+ if (ALp_new != NULL) {
+
+ /*
+ * Copy over the relevant information. There is no need to
+ * allocate memory for the file name as it is a static string
+ * anyway.
+ */
+ ALp_new->st_Sequence = count_mallocs;
+ ALp_new->vp_Alloced = vp_calloc;
+ ALp_new->st_Bytes = (st_number * st_bytes);
+ ALp_new->SL_memory.cp_FileName = cp_File;
+ ALp_new->SL_memory.ssi_LineNumber = ssi_Line;
+
+ /*
+ * Add the item to the allocation list.
+ */
+ AddToList(ALp_new);
+ }
+ }
+ }
+ return (vp_calloc);
+}
+
+/*
+ * Purpose: Capture any realloc (stdlib.h) calls in order to
+ * properly keep track of our run time allocation
+ * table.
+ * Arguments: vp_Alloced The previously allocated block of
+ * memory to resize. If NULL,
+ * realloc works just like
+ * malloc.
+ * st_newBytes The new size of the chunk of memory.
+ * cp_File The file containing the realloc.
+ * ssi_Line The line containing the realloc in cp_File.
+ * Return Value: void * The new pointer value (could be the same) or
+ * NULL if unable to resize (old block
+ * still exists).
+ * Remarks/Portability/Dependencies/Restrictions:
+ * If unable to resize vp_Alloced, then no change in the
+ * allocation list will be made.
+ * If vp_Alloced is an invalid pointer value, the program will
+ * exit after one last entry is added to the allocation list.
+ * Revision History:
+ * 05-26-94 created Lynx 2-3-1 Garrett Arch Blythe
+ */
+void *LYLeakRealloc(void *vp_Alloced,
+ size_t st_newBytes,
+ const char *cp_File,
+ const short ssi_Line)
+{
+ void *vp_realloc;
+ AllocationList *ALp_renew;
+
+ if (LYfind_leaks == FALSE) {
+ vp_realloc = (void *) realloc(vp_Alloced, st_newBytes);
+
+ } else if (vp_Alloced == NULL) {
+ /*
+ * If we are asked to resize a NULL pointer, this is just a malloc
+ * call.
+ */
+ vp_realloc = LYLeakMalloc(st_newBytes, cp_File, ssi_Line);
+
+ } else {
+
+ /*
+ * Find the current vp_Alloced block in the list. If NULL, this is an
+ * invalid pointer value.
+ */
+ ALp_renew = FindInList(vp_Alloced);
+ if (ALp_renew == NULL) {
+ /*
+ * Track the invalid pointer value and then exit. If unable to
+ * allocate, just exit.
+ */
+ AllocationList *ALp_new = typecalloc(AllocationList);
+
+ if (ALp_new == NULL) {
+ exit_immediately(EXIT_FAILURE);
+ }
+
+ /*
+ * Set the information up; no need to allocate file name since it is a
+ * static string.
+ */
+ ALp_new->vp_Alloced = NULL;
+ ALp_new->vp_BadRequest = vp_Alloced;
+ ALp_new->SL_realloc.cp_FileName = cp_File;
+ ALp_new->SL_realloc.ssi_LineNumber = ssi_Line;
+
+ /*
+ * Add the item to the list. Exit.
+ */
+ AddToList(ALp_new);
+ exit_immediately(EXIT_FAILURE);
+ }
+
+ /*
+ * Perform the resize. If not NULL, record the information.
+ */
+ vp_realloc = (void *) realloc(vp_Alloced, st_newBytes);
+ CountFrees(ALp_renew->st_Bytes);
+ CountMallocs(st_newBytes);
+
+ if (vp_realloc != NULL) {
+ ALp_renew->st_Sequence = count_mallocs;
+ ALp_renew->vp_Alloced = vp_realloc;
+ ALp_renew->st_Bytes = st_newBytes;
+
+ /*
+ * Update the realloc information, too. No need to allocate file name,
+ * static string.
+ */
+ ALp_renew->SL_realloc.cp_FileName = cp_File;
+ ALp_renew->SL_realloc.ssi_LineNumber = ssi_Line;
+ }
+ }
+ return (vp_realloc);
+}
+
+/*
+ * Purpose: Add information about reallocated memory to the list,
+ * after a call to realloc or an equivalent
+ * function which has not already created or updated
+ * a list entry.
+ * Arguments: ALp_old List entry for previously allocated
+ * block of memory to resize. If NULL,
+ * mark_realloced works just like
+ * mark_malloced.
+ * vp_realloced The new pointer, after resizing.
+ * st_newBytes The new size of the chunk of memory.
+ * cp_File The file to record.
+ * ssi_Line The line to record.
+ * Return Value: Pointer to new or updated list entry
+ * for this memory block.
+ * NULL on allocation error.
+ * Revision History:
+ * 1999-02-11 created kw
+ */
+#if defined(LY_FIND_LEAKS) && defined(LY_FIND_LEAKS_EXTENDED)
+static AllocationList *mark_realloced(AllocationList * ALp_old, void *vp_realloced,
+ size_t st_newBytes,
+ const char *cp_File,
+ const short ssi_Line)
+{
+ /*
+ * If there is no list entry for the old allocation, treat this as if a new
+ * allocation had happened.
+ */
+ if (ALp_old == NULL) {
+ return (LYLeak_mark_malloced(vp_realloced, st_newBytes, cp_File, ssi_Line));
+ }
+
+ /*
+ * ALp_old represents the memory block before reallocation. Assume that if
+ * we get here, there isn't yet a list entry for the new, possibly
+ * different, address after realloc, that is our list hasn't been updated -
+ * so we're going to do that now.
+ */
+
+ if (vp_realloced != NULL) {
+ ALp_old->vp_Alloced = vp_realloced;
+ ALp_old->st_Bytes = st_newBytes;
+ ALp_old->SL_realloc.cp_FileName = cp_File;
+ ALp_old->SL_realloc.ssi_LineNumber = ssi_Line;
+ }
+
+ return (ALp_old);
+}
+#endif /* not LY_FIND_LEAKS and LY_FIND_LEAKS_EXTENDED */
+
+/*
+ * Purpose: Capture all requests to free information and also
+ * remove items from the allocation list.
+ * Arguments: vp_Alloced The memory to free.
+ * cp_File The file calling free.
+ * ssi_Line The line of cp_File calling free.
+ * Return Value: void
+ * Remarks/Portability/Dependencies/Restrictions:
+ * If the pointer value is invalid, then an item will be added
+ * to the list and nothing else is done.
+ * I really like the name of this function and one day hope
+ * that Lynx is Leak Free.
+ * Revision History:
+ * 05-26-94 created Lynx 2-3-1 Garrett Arch Blythe
+ */
+void LYLeakFree(void *vp_Alloced,
+ const char *cp_File,
+ const short ssi_Line)
+{
+ AllocationList *ALp_free;
+
+ if (LYfind_leaks == FALSE) {
+ free(vp_Alloced);
+ } else {
+
+ /*
+ * Find the pointer in the allocated list. If not found, bad pointer.
+ * If found, free list item and vp_Alloced.
+ */
+ ALp_free = FindInList(vp_Alloced);
+ if (ALp_free == NULL) {
+ /*
+ * Create the final entry before exiting marking this error. If
+ * unable to allocate more memory just exit.
+ */
+ AllocationList *ALp_new = typecalloc(AllocationList);
+
+ if (ALp_new == NULL) {
+ exit_immediately(EXIT_FAILURE);
+ }
+
+ /*
+ * Set up the information, no memory need be allocated for the file
+ * name since it is a static string.
+ */
+ ALp_new->vp_Alloced = NULL;
+ ALp_new->vp_BadRequest = vp_Alloced;
+ ALp_new->SL_memory.cp_FileName = cp_File;
+ ALp_new->SL_memory.ssi_LineNumber = ssi_Line;
+
+ /*
+ * Add the entry to the list and then return.
+ */
+ AddToList(ALp_new);
+ } else {
+ /*
+ * Free off the memory. Take entry out of allocation list.
+ */
+ CountFrees(ALp_free->st_Bytes);
+ RemoveFromList(ALp_free);
+ FREE(ALp_free);
+ free(vp_Alloced);
+ }
+ }
+}
+
+/*
+ * Check for leaked strdup() results -TD
+ */
+char *LYLeakStrdup(const char *source,
+ const char *cp_File,
+ const short ssi_Line)
+{
+ size_t length = strlen(source) + 1;
+ char *target = (char *) LYLeakMalloc(length, cp_File, ssi_Line);
+
+ if (target != 0) {
+ memcpy(target, source, length);
+ }
+ return target;
+}
+
+/*
+ * Allocates a new copy of a string, and returns it.
+ * Tracks allocations by using other LYLeakFoo functions.
+ * Equivalent to HTSACopy in HTString.c - KW
+ */
+char *LYLeakSACopy(char **dest,
+ const char *src,
+ const char *cp_File,
+ const short ssi_Line)
+{
+ if (src != NULL && src == *dest) {
+ CTRACE((tfp,
+ "LYLeakSACopy: *dest equals src, contains \"%s\"\n",
+ src));
+ } else {
+ if (*dest) {
+ LYLeakFree(*dest, cp_File, ssi_Line);
+ *dest = NULL;
+ }
+ if (src) {
+ *dest = (char *) LYLeakMalloc(strlen(src) + 1, cp_File, ssi_Line);
+ if (*dest == NULL)
+ outofmem(__FILE__, "LYLeakSACopy");
+ strcpy(*dest, src);
+ }
+ }
+ return *dest;
+}
+
+/*
+ * String Allocate and Concatenate.
+ * Tracks allocations by using other LYLeakFoo functions.
+ * Equivalent to HTSACat in HTUtils.c - KW
+ */
+char *LYLeakSACat(char **dest,
+ const char *src,
+ const char *cp_File,
+ const short ssi_Line)
+{
+ if (src && *src) {
+ if (src == *dest) {
+ CTRACE((tfp,
+ "LYLeakSACat: *dest equals src, contains \"%s\"\n",
+ src));
+ } else if (*dest) {
+ size_t length = strlen(*dest);
+
+ *dest = (char *) LYLeakRealloc(*dest,
+ (length + strlen(src) + 1),
+ cp_File,
+ ssi_Line);
+ if (*dest == NULL)
+ outofmem(__FILE__, "LYLeakSACat");
+ strcpy(*dest + length, src);
+ } else {
+ *dest = (char *) LYLeakMalloc((strlen(src) + 1),
+ cp_File,
+ ssi_Line);
+ if (*dest == NULL)
+ outofmem(__FILE__, "LYLeakSACat");
+ strcpy(*dest, src);
+ }
+ }
+ return *dest;
+}
+
+/******************************************************************************/
+
+/*
+ * Equivalents for bstring functions in HTString.c -TD
+ */
+/* same as HTSABAlloc */
+void LYLeakSABAlloc(bstring **dest,
+ int len,
+ const char *cp_File,
+ const short ssi_Line)
+{
+ if (*dest == 0) {
+ *dest = LYLeakCalloc(1, sizeof(bstring), cp_File, ssi_Line);
+ }
+
+ if ((*dest)->len != len) {
+ (*dest)->str = (char *) LYLeakRealloc((*dest)->str,
+ (size_t) len,
+ cp_File,
+ ssi_Line);
+ if ((*dest)->str == NULL)
+ outofmem(__FILE__, "LYLeakSABalloc");
+
+ (*dest)->len = len;
+ }
+}
+
+/* same as HTSABCopy */
+void LYLeakSABCopy(bstring **dest,
+ const char *src,
+ int len,
+ const char *cp_File,
+ const short ssi_Line)
+{
+ bstring *t;
+ unsigned need = (unsigned) (len + 1);
+
+ CTRACE2(TRACE_BSTRING,
+ (tfp, "HTSABCopy(%p, %p, %d)\n",
+ (void *) dest, (const void *) src, len));
+ LYLeakSABFree(dest, cp_File, ssi_Line);
+ if (src) {
+ if (TRACE_BSTRING) {
+ CTRACE((tfp, "=== %4d:", len));
+ trace_bstring2(src, len);
+ CTRACE((tfp, "\n"));
+ }
+ if ((t = (bstring *) LYLeakMalloc(sizeof(bstring), cp_File, ssi_Line))
+ == NULL)
+ outofmem(__FILE__, "HTSABCopy");
+
+ if ((t->str = (char *) LYLeakMalloc(need, cp_File, ssi_Line)) == NULL)
+ outofmem(__FILE__, "HTSABCopy");
+
+ MemCpy(t->str, src, len);
+ t->len = len;
+ t->str[t->len] = '\0';
+ *dest = t;
+ }
+ if (TRACE_BSTRING) {
+ CTRACE((tfp, "=> %4d:", BStrLen(*dest)));
+ trace_bstring(*dest);
+ CTRACE((tfp, "\n"));
+ }
+}
+
+/* same as HTSABCopy0 */
+void LYLeakSABCopy0(bstring **dest,
+ const char *src,
+ const char *cp_File,
+ const short ssi_Line)
+{
+ LYLeakSABCopy(dest, src, (int) strlen(src), cp_File, ssi_Line);
+}
+
+/* same as HTSABCat */
+void LYLeakSABCat(bstring **dest,
+ const char *src,
+ int len,
+ const char *cp_File,
+ const short ssi_Line)
+{
+ bstring *t = *dest;
+
+ CTRACE2(TRACE_BSTRING,
+ (tfp, "HTSABCat(%p, %p, %d)\n",
+ (void *) dest, (const void *) src, len));
+ if (src) {
+ unsigned need = (unsigned) (len + 1);
+
+ if (TRACE_BSTRING) {
+ CTRACE((tfp, "=== %4d:", len));
+ trace_bstring2(src, len);
+ CTRACE((tfp, "\n"));
+ }
+ if (t) {
+ unsigned length = (unsigned) t->len + need;
+
+ t->str = (char *) LYLeakRealloc(t->str, length, cp_File, ssi_Line);
+ } else {
+ if ((t = (bstring *) LYLeakCalloc(1, sizeof(bstring), cp_File,
+ ssi_Line)) == NULL)
+ outofmem(__FILE__, "HTSACat");
+
+ t->str = (char *) LYLeakMalloc(need, cp_File, ssi_Line);
+ }
+ if (t->str == NULL)
+ outofmem(__FILE__, "HTSACat");
+
+ MemCpy(t->str + t->len, src, len);
+ t->len += len;
+ t->str[t->len] = '\0';
+ *dest = t;
+ }
+ if (TRACE_BSTRING) {
+ CTRACE((tfp, "=> %4d:", BStrLen(*dest)));
+ trace_bstring(*dest);
+ CTRACE((tfp, "\n"));
+ }
+}
+
+/* same as HTSABCat0 */
+void LYLeakSABCat0(bstring **dest,
+ const char *src,
+ const char *cp_File,
+ const short ssi_Line)
+{
+ LYLeakSABCat(dest, src, (int) strlen(src), cp_File, ssi_Line);
+}
+
+/* same as HTSABFree */
+void LYLeakSABFree(bstring **ptr,
+ const char *cp_File,
+ const short ssi_Line)
+{
+ if (*ptr != NULL) {
+ if ((*ptr)->str)
+ LYLeakFree((*ptr)->str, cp_File, ssi_Line);
+ LYLeakFree(*ptr, cp_File, ssi_Line);
+ *ptr = NULL;
+ }
+}
+
+/******************************************************************************/
+
+#if defined(LY_FIND_LEAKS) && defined(LY_FIND_LEAKS_EXTENDED)
+
+const char *leak_cp_File_hack = __FILE__;
+short leak_ssi_Line_hack = __LINE__;
+
+/*
+ * Purpose: A wrapper around StrAllocVsprintf (the workhorse of
+ * HTSprintf/HTSprintf0, implemented in HTString.c) that
+ * tries to make sure that our allocation list is always
+ * properly updated, whether StrAllocVsprintf itself was
+ * compiled with memory tracking or not (or even a mixture,
+ * like tracking the freeing but not the new allocation).
+ * Some source files can be compiled with LY_FIND_LEAKS_EXTENDED
+ * in effect while others only have LY_FIND_LEAKS in effect,
+ * and as long as HTString.c is complied with memory tracking
+ * (of either kind) string objects allocated by HTSprintf/
+ * HTSprintf0 (or otherwise) can be passed around among them and
+ * manipulated both ways.
+ * Arguments: dest As for StrAllocVsprintf.
+ * cp_File The source file of the caller (i.e. the
+ * caller of HTSprintf/HTSprintf0, hopefully).
+ * ssi_Line The line of cp_File calling.
+ * inuse,fmt,ap As for StrAllocVsprintf.
+ * Return Value: The char pointer to resulting string, as set
+ * by StrAllocVsprintf, or
+ * NULL if dest==0 (wrong use!).
+ * Remarks/Portability/Dependencies/Restrictions:
+ * The price for generality is severe inefficiency: several
+ * list lookups are done to be on the safe side.
+ * We don't get the real allocation size, only a minimum based
+ * on the string length of the result. So the amount of memory
+ * leakage may get underestimated.
+ * If *dest is an invalid pointer value on entry (i.e. was not
+ * tracked), the program will exit after one last entry is added
+ * to the allocation list.
+ * If StrAllocVsprintf fails to return a valid string via the
+ * indirect string pointer (its first parameter), invalid memory
+ * access will result and the program will probably terminate
+ * with a signal. This can happen if, on entry, *dest is NULL
+ * and fmt is empty or NULL, so just Don't Do That.
+ * Revision History:
+ * 1999-02-11 created kw
+ * 1999-10-15 added comments kw
+ */
+static char *LYLeakSAVsprintf(char **dest,
+ const char *cp_File,
+ const short ssi_Line,
+ size_t inuse,
+ const char *fmt,
+ va_list * ap)
+{
+ AllocationList *ALp_old;
+ void *vp_oldAlloced;
+
+ const char *old_cp_File = __FILE__;
+ short old_ssi_Line = __LINE__;
+
+ if (!dest)
+ return NULL;
+
+ if (LYfind_leaks == FALSE) {
+ StrAllocVsprintf(dest, inuse, fmt, ap);
+ return (*dest);
+ }
+
+ vp_oldAlloced = *dest;
+ if (!vp_oldAlloced) {
+ StrAllocVsprintf(dest, inuse, fmt, ap);
+ LYLeak_mark_malloced(*dest, strlen(*dest) + 1, cp_File, ssi_Line);
+ return (*dest);
+ } else {
+ void *vp_realloced;
+
+ ALp_old = FindInList(vp_oldAlloced);
+ if (ALp_old == NULL) {
+ /*
+ * Track the invalid pointer value and then exit. If unable to
+ * allocate, just exit.
+ */
+ AllocationList *ALp_new = typecalloc(AllocationList);
+
+ if (ALp_new == NULL) {
+ exit_immediately(EXIT_FAILURE);
+ }
+
+ /*
+ * Set the information up; no need to allocate file name since it
+ * is a static string.
+ */
+ ALp_new->vp_Alloced = NULL;
+ ALp_new->vp_BadRequest = vp_oldAlloced;
+ ALp_new->SL_realloc.cp_FileName = cp_File;
+ ALp_new->SL_realloc.ssi_LineNumber = ssi_Line;
+
+ /*
+ * Add the item to the list. Exit.
+ */
+ AddToList(ALp_new);
+ exit_immediately(EXIT_FAILURE);
+ }
+
+ old_cp_File = ALp_old->SL_memory.cp_FileName;
+ old_ssi_Line = ALp_old->SL_memory.ssi_LineNumber;
+ /*
+ * DO THE REAL WORK, by calling StrAllocVsprintf. If result is not
+ * NULL, record the information.
+ */
+ StrAllocVsprintf(dest, inuse, fmt, ap);
+ vp_realloced = (void *) *dest;
+ if (vp_realloced != NULL) {
+ AllocationList *ALp_new = FindInList(vp_realloced);
+
+ if (!ALp_new) {
+ /* Look up again, list may have changed! - kw */
+ ALp_old = FindInList(vp_oldAlloced);
+ if (ALp_old == NULL) {
+ LYLeak_mark_malloced(*dest, strlen(*dest) + 1, cp_File, ssi_Line);
+ return (*dest);
+ }
+ mark_realloced(ALp_old, *dest, strlen(*dest) + 1, cp_File, ssi_Line);
+ return (*dest);
+ }
+ ALp_new->SL_memory.cp_FileName = old_cp_File;
+ ALp_new->SL_memory.ssi_LineNumber = old_ssi_Line;
+ ALp_new->SL_realloc.cp_FileName = cp_File;
+ ALp_new->SL_realloc.ssi_LineNumber = ssi_Line;
+ }
+ return (*dest);
+ }
+}
+
+/* Note: the following may need updating if HTSprintf in HTString.c
+ * is changed. - kw */
+static char *LYLeakHTSprintf(char **pstr, const char *fmt, ...)
+{
+ char *str;
+ size_t inuse = 0;
+ va_list ap;
+
+ LYva_start(ap, fmt);
+
+ if (pstr != 0 && *pstr != 0)
+ inuse = strlen(*pstr);
+ str = LYLeakSAVsprintf(pstr, leak_cp_File_hack, leak_ssi_Line_hack,
+ inuse, fmt, &ap);
+
+ va_end(ap);
+ return str;
+}
+
+/* Note: the following may need updating if HTSprintf0 in HTString.c
+ * is changed. - kw */
+static char *LYLeakHTSprintf0(char **pstr, const char *fmt, ...)
+{
+ char *str;
+ va_list ap;
+
+ LYva_start(ap, fmt);
+
+ str = LYLeakSAVsprintf(pstr, leak_cp_File_hack, leak_ssi_Line_hack,
+ 0, fmt, &ap);
+
+ va_end(ap);
+ return str;
+}
+
+/*
+ * HTSprintf and HTSprintf0 will be defined such that they effectively call one
+ * of the following two functions that store away a copy to the File & Line
+ * info in temporary hack variables, and then call the real function (which is
+ * returned here as a function pointer) to the regular HTSprintf/HTSprintf0
+ * arguments. It's probably a bit inefficient, but that shouldn't be
+ * noticeable compared to all the time that memory tracking takes up for list
+ * traversal. - kw
+ */
+HTSprintflike *Get_htsprintf_fn(const char *cp_File,
+ const short ssi_Line)
+{
+ leak_cp_File_hack = cp_File;
+ leak_ssi_Line_hack = ssi_Line;
+ return &LYLeakHTSprintf;
+}
+
+HTSprintflike *Get_htsprintf0_fn(const char *cp_File,
+ const short ssi_Line)
+{
+ leak_cp_File_hack = cp_File;
+ leak_ssi_Line_hack = ssi_Line;
+ return &LYLeakHTSprintf0;
+}
+
+#endif /* LY_FIND_LEAKS and LY_FIND_LEAKS_EXTENDED */
+#else
+/* Standard C forbids an empty file */
+void no_leak_checking(void);
+void no_leak_checking(void)
+{
+}
+#endif /* LY_FIND_LEAKS */
diff --git a/src/LYList.c b/src/LYList.c
new file mode 100644
index 0000000..989b6a3
--- /dev/null
+++ b/src/LYList.c
@@ -0,0 +1,374 @@
+/*
+ * $LynxId: LYList.c,v 1.55 2020/02/23 21:20:05 tom Exp $
+ *
+ * Lynx Document Reference List Support LYList.c
+ * ====================================
+ *
+ * Author: FM Foteos Macrides (macrides@sci.wfbr.edu)
+ *
+ */
+
+#include <HTUtils.h>
+#include <HTAlert.h>
+#include <LYUtils.h>
+#include <GridText.h>
+#include <HTParse.h>
+#include <LYList.h>
+#include <LYMap.h>
+#include <LYClean.h>
+#include <LYGlobalDefs.h>
+#include <LYCharUtils.h>
+#include <LYCharSets.h>
+#include <LYStrings.h>
+#include <LYHistory.h>
+
+#ifdef DIRED_SUPPORT
+#include <LYUpload.h>
+#include <LYLocal.h>
+#endif /* DIRED_SUPPORT */
+
+#include <LYexit.h>
+#include <LYLeaks.h>
+
+/* showlist - F.Macrides (macrides@sci.wfeb.edu)
+ * --------
+ * Create a temporary text/html file with a list of links to
+ * HyperText References in the current document.
+ *
+ * On entry
+ * titles Set: if we want titles where available
+ * Clear: we only get addresses.
+ */
+
+int showlist(DocInfo *newdoc, int titles)
+{
+ int cnt;
+ int refs, hidden_links;
+ int result;
+ static char tempfile[LY_MAXPATH];
+ static BOOLEAN last_titles = TRUE;
+ FILE *fp0;
+ char *Address = NULL, *Title = NULL, *cp = NULL;
+ char *LinkTitle = NULL; /* Rel stored as property of link, not of dest */
+ BOOLEAN intern_w_post = FALSE;
+ const char *desc = "unknown field or link";
+ void *helper;
+
+ refs = HText_sourceAnchors(HTMainText);
+ hidden_links = HText_HiddenLinkCount(HTMainText);
+ if (refs <= 0 && hidden_links > 0 &&
+ LYHiddenLinks != HIDDENLINKS_SEPARATE) {
+ HTUserMsg(NO_VISIBLE_REFS_FROM_DOC);
+ return (-1);
+ }
+ if (refs <= 0 && hidden_links <= 0) {
+ HTUserMsg(NO_REFS_FROM_DOC);
+ return (-1);
+ }
+
+ if ((fp0 = InternalPageFP(tempfile, titles == last_titles)) == 0)
+ return (-1);
+
+ LYLocalFileToURL(&(newdoc->address), tempfile);
+
+ LYRegisterUIPage(newdoc->address,
+ titles ? UIP_LIST_PAGE : UIP_ADDRLIST_PAGE);
+ last_titles = (BOOLEAN) titles;
+ LYforce_HTML_mode = TRUE; /* force this file to be HTML */
+ LYforce_no_cache = TRUE; /* force this file to be new */
+
+#ifdef USE_ADDRLIST_PAGE
+ if (titles != TRUE)
+ BeginInternalPage(fp0, ADDRLIST_PAGE_TITLE, LIST_PAGE_HELP);
+ else
+#endif
+ BeginInternalPage(fp0, LIST_PAGE_TITLE, LIST_PAGE_HELP);
+
+ StrAllocCopy(Address, HTLoadedDocumentURL());
+ LYEntify(&Address, FALSE);
+ fprintf(fp0, "%s%s<p>\n", gettext("References in "),
+ (non_empty(Address)
+ ? Address
+ : gettext("this document:")));
+ FREE(Address);
+ if (refs > 0) {
+ fprintf(fp0, "<%s compact>\n", ((keypad_mode == NUMBERS_AS_ARROWS) ?
+ "ol" : "ul"));
+ if (hidden_links > 0)
+ fprintf(fp0, "<lh><em>%s</em>\n", gettext("Visible links:"));
+ }
+ if (hidden_links > 0) {
+ if (LYHiddenLinks == HIDDENLINKS_IGNORE)
+ hidden_links = 0;
+ }
+ helper = NULL; /* init */
+ result = 1;
+ for (cnt = 1; cnt <= refs; cnt++) {
+ HTChildAnchor *child = HText_childNextNumber(cnt, &helper);
+ int value = HText_findAnchorNumber(helper);
+ HTAnchor *dest_intl = NULL;
+ HTAnchor *dest;
+ HTParentAnchor *parent;
+ char *address;
+ const char *title;
+
+ if (child == 0) {
+ /*
+ * child should not be 0 unless form field numbering is on and cnt
+ * is the number of a form input field. HText_FormDescNumber()
+ * will set desc to a description of what type of input field this
+ * is. We'll list it to ensure that the link numbers on the list
+ * page match the numbering in the original document, but won't
+ * create a forward link to the form. - FM && LE
+ *
+ * Changed to create a fake hidden link, to get the numbering right
+ * in connection with always treating this file as
+ * HIDDENLINKS_MERGE in GridText.c - kw
+ */
+ if (fields_are_numbered()) {
+ HText_FormDescNumber(cnt, &desc);
+ fprintf(fp0,
+ "<li><a id=%d href=\"#%d\">form field</a> = <em>%s</em>\n",
+ cnt, cnt, desc);
+ }
+ } else if (value >= result) {
+ if (track_internal_links)
+ dest_intl = HTAnchor_followTypedLink(child, HTInternalLink);
+ dest = (dest_intl
+ ? dest_intl
+ : HTAnchor_followLink(child));
+ parent = HTAnchor_parent(dest);
+ if (!intern_w_post && dest_intl &&
+ HTMainAnchor &&
+ HTMainAnchor->post_data &&
+ parent->post_data &&
+ BINEQ(HTMainAnchor->post_data, parent->post_data)) {
+ /*
+ * Set flag to note that we had at least one internal link, if
+ * the document from which we are generating the list has
+ * associated POST data; after an extra check that the link
+ * destination really has the same POST data so that we can
+ * believe it is an internal link.
+ */
+ intern_w_post = TRUE;
+ }
+ address = HTAnchor_address(dest);
+ title = titles ? HTAnchor_title(parent) : NULL;
+ if (dest_intl) {
+ HTSprintf0(&LinkTitle, "(internal)");
+ } else if (titles && child->type &&
+ dest == child->dest &&
+ !StrNCmp(HTAtom_name(child->type),
+ "RelTitle: ", 10)) {
+ HTSprintf0(&LinkTitle, "(%s)", HTAtom_name(child->type) + 10);
+ } else {
+ FREE(LinkTitle);
+ }
+ StrAllocCopy(Address, address);
+ FREE(address);
+ LYEntify(&Address, TRUE);
+ if (non_empty(title)) {
+ LYformTitle(&Title, title);
+ LYEntify(&Title, TRUE);
+ if (*Title) {
+ cp = findPoundSelector(Address);
+ } else {
+ FREE(Title);
+ }
+ }
+
+ fprintf(fp0, "<li><a href=\"%s\"%s>%s%s%s%s%s</a>\n", Address,
+ dest_intl ? " TYPE=\"internal link\"" : "",
+ NonNull(LinkTitle),
+ ((HTAnchor *) parent != dest) && Title ? "in " : "",
+ (char *) (Title ? Title : Address),
+ (Title && cp) ? " - " : "",
+ (Title && cp) ? (cp + 1) : "");
+
+ FREE(Address);
+ FREE(Title);
+ }
+ result = value + 1;
+ }
+ FREE(LinkTitle);
+
+ if (hidden_links > 0) {
+ if (refs > 0)
+ fprintf(fp0, "\n</%s>\n\n<p>\n",
+ ((keypad_mode == NUMBERS_AS_ARROWS) ?
+ "ol" : "ul"));
+ fprintf(fp0, "<%s compact>\n", ((keypad_mode == NUMBERS_AS_ARROWS) ?
+ "ol continue" : "ul"));
+ fprintf(fp0, "<lh><em>%s</em>\n", gettext("Hidden links:"));
+ }
+
+ for (cnt = 0; cnt < hidden_links; cnt++) {
+ StrAllocCopy(Address, HText_HiddenLinkAt(HTMainText, cnt));
+ LYEntify(&Address, FALSE);
+ if (isEmpty(Address)) {
+ FREE(Address);
+ continue;
+ }
+ fprintf(fp0, "<li><a href=\"%s\">%s</a>\n", Address, Address);
+
+ FREE(Address);
+ }
+
+ fprintf(fp0, "\n</%s>\n", ((keypad_mode == NUMBERS_AS_ARROWS) ?
+ "ol" : "ul"));
+ EndInternalPage(fp0);
+ LYCloseTempFP(fp0);
+
+ /*
+ * Make necessary changes to newdoc before returning to caller. If the
+ * intern_w_post flag is set, we keep the POST data in newdoc that have
+ * been passed in. They should be the same as in the loaded document for
+ * which we generated the list. In that case the file we have written will
+ * be associated with the same POST data when it is loaded after we are
+ * done here, so that following one of the links we have marked as
+ * "internal link" can lead back to the underlying document with the right
+ * address+post_data combination. - kw
+ */
+ if (intern_w_post) {
+ newdoc->internal_link = TRUE;
+ } else {
+ LYFreePostData(newdoc);
+ newdoc->internal_link = FALSE;
+ }
+ newdoc->isHEAD = FALSE;
+ newdoc->safe = FALSE;
+ return (0);
+}
+
+static int print_refs(FILE *fp, int titles, int refs)
+{
+ int result = 0;
+ int cnt;
+ int value;
+ char *address = NULL;
+ const char *desc = gettext("unknown field or link");
+ void *helper = NULL; /* init */
+
+ for (cnt = 1; cnt <= refs; cnt++) {
+ HTChildAnchor *child = HText_childNextNumber(cnt, &helper);
+ HTAnchor *dest;
+ HTParentAnchor *parent;
+ const char *title;
+ int counter = result + 1;
+
+ if (child == 0) {
+ /*
+ * child should not be 0 unless form field numbering is on and
+ * cnt is the number of a form input field.
+ * HText_FormDescNumber() will set desc to a description of
+ * what type of input field this is. We'll create a
+ * within-document link to ensure that the link numbers on the
+ * list page match the numbering in the original document, but
+ * won't create a forward link to the form. - FM && LE
+ */
+ if (fields_are_numbered()) {
+ HText_FormDescNumber(cnt, &desc);
+ fprintf(fp, "%4d. form field = %s\n", counter, desc);
+ }
+ } else {
+ dest = HTAnchor_followLink(child);
+ /*
+ * Ignore if child anchor points to itself, i.e., we had something
+ * like <A NAME=xyz HREF="#xyz"> and it is not treated as a hidden
+ * link. Useful if someone 'P'rints the List Page (which isn't a
+ * very useful action to do, but anyway...) - kw
+ */
+ if (dest != (HTAnchor *) child) {
+ parent = HTAnchor_parent(dest);
+ title = titles ? HTAnchor_title(parent) : NULL;
+ if (links_are_numbered()) {
+ value = HText_findAnchorNumber(helper);
+ if (value <= result)
+ continue;
+ fprintf(fp, "%4d. ", value);
+ }
+ if (((HTAnchor *) parent != dest) && title) {
+ fprintf(fp, "in ");
+ }
+ if (title) {
+ fprintf(fp, "%s\n", title);
+ } else {
+ address = HTAnchor_short_address(dest);
+ if (dump_links_decoded
+ && LYCharSet_UC[current_char_set].enc == UCT_ENC_UTF8) {
+ (void) HTUnEscape(address);
+ }
+ fprintf(fp, "%s\n", address);
+ FREE(address);
+ }
+ }
+ }
+ if (counter > result)
+ result = counter;
+#ifdef VMS
+ if (HadVMSInterrupt)
+ break;
+#endif /* VMS */
+ }
+ return result;
+}
+
+static void print_hidden_refs(FILE *fp, int refs, int hidden_links)
+{
+ int cnt;
+ char *address = NULL;
+
+ fprintf(fp, "%s %s\n", ((refs > 0) ? "\n" : ""),
+ gettext("Hidden links:"));
+ for (cnt = 0; cnt < hidden_links; cnt++) {
+ StrAllocCopy(address, HText_HiddenLinkAt(HTMainText, cnt));
+ if (isEmpty(address)) {
+ FREE(address);
+ continue;
+ }
+
+ if (links_are_numbered())
+ fprintf(fp, "%4d. ", ((cnt + 1) + refs));
+ fprintf(fp, "%s\n", address);
+ FREE(address);
+#ifdef VMS
+ if (HadVMSInterrupt)
+ break;
+#endif /* VMS */
+ }
+}
+
+/* printlist - F.Macrides (macrides@sci.wfeb.edu)
+ * ---------
+ * Print a text/plain list of HyperText References
+ * in the current document.
+ *
+ * On entry
+ * titles Set: if we want titles where available
+ * Clear: we only get addresses.
+ */
+void printlist(FILE *fp, int titles)
+{
+ int refs, hidden_links;
+
+ refs = HText_sourceAnchors(HTMainText);
+ if (refs > 0 || LYHiddenLinks == HIDDENLINKS_SEPARATE) {
+ hidden_links = HText_HiddenLinkCount(HTMainText);
+ if (refs > 0 || hidden_links > 0) {
+ if (links_are_numbered() || fields_are_numbered())
+ fprintf(fp, "\n%s\n\n", gettext("References"));
+ if (LYHiddenLinks == HIDDENLINKS_IGNORE)
+ hidden_links = 0;
+ if (hidden_links > 0) {
+ fprintf(fp, " %s\n", gettext("Visible links:"));
+ }
+ refs = print_refs(fp, titles, refs) + 1;
+
+ if (hidden_links > 0) {
+ print_hidden_refs(fp, refs, hidden_links);
+ }
+ }
+ }
+ LYPrintImgMaps(fp);
+ return;
+}
diff --git a/src/LYList.h b/src/LYList.h
new file mode 100644
index 0000000..f6afbc5
--- /dev/null
+++ b/src/LYList.h
@@ -0,0 +1,16 @@
+/* $LynxId: LYList.h,v 1.12 2010/09/25 11:35:35 tom Exp $ */
+#ifndef LYLIST_H
+#define LYLIST_H
+
+#include <LYStructs.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ extern int showlist(DocInfo *newdoc, int titles);
+ extern void printlist(FILE *fp, int titles);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* LYLIST_H */
diff --git a/src/LYLocal.c b/src/LYLocal.c
new file mode 100644
index 0000000..754a7d4
--- /dev/null
+++ b/src/LYLocal.c
@@ -0,0 +1,2685 @@
+/*
+ * $LynxId: LYLocal.c,v 1.135 2023/01/02 23:52:10 tom Exp $
+ *
+ * Routines to manipulate the local filesystem.
+ * Written by: Rick Mallett, Carleton University
+ * Report problems to rmallett@ccs.carleton.ca
+ * Modified 18-Dec-95 David Trueman (david@cs.dal.ca):
+ * Added OK_PERMIT compilation option.
+ * Support replacement of compiled-in f)ull menu configuration via
+ * DIRED_MENU definitions in lynx.cfg, so that more than one menu
+ * can be driven by the same executable.
+ * Modified Oct-96 Klaus Weide (kweide@tezcat.com):
+ * Changed to use the library's HTList_* functions and macros for
+ * managing the list of tagged file URLs.
+ * Keep track of proper level of URL escaping, so that unusual filenames
+ * which contain #% etc. are handled properly (some HTUnEscapeSome()'s
+ * left in to be conservative, and to document where superfluous
+ * unescaping took place before).
+ * Dynamic memory instead of fixed length buffers in a few cases.
+ * Other minor changes to make things work as intended.
+ * Modified Jun-97 Klaus Weide (kweide@tezcat.com) & FM:
+ * Modified the code handling DIRED_MENU to do more careful
+ * checking of the selected file. In addition to "TAG", "FILE", and
+ * "DIR", DIRED_MENU definitions in lynx.cfg now also recognize LINK as
+ * a type. DIRED_MENU definitions with a type field of "LINK" are only
+ * used if the current selection is a symbolic link ("FILE" and "DIR"
+ * definitions are not used in that case). The default menu
+ * definitions have been updated to reflect this change, and to avoid
+ * the showing of menu items whose action would always fail - KW
+ * Cast all code into the Lynx programming style. - FM
+ */
+
+#include <HTUtils.h>
+#include <HTAAProt.h>
+#include <HTFile.h>
+#include <HTAlert.h>
+#include <HTParse.h>
+#include <LYCurses.h>
+#include <LYGlobalDefs.h>
+#include <LYUtils.h>
+#include <LYStrings.h>
+#include <LYCharUtils.h>
+#include <LYStructs.h>
+#include <LYHistory.h>
+#include <LYUpload.h>
+#include <LYLocal.h>
+#include <LYClean.h>
+#include <www_wait.h>
+
+#ifdef SUPPORT_CHDIR
+#include <LYMainLoop.h>
+#endif
+
+#include <LYLeaks.h>
+
+#undef USE_COMPRESS
+
+#ifdef __DJGPP__
+#define EXT_TAR_GZ ".tgz"
+#define EXT_TAR_Z ".taz"
+#define EXT_Z ".z"
+#else
+#define EXT_TAR_GZ ".tar.gz"
+#define EXT_TAR_Z ".tar.Z"
+#define EXT_Z ".Z"
+#endif
+
+#ifndef DIRED_MAXBUF
+#define DIRED_MAXBUF 512
+#endif
+
+#ifdef DIRED_SUPPORT
+
+#ifdef OK_INSTALL
+#ifdef FNAMES_8_3
+#define INSTALLDIRS_FILE "instdirs.htm"
+#else
+#define INSTALLDIRS_FILE ".installdirs.html"
+#endif /* FNAMES_8_3 */
+#endif /* OK_INSTALL */
+
+static int get_filename(const char *prompt,
+ bstring **buf);
+
+#ifdef OK_PERMIT
+static int permit_location(char *destpath,
+ char *srcpath,
+ char **newpath);
+#endif /* OK_PERMIT */
+/* *INDENT-OFF* */
+static char *render_item ( const char * s,
+ const char * path,
+ const char * dir,
+ char * buf,
+ size_t bufsize,
+ int url_syntax);
+
+struct dired_menu {
+ int cond;
+#define DE_TAG 1
+#define DE_DIR 2
+#define DE_FILE 3
+#define DE_SYMLINK 4
+ char *sfx;
+ const char *c_sfx;
+ char *link;
+ const char *c_link;
+ char *rest;
+ const char *c_rest;
+ char *href;
+ const char *c_href;
+ struct dired_menu *next;
+};
+
+#define GetDiredSuffix(p) ((p)->sfx ? (p)->sfx : (p)->c_sfx)
+#define GetDiredLink(p) ((p)->link ? (p)->link : (p)->c_link)
+#define GetDiredRest(p) ((p)->rest ? (p)->rest : (p)->c_rest)
+#define GetDiredHref(p) ((p)->href ? (p)->href : (p)->c_href)
+
+#undef DATA
+#define DATA(cond, sfx, link, rest, href) { \
+ cond, \
+ NULL, sfx, \
+ NULL, link, \
+ NULL, rest, \
+ NULL, href, \
+ NULL }
+
+static struct dired_menu *menu_head = NULL;
+static struct dired_menu defmenu[] = {
+
+/*
+ * The following initializations determine the contents of the f)ull menu
+ * selection when in dired mode. If any menu entries are defined in the
+ * configuration file via DIRED_MENU lines, then these default entries are
+ * discarded entirely.
+ */
+#ifdef SUPPORT_CHDIR
+DATA( 0, "", "Change directory",
+ "", "LYNXDIRED://CHDIR"),
+#endif
+DATA( 0, "", "New File",
+"(in current directory)", "LYNXDIRED://NEW_FILE%d"),
+
+DATA( 0, "", "New Directory",
+"(in current directory)", "LYNXDIRED://NEW_FOLDER%d"),
+
+#ifdef OK_INSTALL
+DATA( DE_FILE, "", "Install",
+"selected file to new location", "LYNXDIRED://INSTALL_SRC%p"),
+/* The following (installing a directory) doesn't work for me, at least
+ with the "install" from GNU fileutils 4.0. I leave it in anyway, in
+ case one compiles with INSTALL_PATH / INSTALL_ARGS defined to some
+ other command for which it works (like a script, or maybe "cp -a"). - kw
+*/
+DATA( DE_DIR, "", "Install",
+"selected directory to new location", "LYNXDIRED://INSTALL_SRC%p"),
+#endif /* OK_INSTALL */
+
+DATA( DE_FILE, "", "Modify File Name",
+"(of current selection)", "LYNXDIRED://MODIFY_NAME%p"),
+DATA( DE_DIR, "", "Modify Directory Name",
+"(of current selection)", "LYNXDIRED://MODIFY_NAME%p"),
+#ifdef S_IFLNK
+DATA( DE_SYMLINK, "", "Modify Name",
+"(of selected symbolic link)", "LYNXDIRED://MODIFY_NAME%p"),
+#endif /* S_IFLNK */
+
+#ifdef OK_PERMIT
+DATA( DE_FILE, "", "Modify File Permissions",
+"(of current selection)", "LYNXDIRED://PERMIT_SRC%p"),
+DATA( DE_DIR, "", "Modify Directory Permissions",
+"(of current selection)", "LYNXDIRED://PERMIT_SRC%p"),
+#endif /* OK_PERMIT */
+
+DATA( DE_FILE, "", "Change Location",
+"(of selected file)" , "LYNXDIRED://MODIFY_LOCATION%p"),
+DATA( DE_DIR, "", "Change Location",
+"(of selected directory)", "LYNXDIRED://MODIFY_LOCATION%p"),
+#ifdef S_IFLNK
+DATA( DE_SYMLINK, "", "Change Location",
+"(of selected symbolic link)", "LYNXDIRED://MODIFY_LOCATION%p"),
+#endif /* S_IFLNK */
+
+DATA( DE_FILE, "", "Remove File",
+ "(current selection)", "LYNXDIRED://REMOVE_SINGLE%p"),
+DATA( DE_DIR, "", "Remove Directory",
+ "(current selection)", "LYNXDIRED://REMOVE_SINGLE%p"),
+#ifdef S_IFLNK
+DATA( DE_SYMLINK, "", "Remove Symbolic Link",
+ "(current selection)", "LYNXDIRED://REMOVE_SINGLE%p"),
+#endif /* S_IFLNK */
+
+#if defined(OK_UUDECODE) && !defined(ARCHIVE_ONLY)
+DATA( DE_FILE, "", "UUDecode",
+ "(current selection)", "LYNXDIRED://UUDECODE%p"),
+#endif /* OK_UUDECODE && !ARCHIVE_ONLY */
+
+#if defined(OK_TAR) && !defined(ARCHIVE_ONLY)
+DATA( DE_FILE, EXT_TAR_Z, "Expand",
+ "(current selection)", "LYNXDIRED://UNTAR_Z%p"),
+#endif /* OK_TAR && !ARCHIVE_ONLY */
+
+#if defined(OK_TAR) && defined(OK_GZIP) && !defined(ARCHIVE_ONLY)
+DATA( DE_FILE, ".tar.gz", "Expand",
+ "(current selection)", "LYNXDIRED://UNTAR_GZ%p"),
+
+DATA( DE_FILE, ".tgz", "Expand",
+ "(current selection)", "LYNXDIRED://UNTAR_GZ%p"),
+#endif /* OK_TAR && OK_GZIP && !ARCHIVE_ONLY */
+
+#ifndef ARCHIVE_ONLY
+DATA( DE_FILE, EXT_Z, "Uncompress",
+ "(current selection)", "LYNXDIRED://DECOMPRESS%p"),
+#endif /* ARCHIVE_ONLY */
+
+#if defined(OK_GZIP) && !defined(ARCHIVE_ONLY)
+DATA( DE_FILE, ".gz", "Uncompress",
+ "(current selection)", "LYNXDIRED://UNGZIP%p"),
+#endif /* OK_GZIP && !ARCHIVE_ONLY */
+
+#if defined(OK_ZIP) && !defined(ARCHIVE_ONLY)
+DATA( DE_FILE, ".zip", "Uncompress",
+ "(current selection)", "LYNXDIRED://UNZIP%p"),
+#endif /* OK_ZIP && !ARCHIVE_ONLY */
+
+#if defined(OK_TAR) && !defined(ARCHIVE_ONLY)
+DATA( DE_FILE, ".tar", "UnTar",
+ "(current selection)", "LYNXDIRED://UNTAR%p"),
+#endif /* OK_TAR && !ARCHIVE_ONLY */
+
+#ifdef OK_TAR
+DATA( DE_DIR, "", "Tar",
+ "(current selection)", "LYNXDIRED://TAR%p"),
+#endif /* OK_TAR */
+
+#if defined(OK_TAR) && defined(OK_GZIP)
+DATA( DE_DIR, "", "Tar and compress",
+ "(using GNU gzip)", "LYNXDIRED://TAR_GZ%p"),
+#endif /* OK_TAR && OK_GZIP */
+
+#if defined(OK_TAR) && defined(USE_COMPRESS)
+DATA( DE_DIR, "", "Tar and compress",
+ "(using compress)", "LYNXDIRED://TAR_Z%p"),
+#endif /* OK_TAR && USE_COMPRESS */
+
+#ifdef OK_ZIP
+DATA( DE_DIR, "", "Package and compress",
+ "(using zip)", "LYNXDIRED://ZIP%p"),
+#endif /* OK_ZIP */
+
+DATA( DE_FILE, "", "Compress",
+ "(using Unix compress)", "LYNXDIRED://COMPRESS%p"),
+
+#ifdef OK_GZIP
+DATA( DE_FILE, "", "Compress",
+ "(using gzip)", "LYNXDIRED://GZIP%p"),
+#endif /* OK_GZIP */
+
+#ifdef OK_ZIP
+DATA( DE_FILE, "", "Compress",
+ "(using zip)", "LYNXDIRED://ZIP%p"),
+#endif /* OK_ZIP */
+
+DATA( DE_TAG, "", "Move all tagged items to another location.",
+ "", "LYNXDIRED://MOVE_TAGGED%d"),
+
+#ifdef OK_INSTALL
+DATA( DE_TAG, "", "Install tagged files into another directory.",
+ "", "LYNXDIRED://INSTALL_SRC%00"),
+#endif
+
+DATA( DE_TAG, "", "Remove all tagged files and directories.",
+ "", "LYNXDIRED://REMOVE_TAGGED"),
+
+DATA( DE_TAG, "", "Untag all tagged files and directories.",
+ "", "LYNXDIRED://CLEAR_TAGGED"),
+
+DATA( 0, NULL, NULL,
+ NULL, NULL),
+};
+#undef DATA
+/* *INDENT-ON* */
+
+static BOOLEAN cannot_stat(const char *name)
+{
+ char *tmpbuf = 0;
+
+ HTSprintf0(&tmpbuf, gettext("Unable to get status of '%s'."), name);
+ HTAlert(tmpbuf);
+ FREE(tmpbuf);
+ return FALSE;
+}
+
+#define OK_STAT(name, sb) (stat(name, sb) == 0)
+
+static BOOLEAN ok_stat(const char *name, struct stat *sb)
+{
+ BOOLEAN rc = TRUE;
+
+ CTRACE((tfp, "testing ok_stat(%s)\n", name));
+ if (!OK_STAT(name, sb)) {
+#ifdef DOSPATH
+ size_t len = strlen(name);
+
+ /*
+ * If a path ends with '\' or ':', we can guess that it may be
+ * a directory name. Adding a '.' (after a '\') will produce a
+ * pathname that stat() will accept as a directory name.
+ */
+ if (len != 0 && (name[len - 1] == '\\' || name[len - 1] == ':')) {
+ char *temp = malloc(len + 3);
+
+ if (temp != 0) {
+ strcpy(temp, name);
+ if (temp[len - 1] == '\\') {
+ strcpy(temp + len, ".");
+ } else {
+ strcpy(temp + len, "\\.");
+ }
+ rc = OK_STAT(temp, sb);
+ free(temp);
+ } else {
+ rc = FALSE;
+ }
+ } else
+#endif
+ rc = FALSE;
+ }
+
+ if (rc == FALSE)
+ rc = cannot_stat(name);
+
+ return rc;
+}
+
+#ifdef HAVE_LSTAT
+static BOOLEAN ok_lstat(char *name, struct stat *sb)
+{
+ CTRACE((tfp, "testing ok_lstat(%s)\n", name));
+ if (lstat(name, sb) < 0) {
+ return cannot_stat(name);
+ }
+ return TRUE;
+}
+#else
+#define ok_lstat(name,sb) ok_stat(name,sb)
+#endif
+
+static BOOLEAN ok_file_or_dir(struct stat *sb)
+{
+ if (!S_ISDIR(sb->st_mode)
+ && !S_ISREG(sb->st_mode)) {
+ HTAlert(gettext("The selected item is not a file or a directory! Request ignored."));
+ return FALSE;
+ }
+ return TRUE;
+}
+
+#ifdef OK_INSTALL /* currently only used in local_install */
+static BOOLEAN ok_localname(char *dst, const char *src)
+{
+ struct stat dir_info;
+
+ if (!ok_stat(src, &dir_info)
+ || !ok_file_or_dir(&dir_info)) {
+ return FALSE;
+ }
+ if (strlen(src) >= DIRED_MAXBUF) {
+ CTRACE((tfp, "filename too long in ok_localname!\n"));
+ return FALSE;
+ }
+ strcpy(dst, src);
+ return TRUE;
+}
+#endif /* OK_INSTALL */
+
+#define MAX_ARGC 10
+
+static char **make_argv(const char *command, ...)
+{
+ static char *result[MAX_ARGC];
+ int argc = 0;
+ char *value;
+ va_list ap;
+
+ va_start(ap, command);
+ result[0] = 0;
+ StrAllocCopy(result[argc++], command);
+ do {
+ result[argc] = 0;
+ value = (char *) va_arg(ap, char *);
+
+ if (value != 0)
+ StrAllocCopy(result[argc], value);
+ } while (result[argc++] != 0);
+ va_end(ap);
+
+ return result;
+}
+
+static void free_argv(char **argv)
+{
+ int argc;
+
+ for (argc = 0; argv[argc] != 0; ++argc) {
+ free(argv[argc]);
+ }
+}
+
+/*
+ * Execute DIRED command, return -1 or 0 on failure, 1 success.
+ */
+static int LYExecv(const char *path,
+ char **argv,
+ char *msg)
+{
+ int rc = 0;
+
+#if defined(VMS)
+ CTRACE((tfp, "LYExecv: Called inappropriately! (path=%s)\n", path));
+#else
+ int n;
+ char *tmpbuf = 0;
+
+#if defined(__DJGPP__) || defined(_WINDOWS)
+ (void) msg;
+ stop_curses();
+ HTSprintf0(&tmpbuf, "%s", path);
+ for (n = 1; argv[n] != 0; n++)
+ HTSprintf(&tmpbuf, " %s", argv[n]);
+ HTSprintf(&tmpbuf, "\n");
+ rc = LYSystem(tmpbuf) ? 0 : 1;
+#else
+ int pid;
+
+#ifdef HAVE_TYPE_UNIONWAIT
+ union wait wstatus;
+
+#else
+ int wstatus;
+#endif
+
+ if (TRACE) {
+ CTRACE((tfp, "LYExecv path='%s'\n", path));
+ for (n = 0; argv[n] != 0; n++)
+ CTRACE((tfp, "argv[%d] = '%s'\n", n, argv[n]));
+ }
+
+ rc = 1; /* It will work */
+ stop_curses();
+ pid = fork(); /* fork and execute command */
+
+ switch (pid) {
+ case -1:
+ HTSprintf0(&tmpbuf, gettext("Unable to %s due to system error!"), msg);
+ rc = 0;
+ break; /* don't fall thru! - KW */
+
+ case 0: /* child */
+#ifdef USE_EXECVP
+ execvp(path, argv); /* this uses our $PATH */
+#else
+ execv(path, argv);
+#endif
+ exit(EXIT_FAILURE); /* execv failed, give wait() something to look at */
+ /*NOTREACHED */
+
+ default: /* parent */
+#ifndef HAVE_WAITPID
+ while (wait(&wstatus) != pid) ; /* do nothing */
+#else
+ while (-1 == waitpid(pid, &wstatus, 0)) { /* wait for child */
+#ifdef EINTR
+ if (errno == EINTR)
+ continue;
+#endif /* EINTR */
+#ifdef ERESTARTSYS
+ if (errno == ERESTARTSYS)
+ continue;
+#endif /* ERESTARTSYS */
+ break;
+ }
+#endif /* !HAVE_WAITPID */
+ if ((WIFEXITED(wstatus)
+ && (WEXITSTATUS(wstatus) != 0))
+ || (WIFSIGNALED(wstatus)
+ && (WTERMSIG(wstatus) > 0))) { /* error return */
+ HTSprintf0(&tmpbuf,
+ gettext("Probable failure to %s due to system error!"),
+ msg);
+ rc = 0;
+ }
+ }
+#endif /* __DJGPP__ */
+
+ if (rc == 0) {
+ /*
+ * Screen may have message from the failed execv'd command. Give user
+ * time to look at it before screen refresh.
+ */
+ LYSleepAlert();
+ }
+ start_curses();
+ if (tmpbuf != 0) {
+ if (rc == 0)
+ HTAlert(tmpbuf);
+ FREE(tmpbuf);
+ }
+#endif /* VMS || _WINDOWS */
+ CTRACE((tfp, "LYexecv ->%d\n", rc));
+ return (rc);
+}
+
+static int make_directory(char *path)
+{
+ int code;
+ const char *program;
+
+ if ((program = HTGetProgramPath(ppMKDIR)) != NULL) {
+ char **args;
+ char *msg = 0;
+
+ HTSprintf0(&msg, "make directory %s", path);
+ args = make_argv("mkdir",
+ path,
+ NULL);
+ code = (LYExecv(program, args, msg) <= 0) ? -1 : 1;
+ FREE(msg);
+ free_argv(args);
+ } else {
+#ifdef _WINDOWS
+ code = mkdir(path) ? -1 : 1;
+#else
+ code = mkdir(path, 0777) ? -1 : 1;
+#endif
+ CTRACE((tfp, "builtin mkdir ->%d\n\t%s\n", code, path));
+ }
+ return (code);
+}
+
+static int remove_file(char *path)
+{
+ int code;
+ const char *program;
+
+ if ((program = HTGetProgramPath(ppRM)) != NULL) {
+ char **args;
+ char *tmpbuf = NULL;
+
+ args = make_argv("rm",
+ "-f",
+ path,
+ NULL);
+ HTSprintf0(&tmpbuf, gettext("remove %s"), path);
+ code = LYExecv(program, args, tmpbuf);
+ FREE(tmpbuf);
+ free_argv(args);
+ } else {
+ code = remove(path) ? -1 : 1;
+ CTRACE((tfp, "builtin remove ->%d\n\t%s\n", code, path));
+ }
+ return (code);
+}
+
+static int remove_directory(char *path)
+{
+ int code;
+ const char *program;
+
+ if ((program = HTGetProgramPath(ppRMDIR)) != NULL) {
+ char **args;
+ char *tmpbuf = NULL;
+
+ args = make_argv("rmdir",
+ path,
+ NULL);
+ HTSprintf0(&tmpbuf, gettext("remove %s"), path);
+ code = LYExecv(program, args, tmpbuf);
+ FREE(tmpbuf);
+ free_argv(args);
+ } else {
+ code = rmdir(path) ? -1 : 1;
+ CTRACE((tfp, "builtin rmdir ->%d\n\t%s\n", code, path));
+ }
+ return (code);
+}
+
+static int touch_file(char *path)
+{
+ int code;
+ const char *program;
+
+ if ((program = HTGetProgramPath(ppTOUCH)) != NULL) {
+ char **args;
+ char *msg = NULL;
+
+ HTSprintf0(&msg, gettext("touch %s"), path);
+ args = make_argv("touch",
+ path,
+ NULL);
+ code = (LYExecv(program, args, msg) <= 0) ? -1 : 1;
+ FREE(msg);
+ free_argv(args);
+ } else {
+ FILE *fp;
+
+ if ((fp = fopen(path, BIN_W)) != 0) {
+ fclose(fp);
+ code = 1;
+ } else {
+ code = -1;
+ }
+ CTRACE((tfp, "builtin touch ->%d\n\t%s\n", code, path));
+ }
+ return (code);
+}
+
+static int move_file(char *source, char *target)
+{
+ int code;
+ const char *program;
+
+ if ((program = HTGetProgramPath(ppMV)) != NULL) {
+ char *msg = 0;
+ char **args;
+
+ HTSprintf0(&msg, gettext("move %s to %s"), source, target);
+ args = make_argv("mv",
+ source,
+ target,
+ NULL);
+ code = (LYExecv(program, args, msg) <= 0) ? -1 : 1;
+ FREE(msg);
+ free_argv(args);
+ } else {
+ struct stat sb;
+ char *actual = 0;
+
+ /* the caller sets up a target directory; we need a file path */
+ if (stat(target, &sb) == 0
+ && S_ISDIR(sb.st_mode)) {
+ HTSprintf0(&actual, "%s/%s", target, LYPathLeaf(source));
+ CTRACE((tfp, "move_file source=%s, target=%s\n", source, target));
+ target = actual;
+ }
+ code = rename(source, target);
+ CTRACE((tfp, "builtin move ->%d\n\tsource=%s\n\ttarget=%s\n",
+ code, source, target));
+ if (code != 0) { /* it failed */
+ if ((code = LYCopyFile(source, target)) >= 0) {
+ code = remove(source);
+ CTRACE((tfp, "...remove source after copying ->%d\n", code));
+ }
+ }
+ if (code == 0)
+ code = 1;
+ if (actual != target) {
+ FREE(actual);
+ }
+ }
+ return code;
+}
+
+static BOOLEAN not_already_exists(char *name)
+{
+ struct stat dir_info;
+
+ if (!OK_STAT(name, &dir_info)) {
+ if (errno != ENOENT) {
+ cannot_stat(name);
+ } else {
+ return TRUE;
+ }
+ } else if (S_ISDIR(dir_info.st_mode)) {
+ HTAlert(gettext("There is already a directory with that name! Request ignored."));
+ } else if (S_ISREG(dir_info.st_mode)) {
+ HTAlert(gettext("There is already a file with that name! Request ignored."));
+ } else {
+ HTAlert(gettext("The specified name is already in use! Request ignored."));
+ }
+ return FALSE;
+}
+
+static BOOLEAN dir_has_same_owner(struct stat *dst_info,
+ struct stat *src_info)
+{
+ if (S_ISDIR(dst_info->st_mode)) {
+ if (dst_info->st_uid == src_info->st_uid) {
+ return TRUE;
+ } else {
+ HTAlert(gettext("Destination has different owner! Request denied."));
+ }
+ } else {
+ HTAlert(gettext("Destination is not a valid directory! Request denied."));
+ }
+ return FALSE;
+}
+
+/*
+ * Make sure the source and target are not the same location.
+ */
+static BOOLEAN same_location(struct stat *dst_info,
+ struct stat *src_info)
+{
+ BOOLEAN result = FALSE;
+
+#ifdef UNIX
+ if (src_info->st_dev == dst_info->st_dev &&
+ src_info->st_ino == dst_info->st_ino) {
+ HTAlert(gettext("Source and destination are the same location! Request ignored!"));
+ result = TRUE;
+ }
+#endif
+ return result;
+}
+
+/*
+ * Remove all tagged files and directories.
+ */
+static int remove_tagged(void)
+{
+ int ans;
+ BOOL will_clear = TRUE;
+ char *cp;
+ char *tmpbuf = NULL;
+ char *testpath = NULL;
+ struct stat dir_info;
+ int count;
+ HTList *tag;
+
+ if (HTList_isEmpty(tagged)) /* should never happen */
+ return 0;
+
+ ans = HTConfirm(gettext("Remove all tagged files and directories?"));
+
+ count = 0;
+ tag = tagged;
+ while (ans == YES && (cp = (char *) HTList_nextObject(tag)) != NULL) {
+ if (is_url(cp) == FILE_URL_TYPE) { /* unnecessary check */
+ testpath = HTfullURL_toFile(cp);
+ LYTrimPathSep(testpath);
+ will_clear = TRUE;
+
+ /*
+ * Check the current status of the path to be deleted.
+ */
+ if (!ok_stat(testpath, &dir_info)) {
+ will_clear = FALSE;
+ break;
+ } else {
+ if (remove_file(testpath) <= 0) {
+ if (count == 0)
+ count = -1;
+ will_clear = FALSE;
+ break;
+ }
+ ++count;
+ FREE(testpath);
+ }
+ }
+ }
+ FREE(testpath);
+ FREE(tmpbuf);
+ if (will_clear)
+ clear_tags();
+ return count;
+}
+
+static char *parse_directory(char *path)
+{
+ char *result;
+
+ if (path) {
+ path = strip_trailing_slash(path);
+ path = HTParse(".", path, PARSE_PATH + PARSE_PUNCTUATION);
+ result = HTURLPath_toFile(path, TRUE, FALSE);
+ FREE(path);
+ } else { /* Last resort, should never happen. */
+ result = HTURLPath_toFile(".", TRUE, FALSE);
+ }
+ return result;
+}
+
+/*
+ * Move all tagged files and directories to a new location.
+ *
+ * The 'testpath' parameter is the current location, used for resolving
+ * relative target specifications.
+ */
+static int modify_tagged(char *testpath)
+{
+ char *cp;
+ bstring *given_target = NULL;
+ char *dst_path = NULL;
+ char *src_path = NULL;
+ char *old_path = NULL;
+ struct stat src_info;
+ struct stat dst_info;
+ int count = 0;
+ HTList *tag;
+
+ CTRACE((tfp, "modify_tagged(%s)\n", testpath));
+
+ if (HTList_isEmpty(tagged)) /* should never happen */
+ return 0;
+
+ _statusline(gettext("Enter new location for tagged items: "));
+
+ BStrCopy0(given_target, "");
+ (void) LYgetBString(&given_target, FALSE, 0, NORECALL);
+ if (!isBEmpty(given_target)) {
+ /*
+ * Replace ~/ references to the home directory.
+ */
+ if (LYIsTilde(given_target->str[0]) && LYIsPathSep(given_target->str[1])) {
+ char *cp1 = NULL;
+
+ StrAllocCopy(cp1, Home_Dir());
+ StrAllocCat(cp1, (given_target->str + 1));
+ BStrCopy0(given_target, cp1);
+ FREE(cp1);
+ }
+
+ /*
+ * If path is relative, prefix it with current location.
+ */
+ if (!LYIsPathSep(given_target->str[0])) {
+ dst_path = HTLocalName(testpath);
+ LYAddPathSep(&dst_path);
+ StrAllocCat(dst_path, given_target->str);
+ } else {
+ dst_path = HTLocalName(given_target->str);
+ }
+
+ if (!ok_stat(dst_path, &dst_info)) {
+ FREE(dst_path);
+ BStrFree(given_target);
+ return 0;
+ }
+
+ /*
+ * Determine the ownership of the current location, using the directory
+ * containing the file or subdir from each of the tagged files.
+ */
+ for (tag = tagged; (cp = (char *) HTList_nextObject(tag)) != NULL;) {
+ src_path = parse_directory(cp);
+
+ if (isEmpty(old_path) || strcmp(old_path, src_path)) {
+ if (!ok_stat(src_path, &src_info)
+ || same_location(&dst_info, &src_info)
+ || !dir_has_same_owner(&dst_info, &src_info)) {
+ FREE(src_path);
+ BStrFree(given_target);
+ return 0;
+ }
+ }
+ StrAllocCopy(old_path, src_path);
+ FREE(src_path);
+ }
+
+ /*
+ * Move all tagged items to the target location.
+ */
+ for (tag = tagged; (cp = (char *) HTList_nextObject(tag)) != NULL;) {
+ src_path = HTfullURL_toFile(cp);
+
+ if (move_file(src_path, dst_path) < 0) {
+ if (count == 0)
+ count = -1;
+ break;
+ }
+ FREE(src_path);
+ ++count;
+ }
+ clear_tags();
+ FREE(src_path);
+ FREE(dst_path);
+ }
+ BStrFree(given_target);
+ return count;
+}
+
+/*
+ * Modify the name of the specified item.
+ */
+static int modify_name(char *testpath)
+{
+ const char *cp;
+ bstring *tmpbuf = NULL;
+ char *newpath = NULL;
+ struct stat dir_info;
+ int code = 0;
+
+ /*
+ * Determine the status of the selected item.
+ */
+ testpath = strip_trailing_slash(testpath);
+
+ if (ok_stat(testpath, &dir_info)) {
+
+ /*
+ * Change the name of the file or directory.
+ */
+ if (S_ISDIR(dir_info.st_mode)) {
+ cp = gettext("Enter new name for directory: ");
+ } else if (S_ISREG(dir_info.st_mode)) {
+ cp = gettext("Enter new name for file: ");
+ } else {
+ return ok_file_or_dir(&dir_info);
+ }
+
+ BStrCopy0(tmpbuf, LYPathLeaf(testpath));
+ if (get_filename(cp, &tmpbuf)) {
+
+ /*
+ * Do not allow the user to also change the location at this time.
+ */
+ if (LYLastPathSep(tmpbuf->str) != 0) {
+ HTAlert(gettext("Illegal character (path-separator) found! Request ignored."));
+ } else if (strlen(tmpbuf->str)) {
+ if ((cp = LYLastPathSep(testpath)) != NULL) {
+ HTSprintf0(&newpath, "%.*s%s",
+ (int) (cp - testpath + 1),
+ testpath, tmpbuf->str);
+ } else {
+ StrAllocCopy(newpath, tmpbuf->str);
+ }
+
+ /*
+ * Make sure the destination does not already exist.
+ */
+ if (not_already_exists(newpath)) {
+ code = move_file(testpath, newpath);
+ }
+ FREE(newpath);
+ }
+ }
+ }
+ BStrFree(tmpbuf);
+ return code;
+}
+
+/*
+ * Change the location of a file or directory.
+ */
+static int modify_location(char *testpath)
+{
+ const char *cp;
+ char *sp;
+ bstring *tmpbuf = NULL;
+ char *newpath = NULL;
+ char *savepath = NULL;
+ struct stat old_info;
+ struct stat dir_info;
+ int code = 0;
+
+ /*
+ * Determine the status of the selected item.
+ */
+ testpath = strip_trailing_slash(testpath);
+ if (!ok_stat(testpath, &dir_info)) {
+ return 0;
+ }
+
+ /*
+ * Change the location of the file or directory.
+ */
+ if (S_ISDIR(dir_info.st_mode)) {
+ cp = gettext("Enter new location for directory: ");
+ } else if (S_ISREG(dir_info.st_mode)) {
+ cp = gettext("Enter new location for file: ");
+ } else {
+ return ok_file_or_dir(&dir_info);
+ }
+
+ BStrCopy0(tmpbuf, testpath);
+ *LYPathLeaf(tmpbuf->str) = '\0';
+ if (get_filename(cp, &tmpbuf)) {
+ if (strlen(tmpbuf->str)) {
+ StrAllocCopy(savepath, testpath);
+ StrAllocCopy(newpath, testpath);
+
+ /*
+ * Allow ~/ references to the home directory.
+ */
+ if (LYIsTilde(tmpbuf->str[0])
+ && (tmpbuf->str[1] == '\0' || LYIsPathSep(tmpbuf->str[1]))) {
+ StrAllocCopy(newpath, Home_Dir());
+ StrAllocCat(newpath, (tmpbuf->str + 1));
+ BStrCopy0(tmpbuf, newpath);
+ }
+ if (LYisAbsPath(tmpbuf->str)) {
+ StrAllocCopy(newpath, tmpbuf->str);
+ } else if ((sp = LYLastPathSep(newpath)) != NULL) {
+ *++sp = '\0';
+ StrAllocCat(newpath, tmpbuf->str);
+ } else {
+ HTAlert(gettext("Unexpected failure - unable to find trailing path separator"));
+ FREE(newpath);
+ FREE(savepath);
+ BStrFree(tmpbuf);
+ return 0;
+ }
+
+ /*
+ * Make sure the source and target have the same owner (uid).
+ */
+ old_info = dir_info;
+ if (!ok_stat(newpath, &dir_info)) {
+ code = 0;
+ } else if (same_location(&old_info, &dir_info)) {
+ code = 0;
+ } else if (dir_has_same_owner(&dir_info, &old_info)) {
+ code = move_file(savepath, newpath);
+ }
+ FREE(newpath);
+ FREE(savepath);
+ }
+ }
+ BStrFree(tmpbuf);
+ return code;
+}
+
+/*
+ * Modify name or location of a file or directory on localhost.
+ */
+int local_modify(DocInfo *doc, char **newpath)
+{
+ int ans;
+ char *cp;
+ bstring *testpath = NULL;
+ int count;
+ int code = 0;
+
+ if (!HTList_isEmpty(tagged)) {
+ cp = HTpartURL_toFile(doc->address);
+
+ count = modify_tagged(cp);
+ FREE(cp);
+
+ if (doc->link > (nlinks - count - 1))
+ doc->link = (nlinks - count - 1);
+ doc->link = ((doc->link < 0)
+ ? 0
+ : doc->link);
+
+ return count;
+ } else if (doc->link < 0 || doc->link > nlinks) {
+ /*
+ * Added protection.
+ */
+ return 0;
+ }
+
+ /*
+ * Do not allow simultaneous change of name and location as in Unix. This
+ * reduces functionality but reduces difficulty for the novice.
+ */
+#ifdef OK_PERMIT
+ _statusline(gettext("Modify name, location, or permission (n, l, or p): "));
+#else
+ _statusline(gettext("Modify name or location (n or l): "));
+#endif /* OK_PERMIT */
+ ans = LYgetch_single();
+
+ if (StrChr("NLP", ans) != NULL) {
+ cp = HTfullURL_toFile(links[doc->link].lname);
+ if (strlen(cp) >= DIRED_MAXBUF) {
+ FREE(cp);
+ return 0;
+ }
+ BStrCopy0(testpath, cp);
+ FREE(cp);
+
+ if (ans == 'N') {
+ code = modify_name(testpath->str);
+ } else if (ans == 'L') {
+ if (modify_location(testpath->str)) {
+ if (doc->link == (nlinks - 1))
+ --doc->link;
+ code = 1;
+ }
+#ifdef OK_PERMIT
+ } else if (ans == 'P') {
+ code = permit_location(NULL, testpath->str, newpath);
+#endif /* OK_PERMIT */
+ } else {
+ /*
+ * Code for changing ownership needed here.
+ */
+ HTAlert(gettext("This feature not yet implemented!"));
+ }
+ }
+ BStrFree(testpath);
+ return code;
+}
+
+#define BadChars() ((!no_dotfiles && show_dotfiles) \
+ ? "~/" \
+ : ".~/")
+
+/*
+ * Create a new empty file in the current directory.
+ */
+static int create_file(char *current_location)
+{
+ int code = FALSE;
+ bstring *tmpbuf = NULL;
+ char *testpath = NULL;
+
+ BStrCopy0(tmpbuf, "");
+ if (get_filename(gettext("Enter name of file to create: "), &tmpbuf)) {
+
+ if (strstr(tmpbuf->str, "//") != NULL) {
+ HTAlert(gettext("Illegal redirection \"//\" found! Request ignored."));
+ } else if (strlen(tmpbuf->str) &&
+ StrChr(BadChars(), tmpbuf->str[0]) == NULL) {
+ StrAllocCopy(testpath, current_location);
+ LYAddPathSep(&testpath);
+
+ /*
+ * Append the target filename to the current location.
+ */
+ StrAllocCat(testpath, tmpbuf->str);
+
+ /*
+ * Make sure the target does not already exist
+ */
+ if (not_already_exists(testpath)) {
+ code = touch_file(testpath);
+ }
+ FREE(testpath);
+ }
+ }
+ BStrFree(tmpbuf);
+ return code;
+}
+
+/*
+ * Create a new directory in the current directory.
+ */
+static int create_directory(char *current_location)
+{
+ int code = FALSE;
+ bstring *tmpbuf = NULL;
+ char *testpath = NULL;
+
+ BStrCopy0(tmpbuf, "");
+ if (get_filename(gettext("Enter name for new directory: "), &tmpbuf)) {
+
+ if (strstr(tmpbuf->str, "//") != NULL) {
+ HTAlert(gettext("Illegal redirection \"//\" found! Request ignored."));
+ } else if (strlen(tmpbuf->str) &&
+ StrChr(BadChars(), tmpbuf->str[0]) == NULL) {
+ StrAllocCopy(testpath, current_location);
+ LYAddPathSep(&testpath);
+
+ StrAllocCat(testpath, tmpbuf->str);
+
+ /*
+ * Make sure the target does not already exist.
+ */
+ if (not_already_exists(testpath)) {
+ code = make_directory(testpath);
+ }
+ FREE(testpath);
+ }
+ }
+ BStrFree(tmpbuf);
+ return code;
+}
+
+/*
+ * Create a file or a directory at the current location.
+ */
+int local_create(DocInfo *doc)
+{
+ int ans;
+ char *cp;
+ char testpath[DIRED_MAXBUF];
+
+ cp = HTfullURL_toFile(doc->address);
+ if (strlen(cp) >= DIRED_MAXBUF) {
+ FREE(cp);
+ return 0;
+ }
+ strcpy(testpath, cp);
+ FREE(cp);
+
+ _statusline(gettext("Create file or directory (f or d): "));
+ ans = LYgetch_single();
+
+ if (ans == 'F') {
+ return (create_file(testpath));
+ } else if (ans == 'D') {
+ return (create_directory(testpath));
+ } else {
+ return 0;
+ }
+}
+
+/*
+ * Remove a single file or directory.
+ */
+static int remove_single(char *testpath)
+{
+ int code = 0;
+ char *cp;
+ char *tmpbuf = 0;
+ struct stat dir_info;
+ BOOL is_directory = FALSE;
+
+ if (!ok_lstat(testpath, &dir_info)) {
+ return 0;
+ }
+
+ /*
+ * Locate the filename portion of the path.
+ */
+ if ((cp = LYLastPathSep(testpath)) != NULL) {
+ ++cp;
+ } else {
+ cp = testpath;
+ }
+ if (S_ISDIR(dir_info.st_mode)) {
+ /*
+ * This strlen stuff will probably screw up intl translations. Course,
+ * it's probably broken for screen sizes other 80, too -jes
+ */
+ if (strlen(cp) < 37) {
+ HTSprintf0(&tmpbuf,
+ gettext("Remove directory '%s'?"), cp);
+ } else {
+ HTSprintf0(&tmpbuf,
+ gettext("Remove directory?"));
+ }
+ is_directory = TRUE;
+ } else if (S_ISREG(dir_info.st_mode)) {
+ if (strlen(cp) < 60) {
+ HTSprintf0(&tmpbuf, gettext("Remove file '%s'?"), cp);
+ } else {
+ HTSprintf0(&tmpbuf, gettext("Remove file?"));
+ }
+#ifdef S_IFLNK
+ } else if (S_ISLNK(dir_info.st_mode)) {
+ if (strlen(cp) < 50) {
+ HTSprintf0(&tmpbuf, gettext("Remove symbolic link '%s'?"), cp);
+ } else {
+ HTSprintf0(&tmpbuf, gettext("Remove symbolic link?"));
+ }
+#endif
+ } else {
+ cannot_stat(testpath);
+ FREE(tmpbuf);
+ return 0;
+ }
+
+ if (HTConfirm(tmpbuf) == YES) {
+ code = is_directory
+ ? remove_directory(testpath)
+ : remove_file(testpath);
+ }
+ FREE(tmpbuf);
+ return code;
+}
+
+/*
+ * Remove a file or a directory.
+ */
+int local_remove(DocInfo *doc)
+{
+ char *cp, *tp;
+ char testpath[DIRED_MAXBUF];
+ int count, i;
+
+ if (!HTList_isEmpty(tagged)) {
+ count = remove_tagged();
+ if (doc->link > (nlinks - count - 1))
+ doc->link = (nlinks - count - 1);
+ doc->link = ((doc->link < 0)
+ ? 0
+ : doc->link);
+ return count;
+ } else if (doc->link < 0 || doc->link > nlinks) {
+ return 0;
+ }
+ cp = links[doc->link].lname;
+ if (is_url(cp) == FILE_URL_TYPE) {
+ tp = HTfullURL_toFile(cp);
+ if (strlen(tp) >= DIRED_MAXBUF) {
+ FREE(tp);
+ return 0;
+ }
+ strcpy(testpath, tp);
+ FREE(tp);
+
+ if ((i = (int) strlen(testpath)) && testpath[i - 1] == '/')
+ testpath[(i - 1)] = '\0';
+
+ if (remove_single(testpath)) {
+ if (doc->link == (nlinks - 1))
+ --doc->link;
+ return 1;
+ }
+ }
+ return 0;
+}
+
+#ifdef OK_PERMIT
+
+static bstring *LYValidPermitFile = NULL;
+
+static long permit_bits(char *string_mode)
+{
+ if (!strcmp(string_mode, "IRUSR"))
+ return S_IRUSR;
+ if (!strcmp(string_mode, "IWUSR"))
+ return S_IWUSR;
+ if (!strcmp(string_mode, "IXUSR"))
+ return S_IXUSR;
+ if (!strcmp(string_mode, "IRGRP"))
+ return S_IRGRP;
+ if (!strcmp(string_mode, "IWGRP"))
+ return S_IWGRP;
+ if (!strcmp(string_mode, "IXGRP"))
+ return S_IXGRP;
+ if (!strcmp(string_mode, "IROTH"))
+ return S_IROTH;
+ if (!strcmp(string_mode, "IWOTH"))
+ return S_IWOTH;
+ if (!strcmp(string_mode, "IXOTH"))
+ return S_IXOTH;
+ /* Don't include setuid and friends; use shell access for that. */
+ return 0;
+}
+
+/*
+ * Handle DIRED permissions.
+ */
+static int permit_location(char *destpath,
+ char *srcpath,
+ char **newpath)
+{
+ int code = 0;
+
+#ifndef UNIX
+ HTAlert(gettext("Sorry, don't know how to permit non-UNIX files yet."));
+#else
+ static char tempfile[LY_MAXPATH] = "\0";
+ char *cp;
+ char tmpdst[LY_MAXPATH];
+ struct stat dir_info;
+ const char *program;
+
+ if (srcpath) {
+ /*
+ * Create form.
+ */
+ FILE *fp0;
+ char *user_filename;
+ const char *group_name;
+
+ srcpath = strip_trailing_slash(srcpath);
+
+ /*
+ * A couple of sanity tests.
+ */
+ if (!ok_lstat(srcpath, &dir_info)
+ || !ok_file_or_dir(&dir_info))
+ return code;
+
+ user_filename = LYPathLeaf(srcpath);
+
+ (void) LYRemoveTemp(tempfile);
+ if ((fp0 = LYOpenTemp(tempfile, HTML_SUFFIX, "w")) == NULL) {
+ HTAlert(gettext("Unable to open permit options file"));
+ return (code);
+ }
+
+ /*
+ * Make the tempfile a URL.
+ */
+ LYLocalFileToURL(newpath, tempfile);
+ LYRegisterUIPage(*newpath, UIP_PERMIT_OPTIONS);
+
+ group_name = HTAA_GidToName((int) dir_info.st_gid);
+ BStrCopy0(LYValidPermitFile, srcpath);
+
+ fprintf(fp0, "<Html><Head>\n<Title>%s</Title>\n</Head>\n<Body>\n",
+ PERMIT_OPTIONS_TITLE);
+ fprintf(fp0, "<H1>%s%s</H1>\n", PERMISSIONS_SEGMENT, user_filename);
+ {
+ /*
+ * Prevent filenames which include '#' or '?' from messing it up.
+ */
+ char *srcpath_url = HTEscape(srcpath, URL_PATH);
+
+ fprintf(fp0, "<Form Action=\"%s//PERMIT_LOCATION%s\">\n",
+ STR_LYNXDIRED, srcpath_url);
+ FREE(srcpath_url);
+ }
+
+ fprintf(fp0, "<Ol><Li>%s<Br><Br>\n",
+ gettext("Specify permissions below:"));
+ fprintf(fp0, "%s:<Br>\n", gettext("Owner:"));
+ fprintf(fp0,
+ "<Input Type=\"checkbox\" Name=\"mode\" Value=\"IRUSR\" %s> Read<Br>\n",
+ (dir_info.st_mode & S_IRUSR) ? "checked" : "");
+ fprintf(fp0,
+ "<Input Type=\"checkbox\" Name=\"mode\" Value=\"IWUSR\" %s> Write<Br>\n",
+ (dir_info.st_mode & S_IWUSR) ? "checked" : "");
+ /*
+ * If restricted, only change eXecute permissions on directories.
+ */
+ if (!no_change_exec_perms || S_ISDIR(dir_info.st_mode))
+ fprintf(fp0,
+ "<Input Type=\"checkbox\" Name=\"mode\" Value=\"IXUSR\" %s> %s<Br>\n",
+ (dir_info.st_mode & S_IXUSR) ? "checked" : "",
+ S_ISDIR(dir_info.st_mode) ? "Search" : "Execute");
+
+ fprintf(fp0, "%s %s:<Br>\n", gettext("Group"), group_name);
+ fprintf(fp0,
+ "<Input Type=\"checkbox\" Name=\"mode\" Value=\"IRGRP\" %s> Read<Br>\n",
+ (dir_info.st_mode & S_IRGRP) ? "checked" : "");
+ fprintf(fp0,
+ "<Input Type=\"checkbox\" Name=\"mode\" Value=\"IWGRP\" %s> Write<Br>\n",
+ (dir_info.st_mode & S_IWGRP) ? "checked" : "");
+ /*
+ * If restricted, only change eXecute permissions on directories.
+ */
+ if (!no_change_exec_perms || S_ISDIR(dir_info.st_mode))
+ fprintf(fp0,
+ "<Input Type=\"checkbox\" Name=\"mode\" Value=\"IXGRP\" %s> %s<Br>\n",
+ (dir_info.st_mode & S_IXGRP) ? "checked" : "",
+ S_ISDIR(dir_info.st_mode) ? "Search" : "Execute");
+
+ fprintf(fp0, "%s<Br>\n", gettext("Others:"));
+ fprintf(fp0,
+ "<Input Type=\"checkbox\" Name=\"mode\" Value=\"IROTH\" %s> Read<Br>\n",
+ (dir_info.st_mode & S_IROTH) ? "checked" : "");
+ fprintf(fp0,
+ "<Input Type=\"checkbox\" Name=\"mode\" Value=\"IWOTH\" %s> Write<Br>\n",
+ (dir_info.st_mode & S_IWOTH) ? "checked" : "");
+ /*
+ * If restricted, only change eXecute permissions on directories.
+ */
+ if (!no_change_exec_perms || S_ISDIR(dir_info.st_mode))
+ fprintf(fp0,
+ "<Input Type=\"checkbox\" Name=\"mode\" Value=\"IXOTH\" %s> %s<Br>\n",
+ (dir_info.st_mode & S_IXOTH) ? "checked" : "",
+ S_ISDIR(dir_info.st_mode) ? "Search" : "Execute");
+
+ fprintf(fp0,
+ "<Br>\n<Li><Input Type=\"submit\" Value=\"Submit\"> %s %s %s.\n</Ol>\n</Form>\n",
+ gettext("form to permit"),
+ S_ISDIR(dir_info.st_mode) ? "directory" : "file",
+ user_filename);
+ fprintf(fp0, "</Body></Html>");
+ LYCloseTempFP(fp0);
+
+ LYforce_no_cache = TRUE;
+ code = PERMIT_FORM_RESULT; /* Special flag for LYMainLoop */
+
+ } else { /* The form being activated. */
+ mode_t new_mode = 0;
+
+ /*
+ * Make sure we have a valid set-permission file comparison string
+ * loaded via a previous call with srcpath != NULL. - KW
+ */
+ if (isBEmpty(LYValidPermitFile)) {
+ if (LYCursesON)
+ HTAlert(INVALID_PERMIT_URL);
+ else
+ fprintf(stderr, "%s\n", INVALID_PERMIT_URL);
+ CTRACE((tfp, "permit_location: called for <%s>.\n",
+ (destpath ?
+ destpath : "NULL URL pointer")));
+ return code;
+ }
+ cp = destpath;
+ while (*cp != '\0' && *cp != '?') { /* Find filename */
+ cp++;
+ }
+ if (*cp == '\0') {
+ return (code); /* Nothing to permit. */
+ }
+ *cp++ = '\0'; /* Null terminate file name and
+ start working on the masks. */
+
+ /* Will now operate only on filename part. */
+ if ((destpath = HTURLPath_toFile(destpath, TRUE, FALSE)) == 0)
+ return (code);
+ if (strlen(destpath) >= LY_MAXPATH) {
+ FREE(destpath);
+ return (code);
+ }
+ strcpy(tmpdst, destpath);
+ FREE(destpath);
+ destpath = tmpdst;
+
+ /*
+ * Make sure that the file string is the one from the last displayed
+ * File Permissions menu. - KW
+ */
+ if (strcmp(destpath, LYValidPermitFile->str)) {
+ if (LYCursesON)
+ HTAlert(INVALID_PERMIT_URL);
+ else
+ fprintf(stderr, "%s\n", INVALID_PERMIT_URL);
+ CTRACE((tfp, "permit_location: called for file '%s'.\n",
+ destpath));
+ return code;
+ }
+
+ /*
+ * A couple of sanity tests.
+ */
+ destpath = strip_trailing_slash(destpath);
+ if (!ok_stat(destpath, &dir_info)
+ || !ok_file_or_dir(&dir_info)) {
+ return code;
+ }
+
+ /*
+ * Cycle over permission strings.
+ */
+ while (*cp != '\0') {
+ char *cr = cp;
+
+ while (*cr != '\0' && *cr != '&') { /* GET data split by '&'. */
+ cr++;
+ }
+ if (*cr != '\0') {
+ *cr++ = '\0';
+ }
+ if (StrNCmp(cp, "mode=", 5) == 0) { /* Magic string. */
+ long mask = permit_bits(cp + 5);
+
+ if (mask != 0) {
+ /*
+ * If restricted, only change eXecute permissions on
+ * directories.
+ */
+ if (!no_change_exec_perms
+ || StrChr(cp + 5, 'X') == NULL
+ || S_ISDIR(dir_info.st_mode)) {
+ new_mode |= (mode_t) mask;
+ }
+ } else {
+ HTAlert(gettext("Invalid mode format."));
+ return code;
+ }
+ } else {
+ HTAlert(gettext("Invalid syntax format."));
+ return code;
+ }
+
+ cp = cr;
+ }
+
+ /*
+ * Call chmod().
+ */
+ code = 1;
+ if ((program = HTGetProgramPath(ppCHMOD)) != NULL) {
+ char **args;
+ char amode[10];
+ char *tmpbuf = NULL;
+
+ HTSprintf0(&tmpbuf, "chmod %.4o %s", (unsigned) new_mode, destpath);
+ sprintf(amode, "%.4o", (unsigned) new_mode);
+ args = make_argv("chmod",
+ amode,
+ destpath,
+ NULL);
+ if (LYExecv(program, args, tmpbuf) <= 0) {
+ code = -1;
+ }
+ FREE(tmpbuf);
+ free_argv(args);
+ } else {
+ if (chmod(destpath, new_mode) < 0) {
+ code = -1;
+ }
+ CTRACE((tfp, "builtin chmod %.4o ->%d\n\t%s\n",
+ (unsigned) new_mode, code, destpath));
+ }
+ if (code == 1)
+ LYforce_no_cache = TRUE; /* Force update of dired listing. */
+ }
+#endif /* !UNIX */
+ return code;
+}
+#endif /* OK_PERMIT */
+
+/*
+ * Display or remove a tag from a given link.
+ */
+void tagflag(int flag,
+ int cur)
+{
+ if (nlinks > 0) {
+ LYmove(links[cur].ly, 2);
+ lynx_stop_reverse();
+ if (flag == TRUE) {
+ LYaddch('+');
+ } else {
+ LYaddch(' ');
+ }
+
+#if defined(FANCY_CURSES) || defined(USE_SLANG)
+ if (!LYShowCursor)
+ LYHideCursor(); /* get cursor out of the way */
+ else
+#endif /* FANCY CURSES || USE_SLANG */
+ /*
+ * Never hide the cursor if there's no FANCY CURSES.
+ */
+ LYmove(links[cur].ly, links[cur].lx);
+
+ LYrefresh();
+ }
+}
+
+/*
+ * Handle DIRED tags.
+ */
+void showtags(HTList *t)
+{
+ int i;
+ HTList *s;
+ char *name;
+
+ for (i = 0; i < nlinks; i++) {
+ s = t;
+ while ((name = (char *) HTList_nextObject(s)) != NULL) {
+ if (!strcmp(links[i].lname, name)) {
+ tagflag(TRUE, i);
+ break;
+ }
+ }
+ }
+}
+
+static char *DirectoryOf(char *pathname)
+{
+ char *result = 0;
+ char *leaf;
+
+ StrAllocCopy(result, pathname);
+ leaf = LYPathLeaf(result);
+
+ if (leaf != result) {
+ const char *result1 = 0;
+
+ *leaf = '\0';
+ if (!LYisRootPath(result))
+ LYTrimPathSep(result);
+ result1 = wwwName(result);
+ StrAllocCopy(result, result1);
+ }
+ return result;
+}
+
+#ifdef __DJGPP__
+/*
+ * Convert filenames to acceptable 8+3 names when necessary. Make a copy of
+ * the parameter if we must modify it.
+ */
+static char *LYonedot(char *line)
+{
+ char *dot;
+ static char line1[LY_MAXPATH];
+
+ if (pathconf(line, _PC_NAME_MAX) <= 12) {
+ LYStrNCpy(line1, line, sizeof(line1) - 1);
+ for (;;) {
+ if ((dot = strrchr(line1, '.')) == 0
+ || LYLastPathSep(dot) != 0) {
+ break;
+ } else if (strlen(dot) == 1) {
+ *dot = 0;
+ } else {
+ *dot = '_';
+ }
+ }
+ return (line1);
+ }
+ return (line);
+}
+#else
+#define LYonedot(path) path
+#endif /* __DJGPP__ */
+
+static char *match_op(const char *prefix,
+ char *data)
+{
+ size_t len = strlen(prefix);
+
+ if (!StrNCmp("LYNXDIRED://", data, 12)
+ && !strncasecomp(prefix, data + 12, (int) len)) {
+ len += 12;
+#if defined(USE_DOS_DRIVES)
+ if (data[len] == '/') { /* this is normal */
+ len++;
+ }
+#endif
+ return data + len;
+ }
+ return 0;
+}
+
+/*
+ * Construct the appropriate system command taking care to escape all path
+ * references to avoid spoofing the shell.
+ */
+static char *build_command(char *line,
+ char *dirName,
+ char *arg)
+{
+ char *buffer = NULL;
+ const char *program;
+ const char *tar_path = HTGetProgramPath(ppTAR);
+
+ if ((arg = match_op("DECOMPRESS", line)) != 0) {
+#define FMT_UNCOMPRESS "%s %s"
+ if ((program = HTGetProgramPath(ppUNCOMPRESS)) != NULL) {
+ HTAddParam(&buffer, FMT_UNCOMPRESS, 1, program);
+ HTAddParam(&buffer, FMT_UNCOMPRESS, 2, arg);
+ HTEndParam(&buffer, FMT_UNCOMPRESS, 2);
+ }
+ return buffer;
+ }
+#if defined(OK_UUDECODE) && !defined(ARCHIVE_ONLY)
+ if ((arg = match_op("UUDECODE", line)) != 0) {
+#define FMT_UUDECODE "%s %s"
+ if ((program = HTGetProgramPath(ppUUDECODE)) != NULL) {
+ HTAddParam(&buffer, FMT_UUDECODE, 1, program);
+ HTAddParam(&buffer, FMT_UUDECODE, 2, arg);
+ HTEndParam(&buffer, FMT_UUDECODE, 2);
+ HTAlert(gettext("Warning! UUDecoded file will exist in the directory you started Lynx."));
+ }
+ return buffer;
+ }
+#endif /* OK_UUDECODE && !ARCHIVE_ONLY */
+
+#ifdef OK_TAR
+ if (tar_path != NULL) {
+# ifndef ARCHIVE_ONLY
+# ifdef OK_GZIP
+ if ((arg = match_op("UNTAR_GZ", line)) != 0) {
+#define FMT_UNTAR_GZ "cd %s; %s -qdc %s | %s %s %s"
+ if ((program = HTGetProgramPath(ppGZIP)) != NULL) {
+ dirName = DirectoryOf(arg);
+ HTAddParam(&buffer, FMT_UNTAR_GZ, 1, dirName);
+ HTAddParam(&buffer, FMT_UNTAR_GZ, 2, program);
+ HTAddParam(&buffer, FMT_UNTAR_GZ, 3, arg);
+ HTAddParam(&buffer, FMT_UNTAR_GZ, 4, tar_path);
+ HTAddToCmd(&buffer, FMT_UNTAR_GZ, 5, TAR_DOWN_OPTIONS);
+ HTAddToCmd(&buffer, FMT_UNTAR_GZ, 6, TAR_PIPE_OPTIONS);
+ HTEndParam(&buffer, FMT_UNTAR_GZ, 6);
+ }
+ return buffer;
+ }
+# endif /* OK_GZIP */
+ if ((arg = match_op("UNTAR_Z", line)) != 0) {
+#define FMT_UNTAR_Z "cd %s; %s %s | %s %s %s"
+ if ((program = HTGetProgramPath(ppZCAT)) != NULL) {
+ dirName = DirectoryOf(arg);
+ HTAddParam(&buffer, FMT_UNTAR_Z, 1, dirName);
+ HTAddParam(&buffer, FMT_UNTAR_Z, 2, program);
+ HTAddParam(&buffer, FMT_UNTAR_Z, 3, arg);
+ HTAddParam(&buffer, FMT_UNTAR_Z, 4, tar_path);
+ HTAddToCmd(&buffer, FMT_UNTAR_Z, 5, TAR_DOWN_OPTIONS);
+ HTAddToCmd(&buffer, FMT_UNTAR_Z, 6, TAR_PIPE_OPTIONS);
+ HTEndParam(&buffer, FMT_UNTAR_Z, 6);
+ }
+ return buffer;
+ }
+ if ((arg = match_op("UNTAR", line)) != 0) {
+#define FMT_UNTAR "cd %s; %s %s %s"
+ dirName = DirectoryOf(arg);
+ HTAddParam(&buffer, FMT_UNTAR, 1, dirName);
+ HTAddParam(&buffer, FMT_UNTAR, 2, tar_path);
+ HTAddToCmd(&buffer, FMT_UNTAR, 3, TAR_DOWN_OPTIONS);
+ HTAddParam(&buffer, FMT_UNTAR, 4, arg);
+ HTEndParam(&buffer, FMT_UNTAR, 4);
+ return buffer;
+ }
+# endif /* !ARCHIVE_ONLY */
+
+# ifdef OK_GZIP
+ if ((arg = match_op("TAR_GZ", line)) != 0) {
+#define FMT_TAR_GZ "cd %s; %s %s %s %s | %s -qc >%s%s"
+ if ((program = HTGetProgramPath(ppGZIP)) != NULL) {
+ dirName = DirectoryOf(arg);
+ HTAddParam(&buffer, FMT_TAR_GZ, 1, dirName);
+ HTAddParam(&buffer, FMT_TAR_GZ, 2, tar_path);
+ HTAddToCmd(&buffer, FMT_TAR_GZ, 3, TAR_UP_OPTIONS);
+ HTAddToCmd(&buffer, FMT_TAR_GZ, 4, TAR_PIPE_OPTIONS);
+ HTAddParam(&buffer, FMT_TAR_GZ, 5, LYPathLeaf(arg));
+ HTAddParam(&buffer, FMT_TAR_GZ, 6, program);
+ HTAddParam(&buffer, FMT_TAR_GZ, 7, LYonedot(LYPathLeaf(arg)));
+ HTAddParam(&buffer, FMT_TAR_GZ, 8, EXT_TAR_GZ);
+ HTEndParam(&buffer, FMT_TAR_GZ, 8);
+ }
+ return buffer;
+ }
+# endif /* OK_GZIP */
+
+ if ((arg = match_op("TAR_Z", line)) != 0) {
+#define FMT_TAR_Z "cd %s; %s %s %s %s | %s >%s%s"
+ if ((program = HTGetProgramPath(ppCOMPRESS)) != NULL) {
+ dirName = DirectoryOf(arg);
+ HTAddParam(&buffer, FMT_TAR_Z, 1, dirName);
+ HTAddParam(&buffer, FMT_TAR_Z, 2, tar_path);
+ HTAddToCmd(&buffer, FMT_TAR_Z, 3, TAR_UP_OPTIONS);
+ HTAddToCmd(&buffer, FMT_TAR_Z, 4, TAR_PIPE_OPTIONS);
+ HTAddParam(&buffer, FMT_TAR_Z, 5, LYPathLeaf(arg));
+ HTAddParam(&buffer, FMT_TAR_Z, 6, program);
+ HTAddParam(&buffer, FMT_TAR_Z, 7, LYonedot(LYPathLeaf(arg)));
+ HTAddParam(&buffer, FMT_TAR_Z, 8, EXT_TAR_Z);
+ HTEndParam(&buffer, FMT_TAR_Z, 8);
+ }
+ return buffer;
+ }
+
+ if ((arg = match_op("TAR", line)) != 0) {
+#define FMT_TAR "cd %s; %s %s %s %s.tar %s"
+ dirName = DirectoryOf(arg);
+ HTAddParam(&buffer, FMT_TAR, 1, dirName);
+ HTAddParam(&buffer, FMT_TAR, 2, tar_path);
+ HTAddToCmd(&buffer, FMT_TAR, 3, TAR_UP_OPTIONS);
+ HTAddToCmd(&buffer, FMT_TAR, 4, TAR_FILE_OPTIONS);
+ HTAddParam(&buffer, FMT_TAR, 5, LYonedot(LYPathLeaf(arg)));
+ HTAddParam(&buffer, FMT_TAR, 6, LYPathLeaf(arg));
+ HTEndParam(&buffer, FMT_TAR, 6);
+ return buffer;
+ }
+ }
+#endif /* OK_TAR */
+
+#ifdef OK_GZIP
+ if ((arg = match_op("GZIP", line)) != 0) {
+#define FMT_GZIP "%s -q %s"
+ if ((program = HTGetProgramPath(ppGZIP)) != NULL) {
+ HTAddParam(&buffer, FMT_GZIP, 1, program);
+ HTAddParam(&buffer, FMT_GZIP, 2, arg);
+ HTEndParam(&buffer, FMT_GZIP, 2);
+ }
+ return buffer;
+ }
+#ifndef ARCHIVE_ONLY
+ if ((arg = match_op("UNGZIP", line)) != 0) {
+#define FMT_UNGZIP "%s -d %s"
+ if ((program = HTGetProgramPath(ppGZIP)) != NULL) {
+ HTAddParam(&buffer, FMT_UNGZIP, 1, program);
+ HTAddParam(&buffer, FMT_UNGZIP, 2, arg);
+ HTEndParam(&buffer, FMT_UNGZIP, 2);
+ }
+ return buffer;
+ }
+#endif /* !ARCHIVE_ONLY */
+#endif /* OK_GZIP */
+
+#ifdef OK_ZIP
+ if ((arg = match_op("ZIP", line)) != 0) {
+#define FMT_ZIP "cd %s; %s -rq %s.zip %s"
+ if ((program = HTGetProgramPath(ppZIP)) != NULL) {
+ dirName = DirectoryOf(arg);
+ HTAddParam(&buffer, FMT_ZIP, 1, dirName);
+ HTAddParam(&buffer, FMT_ZIP, 2, program);
+ HTAddParam(&buffer, FMT_ZIP, 3, LYonedot(LYPathLeaf(arg)));
+ HTAddParam(&buffer, FMT_ZIP, 4, LYPathLeaf(arg));
+ HTEndParam(&buffer, FMT_ZIP, 4);
+ }
+ return buffer;
+ }
+#if !defined(ARCHIVE_ONLY)
+ if ((arg = match_op("UNZIP", line)) != 0) {
+#define FMT_UNZIP "cd %s; %s -q %s"
+ if ((program = HTGetProgramPath(ppUNZIP)) != NULL) {
+ dirName = DirectoryOf(arg);
+ HTAddParam(&buffer, FMT_UNZIP, 1, dirName);
+ HTAddParam(&buffer, FMT_UNZIP, 2, program);
+ HTAddParam(&buffer, FMT_UNZIP, 3, arg);
+ HTEndParam(&buffer, FMT_UNZIP, 3);
+ }
+ return buffer;
+ }
+# endif /* !ARCHIVE_ONLY */
+#endif /* OK_ZIP */
+
+ if ((arg = match_op("COMPRESS", line)) != 0) {
+#define FMT_COMPRESS "%s %s"
+ if ((program = HTGetProgramPath(ppCOMPRESS)) != NULL) {
+ HTAddParam(&buffer, FMT_COMPRESS, 1, program);
+ HTAddParam(&buffer, FMT_COMPRESS, 2, arg);
+ HTEndParam(&buffer, FMT_COMPRESS, 2);
+ }
+ return buffer;
+ }
+
+ return NULL;
+}
+
+/*
+ * Perform file management operations for LYNXDIRED URL's. Attempt to be
+ * consistent. These are (pseudo) URLs - i.e., they should be in URL syntax:
+ * some bytes will be URL-escaped with '%'. This is necessary because these
+ * (pseudo) URLs will go through some of the same kinds of interpretations and
+ * mutilations as real ones: HTParse, stripping off #fragments etc. (Some
+ * access schemes currently have special rules about not escaping parsing '#'
+ * "the URL way" built into HTParse, but that doesn't look like a clean way.)
+ */
+int local_dired(DocInfo *doc)
+{
+ char *line_url; /* will point to doc's address, which is a URL */
+ char *line = NULL; /* same as line_url, but HTUnEscaped, will be allocated */
+ char *arg = NULL; /* ...will point into line[] */
+ char *tp = NULL;
+ char *tmpbuf = NULL;
+ char *buffer = NULL;
+ char *dirName = NULL;
+ BOOL do_pop_doc = TRUE;
+
+ line_url = doc->address;
+ CTRACE((tfp, "local_dired: called for <%s>.\n",
+ (line_url
+ ? line_url
+ : gettext("NULL URL pointer"))));
+ HTUnEscapeSome(line_url, "/"); /* don't mess too much with *doc */
+
+ StrAllocCopy(line, line_url);
+ HTUnEscape(line); /* _file_ (not URL) syntax, for those functions
+ that need it. Don't forget to FREE it. */
+ if (match_op("CHDIR", line) != 0) {
+#ifdef SUPPORT_CHDIR
+ handle_LYK_CHDIR();
+ do_pop_doc = FALSE;
+#endif
+ arg = 0; /* do something to avoid cc's complaints */
+ } else if ((arg = match_op("NEW_FILE", line)) != 0) {
+ if (create_file(arg) > 0)
+ LYforce_no_cache = TRUE;
+ } else if ((arg = match_op("NEW_FOLDER", line)) != 0) {
+ if (create_directory(arg) > 0)
+ LYforce_no_cache = TRUE;
+#ifdef OK_INSTALL
+ } else if ((arg = match_op("INSTALL_SRC", line)) != 0) {
+ local_install(NULL, arg, &tp);
+ if (tp) {
+ FREE(doc->address);
+ doc->address = tp;
+ }
+ FREE(line);
+ return 0;
+ } else if ((arg = match_op("INSTALL_DEST", line)) != 0) {
+ local_install(arg, NULL, &tp);
+ LYpop(doc);
+#endif /* OK_INSTALL */
+ } else if ((arg = match_op("MODIFY_NAME", line)) != 0) {
+ if (modify_name(arg) > 0)
+ LYforce_no_cache = TRUE;
+ } else if ((arg = match_op("MODIFY_LOCATION", line)) != 0) {
+ if (modify_location(arg) > 0)
+ LYforce_no_cache = TRUE;
+ } else if ((arg = match_op("MOVE_TAGGED", line_url)) != 0) {
+ if (modify_tagged(arg) > 0)
+ LYforce_no_cache = TRUE;
+#ifdef OK_PERMIT
+ } else if ((arg = match_op("PERMIT_SRC", line)) != 0) {
+ permit_location(NULL, arg, &tp);
+ if (tp) {
+ /*
+ * One of the checks may have failed.
+ */
+ FREE(doc->address);
+ doc->address = tp;
+ }
+ FREE(line);
+ return 0;
+ } else if ((arg = match_op("PERMIT_LOCATION", line_url)) != 0) {
+ permit_location(arg, NULL, &tp);
+#endif /* OK_PERMIT */
+ } else if ((arg = match_op("REMOVE_SINGLE", line)) != 0) {
+ if (remove_single(arg) > 0)
+ LYforce_no_cache = TRUE;
+ } else if (match_op("REMOVE_TAGGED", line) != 0) {
+ if (remove_tagged())
+ LYforce_no_cache = TRUE;
+ } else if (match_op("CLEAR_TAGGED", line) != 0) {
+ clear_tags();
+ } else if ((arg = match_op("UPLOAD", line)) != 0) {
+ /*
+ * They're written by LYUpload_options() HTUnEscaped; don't want to
+ * change that for now... so pass through without more unescaping.
+ * Directory names containing '#' will probably fail.
+ */
+ if (LYUpload(line_url))
+ LYforce_no_cache = TRUE;
+ } else {
+ LYTrimPathSep(line);
+ if (LYLastPathSep(line) == NULL) {
+ FREE(line);
+ return 0;
+ }
+
+ buffer = build_command(line, dirName, arg);
+
+ if (buffer != 0) {
+ if ((int) strlen(buffer) < LYcolLimit - 14) {
+ HTSprintf0(&tmpbuf, gettext("Executing %s "), buffer);
+ } else {
+ HTSprintf0(&tmpbuf,
+ gettext("Executing system command. This might take a while."));
+ }
+ _statusline(tmpbuf);
+ stop_curses();
+ printf("%s\r\n", tmpbuf);
+ LYSystem(buffer);
+#ifdef VMS
+ HadVMSInterrupt = FALSE;
+#endif /* VMS */
+ start_curses();
+ LYforce_no_cache = TRUE;
+ }
+ }
+
+ FREE(dirName);
+ FREE(tmpbuf);
+ FREE(buffer);
+ FREE(line);
+ FREE(tp);
+ if (do_pop_doc)
+ LYpop(doc);
+ return 0;
+}
+
+/*
+ * Provide a menu of file management options.
+ */
+int dired_options(DocInfo *doc, char **newfile)
+{
+ static char tempfile[LY_MAXPATH];
+ const char *my_suffix;
+ char *path = NULL;
+ char *dir;
+ lynx_list_item_type *nxt;
+ struct stat dir_info;
+ FILE *fp0;
+ char *dir_url;
+ char *path_url;
+ BOOLEAN nothing_tagged;
+ int count;
+ struct dired_menu *mp;
+ char buf[2048];
+
+ if ((fp0 = InternalPageFP(tempfile, FALSE)) == 0)
+ return (0);
+
+ /*
+ * Make the tempfile a URL.
+ */
+ LYLocalFileToURL(newfile, tempfile);
+ LYRegisterUIPage(*newfile, UIP_DIRED_MENU);
+
+ if (doc->link > -1 && doc->link < (nlinks + 1)) {
+ path = HTfullURL_toFile(links[doc->link].lname);
+ LYTrimPathSep(path);
+
+ if (!ok_lstat(path, &dir_info)) {
+ LYCloseTempFP(fp0);
+ FREE(path);
+ return 0;
+ }
+
+ } else {
+ StrAllocCopy(path, "");
+ memset(&dir_info, 0, sizeof(dir_info));
+ }
+
+ dir = HTfullURL_toFile(doc->address);
+ LYTrimPathSep(dir);
+
+ nothing_tagged = (BOOL) (HTList_isEmpty(tagged));
+
+ BeginInternalPage(fp0, DIRED_MENU_TITLE, DIRED_MENU_HELP);
+
+ fprintf(fp0, "<em>%s</em> %s<br>\n", gettext("Current directory:"), dir);
+
+ if (nothing_tagged) {
+ fprintf(fp0, "<em>%s</em> ", gettext("Current selection:"));
+ if (strlen(path)) {
+ fprintf(fp0, "%s<p>\n", path);
+ } else {
+ fprintf(fp0, "%s.<p>\n", gettext("Nothing currently selected."));
+ }
+ } else {
+ /*
+ * Write out number of tagged items, and names of first few of them
+ * relative to current (in the DIRED sense) directory.
+ */
+ int n = HTList_count(tagged);
+ char *cp1 = NULL;
+ char *cd = NULL;
+ int i, m;
+
+#define NUM_TAGS_TO_WRITE 10
+ fprintf(fp0, "<em>%s</em> %d %s",
+ gettext("Current selection:"),
+ n, ((n == 1)
+ ? gettext("tagged item:")
+ : gettext("tagged items:")));
+ StrAllocCopy(cd, doc->address);
+ HTUnEscapeSome(cd, "/");
+ LYAddHtmlSep(&cd);
+ m = (n < NUM_TAGS_TO_WRITE) ? n : NUM_TAGS_TO_WRITE;
+ for (i = 1; i <= m; i++) {
+ cp1 = HTRelative((char *) HTList_objectAt(tagged, i - 1),
+ (*cd ? cd : "file://localhost"));
+ HTUnEscape(cp1);
+ LYEntify(&cp1, TRUE); /* _should_ do this everywhere... */
+ fprintf(fp0, "%s<br>\n&nbsp;&nbsp;&nbsp;%s",
+ (i == 1 ? "" : " ,"), cp1);
+ FREE(cp1);
+ }
+ if (n > m) {
+ fprintf(fp0, " , ...");
+ }
+ fprintf(fp0, "<p>\n");
+ FREE(cd);
+ }
+
+ /*
+ * If menu_head is NULL then use defaults and link them together now.
+ */
+ if (menu_head == NULL) {
+ for (mp = defmenu; GetDiredHref(mp) != NULL; mp++)
+ mp->next = (mp + 1);
+ (--mp)->next = NULL;
+ menu_head = defmenu;
+ }
+
+ for (mp = menu_head; mp != NULL; mp = mp->next) {
+ if (mp->cond != DE_TAG && !nothing_tagged)
+ continue;
+ if (mp->cond == DE_TAG && nothing_tagged)
+ continue;
+ if (mp->cond == DE_DIR &&
+ (!*path || !S_ISDIR(dir_info.st_mode)))
+ continue;
+ if (mp->cond == DE_FILE &&
+ (!*path || !S_ISREG(dir_info.st_mode)))
+ continue;
+#ifdef S_IFLNK
+ if (mp->cond == DE_SYMLINK &&
+ (!*path || !S_ISLNK(dir_info.st_mode)))
+ continue;
+#endif
+ my_suffix = GetDiredSuffix(mp);
+ if (non_empty(my_suffix) &&
+ (strlen(path) < strlen(my_suffix) ||
+ strcmp(my_suffix, &path[(strlen(path) - strlen(my_suffix))]) != 0))
+ continue;
+ dir_url = HTEscape(dir, URL_PATH);
+ path_url = HTEscape(path, URL_PATH);
+ fprintf(fp0, "<a href=\"%s",
+ render_item(GetDiredHref(mp),
+ path_url, dir_url, buf, sizeof(buf), YES));
+ fprintf(fp0, "\">%s</a> ",
+ render_item(GetDiredLink(mp),
+ path, dir, buf, sizeof(buf), NO));
+ fprintf(fp0, "%s<br>\n",
+ render_item(GetDiredRest(mp),
+ path, dir, buf, sizeof(buf), NO));
+ FREE(dir_url);
+ FREE(path_url);
+ }
+ FREE(path);
+
+ if (uploaders != NULL) {
+ fprintf(fp0, "<p>Upload to current directory:<p>\n");
+ for (count = 0, nxt = uploaders;
+ nxt != NULL;
+ nxt = nxt->next, count++) {
+ fprintf(fp0,
+ "<a href=\"LYNXDIRED://UPLOAD=%d/TO=%s\"> %s </a><br>\n",
+ count, dir, nxt->name);
+ }
+ }
+ FREE(dir);
+
+ EndInternalPage(fp0);
+ LYCloseTempFP(fp0);
+
+ LYforce_no_cache = TRUE;
+
+ return (0);
+}
+
+/*
+ * Check DIRED filename, return true on success
+ */
+static int get_filename(const char *prompt,
+ bstring **bufp)
+{
+ char *cp;
+
+ _statusline(prompt);
+
+ (void) LYgetBString(bufp, FALSE, 0, NORECALL);
+ if (strstr((*bufp)->str, "../") != NULL) {
+ HTAlert(gettext("Illegal filename; request ignored."));
+ return FALSE;
+ } else if (no_dotfiles || !show_dotfiles) {
+ cp = LYLastPathSep((*bufp)->str); /* find last slash */
+ if (cp)
+ cp += 1;
+ else
+ cp = (*bufp)->str;
+ if (*cp == '.') {
+ HTAlert(gettext("Illegal filename; request ignored."));
+ return FALSE;
+ }
+ }
+ return !isBEmpty((*bufp));
+}
+
+#ifdef OK_INSTALL
+
+#define LYEXECV_MAX_ARGC 15
+/* these are quasi-constant once they have been allocated: */
+static char **install_argp = NULL; /* args for execv install */
+static char *install_path = NULL; /* auxiliary */
+
+#ifdef LY_FIND_LEAKS
+static void clear_install_path(void)
+{
+ FREE(install_argp);
+ FREE(install_path);
+}
+#endif /* LY_FIND_LEAKS */
+
+/*
+ * Fill in args array for execv (or execvp etc.) call, after first allocating
+ * it if necessary. No fancy parsing, cmd_args is just split at spaces. Leave
+ * room for reserve additional args to be added by caller.
+ *
+ * On success *argvp points to new args vector, *pathp is auxiliary. On
+ * success returns index of next argument, else -1. This is generic enough
+ * that it could be used for other calls than install, except the atexit call.
+ * Go through this trouble for install because INSTALL_ARGS may be significant,
+ * and someone may configure it with more than one significant flags. - kw
+ */
+static int fill_argv_for_execv(char ***argvp,
+ char **pathp,
+ char *cmd_path,
+ const char *cmd_args,
+ int reserve)
+{
+ int n = 0;
+
+ char **args;
+ char *cp;
+
+ if (*argvp == NULL) {
+ *argvp = typecallocn(char *, LYEXECV_MAX_ARGC + 1);
+
+ if (!*argvp)
+ return (-1);
+#ifdef LY_FIND_LEAKS
+ atexit(clear_install_path);
+#endif
+ }
+ args = *argvp;
+ args[n++] = cmd_path;
+ if (cmd_args) {
+ StrAllocCopy(*pathp, cmd_args);
+ cp = strtok(*pathp, " ");
+ if (cp) {
+ while (cp && (n < LYEXECV_MAX_ARGC - reserve)) {
+ args[n++] = cp;
+ cp = strtok(NULL, " ");
+ }
+ if (cp && (n >= LYEXECV_MAX_ARGC - reserve)) {
+ CTRACE((tfp, "Too many args for '%s' in '%s'!\n",
+ NONNULL(cmd_path), cmd_args));
+ return (-1);
+ }
+ } else {
+ args[n++] = *pathp;
+ }
+ }
+ args[n] = (char *) 0;
+ return (n);
+}
+
+/*
+ * Install the specified file or directory.
+ */
+BOOLEAN local_install(char *destpath,
+ char *srcpath,
+ char **newpath)
+{
+ char *tmpbuf = NULL;
+ static char savepath[DIRED_MAXBUF]; /* This will be the link that
+
+ is to be installed. */
+ struct stat dir_info;
+ char **args;
+ HTList *tag;
+ char *cp = NULL;
+ char *tmpdest = NULL;
+ int count = 0;
+ int n = 0; /* indices into 'args[]' */
+ static int src = -1;
+ const char *program;
+
+ if ((program = HTGetProgramPath(ppINSTALL)) == NULL) {
+ HTAlert(gettext("Install in the selected directory not permitted."));
+ return 0;
+ }
+
+ /*
+ * Determine the status of the selected item.
+ */
+ if (srcpath) {
+ srcpath = strip_trailing_slash(srcpath);
+ if (is_url(srcpath)) {
+ char *local_src = HTfullURL_toFile(srcpath);
+
+ if (!ok_localname(savepath, local_src)) {
+ FREE(local_src);
+ return 0;
+ }
+ FREE(local_src);
+ } else if (!HTList_isEmpty(tagged) &&
+ srcpath[0] == '\0') {
+ savepath[0] = '\0'; /* will always use tagged list - kw */
+ } else if (!ok_localname(savepath, srcpath)) {
+ return 0;
+ }
+ LYforce_no_cache = TRUE;
+ LYLocalFileToURL(newpath, Home_Dir());
+ LYAddHtmlSep(newpath);
+ StrAllocCat(*newpath, INSTALLDIRS_FILE);
+ LYRegisterUIPage(*newpath, UIP_INSTALL);
+ return 0;
+ }
+
+ /* deal with ~/ or /~/ at the beginning - kw */
+ if (LYIsTilde(destpath[0]) &&
+ (LYIsPathSep(destpath[1]) || destpath[1] == '\0')) {
+ cp = &destpath[1];
+ } else if (LYIsPathSep(destpath[0]) && LYIsTilde(destpath[1]) &&
+ (LYIsPathSep(destpath[2]) || destpath[2] == '\0')) {
+ cp = &destpath[2];
+ }
+ if (cp) {
+ /* If found, allocate new string, make destpath point to it - kw */
+ StrAllocCopy(tmpdest, Home_Dir());
+ if (cp[0] && cp[1]) {
+ LYAddPathSep(&tmpdest);
+ StrAllocCat(tmpdest, cp + 1);
+ }
+ destpath = tmpdest;
+ }
+
+ destpath = strip_trailing_slash(destpath);
+
+ if (!ok_stat(destpath, &dir_info)) {
+ FREE(tmpdest);
+ return 0;
+ } else if (!S_ISDIR(dir_info.st_mode)) {
+ HTAlert(gettext("The selected item is not a directory! Request ignored."));
+ FREE(tmpdest);
+ return 0;
+ } else if (0 /*directory not writable */ ) {
+ HTAlert(gettext("Install in the selected directory not permitted."));
+ FREE(tmpdest);
+ return 0;
+ }
+
+ statusline(gettext("Just a moment, ..."));
+
+ /* fill in the fixed args, if not already done - kw */
+ if (src > 0 && install_argp) {
+ n = src;
+ n++;
+ } else {
+ n = fill_argv_for_execv(&install_argp, &install_path,
+ "install",
+#ifdef INSTALL_ARGS
+ INSTALL_ARGS,
+#else
+ NULL,
+#endif /* INSTALL_ARGS */
+ 2);
+ if (n <= 0) {
+ src = 0;
+ HTAlert(gettext("Error building install args"));
+ FREE(tmpdest);
+ return 0;
+ }
+ src = n++;
+ }
+ args = install_argp;
+
+ args[n++] = destpath;
+ args[n] = (char *) 0;
+ tag = tagged;
+
+ if (HTList_isEmpty(tagged)) {
+ /* simplistic detection of identical src and dest - kw */
+ if (!strcmp(savepath, destpath)) {
+ HTUserMsg2(gettext("Source and target are the same: %s"),
+ savepath);
+ FREE(tmpdest);
+ return (-1); /* don't do it */
+ } else if (!StrNCmp(savepath, destpath, strlen(destpath)) &&
+ LYIsPathSep(savepath[strlen(destpath)]) &&
+ LYLastPathSep(savepath + strlen(destpath) + 1) == 0) {
+ HTUserMsg2(gettext("Already in target directory: %s"),
+ savepath);
+ FREE(tmpdest);
+ return 0; /* don't do it */
+ }
+ args[src] = savepath;
+ HTSprintf0(&tmpbuf, "install %s in %s", savepath, destpath);
+ if (LYExecv(program, args, tmpbuf) <= 0) {
+ FREE(tmpbuf);
+ FREE(tmpdest);
+ return (-1);
+ }
+ count++;
+ } else {
+ char *name;
+
+ HTSprintf0(&tmpbuf, "install in %s", destpath);
+ while ((name = (char *) HTList_nextObject(tag))) {
+ int err;
+
+ args[src] = HTfullURL_toFile(name);
+
+ /* simplistic detection of identical src and dest - kw */
+ if (!strcmp(args[src], destpath)) {
+ HTUserMsg2(gettext("Source and target are the same: %s"),
+ args[src]);
+ FREE(args[src]);
+ continue; /* skip this source file */
+ } else if (!StrNCmp(args[src], destpath, strlen(destpath)) &&
+ LYIsPathSep(args[src][strlen(destpath)]) &&
+ LYLastPathSep(args[src] + strlen(destpath) + 1) == 0) {
+ HTUserMsg2(gettext("Already in target directory: %s"),
+ args[src]);
+ FREE(args[src]);
+ continue; /* skip this source file */
+ }
+ err = (LYExecv(program, args, tmpbuf) <= 0);
+ FREE(args[src]);
+ if (err) {
+ FREE(tmpbuf);
+ FREE(tmpdest);
+ return ((count == 0) ? -1 : count);
+ }
+ count++;
+ }
+ clear_tags();
+ }
+ FREE(tmpbuf);
+ FREE(tmpdest);
+ HTInfoMsg(gettext("Installation complete"));
+ return count;
+}
+#endif /* OK_INSTALL */
+
+/*
+ * Clear DIRED tags.
+ */
+void clear_tags(void)
+{
+ char *cp = NULL;
+
+ while ((cp = (char *) HTList_removeLastObject(tagged)) != NULL) {
+ FREE(cp);
+ }
+ if (HTList_isEmpty(tagged))
+ FREE(tagged);
+}
+
+/*
+ * Handle DIRED menu item.
+ */
+void add_menu_item(char *str)
+{
+ struct dired_menu *tmp, *mp;
+ char *cp;
+ BOOL used = FALSE;
+
+ /*
+ * First custom menu definition causes entire default menu to be discarded.
+ */
+ if (menu_head == defmenu)
+ menu_head = NULL;
+
+ tmp = typecalloc(struct dired_menu);
+
+ if (tmp == NULL)
+ outofmem(__FILE__, "add_menu_item");
+
+ /*
+ * Conditional on tagged != NULL ?
+ */
+ if ((cp = StrChr(str, ':')) != 0) {
+ *cp++ = '\0';
+ if (strcasecomp(str, "tag") == 0) {
+ tmp->cond = DE_TAG;
+ } else if (strcasecomp(str, "dir") == 0) {
+ tmp->cond = DE_DIR;
+ } else if (strcasecomp(str, "file") == 0) {
+ tmp->cond = DE_FILE;
+#ifdef S_IFLNK
+ } else if (strcasecomp(str, "link") == 0) {
+ tmp->cond = DE_SYMLINK;
+#endif /* S_IFLNK */
+ }
+
+ /*
+ * Conditional on matching suffix.
+ */
+ str = cp;
+ if ((cp = StrChr(str, ':')) != 0) {
+ *cp++ = '\0';
+ StrAllocCopy(tmp->sfx, str);
+
+ str = cp;
+ if ((cp = StrChr(str, ':')) != 0) {
+ *cp++ = '\0';
+ StrAllocCopy(tmp->link, str);
+
+ str = cp;
+ if ((cp = StrChr(str, ':')) != 0) {
+ *cp++ = '\0';
+ StrAllocCopy(tmp->rest, str);
+
+ StrAllocCopy(tmp->href, cp);
+
+ if (menu_head) {
+ for (mp = menu_head;
+ mp && mp->next != NULL;
+ mp = mp->next) {
+ ;
+ }
+ if (mp != NULL) {
+ mp->next = tmp;
+ used = TRUE;
+ }
+ } else {
+ menu_head = tmp;
+ used = TRUE;
+ }
+ }
+ }
+ }
+ }
+ if (!used)
+ FREE(tmp);
+}
+
+void reset_dired_menu(void)
+{
+ if (menu_head != defmenu) {
+ struct dired_menu *mp, *mp_next = NULL;
+
+ for (mp = menu_head; mp != NULL; mp = mp_next) {
+ FREE(mp->sfx);
+ FREE(mp->link);
+ FREE(mp->rest);
+ FREE(mp->href);
+ mp_next = mp->next;
+ FREE(mp);
+ }
+ menu_head = NULL;
+ }
+}
+
+/*
+ * Create URL for DIRED HREF value.
+ */
+static char *render_item(const char *s,
+ const char *path,
+ const char *dir,
+ char *buf,
+ size_t bufsize,
+ int url_syntax)
+{
+ const char *cp;
+ char *bp;
+ char overrun = '\0';
+ char *taglist = NULL;
+
+#define BP_INC (bp>buf+bufsize-2 ? &overrun : bp++)
+ /* Buffer overrun could happen for very long
+ tag list, if %l or %t are used */
+ bp = buf;
+ while (*s && !overrun) {
+ if (*s == '%') {
+ s++;
+ switch (*s) {
+ case '%':
+ *BP_INC = '%';
+ break;
+ case 'p':
+ cp = path;
+ if (!LYIsHtmlSep(*cp))
+ *BP_INC = '/';
+ while (*cp)
+ *BP_INC = *cp++;
+ break;
+ case 'd':
+ cp = dir;
+ if (!LYIsHtmlSep(*cp))
+ *BP_INC = '/';
+ while (*cp)
+ *BP_INC = *cp++;
+ break;
+ case 'f':
+ cp = LYLastPathSep(path);
+ if (cp)
+ cp++;
+ else
+ cp = path;
+ while (*cp)
+ *BP_INC = *cp++;
+ break;
+ case 'l':
+ case 't':
+ if (!HTList_isEmpty(tagged)) {
+ HTList *cur = tagged;
+ char *name;
+
+ while (!overrun &&
+ (name = (char *) HTList_nextObject(cur)) != NULL) {
+ if (*s == 'l' && (cp = strrchr(name, '/')))
+ cp++;
+ else
+ cp = name;
+ StrAllocCat(taglist, cp);
+ StrAllocCat(taglist, " "); /* should this be %20? */
+ }
+ }
+ if (taglist) {
+ /* could HTUnescape here... */
+ cp = taglist;
+ while (*cp)
+ *BP_INC = *cp++;
+ FREE(taglist);
+ }
+ break;
+ default:
+ *BP_INC = '%';
+ *BP_INC = *s;
+ break;
+ }
+ } else {
+ /*
+ * Other chars come from the lynx.cfg or the default. Let's assume
+ * there isn't anything weird there that needs escaping.
+ */
+ *BP_INC = *s;
+ }
+ s++;
+ }
+ if (overrun & url_syntax) {
+ HTAlert(gettext("Temporary URL or list would be too long."));
+ bp = buf; /* set to start, will return empty string as URL */
+ }
+ *bp = '\0';
+ return buf;
+}
+
+#endif /* DIRED_SUPPORT */
diff --git a/src/LYLocal.h b/src/LYLocal.h
new file mode 100644
index 0000000..9a7fe24
--- /dev/null
+++ b/src/LYLocal.h
@@ -0,0 +1,36 @@
+#ifndef LYLOCAL_H
+#define LYLOCAL_H
+
+#include <HTUtils.h>
+#include <LYStructs.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#ifdef DIRED_SUPPORT
+/* Special return code for LYMainLoop.c */
+#define PERMIT_FORM_RESULT (-99)
+ extern int local_create(DocInfo *doc);
+ extern int local_modify(DocInfo *doc, char **newpath);
+ extern int local_remove(DocInfo *doc);
+
+#ifdef OK_INSTALL
+ extern BOOLEAN local_install(char *destpath, char *srcpath, char **newpath);
+#endif
+
+/* MainLoop needs to know about this one for atexit cleanup */
+ extern void clear_tags(void);
+
+ extern int dired_options(DocInfo *doc, char **newfile);
+ extern int local_dired(DocInfo *doc);
+ extern void add_menu_item(char *str);
+ extern void reset_dired_menu(void);
+ extern void showtags(HTList *tag);
+ extern void tagflag(int flag, int cur);
+
+#endif /* DIRED_SUPPORT */
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* LYLOCAL_H */
diff --git a/src/LYMail.c b/src/LYMail.c
new file mode 100644
index 0000000..1443f24
--- /dev/null
+++ b/src/LYMail.c
@@ -0,0 +1,1774 @@
+/*
+ * $LynxId: LYMail.c,v 1.100 2020/01/21 21:33:27 tom Exp $
+ */
+#include <HTUtils.h>
+#include <HTParse.h>
+#include <LYGlobalDefs.h>
+#include <HTAlert.h>
+#include <LYCurses.h>
+#include <LYSignal.h>
+#include <LYUtils.h>
+#include <LYClean.h>
+#include <LYStrings.h>
+#include <GridText.h>
+#include <LYMail.h>
+#include <LYEdit.h>
+#include <LYCharSets.h> /* to get current charset for mail header */
+
+#include <LYLeaks.h>
+
+#define MAX_SUBJECT 70
+
+BOOLEAN term_letter; /* Global variable for async i/o. */
+
+static void terminate_letter(int sig GCC_UNUSED)
+{
+ term_letter = TRUE;
+ /* Reassert the AST */
+ signal(SIGINT, terminate_letter);
+#if USE_VMS_MAILER || defined(PDCURSES)
+ /*
+ * Refresh the screen to get rid of the "interrupt" message.
+ */
+ if (!dump_output_immediately) {
+ lynx_force_repaint();
+ LYrefresh();
+ }
+#endif /* VMS */
+}
+
+/* HTUnEscape with control-code nuking */
+static void SafeHTUnEscape(char *string)
+{
+ int i;
+ int flg = FALSE;
+
+ HTUnEscape(string);
+ for (i = 0; string[i] != '\0'; i++) {
+ /* FIXME: this is no longer explicitly 7-bit ASCII,
+ but are there portability problems? */
+ if ((!LYIsASCII(string[i])) || !isprint(UCH(string[i]))) {
+ string[i] = '?';
+ flg = TRUE;
+ }
+ }
+ if (flg)
+ HTAlert(MAILTO_SQUASH_CTL);
+}
+
+static void remove_tildes(char *string)
+{
+ /*
+ * Change the first character to a space if it is a '~'.
+ */
+ if (*string == '~')
+ *string = ' ';
+}
+
+static void comma_append(char **dst,
+ char *src)
+{
+ if (*src) {
+ while (*src == ',' || isspace(UCH(*src)))
+ src++;
+ if (*src) {
+ if (isEmpty(*dst)) {
+ StrAllocCopy(*dst, src);
+ } else {
+ StrAllocCat(*dst, ",");
+ StrAllocCat(*dst, src);
+ }
+ }
+ }
+}
+
+static void extract_field(char **dst,
+ char *src,
+ const char *keyword)
+{
+ int len = (int) strlen(keyword);
+ char *cp, *cp1;
+
+ cp = (src + 1);
+ while (*cp != '\0') {
+ if ((*(cp - 1) == '?' || *(cp - 1) == '&') &&
+ !strncasecomp(cp, keyword, len)) {
+ cp += len;
+ if ((cp1 = StrChr(cp, '&')) != NULL) {
+ *cp1 = '\0';
+ }
+ comma_append(dst, cp);
+ if (cp1) {
+ *cp1 = '&';
+ cp = cp1;
+ cp1 = NULL;
+ } else {
+ break;
+ }
+ }
+ cp++;
+ }
+ CTRACE((tfp, "extract_field(%s) = '%s'\n", keyword, *dst));
+}
+
+/*
+ * Seek and handle a subject=foo. - FM
+ */
+static void extract_subject(char *dst,
+ char *src)
+{
+ const char *keyword = "subject=";
+ int len = (int) strlen(keyword);
+ char *cp, *cp1;
+
+ cp = (src + 1);
+ while (*cp != '\0') {
+ if ((*(cp - 1) == '?' || *(cp - 1) == '&') &&
+ !strncasecomp(cp, keyword, len))
+ break;
+ cp++;
+ }
+ if (*cp) {
+ cp += len;
+ if ((cp1 = StrChr(cp, '&')) != NULL) {
+ *cp1 = '\0';
+ }
+ if (*cp) {
+ LYStrNCpy(dst, cp, MAX_SUBJECT);
+ SafeHTUnEscape(dst);
+ }
+ if (cp1) {
+ *cp1 = '&';
+ cp1 = NULL;
+ }
+ }
+ CTRACE((tfp, "extract_subject(%s) = '%s'\n", keyword, NONNULL(dst)));
+}
+
+/*
+ * Seek and handle body=foo fields. - FM
+ */
+static void extract_body(char **dst,
+ char *src)
+{
+ const char *keyword = "body=";
+ int len = (int) strlen(keyword);
+ int i;
+ char *cp, *cp0, *cp1, *temp = 0;
+
+ cp = (src + 1);
+ while (*cp != '\0') {
+ if ((*(cp - 1) == '?' || *(cp - 1) == '&') &&
+ !strncasecomp(cp, keyword, len)) {
+ cp += len;
+ if ((cp1 = StrChr(cp, '&')) != NULL) {
+ *cp1 = '\0';
+ }
+ if (*cp) {
+ /*
+ * Break up the value into lines with a maximum length of 78.
+ * - FM
+ */
+ StrAllocCopy(temp, cp);
+ HTUnEscape(temp);
+ cp0 = temp;
+ while ((cp = StrChr(cp0, '\n')) != NULL) {
+ *cp = '\0';
+ if (cp > cp0) {
+ if (*(cp - 1) == '\r') {
+ *(cp - 1) = '\0';
+ }
+ }
+ i = 0;
+ len = (int) strlen(cp0);
+ while (len > 78) {
+ HTSprintf(dst, "%.78s\n", &cp0[i]);
+ i += 78;
+ len = (int) strlen(&cp0[i]);
+ }
+ HTSprintf(dst, "%s\n", &cp0[i]);
+ cp0 = (cp + 1);
+ }
+ i = 0;
+ len = (int) strlen(cp0);
+ while (len > 78) {
+ HTSprintf(dst, "%.78s\n", &cp0[i]);
+ i += 78;
+ len = (int) strlen(&cp0[i]);
+ }
+ if (len) {
+ HTSprintf(dst, "%s\n", &cp0[i]);
+ }
+ FREE(temp);
+ }
+ if (cp1) {
+ *cp1 = '&';
+ cp = cp1;
+ cp1 = NULL;
+ } else {
+ break;
+ }
+ }
+ cp++;
+ }
+ CTRACE((tfp, "extract_body(%s) = '%s'\n", keyword, NONNULL(*dst)));
+}
+
+/*
+ * Convert any Explorer semi-colon Internet address separators to commas - FM
+ */
+static BOOLEAN trim_comma(char *address)
+{
+ if (address[(strlen(address) - 1)] == ',')
+ address[(strlen(address) - 1)] = '\0';
+ return (BOOL) (*address == '\0');
+}
+
+/*
+ * Convert any Explorer semi-colon Internet address separators to commas - FM
+ */
+static BOOLEAN convert_explorer(char *address)
+{
+ char *cp = address;
+ char *cp0;
+ char *cp1;
+
+ while ((cp1 = StrChr(cp, '@')) != NULL) {
+ cp1++;
+ if ((cp0 = StrChr(cp1, ';')) != NULL) {
+ *cp0 = ',';
+ cp1 = cp0 + 1;
+ }
+ cp = cp1;
+ }
+ return trim_comma(address);
+}
+
+/*
+ * reply_by_mail() prompts line-by-line for header information, allowing
+ * scrolling of the screen.
+ */
+static int header_prompt(const char *label,
+ char **result,
+ unsigned limit)
+{
+ char buffer[LINESIZE];
+ int ok;
+
+ if (*result != 0) {
+ LYaddstr(CTRL_U_TO_ERASE);
+ LYStrNCpy(buffer, *result, sizeof(buffer) - 1);
+ } else
+ *buffer = 0;
+
+ if (limit > sizeof(buffer))
+ limit = sizeof(buffer);
+
+ LYaddstr(gettext(label));
+ LYaddstr(": ");
+ ok = (LYGetStr(buffer, FALSE, limit, NORECALL) >= 0
+ && !term_letter);
+ LYaddstr("\n");
+
+ if (ok) {
+ remove_tildes(buffer);
+ StrAllocCopy(*result, buffer);
+ }
+ term_letter = FALSE;
+ return ok;
+}
+
+static void show_addresses(char *addresses)
+{
+ char *cp = addresses;
+ char *cp1;
+
+ while ((cp1 = StrChr(cp, ',')) != NULL) {
+ *cp1 = '\0';
+ while (*cp == ' ')
+ cp++;
+ if (*cp) {
+ LYaddstr(cp);
+ LYaddstr(",\n ");
+ }
+ *cp1 = ',';
+ cp = (cp1 + 1);
+ }
+ if (*cp) {
+ LYaddstr(cp);
+ }
+}
+
+#if USE_BLAT_MAILER
+
+/*
+ * blat's options-file parser (see makeargv.cpp) treats backslash and double
+ * quote characters specially. lynx doesn't. Do a conversion as we write the
+ * option.
+ *
+ * Other quirks (reading blat 3.06):
+ * + Whitespace not in quotes terminates a line.
+ * + Blat allows a comment-character to terminate a line. By default, that
+ * is a semicolon.
+ *
+ * Given that, the simplest thing to do is to always quote the string, using
+ * escaping to handle special cases.
+ */
+static void blat_option(FILE *fp, const char *option, const char *value)
+{
+ if (non_empty(value)) {
+ char *result = malloc(strlen(option) + 4 + 4 * strlen(value));
+ char *working = result;
+
+ CTRACE((tfp, "blat_option(opt=\"%s\", value=\"%s\")\n", option, value));
+ sprintf(working, "%s \"", option);
+ working += strlen(working);
+
+ while (*value != '\0') {
+ unsigned ch = UCH(*value);
+
+ switch (ch) {
+ case '\\':
+ *working++ = '\\';
+ *working++ = '\\';
+ break;
+ case '"':
+ *working++ = '\\';
+ *working++ = '"';
+ break;
+ default:
+ if (ch < ' ' || ch > '~') {
+ sprintf(working, "\\%03o", ch);
+ } else {
+ *working++ = ch;
+ }
+ break;
+ }
+ ++value;
+ }
+ *working++ = '"';
+ *working++ = '\n';
+ *working = 0;
+
+ CTRACE((tfp, "->%s", result));
+ fputs(result, fp);
+ FREE(result);
+ }
+}
+
+/*
+syntax for blat 2.6.2:
+Blat <filename> -t <recipient> [optional switches (see below)]
+
+-bodyF <filename> : file with the message body
+-t <recipient> : recipient list (comma separated)
+-s <subj> : subject line
+-f <sender> : overrides the default sender address (must be known to server)
+-i <addr> : a 'From:' address, not necessarily known to the SMTP server.
+-c <recipient> : carbon copy recipient list (comma separated)
+-b <recipient> : blind carbon copy recipient list (comma separated)
+-help : displays the help message.
+-mime : MIME Quoted-Printable Content-Transfer-Encoding.
+-q : suppresses *all* output.
+-server <addr> : overrides the default SMTP server to be used.
+
+*/
+
+static char *blat_cmd(char *filename,
+ char *address,
+ char *subject,
+ char *ccaddr,
+ char *mail_addr)
+{
+ char *b_cmd = NULL;
+
+ if (mail_is_altblat) {
+ const char *format = "%s %s -t %s -s %s %s%s%s";
+
+ HTAddParam(&b_cmd, format, 1, ALTBLAT_MAIL);
+ HTAddParam(&b_cmd, format, 2, filename);
+ HTAddParam(&b_cmd, format, 3, address);
+ HTAddParam(&b_cmd, format, 4, subject);
+ HTAddToCmd(&b_cmd, format, 5, ALTBLAT_MAIL_FLAGS);
+ if (non_empty(ccaddr)) {
+ HTAddToCmd(&b_cmd, format, 6, " -c ");
+ HTAddParam(&b_cmd, format, 7, NonNull(ccaddr));
+ }
+ HTEndParam(&b_cmd, format, 8);
+
+ } else {
+
+ const char *format = "%s -of %s";
+ char bl_cmd_file[LY_MAXPATH];
+ FILE *fp;
+
+#ifdef __CYGWIN__
+ char dosname[LY_MAXPATH];
+
+#else
+ char *dosname;
+#endif
+
+ bl_cmd_file[0] = '\0';
+ if ((fp = LYOpenTemp(bl_cmd_file, ".blt", "w")) == NULL) {
+ HTAlert(FORM_MAILTO_FAILED);
+ return NULL;
+ }
+
+ HTAddParam(&b_cmd, format, 1, BLAT_MAIL);
+
+ ConvertToWin32Path(filename, dosname);
+ blat_option(fp, "-bodyF", dosname);
+ blat_option(fp, "-t", address);
+ blat_option(fp, "-s", subject);
+ blat_option(fp, "-f", mail_addr);
+ blat_option(fp, "-c", ccaddr);
+ LYCloseOutput(fp);
+
+ ConvertToWin32Path(bl_cmd_file, dosname);
+
+ HTAddParam(&b_cmd, format, 2, dosname);
+ HTEndParam(&b_cmd, format, 3);
+
+ }
+
+ return b_cmd;
+}
+
+#endif /* USE_BLAT_MAILER */
+
+#if USE_VMS_MAILER
+BOOLEAN LYMailPMDF(void)
+{
+ return (system_mail != 0)
+ ? !strncasecomp(system_mail, "PMDF SEND", 9)
+ : FALSE;
+}
+
+/*
+ * Add all of the people in the address field to the command
+ */
+static void vms_append_addrs(char **cmd, char *address, char *option)
+{
+ BOOLEAN first = TRUE;
+ char *cp;
+ char *address_ptr1;
+ char *address_ptr2;
+
+ address_ptr1 = address;
+ do {
+ if ((cp = StrChr(address_ptr1, ',')) != NULL) {
+ address_ptr2 = (cp + 1);
+ *cp = '\0';
+ } else {
+ address_ptr2 = NULL;
+ }
+
+ /*
+ * 4 letters is arbitrarily the smallest possible mail address, at
+ * least for lynx. That way extra spaces won't confuse the mailer and
+ * give a blank address.
+ */
+ if (strlen(address_ptr1) > 3) {
+ if (!first) {
+ StrAllocCat(*cmd, ",");
+ }
+ HTSprintf(cmd, mail_adrs, address_ptr1);
+ if (*option && LYMailPMDF())
+ StrAllocCat(*cmd, option);
+ first = FALSE;
+ }
+ address_ptr1 = address_ptr2;
+ } while (address_ptr1 != NULL);
+}
+
+static void remove_quotes(char *string)
+{
+ while (*string != 0) {
+ if (StrChr("\"&|", *string) != 0)
+ *string = ' ';
+ string++;
+ }
+}
+#else
+#if CAN_PIPE_TO_MAILER
+
+/*
+ * Open a pipe to the mailer
+ */
+FILE *LYPipeToMailer(void)
+{
+ char *buffer = NULL;
+ FILE *fp = NULL;
+
+ if (LYSystemMail()) {
+ HTSprintf0(&buffer, "%s %s", system_mail, system_mail_flags);
+ fp = popen(buffer, "w");
+ CTRACE((tfp, "popen(%s) %s\n", buffer, fp != 0 ? "OK" : "FAIL"));
+ FREE(buffer);
+ }
+ return fp;
+}
+#else /* DOS, Win32, etc. */
+
+int LYSendMailFile(char *the_address,
+ char *the_filename,
+ char *the_subject GCC_UNUSED,
+ char *the_ccaddr GCC_UNUSED,
+ char *message)
+{
+ char *cmd = NULL;
+ int code;
+
+ if (!LYSystemMail())
+ return 0;
+
+#if USE_BLAT_MAILER
+ if (mail_is_blat) {
+ cmd = blat_cmd(the_filename,
+ the_address,
+ the_subject,
+ the_ccaddr,
+ personal_mail_address);
+ } else
+#endif
+#ifdef __DJGPP__
+ if (LYGetEnv("SHELL")) {
+ extern char *shell;
+ const char *c_option;
+ const char *format = "%s %s %s -t %s -F %s";
+
+ if (dj_is_bash) {
+ c_option = "-c";
+ } else {
+ c_option = "/c";
+ }
+ HTAddParam(&cmd, format, 1, shell);
+ HTAddParam(&cmd, format, 2, c_option);
+ HTAddParam(&cmd, format, 3, system_mail);
+ HTAddParam(&cmd, format, 4, the_address);
+ HTAddParam(&cmd, format, 5, the_filename);
+ HTEndParam(&cmd, format, 6);
+ } else
+#endif /* __DJGPP__ */
+ {
+ const char *format = "%s -t %s -F %s";
+
+ HTAddParam(&cmd, format, 1, system_mail);
+ HTAddParam(&cmd, format, 2, the_address);
+ HTAddParam(&cmd, format, 3, the_filename);
+ HTEndParam(&cmd, format, 4);
+ }
+
+ stop_curses();
+ SetOutputMode(O_TEXT);
+ printf("%s\n\n$ %s\n\n%s",
+ *message ? message : gettext("Sending"),
+ cmd, PLEASE_WAIT);
+ code = LYSystem(cmd);
+ LYSleepMsg();
+ start_curses();
+ SetOutputMode(O_BINARY);
+
+ FREE(cmd);
+
+ return code;
+}
+#endif /* CAN_PIPE_TO_FILE */
+#endif /* USE_VMS_MAILER */
+
+/*
+ * mailform() sends form content to the mailto address(es). - FM
+ */
+void mailform(const char *mailto_address,
+ const char *mailto_subject,
+ const char *mailto_content,
+ const char *mailto_type)
+{
+ FILE *fd;
+ char *address = NULL;
+ char *ccaddr = NULL;
+ char *keywords = NULL;
+ char *cp = NULL;
+ char self[MAX_SUBJECT + 10];
+ char subject[MAX_SUBJECT + 10];
+ char *searchpart = NULL;
+ char buf[512];
+ int len, i;
+
+#if USE_VMS_MAILER
+ static char *cmd;
+ char *command = NULL;
+ BOOLEAN isPMDF = LYMailPMDF();
+ char hdrfile[LY_MAXPATH];
+#endif
+#if !CAN_PIPE_TO_MAILER
+ char my_tmpfile[LY_MAXPATH];
+#endif
+
+ CTRACE((tfp, "mailto_address: \"%s\"\n", NONNULL(mailto_address)));
+ CTRACE((tfp, "mailto_subject: \"%s\"\n", NONNULL(mailto_subject)));
+ CTRACE((tfp, "mailto_content: \"%s\"\n", NONNULL(mailto_content)));
+ CTRACE((tfp, "mailto_type: \"%s\"\n", NONNULL(mailto_type)));
+
+ if (!LYSystemMail())
+ return;
+
+ if (!mailto_address || !mailto_content) {
+ HTAlert(BAD_FORM_MAILTO);
+ return;
+ }
+ subject[0] = '\0';
+ self[0] = '\0';
+
+ if ((cp = StrChr(mailto_address, '\n')) != NULL)
+ *cp = '\0';
+ StrAllocCopy(address, mailto_address);
+
+ /*
+ * Check for a ?searchpart. - FM
+ */
+ if ((cp = StrChr(address, '?')) != NULL) {
+ StrAllocCopy(searchpart, cp);
+ *cp = '\0';
+ cp = (searchpart + 1);
+ if (*cp != '\0') {
+ /*
+ * Seek and handle a subject=foo. - FM
+ */
+ extract_subject(subject, searchpart);
+
+ /*
+ * Seek and handle to=address(es) fields. Appends to address. -
+ * FM
+ */
+ extract_field(&address, searchpart, "to=");
+
+ /*
+ * Seek and handle cc=address(es) fields. Excludes Bcc=address(es)
+ * as unsafe. We may append our own cc (below) as a list for the
+ * actual mailing. - FM
+ */
+ extract_field(&ccaddr, searchpart, "cc=");
+
+ /*
+ * Seek and handle keywords=term(s) fields. - FM
+ */
+ extract_field(&keywords, searchpart, "keywords=");
+
+ if (keywords != NULL) {
+ if (*keywords != '\0') {
+ SafeHTUnEscape(keywords);
+ } else {
+ FREE(keywords);
+ }
+ }
+
+ FREE(searchpart);
+ }
+ }
+
+ if (convert_explorer(address)) {
+ HTAlert(BAD_FORM_MAILTO);
+ goto cleanup;
+ }
+ if (ccaddr != NULL) {
+ if (convert_explorer(ccaddr)) {
+ FREE(ccaddr);
+ }
+ }
+
+ /*
+ * Unescape the address and ccaddr fields. - FM
+ */
+ SafeHTUnEscape(address);
+ if (ccaddr != NULL) {
+ SafeHTUnEscape(ccaddr);
+ }
+
+ /*
+ * Allow user to edit the default Subject - FM
+ */
+ if (subject[0] == '\0') {
+ if (non_empty(mailto_subject)) {
+ LYStrNCpy(subject, mailto_subject, MAX_SUBJECT);
+ } else {
+ sprintf(subject, "mailto:%.63s", address);
+ }
+ }
+ _statusline(SUBJECT_PROMPT);
+ if (LYGetStr(subject, FALSE, MAX_SUBJECT, NORECALL) < 0) {
+ /*
+ * User cancelled via ^G. - FM
+ */
+ HTInfoMsg(FORM_MAILTO_CANCELLED);
+ goto cleanup;
+ }
+
+ /*
+ * Allow user to specify a self copy via a CC: entry, if permitted. - FM
+ */
+ if (!LYNoCc) {
+ sprintf(self, "%.*s", MAX_SUBJECT,
+ isEmpty(personal_mail_address) ? "" : personal_mail_address);
+ _statusline("Cc: ");
+ if (LYGetStr(self, FALSE, MAX_SUBJECT, NORECALL) < 0) {
+ /*
+ * User cancelled via ^G. - FM
+ */
+ HTInfoMsg(FORM_MAILTO_CANCELLED);
+ goto cleanup;
+ }
+ remove_tildes(self);
+ if (ccaddr == NULL) {
+ StrAllocCopy(ccaddr, self);
+ } else {
+ StrAllocCat(ccaddr, ",");
+ StrAllocCat(ccaddr, self);
+ }
+ }
+#if CAN_PIPE_TO_MAILER
+ if ((fd = LYPipeToMailer()) == 0) {
+ HTAlert(FORM_MAILTO_FAILED);
+ goto cleanup;
+ }
+
+ if (non_empty(mailto_type)) {
+ fprintf(fd, "Mime-Version: 1.0\n");
+ fprintf(fd, "Content-Type: %s\n", mailto_type);
+ }
+ fprintf(fd, "To: %s\n", address);
+ if (non_empty(personal_mail_address))
+ fprintf(fd, "From: %s\n", personal_mail_address);
+ if (non_empty(ccaddr))
+ fprintf(fd, "Cc: %s\n", ccaddr);
+ fprintf(fd, "Subject: %s\n\n", subject);
+ if (non_empty(keywords))
+ fprintf(fd, "Keywords: %s\n", keywords);
+ _statusline(SENDING_FORM_CONTENT);
+#else /* e.g., VMS, DOS */
+ if ((fd = LYOpenTemp(my_tmpfile, ".txt", "w")) == NULL) {
+ HTAlert(FORM_MAILTO_FAILED);
+ goto cleanup;
+ }
+#if USE_VMS_MAILER
+ if (isPMDF) {
+ FILE *hfd;
+
+ if ((hfd = LYOpenTemp(hdrfile, ".txt", "w")) == NULL) {
+ HTAlert(FORM_MAILTO_FAILED);
+ LYCloseTempFP(fd);
+ goto cleanup;
+ }
+ if (non_empty(mailto_type)) {
+ fprintf(hfd, "Mime-Version: 1.0\n");
+ fprintf(hfd, "Content-Type: %s\n", mailto_type);
+ if (non_empty(personal_mail_address))
+ fprintf(hfd, "From: %s\n", personal_mail_address);
+ }
+ /*
+ * For PMDF, put any keywords and the subject in the header file and
+ * close it. - FM
+ */
+ if (non_empty(keywords)) {
+ fprintf(hfd, "Keywords: %s\n", keywords);
+ }
+ fprintf(hfd, "Subject: %s\n\n", subject);
+ LYCloseTempFP(hfd);
+ } else if (mailto_type &&
+ !strncasecomp(mailto_type, "multipart/form-data", 19)) {
+ /*
+ * Ugh! There's no good way to include headers while we're still using
+ * "generic" VMS MAIL, so we'll put this in the body of the message. -
+ * FM
+ */
+ fprintf(fd, "X-Content-Type: %s\n\n", mailto_type);
+ }
+#else /* !VMS (DOS) */
+#if USE_BLAT_MAILER
+ if (mail_is_blat) {
+ if (strlen(subject) > MAX_SUBJECT)
+ subject[MAX_SUBJECT] = '\0';
+ } else
+#endif
+ {
+ if (non_empty(mailto_type)) {
+ fprintf(fd, "Mime-Version: 1.0\n");
+ fprintf(fd, "Content-Type: %s\n", mailto_type);
+ }
+ fprintf(fd, "To: %s\n", address);
+ if (non_empty(personal_mail_address))
+ fprintf(fd, "From: %s\n", personal_mail_address);
+ fprintf(fd, "Subject: %.70s\n\n", subject);
+ }
+#endif /* VMS */
+#endif /* CAN_PIPE_TO_MAILER */
+
+ /*
+ * Break up the content into lines with a maximum length of 78. If the
+ * ENCTYPE was text/plain, we have physical newlines and should take them
+ * into account. Otherwise, the actual newline characters in the content
+ * are hex escaped. - FM
+ */
+ while ((cp = StrChr(mailto_content, '\n')) != NULL) {
+ *cp = '\0';
+ i = 0;
+ len = (int) strlen(mailto_content);
+ while (len > 78) {
+ LYStrNCpy(buf, &mailto_content[i], 78);
+ fprintf(fd, "%s\n", buf);
+ i += 78;
+ len = (int) strlen(&mailto_content[i]);
+ }
+ fprintf(fd, "%s\n", &mailto_content[i]);
+ mailto_content = (cp + 1);
+ }
+ i = 0;
+ len = (int) strlen(mailto_content);
+ while (len > 78) {
+ LYStrNCpy(buf, &mailto_content[i], 78);
+ fprintf(fd, "%s\n", buf);
+ i += 78;
+ len = (int) strlen(&mailto_content[i]);
+ }
+ if (len)
+ fprintf(fd, "%s\n", &mailto_content[i]);
+
+#if CAN_PIPE_TO_MAILER
+ pclose(fd);
+ LYSleepMsg();
+#else
+ LYCloseTempFP(fd);
+#if USE_VMS_MAILER
+ /*
+ * Set the mail command. - FM
+ */
+ if (isPMDF) {
+ /*
+ * Now set up the command. - FM
+ */
+ HTSprintf0(&cmd,
+ "%s %s %s,%s ",
+ system_mail,
+ system_mail_flags,
+ hdrfile,
+ my_tmpfile);
+ } else {
+ /*
+ * For "generic" VMS MAIL, include the subject in the command, and
+ * ignore any keywords to minimize risk of them making the line too
+ * long or having problem characters. - FM
+ */
+ HTSprintf0(&cmd,
+ "%s %s%s/subject=\"%s\" %s ",
+ system_mail,
+ system_mail_flags,
+ (strncasecomp(system_mail, "MAIL", 4) ? "" : "/noself"),
+ subject,
+ my_tmpfile);
+ }
+ StrAllocCopy(command, cmd);
+
+ vms_append_addrs(&command, address, "");
+ if (non_empty(ccaddr)) {
+ vms_append_addrs(&command, ccaddr, "/CC");
+ }
+
+ stop_curses();
+ printf("%s\n\n$ %s\n\n%s", SENDING_FORM_CONTENT, command, PLEASE_WAIT);
+ LYSystem(command); /* Mail (VMS) */
+ FREE(command);
+ LYSleepAlert();
+ start_curses();
+ (void) LYRemoveTemp(my_tmpfile);
+ if (isPMDF)
+ (void) LYRemoveTemp(hdrfile);
+#else /* DOS */
+ LYSendMailFile(address,
+ my_tmpfile,
+ subject,
+ ccaddr,
+ SENDING_FORM_CONTENT);
+ (void) LYRemoveTemp(my_tmpfile);
+#endif /* USE_VMS_MAILER */
+#endif /* CAN_PIPE_TO_MAILER */
+
+ cleanup:
+ FREE(address);
+ FREE(ccaddr);
+ FREE(keywords);
+ return;
+}
+
+/*
+ * mailmsg() sends a message to the owner of the file, if one is defined,
+ * telling of errors (i.e., link not available).
+ */
+void mailmsg(int cur,
+ char *owner_address,
+ char *filename,
+ char *linkname)
+{
+ FILE *fd, *fp;
+ char *address = NULL;
+ char *searchpart = NULL;
+ char *cmd = NULL, *cp;
+
+#ifdef ALERTMAIL
+ BOOLEAN skip_parsing = FALSE;
+#endif
+#if !CAN_PIPE_TO_MAILER
+ char *ccaddr;
+ char subject[128];
+ char my_tmpfile[LY_MAXPATH];
+#endif
+#if USE_VMS_MAILER
+ BOOLEAN isPMDF = LYMailPMDF();
+ char hdrfile[LY_MAXPATH];
+ char *command = NULL;
+
+ CTRACE((tfp, "mailmsg(%d, \"%s\", \"%s\", \"%s\")\n", cur,
+ NONNULL(owner_address),
+ NONNULL(filename),
+ NONNULL(linkname)));
+
+#endif /* VMS */
+
+ if (!LYSystemMail())
+ return;
+
+#ifdef ALERTMAIL
+ if (owner_address == NULL) {
+ owner_address = ALERTMAIL;
+ skip_parsing = TRUE;
+ }
+#endif
+
+ if (isEmpty(owner_address))
+ return;
+ if ((cp = StrChr(owner_address, '\n')) != NULL) {
+#ifdef ALERTMAIL
+ if (skip_parsing)
+ return; /* invalidly defined - ignore - kw */
+#else
+ *cp = '\0';
+#endif
+ }
+ if (!strncasecomp(owner_address, "lynx-dev@", 9)) {
+ /*
+ * Silently refuse sending bad link messages to lynx-dev.
+ */
+ return;
+ }
+ StrAllocCopy(address, owner_address);
+
+#ifdef ALERTMAIL
+ /*
+ * If we are using a fixed address given by ALERTMAIL, it is supposed to
+ * already be in usable form, without URL-isms like ?-searchpart and
+ * URL-escaping. So skip some code. - kw
+ */
+ if (!skip_parsing)
+#endif
+ {
+ /*
+ * Check for a ?searchpart. - FM
+ */
+ if ((cp = StrChr(address, '?')) != NULL) {
+ StrAllocCopy(searchpart, cp);
+ *cp = '\0';
+ cp = (searchpart + 1);
+ if (*cp != '\0') {
+ /*
+ * Seek and handle to=address(es) fields.
+ * Appends to address. We ignore any other
+ * headers in the ?searchpart. - FM
+ */
+ extract_field(&address, searchpart, "to=");
+ }
+ }
+
+ (void) convert_explorer(address);
+
+ /*
+ * Unescape the address field. - FM
+ */
+ SafeHTUnEscape(address);
+ }
+
+ if (trim_comma(address)) {
+ FREE(address);
+ CTRACE((tfp, "mailmsg: No address in '%s'.\n", owner_address));
+ return;
+ }
+#if CAN_PIPE_TO_MAILER
+ if ((fd = LYPipeToMailer()) == 0) {
+ FREE(address);
+ CTRACE((tfp, "mailmsg: '%s' failed.\n", cmd));
+ return;
+ }
+
+ fprintf(fd, "To: %s\n", address);
+ fprintf(fd, "Subject: Lynx Error in %s\n", filename);
+ if (non_empty(personal_mail_address)) {
+ fprintf(fd, "Cc: %s\n", personal_mail_address);
+ }
+ fprintf(fd, "X-URL: %s\n", filename);
+ fprintf(fd, "X-Mailer: %s, Version %s\n\n", LYNX_NAME, LYNX_VERSION);
+#else
+ if ((fd = LYOpenTemp(my_tmpfile, ".txt", "w")) == NULL) {
+ CTRACE((tfp, "mailmsg: Could not fopen '%s'.\n", my_tmpfile));
+ FREE(address);
+ return;
+ }
+ sprintf(subject, "Lynx Error in %.56s", filename);
+ ccaddr = personal_mail_address;
+#if USE_VMS_MAILER
+ if (isPMDF) {
+ FILE *hfd;
+
+ if ((hfd = LYOpenTemp(hdrfile, ".txt", "w")) == NULL) {
+ CTRACE((tfp, "mailmsg: Could not fopen '%s'.\n", hdrfile));
+ FREE(address);
+ return;
+ }
+
+ if (non_empty(personal_mail_address)) {
+ fprintf(fd, "Cc: %s\n", personal_mail_address);
+ }
+ fprintf(fd, "X-URL: %s\n", filename);
+ fprintf(fd, "X-Mailer: %s, Version %s\n\n", LYNX_NAME, LYNX_VERSION);
+ /*
+ * For PMDF, put the subject in the header file and close it. - FM
+ */
+ fprintf(hfd, "Subject: Lynx Error in %.56s\n\n", filename);
+ LYCloseTempFP(hfd);
+ }
+#endif /* USE_VMS_MAILER */
+#endif /* CAN_PIPE_TO_MAILER */
+
+ fprintf(fd, gettext("The link %s :?: %s \n"),
+ links[cur].lname, links[cur].target);
+ fprintf(fd, gettext("called \"%s\"\n"), LYGetHiliteStr(cur, 0));
+ fprintf(fd, gettext("in the file \"%s\" called \"%s\"\n"), filename, linkname);
+ fprintf(fd, "%s\n\n", gettext("was requested but was not available."));
+ fprintf(fd, "%s\n\n", gettext("Thought you might want to know."));
+
+ fprintf(fd, "%s\n", gettext("This message was automatically generated by"));
+ fprintf(fd, "%s %s", LYNX_NAME, LYNX_VERSION);
+ if ((LynxSigFile != NULL) &&
+ (fp = fopen(LynxSigFile, TXT_R)) != NULL) {
+ fputs("-- \n", fd);
+ while (LYSafeGets(&cmd, fp) != NULL)
+ fputs(cmd, fd);
+ LYCloseInput(fp);
+ }
+#if CAN_PIPE_TO_MAILER
+ pclose(fd);
+#else
+ LYCloseTempFP(fd);
+#if USE_VMS_MAILER
+ if (isPMDF) {
+ /*
+ * Now set up the command. - FM
+ */
+ HTSprintf0(&command,
+ "%s %s %s,%s ",
+ system_mail,
+ system_mail_flags,
+ hdrfile,
+ my_tmpfile);
+ } else {
+ /*
+ * For "generic" VMS MAIL, include the subject in the command. - FM
+ */
+ HTSprintf0(&command,
+ "%s %s/self/subject=\"Lynx Error in %.56s\" %s ",
+ system_mail,
+ system_mail_flags,
+ filename,
+ my_tmpfile);
+ }
+ vms_append_addrs(&command, address, "");
+
+ LYSystem(command); /* VMS */
+ FREE(command);
+ FREE(cmd);
+ (void) LYRemoveTemp(my_tmpfile);
+ if (isPMDF) {
+ (void) LYRemoveTemp(hdrfile);
+ }
+#else /* DOS */
+ LYSendMailFile(address,
+ my_tmpfile,
+ subject,
+ ccaddr,
+ "");
+ (void) LYRemoveTemp(my_tmpfile);
+#endif /* USE_VMS_MAILER */
+#endif /* CAN_PIPE_TO_MAILER */
+
+ if (traversal) {
+ FILE *ofp;
+
+ if ((ofp = LYAppendToTxtFile(TRAVERSE_ERRORS)) == NULL) {
+ if ((ofp = LYNewTxtFile(TRAVERSE_ERRORS)) == NULL) {
+ perror(NOOPEN_TRAV_ERR_FILE);
+ exit_immediately(EXIT_FAILURE);
+ }
+ }
+
+ fprintf(ofp, "%s\t%s \tin %s\n",
+ links[cur].lname, links[cur].target, filename);
+ LYCloseOutput(ofp);
+ }
+
+ FREE(address);
+ return;
+}
+
+/*
+ * reply_by_mail() invokes sendmail on Unix or mail on VMS to send
+ * a comment from the users to the owner
+ */
+void reply_by_mail(char *mail_address,
+ char *filename,
+ const char *title,
+ const char *refid)
+{
+ char user_input[LINESIZE];
+ FILE *fd, *fp;
+ const char *label = NULL;
+ char *from_address = NULL;
+ char *cc_address = NULL;
+ char *to_address = NULL;
+ char *the_subject = NULL;
+ char *ccaddr = NULL;
+ char *keywords = NULL;
+ char *searchpart = NULL;
+ char *body = NULL;
+ char *cp = NULL, *cp1 = NULL;
+ int i;
+ int c = 0; /* user input */
+ char my_tmpfile[LY_MAXPATH];
+ char default_subject[MAX_SUBJECT + 10];
+
+#if USE_VMS_MAILER
+ char *command = NULL;
+ BOOLEAN isPMDF = LYMailPMDF();
+ char hdrfile[LY_MAXPATH];
+ FILE *hfd = 0;
+
+#else
+#if !CAN_PIPE_TO_MAILER
+ char tmpfile2[LY_MAXPATH];
+#endif
+ char buf[4096]; /* 512 */
+ char *header = NULL;
+ size_t nbytes;
+#endif /* USE_VMS_MAILER */
+
+ CTRACE((tfp, "reply_by_mail(\"%s\", \"%s\", \"%s\", \"%s\")\n",
+ NONNULL(mail_address),
+ NONNULL(filename),
+ NONNULL(title),
+ NONNULL(refid)));
+
+ term_letter = FALSE;
+
+ if (!LYSystemMail())
+ return;
+
+ if (isEmpty(mail_address)) {
+ HTAlert(NO_ADDRESS_IN_MAILTO_URL);
+ return;
+ }
+ StrAllocCopy(to_address, mail_address);
+
+ if ((fd = LYOpenTemp(my_tmpfile, ".txt", "w")) == NULL) {
+ HTAlert(MAILTO_URL_TEMPOPEN_FAILED);
+ return;
+ }
+#if USE_VMS_MAILER
+ if (isPMDF) {
+ if ((hfd = LYOpenTemp(hdrfile, ".txt", "w")) == NULL) {
+ HTAlert(MAILTO_URL_TEMPOPEN_FAILED);
+ return;
+ }
+ }
+#endif /* VMS */
+ default_subject[0] = '\0';
+
+ /*
+ * Check for a ?searchpart. - FM
+ */
+ if ((cp = StrChr(to_address, '?')) != NULL) {
+ StrAllocCopy(searchpart, cp);
+ *cp = '\0';
+ cp = (searchpart + 1);
+ if (*cp != '\0') {
+ /*
+ * Seek and handle a subject=foo. - FM
+ */
+ extract_subject(default_subject, searchpart);
+
+ /*
+ * Seek and handle to=address(es) fields. Appends to address. -
+ * FM
+ */
+ extract_field(&to_address, searchpart, "to=");
+
+ /*
+ * Seek and handle cc=address(es) fields. Excludes Bcc=address(es)
+ * as unsafe. We may append our own cc (below) as a list for the
+ * actual mailing. - FM
+ */
+ extract_field(&ccaddr, searchpart, "cc=");
+
+ /*
+ * Seek and handle keywords=term(s) fields. - FM
+ */
+ extract_field(&keywords, searchpart, "keywords=");
+
+ if (keywords != NULL) {
+ if (*keywords != '\0') {
+ SafeHTUnEscape(keywords);
+ } else {
+ FREE(keywords);
+ }
+ }
+
+ /*
+ * Seek and handle body=foo fields. - FM
+ */
+ extract_body(&body, searchpart);
+
+ FREE(searchpart);
+ }
+ }
+
+ if (convert_explorer(to_address)) {
+ HTAlert(NO_ADDRESS_IN_MAILTO_URL);
+ goto cancelled;
+ }
+ if (ccaddr != NULL) {
+ if (convert_explorer(ccaddr)) {
+ FREE(ccaddr);
+ }
+ }
+
+ /*
+ * Unescape the address and ccaddr fields. - FM
+ */
+ SafeHTUnEscape(to_address);
+ if (ccaddr != NULL) {
+ SafeHTUnEscape(ccaddr);
+ }
+
+ /*
+ * Set the default subject. - FM
+ */
+ if ((default_subject[0] == '\0') && non_empty(title)) {
+ LYStrNCpy(default_subject, title, MAX_SUBJECT);
+ }
+
+ /*
+ * Use ^G to cancel mailing of comment and don't let SIGINTs exit lynx.
+ */
+ signal(SIGINT, terminate_letter);
+
+#if USE_VMS_MAILER
+ if (isPMDF || !body) {
+ /*
+ * Put the X-URL and X-Mailer lines in the hdrfile for PMDF or
+ * my_tmpfile for VMS MAIL. - FM
+ */
+ fprintf((isPMDF ? hfd : fd),
+ "X-URL: %s%s\n",
+ isEmpty(filename) ? STR_MAILTO_URL : filename,
+ isEmpty(filename) ? to_address : "");
+ fprintf((isPMDF ? hfd : fd),
+ "X-Mailer: %s, Version %s\n", LYNX_NAME, LYNX_VERSION);
+#ifdef NO_ANONYMOUS_EMAIL
+ if (!isPMDF) {
+ fprintf(fd, "\n");
+ }
+#endif /* NO_ANONYMOUS_EMAIL */
+ }
+#else /* Unix/DOS/Windows */
+ /*
+ * Put the To: line in the header.
+ */
+#ifndef DOSPATH
+ HTSprintf(&header, "To: %s\n", to_address);
+#endif
+
+ /*
+ * Put the Mime-Version, Content-Type and Content-Transfer-Encoding in the
+ * header. This assumes that the same character set is used for composing
+ * the mail which is currently selected as display character set... Don't
+ * send a charset if we have a CJK character set selected, since it may not
+ * be appropriate for mail... Also don't use an unofficial "x-" charset.
+ * Also if the charset would be "us-ascii" (7-bit replacements selected,
+ * don't send any MIME headers. - kw
+ */
+ if (strncasecomp(LYCharSet_UC[current_char_set].MIMEname,
+ "us-ascii", 8) != 0) {
+ StrAllocCat(header, "Mime-Version: 1.0\n");
+ if (!LYHaveCJKCharacterSet &&
+ strncasecomp(LYCharSet_UC[current_char_set].MIMEname, "x-", 2)
+ != 0) {
+ HTSprintf(&header, "Content-Type: " STR_PLAINTEXT "; charset=%s\n",
+ LYCharSet_UC[current_char_set].MIMEname);
+ }
+ StrAllocCat(header, "Content-Transfer-Encoding: 8bit\n");
+ }
+ /*
+ * Put the X-URL and X-Mailer lines in the header.
+ */
+ if (non_empty(filename)) {
+ HTSprintf(&header, "X-URL: %s\n", filename);
+ } else {
+ HTSprintf(&header, "X-URL: mailto:%s\n", to_address);
+ }
+ HTSprintf(&header, "X-Mailer: %s, Version %s\n", LYNX_NAME, LYNX_VERSION);
+
+ if (non_empty(refid)) {
+ HTSprintf(&header, "In-Reply-To: <%s>\n", refid);
+ }
+#endif /* VMS */
+
+ /*
+ * Clear the screen and inform the user.
+ */
+ LYclear();
+ LYmove(2, 0);
+ scrollok(LYwin, TRUE); /* Enable scrolling. */
+ if (body)
+ LYaddstr(SENDING_MESSAGE_WITH_BODY_TO);
+ else
+ LYaddstr(SENDING_COMMENT_TO);
+ show_addresses(to_address);
+ if (
+#if USE_VMS_MAILER
+ (isPMDF == TRUE) &&
+#endif /* VMS */
+ (cp = ccaddr) != NULL) {
+ if (StrChr(cp, ',') != NULL) {
+ LYaddstr(WITH_COPIES_TO);
+ } else {
+ LYaddstr(WITH_COPY_TO);
+ }
+ show_addresses(ccaddr);
+ }
+ LYaddstr(CTRL_G_TO_CANCEL_SEND);
+
+#if USE_VMS_MAILER
+ if (isPMDF || !body) {
+#endif /* USE_VMS_MAILER */
+#ifndef NO_ANONYMOUS_EMAIL
+ /*
+ * Get the user's personal name.
+ */
+ LYaddstr(ENTER_NAME_OR_BLANK);
+#if USE_VMS_MAILER
+ if (isPMDF) {
+ label = "Personal_name";
+ } else {
+ label = "X-Personal_name";
+ }
+#else
+ label = "X-Personal_Name";
+#endif /* USE_VMS_MAILER */
+ if (!header_prompt(label, &personal_mail_name, LINESIZE)) {
+ goto cancelled;
+ }
+ if (*personal_mail_name) {
+#if USE_VMS_MAILER
+ fprintf((isPMDF ? hfd : fd), "%s: %s\n", label, personal_mail_name);
+#else
+ HTSprintf(&header, "%s: %s\n", label, personal_mail_name);
+#endif /* VMS */
+ }
+
+ /*
+ * Get the user's return address.
+ */
+ LYaddstr(ENTER_MAIL_ADDRESS_OR_OTHER);
+ LYaddstr(MEANS_TO_CONTACT_FOR_RESPONSE);
+#if USE_VMS_MAILER
+ if (isPMDF) {
+ label = "From";
+ } else {
+ label = "X-From";
+ }
+#else
+ label = "From";
+#endif /* VMS */
+ /* Add the personal mail address if there is one. */
+ if (non_empty(personal_mail_address))
+ StrAllocCopy(from_address, personal_mail_address);
+ if (!header_prompt(label, &from_address, LINESIZE)) {
+ goto cancelled;
+ }
+#if USE_VMS_MAILER
+ if (*from_address) {
+ fprintf(isPMDF ? hfd : fd, "%s: %s\n", label, from_address);
+ }
+ if (!isPMDF) {
+ fprintf(fd, "\n");
+ }
+#else
+ HTSprintf(&header, "%s: %s\n", label, from_address);
+#endif /* USE_VMS_MAILER */
+#endif /* !NO_ANONYMOUS_EMAIL */
+#if USE_VMS_MAILER
+ }
+#endif /* USE_VMS_MAILER */
+
+ /*
+ * Get the subject line.
+ */
+ LYaddstr(ENTER_SUBJECT_LINE);
+ label = "Subject";
+ if (*default_subject) {
+ StrAllocCopy(the_subject, default_subject);
+ } else if (non_empty(filename)) {
+ HTSprintf(&the_subject, "%s", filename);
+ } else {
+ HTSprintf(&the_subject, "mailto:%s", to_address);
+ }
+ if (!header_prompt(label, &the_subject, MAX_SUBJECT)) {
+ goto cancelled;
+ }
+
+ /*
+ * Offer a CC line, if permitted. - FM
+ */
+ if (!LYNoCc) {
+ LYaddstr(ENTER_ADDRESS_FOR_CC);
+ LYaddstr(BLANK_FOR_NO_COPY);
+ if (non_empty(personal_mail_address))
+ StrAllocCopy(cc_address, personal_mail_address);
+ if (!header_prompt("Cc", &cc_address, LINESIZE)) {
+ goto cancelled;
+ }
+ comma_append(&ccaddr, cc_address);
+ }
+#if !USE_VMS_MAILER
+ HTSprintf(&header, "%s: %s\n", label, the_subject);
+#if !CAN_PIPE_TO_MAILER
+ if (*to_address) {
+ HTSprintf(&header, "To: %s\n", to_address);
+ }
+#endif
+
+ /*
+ * Add the Cc: header. - FM
+ */
+ if (non_empty(ccaddr)) {
+ HTSprintf(&header, "Cc: %s\n", ccaddr);
+ }
+
+ /*
+ * Add the Keywords: header. - FM
+ */
+ if (non_empty(keywords)) {
+ HTSprintf(&header, "Keywords: %s\n", keywords);
+ }
+
+ /*
+ * Terminate the header.
+ */
+ StrAllocCat(header, "\n");
+ CTRACE((tfp, "**header==\n%s", header));
+#endif /* !VMS */
+
+ if (!no_editor && non_empty(editor)) {
+
+ if (body) {
+ cp1 = body;
+ while ((cp = StrChr(cp1, '\n')) != NULL) {
+ *cp++ = '\0';
+ fprintf(fd, "%s\n", cp1);
+ cp1 = cp;
+ }
+ } else if (strcmp(HTLoadedDocumentURL(), "")) {
+ /*
+ * Ask if the user wants to include the original message.
+ */
+ BOOLEAN is_preparsed = (BOOL) (LYPreparsedSource &&
+ HTisDocumentSource());
+
+ if (HTConfirm(is_preparsed
+ ? INC_PREPARSED_MSG_PROMPT
+ : INC_ORIG_MSG_PROMPT) == YES) {
+ print_wwwfile_to_fd(fd, TRUE, (BOOL) !is_preparsed);
+ }
+ }
+ LYCloseTempFP(fd); /* Close the tmpfile. */
+ scrollok(LYwin, FALSE); /* Stop scrolling. */
+
+ if (term_letter || LYCharIsINTERRUPT(c))
+ goto cleanup;
+
+ /*
+ * Spawn the users editor on the mail file
+ */
+ edit_temporary_file(my_tmpfile, "", SPAWNING_EDITOR_FOR_MAIL);
+
+ } else if (body) {
+ /*
+ * Let user review the body. - FM
+ */
+ LYclear();
+ LYmove(0, 0);
+ LYaddstr(REVIEW_MESSAGE_BODY);
+ LYrefresh();
+ cp1 = body;
+ i = (LYlines - 5);
+ while ((cp = StrChr(cp1, '\n')) != NULL) {
+ if (i <= 0) {
+ LYaddstr(RETURN_TO_CONTINUE);
+ LYrefresh();
+ c = LYgetch();
+ LYaddstr("\n");
+ if (term_letter || LYCharIsINTERRUPT(c)) {
+ goto cancelled;
+ }
+ i = (LYlines - 2);
+ }
+ *cp++ = '\0';
+ fprintf(fd, "%s\n", cp1);
+ LYaddstr(cp1);
+ LYaddstr("\n");
+ cp1 = cp;
+ i--;
+ }
+ while (i >= 0) {
+ LYaddstr("\n");
+ i--;
+ }
+ LYrefresh();
+ LYCloseTempFP(fd); /* Close the tmpfile. */
+ scrollok(LYwin, FALSE); /* Stop scrolling. */
+
+ } else {
+ /*
+ * Use the internal line editor for the message.
+ */
+ LYaddstr(ENTER_MESSAGE_BELOW);
+ LYaddstr(ENTER_PERIOD_WHEN_DONE_A);
+ LYaddstr(ENTER_PERIOD_WHEN_DONE_B);
+ LYaddstr(CTRL_G_TO_CANCEL_SEND);
+ LYaddstr("\n\n");
+ LYrefresh();
+ *user_input = '\0';
+ if (LYGetStr(user_input, FALSE, sizeof(user_input), NORECALL) < 0 ||
+ term_letter || STREQ(user_input, ".")) {
+ goto cancelled;
+ }
+
+ while (!STREQ(user_input, ".") && !term_letter) {
+ LYaddstr("\n");
+ remove_tildes(user_input);
+ fprintf(fd, "%s\n", user_input);
+ *user_input = '\0';
+ if (LYGetStr(user_input, FALSE,
+ sizeof(user_input), NORECALL) < 0) {
+ goto cancelled;
+ }
+ }
+
+ fprintf(fd, "\n"); /* Terminate the message. */
+ LYCloseTempFP(fd); /* Close the tmpfile. */
+ scrollok(LYwin, FALSE); /* Stop scrolling. */
+ }
+
+#if !USE_VMS_MAILER
+ /*
+ * Ignore CTRL-C on this last question.
+ */
+ signal(SIGINT, SIG_IGN);
+#endif /* !VMS */
+ LYStatusLine = (LYlines - 1);
+ c = HTConfirm(body ? SEND_MESSAGE_PROMPT : SEND_COMMENT_PROMPT);
+ LYStatusLine = -1;
+ if (c != YES) {
+ LYclear(); /* clear the screen */
+ goto cleanup;
+ }
+ if ((body == NULL && non_empty(LynxSigFile)) &&
+ (fp = fopen(LynxSigFile, TXT_R)) != NULL) {
+ LYStatusLine = (LYlines - 1);
+ if (term_letter) {
+ _user_message(APPEND_SIG_FILE, LynxSigFile);
+ c = 0;
+ } else {
+ char *msg = NULL;
+
+ HTSprintf0(&msg, APPEND_SIG_FILE, LynxSigFile);
+ c = HTConfirm(msg);
+ FREE(msg);
+ }
+ LYStatusLine = -1;
+ if (c == YES) {
+ if ((fd = fopen(my_tmpfile, TXT_A)) != NULL) {
+ char *buffer = NULL;
+
+ fputs("-- \n", fd);
+ while (LYSafeGets(&buffer, fp) != NULL) {
+ fputs(buffer, fd);
+ }
+ LYCloseOutput(fd);
+ FREE(buffer);
+ }
+ }
+ LYCloseInput(fp);
+ }
+ LYclear(); /* Clear the screen. */
+
+ /*
+ * Send the message.
+ */
+#if USE_VMS_MAILER
+ /*
+ * Set the mail command. - FM
+ */
+ if (isPMDF) {
+ /*
+ * For PMDF, put any keywords and the subject in the header file and
+ * close it. - FM
+ */
+ if (non_empty(keywords)) {
+ fprintf(hfd, "Keywords: %s\n", keywords);
+ }
+ fprintf(hfd, "Subject: %s\n\n", the_subject);
+ LYCloseTempFP(hfd);
+ /*
+ * Now set up the command. - FM
+ */
+ HTSprintf0(&command, "%s %s %s,%s ",
+ system_mail,
+ system_mail_flags,
+ hdrfile,
+ my_tmpfile);
+ } else {
+ /*
+ * For "generic" VMS MAIL, include the subject in the command, and
+ * ignore any keywords to minimize risk of them making the line too
+ * long or having problem characters. - FM
+ */
+ HTSprintf0(&command, "%s %s%s/subject=\"%s\" %s ",
+ system_mail,
+ system_mail_flags,
+ (strncasecomp(system_mail, "MAIL", 4) ? "" : "/noself"),
+ the_subject,
+ my_tmpfile);
+ }
+
+ vms_append_addrs(&command, to_address, "");
+ if (non_empty(ccaddr)) {
+ vms_append_addrs(&command, ccaddr, "/CC");
+ }
+
+ stop_curses();
+ printf("%s\n\n$ %s\n\n%s", SENDING_COMMENT, command, PLEASE_WAIT);
+ LYSystem(command); /* SENDING COMMENT (VMS) */
+ FREE(command);
+ LYSleepAlert();
+ start_curses();
+#else /* Unix/DOS/Windows */
+ /*
+ * Send the tmpfile into sendmail.
+ */
+ _statusline(SENDING_YOUR_MSG);
+#if CAN_PIPE_TO_MAILER
+ signal(SIGINT, SIG_IGN);
+ if ((fp = LYPipeToMailer()) == 0) {
+ HTInfoMsg(CANCELLED);
+ }
+#else
+ if ((fp = LYOpenTemp(tmpfile2, ".txt", "w")) == NULL) {
+ HTAlert(MAILTO_URL_TEMPOPEN_FAILED);
+ }
+#endif /* CAN_PIPE_TO_MAILER */
+ if (fp != 0) {
+ fd = fopen(my_tmpfile, TXT_R);
+ if (fd == NULL) {
+ HTInfoMsg(CANCELLED);
+#if CAN_PIPE_TO_MAILER
+ pclose(fp);
+#else
+ LYCloseTempFP(fp);
+#endif /* CAN_PIPE_TO_MAILER */
+ } else {
+#if USE_BLAT_MAILER
+ if (!mail_is_blat)
+ fputs(header, fp);
+#else
+ fputs(header, fp);
+#endif
+ while ((nbytes = fread(buf, (size_t) 1, sizeof(buf), fd)) != 0) {
+ if (fwrite(buf, (size_t) 1, (size_t) nbytes, fp) < nbytes)
+ break;
+ }
+#if CAN_PIPE_TO_MAILER
+ pclose(fp);
+#else
+ LYCloseTempFP(fp); /* Close the tmpfile. */
+ LYSendMailFile(to_address,
+ tmpfile2,
+ the_subject,
+ ccaddr,
+ SENDING_COMMENT);
+ (void) LYRemoveTemp(tmpfile2); /* Delete the tmpfile. */
+#endif /* CAN_PIPE_TO_MAILER */
+ LYCloseInput(fd); /* Close the tmpfile. */
+ }
+ }
+#endif /* USE_VMS_MAILER */
+ goto cleanup;
+
+ /*
+ * Come here to cleanup and exit.
+ */
+ cancelled:
+ HTInfoMsg(CANCELLED);
+ LYCloseTempFP(fd); /* Close the tmpfile. */
+ scrollok(LYwin, FALSE); /* Stop scrolling. */
+ cleanup:
+ signal(SIGINT, cleanup_sig);
+ term_letter = FALSE;
+
+#if USE_VMS_MAILER
+ while (LYRemoveTemp(my_tmpfile) == 0) ; /* Delete the tmpfile(s). */
+ if (isPMDF) {
+ (void) LYRemoveTemp(hdrfile); /* Delete the hdrfile. */
+ }
+#else
+ FREE(header);
+ (void) LYRemoveTemp(my_tmpfile); /* Delete the tmpfile. */
+#endif /* VMS */
+
+ FREE(from_address);
+ FREE(the_subject);
+ FREE(cc_address);
+ FREE(to_address);
+ FREE(ccaddr);
+ FREE(keywords);
+ FREE(body);
+ return;
+}
+
+/*
+ * Check that we have configured values for system mailer.
+ */
+BOOLEAN LYSystemMail(void)
+{
+ if (isEmpty(system_mail) || !strcmp(system_mail, "unknown")) {
+ HTAlert(gettext("No system mailer configured"));
+ return FALSE;
+ }
+ return TRUE;
+}
diff --git a/src/LYMail.h b/src/LYMail.h
new file mode 100644
index 0000000..f75f686
--- /dev/null
+++ b/src/LYMail.h
@@ -0,0 +1,88 @@
+/*
+ * $LynxId: LYMail.h,v 1.17 2011/06/02 10:37:23 tom Exp $
+ */
+#ifndef LYMAIL_H
+#define LYMAIL_H
+
+#ifndef LYSTRUCTS_H
+#include <LYStructs.h>
+#endif /* LYSTRUCTS_H */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef SH_EX
+#undef USE_BLAT_MAILER
+#define USE_BLAT_MAILER 1
+#endif
+
+#ifndef USE_ALT_BLAT_MAILER
+#define USE_ALT_BLAT_MAILER 0
+#endif
+
+#ifndef USE_BLAT_MAILER
+#define USE_BLAT_MAILER 0
+#endif
+
+#ifndef ALTBLAT_MAIL_FLAGS
+#define ALTBLAT_MAIL_FLAGS ""
+#endif
+
+#ifndef BLAT_MAIL_FLAGS
+#define BLAT_MAIL_FLAGS ""
+#endif
+
+#ifdef VMS
+#define USE_VMS_MAILER 1
+#else
+#define USE_VMS_MAILER 0
+#endif
+
+#ifndef SYSTEM_MAIL
+#define SYSTEM_MAIL "sendmail"
+#endif
+
+#ifndef SYSTEM_MAIL_FLAGS
+#define SYSTEM_MAIL_FLAGS ""
+#endif
+
+/*
+ * Ifdef's in case we have a working popen/pclose, useful for piping to the
+ * mail program.
+ */
+#ifndef CAN_PIPE_TO_MAILER
+#if !defined(HAVE_POPEN) || USE_VMS_MAILER || defined(DOSPATH) || defined(__CYGWIN__)
+#define CAN_PIPE_TO_MAILER 0
+#else
+#define CAN_PIPE_TO_MAILER 1
+#endif
+#endif
+
+ extern BOOLEAN term_letter;
+
+ extern BOOLEAN LYSystemMail(void);
+ extern BOOLEAN LYMailPMDF(void);
+ extern FILE *LYPipeToMailer(void);
+ extern int LYSendMailFile(char *the_address,
+ char *the_filename,
+ char *the_subject,
+ char *the_ccaddr,
+ char *message);
+ extern void mailform(const char *mailto_address,
+ const char *mailto_subject,
+ const char *mailto_content,
+ const char *mailto_type);
+ extern void mailmsg(int cur,
+ char *owner_address,
+ char *filename,
+ char *linkname);
+ extern void reply_by_mail(char *mail_address,
+ char *filename,
+ const char *title,
+ const char *refid);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* LYMAIL_H */
diff --git a/src/LYMain.c b/src/LYMain.c
new file mode 100644
index 0000000..eef3ff7
--- /dev/null
+++ b/src/LYMain.c
@@ -0,0 +1,4554 @@
+/*
+ * $LynxId: LYMain.c,v 1.298 2022/04/01 07:50:45 tom Exp $
+ */
+#include <HTUtils.h>
+#include <HTTP.h>
+#include <HTParse.h>
+#include <HTAccess.h>
+#include <HTList.h>
+#include <HTFile.h>
+#include <UCMap.h>
+#include <UCDefs.h>
+#include <HTInit.h>
+#include <HTAlert.h>
+#include <LYCurses.h>
+#include <LYStyle.h>
+#include <HTML.h>
+#include <LYUtils.h>
+#include <LYGlobalDefs.h>
+#include <LYMail.h>
+#include <LYOptions.h>
+#include <LYSignal.h>
+#include <LYGetFile.h>
+#include <LYStrings.h>
+#include <LYClean.h>
+#include <LYCharSets.h>
+#include <LYCharUtils.h>
+#include <LYReadCFG.h>
+#include <LYrcFile.h>
+#include <LYKeymap.h>
+#include <HTForms.h>
+#include <LYList.h>
+#include <LYJump.h>
+
+#ifdef USE_SESSIONS
+#include <LYSession.h>
+#endif
+
+#include <LYMainLoop.h>
+#include <LYBookmark.h>
+#include <LYCookie.h>
+#include <LYPrettySrc.h>
+#include <LYShowInfo.h>
+#include <LYHistory.h>
+
+#ifdef VMS
+#include <HTFTP.h>
+#endif /* !DECNET */
+
+#ifdef __DJGPP__
+#include <dos.h>
+#include <dpmi.h>
+#include <io.h>
+#include <sys/stat.h>
+#include <sys/exceptn.h>
+#endif /* __DJGPP__ */
+
+#ifdef __EMX__
+#include <io.h>
+#endif
+
+#if defined(LOCALE) && (!defined(HAVE_LIBINTL_H) || !defined(LC_ALL))
+#undef gettext /* Solaris locale.h prototypes gettext() */
+#include <locale.h>
+#ifndef HAVE_GETTEXT
+#define gettext(s) s
+#endif
+#endif /* LOCALE */
+
+#include <LYexit.h>
+#include <LYLeaks.h>
+
+/* ahhhhhhhhhh!! Global variables :-< */
+#ifdef SOCKS
+BOOLEAN socks_flag = TRUE;
+#endif /* SOCKS */
+
+#ifdef IGNORE_CTRL_C
+BOOLEAN sigint = FALSE;
+#endif /* IGNORE_CTRL_C */
+
+#ifdef __DJGPP__
+static char init_ctrl_break[1];
+#endif /* __DJGPP__ */
+
+#if USE_VMS_MAILER
+char *mail_adrs = NULL; /* the mask for a VMS mail transport */
+#endif
+
+#ifdef VMS
+ /* create FIXED 512 binaries */
+BOOLEAN UseFixedRecords = USE_FIXED_RECORDS;
+#endif /* VMS */
+
+#ifndef VMS
+static char *lynx_version_putenv_command = NULL;
+char *list_format = NULL; /* LONG_LIST formatting mask */
+#endif /* !VMS */
+
+char *ftp_format = NULL; /* LONG_LIST formatting mask */
+
+#ifdef SYSLOG_REQUESTED_URLS
+char *syslog_txt = NULL; /* syslog arb text for session */
+BOOLEAN syslog_requested_urls = FALSE;
+#endif
+
+int cfg_bad_html = BAD_HTML_WARN;
+
+#ifdef DIRED_SUPPORT
+BOOLEAN lynx_edit_mode = FALSE;
+BOOLEAN no_dired_support = FALSE;
+HTList *tagged = NULL;
+int LYAutoUncacheDirLists = 2; /* default dired uncaching behavior */
+int dir_list_order = ORDER_BY_NAME;
+int dir_list_style = MIXED_STYLE;
+
+#ifdef OK_OVERRIDE
+BOOLEAN prev_lynx_edit_mode = FALSE;
+#endif /* OK_OVERRIDE */
+
+#ifdef OK_PERMIT
+#ifdef NO_CHANGE_EXECUTE_PERMS
+BOOLEAN no_change_exec_perms = TRUE;
+
+#else
+BOOLEAN no_change_exec_perms = FALSE;
+#endif /* NO_CHANGE_EXECUTE_PERMS */
+#endif /* OK_PERMIT */
+
+#endif /* DIRED_SUPPORT */
+
+ /* Number of docs cached in memory */
+int HTCacheSize = DEFAULT_CACHE_SIZE;
+
+#if defined(VMS) && defined(VAXC) && !defined(__DECC)
+ /* Don't dump doc cache unless this size is exceeded */
+int HTVirtualMemorySize = DEFAULT_VIRTUAL_MEMORY_SIZE;
+#endif /* VMS && VAXC && !_DECC */
+
+#if defined(EXEC_LINKS) || defined(EXEC_SCRIPTS)
+#ifndef NEVER_ALLOW_REMOTE_EXEC
+BOOLEAN local_exec = LOCAL_EXECUTION_LINKS_ALWAYS_ON;
+
+#else
+BOOLEAN local_exec = FALSE;
+#endif /* NEVER_ALLOW_REMOTE_EXEC */
+BOOLEAN local_exec_on_local_files =
+LOCAL_EXECUTION_LINKS_ON_BUT_NOT_REMOTE;
+#endif /* EXEC_LINKS || EXEC_SCRIPTS */
+
+#if defined(LYNXCGI_LINKS) && !defined(VMS) /* WebSter Mods -jkt */
+char *LYCgiDocumentRoot = NULL; /* DOCUMENT_ROOT in the lynxcgi env */
+#endif /* LYNXCGI_LINKS */
+
+#ifdef TRACK_INTERNAL_LINKS
+BOOLEAN track_internal_links = TRUE;
+
+#else
+BOOLEAN track_internal_links = FALSE;
+#endif
+
+BOOLEAN enable_scrollback = FALSE;
+
+char empty_string[] =
+{'\0'};
+
+int display_lines; /* number of lines in display */
+int www_search_result = -1;
+
+ /* linked list of printers */
+lynx_list_item_type *printers = NULL;
+
+ /* linked list of download options */
+lynx_list_item_type *downloaders = NULL;
+
+ /* linked list of upload options */
+#ifdef USE_EXTERNALS
+lynx_list_item_type *externals = NULL;
+
+ /* linked list of external options */
+#endif
+#ifdef USE_IDN2
+int LYidnaMode = LYidnaTR46;
+#endif
+
+lynx_list_item_type *uploaders = NULL;
+int LYShowColor = SHOW_COLOR_UNKNOWN; /* to show or not */
+int LYrcShowColor = SHOW_COLOR_UNKNOWN; /* ... last used */
+
+#if !defined(NO_OPTION_FORMS) && !defined(NO_OPTION_MENU)
+BOOLEAN LYUseFormsOptions = TRUE; /* use forms-based options menu */
+#endif
+
+BOOLEAN LYGuessScheme = FALSE;
+BOOLEAN LYJumpFileURL = FALSE; /* always FALSE the first time */
+BOOLEAN LYPermitURL = FALSE;
+BOOLEAN LYRestricted = FALSE; /* whether we have -anonymous option */
+BOOLEAN LYShowCursor = SHOW_CURSOR; /* to show or not to show */
+BOOLEAN LYUnderlineLinks = UNDERLINE_LINKS; /* Show the links underlined vs bold */
+BOOLEAN LYUseDefShoCur = TRUE; /* Command line -show_cursor toggle */
+BOOLEAN LYUserSpecifiedURL = TRUE; /* always TRUE the first time */
+BOOLEAN LYValidate = FALSE;
+BOOLEAN LYforce_no_cache = FALSE;
+BOOLEAN LYinternal_flag = FALSE; /* override no-cache b/c internal link */
+BOOLEAN LYoverride_no_cache = FALSE; /*override no-cache b/c history etc */
+BOOLEAN LYresubmit_posts = ALWAYS_RESUBMIT_POSTS;
+BOOLEAN LYtrimBlankLines = TRUE;
+BOOLEAN LYtrimInputFields = FALSE;
+BOOLEAN LYxhtml_parsing = FALSE;
+BOOLEAN bold_H1 = FALSE;
+BOOLEAN bold_headers = FALSE;
+BOOLEAN bold_name_anchors = FALSE;
+BOOLEAN LYcase_sensitive = CASE_SENSITIVE_ALWAYS_ON;
+BOOLEAN check_mail = CHECKMAIL;
+BOOLEAN child_lynx = FALSE;
+BOOLEAN dump_links_decoded = TRUE;
+BOOLEAN dump_links_inline = FALSE;
+BOOLEAN dump_links_only = FALSE;
+BOOLEAN dump_output_immediately = FALSE;
+BOOLEAN dump_to_stderr = FALSE;
+BOOLEAN emacs_keys = EMACS_KEYS_ALWAYS_ON;
+BOOLEAN error_logging = MAIL_SYSTEM_ERROR_LOGGING;
+BOOLEAN goto_buffer = GOTOBUFFER; /* TRUE if offering default goto URL */
+BOOLEAN historical_comments = FALSE;
+BOOLEAN html5_charsets = FALSE;
+BOOLEAN is_www_index = FALSE;
+BOOLEAN jump_buffer = JUMPBUFFER; /* TRUE if offering default shortcut */
+BOOLEAN lynx_mode = NORMAL_LYNX_MODE;
+BOOLEAN minimal_comments = FALSE;
+BOOLEAN number_fields_on_left = TRUE;
+BOOLEAN number_links_on_left = TRUE;
+BOOLEAN recent_sizechange = FALSE; /* the window size changed recently? */
+BOOLEAN soft_dquotes = FALSE;
+BOOLEAN unique_urls = FALSE;
+BOOLEAN use_underscore = SUBSTITUTE_UNDERSCORES;
+BOOLEAN verbose_img = VERBOSE_IMAGES; /* show filenames or not */
+BOOLEAN vi_keys = VI_KEYS_ALWAYS_ON;
+int keypad_mode = DEFAULT_KEYPAD_MODE;
+int user_mode = NOVICE_MODE;
+
+BOOLEAN telnet_ok = TRUE;
+
+#ifndef DISABLE_NEWS
+BOOLEAN news_ok = TRUE;
+#endif
+BOOLEAN rlogin_ok = TRUE;
+BOOLEAN long_url_ok = FALSE;
+BOOLEAN ftp_ok = TRUE;
+BOOLEAN system_editor = FALSE;
+
+BOOLEAN had_restrictions_default = FALSE;
+BOOLEAN had_restrictions_all = FALSE;
+
+BOOLEAN exec_frozen = FALSE;
+BOOLEAN no_bookmark = FALSE;
+BOOLEAN no_bookmark_exec = FALSE;
+BOOLEAN no_chdir = FALSE;
+BOOLEAN no_disk_save = FALSE;
+BOOLEAN no_dotfiles = NO_DOT_FILES;
+BOOLEAN no_download = FALSE;
+BOOLEAN no_editor = FALSE;
+BOOLEAN no_exec = FALSE;
+BOOLEAN no_file_url = FALSE;
+BOOLEAN no_goto = FALSE;
+BOOLEAN no_goto_configinfo = FALSE;
+BOOLEAN no_goto_cso = FALSE;
+BOOLEAN no_goto_file = FALSE;
+BOOLEAN no_goto_finger = FALSE;
+BOOLEAN no_goto_ftp = FALSE;
+BOOLEAN no_goto_gopher = FALSE;
+BOOLEAN no_goto_http = FALSE;
+BOOLEAN no_goto_https = FALSE;
+BOOLEAN no_goto_lynxcgi = FALSE;
+BOOLEAN no_goto_lynxexec = FALSE;
+BOOLEAN no_goto_lynxprog = FALSE;
+BOOLEAN no_goto_mailto = FALSE;
+BOOLEAN no_goto_rlogin = FALSE;
+BOOLEAN no_goto_telnet = FALSE;
+BOOLEAN no_goto_tn3270 = FALSE;
+BOOLEAN no_goto_wais = FALSE;
+BOOLEAN no_inside_ftp = FALSE;
+BOOLEAN no_inside_rlogin = FALSE;
+BOOLEAN no_inside_telnet = FALSE;
+BOOLEAN no_jump = FALSE;
+BOOLEAN no_lynxcfg_info = FALSE;
+BOOLEAN no_lynxcgi = FALSE;
+BOOLEAN no_mail = FALSE;
+BOOLEAN no_multibook = FALSE;
+BOOLEAN no_option_save = FALSE;
+BOOLEAN no_outside_ftp = FALSE;
+BOOLEAN no_outside_rlogin = FALSE;
+BOOLEAN no_outside_telnet = FALSE;
+BOOLEAN no_print = FALSE;
+BOOLEAN no_shell = FALSE;
+BOOLEAN no_suspend = FALSE;
+BOOLEAN no_telnet_port = FALSE;
+BOOLEAN no_useragent = FALSE;
+
+#ifndef DISABLE_FTP
+BOOLEAN ftp_passive = FTP_PASSIVE; /* TRUE if doing ftp in passive mode */
+BOOLEAN ftp_local_passive;
+HTList *broken_ftp_epsv = NULL;
+HTList *broken_ftp_retr = NULL;
+char *ftp_lasthost = NULL;
+#endif
+
+#ifndef DISABLE_NEWS
+BOOLEAN no_goto_news = FALSE;
+BOOLEAN no_goto_nntp = FALSE;
+BOOLEAN no_goto_snews = FALSE;
+BOOLEAN no_inside_news = FALSE;
+BOOLEAN no_newspost = FALSE;
+BOOLEAN no_outside_news = FALSE;
+#endif
+
+#ifdef USE_EXTERNALS
+BOOLEAN no_externals = FALSE;
+#endif
+
+#ifndef NO_CONFIG_INFO
+BOOLEAN no_lynxcfg_xinfo = FALSE;
+
+#ifdef HAVE_CONFIG_H
+BOOLEAN no_compileopts_info = FALSE;
+#endif
+#endif
+
+BOOLEAN no_statusline = FALSE;
+BOOLEAN no_filereferer = TRUE;
+char LYRefererWithQuery = 'D'; /* 'D' for drop */
+BOOLEAN local_host_only = FALSE;
+BOOLEAN override_no_download = FALSE;
+BOOLEAN show_dotfiles = FALSE; /* From rcfile if no_dotfiles is false */
+BOOLEAN LYforce_HTML_mode = FALSE;
+BOOLEAN LYfind_leaks = TRUE;
+
+#ifdef __DJGPP__
+BOOLEAN watt_debug = FALSE; /* WATT-32 debugging */
+BOOLEAN dj_is_bash = FALSE; /* Check for bash shell under DJGPP */
+#endif /* __DJGPP__ */
+
+#ifdef WIN_EX
+BOOLEAN focus_window = FALSE; /* 1998/10/05 (Mon) 17:18:42 */
+char windows_drive[4]; /* 1998/01/13 (Tue) 21:13:24 */
+#endif
+
+#ifdef _WINDOWS
+#define TIMEOUT 180 /* 1998/03/30 (Mon) 14:50:44 */
+int lynx_timeout = TIMEOUT;
+CRITICAL_SECTION critSec_READ; /* 1998/09/03 (Thu) 22:01:56 */
+#endif /* _WINDOWS */
+
+#if defined(WIN_EX)
+BOOLEAN system_is_NT = FALSE;
+#endif
+
+BOOLEAN show_cfg = FALSE;
+
+BOOLEAN no_table_center = FALSE; /* 1998/10/09 (Fri) 15:12:49 */
+
+#if USE_BLAT_MAILER
+BOOLEAN mail_is_blat = TRUE;
+BOOLEAN mail_is_altblat = USE_ALT_BLAT_MAILER;
+
+#if USE_ALT_BLAT_MAILER
+#define THIS_BLAT_MAIL ALTBLAT_MAIL
+#define THAT_BLAT_MAIL BLAT_MAIL
+#else
+#define THIS_BLAT_MAIL BLAT_MAIL
+#define THAT_BLAT_MAIL ALTBLAT_MAIL
+#endif
+#endif
+
+#ifdef USE_BLINK
+# ifdef __EMX__
+BOOLEAN term_blink_is_boldbg = TRUE;
+
+# else
+BOOLEAN term_blink_is_boldbg = FALSE;
+
+# endif
+#endif
+
+BOOLEAN HEAD_request = FALSE;
+BOOLEAN LYAcceptAllCookies = ACCEPT_ALL_COOKIES; /* take all cookies? */
+BOOLEAN LYCancelledFetch = FALSE; /* TRUE if cancelled binary fetch */
+BOOLEAN LYCollapseBRs = COLLAPSE_BR_TAGS; /* Collapse serial BRs? */
+BOOLEAN LYDefaultRawMode;
+BOOLEAN LYListNewsDates = LIST_NEWS_DATES;
+BOOLEAN LYListNewsNumbers = LIST_NEWS_NUMBERS;
+BOOLEAN LYMBMBlocked = BLOCK_MULTI_BOOKMARKS;
+BOOLEAN LYNewsPosting = NEWS_POSTING; /* News posting supported? */
+BOOLEAN LYNoFromHeader = TRUE; /* Never send From header? */
+BOOLEAN LYNoRefererForThis = FALSE; /* No Referer header for this URL? */
+BOOLEAN LYNoRefererHeader = FALSE; /* Never send Referer header? */
+BOOLEAN LYRawMode;
+BOOLEAN LYSelectPopups = USE_SELECT_POPUPS;
+BOOLEAN LYSendUserAgent = SEND_USERAGENT; /* send Lynx User-Agent header? */
+BOOLEAN LYSetCookies = SET_COOKIES; /* Process Set-Cookie headers? */
+BOOLEAN LYUseDefSelPop = TRUE; /* Command line -popup toggle */
+BOOLEAN LYUseDefaultRawMode = TRUE;
+BOOLEAN LYUseMouse = FALSE;
+BOOLEAN LYisConfiguredForX = FALSE;
+BOOLEAN UCForce8bitTOUPPER = FALSE; /* override locale for case-conversion? */
+BOOLEAN UCSaveBookmarksInUnicode = FALSE;
+BOOLEAN bookmark_start = FALSE;
+BOOLEAN check_realm = FALSE; /* Restrict to the starting realm? */
+BOOLEAN clickable_images = MAKE_LINKS_FOR_ALL_IMAGES;
+BOOLEAN crawl = FALSE; /* Do crawl? */
+BOOLEAN keep_mime_headers = FALSE; /* Include mime headers with source dump */
+BOOLEAN more_text = FALSE; /* is there more text to display? */
+BOOLEAN more_links = FALSE; /* Links beyond a displayed page with no links? */
+BOOLEAN no_list = FALSE;
+BOOLEAN no_margins = FALSE;
+BOOLEAN no_pause = FALSE;
+BOOLEAN no_title = FALSE;
+BOOLEAN update_term_title = FALSE;
+BOOLEAN no_url_redirection = FALSE; /* Don't follow URL redirections */
+BOOLEAN pseudo_inline_alts = MAKE_PSEUDO_ALTS_FOR_INLINES;
+BOOLEAN scan_for_buried_news_references = TRUE;
+BOOLEAN startfile_ok = FALSE;
+static BOOLEAN startfile_stdin = FALSE;
+BOOLEAN traversal = FALSE; /* Do traversals? */
+
+char *BookmarkPage = NULL; /* the name of the current bookmark page */
+char *LYCookieAcceptDomains = NULL; /* domains to accept all cookies */
+char *LYCookieLooseCheckDomains = NULL; /* check loosely */
+char *LYCookieQueryCheckDomains = NULL; /* check w/a query */
+char *LYCookieRejectDomains = NULL; /* domains to reject all cookies */
+char *LYCookieSAcceptDomains = NULL; /* domains to accept all cookies */
+char *LYCookieSLooseCheckDomains = NULL; /* check loosely */
+char *LYCookieSQueryCheckDomains = NULL; /* check w/a query */
+char *LYCookieSRejectDomains = NULL; /* domains to reject all cookies */
+char *LYCookieSStrictCheckDomains = NULL; /* check strictly */
+char *LYCookieStrictCheckDomains = NULL; /* check strictly */
+char *LYHostName = NULL; /* treat as a local host name */
+char *LYLocalDomain = NULL; /* treat as a local domain tail */
+char *LYUserAgent = NULL; /* Lynx User-Agent header */
+char *LYUserAgentDefault = NULL; /* Lynx default User-Agent header */
+char *LynxHome = NULL; /* the default Home HREF. */
+char *LynxSigFile = NULL; /* Signature file, in or off home */
+char *UCAssume_MIMEcharset = NULL;
+char *URLDomainPrefixes = NULL;
+char *URLDomainSuffixes = NULL;
+char *anonftp_password = NULL; /* anonymous ftp password (default: email) */
+char *authentication_info[2] =
+{NULL, NULL}; /* Id:Password for protected documents */
+char *bookmark_page = NULL; /* the name of the default bookmark page */
+char *editor = NULL; /* the name of the current editor */
+char *form_get_data = NULL; /* User data for get form */
+char *form_post_data = NULL; /* User data for post form */
+char *global_extension_map = NULL; /* global mime.types */
+char *global_type_map = NULL; /* global mailcap */
+char *helpfile = NULL; /* the main help file */
+char *helpfilepath = NULL; /* the path to the help file set */
+char *homepage = NULL; /* home page or main screen */
+char *http_error_file = NULL; /* Place HTTP status code in this file */
+char *indexfile = NULL; /* an index file if there is one */
+char *jumpfile = NULL; /* the name of the default jumps file */
+char *jumpprompt = NULL; /* the default jumps prompt */
+char *language = NULL; /* preferred language */
+char *lynx_cfg_file = NULL; /* location of active lynx.cfg */
+char *lynx_cmd_logfile; /* file to write keystroke commands, if any */
+char *lynx_cmd_script; /* file to read keystroke commands, if any */
+char *lynx_save_space = NULL; /* The prefix for save to disk paths */
+char *lynx_temp_space = NULL; /* The prefix for temporary file paths */
+char *lynxjumpfile = NULL; /* the current jump file URL */
+char *lynxlinksfile = NULL; /* the current visited links file URL */
+char *lynxlistfile = NULL; /* the current list file URL */
+char *original_dir = NULL; /* the original directory */
+char *personal_extension_map = NULL; /* .mime.types */
+char *personal_mail_address = NULL; /* the user's mail address */
+char *personal_mail_name = NULL; /* the user's personal name mail */
+char *personal_type_map = NULL; /* .mailcap */
+char *pref_charset = NULL; /* preferred character set */
+char *proxyauth_info[2] =
+{NULL, NULL}; /* Id:Password for protected proxy servers */
+
+#ifdef USE_SESSIONS
+BOOLEAN LYAutoSession = FALSE; /* enable/disable auto saving/restoring of */
+
+ /* session */
+char *LYSessionFile = NULL; /* the session file from lynx.cfg */
+char *session_file = NULL; /* the current session file */
+char *sessionin_file = NULL; /* only resume session from this file */
+char *sessionout_file = NULL; /* only save session to this file */
+short session_limit = 250; /* maximal number of entries saved per */
+
+ /* session file, rest will be ignored */
+#endif /* USE_SESSIONS */
+char *startfile = NULL; /* the first file */
+char *startrealm = NULL; /* the startfile realm */
+char *system_mail = NULL; /* The path for sending mail */
+char *system_mail_flags = NULL; /* Flags for sending mail */
+char *x_display = NULL; /* display environment variable */
+
+HistInfo *history;
+int nhist = 0; /* number of used history entries */
+unsigned size_history; /* number of allocated history entries */
+
+LinkInfo links[MAXLINKS];
+
+BOOLEAN nomore = FALSE; /* display -more- string in statusline messages */
+int AlertSecs; /* time-delay for HTAlert() messages */
+int DelaySecs; /* time-delay for HTProgress messages */
+int InfoSecs; /* time-delay for Information messages */
+int LYMultiBookmarks = MULTI_BOOKMARK_SUPPORT;
+int LYStatusLine = -1; /* Line for statusline() if > -1 */
+int LYcols = DFT_COLS;
+int LYlines = DFT_ROWS;
+int MessageSecs; /* time-delay for important Messages */
+int ReplaySecs; /* time-delay for command-scripts */
+int crawl_count = 0; /* Starting number for lnk#.dat files in crawls */
+int dump_output_width = 0;
+int dump_server_status = 0;
+int lynx_temp_subspace = 0; /* > 0 if we made temp-directory */
+int max_cookies_domain = 50;
+int max_cookies_global = 500;
+int max_cookies_buffer = 4096;
+int max_uri_size = 8192;
+int nlinks = 0; /* number of links in memory */
+int outgoing_mail_charset = -1; /* translate mail to this charset */
+
+#ifndef DISABLE_BIBP
+BOOLEAN BibP_bibhost_available = FALSE; /* until check succeeds */
+BOOLEAN BibP_bibhost_checked = FALSE; /* until LYCheckBibHost */
+BOOLEAN no_goto_bibp = FALSE;
+char *BibP_bibhost = NULL; /* local server for bibp: links */
+char *BibP_globalserver = NULL; /* global server for bibp: links */
+#endif
+
+#ifdef USE_PERSISTENT_COOKIES
+BOOLEAN persistent_cookies = FALSE; /* disabled by default! */
+char *LYCookieFile = NULL; /* cookie read file */
+char *LYCookieSaveFile = NULL; /* cookie save file */
+#endif /* USE_PERSISTENT_COOKIES */
+
+#ifdef EXP_NESTED_TABLES
+BOOLEAN nested_tables =
+#if defined(USE_COLOR_STYLE)
+TRUE
+#else
+FALSE /* see 2001-08-15 */
+#endif
+ ;
+#endif
+
+BOOLEAN LYShowTransferRate = TRUE;
+int LYTransferRate = rateKB;
+int LYAcceptEncoding = encodingALL;
+int LYAcceptMedia = mediaOpt1;
+int LYContentType = contentTEXT;
+const char *ContentTypes[] =
+{
+ STR_BINARY,
+ STR_PLAINTEXT,
+ STR_HTML
+};
+char *LYTransferName = NULL;
+
+char *XLoadImageCommand = NULL; /* Default image viewer for X */
+BOOLEAN LYNoISMAPifUSEMAP = FALSE; /* Omit ISMAP link if MAP present? */
+int LYHiddenLinks = HIDDENLINKS_SEPARATE; /* Show hidden links? */
+
+char *SSL_cert_file = NULL; /* Default CA CERT file */
+char *SSL_client_cert_file = NULL;
+char *SSL_client_key_file = NULL;
+
+int HTprotocolLevel = HTTP_1_0;
+
+int Old_DTD = NO;
+static BOOLEAN DTD_recovery = NO;
+
+#ifndef NO_LYNX_TRACE
+FILE *LYTraceLogFP = NULL; /* Pointer for TRACE log */
+#endif
+char *LYTraceLogPath = NULL; /* Path for TRACE log */
+BOOLEAN LYUseTraceLog = USE_TRACE_LOG; /* Use a TRACE log? */
+
+#ifdef LY_FIND_LEAKS
+char LYLeaksPath[LY_MAXPATH];
+#endif
+
+BOOLEAN LYSeekFragMAPinCur = TRUE;
+BOOLEAN LYSeekFragAREAinCur = TRUE;
+BOOLEAN LYStripDotDotURLs = TRUE; /* Try to fix ../ in some URLs? */
+BOOLEAN LYForceSSLCookiesSecure = FALSE;
+BOOLEAN LYNoCc = FALSE;
+BOOLEAN LYPreparsedSource = FALSE; /* Show source as preparsed? */
+BOOLEAN LYPrependBaseToSource = TRUE;
+BOOLEAN LYPrependCharsetToSource = TRUE;
+BOOLEAN LYQuitDefaultYes = QUIT_DEFAULT_YES;
+BOOLEAN dont_wrap_pre = FALSE;
+
+int cookie_noprompt;
+int cookie_version = COOKIES_RFC_6265;
+
+#ifdef USE_SSL
+int ssl_noprompt = FORCE_PROMPT_DFT;
+#endif
+BOOLEAN conv_jisx0201kana = TRUE;
+BOOLEAN wait_viewer_termination = FALSE;
+
+int connect_timeout = 18000; /*=180000*0.1 - used in HTDoConnect.*/
+int reading_timeout = 18000; /*=180000*0.1 - used in HTDoConnect.*/
+
+#ifdef USE_JUSTIFY_ELTS
+BOOLEAN ok_justify = FALSE;
+int justify_max_void_percent = 35;
+#endif
+
+#ifdef USE_LOCALE_CHARSET
+BOOLEAN LYLocaleCharset = FALSE;
+#endif
+BOOLEAN assumed_charset = FALSE;
+
+#ifndef NO_DUMP_WITH_BACKSPACES
+BOOLEAN with_backspaces = FALSE;
+#endif
+
+#if defined(PDCURSES) && defined(PDC_BUILD) && PDC_BUILD >= 2401
+int scrsize_x = 0;
+int scrsize_y = 0;
+#endif
+
+BOOLEAN force_empty_hrefless_a = FALSE;
+
+#ifdef TEXTFIELDS_MAY_NEED_ACTIVATION
+BOOL textfields_need_activation = FALSE;
+BOOLEAN textfields_activation_option = FALSE;
+#endif
+
+BOOLEAN textfield_prompt_at_left_edge = FALSE;
+
+#ifdef MARK_HIDDEN_LINKS
+char *hidden_link_marker = NULL;
+#endif
+
+#ifdef DISP_PARTIAL
+BOOLEAN display_partial_flag = TRUE; /* Display document during download */
+BOOLEAN debug_display_partial = FALSE; /* Show with MessageSecs delay */
+int partial_threshold = -1; /* # of lines to be d/l'ed until we repaint */
+#endif
+
+char *socks5_proxy = NULL;
+
+BOOLEAN LYNonRestartingSIGWINCH = FALSE;
+BOOLEAN LYReuseTempfiles = FALSE;
+BOOLEAN LYUseBuiltinSuffixes = TRUE;
+
+int LYNoZapKey = 0; /* 0: off (do z checking), 1: full, 2: initially */
+
+#ifndef DISABLE_NEWS
+#include <HTNews.h>
+#endif
+
+BOOLEAN FileInitAlreadyDone = FALSE;
+
+#ifdef USE_PROGRAM_DIR
+char *program_dir = NULL;
+#endif
+
+static BOOLEAN stack_dump = FALSE;
+static char *terminal = NULL;
+static const char *pgm;
+static BOOLEAN no_numbers = FALSE;
+static BOOLEAN number_links = FALSE;
+static BOOLEAN number_fields = FALSE;
+static BOOLEAN LYPrependBase = FALSE;
+static HTList *LYStdinArgs = NULL;
+HTList *positionable_editor = NULL;
+
+#ifndef EXTENDED_OPTION_LOGIC
+/* if set then '--' will be recognized as the end of options */
+#define EXTENDED_OPTION_LOGIC 1
+#endif
+
+#ifndef EXTENDED_STARTFILE_RECALL
+/* if set then additional non-option args (before the last one) will be
+ made available for 'g'oto recall - kw */
+#define EXTENDED_STARTFILE_RECALL 1
+#endif
+
+#if EXTENDED_STARTFILE_RECALL
+static char *nonoption = 0;
+#endif
+
+#ifndef OPTNAME_ALLOW_DASHES
+/* if set, then will allow dashes and underscores to be used interchangeable
+ in commandline option's names - VH */
+#define OPTNAME_ALLOW_DASHES 1
+#endif
+
+static BOOL parse_arg(char **arg, unsigned mask, int *countp);
+static GCC_NORETURN void print_help_and_exit(int exit_status);
+static void print_help_strings(const char *name,
+ const char *help,
+ const char *value,
+ int option);
+
+#ifndef VMS
+BOOLEAN LYNoCore = NO_FORCED_CORE_DUMP;
+BOOLEAN restore_sigpipe_for_children = FALSE;
+static void FatalProblem(int sig);
+#endif /* !VMS */
+
+#if defined(USE_COLOR_STYLE)
+int LYuse_color_style = TRUE;
+char *lynx_lss_file = NULL; /* from config-file, etc. */
+static char *lynx_lss_file2 = NULL; /* from command-line options */
+const char *default_color_styles = "\
+lynx.lss;\
+blue-background.lss;\
+bright-blue.lss;\
+midnight.lss;\
+mild-colors.lss;\
+opaque.lss\
+";
+#endif
+
+#ifdef USE_DEFAULT_COLORS
+BOOLEAN LYuse_default_colors = TRUE;
+#endif
+
+#ifdef __DJGPP__
+static void LY_set_ctrl_break(int setting)
+{
+ (void) signal(SIGINT, (setting ? SIG_DFL : SIG_IGN));
+ setcbrk(setting);
+}
+
+static int LY_get_ctrl_break(void)
+{
+ __dpmi_regs regs;
+
+ regs.h.ah = 0x33;
+ regs.h.al = 0x00;
+ __dpmi_int(0x21, &regs);
+ return ((int) regs.h.dl);
+}
+
+static void reset_break(void)
+{
+ LY_set_ctrl_break(init_ctrl_break[0]);
+}
+#endif /* __DJGPP__ */
+
+#if defined(WIN_EX)
+static int is_windows_nt(void)
+{
+ DWORD version;
+
+ version = GetVersion();
+ if ((version & 0x80000000) == 0)
+ return 1;
+ else
+ return 0;
+}
+#endif
+
+#ifdef LY_FIND_LEAKS
+static void free_lynx_globals(void)
+{
+ int i;
+
+#if defined(USE_COLOR_STYLE)
+ clear_lss_list();
+#endif
+ FREE(ftp_format);
+#ifndef VMS
+ FREE(list_format);
+#ifdef LYNXCGI_LINKS /* WebSter Mods -jkt */
+ FREE(LYCgiDocumentRoot);
+#endif /* LYNXCGI_LINKS */
+ free_lynx_cfg();
+#endif /* !VMS */
+
+#ifdef SYSLOG_REQUESTED_URLS
+ FREE(syslog_txt);
+#endif
+
+#ifdef VMS
+ Define_VMSLogical("LYNX_VERSION", "");
+#else
+ (void) putenv("LYNX_VERSION=" LYNX_VERSION);
+#endif /* VMS */
+#ifndef VMS
+ FREE(lynx_version_putenv_command);
+#endif
+
+#if USE_VMS_MAILER
+ FREE(mail_adrs);
+#endif
+
+ FREE(LynxHome);
+ FREE(history);
+ FREE(homepage);
+ FREE(original_dir);
+ FREE(startfile);
+ FREE(helpfile);
+ FREE(helpfilepath);
+ FREE(jumpprompt);
+#ifdef JUMPFILE
+ FREE(jumpfile);
+#endif /* JUMPFILE */
+ FREE(indexfile);
+ FREE(x_display);
+ FREE(global_type_map);
+ FREE(personal_type_map);
+ FREE(global_extension_map);
+ FREE(personal_extension_map);
+ FREE(language);
+ FREE(pref_charset);
+ FREE(LynxSigFile);
+ FREE(system_mail);
+ FREE(system_mail_flags);
+#ifndef DISABLE_BIBP
+ FREE(BibP_bibhost);
+ FREE(BibP_globalserver);
+#endif
+#ifdef USE_PERSISTENT_COOKIES
+ FREE(LYCookieFile);
+ FREE(LYCookieSaveFile);
+#endif
+ FREE(LYCookieAcceptDomains);
+ FREE(LYCookieRejectDomains);
+ FREE(LYCookieLooseCheckDomains);
+ FREE(LYCookieStrictCheckDomains);
+ FREE(LYCookieQueryCheckDomains);
+ FREE(LYUserAgent);
+ FREE(LYUserAgentDefault);
+ FREE(LYHostName);
+ FREE(LYLocalDomain);
+ FREE(lynx_save_space);
+ FREE(bookmark_page);
+ FREE(BookmarkPage);
+ for (i = 0; i <= MBM_V_MAXFILES; i++) {
+ FREE(MBM_A_subbookmark[i]);
+ FREE(MBM_A_subdescript[i]);
+ }
+ FREE(editor);
+ FREE(authentication_info[0]);
+ FREE(authentication_info[1]);
+ FREE(proxyauth_info[0]);
+ FREE(proxyauth_info[1]);
+ FREE(lynxjumpfile);
+#ifndef DISABLE_FTP
+ FREE(ftp_lasthost);
+ LYFreeStringList(broken_ftp_epsv);
+ LYFreeStringList(broken_ftp_retr);
+#endif
+ FREE(startrealm);
+ FREE(personal_mail_address);
+ FREE(personal_mail_name);
+ FREE(anonftp_password);
+ FREE(URLDomainPrefixes);
+ FREE(URLDomainSuffixes);
+ FREE(XLoadImageCommand);
+ FREE(lynx_temp_space);
+ FREE(LYTransferName);
+ FREE(LYTraceLogPath);
+ FREE(lynx_cfg_file);
+ FREE(SSL_cert_file);
+ FREE(SSL_client_cert_file);
+ FREE(SSL_client_key_file);
+#if defined(USE_COLOR_STYLE)
+ FREE(lynx_lss_file2);
+ FREE(lynx_lss_file);
+#endif
+ FREE(UCAssume_MIMEcharset);
+ LYUIPages_free();
+ LYFreeHilites(0, nlinks);
+ nlinks = 0;
+ LYFreeStringList(LYcommandList());
+ HTInitProgramPaths(FALSE);
+#if EXTENDED_STARTFILE_RECALL
+ FREE(nonoption);
+#endif
+ LYFreeStringList(positionable_editor);
+
+ return;
+}
+#endif /* LY_FIND_LEAKS */
+
+/*
+ * This function frees the LYStdinArgs list. - FM
+ */
+static void LYStdinArgs_free(void)
+{
+ LYFreeStringList(LYStdinArgs);
+ LYStdinArgs = NULL;
+}
+
+void reset_signals(void)
+{
+#ifndef NOSIGHUP
+ (void) signal(SIGHUP, SIG_DFL);
+#endif /* NOSIGHUP */
+ (void) signal(SIGTERM, SIG_DFL);
+#ifndef VMS
+ (void) signal(SIGINT, SIG_DFL);
+#endif /* !VMS */
+#ifdef SIGTSTP
+ if (no_suspend)
+ (void) signal(SIGTSTP, SIG_DFL);
+#endif /* SIGTSTP */
+}
+
+void exit_immediately(int code)
+{
+ reset_signals();
+ exit(code);
+}
+
+#ifdef EBCDIC
+static void FixCharacters(void)
+{
+ int c;
+ int work1[256], work2[256];
+
+ for (c = 0; c < 256; c++) {
+ work1[c] = keymap[c + 1];
+ work2[c] = key_override[c + 1];
+ }
+ for (c = 0; c < 256; c++) {
+ keymap[IBM1047[c] + 1] = work1[c];
+ key_override[IBM1047[c] + 1] = work2[c];
+ }
+}
+#endif /* EBCDIC */
+
+static BOOL GetStdin(char **buf,
+ int marker)
+{
+ if (LYSafeGets(buf, stdin) != 0
+ && (!marker || StrNCmp(*buf, "---", 3) != 0)) {
+ LYTrimTrailing(*buf);
+ CTRACE((tfp, "...data: %s\n", *buf));
+ return TRUE;
+ }
+ CTRACE((tfp, "...mark: %s\n", *buf ? *buf : ""));
+ return FALSE;
+}
+
+#ifdef WIN32
+static BOOL cleanup_win32(DWORD fdwCtrlType)
+{
+ switch (fdwCtrlType) {
+ case CTRL_CLOSE_EVENT:
+ cleanup_sig(-1);
+ return TRUE;
+ default:
+ return FALSE;
+ }
+}
+#endif
+
+/*
+ * Append the SSL version to lynx version or user-agent string.
+ */
+#ifdef USE_SSL
+static void append_ssl_version(char **target,
+ const char *separator)
+{
+ char SSLLibraryVersion[256];
+ char *SSLcp;
+
+ HTSprintf(target, " SSL-MM%s1.4.1", separator);
+
+#undef LYNX_SSL_VERSION
+
+#if defined(SSLEAY_VERSION)
+#define LYNX_SSL_VERSION SSLeay_version(SSLEAY_VERSION)
+#elif defined(OPENSSL_VERSION_TEXT)
+#define LYNX_SSL_VERSION OPENSSL_VERSION_TEXT
+#elif defined(GNUTLS_VERSION)
+#define LYNX_SSL_VERSION "GNUTLS " GNUTLS_VERSION " "
+#endif
+
+#ifdef LYNX_SSL_VERSION
+ if (*separator == ' ')
+ StrAllocCat(*target, ",");
+ LYStrNCpy(SSLLibraryVersion, LYNX_SSL_VERSION, sizeof(SSLLibraryVersion) - 1);
+ if ((SSLcp = StrChr(SSLLibraryVersion, ' ')) != NULL) {
+ *SSLcp++ = *separator;
+ if ((SSLcp = StrChr(SSLcp, ' ')) != NULL) {
+ *SSLcp = '\0';
+ StrAllocCat(*target, " ");
+ StrAllocCat(*target, SSLLibraryVersion);
+ }
+ }
+#endif /* LYNX_SSL_VERSION */
+}
+#endif /* USE_SSL */
+
+/* Set the text message domain. */
+void LYSetTextDomain(void)
+{
+#if defined(HAVE_LIBINTL_H) || defined(HAVE_LIBGETTEXT_H)
+ const char *cp;
+
+ if ((cp = LYGetEnv("LYNX_LOCALEDIR")) == 0) {
+#ifdef USE_PROGRAM_DIR
+ char *localedir = NULL;
+
+ HTSprintf0(&localedir, "%s\\locale", program_dir);
+ cp = localedir;
+#else
+ cp = LOCALEDIR;
+#endif
+ }
+ bindtextdomain(NLS_TEXTDOMAIN, cp);
+ textdomain(NLS_TEXTDOMAIN);
+#endif
+}
+
+static void SetLocale(void)
+{
+#ifdef LOCALE
+ /*
+ * LOCALE support for international characters.
+ */
+ setlocale(LC_ALL, "");
+#endif /* LOCALE */
+ LYSetTextDomain();
+}
+
+/*
+ * Wow! Someone wants to start up Lynx.
+ */
+int main(int argc,
+ char **argv)
+{
+ int i; /* indexing variable */
+ int status = 0; /* exit status */
+ char *temp = NULL;
+ const char *ccp;
+ char *cp;
+ FILE *fp;
+ struct stat dir_info;
+ char filename[LY_MAXPATH];
+ BOOL LYGetStdinArgs = FALSE;
+
+#ifdef _WINDOWS
+ WSADATA WSAData;
+#endif /* _WINDOWS */
+
+ /*
+ * Just in case someone has the idea to install lynx set-uid, let's try
+ * to discourage it.
+ */
+#if defined(GETUID) && defined(SETUID)
+ setuid(getuid());
+#endif
+
+#ifdef LY_FIND_LEAKS
+ /*
+ * Register the final function to be executed when being exited. Will
+ * display memory leaks if the -find-leaks option is used. This should
+ * be the first call to atexit() for leak-checking, which ensures that
+ * all of the other functions will be invoked before LYLeaks().
+ */
+ atexit(LYLeaks);
+ /*
+ * Register the function which will free our allocated globals.
+ */
+ atexit(free_lynx_globals);
+
+ LYAddPathToHome(LYLeaksPath, (size_t) LY_MAXPATH, LEAKAGE_SINK);
+#endif /* LY_FIND_LEAKS */
+
+#ifdef NOT_ASCII
+ FixCharacters();
+#endif /* NOT_ASCII */
+
+#ifndef DISABLE_FTP
+ /* malloc a sizeof(char) so 1st strcmp() won't dump in HTLoadFile() */
+ ftp_lasthost = typecalloc(char);
+#endif
+
+ LYinitEditmap();
+ LYinitKeymap();
+#ifdef USE_CHARSET_CHOICE
+ memset((char *) charset_subsets, 0, sizeof(charset_subset_t) * MAXCHARSETS);
+#endif
+
+#ifdef _WINDOWS
+ {
+ int err;
+ WORD wVerReq;
+
+ wVerReq = MAKEWORD(1, 1);
+
+ err = WSAStartup(wVerReq, &WSAData);
+ if (err != 0) {
+ puts(gettext("No Winsock found, sorry."));
+ sleep(5);
+ return 1;
+ }
+ }
+
+ /* 1998/09/03 (Thu) 22:02:32 */
+ InitializeCriticalSection(&critSec_READ);
+
+#endif /* _WINDOWS */
+
+#if defined(WIN_EX)
+ /* 1997/10/19 (Sun) 21:40:54 */
+ system_is_NT = (BOOL) is_windows_nt();
+
+ /* 1998/01/13 (Tue) 21:13:47 */
+ GetWindowsDirectory(filename, sizeof filename);
+ windows_drive[0] = filename[0];
+ windows_drive[1] = filename[1];
+ windows_drive[2] = '\0';
+#endif
+
+#ifdef __DJGPP__
+ if (LY_get_ctrl_break() == 0) {
+ LY_set_ctrl_break(TRUE);
+ init_ctrl_break[0] = 0;
+ } else {
+ init_ctrl_break[0] = 1;
+ }
+ __djgpp_set_sigquit_key(0x082D); /* Bind ALT-X to SIGQUIT */
+ signal(SIGQUIT, cleanup_sig);
+ atexit(reset_break);
+
+ if (((ccp = LYGetEnv("SHELL")) != NULL)
+ && (strstr(LYPathLeaf(ccp), "sh") != NULL))
+ dj_is_bash = TRUE;
+#endif /* __DJGPP__ */
+
+ /*
+ * To prevent corrupting binary data on DOS, MS-WINDOWS or OS/2
+ * we open files and stdout in BINARY mode by default.
+ * Where necessary we should open and (close!) TEXT mode.
+ * (use LYNewTxtFile/LYAppendToTxtFile to open text files for writing)
+ */
+ SetDefaultMode(O_BINARY);
+ SetOutputMode(O_BINARY);
+
+#ifdef DOSPATH
+ if (LYGetEnv("TERM") == NULL)
+ putenv("TERM=vt100");
+#endif
+
+ LYShowColor = (SHOW_COLOR ? SHOW_COLOR_ON : SHOW_COLOR_OFF);
+ /*
+ * Set up the argument list.
+ */
+ pgm = argv[0];
+ cp = NULL;
+#ifdef USE_PROGRAM_DIR
+ StrAllocCopy(program_dir, pgm);
+ if ((cp = strrchr(program_dir, '\\')) != NULL) {
+ *cp = '\0';
+ } else {
+ FREE(program_dir);
+ StrAllocCopy(program_dir, ".");
+ }
+#endif
+ if ((cp = LYLastPathSep(pgm)) != NULL) {
+ pgm = cp + 1;
+ }
+
+ /*
+ * Set up trace, the anonymous account defaults, validate restrictions,
+ * and/or the nosocks flag, if requested, and an alternate configuration
+ * file, if specified, NOW. Also, if we only want the help menu, output
+ * that and exit. - FM
+ */
+#ifndef NO_LYNX_TRACE
+ if (LYGetEnv("LYNX_TRACE") != 0) {
+ WWW_TraceFlag = TRUE;
+ }
+#endif
+
+ /*
+ * Set up the TRACE log path, and logging if appropriate. - FM
+ */
+ if ((ccp = LYGetEnv("LYNX_TRACE_FILE")) == 0)
+ ccp = FNAME_LYNX_TRACE;
+ LYTraceLogPath = typeMallocn(char, LY_MAXPATH);
+
+ LYAddPathToHome(LYTraceLogPath, (size_t) LY_MAXPATH, ccp);
+
+ /*
+ * Act on -version, -trace and -trace-mask NOW.
+ */
+ for (i = 1; i < argc; i++) {
+ parse_arg(&argv[i], 1, &i);
+ }
+ LYOpenTraceLog();
+
+ SetLocale();
+
+ /*
+ * Initialize our startup and global variables.
+ */
+#ifdef ULTRIX
+ /*
+ * Need this for Ultrix.
+ */
+ terminal = LYGetEnv("TERM");
+ if ((terminal == NULL) || !strncasecomp(terminal, "xterm", 5))
+ terminal = "vt100";
+#endif /* ULTRIX */
+ /*
+ * Zero the links and history struct arrays.
+ */
+ memset((void *) links, 0, sizeof(LinkInfo) * MAXLINKS);
+ LYAllocHistory(8);
+ /*
+ * Zero the MultiBookmark arrays.
+ */
+ memset((void *) MBM_A_subbookmark, 0, sizeof(char *) * (MBM_V_MAXFILES + 1));
+ memset((void *) MBM_A_subdescript, 0, sizeof(char *) * (MBM_V_MAXFILES + 1));
+
+#ifndef VMS
+ StrAllocCopy(list_format, LIST_FORMAT);
+ StrAllocCopy(ftp_format, FTP_FORMAT);
+#endif /* !VMS */
+
+ AlertSecs = SECS2Secs(ALERTSECS);
+ DelaySecs = SECS2Secs(DEBUGSECS);
+ InfoSecs = SECS2Secs(INFOSECS);
+ MessageSecs = SECS2Secs(MESSAGESECS);
+ ReplaySecs = SECS2Secs(REPLAYSECS);
+
+ StrAllocCopy(LYTransferName, "KiB");
+ StrAllocCopy(helpfile, HELPFILE);
+ StrAllocCopy(startfile, STARTFILE);
+ LYEscapeStartfile(&startfile);
+ StrAllocCopy(indexfile, DEFAULT_INDEX_FILE);
+ StrAllocCopy(global_type_map, GLOBAL_MAILCAP);
+ StrAllocCopy(personal_type_map, PERSONAL_MAILCAP);
+ StrAllocCopy(global_extension_map, GLOBAL_EXTENSION_MAP);
+ StrAllocCopy(personal_extension_map, PERSONAL_EXTENSION_MAP);
+ StrAllocCopy(language, PREFERRED_LANGUAGE);
+ StrAllocCopy(pref_charset, PREFERRED_CHARSET);
+ StrAllocCopy(system_mail, SYSTEM_MAIL);
+ StrAllocCopy(system_mail_flags, SYSTEM_MAIL_FLAGS);
+
+ StrAllocCopy(LYUserAgent, LYNX_NAME);
+ StrAllocCat(LYUserAgent, "/");
+ StrAllocCat(LYUserAgent, LYNX_VERSION);
+ if (HTLibraryVersion) {
+ StrAllocCat(LYUserAgent, " libwww-FM/");
+ StrAllocCat(LYUserAgent, HTLibraryVersion);
+ }
+#ifdef USE_SSL
+ append_ssl_version(&LYUserAgent, "/");
+#endif /* USE_SSL */
+ StrAllocCopy(LYUserAgentDefault, LYUserAgent);
+
+#ifdef VMS
+ Define_VMSLogical("LYNX_VERSION", LYNX_VERSION);
+#else
+ StrAllocCopy(lynx_version_putenv_command, "LYNX_VERSION=");
+ StrAllocCat(lynx_version_putenv_command, LYNX_VERSION);
+ (void) putenv(lynx_version_putenv_command);
+ /* Note: you must not free the data passed to 'putenv()' until you give it
+ * a new value for that variable.
+ */
+#endif /* VMS */
+
+ if ((ccp = LYGetEnv("LYNX_TEMP_SPACE")) != NULL)
+ StrAllocCopy(lynx_temp_space, ccp);
+#if defined (UNIX) || defined (__DJGPP__)
+ else if ((ccp = LYGetEnv("TMPDIR")) != NULL)
+ StrAllocCopy(lynx_temp_space, ccp);
+#endif
+#if defined (DOSPATH) || defined (__EMX__)
+ else if ((ccp = LYGetEnv("TEMP")) != NULL)
+ StrAllocCopy(lynx_temp_space, ccp);
+ else if ((ccp = LYGetEnv("TMP")) != NULL)
+ StrAllocCopy(lynx_temp_space, ccp);
+#endif
+ else {
+#if defined(USE_PROGRAM_DIR)
+ StrAllocCopy(lynx_temp_space, program_dir);
+#elif defined(TEMP_SPACE)
+ StrAllocCopy(lynx_temp_space, TEMP_SPACE);
+#else
+ puts(gettext("You MUST define a valid TMP or TEMP area!"));
+ exit_immediately(EXIT_FAILURE);
+#endif
+ }
+
+#ifdef WIN_EX /* for Windows 2000 ... 1999/08/23 (Mon) 08:24:35 */
+ if (access(lynx_temp_space, 0) != 0)
+#endif
+ LYTildeExpand(&lynx_temp_space, TRUE);
+
+ if ((cp = strstr(lynx_temp_space, "$USER")) != NULL) {
+ char *cp1;
+
+ if ((cp1 = LYGetEnv("USER")) != NULL) {
+ *cp = '\0';
+ StrAllocCopy(temp, lynx_temp_space);
+ *cp = '$';
+ StrAllocCat(temp, cp1);
+ cp += 5;
+ StrAllocCat(temp, cp);
+ StrAllocCopy(lynx_temp_space, temp);
+ FREE(temp);
+ }
+ }
+#ifdef VMS
+ LYLowerCase(lynx_temp_space);
+ if (StrChr(lynx_temp_space, '/') != NULL) {
+ if (strlen(lynx_temp_space) == 1) {
+ StrAllocCopy(lynx_temp_space, "sys$scratch:");
+ } else {
+ LYAddPathSep(&lynx_temp_space);
+ StrAllocCopy(temp, HTVMS_name("", lynx_temp_space));
+ StrAllocCopy(lynx_temp_space, temp);
+ FREE(temp);
+ }
+ }
+ if (StrChr(lynx_temp_space, ':') == NULL &&
+ StrChr(lynx_temp_space, ']') == NULL) {
+ StrAllocCat(lynx_temp_space, ":");
+ }
+#else
+ LYAddPathSep(&lynx_temp_space);
+ StrAllocCopy(lynx_temp_space, HTSYS_name(lynx_temp_space));
+#endif /* VMS */
+
+ if ((HTStat(lynx_temp_space, &dir_info) < 0
+#if defined(MULTI_USER_UNIX)
+ && mkdir(lynx_temp_space, 0700) < 0
+#endif
+ )
+ || !S_ISDIR(dir_info.st_mode)) {
+ fprintf(stderr, "%s: %s\n",
+ lynx_temp_space,
+ gettext("No such directory"));
+ exit_immediately(EXIT_FAILURE);
+ }
+#if USE_VMS_MAILER
+#ifndef MAIL_ADRS
+#define MAIL_ADRS "\"IN%%\"\"%s\"\"\""
+#endif
+ StrAllocCopy(mail_adrs, MAIL_ADRS);
+#endif
+
+#ifdef LYNX_HOST_NAME
+ StrAllocCopy(LYHostName, LYNX_HOST_NAME);
+#else
+ StrAllocCopy(LYHostName, HTHostName());
+#endif /* LYNX_HOST_NAME */
+
+ StrAllocCopy(LYLocalDomain, LOCAL_DOMAIN);
+ StrAllocCopy(URLDomainPrefixes, URL_DOMAIN_PREFIXES);
+ StrAllocCopy(URLDomainSuffixes, URL_DOMAIN_SUFFIXES);
+ StrAllocCopy(XLoadImageCommand, XLOADIMAGE_COMMAND);
+ StrAllocCopy(SSL_cert_file, SSL_CERT_FILE);
+
+#ifndef DISABLE_BIBP
+ StrAllocCopy(BibP_globalserver, BIBP_GLOBAL_SERVER);
+ StrAllocCopy(BibP_bibhost, "http://bibhost/"); /* protocol specified. */
+#endif
+
+ /*
+ * Disable news posting if the compilation-based LYNewsPosting value is
+ * FALSE. This may be changed further down via lynx.cfg or the
+ * -restriction command line switch. - FM
+ */
+#ifndef DISABLE_NEWS
+ no_newspost = (BOOL) (LYNewsPosting == FALSE);
+#endif
+
+ for (i = 1; i < argc; i++) {
+ parse_arg(&argv[i], 2, &i);
+ }
+
+ /*
+ * If we have a lone "-" switch for getting arguments from stdin, get them
+ * NOW, and act on the relevant ones, saving the others into an HTList for
+ * handling after the other initializations. The primary purpose of this
+ * feature is to allow for the potentially very long command line that can
+ * be associated with post or get data. The original implementation
+ * required that the lone "-" be the only command line argument, but that
+ * precluded its use when the lynx command is aliased with other arguments.
+ * When interactive, the stdin input is terminated by by Control-D on Unix
+ * or Control-Z on VMS, and each argument is terminated by a RETURN. When
+ * the argument is -get_data or -post_data, the data are terminated by a
+ * "---" string, alone on the line (also terminated by RETURN). - FM
+ */
+ for (i = 1; i < argc; i++) {
+ if (strcmp(argv[i], "-") == 0) {
+ LYGetStdinArgs = TRUE;
+ break;
+ }
+ }
+ if (LYGetStdinArgs == TRUE) {
+ char *buf = NULL;
+
+ CTRACE((tfp, "processing stdin arguments\n"));
+ while (GetStdin(&buf, TRUE)) {
+ char *noargv[2];
+
+ noargv[0] = buf;
+ noargv[1] = NULL;
+ LYTrimTrailing(buf);
+
+ if (parse_arg(&noargv[0], 2, (int *) 0) == FALSE
+ && buf[0] != '\0') {
+ char *argument = NULL;
+
+ if (LYStdinArgs == NULL) {
+ LYStdinArgs = HTList_new();
+#ifdef LY_FIND_LEAKS
+ atexit(LYStdinArgs_free);
+#endif
+ }
+ StrAllocCopy(argument, buf);
+ HTList_appendObject(LYStdinArgs, argument);
+ CTRACE((tfp, "...StdinArg:%s\n", argument));
+ } else {
+ CTRACE((tfp, "...complete:%s\n", buf));
+ }
+ }
+ CTRACE((tfp, "...done with stdin arguments\n"));
+ FREE(buf);
+ }
+#ifdef SOCKS
+ if (socks_flag)
+ SOCKSinit(argv[0]);
+#endif /* SOCKS */
+
+ /*
+ * If we had -validate set all of the restrictions and disallow a TRACE log
+ * NOW. - FM
+ */
+ if (LYValidate == TRUE) {
+ parse_restrictions("all");
+ LYUseTraceLog = FALSE;
+ }
+
+ /*
+ * If we didn't get and act on a -validate or -anonymous switch, but can
+ * verify that this is the anonymous account, set the default restrictions
+ * for that account and disallow a TRACE log NOW. - FM
+ */
+ if (!LYValidate && !LYRestricted &&
+ strlen(ANONYMOUS_USER) > 0 &&
+#if defined (VMS) || defined (NOUSERS)
+ !strcasecomp((LYGetEnv("USER") == NULL ? " " : LYGetEnv("USER")),
+ ANONYMOUS_USER)
+#else
+#ifdef HAVE_CUSERID
+ STREQ((char *) cuserid((char *) NULL), ANONYMOUS_USER)
+#else
+ STREQ(((char *) getlogin() == NULL ? " " : getlogin()), ANONYMOUS_USER)
+#endif /* HAVE_CUSERID */
+#endif /* VMS */
+ ) {
+ parse_restrictions("default");
+ LYRestricted = TRUE;
+ LYUseTraceLog = FALSE;
+ }
+#ifdef USE_CMD_LOGGING
+ /*
+ * Open command-script, if specified
+ */
+ if (non_empty(lynx_cmd_script)) {
+ LYTildeExpand(&lynx_cmd_script, TRUE);
+ LYOpenCmdScript();
+ }
+ /*
+ * Open command-logging, if specified
+ */
+ if (non_empty(lynx_cmd_logfile)) {
+ LYTildeExpand(&lynx_cmd_logfile, TRUE);
+ LYOpenCmdLogfile(argc, argv);
+ }
+#endif
+
+ /*
+ * Set up the default jump file stuff. - FM
+ */
+ StrAllocCopy(jumpprompt, JUMP_PROMPT);
+#ifdef JUMPFILE
+ StrAllocCopy(jumpfile, JUMPFILE);
+ {
+ temp = NULL;
+ HTSprintf0(&temp, "JUMPFILE:%s", jumpfile);
+ if (!LYJumpInit(temp)) {
+ CTRACE((tfp, "Failed to register %s\n", temp));
+ }
+ FREE(temp);
+ }
+#endif /* JUMPFILE */
+
+ /*
+ * If no alternate configuration file was specified on the command line,
+ * see if it's in the environment.
+ */
+ if (isEmpty(lynx_cfg_file)) {
+ if (((cp = LYGetEnv("LYNX_CFG")) != NULL) ||
+ (cp = LYGetEnv("lynx_cfg")) != NULL)
+ StrAllocCopy(lynx_cfg_file, cp);
+ }
+#ifdef USE_PROGRAM_DIR
+ if (isEmpty(lynx_cfg_file)) {
+ HTSprintf0(&lynx_cfg_file, "%s\\lynx.cfg", program_dir);
+ if (!LYCanReadFile(lynx_cfg_file)) {
+ FREE(lynx_cfg_file);
+ lynx_cfg_file = NULL;
+ }
+ }
+#endif
+
+ /*
+ * If we still don't have a configuration file, use the userdefs.h
+ * definition.
+ */
+ if (isEmpty(lynx_cfg_file))
+ StrAllocCopy(lynx_cfg_file, LYNX_CFG_FILE);
+
+#ifndef _WINDOWS /* avoid the whole ~ thing for now */
+ LYTildeExpand(&lynx_cfg_file, FALSE);
+#endif
+
+ /*
+ * If the configuration file is not available, inform the user and exit.
+ */
+ if (!LYCanReadFile(lynx_cfg_file)) {
+ fprintf(stderr,
+ gettext("\nConfiguration file \"%s\" is not available.\n\n"),
+ lynx_cfg_file);
+ exit_immediately(EXIT_FAILURE);
+ }
+
+ /*
+ * Make sure we have the character sets declared. This will initialize the
+ * CHARTRANS handling. - KW
+ */
+ if (!LYCharSetsDeclared()) {
+ fprintf(stderr, gettext("\nLynx character sets not declared.\n\n"));
+ exit_immediately(EXIT_FAILURE);
+ }
+ /*
+ * (**) in Lynx, UCLYhndl_HTFile_for_unspec and UCLYhndl_for_unrec may be
+ * valid or not, but current_char_set and UCLYhndl_for_unspec SHOULD ALWAYS
+ * be a valid charset. Initialized here and may be changed later from
+ * lynx.cfg/command_line/options_menu. - LP (**)
+ */
+ /*
+ * Set up the compilation default character set. - FM
+ */
+#ifdef CAN_AUTODETECT_DISPLAY_CHARSET
+ if (auto_display_charset >= 0)
+ current_char_set = auto_display_charset;
+ else
+#endif
+ current_char_set = safeUCGetLYhndl_byMIME(CHARACTER_SET);
+ /*
+ * Set up HTTP default for unlabeled charset (iso-8859-1).
+ */
+ UCLYhndl_for_unspec = LATIN1;
+ StrAllocCopy(UCAssume_MIMEcharset,
+ LYCharSet_UC[UCLYhndl_for_unspec].MIMEname);
+
+#ifdef USE_COLOR_TABLE
+ /*
+ * Set up default foreground and background colors.
+ */
+ lynx_setup_colors();
+#endif /* USE_COLOR_TABLE */
+
+ /*
+ * Set the original directory, used for default download
+ */
+ if (!strcmp(Current_Dir(filename), ".")) {
+ if ((cp = LYGetEnv("PWD")) != 0)
+ StrAllocCopy(original_dir, cp);
+ } else {
+ StrAllocCopy(original_dir, filename);
+ }
+
+ /*
+ * Set the compilation default signature file. - FM
+ */
+ LYStrNCpy(filename, LYNX_SIG_FILE, sizeof(filename) - 1);
+ if (LYPathOffHomeOK(filename, sizeof(filename))) {
+ StrAllocCopy(LynxSigFile, filename);
+ LYAddPathToHome(filename, sizeof(filename), LynxSigFile);
+ StrAllocCopy(LynxSigFile, filename);
+ CTRACE((tfp, "LYNX_SIG_FILE set to '%s'\n", LynxSigFile));
+ } else {
+ CTRACE((tfp, "LYNX_SIG_FILE '%s' is bad. Ignoring.\n", LYNX_SIG_FILE));
+ }
+
+#ifdef USE_PRETTYSRC
+ /*this is required for checking the tagspecs when parsing cfg file by
+ LYReadCFG.c:parse_html_src_spec -HV */
+ HTSwitchDTD(TRUE);
+#endif
+ /*
+ * Process the configuration file.
+ */
+ read_cfg(lynx_cfg_file, "main program", 1, (FILE *) 0);
+
+ {
+ static char *client_keyfile = NULL;
+ static char *client_certfile = NULL;
+
+ if ((client_keyfile = LYGetEnv("SSL_CLIENT_KEY_FILE")) != NULL) {
+ CTRACE((tfp,
+ "HTGetSSLHandle: client keyfile is set to %s by SSL_CLIENT_KEY_FILE\n",
+ client_keyfile));
+ StrAllocCopy(SSL_client_key_file, client_keyfile);
+ }
+
+ if ((client_certfile = LYGetEnv("SSL_CLIENT_CERT_FILE")) != NULL) {
+ CTRACE((tfp,
+ "HTGetSSLHandle: client certfile is set to %s by SSL_CLIENT_CERT_FILE\n",
+ client_certfile));
+ StrAllocCopy(SSL_client_cert_file, client_certfile);
+ }
+ }
+
+#if defined(USE_COLOR_STYLE)
+ if (!dump_output_immediately) {
+ init_color_styles(&lynx_lss_file2, default_color_styles);
+ }
+#endif /* USE_COLOR_STYLE */
+
+ /*
+ * Process the RC file.
+ */
+ read_rc(NULL);
+
+#ifdef USE_LOCALE_CHARSET
+ LYFindLocaleCharset();
+#endif
+
+ /*
+ * Get WWW_HOME environment variable if it exists.
+ */
+ if ((cp = LYGetEnv("WWW_HOME")) != NULL) {
+ StrAllocCopy(startfile, cp);
+ LYEscapeStartfile(&startfile);
+ }
+
+ /*
+ * Set the LynxHome URL. If it's a file URL and the
+ * host is defaulted, force in "//localhost", and if
+ * it's not an absolute URL, make it one. - FM
+ */
+ StrAllocCopy(LynxHome, startfile);
+ LYEnsureAbsoluteURL(&LynxHome, "LynxHome", FALSE);
+
+ /*
+ * Process any command line arguments not already handled. - FM
+ * May set startfile as a side-effect.
+ */
+ for (i = 1; i < argc; i++) {
+ parse_arg(&argv[i], 4, &i);
+ }
+
+ /*
+ * Process any stdin-derived arguments for a lone "-" which we've loaded
+ * into LYStdinArgs. - FM
+ */
+ if (LYStdinArgs != NULL) {
+ char *my_args[2];
+ HTList *cur = LYStdinArgs;
+
+ my_args[1] = NULL;
+ while (NULL != (my_args[0] = (char *) HTList_nextObject(cur))) {
+ parse_arg(my_args, 4, (int *) 0);
+ }
+ LYStdinArgs_free();
+ }
+#ifdef HAVE_TTYNAME
+ /*
+ * If the input is not a tty, we are either running in cron, or are
+ * getting input via a pipe:
+ *
+ * a) in cron, none of stdin/stdout/stderr are tty's.
+ * b) from a pipe, we should have either "-" or "-stdin" options.
+ */
+ if (!LYGetStdinArgs
+ && !startfile_stdin
+ && !isatty(fileno(stdin))
+ && (isatty(fileno(stdout) || isatty(fileno(stderr))))) {
+ int ignored = 0;
+
+ while (fgetc(stdin) != EOF) {
+ ++ignored;
+ }
+ if (ignored) {
+ fprintf(stderr,
+ gettext("Ignored %d characters from standard input.\n"), ignored);
+ fprintf(stderr,
+ gettext("Use \"-stdin\" or \"-\" to tell how to handle piped input.\n"));
+ }
+ }
+#endif /* HAVE_TTYNAME */
+
+#ifdef CAN_SWITCH_DISPLAY_CHARSET
+ if (current_char_set == auto_display_charset) /* Better: explicit option */
+ switch_display_charsets = 1;
+#endif
+
+#if defined (TTY_DEVICE) || defined(HAVE_TTYNAME)
+ /*
+ * If we are told to read the startfile from standard input, do it now,
+ * after we have read all of the option data from standard input.
+ * Later we'll use LYReopenInput().
+ */
+ if (startfile_stdin) {
+ char result[LY_MAXPATH];
+ char *buf = NULL;
+
+ CTRACE((tfp, "processing stdin startfile\n"));
+ if ((fp = LYOpenTemp(result, HTML_SUFFIX, "w")) != 0) {
+ StrAllocCopy(startfile, result);
+ while (GetStdin(&buf, FALSE)) {
+ fputs(buf, fp);
+ fputc('\n', fp);
+ }
+ FREE(buf);
+ LYCloseTempFP(fp);
+ }
+ CTRACE((tfp, "...done stdin startfile\n"));
+ }
+#endif
+
+ /*
+ * Initialize other things based on the configuration read.
+ */
+
+#ifdef USE_PRETTYSRC
+ if ((!Old_DTD) != TRUE) /* skip if they are already initialized -HV */
+#endif
+ HTSwitchDTD(!Old_DTD);
+
+ /*
+ * Set up the proper character set with the desired
+ * startup raw 8-bit or CJK mode handling. - FM
+ */
+ HTMLUseCharacterSet(current_char_set);
+
+#ifdef USE_PERSISTENT_COOKIES
+ /*
+ * Sod it, this looks like a reasonable place to load the
+ * cookies file, probably. - RP
+ *
+ * And to set LYCookieSaveFile. - BJP
+ */
+ if (persistent_cookies) {
+ if (LYCookieFile == NULL) {
+ LYCookieFile = typeMallocn(char, LY_MAXPATH);
+
+ LYAddPathToHome(LYCookieFile, (size_t) LY_MAXPATH, FNAME_LYNX_COOKIES);
+ } else {
+ LYTildeExpand(&LYCookieFile, FALSE);
+ }
+ LYLoadCookies(LYCookieFile);
+ }
+
+ /* tilde-expand LYCookieSaveFile */
+ if (non_empty(LYCookieSaveFile)) {
+ LYTildeExpand(&LYCookieSaveFile, FALSE);
+ }
+#ifdef USE_PROGRAM_DIR
+ if (is_url(helpfile) == 0) {
+ char *tmp = NULL;
+
+ HTSprintf0(&tmp, "%s\\%s", program_dir, helpfile);
+ FREE(helpfile);
+ LYLocalFileToURL(&helpfile, tmp);
+ FREE(tmp);
+ }
+#endif
+
+ /*
+ * In dump_output_immediately mode, LYCookieSaveFile defaults to
+ * /dev/null, otherwise it defaults to LYCookieFile.
+ */
+
+ if (LYCookieSaveFile == NULL) {
+ if (dump_output_immediately) {
+ StrAllocCopy(LYCookieSaveFile, "/dev/null");
+ } else {
+ StrAllocCopy(LYCookieSaveFile, LYCookieFile);
+ }
+ }
+#endif
+
+ /*
+ * Check for a help file URL in the environment. Overriding
+ * compiled-in default and configuration file setting, if found.
+ */
+ if ((cp = LYGetEnv("LYNX_HELPFILE")) != NULL)
+ StrAllocCopy(helpfile, cp);
+
+ /*
+ * Set up our help and about file base paths. - FM
+ */
+ StrAllocCopy(helpfilepath, helpfile);
+ if ((cp = LYPathLeaf(helpfilepath)) != helpfilepath)
+ *cp = '\0';
+ LYAddHtmlSep(&helpfilepath);
+
+ /*
+ * Check for a save space path in the environment. If one was set in the
+ * configuration file, that one will be overridden. - FM
+ */
+ if ((cp = LYGetEnv("LYNX_SAVE_SPACE")) != NULL)
+ StrAllocCopy(lynx_save_space, cp);
+
+ /*
+ * We have a save space path, make sure it's valid. - FM
+ */
+ if (isEmpty(lynx_save_space)) {
+ FREE(lynx_save_space);
+ }
+ if (non_empty(lynx_save_space)) {
+ LYTildeExpand(&lynx_save_space, TRUE);
+#ifdef VMS
+ LYLowerCase(lynx_save_space);
+ if (StrChr(lynx_save_space, '/') != NULL) {
+ if (strlen(lynx_save_space) == 1) {
+ StrAllocCopy(lynx_save_space, "sys$login:");
+ } else {
+ LYAddPathSep(&lynx_save_space);
+ StrAllocCopy(temp, HTVMS_name("", lynx_save_space));
+ StrAllocCopy(lynx_save_space, temp);
+ FREE(temp);
+ }
+ }
+ if (StrChr(lynx_save_space, ':') == NULL &&
+ StrChr(lynx_save_space, ']') == NULL) {
+ StrAllocCat(lynx_save_space, ":");
+ }
+#else
+ LYAddPathSep(&lynx_save_space);
+#endif /* VMS */
+ }
+
+ /*
+ * Set up the file extension and mime type maps from src/HTInit.c and the
+ * global and personal mime.types and mailcap files. These will override
+ * any SUFFIX or VIEWER maps in userdefs.h or the configuration file, if
+ * they overlap.
+ */
+ HTFormatInit();
+ if (!FileInitAlreadyDone)
+ HTFileInit();
+
+ if (!LYCheckUserAgent()) {
+ HTAlwaysAlert(gettext("Warning:"), UA_NO_LYNX_WARNING);
+ }
+ if (show_cfg) {
+ cleanup();
+ exit_immediately(EXIT_SUCCESS);
+ }
+#ifdef USE_SLANG
+ if (LYShowColor >= SHOW_COLOR_ON &&
+ !(Lynx_Color_Flags & SL_LYNX_USE_COLOR)) {
+ Lynx_Color_Flags |= SL_LYNX_USE_COLOR;
+ } else if ((Lynx_Color_Flags & SL_LYNX_USE_COLOR) ||
+ LYGetEnv("COLORTERM") != NULL) {
+ if (LYShowColor != SHOW_COLOR_NEVER &&
+ LYShowColor != SHOW_COLOR_ALWAYS) {
+ LYShowColor = SHOW_COLOR_ON;
+ }
+ }
+#endif /* USE_SLANG */
+
+ if (LYPreparsedSource) {
+ HTPreparsedFormatInit();
+ }
+#if defined(EXEC_LINKS) || defined(EXEC_SCRIPTS)
+#ifdef NEVER_ALLOW_REMOTE_EXEC
+ if (local_exec) {
+ local_exec = FALSE;
+ local_exec_on_local_files = TRUE;
+ }
+#endif /* NEVER_ALLOW_REMOTE_EXEC */
+#endif /* EXEC_LINKS || EXEC_SCRIPTS */
+
+ if (emacs_keys)
+ set_emacs_keys();
+
+ if (vi_keys)
+ set_vi_keys();
+
+ if (no_numbers) {
+ number_links = FALSE;
+ number_fields = FALSE;
+ keypad_mode = NUMBERS_AS_ARROWS;
+ set_numbers_as_arrows();
+ }
+
+ if (crawl) {
+ /* No numbered links by default, as documented
+ in CRAWL.announce. - kw */
+ if (!number_links) {
+ keypad_mode = NUMBERS_AS_ARROWS;
+ }
+ }
+
+ if (!links_are_numbered()) {
+ if (number_fields)
+ keypad_mode = LINKS_AND_FIELDS_ARE_NUMBERED;
+ if (number_links)
+ keypad_mode = LINKS_ARE_NUMBERED;
+ set_numbers_as_arrows();
+ }
+
+ /*
+ * Check the -popup command line toggle. - FM
+ */
+ if (LYUseDefSelPop == FALSE) {
+ LYSelectPopups = (BOOLEAN) !LYSelectPopups;
+ }
+
+ /*
+ * Check the -show_cursor command line toggle. - FM
+ */
+ if (LYUseDefShoCur == FALSE) {
+ LYShowCursor = (BOOLEAN) !LYShowCursor;
+ }
+
+ /*
+ * Check the -base command line switch with -source. - FM
+ */
+ if (LYPrependBase && HTOutputFormat == WWW_DOWNLOAD) {
+ LYPrependBaseToSource = TRUE;
+ }
+
+ /*
+ * Disable multiple bookmark support if not interactive, so it doesn't
+ * crash on curses functions, or if the support was blocked via userdefs.h
+ * and/or lynx.cfg, or via command line restrictions. - FM
+ */
+ if (no_multibook)
+ LYMBMBlocked = TRUE;
+ if (dump_output_immediately || LYMBMBlocked || no_multibook) {
+ LYMultiBookmarks = MBM_OFF;
+ LYMBMBlocked = TRUE;
+ no_multibook = TRUE;
+ }
+#ifdef USE_SOURCE_CACHE
+ /*
+ * Disable source caching if not interactive.
+ */
+ if (dump_output_immediately)
+ LYCacheSource = SOURCE_CACHE_NONE;
+#endif
+#ifdef DISP_PARTIAL
+ /*
+ * Disable partial mode if not interactive.
+ */
+ if (dump_output_immediately)
+ display_partial_flag = FALSE;
+#endif
+
+#ifdef VMS
+ set_vms_keys();
+#endif /* VMS */
+
+#if defined (__DJGPP__)
+ if (watt_debug)
+ dbug_init();
+ sock_init();
+
+ __system_flags =
+ __system_emulate_chdir | /* handle `cd' internally */
+ __system_handle_null_commands | /* ignore cmds with no effect */
+ __system_allow_long_cmds | /* handle commands > 126 chars */
+ __system_use_shell | /* use $SHELL if set */
+ __system_allow_multiple_cmds | /* allow `cmd1; cmd2; ...' */
+ __system_redirect; /* redirect internally */
+
+ /* This speeds up stat() tremendously */
+ _djstat_flags |= _STAT_INODE | _STAT_EXEC_MAGIC | _STAT_DIRSIZE;
+#endif /* __DJGPP__ */
+
+ /* trap interrupts */
+#ifdef WIN32
+ SetConsoleCtrlHandler((PHANDLER_ROUTINE) cleanup_win32, TRUE);
+#endif
+
+#ifndef NOSIGHUP
+ if (!dump_output_immediately)
+ (void) signal(SIGHUP, cleanup_sig);
+#endif /* NOSIGHUP */
+
+ (void) signal(SIGTERM, cleanup_sig);
+#ifdef SIGWINCH
+ LYExtSignal(SIGWINCH, size_change);
+#endif /* SIGWINCH */
+#ifndef VMS
+ if (!TRACE && !dump_output_immediately && !stack_dump) {
+ (void) signal(SIGINT, cleanup_sig);
+#ifndef __linux__
+#ifdef SIGBUS
+ (void) signal(SIGBUS, FatalProblem);
+#endif /* SIGBUS */
+#endif /* !__linux__ */
+ (void) signal(SIGSEGV, FatalProblem);
+ (void) signal(SIGILL, FatalProblem);
+ /*
+ * Since we're doing lots of TCP, just ignore SIGPIPE altogether.
+ *
+ * HTTCP.c should deal with a broken pipe for servers. Rick Mallet's
+ * check after c = GetChar() in LYStrings.c should deal with a
+ * disconnected terminal. So the runaway CPU time problem on Unix
+ * should not occur any more.
+ */
+#ifdef SIGPIPE
+ if (signal(SIGPIPE, SIG_IGN) != SIG_IGN)
+ restore_sigpipe_for_children = TRUE;
+#endif /* SIGPIPE */
+ }
+#endif /* !VMS */
+
+#ifdef SIGTSTP
+ /*
+ * Block Control-Z suspending if requested. - FM
+ */
+ if (no_suspend)
+ (void) signal(SIGTSTP, SIG_IGN);
+#endif /* SIGTSTP */
+
+ /*
+ * Check for a valid HEAD request. - FM
+ */
+ if (HEAD_request && LYCanDoHEAD(startfile) != TRUE) {
+ fprintf(stderr,
+ "The '-head' switch is for http HEAD requests and cannot be used for\n'%s'.\n",
+ startfile);
+ exit_immediately(EXIT_FAILURE);
+ }
+
+ /*
+ * Check for a valid MIME headers request. - FM
+ */
+ if (keep_mime_headers && LYCanDoHEAD(startfile) != TRUE) {
+ fprintf(stderr,
+ "The '-mime_header' switch is for http URLs and cannot be used for\n'%s'.\n",
+ startfile);
+ exit_immediately(EXIT_FAILURE);
+ }
+
+ /*
+ * Check for a valid traversal request. - FM
+ */
+ if (traversal && StrNCmp(startfile, "http", 4)) {
+ fprintf(stderr,
+ "The '-traversal' switch is for http URLs and cannot be used for\n'%s'.\n",
+ startfile);
+ exit_immediately(EXIT_FAILURE);
+ }
+
+ /*
+ * Finish setting up for an INTERACTIVE session. Done here so that URL
+ * guessing in LYEnsureAbsoluteURL() can be interruptible (terminal is in
+ * raw mode, select() works). -BL
+ */
+#ifdef USE_PRETTYSRC
+ if (!dump_output_immediately) {
+ HTMLSRC_init_caches(FALSE); /* do it before terminal is initialized */
+ }
+#ifdef LY_FIND_LEAKS
+ atexit(html_src_clean_data);
+#endif
+#endif
+
+ if (!dump_output_immediately) {
+ setup(terminal);
+ }
+ /*
+ * If startfile is a file URL and the host is defaulted, force in
+ * "//localhost", and if it's not an absolute URL, make it one. - FM
+ */
+ LYEnsureAbsoluteURL(&startfile, "STARTFILE", FALSE);
+
+ /*
+ * If homepage was specified and is a file URL with the host defaulted,
+ * force in "//localhost", and if it's not an absolute URL, make it one. -
+ * FM
+ */
+ if (non_empty(homepage)) {
+ LYEnsureAbsoluteURL(&homepage, "HOMEPAGE", FALSE);
+ }
+
+ /*
+ * If we don't have a homepage specified, set it to startfile. Otherwise,
+ * reset LynxHome. - FM
+ */
+ if (isEmpty(homepage)) {
+ StrAllocCopy(homepage, startfile);
+ } else {
+ StrAllocCopy(LynxHome, homepage);
+ }
+
+ /*
+ * Set up the inside/outside domain restriction flags. - FM
+ */
+ if (inlocaldomain()) {
+#if !defined(HAVE_UTMP) || defined(VMS) /* not selective */
+ telnet_ok = (BOOL) (!no_inside_telnet && !no_outside_telnet && telnet_ok);
+#ifndef DISABLE_NEWS
+ news_ok = (BOOL) (!no_inside_news && !no_outside_news && news_ok);
+#endif
+ ftp_ok = (BOOL) (!no_inside_ftp && !no_outside_ftp && ftp_ok);
+ rlogin_ok = (BOOL) (!no_inside_rlogin && !no_outside_rlogin && rlogin_ok);
+#else
+ CTRACE((tfp, "LYMain: User in Local domain\n"));
+ telnet_ok = (BOOL) (!no_inside_telnet && telnet_ok);
+#ifndef DISABLE_NEWS
+ news_ok = (BOOL) (!no_inside_news && news_ok);
+#endif
+ ftp_ok = (BOOL) (!no_inside_ftp && ftp_ok);
+ rlogin_ok = (BOOL) (!no_inside_rlogin && rlogin_ok);
+#endif /* !HAVE_UTMP || VMS */
+ } else {
+ CTRACE((tfp, "LYMain: User in REMOTE domain\n"));
+ telnet_ok = (BOOL) (!no_outside_telnet && telnet_ok);
+#ifndef DISABLE_NEWS
+ news_ok = (BOOL) (!no_outside_news && news_ok);
+#endif
+ ftp_ok = (BOOL) (!no_outside_ftp && ftp_ok);
+ rlogin_ok = (BOOL) (!no_outside_rlogin && rlogin_ok);
+ }
+#ifdef DISABLE_FTP
+ ftp_ok = FALSE;
+#else
+ /* predefine some known broken ftp servers */
+ LYSetConfigValue(RC_BROKEN_FTP_RETR, "ProFTPD 1.2.5");
+ LYSetConfigValue(RC_BROKEN_FTP_RETR, "spftp/");
+ LYSetConfigValue(RC_BROKEN_FTP_EPSV, "(Version wu-2.6.2-12)");
+#endif
+
+ /*
+ * Make sure our bookmark default strings are all allocated and
+ * synchronized. - FM
+ */
+ if (isEmpty(bookmark_page)) {
+ temp = NULL;
+ HTSprintf0(&temp, "lynx_bookmarks%s", HTML_SUFFIX);
+ set_default_bookmark_page(temp);
+ FREE(temp);
+ }
+ if (isEmpty(BookmarkPage)) {
+ set_default_bookmark_page(bookmark_page);
+ }
+#if defined(SYSLOG_REQUESTED_URLS)
+ LYOpenlog(syslog_txt);
+#endif
+
+ if (non_empty(x_display)) {
+ LYisConfiguredForX = TRUE;
+ }
+
+ /*
+ * Here's where we do all the work.
+ */
+ if (dump_output_immediately) {
+ /*
+ * Finish setting up and start a NON-INTERACTIVE session. - FM
+ */
+ if (crawl && !number_links && !number_fields) {
+ keypad_mode = NUMBERS_AS_ARROWS;
+ } else if (no_numbers) {
+ keypad_mode = NUMBERS_AS_ARROWS;
+ } else if (!no_list) {
+ if (!links_are_numbered()) {
+ if (number_fields)
+ keypad_mode = LINKS_AND_FIELDS_ARE_NUMBERED;
+ else
+ keypad_mode = LINKS_ARE_NUMBERED;
+ }
+ }
+ if (dump_output_width > 0) {
+ LYcols = dump_output_width;
+ }
+ /*
+ * Normal argument processing puts non-options (URLs) into the Goto
+ * history. Use this to dump all of the pages listed on the command
+ * line, or (if none are listed) via the startfile mechanism.
+ * history.
+ */
+#ifdef EXTENDED_STARTFILE_RECALL
+ HTAddGotoURL(startfile);
+ for (i = HTList_count(Goto_URLs) - 1; i >= 0; --i) {
+ StrAllocCopy(startfile, (char *) HTList_objectAt(Goto_URLs, i));
+ CTRACE((tfp, "dumping %d:%d %s\n",
+ i + 1, HTList_count(Goto_URLs), startfile));
+ status = mainloop();
+ if (!no_list &&
+ !dump_links_inline &&
+ !crawl) /* For -crawl it has already been done! */
+ printlist(stdout, FALSE);
+ if (i != 0)
+ printf("\n");
+ }
+#else
+ status = mainloop();
+ if (!no_list &&
+ !dump_links_inline &&
+ !crawl && /* For -crawl it has already been done! */
+ links_are_numbered())
+ printlist(stdout, FALSE);
+#endif
+#ifdef USE_PERSISTENT_COOKIES
+ /*
+ * We want to save cookies picked up when in immediate dump mode.
+ * Instead of calling cleanup() here, let's only call this one. - BJP
+ */
+ if (persistent_cookies)
+ LYStoreCookies(LYCookieSaveFile);
+#endif /* USE_PERSISTENT_COOKIES */
+ exit_immediately(status);
+ } else {
+ /*
+ * Start an INTERACTIVE session. - FM
+ */
+#ifdef USE_COLOR_STYLE
+ cache_tag_styles();
+#endif
+
+#ifndef NO_DUMP_WITH_BACKSPACES
+ if (with_backspaces) {
+ /* we should warn about this somehow (nop for now) -VH */
+ with_backspaces = FALSE;
+ }
+#endif
+
+#ifndef ALL_CHARSETS_IN_O_MENU_SCREEN
+ init_charset_subsets();
+#endif
+
+ ena_csi((BOOLEAN) (LYlowest_eightbit[current_char_set] > 155));
+#ifdef USE_SESSIONS
+ RestoreSession();
+#endif /* USE_SESSIONS */
+ status = mainloop();
+ LYCloseCloset(RECALL_URL);
+ LYCloseCloset(RECALL_MAIL);
+#if defined(PDCURSES) && defined(PDC_BUILD) && PDC_BUILD >= 2401
+ if (!isendwin()) {
+ if ((saved_scrsize_x != 0) && (saved_scrsize_y != 0)) {
+ resize_term(saved_scrsize_y, saved_scrsize_x);
+ }
+ }
+#endif
+ cleanup();
+ exit_immediately(status);
+ }
+
+ return (status); /* though redundant, for compiler-warnings */
+}
+
+/*
+ * Called by HTAccessInit to register any protocols supported by lynx.
+ * Protocols added by lynx:
+ * LYNXKEYMAP, lynxcgi, LYNXIMGMAP, LYNXCOOKIE, LYNXCACHE, LYNXMESSAGES
+ */
+#ifdef GLOBALREF_IS_MACRO
+extern GLOBALREF (HTProtocol, LYLynxEditmap);
+extern GLOBALREF (HTProtocol, LYLynxKeymap);
+extern GLOBALREF (HTProtocol, LYLynxCGI);
+extern GLOBALREF (HTProtocol, LYLynxIMGmap);
+extern GLOBALREF (HTProtocol, LYLynxCookies);
+
+#ifdef USE_CACHEJAR
+extern GLOBALREF (HTProtocol, LYLynxCache);
+#endif
+extern GLOBALREF (HTProtocol, LYLynxStatusMessages);
+
+#else
+GLOBALREF HTProtocol LYLynxEditmap;
+GLOBALREF HTProtocol LYLynxKeymap;
+GLOBALREF HTProtocol LYLynxCGI;
+GLOBALREF HTProtocol LYLynxIMGmap;
+GLOBALREF HTProtocol LYLynxCookies;
+
+#ifdef USE_CACHEJAR
+GLOBALREF HTProtocol LYLynxCache;
+#endif
+GLOBALREF HTProtocol LYLynxStatusMessages;
+#endif /* GLOBALREF_IS_MACRO */
+
+void LYRegisterLynxProtocols(void)
+{
+ HTRegisterProtocol(&LYLynxEditmap);
+ HTRegisterProtocol(&LYLynxKeymap);
+ HTRegisterProtocol(&LYLynxCGI);
+ HTRegisterProtocol(&LYLynxIMGmap);
+ HTRegisterProtocol(&LYLynxCookies);
+#ifdef USE_CACHEJAR
+ HTRegisterProtocol(&LYLynxCache);
+#endif
+ HTRegisterProtocol(&LYLynxStatusMessages);
+}
+
+#ifndef NO_CONFIG_INFO
+/*
+ * Some stuff to reload lynx.cfg without restarting new lynx session, also load
+ * options menu items and command-line options to make things consistent.
+ *
+ * Called by user of interactive session by LYNXCFG://reload/ link.
+ *
+ * Warning: experimental, more main() reorganization required.
+ * *Known* exceptions: persistent cookies, cookie files.
+ *
+ * Some aspects of COLOR (with slang?).
+ * Viewer stuff, mailcap files
+ * SUFFIX, mime.types files
+ * RULESFILE/RULE
+ *
+ * All work "somewhat", but not exactly as the first time.
+ */
+void reload_read_cfg(void)
+{
+ char *tempfile;
+ FILE *rcfp;
+
+ /*
+ * no_option_save is always set for -anonymous and -validate. It is better
+ * to check for one or several specific restriction flags than for
+ * 'LYRestricted', which doesn't get set for individual restrictions or for
+ * -validate! However, no_option_save may not be the appropriate one to
+ * check - in that case, a new no_something should be added that gets
+ * automatically set for -anonymous and -validate (and whether it applies
+ * for -anonymous can be made installer- configurable in the usual way at
+ * the bottom of userdefs.h). - kw
+ *
+ */
+ if (no_option_save) {
+ /* current logic requires(?) that saving user preferences is
+ possible. Additional applicable restrictions are already
+ checked by caller. - kw */
+ return;
+ }
+
+ /*
+ * Current user preferences are saved in a temporary file, to be read in
+ * again after lynx.cfg has been read. This avoids accidental changing of
+ * the preferences file. The regular preferences file doesn't even need to
+ * exist, and won't be created as a side effect of this function. Honoring
+ * the no_option_save restriction may thus be unnecessarily restrictive,
+ * but the check is currently still left in place. - kw
+ */
+ tempfile = typecallocn(char, LY_MAXPATH);
+ if (!tempfile) {
+ HTAlwaysAlert(NULL, NOT_ENOUGH_MEMORY);
+ return;
+ }
+ rcfp = LYOpenTemp(tempfile, ".rc", "w");
+ if (rcfp == NULL) {
+ FREE(tempfile);
+ HTAlwaysAlert(NULL, CANNOT_OPEN_TEMP);
+ return;
+ }
+ if (!save_rc(rcfp)) {
+ HTAlwaysAlert(NULL, OPTIONS_NOT_SAVED);
+ (void) LYRemoveTemp(tempfile);
+ FREE(tempfile);
+ return; /* can not write the very own file :( */
+ }
+#ifdef USE_PERSISTENT_COOKIES
+ if (LYCookieFile != NULL && LYCookieSaveFile != NULL) {
+ /* set few safe flags: */
+ BOOLEAN persistent_cookies_flag = persistent_cookies;
+ char *LYCookieFile_flag = NULL;
+ char *LYCookieSaveFile_flag = NULL;
+
+ if (persistent_cookies) {
+ StrAllocCopy(LYCookieFile_flag, LYCookieFile);
+ StrAllocCopy(LYCookieSaveFile_flag, LYCookieSaveFile);
+ }
+#ifdef USE_CHARSET_CHOICE
+ custom_assumed_doc_charset = FALSE;
+ custom_display_charset = FALSE;
+ memset((char *) charset_subsets, 0, sizeof(charset_subset_t) * MAXCHARSETS);
+#endif
+
+#ifdef USE_PRETTYSRC
+ html_src_on_lynxcfg_reload();
+#endif
+ /* free downloaders, printers, environments, dired menu */
+ free_lynx_cfg();
+#ifdef USE_SOURCE_CACHE
+ source_cache_file_error = FALSE; /* reset flag */
+#endif
+
+ /*
+ * Process the configuration file.
+ */
+ read_cfg(lynx_cfg_file, "main program", 1, (FILE *) 0);
+
+ /*
+ * Process the temporary RC file.
+ */
+ rcfp = fopen(tempfile, "r");
+ read_rc(rcfp);
+ (void) LYRemoveTemp(tempfile);
+ FREE(tempfile); /* done with it - kw */
+
+#ifdef USE_CHARSET_CHOICE
+ init_charset_subsets();
+#endif
+
+ /*
+ * Initialize other things based on the configuration read.
+ */
+ LYSetDisplayLines();
+ /* Not implemented yet here,
+ * a major problem: file paths
+ * like lynx_save_space, LYCookieFile etc.
+ */
+ /* restore old settings */
+ if (persistent_cookies != persistent_cookies_flag) {
+ persistent_cookies = persistent_cookies_flag;
+ HTAlert(gettext("persistent cookies state will be changed in next session only."));
+ }
+ if (persistent_cookies && LYCookieFile_flag != NULL) {
+ if (strcmp(LYCookieFile, LYCookieFile_flag)) {
+ StrAllocCopy(LYCookieFile, LYCookieFile_flag);
+ CTRACE((tfp,
+ "cookie file can be changed in next session only, restored.\n"));
+ }
+ if (strcmp(LYCookieSaveFile, LYCookieSaveFile_flag)) {
+ StrAllocCopy(LYCookieSaveFile, LYCookieSaveFile_flag);
+ CTRACE((tfp,
+ "cookie save file can be changed in next session only, restored.\n"));
+ }
+ FREE(LYCookieFile_flag);
+ FREE(LYCookieSaveFile_flag);
+ }
+ }
+#endif /* USE_PERSISTENT_COOKIES */
+}
+#endif /* !NO_CONFIG_INFO */
+
+static void force_dump_mode(void)
+{
+ dump_output_immediately = TRUE;
+ no_pause = TRUE;
+ LYcols = DFT_COLS;
+}
+
+/* There are different ways of setting arguments on the command line, and
+ * there are different types of arguments. These include:
+ *
+ * -set_some_variable ==> some_variable = TRUE
+ * -toggle_some_variable ==> some_variable = !some_variable
+ * -some_variable=value ==> some_variable = value
+ *
+ * Others are complicated and require a function call.
+ */
+
+#define PARSE_SET(n,t,v,h) {n, t, UNION_SET(v), h}
+#define PARSE_INT(n,t,v,h) {n, t, UNION_INT(v), h}
+#define PARSE_STR(n,t,v,h) {n, t, UNION_STR(v), h}
+#define PARSE_FUN(n,t,v,h) {n, t, UNION_FUN(v), h}
+#define PARSE_NIL {NULL, 0, UNION_DEF(0), NULL}
+
+typedef struct parse_args_type {
+ const char *name;
+ int type;
+
+#define TOGGLE_ARG 0x0010
+#define SET_ARG 0x0020
+#define UNSET_ARG 0x0030
+#define FUNCTION_ARG 0x0040
+#define LYSTRING_ARG 0x0050
+#define INT_ARG 0x0060
+#define STRING_ARG 0x0070
+#define TIME_ARG 0x0080
+#define ARG_TYPE_MASK 0x0FF0
+#define NEED_NEXT_ARG 0x1000
+
+#define NEED_INT_ARG (NEED_NEXT_ARG | INT_ARG)
+#define NEED_TIME_ARG (NEED_NEXT_ARG | TIME_ARG)
+#define NEED_LYSTRING_ARG (NEED_NEXT_ARG | LYSTRING_ARG)
+#define NEED_STRING_ARG (NEED_NEXT_ARG | STRING_ARG)
+#define NEED_FUNCTION_ARG (NEED_NEXT_ARG | FUNCTION_ARG)
+
+ /* If the NEED_NEXT_ARG flags is set, and the option was not specified
+ * with an '=' character, then use the next argument in the argv list.
+ */
+
+ ParseData;
+ const char *help_string;
+} Config_Type;
+
+/* -auth, -pauth */
+static int parse_authentication(char *next_arg,
+ char **result)
+{
+ /*
+ * Authentication information for protected documents.
+ */
+ char *auth_info = NULL;
+
+ if (next_arg != NULL) {
+ StrAllocCopy(auth_info, next_arg);
+ memset(next_arg, ' ', strlen(next_arg)); /* Let's not show too much */
+ }
+
+ if (auth_info != NULL) {
+ char *cp;
+
+ if ((cp = StrChr(auth_info, ':')) != NULL) { /* Pw */
+ *cp++ = '\0'; /* Terminate ID */
+ HTUnEscape(cp);
+ StrAllocCopy(result[1], cp);
+ }
+ if (*auth_info) { /* Id */
+ HTUnEscape(auth_info);
+ StrAllocCopy(result[0], auth_info);
+ }
+ FREE(auth_info);
+ }
+ return 0;
+}
+
+/* -anonymous */
+static int anonymous_fun(char *next_arg GCC_UNUSED)
+{
+ if (!LYValidate && !LYRestricted)
+ parse_restrictions("default");
+ LYRestricted = TRUE;
+ return 0;
+}
+
+/* -assume_charset */
+static int assume_charset_fun(char *next_arg)
+{
+ assumed_charset = TRUE;
+ UCLYhndl_for_unspec = safeUCGetLYhndl_byMIME(next_arg);
+ StrAllocCopy(UCAssume_MIMEcharset,
+ LYCharSet_UC[UCLYhndl_for_unspec].MIMEname);
+ CTRACE((tfp, "assume_charset_fun %s ->%d ->%s\n",
+ NonNull(next_arg),
+ UCLYhndl_for_unspec,
+ UCAssume_MIMEcharset));
+ return 0;
+}
+
+/* -assume_local_charset */
+static int assume_local_charset_fun(char *next_arg)
+{
+ UCLYhndl_HTFile_for_unspec = safeUCGetLYhndl_byMIME(next_arg);
+ return 0;
+}
+
+/* -assume_unrec_charset */
+static int assume_unrec_charset_fun(char *next_arg)
+{
+ UCLYhndl_for_unrec = safeUCGetLYhndl_byMIME(next_arg);
+ return 0;
+}
+
+/* -auth */
+static int auth_fun(char *next_arg)
+{
+ parse_authentication(next_arg, authentication_info);
+ return 0;
+}
+
+/* -base */
+static int base_fun(char *next_arg GCC_UNUSED)
+{
+ /*
+ * Treat -source equivalently to an interactive download with
+ * LYPrefixBaseToSource configured to TRUE, so that a BASE tag is prepended
+ * for text/html content types. We normally treat the module-wide global
+ * LYPrefixBaseToSource flag as FALSE with -source, but force it TRUE,
+ * later, if LYPrependBase is set TRUE here. - FM
+ */
+ LYPrependBase = TRUE;
+ if (HTOutputFormat == WWW_DUMP)
+ HTOutputFormat = WWW_DOWNLOAD;
+
+ return 0;
+}
+
+/* -cache */
+static int cache_fun(char *next_arg)
+{
+ if (next_arg != 0)
+ HTCacheSize = atoi(next_arg);
+ /*
+ * Limit size.
+ */
+ if (HTCacheSize < 2)
+ HTCacheSize = 2;
+
+ return 0;
+}
+
+/* -child */
+static int child_fun(char *next_arg GCC_UNUSED)
+{
+ child_lynx = TRUE;
+ no_disk_save = TRUE;
+ no_mail = TRUE;
+ return 0;
+}
+
+/* -child_relaxed */
+static int child_relaxed_fun(char *next_arg GCC_UNUSED)
+{
+ child_lynx = TRUE;
+ return 0;
+}
+
+#ifdef USE_SLANG
+/* -color */
+static int color_fun(char *next_arg GCC_UNUSED)
+{
+ Lynx_Color_Flags |= SL_LYNX_USE_COLOR;
+
+ if (LYShowColor != SHOW_COLOR_ALWAYS)
+ LYShowColor = SHOW_COLOR_ON;
+
+ return 0;
+}
+#endif
+
+/* -convert_to */
+static int convert_to_fun(char *next_arg)
+{
+ if (next_arg != 0) {
+ char *outformat = NULL;
+ char *cp1, *cp2, *cp4;
+ int chndl;
+
+ StrAllocCopy(outformat, next_arg);
+ /* not lowercased, to allow for experimentation - kw */
+ /*LYLowerCase(outformat); */
+ if ((cp1 = StrChr(outformat, ';')) != NULL) {
+ if ((cp2 = LYstrstr(cp1, "charset")) != NULL) {
+ cp2 += 7;
+ while (*cp2 == ' ' || *cp2 == '=' || *cp2 == '"')
+ cp2++;
+ for (cp4 = cp2; (*cp4 != '\0' && *cp4 != '"' &&
+ *cp4 != ';' &&
+ !WHITE(*cp4)); cp4++) ; /* do nothing */
+ *cp4 = '\0';
+ /* This is intentionally not the "safe" version,
+ to allow for experimentation. */
+ chndl = UCGetLYhndl_byMIME(cp2);
+ if (chndl < 0)
+ chndl = UCLYhndl_for_unrec;
+ if (chndl < 0) {
+ fprintf(stderr,
+ gettext("Lynx: ignoring unrecognized charset=%s\n"), cp2);
+ } else {
+ current_char_set = chndl;
+ }
+ *cp1 = '\0'; /* truncate outformat */
+ }
+ }
+ HTOutputFormat = HTAtom_for(outformat);
+ FREE(outformat);
+ } else {
+ HTOutputFormat = NULL;
+ }
+ return 0;
+}
+
+/* -crawl */
+static int crawl_fun(char *next_arg GCC_UNUSED)
+{
+ crawl = TRUE;
+ LYcols = DFT_COLS;
+ return 0;
+}
+
+/* -display */
+static int display_fun(char *next_arg)
+{
+ if (next_arg != 0) {
+ LYsetXDisplay(next_arg);
+ }
+
+ return 0;
+}
+
+/* -display_charset */
+static int display_charset_fun(char *next_arg)
+{
+ int i = UCGetLYhndl_byMIME(next_arg);
+
+#ifdef CAN_AUTODETECT_DISPLAY_CHARSET
+ if (i < 0 && !strcasecomp(next_arg, "auto"))
+ i = auto_display_charset;
+#endif
+ if (i < 0) { /* do nothing here: so fallback to lynx.cfg */
+ fprintf(stderr,
+ gettext("Lynx: ignoring unrecognized charset=%s\n"), next_arg);
+ } else
+ current_char_set = i;
+ return 0;
+}
+
+/* -dump */
+static int dump_output_fun(char *next_arg GCC_UNUSED)
+{
+ force_dump_mode();
+ return 0;
+}
+
+/* -editor */
+static int editor_fun(char *next_arg)
+{
+ if (next_arg != 0)
+ StrAllocCopy(editor, next_arg);
+ system_editor = TRUE;
+ return 0;
+}
+
+/* -error_file */
+static int error_file_fun(char *next_arg)
+{
+ /*
+ * Output return (success/failure) code of an HTTP transaction.
+ */
+ if (next_arg != 0)
+ http_error_file = next_arg;
+ return 0;
+}
+
+#if defined(EXEC_LINKS) || defined(EXEC_SCRIPTS)
+/* -exec */
+static int exec_fun(char *next_arg GCC_UNUSED)
+{
+#ifndef NEVER_ALLOW_REMOTE_EXEC
+ local_exec = TRUE;
+#else
+ local_exec_on_local_files = TRUE;
+#endif /* NEVER_ALLOW_REMOTE_EXEC */
+ return 0;
+}
+#endif
+
+/* -get_data */
+static int get_data_fun(char *next_arg GCC_UNUSED)
+{
+ /*
+ * User data for GET form.
+ */
+ char **get_data;
+ char *buf = NULL;
+
+ /*
+ * On Unix, conflicts with curses when interactive so let's force a dump.
+ * -CL
+ *
+ * On VMS, mods have been made in LYCurses.c to deal with potential
+ * conflicts, so don't force the dump here. - FM
+ */
+#ifndef VMS
+ force_dump_mode();
+#endif /* VMS */
+
+ StrAllocCopy(form_get_data, "?"); /* Prime the pump */
+ get_data = &form_get_data;
+
+ /*
+ * Build GET data for later. Stop reading when we see a line with "---" as
+ * its first three characters.
+ */
+ while (GetStdin(&buf, TRUE)) {
+ StrAllocCat(*get_data, buf);
+ }
+
+ CTRACE((tfp, "get_data:%s\n", *get_data));
+ CTRACE((tfp, "get_data:%s\n", form_get_data));
+ return 0;
+}
+
+/* -help */
+static int help_fun(char *next_arg GCC_UNUSED)
+{
+ print_help_and_exit(0);
+ return 0;
+}
+
+/* -hiddenlinks */
+int hiddenlinks_fun(char *next_arg)
+{
+ /* *INDENT-OFF* */
+ static Config_Enum table[] = {
+ { "merge", HIDDENLINKS_MERGE },
+ { "listonly", HIDDENLINKS_SEPARATE },
+ { "ignore", HIDDENLINKS_IGNORE },
+ { NULL, -1 },
+ };
+ /* *INDENT-ON* */
+
+ if (next_arg != 0) {
+ if (!LYgetEnum(table, next_arg, &LYHiddenLinks))
+ print_help_and_exit(-1);
+ } else {
+ LYHiddenLinks = HIDDENLINKS_MERGE;
+ }
+
+ return 0;
+}
+
+/* -homepage */
+static int homepage_fun(char *next_arg)
+{
+ if (next_arg != 0) {
+ StrAllocCopy(homepage, next_arg);
+ LYEscapeStartfile(&homepage);
+ }
+ return 0;
+}
+
+/* -mime_header */
+static int mime_header_fun(char *next_arg GCC_UNUSED)
+{
+ /*
+ * Include mime headers and force source dump.
+ */
+ keep_mime_headers = TRUE;
+ force_dump_mode();
+ HTOutputFormat = (LYPrependBase ?
+ WWW_DOWNLOAD : WWW_DUMP);
+ LYcols = MAX_COLS;
+ return 0;
+}
+
+#ifndef DISABLE_NEWS
+/* -newschunksize */
+static int newschunksize_fun(char *next_arg)
+{
+ if (next_arg != 0) {
+ HTNewsChunkSize = atoi(next_arg);
+ /*
+ * If the new HTNewsChunkSize exceeds the maximum,
+ * increase HTNewsMaxChunk to this size. - FM
+ */
+ if (HTNewsChunkSize > HTNewsMaxChunk)
+ HTNewsMaxChunk = HTNewsChunkSize;
+ }
+ return 0;
+}
+
+/* -newsmaxchunk */
+static int newsmaxchunk_fun(char *next_arg)
+{
+ if (next_arg) {
+ HTNewsMaxChunk = atoi(next_arg);
+ /*
+ * If HTNewsChunkSize exceeds the new maximum,
+ * reduce HTNewsChunkSize to this maximum. - FM
+ */
+ if (HTNewsChunkSize > HTNewsMaxChunk)
+ HTNewsChunkSize = HTNewsMaxChunk;
+ }
+ return 0;
+}
+#endif /* not DISABLE_NEWS */
+
+/* -nobold */
+static int nobold_fun(char *next_arg GCC_UNUSED)
+{
+ LYnoVideo(1);
+ return 0;
+}
+
+/* -nobrowse */
+static int nobrowse_fun(char *next_arg GCC_UNUSED)
+{
+ HTDirAccess = HT_DIR_FORBID;
+ return 0;
+}
+
+/* -nocolor */
+static int nocolor_fun(char *next_arg GCC_UNUSED)
+{
+ LYShowColor = SHOW_COLOR_NEVER;
+#ifdef USE_SLANG
+ Lynx_Color_Flags &= ~(unsigned) SL_LYNX_USE_COLOR;
+ Lynx_Color_Flags |= SL_LYNX_OVERRIDE_COLOR;
+#endif
+ return 0;
+}
+
+/* -nopause */
+static int nopause_fun(char *next_arg GCC_UNUSED)
+{
+ no_pause = TRUE;
+ return 0;
+}
+
+/* -nomore */
+static int nomore_fun(char *next_arg GCC_UNUSED)
+{
+ nomore = TRUE;
+ return 0;
+}
+
+/* -noreverse */
+static int noreverse_fun(char *next_arg GCC_UNUSED)
+{
+ LYnoVideo(2);
+ return 0;
+}
+
+/* -nounderline */
+static int nounderline_fun(char *next_arg GCC_UNUSED)
+{
+ LYnoVideo(4);
+ return 0;
+}
+
+/* -nozap */
+static int nozap_fun(char *next_arg)
+{
+ LYNoZapKey = 1; /* everything but "initially" treated as "full" - kw */
+ if (next_arg != 0) {
+ if (strcasecomp(next_arg, "initially") == 0)
+ LYNoZapKey = 2;
+
+ }
+ return 0;
+}
+
+/* -pauth */
+static int pauth_fun(char *next_arg)
+{
+ parse_authentication(next_arg, proxyauth_info);
+ return 0;
+}
+
+/* -post_data */
+static int post_data_fun(char *next_arg GCC_UNUSED)
+{
+ /*
+ * User data for POST form.
+ */
+ char **post_data;
+ char *buf = NULL;
+
+ /*
+ * On Unix, conflicts with curses when interactive so let's force a dump.
+ * - CL
+ *
+ * On VMS, mods have been made in LYCurses.c to deal with potential
+ * conflicts, so don't force a dump here. - FM
+ */
+#ifndef VMS
+ force_dump_mode();
+#endif /* VMS */
+
+ post_data = &form_post_data;
+
+ /*
+ * Build post data for later. Stop reading when we see a line with "---"
+ * as its first three characters.
+ */
+ while (GetStdin(&buf, TRUE)) {
+ StrAllocCat(*post_data, buf);
+ }
+ return 0;
+}
+
+static const char *show_restriction(const char *name)
+{
+ const char *value = 0;
+
+ switch (find_restriction(name, -1)) {
+ case TRUE:
+ value = "on";
+ break;
+ case FALSE:
+ value = "off";
+ break;
+ default:
+ value = "?";
+ break;
+ }
+ return value;
+}
+
+/* -restrictions */
+static int restrictions_fun(char *next_arg)
+{
+ /* *INDENT-OFF* */
+ static const struct {
+ const char *name;
+ const char *help;
+ } table[] = {
+ { "all", "restricts all options." },
+ { "bookmark", "disallow changing the location of the bookmark file" },
+ { "bookmark_exec", "disallow execution links via the bookmark file" },
+#if defined(DIRED_SUPPORT) && defined(OK_PERMIT)
+ { "change_exec_perms", "\
+disallow changing the eXecute permission on files\n\
+(but still allow it for directories) when local file\n\
+management is enabled." },
+#endif /* DIRED_SUPPORT && OK_PERMIT */
+#ifdef SUPPORT_CHDIR
+ { "chdir", "\
+disallow changing the working directory of lynx, e.g.,\n\
+to affect the behavior of download command" },
+#endif
+#if defined(HAVE_CONFIG_H) && !defined(NO_CONFIG_INFO)
+ { "compileopts_info", "\
+disable info on options used to compile the binary" },
+#endif
+ { "default", "\
+same as commandline option -anonymous. Sets the\n\
+default service restrictions for anonymous users. Set to\n\
+all restricted, except for: inside_telnet, outside_telnet,\n\
+inside_ftp, outside_ftp, inside_rlogin, outside_rlogin,\n\
+inside_news, outside_news, telnet_port, jump, mail, print,\n\
+exec, and goto. The settings for these, as well as\n\
+additional goto restrictions for specific URL schemes\n\
+that are also applied, are derived from definitions\n\
+within userdefs.h." },
+#ifdef DIRED_SUPPORT
+ { "dired_support", "disallow local file management" },
+#endif /* DIRED_SUPPORT */
+ { "disk_save", "disallow saving to disk in the download and print menus" },
+ { "dotfiles", "disallow access to, or creation of, hidden (dot) files" },
+ { "download", "disallow some downloaders in the download menu" },
+ { "editor", "disallow editing" },
+ { "exec", "disable execution scripts" },
+ { "exec_frozen", "disallow the user from changing the execution link option" },
+#ifdef USE_EXTERNALS
+ { "externals", "disable passing URLs to some external programs" },
+#endif
+ { "file_url", "\
+disallow using G)oto, served links or bookmarks for\n\
+file: URL's" },
+ { "goto", "disable the 'g' (goto) command" },
+#if !defined(HAVE_UTMP) || defined(VMS) /* not selective */
+ { "inside_ftp", "\
+disallow ftps coming from inside your\n\
+domain (utmp required for selectivity)" },
+ { "inside_news", "\
+disallow USENET news reading and posting coming\n\
+from inside your domain (utmp required for selectivity)" },
+ { "inside_rlogin", "\
+disallow rlogins coming from inside your\n\
+domain (utmp required for selectivity)" },
+ { "inside_telnet", "\
+disallow telnets coming from inside your\n\
+domain (utmp required for selectivity)" },
+#else
+ { "inside_ftp", "\
+disallow ftps coming from inside your domain" },
+ { "inside_news", "\
+disallow USENET news reading and posting coming\n\
+from inside your domain" },
+ { "inside_rlogin", "\
+disallow rlogins coming from inside your domain" },
+ { "inside_telnet", "\
+disallow telnets coming from inside your domain" },
+#endif /* HAVE_UTMP || VMS */
+ { "jump", "disable the 'j' (jump) command" },
+ { "lynxcfg_info", "\
+disable viewing of lynx.cfg configuration file info" },
+#ifndef NO_CONFIG_INFO
+ { "lynxcfg_xinfo", "\
+disable extended lynx.cfg viewing and reloading" },
+#endif
+ { "lynxcgi", "\
+disallow execution of Lynx CGI URLs" },
+ { "mail", "disallow mail" },
+ { "multibook", "disallow multiple bookmark files" },
+ { "news_post", "disallow USENET News posting." },
+ { "option_save", "disallow saving options in .lynxrc" },
+#if !defined(HAVE_UTMP) || defined(VMS) /* not selective */
+ { "outside_ftp", "\
+disallow ftps coming from outside your\n\
+domain (utmp required for selectivity)" },
+ { "outside_news", "\
+disallow USENET news reading and posting coming\n\
+from outside your domain (utmp required for selectivity)" },
+ { "outside_rlogin", "\
+disallow rlogins coming from outside your\n\
+domain (utmp required for selectivity)" },
+ { "outside_telnet", "\
+disallow telnets coming from outside your\n\
+domain (utmp required for selectivity)" },
+#else
+ { "outside_ftp", "\
+disallow ftp coming from outside your domain" },
+ { "outside_news", "\
+disallow USENET news reading and posting coming\n\
+from outside your domain" },
+ { "outside_rlogin", "\
+disallow rlogins coming from outside your domain" },
+ { "outside_telnet", "\
+disallow telnets coming from outside your domain" },
+#endif /* !HAVE_UTMP || VMS */
+ { "print", "disallow most print options" },
+ { "shell", "\
+disallow shell escapes, and lynxexec, lynxprog or lynxcgi\n\
+G)oto's" },
+ { "suspend", "disallow Control-Z suspends with escape to shell" },
+ { "telnet_port", "disallow specifying a port in telnet G)oto's" },
+ { "useragent", "disallow modifications of the User-Agent header" },
+ };
+ /* *INDENT-ON* */
+
+ static const char *Usage[] =
+ {
+ ""
+ ,"USAGE: lynx -restrictions=[option][,option][,option]"
+ ,"List of Options:"
+ ," ? when used alone, list restrictions in effect."
+
+ };
+ unsigned j, k, column = 0;
+ const char *name;
+ const char *value;
+ BOOLEAN found, first;
+
+ if (isEmpty(next_arg)) {
+ SetOutputMode(O_TEXT);
+ for (j = 0; j < TABLESIZE(Usage); j++) {
+ printf("%s\n", Usage[j]);
+ }
+ for (j = 0; j < TABLESIZE(table); j++) {
+ if (!strcmp(table[j].name, "all")
+ || !strcmp(table[j].name, "default")) {
+ value = NULL;
+ } else {
+ value = show_restriction(table[j].name);
+ }
+ print_help_strings(table[j].name, table[j].help, value, FALSE);
+ }
+ first = TRUE;
+ for (j = 0; j < TABLESIZE(table); j++) {
+ found = FALSE;
+ if ((name = index_to_restriction(j)) == 0) {
+ break;
+ }
+ for (k = 0; k < TABLESIZE(table); k++) {
+ if (!strcmp(name, table[k].name)) {
+ found = TRUE;
+ }
+ }
+ if (!found) {
+ if (first) {
+ printf("Other restrictions (see the user's guide):\n");
+ }
+ value = show_restriction(table[j].name);
+ printf("%s%s (%s)", column ? ", " : " ", name, value);
+ column += (unsigned) (5 + strlen(name) + strlen(value));
+ if (column > 50) {
+ column = 0;
+ printf("\n");
+ }
+ first = FALSE;
+ }
+ }
+ if (column)
+ printf("\n");
+ SetOutputMode(O_BINARY);
+ exit_immediately(EXIT_SUCCESS);
+ } else if (*next_arg == '?') {
+ SetOutputMode(O_TEXT);
+ print_restrictions_to_fd(stdout);
+ SetOutputMode(O_BINARY);
+ exit_immediately(EXIT_SUCCESS);
+ } else {
+ parse_restrictions(next_arg);
+ }
+ return 0;
+}
+
+/* -selective */
+static int selective_fun(char *next_arg GCC_UNUSED)
+{
+ HTDirAccess = HT_DIR_SELECTIVE;
+ return 0;
+}
+
+/* -source */
+static int source_fun(char *next_arg GCC_UNUSED)
+{
+ force_dump_mode();
+ HTOutputFormat = (LYPrependBase ?
+ WWW_DOWNLOAD : WWW_DUMP);
+ LYcols = MAX_COLS;
+ return 0;
+}
+
+/* -traversal */
+static int traversal_fun(char *next_arg GCC_UNUSED)
+{
+ traversal = TRUE;
+#ifdef USE_SLANG
+ LYcols = DFT_COLS;
+#else
+ LYcols = MAX_COLS;
+#endif /* USE_SLANG */
+
+ return 0;
+}
+
+/* -version */
+static int version_fun(char *next_arg GCC_UNUSED)
+{
+ char *result = NULL;
+
+ SetLocale();
+ SetOutputMode(O_TEXT);
+
+ HTSprintf0(&result, gettext("%s Version %s (%s)"),
+ LYNX_NAME, LYNX_VERSION,
+ LYVersionDate());
+
+ StrAllocCat(result, "\n");
+#ifdef USE_SSL
+ HTSprintf(&result, "libwww-FM %s,", HTLibraryVersion);
+ append_ssl_version(&result, " ");
+#else
+ HTSprintf(&result, "libwww-FM %s", HTLibraryVersion);
+#endif /* USE_SSL */
+
+#if defined(NCURSES) && defined(HAVE_CURSES_VERSION)
+ HTSprintf(&result, ", %s", curses_version());
+#if defined(WIDEC_CURSES)
+ HTSprintf(&result, "(wide)");
+#endif
+#elif defined(PDCURSES) && defined(PDC_BUILD)
+ HTSprintf(&result, ", pdcurses %.3f", PDC_BUILD * 0.001);
+#elif defined(USE_SLANG) && defined(SLANG_VERSION_STRING)
+ HTSprintf(&result, ", s-lang %s", SLANG_VERSION_STRING);
+#endif
+
+ printf("%s\n", result);
+ free(result);
+
+/*
+ * Define NO_BUILDSTAMP if you really want an executable with no timestamp in
+ * the -version message.
+ */
+#ifdef NO_BUILDSTAMP
+#define BUILDSTAMP ""
+#else
+#define BUILDSTAMP " (" __DATE__ " " __TIME__ ")"
+#endif
+
+/*
+ * SYSTEM_NAME is set by the configure script. Show build date/time for other
+ * systems, according to predefined compiler symbols.
+ */
+#ifdef SYSTEM_NAME
+ printf(gettext("Built on %s%s.\n"), SYSTEM_NAME, BUILDSTAMP);
+#elif defined(__CYGWIN__)
+ printf("Compiled by CYGWIN%s.\n", BUILDSTAMP);
+#elif defined(__BORLANDC__)
+ printf("Compiled by Borland C++%s.\n", BUILDSTAMP);
+#elif defined(_MSC_VER)
+ printf("Compiled by Microsoft Visual C++%s.\n", BUILDSTAMP);
+#elif defined(__DJGPP__)
+ printf("Compiled by DJGPP%s.\n", BUILDSTAMP);
+#elif !defined(NO_BUILDSTAMP)
+ printf("Compiled at %s %s.\n", __DATE__, __TIME__);
+#endif
+
+ puts("");
+ puts(gettext("Copyrights held by the Lynx Developers Group,"));
+ puts(gettext("the University of Kansas, CERN, and other contributors."));
+ puts(gettext("Distributed under the GNU General Public License (Version 2)."));
+ puts(gettext("See https://lynx.invisible-island.net/ and the online help for more information."));
+ puts("");
+#ifdef USE_SSL
+#if defined(OPENSSL_VERSION_TEXT) && !defined(LIBGNUTLS_VERSION)
+ puts("See http://www.openssl.org/ for information about OpenSSL.");
+#endif /* OPENSSL_VERSION_TEXT */
+ puts("");
+#endif /* USE_SSL */
+
+ SetOutputMode(O_BINARY);
+
+ exit_immediately(EXIT_SUCCESS);
+ /* NOT REACHED */
+ return 0;
+}
+
+/* -width */
+static int width_fun(char *next_arg)
+{
+ if (next_arg != 0) {
+ int w = atoi(next_arg);
+
+ if (w > 0)
+ dump_output_width = ((w < MAX_COLS) ? w : MAX_COLS);
+ }
+
+ return 0;
+}
+
+#if defined(PDCURSES) && defined(PDC_BUILD) && PDC_BUILD >= 2401
+/* -scrsize */
+static int scrsize_fun(char *next_arg)
+{
+ if (next_arg != 0) {
+ char *cp;
+
+ if ((cp = StrChr(next_arg, ',')) != 0) {
+ *cp++ = '\0'; /* Terminate ID */
+ scrsize_x = atoi(next_arg);
+ scrsize_y = atoi(cp);
+ if ((scrsize_x <= 1) || (scrsize_y <= 1)) {
+ scrsize_x = scrsize_y = 0;
+ }
+ if ((scrsize_x > 0) && (scrsize_x < 40)) {
+ scrsize_x = 40;
+ }
+ if ((scrsize_y > 0) && (scrsize_y < 6)) {
+ scrsize_y = 6;
+ }
+ CTRACE((tfp, "scrsize: x=%d, y=%d\n", scrsize_x, scrsize_y));
+ }
+ }
+ return 0;
+}
+#endif
+
+/* NOTE: This table is sorted by name to make the help message useful */
+/* *INDENT-OFF* */
+static Config_Type Arg_Table [] =
+{
+ PARSE_SET(
+ "accept_all_cookies", 4|SET_ARG, LYAcceptAllCookies,
+ "\naccept cookies without prompting if Set-Cookie handling\nis on"
+ ),
+#if USE_BLAT_MAILER
+ PARSE_SET(
+ "altblat", 4|TOGGLE_ARG, mail_is_altblat,
+ "select mail tool (`"THIS_BLAT_MAIL"' ==> `"THAT_BLAT_MAIL"')"
+ ),
+#endif
+ PARSE_FUN(
+ "anonymous", 2|FUNCTION_ARG, anonymous_fun,
+ "apply restrictions for anonymous account,\nsee also -restrictions"
+ ),
+ PARSE_FUN(
+ "assume_charset", 4|NEED_FUNCTION_ARG, assume_charset_fun,
+ "=MIMEname\ncharset for documents that don't specify it"
+ ),
+ PARSE_FUN(
+ "assume_local_charset", 4|NEED_FUNCTION_ARG, assume_local_charset_fun,
+ "=MIMEname\ncharset assumed for local files"
+ ),
+ PARSE_FUN(
+ "assume_unrec_charset", 4|NEED_FUNCTION_ARG, assume_unrec_charset_fun,
+ "=MIMEname\nuse this instead of unrecognized charsets"
+ ),
+ PARSE_FUN(
+ "auth", 4|NEED_FUNCTION_ARG, auth_fun,
+ "=id:pw\nauthentication information for protected documents"
+ ),
+ PARSE_FUN(
+ "base", 4|FUNCTION_ARG, base_fun,
+ "prepend a request URL comment and BASE tag to " STR_HTML "\n\
+outputs for -source dumps"
+ ),
+#ifndef DISABLE_BIBP
+ PARSE_STR(
+ "bibhost", 4|NEED_LYSTRING_ARG, BibP_bibhost,
+ "=URL\nlocal bibp server (default http://bibhost/)"
+ ),
+#endif
+#ifdef USE_BLINK
+ PARSE_SET(
+ "blink", 4|SET_ARG, term_blink_is_boldbg,
+ "enable bright background via the BLINK terminal attribute"
+ ),
+#endif
+ PARSE_SET(
+ "book", 4|SET_ARG, bookmark_start,
+ "use the bookmark page as the startfile"
+ ),
+ PARSE_SET(
+ "buried_news", 4|TOGGLE_ARG, scan_for_buried_news_references,
+ "toggles scanning of news articles for buried references"
+ ),
+ PARSE_FUN(
+ "cache", 4|NEED_FUNCTION_ARG, cache_fun,
+ "=NUMBER\nNUMBER of documents cached in memory"
+ ),
+ PARSE_SET(
+ "case", 4|SET_ARG, LYcase_sensitive,
+ "enable case sensitive user searching"
+ ),
+ PARSE_SET(
+ "center", 4|TOGGLE_ARG, no_table_center,
+ "toggle center alignment in HTML TABLE"
+ ),
+ PARSE_STR(
+ "cfg", 2|NEED_LYSTRING_ARG, lynx_cfg_file,
+ "=FILENAME\nspecifies a lynx.cfg file other than the default"
+ ),
+ PARSE_FUN(
+ "child", 4|FUNCTION_ARG, child_fun,
+ "exit on left-arrow in startfile, and disable save to disk"
+ ),
+ PARSE_FUN(
+ "child_relaxed", 4|FUNCTION_ARG, child_relaxed_fun,
+ "exit on left-arrow in startfile (allows save to disk)"
+ ),
+#ifdef USE_CMD_LOGGING
+ PARSE_STR(
+ "cmd_log", 2|NEED_LYSTRING_ARG, lynx_cmd_logfile,
+ "=FILENAME\nlog keystroke commands to the given file"
+ ),
+ PARSE_STR(
+ "cmd_script", 2|NEED_LYSTRING_ARG, lynx_cmd_script,
+ "=FILENAME\nread keystroke commands from the given file\n(see -cmd_log)"
+ ),
+#endif
+ PARSE_SET(
+ "collapse_br_tags", 4|TOGGLE_ARG, LYCollapseBRs,
+ "toggles collapsing of BR tags"
+ ),
+#ifdef USE_SLANG
+ PARSE_FUN(
+ "color", 4|FUNCTION_ARG, color_fun,
+ "force color mode on with standard bg colors"
+ ),
+#endif
+ PARSE_INT(
+ "connect_timeout", 4|NEED_INT_ARG, connect_timeout,
+ "=N\nset the N-second connection timeout"
+ ),
+ PARSE_FUN(
+ "convert_to", 4|FUNCTION_ARG, convert_to_fun,
+ "=FORMAT\nconvert input, FORMAT is in MIME type notation\n(experimental)"
+ ),
+#ifdef USE_PERSISTENT_COOKIES
+ PARSE_STR(
+ "cookie_file", 4|LYSTRING_ARG, LYCookieFile,
+ "=FILENAME\nspecifies a file to use to read cookies"
+ ),
+ PARSE_STR(
+ "cookie_save_file", 4|LYSTRING_ARG, LYCookieSaveFile,
+ "=FILENAME\nspecifies a file to use to store cookies"
+ ),
+#endif /* USE_PERSISTENT_COOKIES */
+ PARSE_SET(
+ "cookies", 4|TOGGLE_ARG, LYSetCookies,
+ "toggles handling of Set-Cookie headers"
+ ),
+#ifndef VMS
+ PARSE_SET(
+ "core", 4|TOGGLE_ARG, LYNoCore,
+ "toggles forced core dumps on fatal errors"
+ ),
+#endif
+ PARSE_FUN(
+ "crawl", 4|FUNCTION_ARG, crawl_fun,
+ "with -traversal, output each page to a file\n\
+with -dump, format output as with -traversal, but to stdout"
+ ),
+#ifdef USE_CURSES_PADS
+ PARSE_SET(
+ "curses_pads", 4|TOGGLE_ARG, LYuseCursesPads,
+ "uses curses pad feature to support left/right shifting"
+ ),
+#endif
+#ifdef DISP_PARTIAL
+ PARSE_SET(
+ "debug_partial", 4|TOGGLE_ARG, debug_display_partial,
+ "incremental display stages with MessageSecs delay"
+ ),
+#endif
+#ifdef USE_DEFAULT_COLORS
+ PARSE_SET(
+ "default_colors", 4|TOGGLE_ARG, LYuse_default_colors,
+ "use terminal default foreground/background colors"
+ ),
+#endif
+ PARSE_INT(
+ "delay", 4|NEED_TIME_ARG, DelaySecs,
+ "=NNN\nset NNN-second delay at statusline message"
+ ),
+ PARSE_FUN(
+ "display", 4|NEED_FUNCTION_ARG, display_fun,
+ "=DISPLAY\nset the display variable for X exec'ed programs"
+ ),
+ PARSE_FUN(
+ "display_charset", 4|NEED_FUNCTION_ARG, display_charset_fun,
+ "=MIMEname\ncharset for the terminal output"
+ ),
+ PARSE_SET(
+ "dont_wrap_pre", 4|SET_ARG, dont_wrap_pre,
+ "inhibit wrapping of text in <pre> when -dump'ing and\n\
+-crawl'ing, mark wrapped lines in interactive session"
+ ),
+ PARSE_FUN(
+ "dump", 1|FUNCTION_ARG, dump_output_fun,
+ "dump the first file to stdout and exit"
+ ),
+ PARSE_FUN(
+ "editor", 4|NEED_FUNCTION_ARG, editor_fun,
+ "=EDITOR\nenable edit mode with specified editor"
+ ),
+ PARSE_SET(
+ "emacskeys", 4|SET_ARG, emacs_keys,
+ "enable emacs-like key movement"
+ ),
+ PARSE_SET(
+ "enable_scrollback", 4|TOGGLE_ARG, enable_scrollback,
+ "\ntoggles compatibility with comm programs' scrollback\n\
+keys (may be incompatible with some curses packages)"
+ ),
+ PARSE_FUN(
+ "error_file", 4|NEED_FUNCTION_ARG, error_file_fun,
+ "=FILE\nwrite the HTTP status code here"
+ ),
+#if defined(EXEC_LINKS) || defined(EXEC_SCRIPTS)
+#ifndef NEVER_ALLOW_REMOTE_EXEC
+ PARSE_FUN(
+ "exec", 4|FUNCTION_ARG, exec_fun,
+ "enable local program execution"
+ ),
+#endif
+#endif /* EXEC_LINKS || EXEC_SCRIPTS */
+#ifdef VMS
+ PARSE_SET(
+ "fileversions", 4|SET_ARG, HTVMSFileVersions,
+ "include all versions of files in local VMS directory\nlistings"
+ ),
+#endif
+#ifdef LY_FIND_LEAKS
+ PARSE_SET(
+ "find_leaks", 4|TOGGLE_ARG, LYfind_leaks,
+ "toggles memory-leak checking"
+ ),
+#endif
+ PARSE_SET(
+ "force_empty_hrefless_a", 4|SET_ARG, force_empty_hrefless_a,
+ "\nforce HREF-less 'A' elements to be empty (close them as\n\
+soon as they are seen)"
+ ),
+ PARSE_SET(
+ "force_html", 4|SET_ARG, LYforce_HTML_mode,
+ "forces the first document to be interpreted as HTML"
+ ),
+ PARSE_SET(
+ "force_secure", 4|TOGGLE_ARG, LYForceSSLCookiesSecure,
+ "toggles forcing of the secure flag for SSL cookies"
+ ),
+#if !defined(NO_OPTION_FORMS) && !defined(NO_OPTION_MENU)
+ PARSE_SET(
+ "forms_options", 4|TOGGLE_ARG, LYUseFormsOptions,
+ "toggles forms-based vs old-style options menu"
+ ),
+#endif
+ PARSE_SET(
+ "from", 4|TOGGLE_ARG, LYNoFromHeader,
+ "toggle transmission of From headers"
+ ),
+#ifndef DISABLE_FTP
+ PARSE_SET(
+ "ftp", 4|UNSET_ARG, ftp_ok,
+ "disable ftp access"
+ ),
+#endif
+ PARSE_FUN(
+ "get_data", 2|FUNCTION_ARG, get_data_fun,
+ "user data for get forms, read from stdin,\nterminated by '---' on a line"
+ ),
+ PARSE_SET(
+ "head", 4|SET_ARG, HEAD_request,
+ "send a HEAD request"
+ ),
+ PARSE_FUN(
+ "help", 4|FUNCTION_ARG, help_fun,
+ "print this usage message"
+ ),
+ PARSE_FUN(
+ "hiddenlinks", 4|NEED_FUNCTION_ARG, hiddenlinks_fun,
+ "=[option]\nhidden links: options are merge, listonly, or ignore"
+ ),
+ PARSE_SET(
+ "historical", 4|TOGGLE_ARG, historical_comments,
+ "toggles use of '>' or '-->' as terminator for comments"
+ ),
+ PARSE_FUN(
+ "homepage", 4|NEED_FUNCTION_ARG, homepage_fun,
+ "=URL\nset homepage separate from start page"
+ ),
+ PARSE_SET(
+ "html5_charsets", 4|TOGGLE_ARG, html5_charsets,
+ "toggles use of HTML5 charset replacements"
+ ),
+ PARSE_SET(
+ "image_links", 4|TOGGLE_ARG, clickable_images,
+ "toggles inclusion of links for all images"
+ ),
+ PARSE_STR(
+ "index", 4|NEED_LYSTRING_ARG, indexfile,
+ "=URL\nset the default index file to URL"
+ ),
+ PARSE_SET(
+ "ismap", 4|TOGGLE_ARG, LYNoISMAPifUSEMAP,
+ "toggles inclusion of ISMAP links when client-side\nMAPs are present"
+ ),
+#ifdef USE_JUSTIFY_ELTS
+ PARSE_SET(
+ "justify", 4|SET_ARG, ok_justify,
+ "do justification of text"
+ ),
+#endif
+ PARSE_INT(
+ "link", 4|NEED_INT_ARG, crawl_count,
+ "=NUMBER\nstarting count for lnk#.dat files produced by -crawl"
+ ),
+ PARSE_SET(
+ "list_decoded", 4|TOGGLE_ARG, dump_links_decoded,
+ "with -dump, forces it to decode URL-encoded links"
+ ),
+ PARSE_SET(
+ "list_inline", 4|TOGGLE_ARG, dump_links_inline,
+ "with -dump, forces it to show links inline with text"
+ ),
+ PARSE_SET(
+ "listonly", 4|TOGGLE_ARG, dump_links_only,
+ "with -dump, forces it to show only the list of links"
+ ),
+ PARSE_SET(
+ "localhost", 4|SET_ARG, local_host_only,
+ "disable URLs that point to remote hosts"
+ ),
+#if defined(EXEC_LINKS) || defined(EXEC_SCRIPTS)
+ PARSE_SET(
+ "locexec", 4|SET_ARG, local_exec_on_local_files,
+ "enable local program execution from local files only"
+ ),
+#endif /* EXEC_LINKS || EXEC_SCRIPTS */
+#if defined(USE_COLOR_STYLE)
+ PARSE_STR(
+ "lss", 2|NEED_LYSTRING_ARG, lynx_lss_file2,
+ "=FILENAME\nspecifies a lynx.lss file other than the default"
+ ),
+#endif
+ PARSE_FUN(
+ "mime_header", 4|FUNCTION_ARG, mime_header_fun,
+ "include mime headers and force source dump"
+ ),
+ PARSE_SET(
+ "minimal", 4|TOGGLE_ARG, minimal_comments,
+ "toggles minimal versus valid comment parsing"
+ ),
+#ifdef EXP_NESTED_TABLES
+ PARSE_SET(
+ "nested_tables", 4|TOGGLE_ARG, nested_tables,
+ "toggles nested-tables logic"
+ ),
+#endif
+#ifndef DISABLE_NEWS
+ PARSE_FUN(
+ "newschunksize", 4|NEED_FUNCTION_ARG, newschunksize_fun,
+ "=NUMBER\nnumber of articles in chunked news listings"
+ ),
+ PARSE_FUN(
+ "newsmaxchunk", 4|NEED_FUNCTION_ARG, newsmaxchunk_fun,
+ "=NUMBER\nmaximum news articles in listings before chunking"
+ ),
+#endif
+#if USE_BLAT_MAILER
+ PARSE_SET(
+ "noblat", 4|TOGGLE_ARG, mail_is_blat,
+ "select mail tool (`"THIS_BLAT_MAIL"' ==> `"SYSTEM_MAIL"')"
+ ),
+#endif
+ PARSE_FUN(
+ "nobold", 4|FUNCTION_ARG, nobold_fun,
+ "disable bold video-attribute"
+ ),
+ PARSE_FUN(
+ "nobrowse", 4|FUNCTION_ARG, nobrowse_fun,
+ "disable directory browsing"
+ ),
+ PARSE_SET(
+ "nocc", 4|SET_ARG, LYNoCc,
+ "disable Cc: prompts for self copies of mailings"
+ ),
+ PARSE_FUN(
+ "nocolor", 4|FUNCTION_ARG, nocolor_fun,
+ "turn off color support"
+ ),
+#if defined(EXEC_LINKS) || defined(EXEC_SCRIPTS)
+ PARSE_SET(
+ "noexec", 4|UNSET_ARG, local_exec,
+ "disable local program execution (DEFAULT)"
+ ),
+#endif /* EXEC_LINKS || EXEC_SCRIPTS */
+ PARSE_SET(
+ "nofilereferer", 4|SET_ARG, no_filereferer,
+ "disable transmission of Referer headers for file URLs"
+ ),
+ PARSE_SET(
+ "nolist", 4|SET_ARG, no_list,
+ "disable the link list feature in dumps"
+ ),
+ PARSE_SET(
+ "nolog", 4|UNSET_ARG, error_logging,
+ "disable mailing of error messages to document owners"
+ ),
+ PARSE_SET(
+ "nomargins", 4|SET_ARG, no_margins,
+ "disable the right/left margins in the default\nstyle-sheet"
+ ),
+ PARSE_FUN(
+ "nomore", 4|FUNCTION_ARG, nomore_fun,
+ "disable -more- string in statusline messages"
+ ),
+#if defined(HAVE_SIGACTION) && defined(SIGWINCH)
+ PARSE_SET(
+ "nonrestarting_sigwinch", 4|SET_ARG, LYNonRestartingSIGWINCH,
+ "\nmake window size change handler non-restarting"
+ ),
+#endif /* HAVE_SIGACTION */
+ PARSE_SET(
+ "nonumbers", 4|SET_ARG, no_numbers,
+ "disable the link/form numbering feature in dumps"
+ ),
+ PARSE_FUN(
+ "nopause", 4|FUNCTION_ARG, nopause_fun,
+ "disable forced pauses for statusline messages"
+ ),
+ PARSE_SET(
+ "noprint", 4|SET_ARG, no_print,
+ "disable some print functions, like -restrictions=print"
+ ),
+ PARSE_SET(
+ "noredir", 4|SET_ARG, no_url_redirection,
+ "don't follow Location: redirection"
+ ),
+ PARSE_SET(
+ "noreferer", 4|SET_ARG, LYNoRefererHeader,
+ "disable transmission of Referer headers"
+ ),
+ PARSE_FUN(
+ "noreverse", 4|FUNCTION_ARG, noreverse_fun,
+ "disable reverse video-attribute"
+ ),
+#ifdef SOCKS
+ PARSE_SET(
+ "nosocks", 2|UNSET_ARG, socks_flag,
+ "don't use SOCKS proxy for this session"
+ ),
+#endif
+ PARSE_SET(
+ "nostatus", 4|SET_ARG, no_statusline,
+ "disable the miscellaneous information messages"
+ ),
+ PARSE_SET(
+ "notitle", 4|SET_ARG, no_title,
+ "disable the title at the top of each page"
+ ),
+ PARSE_FUN(
+ "nounderline", 4|FUNCTION_ARG, nounderline_fun,
+ "disable underline video-attribute"
+ ),
+ PARSE_FUN(
+ "nozap", 4|FUNCTION_ARG, nozap_fun,
+ "=DURATION (\"initially\" or \"full\") disable checks for 'z' key"
+ ),
+ PARSE_SET(
+ "number_fields", 4|SET_ARG, number_fields,
+ "force numbering of links as well as form input fields"
+ ),
+ PARSE_SET(
+ "number_links", 4|SET_ARG, number_links,
+ "force numbering of links"
+ ),
+#ifdef DISP_PARTIAL
+ PARSE_SET(
+ "partial", 4|TOGGLE_ARG, display_partial_flag,
+ "toggles display partial pages while downloading"
+ ),
+ PARSE_INT(
+ "partial_thres", 4|NEED_INT_ARG, partial_threshold,
+ "[=NUMBER]\nnumber of lines to render before repainting display\n\
+with partial-display logic"
+ ),
+#endif
+#ifndef DISABLE_FTP
+ PARSE_SET(
+ "passive_ftp", 4|TOGGLE_ARG, ftp_passive,
+ "toggles passive ftp connection"
+ ),
+#endif
+ PARSE_FUN(
+ "pauth", 4|NEED_FUNCTION_ARG, pauth_fun,
+ "=id:pw\nauthentication information for protected proxy server"
+ ),
+ PARSE_SET(
+ "popup", 4|UNSET_ARG, LYUseDefSelPop,
+ "toggles handling of single-choice SELECT options via\n\
+popup windows or as lists of radio buttons"
+ ),
+ PARSE_FUN(
+ "post_data", 2|FUNCTION_ARG, post_data_fun,
+ "user data for post forms, read from stdin,\n\
+terminated by '---' on a line"
+ ),
+ PARSE_SET(
+ "preparsed", 4|SET_ARG, LYPreparsedSource,
+ "show parsed " STR_HTML " with -source and in source view\n\
+to visualize how lynx behaves with invalid HTML"
+ ),
+#ifdef USE_PRETTYSRC
+ PARSE_SET(
+ "prettysrc", 4|SET_ARG, LYpsrc,
+ "do syntax highlighting and hyperlink handling in source\nview"
+ ),
+#endif
+ PARSE_SET(
+ "print", 4|UNSET_ARG, no_print,
+ "enable print functions (DEFAULT), opposite of -noprint"
+ ),
+ PARSE_SET(
+ "pseudo_inlines", 4|TOGGLE_ARG, pseudo_inline_alts,
+ "toggles pseudo-ALTs for inlines with no ALT string"
+ ),
+ PARSE_SET(
+ "raw", 4|UNSET_ARG, LYUseDefaultRawMode,
+ "toggles default setting of 8-bit character translations\n\
+or CJK mode for the startup character set"
+ ),
+ PARSE_SET(
+ "realm", 4|SET_ARG, check_realm,
+ "restricts access to URLs in the starting realm"
+ ),
+ PARSE_INT(
+ "read_timeout", 4|NEED_INT_ARG, reading_timeout,
+ "=N\nset the N-second read-timeout"
+ ),
+ PARSE_SET(
+ "reload", 4|SET_ARG, reloading,
+ "flushes the cache on a proxy server\n(only the first document affected)"
+ ),
+ PARSE_FUN(
+ "restrictions", 4|FUNCTION_ARG, restrictions_fun,
+ "=[options]\nuse -restrictions to see list"
+ ),
+ PARSE_SET(
+ "resubmit_posts", 4|TOGGLE_ARG, LYresubmit_posts,
+ "toggles forced resubmissions (no-cache) of forms with\n\
+method POST when the documents they returned are sought\n\
+with the PREV_DOC command or from the History List"
+ ),
+ PARSE_SET(
+ "rlogin", 4|UNSET_ARG, rlogin_ok,
+ "disable rlogins"
+ ),
+#if defined(PDCURSES) && defined(PDC_BUILD) && PDC_BUILD >= 2401
+ PARSE_FUN(
+ "scrsize", 4|NEED_FUNCTION_ARG, scrsize_fun,
+ "=width,height\nsize of window"
+ ),
+#endif
+#ifdef USE_SCROLLBAR
+ PARSE_SET(
+ "scrollbar", 4|TOGGLE_ARG, LYShowScrollbar,
+ "toggles showing scrollbar"
+ ),
+ PARSE_SET(
+ "scrollbar_arrow", 4|TOGGLE_ARG, LYsb_arrow,
+ "toggles showing arrows at ends of the scrollbar"
+ ),
+#endif
+ PARSE_FUN(
+ "selective", 4|FUNCTION_ARG, selective_fun,
+ "require .www_browsable files to browse directories"
+ ),
+#ifdef USE_SESSIONS
+ PARSE_STR(
+ "session", 2|NEED_LYSTRING_ARG, session_file,
+ "=FILENAME\nresumes from specified file on startup and\n\
+saves session to that file on exit"
+ ),
+ PARSE_STR(
+ "sessionin", 2|NEED_LYSTRING_ARG, sessionin_file,
+ "=FILENAME\nresumes session from specified file"
+ ),
+ PARSE_STR(
+ "sessionout", 2|NEED_LYSTRING_ARG, sessionout_file,
+ "=FILENAME\nsaves session to specified file"
+ ),
+#endif /* USE_SESSIONS */
+ PARSE_SET(
+ "short_url", 4|SET_ARG, long_url_ok,
+ "enables examination of beginning and end of long URL in\nstatus line"
+ ),
+ PARSE_SET(
+ "show_cfg", 1|SET_ARG, show_cfg,
+ "Show `LYNX.CFG' setting"
+ ),
+ PARSE_SET(
+ "show_cursor", 4|TOGGLE_ARG, LYUseDefShoCur,
+ "toggles hiding of the cursor in the lower right corner"
+ ),
+#ifdef USE_READPROGRESS
+ PARSE_SET(
+ "show_rate", 4|TOGGLE_ARG, LYShowTransferRate,
+ "toggles display of transfer rate"
+ ),
+#endif
+ PARSE_STR(
+ "socks5_proxy", 2|NEED_LYSTRING_ARG, socks5_proxy,
+ "=URL\n(via which) SOCKS5 proxy to connect (unrelated to -nosocks!)"
+ ),
+ PARSE_SET(
+ "soft_dquotes", 4|TOGGLE_ARG, soft_dquotes,
+ "toggles emulation of the old Netscape and Mosaic\n\
+bug which treated '>' as a co-terminator for\ndouble-quotes and tags"
+ ),
+ PARSE_FUN(
+ "source", 4|FUNCTION_ARG, source_fun,
+ "dump the source of the first file to stdout and exit"
+ ),
+ PARSE_SET(
+ "stack_dump", 4|SET_ARG, stack_dump,
+ "disable SIGINT cleanup handler"
+ ),
+ PARSE_SET(
+ "startfile_ok", 4|SET_ARG, startfile_ok,
+ "allow non-http startfile and homepage with -validate"
+ ),
+ PARSE_SET(
+ "stderr", 4|SET_ARG, dump_to_stderr,
+ "write warning messages to standard error when -dump\nor -source is used"
+ ),
+ PARSE_SET(
+ "stdin", 4|SET_ARG, startfile_stdin,
+ "read startfile from standard input"
+ ),
+#ifdef SYSLOG_REQUESTED_URLS
+ PARSE_STR(
+ "syslog", 4|NEED_LYSTRING_ARG, syslog_txt,
+ "=text\ninformation for syslog call"
+ ),
+ PARSE_SET(
+ "syslog_urls", 4|SET_ARG, syslog_requested_urls,
+ "log requested URLs with syslog"
+ ),
+#endif
+ PARSE_SET(
+ "tagsoup", 4|SET_ARG, DTD_recovery,
+ "use TagSoup rather than SortaSGML parser"
+ ),
+ PARSE_SET(
+ "telnet", 4|UNSET_ARG, telnet_ok,
+ "disable telnets"
+ ),
+ PARSE_STR(
+ "term", 4|NEED_STRING_ARG, terminal,
+ "=TERM\nset terminal type to TERM"
+ ),
+#ifdef _WINDOWS
+ PARSE_INT(
+ "timeout", 4|INT_ARG, lynx_timeout,
+ "=NUMBER\nset TCP/IP timeout"
+ ),
+#endif
+ PARSE_SET(
+ "tlog", 2|TOGGLE_ARG, LYUseTraceLog,
+ "toggles use of a Lynx Trace Log for the current\nsession"
+ ),
+#ifdef TEXTFIELDS_MAY_NEED_ACTIVATION
+ PARSE_SET(
+ "tna", 4|SET_ARG, textfields_activation_option,
+ "turn on \"Textfields Need Activation\" mode"
+ ),
+#endif
+#ifndef NO_LYNX_TRACE
+ PARSE_SET(
+ "trace", 1|SET_ARG, WWW_TraceFlag,
+ "turns on Lynx trace mode"
+ ),
+ PARSE_INT(
+ "trace_mask", 1|INT_ARG, WWW_TraceMask,
+ "customize Lynx trace mode"
+ ),
+#endif
+ PARSE_FUN(
+ "traversal", 4|FUNCTION_ARG, traversal_fun,
+ "traverse all http links derived from startfile"
+ ),
+ PARSE_SET(
+ "trim_blank_lines", 2|TOGGLE_ARG, LYtrimBlankLines,
+ "\ntoggle trimming of leading/trailing/collapsed-br blank lines"
+ ),
+ PARSE_SET(
+ "trim_input_fields", 2|SET_ARG, LYtrimInputFields,
+ "\ntrim input text/textarea fields in forms"
+ ),
+ PARSE_SET(
+ "underline_links",4|TOGGLE_ARG, LYUnderlineLinks,
+ "toggles use of underline/bold attribute for links"
+ ),
+ PARSE_SET(
+ "underscore", 4|TOGGLE_ARG, use_underscore,
+ "toggles use of _underline_ format in dumps"
+ ),
+ PARSE_SET(
+ "unique_urls", 4|TOGGLE_ARG, unique_urls,
+ "toggles use of unique-urls setting for -dump and -listonly options"
+ ),
+ PARSE_SET(
+ "update_term_title", 4|SET_ARG, update_term_title,
+ "enables updating the title of terminal emulators"
+ ),
+#if defined(USE_MOUSE)
+ PARSE_SET(
+ "use_mouse", 4|SET_ARG, LYUseMouse,
+ "turn on mouse support"
+ ),
+#endif
+ PARSE_STR(
+ "useragent", 4|NEED_LYSTRING_ARG, LYUserAgent,
+ "=Name\nset alternate Lynx User-Agent header"
+ ),
+ PARSE_SET(
+ "validate", 2|SET_ARG, LYValidate,
+ "accept only http URLs (meant for validation)\n\
+implies more restrictions than -anonymous, but\n\
+goto is allowed for http and https"
+ ),
+ PARSE_SET(
+ "verbose", 4|TOGGLE_ARG, verbose_img,
+ "toggles [LINK], [IMAGE] and [INLINE] comments\n\
+with filenames of these images"
+ ),
+ PARSE_FUN(
+ "version", 1|FUNCTION_ARG, version_fun,
+ "print Lynx version information"
+ ),
+ PARSE_SET(
+ "vikeys", 4|SET_ARG, vi_keys,
+ "enable vi-like key movement"
+ ),
+#ifdef __DJGPP__
+ PARSE_SET(
+ "wdebug", 4|TOGGLE_ARG, watt_debug,
+ "enables Waterloo tcp/ip packet debug. Prints to watt\ndebugfile"
+ ),
+#endif /* __DJGPP__ */
+ PARSE_FUN(
+ "width", 4|NEED_FUNCTION_ARG, width_fun,
+ "=NUMBER\nscreen width for formatting of dumps (default is 80)"
+ ),
+#ifndef NO_DUMP_WITH_BACKSPACES
+ PARSE_SET(
+ "with_backspaces", 4|SET_ARG, with_backspaces,
+ "emit backspaces in output if -dumping or -crawling\n(like 'man' does)"
+ ),
+#endif
+ PARSE_SET(
+ "xhtml_parsing", 4|SET_ARG, LYxhtml_parsing,
+ "enable XHTML 1.0 parsing"
+ ),
+ PARSE_NIL
+};
+/* *INDENT-ON* */
+
+static void print_help_strings(const char *name,
+ const char *help,
+ const char *value,
+ int option)
+{
+ int pad;
+ int c;
+ int first;
+ int field_width = 20;
+
+ pad = field_width - (2 + option + (int) strlen(name));
+
+ fprintf(stdout, " %s%s", option ? "-" : "", name);
+
+ if (*help != '=') {
+ pad--;
+ while (pad > 0) {
+ fputc(' ', stdout);
+ pad--;
+ }
+ fputc(' ', stdout); /* at least one space */
+ first = 0;
+ } else {
+ first = pad;
+ }
+
+ if (StrChr(help, '\n') == 0) {
+ fprintf(stdout, "%s", help);
+ } else {
+ while ((c = *help) != 0) {
+ if (c == '\n') {
+ if ((pad = --first) < 0) {
+ pad = field_width;
+ } else {
+ c = ' ';
+ }
+ fputc(c, stdout);
+ while (pad--)
+ fputc(' ', stdout);
+ } else {
+ fputc(c, stdout);
+ }
+ help++;
+ first--;
+ }
+ }
+ if (value)
+ printf(" (%s)", value);
+ fputc('\n', stdout);
+}
+
+static void print_help_and_exit(int exit_status)
+{
+ Config_Type *p;
+
+ if (pgm == NULL)
+ pgm = "lynx";
+
+ SetOutputMode(O_TEXT);
+
+ fprintf(stdout, gettext("USAGE: %s [options] [file]\n"), pgm);
+ fprintf(stdout, gettext("Options are:\n"));
+#ifdef VMS
+ print_help_strings("",
+ "receive the arguments from stdin (enclose\n\
+in double-quotes (\"-\") on VMS)", NULL, TRUE);
+#else
+ print_help_strings("", "receive options and arguments from stdin", NULL, TRUE);
+#endif /* VMS */
+
+ for (p = Arg_Table; p->name != 0; p++) {
+ char temp[LINESIZE], *value = temp;
+ ParseUnionPtr q = ParseUnionOf(p);
+
+ switch (p->type & ARG_TYPE_MASK) {
+ case TOGGLE_ARG:
+ case SET_ARG:
+ strcpy(temp, *(q->set_value) ? "on" : "off");
+ break;
+ case UNSET_ARG:
+ strcpy(temp, *(q->set_value) ? "off" : "on");
+ break;
+ case INT_ARG:
+ sprintf(temp, "%d", *(q->int_value));
+ break;
+ case TIME_ARG:
+ sprintf(temp, SECS_FMT, (double) Secs2SECS(*(q->int_value)));
+ break;
+ case STRING_ARG:
+ if ((value = *(q->str_value)) != 0
+ && !*value)
+ value = 0;
+ break;
+ default:
+ value = 0;
+ break;
+ }
+ print_help_strings(p->name, p->help_string, value, TRUE);
+ }
+
+ SetOutputMode(O_BINARY);
+
+ exit_immediately(exit_status);
+}
+
+/*
+ * This function performs a string comparison on two strings a and b. a is
+ * assumed to be an ordinary null terminated string, but b may be terminated
+ * by an '=', '+' or '-' character. If terminated by '=', *c will be pointed
+ * to the character following the '='. If terminated by '+' or '-', *c will
+ * be pointed to that character. (+/- added for toggle processing - BL.)
+ * If a and b match, it returns 1. Otherwise 0 is returned.
+ */
+static int arg_eqs_parse(const char *a,
+ char *b,
+ char **c)
+{
+ int result = -1;
+
+ *c = NULL;
+ while (result < 0) {
+ if ((*a != *b)
+ || (*a == 0)
+ || (*b == 0)) {
+ if (*a == 0) {
+ switch (*b) {
+ case '\t': /* embedded blank when reading stdin */
+ case ' ':
+ *c = LYSkipBlanks(b);
+ result = 1;
+ break;
+ case '=':
+ case ':':
+ *c = b + 1;
+ result = 1;
+ break;
+ case '-':
+#if OPTNAME_ALLOW_DASHES
+ if (isalpha(UCH(b[1]))) {
+ result = 0;
+ break;
+ }
+#endif
+ /* FALLTHRU */
+ case '+':
+ *c = b;
+ result = 1;
+ break;
+ case 0:
+ result = 1;
+ break;
+ default:
+ result = 0;
+ break;
+ }
+ } else {
+#if OPTNAME_ALLOW_DASHES
+ if (!(*a == '_' && *b == '-'))
+#endif
+ result = 0;
+ }
+ }
+ a++;
+ b++;
+ }
+ return result;
+}
+
+#define is_true(s) (*s == '1' || *s == '+' || !strcasecomp(s, "on") || !strcasecomp(s, "true"))
+#define is_false(s) (*s == '0' || *s == '-' || !strcasecomp(s, "off") || !strcasecomp(s, "false"))
+
+/*
+ * Parse an option.
+ * argv[] points to the beginning of the unprocessed options.
+ * mask is used to select certain options which must be processed
+ * before others.
+ * countp (if nonnull) points to an index into argv[], which is updated
+ * to reflect option values which are also parsed.
+ */
+static BOOL parse_arg(char **argv,
+ unsigned mask,
+ int *countp)
+{
+ Config_Type *p;
+ char *arg_name;
+
+#if EXTENDED_STARTFILE_RECALL
+ static BOOLEAN no_options_further = FALSE; /* set to TRUE after '--' argument */
+ static int nof_index = 0; /* set the index of -- argument */
+#endif
+
+ arg_name = argv[0];
+ CTRACE((tfp, "parse_arg(arg_name=%s, mask=%u, count=%d)\n",
+ arg_name, mask, countp ? *countp : -1));
+
+#if EXTENDED_STARTFILE_RECALL
+ if (mask == (unsigned) ((countp != 0) ? 0 : 1)) {
+ no_options_further = FALSE;
+ /* want to reset nonoption when beginning scan for --stdin */
+ if (nonoption != 0) {
+ FREE(nonoption);
+ }
+ }
+#endif
+
+ /*
+ * Check for a command line startfile. - FM
+ */
+ if (*arg_name != '-'
+#if EXTENDED_OPTION_LOGIC
+ || ((no_options_further == TRUE)
+ && (countp != 0)
+ && (nof_index < (*countp)))
+#endif
+ ) {
+#if EXTENDED_STARTFILE_RECALL
+ /*
+ * On the last pass (mask==4), check for cases where we may want to
+ * provide G)oto history for multiple startfiles.
+ */
+ if (mask == 4) {
+ if (nonoption != 0) {
+ LYEnsureAbsoluteURL(&nonoption, "NONOPTION", FALSE);
+ HTAddGotoURL(nonoption);
+ FREE(nonoption);
+ }
+ StrAllocCopy(nonoption, arg_name);
+ }
+#endif
+ StrAllocCopy(startfile, arg_name);
+ LYEscapeStartfile(&startfile);
+#ifdef _WINDOWS /* 1998/01/14 (Wed) 20:11:17 */
+ HTUnEscape(startfile);
+ {
+ char *q = startfile;
+
+ while (*q++) {
+ if (*q == '|')
+ *q = ':';
+ }
+ }
+#endif
+ CTRACE((tfp, "parse_arg startfile:%s\n", startfile));
+ return (BOOL) (countp != 0);
+ }
+#if EXTENDED_OPTION_LOGIC
+ if (strcmp(arg_name, "--") == 0) {
+ no_options_further = TRUE;
+ nof_index = countp ? *countp : -1;
+ return TRUE;
+ }
+#endif
+
+ /* lose the first '-' character */
+ arg_name++;
+
+ /*
+ * Skip any lone "-" arguments, because we've loaded the stdin input into
+ * an HTList structure for special handling. - FM
+ */
+ if (*arg_name == 0)
+ return TRUE;
+
+ /* allow GNU-style options with -- prefix */
+ if (*arg_name == '-')
+ ++arg_name;
+
+ CTRACE((tfp, "parse_arg lookup(%s)\n", arg_name));
+
+ p = Arg_Table;
+ while (p->name != 0) {
+ ParseUnionPtr q = ParseUnionOf(p);
+ ParseFunc fun;
+ char *next_arg = NULL;
+ char *temp_ptr = NULL;
+
+ if ((p->name[0] != *arg_name)
+ || (0 == arg_eqs_parse(p->name, arg_name, &next_arg))) {
+ p++;
+ continue;
+ }
+
+ if (p->type & NEED_NEXT_ARG) {
+ if (next_arg == 0) {
+ next_arg = argv[1];
+ if ((countp != 0) && (next_arg != 0))
+ (*countp)++;
+ }
+ CTRACE((tfp, "...arg:%s\n", NONNULL(next_arg)));
+ }
+
+ /* ignore option if it's not our turn */
+ if (((unsigned) (p->type) & mask) == 0) {
+ CTRACE((tfp, "...skip (mask %u/%d)\n", mask, p->type & 7));
+ return FALSE;
+ }
+
+ switch (p->type & ARG_TYPE_MASK) {
+ case TOGGLE_ARG: /* FALLTHRU */
+ case SET_ARG: /* FALLTHRU */
+ case UNSET_ARG:
+ if (q->set_value != 0) {
+ if (next_arg == 0) {
+ switch (p->type & ARG_TYPE_MASK) {
+ case TOGGLE_ARG:
+ *(q->set_value) = (BOOL) !(*(q->set_value));
+ break;
+ case SET_ARG:
+ *(q->set_value) = TRUE;
+ break;
+ case UNSET_ARG:
+ *(q->set_value) = FALSE;
+ break;
+ }
+ } else if (is_true(next_arg)) {
+ *(q->set_value) = TRUE;
+ } else if (is_false(next_arg)) {
+ *(q->set_value) = FALSE;
+ }
+ /* deliberately ignore anything else - BL */
+ }
+ break;
+
+ case FUNCTION_ARG:
+ fun = q->fun_value;
+ if (0 != fun) {
+ if (-1 == (*fun) (next_arg)) {
+ }
+ }
+ break;
+
+ case LYSTRING_ARG:
+ if ((q->str_value != 0) && (next_arg != 0))
+ StrAllocCopy(*(q->str_value), next_arg);
+ break;
+
+ case INT_ARG:
+ if ((q->int_value != 0) && (next_arg != 0))
+ *(q->int_value) = (int) strtol(next_arg, &temp_ptr, 0);
+ break;
+
+ case TIME_ARG:
+ if ((q->int_value != 0) && (next_arg != 0)) {
+ float ival;
+
+ if (1 == LYscanFloat(next_arg, &ival)) {
+ *(q->int_value) = (int) SECS2Secs(ival);
+ }
+ }
+ break;
+
+ case STRING_ARG:
+ if ((q->str_value != 0) && (next_arg != 0))
+ *(q->str_value) = next_arg;
+ break;
+ }
+
+ Old_DTD = DTD_recovery; /* BOOL != int */
+ return TRUE;
+ }
+
+ if (pgm == 0)
+ pgm = "LYNX";
+
+ fprintf(stderr, gettext("%s: Invalid Option: %s\n"), pgm, argv[0]);
+ print_help_and_exit(-1);
+ return FALSE;
+}
+
+#ifndef VMS
+static void FatalProblem(int sig)
+{
+ /*
+ * Ignore further interrupts. - mhc: 11/2/91
+ */
+#ifndef NOSIGHUP
+ (void) signal(SIGHUP, SIG_IGN);
+#endif /* NOSIGHUP */
+ (void) signal(SIGTERM, SIG_IGN);
+ (void) signal(SIGINT, SIG_IGN);
+#ifndef __linux__
+#ifdef SIGBUS
+ (void) signal(SIGBUS, SIG_IGN);
+#endif /* ! SIGBUS */
+#endif /* !__linux__ */
+ (void) signal(SIGSEGV, SIG_IGN);
+ (void) signal(SIGILL, SIG_IGN);
+
+ /*
+ * Flush all messages. - FM
+ */
+ fflush(stderr);
+ fflush(stdout);
+
+ /*
+ * Deal with curses, if on, and clean up. - FM
+ */
+ if (LYOutOfMemory && LYCursesON) {
+ LYSleepAlert();
+ }
+ cleanup_sig(0);
+#ifndef __linux__
+#ifdef SIGBUS
+ signal(SIGBUS, SIG_DFL);
+#endif /* SIGBUS */
+#endif /* !__linux__ */
+ signal(SIGSEGV, SIG_DFL);
+ signal(SIGILL, SIG_DFL);
+
+ /*
+ * Issue appropriate messages and abort or exit. - FM
+ */
+ if (LYOutOfMemory == FALSE) {
+ fprintf(stderr, "\r\n\
+A Fatal error has occurred in %s Ver. %s\r\n", LYNX_NAME, LYNX_VERSION);
+
+ fprintf(stderr, "\r\n\
+Please notify your system administrator to confirm a bug, and\r\n\
+if confirmed, to notify the lynx-dev list. Bug reports should\r\n\
+have concise descriptions of the command and/or URL which causes\r\n\
+the problem, the operating system name with version number, the\r\n\
+TCPIP implementation, and any other relevant information.\r\n");
+
+ if (!(sig == 0 && LYNoCore)) {
+ fprintf(stderr, "\r\n\
+Do NOT mail the core file if one was generated.\r\n");
+ }
+ if (sig != 0) {
+ fprintf(stderr, "\r\n\
+Lynx now exiting with signal: %d\r\n\r\n", sig);
+#ifdef WIN_EX /* 1998/08/09 (Sun) 09:58:25 */
+ {
+ char *msg;
+
+ switch (sig) {
+ case SIGABRT:
+ msg = "SIGABRT";
+ break;
+ case SIGFPE:
+ msg = "SIGFPE";
+ break;
+ case SIGILL:
+ msg = "SIGILL";
+ break;
+ case SIGSEGV:
+ msg = "SIGSEGV";
+ break;
+ default:
+ msg = "Not-def";
+ break;
+ }
+ fprintf(stderr, "signal code = %s\n", msg);
+ }
+#endif
+ }
+
+ /*
+ * Exit and possibly dump core.
+ */
+ if (LYNoCore) {
+ exit_immediately(EXIT_FAILURE);
+ }
+ abort();
+
+ } else {
+ LYOutOfMemory = FALSE;
+ printf("\r\n%s\r\n\r\n", MEMORY_EXHAUSTED_ABORT);
+ fflush(stdout);
+
+ /*
+ * Exit without dumping core.
+ */
+ exit_immediately(EXIT_FAILURE);
+ }
+}
+#endif /* !VMS */
diff --git a/src/LYMainLoop.c b/src/LYMainLoop.c
new file mode 100644
index 0000000..6b13814
--- /dev/null
+++ b/src/LYMainLoop.c
@@ -0,0 +1,8212 @@
+/*
+ * $LynxId: LYMainLoop.c,v 1.250 2023/01/05 09:17:16 tom Exp $
+ */
+#include <HTUtils.h>
+#include <HTAccess.h>
+#include <HTParse.h>
+#include <HTList.h>
+#include <HTML.h>
+#include <HTFTP.h>
+#include <HTFile.h>
+#include <HTTP.h>
+#include <HTAABrow.h>
+#include <HTNews.h>
+#include <LYCurses.h>
+#include <LYStyle.h>
+#include <LYGlobalDefs.h>
+#include <HTAlert.h>
+#include <LYUtils.h>
+#include <GridText.h>
+#include <LYStrings.h>
+#include <LYOptions.h>
+#include <LYSignal.h>
+#include <LYGetFile.h>
+#include <HTForms.h>
+#include <LYSearch.h>
+#include <LYClean.h>
+#include <LYHistory.h>
+#include <LYPrint.h>
+#include <LYMail.h>
+#include <LYEdit.h>
+#include <LYShowInfo.h>
+#include <LYBookmark.h>
+#include <LYKeymap.h>
+#include <LYJump.h>
+#include <LYDownload.h>
+#include <LYList.h>
+#include <LYMap.h>
+#include <LYTraversal.h>
+#include <LYCharSets.h>
+#include <LYCharUtils.h>
+#include <LYCookie.h>
+#include <LYMainLoop.h>
+#include <LYPrettySrc.h>
+
+#ifdef USE_SESSIONS
+#include <LYSession.h>
+#endif
+
+#ifdef KANJI_CODE_OVERRIDE
+#include <HTCJK.h>
+#endif
+
+#ifdef PREVENT_KEYBOARD_WRAPAROUND
+#define HandleForwardWraparound() \
+ *old_c = real_c; \
+ HTInfoMsg(ALREADY_AT_END)
+#define HandleReverseWraparound() \
+ *old_c = real_c; \
+ HTInfoMsg(ALREADY_AT_BEGIN)
+#else
+#define HandleForwardWraparound() \
+ LYSetNewline(1)
+#define HandleReverseWraparound() \
+ int i; \
+ i = HText_getNumOfLines() - display_lines + 2; \
+ if (i >= 1 && Newline != i) { \
+ LYSetNewline(i); \
+ *arrowup = TRUE; \
+ }
+#endif
+
+#define LinkIsTextarea(linkNumber) \
+ (links[linkNumber].type == WWW_FORM_LINK_TYPE && \
+ links[linkNumber].l_form->type == F_TEXTAREA_TYPE)
+
+#define LinkIsTextLike(linkNumber) \
+ (links[linkNumber].type == WWW_FORM_LINK_TYPE && \
+ F_TEXTLIKE(links[linkNumber].l_form->type))
+
+#ifdef KANJI_CODE_OVERRIDE
+char *str_kcode(HTkcode code)
+{
+ char *p;
+ static char buff[8];
+
+ if (current_char_set == TRANSPARENT) {
+ p = "THRU";
+ } else if (!LYRawMode) {
+ p = "RAW";
+ } else {
+ switch (code) {
+ case NOKANJI:
+ p = "AUTO";
+ break;
+
+ case EUC:
+ p = "EUC+";
+ break;
+
+ case SJIS:
+ p = "SJIS";
+ break;
+
+ case JIS:
+ p = " JIS";
+ break;
+
+ default:
+ p = " ???";
+ break;
+ }
+ }
+
+ if (no_table_center) {
+ buff[0] = '!';
+ strcpy(buff + 1, p);
+ } else {
+ strcpy(buff, p);
+ }
+
+ return buff;
+}
+#endif
+
+#ifdef WIN_EX
+
+static char *str_sjis(char *to, char *from)
+{
+ if (!LYRawMode) {
+ strcpy(to, from);
+#ifdef KANJI_CODE_OVERRIDE
+ } else if (last_kcode == EUC) {
+ EUC_TO_SJIS(from, to);
+ } else if (last_kcode == SJIS) {
+ strcpy(to, from);
+#endif
+ } else {
+ TO_SJIS((unsigned char *) from, (unsigned char *) to);
+ }
+ return to;
+}
+
+static void set_ws_title(char *str)
+{
+ SetConsoleTitle(str);
+}
+
+#endif /* WIN_EX */
+
+#if defined(USE_EXTERNALS) || defined(WIN_EX)
+#include <LYExtern.h>
+#endif
+
+#ifdef __EMX__
+#include <io.h>
+#endif
+
+#ifdef DIRED_SUPPORT
+#include <LYLocal.h>
+#include <LYUpload.h>
+#endif /* DIRED_SUPPORT */
+
+#include <LYexit.h>
+#include <LYLeaks.h>
+
+/* two constants: */
+HTLinkType *HTInternalLink = 0;
+HTAtom *WWW_SOURCE = 0;
+
+#define NONINTERNAL_OR_PHYS_DIFFERENT(p,n) \
+ ((track_internal_links && \
+ (!curdoc.internal_link || are_phys_different(p,n))) || \
+ are_different(p,n))
+
+#define NO_INTERNAL_OR_DIFFERENT(c,n) \
+ (track_internal_links || are_different(c,n))
+
+static void exit_immediately_with_error_message(int state, int first_file);
+static void status_link(const char *curlink_name, int show_more, int show_indx);
+static void show_main_statusline(const LinkInfo curlink, int for_what);
+static void form_noviceline(int);
+static int are_different(DocInfo *doc1, DocInfo *doc2);
+
+static int are_phys_different(DocInfo *doc1, DocInfo *doc2);
+
+#define FASTTAB
+
+static int sametext(char *een,
+ char *twee)
+{
+ if (een && twee)
+ return (strcmp(een, twee) == 0);
+ return TRUE;
+}
+
+HTList *Goto_URLs = NULL; /* List of Goto URLs */
+
+char *LYRequestTitle = NULL; /* newdoc.title in calls to getfile() */
+char *LYRequestReferer = NULL; /* Referer, may be set in getfile() */
+
+static bstring *prev_target = NULL;
+
+#ifdef DISP_PARTIAL
+BOOLEAN display_partial = FALSE; /* could be enabled in HText_new() */
+int NumOfLines_partial = 0; /* number of lines displayed in partial mode */
+#endif
+
+static int Newline = 0;
+static DocInfo newdoc;
+static DocInfo curdoc;
+static char *traversal_host = NULL;
+static char *traversal_link_to_add = NULL;
+static char *owner_address = NULL; /* Holds the responsible owner's address */
+static char *ownerS_address = NULL; /* Holds owner's address during source fetch */
+
+#ifdef TEXTFIELDS_MAY_NEED_ACTIVATION
+static BOOL textinput_activated = FALSE;
+
+#else
+#define textinput_activated TRUE /* a current text input is always active */
+#endif
+#ifdef INACTIVE_INPUT_STYLE_VH
+BOOL textinput_redrawn = FALSE;
+
+ /*must be public since used in LYhighlight(..) */
+#endif
+
+#ifdef LY_FIND_LEAKS
+/*
+ * Function for freeing allocated mainloop() variables. - FM
+ */
+static void free_mainloop_variables(void)
+{
+ LYFreeDocInfo(&newdoc);
+ LYFreeDocInfo(&curdoc);
+
+#ifdef USE_COLOR_STYLE
+ FREE(curdoc.style);
+ FREE(newdoc.style);
+#endif
+ FREE(traversal_host);
+ FREE(traversal_link_to_add);
+ FREE(owner_address);
+ FREE(ownerS_address);
+#ifdef DIRED_SUPPORT
+ clear_tags();
+ reset_dired_menu();
+#endif /* DIRED_SUPPORT */
+ FREE(WWW_Download_File); /* LYGetFile.c/HTFWriter.c */
+ FREE(LYRequestReferer);
+
+ return;
+}
+#endif /* LY_FIND_LEAKS */
+
+#ifndef NO_LYNX_TRACE
+static void TracelogOpenFailed(void)
+{
+ WWW_TraceFlag = FALSE;
+ if (LYCursesON) {
+ HTUserMsg(TRACELOG_OPEN_FAILED);
+ } else {
+ fprintf(stderr, "%s\n", TRACELOG_OPEN_FAILED);
+ exit_immediately(EXIT_FAILURE);
+ }
+}
+
+static BOOLEAN LYReopenTracelog(BOOLEAN *trace_flag_ptr)
+{
+ CTRACE((tfp, "\nTurning off TRACE for fetch of log.\n"));
+ LYCloseTracelog();
+ if ((LYTraceLogFP = LYAppendToTxtFile(LYTraceLogPath)) == NULL) {
+ TracelogOpenFailed();
+ return FALSE;
+ }
+ if (TRACE) {
+ WWW_TraceFlag = FALSE;
+ *trace_flag_ptr = TRUE;
+ }
+ return TRUE;
+}
+
+static void turn_trace_back_on(BOOLEAN *trace_flag_ptr)
+{
+ if (*trace_flag_ptr == TRUE) {
+ WWW_TraceFlag = TRUE;
+ *trace_flag_ptr = FALSE;
+ fprintf(tfp, "Turning TRACE back on.\n\n");
+ }
+}
+#else
+#define LYReopenTracelog(flag) TRUE
+#define turn_trace_back_on(flag) /*nothing */
+#endif /* NO_LYNX_TRACE */
+
+FILE *TraceFP(void)
+{
+#ifndef NO_LYNX_TRACE
+ if (LYTraceLogFP != 0) {
+ return LYTraceLogFP;
+ }
+#endif /* NO_LYNX_TRACE */
+ return stderr;
+}
+
+BOOLEAN LYOpenTraceLog(void)
+{
+#ifndef NO_LYNX_TRACE
+ if (TRACE && LYUseTraceLog && LYTraceLogFP == NULL) {
+ /*
+ * If we can't open it for writing, give up. Otherwise, on VMS close
+ * it, delete it and any versions from previous sessions so they don't
+ * accumulate, and open it again. - FM
+ */
+ if ((LYTraceLogFP = LYNewTxtFile(LYTraceLogPath)) == NULL) {
+ TracelogOpenFailed();
+ return FALSE;
+ }
+#ifdef VMS
+ LYCloseTracelog();
+ HTSYS_remove(LYTraceLogPath);
+ if ((LYTraceLogFP = LYNewTxtFile(LYTraceLogPath)) == NULL) {
+ TracelogOpenFailed();
+ return FALSE;
+ }
+#endif /* VMS */
+ fflush(stdout);
+ fflush(stderr);
+ fprintf(tfp, "\t\t%s (%s)\n\n", LYNX_TRACELOG_TITLE, LYNX_VERSION);
+ /*
+ * If TRACE is on, indicate whether the anonymous restrictions are set.
+ * - FM, LP, kw
+ *
+ * This is only a summary for convenience - it doesn't take the case of
+ * individual -restrictions= options into account. - kw
+ */
+ if (LYValidate) {
+ if (LYRestricted && had_restrictions_default) {
+ CTRACE((tfp,
+ "Validate and some anonymous restrictions are set.\n"));
+ } else if (had_restrictions_default) {
+ CTRACE((tfp,
+ "Validate restrictions set, restriction \"default\" was given.\n"));
+ } else if (LYRestricted) {
+ CTRACE((tfp,
+ "Validate restrictions set, additional anonymous restrictions ignored.\n"));
+ } else {
+ CTRACE((tfp, "Validate restrictions are set.\n"));
+ }
+ /* But none of the above can actually happen, since there should
+ * never be a Trace Log with -validate. If it appears in a log
+ * file something went wrong! */
+ } else if (LYRestricted) {
+ if (had_restrictions_all) {
+ CTRACE((tfp,
+ "Anonymous restrictions set, restriction \"all\" was given.\n"));
+ } else {
+ CTRACE((tfp, "Anonymous restrictions are set.\n"));
+ }
+ } else if (had_restrictions_all && had_restrictions_default) {
+ CTRACE((tfp, "Restrictions \"all\" and \"default\" were given.\n"));
+ } else if (had_restrictions_default) {
+ CTRACE((tfp, "Restriction \"default\" was given.\n"));
+ } else if (had_restrictions_all) {
+ CTRACE((tfp, "\"all\" restrictions are set.\n"));
+ }
+ }
+#endif /* NO_LYNX_TRACE */
+ return TRUE;
+}
+
+void LYCloseTracelog(void)
+{
+#ifndef NO_LYNX_TRACE
+ if (LYTraceLogFP != 0) {
+ fflush(stdout);
+ fflush(stderr);
+ fclose(LYTraceLogFP);
+ LYTraceLogFP = 0;
+ }
+#endif /* NO_LYNX_TRACE */
+}
+
+void handle_LYK_TRACE_TOGGLE(void)
+{
+#ifndef NO_LYNX_TRACE
+ WWW_TraceFlag = (BOOLEAN) !WWW_TraceFlag;
+ if (LYOpenTraceLog())
+ HTUserMsg(WWW_TraceFlag ? TRACE_ON : TRACE_OFF);
+#else
+ HTUserMsg(TRACE_DISABLED);
+#endif /* NO_LYNX_TRACE */
+}
+
+void LYSetNewline(int value)
+{
+ Newline = value;
+}
+
+#define LYSetNewline(value) Newline = value
+
+int LYGetNewline(void)
+{
+ return Newline;
+}
+
+#define LYGetNewline() Newline
+
+void LYChgNewline(int adjust)
+{
+ LYSetNewline(Newline + adjust);
+}
+
+#define LYChgNewline(adjust) Newline += (adjust)
+
+#ifdef USE_SOURCE_CACHE
+static BOOLEAN from_source_cache = FALSE;
+
+/*
+ * Like HTreparse_document(), but also set the flag.
+ */
+static BOOLEAN reparse_document(void)
+{
+ BOOLEAN result;
+
+ from_source_cache = TRUE; /* set for LYMainLoop_pageDisplay() */
+ if ((result = HTreparse_document()) != FALSE) {
+ from_source_cache = TRUE; /* set for mainloop refresh */
+ } else {
+ from_source_cache = FALSE;
+ }
+ return result;
+}
+#endif /* USE_SOURCE_CACHE */
+
+/*
+ * Prefer reparsing if we can, but reload if we must - to force regeneration
+ * of the display.
+ */
+static BOOLEAN reparse_or_reload(int *cmd)
+{
+#ifdef USE_SOURCE_CACHE
+ if (reparse_document()) {
+ return FALSE;
+ }
+#endif
+ *cmd = LYK_RELOAD;
+ return TRUE;
+}
+
+/*
+ * Functions for setting the current address
+ */
+static void set_address(DocInfo *doc, const char *address)
+{
+ StrAllocCopy(doc->address, address);
+}
+
+static void copy_address(DocInfo *dst, DocInfo *src)
+{
+ StrAllocCopy(dst->address, src->address);
+}
+
+static void free_address(DocInfo *doc)
+{
+ FREE(doc->address);
+}
+
+static void move_address(DocInfo *dst, DocInfo *src)
+{
+ copy_address(dst, src);
+ free_address(src);
+}
+
+#ifdef DISP_PARTIAL
+/*
+ * This is for traversal call from within partial mode in LYUtils.c
+ * and HTFormat.c It simply calls HText_pageDisplay() but utilizes
+ * LYMainLoop.c static variables to manage proper newline position
+ * in case of #fragment
+ */
+BOOL LYMainLoop_pageDisplay(int line_num)
+{
+ const char *pound;
+ int prev_newline = LYGetNewline();
+
+ /*
+ * Override Newline with a new value if user scrolled the document while
+ * loading (in LYUtils.c).
+ */
+ LYSetNewline(line_num);
+
+#ifdef USE_SOURCE_CACHE
+ /*
+ * reparse_document() acts on 'curdoc' which always on top of the
+ * history stack: no need to resolve #fragment position since
+ * we already know it (curdoc.line).
+ * So bypass here. Sorry for possible confusion...
+ */
+ if (!from_source_cache)
+#endif
+ /*
+ * If the requested URL has the #fragment, and we are not popped
+ * from the history stack, and have not scrolled the document yet -
+ * we should calculate correct newline position for the fragment.
+ * (This is a bit suboptimal since HTFindPoundSelector() traverse
+ * anchors list each time, so we have a quadratic complexity
+ * and may load CPU in a worst case).
+ */
+ if (display_partial
+ && newdoc.line == 1 && line_num == 1 && prev_newline == 1
+ && (pound = findPoundSelector(newdoc.address))
+ && *pound && *(pound + 1)) {
+ if (HTFindPoundSelector(pound + 1)) {
+ /* HTFindPoundSelector will initialize www_search_result */
+ LYSetNewline(www_search_result);
+ } else {
+ LYSetNewline(prev_newline); /* restore ??? */
+ return NO; /* no repaint */
+ }
+ }
+
+ HText_pageDisplay(LYGetNewline(), prev_target->str);
+ return YES;
+}
+#endif /* DISP_PARTIAL */
+
+static BOOL set_curdoc_link(int nextlink)
+{
+ BOOL result = FALSE;
+
+ if (curdoc.link != nextlink
+ && nextlink >= 0
+ && nextlink < nlinks) {
+ if (curdoc.link >= 0 && curdoc.link < nlinks) {
+ LYhighlight(FALSE, curdoc.link, prev_target->str);
+ result = TRUE;
+ }
+ curdoc.link = nextlink;
+ }
+ return result;
+}
+
+/*
+ * Setup newdoc to jump to the given line.
+ *
+ * FIXME: prefer to also jump to the link given in a URL fragment, but the
+ * interface of getfile() does not provide that ability yet.
+ */
+static void goto_line(int nextline)
+{
+ int n;
+ int old_link = newdoc.link;
+
+ newdoc.link = 0;
+ for (n = 0; n < nlinks; ++n) {
+ if (nextline == links[n].anchor_line_num + 1) {
+ CTRACE((tfp, "top_of_screen %d\n", HText_getTopOfScreen() + 1));
+ CTRACE((tfp, "goto_line(%d) -> link %d -> %d\n", nextline,
+ old_link, n));
+ newdoc.link = n;
+ break;
+ }
+ }
+}
+
+#ifdef USE_MOUSE
+static void set_curdoc_link_by_mouse(int nextlink)
+{
+ if (set_curdoc_link(nextlink)) {
+ LYhighlight(TRUE, nextlink, prev_target->str);
+ LYmsec_delay(20);
+ }
+}
+#else
+#define set_curdoc_link_by_mouse(nextlink) set_curdoc_link(nextlink)
+#endif
+
+static int do_change_link(void)
+{
+#ifdef USE_MOUSE
+ /* Is there a mouse-clicked link waiting? */
+ int mouse_tmp = get_mouse_link();
+
+ /* If yes, use it as the link */
+ if (mouse_tmp != -1) {
+ if (mouse_tmp < 0 || mouse_tmp >= nlinks) {
+ char *msgtmp = NULL;
+
+ HTSprintf0(&msgtmp,
+ gettext("Internal error: Invalid mouse link %d!"),
+ mouse_tmp);
+ HTAlert(msgtmp);
+ FREE(msgtmp);
+ return (-1); /* indicates unexpected error */
+ }
+ set_curdoc_link_by_mouse(mouse_tmp);
+ }
+#endif /* USE_MOUSE */
+ return (0); /* indicates OK */
+}
+
+#ifdef DIRED_SUPPORT
+#define DIRED_UNCACHE_1 if (LYAutoUncacheDirLists < 1) /*nothing*/ ;\
+ else HTuncache_current_document()
+#define DIRED_UNCACHE_2 if (LYAutoUncacheDirLists < 2) /*nothing*/ ;\
+ else HTuncache_current_document()
+#endif /* DIRED_SUPPORT */
+
+static void do_check_goto_URL(bstring **user_input,
+ char **old_user_input,
+ BOOLEAN *force_load)
+{
+ static BOOLEAN always = TRUE;
+ /* *INDENT-OFF* */
+ static struct {
+ const char *name;
+ BOOLEAN *flag;
+ } table[] = {
+ { STR_FILE_URL, &no_file_url },
+ { STR_FILE_URL, &no_goto_file },
+ { STR_LYNXEXEC, &no_goto_lynxexec },
+ { STR_LYNXPROG, &no_goto_lynxprog },
+ { STR_LYNXCGI, &no_goto_lynxcgi },
+ { STR_CSO_URL, &no_goto_cso },
+ { STR_FINGER_URL, &no_goto_finger },
+ { STR_FTP_URL, &no_goto_ftp },
+ { STR_GOPHER_URL, &no_goto_gopher },
+ { STR_HTTP_URL, &no_goto_http },
+ { STR_HTTPS_URL, &no_goto_https },
+ { STR_MAILTO_URL, &no_goto_mailto },
+ { STR_RLOGIN_URL, &no_goto_rlogin },
+ { STR_TELNET_URL, &no_goto_telnet },
+ { STR_TN3270_URL, &no_goto_tn3270 },
+ { STR_WAIS_URL, &no_goto_wais },
+#ifndef DISABLE_BIBP
+ { STR_BIBP_URL, &no_goto_bibp },
+#endif
+#ifndef DISABLE_NEWS
+ { STR_NEWS_URL, &no_goto_news },
+ { STR_NNTP_URL, &no_goto_nntp },
+ { STR_SNEWS_URL, &no_goto_snews },
+#endif
+#ifdef EXEC_LINKS
+ { STR_LYNXEXEC, &local_exec_on_local_files },
+ { STR_LYNXPROG, &local_exec_on_local_files },
+#endif /* EXEC_LINKS */
+ { STR_LYNXCFG, &no_goto_configinfo },
+ { STR_LYNXCFLAGS, &no_goto_configinfo },
+ { STR_LYNXCOOKIE, &always },
+#ifdef USE_CACHEJAR
+ { STR_LYNXCACHE, &always },
+#endif
+ { STR_LYNXDIRED, &always },
+ { STR_LYNXDOWNLOAD, &always },
+ { STR_LYNXOPTIONS, &always },
+ { STR_LYNXPRINT, &always },
+ };
+ /* *INDENT-ON* */
+
+ unsigned n;
+ BOOLEAN found = FALSE;
+
+ /* allow going to anchors */
+ if ((*user_input)->str[0] == '#') {
+ if ((*user_input)->str[1] &&
+ HTFindPoundSelector((*user_input)->str + 1)) {
+ /* HTFindPoundSelector will initialize www_search_result,
+ so we do nothing else. */
+ HTAddGotoURL((*user_input)->str);
+ trimPoundSelector(curdoc.address);
+ StrAllocCat(curdoc.address, (*user_input)->str);
+ }
+ } else {
+ /*
+ * If it's not a URL then make it one.
+ */
+ StrAllocCopy(*old_user_input, (*user_input)->str);
+ LYEnsureAbsoluteURL(old_user_input, "", TRUE);
+ BStrCopy0((*user_input), *old_user_input);
+ FREE(*old_user_input);
+
+ for (n = 0; n < TABLESIZE(table); n++) {
+ if (*(table[n].flag)
+ && !StrNCmp((*user_input)->str,
+ table[n].name,
+ strlen(table[n].name))) {
+ found = TRUE;
+ HTUserMsg2(GOTO_XXXX_DISALLOWED, table[n].name);
+ break;
+ }
+ }
+ if (found) {
+ ;
+ } else if (LYValidate &&
+ !isHTTP_URL((*user_input)->str) &&
+ !isHTTPS_URL((*user_input)->str)) {
+ HTUserMsg(GOTO_NON_HTTP_DISALLOWED);
+
+ } else {
+ set_address(&newdoc, (*user_input)->str);
+ newdoc.isHEAD = FALSE;
+ /*
+ * Might be an anchor in the same doc from a POST form. If so,
+ * don't free the content. -- FM
+ */
+ if (are_different(&curdoc, &newdoc)) {
+ /*
+ * Make a name for this new URL.
+ */
+ StrAllocCopy(newdoc.title,
+ gettext("A URL specified by the user"));
+ LYFreePostData(&newdoc);
+ FREE(newdoc.bookmark);
+ newdoc.safe = FALSE;
+ newdoc.internal_link = FALSE;
+ *force_load = TRUE;
+#ifdef DIRED_SUPPORT
+ if (lynx_edit_mode) {
+ DIRED_UNCACHE_2;
+ }
+#endif /* DIRED_SUPPORT */
+ }
+ LYUserSpecifiedURL = TRUE;
+ HTAddGotoURL(newdoc.address);
+ }
+ }
+}
+
+/* returns FALSE if user cancelled input or URL was invalid, TRUE otherwise */
+static BOOL do_check_recall(int ch,
+ bstring **user_input,
+ char **old_user_input,
+ int URLTotal,
+ int *URLNum,
+ RecallType recall,
+ BOOLEAN *FirstURLRecall)
+{
+ char *cp;
+ BOOL ret = FALSE;
+
+ if (*old_user_input == 0)
+ StrAllocCopy(*old_user_input, "");
+
+ for (;;) {
+#ifdef WIN_EX /* 1998/10/11 (Sun) 10:41:05 */
+ int len = (int) strlen((*user_input)->str);
+
+ if (len >= 3) {
+ if (len < MAX_LINE - 1
+ && LYIsHtmlSep((*user_input)->str[len - 3])
+ && LYIsDosDrive((*user_input)->str + len - 2))
+ LYAddPathSep0((*user_input)->str);
+
+ } else if (len == 2 && (*user_input)->str[1] == ':') {
+ if (LYIsDosDrive((*user_input)->str)) {
+ LYAddPathSep0((*user_input)->str);
+ } else {
+ HTUserMsg2(WWW_ILLEGAL_URL_MESSAGE, (*user_input)->str);
+ BStrCopy0((*user_input), *old_user_input);
+ FREE(*old_user_input);
+ ret = FALSE;
+ break;
+ }
+ }
+#endif
+ /*
+ * Get rid of leading spaces (and any other spaces).
+ */
+ LYTrimAllStartfile((*user_input)->str);
+ if (isBEmpty(*user_input) &&
+ !(recall && (ch == UPARROW_KEY || ch == DNARROW_KEY))) {
+ BStrCopy0((*user_input), *old_user_input);
+ FREE(*old_user_input);
+ HTInfoMsg(CANCELLED);
+ ret = FALSE;
+ break;
+ }
+ if (recall && ch == UPARROW_KEY) {
+ if (*FirstURLRecall) {
+ /*
+ * Use last URL in the list. - FM
+ */
+ *FirstURLRecall = FALSE;
+ *URLNum = 0;
+ } else {
+ /*
+ * Go back to the previous URL in the list. - FM
+ */
+ *URLNum += 1;
+ }
+ if (*URLNum >= URLTotal)
+ /*
+ * Roll around to the last URL in the list. - FM
+ */
+ *URLNum = 0;
+ if ((cp = (char *) HTList_objectAt(Goto_URLs,
+ *URLNum)) != NULL) {
+ BStrCopy0((*user_input), cp);
+ if (goto_buffer
+ && **old_user_input
+ && !strcmp(*old_user_input, (*user_input)->str)) {
+ _statusline(EDIT_CURRENT_GOTO);
+ } else if ((goto_buffer && URLTotal == 2) ||
+ (!goto_buffer && URLTotal == 1)) {
+ _statusline(EDIT_THE_PREV_GOTO);
+ } else {
+ _statusline(EDIT_A_PREV_GOTO);
+ }
+ if ((ch = LYgetBString(user_input, FALSE, 0, recall)) < 0) {
+ /*
+ * User cancelled the Goto via ^G. Restore
+ * user_input and break. - FM
+ */
+ BStrCopy0((*user_input), *old_user_input);
+ FREE(*old_user_input);
+ HTInfoMsg(CANCELLED);
+ ret = FALSE;
+ break;
+ }
+ continue;
+ }
+ } else if (recall && ch == DNARROW_KEY) {
+ if (*FirstURLRecall) {
+ /*
+ * Use the first URL in the list. - FM
+ */
+ *FirstURLRecall = FALSE;
+ *URLNum = URLTotal - 1;
+ } else {
+ /*
+ * Advance to the next URL in the list. - FM
+ */
+ *URLNum -= 1;
+ }
+ if (*URLNum < 0)
+ /*
+ * Roll around to the first URL in the list. - FM
+ */
+ *URLNum = URLTotal - 1;
+ if ((cp = (char *) HTList_objectAt(Goto_URLs, *URLNum)) != NULL) {
+ BStrCopy0((*user_input), cp);
+ if (goto_buffer && **old_user_input &&
+ !strcmp(*old_user_input, (*user_input)->str)) {
+ _statusline(EDIT_CURRENT_GOTO);
+ } else if ((goto_buffer && URLTotal == 2) ||
+ (!goto_buffer && URLTotal == 1)) {
+ _statusline(EDIT_THE_PREV_GOTO);
+ } else {
+ _statusline(EDIT_A_PREV_GOTO);
+ }
+ if ((ch = LYgetBString(user_input, FALSE, 0, recall)) < 0) {
+ /*
+ * User cancelled the Goto via ^G. Restore
+ * user_input and break. - FM
+ */
+ BStrCopy0((*user_input), *old_user_input);
+ FREE(*old_user_input);
+ HTInfoMsg(CANCELLED);
+ ret = FALSE;
+ break;
+ }
+ continue;
+ }
+ } else {
+ ret = TRUE;
+ break;
+ }
+ }
+ return ret;
+}
+
+static void do_cleanup_after_delete(void)
+{
+ HTuncache_current_document();
+ move_address(&newdoc, &curdoc);
+ newdoc.line = curdoc.line;
+ if (curdoc.link == nlinks - 1) {
+ /*
+ * We deleted the last link on the page. - FM
+ */
+ newdoc.link = curdoc.link - 1;
+ } else {
+ newdoc.link = curdoc.link;
+ }
+}
+
+static int find_link_near_col(int col,
+ int delta)
+{
+ int i;
+
+ for (i = curdoc.link; delta > 0 ? (i < nlinks) : (i >= 0); i += delta) {
+ if ((links[i].ly - links[curdoc.link].ly) * delta > 0) {
+ int cy = links[i].ly, best = -1, dist = 1000000;
+
+ while ((delta > 0 ? (i < nlinks) : (i >= 0)) && cy == links[i].ly) {
+ int cx = links[i].lx;
+ const char *text = LYGetHiliteStr(i, 0);
+
+ if (text != NULL)
+ cx += (int) strlen(text) / 2;
+ cx -= col;
+ if (cx < 0)
+ cx = -cx;
+ if (cx < dist) {
+ dist = cx;
+ best = i;
+ }
+ i += delta;
+ }
+ return (best);
+ }
+ }
+ return (-1);
+}
+
+/*
+ * This is a special feature to traverse every http link derived from startfile
+ * and check for errors or create crawl output files. Only URL's that begin
+ * with "traversal_host" are searched - this keeps the search from crossing to
+ * other servers (a feature, not a bug!).
+ */
+static int DoTraversal(int c,
+ BOOLEAN *crawl_ok)
+{
+ BOOLEAN rlink_rejected = FALSE;
+ BOOLEAN rlink_exists;
+ BOOLEAN rlink_allowed;
+
+ rlink_exists = (BOOL) (nlinks > 0 &&
+ links[curdoc.link].type != WWW_FORM_LINK_TYPE &&
+ links[curdoc.link].lname != NULL);
+
+ if (rlink_exists) {
+ rlink_rejected = lookup_reject(links[curdoc.link].lname);
+ if (!rlink_rejected &&
+ traversal_host &&
+ links[curdoc.link].lname) {
+ if (!isLYNXIMGMAP(links[curdoc.link].lname)) {
+ rlink_allowed = (BOOL) !StrNCmp(traversal_host,
+ links[curdoc.link].lname,
+ strlen(traversal_host));
+ } else {
+ rlink_allowed = (BOOL) !StrNCmp(traversal_host,
+ links[curdoc.link].lname + LEN_LYNXIMGMAP,
+ strlen(traversal_host));
+ }
+ } else {
+ rlink_allowed = FALSE;
+ }
+ } else {
+ rlink_allowed = FALSE;
+ }
+ if (rlink_exists && rlink_allowed) {
+ if (lookup_link(links[curdoc.link].lname)) {
+ if (more_links ||
+ (curdoc.link > -1 && curdoc.link < nlinks - 1)) {
+ c = DNARROW_KEY;
+ } else {
+ if (STREQ(curdoc.title, "Entry into main screen") ||
+ (nhist <= 0)) {
+ if (!dump_output_immediately) {
+ cleanup();
+ exit_immediately(EXIT_FAILURE);
+ }
+ c = -1;
+ } else {
+ c = LTARROW_KEY;
+ }
+ }
+ } else {
+ StrAllocCopy(traversal_link_to_add,
+ links[curdoc.link].lname);
+ if (!isLYNXIMGMAP(traversal_link_to_add))
+ *crawl_ok = TRUE;
+ c = RTARROW_KEY;
+ }
+ } else { /* no good right link, so only down and left arrow ok */
+ if (rlink_exists /* && !rlink_rejected */ )
+ /* uncomment in previous line to avoid duplicates - kw */
+ add_to_reject_list(links[curdoc.link].lname);
+ if (more_links ||
+ (curdoc.link > -1 && curdoc.link < nlinks - 1)) {
+ c = DNARROW_KEY;
+ } else {
+ /*
+ * curdoc.title doesn't always work, so bail out if the history
+ * list is empty.
+ */
+ if (STREQ(curdoc.title, "Entry into main screen") ||
+ (nhist <= 0)) {
+ if (!dump_output_immediately) {
+ cleanup();
+ exit_immediately(EXIT_FAILURE);
+ }
+ c = -1;
+ } else {
+ c = LTARROW_KEY;
+ }
+ }
+ }
+ CTRACE((tfp, "DoTraversal(%d:%d) -> %s\n",
+ nlinks > 0 ? curdoc.link : 0,
+ nlinks,
+ LYKeycodeToString(c, FALSE)));
+ return c;
+}
+
+static BOOLEAN check_history(void)
+{
+ const char *base;
+
+ if (!curdoc.post_data)
+ /*
+ * Normal case - List Page is not associated with post data. - kw
+ */
+ return TRUE;
+
+ if (nhist > 0
+ && !LYresubmit_posts
+ && HDOC(nhist - 1).post_data
+ && BINEQ(curdoc.post_data, HDOC(nhist - 1).post_data)
+ && (base = HText_getContentBase()) != 0) {
+ char *text = !isLYNXIMGMAP(HDOC(nhist - 1).address)
+ ? HDOC(nhist - 1).address
+ : HDOC(nhist - 1).address + LEN_LYNXIMGMAP;
+
+ if (!StrNCmp(base, text, strlen(base))) {
+ /*
+ * Normal case - as best as we can check, the document at the top
+ * of the history stack seems to be the document the List Page is
+ * about (or a LYNXIMGMAP derived from it), and LYresubmit_posts is
+ * not set, so don't prompt here. If we actually have to repeat a
+ * POST because, against expectations, the underlying document
+ * isn't cached any more, HTAccess will prompt for confirmation,
+ * unless we had LYK_NOCACHE -kw
+ */
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+static int handle_LYK_ACTIVATE(int *c,
+ int cmd GCC_UNUSED,
+ BOOLEAN *try_internal GCC_UNUSED,
+ BOOLEAN *refresh_screen,
+ BOOLEAN *force_load,
+ int real_cmd)
+{
+ if (do_change_link() == -1) {
+ LYforce_no_cache = FALSE;
+ reloading = FALSE;
+ return 1; /* mouse stuff was confused, ignore - kw */
+ }
+ if (nlinks > 0) {
+ if (links[curdoc.link].type == WWW_FORM_LINK_TYPE) {
+#ifdef TEXTFIELDS_MAY_NEED_ACTIVATION
+ if (real_cmd == LYK_ACTIVATE && textfields_need_activation &&
+ F_TEXTLIKE(links[curdoc.link].l_form->type)) {
+
+ textinput_activated = TRUE;
+ show_main_statusline(links[curdoc.link], FOR_INPUT);
+ textfields_need_activation = textfields_activation_option;
+
+ return 0;
+ }
+#endif
+ /*
+ * Don't try to submit forms with bad actions. - FM
+ */
+ if (links[curdoc.link].l_form->type == F_SUBMIT_TYPE ||
+ links[curdoc.link].l_form->type == F_IMAGE_SUBMIT_TYPE ||
+ links[curdoc.link].l_form->type == F_TEXT_SUBMIT_TYPE) {
+ /*
+ * Do nothing if it's disabled. - FM
+ */
+ if (links[curdoc.link].l_form->disabled == YES) {
+ HTOutputFormat = WWW_PRESENT;
+ LYforce_no_cache = FALSE;
+ reloading = FALSE;
+ return 0;
+ }
+ /*
+ * Make sure we have an action. - FM
+ */
+ if (isEmpty(links[curdoc.link].l_form->submit_action)) {
+ HTUserMsg(NO_FORM_ACTION);
+ HTOutputFormat = WWW_PRESENT;
+ LYforce_no_cache = FALSE;
+ reloading = FALSE;
+ return 0;
+ }
+ /*
+ * Check for no_mail if the form action is a mailto URL. - FM
+ */
+ if (links[curdoc.link].l_form->submit_method
+ == URL_MAIL_METHOD && no_mail) {
+ HTAlert(FORM_MAILTO_DISALLOWED);
+ HTOutputFormat = WWW_PRESENT;
+ LYforce_no_cache = FALSE;
+ reloading = FALSE;
+ return 0;
+ }
+ /*
+ * Make sure this isn't a spoof in an account with restrictions
+ * on file URLs. - FM
+ */
+ if (no_file_url &&
+ isFILE_URL(links[curdoc.link].l_form->submit_action)) {
+ HTAlert(FILE_ACTIONS_DISALLOWED);
+ HTOutputFormat = WWW_PRESENT;
+ LYforce_no_cache = FALSE;
+ reloading = FALSE;
+ return 0;
+ }
+ /*
+ * Make sure this isn't a spoof attempt via an internal URL. -
+ * FM
+ */
+ if (isLYNXCOOKIE(links[curdoc.link].l_form->submit_action) ||
+ isLYNXCACHE(links[curdoc.link].l_form->submit_action) ||
+#ifdef DIRED_SUPPORT
+#ifdef OK_PERMIT
+ (isLYNXDIRED(links[curdoc.link].l_form->submit_action) &&
+ (no_dired_support ||
+ strncasecomp((links[curdoc.link].l_form->submit_action
+ + 10),
+ "//PERMIT_LOCATION", 17) ||
+ !LYIsUIPage(curdoc.address, UIP_PERMIT_OPTIONS))) ||
+#else
+ isLYNXDIRED(links[curdoc.link].l_form->submit_action) ||
+#endif /* OK_PERMIT */
+#endif /* DIRED_SUPPORT */
+ isLYNXDOWNLOAD(links[curdoc.link].l_form->submit_action) ||
+ isLYNXHIST(links[curdoc.link].l_form->submit_action) ||
+ isLYNXEDITMAP(links[curdoc.link].l_form->submit_action) ||
+ isLYNXKEYMAP(links[curdoc.link].l_form->submit_action) ||
+ isLYNXIMGMAP(links[curdoc.link].l_form->submit_action) ||
+ isLYNXPRINT(links[curdoc.link].l_form->submit_action) ||
+ isLYNXEXEC(links[curdoc.link].l_form->submit_action) ||
+ isLYNXPROG(links[curdoc.link].l_form->submit_action)) {
+
+ HTAlert(SPECIAL_ACTION_DISALLOWED);
+ CTRACE((tfp, "LYMainLoop: Rejected '%s'\n",
+ links[curdoc.link].l_form->submit_action));
+ HTOutputFormat = WWW_PRESENT;
+ LYforce_no_cache = FALSE;
+ reloading = FALSE;
+ return 0;
+ }
+#ifdef NOTDEFINED /* We're disabling form inputs instead of using this. - FM */
+ /*
+ * Check for enctype and let user know we don't yet support
+ * multipart/form-data - FM
+ */
+ if (links[curdoc.link].l_form->submit_enctype) {
+ if (!strcmp(links[curdoc.link].l_form->submit_enctype,
+ "multipart/form-data")) {
+ HTAlert(gettext("Enctype multipart/form-data not yet supported! Cannot submit."));
+ HTOutputFormat = WWW_PRESENT;
+ LYforce_no_cache = FALSE;
+ reloading = FALSE;
+ return 0;
+ }
+ }
+#endif /* NOTDEFINED */
+ if (check_realm) {
+ LYPermitURL = TRUE;
+ }
+ if (no_filereferer == TRUE && isFILE_URL(curdoc.address)) {
+ LYNoRefererForThis = TRUE;
+ }
+ if (links[curdoc.link].l_form->submit_method != URL_MAIL_METHOD) {
+ StrAllocCopy(newdoc.title,
+ LYGetHiliteStr(curdoc.link, 0));
+ }
+ }
+
+ /*
+ * Normally we don't get here for text input fields, but it can
+ * happen as a result of mouse positioning. In that case the
+ * statusline will not have updated info, so update it now. - kw
+ */
+ if (F_TEXTLIKE(links[curdoc.link].l_form->type)) {
+ show_formlink_statusline(links[curdoc.link].l_form,
+ (real_cmd == LYK_NOCACHE ||
+ real_cmd == LYK_DOWNLOAD ||
+ real_cmd == LYK_HEAD ||
+ (real_cmd == LYK_MOUSE_SUBMIT &&
+ !textinput_activated)) ?
+ FOR_PANEL : FOR_INPUT);
+ if (user_mode == NOVICE_MODE &&
+ textinput_activated &&
+ (real_cmd == LYK_ACTIVATE ||
+ real_cmd == LYK_MOUSE_SUBMIT)) {
+ form_noviceline(FormIsReadonly(links[curdoc.link].l_form));
+ }
+ }
+
+ *c = change_form_link(curdoc.link,
+ &newdoc, refresh_screen,
+ FALSE,
+ (real_cmd == LYK_MOUSE_SUBMIT ||
+ real_cmd == LYK_NOCACHE ||
+ real_cmd == LYK_DOWNLOAD ||
+ real_cmd == LYK_HEAD));
+ if (*c != LKC_DONE || *refresh_screen) {
+ /*
+ * Cannot have been a submit field for which newdoc was filled
+ * in. - kw
+ */
+ if ((links[curdoc.link].l_form->type == F_SUBMIT_TYPE ||
+ links[curdoc.link].l_form->type == F_IMAGE_SUBMIT_TYPE ||
+ links[curdoc.link].l_form->type == F_TEXT_SUBMIT_TYPE) &&
+ links[curdoc.link].l_form->submit_method
+ != URL_MAIL_METHOD) {
+ /*
+ * Try to undo change of newdoc.title done above.
+ */
+ if (HText_getTitle()) {
+ StrAllocCopy(newdoc.title, HText_getTitle());
+ } else if (curdoc.title) {
+ StrAllocCopy(newdoc.title, curdoc.title);
+ }
+ }
+ } else {
+ if (HTOutputFormat == WWW_DOWNLOAD &&
+ newdoc.post_data != NULL &&
+ newdoc.safe == FALSE) {
+
+ if ((HText_POSTReplyLoaded(&newdoc) == TRUE) &&
+ HTConfirm(CONFIRM_POST_RESUBMISSION) == FALSE) {
+ HTInfoMsg(CANCELLED);
+ HTOutputFormat = WWW_PRESENT;
+ LYforce_no_cache = FALSE;
+ copy_address(&newdoc, &curdoc);
+ StrAllocCopy(newdoc.title, curdoc.title);
+ BStrCopy(newdoc.post_data, curdoc.post_data);
+ StrAllocCopy(newdoc.post_content_type,
+ curdoc.post_content_type);
+ StrAllocCopy(newdoc.bookmark, curdoc.bookmark);
+ newdoc.isHEAD = curdoc.isHEAD;
+ newdoc.safe = curdoc.safe;
+ newdoc.internal_link = curdoc.internal_link;
+ return 0;
+ }
+ }
+ /*
+ * Moved here from earlier to only apply when it should.
+ * Anyway, why should realm checking be overridden for form
+ * submissions, this seems to be an unnecessary loophole?? But
+ * that's the way it was, maybe there is some reason. However,
+ * at least make sure this doesn't weaken restrictions implied
+ * by -validate!
+ * - kw 1999-05-25
+ */
+ if (check_realm && !LYValidate) {
+ LYPermitURL = TRUE;
+ }
+ }
+ if (*c == LKC_DONE) {
+ *c = DO_NOTHING;
+ } else if (*c == 23) {
+ *c = DO_NOTHING;
+ *refresh_screen = TRUE;
+ } else {
+ /* Avoid getting stuck with repeatedly calling
+ * handle_LYK_ACTIVATE(), instead of calling change_form_link()
+ * directly from mainloop(), for text input fields. - kw
+ */
+ switch (LKC_TO_C(*c)) {
+ case '\n':
+ case '\r':
+ default:
+ if ((real_cmd == LYK_ACTIVATE ||
+ real_cmd == LYK_MOUSE_SUBMIT) &&
+ F_TEXTLIKE(links[curdoc.link].l_form->type) &&
+ textinput_activated) {
+ return 3;
+ }
+ break;
+ }
+ }
+ return 2;
+ } else {
+ /*
+ * Not a forms link.
+ *
+ * Make sure this isn't a spoof in an account with restrictions on
+ * file URLs. - FM
+ */
+ if (no_file_url && isFILE_URL(links[curdoc.link].lname)) {
+ if (!isFILE_URL(curdoc.address) &&
+ !((isLYNXEDITMAP(curdoc.address) ||
+ isLYNXKEYMAP(curdoc.address) ||
+ isLYNXCOOKIE(curdoc.address) ||
+ isLYNXCACHE(curdoc.address)) &&
+ !StrNCmp(links[curdoc.link].lname,
+ helpfilepath,
+ strlen(helpfilepath)))) {
+ HTAlert(FILE_SERVED_LINKS_DISALLOWED);
+ reloading = FALSE;
+ return 0;
+ } else if (curdoc.bookmark != NULL) {
+ HTAlert(FILE_BOOKMARKS_DISALLOWED);
+ reloading = FALSE;
+ return 0;
+ }
+ }
+ /*
+ * Make sure this isn't a spoof attempt via an internal URL in a
+ * non-internal document. - FM
+ */
+ if ((isLYNXCOOKIE(links[curdoc.link].lname) &&
+ (strcmp(NonNull(curdoc.title), COOKIE_JAR_TITLE) ||
+ !isLYNXCOOKIE(curdoc.address))) ||
+#ifdef USE_CACHEJAR
+ (isLYNXCACHE(links[curdoc.link].lname) &&
+ (strcmp(NonNull(curdoc.title), CACHE_JAR_TITLE) ||
+ !isLYNXCACHE(curdoc.address))) ||
+#endif
+#ifdef DIRED_SUPPORT
+ (isLYNXDIRED(links[curdoc.link].lname) &&
+ !LYIsUIPage(curdoc.address, UIP_DIRED_MENU) &&
+ !LYIsUIPage(curdoc.address, UIP_PERMIT_OPTIONS) &&
+#ifdef OK_INSTALL
+ !LYIsUIPage(curdoc.address, UIP_INSTALL) &&
+#endif /* OK_INSTALL */
+ !LYIsUIPage(curdoc.address, UIP_UPLOAD_OPTIONS)) ||
+#endif /* DIRED_SUPPORT */
+ (isLYNXDOWNLOAD(links[curdoc.link].lname) &&
+ !LYIsUIPage(curdoc.address, UIP_DOWNLOAD_OPTIONS)) ||
+ (isLYNXHIST(links[curdoc.link].lname) &&
+ !LYIsUIPage(curdoc.address, UIP_HISTORY) &&
+ !LYIsUIPage(curdoc.address, UIP_LIST_PAGE) &&
+ !LYIsUIPage(curdoc.address, UIP_ADDRLIST_PAGE)) ||
+ (isLYNXPRINT(links[curdoc.link].lname) &&
+ !LYIsUIPage(curdoc.address, UIP_PRINT_OPTIONS))) {
+ HTAlert(SPECIAL_VIA_EXTERNAL_DISALLOWED);
+ HTOutputFormat = WWW_PRESENT;
+ LYforce_no_cache = FALSE;
+ reloading = FALSE;
+ return 0;
+ }
+#ifdef USE_EXTERNALS
+ if (run_external(links[curdoc.link].lname, TRUE)) {
+ *refresh_screen = TRUE;
+ return 0;
+ }
+#endif /* USE_EXTERNALS */
+
+ /*
+ * Follow a normal link or anchor.
+ */
+ set_address(&newdoc, links[curdoc.link].lname);
+ StrAllocCopy(newdoc.title, LYGetHiliteStr(curdoc.link, 0));
+ /*
+ * For internal links, retain POST content if present. If we are
+ * on the List Page, prevent pushing it on the history stack.
+ * Otherwise set try_internal to signal that the top of the loop
+ * should attempt to reposition directly, without calling getfile.
+ * - kw
+ */
+ if (track_internal_links) {
+ /*
+ * Might be an internal link anchor in the same doc. If so, take
+ * the try_internal shortcut if we didn't fall through from
+ * LYK_NOCACHE. - kw
+ */
+ newdoc.internal_link =
+ (links[curdoc.link].type == WWW_INTERN_LINK_TYPE);
+ if (newdoc.internal_link) {
+ /*
+ * Special case of List Page document with an internal link
+ * indication, which may really stand for an internal link
+ * within the document the List Page is about. - kw
+ */
+ if (LYIsListpageTitle(NonNull(curdoc.title)) &&
+ (LYIsUIPage(curdoc.address, UIP_LIST_PAGE) ||
+ LYIsUIPage(curdoc.address, UIP_ADDRLIST_PAGE))) {
+ if (check_history()) {
+ LYinternal_flag = TRUE;
+ } else {
+ HTLastConfirmCancelled(); /* reset flag */
+ if (!confirm_post_resub(newdoc.address,
+ newdoc.title,
+ ((LYresubmit_posts &&
+ HText_POSTReplyLoaded(&newdoc))
+ ? 1
+ : 2),
+ 2)) {
+ if (HTLastConfirmCancelled() ||
+ (LYresubmit_posts &&
+ cmd != LYK_NOCACHE &&
+ !HText_POSTReplyLoaded(&newdoc))) {
+ /* cancel the whole thing */
+ LYforce_no_cache = FALSE;
+ reloading = FALSE;
+ copy_address(&newdoc, &curdoc);
+ StrAllocCopy(newdoc.title, curdoc.title);
+ newdoc.internal_link = curdoc.internal_link;
+ HTInfoMsg(CANCELLED);
+ return 1;
+ } else if (LYresubmit_posts &&
+ cmd != LYK_NOCACHE) {
+ /* If LYresubmit_posts is set, and the
+ answer was No, and the key wasn't
+ NOCACHE, and we have a cached copy,
+ then use it. - kw */
+ LYforce_no_cache = FALSE;
+ } else {
+ /* if No, but not ^C or ^G, drop
+ * the post data. Maybe the link
+ * wasn't meant to be internal after
+ * all, here we can recover from that
+ * assumption. - kw */
+ LYFreePostData(&newdoc);
+ newdoc.internal_link = FALSE;
+ HTAlert(DISCARDING_POST_DATA);
+ }
+ }
+ }
+ /*
+ * Don't push the List Page if we follow an internal link
+ * given by it. - kw
+ */
+ free_address(&curdoc);
+ } else if (cmd != LYK_NOCACHE) {
+ *try_internal = TRUE;
+ }
+ if (!(LYresubmit_posts && newdoc.post_data))
+ LYinternal_flag = TRUE;
+ /* We still set force_load so that history pushing
+ * etc. will be done. - kw
+ */
+ *force_load = TRUE;
+ return 1;
+ } else {
+ /*
+ * Free POST content if not an internal link. - kw
+ */
+ LYFreePostData(&newdoc);
+ }
+ }
+ /*
+ * Might be an anchor in the same doc from a POST form. If so,
+ * don't free the content. -- FM
+ */
+ if (are_different(&curdoc, &newdoc)) {
+ LYFreePostData(&newdoc);
+ FREE(newdoc.bookmark);
+ if (isLYNXMESSAGES(newdoc.address))
+ LYforce_no_cache = TRUE;
+ }
+ if (!no_jump && lynxjumpfile && curdoc.address &&
+ !strcmp(lynxjumpfile, curdoc.address)) {
+ LYJumpFileURL = TRUE;
+ LYUserSpecifiedURL = TRUE;
+ } else if ((curdoc.title &&
+ (LYIsUIPage(curdoc.address, UIP_HISTORY) ||
+ !strcmp(curdoc.title, HISTORY_PAGE_TITLE))) ||
+ curdoc.bookmark != NULL ||
+ (lynxjumpfile &&
+ curdoc.address &&
+ !strcmp(lynxjumpfile, curdoc.address))) {
+ LYUserSpecifiedURL = TRUE;
+ } else if (no_filereferer == TRUE &&
+ curdoc.address != NULL &&
+ isFILE_URL(curdoc.address)) {
+ LYNoRefererForThis = TRUE;
+ }
+ newdoc.link = 0;
+ *force_load = TRUE; /* force MainLoop to reload */
+#ifdef USE_PRETTYSRC
+ psrc_view = FALSE; /* we get here if link is not internal */
+#endif
+
+#if defined(DIRED_SUPPORT) && !defined(__DJGPP__)
+ if (lynx_edit_mode) {
+ DIRED_UNCACHE_2;
+ /*
+ * Unescaping any slash chars in the URL, but avoid double
+ * unescaping and too-early unescaping of other chars. - KW
+ */
+ HTUnEscapeSome(newdoc.address, "/");
+ /* avoid stripping final slash for root dir - kw */
+ if (strcasecomp(newdoc.address, "file://localhost/"))
+ strip_trailing_slash(newdoc.address);
+ }
+#endif /* DIRED_SUPPORT && !__DJGPP__ */
+ if (isLYNXCOOKIE(curdoc.address)
+ || isLYNXCACHE(curdoc.address)) {
+ HTuncache_current_document();
+ }
+ }
+ }
+ return 0;
+}
+/*
+ * If the given form link does not point to the requested type, search for
+ * the first link belonging to the form which does. If there are none,
+ * return null.
+ */
+#define SameFormAction(form,submit) \
+ ((submit) \
+ ? (F_SUBMITLIKE((form)->type)) \
+ : ((form)->type == F_RESET_TYPE))
+
+static FormInfo *FindFormAction(FormInfo * given, int submit)
+{
+ FormInfo *result = NULL;
+ FormInfo *fi;
+ int i;
+
+ if (given == NULL) {
+ HTAlert(LINK_NOT_IN_FORM);
+ } else if (SameFormAction(given, submit)) {
+ result = given;
+ } else {
+ for (i = 0; i < nlinks; i++) {
+ if ((fi = links[i].l_form) != 0 &&
+ fi->number == given->number &&
+ (SameFormAction(fi, submit))) {
+ result = fi;
+ break;
+ }
+ }
+ }
+ return result;
+}
+
+static FormInfo *MakeFormAction(FormInfo * given, int submit)
+{
+ FormInfo *result = 0;
+
+ if (given != 0) {
+ result = typecalloc(FormInfo);
+
+ if (result == NULL)
+ outofmem(__FILE__, "MakeFormAction");
+
+ *result = *given;
+ if (submit) {
+ if (result->submit_action == 0) {
+ PerFormInfo *pfi = HText_PerFormInfo(result->number);
+
+ *result = pfi->data;
+ }
+ result->type = F_SUBMIT_TYPE;
+ } else {
+ result->type = F_RESET_TYPE;
+ }
+ result->number = given->number;
+ }
+ return result;
+}
+
+static void handle_LYK_SUBMIT(int cur, DocInfo *doc, BOOLEAN *refresh_screen)
+{
+ FormInfo *form = FindFormAction(links[cur].l_form, 1);
+ FormInfo *make = NULL;
+ char *save_submit_action = NULL;
+
+ if (form == 0) {
+ make = MakeFormAction(links[cur].l_form, 1);
+ form = make;
+ }
+
+ if (form != 0) {
+ StrAllocCopy(save_submit_action, form->submit_action);
+ form->submit_action = HTPrompt(EDIT_SUBMIT_URL, form->submit_action);
+
+ if (isEmpty(form->submit_action) ||
+ (!isLYNXCGI(form->submit_action) &&
+ StrNCmp(form->submit_action, "http", 4))) {
+ HTUserMsg(FORM_ACTION_NOT_HTTP_URL);
+ } else {
+ HTInfoMsg(SUBMITTING_FORM);
+ HText_SubmitForm(form, doc, form->name, form->value);
+ *refresh_screen = TRUE;
+ }
+
+ StrAllocCopy(form->submit_action, save_submit_action);
+ FREE(make);
+ }
+}
+
+static void handle_LYK_RESET(int cur, BOOLEAN *refresh_screen)
+{
+ FormInfo *form = FindFormAction(links[cur].l_form, 0);
+ FormInfo *make = NULL;
+
+ if (form == 0) {
+ make = MakeFormAction(links[cur].l_form, 0);
+ form = make;
+ }
+
+ if (form != 0) {
+ HTInfoMsg(RESETTING_FORM);
+ HText_ResetForm(form);
+ *refresh_screen = TRUE;
+ FREE(make);
+ }
+}
+
+#ifdef USE_ADDRLIST_PAGE
+static BOOLEAN handle_LYK_ADDRLIST(int *cmd)
+{
+ /*
+ * Don't do if already viewing list addresses page.
+ */
+ if (LYIsUIPage(curdoc.address, UIP_ADDRLIST_PAGE)) {
+ /*
+ * Already viewing list page, so get out.
+ */
+ *cmd = LYK_PREV_DOC;
+ return TRUE;
+ }
+
+ /*
+ * Print address list page to file.
+ */
+ if (showlist(&newdoc, FALSE) < 0)
+ return FALSE;
+ StrAllocCopy(newdoc.title, ADDRLIST_PAGE_TITLE);
+ /*
+ * showlist will set newdoc's other fields. It may leave post_data intact
+ * so the list can be used to follow internal links in the current document
+ * even if it is a POST response. - kw
+ */
+
+ if (LYValidate || check_realm) {
+ LYPermitURL = TRUE;
+ StrAllocCopy(lynxlistfile, newdoc.address);
+ }
+ return FALSE;
+}
+#endif /* USE_ADDRLIST_PAGE */
+
+static void handle_LYK_ADD_BOOKMARK(BOOLEAN *refresh_screen,
+ int *old_c,
+ int real_c)
+{
+ int c;
+
+ if (LYValidate) {
+ if (*old_c != real_c) {
+ *old_c = real_c;
+ HTUserMsg(BOOKMARKS_DISABLED);
+ }
+ return;
+ }
+
+ if (!LYIsUIPage(curdoc.address, UIP_HISTORY) &&
+ !LYIsUIPage(curdoc.address, UIP_SHOWINFO) &&
+ !LYIsUIPage(curdoc.address, UIP_PRINT_OPTIONS) &&
+#ifdef DIRED_SUPPORT
+ !LYIsUIPage(curdoc.address, UIP_DIRED_MENU) &&
+ !LYIsUIPage(curdoc.address, UIP_PERMIT_OPTIONS) &&
+ !LYIsUIPage(curdoc.address, UIP_UPLOAD_OPTIONS) &&
+#endif /* DIRED_SUPPORT */
+ !LYIsUIPage(curdoc.address, UIP_DOWNLOAD_OPTIONS) &&
+ !isLYNXCOOKIE(curdoc.address) &&
+ !isLYNXCACHE(curdoc.address) &&
+ !LYIsUIPage(curdoc.address, UIP_OPTIONS_MENU) &&
+ ((nlinks <= 0) ||
+ (links[curdoc.link].lname != NULL &&
+ !isLYNXHIST(links[curdoc.link].lname) &&
+ !isLYNXPRINT(links[curdoc.link].lname) &&
+ !isLYNXDIRED(links[curdoc.link].lname) &&
+ !isLYNXDOWNLOAD(links[curdoc.link].lname) &&
+ !isLYNXCOOKIE(links[curdoc.link].lname) &&
+ !isLYNXCACHE(links[curdoc.link].lname) &&
+ !isLYNXPRINT(links[curdoc.link].lname)))) {
+ if (nlinks > 0) {
+ if (curdoc.post_data == NULL &&
+ curdoc.bookmark == NULL &&
+ !LYIsUIPage(curdoc.address, UIP_LIST_PAGE) &&
+ !LYIsUIPage(curdoc.address, UIP_ADDRLIST_PAGE) &&
+ !LYIsUIPage(curdoc.address, UIP_VLINKS)) {
+ /*
+ * The document doesn't have POST content, and is not a
+ * bookmark file, nor is the list or visited links page, so we
+ * can save either that or the link. - FM
+ */
+ _statusline(BOOK_D_L_OR_CANCEL);
+ if ((c = LYgetch_single()) == 'D') {
+ save_bookmark_link(curdoc.address, curdoc.title);
+ *refresh_screen = TRUE; /* MultiBookmark support */
+ goto check_add_bookmark_to_self;
+ }
+ } else {
+ if (LYMultiBookmarks == MBM_OFF &&
+ curdoc.bookmark != NULL &&
+ strstr(curdoc.address,
+ (*bookmark_page == '.'
+ ? (bookmark_page + 1)
+ : bookmark_page)) != NULL) {
+ /*
+ * If multiple bookmarks are disabled, offer the L)ink or
+ * C)ancel, but with wording which indicates that the link
+ * already exists in this bookmark file. - FM
+ */
+ _statusline(MULTIBOOKMARKS_SELF);
+ } else if (curdoc.post_data != NULL &&
+ links[curdoc.link].type == WWW_INTERN_LINK_TYPE) {
+ /*
+ * Internal link, and document has POST content.
+ */
+ HTUserMsg(NOBOOK_POST_FORM);
+ return;
+ } else {
+ /*
+ * Only offer the link in a document with POST content, or
+ * if the current document is a bookmark file and multiple
+ * bookmarks are enabled. - FM
+ */
+ _statusline(BOOK_L_OR_CANCEL);
+ }
+ c = LYgetch_single();
+ }
+ if (c == 'L') {
+ if (curdoc.post_data != NULL &&
+ links[curdoc.link].type == WWW_INTERN_LINK_TYPE) {
+ /*
+ * Internal link, and document has POST content.
+ */
+ HTUserMsg(NOBOOK_POST_FORM);
+ return;
+ }
+ /*
+ * User does want to save the link. - FM
+ */
+ if (links[curdoc.link].type != WWW_FORM_LINK_TYPE) {
+ save_bookmark_link(links[curdoc.link].lname,
+ LYGetHiliteStr(curdoc.link, 0));
+ *refresh_screen = TRUE; /* MultiBookmark support */
+ } else {
+ HTUserMsg(NOBOOK_FORM_FIELD);
+ return;
+ }
+ } else {
+ return;
+ }
+ } else if (curdoc.post_data != NULL) {
+ /*
+ * No links, and document has POST content. - FM
+ */
+ HTUserMsg(NOBOOK_POST_FORM);
+ return;
+ } else if (curdoc.bookmark != NULL) {
+ /*
+ * It's a bookmark file from which all of the links were deleted.
+ * - FM
+ */
+ HTUserMsg(BOOKMARKS_NOLINKS);
+ return;
+ } else {
+ _statusline(BOOK_D_OR_CANCEL);
+ if (LYgetch_single() == 'D') {
+ save_bookmark_link(curdoc.address, curdoc.title);
+ *refresh_screen = TRUE; /* MultiBookmark support */
+ } else {
+ return;
+ }
+ }
+ check_add_bookmark_to_self:
+ if (curdoc.bookmark && BookmarkPage &&
+ !strcmp(curdoc.bookmark, BookmarkPage)) {
+ HTuncache_current_document();
+ move_address(&newdoc, &curdoc);
+ StrAllocCopy(newdoc.bookmark, curdoc.bookmark);
+ newdoc.line = curdoc.line;
+ newdoc.link = curdoc.link;
+ newdoc.internal_link = FALSE;
+ }
+ } else {
+ if (*old_c != real_c) {
+ *old_c = real_c;
+ HTUserMsg(NOBOOK_HSML);
+ }
+ }
+}
+
+static void handle_LYK_CLEAR_AUTH(int *old_c,
+ int real_c)
+{
+ if (*old_c != real_c) {
+ *old_c = real_c;
+ if (HTConfirm(CLEAR_ALL_AUTH_INFO)) {
+ FREE(authentication_info[0]);
+ FREE(authentication_info[1]);
+ FREE(proxyauth_info[0]);
+ FREE(proxyauth_info[1]);
+ HTClearHTTPAuthInfo();
+#ifndef DISABLE_NEWS
+ HTClearNNTPAuthInfo();
+#endif
+#ifndef DISABLE_FTP
+ HTClearFTPPassword();
+#endif
+ HTUserMsg(AUTH_INFO_CLEARED);
+ } else {
+ HTUserMsg(CANCELLED);
+ }
+ }
+}
+
+static int handle_LYK_COMMAND(bstring **user_input)
+{
+ LYKeymapCode ch;
+ Kcmd *mp;
+ char *src, *tmp;
+
+ BStrCopy0((*user_input), "");
+ _statusline(": ");
+ if (LYgetBString(user_input, FALSE, 0, RECALL_CMD) >= 0) {
+ src = LYSkipBlanks((*user_input)->str);
+ tmp = LYSkipNonBlanks(src);
+ *tmp = 0;
+ ch = ((mp = LYStringToKcmd(src)) != 0) ? mp->code : LYK_UNKNOWN;
+ CTRACE((tfp, "LYK_COMMAND(%s.%s) = %d\n", src, tmp, (int) ch));
+ if (ch == 0) {
+ return *src ? -1 : 0;
+ }
+ /* FIXME: reuse the rest of the buffer for parameters */
+ return ch;
+ }
+ return 0;
+}
+
+static void handle_LYK_COMMENT(BOOLEAN *refresh_screen,
+ char **owner_address_p,
+ int *old_c,
+ int real_c)
+{
+ int c;
+
+ if (!*owner_address_p &&
+ strncasecomp(curdoc.address, "http", 4)) {
+ if (*old_c != real_c) {
+ *old_c = real_c;
+ HTUserMsg(NO_OWNER);
+ }
+ } else if (no_mail) {
+ if (*old_c != real_c) {
+ *old_c = real_c;
+ HTUserMsg(MAIL_DISALLOWED);
+ }
+ } else {
+ if (HTConfirmDefault(CONFIRM_COMMENT, NO)) {
+ if (!*owner_address_p) {
+ /*
+ * No owner defined, so make a guess and and offer it to the
+ * user. - FM
+ */
+ char *address = NULL;
+ char *temp = HTParse(curdoc.address, "", PARSE_PATH);
+ char *cp;
+
+ if (temp != NULL) {
+ HTUnEscape(temp);
+ if (LYIsTilde(*temp) && strlen(temp) > 1) {
+ /*
+ * It's a ~user URL so guess user@host. - FM
+ */
+ if ((cp = StrChr((temp + 1), '/')) != NULL)
+ *cp = '\0';
+ StrAllocCopy(address, STR_MAILTO_URL);
+ StrAllocCat(address, (temp + 1));
+ StrAllocCat(address, "@");
+ }
+ FREE(temp);
+ }
+ if (address == NULL)
+ /*
+ * Wasn't a ~user URL so guess WebMaster@host. - FM
+ */
+ StrAllocCopy(address, "mailto:WebMaster@");
+ temp = HTParse(curdoc.address, "", PARSE_HOST);
+ StrAllocCat(address, temp);
+ HTSprintf0(&temp, NO_OWNER_USE, address);
+ c = HTConfirmDefault(temp, NO);
+ FREE(temp);
+ if (c == YES) {
+ StrAllocCopy(*owner_address_p, address);
+ FREE(address);
+ } else {
+ FREE(address);
+ return;
+ }
+ }
+ if (is_url(*owner_address_p) != MAILTO_URL_TYPE) {
+ /*
+ * The address is a URL. Just follow the link.
+ */
+ set_address(&newdoc, *owner_address_p);
+ newdoc.internal_link = FALSE;
+ } else {
+ /*
+ * The owner_address is a mailto: URL.
+ */
+ const char *kp = HText_getRevTitle();
+ const char *id = HText_getMessageID();
+ char *tmptitle = NULL;
+
+ if (!kp && HTMainAnchor) {
+ kp = HTAnchor_subject(HTMainAnchor);
+ if (non_empty(kp)) {
+ if (strncasecomp(kp, "Re: ", 4)) {
+ StrAllocCopy(tmptitle, "Re: ");
+ StrAllocCat(tmptitle, kp);
+ kp = tmptitle;
+ }
+ }
+ }
+
+ if (StrChr(*owner_address_p, ':') != NULL)
+ /*
+ * Send a reply. The address is after the colon.
+ */
+ reply_by_mail(StrChr(*owner_address_p, ':') + 1,
+ curdoc.address,
+ NonNull(kp), id);
+ else
+ reply_by_mail(*owner_address_p, curdoc.address,
+ NonNull(kp), id);
+
+ FREE(tmptitle);
+ *refresh_screen = TRUE; /* to force a showpage */
+ }
+ }
+ }
+}
+
+#ifdef USE_CACHEJAR
+static BOOLEAN handle_LYK_CACHE_JAR(int *cmd)
+{
+ /*
+ * Don't do this if already viewing cache jar.
+ */
+ if (!isLYNXCACHE(curdoc.address)) {
+ set_address(&newdoc, STR_LYNXCACHE "/");
+ LYFreePostData(&newdoc);
+ FREE(newdoc.bookmark);
+ newdoc.isHEAD = FALSE;
+ newdoc.safe = FALSE;
+ newdoc.internal_link = FALSE;
+ LYforce_no_cache = TRUE;
+ if (LYValidate || check_realm) {
+ LYPermitURL = TRUE;
+ }
+ } else {
+ /*
+ * If already in the cache jar, get out.
+ */
+ *cmd = LYK_PREV_DOC;
+ return TRUE;
+ }
+ return FALSE;
+}
+#endif /* USE_CACHEJAR */
+
+static BOOLEAN handle_LYK_COOKIE_JAR(int *cmd)
+{
+ /*
+ * Don't do if already viewing the cookie jar.
+ */
+ if (!isLYNXCOOKIE(curdoc.address)) {
+ set_address(&newdoc, "LYNXCOOKIE:/");
+ LYFreePostData(&newdoc);
+ FREE(newdoc.bookmark);
+ newdoc.isHEAD = FALSE;
+ newdoc.safe = FALSE;
+ newdoc.internal_link = FALSE;
+ LYforce_no_cache = TRUE;
+ if (LYValidate || check_realm) {
+ LYPermitURL = TRUE;
+ }
+ } else {
+ /*
+ * If already in the cookie jar, get out.
+ */
+ *cmd = LYK_PREV_DOC;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+#if defined(DIRED_SUPPORT)
+static void handle_LYK_CREATE(void)
+{
+ if (lynx_edit_mode && !no_dired_support) {
+ if (local_create(&curdoc) > 0) {
+ DIRED_UNCACHE_1;
+ move_address(&newdoc, &curdoc);
+ LYFreePostData(&newdoc);
+ FREE(newdoc.bookmark);
+ newdoc.isHEAD = FALSE;
+ newdoc.safe = FALSE;
+ newdoc.line = curdoc.line;
+ newdoc.link = curdoc.link > -1 ? curdoc.link : 0;
+ LYclear();
+ }
+ }
+}
+#endif /* DIRED_SUPPORT */
+
+static void handle_LYK_DEL_BOOKMARK(BOOLEAN *refresh_screen,
+ int *old_c,
+ int real_c)
+{
+ if (curdoc.bookmark != NULL) {
+ if (HTConfirmDefault(CONFIRM_BOOKMARK_DELETE, NO) != YES)
+ return;
+ remove_bookmark_link(links[curdoc.link].anchor_number - 1,
+ curdoc.bookmark);
+ } else { /* behave like REFRESH for backward compatibility */
+ *refresh_screen = TRUE;
+ if (*old_c != real_c) {
+ *old_c = real_c;
+ lynx_force_repaint();
+ }
+ return;
+ }
+ do_cleanup_after_delete();
+}
+
+#if defined(DIRED_SUPPORT) || defined(VMS)
+static void handle_LYK_DIRED_MENU(BOOLEAN *refresh_screen,
+ int *old_c GCC_UNUSED,
+ int real_c GCC_UNUSED)
+{
+#ifdef VMS
+ char *cp, *temp = 0;
+ const char *test = HTGetProgramPath(ppCSWING);
+
+ /*
+ * Check if the CSwing Directory/File Manager is available. Will be
+ * disabled if CSWING path is NULL, zero-length, or "none" (case
+ * insensitive), if no_file_url was set via the file_url restriction, if
+ * no_goto_file was set for the anonymous account, or if HTDirAccess was
+ * set to HT_DIR_FORBID or HT_DIR_SELECTIVE via the -nobrowse or -selective
+ * switches. - FM
+ */
+ if (isEmpty(test) ||
+ !strcasecomp(test, "none") ||
+ no_file_url || no_goto_file ||
+ HTDirAccess == HT_DIR_FORBID ||
+ HTDirAccess == HT_DIR_SELECTIVE) {
+ if (*old_c != real_c) {
+ *old_c = real_c;
+ HTUserMsg(DFM_NOT_AVAILABLE);
+ }
+ return;
+ }
+
+ /*
+ * If we are viewing a local directory listing or a local file which is not
+ * temporary, invoke CSwing with the URL's directory converted to VMS path
+ * specs and passed as the argument, so we start up CSwing positioned on
+ * that node of the directory tree. Otherwise, pass the current default
+ * directory as the argument. - FM
+ */
+ if (LYisLocalFile(curdoc.address) &&
+ strncasecomp(curdoc.address,
+ lynx_temp_space, strlen(lynx_temp_space))) {
+ /*
+ * We are viewing a local directory or a local file which is not
+ * temporary. - FM
+ */
+ struct stat stat_info;
+
+ cp = HTParse(curdoc.address, "", PARSE_PATH | PARSE_PUNCTUATION);
+ HTUnEscape(cp);
+ if (HTStat(cp, &stat_info) == -1) {
+ CTRACE((tfp, "mainloop: Can't stat %s\n", cp));
+ FREE(cp);
+ HTSprintf0(&temp, "%s []", HTGetProgramPath(ppCSWING));
+ *refresh_screen = TRUE; /* redisplay */
+ } else {
+ char *VMSdir = NULL;
+
+ if (S_ISDIR(stat_info.st_mode)) {
+ /*
+ * We're viewing a local directory. Make that the CSwing
+ * argument. - FM
+ */
+ LYAddPathSep(&cp);
+ StrAllocCopy(VMSdir, HTVMS_name("", cp));
+ FREE(cp);
+ } else {
+ /*
+ * We're viewing a local file. Make its directory the CSwing
+ * argument. - FM
+ */
+ StrAllocCopy(VMSdir, HTVMS_name("", cp));
+ FREE(cp);
+ if ((cp = strrchr(VMSdir, ']')) != NULL) {
+ *(cp + 1) = '\0';
+ } else if ((cp = strrchr(VMSdir, ':')) != NULL) {
+ *(cp + 1) = '\0';
+ }
+ }
+ HTSprintf0(&temp, "%s %s", HTGetProgramPath(ppCSWING), VMSdir);
+ FREE(VMSdir);
+ /*
+ * Uncache the current document in case we change, move, or delete
+ * it during the CSwing session. - FM
+ */
+ /* could use DIRED_UNCACHE_1 but it's currently only defined
+ for dired - kw */
+ HTuncache_current_document();
+ move_address(&newdoc, &curdoc);
+ StrAllocCopy(newdoc.title, NonNull(curdoc.title));
+ StrAllocCopy(newdoc.bookmark, curdoc.bookmark);
+ newdoc.line = curdoc.line;
+ newdoc.link = curdoc.link;
+ }
+ } else {
+ /*
+ * We're not viewing a local directory or file. Pass CSwing the
+ * current default directory as an argument and don't uncache the
+ * current document. - FM
+ */
+ HTSprintf0(&temp, "%s []", HTGetProgramPath(ppCSWING));
+ *refresh_screen = TRUE; /* redisplay */
+ }
+ stop_curses();
+ LYSystem(temp);
+ start_curses();
+ FREE(temp);
+#else
+ /*
+ * Don't do if not allowed or already viewing the menu.
+ */
+ if (lynx_edit_mode && !no_dired_support &&
+ !LYIsUIPage(curdoc.address, UIP_DIRED_MENU) &&
+ strcmp(NonNull(curdoc.title), DIRED_MENU_TITLE)) {
+ dired_options(&curdoc, &newdoc.address);
+ *refresh_screen = TRUE; /* redisplay */
+ }
+#endif /* VMS */
+}
+#endif /* defined(DIRED_SUPPORT) || defined(VMS) */
+
+static int handle_LYK_DOWNLOAD(int *cmd,
+ int *old_c,
+ int real_c)
+{
+
+ /*
+ * Don't do if both download and disk_save are restricted.
+ */
+ if (LYValidate ||
+ (no_download && !override_no_download && no_disk_save)) {
+ if (*old_c != real_c) {
+ *old_c = real_c;
+ HTUserMsg(DOWNLOAD_DISABLED);
+ }
+ return 0;
+ }
+
+ /*
+ * Don't do if already viewing download options page.
+ */
+ if (LYIsUIPage(curdoc.address, UIP_DOWNLOAD_OPTIONS))
+ return 0;
+
+ if (do_change_link() == -1)
+ return 1; /* mouse stuff was confused, ignore - kw */
+ if (nlinks > 0) {
+ if (links[curdoc.link].type == WWW_FORM_LINK_TYPE) {
+ if (links[curdoc.link].l_form->type == F_SUBMIT_TYPE ||
+ links[curdoc.link].l_form->type == F_IMAGE_SUBMIT_TYPE ||
+ links[curdoc.link].l_form->type == F_TEXT_SUBMIT_TYPE) {
+ if (links[curdoc.link].l_form->submit_method ==
+ URL_MAIL_METHOD) {
+ if (*old_c != real_c) {
+ *old_c = real_c;
+ HTUserMsg(NO_DOWNLOAD_MAILTO_ACTION);
+ }
+ return 0;
+ }
+ if (isEmpty(links[curdoc.link].l_form->submit_action) ||
+ isLYNXOPTIONS(links[curdoc.link].l_form->submit_action)) {
+ if (*old_c != real_c) {
+ *old_c = real_c;
+ HTUserMsg(NO_DOWNLOAD_SPECIAL);
+ }
+ return 0;
+ }
+ HTOutputFormat = WWW_DOWNLOAD;
+ LYforce_no_cache = TRUE;
+ *cmd = LYK_ACTIVATE;
+ return 2;
+ }
+ if (*old_c != real_c) {
+ *old_c = real_c;
+ HTUserMsg(NO_DOWNLOAD_INPUT);
+ }
+
+ } else if (isLYNXCOOKIE(curdoc.address)) {
+ if (*old_c != real_c) {
+ *old_c = real_c;
+ HTUserMsg(NO_DOWNLOAD_COOKIES);
+ }
+ } else if (LYIsUIPage(curdoc.address, UIP_PRINT_OPTIONS)) {
+ if (*old_c != real_c) {
+ *old_c = real_c;
+ HTUserMsg(NO_DOWNLOAD_PRINT_OP);
+ }
+#ifdef DIRED_SUPPORT
+ } else if (LYIsUIPage(curdoc.address, UIP_UPLOAD_OPTIONS)) {
+ if (*old_c != real_c) {
+ *old_c = real_c;
+ HTUserMsg(NO_DOWNLOAD_UPLOAD_OP);
+ }
+
+ } else if (LYIsUIPage(curdoc.address, UIP_PERMIT_OPTIONS)) {
+ if (*old_c != real_c) {
+ *old_c = real_c;
+ HTUserMsg(NO_DOWNLOAD_PERMIT_OP);
+ }
+
+ } else if (lynx_edit_mode && !no_dired_support &&
+ !LYstrstr(links[curdoc.link].lname, "/SugFile=")) {
+ /*
+ * Don't bother making a /tmp copy of the local file.
+ */
+ static DocInfo temp;
+
+ copy_address(&temp, &newdoc);
+ set_address(&newdoc, links[curdoc.link].lname);
+ if (LYdownload_options(&newdoc.address,
+ links[curdoc.link].lname) < 0)
+ copy_address(&newdoc, &temp);
+ else
+ newdoc.internal_link = FALSE;
+ LYFreeDocInfo(&temp);
+#endif /* DIRED_SUPPORT */
+
+ } else if (LYIsUIPage(curdoc.address, UIP_HISTORY) &&
+ isLYNXHIST(links[curdoc.link].lname)) {
+ int number = atoi(links[curdoc.link].lname + LEN_LYNXHIST);
+
+ if (number >= nhist || number < 0) {
+ HTUserMsg(NO_DOWNLOAD_SPECIAL);
+ return 0;
+ }
+ if ((HDOC(number).post_data != NULL &&
+ HDOC(number).safe != TRUE) &&
+ HTConfirm(CONFIRM_POST_RESUBMISSION) == FALSE) {
+ HTInfoMsg(CANCELLED);
+ return 0;
+ }
+ /*
+ * OK, we download from history page, restore URL from stack.
+ */
+ copy_address(&newdoc, &HDOC(number));
+ StrAllocCopy(newdoc.title, LYGetHiliteStr(curdoc.link, 0));
+ StrAllocCopy(newdoc.bookmark, HDOC(number).bookmark);
+ LYFreePostData(&newdoc);
+ if (HDOC(number).post_data)
+ BStrCopy(newdoc.post_data,
+ HDOC(number).post_data);
+ if (HDOC(number).post_content_type)
+ StrAllocCopy(newdoc.post_content_type,
+ HDOC(number).post_content_type);
+ newdoc.isHEAD = HDOC(number).isHEAD;
+ newdoc.safe = HDOC(number).safe;
+ newdoc.internal_link = FALSE;
+ newdoc.link = (user_mode == NOVICE_MODE) ? 1 : 0;
+ HTOutputFormat = WWW_DOWNLOAD;
+ LYUserSpecifiedURL = TRUE;
+ /*
+ * Force the document to be reloaded.
+ */
+ LYforce_no_cache = TRUE;
+
+ } else if (!StrNCmp(links[curdoc.link].lname, "data:", 5)) {
+ if (*old_c != real_c) {
+ *old_c = real_c;
+ HTAlert(UNSUPPORTED_DATA_URL);
+ }
+
+ } else if (isLYNXCOOKIE(links[curdoc.link].lname) ||
+ isLYNXCACHE(links[curdoc.link].lname) ||
+ isLYNXDIRED(links[curdoc.link].lname) ||
+ isLYNXDOWNLOAD(links[curdoc.link].lname) ||
+ isLYNXPRINT(links[curdoc.link].lname) ||
+ isLYNXOPTIONS(links[curdoc.link].lname) ||
+ isLYNXHIST(links[curdoc.link].lname) ||
+ /* handled above if valid - kw */
+/* @@@ should next two be downloadable? - kw */
+ isLYNXHIST(links[curdoc.link].lname) ||
+ isLYNXCFLAGS(links[curdoc.link].lname) ||
+ isLYNXEXEC(links[curdoc.link].lname) ||
+ isLYNXPROG(links[curdoc.link].lname)) {
+ HTUserMsg(NO_DOWNLOAD_SPECIAL);
+
+ } else if (isMAILTO_URL(links[curdoc.link].lname)) {
+ HTUserMsg(NO_DOWNLOAD_MAILTO_LINK);
+
+ /*
+ * From here on we could have a remote host, so check if that's
+ * allowed.
+ *
+ * We copy all these checks from getfile() to LYK_DOWNLOAD here
+ * because LYNXDOWNLOAD:// will NOT be pushing the previous
+ * document into the history stack so preserve getfile() from
+ * returning a wrong status (NULLFILE).
+ */
+ } else if (local_host_only &&
+ !(LYisLocalHost(links[curdoc.link].lname) ||
+ LYisLocalAlias(links[curdoc.link].lname))) {
+ HTUserMsg(ACCESS_ONLY_LOCALHOST);
+ } else { /* Not a forms, options or history link */
+ /*
+ * Follow a normal link or anchor. Note that if it's an anchor
+ * within the same document, entire document will be downloaded.
+ */
+ set_address(&newdoc, links[curdoc.link].lname);
+ StrAllocCopy(newdoc.title, LYGetHiliteStr(curdoc.link, 0));
+ /*
+ * Might be an internal link in the same doc from a POST form. If
+ * so, don't free the content. - kw
+ */
+ if (track_internal_links) {
+ if (links[curdoc.link].type != WWW_INTERN_LINK_TYPE) {
+ LYFreePostData(&newdoc);
+ FREE(newdoc.bookmark);
+ newdoc.isHEAD = FALSE;
+ newdoc.safe = FALSE;
+ }
+ } else {
+ /*
+ * Might be an anchor in the same doc from a POST form. If so,
+ * don't free the content. -- FM
+ */
+ if (are_different(&curdoc, &newdoc)) {
+ LYFreePostData(&newdoc);
+ FREE(newdoc.bookmark);
+ newdoc.isHEAD = FALSE;
+ newdoc.safe = FALSE;
+ }
+ }
+ newdoc.internal_link = FALSE;
+ newdoc.link = (user_mode == NOVICE_MODE) ? 1 : 0;
+ HTOutputFormat = WWW_DOWNLOAD;
+ /*
+ * Force the document to be reloaded.
+ */
+ LYforce_no_cache = TRUE;
+ }
+ } else if (*old_c != real_c) {
+ *old_c = real_c;
+ HTUserMsg(NO_DOWNLOAD_CHOICE);
+ }
+ return 0;
+}
+
+static void handle_LYK_DOWN_xxx(int *old_c,
+ int real_c,
+ int scroll_by)
+{
+ int i;
+
+ if (more_text) {
+ LYChgNewline(scroll_by);
+ if (nlinks > 0 && curdoc.link > -1 &&
+ links[curdoc.link].ly > scroll_by) {
+ newdoc.link = curdoc.link;
+ for (i = 0; links[i].ly <= scroll_by; i++)
+ --newdoc.link;
+ }
+ } else if (*old_c != real_c) {
+ HandleForwardWraparound();
+ }
+}
+
+static void handle_LYK_DOWN_HALF(int *old_c,
+ int real_c)
+{
+ handle_LYK_DOWN_xxx(old_c, real_c, display_lines / 2);
+}
+
+static void handle_LYK_DOWN_LINK(int *follow_col,
+ int *old_c,
+ int real_c)
+{
+ if (curdoc.link < (nlinks - 1)) { /* more links? */
+ int newlink;
+
+ if (*follow_col == -1) {
+ const char *text = LYGetHiliteStr(curdoc.link, 0);
+
+ *follow_col = links[curdoc.link].lx;
+
+ if (text != NULL)
+ *follow_col += (int) strlen(text) / 2;
+ }
+
+ newlink = find_link_near_col(*follow_col, 1);
+ if (newlink > -1) {
+ set_curdoc_link(newlink);
+ } else if (more_text) { /* next page */
+ LYChgNewline(display_lines);
+ } else if (*old_c != real_c) {
+ *old_c = real_c;
+ HTUserMsg(NO_LINKS_BELOW);
+ return;
+ }
+ } else if (more_text) { /* next page */
+ LYChgNewline(display_lines);
+ } else if (*old_c != real_c) {
+ HandleForwardWraparound();
+ }
+}
+
+static void handle_LYK_DOWN_TWO(int *old_c,
+ int real_c)
+{
+ handle_LYK_DOWN_xxx(old_c, real_c, 2);
+}
+
+static int handle_LYK_DWIMEDIT(int *cmd,
+ int *old_c,
+ int real_c)
+{
+#ifdef TEXTAREA_AUTOEXTEDIT
+ /*
+ * If we're in a forms TEXTAREA, invoke the editor on *its* contents,
+ * rather than attempting to edit the html source document. KED
+ */
+ if (nlinks > 0 &&
+ LinkIsTextarea(curdoc.link)) {
+ *cmd = LYK_EDITTEXTAREA;
+ return 2;
+ }
+
+ /*
+ * If we're in a forms TEXT type, tell user the request is bogus (though in
+ * reality, without this trap, if the document with the TEXT field is
+ * local, the editor *would* be invoked on the source .html file; eg, the
+ * o(ptions) form tempfile).
+ *
+ * [This is done to avoid possible user confusion, due to auto invocation
+ * of the editor on the TEXTAREA's contents via the above if() statement.]
+ */
+ if (nlinks > 0 &&
+ links[curdoc.link].type == WWW_FORM_LINK_TYPE &&
+ links[curdoc.link].l_form->type == F_TEXT_TYPE) {
+ HTUserMsg(CANNOT_EDIT_FIELD);
+ return 1;
+ }
+
+ if (no_editor) {
+ if (*old_c != real_c) {
+ *old_c = real_c;
+ HTUserMsg(ANYEDIT_DISABLED);
+ }
+ return 1;
+ }
+#endif /* TEXTAREA_AUTOEXTEDIT */
+ return 0;
+}
+
+static int handle_LYK_ECGOTO(int *ch,
+ bstring **user_input,
+ char **old_user_input,
+ int *old_c,
+ int real_c)
+{
+ if (no_goto && !LYValidate) {
+ /*
+ * Go to not allowed. - FM
+ */
+ if (*old_c != real_c) {
+ *old_c = real_c;
+ HTUserMsg(GOTO_DISALLOWED);
+ }
+ return 0;
+ }
+#ifdef DIRED_SUPPORT
+ if (LYIsUIPage(curdoc.address, UIP_DIRED_MENU) ||
+ LYIsUIPage(curdoc.address, UIP_PERMIT_OPTIONS) ||
+ LYIsUIPage(curdoc.address, UIP_UPLOAD_OPTIONS)) {
+ /*
+ * Disallow editing of File Management URLs. - FM
+ */
+ if (*old_c != real_c) {
+ *old_c = real_c;
+ HTUserMsg(EDIT_FM_MENU_URLS_DISALLOWED);
+ }
+ return 0;
+ }
+#endif /* DIRED_SUPPORT */
+
+ /*
+ * Save the current user_input string, and load the current
+ * document's address.
+ */
+ StrAllocCopy(*old_user_input, (*user_input)->str);
+ BStrCopy0((*user_input), curdoc.address);
+
+ /*
+ * Warn the user if the current document has POST data associated with it.
+ * - FM
+ */
+ if (curdoc.post_data)
+ HTAlert(CURRENT_DOC_HAS_POST_DATA);
+
+ /*
+ * Offer the current document's URL for editing. - FM
+ */
+ _statusline(EDIT_CURDOC_URL);
+ if (((*ch = LYgetBString(user_input, FALSE, 0, RECALL_URL)) >= 0) &&
+ !isBEmpty(*user_input) &&
+ strcmp((*user_input)->str, curdoc.address)) {
+ LYTrimAllStartfile((*user_input)->str);
+ if (!isBEmpty(*user_input)) {
+ return 2;
+ }
+ }
+ /*
+ * User cancelled via ^G, a full deletion, or not modifying the URL. - FM
+ */
+ HTInfoMsg(CANCELLED);
+ BStrCopy0((*user_input), *old_user_input);
+ FREE(*old_user_input);
+ return 0;
+}
+
+static void handle_LYK_EDIT(int *old_c,
+ int real_c)
+{
+#ifdef DIRED_SUPPORT
+ char *cp;
+ char *tp = NULL;
+ struct stat dir_info;
+#endif /* DIRED_SUPPORT */
+
+ if (no_editor) {
+ if (*old_c != real_c) {
+ *old_c = real_c;
+ HTUserMsg(EDIT_DISABLED);
+ }
+ }
+#ifdef DIRED_SUPPORT
+ /*
+ * Allow the user to edit the link rather than curdoc in edit mode.
+ */
+ else if (lynx_edit_mode &&
+ non_empty(editor) && !no_dired_support) {
+ if (nlinks > 0) {
+ cp = links[curdoc.link].lname;
+ if (is_url(cp) == FILE_URL_TYPE) {
+ cp = HTfullURL_toFile(cp);
+ StrAllocCopy(tp, cp);
+ FREE(cp);
+
+ if (stat(tp, &dir_info) == -1) {
+ HTAlert(NO_STATUS);
+ } else {
+ if (S_ISREG(dir_info.st_mode)) {
+ StrAllocCopy(tp, links[curdoc.link].lname);
+ HTUnEscapeSome(tp, "/");
+ if (edit_current_file(tp, curdoc.link, -1)) {
+ DIRED_UNCACHE_1;
+ move_address(&newdoc, &curdoc);
+#ifdef NO_SEEK_OLD_POSITION
+ /*
+ * Go to top of file.
+ */
+ newdoc.line = 1;
+ newdoc.link = 0;
+#else
+ /*
+ * Seek old position, which probably changed.
+ */
+ newdoc.line = curdoc.line;
+ newdoc.link = curdoc.link;
+#endif /* NO_SEEK_OLD_POSITION */
+ LYclear(); /* clear the screen */
+ }
+ }
+ }
+ FREE(tp);
+ }
+ }
+ }
+#endif /* DIRED_SUPPORT */
+ else if (non_empty(editor)) {
+ if (edit_current_file(newdoc.address, curdoc.link, LYGetNewline())) {
+ HTuncache_current_document();
+ LYforce_no_cache = TRUE; /*force reload of document */
+ free_address(&curdoc); /* so it doesn't get pushed */
+#ifdef NO_SEEK_OLD_POSITION
+ /*
+ * Go to top of file.
+ */
+ newdoc.line = 1;
+ newdoc.link = 0;
+#else
+ /*
+ * Seek old position, which probably changed.
+ */
+ newdoc.line = curdoc.line;
+ newdoc.link = curdoc.link;
+#endif /* NO_SEEK_OLD_POSITION */
+ LYclear(); /* clear the screen */
+ }
+
+ } else {
+ if (*old_c != real_c) {
+ *old_c = real_c;
+ HTUserMsg(NO_EDITOR);
+ }
+ }
+}
+
+static void handle_LYK_DWIMHELP(const char **cshelpfile)
+{
+ /*
+ * Currently a help file different from the main 'helpfile' is shown only
+ * if current link is a text input form field. - kw
+ */
+ if (curdoc.link >= 0 && curdoc.link < nlinks &&
+ !FormIsReadonly(links[curdoc.link].l_form) &&
+ LinkIsTextLike(curdoc.link)) {
+ *cshelpfile = STR_LYNXEDITMAP;
+ }
+}
+
+static void handle_LYK_EDITMAP(int *old_c,
+ int real_c)
+{
+ if (*old_c != real_c) {
+ *old_c = real_c;
+ set_address(&newdoc, STR_LYNXEDITMAP);
+ StrAllocCopy(newdoc.title, CURRENT_EDITMAP_TITLE);
+ LYFreePostData(&newdoc);
+ FREE(newdoc.bookmark);
+ newdoc.isHEAD = FALSE;
+ newdoc.safe = FALSE;
+ newdoc.internal_link = FALSE;
+#if defined(DIRED_SUPPORT) && defined(OK_OVERRIDE)
+ /*
+ * Remember whether we are in dired menu so we can display the right
+ * keymap.
+ */
+ if (!no_dired_support) {
+ prev_lynx_edit_mode = lynx_edit_mode;
+ }
+#endif /* DIRED_SUPPORT && OK_OVERRIDE */
+ LYforce_no_cache = TRUE;
+ }
+}
+
+static void handle_LYK_EDIT_TEXTAREA(BOOLEAN *refresh_screen,
+ int *old_c,
+ int real_c)
+{
+ if (no_editor) {
+ if (*old_c != real_c) {
+ *old_c = real_c;
+ HTUserMsg(ANYEDIT_DISABLED);
+ }
+ } else if (isEmpty(editor)) {
+ if (*old_c != real_c) {
+ *old_c = real_c;
+ HTUserMsg(NO_EDITOR);
+ }
+ } else if (LinkIsTextarea(curdoc.link)) {
+ /*
+ * if the current link is in a form TEXTAREA, it requires handling
+ * for the possible multiple lines.
+ */
+
+ /* stop screen */
+ stop_curses();
+
+ (void) HText_EditTextArea(&links[curdoc.link]);
+
+ /*
+ * TODO:
+ * Move cursor "n" lines from the current line to position it on the
+ * 1st trailing blank line in the now edited TEXTAREA. If the target
+ * line/ anchor requires us to scroll up/down, position the target in
+ * the approximate center of the screen.
+ */
+
+ /* curdoc.link += n; */
+ /* works, except for page crossing, */
+ /* damnit; why is nothing ever easy */
+
+ /* start screen */
+ start_curses();
+ *refresh_screen = TRUE;
+
+ } else if (LinkIsTextLike(curdoc.link)) {
+ /*
+ * other text fields are single-line
+ */
+ stop_curses();
+ HText_EditTextField(&links[curdoc.link]);
+ start_curses();
+ *refresh_screen = TRUE;
+ } else {
+
+ HTInfoMsg(NOT_IN_TEXTAREA_NOEDIT);
+ }
+}
+
+static int handle_LYK_ELGOTO(int *ch,
+ bstring **user_input,
+ char **old_user_input,
+ int *old_c,
+ int real_c)
+{
+ if (no_goto && !LYValidate) {
+ /*
+ * Go to not allowed. - FM
+ */
+ if (*old_c != real_c) {
+ *old_c = real_c;
+ HTUserMsg(GOTO_DISALLOWED);
+ }
+ return 0;
+ }
+ if (!(nlinks > 0 && curdoc.link > -1) ||
+ (links[curdoc.link].type == WWW_FORM_LINK_TYPE &&
+ links[curdoc.link].l_form->type != F_SUBMIT_TYPE &&
+ links[curdoc.link].l_form->type != F_IMAGE_SUBMIT_TYPE &&
+ links[curdoc.link].l_form->type != F_TEXT_SUBMIT_TYPE)) {
+ /*
+ * No links on page, or not a normal link or form submit button. - FM
+ */
+ if (*old_c != real_c) {
+ *old_c = real_c;
+ HTUserMsg(NOT_ON_SUBMIT_OR_LINK);
+ }
+ return 0;
+ }
+ if ((links[curdoc.link].type == WWW_FORM_LINK_TYPE) &&
+ (isEmpty(links[curdoc.link].l_form->submit_action))) {
+ /*
+ * Form submit button with no ACTION defined. - FM
+ */
+ if (*old_c != real_c) {
+ *old_c = real_c;
+ HTUserMsg(NO_FORM_ACTION);
+ }
+ return 0;
+ }
+#ifdef DIRED_SUPPORT
+ if (isLYNXDIRED(links[curdoc.link].lname) ||
+ LYIsUIPage(curdoc.address, UIP_DIRED_MENU) ||
+ LYIsUIPage(curdoc.address, UIP_PERMIT_OPTIONS) ||
+ LYIsUIPage(curdoc.address, UIP_UPLOAD_OPTIONS)) {
+ /*
+ * Disallow editing of File Management URLs. - FM
+ */
+ if (*old_c != real_c) {
+ *old_c = real_c;
+ HTUserMsg(EDIT_FM_MENU_URLS_DISALLOWED);
+ }
+ return 0;
+ }
+#endif /* DIRED_SUPPORT */
+
+ /*
+ * Save the current user_input string, and load the current link's
+ * address. - FM
+ */
+ StrAllocCopy(*old_user_input, (*user_input)->str);
+ BStrCopy0((*user_input),
+ ((links[curdoc.link].type == WWW_FORM_LINK_TYPE)
+ ? links[curdoc.link].l_form->submit_action
+ : links[curdoc.link].lname));
+ /*
+ * Offer the current link's URL for editing. - FM
+ */
+ _statusline(EDIT_CURLINK_URL);
+ if (((*ch = LYgetBString(user_input, FALSE, 0, RECALL_URL)) >= 0) &&
+ !isBEmpty(*user_input) &&
+ strcmp((*user_input)->str,
+ ((links[curdoc.link].type == WWW_FORM_LINK_TYPE)
+ ? links[curdoc.link].l_form->submit_action
+ : links[curdoc.link].lname))) {
+ LYTrimAllStartfile((*user_input)->str);
+ if (!isBEmpty(*user_input)) {
+ return 2;
+ }
+ }
+ /*
+ * User cancelled via ^G, a full deletion, or not modifying the URL. - FM
+ */
+ HTInfoMsg(CANCELLED);
+ BStrCopy0((*user_input), *old_user_input);
+ FREE(*old_user_input);
+ return 0;
+}
+
+#ifdef USE_EXTERNALS
+static void handle_LYK_EXTERN_LINK(BOOLEAN *refresh_screen)
+{
+ if ((nlinks > 0) && (links[curdoc.link].lname != NULL)) {
+ run_external(links[curdoc.link].lname, FALSE);
+ *refresh_screen = TRUE;
+ }
+}
+
+static void handle_LYK_EXTERN_PAGE(BOOLEAN *refresh_screen)
+{
+ if (curdoc.address != NULL) {
+ run_external(curdoc.address, FALSE);
+ *refresh_screen = TRUE;
+ }
+}
+#endif
+
+static BOOLEAN handle_LYK_FASTBACKW_LINK(int *cmd,
+ int *old_c,
+ int real_c)
+{
+ int samepage = 0, nextlink = curdoc.link;
+ int res;
+ BOOLEAN code = FALSE;
+
+ if (nlinks > 1) {
+
+ /*
+ * If in textarea, move to first link or textarea group before it if
+ * there is one on this screen. - kw
+ */
+ if (LinkIsTextarea(curdoc.link)) {
+ int thisgroup = links[curdoc.link].l_form->number;
+ char *thisname = links[curdoc.link].l_form->name;
+
+ if (curdoc.link > 0 &&
+ !(LinkIsTextarea(0) &&
+ links[0].l_form->number == thisgroup &&
+ sametext(links[0].l_form->name, thisname))) {
+ do
+ nextlink--;
+ while
+ (LinkIsTextarea(nextlink) &&
+ links[nextlink].l_form->number == thisgroup &&
+ sametext(links[nextlink].l_form->name, thisname));
+ samepage = 1;
+
+ } else if (!more_text && LYGetNewline() == 1 &&
+ (LinkIsTextarea(0) &&
+ links[0].l_form->number == thisgroup &&
+ sametext(links[0].l_form->name, thisname)) &&
+ !(LinkIsTextarea(nlinks - 1) &&
+ links[nlinks - 1].l_form->number == thisgroup &&
+ sametext(links[nlinks - 1].l_form->name, thisname))) {
+ nextlink = nlinks - 1;
+ samepage = 1;
+
+ } else if (!more_text && LYGetNewline() == 1 && curdoc.link > 0) {
+ nextlink = 0;
+ samepage = 1;
+ }
+ } else if (curdoc.link > 0) {
+ nextlink--;
+ samepage = 1;
+ } else if (!more_text && LYGetNewline() == 1) {
+ nextlink = nlinks - 1;
+ samepage = 1;
+ }
+ }
+
+ if (samepage) {
+ /*
+ * If the link as determined so far is part of a group of textarea
+ * fields, try to use the first of them that's on the screen instead.
+ * - kw
+ */
+ if (nextlink > 0 &&
+ LinkIsTextarea(nextlink)) {
+ int thisgroup = links[nextlink].l_form->number;
+ char *thisname = links[nextlink].l_form->name;
+
+ if (LinkIsTextarea(0) &&
+ links[0].l_form->number == thisgroup &&
+ sametext(links[0].l_form->name, thisname)) {
+ nextlink = 0;
+ } else
+ while
+ (nextlink > 1 &&
+ LinkIsTextarea(nextlink - 1) &&
+ links[nextlink - 1].l_form->number == thisgroup &&
+ sametext(links[nextlink - 1].l_form->name, thisname)) {
+ nextlink--;
+ }
+ }
+ set_curdoc_link(nextlink);
+
+ } else if (LYGetNewline() > 1 && /* need a previous page */
+ (res = HTGetLinkOrFieldStart(curdoc.link,
+ &Newline, &newdoc.link,
+ -1, TRUE)) != NO) {
+ if (res == LINK_DO_ARROWUP) {
+ /*
+ * It says we should use the normal PREV_LINK mechanism, so we'll
+ * do that. - kw
+ */
+ if (nlinks > 0)
+ curdoc.link = 0;
+ *cmd = LYK_PREV_LINK;
+ code = TRUE;
+ } else {
+ LYChgNewline(1); /* our line counting starts with 1 not 0 */
+ }
+ } else if (*old_c != real_c) {
+ *old_c = real_c;
+ HTInfoMsg(NO_LINKS_ABOVE);
+ }
+ return code;
+}
+
+static void handle_LYK_FASTFORW_LINK(int *old_c,
+ int real_c)
+{
+ int samepage = 0, nextlink = curdoc.link;
+
+ if (nlinks > 1) {
+
+ /*
+ * If in textarea, move to first link or field after it if there is one
+ * on this screen. - kw
+ */
+ if (LinkIsTextarea(curdoc.link)) {
+ int thisgroup = links[curdoc.link].l_form->number;
+ char *thisname = links[curdoc.link].l_form->name;
+
+ if (curdoc.link < nlinks - 1 &&
+ !(LinkIsTextarea(nlinks - 1) &&
+ links[nlinks - 1].l_form->number == thisgroup &&
+ sametext(links[nlinks - 1].l_form->name, thisname))) {
+ do
+ nextlink++;
+ while
+ (LinkIsTextarea(nextlink) &&
+ links[nextlink].l_form->number == thisgroup &&
+ sametext(links[nextlink].l_form->name, thisname));
+ samepage = 1;
+ } else if (!more_text && LYGetNewline() == 1 && curdoc.link > 0) {
+ nextlink = 0;
+ samepage = 1;
+ }
+ } else if (curdoc.link < nlinks - 1) {
+ nextlink++;
+ samepage = 1;
+ } else if (!more_text && LYGetNewline() == 1 && curdoc.link > 0) {
+ nextlink = 0;
+ samepage = 1;
+ }
+ }
+
+ if (samepage) {
+ set_curdoc_link(nextlink);
+ } else if (!more_text && LYGetNewline() == 1 && curdoc.link == nlinks - 1) {
+ /*
+ * At the bottom of list and there is only one page. Move to the top
+ * link on the page.
+ */
+ set_curdoc_link(0);
+
+ } else if (more_text && /* need a later page */
+ HTGetLinkOrFieldStart(curdoc.link,
+ &Newline, &newdoc.link,
+ 1, TRUE) != NO) {
+ LYChgNewline(1); /* our line counting starts with 1 not 0 */
+ /* nothing more to do here */
+
+ } else if (*old_c != real_c) {
+ *old_c = real_c;
+ HTInfoMsg(NO_LINKS_BELOW);
+ }
+ return;
+}
+
+static void handle_LYK_FIRST_LINK(void)
+{
+ int i = curdoc.link;
+
+ for (;;) {
+ if (--i < 0
+ || links[i].ly != links[curdoc.link].ly) {
+ set_curdoc_link(i + 1);
+ break;
+ }
+ }
+}
+
+static BOOLEAN handle_LYK_GOTO(int *ch,
+ bstring **user_input,
+ char **old_user_input,
+ RecallType * recall,
+ int *URLTotal,
+ int *URLNum,
+ BOOLEAN *FirstURLRecall,
+ int *old_c,
+ int real_c)
+{
+
+ if (no_goto && !LYValidate) {
+ if (*old_c != real_c) {
+ *old_c = real_c;
+ HTUserMsg(GOTO_DISALLOWED);
+ }
+ return FALSE;
+ }
+
+ StrAllocCopy(*old_user_input, (*user_input)->str);
+ if (!goto_buffer)
+ BStrCopy0((*user_input), "");
+
+ *URLTotal = (Goto_URLs ? HTList_count(Goto_URLs) : 0);
+ if (goto_buffer && !isBEmpty(*user_input)) {
+ *recall = ((*URLTotal > 1) ? RECALL_URL : NORECALL);
+ *URLNum = 0;
+ *FirstURLRecall = FALSE;
+ } else {
+ *recall = ((*URLTotal >= 1) ? RECALL_URL : NORECALL);
+ *URLNum = *URLTotal;
+ *FirstURLRecall = TRUE;
+ }
+
+ /*
+ * Ask the user.
+ */
+ _statusline(URL_TO_OPEN);
+ if ((*ch = LYgetBString(user_input, FALSE, 0, *recall)) < 0) {
+ /*
+ * User cancelled the Goto via ^G. Restore user_input and
+ * break. - FM
+ */
+ BStrCopy0((*user_input), *old_user_input);
+ FREE(*old_user_input);
+ HTInfoMsg(CANCELLED);
+ return FALSE;
+ }
+ return TRUE;
+}
+
+static void handle_LYK_GROW_TEXTAREA(BOOLEAN *refresh_screen)
+{
+ /*
+ * See if the current link is in a form TEXTAREA.
+ */
+ if (LinkIsTextarea(curdoc.link)) {
+
+ HText_ExpandTextarea(&links[curdoc.link], TEXTAREA_EXPAND_SIZE);
+
+ *refresh_screen = TRUE;
+
+ } else {
+
+ HTInfoMsg(NOT_IN_TEXTAREA);
+ }
+}
+
+static BOOLEAN handle_LYK_HEAD(int *cmd)
+{
+ int c;
+
+ if (nlinks > 0 &&
+ (links[curdoc.link].type != WWW_FORM_LINK_TYPE ||
+ links[curdoc.link].l_form->type == F_SUBMIT_TYPE ||
+ links[curdoc.link].l_form->type == F_IMAGE_SUBMIT_TYPE ||
+ links[curdoc.link].l_form->type == F_TEXT_SUBMIT_TYPE)) {
+ /*
+ * We have links, and the current link is a normal link or a form's
+ * submit button. - FM
+ */
+ _statusline(HEAD_D_L_OR_CANCEL);
+ c = LYgetch_single();
+ if (c == 'D') {
+ char *scheme = !isLYNXIMGMAP(curdoc.address)
+ ? curdoc.address
+ : curdoc.address + LEN_LYNXIMGMAP;
+
+ if (LYCanDoHEAD(scheme) != TRUE) {
+ HTUserMsg(DOC_NOT_HTTP_URL);
+ } else {
+ /*
+ * Check if this is a reply from a POST, and if so, seek
+ * confirmation if the safe element is not set. - FM
+ */
+ if ((curdoc.post_data != NULL &&
+ curdoc.safe != TRUE) &&
+ HTConfirm(CONFIRM_POST_DOC_HEAD) == FALSE) {
+ HTInfoMsg(CANCELLED);
+ } else {
+ HEAD_request = TRUE;
+ LYforce_no_cache = TRUE;
+ StrAllocCopy(newdoc.title, curdoc.title);
+ if (HTLoadedDocumentIsHEAD()) {
+ HText_setNoCache(HTMainText);
+ free_address(&curdoc);
+ } else {
+ StrAllocCat(newdoc.title, " - HEAD");
+ }
+ }
+ }
+ } else if (c == 'L') {
+ if (links[curdoc.link].type != WWW_FORM_LINK_TYPE &&
+ StrNCmp(links[curdoc.link].lname, "http", 4) &&
+ StrNCmp(links[curdoc.link].lname, "LYNXIMGMAP:http", 15) &&
+ LYCanDoHEAD(links[curdoc.link].lname) != TRUE &&
+ (links[curdoc.link].type != WWW_INTERN_LINK_TYPE ||
+ !curdoc.address ||
+ StrNCmp(curdoc.address, "http", 4))) {
+ HTUserMsg(LINK_NOT_HTTP_URL);
+ } else if (links[curdoc.link].type == WWW_FORM_LINK_TYPE &&
+ FormIsReadonly(links[curdoc.link].l_form)) {
+ HTUserMsg(FORM_ACTION_DISABLED);
+ } else if (links[curdoc.link].type == WWW_FORM_LINK_TYPE &&
+ links[curdoc.link].l_form->submit_action != 0 &&
+ !isLYNXCGI(links[curdoc.link].l_form->submit_action) &&
+ StrNCmp(links[curdoc.link].l_form->submit_action,
+ "http", 4)) {
+ HTUserMsg(FORM_ACTION_NOT_HTTP_URL);
+ } else if (links[curdoc.link].type == WWW_FORM_LINK_TYPE &&
+ links[curdoc.link].l_form->submit_method ==
+ URL_POST_METHOD &&
+ HTConfirm(CONFIRM_POST_LINK_HEAD) == FALSE) {
+ HTInfoMsg(CANCELLED);
+ } else {
+ HEAD_request = TRUE;
+ LYforce_no_cache = TRUE;
+ *cmd = LYK_ACTIVATE;
+ return TRUE;
+ }
+ }
+ } else {
+ /*
+ * We can offer only this document for a HEAD request. Check if this
+ * is a reply from a POST, and if so, seek confirmation if the safe
+ * element is not set. - FM
+ */
+ if ((curdoc.post_data != NULL &&
+ curdoc.safe != TRUE) &&
+ HTConfirm(CONFIRM_POST_DOC_HEAD) == FALSE) {
+ HTInfoMsg(CANCELLED);
+ } else {
+ if (nlinks > 0) {
+ /*
+ * The current link is a non-submittable form link, so prompt
+ * the user to make it clear that the HEAD request would be for
+ * the current document, not the form link. - FM
+ */
+ _statusline(HEAD_D_OR_CANCEL);
+ c = LYgetch_single();
+ } else {
+ /*
+ * No links, so we can just assume that the user wants a HEAD
+ * request for the current document. - FM
+ */
+ c = 'D';
+ }
+ if (c == 'D') {
+ char *scheme = !isLYNXIMGMAP(curdoc.address)
+ ? curdoc.address
+ : curdoc.address + LEN_LYNXIMGMAP;
+
+ /*
+ * The user didn't cancel, so check if a HEAD request is
+ * appropriate for the current document. - FM
+ */
+ if (LYCanDoHEAD(scheme) != TRUE) {
+ HTUserMsg(DOC_NOT_HTTP_URL);
+ } else {
+ HEAD_request = TRUE;
+ LYforce_no_cache = TRUE;
+ StrAllocCopy(newdoc.title, curdoc.title);
+ if (HTLoadedDocumentIsHEAD()) {
+ HText_setNoCache(HTMainText);
+ free_address(&curdoc);
+ } else {
+ StrAllocCat(newdoc.title, " - HEAD");
+ }
+ }
+ }
+ }
+ }
+ return FALSE;
+}
+
+static void handle_LYK_HELP(const char **cshelpfile)
+{
+ char *my_value = NULL;
+
+ if (*cshelpfile == NULL)
+ *cshelpfile = helpfile;
+ StrAllocCopy(my_value, *cshelpfile);
+ LYEnsureAbsoluteURL(&my_value, *cshelpfile, FALSE);
+ if (!STREQ(curdoc.address, my_value)) {
+ /*
+ * Set the filename.
+ */
+ set_address(&newdoc, my_value);
+ /*
+ * Make a name for this help file.
+ */
+ StrAllocCopy(newdoc.title, gettext("Help Screen"));
+ LYFreePostData(&newdoc);
+ FREE(newdoc.bookmark);
+ newdoc.isHEAD = FALSE;
+ newdoc.safe = FALSE;
+ newdoc.internal_link = FALSE;
+ }
+ FREE(my_value);
+ *cshelpfile = NULL; /* reset pointer - kw */
+}
+
+static void handle_LYK_HISTORICAL(void)
+{
+#ifdef USE_SOURCE_CACHE
+ if (!HTcan_reparse_document()) {
+#endif
+ /*
+ * Check if this is a reply from a POST, and if so, seek confirmation
+ * of reload if the safe element is not set. - FM
+ */
+ if ((curdoc.post_data != NULL &&
+ curdoc.safe != TRUE) &&
+ confirm_post_resub(curdoc.address, NULL, 0, 0) == FALSE) {
+ HTInfoMsg(WILL_NOT_RELOAD_DOC);
+ } else {
+ HText_setNoCache(HTMainText);
+ move_address(&newdoc, &curdoc);
+ newdoc.line = curdoc.line;
+ newdoc.link = curdoc.link;
+ }
+#ifdef USE_SOURCE_CACHE
+ } /* end if no bypass */
+#endif
+ historical_comments = (BOOLEAN) !historical_comments;
+ if (minimal_comments) {
+ HTAlert(historical_comments ?
+ HISTORICAL_ON_MINIMAL_OFF : HISTORICAL_OFF_MINIMAL_ON);
+ } else {
+ HTAlert(historical_comments ?
+ HISTORICAL_ON_VALID_OFF : HISTORICAL_OFF_VALID_ON);
+ }
+#ifdef USE_SOURCE_CACHE
+ (void) reparse_document();
+#endif
+ return;
+}
+
+static BOOLEAN handle_LYK_HISTORY(int ForcePush)
+{
+ if (curdoc.title && !LYIsUIPage(curdoc.address, UIP_HISTORY)) {
+ /*
+ * Don't do this if already viewing history page.
+ *
+ * Push the current file so that the history list contains the current
+ * file for printing purposes. Pop the file afterwards to prevent
+ * multiple copies.
+ */
+ if (TRACE && !LYUseTraceLog && LYCursesON) {
+ LYHideCursor(); /* make sure cursor is down */
+#ifdef USE_SLANG
+ LYaddstr("\n");
+#endif /* USE_SLANG */
+ LYrefresh();
+ }
+ LYpush(&curdoc, ForcePush);
+
+ /*
+ * Print history options to file.
+ */
+ if (showhistory(&newdoc.address) < 0) {
+ LYpop(&curdoc);
+ return TRUE;
+ }
+ LYRegisterUIPage(newdoc.address, UIP_HISTORY);
+ StrAllocCopy(newdoc.title, HISTORY_PAGE_TITLE);
+ LYFreePostData(&newdoc);
+ FREE(newdoc.bookmark);
+ newdoc.isHEAD = FALSE;
+ newdoc.safe = FALSE;
+ newdoc.internal_link = FALSE;
+ newdoc.link = 1; /*@@@ bypass "recent statusline messages" link */
+ free_address(&curdoc); /* so it doesn't get pushed */
+
+ if (LYValidate || check_realm) {
+ LYPermitURL = TRUE;
+ }
+ return TRUE;
+ } /* end if StrNCmp */
+ return FALSE;
+}
+
+static BOOLEAN handle_LYK_IMAGE_TOGGLE(int *cmd)
+{
+ clickable_images = (BOOLEAN) !clickable_images;
+
+ HTUserMsg(clickable_images ?
+ CLICKABLE_IMAGES_ON : CLICKABLE_IMAGES_OFF);
+ return reparse_or_reload(cmd);
+}
+
+static void handle_LYK_INDEX(int *old_c,
+ int real_c)
+{
+ /*
+ * Make sure we are not in the index already.
+ */
+ if (!STREQ(curdoc.address, indexfile)) {
+
+ if (indexfile[0] == '\0') { /* no defined index */
+ if (*old_c != real_c) {
+ *old_c = real_c;
+ HTUserMsg(NO_INDEX_FILE);
+ }
+
+ } else {
+#ifdef KANJI_CODE_OVERRIDE
+ if (HTCJK == JAPANESE) {
+ last_kcode = NOKANJI; /* AUTO */
+ }
+#endif
+#ifdef USE_PROGRAM_DIR
+ if (is_url(indexfile) == 0) {
+ char *tmp = NULL;
+
+ HTSprintf0(&tmp, "%s\\%s", program_dir, indexfile);
+ FREE(indexfile);
+ LYLocalFileToURL(&indexfile, tmp);
+ FREE(tmp);
+ }
+#endif
+ set_address(&newdoc, indexfile);
+ StrAllocCopy(newdoc.title, gettext("System Index")); /* name it */
+ LYFreePostData(&newdoc);
+ FREE(newdoc.bookmark);
+ newdoc.isHEAD = FALSE;
+ newdoc.safe = FALSE;
+ newdoc.internal_link = FALSE;
+ } /* end else */
+ } /* end if */
+}
+
+static void handle_LYK_INDEX_SEARCH(BOOLEAN *force_load,
+ int ForcePush,
+ int *old_c,
+ int real_c)
+{
+ if (is_www_index) {
+ /*
+ * Perform a database search.
+ *
+ * do_www_search will try to go out and get the document. If it
+ * returns TRUE, a new document was returned and is named in the
+ * newdoc.address.
+ */
+ newdoc.isHEAD = FALSE;
+ newdoc.safe = FALSE;
+ if (do_www_search(&newdoc) == NORMAL) {
+ /*
+ * Yah, the search succeeded.
+ */
+ if (TRACE && !LYUseTraceLog && LYCursesON) {
+ /*
+ * Make sure cursor is down.
+ */
+ LYHideCursor();
+#ifdef USE_SLANG
+ LYaddstr("\n");
+#endif /* USE_SLANG */
+ LYrefresh();
+ }
+ LYpush(&curdoc, ForcePush);
+ /*
+ * Make the curdoc.address the newdoc.address so that getfile
+ * doesn't try to get the newdoc.address. Since we have already
+ * gotten it.
+ */
+ copy_address(&curdoc, &newdoc);
+ BStrCopy(newdoc.post_data, curdoc.post_data);
+ StrAllocCopy(newdoc.post_content_type, curdoc.post_content_type);
+ newdoc.internal_link = FALSE;
+ curdoc.line = -1;
+ LYSetNewline(0);
+ } else if (use_this_url_instead != NULL) {
+ /*
+ * Got back a redirecting URL. Check it out.
+ */
+ HTUserMsg2(WWW_USING_MESSAGE, use_this_url_instead);
+
+ /*
+ * Make a name for this URL.
+ */
+ StrAllocCopy(newdoc.title,
+ "A URL specified by redirection");
+ set_address(&newdoc, use_this_url_instead);
+ LYFreePostData(&newdoc);
+ FREE(newdoc.bookmark);
+ newdoc.isHEAD = FALSE;
+ newdoc.safe = FALSE;
+ newdoc.internal_link = FALSE;
+ FREE(use_this_url_instead);
+ *force_load = TRUE;
+ } else {
+ /*
+ * Yuk, the search failed. Restore the old file.
+ */
+ copy_address(&newdoc, &curdoc);
+ BStrCopy(newdoc.post_data, curdoc.post_data);
+ StrAllocCopy(newdoc.post_content_type,
+ curdoc.post_content_type);
+ StrAllocCopy(newdoc.bookmark, curdoc.bookmark);
+ newdoc.isHEAD = curdoc.isHEAD;
+ newdoc.safe = curdoc.safe;
+ newdoc.internal_link = curdoc.internal_link;
+ }
+ } else if (*old_c != real_c) {
+ *old_c = real_c;
+ HTUserMsg(NOT_ISINDEX);
+ }
+}
+
+static BOOLEAN handle_LYK_INFO(int *cmd)
+{
+ /*
+ * Don't do if already viewing info page.
+ */
+ if (!LYIsUIPage(curdoc.address, UIP_SHOWINFO)) {
+ if (do_change_link() != -1
+ && LYShowInfo(&curdoc, &newdoc, owner_address) >= 0) {
+ LYRegisterUIPage(newdoc.address, UIP_SHOWINFO);
+ StrAllocCopy(newdoc.title, SHOWINFO_TITLE);
+ LYFreePostData(&newdoc);
+ FREE(newdoc.bookmark);
+ newdoc.isHEAD = FALSE;
+ newdoc.safe = FALSE;
+ newdoc.internal_link = FALSE;
+ LYforce_no_cache = TRUE;
+ if (LYValidate || check_realm)
+ LYPermitURL = TRUE;
+ }
+ } else {
+ /*
+ * If already in info page, get out.
+ */
+ *cmd = LYK_PREV_DOC;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static BOOLEAN handle_LYK_INLINE_TOGGLE(int *cmd)
+{
+ pseudo_inline_alts = (BOOLEAN) !pseudo_inline_alts;
+
+ HTUserMsg(pseudo_inline_alts ?
+ PSEUDO_INLINE_ALTS_ON : PSEUDO_INLINE_ALTS_OFF);
+ return reparse_or_reload(cmd);
+}
+
+static void handle_LYK_INSERT_FILE(BOOLEAN *refresh_screen,
+ int *old_c,
+ int real_c)
+{
+ /*
+ * See if the current link is in a form TEXTAREA.
+ */
+ if (LinkIsTextarea(curdoc.link)) {
+
+ /*
+ * Reject attempts to use this for gaining access to local files when
+ * such access is restricted: if no_file_url was set via the file_url
+ * restriction, if no_goto_file was set for the anonymous account, or
+ * if HTDirAccess was set to HT_DIR_FORBID or HT_DIR_SELECTIVE via the
+ * -nobrowse or -selective switches, it is assumed that inserting files
+ * or checking for existence of files needs to be denied. - kw
+ */
+ if (no_file_url || no_goto_file ||
+ HTDirAccess == HT_DIR_FORBID ||
+ HTDirAccess == HT_DIR_SELECTIVE) {
+ if (*old_c != real_c) {
+ *old_c = real_c;
+ if (no_goto_file)
+ HTUserMsg2(GOTO_XXXX_DISALLOWED, STR_FILE_URL);
+ else
+ HTUserMsg(NOAUTH_TO_ACCESS_FILES);
+ HTInfoMsg(FILE_INSERT_CANCELLED);
+ }
+ return;
+ }
+
+ (void) HText_InsertFile(&links[curdoc.link]);
+
+ /*
+ * TODO:
+ * Move cursor "n" lines from the current line to position it on the
+ * 1st line following the text that was inserted. If the target
+ * line/anchor requires us to scroll up/down, position the target in
+ * the approximate center of the screen.
+ *
+ * [Current behavior leaves cursor on the same line relative to the
+ * start of the TEXTAREA that it was on before the insertion. This is
+ * the same behavior that occurs with (my) editor, so this TODO will
+ * stay unimplemented.]
+ */
+
+ *refresh_screen = TRUE;
+
+ } else {
+
+ HTInfoMsg(NOT_IN_TEXTAREA);
+ }
+}
+
+#if defined(DIRED_SUPPORT) && defined(OK_INSTALL)
+static void handle_LYK_INSTALL(void)
+{
+ if (lynx_edit_mode && nlinks > 0 && !no_dired_support)
+ local_install(NULL, links[curdoc.link].lname, &newdoc.address);
+}
+#endif
+
+static const char *hexy = "0123456789ABCDEF";
+
+#define HEX(n) hexy[(n) & 0xf]
+/*
+ * URL-encode a parameter which can then be appended to a URI.
+ * RFC-3986 lists reserved characters, which should be encoded.
+ */
+static char *urlencode(char *str)
+{
+ char *result = NULL;
+ char *ptr;
+ int ch;
+
+ if (str != NULL) {
+ result = malloc(strlen(str) * 3 + 1);
+ ptr = result;
+
+ if (result == NULL)
+ outofmem(__FILE__, "urlencode");
+
+ while ((ch = UCH(*str++)) != 0) {
+ if (ch == ' ') {
+ *ptr = '+';
+ ptr++;
+ } else if (ch > 127 ||
+ StrChr(":/?#[]@!$&'()*+,;=", ch) != 0) {
+ *ptr++ = '%';
+ *ptr++ = HEX(ch >> 4);
+ *ptr++ = HEX(ch);
+ } else {
+ *ptr++ = (char) ch;
+ }
+ }
+ *ptr = '\0';
+ }
+
+ return result;
+}
+
+/*
+ * Fill in "%s" marker(s) in the url_template by prompting the user for the
+ * values.
+ */
+static BOOLEAN check_JUMP_param(char **url_template)
+{
+ int param = 1;
+ char *subs;
+ char *result = *url_template;
+ char *encoded = NULL;
+ int code = TRUE;
+ bstring *input = NULL;
+
+ CTRACE((tfp, "check_JUMP_param: %s\n", NONNULL(result)));
+
+ while (result != NULL && (subs = strstr(result, "%s")) != 0) {
+ char prompt[MAX_LINE];
+ RecallType recall = NORECALL;
+
+ CTRACE((tfp, "Prompt for query param%d: %s\n", param, result));
+
+ sprintf(prompt, gettext("Query parameter %d: "), param++);
+ statusline(prompt);
+ BStrCopy0(input, "");
+
+ if (encoded)
+ FREE(encoded);
+
+ if (LYgetBString(&input, FALSE, 0, recall) < 0) {
+ /*
+ * cancelled via ^G
+ */
+ HTInfoMsg(CANCELLED);
+ code = FALSE;
+ break;
+ } else if ((encoded = urlencode(input->str)) != NULL && *encoded != '\0') {
+ int subs_at = (int) (subs - result);
+ int fill_in = (int) strlen(encoded) - 2;
+ size_t have = strlen(result);
+ size_t want = strlen(encoded) + have - 1;
+ int n;
+ char *update = realloc(result, want + 1);
+
+ if (update == 0) {
+ HTInfoMsg(NOT_ENOUGH_MEMORY);
+ code = FALSE;
+ break;
+ }
+
+ CTRACE((tfp, " reply: %s\n", input->str));
+ CTRACE((tfp, " coded: %s\n", encoded));
+
+ result = update;
+ result[want] = '\0';
+ for (n = (int) want; (n - fill_in) >= subs_at; --n) {
+ result[n] = result[n - fill_in];
+ }
+ for (n = subs_at; encoded[n - subs_at] != '\0'; ++n) {
+ result[n] = encoded[n - subs_at];
+ }
+ CTRACE((tfp, " subst: %s\n", result));
+ } else {
+ HTInfoMsg(CANCELLED);
+ code = FALSE;
+ break;
+ }
+ }
+ BStrFree(input);
+ FREE(encoded);
+ *url_template = result;
+ return (BOOLEAN) code;
+}
+
+static void fill_JUMP_Params(char **addressp)
+{
+ if (LYJumpFileURL) {
+ check_JUMP_param(addressp);
+ }
+}
+
+static BOOLEAN handle_LYK_JUMP(int c,
+ bstring **user_input,
+ char **old_user_input GCC_UNUSED,
+ RecallType * recall GCC_UNUSED,
+ BOOLEAN *FirstURLRecall GCC_UNUSED,
+ int *URLNum GCC_UNUSED,
+ int *URLTotal GCC_UNUSED,
+ int *ch GCC_UNUSED,
+ int *old_c,
+ int real_c)
+{
+ char *ret;
+
+ if (no_jump || JThead == NULL) {
+ if (*old_c != real_c) {
+ *old_c = real_c;
+ if (no_jump)
+ HTUserMsg(JUMP_DISALLOWED);
+ else
+ HTUserMsg(NO_JUMPFILE);
+ }
+ } else {
+ LYJumpFileURL = TRUE;
+ if ((ret = LYJump(c)) != NULL) {
+#ifdef PERMIT_GOTO_FROM_JUMP
+ if (!strncasecomp(ret, "Go ", 3)) {
+ LYJumpFileURL = FALSE;
+ StrAllocCopy(*old_user_input, (*user_input)->str);
+ *URLTotal = (Goto_URLs ? HTList_count(Goto_URLs) : 0);
+ *recall = ((*URLTotal >= 1) ? RECALL_URL : NORECALL);
+ *URLNum = *URLTotal;
+ *FirstURLRecall = TRUE;
+ if (!strcasecomp(ret, "Go :")) {
+ if (recall) {
+ *ch = UPARROW_KEY;
+ return TRUE;
+ }
+ FREE(*old_user_input);
+ HTUserMsg(NO_RANDOM_URLS_YET);
+ return FALSE;
+ }
+ ret = HTParse((ret + 3), startfile, PARSE_ALL);
+ BStrCopy0((*user_input), ret);
+ FREE(ret);
+ return TRUE;
+ }
+#endif /* PERMIT_GOTO_FROM_JUMP */
+ ret = HTParse(ret, startfile, PARSE_ALL);
+ if (!LYTrimStartfile(ret)) {
+ LYRemoveBlanks((*user_input)->str);
+ }
+ if (check_JUMP_param(&ret)) {
+ set_address(&newdoc, ret);
+ StrAllocCopy(lynxjumpfile, ret);
+ LYFreePostData(&newdoc);
+ FREE(newdoc.bookmark);
+ newdoc.isHEAD = FALSE;
+ newdoc.safe = FALSE;
+ newdoc.internal_link = FALSE;
+ LYUserSpecifiedURL = TRUE;
+ }
+ FREE(ret);
+ } else {
+ LYJumpFileURL = FALSE;
+ }
+ }
+ return FALSE;
+}
+
+static void handle_LYK_KEYMAP(BOOLEAN *vi_keys_flag,
+ BOOLEAN *emacs_keys_flag,
+ int *old_c,
+ int real_c)
+{
+ if (*old_c != real_c) {
+ *old_c = real_c;
+ set_address(&newdoc, STR_LYNXKEYMAP);
+ StrAllocCopy(newdoc.title, CURRENT_KEYMAP_TITLE);
+ LYFreePostData(&newdoc);
+ FREE(newdoc.bookmark);
+ newdoc.isHEAD = FALSE;
+ newdoc.safe = FALSE;
+ newdoc.internal_link = FALSE;
+ /*
+ * If vi_keys changed, the keymap did too, so force no cache, and reset
+ * the flag. - FM
+ */
+ if (*vi_keys_flag != vi_keys ||
+ *emacs_keys_flag != emacs_keys) {
+ LYforce_no_cache = TRUE;
+ *vi_keys_flag = vi_keys;
+ *emacs_keys_flag = emacs_keys;
+ }
+#if defined(DIRED_SUPPORT) && defined(OK_OVERRIDE)
+ /*
+ * Remember whether we are in dired menu so we can display the right
+ * keymap.
+ */
+ if (!no_dired_support) {
+ prev_lynx_edit_mode = lynx_edit_mode;
+ }
+#endif /* DIRED_SUPPORT && OK_OVERRIDE */
+ LYforce_no_cache = TRUE;
+ }
+}
+
+static void handle_LYK_LAST_LINK(void)
+{
+ int i = curdoc.link;
+
+ for (;;) {
+ if (++i >= nlinks
+ || links[i].ly != links[curdoc.link].ly) {
+ set_curdoc_link(i - 1);
+ break;
+ }
+ }
+}
+
+static void handle_LYK_LEFT_LINK(void)
+{
+ if (curdoc.link > 0 &&
+ links[curdoc.link].ly == links[curdoc.link - 1].ly) {
+ set_curdoc_link(curdoc.link - 1);
+ }
+}
+
+static BOOLEAN handle_LYK_LIST(int *cmd)
+{
+ /*
+ * Don't do if already viewing list page.
+ */
+ if (!strcmp(NonNull(curdoc.title), LIST_PAGE_TITLE) &&
+ LYIsUIPage(curdoc.address, UIP_LIST_PAGE)) {
+ /*
+ * Already viewing list page, so get out.
+ */
+ *cmd = LYK_PREV_DOC;
+ return TRUE;
+ }
+
+ /*
+ * Print list page to file.
+ */
+ if (showlist(&newdoc, TRUE) < 0)
+ return FALSE;
+ StrAllocCopy(newdoc.title, LIST_PAGE_TITLE);
+ /*
+ * showlist will set newdoc's other fields. It may leave post_data intact
+ * so the list can be used to follow internal links in the current document
+ * even if it is a POST response. - kw
+ */
+
+ if (LYValidate || check_realm) {
+ LYPermitURL = TRUE;
+ StrAllocCopy(lynxlistfile, newdoc.address);
+ }
+ return FALSE;
+}
+
+static void handle_LYK_MAIN_MENU(int *old_c,
+ int real_c)
+{
+ /*
+ * If its already the homepage then don't reload it.
+ */
+ if (!STREQ(curdoc.address, homepage)) {
+
+ if (HTConfirmDefault(CONFIRM_MAIN_SCREEN, NO) == YES) {
+ set_address(&newdoc, homepage);
+ StrAllocCopy(newdoc.title, gettext("Entry into main screen"));
+ LYFreePostData(&newdoc);
+ FREE(newdoc.bookmark);
+ newdoc.isHEAD = FALSE;
+ newdoc.safe = FALSE;
+ newdoc.internal_link = FALSE;
+ LYhighlight(FALSE, curdoc.link, prev_target->str);
+#ifdef DIRED_SUPPORT
+ if (lynx_edit_mode) {
+ DIRED_UNCACHE_2;
+ }
+#endif /* DIRED_SUPPORT */
+ }
+ } else {
+ if (*old_c != real_c) {
+ *old_c = real_c;
+ HTUserMsg(IN_MAIN_SCREEN);
+ }
+ }
+}
+
+static void handle_LYK_MINIMAL(void)
+{
+ if (!historical_comments) {
+#ifdef USE_SOURCE_CACHE
+ if (!HTcan_reparse_document()) {
+#endif
+ /*
+ * Check if this is a reply from a POST, and if so, seek
+ * confirmation of reload if the safe element is not set. - FM
+ */
+ if ((curdoc.post_data != NULL &&
+ curdoc.safe != TRUE) &&
+ confirm_post_resub(curdoc.address, NULL, 0, 0) == FALSE) {
+ HTInfoMsg(WILL_NOT_RELOAD_DOC);
+ } else {
+ HText_setNoCache(HTMainText);
+ move_address(&newdoc, &curdoc);
+ newdoc.line = curdoc.line;
+ newdoc.link = curdoc.link;
+ }
+#ifdef USE_SOURCE_CACHE
+ } /* end if no bypass */
+#endif
+ }
+ minimal_comments = (BOOLEAN) !minimal_comments;
+ if (!historical_comments) {
+ HTAlert(minimal_comments ?
+ MINIMAL_ON_IN_EFFECT : MINIMAL_OFF_VALID_ON);
+ } else {
+ HTAlert(minimal_comments ?
+ MINIMAL_ON_BUT_HISTORICAL : MINIMAL_OFF_HISTORICAL_ON);
+ }
+#ifdef USE_SOURCE_CACHE
+ (void) reparse_document();
+#endif
+ return;
+}
+
+#if defined(DIRED_SUPPORT)
+static void handle_LYK_MODIFY(BOOLEAN *refresh_screen)
+{
+ if (lynx_edit_mode && nlinks > 0 && !no_dired_support) {
+ int ret;
+
+ ret = local_modify(&curdoc, &newdoc.address);
+ if (ret == PERMIT_FORM_RESULT) { /* Permit form thrown up */
+ *refresh_screen = TRUE;
+ } else if (ret) {
+ DIRED_UNCACHE_1;
+ move_address(&newdoc, &curdoc);
+ LYFreePostData(&newdoc);
+ FREE(newdoc.bookmark);
+ newdoc.isHEAD = FALSE;
+ newdoc.safe = FALSE;
+ newdoc.internal_link = FALSE;
+ newdoc.line = curdoc.line;
+ newdoc.link = curdoc.link;
+ LYclear();
+ }
+ }
+}
+#endif /* DIRED_SUPPORT */
+
+#ifdef EXP_NESTED_TABLES
+static BOOLEAN handle_LYK_NESTED_TABLES(int *cmd)
+{
+ nested_tables = (BOOLEAN) !nested_tables;
+ HTUserMsg(nested_tables ? NESTED_TABLES_ON : NESTED_TABLES_OFF);
+ return reparse_or_reload(cmd);
+}
+#endif
+
+static BOOLEAN handle_LYK_OPTIONS(int *cmd,
+ BOOLEAN *refresh_screen)
+{
+#ifndef NO_OPTION_MENU
+ if (!LYUseFormsOptions) {
+ BOOLEAN LYUseDefaultRawMode_flag = LYUseDefaultRawMode;
+ BOOLEAN LYSelectPopups_flag = LYSelectPopups;
+ BOOLEAN verbose_img_flag = verbose_img;
+ BOOLEAN keypad_mode_flag = (BOOL) keypad_mode;
+ BOOLEAN show_dotfiles_flag = show_dotfiles;
+ BOOLEAN user_mode_flag = (BOOL) user_mode;
+ int CurrentAssumeCharSet_flag = UCLYhndl_for_unspec;
+ int CurrentCharSet_flag = current_char_set;
+ int HTfileSortMethod_flag = HTfileSortMethod;
+ char *CurrentUserAgent = NULL;
+ char *CurrentNegoLanguage = NULL;
+ char *CurrentNegoCharset = NULL;
+
+ StrAllocCopy(CurrentUserAgent, NonNull(LYUserAgent));
+ StrAllocCopy(CurrentNegoLanguage, NonNull(language));
+ StrAllocCopy(CurrentNegoCharset, NonNull(pref_charset));
+
+ LYoptions(); /** do the old-style options stuff **/
+
+ if (keypad_mode_flag != keypad_mode ||
+ (user_mode_flag != user_mode &&
+ (user_mode_flag == NOVICE_MODE ||
+ user_mode == NOVICE_MODE)) ||
+ (((HTfileSortMethod_flag != HTfileSortMethod) ||
+ (show_dotfiles_flag != show_dotfiles)) &&
+ (isFILE_URL(curdoc.address) ||
+ isFTP_URL(curdoc.address))) ||
+ CurrentCharSet_flag != current_char_set ||
+ CurrentAssumeCharSet_flag != UCLYhndl_for_unspec ||
+ verbose_img_flag != verbose_img ||
+ LYUseDefaultRawMode_flag != LYUseDefaultRawMode ||
+ LYSelectPopups_flag != LYSelectPopups ||
+ ((strcmp(CurrentUserAgent, NonNull(LYUserAgent)) ||
+ strcmp(CurrentNegoLanguage, NonNull(language)) ||
+ strcmp(CurrentNegoCharset, NonNull(pref_charset))) &&
+ (!StrNCmp(curdoc.address, "http", 4) ||
+ isLYNXCGI(curdoc.address)))) {
+
+ BOOLEAN canreparse_post = FALSE;
+
+ /*
+ * Check if this is a reply from a POST, and if so, seek
+ * confirmation of reload if the safe element is not set. - FM
+ */
+ if ((curdoc.post_data != NULL &&
+ curdoc.safe != TRUE) &&
+#ifdef USE_SOURCE_CACHE
+ (!(canreparse_post = HTcan_reparse_document())) &&
+#endif
+ confirm_post_resub(curdoc.address, curdoc.title,
+ 2, 1) == FALSE) {
+ HTInfoMsg(WILL_NOT_RELOAD_DOC);
+ } else {
+ copy_address(&newdoc, &curdoc);
+ if (((strcmp(CurrentUserAgent, NonNull(LYUserAgent)) ||
+ strcmp(CurrentNegoLanguage, NonNull(language)) ||
+ strcmp(CurrentNegoCharset, NonNull(pref_charset))) &&
+ (StrNCmp(curdoc.address, "http", 4) == 0 ||
+ isLYNXCGI(curdoc.address)))) {
+ /*
+ * An option has changed which may influence content
+ * negotiation, and the resource is from a http or https or
+ * lynxcgi URL (the only protocols which currently do
+ * anything with this information). Set reloading = TRUE
+ * so that proxy caches will be flushed, which is necessary
+ * until the time when all proxies understand HTTP 1.1
+ * Vary: and all Servers properly use it... Treat like
+ * case LYK_RELOAD (see comments there). - KW
+ */
+ reloading = TRUE;
+ }
+ if (HTisDocumentSource()) {
+ srcmode_for_next_retrieval(1);
+ }
+#ifdef USE_SOURCE_CACHE
+ if (reloading == FALSE) {
+ /* one more attempt to be smart enough: */
+ if (reparse_document()) {
+ FREE(CurrentUserAgent);
+ FREE(CurrentNegoLanguage);
+ FREE(CurrentNegoCharset);
+ return FALSE;
+ }
+ }
+#endif
+ if (canreparse_post &&
+ confirm_post_resub(curdoc.address, curdoc.title,
+ 2, 1) == FALSE) {
+ if (HTisDocumentSource()) {
+ srcmode_for_next_retrieval(0);
+ }
+ FREE(CurrentUserAgent);
+ FREE(CurrentNegoLanguage);
+ FREE(CurrentNegoCharset);
+ return FALSE;
+ }
+
+ HEAD_request = HTLoadedDocumentIsHEAD();
+ HText_setNoCache(HTMainText);
+ newdoc.line = curdoc.line;
+ newdoc.link = curdoc.link;
+ LYforce_no_cache = TRUE;
+ free_address(&curdoc); /* So it doesn't get pushed. */
+ }
+ }
+ FREE(CurrentUserAgent);
+ FREE(CurrentNegoLanguage);
+ FREE(CurrentNegoCharset);
+ *refresh_screen = TRUE; /* to repaint screen */
+ return FALSE;
+ } /* end if !LYUseFormsOptions */
+#else
+ (void) refresh_screen;
+#endif /* !NO_OPTION_MENU */
+#ifndef NO_OPTION_FORMS
+ /*
+ * Generally stolen from LYK_COOKIE_JAR. Options menu handling is
+ * done in postoptions(), called from getfile() currently.
+ *
+ * postoptions() is also responsible for reloading the document
+ * before the 'options menu' but only when (a few) important
+ * options were changed.
+ *
+ * It is critical that post_data is freed here since the
+ * submission of changed options is done via the same protocol as
+ * LYNXOPTIONS:
+ */
+ /*
+ * Don't do if already viewing options page.
+ */
+ if (!LYIsUIPage(curdoc.address, UIP_OPTIONS_MENU)) {
+
+ set_address(&newdoc, LYNXOPTIONS_PAGE("/"));
+ LYFreePostData(&newdoc);
+ FREE(newdoc.bookmark);
+ newdoc.isHEAD = FALSE;
+ newdoc.safe = FALSE;
+ newdoc.internal_link = FALSE;
+ LYforce_no_cache = TRUE;
+ /* change to 'if (check_realm && !LYValidate)' and
+ make change near top of getfile to forbid
+ using forms options menu with -validate: - kw */
+ if (LYValidate || check_realm) {
+ LYPermitURL = TRUE;
+ }
+ } else {
+ /*
+ * If already in the options menu, get out.
+ */
+ *cmd = LYK_PREV_DOC;
+ return TRUE;
+ }
+#else
+ (void) cmd;
+#endif /* !NO_OPTION_FORMS */
+ return FALSE;
+}
+
+static void handle_NEXT_DOC(void)
+{
+ if (LYhist_next(&curdoc, &newdoc)) {
+ free_address(&curdoc); /* avoid push */
+ return;
+ }
+ HTUserMsg(gettext("No next document present"));
+}
+
+static void handle_LYK_NEXT_LINK(int c,
+ int *old_c,
+ int real_c)
+{
+ if (curdoc.link < nlinks - 1) { /* next link */
+ LYhighlight(FALSE, curdoc.link, prev_target->str);
+#ifdef FASTTAB
+ /*
+ * Move to different textarea if TAB in textarea.
+ */
+ if (LinkIsTextarea(curdoc.link) &&
+ c == '\t') {
+ int thisgroup = links[curdoc.link].l_form->number;
+ char *thisname = links[curdoc.link].l_form->name;
+
+ do
+ curdoc.link++;
+ while ((curdoc.link < nlinks - 1) &&
+ LinkIsTextarea(curdoc.link) &&
+ links[curdoc.link].l_form->number == thisgroup &&
+ sametext(links[curdoc.link].l_form->name, thisname));
+ } else {
+ curdoc.link++;
+ }
+#else
+ curdoc.link++;
+#endif /* FASTTAB */
+ /*
+ * At the bottom of list and there is only one page. Move to the top
+ * link on the page.
+ */
+ } else if (!more_text && LYGetNewline() == 1 && curdoc.link == nlinks - 1) {
+ set_curdoc_link(0);
+
+ } else if (more_text) { /* next page */
+ LYChgNewline(display_lines);
+ } else if (*old_c != real_c) {
+ HandleForwardWraparound();
+ }
+}
+
+static void handle_LYK_NEXT_PAGE(int *old_c,
+ int real_c)
+{
+ if (more_text) {
+ LYChgNewline(display_lines);
+ } else if (curdoc.link < nlinks - 1) {
+ set_curdoc_link(nlinks - 1);
+ } else if (*old_c != real_c) {
+ *old_c = real_c;
+ HTInfoMsg(ALREADY_AT_END);
+ }
+}
+
+static BOOLEAN handle_LYK_NOCACHE(int *old_c,
+ int real_c)
+{
+ if (nlinks > 0) {
+ if (links[curdoc.link].type == WWW_FORM_LINK_TYPE &&
+ links[curdoc.link].l_form->type != F_SUBMIT_TYPE &&
+ links[curdoc.link].l_form->type != F_IMAGE_SUBMIT_TYPE &&
+ links[curdoc.link].l_form->type != F_TEXT_SUBMIT_TYPE) {
+ if (*old_c != real_c) {
+ *old_c = real_c;
+ HTUserMsg(NOT_ON_SUBMIT_OR_LINK);
+ }
+ return FALSE;
+ } else {
+ LYforce_no_cache = TRUE;
+ reloading = TRUE;
+ }
+ }
+ return TRUE;
+}
+
+static void handle_LYK_PREV_LINK(int *arrowup,
+ int *old_c,
+ int real_c)
+{
+ if (curdoc.link > 0) { /* previous link */
+ set_curdoc_link(curdoc.link - 1);
+
+ } else if (!more_text &&
+ curdoc.link == 0 && LYGetNewline() == 1) { /* at the top of list */
+ /*
+ * If there is only one page of data and the user goes off the top,
+ * just move the cursor to last link on the page.
+ */
+ set_curdoc_link(nlinks - 1);
+
+ } else if (curdoc.line > 1) { /* previous page */
+ /*
+ * Go back to the previous page.
+ */
+ int scrollamount = (LYGetNewline() > display_lines
+ ? display_lines
+ : LYGetNewline() - 1);
+
+ LYChgNewline(-scrollamount);
+ if (scrollamount < display_lines &&
+ nlinks > 0 && curdoc.link == 0 &&
+ links[0].ly - 1 + scrollamount <= display_lines) {
+ newdoc.link = HText_LinksInLines(HTMainText,
+ 1,
+ scrollamount) - 1;
+ } else {
+ *arrowup = TRUE;
+ }
+
+ } else if (*old_c != real_c) {
+ HandleReverseWraparound();
+ }
+}
+
+#define nhist_1 (nhist - 1) /* workaround for indent */
+
+static int handle_PREV_DOC(int *cmd,
+ int *old_c,
+ int real_c)
+{
+ if (nhist > 0) { /* if there is anything to go back to */
+ /*
+ * Check if the previous document is a reply from a POST, and if so,
+ * seek confirmation of resubmission if the safe element is not set and
+ * the document is not still in the cache or LYresubmit_posts is set.
+ * If not confirmed and it is not the startfile, pop it so we go to the
+ * yet previous document, until we're OK or reach the startfile. If we
+ * reach the startfile and its not OK or we don't get confirmation,
+ * cancel. - FM
+ */
+ DocAddress WWWDoc;
+ HTParentAnchor *tmpanchor;
+ BOOLEAN conf = FALSE, first = TRUE;
+
+ HTLastConfirmCancelled(); /* reset flag */
+ while (nhist > 0) {
+ conf = FALSE;
+ if (HDOC(nhist_1).post_data == NULL) {
+ break;
+ }
+ WWWDoc.address = HDOC(nhist_1).address;
+ WWWDoc.post_data = HDOC(nhist_1).post_data;
+ WWWDoc.post_content_type =
+ HDOC(nhist_1).post_content_type;
+ WWWDoc.bookmark = HDOC(nhist_1).bookmark;
+ WWWDoc.isHEAD = HDOC(nhist_1).isHEAD;
+ WWWDoc.safe = HDOC(nhist_1).safe;
+ tmpanchor = HTAnchor_findAddress(&WWWDoc);
+ if (HTAnchor_safe(tmpanchor)) {
+ break;
+ }
+ if ((HTAnchor_document(tmpanchor) == NULL &&
+ (isLYNXIMGMAP(WWWDoc.address) ||
+ (conf = confirm_post_resub(WWWDoc.address,
+ HDOC(nhist_1).title,
+ 0, 0))
+ == FALSE)) ||
+ ((LYresubmit_posts && !conf &&
+ (NONINTERNAL_OR_PHYS_DIFFERENT((DocInfo *) &history[(nhist_1)],
+ &curdoc) ||
+ NONINTERNAL_OR_PHYS_DIFFERENT((DocInfo *) &history[(nhist_1)],
+ &newdoc))) &&
+ !confirm_post_resub(WWWDoc.address,
+ HDOC(nhist_1).title,
+ 2, 2))) {
+ if (HTLastConfirmCancelled()) {
+ if (!first && curdoc.internal_link)
+ free_address(&curdoc);
+ *cmd = LYK_DO_NOTHING;
+ return 2;
+ }
+ if (nhist == 1) {
+ HTInfoMsg(CANCELLED);
+ *old_c = 0;
+ *cmd = LYK_DO_NOTHING;
+ return 2;
+ } else {
+ HTUserMsg2(WWW_SKIP_MESSAGE, WWWDoc.address);
+ do { /* Should be LYhist_prev when _next supports */
+ LYpop(&curdoc); /* skipping of forms */
+ } while (nhist > 1
+ && !are_different((DocInfo *) &history[nhist_1],
+ &curdoc));
+ first = FALSE; /* have popped at least one */
+ continue;
+ }
+ } else {
+ /*
+ * Break from loop; if user just confirmed to load again
+ * because document wasn't in cache, set LYforce_no_cache to
+ * avoid unnecessary repeat question down the road. - kw
+ */
+ if (conf)
+ LYforce_no_cache = TRUE;
+ break;
+ }
+ }
+
+ if (!first)
+ curdoc.internal_link = FALSE;
+
+ /*
+ * Set newdoc.address to empty to pop a file.
+ */
+ LYhist_prev_register(&curdoc); /* Why not call _prev instead of zeroing address? */
+ free_address(&newdoc);
+#ifdef DIRED_SUPPORT
+ if (lynx_edit_mode) {
+ DIRED_UNCACHE_2;
+ }
+#endif /* DIRED_SUPPORT */
+ } else if (child_lynx == TRUE) {
+ return (1); /* exit on left arrow in main screen */
+
+ } else if (*old_c != real_c) {
+ *old_c = real_c;
+ HTUserMsg(ALREADY_AT_FIRST);
+ }
+ return 0;
+}
+
+static void handle_LYK_PREV_PAGE(int *old_c,
+ int real_c)
+{
+ if (LYGetNewline() > 1) {
+ LYChgNewline(-display_lines);
+ } else if (curdoc.link > 0) {
+ set_curdoc_link(0);
+ } else if (*old_c != real_c) {
+ *old_c = real_c;
+ HTInfoMsg(ALREADY_AT_BEGIN);
+ }
+}
+
+static void handle_LYK_PRINT(BOOLEAN *ForcePush,
+ int *old_c,
+ int real_c)
+{
+ if (LYValidate) {
+ if (*old_c != real_c) {
+ *old_c = real_c;
+ HTUserMsg(PRINT_DISABLED);
+ }
+ return;
+ }
+
+ /*
+ * Don't do if already viewing print options page.
+ */
+ if (!LYIsUIPage(curdoc.address, UIP_PRINT_OPTIONS)
+ && print_options(&newdoc.address,
+ curdoc.address, HText_getNumOfLines()) >= 0) {
+ LYRegisterUIPage(newdoc.address, UIP_PRINT_OPTIONS);
+ StrAllocCopy(newdoc.title, PRINT_OPTIONS_TITLE);
+ LYFreePostData(&newdoc);
+ FREE(newdoc.bookmark);
+ newdoc.isHEAD = FALSE;
+ newdoc.safe = FALSE;
+ *ForcePush = TRUE; /* see LYpush() and print_options() */
+ if (check_realm)
+ LYPermitURL = TRUE;
+ }
+}
+
+static BOOLEAN handle_LYK_QUIT(void)
+{
+ int c;
+
+ if (LYQuitDefaultYes == TRUE) {
+ c = HTConfirmDefault(REALLY_QUIT, YES);
+ } else {
+ c = HTConfirmDefault(REALLY_QUIT, NO);
+ }
+ if (LYQuitDefaultYes == TRUE) {
+ if (c != NO) {
+ return (TRUE);
+ } else {
+ HTInfoMsg(NO_CANCEL);
+ }
+ } else if (c == YES) {
+ return (TRUE);
+ } else {
+ HTInfoMsg(NO_CANCEL);
+ }
+ return FALSE;
+}
+
+static BOOLEAN handle_LYK_RAW_TOGGLE(int *cmd)
+{
+ if (HTLoadedDocumentCharset()) {
+ HTUserMsg(gettext("charset for this document specified explicitly, sorry..."));
+ return FALSE;
+ } else {
+ LYUseDefaultRawMode = (BOOL) !LYUseDefaultRawMode;
+ HTUserMsg(LYRawMode ? RAWMODE_OFF : RAWMODE_ON);
+ HTMLSetCharacterHandling(current_char_set);
+ return reparse_or_reload(cmd);
+ }
+}
+
+static void handle_LYK_RELOAD(int real_cmd)
+{
+ /*
+ * Check if this is a reply from a POST, and if so,
+ * seek confirmation if the safe element is not set. - FM
+ */
+ if ((curdoc.post_data != NULL &&
+ curdoc.safe != TRUE) &&
+ HTConfirm(CONFIRM_POST_RESUBMISSION) == FALSE) {
+ HTInfoMsg(CANCELLED);
+ return;
+ }
+
+ /*
+ * Check to see if should reload source, or load html
+ */
+
+ if (HTisDocumentSource()) {
+ if ((forced_UCLYhdnl = HTMainText_Get_UCLYhndl()) >= 0)
+ force_old_UCLYhndl_on_reload = TRUE;
+ srcmode_for_next_retrieval(1);
+ }
+
+ HEAD_request = HTLoadedDocumentIsHEAD();
+ HText_setNoCache(HTMainText);
+ /*
+ * Do assume the reloaded document will be the same. - FM
+ *
+ * (I don't remember all the reasons why we couldn't assume this. As the
+ * problems show up, we'll try to fix them, or add warnings. - FM)
+ */
+ newdoc.line = curdoc.line;
+ newdoc.link = curdoc.link;
+ free_address(&curdoc); /* so it doesn't get pushed */
+#ifdef VMS
+ lynx_force_repaint();
+#endif /* VMS */
+ /*
+ * Reload should force a cache refresh on a proxy. -- Ari L.
+ * <luotonen@dxcern.cern.ch>
+ *
+ * -- but only if this was really a reload requested by the user, not if we
+ * jumped here to handle reloading for INLINE_TOGGLE, IMAGE_TOGGLE,
+ * RAW_TOGGLE, etc. - KW
+ */
+ if (real_cmd == LYK_RELOAD)
+ reloading = REAL_RELOAD;
+
+ return;
+}
+
+#ifdef DIRED_SUPPORT
+static void handle_LYK_REMOVE(BOOLEAN *refresh_screen)
+{
+ if (lynx_edit_mode && nlinks > 0 && !no_dired_support) {
+ int linkno = curdoc.link; /* may be changed in local_remove - kw */
+
+ local_remove(&curdoc);
+ if (LYAutoUncacheDirLists >= 1)
+ do_cleanup_after_delete();
+ else if (curdoc.link != linkno)
+ *refresh_screen = TRUE;
+ }
+}
+#endif /* DIRED_SUPPORT */
+
+static void handle_LYK_RIGHT_LINK(void)
+{
+ if (curdoc.link < nlinks - 1 &&
+ links[curdoc.link].ly == links[curdoc.link + 1].ly) {
+ set_curdoc_link(curdoc.link + 1);
+ }
+}
+
+static void handle_LYK_SHELL(BOOLEAN *refresh_screen,
+ int *old_c,
+ int real_c)
+{
+ if (!no_shell) {
+ stop_curses();
+ printf("%s\r\n", SPAWNING_MSG);
+#if defined(__CYGWIN__)
+ /* handling "exec $SHELL" does not work if $SHELL is null */
+ if (LYGetEnv("SHELL") == NULL) {
+ Cygwin_Shell();
+ } else
+#endif
+ {
+ static char *shell = NULL;
+
+ if (shell == 0)
+ StrAllocCopy(shell, LYSysShell());
+ LYSystem(shell);
+ }
+ start_curses();
+ *refresh_screen = TRUE; /* for an HText_pageDisplay() */
+ } else {
+ if (*old_c != real_c) {
+ *old_c = real_c;
+ HTUserMsg(SPAWNING_DISABLED);
+ }
+ }
+}
+
+static void handle_LYK_SOFT_DQUOTES(void)
+{
+#ifdef USE_SOURCE_CACHE
+ if (!HTcan_reparse_document()) {
+#endif
+ /*
+ * Check if this is a reply from a POST, and if so, seek confirmation
+ * of reload if the safe element is not set. - FM
+ */
+ if ((curdoc.post_data != NULL &&
+ curdoc.safe != TRUE) &&
+ confirm_post_resub(curdoc.address, NULL, 1, 1) == FALSE) {
+ HTInfoMsg(WILL_NOT_RELOAD_DOC);
+ } else {
+ HText_setNoCache(HTMainText);
+ move_address(&newdoc, &curdoc);
+ newdoc.line = curdoc.line;
+ newdoc.link = curdoc.link;
+ }
+#ifdef USE_SOURCE_CACHE
+ } /* end if no bypass */
+#endif
+ soft_dquotes = (BOOLEAN) !soft_dquotes;
+ HTUserMsg(soft_dquotes ?
+ SOFT_DOUBLE_QUOTE_ON : SOFT_DOUBLE_QUOTE_OFF);
+#ifdef USE_SOURCE_CACHE
+ (void) reparse_document();
+#endif
+ return;
+}
+
+#define GetAnchorNumber(link) \
+ ((nlinks > 0 && link >= 0) \
+ ? links[link].anchor_number \
+ : -1)
+#define GetAnchorLineNo(link) \
+ ((nlinks > 0 && link >= 0) \
+ ? links[link].anchor_line_num \
+ : -1)
+
+/*
+ * Adjust the top-of-screen line number for the new document if the redisplayed
+ * screen would not show the given link-number.
+ */
+#ifdef USE_SOURCE_CACHE
+static int wrap_reparse_document(void)
+{
+ int result;
+ int anchor_number = GetAnchorNumber(curdoc.link);
+ int old_line_num = HText_getAbsLineNumber(HTMainText, anchor_number);
+ int old_from_top = old_line_num - LYGetNewline() + 1;
+
+ /* get the offset for the current anchor */
+ int old_offset = ((nlinks > 0 && curdoc.link >= 0)
+ ? links[curdoc.link].sgml_offset
+ : -1);
+
+ CTRACE((tfp, "original anchor %d, topline %d, link %d, offset %d\n",
+ anchor_number, old_line_num, curdoc.link, old_offset));
+
+ /* reparse the document (producing a new anchor list) */
+ result = reparse_document();
+
+ /* readjust top-line and link-number */
+ if (result && old_offset >= 0) {
+ int new_anchor = HText_closestAnchor(HTMainText, old_offset);
+ int new_lineno = HText_getAbsLineNumber(HTMainText, new_anchor);
+ int top_lineno;
+
+ CTRACE((tfp, "old anchor %d -> new anchor %d\n", anchor_number, new_anchor));
+
+ if (new_lineno - old_from_top < 0)
+ old_from_top = new_lineno;
+
+ /* Newline and newdoc.line are 1-based,
+ * but 0-based lines are simpler to work with.
+ */
+ top_lineno = HText_getPreferredTopLine(HTMainText, new_lineno -
+ old_from_top) + 1;
+ CTRACE((tfp, "preferred top %d\n", top_lineno));
+
+ if (top_lineno != LYGetNewline()) {
+ LYSetNewline(top_lineno);
+ newdoc.link = HText_anchorRelativeTo(HTMainText, top_lineno - 1, new_anchor);
+ curdoc.link = newdoc.link;
+ CTRACE((tfp,
+ "adjusted anchor %d, topline %d, link %d, offset %d\n",
+ new_anchor,
+ top_lineno,
+ curdoc.link,
+ HText_locateAnchor(HTMainText, new_anchor)));
+ } else {
+ newdoc.link = curdoc.link;
+ }
+ }
+ return result;
+}
+#endif /* USE_SOURCE_CACHE */
+
+static void handle_LYK_SOURCE(char **ownerS_address_p)
+{
+#ifdef USE_SOURCE_CACHE
+ BOOLEAN canreparse_post = FALSE;
+#endif
+
+ /*
+ * Check if this is a reply from a POST, and if so,
+ * seek confirmation if the safe element is not set. - FM
+ */
+ if ((curdoc.post_data != NULL &&
+ curdoc.safe != TRUE) &&
+#ifdef USE_SOURCE_CACHE
+ (!(canreparse_post = HTcan_reparse_document())) &&
+#endif
+ (curdoc.isHEAD ? HTConfirm(CONFIRM_POST_RESUBMISSION) :
+ confirm_post_resub(curdoc.address, curdoc.title, 1, 1)) == FALSE) {
+ HTInfoMsg(CANCELLED);
+ return;
+ }
+
+ if (HTisDocumentSource()) {
+ srcmode_for_next_retrieval(-1);
+ } else {
+ if (HText_getOwner())
+ StrAllocCopy(*ownerS_address_p, HText_getOwner());
+ LYUCPushAssumed(HTMainAnchor);
+ srcmode_for_next_retrieval(1);
+ }
+
+#ifdef USE_SOURCE_CACHE
+ if (wrap_reparse_document()) {
+ /*
+ * These normally get cleaned up after getfile() returns;
+ * since we're not calling getfile(), we have to clean them
+ * up ourselves. -dsb
+ */
+ HTOutputFormat = WWW_PRESENT;
+#ifdef USE_PRETTYSRC
+ if (psrc_view)
+ HTMark_asSource();
+ psrc_view = FALSE;
+#endif
+ FREE(*ownerS_address_p); /* not used with source_cache */
+ LYUCPopAssumed(); /* probably a right place here */
+ HTMLSetCharacterHandling(current_char_set); /* restore now */
+
+ return;
+ } else if (canreparse_post) {
+ srcmode_for_next_retrieval(0);
+ LYUCPopAssumed(); /* probably a right place here */
+ return;
+ }
+#endif
+
+ if (curdoc.title)
+ StrAllocCopy(newdoc.title, curdoc.title);
+
+ free_address(&curdoc); /* so it doesn't get pushed */
+ LYforce_no_cache = TRUE;
+}
+
+static void handle_LYK_SWITCH_DTD(void)
+{
+#ifdef USE_SOURCE_CACHE
+ BOOLEAN canreparse = FALSE;
+
+ if (!(canreparse = HTcan_reparse_document())) {
+#endif
+ /*
+ * Check if this is a reply from a POST, and if so,
+ * seek confirmation of reload if the safe element
+ * is not set. - FM, kw
+ */
+ if ((curdoc.post_data != NULL &&
+ curdoc.safe != TRUE) &&
+ confirm_post_resub(curdoc.address, NULL, 1, 1) == FALSE) {
+ HTInfoMsg(WILL_NOT_RELOAD_DOC);
+ } else {
+ /*
+ * If currently viewing preparsed source, switching to the other
+ * DTD parsing may show source differences, so stay in source view
+ * - kw
+ */
+
+ /* NOTE: this conditional can be considered incorrect -
+ current behaviour - when viewing source and
+ LYPreparsedSource==TRUE, pressing ^V will toggle parser mode
+ AND switch back from the source view to presentation view.-HV
+ */
+ if (HTisDocumentSource() && LYPreparsedSource) {
+ srcmode_for_next_retrieval(1);
+ }
+ HText_setNoCache(HTMainText);
+ move_address(&newdoc, &curdoc);
+ newdoc.line = curdoc.line;
+ newdoc.link = curdoc.link;
+ }
+#ifdef USE_SOURCE_CACHE
+ } /* end if no bypass */
+#endif
+ Old_DTD = !Old_DTD;
+ HTSwitchDTD(!Old_DTD);
+ HTUserMsg(Old_DTD ? USING_DTD_0 : USING_DTD_1);
+#ifdef USE_SOURCE_CACHE
+ if (canreparse) {
+ if (HTisDocumentSource() && LYPreparsedSource) {
+ srcmode_for_next_retrieval(1);
+ }
+ if (!reparse_document()) {
+ srcmode_for_next_retrieval(0);
+ }
+ }
+#endif
+ return;
+}
+
+#ifdef DIRED_SUPPORT
+static void handle_LYK_TAG_LINK(void)
+{
+ if (lynx_edit_mode && nlinks > 0 && !no_dired_support) {
+ if (!strcmp(LYGetHiliteStr(curdoc.link, 0), ".."))
+ return; /* Never tag the parent directory */
+ if (dir_list_style == MIXED_STYLE) {
+ if (!strcmp(LYGetHiliteStr(curdoc.link, 0), "../"))
+ return;
+ } else if (!StrNCmp(LYGetHiliteStr(curdoc.link, 0), "Up to ", 6))
+ return;
+ {
+ /*
+ * HTList-based management of tag list, see LYLocal.c - KW
+ */
+ HTList *t1 = tagged;
+ char *tagname = NULL;
+ BOOLEAN found = FALSE;
+
+ while ((tagname = (char *) HTList_nextObject(t1)) != NULL) {
+ if (!strcmp(links[curdoc.link].lname, tagname)) {
+ found = TRUE;
+ HTList_removeObject(tagged, tagname);
+ FREE(tagname);
+ tagflag(FALSE, curdoc.link);
+ break;
+ }
+ }
+ if (!found) {
+ if (tagged == NULL)
+ tagged = HTList_new();
+ tagname = NULL;
+ StrAllocCopy(tagname, links[curdoc.link].lname);
+ HTList_addObject(tagged, tagname);
+ tagflag(TRUE, curdoc.link);
+ }
+ }
+ if (curdoc.link < nlinks - 1) {
+ set_curdoc_link(curdoc.link + 1);
+ } else if (!more_text && LYGetNewline() == 1 && curdoc.link == nlinks
+ - 1) {
+ set_curdoc_link(0);
+ } else if (more_text) { /* next page */
+ LYChgNewline(display_lines);
+ }
+ }
+}
+#endif /* DIRED_SUPPORT */
+
+static void handle_LYK_TOGGLE_HELP(void)
+{
+ if (user_mode == NOVICE_MODE) {
+ toggle_novice_line();
+ noviceline(more_text);
+ }
+}
+
+static void handle_LYK_TOOLBAR(BOOLEAN *try_internal,
+ BOOLEAN *force_load,
+ int *old_c,
+ int real_c)
+{
+ char *cp;
+ char *toolbar = NULL;
+
+ if (!HText_hasToolbar(HTMainText)) {
+ if (*old_c != real_c) {
+ *old_c = real_c;
+ HTUserMsg(NO_TOOLBAR);
+ }
+ } else if (*old_c != real_c) {
+ *old_c = real_c;
+ cp = trimPoundSelector(curdoc.address);
+ HTSprintf0(&toolbar, "%s#%s", curdoc.address, LYToolbarName);
+ restorePoundSelector(cp);
+ set_address(&newdoc, toolbar);
+ FREE(toolbar);
+ *try_internal = TRUE;
+ *force_load = TRUE; /* force MainLoop to reload */
+ }
+}
+
+static void handle_LYK_TRACE_LOG(BOOLEAN *trace_flag_ptr)
+{
+#ifndef NO_LYNX_TRACE
+ /*
+ * Check whether we've started a TRACE log in this session. - FM
+ */
+ if (LYTraceLogFP == NULL) {
+ HTUserMsg(NO_TRACELOG_STARTED);
+ return;
+ }
+
+ /*
+ * Don't do if already viewing the TRACE log. - FM
+ */
+ if (LYIsUIPage(curdoc.address, UIP_TRACELOG))
+ return;
+
+ /*
+ * If TRACE mode is on, turn it off during this fetch of the TRACE log, so
+ * we don't enter stuff about this fetch, and set a flag for turning it
+ * back on when we return to this loop. Note that we'll miss any messages
+ * about memory exhaustion if it should occur. It seems unlikely that
+ * anything else bad might happen, but if it does, we'll miss messages
+ * about that too. We also fflush(), close, and open it again, to make
+ * sure all stderr messages thus far will be in the log. - FM
+ */
+ if (!LYReopenTracelog(trace_flag_ptr))
+ return;
+
+ LYLocalFileToURL(&(newdoc.address), LYTraceLogPath);
+ LYRegisterUIPage(newdoc.address, UIP_TRACELOG);
+ StrAllocCopy(newdoc.title, LYNX_TRACELOG_TITLE);
+ LYFreePostData(&newdoc);
+ FREE(newdoc.bookmark);
+ newdoc.isHEAD = FALSE;
+ newdoc.safe = FALSE;
+ newdoc.internal_link = FALSE;
+ if (LYValidate || check_realm) {
+ LYPermitURL = TRUE;
+ }
+ LYforce_no_cache = TRUE;
+#else
+ HTUserMsg(TRACE_DISABLED);
+#endif /* NO_LYNX_TRACE */
+}
+
+#ifdef DIRED_SUPPORT
+static void handle_LYK_UPLOAD(void)
+{
+ /*
+ * Don't do if already viewing upload options page.
+ */
+ if (LYIsUIPage(curdoc.address, UIP_UPLOAD_OPTIONS))
+ return;
+
+ if (lynx_edit_mode && !no_dired_support) {
+ LYUpload_options(&(newdoc.address), curdoc.address);
+ StrAllocCopy(newdoc.title, UPLOAD_OPTIONS_TITLE);
+ LYFreePostData(&newdoc);
+ FREE(newdoc.bookmark);
+ newdoc.isHEAD = FALSE;
+ newdoc.safe = FALSE;
+ newdoc.internal_link = FALSE;
+ /*
+ * Uncache the current listing so that it will be updated to included
+ * the uploaded file if placed in the current directory. - FM
+ */
+ DIRED_UNCACHE_1;
+ }
+}
+#endif /* DIRED_SUPPORT */
+
+static void handle_LYK_UP_xxx(int *arrowup,
+ int *old_c,
+ int real_c,
+ int scroll_by)
+{
+ if (LYGetNewline() > 1) {
+ if (LYGetNewline() - scroll_by < 1)
+ scroll_by = LYGetNewline() - 1;
+ LYChgNewline(-scroll_by);
+ if (nlinks > 0 && curdoc.link > -1) {
+ if (links[curdoc.link].ly + scroll_by <= display_lines) {
+ newdoc.link = curdoc.link +
+ HText_LinksInLines(HTMainText,
+ LYGetNewline(),
+ scroll_by);
+ } else {
+ *arrowup = TRUE;
+ }
+ }
+ } else if (*old_c != real_c) {
+ HandleReverseWraparound();
+ }
+}
+
+static void handle_LYK_UP_HALF(int *arrowup,
+ int *old_c,
+ int real_c)
+{
+ handle_LYK_UP_xxx(arrowup, old_c, real_c, display_lines / 2);
+}
+
+static void handle_LYK_UP_LINK(int *follow_col,
+ int *arrowup,
+ int *old_c,
+ int real_c)
+{
+ if (curdoc.link > 0 &&
+ (links[0].ly != links[curdoc.link].ly ||
+ !HText_LinksInLines(HTMainText, 1, LYGetNewline() - 1))) {
+ /* more links before this on screen, and first of them on
+ a different line or no previous links before this screen? */
+ int newlink;
+
+ if (*follow_col == -1) {
+ const char *text = LYGetHiliteStr(curdoc.link, 0);
+
+ *follow_col = links[curdoc.link].lx;
+
+ if (text != NULL)
+ *follow_col += (int) strlen(text) / 2;
+ }
+
+ newlink = find_link_near_col(*follow_col, -1);
+ if (newlink > -1) {
+ set_curdoc_link(newlink);
+ } else if (*old_c != real_c) {
+ *old_c = real_c;
+ HTUserMsg(NO_LINKS_ABOVE);
+ }
+
+ } else if (curdoc.line > 1 && LYGetNewline() > 1) { /* previous page */
+ int scrollamount = (LYGetNewline() > display_lines
+ ? display_lines
+ : LYGetNewline() - 1);
+
+ LYChgNewline(-scrollamount);
+ if (scrollamount < display_lines &&
+ nlinks > 0 && curdoc.link > -1 &&
+ links[0].ly - 1 + scrollamount <= display_lines) {
+ newdoc.link = HText_LinksInLines(HTMainText,
+ 1,
+ scrollamount) - 1;
+ } else {
+ *arrowup = TRUE;
+ }
+
+ } else if (*old_c != real_c) {
+ HandleReverseWraparound();
+ }
+}
+
+static void handle_LYK_UP_TWO(int *arrowup,
+ int *old_c,
+ int real_c)
+{
+ handle_LYK_UP_xxx(arrowup, old_c, real_c, 2);
+}
+
+static void handle_LYK_VIEW_BOOKMARK(BOOLEAN *refresh_screen,
+ int *old_c,
+ int real_c)
+{
+ const char *cp;
+
+ if (LYValidate) {
+ if (*old_c != real_c) {
+ *old_c = real_c;
+ HTUserMsg(BOOKMARKS_DISABLED);
+ }
+ return;
+ }
+
+ /*
+ * See if a bookmark exists. If it does replace newdoc.address with its
+ * name.
+ */
+ if ((cp = get_bookmark_filename(&newdoc.address)) != NULL) {
+ if (*cp == '\0' || !strcmp(cp, " ") ||
+ !strcmp(curdoc.address, newdoc.address)) {
+ if (LYMultiBookmarks != MBM_OFF)
+ *refresh_screen = TRUE;
+ return;
+ }
+#ifdef KANJI_CODE_OVERRIDE
+ if (HTCJK == JAPANESE) {
+ last_kcode = NOKANJI; /* AUTO */
+ }
+#endif
+ LYforce_no_cache = TRUE; /*force the document to be reloaded */
+ StrAllocCopy(newdoc.title, BOOKMARK_TITLE);
+ StrAllocCopy(newdoc.bookmark, BookmarkPage);
+ LYFreePostData(&newdoc);
+ newdoc.isHEAD = FALSE;
+ newdoc.safe = FALSE;
+ newdoc.internal_link = FALSE;
+ } else {
+ if (*old_c != real_c) {
+ *old_c = real_c;
+ LYMBM_statusline(BOOKMARKS_NOT_OPEN);
+ LYSleepAlert();
+ if (LYMultiBookmarks != MBM_OFF) {
+ *refresh_screen = TRUE;
+ }
+ }
+ }
+}
+
+static BOOLEAN handle_LYK_VLINKS(int *cmd,
+ BOOLEAN *newdoc_link_is_absolute)
+{
+ int c;
+
+ if (LYIsUIPage(curdoc.address, UIP_VLINKS)) {
+ /*
+ * Already viewing visited links page, so get out.
+ */
+ *cmd = LYK_PREV_DOC;
+ return TRUE;
+ }
+
+ /*
+ * Print visited links page to file.
+ */
+ c = LYShowVisitedLinks(&newdoc.address);
+ if (c < 0) {
+ HTUserMsg(VISITED_LINKS_EMPTY);
+ return FALSE;
+ }
+ StrAllocCopy(newdoc.title, VISITED_LINKS_TITLE);
+ LYFreePostData(&newdoc);
+ FREE(newdoc.bookmark);
+ newdoc.isHEAD = FALSE;
+ newdoc.safe = FALSE;
+ newdoc.internal_link = FALSE;
+ if (c > 0) {
+ /* Select a correct link. */
+ *newdoc_link_is_absolute = TRUE;
+ newdoc.link = c - 1;
+ }
+ if (LYValidate || check_realm) {
+ LYPermitURL = TRUE;
+ StrAllocCopy(lynxlinksfile, newdoc.address);
+ }
+ return FALSE;
+}
+
+void handle_LYK_WHEREIS(int cmd,
+ BOOLEAN *refresh_screen)
+{
+ BOOLEAN have_target_onscreen = (BOOLEAN) (!isBEmpty(prev_target) &&
+ HText_pageHasPrevTarget());
+ BOOL found;
+ int oldcur = curdoc.link; /* temporarily remember */
+ char *remember_old_target = NULL;
+
+ if (have_target_onscreen)
+ StrAllocCopy(remember_old_target, prev_target->str);
+ else
+ StrAllocCopy(remember_old_target, "");
+
+ if (cmd == LYK_WHEREIS) {
+ /*
+ * Reset prev_target to force prompting for a new search string and to
+ * turn off highlighting if no search string is entered by the user.
+ */
+ BStrCopy0(prev_target, "");
+ }
+ found = textsearch(&curdoc, &prev_target,
+ (cmd == LYK_WHEREIS)
+ ? 0
+ : ((cmd == LYK_NEXT)
+ ? 1
+ : -1));
+
+ /*
+ * Force a redraw to ensure highlighting of hits even when found on the
+ * same page, or clearing of highlighting if the default search string was
+ * erased without replacement. - FM
+ */
+ /*
+ * Well let's try to avoid it at least in a few cases
+ * where it is not needed. - kw
+ */
+ if (www_search_result >= 0 && www_search_result != curdoc.line) {
+ *refresh_screen = TRUE; /* doesn't really matter */
+ } else if (!found) {
+ *refresh_screen = have_target_onscreen;
+ } else if (!have_target_onscreen && found) {
+ *refresh_screen = TRUE;
+ } else if (www_search_result == curdoc.line &&
+ curdoc.link == oldcur &&
+ curdoc.link >= 0 && nlinks > 0 &&
+ links[curdoc.link].ly >= (display_lines / 3)) {
+ *refresh_screen = TRUE;
+ } else if ((LYcase_sensitive && 0 != strcmp(prev_target->str,
+ remember_old_target)) ||
+ (!LYcase_sensitive && 0 != strcasecomp8(prev_target->str,
+ remember_old_target))) {
+ *refresh_screen = TRUE;
+ }
+ FREE(remember_old_target);
+}
+
+/*
+ * Get a number from the user and follow that link number.
+ */
+static void handle_LYK_digit(int c,
+ BOOLEAN *force_load,
+ int *old_c,
+ int real_c,
+ BOOLEAN *try_internal GCC_UNUSED)
+{
+ int lindx = ((nlinks > 0) ? curdoc.link : 0);
+ int number;
+ char *temp = NULL;
+
+ /* pass cur line num for use in follow_link_number()
+ * Note: Current line may not equal links[cur].line
+ */
+ number = curdoc.line;
+ switch (follow_link_number(c, lindx, &newdoc, &number)) {
+ case DO_LINK_STUFF:
+ /*
+ * Follow a normal link.
+ */
+ set_address(&newdoc, links[lindx].lname);
+ StrAllocCopy(newdoc.title, LYGetHiliteStr(lindx, 0));
+ /*
+ * For internal links, retain POST content if present. If we are on
+ * the List Page, prevent pushing it on the history stack. Otherwise
+ * set try_internal to signal that the top of the loop should attempt
+ * to reposition directly, without calling getfile. - kw
+ */
+ if (track_internal_links) {
+ if (links[lindx].type == WWW_INTERN_LINK_TYPE) {
+ LYinternal_flag = TRUE;
+ newdoc.internal_link = TRUE;
+ if (LYIsListpageTitle(NonNull(curdoc.title)) &&
+ (LYIsUIPage(curdoc.address, UIP_LIST_PAGE) ||
+ LYIsUIPage(curdoc.address, UIP_ADDRLIST_PAGE))) {
+ if (check_history()) {
+ LYinternal_flag = TRUE;
+ } else {
+ HTLastConfirmCancelled(); /* reset flag */
+ if (!confirm_post_resub(newdoc.address,
+ newdoc.title,
+ ((LYresubmit_posts &&
+ HText_POSTReplyLoaded(&newdoc))
+ ? 1
+ : 2),
+ 2)) {
+ if (HTLastConfirmCancelled() ||
+ (LYresubmit_posts &&
+ !HText_POSTReplyLoaded(&newdoc))) {
+ /* cancel the whole thing */
+ LYforce_no_cache = FALSE;
+ reloading = FALSE;
+ copy_address(&newdoc, &curdoc);
+ StrAllocCopy(newdoc.title, curdoc.title);
+ newdoc.internal_link = curdoc.internal_link;
+ HTInfoMsg(CANCELLED);
+ if (nlinks > 0)
+ HText_pageDisplay(curdoc.line, prev_target->str);
+ break;
+ } else if (LYresubmit_posts) {
+ /* If LYresubmit_posts is set, and the
+ answer was No, and we have a cached
+ copy, then use it. - kw */
+ LYforce_no_cache = FALSE;
+ } else {
+ /* if No, but not ^C or ^G, drop
+ * the post data. Maybe the link
+ * wasn't meant to be internal after
+ * all, here we can recover from that
+ * assumption. - kw */
+ LYFreePostData(&newdoc);
+ newdoc.internal_link = FALSE;
+ HTAlert(DISCARDING_POST_DATA);
+ }
+ }
+ }
+ /*
+ * Don't push the List Page if we follow an internal link given
+ * by it. - kw
+ */
+ free_address(&curdoc);
+ } else
+ *try_internal = TRUE;
+ if (!(LYresubmit_posts && newdoc.post_data))
+ LYinternal_flag = TRUE;
+ *force_load = TRUE;
+ break;
+ } else {
+ /*
+ * Free POST content if not an internal link. - kw
+ */
+ LYFreePostData(&newdoc);
+ }
+ }
+ /*
+ * Might be an anchor in the same doc from a POST form. If so, don't
+ * free the content. -- FM
+ */
+ if (are_different(&curdoc, &newdoc)) {
+ LYFreePostData(&newdoc);
+ FREE(newdoc.bookmark);
+ newdoc.isHEAD = FALSE;
+ newdoc.safe = FALSE;
+ if (isLYNXMESSAGES(newdoc.address))
+ LYforce_no_cache = TRUE;
+ }
+ newdoc.internal_link = FALSE;
+ *force_load = TRUE; /* force MainLoop to reload */
+ break;
+
+ case DO_GOTOLINK_STUFF:
+ /*
+ * Position on a normal link, don't follow it. - KW
+ */
+ LYSetNewline(newdoc.line);
+ newdoc.line = 1;
+ if (LYGetNewline() == curdoc.line) {
+ /*
+ * It's a link in the current page. - FM
+ */
+ if (nlinks > 0 && curdoc.link > -1) {
+ if (curdoc.link == newdoc.link) {
+ /*
+ * It's the current link, and presumably reflects a typo in
+ * the statusline entry, so issue a statusline message for
+ * the typo-prone users (like me 8-). - FM
+ */
+ HTSprintf0(&temp, LINK_ALREADY_CURRENT, number);
+ HTUserMsg(temp);
+ FREE(temp);
+ } else {
+ /*
+ * It's a different link on this page,
+ */
+ set_curdoc_link(newdoc.link);
+ newdoc.link = 0;
+ }
+ }
+ }
+ break; /* nothing more to do */
+
+ case DO_GOTOPAGE_STUFF:
+ /*
+ * Position on a page in this document. - FM
+ */
+ LYSetNewline(newdoc.line);
+ newdoc.line = 1;
+ if (LYGetNewline() == curdoc.line) {
+ /*
+ * It's the current page, so issue a statusline message for the
+ * typo-prone users (like me 8-). - FM
+ */
+ if (LYGetNewline() <= 1) {
+ HTInfoMsg(ALREADY_AT_BEGIN);
+ } else if (!more_text) {
+ HTInfoMsg(ALREADY_AT_END);
+ } else {
+ HTSprintf0(&temp, ALREADY_AT_PAGE, number);
+ HTUserMsg(temp);
+ FREE(temp);
+ }
+ }
+ break;
+
+ case PRINT_ERROR:
+ *old_c = real_c;
+ HTUserMsg(BAD_LINK_NUM_ENTERED);
+ break;
+ }
+ return;
+}
+
+#ifdef SUPPORT_CHDIR
+
+/* original implementation by VH */
+void handle_LYK_CHDIR(void)
+{
+ static bstring *buf = NULL;
+ char *p = NULL;
+
+ if (no_chdir) {
+ HTUserMsg(CHDIR_DISABLED);
+ return;
+ }
+
+ _statusline(gettext("cd to:"));
+ if (LYgetBString(&buf, FALSE, 0, NORECALL) < 0 || isBEmpty(buf)) {
+ HTInfoMsg(CANCELLED);
+ return;
+ }
+
+ if (LYIsTilde(buf->str[0]) &&
+ (LYIsPathSep(buf->str[1]) || buf->str[1] == '\0')) {
+ HTSprintf0(&p, "%s%s", Home_Dir(), buf->str + 1);
+ } else {
+ StrAllocCopy(p, buf->str);
+ }
+
+ CTRACE((tfp, "changing directory to '%s'\n", p));
+ if (chdir(p)) {
+ switch (errno) {
+ case EACCES:
+ HTInfoMsg(COULD_NOT_ACCESS_DIR);
+ break;
+ case ENOENT:
+ HTInfoMsg(gettext("No such directory"));
+ break;
+ case ENOTDIR:
+ HTInfoMsg(gettext("A component of path is not a directory"));
+ break;
+ default:
+ HTInfoMsg(gettext("failed to change directory"));
+ break;
+ }
+ } else {
+#ifdef DIRED_SUPPORT
+ /*if in dired, load content of other directory */
+ if (!no_dired_support
+ && (lynx_edit_mode || (LYIsUIPage(curdoc.address, UIP_DIRED_MENU)))) {
+ char buf2[LY_MAXPATH];
+ char *addr = NULL;
+
+ Current_Dir(buf2);
+ LYLocalFileToURL(&addr, buf2);
+
+ newdoc.address = addr;
+ newdoc.isHEAD = FALSE;
+ StrAllocCopy(newdoc.title, gettext("A URL specified by the user"));
+ LYFreePostData(&newdoc);
+ FREE(newdoc.bookmark);
+ newdoc.safe = FALSE;
+ newdoc.internal_link = FALSE;
+ /**force_load = TRUE;*/
+ if (lynx_edit_mode) {
+ DIRED_UNCACHE_2;
+ }
+ } else
+#endif
+ HTInfoMsg(OPERATION_DONE);
+ }
+ FREE(p);
+}
+
+static void handle_LYK_PWD(void)
+{
+ char buffer[LY_MAXPATH];
+ int save_secs = InfoSecs;
+ BOOLEAN save_wait = no_pause;
+
+ if (Secs2SECS(save_secs) < 1)
+ InfoSecs = SECS2Secs(1);
+ no_pause = FALSE;
+
+ HTInfoMsg(Current_Dir(buffer));
+
+ InfoSecs = save_secs;
+ no_pause = save_wait;
+}
+#endif
+
+#ifdef USE_CURSES_PADS
+/*
+ * Having jumps larger than this is counter-productive. Indeed, it is natural
+ * to expect that when the relevant text appears, one would "overshoot" and
+ * would scroll 3-4 extra full screens. When going back, the "accumulation"
+ * logic would again start moving in full screens, so one would overshoot
+ * again, etc.
+ *
+ * Going back, one can fix it in 28 keypresses. The relevant text will appear
+ * on the screen soon enough for the key-repeat to become not that important,
+ * and we are still moving in smaller steps than when we overshot. Since key
+ * repeat is not important, even if we overshoot again, it is going to be by 30
+ * steps, which is easy to fix by reversing the direction again.
+ */
+static int repeat_to_delta(int n)
+{
+ int threshold = LYcols / 3;
+
+ while (threshold > 0) {
+ if (n >= threshold) {
+ n = threshold;
+ break;
+ }
+ threshold = (threshold * 2) / 3;
+ }
+ return n;
+}
+
+static void handle_LYK_SHIFT_LEFT(BOOLEAN *flag, int count)
+{
+ if (!LYwideLines) {
+ HTAlert(SHIFT_VS_LINEWRAP);
+ return;
+ }
+ if (LYshiftWin > 0) {
+ LYshiftWin -= repeat_to_delta(count);
+ *flag = TRUE;
+ }
+ if (LYshiftWin < 0)
+ LYshiftWin = 0;
+}
+
+static void handle_LYK_SHIFT_RIGHT(BOOLEAN *flag, int count)
+{
+ if (!LYwideLines) {
+ HTAlert(SHIFT_VS_LINEWRAP);
+ return;
+ }
+ LYshiftWin += repeat_to_delta(count);
+ *flag = TRUE;
+}
+
+static BOOLEAN handle_LYK_LINEWRAP_TOGGLE(int *cmd,
+ BOOLEAN *flag)
+{
+ static const char *choices[] =
+ {
+ "Try to fit screen width",
+ "No line wrap in columns",
+ "Wrap columns at screen width",
+ "Wrap columns at 3/4 screen width",
+ "Wrap columns at 2/3 screen width",
+ "Wrap columns at 1/2 screen width",
+ "Wrap columns at 1/3 screen width",
+ "Wrap columns at 1/4 screen width",
+ NULL
+ };
+ static int wrap[] =
+ {
+ 0,
+ 0,
+ 12, /* In units of 1/12 */
+ 9,
+ 8,
+ 6,
+ 4,
+ 3
+ };
+ int c;
+ int code = FALSE;
+
+ CTRACE((tfp, "Entering handle_LYK_LINEWRAP_TOGGLE\n"));
+ if (LYwin != stdscr) {
+ /* Somehow the mouse is over the number instead of being over the
+ name, so we decrease x. */
+ c = LYChoosePopup(!LYwideLines,
+ LYlines / 2 - 2,
+ LYcolLimit / 2 - 6,
+ choices, (int) TABLESIZE(choices) - 1,
+ FALSE, TRUE);
+ /*
+ * LYhandlePopupList() wasn't really meant to be used outside of
+ * old-style Options menu processing. One result of mis-using it here
+ * is that we have to deal with side-effects regarding SIGINT signal
+ * handler and the term_options global variable. - kw
+ */
+ if (!term_options) {
+ CTRACE((tfp,
+ "...setting LYwideLines %d, LYtableCols %d (have %d and %d)\n",
+ c, wrap[c],
+ LYwideLines,
+ LYtableCols));
+
+ LYwideLines = c;
+ LYtableCols = wrap[c];
+
+ if (LYwideLines == 0)
+ LYshiftWin = 0;
+ *flag = TRUE;
+ HTUserMsg(LYwideLines ? LINEWRAP_OFF : LINEWRAP_ON);
+ code = reparse_or_reload(cmd);
+ }
+ }
+ return (BOOLEAN) code;
+}
+#endif
+
+#ifdef USE_MAXSCREEN_TOGGLE
+static BOOLEAN handle_LYK_MAXSCREEN_TOGGLE(int *cmd)
+{
+ static int flag = 0;
+
+ CTRACE((tfp, "Entering handle_LYK_MAXSCREEN_TOGGLE\n"));
+ if (flag) {
+ CTRACE((tfp, "Calling recoverWindowSize()\n"));
+ recoverWindowSize();
+ flag = 0;
+ } else {
+ CTRACE((tfp, "Calling maxmizeWindowSize()\n"));
+ maxmizeWindowSize();
+ flag = 1;
+ }
+ return reparse_or_reload(cmd);
+}
+#endif
+
+#ifdef LY_FIND_LEAKS
+#define CleanupMainLoop() \
+ BStrFree(prev_target); \
+ BStrFree(user_input_buffer)
+#else
+#define CleanupMainLoop() /* nothing */
+#endif
+
+/*
+ * Here's where we do all the work.
+ * mainloop is basically just a big switch dependent on the users input. I
+ * have tried to offload most of the work done here to procedures to make it
+ * more modular, but this procedure still does a lot of variable manipulation.
+ * This needs some work to make it neater. - Lou Moutilli
+ * (memoir from the original Lynx - FM)
+ */
+int mainloop(void)
+{
+#if defined(WIN_EX) /* 1997/10/08 (Wed) 14:52:06 */
+ char sjis_buff[MAX_LINE];
+ char temp_buff[sizeof(sjis_buff) * 4];
+#endif
+ int c = 0;
+ int real_c = 0;
+ int old_c = 0;
+ int pending_form_c = -1;
+ int cmd = LYK_DO_NOTHING, real_cmd = LYK_DO_NOTHING;
+ int getresult;
+ int arrowup = FALSE, show_help = FALSE;
+ bstring *user_input_buffer = NULL;
+ const char *cshelpfile = NULL;
+ BOOLEAN first_file = TRUE;
+ BOOLEAN popped_doc = FALSE;
+ BOOLEAN refresh_screen = FALSE;
+ BOOLEAN force_load = FALSE;
+ BOOLEAN try_internal = FALSE;
+ BOOLEAN crawl_ok = FALSE;
+ BOOLEAN vi_keys_flag = vi_keys;
+ BOOLEAN emacs_keys_flag = emacs_keys;
+ BOOLEAN trace_mode_flag = FALSE;
+ BOOLEAN forced_HTML_mode = LYforce_HTML_mode;
+ char cfile[128];
+ FILE *cfp;
+ char *cp;
+ int ch = 0;
+ RecallType recall = NORECALL;
+ int URLTotal = 0;
+ int URLNum;
+ BOOLEAN FirstURLRecall = TRUE;
+ char *temp = NULL;
+ BOOLEAN ForcePush = FALSE;
+ BOOLEAN override_LYresubmit_posts = FALSE;
+ BOOLEAN newdoc_link_is_absolute = FALSE;
+ BOOLEAN curlink_is_editable;
+ BOOLEAN use_last_tfpos;
+ unsigned int len;
+ int i;
+ int follow_col = -1, key_count = 0, last_key = 0;
+ int tmpNewline;
+ DocInfo tmpDocInfo;
+
+ /* "internal" means "within the same document, with certainty". It includes a
+ * space so it cannot conflict with any (valid) "TYPE" attributes on A
+ * elements. [According to which DTD, anyway??] - kw
+ */
+ HTInternalLink = HTAtom_for("internal link"); /* init, used as const */
+
+#ifndef WWW_SOURCE
+ WWW_SOURCE = HTAtom_for(STR_SOURCE); /* init, used as const */
+#endif
+
+ /*
+ * curdoc.address contains the name of the file that is currently open.
+ * newdoc.address contains the name of the file that will soon be
+ * opened if it exits.
+ * prev_target contains the last search string the user searched for.
+ * newdoc.title contains the link name that the user last chose to get
+ * into the current link (file).
+ */
+ /* initialize some variables */
+ newdoc.address = NULL;
+ newdoc.title = NULL;
+ newdoc.post_data = NULL;
+ newdoc.post_content_type = NULL;
+ newdoc.bookmark = NULL;
+ newdoc.internal_link = FALSE;
+ curdoc.address = NULL;
+ curdoc.title = NULL;
+ curdoc.post_data = NULL;
+ curdoc.post_content_type = NULL;
+ curdoc.bookmark = NULL;
+ curdoc.internal_link = FALSE;
+#ifdef USE_COLOR_STYLE
+ curdoc.style = NULL;
+ newdoc.style = NULL;
+#endif
+#ifndef USE_SESSIONS
+ nhist = 0;
+#endif
+ BStrCopy0(user_input_buffer, "");
+ BStrCopy0(prev_target, "");
+#ifdef LY_FIND_LEAKS
+ atexit(free_mainloop_variables);
+#endif
+ initialize:
+ set_address(&newdoc, startfile);
+ StrAllocCopy(startrealm, startfile);
+ StrAllocCopy(newdoc.title, gettext("Entry into main screen"));
+ newdoc.isHEAD = FALSE;
+ newdoc.safe = FALSE;
+ newdoc.line = 1;
+ newdoc.link = 0;
+
+#ifdef USE_SLANG
+ if (TRACE && LYCursesON) {
+ LYaddstr("\n");
+ LYrefresh();
+ }
+#endif /* USE_SLANG */
+ CTRACE((tfp, "Entering mainloop, startfile=%s\n", startfile));
+
+ if (form_post_data) {
+ BStrCopy0(newdoc.post_data, form_post_data);
+ StrAllocCopy(newdoc.post_content_type,
+ "application/x-www-form-urlencoded");
+ } else if (form_get_data) {
+ StrAllocCat(newdoc.address, form_get_data);
+ }
+
+ if (bookmark_start) {
+ if (LYValidate) {
+ HTAlert(BOOKMARKS_DISABLED);
+ bookmark_start = FALSE;
+ goto initialize;
+ } else if (traversal) {
+ HTAlert(BOOKMARKS_NOT_TRAVERSED);
+ traversal = FALSE;
+ crawl = FALSE;
+ bookmark_start = FALSE;
+ goto initialize;
+ } else {
+ const char *cp1;
+
+ /*
+ * See if a bookmark page exists. If it does, replace
+ * newdoc.address with its name
+ */
+ if ((cp1 = get_bookmark_filename(&newdoc.address)) != NULL &&
+ *cp1 != '\0' && strcmp(cp1, " ")) {
+ StrAllocCopy(newdoc.title, BOOKMARK_TITLE);
+ StrAllocCopy(newdoc.bookmark, BookmarkPage);
+ StrAllocCopy(startrealm, newdoc.address);
+ LYFreePostData(&newdoc);
+ newdoc.isHEAD = FALSE;
+ newdoc.safe = FALSE;
+ CTRACE((tfp, "Using bookmarks=%s\n", newdoc.address));
+ } else {
+ HTUserMsg(BOOKMARKS_NOT_OPEN);
+ bookmark_start = FALSE;
+ goto initialize;
+ }
+ }
+ }
+
+ FREE(form_post_data);
+ FREE(form_get_data);
+
+ LYSetDisplayLines();
+
+ while (TRUE) {
+#ifdef USE_COLOR_STYLE
+ if (curdoc.style != NULL)
+ force_load = TRUE;
+#endif
+ /*
+ * If newdoc.address is different from curdoc.address then we need to
+ * go out and find and load newdoc.address.
+ */
+ if (LYforce_no_cache || force_load ||
+ are_different(&curdoc, &newdoc)) {
+
+ force_load = FALSE; /* done */
+ if (TRACE && LYCursesON) {
+ LYHideCursor(); /* make sure cursor is down */
+#ifdef USE_SLANG
+ LYaddstr("\n");
+#endif /* USE_SLANG */
+ LYrefresh();
+ }
+ try_again:
+ /*
+ * Push the old file onto the history stack if we have a current
+ * doc and a new address. - FM
+ */
+ if (curdoc.address && newdoc.address) {
+ /*
+ * Don't actually push if this is a LYNXDOWNLOAD URL, because
+ * that returns NORMAL even if it fails due to a spoof attempt
+ * or file access problem, and we set the newdoc structure
+ * elements to the curdoc structure elements under case NORMAL.
+ * - FM
+ */
+ if (!isLYNXDOWNLOAD(newdoc.address)) {
+ LYpush(&curdoc, ForcePush);
+ }
+ } else if (!newdoc.address) {
+ /*
+ * If newdoc.address is empty then pop a file and load it. -
+ * FM
+ */
+ LYhist_prev(&newdoc);
+ popped_doc = TRUE;
+
+ /*
+ * If curdoc had been reached via an internal
+ * (fragment) link from what we now have just
+ * popped into newdoc, then override non-caching in
+ * all cases. - kw
+ */
+ if (track_internal_links &&
+ curdoc.internal_link &&
+ !are_phys_different(&curdoc, &newdoc)) {
+ LYinternal_flag = TRUE;
+ LYoverride_no_cache = TRUE;
+ LYforce_no_cache = FALSE;
+ try_internal = TRUE;
+ } else {
+ /*
+ * Force a no_cache override unless it's a bookmark file,
+ * or it has POST content and LYresubmit_posts is set
+ * without safe also set, and we are not going to another
+ * position in the current document or restoring the
+ * previous document due to a NOT_FOUND or NULLFILE return
+ * value from getfile(). - FM
+ */
+ if ((newdoc.bookmark != NULL) ||
+ (newdoc.post_data != NULL &&
+ !newdoc.safe &&
+ LYresubmit_posts &&
+ !override_LYresubmit_posts &&
+ NO_INTERNAL_OR_DIFFERENT(&curdoc, &newdoc))) {
+ LYoverride_no_cache = FALSE;
+ } else {
+ LYoverride_no_cache = TRUE;
+ }
+ }
+ }
+ override_LYresubmit_posts = FALSE;
+
+ if (HEAD_request) {
+ /*
+ * Make SURE this is an appropriate request. - FM
+ */
+ if (newdoc.address) {
+ if (LYCanDoHEAD(newdoc.address) == TRUE) {
+ newdoc.isHEAD = TRUE;
+ } else if (isLYNXIMGMAP(newdoc.address)) {
+ if (LYCanDoHEAD(newdoc.address + LEN_LYNXIMGMAP) == TRUE) {
+ StrAllocCopy(temp, newdoc.address + LEN_LYNXIMGMAP);
+ free_address(&newdoc);
+ newdoc.address = temp;
+ newdoc.isHEAD = TRUE;
+ temp = NULL;
+ }
+ }
+ }
+ try_internal = FALSE;
+ HEAD_request = FALSE;
+ }
+
+ /*
+ * If we're getting the TRACE log and it's not new, check whether
+ * its HText structure has been dumped, and if so, fflush() and
+ * fclose() it to ensure it's fully updated, and then fopen() it
+ * again. - FM
+ */
+ if (LYUseTraceLog == TRUE &&
+ trace_mode_flag == FALSE &&
+ LYTraceLogFP != NULL &&
+ LYIsUIPage(newdoc.address, UIP_TRACELOG)) {
+ DocAddress WWWDoc;
+ HTParentAnchor *tmpanchor;
+
+ WWWDoc.address = newdoc.address;
+ WWWDoc.post_data = newdoc.post_data;
+ WWWDoc.post_content_type = newdoc.post_content_type;
+ WWWDoc.bookmark = newdoc.bookmark;
+ WWWDoc.isHEAD = newdoc.isHEAD;
+ WWWDoc.safe = newdoc.safe;
+ tmpanchor = HTAnchor_findAddress(&WWWDoc);
+ if ((HText *) HTAnchor_document(tmpanchor) == NULL) {
+ if (!LYReopenTracelog(&trace_mode_flag)) {
+ old_c = 0;
+ cmd = LYK_PREV_DOC;
+ goto new_cmd;
+ }
+ }
+ }
+
+ LYRequestTitle = newdoc.title;
+ if (newdoc.bookmark)
+ LYforce_HTML_mode = TRUE;
+ if (LYValidate &&
+ startfile_ok &&
+ newdoc.address && startfile && homepage &&
+ (!strcmp(newdoc.address, startfile) ||
+ !strcmp(newdoc.address, homepage))) {
+ LYPermitURL = TRUE;
+ }
+
+ /* reset these two variables here before getfile()
+ * so they will be available in partial mode
+ * (was previously implemented in case NORMAL).
+ */
+ BStrCopy0(prev_target, ""); /* Reset for new coming document */
+ LYSetNewline(newdoc.line); /* set for LYGetNewline() */
+
+#ifdef USE_PRETTYSRC
+ psrc_first_tag = TRUE;
+#endif
+#ifdef TEXTFIELDS_MAY_NEED_ACTIVATION
+ textfields_need_activation = textfields_activation_option;
+#endif
+ FREE(LYRequestReferer);
+ /*
+ * Don't send Referer if we have to load a document again that we
+ * got from the history stack. We don't know any more how we
+ * originally got to that page. Using a Referer based on the
+ * current HTMainText could only be right by coincidence. - kw
+ * 1999-11-01
+ */
+ if (popped_doc)
+ LYNoRefererForThis = TRUE;
+
+ if (track_internal_links) {
+ if (try_internal) {
+ if (newdoc.address &&
+ isLYNXIMGMAP(newdoc.address)) {
+ try_internal = FALSE;
+ } else if (curdoc.address &&
+ isLYNXIMGMAP(curdoc.address)) {
+ try_internal = FALSE;
+ }
+ }
+ if (try_internal) {
+ char *hashp = findPoundSelector(newdoc.address);
+
+ if (hashp) {
+ HTFindPoundSelector(hashp + 1);
+ }
+ getresult = (HTMainText != NULL) ? NORMAL : NOT_FOUND;
+ try_internal = FALSE; /* done */
+ /* fix up newdoc.address which may have been fragment-only */
+ if (getresult == NORMAL && (!hashp || hashp == newdoc.address)) {
+ if (!hashp) {
+ set_address(&newdoc, HTLoadedDocumentURL());
+ } else {
+ StrAllocCopy(temp, HTLoadedDocumentURL());
+ StrAllocCat(temp, hashp); /* append fragment */
+ set_address(&newdoc, temp);
+ FREE(temp);
+ }
+ }
+ } else {
+ if (newdoc.internal_link && newdoc.address &&
+ *newdoc.address == '#' && nhist > 0) {
+ char *cp0;
+
+ if (isLYNXIMGMAP(HDOC(nhist_1).address))
+ cp0 = HDOC(nhist_1).address + LEN_LYNXIMGMAP;
+ else
+ cp0 = HDOC(nhist_1).address;
+ StrAllocCopy(temp, cp0);
+ (void) trimPoundSelector(temp);
+ StrAllocCat(temp, newdoc.address);
+ free_address(&newdoc);
+ newdoc.address = temp;
+ temp = NULL;
+ }
+ tmpDocInfo = newdoc;
+ tmpNewline = -1;
+ fill_JUMP_Params(&newdoc.address);
+ getresult = getfile(&newdoc, &tmpNewline);
+ if (!reloading && !popped_doc && (tmpNewline >= 0)) {
+ LYSetNewline(tmpNewline);
+ } else {
+ newdoc.link = tmpDocInfo.link;
+ }
+ }
+ } else {
+ tmpDocInfo = newdoc;
+ tmpNewline = -1;
+ fill_JUMP_Params(&newdoc.address);
+ getresult = getfile(&newdoc, &tmpNewline);
+ if (!reloading && !popped_doc && (tmpNewline >= 0)) {
+ LYSetNewline(tmpNewline);
+ } else {
+ newdoc.link = tmpDocInfo.link;
+ }
+ }
+
+#ifdef INACTIVE_INPUT_STYLE_VH
+ textinput_redrawn = FALSE; /* for sure */
+#endif
+
+ switch (getresult) {
+
+ case NOT_FOUND:
+ /*
+ * OK! can't find the file, so it must not be around now. Do
+ * any error logging, if appropriate.
+ */
+ LYoverride_no_cache = FALSE; /* Was TRUE if popped. - FM */
+ LYinternal_flag = FALSE; /* Reset to default. - kw */
+ turn_trace_back_on(&trace_mode_flag);
+ if (!first_file && !LYCancelledFetch) {
+ /*
+ * Do error mail sending and/or traversal stuff. Note that
+ * the links[] elements may not be valid at this point, if
+ * we did call HTuncache_current_document! This should not
+ * have happened for traversal, but for sending error mail
+ * check that HTMainText exists for this reason. - kw
+ */
+ if (error_logging && nhist > 0 && !popped_doc &&
+ !LYUserSpecifiedURL &&
+ HTMainText &&
+ nlinks > 0 && curdoc.link < nlinks &&
+ !isLYNXHIST(NonNull(newdoc.address)) &&
+ !isLYNXCACHE(NonNull(newdoc.address)) &&
+ !isLYNXCOOKIE(NonNull(newdoc.address))) {
+ char *mail_owner = NULL;
+
+ if (owner_address && isMAILTO_URL(owner_address)) {
+ mail_owner = owner_address + LEN_MAILTO_URL;
+ }
+ /*
+ * Email a bad link message to the owner of the
+ * document, or to ALERTMAIL if defined, but NOT to
+ * lynx-dev (it is rejected in mailmsg). - FM, kw
+ */
+#ifndef ALERTMAIL
+ if (mail_owner)
+#endif
+ mailmsg(curdoc.link,
+ mail_owner,
+ HDOC(nhist_1).address,
+ HDOC(nhist_1).title);
+ }
+ if (traversal) {
+ FILE *ofp;
+
+ if ((ofp = LYAppendToTxtFile(TRAVERSE_ERRORS)) == NULL) {
+ if ((ofp = LYNewTxtFile(TRAVERSE_ERRORS)) == NULL) {
+ perror(NOOPEN_TRAV_ERR_FILE);
+ exit_immediately(EXIT_FAILURE);
+ }
+ }
+ if (nhist > 0) {
+ fprintf(ofp,
+ "%s %s\tin %s\n",
+ popped_doc ?
+ newdoc.address : links[curdoc.link].lname,
+ links[curdoc.link].target,
+ HDOC(nhist_1).address);
+ } else {
+ fprintf(ofp,
+ "%s %s\t\n",
+ popped_doc ?
+ newdoc.address : links[curdoc.link].lname,
+ links[curdoc.link].target);
+ }
+ LYCloseOutput(ofp);
+ }
+ }
+
+ /*
+ * Fall through to do the NULL stuff and reload the old file,
+ * unless the first file wasn't found or has gone missing.
+ */
+ if (!nhist) {
+ /*
+ * If nhist = 0 then it must be the first file.
+ */
+ CleanupMainLoop();
+ exit_immediately_with_error_message(NOT_FOUND, first_file);
+ return (EXIT_FAILURE);
+ }
+ /* FALLTHRU */
+
+ case NULLFILE:
+ /*
+ * Not supposed to return any file.
+ */
+ LYoverride_no_cache = FALSE; /* Was TRUE if popped. - FM */
+ popped_doc = FALSE; /* Was TRUE if popped. - FM */
+ LYinternal_flag = FALSE; /* Reset to default. - kw */
+ turn_trace_back_on(&trace_mode_flag);
+ free_address(&newdoc); /* to pop last doc */
+ FREE(newdoc.bookmark);
+ LYJumpFileURL = FALSE;
+ reloading = FALSE;
+ LYPermitURL = FALSE;
+ LYCancelledFetch = FALSE;
+ ForcePush = FALSE;
+ LYforce_HTML_mode = FALSE;
+ force_old_UCLYhndl_on_reload = FALSE;
+ if (traversal) {
+ crawl_ok = FALSE;
+ if (traversal_link_to_add) {
+ /*
+ * It's a binary file, or the fetch attempt failed.
+ * Add it to TRAVERSE_REJECT_FILE so we don't try again
+ * in this run.
+ */
+ if (!lookup_reject(traversal_link_to_add)) {
+ add_to_reject_list(traversal_link_to_add);
+ }
+ FREE(traversal_link_to_add);
+ }
+ }
+ /*
+ * Make sure the first file was found and has not gone missing.
+ */
+ if (!nhist) {
+ /*
+ * If nhist = 0 then it must be the first file.
+ */
+ if (first_file && homepage &&
+ !LYSameFilename(homepage, startfile)) {
+ /*
+ * Couldn't return to the first file but there is a
+ * homepage we can use instead. Useful for when the
+ * first URL causes a program to be invoked. - GL
+ *
+ * But first make sure homepage is different from
+ * startfile (above), then make it the same (below) so
+ * we don't enter an infinite getfile() loop on on
+ * failures to find the files. - FM
+ */
+ set_address(&newdoc, homepage);
+ LYFreePostData(&newdoc);
+ FREE(newdoc.bookmark);
+ StrAllocCopy(startfile, homepage);
+ newdoc.isHEAD = FALSE;
+ newdoc.safe = FALSE;
+ newdoc.internal_link = FALSE;
+ goto try_again;
+ } else {
+ CleanupMainLoop();
+ exit_immediately_with_error_message(NULLFILE, first_file);
+ return (EXIT_FAILURE);
+ }
+ }
+
+ /*
+ * If we're going to pop from history because getfile didn't
+ * succeed, reset LYforce_no_cache first. This would have been
+ * done in HTAccess.c if the request got that far, but the URL
+ * may have been handled or rejected in getfile without taking
+ * care of that. - kw
+ */
+ LYforce_no_cache = FALSE;
+ /*
+ * Retrieval of a newdoc just failed, and just going to
+ * try_again would pop the next doc from history and try to get
+ * it without further questions. This may not be the right
+ * thing to do if we have POST data, so fake a PREV_DOC key if
+ * it seems that some prompting should be done. This doesn't
+ * affect the traversal logic, since with traversal POST data
+ * can never occur. - kw
+ */
+ if (HDOC(nhist - 1).post_data &&
+ !HDOC(nhist - 1).safe) {
+ if (HText_POSTReplyLoaded((DocInfo *) &history[(nhist_1)])) {
+ override_LYresubmit_posts = TRUE;
+ goto try_again;
+ }
+ /* Set newdoc fields, just in case the PREV_DOC gets
+ * cancelled. - kw
+ */
+ if (!curdoc.address) {
+ set_address(&newdoc, HTLoadedDocumentURL());
+ StrAllocCopy(newdoc.title, HTLoadedDocumentTitle());
+ if (HTMainAnchor
+ && HTMainAnchor->post_data) {
+ BStrCopy(newdoc.post_data,
+ HTMainAnchor->post_data);
+ StrAllocCopy(newdoc.post_content_type,
+ HTMainAnchor->post_content_type);
+ } else {
+ BStrFree(newdoc.post_data);
+ }
+ newdoc.isHEAD = HTLoadedDocumentIsHEAD();
+ newdoc.safe = HTLoadedDocumentIsSafe();
+ newdoc.internal_link = FALSE;
+ } else {
+ copy_address(&newdoc, &curdoc);
+ StrAllocCopy(newdoc.title, curdoc.title);
+ BStrCopy(newdoc.post_data, curdoc.post_data);
+ StrAllocCopy(newdoc.post_content_type,
+ curdoc.post_content_type);
+ newdoc.isHEAD = curdoc.isHEAD;
+ newdoc.safe = curdoc.safe;
+ newdoc.internal_link = curdoc.internal_link;
+ newdoc.line = curdoc.line;
+ newdoc.link = curdoc.link;
+ }
+ cmd = LYK_PREV_DOC;
+ goto new_cmd;
+ }
+ override_LYresubmit_posts = TRUE;
+ goto try_again;
+
+ case NORMAL:
+ /*
+ * Marvelously, we got the document!
+ */
+ LYoverride_no_cache = FALSE; /* Was TRUE if popped. - FM */
+ LYinternal_flag = FALSE; /* Reset to default. - kw */
+ turn_trace_back_on(&trace_mode_flag);
+
+ /*
+ * If it's the first file and we're interactive, check whether
+ * it's a bookmark file which was not accessed via the -book
+ * switch. - FM
+ */
+ if (((first_file == TRUE) &&
+ (dump_output_immediately == FALSE) &&
+ isEmpty(newdoc.bookmark)) &&
+ ((LYisLocalFile(newdoc.address) == TRUE) &&
+ !(strcmp(NonNull(HText_getTitle()),
+ BOOKMARK_TITLE))) &&
+ (temp = HTParse(newdoc.address, "",
+ PARSE_PATH + PARSE_PUNCTUATION)) != NULL) {
+ const char *name = wwwName(Home_Dir());
+
+ len = (unsigned) strlen(name);
+#ifdef VMS
+ if (!strncasecomp(temp, name, len) &&
+ strlen(temp) > len)
+#else
+ if (!StrNCmp(temp, name, len) &&
+ strlen(temp) > len)
+#endif /* VMS */
+ {
+ /*
+ * We're interactive and this might be a bookmark file
+ * entered as a startfile rather than invoked via
+ * -book. Check if it's in our bookmark file list, and
+ * if so, reload if with the relevant bookmark elements
+ * set. - FM
+ */
+ cp = NULL;
+ if (temp[len] == '/') {
+ if (StrChr(&temp[(len + 1)], '/')) {
+ HTSprintf0(&cp, ".%s", &temp[len]);
+ } else {
+ StrAllocCopy(cp, &temp[(len + 1)]);
+ }
+ } else {
+ StrAllocCopy(cp, &temp[len]);
+ }
+ for (i = 0; i <= MBM_V_MAXFILES; i++) {
+ if (MBM_A_subbookmark[i] &&
+ LYSameFilename(cp, MBM_A_subbookmark[i])) {
+ StrAllocCopy(BookmarkPage,
+ MBM_A_subbookmark[i]);
+ break;
+ }
+ }
+ FREE(cp);
+ if (i <= MBM_V_MAXFILES) {
+ FREE(temp);
+ if (LYValidate) {
+ HTAlert(BOOKMARKS_DISABLED);
+ CleanupMainLoop();
+ return (EXIT_FAILURE);
+ }
+ if ((temp = HTParse(newdoc.address, "",
+ PARSE_ACCESS + PARSE_HOST + PARSE_PUNCTUATION))) {
+ set_address(&newdoc, temp);
+ HTuncache_current_document();
+ free_address(&curdoc);
+ StrAllocCat(newdoc.address,
+ wwwName(Home_Dir()));
+ StrAllocCat(newdoc.address, "/");
+ StrAllocCat(newdoc.address,
+ (StrNCmp(BookmarkPage, "./", 2) ?
+ BookmarkPage :
+ (BookmarkPage + 2)));
+ StrAllocCopy(newdoc.title, BOOKMARK_TITLE);
+ StrAllocCopy(newdoc.bookmark, BookmarkPage);
+#ifdef USE_COLOR_STYLE
+ if (curdoc.style)
+ StrAllocCopy(newdoc.style, curdoc.style);
+#endif
+ StrAllocCopy(startrealm, newdoc.address);
+ LYFreePostData(&newdoc);
+ newdoc.isHEAD = FALSE;
+ newdoc.safe = FALSE;
+ FREE(temp);
+ if (!strcmp(homepage, startfile))
+ StrAllocCopy(homepage, newdoc.address);
+ StrAllocCopy(startfile, newdoc.address);
+ CTRACE((tfp, "Reloading as bookmarks=%s\n",
+ newdoc.address));
+ goto try_again;
+ }
+ }
+ }
+ cp = NULL;
+ }
+ FREE(temp);
+
+ if (traversal) {
+ /*
+ * During traversal build up lists of all links traversed.
+ * Traversal mode is a special feature for traversing http
+ * links in the web.
+ */
+ if (traversal_link_to_add) {
+ /*
+ * Add the address we sought to TRAVERSE_FILE.
+ */
+ if (!lookup_link(traversal_link_to_add))
+ add_to_table(traversal_link_to_add);
+ FREE(traversal_link_to_add);
+ }
+ if (curdoc.address && curdoc.title &&
+ !isLYNXIMGMAP(curdoc.address))
+ /*
+ * Add the address we got to TRAVERSE_FOUND_FILE.
+ */
+ add_to_traverse_list(curdoc.address, curdoc.title);
+ }
+
+ /*
+ * If this was a LYNXDOWNLOAD, we still have curdoc, not a
+ * newdoc, so reset the address, title and positioning
+ * elements. - FM
+ */
+ if (newdoc.address && curdoc.address &&
+ isLYNXDOWNLOAD(newdoc.address)) {
+ copy_address(&newdoc, &curdoc);
+ StrAllocCopy(newdoc.title, NonNull(curdoc.title));
+ StrAllocCopy(newdoc.bookmark, curdoc.bookmark);
+ newdoc.line = curdoc.line;
+ newdoc.link = curdoc.link;
+ newdoc.internal_link = FALSE; /* can't be true. - kw */
+ }
+
+ /*
+ * Set Newline to the saved line. It contains the line the
+ * user was on if s/he has been in the file before, or it is 1
+ * if this is a new file.
+ *
+ * We already set Newline before getfile() and probably update
+ * it explicitly if popping from the history stack via LYpop()
+ * or LYpop_num() within getfile() cycle.
+ *
+ * In partial mode, Newline was probably updated in
+ * LYMainLoop_pageDisplay() if user scrolled the document while
+ * loading. Incremental loading stage already closed in
+ * HT*Copy().
+ */
+#ifdef DISP_PARTIAL
+ /* Newline = newdoc.line; */
+ display_partial = FALSE; /* for sure, LYNXfoo:/ may be a problem */
+#else
+ /* Should not be needed either if we remove "DISP_PARTIAL" from
+ * LYHistory.c, but lets leave it as an important comment for
+ * now.
+ */
+ /* Newline = newdoc.line; */
+#endif
+
+ /*
+ * If we are going to a target line or the first page of a
+ * popped document, override any www_search line result.
+ */
+ if (LYGetNewline() > 1 || popped_doc == TRUE)
+ www_search_result = -1;
+
+ /*
+ * Make sure curdoc.line will not be equal to Newline, so we
+ * get a redraw.
+ */
+ curdoc.line = -1;
+ break;
+ } /* end switch */
+
+ if (TRACE) {
+ if (!LYTraceLogFP || trace_mode_flag) {
+ LYSleepAlert(); /* allow me to look at the results */
+ }
+ }
+
+ /*
+ * Set the files the same.
+ */
+ copy_address(&curdoc, &newdoc);
+ BStrCopy(curdoc.post_data, newdoc.post_data);
+ StrAllocCopy(curdoc.post_content_type, newdoc.post_content_type);
+ StrAllocCopy(curdoc.bookmark, newdoc.bookmark);
+#ifdef USE_COLOR_STYLE
+ StrAllocCopy(curdoc.style, HText_getStyle());
+ if (curdoc.style != NULL)
+ style_readFromFile(curdoc.style);
+#endif
+ curdoc.isHEAD = newdoc.isHEAD;
+ curdoc.internal_link = newdoc.internal_link;
+
+ /*
+ * Set the remaining document elements and add to the visited links
+ * list. - FM
+ */
+ if (ownerS_address != NULL) {
+#ifndef USE_PRETTYSRC
+ if (HTOutputFormat == WWW_SOURCE && !HText_getOwner())
+#else
+ if ((LYpsrc ? psrc_view : HTOutputFormat == WWW_SOURCE)
+ && !HText_getOwner())
+#endif
+ HText_setMainTextOwner(ownerS_address);
+ FREE(ownerS_address);
+ }
+ if (HText_getTitle()) {
+ StrAllocCopy(curdoc.title, HText_getTitle());
+ } else if (!dump_output_immediately) {
+ StrAllocCopy(curdoc.title, newdoc.title);
+ }
+ StrAllocCopy(owner_address, HText_getOwner());
+ curdoc.safe = HTLoadedDocumentIsSafe();
+ if (!dump_output_immediately) {
+ LYAddVisitedLink(&curdoc);
+ }
+
+ /*
+ * Reset WWW present mode so that if we were getting the source, we
+ * get rendered HTML from now on.
+ */
+ HTOutputFormat = WWW_PRESENT;
+#ifdef USE_PRETTYSRC
+ psrc_view = FALSE;
+#endif
+
+ HTMLSetCharacterHandling(current_char_set); /* restore, for sure? */
+
+ /*
+ * Reset all of the other relevant flags. - FM
+ */
+ LYUserSpecifiedURL = FALSE; /* only set for goto's and jumps's */
+ LYJumpFileURL = FALSE; /* only set for jump's */
+ LYNoRefererForThis = FALSE; /* always reset on return here */
+ reloading = FALSE; /* set for RELOAD and NOCACHE keys */
+ HEAD_request = FALSE; /* only set for HEAD requests */
+ LYPermitURL = FALSE; /* only for LYValidate or check_realm */
+ ForcePush = FALSE; /* only set for some PRINT requests. */
+ LYforce_HTML_mode = FALSE;
+ force_old_UCLYhndl_on_reload = FALSE;
+ popped_doc = FALSE;
+ pending_form_c = -1;
+
+ }
+ /* end if (LYforce_no_cache || force_load || are_different(...)) */
+ if (dump_output_immediately) {
+ if (crawl) {
+ print_crawl_to_fd(stdout, curdoc.address, curdoc.title);
+ } else if (!dump_links_only) {
+ print_wwwfile_to_fd(stdout, FALSE, FALSE);
+ }
+ CleanupMainLoop();
+ return ((dump_server_status >= 400) ? EXIT_FAILURE : EXIT_SUCCESS);
+ }
+
+ /*
+ * If the recent_sizechange variable is set to TRUE then the window
+ * size changed recently.
+ */
+ if (recent_sizechange) {
+ /*
+ * First we need to make sure the display library - curses, slang,
+ * whatever - gets notified about the change, and gets a chance to
+ * update external structures appropriately. Hopefully the
+ * stop_curses()/start_curses() sequence achieves this, at least if
+ * the display library has a way to get the new screen size from
+ * the OS.
+ *
+ * However, at least for ncurses, the update of the internal
+ * structures will come still too late - the changed screen size is
+ * detected in doupdate(), which would only be called (indirectly
+ * through the HText_pageDisplay below) after the WINDOW structures
+ * are already filled based on the old size. So we notify the
+ * ncurses library directly here. - kw
+ */
+#if defined(NCURSES) && defined(HAVE_RESIZETERM) && defined(HAVE_WRESIZE)
+ resizeterm(LYlines, LYcols);
+ wresize(LYwin, LYlines, LYcols);
+#else
+#if 0 /* defined(PDCURSES) && defined(HAVE_XCURSES) */
+ resize_term(LYlines, LYcols);
+ if (LYwin != 0)
+ LYwin = resize_window(LYwin, LYlines, LYcols);
+ refresh();
+#else
+ stop_curses();
+ start_curses();
+ LYclear();
+#endif
+#endif
+ refresh_screen = TRUE; /* to force a redraw */
+ if (HTMainText) /* to REALLY force it... - kw */
+ HText_setStale(HTMainText);
+ recent_sizechange = FALSE;
+
+ LYSetDisplayLines();
+ }
+
+ if (www_search_result != -1) {
+ /*
+ * This was a WWW search, set the line to the result of the search.
+ */
+ LYSetNewline(www_search_result);
+ www_search_result = -1; /* reset */
+ }
+
+ if (first_file == TRUE) {
+ /*
+ * We can never again have the first file.
+ */
+ first_file = FALSE;
+
+ /*
+ * Set the startrealm, and deal as best we can with preserving
+ * forced HTML mode for a local startfile. - FM
+ */
+ temp = HTParse(curdoc.address, "",
+ PARSE_ACCESS + PARSE_HOST + PARSE_PUNCTUATION);
+ if (isEmpty(temp)) {
+ StrAllocCopy(startrealm, NO_NOTHING);
+ } else {
+ StrAllocCopy(startrealm, temp);
+ FREE(temp);
+ if (!(temp = HTParse(curdoc.address, "",
+ PARSE_PATH + PARSE_PUNCTUATION))) {
+ LYAddHtmlSep(&startrealm);
+ } else {
+ if (forced_HTML_mode &&
+ !dump_output_immediately &&
+ !curdoc.bookmark &&
+ isFILE_URL(curdoc.address) &&
+ strlen(temp) > 1) {
+ /*
+ * We forced HTML for a local startfile which is not a
+ * bookmark file and has a path of at least two
+ * letters. If it doesn't have a suffix mapped to
+ * text/html, we'll set the entire path (including the
+ * lead slash) as a "suffix" mapped to text/html to
+ * ensure it is always treated as an HTML source file.
+ * We are counting on a tail match to this full path
+ * for some other URL fetched during the session having
+ * too low a probability to worry about, but it could
+ * happen. - FM
+ */
+ HTAtom *encoding;
+
+ if (HTFileFormat(temp, &encoding, NULL) != WWW_HTML) {
+ HTSetSuffix(temp, STR_HTML, "8bit", 1.0);
+ }
+ }
+ if ((cp = strrchr(temp, '/')) != NULL) {
+ *(cp + 1) = '\0';
+ StrAllocCat(startrealm, temp);
+ }
+ }
+ }
+ FREE(temp);
+ CTRACE((tfp, "Starting realm is '%s'\n\n", startrealm));
+ if (traversal) {
+ /*
+ * Set up the crawl output stuff.
+ */
+ if (curdoc.address && !lookup_link(curdoc.address)) {
+ if (!isLYNXIMGMAP(curdoc.address))
+ crawl_ok = TRUE;
+ add_to_table(curdoc.address);
+ }
+ /*
+ * Set up the traversal_host comparison string.
+ */
+ if (StrNCmp((curdoc.address ? curdoc.address : "NULL"),
+ "http", 4)) {
+ StrAllocCopy(traversal_host, NO_NOTHING);
+ } else if (check_realm) {
+ StrAllocCopy(traversal_host, startrealm);
+ } else {
+ temp = HTParse(curdoc.address, "",
+ PARSE_ACCESS + PARSE_HOST + PARSE_PUNCTUATION);
+ if (isEmpty(temp)) {
+ StrAllocCopy(traversal_host, NO_NOTHING);
+ } else {
+ StrAllocCopy(traversal_host, temp);
+ LYAddHtmlSep(&traversal_host);
+ }
+ FREE(temp);
+ }
+ CTRACE((tfp, "Traversal host is '%s'\n\n", traversal_host));
+ }
+ if (startfile) {
+ /*
+ * If homepage was not equated to startfile, make the homepage
+ * URL the first goto entry. - FM
+ */
+ if (homepage && strcmp(startfile, homepage))
+ HTAddGotoURL(homepage);
+ /*
+ * If we are not starting up with startfile (e.g., had -book),
+ * or if we are using the startfile and it has no POST content,
+ * make the startfile URL a goto entry. - FM
+ */
+ if (strcmp(startfile, newdoc.address) ||
+ newdoc.post_data == NULL)
+ HTAddGotoURL(startfile);
+ }
+ if (TRACE) {
+ refresh_screen = TRUE;
+ if (!LYTraceLogFP || trace_mode_flag) {
+ LYSleepAlert();
+ }
+ }
+ }
+#ifdef USE_SOURCE_CACHE
+ /*
+ * If the parse settings have changed since this HText was
+ * generated, we need to reparse and redraw it. -dsb
+ *
+ * Should be configured to avoid shock for experienced lynx users.
+ * Currently enabled for cached sources only.
+ */
+ if (HTdocument_settings_changed()) {
+ if (HTcan_reparse_document()) {
+ HTInfoMsg(gettext("Reparsing document under current settings..."));
+ reparse_document();
+ } else {
+ /*
+ * Urk. I have no idea how to recover from a failure here.
+ * At a guess, I'll try reloading. -dsb
+ */
+ /* currently disabled ***
+ HTUserMsg(gettext("Reparsing document under current settings..."));
+ cmd = LYK_RELOAD;
+ goto new_cmd;
+ */
+ }
+ }
+
+ if (from_source_cache) {
+ from_source_cache = FALSE; /* reset */
+ curdoc.line = -1; /* so curdoc.line != Newline, see below */
+ }
+#endif
+
+ /*
+ * If the curdoc.line is different than Newline then there must have
+ * been a change since last update. Run HText_pageDisplay() to create
+ * a fresh screen of text output.
+ *
+ * If we got new HTMainText go this way. All display_partial calls
+ * ends here for final redraw.
+ */
+ if (curdoc.line != LYGetNewline()) {
+#ifdef INACTIVE_INPUT_STYLE_VH
+ textinput_redrawn = FALSE;
+#endif
+
+ refresh_screen = FALSE;
+
+ HText_pageDisplay(LYGetNewline(), prev_target->str);
+
+#ifdef DIRED_SUPPORT
+ if (lynx_edit_mode && nlinks > 0 && !HTList_isEmpty(tagged))
+ showtags(tagged);
+#endif /* DIRED_SUPPORT */
+
+ /*
+ * Check if there is more info below this page.
+ */
+ more_text = HText_canScrollDown();
+
+ if (newdoc.link < 0)
+ goto_line(LYGetNewline());
+ LYSetNewline(HText_getTopOfScreen() + 1);
+ curdoc.line = LYGetNewline();
+
+ if (curdoc.title == NULL) {
+ /*
+ * If we don't yet have a title, try to get it, or set to that
+ * for newdoc.title. - FM
+ */
+ if (HText_getTitle()) {
+ StrAllocCopy(curdoc.title, HText_getTitle());
+ } else {
+ StrAllocCopy(curdoc.title, newdoc.title);
+ }
+ }
+
+ /*
+ * If the request is to highlight a link which is counted from the
+ * start of document, correct the link number:
+ */
+ if (newdoc_link_is_absolute) {
+ newdoc_link_is_absolute = FALSE;
+ if (curdoc.line > 1)
+ newdoc.link -= HText_LinksInLines(HTMainText, 1,
+ curdoc.line - 1);
+ }
+
+ if (arrowup) {
+ /*
+ * arrowup is set if we just came up from a page below.
+ */
+ curdoc.link = nlinks - 1;
+ arrowup = FALSE;
+ } else {
+ curdoc.link = newdoc.link;
+ if (curdoc.link >= nlinks) {
+ curdoc.link = nlinks - 1;
+ } else if (curdoc.link < 0 && nlinks > 0) {
+ /*
+ * We may have popped a doc (possibly in local_dired) which
+ * didn't have any links when it was pushed, but does have
+ * links now (e.g., a file was created). Code below
+ * assumes that curdoc.link is valid and that
+ * (curdoc.link==-1) only occurs if (nlinks==0) is true. -
+ * KW
+ */
+ curdoc.link = 0;
+ }
+ }
+
+ show_help = FALSE; /* reset */
+ newdoc.line = 1;
+ newdoc.link = 0;
+ curdoc.line = LYGetNewline(); /* set */
+ } else if (newdoc.link < 0) {
+ newdoc.link = 0; /* ...just in case getfile set this */
+ }
+
+ /*
+ * Refresh the screen if necessary.
+ */
+ if (refresh_screen) {
+#if defined(FANCY_CURSES) || defined (USE_SLANG)
+ if (enable_scrollback) {
+ LYclear();
+ } else {
+ LYerase();
+ }
+#else
+ LYclear();
+#endif /* FANCY_CURSES || USE_SLANG */
+ HText_pageDisplay(LYGetNewline(), prev_target->str);
+
+#ifdef DIRED_SUPPORT
+ if (lynx_edit_mode && nlinks > 0 && !HTList_isEmpty(tagged))
+ showtags(tagged);
+#endif /* DIRED_SUPPORT */
+
+ /*
+ * Check if there is more info below this page.
+ */
+ more_text = HText_canScrollDown();
+
+ /*
+ * Adjust curdoc.link as above; nlinks may have changed, if the
+ * refresh_screen flag was set as a result of a size change. Code
+ * below assumes that curdoc.link is valid and that
+ * (curdoc.link==-1) only occurs if (nlinks==0) is true. - kw
+ */
+ if (curdoc.link >= nlinks) {
+ curdoc.link = nlinks - 1;
+ } else if (curdoc.link < 0 && nlinks > 0) {
+ curdoc.link = 0;
+ }
+
+ if (user_mode == NOVICE_MODE)
+ noviceline(more_text); /* print help message */
+ refresh_screen = FALSE;
+
+ }
+
+ curlink_is_editable = (BOOLEAN)
+ (nlinks > 0 &&
+ LinkIsTextLike(curdoc.link));
+
+ use_last_tfpos = (BOOLEAN)
+ (curlink_is_editable &&
+ (real_cmd == LYK_LPOS_PREV_LINK ||
+ real_cmd == LYK_LPOS_NEXT_LINK));
+
+#ifdef TEXTFIELDS_MAY_NEED_ACTIVATION
+ if (!textfields_need_activation)
+ textinput_activated = TRUE;
+#endif
+
+#if defined(WIN_EX) /* 1997/10/08 (Wed) 14:52:06 */
+ if (nlinks > 0) {
+ char *p = "LYNX (unknown link type)";
+
+ /* Show the URL & kanji code . */
+ if (strlen(links[curdoc.link].lname) == 0) {
+
+ if (links[curdoc.link].type == WWW_FORM_LINK_TYPE) {
+
+ switch (links[curdoc.link].l_form->type) {
+ case F_TEXT_SUBMIT_TYPE:
+ case F_SUBMIT_TYPE:
+ case F_IMAGE_SUBMIT_TYPE:
+ p = "[SUBMIT]";
+ break;
+ case F_PASSWORD_TYPE:
+ p = "Password";
+ break;
+ case F_OPTION_LIST_TYPE:
+ p = "Option list";
+ break;
+ case F_CHECKBOX_TYPE:
+ p = "Check box";
+ break;
+ case F_RADIO_TYPE:
+ p = "[Radio]";
+ break;
+ case F_RESET_TYPE:
+ p = "[Reset]";
+ break;
+ case F_TEXT_TYPE:
+ p = "Text input";
+ break;
+ case F_TEXTAREA_TYPE:
+ p = "Text input lines";
+ break;
+ default:
+ break;
+ }
+ set_ws_title(p);
+ }
+ } else {
+ if (user_mode == ADVANCED_MODE || user_mode == MINIMAL_MODE) {
+ p = curdoc.title;
+ } else {
+ p = links[curdoc.link].lname;
+ }
+
+ if (strlen(p) < ((sizeof(sjis_buff) / 2) - 1)) {
+ strcpy(temp_buff, p);
+ if (StrChr(temp_buff, '%')) {
+ HTUnEscape(temp_buff);
+ }
+ str_sjis(sjis_buff, temp_buff);
+ set_ws_title(LYElideString(sjis_buff, 10));
+ }
+ }
+ } else {
+ if (strlen(curdoc.address) < sizeof(temp_buff) - 1) {
+ if (user_mode == ADVANCED_MODE || user_mode == MINIMAL_MODE) {
+ str_sjis(temp_buff, curdoc.title);
+ } else {
+ strcpy(temp_buff, curdoc.address);
+ }
+ set_ws_title(HTUnEscape(temp_buff));
+ }
+ }
+#endif /* WIN_EX */
+
+ /*
+ * Report unread or new mail, if appropriate.
+ */
+ if (check_mail && !no_mail)
+ LYCheckMail();
+
+ /*
+ * If help is not on the screen, then put a message on the screen to
+ * tell the user other misc info.
+ */
+ if (!show_help) {
+ show_main_statusline(links[curdoc.link],
+ ((curlink_is_editable &&
+ textinput_activated)
+ ? FOR_INPUT
+ : FOR_PANEL));
+ } else {
+ show_help = FALSE;
+ }
+
+ if (nlinks > 0) {
+ /*
+ * Highlight current link, unless it is an active text input field.
+ */
+ if (!curlink_is_editable) {
+ LYhighlight(TRUE, curdoc.link, prev_target->str);
+#ifndef INACTIVE_INPUT_STYLE_VH
+ } else if (!textinput_activated) {
+ LYhighlight(TRUE, curdoc.link, prev_target->str);
+#endif
+ }
+ }
+
+ if (traversal) {
+ /*
+ * Don't go interactively into forms, or accept keystrokes from the
+ * user
+ */
+ if (crawl && crawl_ok) {
+ crawl_ok = FALSE;
+#ifdef FNAMES_8_3
+ sprintf(cfile, "lnk%05d.dat", crawl_count);
+#else
+ sprintf(cfile, "lnk%08d.dat", crawl_count);
+#endif /* FNAMES_8_3 */
+ crawl_count = crawl_count + 1;
+ if ((cfp = LYNewTxtFile(cfile)) != NULL) {
+ print_crawl_to_fd(cfp, curdoc.address, curdoc.title);
+ LYCloseOutput(cfp);
+ } else {
+#ifdef UNIX
+ FILE *fp = (dump_output_immediately
+ ? stderr
+ : stdout);
+
+#else
+ FILE *fp = stdout;
+#endif
+ if (!dump_output_immediately)
+ cleanup();
+ fprintf(fp,
+ gettext("Fatal error - could not open output file %s\n"),
+ cfile);
+ CleanupMainLoop();
+ if (!dump_output_immediately) {
+ exit_immediately(EXIT_FAILURE);
+ }
+ return (EXIT_FAILURE);
+ }
+ }
+ } else {
+ /*
+ * Normal, non-traversal handling.
+ */
+ if (curlink_is_editable &&
+ (textinput_activated || pending_form_c != -1)) {
+ if (pending_form_c != -1) {
+ real_c = pending_form_c;
+ pending_form_c = -1;
+ } else {
+ /*
+ * Replace novice lines if in NOVICE_MODE.
+ */
+ if (user_mode == NOVICE_MODE) {
+ form_noviceline(FormIsReadonly(links[curdoc.link].l_form));
+ }
+ real_c = change_form_link(curdoc.link,
+ &newdoc, &refresh_screen,
+ use_last_tfpos, FALSE);
+ }
+#ifdef TEXTFIELDS_MAY_NEED_ACTIVATION
+ if (textfields_need_activation)
+ textinput_activated = FALSE;
+#ifdef INACTIVE_INPUT_STYLE_VH
+ textinput_redrawn = FALSE;
+#endif
+#endif
+
+ c = (real_c == LKC_DONE) ? DO_NOTHING : LKC_TO_C(real_c);
+ if (c != DO_NOTHING &&
+ peek_mouse_link() != -1 && peek_mouse_link() != -2)
+ old_c = 0;
+ if (peek_mouse_link() >= 0 &&
+ LKC_TO_LAC(keymap, real_c) != LYK_CHANGE_LINK) {
+ do_change_link();
+ if ((c == '\n' || c == '\r') &&
+ LinkIsTextLike(curdoc.link) &&
+ !textfields_need_activation) {
+ c = DO_NOTHING;
+ }
+#ifdef TEXTFIELDS_MAY_NEED_ACTIVATION
+ } else if (LinkIsTextarea(curdoc.link)
+ && textfields_need_activation
+ && !FormIsReadonly(links[curdoc.link].l_form)
+ && peek_mouse_link() < 0 &&
+ (((LKC_TO_LAC(keymap, real_c) == LYK_NEXT_LINK ||
+#ifdef TEXTAREA_AUTOGROW
+ LKC_TO_LAC(keymap, real_c) == LYK_ACTIVATE ||
+#endif
+ LKC_TO_LAC(keymap, real_c) == LYK_LPOS_NEXT_LINK ||
+ LKC_TO_LAC(keymap, real_c) == LYK_DOWN_LINK) &&
+ ((curdoc.link < nlinks - 1 &&
+ LinkIsTextarea(curdoc.link + 1)
+ && (links[curdoc.link].l_form->number ==
+ links[curdoc.link + 1].l_form->number)
+ && strcmp(links[curdoc.link].l_form->name,
+ links[curdoc.link + 1].l_form->name)
+ == 0) ||
+ (curdoc.link == nlinks - 1 && more_text &&
+ HText_TAHasMoreLines(curdoc.link, 1)))) ||
+ ((LKC_TO_LAC(keymap, real_c) == LYK_PREV_LINK ||
+ LKC_TO_LAC(keymap, real_c) == LYK_LPOS_PREV_LINK ||
+ LKC_TO_LAC(keymap, real_c) == LYK_UP_LINK) &&
+ ((curdoc.link > 0 &&
+ LinkIsTextarea(curdoc.link - 1)
+ && (links[curdoc.link].l_form->number ==
+ links[curdoc.link - 1].l_form->number) &&
+ strcmp(links[curdoc.link].l_form->name,
+ links[curdoc.link - 1].l_form->name) == 0)
+ || (curdoc.link == 0 && curdoc.line > 1 &&
+ HText_TAHasMoreLines(curdoc.link, -1)))))) {
+ textinput_activated = TRUE;
+#ifdef TEXTAREA_AUTOGROW
+ if ((c == '\n' || c == '\r') &&
+ LKC_TO_LAC(keymap, real_c) == LYK_ACTIVATE)
+ c = LAC_TO_LKC0(LYK_NEXT_LINK);
+#endif /* TEXTAREA_AUTOGROW */
+#endif /* TEXTFIELDS_MAY_NEED_ACTIVATION */
+ } else
+ switch (c) {
+ case '\n':
+ case '\r':
+#ifdef TEXTAREA_AUTOGROW
+ /*
+ * If on the bottom line of a TEXTAREA, and the user
+ * hit the ENTER key, we add a new line/anchor
+ * automatically, positioning the cursor on it.
+ *
+ * If at the bottom of the screen, we effectively
+ * perform an LYK_DOWN_HALF-like operation, then move
+ * down to the new line we just added. --KED 02/14/99
+ *
+ * [There is some redundancy and non-standard
+ * indentation in the monster-if() below. This is
+ * intentional ... to try and improve the
+ * "readability" (such as it is). Caveat emptor to
+ * anyone trying to change it.]
+ */
+ if (LinkIsTextarea(curdoc.link)
+ && ((curdoc.link == nlinks - 1 &&
+ !(more_text &&
+ HText_TAHasMoreLines(curdoc.link, 1)))
+ ||
+ ((curdoc.link < nlinks - 1) &&
+ !LinkIsTextarea(curdoc.link + 1))
+ ||
+ ((curdoc.link < nlinks - 1) &&
+ (LinkIsTextarea(curdoc.link + 1)
+ && ((links[curdoc.link].l_form->number !=
+ links[curdoc.link + 1].l_form->number) ||
+ (strcmp(links[curdoc.link].l_form->name,
+ links[curdoc.link + 1].l_form->name)
+ != 0)))))) {
+
+ HText_ExpandTextarea(&links[curdoc.link], 1);
+
+ if (links[curdoc.link].ly < display_lines) {
+ refresh_screen = TRUE;
+ } else {
+ LYChgNewline(display_lines / 2);
+ if (nlinks > 0 && curdoc.link > -1 &&
+ links[curdoc.link].ly > display_lines / 2) {
+ newdoc.link = curdoc.link;
+ for (i = 0;
+ links[i].ly <= (display_lines / 2);
+ i++)
+ --newdoc.link;
+ newdoc.link++;
+ }
+ }
+#ifdef TEXTFIELDS_MAY_NEED_ACTIVATION
+ if (textfields_need_activation) {
+ textinput_activated = TRUE;
+ textfields_need_activation = textfields_activation_option;
+#ifdef INACTIVE_INPUT_STYLE_VH
+ textinput_redrawn = TRUE;
+#endif
+ };
+#endif
+
+ }
+#endif /* TEXTAREA_AUTOGROW */
+
+ /*
+ * Make return in input field (if it was returned by
+ * change_form_link) act as LYK_NEXT_LINK, independent
+ * of what key (if any) is mapped to LYK_NEXT_LINK. -
+ * kw
+ */
+ c = LAC_TO_LKC0(LYK_NEXT_LINK);
+ break;
+ default:
+
+ if (old_c != c && old_c != real_c && c != real_c)
+ real_c = c;
+ }
+ } else {
+#if defined(TEXTFIELDS_MAY_NEED_ACTIVATION) && defined(INACTIVE_INPUT_STYLE_VH)
+ if (curlink_is_editable && !textinput_redrawn) {
+ /*draw the text entry, but don't activate it */
+ textinput_redrawn = TRUE;
+ change_form_link_ex(curdoc.link,
+ &newdoc, &refresh_screen,
+ use_last_tfpos, FALSE, TRUE);
+ if (LYShowCursor) {
+ LYmove(links[curdoc.link].ly,
+ ((links[curdoc.link].lx > 0) ?
+ (links[curdoc.link].lx - 1) : 0));
+ } else {
+ LYHideCursor();
+ }
+ }
+#endif /* TEXTFIELDS_MAY_NEED_ACTIVATION && INACTIVE_INPUT_STYLE_VH */
+ /*
+ * Get a keystroke from the user. Save the last keystroke to
+ * avoid redundant error reporting.
+ */
+ real_c = c = LYgetch(); /* get user input */
+
+ if (c != last_key)
+ key_count = 0;
+ key_count++;
+ last_key = c;
+#ifndef VMS
+ if (c == 3) { /* ^C */
+ /*
+ * This shouldn't happen. We'll try to deal with whatever
+ * bug caused it. - FM
+ */
+ signal(SIGINT, cleanup_sig);
+ old_c = 0;
+ cmd = LYK_QUIT;
+ goto new_cmd;
+ }
+#endif /* !VMS */
+ if (LKC_HAS_ESC_MOD(c) && EditBinding(c) != LYE_FORM_PASS) {
+ /*
+ * If ESC + <key> was read (and not recognized as a
+ * terminal escape sequence for another key), ignore the
+ * ESC modifier and act on <key> only if the line editor
+ * binding would have passed the same ESC-modified
+ * lynxkeycode back to us if it had been pressed in a text
+ * input field. Otherwise set interesting part so that it
+ * will map to 0, to prevent that ESC + <key> acts like
+ * <key>, which might be unexpected. - kw
+ */
+ c = (c & ~LKC_MASK) | LAC_TO_LKC(0);
+ }
+ if (old_c != real_c) {
+ old_c = 0;
+ }
+ }
+ }
+
+#ifdef VMS
+ if (HadVMSInterrupt) {
+ HadVMSInterrupt = FALSE;
+ c = DO_NOTHING;
+ }
+#else
+ if (recent_sizechange) {
+ if (c <= 0)
+ c = DO_NOTHING;
+ }
+#endif /* VMS */
+
+ new_keyboard_input:
+ /*
+ * A goto point for new input without going back through the getch()
+ * loop.
+ */
+ if (traversal) {
+ if ((c = DoTraversal(c, &crawl_ok)) < 0) {
+ CleanupMainLoop();
+ return (EXIT_FAILURE);
+ }
+ }
+ /* traversal */
+#ifdef WIN_EX
+ if (c == DO_NOTHING)
+ cmd = LYK_DO_NOTHING;
+ else
+#endif
+ cmd = LKC_TO_LAC(keymap, c); /* adds 1 to map EOF to 0 */
+
+#if defined(DIRED_SUPPORT) && defined(OK_OVERRIDE)
+ if (lynx_edit_mode && !no_dired_support && LKC_TO_LAC(key_override, c))
+ cmd = LKC_TO_LAC(key_override, c);
+#endif /* DIRED_SUPPORT && OK_OVERRIDE */
+
+ real_cmd = cmd;
+
+ /*
+ * A goto point for new input without going back through the getch()
+ * loop.
+ */
+ new_cmd:
+
+ force_old_UCLYhndl_on_reload = FALSE;
+ CTRACE_FLUSH(tfp);
+
+ if (cmd != LYK_UP_LINK && cmd != LYK_DOWN_LINK)
+ follow_col = -1;
+
+ CTRACE((tfp, "Handling key as %s\n",
+ ((LYKeycodeToKcmd((LYKeymapCode) cmd) != 0)
+ ? LYKeycodeToKcmd((LYKeymapCode) cmd)->name
+ : "unknown")));
+ switch (cmd) {
+ case -1:
+ HTUserMsg(COMMAND_UNKNOWN);
+ break;
+ case 0: /* unmapped character */
+ default:
+ if (curdoc.link >= 0 && curdoc.link < nlinks &&
+ LinkIsTextLike(curdoc.link)) {
+
+#ifdef TEXTFIELDS_MAY_NEED_ACTIVATION
+ if (textfields_need_activation) {
+ show_main_statusline(links[curdoc.link], FOR_PANEL);
+#ifdef INACTIVE_INPUT_STYLE_VH
+ textinput_redrawn = FALSE;
+#endif
+ } else
+#endif
+ show_main_statusline(links[curdoc.link], FOR_INPUT);
+ } else if (more_text) {
+ HTInfoMsg(MOREHELP);
+ } else {
+ HTInfoMsg(HELP);
+ }
+ show_help = TRUE;
+
+ if (TRACE) {
+ sprintf(cfile, "%d", c);
+ LYaddstr(cfile); /* show the user input */
+ cfile[0] = '\0';
+ }
+ break;
+
+ case LYK_COMMAND:
+ cmd = handle_LYK_COMMAND(&user_input_buffer);
+ goto new_cmd;
+
+ case LYK_INTERRUPT:
+ /*
+ * No network transmission to interrupt - 'til we multithread.
+ */
+ break;
+
+ case LYK_F_LINK_NUM:
+ c = '\0';
+ /* FALLTHRU */
+ case LYK_1: /* FALLTHRU */
+ case LYK_2: /* FALLTHRU */
+ case LYK_3: /* FALLTHRU */
+ case LYK_4: /* FALLTHRU */
+ case LYK_5: /* FALLTHRU */
+ case LYK_6: /* FALLTHRU */
+ case LYK_7: /* FALLTHRU */
+ case LYK_8: /* FALLTHRU */
+ case LYK_9:
+ handle_LYK_digit(c, &force_load, &old_c, real_c, &try_internal);
+ break;
+
+ case LYK_SOURCE: /* toggle view source mode */
+ handle_LYK_SOURCE(&ownerS_address);
+ break;
+
+ case LYK_CHANGE_CENTER: /* ^Q */
+
+ if (no_table_center) {
+ no_table_center = FALSE;
+ HTInfoMsg(gettext("TABLE center enable."));
+ } else {
+ no_table_center = TRUE;
+ HTInfoMsg(gettext("TABLE center disable."));
+ }
+ /* FALLTHRU */
+
+ case LYK_RELOAD: /* control-R to reload and refresh */
+ handle_LYK_RELOAD(real_cmd);
+ break;
+
+ case LYK_HISTORICAL: /* toggle 'historical' comments parsing */
+ handle_LYK_HISTORICAL();
+ break;
+
+ case LYK_MINIMAL: /* toggle 'minimal' comments parsing */
+ handle_LYK_MINIMAL();
+ break;
+
+ case LYK_SOFT_DQUOTES:
+ handle_LYK_SOFT_DQUOTES();
+ break;
+
+ case LYK_SWITCH_DTD:
+ handle_LYK_SWITCH_DTD();
+ break;
+
+ case LYK_QUIT: /* quit */
+ if (handle_LYK_QUIT()) {
+ CleanupMainLoop();
+ return (EXIT_SUCCESS);
+ }
+ break;
+
+ case LYK_ABORT: /* don't ask the user about quitting */
+ CleanupMainLoop();
+ return (EXIT_SUCCESS);
+
+ case LYK_NEXT_PAGE: /* next page */
+ handle_LYK_NEXT_PAGE(&old_c, real_c);
+ break;
+
+ case LYK_PREV_PAGE: /* page up */
+ handle_LYK_PREV_PAGE(&old_c, real_c);
+ break;
+
+ case LYK_UP_TWO:
+ handle_LYK_UP_TWO(&arrowup, &old_c, real_c);
+ break;
+
+ case LYK_DOWN_TWO:
+ handle_LYK_DOWN_TWO(&old_c, real_c);
+ break;
+
+ case LYK_UP_HALF:
+ handle_LYK_UP_HALF(&arrowup, &old_c, real_c);
+ break;
+
+ case LYK_DOWN_HALF:
+ handle_LYK_DOWN_HALF(&old_c, real_c);
+ break;
+
+#ifdef CAN_CUT_AND_PASTE
+ case LYK_TO_CLIPBOARD: /* ^S */
+ {
+ char *s;
+ int ch2;
+
+ /* The logic resembles one of ADD_BOOKMARK */
+ if (nlinks > 0 && links[curdoc.link].lname
+ && links[curdoc.link].type != WWW_FORM_LINK_TYPE) {
+ /* Makes sense to copy a link */
+ _statusline("Copy D)ocument's or L)ink's URL to clipboard or C)ancel?");
+ ch2 = LYgetch_single();
+ if (ch2 == 'D')
+ s = curdoc.address;
+ else if (ch2 == 'C')
+ break;
+ else
+ s = links[curdoc.link].lname;
+ } else
+ s = curdoc.address;
+ if (isEmpty(s))
+ HTInfoMsg(gettext("Current URL is empty."));
+ if (put_clip(s))
+ HTInfoMsg(gettext("Copy to clipboard failed."));
+ else if (s == curdoc.address)
+ HTInfoMsg(gettext("Document URL put to clipboard."));
+ else
+ HTInfoMsg(gettext("Link URL put to clipboard."));
+ }
+ break;
+
+ case LYK_PASTE_URL:
+ if (no_goto && !LYValidate) { /* Go to not allowed. - FM */
+ HTUserMsg(GOTO_DISALLOWED);
+ } else {
+ unsigned char *s = (unsigned char *) get_clip_grab(), *e, *t;
+ char *buf;
+ int len2;
+
+ if (!s)
+ break;
+ len2 = (int) strlen((const char *) s);
+ e = s + len2;
+ while (s < e && StrChr(" \t\n\r", *s))
+ s++;
+ while (s < e && StrChr(" \t\n\r", e[-1]))
+ e--;
+ if (s[0] == '<' && e > s && e[-1] == '>') {
+ s++;
+ e--;
+ if (!strncasecomp((const char *) s, "URL:", 4))
+ s += 4;
+ }
+ if (s >= e) {
+ HTInfoMsg(gettext("No URL in the clipboard."));
+ break;
+ }
+ len = (unsigned) (e - s + 1);
+ if (len < MAX_LINE)
+ len = MAX_LINE; /* Required for do_check_goto_URL() */
+ buf = typeMallocn(char, len);
+
+ LYStrNCpy(buf, (const char *) s, (e - s));
+ t = (unsigned char *) buf;
+
+ while (s < e) {
+ if (StrChr(" \t\n\r", *s)) {
+ int nl2 = 0; /* Keep whitespace without NL - file names! */
+ unsigned char *s1 = s;
+
+ while (StrChr(" \t\n\r", *s)) {
+ if (!nl2 && *s == '\n')
+ nl2 = 1;
+ s++;
+ }
+ if (!nl2) {
+ while (s1 < s) {
+ if (*s1 != '\r' && *s1 != '\n')
+ *t = *s1;
+ t++, s1++;
+ }
+ }
+ } else
+ *t++ = *s++;
+ }
+ *t = '\0';
+ get_clip_release();
+ BStrCopy0(user_input_buffer, buf);
+ do_check_goto_URL(&user_input_buffer, &temp, &force_load);
+ free(buf);
+ }
+ break;
+#endif
+
+#ifdef KANJI_CODE_OVERRIDE
+ case LYK_CHG_KCODE:
+ if (LYRawMode && (HTCJK == JAPANESE)) {
+ switch (last_kcode) {
+ case NOKANJI:
+ last_kcode = SJIS;
+ break;
+ case SJIS:
+ last_kcode = EUC;
+ break;
+ case EUC:
+ last_kcode = NOKANJI;
+ break;
+ default:
+ break;
+ }
+ }
+ LYmove(0, 0);
+ lynx_start_title_color();
+ LYaddstr(str_kcode(last_kcode));
+ lynx_stop_title_color();
+
+ break;
+#endif
+
+ case LYK_REFRESH:
+ refresh_screen = TRUE;
+ lynx_force_repaint();
+ break;
+
+ case LYK_HOME:
+ if (curdoc.line > 1) {
+ LYSetNewline(1);
+ } else {
+ cmd = LYK_PREV_PAGE;
+ goto new_cmd;
+ }
+ break;
+
+ case LYK_END:
+ i = HText_getNumOfLines() - display_lines + 2;
+ if (i >= 1 && LYGetNewline() != i) {
+ LYSetNewline(i); /* go to end of file */
+ arrowup = TRUE; /* position on last link */
+ } else {
+ cmd = LYK_NEXT_PAGE;
+ goto new_cmd;
+ }
+ break;
+
+ case LYK_FIRST_LINK:
+ handle_LYK_FIRST_LINK();
+ break;
+
+ case LYK_LAST_LINK:
+ handle_LYK_LAST_LINK();
+ break;
+
+ case LYK_PREV_LINK:
+ case LYK_LPOS_PREV_LINK:
+ handle_LYK_PREV_LINK(&arrowup, &old_c, real_c);
+ break;
+
+ case LYK_NEXT_LINK:
+ case LYK_LPOS_NEXT_LINK:
+ handle_LYK_NEXT_LINK(c, &old_c, real_c);
+ break;
+
+ case LYK_FASTFORW_LINK:
+ handle_LYK_FASTFORW_LINK(&old_c, real_c);
+ break;
+
+ case LYK_FASTBACKW_LINK:
+ if (handle_LYK_FASTBACKW_LINK(&cmd, &old_c, real_c))
+ goto new_cmd;
+ break;
+
+ case LYK_UP_LINK:
+ handle_LYK_UP_LINK(&follow_col, &arrowup, &old_c, real_c);
+ break;
+
+ case LYK_DOWN_LINK:
+ handle_LYK_DOWN_LINK(&follow_col, &old_c, real_c);
+ break;
+
+ case LYK_CHANGE_LINK:
+ do_change_link();
+#if defined(TEXTFIELDS_MAY_NEED_ACTIVATION) && defined(INACTIVE_INPUT_STYLE_VH)
+ if (textfields_need_activation)
+ textinput_redrawn = FALSE;
+#endif /* TEXTFIELDS_MAY_NEED_ACTIVATION && INACTIVE_INPUT_STYLE_VH */
+ break;
+
+ case LYK_RIGHT_LINK:
+ handle_LYK_RIGHT_LINK();
+ break;
+
+ case LYK_LEFT_LINK:
+ handle_LYK_LEFT_LINK();
+ break;
+
+ case LYK_COOKIE_JAR: /* show the cookie jar */
+ if (handle_LYK_COOKIE_JAR(&cmd))
+ goto new_cmd;
+ break;
+
+#ifdef USE_CACHEJAR
+ case LYK_CACHE_JAR: /* show the cache jar */
+ if (handle_LYK_CACHE_JAR(&cmd))
+ goto new_cmd;
+ break;
+#endif
+
+ case LYK_HISTORY: /* show the history page */
+ if (handle_LYK_HISTORY(ForcePush))
+ break;
+
+ /* FALLTHRU */
+ case LYK_PREV_DOC: /* back up a level */
+ switch (handle_PREV_DOC(&cmd, &old_c, real_c)) {
+ case 1:
+ CleanupMainLoop();
+ return (EXIT_SUCCESS);
+ case 2:
+ goto new_cmd;
+ }
+ break;
+
+ case LYK_NEXT_DOC: /* undo back up a level */
+ handle_NEXT_DOC();
+ break;
+
+ case LYK_NOCACHE: /* Force submission of form or link with no-cache */
+ if (!handle_LYK_NOCACHE(&old_c, real_c))
+ break;
+
+ /* FALLTHRU */
+ case LYK_ACTIVATE: /* follow a link */
+ case LYK_MOUSE_SUBMIT: /* follow a link, submit TEXT_SUBMIT input */
+ switch (handle_LYK_ACTIVATE(&c,
+ cmd,
+ &try_internal,
+ &refresh_screen,
+ &force_load,
+ real_cmd)) {
+ case 1:
+ continue;
+ case 2:
+ goto new_keyboard_input;
+ case 3:
+ pending_form_c = c;
+ break;
+ }
+ break;
+
+ case LYK_SUBMIT:
+ handle_LYK_SUBMIT(curdoc.link, &newdoc, &refresh_screen);
+ break;
+
+ case LYK_RESET:
+ handle_LYK_RESET(curdoc.link, &refresh_screen);
+ break;
+
+ case LYK_ELGOTO: /* edit URL of current link and go to it */
+ if (handle_LYK_ELGOTO(&ch, &user_input_buffer, &temp, &old_c, real_c))
+ do_check_goto_URL(&user_input_buffer, &temp, &force_load);
+ break;
+
+ case LYK_ECGOTO: /* edit current URL and go to to it */
+ if (handle_LYK_ECGOTO(&ch, &user_input_buffer, &temp, &old_c, real_c))
+ do_check_goto_URL(&user_input_buffer, &temp, &force_load);
+ break;
+
+ case LYK_GOTO: /* 'g' to goto a random URL */
+ if (handle_LYK_GOTO(&ch, &user_input_buffer, &temp, &recall,
+ &URLTotal, &URLNum, &FirstURLRecall, &old_c,
+ real_c)) {
+ if (do_check_recall(ch, &user_input_buffer, &temp, URLTotal,
+ &URLNum, recall, &FirstURLRecall))
+ do_check_goto_URL(&user_input_buffer, &temp, &force_load);
+ }
+ break;
+
+ case LYK_DWIMHELP: /* show context-dependent help file */
+ handle_LYK_DWIMHELP(&cshelpfile);
+ /* FALLTHRU */
+
+ case LYK_HELP: /* show help file */
+ handle_LYK_HELP(&cshelpfile);
+ break;
+
+ case LYK_INDEX: /* index file */
+ handle_LYK_INDEX(&old_c, real_c);
+ break;
+
+ case LYK_MAIN_MENU: /* return to main screen */
+ handle_LYK_MAIN_MENU(&old_c, real_c);
+ break;
+
+#ifdef EXP_NESTED_TABLES
+ case LYK_NESTED_TABLES:
+ if (handle_LYK_NESTED_TABLES(&cmd))
+ goto new_cmd;
+ break;
+#endif
+ case LYK_OPTIONS: /* options screen */
+ if (handle_LYK_OPTIONS(&cmd, &refresh_screen))
+ goto new_cmd;
+ break;
+
+ case LYK_INDEX_SEARCH: /* search for a user string */
+ handle_LYK_INDEX_SEARCH(&force_load, ForcePush, &old_c, real_c);
+ break;
+
+ case LYK_WHEREIS: /* search within the document */
+ case LYK_NEXT: /* find the next occurrence in the document */
+ case LYK_PREV: /* find the previous occurrence in the document */
+ handle_LYK_WHEREIS(cmd, &refresh_screen);
+ break;
+
+ case LYK_COMMENT: /* reply by mail */
+ handle_LYK_COMMENT(&refresh_screen, &owner_address, &old_c, real_c);
+ break;
+
+#ifdef DIRED_SUPPORT
+ case LYK_TAG_LINK: /* tag or untag the current link */
+ handle_LYK_TAG_LINK();
+ break;
+
+ case LYK_MODIFY: /* rename a file or directory */
+ handle_LYK_MODIFY(&refresh_screen);
+ break;
+
+ case LYK_CREATE: /* create a new file or directory */
+ handle_LYK_CREATE();
+ break;
+#endif /* DIRED_SUPPORT */
+
+ case LYK_DWIMEDIT: /* context-dependent edit */
+ switch (handle_LYK_DWIMEDIT(&cmd, &old_c, real_c)) {
+ case 1:
+ continue;
+ case 2:
+ goto new_cmd;
+ }
+ /* FALLTHRU */
+
+ case LYK_EDIT: /* edit */
+ handle_LYK_EDIT(&old_c, real_c);
+ break;
+
+ case LYK_DEL_BOOKMARK: /* remove a bookmark file link */
+ handle_LYK_DEL_BOOKMARK(&refresh_screen, &old_c, real_c);
+ break;
+
+#ifdef DIRED_SUPPORT
+ case LYK_REMOVE: /* remove files and directories */
+ handle_LYK_REMOVE(&refresh_screen);
+ break;
+#endif /* DIRED_SUPPORT */
+
+#if defined(DIRED_SUPPORT) && defined(OK_INSTALL)
+ case LYK_INSTALL: /* install a file into system area */
+ handle_LYK_INSTALL();
+ break;
+#endif /* DIRED_SUPPORT && OK_INSTALL */
+
+ case LYK_INFO: /* show document info */
+ if (handle_LYK_INFO(&cmd))
+ goto new_cmd;
+ break;
+
+ case LYK_EDITTEXTAREA: /* use external editor on a TEXTAREA - KED */
+ handle_LYK_EDIT_TEXTAREA(&refresh_screen, &old_c, real_c);
+ break;
+
+ case LYK_GROWTEXTAREA: /* add new lines to bottom of TEXTAREA - KED */
+ handle_LYK_GROW_TEXTAREA(&refresh_screen);
+ break;
+
+ case LYK_INSERTFILE: /* insert file in TEXTAREA, above cursor - KED */
+ handle_LYK_INSERT_FILE(&refresh_screen, &old_c, real_c);
+ break;
+
+ case LYK_PRINT: /* print the file */
+ handle_LYK_PRINT(&ForcePush, &old_c, real_c);
+ break;
+
+ case LYK_LIST: /* list links in the current document */
+ if (handle_LYK_LIST(&cmd))
+ goto new_cmd;
+ break;
+
+#ifdef USE_ADDRLIST_PAGE
+ case LYK_ADDRLIST: /* always list URL's (only) */
+ if (handle_LYK_ADDRLIST(&cmd))
+ goto new_cmd;
+ break;
+#endif /* USE_ADDRLIST_PAGE */
+
+ case LYK_VLINKS: /* list links visited during the current session */
+ if (handle_LYK_VLINKS(&cmd, &newdoc_link_is_absolute))
+ goto new_cmd;
+ break;
+
+ case LYK_TOOLBAR: /* go to Toolbar or Banner in current document */
+ handle_LYK_TOOLBAR(&try_internal, &force_load, &old_c, real_c);
+ break;
+
+#if defined(DIRED_SUPPORT) || defined(VMS)
+ case LYK_DIRED_MENU: /* provide full file management menu */
+ handle_LYK_DIRED_MENU(&refresh_screen, &old_c, real_c);
+ break;
+#endif /* DIRED_SUPPORT || VMS */
+
+#ifdef USE_EXTERNALS
+ case LYK_EXTERN_LINK: /* use external program on url */
+ handle_LYK_EXTERN_LINK(&refresh_screen);
+ break;
+ case LYK_EXTERN_PAGE: /* use external program on current page */
+ handle_LYK_EXTERN_PAGE(&refresh_screen);
+ break;
+#endif /* USE_EXTERNALS */
+
+ case LYK_ADD_BOOKMARK: /* add link to bookmark file */
+ handle_LYK_ADD_BOOKMARK(&refresh_screen, &old_c, real_c);
+ break;
+
+ case LYK_VIEW_BOOKMARK: /* v to view home page */
+ handle_LYK_VIEW_BOOKMARK(&refresh_screen, &old_c, real_c);
+ break;
+
+ case LYK_SHELL: /* (!) shell escape */
+ handle_LYK_SHELL(&refresh_screen, &old_c, real_c);
+ break;
+
+ case LYK_DOWNLOAD:
+ switch (handle_LYK_DOWNLOAD(&cmd, &old_c, real_c)) {
+ case 1:
+ continue;
+ case 2:
+ goto new_cmd;
+ }
+ break;
+
+#ifdef DIRED_SUPPORT
+ case LYK_UPLOAD:
+ handle_LYK_UPLOAD();
+ break;
+#endif /* DIRED_SUPPORT */
+
+ case LYK_TRACE_TOGGLE: /* Toggle TRACE mode. */
+ handle_LYK_TRACE_TOGGLE();
+ break;
+
+ case LYK_TRACE_LOG: /* View TRACE log. */
+ handle_LYK_TRACE_LOG(&trace_mode_flag);
+ break;
+
+ case LYK_IMAGE_TOGGLE:
+ if (handle_LYK_IMAGE_TOGGLE(&cmd))
+ goto new_cmd;
+ break;
+
+ case LYK_INLINE_TOGGLE:
+ if (handle_LYK_INLINE_TOGGLE(&cmd))
+ goto new_cmd;
+ break;
+
+ case LYK_RAW_TOGGLE:
+ if (handle_LYK_RAW_TOGGLE(&cmd))
+ goto new_cmd;
+ break;
+
+ case LYK_HEAD:
+ if (handle_LYK_HEAD(&cmd))
+ goto new_cmd;
+ break;
+
+ case LYK_TOGGLE_HELP:
+ handle_LYK_TOGGLE_HELP();
+ break;
+
+ case LYK_EDITMAP:
+ handle_LYK_EDITMAP(&old_c, real_c);
+ break;
+
+ case LYK_KEYMAP:
+ handle_LYK_KEYMAP(&vi_keys_flag, &emacs_keys_flag, &old_c, real_c);
+ break;
+
+ case LYK_JUMP:
+ if (handle_LYK_JUMP(c, &user_input_buffer, &temp, &recall,
+ &FirstURLRecall, &URLNum, &URLTotal, &ch,
+ &old_c, real_c)) {
+ if (do_check_recall(ch, &user_input_buffer, &temp, URLTotal,
+ &URLNum, recall, &FirstURLRecall))
+ do_check_goto_URL(&user_input_buffer, &temp, &force_load);
+ }
+ break;
+
+ case LYK_CLEAR_AUTH:
+ handle_LYK_CLEAR_AUTH(&old_c, real_c);
+ break;
+
+ case LYK_DO_NOTHING: /* pretty self explanatory */
+ break;
+#ifdef SUPPORT_CHDIR
+ case LYK_CHDIR:
+ handle_LYK_CHDIR();
+ break;
+ case LYK_PWD:
+ handle_LYK_PWD();
+ break;
+#endif
+#ifdef USE_CURSES_PADS
+ case LYK_SHIFT_LEFT:
+ handle_LYK_SHIFT_LEFT(&refresh_screen, key_count);
+ break;
+ case LYK_SHIFT_RIGHT:
+ handle_LYK_SHIFT_RIGHT(&refresh_screen, key_count);
+ break;
+ case LYK_LINEWRAP_TOGGLE:
+ if (handle_LYK_LINEWRAP_TOGGLE(&cmd, &refresh_screen))
+ goto new_cmd;
+ break;
+#endif
+
+#ifdef USE_MAXSCREEN_TOGGLE
+ case LYK_MAXSCREEN_TOGGLE:
+ if (handle_LYK_MAXSCREEN_TOGGLE(&cmd))
+ goto new_cmd;
+ break;
+#endif
+ } /* end of BIG switch */
+ }
+}
+
+static int are_different(DocInfo *doc1, DocInfo *doc2)
+{
+ char *cp1, *cp2;
+
+ /*
+ * Do we have two addresses?
+ */
+ if (!doc1->address || !doc2->address)
+ return (TRUE);
+
+ /*
+ * Do they differ in the type of request?
+ */
+ if (doc1->isHEAD != doc2->isHEAD)
+ return (TRUE);
+
+ /*
+ * See if the addresses are different, making sure we're not tripped up by
+ * multiple anchors in the the same document from a POST form. -- FM
+ */
+ cp1 = trimPoundSelector(doc1->address);
+ cp2 = trimPoundSelector(doc2->address);
+ /*
+ * Are the base addresses different?
+ */
+ if (strcmp(doc1->address, doc2->address)) {
+ restorePoundSelector(cp1);
+ restorePoundSelector(cp2);
+ return (TRUE);
+ }
+ restorePoundSelector(cp1);
+ restorePoundSelector(cp2);
+
+ /*
+ * Do the docs have different contents?
+ */
+ if (doc1->post_data) {
+ if (doc2->post_data) {
+ if (!BINEQ(doc1->post_data, doc2->post_data))
+ return (TRUE);
+ } else
+ return (TRUE);
+ } else if (doc2->post_data)
+ return (TRUE);
+
+ /*
+ * We'll assume the two documents in fact are the same.
+ */
+ return (FALSE);
+}
+
+/* This determines whether two docs are _physically_ different,
+ * meaning they are "from different files". - kw
+ */
+static int are_phys_different(DocInfo *doc1, DocInfo *doc2)
+{
+ char *cp1, *cp2, *ap1 = doc1->address, *ap2 = doc2->address;
+
+ /*
+ * Do we have two addresses?
+ */
+ if (!doc1->address || !doc2->address)
+ return (TRUE);
+
+ /*
+ * Do they differ in the type of request?
+ */
+ if (doc1->isHEAD != doc2->isHEAD)
+ return (TRUE);
+
+ /*
+ * Skip over possible LYNXIMGMAP parts. - kw
+ */
+ if (isLYNXIMGMAP(doc1->address))
+ ap1 += LEN_LYNXIMGMAP;
+ if (isLYNXIMGMAP(doc2->address))
+ ap2 += LEN_LYNXIMGMAP;
+ /*
+ * If there isn't any real URL in doc2->address, but maybe just
+ * a fragment, doc2 is assumed to be an internal reference in
+ * the same physical document, so return FALSE. - kw
+ */
+ if (*ap2 == '\0' || *ap2 == '#')
+ return (FALSE);
+
+ /*
+ * See if the addresses are different, making sure we're not tripped up by
+ * multiple anchors in the the same document from a POST form. -- FM
+ */
+ cp1 = trimPoundSelector(doc1->address);
+ cp2 = trimPoundSelector(doc2->address);
+ /*
+ * Are the base addresses different?
+ */
+ if (strcmp(ap1, ap2)) {
+ restorePoundSelector(cp1);
+ restorePoundSelector(cp2);
+ return (TRUE);
+ }
+ restorePoundSelector(cp1);
+ restorePoundSelector(cp2);
+
+ /*
+ * Do the docs have different contents?
+ */
+ if (doc1->post_data) {
+ if (doc2->post_data) {
+ if (!BINEQ(doc1->post_data, doc2->post_data))
+ return (TRUE);
+ } else
+ return (TRUE);
+ } else if (doc2->post_data)
+ return (TRUE);
+
+ /*
+ * We'll assume the two documents in fact are the same.
+ */
+ return (FALSE);
+}
+
+/*
+ * Utility for freeing the list of goto URLs. - FM
+ */
+#ifdef LY_FIND_LEAKS
+static void HTGotoURLs_free(void)
+{
+ LYFreeStringList(Goto_URLs);
+ Goto_URLs = NULL;
+}
+#endif
+
+/*
+ * Utility for listing Goto URLs, making any repeated URLs the most current in
+ * the list. - FM
+ */
+void HTAddGotoURL(char *url)
+{
+ char *mycopy = NULL;
+ char *old;
+ HTList *cur;
+
+ if (isEmpty(url))
+ return;
+
+ CTRACE((tfp, "HTAddGotoURL %s\n", url));
+ StrAllocCopy(mycopy, url);
+
+ if (!Goto_URLs) {
+ Goto_URLs = HTList_new();
+#ifdef LY_FIND_LEAKS
+ atexit(HTGotoURLs_free);
+#endif
+ HTList_addObject(Goto_URLs, mycopy);
+ return;
+ }
+
+ cur = Goto_URLs;
+ while (NULL != (old = (char *) HTList_nextObject(cur))) {
+ if (!strcmp(old, mycopy)) {
+ HTList_removeObject(Goto_URLs, old);
+ FREE(old);
+ break;
+ }
+ }
+ HTList_addObject(Goto_URLs, mycopy);
+
+ return;
+}
+
+/*
+ * When help is not on the screen, put a message on the screen to tell the user
+ * other misc info.
+ */
+static void show_main_statusline(const LinkInfo curlink,
+ int for_what)
+{
+ /*
+ * Make sure form novice lines are replaced.
+ */
+ if (user_mode == NOVICE_MODE && for_what != FOR_INPUT) {
+ noviceline(more_text);
+ }
+
+ if (HTisDocumentSource()) {
+ /*
+ * Currently displaying HTML source.
+ */
+ _statusline(SOURCE_HELP);
+
+ /*
+ * If we are in forms mode then explicitly tell the user what each kind
+ * of link is.
+ */
+#ifdef INDICATE_FORMS_MODE_FOR_ALL_LINKS_ON_PAGE
+ } else if (lynx_mode == FORMS_LYNX_MODE && nlinks > 0) {
+#else
+#ifdef NORMAL_NON_FORM_LINK_STATUSLINES_FOR_ALL_USER_MODES
+ } else if (lynx_mode == FORMS_LYNX_MODE && nlinks > 0 &&
+ !(curlink.type & WWW_LINK_TYPE)) {
+#else
+ } else if (lynx_mode == FORMS_LYNX_MODE && nlinks > 0 &&
+ !((user_mode == ADVANCED_MODE || user_mode == MINIMAL_MODE) &&
+ (curlink.type & WWW_LINK_TYPE))) {
+#endif /* NORMAL_NON_FORM_LINK_STATUSLINES_FOR_ALL_USER_MODES */
+#endif /* INDICATE_FORMS_MODE_FOR_ALL_LINKS_ON_PAGE */
+ if (curlink.type == WWW_FORM_LINK_TYPE) {
+ show_formlink_statusline(curlink.l_form, for_what);
+ } else {
+ statusline(NORMAL_LINK_MESSAGE);
+ }
+
+ /*
+ * Let them know if it's an index -- very rare.
+ */
+ if (is_www_index) {
+ const char *indx = gettext("-index-");
+
+ LYmove(LYlines - 1, LYcolLimit - (int) strlen(indx));
+ lynx_start_reverse();
+ LYaddstr(indx);
+ lynx_stop_reverse();
+ }
+
+ } else if ((user_mode == ADVANCED_MODE) && nlinks > 0) {
+ /*
+ * Show the URL or, for some internal links, the fragment
+ */
+ char *cp = NULL;
+
+ if (curlink.type == WWW_INTERN_LINK_TYPE &&
+ !isLYNXIMGMAP(curlink.lname)) {
+ cp = findPoundSelector(curlink.lname);
+ }
+ if (!cp)
+ cp = curlink.lname;
+ status_link(cp, more_text, is_www_index);
+ } else if ((user_mode == MINIMAL_MODE) && nlinks > 0) {
+ /*
+ * no URL
+ */
+ status_link("", more_text, is_www_index);
+ } else if (is_www_index && more_text) {
+ char buf[128];
+
+ sprintf(buf, WWW_INDEX_MORE_MESSAGE, key_for_func(LYK_INDEX_SEARCH));
+ _statusline(buf);
+ } else if (is_www_index) {
+ char buf[128];
+
+ sprintf(buf, WWW_INDEX_MESSAGE, key_for_func(LYK_INDEX_SEARCH));
+ _statusline(buf);
+ } else if (more_text) {
+ if (user_mode == NOVICE_MODE)
+ _statusline(MORE);
+ else
+ _statusline(MOREHELP);
+ } else if (user_mode != MINIMAL_MODE) {
+ _statusline(HELP);
+ } else {
+ _statusline("");
+ }
+
+ /* turn off cursor since now it's probably on statusline -HV */
+ /* But not if LYShowCursor is on. -show_cursor may be used as a
+ * workaround to avoid putting the cursor in the last position, for
+ * curses implementations or terminals that cannot deal with that
+ * correctly. - kw */
+ if (!LYShowCursor) {
+ LYHideCursor();
+ }
+}
+
+/*
+ * Public function for redrawing the statusline appropriate for the selected
+ * link. It should only be called at times when curdoc.link, nlinks, and the
+ * links[] array are valid. - kw
+ */
+void repaint_main_statusline(int for_what)
+{
+ if (curdoc.link >= 0 && curdoc.link < nlinks)
+ show_main_statusline(links[curdoc.link], for_what);
+}
+
+static void form_noviceline(int disabled)
+{
+ LYmove(LYlines - 2, 0);
+ LYclrtoeol();
+ if (!disabled) {
+ LYaddstr(FORM_NOVICELINE_ONE);
+ }
+ LYParkCursor();
+
+ if (disabled)
+ return;
+ if (EditBinding(FROMASCII('\025')) == LYE_ERASE) {
+ LYaddstr(FORM_NOVICELINE_TWO);
+ } else if (EditBinding(FROMASCII('\025')) == LYE_DELBL) {
+ LYaddstr(FORM_NOVICELINE_TWO_DELBL);
+ } else {
+ char *temp = NULL;
+ char *erasekey = fmt_keys(LYKeyForEditAction(LYE_ERASE), -1);
+
+ if (erasekey) {
+ HTSprintf0(&temp, FORM_NOVICELINE_TWO_VAR, erasekey);
+ } else {
+ erasekey = fmt_keys(LYKeyForEditAction(LYE_DELBL), -1);
+ if (erasekey)
+ HTSprintf0(&temp,
+ FORM_NOVICELINE_TWO_DELBL_VAR, erasekey);
+ }
+ if (temp) {
+ LYaddstr(temp);
+ FREE(temp);
+ }
+ FREE(erasekey);
+ }
+}
+
+static void exit_immediately_with_error_message(int state, int first_file)
+{
+ char *buf = 0;
+ char *buf2 = 0;
+
+ if (first_file) {
+ /* print statusline messages as a hint, if any */
+ LYstatusline_messages_on_exit(&buf2);
+ }
+
+ if (state == NOT_FOUND) {
+ HTSprintf0(&buf, "%s\n%s %s\n",
+ NonNull(buf2),
+ gettext("lynx: Can't access startfile"),
+ /*
+ * hack: if we fail in HTAccess.c
+ * avoid duplicating URL, oh.
+ */
+ (buf2 && strstr(buf2, gettext("Can't Access"))) ?
+ "" : startfile);
+ }
+
+ if (state == NULLFILE) {
+ HTSprintf0(&buf, "%s\n%s\n%s\n",
+ NonNull(buf2),
+ gettext("lynx: Start file could not be found or is not text/html or text/plain"),
+ gettext(" Exiting..."));
+ }
+
+ FREE(buf2);
+
+ if (!dump_output_immediately)
+ cleanup();
+
+ if (buf != 0) {
+#ifdef UNIX
+ if (dump_output_immediately) {
+ fputs(buf, stderr);
+ } else
+#endif /* UNIX */
+ {
+ SetOutputMode(O_TEXT);
+ fputs(buf, stdout);
+ SetOutputMode(O_BINARY);
+ }
+
+ FREE(buf);
+ }
+
+ if (!dump_output_immediately) {
+ exit_immediately(EXIT_FAILURE);
+ }
+ /* else: return(EXIT_FAILURE) in mainloop */
+}
+
+static void status_link(const char *curlink_name,
+ int show_more,
+ int show_indx)
+{
+#define MAX_STATUS (LYcolLimit - 1)
+#define MIN_STATUS 0
+ char format[MAX_LINE];
+ int prefix = 0;
+ int length;
+
+ *format = 0;
+ if (show_more && !nomore) {
+ sprintf(format, "%.*s ",
+ (int) (sizeof(format) - 2),
+ gettext("-more-"));
+ prefix = (int) strlen(format);
+ }
+ if (show_indx) {
+ sprintf(format + prefix, "%.*s ",
+ ((int) sizeof(format) - prefix - 2),
+ gettext("-index-"));
+ }
+ prefix = (int) strlen(format);
+ length = (int) strlen(curlink_name);
+
+ if (prefix > MAX_STATUS || prefix >= MAX_LINE - 10) {
+ _user_message("%s", format); /* no room for url */
+ } else {
+ sprintf(format + prefix, "%%.%ds", MAX_STATUS - prefix);
+
+ if ((length + prefix > MAX_STATUS) && long_url_ok) {
+ char *buf = NULL;
+ int cut_from_pos;
+ int cut_to_pos;
+ int n;
+
+ StrAllocCopy(buf, curlink_name);
+ /*
+ * Scan to find the final leaf of the URL. Ignore trailing '/'.
+ */
+ for (cut_to_pos = length - 2;
+ (cut_to_pos > 0) && (buf[cut_to_pos] != '/');
+ cut_to_pos--) ;
+ /*
+ * Jump back to the next leaf to remove.
+ */
+ for (cut_from_pos = cut_to_pos - 4;
+ (cut_from_pos > 0) && ((buf[cut_from_pos] != '/')
+ || ((prefix + cut_from_pos
+ + 4
+ + (length - cut_to_pos)) >= MAX_STATUS));
+ cut_from_pos--) ;
+ /*
+ * Replace some leaves to '...', if possible, and put the final
+ * leaf at the end. We assume that one can recognize the link from
+ * at least MIN_STATUS characters.
+ */
+ if (cut_from_pos > MIN_STATUS) {
+ for (n = 1; n <= 3; n++)
+ buf[cut_from_pos + n] = '.';
+ for (n = 0; cut_to_pos + n <= length; n++)
+ buf[cut_from_pos + 4 + n] = buf[cut_to_pos + n];
+ }
+ _user_message(format, buf);
+ CTRACE((tfp, "lastline = %s\n", buf)); /* don't forget to erase me */
+ FREE(buf);
+ } else { /* show (possibly truncated) url */
+ _user_message(format, curlink_name);
+ }
+ }
+}
+
+const char *LYDownLoadAddress(void)
+{
+ return NonNull(newdoc.address);
+}
diff --git a/src/LYMainLoop.h b/src/LYMainLoop.h
new file mode 100644
index 0000000..bd2926a
--- /dev/null
+++ b/src/LYMainLoop.h
@@ -0,0 +1,34 @@
+#ifndef LYMAINLOOP_H
+#define LYMAINLOOP_H
+
+#ifndef HTUTILS_H
+#include <HTUtils.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#ifdef DISP_PARTIAL
+ extern BOOL LYMainLoop_pageDisplay(int line_num);
+#endif
+
+ extern BOOLEAN LYOpenTraceLog(void);
+ extern const char *LYDownLoadAddress(void);
+ extern int LYGetNewline(void);
+ extern int mainloop(void);
+ extern void HTAddGotoURL(char *url);
+ extern void LYChgNewline(int adjust);
+ extern void LYCloseTracelog(void);
+ extern void LYSetNewline(int value);
+ extern void handle_LYK_TRACE_TOGGLE(void);
+ extern void handle_LYK_WHEREIS(int cmd, BOOLEAN *refresh_screen);
+ extern void repaint_main_statusline(int for_what);
+
+#ifdef SUPPORT_CHDIR
+ extern void handle_LYK_CHDIR(void);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* LYMAINLOOP_H */
diff --git a/src/LYMap.c b/src/LYMap.c
new file mode 100644
index 0000000..29b60f1
--- /dev/null
+++ b/src/LYMap.c
@@ -0,0 +1,646 @@
+/*
+ * $LynxId: LYMap.c,v 1.50 2018/03/05 22:32:14 tom Exp $
+ * Lynx Client-side Image MAP Support LYMap.c
+ * ==================================
+ *
+ * Author: FM Foteos Macrides (macrides@sci.wfbr.edu)
+ *
+ */
+
+#include <HTUtils.h>
+#include <HTTP.h>
+#include <HTAnchor.h>
+#include <HTAccess.h>
+#include <HTFormat.h>
+#include <HTParse.h>
+#include <HTAlert.h>
+#include <LYUtils.h>
+#include <LYMap.h>
+#include <GridText.h>
+#include <LYGlobalDefs.h>
+#include <LYKeymap.h>
+#include <LYCharUtils.h>
+#include <LYCharSets.h>
+#include <LYStrings.h>
+
+#ifdef DIRED_SUPPORT
+#include <LYUpload.h>
+#include <LYLocal.h>
+#endif
+
+#include <LYexit.h>
+#include <LYLeaks.h>
+
+#define NO_MAP_TITLE "[USEMAP]"
+
+typedef struct _LYMapElement {
+ char *address;
+ char *title;
+ BOOLEAN intern_flag;
+} LYMapElement;
+
+typedef struct _LYImageMap {
+ char *address;
+ char *title;
+ HTList *elements;
+} LYImageMap;
+
+static HTList *LynxMaps = NULL;
+
+BOOL LYMapsOnly = FALSE;
+
+/*
+ * Utility for freeing a list of MAPs.
+ */
+void ImageMapList_free(HTList *theList)
+{
+ LYImageMap *map;
+ LYMapElement *element;
+ HTList *cur = theList;
+ HTList *current;
+
+ if (!cur)
+ return;
+
+ while (NULL != (map = (LYImageMap *) HTList_nextObject(cur))) {
+ FREE(map->address);
+ FREE(map->title);
+ if (map->elements) {
+ current = map->elements;
+ while (NULL !=
+ (element = (LYMapElement *) HTList_nextObject(current))) {
+ FREE(element->address);
+ FREE(element->title);
+ FREE(element);
+ }
+ HTList_delete(map->elements);
+ map->elements = NULL;
+ }
+ FREE(map);
+ }
+ HTList_delete(theList);
+ return;
+}
+
+#ifdef LY_FIND_LEAKS
+/*
+ * Utility for freeing the global list of MAPs. - kw
+ */
+static void LYLynxMaps_free(void)
+{
+ ImageMapList_free(LynxMaps);
+ LynxMaps = NULL;
+ return;
+}
+#endif /* LY_FIND_LEAKS */
+
+/*
+ * We keep two kinds of lists:
+ * - A global list (LynxMaps) shared by MAPs from all documents that
+ * do not have POST data.
+ * - For each response to a POST which contains MAPs, a list specific
+ * to this combination of URL and post_data. It is kept in the
+ * HTParentAnchor structure and is freed when the document is removed
+ * from memory, in the course of normal removal of anchors.
+ * MAPs from POST responses can only be accessed via internal links,
+ * i.e., from within the same document (with the same post_data).
+ * The notion of "same document" is extended, so that LYNXIMGMAP:
+ * and List Page screens are logically part of the document on which
+ * they are based. - kw
+ *
+ * If track_internal_links is false, only the global list will be used
+ * for all MAPs.
+ *
+ */
+
+/*
+ * Utility for creating an LYImageMap list, if it doesn't exist already, adding
+ * LYImageMap entry structures if needed, and removing any LYMapElements in a
+ * pre-existing LYImageMap entry so that it will have only those from AREA tags
+ * for the current analysis of MAP element content. - FM
+ */
+BOOL LYAddImageMap(char *address,
+ char *title,
+ HTParentAnchor *node_anchor)
+{
+ LYImageMap *tmp = NULL;
+ LYImageMap *old = NULL;
+ HTList *cur = NULL;
+ HTList *theList = NULL;
+ HTList *curele = NULL;
+ LYMapElement *ele = NULL;
+
+ if (isEmpty(address))
+ return FALSE;
+ if (!(node_anchor && node_anchor->address))
+ return FALSE;
+
+ /*
+ * Set theList to either the global LynxMaps list or, if we are associated
+ * with post data, the specific list. The list is created if it doesn't
+ * already exist. - kw
+ */
+ if (track_internal_links && node_anchor->post_data) {
+ /*
+ * We are handling a MAP element found while parsing node_anchor's
+ * stream of data, and node_anchor has post_data associated and should
+ * therefore represent a POST response, so use the specific list. - kw
+ */
+ theList = node_anchor->imaps;
+ if (!theList) {
+ theList = node_anchor->imaps = HTList_new();
+ }
+ } else {
+ if (!LynxMaps) {
+ LynxMaps = HTList_new();
+#ifdef LY_FIND_LEAKS
+ atexit(LYLynxMaps_free);
+#endif
+ }
+ theList = LynxMaps;
+ }
+
+ if (theList) {
+ cur = theList;
+ while (NULL != (old = (LYImageMap *) HTList_nextObject(cur))) {
+ if (old->address == 0) /* shouldn't happen */
+ continue;
+ if (!strcmp(old->address, address)) {
+ FREE(old->address);
+ FREE(old->title);
+ if (old->elements) {
+ curele = old->elements;
+ while (NULL !=
+ (ele = (LYMapElement *) HTList_nextObject(curele))) {
+ FREE(ele->address);
+ FREE(ele->title);
+ FREE(ele);
+ }
+ HTList_delete(old->elements);
+ old->elements = NULL;
+ }
+ break;
+ }
+ }
+ }
+
+ tmp = (old != NULL) ?
+ old : typecalloc(LYImageMap);
+ if (tmp == NULL) {
+ outofmem(__FILE__, "LYAddImageMap");
+ return FALSE;
+ }
+ StrAllocCopy(tmp->address, address);
+ if (non_empty(title))
+ StrAllocCopy(tmp->title, title);
+ if (tmp != old)
+ HTList_addObject(theList, tmp);
+ return TRUE;
+}
+
+/*
+ * Utility for adding LYMapElement's to LYImageMap's
+ * in the appropriate list. - FM
+ */
+BOOL LYAddMapElement(char *map,
+ char *address,
+ char *title,
+ HTParentAnchor *node_anchor,
+ int intern_flag GCC_UNUSED)
+{
+ LYMapElement *tmp = NULL;
+ LYImageMap *theMap = NULL;
+ HTList *theList = NULL;
+ HTList *cur = NULL;
+
+ if (isEmpty(map) || isEmpty(address))
+ return FALSE;
+ if (!(node_anchor && node_anchor->address))
+ return FALSE;
+
+ /*
+ * Set theList to either the global LynxMaps list or, if we are associated
+ * with post data, the specific list. The list should already exist, since
+ * this function is only called if the AREA tag we are handling was within
+ * a MAP element in node_anchor's stream of data, so that LYAddImageMap has
+ * been called. - kw
+ */
+ if (track_internal_links && node_anchor->post_data) {
+ /*
+ * We are handling an AREA tag found while parsing node_anchor's stream
+ * of data, and node_anchor has post_data associated and should
+ * therefore represent a POST response, so use the specific list. - kw
+ */
+ theList = node_anchor->imaps;
+ if (!theList) {
+ return FALSE;
+ }
+ } else {
+ if (!LynxMaps)
+ LYAddImageMap(map, NULL, node_anchor);
+ theList = LynxMaps;
+ }
+
+ cur = theList;
+ while (NULL != (theMap = (LYImageMap *) HTList_nextObject(cur))) {
+ if (!strcmp(theMap->address, map)) {
+ break;
+ }
+ }
+ if (!theMap)
+ return FALSE;
+ if (!theMap->elements)
+ theMap->elements = HTList_new();
+ cur = theMap->elements;
+ while (NULL != (tmp = (LYMapElement *) HTList_nextObject(cur))) {
+ if (!strcmp(tmp->address, address)) {
+ FREE(tmp->address);
+ FREE(tmp->title);
+ HTList_removeObject(theMap->elements, tmp);
+ FREE(tmp);
+ break;
+ }
+ }
+
+ tmp = typecalloc(LYMapElement);
+ if (tmp == NULL) {
+ perror("Out of memory in LYAddMapElement");
+ return FALSE;
+ }
+ StrAllocCopy(tmp->address, address);
+ if (non_empty(title))
+ StrAllocCopy(tmp->title, title);
+ else
+ StrAllocCopy(tmp->title, address);
+ if (track_internal_links)
+ tmp->intern_flag = (BOOLEAN) intern_flag;
+ HTList_appendObject(theMap->elements, tmp);
+
+ CTRACE((tfp,
+ "LYAddMapElement\n\tmap %s\n\taddress %s\n\ttitle %s)\n",
+ NonNull(map), NonNull(address), NonNull(title)));
+
+ return TRUE;
+}
+
+/*
+ * Utility for checking whether an LYImageMap entry with a given address
+ * already exists in the LynxMaps structure. - FM
+ */
+BOOL LYHaveImageMap(char *address)
+{
+ LYImageMap *Map;
+ HTList *cur = LynxMaps;
+
+ if (!(cur && non_empty(address)))
+ return FALSE;
+
+ while (NULL != (Map = (LYImageMap *) HTList_nextObject(cur))) {
+ if (!strcmp(Map->address, address)) {
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+/*
+ * Fills in a DocAddress structure for getting the HTParentAnchor of the
+ * underlying resource. ALso returns a pointer to that anchor in
+ * *punderlying if we are dealing with POST data. - kw
+ *
+ * address is the address of the underlying resource, i.e., the one
+ * containing the MAP element, the MAP's name appended as
+ * fragment is ignored.
+ * anAnchor is the LYNXIMGMAP: anchor; if it is associated with POST
+ * data, we want the specific list, otherwise the global list.
+ */
+static void fill_DocAddress(DocAddress *wwwdoc,
+ const char *address,
+ HTParentAnchor *anAnchor,
+ HTParentAnchor **punderlying)
+{
+ char *doc_address = NULL;
+ HTParentAnchor *underlying;
+
+ StrAllocCopy(doc_address, address);
+ if (anAnchor && anAnchor->post_data) {
+ wwwdoc->address = doc_address;
+ wwwdoc->post_data = anAnchor->post_data;
+ wwwdoc->post_content_type = anAnchor->post_content_type;
+ wwwdoc->bookmark = NULL;
+ wwwdoc->isHEAD = FALSE;
+ wwwdoc->safe = FALSE;
+ underlying = HTAnchor_findAddress(wwwdoc);
+ if (underlying->safe)
+ wwwdoc->safe = TRUE;
+ if (punderlying)
+ *punderlying = underlying;
+ } else {
+ wwwdoc->address = doc_address;
+ wwwdoc->post_data = NULL;
+ wwwdoc->post_content_type = NULL;
+ wwwdoc->bookmark = NULL;
+ wwwdoc->isHEAD = FALSE;
+ wwwdoc->safe = FALSE;
+ if (punderlying)
+ *punderlying = NULL;
+ }
+}
+
+/*
+ * Get the appropriate list for creating a LYNXIMGMAP: pseudo- document:
+ * either the global list (LynxMaps), or the specific list if a List Page for a
+ * POST response is requested. Also fill in the DocAddress structure etc. by
+ * calling fill_DocAddress().
+ *
+ * address is the address of the underlying resource, i.e., the one
+ * containing the MAP element, the MAP's name appended as
+ * fragment is ignored.
+ * anchor is the LYNXIMGMAP: anchor for which LYLoadIMGmap() is
+ * requested; if it is associated with POST data, we want the
+ * specific list for this combination of address+post_data.
+ *
+ * if track_internal_links is false, the Anchor passed to
+ * LYLoadIMGmap() will never have post_data, so that the global list
+ * will be used. - kw
+ */
+static HTList *get_the_list(DocAddress *wwwdoc,
+ const char *address,
+ HTParentAnchor *anchor,
+ HTParentAnchor **punderlying)
+{
+ HTList *result;
+
+ if (anchor->post_data) {
+ fill_DocAddress(wwwdoc, address, anchor, punderlying);
+ if (non_empty(punderlying)) {
+ result = (*punderlying)->imaps;
+ } else {
+ result = anchor->imaps;
+ }
+ } else {
+ fill_DocAddress(wwwdoc, address, NULL, punderlying);
+ result = LynxMaps;
+ }
+ return result;
+}
+
+/* LYLoadIMGmap - F.Macrides (macrides@sci.wfeb.edu)
+ * ------------
+ * Create a text/html stream with a list of links
+ * for HyperText References in AREAs of a MAP.
+ */
+
+static int LYLoadIMGmap(const char *arg,
+ HTParentAnchor *anAnchor,
+ HTFormat format_out,
+ HTStream *sink)
+{
+ HTFormat format_in = WWW_HTML;
+ HTStream *target = NULL;
+ char *buf = NULL;
+ LYMapElement *tmp = NULL;
+ LYImageMap *theMap = NULL;
+ char *MapTitle = NULL;
+ char *MapAddress = NULL;
+ HTList *theList;
+ HTList *cur = NULL;
+ const char *address = NULL;
+ char *cp = NULL;
+ DocAddress WWWDoc;
+ HTParentAnchor *underlying;
+ BOOL old_cache_setting = LYforce_no_cache;
+ BOOL old_reloading = reloading;
+ HTFormat old_format_out = HTOutputFormat;
+
+ if (isLYNXIMGMAP(arg)) {
+ address = (arg + LEN_LYNXIMGMAP);
+ }
+ if (!(address && StrChr(address, ':'))) {
+ HTAlert(MISDIRECTED_MAP_REQUEST);
+ return (HT_NOT_LOADED);
+ }
+
+ theList = get_the_list(&WWWDoc, address, anAnchor, &underlying);
+ if (WWWDoc.safe)
+ anAnchor->safe = TRUE;
+
+ if (!theList) {
+ if (anAnchor->post_data && !WWWDoc.safe &&
+ ((underlying && underlying->document && !LYforce_no_cache) ||
+ HTConfirm(CONFIRM_POST_RESUBMISSION) != TRUE)) {
+ HTAlert(FAILED_MAP_POST_REQUEST);
+ return (HT_NOT_LOADED);
+ }
+ LYforce_no_cache = TRUE;
+ reloading = TRUE;
+ HTOutputFormat = WWW_PRESENT;
+ LYMapsOnly = TRUE;
+ if (!HTLoadAbsolute(&WWWDoc)) {
+ LYforce_no_cache = old_cache_setting;
+ reloading = old_reloading;
+ HTOutputFormat = old_format_out;
+ LYMapsOnly = FALSE;
+ HTAlert(MAP_NOT_ACCESSIBLE);
+ return (HT_NOT_LOADED);
+ }
+ LYforce_no_cache = old_cache_setting;
+ reloading = old_reloading;
+ HTOutputFormat = old_format_out;
+ LYMapsOnly = FALSE;
+ theList = get_the_list(&WWWDoc, address, anAnchor, &underlying);
+ }
+
+ if (!theList) {
+ HTAlert(MAPS_NOT_AVAILABLE);
+ return (HT_NOT_LOADED);
+ }
+
+ cur = theList;
+ while (NULL != (theMap = (LYImageMap *) HTList_nextObject(cur))) {
+ if (!strcmp(theMap->address, address)) {
+ break;
+ }
+ }
+ if (theMap && HTList_count(theMap->elements) == 0) {
+ /*
+ * We found a MAP without any usable AREA. Fake a redirection to the
+ * address with fragment. We do this even for post data (internal link
+ * within a document with post data) if it will not result in an
+ * unwanted network request. - kw
+ */
+ if (!anAnchor->post_data) {
+ StrAllocCopy(redirecting_url, address);
+ return (HT_REDIRECTING);
+ } else if (WWWDoc.safe ||
+ (underlying->document && !anAnchor->document &&
+ (LYinternal_flag || LYoverride_no_cache))) {
+ StrAllocCopy(redirecting_url, address);
+ redirect_post_content = TRUE;
+ return (HT_REDIRECTING);
+ }
+ }
+ if (!(theMap && theMap->elements)) {
+ if (anAnchor->post_data && !WWWDoc.safe &&
+ ((underlying && underlying->document && !LYforce_no_cache) ||
+ HTConfirm(CONFIRM_POST_RESUBMISSION) != TRUE)) {
+ HTAlert(FAILED_MAP_POST_REQUEST);
+ return (HT_NOT_LOADED);
+ }
+ LYforce_no_cache = TRUE;
+ reloading = TRUE;
+ HTOutputFormat = WWW_PRESENT;
+ LYMapsOnly = TRUE;
+ if (!HTLoadAbsolute(&WWWDoc)) {
+ LYforce_no_cache = old_cache_setting;
+ reloading = old_reloading;
+ HTOutputFormat = old_format_out;
+ LYMapsOnly = FALSE;
+ HTAlert(MAP_NOT_ACCESSIBLE);
+ return (HT_NOT_LOADED);
+ }
+ LYforce_no_cache = old_cache_setting;
+ reloading = old_reloading;
+ HTOutputFormat = old_format_out;
+ LYMapsOnly = FALSE;
+ cur = get_the_list(&WWWDoc, address, anAnchor, &underlying);
+ while (NULL != (theMap = (LYImageMap *) HTList_nextObject(cur))) {
+ if (!strcmp(theMap->address, address)) {
+ break;
+ }
+ }
+ if (!(theMap && theMap->elements)) {
+ HTAlert(MAP_NOT_AVAILABLE);
+ return (HT_NOT_LOADED);
+ }
+ }
+ if (track_internal_links)
+ anAnchor->no_cache = TRUE;
+
+ target = HTStreamStack(format_in,
+ format_out,
+ sink, anAnchor);
+
+ if (target == NULL) {
+ HTSprintf0(&buf, CANNOT_CONVERT_I_TO_O,
+ HTAtom_name(format_in), HTAtom_name(format_out));
+ HTAlert(buf);
+ FREE(buf);
+ return (HT_NOT_LOADED);
+ }
+
+ if (non_empty(theMap->title)) {
+ StrAllocCopy(MapTitle, theMap->title);
+ } else if (non_empty(anAnchor->title)) {
+ StrAllocCopy(MapTitle, anAnchor->title);
+ } else if (non_empty(LYRequestTitle) &&
+ strcasecomp(LYRequestTitle, NO_MAP_TITLE)) {
+ StrAllocCopy(MapTitle, LYRequestTitle);
+ } else if ((cp = StrChr(address, '#')) != NULL) {
+ StrAllocCopy(MapTitle, (cp + 1));
+ }
+ if (isEmpty(MapTitle)) {
+ StrAllocCopy(MapTitle, NO_MAP_TITLE);
+ } else {
+ LYEntify(&MapTitle, TRUE);
+ }
+
+#define PUTS(buf) (*target->isa->put_block)(target, buf, (int) strlen(buf))
+
+ HTSprintf0(&buf, "<html>\n<head>\n");
+ PUTS(buf);
+ HTSprintf0(&buf, "<META %s content=\"" STR_HTML ";charset=%s\">\n",
+ "http-equiv=\"content-type\"",
+ LYCharSet_UC[current_char_set].MIMEname);
+ PUTS(buf);
+ /*
+ * This page is a list of titles and anchors for them. Since titles
+ * already passed SGML/HTML stage they are converted to current_char_set.
+ * That is why we insist on META charset for this page.
+ */
+ HTSprintf0(&buf, "<title>%s</title>\n", MapTitle);
+ PUTS(buf);
+ HTSprintf0(&buf, "</head>\n<body>\n");
+ PUTS(buf);
+
+ HTSprintf0(&buf, "<h1><em>%s</em></h1>\n", MapTitle);
+ PUTS(buf);
+
+ StrAllocCopy(MapAddress, address);
+ LYEntify(&MapAddress, FALSE);
+ HTSprintf0(&buf, "<h2><em>MAP:</em>&nbsp;%s</h2>\n", MapAddress);
+ PUTS(buf);
+
+ HTSprintf0(&buf, "<%s compact>\n", ((keypad_mode == NUMBERS_AS_ARROWS) ?
+ "ol" : "ul"));
+ PUTS(buf);
+ cur = theMap->elements;
+ while (NULL != (tmp = (LYMapElement *) HTList_nextObject(cur))) {
+ StrAllocCopy(MapAddress, tmp->address);
+ LYEntify(&MapAddress, FALSE);
+ PUTS("<li><a href=\"");
+ PUTS(MapAddress);
+ PUTS("\"");
+ if (track_internal_links && tmp->intern_flag) {
+ PUTS(" TYPE=\"internal link\"");
+ }
+ PUTS("\n>");
+ LYformTitle(&MapTitle, tmp->title);
+ LYEntify(&MapTitle, TRUE);
+ PUTS(MapTitle);
+ PUTS("</a>\n");
+ }
+ HTSprintf0(&buf, "</%s>\n</body>\n</html>\n",
+ ((keypad_mode == NUMBERS_AS_ARROWS)
+ ? "ol"
+ : "ul"));
+ PUTS(buf);
+
+ (*target->isa->_free) (target);
+ FREE(MapAddress);
+ FREE(MapTitle);
+ FREE(buf);
+ return (HT_LOADED);
+}
+
+void LYPrintImgMaps(FILE *fp)
+{
+ const char *only = HTLoadedDocumentURL();
+ size_t only_len = strlen(only);
+ HTList *outer = LynxMaps;
+ HTList *inner;
+ LYImageMap *map;
+ LYMapElement *elt;
+ int count;
+
+ if (HTList_count(outer) > 0) {
+ while (NULL != (map = (LYImageMap *) HTList_nextObject(outer))) {
+ if (only_len != 0) {
+ if (StrNCmp(only, map->address, only_len)
+ || (map->address[only_len] != '\0'
+ && map->address[only_len] != '#')) {
+ continue;
+ }
+ }
+ fprintf(fp, "\n%s\n", isEmpty(map->title) ? NO_MAP_TITLE : map->title);
+ fprintf(fp, "%s\n", map->address);
+ inner = map->elements;
+ count = 0;
+ while (NULL != (elt = (LYMapElement *) HTList_nextObject(inner))) {
+ fprintf(fp, "%4d. %s", ++count, elt->address);
+ if (track_internal_links && elt->intern_flag)
+ fprintf(fp, " TYPE=\"internal link\"");
+ fprintf(fp, "\n");
+ }
+ }
+ }
+}
+
+#ifdef GLOBALDEF_IS_MACRO
+#define _LYIMGMAP_C_GLOBALDEF_1_INIT { "LYNXIMGMAP", LYLoadIMGmap, 0}
+GLOBALDEF(HTProtocol, LYLynxIMGmap, _LYIMGMAP_C_GLOBALDEF_1_INIT);
+#else
+GLOBALDEF HTProtocol LYLynxIMGmap =
+{"LYNXIMGMAP", LYLoadIMGmap, 0};
+#endif /* GLOBALDEF_IS_MACRO */
diff --git a/src/LYMap.h b/src/LYMap.h
new file mode 100644
index 0000000..7c0b9ff
--- /dev/null
+++ b/src/LYMap.h
@@ -0,0 +1,29 @@
+/* $LynxId: LYMap.h,v 1.12 2010/09/25 11:35:42 tom Exp $ */
+#ifndef LYMAP_H
+#define LYMAP_H
+
+#ifndef HTUTILS_H
+#include <HTUtils.h>
+#endif
+
+#include <HTList.h>
+#include <HTAnchor.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ extern BOOL LYMapsOnly;
+
+ extern void ImageMapList_free(HTList *list);
+ extern void LYPrintImgMaps(FILE *fp);
+ extern BOOL LYAddImageMap(char *address, char *title,
+ HTParentAnchor *node_anchor);
+ extern BOOL LYAddMapElement(char *map, char *address, char *title,
+ HTParentAnchor *node_anchor,
+ int intern_flag);
+ extern BOOL LYHaveImageMap(char *address);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* LYMAP_H */
diff --git a/src/LYNews.c b/src/LYNews.c
new file mode 100644
index 0000000..bb49289
--- /dev/null
+++ b/src/LYNews.c
@@ -0,0 +1,509 @@
+/*
+ * $LynxId: LYNews.c,v 1.62 2018/03/18 18:51:02 tom Exp $
+ */
+#include <HTUtils.h>
+#ifndef DISABLE_NEWS
+#include <HTParse.h>
+#include <HTAccess.h>
+#include <HTCJK.h>
+#include <HTAlert.h>
+#include <LYCurses.h>
+#include <LYSignal.h>
+#include <LYStructs.h>
+#include <LYUtils.h>
+#include <LYClean.h>
+#include <LYStrings.h>
+#include <LYHistory.h>
+#include <GridText.h>
+#include <LYCharSets.h>
+#include <LYNews.h>
+#include <LYEdit.h>
+
+#include <LYGlobalDefs.h>
+
+#include <LYLeaks.h>
+
+/*
+ * Global variable for async i/o.
+ */
+BOOLEAN term_message = FALSE;
+static void terminate_message(int sig);
+
+static BOOLEAN message_has_content(const char *filename,
+ BOOLEAN *nonspaces)
+{
+ FILE *fp;
+ char *buffer = NULL;
+ BOOLEAN in_headers = TRUE;
+
+ *nonspaces = FALSE;
+
+ if (!filename || (fp = fopen(filename, "r")) == NULL) {
+ CTRACE((tfp, "Failed to open file %s for reading!\n",
+ NONNULL(filename)));
+ return FALSE;
+ }
+ while (LYSafeGets(&buffer, fp) != NULL) {
+ char *cp = buffer;
+ char firstnonblank = '\0';
+
+ LYTrimNewline(cp);
+ for (; *cp; cp++) {
+ if (!firstnonblank && isgraph(UCH(*cp))) {
+ firstnonblank = *cp;
+ } else if (!isspace(UCH(*cp))) {
+ *nonspaces = TRUE;
+ }
+ }
+ if (firstnonblank && firstnonblank != '>') {
+ if (!in_headers) {
+ LYCloseInput(fp);
+ FREE(buffer);
+ return TRUE;
+ }
+ }
+ if (!firstnonblank) {
+ in_headers = FALSE;
+ }
+ }
+ FREE(buffer);
+ LYCloseInput(fp);
+ return FALSE;
+}
+
+/*
+ * This function is called from HTLoadNews() to have the user
+ * create a file with news headers and a body for posting of
+ * a new message (based on a newspost://nntp_host/newsgroups
+ * or snewspost://secure_nntp_host/newsgroups URL), or to post
+ * a followup (based on a newsreply://nntp_host/newsgroups or
+ * snewsreply://secure_nntp_host/newsgroups URL). The group
+ * or comma-separated list of newsgroups is passed without
+ * a lead slash, and followup is TRUE for newsreply or
+ * snewsreply URLs. - FM
+ */
+char *LYNewsPost(char *newsgroups,
+ int followup)
+{
+ char user_input[MAX_LINE];
+ char CJKinput[MAX_LINE];
+ char *cp = NULL;
+ const char *kp = NULL;
+ int c = 0; /* user input */
+ int len;
+ FILE *fd = NULL;
+ char my_tempfile[LY_MAXPATH];
+ FILE *fc = NULL;
+ char CJKfile[LY_MAXPATH];
+ char *postfile = NULL;
+ char *NewsGroups = NULL;
+ char *References = NULL;
+ char *org = NULL;
+ FILE *fp = NULL;
+ BOOLEAN nonempty = FALSE;
+ BOOLEAN nonspaces = FALSE;
+
+ /*
+ * Make sure a non-zero length newspost, newsreply, snewspost or snewsreply
+ * path was sent to us. - FM
+ */
+ if (isEmpty(newsgroups))
+ return (postfile);
+
+ /*
+ * Return immediately if we do get called, maybe by some quirk of HTNews.c,
+ * when we shouldn't. - kw
+ */
+ if (no_newspost)
+ return (postfile);
+
+ /*
+ * Open a temporary file for the headers and message body. - FM
+ */
+#ifdef __DJGPP__
+ if ((fd = LYOpenTemp(my_tempfile, HTML_SUFFIX, BIN_W)) == NULL)
+#else
+ if ((fd = LYOpenTemp(my_tempfile, HTML_SUFFIX, "w")) == NULL)
+#endif /* __DJGPP__ */
+ {
+ HTAlert(CANNOT_OPEN_TEMP);
+ return (postfile);
+ }
+
+ /*
+ * If we're using a Japanese display character set, open a temporary file
+ * for a conversion to JIS. - FM
+ */
+ CJKfile[0] = '\0';
+ if (current_char_set == UCGetLYhndl_byMIME("euc-jp") ||
+ current_char_set == UCGetLYhndl_byMIME("shift_jis")) {
+ if ((fc = LYOpenTemp(CJKfile, HTML_SUFFIX, "w")) == NULL) {
+ HTAlert(CANNOT_OPEN_TEMP);
+ (void) LYRemoveTemp(my_tempfile);
+ return (postfile);
+ }
+ }
+
+ /*
+ * The newsgroups could be a comma-seperated list. It need not have
+ * spaces, but deal with any that may also have been hex escaped. - FM
+ */
+ StrAllocCopy(NewsGroups, newsgroups);
+ if ((cp = strstr(NewsGroups, ";ref="))) {
+ *cp = '\0';
+ cp += 5;
+ if (*cp == '<') {
+ StrAllocCopy(References, cp);
+ } else {
+ StrAllocCopy(References, "<");
+ StrAllocCat(References, cp);
+ StrAllocCat(References, ">");
+ }
+ HTUnEscape(References);
+ if (!((cp = StrChr(References, '@')) && cp > References + 1 &&
+ isalnum(UCH(cp[1])))) {
+ FREE(References);
+ }
+ }
+ HTUnEscape(NewsGroups);
+ if (!*NewsGroups) {
+ LYCloseTempFP(fd); /* Close the temp file. */
+ goto cleanup;
+ }
+
+ /*
+ * Allow ^C to cancel the posting, i.e., don't let SIGINTs exit Lynx.
+ */
+ signal(SIGINT, terminate_message);
+ term_message = FALSE;
+
+ /*
+ * Show the list of newsgroups. - FM
+ */
+ LYclear();
+ LYmove(2, 0);
+ scrollok(LYwin, TRUE); /* Enable scrolling. */
+ LYaddstr(gettext("You will be posting to:"));
+ LYaddstr("\n\t");
+ LYaddstr(NewsGroups);
+ LYaddch('\n');
+
+ /*
+ * Get the mail address for the From header, offering personal_mail_address
+ * as default.
+ */
+ LYaddstr(gettext("\n\n Please provide your mail address for the From: header\n"));
+ sprintf(user_input, "From: %.*s", (int) sizeof(user_input) - 8,
+ NonNull(personal_mail_address));
+ if (LYGetStr(user_input, FALSE,
+ sizeof(user_input), NORECALL) < 0 ||
+ term_message) {
+ HTInfoMsg(NEWS_POST_CANCELLED);
+ LYCloseTempFP(fd); /* Close the temp file. */
+ scrollok(LYwin, FALSE); /* Stop scrolling. */
+ goto cleanup;
+ }
+ fprintf(fd, "%s\n", user_input);
+
+ /*
+ * Get the Subject header, offering the current document's title as the
+ * default if this is a followup rather than a new post. - FM
+ */
+ LYaddstr(gettext("\n\n Please provide or edit the Subject: header\n"));
+ strcpy(user_input, "Subject: ");
+ if ((followup == TRUE && nhist > 0) &&
+ (kp = HText_getTitle()) != NULL) {
+ /*
+ * Add the default subject.
+ */
+ kp = LYSkipCBlanks(kp);
+#ifdef CJK_EX /* 1998/05/15 (Fri) 09:10:38 */
+ if (HTCJK == JAPANESE) {
+ CJKinput[0] = '\0';
+ switch (kanji_code) {
+ case EUC:
+ TO_EUC((const unsigned char *) kp, (unsigned char *) CJKinput);
+ kp = CJKinput;
+ break;
+ case SJIS:
+ TO_SJIS((const unsigned char *) kp, (unsigned char *) CJKinput);
+ kp = CJKinput;
+ break;
+ default:
+ break;
+ }
+ }
+#endif
+ if (strncasecomp(kp, "Re:", 3)) {
+ strcat(user_input, "Re: ");
+ }
+ len = (int) strlen(user_input);
+ LYStrNCpy(user_input + len, kp, (int) sizeof(user_input) - len - 1);
+ }
+ cp = NULL;
+ if (LYGetStr(user_input, FALSE,
+ sizeof(user_input), NORECALL) < 0 ||
+ term_message) {
+ HTInfoMsg(NEWS_POST_CANCELLED);
+ LYCloseTempFP(fd); /* Close the temp file. */
+ scrollok(LYwin, FALSE); /* Stop scrolling. */
+ goto cleanup;
+ }
+ fprintf(fd, "%s\n", user_input);
+
+ /*
+ * Add Organization: header.
+ */
+ StrAllocCopy(cp, "Organization: ");
+ if ((org = LYGetEnv("ORGANIZATION")) != NULL) {
+ StrAllocCat(cp, org);
+ } else if ((org = LYGetEnv("NEWS_ORGANIZATION")) != NULL) {
+ StrAllocCat(cp, org);
+ }
+#ifdef UNIX
+ else if ((fp = fopen("/etc/organization", TXT_R)) != NULL) {
+ char *buffer = 0;
+
+ if (LYSafeGets(&buffer, fp) != NULL) {
+ if (user_input[0] != '\0') {
+ LYTrimNewline(buffer);
+ StrAllocCat(cp, buffer);
+ }
+ }
+ FREE(buffer);
+ LYCloseInput(fp);
+ }
+#else
+#ifdef _WINDOWS /* 1998/05/14 (Thu) 17:47:01 */
+ else {
+ char *p, fname[LY_MAXPATH];
+
+ strcpy(fname, LynxSigFile);
+ p = strrchr(fname, '/');
+ if (p != 0 && (p - fname) < sizeof(fname) - 15) {
+ strcpy(p + 1, "LYNX_ETC.TXT");
+ if ((fp = fopen(fname, TXT_R)) != NULL) {
+ if (fgets(user_input, (int) sizeof(user_input), fp) != NULL) {
+ if ((org = StrChr(user_input, '\n')) != NULL) {
+ *org = '\0';
+ }
+ if (user_input[0] != '\0') {
+ StrAllocCat(cp, user_input);
+ }
+ }
+ LYCloseInput(fp);
+ }
+ }
+ }
+#endif /* _WINDOWS */
+#endif /* !UNIX */
+ LYStrNCpy(user_input, cp, (sizeof(user_input) - 16));
+ FREE(cp);
+ LYaddstr(gettext("\n\n Please provide or edit the Organization: header\n"));
+ if (LYGetStr(user_input, FALSE,
+ sizeof(user_input), NORECALL) < 0 ||
+ term_message) {
+ HTInfoMsg(NEWS_POST_CANCELLED);
+ LYCloseTempFP(fd); /* Close the temp file. */
+ scrollok(LYwin, FALSE); /* Stop scrolling. */
+ goto cleanup;
+ }
+ fprintf(fd, "%s\n", user_input);
+
+ if (References) {
+ fprintf(fd, "References: %s\n", References);
+ }
+ /*
+ * Add Newsgroups Summary and Keywords headers.
+ */
+ fprintf(fd, "Newsgroups: %s\nSummary: \nKeywords: \n\n", NewsGroups);
+
+ /*
+ * Have the user create the message body.
+ */
+ if (!no_editor && non_empty(editor)) {
+
+ if (followup && nhist > 0) {
+ /*
+ * Ask if the user wants to include the original message.
+ */
+ if (term_message) {
+ _statusline(INC_ORIG_MSG_PROMPT);
+ } else if (HTConfirm(INC_ORIG_MSG_PROMPT) == YES) {
+ /*
+ * The 'TRUE' will add the reply ">" in front of every line.
+ * We're assuming that if the display character set is Japanese
+ * and the document did not have a CJK charset, any non-EUC or
+ * non-SJIS 8-bit characters in it where converted to 7-bit
+ * equivalents. - FM
+ */
+ print_wwwfile_to_fd(fd, FALSE, TRUE);
+ }
+ }
+ LYCloseTempFP(fd); /* Close the temp file. */
+ scrollok(LYwin, FALSE); /* Stop scrolling. */
+ if (term_message || LYCharIsINTERRUPT(c))
+ goto cleanup;
+
+ /*
+ * Spawn the user's editor on the news file.
+ */
+ edit_temporary_file(my_tempfile, "", SPAWNING_EDITOR_FOR_NEWS);
+
+ nonempty = message_has_content(my_tempfile, &nonspaces);
+
+ } else {
+ /*
+ * Use the built in line editior.
+ */
+ LYaddstr(gettext("\n\n Please enter your message below."));
+ LYaddstr(gettext("\n When you are done, press enter and put a single period (.)"));
+ LYaddstr(gettext("\n on a line and press enter again."));
+ LYaddstr("\n\n");
+ LYrefresh();
+ *user_input = '\0';
+ if (LYGetStr(user_input, FALSE,
+ sizeof(user_input), NORECALL) < 0 ||
+ term_message) {
+ HTInfoMsg(NEWS_POST_CANCELLED);
+ LYCloseTempFP(fd); /* Close the temp file. */
+ scrollok(LYwin, FALSE); /* Stop scrolling. */
+ goto cleanup;
+ }
+ while (!STREQ(user_input, ".") && !term_message) {
+ LYaddch('\n');
+ fprintf(fd, "%s\n", user_input);
+ if (!nonempty && strlen(user_input))
+ nonempty = TRUE;
+ *user_input = '\0';
+ if (LYGetStr(user_input, FALSE,
+ sizeof(user_input), NORECALL) < 0) {
+ HTInfoMsg(NEWS_POST_CANCELLED);
+ LYCloseTempFP(fd); /* Close the temp file. */
+ scrollok(LYwin, FALSE); /* Stop scrolling. */
+ goto cleanup;
+ }
+ }
+ fprintf(fd, "\n");
+ LYCloseTempFP(fd); /* Close the temp file. */
+ scrollok(LYwin, FALSE); /* Stop scrolling. */
+ }
+
+ if (nonempty) {
+ /*
+ * Confirm whether to post, and if so, whether to append the sig file.
+ * - FM
+ */
+ LYStatusLine = (LYlines - 1);
+ c = HTConfirm(POST_MSG_PROMPT);
+ LYStatusLine = -1;
+ if (c != YES) {
+ LYclear(); /* clear the screen */
+ goto cleanup;
+ }
+ } else {
+ HTAlert(gettext("Message has no original text!"));
+ if (!nonspaces
+ || HTConfirmDefault(POST_MSG_PROMPT, NO) != YES)
+ goto cleanup;
+ }
+ if ((non_empty(LynxSigFile)) && (fp = fopen(LynxSigFile, TXT_R)) != NULL) {
+ char *msg = NULL;
+
+ HTSprintf0(&msg, APPEND_SIG_FILE, LynxSigFile);
+
+ LYStatusLine = (LYlines - 1);
+ if (term_message) {
+ _user_message(APPEND_SIG_FILE, LynxSigFile);
+ } else if (HTConfirm(msg) == YES) {
+ if ((fd = LYAppendToTxtFile(my_tempfile)) != NULL) {
+ char *buffer = NULL;
+
+ fputs("-- \n", fd);
+ while (LYSafeGets(&buffer, fp) != NULL) {
+ fputs(buffer, fd);
+ }
+ LYCloseOutput(fd);
+ }
+ }
+ LYCloseInput(fp);
+ FREE(msg);
+ LYStatusLine = -1;
+ }
+ LYclear(); /* clear the screen */
+
+ /*
+ * If we are using a Japanese display character set, convert the contents
+ * of the temp file to JIS (nothing should change if it does not, in fact,
+ * contain EUC or SJIS di-bytes). Otherwise, use the temp file as is. -
+ * FM
+ */
+ if (CJKfile[0] != '\0') {
+ if ((fd = fopen(my_tempfile, TXT_R)) != NULL) {
+ char *buffer = NULL;
+
+ while (LYSafeGets(&buffer, fd) != NULL) {
+ TO_JIS((unsigned char *) buffer,
+ (unsigned char *) CJKinput);
+ fputs(CJKinput, fc);
+ }
+ LYCloseTempFP(fc);
+ StrAllocCopy(postfile, CJKfile);
+ LYCloseInput(fd);
+ (void) LYRemoveTemp(my_tempfile);
+ strcpy(my_tempfile, CJKfile);
+ CJKfile[0] = '\0';
+ } else {
+ StrAllocCopy(postfile, my_tempfile);
+ }
+ } else {
+ StrAllocCopy(postfile, my_tempfile);
+ }
+ if (!followup) {
+ /*
+ * If it's not a followup, the current document most likely is the
+ * group listing, so force a to have the article show up in the list
+ * after the posting. Note, that if it's a followup via a link in a
+ * news article, the user must do a reload manually on returning to the
+ * group listing. - FM
+ */
+ LYforce_no_cache = TRUE;
+ }
+ LYStatusLine = (LYlines - 1);
+ HTUserMsg(POSTING_TO_NEWS);
+ LYStatusLine = -1;
+
+ /*
+ * Come here to cleanup and exit.
+ */
+ cleanup:
+#ifndef VMS
+ signal(SIGINT, cleanup_sig);
+#endif /* !VMS */
+ term_message = FALSE;
+ if (!postfile)
+ (void) LYRemoveTemp(my_tempfile);
+ (void) LYRemoveTemp(CJKfile);
+ FREE(NewsGroups);
+ FREE(References);
+
+ return (postfile);
+}
+
+static void terminate_message(int sig GCC_UNUSED)
+{
+ term_message = TRUE;
+ /*
+ * Reassert the AST.
+ */
+ signal(SIGINT, terminate_message);
+#ifdef VMS
+ /*
+ * Refresh the screen to get rid of the "interrupt" message.
+ */
+ lynx_force_repaint();
+ LYrefresh();
+#endif /* VMS */
+}
+
+#endif /* not DISABLE_NEWS */
diff --git a/src/LYNews.h b/src/LYNews.h
new file mode 100644
index 0000000..9a6a3f6
--- /dev/null
+++ b/src/LYNews.h
@@ -0,0 +1,19 @@
+/* $LynxId: LYNews.h,v 1.10 2010/09/25 11:35:12 tom Exp $ */
+#ifndef LYNEWSPOST_H
+#define LYNEWSPOST_H
+
+#ifndef LYSTRUCTS_H
+#include <LYStructs.h>
+#endif /* LYSTRUCTS_H */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ extern BOOLEAN term_message;
+
+ extern char *LYNewsPost(char *newsgroups, int followup);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* LYNEWSPOST_H */
diff --git a/src/LYOptions.c b/src/LYOptions.c
new file mode 100644
index 0000000..828aacc
--- /dev/null
+++ b/src/LYOptions.c
@@ -0,0 +1,4365 @@
+/* $LynxId: LYOptions.c,v 1.186 2023/01/05 09:17:16 tom Exp $ */
+#include <HTUtils.h>
+#include <HTFTP.h>
+#include <HTTP.h> /* 'reloading' flag */
+#include <HTML.h>
+#include <LYCurses.h>
+#include <LYUtils.h>
+#include <LYStrings.h>
+#include <LYGlobalDefs.h>
+#include <LYHistory.h>
+#include <LYOptions.h>
+#include <LYSignal.h>
+#include <LYClean.h>
+#include <LYCharSets.h>
+#include <UCMap.h>
+#include <UCAux.h>
+#include <LYKeymap.h>
+#include <LYrcFile.h>
+#include <HTAlert.h>
+#include <LYBookmark.h>
+#include <GridText.h>
+#include <LYGetFile.h>
+#include <LYReadCFG.h>
+#include <LYPrettySrc.h>
+#include <HTFile.h>
+#include <LYCharUtils.h>
+
+#ifdef USE_COLOR_STYLE
+#include <LYStyle.h>
+#endif
+
+#include <LYLeaks.h>
+
+BOOLEAN term_options;
+
+#define TOP_LINK "/"
+#define MBM_LINK "//MBM_MENU"
+
+#define MARGIN_STR (no_margins ? "" : "&nbsp;&nbsp;")
+#define MARGIN_LEN (no_margins ? 0 : 2)
+
+static void terminate_options(int sig);
+
+#define COL_OPTION_VALUES 36 /* display column where option values start */
+
+#if defined(USE_SLANG) || defined(COLOR_CURSES)
+static BOOLEAN can_do_colors = FALSE;
+#endif
+
+static int LYChosenShowColor = SHOW_COLOR_UNKNOWN; /* whether to show and save */
+
+BOOLEAN LYCheckUserAgent(void)
+{
+ if (non_empty(LYUserAgent)) {
+ if (strstr(LYUserAgent, "Lynx") == 0
+ && strstr(LYUserAgent, "lynx") == 0
+ && strstr(LYUserAgent, "L_y_n_x") == 0
+ && strstr(LYUserAgent, "l_y_n_x") == 0) {
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+
+static void validate_x_display(void)
+{
+ char *cp;
+
+ if ((cp = LYgetXDisplay()) != NULL) {
+ StrAllocCopy(x_display, cp);
+ } else {
+ FREE(x_display);
+ }
+}
+
+static void summarize_x_display(char *display_option)
+{
+ if ((x_display == NULL && *display_option == '\0') ||
+ (x_display != NULL && !strcmp(x_display, display_option))) {
+ if (x_display == NULL && LYisConfiguredForX == TRUE) {
+ _statusline(VALUE_ACCEPTED_WARNING_X);
+ } else if (x_display != NULL && LYisConfiguredForX == FALSE) {
+ _statusline(VALUE_ACCEPTED_WARNING_NONX);
+ } else {
+ _statusline(VALUE_ACCEPTED);
+ }
+ } else {
+ if (*display_option) {
+ _statusline(FAILED_TO_SET_DISPLAY);
+ } else {
+ _statusline(FAILED_CLEAR_SET_DISPLAY);
+ }
+ }
+}
+
+#if defined(USE_SLANG) || defined(COLOR_CURSES)
+static void SetupChosenShowColor(void)
+{
+ can_do_colors = TRUE;
+#if defined(COLOR_CURSES)
+ if (LYCursesON) /* could crash if called before initialization */
+ can_do_colors = (has_colors()
+ ? TRUE
+ : FALSE);
+#endif
+ if (!no_option_save) {
+ if (LYChosenShowColor == SHOW_COLOR_UNKNOWN) {
+ switch (LYrcShowColor) {
+ case SHOW_COLOR_NEVER:
+ LYChosenShowColor =
+ (LYShowColor >= SHOW_COLOR_ON) ?
+ SHOW_COLOR_ON : SHOW_COLOR_NEVER;
+ break;
+ case SHOW_COLOR_ALWAYS:
+ if (!can_do_colors)
+ LYChosenShowColor = SHOW_COLOR_ALWAYS;
+ else
+ LYChosenShowColor =
+ (LYShowColor >= SHOW_COLOR_ON) ?
+ SHOW_COLOR_ALWAYS : SHOW_COLOR_OFF;
+ break;
+ default:
+ LYChosenShowColor =
+ (LYShowColor >= SHOW_COLOR_ON) ?
+ SHOW_COLOR_ON : SHOW_COLOR_OFF;
+ }
+ }
+ }
+}
+#endif /* USE_SLANG || COLOR_CURSES */
+
+#ifndef NO_OPTION_MENU
+static int boolean_choice(int status,
+ int line,
+ int column,
+ STRING2PTR choices);
+
+#define LYChooseBoolean(status, line, column, choices) \
+ (BOOLEAN) boolean_choice(status, line, column, (const char *const*)choices)
+
+#define LYChooseEnum(status, line, column, choices) \
+ boolean_choice(status, line, column, (const char *const*)choices)
+
+#define MAXCHOICES 10
+
+/*
+ * Values for the options menu. - FM
+ *
+ * L_foo values are the Y coordinates for the menu item.
+ * B_foo values are the X coordinates for the item's prompt string.
+ * C_foo values are the X coordinates for the item's value string.
+ */
+#define L_EDITOR 2
+#define L_DISPLAY 3
+
+#define L_HOME 4
+#define C_MULTI 24
+#define B_BOOK 34
+#define C_DEFAULT 50
+
+#define L_FTPSTYPE 5
+#define L_MAIL_ADDRESS 6
+#define L_SSEARCH 7
+#define L_LANGUAGE 8
+#define L_PREF_CHARSET 9
+#define L_ASSUME_CHARSET (L_PREF_CHARSET + 1)
+#define L_CHARSET 10
+#define L_RAWMODE 11
+
+#define L_COLOR L_RAWMODE
+#define B_COLOR 44
+#define C_COLOR 62
+
+#define L_BOOL_A 12
+#define B_VIKEYS 5
+#define C_VIKEYS 15
+#define B_EMACSKEYS 22
+#define C_EMACSKEYS 36
+#define B_SHOW_DOTFILES 44
+#define C_SHOW_DOTFILES 62
+
+#define L_BOOL_B 13
+#define B_SELECT_POPUPS 5
+#define C_SELECT_POPUPS 36
+#define B_SHOW_CURSOR 44
+#define C_SHOW_CURSOR 62
+
+#define L_KEYPAD 14
+#define L_LINEED 15
+#define L_LAYOUT 16
+
+#ifdef DIRED_SUPPORT
+#define L_DIRED 17
+#define L_USER_MODE 18
+#define L_USER_AGENT 19
+#define L_EXEC 20
+#else
+#define L_USER_MODE 17
+#define L_USER_AGENT 18
+#define L_EXEC 19
+#endif /* DIRED_SUPPORT */
+
+#define L_VERBOSE_IMAGES L_USER_MODE
+#define B_VERBOSE_IMAGES 50
+#define C_VERBOSE_IMAGES (B_VERBOSE_IMAGES + 21)
+
+/* a kludge to add assume_charset only in ADVANCED mode... */
+#define L_Bool_A (use_assume_charset ? L_BOOL_A + 1 : L_BOOL_A)
+#define L_Bool_B (use_assume_charset ? L_BOOL_B + 1 : L_BOOL_B)
+#define L_Exec (use_assume_charset ? L_EXEC + 1 : L_EXEC)
+#define L_Rawmode (use_assume_charset ? L_RAWMODE + 1 : L_RAWMODE)
+#define L_Charset (use_assume_charset ? L_CHARSET + 1 : L_CHARSET)
+#define L_Color (use_assume_charset ? L_COLOR + 1 : L_COLOR)
+#define L_Keypad (use_assume_charset ? L_KEYPAD + 1 : L_KEYPAD)
+#define L_Lineed (use_assume_charset ? L_LINEED + 1 : L_LINEED)
+#define L_Layout (use_assume_charset ? L_LAYOUT + 1 : L_LAYOUT)
+#define L_Dired (use_assume_charset ? L_DIRED + 1 : L_DIRED)
+#define L_User_Mode (use_assume_charset ? L_USER_MODE + 1 : L_USER_MODE)
+#define L_User_Agent (use_assume_charset ? L_USER_AGENT + 1 : L_USER_AGENT)
+
+#define LPAREN '('
+#define RPAREN ')'
+
+static int add_it(char *text, int len)
+{
+ if (len) {
+ text[len] = '\0';
+ LYaddstr(text);
+ }
+ return 0;
+}
+
+/*
+ * addlbl() is used instead of plain LYaddstr() in old-style options menu
+ * to show hot keys in bold.
+ */
+static void addlbl(const char *text)
+{
+ char actual[80];
+ int s, d;
+ BOOL b = FALSE;
+
+ for (s = d = 0; text[s]; s++) {
+ actual[d++] = text[s];
+ if (text[s] == LPAREN) {
+ d = add_it(actual, d - 1);
+ lynx_start_bold();
+ b = TRUE;
+ actual[d++] = text[s];
+ } else if (text[s] == RPAREN) {
+ d = add_it(actual, d);
+ lynx_stop_bold();
+ b = FALSE;
+ }
+ }
+ add_it(actual, d);
+ if (b)
+ lynx_stop_bold();
+}
+
+#if !defined(VMS) || defined(USE_SLANG)
+#define HANDLE_LYOPTIONS \
+ if (term_options) { \
+ term_options = FALSE; \
+ } else { \
+ AddValueAccepted = TRUE; \
+ } \
+ goto draw_options
+#else
+#define HANDLE_LYOPTIONS \
+ term_options = FALSE; \
+ if (use_assume_charset != old_use_assume_charset) \
+ goto draw_options
+#endif /* !VMS || USE_SLANG */
+
+void LYoptions(void)
+{
+#define ShowBool(value) LYaddstr((value) ? "ON " : "OFF")
+ static const char *bool_choices[] =
+ {
+ "OFF",
+ "ON",
+ NULL
+ };
+ static const char *const caseless_choices[] =
+ {
+ "CASE INSENSITIVE",
+ "CASE SENSITIVE",
+ NULL
+ };
+
+#ifdef DIRED_SUPPORT
+ static const char *dirList_choices[] =
+ {
+ "Directories first",
+ "Files first",
+ "Mixed style",
+ NULL
+ };
+#endif
+
+#if defined(ENABLE_OPTS_CHANGE_EXEC) && (defined(EXEC_LINKS) || defined(EXEC_SCRIPTS))
+ static const char *exec_choices[] =
+ {
+ "ALWAYS OFF",
+ "FOR LOCAL FILES ONLY",
+#ifndef NEVER_ALLOW_REMOTE_EXEC
+ "ALWAYS ON",
+#endif /* !NEVER_ALLOW_REMOTE_EXEC */
+ NULL
+ };
+#endif
+ static const char *fileSort_choices[] =
+ {
+ "By Filename",
+ "By Type",
+ "By Size",
+ "By Date",
+ NULL
+ };
+ static const char *keypad_choices[] =
+ {
+ "Numbers act as arrows",
+ "Links are numbered",
+ "Links and form fields are numbered",
+ NULL
+ };
+ static const char *mbm_choices[] =
+ {
+ "OFF ",
+ "STANDARD",
+ "ADVANCED",
+ NULL
+ };
+ static const char *userMode_choices[] =
+ {
+ "Novice",
+ "Intermediate",
+ "Advanced",
+ "Minimal",
+ NULL
+ };
+
+#if defined(ENABLE_OPTS_CHANGE_EXEC) && (defined(EXEC_LINKS) || defined(EXEC_SCRIPTS))
+ int itmp;
+#endif /* ENABLE_OPTS_CHANGE_EXEC */
+ int response, ch;
+
+ /*
+ * If the user changes the display we need memory to put it in.
+ */
+ bstring *my_data = NULL;
+ char *choices[MAXCHOICES];
+ int CurrentCharSet = current_char_set;
+ int CurrentAssumeCharSet = UCLYhndl_for_unspec;
+ int CurrentShowColor = LYShowColor;
+ BOOLEAN CurrentRawMode = LYRawMode;
+ BOOLEAN AddValueAccepted = FALSE;
+ BOOL use_assume_charset;
+
+#if defined(VMS) || defined(USE_SLANG)
+ BOOL old_use_assume_charset;
+#endif
+
+#ifdef DIRED_SUPPORT
+#ifdef ENABLE_OPTS_CHANGE_EXEC
+ if (LYlines < 24) {
+ HTAlert(OPTION_SCREEN_NEEDS_24);
+ return;
+ }
+#else
+ if (LYlines < 23) {
+ HTAlert(OPTION_SCREEN_NEEDS_23);
+ return;
+ }
+#endif /* ENABLE_OPTS_CHANGE_EXEC */
+#else
+#ifdef ENABLE_OPTS_CHANGE_EXEC
+ if (LYlines < 23) {
+ HTAlert(OPTION_SCREEN_NEEDS_23);
+ return;
+ }
+#else
+ if (LYlines < 22) {
+ HTAlert(OPTION_SCREEN_NEEDS_22);
+ return;
+ }
+#endif /* ENABLE_OPTS_CHANGE_EXEC */
+#endif /* DIRED_SUPPORT */
+
+ term_options = FALSE;
+ LYStatusLine = (LYlines - 1); /* screen is otherwise too crowded */
+ signal(SIGINT, terminate_options);
+ if (no_option_save) {
+ if (LYShowColor == SHOW_COLOR_NEVER) {
+ LYShowColor = SHOW_COLOR_OFF;
+ } else if (LYShowColor == SHOW_COLOR_ALWAYS) {
+ LYShowColor = SHOW_COLOR_ON;
+ }
+#if defined(USE_SLANG) || defined(COLOR_CURSES)
+ } else {
+ SetupChosenShowColor();
+#endif /* USE_SLANG || COLOR_CURSES */
+ }
+
+ use_assume_charset = (BOOLEAN) (user_mode == ADVANCED_MODE);
+
+ draw_options:
+
+#if defined(VMS) || defined(USE_SLANG)
+ old_use_assume_charset = use_assume_charset;
+#endif
+ /*
+ * NOTE that printw() should be avoided for strings that might have
+ * non-ASCII or multibyte/CJK characters. - FM
+ */
+#if defined(FANCY_CURSES) || defined (USE_SLANG)
+ if (enable_scrollback) {
+ LYclear();
+ } else {
+ LYerase();
+ }
+#else
+ LYclear();
+#endif /* FANCY_CURSES || USE_SLANG */
+ LYmove(0, 5);
+
+ lynx_start_h1_color();
+ LYaddstr(" Options Menu (");
+ LYaddstr(LYNX_NAME);
+ LYaddstr(" Version ");
+ LYaddstr(LYNX_VERSION);
+ LYaddch(')');
+ lynx_stop_h1_color();
+ LYmove(L_EDITOR, 5);
+ addlbl("(E)ditor : ");
+ LYaddstr(non_empty(editor) ? editor : "NONE");
+
+ LYmove(L_DISPLAY, 5);
+ addlbl("(D)ISPLAY variable : ");
+ LYaddstr(non_empty(x_display) ? x_display : "NONE");
+
+ LYmove(L_HOME, 5);
+ addlbl("mu(L)ti-bookmarks: ");
+ LYaddstr(mbm_choices[LYMultiBookmarks]);
+ LYmove(L_HOME, B_BOOK);
+ if (LYMultiBookmarks != MBM_OFF) {
+ addlbl("review/edit (B)ookmarks files");
+ } else {
+ addlbl("(B)ookmark file: ");
+ LYaddstr(non_empty(bookmark_page) ? bookmark_page : "NONE");
+ }
+
+ LYmove(L_FTPSTYPE, 5);
+ addlbl("(F)TP sort criteria : ");
+ LYaddstr((HTfileSortMethod == FILE_BY_NAME ? "By Filename" :
+ (HTfileSortMethod == FILE_BY_SIZE ? "By Size " :
+ (HTfileSortMethod == FILE_BY_TYPE ? "By Type " :
+ "By Date "))));
+
+ LYmove(L_MAIL_ADDRESS, 5);
+ addlbl("(P)ersonal mail address : ");
+ LYaddstr(non_empty(personal_mail_address) ?
+ personal_mail_address : "NONE");
+
+ LYmove(L_SSEARCH, 5);
+ addlbl("(S)earching type : ");
+ LYaddstr(LYcase_sensitive ? "CASE SENSITIVE " : "CASE INSENSITIVE");
+
+ LYmove(L_Charset, 5);
+ addlbl("display (C)haracter set : ");
+ LYaddstr(LYchar_set_names[current_char_set]);
+
+ LYmove(L_LANGUAGE, 5);
+ addlbl("preferred document lan(G)uage: ");
+ LYaddstr(non_empty(language) ? language : "NONE");
+
+ LYmove(L_PREF_CHARSET, 5);
+ addlbl("preferred document c(H)arset : ");
+ LYaddstr(non_empty(pref_charset) ? pref_charset : "NONE");
+
+ if (use_assume_charset) {
+ LYmove(L_ASSUME_CHARSET, 5);
+ addlbl("(^A)ssume charset if unknown : ");
+ if (UCAssume_MIMEcharset)
+ LYaddstr(UCAssume_MIMEcharset);
+ else
+ LYaddstr((UCLYhndl_for_unspec >= 0) ?
+ LYCharSet_UC[UCLYhndl_for_unspec].MIMEname
+ : "NONE");
+ }
+
+ LYmove(L_Rawmode, 5);
+ addlbl("Raw 8-bit or CJK m(O)de : ");
+ ShowBool(LYRawMode);
+
+#if defined(USE_SLANG) || defined(COLOR_CURSES)
+ LYmove(L_Color, B_COLOR);
+ addlbl("show color (&) : ");
+ if (no_option_save) {
+ ShowBool(LYShowColor == SHOW_COLOR_OFF);
+ } else {
+ switch (LYChosenShowColor) {
+ case SHOW_COLOR_NEVER:
+ LYaddstr("NEVER ");
+ break;
+ case SHOW_COLOR_OFF:
+ LYaddstr("OFF");
+ break;
+ case SHOW_COLOR_ON:
+ LYaddstr("ON ");
+ break;
+ case SHOW_COLOR_ALWAYS:
+#if defined(COLOR_CURSES)
+ if (!has_colors())
+ LYaddstr("Always try");
+ else
+#endif
+ LYaddstr("ALWAYS ");
+ }
+ }
+#endif /* USE_SLANG || COLOR_CURSES */
+
+ LYmove(L_Bool_A, B_VIKEYS);
+ addlbl("(V)I keys: ");
+ ShowBool(vi_keys);
+
+ LYmove(L_Bool_A, B_EMACSKEYS);
+ addlbl("e(M)acs keys: ");
+ ShowBool(emacs_keys);
+
+ LYmove(L_Bool_A, B_SHOW_DOTFILES);
+ addlbl("sho(W) dot files: ");
+ ShowBool(!no_dotfiles && show_dotfiles);
+
+ LYmove(L_Bool_B, B_SELECT_POPUPS);
+ addlbl("popups for selec(T) fields : ");
+ ShowBool(LYSelectPopups);
+
+ LYmove(L_Bool_B, B_SHOW_CURSOR);
+ addlbl("show cursor (@) : ");
+ ShowBool(LYShowCursor);
+
+ LYmove(L_Keypad, 5);
+ addlbl("(K)eypad mode : ");
+ LYaddstr((fields_are_numbered() && links_are_numbered())
+ ? "Links and form fields are numbered"
+ : (links_are_numbered()
+ ? "Links are numbered "
+ : (fields_are_numbered()
+ ? "Form fields are numbered "
+ : "Numbers act as arrows ")));
+
+ LYmove(L_Lineed, 5);
+ addlbl("li(N)e edit style : ");
+ LYaddstr(LYEditorNames[current_lineedit]);
+
+#ifdef EXP_KEYBOARD_LAYOUT
+ LYmove(L_Layout, 5);
+ addlbl("Ke(Y)board layout : ");
+ LYaddstr(LYKbLayoutNames[current_layout]);
+#endif
+
+#ifdef DIRED_SUPPORT
+ LYmove(L_Dired, 5);
+ addlbl("l(I)st directory style : ");
+ LYaddstr((dir_list_style == FILES_FIRST) ? "Files first " :
+ ((dir_list_style == MIXED_STYLE) ? "Mixed style " :
+ "Directories first"));
+#endif /* DIRED_SUPPORT */
+
+ LYmove(L_User_Mode, 5);
+ addlbl("(U)ser mode : ");
+ LYaddstr((user_mode == NOVICE_MODE) ? "Novice " :
+ ((user_mode == INTERMEDIATE_MODE) ? "Intermediate" :
+ ((user_mode == ADVANCED_MODE) ? "Advanced " :
+ "Minimal ")));
+
+ addlbl(" verbose images (!) : ");
+ ShowBool(verbose_img);
+
+ LYmove(L_User_Agent, 5);
+ addlbl("user (A)gent : ");
+ LYaddstr(non_empty(LYUserAgent) ? LYUserAgent : "NONE");
+
+#if defined(ENABLE_OPTS_CHANGE_EXEC) && (defined(EXEC_LINKS) || defined(EXEC_SCRIPTS))
+ LYmove(L_Exec, 5);
+ addlbl("local e(X)ecution links : ");
+#ifndef NEVER_ALLOW_REMOTE_EXEC
+ LYaddstr(local_exec ? "ALWAYS ON " :
+ (local_exec_on_local_files ? "FOR LOCAL FILES ONLY" :
+ "ALWAYS OFF "));
+#else
+ LYaddstr(local_exec_on_local_files ? "FOR LOCAL FILES ONLY" :
+ "ALWAYS OFF ");
+#endif /* !NEVER_ALLOW_REMOTE_EXEC */
+#endif /* ENABLE_OPTS_CHANGE_EXEC */
+
+ LYmove(LYlines - 3, 2);
+ LYaddstr(SELECT_SEGMENT);
+ lynx_start_bold();
+ LYaddstr(CAP_LETT_SEGMENT);
+ lynx_stop_bold();
+ LYaddstr(OF_OPT_LINE_SEGMENT);
+ if (!no_option_save) {
+ LYaddstr(" '");
+ lynx_start_bold();
+ LYaddstr(">");
+ lynx_stop_bold();
+ LYaddstr("'");
+ LYaddstr(TO_SAVE_SEGMENT);
+ }
+ LYaddstr(OR_SEGMENT);
+ LYaddstr("'");
+ lynx_start_bold();
+ LYaddstr("r");
+ lynx_stop_bold();
+ LYaddstr("'");
+ LYaddstr(TO_RETURN_SEGMENT);
+
+ response = 0;
+ while (response != 'R' &&
+ !LYisNonAlnumKeyname(response, LYK_PREV_DOC) &&
+ response != '>' && !term_options &&
+ !LYCharIsINTERRUPT_NO_letter(response)) {
+ if (AddValueAccepted == TRUE) {
+ _statusline(VALUE_ACCEPTED);
+ AddValueAccepted = FALSE;
+ }
+ LYmove((LYlines - 2), 0);
+ lynx_start_prompt_color();
+ LYaddstr(COMMAND_PROMPT);
+ lynx_stop_prompt_color();
+
+ LYrefresh();
+ response = LYgetch_single();
+ if (term_options || LYCharIsINTERRUPT_NO_letter(response))
+ response = 'R';
+ if (LYisNonAlnumKeyname(response, LYK_REFRESH)) {
+ lynx_force_repaint();
+ goto draw_options;
+ }
+ switch (response) {
+ case 'E': /* Change the editor. */
+ if (no_editor) {
+ _statusline(EDIT_DISABLED);
+ } else if (system_editor) {
+ _statusline(EDITOR_LOCKED);
+ } else {
+ if (non_empty(editor)) {
+ BStrCopy0(my_data, editor);
+ } else { /* clear the NONE */
+ LYmove(L_EDITOR, COL_OPTION_VALUES);
+ LYaddstr(" ");
+ BStrCopy0(my_data, "");
+ }
+ _statusline(ACCEPT_DATA);
+ LYmove(L_EDITOR, COL_OPTION_VALUES);
+ lynx_start_bold();
+ ch = LYgetBString(&my_data, FALSE, 0, NORECALL);
+ lynx_stop_bold();
+ LYmove(L_EDITOR, COL_OPTION_VALUES);
+ if (term_options || ch == -1) {
+ LYaddstr(non_empty(editor) ?
+ editor : "NONE");
+ } else if (isBEmpty(my_data)) {
+ FREE(editor);
+ LYaddstr("NONE");
+ } else {
+ StrAllocCopy(editor, my_data->str);
+ LYaddstr(editor);
+ }
+ LYclrtoeol();
+ if (ch == -1) {
+ HTInfoMsg(CANCELLED);
+ HTInfoMsg("");
+ } else {
+ _statusline(VALUE_ACCEPTED);
+ }
+ }
+ response = ' ';
+ break;
+
+ case 'D': /* Change the display. */
+ if (non_empty(x_display)) {
+ BStrCopy0(my_data, x_display);
+ } else { /* clear the NONE */
+ LYmove(L_DISPLAY, COL_OPTION_VALUES);
+ LYaddstr(" ");
+ BStrCopy0(my_data, "");
+ }
+ _statusline(ACCEPT_DATA);
+ LYmove(L_DISPLAY, COL_OPTION_VALUES);
+ lynx_start_bold();
+ ch = LYgetBString(&my_data, FALSE, 0, NORECALL);
+ lynx_stop_bold();
+ LYmove(L_DISPLAY, COL_OPTION_VALUES);
+
+#ifdef VMS
+#define CompareEnvVars(a,b) strcasecomp(a, b)
+#else
+#define CompareEnvVars(a,b) strcmp(a, b)
+#endif /* VMS */
+
+ if ((term_options || ch == -1) ||
+ (x_display != NULL &&
+ !CompareEnvVars(x_display, my_data->str))) {
+ /*
+ * Cancelled, or a non-NULL display string wasn't changed. -
+ * FM
+ */
+ LYaddstr(non_empty(x_display) ? x_display : "NONE");
+ LYclrtoeol();
+ if (ch == -1) {
+ HTInfoMsg(CANCELLED);
+ HTInfoMsg("");
+ } else {
+ _statusline(VALUE_ACCEPTED);
+ }
+ response = ' ';
+ break;
+ } else if (isBEmpty(my_data)) {
+ if ((x_display == NULL) ||
+ (x_display != NULL && *x_display == '\0')) {
+ /*
+ * NULL or zero-length display string wasn't changed. - FM
+ */
+ LYaddstr("NONE");
+ LYclrtoeol();
+ _statusline(VALUE_ACCEPTED);
+ response = ' ';
+ break;
+ }
+ }
+ /*
+ * Set the new DISPLAY variable. - FM
+ */
+ LYsetXDisplay(my_data->str);
+ validate_x_display();
+ LYaddstr(x_display ? x_display : "NONE");
+ LYclrtoeol();
+ summarize_x_display(my_data->str);
+ response = ' ';
+ break;
+
+ case 'L': /* Change multibookmarks option. */
+ if (LYMBMBlocked) {
+ _statusline(MULTIBOOKMARKS_DISALLOWED);
+ response = ' ';
+ break;
+ }
+ if (!LYSelectPopups) {
+ LYMultiBookmarks = LYChooseEnum(LYMultiBookmarks,
+ L_HOME, C_MULTI,
+ mbm_choices);
+ } else {
+ LYMultiBookmarks = LYChoosePopup(LYMultiBookmarks,
+ L_HOME, (C_MULTI - 1),
+ mbm_choices,
+ 3, FALSE, FALSE);
+ }
+#if defined(VMS) || defined(USE_SLANG)
+ if (LYSelectPopups) {
+ LYmove(L_HOME, C_MULTI);
+ LYclrtoeol();
+ LYaddstr(mbm_choices[LYMultiBookmarks]);
+ }
+#endif /* VMS || USE_SLANG */
+#if !defined(VMS) && !defined(USE_SLANG)
+ if (!LYSelectPopups)
+#endif /* !VMS && !USE_SLANG */
+ {
+ LYmove(L_HOME, B_BOOK);
+ LYclrtoeol();
+ if (LYMultiBookmarks != MBM_OFF) {
+ LYaddstr(gettext("review/edit B)ookmarks files"));
+ } else {
+ LYaddstr(gettext("B)ookmark file: "));
+ LYaddstr(non_empty(bookmark_page) ?
+ bookmark_page : "NONE");
+ }
+ }
+ response = ' ';
+ if (LYSelectPopups) {
+ HANDLE_LYOPTIONS;
+ }
+ break;
+
+ case 'B': /* Change the bookmark page location. */
+ /*
+ * Anonymous users should not be allowed to change the bookmark
+ * page.
+ */
+ if (!no_bookmark) {
+ if (LYMultiBookmarks != MBM_OFF) {
+ edit_bookmarks();
+ signal(SIGINT, terminate_options);
+ goto draw_options;
+ }
+ if (non_empty(bookmark_page)) {
+ BStrCopy0(my_data, bookmark_page);
+ } else { /* clear the NONE */
+ LYmove(L_HOME, C_DEFAULT);
+ LYclrtoeol();
+ BStrCopy0(my_data, "");
+ }
+ _statusline(ACCEPT_DATA);
+ LYmove(L_HOME, C_DEFAULT);
+ lynx_start_bold();
+ ch = LYgetBString(&my_data, FALSE, 0, NORECALL);
+ lynx_stop_bold();
+ LYmove(L_HOME, C_DEFAULT);
+ BStrAlloc(my_data, my_data->len + LY_MAXPATH); /* lengthen */
+ if (term_options ||
+ ch == -1 || isBEmpty(my_data)) {
+ LYaddstr(non_empty(bookmark_page) ?
+ bookmark_page : "NONE");
+ } else if (!LYPathOffHomeOK(my_data->str, (size_t) my_data->len)) {
+ LYaddstr(non_empty(bookmark_page) ?
+ bookmark_page : "NONE");
+ LYclrtoeol();
+ _statusline(USE_PATH_OFF_HOME);
+ response = ' ';
+ break;
+ } else {
+ StrAllocCopy(bookmark_page, my_data->str);
+ StrAllocCopy(MBM_A_subbookmark[0], bookmark_page);
+ LYaddstr(bookmark_page);
+ }
+ LYclrtoeol();
+ if (ch == -1) {
+ HTInfoMsg(CANCELLED);
+ HTInfoMsg("");
+ } else {
+ _statusline(VALUE_ACCEPTED);
+ }
+ } else { /* anonymous */
+ _statusline(BOOKMARK_CHANGE_DISALLOWED);
+ }
+ response = ' ';
+ break;
+
+ case 'F': /* Change ftp directory sorting. */
+ if (!LYSelectPopups) {
+ HTfileSortMethod = LYChooseEnum(HTfileSortMethod,
+ L_FTPSTYPE, -1,
+ fileSort_choices);
+ } else {
+ HTfileSortMethod = LYChoosePopup(HTfileSortMethod,
+ L_FTPSTYPE, -1,
+ fileSort_choices,
+ 4, FALSE, FALSE);
+#if defined(VMS) || defined(USE_SLANG)
+ LYmove(L_FTPSTYPE, COL_OPTION_VALUES);
+ LYclrtoeol();
+ LYaddstr(fileSort_choices[HTfileSortMethod]);
+#endif /* VMS || USE_SLANG */
+ }
+ response = ' ';
+ if (LYSelectPopups) {
+ HANDLE_LYOPTIONS;
+ }
+ break;
+
+ case 'P': /* Change personal mail address for From headers. */
+ if (non_empty(personal_mail_address)) {
+ BStrCopy0(my_data, personal_mail_address);
+ } else { /* clear the NONE */
+ LYmove(L_MAIL_ADDRESS, COL_OPTION_VALUES);
+ LYaddstr(" ");
+ BStrCopy0(my_data, "");
+ }
+ _statusline(ACCEPT_DATA);
+ LYmove(L_MAIL_ADDRESS, COL_OPTION_VALUES);
+ lynx_start_bold();
+ ch = LYgetBString(&my_data, FALSE, 0, NORECALL);
+ lynx_stop_bold();
+ LYmove(L_MAIL_ADDRESS, COL_OPTION_VALUES);
+ if (term_options || ch == -1) {
+ LYaddstr((personal_mail_address &&
+ *personal_mail_address) ?
+ personal_mail_address : "NONE");
+ } else if (isBEmpty(my_data)) {
+ FREE(personal_mail_address);
+ LYaddstr("NONE");
+ } else {
+ StrAllocCopy(personal_mail_address, my_data->str);
+ LYaddstr(personal_mail_address);
+ }
+ LYclrtoeol();
+ if (ch == -1) {
+ HTInfoMsg(CANCELLED);
+ HTInfoMsg("");
+ } else {
+ _statusline(VALUE_ACCEPTED);
+ }
+ response = ' ';
+ break;
+
+ case 'S': /* Change case sensitivity for searches. */
+ LYcase_sensitive = LYChooseBoolean(LYcase_sensitive,
+ L_SSEARCH, -1,
+ caseless_choices);
+ response = ' ';
+ break;
+
+ case '\001': /* Change assume_charset setting. */
+ if (use_assume_charset) {
+ int i, curval;
+ const char **assume_list;
+ assume_list = typecallocn(const char *, (unsigned)
+ (LYNumCharsets + 1));
+
+ if (!assume_list) {
+ outofmem(__FILE__, "options");
+ }
+ for (i = 0; i < LYNumCharsets; i++) {
+ assume_list[i] = LYCharSet_UC[i].MIMEname;
+ }
+ curval = UCLYhndl_for_unspec;
+ if (curval == current_char_set && UCAssume_MIMEcharset) {
+ curval = UCGetLYhndl_byMIME(UCAssume_MIMEcharset);
+ }
+ if (curval < 0)
+ curval = LYRawMode ? current_char_set : 0;
+ if (!LYSelectPopups) {
+#ifndef ALL_CHARSETS_IN_O_MENU_SCREEN
+ UCLYhndl_for_unspec =
+ assumed_doc_charset_map[(LYChooseEnum(charset_subsets[curval].assumed_idx,
+ L_ASSUME_CHARSET, -1,
+ assumed_charset_choices)
+ ? 1
+ : 0)];
+#else
+ UCLYhndl_for_unspec =
+ LYChooseEnum(curval,
+ L_ASSUME_CHARSET, -1,
+ assume_list);
+#endif
+ } else {
+#ifndef ALL_CHARSETS_IN_O_MENU_SCREEN
+ UCLYhndl_for_unspec =
+ assumed_doc_charset_map[(LYChoosePopup(charset_subsets[curval].assumed_idx,
+ L_ASSUME_CHARSET, -1,
+ assumed_charset_choices,
+ 0,
+ FALSE,
+ FALSE)
+ ? 1
+ : 0)];
+#else
+ UCLYhndl_for_unspec =
+ LYChoosePopup(curval,
+ L_ASSUME_CHARSET, -1,
+ assume_list,
+ 0, FALSE, FALSE);
+#endif
+#if defined(VMS) || defined(USE_SLANG)
+ LYmove(L_ASSUME_CHARSET, COL_OPTION_VALUES);
+ LYclrtoeol();
+ if (UCLYhndl_for_unspec >= 0)
+ LYaddstr(LYCharSet_UC[UCLYhndl_for_unspec].MIMEname);
+#endif /* VMS || USE_SLANG */
+ }
+
+ /*
+ * Set the raw 8-bit or CJK mode defaults and character set if
+ * changed. - FM
+ */
+ if (CurrentAssumeCharSet != UCLYhndl_for_unspec ||
+ UCLYhndl_for_unspec != curval) {
+ if (UCLYhndl_for_unspec != CurrentAssumeCharSet) {
+ StrAllocCopy(UCAssume_MIMEcharset,
+ LYCharSet_UC[UCLYhndl_for_unspec].MIMEname);
+ }
+ if (HTCJK != JAPANESE)
+ LYRawMode = (BOOLEAN) (UCLYhndl_for_unspec == current_char_set);
+ HTMLSetUseDefaultRawMode(current_char_set, LYRawMode);
+ HTMLSetCharacterHandling(current_char_set);
+ CurrentAssumeCharSet = UCLYhndl_for_unspec;
+ CurrentRawMode = LYRawMode;
+#if !defined(VMS) && !defined(USE_SLANG)
+ if (!LYSelectPopups)
+#endif /* !VMS && !USE_SLANG */
+ {
+ LYmove(L_RAWMODE + 1, COL_OPTION_VALUES);
+ LYclrtoeol();
+ ShowBool(LYRawMode);
+ }
+ }
+ FREE(assume_list);
+ response = ' ';
+ if (LYSelectPopups) {
+ HANDLE_LYOPTIONS;
+ }
+ } else {
+ _statusline(NEED_ADVANCED_USER_MODE);
+ AddValueAccepted = FALSE;
+ }
+ break;
+
+ case 'C': /* Change display charset setting. */
+ if (!LYSelectPopups) {
+#ifndef ALL_CHARSETS_IN_O_MENU_SCREEN
+ displayed_display_charset_idx = LYChooseEnum(displayed_display_charset_idx,
+ L_Charset, -1,
+ display_charset_choices);
+ current_char_set = display_charset_map[displayed_display_charset_idx];
+#else
+ current_char_set = LYChooseEnum(current_char_set,
+ L_Charset, -1,
+ LYchar_set_names);
+#endif
+ } else {
+#ifndef ALL_CHARSETS_IN_O_MENU_SCREEN
+ displayed_display_charset_idx = LYChoosePopup(displayed_display_charset_idx,
+ L_Charset, -1,
+ display_charset_choices,
+ 0, FALSE, FALSE);
+ current_char_set = display_charset_map[displayed_display_charset_idx];
+#else
+ current_char_set = LYChoosePopup(current_char_set,
+ L_Charset, -1,
+ LYchar_set_names,
+ 0, FALSE, FALSE);
+#endif
+
+#if defined(VMS) || defined(USE_SLANG)
+ LYmove(L_Charset, COL_OPTION_VALUES);
+ LYclrtoeol();
+ LYaddstr(LYchar_set_names[current_char_set]);
+#endif /* VMS || USE_SLANG */
+ }
+ /*
+ * Set the raw 8-bit or CJK mode defaults and character set if
+ * changed. - FM
+ */
+ if (CurrentCharSet != current_char_set) {
+ LYUseDefaultRawMode = TRUE;
+ HTMLUseCharacterSet(current_char_set);
+ CurrentCharSet = current_char_set;
+ CurrentRawMode = LYRawMode;
+#if !defined(VMS) && !defined(USE_SLANG)
+ if (!LYSelectPopups)
+#endif /* !VMS && !USE_SLANG */
+ {
+ LYmove(L_Rawmode, COL_OPTION_VALUES);
+ LYclrtoeol();
+ ShowBool(LYRawMode);
+ }
+#ifdef CAN_SWITCH_DISPLAY_CHARSET
+ /* Deduce whether the user wants autoswitch: */
+ switch_display_charsets =
+ (current_char_set == auto_display_charset
+ || current_char_set == auto_other_display_charset);
+#endif
+ }
+ response = ' ';
+ if (LYSelectPopups) {
+ HANDLE_LYOPTIONS;
+ }
+ break;
+
+ case 'O': /* Change raw mode setting. */
+ LYRawMode = LYChooseBoolean(LYRawMode, L_Rawmode, -1, bool_choices);
+ /*
+ * Set the LYUseDefaultRawMode value and character handling if
+ * LYRawMode was changed. - FM
+ */
+ if (CurrentRawMode != LYRawMode) {
+ HTMLSetUseDefaultRawMode(current_char_set, LYRawMode);
+ HTMLSetCharacterHandling(current_char_set);
+ CurrentRawMode = LYRawMode;
+ }
+ response = ' ';
+ break;
+
+ case 'G': /* Change language preference. */
+ if (non_empty(language)) {
+ BStrCopy0(my_data, language);
+ } else { /* clear the NONE */
+ LYmove(L_LANGUAGE, COL_OPTION_VALUES);
+ LYaddstr(" ");
+ BStrCopy0(my_data, "");
+ }
+ _statusline(ACCEPT_DATA);
+ LYmove(L_LANGUAGE, COL_OPTION_VALUES);
+ lynx_start_bold();
+ ch = LYgetBString(&my_data, FALSE, 0, NORECALL);
+ lynx_stop_bold();
+ LYmove(L_LANGUAGE, COL_OPTION_VALUES);
+ if (term_options || ch == -1) {
+ LYaddstr(non_empty(language) ?
+ language : "NONE");
+ } else if (isBEmpty(my_data)) {
+ FREE(language);
+ LYaddstr("NONE");
+ } else {
+ StrAllocCopy(language, my_data->str);
+ LYaddstr(language);
+ }
+ LYclrtoeol();
+ if (ch == -1) {
+ HTInfoMsg(CANCELLED);
+ HTInfoMsg("");
+ } else {
+ _statusline(VALUE_ACCEPTED);
+ }
+ response = ' ';
+ break;
+
+ case 'H': /* Change charset preference. */
+ if (non_empty(pref_charset)) {
+ BStrCopy0(my_data, pref_charset);
+ } else { /* clear the NONE */
+ LYmove(L_PREF_CHARSET, COL_OPTION_VALUES);
+ LYaddstr(" ");
+ BStrCopy0(my_data, "");
+ }
+ _statusline(ACCEPT_DATA);
+ LYmove(L_PREF_CHARSET, COL_OPTION_VALUES);
+ lynx_start_bold();
+ ch = LYgetBString(&my_data, FALSE, 0, NORECALL);
+ lynx_stop_bold();
+ LYmove(L_PREF_CHARSET, COL_OPTION_VALUES);
+ if (term_options || ch == -1) {
+ LYaddstr(non_empty(pref_charset) ?
+ pref_charset : "NONE");
+ } else if (isBEmpty(my_data)) {
+ FREE(pref_charset);
+ LYaddstr("NONE");
+ } else {
+ StrAllocCopy(pref_charset, my_data->str);
+ LYaddstr(pref_charset);
+ }
+ LYclrtoeol();
+ if (ch == -1) {
+ HTInfoMsg(CANCELLED);
+ HTInfoMsg("");
+ } else {
+ _statusline(VALUE_ACCEPTED);
+ }
+ response = ' ';
+ break;
+
+ case 'V': /* Change VI keys setting. */
+ vi_keys = LYChooseBoolean(vi_keys,
+ L_Bool_A, C_VIKEYS,
+ bool_choices);
+ if (vi_keys) {
+ set_vi_keys();
+ } else {
+ reset_vi_keys();
+ }
+ response = ' ';
+ break;
+
+ case 'M': /* Change emacs keys setting. */
+ emacs_keys = LYChooseBoolean(emacs_keys,
+ L_Bool_A, C_EMACSKEYS,
+ bool_choices);
+ if (emacs_keys) {
+ set_emacs_keys();
+ } else {
+ reset_emacs_keys();
+ }
+ response = ' ';
+ break;
+
+ case 'W': /* Change show dotfiles setting. */
+ if (no_dotfiles) {
+ _statusline(DOTFILE_ACCESS_DISABLED);
+ } else {
+ show_dotfiles = LYChooseBoolean(show_dotfiles,
+ L_Bool_A,
+ C_SHOW_DOTFILES,
+ bool_choices);
+ }
+ response = ' ';
+ break;
+
+ case 'T': /* Change select popups setting. */
+ LYSelectPopups = LYChooseBoolean(LYSelectPopups,
+ L_Bool_B,
+ C_SELECT_POPUPS,
+ bool_choices);
+ response = ' ';
+ break;
+
+#if defined(USE_SLANG) || defined(COLOR_CURSES)
+ case '&': /* Change show color setting. */
+ if (no_option_save) {
+#if defined(COLOR_CURSES)
+ if (!has_colors()) {
+ char *terminal = LYGetEnv("TERM");
+
+ if (terminal)
+ HTUserMsg2(COLOR_TOGGLE_DISABLED_FOR_TERM,
+ terminal);
+ else
+ HTUserMsg(COLOR_TOGGLE_DISABLED);
+ break;
+ }
+#endif
+ LYShowColor = LYChooseEnum((LYShowColor - 1),
+ L_Color,
+ C_COLOR,
+ bool_choices);
+ if (LYShowColor == 0) {
+ LYShowColor = SHOW_COLOR_OFF;
+ } else {
+ LYShowColor = SHOW_COLOR_ON;
+ }
+ } else { /* !no_option_save */
+ BOOLEAN again = FALSE;
+ int chosen;
+
+ /*
+ * Copy strings into choice array.
+ */
+ choices[0] = NULL;
+ StrAllocCopy(choices[0], "NEVER ");
+ choices[1] = NULL;
+ StrAllocCopy(choices[1], "OFF ");
+ choices[2] = NULL;
+ StrAllocCopy(choices[2], "ON ");
+ choices[3] = NULL;
+#if defined(COLOR_CURSES)
+ if (!has_colors())
+ StrAllocCopy(choices[3], "Always try");
+ else
+#endif
+ StrAllocCopy(choices[3], "ALWAYS ");
+ choices[4] = NULL;
+ do {
+ if (!LYSelectPopups) {
+ chosen = LYChooseEnum(LYChosenShowColor,
+ L_Color,
+ C_COLOR,
+ choices);
+ } else {
+ chosen = LYChoosePopup(LYChosenShowColor,
+ L_Color,
+ C_COLOR,
+ choices, 4, FALSE, FALSE);
+ }
+#if defined(COLOR_CURSES)
+ again = (BOOLEAN) (chosen == SHOW_COLOR_ON && !has_colors());
+ if (again) {
+ char *terminal = LYGetEnv("TERM");
+
+ if (terminal)
+ HTUserMsg2(COLOR_TOGGLE_DISABLED_FOR_TERM,
+ terminal);
+ else
+ HTUserMsg(COLOR_TOGGLE_DISABLED);
+ }
+#endif
+ } while (again);
+ LYChosenShowColor = chosen;
+#if defined(VMS)
+ if (LYSelectPopups) {
+ LYmove(L_Color, C_COLOR);
+ LYclrtoeol();
+ LYaddstr(choices[LYChosenShowColor]);
+ }
+#endif /* VMS */
+#if defined(COLOR_CURSES)
+ if (has_colors())
+#endif
+ LYShowColor = chosen;
+ FREE(choices[0]);
+ FREE(choices[1]);
+ FREE(choices[2]);
+ FREE(choices[3]);
+ }
+ if (CurrentShowColor != LYShowColor) {
+ lynx_force_repaint();
+ }
+ CurrentShowColor = LYShowColor;
+#ifdef USE_SLANG
+ SLtt_Use_Ansi_Colors = (LYShowColor > SHOW_COLOR_OFF ? TRUE : FALSE);
+#endif
+ response = ' ';
+ if (LYSelectPopups && !no_option_save) {
+ HANDLE_LYOPTIONS;
+ }
+ break;
+#endif /* USE_SLANG or COLOR_CURSES */
+
+ case '@': /* Change show cursor setting. */
+ LYShowCursor = LYChooseBoolean(LYShowCursor,
+ L_Bool_B,
+ C_SHOW_CURSOR,
+ bool_choices);
+ response = ' ';
+ break;
+
+ case 'K': /* Change keypad mode. */
+ if (!LYSelectPopups) {
+ keypad_mode = LYChooseEnum(keypad_mode,
+ L_Keypad, -1,
+ keypad_choices);
+ } else {
+ keypad_mode = LYChoosePopup(keypad_mode,
+ L_Keypad, -1,
+ keypad_choices,
+ 3, FALSE, FALSE);
+#if defined(VMS) || defined(USE_SLANG)
+ LYmove(L_Keypad, COL_OPTION_VALUES);
+ LYclrtoeol();
+ LYaddstr(keypad_choices[keypad_mode]);
+#endif /* VMS || USE_SLANG */
+ }
+ if (keypad_mode == NUMBERS_AS_ARROWS) {
+ set_numbers_as_arrows();
+ } else {
+ reset_numbers_as_arrows();
+ }
+ response = ' ';
+ if (LYSelectPopups) {
+ HANDLE_LYOPTIONS;
+ }
+ break;
+
+ case 'N': /* Change line editor key bindings. */
+ if (!LYSelectPopups) {
+ current_lineedit = LYChooseEnum(current_lineedit,
+ L_Lineed, -1,
+ LYEditorNames);
+ } else {
+ current_lineedit = LYChoosePopup(current_lineedit,
+ L_Lineed, -1,
+ LYEditorNames,
+ 0, FALSE, FALSE);
+#if defined(VMS) || defined(USE_SLANG)
+ LYmove(L_Lineed, COL_OPTION_VALUES);
+ LYclrtoeol();
+ LYaddstr(LYEditorNames[current_lineedit]);
+#endif /* VMS || USE_SLANG */
+ }
+ response = ' ';
+ if (LYSelectPopups) {
+ HANDLE_LYOPTIONS;
+ }
+ break;
+
+#ifdef EXP_KEYBOARD_LAYOUT
+ case 'Y': /* Change keyboard layout */
+ if (!LYSelectPopups) {
+ current_layout = LYChooseEnum(current_layout,
+ L_Layout, -1,
+ LYKbLayoutNames);
+ } else {
+ current_layout = LYChoosePopup(current_layout,
+ L_Layout, -1,
+ LYKbLayoutNames,
+ 0, FALSE, FALSE);
+#if defined(VMS) || defined(USE_SLANG)
+ LYmove(L_Layout, COL_OPTION_VALUES);
+ LYclrtoeol();
+ LYaddstr(LYKbLayoutNames[current_layout]);
+#endif /* VMS || USE_SLANG */
+ }
+ response = ' ';
+ if (LYSelectPopups) {
+ HANDLE_LYOPTIONS;
+ }
+ break;
+#endif /* EXP_KEYBOARD_LAYOUT */
+
+#ifdef DIRED_SUPPORT
+ case 'I': /* Change local directory sorting. */
+ if (!LYSelectPopups) {
+ dir_list_style = LYChooseEnum(dir_list_style,
+ L_Dired, -1,
+ dirList_choices);
+ } else {
+ dir_list_style = LYChoosePopup(dir_list_style,
+ L_Dired, -1,
+ dirList_choices,
+ 3, FALSE, FALSE);
+#if defined(VMS) || defined(USE_SLANG)
+ LYmove(L_Dired, COL_OPTION_VALUES);
+ LYclrtoeol();
+ LYaddstr(dirList_choices[dir_list_style]);
+#endif /* VMS || USE_SLANG */
+ }
+ response = ' ';
+ if (LYSelectPopups) {
+ HANDLE_LYOPTIONS;
+ }
+ break;
+#endif /* DIRED_SUPPORT */
+
+ case 'U': /* Change user mode. */
+ if (!LYSelectPopups) {
+ user_mode = LYChooseEnum(user_mode,
+ L_User_Mode, -1,
+ userMode_choices);
+ use_assume_charset = (BOOLEAN) (user_mode == ADVANCED_MODE);
+ } else {
+ user_mode = LYChoosePopup(user_mode,
+ L_User_Mode, -1,
+ userMode_choices,
+ 3, FALSE, FALSE);
+ use_assume_charset = (BOOLEAN) (user_mode == ADVANCED_MODE);
+#if defined(VMS) || defined(USE_SLANG)
+ if (use_assume_charset == old_use_assume_charset) {
+ LYmove(L_User_Mode, COL_OPTION_VALUES);
+ LYclrtoeol();
+ LYaddstr(userMode_choices[user_mode]);
+ }
+#endif /* VMS || USE_SLANG */
+ }
+ LYSetDisplayLines();
+ response = ' ';
+ if (LYSelectPopups) {
+ HANDLE_LYOPTIONS;
+ }
+ break;
+
+ case '!':
+ if (!LYSelectPopups) {
+ verbose_img = LYChooseBoolean(verbose_img,
+ L_VERBOSE_IMAGES,
+ C_VERBOSE_IMAGES,
+ bool_choices);
+ } else {
+ verbose_img = (BOOLEAN) LYChoosePopup(verbose_img,
+ L_VERBOSE_IMAGES,
+ C_VERBOSE_IMAGES,
+ bool_choices,
+ 2, FALSE, FALSE);
+ }
+ response = ' ';
+ if (LYSelectPopups) {
+ HANDLE_LYOPTIONS;
+ }
+ break;
+
+ case 'A': /* Change user agent string. */
+ if (!no_useragent) {
+ if (non_empty(LYUserAgent)) {
+ BStrCopy0(my_data, LYUserAgent);
+ } else { /* clear the NONE */
+ LYmove(L_HOME, COL_OPTION_VALUES);
+ LYaddstr(" ");
+ BStrCopy0(my_data, "");
+ }
+ _statusline(ACCEPT_DATA_OR_DEFAULT);
+ LYmove(L_User_Agent, COL_OPTION_VALUES);
+ lynx_start_bold();
+ ch = LYgetBString(&my_data, FALSE, 0, NORECALL);
+ lynx_stop_bold();
+ LYmove(L_User_Agent, COL_OPTION_VALUES);
+ if (term_options || ch == -1) {
+ LYaddstr((LYUserAgent &&
+ *LYUserAgent) ?
+ LYUserAgent : "NONE");
+ } else if (isBEmpty(my_data)) {
+ StrAllocCopy(LYUserAgent, LYUserAgentDefault);
+ LYaddstr((LYUserAgent &&
+ *LYUserAgent) ?
+ LYUserAgent : "NONE");
+ } else {
+ StrAllocCopy(LYUserAgent, my_data->str);
+ LYaddstr(LYUserAgent);
+ }
+ LYclrtoeol();
+ if (ch == -1) {
+ HTInfoMsg(CANCELLED);
+ HTInfoMsg("");
+ } else if (!LYCheckUserAgent()) {
+ _statusline(UA_PLEASE_USE_LYNX);
+ } else {
+ _statusline(VALUE_ACCEPTED);
+ }
+ } else { /* disallowed */
+ _statusline(UA_CHANGE_DISABLED);
+ }
+ response = ' ';
+ break;
+
+#if defined(ENABLE_OPTS_CHANGE_EXEC) && (defined(EXEC_LINKS) || defined(EXEC_SCRIPTS))
+ case 'X': /* Change local exec restriction. */
+ if (exec_frozen && !LYSelectPopups) {
+ _statusline(CHANGE_OF_SETTING_DISALLOWED);
+ response = ' ';
+ break;
+ }
+#ifndef NEVER_ALLOW_REMOTE_EXEC
+ if (local_exec) {
+ itmp = 2;
+ } else
+#endif /* !NEVER_ALLOW_REMOTE_EXEC */
+ {
+ if (local_exec_on_local_files) {
+ itmp = 1;
+ } else {
+ itmp = 0;
+ }
+ }
+ if (!LYSelectPopups) {
+ itmp = LYChooseEnum(itmp,
+ L_Exec, -1,
+ exec_choices);
+ } else {
+ itmp = LYChoosePopup(itmp,
+ L_Exec, -1,
+ exec_choices,
+ 0, (exec_frozen ? TRUE : FALSE),
+ FALSE);
+#if defined(VMS) || defined(USE_SLANG)
+ LYmove(L_Exec, COL_OPTION_VALUES);
+ LYclrtoeol();
+ LYaddstr(exec_choices[itmp]);
+#endif /* VMS || USE_SLANG */
+ }
+ if (!exec_frozen) {
+ switch (itmp) {
+ case 0:
+ local_exec = FALSE;
+ local_exec_on_local_files = FALSE;
+ break;
+ case 1:
+ local_exec = FALSE;
+ local_exec_on_local_files = TRUE;
+ break;
+#ifndef NEVER_ALLOW_REMOTE_EXEC
+ case 2:
+ local_exec = TRUE;
+ local_exec_on_local_files = FALSE;
+ break;
+#endif /* !NEVER_ALLOW_REMOTE_EXEC */
+ } /* end switch */
+ }
+ response = ' ';
+ if (LYSelectPopups) {
+ HANDLE_LYOPTIONS;
+ }
+ break;
+#endif /* ENABLE_OPTS_CHANGE_EXEC */
+
+ case '>': /* Save current options to RC file. */
+ if (!no_option_save) {
+ HTInfoMsg(SAVING_OPTIONS);
+ LYrcShowColor = LYChosenShowColor;
+ if (save_rc(NULL)) {
+ HTInfoMsg(OPTIONS_SAVED);
+ } else {
+ HTAlert(OPTIONS_NOT_SAVED);
+ }
+ } else {
+ HTInfoMsg(R_TO_RETURN_TO_LYNX);
+ /*
+ * Change response so that we don't exit the options menu.
+ */
+ response = ' ';
+ }
+ break;
+
+ case 'R': /* Return to document (quit options menu). */
+ break;
+
+ default:
+ if (!no_option_save) {
+ HTInfoMsg(SAVE_OR_R_TO_RETURN_TO_LYNX);
+ } else {
+ HTInfoMsg(R_TO_RETURN_TO_LYNX);
+ }
+ } /* end switch */
+ } /* end while */
+
+ term_options = FALSE;
+ LYStatusLine = -1; /* let user_mode have some of the screen */
+ signal(SIGINT, cleanup_sig);
+ BStrFree(my_data);
+ return;
+}
+
+static int widest_choice(STRING2PTR choices)
+{
+ int n, width = 0;
+
+ for (n = 0; choices[n] != NULL; ++n) {
+ int len = (int) strlen(choices[n]);
+
+ if (width < len)
+ width = len;
+ }
+ return width;
+}
+
+static void show_choice(const char *choice,
+ int width)
+{
+ int len = 0;
+
+ if (choice != 0) {
+ len = (int) strlen(choice);
+
+ LYaddstr(choice);
+ }
+ while (len++ < width)
+ LYaddch(' ');
+}
+
+/*
+ * Take a status code, prompt the user for a new status, and return it.
+ */
+static int boolean_choice(int cur_choice,
+ int line,
+ int column,
+ STRING2PTR choices)
+{
+ int response = 0;
+ int cmd = 0;
+ int number = 0;
+ int col = (column >= 0 ? column : COL_OPTION_VALUES);
+ int orig_choice = cur_choice;
+ int width = widest_choice(choices);
+
+ /*
+ * Get the number of choices and then make number zero-based.
+ */
+ for (number = 0; choices[number] != NULL; number++) ; /* empty loop body */
+ number--;
+
+ /*
+ * Update the statusline.
+ */
+ _statusline(ANY_KEY_CHANGE_RET_ACCEPT);
+
+ /*
+ * Highlight the current choice.
+ */
+ LYmove(line, col);
+ lynx_start_reverse();
+ show_choice(choices[cur_choice], width);
+ if (LYShowCursor)
+ LYmove(line, (col - 1));
+ LYrefresh();
+
+ /*
+ * Get the keyboard entry, and leave the cursor at the choice, to indicate
+ * that it can be changed, until the user accepts the current choice.
+ */
+ term_options = FALSE;
+ while (1) {
+ LYmove(line, col);
+ if (term_options == FALSE) {
+ response = LYgetch_single();
+ }
+ if (term_options || LYCharIsINTERRUPT_NO_letter(response)) {
+ /*
+ * Control-C or Control-G.
+ */
+ response = '\n';
+ term_options = TRUE;
+ cur_choice = orig_choice;
+ }
+#ifdef VMS
+ if (HadVMSInterrupt) {
+ HadVMSInterrupt = FALSE;
+ response = '\n';
+ term_options = TRUE;
+ cur_choice = orig_choice;
+ }
+#endif /* VMS */
+ if ((response != '\n' && response != '\r') &&
+ (cmd = LKC_TO_LAC(keymap, response)) != LYK_ACTIVATE) {
+ switch (cmd) {
+ case LYK_HOME:
+ cur_choice = 0;
+ break;
+
+ case LYK_END:
+ cur_choice = number;
+ break;
+
+ case LYK_REFRESH:
+ lynx_force_repaint();
+ LYrefresh();
+ break;
+
+ case LYK_QUIT:
+ case LYK_ABORT:
+ case LYK_PREV_DOC:
+ cur_choice = orig_choice;
+ term_options = TRUE;
+ break;
+
+ case LYK_PREV_PAGE:
+ case LYK_UP_HALF:
+ case LYK_UP_TWO:
+ case LYK_PREV_LINK:
+ case LYK_LPOS_PREV_LINK:
+ case LYK_FASTBACKW_LINK:
+ case LYK_UP_LINK:
+ case LYK_LEFT_LINK:
+ if (cur_choice == 0)
+ cur_choice = number; /* go back to end */
+ else
+ cur_choice--;
+ break;
+
+ case LYK_1:
+ case LYK_2:
+ case LYK_3:
+ case LYK_4:
+ case LYK_5:
+ case LYK_6:
+ case LYK_7:
+ case LYK_8:
+ case LYK_9:
+ if ((cmd - LYK_1 + 1) <= number) {
+ cur_choice = cmd - LYK_1 + 1;
+ break;
+ } /* else fall through! */
+ default:
+ if (cur_choice == number)
+ cur_choice = 0; /* go over the top and around */
+ else
+ cur_choice++;
+ } /* end of switch */
+ show_choice(choices[cur_choice], width);
+ if (LYShowCursor)
+ LYmove(line, (col - 1));
+ LYrefresh();
+ } else {
+ /*
+ * Unhighlight choice.
+ */
+ LYmove(line, col);
+ lynx_stop_reverse();
+ show_choice(choices[cur_choice], width);
+
+ if (term_options) {
+ term_options = FALSE;
+ HTInfoMsg(CANCELLED);
+ HTInfoMsg("");
+ } else {
+ _statusline(VALUE_ACCEPTED);
+ }
+ return cur_choice;
+ }
+ }
+}
+#endif /* !NO_OPTION_MENU */
+
+static void terminate_options(int sig GCC_UNUSED)
+{
+ term_options = TRUE;
+ /*
+ * Reassert the AST.
+ */
+ signal(SIGINT, terminate_options);
+#ifdef VMS
+ /*
+ * Refresh the screen to get rid of the "interrupt" message.
+ */
+ if (!dump_output_immediately) {
+ lynx_force_repaint();
+ LYrefresh();
+ }
+#endif /* VMS */
+}
+
+/*
+ * Multi-Bookmark On-Line editing support. - FMG & FM
+ */
+void edit_bookmarks(void)
+{
+ int response = 0, def_response = 0;
+ int MBM_current = 1;
+
+#define MULTI_OFFSET 8
+ int a; /* misc counter */
+ bstring *my_data = NULL;
+
+ /*
+ * We need (MBM_V_MAXFILES + MULTI_OFFSET) lines to display the whole list
+ * at once. Otherwise break it up into two segments. We know it won't be
+ * less than that because 'o'ptions needs 23-24 at LEAST.
+ */
+ term_options = FALSE;
+ signal(SIGINT, terminate_options);
+
+ draw_bookmark_list:
+ /*
+ * Display menu of bookmarks. NOTE that we avoid printw()'s to increase
+ * the chances that any non-ASCII or multibyte/CJK characters will be
+ * handled properly. - FM
+ */
+#if defined(FANCY_CURSES) || defined (USE_SLANG)
+ if (enable_scrollback) {
+ LYclear();
+ } else {
+ LYerase();
+ }
+#else
+ LYclear();
+#endif /* FANCY_CURSES || USE_SLANG */
+ LYmove(0, 5);
+ lynx_start_h1_color();
+ if (LYlines < (MBM_V_MAXFILES + MULTI_OFFSET)) {
+ char *ehead_buffer = 0;
+
+ HTSprintf0(&ehead_buffer, MULTIBOOKMARKS_EHEAD_MASK, MBM_current);
+ LYaddstr(ehead_buffer);
+ FREE(ehead_buffer);
+ } else {
+ LYaddstr(MULTIBOOKMARKS_EHEAD);
+ }
+ lynx_stop_h1_color();
+
+ if (LYlines < (MBM_V_MAXFILES + MULTI_OFFSET)) {
+ for (a = ((MBM_V_MAXFILES / 2 + 1) * (MBM_current - 1));
+ a <= (MBM_current * MBM_V_MAXFILES / 2); a++) {
+ LYmove((3 + a) - ((MBM_V_MAXFILES / 2 + 1) * (MBM_current - 1)), 5);
+ LYaddch(UCH(LYindex2MBM(a)));
+ LYaddstr(" : ");
+ if (MBM_A_subdescript[a])
+ LYaddstr(MBM_A_subdescript[a]);
+ LYmove((3 + a) - ((MBM_V_MAXFILES / 2 + 1) * (MBM_current - 1)), 35);
+ LYaddstr("| ");
+ if (MBM_A_subbookmark[a]) {
+ LYaddstr(MBM_A_subbookmark[a]);
+ }
+ }
+ } else {
+ for (a = 0; a <= MBM_V_MAXFILES; a++) {
+ LYmove(3 + a, 5);
+ LYaddch(UCH(LYindex2MBM(a)));
+ LYaddstr(" : ");
+ if (MBM_A_subdescript[a])
+ LYaddstr(MBM_A_subdescript[a]);
+ LYmove(3 + a, 35);
+ LYaddstr("| ");
+ if (MBM_A_subbookmark[a]) {
+ LYaddstr(MBM_A_subbookmark[a]);
+ }
+ }
+ }
+
+ /*
+ * Only needed when we have 2 screens.
+ */
+ if (LYlines < MBM_V_MAXFILES + MULTI_OFFSET) {
+ LYmove((LYlines - 4), 0);
+ LYaddstr("'");
+ lynx_start_bold();
+ LYaddstr("[");
+ lynx_stop_bold();
+ LYaddstr("' ");
+ LYaddstr(PREVIOUS);
+ LYaddstr(", '");
+ lynx_start_bold();
+ LYaddstr("]");
+ lynx_stop_bold();
+ LYaddstr("' ");
+ LYaddstr(NEXT_SCREEN);
+ }
+
+ LYmove((LYlines - 3), 0);
+ if (!no_option_save) {
+ LYaddstr("'");
+ lynx_start_bold();
+ LYaddstr(">");
+ lynx_stop_bold();
+ LYaddstr("'");
+ LYaddstr(TO_SAVE_SEGMENT);
+ }
+ LYaddstr(OR_SEGMENT);
+ LYaddstr("'");
+ lynx_start_bold();
+ LYaddstr("^G");
+ lynx_stop_bold();
+ LYaddstr("'");
+ LYaddstr(TO_RETURN_SEGMENT);
+
+ while (!term_options &&
+ !LYisNonAlnumKeyname(response, LYK_PREV_DOC) &&
+ !LYCharIsINTERRUPT_NO_letter(response) && response != '>') {
+
+ LYmove((LYlines - 2), 0);
+ lynx_start_prompt_color();
+ LYaddstr(MULTIBOOKMARKS_LETTER);
+ lynx_stop_prompt_color();
+
+ LYrefresh();
+ response = (def_response ? def_response : LYgetch_single());
+ def_response = 0;
+
+ /*
+ * Check for a cancel.
+ */
+ if (term_options || LYCharIsINTERRUPT_NO_letter(response) ||
+ LYisNonAlnumKeyname(response, LYK_PREV_DOC))
+ continue;
+
+ /*
+ * Check for a save.
+ */
+ if (response == '>') {
+ if (!no_option_save) {
+ HTInfoMsg(SAVING_OPTIONS);
+ if (save_rc(NULL))
+ HTInfoMsg(OPTIONS_SAVED);
+ else
+ HTAlert(OPTIONS_NOT_SAVED);
+ } else {
+ HTInfoMsg(R_TO_RETURN_TO_LYNX);
+ /*
+ * Change response so that we don't exit the options menu.
+ */
+ response = ' ';
+ }
+ continue;
+ }
+
+ /*
+ * Check for a refresh.
+ */
+ if (LYisNonAlnumKeyname(response, LYK_REFRESH)) {
+ lynx_force_repaint();
+ continue;
+ }
+
+ /*
+ * Move between the screens - if we can't show it all at once.
+ */
+ if ((response == ']' ||
+ LYisNonAlnumKeyname(response, LYK_NEXT_PAGE)) &&
+ LYlines < (MBM_V_MAXFILES + MULTI_OFFSET)) {
+ MBM_current++;
+ if (MBM_current >= 3)
+ MBM_current = 1;
+ goto draw_bookmark_list;
+ }
+ if ((response == '[' ||
+ LYisNonAlnumKeyname(response, LYK_PREV_PAGE)) &&
+ LYlines < (MBM_V_MAXFILES + MULTI_OFFSET)) {
+ MBM_current--;
+ if (MBM_current <= 0)
+ MBM_current = 2;
+ goto draw_bookmark_list;
+ }
+
+ /*
+ * Instead of using 26 case statements, we set up a scan through the
+ * letters and edit the lines that way.
+ */
+ for (a = 0; a <= MBM_V_MAXFILES; a++) {
+ if (LYMBM2index(response) == a) {
+ if (LYlines < (MBM_V_MAXFILES + MULTI_OFFSET)) {
+ if (MBM_current == 1 && a > (MBM_V_MAXFILES / 2)) {
+ MBM_current = 2;
+ def_response = response;
+ goto draw_bookmark_list;
+ }
+ if (MBM_current == 2 && a < (MBM_V_MAXFILES / 2)) {
+ MBM_current = 1;
+ def_response = response;
+ goto draw_bookmark_list;
+ }
+ }
+ _statusline(ACCEPT_DATA);
+
+ if (a > 0) {
+ lynx_start_bold();
+ if (LYlines < (MBM_V_MAXFILES + MULTI_OFFSET))
+ LYmove((3 + a)
+ - ((MBM_V_MAXFILES / 2 + 1) * (MBM_current - 1)),
+ 9);
+ else
+ LYmove((3 + a), 9);
+ BStrCopy0(my_data,
+ (!MBM_A_subdescript[a] ?
+ "" : MBM_A_subdescript[a]));
+ (void) LYgetBString(&my_data, FALSE, 0, NORECALL);
+ lynx_stop_bold();
+
+ if (isBEmpty(my_data)) {
+ FREE(MBM_A_subdescript[a]);
+ } else {
+ StrAllocCopy(MBM_A_subdescript[a], my_data->str);
+ }
+ if (LYlines < (MBM_V_MAXFILES + MULTI_OFFSET))
+ LYmove((3 + a)
+ - ((MBM_V_MAXFILES / 2 + 1)
+ * (MBM_current - 1)),
+ 5);
+ else
+ LYmove((3 + a), 5);
+ LYaddch(UCH(LYindex2MBM(a)));
+ LYaddstr(" : ");
+ if (MBM_A_subdescript[a])
+ LYaddstr(MBM_A_subdescript[a]);
+ LYclrtoeol();
+ LYrefresh();
+ }
+
+ if (LYlines < (MBM_V_MAXFILES + MULTI_OFFSET))
+ LYmove((3 + a)
+ - ((MBM_V_MAXFILES / 2 + 1)
+ * (MBM_current - 1)),
+ 35);
+ else
+ LYmove((3 + a), 35);
+ LYaddstr("| ");
+
+ lynx_start_bold();
+ BStrCopy0(my_data, NonNull(MBM_A_subbookmark[a]));
+ (void) LYgetBString(&my_data, FALSE, 0, NORECALL);
+ lynx_stop_bold();
+
+ if (isBEmpty(my_data)) {
+ if (a == 0)
+ StrAllocCopy(MBM_A_subbookmark[a], bookmark_page);
+ else
+ FREE(MBM_A_subbookmark[a]);
+ } else {
+ BStrAlloc(my_data, my_data->len + LY_MAXPATH);
+ if (!LYPathOffHomeOK(my_data->str, (size_t) my_data->len)) {
+ LYMBM_statusline(USE_PATH_OFF_HOME);
+ LYSleepAlert();
+ } else {
+ StrAllocCopy(MBM_A_subbookmark[a], my_data->str);
+ if (a == 0) {
+ StrAllocCopy(bookmark_page, MBM_A_subbookmark[a]);
+ }
+ }
+ }
+ if (LYlines < (MBM_V_MAXFILES + MULTI_OFFSET))
+ LYmove((3 + a)
+ - ((MBM_V_MAXFILES / 2 + 1)
+ * (MBM_current - 1)),
+ 35);
+ else
+ LYmove((3 + a), 35);
+ LYaddstr("| ");
+ if (MBM_A_subbookmark[a])
+ LYaddstr(MBM_A_subbookmark[a]);
+ LYclrtoeol();
+ LYParkCursor();
+ break;
+ }
+ } /* end for */
+ } /* end while */
+
+ BStrFree(my_data);
+ term_options = FALSE;
+ signal(SIGINT, cleanup_sig);
+}
+
+#if defined(USE_CURSES_PADS) || !defined(NO_OPTION_MENU) || (defined(USE_MOUSE) && (defined(NCURSES) || defined(PDCURSES)))
+
+/*
+ * This function offers the choices for values of an option via a popup window
+ * which functions like that for selection of options in a form. - FM
+ *
+ * Also used for mouse popups with ncurses; this is indicated by for_mouse.
+ */
+int popup_choice(int cur_choice,
+ int line,
+ int column,
+ STRING2PTR choices,
+ int i_length,
+ int disabled,
+ int for_mouse)
+{
+ if (column < 0)
+ column = (COL_OPTION_VALUES - 1);
+
+ term_options = FALSE;
+ cur_choice = LYhandlePopupList(cur_choice,
+ line,
+ column,
+ (STRING2PTR) choices,
+ -1,
+ i_length,
+ disabled,
+ for_mouse);
+ switch (cur_choice) {
+ case LYK_QUIT:
+ case LYK_ABORT:
+ case LYK_PREV_DOC:
+ term_options = TRUE;
+ if (!for_mouse) {
+ HTUserMsg(CANCELLED);
+ }
+ break;
+ }
+
+ if (disabled || term_options) {
+ _statusline("");
+ } else if (!for_mouse) {
+ _statusline(VALUE_ACCEPTED);
+ }
+ return (cur_choice);
+}
+
+#endif /* !NO_OPTION_MENU */
+#ifndef NO_OPTION_FORMS
+
+/*
+ * I'm paranoid about mistyping strings. Also, this way they get combined
+ * so we don't have to worry about the intelligence of the compiler.
+ * We don't need to burn memory like it's cheap. We're better than that.
+ */
+#define SELECTED(flag) (flag) ? selected_string : ""
+#define DISABLED(flag) (flag) ? disabled_string : ""
+
+typedef struct {
+ int value;
+ const char *LongName;
+ const char *HtmlName;
+} OptValues;
+
+#define END_OPTIONS {0, 0, 0}
+
+#define HasOptValues(table) (((table) != NULL) && ((table)->LongName != NULL))
+
+typedef struct {
+ char *tag;
+ char *value;
+} PostPair;
+
+static const char selected_string[] = "selected";
+static const char disabled_string[] = "disabled";
+static const char on_string[] = N_("ON");
+static const char off_string[] = N_("OFF");
+static const char never_string[] = N_("NEVER");
+static const char always_string[] = N_("ALWAYS");
+static OptValues bool_values[] =
+{
+ {FALSE, N_("OFF"), "OFF"},
+ {TRUE, N_("ON"), "ON"},
+ END_OPTIONS
+};
+
+static const char *secure_string = "secure";
+static char *secure_value = NULL;
+static const char *save_options_string = "save_options";
+
+/*
+ * Personal Preferences
+ */
+static const char *cookies_string = RC_SET_COOKIES;
+static const char *cookies_ignore_all_string = N_("ignore");
+static const char *cookies_up_to_user_string = N_("ask user");
+static const char *cookies_accept_all_string = N_("accept all");
+static const char *x_display_string = RC_DISPLAY;
+static const char *editor_string = RC_FILE_EDITOR;
+static const char *emacs_keys_string = RC_EMACS_KEYS;
+
+#if defined(ENABLE_OPTS_CHANGE_EXEC) && (defined(EXEC_LINKS) || defined(EXEC_SCRIPTS))
+#define EXEC_ALWAYS 2
+#define EXEC_LOCAL 1
+#define EXEC_NEVER 0
+static const char *exec_links_string = RC_RUN_ALL_EXECUTION_LINKS;
+static OptValues exec_links_values[] =
+{
+ {EXEC_NEVER, N_("ALWAYS OFF"), "ALWAYS OFF"},
+ {EXEC_LOCAL, N_("FOR LOCAL FILES ONLY"), "FOR LOCAL FILES ONLY"},
+#ifndef NEVER_ALLOW_REMOTE_EXEC
+ {EXEC_ALWAYS, N_("ALWAYS ON"), "ALWAYS ON"},
+#endif
+ END_OPTIONS
+};
+#endif /* ENABLE_OPTS_CHANGE_EXEC */
+
+#ifdef EXP_KEYBOARD_LAYOUT
+static const char *kblayout_string = RC_KBLAYOUT;
+#endif
+static const char *keypad_mode_string = RC_KEYPAD_MODE;
+static OptValues keypad_mode_values[] =
+{
+ {NUMBERS_AS_ARROWS, N_("Numbers act as arrows"),
+ "number_arrows"},
+ {LINKS_ARE_NUMBERED, N_("Links are numbered"),
+ "links_numbered"},
+ {LINKS_AND_FIELDS_ARE_NUMBERED,
+ N_("Links and form fields are numbered"),
+ "links_and_forms"},
+ {FIELDS_ARE_NUMBERED,
+ N_("Form fields are numbered"),
+ "forms_numbered"},
+ END_OPTIONS
+};
+static const char *lineedit_mode_string = RC_LINEEDIT_MODE;
+static const char *mail_address_string = RC_PERSONAL_MAIL_ADDRESS;
+static const char *personal_name_string = RC_PERSONAL_MAIL_NAME;
+static const char *search_type_string = RC_CASE_SENSITIVE_SEARCHING;
+
+#ifndef DISABLE_FTP
+static const char *anonftp_password_string = RC_ANONFTP_PASSWORD;
+#endif
+
+static OptValues search_type_values[] =
+{
+ {FALSE, N_("Case insensitive"), "case_insensitive"},
+ {TRUE, N_("Case sensitive"), "case_sensitive"},
+ END_OPTIONS
+};
+
+#if defined(USE_SLANG) || defined(COLOR_CURSES)
+static const char *show_color_string = RC_SHOW_COLOR;
+static OptValues show_color_values[] =
+{
+ {SHOW_COLOR_NEVER, never_string, never_string},
+ {SHOW_COLOR_OFF, off_string, off_string},
+ {SHOW_COLOR_ON, on_string, on_string},
+ {SHOW_COLOR_ALWAYS, always_string, always_string},
+ END_OPTIONS
+};
+#endif
+
+#ifdef USE_COLOR_STYLE
+static const char *color_style_string = RC_COLOR_STYLE;
+static OptValues *color_style_values;
+static HTList *color_style_list;
+#endif
+
+#ifdef USE_DEFAULT_COLORS
+static const char *default_colors_string = RC_DEFAULT_COLORS;
+#endif
+
+static const char *show_cursor_string = RC_SHOW_CURSOR;
+
+static const char *underline_links_string = RC_UNDERLINE_LINKS;
+
+#ifdef USE_SCROLLBAR
+static const char *show_scrollbar_string = RC_SCROLLBAR;
+#endif
+
+static const char prompt_dft_string[] = N_("prompt normally");
+static const char prompt_yes_string[] = N_("force yes-response");
+static const char prompt_no_string[] = N_("force no-response");
+static OptValues prompt_values[] =
+{
+ {FORCE_PROMPT_DFT, prompt_dft_string, prompt_dft_string},
+ {FORCE_PROMPT_YES, prompt_yes_string, prompt_yes_string},
+ {FORCE_PROMPT_NO, prompt_no_string, prompt_no_string},
+ END_OPTIONS
+};
+static const char *cookie_prompt_string = RC_FORCE_COOKIE_PROMPT;
+
+static const char RFC_2109_string[] = N_("RFC 2109");
+static const char RFC_2965_string[] = N_("RFC 2965");
+static const char RFC_6265_string[] = N_("RFC 6265");
+static OptValues cookies_values[] =
+{
+ {COOKIES_RFC_2109, RFC_2109_string, RFC_2109_string},
+ {COOKIES_RFC_2965, RFC_2965_string, RFC_2965_string},
+ {COOKIES_RFC_6265, RFC_6265_string, RFC_6265_string},
+ END_OPTIONS
+};
+static const char *cookie_version_string = RC_COOKIE_VERSION;
+
+#ifdef USE_SSL
+static const char *ssl_prompt_string = RC_FORCE_SSL_PROMPT;
+#endif
+
+static const char *user_mode_string = RC_USER_MODE;
+static OptValues user_mode_values[] =
+{
+ {NOVICE_MODE, N_("Novice"), "Novice"},
+ {INTERMEDIATE_MODE, N_("Intermediate"), "Intermediate"},
+ {ADVANCED_MODE, N_("Advanced"), "Advanced"},
+ {MINIMAL_MODE, N_("Minimal"), "Minimal"},
+ END_OPTIONS
+};
+
+static const char *vi_keys_string = RC_VI_KEYS;
+
+static const char *visited_links_string = RC_VISITED_LINKS;
+static OptValues visited_links_values[] =
+{
+ {VISITED_LINKS_AS_FIRST_V, N_("By First Visit"), "first_visited"},
+ {VISITED_LINKS_AS_FIRST_V | VISITED_LINKS_REVERSE,
+ N_("By First Visit Reversed"), "first_visited_reversed"},
+ {VISITED_LINKS_AS_TREE, N_("As Visit Tree"), "visit_tree"},
+ {VISITED_LINKS_AS_LATEST, N_("By Last Visit"), "last_visited"},
+ {VISITED_LINKS_AS_LATEST | VISITED_LINKS_REVERSE,
+ N_("By Last Visit Reversed"), "last_visited_reversed"},
+ END_OPTIONS
+};
+
+/*
+ * Document Layout
+ */
+static const char *DTD_recovery_string = RC_TAGSOUP;
+static OptValues DTD_type_values[] =
+{
+ /* Old_DTD variable */
+ {TRUE, N_("relaxed (TagSoup mode)"), "tagsoup"},
+ {FALSE, N_("strict (SortaSGML mode)"), "sortasgml"},
+ END_OPTIONS
+};
+
+static const char *bad_html_string = RC_BAD_HTML;
+static OptValues bad_html_values[] =
+{
+ {BAD_HTML_IGNORE, N_("Ignore"), "ignore"},
+ {BAD_HTML_TRACE, N_("Add to trace-file"), "trace"},
+ {BAD_HTML_MESSAGE, N_("Add to LYNXMESSAGES"), "message"},
+ {BAD_HTML_WARN, N_("Warn, point to trace-file"), "warn"},
+ END_OPTIONS
+};
+
+static const char *select_popups_string = RC_SELECT_POPUPS;
+static const char *images_string = "images";
+static const char *images_ignore_all_string = N_("ignore");
+static const char *images_use_label_string = N_("as labels");
+static const char *images_use_links_string = N_("as links");
+
+static const char *verbose_images_string = RC_VERBOSE_IMAGES;
+static OptValues verbose_images_type_values[] =
+{
+ /* verbose_img variable */
+ {FALSE, N_("OFF"), "OFF"},
+ {TRUE, N_("show filename"), "ON"},
+ END_OPTIONS
+};
+
+static const char *collapse_br_tags_string = RC_COLLAPSE_BR_TAGS;
+static OptValues collapse_br_tags_values[] =
+{
+ /* LYCollapseBRs variable */
+ {FALSE, N_("OFF"), "OFF"},
+ {TRUE, N_("collapse"), "ON"},
+ END_OPTIONS
+};
+
+static const char *trim_blank_lines_string = RC_TRIM_BLANK_LINES;
+static OptValues trim_blank_lines_values[] =
+{
+ /* LYtrimBlankLines variable */
+ {FALSE, N_("OFF"), "OFF"},
+ {TRUE, N_("trim-lines"), "ON"},
+ END_OPTIONS
+};
+
+/*
+ * Bookmark Options
+ */
+static const char *mbm_string = RC_MULTI_BOOKMARK;
+static OptValues mbm_values[] =
+{
+ {MBM_OFF, N_("OFF"), "OFF"},
+ {MBM_STANDARD, N_("STANDARD"), "STANDARD"},
+ {MBM_ADVANCED, N_("ADVANCED"), "ADVANCED"},
+ END_OPTIONS
+};
+
+static const char *single_bookmark_string = RC_BOOKMARK_FILE;
+
+#ifdef USE_SESSIONS
+static const char *auto_session_string = RC_AUTO_SESSION;
+static const char *single_session_string = RC_SESSION_FILE;
+#endif
+
+/*
+ * Character Set Options
+ */
+static const char *assume_char_set_string = RC_ASSUME_CHARSET;
+static const char *display_char_set_string = RC_CHARACTER_SET;
+static const char *raw_mode_string = RC_RAW_MODE;
+
+#ifdef USE_IDN2
+static const char *idna_mode_string = RC_IDNA_MODE;
+static OptValues idna_values[] =
+{
+ {LYidna2003, N_("IDNA 2003"), "idna2003"},
+ {LYidna2008, N_("IDNA 2008"), "idna2008"},
+ {LYidnaTR46, N_("IDNA TR46"), "idnaTR46"},
+ {LYidnaCompat, N_("IDNA Compatible"), "idnaCompat"},
+ END_OPTIONS
+};
+#endif
+
+#ifdef USE_LOCALE_CHARSET
+static const char *locale_charset_string = RC_LOCALE_CHARSET;
+#endif
+
+static const char *html5_charsets_string = RC_HTML5_CHARSETS;
+
+/*
+ * File Management Options
+ */
+static const char *show_dotfiles_string = RC_SHOW_DOTFILES;
+static const char *no_pause_string = RC_NO_PAUSE;
+
+#ifdef DIRED_SUPPORT
+static const char *dired_list_string = RC_DIR_LIST_STYLE;
+static OptValues dired_list_values[] =
+{
+ {DIRS_FIRST, N_("Directories first"), "dired_dir"},
+ {FILES_FIRST, N_("Files first"), "dired_files"},
+ {MIXED_STYLE, N_("Mixed style"), "dired_mixed"},
+ END_OPTIONS
+};
+
+#ifdef LONG_LIST
+static const char *dired_sort_string = RC_DIR_LIST_ORDER;
+static OptValues dired_sort_values[] =
+{
+ {ORDER_BY_NAME, N_("By Name"), "dired_by_name"},
+ {ORDER_BY_TYPE, N_("By Type"), "dired_by_type"},
+ {ORDER_BY_SIZE, N_("By Size"), "dired_by_size"},
+ {ORDER_BY_DATE, N_("By Date"), "dired_by_date"},
+ {ORDER_BY_MODE, N_("By Mode"), "dired_by_mode"},
+#ifndef NO_GROUPS
+ {ORDER_BY_USER, N_("By User"), "dired_by_user"},
+ {ORDER_BY_GROUP, N_("By Group"), "dired_by_group"},
+#endif
+ END_OPTIONS
+};
+#endif /* LONG_LIST */
+#endif /* DIRED_SUPPORT */
+
+#ifndef DISABLE_FTP
+static const char *passive_ftp_string = RC_FTP_PASSIVE;
+
+static const char *ftp_sort_string = RC_FILE_SORTING_METHOD;
+static OptValues ftp_sort_values[] =
+{
+ {FILE_BY_NAME, N_("By Name"), "ftp_by_name"},
+ {FILE_BY_TYPE, N_("By Type"), "ftp_by_type"},
+ {FILE_BY_SIZE, N_("By Size"), "ftp_by_size"},
+ {FILE_BY_DATE, N_("By Date"), "ftp_by_date"},
+ END_OPTIONS
+};
+#endif
+
+#ifdef USE_READPROGRESS
+static const char *show_rate_string = RC_SHOW_KB_RATE;
+static OptValues rate_values[] =
+{
+ {rateOFF, N_("Do not show rate"), "rate_off"},
+ {rateBYTES, N_("Show %s/sec rate"), "rate_bytes"},
+ {rateKB, N_("Show %s/sec rate"), "rate_kb"},
+#ifdef USE_READPROGRESS
+ {rateEtaBYTES, N_("Show %s/sec, ETA"), "rate_eta_bytes"},
+ {rateEtaKB, N_("Show %s/sec, ETA"), "rate_eta_kb"},
+ {rateEtaBYTES2, N_("Show %s/sec (2-digits), ETA"), "rate_eta_bytes2"},
+ {rateEtaKB2, N_("Show %s/sec (2-digits), ETA"), "rate_eta_kb2"},
+#endif
+#ifdef USE_PROGRESSBAR
+ {rateBAR, N_("Show progressbar"), "rate_bar"},
+#endif
+ END_OPTIONS
+};
+#endif /* USE_READPROGRESS */
+
+static const char *preferred_content_string = RC_PREFERRED_CONTENT_TYPE;
+static OptValues content_values[] =
+{
+ {contentBINARY, STR_BINARY, STR_BINARY},
+ {contentTEXT, STR_PLAINTEXT, STR_PLAINTEXT},
+ {contentHTML, STR_HTML, STR_HTML},
+ END_OPTIONS
+};
+
+/*
+ * Presentation (MIME) types used in "Accept".
+ */
+static const char *preferred_media_string = RC_PREFERRED_MEDIA_TYPES;
+static OptValues media_values[] =
+{
+ {mediaOpt1, N_("Accept lynx's internal types"), "media_opt1"},
+ {mediaOpt2, N_("Also accept lynx.cfg's types"), "media_opt2"},
+ {mediaOpt3, N_("Also accept user's types"), "media_opt3"},
+ {mediaOpt4, N_("Also accept system's types"), "media_opt4"},
+ {mediaALL, N_("Accept all types"), "media_all"},
+ END_OPTIONS
+};
+
+static const char *preferred_encoding_string = RC_PREFERRED_ENCODING;
+static OptValues encoding_values[] =
+{
+ {encodingNONE, N_("None"), "encoding_none"},
+#if defined(USE_ZLIB) || defined(GZIP_PATH)
+ {encodingGZIP, N_("gzip"), "encoding_gzip"},
+ {encodingDEFLATE, N_("deflate"), "encoding_deflate"},
+#endif
+#if defined(USE_ZLIB) || defined(COMPRESS_PATH)
+ {encodingCOMPRESS, N_("compress"), "encoding_compress"},
+#endif
+#if defined(USE_BZLIB) || defined(BZIP2_PATH)
+ {encodingBZIP2, N_("bzip2"), "encoding_bzip2"},
+#endif
+#if defined(USE_BROTLI) || defined(BROTLI_PATH)
+ {encodingBROTLI, N_("brotli"), "encoding_brotli"},
+#endif
+ {encodingALL, N_("All"), "encoding_all"},
+ END_OPTIONS
+};
+
+/*
+ * Headers transferred to remote server
+ */
+static const char *http_protocol_string = RC_HTTP_PROTOCOL;
+static OptValues http_protocol_values[] =
+{
+ {HTTP_1_0, N_("HTTP 1.0"), "HTTP_1_0"},
+ {HTTP_1_1, N_("HTTP 1.1"), "HTTP_1_1"},
+ END_OPTIONS
+};
+
+static const char *preferred_doc_char_string = RC_PREFERRED_CHARSET;
+static const char *preferred_doc_lang_string = RC_PREFERRED_LANGUAGE;
+static const char *send_user_agent_string = RC_SEND_USERAGENT;
+static const char *user_agent_string = RC_USERAGENT;
+
+static const char *ssl_client_certificate_file = RC_SSL_CLIENT_CERT_FILE;
+static const char *ssl_client_key_file = RC_SSL_CLIENT_KEY_FILE;
+
+#define PutHeader(fp, Name) \
+ fprintf(fp, "\n%s<em>%s</em>\n", MARGIN_STR, LYEntifyTitle(&buffer, Name));
+
+#define PutCheckBox(fp, Name, Value, disable) \
+ fprintf(fp,\
+ "<input type=\"checkbox\" name=\"%s\" %s %s>\n",\
+ Name, Value ? "checked" : "", disable_all?disabled_string:disable)
+
+#define PutTextInput(fp, Name, Value, Size, disable) \
+ fprintf(fp,\
+ "<input size=%d type=\"text\" name=\"%s\" value=\"%s\" %s>\n",\
+ (int) Size, Name, Value, disable_all?disabled_string:disable)
+
+#define PutOption(fp, flag, html, name) \
+ fprintf(fp,"<option value=\"%s\" %s>%s\n", html, SELECTED(flag), gettext(name))
+
+#define BeginSelect(fp, text) \
+ fprintf(fp,"<select name=\"%s\" %s>\n", text, disable_all?disabled_string:"")
+
+#define MaybeSelect(fp, flag, text) \
+ fprintf(fp,"<select name=\"%s\" %s>\n", text, disable_all?disabled_string:DISABLED(flag))
+
+#define EndSelect(fp)\
+ fprintf(fp,"</select>\n")
+
+static void PutOptValues(FILE *fp, int value,
+ OptValues * table)
+{
+ while (table->LongName != 0) {
+ if (table->HtmlName) {
+ PutOption(fp,
+ value == table->value,
+ table->HtmlName,
+ table->LongName);
+ }
+ table++;
+ }
+}
+
+static BOOLEAN GetOptValues(OptValues * table, char *value,
+ int *result)
+{
+ while (table->LongName != 0) {
+ if (table->HtmlName && !strcmp(value, table->HtmlName)) {
+ *result = table->value;
+ return TRUE;
+ }
+ table++;
+ }
+ return FALSE;
+}
+
+#ifdef USE_COLOR_STYLE
+#ifdef LY_FIND_LEAKS
+void free_colorstyle_leaks(void)
+{
+ FREE(color_style_values);
+}
+#endif
+
+void build_lss_enum(HTList *list)
+{
+ int count = HTList_count(list);
+
+#ifdef LY_FIND_LEAKS
+ atexit(free_colorstyle_leaks);
+#endif
+
+ FREE(color_style_values);
+ if (count != 0) {
+ LSS_NAMES *obj;
+ int position = 0;
+
+ color_style_values = typecallocn(OptValues, count + 2);
+
+ if (color_style_values == NULL)
+ outofmem(__FILE__, "build_lss_enum");
+
+ color_style_values[position++] = bool_values[0];
+ while ((obj = HTList_objectAt(list, position - 1)) != 0) {
+ color_style_values[position].value = position;
+ color_style_values[position].LongName = obj->given;
+ color_style_values[position].HtmlName = obj->given;
+ position++;
+ }
+ }
+ color_style_list = list;
+}
+
+/*
+ * Find the current lss-file in the list, to get the default value for the
+ * form.
+ */
+static int get_color_style_value(void)
+{
+ int result = 0;
+
+ if (LYuse_color_style && non_empty(lynx_lss_file)) {
+ LSS_NAMES *obj;
+ int position = 1;
+
+ while ((obj = HTList_objectAt(color_style_list, position - 1)) != 0) {
+ if (obj->actual != 0 && !strcmp(obj->actual, lynx_lss_file)) {
+ result = position;
+ break;
+ } else if (!strcmp(obj->given, lynx_lss_file)) {
+ result = position;
+ break;
+ }
+ ++position;
+ }
+ }
+ return result;
+}
+
+/*
+ * Return the pathname found in the given list-item.
+ */
+static char *get_color_style_config(int code)
+{
+ char *result = 0;
+
+ if (LYuse_color_style) {
+ LSS_NAMES *obj;
+
+ if ((obj = HTList_objectAt(color_style_list, code - 1)) != 0) {
+ result = obj->actual;
+ }
+ }
+ return result;
+}
+#endif
+
+/*
+ * Break cgi line into array of pairs of pointers. Don't bother trying to
+ * be efficient. We're not called all that often.
+ * We come in with a string looking like:
+ * tag1=value1&tag2=value2&...&tagN=valueN
+ * We leave with an array of post_pairs. The last element in the array
+ * will have a tag pointing to NULL.
+ * Not pretty, but works. Hey, if strings can be null terminate arrays...
+ */
+static PostPair *break_data(bstring *data)
+{
+ char *p;
+ PostPair *q = NULL;
+ int count = 0;
+
+ if (isBEmpty(data))
+ return NULL;
+
+ p = BStrData(data);
+ CTRACE((tfp, "break_data %s\n", p));
+
+ q = typecalloc(PostPair);
+ if (q == NULL)
+ outofmem(__FILE__, "break_data(calloc)");
+
+ do {
+ /*
+ * First, break up on '&', sliding 'p' on down the line.
+ */
+ q[count].value = LYstrsep(&p, "&");
+ /*
+ * Then break up on '=', sliding value down, and setting tag.
+ */
+ q[count].tag = LYstrsep(&(q[count].value), "=");
+
+ /*
+ * Clean them up a bit, in case user entered a funky string.
+ */
+ HTUnEscape(q[count].tag);
+
+ /* In the value field we have '+' instead of ' '. So do a simple
+ * find&replace on the value field before UnEscaping() - SKY
+ */
+ {
+ size_t i, len;
+
+ len = strlen(q[count].value);
+ for (i = 0; i < len; i++) {
+ if (q[count].value[i] == '+') {
+#ifdef UNIX
+ /*
+ * Allow for special case of options which begin with a "+" on
+ * Unix - TD
+ */
+ if (i > 0
+ && q[count].value[i + 1] == '+'
+ && isalnum(UCH(q[count].value[i + 2]))) {
+ q[count].value[i++] = ' ';
+ i++;
+ continue;
+ }
+#endif
+ q[count].value[i] = ' ';
+ }
+ }
+ }
+ HTUnEscape(q[count].value);
+ CTRACE((tfp, "...item[%d] tag=%s, value=%s\n",
+ count, q[count].tag, q[count].value));
+
+ count++;
+ /*
+ * Like I said, screw efficiency. Sides, realloc is fast on
+ * Linux ;->
+ */
+ q = typeRealloc(PostPair, q, (unsigned) (count + 1));
+ if (q == NULL)
+ outofmem(__FILE__, "break_data(realloc)");
+
+ q[count].tag = NULL;
+ } while (p != NULL && p[0] != '\0');
+ return q;
+}
+
+static BOOL isLynxOptionsPage(const char *address, const char *portion)
+{
+ BOOL result = FALSE;
+
+ if (!strncasecomp(address, STR_LYNXOPTIONS, LEN_LYNXOPTIONS)) {
+ unsigned len = (unsigned) strlen(portion);
+
+ address += LEN_LYNXOPTIONS;
+ if (!strncasecomp(address, portion, (int) len)
+ && (address[len] == '\0' || LYIsHtmlSep(address[len]))) {
+ result = TRUE;
+ }
+ }
+ return result;
+}
+
+static int gen_options(char **newfile);
+
+/*
+ * Handle options from the pseudo-post. I think we really only need
+ * post_data here, but bring along everything just in case. It's only a
+ * pointer. MRC
+ *
+ * Options are processed in order according to gen_options(), we should not
+ * depend on it and add boolean flags where the order is essential (save,
+ * character sets...)
+ *
+ * Security: some options are disabled in gen_options() under certain
+ * conditions. We *should* duplicate the same conditions here in postoptions()
+ * to prevent user with a limited access from editing HTML options code
+ * manually (e.g., doing 'e'dit in 'o'ptions) and submit it to access the
+ * restricted items. Prevent spoofing attempts from index overrun. - LP
+ *
+ * Exit status: NULLFILE (reload) or NORMAL (use HText cache).
+ *
+ * On exit, got the document which was current before the Options menu:
+ *
+ * (from cache) nothing changed or no visual effect supposed:
+ * editor name, e-mail, etc.
+ *
+ * (reload locally) to see the effect of certain changes:
+ * display_char_set, assume_charset, etc.
+ * (use 'need_reload' flag where necessary).
+ *
+ * (reload from remote server and uncache on a proxy)
+ * few options changes should be transferred to remote server:
+ * preferred language, fake browser name, etc.
+ * (use 'need_end_reload' flag).
+ */
+
+int postoptions(DocInfo *newdoc)
+{
+ PostPair *data = 0;
+ DocAddress WWWDoc; /* need on exit */
+ int i;
+ int code = 0;
+ BOOLEAN save_all = FALSE;
+ int display_char_set_old = current_char_set;
+ int old_media_value = LYAcceptMedia;
+ BOOLEAN raw_mode_old = LYRawMode;
+ BOOLEAN assume_char_set_changed = FALSE;
+ BOOLEAN need_reload = FALSE;
+ BOOLEAN need_end_reload = FALSE;
+
+#if defined(USE_SLANG) || defined(COLOR_CURSES)
+ int CurrentShowColor = LYShowColor;
+#endif
+#ifdef USE_DEFAULT_COLORS
+ BOOLEAN current_default_colors = LYuse_default_colors;
+#endif
+
+ /*-------------------------------------------------
+ * kludge a link from mbm_menu, the URL was:
+ * "<a href=\"" LYNXOPTIONS_PAGE(MBM_MENU) "\">Goto multi-bookmark menu</a>\n"
+ *--------------------------------------------------*/
+
+ if (isLynxOptionsPage(newdoc->address, MBM_LINK)) {
+ FREE(newdoc->post_data);
+ if (no_bookmark) {
+ HTAlert(BOOKMARK_CHANGE_DISALLOWED); /* anonymous */
+ return (NULLFILE);
+ } else if (dump_output_immediately) {
+ return (NOT_FOUND);
+ } else {
+ edit_bookmarks();
+ return (NULLFILE);
+ }
+ } else if (!isLynxOptionsPage(newdoc->address, "/")) {
+ HTAlert(RANDOM_URL_DISALLOWED);
+ return NULLFILE;
+ }
+
+ data = break_data(newdoc->post_data);
+
+ if (!data) {
+ int status;
+
+ /*-------------------------------------------------
+ * kludge gen_options() call:
+ *--------------------------------------------------*/
+ status = gen_options(&newdoc->address);
+ if (status != NORMAL) {
+ HTAlwaysAlert("Unexpected way of accessing", newdoc->address);
+ FREE(newdoc->address);
+ return (status);
+ }
+
+ /* exit to getfile() cycle */
+ WWWDoc.address = newdoc->address;
+ WWWDoc.post_data = newdoc->post_data;
+ WWWDoc.post_content_type = newdoc->post_content_type;
+ WWWDoc.bookmark = newdoc->bookmark;
+ WWWDoc.isHEAD = newdoc->isHEAD;
+ WWWDoc.safe = newdoc->safe;
+
+ if (!HTLoadAbsolute(&WWWDoc))
+ return (NOT_FOUND);
+ LYRegisterUIPage(newdoc->address, UIP_OPTIONS_MENU);
+#ifdef DIRED_SUPPORT
+ lynx_edit_mode = FALSE;
+#endif /* DIRED_SUPPORT */
+ return (NORMAL);
+ }
+
+ if (!LYIsUIPage3(HTLoadedDocumentURL(), UIP_OPTIONS_MENU, 0) &&
+ !LYIsUIPage3(HTLoadedDocumentURL(), UIP_VLINKS, 0)) {
+ char *buf = NULL;
+
+ /* We may have been spoofed? */
+ HTSprintf0(&buf,
+ gettext("Use %s to invoke the Options menu!"),
+ key_for_func_ext(LYK_OPTIONS, FOR_PANEL));
+ HTAlert(buf);
+ FREE(buf);
+ FREE(data);
+ return (NOT_FOUND);
+ }
+
+ /*
+ * Checkbox will be missing from data if unchecked.
+ */
+ LYSendUserAgent = FALSE;
+
+ for (i = 0; data[i].tag != NULL; i++) {
+ /*
+ * This isn't really for security, but rather for avoiding that the
+ * user may revisit an older instance from the history stack and submit
+ * stuff which accidentally undoes changes that had been done from a
+ * newer instance. - kw
+ */
+ if (!strcmp(data[i].tag, secure_string)) {
+ if (!secure_value || strcmp(data[i].value, secure_value)) {
+ char *buf = NULL;
+
+ /*
+ * We probably came from an older instance of the Options
+ * page that had been on the history stack. - kw
+ */
+ HTSprintf0(&buf,
+ gettext("Use %s to invoke the Options menu!"),
+ key_for_func_ext(LYK_OPTIONS, FOR_PANEL));
+ HTAlert(buf);
+ FREE(data);
+ return (NULLFILE);
+ }
+ FREE(secure_value);
+ }
+
+ /* Save options */
+ if (!strcmp(data[i].tag, save_options_string) && (!no_option_save)) {
+ save_all = TRUE;
+ }
+
+ /* Cookies: SELECT */
+ if (!strcmp(data[i].tag, cookies_string)) {
+ if (!strcmp(data[i].value, cookies_ignore_all_string)) {
+ LYSetCookies = FALSE;
+ } else if (!strcmp(data[i].value, cookies_up_to_user_string)) {
+ LYSetCookies = TRUE;
+ LYAcceptAllCookies = FALSE;
+ } else if (!strcmp(data[i].value, cookies_accept_all_string)) {
+ LYSetCookies = TRUE;
+ LYAcceptAllCookies = TRUE;
+ }
+ }
+
+ /* X Display: INPUT */
+ if (!strcmp(data[i].tag, x_display_string)) {
+ LYsetXDisplay(data[i].value);
+ validate_x_display();
+ summarize_x_display(data[i].value);
+ }
+
+ /* Editor: INPUT */
+ if (!strcmp(data[i].tag, editor_string)) {
+ FREE(editor);
+ StrAllocCopy(editor, data[i].value);
+ }
+
+ /* Emacs keys: ON/OFF */
+ if (!strcmp(data[i].tag, emacs_keys_string)
+ && GetOptValues(bool_values, data[i].value, &code)) {
+ if ((emacs_keys = (BOOLEAN) code) != FALSE) {
+ set_emacs_keys();
+ } else {
+ reset_emacs_keys();
+ }
+ }
+
+ /* Execution links: SELECT */
+#if defined(ENABLE_OPTS_CHANGE_EXEC) && (defined(EXEC_LINKS) || defined(EXEC_SCRIPTS))
+ if (!strcmp(data[i].tag, exec_links_string)
+ && GetOptValues(exec_links_values, data[i].value, &code)) {
+#ifndef NEVER_ALLOW_REMOTE_EXEC
+ local_exec = (BOOLEAN) (code == EXEC_ALWAYS);
+#endif /* !NEVER_ALLOW_REMOTE_EXEC */
+ local_exec_on_local_files = (BOOLEAN) (code == EXEC_LOCAL);
+ }
+#endif /* ENABLE_OPTS_CHANGE_EXEC */
+
+ /* Keypad Mode: SELECT */
+ if (!strcmp(data[i].tag, keypad_mode_string)) {
+ int newval = 0;
+
+ if (GetOptValues(keypad_mode_values, data[i].value, &newval)
+ && keypad_mode != newval) {
+ keypad_mode = newval;
+ need_reload = TRUE;
+ if (keypad_mode == NUMBERS_AS_ARROWS) {
+ set_numbers_as_arrows();
+ } else {
+ reset_numbers_as_arrows();
+ }
+ }
+ }
+
+ /* Line edit style: SELECT */
+ if (!strcmp(data[i].tag, lineedit_mode_string)) {
+ int newval = atoi(data[i].value);
+ int j;
+
+ /* prevent spoofing attempt */
+ for (j = 0; LYEditorNames[j]; j++) {
+ if (j == newval)
+ current_lineedit = newval;
+ }
+ }
+#ifdef EXP_KEYBOARD_LAYOUT
+ /* Keyboard layout: SELECT */
+ if (!strcmp(data[i].tag, kblayout_string)) {
+ int newval = atoi(data[i].value);
+ int j;
+
+ /* prevent spoofing attempt */
+ for (j = 0; LYKbLayoutNames[j]; j++) {
+ if (j == newval)
+ current_layout = newval;
+ }
+ }
+#endif /* EXP_KEYBOARD_LAYOUT */
+
+ /* Mail Address: INPUT */
+ if (!strcmp(data[i].tag, mail_address_string)) {
+ FREE(personal_mail_address);
+ StrAllocCopy(personal_mail_address, data[i].value);
+ }
+#ifndef NO_ANONYMOUS_EMAIL
+ /* Personal Name: INPUT */
+ if (!strcmp(data[i].tag, personal_name_string)) {
+ FREE(personal_mail_name);
+ StrAllocCopy(personal_mail_name, data[i].value);
+ }
+#endif
+
+ /* Anonymous FTP Password: INPUT */
+#ifndef DISABLE_FTP
+ if (!strcmp(data[i].tag, anonftp_password_string)) {
+ FREE(anonftp_password);
+ StrAllocCopy(anonftp_password, data[i].value);
+ }
+#endif
+
+ /* Search Type: SELECT */
+ if (!strcmp(data[i].tag, search_type_string)
+ && GetOptValues(search_type_values, data[i].value, &code)) {
+ LYcase_sensitive = (BOOLEAN) code;
+ }
+
+ /* HTML error tolerance: SELECT */
+ if (!strcmp(data[i].tag, DTD_recovery_string)
+ && GetOptValues(DTD_type_values, data[i].value, &code)) {
+ if (Old_DTD != code) {
+ Old_DTD = code;
+ HTSwitchDTD(!Old_DTD);
+ need_reload = TRUE;
+ }
+ }
+
+ /* Bad HTML warnings: SELECT */
+ if (!strcmp(data[i].tag, bad_html_string)
+ && GetOptValues(bad_html_values, data[i].value, &code)) {
+ cfg_bad_html = code;
+ }
+
+ /* Select Popups: ON/OFF */
+ if (!strcmp(data[i].tag, select_popups_string)
+ && GetOptValues(bool_values, data[i].value, &code)) {
+ LYSelectPopups = (BOOLEAN) code;
+ }
+#if defined(USE_SLANG) || defined(COLOR_CURSES)
+ /* Show Color: SELECT */
+ if (!strcmp(data[i].tag, show_color_string)
+ && GetOptValues(show_color_values, data[i].value,
+ &LYChosenShowColor)) {
+ if (can_do_colors)
+ LYShowColor = LYChosenShowColor;
+ if (CurrentShowColor != LYShowColor) {
+ lynx_force_repaint();
+ }
+#ifdef USE_SLANG
+ SLtt_Use_Ansi_Colors = (LYShowColor > SHOW_COLOR_OFF ? TRUE : FALSE);
+#endif
+ }
+#endif /* USE_SLANG || COLOR_CURSES */
+
+#ifdef USE_COLOR_STYLE
+ /* Color Style: ON/OFF */
+ if (!strcmp(data[i].tag, color_style_string)
+ && GetOptValues(color_style_values, data[i].value, &code)) {
+ if (code) {
+ LYuse_color_style = TRUE;
+ StrAllocCopy(lynx_lss_file, get_color_style_config(code));
+ reinit_color_styles();
+ } else {
+ LYuse_color_style = FALSE;
+ }
+ update_color_style();
+ lynx_force_repaint();
+ }
+#endif
+
+#ifdef USE_DEFAULT_COLORS
+ /* Default Colors: ON/OFF */
+ if (!strcmp(data[i].tag, default_colors_string)
+ && GetOptValues(bool_values, data[i].value, &code)) {
+ LYuse_default_colors = (BOOLEAN) code;
+ if (current_default_colors != LYuse_default_colors) {
+ CTRACE((tfp, "default_colors changed, updating colors...\n"));
+ if (has_colors()) {
+ if (LYuse_default_colors) {
+ use_default_colors();
+ } else {
+ restart_curses();
+ }
+ update_default_colors();
+ lynx_force_repaint();
+ }
+ }
+ }
+#endif
+
+ /* Show Cursor: ON/OFF */
+ if (!strcmp(data[i].tag, show_cursor_string)
+ && GetOptValues(bool_values, data[i].value, &code)) {
+ LYShowCursor = (BOOLEAN) code;
+ }
+
+ /* Underline links: ON/OFF */
+ if (!strcmp(data[i].tag, underline_links_string)
+ && GetOptValues(bool_values, data[i].value, &code)) {
+ LYUnderlineLinks = (BOOLEAN) code;
+ }
+#ifdef USE_SCROLLBAR
+ /* Show Scrollbar: ON/OFF */
+ if (!strcmp(data[i].tag, show_scrollbar_string)
+ && GetOptValues(bool_values, data[i].value, &code)) {
+ LYShowScrollbar = (BOOLEAN) code;
+ need_reload = TRUE;
+ }
+#endif
+
+ /* Cookie Version: SELECT */
+ if (!strcmp(data[i].tag, cookie_version_string))
+ GetOptValues(cookies_values, data[i].value, &cookie_version);
+
+ /* Cookie Prompting: SELECT */
+ if (!strcmp(data[i].tag, cookie_prompt_string))
+ GetOptValues(prompt_values, data[i].value, &cookie_noprompt);
+
+#ifdef USE_SSL
+ /* SSL Prompting: SELECT */
+ if (!strcmp(data[i].tag, ssl_prompt_string))
+ GetOptValues(prompt_values, data[i].value, &ssl_noprompt);
+#endif
+
+ /* User Mode: SELECT */
+ if (!strcmp(data[i].tag, user_mode_string)
+ && GetOptValues(user_mode_values, data[i].value, &user_mode)) {
+ LYSetDisplayLines();
+ }
+
+ /* Type of visited pages page: SELECT */
+ if (!strcmp(data[i].tag, visited_links_string))
+ GetOptValues(visited_links_values, data[i].value, &Visited_Links_As);
+
+ /* Show Images: SELECT */
+ if (!strcmp(data[i].tag, images_string)) {
+ if (!strcmp(data[i].value, images_ignore_all_string)
+ && !(pseudo_inline_alts == FALSE && clickable_images == FALSE)) {
+ pseudo_inline_alts = FALSE;
+ clickable_images = FALSE;
+ need_reload = TRUE;
+ } else if (!strcmp(data[i].value, images_use_label_string)
+ && !(pseudo_inline_alts == TRUE && clickable_images == FALSE)) {
+ pseudo_inline_alts = TRUE;
+ clickable_images = FALSE;
+ need_reload = TRUE;
+ } else if (!strcmp(data[i].value, images_use_links_string)
+ && !(clickable_images == TRUE)) {
+ clickable_images = TRUE;
+ need_reload = TRUE;
+ }
+ }
+
+ /* Verbose Images: ON/OFF */
+ if (!strcmp(data[i].tag, verbose_images_string)
+ && GetOptValues(verbose_images_type_values, data[i].value, &code)) {
+ if (verbose_img != code) {
+ verbose_img = (BOOLEAN) code;
+ need_reload = TRUE;
+ }
+ }
+
+ /* Collapse BR Tags: ON/OFF */
+ if (!strcmp(data[i].tag, collapse_br_tags_string)
+ && GetOptValues(collapse_br_tags_values, data[i].value, &code)) {
+ if (LYCollapseBRs != code) {
+ LYCollapseBRs = (BOOLEAN) code;
+ need_reload = TRUE;
+ }
+ }
+
+ /* Trim Blank Lines: ON/OFF */
+ if (!strcmp(data[i].tag, trim_blank_lines_string)
+ && GetOptValues(trim_blank_lines_values, data[i].value, &code)) {
+ if (LYtrimBlankLines != code) {
+ LYtrimBlankLines = (BOOLEAN) code;
+ need_reload = TRUE;
+ }
+ }
+
+ /* VI Keys: ON/OFF */
+ if (!strcmp(data[i].tag, vi_keys_string)
+ && GetOptValues(bool_values, data[i].value, &code)) {
+ if ((vi_keys = (BOOLEAN) code) != FALSE) {
+ set_vi_keys();
+ } else {
+ reset_vi_keys();
+ }
+ }
+
+ /* Bookmarks File Menu: SELECT */
+ if (!strcmp(data[i].tag, mbm_string) && (!LYMBMBlocked)) {
+ GetOptValues(mbm_values, data[i].value, &LYMultiBookmarks);
+ }
+
+ /* Default Bookmarks filename: INPUT */
+ if (!strcmp(data[i].tag, single_bookmark_string) && (!no_bookmark)) {
+ if (strcmp(data[i].value, "")) {
+ FREE(bookmark_page);
+ StrAllocCopy(bookmark_page, data[i].value);
+ }
+ }
+#ifdef USE_SESSIONS
+ /* Auto Session: ON/OFF */
+ if (!strcmp(data[i].tag, auto_session_string)
+ && GetOptValues(bool_values, data[i].value, &code)) {
+ LYAutoSession = (BOOLEAN) code;
+ }
+
+ /* Default Session filename: INPUT */
+ if (!strcmp(data[i].tag, single_session_string)) {
+ if (strcmp(data[i].value, "")) {
+ FREE(LYSessionFile);
+ StrAllocCopy(LYSessionFile, data[i].value);
+ }
+ }
+#endif
+
+ /* Assume Character Set: SELECT */
+ if (!strcmp(data[i].tag, assume_char_set_string)) {
+ int newval = UCGetLYhndl_byMIME(data[i].value);
+
+ if (newval >= 0
+ && ((raw_mode_old &&
+ newval != safeUCGetLYhndl_byMIME(UCAssume_MIMEcharset))
+ || (!raw_mode_old &&
+ newval != UCLYhndl_for_unspec)
+ )) {
+
+ UCLYhndl_for_unspec = newval;
+ StrAllocCopy(UCAssume_MIMEcharset, data[i].value);
+ assume_char_set_changed = TRUE;
+ }
+ }
+#ifdef USE_LOCALE_CHARSET
+ /* Use locale-based character set: ON/OFF */
+ if (!strcmp(data[i].tag, locale_charset_string)
+ && GetOptValues(bool_values, data[i].value, &code)) {
+ LYLocaleCharset = (BOOLEAN) code;
+ }
+#endif
+ /* Use HTML5 charset replacements: ON/OFF */
+ if (!strcmp(data[i].tag, html5_charsets_string)
+ && GetOptValues(bool_values, data[i].value, &code)) {
+ html5_charsets = (BOOLEAN) code;
+ assume_char_set_changed = TRUE;
+ }
+
+ /* Display Character Set: SELECT */
+ if (!strcmp(data[i].tag, display_char_set_string)) {
+ int newval = atoi(data[i].value);
+ int j;
+
+ /* prevent spoofing attempt */
+ for (j = 0; LYchar_set_names[j]; j++) {
+ if (j == newval)
+ current_char_set = newval;
+ }
+ }
+#ifdef USE_IDN2
+ /* Internationalized Domain Names: SELECT */
+ if (!strcmp(data[i].tag, idna_mode_string)
+ && GetOptValues(idna_values, data[i].value, &code)) {
+ LYidnaMode = code;
+ }
+#endif
+
+ /* Raw Mode: ON/OFF */
+ if (!strcmp(data[i].tag, raw_mode_string)
+ && GetOptValues(bool_values, data[i].value, &code)) {
+ LYRawMode = (BOOLEAN) code;
+ }
+#ifndef DISABLE_FTP
+ /*
+ * passive ftp: ON/OFF
+ */
+ if (!strcmp(data[i].tag, passive_ftp_string)) {
+ ftp_passive = (BOOLEAN) code;
+ }
+
+ /*
+ * ftp sort: SELECT
+ */
+ if (!strcmp(data[i].tag, ftp_sort_string)) {
+ GetOptValues(ftp_sort_values, data[i].value, &HTfileSortMethod);
+ }
+#endif /* DISABLE_FTP */
+
+#ifdef DIRED_SUPPORT
+ /* Local Directory Style: SELECT */
+ if (!strcmp(data[i].tag, dired_list_string)) {
+ GetOptValues(dired_list_values, data[i].value, &dir_list_style);
+ }
+#ifdef LONG_LIST
+ /* Local Directory Order: SELECT */
+ if (!strcmp(data[i].tag, dired_sort_string)) {
+ GetOptValues(dired_sort_values, data[i].value, &dir_list_order);
+ }
+#endif /* LONG_LIST */
+#endif /* DIRED_SUPPORT */
+
+ /* Show dot files: ON/OFF */
+ if (!strcmp(data[i].tag, show_dotfiles_string) && (!no_dotfiles)
+ && GetOptValues(bool_values, data[i].value, &code)) {
+ show_dotfiles = (BOOLEAN) code;
+ }
+
+ /* Pause when showing messages: ON/OFF */
+ if (!strcmp(data[i].tag, no_pause_string)
+ && GetOptValues(bool_values, data[i].value, &code)) {
+ no_pause = (BOOLEAN) !code;
+ }
+#ifdef USE_READPROGRESS
+ /* Show Transfer Rate: enumerated value */
+ if (!strcmp(data[i].tag, show_rate_string)
+ && GetOptValues(rate_values, data[i].value, &code)) {
+ LYTransferRate = code;
+ }
+#endif /* USE_READPROGRESS */
+
+ /* Preferred Content Type: SELECT */
+ if (!strcmp(data[i].tag, preferred_content_string)) {
+ GetOptValues(content_values, data[i].value, &LYContentType);
+ }
+
+ /* Preferred Media Type: SELECT */
+ if (!strcmp(data[i].tag, preferred_media_string)) {
+ GetOptValues(media_values, data[i].value, &LYAcceptMedia);
+ }
+
+ /* Preferred Encoding: SELECT */
+ if (!strcmp(data[i].tag, preferred_encoding_string)) {
+ GetOptValues(encoding_values, data[i].value, &LYAcceptEncoding);
+ }
+
+ /* Preferred Document Character Set: INPUT */
+ if (!strcmp(data[i].tag, preferred_doc_char_string)) {
+ if (strcmp(pref_charset, data[i].value)) {
+ FREE(pref_charset);
+ StrAllocCopy(pref_charset, data[i].value);
+ need_end_reload = TRUE;
+ }
+ }
+
+ /* Preferred Document Language: INPUT */
+ if (!strcmp(data[i].tag, preferred_doc_lang_string)) {
+ if (strcmp(language, data[i].value)) {
+ FREE(language);
+ StrAllocCopy(language, data[i].value);
+ need_end_reload = TRUE;
+ }
+ }
+
+ /*
+ * HTTP protocol: SELECT
+ */
+ if (!strcmp(data[i].tag, http_protocol_string)) {
+ GetOptValues(http_protocol_values, data[i].value, &HTprotocolLevel);
+ }
+
+ /* Send User Agent: INPUT */
+ if (!strcmp(data[i].tag, send_user_agent_string)) {
+ LYSendUserAgent = (BOOLEAN) !strcasecomp(data[i].value, "ON");
+ }
+
+ if (!strcmp(data[i].tag, ssl_client_certificate_file)) {
+ FREE(SSL_client_cert_file);
+ StrAllocCopy(SSL_client_cert_file, data[i].value);
+ }
+
+ if (!strcmp(data[i].tag, ssl_client_key_file)) {
+ FREE(SSL_client_key_file);
+ StrAllocCopy(SSL_client_key_file, data[i].value);
+ }
+
+ /* User Agent: INPUT */
+ if (!strcmp(data[i].tag, user_agent_string) && (!no_useragent)) {
+ if (strcmp(LYUserAgent, data[i].value)) {
+ need_end_reload = TRUE;
+ FREE(LYUserAgent);
+ /* ignore Copyright warning ? */
+ StrAllocCopy(LYUserAgent,
+ *(data[i].value)
+ ? data[i].value
+ : LYUserAgentDefault);
+ if (!LYCheckUserAgent()) {
+ HTAlert(UA_PLEASE_USE_LYNX);
+ }
+ }
+ }
+ } /* end of loop */
+
+ /*
+ * Process the flags:
+ */
+#ifdef USE_LOCALE_CHARSET
+ LYFindLocaleCharset();
+#endif
+
+ if (old_media_value != LYAcceptMedia)
+ HTFilterPresentations();
+
+ if (display_char_set_old != current_char_set ||
+ raw_mode_old != LYRawMode ||
+ assume_char_set_changed) {
+ /*
+ * charset settings: the order is essential here.
+ */
+ if (display_char_set_old != current_char_set) {
+ /*
+ * Set the LYUseDefaultRawMode value and character handling if
+ * LYRawMode was changed. - FM
+ */
+ LYUseDefaultRawMode = TRUE;
+ HTMLUseCharacterSet(current_char_set);
+#ifdef CAN_SWITCH_DISPLAY_CHARSET
+ /* Deduce whether the user wants autoswitch: */
+ switch_display_charsets =
+ (current_char_set == auto_display_charset
+ || current_char_set == auto_other_display_charset);
+#endif
+ }
+ if (assume_char_set_changed && HTCJK != JAPANESE) {
+ LYRawMode = (BOOLEAN) (UCLYhndl_for_unspec == current_char_set);
+ }
+ if (raw_mode_old != LYRawMode || assume_char_set_changed) {
+ /*
+ * Set the raw 8-bit or CJK mode defaults and character set if
+ * changed. - FM
+ */
+ HTMLSetUseDefaultRawMode(current_char_set, LYRawMode);
+ HTMLSetCharacterHandling(current_char_set);
+ }
+ need_reload = TRUE;
+ }
+ /* end of charset settings */
+
+ BStrFree(newdoc->post_data);
+ FREE(data);
+ if (save_all) {
+ HTInfoMsg(SAVING_OPTIONS);
+ LYrcShowColor = LYChosenShowColor;
+ if (save_rc(NULL)) {
+ HTInfoMsg(OPTIONS_SAVED);
+ } else {
+ HTAlert(OPTIONS_NOT_SAVED);
+ }
+ }
+
+ /*
+ * Exit: working around the previous document. Being out of
+ * mainloop()/getfile() cycle, do things manually.
+ */
+ CTRACE((tfp, "\nLYOptions.c/postoptions(): exiting...\n"));
+ CTRACE((tfp, " need_reload = %s\n",
+ need_reload ? "TRUE" : "FALSE"));
+ CTRACE((tfp, " need_end_reload = %s\n",
+ need_end_reload ? "TRUE" : "FALSE"));
+
+ /* Options menu was pushed before postoptions(), so pop-up. */
+ LYpop(newdoc);
+ WWWDoc.address = newdoc->address;
+ WWWDoc.post_data = newdoc->post_data;
+ WWWDoc.post_content_type = newdoc->post_content_type;
+ WWWDoc.bookmark = newdoc->bookmark;
+ WWWDoc.isHEAD = newdoc->isHEAD;
+ WWWDoc.safe = newdoc->safe;
+ LYforce_no_cache = FALSE; /* ! */
+ LYoverride_no_cache = TRUE; /* ! */
+ /*
+ * Working out of getfile() cycle we reset *no_cache manually here so
+ * HTLoadAbsolute() will return "Document already in memory": it was
+ * forced reloading Options Menu again without this (overhead).
+ *
+ * Probably *no_cache was set in a wrong position because of
+ * the internal page...
+ */
+ if (!HTLoadAbsolute(&WWWDoc))
+ return (NOT_FOUND);
+
+ HTuncache_current_document(); /* will never use again */
+
+ /*
+ * Return to previous doc, not to options menu! Reload the document we had
+ * before the options menu but uncache only when necessary (Hurrah, user!):
+ */
+ LYpop(newdoc);
+ WWWDoc.address = newdoc->address;
+ WWWDoc.post_data = newdoc->post_data;
+ WWWDoc.post_content_type = newdoc->post_content_type;
+ WWWDoc.bookmark = newdoc->bookmark;
+ WWWDoc.isHEAD = newdoc->isHEAD;
+ WWWDoc.safe = newdoc->safe;
+ LYforce_no_cache = FALSE; /* see below */
+ LYoverride_no_cache = TRUE; /* see below */
+ /*
+ * Re-setting of *no_cache is probably not required here but this is a
+ * guarantee against _double_ reloading over the net in case prev document
+ * has its own "no cache" attribute and options menu set "need_reload"
+ * also. Force this HTLoadAbsolute() to return "Document already in
+ * memory".
+ */
+ if (!HTLoadAbsolute(&WWWDoc))
+ return (NOT_FOUND);
+
+ /*
+ * Now most interesting part: reload document when necessary.
+ * **********************************************************
+ */
+
+ reloading = FALSE; /* set manually */
+ /* force end-to-end reload from remote server if change LYUserAgent or
+ * language or pref_charset (marked by need_end_reload flag above), from
+ * old-style LYK_OPTIONS (mainloop):
+ */
+ if ((need_end_reload == TRUE &&
+ (StrNCmp(newdoc->address, "http", 4) == 0 ||
+ isLYNXCGI(newdoc->address)))) {
+ /*
+ * An option has changed which may influence content negotiation, and
+ * the resource is from a http or https or lynxcgi URL (the only
+ * protocols which currently do anything with this information). Set
+ * reloading = TRUE so that proxy caches will be flushed, which is
+ * necessary until the time when all proxies understand HTTP 1.1 Vary:
+ * and all Servers properly use it... Treat like case LYK_RELOAD (see
+ * comments there). - KW
+ */
+ reloading = TRUE; /* global flag */
+ need_reload = TRUE; /* this was probably already TRUE, don't worry */
+ }
+
+ if (need_reload == FALSE) {
+ /* no uncache, already loaded */
+ CTRACE((tfp, "LYOptions.c/postoptions(): now really exit.\n\n"));
+ return (NORMAL);
+ } else {
+ /* update HText cache */
+
+ /*
+ * see LYK_RELOAD & LYK_OPTIONS in mainloop for details...
+ */
+ if (HTisDocumentSource()) {
+ srcmode_for_next_retrieval(1);
+ }
+#ifdef USE_SOURCE_CACHE
+ if (reloading == FALSE) {
+ /* one more attempt to be smart enough: */
+ if (HTcan_reparse_document()) {
+ if (!HTreparse_document())
+ srcmode_for_next_retrieval(0);
+ CTRACE((tfp, "LYOptions.c/postoptions(): now really exit.\n\n"));
+ return (NORMAL);
+ }
+ }
+#endif
+ if (newdoc->post_data != NULL && !newdoc->safe &&
+ confirm_post_resub(newdoc->address, newdoc->title, 2, 1) == FALSE) {
+ HTInfoMsg(WILL_NOT_RELOAD_DOC);
+ if (HTisDocumentSource()) {
+ srcmode_for_next_retrieval(0);
+ }
+ return (NORMAL);
+ }
+
+ HEAD_request = HTLoadedDocumentIsHEAD();
+ /* uncache and load again */
+ HTuncache_current_document();
+ LYpush(newdoc, FALSE);
+ CTRACE((tfp, "LYOptions.c/postoptions(): now really exit.\n\n"));
+ return (NULLFILE);
+ }
+
+ /******** Done! **************************************************/
+}
+
+static char *NewSecureValue(void)
+{
+ static char oops[] = "?";
+
+ FREE(secure_value);
+ if ((secure_value = typeMallocn(char, 80)) != 0) {
+#if defined(RAND_MAX)
+ long key = (long) lynx_rand();
+
+#else
+ long key = (long) secure_value + (long) time(0);
+#endif
+ sprintf(secure_value, "%ld", key);
+ return secure_value;
+ }
+ return oops;
+}
+
+#define LABEL_LEN 33
+
+/*
+ * Note: the 'value' we are passing here is a local copy of the "same" string
+ * as is used in LYrcFile.c to index the saveable options.
+ */
+static void PutLabel(FILE *fp, const char *name,
+ const char *value)
+{
+ int have = (int) strlen(name);
+ int want = LABEL_LEN;
+ int need = LYstrExtent(name, have, want);
+ char *buffer = NULL;
+
+ fprintf(fp, "%s%s", MARGIN_STR, LYEntifyTitle(&buffer, NonNull(name)));
+
+ if (will_save_rc(value) && !no_option_save) {
+ while (need++ < want)
+ fprintf(fp, "&nbsp;");
+ } else {
+ want -= 3;
+ if (need < want) {
+ fprintf(fp, "&nbsp;");
+ ++need;
+ }
+ fprintf(fp, "(!)");
+ while (need++ < want) {
+ fprintf(fp, "&nbsp;");
+ }
+ }
+ fprintf(fp, ": ");
+ FREE(buffer);
+}
+
+/*
+ * For given a list of the .lynxrc names for boolean flags that make up a
+ * composite setting, check if any are not writable for the .lynxrc file. If
+ * so, return that name, so the subsequence will_save_rc() check in PutLabel()
+ * will flag the composite as not-saved.
+ */
+static const char *check_if_write_lynxrc(STRING2PTR table)
+{
+ int n;
+ const char *result = NULL;
+
+ for (n = 0; table[n] != 0; ++n) {
+ result = table[n];
+ if (!will_save_rc(result))
+ break;
+ }
+ return result;
+}
+
+/*
+ * The options menu treats "Cookies" as a single enumeration, but it is read
+ * from lynx.cfg (and perhaps .lynxrc) as a set of booleans. Check if any are
+ * not writable to .lynxrc, so we can show the user.
+ */
+static const char *will_save_cookies(void)
+{
+ static const char *table[] =
+ {
+ RC_SET_COOKIES, /* LYSetCookies */
+ RC_ACCEPT_ALL_COOKIES, /* LYAcceptAllCookies */
+ NULL
+ };
+
+ return check_if_write_lynxrc(table);
+}
+
+/*
+ * The options menu treats "Show images" as a single enumeration, but it is
+ * read from lynx.cfg (and perhaps .lynxrc) as a set of booleans. Check if any
+ * are not writable to .lynxrc, so we can show the user.
+ */
+static const char *will_save_images(void)
+{
+ static const char *table[] =
+ {
+ RC_MAKE_PSEUDO_ALTS_FOR_INLINES, /* pseudo_inline_alts */
+ RC_MAKE_LINKS_FOR_ALL_IMAGES, /* clickable_images */
+ NULL
+ };
+
+ return check_if_write_lynxrc(table);
+}
+
+/*
+ * The visited-links menu is used from the visited-links page as well as the
+ * options page.
+ */
+void LYMenuVisitedLinks(FILE *fp0, int disable_all)
+{
+ BeginSelect(fp0, visited_links_string);
+ PutOptValues(fp0, Visited_Links_As, visited_links_values);
+ EndSelect(fp0);
+}
+
+/*
+ * Okay, someone wants to change options. So, let's gen up a form for them
+ * and pass it around. Gor, this is ugly. Be a lot easier in Bourne with
+ * "here" documents. :->
+ * Basic Strategy: For each option, throw up the appropriate type of
+ * control, giving defaults as appropriate. If nothing else, we're
+ * probably going to test every control there is. MRC
+ *
+ * This function is synchronized with postoptions(). Read the comments in
+ * postoptions() header if you change something in gen_options().
+ */
+static int gen_options(char **newfile)
+{
+ static char tempfile[LY_MAXPATH] = "\0";
+
+ int i;
+ char *buffer = NULL;
+ BOOLEAN disable_all = FALSE;
+ FILE *fp0;
+ size_t cset_len = 0;
+ size_t text_len = (size_t) ((LYcolLimit > 45)
+ ? LYcolLimit - (LABEL_LEN + 2 + MARGIN_LEN)
+ : 7); /* cf: PutLabel */
+
+ if ((fp0 = InternalPageFP(tempfile, TRUE)) == 0)
+ return (NOT_FOUND);
+
+ LYLocalFileToURL(newfile, tempfile);
+
+ /* This should not be needed if we regenerate the temp file every time with
+ * a new name, which just happened above in the case
+ * LYReuseTempfiles==FALSE. Even for LYReuseTempfiles=TRUE, code at the
+ * end of postoptions() may remove an older cached version from memory if
+ * that version of the page was left by submitting changes. - kw
+ * 1999-11-27
+ * If access to the actual file via getfile() later fails (maybe because of
+ * some restrictions), mainloop may leave this flag on after popping the
+ * previous doc which is then unnecessarily reloaded. But I changed
+ * mainloop to reset the flag. - kw 1999-05-24
+ */
+ LYforce_no_cache = TRUE;
+
+ /*
+ * Without LYUseFormsOptions set we should maybe not even get here.
+ * However, it's possible we do; disable the form in that case. - kw
+ */
+#ifndef NO_OPTION_MENU
+ if (!LYUseFormsOptions)
+ disable_all = TRUE;
+#endif
+
+ BeginInternalPage(fp0, OPTIONS_TITLE, NULL); /* help link below */
+
+ /*
+ * I do C, not HTML. Feel free to pretty this up.
+ */
+ fprintf(fp0, "<form action=\"%s\" method=\"post\">\n", STR_LYNXOPTIONS);
+ /*
+ * use following with some sort of one shot secret key akin to NCSA
+ * (or was it CUTE?) telnet one shot password to allow ftp to self.
+ * to prevent spoofing.
+ */
+ fprintf(fp0, "<input name=\"%s\" type=\"hidden\" value=\"%s\">\n",
+ secure_string, NewSecureValue());
+
+ /*
+ * visible text begins here
+ */
+
+ /* Submit/Reset/Help */
+ fprintf(fp0, "<p align=center>\n");
+ if (!disable_all) {
+ fprintf(fp0,
+ "<input type=\"submit\" value=\"%s\"> - \n",
+ LYEntifyValue(&buffer, ACCEPT_CHANGES));
+ fprintf(fp0,
+ "<input type=\"reset\" value=\"%s\"> - \n",
+ LYEntifyValue(&buffer, RESET_CHANGES));
+ fprintf(fp0,
+ "%s - \n",
+ LYEntifyTitle(&buffer, CANCEL_CHANGES));
+ }
+ fprintf(fp0, "<a href=\"%s%s\">%s</a>\n",
+ helpfilepath, LYEntifyTitle(&buffer, OPTIONS_HELP), TO_HELP);
+
+ /* Save options */
+ if (!no_option_save) {
+ if (!disable_all) {
+ fprintf(fp0, "<p align=center>%s: ", LYEntifyTitle(&buffer, SAVE_OPTIONS));
+ fprintf(fp0, "<input type=\"checkbox\" name=\"%s\">\n",
+ save_options_string);
+ }
+ fprintf(fp0, "<br>%s\n",
+ LYEntifyTitle(&buffer,
+ gettext("(options marked with (!) will not be saved)")));
+ }
+
+ /*
+ * preformatted text follows
+ */
+ fprintf(fp0, "<pre>\n");
+
+ PutHeader(fp0, gettext("General Preferences"));
+ /*****************************************************************/
+
+ /* User Mode: SELECT */
+ PutLabel(fp0, gettext("User mode"), user_mode_string);
+ BeginSelect(fp0, user_mode_string);
+ PutOptValues(fp0, user_mode, user_mode_values);
+ EndSelect(fp0);
+
+ /* Editor: INPUT */
+ PutLabel(fp0, gettext("Editor"), editor_string);
+ PutTextInput(fp0, editor_string, NonNull(editor), text_len,
+ DISABLED(no_editor || system_editor));
+
+ /* Search Type: SELECT */
+ PutLabel(fp0, gettext("Type of Search"), search_type_string);
+ BeginSelect(fp0, search_type_string);
+ PutOptValues(fp0, LYcase_sensitive, search_type_values);
+ EndSelect(fp0);
+
+ PutHeader(fp0, gettext("Security and Privacy"));
+ /*****************************************************************/
+
+ /* Cookies: SELECT */
+ PutLabel(fp0, gettext("Cookies"), will_save_cookies());
+ BeginSelect(fp0, cookies_string);
+ PutOption(fp0, !LYSetCookies,
+ cookies_ignore_all_string,
+ cookies_ignore_all_string);
+ PutOption(fp0, LYSetCookies && !LYAcceptAllCookies,
+ cookies_up_to_user_string,
+ cookies_up_to_user_string);
+ PutOption(fp0, LYSetCookies && LYAcceptAllCookies,
+ cookies_accept_all_string,
+ cookies_accept_all_string);
+ EndSelect(fp0);
+
+ /* Cookie Version: SELECT */
+ PutLabel(fp0, gettext("Cookie RFC-version"), cookie_version_string);
+ BeginSelect(fp0, cookie_version_string);
+ PutOptValues(fp0, cookie_version, cookies_values);
+ EndSelect(fp0);
+
+ /* Cookie Prompting: SELECT */
+ PutLabel(fp0, gettext("Invalid-Cookie Prompting"), cookie_prompt_string);
+ BeginSelect(fp0, cookie_prompt_string);
+ PutOptValues(fp0, cookie_noprompt, prompt_values);
+ EndSelect(fp0);
+
+#ifdef USE_SSL
+ /* SSL Prompting: SELECT */
+ PutLabel(fp0, gettext("SSL Prompting"), ssl_prompt_string);
+ BeginSelect(fp0, ssl_prompt_string);
+ PutOptValues(fp0, ssl_noprompt, prompt_values);
+ EndSelect(fp0);
+
+ PutLabel(fp0, gettext("SSL client certificate file"), ssl_client_certificate_file);
+ PutTextInput(fp0, ssl_client_certificate_file,
+ NonNull(SSL_client_cert_file), text_len, "");
+
+ PutLabel(fp0, gettext("SSL client key file"), ssl_client_key_file);
+ PutTextInput(fp0, ssl_client_key_file,
+ NonNull(SSL_client_key_file), text_len, "");
+
+#endif
+
+ PutHeader(fp0, gettext("Keyboard Input"));
+ /*****************************************************************/
+
+ /* Keypad Mode: SELECT */
+ PutLabel(fp0, gettext("Keypad mode"), keypad_mode_string);
+ BeginSelect(fp0, keypad_mode_string);
+ PutOptValues(fp0, keypad_mode, keypad_mode_values);
+ EndSelect(fp0);
+
+ /* Emacs keys: ON/OFF */
+ PutLabel(fp0, gettext("Emacs keys"), emacs_keys_string);
+ BeginSelect(fp0, emacs_keys_string);
+ PutOptValues(fp0, emacs_keys, bool_values);
+ EndSelect(fp0);
+
+ /* VI Keys: ON/OFF */
+ PutLabel(fp0, gettext("VI keys"), vi_keys_string);
+ BeginSelect(fp0, vi_keys_string);
+ PutOptValues(fp0, vi_keys, bool_values);
+ EndSelect(fp0);
+
+ /* Line edit style: SELECT */
+ if (LYEditorNames[1]) { /* well, at least 2 line edit styles available */
+ PutLabel(fp0, gettext("Line edit style"), lineedit_mode_string);
+ BeginSelect(fp0, lineedit_mode_string);
+ for (i = 0; LYEditorNames[i]; i++) {
+ char temp[DigitsOf(i) + 3];
+
+ sprintf(temp, "%d", i);
+ PutOption(fp0, i == current_lineedit, temp, LYEditorNames[i]);
+ }
+ EndSelect(fp0);
+ }
+#ifdef EXP_KEYBOARD_LAYOUT
+ /* Keyboard layout: SELECT */
+ PutLabel(fp0, gettext("Keyboard layout"), kblayout_string);
+ BeginSelect(fp0, kblayout_string);
+ for (i = 0; LYKbLayoutNames[i]; i++) {
+ char temp[DigitsOf(i) + 3];
+
+ sprintf(temp, "%d", i);
+ PutOption(fp0, i == current_layout, temp, LYKbLayoutNames[i]);
+ }
+ EndSelect(fp0);
+#endif /* EXP_KEYBOARD_LAYOUT */
+
+ /*
+ * Display and Character Set
+ */
+ PutHeader(fp0, gettext("Display and Character Set"));
+ /*****************************************************************/
+
+#ifdef USE_LOCALE_CHARSET
+ /* Use locale-based character set: ON/OFF */
+ PutLabel(fp0, gettext("Use locale-based character set"), locale_charset_string);
+ BeginSelect(fp0, locale_charset_string);
+ PutOptValues(fp0, LYLocaleCharset, bool_values);
+ EndSelect(fp0);
+#else
+#define LYLocaleCharset FALSE
+#endif
+ PutLabel(fp0, gettext("Use HTML5 charset replacements"), html5_charsets_string);
+ BeginSelect(fp0, html5_charsets_string);
+ PutOptValues(fp0, html5_charsets, bool_values);
+ EndSelect(fp0);
+
+ /* Display Character Set: SELECT */
+ PutLabel(fp0, gettext("Display character set"), display_char_set_string);
+ MaybeSelect(fp0, LYLocaleCharset, display_char_set_string);
+ for (i = 0; LYchar_set_names[i]; i++) {
+ char temp[DigitsOf(i) + 3];
+ size_t len = strlen(LYchar_set_names[i]);
+
+ if (len > cset_len)
+ cset_len = len;
+ sprintf(temp, "%d", i);
+#ifdef USE_CHARSET_CHOICE
+ if (!charset_subsets[i].hide_display)
+#endif
+ PutOption(fp0, i == current_char_set, temp, LYchar_set_names[i]);
+ }
+ EndSelect(fp0);
+
+ /* Assume Character Set: SELECT */
+ {
+ int curval;
+
+ curval = UCLYhndl_for_unspec;
+
+ /*
+ * FIXME: If bogus value in lynx.cfg, then in old way, that is the
+ * string that was displayed. Now, user will never see that. Good
+ * or bad? I don't know. MRC
+ */
+ if (curval == current_char_set) {
+ /* ok, LYRawMode, so use UCAssume_MIMEcharset */
+ curval = safeUCGetLYhndl_byMIME(UCAssume_MIMEcharset);
+ }
+ PutLabel(fp0, gettext("Assumed document character set"), assume_char_set_string);
+ BeginSelect(fp0, assume_char_set_string);
+ for (i = 0; i < LYNumCharsets; i++) {
+#ifdef USE_CHARSET_CHOICE
+ if (!charset_subsets[i].hide_assumed)
+#endif
+ PutOption(fp0, i == curval,
+ LYCharSet_UC[i].MIMEname,
+ LYCharSet_UC[i].MIMEname);
+ }
+ EndSelect(fp0);
+ }
+
+#ifdef USE_IDN2
+ /* Internationalized Domain Names: SELECT */
+ {
+ PutLabel(fp0, gettext("Internationalized domain names"), idna_mode_string);
+ BeginSelect(fp0, idna_mode_string);
+ for (i = 0; idna_values[i].value != 0; i++) {
+ PutOption(fp0, idna_values[i].value == LYidnaMode,
+ idna_values[i].HtmlName,
+ idna_values[i].LongName);
+ }
+ EndSelect(fp0);
+ }
+#endif
+
+ /* Raw Mode: ON/OFF */
+ if (LYHaveCJKCharacterSet) {
+ /*
+ * Since CJK people hardly mixed with other world
+ * we split the header to make it more readable:
+ * "CJK mode" for CJK display charsets, and "Raw 8-bit" for others.
+ */
+ PutLabel(fp0, gettext("CJK mode"), raw_mode_string);
+ } else {
+ PutLabel(fp0, gettext("Raw 8-bit"), raw_mode_string);
+ }
+
+ BeginSelect(fp0, raw_mode_string);
+ PutOptValues(fp0, LYRawMode, bool_values);
+ EndSelect(fp0);
+
+ /* X Display: INPUT */
+ PutLabel(fp0, gettext("X Display"), x_display_string);
+ PutTextInput(fp0, x_display_string, NonNull(x_display), text_len, "");
+
+ /*
+ * Document Appearance
+ */
+ PutHeader(fp0, gettext("Document Appearance"));
+ /*****************************************************************/
+
+ /* Show Color: SELECT */
+#if defined(USE_SLANG) || defined(COLOR_CURSES)
+ SetupChosenShowColor();
+ PutLabel(fp0, gettext("Show color"), show_color_string);
+ if (no_option_save) {
+ MaybeSelect(fp0, !can_do_colors, show_color_string);
+ if (LYShowColor == SHOW_COLOR_NEVER) {
+ LYShowColor = SHOW_COLOR_OFF;
+ } else if (LYShowColor == SHOW_COLOR_ALWAYS) {
+ LYShowColor = SHOW_COLOR_ON;
+ }
+ PutOptValues(fp0, LYShowColor - SHOW_COLOR_OFF, bool_values);
+ } else {
+ BeginSelect(fp0, show_color_string);
+ if (can_do_colors) {
+ show_color_values[2].HtmlName = on_string;
+ show_color_values[3].LongName = always_string;
+ } else {
+ show_color_values[2].HtmlName = NULL; /* suppress "ON" - kw */
+ show_color_values[3].LongName = "Always try";
+ }
+ PutOptValues(fp0, LYChosenShowColor, show_color_values);
+ }
+ EndSelect(fp0);
+#endif /* USE_SLANG || COLOR_CURSES */
+
+#ifdef USE_COLOR_STYLE
+ /* Color style: ON/OFF */
+ if (HasOptValues(color_style_values)) {
+ PutLabel(fp0, gettext("Color style"), color_style_string);
+ BeginSelect(fp0, color_style_string);
+ PutOptValues(fp0, get_color_style_value(), color_style_values);
+ EndSelect(fp0);
+ }
+#endif
+
+#ifdef USE_DEFAULT_COLORS
+ /* Default colors: ON/OFF */
+ if (has_colors()) {
+ PutLabel(fp0, gettext("Default colors"), default_colors_string);
+ BeginSelect(fp0, default_colors_string);
+ PutOptValues(fp0, LYuse_default_colors, bool_values);
+ EndSelect(fp0);
+ }
+#endif
+
+ /* Show cursor: ON/OFF */
+ PutLabel(fp0, gettext("Show cursor"), show_cursor_string);
+ BeginSelect(fp0, show_cursor_string);
+ PutOptValues(fp0, LYShowCursor, bool_values);
+ EndSelect(fp0);
+
+ /* Underline links: ON/OFF */
+ PutLabel(fp0, gettext("Underline links"), underline_links_string);
+ BeginSelect(fp0, underline_links_string);
+ PutOptValues(fp0, LYUnderlineLinks, bool_values);
+ EndSelect(fp0);
+
+#ifdef USE_SCROLLBAR
+ /* Show scrollbar: ON/OFF */
+ PutLabel(fp0, gettext("Show scrollbar"), show_scrollbar_string);
+ BeginSelect(fp0, show_scrollbar_string);
+ PutOptValues(fp0, LYShowScrollbar, bool_values);
+ EndSelect(fp0);
+#endif
+
+ /* Select Popups: ON/OFF */
+ PutLabel(fp0, gettext("Popups for select fields"), select_popups_string);
+ BeginSelect(fp0, select_popups_string);
+ PutOptValues(fp0, LYSelectPopups, bool_values);
+ EndSelect(fp0);
+
+ /* HTML error recovery: SELECT */
+ PutLabel(fp0, gettext("HTML error recovery"), DTD_recovery_string);
+ BeginSelect(fp0, DTD_recovery_string);
+ PutOptValues(fp0, Old_DTD, DTD_type_values);
+ EndSelect(fp0);
+
+ /* Bad HTML messages: SELECT */
+ PutLabel(fp0, gettext("Bad HTML messages"), bad_html_string);
+ BeginSelect(fp0, bad_html_string);
+ PutOptValues(fp0, cfg_bad_html, bad_html_values);
+ EndSelect(fp0);
+
+ /* Show Images: SELECT */
+ PutLabel(fp0, gettext("Show images"), will_save_images());
+ BeginSelect(fp0, images_string);
+ PutOption(fp0, !pseudo_inline_alts && !clickable_images,
+ images_ignore_all_string,
+ images_ignore_all_string);
+ PutOption(fp0, pseudo_inline_alts && !clickable_images,
+ images_use_label_string,
+ images_use_label_string);
+ PutOption(fp0, clickable_images,
+ images_use_links_string,
+ images_use_links_string);
+ EndSelect(fp0);
+
+ /* Verbose Images: ON/OFF */
+ PutLabel(fp0, gettext("Verbose images"), verbose_images_string);
+ BeginSelect(fp0, verbose_images_string);
+ PutOptValues(fp0, verbose_img, verbose_images_type_values);
+ EndSelect(fp0);
+
+ /* Collapse BR Tags: ON/OFF */
+ PutLabel(fp0, gettext("Collapse BR tags"), collapse_br_tags_string);
+ BeginSelect(fp0, collapse_br_tags_string);
+ PutOptValues(fp0, LYCollapseBRs, collapse_br_tags_values);
+ EndSelect(fp0);
+
+ /* Trim blank lines: ON/OFF */
+ PutLabel(fp0, gettext("Trim blank lines"), trim_blank_lines_string);
+ BeginSelect(fp0, trim_blank_lines_string);
+ PutOptValues(fp0, LYtrimBlankLines, trim_blank_lines_values);
+ EndSelect(fp0);
+
+ /*
+ * Headers Transferred to Remote Servers
+ */
+ PutHeader(fp0, gettext("Headers Transferred to Remote Servers"));
+ /*****************************************************************/
+
+ /* Mail Address: INPUT */
+ PutLabel(fp0, gettext("Personal mail address"), mail_address_string);
+ PutTextInput(fp0, mail_address_string,
+ NonNull(personal_mail_address), text_len, "");
+
+#ifndef NO_ANONYMOUS_EMAIL
+ PutLabel(fp0, gettext("Personal name for mail"), personal_name_string);
+ PutTextInput(fp0, personal_name_string,
+ NonNull(personal_mail_name), text_len, "");
+#endif
+
+ /* Anonymous FTP Address: INPUT */
+#ifndef DISABLE_FTP
+ PutLabel(fp0, gettext("Password for anonymous ftp"), anonftp_password_string);
+ PutTextInput(fp0, anonftp_password_string,
+ NonNull(anonftp_password), text_len, "");
+#endif
+
+ /* Preferred content type: SELECT */
+ PutLabel(fp0, gettext("Preferred content type"), preferred_content_string);
+ BeginSelect(fp0, preferred_content_string);
+ PutOptValues(fp0, LYContentType, content_values);
+ EndSelect(fp0);
+
+ /* Preferred media type: SELECT */
+ PutLabel(fp0, gettext("Preferred media type"), preferred_media_string);
+ BeginSelect(fp0, preferred_media_string);
+ PutOptValues(fp0, LYAcceptMedia, media_values);
+ EndSelect(fp0);
+
+ /* Preferred encoding: SELECT */
+ PutLabel(fp0, gettext("Preferred encoding"), preferred_encoding_string);
+ BeginSelect(fp0, preferred_encoding_string);
+ PutOptValues(fp0, LYAcceptEncoding, encoding_values);
+ EndSelect(fp0);
+
+ /* Preferred Document Character Set: INPUT */
+ PutLabel(fp0, gettext("Preferred document character set"), preferred_doc_char_string);
+ PutTextInput(fp0, preferred_doc_char_string,
+ NonNull(pref_charset), cset_len + 2, "");
+
+ /* Preferred Document Language: INPUT */
+ PutLabel(fp0, gettext("Preferred document language"), preferred_doc_lang_string);
+ PutTextInput(fp0, preferred_doc_lang_string,
+ NonNull(language), cset_len + 2, "");
+
+ /* HTTP protocol SELECT */
+ PutLabel(fp0, gettext("HTTP protocol"), http_protocol_string);
+ BeginSelect(fp0, http_protocol_string);
+ PutOptValues(fp0, HTprotocolLevel, http_protocol_values);
+ EndSelect(fp0);
+
+ /* User Agent: INPUT */
+ if (!no_useragent) {
+ PutLabel(fp0, gettext("Send User-Agent header"), send_user_agent_string);
+ PutCheckBox(fp0, send_user_agent_string, LYSendUserAgent, "");
+ PutLabel(fp0, gettext("User-Agent header"), user_agent_string);
+ PutTextInput(fp0, user_agent_string,
+ NonNull(LYUserAgent), text_len, "");
+ }
+
+ /*
+ * Listing and Accessing Files
+ */
+ PutHeader(fp0, gettext("Listing and Accessing Files"));
+ /*****************************************************************/
+
+#ifndef DISABLE_FTP
+ /* FTP sort: SELECT */
+ PutLabel(fp0, gettext("Use Passive FTP"), passive_ftp_string);
+ BeginSelect(fp0, passive_ftp_string);
+ PutOptValues(fp0, ftp_passive, bool_values);
+ EndSelect(fp0);
+
+ /* FTP sort: SELECT */
+ PutLabel(fp0, gettext("FTP sort criteria"), ftp_sort_string);
+ BeginSelect(fp0, ftp_sort_string);
+ PutOptValues(fp0, HTfileSortMethod, ftp_sort_values);
+ EndSelect(fp0);
+#endif /* DISABLE_FTP */
+
+#ifdef DIRED_SUPPORT
+ /* Local Directory Sort: SELECT */
+ PutLabel(fp0, gettext("Local directory sort criteria"), dired_list_string);
+ BeginSelect(fp0, dired_list_string);
+ PutOptValues(fp0, dir_list_style, dired_list_values);
+ EndSelect(fp0);
+#ifdef LONG_LIST
+ /* Local Directory Order: SELECT */
+ PutLabel(fp0, gettext("Local directory sort order"), dired_sort_string);
+ BeginSelect(fp0, dired_sort_string);
+ PutOptValues(fp0, dir_list_order, dired_sort_values);
+ EndSelect(fp0);
+#endif /* LONG_LIST */
+#endif /* DIRED_SUPPORT */
+
+ /* Show dot files: ON/OFF */
+ if (!no_dotfiles) {
+ PutLabel(fp0, gettext("Show dot files"), show_dotfiles_string);
+ BeginSelect(fp0, show_dotfiles_string);
+ PutOptValues(fp0, show_dotfiles, bool_values);
+ EndSelect(fp0);
+ }
+
+ /* Execution links: SELECT */
+#if defined(ENABLE_OPTS_CHANGE_EXEC) && (defined(EXEC_LINKS) || defined(EXEC_SCRIPTS))
+ PutLabel(fp0, gettext("Execution links"), exec_links_string);
+ BeginSelect(fp0, exec_links_string);
+#ifndef NEVER_ALLOW_REMOTE_EXEC
+ PutOptValues(fp0, local_exec
+ ? EXEC_ALWAYS
+ : (local_exec_on_local_files
+ ? EXEC_LOCAL
+ : EXEC_NEVER),
+ exec_links_values);
+#else
+ PutOptValues(fp0, local_exec_on_local_files
+ ? EXEC_LOCAL
+ : EXEC_NEVER,
+ exec_links_values);
+#endif /* !NEVER_ALLOW_REMOTE_EXEC */
+ EndSelect(fp0);
+#endif /* ENABLE_OPTS_CHANGE_EXEC */
+
+ PutLabel(fp0, gettext("Pause when showing message"), no_pause_string);
+ BeginSelect(fp0, no_pause_string);
+ PutOptValues(fp0, !no_pause, bool_values);
+ EndSelect(fp0);
+
+#ifdef USE_READPROGRESS
+ /* Show transfer rate: SELECT */
+ PutLabel(fp0, gettext("Show transfer rate"), show_rate_string);
+ BeginSelect(fp0, show_rate_string);
+ for (i = 0; rate_values[i].LongName != 0; ++i) {
+ char *message = NULL;
+
+ HTSprintf0(&message,
+ rate_values[i].LongName,
+ HTProgressUnits(rate_values[i].value));
+ PutOption(fp0,
+ LYTransferRate == rate_values[i].value,
+ rate_values[i].HtmlName,
+ message);
+ FREE(message);
+ }
+ EndSelect(fp0);
+#endif /* USE_READPROGRESS */
+
+ /*
+ * Special Files and Screens
+ */
+ PutHeader(fp0, gettext("Special Files and Screens"));
+ /*****************************************************************/
+
+ /* Multi-Bookmark Mode: SELECT */
+ if (!LYMBMBlocked) {
+ PutLabel(fp0, gettext("Multi-bookmarks"), mbm_string);
+ BeginSelect(fp0, mbm_string);
+ PutOptValues(fp0, LYMultiBookmarks, mbm_values);
+ EndSelect(fp0);
+ }
+
+ /* Bookmarks File Menu: LINK/INPUT */
+ if (LYMultiBookmarks) {
+ PutLabel(fp0, gettext("Review/edit Bookmarks files"), mbm_string);
+ fprintf(fp0, "<a href=\"%s\">%s</a>\n",
+ LYNXOPTIONS_PAGE(MBM_LINK),
+ LYEntifyTitle(&buffer, gettext("Goto multi-bookmark menu")));
+ } else {
+ PutLabel(fp0, gettext("Bookmarks file"), single_bookmark_string);
+ PutTextInput(fp0, single_bookmark_string,
+ NonNull(bookmark_page), text_len, "");
+ }
+
+#ifdef USE_SESSIONS
+ /* Auto Session: ON/OFF */
+ PutLabel(fp0, gettext("Auto Session"), auto_session_string);
+ BeginSelect(fp0, auto_session_string);
+ PutOptValues(fp0, LYAutoSession, bool_values);
+ EndSelect(fp0);
+
+ /* Session File Menu: INPUT */
+ PutLabel(fp0, gettext("Session file"), single_session_string);
+ PutTextInput(fp0, single_session_string,
+ NonNull(LYSessionFile), text_len, "");
+#endif
+
+ /* Visited Pages: SELECT */
+ PutLabel(fp0, gettext("Visited Pages"), visited_links_string);
+ LYMenuVisitedLinks(fp0, disable_all);
+
+ if (!no_lynxcfg_info) {
+ fprintf(fp0, "\n %s<a href=\"%s\">lynx.cfg</a>.\n",
+ LYEntifyTitle(&buffer, gettext("View the file ")),
+ STR_LYNXCFG);
+ }
+
+ fprintf(fp0, "\n</pre>\n");
+
+ /* Submit/Reset */
+ if (!disable_all) {
+ fprintf(fp0, "<p align=center>\n");
+ fprintf(fp0,
+ "<input type=\"submit\" value=\"%s\"> - \n",
+ LYEntifyValue(&buffer, ACCEPT_CHANGES));
+ fprintf(fp0,
+ "<input type=\"reset\" value=\"%s\"> - \n",
+ LYEntifyValue(&buffer, RESET_CHANGES));
+ fprintf(fp0, "%s\n", LYEntifyTitle(&buffer, CANCEL_CHANGES));
+ }
+
+ /*
+ * close HTML
+ */
+ fprintf(fp0, "</form>\n");
+ EndInternalPage(fp0);
+
+ FREE(buffer);
+
+ LYCloseTempFP(fp0);
+ return (NORMAL);
+}
+
+#endif /* !NO_OPTION_FORMS */
diff --git a/src/LYOptions.h b/src/LYOptions.h
new file mode 100644
index 0000000..2811f2a
--- /dev/null
+++ b/src/LYOptions.h
@@ -0,0 +1,46 @@
+/* $LynxId: LYOptions.h,v 1.32 2017/01/01 01:51:23 tom Exp $ */
+#ifndef LYOPTIONS_H
+#define LYOPTIONS_H
+
+#include <LYStructs.h>
+#include <LYStrings.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ extern BOOLEAN term_options; /* for LYgetstr() */
+
+ extern BOOLEAN LYCheckUserAgent(void);
+ extern void edit_bookmarks(void);
+ extern int popup_choice(int cur_choice,
+ int line,
+ int column,
+ STRING2PTR choices,
+ int length,
+ int disabled,
+ int mouse);
+
+#define LYChoosePopup(cur, line, column, choices, length, disabled, mouse) \
+ popup_choice(cur, line, column, (STRING2PTR) choices, length, disabled, mouse)
+
+#ifndef NO_OPTION_FORMS
+ extern void LYMenuVisitedLinks(FILE *fp0, int disable_all);
+ extern int postoptions(DocInfo *newdoc);
+#endif /* !NO_OPTION_FORMS */
+
+#ifndef NO_OPTION_MENU
+ extern void LYoptions(void);
+#endif /* !NO_OPTION_MENU */
+
+#ifdef USE_COLOR_STYLE
+ extern void build_lss_enum(HTList *);
+#endif
+
+#if defined(USE_COLOR_STYLE) && defined(LY_FIND_LEAKS)
+ extern void free_colorstyle_leaks(void);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* LYOPTIONS_H */
diff --git a/src/LYPrettySrc.c b/src/LYPrettySrc.c
new file mode 100644
index 0000000..c2ff39e
--- /dev/null
+++ b/src/LYPrettySrc.c
@@ -0,0 +1,427 @@
+/*
+ * $LynxId: LYPrettySrc.c,v 1.36 2018/03/06 10:27:28 tom Exp $
+ *
+ * HTML source syntax highlighting
+ * by Vlad Harchev <hvv@hippo.ru>
+ * March 1999
+ */
+#include <HTUtils.h>
+#include <LYHash.h>
+#include <LYPrettySrc.h>
+#include <LYStrings.h>
+#include <LYLeaks.h>
+
+ /* This file creates too many "leak detected" entries in Lynx.leaks. */
+#define NO_MEMORY_TRACKING
+#include <LYLeaks.h>
+
+#ifdef USE_PRETTYSRC
+BOOL psrc_convert_string = FALSE;
+BOOL psrc_view = FALSE; /* this is read by SGML_put_character - TRUE
+
+ when viewing pretty source */
+BOOLEAN LYpsrc = FALSE; /* this tells what will be shown on '\':
+
+ if TRUE, then pretty source, normal source view otherwise. Toggled by
+ -prettysrc commandline option. */
+BOOL sgml_in_psrc_was_initialized;
+BOOL psrc_nested_call;
+BOOL psrc_first_tag;
+BOOL mark_htext_as_source = FALSE;
+
+ /* tagspecs from lynx.cfg are read here. After .lss file is read (is with lss
+ support), the style cache and markup are created before entering the
+ mainloop. */
+BOOLEAN psrcview_no_anchor_numbering = FALSE;
+static const char *HTL_tagspecs_defaults[HTL_num_lexemes] =
+{
+ /* these values are defaults. They are also listed in comments of distibution's
+ lynx.cfg. */
+#ifdef USE_COLOR_STYLE
+ "span.htmlsrc_comment:!span",
+ "span.htmlsrc_tag:!span",
+ "span.htmlsrc_attrib:!span",
+ "span.htmlsrc_attrval:!span",
+ "span.htmlsrc_abracket:!span",
+ "span.htmlsrc_entity:!span",
+ "span.htmlsrc_href:!span",
+ "span.htmlsrc_entire:!span",
+ "span.htmlsrc_badseq:!span",
+ "span.htmlsrc_badtag:!span",
+ "span.htmlsrc_badattr:!span",
+ "span.htmlsrc_sgmlspecial:!span"
+#else
+ "b:!b", /* comment */
+ "b:!b", /* tag */
+ "b:!b", /* attrib */
+ ":", /* attrval */
+ "b:!b", /* abracket */
+ "b:!b", /* entity */
+ ":", /* href */
+ ":", /* entire */
+ "b:!b", /* badseq */
+ ":", /* badtag */
+ ":", /* badattr */
+ "b:!b" /* sgmlspec */
+#endif
+};
+
+char *HTL_tagspecs[HTL_num_lexemes];
+
+ /* these are pointers since tagspec can be empty (the pointer will be NULL
+ in that case) */
+HT_tagspec *lexeme_start[HTL_num_lexemes];
+HT_tagspec *lexeme_end[HTL_num_lexemes];
+
+int tagname_transform = 2;
+int attrname_transform = 2;
+
+static int html_src_tag_index(const char *tagname)
+{
+ HTTag *tag = SGMLFindTag(&HTML_dtd, tagname);
+
+ return (tag && tag != &HTTag_unrecognized) ? (int) (tag - HTML_dtd.tags) : -1;
+}
+
+typedef enum {
+ HTSRC_CK_normal,
+ HTSRC_CK_seen_excl,
+ HTSRC_CK_after_tagname,
+ HTSRC_CK_seen_dot
+} html_src_check_state;
+
+static void append_close_tag(const char *tagname,
+ HT_tagspec ** head,
+ HT_tagspec ** tail)
+{
+ int idx, nattr;
+ HTTag *tag;
+ HT_tagspec *subj;
+
+ idx = html_src_tag_index(tagname);
+ tag = HTML_dtd.tags + idx;
+ nattr = tag->number_of_attributes;
+
+ if (idx == -1) {
+ fprintf(stderr,
+ "internal error: previous check didn't find bad HTML tag %s", tagname);
+ exit_immediately(EXIT_FAILURE);
+ }
+
+ subj = typecalloc(HT_tagspec);
+ if (subj == 0)
+ outofmem(__FILE__, "append_close_tag");
+
+ subj->element = (HTMLElement) idx;
+
+ subj->present = typecallocn(BOOL, (unsigned) nattr);
+
+ if (subj->present == 0)
+ outofmem(__FILE__, "append_close_tag");
+
+ subj->value = typecallocn(char *, (unsigned) nattr);
+
+ if (subj->value == 0)
+ outofmem(__FILE__, "append_close_tag");
+
+ subj->start = FALSE;
+#ifdef USE_COLOR_STYLE
+ subj->class_name = NULL;
+#endif
+
+ if (!*head) {
+ *head = subj;
+ *tail = subj;
+ } else {
+ (*tail)->next = subj;
+ *tail = subj;
+ }
+}
+
+/* this will allocate node, initialize all members, and node
+ append to the list, possibly modifying head and modifying tail */
+static void append_open_tag(const char *tagname,
+ const char *classname GCC_UNUSED,
+ HT_tagspec ** head,
+ HT_tagspec ** tail)
+{
+ HT_tagspec *subj;
+
+#ifdef USE_COLOR_STYLE
+ int hcode;
+#endif
+
+ append_close_tag(tagname, head, tail); /* initialize common members */
+ subj = *tail;
+ subj->start = TRUE;
+
+#ifdef USE_COLOR_STYLE
+ if (non_empty(classname)) {
+ hcode = color_style_3(tagname, ".", classname);
+ StrAllocCopy(subj->class_name, classname);
+ } else {
+ hcode = color_style_1(tagname);
+ StrAllocCopy(subj->class_name, "");
+ }
+ subj->style = hcode;
+#endif
+}
+
+#define isLeadP(p) ((isalpha(UCH(*p)) || *p == '_'))
+#define isNextP(p) ((isalnum(UCH(*p)) || *p == '_'))
+
+#define FMT_AT " at column %d:\n\t%s\n"
+#define TXT_AT (int) (1 + p - ts), ts
+
+/* returns FALSE if incorrect */
+int html_src_parse_tagspec(char *ts,
+ HTlexeme lexeme,
+ int checkonly,
+ int isstart)
+{
+ BOOL stop = FALSE;
+ BOOL code = FALSE;
+ char *p = ts;
+ char *tagstart = 0;
+ char *tagend = 0;
+ char *classstart;
+ char *classend;
+ char save, save1;
+ char after_excl = FALSE;
+ html_src_check_state state = HTSRC_CK_normal;
+ HT_tagspec *head = NULL;
+ HT_tagspec *tail = NULL;
+ HT_tagspec **slot = (isstart ? lexeme_start : lexeme_end) + lexeme;
+
+ while (!stop) {
+ switch (state) {
+ case HTSRC_CK_normal:
+ case HTSRC_CK_seen_excl:
+ switch (*p) {
+ case '\0':
+ stop = TRUE;
+ code = TRUE;
+ break;
+ case ' ':
+ case '\t':
+ break;
+ case '!':
+ if (state == HTSRC_CK_seen_excl) {
+ CTRACE2(TRACE_CFG,
+ (tfp, "second '!'" FMT_AT,
+ TXT_AT));
+ stop = TRUE;
+ break;
+ }
+ state = HTSRC_CK_seen_excl;
+ after_excl = TRUE;
+ break;
+ default:
+ if (!isLeadP(p)) {
+ CTRACE2(TRACE_CFG,
+ (tfp, "no name starting" FMT_AT,
+ TXT_AT));
+ stop = TRUE;
+ break;
+ }
+ tagstart = p;
+ while (*p && isNextP(p))
+ ++p;
+ tagend = p--;
+ state = HTSRC_CK_after_tagname;
+ }
+ break;
+ case HTSRC_CK_after_tagname:
+ switch (*p) {
+ case '\0':
+ stop = TRUE;
+ code = TRUE;
+ /* FALLTHRU */
+ case ' ':
+ /* FALLTHRU */
+ case '\t':
+ save = *tagend;
+
+ *tagend = '\0';
+ classstart = 0;
+ if (checkonly) {
+ int idx = html_src_tag_index(tagstart);
+
+ CTRACE2(TRACE_CFG,
+ (tfp, "tag index(%s) = %d\n",
+ tagstart, idx));
+
+ *tagend = save;
+ if (idx == -1) {
+ stop = TRUE;
+ break;
+ }
+ } else {
+ if (after_excl)
+ append_close_tag(tagstart, &head, &tail);
+ else
+ append_open_tag(tagstart, NULL, &head, &tail);
+ }
+ state = HTSRC_CK_normal;
+ after_excl = FALSE;
+ break;
+ case '.':
+ if (after_excl) {
+ CTRACE2(TRACE_CFG,
+ (tfp, "dot after '!'" FMT_AT,
+ TXT_AT));
+ stop = TRUE;
+ break;
+ }
+ state = HTSRC_CK_seen_dot;
+ break;
+ default:
+ CTRACE2(TRACE_CFG,
+ (tfp, "unexpected char '%c' after tagname" FMT_AT,
+ *p, TXT_AT));
+ stop = TRUE;
+ break;
+ }
+ break;
+ case HTSRC_CK_seen_dot:
+ switch (*p) {
+ case ' ':
+ case '\t':
+ break;
+ case '\0':
+ CTRACE2(TRACE_CFG,
+ (tfp, "expected text after dot" FMT_AT,
+ TXT_AT));
+ stop = TRUE;
+ break;
+ default:
+ if (!isLeadP(p)) {
+ CTRACE2(TRACE_CFG,
+ (tfp, "no name starting" FMT_AT,
+ TXT_AT));
+ stop = TRUE;
+ break;
+ }
+ classstart = p;
+ while (*p && isNextP(p))
+ ++p;
+ classend = p--;
+ save = *classend;
+ *classend = '\0';
+ save1 = *tagend;
+ *tagend = '\0';
+ if (checkonly) {
+ int idx = html_src_tag_index(tagstart);
+
+ *tagend = save1;
+ *classend = save;
+ if (idx == -1)
+ return FALSE;
+ } else {
+ append_open_tag(tagstart, classstart, &head, &tail);
+ }
+ state = HTSRC_CK_normal;
+ after_excl = FALSE;
+ break;
+ } /* of switch(*p) */
+ break;
+ } /* of switch */
+ ++p;
+ }
+
+ if (code && !checkonly)
+ *slot = head;
+
+ return code;
+}
+
+/*this will clean the data associated with lexeme 'l' */
+void html_src_clean_item(HTlexeme l)
+{
+ int i;
+
+ if (HTL_tagspecs[l])
+ FREE(HTL_tagspecs[l]);
+ for (i = 0; i < 2; ++i) {
+ HT_tagspec *cur;
+ HT_tagspec **pts = (i ? lexeme_start : lexeme_end) + l;
+ HT_tagspec *ts = *pts;
+
+ *pts = NULL;
+ while (ts) {
+ FREE(ts->present);
+ FREE(ts->value);
+#ifdef USE_COLOR_STYLE
+ if (ts->start) {
+ FREE(ts->class_name);
+ }
+#endif
+ cur = ts;
+ ts = ts->next;
+ FREE(cur);
+ }
+ }
+}
+
+/*this will be registered with atexit*/
+void html_src_clean_data(void)
+{
+ int i;
+
+ for (i = 0; i < HTL_num_lexemes; ++i)
+ html_src_clean_item((HTlexeme) i);
+}
+
+void html_src_on_lynxcfg_reload(void)
+{
+ html_src_clean_data();
+ HTMLSRC_init_caches(TRUE);
+}
+
+static void failed_init(const char *tag, int lexeme)
+{
+ fprintf(stderr,
+ gettext("parse-error while caching %s tagspec of lexeme %d\n"),
+ tag, lexeme);
+ fprintf(stderr,
+ gettext("Use -trace -trace-mask=8 to see details in log.\n"));
+ exit_immediately(EXIT_FAILURE);
+}
+
+void HTMLSRC_init_caches(int dont_exit)
+{
+ int i;
+ char *p;
+ char buf[1000];
+ static char empty[] = "";
+
+ CTRACE2(TRACE_CFG, (tfp, "HTMLSRC_init_caches(%d tagspecs)\n", HTL_num_lexemes));
+ for (i = 0; i < HTL_num_lexemes; ++i) {
+ /*we assume that HT_tagspecs was NULLs at when program started */
+ LYStrNCpy(buf,
+ HTL_tagspecs[i]
+ ? HTL_tagspecs[i]
+ : HTL_tagspecs_defaults[i],
+ sizeof(buf) - 1);
+ StrAllocCopy(HTL_tagspecs[i], buf);
+
+ CTRACE2(TRACE_CFG, (tfp, "parsing lexeme %d: %s\n", i + 1, buf));
+
+ if ((p = StrChr(buf, ':')) != 0)
+ *p = '\0';
+ if (!html_src_parse_tagspec(buf,
+ (HTlexeme) i,
+ FALSE,
+ TRUE) && !dont_exit) {
+ failed_init("1st", i);
+ }
+ if (!html_src_parse_tagspec(p ? p + 1 : empty,
+ (HTlexeme) i,
+ FALSE,
+ FALSE) && !dont_exit) {
+ failed_init("2nd", i);
+ }
+ }
+}
+
+#endif /* ifdef USE_PRETTYSRC */
diff --git a/src/LYPrettySrc.h b/src/LYPrettySrc.h
new file mode 100644
index 0000000..aa59063
--- /dev/null
+++ b/src/LYPrettySrc.h
@@ -0,0 +1,92 @@
+/*
+ * $LynxId: LYPrettySrc.h,v 1.13 2020/01/21 21:38:33 tom Exp $
+ */
+#ifndef LYPrettySrc_H
+#define LYPrettySrc_H
+
+#ifdef USE_PRETTYSRC
+
+#include <HTMLDTD.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ extern BOOL psrc_convert_string;
+
+ /*whether HTML_put_string should convert string passed with
+ TRANSLATE_AND_UNESCAPE_TO_STD */
+ extern BOOL psrc_view;
+ extern BOOLEAN LYpsrc;
+
+/*
+ * This is used for tracking down whether the SGML engine was initialized
+ * ==TRUE if yes. It's value is meaningful if psrc_view = TRUE
+ */
+ extern BOOL sgml_in_psrc_was_initialized;
+
+ extern BOOL psrc_nested_call; /* this is used when distinguishing whether
+
+ the current call is nested or not in HTML.c HTML_{start,end}_element.
+ It ==FALSE if psrc_view==FALSE || sgml_in_psrc_was_initialized==TRUE */
+
+ extern BOOL psrc_first_tag; /* this is also used in HTML.c to trigger the
+
+ 1st tag to perform special.
+ */
+
+ extern BOOL mark_htext_as_source;
+
+/* here is a list of lexeme codes. */
+ typedef enum {
+ HTL_comm = 0,
+ HTL_tag,
+ HTL_attrib,
+ HTL_attrval,
+ HTL_abracket,
+ HTL_entity,
+ HTL_href,
+ HTL_entire,
+ HTL_badseq,
+ HTL_badtag,
+ HTL_badattr,
+ HTL_sgmlspecial,
+ HTL_num_lexemes
+ } HTlexeme;
+
+ typedef struct _HT_tagspec {
+ struct _HT_tagspec *next; /* 0 at the last */
+#ifdef USE_COLOR_STYLE
+ int style; /* precalculated value of the style */
+ char *class_name;
+#endif
+ /* these will be passed to HTML_start_element */
+ HTMLElement element;
+ BOOL *present;
+ char **value;
+
+ BOOL start; /* if true, then this starts element, otherwise - ends */
+ } HT_tagspec;
+
+ extern char *HTL_tagspecs[HTL_num_lexemes];
+ extern HT_tagspec *lexeme_start[HTL_num_lexemes];
+ extern HT_tagspec *lexeme_end[HTL_num_lexemes];
+
+ extern int html_src_parse_tagspec(char *ts, HTlexeme lexeme,
+ int checkonly, int isstart);
+ extern void HTMLSRC_init_caches(int dont_exit);
+ extern void html_src_clean_item(HTlexeme l);
+ extern void html_src_clean_data(void);
+ extern void html_src_on_lynxcfg_reload(void);
+
+/* these 2 vars tell what kind of transform should be applied to tag names
+ and attribute names. 0 - lowercase, 1 - as is, 2 uppercase. */
+ extern int tagname_transform;
+ extern int attrname_transform;
+
+ extern BOOLEAN psrcview_no_anchor_numbering;
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* ifdef USE_PRETTYSRC */
+#endif /* LYPrettySrc_H */
diff --git a/src/LYPrint.c b/src/LYPrint.c
new file mode 100644
index 0000000..58b81a6
--- /dev/null
+++ b/src/LYPrint.c
@@ -0,0 +1,1461 @@
+/*
+ * $LynxId: LYPrint.c,v 1.109 2021/07/29 20:38:35 tom Exp $
+ */
+#include <HTUtils.h>
+#include <HTAccess.h>
+#include <HTList.h>
+#include <HTAlert.h>
+#include <HTFile.h>
+#include <LYCurses.h>
+#include <GridText.h>
+#include <LYUtils.h>
+#include <LYPrint.h>
+#include <LYGlobalDefs.h>
+#include <LYSignal.h>
+#include <LYStrings.h>
+#include <LYClean.h>
+#include <LYGetFile.h>
+#include <LYHistory.h>
+#include <LYList.h>
+#include <LYCharSets.h> /* To get current charset for mail header. */
+
+#include <LYLeaks.h>
+
+#define CancelPrint(msg) HTInfoMsg(msg); goto done
+#define CannotPrint(msg) HTAlert(msg); goto done
+
+/*
+ * printfile prints out the current file minus the links and targets to a
+ * variety of places
+ */
+
+/* it parses an incoming link that looks like
+ *
+ * LYNXPRINT://LOCAL_FILE/lines=##
+ * LYNXPRINT://MAIL_FILE/lines=##
+ * LYNXPRINT://TO_SCREEN/lines=##
+ * LYNXPRINT://LPANSI/lines=##
+ * LYNXPRINT://PRINTER/lines=##/number=#
+ */
+
+#define TO_FILE 1
+#define TO_SCREEN 2
+/*
+ * "lpansi.c"
+ * Original author: Gary Day (gday@comp.uark.edu), 11/30/93
+ * Current version: 2.1 by Noel Hunter (noel@wfu.edu), 10/20/94
+ *
+ * Basic structure based on print -- format files for printing from
+ * _Practical_C_Programming by Steve Oualline, O'Reilly & Associates
+ *
+ * adapted from the README for lpansi.c v2.1, dated 10/20/1994:
+ * Print to ANSI printer on local terminal
+ * The VT100 standard defines printer on and off escape sequences,
+ * esc[5i is printer on, and esc[4i is printer off.
+ *
+ * incorporate the idea of "lpansi" directly into LYPrint.c - HN
+ */
+#define LPANSI 3
+#define MAIL 4
+#define PRINTER 5
+
+#if USE_VMS_MAILER
+static int remove_quotes(char *string);
+#endif /* USE_VMS_MAILER */
+
+static char *subject_translate8bit(char *source);
+
+#define LYNX_PRINT_TITLE 0
+#define LYNX_PRINT_URL 1
+#define LYNX_PRINT_DATE 2
+#define LYNX_PRINT_LASTMOD 3
+
+#define MAX_PUTENV 4
+
+static void set_environ(int name,
+ const char *value,
+ const char *no_value)
+{
+ static const char *names[MAX_PUTENV] =
+ {
+ "LYNX_PRINT_TITLE",
+ "LYNX_PRINT_URL",
+ "LYNX_PRINT_DATE",
+ "LYNX_PRINT_LASTMOD",
+ };
+ static char *pointers[MAX_PUTENV];
+ char *envbuffer = 0;
+
+#ifdef VMS
+#define SET_ENVIRON(name, value, no_value) set_environ(name, value, no_value)
+ char temp[80];
+
+ StrAllocCopy(envbuffer, value);
+ if (isEmpty(envbuffer))
+ StrAllocCopy(envbuffer, no_value);
+ Define_VMSLogical(strcpy(temp, names[name]), envbuffer);
+ FREE(envbuffer);
+#else
+#define SET_ENVIRON(name, value, no_value) set_environ(name, value, "")
+ /*
+ * Once we've given a string to 'putenv()', we must not free it until we
+ * give it a string to replace it.
+ */
+ StrAllocCopy(envbuffer, names[name]);
+ StrAllocCat(envbuffer, "=");
+ StrAllocCat(envbuffer, value ? value : no_value);
+ putenv(envbuffer);
+ FREE(pointers[name]);
+ pointers[name] = envbuffer;
+#endif
+}
+
+static char *suggested_filename(DocInfo *newdoc)
+{
+ char *sug_filename = 0;
+ int rootlen;
+
+ /*
+ * Load the suggested filename string. - FM
+ */
+ if (HText_getSugFname() != 0)
+ StrAllocCopy(sug_filename, HText_getSugFname()); /* must be freed */
+ else
+ StrAllocCopy(sug_filename, newdoc->address); /* must be freed */
+ /*
+ * Strip suffix for compressed-files, if present.
+ */
+ if (HTCompressFileType(sug_filename, ".", &rootlen) != cftNone)
+ sug_filename[rootlen] = '\0';
+
+ CTRACE((tfp, "suggest %s\n", sug_filename));
+ return sug_filename;
+}
+
+static void SetupFilename(bstring **filename,
+ const char *sug_filename)
+{
+ HTFormat format;
+ HTAtom *encoding;
+ char *cp;
+
+ BStrCopy0(*filename, sug_filename); /* add suggestion info */
+ /*
+ * FIXME: the history-recall still uses fixed-size buffers
+ */
+ if ((*filename)->len >= LY_MAXPATH) {
+ (*filename)->str[LY_MAXPATH - 1] = '\0';
+ } else {
+ BStrAlloc(*filename, LY_MAXPATH);
+ }
+ change_sug_filename((*filename)->str);
+ if (!(HTisDocumentSource())
+ && (cp = strrchr((*filename)->str, '.')) != NULL) {
+ format = HTFileFormat((*filename)->str, &encoding, NULL);
+ CTRACE((tfp, "... format %s\n", format->name));
+ if (!strcasecomp(format->name, STR_HTML) ||
+ !IsUnityEnc(encoding)) {
+ (*filename)->len = (int) (cp - (*filename)->str);
+ BStrCat0(*filename, TEXT_SUFFIX);
+ }
+ }
+ CTRACE((tfp, "... result %s\n", (*filename)->str));
+}
+
+#define FN_INIT 0
+#define FN_READ 1
+#define FN_DONE 2
+#define FN_QUIT 3
+
+#define PRINT_FLAG 0
+#define GENERIC_FLAG 1
+
+static int RecallFilename(bstring **filename,
+ BOOLEAN *first,
+ int *now,
+ int *total,
+ int flag)
+{
+ int ch;
+ char *cp;
+ RecallType recall;
+
+ /*
+ * Set up the sug_filenames recall buffer.
+ */
+ if (*now < 0) {
+ *total = (sug_filenames ? HTList_count(sug_filenames) : 0);
+ *now = *total;
+ }
+ recall = ((*total >= 1) ? RECALL_URL : NORECALL);
+
+ if ((ch = LYgetBString(filename, FALSE, 0, recall)) < 0 ||
+ isBEmpty(*filename) || ch == UPARROW_KEY || ch == DNARROW_KEY) {
+ if (recall && ch == UPARROW_KEY) {
+ if (*first) {
+ *first = FALSE;
+ /*
+ * Use the last Fname in the list. - FM
+ */
+ *now = 0;
+ } else {
+ /*
+ * Go back to the previous Fname in the list. - FM
+ */
+ *now += 1;
+ }
+ if (*now >= *total) {
+ /*
+ * Reset the *first flag, and use sug_file or a blank. -
+ * FM
+ */
+ *first = TRUE;
+ *now = *total;
+ _statusline(FILENAME_PROMPT);
+ return FN_INIT;
+ } else if ((cp = (char *) HTList_objectAt(sug_filenames,
+ *now)) != NULL) {
+ BStrCopy0(*filename, cp);
+ if (*total == 1) {
+ _statusline(EDIT_THE_PREV_FILENAME);
+ } else {
+ _statusline(EDIT_A_PREV_FILENAME);
+ }
+ return FN_READ;
+ }
+ } else if (recall && ch == DNARROW_KEY) {
+ if (*first) {
+ *first = FALSE;
+ /*
+ * Use the first Fname in the list. - FM
+ */
+ *now = *total - 1;
+ } else {
+ /*
+ * Advance to the next Fname in the list. - FM
+ */
+ *now -= 1;
+ }
+ if (*now < 0) {
+ /*
+ * Set the *first flag, and use sug_file or a blank. - FM
+ */
+ *first = TRUE;
+ *now = *total;
+ _statusline(FILENAME_PROMPT);
+ return FN_INIT;
+ } else if ((cp = (char *) HTList_objectAt(sug_filenames,
+ *now)) != NULL) {
+ BStrCopy0(*filename, cp);
+ if (*total == 1) {
+ _statusline(EDIT_THE_PREV_FILENAME);
+ } else {
+ _statusline(EDIT_A_PREV_FILENAME);
+ }
+ return FN_READ;
+ }
+ }
+
+ /*
+ * Operation cancelled.
+ */
+ if (flag == PRINT_FLAG)
+ HTInfoMsg(SAVE_REQUEST_CANCELLED);
+ else if (flag == GENERIC_FLAG)
+ return FN_QUIT;
+
+ return FN_QUIT;
+ }
+ return FN_DONE;
+}
+
+static BOOLEAN confirm_by_pages(const char *prompt,
+ int lines_in_file,
+ int lines_per_page)
+{
+ int pages = lines_in_file / (lines_per_page + 1);
+ int c;
+
+ /* count fractional pages ! */
+ if ((lines_in_file % (LYlines + 1)) > 0)
+ pages++;
+
+ if (pages > 4) {
+ char *msg = 0;
+
+ HTSprintf0(&msg, prompt, pages);
+ c = HTConfirmDefault(msg, YES);
+ FREE(msg);
+
+ if (c == YES) {
+ LYaddstr(" Ok...");
+ } else {
+ HTInfoMsg(PRINT_REQUEST_CANCELLED);
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+
+static void send_file_to_file(DocInfo *newdoc,
+ char *content_base,
+ char *sug_filename)
+{
+ BOOLEAN FirstRecall = TRUE;
+ BOOLEAN use_cte;
+ const char *disp_charset;
+ FILE *outfile_fp;
+ bstring *buffer = NULL;
+ bstring *filename = NULL;
+ int FnameNum = -1;
+ int FnameTotal;
+ int c = 0;
+
+ _statusline(FILENAME_PROMPT);
+
+ retry:
+ SetupFilename(&filename, sug_filename);
+ if (non_empty(lynx_save_space)) {
+ BStrCopy0(buffer, lynx_save_space);
+ BStrCat(buffer, filename);
+ BStrCopy(filename, buffer);
+ } else {
+ BStrCopy0(buffer, "");
+ }
+
+ check_recall:
+ switch (RecallFilename(&filename, &FirstRecall, &FnameNum,
+ &FnameTotal, PRINT_FLAG)) {
+ case FN_INIT:
+ goto retry;
+ case FN_READ:
+ goto check_recall;
+ case FN_QUIT:
+ goto done;
+ default:
+ break;
+ }
+
+ if (!LYValidateFilename(&buffer, &filename)) {
+ CancelPrint(SAVE_REQUEST_CANCELLED);
+ }
+
+ /*
+ * See if it already exists.
+ */
+ switch (c = LYValidateOutput(buffer->str)) {
+ case 'Y':
+ break;
+ case 'N':
+ _statusline(NEW_FILENAME_PROMPT);
+ FirstRecall = TRUE;
+ FnameNum = FnameTotal;
+ goto retry;
+ default:
+ goto done;
+ }
+
+ /*
+ * See if we can write to it.
+ */
+ CTRACE((tfp, "LYPrint: filename is %s, action is `%c'\n", buffer->str, c));
+
+#ifdef HAVE_POPEN
+ if (buffer->str[0] == '|') {
+ if (no_shell) {
+ HTUserMsg(SPAWNING_DISABLED);
+ FirstRecall = TRUE;
+ FnameNum = FnameTotal;
+ goto retry;
+ } else if ((outfile_fp = popen(buffer->str + 1, "w")) == NULL) {
+ CTRACE((tfp, "LYPrint: errno is %d\n", errno));
+ HTAlert(CANNOT_WRITE_TO_FILE);
+ _statusline(NEW_FILENAME_PROMPT);
+ FirstRecall = TRUE;
+ FnameNum = FnameTotal;
+ goto retry;
+ }
+ } else
+#endif
+ if ((outfile_fp = (TOUPPER(c) == 'A'
+ ? LYAppendToTxtFile(buffer->str)
+ : LYNewTxtFile(buffer->str))) == NULL) {
+ CTRACE((tfp, "LYPrint: errno is %d\n", errno));
+ HTAlert(CANNOT_WRITE_TO_FILE);
+ _statusline(NEW_FILENAME_PROMPT);
+ FirstRecall = TRUE;
+ FnameNum = FnameTotal;
+ goto retry;
+ }
+
+ if (LYPrependBaseToSource && HTisDocumentSource()) {
+ /*
+ * Added the document's base as a BASE tag to the top of the file. May
+ * create technically invalid HTML, but will help get any partial or
+ * relative URLs resolved properly if no BASE tag is present to replace
+ * it. - FM
+ *
+ * Add timestamp (last reload).
+ */
+
+ fprintf(outfile_fp,
+ "<!-- X-URL: %s -->\n", newdoc->address);
+ if (HText_getDate() != NULL) {
+ fprintf(outfile_fp,
+ "<!-- Date: %s -->\n", HText_getDate());
+ if (HText_getLastModified() != NULL
+ && strcmp(HText_getLastModified(), HText_getDate())
+ && strcmp(HText_getLastModified(),
+ "Thu, 01 Jan 1970 00:00:01 GMT")) {
+ fprintf(outfile_fp,
+ "<!-- Last-Modified: %s -->\n", HText_getLastModified());
+ }
+ }
+
+ fprintf(outfile_fp,
+ "<BASE HREF=\"%s\">\n", content_base);
+ }
+
+ if (LYPrependCharsetToSource && HTisDocumentSource()) {
+ /*
+ * Added the document's charset as a META CHARSET tag to the top of the
+ * file. May create technically invalid HTML, but will help to resolve
+ * properly the document converted via chartrans: printed document
+ * correspond to a display charset and we *should* override both
+ * assume_local_charset and original document's META CHARSET (if any).
+ *
+ * Currently, if several META CHARSETs are found Lynx uses the first
+ * only, and it is opposite to BASE where the original BASE in the
+ * <HEAD> overrides ones from the top.
+ *
+ * As in print-to-email we write charset only if the document has 8-bit
+ * characters, and we have no CJK or an unofficial "x-" charset.
+ */
+ use_cte = HTLoadedDocumentEightbit();
+ disp_charset = LYCharSet_UC[current_char_set].MIMEname;
+ if (!use_cte || LYHaveCJKCharacterSet ||
+ strncasecomp(disp_charset, "x-", 2) == 0) {
+ } else {
+ fprintf(outfile_fp,
+ "<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"" STR_HTML
+ "; charset=%s\">\n\n",
+ disp_charset);
+ }
+ }
+
+ print_wwwfile_to_fd(outfile_fp, FALSE, FALSE); /* FILE */
+ if (keypad_mode)
+ printlist(outfile_fp, FALSE);
+
+#ifdef HAVE_POPEN
+ if (LYIsPipeCommand(buffer->str))
+ pclose(outfile_fp);
+ else
+#endif
+ LYCloseOutput(outfile_fp);
+
+#ifdef VMS
+ if (0 == strncasecomp(buffer->str, "sys$disk:", 9)) {
+ if (0 == StrNCmp((buffer->str + 9), "[]", 2)) {
+ HTAddSugFilename(buffer->str + 11);
+ } else {
+ HTAddSugFilename(buffer->str + 9);
+ }
+ } else {
+ HTAddSugFilename(buffer->str);
+ }
+#else
+ HTAddSugFilename(buffer->str);
+#endif /* VMS */
+
+ done:
+ BStrFree(buffer);
+ BStrFree(filename);
+ return;
+}
+
+static void send_file_to_mail(DocInfo *newdoc,
+ char *content_base,
+ char *content_location)
+{
+ static BOOLEAN first_mail_preparsed = TRUE;
+
+#if USE_VMS_MAILER
+ BOOLEAN isPMDF = LYMailPMDF();
+ FILE *hfd;
+ char hdrfile[LY_MAXPATH];
+#endif
+ BOOL use_mime;
+
+#if !CAN_PIPE_TO_MAILER
+ char my_temp[LY_MAXPATH];
+#endif
+
+ BOOL use_cte;
+ BOOL use_type;
+ const char *disp_charset;
+ FILE *outfile_fp;
+ char *buffer = NULL;
+ char *subject = NULL;
+ bstring *user_response = NULL;
+
+ if (!LYSystemMail())
+ return;
+
+ if (LYPreparsedSource && first_mail_preparsed &&
+ HTisDocumentSource()) {
+ if (HTConfirmDefault(CONFIRM_MAIL_SOURCE_PREPARSED, NO) == YES) {
+ LYaddstr(" Ok...");
+ first_mail_preparsed = FALSE;
+ } else {
+ CancelPrint(MAIL_REQUEST_CANCELLED);
+ }
+ }
+
+ _statusline(MAIL_ADDRESS_PROMPT);
+ BStrCopy0(user_response, NonNull(personal_mail_address));
+ if (LYgetBString(&user_response, FALSE, 0, RECALL_MAIL) < 0 ||
+ isBEmpty(user_response)) {
+ CancelPrint(MAIL_REQUEST_CANCELLED);
+ }
+
+ /*
+ * Determine which mail headers should be sent. Use Content-Type and
+ * MIME-Version headers only if needed. We need them if we are mailing
+ * HTML source, or if we have 8-bit characters and will be sending
+ * Content-Transfer-Encoding to indicate this. We will append a charset
+ * parameter to the Content-Type if we do not have an "x-" charset, and we
+ * will include the Content-Transfer-Encoding only if we are appending the
+ * charset parameter, because indicating an 8-bit transfer without also
+ * indicating the charset can cause problems with many mailers. - FM & KW
+ */
+ disp_charset = LYCharSet_UC[current_char_set].MIMEname;
+ use_cte = HTLoadedDocumentEightbit();
+ if (!(use_cte && strncasecomp(disp_charset, "x-", 2))) {
+ disp_charset = NULL;
+#if USE_VMS_MAILER
+ use_cte = FALSE;
+#endif
+ }
+#if USE_VMS_MAILER
+ use_type = (BOOL) (disp_charset || HTisDocumentSource());
+#endif
+
+ /*
+ * Use newdoc->title as a subject instead of sug_filename: MORE readable
+ * and 8-bit letters shouldn't be a problem - LP
+ */
+ /* change_sug_filename(sug_filename); */
+ subject = subject_translate8bit(newdoc->title);
+
+ if (newdoc->isHEAD) {
+ /*
+ * Special case for mailing HEAD response: this is rather technical
+ * information, show URL.
+ */
+ FREE(subject);
+ StrAllocCopy(subject, "HEAD ");
+ StrAllocCat(subject, newdoc->address);
+ }
+#if USE_VMS_MAILER
+ if (StrChr(user_response->str, '@') &&
+ !StrChr(user_response->str, ':') &&
+ !StrChr(user_response->str, '%') &&
+ !StrChr(user_response->str, '"')) {
+ char *temp = 0;
+
+ HTSprintf0(&temp, mail_adrs, user_response->str);
+ BStrCopy0(user_response, temp);
+ FREE(temp);
+ }
+
+ outfile_fp = LYOpenTemp(my_temp,
+ (HTisDocumentSource())
+ ? HTML_SUFFIX
+ : TEXT_SUFFIX,
+ "w");
+ if (outfile_fp == NULL) {
+ CannotPrint(UNABLE_TO_OPEN_TEMPFILE);
+ }
+
+ if (isPMDF) {
+ if ((hfd = LYOpenTemp(hdrfile, TEXT_SUFFIX, "w")) == NULL) {
+ CannotPrint(UNABLE_TO_OPEN_TEMPFILE);
+ }
+ if (use_type) {
+ fprintf(hfd, "Mime-Version: 1.0\n");
+ if (use_cte) {
+ fprintf(hfd, "Content-Transfer-Encoding: 8bit\n");
+ }
+ }
+ if (HTisDocumentSource()) {
+ /*
+ * Add Content-Type, Content-Location, and Content-Base headers for
+ * HTML source. - FM
+ */
+ fprintf(hfd, "Content-Type: " STR_HTML);
+ if (disp_charset != NULL) {
+ fprintf(hfd, "; charset=%s\n", disp_charset);
+ } else {
+ fprintf(hfd, "\n");
+ }
+ fprintf(hfd, "Content-Base: %s\n", content_base);
+ fprintf(hfd, "Content-Location: %s\n", content_location);
+ } else {
+ /*
+ * Add Content-Type: text/plain if we have 8-bit characters and a
+ * valid charset for non-source documents. - FM
+ */
+ if (disp_charset != NULL) {
+ fprintf(hfd,
+ "Content-Type: " STR_PLAINTEXT "; charset=%s\n",
+ disp_charset);
+ }
+ }
+ /*
+ * X-URL header. - FM
+ */
+ fprintf(hfd, "X-URL: %s\n", newdoc->address);
+ /*
+ * For PMDF, put the subject in the header file and close it. - FM
+ */
+ fprintf(hfd, "Subject: %.70s\n\n", subject);
+ LYCloseTempFP(hfd);
+ }
+
+ /*
+ * Write the contents to a temp file.
+ */
+ if (LYPrependBaseToSource && HTisDocumentSource()) {
+ /*
+ * Added the document's base as a BASE tag to the top of the message
+ * body. May create technically invalid HTML, but will help get any
+ * partial or relative URLs resolved properly if no BASE tag is present
+ * to replace it. - FM
+ */
+ fprintf(outfile_fp,
+ "<!-- X-URL: %s -->\n<BASE HREF=\"%s\">\n\n",
+ newdoc->address, content_base);
+ } else if (!isPMDF) {
+ fprintf(outfile_fp, "X-URL: %s\n\n", newdoc->address);
+ }
+ print_wwwfile_to_fd(outfile_fp, TRUE, FALSE); /* MAIL */
+ if (keypad_mode)
+ printlist(outfile_fp, FALSE);
+ LYCloseTempFP(outfile_fp);
+
+ buffer = NULL;
+ if (isPMDF) {
+ /*
+ * Now set up the command. - FM
+ */
+ HTSprintf0(&buffer,
+ "%s %s %s,%s %s",
+ system_mail,
+ system_mail_flags,
+ hdrfile,
+ my_temp,
+ user_response->str);
+ } else {
+ /*
+ * For "generic" VMS MAIL, include the subject in the command. - FM
+ */
+ remove_quotes(subject);
+ HTSprintf0(&buffer,
+ "%s %s/subject=\"%.70s\" %s %s",
+ system_mail,
+ system_mail_flags,
+ subject,
+ my_temp,
+ user_response->str);
+ }
+
+ stop_curses();
+ SetOutputMode(O_TEXT);
+ printf(MAILING_FILE);
+ LYSystem(buffer);
+ LYSleepAlert();
+ start_curses();
+ SetOutputMode(O_BINARY);
+
+ if (isPMDF)
+ (void) LYRemoveTemp(hdrfile);
+ (void) LYRemoveTemp(my_temp);
+#else /* !VMS (Unix or DOS) */
+
+#if CAN_PIPE_TO_MAILER
+ outfile_fp = LYPipeToMailer();
+#else
+ outfile_fp = LYOpenTemp(my_temp, TEXT_SUFFIX, "w");
+#endif
+ if (outfile_fp == NULL) {
+ CannotPrint(MAIL_REQUEST_FAILED);
+ }
+
+ /*
+ * Determine which mail headers should be sent. Use Content-Type and
+ * MIME-Version headers only if needed. We need them if we are mailing
+ * HTML source, or if we have 8-bit characters and will be sending
+ * Content-Transfer-Encoding to indicate this.
+ *
+ * Send Content-Transfer-Encoding only if the document has 8-bit
+ * characters. Send a charset parameter only if the document has 8-bit
+ * characters and we seem to have a valid charset. - kw
+ */
+ use_cte = HTLoadedDocumentEightbit();
+ disp_charset = LYCharSet_UC[current_char_set].MIMEname;
+ /*
+ * Don't send a charset if we have a CJK character set selected, since it
+ * may not be appropriate for mail... Also don't use an unofficial "x-"
+ * charset. - kw
+ */
+ if (!use_cte || LYHaveCJKCharacterSet ||
+ strncasecomp(disp_charset, "x-", 2) == 0) {
+ disp_charset = NULL;
+ }
+#ifdef NOTDEFINED
+ /* Enable this if indicating an 8-bit transfer without also indicating the
+ * charset causes problems. - kw */
+ if (use_cte && !disp_charset)
+ use_cte = FALSE;
+#endif /* NOTDEFINED */
+ use_type = (BOOL) (disp_charset || HTisDocumentSource());
+ use_mime = (BOOL) (use_cte || use_type);
+
+ if (use_mime) {
+ fprintf(outfile_fp, "Mime-Version: 1.0\n");
+ if (use_cte) {
+ fprintf(outfile_fp, "Content-Transfer-Encoding: 8bit\n");
+ }
+ }
+
+ if (HTisDocumentSource()) {
+ /*
+ * Add Content-Type, Content-Location, and Content-Base headers for
+ * HTML source. - FM
+ */
+ fprintf(outfile_fp, "Content-Type: " STR_HTML);
+ if (disp_charset != NULL) {
+ fprintf(outfile_fp, "; charset=%s\n", disp_charset);
+ } else {
+ fprintf(outfile_fp, "\n");
+ }
+ } else {
+ /*
+ * Add Content-Type: text/plain if we have 8-bit characters and a
+ * valid charset for non-source documents. - KW
+ */
+ if (disp_charset != NULL) {
+ fprintf(outfile_fp,
+ "Content-Type: " STR_PLAINTEXT "; charset=%s\n",
+ disp_charset);
+ }
+ }
+ /*
+ * If we are using MIME headers, add content-base and content-location if
+ * we have them. This will always be the case if the document is source.
+ * - kw
+ */
+ if (use_mime) {
+ if (content_base)
+ fprintf(outfile_fp, "Content-Base: %s\n", content_base);
+ if (content_location)
+ fprintf(outfile_fp, "Content-Location: %s\n", content_location);
+ }
+
+ /*
+ * Add the To, Subject, and X-URL headers. - FM
+ */
+ fprintf(outfile_fp, "To: %s\nSubject: %s\n", user_response->str, subject);
+ fprintf(outfile_fp, "X-URL: %s\n\n", newdoc->address);
+
+ if (LYPrependBaseToSource && HTisDocumentSource()) {
+ /*
+ * Added the document's base as a BASE tag to the top of the message
+ * body. May create technically invalid HTML, but will help get any
+ * partial or relative URLs resolved properly if no BASE tag is present
+ * to replace it. - FM
+ */
+ fprintf(outfile_fp,
+ "<!-- X-URL: %s -->\n<BASE HREF=\"%s\">\n\n",
+ newdoc->address, content_base);
+ }
+ print_wwwfile_to_fd(outfile_fp, TRUE, FALSE); /* MAIL */
+ if (keypad_mode)
+ printlist(outfile_fp, FALSE);
+
+#if CAN_PIPE_TO_MAILER
+ pclose(outfile_fp);
+#else
+ LYCloseOutput(outfile_fp);
+ LYSendMailFile(user_response->str,
+ my_temp,
+ subject,
+ "",
+ "");
+ (void) LYRemoveTemp(my_temp); /* Delete the tmpfile. */
+#endif /* CAN_PIPE_TO_MAILER */
+#endif /* USE_VMS_MAILER */
+
+ done: /* send_file_to_mail() */
+ BStrFree(user_response);
+ FREE(buffer);
+ FREE(subject);
+ return;
+}
+
+static void send_file_to_printer(DocInfo *newdoc,
+ char *content_base,
+ char *sug_filename,
+ int printer_number)
+{
+ BOOLEAN FirstRecall = TRUE;
+ FILE *outfile_fp;
+ char *the_command = 0;
+ bstring *my_file = NULL;
+ char my_temp[LY_MAXPATH];
+ int FnameTotal, FnameNum = -1;
+ lynx_list_item_type *cur_printer;
+
+ outfile_fp = LYOpenTemp(my_temp,
+ (HTisDocumentSource())
+ ? HTML_SUFFIX
+ : TEXT_SUFFIX,
+ "w");
+ if (outfile_fp == NULL) {
+ CannotPrint(FILE_ALLOC_FAILED);
+ }
+
+ if (LYPrependBaseToSource && HTisDocumentSource()) {
+ /*
+ * Added the document's base as a BASE tag to the top of the file. May
+ * create technically invalid HTML, but will help get any partial or
+ * relative URLs resolved properly if no BASE tag is present to replace
+ * it. - FM
+ */
+ fprintf(outfile_fp,
+ "<!-- X-URL: %s -->\n<BASE HREF=\"%s\">\n\n",
+ newdoc->address, content_base);
+ }
+ print_wwwfile_to_fd(outfile_fp, FALSE, FALSE); /* PRINTER */
+ if (keypad_mode)
+ printlist(outfile_fp, FALSE);
+
+ LYCloseTempFP(outfile_fp);
+
+ /* find the right printer number */
+ {
+ int count = 0;
+
+ for (cur_printer = printers;
+ count < printer_number;
+ count++, cur_printer = cur_printer->next) ; /* null body */
+ }
+
+ /*
+ * Commands have the form "command %s [%s] [etc]" where %s is the filename
+ * and the second optional %s is the suggested filename.
+ */
+ if (cur_printer->command == NULL) {
+ CannotPrint(PRINTER_MISCONF_ERROR);
+ }
+
+ /*
+ * Check for two '%s' and ask for the second filename argument if there
+ * is.
+ */
+ BStrCopy0(my_file, "");
+ if (HTCountCommandArgs(cur_printer->command) >= 2) {
+ _statusline(FILENAME_PROMPT);
+ again:
+ SetupFilename(&my_file, sug_filename);
+ check_again:
+ switch (RecallFilename(&my_file, &FirstRecall, &FnameNum,
+ &FnameTotal, PRINT_FLAG)) {
+ case FN_INIT:
+ goto again;
+ case FN_READ:
+ goto check_again;
+ case FN_QUIT:
+ goto done;
+ default:
+ break;
+ }
+
+ if (no_dotfiles || !show_dotfiles) {
+ if (*LYPathLeaf(my_file->str) == '.') {
+ HTAlert(FILENAME_CANNOT_BE_DOT);
+ _statusline(NEW_FILENAME_PROMPT);
+ FirstRecall = TRUE;
+ FnameNum = FnameTotal;
+ goto again;
+ }
+ }
+ /*
+ * Cancel if the user entered "/dev/null" on Unix, or an "nl:" path
+ * on VMS. - FM
+ */
+ if (LYIsNullDevice(my_file->str)) {
+ CancelPrint(PRINT_REQUEST_CANCELLED);
+ }
+ HTAddSugFilename(my_file->str);
+ }
+#ifdef SH_EX /* 1999/01/04 (Mon) 09:37:03 */
+ HTAddParam(&the_command, cur_printer->command, 1, my_temp);
+ if (!isBEmpty(my_file)) {
+ HTAddParam(&the_command, cur_printer->command, 2, my_file->str);
+ HTEndParam(&the_command, cur_printer->command, 3);
+ } else {
+ HTEndParam(&the_command, cur_printer->command, 2);
+ }
+#else
+ HTAddParam(&the_command, cur_printer->command, 1, my_temp);
+ HTAddParam(&the_command, cur_printer->command, 2, my_file->str);
+ HTEndParam(&the_command, cur_printer->command, 2);
+#endif
+
+ /*
+ * Move the cursor to the top of the screen so that output from system'd
+ * commands don't scroll up the screen.
+ */
+ LYmove(1, 1);
+
+ stop_curses();
+ CTRACE((tfp, "command: %s\n", the_command));
+ SetOutputMode(O_TEXT);
+ printf(PRINTING_FILE);
+ /*
+ * Set various bits of document information as environment variables, for
+ * use by external print scripts/etc. On UNIX, We assume there are values,
+ * and leave NULL value checking up to the external PRINTER: cmd/script -
+ * KED
+ */
+ SET_ENVIRON(LYNX_PRINT_TITLE, HText_getTitle(), "No Title");
+ SET_ENVIRON(LYNX_PRINT_URL, newdoc->address, "No URL");
+ SET_ENVIRON(LYNX_PRINT_DATE, HText_getDate(), "No Date");
+ SET_ENVIRON(LYNX_PRINT_LASTMOD, HText_getLastModified(), "No LastMod");
+
+ LYSystem(the_command);
+ FREE(the_command);
+ (void) LYRemoveTemp(my_temp);
+
+ /*
+ * Remove the various LYNX_PRINT_xxxx logicals. - KED
+ * [could use unsetenv(), but it's not portable]
+ */
+ SET_ENVIRON(LYNX_PRINT_TITLE, "", "");
+ SET_ENVIRON(LYNX_PRINT_URL, "", "");
+ SET_ENVIRON(LYNX_PRINT_DATE, "", "");
+ SET_ENVIRON(LYNX_PRINT_LASTMOD, "", "");
+
+ fflush(stdout);
+#ifndef VMS
+ signal(SIGINT, cleanup_sig);
+#endif /* !VMS */
+#ifdef SH_EX
+ fprintf(stdout, gettext(" Print job complete.\n"));
+ fflush(stdout);
+#endif
+ SetOutputMode(O_BINARY);
+ LYSleepMsg();
+ start_curses();
+
+ done: /* send_file_to_printer() */
+ BStrFree(my_file);
+ return;
+}
+
+static void send_file_to_screen(DocInfo *newdoc,
+ char *content_base,
+ int Lpansi)
+{
+ FILE *outfile_fp;
+ bstring *prompt = NULL;
+
+ if (Lpansi) {
+ _statusline(CHECK_PRINTER);
+ } else {
+ _statusline(PRESS_RETURN_TO_BEGIN);
+ }
+
+ BStrCopy0(prompt, "");
+ if (LYgetBString(&prompt, FALSE, 0, NORECALL) < 0) {
+ CancelPrint(PRINT_REQUEST_CANCELLED);
+ } else {
+ outfile_fp = stdout;
+
+ stop_curses();
+ SetOutputMode(O_TEXT);
+
+#ifndef VMS
+ signal(SIGINT, SIG_IGN);
+#endif /* !VMS */
+
+ if (LYPrependBaseToSource && HTisDocumentSource()) {
+ /*
+ * Added the document's base as a BASE tag to the top of the file. May
+ * create technically invalid HTML, but will help get any partial or
+ * relative URLs resolved properly if no BASE tag is present to replace
+ * it. - FM
+ */
+ fprintf(outfile_fp,
+ "<!-- X-URL: %s -->\n<BASE HREF=\"%s\">\n\n",
+ newdoc->address, content_base);
+ }
+ if (Lpansi)
+ printf("\033[5i");
+ print_wwwfile_to_fd(outfile_fp, FALSE, FALSE); /* SCREEN */
+ if (keypad_mode)
+ printlist(outfile_fp, FALSE);
+
+#ifdef VMS
+ if (HadVMSInterrupt) {
+ HadVMSInterrupt = FALSE;
+ start_curses();
+ CancelPrint(PRINT_REQUEST_CANCELLED);
+ }
+#endif /* VMS */
+ if (Lpansi) {
+ printf("\n\014"); /* Form feed */
+ printf("\033[4i");
+ fflush(stdout); /* refresh to screen */
+ } else {
+ fprintf(stdout, "\n\n%s", PRESS_RETURN_TO_FINISH);
+ fflush(stdout); /* refresh to screen */
+ (void) LYgetch(); /* grab some user input to pause */
+#ifdef VMS
+ HadVMSInterrupt = FALSE;
+#endif /* VMS */
+ }
+#ifdef SH_EX
+ fprintf(stdout, "\n");
+#endif
+ SetOutputMode(O_BINARY);
+ start_curses();
+ }
+
+ done: /* send_file_to_screen() */
+ BStrFree(prompt);
+ return;
+}
+
+int printfile(DocInfo *newdoc)
+{
+ BOOLEAN Lpansi = FALSE;
+ DocAddress WWWDoc;
+ char *content_base = NULL;
+ char *content_location = NULL;
+ char *cp = NULL;
+ char *link_info = NULL;
+ char *sug_filename = NULL;
+ int lines_in_file = 0;
+ int pagelen = 0;
+ int printer_number = 0;
+ int type = 0;
+
+ /*
+ * Extract useful info from URL.
+ */
+ StrAllocCopy(link_info, newdoc->address + 12);
+
+ /*
+ * Reload the file we want to print into memory.
+ */
+ LYpop(newdoc);
+ WWWDoc.address = newdoc->address;
+ WWWDoc.post_data = newdoc->post_data;
+ WWWDoc.post_content_type = newdoc->post_content_type;
+ WWWDoc.bookmark = newdoc->bookmark;
+ WWWDoc.isHEAD = newdoc->isHEAD;
+ WWWDoc.safe = newdoc->safe;
+ if (!HTLoadAbsolute(&WWWDoc))
+ return (NOT_FOUND);
+
+ /*
+ * If we have an explicit content-base, we may use it even if not in source
+ * mode. - kw
+ */
+ if (HText_getContentBase()) {
+ StrAllocCopy(content_base, HText_getContentBase());
+ LYRemoveBlanks(content_base);
+ if (isEmpty(content_base)) {
+ FREE(content_base);
+ }
+ }
+ /*
+ * If document is source, load the content_base and content_location
+ * strings. - FM
+ */
+ if (HTisDocumentSource()) {
+ if (HText_getContentLocation()) {
+ StrAllocCopy(content_location, HText_getContentLocation());
+ LYRemoveBlanks(content_location);
+ if (isEmpty(content_location)) {
+ FREE(content_location);
+ }
+ }
+ if (!content_base) {
+ if ((content_location) && is_url(content_location)) {
+ StrAllocCopy(content_base, content_location);
+ } else {
+ StrAllocCopy(content_base, newdoc->address);
+ }
+ }
+ if (!content_location) {
+ StrAllocCopy(content_location, newdoc->address);
+ }
+ }
+
+ sug_filename = suggested_filename(newdoc);
+
+ /*
+ * Get the number of lines in the file.
+ */
+ if ((cp = LYstrstr(link_info, "lines=")) != NULL) {
+ /*
+ * Terminate prev string here.
+ */
+ *cp = '\0';
+ /*
+ * Number of characters in "lines=".
+ */
+ cp += 6;
+
+ lines_in_file = atoi(cp);
+ }
+
+ /*
+ * Determine the type.
+ */
+ if (LYstrstr(link_info, "LOCAL_FILE")) {
+ type = TO_FILE;
+ } else if (LYstrstr(link_info, "TO_SCREEN")) {
+ type = TO_SCREEN;
+ } else if (LYstrstr(link_info, "LPANSI")) {
+ Lpansi = TRUE;
+ type = TO_SCREEN;
+ } else if (LYstrstr(link_info, "MAIL_FILE")) {
+ type = MAIL;
+ } else if (LYstrstr(link_info, "PRINTER")) {
+ type = PRINTER;
+
+ if ((cp = LYstrstr(link_info, "number=")) != NULL) {
+ /* number of characters in "number=" */
+ cp += 7;
+ printer_number = atoi(cp);
+ }
+ if ((cp = LYstrstr(link_info, "pagelen=")) != NULL) {
+ /* number of characters in "pagelen=" */
+ cp += 8;
+ pagelen = atoi(cp);
+ } else {
+ /* default to 66 lines */
+ pagelen = 66;
+ }
+ }
+
+ /*
+ * Act on the request. - FM
+ */
+ switch (type) {
+
+ case TO_FILE:
+ send_file_to_file(newdoc, content_base, sug_filename);
+ break;
+
+ case MAIL:
+ send_file_to_mail(newdoc, content_base, content_location);
+ break;
+
+ case TO_SCREEN:
+ if (confirm_by_pages(CONFIRM_LONG_SCREEN_PRINT, lines_in_file, LYlines))
+ send_file_to_screen(newdoc, content_base, Lpansi);
+ break;
+
+ case PRINTER:
+ if (confirm_by_pages(CONFIRM_LONG_PAGE_PRINT, lines_in_file, pagelen))
+ send_file_to_printer(newdoc, content_base, sug_filename, printer_number);
+ break;
+
+ } /* end switch */
+
+ FREE(link_info);
+ FREE(sug_filename);
+ FREE(content_base);
+ FREE(content_location);
+ return (NORMAL);
+}
+
+#if USE_VMS_MAILER
+static int remove_quotes(char *string)
+{
+ int i;
+
+ for (i = 0; string[i] != '\0'; i++)
+ if (string[i] == '"')
+ string[i] = ' ';
+ else if (string[i] == '&')
+ string[i] = ' ';
+ else if (string[i] == '|')
+ string[i] = ' ';
+
+ return (0);
+}
+#endif /* USE_VMS_MAILER */
+
+/*
+ * Mail subject may have 8-bit characters and they are in display charset.
+ * There is no stable practice for 8-bit subject encodings: MIME defines
+ * "quoted-printable" which holds charset info but most mailers still don't
+ * support it. On the other hand many mailers send open 8-bit subjects without
+ * charset info and use local assumption for certain countries. Besides that,
+ * obsolete SMTP software is not 8bit clean but still in use, it strips the
+ * characters in 128-160 range from subjects which may be a fault outside
+ * iso-8859-XX.
+ *
+ * We translate subject to "outgoing_mail_charset" (defined in lynx.cfg) it may
+ * correspond to US-ASCII as the safest value or any other lynx character
+ * handler, -1 for no translation (so display charset).
+ *
+ * Always returns a new allocated string which has to be freed.
+ */
+#include <LYCharUtils.h>
+static char *subject_translate8bit(char *source)
+{
+ char *target = NULL;
+
+ int charset_in, charset_out;
+
+ int i = outgoing_mail_charset; /* from lynx.cfg, -1 by default */
+
+ StrAllocCopy(target, source);
+ if (i < 0
+ || i == current_char_set
+ || LYCharSet_UC[current_char_set].enc == UCT_ENC_CJK
+ || LYCharSet_UC[i].enc == UCT_ENC_CJK) {
+ return (target); /* OK */
+ } else {
+ charset_out = i;
+ charset_in = current_char_set;
+ }
+
+ LYUCTranslateBackHeaderText(&target, charset_in, charset_out, YES);
+
+ return (target);
+}
+
+/*
+ * print_options writes out the current printer choices to a file
+ * so that the user can select printers in the same way that
+ * they select all other links
+ * printer links look like
+ *
+ * LYNXPRINT://LOCAL_FILE/lines=# print to a local file
+ * LYNXPRINT://TO_SCREEN/lines=# print to the screen
+ * LYNXPRINT://LPANSI/lines=# print to the local terminal
+ * LYNXPRINT://MAIL_FILE/lines=# mail the file
+ * LYNXPRINT://PRINTER/lines=#/number=# print to printer number #
+ */
+int print_options(char **newfile,
+ const char *printed_url,
+ int lines_in_file)
+{
+ static char my_temp[LY_MAXPATH] = "\0";
+ char *buffer = 0;
+ int count;
+ int pages;
+ FILE *fp0;
+ lynx_list_item_type *cur_printer;
+
+ if ((fp0 = InternalPageFP(my_temp, TRUE)) == 0)
+ return (-1);
+
+ LYLocalFileToURL(newfile, my_temp);
+
+ BeginInternalPage(fp0, PRINT_OPTIONS_TITLE, PRINT_OPTIONS_HELP);
+
+ fprintf(fp0, "<pre>\n");
+
+ /* pages = lines_in_file/66 + 1; */
+ pages = (lines_in_file + 65) / 66;
+ HTSprintf0(&buffer,
+ " <em>%s</em> %s\n <em>%s</em> %d\n <em>%s</em> %d %s %s\n",
+ gettext("Document:"), printed_url,
+ gettext("Number of lines:"), lines_in_file,
+ gettext("Number of pages:"), pages,
+ (pages > 1 ? gettext("pages") : gettext("page")),
+ gettext("(approximately)"));
+ fputs(buffer, fp0);
+ FREE(buffer);
+
+ if (no_print || no_disk_save || no_mail)
+ fprintf(fp0,
+ " <em>%s</em>\n",
+ gettext("Some print functions have been disabled!"));
+
+ fprintf(fp0, "\n%s\n",
+ (user_mode == NOVICE_MODE)
+ ? gettext("Standard print options:")
+ : gettext("Print options:"));
+
+ if (no_disk_save == FALSE && no_print == FALSE) {
+ fprintf(fp0,
+ " <a href=\"%s//LOCAL_FILE/lines=%d\">%s</a>\n",
+ STR_LYNXPRINT,
+ lines_in_file,
+ gettext("Save to a local file"));
+ } else {
+ fprintf(fp0, " <em>%s</em>\n", gettext("Save to disk disabled"));
+ }
+ if (no_mail == FALSE && local_host_only == FALSE)
+ fprintf(fp0,
+ " <a href=\"%s//MAIL_FILE/lines=%d\">%s</a>\n",
+ STR_LYNXPRINT,
+ lines_in_file,
+ gettext("Mail the file"));
+
+#if defined(UNIX) || defined(VMS)
+ fprintf(fp0,
+ " <a href=\"%s//TO_SCREEN/lines=%d\">%s</a>\n",
+ STR_LYNXPRINT,
+ lines_in_file,
+ gettext("Print to the screen"));
+ fprintf(fp0,
+ " <a href=\"%s//LPANSI/lines=%d\">%s</a>\n",
+ STR_LYNXPRINT,
+ lines_in_file,
+ gettext("Print out on a printer attached to your vt100 terminal"));
+#endif
+
+ if (user_mode == NOVICE_MODE)
+ fprintf(fp0, "\n%s\n", gettext("Local additions:"));
+
+ for (count = 0, cur_printer = printers; cur_printer != NULL;
+ cur_printer = cur_printer->next, count++)
+ if (no_print == FALSE || cur_printer->always_enabled) {
+ fprintf(fp0,
+ " <a href=\"%s//PRINTER/number=%d/pagelen=%d/lines=%d\">",
+ STR_LYNXPRINT,
+ count, cur_printer->pagelen, lines_in_file);
+ fprintf(fp0, "%s", (cur_printer->name ?
+ cur_printer->name : "No Name Given"));
+ fprintf(fp0, "</a>\n");
+ }
+ fprintf(fp0, "</pre>\n");
+ EndInternalPage(fp0);
+ LYCloseTempFP(fp0);
+
+ LYforce_no_cache = TRUE;
+ return (0);
+}
+
+/*
+ * General purpose filename getter.
+ *
+ * Returns a pointer to an absolute filename string, if the input filename
+ * exists, and is readable. Returns NULL if the input was cancelled (^G, or CR
+ * on empty input).
+ *
+ * The pointer to the filename string needs to be free()'d by the caller (when
+ * non-NULL).
+ *
+ * --KED 02/21/99
+ */
+char *GetFileName(void)
+{
+ struct stat stat_info;
+
+ bstring *fbuf = NULL;
+ bstring *tbuf = NULL;
+ char *result = NULL;
+
+ BOOLEAN FirstRecall = TRUE;
+ int FnameNum = -1;
+ int FnameTotal;
+
+ _statusline(FILENAME_PROMPT);
+
+ retry:
+ /*
+ * No initial filename.
+ */
+ SetupFilename(&fbuf, "");
+
+ check_recall:
+ /*
+ * Go get a filename (it would be nice to do TAB == filename-completion as
+ * the name is entered, but we'll save doing that for another time.
+ */
+ switch (RecallFilename(&fbuf, &FirstRecall, &FnameNum,
+ &FnameTotal, GENERIC_FLAG)) {
+ case FN_INIT:
+ goto retry;
+ case FN_READ:
+ goto check_recall;
+ case FN_QUIT:
+ goto cleanup;
+ default:
+ break;
+ }
+
+ /*
+ * Add raw input form to list ... we may want to reuse/edit it on a
+ * subsequent call, etc.
+ */
+#ifdef VMS
+ if (0 == strncasecomp(fbuf->str, "sys$disk:", 9)) {
+ if (0 == StrNCmp((fbuf->str + 9), "[]", 2)) {
+ HTAddSugFilename(fbuf->str + 11);
+ } else {
+ HTAddSugFilename(fbuf->str + 9);
+ }
+ } else {
+ HTAddSugFilename(fbuf->str);
+ }
+#else
+ HTAddSugFilename(fbuf->str);
+#endif /* VMS */
+
+ /*
+ * Expand tilde's, make filename absolute, etc.
+ */
+ BStrCopy0(tbuf, "");
+ if (!LYValidateFilename(&tbuf, &fbuf))
+ goto cleanup;
+
+ /*
+ * Check for file existence; readability.
+ */
+ if ((stat(tbuf->str, &stat_info) < 0) ||
+ (!(S_ISREG(stat_info.st_mode)
+#ifdef S_IFLNK
+ || S_ISLNK(stat_info.st_mode)
+#endif /* S_IFLNK */
+ ))) {
+ HTInfoMsg(FILE_DOES_NOT_EXIST);
+ _statusline(FILE_DOES_NOT_EXIST_RE);
+ FirstRecall = TRUE;
+ FnameNum = FnameTotal;
+ goto retry;
+ }
+
+ if (!LYCanReadFile(tbuf->str)) {
+ HTInfoMsg(FILE_NOT_READABLE);
+ _statusline(FILE_NOT_READABLE_RE);
+ FirstRecall = TRUE;
+ FnameNum = FnameTotal;
+ goto retry;
+ }
+
+ /*
+ * We have a valid filename, and readable file. Return it to the caller.
+ *
+ * The returned pointer should be free()'d by the caller.
+ */
+ StrAllocCopy(result, tbuf->str);
+
+ cleanup:
+ BStrFree(fbuf);
+ BStrFree(tbuf);
+ return (result);
+}
diff --git a/src/LYPrint.h b/src/LYPrint.h
new file mode 100644
index 0000000..645b874
--- /dev/null
+++ b/src/LYPrint.h
@@ -0,0 +1,20 @@
+#ifndef LYPRINT_H
+#define LYPRINT_H
+
+#ifndef LYSTRUCTS_H
+#include <LYStructs.h>
+#endif /* LYSTRUCTS_H */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ extern int printfile(DocInfo *newdoc);
+ extern int print_options(char **newfile,
+ const char *printed_url,
+ int lines_in_file);
+ extern char *GetFileName(void);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* LYPRINT_H */
diff --git a/src/LYReadCFG.c b/src/LYReadCFG.c
new file mode 100644
index 0000000..e4ab796
--- /dev/null
+++ b/src/LYReadCFG.c
@@ -0,0 +1,2682 @@
+/*
+ * $LynxId: LYReadCFG.c,v 1.200 2021/07/29 22:52:55 tom Exp $
+ */
+#ifndef NO_RULES
+#include <HTRules.h>
+#else
+#include <HTUtils.h>
+#endif
+#include <HTTP.h> /* 'reloading' flag */
+#include <HTFile.h>
+#include <HTInit.h>
+#include <UCMap.h>
+
+#include <LYUtils.h>
+#include <GridText.h>
+#include <LYStrings.h>
+#include <LYStructs.h>
+#include <LYGlobalDefs.h>
+#include <LYCharSets.h>
+#include <LYCharUtils.h>
+#include <LYKeymap.h>
+#include <LYJump.h>
+#include <LYGetFile.h>
+#include <LYCgi.h>
+#include <LYCurses.h>
+#include <LYBookmark.h>
+#include <LYCookie.h>
+#include <LYReadCFG.h>
+#include <HTAlert.h>
+#include <LYHistory.h>
+#include <LYPrettySrc.h>
+#include <LYrcFile.h>
+
+#ifdef DIRED_SUPPORT
+#include <LYLocal.h>
+#endif /* DIRED_SUPPORT */
+
+#include <LYexit.h>
+#include <LYLeaks.h>
+
+#ifndef DISABLE_NEWS
+#include <HTNews.h>
+#endif
+
+BOOLEAN have_read_cfg = FALSE;
+BOOLEAN LYUseNoviceLineTwo = TRUE;
+
+/*
+ * Translate a TRUE/FALSE field in a string buffer.
+ */
+static BOOL is_true(const char *string)
+{
+ if (!strcasecomp(string, "TRUE") || !strcasecomp(string, "ON"))
+ return (TRUE);
+ else
+ return (FALSE);
+}
+
+/*
+ * Find an unescaped colon in a string buffer.
+ */
+static const char *find_colon(const char *buffer)
+{
+ char ch;
+ const char *buf = buffer;
+
+ if (buf == NULL)
+ return NULL;
+
+ while ((ch = *buf) != 0) {
+ if (ch == ':')
+ return buf;
+ if (ch == '\\') {
+ buf++;
+ if (*buf == 0)
+ break;
+ }
+ buf++;
+ }
+ return NULL;
+}
+
+static void free_item_list_item(lynx_list_item_type **list,
+ lynx_list_item_type *ptr)
+{
+ lynx_list_item_type *prev;
+ lynx_list_item_type *cur;
+
+ for (cur = *list, prev = 0; cur != 0; prev = cur, cur = cur->next) {
+ if (cur == ptr) {
+
+ if (prev != 0)
+ prev->next = cur->next;
+ else
+ *list = cur->next;
+
+ FREE(cur->name);
+ FREE(cur->menu_name);
+ FREE(cur->command);
+ FREE(cur);
+ break;
+ }
+ }
+}
+
+static void free_item_list(lynx_list_item_type **ptr)
+{
+ while (*ptr != 0) {
+ free_item_list_item(ptr, *ptr);
+ }
+}
+
+/*
+ * Function for freeing the DOWNLOADER and UPLOADER menus list. - FM
+ */
+static void free_all_item_lists(void)
+{
+ free_item_list(&printers);
+ free_item_list(&downloaders);
+#ifdef DIRED_SUPPORT
+ free_item_list(&uploaders);
+#endif /* DIRED_SUPPORT */
+
+#ifdef USE_EXTERNALS
+ free_item_list(&externals);
+#endif /* USE_EXTERNALS */
+
+ return;
+}
+
+static const char *parse_list_bool(BOOL *target, const char *source)
+{
+ const char *result;
+
+ source = LYSkipCBlanks(source);
+ result = find_colon(source);
+
+ if (*source != '\0') {
+ char temp[20];
+ size_t len = ((result != 0)
+ ? (size_t) (result - source)
+ : strlen(source));
+
+ if (len > sizeof(temp))
+ len = (sizeof(temp) - 1);
+ LYStrNCpy(temp, source, len);
+ *target = is_true(temp);
+ CTRACE2(TRACE_CFG, (tfp, "parse_list_bool(%s) '%d'\n", source, *target));
+ }
+ return result;
+}
+
+static const char *parse_list_int(int *target, const char *source)
+{
+ const char *result;
+
+ source = LYSkipCBlanks(source);
+ result = find_colon(source);
+
+ if (*source != '\0') {
+ *target = atoi(source);
+ CTRACE2(TRACE_CFG, (tfp, "parse_list_int(%s) '%d'\n", source, *target));
+ }
+ return result;
+}
+
+static const char *parse_list_string(char **target, const char *source)
+{
+ const char *result;
+
+ source = LYSkipCBlanks(source);
+ result = find_colon(source);
+
+ if (*source != '\0') {
+ const char *next = ((result == 0)
+ ? (source + strlen(source))
+ : result);
+
+ *target = typecallocn(char, (size_t) (next - source + 1));
+
+ if (*target == NULL)
+ outofmem(__FILE__, "read_cfg");
+ LYStrNCpy(*target, source, (next - source));
+ remove_backslashes(*target);
+
+ CTRACE2(TRACE_CFG, (tfp, "parse_list_string(%s) '%s'\n", source, *target));
+ }
+ return result;
+}
+
+/*
+ * Process string buffer fields for DOWNLOADER or UPLOADER
+ * or PRINTERS or EXTERNALS menus
+ */
+static void add_item_to_list(char *buffer,
+ lynx_list_item_type **list_ptr,
+ int special,
+ int menu_name)
+{
+ const char *colon, *last_colon;
+ lynx_list_item_type *cur_item, *prev_item;
+
+ /*
+ * Check if the XWINDOWS or NON_XWINDOWS keyword is present in the last
+ * field, and act properly when found depending if external environment
+ * $DISPLAY variable is set.
+ */
+ if ((colon = find_colon(buffer)) == 0) {
+ return;
+ }
+ for (last_colon = colon;
+ (colon = find_colon(last_colon + 1)) != 0;
+ last_colon = colon) {
+ ;
+ }
+
+ /*
+ * If colon equals XWINDOWS then only continue
+ * if there is a $DISPLAY variable
+ */
+ if (!strcasecomp(last_colon + 1, "XWINDOWS")) {
+ if (LYgetXDisplay() == NULL)
+ return;
+ }
+ /*
+ * If colon equals NON_XWINDOWS then only continue
+ * if there is no $DISPLAY variable
+ */
+ else if (!strcasecomp(last_colon + 1, "NON_XWINDOWS")) {
+ if (LYgetXDisplay() != NULL)
+ return;
+ }
+
+ /*
+ * Make a linked list
+ */
+ if (*list_ptr == NULL) {
+ /*
+ * First item.
+ */
+ cur_item = typecalloc(lynx_list_item_type);
+
+ if (cur_item == NULL)
+ outofmem(__FILE__, "read_cfg");
+
+ *list_ptr = cur_item;
+#ifdef LY_FIND_LEAKS
+ atexit(free_all_item_lists);
+#endif
+ } else {
+ /*
+ * Find the last item.
+ */
+ for (prev_item = *list_ptr;
+ prev_item->next != NULL;
+ prev_item = prev_item->next) ; /* null body */
+ cur_item = typecalloc(lynx_list_item_type);
+
+ if (cur_item == NULL)
+ outofmem(__FILE__, "read_cfg");
+ else
+ prev_item->next = cur_item;
+ }
+ /* fill-in nonzero default values */
+ cur_item->pagelen = 66;
+
+ /*
+ * Find first unescaped colon and process fields
+ */
+ if (find_colon(buffer) != NULL) {
+ colon = parse_list_string(&(cur_item->name), buffer);
+
+ if (colon && menu_name) {
+ colon = parse_list_string(&(cur_item->menu_name), colon + 1);
+ }
+ if (colon) {
+ colon = parse_list_string(&(cur_item->command), colon + 1);
+ }
+ if (colon) {
+ colon = parse_list_bool(&(cur_item->always_enabled), colon + 1);
+ }
+ if (colon) {
+ if (special) {
+ (void) parse_list_int(&(cur_item->pagelen), colon + 1);
+ } else {
+ (void) parse_list_bool(&(cur_item->override_action), colon + 1);
+ }
+ }
+ }
+
+ /* ignore empty data */
+ if (cur_item->name == NULL
+ || cur_item->command == NULL) {
+ CTRACE2(TRACE_CFG, (tfp, "ignoring incomplete list_item '%s'\n", buffer));
+ free_item_list_item(list_ptr, cur_item);
+ } else if (cur_item->menu_name == NULL) {
+ StrAllocCopy(cur_item->menu_name, cur_item->command);
+ }
+}
+
+lynx_list_item_type *find_item_by_number(lynx_list_item_type *list_ptr,
+ char *number)
+{
+ int value = atoi(number);
+
+ while (value-- >= 0 && list_ptr != 0) {
+ list_ptr = list_ptr->next;
+ }
+ return list_ptr;
+}
+
+int match_item_by_name(lynx_list_item_type *ptr,
+ const char *name,
+ int only_overriders)
+{
+ return
+ (ptr->command != 0
+ && !strncasecomp(ptr->name, name, (int) strlen(ptr->name))
+ && (only_overriders ? ptr->override_action : 1));
+}
+
+#if defined(USE_COLOR_STYLE) || defined(USE_COLOR_TABLE)
+
+#ifndef COLOR_WHITE
+#define COLOR_WHITE 7
+#endif
+
+#ifndef COLOR_BLACK
+#define COLOR_BLACK 0
+#endif
+
+#ifdef USE_DEFAULT_COLORS
+int default_fg = DEFAULT_COLOR;
+int default_bg = DEFAULT_COLOR;
+
+#else
+int default_fg = COLOR_WHITE;
+int default_bg = COLOR_BLACK;
+#endif
+
+static const char *Color_Strings[16] =
+{
+ "black",
+ "red",
+ "green",
+ "brown",
+ "blue",
+ "magenta",
+ "cyan",
+ "lightgray",
+ "gray",
+ "brightred",
+ "brightgreen",
+ "yellow",
+ "brightblue",
+ "brightmagenta",
+ "brightcyan",
+ "white"
+};
+
+#if defined(PDCURSES) && !defined(XCURSES)
+/*
+ * PDCurses (and possibly some other implementations) use a non-ANSI set of
+ * codes for colors.
+ */
+static int ColorCode(int color)
+{
+ /* *INDENT-OFF* */
+ static int map[] =
+ {
+ 0, 4, 2, 6, 1, 5, 3, 7,
+ 8, 12, 10, 14, 9, 13, 11, 15
+ };
+ /* *INDENT-ON* */
+
+ return map[color];
+}
+#else
+#define ColorCode(color) (color)
+#endif
+
+BOOL default_color_reset = FALSE;
+
+/*
+ * Validator for COLOR fields.
+ */
+int check_color(const char *color,
+ int the_default)
+{
+ int i;
+
+ CTRACE2(TRACE_STYLE, (tfp, "check_color(%s,%d)\n", color, the_default));
+ if (!strcasecomp(color, "default")) {
+#ifdef USE_DEFAULT_COLORS
+ if (LYuse_default_colors && !default_color_reset)
+ the_default = DEFAULT_COLOR;
+#endif /* USE_DEFAULT_COLORS */
+ CTRACE2(TRACE_STYLE, (tfp, "=> default %d\n", the_default));
+ return the_default;
+ }
+ if (!strcasecomp(color, "nocolor"))
+ return NO_COLOR;
+
+ for (i = 0; i < 16; i++) {
+ if (!strcasecomp(color, Color_Strings[i])) {
+ int c = ColorCode(i);
+
+ CTRACE2(TRACE_STYLE, (tfp, "=> %d\n", c));
+ return c;
+ }
+ }
+ CTRACE2(TRACE_STYLE, (tfp, "=> ERR_COLOR\n"));
+ return ERR_COLOR;
+}
+
+const char *lookup_color(int code)
+{
+ unsigned n;
+
+ for (n = 0; n < 16; n++) {
+ if ((int) ColorCode(n) == code)
+ return Color_Strings[n];
+ }
+ return "default";
+}
+#endif /* USE_COLOR_STYLE || USE_COLOR_TABLE */
+
+#if defined(USE_COLOR_TABLE) || defined(EXP_ASSUMED_COLOR)
+
+/*
+ * Exit routine for failed COLOR parsing.
+ */
+static void exit_with_color_syntax(char *error_line)
+{
+ unsigned int i;
+
+ fprintf(stderr, gettext("\
+Syntax Error parsing COLOR in configuration file:\n\
+The line must be of the form:\n\
+COLOR:INTEGER:FOREGROUND:BACKGROUND\n\
+\n\
+Here FOREGROUND and BACKGROUND must be one of:\n\
+The special strings 'nocolor' or 'default', or\n")
+ );
+ for (i = 0; i < 16; i += 4) {
+ fprintf(stderr, "%16s %16s %16s %16s\n",
+ Color_Strings[i], Color_Strings[i + 1],
+ Color_Strings[i + 2], Color_Strings[i + 3]);
+ }
+ fprintf(stderr, "%s\nCOLOR:%s\n", gettext("Offending line:"), error_line);
+ exit_immediately(EXIT_FAILURE);
+}
+#endif /* defined(USE_COLOR_TABLE) || defined(EXP_ASSUMED_COLOR) */
+
+#if defined(USE_COLOR_TABLE)
+/*
+ * Process string buffer fields for COLOR setting.
+ */
+static void parse_color(char *buffer)
+{
+ int color;
+ const char *fg, *bg;
+ char *temp_fg = 0;
+
+ /*
+ * We are expecting a line of the form:
+ * INTEGER:FOREGROUND:BACKGROUND
+ */
+ color = atoi(buffer);
+ if (NULL == (fg = find_colon(buffer)))
+ exit_with_color_syntax(buffer);
+
+ if (NULL == (bg = find_colon(++fg)))
+ exit_with_color_syntax(buffer);
+
+ StrAllocCopy(temp_fg, fg);
+ temp_fg[bg++ - fg] = '\0';
+
+#if defined(USE_SLANG)
+ if ((check_color(temp_fg, default_fg) == ERR_COLOR) ||
+ (check_color(bg, default_bg) == ERR_COLOR))
+ exit_with_color_syntax(buffer);
+
+ SLtt_set_color(color, NULL, temp_fg, bg);
+#else
+ if (lynx_chg_color(color,
+ check_color(temp_fg, default_fg),
+ check_color(bg, default_bg)) < 0)
+ exit_with_color_syntax(buffer);
+#endif
+ FREE(temp_fg);
+}
+#endif /* USE_COLOR_TABLE */
+/* *INDENT-OFF* */
+#ifdef USE_SOURCE_CACHE
+static Config_Enum tbl_source_cache[] = {
+ { "FILE", SOURCE_CACHE_FILE },
+ { "MEMORY", SOURCE_CACHE_MEMORY },
+ { "NONE", SOURCE_CACHE_NONE },
+ { NULL, -1 },
+};
+
+static Config_Enum tbl_abort_source_cache[] = {
+ { "KEEP", SOURCE_CACHE_FOR_ABORTED_KEEP },
+ { "DROP", SOURCE_CACHE_FOR_ABORTED_DROP },
+ { NULL, -1 },
+};
+#endif
+/* *INDENT-ON* */
+
+#define PARSE_ADD(n,v) {n, CONF_ADD_ITEM, UNION_ADD(v), 0}
+#define PARSE_SET(n,v) {n, CONF_BOOL, UNION_SET(v), 0}
+#define PARSE_ENU(n,v,t) {n, CONF_ENUM, UNION_INT(v), t}
+#define PARSE_INT(n,v) {n, CONF_INT, UNION_INT(v), 0}
+#define PARSE_TIM(n,v) {n, CONF_TIME, UNION_INT(v), 0}
+#define PARSE_STR(n,v) {n, CONF_STR, UNION_STR(v), 0}
+#define PARSE_PRG(n,v) {n, CONF_PRG, UNION_DEF(v), 0}
+#define PARSE_Env(n,v) {n, CONF_ENV, UNION_ENV(v), 0}
+#define PARSE_ENV(n,v) {n, CONF_ENV2, UNION_ENV(v), 0}
+#define PARSE_FUN(n,v) {n, CONF_FUN, UNION_FUN(v), 0}
+#define PARSE_REQ(n,v) {n, CONF_INCLUDE, UNION_FUN(v), 0}
+#define PARSE_LST(n,v) {n, CONF_ADD_STRING, UNION_LST(v), 0}
+#define PARSE_DEF(n,v) {n, CONF_ADD_TRUSTED, UNION_DEF(v), 0}
+#define PARSE_NIL {NULL, CONF_NIL, UNION_DEF(0), 0}
+
+typedef enum {
+ CONF_NIL = 0
+ ,CONF_BOOL /* BOOLEAN type */
+ ,CONF_FUN
+ ,CONF_TIME
+ ,CONF_ENUM
+ ,CONF_INT
+ ,CONF_STR
+ ,CONF_PRG
+ ,CONF_ENV /* from environment variable */
+ ,CONF_ENV2 /* from environment VARIABLE */
+ ,CONF_INCLUDE /* include file-- handle special */
+ ,CONF_ADD_ITEM
+ ,CONF_ADD_STRING
+ ,CONF_ADD_TRUSTED
+} Conf_Types;
+
+typedef struct {
+ const char *name;
+ Conf_Types type;
+ ParseData;
+ Config_Enum *table;
+} Config_Type;
+
+static int assume_charset_fun(char *value)
+{
+ assumed_charset = TRUE;
+ UCLYhndl_for_unspec = safeUCGetLYhndl_byMIME(value);
+ StrAllocCopy(UCAssume_MIMEcharset,
+ LYCharSet_UC[UCLYhndl_for_unspec].MIMEname);
+ CTRACE((tfp, "assume_charset_fun %s ->%d ->%s\n",
+ NonNull(value),
+ UCLYhndl_for_unspec,
+ UCAssume_MIMEcharset));
+ return 0;
+}
+
+static int assume_local_charset_fun(char *value)
+{
+ UCLYhndl_HTFile_for_unspec = safeUCGetLYhndl_byMIME(value);
+ return 0;
+}
+
+static int assume_unrec_charset_fun(char *value)
+{
+ UCLYhndl_for_unrec = safeUCGetLYhndl_byMIME(value);
+ return 0;
+}
+
+static int character_set_fun(char *value)
+{
+ int i = UCGetLYhndl_byAnyName(value); /* by MIME or full name */
+
+ if (i < 0) {
+#ifdef CAN_AUTODETECT_DISPLAY_CHARSET
+ if (auto_display_charset >= 0
+ && (!strncasecomp(value, "AutoDetect ", 11)
+ || !strncasecomp(value, "AutoDetect-2 ", 13)))
+ current_char_set = auto_display_charset;
+#endif
+ /* do nothing here: so fallback to userdefs.h */
+ } else {
+ current_char_set = i;
+ }
+
+ return 0;
+}
+
+static int outgoing_mail_charset_fun(char *value)
+{
+ outgoing_mail_charset = UCGetLYhndl_byMIME(value);
+ /* -1 if NULL or not recognized value: no translation (compatibility) */
+
+ return 0;
+}
+
+#ifdef EXP_ASSUMED_COLOR
+/*
+ * Process string buffer fields for ASSUMED_COLOR setting.
+ */
+static int assumed_color_fun(char *buffer)
+{
+ const char *fg = buffer, *bg;
+ char *temp_fg = 0;
+
+ if (LYuse_default_colors) {
+
+ /*
+ * We are expecting a line of the form:
+ * FOREGROUND:BACKGROUND
+ */
+ if (NULL == (bg = find_colon(fg)))
+ exit_with_color_syntax(buffer);
+
+ StrAllocCopy(temp_fg, fg);
+ temp_fg[bg++ - fg] = '\0';
+
+ default_fg = check_color(temp_fg, default_fg);
+ default_bg = check_color(bg, default_bg);
+
+ if (default_fg == ERR_COLOR
+ || default_bg == ERR_COLOR)
+ exit_with_color_syntax(buffer);
+ FREE(temp_fg);
+ } else {
+ CTRACE((tfp, "...ignored since DEFAULT_COLORS:off\n"));
+ }
+ return 0;
+}
+#endif /* EXP_ASSUMED_COLOR */
+
+#ifdef USE_COLOR_TABLE
+static int color_fun(char *value)
+{
+ parse_color(value);
+ return 0;
+}
+#endif
+
+#ifdef USE_COLOR_STYLE
+static int lynx_lss_file_fun(char *value)
+{
+ CTRACE((tfp, "lynx_lss_file_fun '%s'\n", NonNull(value)));
+ if (isEmpty(value)) {
+ clear_lss_list();
+ } else {
+ add_to_lss_list(value, NULL);
+ }
+ return 0;
+}
+#endif
+
+#ifdef USE_DEFAULT_COLORS
+void update_default_colors(void)
+{
+ int old_fg = default_fg;
+ int old_bg = default_bg;
+
+ default_color_reset = !LYuse_default_colors;
+ if (LYuse_default_colors) {
+ default_color_reset = FALSE;
+ default_fg = DEFAULT_COLOR;
+ default_bg = DEFAULT_COLOR;
+ } else {
+ default_color_reset = TRUE;
+ default_fg = COLOR_WHITE;
+ default_bg = COLOR_BLACK;
+ }
+ if (old_fg != default_fg || old_bg != default_bg) {
+ lynx_setup_colors();
+#ifdef USE_COLOR_STYLE
+ update_color_style();
+#endif
+ }
+}
+
+static int default_colors_fun(char *value)
+{
+ LYuse_default_colors = is_true(value);
+ update_default_colors();
+ return 0;
+}
+#endif
+
+static int default_bookmark_file_fun(char *value)
+{
+ set_default_bookmark_page(value);
+ return 0;
+}
+
+static int default_cache_size_fun(char *value)
+{
+ HTCacheSize = atoi(value);
+ if (HTCacheSize < 2)
+ HTCacheSize = 2;
+ return 0;
+}
+
+static int default_editor_fun(char *value)
+{
+ if (!system_editor)
+ StrAllocCopy(editor, value);
+ return 0;
+}
+
+static int numbers_as_arrows_fun(char *value)
+{
+ if (is_true(value))
+ keypad_mode = NUMBERS_AS_ARROWS;
+ else
+ keypad_mode = LINKS_ARE_NUMBERED;
+
+ return 0;
+}
+
+#ifdef DIRED_SUPPORT
+static int dired_menu_fun(char *value)
+{
+ add_menu_item(value);
+ return 0;
+}
+#endif
+
+static int jumpfile_fun(char *value)
+{
+ char *buffer = NULL;
+
+ HTSprintf0(&buffer, "JUMPFILE:%s", value);
+ if (!LYJumpInit(buffer))
+ CTRACE((tfp, "Failed to register %s\n", buffer));
+ FREE(buffer);
+
+ return 0;
+}
+
+#ifdef EXP_KEYBOARD_LAYOUT
+static int keyboard_layout_fun(char *key)
+{
+ if (!LYSetKbLayout(key))
+ CTRACE((tfp, "Failed to set keyboard layout %s\n", key));
+ return 0;
+}
+#endif /* EXP_KEYBOARD_LAYOUT */
+
+static int keymap_fun(char *key)
+{
+ char *func, *efunc;
+
+ if ((func = StrChr(key, ':')) != NULL) {
+ *func++ = '\0';
+ efunc = StrChr(func, ':');
+ /* Allow comments on the ends of key remapping lines. - DT */
+ /* Allow third field for line-editor action. - kw */
+ if (efunc == func) { /* have 3rd field, but 2nd field empty */
+ func = NULL;
+ } else if (efunc && strncasecomp(efunc + 1, "DIRED", 5) == 0) {
+ if (!remap(key, strtok(func, " \t\n:#"), TRUE)) {
+ fprintf(stderr,
+ gettext("key remapping of %s to %s for %s failed\n"),
+ key, func, efunc + 1);
+ } else if (!strcmp("TOGGLE_HELP", func)) {
+ LYUseNoviceLineTwo = FALSE;
+ }
+ return 0;
+ } else if (!remap(key, strtok(func, " \t\n:#"), FALSE)) {
+ fprintf(stderr, gettext("key remapping of %s to %s failed\n"),
+ key, func);
+ } else {
+ if (!strcmp("TOGGLE_HELP", func))
+ LYUseNoviceLineTwo = FALSE;
+ }
+ if (efunc) {
+ efunc++;
+ if (efunc == strtok((func ? NULL : efunc), " \t\n:#") && *efunc) {
+ BOOLEAN success = FALSE;
+ int lkc = lkcstring_to_lkc(key);
+ int lec = -1;
+ int select_edi = 0;
+ char *sselect_edi = strtok(NULL, " \t\n:#");
+ char **endp = &sselect_edi;
+
+ if (sselect_edi) {
+ if (*sselect_edi)
+ select_edi = (int) strtol(sselect_edi, endp, 10);
+ if (**endp != '\0') {
+ fprintf(stderr,
+ gettext("invalid line-editor selection %s for key %s, selecting all\n"),
+ sselect_edi, key);
+ select_edi = 0;
+ }
+ }
+ /*
+ * PASS! tries to enter the key into the LYLineEditors
+ * bindings in a different way from PASS, namely as binding
+ * that maps to the specific lynx actioncode (rather than to
+ * LYE_FORM_PASS). That only works for lynx keycodes with
+ * modifier bit set, and we have no documented/official way to
+ * specify this in the KEYMAP directive, although it can be
+ * made to work e.g. by specifying a hex value that has the
+ * modifier bit set. But knowledge about the bit pattern of
+ * modifiers should remain in internal matter subject to
+ * change... At any rate, if PASS! fails try it the same way
+ * as for PASS. - kw
+ */
+ if (!success && strcasecomp(efunc, "PASS!") == 0) {
+ if (func) {
+ lec = LYE_FORM_LAC | lacname_to_lac(func);
+ success = (BOOL) LYRemapEditBinding(lkc, lec, select_edi);
+ }
+ if (!success)
+ fprintf(stderr,
+ gettext("setting of line-editor binding for key %s (0x%x) to 0x%x for %s failed\n"),
+ key,
+ (unsigned) lkc,
+ (unsigned) lec,
+ efunc);
+ else
+ return 0;
+ }
+ if (!success) {
+ lec = lecname_to_lec(efunc);
+ success = (BOOL) LYRemapEditBinding(lkc, lec, select_edi);
+ }
+ if (!success) {
+ if (lec != -1) {
+ fprintf(stderr,
+ gettext("setting of line-editor binding for key %s (0x%x) to 0x%x for %s failed\n"),
+ key,
+ (unsigned) lkc,
+ (unsigned) lec,
+ efunc);
+ } else {
+ fprintf(stderr,
+ gettext("setting of line-editor binding for key %s (0x%x) for %s failed\n"),
+ key,
+ (unsigned) lkc,
+ efunc);
+ }
+ }
+ }
+ }
+ }
+ return 0;
+}
+
+static int localhost_alias_fun(char *value)
+{
+ LYAddLocalhostAlias(value);
+ return 0;
+}
+
+#ifdef LYNXCGI_LINKS
+static int lynxcgi_environment_fun(char *value)
+{
+ add_lynxcgi_environment(value);
+ return 0;
+}
+#endif
+
+static int lynx_sig_file_fun(char *value)
+{
+ char temp[LY_MAXPATH];
+
+ LYStrNCpy(temp, value, sizeof(temp) - 1);
+ if (LYPathOffHomeOK(temp, sizeof(temp))) {
+ StrAllocCopy(LynxSigFile, temp);
+ LYAddPathToHome(temp, sizeof(temp), LynxSigFile);
+ StrAllocCopy(LynxSigFile, temp);
+ CTRACE((tfp, "LYNX_SIG_FILE set to '%s'\n", LynxSigFile));
+ } else {
+ CTRACE((tfp, "LYNX_SIG_FILE '%s' is bad. Ignoring.\n", LYNX_SIG_FILE));
+ }
+ return 0;
+}
+
+#ifndef DISABLE_NEWS
+static int news_chunk_size_fun(char *value)
+{
+ HTNewsChunkSize = atoi(value);
+ /*
+ * If the new HTNewsChunkSize exceeds the maximum,
+ * increase HTNewsMaxChunk to this size. - FM
+ */
+ if (HTNewsChunkSize > HTNewsMaxChunk)
+ HTNewsMaxChunk = HTNewsChunkSize;
+ return 0;
+}
+
+static int news_max_chunk_fun(char *value)
+{
+ HTNewsMaxChunk = atoi(value);
+ /*
+ * If HTNewsChunkSize exceeds the new maximum,
+ * reduce HTNewsChunkSize to this maximum. - FM
+ */
+ if (HTNewsChunkSize > HTNewsMaxChunk)
+ HTNewsChunkSize = HTNewsMaxChunk;
+ return 0;
+}
+
+static int news_posting_fun(char *value)
+{
+ LYNewsPosting = is_true(value);
+ no_newspost = (BOOL) (LYNewsPosting == FALSE);
+ return 0;
+}
+#endif /* DISABLE_NEWS */
+
+#ifndef NO_RULES
+static int cern_rulesfile_fun(char *value)
+{
+ char *rulesfile1 = NULL;
+ char *rulesfile2 = NULL;
+
+ if (HTLoadRules(value) >= 0) {
+ return 0;
+ }
+ StrAllocCopy(rulesfile1, value);
+ LYTrimLeading(value);
+ LYTrimTrailing(value);
+
+ StrAllocCopy(rulesfile2, value);
+ LYTildeExpand(&rulesfile2, FALSE);
+
+ if (strcmp(rulesfile1, rulesfile2) &&
+ HTLoadRules(rulesfile2) >= 0) {
+ FREE(rulesfile1);
+ FREE(rulesfile2);
+ return 0;
+ }
+ fprintf(stderr,
+ gettext("Lynx: cannot start, CERN rules file %s is not available\n"),
+ non_empty(rulesfile2) ? rulesfile2 : gettext("(no name)"));
+ exit_immediately(EXIT_FAILURE);
+ return 0; /* though redundant, for compiler-warnings */
+}
+#endif /* NO_RULES */
+
+static int referer_with_query_fun(char *value)
+{
+ if (!strncasecomp(value, "SEND", 4))
+ LYRefererWithQuery = 'S';
+ else if (!strncasecomp(value, "PARTIAL", 7))
+ LYRefererWithQuery = 'P';
+ else
+ LYRefererWithQuery = 'D';
+ return 0;
+}
+
+static int status_buffer_size_fun(char *value)
+{
+ status_buf_size = atoi(value);
+ if (status_buf_size < 2)
+ status_buf_size = 2;
+ return 0;
+}
+
+static int startfile_fun(char *value)
+{
+ StrAllocCopy(startfile, value);
+
+#ifdef USE_PROGRAM_DIR
+ if (is_url(startfile) == 0) {
+ char *tmp = NULL;
+
+ HTSprintf0(&tmp, "%s\\%s", program_dir, startfile);
+ FREE(startfile);
+ LYLocalFileToURL(&startfile, tmp);
+ FREE(tmp);
+ }
+#endif
+ return 0;
+}
+
+static int suffix_fun(char *value)
+{
+ char *mime_type, *p, *parsed;
+ const char *encoding = NULL;
+ char *sq = NULL;
+ char *description = NULL;
+ double q = 1.0;
+
+ if ((strlen(value) < 3)
+ || (NULL == (mime_type = StrChr(value, ':')))) {
+ CTRACE((tfp, "Invalid SUFFIX:%s ignored.\n", value));
+ return 0;
+ }
+
+ *mime_type++ = '\0';
+ if (*mime_type) {
+ if ((parsed = StrChr(mime_type, ':')) != NULL) {
+ *parsed++ = '\0';
+ if ((sq = StrChr(parsed, ':')) != NULL) {
+ *sq++ = '\0';
+ if ((description = StrChr(sq, ':')) != NULL) {
+ *description++ = '\0';
+ if ((p = StrChr(sq, ':')) != NULL)
+ *p = '\0';
+ LYTrimTail(description);
+ }
+ LYRemoveBlanks(sq);
+ if (!*sq)
+ sq = NULL;
+ }
+ LYRemoveBlanks(parsed);
+ LYLowerCase(parsed);
+ if (!*parsed)
+ parsed = NULL;
+ }
+ encoding = parsed;
+ }
+
+ LYRemoveBlanks(mime_type);
+ /*
+ * mime-type is not converted to lowercase on input, to make it possible to
+ * reproduce the equivalent of some of the HTInit.c defaults that use mixed
+ * case, although that is not recommended. - kw
+ */
+ if (!*mime_type) { /* that's ok now, with an encoding! */
+ CTRACE((tfp, "SUFFIX:%s without MIME type for %s\n", value,
+ encoding ? encoding : "what?"));
+ mime_type = NULL; /* that's ok now, with an encoding! */
+ if (!encoding)
+ return 0;
+ }
+
+ if (!encoding) {
+ if (strstr(mime_type, "tex") != NULL ||
+ strstr(mime_type, "postscript") != NULL ||
+ strstr(mime_type, "sh") != NULL ||
+ strstr(mime_type, "troff") != NULL ||
+ strstr(mime_type, "rtf") != NULL)
+ encoding = "8bit";
+ else
+ encoding = "binary";
+ }
+ if (!sq) {
+ q = 1.0;
+ } else {
+ double df = strtod(sq, &p);
+
+ if (p == sq && df <= 0.0) {
+ CTRACE((tfp, "Invalid q=%s for SUFFIX:%s, using -1.0\n",
+ sq, value));
+ q = -1.0;
+ } else {
+ q = df;
+ }
+ }
+ HTSetSuffix5(value, mime_type, encoding, description, q);
+
+ return 0;
+}
+
+static int suffix_order_fun(char *value)
+{
+ char *p = value;
+ char *optn;
+ BOOLEAN want_file_init_now = FALSE;
+
+ LYUseBuiltinSuffixes = TRUE;
+ while ((optn = HTNextTok(&p, ", ", "", NULL)) != NULL) {
+ if (!strcasecomp(optn, "NO_BUILTIN")) {
+ LYUseBuiltinSuffixes = FALSE;
+ } else if (!strcasecomp(optn, "PRECEDENCE_HERE")) {
+ want_file_init_now = TRUE;
+ } else if (!strcasecomp(optn, "PRECEDENCE_OTHER")) {
+ want_file_init_now = FALSE;
+ } else {
+ CTRACE((tfp, "Invalid SUFFIX_ORDER:%s\n", optn));
+ break;
+ }
+ }
+
+ if (want_file_init_now && !FileInitAlreadyDone) {
+ HTFileInit();
+ FileInitAlreadyDone = TRUE;
+ }
+ return 0;
+}
+
+static int system_editor_fun(char *value)
+{
+ StrAllocCopy(editor, value);
+ system_editor = TRUE;
+ return 0;
+}
+
+#define SetViewer(mime_type, viewer) \
+ HTSetPresentation(mime_type, viewer, 0, 1.0, 3.0, 0.0, 0L, mediaCFG)
+
+static int viewer_fun(char *value)
+{
+ char *mime_type;
+ char *viewer;
+ char *environment;
+
+ mime_type = value;
+
+ if ((strlen(value) < 3)
+ || (NULL == (viewer = StrChr(mime_type, ':'))))
+ return 0;
+
+ *viewer++ = '\0';
+
+ LYRemoveBlanks(mime_type);
+ LYLowerCase(mime_type);
+
+ environment = strrchr(viewer, ':');
+ if ((environment != NULL) &&
+ (strlen(viewer) > 1) && *(environment - 1) != '\\') {
+ *environment++ = '\0';
+ remove_backslashes(viewer);
+ /*
+ * If environment equals xwindows then only assign the presentation if
+ * there is a $DISPLAY variable.
+ */
+ if (!strcasecomp(environment, "XWINDOWS")) {
+ if (LYgetXDisplay() != NULL)
+ SetViewer(mime_type, viewer);
+ } else if (!strcasecomp(environment, "NON_XWINDOWS")) {
+ if (LYgetXDisplay() == NULL)
+ SetViewer(mime_type, viewer);
+ } else {
+ SetViewer(mime_type, viewer);
+ }
+ } else {
+ remove_backslashes(viewer);
+ SetViewer(mime_type, viewer);
+ }
+
+ return 0;
+}
+
+static int nonrest_sigwinch_fun(char *value)
+{
+ if (!strncasecomp(value, "XWINDOWS", 8)) {
+ LYNonRestartingSIGWINCH = (BOOL) (LYgetXDisplay() != NULL);
+ } else {
+ LYNonRestartingSIGWINCH = is_true(value);
+ }
+ return 0;
+}
+
+#ifdef USE_CHARSET_CHOICE
+static void matched_charset_choice(int display_charset,
+ int i)
+{
+ int j;
+
+ if (display_charset && !custom_display_charset) {
+ for (custom_display_charset = TRUE, j = 0; j < LYNumCharsets; ++j)
+ charset_subsets[j].hide_display = TRUE;
+ } else if (!display_charset && !custom_assumed_doc_charset) {
+ for (custom_assumed_doc_charset = TRUE, j = 0; j < LYNumCharsets; ++j)
+ charset_subsets[j].hide_assumed = TRUE;
+ }
+ if (display_charset)
+ charset_subsets[i].hide_display = FALSE;
+ else
+ charset_subsets[i].hide_assumed = FALSE;
+}
+
+static int parse_charset_choice(char *p,
+ int display_charset) /*if FALSE, then assumed doc charset */
+{
+ int len, i;
+ int matches = 0;
+
+ /*only one charset choice is allowed per line! */
+ LYTrimHead(p);
+ LYTrimTail(p);
+ CTRACE((tfp, "parsing charset choice for %s:\"%s\"",
+ (display_charset ? "display charset" : "assumed doc charset"), p));
+ len = (int) strlen(p);
+ if (!len) {
+ CTRACE((tfp, " - EMPTY STRING\n"));
+ return 1;
+ }
+ if (*p == '*' && len == 1) {
+ if (display_charset)
+ for (custom_display_charset = TRUE, i = 0; i < LYNumCharsets; ++i)
+ charset_subsets[i].hide_display = FALSE;
+ else
+ for (custom_assumed_doc_charset = TRUE, i = 0; i < LYNumCharsets; ++i)
+ charset_subsets[i].hide_assumed = FALSE;
+ CTRACE((tfp, " - all unhidden\n"));
+ return 0;
+ }
+ if (p[len - 1] == '*') {
+ --len;
+ for (i = 0; i < LYNumCharsets; ++i) {
+ if ((!strncasecomp(p, LYchar_set_names[i], len)) ||
+ (!strncasecomp(p, LYCharSet_UC[i].MIMEname, len))) {
+ ++matches;
+ matched_charset_choice(display_charset, i);
+ }
+ }
+ CTRACE((tfp, " - %d matches\n", matches));
+ return 0;
+ } else {
+ for (i = 0; i < LYNumCharsets; ++i) {
+ if ((!strcasecomp(p, LYchar_set_names[i])) ||
+ (!strcasecomp(p, LYCharSet_UC[i].MIMEname))) {
+ matched_charset_choice(display_charset, i);
+ ++matches;
+ CTRACE((tfp, " - OK, %d matches\n", matches));
+ return 0;
+ }
+ }
+ CTRACE((tfp, " - NOT recognised\n"));
+ return 1;
+ }
+}
+
+static int parse_display_charset_choice(char *p)
+{
+ return parse_charset_choice(p, 1);
+}
+
+static int parse_assumed_doc_charset_choice(char *p)
+{
+ return parse_charset_choice(p, 0);
+}
+
+#endif /* USE_CHARSET_CHOICE */
+
+#ifdef USE_EXTERNALS
+/*
+ * EXTERNAL and EXTERNAL_MENU share the same list. EXTERNAL_MENU allows
+ * setting a different name than the command string.
+ */
+static int external_fun(char *str)
+{
+ add_item_to_list(str, &externals, FALSE, TRUE);
+ return 0;
+}
+#endif
+
+#ifdef USE_PRETTYSRC
+static void html_src_bad_syntax(char *value,
+ char *option_name)
+{
+ char *buf = 0;
+
+ HTSprintf0(&buf, "HTMLSRC_%s", option_name);
+ LYUpperCase(buf);
+ fprintf(stderr, "Bad syntax in TAGSPEC %s:%s\n", buf, value);
+ exit_immediately(EXIT_FAILURE);
+}
+
+static int parse_html_src_spec(HTlexeme lexeme_code, char *value,
+ char *option_name)
+{
+ /* Now checking the value for being correct. Since HTML_dtd is not
+ * initialized completely (member tags points to non-initiailized data), we
+ * use tags_old. If the syntax is incorrect, then lynx will exit with error
+ * message.
+ */
+ char *ts2;
+
+ if (isEmpty(value))
+ return 0; /* silently ignoring */
+
+#define BS() html_src_bad_syntax(value,option_name)
+
+ ts2 = StrChr(value, ':');
+ if (!ts2)
+ BS();
+
+ *ts2 = '\0';
+
+ CTRACE2(TRACE_CFG, (tfp,
+ "LYReadCFG - parsing tagspec '%s:%s' for option '%s'\n",
+ value, ts2, option_name));
+ html_src_clean_item(lexeme_code);
+ if (!html_src_parse_tagspec(value, lexeme_code, TRUE, TRUE)
+ || !html_src_parse_tagspec(ts2, lexeme_code, TRUE, TRUE)) {
+ *ts2 = ':';
+ BS();
+ }
+
+ *ts2 = ':';
+ StrAllocCopy(HTL_tagspecs[lexeme_code], value);
+#undef BS
+ return 0;
+}
+
+static int psrcspec_fun(char *s)
+{
+ char *e;
+ /* *INDENT-OFF* */
+ static Config_Enum lexemnames[] =
+ {
+ { "comm", HTL_comm },
+ { "tag", HTL_tag },
+ { "attrib", HTL_attrib },
+ { "attrval", HTL_attrval },
+ { "abracket", HTL_abracket },
+ { "entity", HTL_entity },
+ { "href", HTL_href },
+ { "entire", HTL_entire },
+ { "badseq", HTL_badseq },
+ { "badtag", HTL_badtag },
+ { "badattr", HTL_badattr },
+ { "sgmlspecial", HTL_sgmlspecial },
+ { NULL, -1 }
+ };
+ /* *INDENT-ON* */
+
+ int found;
+
+ e = StrChr(s, ':');
+ if (!e) {
+ CTRACE((tfp,
+ "bad format of PRETTYSRC_SPEC setting value, ignored %s\n",
+ s));
+ return 0;
+ }
+ *e = '\0';
+ if (!LYgetEnum(lexemnames, s, &found)) {
+ CTRACE((tfp,
+ "bad format of PRETTYSRC_SPEC setting value, ignored %s:%s\n",
+ s, e + 1));
+ return 0;
+ }
+ parse_html_src_spec((HTlexeme) found, e + 1, s);
+ return 0;
+}
+
+static int read_htmlsrc_attrname_xform(char *str)
+{
+ int val;
+
+ if (1 == sscanf(str, "%d", &val)) {
+ if (val < 0 || val > 2) {
+ CTRACE((tfp,
+ "bad value for htmlsrc_attrname_xform (ignored - must be one of 0,1,2): %d\n",
+ val));
+ } else
+ attrname_transform = val;
+ } else {
+ CTRACE((tfp, "bad value for htmlsrc_attrname_xform (ignored): %s\n",
+ str));
+ }
+ return 0;
+}
+
+static int read_htmlsrc_tagname_xform(char *str)
+{
+ int val;
+
+ if (1 == sscanf(str, "%d", &val)) {
+ if (val < 0 || val > 2) {
+ CTRACE((tfp,
+ "bad value for htmlsrc_tagname_xform (ignored - must be one of 0,1,2): %d\n",
+ val));
+ } else
+ tagname_transform = val;
+ } else {
+ CTRACE((tfp, "bad value for htmlsrc_tagname_xform (ignored): %s\n",
+ str));
+ }
+ return 0;
+}
+#endif
+
+#ifdef USE_SESSIONS
+static int session_limit_fun(char *value)
+{
+ session_limit = (short) atoi(value);
+ if (session_limit < 1)
+ session_limit = 1;
+ else if (session_limit > MAX_SESSIONS)
+ session_limit = MAX_SESSIONS;
+ return 0;
+}
+#endif /* USE_SESSIONS */
+
+#if defined(PDCURSES) && defined(PDC_BUILD) && PDC_BUILD >= 2401
+static int screen_size_fun(char *value)
+{
+ char *cp;
+
+ if ((cp = StrChr(value, ',')) != 0) {
+ *cp++ = '\0'; /* Terminate ID */
+ scrsize_x = atoi(value);
+ scrsize_y = atoi(cp);
+ if ((scrsize_x <= 1) || (scrsize_y <= 1)) {
+ scrsize_x = scrsize_y = 0;
+ }
+ if ((scrsize_x > 0) && (scrsize_x < 80)) {
+ scrsize_x = 80;
+ }
+ if ((scrsize_y > 0) && (scrsize_y < 4)) {
+ scrsize_y = 4;
+ }
+ CTRACE((tfp, "scrsize: x=%d, y=%d\n", scrsize_x, scrsize_y));
+ }
+ return 0;
+}
+#endif
+
+#if defined(HAVE_LIBINTL_H) || defined(HAVE_LIBGETTEXT_H)
+static int message_language_fun(char *value)
+{
+ char *tmp = NULL;
+
+ HTSprintf0(&tmp, "LANG=%s", value);
+ putenv(tmp);
+
+ LYSetTextDomain();
+
+ return 0;
+}
+#endif
+
+/* This table is searched ignoring case */
+/* *INDENT-OFF* */
+static Config_Type Config_Table [] =
+{
+ PARSE_SET(RC_ACCEPT_ALL_COOKIES, LYAcceptAllCookies),
+ PARSE_TIM(RC_ALERTSECS, AlertSecs),
+#if USE_BLAT_MAILER
+ PARSE_SET(RC_ALT_BLAT_MAIL, mail_is_altblat),
+#endif
+ PARSE_SET(RC_ALWAYS_RESUBMIT_POSTS, LYresubmit_posts),
+#ifdef EXEC_LINKS
+ PARSE_DEF(RC_ALWAYS_TRUSTED_EXEC, ALWAYS_EXEC_PATH),
+#endif
+ PARSE_FUN(RC_ASSUME_CHARSET, assume_charset_fun),
+ PARSE_FUN(RC_ASSUME_LOCAL_CHARSET, assume_local_charset_fun),
+ PARSE_FUN(RC_ASSUME_UNREC_CHARSET, assume_unrec_charset_fun),
+#ifdef EXP_ASSUMED_COLOR
+ PARSE_FUN(RC_ASSUMED_COLOR, assumed_color_fun),
+#endif
+#ifdef USE_CHARSET_CHOICE
+ PARSE_FUN(RC_ASSUMED_DOC_CHARSET_CHOICE, parse_assumed_doc_charset_choice),
+#endif
+#ifdef DIRED_SUPPORT
+ PARSE_INT(RC_AUTO_UNCACHE_DIRLISTS, LYAutoUncacheDirLists),
+#endif
+#ifndef DISABLE_BIBP
+ PARSE_STR(RC_BIBP_BIBHOST, BibP_bibhost),
+ PARSE_STR(RC_BIBP_GLOBALSERVER, BibP_globalserver),
+#endif
+#if USE_BLAT_MAILER
+ PARSE_SET(RC_BLAT_MAIL, mail_is_blat),
+#endif
+ PARSE_SET(RC_BLOCK_MULTI_BOOKMARKS, LYMBMBlocked),
+ PARSE_SET(RC_BOLD_H1, bold_H1),
+ PARSE_SET(RC_BOLD_HEADERS, bold_headers),
+ PARSE_SET(RC_BOLD_NAME_ANCHORS, bold_name_anchors),
+#ifndef DISABLE_FTP
+ PARSE_LST(RC_BROKEN_FTP_EPSV, broken_ftp_epsv),
+ PARSE_LST(RC_BROKEN_FTP_RETR, broken_ftp_retr),
+#endif
+ PARSE_PRG(RC_BROTLI_PATH, ppBROTLI),
+ PARSE_PRG(RC_BZIP2_PATH, ppBZIP2),
+ PARSE_SET(RC_CASE_SENSITIVE_ALWAYS_ON, LYcase_sensitive),
+ PARSE_FUN(RC_CHARACTER_SET, character_set_fun),
+#ifdef CAN_SWITCH_DISPLAY_CHARSET
+ PARSE_STR(RC_CHARSET_SWITCH_RULES, charset_switch_rules),
+ PARSE_STR(RC_CHARSETS_DIRECTORY, charsets_directory),
+#endif
+ PARSE_SET(RC_CHECKMAIL, check_mail),
+ PARSE_PRG(RC_CHMOD_PATH, ppCHMOD),
+ PARSE_SET(RC_COLLAPSE_BR_TAGS, LYCollapseBRs),
+#ifdef USE_COLOR_TABLE
+ PARSE_FUN(RC_COLOR, color_fun),
+#endif
+#ifdef USE_COLOR_STYLE
+ PARSE_FUN(RC_COLOR_STYLE, lynx_lss_file_fun),
+#endif
+ PARSE_PRG(RC_COMPRESS_PATH, ppCOMPRESS),
+ PARSE_PRG(RC_COPY_PATH, ppCOPY),
+ PARSE_INT(RC_CONNECT_TIMEOUT, connect_timeout),
+ PARSE_SET(RC_CONV_JISX0201KANA, conv_jisx0201kana),
+ PARSE_STR(RC_COOKIE_ACCEPT_DOMAINS, LYCookieSAcceptDomains),
+#ifdef USE_PERSISTENT_COOKIES
+ PARSE_STR(RC_COOKIE_FILE, LYCookieFile),
+#endif /* USE_PERSISTENT_COOKIES */
+ PARSE_STR(RC_COOKIE_LOOSE_INVALID_DOMAINS, LYCookieSLooseCheckDomains),
+ PARSE_STR(RC_COOKIE_QUERY_INVALID_DOMAINS, LYCookieSQueryCheckDomains),
+ PARSE_STR(RC_COOKIE_REJECT_DOMAINS, LYCookieSRejectDomains),
+#ifdef USE_PERSISTENT_COOKIES
+ PARSE_STR(RC_COOKIE_SAVE_FILE, LYCookieSaveFile),
+#endif /* USE_PERSISTENT_COOKIES */
+ PARSE_STR(RC_COOKIE_STRICT_INVALID_DOMAIN, LYCookieSStrictCheckDomains),
+ PARSE_ENU(RC_COOKIE_VERSION, cookie_version, tbl_cookie_version),
+ PARSE_Env(RC_CSO_PROXY, 0),
+#ifdef VMS
+ PARSE_PRG(RC_CSWING_PATH, ppCSWING),
+#endif
+ PARSE_TIM(RC_DELAYSECS, DelaySecs),
+ PARSE_FUN(RC_DEFAULT_BOOKMARK_FILE, default_bookmark_file_fun),
+ PARSE_FUN(RC_DEFAULT_CACHE_SIZE, default_cache_size_fun),
+#ifdef USE_DEFAULT_COLORS
+ PARSE_FUN(RC_DEFAULT_COLORS, default_colors_fun),
+#endif
+ PARSE_FUN(RC_DEFAULT_EDITOR, default_editor_fun),
+ PARSE_STR(RC_DEFAULT_INDEX_FILE, indexfile),
+ PARSE_ENU(RC_DEFAULT_KEYPAD_MODE, keypad_mode, tbl_keypad_mode),
+ PARSE_FUN(RC_DEFAULT_KEYPAD_MODE_NUMARO, numbers_as_arrows_fun),
+ PARSE_ENU(RC_DEFAULT_USER_MODE, user_mode, tbl_user_mode),
+#if defined(VMS) && defined(VAXC) && !defined(__DECC)
+ PARSE_INT(RC_DEFAULT_VIRTUAL_MEMORY_SIZE, HTVirtualMemorySize),
+#endif
+#ifdef DIRED_SUPPORT
+ PARSE_FUN(RC_DIRED_MENU, dired_menu_fun),
+#endif
+#ifdef USE_CHARSET_CHOICE
+ PARSE_FUN(RC_DISPLAY_CHARSET_CHOICE, parse_display_charset_choice),
+#endif
+ PARSE_SET(RC_DONT_WRAP_PRE, dont_wrap_pre),
+ PARSE_ADD(RC_DOWNLOADER, downloaders),
+ PARSE_SET(RC_EMACS_KEYS_ALWAYS_ON, emacs_keys),
+ PARSE_FUN(RC_ENABLE_LYNXRC, enable_lynxrc),
+ PARSE_SET(RC_ENABLE_SCROLLBACK, enable_scrollback),
+#ifdef USE_EXTERNALS
+ PARSE_ADD(RC_EXTERNAL, externals),
+ PARSE_FUN(RC_EXTERNAL_MENU, external_fun),
+#endif
+ PARSE_Env(RC_FINGER_PROXY, 0),
+#if defined(_WINDOWS) /* 1998/10/05 (Mon) 17:34:15 */
+ PARSE_SET(RC_FOCUS_WINDOW, focus_window),
+#endif
+ PARSE_SET(RC_FORCE_8BIT_TOUPPER, UCForce8bitTOUPPER),
+ PARSE_ENU(RC_FORCE_COOKIE_PROMPT, cookie_noprompt, tbl_force_prompt),
+ PARSE_SET(RC_FORCE_EMPTY_HREFLESS_A, force_empty_hrefless_a),
+ PARSE_SET(RC_FORCE_HTML, LYforce_HTML_mode),
+ PARSE_SET(RC_FORCE_SSL_COOKIES_SECURE, LYForceSSLCookiesSecure),
+#ifdef USE_SSL
+ PARSE_ENU(RC_FORCE_SSL_PROMPT, ssl_noprompt, tbl_force_prompt),
+#endif
+#if !defined(NO_OPTION_FORMS) && !defined(NO_OPTION_MENU)
+ PARSE_SET(RC_FORMS_OPTIONS, LYUseFormsOptions),
+#endif
+ PARSE_STR(RC_FTP_FORMAT, ftp_format),
+#ifndef DISABLE_FTP
+ PARSE_SET(RC_FTP_PASSIVE, ftp_passive),
+#endif
+ PARSE_Env(RC_FTP_PROXY, 0),
+ PARSE_STR(RC_GLOBAL_EXTENSION_MAP, global_extension_map),
+ PARSE_STR(RC_GLOBAL_MAILCAP, global_type_map),
+ PARSE_Env(RC_GOPHER_PROXY, 0),
+ PARSE_SET(RC_GOTOBUFFER, goto_buffer),
+ PARSE_PRG(RC_GZIP_PATH, ppGZIP),
+ PARSE_SET(RC_GUESS_SCHEME, LYGuessScheme),
+ PARSE_STR(RC_HELPFILE, helpfile),
+ PARSE_FUN(RC_HIDDENLINKS, hiddenlinks_fun),
+#ifdef MARK_HIDDEN_LINKS
+ PARSE_STR(RC_HIDDEN_LINK_MARKER, hidden_link_marker),
+#endif
+ PARSE_SET(RC_HISTORICAL_COMMENTS, historical_comments),
+ PARSE_SET(RC_HTML5_CHARSETS, html5_charsets),
+#ifdef USE_PRETTYSRC
+ PARSE_FUN(RC_HTMLSRC_ATTRNAME_XFORM, read_htmlsrc_attrname_xform),
+ PARSE_FUN(RC_HTMLSRC_TAGNAME_XFORM, read_htmlsrc_tagname_xform),
+#endif
+ PARSE_FUN(RC_HTTP_PROTOCOL, get_http_protocol),
+ PARSE_Env(RC_HTTP_PROXY, 0),
+ PARSE_Env(RC_HTTPS_PROXY, 0),
+ PARSE_REQ(RC_INCLUDE, 0),
+ PARSE_PRG(RC_INFLATE_PATH, ppINFLATE),
+ PARSE_TIM(RC_INFOSECS, InfoSecs),
+ PARSE_PRG(RC_INSTALL_PATH, ppINSTALL),
+ PARSE_STR(RC_JUMP_PROMPT, jumpprompt),
+ PARSE_SET(RC_JUMPBUFFER, jump_buffer),
+ PARSE_FUN(RC_JUMPFILE, jumpfile_fun),
+#ifdef USE_JUSTIFY_ELTS
+ PARSE_SET(RC_JUSTIFY, ok_justify),
+ PARSE_INT(RC_JUSTIFY_MAX_VOID_PERCENT, justify_max_void_percent),
+#endif
+#ifdef EXP_KEYBOARD_LAYOUT
+ PARSE_FUN(RC_KEYBOARD_LAYOUT, keyboard_layout_fun),
+#endif
+ PARSE_FUN(RC_KEYMAP, keymap_fun),
+ PARSE_SET(RC_LEFTARROW_IN_TEXTFLD_PROMPT, textfield_prompt_at_left_edge),
+ PARSE_SET(RC_LISTONLY, dump_links_only),
+ PARSE_SET(RC_LIST_DECODED, dump_links_decoded),
+#ifndef VMS
+ PARSE_STR(RC_LIST_FORMAT, list_format),
+#endif
+ PARSE_SET(RC_LIST_INLINE, dump_links_inline),
+#ifndef DISABLE_NEWS
+ PARSE_SET(RC_LIST_NEWS_DATES, LYListNewsDates),
+ PARSE_SET(RC_LIST_NEWS_NUMBERS, LYListNewsNumbers),
+#endif
+#ifdef USE_LOCALE_CHARSET
+ PARSE_SET(RC_LOCALE_CHARSET, LYLocaleCharset),
+#endif
+ PARSE_STR(RC_LOCAL_DOMAIN, LYLocalDomain),
+ PARSE_SET(RC_LOCALHOST, local_host_only),
+ PARSE_FUN(RC_LOCALHOST_ALIAS, localhost_alias_fun),
+#if defined(EXEC_LINKS) || defined(EXEC_SCRIPTS)
+ PARSE_SET(RC_LOCAL_EXECUTION_LINKS_ALWAYS, local_exec),
+ PARSE_SET(RC_LOCAL_EXECUTION_LINKS_LOCAL, local_exec_on_local_files),
+#endif
+ PARSE_STR(RC_LYNX_HOST_NAME, LYHostName),
+ PARSE_FUN(RC_LYNX_SIG_FILE, lynx_sig_file_fun),
+#ifdef LYNXCGI_LINKS
+#ifndef VMS
+ PARSE_STR(RC_LYNXCGI_DOCUMENT_ROOT, LYCgiDocumentRoot),
+#endif
+ PARSE_FUN(RC_LYNXCGI_ENVIRONMENT, lynxcgi_environment_fun),
+#endif
+#if USE_VMS_MAILER
+ PARSE_STR(RC_MAIL_ADRS, mail_adrs),
+#endif
+ PARSE_SET(RC_MAIL_SYSTEM_ERROR_LOGGING, error_logging),
+ PARSE_SET(RC_MAKE_LINKS_FOR_ALL_IMAGES, clickable_images),
+ PARSE_SET(RC_MAKE_PSEUDO_ALTS_FOR_INLINES, pseudo_inline_alts),
+ PARSE_INT(RC_MAX_COOKIES_BUFFER, max_cookies_buffer),
+ PARSE_INT(RC_MAX_COOKIES_DOMAIN, max_cookies_domain),
+ PARSE_INT(RC_MAX_COOKIES_GLOBAL, max_cookies_global),
+ PARSE_INT(RC_MAX_URI_SIZE, max_uri_size),
+ PARSE_TIM(RC_MESSAGESECS, MessageSecs),
+#if defined(HAVE_LIBINTL_H) || defined(HAVE_LIBGETTEXT_H)
+ PARSE_FUN(RC_MESSAGE_LANGUAGE, message_language_fun),
+#endif
+ PARSE_SET(RC_MINIMAL_COMMENTS, minimal_comments),
+ PARSE_PRG(RC_MKDIR_PATH, ppMKDIR),
+ PARSE_ENU(RC_MULTI_BOOKMARK_SUPPORT, LYMultiBookmarks, tbl_multi_bookmarks),
+ PARSE_PRG(RC_MV_PATH, ppMV),
+ PARSE_SET(RC_NCR_IN_BOOKMARKS, UCSaveBookmarksInUnicode),
+#ifdef EXP_NESTED_TABLES
+ PARSE_SET(RC_NESTED_TABLES, nested_tables),
+#endif
+#ifndef DISABLE_NEWS
+ PARSE_FUN(RC_NEWS_CHUNK_SIZE, news_chunk_size_fun),
+ PARSE_FUN(RC_NEWS_MAX_CHUNK, news_max_chunk_fun),
+ PARSE_FUN(RC_NEWS_POSTING, news_posting_fun),
+ PARSE_Env(RC_NEWS_PROXY, 0),
+ PARSE_Env(RC_NEWSPOST_PROXY, 0),
+ PARSE_Env(RC_NEWSREPLY_PROXY, 0),
+ PARSE_Env(RC_NNTP_PROXY, 0),
+ PARSE_ENV(RC_NNTPSERVER, 0), /* actually NNTPSERVER */
+#endif
+ PARSE_SET(RC_NUMBER_FIELDS_ON_LEFT,number_fields_on_left),
+ PARSE_SET(RC_NUMBER_LINKS_ON_LEFT, number_links_on_left),
+ PARSE_SET(RC_NO_DOT_FILES, no_dotfiles),
+ PARSE_SET(RC_NO_FILE_REFERER, no_filereferer),
+#ifndef VMS
+ PARSE_SET(RC_NO_FORCED_CORE_DUMP, LYNoCore),
+#endif
+ PARSE_SET(RC_NO_FROM_HEADER, LYNoFromHeader),
+ PARSE_SET(RC_NO_ISMAP_IF_USEMAP, LYNoISMAPifUSEMAP),
+ PARSE_SET(RC_NO_MARGINS, no_margins),
+ PARSE_SET(RC_NO_PAUSE, no_pause),
+ PARSE_Env(RC_NO_PROXY, 0),
+ PARSE_SET(RC_NO_REFERER_HEADER, LYNoRefererHeader),
+ PARSE_SET(RC_NO_TABLE_CENTER, no_table_center),
+ PARSE_SET(RC_NO_TITLE, no_title),
+ PARSE_SET(RC_UPDATE_TERM_TITLE, update_term_title),
+ PARSE_FUN(RC_NONRESTARTING_SIGWINCH, nonrest_sigwinch_fun),
+ PARSE_FUN(RC_OUTGOING_MAIL_CHARSET, outgoing_mail_charset_fun),
+#ifdef DISP_PARTIAL
+ PARSE_SET(RC_PARTIAL, display_partial_flag),
+ PARSE_INT(RC_PARTIAL_THRES, partial_threshold),
+#endif
+#ifdef USE_PERSISTENT_COOKIES
+ PARSE_SET(RC_PERSISTENT_COOKIES, persistent_cookies),
+#endif /* USE_PERSISTENT_COOKIES */
+ PARSE_STR(RC_PERSONAL_EXTENSION_MAP, personal_extension_map),
+ PARSE_STR(RC_PERSONAL_MAILCAP, personal_type_map),
+ PARSE_LST(RC_POSITIONABLE_EDITOR, positionable_editor),
+ PARSE_STR(RC_PREFERRED_CHARSET, pref_charset),
+ PARSE_ENU(RC_PREFERRED_CONTENT_TYPE, LYContentType, tbl_preferred_content),
+ PARSE_ENU(RC_PREFERRED_ENCODING, LYAcceptEncoding, tbl_preferred_encoding),
+ PARSE_STR(RC_PREFERRED_LANGUAGE, language),
+ PARSE_ENU(RC_PREFERRED_MEDIA_TYPES, LYAcceptMedia, tbl_preferred_media),
+ PARSE_SET(RC_PREPEND_BASE_TO_SOURCE, LYPrependBaseToSource),
+ PARSE_SET(RC_PREPEND_CHARSET_TO_SOURCE, LYPrependCharsetToSource),
+#ifdef USE_PRETTYSRC
+ PARSE_SET(RC_PRETTYSRC, LYpsrc),
+ PARSE_FUN(RC_PRETTYSRC_SPEC, psrcspec_fun),
+ PARSE_SET(RC_PRETTYSRC_VIEW_NO_ANCHOR_NUM, psrcview_no_anchor_numbering),
+#endif
+ PARSE_ADD(RC_PRINTER, printers),
+ PARSE_SET(RC_QUIT_DEFAULT_YES, LYQuitDefaultYes),
+ PARSE_INT(RC_READ_TIMEOUT, reading_timeout),
+ PARSE_INT(RC_REDIRECTION_LIMIT, redirection_limit),
+ PARSE_FUN(RC_REFERER_WITH_QUERY, referer_with_query_fun),
+#ifdef USE_CMD_LOGGING
+ PARSE_TIM(RC_REPLAYSECS, ReplaySecs),
+#endif
+ PARSE_SET(RC_REUSE_TEMPFILES, LYReuseTempfiles),
+ PARSE_PRG(RC_RLOGIN_PATH, ppRLOGIN),
+ PARSE_PRG(RC_RMDIR_PATH, ppRMDIR),
+ PARSE_PRG(RC_RM_PATH, ppRM),
+#ifndef NO_RULES
+ PARSE_FUN(RC_RULE, HTSetConfiguration),
+ PARSE_FUN(RC_RULESFILE, cern_rulesfile_fun),
+#endif /* NO_RULES */
+ PARSE_STR(RC_SAVE_SPACE, lynx_save_space),
+ PARSE_SET(RC_SCAN_FOR_BURIED_NEWS_REFS, scan_for_buried_news_references),
+#if defined(PDCURSES) && defined(PDC_BUILD) && PDC_BUILD >= 2401
+ PARSE_FUN(RC_SCREEN_SIZE, screen_size_fun),
+#endif
+#ifdef USE_SCROLLBAR
+ PARSE_SET(RC_SCROLLBAR, LYShowScrollbar),
+ PARSE_SET(RC_SCROLLBAR_ARROW, LYsb_arrow),
+#endif
+ PARSE_SET(RC_SEEK_FRAG_AREA_IN_CUR, LYSeekFragAREAinCur),
+ PARSE_SET(RC_SEEK_FRAG_MAP_IN_CUR, LYSeekFragMAPinCur),
+#ifdef USE_SESSIONS
+ PARSE_SET(RC_AUTO_SESSION, LYAutoSession),
+ PARSE_STR(RC_SESSION_FILE, LYSessionFile),
+ PARSE_FUN(RC_SESSION_LIMIT, session_limit_fun),
+#endif
+ PARSE_SET(RC_SET_COOKIES, LYSetCookies),
+ PARSE_SET(RC_SHORT_URL, long_url_ok),
+ PARSE_SET(RC_SHOW_CURSOR, LYShowCursor),
+ PARSE_STR(RC_SHOW_KB_NAME, LYTransferName),
+ PARSE_ENU(RC_SHOW_KB_RATE, LYTransferRate, tbl_transfer_rate),
+ PARSE_Env(RC_SNEWS_PROXY, 0),
+ PARSE_Env(RC_SNEWSPOST_PROXY, 0),
+ PARSE_Env(RC_SNEWSREPLY_PROXY, 0),
+ PARSE_SET(RC_SOFT_DQUOTES, soft_dquotes),
+#ifdef USE_SOURCE_CACHE
+ PARSE_ENU(RC_SOURCE_CACHE, LYCacheSource, tbl_source_cache),
+ PARSE_ENU(RC_SOURCE_CACHE_FOR_ABORTED, LYCacheSourceForAborted, tbl_abort_source_cache),
+#endif
+ PARSE_STR(RC_SSL_CERT_FILE, SSL_cert_file),
+ PARSE_STR(RC_SSL_CLIENT_CERT_FILE, SSL_client_cert_file),
+ PARSE_STR(RC_SSL_CLIENT_KEY_FILE, SSL_client_key_file),
+ PARSE_FUN(RC_STARTFILE, startfile_fun),
+ PARSE_FUN(RC_STATUS_BUFFER_SIZE, status_buffer_size_fun),
+ PARSE_SET(RC_STRIP_DOTDOT_URLS, LYStripDotDotURLs),
+ PARSE_SET(RC_SUBSTITUTE_UNDERSCORES, use_underscore),
+ PARSE_FUN(RC_SUFFIX, suffix_fun),
+ PARSE_FUN(RC_SUFFIX_ORDER, suffix_order_fun),
+#ifdef SYSLOG_REQUESTED_URLS
+ PARSE_SET(RC_SYSLOG_REQUESTED_URLS, syslog_requested_urls),
+ PARSE_STR(RC_SYSLOG_TEXT, syslog_txt),
+#endif
+ PARSE_FUN(RC_SYSTEM_EDITOR, system_editor_fun),
+ PARSE_STR(RC_SYSTEM_MAIL, system_mail),
+ PARSE_STR(RC_SYSTEM_MAIL_FLAGS, system_mail_flags),
+ PARSE_FUN(RC_TAGSOUP, get_tagsoup),
+ PARSE_PRG(RC_TAR_PATH, ppTAR),
+ PARSE_PRG(RC_TELNET_PATH, ppTELNET),
+#ifdef TEXTFIELDS_MAY_NEED_ACTIVATION
+ PARSE_SET(RC_TEXTFIELDS_NEED_ACTIVATION, textfields_activation_option),
+#endif
+ PARSE_PRG(RC_TN3270_PATH, ppTN3270),
+#if defined(_WINDOWS)
+ PARSE_INT(RC_TIMEOUT, lynx_timeout),
+#endif
+ PARSE_PRG(RC_TOUCH_PATH, ppTOUCH),
+ PARSE_SET(RC_TRACK_INTERNAL_LINKS, track_internal_links),
+ PARSE_SET(RC_TRIM_BLANK_LINES, LYtrimBlankLines),
+ PARSE_SET(RC_TRIM_INPUT_FIELDS, LYtrimInputFields),
+#ifdef EXEC_LINKS
+ PARSE_DEF(RC_TRUSTED_EXEC, EXEC_PATH),
+#endif
+#ifdef LYNXCGI_LINKS
+ PARSE_DEF(RC_TRUSTED_LYNXCGI, CGI_PATH),
+#endif
+ PARSE_PRG(RC_UNCOMPRESS_PATH, ppUNCOMPRESS),
+ PARSE_SET(RC_UNDERLINE_LINKS, LYUnderlineLinks),
+ PARSE_SET(RC_UNIQUE_URLS, unique_urls),
+ PARSE_PRG(RC_UNZIP_PATH, ppUNZIP),
+#ifdef DIRED_SUPPORT
+ PARSE_ADD(RC_UPLOADER, uploaders),
+#endif
+ PARSE_STR(RC_URL_DOMAIN_PREFIXES, URLDomainPrefixes),
+ PARSE_STR(RC_URL_DOMAIN_SUFFIXES, URLDomainSuffixes),
+#ifdef VMS
+ PARSE_SET(RC_USE_FIXED_RECORDS, UseFixedRecords),
+#endif
+#if defined(USE_MOUSE)
+ PARSE_SET(RC_USE_MOUSE, LYUseMouse),
+#endif
+ PARSE_SET(RC_USE_SELECT_POPUPS, LYSelectPopups),
+ PARSE_PRG(RC_UUDECODE_PATH, ppUUDECODE),
+ PARSE_SET(RC_VERBOSE_IMAGES, verbose_img),
+ PARSE_SET(RC_VI_KEYS_ALWAYS_ON, vi_keys),
+ PARSE_FUN(RC_VIEWER, viewer_fun),
+ PARSE_Env(RC_WAIS_PROXY, 0),
+ PARSE_SET(RC_WAIT_VIEWER_TERMINATION, wait_viewer_termination),
+ PARSE_SET(RC_WITH_BACKSPACES, with_backspaces),
+ PARSE_STR(RC_XLOADIMAGE_COMMAND, XLoadImageCommand),
+ PARSE_SET(RC_XHTML_PARSING, LYxhtml_parsing),
+ PARSE_PRG(RC_ZCAT_PATH, ppZCAT),
+ PARSE_PRG(RC_ZIP_PATH, ppZIP),
+
+ PARSE_NIL
+};
+/* *INDENT-ON* */
+
+static char *lynxcfginfo_url = NULL; /* static */
+
+#if defined(HAVE_CONFIG_H) && !defined(NO_CONFIG_INFO)
+static char *configinfo_url = NULL; /* static */
+#endif
+
+/*
+ * Free memory allocated in 'read_cfg()'
+ */
+void free_lynx_cfg(void)
+{
+ Config_Type *tbl;
+
+ for (tbl = Config_Table; tbl->name != 0; tbl++) {
+ ParseUnionPtr q = ParseUnionOf(tbl);
+
+ switch (tbl->type) {
+ case CONF_ENV:
+ if (q->str_value != 0) {
+ char *name = *(q->str_value);
+ char *eqls = StrChr(name, '=');
+
+ if (eqls != 0) {
+ *eqls = 0;
+#ifdef VMS
+ Define_VMSLogical(name, NULL);
+#else
+# ifdef HAVE_PUTENV
+ if (putenv(name))
+ break;
+# else
+ unsetenv(name);
+# endif
+#endif
+ }
+ FREE(*(q->str_value));
+ FREE(q->str_value);
+ /* is it enough for reload_read_cfg() to clean up
+ * the result of putenv()? No for certain platforms.
+ */
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ free_all_item_lists();
+#ifdef DIRED_SUPPORT
+ reset_dired_menu(); /* frees and resets dired menu items - kw */
+#endif
+ FREE(lynxcfginfo_url);
+#if defined(HAVE_CONFIG_H) && !defined(NO_CONFIG_INFO)
+ FREE(configinfo_url);
+#endif
+}
+
+static Config_Type *lookup_config(const char *name)
+{
+ Config_Type *tbl = Config_Table;
+ char ch = (char) TOUPPER(*name);
+
+ while (tbl->name != 0) {
+ char ch1 = tbl->name[0];
+
+ if ((ch == TOUPPER(ch1))
+ && (0 == strcasecomp(name, tbl->name)))
+ break;
+
+ tbl++;
+ }
+ return tbl;
+}
+
+/*
+ * If the given value is an absolute path (by syntax), or we can read it, use
+ * the value as given. Otherwise, assume it must be in the same place we read
+ * the parent configuration file from.
+ *
+ * Note: only read files from the current directory if there's no parent
+ * filename, otherwise it leads to user surprise.
+ */
+static char *actual_filename(const char *cfg_filename,
+ const char *parent_filename,
+ const char *dft_filename)
+{
+ char *my_filename = NULL;
+
+ if (!LYisAbsPath(cfg_filename)
+ && !(parent_filename == 0 && LYCanReadFile(cfg_filename))) {
+ if (LYIsTilde(cfg_filename[0]) && LYIsPathSep(cfg_filename[1])) {
+ HTSprintf0(&my_filename, "%s%s", Home_Dir(), cfg_filename + 1);
+ } else {
+ if (parent_filename != 0) {
+ StrAllocCopy(my_filename, parent_filename);
+ *LYPathLeaf(my_filename) = '\0';
+ StrAllocCat(my_filename, cfg_filename);
+ }
+ if (my_filename == 0 || !LYCanReadFile(my_filename)) {
+ StrAllocCopy(my_filename, dft_filename);
+ *LYPathLeaf(my_filename) = '\0';
+ StrAllocCat(my_filename, cfg_filename);
+ if (!LYCanReadFile(my_filename)) {
+ StrAllocCopy(my_filename,
+ LYFindConfigFile(cfg_filename,
+ dft_filename));
+ }
+ }
+ }
+ } else {
+ StrAllocCopy(my_filename, cfg_filename);
+ }
+ return my_filename;
+}
+
+FILE *LYOpenCFG(const char *cfg_filename,
+ const char *parent_filename,
+ const char *dft_filename)
+{
+ char *my_file = actual_filename(cfg_filename, parent_filename, dft_filename);
+ FILE *result;
+
+ CTRACE((tfp, "opening config file %s\n", my_file));
+ result = fopen(my_file, TXT_R);
+ FREE(my_file);
+
+ return result;
+}
+
+#define NOPTS_ ( TABLESIZE(Config_Table) - 1 )
+typedef BOOL (optidx_set_t)[NOPTS_];
+
+ /* if element is FALSE, then it's allowed in the current file */
+
+#define optidx_set_AND(r,a,b) \
+ {\
+ unsigned i1;\
+ for (i1 = 0; i1 < NOPTS_; ++i1) \
+ (r)[i1]= (BOOLEAN) ((a)[i1] || (b)[i1]); \
+ }
+
+/*
+ * For simple (boolean, string, integer, time) values, set the corresponding
+ * configuration variable.
+ */
+BOOL LYSetConfigValue(const char *name,
+ const char *param)
+{
+ BOOL changed = TRUE;
+ char *value = NULL;
+ Config_Type *tbl = lookup_config(name);
+ ParseUnionPtr q = ParseUnionOf(tbl);
+ char *temp_name = 0;
+ char *temp_value = 0;
+
+ if (param == NULL)
+ param = "";
+ StrAllocCopy(value, param);
+ switch (tbl->type) {
+ case CONF_BOOL:
+ if (q->set_value != 0)
+ *(q->set_value) = is_true(value);
+ break;
+
+ case CONF_FUN:
+ if (q->fun_value != 0)
+ (*(q->fun_value)) (value);
+ break;
+
+ case CONF_TIME:
+ if (q->int_value != 0) {
+ float ival;
+
+ if (1 == LYscanFloat(value, &ival)) {
+ *(q->int_value) = (int) SECS2Secs(ival);
+ }
+ }
+ break;
+
+ case CONF_ENUM:
+ if (tbl->table != 0)
+ LYgetEnum(tbl->table, value, q->int_value);
+ break;
+
+ case CONF_INT:
+ if (q->int_value != 0) {
+ int ival;
+
+ if (1 == sscanf(value, "%d", &ival))
+ *(q->int_value) = ival;
+ }
+ break;
+
+ case CONF_STR:
+ if (q->str_value != 0)
+ StrAllocCopy(*(q->str_value), value);
+ break;
+
+ case CONF_ENV:
+ case CONF_ENV2:
+
+ if (StrAllocCopy(temp_name, name)) {
+ if (tbl->type == CONF_ENV)
+ LYLowerCase(temp_name);
+ else
+ LYUpperCase(temp_name);
+
+ if (LYGetEnv(temp_name) == 0) {
+#ifdef VMS
+ Define_VMSLogical(temp_name, value);
+#else
+ if (q->str_value == 0) {
+ q->str_value = typecalloc(char *);
+
+ if (q->str_value == 0)
+ outofmem(__FILE__, "LYSetConfigValue");
+ }
+
+ HTSprintf0(q->str_value, "%s=%s", temp_name, value);
+ putenv(*(q->str_value));
+#endif
+ }
+ FREE(temp_name);
+ }
+ break;
+ case CONF_ADD_ITEM:
+ if (q->add_value != 0)
+ add_item_to_list(value,
+ q->add_value,
+ (q->add_value == &printers),
+ FALSE);
+ break;
+
+ case CONF_ADD_STRING:
+ if (*(q->lst_value) == NULL) {
+ *(q->lst_value) = HTList_new();
+ }
+ temp_value = NULL;
+ StrAllocCopy(temp_value, value);
+ HTList_appendObject(*(q->lst_value), temp_value);
+ temp_value = NULL;
+ break;
+
+#if defined(EXEC_LINKS) || defined(LYNXCGI_LINKS)
+ case CONF_ADD_TRUSTED:
+ add_trusted(value, (int) q->def_value);
+ break;
+#endif
+
+ case CONF_PRG:
+ if (isEmpty(value)) {
+ HTSetProgramPath((ProgramPaths) (q->def_value), NULL);
+ } else if (StrAllocCopy(temp_value, value)) {
+ HTSetProgramPath((ProgramPaths) (q->def_value), temp_value);
+ }
+ break;
+
+ default:
+ changed = FALSE;
+ break;
+ }
+ FREE(value);
+
+ return changed;
+}
+
+/*
+ * Process the configuration file (lynx.cfg).
+ *
+ * 'allowed' is a pointer to HTList of allowed options. Since the included
+ * file can also include other files with a list of acceptable options, these
+ * lists are ANDed.
+ */
+static void do_read_cfg(const char *cfg_filename,
+ const char *parent_filename,
+ int nesting_level,
+ FILE *fp0,
+ optidx_set_t *allowed)
+{
+ FILE *fp;
+ char *buffer = 0;
+
+ CTRACE((tfp, "Loading cfg file '%s'.\n", cfg_filename));
+
+ /*
+ * Don't get hung up by an include file loop. Arbitrary max depth
+ * of 10. - BL
+ */
+ if (nesting_level > 10) {
+ fprintf(stderr,
+ gettext("More than %d nested lynx.cfg includes -- perhaps there is a loop?!?\n"),
+ nesting_level - 1);
+ fprintf(stderr, gettext("Last attempted include was '%s',\n"), cfg_filename);
+ fprintf(stderr, gettext("included from '%s'.\n"), parent_filename);
+ exit_immediately(EXIT_FAILURE);
+ }
+ /*
+ * Locate and open the file.
+ */
+ if (!cfg_filename || strlen(cfg_filename) == 0) {
+ CTRACE((tfp, "No filename following -cfg switch!\n"));
+ return;
+ }
+ if ((fp = LYOpenCFG(cfg_filename, parent_filename, LYNX_CFG_FILE)) == 0) {
+ CTRACE((tfp, "lynx.cfg file not found as '%s'\n", cfg_filename));
+ return;
+ }
+ have_read_cfg = TRUE;
+
+ /*
+ * Process each line in the file.
+ */
+ if (show_cfg) {
+ time_t t;
+
+ time(&t);
+ printf("### %s %s, at %s", LYNX_NAME, LYNX_VERSION, ctime(&t));
+ }
+ while (LYSafeGets(&buffer, fp) != 0) {
+ char *name, *value;
+ char *cp;
+ Config_Type *tbl;
+
+ /* Most lines in the config file are comment lines. Weed them out
+ * now. Also, leading whitespace is ok, so trim it.
+ */
+ name = LYSkipBlanks(buffer);
+
+ if (ispunct(UCH(*name)))
+ continue;
+
+ LYTrimTrailing(name);
+
+ if (*name == 0)
+ continue;
+
+ /* Significant lines are of the form KEYWORD:WHATEVER */
+ if ((value = StrChr(name, ':')) == 0) {
+ /* fprintf (stderr, "Bad line-- no :\n"); */
+ CTRACE((tfp, "LYReadCFG: missing ':' %s\n", name));
+ continue;
+ }
+
+ /* skip past colon, but replace ':' with 0 to make name meaningful */
+ *value++ = 0;
+
+ /*
+ * Trim off any trailing comments.
+ *
+ * (Apparently, the original code considers a trailing comment valid
+ * only if preceded by a space character but is not followed by a
+ * colon. -- JED)
+ */
+ if ((cp = strrchr(value, ':')) == 0)
+ cp = value;
+ if ((cp = StrChr(cp, '#')) != 0) {
+ cp--;
+ if (isspace(UCH(*cp)))
+ *cp = 0;
+ }
+
+ CTRACE2(TRACE_CFG, (tfp, "LYReadCFG %s:%s\n", name, value));
+ tbl = lookup_config(name);
+ if (tbl->name == 0) {
+ /* lynx ignores unknown keywords */
+ CTRACE((tfp, "LYReadCFG: ignored %s:%s\n", name, value));
+ continue;
+ }
+ if (show_cfg)
+ printf("%s:%s\n", name, value);
+
+ if (allowed && (*allowed)[tbl - Config_Table]) {
+ if (fp0 == NULL)
+ fprintf(stderr, "%s is not allowed in the %s\n",
+ name, cfg_filename);
+ /*FIXME: we can do something wiser if we are generating
+ the html representation of lynx.cfg - say include this line
+ in bold, or something... */
+
+ continue;
+ }
+
+ (void) ParseUnionOf(tbl);
+ switch ((fp0 != 0 && tbl->type != CONF_INCLUDE)
+ ? CONF_NIL
+ : tbl->type) {
+ case CONF_BOOL:
+ case CONF_FUN:
+ case CONF_TIME:
+ case CONF_ENUM:
+ case CONF_INT:
+ case CONF_STR:
+ case CONF_ENV:
+ case CONF_ENV2:
+ case CONF_PRG:
+ case CONF_ADD_ITEM:
+ case CONF_ADD_STRING:
+ case CONF_ADD_TRUSTED:
+ LYSetConfigValue(name, value);
+ break;
+
+ case CONF_INCLUDE:{
+ /* include another file */
+ optidx_set_t cur_set, anded_set;
+ optidx_set_t *resultant_set = NULL;
+ char *p1, *p2, savechar;
+ BOOL any_optname_found = FALSE;
+
+ char *url = NULL;
+ char *cp1 = NULL;
+ const char *sep = NULL;
+
+ if ((p1 = strstr(value, sep = " for ")) != 0
+#if defined(UNIX) && !defined(USE_DOS_DRIVES)
+ || (p1 = strstr(value, sep = ":")) != 0
+#endif
+ ) {
+ *p1 = '\0';
+ p1 += strlen(sep);
+ }
+#ifndef NO_CONFIG_INFO
+ if (fp0 != 0 && !no_lynxcfg_xinfo) {
+ char *my_file = actual_filename(value, cfg_filename, LYNX_CFG_FILE);
+
+ LYLocalFileToURL(&url, my_file);
+ FREE(my_file);
+ StrAllocCopy(cp1, value);
+ if (StrChr(value, '&') || StrChr(value, '<')) {
+ LYEntify(&cp1, TRUE);
+ }
+
+ fprintf(fp0, "%s:<a href=\"%s\">%s</a>\n\n", name, url, cp1);
+ fprintf(fp0, " #&lt;begin %s&gt;\n", cp1);
+ }
+#endif
+
+ if (p1) {
+ while (*(p1 = LYSkipBlanks(p1)) != 0) {
+ Config_Type *tbl2;
+
+ p2 = LYSkipNonBlanks(p1);
+ savechar = *p2;
+ *p2 = 0;
+
+ tbl2 = lookup_config(p1);
+ if (tbl2->name == 0) {
+ if (fp0 == NULL)
+ fprintf(stderr,
+ "unknown option name %s in %s\n",
+ p1, cfg_filename);
+ } else {
+ unsigned i;
+
+ if (!any_optname_found) {
+ any_optname_found = TRUE;
+ for (i = 0; i < NOPTS_; ++i)
+ cur_set[i] = TRUE;
+ }
+ cur_set[tbl2 - Config_Table] = FALSE;
+ }
+ if (savechar && p2[1])
+ p1 = p2 + 1;
+ else
+ break;
+ }
+ }
+ if (!allowed) {
+ if (!any_optname_found)
+ resultant_set = NULL;
+ else
+ resultant_set = &cur_set;
+ } else {
+ if (!any_optname_found)
+ resultant_set = allowed;
+ else {
+ optidx_set_AND(anded_set, *allowed, cur_set);
+ resultant_set = &anded_set;
+ }
+ }
+
+#ifndef NO_CONFIG_INFO
+ /*
+ * Now list the opts that are allowed in included file. If all
+ * opts are allowed, then emit nothing, else emit an effective set
+ * of allowed options in <ul>. Option names will be uppercased.
+ * FIXME: uppercasing option names can be considered redundant.
+ */
+ if (fp0 != 0 && !no_lynxcfg_xinfo && resultant_set) {
+ char *buf = NULL;
+ unsigned i;
+
+ fprintf(fp0, " Options allowed in this file:\n");
+ for (i = 0; i < NOPTS_; ++i) {
+ if ((*resultant_set)[i])
+ continue;
+ StrAllocCopy(buf, Config_Table[i].name);
+ LYUpperCase(buf);
+ fprintf(fp0, " * %s\n", buf);
+ }
+ FREE(buf);
+ }
+#endif
+ do_read_cfg(value, cfg_filename, nesting_level + 1, fp0, resultant_set);
+
+#ifndef NO_CONFIG_INFO
+ if (fp0 != 0 && !no_lynxcfg_xinfo) {
+ fprintf(fp0, " #&lt;end of %s&gt;\n\n", cp1);
+ FREE(url);
+ FREE(cp1);
+ }
+#endif
+ }
+ break;
+
+ default:
+ if (fp0 != 0) {
+ if (StrChr(value, '&') || StrChr(value, '<')) {
+ char *cp1 = NULL;
+
+ StrAllocCopy(cp1, value);
+ LYEntify(&cp1, TRUE);
+ fprintf(fp0, "%s:%s\n", name, cp1);
+ FREE(cp1);
+ } else {
+ fprintf(fp0, "%s:%s\n", name, value);
+ }
+ }
+ break;
+ }
+ }
+
+ LYCloseInput(fp);
+
+ /*
+ * If any DOWNLOADER: commands have always_enabled set (:TRUE), make
+ * override_no_download TRUE, so that other restriction settings will not
+ * block presentation of a download menu with those always_enabled options
+ * still available. - FM
+ */
+ if (downloaders != 0) {
+ lynx_list_item_type *cur_download;
+
+ cur_download = downloaders;
+ while (cur_download != 0) {
+ if (cur_download->always_enabled) {
+ override_no_download = TRUE;
+ break;
+ }
+ cur_download = cur_download->next;
+ }
+ }
+
+ /*
+ * If any COOKIE_{ACCEPT,REJECT}_DOMAINS have been defined,
+ * process them. These are comma delimited lists of
+ * domains. - BJP
+ *
+ * And for query/strict/loose invalid cookie checking. - BJP
+ */
+ LYConfigCookies();
+
+ /*
+ * Do not allow infinite redirection loops.
+ */
+ if (redirection_limit < 5)
+ redirection_limit = 5;
+ if (redirection_limit > 25)
+ redirection_limit = 25;
+}
+
+/* this is a public interface to do_read_cfg */
+void read_cfg(const char *cfg_filename,
+ const char *parent_filename,
+ int nesting_level,
+ FILE *fp0)
+{
+ HTInitProgramPaths(TRUE);
+ do_read_cfg(cfg_filename, parent_filename, nesting_level, fp0, NULL);
+}
+
+#ifndef NO_CONFIG_INFO
+static void extra_cfg_link(FILE *fp, const char *href,
+ const char *name)
+{
+ fprintf(fp, "<a href=\"%s\">%s</a>",
+ href, name);
+}
+#endif /* NO_CONFIG_INFO */
+
+/*
+ * Show rendered lynx.cfg data without comments, LYNXCFG:/ internal page.
+ * Called from getfile() cycle: we create and load the page just in place and
+ * return to mainloop().
+ */
+int lynx_cfg_infopage(DocInfo *newdoc)
+{
+ static char tempfile[LY_MAXPATH] = "\0";
+ DocAddress WWWDoc; /* need on exit */
+ char *temp = 0;
+ char *cp1 = NULL;
+ FILE *fp0;
+
+#ifndef NO_CONFIG_INFO
+ /*-------------------------------------------------
+ * kludge a link from LYNXCFG:/, the URL was:
+ * " <a href=\"LYNXCFG://reload\">RELOAD THE CHANGES</a>\n"
+ *--------------------------------------------------*/
+
+ if (!no_lynxcfg_xinfo && (strstr(newdoc->address, "LYNXCFG://reload"))) {
+ /*
+ * Some stuff to reload read_cfg(), but also load options menu items
+ * and command-line options to make things consistent. Implemented in
+ * LYMain.c
+ */
+ reload_read_cfg();
+
+ /*
+ * now pop-up and return to updated LYNXCFG:/ page, remind
+ * postoptions() but much simpler:
+ */
+ /*
+ * But check whether the top history document is really the expected
+ * LYNXCFG: page. - kw
+ */
+ if (HTMainText && nhist > 0 &&
+ !strcmp(HTLoadedDocumentTitle(), LYNXCFG_TITLE) &&
+ !strcmp(HTLoadedDocumentURL(), HDOC(nhist - 1).address) &&
+ LYIsUIPage(HDOC(nhist - 1).address, UIP_LYNXCFG) &&
+ (!lynxcfginfo_url ||
+ strcmp(HTLoadedDocumentURL(), lynxcfginfo_url))) {
+ /* the page was pushed, so pop-up. */
+ LYpop(newdoc);
+ WWWDoc.address = newdoc->address;
+ WWWDoc.post_data = newdoc->post_data;
+ WWWDoc.post_content_type = newdoc->post_content_type;
+ WWWDoc.bookmark = newdoc->bookmark;
+ WWWDoc.isHEAD = newdoc->isHEAD;
+ WWWDoc.safe = newdoc->safe;
+ LYforce_no_cache = FALSE; /* ! */
+ LYoverride_no_cache = TRUE; /* ! */
+
+ /*
+ * Working out of getfile() cycle we reset *no_cache manually here
+ * so HTLoadAbsolute() will return "Document already in memory":
+ * it was forced reloading obsolete file again without this
+ * (overhead).
+ *
+ * Probably *no_cache was set in a wrong position because of the
+ * internal page...
+ */
+ if (!HTLoadAbsolute(&WWWDoc))
+ return (NOT_FOUND);
+
+ HTuncache_current_document(); /* will never use again */
+ LYUnRegisterUIPage(UIP_LYNXCFG);
+ }
+
+ /* now set up the flag and fall down to create a new LYNXCFG:/ page */
+ FREE(lynxcfginfo_url); /* see below */
+ }
+#endif /* !NO_CONFIG_INFO */
+
+ /*
+ * We regenerate the file if reloading has been requested (with LYK_NOCACHE
+ * key). If we did not regenerate, there would be no way to recover in a
+ * session from a situation where the file is corrupted (for example
+ * truncated because the file system was full when it was first created -
+ * lynx doesn't check for write errors below), short of manual complete
+ * removal or perhaps forcing regeneration with LYNXCFG://reload.
+ * Similarly, there would be no simple way to get a different page if
+ * user_mode has changed to Advanced after the file was first generated in
+ * a non-Advanced mode (the difference being in whether the page includes
+ * the link to LYNXCFG://reload or not).
+ *
+ * We also try to regenerate the file if lynxcfginfo_url is set, indicating
+ * that tempfile is valid, but the file has disappeared anyway. This can
+ * happen to a long-lived lynx process if for example some system script
+ * periodically cleans up old files in the temp file space. - kw
+ */
+
+ if (LYforce_no_cache && reloading) {
+ FREE(lynxcfginfo_url); /* flag to code below to regenerate - kw */
+ } else if (lynxcfginfo_url != NULL) {
+ if (!LYCanReadFile(tempfile)) { /* check existence */
+ FREE(lynxcfginfo_url); /* flag to code below to try again - kw */
+ }
+ }
+ if (lynxcfginfo_url == 0) {
+
+ if ((fp0 = InternalPageFP(tempfile, TRUE)) == 0)
+ return (NOT_FOUND);
+
+ LYLocalFileToURL(&lynxcfginfo_url, tempfile);
+
+ LYforce_no_cache = TRUE; /* don't cache this doc */
+
+ BeginInternalPage(fp0, LYNXCFG_TITLE, NULL);
+ fprintf(fp0, "<pre>\n");
+
+#ifndef NO_CONFIG_INFO
+ if (!no_lynxcfg_xinfo) {
+#if defined(HAVE_CONFIG_H) || defined(VMS)
+ if (strcmp(lynx_cfg_file, LYNX_CFG_FILE)) {
+ fprintf(fp0, "<em>%s\n%s",
+ gettext("The following is read from your lynx.cfg file."),
+ gettext("Please read the distribution"));
+ LYLocalFileToURL(&temp, LYNX_CFG_FILE);
+ fprintf(fp0, " <a href=\"%s\">lynx.cfg</a> ",
+ temp);
+ FREE(temp);
+ fprintf(fp0, "%s</em>\n\n",
+ gettext("for more comments."));
+ } else
+#endif /* HAVE_CONFIG_H */
+ {
+ /* no absolute path... for lynx.cfg on DOS/Win32 */
+ fprintf(fp0, "<em>%s\n%s",
+ gettext("The following is read from your lynx.cfg file."),
+ gettext("Please read the distribution"));
+ fprintf(fp0, " </em>lynx.cfg<em> ");
+ fprintf(fp0, "%s</em>\n",
+ gettext("for more comments."));
+ }
+
+#ifndef NO_CONFIG_INFO
+#if defined(HAVE_CONFIG_H) && defined(USE_COLOR_STYLE)
+ if (!no_compileopts_info && !no_lynxcfg_xinfo) {
+ fprintf(fp0, "%s</pre><ul><li>", SEE_ALSO);
+ extra_cfg_link(fp0, STR_LYNXCFLAGS, COMPILE_OPT_SEGMENT);
+
+ fprintf(fp0, "<li>");
+ LYLocalFileToURL(&temp, lynx_lss_file);
+ extra_cfg_link(fp0, temp, COLOR_STYLE_SEGMENT);
+ fprintf(fp0, "</ul><pre>\n");
+ } else
+#endif
+ {
+ fprintf(fp0, "%s ", SEE_ALSO);
+#if defined(HAVE_CONFIG_H)
+ if (!no_compileopts_info) {
+ extra_cfg_link(fp0, STR_LYNXCFLAGS, COMPILE_OPT_SEGMENT);
+ }
+#endif
+#if defined(USE_COLOR_STYLE)
+ if (!no_lynxcfg_xinfo) {
+ LYLocalFileToURL(&temp, lynx_lss_file);
+ extra_cfg_link(fp0, temp, COLOR_STYLE_SEGMENT);
+ }
+#endif
+ fprintf(fp0, "\n\n");
+ }
+#endif /* NO_CONFIG_INFO */
+
+ /** a new experimental link ... **/
+ if (user_mode == ADVANCED_MODE)
+ fprintf(fp0, " <a href=\"%s//reload\">%s</a>\n",
+ STR_LYNXCFG,
+ gettext("RELOAD THE CHANGES"));
+
+ LYLocalFileToURL(&temp, lynx_cfg_file);
+ StrAllocCopy(cp1, lynx_cfg_file);
+ if (StrChr(lynx_cfg_file, '&') || StrChr(lynx_cfg_file, '<')) {
+ LYEntify(&cp1, TRUE);
+ }
+ fprintf(fp0, "\n #<em>%s <a href=\"%s\">%s</a></em>\n",
+ gettext("Your primary configuration"),
+ temp,
+ cp1);
+ FREE(temp);
+ FREE(cp1);
+
+ } else
+#endif /* !NO_CONFIG_INFO */
+
+ fprintf(fp0, "<em>%s</em>\n\n",
+ gettext("The following is read from your lynx.cfg file."));
+
+ /*
+ * Process the configuration file.
+ */
+ read_cfg(lynx_cfg_file, "main program", 1, fp0);
+
+ fprintf(fp0, "</pre>\n");
+ EndInternalPage(fp0);
+ LYCloseTempFP(fp0);
+ LYRegisterUIPage(lynxcfginfo_url, UIP_LYNXCFG);
+ }
+
+ /* return to getfile() cycle */
+ StrAllocCopy(newdoc->address, lynxcfginfo_url);
+ WWWDoc.address = newdoc->address;
+ WWWDoc.post_data = newdoc->post_data;
+ WWWDoc.post_content_type = newdoc->post_content_type;
+ WWWDoc.bookmark = newdoc->bookmark;
+ WWWDoc.isHEAD = newdoc->isHEAD;
+ WWWDoc.safe = newdoc->safe;
+
+ if (!HTLoadAbsolute(&WWWDoc))
+ return (NOT_FOUND);
+#ifdef DIRED_SUPPORT
+ lynx_edit_mode = FALSE;
+#endif /* DIRED_SUPPORT */
+ return (NORMAL);
+}
+
+#if defined(HAVE_CONFIG_H) && !defined(NO_CONFIG_INFO)
+/*
+ * Compile-time definitions info, LYNXCOMPILEOPTS:/ internal page, from
+ * getfile() cycle.
+ */
+int lynx_compile_opts(DocInfo *newdoc)
+{
+ static char tempfile[LY_MAXPATH] = "\0";
+
+#define PutDefs(table, N) fprintf(fp0, "%-35s %s\n", table[N].name, table[N].value)
+#include <cfg_defs.h>
+ unsigned n;
+ DocAddress WWWDoc; /* need on exit */
+ FILE *fp0;
+
+ /* In general, create the page only once - compile-time data will not
+ * change... But we will regenerate the file anyway, in a few situations:
+ *
+ * (a) configinfo_url has been FREEd - this can happen if free_lynx_cfg()
+ * was called as part of a LYNXCFG://reload action.
+ *
+ * (b) reloading has been requested (with LYK_NOCACHE key). If we did not
+ * regenerate, there would be no way to recover in a session from a
+ * situation where the file is corrupted (for example truncated because the
+ * file system was full when it was first created - lynx doesn't check for
+ * write errors below), short of manual complete removal or forcing
+ * regeneration with LYNXCFG://reload.
+ *
+ * (c) configinfo_url is set, indicating that tempfile is valid, but the
+ * file has disappeared anyway. This can happen to a long-lived lynx
+ * process if for example some system script periodically cleans up old
+ * files in the temp file space. - kw
+ */
+
+ if (LYforce_no_cache && reloading) {
+ FREE(configinfo_url); /* flag to code below to regenerate - kw */
+ } else if (configinfo_url != NULL) {
+ if (!LYCanReadFile(tempfile)) { /* check existence */
+ FREE(configinfo_url); /* flag to code below to try again - kw */
+ }
+ }
+ if (configinfo_url == NULL) {
+ if ((fp0 = InternalPageFP(tempfile, TRUE)) == 0)
+ return (NOT_FOUND);
+
+ LYLocalFileToURL(&configinfo_url, tempfile);
+
+ BeginInternalPage(fp0, CONFIG_DEF_TITLE, NULL);
+ fprintf(fp0, "<pre>\n");
+
+ fprintf(fp0, "\n%s<br>\n<em>config.cache</em>\n", AUTOCONF_CONFIG_CACHE);
+ for (n = 0; n < TABLESIZE(config_cache); n++) {
+ PutDefs(config_cache, n);
+ }
+ fprintf(fp0, "\n%s<br>\n<em>lynx_cfg.h</em>\n", AUTOCONF_LYNXCFG_H);
+ for (n = 0; n < TABLESIZE(config_defines); n++) {
+ PutDefs(config_defines, n);
+ }
+ fprintf(fp0, "</pre>\n");
+ EndInternalPage(fp0);
+ LYCloseTempFP(fp0);
+ LYRegisterUIPage(configinfo_url, UIP_CONFIG_DEF);
+ }
+
+ /* exit to getfile() cycle */
+ StrAllocCopy(newdoc->address, configinfo_url);
+ WWWDoc.address = newdoc->address;
+ WWWDoc.post_data = newdoc->post_data;
+ WWWDoc.post_content_type = newdoc->post_content_type;
+ WWWDoc.bookmark = newdoc->bookmark;
+ WWWDoc.isHEAD = newdoc->isHEAD;
+ WWWDoc.safe = newdoc->safe;
+
+ if (!HTLoadAbsolute(&WWWDoc))
+ return (NOT_FOUND);
+#ifdef DIRED_SUPPORT
+ lynx_edit_mode = FALSE;
+#endif /* DIRED_SUPPORT */
+ return (NORMAL);
+}
+#endif /* !NO_CONFIG_INFO */
diff --git a/src/LYReadCFG.h b/src/LYReadCFG.h
new file mode 100644
index 0000000..7347f86
--- /dev/null
+++ b/src/LYReadCFG.h
@@ -0,0 +1,75 @@
+/*
+ * $LynxId: LYReadCFG.h,v 1.29 2014/02/12 23:58:37 tom Exp $
+ */
+#ifndef LYREADCFG_H
+#define LYREADCFG_H
+
+#ifndef LYSTRUCTS_H
+#include <LYStructs.h>
+#endif /* LYSTRUCTS_H */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#if defined(USE_COLOR_STYLE) || defined(USE_COLOR_TABLE)
+#define DEFAULT_COLOR -1
+#define NO_COLOR -2
+#define ERR_COLOR -3
+/* Note: the sense of colors that Lynx uses for defaults is the reverse of
+ * the standard for color-curses.
+ */
+#ifdef USE_DEFAULT_COLORS
+# ifdef USE_SLANG
+# define DEFAULT_FG "default"
+# define DEFAULT_BG "default"
+# else
+# ifdef HAVE_USE_DEFAULT_COLORS
+# define DEFAULT_FG DEFAULT_COLOR
+# define DEFAULT_BG DEFAULT_COLOR
+# else
+# define DEFAULT_FG COLOR_BLACK
+# define DEFAULT_BG COLOR_WHITE
+# endif
+# endif
+#else
+# ifdef USE_SLANG
+# define DEFAULT_FG "black"
+# define DEFAULT_BG "white"
+# else
+# define DEFAULT_FG COLOR_BLACK
+# define DEFAULT_BG COLOR_WHITE
+# endif
+#endif /* USE_DEFAULT_COLORS */
+ extern int default_fg;
+ extern int default_bg;
+ extern BOOL default_color_reset;
+
+ extern int check_color(const char *color, int the_default);
+ extern const char *lookup_color(int code);
+ extern void update_default_colors(void);
+#endif
+
+ extern void read_cfg(const char *cfg_filename,
+ const char *parent_filename,
+ int nesting_level,
+ FILE *fp0);
+ extern void free_lynx_cfg(void);
+ extern BOOLEAN have_read_cfg;
+
+ extern FILE *LYOpenCFG(const char *cfg_filename, const char
+ *parent_filename, const char *dft_filename);
+ extern int hiddenlinks_fun(char *next_arg);
+ extern int lynx_cfg_infopage(DocInfo *newdoc);
+ extern int lynx_compile_opts(DocInfo *newdoc);
+ extern int match_item_by_name(lynx_list_item_type *ptr, const char *name, int only_overriders);
+ extern lynx_list_item_type *find_item_by_number(lynx_list_item_type *
+ list_ptr,
+ char *number);
+ extern void reload_read_cfg(void); /* implemented in LYMain.c */
+ extern BOOL LYSetConfigValue(const char *name, const char *value);
+ extern void LYSetTextDomain(void);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* LYREADCFG_H */
diff --git a/src/LYSearch.c b/src/LYSearch.c
new file mode 100644
index 0000000..a56de21
--- /dev/null
+++ b/src/LYSearch.c
@@ -0,0 +1,379 @@
+/*
+ * $LynxId: LYSearch.c,v 1.40 2013/10/13 20:23:07 tom Exp $
+ */
+#include <HTUtils.h>
+#include <HTAlert.h>
+#include <LYUtils.h>
+#include <LYStrings.h>
+#include <LYSearch.h>
+#include <LYGlobalDefs.h>
+#include <GridText.h>
+
+#include <LYLeaks.h>
+
+#define MATCH(a,b) (BOOL)(LYno_attr_strstr(a, b) != 0)
+
+/*
+ * Handle special field-related comparisons for anchor_has_target() and
+ * link_has_target().
+ */
+BOOL field_has_target(FormInfo * field, const char *target)
+{
+ BOOL result = FALSE;
+ OptionType *option;
+ char *stars = NULL;
+ const char *cp;
+
+ if ((field != NULL && field->value != NULL) &&
+ field->type != F_HIDDEN_TYPE) {
+ if (field->type == F_PASSWORD_TYPE) {
+ /*
+ * Check the actual (hidden password), and then the displayed
+ * string - FM
+ */
+ if (MATCH(field->value, target)) {
+ result = TRUE;
+ } else {
+ StrAllocCopy(stars, field->value);
+ memset(stars, '*', strlen(stars));
+ result = MATCH(stars, target);
+ FREE(stars);
+ }
+ } else if (field->type == F_OPTION_LIST_TYPE) {
+ /*
+ * Search the option strings that are displayed when the popup is
+ * invoked - FM
+ */
+ for (option = field->select_list; option != NULL; option = option->next) {
+ if (MATCH(option->name, target)) {
+ result = TRUE;
+ break;
+ }
+ }
+ } else if (field->type == F_RADIO_TYPE) {
+ /*
+ * Search for checked or unchecked parens - FM
+ */
+ cp = ((field->num_value)
+ ? checked_radio
+ : unchecked_radio);
+ result = MATCH(cp, target);
+ } else if (field->type == F_CHECKBOX_TYPE) {
+ /*
+ * Search for checked or unchecked square brackets - FM
+ */
+ cp = ((field->num_value)
+ ? checked_box
+ : unchecked_box);
+ result = MATCH(cp, target);
+ } else {
+ result = MATCH(field->value, target);
+ }
+ }
+ return result;
+}
+
+/*
+ * see also anchor_has_target
+ */
+static BOOL link_has_target(int cur,
+ char *target)
+{
+ LinkInfo *a = &links[cur];
+ char *text = NULL;
+ const char *last = "?";
+ int count;
+
+ /*
+ * Combine the parts of the link's text using the highlighting information,
+ * and compare the target against that.
+ */
+ for (count = 0; count < 10; ++count) {
+ const char *part = LYGetHiliteStr(cur, count);
+
+ if (part == NULL || part == last) {
+ if (MATCH(text, target)) {
+ return TRUE;
+ }
+ break;
+ }
+ StrAllocCat(text, part);
+ last = part;
+ }
+
+ return field_has_target(a->l_form, target);
+}
+
+/*
+ * Search for the target string inside of the links that are currently
+ * displayed on the screen beginning with the one after the currently selected
+ * one. If found set cur to the new value and return TRUE. If not found do
+ * not reset cur and return FALSE.
+ */
+
+static int check_next_target_in_links(int *cur,
+ char *target)
+{
+ int i;
+
+ if (nlinks != 0) {
+ for (i = *cur + 1; i < nlinks; ++i) {
+ if (link_has_target(i, target)) {
+ *cur = i;
+ return TRUE;
+ }
+ }
+ }
+ return FALSE;
+}
+
+static int check_prev_target_in_links(int *cur,
+ char *target)
+{
+ int i;
+
+ if (nlinks != 0) {
+ for (i = *cur - 1; i >= 0; --i) {
+ if (link_has_target(i, target)) {
+ *cur = i;
+ return TRUE;
+ }
+ }
+ }
+ return FALSE;
+}
+
+/*
+ * Textsearch checks the prev_target variable to see if it is empty. If it is
+ * then it requests a new search string. It then searches the current file for
+ * the next instance of the search string and finds the line number that the
+ * string is on
+ *
+ * This is the primary USER search engine and is case sensitive or case
+ * insensitive depending on the 'LYcase_sensitive' global variable
+ */
+BOOL textsearch(DocInfo *cur_doc,
+ bstring **prev_target,
+ int direction)
+{
+ int offset;
+ int oldcur = cur_doc->link;
+ static bstring *my_prev_target = NULL;
+ static BOOL first = TRUE;
+ char *cp;
+ int ch = 0;
+ RecallType recall;
+ int QueryTotal;
+ int QueryNum;
+ BOOLEAN FirstRecall = TRUE;
+
+ /*
+ * Initialize the search string buffer. - FM
+ */
+ if (first) {
+ BStrCopy0(my_prev_target, "");
+ first = FALSE;
+ }
+
+ QueryTotal = (search_queries ? HTList_count(search_queries) : 0);
+ recall = ((QueryTotal >= 1) ? RECALL_URL : NORECALL);
+ QueryNum = QueryTotal;
+
+ if (direction != 0) {
+ /*
+ * LYK_NEXT or LYK_PREV was pressed, so copy the buffer into
+ * prev_target.
+ */
+ BStrCopy(*prev_target, my_prev_target);
+ } else if (*prev_target == 0) {
+ BStrCopy0(*prev_target, "");
+ }
+
+ if (strlen((*prev_target)->str) == 0) {
+ /*
+ * This is a new WHEREIS search ('/'), or LYK_NEXT was pressed but
+ * there was no previous search, so we need to get a search string from
+ * the user. - FM
+ */
+ _statusline(ENTER_WHEREIS_QUERY);
+
+ ch = LYgetBString(prev_target, FALSE, 0, recall);
+ if (ch < 0) {
+ /*
+ * User cancelled the search via ^G. Restore prev_target and
+ * return. - FM
+ */
+ BStrCopy(*prev_target, my_prev_target);
+ HTInfoMsg(CANCELLED);
+ return (FALSE);
+ }
+ }
+
+ check_recall:
+ if (strlen((*prev_target)->str) == 0 &&
+ !(recall && (ch == UPARROW_KEY || ch == DNARROW_KEY))) {
+ /*
+ * No entry. Simply return, retaining the current buffer. Because
+ * prev_target is now reset, highlighting of the previous search string
+ * will no longer occur, but it can be used again via LYK_NEXT or
+ * LYK_PREV.
+ */
+ HTInfoMsg(CANCELLED);
+ return (FALSE);
+ }
+
+ if (recall && ch == UPARROW_KEY) {
+ if (FirstRecall) {
+ /*
+ * Use the current string or last query in the list. - FM
+ */
+ FirstRecall = FALSE;
+ if (!isBEmpty(my_prev_target)) {
+ for (QueryNum = (QueryTotal - 1); QueryNum > 0; QueryNum--) {
+ if ((cp = (char *) HTList_objectAt(search_queries,
+ QueryNum)) != NULL &&
+ !strcmp(my_prev_target->str, cp)) {
+ break;
+ }
+ }
+ } else {
+ QueryNum = 0;
+ }
+ } else {
+ /*
+ * Go back to the previous query in the list. - FM
+ */
+ QueryNum++;
+ }
+ if (QueryNum >= QueryTotal)
+ /*
+ * Roll around to the last query in the list. - FM
+ */
+ QueryNum = 0;
+ if ((cp = (char *) HTList_objectAt(search_queries,
+ QueryNum)) != NULL) {
+ BStrCopy0(*prev_target, cp);
+ if (!isBEmpty(my_prev_target) &&
+ !strcmp(my_prev_target->str, (*prev_target)->str)) {
+ _statusline(EDIT_CURRENT_QUERY);
+ } else if ((!isBEmpty(my_prev_target) && QueryTotal == 2) ||
+ (isBEmpty(my_prev_target) && QueryTotal == 1)) {
+ _statusline(EDIT_THE_PREV_QUERY);
+ } else {
+ _statusline(EDIT_A_PREV_QUERY);
+ }
+ ch = LYgetBString(prev_target, FALSE, 0, recall);
+ if (ch < 0) {
+ /*
+ * User canceled the search via ^G. Restore prev_target and
+ * return. - FM
+ */
+ BStrCopy(*prev_target, my_prev_target);
+ HTInfoMsg(CANCELLED);
+ return (FALSE);
+ }
+ goto check_recall;
+ }
+ } else if (recall && ch == DNARROW_KEY) {
+ if (FirstRecall) {
+ /*
+ * Use the current string or first query in the list. - FM
+ */
+ FirstRecall = FALSE;
+ if (!isBEmpty(my_prev_target)) {
+ for (QueryNum = 0; QueryNum < (QueryTotal - 1); QueryNum++) {
+ if ((cp = (char *) HTList_objectAt(search_queries,
+ QueryNum)) != NULL &&
+ !strcmp(my_prev_target->str, cp)) {
+ break;
+ }
+ }
+ } else {
+ QueryNum = QueryTotal - 1;
+ }
+ } else {
+ /*
+ * Advance to the next query in the list. - FM
+ */
+ QueryNum--;
+ }
+ if (QueryNum < 0)
+ /*
+ * Roll around to the first query in the list. - FM
+ */
+ QueryNum = QueryTotal - 1;
+ if ((cp = (char *) HTList_objectAt(search_queries,
+ QueryNum)) != NULL) {
+ BStrCopy0(*prev_target, cp);
+ if (!isBEmpty(my_prev_target) &&
+ !strcmp(my_prev_target->str, (*prev_target)->str)) {
+ _statusline(EDIT_CURRENT_QUERY);
+ } else if ((!isBEmpty(my_prev_target) && QueryTotal == 2) ||
+ (isBEmpty(my_prev_target) && QueryTotal == 1)) {
+ _statusline(EDIT_THE_PREV_QUERY);
+ } else {
+ _statusline(EDIT_A_PREV_QUERY);
+ }
+ ch = LYgetBString(prev_target, FALSE, 0, recall);
+ if (ch < 0) {
+ /*
+ * User cancelled the search via ^G. Restore prev_target and
+ * return. - FM
+ */
+ BStrCopy(*prev_target, my_prev_target);
+ HTInfoMsg(CANCELLED);
+ return (FALSE);
+ }
+ goto check_recall;
+ }
+ }
+ /*
+ * Replace the search string buffer with the new target. - FM
+ */
+ BStrCopy(my_prev_target, *prev_target);
+ HTAddSearchQuery(my_prev_target->str);
+
+ if (direction < 0) {
+ offset = 0;
+ if (check_prev_target_in_links(&cur_doc->link, (*prev_target)->str)) {
+ /*
+ * Found in link, changed cur, we're done.
+ */
+ LYhighlight(FALSE, oldcur, (*prev_target)->str);
+ return (TRUE);
+ }
+ } else {
+
+ /*
+ * Search the links on the currently displayed page for the string,
+ * starting after the current link. - FM
+ */
+ if (check_next_target_in_links(&cur_doc->link, (*prev_target)->str)) {
+ /*
+ * Found in link, changed cur, we're done.
+ */
+ LYhighlight(FALSE, oldcur, (*prev_target)->str);
+ return (TRUE);
+ }
+
+ /*
+ * We'll search the text starting from the link we are on, or the next
+ * page.
+ */
+ if (nlinks == 0)
+ offset = (display_lines - 1);
+ else
+ offset = links[cur_doc->link].ly - 1;
+ }
+
+ /*
+ * Resume search, this time for all text. Set www_search_result if string
+ * found, and position the hit near top of screen.
+ */
+ www_user_search((cur_doc->line + offset), cur_doc, (*prev_target)->str, direction);
+ if (cur_doc->link != oldcur) {
+ LYhighlight(FALSE, oldcur, (*prev_target)->str);
+ return (TRUE);
+ }
+ return (BOOL) (www_search_result > 0);
+}
diff --git a/src/LYSearch.h b/src/LYSearch.h
new file mode 100644
index 0000000..17fd5dd
--- /dev/null
+++ b/src/LYSearch.h
@@ -0,0 +1,33 @@
+/*
+ * $LynxId: LYSearch.h,v 1.12 2013/10/03 11:24:06 tom Exp $
+ */
+#ifndef LYSEARCH_H
+#define LYSEARCH_H
+
+#ifndef HTFORMS_H
+#include <HTForms.h>
+#endif
+
+#ifndef LYSTRUCTS_H
+#include <LYStructs.h>
+#endif /* LYSTRUCT_H */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ extern BOOL field_has_target(FormInfo * field, const char *target);
+ extern BOOL textsearch(DocInfo *cur_doc,
+ bstring **prev_target,
+ int direction);
+
+#define IN_FILE 1
+#define IN_LINKS 2
+
+#ifndef NOT_FOUND
+#define NOT_FOUND 0
+#endif /* NOT_FOUND */
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* LYSEARCH_H */
diff --git a/src/LYSession.c b/src/LYSession.c
new file mode 100644
index 0000000..a4438bd
--- /dev/null
+++ b/src/LYSession.c
@@ -0,0 +1,267 @@
+/* $LynxId: LYSession.c,v 1.12 2018/07/08 15:22:44 tom Exp $ */
+
+#include <LYSession.h>
+
+#include <LYLeaks.h>
+#include <LYUtils.h>
+#include <LYStrings.h>
+#include <LYHistory.h>
+#include <LYGlobalDefs.h>
+#include <LYMainLoop.h>
+#include <GridText.h>
+
+#ifdef USE_SESSIONS
+
+/* Example of how a session file may look:
+ */
+
+/* # lynx session
+ * / files
+ * / hereby
+ * / reduce
+ * g file://localhost/COPYRIGHT
+ * g https://lynx.invisible-island.net
+ * h 1 -1 file://localhost/COPYRIGHT Entry into main screen
+ * h 1 0 LYNXCACHE:/ Cache Jar
+ * h 1 16 file://localhost/usr/local/share/lynx_help/Lynx_users_guide.html#Cache Lynx Users Guide v2.8.6
+ * h 1 -1 file://localhost/COPYRIGHT Entry into main screen
+ * h 1 2 file://localhost/tmp/lynxmSefvcbXes/L12110-6407TMP.html#current Visited Links Page
+ * h 1 -1 file://localhost/COPYRIGHT Entry into main screen
+ * h 1 -1 LYNXMESSAGES:/ Your recent statusline messages
+ * V 0 file://localhost/COPYRIGHT Entry into main screen
+ * V 3 file://localhost/usr/local/share/lynx_help/Lynx_users_guide.html#Bookmarks Lynx Users Guide v2.8.6
+ */
+
+static char *get_filename(char *given_name)
+{
+ char *actual_filename = given_name;
+
+ /*
+ * If the specific "-sessionin" or "-sessionout" value is not given,
+ * try the "-session" value (if the AUTO_SESSION configuration is set).
+ * Finally try the SESSION_FILE configuration value.
+ */
+ if (isEmpty(actual_filename)) {
+ actual_filename = session_file;
+ if (isEmpty(actual_filename)) {
+ if (LYAutoSession) {
+ actual_filename = LYSessionFile;
+ }
+ }
+ }
+
+ return actual_filename;
+}
+
+/* Restore session from file, pretty slow, but it should be fine
+ * for everyday, normal use.
+ */
+void RestoreSession(void)
+{
+ char *my_filename = get_filename(sessionin_file);
+ FILE *fp;
+ char *buffer = 0;
+ DocInfo doc;
+ VisitedLink *vl;
+ int i = 0;
+ short errors = 10; /* how many syntax errors are allowed in
+ * session file before aborting. */
+ char *value1, *value2, *rsline, *linktext, *rslevel;
+
+ memset(&doc, 0, sizeof(doc));
+
+ /*
+ * This should be done only once, here: iff USE_SESSIONS is defined or:
+ * in mainloop(), otherwise history entries are lost
+ */
+ nhist = 0;
+
+ if (my_filename == NULL) {
+ /* nothing to do, so exit */
+ return;
+ }
+
+ CTRACE((tfp, "RestoreSession %s\n", my_filename));
+ SetDefaultMode(O_TEXT);
+ if ((fp = fopen(my_filename, TXT_R)) != NULL) {
+
+ /*
+ * This should be safe, entries are added to lynx until memory is
+ * exhausted
+ */
+ while (LYSafeGets(&buffer, fp) != 0) {
+ LYTrimNewline(buffer);
+ if (*buffer == '/') {
+#ifdef SEARCH_OUT_SESSION
+ if ((value1 = StrChr(buffer, ' ')) == 0) {
+ continue;
+ } else {
+ value1++;
+ HTAddSearchQuery(value1);
+ }
+#endif /* SEARCH_OUT_SESSION */
+ } else if (*buffer == 'g') {
+#ifdef GOTOURL_OUT_SESSION
+ if ((value1 = StrChr(buffer, ' ')) == 0)
+ continue;
+ else {
+ value1++;
+ HTAddGotoURL(value1);
+ }
+#endif /* GOTOURL_OUT_SESSION */
+ } else if (*buffer == 'h') {
+#ifdef HISTORY_OUT_SESSION
+ if ((rsline = StrChr(buffer, ' ')) == 0)
+ continue;
+ else {
+ rsline++;
+ if ((linktext = StrChr(rsline, ' ')) == 0)
+ continue;
+ else
+ *linktext++ = 0;
+ if ((value1 = StrChr(linktext, ' ')) == 0)
+ continue;
+ else
+ *value1++ = 0;
+ if ((value2 = StrChr(value1, '\t')) != 0) {
+ *value2++ = 0;
+ doc.line = atoi(rsline);
+ doc.link = atoi(linktext);
+ StrAllocCopy(doc.address, value1);
+ StrAllocCopy(doc.title, value2);
+ LYpush(&doc, TRUE);
+ }
+ }
+#endif /* HISTORY_OUT_SESSION */
+ } else if (*buffer == 'V') {
+#ifdef VLINK_OUT_SESSION
+ if ((rslevel = StrChr(buffer, ' ')) == 0)
+ continue;
+ else {
+ rslevel++;
+ if ((value1 = StrChr(rslevel, ' ')) == 0)
+ continue;
+ else
+ *value1++ = 0;
+ if ((value2 = StrChr(value1, '\t')) != 0) {
+ *value2++ = 0;
+ StrAllocCopy(doc.address, value1);
+ StrAllocCopy(doc.title, value2);
+ LYAddVisitedLink(&doc);
+ vl = (VisitedLink *)
+ HTList_objectAt(Visited_Links, i);
+ if (vl != NULL) {
+ vl->level = atoi(rslevel);
+ i++;
+ }
+ }
+ }
+#endif /* VLINK_OUT_SESSION */
+ } else if (*buffer == '#') {
+ /* This is comment; ignore it */
+ continue;
+ } else if (errors-- < 0) {
+ FREE(buffer);
+ break;
+ } else
+ continue;
+ }
+
+ LYCloseOutput(fp);
+ }
+ SetDefaultMode(O_BINARY);
+}
+
+/*
+ * Save session to file, overwriting one.
+ */
+void SaveSession(void)
+{
+ char *my_filename = get_filename(sessionout_file);
+ FILE *fp;
+ VisitedLink *vl;
+ int i, j, k;
+
+ if (my_filename == NULL) {
+ /* nothing to do, so exit */
+ return;
+ }
+
+ CTRACE((tfp, "SaveSession %s\n", my_filename));
+
+ SetDefaultMode(O_TEXT);
+ if ((fp = fopen(my_filename, TXT_W)) != NULL) {
+
+ fprintf(fp, "# lynx session\n"); /* @@@ simple for now */
+
+ /* Note use of session_limit, the most recent entries in list,
+ * from the end of list, are saved.
+ */
+
+#ifdef SEARCH_IN_SESSION
+ k = HTList_count(search_queries);
+ if (k > session_limit)
+ j = k - session_limit;
+ else
+ j = 0;
+ for (i = j; i < k; i++) {
+ fprintf(fp, "/ ");
+ fputs((char *) HTList_objectAt(search_queries, i), fp);
+ fprintf(fp, "\n");
+ }
+#endif /* SEARCH_IN_SESSION */
+
+#ifdef GOTOURL_IN_SESSION
+ k = HTList_count(Goto_URLs);
+ if (k > session_limit)
+ j = k - session_limit;
+ else
+ j = 0;
+ for (i = j; i < k; i++) {
+ fprintf(fp, "g ");
+ fputs((char *) HTList_objectAt(Goto_URLs, i), fp);
+ fprintf(fp, "\n");
+ }
+#endif /* GOTOURL_IN_SESSION */
+
+#ifdef HISTORY_IN_SESSION
+ k = nhist + nhist_extra;
+ if (k > session_limit)
+ j = k - session_limit;
+ else
+ j = 0;
+
+ for (i = j; i < k; i++) {
+ fprintf(fp, "h %d %d ", HDOC(i).line, HDOC(i).link);
+ fputs(HDOC(i).address, fp);
+ fprintf(fp, "\t");
+ fputs(HDOC(i).title, fp);
+ fprintf(fp, "\n");
+ }
+#endif /* HISTORY_IN_SESSION */
+
+#ifdef VLINK_IN_SESSION
+ k = HTList_count(Visited_Links);
+ if (k > session_limit)
+ j = k - session_limit;
+ else
+ j = 0;
+
+ for (i = j; i < k; i++) {
+ vl = (VisitedLink *) HTList_objectAt(Visited_Links, i);
+ if (vl != NULL) {
+ fprintf(fp, "V %d ", vl->level);
+ fputs(vl->address, fp);
+ fprintf(fp, "\t");
+ fputs(vl->title, fp);
+ fprintf(fp, "\n");
+ }
+ }
+#endif /* VLINK_IN_SESSION */
+
+ LYCloseOutput(fp);
+ }
+ SetDefaultMode(O_BINARY);
+}
+
+#endif /* USE_SESSIONS */
diff --git a/src/LYSession.h b/src/LYSession.h
new file mode 100644
index 0000000..90d74fc
--- /dev/null
+++ b/src/LYSession.h
@@ -0,0 +1,16 @@
+/* $LynxId: LYSession.h,v 1.3 2008/02/10 23:47:39 Paul.B.Mahol Exp $ */
+#ifndef LYSESSION_H
+#define LYSESSION_H
+
+#include <HTUtils.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ extern void RestoreSession(void);
+ extern void SaveSession(void);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* LYSESSION_H */
diff --git a/src/LYShowInfo.c b/src/LYShowInfo.c
new file mode 100644
index 0000000..0338716
--- /dev/null
+++ b/src/LYShowInfo.c
@@ -0,0 +1,499 @@
+/* $LynxId: LYShowInfo.c,v 1.83 2018/12/27 22:35:44 Chuck.Martin Exp $ */
+#include <HTUtils.h>
+#include <HTFile.h>
+#include <HTParse.h>
+#include <HTAlert.h>
+#include <HTTP.h>
+#include <LYCurses.h>
+#include <LYUtils.h>
+#include <LYStructs.h>
+#include <LYGlobalDefs.h>
+#include <LYShowInfo.h>
+#include <LYCharUtils.h>
+#include <GridText.h>
+#include <LYReadCFG.h>
+#include <LYCharSets.h>
+#include <LYStrings.h>
+
+#include <LYLeaks.h>
+
+#ifdef DIRED_SUPPORT
+#include <HTAAProt.h>
+#include <time.h>
+#include <LYLocal.h>
+#endif /* DIRED_SUPPORT */
+
+#define BEGIN_DL(text) fprintf(fp0, "<h2>%s</h2>\n<dl compact>", LYEntifyTitle(&buffer, text))
+#define END_DL() fprintf(fp0, "\n</dl>\n")
+
+#define ADD_SS(label,value) dt_String(fp0, label, value, 0)
+#define ADD_WW(label,value) dt_String(fp0, label, value, 1)
+#define ADD_NN(label,value,units) dt_Number(fp0, label, (long) value, units)
+
+static int label_columns;
+
+/*
+ * LYNX_VERSION and LYNX_DATE are automatically generated by PRCS, the tool
+ * which we use to archive versions of Lynx. We use a convention for naming
+ * the successive versions:
+ * {release}{status}{patch}
+ * where
+ * {release} is the release that we are working on, e.g., 2.8.4
+ * {status} is one of "dev", "pre" or "rel", and
+ * {patch} is a number assigned by PRCS.
+ */
+BOOL LYVersionIsRelease(void)
+{
+ return (BOOL) (strstr(LYNX_VERSION, "rel") != 0);
+}
+
+const char *LYVersionStatus(void)
+{
+ if (LYVersionIsRelease())
+ return REL_VERSION;
+ else if (strstr(LYNX_VERSION, "pre") != 0)
+ return PRE_VERSION;
+ return DEV_VERSION;
+}
+
+const char *LYVersionDate(void)
+{
+ static char temp[LYNX_DATE_LEN + 1];
+
+ LYStrNCpy(temp, &LYNX_DATE[LYNX_DATE_OFF], LYNX_DATE_LEN);
+ return temp;
+}
+
+static void dt_String(FILE *fp,
+ const char *label,
+ const char *value,
+ int allow_wide)
+{
+ int have;
+ int need;
+ char *the_label = NULL;
+ char *the_value = NULL;
+
+ StrAllocCopy(the_label, label);
+ StrAllocCopy(the_value, value);
+
+ have = (int) strlen(the_label);
+ need = LYstrExtent(the_label, have, label_columns);
+
+ LYEntify(&the_label, TRUE);
+ LYEntify(&the_value, TRUE);
+
+ fprintf(fp, "<dt>");
+ while (need++ < label_columns)
+ fprintf(fp, "&nbsp;");
+ if (LYwideLines && allow_wide)
+ fprintf(fp, "<em>%s</em> <pre>%s</pre>\n", the_label, the_value);
+ else
+ fprintf(fp, "<em>%s</em> %s\n", the_label, the_value);
+
+ FREE(the_label);
+ FREE(the_value);
+}
+
+static void dt_Number(FILE *fp0,
+ const char *label,
+ long number,
+ const char *units)
+{
+ char *value = NULL;
+ char *buffer = NULL;
+
+ HTSprintf(&value, "%ld %s", number, LYEntifyTitle(&buffer, units));
+ ADD_SS(label, value);
+ FREE(value);
+ FREE(buffer);
+}
+
+static void dt_URL(FILE *fp0, const char *address)
+{
+ if (address == NULL)
+ address = "";
+ ADD_WW(gettext("URL:"), address);
+
+ /*
+ * If the display handles UTF-8, and if the address uses %xy formatted
+ * characters, show the decoded URL on the next line.
+ */
+ if (LYCharSet_UC[current_char_set].enc == UCT_ENC_UTF8) {
+ char *working = NULL;
+
+ StrAllocCopy(working, address);
+ if (strcmp(HTUnEscape(working), address)) {
+ fprintf(fp0, "\n<br>%s\n", working);
+ }
+ free(working);
+ }
+}
+
+/*
+ * LYShowInfo prints a page of info about the current file and the link that
+ * the cursor is on.
+ */
+int LYShowInfo(DocInfo *doc,
+ DocInfo *newdoc,
+ char *owner_address)
+{
+ static char tempfile[LY_MAXPATH] = "\0";
+
+ int url_type;
+ FILE *fp0;
+ char *Title = NULL;
+ const char *cp;
+ char *temp = NULL;
+ char *buffer = NULL;
+
+ BOOLEAN LYInfoAdvanced = (BOOL) (user_mode == ADVANCED_MODE);
+
+#ifdef DIRED_SUPPORT
+ struct stat dir_info;
+ const char *name;
+#endif /* DIRED_SUPPORT */
+
+ if (LYReuseTempfiles) {
+ fp0 = LYOpenTempRewrite(tempfile, HTML_SUFFIX, "w");
+ } else {
+ (void) LYRemoveTemp(tempfile);
+ fp0 = LYOpenTemp(tempfile, HTML_SUFFIX, "w");
+ }
+ if (fp0 == NULL) {
+ HTAlert(CANNOT_OPEN_TEMP);
+ return (-1);
+ }
+
+ /*
+ * Point the address pointer at this Url
+ */
+ LYLocalFileToURL(&newdoc->address, tempfile);
+
+ if (nlinks > 0 && links[doc->link].lname != NULL &&
+ (url_type = is_url(links[doc->link].lname)) != 0 &&
+ (url_type == LYNXEXEC_URL_TYPE ||
+ url_type == LYNXPROG_URL_TYPE)) {
+ char *last_slash = strrchr(links[doc->link].lname, '/');
+ int next_to_last = (int) strlen(links[doc->link].lname) - 1;
+
+ if ((last_slash - links[doc->link].lname) == next_to_last) {
+ links[doc->link].lname[next_to_last] = '\0';
+ }
+ }
+
+ label_columns = 9;
+
+ WriteInternalTitle(fp0, SHOWINFO_TITLE);
+
+ fprintf(fp0, "<h1>%s %s (%s) (<a href=\"%s\">%s</a>)",
+ LYNX_NAME, LYNX_VERSION,
+ LYVersionDate(),
+ (LYVersionIsRelease()? LYNX_WWW_HOME : LYNX_WWW_DIST),
+ LYVersionStatus());
+
+ fprintf(fp0, "</h1>\n"); /* don't forget to close <h1> */
+
+#ifdef DIRED_SUPPORT
+ if (lynx_edit_mode && nlinks > 0) {
+
+ BEGIN_DL(gettext("Directory that you are currently viewing"));
+
+ temp = HTfullURL_toFile(doc->address);
+ ADD_SS(gettext("Name:"), temp);
+ FREE(temp);
+
+ dt_URL(fp0, doc->address);
+
+ END_DL();
+
+ temp = HTfullURL_toFile(links[doc->link].lname);
+
+ if (lstat(temp, &dir_info) == -1) {
+ CTRACE((tfp, "lstat(%s) failed, errno=%d\n", temp, errno));
+ HTAlert(CURRENT_LINK_STATUS_FAILED);
+ } else {
+ char modes[80];
+
+ label_columns = 16;
+ if (S_ISDIR(dir_info.st_mode)) {
+ BEGIN_DL(gettext("Directory that you have currently selected"));
+ } else if (S_ISREG(dir_info.st_mode)) {
+ BEGIN_DL(gettext("File that you have currently selected"));
+#ifdef S_IFLNK
+ } else if (S_ISLNK(dir_info.st_mode)) {
+ BEGIN_DL(gettext("Symbolic link that you have currently selected"));
+#endif
+ } else {
+ BEGIN_DL(gettext("Item that you have currently selected"));
+ }
+ ADD_SS(gettext("Full name:"), temp);
+#ifdef S_IFLNK
+ if (S_ISLNK(dir_info.st_mode)) {
+ char buf[MAX_LINE];
+ int buf_size;
+ size_t limit = sizeof(buf) - 1;
+
+ if ((buf_size = (int) readlink(temp, buf, limit)) != -1) {
+ if (buf_size > (int) limit)
+ buf_size = (int) limit;
+ buf[buf_size] = '\0';
+ } else {
+ sprintf(buf, "%.*s", (int) limit,
+ gettext("Unable to follow link"));
+ }
+ ADD_SS(gettext("Points to file:"), buf);
+ }
+#endif
+ name = HTAA_UidToName((int) dir_info.st_uid);
+ if (*name)
+ ADD_SS(gettext("Name of owner:"), name);
+ name = HTAA_GidToName((int) dir_info.st_gid);
+ if (*name)
+ ADD_SS(gettext("Group name:"), name);
+ if (S_ISREG(dir_info.st_mode)) {
+ ADD_NN(gettext("File size:"),
+ (long) dir_info.st_size,
+ gettext("(bytes)"));
+ }
+ /*
+ * Include date and time information.
+ */
+ ADD_SS(gettext("Creation date:"),
+ ctime(&dir_info.st_ctime));
+
+ ADD_SS(gettext("Last modified:"),
+ ctime(&dir_info.st_mtime));
+
+ ADD_SS(gettext("Last accessed:"),
+ ctime(&dir_info.st_atime));
+
+ END_DL();
+
+ label_columns = 9;
+ BEGIN_DL(gettext("Access Permissions"));
+ modes[0] = '\0';
+ modes[1] = '\0'; /* In case there are no permissions */
+ modes[2] = '\0';
+ if ((dir_info.st_mode & S_IRUSR))
+ strcat(modes, ", read");
+ if ((dir_info.st_mode & S_IWUSR))
+ strcat(modes, ", write");
+ if ((dir_info.st_mode & S_IXUSR)) {
+ if (S_ISDIR(dir_info.st_mode))
+ strcat(modes, ", search");
+ else {
+ strcat(modes, ", execute");
+ if ((dir_info.st_mode & S_ISUID))
+ strcat(modes, ", setuid");
+ }
+ }
+ ADD_SS(gettext("Owner:"), &modes[2]);
+
+ modes[0] = '\0';
+ modes[1] = '\0'; /* In case there are no permissions */
+ modes[2] = '\0';
+ if ((dir_info.st_mode & S_IRGRP))
+ strcat(modes, ", read");
+ if ((dir_info.st_mode & S_IWGRP))
+ strcat(modes, ", write");
+ if ((dir_info.st_mode & S_IXGRP)) {
+ if (S_ISDIR(dir_info.st_mode))
+ strcat(modes, ", search");
+ else {
+ strcat(modes, ", execute");
+ if ((dir_info.st_mode & S_ISGID))
+ strcat(modes, ", setgid");
+ }
+ }
+ ADD_SS(gettext("Group:"), &modes[2]);
+
+ modes[0] = '\0';
+ modes[1] = '\0'; /* In case there are no permissions */
+ modes[2] = '\0';
+ if ((dir_info.st_mode & S_IROTH))
+ strcat(modes, ", read");
+ if ((dir_info.st_mode & S_IWOTH))
+ strcat(modes, ", write");
+ if ((dir_info.st_mode & S_IXOTH)) {
+ if (S_ISDIR(dir_info.st_mode))
+ strcat(modes, ", search");
+ else {
+ strcat(modes, ", execute");
+#ifdef S_ISVTX
+ if ((dir_info.st_mode & S_ISVTX))
+ strcat(modes, ", sticky");
+#endif
+ }
+ }
+ ADD_SS(gettext("World:"), &modes[2]);
+ END_DL();
+ }
+ FREE(temp);
+ } else {
+#endif /* DIRED_SUPPORT */
+
+ BEGIN_DL(gettext("File that you are currently viewing"));
+
+ LYformTitle(&Title, doc->title);
+ HTSprintf(&temp, "%s%s",
+ LYEntifyTitle(&buffer, Title),
+ ((doc->isHEAD &&
+ !strstr(Title, " (HEAD)") &&
+ !strstr(Title, " - HEAD")) ? " (HEAD)" : ""));
+ ADD_SS(gettext("Linkname:"), temp);
+ FREE(temp);
+
+ dt_URL(fp0, doc->address);
+
+ if (HTLoadedDocumentCharset()) {
+ ADD_SS(gettext("Charset:"),
+ HTLoadedDocumentCharset());
+ } else {
+ LYUCcharset *p_in = HTAnchor_getUCInfoStage(HTMainAnchor,
+ UCT_STAGE_PARSER);
+
+ if (!p_in || isEmpty(p_in->MIMEname) ||
+ HTAnchor_getUCLYhndl(HTMainAnchor, UCT_STAGE_PARSER) < 0) {
+ p_in = HTAnchor_getUCInfoStage(HTMainAnchor, UCT_STAGE_MIME);
+ }
+ if (p_in && non_empty(p_in->MIMEname) &&
+ HTAnchor_getUCLYhndl(HTMainAnchor, UCT_STAGE_MIME) >= 0) {
+ HTSprintf(&temp, "%s %s",
+ LYEntifyTitle(&buffer, p_in->MIMEname),
+ gettext("(assumed)"));
+ ADD_SS(gettext("Charset:"), p_in->MIMEname);
+ FREE(temp);
+ }
+ }
+
+ if ((cp = HText_getServer()) != NULL && *cp != '\0')
+ ADD_SS(gettext("Server:"), cp);
+
+ if ((cp = HText_getDate()) != NULL && *cp != '\0')
+ ADD_SS(gettext("Date:"), cp);
+
+ if ((cp = HText_getLastModified()) != NULL && *cp != '\0')
+ ADD_SS(gettext("Last Mod:"), cp);
+
+ if (LYInfoAdvanced) {
+ if (HTMainAnchor && HTMainAnchor->expires) {
+ ADD_SS(gettext("Expires:"), HTMainAnchor->expires);
+ }
+ if (HTMainAnchor && HTMainAnchor->cache_control) {
+ ADD_SS(gettext("Cache-Control:"), HTMainAnchor->cache_control);
+ }
+ if (HTMainAnchor && HTMainAnchor->content_length > 0) {
+ ADD_NN(gettext("Content-Length:"),
+ HTMainAnchor->content_length,
+ gettext("bytes"));
+ } else {
+ ADD_NN(gettext("Length:"),
+ HText_getNumOfBytes(),
+ gettext("bytes"));
+ }
+ if (HTMainAnchor && HTMainAnchor->content_language) {
+ ADD_SS(gettext("Language:"), HTMainAnchor->content_language);
+ }
+ }
+
+ if (doc->post_data) {
+ fprintf(fp0, "<dt><em>%s</em> <xmp>%.*s</xmp>\n",
+ LYEntifyTitle(&buffer, gettext("Post Data:")),
+ BStrLen(doc->post_data),
+ BStrData(doc->post_data));
+ ADD_SS(gettext("Post Content Type:"), doc->post_content_type);
+ }
+
+ ADD_SS(gettext("Owner(s):"),
+ (owner_address
+ ? owner_address
+ : NO_NOTHING));
+
+ ADD_NN(gettext("size:"),
+ HText_getNumOfLines(),
+ gettext("lines"));
+
+ StrAllocCopy(temp,
+ ((lynx_mode == FORMS_LYNX_MODE)
+ ? gettext("forms mode")
+ : (HTisDocumentSource()
+ ? gettext("source")
+ : gettext("normal"))));
+ if (doc->safe)
+ StrAllocCat(temp, gettext(", safe"));
+ if (doc->internal_link)
+ StrAllocCat(temp, gettext(", via internal link"));
+
+ if (LYInfoAdvanced) {
+ if (HText_hasNoCacheSet(HTMainText))
+ StrAllocCat(temp, gettext(", no-cache"));
+ if (HTAnchor_isISMAPScript((HTAnchor *) HTMainAnchor))
+ StrAllocCat(temp, gettext(", ISMAP script"));
+ if (doc->bookmark)
+ StrAllocCat(temp, gettext(", bookmark file"));
+ }
+
+ ADD_SS(gettext("mode:"), temp);
+ FREE(temp);
+
+ END_DL();
+
+ if (nlinks > 0) {
+ BEGIN_DL(gettext("Link that you currently have selected"));
+ ADD_SS(gettext("Linkname:"),
+ LYGetHiliteStr(doc->link, 0));
+ if (lynx_mode == FORMS_LYNX_MODE &&
+ links[doc->link].type == WWW_FORM_LINK_TYPE) {
+ if (links[doc->link].l_form->submit_method) {
+ int method = links[doc->link].l_form->submit_method;
+ char *enctype = links[doc->link].l_form->submit_enctype;
+
+ ADD_SS(gettext("Method:"),
+ ((method == URL_POST_METHOD) ? "POST" :
+ ((method == URL_MAIL_METHOD) ? "(email)" :
+ "GET")));
+ ADD_SS(gettext("Enctype:"),
+ (non_empty(enctype)
+ ? enctype
+ : "application/x-www-form-urlencoded"));
+ }
+ if (links[doc->link].l_form->submit_action) {
+ ADD_SS(gettext("Action:"),
+ links[doc->link].l_form->submit_action);
+ }
+ if (!(links[doc->link].l_form->submit_method &&
+ links[doc->link].l_form->submit_action)) {
+ fprintf(fp0, "<dt>&nbsp;%s\n",
+ LYEntifyTitle(&buffer, gettext("(Form field)")));
+ }
+ } else {
+ dt_URL(fp0, NonNull(links[doc->link].lname));
+ }
+ END_DL();
+
+ } else {
+ fprintf(fp0, "<h2>%s</h2>",
+ LYEntifyTitle(&buffer,
+ gettext("No Links on the current page")));
+ }
+
+ if ((cp = HText_getHttpHeaders()) != 0) {
+ fprintf(fp0, "<h2>%s</h2>",
+ LYEntifyTitle(&buffer, gettext("Server Headers:")));
+ fprintf(fp0, "<pre>%s</pre>",
+ LYEntifyTitle(&buffer, cp));
+ }
+#ifdef DIRED_SUPPORT
+ }
+#endif /* DIRED_SUPPORT */
+ EndInternalPage(fp0);
+
+ LYrefresh();
+
+ LYCloseTemp(tempfile);
+ FREE(Title);
+ FREE(buffer);
+
+ return (0);
+}
diff --git a/src/LYShowInfo.h b/src/LYShowInfo.h
new file mode 100644
index 0000000..443bff3
--- /dev/null
+++ b/src/LYShowInfo.h
@@ -0,0 +1,21 @@
+#ifndef LYSHOWINFO_H
+#define LYSHOWINFO_H
+
+#ifndef LYSTRUCTS_H
+#include <LYStructs.h>
+#endif /* LYSTRUCTS_H */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ extern BOOL LYVersionIsRelease(void);
+ extern const char *LYVersionStatus(void);
+ extern const char *LYVersionDate(void);
+ extern int LYShowInfo(DocInfo *doc,
+ DocInfo *newdoc,
+ char *owner_address);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* LYSHOWINFO_H */
diff --git a/src/LYSignal.h b/src/LYSignal.h
new file mode 100644
index 0000000..627edb3
--- /dev/null
+++ b/src/LYSignal.h
@@ -0,0 +1,31 @@
+#ifndef LYSIGNAL_H
+#define LYSIGNAL_H
+
+#include <signal.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#ifdef VMS
+ extern void VMSsignal(int sig, void (*func) ());
+
+#ifdef signal
+#undef signal
+#endif /* signal */
+#define signal(a,b) VMSsignal(a,b) /* use LYCurses.c routines for interrupts */
+#endif /* VMS */
+
+#ifdef HAVE_SIGACTION
+ typedef void LYSigHandlerFunc_t (int);
+
+/* implementation in LYUtils.c */
+ extern void LYExtSignal(int sig, LYSigHandlerFunc_t *handler);
+
+#else
+#define LYExtSignal(sig,h) signal(sig, h)
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* LYSIGNAL_H */
diff --git a/src/LYStrings.c b/src/LYStrings.c
new file mode 100644
index 0000000..8199c2c
--- /dev/null
+++ b/src/LYStrings.c
@@ -0,0 +1,6236 @@
+/* $LynxId: LYStrings.c,v 1.280 2023/01/03 00:11:49 Jens.Schleusener Exp $ */
+#include <HTUtils.h>
+#include <HTCJK.h>
+#include <UCAux.h>
+#include <LYGlobalDefs.h>
+#include <LYUtils.h>
+#include <LYStrings.h>
+#include <GridText.h>
+#include <LYKeymap.h>
+#include <LYClean.h>
+#include <LYMail.h>
+#include <LYNews.h>
+#include <LYOptions.h>
+#include <LYCharSets.h>
+#include <HTAlert.h>
+#include <HTString.h>
+#include <LYCharUtils.h>
+#include <HTList.h>
+#include <HTParse.h>
+#ifdef USE_MOUSE
+#include <LYMainLoop.h>
+#endif
+
+#ifdef DJGPP_KEYHANDLER
+#include <pc.h>
+#include <keys.h>
+#endif /* DJGPP_KEYHANDLER */
+
+#ifdef USE_COLOR_STYLE
+#include <LYHash.h>
+#include <AttrList.h>
+#endif
+
+#ifdef USE_SCROLLBAR
+#include <LYMainLoop.h>
+#endif
+
+#ifdef USE_CMD_LOGGING
+#include <LYReadCFG.h>
+#include <LYrcFile.h>
+#endif
+
+#include <LYShowInfo.h>
+#include <LYLeaks.h>
+
+#if defined(WIN_EX)
+#undef BUTTON_CTRL
+#define BUTTON_CTRL 0 /* Quick hack */
+#endif
+
+#ifdef DEBUG_EDIT
+#define CTRACE_EDIT(p) CTRACE(p)
+#else
+#define CTRACE_EDIT(p) /*nothing */
+#endif
+
+#ifdef SUPPORT_MULTIBYTE_EDIT
+#define IsWordChar(c) (isalnum(UCH(c)) || is8bits(c))
+#else
+#define IsWordChar(c) isalnum(UCH(c))
+#endif
+
+/*
+ * The edit_history lists allow the user to press tab when entering URL to get
+ * the closest match in the closet
+ */
+#define LYClosetSize 100
+
+static HTList *URL_edit_history;
+static HTList *MAIL_edit_history;
+
+/* If you want to add mouse support for some new platform, it's fairly
+ * simple to do. Once you've determined the X and Y coordinates of
+ * the mouse event, loop through the elements in the links[] array and
+ * see if the coordinates fall within a highlighted link area. If so,
+ * the code must set mouse_link to the index of the chosen link,
+ * and return a key value that corresponds to LYK_ACTIVATE. The
+ * LYK_ACTIVATE code in LYMainLoop.c will then check mouse_link
+ * and activate that link. If the mouse event didn't fall within a
+ * link, the code should just set mouse_link to -1 and return -1. --AMK
+ */
+
+/* The number of the link selected w/ the mouse (-1 if none) */
+static int mouse_link = -1;
+
+static int have_levent;
+
+#if defined(USE_MOUSE) && defined(NCURSES)
+static MEVENT levent;
+#endif
+
+/* Return the value of mouse_link */
+int peek_mouse_levent(void)
+{
+#if defined(USE_MOUSE) && defined(NCURSES)
+ if (have_levent > 0) {
+ ungetmouse(&levent);
+ have_levent--;
+ return 1;
+ }
+#endif
+ return 0;
+}
+
+/* Return the value of mouse_link, erasing it */
+int get_mouse_link(void)
+{
+ int t;
+
+ t = mouse_link;
+ mouse_link = -1;
+ if (t < 0)
+ t = -1; /* Backward compatibility. */
+ return t;
+}
+
+/* Return the value of mouse_link */
+int peek_mouse_link(void)
+{
+ return mouse_link;
+}
+
+int fancy_mouse(WINDOW * win, int row,
+ int *position)
+{
+ int cmd = LYK_DO_NOTHING;
+
+#ifdef USE_MOUSE
+/*********************************************************************/
+
+#if defined(WIN_EX) && defined(PDCURSES)
+
+ request_mouse_pos();
+
+ if (BUTTON_STATUS(1)
+ && (MOUSE_X_POS >= getbegx(win) &&
+ MOUSE_X_POS < (getbegx(win) + getmaxx(win)))) {
+ int mypos = MOUSE_Y_POS - getbegy(win);
+ int delta = mypos - row;
+
+ if (mypos + 1 == getmaxy(win)) {
+ /* At the decorative border: scroll forward */
+ if (BUTTON_STATUS(1) & BUTTON1_TRIPLE_CLICKED)
+ cmd = LYK_END;
+ else if (BUTTON_STATUS(1) & BUTTON1_DOUBLE_CLICKED)
+ cmd = LYK_NEXT_PAGE;
+ else
+ cmd = LYK_NEXT_LINK;
+ } else if (mypos >= getmaxy(win)) {
+ if (BUTTON_STATUS(1) & (BUTTON1_DOUBLE_CLICKED | BUTTON1_TRIPLE_CLICKED))
+ cmd = LYK_END;
+ else
+ cmd = LYK_NEXT_PAGE;
+ } else if (mypos == 0) {
+ /* At the decorative border: scroll back */
+ if (BUTTON_STATUS(1) & BUTTON1_TRIPLE_CLICKED)
+ cmd = LYK_HOME;
+ else if (BUTTON_STATUS(1) & BUTTON1_DOUBLE_CLICKED)
+ cmd = LYK_PREV_PAGE;
+ else
+ cmd = LYK_PREV_LINK;
+ } else if (mypos < 0) {
+ if (BUTTON_STATUS(1) & (BUTTON1_DOUBLE_CLICKED | BUTTON1_TRIPLE_CLICKED))
+ cmd = LYK_HOME;
+ else
+ cmd = LYK_PREV_PAGE;
+#ifdef KNOW_HOW_TO_TOGGLE
+ } else if (BUTTON_STATUS(1) & (BUTTON_CTRL)) {
+ cur_selection += delta;
+ cmd = LYX_TOGGLE;
+#endif
+ } else if (BUTTON_STATUS(1) & (BUTTON_ALT | BUTTON_SHIFT | BUTTON_CTRL)) {
+ /* Probably some unrelated activity, such as selecting some text.
+ * Select, but do nothing else.
+ */
+ *position += delta;
+ cmd = -1;
+ } else {
+ /* No scrolling or overflow checks necessary. */
+ *position += delta;
+ cmd = LYK_ACTIVATE;
+ }
+ } else if (BUTTON_STATUS(1) & (BUTTON3_CLICKED | BUTTON3_DOUBLE_CLICKED | BUTTON3_TRIPLE_CLICKED)) {
+ cmd = LYK_QUIT;
+ }
+#else
+#if defined(NCURSES)
+#define ButtonModifiers (BUTTON_ALT | BUTTON_SHIFT | BUTTON_CTRL)
+ MEVENT event;
+
+ getmouse(&event);
+ if ((event.bstate & (BUTTON1_CLICKED |
+ BUTTON1_DOUBLE_CLICKED |
+ BUTTON1_TRIPLE_CLICKED))) {
+ int mypos = event.y - getbegy(win);
+ int delta = mypos - row;
+
+ if ((event.x < getbegx(win) ||
+ event.x >= (getbegx(win) + getmaxx(win)))
+ && !(event.bstate & ButtonModifiers))
+ return LYK_QUIT; /* User clicked outside, wants to quit? */
+ if (mypos + 1 == getmaxy(win)) {
+ /* At the decorative border: scroll forward */
+ if (event.bstate & BUTTON1_TRIPLE_CLICKED)
+ cmd = LYK_END;
+ else if (event.bstate & BUTTON1_DOUBLE_CLICKED)
+ cmd = LYK_NEXT_PAGE;
+ else
+ cmd = LYK_NEXT_LINK;
+ } else if (mypos >= getmaxy(win)) {
+ if (event.bstate & (BUTTON1_DOUBLE_CLICKED |
+ BUTTON1_TRIPLE_CLICKED))
+ cmd = LYK_END;
+ else
+ cmd = LYK_NEXT_PAGE;
+ } else if (mypos == 0) {
+ /* At the decorative border: scroll back */
+ if (event.bstate & BUTTON1_TRIPLE_CLICKED)
+ cmd = LYK_HOME;
+ else if (event.bstate & BUTTON1_DOUBLE_CLICKED)
+ cmd = LYK_PREV_PAGE;
+ else
+ cmd = LYK_PREV_LINK;
+ } else if (mypos < 0) {
+ if (event.bstate & (BUTTON1_DOUBLE_CLICKED |
+ BUTTON1_TRIPLE_CLICKED))
+ cmd = LYK_HOME;
+ else
+ cmd = LYK_PREV_PAGE;
+#ifdef KNOW_HOW_TO_TOGGLE
+ } else if (event.bstate & (BUTTON_CTRL)) {
+ cur_selection += delta;
+ cmd = LYX_TOGGLE;
+#endif
+ } else if (event.x <= getbegx(win) + 1 ||
+ event.x >= getbegx(win) + getmaxx(win) - 2) {
+ /* Click on left or right border for positioning without
+ * immediate action: select, but do nothing else.
+ * Actually, allow an error of one position inwards. - kw
+ */
+ *position += delta;
+ cmd = -1;
+ } else if (event.bstate & ButtonModifiers) {
+ /* Probably some unrelated activity, such as selecting some text.
+ * Select, but do nothing else.
+ */
+ /* Possibly this is never returned by ncurses, so this case
+ * may be useless depending on situation (kind of mouse support
+ * and library versions). - kw
+ */
+ *position += delta;
+ cmd = -1;
+ } else {
+ /* No scrolling or overflow checks necessary. */
+ *position += delta;
+ cmd = LYK_ACTIVATE;
+ }
+ } else if (event.bstate & (BUTTON3_CLICKED | BUTTON3_DOUBLE_CLICKED | BUTTON3_TRIPLE_CLICKED)) {
+ cmd = LYK_QUIT;
+ }
+#endif /* NCURSES */
+#endif /* PDCURSES */
+
+/************************************************************************/
+#endif /* USE_MOUSE */
+ (void) win;
+ (void) row;
+ (void) position;
+
+ return cmd;
+}
+
+/*
+ * Manage the collection of edit-histories
+ */
+static HTList *whichRecall(RecallType recall)
+{
+ HTList **list;
+
+ switch (recall) {
+ case RECALL_CMD:
+ return LYcommandList();
+ case RECALL_MAIL:
+ list = &MAIL_edit_history;
+ break;
+ default:
+ list = &URL_edit_history;
+ break;
+ }
+ if (*list == 0)
+ *list = HTList_new();
+ return *list;
+}
+
+/*
+ * Remove the oldest item in the closet
+ */
+static void LYRemoveFromCloset(HTList *list)
+{
+ void *data = HTList_removeFirstObject(list);
+
+ if (data != 0)
+ FREE(data);
+}
+
+void LYCloseCloset(RecallType recall)
+{
+ HTList *list = whichRecall(recall);
+
+ while (!HTList_isEmpty(list)) {
+ LYRemoveFromCloset(list);
+ }
+ HTList_delete(list); /* should already be empty */
+}
+
+/*
+ * Strategy: We begin at the top and search downwards. We return the first
+ * match, i.e., the newest since we search from the top. This should be made
+ * more intelligent, but works for now.
+ */
+static char *LYFindInCloset(RecallType recall, char *base)
+{
+ HTList *list = whichRecall(recall);
+ char *data;
+ size_t len = strlen(base);
+
+ while (!HTList_isEmpty(list)) {
+ data = (char *) HTList_nextObject(list);
+ if (data != NULL && !StrNCmp(base, data, len))
+ return (data);
+ }
+
+ return (0);
+}
+
+static void LYAddToCloset(RecallType recall, char *str)
+{
+ HTList *list = whichRecall(recall);
+ char *data = NULL;
+
+ StrAllocCopy(data, str);
+ HTList_addObject(list, data);
+ while (HTList_count(list) > LYClosetSize)
+ LYRemoveFromCloset(list);
+}
+
+#ifdef USE_MOUSE
+static int XYdist(int x1,
+ int y1,
+ int x2,
+ int y2,
+ int dx2)
+{
+ int xerr = 3 * (x2 - x1), yerr = 9 * (y2 - y1);
+
+ if (xerr < 0)
+ xerr = 3 * (x1 - x2 - dx2) + 1; /* pos after string not really in it */
+ if (xerr < 0)
+ xerr = 0;
+ if (yerr < 0)
+ yerr = -yerr;
+ if (!yerr) /* same line is good */
+ return (xerr > 0) ? (xerr * 2 - 1) : 0;
+ if (xerr < 9 && yerr) /* x-dist of 3 cell better than y-dist of 1 cell */
+ yerr += (9 - xerr);
+ return 2 * xerr + yerr; /* Subjective factor; ratio -> approx. 6 / 9 */
+/*
+old: (IZ 1999-07-30)
+ 3 2 2 2 1 1 1 XX XX XX XX XX 0 1 1 1 2 2 2 3 3
+ 4\ 3 3 3 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3/ 4 4
+ 5 4 4 4\ 3 3 3 3 3 3 3 3 3 3 3 3/ 4 4 4 5 5
+ 6 5 5 5 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 6 5
+now: (kw 1999-10-23)
+41 35 29|23 17 11 5 XX XX XX XX XX 1 7 13 19 25|31 37 43 49
+ 45 39 33\27 24 21 18 18 18 18 18 19 22 25 28/34 40 46 50
+ 48 42 36 33 30\27 27 27 27 27 28/31 34 37 43 49
+ 51 45 42 39 36 36 36 36 36 37 40 43 46 49
+ 51 48 45 45 45 45 45 46 49 52
+*/
+}
+
+/* Given X and Y coordinates of a mouse event, set mouse_link to the
+ * index of the corresponding hyperlink, or set mouse_link to -1 if no
+ * link matches the event. Returns -1 if no link matched the click,
+ * or a keycode that must be returned from LYgetch() to activate the
+ * link.
+ */
+
+static int set_clicked_link(int x,
+ int y,
+ int code,
+ int clicks)
+{
+ int left = 6;
+ int right = LYcolLimit - 5;
+
+ /* yes, I am assuming that my screen will be a certain width. */
+ int i;
+ int c = -1;
+
+ if (y == (LYlines - 1) || y == 0) { /* First or last row */
+ /* XXXX In fact # is not always at x==0? KANJI_CODE_OVERRIDE? */
+ int toolbar = (y == 0 && HText_hasToolbar(HTMainText));
+
+ mouse_link = -2;
+ if (x == 0 && toolbar) /* On '#' */
+ c = LAC_TO_LKC0(LYK_TOOLBAR);
+#if defined(CAN_CUT_AND_PASTE) && defined(USE_COLOR_STYLE)
+ else if (y == 0 && x == LYcolLimit && s_hot_paste != NOSTYLE)
+ c = LAC_TO_LKC0(LYK_PASTE_URL);
+#endif
+ else if (clicks > 1) {
+ if (x < left + toolbar)
+ c = (code == FOR_PROMPT && y)
+ ? HOME_KEY : LAC_TO_LKC0(LYK_MAIN_MENU);
+ else if (x > right)
+ c = (code == FOR_PROMPT && y)
+ ? END_KEY : LAC_TO_LKC0(LYK_VLINKS);
+ else if (y) /* Last row */
+ c = LAC_TO_LKC0(LYK_END);
+ else /* First row */
+ c = LAC_TO_LKC0(LYK_HOME);
+ } else {
+ if (x < left + toolbar)
+ c = (code == FOR_PROMPT && y)
+ ? LTARROW_KEY
+ : (
+#ifdef USE_COLOR_STYLE
+ (s_forw_backw != NOSTYLE && x - toolbar >= 3)
+ ? LAC_TO_LKC0(LYK_NEXT_DOC)
+ : LAC_TO_LKC0(LYK_PREV_DOC)
+#else
+ LAC_TO_LKC0(LYK_NEXT_DOC)
+#endif
+ );
+ else if (x > right)
+ c = (code == FOR_PROMPT && y)
+ ? RTARROW_KEY : LAC_TO_LKC0(LYK_HISTORY);
+ else if (y) /* Last row */
+ c = LAC_TO_LKC0(LYK_NEXT_PAGE);
+ else /* First row */
+ c = LAC_TO_LKC0(LYK_PREV_PAGE);
+ }
+#ifdef USE_SCROLLBAR
+ } else if (x == (LYcols - 1) && LYShowScrollbar && LYsb_begin >= 0) {
+ int h = display_lines - 2 * (LYsb_arrow != 0);
+
+ mouse_link = -2;
+ y -= 1 + (LYsb_arrow != 0);
+ if (y < 0)
+ return LAC_TO_LKC0(LYK_UP_TWO);
+ if (y >= h)
+ return LAC_TO_LKC0(LYK_DOWN_TWO);
+
+ if (clicks >= 2) {
+ double frac = (1. * y) / (h - 1);
+ int l = HText_getNumOfLines() + 1; /* NOL() off by one? */
+
+ l -= display_lines;
+ if (l > 0)
+ LYSetNewline((int) (frac * l + 1 + 0.5));
+ return LYReverseKeymap(LYK_DO_NOTHING);
+ }
+
+ if (y < LYsb_begin)
+ return LAC_TO_LKC0(LYK_PREV_PAGE);
+ if (y >= LYsb_end)
+ return LAC_TO_LKC0(LYK_NEXT_PAGE);
+ mouse_link = -1; /* No action in edit fields */
+#endif
+ } else {
+ int mouse_err = 29, /* subjctv-dist better than this for approx stuff */ cur_err;
+
+ /* Loop over the links and see if we can get a match */
+ for (i = 0; i < nlinks; i++) {
+ int len, lx = links[i].lx, is_text = 0;
+ int count = 0;
+ const char *text = LYGetHiliteStr(i, count);
+
+ if (links[i].type == WWW_FORM_LINK_TYPE
+ && F_TEXTLIKE(links[i].l_form->type))
+ is_text = 1;
+
+ /* Check the first line of the link */
+ if (text != NULL) {
+ if (is_text)
+ len = links[i].l_form->size;
+ else
+ len = (int) LYstrCells(text);
+ cur_err = XYdist(x, y, links[i].lx, links[i].ly, len);
+ /* Check the second line */
+ while (cur_err > 0
+ && (text = LYGetHiliteStr(i, ++count)) != NULL) {
+ /* Note that there is at most one hightext if is_text */
+ int cur_err_2 = XYdist(x, y,
+ LYGetHilitePos(i, count),
+ links[i].ly + count,
+ (int) LYstrCells(text));
+
+ cur_err = HTMIN(cur_err, cur_err_2);
+ }
+ if (cur_err > 0 && is_text)
+ cur_err--; /* a bit of preference for text fields,
+ enter field if hit exactly at end - kw */
+ if (cur_err == 0) {
+ int cury, curx;
+
+ LYGetYX(cury, curx);
+ /* double-click, if we care:
+ submit text submit fields. - kw */
+ if (clicks > 1 && is_text &&
+ links[i].l_form->type == F_TEXT_SUBMIT_TYPE) {
+ if (code != FOR_INPUT
+ /* submit current input field directly */
+ || !(cury == y &&
+ (curx >= lx) &&
+ ((curx - lx) <= len))) {
+ c = LAC_TO_LKC0(LYK_MOUSE_SUBMIT);
+ mouse_link = i;
+ } else {
+ c = LAC_TO_LKC0(LYK_MOUSE_SUBMIT);
+ mouse_link = -1;
+ }
+ mouse_err = 0;
+ break;
+ }
+ if (code != FOR_INPUT
+ /* Do not pick up the current input field */
+ || !((cury == y && (curx >= lx) && ((curx - lx) <= len)))) {
+ if (is_text) {
+ have_levent = 1;
+#if defined(TEXTFIELDS_MAY_NEED_ACTIVATION) && defined(INACTIVE_INPUT_STYLE_VH)
+ if (x == links[i].lx && y == links[i].ly)
+ textinput_redrawn = FALSE;
+#endif /* TEXTFIELDS_MAY_NEED_ACTIVATION && INACTIVE_INPUT_STYLE_VH */
+ }
+ mouse_link = i;
+ } else
+ mouse_link = -1;
+ mouse_err = 0;
+ break;
+ } else if (cur_err < mouse_err) {
+ mouse_err = cur_err;
+ mouse_link = i;
+ }
+ }
+ }
+ /*
+ * If a link was hit, we must look for a key which will activate
+ * LYK_ACTIVATE We expect to find LYK_ACTIVATE (it's usually mapped to
+ * the Enter key).
+ */
+ if (mouse_link >= 0) {
+ if (mouse_err == 0) {
+ if (c == -1)
+ c = LAC_TO_LKC0(LYK_ACTIVATE);
+ } else if (mouse_err >= 0)
+ c = LAC_TO_LKC0(LYK_CHANGE_LINK);
+ } else {
+ if (2 * y > LYlines) { /* Bottom Half of the screen */
+ if (4 * y < 3 * LYlines) {
+ c = LAC_TO_LKC0(LYK_DOWN_TWO); /* Third quarter */
+ } else
+ c = LAC_TO_LKC0(LYK_DOWN_HALF); /* Fourth quarter */
+ } else { /* Upper Half of the screen */
+ if (4 * y < LYlines) {
+ c = LAC_TO_LKC0(LYK_UP_HALF); /* First quarter */
+ } else
+ c = LAC_TO_LKC0(LYK_UP_TWO); /* Second quarter */
+ }
+ }
+ }
+ return c;
+}
+#endif /* USE_MOUSE */
+
+/*
+ * LYstrncpy() ensures that the copied strings end with a nul byte.
+ * The nul is written to the n+1 position of the target.
+ */
+char *LYstrncpy(char *target,
+ const char *source,
+ int n)
+{
+ char *val = target;
+ int len;
+
+ if (source == 0)
+ source = "";
+ len = (int) strlen(source);
+
+ if (n > 0) {
+ if (n > len)
+ n = len;
+ (void) memcpy(target, source, (size_t) n);
+ } else {
+ n = 0;
+ }
+ target[n] = '\0';
+ return val;
+}
+
+#define IS_NEW_GLYPH(ch) (utf_flag && (UCH(ch)&0xc0) != 0x80)
+#define IS_UTF_EXTRA(ch) (utf_flag && (UCH(ch)&0xc0) == 0x80)
+
+/*
+ * LYmbcsstrncpy() terminates strings with a null byte. It takes account of
+ * multibyte characters. The source string is copied until either end of string
+ * or max number of either bytes or glyphs (mbcs sequences) (CJK or UTF8). The
+ * utf_flag argument should be TRUE for UTF8. - KW & FM
+ */
+char *LYmbcsstrncpy(char *target,
+ const char *source,
+ int n_bytes,
+ int n_glyphs,
+ int utf_flag)
+{
+ char *val = target;
+ int i_bytes = 0, i_glyphs = 0;
+
+ if (n_bytes < 0)
+ n_bytes = 0;
+ if (n_glyphs < 0)
+ n_glyphs = 0;
+
+ for (; *source != '\0' && i_bytes < n_bytes; i_bytes++) {
+ if (IS_NEW_GLYPH(*source)) {
+ if (i_glyphs++ >= n_glyphs) {
+ *target = '\0';
+ return val;
+ }
+ }
+ *(target++) = *(source++);
+ }
+ *target = '\0';
+
+ return val;
+}
+
+/*
+ * LYmbcs_skip_glyphs() skips a given number of character positions in a string
+ * and returns the resulting pointer. It takes account of UTF-8 encoded
+ * characters. - KW
+ */
+const char *LYmbcs_skip_glyphs(const char *data,
+ int n_glyphs,
+ int utf_flag)
+{
+ int i_glyphs = 0;
+
+ if (n_glyphs < 0)
+ n_glyphs = 0;
+
+ if (non_empty(data)) {
+ if (!utf_flag) {
+ while (n_glyphs-- > 0) {
+ if (!*++data)
+ break;
+ }
+ } else {
+ while (*data) {
+ if (IS_NEW_GLYPH(*data)) {
+ if (i_glyphs++ >= n_glyphs) {
+ break;
+ }
+ }
+ data++;
+ }
+ }
+ }
+ return data;
+}
+
+/*
+ * LYmbcs_skip_cells() skips a given number of display positions in a string
+ * and returns the resulting pointer. It takes account of UTF-8 encoded
+ * characters. - TD
+ */
+const char *LYmbcs_skip_cells(const char *data,
+ int n_cells,
+ int utf_flag)
+{
+ const char *result;
+ int actual;
+ int target = n_cells;
+
+ do {
+ result = LYmbcs_skip_glyphs(data, target--, utf_flag);
+ actual = LYstrExtent2(data, (int) (result - data));
+ } while ((actual > 0) && (actual > n_cells));
+ return result;
+}
+
+/*
+ * LYmbcsstrlen() returns the printable length of a string that might contain
+ * IsSpecial or multibyte (CJK or UTF8) characters. - FM
+ *
+ * Counts glyph cells if count_gcells is set. (Full-width characters in CJK
+ * mode count as two.) Counts character glyphs if count_gcells is unset.
+ * (Full- width characters in CJK mode count as one.) - kw
+ */
+int LYmbcsstrlen(const char *str,
+ int utf_flag,
+ int count_gcells)
+{
+ int i, j, len = 0;
+
+ if (non_empty(str)) {
+#ifdef WIDEC_CURSES
+ if (count_gcells) {
+ len = LYstrCells(str);
+ } else
+#endif
+ {
+ for (i = 0; str[i] != '\0'; i++) {
+ if (!IsSpecialAttrChar(str[i])) {
+ len++;
+ if (IS_NEW_GLYPH(str[i])) {
+ j = 0;
+ while (IsNormalChar(str[(i + 1)]) &&
+ j < 5 &&
+ IS_UTF_EXTRA(str[(i + 1)])) {
+ i++;
+ j++;
+ }
+ } else if (!utf_flag && IS_CJK_TTY && !count_gcells &&
+ is8bits(str[i]) &&
+ IsNormalChar(str[(i + 1)])) {
+ i++;
+ }
+ }
+ }
+ }
+ }
+ return (len);
+}
+
+#undef GetChar
+
+#ifdef USE_SLANG
+#if defined(VMS)
+#define GetChar() ttgetc()
+#elif defined(__DJGPP__)
+#define GetChar() getxkey() /* HTDos.c */
+#elif defined(__CYGWIN__)
+#define GetChar SLkp_getkey
+#else
+#define GetChar (int)SLang_getkey
+#endif
+#else /* curses */
+#if defined(DJGPP)
+#define GetChar() (djgpp_idle_loop(), wgetch(LYtopwindow()))
+#elif defined(NCURSES_VERSION) && defined(__BEOS__)
+#define GetChar() myGetCharNodelay()
+#elif defined(NCURSES)
+#define GetChar() wgetch(LYtopwindow())
+#endif
+#endif
+
+#ifdef USE_CURSES_NODELAY
+/* PDCurses - until version 2.7 in 2005 - defined ERR as 0, unlike other
+ * versions of curses. Generally both EOF and ERR are defined as -1's.
+ * However, there is a special case (see HTCheckForInterrupt()) to handle a
+ * case where no select() function is used in the win32 environment.
+ *
+ * HTCheckForInterrupt() uses nodelay() in this special case to check for
+ * pending input. That normally returns ERR. But LYgetch_for() checks the
+ * return value of this function for EOF (to handle some antique runtime
+ * libraries which did not set the state for feof/ferror). Returning a zero
+ * (0) is safer since normally that is not mapped to any commands, and will be
+ * ignored by lynx.
+ */
+static int myGetCharNodelay(void)
+{
+ int c = wgetch(LYwin);
+
+ if (c == -1)
+ c = 0;
+
+ return c;
+}
+#else
+#define myGetCharNodelay() wgetch(LYwin)
+#endif
+
+#if !defined(GetChar) && defined(PDCURSES) && defined(PDC_BUILD) && PDC_BUILD >= 2401
+/* PDCurses sends back key-modifiers that we don't use, but would waste time
+ * upon, e.g., repainting the status line
+ */
+static int myGetChar(void)
+{
+ int c;
+ BOOL done = FALSE;
+
+ do {
+ switch (c = myGetCharNodelay()) {
+ case KEY_SHIFT_L:
+ case KEY_SHIFT_R:
+ case KEY_CONTROL_L:
+ case KEY_CONTROL_R:
+ case KEY_ALT_L:
+ case KEY_ALT_R:
+ case KEY_RESIZE:
+ break;
+ default:
+ done = TRUE;
+ break;
+ }
+ } while (!done);
+
+ return c;
+}
+#define GetChar() myGetChar()
+#endif
+
+#if !defined(GetChar) && defined(VMS)
+#define GetChar() ttgetc()
+#endif
+
+#if !defined(GetChar)
+#ifdef HAVE_KEYPAD
+#define GetChar() getch()
+#else
+#ifndef USE_GETCHAR
+#define USE_GETCHAR
+#endif /* !USE_GETCHAR */
+#define GetChar() getchar() /* used to be "getc(stdin)" and "getch()" */
+#endif /* HAVE_KEYPAD */
+#endif /* !defined(GetChar) */
+
+#if defined(USE_SLANG) && defined(USE_MOUSE)
+static int sl_parse_mouse_event(int *x, int *y, int *button)
+{
+ /* "ESC [ M" has already been processed. There more characters are
+ * expected: BUTTON X Y
+ */
+ *button = (int) SLang_getkey();
+ switch (*button) {
+ case 040: /* left button */
+ case 041: /* middle button */
+ case 042: /* right button */
+ *button -= 040;
+ break;
+
+ default: /* Hmmm.... */
+ SLang_flush_input();
+ return -1;
+ }
+
+ *x = (int) SLang_getkey();
+ if (*x == CH_ESC) /* Undo 7-bit replace for large x - kw */
+ *x = (int) SLang_getkey() + 64 - 33;
+ else
+ *x -= 33;
+ *y = (int) SLang_getkey();
+ if (*y == CH_ESC) /* Undo 7-bit replace for large y - kw */
+ *y = (int) SLang_getkey() + 64 - 33;
+ else
+ *y -= 33;
+ return 0;
+}
+
+static int sl_read_mouse_event(int code)
+{
+ int mouse_x, mouse_y, button;
+
+ mouse_link = -1;
+ if (-1 != sl_parse_mouse_event(&mouse_x, &mouse_y, &button)) {
+ if (button == 0) /* left */
+ return set_clicked_link(mouse_x, mouse_y, FOR_PANEL, 1);
+
+ if (button == 1) /* middle */
+ return LYReverseKeymap(LYK_VIEW_BOOKMARK);
+
+ if (button == 2) /* right */
+ {
+ /* Right button: go back to prev document.
+ * The problem is that we need to determine
+ * what to return to achieve this.
+ */
+ return LYReverseKeymap(LYK_PREV_DOC);
+ }
+ }
+ if (code == FOR_INPUT || code == FOR_PROMPT)
+ return DO_NOTHING;
+ else
+ return -1;
+}
+#endif /* USE_SLANG and USE_MOUSE */
+
+static BOOLEAN csi_is_csi = TRUE;
+void ena_csi(int flag)
+{
+ csi_is_csi = (BOOLEAN) flag;
+}
+
+#if defined(USE_KEYMAPS)
+
+#ifdef USE_SLANG
+#define define_key(string, code) \
+ SLkm_define_keysym ((SLFUTURE_CONST char*)(string), \
+ (unsigned) code, \
+ Keymap_List)
+#if SLANG_VERSION < 20000
+#define expand_substring(target, first, last, final) \
+ (SLexpand_escaped_string(target, \
+ DeConst(first), \
+ DeConst(last), 1)
+static int SLang_get_error(void)
+{
+ return SLang_Error;
+}
+#else
+int LY_Slang_UTF8_Mode = 0;
+
+#define expand_substring(target, first, last, final) \
+ (SLexpand_escaped_string(target, \
+ DeConst(first), \
+ DeConst(last), \
+ LY_Slang_UTF8_Mode), 1)
+#endif
+
+static SLKeyMap_List_Type *Keymap_List;
+
+/* This value should be larger than anything in LYStrings.h */
+#define MOUSE_KEYSYM 0x0400
+#endif
+
+/*
+ * For ncurses, we use the predefined keysyms, since that lets us also reuse
+ * the CSI logic and other special cases for VMS, NCSA telnet, etc.
+ */
+#ifdef USE_SLANG
+# ifdef VMS
+# define EXTERN_KEY(string,string1,lynx,curses) {string,lynx}
+# else
+# define EXTERN_KEY(string,string1,lynx,curses) {string,lynx},{string1,lynx}
+# endif
+# define INTERN_KEY(string,lynx,curses) {string,lynx,lynx}
+#else
+# define INTERN_KEY(string,lynx,curses) {string,curses,lynx}
+# define EXTERN_KEY(string,string1,lynx,curses) {string,curses,lynx}
+#endif
+
+typedef struct {
+ const char *string;
+ int value;
+ LYExtraKeys internal;
+} Keysym_String_List;
+/* *INDENT-OFF* */
+static Keysym_String_List Keysym_Strings [] =
+{
+ INTERN_KEY( "UPARROW", UPARROW_KEY, KEY_UP ),
+ INTERN_KEY( "DNARROW", DNARROW_KEY, KEY_DOWN ),
+ INTERN_KEY( "RTARROW", RTARROW_KEY, KEY_RIGHT ),
+ INTERN_KEY( "LTARROW", LTARROW_KEY, KEY_LEFT ),
+ INTERN_KEY( "PGDOWN", PGDOWN_KEY, KEY_NPAGE ),
+ INTERN_KEY( "PGUP", PGUP_KEY, KEY_PPAGE ),
+ INTERN_KEY( "HOME", HOME_KEY, KEY_HOME ),
+ INTERN_KEY( "END", END_KEY, KEY_END ),
+ INTERN_KEY( "F1", F1_KEY, KEY_F(1) ),
+ INTERN_KEY( "F2", F2_KEY, KEY_F(2) ),
+ INTERN_KEY( "F3", F3_KEY, KEY_F(3) ),
+ INTERN_KEY( "F4", F4_KEY, KEY_F(4) ),
+ INTERN_KEY( "F5", F5_KEY, KEY_F(5) ),
+ INTERN_KEY( "F6", F6_KEY, KEY_F(7) ),
+ INTERN_KEY( "F7", F7_KEY, KEY_F(7) ),
+ INTERN_KEY( "F8", F8_KEY, KEY_F(8) ),
+ INTERN_KEY( "F9", F9_KEY, KEY_F(9) ),
+ INTERN_KEY( "F10", F10_KEY, KEY_F(10) ),
+ INTERN_KEY( "F11", F11_KEY, KEY_F(11) ),
+ INTERN_KEY( "F12", F12_KEY, KEY_F(12) ),
+ INTERN_KEY( "DO_KEY", DO_KEY, KEY_F(16) ),
+ INTERN_KEY( "FIND_KEY", FIND_KEY, KEY_FIND ),
+ INTERN_KEY( "SELECT_KEY", SELECT_KEY, KEY_SELECT ),
+ INTERN_KEY( "INSERT_KEY", INSERT_KEY, KEY_IC ),
+ INTERN_KEY( "REMOVE_KEY", REMOVE_KEY, KEY_DC ),
+ INTERN_KEY( "DO_NOTHING", DO_NOTHING, DO_NOTHING|LKC_ISLKC ),
+ INTERN_KEY( "BACKTAB_KEY", BACKTAB_KEY, BACKTAB_KEY ),
+ INTERN_KEY( NULL, UNKNOWN_KEY, ERR )
+};
+/* *INDENT-ON* */
+
+#ifdef NCURSES_VERSION
+/*
+ * Ncurses stores the termcap/terminfo names in arrays sorted to match the
+ * array of strings in the TERMTYPE struct.
+ */
+static int lookup_tiname(char *name, NCURSES_CONST char *const *names)
+{
+ int code;
+
+ for (code = 0; names[code] != 0; code++)
+ if (!strcmp(names[code], name))
+ return code;
+ return -1;
+}
+
+static const char *expand_tiname(const char *first, size_t len, char **result, char *final)
+{
+ char name[BUFSIZ];
+ int code;
+ TERMTYPE *tp = (TERMTYPE *) (cur_term);
+
+ LYStrNCpy(name, first, len);
+ **result = '\0';
+ if ((code = lookup_tiname(name, strnames)) >= 0
+ || (code = lookup_tiname(name, strfnames)) >= 0) {
+ if (tp->Strings[code] != 0) {
+ LYStrNCpy(*result, tp->Strings[code], (final - *result));
+ (*result) += strlen(*result);
+ }
+ }
+ return first + len;
+}
+
+static const char *expand_tichar(const char *first, char **result, char *final)
+{
+ int ch;
+ int limit = 0;
+ int radix = 0;
+ int value = 0;
+ const char *name = 0;
+
+ switch (ch = *first++) {
+ case 'E':
+ case 'e':
+ value = 27;
+ break;
+ case 'a':
+ name = "bel";
+ break;
+ case 'b':
+ value = '\b';
+ break;
+ case 'f':
+ value = '\f';
+ break;
+ case 'n':
+ value = '\n';
+ break;
+ case 'r':
+ value = '\r';
+ break;
+ case 't':
+ value = '\t';
+ break;
+ case 'v':
+ value = '\v';
+ break;
+ case 'd':
+ radix = 10;
+ limit = 3;
+ break;
+ case 'x':
+ radix = 16;
+ limit = 2;
+ break;
+ default:
+ if (isdigit(ch)) {
+ radix = 8;
+ limit = 3;
+ first--;
+ } else {
+ value = *first;
+ }
+ break;
+ }
+
+ if (radix != 0) {
+ char *last = 0;
+ char tmp[80];
+
+ LYStrNCpy(tmp, first, limit);
+ value = (int) strtol(tmp, &last, radix);
+ if (last != 0 && last != tmp)
+ first += (last - tmp);
+ }
+
+ if (name != 0) {
+ (void) expand_tiname(name, strlen(name), result, final);
+ } else {
+ **result = (char) value;
+ (*result) += 1;
+ }
+
+ return first;
+}
+
+static BOOLEAN expand_substring(char *target,
+ const char *first,
+ const char *last,
+ char *final)
+{
+ int ch;
+
+ while (first < last) {
+ switch (ch = *first++) {
+ case ESCAPE:
+ first = expand_tichar(first, &target, final);
+ break;
+ case '^':
+ ch = *first++;
+ if (ch == LPAREN) {
+ const char *s = StrChr(first, RPAREN);
+ char *was = target;
+
+ if (s == 0)
+ s = first + strlen(first);
+ first = expand_tiname(first, (size_t) (s - first), &target, final);
+ if (target == was)
+ return FALSE;
+ if (*first)
+ first++;
+ } else if (ch == '?') { /* ASCII delete? */
+ *target++ = 127;
+ } else if ((ch & 0x3f) < 0x20) { /* ASCII control char? */
+ *target++ = (char) (ch & 0x1f);
+ } else {
+ *target++ = '^';
+ first--; /* not legal... */
+ }
+ break;
+ case 0: /* convert nulls for terminfo */
+ ch = 0200;
+ /* FALLTHRU */
+ default:
+ *target++ = (char) ch;
+ break;
+ }
+ }
+ *target = '\0';
+ return TRUE;
+}
+#endif
+
+static void unescaped_char(const char *parse, int *keysym)
+{
+ size_t len = strlen(parse);
+ char buf[BUFSIZ];
+
+ if (len >= 3) {
+ (void) expand_substring(buf,
+ parse + 1,
+ parse + len - 1,
+ buf + sizeof(buf) - 1);
+ if (strlen(buf) == 1)
+ *keysym = *buf;
+ }
+}
+
+static BOOLEAN unescape_string(char *source, char *target, char *final)
+{
+ BOOLEAN ok = FALSE;
+
+ if (*source == SQUOTE) {
+ int keysym = -1;
+
+ unescaped_char(source, &keysym);
+ if (keysym >= 0) {
+ target[0] = (char) keysym;
+ target[1] = '\0';
+ ok = TRUE;
+ }
+ } else if (*source == DQUOTE) {
+ if (expand_substring(target, source + 1, source + strlen(source) - 1, final))
+ ok = TRUE;
+ (void) final;
+ }
+ return ok;
+}
+
+static Keysym_String_List *lookupKeysymByName(const char *name)
+{
+ Keysym_String_List *k;
+ Keysym_String_List *result = 0;
+
+ k = Keysym_Strings;
+ while (k->string != NULL) {
+ if (0 == strcasecomp(k->string, name)) {
+ result = k;
+ break;
+ }
+ k++;
+ }
+ return result;
+}
+
+int map_string_to_keysym(const char *str, int *keysym, int internal)
+{
+ int modifier = 0;
+
+ *keysym = -1;
+
+ if (strncasecomp(str, "LAC:", 4) == 0) {
+ char *other = StrChr(str + 4, ':');
+
+ if (other) {
+ int othersym = lecname_to_lec(other + 1);
+ char buf[BUFSIZ];
+
+ if (othersym >= 0 && other - str - 4 < BUFSIZ) {
+ LYStrNCpy(buf, str + 4, (other - str - 4));
+ *keysym = lacname_to_lac(buf);
+ if (*keysym >= 0) {
+ *keysym = LACLEC_TO_LKC0(*keysym, othersym);
+ return (*keysym);
+ }
+ }
+ }
+ *keysym = lacname_to_lac(str + 4);
+ if (*keysym >= 0) {
+ *keysym = LAC_TO_LKC0(*keysym);
+ return (*keysym);
+ }
+ } else if (strncasecomp(str, "Meta-", 5) == 0) {
+ str += 5;
+ modifier = LKC_MOD2;
+ if (*str) {
+ size_t len = strlen(str);
+
+ if (len == 1) {
+ return (*keysym = (UCH(str[0])) | modifier);
+ } else if (len == 2 && str[0] == '^' &&
+ (isalpha(UCH(str[1])) ||
+ (TOASCII(str[1]) >= '@' && TOASCII(str[1]) <= '_'))) {
+ return (*keysym = FROMASCII(UCH(str[1] & 0x1f)) | modifier);
+ } else if (len == 2 && str[0] == '^' &&
+ str[1] == '?') {
+ return (*keysym = CH_DEL | modifier);
+ }
+ if (*str == '^' || *str == '\\') {
+ char buf[BUFSIZ];
+
+ (void) expand_substring(buf,
+ str,
+ str + HTMIN(len, 28),
+ buf + sizeof(buf) - 1);
+ if (strlen(buf) <= 1)
+ return (*keysym = (UCH(buf[0])) | modifier);
+ }
+ }
+ } else if (*str == SQUOTE) {
+ unescaped_char(str, keysym);
+ } else if (isdigit(UCH(*str))) {
+ char *tmp;
+ long value = strtol(str, &tmp, 0);
+
+ if (!isalnum(UCH(*tmp))) {
+ *keysym = (int) value;
+#ifndef USE_SLANG
+ if (*keysym > 255)
+ *keysym |= LKC_ISLKC; /* caller should remove this flag - kw */
+#endif
+ }
+ } else {
+ Keysym_String_List *k = lookupKeysymByName(str);
+
+ if (k != 0) {
+ *keysym = (internal
+ ? k->internal
+ : k->value);
+ }
+ }
+
+ if (*keysym >= 0)
+ *keysym |= modifier;
+ return (*keysym);
+}
+
+LYExtraKeys LYnameToExtraKeys(const char *name)
+{
+ Keysym_String_List *k = lookupKeysymByName(name);
+ LYExtraKeys result = UNKNOWN_KEY;
+
+ if (k != 0)
+ result = k->internal;
+ return result;
+}
+
+const char *LYextraKeysToName(LYExtraKeys code)
+{
+ Keysym_String_List *k;
+ const char *result = 0;
+
+ k = Keysym_Strings;
+ while (k->string != NULL) {
+ if (k->internal == code) {
+ result = k->string;
+ break;
+ }
+ k++;
+ }
+ return result;
+}
+
+/*
+ * Starting at a nonblank character, skip over a token, counting quoted and
+ * escaped characters.
+ */
+static char *skip_keysym(char *parse)
+{
+ int quoted = 0;
+ int escaped = 0;
+
+ while (*parse) {
+ if (escaped) {
+ escaped = 0;
+ } else if (quoted) {
+ if (*parse == ESCAPE) {
+ escaped = 1;
+ } else if (*parse == quoted) {
+ quoted = 0;
+ }
+ } else if (*parse == ESCAPE) {
+ escaped = 1;
+ } else if (*parse == DQUOTE || *parse == SQUOTE) {
+ quoted = *parse;
+ } else if (isspace(UCH(*parse))) {
+ break;
+ }
+ parse++;
+ }
+ return (quoted || escaped) ? 0 : parse;
+}
+
+/*
+ * The first token is the string to define, the second is the name (of the
+ * keysym) to define it to.
+ */
+#define MY_TRACE(p) CTRACE2(TRACE_CFG, p)
+
+static int setkey_cmd(char *parse)
+{
+ char *s, *t;
+ int keysym;
+ char buf[BUFSIZ];
+
+ MY_TRACE((tfp, "KEYMAP(PA): in=%s", parse)); /* \n-terminated */
+ if ((s = skip_keysym(parse)) != 0) {
+ if (isspace(UCH(*s))) {
+ *s++ = '\0';
+ s = LYSkipBlanks(s);
+ if ((t = skip_keysym(s)) == 0) {
+ MY_TRACE((tfp, "KEYMAP(SKIP) no key expansion found\n"));
+ return -1;
+ }
+ if (t != s)
+ *t = '\0';
+ if (map_string_to_keysym(s, &keysym, FALSE) >= 0) {
+ if (!unescape_string(parse, buf, buf + sizeof(buf) - 1)) {
+ MY_TRACE((tfp, "KEYMAP(SKIP) could unescape key\n"));
+ return 0; /* Trace the failure and continue. */
+ }
+ if (LYTraceLogFP == 0) {
+ MY_TRACE((tfp, "KEYMAP(DEF) keysym=%#x\n",
+ (unsigned) keysym));
+ } else {
+ MY_TRACE((tfp, "KEYMAP(DEF) keysym=%#x, seq='%s'\n",
+ (unsigned) keysym, buf));
+ }
+ return define_key(buf, keysym);
+ } else {
+ MY_TRACE((tfp, "KEYMAP(SKIP) could not map to keysym\n"));
+ }
+ } else {
+ MY_TRACE((tfp, "KEYMAP(SKIP) junk after key description: '%s'\n", s));
+ }
+ } else {
+ MY_TRACE((tfp, "KEYMAP(SKIP) no key description\n"));
+ }
+ return -1;
+}
+#undef MY_TRACE
+
+static int unsetkey_cmd(char *parse)
+{
+ char *s = skip_keysym(parse);
+
+ if (s != parse) {
+ *s = '\0';
+#ifdef NCURSES_VERSION
+ /*
+ * This won't work with Slang. Remove the definition for the given
+ * keysym.
+ */
+ {
+ int keysym;
+
+ if (map_string_to_keysym(parse, &keysym, FALSE) >= 0)
+ define_key((char *) 0, keysym);
+ }
+#endif
+#ifdef USE_SLANG
+ /* Slang implements this, for undefining the string which is associated
+ * with a keysym (the reverse of what we normally want, but may
+ * occasionally find useful).
+ */
+ SLang_undefine_key(parse, Keymap_List);
+ if (SLang_get_error())
+ return -1;
+#endif
+ }
+ return 0;
+}
+
+#ifdef FNAMES_8_3
+#define FNAME_LYNX_KEYMAPS "_lynxkey.map"
+#else
+#define FNAME_LYNX_KEYMAPS ".lynx-keymaps"
+#endif /* FNAMES_8_3 */
+
+static int read_keymap_file(void)
+{
+ /* *INDENT-OFF* */
+ static struct {
+ const char *name;
+ int (*func) (char *s);
+ } table[] = {
+ { "setkey", setkey_cmd },
+ { "unsetkey", unsetkey_cmd },
+ };
+ /* *INDENT-ON* */
+
+ char *line = NULL;
+ FILE *fp;
+ char file[LY_MAXPATH];
+ int linenum;
+ size_t n;
+
+ LYAddPathToHome(file, sizeof(file), FNAME_LYNX_KEYMAPS);
+
+ if ((fp = fopen(file, "r")) == 0)
+ return 0;
+
+ CTRACE((tfp, "read_keymap_file %s\n", file));
+ linenum = 0;
+ while (LYSafeGets(&line, fp) != 0) {
+ char *s = LYSkipBlanks(line);
+
+ linenum++;
+
+ if ((*s == 0) || (*s == '#'))
+ continue;
+
+ for (n = 0; n < TABLESIZE(table); n++) {
+ size_t len = strlen(table[n].name);
+
+ if (strlen(s) > len && !StrNCmp(s, table[n].name, len)
+ && (*(table[n].func)) (LYSkipBlanks(s + len)) < 0)
+ fprintf(stderr, FAILED_READING_KEYMAP, linenum, file);
+ }
+ }
+ FREE(line);
+ LYCloseInput(fp);
+ return 0;
+}
+
+static void setup_vtXXX_keymap(void)
+{
+ /* *INDENT-OFF* */
+ static Keysym_String_List table[] = {
+ INTERN_KEY( "\033[A", UPARROW_KEY, KEY_UP ),
+ INTERN_KEY( "\033OA", UPARROW_KEY, KEY_UP ),
+ INTERN_KEY( "\033[B", DNARROW_KEY, KEY_DOWN ),
+ INTERN_KEY( "\033OB", DNARROW_KEY, KEY_DOWN ),
+ INTERN_KEY( "\033[C", RTARROW_KEY, KEY_RIGHT ),
+ INTERN_KEY( "\033OC", RTARROW_KEY, KEY_RIGHT ),
+ INTERN_KEY( "\033[D", LTARROW_KEY, KEY_LEFT ),
+ INTERN_KEY( "\033OD", LTARROW_KEY, KEY_LEFT ),
+ INTERN_KEY( "\033[1~", FIND_KEY, KEY_FIND ),
+ INTERN_KEY( "\033[2~", INSERT_KEY, KEY_IC ),
+ INTERN_KEY( "\033[3~", REMOVE_KEY, KEY_DC ),
+ INTERN_KEY( "\033[4~", SELECT_KEY, KEY_SELECT ),
+ INTERN_KEY( "\033[5~", PGUP_KEY, KEY_PPAGE ),
+ INTERN_KEY( "\033[6~", PGDOWN_KEY, KEY_NPAGE ),
+ INTERN_KEY( "\033[7~", HOME_KEY, KEY_HOME),
+ INTERN_KEY( "\033[8~", END_KEY, KEY_END ),
+ INTERN_KEY( "\033[11~", F1_KEY, KEY_F(1) ),
+ INTERN_KEY( "\033[28~", F1_KEY, KEY_F(1) ),
+ INTERN_KEY( "\033OP", F1_KEY, KEY_F(1) ),
+ INTERN_KEY( "\033[OP", F1_KEY, KEY_F(1) ),
+ INTERN_KEY( "\033[29~", DO_KEY, KEY_F(16) ),
+#if defined(USE_SLANG)
+#if defined(__WIN32__) || defined(__MINGW32__)
+ INTERN_KEY( "\xE0H", UPARROW_KEY, KEY_UP ),
+ INTERN_KEY( "\xE0P", DNARROW_KEY, KEY_DOWN ),
+ INTERN_KEY( "\xE0M", RTARROW_KEY, KEY_RIGHT ),
+ INTERN_KEY( "\xE0K", LTARROW_KEY, KEY_LEFT ),
+ INTERN_KEY( "\xE0R", INSERT_KEY, KEY_IC ),
+ INTERN_KEY( "\xE0S", REMOVE_KEY, KEY_DC ),
+ INTERN_KEY( "\xE0I", PGUP_KEY, KEY_PPAGE ),
+ INTERN_KEY( "\xE0Q", PGDOWN_KEY, KEY_NPAGE ),
+ INTERN_KEY( "\xE0G", HOME_KEY, KEY_HOME),
+ INTERN_KEY( "\xE0O", END_KEY, KEY_END ),
+#endif
+#if !defined(VMS)
+ INTERN_KEY( "^(ku)", UPARROW_KEY, KEY_UP ),
+ INTERN_KEY( "^(kd)", DNARROW_KEY, KEY_DOWN ),
+ INTERN_KEY( "^(kr)", RTARROW_KEY, KEY_RIGHT ),
+ INTERN_KEY( "^(kl)", LTARROW_KEY, KEY_LEFT ),
+ INTERN_KEY( "^(@0)", FIND_KEY, KEY_FIND ),
+ INTERN_KEY( "^(kI)", INSERT_KEY, KEY_IC ),
+ INTERN_KEY( "^(kD)", REMOVE_KEY, KEY_DC ),
+ INTERN_KEY( "^(*6)", SELECT_KEY, KEY_SELECT ),
+ INTERN_KEY( "^(kP)", PGUP_KEY, KEY_PPAGE ),
+ INTERN_KEY( "^(kN)", PGDOWN_KEY, KEY_NPAGE ),
+ INTERN_KEY( "^(@7)", END_KEY, KEY_END ),
+ INTERN_KEY( "^(kh)", HOME_KEY, KEY_HOME),
+ INTERN_KEY( "^(k1)", F1_KEY, KEY_F(1) ),
+ INTERN_KEY( "^(k2)", F2_KEY, KEY_F(2) ),
+ INTERN_KEY( "^(k3)", F3_KEY, KEY_F(3) ),
+ INTERN_KEY( "^(k4)", F4_KEY, KEY_F(4) ),
+ INTERN_KEY( "^(k5)", F5_KEY, KEY_F(5) ),
+ INTERN_KEY( "^(k6)", F6_KEY, KEY_F(6) ),
+ INTERN_KEY( "^(k7)", F7_KEY, KEY_F(7) ),
+ INTERN_KEY( "^(k8)", F8_KEY, KEY_F(8) ),
+ INTERN_KEY( "^(k9)", F9_KEY, KEY_F(9) ),
+ INTERN_KEY( "^(k;)", F10_KEY, KEY_F(10) ),
+ INTERN_KEY( "^(F1)", F11_KEY, KEY_F(11) ),
+ INTERN_KEY( "^(F2)", F12_KEY, KEY_F(12) ),
+ INTERN_KEY( "^(F6)", DO_KEY, KEY_F(16) ),
+#endif /* !VMS */
+#endif /* SLANG */
+ };
+ /* *INDENT-ON* */
+
+ size_t n;
+
+ for (n = 0; n < TABLESIZE(table); n++)
+ define_key(table[n].string, table[n].value);
+}
+
+int lynx_initialize_keymaps(void)
+{
+#ifdef USE_SLANG
+ int i;
+ char keybuf[2];
+
+ /* The escape sequences may contain embedded termcap strings. Make
+ * sure the library is initialized for that.
+ */
+ SLtt_get_terminfo();
+
+ if (NULL == (Keymap_List = SLang_create_keymap("Lynx", NULL)))
+ return -1;
+
+ keybuf[1] = 0;
+ for (i = 1; i < 256; i++) {
+ keybuf[0] = (char) i;
+ define_key(keybuf, i);
+ }
+
+ setup_vtXXX_keymap();
+ define_key("\033[M", MOUSE_KEYSYM);
+
+ if (SLang_get_error())
+ SLang_exit_error("Unable to initialize keymaps");
+#else
+ setup_vtXXX_keymap();
+#endif
+ return read_keymap_file();
+}
+
+#endif /* USE_KEYMAPS */
+
+#if defined(USE_MOUSE) && (defined(NCURSES))
+static int LYmouse_menu(int x, int y, int atlink, int code)
+{
+#define ENT_ONLY_DOC 1
+#define ENT_ONLY_LINK 2
+ /* *INDENT-OFF* */
+ static const struct {
+ const char *txt;
+ int action;
+ unsigned int flag;
+ } possible_entries[] = {
+ {"Quit", LYK_ABORT, ENT_ONLY_DOC},
+ {"Home page", LYK_MAIN_MENU, ENT_ONLY_DOC},
+ {"Previous document", LYK_PREV_DOC, ENT_ONLY_DOC},
+ {"Beginning of document", LYK_HOME, ENT_ONLY_DOC},
+ {"Page up", LYK_PREV_PAGE, ENT_ONLY_DOC},
+ {"Half page up", LYK_UP_HALF, ENT_ONLY_DOC},
+ {"Two lines up", LYK_UP_TWO, ENT_ONLY_DOC},
+ {"History", LYK_HISTORY, ENT_ONLY_DOC},
+ {"Help", LYK_HELP, 0},
+ {"Do nothing (refresh)", LYK_REFRESH, 0},
+ {"Load again", LYK_RELOAD, ENT_ONLY_DOC},
+ {"Edit Doc URL and load", LYK_ECGOTO, ENT_ONLY_DOC},
+ {"Edit Link URL and load", LYK_ELGOTO, ENT_ONLY_LINK},
+ {"Show info", LYK_INFO, 0},
+ {"Search", LYK_WHEREIS, ENT_ONLY_DOC},
+ {"Print", LYK_PRINT, ENT_ONLY_DOC},
+ {"Two lines down", LYK_DOWN_TWO, ENT_ONLY_DOC},
+ {"Half page down", LYK_DOWN_HALF, ENT_ONLY_DOC},
+ {"Page down", LYK_NEXT_PAGE, ENT_ONLY_DOC},
+ {"End of document", LYK_END, ENT_ONLY_DOC},
+ {"Bookmarks", LYK_VIEW_BOOKMARK, ENT_ONLY_DOC},
+ {"Cookie jar", LYK_COOKIE_JAR, ENT_ONLY_DOC},
+#ifdef USE_CACHEJAR
+ {"Cache jar", LYK_CACHE_JAR, ENT_ONLY_DOC},
+#endif
+ {"Search index", LYK_INDEX_SEARCH, ENT_ONLY_DOC},
+ {"Set Options", LYK_OPTIONS, ENT_ONLY_DOC},
+ {"Activate this link", LYK_MOUSE_SUBMIT, ENT_ONLY_LINK},
+ {"Download", LYK_DOWNLOAD, ENT_ONLY_LINK}
+ };
+ /* *INDENT-ON* */
+
+#define TOTAL_MENUENTRIES TABLESIZE(possible_entries)
+ const char *choices[TOTAL_MENUENTRIES + 1];
+ int actions[TOTAL_MENUENTRIES];
+
+ int c, c1, retlac;
+ unsigned filter_out = (unsigned) (atlink ? ENT_ONLY_DOC : ENT_ONLY_LINK);
+
+ c = c1 = 0;
+ while (c < (int) TOTAL_MENUENTRIES) {
+ if (!(possible_entries[c].flag & filter_out)) {
+ choices[c1] = possible_entries[c].txt;
+ actions[c1++] = possible_entries[c].action;
+ }
+ c++;
+ }
+ choices[c1] = NULL;
+
+ /* Somehow the mouse is over the number instead of being over the
+ name, so we decrease x. */
+ c = LYChoosePopup((atlink ? 2 : 10) - 1, y, (x > 5 ? x - 5 : 1),
+ choices, c1, FALSE, TRUE);
+
+ /*
+ * LYhandlePopupList() wasn't really meant to be used outside of old-style
+ * Options menu processing. One result of mis-using it here is that we
+ * have to deal with side-effects regarding SIGINT signal handler and the
+ * term_options global variable. - kw
+ */
+ if (term_options) {
+ retlac = LYK_DO_NOTHING;
+ term_options = FALSE;
+ } else {
+ retlac = actions[c];
+ }
+
+ if (code == FOR_INPUT && mouse_link == -1) {
+ switch (retlac) {
+ case LYK_ABORT:
+ retlac = LYK_QUIT; /* a bit softer... */
+ /* fall through */
+ case LYK_MAIN_MENU:
+ case LYK_PREV_DOC:
+ case LYK_HOME:
+ case LYK_PREV_PAGE:
+ case LYK_UP_HALF:
+ case LYK_UP_TWO:
+ case LYK_HISTORY:
+ case LYK_HELP:
+/* case LYK_REFRESH:*/
+ case LYK_RELOAD:
+ case LYK_ECGOTO:
+ case LYK_INFO:
+ case LYK_WHEREIS:
+ case LYK_PRINT:
+ case LYK_DOWN_TWO:
+ case LYK_DOWN_HALF:
+ case LYK_NEXT_PAGE:
+ case LYK_END:
+ case LYK_VIEW_BOOKMARK:
+ case LYK_COOKIE_JAR:
+#ifdef USE_CACHEJAR
+ case LYK_CACHE_JAR:
+#endif
+ case LYK_INDEX_SEARCH:
+ case LYK_OPTIONS:
+ mouse_link = -3; /* so LYgetch_for() passes it on - kw */
+ }
+ }
+ if (retlac == LYK_DO_NOTHING ||
+ retlac == LYK_REFRESH) {
+ mouse_link = -1; /* mainloop should not change cur link - kw */
+ }
+ if (code == FOR_INPUT && retlac == LYK_DO_NOTHING) {
+ repaint_main_statusline(FOR_INPUT);
+ }
+ return retlac;
+}
+#endif /* USE_MOUSE && (NCURSES || PDCURSES) */
+
+#if defined(USE_KEYMAPS) && defined(USE_SLANG)
+/************************************************************************/
+
+static int current_sl_modifier = 0;
+
+/* We cannot guarantee the type for 'GetChar', and should not use a cast. */
+static int myGetChar(void)
+{
+ int i = GetChar();
+
+ if (i == 0) /* trick to get NUL char through - kw */
+ current_sl_modifier = LKC_ISLKC;
+ return i;
+}
+
+static int LYgetch_for(int code)
+{
+ SLang_Key_Type *key;
+ int keysym;
+
+ current_sl_modifier = 0;
+
+ key = SLang_do_key(Keymap_List, myGetChar);
+ if ((key == NULL) || (key->type != SLKEY_F_KEYSYM)) {
+#if defined(__WIN32__) || defined(__MINGW32__)
+ if ((key == NULL) && (current_sl_modifier == LKC_ISLKC)) {
+ key = SLang_do_key(Keymap_List, myGetChar);
+ keysym = key->f.keysym;
+ switch (keysym) {
+ case 'H':
+ keysym = UPARROW_KEY;
+ break;
+ case 'P':
+ keysym = DNARROW_KEY;
+ break;
+ case 'M':
+ keysym = RTARROW_KEY;
+ break;
+ case 'K':
+ keysym = LTARROW_KEY;
+ break;
+ case 'R':
+ keysym = INSERT_KEY;
+ break;
+ case 'S':
+ keysym = REMOVE_KEY;
+ break;
+ case 'I':
+ keysym = PGUP_KEY;
+ break;
+ case 'Q':
+ keysym = PGDOWN_KEY;
+ break;
+ case 'G':
+ keysym = HOME_KEY;
+ break;
+ case 'O':
+ keysym = END_KEY;
+ break;
+ case ';':
+ keysym = F1_KEY;
+ break;
+ }
+ return (keysym);
+ }
+#endif
+ return (current_sl_modifier ? 0 : DO_NOTHING);
+ } else {
+ keysym = (int) key->f.keysym;
+
+#if defined (USE_MOUSE)
+ if (keysym == MOUSE_KEYSYM)
+ return sl_read_mouse_event(code);
+#endif
+
+ if (keysym < 0) {
+ return 0;
+
+ } else if (keysym & (LKC_ISLECLAC | LKC_ISLAC)) {
+ return (keysym);
+ } else {
+ current_sl_modifier = 0;
+ if (LKC_HAS_ESC_MOD(keysym)) {
+ current_sl_modifier = LKC_MOD2;
+ keysym &= LKC_MASK;
+ }
+
+ if (keysym + 1 >= KEYMAP_SIZE) {
+ return 0;
+ } else {
+ return (keysym | current_sl_modifier);
+ }
+ }
+ }
+}
+
+/************************************************************************/
+#else /* NOT defined(USE_KEYMAPS) && defined(USE_SLANG) */
+
+/*
+ * LYgetch() translates some escape sequences and may fake noecho.
+ */
+#define found_CSI(first,second) ((second) == '[' || (first) == 155)
+#define found_TLD(value) ((value) == '~')
+
+static int LYgetch_for(int code)
+{
+ int a, b, c, d = -1;
+ int current_modifier = 0;
+ BOOLEAN done_esc = FALSE;
+
+ (void) code;
+
+ have_levent = 0;
+
+ re_read:
+#if !defined(UCX) || !defined(VAXC) /* errno not modifiable ? */
+ if (errno == EINTR)
+ set_errno(0); /* reset - kw */
+#endif /* UCX && VAXC */
+#ifndef USE_SLANG
+ clearerr(stdin); /* needed here for ultrix and SOCKETSHR, but why? - FM */
+#endif /* !USE_SLANG */
+#if !defined(USE_SLANG) || defined(VMS) || defined(DJGPP_KEYHANDLER)
+ c = GetChar();
+ lynx_nl2crlf(FALSE);
+#else
+ if (LYCursesON) {
+ c = GetChar();
+ lynx_nl2crlf(FALSE);
+ } else {
+ c = getchar();
+ if (c == EOF && errno == EINTR) /* Ctrl-Z causes EINTR in getchar() */
+ clearerr(stdin);
+ if (feof(stdin) || ferror(stdin) || c == EOF) {
+#ifdef IGNORE_CTRL_C
+ if (sigint)
+ sigint = FALSE;
+#endif /* IGNORE_CTRL_C */
+ CTRACE((tfp, "GETCH: Translate ^C to ^G.\n"));
+ return (LYCharINTERRUPT2); /* use ^G to cancel whatever called us. */
+ }
+ }
+#endif /* !USE_SLANG || VMS */
+
+ CTRACE((tfp, "GETCH%d: Got %#x.\n", code, (unsigned) c));
+ if (LYNoZapKey > 1 && errno != EINTR &&
+ (c == EOF
+#ifdef USE_SLANG
+ || (c == 0xFFFF)
+#endif
+ )) {
+
+ CTRACE((tfp,
+ "nozap: Got EOF, curses %s, stdin is %p, LYNoZapKey reduced from %d to 0.\n",
+ LYCursesON ? "on" : "off", (void *) stdin, LYNoZapKey));
+ LYNoZapKey = 0; /* 2 -> 0 */
+ if (LYReopenInput() > 0) {
+ if (LYCursesON) {
+ stop_curses();
+ start_curses();
+ LYrefresh();
+ }
+ goto re_read;
+ }
+ }
+#ifdef USE_GETCHAR
+ if (c == EOF && errno == EINTR) /* Ctrl-Z causes EINTR in getchar() */
+ goto re_read;
+#else
+ if (c == EOF && errno == EINTR) {
+
+#if defined(HAVE_SIZECHANGE) || defined(USE_SLANG)
+ CTRACE((tfp, "Got EOF with EINTR, recent_sizechange so far is %d\n",
+ recent_sizechange));
+ if (!recent_sizechange) { /* not yet detected by ourselves */
+ size_change(0);
+ CTRACE((tfp, "Now recent_sizechange is %d\n", recent_sizechange));
+ }
+#else /* HAVE_SIZECHANGE || USE_SLANG */
+ CTRACE((tfp, "Got EOF with EINTR, recent_sizechange is %d\n",
+ recent_sizechange));
+#endif /* HAVE_SIZECHANGE || USE_SLANG */
+#if !defined(UCX) || !defined(VAXC) /* errno not modifiable ? */
+ set_errno(0); /* reset - kw */
+#endif /* UCX && VAXC */
+ return (DO_NOTHING);
+ }
+#endif /* USE_GETCHAR */
+
+#ifdef USE_SLANG
+ if (c == 0xFFFF && LYCursesON) {
+#ifdef IGNORE_CTRL_C
+ if (sigint) {
+ sigint = FALSE;
+ goto re_read;
+ }
+#endif /* IGNORE_CTRL_C */
+ return (LYCharINTERRUPT2); /* use ^G to cancel whatever called us. */
+ }
+#else /* not USE_SLANG: */
+ if (feof(stdin) || ferror(stdin) || c == EOF) {
+ if (recent_sizechange)
+ return (LYCharINTERRUPT2); /* use ^G to cancel whatever called us. */
+#ifdef IGNORE_CTRL_C
+ if (sigint) {
+ sigint = FALSE;
+ /* clearerr(stdin); don't need here if stays above - FM */
+ goto re_read;
+ }
+#endif /* IGNORE_CTRL_C */
+#if !defined(USE_GETCHAR) && !defined(VMS) && !defined(NCURSES)
+ if (c == ERR && errno == EINTR) /* may have been handled signal - kw */
+ goto re_read;
+#endif /* USE_GETCHAR */
+
+ cleanup();
+ exit_immediately(EXIT_SUCCESS);
+ }
+#endif /* USE_SLANG */
+
+ if (!escape_bound
+ && (c == CH_ESC || (csi_is_csi && c == UCH(CH_ESC_PAR)))) {
+ /* handle escape sequence S/390 -- gil -- 2024 */
+ done_esc = TRUE; /* Flag: we did it, not keypad() */
+ b = GetChar();
+
+ if (b == '[' || b == 'O') {
+ a = GetChar();
+ } else {
+ a = b;
+ }
+
+ switch (a) {
+ case 'A':
+ c = UPARROW_KEY;
+ break;
+ case 'B':
+ c = DNARROW_KEY;
+ break;
+ case 'C':
+ c = RTARROW_KEY;
+ break;
+ case 'D':
+ c = LTARROW_KEY;
+ break;
+ case 'q': /* vt100 application keypad 1 */
+ c = END_KEY;
+ break;
+ case 'r': /* vt100 application keypad 2 */
+ c = DNARROW_KEY;
+ break;
+ case 's': /* vt100 application keypad 3 */
+ c = PGDOWN_KEY;
+ break;
+ case 't': /* vt100 application keypad 4 */
+ c = LTARROW_KEY;
+ break;
+ case 'v': /* vt100 application keypad 6 */
+ c = RTARROW_KEY;
+ break;
+ case 'w': /* vt100 application keypad 7 */
+ c = HOME_KEY;
+ break;
+ case 'x': /* vt100 application keypad 8 */
+ c = UPARROW_KEY;
+ break;
+ case 'y': /* vt100 application keypad 9 */
+ c = PGUP_KEY;
+ break;
+ case 'M':
+#if defined(USE_SLANG) && defined(USE_MOUSE)
+ if (found_CSI(c, b)) {
+ c = sl_read_mouse_event(code);
+ } else
+#endif
+ c = '\n'; /* keypad enter on pc ncsa telnet */
+ break;
+
+ case 'm':
+#ifdef VMS
+ if (b != 'O')
+#endif /* VMS */
+ c = '-'; /* keypad on pc ncsa telnet */
+ break;
+ case 'k':
+ if (b == 'O')
+ c = '+'; /* keypad + on my xterminal :) */
+ else
+ done_esc = FALSE; /* we have another look below - kw */
+ break;
+ case 'l':
+#ifdef VMS
+ if (b != 'O')
+#endif /* VMS */
+ c = '+'; /* keypad on pc ncsa telnet */
+ break;
+ case 'P':
+#ifdef VMS
+ if (b != 'O')
+#endif /* VMS */
+ c = F1_KEY;
+ break;
+ case 'u':
+#ifdef VMS
+ if (b != 'O')
+#endif /* VMS */
+ c = F1_KEY; /* macintosh help button */
+ break;
+ case 'p':
+#ifdef VMS
+ if (b == 'O')
+#endif /* VMS */
+ c = '0'; /* keypad 0 */
+ break;
+ case '1': /* VTxxx Find */
+ if (found_CSI(c, b) && found_TLD(d = GetChar()))
+ c = FIND_KEY;
+ else
+ done_esc = FALSE; /* we have another look below - kw */
+ break;
+ case '2':
+ if (found_CSI(c, b)) {
+ if (found_TLD(d = GetChar())) /* VTxxx Insert */
+ c = INSERT_KEY;
+ else if ((d == '8' ||
+ d == '9') &&
+ found_TLD(GetChar())) {
+ if (d == '8') /* VTxxx Help */
+ c = F1_KEY;
+ else if (d == '9') /* VTxxx Do */
+ c = DO_KEY;
+ d = -1;
+ }
+ } else
+ done_esc = FALSE; /* we have another look below - kw */
+ break;
+ case '3': /** VTxxx Delete **/
+ if (found_CSI(c, b) && found_TLD(d = GetChar()))
+ c = REMOVE_KEY;
+ else
+ done_esc = FALSE; /* we have another look below - kw */
+ break;
+ case '4': /** VTxxx Select **/
+ if (found_CSI(c, b) && found_TLD(d = GetChar()))
+ c = SELECT_KEY;
+ else
+ done_esc = FALSE; /* we have another look below - kw */
+ break;
+ case '5': /** VTxxx PrevScreen **/
+ if (found_CSI(c, b) && found_TLD(d = GetChar()))
+ c = PGUP_KEY;
+ else
+ done_esc = FALSE; /* we have another look below - kw */
+ break;
+ case '6': /** VTxxx NextScreen **/
+ if (found_CSI(c, b) && found_TLD(d = GetChar()))
+ c = PGDOWN_KEY;
+ else
+ done_esc = FALSE; /* we have another look below - kw */
+ break;
+ case '[': /** Linux F1-F5: ^[[[A etc. **/
+ if (found_CSI(c, b)) {
+ if ((d = GetChar()) == 'A')
+ c = F1_KEY;
+ break;
+ }
+ /* FALLTHRU */
+ default:
+ if (c == CH_ESC && a == b && !found_CSI(c, b)) {
+ current_modifier = LKC_MOD2;
+ c = a;
+ /* We're not yet done if ESC + curses-keysym: */
+ done_esc = (BOOL) ((a & ~0xFF) == 0);
+ break;
+ }
+ CTRACE((tfp, "Unknown key sequence: %d:%d:%d\n", c, b, a));
+ CTRACE_SLEEP(MessageSecs);
+ break;
+ }
+ if (isdigit(a) && found_CSI(c, b) && d != -1 && !found_TLD(d))
+ d = GetChar();
+ if (!done_esc && (a & ~0xFF) == 0) {
+ if (a == b && !found_CSI(c, b) && c == CH_ESC) {
+ current_modifier = LKC_MOD2;
+ c = a;
+ done_esc = TRUE;
+ } else {
+ done_esc = TRUE;
+ }
+ }
+ }
+#ifdef USE_KEYMAPS
+ /* Extract a single code if two are merged: */
+ if (c >= 0 && (c & LKC_ISLECLAC)) {
+ if (!(code == FOR_INPUT || code == FOR_PROMPT))
+ c = LKC2_TO_LKC(c);
+ } else if (c >= 0 && (c & LKC_ISLKC)) {
+ c &= ~LKC_ISLKC;
+ done_esc = TRUE; /* already a lynxkeycode, skip keypad switches - kw */
+ }
+ if (c >= 0 && LKC_HAS_ESC_MOD(c)) {
+ current_modifier = LKC_MOD2;
+ c &= LKC_MASK;
+ }
+ if (c >= 0 && (c & (LKC_ISLECLAC | LKC_ISLAC))) {
+ done_esc = TRUE; /* already a lynxactioncode, skip keypad switches - iz */
+ }
+#endif
+ if (done_esc) {
+ /* don't do keypad() switches below, we already got it - kw */
+ } else {
+#ifdef HAVE_KEYPAD
+ /*
+ * Convert keypad() mode keys into Lynx defined keys.
+ */
+ switch (c) {
+ case KEY_DOWN: /* The four arrow keys ... */
+ c = DNARROW_KEY;
+ break;
+ case KEY_UP:
+ c = UPARROW_KEY;
+ break;
+ case KEY_LEFT:
+ c = LTARROW_KEY;
+ break;
+ case KEY_RIGHT: /* ... */
+ c = RTARROW_KEY;
+ break;
+#if defined(PDCURSES) /* for NEC PC-9800 1998/08/30 (Sun) 21:50:35 */
+ case KEY_C2:
+ c = DNARROW_KEY;
+ break;
+ case KEY_A2:
+ c = UPARROW_KEY;
+ break;
+ case KEY_B1:
+ c = LTARROW_KEY;
+ break;
+ case KEY_B3:
+ c = RTARROW_KEY;
+ break;
+ case PAD0: /* PC-9800 Ins */
+ c = INSERT_KEY;
+ break;
+ case PADSTOP: /* PC-9800 DEL */
+ c = REMOVE_KEY;
+ break;
+#endif /* PDCURSES */
+ case KEY_HOME: /* Home key (upward+left arrow) */
+ c = HOME_KEY;
+ break;
+ case KEY_CLEAR: /* Clear screen */
+ c = 18; /* CTRL-R */
+ break;
+ case KEY_NPAGE: /* Next page */
+ c = PGDOWN_KEY;
+ break;
+ case KEY_PPAGE: /* Previous page */
+ c = PGUP_KEY;
+ break;
+ case KEY_LL: /* home down or bottom (lower left) */
+ c = END_KEY;
+ break;
+#if defined(KEY_A1) && defined(KEY_C3)
+ /* The keypad is arranged like this: */
+ /* a1 up a3 */
+ /* left b2 right */
+ /* c1 down c3 */
+ case KEY_A1: /* upper left of keypad */
+ c = HOME_KEY;
+ break;
+ case KEY_A3: /* upper right of keypad */
+ c = PGUP_KEY;
+ break;
+ case KEY_B2: /* center of keypad */
+ c = DO_NOTHING;
+ break;
+ case KEY_C1: /* lower left of keypad */
+ c = END_KEY;
+ break;
+ case KEY_C3: /* lower right of keypad */
+ c = PGDOWN_KEY;
+ break;
+#endif /* defined(KEY_A1) && defined(KEY_C3) */
+#ifdef KEY_ENTER
+ case KEY_ENTER: /* enter/return */
+ c = '\n';
+ break;
+#endif /* KEY_ENTER */
+#ifdef PADENTER /* PDCURSES */
+ case PADENTER:
+ c = '\n';
+ break;
+#endif /* PADENTER */
+#ifdef KEY_END
+ case KEY_END: /* end key 001 */
+ c = END_KEY;
+ break;
+#endif /* KEY_END */
+#ifdef KEY_HELP
+ case KEY_HELP: /* help key 001 */
+ c = F1_KEY;
+ break;
+#endif /* KEY_HELP */
+#ifdef KEY_BACKSPACE
+ case KEY_BACKSPACE:
+ c = CH_DEL; /* backspace key (delete, not Ctrl-H) S/390 -- gil -- 2041 */
+ break;
+#endif /* KEY_BACKSPACE */
+ case KEY_F(1):
+ c = F1_KEY; /* VTxxx Help */
+ break;
+#if defined(KEY_F) && !defined(__DJGPP__) && !defined(_WINDOWS)
+ case KEY_F(16):
+ c = DO_KEY; /* VTxxx Do */
+ break;
+#endif /* KEY_F */
+#ifdef KEY_REDO
+ case KEY_REDO: /* VTxxx Do */
+ c = DO_KEY;
+ break;
+#endif /* KEY_REDO */
+#ifdef KEY_FIND
+ case KEY_FIND:
+ c = FIND_KEY; /* VTxxx Find */
+ break;
+#endif /* KEY_FIND */
+#ifdef KEY_SELECT
+ case KEY_SELECT:
+ c = SELECT_KEY; /* VTxxx Select */
+ break;
+#endif /* KEY_SELECT */
+#ifdef KEY_IC
+ case KEY_IC:
+ c = INSERT_KEY; /* VTxxx Insert */
+ break;
+#endif /* KEY_IC */
+#ifdef KEY_DC
+ case KEY_DC:
+ c = REMOVE_KEY; /* VTxxx Remove */
+ break;
+#endif /* KEY_DC */
+#ifdef KEY_BTAB
+ case KEY_BTAB:
+ c = BACKTAB_KEY; /* Back tab, often Shift-Tab */
+ break;
+#endif /* KEY_BTAB */
+#ifdef KEY_RESIZE
+ case KEY_RESIZE: /* size change detected by ncurses */
+#if defined(HAVE_SIZECHANGE) || defined(USE_SLANG)
+ /* Make call to detect new size, if that may be implemented.
+ * The call may set recent_sizechange (except for USE_SLANG),
+ * which will tell mainloop() to refresh. - kw
+ */
+ CTRACE((tfp, "Got KEY_RESIZE, recent_sizechange so far is %d\n",
+ recent_sizechange));
+ size_change(0);
+ CTRACE((tfp, "Now recent_sizechange is %d\n", recent_sizechange));
+#else /* HAVE_SIZECHANGE || USE_SLANG */
+ CTRACE((tfp, "Got KEY_RESIZE, recent_sizechange is %d\n",
+ recent_sizechange));
+#endif /* HAVE_SIZECHANGE || USE_SLANG */
+ if (!recent_sizechange) {
+#if defined(NCURSES)
+ /*
+ * Work-around for scenario (Linux libc5) where we got a
+ * recent sizechange before reading KEY_RESIZE. If we do
+ * not reset the flag, we'll next get an EOF read, which
+ * causes Lynx to exit.
+ */
+ recent_sizechange = TRUE;
+#endif
+ /*
+ * May be just the delayed effect of mainloop()'s call to
+ * resizeterm(). Pretend we haven't read anything yet, don't
+ * return. - kw
+ */
+ goto re_read;
+ }
+ /*
+ * Yep, we agree there was a change. Return now so that the caller
+ * can react to it. - kw
+ */
+ c = DO_NOTHING;
+ break;
+#endif /* KEY_RESIZE */
+
+/* The following maps PDCurses keys away from lynx reserved values */
+#if (defined(_WINDOWS) || defined(__DJGPP__)) && !defined(USE_SLANG)
+ case KEY_F(2):
+ c = 0x213;
+ break;
+ case KEY_F(3):
+ c = 0x214;
+ break;
+ case KEY_F(4):
+ c = 0x215;
+ break;
+ case KEY_F(5):
+ c = 0x216;
+ break;
+ case KEY_F(6):
+ c = 0x217;
+ break;
+ case KEY_F(7):
+ c = 0x218;
+ break;
+#endif /* PDCurses */
+
+#if defined(USE_MOUSE)
+/********************************************************************/
+
+#if defined(NCURSES) || defined(PDCURSES)
+ case KEY_MOUSE:
+ CTRACE((tfp, "KEY_MOUSE\n"));
+ if (code == FOR_CHOICE) {
+ c = MOUSE_KEY; /* Will be processed by the caller */
+ }
+#if defined(NCURSES)
+ else if (code == FOR_SINGLEKEY) {
+ MEVENT event;
+
+ getmouse(&event); /* Completely ignore event - kw */
+ c = DO_NOTHING;
+ }
+#endif
+ else {
+#if defined(NCURSES)
+ MEVENT event;
+ int err;
+ int lac = LYK_UNKNOWN;
+
+ c = -1;
+ mouse_link = -1;
+ err = getmouse(&event);
+ if (err != OK) {
+ CTRACE((tfp, "Mouse error: no event available!\n"));
+ return (code == FOR_PANEL ? 0 : DO_NOTHING);
+ }
+ levent = event; /* Allow setting pos in entry fields */
+ if (event.bstate & BUTTON1_CLICKED) {
+ c = set_clicked_link(event.x, event.y, code, 1);
+ } else if (event.bstate & BUTTON1_DOUBLE_CLICKED) {
+ c = set_clicked_link(event.x, event.y, code, 2);
+ if (c == LAC_TO_LKC0(LYK_MOUSE_SUBMIT) &&
+ code == FOR_INPUT)
+ lac = LYK_MOUSE_SUBMIT;
+ } else if (event.bstate & BUTTON3_CLICKED) {
+ c = LAC_TO_LKC0(LYK_PREV_DOC);
+ } else if (code == FOR_PROMPT
+ /* Cannot ignore: see LYCurses.c */
+ || (event.bstate &
+ (BUTTON1_PRESSED | BUTTON1_RELEASED
+ | BUTTON2_PRESSED | BUTTON2_RELEASED
+ | BUTTON3_PRESSED | BUTTON3_RELEASED))) {
+ /* Completely ignore - don't return anything, to
+ avoid canceling the prompt - kw */
+ goto re_read;
+ } else if (event.bstate & BUTTON2_CLICKED) {
+ int atlink;
+
+ c = set_clicked_link(event.x, event.y, code, 1);
+ atlink = (c == LAC_TO_LKC0(LYK_ACTIVATE));
+ if (!atlink)
+ mouse_link = -1; /* Forget about approx stuff. */
+
+ lac = LYmouse_menu(event.x, event.y, atlink, code);
+ if (lac == LYK_MOUSE_SUBMIT) {
+ if (mouse_link == -1)
+ lac = LYK_ACTIVATE;
+#ifdef TEXTFIELDS_MAY_NEED_ACTIVATION
+ else if (mouse_link >= 0 &&
+ textfields_need_activation &&
+ links[mouse_link].type == WWW_FORM_LINK_TYPE &&
+ F_TEXTLIKE(links[mouse_link].l_form->type))
+ lac = LYK_ACTIVATE;
+#endif
+ }
+ if (lac == LYK_ACTIVATE && mouse_link == -1) {
+ HTAlert(gettext("No link chosen"));
+ lac = LYK_REFRESH;
+ }
+ c = LAC_TO_LKC(lac);
+ }
+#if NCURSES_MOUSE_VERSION > 1
+ else if (event.bstate & BUTTON4_PRESSED) {
+ c = LAC_TO_LKC(LYK_UP_HALF);
+ } else if (event.bstate & BUTTON5_PRESSED) {
+ c = LAC_TO_LKC(LYK_DOWN_HALF);
+ }
+#endif
+ if (code == FOR_INPUT && mouse_link == -1 &&
+ lac != LYK_REFRESH &&
+ lac != LYK_MOUSE_SUBMIT) {
+ ungetmouse(&event); /* Caller will process this. */
+ wgetch(LYwin); /* ungetmouse puts KEY_MOUSE back */
+ c = MOUSE_KEY;
+ }
+#else /* pdcurses version */
+
+#define H_CMD_AREA 6
+#define HIST_CMD_2 12
+#define V_CMD_AREA 1
+
+ int left = H_CMD_AREA;
+ int right = (LYcolLimit - H_CMD_AREA - 1);
+
+ /* yes, I am assuming that my screen will be a certain width. */
+
+ int tick_count;
+ char *p = NULL;
+ char mouse_info[128];
+ static int old_click = 0; /* [m Sec] */
+
+ c = -1;
+ mouse_link = -1;
+
+ if (!system_is_NT) {
+ tick_count = GetTickCount();
+
+ /* Guard Mouse button miss click */
+ if ((tick_count - old_click) < 700) {
+ c = DO_NOTHING;
+ break;
+ } else {
+ old_click = tick_count;
+ }
+ }
+ request_mouse_pos();
+
+ if (BUTTON_STATUS(1) & BUTTON_PRESSED) {
+ if (MOUSE_Y_POS > (LYlines - V_CMD_AREA - 1)) {
+ /* Screen BOTTOM */
+ if (MOUSE_X_POS < left) {
+ c = LTARROW_KEY;
+ p = "<-";
+ } else if (MOUSE_X_POS < HIST_CMD_2) {
+ c = RTARROW_KEY;
+ p = "->";
+ } else if (MOUSE_X_POS > right) {
+ c = 'z';
+ p = "Cancel";
+ } else {
+ c = PGDOWN_KEY;
+ p = "PGDOWN";
+ }
+ } else if (MOUSE_Y_POS < V_CMD_AREA) {
+ /* Screen TOP */
+ if (MOUSE_X_POS < left) {
+ c = LTARROW_KEY;
+ p = "<-";
+ } else if (MOUSE_X_POS < HIST_CMD_2) {
+ c = RTARROW_KEY;
+ p = "->";
+ } else if (MOUSE_X_POS > right) {
+ c = 'z';
+ p = "Cancel";
+ } else {
+ c = PGUP_KEY;
+ p = "PGUP";
+ }
+ } else {
+ c = set_clicked_link(MOUSE_X_POS,
+ MOUSE_Y_POS,
+ FOR_PANEL, 1);
+ }
+ }
+ if (p && c != -1) {
+ sprintf(mouse_info, "Mouse = 0x%x, [%s]", c, p);
+ SetConsoleTitle(mouse_info);
+ }
+#endif /* !(WIN_EX) */
+ if ((c + 1) >= KEYMAP_SIZE && (c & LKC_ISLAC))
+ return (c);
+ }
+ break;
+#endif /* NCURSES || PDCURSES */
+
+/********************************************************************/
+#endif /* USE_MOUSE */
+
+ }
+#endif /* HAVE_KEYPAD */
+#ifdef DJGPP_KEYHANDLER
+ switch (c) {
+ case K_Down: /* The four arrow keys ... */
+ case K_EDown:
+ c = DNARROW_KEY;
+ break;
+ case K_Up:
+ case K_EUp:
+ c = UPARROW_KEY;
+ break;
+ case K_Left:
+ case K_ELeft:
+ c = LTARROW_KEY;
+ break;
+ case K_Right: /* ... */
+ case K_ERight:
+ c = RTARROW_KEY;
+ break;
+ case K_Home: /* Home key (upward+left arrow) */
+ case K_EHome:
+ c = HOME_KEY;
+ break;
+ case K_PageDown: /* Next page */
+ case K_EPageDown:
+ c = PGDOWN_KEY;
+ break;
+ case K_PageUp: /* Previous page */
+ case K_EPageUp:
+ c = PGUP_KEY;
+ break;
+ case K_End: /* home down or bottom (lower left) */
+ case K_EEnd:
+ c = END_KEY;
+ break;
+ case K_F1: /* F1 key */
+ c = F1_KEY;
+ break;
+ case K_Insert: /* Insert key */
+ case K_EInsert:
+ c = INSERT_KEY;
+ break;
+ case K_Delete: /* Delete key */
+ case K_EDelete:
+ c = REMOVE_KEY;
+ break;
+ case K_Alt_Escape: /* Alt-Escape */
+ c = 0x1a7;
+ break;
+ case K_Control_At: /* CTRL-@ */
+ c = 0x1a8;
+ break;
+ case K_Alt_Backspace: /* Alt-Backspace */
+ c = 0x1a9;
+ break;
+ case K_BackTab: /* BackTab */
+ c = BACKTAB_KEY;
+ break;
+ }
+#endif /* DGJPP_KEYHANDLER */
+#if defined(USE_SLANG) && (defined(__DJGPP__) || defined(__CYGWIN__)) && !defined(DJGPP_KEYHANDLER) && !defined(USE_KEYMAPS)
+ switch (c) {
+ case SL_KEY_DOWN: /* The four arrow keys ... */
+ c = DNARROW_KEY;
+ break;
+ case SL_KEY_UP:
+ c = UPARROW_KEY;
+ break;
+ case SL_KEY_LEFT:
+ c = LTARROW_KEY;
+ break;
+ case SL_KEY_RIGHT: /* ... */
+ c = RTARROW_KEY;
+ break;
+ case SL_KEY_HOME: /* Home key (upward+left arrow) */
+ case SL_KEY_A1: /* upper left of keypad */
+ c = HOME_KEY;
+ break;
+ case SL_KEY_NPAGE: /* Next page */
+ case SL_KEY_C3: /* lower right of keypad */
+ c = PGDOWN_KEY;
+ break;
+ case SL_KEY_PPAGE: /* Previous page */
+ case SL_KEY_A3: /* upper right of keypad */
+ c = PGUP_KEY;
+ break;
+ case SL_KEY_END: /* home down or bottom (lower left) */
+ case SL_KEY_C1: /* lower left of keypad */
+ c = END_KEY;
+ break;
+ case SL_KEY_F(1): /* F1 key */
+ c = F1_KEY;
+ break;
+ case SL_KEY_IC: /* Insert key */
+ c = INSERT_KEY;
+ break;
+ case SL_KEY_DELETE: /* Delete key */
+ c = REMOVE_KEY;
+ break;
+ }
+#endif /* USE_SLANG && __DJGPP__ && !DJGPP_KEYHANDLER && !USE_KEYMAPS */
+ }
+
+ if (c & (LKC_ISLAC | LKC_ISLECLAC)) {
+ return (c);
+ } else if ((c + 1) >= KEYMAP_SIZE) {
+ /*
+ * Don't return raw values for KEYPAD symbols which we may have missed
+ * in the switch above if they are obviously invalid when used as an
+ * index into (e.g.) keypad[]. - KW
+ */
+ return (0);
+ } else {
+ return (c | current_modifier);
+ }
+}
+
+/************************************************************************/
+#endif /* NOT defined(USE_KEYMAPS) && defined(USE_SLANG) */
+
+int LYgetch(void)
+{
+ return LYReadCmdKey(FOR_PANEL);
+}
+
+/*
+ * Read a single keystroke, allows mouse-selection.
+ */
+int LYgetch_choice(void)
+{
+ int ch = LYReadCmdKey(FOR_CHOICE);
+
+ if (ch == LYCharINTERRUPT1)
+ ch = LYCharINTERRUPT2; /* treat ^C the same as ^G */
+ return ch;
+}
+
+/*
+ * Read a single keystroke, allows mouse events.
+ */
+int LYgetch_input(void)
+{
+ int ch = LYReadCmdKey(FOR_INPUT);
+
+ if (ch == LYCharINTERRUPT1)
+ ch = LYCharINTERRUPT2; /* treat ^C the same as ^G */
+ return ch;
+}
+
+/*
+ * Read a single keystroke, ignoring case by translating it to uppercase.
+ * Ignore mouse events, if any.
+ */
+int LYgetch_single(void)
+{
+ int ch = LYReadCmdKey(FOR_SINGLEKEY);
+
+ if (ch == LYCharINTERRUPT1)
+ ch = LYCharINTERRUPT2; /* treat ^C the same as ^G */
+ else if (ch > 0 && ch < 256)
+ ch = TOUPPER(ch); /* will ignore case of result */
+ return ch;
+}
+
+/*
+ * Convert a null-terminated string to lowercase
+ */
+void LYLowerCase(char *arg_buffer)
+{
+ register unsigned char *buffer = (unsigned char *) arg_buffer;
+ size_t i;
+
+ for (i = 0; buffer[i]; i++) {
+#ifdef SUPPORT_MULTIBYTE_EDIT /* 1998/11/23 (Mon) 17:04:55 */
+ if ((buffer[i] & 0x80) != 0
+ && buffer[i + 1] != 0) {
+ if ((kanji_code == SJIS) && IS_SJIS_X0201KANA(UCH((buffer[i])))) {
+ continue;
+ }
+ i++;
+ } else {
+ buffer[i] = UCH(TOLOWER(buffer[i]));
+ }
+#else
+ buffer[i] = TOLOWER(buffer[i]);
+#endif
+ }
+}
+
+/*
+ * Convert a null-terminated string to uppercase
+ */
+void LYUpperCase(char *arg_buffer)
+{
+ register unsigned char *buffer = (unsigned char *) arg_buffer;
+ size_t i;
+
+ for (i = 0; buffer[i]; i++) {
+#ifdef SUPPORT_MULTIBYTE_EDIT /* 1998/11/23 (Mon) 17:05:10 */
+ if ((buffer[i] & 0x80) != 0
+ && buffer[i + 1] != 0) {
+ if ((kanji_code == SJIS) && IS_SJIS_X0201KANA(UCH((buffer[i])))) {
+ continue;
+ }
+ i++;
+ } else {
+ buffer[i] = UCH(TOUPPER(buffer[i]));
+ }
+#else
+ buffer[i] = UCH(TOUPPER(buffer[i]));
+#endif
+ }
+}
+
+/*
+ * Remove newlines from a string, returning true if we removed any.
+ */
+BOOLEAN LYRemoveNewlines(char *buffer)
+{
+ BOOLEAN result = FALSE;
+
+ if (buffer != 0) {
+ register char *buf = buffer;
+
+ for (; *buf && *buf != '\n' && *buf != '\r'; buf++) ;
+ if (*buf) {
+ /* runs very seldom */
+ char *old = buf;
+
+ for (; *old; old++) {
+ if (*old != '\n' && *old != '\r')
+ *buf++ = *old;
+ }
+ *buf = '\0';
+ result = TRUE;
+ }
+ }
+ return result;
+}
+
+/*
+ * Remove leading/trailing whitespace from a string, reduce runs of embedded
+ * whitespace to single blanks.
+ */
+char *LYReduceBlanks(char *buffer)
+{
+ if (non_empty(buffer)) {
+ LYTrimLeading(buffer);
+ LYTrimTrailing(buffer);
+ convert_to_spaces(buffer, TRUE);
+ }
+ return buffer;
+}
+
+/*
+ * Remove ALL whitespace from a string (including embedded blanks), and returns
+ * a pointer to the end of the trimmed string.
+ */
+char *LYRemoveBlanks(char *buffer)
+{
+ char *result = NULL;
+
+ if (buffer != 0) {
+ register char *buf = buffer;
+
+ for (; *buf && !isspace(UCH(*buf)); buf++) ;
+ if (*buf) {
+ /* runs very seldom */
+ char *old = buf;
+
+ for (; *old; old++) {
+ if (!isspace(UCH(*old)))
+ *buf++ = *old;
+ }
+ *buf = '\0';
+ }
+ result = buf;
+ }
+ return result;
+}
+
+/*
+ * Skip whitespace
+ */
+char *LYSkipBlanks(char *buffer)
+{
+ if (buffer != NULL) {
+ while (isspace(UCH((*buffer))))
+ buffer++;
+ }
+ return buffer;
+}
+
+/*
+ * Skip non-whitespace
+ */
+char *LYSkipNonBlanks(char *buffer)
+{
+ if (buffer != NULL) {
+ while (*buffer != 0 && !isspace(UCH((*buffer))))
+ buffer++;
+ }
+ return buffer;
+}
+
+/*
+ * Skip const whitespace
+ */
+const char *LYSkipCBlanks(const char *buffer)
+{
+ while (isspace(UCH((*buffer))))
+ buffer++;
+ return buffer;
+}
+
+/*
+ * Skip const non-whitespace
+ */
+const char *LYSkipCNonBlanks(const char *buffer)
+{
+ while (*buffer != 0 && !isspace(UCH((*buffer))))
+ buffer++;
+ return buffer;
+}
+
+/*
+ * Trim leading blanks from a string
+ */
+void LYTrimLeading(char *buffer)
+{
+ char *skipped = LYSkipBlanks(buffer);
+
+ while ((*buffer++ = *skipped++) != 0) ;
+}
+
+/*
+ * Trim trailing newline(s) from a string
+ */
+char *LYTrimNewline(char *buffer)
+{
+ size_t i = strlen(buffer);
+
+ while (i != 0 && (buffer[i - 1] == '\n' || buffer[i - 1] == '\r'))
+ buffer[--i] = 0;
+ return buffer;
+}
+
+/*
+ * Trim trailing blanks from a string
+ */
+void LYTrimTrailing(char *buffer)
+{
+ size_t i = strlen(buffer);
+
+ while (i != 0 && isspace(UCH(buffer[i - 1])))
+ buffer[--i] = 0;
+}
+
+/* 1997/11/10 (Mon) 14:26:10, originally string_short() in LYExterns.c, but
+ * moved here because LYExterns is not always configured.
+ */
+char *LYElideString(char *str,
+ int cut_pos)
+{
+ char buff[MAX_LINE], *s, *d;
+ static char s_str[MAX_LINE];
+ int len;
+
+ LYStrNCpy(buff, str, sizeof(buff) - 1);
+ len = (int) strlen(buff);
+ if (len > (LYcolLimit - 9)) {
+ buff[cut_pos] = '.';
+ buff[cut_pos + 1] = '.';
+ for (s = (buff + len) - (LYcolLimit - 9) + cut_pos + 1,
+ d = (buff + cut_pos) + 2;
+ s >= buff &&
+ d >= buff &&
+ d < buff + LYcols &&
+ (*d++ = *s++) != 0;) ;
+ buff[LYcols] = 0;
+ }
+ strcpy(s_str, buff);
+ return (s_str);
+}
+
+/*
+ * Trim a startfile, returning true if it looks like one of the Lynx tags.
+ */
+BOOLEAN LYTrimStartfile(char *buffer)
+{
+ BOOLEAN result = FALSE;
+
+ LYTrimHead(buffer);
+ if (isLYNXEXEC(buffer) ||
+ isLYNXPROG(buffer)) {
+ /*
+ * The original implementations of these schemes expected white space
+ * without hex escaping, and did not check for hex escaping, so we'll
+ * continue to support that, until that code is redone in conformance
+ * with SGML principles. - FM
+ */
+ HTUnEscapeSome(buffer, " \r\n\t");
+ convert_to_spaces(buffer, TRUE);
+ result = TRUE;
+ }
+ return result;
+}
+
+/*
+ * Escape unsafe characters in startfile, except for lynx internal URLs.
+ */
+void LYEscapeStartfile(char **buffer)
+{
+ if (!LYTrimStartfile(*buffer)) {
+ char *escaped = HTEscapeUnsafe(*buffer);
+
+ StrAllocCopy(*buffer, escaped);
+ FREE(escaped);
+ }
+}
+
+/*
+ * Trim all blanks from startfile, except for lynx internal URLs.
+ */
+void LYTrimAllStartfile(char *buffer)
+{
+ if (!LYTrimStartfile(buffer)) {
+ LYRemoveBlanks(buffer);
+ }
+}
+
+/*
+ * Display the current value of the string and allow the user to edit it.
+ */
+
+/*
+ * Shorthand to get rid of the "edit->suchandsos".
+ */
+#define IsDirty edit->efIsDirty
+#define IsHidden edit->efIsMasked
+#define StartX edit->efStartX
+#define StartY edit->efStartY
+#define Buffer edit->efBuffer
+#define EditAt edit->efEditAt /* current editing position (bytes) */
+#define BufInUse edit->efBufInUse /* length (bytes) */
+#define BufAlloc edit->efBufAlloc
+#define BufLimit edit->efBufLimit
+#define DpyWidth edit->efWidth
+#define DpyStart edit->efDpyStart /* display-start (columns) */
+#define PanMargin edit->efPanMargin
+#define IsPanned edit->efIsPanned
+#define PadChar edit->efPadChar
+#ifdef ENHANCED_LINEEDIT
+#define EditMark edit->efEditMark
+#endif
+#define InputMods edit->efInputMods
+#define Offs2Col edit->efOffs2Col
+
+#define enableEditMark() \
+ if (EditMark < 0) \
+ EditMark = -(1 + EditMark)
+
+#define disableEditMark() \
+ if (EditMark >= 0) \
+ EditMark = -(1 + EditMark)
+
+#ifdef ENHANCED_LINEEDIT
+static bstring *killbuffer;
+#endif
+
+static void updateMargin(FieldEditor * edit)
+{
+ if ((int) BufAlloc > DpyWidth) { /* Need panning? */
+ if (DpyWidth > 4)
+ IsPanned = TRUE;
+
+ /*
+ * Figure out margins. If too big, we do a lot of unnecessary
+ * scrolling. If too small, user doesn't have sufficient look-ahead.
+ * Let's say 25% for each margin, upper bound is 10 columns.
+ */
+ PanMargin = DpyWidth / 4;
+ if (PanMargin > 10)
+ PanMargin = 10;
+ }
+}
+
+/*
+ * Before using an array position, make sure that the array is long enough.
+ * Reallocate if needed.
+ */
+static void ExtendEditor(FieldEditor * edit, int position)
+{
+ size_t need = (size_t) (++position);
+
+ if (need >= BufAlloc && (BufLimit == 0 || need < BufLimit)) {
+ CTRACE((tfp, "ExtendEditor from %lu to %lu\n",
+ (unsigned long) BufAlloc,
+ (unsigned long) need));
+ Buffer = typeRealloc(char, Buffer, need);
+ Offs2Col = typeRealloc(int, Offs2Col, need + 1);
+
+ BufAlloc = need;
+ updateMargin(edit);
+ }
+}
+
+void LYFinishEdit(FieldEditor * edit)
+{
+ CTRACE((tfp, "LYFinishEdit:%s\n", NonNull(Buffer)));
+
+ FREE(Buffer);
+ FREE(Offs2Col);
+}
+
+void LYSetupEdit(FieldEditor * edit, char *old_value, unsigned buffer_limit, int display_limit)
+{
+ CTRACE((tfp, "LYSetupEdit buffer %lu, display %d:%s\n",
+ (unsigned long) buffer_limit,
+ display_limit,
+ old_value));
+
+ BufLimit = buffer_limit;
+ if (buffer_limit == 0)
+ buffer_limit = (unsigned) strlen(old_value) + 1;
+
+ /*
+ * Initialize edit record
+ */
+ LYGetYX(StartY, StartX);
+ PadChar = ' ';
+ IsDirty = TRUE;
+ IsPanned = FALSE;
+ InputMods = 0;
+
+ BufAlloc = buffer_limit;
+ DpyWidth = display_limit;
+ PanMargin = 0;
+ EditAt = (int) strlen(old_value);
+#ifdef ENHANCED_LINEEDIT
+ EditMark = -1; /* pos=0, but do not show it yet */
+#endif
+ DpyStart = 0;
+
+ updateMargin(edit);
+
+ BufInUse = strlen(old_value);
+ Buffer = typecallocn(char, BufAlloc + 1);
+
+ if (Buffer == 0)
+ outofmem(__FILE__, "LYSetupEdit");
+
+ LYStrNCpy(Buffer, old_value, buffer_limit);
+ Offs2Col = typecallocn(int, BufAlloc + 1);
+
+ if (Offs2Col == 0)
+ outofmem(__FILE__, "LYSetupEdit");
+}
+
+#ifdef SUPPORT_MULTIBYTE_EDIT
+
+/*
+ * MBCS positioning routines below are specific to SUPPORT_MULTIBYTE_EDIT code.
+ * Currently they handle UTF-8 and (hopefully) CJK.
+ * Current encoding is recognized using defines below.
+ *
+ * LYmbcs* functions don't look very convenient to use here...
+ * Do we really need utf_flag as an argument?
+ *
+ * It is set (see IS_UTF8_TTY) for every invocation out there, and they use
+ * HTCJK flag internally anyway. Something like LYmbcsstrnlen == mbcs_glyphs
+ * would be useful to work with string slices -Sergej Kvachonok
+ */
+
+#define IS_UTF8_EXTRA(x) (((unsigned char)(x) & 0300) == 0200)
+
+/*
+ * Counts glyphs in a multibyte (sub)string s of length len.
+ */
+static int mbcs_glyphs(char *s, int len)
+{
+ int glyphs = 0;
+ int i;
+
+ if (IS_UTF8_TTY) {
+ for (i = 0; s[i] && i < len; i++)
+ if (!IS_UTF8_EXTRA(s[i]))
+ glyphs++;
+ } else if (IS_CJK_TTY) {
+ for (i = 0; s[i] && i < len; i++, glyphs++)
+ if (is8bits(s[i]))
+ i++;
+ } else {
+ glyphs = len;
+ }
+ return glyphs;
+}
+
+/*
+ * Check if there are no continuation bytes in the multibyte (sub)string of
+ * length len.
+ */
+static int mbcs_valid(char *s, int len, int limit)
+{
+ int i;
+ int result = FALSE;
+
+ if (IS_UTF8_TTY) {
+ for (i = 0; s[i] && i < limit; i++) {
+ if (!IS_UTF8_EXTRA(s[i])) {
+ if ((i + 1) == len) {
+ result = TRUE;
+ break;
+ }
+ }
+ }
+ } else if (IS_CJK_TTY) {
+ for (i = 0; s[i] && i < limit; i++) {
+ if (!is8bits(s[i])) {
+ if ((i + 1) == len) {
+ result = TRUE;
+ break;
+ }
+ }
+ }
+ } else {
+ result = TRUE;
+ }
+ return result;
+}
+
+/*
+ * Calculates offset in bytes of a glyph at cell position pos.
+ */
+static int mbcs_skip(char *s, int pos)
+{
+ int p, i;
+
+ if (IS_UTF8_TTY) {
+ for (i = 0, p = 0; s[i]; i++) {
+ if (!IS_UTF8_EXTRA(s[i]))
+ p++;
+ if (p > pos)
+ break;
+ }
+ } else if (IS_CJK_TTY) {
+ for (p = i = 0; s[i] && p < pos; p++, i++)
+ if (is8bits(s[i]))
+ i++;
+ } else {
+ i = pos;
+ }
+
+ return i;
+}
+
+/*
+ * Given a string that would display (at least) the given number of cells,
+ * determine the number of multibyte characters that comprised those cells.
+ */
+static int cell2char(char *s, int cells)
+{
+ int result = 0;
+ int len = (int) strlen(s);
+ int pos;
+ int have;
+
+ CTRACE_EDIT((tfp, "cell2char(%d) %d:%s\n", cells, len, s));
+ if (len != 0) {
+ int best = -1;
+
+ for (pos = 0; pos <= len; ++pos) {
+ have = LYstrExtent2(s, pos);
+ CTRACE_EDIT((tfp, " %2d:%2d:%.*s\n", pos, have, pos, s));
+ if (have >= cells) {
+ if (cells <= 0)
+ break;
+ /* the best solution is the one with the most bytes */
+ best = pos;
+ if (mbcs_valid(s, pos, len))
+ break;
+ }
+ }
+ if (best >= 0)
+ pos = best;
+ if (pos > len)
+ pos = len;
+ } else {
+ pos = 0;
+ }
+ result = mbcs_glyphs(s, pos);
+ CTRACE_EDIT((tfp, "->%d\n", result));
+ return result;
+}
+
+#endif /* SUPPORT_MULTIBYTE_EDIT */
+
+#ifdef EXP_KEYBOARD_LAYOUT
+static int map_active = 0;
+
+#else
+#define map_active 0
+#endif
+
+int LYEditInsert(FieldEditor * edit, unsigned const char *s,
+ int len,
+ int map GCC_UNUSED,
+ int maxMessage)
+{
+ int length = (int) strlen(Buffer);
+ int remains = (int) BufAlloc - (length + len);
+ int edited = 0, overflow = 0;
+
+ /*
+ * ch is (presumably) printable character.
+ */
+ if (remains < 0) {
+ overflow = 1;
+ len = 0;
+ if ((int) BufAlloc > length) /* Insert as much as we can */
+ len = (int) BufAlloc - length;
+ else
+ goto finish;
+ }
+ ExtendEditor(edit, length + len);
+ Buffer[length + len] = '\0';
+ for (; length >= EditAt; length--) /* Make room */
+ Buffer[length + len] = Buffer[length];
+#ifdef EXP_KEYBOARD_LAYOUT
+ if (map < 0)
+ map = map_active;
+ if (map && IS_UTF8_TTY) {
+ int off = EditAt;
+ unsigned const char *e = s + len;
+ char *tail = 0;
+
+ while (s < e) {
+ char utfbuf[8];
+ int l = 1;
+
+ utfbuf[0] = (char) *s;
+ if (*s < 128 && LYKbLayouts[current_layout][*s]) {
+ UCode_t ucode = LYKbLayouts[current_layout][*s];
+
+ if (ucode > 127) {
+ if (UCConvertUniToUtf8(ucode, utfbuf)) {
+ l = (int) strlen(utfbuf);
+ remains -= l - 1;
+ if (remains < 0) {
+ if (tail)
+ strcpy(Buffer + off, tail);
+ FREE(tail);
+ len = off;
+ overflow = 1;
+ goto finish;
+ }
+ if (l > 1 && !tail)
+ StrAllocCopy(tail, Buffer + EditAt + len);
+ } else
+ utfbuf[0] = '?';
+ } else
+ utfbuf[0] = (char) ucode;
+ }
+ if ((size_t) (off + l) <= BufAlloc) {
+ memcpy(Buffer + off, utfbuf, (size_t) l);
+ edited = 1;
+ off += l;
+ }
+ s++;
+ }
+ if (tail)
+ strcpy(Buffer + off, tail);
+ len = off - EditAt;
+ FREE(tail);
+ } else if (map) {
+ unsigned const char *e = s + len;
+ unsigned char *t = (unsigned char *) Buffer + EditAt;
+
+ while (s < e) {
+ int ch;
+
+ if (*s < 128 && LYKbLayouts[current_layout][*s]) {
+ ch = UCTransUniChar((UCode_t) LYKbLayouts[current_layout][*s],
+ current_char_set);
+ if (ch < 0)
+ ch = '?';
+ } else
+ ch = *s;
+ *t = UCH(ch);
+ t++, s++;
+ }
+ edited = 1;
+ } else
+#endif /* defined EXP_KEYBOARD_LAYOUT */
+ {
+ StrNCpy(Buffer + EditAt, (const char *) s, len);
+ edited = 1;
+ }
+
+ finish:
+ EditAt += len;
+ BufInUse += (size_t) len;
+ if (edited)
+ IsDirty = TRUE;
+ if (overflow && maxMessage)
+ _statusline(MAXLEN_REACHED_DEL_OR_MOV);
+#ifdef ENHANCED_LINEEDIT
+ if (EditMark > EditAt)
+ EditMark += len;
+ else if (EditMark < -(1 + EditAt))
+ EditMark -= len;
+ disableEditMark();
+#endif
+ return edited;
+}
+
+/*
+ * Do one edit-operation, given the input 'ch' and working buffer 'edit'.
+ *
+ * If the input is processed, returns zero.
+ * If the action should be performed outside of line-editing mode, return -ch.
+ * Otherwise, e.g., returns 'ch'.
+ */
+int LYDoEdit(FieldEditor * edit, int ch,
+ int action,
+ int maxMessage)
+{
+ int i;
+ int length;
+ unsigned char uch;
+ int offset;
+
+ if ((int) BufAlloc <= 0)
+ return (0); /* Be defensive */
+
+ BufInUse = strlen(&Buffer[0]);
+ length = (int) BufInUse;
+
+ switch (action) {
+#ifdef EXP_KEYBOARD_LAYOUT
+ case LYE_SWMAP:
+ /*
+ * Turn input character mapping on or off.
+ */
+ map_active = ~map_active;
+ break;
+#endif
+#ifndef CJK_EX
+ case LYE_AIX:
+ /*
+ * Handle CJK characters, or as a valid character in the current
+ * display character set. Otherwise, we treat this as LYE_ENTER.
+ */
+ if (!IS_CJK_TTY && LYlowest_eightbit[current_char_set] > 0x97)
+ return (ch);
+#endif
+ /* FALLTHRU */
+ case LYE_CHAR:
+ uch = UCH(ch);
+ LYEditInsert(edit, &uch, 1, map_active, maxMessage);
+ return 0; /* All changes already registered */
+
+ case LYE_C1CHAR:
+ /*
+ * ch is the second part (in most cases, a capital letter) of a 7-bit
+ * replacement for a character in the 8-bit C1 control range.
+ *
+ * This is meant to undo transformations like 0x81 -> 0x1b 0x41 (ESC A)
+ * etc., done by slang on Unix and possibly some comm programs. It's
+ * an imperfect workaround that doesn't work for all such characters.
+ */
+ ch &= 0xFF;
+ if (ch + 64 >= LYlowest_eightbit[current_char_set])
+ ch += 64;
+
+ if (EditAt <= ((int) BufAlloc) && BufInUse < BufAlloc) {
+#ifdef ENHANCED_LINEEDIT
+ if (EditMark > EditAt)
+ EditMark++;
+ else if (EditMark < -(1 + EditAt))
+ EditMark--;
+ disableEditMark();
+#endif
+ ExtendEditor(edit, length + 1);
+ for (i = length; i >= EditAt; i--) /* Make room */
+ Buffer[i + 1] = Buffer[i];
+ Buffer[length + 1] = '\0';
+ Buffer[EditAt] = (char) ch;
+ EditAt++;
+ } else {
+ if (maxMessage) {
+ _statusline(MAXLEN_REACHED_DEL_OR_MOV);
+ }
+ return (ch);
+ }
+ break;
+
+ case LYE_BACKW: /* go backward one word */
+ while (EditAt && !IsWordChar(Buffer[EditAt - 1]))
+ EditAt--;
+ while (EditAt && IsWordChar(UCH(Buffer[EditAt - 1])))
+ EditAt--;
+ break;
+
+ case LYE_FORWW: /* go forward one word */
+ while (IsWordChar(UCH(Buffer[EditAt])))
+ EditAt++;
+ while (!IsWordChar(Buffer[EditAt]) && Buffer[EditAt])
+ EditAt++;
+ break;
+
+ case LYE_ERASE: /* erase the line */
+ Buffer[0] = '\0';
+#ifdef ENHANCED_LINEEDIT
+ EditMark = -1; /* Do not show the mark */
+#endif
+ /* FALLTHRU */
+
+ case LYE_BOL: /* go to beginning of line */
+ EditAt = 0;
+ break;
+
+ case LYE_EOL: /* go to end of line */
+ EditAt = length;
+ break;
+
+ case LYE_DELNW: /* delete next word */
+ offset = EditAt;
+ LYDoEdit(edit, 0, LYE_FORWW, FALSE);
+ offset = EditAt - offset;
+ EditAt -= offset;
+
+ goto shrink; /* right below */
+
+ case LYE_DELPW: /* delete previous word */
+ offset = EditAt;
+ LYDoEdit(edit, 0, LYE_BACKW, FALSE);
+ offset -= EditAt;
+
+ shrink:
+ for (i = EditAt; i < length - offset + 1; i++)
+ Buffer[i] = Buffer[i + offset];
+#ifdef ENHANCED_LINEEDIT
+ disableEditMark();
+ if (EditMark <= -(1 + EditAt + offset))
+ EditMark += offset; /* Shift it */
+ if (-(1 + EditAt + offset) < EditMark && EditMark < -(1 + EditAt))
+ EditMark = -(1 + EditAt); /* Set to the current position */
+#endif
+
+ break;
+
+ case LYE_DELBL: /* delete from cursor to beginning of line */
+ for (i = EditAt; i < length + 1; i++)
+ Buffer[i - EditAt] = Buffer[i];
+
+#ifdef ENHANCED_LINEEDIT
+ disableEditMark();
+ if (EditMark <= -(1 + EditAt))
+ EditMark += EditAt; /* Shift it */
+ else
+ EditMark = -1; /* Reset it */
+#endif
+ EditAt = 0;
+ break;
+
+ case LYE_DELEL: /* delete from cursor to end of line */
+ Buffer[EditAt] = '\0';
+#ifdef ENHANCED_LINEEDIT
+ disableEditMark();
+ if (EditMark <= -(1 + EditAt))
+ EditMark = -1; /* Reset it */
+#endif
+ break;
+
+ case LYE_DELN: /* delete next character */
+ if (EditAt >= length)
+ break;
+#ifndef SUPPORT_MULTIBYTE_EDIT
+ EditAt++;
+#else
+ EditAt += mbcs_skip(Buffer + EditAt, 1);
+#endif
+ /* FALLTHRU */
+
+ case LYE_DELP: /* delete previous character */
+ if (length == 0 || EditAt == 0)
+ break;
+
+#ifndef SUPPORT_MULTIBYTE_EDIT
+#ifdef ENHANCED_LINEEDIT
+ disableEditMark();
+ if (EditMark <= -(1 + EditAt))
+ EditMark++;
+#endif
+ EditAt--;
+ for (i = EditAt; i < length; i++)
+ Buffer[i] = Buffer[i + 1];
+#else /* SUPPORT_MULTIBYTE_EDIT */
+ offset = EditAt - mbcs_skip(Buffer, mbcs_glyphs(Buffer, EditAt) - 1);
+ EditAt -= offset;
+ for (i = EditAt; i < length - offset + 1; i++)
+ Buffer[i] = Buffer[i + offset];
+
+#ifdef ENHANCED_LINEEDIT
+ disableEditMark();
+ if (EditMark <= -(1 + EditAt))
+ EditMark += offset; /* Shift it */
+#endif
+
+#endif /* SUPPORT_MULTIBYTE_EDIT */
+ break;
+
+ case LYE_FORW_RL:
+ case LYE_FORW: /* move cursor forward */
+#ifndef SUPPORT_MULTIBYTE_EDIT
+ if (EditAt < length)
+ EditAt++;
+#else
+ if (EditAt < length)
+ EditAt += mbcs_skip(Buffer + EditAt, 1);
+#endif
+ else if (action == LYE_FORW_RL)
+ return -ch;
+ break;
+
+ case LYE_BACK_LL:
+ case LYE_BACK: /* move cursor backward */
+#ifndef SUPPORT_MULTIBYTE_EDIT
+ if (EditAt > 0)
+ EditAt--;
+#else
+ if (EditAt > 0)
+ EditAt = mbcs_skip(Buffer, mbcs_glyphs(Buffer, EditAt) - 1);
+#endif
+ else if (action == LYE_BACK_LL)
+ return -ch;
+ break;
+
+#ifdef ENHANCED_LINEEDIT
+ case LYE_TPOS:
+ /*
+ * Transpose characters - bash or ksh(emacs not gmacs) style
+ */
+
+#ifdef SUPPORT_MULTIBYTE_EDIT
+ if (IS_UTF8_TTY || IS_CJK_TTY)
+ break; /* Can't help it now */
+#endif
+
+ if (length <= 1 || EditAt == 0)
+ return (ch);
+ if (EditAt == length)
+ EditAt--;
+ enableEditMark();
+ if (EditMark == EditAt || EditMark == EditAt + 1)
+ EditMark = EditAt - 1;
+ disableEditMark();
+ if (Buffer[EditAt - 1] == Buffer[EditAt]) {
+ EditAt++;
+ break;
+ }
+ i = Buffer[EditAt - 1];
+ Buffer[EditAt - 1] = Buffer[EditAt];
+ Buffer[EditAt++] = (char) i;
+ break;
+
+ case LYE_SETMARK: /* Emacs-like set-mark-command */
+ EditMark = EditAt;
+ return (0);
+
+ case LYE_XPMARK: /* Emacs-like exchange-point-and-mark */
+ enableEditMark();
+ if (EditMark == EditAt)
+ return (0);
+ i = EditAt;
+ EditAt = EditMark;
+ EditMark = i;
+ break;
+
+ case LYE_KILLREG: /* Emacs-like kill-region */
+ enableEditMark();
+ if (EditMark == EditAt) {
+ BStrFree(killbuffer);
+ return (0);
+ }
+ if (EditMark > EditAt)
+ LYDoEdit(edit, 0, LYE_XPMARK, FALSE);
+ {
+ int reglen = EditAt - EditMark;
+
+ BStrCopy1(killbuffer, Buffer + EditMark, reglen);
+ for (i = EditMark; Buffer[i + reglen]; i++)
+ Buffer[i] = Buffer[i + reglen];
+ Buffer[i] = Buffer[i + reglen]; /* terminate */
+ EditAt = EditMark;
+ }
+ disableEditMark();
+ break;
+
+ case LYE_YANK: /* Emacs-like yank */
+ if (!killbuffer) {
+ EditMark = -(1 + EditAt);
+ return (0);
+ } else {
+ int yanklen = killbuffer->len;
+
+ if ((EditAt + yanklen) <= (int) BufAlloc &&
+ BufInUse + (size_t) yanklen <= BufAlloc) {
+
+ ExtendEditor(edit, EditAt + yanklen);
+
+ EditMark = -(1 + EditAt);
+
+ for (i = length; i >= EditAt; i--) /* Make room */
+ Buffer[i + yanklen] = Buffer[i];
+ for (i = 0; i < yanklen; i++)
+ Buffer[EditAt++] = killbuffer->str[i];
+
+ } else if (maxMessage) {
+ _statusline(MAXLEN_REACHED_DEL_OR_MOV);
+ }
+ }
+ break;
+
+#endif /* ENHANCED_LINEEDIT */
+
+ case LYE_UPPER:
+ LYUpperCase(Buffer);
+ break;
+
+ case LYE_LOWER:
+ LYLowerCase(Buffer);
+ break;
+
+ default:
+ return (ch);
+ }
+ IsDirty = TRUE;
+ BufInUse = strlen(&Buffer[0]);
+ return (0);
+}
+
+/*
+ * This function prompts for a choice or page number.
+ * If a 'g' or 'p' suffix is included, that will be
+ * loaded into c. Otherwise, c is zeroed. - FM & LE
+ */
+int get_popup_number(const char *msg,
+ int *c,
+ int *rel)
+{
+ bstring *temp = NULL;
+ int result = 0;
+
+ /*
+ * Load the c argument into the prompt buffer.
+ */
+ BStrCopy0(temp, "?");
+ temp->str[0] = (char) *c;
+
+ _statusline(msg);
+
+ /*
+ * Get the number, possibly with a suffix, from the user.
+ */
+ if (LYgetBString(&temp, FALSE, 0, NORECALL) < 0 || isBEmpty(temp)) {
+ HTInfoMsg(CANCELLED);
+ *c = '\0';
+ *rel = '\0';
+ } else {
+ char *p = temp->str;
+
+ *rel = '\0';
+ result = atoi(p);
+ while (isdigit(UCH(*p)))
+ ++p;
+ switch (*p) {
+ case '+':
+ case '-':
+ /* 123+ or 123- */
+ *rel = *p++;
+ *c = *p;
+ break;
+ default:
+ *c = *p++;
+ *rel = *p;
+ break;
+ case 0:
+ break;
+ }
+
+ /*
+ * If we had a 'g' or 'p' suffix, load it into c. Otherwise, zero c. Then
+ * return the number.
+ */
+ if (*p == 'g' || *p == 'G') {
+ *c = 'g';
+ } else if (*p == 'p' || *p == 'P') {
+ *c = 'p';
+ } else {
+ *c = '\0';
+ }
+ if (*rel != '+' && *rel != '-')
+ *rel = 0;
+ }
+ BStrFree(temp);
+ return result;
+}
+
+#ifdef USE_COLOR_STYLE
+# define TmpStyleOn(s) curses_style((s), STACK_ON)
+# define TmpStyleOff(s) curses_style((s), STACK_OFF)
+#else
+# define TmpStyleOn(s)
+# define TmpStyleOff(s)
+#endif /* defined USE_COLOR_STYLE */
+
+static void remember_column(FieldEditor * edit, int offset)
+{
+ int y0, x0;
+
+#if defined(USE_SLANG)
+ y0 = 0;
+ x0 = SLsmg_get_column();
+#elif defined(USE_CURSES_PADS)
+ getyx(LYwin, y0, x0);
+#else
+ getyx(stdscr, y0, x0);
+#endif
+ Offs2Col[offset] = x0;
+
+ (void) y0;
+ (void) x0;
+}
+
+static void fill_edited_line(int prompting GCC_UNUSED, int length, int ch)
+{
+ int i;
+
+ TmpStyleOn(prompting ? s_prompt_edit_pad : s_aedit_pad);
+
+ for (i = 0; i < length; i++) {
+ LYaddch(UCH(ch));
+ }
+
+ TmpStyleOff(prompting ? s_prompt_edit_pad : s_aedit_pad);
+}
+
+/*
+ * Multibyte string display subroutine.
+ * FieldEditor fields retain their values as byte offsets.
+ * All external logic still works fine with byte values.
+ */
+void LYRefreshEdit(FieldEditor * edit)
+{
+ /* bytes and characters are not the same thing */
+#if defined(DEBUG_EDIT)
+ int all_bytes;
+#endif
+ int pos_bytes = EditAt;
+ int dpy_bytes;
+ int lft_bytes; /* base of string which is displayed */
+
+ /* cells refer to display-columns on the screen */
+ int all_cells; /* total of display-cells in Buffer */
+ int dpy_cells; /* number of cells which are displayed */
+ int lft_cells; /* number of cells before display (on left) */
+ int pos_cells; /* number of display-cells up to EditAt */
+
+#if defined(SUPPORT_MULTIBYTE_EDIT)
+ int dpy_chars;
+ int lft_chars;
+
+#if defined(DEBUG_EDIT)
+ int all_chars;
+ int pos_chars;
+#endif
+#endif
+
+ /* other data */
+ int i;
+ int padsize;
+ char *str;
+ int lft_shift = 0;
+ int rgt_shift = 0;
+
+#ifdef USE_COLOR_STYLE
+ int estyle;
+#endif
+ int prompting = 0;
+
+ (void) pos_bytes;
+
+ /*
+ * If we've made no changes, or if there is nothing to display, just leave.
+ */
+ if (!IsDirty || (DpyWidth == 0))
+ return;
+
+ CTRACE((tfp, "LYRefreshEdit:%s\n", Buffer));
+
+ IsDirty = FALSE;
+
+ BufInUse = strlen(&Buffer[0]);
+
+ all_cells = LYstrCells(Buffer);
+ pos_cells = LYstrExtent2(Buffer, EditAt);
+
+#if defined(SUPPORT_MULTIBYTE_EDIT) && defined(DEBUG_EDIT)
+ all_bytes = (int) BufInUse;
+ lft_chars = mbcs_glyphs(Buffer, DpyStart);
+ pos_chars = mbcs_glyphs(Buffer, EditAt);
+ all_chars = mbcs_glyphs(Buffer, all_bytes);
+#endif
+
+ /*
+ * Now we have:
+ * .--DpyWidth--.
+ * +---------+=============+-----------+
+ * | |M M| | (M=PanMargin)
+ * +---------+=============+-----------+
+ * 0 DpyStart BufInUse
+ *
+ * Insertion point can be anywhere between 0 and stringlength. Calculate
+ * a new display starting point.
+ *
+ * First, make Lynx scroll several columns at a time as needed when
+ * extending the string. Doing this helps with lowspeed connections.
+ */
+
+ lft_bytes = DpyStart;
+ lft_cells = LYstrExtent2(Buffer, DpyStart);
+
+ if ((lft_cells + DpyWidth) <= all_cells) {
+ if (pos_cells >= (lft_cells + DpyWidth) - PanMargin) {
+ lft_cells = (pos_cells - DpyWidth) + PanMargin;
+#ifdef SUPPORT_MULTIBYTE_EDIT
+ lft_chars = cell2char(Buffer, lft_cells);
+ lft_bytes = mbcs_skip(Buffer, lft_chars);
+#else
+ lft_bytes = lft_cells;
+#endif /* SUPPORT_MULTIBYTE_EDIT */
+ }
+ }
+
+ if (pos_cells < lft_cells + PanMargin) {
+ lft_cells = pos_cells - PanMargin;
+ if (lft_cells < 0)
+ lft_cells = 0;
+#ifdef SUPPORT_MULTIBYTE_EDIT
+ lft_chars = cell2char(Buffer, lft_cells);
+ lft_bytes = mbcs_skip(Buffer, lft_chars);
+#else
+ lft_bytes = lft_cells;
+#endif /* SUPPORT_MULTIBYTE_EDIT */
+ }
+
+ LYmove(StartY, StartX);
+
+ /*
+ * Draw the left scrolling-indicator now, to avoid the complication of
+ * overwriting part of a multicolumn character which may lie in the first
+ * position.
+ */
+ if (IsPanned && lft_cells) {
+ CTRACE_EDIT((tfp, "Draw left scroll-indicator\n"));
+ TmpStyleOn(prompting ? s_prompt_edit_arr : s_aedit_arr);
+ LYmove(StartY, StartX);
+ LYaddch(ACS_LARROW);
+ TmpStyleOff(prompting ? s_prompt_edit_arr : s_aedit_arr);
+ lft_shift = 1;
+ }
+
+ str = &Buffer[lft_bytes];
+ DpyStart = lft_bytes;
+
+ dpy_cells = all_cells - lft_cells;
+ CTRACE_EDIT((tfp, "Comparing dpy_cells %d > (%d - %d)\n",
+ dpy_cells, DpyWidth, lft_shift));
+ if (dpy_cells > (DpyWidth - lft_shift)) {
+ rgt_shift = 1;
+ dpy_cells = (DpyWidth - lft_shift - rgt_shift);
+ }
+ for (;;) {
+#ifdef SUPPORT_MULTIBYTE_EDIT
+ dpy_chars = cell2char(str, dpy_cells);
+ dpy_bytes = mbcs_skip(str, dpy_chars);
+#else
+ dpy_bytes = dpy_cells;
+#endif /* SUPPORT_MULTIBYTE_EDIT */
+ /*
+ * The last character on the display may be multicolumn, and if we take
+ * away a single cell for the right scroll-indicator, that would force
+ * us to display fewer characters. Check for that, and recompute.
+ */
+ if (rgt_shift && *str) {
+ int old_cells = dpy_cells;
+
+ dpy_cells = LYstrExtent2(str, dpy_bytes);
+ if (dpy_cells > old_cells)
+ dpy_cells = old_cells - 1;
+
+ CTRACE_EDIT((tfp, "Comparing cells %d vs %d\n", dpy_cells, old_cells));
+ if (dpy_cells < old_cells) {
+ CTRACE_EDIT((tfp, "Recomputing...\n"));
+ continue;
+ }
+ }
+ break;
+ }
+
+ CTRACE_EDIT((tfp, "BYTES left %2d pos %2d dpy %2d all %2d\n",
+ lft_bytes, pos_bytes, dpy_bytes, all_bytes));
+ CTRACE_EDIT((tfp, "CELLS left %2d pos %2d dpy %2d all %2d\n",
+ lft_cells, pos_cells, dpy_cells, all_cells));
+ CTRACE_EDIT((tfp, "CHARS left %2d pos %2d dpy %2d all %2d\n",
+ lft_chars, pos_chars, dpy_chars, all_chars));
+
+#ifdef USE_COLOR_STYLE
+ /*
+ * If this is the last screen line, set attributes to normal, should only
+ * be needed for color styles. The curses function may be used directly to
+ * avoid complications. - kw
+ */
+ if (StartY == (LYlines - 1))
+ prompting = 1;
+ if (prompting) {
+ estyle = s_prompt_edit;
+ } else {
+ estyle = s_aedit;
+ }
+ CTRACE2(TRACE_STYLE,
+ (tfp, "STYLE.getstr: switching to <edit.%s>.\n",
+ prompting ? "prompt" : "active"));
+ if (estyle != NOSTYLE) {
+ curses_style(estyle, STACK_ON);
+ } else {
+ (void) wattrset(LYwin, A_NORMAL); /* need to do something about colors? */
+ }
+#endif
+ if (IsHidden) {
+ BOOL utf_flag = IS_UTF8_TTY;
+ int cell = 0;
+
+ fill_edited_line(0, dpy_cells, '*');
+
+ i = 0;
+ do {
+ const char *last = str + i;
+ const char *next = LYmbcs_skip_glyphs(last, 1, utf_flag);
+ int j = (int) (next - str);
+
+ while (i < j) {
+ Offs2Col[i++] = cell + StartX;
+ }
+ cell += LYstrExtent2(last, (int) (next - last));
+ } while (i < dpy_bytes);
+ Offs2Col[i] = cell + StartX;
+ } else {
+#if defined(ENHANCED_LINEEDIT) && defined(USE_COLOR_STYLE)
+ if (EditMark >= 0 && DpyStart > EditMark)
+ TmpStyleOn(prompting ? s_prompt_sel : s_aedit_sel);
+#endif
+ remember_column(edit, 0);
+ for (i = 0; i < dpy_bytes; i++) {
+#if defined(ENHANCED_LINEEDIT) && defined(USE_COLOR_STYLE)
+ if (EditMark >= 0 && ((DpyStart + i == EditMark && EditAt > EditMark)
+ || (DpyStart + i == EditAt && EditAt < EditMark)))
+ TmpStyleOn(prompting ? s_prompt_sel : s_aedit_sel);
+ if (EditMark >= 0 && ((DpyStart + i == EditMark && EditAt < EditMark)
+ || (DpyStart + i == EditAt && EditAt > EditMark)))
+ TmpStyleOff(prompting ? s_prompt_sel : s_aedit_sel);
+#endif
+ if (str[i] == 1 || str[i] == 2 ||
+ (UCH(str[i]) == 160 &&
+ !(HTPassHighCtrlRaw || IS_CJK_TTY ||
+ (LYCharSet_UC[current_char_set].enc != UCT_ENC_8859 &&
+ !(LYCharSet_UC[current_char_set].like8859
+ & UCT_R_8859SPECL))))) {
+ LYaddch(' ');
+ } else if (str[i] == '\t') {
+ int col = Offs2Col[i] - StartX;
+
+ /*
+ * Like LYwaddnstr(), expand tabs from the beginning of the
+ * field.
+ */
+ while (++col % 8)
+ LYaddch(' ');
+ LYaddch(' ');
+ } else {
+ LYaddch(UCH(str[i]));
+ }
+ remember_column(edit, i + 1);
+ }
+#if defined(ENHANCED_LINEEDIT) && defined(USE_COLOR_STYLE)
+ if (EditMark >= 0 &&
+ ((DpyStart + dpy_bytes <= EditMark && DpyStart + dpy_bytes > EditAt)
+ || (DpyStart + dpy_bytes > EditMark
+ && DpyStart + dpy_bytes <= EditAt))) {
+ TmpStyleOff(prompting ? s_prompt_sel : s_aedit_sel);
+ }
+#endif
+ }
+
+ /*
+ * Erase rest of input area.
+ */
+ padsize = DpyWidth - (Offs2Col[dpy_bytes] - StartX);
+ fill_edited_line(prompting, padsize, PadChar);
+
+ /*
+ * Scrolling indicators.
+ */
+ if (IsPanned && dpy_bytes && rgt_shift) {
+ CTRACE((tfp, "Draw right-scroller offset (%d + %d)\n",
+ dpy_cells, lft_shift));
+ TmpStyleOn(prompting ? s_prompt_edit_arr : s_aedit_arr);
+ LYmove(StartY, StartX + dpy_cells + lft_shift);
+ LYaddch(ACS_RARROW);
+ TmpStyleOff(prompting ? s_prompt_edit_arr : s_aedit_arr);
+ }
+
+ /*
+ * Finally, move the cursor to the point where the next edit will occur.
+ */
+ LYmove(StartY, Offs2Col[EditAt - DpyStart]);
+
+#ifdef USE_COLOR_STYLE
+ if (estyle != NOSTYLE)
+ curses_style(estyle, STACK_OFF);
+#endif
+ LYrefresh();
+}
+
+static void reinsertEdit(FieldEditor * edit, char *result)
+{
+ if (result != 0) {
+ LYDoEdit(edit, '\0', LYE_ERASE, FALSE);
+ while (*result != '\0') {
+ LYLineEdit(edit, (int) (*result), FALSE);
+ result++;
+ }
+ }
+}
+
+static int caselessCmpList(const void *a,
+ const void *b)
+{
+ return strcasecomp(*(STRING2PTR) a, *(STRING2PTR) b);
+}
+
+static int normalCmpList(const void *a,
+ const void *b)
+{
+ return strcmp(*(STRING2PTR) a, *(STRING2PTR) b);
+}
+
+static char **sortedList(HTList *list, int ignorecase)
+{
+ size_t count = (unsigned) HTList_count(list);
+ size_t j = 0;
+ size_t k, jk;
+ char **result = typecallocn(char *, count + 1);
+
+ if (result == 0)
+ outofmem(__FILE__, "sortedList");
+
+ while (!HTList_isEmpty(list))
+ result[j++] = (char *) HTList_nextObject(list);
+
+ if (count > 1) {
+ qsort((char *) result, count, sizeof(*result),
+ ignorecase ? caselessCmpList : normalCmpList);
+
+ /* remove duplicate entries from the sorted index */
+ for (j = 0; result[j] != 0; j++) {
+ k = j;
+ while (result[k] != 0
+ && !strcmp(result[j], result[k])) {
+ k++;
+ }
+ k--;
+ if (j != k) {
+ for (jk = j;; jk++) {
+ result[jk] = result[jk + k - j];
+ if (result[jk] == 0)
+ break;
+ }
+ }
+ }
+ }
+
+ return result;
+}
+
+int LYarrayLength(STRING2PTR list)
+{
+ int result = 0;
+
+ while (*list++ != 0)
+ result++;
+ return result;
+}
+
+int LYarrayWidth(STRING2PTR list)
+{
+ int result = 0;
+ int check;
+
+ while (*list != 0) {
+ check = (int) strlen(*list++);
+ if (check > result)
+ result = check;
+ }
+ return result;
+}
+
+static void FormatChoiceNum(char *target,
+ int num_choices,
+ int choice,
+ const char *value)
+{
+ if (num_choices >= 0) {
+ int digits = (num_choices > 9) ? 2 : 1;
+
+ sprintf(target, "%*d: %.*s",
+ digits, (choice + 1),
+ MAX_LINE - 9 - digits, value);
+ } else {
+ LYStrNCpy(target, value, MAX_LINE - 1);
+ }
+}
+
+static unsigned options_width(STRING2PTR list)
+{
+ unsigned width = 0;
+ int count = 0;
+
+ while (list[count] != 0) {
+ unsigned ncells = (unsigned) LYstrCells(list[count]);
+
+ if (ncells > width) {
+ width = ncells;
+ }
+ count++;
+ }
+ return width;
+}
+
+static void draw_option(WINDOW * win, int entry,
+ int width,
+ int reversed,
+ int num_choices,
+ int number,
+ const char *value)
+{
+ char Cnum[MAX_LINE];
+
+ (void) width;
+
+ FormatChoiceNum(Cnum, num_choices, number, "");
+#ifdef USE_SLANG
+ SLsmg_gotorc(win->top_y + entry, (win->left_x + 2));
+ LYaddstr(Cnum);
+ if (reversed)
+ SLsmg_set_color(2);
+ SLsmg_write_nstring((SLFUTURE_CONST char *) value, (unsigned) win->width);
+ if (reversed)
+ SLsmg_set_color(0);
+#else
+ wmove(win, entry, 1);
+ LynxWChangeStyle(win, s_menu_entry, STACK_ON);
+ waddch(win, ' ');
+ LynxWChangeStyle(win, s_menu_entry, STACK_OFF);
+ LynxWChangeStyle(win, s_menu_number, STACK_ON);
+ waddstr(win, Cnum);
+ LynxWChangeStyle(win, s_menu_number, STACK_OFF);
+#ifdef USE_COLOR_STYLE
+ LynxWChangeStyle(win, reversed ? s_menu_active : s_menu_entry, STACK_ON);
+#else
+ if (reversed)
+ wstart_reverse(win);
+#endif
+ LYpaddstr(win, width, value);
+#ifdef USE_COLOR_STYLE
+ LynxWChangeStyle(win, reversed ? s_menu_active : s_menu_entry, STACK_OFF);
+#else
+ if (reversed)
+ wstop_reverse(win);
+#endif
+ LynxWChangeStyle(win, s_menu_entry, STACK_ON);
+ waddch(win, ' ');
+ LynxWChangeStyle(win, s_menu_entry, STACK_OFF);
+#endif /* USE_SLANG */
+}
+
+static void show_popup_status(int cur_choice,
+ STRING2PTR choices,
+ int disabled,
+ int for_mouse)
+{
+ if (disabled) {
+ _statusline(CHOICE_LIST_UNM_MSG);
+ } else if (!for_mouse) {
+ if (fields_are_named()) {
+ char *status_msg = NULL;
+
+ HTSprintf0(&status_msg, CHOICE_LIST_ADV_MSG, choices[cur_choice]);
+ _statusline(status_msg);
+ FREE(status_msg);
+ } else {
+ _statusline(CHOICE_LIST_MESSAGE);
+ }
+#if defined(USE_MOUSE) && (defined(NCURSES) || defined(PDCURSES))
+ } else {
+ _statusline(MOUSE_CHOICE_MESSAGE);
+#endif
+ }
+}
+
+#define SHOW_POPUP_STATUS() show_popup_status(cur_choice, choices, disabled, for_mouse)
+
+/*
+ * This function offers the choices for values of an option via a popup window
+ * which functions like that for selection of options in a form. - FM
+ *
+ * Also used for mouse popups with ncurses; this is indicated by for_mouse.
+ */
+int LYhandlePopupList(int cur_choice,
+ int ly,
+ int lx,
+ STRING2PTR choices,
+ int width,
+ int i_length,
+ int disabled,
+ int for_mouse)
+{
+ BOOLEAN numbered = (BOOLEAN) (keypad_mode != NUMBERS_AS_ARROWS);
+ int c = 0, cmd = 0, i = 0, j = 0, rel = 0;
+ int orig_choice;
+ WINDOW *form_window;
+ int num_choices = 0;
+ int max_choices = 0;
+ int top, bottom, length = -1;
+ int window_offset = 0;
+ int lines_to_show;
+ char Cnum[64];
+ int Lnum;
+ int npages;
+ static bstring *prev_target = NULL; /* Search string buffer */
+ static bstring *next_target = NULL; /* Next search buffer */
+ static BOOL first = TRUE;
+ char *cp;
+ int ch = 0;
+ RecallType recall;
+ int QueryTotal;
+ int QueryNum;
+ BOOLEAN FirstRecall = TRUE;
+ BOOLEAN ReDraw = FALSE;
+ int number;
+ char buffer[MAX_LINE];
+ STRING2PTR Cptr = NULL;
+
+#define CAN_SCROLL_DOWN 1
+#define CAN_SCROLL_UP 2
+#define CAN_SCROLL 4
+ int can_scroll = 0, can_scroll_was = 0;
+
+ orig_choice = cur_choice;
+ if (cur_choice < 0)
+ cur_choice = 0;
+
+ /*
+ * Initialize the search string buffer. - FM
+ */
+ if (first) {
+ BStrCopy0(next_target, "");
+ first = FALSE;
+ }
+ BStrCopy0(prev_target, "");
+ QueryTotal = (search_queries ? HTList_count(search_queries) : 0);
+ recall = ((QueryTotal >= 1) ? RECALL_URL : NORECALL);
+ QueryNum = QueryTotal;
+
+ /*
+ * Count the number of choices to be displayed, where num_choices ranges
+ * from 0 to n, and set width to the longest choice string length. Also
+ * set Lnum to the length for the highest choice number, then decrement
+ * num_choices so as to be zero-based. The window width will be based on
+ * the sum of width and Lnum. - FM
+ */
+ num_choices = LYarrayLength(choices) - 1;
+ if (width <= 0)
+ width = (int) options_width(choices);
+ if (numbered) {
+ sprintf(Cnum, "%d: ", num_choices);
+ Lnum = (int) strlen(Cnum);
+ max_choices = num_choices;
+ } else {
+ Lnum = 0;
+ max_choices = -1;
+ }
+
+ /*
+ * Let's assume for the sake of sanity that ly is the number corresponding
+ * to the line the choice is on.
+ *
+ * Let's also assume that cur_choice is the number of the item that should
+ * be initially selected, as 0 being the first item.
+ *
+ * So what we have, is the top equal to the current screen line subtracting
+ * the cur_choice + 1 (the one must be for the top line we will draw in a
+ * box). If the top goes under 0, consider it 0.
+ */
+ top = ly - (cur_choice + 1);
+ if (top < 0)
+ top = 0;
+
+ /*
+ * Check and see if we need to put the i_length parameter up to the number
+ * of real choices.
+ */
+ if (i_length < 1) {
+ i_length = num_choices;
+ } else {
+ /*
+ * Otherwise, it is really one number too high.
+ */
+ i_length--;
+ }
+
+ /*
+ * The bottom is the value of the top plus the number of options to view
+ * plus 3 (one for the top line, one for the bottom line, and one to offset
+ * the 0 counted in the num_choices).
+ */
+ bottom = top + i_length + 3;
+
+ /*
+ * Set lines_to_show based on the user_mode global.
+ */
+ if (user_mode == NOVICE_MODE)
+ lines_to_show = LYlines - 4;
+ else
+ lines_to_show = LYlines - 2;
+
+ if (for_mouse && user_mode == NOVICE_MODE && lines_to_show > 2)
+ lines_to_show--;
+
+ /*
+ * Hmm... If the bottom goes beyond the number of lines available,
+ */
+ if (bottom > lines_to_show) {
+ /*
+ * Position the window at the top if we have more choices than will fit
+ * in the window.
+ */
+ if ((i_length + 3) > lines_to_show) {
+ top = 0;
+ bottom = (top + (i_length + 3));
+ if (bottom > lines_to_show)
+ bottom = (lines_to_show + 1);
+ } else {
+ /*
+ * Try to position the window so that the selected choice will
+ * appear where the selection box currently is positioned. It
+ * could end up too high, at this point, but we'll move it down
+ * latter, if that has happened.
+ */
+ top = (lines_to_show + 1) - (i_length + 3);
+ bottom = (lines_to_show + 1);
+ }
+ }
+
+ /*
+ * This is really fun, when the length is 4, it means 0 to 4, or 5.
+ */
+ length = (bottom - top) - 2;
+ if (length <= num_choices)
+ can_scroll = CAN_SCROLL;
+
+ /*
+ * Move the window down if it's too high.
+ */
+ if (bottom < ly + 2) {
+ bottom = ly + 2;
+ if (bottom > lines_to_show + 1)
+ bottom = lines_to_show + 1;
+ top = bottom - length - 2;
+ }
+
+ if (for_mouse) {
+ int check = (Lnum + (int) width + 4);
+ int limit = LYcols;
+
+ /* shift horizontally to lie within screen width, if possible */
+ if (check < limit) {
+ if (lx - 1 + check > limit)
+ lx = limit + 1 - check;
+ else if (lx <= 0)
+ lx = 1;
+ }
+ }
+
+ /*
+ * Set up the overall window, including the boxing characters ('*'), if it
+ * all fits. Otherwise, set up the widest window possible. - FM
+ */
+ width += Lnum;
+ bottom -= top;
+
+ if (num_choices <= 0
+ || cur_choice > num_choices
+ || (form_window = LYstartPopup(&top,
+ &lx,
+ &bottom,
+ &width)) == 0)
+ return (orig_choice);
+
+ width -= Lnum;
+ bottom += top;
+
+ SHOW_POPUP_STATUS();
+
+ /*
+ * Set up the window_offset for choices.
+ * cur_choice ranges from 0...n
+ * length ranges from 0...m
+ */
+ if (cur_choice >= length) {
+ window_offset = cur_choice - length + 1;
+ }
+
+ /*
+ * Compute the number of popup window pages. - FM
+ */
+ npages = ((num_choices + 1) > length) ?
+ (((num_choices + 1) + (length - 1)) / (length))
+ : 1;
+ /*
+ * OH! I LOVE GOTOs! hack hack hack
+ */
+ redraw:
+
+ /*
+ * Display the boxed choices.
+ */
+ for (i = 0; i <= num_choices; i++) {
+ if (i >= window_offset && i - window_offset < length) {
+ draw_option(form_window, ((i + 1) - window_offset), width, FALSE,
+ max_choices, i, choices[i]);
+ }
+ }
+ LYbox(form_window, !numbered);
+ Cptr = NULL;
+
+ /*
+ * Loop on user input.
+ */
+ while (cmd != LYK_ACTIVATE) {
+ int row = ((i + 1) - window_offset);
+
+ /* Show scroll indicators. */
+ if (can_scroll) {
+ can_scroll = ((window_offset ? CAN_SCROLL_UP : 0)
+ | (num_choices - window_offset >= length
+ ? CAN_SCROLL_DOWN : 0));
+ if (~can_scroll & can_scroll_was) { /* Need to redraw */
+ LYbox(form_window, !numbered);
+ can_scroll_was = 0;
+ }
+ if (can_scroll & ~can_scroll_was & CAN_SCROLL_UP) {
+ wmove(form_window, 1, Lnum + width + 3);
+ LynxWChangeStyle(form_window, s_menu_sb, STACK_ON);
+ waddch(form_window, ACS_UARROW);
+ LynxWChangeStyle(form_window, s_menu_sb, STACK_OFF);
+ }
+ if (can_scroll & ~can_scroll_was & CAN_SCROLL_DOWN) {
+ wmove(form_window, length, Lnum + width + 3);
+ LynxWChangeStyle(form_window, s_menu_sb, STACK_ON);
+ waddch(form_window, ACS_DARROW);
+ LynxWChangeStyle(form_window, s_menu_sb, STACK_OFF);
+ }
+ }
+
+ /*
+ * Unreverse cur choice.
+ */
+ if (Cptr != NULL) {
+ draw_option(form_window, row, width, FALSE,
+ max_choices, i, Cptr[i]);
+ }
+ Cptr = choices;
+ i = cur_choice;
+ row = ((cur_choice + 1) - window_offset);
+ draw_option(form_window, row, width, TRUE,
+ max_choices, cur_choice, Cptr[cur_choice]);
+ LYstowCursor(form_window, row, 1);
+
+ c = LYgetch_choice();
+ if (term_options || LYCharIsINTERRUPT(c)) { /* Control-C or Control-G */
+ cmd = LYK_QUIT;
+#ifndef USE_SLANG
+ } else if (c == MOUSE_KEY) {
+ if ((cmd = fancy_mouse(form_window, row, &cur_choice)) < 0)
+ goto redraw;
+ if (cmd == LYK_ACTIVATE)
+ break;
+#endif
+ } else {
+ cmd = LKC_TO_LAC(keymap, c);
+ }
+#ifdef VMS
+ if (HadVMSInterrupt) {
+ HadVMSInterrupt = FALSE;
+ cmd = LYK_QUIT;
+ }
+#endif /* VMS */
+
+ switch (cmd) {
+ case LYK_F_LINK_NUM:
+ c = '\0';
+ /* FALLTHRU */
+ case LYK_1: /* FALLTHRU */
+ case LYK_2: /* FALLTHRU */
+ case LYK_3: /* FALLTHRU */
+ case LYK_4: /* FALLTHRU */
+ case LYK_5: /* FALLTHRU */
+ case LYK_6: /* FALLTHRU */
+ case LYK_7: /* FALLTHRU */
+ case LYK_8: /* FALLTHRU */
+ case LYK_9:
+ /*
+ * Get a number from the user, possibly with a 'g' or 'p' suffix
+ * (which will be loaded into c). - FM & LE
+ */
+ number = get_popup_number(SELECT_OPTION_NUMBER, &c, &rel);
+
+ /* handle + or - suffix */
+ CTRACE((tfp, "got popup option number %d, ", number));
+ CTRACE((tfp, "rel='%c', c='%c', cur_choice=%d\n",
+ rel, c, cur_choice));
+ if (c == 'p') {
+ int curpage = ((cur_choice + 1) > length) ?
+ (((cur_choice + 1) + (length - 1)) / (length))
+ : 1;
+
+ CTRACE((tfp, " curpage=%d\n", curpage));
+ if (rel == '+')
+ number = curpage + number;
+ else if (rel == '-')
+ number = curpage - number;
+ } else if (rel == '+') {
+ number = cur_choice + number + 1;
+ } else if (rel == '-') {
+ number = cur_choice - number + 1;
+ }
+ if (rel)
+ CTRACE((tfp, "new number=%d\n", number));
+ /*
+ * Check for a 'p' suffix. - FM
+ */
+ if (c == 'p') {
+ /*
+ * Treat 1 or less as the first page. - FM
+ */
+ if (number <= 1) {
+ if (window_offset == 0) {
+ HTUserMsg(ALREADY_AT_OPTION_BEGIN);
+ SHOW_POPUP_STATUS();
+ break;
+ }
+ window_offset = 0;
+ cur_choice = 0;
+ SHOW_POPUP_STATUS();
+ goto redraw;
+ }
+
+ /*
+ * Treat a number equal to or greater than the number of pages
+ * as the last page. - FM
+ */
+ if (number >= npages) {
+ if (window_offset >= ((num_choices - length) + 1)) {
+ HTUserMsg(ALREADY_AT_OPTION_END);
+ SHOW_POPUP_STATUS();
+ break;
+ }
+ window_offset = ((npages - 1) * length);
+ if (window_offset > (num_choices - length)) {
+ window_offset = (num_choices - length + 1);
+ }
+ if (cur_choice < window_offset)
+ cur_choice = window_offset;
+ SHOW_POPUP_STATUS();
+ goto redraw;
+ }
+
+ /*
+ * We want an intermediate page. - FM
+ */
+ if (((number - 1) * length) == window_offset) {
+ char *msg = 0;
+
+ HTSprintf0(&msg, ALREADY_AT_OPTION_PAGE, number);
+ HTUserMsg(msg);
+ FREE(msg);
+ SHOW_POPUP_STATUS();
+ break;
+ }
+ cur_choice = window_offset = ((number - 1) * length);
+ SHOW_POPUP_STATUS();
+ goto redraw;
+
+ }
+
+ /*
+ * Check for a positive number, which signifies that a choice
+ * should be sought. - FM
+ */
+ if (number > 0) {
+ /*
+ * Decrement the number so as to correspond with our cur_choice
+ * values. - FM
+ */
+ number--;
+
+ /*
+ * If the number is in range and had no legal suffix, select
+ * the indicated choice. - FM
+ */
+ if (number <= num_choices && c == '\0') {
+ cur_choice = number;
+ cmd = LYK_ACTIVATE;
+ break;
+ }
+
+ /*
+ * Verify that we had a 'g' suffix, and act on the number. -
+ * FM
+ */
+ if (c == 'g') {
+ if (cur_choice == number) {
+ /*
+ * The choice already is current. - FM
+ */
+ char *msg = 0;
+
+ HTSprintf0(&msg, OPTION_ALREADY_CURRENT, (number + 1));
+ HTUserMsg(msg);
+ FREE(msg);
+ SHOW_POPUP_STATUS();
+ break;
+ }
+
+ if (number <= num_choices) {
+ /*
+ * The number is in range and had a 'g' suffix, so make
+ * it the current option, scrolling if needed. - FM
+ */
+ j = (number - cur_choice);
+ cur_choice = number;
+ if ((j > 0) &&
+ (cur_choice - window_offset) >= length) {
+ window_offset += j;
+ if (window_offset > (num_choices - length + 1))
+ window_offset = (num_choices - length + 1);
+ } else if ((cur_choice - window_offset) < 0) {
+ window_offset -= abs(j);
+ if (window_offset < 0)
+ window_offset = 0;
+ }
+ SHOW_POPUP_STATUS();
+ goto redraw;
+ }
+
+ /*
+ * Not in range. - FM
+ */
+ HTUserMsg(BAD_OPTION_NUM_ENTERED);
+ }
+ }
+
+ /*
+ * Restore the popup statusline. - FM
+ */
+ SHOW_POPUP_STATUS();
+ break;
+
+ case LYK_PREV_LINK:
+ case LYK_LPOS_PREV_LINK:
+ case LYK_FASTBACKW_LINK:
+ case LYK_UP_LINK:
+
+ if (cur_choice > 0)
+ cur_choice--;
+
+ /*
+ * Scroll the window up if necessary.
+ */
+ if ((cur_choice - window_offset) < 0) {
+ window_offset--;
+ goto redraw;
+ }
+ break;
+
+ case LYK_NEXT_LINK:
+ case LYK_LPOS_NEXT_LINK:
+ case LYK_FASTFORW_LINK:
+ case LYK_DOWN_LINK:
+ if (cur_choice < num_choices)
+ cur_choice++;
+
+ /*
+ * Scroll the window down if necessary
+ */
+ if ((cur_choice - window_offset) >= length) {
+ window_offset++;
+ goto redraw;
+ }
+ break;
+
+ case LYK_NEXT_PAGE:
+ /*
+ * Okay, are we on the last page of the list? If not then,
+ */
+ if (window_offset != (num_choices - length + 1)) {
+ /*
+ * Modify the current choice to not be a coordinate in the
+ * list, but a coordinate on the item selected in the window.
+ */
+ cur_choice -= window_offset;
+
+ /*
+ * Page down the proper length for the list. If simply to far,
+ * back up.
+ */
+ window_offset += length;
+ if (window_offset > (num_choices - length)) {
+ window_offset = (num_choices - length + 1);
+ }
+
+ /*
+ * Readjust the current selection to be a list coordinate
+ * rather than window. Redraw this thing.
+ */
+ cur_choice += window_offset;
+ goto redraw;
+ } else if (cur_choice < num_choices) {
+ /*
+ * Already on last page of the list so just redraw it with the
+ * last item selected.
+ */
+ cur_choice = num_choices;
+ }
+ break;
+
+ case LYK_PREV_PAGE:
+ /*
+ * Are we on the first page of the list? If not then,
+ */
+ if (window_offset != 0) {
+ /*
+ * Modify the current selection to not be a list coordinate,
+ * but a window coordinate.
+ */
+ cur_choice -= window_offset;
+
+ /*
+ * Page up the proper length. If too far, back up.
+ */
+ window_offset -= length;
+ if (window_offset < 0) {
+ window_offset = 0;
+ }
+
+ /*
+ * Readjust the current choice.
+ */
+ cur_choice += window_offset;
+ goto redraw;
+ } else if (cur_choice > 0) {
+ /*
+ * Already on the first page so just back up to the first item.
+ */
+ cur_choice = 0;
+ }
+ break;
+
+ case LYK_HOME:
+ cur_choice = 0;
+ if (window_offset > 0) {
+ window_offset = 0;
+ goto redraw;
+ }
+ break;
+
+ case LYK_END:
+ cur_choice = num_choices;
+ if (window_offset != (num_choices - length + 1)) {
+ window_offset = (num_choices - length + 1);
+ goto redraw;
+ }
+ break;
+
+ case LYK_DOWN_TWO:
+ cur_choice += 2;
+ if (cur_choice > num_choices)
+ cur_choice = num_choices;
+
+ /*
+ * Scroll the window down if necessary.
+ */
+ if ((cur_choice - window_offset) >= length) {
+ window_offset += 2;
+ if (window_offset > (num_choices - length + 1))
+ window_offset = (num_choices - length + 1);
+ goto redraw;
+ }
+ break;
+
+ case LYK_UP_TWO:
+ cur_choice -= 2;
+ if (cur_choice < 0)
+ cur_choice = 0;
+
+ /*
+ * Scroll the window up if necessary.
+ */
+ if ((cur_choice - window_offset) < 0) {
+ window_offset -= 2;
+ if (window_offset < 0)
+ window_offset = 0;
+ goto redraw;
+ }
+ break;
+
+ case LYK_DOWN_HALF:
+ cur_choice += (length / 2);
+ if (cur_choice > num_choices)
+ cur_choice = num_choices;
+
+ /*
+ * Scroll the window down if necessary.
+ */
+ if ((cur_choice - window_offset) >= length) {
+ window_offset += (length / 2);
+ if (window_offset > (num_choices - length + 1))
+ window_offset = (num_choices - length + 1);
+ goto redraw;
+ }
+ break;
+
+ case LYK_UP_HALF:
+ cur_choice -= (length / 2);
+ if (cur_choice < 0)
+ cur_choice = 0;
+
+ /*
+ * Scroll the window up if necessary.
+ */
+ if ((cur_choice - window_offset) < 0) {
+ window_offset -= (length / 2);
+ if (window_offset < 0)
+ window_offset = 0;
+ goto redraw;
+ }
+ break;
+
+ case LYK_REFRESH:
+ lynx_force_repaint();
+ LYrefresh();
+ break;
+
+ case LYK_NEXT:
+ if (recall && isBEmpty(next_target)) {
+ /*
+ * We got a 'n'ext command with no prior query specified within
+ * the popup window. See if one was entered when the popup was
+ * retracted, and if so, assume that's what's wanted. Note
+ * that it will become the default within popups, unless
+ * another is entered within a popup. If the within popup
+ * default is to be changed at that point, use WHEREIS ('/')
+ * and enter it, or the up- or down-arrow keys to seek any of
+ * the previously entered queries, regardless of whether they
+ * were entered within or outside of a popup window. - FM
+ */
+ if ((cp = (char *) HTList_objectAt(search_queries,
+ 0)) != NULL) {
+ BStrCopy0(next_target, cp);
+ QueryNum = 0;
+ FirstRecall = FALSE;
+ }
+ }
+ BStrCopy(prev_target, next_target);
+ /* FALLTHRU */
+ case LYK_WHEREIS:
+ if (isBEmpty(prev_target)) {
+ _statusline(ENTER_WHEREIS_QUERY);
+ if ((ch = LYgetBString(&prev_target, FALSE, 0, recall)) < 0) {
+ /*
+ * User cancelled the search via ^G. - FM
+ */
+ HTInfoMsg(CANCELLED);
+ goto restore_popup_statusline;
+ }
+ }
+
+ check_recall:
+ if (isBEmpty(prev_target) &&
+ !(recall && (ch == UPARROW_KEY || ch == DNARROW_KEY))) {
+ /*
+ * No entry. Simply break. - FM
+ */
+ HTInfoMsg(CANCELLED);
+ goto restore_popup_statusline;
+ }
+
+ if (recall && ch == UPARROW_KEY) {
+ if (FirstRecall) {
+ /*
+ * Use the current string or last query in the list. - FM
+ */
+ FirstRecall = FALSE;
+ if (!isBEmpty(next_target)) {
+ for (QueryNum = (QueryTotal - 1);
+ QueryNum > 0; QueryNum--) {
+ if ((cp = (char *) HTList_objectAt(search_queries,
+ QueryNum))
+ != NULL &&
+ !strcmp(next_target->str, cp)) {
+ break;
+ }
+ }
+ } else {
+ QueryNum = 0;
+ }
+ } else {
+ /*
+ * Go back to the previous query in the list. - FM
+ */
+ QueryNum++;
+ }
+ if (QueryNum >= QueryTotal) {
+ /*
+ * Roll around to the last query in the list. - FM
+ */
+ QueryNum = 0;
+ }
+ if ((cp = (char *) HTList_objectAt(search_queries,
+ QueryNum)) != NULL) {
+ BStrCopy0(prev_target, cp);
+ if (!isBEmpty(next_target) &&
+ !strcmp(next_target->str, prev_target->str)) {
+ _statusline(EDIT_CURRENT_QUERY);
+ } else if ((!isBEmpty(next_target) && QueryTotal == 2) ||
+ (isBEmpty(next_target) && QueryTotal == 1)) {
+ _statusline(EDIT_THE_PREV_QUERY);
+ } else {
+ _statusline(EDIT_A_PREV_QUERY);
+ }
+ if ((ch = LYgetBString(&prev_target,
+ FALSE, 0, recall)) < 0) {
+ /*
+ * User cancelled the search via ^G. - FM
+ */
+ HTInfoMsg(CANCELLED);
+ goto restore_popup_statusline;
+ }
+ goto check_recall;
+ }
+ } else if (recall && ch == DNARROW_KEY) {
+ if (FirstRecall) {
+ /*
+ * Use the current string or first query in the list. - FM
+ */
+ FirstRecall = FALSE;
+ if (!isBEmpty(next_target)) {
+ for (QueryNum = 0;
+ QueryNum < (QueryTotal - 1); QueryNum++) {
+ if ((cp = (char *) HTList_objectAt(search_queries,
+ QueryNum))
+ != NULL &&
+ !strcmp(next_target->str, cp)) {
+ break;
+ }
+ }
+ } else {
+ QueryNum = (QueryTotal - 1);
+ }
+ } else {
+ /*
+ * Advance to the next query in the list. - FM
+ */
+ QueryNum--;
+ }
+ if (QueryNum < 0) {
+ /*
+ * Roll around to the first query in the list. - FM
+ */
+ QueryNum = (QueryTotal - 1);
+ }
+ if ((cp = (char *) HTList_objectAt(search_queries,
+ QueryNum)) != NULL) {
+ BStrCopy0(prev_target, cp);
+ if (isBEmpty(next_target) &&
+ !strcmp(next_target->str, prev_target->str)) {
+ _statusline(EDIT_CURRENT_QUERY);
+ } else if ((!isBEmpty(next_target) && QueryTotal == 2) ||
+ (isBEmpty(next_target) && QueryTotal == 1)) {
+ _statusline(EDIT_THE_PREV_QUERY);
+ } else {
+ _statusline(EDIT_A_PREV_QUERY);
+ }
+ if ((ch = LYgetBString(&prev_target,
+ FALSE, 0, recall)) < 0) {
+ /*
+ * User cancelled the search via ^G. - FM
+ */
+ HTInfoMsg(CANCELLED);
+ goto restore_popup_statusline;
+ }
+ goto check_recall;
+ }
+ }
+ /*
+ * Replace the search string buffer with the new target. - FM
+ */
+ BStrCopy(next_target, prev_target);
+ HTAddSearchQuery(next_target->str);
+
+ /*
+ * Start search at the next choice. - FM
+ */
+ for (j = 1; Cptr[i + j] != NULL; j++) {
+ FormatChoiceNum(buffer, max_choices, (i + j), Cptr[i + j]);
+ if (LYcase_sensitive) {
+ if (strstr(buffer, next_target->str) != NULL)
+ break;
+ } else {
+ if (LYstrstr(buffer, next_target->str) != NULL)
+ break;
+ }
+ }
+ if (Cptr[i + j] != NULL) {
+ /*
+ * We have a hit, so make that choice the current. - FM
+ */
+ cur_choice += j;
+ /*
+ * Scroll the window down if necessary.
+ */
+ if ((cur_choice - window_offset) >= length) {
+ window_offset += j;
+ if (window_offset > (num_choices - length + 1))
+ window_offset = (num_choices - length + 1);
+ ReDraw = TRUE;
+ }
+ goto restore_popup_statusline;
+ }
+
+ /*
+ * If we started at the beginning, it can't be present. - FM
+ */
+ if (cur_choice == 0) {
+ HTUserMsg2(STRING_NOT_FOUND, next_target->str);
+ goto restore_popup_statusline;
+ }
+
+ /*
+ * Search from the beginning to the current choice. - FM
+ */
+ for (j = 0; j < cur_choice; j++) {
+ FormatChoiceNum(buffer, max_choices, (j + 1), Cptr[j]);
+ if (LYcase_sensitive) {
+ if (strstr(buffer, next_target->str) != NULL)
+ break;
+ } else {
+ if (LYstrstr(buffer, next_target->str) != NULL)
+ break;
+ }
+ }
+ if (j < cur_choice) {
+ /*
+ * We have a hit, so make that choice the current. - FM
+ */
+ j = (cur_choice - j);
+ cur_choice -= j;
+ /*
+ * Scroll the window up if necessary.
+ */
+ if ((cur_choice - window_offset) < 0) {
+ window_offset -= j;
+ if (window_offset < 0)
+ window_offset = 0;
+ ReDraw = TRUE;
+ }
+ goto restore_popup_statusline;
+ }
+
+ /*
+ * Didn't find it in the preceding choices either. - FM
+ */
+ HTUserMsg2(STRING_NOT_FOUND, next_target->str);
+
+ restore_popup_statusline:
+ /*
+ * Restore the popup statusline and reset the search variables. -
+ * FM
+ */
+ SHOW_POPUP_STATUS();
+ BStrCopy0(prev_target, "");
+ QueryTotal = (search_queries ? HTList_count(search_queries)
+ : 0);
+ recall = ((QueryTotal >= 1) ? RECALL_URL : NORECALL);
+ QueryNum = QueryTotal;
+ if (ReDraw == TRUE) {
+ ReDraw = FALSE;
+ goto redraw;
+ }
+ break;
+
+ case LYK_QUIT:
+ case LYK_ABORT:
+ case LYK_PREV_DOC:
+ case LYK_INTERRUPT:
+ cur_choice = orig_choice;
+ cmd = LYK_ACTIVATE; /* to exit */
+ break;
+ }
+ }
+ LYstopPopup();
+
+ return (disabled ? orig_choice : cur_choice);
+}
+
+/*
+ * Allow the user to edit a string.
+ */
+int LYgetBString(bstring **inputline,
+ int hidden,
+ unsigned max_cols,
+ RecallType recall)
+{
+ int x, y;
+ int ch;
+ int xlec = -2;
+ int last_xlec = -1;
+ int last_xlkc = -1;
+ FieldEditor MyEdit, *edit = &MyEdit;
+
+#ifdef SUPPORT_MULTIBYTE_EDIT
+ BOOL refresh_mb = TRUE;
+#endif /* SUPPORT_MULTIBYTE_EDIT */
+ BOOL done = FALSE;
+ int result = -1;
+
+ CTRACE((tfp, "called LYgetBString hidden %d, recall %d\n", hidden, (int) recall));
+
+ LYGetYX(y, x); /* Use screen from cursor position to eol */
+
+ (void) y;
+ (void) x;
+
+ if (*inputline == NULL) /* caller may not have initialized this */
+ BStrCopy0(*inputline, "");
+
+ LYSetupEdit(edit, (*inputline)->str, max_cols, LYcolLimit - x);
+ IsHidden = (BOOL) hidden;
+#ifdef FEPCTRL
+ fep_on();
+#endif
+
+ while (!done) {
+ beginning:
+#ifndef SUPPORT_MULTIBYTE_EDIT
+ LYRefreshEdit(edit);
+#else /* SUPPORT_MULTIBYTE_EDIT */
+ if (refresh_mb)
+ LYRefreshEdit(edit);
+#endif /* SUPPORT_MULTIBYTE_EDIT */
+ ch = LYReadCmdKey(FOR_PROMPT);
+#ifdef SUPPORT_MULTIBYTE_EDIT
+#ifdef CJK_EX /* for SJIS code */
+ if (!refresh_mb
+ && (EditBinding(ch) != LYE_CHAR))
+ goto beginning;
+#else
+ if (!refresh_mb
+ && (EditBinding(ch) != LYE_CHAR)
+ && (EditBinding(ch) != LYE_AIX))
+ goto beginning;
+#endif
+#endif /* SUPPORT_MULTIBYTE_EDIT */
+
+ if (term_letter || term_options
+#ifdef VMS
+ || HadVMSInterrupt
+#endif /* VMS */
+#ifndef DISABLE_NEWS
+ || term_message
+#endif
+ ) {
+#ifdef VMS
+ HadVMSInterrupt = FALSE;
+#endif /* VMS */
+ ch = LYCharINTERRUPT2;
+ }
+
+ if (recall != NORECALL && (ch == UPARROW_KEY || ch == DNARROW_KEY)) {
+ BStrCopy0(*inputline, Buffer);
+ LYAddToCloset(recall, Buffer);
+ CTRACE((tfp, "LYgetstr(%s) recall\n", (*inputline)->str));
+#ifdef FEPCTRL
+ fep_off();
+#endif
+ LYFinishEdit(edit);
+ result = ch;
+ done = TRUE;
+ continue;
+ }
+ ch |= InputMods;
+ InputMods = 0;
+ if (last_xlkc != -1) {
+ if (ch == last_xlkc)
+ ch |= LKC_MOD3;
+ last_xlkc = -1; /* consumed */
+ }
+#ifndef WIN_EX
+ if (LKC_TO_LAC(keymap, ch) == LYK_REFRESH)
+ goto beginning;
+#endif
+ last_xlec = xlec;
+ xlec = EditBinding(ch);
+ if ((xlec & LYE_DF) && !(xlec & LYE_FORM_LAC)) {
+ last_xlkc = ch;
+ xlec &= ~LYE_DF;
+ } else {
+ last_xlkc = -1;
+ }
+ switch (xlec) {
+ case LYE_SETM1:
+ InputMods |= LKC_MOD1;
+ break;
+ case LYE_SETM2:
+ InputMods |= LKC_MOD2;
+ break;
+ case LYE_TAB:
+ if (xlec == last_xlec && recall != NORECALL) {
+ HTList *list = whichRecall(recall);
+
+ if (!HTList_isEmpty(list)) {
+ char **data = sortedList(list, (BOOL) (recall == RECALL_CMD));
+ int old_y, old_x;
+ int cur_choice = 0;
+ int num_options = LYarrayLength((STRING2PTR) data);
+
+ while (cur_choice < num_options
+ && strcasecomp(data[cur_choice], Buffer) < 0)
+ cur_choice++;
+
+ LYGetYX(old_y, old_x);
+ cur_choice = LYhandlePopupList(cur_choice,
+ 0,
+ old_x,
+ (STRING2PTR) data,
+ -1,
+ -1,
+ FALSE,
+ FALSE);
+ if (cur_choice >= 0) {
+ if (recall == RECALL_CMD)
+ _statusline(": ");
+ reinsertEdit(edit, data[cur_choice]);
+ }
+ LYmove(old_y, old_x);
+ FREE(data);
+ }
+ } else {
+ reinsertEdit(edit, LYFindInCloset(recall, Buffer));
+ }
+ break;
+
+#ifndef CJK_EX
+ case LYE_AIX:
+ /*
+ * Handle CJK characters, or as a valid character in the current
+ * display character set. Otherwise, we treat this as LYE_ENTER.
+ */
+ if (ch != '\t' &&
+ (IS_CJK_TTY ||
+ LYlowest_eightbit[current_char_set] <= 0x97)) {
+ LYLineEdit(edit, ch, FALSE);
+ break;
+ }
+#endif
+ /* FALLTHRU */
+ case LYE_ENTER:
+ BStrCopy0(*inputline, Buffer);
+ if (!hidden)
+ LYAddToCloset(recall, Buffer);
+ CTRACE((tfp, "LYgetstr(%s) LYE_ENTER\n", (*inputline)->str));
+#ifdef FEPCTRL
+ fep_off();
+#endif
+ LYFinishEdit(edit);
+ result = ch;
+ done = TRUE;
+ continue;
+
+#ifdef CAN_CUT_AND_PASTE
+ case LYE_PASTE:
+ {
+ unsigned char *s = (unsigned char *) get_clip_grab(), *e;
+ size_t len;
+
+ if (!s)
+ break;
+ len = strlen((const char *) s);
+ e = s + len;
+
+ if (len != 0) {
+ unsigned char *e1 = s;
+
+ while (e1 < e) {
+ if (*e1 < ' ') { /* Stop here? */
+ if (e1 > s)
+ LYEditInsert(edit, s, (int) (e1 - s),
+ map_active, TRUE);
+ s = e1;
+ if (*e1 == '\t') { /* Replace by space */
+ LYEditInsert(edit,
+ (unsigned const char *) " ",
+ 1,
+ map_active,
+ TRUE);
+ s = ++e1;
+ } else {
+ break;
+ }
+ } else {
+ ++e1;
+ }
+ }
+ if (e1 > s) {
+ LYEditInsert(edit, s, (int) (e1 - s), map_active, TRUE);
+ }
+ }
+ get_clip_release();
+ break;
+ }
+#endif
+
+ case LYE_ABORT:
+ CTRACE((tfp, "LYgetstr LYE_ABORT\n"));
+#ifdef FEPCTRL
+ fep_off();
+#endif
+ LYFinishEdit(edit);
+ BStrCopy0(*inputline, "");
+ done = TRUE;
+ continue;
+
+ case LYE_STOP:
+ CTRACE((tfp, "LYgetstr LYE_STOP\n"));
+#ifdef TEXTFIELDS_MAY_NEED_ACTIVATION
+ textfields_need_activation = TRUE;
+ LYFinishEdit(edit);
+ BStrCopy0(*inputline, "");
+ done = TRUE;
+ continue;
+#else
+#ifdef ENHANCED_LINEEDIT
+ disableEditMark();
+#endif
+ break;
+#endif
+
+ case LYE_LKCMD:
+ /*
+ * Used only in form_getstr() for invoking the LYK_F_LINK_NUM
+ * prompt when in form text fields. - FM
+ */
+ break;
+
+ case LYE_FORM_PASS:
+ /*
+ * Used in form_getstr() to end line editing and pass on the input
+ * char/lynxkeycode. Here it is just ignored. - kw
+ */
+ break;
+
+ default:
+ if (xlec & LYE_FORM_LAC) {
+ /*
+ * Used in form_getstr() to end line editing and pass on the
+ * lynxkeycode already containing a lynxactioncode. Here it is
+ * just ignored. - kw
+ */
+ break;
+ }
+#ifndef SUPPORT_MULTIBYTE_EDIT
+ LYLineEdit(edit, ch, FALSE);
+#else /* SUPPORT_MULTIBYTE_EDIT */
+ if (LYLineEdit(edit, ch, FALSE) == 0) {
+ if (refresh_mb && IS_CJK_TTY && (0x81 <= ch) && (ch <= 0xfe))
+ refresh_mb = FALSE;
+ else
+ refresh_mb = TRUE;
+ } else {
+ if (!refresh_mb) {
+ LYDoEdit(edit, 0, LYE_DELP, FALSE);
+ }
+ }
+#endif /* SUPPORT_MULTIBYTE_EDIT */
+ }
+ }
+ return result;
+}
+
+/*
+ * Use this for fixed-buffer edits which have not been converted to use
+ * LYgetBString().
+ */
+int LYgetstr(char *inputline, /* fixed-size buffer for input/output */
+ int hidden, /* true to suppress from command-history */
+ unsigned bufsize, /* sizeof(inputline) */
+ RecallType recall) /* type of command-history */
+{
+ int ch;
+ bstring *my_bstring = NULL;
+
+ BStrCopy0(my_bstring, inputline);
+ if (my_bstring != 0) {
+ ch = LYgetBString(&my_bstring, hidden, bufsize, recall);
+ if (ch >= 0 && my_bstring != 0)
+ LYStrNCpy(inputline, my_bstring->str, bufsize);
+ BStrFree(my_bstring);
+ } else {
+ ch = -1;
+ }
+ return ch;
+}
+
+const char *LYLineeditHelpURL(void)
+{
+ static int lasthelp_lineedit = -1;
+ static char helpbuf[LY_MAXPATH] = "\0";
+ static char *phelp = &helpbuf[0];
+ const char *result = NULL;
+
+ if (lasthelp_lineedit == current_lineedit) {
+ result = helpbuf;
+ } else {
+ const char *source = LYLineeditHelpURLs[current_lineedit];
+ size_t available;
+
+ if (lasthelp_lineedit == -1) {
+ LYStrNCpy(helpbuf, helpfilepath, sizeof(helpbuf) - 1);
+ phelp += strlen(helpbuf);
+ }
+ available = (sizeof(helpbuf) - (size_t) (phelp - helpbuf));
+ if (non_empty(source) &&
+ (strlen(source) <= available)) {
+ LYStrNCpy(phelp, source, available);
+ lasthelp_lineedit = current_lineedit;
+ result = helpbuf;
+ }
+ }
+ return result;
+}
+
+/*
+ * Wrapper for sscanf to ensure that lynx can "always" read a POSIX float.
+ * In some locales, the decimal point changes.
+ */
+int LYscanFloat2(const char **source, float *result)
+{
+ int count = 0;
+ char *temp;
+ const char *src = *source;
+
+ src = LYSkipCBlanks(src);
+ *result = 0.0;
+ if (StrChr(src, '.') != 0) {
+ long frc_part = 0;
+ float scale = 1.0;
+
+ if (*src != '.') {
+ temp = NULL;
+ frc_part = strtol(src, &temp, 10);
+ *result = (float) frc_part;
+ src = temp;
+ }
+ if (src != 0 && *src == '.') {
+ ++src;
+ if (isdigit(UCH(*src))) {
+ temp = NULL;
+ frc_part = strtol(src, &temp, 10);
+ if (temp != 0) {
+ int digits = (int) (temp - src);
+
+ while (digits-- > 0)
+ scale *= (float) 10.0;
+ *result += ((float) frc_part / scale);
+ }
+ src = temp;
+ }
+ }
+ if (src != 0 && *src != '\0' && StrChr(" \t+", *src) == 0) {
+ char *extra = (char *) malloc(2 + strlen(src));
+
+ if (extra != 0) {
+ extra[0] = '1';
+ strcpy(extra + 1, src);
+ if (sscanf(extra, "%f", &scale) == 1) {
+ *result *= scale;
+ }
+ FREE(extra);
+ src = LYSkipCNonBlanks(src);
+ } else {
+ src = 0;
+ }
+ }
+ if (src != 0)
+ count = 1;
+ } else {
+ count = sscanf(src, "%f", result);
+ src = LYSkipCNonBlanks(src);
+ }
+ CTRACE2(TRACE_CFG,
+ (tfp, "LYscanFloat \"%s\" -> %f (%s)\n",
+ *source, *result,
+ count ? "ok" : "error"));
+ *source = src;
+ return count;
+}
+
+int LYscanFloat(const char *source, float *result)
+{
+ const char *temp = source;
+
+ return LYscanFloat2(&temp, result);
+}
+
+/*
+ * A replacement for 'strsep()'
+ */
+char *LYstrsep(char **stringp,
+ const char *delim)
+{
+ char *marker;
+ char *result = 0;
+
+ if (non_empty(stringp)) {
+ result = *stringp; /* will return the old value */
+ marker = strpbrk(*stringp, delim);
+ if (marker) {
+ *marker = '\0'; /* terminate the substring */
+ *stringp = ++marker; /* point to the next substring */
+ } else {
+ *stringp = 0; /* this was the last */
+ }
+ }
+ return result;
+}
+
+/*
+ * LYstrstr finds the first occurrence of the string pointed to by needle
+ * in the string pointed to by haystack.
+ *
+ * It returns NULL if the string is not found.
+ *
+ * It is a case insensitive search.
+ */
+char *LYstrstr(char *haystack,
+ const char *needle)
+{
+ int len = (int) strlen(needle);
+ char *result = NULL;
+
+ for (; *haystack != '\0'; haystack++) {
+ if (0 == UPPER8(*haystack, *needle)) {
+ if (0 == strncasecomp8(haystack + 1, needle + 1, len - 1)) {
+ result = haystack;
+ break;
+ }
+ }
+ }
+
+ return (result);
+}
+
+#define SkipSpecialChars(p) \
+ while (IsSpecialAttrChar(*p) && *p != '\0') \
+ p++
+
+/*
+ * LYno_attr_char_case_strstr finds the first occurrence of the
+ * string pointed to by needle in the string pointed to by haystack.
+ *
+ * It ignores special characters, e.g., LY_UNDERLINE_START_CHAR in haystack.
+ *
+ * It is a case insensitive search.
+ */
+const char *LYno_attr_char_case_strstr(const char *haystack,
+ const char *needle)
+{
+ const char *refptr, *tstptr;
+ const char *result = NULL;
+
+ if (haystack != NULL && needle != NULL) {
+
+ SkipSpecialChars(haystack);
+
+ for (; *haystack != '\0' && (result == NULL); haystack++) {
+ if (0 == UPPER8(*haystack, *needle)) {
+ refptr = haystack + 1;
+ tstptr = needle + 1;
+
+ if (*tstptr == '\0') {
+ result = haystack;
+ break;
+ }
+
+ while (1) {
+ if (!IsSpecialAttrChar(*refptr)) {
+ if (0 != UPPER8(*refptr, *tstptr))
+ break;
+ refptr++;
+ tstptr++;
+ } else {
+ refptr++;
+ }
+ if (*tstptr == '\0') {
+ result = haystack;
+ break;
+ }
+ if (*refptr == '\0')
+ break;
+ }
+ }
+ }
+ }
+
+ return (result);
+}
+
+/*
+ * LYno_attr_char_strstr finds the first occurrence of the
+ * string pointed to by needle in the string pointed to by haystack.
+ * It ignores special characters, e.g., LY_UNDERLINE_START_CHAR in haystack.
+ *
+ * It is a case sensitive search.
+ */
+const char *LYno_attr_char_strstr(const char *haystack,
+ const char *needle)
+{
+ const char *refptr, *tstptr;
+ const char *result = NULL;
+
+ if (haystack != NULL && needle != NULL) {
+
+ SkipSpecialChars(haystack);
+
+ for (; *haystack != '\0' && (result == NULL); haystack++) {
+ if ((*haystack) == (*needle)) {
+ refptr = haystack + 1;
+ tstptr = needle + 1;
+
+ if (*tstptr == '\0') {
+ result = haystack;
+ break;
+ }
+
+ while (1) {
+ if (!IsSpecialAttrChar(*refptr)) {
+ if ((*refptr) != (*tstptr))
+ break;
+ refptr++;
+ tstptr++;
+ } else {
+ refptr++;
+ }
+ if (*tstptr == '\0') {
+ result = haystack;
+ break;
+ } else if (*refptr == '\0') {
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ return (result);
+}
+
+/*
+ * LYno_attr_mbcs_case_strstr finds the first occurrence of the string pointed
+ * to by needle in the string pointed to by haystack. It takes account of
+ * MultiByte Character Sequences (UTF8). The physical lengths of the displayed
+ * string up to the start and end (= next position after) of the target string
+ * are returned in *nstartp and *nendp if the search is successful.
+ *
+ * These lengths count glyph cells if count_gcells is set. (Full-width
+ * characters in CJK mode count as two.) Normally that's what we want. They
+ * count actual glyphs if count_gcells is unset. (Full-width characters in CJK
+ * mode count as one.)
+ *
+ * It ignores special characters, e.g., LY_UNDERLINE_START_CHAR in haystack.
+ *
+ * It assumes UTF8 if utf_flag is set.
+ *
+ * It is a case insensitive search.
+ */
+const char *LYno_attr_mbcs_case_strstr(const char *haystack,
+ const char *needle,
+ int utf_flag,
+ int count_gcells,
+ int *nstartp,
+ int *nendp)
+{
+ const char *refptr;
+ const char *tstptr;
+ int len = 0;
+ int offset;
+ const char *result = NULL;
+
+ if (haystack != NULL && needle != NULL) {
+
+ SkipSpecialChars(haystack);
+
+ for (; *haystack != '\0' && (result == NULL); haystack++) {
+ if ((!utf_flag && IS_CJK_TTY && is8bits(*haystack) &&
+ *haystack == *needle &&
+ IsNormalChar(*(haystack + 1))) ||
+ (0 == UPPER8(*haystack, *needle))) {
+ int tarlen = 0;
+
+ offset = len;
+ len++;
+
+ refptr = (haystack + 1);
+ tstptr = (needle + 1);
+
+ if (*tstptr == '\0') {
+ if (nstartp)
+ *nstartp = offset;
+ if (nendp)
+ *nendp = len;
+ result = haystack;
+ break;
+ }
+ if (!utf_flag && IS_CJK_TTY && is8bits(*haystack) &&
+ *haystack == *needle &&
+ IsNormalChar(*refptr)) {
+ /* handle a CJK multibyte string */
+ if (*refptr == *tstptr) {
+ refptr++;
+ tstptr++;
+ if (count_gcells)
+ tarlen++;
+ if (*tstptr == '\0') {
+ if (nstartp)
+ *nstartp = offset;
+ if (nendp)
+ *nendp = len + tarlen;
+ result = haystack;
+ break;
+ }
+ } else {
+ /* not a match */
+ haystack++;
+ if (count_gcells)
+ len++;
+ continue;
+ }
+ }
+ /* compare the remainder of the string */
+ while (1) {
+ if (!IsSpecialAttrChar(*refptr)) {
+ if (!utf_flag && IS_CJK_TTY && is8bits(*refptr)) {
+ if (*refptr == *tstptr &&
+ *(refptr + 1) == *(tstptr + 1) &&
+ !IsSpecialAttrChar(*(refptr + 1))) {
+ refptr++;
+ tstptr++;
+ if (count_gcells)
+ tarlen++;
+ } else {
+ break;
+ }
+ } else if (0 != UPPER8(*refptr, *tstptr)) {
+ break;
+ }
+
+ if (!IS_UTF_EXTRA(*tstptr)) {
+ tarlen++;
+ }
+ refptr++;
+ tstptr++;
+
+ } else {
+ refptr++;
+ }
+
+ if (*tstptr == '\0') {
+ if (nstartp)
+ *nstartp = offset;
+ if (nendp)
+ *nendp = len + tarlen;
+ result = haystack;
+ break;
+ }
+ if (*refptr == '\0')
+ break;
+ }
+ } else if (!(IS_UTF_EXTRA(*haystack) ||
+ IsSpecialAttrChar(*haystack))) {
+ if (!utf_flag && IS_CJK_TTY && is8bits(*haystack) &&
+ IsNormalChar(*(haystack + 1))) {
+ haystack++;
+ if (count_gcells)
+ len++;
+ }
+ len++;
+ }
+ }
+ }
+
+ return (result);
+}
+
+/*
+ * LYno_attr_mbcs_strstr finds the first occurrence of the string pointed
+ * to by needle in the string pointed to by haystack.
+ *
+ * It takes account of CJK and MultiByte Character Sequences (UTF8). The
+ * physical lengths of the displayed string up to the start and end (= next
+ * position after) the target string are returned in *nstartp and *nendp if the
+ * search is successful.
+ *
+ * These lengths count glyph cells if count_gcells is set. (Full-width
+ * characters in CJK mode count as two.) Normally that's what we want. They
+ * count actual glyphs if count_gcells is unset. (Full-width characters in CJK
+ * mode count as one.)
+ *
+ * It ignores special characters, e.g., LY_UNDERLINE_START_CHAR in haystack.
+ *
+ * It assumes UTF8 if utf_flag is set.
+ *
+ * It is a case sensitive search.
+ */
+const char *LYno_attr_mbcs_strstr(const char *haystack,
+ const char *needle,
+ int utf_flag,
+ int count_gcells,
+ int *nstartp,
+ int *nendp)
+{
+ const char *refptr;
+ const char *tstptr;
+ int len = 0;
+ int offset;
+ const char *result = NULL;
+
+ if (haystack != NULL && needle != NULL) {
+
+ SkipSpecialChars(haystack);
+
+ for (; *haystack != '\0' && (result == NULL); haystack++) {
+ if ((*haystack) == (*needle)) {
+ int tarlen = 0;
+
+ offset = len;
+ len++;
+
+ refptr = (haystack + 1);
+ tstptr = (needle + 1);
+
+ if (*tstptr == '\0') {
+ if (nstartp)
+ *nstartp = offset;
+ if (nendp)
+ *nendp = len;
+ result = haystack;
+ break;
+ } else if (!utf_flag &&
+ IS_CJK_TTY &&
+ is8bits(*haystack) &&
+ IsNormalChar(*refptr)) {
+ /* handle a CJK multibyte string */
+ if (*refptr == *tstptr) {
+ /* found match */
+ refptr++;
+ tstptr++;
+ if (count_gcells)
+ tarlen++;
+ if (*tstptr == '\0') {
+ if (nstartp)
+ *nstartp = offset;
+ if (nendp)
+ *nendp = len + tarlen;
+ result = haystack;
+ break;
+ }
+ } else {
+ /* not a match - restart comparison */
+ haystack++;
+ if (count_gcells)
+ len++;
+ continue;
+ }
+ }
+ /* compare the remainder of the string */
+ while (1) {
+ if (!IsSpecialAttrChar(*refptr)) {
+ if (!utf_flag && IS_CJK_TTY && is8bits(*refptr)) {
+ if (*refptr == *tstptr &&
+ *(refptr + 1) == *(tstptr + 1) &&
+ !IsSpecialAttrChar(*(refptr + 1))) {
+ refptr++;
+ tstptr++;
+ if (count_gcells)
+ tarlen++;
+ } else {
+ break;
+ }
+ } else if ((*refptr) != (*tstptr)) {
+ break;
+ }
+
+ if (!IS_UTF_EXTRA(*tstptr)) {
+ tarlen++;
+ }
+ refptr++;
+ tstptr++;
+ } else {
+ refptr++;
+ }
+
+ if (*tstptr == '\0') {
+ if (nstartp)
+ *nstartp = offset;
+ if (nendp)
+ *nendp = len + tarlen;
+ result = haystack;
+ break;
+ }
+ if (*refptr == '\0')
+ break;
+ }
+ } else if (!(IS_UTF_EXTRA(*haystack) ||
+ IsSpecialAttrChar(*haystack))) {
+ if (!utf_flag && IS_CJK_TTY && is8bits(*haystack) &&
+ IsNormalChar(*(haystack + 1))) {
+ haystack++;
+ if (count_gcells)
+ len++;
+ }
+ len++;
+ }
+ }
+ }
+ return (result);
+}
+
+/*
+ * Allocate and return a copy of a string.
+ * see StrAllocCopy
+ */
+char *SNACopy(char **target,
+ const char *source,
+ size_t n)
+{
+ FREE(*target);
+ if (source) {
+ *target = typeMallocn(char, n + 1);
+
+ if (*target == NULL) {
+ CTRACE((tfp, "Tried to malloc %lu bytes\n", (unsigned long) n));
+ outofmem(__FILE__, "SNACopy");
+ }
+ LYStrNCpy(*target, source, n);
+ }
+ return *target;
+}
+
+/*
+ * Combine string allocation and concatenation.
+ * see StrAllocCat
+ */
+char *SNACat(char **target,
+ const char *source,
+ size_t n)
+{
+ if (non_empty(source)) {
+ if (*target) {
+ size_t length = strlen(*target);
+
+ *target = typeRealloc(char, *target, length + n + 1);
+
+ if (*target == NULL)
+ outofmem(__FILE__, "SNACat");
+ LYStrNCpy(*target + length, source, n);
+ } else {
+ *target = typeMallocn(char, n + 1);
+
+ if (*target == NULL)
+ outofmem(__FILE__, "SNACat");
+ MemCpy(*target, source, n);
+ (*target)[n] = '\0'; /* terminate */
+ }
+ }
+ return *target;
+}
+
+#include <caselower.h>
+
+/*
+ * Returns lowercase equivalent for unicode,
+ * transparent output if no equivalent found.
+ */
+static long UniToLowerCase(long upper)
+{
+ size_t i, high, low;
+ long diff = 0;
+ long result = upper;
+
+ if (upper > 0) {
+ /*
+ * Try unicode_to_lower_case[].
+ */
+ low = 0;
+ high = TABLESIZE(unicode_to_lower_case);
+ while (low < high) {
+ /*
+ * Binary search.
+ */
+ i = (low + (high - low) / 2);
+ diff = (unicode_to_lower_case[i].upper - upper);
+ if (diff < 0) {
+ low = i + 1;
+ } else if (diff > 0) {
+ high = i;
+ } else if (diff == 0) {
+ result = unicode_to_lower_case[i].lower;
+ break;
+ }
+ }
+ }
+
+ return result;
+}
+
+/*
+ * UPPER8 ?
+ * it was "TOUPPER(a) - TOUPPER(b)" in its previous life...
+ *
+ * It was realized that case-insensitive user search
+ * got information about upper/lower mapping from TOUPPER
+ * (precisely from "(TOUPPER(a) - TOUPPER(b))==0")
+ * and depends on locale in its 8bit mapping. -
+ * Usually fails with DOS/WINDOWS display charsets
+ * as well as on non-UNIX systems.
+ *
+ * So use unicode case mapping.
+ */
+int UPPER8(int ch1, int ch2)
+{
+ int result = 0;
+
+ if (ch1 == ch2) {
+ result = 0;
+ } else if (!ch2) {
+ result = UCH(ch1);
+ } else if (!ch1) {
+ result = -UCH(ch2);
+ } else if (UCH(TOASCII(ch1)) < 128 && UCH(TOASCII(ch2)) < 128) {
+ /* case-insensitive match for us-ascii */
+ result = (TOUPPER(ch1) - TOUPPER(ch2));
+ } else if (UCH(TOASCII(ch1)) > 127 &&
+ UCH(TOASCII(ch2)) > 127) {
+ /* case-insensitive match for upper half */
+ if (DisplayCharsetMatchLocale) {
+ result = (TOUPPER(ch1) - TOUPPER(ch2)); /* old-style */
+ } else {
+ long uni_ch2 = UCTransToUni((char) ch2, current_char_set);
+ long uni_ch1;
+
+ if (uni_ch2 < 0) {
+ result = UCH(ch1);
+ } else {
+ uni_ch1 = UCTransToUni((char) ch1, current_char_set);
+ result = (int) (UniToLowerCase(uni_ch1) - UniToLowerCase(uni_ch2));
+ }
+ }
+ } else {
+ result = -10; /* mismatch */
+ }
+
+ return result;
+}
+
+/*
+ * Replaces 'fgets()' calls into a fixed-size buffer with reads into a buffer
+ * that is allocated. When an EOF or error is found, the buffer is freed
+ * automatically.
+ */
+char *LYSafeGets(char **target,
+ FILE *fp)
+{
+ char buffer[BUFSIZ];
+ char *result = 0;
+
+ if (target != 0)
+ result = *target;
+ if (result != 0)
+ *result = 0;
+
+ while (fgets(buffer, (int) sizeof(buffer), fp) != NULL) {
+ if (*buffer)
+ result = StrAllocCat(result, buffer);
+ if (StrChr(buffer, '\n') != 0)
+ break;
+ }
+ if (ferror(fp)) {
+ FREE(result);
+ } else if (feof(fp) && result && *result == '\0') {
+ /*
+ * If the file ends in the middle of a line, return the partial line;
+ * if another call is made after this, it will return NULL. - kw
+ */
+ FREE(result);
+ }
+ if (target != 0)
+ *target = result;
+ return result;
+}
+
+#ifdef USE_CMD_LOGGING
+static FILE *cmd_logfile;
+static FILE *cmd_script;
+
+void LYOpenCmdLogfile(int argc,
+ char **argv)
+{
+ int n;
+
+ if (non_empty(lynx_cmd_logfile)) {
+ cmd_logfile = LYNewTxtFile(lynx_cmd_logfile);
+ if (cmd_logfile != 0) {
+ fprintf(cmd_logfile, "# Command logfile created by %s %s (%s)\n",
+ LYNX_NAME, LYNX_VERSION, LYVersionDate());
+ for (n = 0; n < argc; n++) {
+ fprintf(cmd_logfile, "# Arg%d = %s\n", n, argv[n]);
+ }
+ }
+ }
+}
+
+BOOL LYHaveCmdScript(void)
+{
+ return (BOOL) (cmd_script != 0);
+}
+
+void LYOpenCmdScript(void)
+{
+ if (non_empty(lynx_cmd_script)) {
+ cmd_script = fopen(lynx_cmd_script, TXT_R);
+ CTRACE((tfp, "LYOpenCmdScript(%s) %s\n",
+ lynx_cmd_script,
+ cmd_script != 0 ? "SUCCESS" : "FAIL"));
+ }
+}
+
+int LYReadCmdKey(int mode)
+{
+ int ch = -1;
+
+ if (cmd_script != 0) {
+ char *buffer = 0;
+ char *src;
+ char *tmp;
+
+ while ((ch < 0) && LYSafeGets(&buffer, cmd_script) != 0) {
+ LYTrimTrailing(buffer);
+ src = LYSkipBlanks(buffer);
+ tmp = LYSkipNonBlanks(src);
+ switch ((unsigned) (tmp - src)) {
+ case 4:
+ if (!strncasecomp(src, "exit", 4))
+ exit_immediately(EXIT_SUCCESS);
+ break;
+ case 3:
+ if (!strncasecomp(src, "key", 3)) {
+ ch = LYStringToKeycode(LYSkipBlanks(tmp));
+ } else if (!strncasecomp(src, "set", 3)) {
+ src = LYSkipBlanks(tmp);
+ tmp = src;
+ while (*tmp != '\0') {
+ if (isspace(UCH(*tmp)) || *tmp == '=')
+ break;
+ ++tmp;
+ }
+ if (*tmp != '\0') {
+ *tmp++ = '\0';
+ tmp = LYSkipBlanks(tmp);
+ }
+ if (LYSetConfigValue(src, tmp)) {
+ CTRACE((tfp, "LYSetConfigValue(%s, %s)\n", src, tmp));
+ } else if (LYsetRcValue(src, tmp)) {
+ CTRACE((tfp, "LYsetRcValue(%s, %s)\n", src, tmp));
+ } else {
+ CTRACE((tfp, "?? set ignored %s\n", src));
+ }
+ }
+ break;
+ }
+ }
+ if (feof(cmd_script)) {
+ fclose(cmd_script);
+ cmd_script = 0;
+ }
+ if (ch >= 0) {
+ LYSleepReplay();
+ LYrefresh();
+ }
+ FREE(buffer);
+ } else {
+ ch = LYgetch_for(mode);
+ }
+ CTRACE((tfp, "LYReadCmdKey(%d) ->%s (%#x)\n",
+ mode, LYKeycodeToString(ch, TRUE), (unsigned) ch));
+ LYWriteCmdKey(ch);
+ return ch;
+}
+
+/*
+ * Write a LYKeymapCode 'ch' to the logfile.
+ */
+void LYWriteCmdKey(int ch)
+{
+ if (cmd_logfile != 0) {
+ fprintf(cmd_logfile, "key %s\n", LYKeycodeToString(ch, FALSE));
+ }
+}
+
+void LYCloseCmdLogfile(void)
+{
+ if (cmd_logfile != 0) {
+ LYCloseOutput(cmd_logfile);
+ cmd_logfile = 0;
+ }
+ if (cmd_script != 0) {
+ LYCloseInput(cmd_script);
+ cmd_script = 0;
+ }
+ FREE(lynx_cmd_logfile);
+ FREE(lynx_cmd_script);
+}
+#endif /* USE_CMD_LOGGING */
diff --git a/src/LYStrings.h b/src/LYStrings.h
new file mode 100644
index 0000000..a401379
--- /dev/null
+++ b/src/LYStrings.h
@@ -0,0 +1,402 @@
+/*
+ * $LynxId: LYStrings.h,v 1.117 2018/05/04 22:47:10 tom Exp $
+ */
+#ifndef LYSTRINGS_H
+#define LYSTRINGS_H
+
+#include <LYCurses.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define SQUOTE '\''
+#define DQUOTE '"'
+#define ESCAPE '\\'
+#define LPAREN '('
+#define RPAREN ')'
+
+ typedef const char *const Const2CharPtr;
+ typedef enum {
+ NORECALL = 0
+ ,RECALL_URL
+ ,RECALL_CMD
+ ,RECALL_MAIL
+ } RecallType;
+
+#define IS_UTF8_TTY (BOOLEAN) (LYCharSet_UC[current_char_set].enc == UCT_ENC_UTF8)
+#define IS_CJK_TTY (BOOLEAN) (HTCJK != NOCJK)
+
+#define is8bits(ch) (BOOLEAN) (UCH(ch) >= 128) /* isascii(ch) is not POSIX */
+
+/* UPPER8(ch1,ch2) is an extension of (TOUPPER(ch1) - TOUPPER(ch2)) */
+ extern int UPPER8(int ch1,
+ int ch2);
+
+ extern int get_mouse_link(void);
+ extern int peek_mouse_link(void);
+ extern int peek_mouse_levent(void);
+ extern int fancy_mouse(WINDOW * win, int row, int *position);
+
+ extern char *LYstrncpy(char *dst,
+ const char *src,
+ int n);
+#define LYStrNCpy(dst,src,n) LYstrncpy(dst,src,(int)(n))
+ extern void ena_csi(int flag);
+ extern int get_popup_number(const char *msg,
+ int *c,
+ int *rel);
+ extern int LYarrayLength(STRING2PTR list);
+ extern int LYarrayWidth(STRING2PTR list);
+ extern int LYgetch(void);
+ extern int LYgetch_choice(void);
+ extern int LYgetch_input(void);
+ extern int LYgetch_single(void);
+ extern int LYgetstr(char *inputline,
+ int masked,
+ unsigned bufsize,
+ RecallType recall);
+#define LYGetStr(input,masked,bufsize,recall) \
+ LYgetstr(input,masked,(unsigned)(bufsize),recall)
+ extern int LYgetBString(bstring **inputline,
+ int masked,
+ unsigned max_cols,
+ RecallType recall);
+ extern int LYscanFloat(const char *source, float *result);
+ extern int LYscanFloat2(const char **source, float *result);
+ extern char *LYstrsep(char **stringp,
+ const char *delim);
+ extern char *LYstrstr(char *chptr,
+ const char *tarptr);
+ extern char *LYmbcsstrncpy(char *dst,
+ const char *src,
+ int n_bytes,
+ int n_glyphs,
+ int utf_flag);
+ extern const char *LYmbcs_skip_cells(const char *data,
+ int n_cells,
+ int utf_flag);
+ extern const char *LYmbcs_skip_glyphs(const char *data,
+ int n_glyphs,
+ int utf_flag);
+ extern int LYmbcsstrlen(const char *str,
+ int utf_flag,
+ int count_gcells);
+
+ extern const char *LYno_attr_mbcs_strstr(const char *chptr,
+ const char *tarptr,
+ int utf_flag,
+ int count_gcells,
+ int *nstartp,
+ int *nendp);
+ extern const char *LYno_attr_mbcs_case_strstr(const char *chptr,
+ const char *tarptr,
+ int utf_flag,
+ int count_gcells,
+ int *nstartp,
+ int *nendp);
+
+#define LYno_attr_mb_strstr(chptr, tarptr, utf_flag, count_gcells, nstartp, nendp) \
+ (LYcase_sensitive \
+ ? LYno_attr_mbcs_strstr(chptr, tarptr, utf_flag, count_gcells, nstartp, nendp) \
+ : LYno_attr_mbcs_case_strstr(chptr, tarptr, utf_flag, count_gcells, nstartp, nendp))
+
+ extern const char *LYno_attr_char_strstr(const char *chptr,
+ const char *tarptr);
+ extern const char *LYno_attr_char_case_strstr(const char *chptr,
+ const char *tarptr);
+
+#define LYno_attr_strstr(chptr, tarptr) \
+ (LYcase_sensitive \
+ ? LYno_attr_char_strstr(chptr, tarptr) \
+ : LYno_attr_char_case_strstr(chptr, tarptr))
+
+ extern char *SNACopy(char **dest,
+ const char *src,
+ size_t n);
+ extern char *SNACat(char **dest,
+ const char *src,
+ size_t n);
+
+#define StrnAllocCopy(dest, src, n) SNACopy (&(dest), src, n)
+#define StrnAllocCat(dest, src, n) SNACat (&(dest), src, n)
+
+ extern char *LYSafeGets(char **src, FILE *fp);
+
+#ifdef USE_CMD_LOGGING
+ extern BOOL LYHaveCmdScript(void);
+ extern int LYReadCmdKey(int mode);
+ extern void LYCloseCmdLogfile(void);
+ extern void LYOpenCmdLogfile(int argc, char **argv);
+ extern void LYOpenCmdScript(void);
+ extern void LYWriteCmdKey(int ch);
+
+#else
+#define LYHaveCmdScript() FALSE
+#define LYReadCmdKey(mode) LYgetch_for(mode)
+#define LYCloseCmdLogfile() /* nothing */
+#endif
+
+/* values for LYgetch */
+ /* The following are lynxkeycodes, not to be confused with
+ * lynxactioncodes (LYK_*) to which they are often mapped.
+ * The lynxkeycodes include all single-byte keys as a subset.
+ * These are "extra" keys which do not fit into a single byte.
+ */
+ typedef enum {
+ UNKNOWN_KEY = -1
+ ,DEL_KEY = 127
+ ,UPARROW_KEY = 256
+ ,DNARROW_KEY
+ ,RTARROW_KEY
+ ,LTARROW_KEY
+ ,PGDOWN_KEY
+ ,PGUP_KEY
+ ,HOME_KEY
+ ,END_KEY
+ ,F1_KEY
+ ,DO_KEY
+ ,FIND_KEY
+ ,SELECT_KEY
+ ,INSERT_KEY
+ ,REMOVE_KEY
+ ,DO_NOTHING
+ ,BACKTAB_KEY
+ /* these should be referenced by name in keymap, e.g., "f2" */
+ ,F2_KEY
+ ,F3_KEY
+ ,F4_KEY
+ ,F5_KEY
+ ,F6_KEY
+ ,F7_KEY
+ ,F8_KEY
+ ,F9_KEY
+ ,F10_KEY
+ ,F11_KEY
+ ,F12_KEY
+ /* this has known value */
+ ,MOUSE_KEY = 285 /* 0x11D */
+ } LYExtraKeys;
+
+/* ***** NOTES: *****
+ If you add definitions for new lynxkeycodes to the above list that need to
+ be mapped to LYK_* lynxactioncodes -
+
+ - AT LEAST the tables keymap[] and key_override[] in LYKeymap.c have to be
+ changed/reviewed, AS WELL AS the lineedit binding tables in LYEditmap.c !
+
+ - KEYMAP_SIZE, defined in LYKeymap.h, may need to be changed !
+
+ - See also table named_keys[] in LYKeymap.c for 'pretty' strings for the
+ keys with codes >= 256 (to appear on the 'K'eymap page). New keycodes
+ should probably be assigned consecutively, so their key names can be
+ easily added to named_keys[] (but see next point). They should also be
+ documented in lynx.cfg.
+
+ - The DOS port uses its own native codes for some keys, unless they are
+ remapped by the code in LYgetch(). See *.key files in docs/ directory.
+ Adding new keys here may conflict with those codes (affecting DOS users),
+ unless/until remapping is added or changed in LYgetch(). (N)curses
+ keypad codes (KEY_* from curses.h) can also directly appear as
+ lynxkeycodes and conflict with our assignments, although that shouldn't
+ happen - the useful ones should be recognized in LYgetch().
+
+ - The actual recognition of raw input keys or escape sequences, and mapping
+ to our lynxkeycodes, take place in LYgetch() and/or its subsidiary
+ functions and/or the curses/slang/etc. libraries.
+
+ The basic lynxkeycodes can appear combined with various flags in
+ higher-order bits as extended lynxkeycodes; see macros in LYKeymap.h. The
+ range of possible basic values is therefore limited, they have to be less
+ than LKC_ISLKC (even if KEYMAP_SIZE is increased).
+*/
+
+# define FOR_PANEL 0 /* normal screen, also LYgetch default */
+# define FOR_CHOICE 1 /* mouse menu */
+# define FOR_INPUT 2 /* form input and textarea field */
+# define FOR_PROMPT 3 /* string prompt editing */
+# define FOR_SINGLEKEY 4 /* single key prompt, confirmation */
+
+#ifdef USE_ALT_BINDINGS
+/* Enable code implementing additional, mostly emacs-like, line-editing
+ functions. - kw */
+#define ENHANCED_LINEEDIT
+#endif
+
+/* FieldEditor preserves state between calls to LYDoEdit
+ */
+ typedef struct {
+
+ int efStartX; /* Origin of edit-field */
+ int efStartY;
+ int efWidth; /* Screen real estate for editing */
+
+ char *efBuffer; /* the buffer which is being edited */
+ size_t efBufInUse; /* current size of string. */
+ size_t efBufAlloc; /* current buffer-size, excluding nul at end */
+ size_t efBufLimit; /* buffer size limit, zero if indefinite */
+
+ char efPadChar; /* Right padding typically ' ' or '_' */
+ BOOL efIsMasked; /* Masked password entry flag */
+
+ BOOL efIsDirty; /* accumulate refresh requests */
+ BOOL efIsPanned; /* Need horizontal scroll indicator */
+ int efDpyStart; /* Horizontal scroll offset */
+ int efEditAt; /* Insertion point in string */
+ int efPanMargin; /* Number of columns look-ahead/look-back */
+ int efInputMods; /* Modifiers for next input lynxkeycode */
+#ifdef ENHANCED_LINEEDIT
+ int efEditMark; /* position of emacs-like mark, or -1-pos to denote
+ unactive mark. */
+#endif
+
+ int *efOffs2Col; /* fixups for multibyte characters */
+
+ } FieldEditor;
+
+/* line-edit action encoding */
+
+ typedef enum {
+ LYE_UNKNOWN = -1 /* no binding */
+ ,LYE_NOP = 0 /* Do Nothing */
+ ,LYE_CHAR /* Insert printable char */
+ ,LYE_ENTER /* Input complete, return char/lynxkeycode */
+ ,LYE_TAB /* Input complete, return TAB */
+ ,LYE_STOP /* Input complete, deactivate */
+ ,LYE_ABORT /* Input cancelled */
+
+ ,LYE_FORM_PASS /* In form fields: input complete,
+ return char / lynxkeycode;
+ Elsewhere: Do Nothing */
+
+ ,LYE_DELN /* Delete next/curr char */
+ ,LYE_DELC /* Obsolete (DELC case was equiv to DELN) */
+ ,LYE_DELP /* Delete prev char */
+ ,LYE_DELNW /* Delete next word */
+ ,LYE_DELPW /* Delete prev word */
+
+ ,LYE_ERASE /* Erase the line */
+
+ ,LYE_BOL /* Go to begin of line */
+ ,LYE_EOL /* Go to end of line */
+ ,LYE_FORW /* Cursor forwards */
+ ,LYE_FORW_RL /* Cursor forwards or right link */
+ ,LYE_BACK /* Cursor backwards */
+ ,LYE_BACK_LL /* Cursor backwards or left link */
+ ,LYE_FORWW /* Word forward */
+ ,LYE_BACKW /* Word back */
+
+ ,LYE_LOWER /* Lower case the line */
+ ,LYE_UPPER /* Upper case the line */
+
+ ,LYE_LKCMD /* Invoke command prompt */
+
+ ,LYE_AIX /* Hex 97 */
+
+ ,LYE_DELBL /* Delete back to BOL */
+ ,LYE_DELEL /* Delete thru EOL */
+
+ ,LYE_SWMAP /* Switch input keymap */
+
+ ,LYE_TPOS /* Transpose characters */
+
+ ,LYE_SETM1 /* Set modifier 1 flag */
+ ,LYE_SETM2 /* Set modifier 2 flag */
+ ,LYE_UNMOD /* Fall back to no-modifier command */
+
+ ,LYE_C1CHAR /* Insert C1 char if printable */
+
+ ,LYE_SETMARK /* emacs-like set-mark-command */
+ ,LYE_XPMARK /* emacs-like exchange-point-and-mark */
+ ,LYE_KILLREG /* emacs-like kill-region */
+ ,LYE_YANK /* emacs-like yank */
+#ifdef CAN_CUT_AND_PASTE
+ ,LYE_PASTE /* ClipBoard to Lynx */
+#endif
+ } LYEditCodes;
+
+/* All preceding values must be within 0x00..0x7f - kw */
+
+/* The following are meant to be bitwise or-ed: */
+#define LYE_DF 0x80 /* Flag to set modifier 3 AND do other
+ action */
+#define LYE_FORM_LAC 0x1000 /* Flag to pass lynxactioncode given by
+ lower bits. Doesn't fit in a char! */
+
+#if defined(USE_KEYMAPS)
+ extern int lynx_initialize_keymaps(void);
+ extern int map_string_to_keysym(const char *src, int *lec, int internal);
+#endif
+
+ extern BOOL LYRemapEditBinding(int xlkc, int lec, int select_edi); /* in LYEditmap.c */
+ extern BOOLEAN LYRemoveNewlines(char *buffer);
+ extern BOOLEAN LYTrimStartfile(char *buffer);
+ extern LYExtraKeys LYnameToExtraKeys(const char *name);
+ extern char *LYElideString(char *str, int cut_pos);
+ extern char *LYReduceBlanks(char *buffer);
+ extern char *LYRemoveBlanks(char *buffer);
+ extern char *LYSkipBlanks(char *buffer);
+ extern char *LYSkipNonBlanks(char *buffer);
+ extern char *LYTrimNewline(char *buffer);
+ extern const char *LYSkipCBlanks(const char *buffer);
+ extern const char *LYSkipCNonBlanks(const char *buffer);
+ extern const char *LYextraKeysToName(LYExtraKeys code);
+ extern int EditBinding(int ch); /* in LYEditmap.c */
+ extern int LYDoEdit(FieldEditor * edit, int ch, int action, int maxMessage);
+ extern int LYEditKeyForAction(int lac, int *pmodkey); /* LYEditmap.c */
+ extern int LYKeyForEditAction(int lec); /* in LYEditmap.c */
+ extern int LYhandlePopupList(int cur_choice, int ly, int lx,
+ STRING2PTR choices,
+ int width,
+ int i_length,
+ int disabled,
+ int for_mouse);
+ extern void LYCloseCloset(RecallType recall);
+ extern void LYEscapeStartfile(char **buffer);
+ extern void LYFinishEdit(FieldEditor * edit);
+ extern void LYLowerCase(char *buffer);
+ extern void LYRefreshEdit(FieldEditor * edit);
+ extern void LYSetupEdit(FieldEditor * edit, char *old,
+ unsigned buffer_limit,
+ int display_limit);
+ extern void LYTrimAllStartfile(char *buffer);
+ extern void LYTrimLeading(char *buffer);
+ extern void LYTrimTrailing(char *buffer);
+ extern void LYUpperCase(char *buffer);
+
+ typedef short LYEditCode;
+
+ typedef struct {
+ int code;
+ LYEditCode edit;
+ } LYEditInit;
+
+ typedef struct {
+ const char *name;
+ const LYEditInit *init;
+ LYEditCode *used;
+ } LYEditConfig;
+
+ extern int current_lineedit;
+ extern const char *LYEditorNames[];
+ extern LYEditConfig LYLineEditors[];
+ extern const char *LYLineeditHelpURLs[];
+
+#define CurrentLineEditor() LYLineEditors[current_lineedit].used
+
+ extern void LYinitEditmap(void);
+ extern void LYinitKeymap(void);
+ extern const char *LYLineeditHelpURL(void);
+
+ extern int escape_bound;
+
+#define LYLineEdit(e,c,m) LYDoEdit(e, c, EditBinding(c) & ~LYE_DF, m)
+
+ extern int LYEditInsert(FieldEditor * edit, unsigned const char *s,
+ int len, int map_active,
+ int maxMessage);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* LYSTRINGS_H */
diff --git a/src/LYStructs.h b/src/LYStructs.h
new file mode 100644
index 0000000..179914a
--- /dev/null
+++ b/src/LYStructs.h
@@ -0,0 +1,190 @@
+/*
+ * $LynxId: LYStructs.h,v 1.32 2021/06/09 20:56:05 tom Exp $
+ */
+#ifndef LYSTRUCTS_H
+#define LYSTRUCTS_H
+
+#ifndef HTANCHOR_H
+#include <HTAnchor.h>
+#endif /* HTANCHOR_H */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ typedef struct {
+ char *hl_text;
+ short hl_x;
+ } HiliteInfo;
+
+ typedef struct {
+ HiliteInfo *hl_info;
+ HiliteInfo hl_base;
+ short hl_len; /* number of strings in this struct */
+ } HiliteList;
+
+ typedef struct {
+ char *lname;
+ char *target;
+ char *l_hightext;
+ BOOL inUnderline; /* TRUE when this link is in underlined context. */
+ int lx;
+ int ly;
+ int type; /* Type of link, Forms, WWW, etc. */
+ int sgml_offset; /* document offset used in reparsing */
+ int anchor_number; /* The anchor number within the HText structure. */
+ int anchor_line_num; /* The anchor line number in the HText structure. */
+ HiliteList list;
+ struct _FormInfo *l_form; /* Pointer to form info. */
+ } LinkInfo;
+ extern LinkInfo links[MAXLINKS];
+ extern int nlinks;
+
+ typedef struct {
+ /* FIXME: see DocAddress */
+ char *title;
+ char *address;
+ bstring *post_data;
+ char *post_content_type;
+ char *bookmark;
+ BOOL isHEAD;
+ BOOL safe;
+
+ int link;
+ int line;
+ BOOL internal_link; /* whether doc was reached via an internal
+ (fragment) link. - kw */
+#ifdef USE_COLOR_STYLE
+ char *style;
+#endif
+ } DocInfo;
+
+ typedef struct {
+ DocInfo hdoc;
+ int intern_seq_start; /* indicates which element on the history
+ is the start of this sequence of
+ "internal links", otherwise -1 */
+ } HistInfo;
+
+#define HDOC(n) history[n].hdoc
+
+ extern int Visited_Links_As;
+
+#define VISITED_LINKS_AS_FIRST_V 0
+#define VISITED_LINKS_AS_TREE 1
+#define VISITED_LINKS_AS_LATEST 2
+#define VISITED_LINKS_REVERSE 4
+
+ typedef struct _VisitedLink {
+ char *title;
+ char *address;
+ int level;
+ struct _VisitedLink *next_tree;
+ struct _VisitedLink *prev_latest;
+ struct _VisitedLink *next_latest;
+ struct _VisitedLink *prev_first;
+ } VisitedLink;
+
+ extern HistInfo *history;
+ extern int nhist;
+ extern unsigned size_history;
+
+/******************************************************************************/
+
+ typedef struct _lynx_list_item_type {
+ struct _lynx_list_item_type *next; /* the next item in the linked list */
+ char *name; /* a description of the item */
+ char *menu_name; /* menu-name for EXTERNAL / EXTERNAL_MENU */
+ char *command; /* the command to execute */
+ BOOL always_enabled; /* a constant to tell whether or
+ * not to disable the printer
+ * when the no_print option is on
+ */
+ /* HTML lists: */
+ BOOL override_action; /* whether primary action will be
+ * overridden by this - e.g. this
+ * allows invoking user's MUA when
+ * mailto: link is activated using
+ * normal "activate" command. This
+ * field is only examined by code that
+ * handles EXTERNAL command.
+ */
+ /* PRINTER lists: */
+ int pagelen; /* an integer to store the printer's
+ * page length
+ */
+ } lynx_list_item_type;
+
+ extern lynx_list_item_type *printers;
+
+/* for download commands */
+ extern lynx_list_item_type *downloaders;
+
+/* for upload commands */
+ extern lynx_list_item_type *uploaders;
+
+#ifdef USE_EXTERNALS
+/* for external commands */
+ extern lynx_list_item_type *externals;
+#endif
+
+/******************************************************************************/
+
+ typedef struct {
+ const char *name;
+ int value;
+ } Config_Enum;
+
+ typedef int (*ParseFunc) (char *);
+
+#define ParseUnionMembers \
+ lynx_list_item_type** add_value; \
+ BOOLEAN * set_value; \
+ int * int_value; \
+ char ** str_value; \
+ ParseFunc fun_value; \
+ long def_value; \
+ HTList** lst_value
+
+ typedef union {
+ ParseUnionMembers;
+ } ParseUnion;
+
+#define PARSE_DEBUG 1
+#ifdef PARSE_DEBUG
+
+#define ParseUnionPtr Config_Type *
+#define ParseUnionOf(tbl) tbl
+#define ParseData ParseUnionMembers
+
+#define UNION_ADD(v) &v, 0, 0, 0, 0, 0, 0
+#define UNION_SET(v) 0, &v, 0, 0, 0, 0, 0
+#define UNION_INT(v) 0, 0, &v, 0, 0, 0, 0
+#define UNION_STR(v) 0, 0, 0, &v, 0, 0, 0
+#define UNION_ENV(v) 0, 0, 0, v, 0, 0, 0
+#define UNION_FUN(v) 0, 0, 0, 0, v, 0, 0
+#define UNION_DEF(v) 0, 0, 0, 0, 0, v, 0
+#define UNION_LST(v) 0, 0, 0, 0, 0, 0, &v
+
+#else
+
+ typedef void *ParseType;
+
+#define ParseUnionPtr ParseUnion *
+#define ParseUnionOf(tbl) (ParseUnionPtr)(&(tbl->value))
+#define ParseData ParseType value
+
+#define UNION_ADD(v) (ParseType)&(v)
+#define UNION_SET(v) (ParseType)&(v)
+#define UNION_INT(v) (ParseType)&(v)
+#define UNION_STR(v) (ParseType)&(v)
+#define UNION_ENV(v) (ParseType) (v)
+#define UNION_FUN(v) (ParseType) (v)
+#define UNION_DEF(v) (ParseType) (v)
+#define UNION_LST(v) (ParseType)&(v)
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* LYSTRUCTS_H */
diff --git a/src/LYStyle.c b/src/LYStyle.c
new file mode 100644
index 0000000..77be188
--- /dev/null
+++ b/src/LYStyle.c
@@ -0,0 +1,970 @@
+/*
+ * $LynxId: LYStyle.c,v 1.111 2021/06/09 22:00:35 tom Exp $
+ *
+ * character level styles for Lynx
+ * (c) 1996 Rob Partington -- donated to the Lyncei (if they want it :-)
+ */
+#include <HTUtils.h>
+#include <HTML.h>
+#include <LYGlobalDefs.h>
+
+#include <LYStructs.h>
+#include <LYReadCFG.h>
+#include <LYCurses.h>
+#include <LYCharUtils.h>
+#include <LYUtils.h> /* defines TABLESIZE */
+#include <AttrList.h>
+#include <SGML.h>
+#include <HTMLDTD.h>
+
+/* Hash table definitions */
+#include <LYHash.h>
+#include <LYStyle.h>
+
+#include <LYOptions.h>
+#include <LYPrettySrc.h>
+
+#include <LYexit.h>
+#include <LYLeaks.h>
+#include <LYStrings.h>
+#include <LYHash.h>
+
+#define CTRACE1(p) CTRACE2(TRACE_CFG || TRACE_STYLE, p)
+
+#ifdef USE_COLOR_STYLE
+
+static HTList *list_of_lss_files;
+
+/* because curses isn't started when we parse the config file, we
+ * need to remember the STYLE: lines we encounter and parse them
+ * after curses has started
+ */
+static HTList *lss_styles = NULL;
+
+#define CACHEW 128
+#define CACHEH 64
+
+static unsigned *cached_styles_ptr = NULL;
+static int cached_styles_rows = 0;
+static int cached_styles_cols = 0;
+static BOOL empty_lss_list = FALSE; /* true if list explicitly emptied */
+
+/* stack of attributes during page rendering */
+int last_styles[MAX_LAST_STYLES + 1] =
+{0};
+int last_colorattr_ptr = 0;
+
+bucket hashStyles[CSHASHSIZE];
+
+int cached_tag_styles[HTML_ELEMENTS];
+int current_tag_style;
+BOOL force_current_tag_style = FALSE;
+char *forced_classname;
+BOOL force_classname;
+
+/* Remember the hash codes for common elements */
+int s_a = NOSTYLE;
+int s_aedit = NOSTYLE;
+int s_aedit_arr = NOSTYLE;
+int s_aedit_pad = NOSTYLE;
+int s_aedit_sel = NOSTYLE;
+int s_alert = NOSTYLE;
+int s_alink = NOSTYLE;
+int s_curedit = NOSTYLE;
+int s_forw_backw = NOSTYLE;
+int s_hot_paste = NOSTYLE;
+int s_menu_active = NOSTYLE;
+int s_menu_bg = NOSTYLE;
+int s_menu_entry = NOSTYLE;
+int s_menu_frame = NOSTYLE;
+int s_menu_number = NOSTYLE;
+int s_menu_sb = NOSTYLE;
+int s_normal = NOSTYLE;
+int s_prompt_edit = NOSTYLE;
+int s_prompt_edit_arr = NOSTYLE;
+int s_prompt_edit_pad = NOSTYLE;
+int s_prompt_sel = NOSTYLE;
+int s_status = NOSTYLE;
+int s_title = NOSTYLE;
+int s_whereis = NOSTYLE;
+
+#ifdef USE_SCROLLBAR
+int s_sb_aa = NOSTYLE;
+int s_sb_bar = NOSTYLE;
+int s_sb_bg = NOSTYLE;
+int s_sb_naa = NOSTYLE;
+#endif
+
+/* start somewhere safe */
+#define MAX_COLOR 16
+static int colorPairs = 0;
+
+#ifdef USE_BLINK
+# define MAX_BLINK 2
+# define M_BLINK A_BLINK
+#else
+# define MAX_BLINK 1
+# define M_BLINK 0
+#endif
+
+#define MAX_PAIR 255 /* because our_pairs[] type is unsigned-char */
+static unsigned char our_pairs[2]
+[MAX_BLINK]
+[MAX_COLOR + 1]
+[MAX_COLOR + 1];
+
+static void style_initialiseHashTable(void);
+
+static bucket *new_bucket(const char *name)
+{
+ bucket *result = typecalloc(bucket);
+
+ if (!result)
+ outofmem(__FILE__, "new_bucket");
+ StrAllocCopy(result->name, name);
+ return result;
+}
+
+bucket *nostyle_bucket(void)
+{
+ return new_bucket("<NOSTYLE>");
+}
+
+static char *TrimLowercase(char *buffer)
+{
+ LYRemoveBlanks(buffer);
+ strtolower(buffer);
+ return buffer;
+}
+
+/*
+ * Parse a string containing a combination of video attributes and color.
+ */
+static void parse_either(const char *attrs,
+ int dft_color,
+ int *monop,
+ int *colorp)
+{
+ int value;
+ char *temp_attrs = NULL;
+
+ if (StrAllocCopy(temp_attrs, attrs) != NULL) {
+ char *to_free = temp_attrs;
+
+ while (*temp_attrs != '\0') {
+ char *next = StrChr(temp_attrs, '+');
+ char save = (char) ((next != NULL) ? *next : '\0');
+
+ if (next == NULL)
+ next = temp_attrs + strlen(temp_attrs);
+
+ if (save != 0)
+ *next = '\0';
+ if ((value = string_to_attr(temp_attrs)) != 0)
+ *monop |= value;
+ else if (colorp != 0
+ && (value = check_color(temp_attrs, dft_color)) != ERR_COLOR)
+ *colorp = value;
+
+ temp_attrs = next;
+ if (save != '\0')
+ *temp_attrs++ = save;
+ }
+ FREE(to_free);
+ }
+}
+
+/* icky parsing of the style options */
+static void parse_attributes(const char *mono,
+ const char *fg,
+ const char *bg,
+ int style,
+ const char *element)
+{
+ int mA = A_NORMAL;
+ int fA = default_fg;
+ int bA = default_bg;
+ int cA = A_NORMAL;
+ int newstyle = color_style_1(element);
+ int colored_attr;
+
+ CTRACE2(TRACE_STYLE, (tfp, "CSS(PA):style d=%d / h=%d, e=%s\n",
+ style, newstyle, element));
+
+ parse_either(mono, ERR_COLOR, &mA, (int *) 0);
+ parse_either(bg, default_bg, &cA, &bA);
+ parse_either(fg, default_fg, &cA, &fA);
+
+ if (style == -1) { /* default */
+ CTRACE2(TRACE_STYLE, (tfp, "CSS(DEF):default_fg=%d, default_bg=%d\n",
+ fA, bA));
+ default_fg = fA;
+ default_bg = bA;
+ default_color_reset = TRUE;
+ return;
+ }
+ if (fA == NO_COLOR) {
+ bA = NO_COLOR;
+ } else if (COLORS) {
+#ifdef USE_BLINK
+ if (term_blink_is_boldbg) {
+ if (fA >= COLORS)
+ cA = A_BOLD;
+ if (bA >= COLORS)
+ cA |= M_BLINK;
+ } else
+#endif
+ if (fA >= COLORS || bA >= COLORS)
+ cA = A_BOLD;
+ if (fA >= COLORS)
+ fA %= COLORS;
+ if (bA >= COLORS)
+ bA %= COLORS;
+ } else {
+ cA = A_BOLD;
+ fA = NO_COLOR;
+ bA = NO_COLOR;
+ }
+
+ /*
+ * If we have colour, and space to create a new colour attribute,
+ * and we have a valid colour description, then add this style
+ */
+ if (lynx_has_color && colorPairs < COLOR_PAIRS - 1 && fA != NO_COLOR) {
+ int curPair = 0;
+ int iFg = (1 + (fA >= 0 ? fA : 0));
+ int iBg = (1 + (bA >= 0 ? bA : 0));
+ int iBold = !!((unsigned) cA & A_BOLD);
+ int iBlink = !!((unsigned) cA & M_BLINK);
+
+ CTRACE2(TRACE_STYLE, (tfp, "parse_attributes %d/%d %d/%d %#x\n",
+ fA, default_fg, bA, default_bg, (unsigned) cA));
+ if (fA < MAX_COLOR
+ && bA < MAX_COLOR
+#ifdef USE_CURSES_PAIR_0
+ && (cA != A_NORMAL || fA != default_fg || bA != default_bg)
+#endif
+ && curPair < MAX_PAIR) {
+ if (our_pairs[iBold][iBlink][iFg][iBg] != 0) {
+ curPair = our_pairs[iBold][iBlink][iFg][iBg];
+ } else {
+ curPair = ++colorPairs;
+ init_pair((short) curPair, (short) fA, (short) bA);
+ our_pairs[iBold][iBlink][iFg][iBg] = UCH(curPair);
+ }
+ }
+ CTRACE2(TRACE_STYLE, (tfp, "CSS(CURPAIR):%d\n", curPair));
+ colored_attr = ((int) COLOR_PAIR(curPair)) | ((int) cA);
+ if (style < DSTYLE_ELEMENTS)
+ setStyle(style, colored_attr, cA, mA);
+ setHashStyle(newstyle, colored_attr, cA, mA, element);
+ } else {
+ if (lynx_has_color && fA != NO_COLOR) {
+ CTRACE2(TRACE_STYLE,
+ (tfp, "CSS(NC): maximum of %d colorpairs exhausted\n",
+ COLOR_PAIRS - 1));
+ }
+ /* only mono is set */
+ if (style < DSTYLE_ELEMENTS)
+ setStyle(style, -1, -1, mA);
+ setHashStyle(newstyle, -1, -1, mA, element);
+ }
+}
+
+/* parse a style option of the format
+ * STYLE:<OBJECT>:FG:BG
+ */
+static void parse_style(char *param)
+{
+ /* *INDENT-OFF* */
+ static struct {
+ const char *name;
+ int style;
+ int *set_hash;
+ } table[] = {
+ { "default", -1, 0 }, /* default fg/bg */
+ { "alink", DSTYLE_ALINK, 0 }, /* active link */
+ { "a", DSTYLE_LINK, 0 }, /* normal link */
+ { "a", HTML_A, 0 }, /* normal link */
+ { "status", DSTYLE_STATUS, 0 }, /* status bar */
+ { "label", DSTYLE_OPTION, 0 }, /* [INLINE]'s */
+ { "value", DSTYLE_VALUE, 0 }, /* [INLINE]'s */
+ { "normal", DSTYLE_NORMAL, 0 },
+ { "candy", DSTYLE_CANDY, 0 }, /* [INLINE]'s */
+ { "whereis", DSTYLE_WHEREIS, &s_whereis },
+ { "edit.active.pad", DSTYLE_ELEMENTS, &s_aedit_pad },
+ { "edit.active.arrow", DSTYLE_ELEMENTS, &s_aedit_arr },
+ { "edit.active.marked", DSTYLE_ELEMENTS, &s_aedit_sel },
+ { "edit.active", DSTYLE_ELEMENTS, &s_aedit },
+ { "edit.current", DSTYLE_ELEMENTS, &s_curedit },
+ { "edit.prompt.pad", DSTYLE_ELEMENTS, &s_prompt_edit_pad },
+ { "edit.prompt.arrow", DSTYLE_ELEMENTS, &s_prompt_edit_arr },
+ { "edit.prompt.marked", DSTYLE_ELEMENTS, &s_prompt_sel },
+ { "edit.prompt", DSTYLE_ELEMENTS, &s_prompt_edit },
+ { "forwbackw.arrow", DSTYLE_ELEMENTS, &s_forw_backw },
+ { "hot.paste", DSTYLE_ELEMENTS, &s_hot_paste },
+ { "menu.frame", DSTYLE_ELEMENTS, &s_menu_frame },
+ { "menu.bg", DSTYLE_ELEMENTS, &s_menu_bg },
+ { "menu.n", DSTYLE_ELEMENTS, &s_menu_number },
+ { "menu.entry", DSTYLE_ELEMENTS, &s_menu_entry },
+ { "menu.active", DSTYLE_ELEMENTS, &s_menu_active },
+ { "menu.sb", DSTYLE_ELEMENTS, &s_menu_sb },
+ };
+ /* *INDENT-ON* */
+
+ unsigned n;
+ BOOL found = FALSE;
+
+ char *buffer = 0;
+ char *tmp = 0;
+ char *element, *mono;
+ const char *fg, *bg;
+
+ if (param == 0)
+ return;
+ CTRACE2(TRACE_STYLE, (tfp, "parse_style(%s)\n", param));
+ StrAllocCopy(buffer, param);
+ if (buffer == 0)
+ return;
+
+ TrimLowercase(buffer);
+ if ((tmp = StrChr(buffer, ':')) == 0) {
+ fprintf(stderr, gettext("\
+Syntax Error parsing style in lss file:\n\
+[%s]\n\
+The line must be of the form:\n\
+OBJECT:MONO:COLOR (ie em:bold:brightblue:white)\n\
+where OBJECT is one of EM,STRONG,B,I,U,BLINK etc.\n\n"), buffer);
+ exit_immediately(EXIT_FAILURE);
+ }
+ *tmp = '\0';
+ element = buffer;
+
+ mono = tmp + 1;
+ tmp = StrChr(mono, ':');
+
+ if (!tmp) {
+ fg = "nocolor";
+ bg = "nocolor";
+ } else {
+ *tmp = '\0';
+ fg = tmp + 1;
+ tmp = StrChr(fg, ':');
+ if (!tmp)
+ bg = "default";
+ else {
+ *tmp = '\0';
+ bg = tmp + 1;
+ }
+ }
+
+ CTRACE2(TRACE_STYLE, (tfp, "CSSPARSE:%s => %d %s\n",
+ element, color_style_1(element),
+ (hashStyles[color_style_1(element)].used)
+ ? "used"
+ : ""));
+
+ /*
+ * We use some pseudo-elements, so catch these first
+ */
+ for (n = 0; n < TABLESIZE(table); n++) {
+ if (!strcasecomp(element, table[n].name)) {
+ parse_attributes(mono, fg, bg, table[n].style, table[n].name);
+ if (table[n].set_hash != 0)
+ *(table[n].set_hash) = color_style_1(table[n].name);
+ found = TRUE;
+ break;
+ }
+ }
+
+ if (found) {
+ if (!strcasecomp(element, "normal")) {
+ /* added - kw */
+ parse_attributes(mono, fg, bg, DSTYLE_NORMAL, "html");
+ s_normal = color_style_1("html"); /* rather bizarre... - kw */
+
+ LYnormalColor();
+ }
+ } else {
+ /* It must be a HTML element, so look through the list until we find it. */
+ int element_number = -1;
+ HTTag *t = SGMLFindTag(&HTML_dtd, element);
+
+ if (t && t->name) {
+ element_number = (int) (t - HTML_dtd.tags);
+ }
+ if (element_number >= HTML_A &&
+ element_number < HTML_ELEMENTS) {
+ parse_attributes(mono, fg, bg, element_number + STARTAT, element);
+ } else {
+ parse_attributes(mono, fg, bg, DSTYLE_ELEMENTS, element);
+ }
+ }
+ FREE(buffer);
+}
+
+static void style_deleteStyleList(void)
+{
+ LYFreeStringList(lss_styles);
+ lss_styles = NULL;
+}
+
+static void free_lss_list(void)
+{
+ LSS_NAMES *obj;
+
+ while ((obj = HTList_objectAt(list_of_lss_files, 0)) != 0) {
+ FREE(obj->given);
+ FREE(obj->actual);
+ FREE(obj);
+ if (!HTList_removeObject(list_of_lss_files, obj)) {
+ break;
+ }
+ }
+ HTList_delete(list_of_lss_files);
+}
+
+static void free_colorstylestuff(void)
+{
+ if (TRACE_STYLE) {
+ report_hashStyles();
+ }
+ style_initialiseHashTable();
+ free_hashStyles();
+ style_deleteStyleList();
+ memset(our_pairs, 0, sizeof(our_pairs));
+ FreeCachedStyles();
+}
+
+/* Set all the buckets in the hash table to be empty */
+static void style_initialiseHashTable(void)
+{
+ int i;
+ static BOOL firsttime = TRUE;
+
+ for (i = 0; i < CSHASHSIZE; i++) {
+ hashStyles[i].used = FALSE;
+ }
+ if (firsttime) {
+ firsttime = FALSE;
+#ifdef LY_FIND_LEAKS
+ atexit(free_colorstylestuff);
+ atexit(free_colorstyle_leaks);
+#endif
+ }
+ s_alink = color_style_1("alink");
+ s_a = color_style_1("a");
+ s_status = color_style_1("status");
+ s_alert = color_style_1("alert");
+ s_title = color_style_1("title");
+#ifdef USE_SCROLLBAR
+ s_sb_bar = color_style_1("scroll.bar");
+ s_sb_bg = color_style_1("scroll.back");
+ s_sb_aa = color_style_1("scroll.arrow");
+ s_sb_naa = color_style_1("scroll.noarrow");
+#endif
+}
+
+/*
+ * Initialise the default style sheet to match the vanilla-curses lynx.
+ */
+static void initialise_default_stylesheet(void)
+{
+ /* Use the data setup in USE_COLOR_TABLE */
+ /* *INDENT-OFF* */
+ static const struct {
+ int color; /* index into lynx_color_pairs[] */
+ const char *type;
+ } table2[] = {
+ /*
+ * non-color-style colors encode bold/reverse/underline as a 0-7
+ * index like this:
+ * b,r,u 0
+ * b,r,U 1
+ * b,R,u 2
+ * b,R,U 3
+ * B,r,u 4
+ * B,r,U 5
+ * B,R,u 6
+ * B,R,U 7
+ */
+ { 0, "normal" },
+ { 1, "a" },
+ { 2, "status" },
+ { 4, "b" },
+ { 4, "blink" },
+ { 4, "cite" },
+ { 4, "del" },
+ { 4, "em" },
+ { 4, "i" },
+ { 4, "ins" },
+ { 4, "strike" },
+ { 4, "strong" },
+ { 4, "u" },
+ { 5, "input" },
+ { 6, "alink" },
+ { 7, "whereis" },
+#ifdef USE_PRETTYSRC
+ /* FIXME: HTL_tagspecs_defaults[] has similar info */
+ { 4, "span.htmlsrc_comment" },
+ { 4, "span.htmlsrc_tag" },
+ { 4, "span.htmlsrc_attrib" },
+ { 4, "span.htmlsrc_attrval" },
+ { 4, "span.htmlsrc_abracket" },
+ { 4, "span.htmlsrc_entity" },
+ { 4, "span.htmlsrc_href" },
+ { 4, "span.htmlsrc_entire" },
+ { 4, "span.htmlsrc_badseq" },
+ { 4, "span.htmlsrc_badtag" },
+ { 4, "span.htmlsrc_badattr" },
+ { 4, "span.htmlsrc_sgmlspecial" },
+#endif
+ };
+ /* *INDENT-ON* */
+
+ unsigned n;
+ char *normal = LYgetTableString(0);
+ char *strong = LYgetTableString(4);
+
+ CTRACE1((tfp, "initialise_default_stylesheet\n"));
+
+ /*
+ * For debugging this function, create hash codes for all of the tags.
+ * That makes it simpler to find the cases that are overlooked in the
+ * table.
+ */
+ for (n = 0; n < (unsigned) HTML_dtd.number_of_tags; ++n) {
+ char *name = 0;
+
+ HTSprintf0(&name, "%s:%s", HTML_dtd.tags[n].name, normal);
+ parse_style(name);
+ FREE(name);
+ }
+
+ for (n = 0; n < TABLESIZE(table2); ++n) {
+ int code = table2[n].color;
+ char *name = 0;
+ char *value = 0;
+
+ switch (code) {
+ case 0:
+ value = normal;
+ break;
+ case 4:
+ value = strong;
+ break;
+ default:
+ value = LYgetTableString(code);
+ break;
+ }
+ HTSprintf0(&name, "%s:%s", table2[n].type, value);
+ parse_style(name);
+ FREE(name);
+ if (value != normal && value != strong && value != 0)
+ free(value);
+ }
+ FREE(normal);
+ FREE(strong);
+}
+
+void parse_userstyles(void)
+{
+ char *name;
+ HTList *cur = LYuse_color_style ? lss_styles : 0;
+
+ colorPairs = 0;
+ style_initialiseHashTable();
+
+ if (HTList_isEmpty(cur)) {
+ initialise_default_stylesheet();
+ } else {
+ while ((name = (char *) HTList_nextObject(cur)) != NULL) {
+ CTRACE2(TRACE_STYLE, (tfp, "LSS:%s\n",
+ (name
+ ? name
+ : "!?! empty !?!")));
+ if (name != NULL)
+ parse_style(name);
+ }
+ }
+
+#define dft_style(a,b) if (a == NOSTYLE) a = b
+ /* *INDENT-OFF* */
+ dft_style(s_prompt_edit, s_normal);
+ dft_style(s_prompt_edit_arr, s_prompt_edit);
+ dft_style(s_prompt_edit_pad, s_prompt_edit);
+ dft_style(s_prompt_sel, s_prompt_edit);
+ dft_style(s_aedit, s_alink);
+ dft_style(s_aedit_arr, s_aedit);
+ dft_style(s_aedit_pad, s_aedit);
+ dft_style(s_curedit, s_aedit);
+ dft_style(s_aedit_sel, s_aedit);
+ dft_style(s_menu_bg, s_normal);
+ dft_style(s_menu_entry, s_menu_bg);
+ dft_style(s_menu_frame, s_menu_bg);
+ dft_style(s_menu_number, s_menu_bg);
+ dft_style(s_menu_active, s_alink);
+ /* *INDENT-ON* */
+
+}
+
+/* Add a STYLE: option line to our list. Process "default:" early
+ * for it to have the same semantic as other lines: works at any place
+ * of the style file, the first line overrides the later ones.
+ */
+static void HStyle_addStyle(char *buffer)
+{
+ char *name = NULL;
+
+ CTRACE1((tfp, "HStyle_addStyle(%s)\n", buffer));
+
+ StrAllocCopy(name, buffer);
+ TrimLowercase(name);
+
+ if (lss_styles == NULL)
+ lss_styles = HTList_new();
+
+ if (!strncasecomp(name, "default:", 8)) {
+ /* default fg/bg */
+ CTRACE2(TRACE_STYLE, (tfp, "READCSS.default%s:%s\n",
+ (default_color_reset ? ".ignore" : ""),
+ name ? name : "!?! empty !?!"));
+ if (!default_color_reset)
+ parse_style(name);
+ FREE(name);
+ return; /* do not need to process it again */
+ }
+ CTRACE2(TRACE_STYLE, (tfp, "READCSS:%s\n", name ? name : "!?! empty !?!"));
+ HTList_addObject(lss_styles, name);
+}
+
+static int style_readFromFileREC(char *lss_filename,
+ char *parent_filename)
+{
+ FILE *fh;
+ char *buffer = NULL;
+
+ CTRACE2(TRACE_STYLE, (tfp, "CSS:Reading styles from file: %s\n",
+ lss_filename ? lss_filename : "?!? empty ?!?"));
+ if (isEmpty(lss_filename))
+ return -1;
+ if ((fh = LYOpenCFG(lss_filename, parent_filename, LYNX_LSS_FILE)) == 0) {
+ /* this should probably be an alert or something */
+ CTRACE2(TRACE_STYLE, (tfp,
+ "CSS:Can't open style file '%s', using defaults\n", lss_filename));
+ return -1;
+ }
+
+ if (parent_filename == 0) {
+ free_colorstylestuff();
+ }
+
+ while (LYSafeGets(&buffer, fh) != NULL) {
+ LYTrimTrailing(buffer);
+ LYTrimTail(buffer);
+ LYTrimHead(buffer);
+ if (!strncasecomp(buffer, "include:", 8))
+ style_readFromFileREC(LYSkipBlanks(buffer + 8), lss_filename);
+ else if (buffer[0] != '#' && strlen(buffer) != 0)
+ HStyle_addStyle(buffer);
+ }
+
+ LYCloseInput(fh);
+ if ((parent_filename == 0) && LYCursesON)
+ parse_userstyles();
+ return 0;
+}
+
+int style_readFromFile(char *filename)
+{
+ return style_readFromFileREC(filename, (char *) 0);
+}
+
+/* Used in HTStructured methods: - kw */
+
+void TrimColorClass(const char *tagname,
+ char *styleclassname,
+ int *phcode)
+{
+ char *end, *start = NULL, *lookfrom;
+ char tmp[64];
+
+ sprintf(tmp, ";%.*s", (int) sizeof(tmp) - 3, tagname);
+ TrimLowercase(tmp);
+
+ if ((lookfrom = styleclassname) != 0) {
+ do {
+ end = start;
+ start = strstr(lookfrom, tmp);
+ if (start)
+ lookfrom = start + 1;
+ }
+ while (start);
+ /* trim the last matching element off the end
+ * - should match classes here as well (rp)
+ */
+ if (end)
+ *end = '\0';
+ }
+ *phcode = color_style_1(lookfrom && *lookfrom ? lookfrom : &tmp[1]);
+}
+
+/* This function is designed as faster analog to TrimColorClass.
+ * It assumes that tag_name is present in stylename! -HV
+ */
+void FastTrimColorClass(const char *tag_name,
+ unsigned name_len,
+ char *stylename,
+ char **pstylename_end, /*will be modified */
+ int *phcode) /*will be modified */
+{
+ char *tag_start = *pstylename_end;
+ BOOLEAN found = FALSE;
+
+ CTRACE2(TRACE_STYLE,
+ (tfp, "STYLE.fast-trim: [%s] from [%s]: ",
+ tag_name, stylename));
+ while (tag_start >= stylename) {
+ for (; (tag_start >= stylename) && (*tag_start != ';'); --tag_start) ;
+ if (!strncasecomp(tag_start + 1, tag_name, (int) name_len)) {
+ found = TRUE;
+ break;
+ }
+ --tag_start;
+ }
+ if (found) {
+ *tag_start = '\0';
+ *pstylename_end = tag_start;
+ }
+ CTRACE2(TRACE_STYLE, (tfp, found ? "success.\n" : "failed.\n"));
+ *phcode = color_style_1(tag_start + 1);
+}
+
+/* This is called each time lss styles are read. It will fill
+ * each element of 'cached_tag_styles' -HV
+ */
+void cache_tag_styles(void)
+{
+ int i;
+
+ for (i = 0; i < HTML_ELEMENTS; ++i) {
+ cached_tag_styles[i] = color_style_1(HTML_dtd.tags[i].name);
+ }
+}
+
+#define SIZEOF_CACHED_STYLES (unsigned) (cached_styles_rows * cached_styles_cols)
+
+static unsigned *RefCachedStyle(int y, int x)
+{
+ unsigned *result = 0;
+
+ if (cached_styles_ptr == 0) {
+ cached_styles_rows = display_lines;
+ cached_styles_cols = LYcols;
+ cached_styles_ptr = typecallocn(unsigned, SIZEOF_CACHED_STYLES);
+ }
+ if (y >= 0 &&
+ x >= 0 &&
+ y < cached_styles_rows &&
+ x < cached_styles_cols) {
+ result = cached_styles_ptr + (y * cached_styles_cols) + x;
+ }
+ return result;
+}
+
+BOOL ValidCachedStyle(int y, int x)
+{
+ return (BOOL) (RefCachedStyle(y, x) != 0);
+}
+
+unsigned GetCachedStyle(int y, int x)
+{
+ unsigned value = 0;
+ unsigned *cache = RefCachedStyle(y, x);
+
+ if (cache != 0) {
+ value = *cache;
+ }
+ return value;
+}
+
+void SetCachedStyle(int y, int x, unsigned value)
+{
+ unsigned *cache = RefCachedStyle(y, x);
+
+ if (cache != 0) {
+ *cache = value;
+ }
+}
+
+void ResetCachedStyles(void)
+{
+ if (cached_styles_ptr != NULL) {
+ memset(cached_styles_ptr, 0, sizeof(unsigned) * SIZEOF_CACHED_STYLES);
+ }
+}
+
+void FreeCachedStyles(void)
+{
+ if (cached_styles_ptr != NULL) {
+ FREE(cached_styles_ptr);
+ cached_styles_rows = 0;
+ cached_styles_cols = 0;
+ }
+}
+
+/*
+ * Recompute the pairs associated with the color style.
+ */
+void update_color_style(void)
+{
+ CTRACE((tfp, "update_color_style %p\n", (void *) lss_styles));
+ memset(our_pairs, 0, sizeof(our_pairs));
+ parse_userstyles();
+}
+
+static char *find_lss_file(const char *nominal)
+{
+ return LYFindConfigFile(nominal, LYNX_LSS_FILE);
+}
+
+void clear_lss_list(void)
+{
+ CTRACE((tfp, "clear_lss_list()\n"));
+ free_lss_list();
+ empty_lss_list = TRUE;
+}
+
+/*
+ * Add an entry to the lss-list, and cache the resolved filename if known.
+ */
+void add_to_lss_list(const char *source, const char *resolved)
+{
+ LSS_NAMES *obj;
+ LSS_NAMES *chk;
+ BOOLEAN found = FALSE;
+ int position = 0;
+
+#ifdef LY_FIND_LEAKS
+ atexit(free_colorstyle_leaks);
+#endif
+
+ CTRACE((tfp, "add_to_lss_list(\"%s\", \"%s\")\n",
+ NonNull(source),
+ NonNull(resolved)));
+
+ if (list_of_lss_files == 0) {
+ list_of_lss_files = HTList_new();
+ }
+
+ while ((chk = HTList_objectAt(list_of_lss_files, position++)) != 0) {
+ if (!strcmp(source, chk->given)) {
+ found = TRUE;
+ if (resolved && !chk->actual) {
+ StrAllocCopy(chk->actual, resolved);
+ }
+ break;
+ }
+ }
+
+ if (!found) {
+ obj = typecalloc(LSS_NAMES);
+ if (obj == NULL)
+ outofmem(__FILE__, "add_to_lss_list");
+
+ StrAllocCopy(obj->given, source);
+ StrAllocCopy(obj->actual, resolved);
+ HTList_appendObject(list_of_lss_files, obj);
+ empty_lss_list = FALSE;
+ }
+}
+
+/*
+ * This is called after reading lynx.cfg, to set the initial value for the
+ * lss-file, and read its data.
+ */
+void init_color_styles(char **from_cmdline, const char *default_styles)
+{
+ char *user_lss_file = *from_cmdline;
+ char *cp;
+
+ /*
+ * If a command-line "-lss" option was given, or if an environment variable
+ * is found, use that in preference to data from lynx.cfg
+ */
+ if (user_lss_file == 0)
+ user_lss_file = LYGetEnv("LYNX_LSS");
+ if (user_lss_file == 0)
+ user_lss_file = LYGetEnv("lynx_lss");
+ if (user_lss_file != 0)
+ empty_lss_list = (*user_lss_file == '\0');
+
+ /*
+ * If the color-style is explicitly emptied, go no further.
+ */
+ if (empty_lss_list) {
+ CTRACE((tfp, "init_color_styles: overridden/empty\n"));
+ return;
+ } else if (list_of_lss_files == 0) {
+ char *source = 0;
+ char *config;
+
+ StrAllocCopy(source, default_styles);
+ config = source;
+ while ((cp = LYstrsep(&config, ";")) != 0) {
+ char *target;
+
+ target = find_lss_file(LYPathLeaf(cp));
+ if (target != 0) {
+ add_to_lss_list(cp, target);
+ FREE(target);
+ }
+ }
+ FREE(source);
+ }
+
+ if (user_lss_file != 0) {
+ FREE(lynx_lss_file);
+ lynx_lss_file = find_lss_file(cp = user_lss_file);
+ *from_cmdline = 0;
+ } else {
+ lynx_lss_file = find_lss_file(cp = DeConst(LYNX_LSS_FILE));
+ }
+ CTRACE1((tfp, "init_color_styles(%s)\n", NonNull(lynx_lss_file)));
+
+ if (isEmpty(lynx_lss_file))
+ return;
+ /*
+ * If the lynx-style file is not available, inform the user and exit.
+ */
+ if (!LYCanReadFile(lynx_lss_file)) {
+ fprintf(stderr, gettext("\nLynx file \"%s\" is not available.\n\n"),
+ NonNull(cp));
+ exit_immediately(EXIT_FAILURE);
+ }
+
+ /*
+ * Otherwise, load the initial lss-file and add it to the list for the
+ * options menu.
+ */
+ style_readFromFile(lynx_lss_file);
+ add_to_lss_list(LYPathLeaf(lynx_lss_file), lynx_lss_file);
+#ifndef NO_OPTION_FORMS
+ build_lss_enum(list_of_lss_files);
+#endif
+}
+
+void reinit_color_styles(void)
+{
+#ifdef USE_PRETTYSRC
+ int cs;
+
+ for (cs = 0; cs < HTL_num_lexemes; ++cs) {
+ html_src_clean_item((HTlexeme) cs);
+ }
+#endif
+ free_colorstylestuff();
+ style_readFromFile(lynx_lss_file);
+}
+
+#endif /* USE_COLOR_STYLE */
diff --git a/src/LYStyle.h b/src/LYStyle.h
new file mode 100644
index 0000000..a7e5e81
--- /dev/null
+++ b/src/LYStyle.h
@@ -0,0 +1,88 @@
+/* $LynxId: LYStyle.h,v 1.20 2020/01/21 21:35:25 tom Exp $ */
+#ifndef LYSTYLE_H
+#define LYSTYLE_H
+
+#include <HTUtils.h>
+
+#ifdef USE_COLOR_STYLE
+
+#include <AttrList.h>
+#include <HTMLDTD.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ typedef struct {
+ char *given;
+ char *actual;
+ } LSS_NAMES;
+
+ /* list of elements */ extern const SGML_dtd HTML_dtd;
+
+ /* array of currently set styles */
+ extern HTCharStyle displayStyles[DSTYLE_ELEMENTS];
+
+ /* Set all the buckets in the hash table to be empty */
+ extern void parse_userstyles(void);
+
+ extern void style_defaultStyleSheet(void);
+
+ extern int style_readFromFile(char *file);
+
+ extern void TrimColorClass(const char *tagname,
+ char *styleclassname,
+ int *phcode);
+
+ /* This is an array of styles for tags that don't specify 'class' - the
+ * values from that array will be suggested by SGML.c by setting the
+ * following variable. A value of -1 means that the style value should be
+ * calculated honestly -HV
+ */
+ extern int cached_tag_styles[HTML_ELEMENTS];
+
+ /* The style for current tag is suggested in current_tag_style. If
+ * force_current_tag_style =TRUE, then no attempts to calculate the color
+ * style for current tag should be made - the value of 'current_tag_style'
+ * must be used.
+ */
+ extern int current_tag_style;
+ extern BOOL force_current_tag_style;
+
+ extern BOOL force_classname;
+
+ /* If force_current_tag_style =TRUE, then here will be the classname (this
+ * is done to avoid copying the class name to the buffer class_name.
+ */
+ extern char *forced_classname;
+
+ /* This is called each time lss styles are read. It will fill each element
+ * of 'cached_tag_styles' -HV
+ */
+ extern void cache_tag_styles(void);
+
+ /* use this for reading the end of string found during last invocation of
+ * TrimColorClass.
+ */
+ extern void FastTrimColorClass(const char *tag_name,
+ unsigned name_len,
+ char *stylename,
+ char **pstylename_end,
+ int *hcode);
+
+ /*
+ * Functions for cached-styles
+ */
+ extern BOOL ValidCachedStyle(int y, int x);
+ extern unsigned GetCachedStyle(int y, int x);
+ extern void FreeCachedStyles(void);
+ extern void ResetCachedStyles(void);
+ extern void SetCachedStyle(int y, int x, unsigned value);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* USE_COLOR_STYLE */
+extern int lynx_has_color;
+
+#endif /* LYSTYLE_H */
diff --git a/src/LYTraversal.c b/src/LYTraversal.c
new file mode 100644
index 0000000..2aa95fa
--- /dev/null
+++ b/src/LYTraversal.c
@@ -0,0 +1,182 @@
+/*
+ * $LynxId: LYTraversal.c,v 1.30 2010/09/24 22:57:01 tom Exp $
+ */
+#include <HTUtils.h>
+#include <LYGlobalDefs.h>
+#include <LYUtils.h>
+#include <LYClean.h>
+#include <LYCurses.h>
+#include <LYStrings.h>
+#include <LYTraversal.h>
+
+#include <LYexit.h>
+#include <LYLeaks.h>
+
+/* routines to handle special traversal feature */
+
+static void final_perror(const char *msg, int clean_flag)
+{
+ int saved_errno = errno;
+
+ if (LYCursesON) {
+ if (clean_flag)
+ cleanup();
+ else
+ stop_curses();
+ }
+ set_errno(saved_errno);
+ perror(msg);
+}
+
+static void exit_with_perror(const char *msg)
+{
+ final_perror(msg, TRUE);
+ exit_immediately(EXIT_FAILURE);
+}
+
+BOOLEAN lookup_link(char *target)
+{
+ FILE *ifp;
+ char *buffer = NULL;
+ char *line = NULL;
+ int result = FALSE;
+
+ if ((ifp = fopen(TRAVERSE_FILE, TXT_R)) == NULL) {
+ if ((ifp = LYNewTxtFile(TRAVERSE_FILE)) == NULL) {
+ exit_with_perror(CANNOT_OPEN_TRAV_FILE);
+ } else {
+ LYCloseOutput(ifp);
+ return (FALSE);
+ }
+ }
+
+ HTSprintf0(&line, "%s\n", target);
+
+ while (LYSafeGets(&buffer, ifp) != NULL) {
+ if (STREQ(line, buffer)) {
+ result = TRUE;
+ break;
+ }
+ } /* end while */
+ FREE(line);
+ FREE(buffer);
+
+ LYCloseInput(ifp);
+ return (BOOL) (result);
+}
+
+void add_to_table(char *target)
+{
+
+ FILE *ifp;
+
+ if ((ifp = LYAppendToTxtFile(TRAVERSE_FILE)) == NULL) {
+ exit_with_perror(CANNOT_OPEN_TRAV_FILE);
+ }
+
+ fprintf(ifp, "%s\n", target);
+
+ LYCloseOutput(ifp);
+}
+
+void add_to_traverse_list(char *fname, char *prev_link_name)
+{
+
+ FILE *ifp;
+
+ if ((ifp = LYAppendToTxtFile(TRAVERSE_FOUND_FILE)) == NULL) {
+ exit_with_perror(CANNOT_OPEN_TRAF_FILE);
+ }
+
+ fprintf(ifp, "%s\t%s\n", fname, prev_link_name);
+
+ LYCloseOutput(ifp);
+}
+
+void dump_traversal_history(void)
+{
+ int x;
+ FILE *ifp;
+
+ if (nhist <= 0)
+ return;
+
+ if ((ifp = LYAppendToTxtFile(TRAVERSE_FILE)) == NULL) {
+ final_perror(CANNOT_OPEN_TRAV_FILE, FALSE);
+ return;
+ }
+
+ fprintf(ifp, "\n\n%s\n\n\t %s\n\n",
+ TRAV_WAS_INTERRUPTED,
+ gettext("here is a list of the history stack so that you may rebuild"));
+
+ for (x = nhist - 1; x >= 0; x--) {
+ fprintf(ifp, "%s\t%s\n", HDOC(x).title, HDOC(x).address);
+ }
+
+ LYCloseOutput(ifp);
+}
+
+void add_to_reject_list(char *target)
+{
+
+ FILE *ifp;
+
+ CTRACE((tfp, "add_to_reject_list(%s)\n", target));
+
+ if ((ifp = LYAppendToTxtFile(TRAVERSE_REJECT_FILE)) == NULL) {
+ exit_with_perror(CANNOT_OPEN_REJ_FILE);
+ }
+
+ fprintf(ifp, "%s\n", target);
+
+ LYCloseOutput(ifp);
+}
+
+/* there need not be a reject file, so if it doesn't open, just return
+ FALSE, meaning "target not in reject file" If the last character in
+ a line in a reject file is "*", then also reject if target matches up to
+ that point in the string
+ Blank lines are ignored
+ Lines that contain just a * are allowed, but since they mean "reject
+ everything" it shouldn't come up much!
+ */
+
+BOOLEAN lookup_reject(char *target)
+{
+ FILE *ifp;
+ char *buffer = NULL;
+ char *line = NULL;
+ size_t len;
+ int result = FALSE;
+
+ if ((ifp = fopen(TRAVERSE_REJECT_FILE, TXT_R)) == NULL) {
+ return (FALSE);
+ }
+
+ HTSprintf0(&line, "%s", target);
+
+ while (LYSafeGets(&buffer, ifp) != NULL && !result) {
+ LYTrimTrailing(buffer);
+ len = strlen(buffer);
+ if (len != 0) { /* if not an empty line */
+ if (buffer[len - 1] == '*') {
+ /* if last char is * and the rest of the chars match */
+ if ((len == 1) || (StrNCmp(line, buffer, len - 1) == 0)) {
+ result = TRUE;
+ }
+ } else {
+ if (STREQ(line, buffer)) {
+ result = TRUE;
+ }
+ }
+ }
+ } /* end while loop over the file */
+ FREE(buffer);
+ FREE(line);
+
+ LYCloseInput(ifp);
+
+ CTRACE((tfp, "lookup_reject(%s) -> %d\n", target, result));
+ return (BOOL) (result);
+}
diff --git a/src/LYTraversal.h b/src/LYTraversal.h
new file mode 100644
index 0000000..8e712e5
--- /dev/null
+++ b/src/LYTraversal.h
@@ -0,0 +1,23 @@
+/* traversal.c function declarations
+*/
+#ifndef TRAVERSAL_H
+#define TRAVERSAL_H
+
+#ifndef HTUTILS_H
+#include <HTUtils.h> /* BOOL, ARGS */
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ extern BOOLEAN lookup_link(char *target);
+ extern void add_to_table(char *target);
+ extern void add_to_traverse_list(char *fname, char *prev_link_name);
+ extern void dump_traversal_history(void);
+ extern void add_to_reject_list(char *target);
+ extern BOOLEAN lookup_reject(char *target);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* TRAVERSAL_H */
diff --git a/src/LYUpload.c b/src/LYUpload.c
new file mode 100644
index 0000000..a83a103
--- /dev/null
+++ b/src/LYUpload.c
@@ -0,0 +1,221 @@
+/*
+ * $LynxId: LYUpload.c,v 1.41 2021/07/29 20:32:26 tom Exp $
+ *
+ * Routines to upload files to the local filesystem.
+ * Created by: Rick Mallett, Carleton University
+ * Report problems to rmallett@ccs.carleton.ca
+ * Modified 15-Dec-95 George Lindholm (lindholm@ucs.ubc.ca):
+ * Reread the upload menu page every time, in case the "upload" directory
+ * has changed (make the current directory that for the upload process).
+ * Prompt for the upload file name if there is no "%s" in the command
+ * string. Most protocols allow the user to specify the file name
+ * from the client side. Xmodem appears to be the only that can't
+ * figure out the filename from the transfer data so it needs the
+ * information from lynx (or an upload script which prompts for it).
+ * On the other hand, zmodem aborts when you give it a filename on
+ * the command line (great way of bypassing the nodotfile code :=( ).
+ */
+
+#include <HTUtils.h>
+#include <HTFile.h>
+#include <HTParse.h>
+#include <HTAlert.h>
+#include <LYCurses.h>
+#include <LYUtils.h>
+#include <LYGlobalDefs.h>
+#include <LYStrings.h>
+#include <LYClean.h>
+#include <LYGetFile.h>
+#include <LYUpload.h>
+#include <LYLocal.h>
+
+#include <LYexit.h>
+#include <LYLeaks.h>
+
+#define SUBDIR_COMMAND "cd %s ; "
+
+/*
+ * LYUpload uploads a file to a given location using a specified upload method.
+ * It parses an incoming link that looks like:
+ * LYNXDIRED://UPLOAD=<#>/TO=<STRING>
+ */
+int LYUpload(char *line)
+{
+ char *method, *directory;
+ int method_number;
+ int count;
+ char *the_upload = 0;
+ char tmpbuf[LY_MAXPATH];
+ char *filename = NULL;
+ lynx_list_item_type *upload_command = 0;
+ char *the_command = 0;
+
+ /*
+ * Use configured upload commands.
+ */
+ if ((directory = LYstrstr(line, "TO=")) == NULL)
+ goto failed;
+ *(directory - 1) = '\0';
+ /* go past "TO=" */
+ directory += 3;
+
+ if ((method = LYstrstr(line, "UPLOAD=")) == NULL)
+ goto failed;
+ /*
+ * Go past "UPLOAD=".
+ */
+ method += 7;
+ method_number = atoi(method);
+
+ for (count = 0, upload_command = uploaders; count < method_number;
+ count++, upload_command = upload_command->next) ; /* null body */
+
+ /*
+ * Parsed out the Method and the Location?
+ */
+ if (upload_command->command == NULL) {
+ HTAlert(gettext("ERROR! - upload command is misconfigured"));
+ goto failed;
+ }
+
+ /*
+ * Care about the local name?
+ */
+ if (HTCountCommandArgs(upload_command->command)) {
+ /*
+ * Commands have the form "command %s [etc]" where %s is the filename.
+ */
+ _statusline(FILENAME_PROMPT);
+ retry:
+ *tmpbuf = '\0';
+ if (LYGetStr(tmpbuf, FALSE, sizeof(tmpbuf), NORECALL) < 0)
+ goto cancelled;
+
+ if (*tmpbuf == '\0')
+ goto cancelled;
+
+ if (strstr(tmpbuf, "../") != NULL) {
+ HTAlert(gettext("Illegal redirection \"../\" found! Request ignored."));
+ goto cancelled;
+ } else if (StrChr(tmpbuf, '/') != NULL) {
+ HTAlert(gettext("Illegal character \"/\" found! Request ignored."));
+ goto cancelled;
+ } else if (tmpbuf[0] == '~') {
+ HTAlert(gettext("Illegal redirection using \"~\" found! Request ignored."));
+ goto cancelled;
+ }
+ HTSprintf0(&filename, "%s/%s", directory, tmpbuf);
+
+#ifdef HAVE_POPEN
+ if (LYIsPipeCommand(filename)) {
+ HTAlert(CANNOT_WRITE_TO_FILE);
+ _statusline(NEW_FILENAME_PROMPT);
+ goto retry;
+ }
+#endif
+ switch (LYValidateOutput(filename)) {
+ case 'Y':
+ break;
+ case 'N':
+ goto retry;
+ default:
+ goto cancelled;
+ }
+
+ /*
+ * See if we can write to it.
+ */
+ CTRACE((tfp, "LYUpload: filename is %s", filename));
+
+ HTAddParam(&the_upload, upload_command->command, 1, filename);
+ HTEndParam(&the_upload, upload_command->command, 1);
+ } else { /* No substitution, no changes */
+ StrAllocCopy(the_upload, upload_command->command);
+ }
+
+ HTAddParam(&the_command, SUBDIR_COMMAND, 1, directory);
+ HTEndParam(&the_command, SUBDIR_COMMAND, 1);
+ StrAllocCat(the_command, the_upload);
+
+ CTRACE((tfp, "command: %s\n", the_command));
+
+ stop_curses();
+ LYSystem(the_command);
+ start_curses();
+
+ FREE(the_command);
+ FREE(the_upload);
+#if defined(MULTI_USER_UNIX)
+ if (filename != 0)
+ chmod(filename, HIDE_CHMOD);
+#endif /* UNIX */
+ FREE(filename);
+
+ return 1;
+
+ failed:
+ HTAlert(gettext("Unable to upload file."));
+ return 0;
+
+ cancelled:
+ HTInfoMsg(CANCELLING);
+ return 0;
+}
+
+/*
+ * LYUpload_options writes out the current upload choices to a file so that the
+ * user can select printers in the same way that they select all other links.
+ * Upload links look like:
+ * LYNXDIRED://UPLOAD=<#>/TO=<STRING>
+ */
+int LYUpload_options(char **newfile,
+ char *directory)
+{
+ static char tempfile[LY_MAXPATH];
+ FILE *fp0;
+ lynx_list_item_type *cur_upload;
+ int count;
+ char *curloc = NULL;
+
+ if ((fp0 = InternalPageFP(tempfile, TRUE)) == 0)
+ return (-1);
+
+#ifdef VMS
+ StrAllocCopy(curloc, "/sys$login");
+#else
+ StrAllocCopy(curloc, HTfullURL_toFile(directory));
+ LYTrimPathSep(curloc);
+#endif /* VMS */
+
+ LYLocalFileToURL(newfile, tempfile);
+ LYRegisterUIPage(*newfile, UIP_UPLOAD_OPTIONS);
+
+ BeginInternalPage(fp0, UPLOAD_OPTIONS_TITLE, UPLOAD_OPTIONS_HELP);
+
+ fprintf(fp0, "<pre>\n");
+ fprintf(fp0, " <em>%s</em> %s\n", gettext("Upload To:"), curloc);
+ fprintf(fp0, "\n%s\n", gettext("Upload options:"));
+
+ if (uploaders != NULL) {
+ for (count = 0, cur_upload = uploaders;
+ cur_upload != NULL;
+ cur_upload = cur_upload->next, count++) {
+ fprintf(fp0, " <a href=\"LYNXDIRED://UPLOAD=%d/TO=%s\">",
+ count, curloc);
+ fprintf(fp0, "%s", (cur_upload->name ?
+ cur_upload->name : gettext("No Name Given")));
+ fprintf(fp0, "</a>\n");
+ }
+ } else {
+ fprintf(fp0, " &lt;NONE&gt;\n");
+ }
+
+ fprintf(fp0, "</pre>\n");
+ EndInternalPage(fp0);
+ LYCloseTempFP(fp0);
+
+ LYforce_no_cache = TRUE;
+ FREE(curloc);
+
+ return (0);
+}
diff --git a/src/LYUpload.h b/src/LYUpload.h
new file mode 100644
index 0000000..84a71a0
--- /dev/null
+++ b/src/LYUpload.h
@@ -0,0 +1,17 @@
+#ifndef LYUPLOAD_H
+#define LYUPLOAD_H
+
+#ifndef LYSTRUCTS_H
+#include <LYStructs.h>
+#endif /* LYSTRUCTS_H */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ extern int LYUpload(char *line);
+ extern int LYUpload_options(char **newfile, char *directory);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* LYUPLOAD_H */
diff --git a/src/LYUtils.c b/src/LYUtils.c
new file mode 100644
index 0000000..414fb26
--- /dev/null
+++ b/src/LYUtils.c
@@ -0,0 +1,8042 @@
+/*
+ * $LynxId: LYUtils.c,v 1.301 2022/07/25 07:52:04 tom Exp $
+ */
+#include <HTUtils.h>
+#include <HTTCP.h>
+#include <HTParse.h>
+#include <HTAccess.h>
+#include <HTCJK.h>
+#include <HTAlert.h>
+
+#if defined(__MINGW32__)
+
+extern int kbhit(void); /* FIXME: use conio.h */
+
+#undef UNIX
+
+#elif defined(_WINDOWS)
+
+#ifdef DONT_USE_GETTEXT
+#undef gettext
+#elif defined(HAVE_GETTEXT)
+#undef gettext
+#define gettext conio_gettext
+#else
+#undef gettext
+#endif
+
+#include <conio.h>
+
+#ifdef DONT_USE_GETTEXT
+#define gettext(s) s
+#elif defined(HAVE_GETTEXT)
+#undef gettext
+#ifdef _INTL_REDIRECT_MACROS
+#define gettext libintl_gettext /* restore definition from libintl.h */
+#endif
+#else
+#undef gettext
+#define gettext(s) s
+#endif
+
+#if !defined(kbhit) && defined(_WCONIO_DEFINED)
+#define kbhit() _kbhit() /* reasonably recent conio.h */
+#endif
+#elif defined(__minix)
+#include <termios.h> /* for struct winsize */
+
+#endif /* __MINGW32__ */
+
+#include <LYCurses.h>
+#include <LYHistory.h>
+#include <LYStrings.h>
+#include <LYGlobalDefs.h>
+#include <LYUtils.h>
+#include <LYSignal.h>
+#include <GridText.h>
+#include <LYClean.h>
+#include <LYCharSets.h>
+#include <LYCharUtils.h>
+
+#include <LYMainLoop.h>
+#include <LYKeymap.h>
+
+#ifdef __DJGPP__
+#include <go32.h>
+#include <sys/exceptn.h>
+#endif /* __DJGPP__ */
+
+#ifndef NO_GROUPS
+#include <HTFile.h>
+#endif
+
+#ifdef _WINDOWS /* 1998/04/30 (Thu) 19:04:25 */
+#define GETPID() (unsigned) (getpid() & 0xffff)
+#else
+#define GETPID() (unsigned) getpid()
+#endif /* _WINDOWS */
+
+#ifdef FNAMES_8_3
+#define PID_FMT "%04x"
+#else
+#define PID_FMT "%u"
+#endif
+
+#ifdef DJGPP_KEYHANDLER
+#include <bios.h>
+#endif /* DJGPP_KEYHANDLER */
+
+#ifdef __EMX__
+# define BOOLEAN OS2_BOOLEAN /* Conflicts, but is used */
+# undef HT_ERROR /* Conflicts too */
+# define INCL_PM /* I want some PM functions.. */
+# define INCL_DOSPROCESS /* TIB PIB. */
+# include <os2.h>
+# undef BOOLEAN
+#endif
+
+#ifdef VMS
+#include <descrip.h>
+#include <libclidef.h>
+#include <lib$routines.h>
+#endif /* VMS */
+
+#ifdef HAVE_UTMP
+#include <pwd.h>
+#ifdef UTMPX_FOR_UTMP
+#include <utmpx.h>
+#define utmp utmpx
+#ifdef UTMPX_FILE
+#ifdef UTMP_FILE
+#undef UTMP_FILE
+#endif /* UTMP_FILE */
+#define UTMP_FILE UTMPX_FILE
+#else
+#ifdef __UTMPX_FILE
+#define UTMP_FILE __UTMPX_FILE /* at least in OS/390 S/390 -- gil -- 2100 */
+#else
+#ifndef UTMP_FILE
+#define UTMP_FILE "/var/adm/utmpx" /* Digital Unix 4.0 */
+#endif
+#endif
+#endif /* UTMPX_FILE */
+#else
+#include <utmp.h>
+#endif /* UTMPX_FOR_UTMP */
+#endif /* HAVE_UTMP */
+
+#ifdef NEED_PTEM_H
+/* they neglected to define struct winsize in termios.h -- it's only in
+ * termio.h and ptem.h (the former conflicts with other definitions).
+ */
+#include <sys/stream.h>
+#include <sys/ptem.h>
+#endif
+
+#include <LYLeaks.h>
+
+#ifdef USE_COLOR_STYLE
+#include <AttrList.h>
+#include <LYHash.h>
+#include <LYStyle.h>
+#endif
+
+#ifdef SVR4_BSDSELECT
+extern int BSDselect(int nfds, fd_set * readfds, fd_set * writefds,
+ fd_set * exceptfds, struct timeval *timeout);
+
+#ifdef select
+#undef select
+#endif /* select */
+#define select BSDselect
+#ifdef SOCKS
+#ifdef Rselect
+#undef Rselect
+#endif /* Rselect */
+#define Rselect BSDselect
+#endif /* SOCKS */
+#endif /* SVR4_BSDSELECT */
+
+#ifdef __DJGPP__
+#undef select /* defined to select_s in www_tcp.h */
+#endif
+
+#ifndef UTMP_FILE
+#if defined(__FreeBSD__) || defined(__bsdi__)
+#define UTMP_FILE _PATH_UTMP
+#else
+#define UTMP_FILE "/etc/utmp"
+#endif /* __FreeBSD__ || __bsdi__ */
+#endif /* !UTMP_FILE */
+
+/*
+ * experimental - make temporary filenames random to make the scheme less
+ * obvious. However, as noted by KW, there are instances (such as the
+ * 'O'ption page, for which Lynx will store a temporary filename even when
+ * it no longer applies, since it will reuse that filename at a later time.
+ */
+#ifdef USE_RAND_TEMPNAME
+#if defined(LYNX_RAND_MAX)
+#define HAVE_RAND_TEMPNAME 1
+#define MAX_TEMPNAME 10000
+#ifndef BITS_PER_CHAR
+#define BITS_PER_CHAR 8
+#endif
+#endif
+#endif
+
+#define COPY_COMMAND "%s %s %s"
+
+static HTList *localhost_aliases = NULL; /* Hosts to treat as local */
+static char *HomeDir = NULL; /* HOME directory */
+
+HTList *sug_filenames = NULL; /* Suggested filenames */
+
+/*
+ * Maintain a list of all of the temp-files we create so that we can remove
+ * them during the cleanup.
+ */
+typedef struct _LYTemp {
+ struct _LYTemp *next;
+ char *name;
+ BOOLEAN outs;
+ FILE *file;
+} LY_TEMP;
+
+static LY_TEMP *ly_temp;
+
+static LY_TEMP *FindTempfileByName(const char *name)
+{
+ LY_TEMP *p;
+
+ for (p = ly_temp; p != 0; p = p->next) {
+ if (!strcmp(p->name, name)) {
+ break;
+ }
+ }
+ return p;
+}
+
+static LY_TEMP *FindTempfileByFP(FILE *fp)
+{
+ LY_TEMP *p;
+
+ for (p = ly_temp; p != 0; p = p->next) {
+ if (p->file == fp) {
+ break;
+ }
+ }
+ return p;
+}
+
+#if defined(_WIN32)
+/*
+ * Use RegQueryValueExA() rather than RegQueryValueEx() for compatibility
+ * with non-Unicode winvile
+ */
+static int w32_get_reg_sz(HKEY hkey, const char *name, char *value, unsigned length)
+{
+ int result;
+ DWORD dwSzBuffer = length;
+
+ CTRACE((tfp, "w32_get_reg_sz(%s)\n", name));
+ result = RegQueryValueExA(hkey,
+ name,
+ NULL,
+ NULL,
+ (LPBYTE) value,
+ &dwSzBuffer);
+ if (result == ERROR_SUCCESS) {
+ value[dwSzBuffer] = 0;
+ CTRACE((tfp, "->%s\n", value));
+ }
+ return result;
+}
+
+static char *w32_get_shell_folder(const char *name)
+{
+ static HKEY rootkey = HKEY_CURRENT_USER;
+
+ char *result = 0;
+ HKEY hkey;
+ char buffer[LY_MAXPATH];
+
+ if (RegOpenKeyEx(rootkey,
+ W32_STRING("Software"
+ "\\Microsoft"
+ "\\Windows"
+ "\\CurrentVersion"
+ "\\Explorer"
+ "\\Shell Folders"),
+ 0,
+ KEY_READ,
+ &hkey) == ERROR_SUCCESS) {
+ if (w32_get_reg_sz(hkey, name, buffer, sizeof(buffer)) == ERROR_SUCCESS) {
+
+ result = strdup(buffer);
+ (void) RegCloseKey(hkey);
+ }
+
+ (void) RegCloseKey(hkey);
+ }
+ return non_empty(result) ? result : 0;
+}
+#endif
+
+/*
+ * Get an environment variable, rejecting empty strings
+ */
+char *LYGetEnv(const char *name)
+{
+ char *result = getenv(name);
+
+#if defined(_WIN32)
+ if (result == 0) {
+ static HKEY rootkeys[] =
+ {HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE};
+
+ int j;
+ HKEY hkey;
+ char buffer[256];
+
+ for (j = 0; j < (int) TABLESIZE(rootkeys); ++j) {
+ if (RegOpenKeyEx(rootkeys[j],
+ LYNX_SUBKEY W32_STRING("\\Environment"),
+ 0,
+ KEY_READ,
+ &hkey) == ERROR_SUCCESS) {
+ if (w32_get_reg_sz(hkey, name, buffer, sizeof(buffer)) == ERROR_SUCCESS) {
+
+ result = strdup(buffer);
+ (void) RegCloseKey(hkey);
+ break;
+ }
+
+ (void) RegCloseKey(hkey);
+ }
+ }
+ }
+#endif
+ return non_empty(result) ? result : 0;
+}
+
+/*
+ * ascii versions of locale sensitive functions needed because in
+ * Turkish locales tolower("I") is not "i". That's fatal for case
+ * sensitive operations with charset names, HTML tags etc.
+ */
+#ifdef USE_ASCII_CTYPES
+int ascii_tolower(int i)
+{
+ if (91 > i && i > 64)
+ return (i + 32);
+ else
+ return i;
+}
+
+int ascii_toupper(int i)
+{
+ if (123 > i && i > 96)
+ return (i - 32);
+ else
+ return i;
+}
+
+int ascii_isupper(int i)
+{
+ if (91 > i && i > 64)
+ return 1;
+ else
+ return 0;
+}
+#endif /* USE_ASCII_CTYPES */
+
+/*
+ * Check for UTF-8 data, returning the length past the first character.
+ * Return zero if we found an ordinary character rather than UTF-8.
+ */
+size_t utf8_length(int utf_flag,
+ const char *data)
+{
+ size_t utf_extra = 0;
+
+ if (utf_flag && is8bits(*data)) {
+ if ((*data & 0xe0) == 0xc0) {
+ utf_extra = 1;
+ } else if ((*data & 0xf0) == 0xe0) {
+ utf_extra = 2;
+ } else if ((*data & 0xf8) == 0xf0) {
+ utf_extra = 3;
+ } else if ((*data & 0xfc) == 0xf8) {
+ utf_extra = 4;
+ } else if ((*data & 0xfe) == 0xfc) {
+ utf_extra = 5;
+ } else {
+ /*
+ * Garbage.
+ */
+ utf_extra = 0;
+ }
+ if (strlen(data + 1) < utf_extra) {
+ /*
+ * Shouldn't happen.
+ */
+ utf_extra = 0;
+ }
+ }
+ return utf_extra;
+}
+
+/*
+ * Free storage used for the link-highlighting.
+ */
+void LYFreeHilites(int first, int last)
+{
+ int i;
+
+ for (i = first; i < last; i++) {
+ LYSetHilite(i, NULL);
+ FREE(links[i].lname);
+ }
+}
+
+#define LXP (links[cur].lx)
+#define LYP (links[cur].ly)
+
+/*
+ * Set the initial highlight information for a given link.
+ */
+void LYSetHilite(int cur,
+ const char *text)
+{
+ links[cur].list.hl_base.hl_text = DeConst(text);
+ links[cur].list.hl_len = (short) ((text != NULL) ? 1 : 0);
+ FREE(links[cur].list.hl_info);
+}
+
+/*
+ * Add highlight information for the next line of a link.
+ */
+void LYAddHilite(int cur,
+ char *text,
+ int x)
+{
+ HiliteList *list = &(links[cur].list);
+ HiliteInfo *have = list->hl_info;
+ size_t need = (unsigned) (list->hl_len - 1);
+ size_t want;
+
+ list->hl_len = (short) (list->hl_len + 1);
+ want = (size_t) list->hl_len;
+
+ if (have != NULL) {
+ have = typeRealloc(HiliteInfo, have, want);
+ } else {
+ have = typeMallocn(HiliteInfo, want);
+ }
+ list->hl_info = have;
+ have[need].hl_text = text;
+ have[need].hl_x = (short) x;
+}
+
+/*
+ * Get the highlight text, counting from zero.
+ */
+const char *LYGetHiliteStr(int cur,
+ int count)
+{
+ const char *result;
+
+ if (count >= links[cur].list.hl_len)
+ result = NULL;
+ else if (count > 0)
+ result = links[cur].list.hl_info[count - 1].hl_text;
+ else
+ result = links[cur].list.hl_base.hl_text;
+ return result;
+}
+
+/*
+ * Get the X-ordinate at which to draw the corresponding highlight-text
+ */
+int LYGetHilitePos(int cur,
+ int count)
+{
+ int result;
+
+ if (count >= links[cur].list.hl_len)
+ result = -1;
+ else if (count > 0)
+ result = links[cur].list.hl_info[count - 1].hl_x;
+ else
+ result = LXP;
+ return result;
+}
+
+#ifdef SHOW_WHEREIS_TARGETS
+
+#define SKIP_GLYPHS(theFlag, theData, theOffset) \
+ (theFlag \
+ ? LYmbcs_skip_glyphs(theData, (theOffset), theFlag) \
+ : (theData + (theOffset)))
+
+/*
+ * If we have an emphasized WHEREIS hit in the highlighted text, restore the
+ * emphasis. Note that we never emphasize the first and last characters of the
+ * highlighted text when we are making the link current, so the link attributes
+ * for the current link will persist at the beginning and end, providing an
+ * indication to the user that it has been made current. Also note that we use
+ * HText_getFirstTargetInLine() to determine if there's a hit in the HText
+ * structure line containing the link, and if so, get back a copy of the line
+ * starting at that first hit (which might be before or after our link), and
+ * with all IsSpecial characters stripped, so we don't need to deal with them
+ * here. -FM
+ */
+static BOOL show_whereis_targets(int flag,
+ int cur,
+ int count,
+ const char *target,
+ int TargetEmphasisON,
+ int utf_flag)
+{
+ const char *mydata = NULL;
+ const char *cp;
+ char *theData = NULL;
+ char buffer[MAX_LINE];
+ char tmp[7];
+ int HitOffset;
+ int LenNeeded;
+ int Offset;
+ int tLen;
+
+ tmp[0] = tmp[1] = tmp[2] = '\0';
+
+ if (non_empty(target)
+ && (links[cur].type & WWW_LINK_TYPE)
+ && non_empty(LYGetHiliteStr(cur, count))
+ && LYP + count < display_lines
+ && HText_getFirstTargetInLine(HTMainText,
+ links[cur].anchor_line_num + count,
+ utf_flag,
+ &Offset,
+ &tLen,
+ &theData,
+ target)) {
+ int itmp, written, len, y, offset;
+ const char *data;
+ int tlen = (int) strlen(target);
+ int hlen, hLen;
+ int hLine = LYP + count;
+ int hoffset = LYGetHilitePos(cur, count);
+ size_t utf_extra = 0;
+
+ /*
+ * Copy into the buffer only what will fit up to the right border of
+ * the screen. -FM
+ */
+ LYmbcsstrncpy(buffer,
+ NonNull(LYGetHiliteStr(cur, count)),
+ (int) (sizeof(buffer) - 1),
+ (LYcolLimit - LYGetHilitePos(cur, count)),
+ utf_flag);
+ hlen = (int) strlen(buffer);
+ hLen = ((IS_CJK_TTY || utf_flag) ?
+ LYmbcsstrlen(buffer, utf_flag, YES) : hlen);
+
+ /*
+ * Break out if the first hit in the line starts after this link. -FM
+ */
+ if (Offset < (hoffset + hLen)) {
+ /*
+ * Recursively skip hits that end before this link, and break out
+ * if there is no hit beyond those. -FM
+ */
+ mydata = theData;
+ while ((Offset < hoffset) &&
+ ((Offset + tLen) <= hoffset)) {
+ data = (mydata + tlen);
+ offset = (Offset + tLen);
+ if (((cp = LYno_attr_mb_strstr(data,
+ target,
+ utf_flag, YES,
+ &HitOffset,
+ &LenNeeded)) != NULL)
+ && (offset + LenNeeded) < LYcols) {
+ mydata = cp;
+ Offset = (offset + HitOffset);
+ } else {
+ goto highlight_search_done;
+ }
+ }
+ data = buffer;
+ offset = hoffset;
+
+ /*
+ * If the hit starts before the hightext, and ends in or beyond the
+ * hightext, restore the emphasis, skipping the first and last
+ * characters of the hightext if we're making the link current.
+ * -FM
+ */
+ if (offset >= 0 &&
+ (Offset < offset) &&
+ ((Offset + tLen) > offset)) {
+ itmp = 0;
+ written = 0;
+ len = (tlen - (offset - Offset));
+
+ /*
+ * Go to the start of the hightext and handle its first
+ * character. -FM
+ */
+ LYmove(hLine, offset);
+ tmp[0] = data[itmp];
+ utf_extra = utf8_length(utf_flag, data + itmp);
+ if (utf_extra) {
+ LYStrNCpy(&tmp[1], &data[itmp + 1], utf_extra);
+ itmp += (int) utf_extra;
+ /*
+ * Start emphasis immediately if we are making the link
+ * non-current. -FM
+ */
+ if (flag != TRUE) {
+ LYstartTargetEmphasis();
+ TargetEmphasisON = TRUE;
+ LYaddstr(tmp);
+ } else {
+ LYmove(hLine, (offset + 1));
+ }
+ tmp[1] = '\0';
+ written += (int) (utf_extra + 1);
+ } else if (IS_CJK_TTY && is8bits(tmp[0])) {
+ /*
+ * For CJK strings, by Masanobu Kimura.
+ */
+ tmp[1] = data[++itmp];
+ /*
+ * Start emphasis immediately if we are making the link
+ * non-current. -FM
+ */
+ if (flag != TRUE) {
+ LYstartTargetEmphasis();
+ TargetEmphasisON = TRUE;
+ LYaddstr(tmp);
+ } else {
+ LYmove(hLine, (offset + 1));
+ }
+ tmp[1] = '\0';
+ written += 2;
+ } else {
+ /*
+ * Start emphasis immediately if we are making the link
+ * non-current. -FM
+ */
+ if (flag != TRUE) {
+ LYstartTargetEmphasis();
+ TargetEmphasisON = TRUE;
+ LYaddstr(tmp);
+ } else {
+ LYmove(hLine, (offset + 1));
+ }
+ written++;
+ }
+ itmp++;
+ /*
+ * Start emphasis after the first character if we are making
+ * the link current and this is not the last character. -FM
+ */
+ if (!TargetEmphasisON &&
+ data[itmp] != '\0') {
+ LYstartTargetEmphasis();
+ TargetEmphasisON = TRUE;
+ }
+
+ /*
+ * Handle the remaining characters. -FM
+ */
+ for (;
+ written < len && (tmp[0] = data[itmp]) != '\0';
+ itmp++) {
+ /*
+ * Print all the other target chars, except the last
+ * character if it is also the last character of hightext
+ * and we are making the link current. -FM
+ */
+ utf_extra = utf8_length(utf_flag, data + itmp);
+ if (utf_extra) {
+ LYStrNCpy(&tmp[1], &data[itmp + 1], utf_extra);
+ itmp += (int) utf_extra;
+ /*
+ * Make sure we don't restore emphasis to the last
+ * character of hightext if we are making the link
+ * current. -FM
+ */
+ if (flag == TRUE && data[(itmp + 1)] == '\0') {
+ LYstopTargetEmphasis();
+ TargetEmphasisON = FALSE;
+ LYGetYX(y, offset);
+ (void) y;
+ LYmove(hLine, (offset + 1));
+ } else {
+ LYaddstr(tmp);
+ }
+ tmp[1] = '\0';
+ written += (int) (utf_extra + 1);
+ } else if (IS_CJK_TTY && is8bits(tmp[0])) {
+ /*
+ * For CJK strings, by Masanobu Kimura.
+ */
+ tmp[1] = data[++itmp];
+ /*
+ * Make sure we don't restore emphasis to the last
+ * character of hightext if we are making the link
+ * current. -FM
+ */
+ if (flag == TRUE && data[(itmp + 1)] == '\0') {
+ LYstopTargetEmphasis();
+ TargetEmphasisON = FALSE;
+ LYGetYX(y, offset);
+ LYmove(hLine, (offset + 1));
+ } else {
+ LYaddstr(tmp);
+ }
+ tmp[1] = '\0';
+ written += 2;
+ } else {
+ /*
+ * Make sure we don't restore emphasis to the last
+ * character of hightext if we are making the link
+ * current. -FM
+ */
+ if (flag == TRUE && data[(itmp + 1)] == '\0') {
+ LYstopTargetEmphasis();
+ TargetEmphasisON = FALSE;
+ LYGetYX(y, offset);
+ LYmove(hLine, (offset + 1));
+ } else {
+ LYaddstr(tmp);
+ }
+ written++;
+ }
+ }
+
+ /*
+ * Stop the emphasis if we haven't already, then reset the
+ * offset to our current position in the line, and if that is
+ * beyond the link, or or we are making the link current and it
+ * is the last character of the hightext, we are done. -FM
+ */
+ if (TargetEmphasisON) {
+ LYstopTargetEmphasis();
+ TargetEmphasisON = FALSE;
+ }
+ LYGetYX(y, offset);
+ if (offset < (hoffset + (flag == TRUE ? (hLen - 1) : hLen))
+ /*
+ * See if we have another hit that starts within the
+ * hightext. -FM
+ */
+ && ((cp =
+ LYno_attr_mb_strstr(data = SKIP_GLYPHS(utf_flag,
+ mydata,
+ offset - Offset),
+ target,
+ utf_flag, YES,
+ &HitOffset,
+ &LenNeeded)) != NULL)
+ && (offset + LenNeeded) < LYcols
+ /*
+ * If the hit starts after the end of the hightext, or we
+ * are making the link current and the hit starts at its
+ * last character, we are done. -FM
+ */
+ && (HitOffset + offset) <
+ (hoffset +
+ (flag == TRUE ? (hLen - 1) : hLen))) {
+ /*
+ * Set up the data and offset for the hit, and let the code
+ * for within hightext hits handle it. -FM
+ */
+ mydata = cp;
+ Offset = (offset + HitOffset);
+ data = buffer;
+ offset = hoffset;
+ goto highlight_hit_within_hightext;
+ }
+ goto highlight_search_done;
+ }
+
+ highlight_hit_within_hightext:
+ /*
+ * If we get to here, the hit starts within the hightext. If we
+ * are making the link current and it's the last character in the
+ * hightext, we are done. Otherwise, move there and start
+ * restoring the emphasis. -FM
+ */
+ if ((Offset - offset) <= (flag == TRUE ? (hLen - 1) : hLen)) {
+ data = SKIP_GLYPHS(utf_flag, data, Offset - offset);
+ if (utf_flag) {
+ LYrefresh();
+ }
+ offset = Offset;
+ itmp = 0;
+ written = 0;
+ len = tlen;
+
+ /*
+ * Go to the start of the hit and handle its first character.
+ * -FM
+ */
+ LYmove(hLine, offset);
+ tmp[0] = data[itmp];
+ utf_extra = utf8_length(utf_flag, data + itmp);
+ if (utf_extra) {
+ LYStrNCpy(&tmp[1], &data[itmp + 1], utf_extra);
+ itmp += (int) utf_extra;
+ /*
+ * Start emphasis immediately if we are making the link
+ * non-current, or we are making it current but this is not
+ * the first or last character of the hightext. -FM
+ */
+ if (flag != TRUE ||
+ (offset > hoffset && data[itmp + 1] != '\0')) {
+ LYstartTargetEmphasis();
+ TargetEmphasisON = TRUE;
+ LYaddstr(tmp);
+ } else {
+ LYmove(hLine, (offset + 1));
+ }
+ tmp[1] = '\0';
+ written += (int) (utf_extra + 1);
+ } else if (IS_CJK_TTY && is8bits(tmp[0])) {
+ /*
+ * For CJK strings, by Masanobu Kimura.
+ */
+ tmp[1] = data[++itmp];
+ /*
+ * Start emphasis immediately if we are making the link
+ * non-current, or we are making it current but this is not
+ * the first or last character of the hightext. -FM
+ */
+ if (flag != TRUE ||
+ (offset > hoffset && data[itmp + 1] != '\0')) {
+ LYstartTargetEmphasis();
+ TargetEmphasisON = TRUE;
+ LYaddstr(tmp);
+ } else {
+ LYmove(hLine, (offset + 2));
+ }
+ tmp[1] = '\0';
+ written += 2;
+ } else {
+ /*
+ * Start emphasis immediately if we are making the link
+ * non-current, or we are making it current but this is not
+ * the first or last character of the hightext. -FM
+ */
+ if (flag != TRUE ||
+ (offset > hoffset && data[itmp + 1] != '\0')) {
+ LYstartTargetEmphasis();
+ TargetEmphasisON = TRUE;
+ LYaddstr(tmp);
+ } else {
+ LYmove(hLine, (offset + 1));
+ }
+ written++;
+ }
+ itmp++;
+ /*
+ * Start emphasis after the first character if we are making
+ * the link current and this is not the last character. -FM
+ */
+ if (!TargetEmphasisON &&
+ data[itmp] != '\0') {
+ LYstartTargetEmphasis();
+ TargetEmphasisON = TRUE;
+ }
+
+ for (;
+ written < len && (tmp[0] = data[itmp]) != '\0';
+ itmp++) {
+ /*
+ * Print all the other target chars, except the last
+ * character if it is also the last character of hightext
+ * and we are making the link current. -FM
+ */
+ utf_extra = utf8_length(utf_flag, data + itmp);
+ if (utf_extra) {
+ LYStrNCpy(&tmp[1], &data[itmp + 1], utf_extra);
+ itmp += (int) utf_extra;
+ /*
+ * Make sure we don't restore emphasis to the last
+ * character of hightext if we are making the link
+ * current. -FM
+ */
+ if (flag == TRUE && data[(itmp + 1)] == '\0') {
+ LYstopTargetEmphasis();
+ TargetEmphasisON = FALSE;
+ LYGetYX(y, offset);
+ LYmove(hLine, (offset + 1));
+ } else {
+ LYaddstr(tmp);
+ }
+ tmp[1] = '\0';
+ written += (int) (utf_extra + 1);
+ } else if (IS_CJK_TTY && is8bits(tmp[0])) {
+ /*
+ * For CJK strings, by Masanobu Kimura.
+ */
+ tmp[1] = data[++itmp];
+ /*
+ * Make sure we don't restore emphasis to the last
+ * character of hightext if we are making the link
+ * current. -FM
+ */
+ if (flag == TRUE && data[(itmp + 1)] == '\0') {
+ LYstopTargetEmphasis();
+ TargetEmphasisON = FALSE;
+ LYGetYX(y, offset);
+ LYmove(hLine, (offset + 1));
+ } else {
+ LYaddstr(tmp);
+ }
+ tmp[1] = '\0';
+ written += 2;
+ } else {
+ /*
+ * Make sure we don't restore emphasis to the last
+ * character of hightext if we are making the link
+ * current. -FM
+ */
+ if (flag == TRUE && data[(itmp + 1)] == '\0') {
+ LYstopTargetEmphasis();
+ TargetEmphasisON = FALSE;
+ LYGetYX(y, offset);
+ LYmove(hLine, (offset + 1));
+ } else {
+ LYaddstr(tmp);
+ }
+ written++;
+ }
+ }
+
+ /*
+ * Stop the emphasis if we haven't already, then reset the
+ * offset to our current position in the line, and if that is
+ * beyond the link, or we are making the link current and it is
+ * the last character in the hightext, we are done. -FM
+ */
+ if (TargetEmphasisON) {
+ LYstopTargetEmphasis();
+ TargetEmphasisON = FALSE;
+ }
+ LYGetYX(y, offset);
+ if (offset < (hoffset + (flag == TRUE ? (hLen - 1) : hLen))
+ /*
+ * See if we have another hit that starts within the
+ * hightext. -FM
+ */
+ && ((cp =
+ LYno_attr_mb_strstr(data = SKIP_GLYPHS(utf_flag,
+ mydata,
+ offset - Offset),
+ target,
+ utf_flag, YES,
+ &HitOffset,
+ &LenNeeded)) != NULL)
+ && (offset + LenNeeded) < LYcols
+ /*
+ * If the hit starts after the end of the hightext, or we
+ * are making the link current and the hit starts at its
+ * last character, we are done. -FM
+ */
+ && (HitOffset + offset) <
+ (hoffset + (flag == TRUE ? (hLen - 1) : hLen))) {
+ /*
+ * If the target extends beyond our buffer, emphasize
+ * everything in the hightext starting at this hit.
+ * Otherwise, set up the data and offsets, and loop back.
+ * -FM
+ */
+ if ((HitOffset + (offset + tLen)) >= (hoffset + hLen)) {
+ offset = (HitOffset + offset);
+ data = SKIP_GLYPHS(utf_flag, mydata, offset - hoffset);
+ if (utf_flag) {
+ LYrefresh();
+ }
+ LYmove(hLine, offset);
+ itmp = 0;
+ written = 0;
+ len = (int) strlen(data);
+
+ /*
+ * Turn the emphasis back on. -FM
+ */
+ LYstartTargetEmphasis();
+ TargetEmphasisON = TRUE;
+ for (;
+ written < len && (tmp[0] = data[itmp]) != '\0';
+ itmp++) {
+ /*
+ * Print all the other target chars, except the
+ * last character if it is also the last character
+ * of hightext and we are making the link current.
+ * -FM
+ */
+ utf_extra = utf8_length(utf_flag, data + itmp);
+ if (utf_extra) {
+ LYStrNCpy(&tmp[1], &data[itmp + 1], utf_extra);
+ itmp += (int) utf_extra;
+ /*
+ * Make sure we don't restore emphasis to the
+ * last character of hightext if we are making
+ * the link current. -FM
+ */
+ if (flag == TRUE && data[(itmp + 1)] == '\0') {
+ LYstopTargetEmphasis();
+ TargetEmphasisON = FALSE;
+ LYGetYX(y, offset);
+ LYmove(hLine, (offset + 1));
+ } else {
+ LYaddstr(tmp);
+ }
+ tmp[1] = '\0';
+ written += (int) (utf_extra + 1);
+ } else if (IS_CJK_TTY && is8bits(tmp[0])) {
+ /*
+ * For CJK strings, by Masanobu Kimura.
+ */
+ tmp[1] = data[++itmp];
+ /*
+ * Make sure we don't restore emphasis to the
+ * last character of hightext if we are making
+ * the link current. -FM
+ */
+ if (flag == TRUE && data[(itmp + 1)] == '\0') {
+ LYstopTargetEmphasis();
+ TargetEmphasisON = FALSE;
+ } else {
+ LYaddstr(tmp);
+ }
+ tmp[1] = '\0';
+ written += 2;
+ } else {
+ /*
+ * Make sure we don't restore emphasis to the
+ * last character of hightext if we are making
+ * the link current. -FM
+ */
+ if (flag == TRUE && data[(itmp + 1)] == '\0') {
+ LYstopTargetEmphasis();
+ TargetEmphasisON = FALSE;
+ } else {
+ LYaddstr(tmp);
+ }
+ written++;
+ }
+ }
+ /*
+ * Turn off the emphasis if we haven't already, and
+ * then we're done. -FM
+ */
+ if (TargetEmphasisON) {
+ LYstopTargetEmphasis();
+ }
+ } else {
+ mydata = cp;
+ Offset = (offset + HitOffset);
+ data = buffer;
+ offset = hoffset;
+ goto highlight_hit_within_hightext;
+ }
+ }
+ }
+ }
+ }
+ highlight_search_done:
+ FREE(theData);
+ return (BOOLEAN) TargetEmphasisON;
+}
+#endif /* SHOW_WHEREIS_TARGETS */
+
+#ifdef USE_COLOR_STYLE
+static int find_cached_style(int cur,
+ int flag)
+{
+ int s = s_alink;
+
+#ifdef TEXTFIELDS_MAY_NEED_ACTIVATION
+ if (textfields_need_activation
+ && links[cur].type == WWW_FORM_LINK_TYPE
+ && F_TEXTLIKE(links[cur].l_form->type))
+ s = s_curedit;
+#endif
+
+ if (flag != TRUE) {
+ int x;
+
+ /*
+ * This is where we try to restore the original style when a link is
+ * unhighlighted. The cached styles array saves the original style
+ * just for this case. If it doesn't have a color change saved at just
+ * the right position, we look at preceding positions in the same line
+ * until we find one.
+ */
+ if (ValidCachedStyle(LYP, LXP)) {
+ CTRACE2(TRACE_STYLE,
+ (tfp, "STYLE.highlight.off: cached style @(%d,%d): ",
+ LYP, LXP));
+ s = (int) GetCachedStyle(LYP, LXP);
+ if (s == 0) {
+ for (x = LXP - 1; x >= 0; x--) {
+ s = (int) GetCachedStyle(LYP, x);
+ if (s != 0) {
+ SetCachedStyle(LYP, LXP, (unsigned) s);
+ CTRACE2(TRACE_STYLE,
+ (tfp, "found %d, x_offset=%d.\n", s, x - LXP));
+ break;
+ }
+ }
+ if (s == 0) {
+ CTRACE2(TRACE_STYLE, (tfp, "not found, assume <a>.\n"));
+ s = s_a;
+ }
+ } else {
+ CTRACE2(TRACE_STYLE, (tfp, "found %d.\n", s));
+ }
+ } else {
+ CTRACE2(TRACE_STYLE,
+ (tfp, "STYLE.highlight.off: can't use cache.\n"));
+ s = s_a;
+ }
+ } else {
+ CTRACE2(TRACE_STYLE, (tfp, "STYLE.highlight.on: @(%d,%d).\n", LYP, LXP));
+ }
+ return s;
+}
+#endif /* USE_COLOR_STYLE */
+
+/*
+ * Highlight (or unhighlight) a given link.
+ */
+void LYhighlight(int flag,
+ int cur,
+ const char *target)
+{
+ char buffer[MAX_LINE];
+ int i;
+ int hi_count;
+ int hi_offset;
+ int title_adjust = (no_title ? -TITLE_LINES : 0);
+ char tmp[7];
+ const char *hi_string;
+
+#ifdef SHOW_WHEREIS_TARGETS
+ BOOL TargetEmphasisON = FALSE;
+ BOOL target1_drawn = NO;
+#endif
+ BOOL utf_flag = (BOOL) IS_UTF8_TTY;
+ BOOL hl1_drawn = NO;
+
+ tmp[0] = tmp[1] = tmp[2] = '\0';
+
+ /*
+ * Bugs in the history code might cause -1 to be sent for cur, which yields
+ * a crash when LYStrNCpy() is called with a nonsense pointer. As far as I
+ * know, such bugs have been squashed, but if they should reappear, this
+ * works around them. -FM
+ */
+ if (cur < 0) {
+ CTRACE((tfp, "LYhighlight cur %d (bug workaround)\n", cur));
+ cur = 0;
+ }
+
+ CTRACE((tfp, "LYhighlight at(%2d,%2d) %s %d [%d]:%s\n",
+ links[cur].ly, links[cur].lx,
+ (flag
+ ? "on"
+ : "off"),
+ cur,
+ links[cur].anchor_number,
+ NONNULL(target)));
+
+#if defined(TEXTFIELDS_MAY_NEED_ACTIVATION) && defined(INACTIVE_INPUT_STYLE_VH)
+ if (flag == FALSE)
+ textinput_redrawn = FALSE;
+#endif
+
+ if (nlinks > 0) {
+#ifdef USE_COLOR_STYLE
+ if (flag == TRUE || links[cur].type == WWW_FORM_LINK_TYPE) {
+ LYmove(LYP + title_adjust, LXP);
+ LynxChangeStyle(find_cached_style(cur, flag), STACK_ON);
+ }
+#else
+ if (links[cur].type == WWW_FORM_LINK_TYPE
+ || LYGetHiliteStr(cur, 0) == NULL) {
+ LYMoveToLink(cur, target, NULL,
+ flag, links[cur].inUnderline, utf_flag);
+ lynx_start_link_color(flag == TRUE, links[cur].inUnderline);
+ } else {
+ LYMoveToLink(cur, target, LYGetHiliteStr(cur, 0),
+ flag, links[cur].inUnderline, utf_flag);
+ hl1_drawn = YES;
+#ifdef SHOW_WHEREIS_TARGETS
+ target1_drawn = YES;
+#endif
+ }
+#endif
+
+ if (links[cur].type == WWW_FORM_LINK_TYPE) {
+ int len;
+ int avail_space = (LYcolLimit - LXP) + (LYcolLimit * (LYlines - LYP));
+ const char *text = LYGetHiliteStr(cur, 0);
+
+ if (text == 0)
+ text = "";
+
+ if (avail_space > links[cur].l_form->size)
+ avail_space = links[cur].l_form->size;
+
+ len = (int) (LYmbcs_skip_cells(text, avail_space, utf_flag) - text);
+ LYwaddnstr(LYwin, text, (size_t) len);
+ while (len++ < avail_space)
+ LYaddch('_');
+
+#ifdef USE_COLOR_STYLE
+ } else if (flag == FALSE) {
+ redraw_lines_of_link(cur);
+ CTRACE2(TRACE_STYLE,
+ (tfp, "STYLE.highlight.off: NOFIX branch @(%d,%d).\n",
+ LYP, LXP));
+#endif
+ } else if (!hl1_drawn) {
+ /*
+ * Copy into the buffer only what will fit within the width of the
+ * screen.
+ */
+ LYmbcsstrncpy(buffer,
+ NonNull(LYGetHiliteStr(cur, 0)),
+ (int) (sizeof(buffer) - 1),
+ (LYcolLimit - LXP),
+ utf_flag);
+ LYaddstr(buffer);
+ }
+
+ /*
+ * Display a second line as well.
+ */
+ for (hi_count = 1;
+ (hi_string = LYGetHiliteStr(cur, hi_count)) != NULL
+ && LYP + hi_count <= display_lines;
+ ++hi_count) {
+ int row = LYP + hi_count + title_adjust;
+
+ hi_offset = LYGetHilitePos(cur, hi_count);
+ if (hi_offset < 0)
+ continue;
+ lynx_stop_link_color(flag == TRUE, links[cur].inUnderline);
+ LYmove(row, hi_offset);
+
+#ifdef USE_COLOR_STYLE
+ CTRACE2(TRACE_STYLE,
+ (tfp, "STYLE.highlight.line2: @(%d,%d), style=%d.\n",
+ row, hi_offset,
+ flag == TRUE ? s_alink : s_a));
+ LynxChangeStyle(flag == TRUE ? s_alink : s_a, ABS_ON);
+#else
+ lynx_start_link_color(flag == TRUE, links[cur].inUnderline);
+#endif
+
+ for (i = 0; (tmp[0] = hi_string[i]) != '\0'
+ && (i + hi_offset) < LYcols; i++) {
+ if (!IsSpecialAttrChar(hi_string[i])) {
+ /*
+ * For CJK strings, by Masanobu Kimura.
+ */
+ if (IS_CJK_TTY && is8bits(tmp[0])) {
+ tmp[1] = hi_string[++i];
+ LYaddstr(tmp);
+ tmp[1] = '\0';
+ } else {
+ LYaddstr(tmp);
+ }
+ }
+ }
+ }
+ lynx_stop_link_color(flag == TRUE, links[cur].inUnderline);
+#ifdef SHOW_WHEREIS_TARGETS
+ for (hi_count = target1_drawn ? 1 : 0;
+ LYGetHiliteStr(cur, hi_count) != NULL;
+ hi_count++) {
+ TargetEmphasisON = show_whereis_targets(flag,
+ cur,
+ hi_count,
+ target,
+ TargetEmphasisON,
+ utf_flag);
+ }
+
+ if (!LYShowCursor)
+ /*
+ * Get cursor out of the way.
+ */
+ LYHideCursor();
+ else
+#endif /* SHOW_WHEREIS_TARGETS */
+ /*
+ * Never hide the cursor if there's no FANCY CURSES or SLANG.
+ */
+ LYmove(LYP + title_adjust, ((LXP > 0) ? (LXP - 1) : 0));
+
+ if (flag)
+ LYrefresh();
+ }
+ return;
+}
+
+/*
+ * free_and_clear will free a pointer if it is non-zero and then set it to
+ * zero.
+ */
+void free_and_clear(char **pointer)
+{
+ if (*pointer) {
+ FREE(*pointer);
+ *pointer = 0;
+ }
+ return;
+}
+
+/*
+ * Convert single or serial newlines to single spaces throughout a string
+ * (ignore newlines if the preceding character is a space) and convert tabs to
+ * single spaces. Don't ignore any explicit tabs or spaces if the condense
+ * argument is FALSE, otherwise, condense any serial spaces or tabs to one
+ * space. - FM
+ */
+void convert_to_spaces(char *string,
+ int condense)
+{
+ char *s = string;
+ char *ns;
+ BOOL last_is_space = FALSE;
+
+ if (!s)
+ return;
+
+ s = LYSkipNonBlanks(s);
+ ns = s;
+
+ while (*s) {
+ switch (*s) {
+ case ' ':
+ case '\t':
+ if (!(condense && last_is_space))
+ *(ns++) = ' ';
+ last_is_space = TRUE;
+ break;
+
+ case '\r':
+ case '\n':
+ if (!last_is_space) {
+ *(ns++) = ' ';
+ last_is_space = TRUE;
+ }
+ break;
+
+ default:
+ *(ns++) = *s;
+ last_is_space = FALSE;
+ break;
+ }
+ s++;
+ }
+ *ns = '\0';
+ return;
+}
+
+/*
+ * Strip trailing slashes from directory paths.
+ */
+char *strip_trailing_slash(char *dirname)
+{
+ int i;
+
+ i = (int) strlen(dirname) - 1;
+ while (i >= 0 && dirname[i] == '/')
+ dirname[i--] = '\0';
+ return (dirname);
+}
+
+/*
+ * Remove most blanks, but restore one trailing blank to make prompts nicer.
+ */
+static void remove_most_blanks(char *buffer)
+{
+ int length = (int) strlen(buffer);
+ BOOL trailing = (BOOL) ((length != 0) && (buffer[length - 1] == ' '));
+
+ LYReduceBlanks(buffer);
+ if (trailing)
+ strcat(buffer, " ");
+}
+
+/*
+ * Display (or hide) the status line.
+ */
+BOOLEAN mustshow = FALSE;
+
+void statusline(const char *text)
+{
+ char buffer[MAX_LINE];
+ unsigned char *temp = NULL;
+ int max_length, len, i, j;
+ int at_lineno;
+ unsigned char k;
+ char *p;
+ char text_buff[MAX_LINE];
+
+ if (text == NULL)
+ return;
+
+ /*
+ * Don't print statusline messages if dumping to stdout.
+ */
+ if (dump_output_immediately)
+ return;
+
+ /*
+ * Don't print statusline message if turned off.
+ */
+ if (mustshow != TRUE) {
+ if (no_statusline == TRUE) {
+ return;
+ }
+ }
+ mustshow = FALSE;
+
+ /* "LYNXDOWNLOAD://Method=-1/File=%s/SugFile=%s%s\">Save to disk</a>\n" */
+ LYStrNCpy(text_buff, text, sizeof(text_buff) - 1);
+ p = StrChr(text_buff, '\n');
+ if (p)
+ *p = '\0';
+
+ /*
+ * Deal with any CJK escape sequences and Kanji if we have a CJK character
+ * set selected, otherwise, strip any escapes. Also, make sure text is not
+ * longer than the statusline window. - FM
+ */
+ max_length = (((LYcolLimit - 1) < (int) sizeof(buffer))
+ ? (LYcolLimit - 1)
+ : (int) sizeof(buffer) - 1);
+ if ((text_buff[0] != '\0') &&
+ (LYHaveCJKCharacterSet)) {
+ /*
+ * Translate or filter any escape sequences. - FM
+ */
+ if ((temp = typecallocn(unsigned char, strlen(text_buff) + 1)) == NULL)
+ outofmem(__FILE__, "statusline");
+
+ if (kanji_code == EUC) {
+ TO_EUC((const unsigned char *) text_buff, temp);
+ } else if (kanji_code == SJIS) {
+#ifdef KANJI_CODE_OVERRIDE
+ if (!LYRawMode || last_kcode == SJIS)
+ strcpy(temp, text_buff);
+ else
+ TO_SJIS((const unsigned char *) text_buff, temp);
+#else
+ strcpy((char *) temp, text_buff);
+#endif
+ } else {
+ for (i = 0, j = 0; text_buff[i]; i++) {
+ if (text_buff[i] != CH_ESC) { /* S/390 -- gil -- 2119 */
+ temp[j++] = UCH(text_buff[i]);
+ }
+ }
+ temp[j] = '\0';
+ }
+
+ /*
+ * Deal with any newlines or tabs in the string. - FM
+ */
+ remove_most_blanks((char *) temp);
+
+ /*
+ * Handle the Kanji, making sure the text is not longer than the
+ * statusline window. - FM
+ */
+ for (i = 0, j = 0, len = 0, k = '\0';
+ temp[i] != '\0' && len < max_length; i++) {
+ if (k != '\0') {
+ buffer[j++] = (char) k;
+ buffer[j++] = (char) temp[i];
+ k = '\0';
+ len += 2;
+ } else if ((temp[i] & 0200) != 0) {
+ k = temp[i];
+ } else {
+ buffer[j++] = (char) temp[i];
+ len++;
+ }
+ }
+ buffer[j] = '\0';
+ FREE(temp);
+ } else {
+ /*
+ * Deal with any newlines or tabs in the string. - FM
+ */
+ remove_most_blanks(text_buff);
+#ifdef WIDEC_CURSES
+ len = (int) strlen(text_buff);
+ if (len >= (int) (sizeof(buffer) - 1))
+ len = (int) (sizeof(buffer) - 1);
+ LYStrNCpy(buffer, text_buff, len);
+ /* FIXME: a binary search might be faster */
+ while (len > 0 && LYstrExtent(buffer, len, len) > max_length)
+ buffer[--len] = '\0';
+#else
+ /*
+ * Strip any escapes, and shorten text if necessary. Note that we
+ * don't deal with the possibility of UTF-8 characters in the string.
+ * This is unlikely, but if strings with such characters are used in
+ * LYMessages_en.h, a compilation symbol of HAVE_UTF8_STATUSLINES could
+ * be added there, and code added here for determining the displayed
+ * string length, as we do above for CJK. - FM
+ */
+ for (i = 0, len = 0; text_buff[i] != '\0' && len < max_length; i++) {
+ if (text_buff[i] != CH_ESC) { /* S/390 -- gil -- 2119 */
+ buffer[len++] = text_buff[i];
+ }
+ }
+ buffer[len] = '\0';
+#endif
+ }
+
+ /*
+ * Move to the desired statusline window and output the text highlighted.
+ * - FM
+ */
+ if (LYStatusLine >= 0) {
+ if (LYStatusLine < LYlines - 1) {
+ at_lineno = LYStatusLine;
+ } else {
+ at_lineno = LYlines - 1;
+ }
+ } else if (user_mode == NOVICE_MODE) {
+ at_lineno = LYlines - 3;
+ } else {
+ at_lineno = LYlines - 1;
+ }
+ LYmove(at_lineno, 0);
+ LYclrtoeol();
+
+ if (buffer[0] != '\0') {
+ BOOLEAN has_CJK = FALSE;
+
+ if (IS_CJK_TTY) {
+ for (i = 0; buffer[i] != '\0'; i++) {
+ if (buffer[i] & 0x80) {
+ has_CJK = TRUE;
+ break;
+ }
+ }
+ }
+
+ if (has_CJK
+#ifdef HAVE_UTF8_STATUSLINES
+ || IS_UTF8_TTY
+#endif
+ ) {
+ LYrefresh();
+ }
+#ifndef USE_COLOR_STYLE
+ lynx_start_status_color();
+ LYaddstr(buffer);
+ lynx_stop_status_color();
+#else
+ /* draw the status bar in the STATUS style */
+ {
+ int y, x;
+ int a = ((StrNCmp(buffer, ALERT_FORMAT, ALERT_PREFIX_LEN)
+ || !hashStyles[s_alert].used)
+ ? s_status
+ : s_alert);
+
+ LynxChangeStyle(a, STACK_ON);
+ LYaddstr(buffer);
+ wbkgdset(LYwin,
+ ((lynx_has_color && LYShowColor >= SHOW_COLOR_ON)
+ ? (chtype) hashStyles[a].color
+ : A_NORMAL) | ' ');
+ LYGetYX(y, x);
+ (void) x;
+ if (y == at_lineno) {
+ LYclrtoeol();
+ }
+ if (!(lynx_has_color && LYShowColor >= SHOW_COLOR_ON))
+ wbkgdset(LYwin, A_NORMAL | ' ');
+ else if (s_normal != NOSTYLE)
+ wbkgdset(LYwin, (chtype) (hashStyles[s_normal].color | ' '));
+ else
+ wbkgdset(LYwin, (chtype) (displayStyles[DSTYLE_NORMAL].color | ' '));
+ LynxChangeStyle(a, STACK_OFF);
+ }
+#endif
+ }
+ LYrefresh();
+
+ return;
+}
+
+static const char *novice_lines(int lineno)
+{
+ switch (lineno) {
+ case 0:
+ return NOVICE_LINE_TWO_A;
+ case 1:
+ return NOVICE_LINE_TWO_B;
+ case 2:
+ return NOVICE_LINE_TWO_C;
+ default:
+ return "";
+ }
+}
+
+static int lineno = 0;
+
+void toggle_novice_line(void)
+{
+ lineno++;
+ if (*novice_lines(lineno) == '\0')
+ lineno = 0;
+ return;
+}
+
+void noviceline(int more_flag GCC_UNUSED)
+{
+ if (dump_output_immediately)
+ return;
+
+ LYmove(LYlines - 2, 0);
+ LYclrtoeol();
+ LYaddstr(NOVICE_LINE_ONE);
+
+ LYParkCursor();
+#if defined(DIRED_SUPPORT ) && defined(OK_OVERRIDE)
+ if (lynx_edit_mode && !no_dired_support)
+ LYaddstr(DIRED_NOVICELINE);
+ else
+#endif /* DIRED_SUPPORT && OK_OVERRIDE */
+
+ if (LYUseNoviceLineTwo)
+ LYaddstr(NOVICE_LINE_TWO);
+ else
+ LYaddstr(novice_lines(lineno));
+
+ LYrefresh();
+ return;
+}
+
+/*
+ * If the standard input is not a tty, and Lynx is really reading from the
+ * standard input, attempt to reopen it, pointing to a real tty. Normally
+ * this would happen if the user pipes data to Lynx and wants to run
+ * interactively after that.
+ *
+ * Returns:
+ * 1 if successfully reopened
+ * -1 if we cannot reopen
+ * 0 if we do not have to reopen
+ */
+int LYReopenInput(void)
+{
+ int result = 0;
+ int fd;
+
+ if ((fd = fileno(stdin)) == 0
+ && !isatty(fd)
+ && LYConsoleInputFD(FALSE) == fd) {
+ const char *term_name = NULL;
+ int new_fd = -1;
+
+#ifdef HAVE_TTYNAME
+ if (isatty(fileno(stdout)) &&
+ (term_name = ttyname(fileno(stdout))) != NULL)
+ new_fd = open(term_name, O_RDONLY);
+
+ if (new_fd == -1 &&
+ isatty(fileno(stderr)) &&
+ (term_name = ttyname(fileno(stderr))) != NULL)
+ new_fd = open(term_name, O_RDONLY);
+#endif
+
+#ifdef HAVE_CTERMID
+ if (new_fd == -1 &&
+ (term_name = ctermid(NULL)) != NULL)
+ new_fd = open(term_name, O_RDONLY);
+#endif
+
+#ifdef TTY_DEVICE
+ if (new_fd == -1)
+ new_fd = open(term_name = TTY_DEVICE, O_RDONLY);
+#endif
+
+ CTRACE((tfp, "LYReopenInput open(%s) returned %d.\n", term_name, new_fd));
+ if (new_fd >= 0) {
+ FILE *frp;
+
+ close(new_fd);
+ frp = freopen(term_name, "r", stdin);
+ CTRACE((tfp,
+ "LYReopenInput freopen(%s,\"r\",stdin) returned %p, stdin is now %p with fd %d.\n",
+ term_name, (void *) frp, (void *) stdin, fileno(stdin)));
+ result = 1;
+ } else {
+ result = -1;
+ }
+ }
+ return result;
+}
+
+/*
+ * Returns the file descriptor from which keyboard input is expected, or INVSOC
+ * (-1) if not available. If need_selectable is true, returns non-INVSOC fd
+ * only if select() is possible - actually, currently only checks if fd is
+ * connected to a tty. - kw
+ */
+int LYConsoleInputFD(int need_selectable)
+{
+ int fd = INVSOC;
+
+#ifdef USE_SLANG
+ if (!LYCursesON)
+ fd = fileno(stdin);
+#if ((SLANG_VERSION >= 9919) && defined(REAL_UNIX_SYSTEM) && !defined(__CYGWIN__))
+ /* SLang_TT_Read_FD introduced in slang 0.99.19, from its changelog:
+ * SLang_TT_Read_FD variable is now available for unix. This is the file
+ * descriptor used by SLang_getkey. */
+ else
+ fd = SLang_TT_Read_FD;
+#endif /* SLANG_VERSION >= 9919 */
+#else /* !USE_SLANG */
+ fd = fileno(stdin);
+#endif /* !USE_SLANG */
+
+ if (need_selectable && fd != INVSOC) {
+ if (isatty(fd)) {
+ return fd;
+ } else {
+ return INVSOC;
+ }
+ }
+ return fd;
+}
+
+static int fake_zap = 0;
+
+void LYFakeZap(int set)
+{
+ if (set && fake_zap < 1) {
+ CTRACE((tfp, "\r *** Set simulated 'Z'"));
+ if (fake_zap)
+ CTRACE((tfp, ", %d pending", fake_zap));
+ CTRACE((tfp, " ***\n"));
+ fake_zap++;
+ } else if (!set && fake_zap) {
+ CTRACE((tfp, "\r *** Unset simulated 'Z'"));
+ CTRACE((tfp, ", %d pending", fake_zap));
+ CTRACE((tfp, " ***\n"));
+ fake_zap = 0;
+ }
+
+}
+
+static int DontCheck(void)
+{
+ static time_t last;
+ time_t next;
+
+ /** Curses or slang setup was not invoked **/
+ if (dump_output_immediately)
+ return (TRUE);
+
+ if (LYHaveCmdScript()) /* we may be running from a script */
+ return (TRUE);
+
+ if (LYNoZapKey)
+ return (TRUE);
+ /*
+ * Avoid checking interrupts more than one per second, since it is a slow
+ * and expensive operation - TD
+ */
+#ifdef HAVE_GETTIMEOFDAY
+#undef timezone /* U/Win defines a conflicting macro */
+ {
+ struct timeval tv;
+
+ gettimeofday(&tv, (struct timezone *) 0);
+ next = (tv.tv_sec * 10);
+ next += (tv.tv_usec / 100000L); /* 0.1 seconds is a compromise */
+ }
+#else
+ next = time((time_t *) 0);
+#endif
+ if (next == last)
+ return (TRUE);
+
+ last = next;
+ return FALSE;
+}
+
+int HTCheckForInterrupt(void)
+{
+ int c;
+ int cmd;
+
+ if (fake_zap > 0) {
+ fake_zap--;
+ CTRACE((tfp, "\r *** Got simulated 'Z' ***\n"));
+ CTRACE_FLUSH(tfp);
+ CTRACE_SLEEP(AlertSecs);
+ return ((int) TRUE);
+ }
+
+ /** Curses or slang setup was not invoked **/
+ if (DontCheck())
+ return ((int) FALSE);
+
+#ifndef VMS /* UNIX stuff: */
+
+#if !defined(_WINDOWS) || defined(__MINGW32__)
+
+ /*
+ * First, check if there is a character.
+ */
+#ifdef USE_SLANG
+ /** No keystroke was entered
+ Note that this isn't taking possible SOCKSification
+ and the socks_flag into account, and may fail on the
+ slang library's select() when SOCKSified. - FM **/
+#ifdef DJGPP_KEYHANDLER
+ if (0 == _bios_keybrd(_NKEYBRD_READY))
+ return (FALSE);
+#else
+ if (0 == SLang_input_pending(0))
+ return (FALSE);
+#endif /* DJGPP_KEYHANDLER */
+
+#else /* Unix curses: */
+ {
+ struct timeval socket_timeout;
+ int ret = 0;
+ fd_set readfds;
+
+ socket_timeout.tv_sec = 0;
+ socket_timeout.tv_usec = 0;
+ FD_ZERO(&readfds);
+ FD_SET(0, &readfds);
+#ifdef SOCKS
+ if (socks_flag)
+ ret = Rselect(1, &readfds, NULL, NULL, &socket_timeout);
+ else
+#endif /* SOCKS */
+ ret = select(1, &readfds, NULL, NULL, &socket_timeout);
+
+ /** Suspended? **/
+ if ((ret == -1) && (SOCKET_ERRNO == EINTR))
+ return ((int) FALSE);
+
+ /** No keystroke was entered? **/
+ if (!FD_ISSET(0, &readfds))
+ return ((int) FALSE);
+ }
+#endif /* USE_SLANG */
+
+#endif /* !_WINDOWS */
+
+ /*
+ * Now, read the character.
+ */
+#if defined(USE_CURSES_NODELAY)
+ nodelay(LYwin, TRUE);
+ c = LYgetch();
+ nodelay(LYwin, FALSE);
+#elif defined(USE_SLANG) && defined(_WINDOWS)
+ if (!SLang_input_pending(0))
+ return ((int) FALSE);
+ c = LYgetch();
+#else
+ c = LYgetch();
+#endif
+
+#else /* VMS: */
+ extern int typeahead(void);
+
+ /** Control-C or Control-Y and a 'N'o reply to exit query **/
+ if (HadVMSInterrupt) {
+ HadVMSInterrupt = FALSE;
+ return ((int) TRUE);
+ }
+
+ c = typeahead();
+
+#endif /* !VMS */
+
+ /*
+ * 'c' contains whatever character we're able to read from keyboard
+ */
+
+ /** Keyboard 'Z' or 'z', or Control-G or Control-C **/
+ if (LYCharIsINTERRUPT(c))
+ return ((int) TRUE);
+
+ /* There is a subset of mainloop() actions available at this stage: no new
+ * getfile() cycle is possible until the previous finished. Currently we
+ * have scrolling in partial mode, toggling of trace log, and pasting.
+ * User search now in progress...
+ */
+ cmd = (LKC_TO_LAC(keymap, c));
+ switch (cmd) {
+ case LYK_TRACE_TOGGLE: /* Toggle TRACE mode. */
+ handle_LYK_TRACE_TOGGLE();
+ break;
+#ifdef CAN_CUT_AND_PASTE
+ case LYK_TO_CLIPBOARD:{ /* ^S */
+ const char *s = LYDownLoadAddress();
+
+ if (!s || !*s || put_clip(s))
+ HTInfoMsg(gettext("Copy to clipboard failed."));
+ else
+ HTInfoMsg(gettext("Download document URL put to clipboard."));
+ break;
+ }
+#endif /* defined CAN_CUT_AND_PASTE */
+ default:
+#ifdef DISP_PARTIAL
+ /* OK, we got several lines from new document and want to scroll... */
+ if (display_partial && (NumOfLines_partial > 2)) {
+ BOOLEAN do_refresh;
+ int res;
+ int Newline_partial = LYGetNewline();
+
+ switch (cmd) {
+ case LYK_WHEREIS: /* search within the document */
+ case LYK_NEXT: /* search for the next occurrence in the document */
+ case LYK_PREV: /* search for the previous occurrence in the document */
+ handle_LYK_WHEREIS(cmd, &do_refresh);
+ if (www_search_result != -1) {
+ Newline_partial = www_search_result;
+ www_search_result = -1; /* reset */
+ }
+ break;
+
+ case LYK_FASTBACKW_LINK:
+ if (Newline_partial <= (display_lines) + 1) {
+ Newline_partial -= display_lines;
+ } else if ((res =
+ HTGetLinkOrFieldStart(-1,
+ &Newline_partial, NULL,
+ -1, TRUE)) == LINK_LINE_FOUND) {
+ Newline_partial++;
+ } else if (res == LINK_DO_ARROWUP) {
+ Newline_partial -= display_lines;
+ }
+ break;
+ case LYK_FASTFORW_LINK:
+ if (HText_canScrollDown()) {
+ /* This is not an exact science... - kw */
+ if (HTGetLinkOrFieldStart(HText_LinksInLines(HTMainText,
+ Newline_partial,
+ display_lines)
+ - 1,
+ &Newline_partial, NULL,
+ 1, TRUE) == LINK_LINE_FOUND) {
+ Newline_partial++;
+ }
+ }
+ break;
+ case LYK_PREV_PAGE:
+ if (Newline_partial > 1)
+ Newline_partial -= display_lines;
+ break;
+ case LYK_NEXT_PAGE:
+ if (HText_canScrollDown())
+ Newline_partial += display_lines;
+ break;
+ case LYK_UP_HALF:
+ if (Newline_partial > 1)
+ Newline_partial -= (display_lines / 2);
+ break;
+ case LYK_DOWN_HALF:
+ if (HText_canScrollDown())
+ Newline_partial += (display_lines / 2);
+ break;
+ case LYK_UP_TWO:
+ if (Newline_partial > 1)
+ Newline_partial -= 2;
+ break;
+ case LYK_DOWN_TWO:
+ if (HText_canScrollDown())
+ Newline_partial += 2;
+ break;
+ case LYK_HOME:
+ if (Newline_partial > 1)
+ Newline_partial = 1;
+ break;
+ case LYK_END:
+ if (HText_canScrollDown())
+ Newline_partial = HText_getNumOfLines() - display_lines + 1;
+ /* calculate for "current" bottom value */
+ break;
+ case LYK_REFRESH:
+ break;
+ default:
+ /** Other or no keystrokes **/
+ return ((int) FALSE);
+ } /* end switch */
+ if (Newline_partial < 1)
+ Newline_partial = 1;
+ if (LYMainLoop_pageDisplay(Newline_partial))
+ NumOfLines_partial = HText_getNumOfLines();
+ }
+#endif /* DISP_PARTIAL */
+ break;
+ } /* end switch */
+ /** Other or no keystrokes **/
+ return ((int) FALSE);
+}
+
+/*
+ * Check if the given filename looks like it's an absolute pathname, i.e.,
+ * references a directory.
+ */
+BOOLEAN LYisAbsPath(const char *path)
+{
+ BOOLEAN result = FALSE;
+
+ if (non_empty(path)) {
+#ifdef VMS
+ result = TRUE;
+#else
+#if defined(USE_DOS_DRIVES)
+ result = (BOOLEAN) (LYIsPathSep(path[0])
+ || (LYIsDosDrive(path)
+ && LYIsPathSep(path[2])));
+#else
+ result = (BOOLEAN) (LYIsPathSep(path[0]));
+#endif /* USE_DOS_DRIVES */
+#endif
+ }
+ return result;
+}
+
+/*
+ * Check if the given filename is the root path, e.g., "/" on Unix.
+ */
+BOOLEAN LYisRootPath(const char *path)
+{
+#if defined(USE_DOS_DRIVES)
+ if (strlen(path) == 3
+ && LYIsDosDrive(path)
+ && LYIsPathSep(path[2]))
+ return TRUE;
+#endif
+ return (BOOL) ((strlen(path) == 1) && LYIsPathSep(path[0]));
+}
+
+/*
+ * A file URL for a remote host is an obsolete ftp URL.
+ * Return YES only if we're certain it's a local file. - FM
+ */
+BOOLEAN LYisLocalFile(const char *filename)
+{
+ char *host = NULL;
+ char *acc_method = NULL;
+ char *cp;
+
+ if (!filename)
+ return NO;
+ if (!(host = HTParse(filename, "", PARSE_HOST)))
+ return NO;
+ if (!*host) {
+ FREE(host);
+ return NO;
+ }
+
+ if ((cp = StrChr(host, ':')) != NULL)
+ *cp = '\0';
+
+ if ((acc_method = HTParse(filename, "", PARSE_ACCESS))) {
+ if (0 == strcmp("file", acc_method) &&
+ (0 == strcmp(host, "localhost") ||
+ LYSameFilename(host, HTHostName()))) {
+ FREE(host);
+ FREE(acc_method);
+ return YES;
+ }
+ }
+
+ FREE(host);
+ FREE(acc_method);
+ return NO;
+}
+
+/*
+ * Utility for checking URLs with a host field. Return YES only if we're
+ * certain it's the local host. - FM
+ */
+BOOLEAN LYisLocalHost(const char *filename)
+{
+ char *host = NULL;
+ char *cp;
+
+ if (!filename)
+ return NO;
+ if (!(host = HTParse(filename, "", PARSE_HOST)))
+ return NO;
+ if (!*host) {
+ FREE(host);
+ return NO;
+ }
+
+ if ((cp = StrChr(host, ':')) != NULL)
+ *cp = '\0';
+
+ if ((LYSameFilename(host, "localhost") ||
+ LYSameFilename(host, LYHostName) ||
+ LYSameFilename(host, HTHostName()))) {
+ FREE(host);
+ return YES;
+ }
+
+ FREE(host);
+ return NO;
+}
+
+/*
+ * Free an HTList that contains strings.
+ */
+void LYFreeStringList(HTList *list)
+{
+ if (list != NULL) {
+ char *argument;
+ HTList *cur = list;
+
+ while (NULL != (argument = (char *) HTList_nextObject(cur))) {
+ FREE(argument);
+ }
+ HTList_delete(list);
+ }
+}
+
+/*
+ * Utility for freeing the list of local host aliases. - FM
+ */
+void LYLocalhostAliases_free(void)
+{
+ LYFreeStringList(localhost_aliases);
+ localhost_aliases = NULL;
+}
+
+/*
+ * Utility for listing hosts to be treated as local aliases. - FM
+ */
+void LYAddLocalhostAlias(char *alias)
+{
+ char *LocalAlias = NULL;
+
+ if (!non_empty(alias))
+ return;
+
+ if (!localhost_aliases) {
+ localhost_aliases = HTList_new();
+#ifdef LY_FIND_LEAKS
+ atexit(LYLocalhostAliases_free);
+#endif
+ }
+
+ StrAllocCopy(LocalAlias, alias);
+ HTList_addObject(localhost_aliases, LocalAlias);
+
+ return;
+}
+
+/*
+ * Utility for checking URLs with a host field. Return YES only if we've
+ * listed the host as a local alias. - FM
+ */
+BOOLEAN LYisLocalAlias(const char *filename)
+{
+ char *host = NULL;
+ char *alias;
+ char *cp;
+ HTList *cur = localhost_aliases;
+
+ if (!cur || !filename)
+ return NO;
+ if (!(host = HTParse(filename, "", PARSE_HOST)))
+ return NO;
+ if (!(*host)) {
+ FREE(host);
+ return NO;
+ }
+
+ if ((cp = StrChr(host, ':')) != NULL)
+ *cp = '\0';
+
+ while (NULL != (alias = (char *) HTList_nextObject(cur))) {
+ if (LYSameFilename(host, alias)) {
+ FREE(host);
+ return YES;
+ }
+ }
+
+ FREE(host);
+ return NO;
+}
+
+/*
+ * This function checks for a URL with an unknown scheme,
+ * but for which proxying has been set up, and if so,
+ * returns PROXY_URL_TYPE. - FM
+ *
+ * If a colon is present but the string segment which
+ * precedes it is not being proxied, and we can be sure
+ * that what follows the colon is not a port field,
+ * it returns UNKNOWN_URL_TYPE. Otherwise, it returns
+ * 0 (not a URL). - FM
+ */
+UrlTypes LYCheckForProxyURL(char *filename)
+{
+ char *cp = filename;
+ char *cp1;
+ char *cp2 = NULL;
+
+ /*
+ * Don't crash on an empty argument.
+ */
+ if (isEmpty(cp))
+ return (NOT_A_URL_TYPE);
+
+ /* kill beginning spaces */
+ cp = LYSkipBlanks(cp);
+
+ /*
+ * Check for a colon, and if present,
+ * see if we have proxying set up.
+ */
+ if ((cp1 = StrChr((cp + 1), ':')) != NULL) {
+ if ((cp2 = StrChr((cp + 1), '/')) != NULL && cp2 < cp1)
+ return (NOT_A_URL_TYPE);
+ *cp1 = '\0';
+ cp2 = NULL;
+ StrAllocCopy(cp2, cp);
+ *cp1 = ':';
+ StrAllocCat(cp2, "_proxy");
+ if (LYGetEnv(cp2) != NULL) {
+ FREE(cp2);
+ return (PROXY_URL_TYPE);
+ }
+ FREE(cp2);
+#if defined (USE_DOS_DRIVES)
+ if (LYIsDosDrive(cp))
+ return (NOT_A_URL_TYPE);
+#endif
+ cp1++;
+ if (!*cp) {
+ return (NOT_A_URL_TYPE);
+ } else if (isdigit(UCH(*cp1))) {
+ while (*cp1 && isdigit(UCH(*cp1)))
+ cp1++;
+ if (*cp1 && !LYIsHtmlSep(*cp1))
+ return (UNKNOWN_URL_TYPE);
+ } else {
+ return (UNKNOWN_URL_TYPE);
+ }
+ }
+
+ return (NOT_A_URL_TYPE);
+}
+
+/*
+ * Compare a "type:" string, replacing it by the comparison-string if it
+ * matches (and return true in that case).
+ */
+static BOOLEAN compare_type(char *tst,
+ const char *cmp,
+ size_t len)
+{
+ if (!strncasecomp(tst, cmp, (int) len)) {
+ if (StrNCmp(tst, cmp, len)) {
+ size_t i;
+
+ for (i = 0; i < len; i++)
+ tst[i] = cmp[i];
+ }
+ return TRUE;
+ }
+ return FALSE;
+}
+#define CompareType(tst,cmp,len) compare_type((tst),(cmp),(size_t)(len))
+
+#define DoubleHtmlSep(s) (LYIsHtmlSep((s)[0]) && LYIsHtmlSep((s)[1]))
+#define compare_two(tst,cmp,len,limit) \
+ ((len + 2) <= limit \
+ && DoubleHtmlSep(tst + len) \
+ && CompareType(tst, cmp, len))
+
+/*
+ * Must recognize a URL and return the type. If recognized, based on a
+ * case-insensitive analysis of the scheme field, ensures that the scheme field
+ * has the expected case.
+ *
+ * Returns 0 (not a URL) for a NULL argument, one which lacks a colon.
+ *
+ * Chains to LYCheckForProxyURL() if a colon is present but the type is not
+ * recognized.
+ */
+UrlTypes is_url(char *filename)
+{
+ char *cp = filename;
+ char *cp1;
+ UrlTypes result = NOT_A_URL_TYPE;
+ int limit;
+
+ /*
+ * Don't crash on an empty argument.
+ */
+ if (isEmpty(cp))
+ return (result);
+
+ /*
+ * Can't be a URL if it lacks a colon and if it starts with '[' it's
+ * probably IPv6 address.
+ */
+ if (NULL == StrChr(cp, ':') || cp[0] == '[')
+ return (result);
+
+ /*
+ * Kill beginning spaces.
+ */
+ cp = LYSkipBlanks(cp);
+
+ /*
+ * Can't be a URL if it starts with a slash. So return immediately for
+ * this common case, also to avoid false positives if there was a colon
+ * later in the string. Also can't be a URL if it starts with a colon. -
+ * KW
+ */
+ if (*cp == ':' || LYIsHtmlSep(*cp)) {
+ result = NOT_A_URL_TYPE;
+
+ } else {
+ limit = (int) strlen(cp);
+ switch (*cp) {
+ case 'L':
+ case 'l':
+ /*
+ * Lynx internal pages ("LYNXfoo:" or "lynxfoo:") start with 'l' or
+ * 'L', other URLs aren't.
+ */
+ if (CompareType(cp, STR_LYNXEXEC, LEN_LYNXEXEC)) {
+ /*
+ * Special External Lynx type to handle execution of commands
+ * or scripts which require a pause to read the screen upon
+ * completion.
+ */
+ result = LYNXEXEC_URL_TYPE;
+
+ } else if (CompareType(cp, STR_LYNXPROG, LEN_LYNXPROG)) {
+ /*
+ * Special External Lynx type to handle execution of commands,
+ * scripts or programs which do not require a pause to read
+ * screen upon completion.
+ */
+ result = LYNXPROG_URL_TYPE;
+
+ } else if (CompareType(cp, STR_LYNXCGI, LEN_LYNXCGI)) {
+ result = LYNXCGI_URL_TYPE;
+
+ } else if (CompareType(cp, STR_LYNXPRINT, LEN_LYNXPRINT)) {
+ result = LYNXPRINT_URL_TYPE;
+
+ } else if (CompareType(cp, STR_LYNXOPTIONS, LEN_LYNXOPTIONS)) {
+ result = LYNXOPTIONS_URL_TYPE;
+
+ } else if (CompareType(cp, STR_LYNXCFG, LEN_LYNXCFG)) {
+ result = LYNXCFG_URL_TYPE;
+
+ } else if (CompareType(cp, STR_LYNXMESSAGES, LEN_LYNXMESSAGES)) {
+ result = LYNXMESSAGES_URL_TYPE;
+
+ } else if (CompareType(cp, STR_LYNXCFLAGS, LEN_LYNXCFLAGS)) {
+ result = LYNXCOMPILE_OPTS_URL_TYPE;
+
+ } else if (CompareType(cp, STR_LYNXDOWNLOAD, LEN_LYNXDOWNLOAD)) {
+ result = LYNXDOWNLOAD_URL_TYPE;
+
+ } else if (CompareType(cp, STR_LYNXDIRED, LEN_LYNXDIRED)) {
+ result = LYNXDIRED_URL_TYPE;
+
+ } else if (CompareType(cp, STR_LYNXEDITMAP, LEN_LYNXEDITMAP)) {
+ result = LYNXEDITMAP_URL_TYPE;
+
+ } else if (CompareType(cp, STR_LYNXHIST, LEN_LYNXHIST)) {
+ result = LYNXHIST_URL_TYPE;
+
+#ifdef USE_CACHEJAR
+ } else if (CompareType(cp, STR_LYNXCACHE, LEN_LYNXCACHE)) {
+ result = LYNXCACHE_URL_TYPE;
+#endif
+ } else if (CompareType(cp, STR_LYNXKEYMAP, LEN_LYNXKEYMAP)) {
+ result = LYNXKEYMAP_URL_TYPE;
+
+ } else if (CompareType(cp, STR_LYNXIMGMAP, LEN_LYNXIMGMAP)) {
+ /* force lower/uppercase of next part */
+ (void) is_url(&cp[LEN_LYNXIMGMAP]);
+ result = LYNXIMGMAP_URL_TYPE;
+
+ } else if (CompareType(cp, STR_LYNXCOOKIE, LEN_LYNXCOOKIE)) {
+ result = LYNXCOOKIE_URL_TYPE;
+
+ }
+ break;
+#ifndef DISABLE_NEWS
+ /*
+ * NEWSfoo: schemes -
+ */
+ case 'N':
+ case 'n':
+ if (CompareType(cp, STR_NEWS_URL, LEN_NEWS_URL)) {
+ result = NEWS_URL_TYPE;
+
+ } else if (CompareType(cp, STR_NNTP_URL, LEN_NNTP_URL)) {
+ result = NNTP_URL_TYPE;
+
+ } else if (CompareType(cp, "newspost:", 9)) {
+ /*
+ * Special Lynx type to handle news posts.
+ */
+ result = NEWSPOST_URL_TYPE;
+
+ } else if (CompareType(cp, "newsreply:", 10)) {
+ /*
+ * Special Lynx type to handle news replies (followups).
+ */
+ result = NEWSREPLY_URL_TYPE;
+ }
+ break;
+
+ /*
+ * SNEWSfoo: schemes -
+ */
+ case 'S':
+ case 's':
+ if (CompareType(cp, STR_SNEWS_URL, LEN_SNEWS_URL)) {
+ result = SNEWS_URL_TYPE;
+
+ } else if (CompareType(cp, "snewspost:", 10)) {
+ /*
+ * Special Lynx type to handle snews posts.
+ */
+ result = NEWSPOST_URL_TYPE;
+
+ } else if (CompareType(cp, "snewsreply:", 11)) {
+ /*
+ * Special Lynx type to handle snews replies (followups).
+ */
+ result = NEWSREPLY_URL_TYPE;
+ }
+ break;
+#endif
+ case 'M':
+ case 'm':
+ if (CompareType(cp, STR_MAILTO_URL, LEN_MAILTO_URL)) {
+ result = MAILTO_URL_TYPE;
+ }
+ break;
+
+ case 'F':
+ case 'f':
+ if (CompareType(cp, STR_FILE_URL, LEN_FILE_URL)) {
+ if (LYisLocalFile(cp)) {
+ result = FILE_URL_TYPE;
+ } else if (DoubleHtmlSep(cp + LEN_FILE_URL)) {
+ result = FTP_URL_TYPE;
+ }
+ }
+#ifndef DISABLE_FTP
+ else if (compare_two(cp, STR_FTP_URL, LEN_FTP_URL, limit)) {
+ result = FTP_URL_TYPE;
+ }
+#endif
+#ifndef DISABLE_FINGER
+ else if (compare_two(cp, STR_FINGER_URL, LEN_FINGER_URL, limit)) {
+ result = FINGER_URL_TYPE;
+ }
+#endif
+ break;
+
+ case 'B':
+ case 'b':
+#ifndef DISABLE_BIBP
+ if (CompareType(cp, STR_BIBP_URL, LEN_BIBP_URL)) {
+ result = BIBP_URL_TYPE;
+ }
+#endif
+ break;
+
+ case 'D':
+ case 'd':
+ if (CompareType(cp, "data:", 5)) {
+ result = DATA_URL_TYPE;
+ }
+ break;
+
+ default:
+ if (limit >= 3
+ && ((cp1 = StrChr(cp + 3, ':')) == NULL
+ || !DoubleHtmlSep(cp1 + 1))) {
+ /*
+ * If it doesn't contain "://", and it's not one of the the
+ * above, it can't be a URL with a scheme we know, so check if
+ * it's an unknown scheme for which proxying has been set up.
+ * - FM
+ */
+ if (cp1 != NULL
+ && (cp1 - cp) > 1 /* exclude DOS-style device:/path */
+ && LYisAbsPath(cp1 + 1)) {
+ result = NCFTP_URL_TYPE;
+ }
+
+ } else {
+ switch (*cp) {
+ case 'H':
+ case 'h':
+ if (CompareType(cp, STR_HTTP_URL, LEN_HTTP_URL)) {
+ result = HTTP_URL_TYPE;
+
+ } else if (CompareType(cp, STR_HTTPS_URL, LEN_HTTPS_URL)) {
+ result = HTTPS_URL_TYPE;
+ }
+ break;
+
+#ifndef DISABLE_GOPHER
+ case 'G':
+ case 'g':
+ if (CompareType(cp, STR_GOPHER_URL, LEN_GOPHER_URL)) {
+ if (strlen(cp) >= 11
+ && (cp1 = StrChr(cp + 11, '/')) != NULL) {
+
+ if (TOUPPER(*(cp1 + 1)) == 'H' || *(cp1 + 1) == 'w')
+ /* if this is a gopher html type */
+ result = HTML_GOPHER_URL_TYPE;
+ else if (*(cp1 + 1) == 'T' || *(cp1 + 1) == '8')
+ result = TELNET_GOPHER_URL_TYPE;
+ else if (*(cp1 + 1) == '7')
+ result = INDEX_GOPHER_URL_TYPE;
+ else
+ result = GOPHER_URL_TYPE;
+ } else {
+ result = GOPHER_URL_TYPE;
+ }
+ }
+ break;
+#endif
+ case 'W':
+ case 'w':
+ if (CompareType(cp, STR_WAIS_URL, LEN_WAIS_URL)) {
+ result = WAIS_URL_TYPE;
+ }
+ break;
+
+ case 'T':
+ case 't':
+ if (CompareType(cp, STR_TELNET_URL, LEN_TELNET_URL)) {
+ result = TELNET_URL_TYPE;
+
+ } else if (CompareType(cp, STR_TN3270_URL, LEN_TN3270_URL)) {
+ result = TN3270_URL_TYPE;
+ }
+ break;
+
+ case 'R':
+ case 'r':
+ if (CompareType(cp, STR_RLOGIN_URL, LEN_RLOGIN_URL)) {
+ result = RLOGIN_URL_TYPE;
+ }
+ break;
+
+ case 'C':
+ case 'c':
+ if (CompareType(cp, STR_CSO_URL, LEN_CSO_URL)) {
+ result = CSO_URL_TYPE;
+ }
+ break;
+
+ case 'A':
+ case 'a':
+ if (CompareType(cp, "afs:", 4)) {
+ result = AFS_URL_TYPE;
+ }
+ break;
+
+ case 'P':
+ case 'p':
+ if (CompareType(cp, "prospero:", 9)) {
+ result = PROSPERO_URL_TYPE;
+ }
+ break;
+ }
+ }
+ }
+ /*
+ * Check if it is an unknown scheme for which proxying has been set up.
+ */
+ if (result == NOT_A_URL_TYPE)
+ result = LYCheckForProxyURL(filename);
+ }
+ return result;
+}
+
+/*
+ * Sometimes it is just expected that curses is on when an alert or other
+ * statusline message needs to be shown and we are not just dumping
+ * immediately. Calling this will 'fix' it, but may not always be appropriate.
+ * - kw
+ */
+void LYFixCursesOn(const char *reason)
+{
+ if (dump_output_immediately || LYCursesON)
+ return;
+ if (reason) {
+ CTRACE((tfp, "Forcing curses on to %s\n", reason));
+ }
+ start_curses();
+}
+
+/*
+ * Most protocol modules called through HTLoad* expect that curses is on unless
+ * dump_output_immediately is set, so that statusline messages can be shown.
+ * Some protocols expect the opposite, namely telnet and friends. This
+ * function should be called after the 'physical' URL for accessing addr has
+ * been established. It does the right thing to the degree that curses is
+ * turned on for known problem cases. In any normal circumstances this should
+ * never apply, but proxying or rule substitution is not prevented for
+ * telnet-like URLs, and this 'fix' avoids some crashes that can otherwise
+ * occur. - kw
+ */
+BOOLEAN LYFixCursesOnForAccess(const char *addr,
+ const char *physical)
+{
+ /*
+ * If curses is off when maybe it shouldn't...
+ */
+ if (!dump_output_immediately && !LYCursesON && physical) {
+ char *cp1;
+
+ /*
+ * If requested resource wants to be accessed with curses off, and
+ * getfile() would indeed have turned curses off for it...
+ */
+ if (strstr(addr, "://") != NULL &&
+ (isTELNET_URL(addr) ||
+ isRLOGIN_URL(addr) ||
+ isTN3270_URL(addr) ||
+ (!isGOPHER_URL(addr) &&
+ (cp1 = StrChr(addr + 11, '/')) != NULL &&
+ (*(cp1 + 1) == 'T' || *(cp1 + 1) == '8')))) {
+ /*
+ * If actual access that will be done is ok with curses off, then
+ * do nothing special, else force curses on. - kw
+ */
+ if (!isTELNET_URL(physical) &&
+ !isRLOGIN_URL(physical) &&
+ !isTN3270_URL(physical)) {
+ start_curses();
+ HTAlert(gettext("Unexpected access protocol for this URL scheme."));
+ return TRUE;
+ }
+ }
+ }
+ return FALSE;
+}
+
+/*
+ * Determine whether we allow HEAD and related flags for a URL. - kw
+ */
+BOOLEAN LYCanDoHEAD(const char *address)
+{
+ char *temp0 = NULL;
+ int isurl;
+
+ if (!non_empty(address))
+ return FALSE;
+ if (!StrNCmp(address, "http", 4))
+ return TRUE;
+ /* Make copy for is_url() since caller may not care for case changes */
+ StrAllocCopy(temp0, address);
+ isurl = is_url(temp0);
+ if (!isurl) {
+ FREE(temp0);
+ return FALSE;
+ }
+ if (isurl == LYNXCGI_URL_TYPE) {
+ FREE(temp0);
+#if defined(LYNXCGI_LINKS) && !defined(VMS)
+ return TRUE;
+#else
+ return FALSE;
+#endif
+ }
+ /*
+ * The idea of the following is to allow HEAD for news URLs that identify
+ * single articles, not those that identify ranges of articles or groups or
+ * a list of groups. - kw
+ */
+ if (isurl == NEWS_URL_TYPE || isurl == NNTP_URL_TYPE) {
+ char *temp = HTParse(address, "", PARSE_PATH);
+ char *cp = strrchr(temp, '/');
+
+ if (StrChr((cp ? cp : temp), '@') != NULL) {
+ FREE(temp0);
+ FREE(temp);
+ return TRUE;
+ }
+ if (cp && isdigit(UCH(cp[1])) && StrChr(cp, '-') == NULL) {
+ FREE(temp0);
+ FREE(temp);
+ return TRUE;
+ }
+ FREE(temp);
+ }
+#define ALLOW_PROXY_HEAD
+/* If defined, also allow head requests for URLs proxied through the "http" or
+ * "lynxcgi" protocols, which understand HEAD. Only the proxy environment
+ * variables are checked, not the HTRules system. - kw
+ */
+#ifdef ALLOW_PROXY_HEAD
+ if (isurl != FILE_URL_TYPE) {
+ char *acc_method = HTParse(temp0, "", PARSE_ACCESS);
+
+ if (non_empty(acc_method)) {
+ char *proxy;
+
+ StrAllocCat(acc_method, "_proxy");
+ proxy = LYGetEnv(acc_method);
+ if (proxy && (isHTTP_URL(proxy) ||
+ isLYNXCGI(proxy)) &&
+ !override_proxy(temp0)) {
+ FREE(temp0);
+ FREE(acc_method);
+ return TRUE;
+ }
+ }
+ FREE(acc_method);
+ }
+#endif /* ALLOW_PROXY_HEAD */
+
+ FREE(temp0);
+ return FALSE;
+}
+
+/*
+ * Close an input file.
+ */
+BOOLEAN LYCloseInput(FILE *fp)
+{
+ int result = FALSE;
+
+ if (fp != 0) {
+ int err = ferror(fp);
+ LY_TEMP *p = FindTempfileByFP(fp);
+
+ fclose(fp);
+ if (p != 0) {
+ p->file = 0;
+ }
+ if (!err) {
+ result = TRUE;
+ }
+ }
+ return (BOOLEAN) result;
+}
+
+/*
+ * Close an output file, reporting any problems with writing to it.
+ */
+BOOLEAN LYCloseOutput(FILE *fp)
+{
+ int result = FALSE;
+
+ if (fp != 0) {
+ int err = ferror(fp);
+ LY_TEMP *p = FindTempfileByFP(fp);
+
+ fclose(fp);
+ if (p != 0) {
+ p->file = 0;
+ }
+ if (!err) {
+ result = TRUE;
+ }
+ }
+ if (!result) {
+ HTAlert(CANNOT_WRITE_TO_FILE);
+ }
+ return (BOOLEAN) result;
+}
+
+/*
+ * Test if we'll be able to write a file. If not, warn the user.
+ */
+BOOLEAN LYCanWriteFile(const char *filename)
+{
+ BOOLEAN result = FALSE;
+
+ if (LYCloseOutput(fopen(filename, "w"))) {
+ if (remove(filename) == 0) {
+ result = TRUE;
+ }
+ } else {
+ _statusline(NEW_FILENAME_PROMPT);
+ }
+ return result;
+}
+
+/*
+ * Test if we'll be able to read a file.
+ */
+BOOLEAN LYCanReadFile(const char *filename)
+{
+ FILE *fp;
+ BOOLEAN result = FALSE;
+
+ if (non_empty(filename)) {
+ if ((fp = fopen(filename, "r")) != 0) {
+ result = LYCloseInput(fp);
+ }
+ }
+ return result;
+}
+
+char *LYFindConfigFile(const char *nominal, const char *dftfile)
+{
+ char *result = 0;
+ char *path = 0;
+ char *head = 0;
+ char *leaf;
+ char *item;
+
+ if (non_empty(nominal)) {
+ StrAllocCopy(result, nominal);
+
+ /*
+ * Look for it in as-is - first expanding any tilde.
+ */
+ LYTildeExpand(&result, TRUE);
+ if (!LYCanReadFile(result)) {
+ const char *cfg_path;
+ char *list = 0;
+ BOOLEAN found = FALSE;
+
+ /*
+ * Now try in the config-path.
+ */
+ if ((cfg_path = LYGetEnv("LYNX_CFG_PATH")) == NULL)
+ cfg_path = LYNX_CFG_PATH;
+
+ StrAllocCopy(list, cfg_path);
+ path = list;
+ while ((item = LYstrsep(&path, PATH_SEPARATOR)) != 0) {
+ if (isEmpty(item))
+ continue;
+ FREE(result);
+ HTSprintf0(&result, "%s%s%s", item, FILE_SEPARATOR, nominal);
+ LYTildeExpand(&result, TRUE);
+ if (LYCanReadFile(result)) {
+ found = TRUE;
+ break;
+ }
+ }
+ FREE(list);
+
+ if (!found) {
+ /*
+ * If not found, try finding it in the same directory as the
+ * compiled-in location of the default file.
+ */
+ StrAllocCopy(head, dftfile);
+ if (strcmp(nominal, dftfile) &&
+ (leaf = LYPathLeaf(head)) != head) {
+
+ head[leaf - head] = '\0';
+ StrAllocCopy(result, head);
+ StrAllocCat(result, nominal);
+
+ if (!LYCanReadFile(result)) {
+ FREE(result);
+ }
+ }
+#ifdef USE_PROGRAM_DIR
+ else {
+ /*
+ * Finally, try in the same directory as the executable.
+ */
+ StrAllocCopy(result, program_dir);
+ LYAddPathSep(&result);
+ StrAllocCat(result, nominal);
+ LYTildeExpand(&result, TRUE);
+ if (!LYCanReadFile(result)) {
+ FREE(result);
+ }
+ }
+#endif
+ }
+ }
+
+ }
+ FREE(head);
+ return result;
+}
+
+/*
+ * Remove backslashes from any string.
+ */
+void remove_backslashes(char *buf)
+{
+ char *cp;
+
+ for (cp = buf; *cp != '\0'; cp++) {
+
+ if (*cp != '\\') { /* don't print slashes */
+ *buf = *cp;
+ buf++;
+ } else if (*cp == '\\' && /* print one slash if there */
+ *(cp + 1) == '\\') { /* are two in a row */
+ *buf = *cp;
+ buf++;
+ }
+ }
+ *buf = '\0';
+ return;
+}
+
+/*
+ * Checks to see if the current process is attached via a terminal in the local
+ * domain.
+ */
+BOOLEAN inlocaldomain(void)
+{
+ BOOLEAN result = TRUE;
+
+#ifdef HAVE_UTMP
+ int n;
+ FILE *fp;
+ struct utmp me;
+ char *cp, *mytty = NULL;
+
+ if ((cp = ttyname(0))) {
+ mytty = cp;
+ if (!strncmp(mytty, "/dev/", 5)) {
+ mytty += 5; /* pty's can be like "pts/0" in utmp */
+ } else {
+ if ((mytty = LYLastPathSep(cp)) != 0)
+ ++mytty;
+ }
+ }
+
+ result = FALSE;
+ if (mytty && (fp = fopen(UTMP_FILE, "r")) != NULL) {
+ size_t ulen = strlen(mytty);
+
+ if (ulen > sizeof(me.ut_line))
+ ulen = sizeof(me.ut_line);
+ do {
+ n = (int) fread((char *) &me, sizeof(struct utmp), (size_t) 1, fp);
+
+ if (n <= 0)
+ break;
+ } while (memcmp(me.ut_line, mytty, ulen));
+ (void) LYCloseInput(fp);
+
+ if (n > 0) {
+ for (ulen = 0; ulen < sizeof(me.ut_host); ++ulen) {
+ if (me.ut_host[ulen] == '\0')
+ break;
+ }
+ if (ulen > strlen(LYLocalDomain) &&
+ !memcmp(LYLocalDomain,
+ me.ut_host + ulen - strlen(LYLocalDomain),
+ strlen(LYLocalDomain))) {
+ result = TRUE;
+ }
+#ifdef LINUX
+ /* Linux fix to check for local user. J.Cullen 11Jul94 */
+ else if (ulen == 0) {
+ result = TRUE;
+ }
+#endif /* LINUX */
+ }
+
+ } else {
+ CTRACE((tfp,
+ "Could not get ttyname (returned %s) or open UTMP file %s\n",
+ NONNULL(cp), UTMP_FILE));
+ }
+#else
+ CTRACE((tfp, "LYUtils: inlocaldomain() not supported.\n"));
+#endif /* HAVE_UTMP */
+ return (result);
+}
+
+#ifdef HAVE_SIGACTION
+/*
+ * An extended alternative for calling signal(), sets some flags for signal
+ * handler as we want them if that functionality is available. (We don't
+ * return anything from this function since the return value would currently be
+ * ignored anyway.) - kw
+ */
+void LYExtSignal(int sig,
+ LYSigHandlerFunc_t *handler)
+{
+#ifdef SIGWINCH
+ /* add more cases to if(condition) if required... */
+ if (sig == SIGWINCH && LYNonRestartingSIGWINCH) {
+ struct sigaction act;
+
+ act.sa_handler = handler;
+ sigemptyset(&act.sa_mask);
+ act.sa_flags = 0;
+ sigaction(sig, &act, NULL);
+ } else
+#endif /* defined(SIGWINCH) */
+ signal(sig, handler);
+}
+#endif /* HAVE_SIGACTION */
+
+#if defined(SIGTSTP) && !defined(USE_SLANG)
+#ifdef HAVE_SIGACTION
+/*
+ * For switching a signal's handling between SIG_DFL and something (possibly)
+ * different that may have been set up by lynx code or e.g. by curses library.
+ * Uses sigaction to preserve / restore as much state as possible.
+ *
+ * Second arg is where to save or restore from.
+ *
+ * Third arg to_dfl specifies what to do:
+ * 1 Save current state in where, set handling to SIG_DFL
+ * 0 Restore current state to previously saved one in where
+ *
+ * Currently only used for SIGTSTP without SLANG, to prevent (n)curses signal
+ * handler from running while lynx is waiting in system() for an interactive
+ * command like an editor. - kw
+ */
+static BOOLEAN LYToggleSigDfl(int sig,
+ struct sigaction *where,
+ int to_dfl)
+{
+ int rv = -1;
+ struct sigaction oact;
+
+ if (to_dfl == 1) {
+ rv = sigaction(sig, NULL, &oact);
+ if (rv == 0) {
+ if (oact.sa_handler != SIG_DFL) {
+ oact.sa_handler = SIG_DFL;
+ rv = sigaction(sig, &oact, where);
+ } else if (where) {
+ memcpy(where, &oact, sizeof(oact));
+ rv = 0;
+ }
+ }
+ } else {
+ rv = sigaction(sig, where, NULL);
+ }
+ if (rv != 0) {
+ CTRACE((tfp, "Error in LYToggleSigDfl: %s\n", LYStrerror(errno)));
+ return FALSE;
+ } else
+ return TRUE;
+}
+#endif /* HAVE_SIGACTION */
+#endif /* SIGTSTP && !USE_SLANG */
+
+/**************
+ * This bit of code catches window size change signals
+ */
+
+#ifdef HAVE_SYS_IOCTL_H
+#include <sys/ioctl.h>
+#endif
+
+/* For systems that have both, but both can't be included, duh (or neither) */
+/* FIXME: this whole chunk may be redundant */
+#ifdef TERMIO_AND_CURSES
+# ifdef TERMIO_AND_TERMIOS
+# include <termio.h>
+# else
+# ifdef HAVE_TERMIOS_H
+# include <termios.h>
+# else
+# ifdef HAVE_TERMIO_H
+# include <termio.h>
+# endif /* HAVE_TERMIO_H */
+# endif /* HAVE_TERMIOS_H */
+# endif /* TERMIO_AND_TERMIOS */
+#endif /* TERMIO_AND_CURSES */
+
+void size_change(int sig GCC_UNUSED)
+{
+ int old_lines = LYlines;
+ int old_cols = LYcols;
+
+#ifdef USE_SLANG
+#if defined(VMS) || defined(UNIX)
+ SLtt_get_screen_size();
+#endif /* VMS || UNIX */
+ LYlines = SLtt_Screen_Rows;
+ LYcols = SLtt_Screen_Cols;
+ if (sig == 0)
+ /*
+ * Called from start_curses().
+ */
+ return;
+#else /* Curses: */
+#ifdef HAVE_SIZECHANGE
+#ifdef TIOCGSIZE
+ struct ttysize win;
+
+#else
+#ifdef TIOCGWINSZ
+ struct winsize win;
+#endif /* TIOCGWINSZ */
+#endif /* TIOCGSIZE */
+
+#ifdef TIOCGSIZE
+ if (ioctl(0, TIOCGSIZE, &win) == 0) {
+ if (win.ts_lines != 0) {
+ LYlines = win.ts_lines;
+ }
+ if (win.ts_cols != 0) {
+ LYcols = win.ts_cols;
+ }
+ }
+#else
+#ifdef TIOCGWINSZ
+ if (ioctl(0, (long) TIOCGWINSZ, &win) == 0) {
+ if (win.ws_row != 0) {
+ LYlines = win.ws_row;
+ }
+ if (win.ws_col != 0) {
+ LYcols = win.ws_col;
+ }
+ }
+#endif /* TIOCGWINSZ */
+#endif /* TIOCGSIZE */
+#endif /* HAVE_SIZECHANGE */
+
+#ifdef __EMX__
+ {
+ int scrsize[2];
+
+ _scrsize(scrsize);
+ LYcols = scrsize[0];
+ LYlines = scrsize[1];
+ }
+#endif
+
+ if (LYlines <= 0)
+ LYlines = DFT_ROWS;
+ if (LYcols <= 0)
+ LYcols = DFT_COLS;
+#endif /* USE_SLANG */
+
+ /*
+ * Check if the screen size has actually changed. - AJL
+ */
+ if (LYlines != old_lines || LYcols != old_cols) {
+ recent_sizechange = TRUE;
+ CTRACE((tfp, "Window size changed from (%d,%d) to (%d,%d)\n",
+ old_lines, old_cols, LYlines, LYcols));
+#if defined(CAN_SWITCH_DISPLAY_CHARSET) && defined(CAN_AUTODETECT_DISPLAY_CHARSET)
+ /* May need to reload the font due to different char-box size */
+ if (current_char_set != auto_display_charset)
+ Switch_Display_Charset(current_char_set, SWITCH_DISPLAY_CHARSET_RESIZE);
+#endif
+ }
+#ifdef SIGWINCH
+ LYExtSignal(SIGWINCH, size_change);
+#endif /* SIGWINCH */
+
+ return;
+}
+
+/*
+ * Utility for freeing the list of previous suggested filenames. - FM
+ */
+void HTSugFilenames_free(void)
+{
+ LYFreeStringList(sug_filenames);
+ sug_filenames = NULL;
+}
+
+/*
+ * Utility for listing suggested filenames, making any repeated filenames the
+ * most current in the list. - FM
+ */
+void HTAddSugFilename(char *fname)
+{
+ char *tmp = NULL;
+ char *old;
+ HTList *cur;
+
+ if (!non_empty(fname))
+ return;
+
+ StrAllocCopy(tmp, fname);
+
+ if (!sug_filenames) {
+ sug_filenames = HTList_new();
+#ifdef LY_FIND_LEAKS
+ atexit(HTSugFilenames_free);
+#endif
+ HTList_addObject(sug_filenames, tmp);
+ return;
+ }
+
+ cur = sug_filenames;
+ while (NULL != (old = (char *) HTList_nextObject(cur))) {
+ if (!strcmp(old, tmp)) {
+ HTList_removeObject(sug_filenames, old);
+ FREE(old);
+ break;
+ }
+ }
+ HTList_addObject(sug_filenames, tmp);
+
+ return;
+}
+
+/*
+ * CHANGE_SUG_FILENAME -- Foteos Macrides 29-Dec-1993 Upgraded for use with
+ * Lynx2.2 - FM 17-Jan-1994
+ */
+void change_sug_filename(char *fname)
+{
+ const char *cp2;
+ char *temp = 0, *cp, *cp1, *end;
+
+#ifdef VMS
+ char *dot;
+ int j, k;
+#endif /* VMS */
+
+ /*
+ * Establish the current end of fname.
+ */
+ end = fname + strlen(fname);
+
+ /*
+ * Unescape fname.
+ */
+ HTUnEscape(fname);
+
+ /*
+ * Rename any temporary files.
+ */
+ cp2 = wwwName(lynx_temp_space);
+ if (LYIsHtmlSep(*cp2)) {
+ HTSprintf0(&temp, "file://localhost%s" PID_FMT, cp2, GETPID());
+ } else {
+ HTSprintf0(&temp, "file://localhost/%s" PID_FMT, cp2, GETPID());
+ }
+ if (!StrNCmp(fname, temp, strlen(temp))) {
+ if ((cp = strrchr(fname, '.')) != 0) {
+ if (strlen(cp) > (strlen(temp) - 4))
+ cp = NULL;
+ }
+ StrAllocCopy(temp, NonNull(cp));
+ sprintf(fname, "temp%.*s", LY_MAXPATH - 10, temp);
+ }
+ FREE(temp);
+
+ if (fname[strlen(fname) - 1] == '/')
+ /*
+ * Hmm... we have a directory name. It is annoying to see a
+ * scheme+host+path name as a suggested one, let's remove the
+ * last_slash and go ahead like we have a file name. - LP
+ */
+ fname[strlen(fname) - 1] = '\0';
+
+ /*
+ * Remove everything up the the last_slash if there is one.
+ */
+ if ((cp = strrchr(fname, '/')) != NULL && strlen(cp) > 1) {
+ cp1 = fname;
+ /*
+ * Go past the slash.
+ */
+ cp++;
+ for (; *cp != '\0'; cp++, cp1++) {
+ *cp1 = *cp;
+ }
+ *cp1 = '\0';
+ }
+#ifdef _WINDOWS /* 1998/05/05 (Tue) 10:08:05 */
+ if ((cp = strrchr(fname, '=')) != NULL && strlen(cp) > 1) {
+ cp1 = fname;
+ /*
+ * Go past the '='.
+ */
+ cp++;
+ for (; *cp != '\0'; cp++, cp1++) {
+ *cp1 = *cp;
+ }
+ *cp1 = '\0';
+ }
+#endif
+
+ /*
+ * Trim off date-size suffix, if present.
+ */
+ if ((*(end - 1) == ']') && ((cp = strrchr(fname, '[')) != NULL) &&
+ (cp > fname) && *(--cp) == ' ') {
+ while (*cp == ' ') {
+ *(cp--) = '\0';
+ }
+ }
+#ifdef VMS
+ /*
+ * Trim off VMS device and/or directory specs, if present.
+ */
+ if ((cp = StrChr(fname, '[')) != NULL &&
+ (cp1 = strrchr(cp, ']')) != NULL && strlen(cp1) > 1) {
+ cp1++;
+ for (cp = fname; *cp1 != '\0'; cp1++) {
+ *(cp++) = *cp1;
+ }
+ *cp = '\0';
+ }
+ /*
+ * Replace illegal or problem characters.
+ */
+ dot = fname + strlen(fname);
+ for (cp = fname; cp < dot; cp++) {
+ /*
+ * Replace with underscores.
+ */
+ if (*cp == ' ' || *cp == '/' || *cp == ':' ||
+ *cp == '[' || *cp == ']' || *cp == '&') {
+ *cp = '_';
+ /*
+ * Replace with dashes.
+ */
+ } else if (*cp == '!' || *cp == '?' || *cp == '\'' ||
+ *cp == ',' || *cp == ':' || *cp == '"' ||
+ *cp == '+' || *cp == '@' || *cp == '\\' ||
+ *cp == '(' || *cp == ')' || *cp == '=' ||
+ *cp == '<' || *cp == '>' || *cp == '#' ||
+ *cp == '%' || *cp == '*' || *cp == '`' ||
+ *cp == '~' || *cp == '^' || *cp == '|' ||
+ *cp < ' ' || (UCH(*cp)) > 126) {
+ *cp = '-';
+ }
+ }
+
+ /*
+ * Collapse any serial underscores.
+ */
+ cp = fname + 1;
+ j = 0;
+ while (cp < dot) {
+ if (fname[j] == '_' && *cp == '_') {
+ cp++;
+ } else {
+ fname[++j] = *cp++;
+ }
+ }
+ fname[++j] = '\0';
+
+ /*
+ * Collapse any serial dashes.
+ */
+ dot = fname + (strlen(fname));
+ cp = fname + 1;
+ j = 0;
+ while (cp < dot) {
+ if (fname[j] == '-' && *cp == '-') {
+ cp++;
+ } else {
+ fname[++j] = *cp++;
+ }
+ }
+ fname[++j] = '\0';
+
+ /*
+ * Trim any trailing or leading underscores or dashes.
+ */
+ cp = fname + (strlen(fname)) - 1;
+ while (*cp == '_' || *cp == '-') {
+ *cp-- = '\0';
+ }
+ if (fname[0] == '_' || fname[0] == '-') {
+ dot = fname + (strlen(fname));
+ cp = fname;
+ while ((*cp == '_' || *cp == '-') && cp < dot) {
+ cp++;
+ }
+ j = 0;
+ while (cp < dot) {
+ fname[j++] = *cp++;
+ }
+ fname[j] = '\0';
+ }
+
+ /*
+ * Replace all but the last period with _'s, or second to last if last is
+ * followed by a terminal Z or z, or GZ or gz,
+ * e.g., convert foo.tar.Z to foo.tar_Z
+ * or, convert foo.tar.gz to foo.tar-gz
+ */
+ j = strlen(fname) - 1;
+ if ((dot = strrchr(fname, '.')) != NULL) {
+ if (TOUPPER(fname[j]) == 'Z') {
+ if ((fname[j - 1] == '.') &&
+ (((cp = StrChr(fname, '.')) != NULL) && cp < dot)) {
+ *dot = '_';
+ dot = strrchr(fname, '.');
+ } else if (((TOUPPER(fname[j - 1]) == 'G') &&
+ fname[j - 2] == '.') &&
+ (((cp = StrChr(fname, '.')) != NULL) && cp < dot)) {
+ *dot = '-';
+ dot = strrchr(fname, '.');
+ }
+ }
+ cp = fname;
+ while ((cp = StrChr(cp, '.')) != NULL && cp < dot) {
+ *cp = '_';
+ }
+
+ /*
+ * But if the root is > 39 characters, move the period appropriately to
+ * the left.
+ */
+ while (dot - fname > 39) {
+ *dot = '\0';
+ if ((cp = strrchr(fname, '_')) != NULL) {
+ *cp = '.';
+ *dot = '_';
+ } else if ((cp = strrchr(fname, '-')) != NULL) {
+ *cp = '.';
+ *dot = '_';
+ } else if (*(dot + 1) == '\0') {
+ j = strlen(fname);
+ while (j > 39) {
+ fname[j] = fname[j - 1];
+ j--;
+ }
+ fname[j] = '.';
+ } else {
+ *dot = '.';
+ j = 39;
+ k = 0;
+ while (dot[k] != '\0') {
+ fname[j++] = dot[k++];
+ }
+ fname[j] = '\0';
+ }
+ dot = strrchr(fname, '.');
+ }
+
+ /*
+ * Make sure the extension is < 40 characters.
+ */
+ if ((fname + strlen(fname) - dot) > 39) {
+ *(dot + 40) = '\0';
+ }
+
+ /*
+ * Trim trailing dashes or underscores.
+ */
+ j = (strlen(fname) - 1);
+ while (fname[j] == '_' || fname[j] == '-') {
+ fname[j--] = '\0';
+ }
+ } else {
+ /*
+ * No period, so put one on the end, or after the 39th character,
+ * trimming trailing dashes or underscores.
+ */
+ if (strlen(fname) > 39) {
+ fname[39] = '\0';
+ }
+ j = (strlen(fname) - 1);
+ while ((fname[j] == '_') || (fname[j] == '-')) {
+ j--;
+ }
+ fname[++j] = '.';
+ fname[++j] = '\0';
+ }
+
+#else /* Not VMS (UNIX): */
+
+ /*
+ * Replace problem characters.
+ */
+ for (cp = fname; *cp != '\0'; cp++) {
+ switch (*cp) {
+ case '\'':
+ case '"':
+ case '/':
+ case ' ':
+ *cp = '-';
+ }
+ }
+#endif /* VMS (UNIX) */
+
+ /*
+ * Make sure the rest of the original string in nulled.
+ */
+ cp = fname + strlen(fname);
+ while (cp < end) {
+ *cp++ = '\0';
+ }
+
+ return;
+}
+
+/*
+ * Construct a temporary-filename. Assumes result is LY_MAXPATH chars long.
+ */
+static int fmt_tempname(char *result,
+ const char *prefix,
+ const char *suffix)
+{
+ int code;
+
+#ifdef HAVE_RAND_TEMPNAME
+#define SIZE_TEMPNAME ((MAX_TEMPNAME / BITS_PER_CHAR) + 1)
+ static BOOL first = TRUE;
+ static int names_used = 0;
+ static unsigned char used_tempname[SIZE_TEMPNAME];
+ unsigned offset, mask;
+#endif
+ static unsigned counter;
+ char leaf[LY_MAXPATH];
+
+ if (prefix == 0)
+ prefix = "";
+ if (suffix == 0)
+ suffix = "";
+ /*
+ * Prefer a random value rather than a counter.
+ */
+#ifdef HAVE_RAND_TEMPNAME
+ if (first) {
+ lynx_srand((unsigned) ((long) time((time_t *) NULL) + (long) result));
+ first = FALSE;
+ }
+
+ /* We don't really need all of the bits from rand(). The high-order bits
+ * are the more-random portion in any case, but limiting the width of the
+ * generated name is done partly to avoid problems on systems that may not
+ * support long filenames.
+ */
+ counter = MAX_TEMPNAME;
+ if (names_used < MAX_TEMPNAME) {
+ long get_rand = (long) lynx_rand();
+ long max_rand = (long) LYNX_RAND_MAX;
+
+ counter = (unsigned) (((float) MAX_TEMPNAME * (float) get_rand) /
+ (float) max_rand + 1);
+ /*
+ * Avoid reusing a temporary name, since there are places in the code
+ * which can refer to a temporary filename even after it has been
+ * closed and removed from the filesystem.
+ */
+ do {
+ counter %= MAX_TEMPNAME;
+ offset = counter / BITS_PER_CHAR;
+ mask = (unsigned) (1 << (counter % BITS_PER_CHAR));
+ if ((used_tempname[offset] & mask) == 0) {
+ names_used++;
+ used_tempname[offset] |= UCH(mask);
+ break;
+ }
+ } while ((used_tempname[offset] & mask) == 0);
+ }
+ if (names_used >= MAX_TEMPNAME)
+ HTAlert(gettext("Too many tempfiles"));
+#else
+ counter++;
+#endif
+
+#ifdef FNAMES_8_3
+ /*
+ * The 'lynx_temp_space' string ends with a '/' or '\\', so we only have to
+ * limit the length of the leaf. As received (e.g., from HTCompressed),
+ * the suffix may contain more than a ".htm", e.g., "-txt.gz", so we trim
+ * off from the filename portion to make room.
+ */
+ sprintf(leaf, PID_FMT PID_FMT, counter, GETPID());
+ if (strlen(leaf) > 8)
+ leaf[8] = 0;
+ if (strlen(suffix) > 4 || *suffix != '.') {
+ const char *tail = StrChr(suffix, '.');
+
+ if (tail == 0)
+ tail = suffix + strlen(suffix);
+ if (8 - (tail - suffix) >= 0)
+ leaf[8 - (tail - suffix)] = 0;
+ }
+ strcat(leaf, suffix);
+#else
+ sprintf(leaf, "L" PID_FMT "-%uTMP%s", GETPID(), counter, suffix);
+#endif
+ /*
+ * Someone could have configured the temporary pathname to be too long.
+ */
+ if ((strlen(prefix) + strlen(leaf)) < LY_MAXPATH) {
+ sprintf(result, "%s%s", prefix, leaf);
+ code = TRUE;
+ } else {
+ sprintf(result, "%.*s", LY_MAXPATH - 1, leaf);
+ code = FALSE;
+ }
+ CTRACE((tfp, "-> '%s'\n", result));
+ return (code);
+}
+
+/*
+ * Convert 4, 6, 2, 8 to left, right, down, up, etc.
+ */
+int number2arrows(int number)
+{
+ switch (number) {
+ case '1':
+ number = END_KEY;
+ break;
+ case '2':
+ number = DNARROW_KEY;
+ break;
+ case '3':
+ number = PGDOWN_KEY;
+ break;
+ case '4':
+ number = LTARROW_KEY;
+ break;
+ case '5':
+ number = DO_NOTHING;
+ break;
+ case '6':
+ number = RTARROW_KEY;
+ break;
+ case '7':
+ number = HOME_KEY;
+ break;
+ case '8':
+ number = UPARROW_KEY;
+ break;
+ case '9':
+ number = PGUP_KEY;
+ break;
+ }
+
+ return (number);
+}
+
+/*
+ * parse_restrictions takes a string of comma-separated restrictions and sets
+ * the corresponding flags to restrict the facilities available.
+ */
+/* The first two are special: we want to record whether "default" or "all"
+ * restrictions were applied, in addition to the detailed effects of those
+ * options. - kw
+ */
+/* skip the special flags when processing "all" and "default": */
+#define N_SPECIAL_RESTRICT_OPTIONS 2
+/* *INDENT-OFF* */
+static const struct {
+ const char *name;
+ BOOLEAN *flag;
+ BOOLEAN can;
+} restrictions[] = {
+ { "default", &had_restrictions_default, TRUE },
+ { "all", &had_restrictions_all, TRUE },
+ { "inside_telnet", &no_inside_telnet, CAN_ANONYMOUS_INSIDE_DOMAIN_TELNET },
+ { "outside_telnet", &no_outside_telnet, CAN_ANONYMOUS_OUTSIDE_DOMAIN_TELNET },
+ { "telnet_port", &no_telnet_port, CAN_ANONYMOUS_GOTO_TELNET_PORT },
+ { "inside_ftp", &no_inside_ftp, CAN_ANONYMOUS_INSIDE_DOMAIN_FTP },
+ { "outside_ftp", &no_outside_ftp, CAN_ANONYMOUS_OUTSIDE_DOMAIN_FTP },
+ { "inside_rlogin", &no_inside_rlogin, CAN_ANONYMOUS_INSIDE_DOMAIN_RLOGIN },
+ { "outside_rlogin", &no_outside_rlogin, CAN_ANONYMOUS_OUTSIDE_DOMAIN_RLOGIN },
+ { "suspend", &no_suspend, FALSE },
+ { "editor", &no_editor, FALSE },
+ { "shell", &no_shell, FALSE },
+ { "bookmark", &no_bookmark, FALSE },
+ { "multibook", &no_multibook, FALSE },
+ { "bookmark_exec", &no_bookmark_exec, FALSE },
+ { "option_save", &no_option_save, FALSE },
+ { "print", &no_print, CAN_ANONYMOUS_PRINT },
+ { "download", &no_download, FALSE },
+ { "disk_save", &no_disk_save, FALSE },
+#if defined(EXEC_LINKS) || defined(EXEC_SCRIPTS)
+ { "exec", &no_exec, LOCAL_EXECUTION_LINKS_ALWAYS_OFF_FOR_ANONYMOUS },
+#endif
+ { "lynxcgi", &no_lynxcgi, FALSE },
+ { "exec_frozen", &exec_frozen, FALSE },
+ { "goto", &no_goto, CAN_ANONYMOUS_GOTO },
+ { "jump", &no_jump, CAN_ANONYMOUS_JUMP },
+ { "file_url", &no_file_url, FALSE },
+#ifndef DISABLE_NEWS
+ { "news_post", &no_newspost, FALSE },
+ { "inside_news", &no_inside_news, CAN_ANONYMOUS_INSIDE_DOMAIN_READ_NEWS },
+ { "outside_news", &no_outside_news, CAN_ANONYMOUS_OUTSIDE_DOMAIN_READ_NEWS },
+#endif
+ { "mail", &no_mail, CAN_ANONYMOUS_MAIL },
+ { "dotfiles", &no_dotfiles, FALSE },
+ { "useragent", &no_useragent, FALSE },
+#ifdef SUPPORT_CHDIR
+ { "chdir", &no_chdir, FALSE },
+#endif
+#ifdef DIRED_SUPPORT
+ { "dired_support", &no_dired_support, FALSE },
+#ifdef OK_PERMIT
+ { "change_exec_perms", &no_change_exec_perms, FALSE },
+#endif /* OK_PERMIT */
+#endif /* DIRED_SUPPORT */
+#ifdef USE_EXTERNALS
+ { "externals", &no_externals, FALSE },
+#endif
+ { "lynxcfg_info", &no_lynxcfg_info, CAN_ANONYMOUS_VIEW_LYNXCFG_INFO },
+#ifndef NO_CONFIG_INFO
+ { "lynxcfg_xinfo", &no_lynxcfg_xinfo, CAN_ANONYMOUS_VIEW_LYNXCFG_EXTENDED_INFO },
+#ifdef HAVE_CONFIG_H
+ { "compileopts_info", &no_compileopts_info, CAN_ANONYMOUS_VIEW_COMPILEOPTS_INFO },
+#endif
+#endif
+ /* put "goto" restrictions on the end, since they are a refinement */
+#ifndef DISABLE_BIBP
+ { "goto_bibp", &no_goto_bibp, CAN_ANONYMOUS_GOTO_BIBP },
+#endif
+#ifdef HAVE_CONFIG_H
+#ifndef NO_CONFIG_INFO
+ { "goto_configinfo", &no_goto_configinfo, CAN_ANONYMOUS_GOTO_CONFIGINFO },
+#endif
+#endif
+ { "goto_cso", &no_goto_cso, CAN_ANONYMOUS_GOTO_CSO },
+ { "goto_file", &no_goto_file, CAN_ANONYMOUS_GOTO_FILE },
+#ifndef DISABLE_FINGER
+ { "goto_finger", &no_goto_finger, CAN_ANONYMOUS_GOTO_FINGER },
+#endif
+ { "goto_ftp", &no_goto_ftp, CAN_ANONYMOUS_GOTO_FTP },
+#ifndef DISABLE_GOPHER
+ { "goto_gopher", &no_goto_gopher, CAN_ANONYMOUS_GOTO_GOPHER },
+#endif
+ { "goto_http", &no_goto_http, CAN_ANONYMOUS_GOTO_HTTP },
+ { "goto_https", &no_goto_https, CAN_ANONYMOUS_GOTO_HTTPS },
+ { "goto_lynxcgi", &no_goto_lynxcgi, CAN_ANONYMOUS_GOTO_LYNXCGI },
+ { "goto_lynxexec", &no_goto_lynxexec, CAN_ANONYMOUS_GOTO_LYNXEXEC },
+ { "goto_lynxprog", &no_goto_lynxprog, CAN_ANONYMOUS_GOTO_LYNXPROG },
+ { "goto_mailto", &no_goto_mailto, CAN_ANONYMOUS_GOTO_MAILTO },
+#ifndef DISABLE_NEWS
+ { "goto_news", &no_goto_news, CAN_ANONYMOUS_GOTO_NEWS },
+ { "goto_nntp", &no_goto_nntp, CAN_ANONYMOUS_GOTO_NNTP },
+#endif
+ { "goto_rlogin", &no_goto_rlogin, CAN_ANONYMOUS_GOTO_RLOGIN },
+#ifndef DISABLE_NEWS
+ { "goto_snews", &no_goto_snews, CAN_ANONYMOUS_GOTO_SNEWS },
+#endif
+ { "goto_telnet", &no_goto_telnet, CAN_ANONYMOUS_GOTO_TELNET },
+ { "goto_tn3270", &no_goto_tn3270, CAN_ANONYMOUS_GOTO_TN3270 },
+ { "goto_wais", &no_goto_wais, CAN_ANONYMOUS_GOTO_WAIS },
+};
+/* *INDENT-ON* */
+
+/* This will make no difference between '-' and '_'. It does only in/equality
+ * compare. It assumes that p2 can't contain dashes, but p1 can. This
+ * function is also used (if macro OPTNAME_ALLOW_DASHES doesn't have value of
+ * zero) for compare of commandline options -VH
+ */
+BOOL strn_dash_equ(const char *p1,
+ const char *p2,
+ int len)
+{
+ while (len--) {
+ if (!*p2)
+ return 0; /* canonical name is shorter */
+ switch (*p1) {
+ case 0:
+ return 0;
+ case '-':
+ case '_':
+ if (*p2 != '_')
+ return 0;
+ else
+ break;
+ default:
+ if (*p1 != *p2)
+ return 0;
+ }
+ ++p1;
+ ++p2;
+ }
+ return 1;
+}
+
+/* Uncomment following lines to allow only exact string matching */
+/* #define RESTRICT_NM_ALLOW_DASHES 0 */
+
+#ifndef RESTRICT_NM_ALLOW_DASHES
+# define RESTRICT_NM_ALLOW_DASHES 1
+#endif
+
+#if RESTRICT_NM_ALLOW_DASHES
+# define RESTRICT_NM_EQU(a,b,len) strn_dash_equ(a,b,len)
+#else
+# define RESTRICT_NM_EQU(a,b,len) STRNEQ(a,b,len)
+#endif
+
+/*
+ * Returns the inx'th name from the restrictions table, or null if inx is
+ * out of range.
+ */
+const char *index_to_restriction(unsigned inx)
+{
+ if (inx < TABLESIZE(restrictions))
+ return restrictions[inx].name;
+ return NULL;
+}
+
+/*
+ * Returns the value TRUE/FALSE of a given restriction, or -1 if it is not
+ * one that we recognize.
+ */
+int find_restriction(const char *name,
+ int len)
+{
+ unsigned i;
+
+ if (len < 0)
+ len = (int) strlen(name);
+ for (i = 0; i < TABLESIZE(restrictions); i++) {
+ if (RESTRICT_NM_EQU(name, restrictions[i].name, len)) {
+ return (*restrictions[i].flag);
+ }
+ }
+ return -1;
+}
+
+void parse_restrictions(const char *s)
+{
+ const char *p;
+ const char *word;
+ unsigned i;
+ BOOLEAN found;
+
+ p = s;
+ while (*p) {
+ p = LYSkipCBlanks(p);
+ if (*p == '\0')
+ break;
+ word = p;
+ while (*p != ',' && *p != '\0')
+ p++;
+
+ found = FALSE;
+ if (RESTRICT_NM_EQU(word, "all", (int) (p - word))) {
+ found = TRUE;
+ for (i = N_SPECIAL_RESTRICT_OPTIONS;
+ i < TABLESIZE(restrictions);
+ i++)
+ *(restrictions[i].flag) = TRUE;
+ } else if (RESTRICT_NM_EQU(word, "default", (int) (p - word))) {
+ found = TRUE;
+ for (i = N_SPECIAL_RESTRICT_OPTIONS;
+ i < TABLESIZE(restrictions);
+ i++)
+ *(restrictions[i].flag) = (BOOLEAN) !restrictions[i].can;
+ } else {
+ for (i = 0; i < TABLESIZE(restrictions); i++) {
+ if (RESTRICT_NM_EQU(word, restrictions[i].name, (int) (p - word))) {
+ *(restrictions[i].flag) = TRUE;
+ found = TRUE;
+ break;
+ }
+ }
+ }
+ if (!found) {
+ printf("%s: %.*s\n", gettext("unknown restriction"),
+ (int) (p - word), word);
+ exit_immediately(EXIT_FAILURE);
+ }
+ if (*p)
+ p++;
+ }
+
+ /*
+ * If shell is restricted, set restrictions on related topics.
+ */
+ if (no_shell) {
+ no_goto_lynxexec = TRUE;
+ no_goto_lynxprog = TRUE;
+ no_goto_lynxcgi = TRUE;
+#ifdef EXEC_LINKS
+ local_exec_on_local_files = TRUE;
+#endif
+ }
+}
+
+void print_restrictions_to_fd(FILE *fp)
+{
+ unsigned i, count = 0;
+
+ for (i = 0; i < TABLESIZE(restrictions); i++) {
+ if (*(restrictions[i].flag) == TRUE) {
+ count++;
+ }
+ }
+ if (!count) {
+ fprintf(fp, gettext("No restrictions set.\n"));
+ return;
+ }
+ fprintf(fp, gettext("Restrictions set:\n"));
+ for (i = 0; i < TABLESIZE(restrictions); i++) {
+ if (*(restrictions[i].flag) == TRUE) {
+ /* if "goto" is restricted, don't bother tell about its
+ * refinements
+ */
+ if (StrNCmp(restrictions[i].name, "goto_", 5)
+ || !no_goto)
+ fprintf(fp, " %s\n", restrictions[i].name);
+ }
+ }
+}
+
+#ifdef VMS
+#include <jpidef.h>
+#include <maildef.h>
+#include <starlet.h>
+
+typedef struct _VMSMailItemList {
+ short buffer_length;
+ short item_code;
+ void *buffer_address;
+ long *return_length_address;
+} VMSMailItemList;
+
+void LYCheckMail(void)
+{
+ static BOOL firsttime = TRUE, failure = FALSE;
+ static char user[13], dir[252];
+ static long userlen = 0, dirlen;
+ static time_t lastcheck = 0;
+ time_t now;
+ static short new, lastcount;
+ long ucontext = 0, status;
+ short flags = MAIL$M_NEWMSG;
+ /* *INDENT-OFF* */
+ VMSMailItemList
+ null_list[] = {{0,0,0,0}},
+ jpi_list[] = {{sizeof(user) - 1,JPI$_USERNAME,(void *)user,&userlen},
+ {0,0,0,0}},
+ uilist[] = {{0,MAIL$_USER_USERNAME,0,0},
+ {0,0,0,0}},
+ uolist[] = {{sizeof(new),MAIL$_USER_NEW_MESSAGES,&new,0},
+ {sizeof(dir),MAIL$_USER_FULL_DIRECTORY,dir,&dirlen},
+ {0,0,0,0}};
+ /* *INDENT-ON* */
+
+ extern long mail$user_begin();
+ extern long mail$user_get_info();
+ extern long mail$user_end();
+
+ if (failure)
+ return;
+
+ if (firsttime) {
+ firsttime = FALSE;
+ /* Get the username. */
+ status = sys$getjpiw(0, 0, 0, jpi_list, 0, 0, 0);
+ if (!(status & 1)) {
+ failure = TRUE;
+ return;
+ }
+ user[userlen] = '\0';
+ LYTrimTrailing(user);
+ }
+
+ /* Minimum report interval is 60 sec. */
+ time(&now);
+ if (now - lastcheck < 60)
+ return;
+ lastcheck = now;
+
+ /* Get the current newmail count. */
+ status = mail$user_begin(&ucontext, null_list, null_list);
+ if (!(status & 1)) {
+ failure = TRUE;
+ return;
+ }
+ uilist[0].buffer_length = strlen(user);
+ uilist[0].buffer_address = user;
+ status = mail$user_get_info(&ucontext, uilist, uolist);
+ if (!(status & 1)) {
+ failure = TRUE;
+ return;
+ }
+
+ /* Should we report anything to the user? */
+ if (new > 0) {
+ if (lastcount == 0)
+ /* Have newmail at startup of Lynx. */
+ HTUserMsg(HAVE_UNREAD_MAIL_MSG);
+ else if (new > lastcount)
+ /* Have additional mail since last report. */
+ HTUserMsg(HAVE_NEW_MAIL_MSG);
+ lastcount = new;
+ return;
+ }
+ lastcount = new;
+
+ /* Clear the context */
+ mail$user_end((long *) &ucontext, null_list, null_list);
+ return;
+}
+#else
+void LYCheckMail(void)
+{
+ static BOOL firsttime = TRUE;
+ static char *mf;
+ static time_t lastcheck;
+ static time_t lasttime;
+ static long lastsize;
+ time_t now;
+ struct stat st;
+
+ if (firsttime) {
+ mf = LYGetEnv("MAIL");
+ firsttime = FALSE;
+ time(&lasttime);
+ }
+
+ if (mf == NULL)
+ return;
+
+ time(&now);
+ if (now - lastcheck < 60)
+ return;
+ lastcheck = now;
+
+ if ((stat(mf, &st) < 0)
+ || !S_ISREG(st.st_mode)) {
+ mf = NULL;
+ return;
+ }
+
+ if (st.st_size > 0) {
+ if (((lasttime != st.st_mtime) && (st.st_mtime > st.st_atime))
+ || ((lastsize != 0) && (st.st_size > lastsize)))
+ HTUserMsg(HAVE_NEW_MAIL_MSG);
+ else if (lastsize == 0)
+ HTUserMsg(HAVE_MAIL_MSG);
+ }
+ lastsize = (long) st.st_size;
+ lasttime = st.st_mtime;
+ return;
+}
+#endif /* VMS */
+
+/*
+ * This function ensures that an href will be
+ * converted to a fully resolved, absolute URL,
+ * with guessing of the host or expansions of
+ * lead tildes via LYConvertToURL() if needed,
+ * and tweaking/simplifying via HTParse(). It
+ * is used for LynxHome, startfile, homepage,
+ * and 'g'oto entries, after they have been
+ * passed to LYFillLocalFileURL(). - FM
+ * Such URLs have no `base' reference to which they
+ * could be resolved. LYLegitimizeHREF could not be used.
+ */
+void LYEnsureAbsoluteURL(char **href,
+ const char *name,
+ int fixit)
+{
+ char *temp = NULL;
+
+ if (isEmpty(*href))
+ return;
+
+ /*
+ * Check whether to fill in localhost. - FM
+ */
+ LYFillLocalFileURL(href, "file://localhost");
+
+ /*
+ * If it is not a URL then make it one.
+ */
+ if (!strcasecomp(*href, STR_NEWS_URL)) {
+ StrAllocCat(*href, "*");
+ } else if (!strcasecomp(*href, STR_SNEWS_URL)) {
+ StrAllocCat(*href, "/*");
+ }
+
+ if (!is_url(*href)) {
+ CTRACE((tfp, "%s%s'%s' is not a URL\n",
+ NonNull(name), (name ? " " : ""), *href));
+ LYConvertToURL(href, fixit);
+ }
+
+ temp = HTParse(*href, "", PARSE_ALL);
+ if (non_empty(temp))
+ StrAllocCopy(*href, temp);
+ FREE(temp);
+}
+
+static const char *default_scheme = "http://";
+
+static const char *guess_scheme(const char *url)
+{
+ const char *scheme = NULL;
+
+ if (LYGuessScheme && non_empty(url)) {
+ if (0 == strncasecomp(url, "www.", 4)) {
+ scheme = "http://";
+ } else if (0 == strncasecomp(url, "ftp.", 4)) {
+ scheme = "ftp://";
+ } else if (0 == strncasecomp(url, "gopher.", 7)) {
+ scheme = "gopher://";
+ } else if (0 == strncasecomp(url, "wais.", 5)) {
+ scheme = "wais://";
+ } else if (0 == strncasecomp(url, "cso.", 4) ||
+ 0 == strncasecomp(url, "ns.", 3) ||
+ 0 == strncasecomp(url, "ph.", 3)) {
+ scheme = "cso://";
+ } else if (0 == strncasecomp(url, "finger.", 7)) {
+ scheme = "finger://";
+ } else if (0 == strncasecomp(url, "news.", 5)) {
+ scheme = "news://";
+ } else if (0 == strncasecomp(url, "nntp.", 5)) {
+ scheme = "nntp://";
+ }
+ }
+ CTRACE((tfp, "guess_scheme(%s) -> '%s'\n", NonNull(url), NonNull(scheme)));
+ return scheme;
+}
+
+/*
+ * This function rewrites and reallocates a previously allocated string that
+ * begins with an Internet host name so that the string begins with its guess
+ * of the scheme based on the first field of the host name, or the default
+ * scheme if no guess was made.
+ */
+static void LYAddSchemeForURL(char **AllocatedString)
+{
+ if (non_empty(*AllocatedString)) {
+ char *Str = NULL;
+ const char *scheme = guess_scheme(*AllocatedString);
+
+ if (scheme == NULL)
+ scheme = default_scheme;
+
+ StrAllocCopy(Str, scheme);
+ StrAllocCat(Str, *AllocatedString);
+ StrAllocCopy(*AllocatedString, Str);
+
+ FREE(Str);
+ }
+}
+
+/*
+ * This function rewrites and reallocates a previously allocated string so that
+ * the first element is a confirmed Internet host, and returns TRUE, otherwise
+ * it does not modify the string and returns FALSE.
+ *
+ * It first tries the element as is, then, if the element does not end with a
+ * dot, it adds prefixes from the (comma separated) prefix list argument, and,
+ * if the element does not begin with a dot, suffixes from the (comma
+ * separated) suffix list arguments (e.g., www.host.com, then www.host,edu,
+ * then www.host.net, then www.host.org).
+ *
+ * The remaining path, if one is present, will be appended to the expanded
+ * host.
+ *
+ * It also takes into account whether a colon is in the element or suffix, and
+ * includes that and what follows as a port field for the expanded host field
+ * (e.g, wfbr:8002/dir/lynx should yield www.wfbr.edu:8002/dir/lynx).
+ */
+static BOOLEAN LYExpandHostForURL(char **AllocatedString,
+ char *prefix_list,
+ char *suffix_list)
+{
+ char *DomainPrefix = NULL;
+ const char *StartP, *EndP;
+ char *DomainSuffix = NULL;
+ const char *StartS, *EndS;
+ char *Str = NULL, *StrColon = NULL, *MsgStr = NULL;
+ char *Host = NULL, *HostColon = NULL, *host = NULL;
+ char *Path = NULL;
+ char *Fragment = NULL;
+ BOOLEAN GotHost = FALSE;
+ BOOLEAN Startup = (BOOL) (helpfilepath == NULL);
+
+ /*
+ * If it's a NULL or zero-length string, or if it begins with a slash or
+ * hash, don't continue pointlessly. - FM
+ */
+ if (isEmpty(*AllocatedString) ||
+ *AllocatedString[0] == '/' ||
+ *AllocatedString[0] == '#') {
+ return GotHost;
+ }
+
+ /*
+ * If it's a partial or relative path, don't continue pointlessly. - FM
+ */
+ if (!StrNCmp(*AllocatedString, "..", 2) ||
+ !StrNCmp(*AllocatedString, "./", 2)) {
+ return GotHost;
+ }
+
+ /*
+ * Make a clean copy of the string, and trim off the path if one is
+ * present, but save the information so we can restore the path after
+ * filling in the Host[:port] field. - FM
+ */
+ StrAllocCopy(Str, *AllocatedString);
+ if ((Path = StrChr(Str, '/')) != NULL) {
+ /*
+ * Have a path. Any fragment should already be included in Path. - FM
+ */
+ *Path = '\0';
+ } else {
+ /*
+ * No path, so check for a fragment and trim that, to be restored after
+ * filling in the Host[:port] field. - FM
+ */
+ Fragment = trimPoundSelector(Str);
+ }
+
+ /*
+ * If the potential host string has a colon, assume it begins a port field,
+ * and trim it off, but save the information so we can restore the port
+ * field after filling in the host field. - FM
+ */
+ if ((StrColon = strrchr(Str, ':')) != NULL &&
+ isdigit(UCH(StrColon[1])) && StrChr(StrColon, ']') == NULL) {
+ if (StrColon == Str) {
+ goto cleanup;
+ }
+ *StrColon = '\0';
+ }
+
+ /*
+ * Do a DNS test on the potential host field as presently trimmed. - FM
+ */
+ StrAllocCopy(host, Str);
+ strip_userid(host, FALSE);
+ HTUnEscape(host);
+ if (LYCursesON) {
+ StrAllocCopy(MsgStr, WWW_FIND_MESSAGE);
+ StrAllocCat(MsgStr, host);
+ StrAllocCat(MsgStr, FIRST_SEGMENT);
+ HTProgress(MsgStr);
+ } else if (Startup && !dump_output_immediately) {
+ fprintf(stdout, "%s '%s'%s\r\n", WWW_FIND_MESSAGE, host, FIRST_SEGMENT);
+ }
+#ifdef INET6
+ if (HTCheckAddrInfo(host, 80))
+#else
+ if (LYCheckHostByName(host))
+#endif /* INET6 */
+ {
+ /*
+ * Clear any residual interrupt. - FM
+ */
+ if (LYCursesON && HTCheckForInterrupt()) {
+ CTRACE((tfp,
+ "LYExpandHostForURL: Ignoring interrupt because '%s' resolved.\n",
+ host));
+ }
+
+ /*
+ * Return success. - FM
+ */
+ GotHost = TRUE;
+ goto cleanup;
+ } else if (LYCursesON && (lynx_nsl_status == HT_INTERRUPTED)) {
+ /*
+ * Give the user chance to interrupt lookup cycles. - KW & FM
+ */
+ CTRACE((tfp,
+ "LYExpandHostForURL: Interrupted while '%s' failed to resolve.\n",
+ host));
+
+ /*
+ * Return failure. - FM
+ */
+ goto cleanup;
+ }
+
+ /*
+ * Set the first prefix, making it a zero-length string if the list is NULL
+ * or if the potential host field ends with a dot. - FM
+ */
+ StartP = ((prefix_list && Str[strlen(Str) - 1] != '.')
+ ? prefix_list
+ : "");
+ /*
+ * If we have a prefix, but the allocated string is one of the common host
+ * prefixes, make our prefix a zero-length string. - FM
+ */
+ if (*StartP && *StartP != '.') {
+ if (guess_scheme(*AllocatedString) != NULL) {
+ StartP = "";
+ }
+ }
+ while ((*StartP) && (WHITE(*StartP) || *StartP == ',')) {
+ StartP++; /* Skip whitespace and separators */
+ }
+ EndP = StartP;
+ while (*EndP && !WHITE(*EndP) && *EndP != ',') {
+ EndP++; /* Find separator */
+ }
+ StrAllocCopy(DomainPrefix, StartP);
+ DomainPrefix[EndP - StartP] = '\0';
+
+ /*
+ * Test each prefix with each suffix. - FM
+ */
+ do {
+ /*
+ * Set the first suffix, making it a zero-length string if the list is
+ * NULL or if the potential host field begins with a dot. - FM
+ */
+ StartS = ((suffix_list && *Str != '.')
+ ? suffix_list
+ : "");
+ while ((*StartS) && (WHITE(*StartS) || *StartS == ',')) {
+ StartS++; /* Skip whitespace and separators */
+ }
+ EndS = StartS;
+ while (*EndS && !WHITE(*EndS) && *EndS != ',') {
+ EndS++; /* Find separator */
+ }
+ StrAllocCopy(DomainSuffix, StartS);
+ DomainSuffix[EndS - StartS] = '\0';
+
+ /*
+ * Create domain names and do DNS tests. - FM
+ */
+ do {
+ StrAllocCopy(Host, DomainPrefix);
+ StrAllocCat(Host, ((*Str == '.') ? (Str + 1) : Str));
+ if (Host[strlen(Host) - 1] == '.') {
+ Host[strlen(Host) - 1] = '\0';
+ }
+ StrAllocCat(Host, DomainSuffix);
+ if ((HostColon = strrchr(Host, ':')) != NULL &&
+ isdigit(UCH(HostColon[1]))) {
+ *HostColon = '\0';
+ }
+ StrAllocCopy(host, Host);
+ HTUnEscape(host);
+ if (LYCursesON) {
+ StrAllocCopy(MsgStr, WWW_FIND_MESSAGE);
+ StrAllocCat(MsgStr, host);
+ StrAllocCat(MsgStr, GUESSING_SEGMENT);
+ HTProgress(MsgStr);
+ } else if (Startup && !dump_output_immediately) {
+ fprintf(stdout, "%s '%s'%s\n", WWW_FIND_MESSAGE, host, GUESSING_SEGMENT);
+ }
+ GotHost = LYCheckHostByName(host);
+ if (HostColon != NULL) {
+ *HostColon = ':';
+ }
+ if (GotHost == FALSE) {
+ /*
+ * Give the user chance to interrupt lookup cycles. - KW
+ */
+ if (LYCursesON && (lynx_nsl_status == HT_INTERRUPTED)) {
+ CTRACE((tfp,
+ "LYExpandHostForURL: Interrupted while '%s' failed to resolve.\n",
+ host));
+ goto cleanup; /* We didn't find a valid name. */
+ }
+
+ /*
+ * Advance to the next suffix, or end of suffix list. - FM
+ */
+ StartS = ((*EndS == '\0') ? EndS : (EndS + 1));
+ while ((*StartS) && (WHITE(*StartS) || *StartS == ',')) {
+ StartS++; /* Skip whitespace and separators */
+ }
+ EndS = StartS;
+ while (*EndS && !WHITE(*EndS) && *EndS != ',') {
+ EndS++; /* Find separator */
+ }
+ LYStrNCpy(DomainSuffix, StartS, (EndS - StartS));
+ }
+ } while ((GotHost == FALSE) && (*DomainSuffix != '\0'));
+
+ if (GotHost == FALSE) {
+ /*
+ * Advance to the next prefix, or end of prefix list. - FM
+ */
+ StartP = ((*EndP == '\0') ? EndP : (EndP + 1));
+ while ((*StartP) && (WHITE(*StartP) || *StartP == ',')) {
+ StartP++; /* Skip whitespace and separators */
+ }
+ EndP = StartP;
+ while (*EndP && !WHITE(*EndP) && *EndP != ',') {
+ EndP++; /* Find separator */
+ }
+ LYStrNCpy(DomainPrefix, StartP, (EndP - StartP));
+ }
+ } while ((GotHost == FALSE) && (*DomainPrefix != '\0'));
+
+ /*
+ * If a test passed, restore the port field if we had one and there is no
+ * colon in the expanded host, and the path if we had one, and reallocate
+ * the original string with the expanded Host[:port] field included. - FM
+ */
+ if (GotHost) {
+ if (StrColon && StrChr(Host, ':') == NULL) {
+ *StrColon = ':';
+ StrAllocCat(Host, StrColon);
+ }
+ if (Path) {
+ *Path = '/';
+ StrAllocCat(Host, Path);
+ } else if (Fragment) {
+ StrAllocCat(Host, "/");
+ restorePoundSelector(Fragment);
+ StrAllocCat(Host, Fragment);
+ }
+ StrAllocCopy(*AllocatedString, Host);
+ }
+
+ /*
+ * Clear any residual interrupt. - FM
+ */
+ if (LYCursesON && HTCheckForInterrupt()) {
+ CTRACE((tfp,
+ "LYExpandHostForURL: Ignoring interrupt because '%s' %s.\n",
+ host,
+ (GotHost ? "resolved" : "timed out")));
+ }
+
+ /*
+ * Clean up and return the last test result. - FM
+ */
+ cleanup:
+ FREE(DomainPrefix);
+ FREE(DomainSuffix);
+ FREE(Str);
+ FREE(MsgStr);
+ FREE(Host);
+ FREE(host);
+ return GotHost;
+}
+/*
+ * Rewrite and reallocate a previously allocated string as a file URL if the
+ * string resolves to a file or directory on the local system, otherwise as an
+ * http URL. - FM
+ */
+void LYConvertToURL(char **AllocatedString,
+ int fixit)
+{
+ char *old_string = *AllocatedString;
+ char *temp = NULL;
+ char *cp = NULL;
+
+#ifndef VMS
+ struct stat st;
+#endif /* !VMS */
+
+ if (isEmpty(old_string))
+ return;
+
+#if defined(USE_DOS_DRIVES)
+ {
+ char *cp_url = *AllocatedString;
+
+ for (; *cp_url != '\0'; cp_url++)
+ if (*cp_url == '\\')
+ *cp_url = '/';
+ cp_url--;
+ if (LYIsDosDrive(*AllocatedString) && *cp_url == ':')
+ LYAddPathSep(AllocatedString);
+ }
+#endif /* USE_DOS_DRIVES */
+
+ *AllocatedString = NULL; /* so StrAllocCopy doesn't free it */
+ StrAllocCopy(*AllocatedString, "file://localhost");
+
+ if (*old_string != '/') {
+ char *fragment = NULL;
+
+#if defined(USE_DOS_DRIVES)
+ StrAllocCat(*AllocatedString, "/");
+#endif /* USE_DOS_DRIVES */
+#ifdef VMS
+ /*
+ * Not a SHELL pathspec. Get the full VMS spec and convert it.
+ */
+ char *cur_dir = NULL;
+ static char url_file[LY_MAXPATH], file_name[LY_MAXPATH], dir_name[LY_MAXPATH];
+ unsigned long context = 0;
+
+ $DESCRIPTOR(url_file_dsc, url_file);
+ $DESCRIPTOR(file_name_dsc, file_name);
+ if (LYIsTilde(*old_string)) {
+ /*
+ * On VMS, we'll accept '~' on the command line as Home_Dir(), and
+ * assume the rest of the path, if any, has SHELL syntax.
+ */
+ StrAllocCat(*AllocatedString, HTVMS_wwwName(Home_Dir()));
+ if ((cp = StrChr(old_string, '/')) != NULL) {
+ /*
+ * Append rest of path, if present, skipping "user" if "~user"
+ * was entered, simplifying, and eliminating any residual
+ * relative elements. - FM
+ */
+ StrAllocCopy(temp, cp);
+ LYTrimRelFromAbsPath(temp);
+ StrAllocCat(*AllocatedString, temp);
+ FREE(temp);
+ }
+ goto have_VMS_URL;
+ } else {
+ fragment = trimPoundSelector(old_string);
+ LYStrNCpy(url_file, old_string, sizeof(url_file) - 1);
+ }
+ url_file_dsc.dsc$w_length = (short) strlen(url_file);
+ if (1 & lib$find_file(&url_file_dsc, &file_name_dsc, &context,
+ 0, 0, 0, 0)) {
+ /*
+ * We found the file. Convert to a URL pathspec.
+ */
+ if ((cp = StrChr(file_name, ';')) != NULL) {
+ *cp = '\0';
+ }
+ LYLowerCase(file_name);
+ StrAllocCat(*AllocatedString, HTVMS_wwwName(file_name));
+ if ((cp = StrChr(old_string, ';')) != NULL) {
+ StrAllocCat(*AllocatedString, cp);
+ }
+ if (fragment != NULL) {
+ restorePoundSelector(fragment);
+ StrAllocCat(*AllocatedString, fragment);
+ fragment = NULL;
+ }
+ } else if ((NULL != getcwd(dir_name, sizeof(dir_name) - 1, 0)) &&
+ 0 == chdir(old_string)) {
+ /*
+ * Probably a directory. Try converting that.
+ */
+ StrAllocCopy(cur_dir, dir_name);
+ restorePoundSelector(fragment);
+ if (NULL != getcwd(dir_name, sizeof(dir_name) - 1, 0)) {
+ /*
+ * Yup, we got it!
+ */
+ LYLowerCase(dir_name);
+ StrAllocCat(*AllocatedString, dir_name);
+ if (fragment != NULL) {
+ StrAllocCat(*AllocatedString, fragment);
+ fragment = NULL;
+ }
+ } else {
+ /*
+ * Nope. Assume it's an http URL with the "http://" defaulted,
+ * if we can't rule out a bad VMS path.
+ */
+ fragment = NULL;
+ if (StrChr(old_string, '[') ||
+ ((cp = StrChr(old_string, ':')) != NULL &&
+ !isdigit(UCH(cp[1]))) ||
+ !LYExpandHostForURL(&old_string,
+ URLDomainPrefixes,
+ URLDomainSuffixes)) {
+ /*
+ * Probably a bad VMS path (but can't be sure). Use
+ * original pathspec for the error message that will
+ * result.
+ */
+ sprintf(url_file, "/%.*s", sizeof(url_file) - 2, old_string);
+ CTRACE((tfp,
+ "Can't find '%s' Will assume it's a bad path.\n",
+ old_string));
+ StrAllocCat(*AllocatedString, url_file);
+ } else {
+ LYAddSchemeForURL(&old_string);
+ StrAllocCopy(*AllocatedString, old_string);
+ }
+ }
+ } else {
+ /*
+ * Nothing found. Assume it's an http URL with the "http://"
+ * defaulted, if we can't rule out a bad VMS path.
+ */
+ restorePoundSelector(fragment);
+ fragment = NULL;
+
+ if (StrChr(old_string, '[') ||
+ ((cp = StrChr(old_string, ':')) != NULL &&
+ !isdigit(UCH(cp[1]))) ||
+ !LYExpandHostForURL(&old_string,
+ URLDomainPrefixes,
+ URLDomainSuffixes)) {
+ /*
+ * Probably a bad VMS path (but can't be sure). Use original
+ * pathspec for the error message that will result.
+ */
+ sprintf(url_file, "/%.*s", sizeof(url_file) - 2, old_string);
+ CTRACE((tfp, "Can't find '%s' Will assume it's a bad path.\n",
+ old_string));
+ StrAllocCat(*AllocatedString, url_file);
+ } else {
+ LYAddSchemeForURL(&old_string);
+ StrAllocCopy(*AllocatedString, old_string);
+ }
+ }
+ lib$find_file_end(&context);
+ FREE(cur_dir);
+ have_VMS_URL:
+ CTRACE((tfp, "Trying: '%s'\n", *AllocatedString));
+#else /* not VMS: */
+#if defined(USE_DOS_DRIVES)
+#ifdef _WINDOWS
+ if (*old_string == '.') {
+ char fullpath[MAX_PATH + 1];
+ char *filepart = NULL;
+ DWORD chk;
+
+ chk = GetFullPathNameA(old_string, MAX_PATH + 1,
+ fullpath, &filepart);
+ if (chk != 0) {
+ StrAllocCopy(temp, wwwName(fullpath));
+ StrAllocCat(*AllocatedString, temp);
+ FREE(temp);
+ CTRACE((tfp, "Converted '%s' to '%s'\n",
+ old_string, *AllocatedString));
+ } else {
+ StrAllocCat(*AllocatedString, old_string);
+ }
+ }
+#else
+ if (strlen(old_string) == 1 && *old_string == '.') {
+ /*
+ * They want .
+ */
+ char curdir[LY_MAXPATH];
+
+ StrAllocCopy(temp, wwwName(Current_Dir(curdir)));
+ StrAllocCat(*AllocatedString, temp);
+ FREE(temp);
+ CTRACE((tfp, "Converted '%s' to '%s'\n",
+ old_string, *AllocatedString));
+ }
+#endif
+ else
+#endif /* USE_DOS_DRIVES */
+ if (LYIsTilde(*old_string)) {
+ char *his_home = NULL;
+
+ StrAllocCopy(his_home, old_string);
+ LYTildeExpand(&his_home, FALSE);
+ StrAllocCat(*AllocatedString, his_home);
+ FREE(his_home);
+
+ CTRACE((tfp, "Converted '%s' to '%s'\n",
+ old_string, *AllocatedString));
+ } else {
+ /*
+ * Create a full path to the current default directory.
+ */
+ char curdir[LY_MAXPATH];
+ char *temp2 = NULL;
+ BOOL is_local = FALSE;
+
+ Current_Dir(curdir);
+ /*
+ * Concatenate and simplify, trimming any residual relative
+ * elements. - FM
+ */
+#if defined (USE_DOS_DRIVES)
+ if (old_string[1] != ':' && old_string[1] != '|') {
+ StrAllocCopy(temp, wwwName(curdir));
+ LYAddHtmlSep(&temp);
+ LYStrNCpy(curdir, temp, (sizeof(curdir) - 1));
+ StrAllocCat(temp, old_string);
+ } else {
+ curdir[0] = '\0';
+ /* 1998/01/13 (Tue) 12:24:33 */
+ if (old_string[1] == '|')
+ old_string[1] = ':';
+ StrAllocCopy(temp, old_string);
+
+ if (strlen(temp) == 2 && LYIsDosDrive(temp))
+ LYAddPathSep(&temp);
+ }
+#else
+ StrAllocCopy(temp, curdir);
+ StrAllocCat(temp, "/");
+ StrAllocCat(temp, old_string);
+#endif /* USE_DOS_DRIVES */
+ LYTrimRelFromAbsPath(temp);
+ CTRACE((tfp, "Converted '%s' to '%s'\n", old_string, temp));
+ if ((stat(temp, &st) > -1) ||
+ LYCanReadFile(temp)) {
+ /*
+ * It is a subdirectory or file on the local system.
+ */
+#if defined (USE_DOS_DRIVES)
+ /* Don't want to see DOS local paths like c: escaped */
+ /* especially when we really have file://localhost/ */
+ /* at the beginning. To avoid any confusion we allow */
+ /* escaping the path if URL specials % or # present. */
+ if (StrChr(temp, '#') == NULL && StrChr(temp, '%') == NULL)
+ StrAllocCopy(cp, temp);
+ else
+ cp = HTEscape(temp, URL_PATH);
+#else
+ cp = HTEscape(temp, URL_PATH);
+#endif /* USE_DOS_DRIVES */
+ StrAllocCat(*AllocatedString, cp);
+ FREE(cp);
+ CTRACE((tfp, "Converted '%s' to '%s'\n",
+ old_string, *AllocatedString));
+ is_local = TRUE;
+ } else {
+ char *cp2 = NULL;
+
+ StrAllocCopy(temp2, curdir);
+ LYAddPathSep(&temp2);
+ StrAllocCopy(cp, old_string);
+ fragment = trimPoundSelector(cp);
+ HTUnEscape(cp); /* unescape given path without fragment */
+ StrAllocCat(temp2, cp); /* append to current dir */
+ StrAllocCopy(cp2, temp2); /* keep a copy in cp2 */
+ LYTrimRelFromAbsPath(temp2);
+#ifdef WIN_EX /* 1998/07/31 (Fri) 09:09:03 */
+ HTUnEscape(temp2); /* for LFN */
+#endif
+
+ if (strcmp(temp2, temp) != 0 &&
+ ((stat(temp2, &st) > -1) ||
+ LYCanReadFile(temp2))) {
+ /*
+ * It is a subdirectory or file on the local system with
+ * escaped characters and/or a fragment to be appended to
+ * the URL. - FM
+ */
+
+ FREE(temp);
+ if (strcmp(cp2, temp2) == 0) {
+ /*
+ * LYTrimRelFromAbsPath did nothing, use old_string as
+ * given. - kw
+ */
+ temp = HTEscape(curdir, URL_PATH);
+ LYAddHtmlSep(&temp);
+ StrAllocCat(temp, old_string);
+ } else {
+ temp = HTEscape(temp2, URL_PATH);
+ if (fragment != NULL) {
+ restorePoundSelector(fragment);
+ StrAllocCat(temp, fragment);
+ }
+ }
+ StrAllocCat(*AllocatedString, temp);
+ CTRACE((tfp, "Converted '%s' to '%s'\n",
+ old_string, *AllocatedString));
+ is_local = TRUE;
+
+ } else if (StrChr(curdir, '#') != NULL ||
+ StrChr(curdir, '%') != NULL) {
+ /*
+ * If PWD has some unusual characters, construct a filename
+ * in temp where those are escaped. This is mostly to
+ * prevent this function from returning with some weird URL
+ * if the LYExpandHostForURL tests further down fail. - kw
+ */
+ FREE(temp);
+ if (strcmp(cp2, temp2) == 0) {
+ /*
+ * LYTrimRelFromAbsPath did nothing, use old_string as
+ * given. - kw
+ */
+ temp = HTEscape(curdir, URL_PATH);
+ LYAddHtmlSep(&temp);
+ StrAllocCat(temp, old_string);
+ } else {
+ temp = HTEscape(temp2, URL_PATH);
+ if (fragment != NULL) {
+ restorePoundSelector(fragment);
+ StrAllocCat(temp, fragment);
+ }
+ }
+ }
+ FREE(cp);
+ FREE(cp2);
+ }
+ if (is_local == FALSE) {
+ /*
+ * It's not an accessible subdirectory or file on the local
+ * system, so assume it's a URL request and guess the scheme
+ * with "http://" as the default.
+ */
+ CTRACE((tfp, "Can't stat() or fopen() '%s'\n",
+ temp2 ? temp2 : temp));
+#ifdef WIN_EX /* 1998/01/13 (Tue) 09:07:37 */
+ {
+ const char *p, *q;
+ char buff[LY_MAXPATH + 128];
+
+ p = Home_Dir();
+ q = temp2 ? temp2 : temp;
+
+ if (strlen(q) == 3 && LYIsDosDrive(q)) {
+ sprintf(buff,
+ "'%s' not exist, Goto LynxHome '%s'.", q, p);
+ _statusline(buff);
+ LYSleepAlert();
+ FREE(temp);
+ StrAllocCat(*AllocatedString, p);
+ goto Retry;
+ }
+ }
+#endif
+ if (LYExpandHostForURL(&old_string,
+ URLDomainPrefixes,
+ URLDomainSuffixes)) {
+ LYAddSchemeForURL(&old_string);
+ StrAllocCopy(*AllocatedString, old_string);
+ } else if (fixit) {
+ StrAllocCopy(*AllocatedString, old_string);
+ } else {
+ /* Return file URL for the file that does not exist */
+ StrAllocCat(*AllocatedString, temp);
+ }
+#ifdef WIN_EX
+ Retry:
+#endif
+ CTRACE((tfp, "Trying: '%s'\n", *AllocatedString));
+ }
+ FREE(temp);
+ FREE(temp2);
+ }
+#endif /* VMS */
+ } else {
+ /*
+ * Path begins with a slash. Simplify and use it.
+ */
+ if (old_string[1] == '\0') {
+ /*
+ * Request for root. Respect it on Unix, but on VMS we treat that
+ * as a listing of the login directory. - FM
+ */
+#ifdef VMS
+ StrAllocCat(*AllocatedString, HTVMS_wwwName(Home_Dir()));
+#else
+ StrAllocCat(*AllocatedString, "/");
+ } else if ((stat(old_string, &st) > -1) ||
+ LYCanReadFile(old_string)) {
+ /*
+ * It is an absolute directory or file on the local system. - KW
+ */
+ StrAllocCopy(temp, old_string);
+ LYTrimRelFromAbsPath(temp);
+ CTRACE((tfp, "Converted '%s' to '%s'\n", old_string, temp));
+ cp = HTEscape(temp, URL_PATH);
+ StrAllocCat(*AllocatedString, cp);
+ FREE(cp);
+ FREE(temp);
+ CTRACE((tfp, "Converted '%s' to '%s'\n",
+ old_string, *AllocatedString));
+#endif /* VMS */
+ } else if (LYIsTilde(old_string[1])) {
+ /*
+ * Has a Home_Dir() reference. Handle it as if there weren't a
+ * lead slash. - FM
+ */
+ StrAllocCat(*AllocatedString, wwwName(Home_Dir()));
+ if ((cp = StrChr((old_string + 1), '/')) != NULL) {
+ /*
+ * Append rest of path, if present, skipping "user" if "~user"
+ * was entered, simplifying, and eliminating any residual
+ * relative elements. - FM
+ */
+ StrAllocCopy(temp, cp);
+ LYTrimRelFromAbsPath(temp);
+ StrAllocCat(*AllocatedString, temp);
+ FREE(temp);
+ }
+ } else {
+ /*
+ * Normal absolute path. Simplify, trim any residual relative
+ * elements, and append it. - FM
+ */
+ StrAllocCopy(temp, old_string);
+ LYTrimRelFromAbsPath(temp);
+ StrAllocCat(*AllocatedString, temp);
+ FREE(temp);
+ }
+ CTRACE((tfp, "Converted '%s' to '%s'\n",
+ old_string, *AllocatedString));
+ }
+ FREE(old_string);
+ /* Pause so we can read the messages before invoking curses */
+ CTRACE_SLEEP(AlertSecs);
+}
+
+#if defined(_WINDOWS) /* 1998/06/23 (Tue) 16:45:20 */
+
+int win32_check_interrupt(void)
+{
+ int c;
+
+ if (kbhit()) {
+ c = LYgetch();
+ /** Keyboard 'Z' or 'z', or Control-G or Control-C **/
+ if (LYCharIsINTERRUPT(c) || c == 0x1b) {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+#if (!defined(__MINGW32__) && !defined(sleep)) || (defined(__MINGW32__) && !defined(HAVE_SLEEP))
+void sleep(unsigned sec)
+{
+ unsigned int i, j;
+
+ for (j = 0; j < sec; j++) {
+ for (i = 0; i < 10; i++) {
+ Sleep(100);
+ if (kbhit()) {
+ (void) LYgetch();
+ return;
+ }
+ }
+ }
+}
+#endif /* !__MINGW32__ */
+#endif /* _WINDOWS */
+/*
+ * This function expects an absolute Unix or VMS SHELL path spec as an
+ * allocated string, simplifies it, and trims out any residual relative
+ * elements. It also checks whether the path had a terminal slash, and if it
+ * didn't, makes sure that the simplified path doesn't either. If it's a
+ * directory, our convention is to exclude "Up to parent" links when a terminal
+ * slash is present. - FM
+ */
+void LYTrimRelFromAbsPath(char *path)
+{
+ char *cp;
+ int i;
+ BOOL TerminalSlash;
+
+ /*
+ * Make sure we have a pointer to an absolute path. - FM
+ */
+ if (path == NULL || !LYIsPathSep(*path))
+ return;
+
+ /*
+ * Check whether the path has a terminal slash. - FM
+ */
+ TerminalSlash = (BOOL) (LYIsPathSep(path[(strlen(path) - 1)]));
+
+ /*
+ * Simplify the path and then do any necessary trimming. - FM
+ */
+ HTSimplify(path, TRUE);
+ cp = path;
+ while (cp[1] == '.') {
+ if (cp[2] == '\0') {
+ /*
+ * Eliminate trailing dot. - FM
+ */
+ cp[1] = '\0';
+ } else if (LYIsPathSep(cp[2])) {
+ /*
+ * Skip over the "/." of a "/./". - FM
+ */
+ cp += 2;
+ } else if (cp[2] == '.' && cp[3] == '\0') {
+ /*
+ * Eliminate trailing dotdot. - FM
+ */
+ cp[1] = '\0';
+ } else if (cp[2] == '.' && cp[3] == '/') {
+ /*
+ * Skip over the "/.." of a "/../". - FM
+ */
+ cp += 3;
+ } else {
+ /*
+ * Done trimming. - FM
+ */
+ break;
+ }
+ }
+
+ /*
+ * Load any shifts into path, and eliminate any terminal slash created by
+ * HTSimplify() or our walk, but not present originally. - FM
+ */
+ if (cp > path) {
+ for (i = 0; cp[i] != '\0'; i++)
+ path[i] = cp[i];
+ path[i] = '\0';
+ }
+ if (TerminalSlash == FALSE) {
+ LYTrimPathSep(path);
+ }
+}
+
+/*
+ * Example Client-Side Include interface.
+ *
+ * This is called from SGML.c and simply returns markup for reporting the URL
+ * of the document being loaded if a comment begins with "<!--#lynxCSI". The
+ * markup will be included as if it were in the document. Move this function
+ * to a separate module for doing this kind of thing seriously, someday. - FM
+ */
+void LYDoCSI(char *url,
+ const char *comment,
+ char **csi)
+{
+ const char *cp = comment;
+
+ if (cp == NULL)
+ return;
+
+ if (StrNCmp(cp, "!--#", 4))
+ return;
+
+ cp += 4;
+ if (!strncasecomp(cp, "lynxCSI", 7)) {
+ StrAllocCat(*csi, "\n<p align=\"center\">URL: ");
+ StrAllocCat(*csi, url);
+ StrAllocCat(*csi, "</p>\n\n");
+ }
+
+ return;
+}
+
+#ifdef VMS
+/*
+ * Define_VMSLogical -- Fote Macrides 04-Apr-1995
+ * Define VMS logicals in the process table.
+ */
+void Define_VMSLogical(char *LogicalName,
+ char *LogicalValue)
+{
+ $DESCRIPTOR(lname, "");
+ $DESCRIPTOR(lvalue, "");
+ $DESCRIPTOR(ltable, "LNM$PROCESS");
+
+ if (isEmpty(LogicalName))
+ return;
+
+ lname.dsc$w_length = strlen(LogicalName);
+ lname.dsc$a_pointer = LogicalName;
+
+ if (isEmpty(LogicalValue)) {
+ lib$delete_logical(&lname, &ltable);
+ return;
+ }
+
+ lvalue.dsc$w_length = strlen(LogicalValue);
+ lvalue.dsc$a_pointer = LogicalValue;
+ lib$set_logical(&lname, &lvalue, &ltable, 0, 0);
+ return;
+}
+#endif /* VMS */
+
+#ifdef LY_FIND_LEAKS
+static void LYHomeDir_free(void)
+{
+ FREE(HomeDir);
+}
+#endif /* LY_FIND_LEAKS */
+
+char *Current_Dir(char *pathname)
+{
+ char *result;
+
+#ifdef HAVE_GETCWD
+ result = getcwd(pathname, (size_t) LY_MAXPATH);
+#else
+ result = getwd(pathname);
+#endif /* NO_GETCWD */
+ if (result == 0)
+ strcpy(pathname, ".");
+ return pathname;
+}
+
+/*
+ * Verify that the given path refers to an existing directory, returning the
+ * string if the directory exists. If not, return null.
+ */
+static char *CheckDir(char *path)
+{
+ struct stat stat_info;
+
+ if (!LYisAbsPath(path)
+ || (HTStat(path, &stat_info) < 0
+ || !S_ISDIR(stat_info.st_mode))) {
+ path = NULL;
+ }
+ CTRACE((tfp, "CheckDir(%s) %s\n", NonNull(path), path ? "OK" : "ERR"));
+ return path;
+}
+
+/*
+ * Lookup various possibilities for $HOME, and check that the directory exists.
+ */
+static char *HomeEnv(void)
+{
+ char *result = CheckDir(LYGetEnv("HOME"));
+
+#if defined (USE_DOS_DRIVES) && defined(_WIN32)
+ if (result == 0) {
+ char *head;
+ char *leaf;
+ static char *temp = NULL;
+
+ result = w32_get_shell_folder("Personal");
+ if (result == 0) {
+ /* Windows Vista/7 */
+ if ((head = LYGetEnv("USERPROFILE")) != 0) {
+ HTSprintf0(&temp, "%s%sDocuments", head, FILE_SEPARATOR);
+ result = CheckDir(temp);
+ if (result == 0) {
+ /* Windows 2000 */
+ HTSprintf0(&temp, "%s%sMy Documents", head, FILE_SEPARATOR);
+ result = CheckDir(temp);
+ }
+ }
+ }
+ /* NT4 */
+ if (result == 0) {
+ if ((head = LYGetEnv("HOMEDRIVE")) != 0) {
+ if ((leaf = LYGetEnv("HOMEPATH")) != 0) {
+ HTSprintf0(&temp, "%s%s%s", head, FILE_SEPARATOR, leaf);
+ result = CheckDir(temp);
+ }
+ }
+ }
+ /* General M$ */
+#ifdef USE_PROGRAM_DIR
+ if (result == 0)
+ result = CheckDir(program_dir);
+#endif
+ if (result == 0)
+ result = CheckDir(LYGetEnv("TEMP"));
+ if (result == 0)
+ result = CheckDir(LYGetEnv("TMP"));
+ if (result == 0) {
+ if ((head = LYGetEnv("SystemDrive")) != 0) {
+ HTSprintf0(&temp, "%s%s", head, FILE_SEPARATOR);
+ result = CheckDir(temp);
+ }
+ }
+ if (result == 0)
+ result = CheckDir("C:" FILE_SEPARATOR);
+ }
+#endif
+
+ return result;
+}
+
+const char *Home_Dir(void)
+{
+ static const char *homedir = NULL;
+ char *cp = NULL;
+
+ if (homedir == NULL) {
+ if ((cp = HomeEnv()) == NULL) {
+#ifdef VMS
+ if ((cp = LYGetEnv("SYS$LOGIN")) == NULL
+ && (cp = LYGetEnv("SYS$SCRATCH")) == NULL) {
+ cp = "sys$scratch:";
+ }
+ StrAllocCopy(HomeDir, cp);
+#else
+#ifdef UNIX
+#ifdef HAVE_UTMP
+ /*
+ * One could use getlogin() and getpwnam() here instead.
+ */
+ struct passwd *pw = getpwuid(geteuid());
+
+ if (pw && pw->pw_dir) {
+ StrAllocCopy(HomeDir, pw->pw_dir);
+ } else
+#endif
+ {
+ /*
+ * Use /tmp; it should be writable.
+ */
+ StrAllocCopy(HomeDir, "/tmp");
+ }
+#endif
+#endif /* VMS */
+ } else {
+ StrAllocCopy(HomeDir, cp);
+ }
+ homedir = (const char *) HomeDir;
+#ifdef LY_FIND_LEAKS
+ atexit(LYHomeDir_free);
+#endif
+ }
+ if (homedir == NULL) {
+ printf("%s\n", gettext("Cannot find HOME directory"));
+ exit_immediately(EXIT_FAILURE);
+ }
+ return homedir;
+}
+
+/*
+ * Return a pointer to the final leaf of the given pathname, If no pathname
+ * separators are found, returns the original pathname. The leaf may be
+ * empty.
+ */
+char *LYPathLeaf(char *pathname)
+{
+ char *leaf;
+
+#ifdef UNIX
+ if ((leaf = strrchr(pathname, '/')) != 0) {
+ leaf++;
+ }
+#else
+#ifdef VMS
+ if ((leaf = strrchr(pathname, ']')) == 0)
+ leaf = strrchr(pathname, ':');
+ if (leaf != 0)
+ leaf++;
+#else
+ int n;
+
+ for (leaf = 0, n = (int) strlen(pathname) - 1; n >= 0; n--) {
+ if (StrChr("\\/:", pathname[n]) != 0) {
+ leaf = pathname + n + 1;
+ break;
+ }
+ }
+#endif
+#endif
+ return (leaf != 0) ? leaf : pathname;
+}
+
+/*
+ * This function checks the acceptability of file paths that are intended to be
+ * off the home directory. The file path should be passed in fbuffer, together
+ * with the size of the buffer. The function simplifies the file path, and if
+ * it is acceptable, loads it into fbuffer and returns TRUE. Otherwise, it
+ * does not modify fbuffer and returns FALSE. If a subdirectory is present and
+ * the path does not begin with "./", that is prefixed to make the situation
+ * clear. - FM
+ */
+BOOLEAN LYPathOffHomeOK(char *fbuffer,
+ size_t fbuffer_size)
+{
+ char *file = NULL;
+ char *cp, *cp1;
+
+ /*
+ * Make sure we have an fbuffer and a string in it. - FM
+ */
+ if (fbuffer_size < 2 || isEmpty(fbuffer)) {
+ return (FALSE);
+ }
+ StrAllocCopy(file, fbuffer);
+ cp = file;
+
+ /*
+ * Check for an inappropriate reference to the home directory, and correct
+ * it if we can. - FM
+ */
+#ifdef VMS
+ if (!strncasecomp(cp, "sys$login", 9)) {
+ if (*(cp + 9) == '\0') {
+ /*
+ * Reject "sys$login". - FM
+ */
+ FREE(file);
+ return (FALSE);
+ }
+ if (*(cp + 9) == ':') {
+ cp += 10;
+ if (*cp == '\0') {
+ /*
+ * Reject "sys$login:". Otherwise, we have converted
+ * "sys$login:file" to "file", or have left a strange path for
+ * VMS as it was originally. - FM
+ */
+ FREE(file);
+ return (FALSE);
+ }
+ }
+ }
+#endif /* VMS */
+ if (LYIsTilde(cp[0])) {
+ if (LYIsPathSep(cp[1])) {
+ if (cp[2] != '\0') {
+ if (StrChr((cp + 2), '/') != NULL) {
+ /*
+ * Convert "~/subdir(s)/file" to "./subdir(s)/file". - FM
+ */
+ *cp = '.';
+ } else {
+ /*
+ * Convert "~/file" to "file". - FM
+ */
+ cp += 2;
+ }
+ } else {
+ /*
+ * Reject "~/". - FM
+ */
+ FREE(file);
+ return (FALSE);
+ }
+ } else if ((*(cp + 1) != '\0') &&
+ (cp1 = StrChr((cp + 1), '/')) != NULL) {
+ cp = (cp1 - 1);
+ if (*(cp + 2) != '\0') {
+ if (StrChr((cp + 2), '/') != NULL) {
+ /*
+ * Convert "~user/subdir(s)/file" to "./subdir(s)/file".
+ * If user is someone else, we covered a spoof. Otherwise,
+ * we simplified. - FM
+ */
+ *cp = '.';
+ } else {
+ /*
+ * Convert "~user/file" to "file". - FM
+ */
+ cp += 2;
+ }
+ } else {
+ /*
+ * Reject "~user/". - FM
+ */
+ FREE(file);
+ return (FALSE);
+ }
+ } else {
+ /*
+ * Reject "~user". - FM
+ */
+ FREE(file);
+ return (FALSE);
+ }
+ }
+#ifdef VMS
+ /*
+ * Check for VMS path specs, and reject if still present. - FM
+ */
+ if (StrChr(cp, ':') != NULL || StrChr(cp, ']') != NULL) {
+ FREE(file);
+ return (FALSE);
+ }
+#endif /* VMS */
+
+ /*
+ * Check for a URL or absolute path, and reject if present. - FM
+ */
+ if (is_url(cp) || LYIsPathSep(*cp)) {
+ FREE(file);
+ return (FALSE);
+ }
+
+ /*
+ * Simplify it. - FM
+ */
+ HTSimplify(cp, FALSE);
+
+ /*
+ * Check if it has a pointless "./". - FM
+ */
+ if (!StrNCmp(cp, "./", 2)) {
+ if (StrChr((cp + 2), '/') == NULL) {
+ cp += 2;
+ }
+ }
+
+ /*
+ * Check for spoofing. - FM
+ */
+ if (*cp == '\0'
+ || LYIsPathSep(*cp)
+ || LYIsPathSep(cp[(strlen(cp) - 1)])
+ || strstr(cp, "..") != NULL
+ || !strcmp(cp, ".")) {
+ FREE(file);
+ return (FALSE);
+ }
+
+ /*
+ * Load what we have at this point into fbuffer, trimming if too long, and
+ * claim it's OK. - FM
+ */
+ if (fbuffer_size > 3 && StrNCmp(cp, "./", 2) && StrChr(cp, '/')) {
+ /*
+ * We have a subdirectory and no lead "./", so prefix it to make the
+ * situation clear. - FM
+ */
+ strcpy(fbuffer, "./");
+ if (strlen(cp) > (fbuffer_size - 3))
+ cp[(fbuffer_size - 3)] = '\0';
+ strcat(fbuffer, cp);
+ } else {
+ if (strlen(cp) > (fbuffer_size - 1))
+ cp[(fbuffer_size - 1)] = '\0';
+ strcpy(fbuffer, cp);
+ }
+ FREE(file);
+ return (TRUE);
+}
+
+/*
+ * Search for a leading tilde, optionally embedded. If found, return a pointer
+ * to the tilde. If not found, return the original parameter.
+ */
+static char *FindLeadingTilde(char *pathname, int embedded)
+{
+ char *result = pathname;
+
+ if (pathname != NULL) {
+ if (embedded) {
+ while (pathname[0] != '\0') {
+ if (LYIsPathSep(pathname[0])) {
+ if (LYIsTilde(pathname[1])) {
+ ++pathname;
+ break;
+ }
+ }
+ ++pathname;
+ }
+ }
+ if (LYIsTilde(*pathname))
+ result = pathname;
+ }
+ return result;
+}
+
+/*
+ * Convert a non-absolute path to one which is off the home directory. Expand
+ * tildes as a side-effect. Return a pointer to the converted result.
+ */
+char *LYAbsOrHomePath(char **fname)
+{
+ if (*fname && !LYisAbsPath(*fname)) {
+ if (LYIsTilde((*fname)[0])) {
+ LYTildeExpand(fname, FALSE);
+ } else {
+ char temp[LY_MAXPATH];
+
+ LYAddPathToHome(temp, sizeof(temp), *fname);
+ StrAllocCopy(*fname, temp);
+ }
+ }
+ return *fname;
+}
+
+/*
+ * Expand a "leading" tilde into the user's home directory in WWW format. If
+ * "embedded" is true, allow that "leading" tilde to follow a path separator.
+ */
+char *LYTildeExpand(char **pathname,
+ int embedded)
+{
+ char *temp = FindLeadingTilde(*pathname, embedded);
+
+ if (LYIsTilde(temp[0])) {
+
+ CTRACE((tfp, "LYTildeExpand %s\n", *pathname));
+ if (LYIsPathSep(temp[1])) {
+ char *first = NULL;
+ char *second = NULL;
+
+ StrAllocCopy(first, *pathname);
+ first[temp - *pathname] = '\0';
+
+ StrAllocCopy(second, temp + 2);
+
+ StrAllocCopy(*pathname, first);
+ StrAllocCat(*pathname, wwwName(Home_Dir()));
+ LYAddPathSep(pathname);
+ StrAllocCat(*pathname, second);
+
+ FREE(first);
+ FREE(second);
+ } else if (temp[1] == '\0') {
+ StrAllocCopy(*pathname, wwwName(Home_Dir()));
+#ifndef NOUSERS
+ } else {
+ char *save;
+ char saved = '\0';
+ struct passwd *pw;
+
+ for (save = temp; *save != '\0'; ++save) {
+ if (LYIsPathSep(*save)) {
+ saved = *save;
+ *save = '\0';
+ break;
+ }
+ }
+ pw = getpwnam(temp + 1);
+ *save = saved;
+ if (pw != 0 && non_empty(pw->pw_dir)) {
+ temp = NULL;
+ StrAllocCopy(temp, save);
+ StrAllocCopy(*pathname, pw->pw_dir);
+ StrAllocCat(*pathname, temp);
+ FREE(temp);
+ }
+#endif
+ }
+ CTRACE((tfp, "expanded path %s\n", *pathname));
+ }
+ return *pathname;
+}
+
+/*
+ * This function appends fname to the home path and returns the full path and
+ * filename. The fname string can be just a filename (e.g.,
+ * "lynx_bookmarks.html"), or include a subdirectory off the home directory, in
+ * which case fname should begin with "./" (e.g., ./BM/lynx_bookmarks.html) Use
+ * LYPathOffHomeOK() to check and/or fix up fname before calling this function.
+ * On VMS, the resultant full path and filename are converted to VMS syntax. -
+ * FM
+ */
+void LYAddPathToHome(char *fbuffer,
+ size_t fbuffer_size,
+ const char *fname)
+{
+ char *home = NULL;
+ const char *file = fname;
+ int len;
+
+ /*
+ * Make sure we have a buffer. - FM
+ */
+ if (!fbuffer)
+ return;
+ if (fbuffer_size < 2) {
+ fbuffer[0] = '\0';
+ return;
+ }
+ fbuffer[(fbuffer_size - 1)] = '\0';
+
+ /*
+ * Make sure we have a file name. - FM
+ */
+ if (!file)
+ file = "";
+
+ /*
+ * Set up home string and length. - FM
+ */
+ StrAllocCopy(home, Home_Dir());
+
+#ifdef VMS
+#define NO_HOMEPATH "Error:"
+#else
+#define NO_HOMEPATH "/error"
+#endif /* VMS */
+ if (!non_empty(home))
+ /*
+ * Home_Dir() has a bug if this ever happens. - FM
+ */
+ StrAllocCopy(home, NO_HOMEPATH);
+
+ len = (int) fbuffer_size - ((int) strlen(home) + 1);
+ if (len <= 0) {
+ /*
+ * Buffer is smaller than or only big enough for the home path. Load
+ * what fits of the home path and return. This will fail, but we need
+ * something in the buffer. - FM
+ */
+ LYStrNCpy(fbuffer, home, (fbuffer_size - 1));
+ FREE(home);
+ return;
+ }
+#ifdef VMS
+ /*
+ * Check whether we have a subdirectory path or just a filename. - FM
+ */
+ if (!StrNCmp(file, "./", 2)) {
+ /*
+ * We have a subdirectory path. - FM
+ */
+ if (home[strlen(home) - 1] == ']') {
+ /*
+ * We got the home directory, so convert it to SHELL syntax and
+ * append subdirectory path, then convert that to VMS syntax. - FM
+ */
+ char *temp = NULL;
+
+ HTSprintf0(&temp, "%s%s", HTVMS_wwwName(home), (file + 1));
+ sprintf(fbuffer, "%.*s",
+ (fbuffer_size - 1), HTVMS_name("", temp));
+ FREE(temp);
+ } else {
+ /*
+ * This will fail, but we need something in the buffer. - FM
+ */
+ sprintf(fbuffer, "%s%.*s", home, len, file);
+ }
+ } else {
+ /*
+ * We have a file in the home directory. - FM
+ */
+ sprintf(fbuffer, "%s%.*s", home, len, file);
+ }
+#else
+ /*
+ * Check whether we have a subdirectory path or just a filename. - FM
+ */
+ sprintf(fbuffer, "%s/%.*s", home, len,
+ (StrNCmp(file, "./", 2) ? file : (file + 2)));
+#endif /* VMS */
+ FREE(home);
+}
+
+/*
+ * Given a filename, concatenate it to the save-space pathname, unless it is
+ * an absolute pathname. If there is no save-space defined, use the home
+ * directory. Return a new string with the result.
+ */
+char *LYAddPathToSave(char *fname)
+{
+ char *result = NULL;
+
+ if (LYisAbsPath(fname)) {
+ StrAllocCopy(result, fname);
+ } else {
+ if (non_empty(lynx_save_space)) {
+ StrAllocCopy(result, lynx_save_space);
+ } else {
+ char temp[LY_MAXPATH];
+
+ LYAddPathToHome(temp, sizeof(temp), fname);
+ StrAllocCopy(result, temp);
+ }
+ }
+ return result;
+}
+
+#if !defined(HAVE_PUTENV) && !defined(_WINDOWS)
+/*
+ * No putenv on the NeXT so we use this code instead!
+ */
+
+/* Copyright (C) 1991 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#if defined(STDC_HEADERS) || defined(USG)
+#include <string.h>
+#else /* Not (STDC_HEADERS or USG): */
+#include <strings.h>
+#endif /* STDC_HEADERS or USG */
+
+#ifndef NULL
+#define NULL 0
+#endif /* !NULL */
+
+extern char **environ;
+
+/*
+ * Put STRING, which is of the form "NAME=VALUE", in the environment.
+ */
+int putenv(const char *string)
+{
+ char *name_end = StrChr(string, '=');
+ register size_t size;
+ register char **ep;
+
+ if (name_end == NULL) {
+ /* Remove the variable from the environment. */
+ size = strlen(string);
+ for (ep = environ; *ep != NULL; ++ep)
+ if (!StrNCmp(*ep, string, size) && (*ep)[size] == '=') {
+ while (ep[1] != NULL) {
+ ep[0] = ep[1];
+ ++ep;
+ }
+ *ep = NULL;
+ return 0;
+ }
+ }
+
+ size = 0;
+ for (ep = environ; *ep != NULL; ++ep)
+ if (!StrNCmp(*ep, string, name_end - string) &&
+ (*ep)[name_end - string] == '=')
+ break;
+ else
+ ++size;
+
+ if (*ep == NULL) {
+ static char **last_environ = NULL;
+ char **new_environ = (char **) malloc((size + 2) * sizeof(char *));
+
+ if (new_environ == NULL)
+ return -1;
+ (void) memcpy((char *) new_environ, (char *) environ, size * sizeof(char *));
+
+ new_environ[size] = (char *) string;
+ new_environ[size + 1] = NULL;
+ if (last_environ != NULL)
+ FREE(last_environ);
+ last_environ = new_environ;
+ environ = new_environ;
+ } else
+ *ep = (char *) string;
+
+ return 0;
+}
+#endif /* !HAVE_PUTENV */
+
+#ifdef NEED_REMOVE
+int remove(char *name)
+{
+ return unlink(name);
+}
+#endif
+
+#if defined(MULTI_USER_UNIX)
+
+#if defined(HAVE_LSTAT) && defined(S_IFLNK)
+/*
+ * If IsOurFile() is checking a symbolic link, ensure that the target
+ * points to the user's file as well.
+ */
+static BOOL IsOurSymlink(const char *name)
+{
+ BOOL result = FALSE;
+ size_t size = LY_MAXPATH;
+ size_t used;
+ char *buffer = typeMallocn(char, (unsigned) size);
+ char *check;
+
+ if (buffer != 0) {
+ while ((used = (size_t) readlink(name, buffer, (size - 1))) == size - 1) {
+ check = typeRealloc(char, buffer, (unsigned) (size *= 2));
+
+ if (check == 0)
+ break;
+ buffer = check;
+ }
+ if (buffer != 0) {
+ if ((int) used > 0) {
+ buffer[used] = '\0';
+ } else {
+ FREE(buffer);
+ }
+ }
+ }
+ if (buffer != 0) {
+ if (!LYisAbsPath(buffer)) {
+ char *cutoff = LYLastPathSep(name);
+ char *clone = NULL;
+
+ if (cutoff != 0) {
+ HTSprintf0(&clone, "%.*s%s%s",
+ (int) (cutoff - name),
+ name, FILE_SEPARATOR, buffer);
+ FREE(buffer);
+ buffer = clone;
+ }
+ }
+ CTRACE2(TRACE_CFG, (tfp, "IsOurSymlink(%s -> %s)\n", name, buffer));
+ result = IsOurFile(buffer);
+ FREE(buffer);
+ }
+ return result;
+}
+#endif
+
+/*
+ * Verify if this is really a file which is not accessed by a symbolic link,
+ * except for the special case of its directory being pointed to by a link from
+ * a directory owned by root and not writable by other users.
+ */
+BOOL IsOurFile(const char *name)
+{
+ BOOL result = FALSE;
+ struct stat data;
+
+ if (!LYIsTilde(name[0])
+ && lstat(name, &data) == 0
+ && ((S_ISREG(data.st_mode)
+ && (data.st_mode & (S_IWOTH | S_IWGRP)) == 0
+ && data.st_uid == getuid())
+#if defined(HAVE_LSTAT) && defined(S_IFLNK)
+ || (S_ISLNK(data.st_mode) && IsOurSymlink(name))
+#endif
+ )) {
+ int linked = FALSE;
+
+ /*
+ * ( If this is not a single-user system, the other user is presumed by
+ * some people busy trying to use a symlink attack on our files ;-)
+ */
+#if defined(HAVE_LSTAT)
+ char *path = 0;
+ char *leaf;
+
+ StrAllocCopy(path, name);
+ do {
+ if ((leaf = LYPathLeaf(path)) != path)
+ *--leaf = '\0'; /* write a null on the '/' */
+ if (lstat(*path ? path : "/", &data) != 0) {
+ break;
+ }
+ /*
+ * If we find a symbolic link, it has to be in a directory that's
+ * protected. Otherwise someone could have switched it to point
+ * to one of the real user's files.
+ */
+ if (S_ISLNK(data.st_mode)) {
+ linked = TRUE; /* could be link-to-link; doesn't matter */
+ } else if (S_ISDIR(data.st_mode)) {
+ if (linked) {
+ linked = FALSE;
+ /*
+ * We assume that a properly-configured system has the
+ * unwritable directories owned by root. This is not
+ * necessarily so (bin, news, etc., may), but the only
+ * uid we can count on is 0. It would be nice to add a
+ * check for the gid also, but that wouldn't be
+ * portable.
+ *
+ * Likewise, the t-bit would be nice to rely upon. However
+ * it is marked as an extension in POSIX, rather than
+ * required.
+ */
+ if (data.st_uid != 0
+ || (data.st_mode & S_IWOTH) != 0) {
+ linked = TRUE; /* force an error-return */
+ break;
+ }
+ }
+ } else if (linked) {
+ break;
+ }
+ } while (leaf != path);
+ FREE(path);
+#endif
+ result = (BOOLEAN) !linked;
+ }
+ CTRACE2(TRACE_CFG, (tfp, "IsOurFile(%s) %d\n", name, result));
+ return result;
+}
+
+/*
+ * Open a file that we don't want other users to see.
+ */
+static FILE *OpenHiddenFile(const char *name, const char *mode)
+{
+ FILE *fp = 0;
+ struct stat data;
+ BOOLEAN binary = (BOOLEAN) (StrChr(mode, 'b') != 0);
+
+#if defined(O_CREAT) && defined(O_EXCL) /* we have fcntl.h or kindred? */
+ /*
+ * This is the preferred method for creating new files, since it ensures
+ * that no one has an existing file or link that they happen to own.
+ */
+ if (*mode == 'w') {
+ int fd = open(name, O_CREAT | O_EXCL | O_WRONLY, HIDE_CHMOD);
+
+ if (fd < 0
+ && errno == EEXIST
+ && IsOurFile(name)) {
+ if (remove(name) == 0) {
+ /* FIXME: there's a race at this point if directory is open */
+ fd = open(name, O_CREAT | O_EXCL | O_WRONLY, HIDE_CHMOD);
+ }
+ }
+ if (fd >= 0) {
+#if defined(O_BINARY) && defined(__CYGWIN__)
+ if (binary)
+ setmode(fd, O_BINARY);
+#endif
+ fp = fdopen(fd, mode);
+ }
+ } else
+#endif
+ if (*mode == 'a') {
+ if (IsOurFile(name)
+ && chmod(name, HIDE_CHMOD) == 0)
+ fp = fopen(name, mode);
+ else if (lstat(name, &data) != 0)
+ fp = OpenHiddenFile(name, binary ? BIN_W : TXT_W);
+ /*
+ * This is less stringent, but reasonably portable. For new files, the
+ * umask will suffice; however if the file already exists we'll change
+ * permissions first, before opening it. If the chmod fails because of
+ * some reason other than a non-existent file, there's no point in trying
+ * to open it.
+ *
+ * This won't work properly if the user is root, since the chmod succeeds.
+ */
+ } else if (*mode != 'a') {
+ mode_t save = umask(HIDE_UMASK);
+
+ if (chmod(name, HIDE_CHMOD) == 0 || errno == ENOENT)
+ fp = fopen(name, mode);
+ (void) umask(save);
+ }
+ return fp;
+}
+#else
+#define OpenHiddenFile(name, mode) fopen(name, mode)
+#endif /* MULTI_USER_UNIX */
+
+FILE *LYNewBinFile(const char *name)
+{
+#ifdef VMS
+ FILE *fp = fopen(name, BIN_W, "mbc=32");
+
+ (void) chmod(name, HIDE_CHMOD);
+#else
+ FILE *fp = OpenHiddenFile(name, BIN_W);
+#endif
+ return fp;
+}
+
+FILE *LYNewTxtFile(const char *name)
+{
+ FILE *fp;
+
+#ifdef VMS
+ fp = fopen(name, TXT_W, "shr=get");
+ (void) chmod(name, HIDE_CHMOD);
+#else
+ SetDefaultMode(O_TEXT);
+
+ fp = OpenHiddenFile(name, TXT_W);
+
+ SetDefaultMode(O_BINARY);
+#endif
+
+ return fp;
+}
+
+FILE *LYAppendToTxtFile(const char *name)
+{
+ FILE *fp;
+
+#ifdef VMS
+ fp = fopen(name, TXT_A, "shr=get");
+ (void) chmod(name, HIDE_CHMOD);
+#else
+ SetDefaultMode(O_TEXT);
+
+ fp = OpenHiddenFile(name, TXT_A);
+
+ SetDefaultMode(O_BINARY);
+#endif
+ return fp;
+}
+
+#if defined(MULTI_USER_UNIX)
+/*
+ * Restore normal permissions to a copy of a file that we have created with
+ * temp file restricted permissions. The normal umask should apply for user
+ * files. - kw
+ */
+void LYRelaxFilePermissions(const char *name)
+{
+ mode_t mode;
+ struct stat stat_buf;
+
+ if (stat(name, &stat_buf) == 0 &&
+ S_ISREG(stat_buf.st_mode) &&
+ (mode = (stat_buf.st_mode & 0777)) == HIDE_CHMOD) {
+ /*
+ * It looks plausible that this is a file we created with temp file
+ * paranoid permissions (and the umask wasn't even more restrictive
+ * when it was copied). - kw
+ */
+ mode_t save = umask(HIDE_UMASK);
+
+ mode = (mode_t) (((mode & 0700) | 0066) & ~save);
+ (void) umask(save);
+ (void) chmod(name, mode);
+ }
+}
+#endif
+
+/*
+ * Check if the given anchor has an associated file-cache.
+ */
+BOOLEAN LYCachedTemp(char *target,
+ char **cached)
+{
+ BOOLEAN result = FALSE;
+
+ if (*cached) {
+ LYStrNCpy(target, *cached, LY_MAXPATH);
+ FREE(*cached);
+ if (LYCanReadFile(target)) {
+ if (remove(target) != 0) {
+ CTRACE((tfp, "cannot remove %s\n", target));
+ }
+ }
+ result = TRUE;
+ }
+ return result;
+}
+
+#ifndef HAVE_MKDTEMP
+#define mkdtemp(path) ((mktemp(path) != 0) && (mkdir(path, 0700) == 0))
+#endif
+
+/*
+ * Open a temp-file, ensuring that it is unique, and not readable by other
+ * users.
+ *
+ * The mode can be one of: "w", "a", "wb".
+ */
+FILE *LYOpenTemp(char *result,
+ const char *suffix,
+ const char *mode)
+{
+ FILE *fp = 0;
+ BOOL txt = TRUE;
+ char wrt = 'r';
+ LY_TEMP *p;
+
+ CTRACE((tfp, "LYOpenTemp(,%s,%s)\n", suffix, mode));
+ if (result == 0)
+ return 0;
+
+ while (*mode != '\0') {
+ switch (*mode++) {
+ case 'w':
+ wrt = 'w';
+ break;
+ case 'a':
+ wrt = 'a';
+ break;
+ case 'b':
+ txt = FALSE;
+ break;
+ default:
+ CTRACE((tfp, "%s @%d: BUG\n", __FILE__, __LINE__));
+ return 0;
+ }
+ }
+
+ /*
+ * Verify if the given space looks secure enough. Otherwise, make a
+ * secure subdirectory of that.
+ */
+#if defined(MULTI_USER_UNIX) && (defined(HAVE_MKTEMP) || defined(HAVE_MKDTEMP))
+ if (lynx_temp_subspace == 0) {
+ BOOL make_it = FALSE;
+ struct stat sb;
+
+ if (lstat(lynx_temp_space, &sb) == 0
+ && S_ISDIR(sb.st_mode)) {
+ if (sb.st_uid != getuid()
+ || (sb.st_mode & (S_IWOTH | S_IWGRP)) != 0) {
+ make_it = TRUE;
+ CTRACE((tfp,
+ "lynx_temp_space is not our directory %s owner %d mode %03o\n",
+ lynx_temp_space,
+ (int) sb.st_uid,
+ (unsigned) (sb.st_mode & 0777)));
+ }
+ } else {
+ make_it = TRUE;
+ CTRACE((tfp, "lynx_temp_space is not a directory %s\n", lynx_temp_space));
+ }
+ if (make_it) {
+ mode_t old_mask = umask(HIDE_UMASK);
+
+ StrAllocCat(lynx_temp_space, "lynxXXXXXXXXXX");
+ if (mkdtemp(lynx_temp_space) == 0) {
+ printf("%s: %s\n", lynx_temp_space, LYStrerror(errno));
+ exit_immediately(EXIT_FAILURE);
+ }
+ (void) umask(old_mask);
+ lynx_temp_subspace = 1;
+ StrAllocCat(lynx_temp_space, "/");
+ CTRACE((tfp, "made subdirectory %s\n", lynx_temp_space));
+ } else {
+ lynx_temp_subspace = -1;
+ }
+ }
+#endif
+
+ do {
+ if (!fmt_tempname(result, lynx_temp_space, suffix))
+ return 0;
+ if (txt) {
+ switch (wrt) {
+ case 'w':
+ fp = LYNewTxtFile(result);
+ break;
+ case 'a':
+ fp = LYAppendToTxtFile(result);
+ break;
+ }
+ } else {
+ fp = LYNewBinFile(result);
+ }
+ /*
+ * If we get a failure to make a temporary file, don't bother to try a
+ * different name unless the failure was because the file already
+ * exists.
+ */
+#ifdef EEXIST /* FIXME (need a better test) in fcntl.h or unistd.h */
+ if ((fp == 0) && (errno != EEXIST)) {
+ CTRACE((tfp, "... LYOpenTemp(%s) failed: %s\n",
+ result, LYStrerror(errno)));
+ return 0;
+ }
+#endif
+ } while (fp == 0);
+
+ if ((p = typecalloc(LY_TEMP)) != 0) {
+ p->next = ly_temp;
+ StrAllocCopy((p->name), result);
+ p->file = fp;
+ p->outs = (BOOLEAN) (wrt != 'r');
+ ly_temp = p;
+ } else {
+ outofmem(__FILE__, "LYOpenTemp");
+ }
+
+ CTRACE((tfp, "... LYOpenTemp(%s)\n", result));
+ return fp;
+}
+
+/*
+ * Reopen a temporary file
+ */
+FILE *LYReopenTemp(char *name)
+{
+ LY_TEMP *p;
+ FILE *fp = 0;
+
+ LYCloseTemp(name);
+ if ((p = FindTempfileByName(name)) != 0) {
+ fp = p->file = LYAppendToTxtFile(name);
+ }
+ return fp;
+}
+
+/*
+ * Open a temp-file for writing, possibly re-using a previously used
+ * name and file.
+ * If a non-empty fname is given, it is reused if it indicates a file
+ * previously registered as a temp file and, in case the file still
+ * exists, if it looks like we can write to it safely. Otherwise a
+ * new temp file (with new name) will be generated and returned in fname.
+ *
+ * File permissions are set so that the file is not readable by unprivileged
+ * other users.
+ *
+ * Suffix is only used if fname is not being reused.
+ * The mode should be "w", others are possible (they may be passed on)
+ * but probably don't make sense. - kw
+ */
+FILE *LYOpenTempRewrite(char *fname,
+ const char *suffix,
+ const char *mode)
+{
+ FILE *fp = 0;
+ BOOL txt = TRUE;
+ char wrt = 'r';
+ BOOL registered = NO;
+ BOOL writable_exists = NO;
+ BOOL is_ours = NO;
+ BOOL still_open = NO;
+ LY_TEMP *p;
+ struct stat stat_buf;
+
+ CTRACE((tfp, "LYOpenTempRewrite(%s,%s,%s)\n", fname, suffix, mode));
+ if (*fname == '\0') /* first time, no filename yet */
+ return (LYOpenTemp(fname, suffix, mode));
+
+ if ((p = FindTempfileByName(fname)) != 0) {
+ registered = YES;
+ if (p->file != 0)
+ still_open = YES;
+ CTRACE((tfp, "...used before%s\n", still_open ? ", still open!" : "."));
+ }
+
+ if (registered) {
+#ifndef NO_GROUPS
+ writable_exists = HTEditable(fname); /* existing, can write */
+#define CTRACE_EXISTS "exists and is writable, "
+#else
+ writable_exists = (BOOL) (stat(fname, &stat_buf) == 0); /* existing, assume can write */
+#define CTRACE_EXISTS "exists, "
+#endif
+
+ if (writable_exists) {
+ is_ours = IsOurFile(fname);
+ }
+ CTRACE((tfp, "...%s%s\n",
+ writable_exists ? CTRACE_EXISTS : "",
+ is_ours ? "is our file." : "is NOT our file."));
+ }
+
+ /*
+ * Note that in cases where LYOpenTemp is called as fallback below, we
+ * don't call LYRemoveTemp first. That may be appropriate in some cases,
+ * but not trying to remove a weird existing file seems safer and could
+ * help diagnose an unusual situation. (They may be removed anyway later.)
+ */
+ if (still_open) {
+ /*
+ * This should probably not happen. Make a new one.
+ */
+ return (LYOpenTemp(fname, suffix, mode));
+ } else if (!registered) {
+ /*
+ * Not registered. It should have been registered at one point though,
+ * otherwise we wouldn't be called like this.
+ */
+ return (LYOpenTemp(fname, suffix, mode));
+ } else if (writable_exists && !is_ours) {
+ /*
+ * File exists, writable if we checked, but something is wrong with it.
+ */
+ return (LYOpenTemp(fname, suffix, mode));
+#ifndef NO_GROUPS
+ } else if (!is_ours && (lstat(fname, &stat_buf) == 0)) {
+ /*
+ * Exists but not writable, and something is wrong with it.
+ */
+ return (LYOpenTemp(fname, suffix, mode));
+#endif
+ }
+
+ while (*mode != '\0') {
+ switch (*mode++) {
+ case 'w':
+ wrt = 'w';
+ break;
+ case 'a':
+ wrt = 'a';
+ break;
+ case 'b':
+ txt = FALSE;
+ break;
+ default:
+ CTRACE((tfp, "%s @%d: BUG\n", __FILE__, __LINE__));
+ return fp;
+ }
+ }
+
+ if (is_ours) {
+ /*
+ * Yes, it exists, is writable if we checked, and everything looks ok
+ * so far. This should be the most regular case. - kw
+ */
+#ifdef HAVE_TRUNCATE
+ if (txt == TRUE) { /* limitation of LYReopenTemp. shrug */
+ /*
+ * We truncate and then append, this avoids having a small window
+ * in which the file doesn't exist. - kw
+ */
+ if (truncate(fname, (off_t) 0) != 0) {
+ CTRACE((tfp, "... truncate(%s,0) failed: %s\n",
+ fname, LYStrerror(errno)));
+ return (LYOpenTemp(fname, suffix, mode));
+ } else {
+ return (LYReopenTemp(fname));
+ }
+ }
+#endif
+ remove(fname);
+
+ }
+
+ /* We come here in two cases: either the file existed and was ours and we
+ * just got rid of it. Or the file did and does not exist, but is
+ * registered as a temp file. It must have been removed by some means
+ * other than LYRemoveTemp. In both cases, reuse the name! - kw
+ */
+
+ if (txt) {
+ switch (wrt) {
+ case 'w':
+ fp = LYNewTxtFile(fname);
+ break;
+ case 'a':
+ fp = LYAppendToTxtFile(fname);
+ break;
+ }
+ } else {
+ fp = LYNewBinFile(fname);
+ }
+ p->file = fp;
+
+ CTRACE((tfp, "... LYOpenTempRewrite(%s), %s\n", fname,
+ (fp) ? "ok" : "failed"));
+ /*
+ * We could fall back to trying LYOpenTemp() here in case of failure.
+ * After all the checks already done above a filure here should be pretty
+ * unusual though, so maybe it's better to let the user notice that
+ * something went wrong, and not try to fix it up. - kw
+ */
+ return fp;
+}
+
+/*
+ * Special case of LYOpenTemp, used for manipulating bookmark file, i.e., with
+ * renaming.
+ */
+FILE *LYOpenScratch(char *result,
+ const char *prefix)
+{
+ FILE *fp;
+ LY_TEMP *p;
+
+ if (!fmt_tempname(result, prefix, HTML_SUFFIX))
+ return 0;
+
+ if ((fp = LYNewTxtFile(result)) != 0) {
+ if ((p = typecalloc(LY_TEMP)) != 0) {
+ p->next = ly_temp;
+ StrAllocCopy((p->name), result);
+ p->file = fp;
+ ly_temp = p;
+ } else {
+ outofmem(__FILE__, "LYOpenScratch");
+ }
+ }
+ CTRACE((tfp, "LYOpenScratch(%s)\n", result));
+ return fp;
+}
+
+static void LY_close_temp(LY_TEMP * p)
+{
+ if (p->file != 0) {
+ if (p->outs) {
+ LYCloseOutput(p->file);
+ } else {
+ LYCloseInput(p->file);
+ }
+ p->file = 0;
+ }
+}
+
+/*
+ * Close a temp-file, given its name
+ */
+void LYCloseTemp(char *name)
+{
+ LY_TEMP *p;
+
+ CTRACE((tfp, "LYCloseTemp(%s)\n", name));
+ if ((p = FindTempfileByName(name)) != 0) {
+ CTRACE((tfp, "...LYCloseTemp(%s)%s\n", name,
+ (p->file != 0) ? ", closed" : ""));
+ LY_close_temp(p);
+ }
+}
+
+/*
+ * Close a temp-file, given its file-pointer
+ */
+void LYCloseTempFP(FILE *fp)
+{
+ LY_TEMP *p;
+
+ CTRACE((tfp, "LYCloseTempFP\n"));
+ if ((p = FindTempfileByFP(fp)) != 0) {
+ LY_close_temp(p);
+ CTRACE((tfp, "...LYCloseTempFP(%s)\n", p->name));
+ }
+}
+
+/*
+ * Close a temp-file, removing it.
+ */
+int LYRemoveTemp(char *name)
+{
+ LY_TEMP *p, *q;
+ int code = -1;
+
+ if (non_empty(name)) {
+ CTRACE((tfp, "LYRemoveTemp(%s)\n", name));
+ for (p = ly_temp, q = 0; p != 0; q = p, p = p->next) {
+ if (!strcmp(name, p->name)) {
+ if (q != 0) {
+ q->next = p->next;
+ } else {
+ ly_temp = p->next;
+ }
+ LY_close_temp(p);
+ code = HTSYS_remove(name);
+ CTRACE((tfp, "...LYRemoveTemp done(%d)%s\n", code,
+ (p->file != 0) ? ", closed" : ""));
+ CTRACE_FLUSH(tfp);
+ FREE(p->name);
+ FREE(p);
+ break;
+ }
+ }
+ }
+ return code;
+}
+
+/*
+ * Remove all of the temp-files. Note that this assumes that they are closed,
+ * since some systems will not allow us to remove a file which is open.
+ */
+void LYCleanupTemp(void)
+{
+ while (ly_temp != 0) {
+ (void) LYRemoveTemp(ly_temp->name);
+ }
+#if defined(MULTI_USER_UNIX)
+ if (lynx_temp_subspace > 0) {
+ char result[LY_MAXPATH];
+
+ LYStrNCpy(result, lynx_temp_space, sizeof(result) - 1);
+ LYTrimPathSep(result);
+ CTRACE((tfp, "LYCleanupTemp removing %s\n", result));
+ rmdir(result);
+ lynx_temp_subspace = -1;
+ }
+#endif
+}
+
+/*
+ * We renamed a temporary file. Keep track so we can remove it on exit.
+ */
+void LYRenamedTemp(char *oldname,
+ char *newname)
+{
+ LY_TEMP *p;
+
+ CTRACE((tfp, "LYRenamedTemp(old=%s, new=%s)\n", oldname, newname));
+ if ((p = FindTempfileByName(oldname)) != 0) {
+ StrAllocCopy((p->name), newname);
+ }
+}
+
+#ifndef DISABLE_BIBP
+/*
+ * Check that bibhost defines the BibP icon.
+ */
+void LYCheckBibHost(void)
+{
+ DocAddress bibhostIcon;
+ BOOLEAN saveFlag;
+
+ bibhostIcon.address = NULL;
+ StrAllocCopy(bibhostIcon.address, BibP_bibhost);
+ StrAllocCat(bibhostIcon.address, "bibp1.0/bibpicon.jpg");
+ bibhostIcon.post_data = NULL;
+ bibhostIcon.post_content_type = NULL;
+ bibhostIcon.bookmark = FALSE;
+ bibhostIcon.isHEAD = FALSE;
+ bibhostIcon.safe = FALSE;
+ saveFlag = traversal;
+ traversal = TRUE; /* Hack to force error response. */
+ BibP_bibhost_available = (BOOLEAN) (HTLoadAbsolute(&bibhostIcon) == YES);
+ traversal = saveFlag;
+ BibP_bibhost_checked = TRUE;
+}
+#endif /* !DISABLE_BIBP */
+
+/*
+ * Management of User Interface Pages. - kw
+ *
+ * These are mostly temp files. Pages which can be recognized by their special
+ * URL (after having been loaded) need not be tracked here.
+ *
+ * First some private stuff:
+ */
+typedef struct uipage_entry {
+ UIP_t type;
+ unsigned flags;
+ char *url;
+ HTList *alturls;
+ char *file;
+} uip_entry;
+
+#define UIP_F_MULTI 0x0001 /* flag: track multiple instances */
+#define UIP_F_LIMIT 0x0002 /* flag: limit size of alturls list */
+#define UIP_F_LMULTI (UIP_F_MULTI | UIP_F_LIMIT)
+/* *INDENT-OFF* */
+static uip_entry ly_uip[] =
+{
+ { UIP_HISTORY , UIP_F_LMULTI, NULL, NULL, NULL }
+ , { UIP_DOWNLOAD_OPTIONS , 0 , NULL, NULL, NULL }
+ , { UIP_PRINT_OPTIONS , 0 , NULL, NULL, NULL }
+ , { UIP_SHOWINFO , UIP_F_LMULTI, NULL, NULL, NULL }
+ , { UIP_LIST_PAGE , UIP_F_LMULTI, NULL, NULL, NULL }
+ , { UIP_VLINKS , UIP_F_LMULTI, NULL, NULL, NULL }
+#if !defined(NO_OPTION_FORMS)
+ , { UIP_OPTIONS_MENU , UIP_F_LMULTI, NULL, NULL, NULL }
+#endif
+#ifdef DIRED_SUPPORT
+ , { UIP_DIRED_MENU , 0 , NULL, NULL, NULL }
+ , { UIP_PERMIT_OPTIONS , 0 , NULL, NULL, NULL }
+ , { UIP_UPLOAD_OPTIONS , UIP_F_LMULTI, NULL, NULL, NULL }
+#endif
+#ifdef USE_ADDRLIST_PAGE
+ , { UIP_ADDRLIST_PAGE , UIP_F_LMULTI, NULL, NULL, NULL }
+#endif
+ , { UIP_LYNXCFG , UIP_F_LMULTI, NULL, NULL, NULL }
+#if !defined(NO_CONFIG_INFO)
+ , { UIP_CONFIG_DEF , UIP_F_LMULTI, NULL, NULL, NULL }
+#endif
+/* The following are not generated tempfiles: */
+ , { UIP_TRACELOG , 0 , NULL, NULL, NULL }
+#if defined(DIRED_SUPPORT) && defined(OK_INSTALL)
+ , { UIP_INSTALL , 0 , NULL, NULL, NULL }
+#endif
+
+};
+/* *INDENT-ON* */
+
+/* Public entry points for User Interface Page management: */
+
+BOOL LYIsUIPage3(const char *url,
+ UIP_t type,
+ int flagparam)
+{
+ unsigned int i;
+ size_t l;
+ BOOL result = NO;
+
+ if (url) {
+ for (i = 0; i < TABLESIZE(ly_uip); i++) {
+ if (ly_uip[i].type == type) {
+ if (!ly_uip[i].url) {
+ break;
+ } else if ((flagparam & UIP_P_FRAG) ?
+ (!StrNCmp(ly_uip[i].url, url, (l = strlen(ly_uip[i].url)))
+ && (url[l] == '\0' || url[l] == '#')) :
+ !strcmp(ly_uip[i].url, url)) {
+ result = YES;
+ } else if (ly_uip[i].flags & UIP_F_MULTI) {
+ char *p;
+ HTList *l0 = ly_uip[i].alturls;
+
+ while ((p = (char *) HTList_nextObject(l0)) != NULL) {
+ if ((flagparam & UIP_P_FRAG)
+ ? (!StrNCmp(p, url, (l = strlen(p))) &&
+ (url[l] == '\0' || url[l] == '#'))
+ : !strcmp(p, url)) {
+ result = YES;
+ break;
+ }
+ }
+ }
+ break;
+ }
+ }
+ }
+ return result;
+}
+
+void LYRegisterUIPage(const char *url,
+ UIP_t type)
+{
+ unsigned int i;
+
+ for (i = 0; i < TABLESIZE(ly_uip); i++) {
+ if (ly_uip[i].type == type) {
+ if (ly_uip[i].url && url &&
+ !strcmp(ly_uip[i].url, url)) {
+
+ } else if (!ly_uip[i].url || !url ||
+ !(ly_uip[i].flags & UIP_F_MULTI)) {
+ StrAllocCopy(ly_uip[i].url, url);
+
+ } else {
+ char *p;
+ int n = 0;
+ HTList *l0 = ly_uip[i].alturls;
+
+ while ((p = (char *) HTList_nextObject(l0)) != NULL) {
+ if (!strcmp(p, url))
+ return;
+ if (!strcmp(p, ly_uip[i].url)) {
+ StrAllocCopy(ly_uip[i].url, url);
+ return;
+ }
+ n++;
+ }
+ if (!ly_uip[i].alturls)
+ ly_uip[i].alturls = HTList_new();
+
+ if (n >= HTCacheSize && (ly_uip[i].flags & UIP_F_LIMIT))
+ HTList_removeFirstObject(ly_uip[i].alturls);
+ HTList_addObject(ly_uip[i].alturls, ly_uip[i].url);
+ ly_uip[i].url = NULL;
+ StrAllocCopy(ly_uip[i].url, url);
+ }
+
+ return;
+ }
+ }
+}
+
+void LYUIPages_free(void)
+{
+ unsigned int i;
+
+ for (i = 0; i < TABLESIZE(ly_uip); i++) {
+ FREE(ly_uip[i].url);
+ FREE(ly_uip[i].file);
+ LYFreeStringList(ly_uip[i].alturls);
+ ly_uip[i].alturls = NULL;
+ }
+}
+
+/*
+ * Convert local pathname to www name
+ * (do not bother about file://localhost prefix at this point).
+ */
+const char *wwwName(const char *pathname)
+{
+ const char *cp = NULL;
+
+#if defined(USE_DOS_DRIVES)
+ cp = HTDOS_wwwName(pathname);
+#else
+#ifdef VMS
+ cp = HTVMS_wwwName(pathname);
+#else
+ cp = pathname;
+#endif /* VMS */
+#endif
+
+ return cp;
+}
+
+/*
+ * Given a user-specified filename, e.g., for download or print, validate and
+ * expand it. Expand home-directory expressions in the given string. Only
+ * allow pipes if the user can spawn shell commands.
+ */
+BOOLEAN LYValidateFilename(bstring **result,
+ bstring **given)
+{
+ BOOLEAN code = TRUE;
+ char *cp = NULL;
+
+ /*
+ * Cancel if the user entered "/dev/null" on Unix, or an "nl:" path on VMS.
+ * - FM
+ */
+ if (LYIsNullDevice((*given)->str)) {
+ /* just ignore it */
+ code = FALSE;
+#ifdef HAVE_POPEN
+ } else if (LYIsPipeCommand((*given)->str)) {
+ if (no_shell) {
+ HTUserMsg(SPAWNING_DISABLED);
+ code = FALSE;
+ } else {
+ BStrCopy(*result, (*given));
+ }
+#endif
+ } else {
+ if (FindLeadingTilde((*given)->str, TRUE) != 0) {
+ char *cp1 = NULL;
+
+ StrAllocCopy(cp1, (*given)->str);
+ LYTildeExpand(&cp1, TRUE);
+ BStrCopy0(*result, cp1);
+ BStrCopy0(*given, cp1);
+ FREE(cp1);
+ }
+#ifdef VMS
+ if (StrChr((*given)->str, '/') != NULL) {
+ BStrCopy0(*result, HTVMS_name("", (*given)->str));
+ BStrCopy(*given, *result);
+ }
+ if ((*given)->str[0] != '/'
+ && StrChr((*given)->str, ':') == NULL) {
+ BStrCopy0(*result, "sys$disk:");
+ if (StrChr((*given)->str, ']') == NULL)
+ BStrCat0(*result, "[]");
+ BStrCat(*result, (*given));
+ } else {
+ BStrCopy(*result, (*given));
+ }
+#else
+
+#ifndef __EMX__
+ if (!LYisAbsPath((*given)->str)) {
+#if defined(__DJGPP__) || defined(_WINDOWS)
+ if (StrChr((*result)->str, ':') != NULL)
+ cp = NULL;
+ else
+#endif /* __DJGPP__ || _WINDOWS */
+ {
+#ifdef SUPPORT_CHDIR
+ static char buf[LY_MAXPATH];
+
+ cp = Current_Dir(buf);
+#else
+ cp = original_dir;
+#endif
+ }
+ } else
+#endif /* __EMX__ */
+ cp = NULL;
+
+ if (cp) {
+ LYTrimPathSep(cp);
+ BStrCopy0(*result, cp);
+ BStrCat0(*result, "/");
+ } else {
+ BStrCopy0(*result, "");
+ }
+ if (code) {
+ cp = HTSYS_name((*given)->str);
+ BStrCat0(*result, cp);
+ }
+#endif /* VMS */
+ }
+ return code;
+}
+
+/*
+ * Given a valid filename, check if it exists. If so, we'll have to worry
+ * about overwriting it.
+ *
+ * Returns:
+ * 'Y' (yes/success)
+ * 'N' (no/retry)
+ * 3 (cancel)
+ */
+int LYValidateOutput(char *filename)
+{
+ int c;
+
+ CTRACE((tfp, "LYValidateOutput '%s'\n", filename));
+
+ /*
+ * Assume we can write to a pipe
+ */
+#ifdef HAVE_POPEN
+ if (LYIsPipeCommand(filename))
+ return 'Y';
+#endif
+
+ if (no_dotfiles || !show_dotfiles) {
+ if (*LYPathLeaf(filename) == '.') {
+ HTAlert(FILENAME_CANNOT_BE_DOT);
+ return 'N';
+ }
+ }
+
+ /*
+ * See if it already exists.
+ */
+ if (LYCanReadFile(filename)) {
+#ifdef VMS
+ c = HTConfirm(FILE_EXISTS_HPROMPT);
+#else
+ c = HTConfirm(FILE_EXISTS_OPROMPT);
+#endif /* VMS */
+ if (HTLastConfirmCancelled()) {
+ HTInfoMsg(SAVE_REQUEST_CANCELLED);
+ return 3;
+ } else if (c == NO) {
+ return 'N';
+ }
+ } else if (!LYCanWriteFile(filename)) {
+ return 'N';
+ }
+ return 'Y';
+}
+
+/*
+ * Convert a local filename to a URL
+ */
+void LYLocalFileToURL(char **target,
+ const char *source)
+{
+ const char *leaf;
+
+ StrAllocCopy(*target, "file://localhost");
+
+ leaf = wwwName(source);
+
+ if (!LYisAbsPath(source)) {
+ char temp[LY_MAXPATH];
+
+ Current_Dir(temp);
+ if (!LYIsHtmlSep(*temp))
+ LYAddHtmlSep(target);
+ StrAllocCat(*target, temp);
+ }
+ if (leaf && !LYIsHtmlSep(*leaf))
+ LYAddHtmlSep(target);
+ StrAllocCat(*target, leaf);
+}
+
+#define PUT_STRING(buf) (*(target)->isa->put_string)(target, buf)
+
+/*
+ * Like WriteInternalTitle, used for writing title on pages constructed via
+ * streams.
+ */
+void WriteStreamTitle(HTStream *target, const char *Title)
+{
+ char *buf = 0;
+
+ PUT_STRING(LYNX_DOCTYPE);
+ PUT_STRING("<html>\n<head>\n");
+ LYAddMETAcharsetToStream(target, -1);
+ HTSprintf0(&buf, "<title>%s</title>\n</head>\n<body>\n", Title);
+ PUT_STRING(buf);
+ FREE(buf);
+}
+
+/*
+ * Open a temporary file for internal-pages, optionally reusing an existing
+ * filename.
+ */
+FILE *InternalPageFP(char *filename,
+ int reuse_flag)
+{
+ FILE *fp;
+
+ if (LYReuseTempfiles && reuse_flag) {
+ fp = LYOpenTempRewrite(filename, HTML_SUFFIX, BIN_W);
+ } else {
+ (void) LYRemoveTemp(filename);
+ fp = LYOpenTemp(filename, HTML_SUFFIX, BIN_W);
+ }
+ if (fp == NULL) {
+ HTAlert(CANNOT_OPEN_TEMP);
+ }
+ return fp;
+}
+
+/*
+ * This part is shared by all internal pages.
+ */
+void WriteInternalTitle(FILE *fp0, const char *Title)
+{
+ fprintf(fp0, LYNX_DOCTYPE);
+
+ fprintf(fp0, "<html>\n<head>\n");
+ LYAddMETAcharsetToFD(fp0, -1);
+ if (LYIsListpageTitle(Title)) {
+ if (StrChr(HTLoadedDocumentURL(), '"') == NULL) {
+ char *Address = NULL;
+
+ /*
+ * Insert a BASE tag so there is some way to relate the List Page
+ * file to its underlying document after we are done. It won't be
+ * actually used for resolving relative URLs. - kw
+ */
+ StrAllocCopy(Address, HTLoadedDocumentURL());
+ LYEntify(&Address, FALSE);
+ fprintf(fp0, "<base href=\"%s\">\n", Address);
+ FREE(Address);
+ }
+ }
+ fprintf(fp0, "<title>%s</title>\n</head>\n<body>\n", Title);
+}
+
+/*
+ * This is used to start most internal pages, except for special cases where
+ * the embedded HREF's in the title differ.
+ */
+void BeginInternalPage(FILE *fp0, const char *Title,
+ const char *HelpURL)
+{
+ WriteInternalTitle(fp0, Title);
+
+ if ((user_mode == NOVICE_MODE)
+ && LYwouldPush(Title, NULL)
+ && (HelpURL != 0)) {
+ fprintf(fp0, "<h1>%s (%s%s%s), <a href=\"%s%s\">help</a></h1>\n",
+ Title, LYNX_NAME, VERSION_SEGMENT, LYNX_VERSION,
+ helpfilepath, HelpURL);
+ } else {
+ fprintf(fp0, "<h1>%s (%s%s%s)</h1>\n",
+ Title, LYNX_NAME, VERSION_SEGMENT, LYNX_VERSION);
+ }
+}
+
+void EndInternalPage(FILE *fp0)
+{
+ fprintf(fp0, "</body>\n</html>");
+}
+
+char *trimPoundSelector(char *address)
+{
+ char *pound = findPoundSelector(address);
+
+ if (pound != 0)
+ *pound = '\0';
+ return pound;
+}
+
+/*
+ * Trim a trailing path-separator to avoid confusing other programs when we concatenate
+ * to it. This only applies to local filesystems.
+ */
+void LYTrimPathSep(char *path)
+{
+ size_t len;
+
+ if (path != 0
+ && (len = strlen(path)) != 0
+ && LYIsPathSep(path[len - 1]))
+ path[len - 1] = 0;
+}
+
+/*
+ * Add a trailing path-separator to avoid confusing other programs when we concatenate
+ * to it. This only applies to local filesystems.
+ */
+void LYAddPathSep(char **path)
+{
+ size_t len;
+ char *temp;
+
+ if ((path != 0)
+ && ((temp = *path) != 0)
+ && (len = strlen(temp)) != 0
+ && !LYIsPathSep(temp[len - 1])) {
+ StrAllocCat(*path, FILE_SEPARATOR);
+ }
+}
+
+/*
+ * Add a trailing path-separator to avoid confusing other programs when we concatenate
+ * to it. This only applies to local filesystems.
+ */
+void LYAddPathSep0(char *path)
+{
+ size_t len;
+
+ if ((path != 0)
+ && (len = strlen(path)) != 0
+ && (len < LY_MAXPATH - 2)
+ && !LYIsPathSep(path[len - 1])) {
+ strcat(path, FILE_SEPARATOR);
+ }
+}
+
+/*
+ * Check if a given string contains a path separator
+ */
+char *LYLastPathSep(const char *path)
+{
+ char *result;
+
+#if defined(USE_DOS_DRIVES)
+ if ((result = strrchr(path, '\\')) == 0)
+ result = strrchr(path, '/');
+#else
+ result = strrchr(path, '/');
+#endif
+ return result;
+}
+
+/*
+ * Trim a trailing path-separator to avoid confusing other programs when we concatenate
+ * to it. This only applies to HTML paths.
+ */
+void LYTrimHtmlSep(char *path)
+{
+ size_t len;
+
+ if (path != 0
+ && (len = strlen(path)) != 0
+ && LYIsHtmlSep(path[len - 1]))
+ path[len - 1] = 0;
+}
+
+/*
+ * Add a trailing path-separator to avoid confusing other programs when we concatenate
+ * to it. This only applies to HTML paths.
+ */
+void LYAddHtmlSep(char **path)
+{
+ size_t len;
+ char *temp;
+
+ if ((path != 0)
+ && ((temp = *path) != 0)
+ && (len = strlen(temp)) != 0
+ && !LYIsHtmlSep(temp[len - 1])) {
+ StrAllocCat(*path, "/");
+ }
+}
+
+/*
+ * Add a trailing path-separator to avoid confusing other programs when we concatenate
+ * to it. This only applies to HTML paths.
+ */
+void LYAddHtmlSep0(char *path)
+{
+ size_t len;
+
+ if ((path != 0)
+ && (len = strlen(path)) != 0
+ && (len < LY_MAXPATH - 2)
+ && !LYIsHtmlSep(path[len - 1])) {
+ strcat(path, "/");
+ }
+}
+
+/*
+ * Rename a file
+ */
+int LYRenameFile(char *src,
+ char *dst)
+{
+#ifdef _WINDOWS
+ /*
+ * If dest_file exists prior to calling rename(), rename() will fail on Windows platforms.
+ * https://www.securecoding.cert.org/confluence/display/c/FIO10-C.+Take+care+when+using+the+rename%28%29+function
+ */
+ struct stat st;
+
+ if (stat(dst, &st) == 0) {
+ unlink(dst);
+ }
+#endif
+ return rename(src, dst);
+}
+
+/*
+ * Copy a file
+ */
+int LYCopyFile(char *src,
+ char *dst)
+{
+ int code;
+ const char *program;
+
+ if ((program = HTGetProgramPath(ppCOPY)) != NULL) {
+ char *the_command = 0;
+
+ HTAddParam(&the_command, COPY_COMMAND, 1, program);
+ HTAddParam(&the_command, COPY_COMMAND, 2, src);
+ HTAddParam(&the_command, COPY_COMMAND, 3, dst);
+ HTEndParam(&the_command, COPY_COMMAND, 3);
+
+ CTRACE((tfp, "command: %s\n", the_command));
+ stop_curses();
+ code = LYSystem(the_command);
+ start_curses();
+
+ FREE(the_command);
+ } else {
+ FILE *fin, *fout;
+ unsigned char buff[BUFSIZ];
+ size_t len;
+
+ code = EOF;
+ if ((fin = fopen(src, BIN_R)) != 0) {
+ if ((fout = fopen(dst, BIN_W)) != 0) {
+ code = 0;
+ while ((len = fread(buff, (size_t) 1, sizeof(buff), fin)) != 0) {
+ if (fwrite(buff, (size_t) 1, len, fout) < len
+ || ferror(fout)) {
+ code = EOF;
+ break;
+ }
+ }
+ LYCloseOutput(fout);
+ }
+ LYCloseInput(fin);
+ }
+ CTRACE((tfp, "builtin copy ->%d\n\tsource=%s\n\ttarget=%s\n",
+ code, src, dst));
+ }
+
+ if (code) {
+ HTAlert(CANNOT_WRITE_TO_FILE);
+ }
+ return code;
+}
+
+#ifdef __DJGPP__
+static char *escape_backslashes(char *source)
+{
+ char *result = 0;
+ int count = 0;
+ int n;
+
+ for (n = 0; source[n] != '\0'; ++n) {
+ if (source[n] == '\\')
+ ++count;
+ }
+ if (count != 0) {
+ result = malloc(count + n + 1);
+ if (result != 0) {
+ int ch;
+ char *target = result;
+
+ while ((ch = *source++) != '\0') {
+ if (ch == '\\')
+ *target++ = ch;
+ *target++ = ch;
+ }
+ *target = '\0';
+ }
+ }
+ return result;
+}
+#endif /* __DJGPP__ */
+/*
+ * Invoke a shell command, return nonzero on error.
+ */
+int LYSystem(char *command)
+{
+ int code;
+ int do_free = 0;
+
+#if defined(HAVE_SIGACTION) && defined(SIGTSTP) && !defined(USE_SLANG)
+ struct sigaction saved_sigtstp_act;
+ BOOLEAN sigtstp_saved = FALSE;
+#endif
+ int saved_errno = 0;
+
+#ifdef __EMX__
+ int scrsize[4];
+#endif
+
+ fflush(stdout);
+ fflush(stderr);
+ CTRACE((tfp, "LYSystem(%s)\n", command));
+ CTRACE_FLUSH(tfp);
+
+#ifdef __DJGPP__
+ __djgpp_set_ctrl_c(0);
+ _go32_want_ctrl_break(1);
+#endif /* __DJGPP__ */
+
+#ifdef VMS
+ code = DCLsystem(command);
+#else
+# ifdef __EMX__ /* FIXME: Should be LY_CONVERT_SLASH? */
+ /* Configure writes commands which contain direct slashes.
+ Native command-(non)-shell will not tolerate this. */
+ {
+ char *space = command, *slash = command;
+
+ _scrsize(scrsize);
+ while (*space && *space != ' ' && *space != '\t')
+ space++;
+ while (slash < space && *slash != '/')
+ slash++;
+ if (slash != space) {
+ char *old = command;
+
+ command = NULL;
+ StrAllocCopy(command, old);
+ do_free = 1;
+ slash = (slash - old) + command - 1;
+ space = (space - old) + command;
+ while (++slash < space)
+ if (*slash == '/')
+ *slash = '\\';
+ }
+ }
+# endif
+
+ /*
+ * This chunk of code does not work, for two reasons:
+ * a) the Cygwin system() function edits out the backslashes
+ * b) it does not account for more than one parameter, e.g., +number
+ */
+#if defined(__CYGWIN__) && defined(DOSPATH) /* 1999/02/26 (Fri) */
+ {
+ char cmd[LY_MAXPATH];
+ char win32_name[LY_MAXPATH];
+ char new_cmd[LY_MAXPATH];
+ char new_command[LY_MAXPATH * 2 + 10];
+ char *p, *q;
+
+ p = command;
+ q = cmd;
+ while (*p) {
+ if (*p == ' ')
+ break;
+ else
+ *q = *p;
+ p++;
+ q++;
+ }
+ *q = '\0';
+
+ if (cmd[0] == '/')
+ cygwin_conv_to_full_posix_path(cmd, new_cmd);
+ else
+ strcpy(new_cmd, cmd);
+
+ while (*p == ' ')
+ p++;
+
+ if (StrChr(p, '\\') == NULL) {
+ /* for Windows Application */
+ cygwin_conv_to_full_win32_path(p, win32_name);
+ sprintf(new_command, "%.*s \"%.*s\"",
+ LY_MAXPATH, new_cmd, LY_MAXPATH, win32_name);
+ } else {
+ /* for DOS like editor */
+ q = win32_name;
+ while (*p) {
+ if (*p == '\\') {
+ if (*(p + 1) == '\\')
+ p++;
+ }
+ *q = *p;
+ q++, p++;
+ }
+ *q = '\0';
+ sprintf(new_command, "%.*s %.*s", LY_MAXPATH, new_cmd, LY_MAXPATH, win32_name);
+ }
+ command = new_command;
+ }
+#endif
+
+#ifdef __DJGPP__
+ if (dj_is_bash) {
+ char *new_command = escape_backslashes(command);
+
+ if (new_command != 0) {
+ if (do_free)
+ free(command);
+ command = new_command;
+ }
+ }
+#endif /* __DJGPP__ */
+
+#ifdef _WIN_CC
+ code = exec_command(command, TRUE); /* Wait exec */
+#else /* !_WIN_CC */
+#ifdef SIGPIPE
+ if (restore_sigpipe_for_children)
+ signal(SIGPIPE, SIG_DFL); /* Some commands expect the default */
+#endif
+#if defined(HAVE_SIGACTION) && defined(SIGTSTP) && !defined(USE_SLANG)
+ if (!dump_output_immediately && !LYCursesON && !no_suspend)
+ sigtstp_saved = LYToggleSigDfl(SIGTSTP, &saved_sigtstp_act, 1);
+#endif
+ code = system(command);
+ saved_errno = errno;
+#if defined(HAVE_SIGACTION) && defined(SIGTSTP) && !defined(USE_SLANG)
+ if (sigtstp_saved)
+ LYToggleSigDfl(SIGTSTP, &saved_sigtstp_act, 0);
+#endif
+#ifdef SIGPIPE
+ if (restore_sigpipe_for_children)
+ signal(SIGPIPE, SIG_IGN); /* Ignore it again - kw */
+#endif
+#endif
+#endif
+
+#ifdef __DJGPP__
+ __djgpp_set_ctrl_c(1);
+ _go32_want_ctrl_break(0);
+#endif /* __DJGPP__ */
+
+ fflush(stdout);
+ fflush(stderr);
+
+ if (do_free)
+ FREE(command);
+#if !defined(UCX) || !defined(VAXC) /* errno not modifiable ?? */
+ set_errno(saved_errno); /* may have been clobbered */
+#endif
+#ifdef __EMX__ /* Check whether the screen size changed */
+ size_change(0);
+#endif
+ return code;
+}
+
+/*
+ * Return a string which can be used in LYSystem() for spawning a subshell
+ */
+#if defined(__CYGWIN__) /* 1999/02/26 (Fri) */
+int Cygwin_Shell(void)
+{
+ char *shell;
+ int code;
+ STARTUPINFO startUpInfo;
+ PROCESS_INFORMATION procInfo;
+ SECURITY_ATTRIBUTES sa;
+
+ /* Set up security attributes to allow inheritance of the file handle */
+
+ sa.nLength = sizeof(SECURITY_ATTRIBUTES);
+ sa.lpSecurityDescriptor = 0;
+ sa.bInheritHandle = TRUE;
+
+ /* Init a startup structure */
+ GetStartupInfo(&startUpInfo);
+
+ shell = LYGetEnv("COMSPEC");
+
+ /* Create the child process, specifying
+ inherited handles. Pass the value of the
+ handle as a command line parameter */
+ code = 0;
+ if (shell) {
+ code = CreateProcess(0, shell, 0, 0,
+ TRUE, 0,
+ 0, 0, &startUpInfo, &procInfo);
+
+ if (!code) {
+ printf("shell = [%s], code = %ld\n", shell, (long) GetLastError());
+ }
+
+ /* wait for the child to return (this is not a requirement
+ since the child is its own independent process) */
+ WaitForSingleObject(procInfo.hProcess, INFINITE);
+ }
+
+ return code;
+}
+#endif
+
+#ifdef WIN_EX
+/*
+ * Quote the path to make it safe for shell command processing.
+ * We always quote it not only includes spaces in it.
+ * At least we should quote paths which include "&".
+ */
+char *quote_pathname(char *pathname)
+{
+ char *result = NULL;
+
+ HTSprintf0(&result, "\"%s\"", pathname);
+ return result;
+}
+#endif
+
+const char *LYSysShell(void)
+{
+ const char *shell = 0;
+
+#ifdef DOSPATH
+#ifdef WIN_EX
+ shell = LYGetEnv("SHELL");
+ if (shell) {
+ if (access(shell, 0) != 0)
+ shell = LYGetEnv("COMSPEC");
+ } else {
+ shell = LYGetEnv("COMSPEC");
+ }
+ if (shell == NULL) {
+ if (system_is_NT)
+ shell = "cmd.exe";
+ else
+ shell = "command.com";
+ }
+#else
+ shell = LYGetEnv("SHELL");
+ if (shell == NULL) {
+ shell = LYGetEnv("COMSPEC");
+ }
+ if (shell == NULL) {
+ shell = "command.com";
+ }
+#endif /* WIN_EX */
+#else
+#ifdef __EMX__
+ if (LYGetEnv("SHELL") != NULL) {
+ shell = LYGetEnv("SHELL");
+ } else {
+ shell = (LYGetEnv("COMSPEC") == NULL) ? "cmd.exe" : LYGetEnv("COMSPEC");
+ }
+#else
+#ifdef VMS
+ shell = "";
+#else
+ shell = "exec $SHELL";
+#endif /* __EMX__ */
+#endif /* VMS */
+#endif /* DOSPATH */
+ return shell;
+}
+
+#ifdef VMS
+#define DISPLAY "DECW$DISPLAY"
+#else
+#define DISPLAY "DISPLAY"
+#endif /* VMS */
+
+/*
+ * Return the X-Window $DISPLAY string if it is nonnull/nonempty
+ */
+char *LYgetXDisplay(void)
+{
+ return LYGetEnv(DISPLAY);
+}
+
+/*
+ * Set the value of the X-Window $DISPLAY variable (yes it leaks memory, but
+ * that is putenv's fault).
+ */
+void LYsetXDisplay(char *new_display)
+{
+ if (new_display != 0) {
+#ifdef VMS
+ LYUpperCase(new_display);
+ Define_VMSLogical(DISPLAY, new_display);
+#else
+ static char *display_putenv_command;
+
+ display_putenv_command = NULL; /* yes, this is a leak - cannot fix */
+ HTSprintf0(&display_putenv_command, "DISPLAY=%s", new_display);
+ putenv(display_putenv_command);
+#endif /* VMS */
+ if ((new_display = LYgetXDisplay()) != 0) {
+ StrAllocCopy(x_display, new_display);
+ }
+ }
+}
+
+#ifdef CAN_CUT_AND_PASTE
+#ifdef __EMX__
+
+static int proc_type = -1;
+static PPIB pib;
+static HAB hab;
+static HMQ hmq;
+
+static void morph_PM(void)
+{
+ PTIB tib;
+ int first = 0;
+
+ if (proc_type == -1) {
+ DosGetInfoBlocks(&tib, &pib);
+ proc_type = pib->pib_ultype;
+ first = 1;
+ }
+ if (pib->pib_ultype != 3) /* 2 is VIO */
+ pib->pib_ultype = 3; /* 3 is PM */
+ if (first)
+ hab = WinInitialize(0);
+ /* 64 messages if before OS/2 3.0, ignored otherwise */
+ hmq = WinCreateMsgQueue(hab, 64);
+ WinCancelShutdown(hmq, 1); /* Do not inform us on shutdown */
+}
+
+static void unmorph_PM(void)
+{
+ WinDestroyMsgQueue(hmq);
+ pib->pib_ultype = proc_type;
+}
+
+int size_clip(void)
+{
+ return 8192;
+}
+
+/* Code partially stolen from FED editor. */
+
+int put_clip(const char *s)
+{
+ int sz = strlen(s) + 1;
+ int ret = EOF, nl = 0;
+ char *pByte = 0, *s1 = s, c, *t;
+
+ while ((c = *s1++)) {
+ if (c == '\r' && *s1 == '\n')
+ s1++;
+ else if (c == '\n')
+ nl++;
+ }
+ if (DosAllocSharedMem((PPVOID) & pByte, 0, sz + nl,
+ PAG_WRITE | PAG_COMMIT | OBJ_GIVEABLE | OBJ_GETTABLE))
+ return ret;
+
+ if (!nl)
+ memcpy(pByte, s, sz);
+ else {
+ t = pByte;
+ while ((c = *t++ = *s++))
+ if (c == '\n' && (t == pByte + 1 || t[-2] != '\r'))
+ t[-1] = '\r', *t++ = '\n';
+ }
+
+ morph_PM();
+ if (!hab)
+ goto fail;
+
+ WinOpenClipbrd(hab);
+ WinEmptyClipbrd(hab);
+ if (WinSetClipbrdData(hab, (ULONG) pByte, CF_TEXT, CFI_POINTER))
+ ret = 0;
+ WinCloseClipbrd(hab);
+ unmorph_PM();
+ if (ret == 0)
+ return 0;
+ fail:
+ DosFreeMem((PPVOID) & pByte);
+ return EOF;
+}
+
+static int clip_open;
+
+/* get_clip_grab() returns a pointer to the string in the system area.
+ get_clip_release() should be called ASAP after this. */
+
+char *get_clip_grab(void)
+{
+ char *ClipData;
+ ULONG ulFormat;
+ int sz;
+
+ morph_PM();
+ if (!hab)
+ return 0;
+ if (clip_open)
+ get_clip_release();
+
+ WinQueryClipbrdFmtInfo(hab, CF_TEXT, &ulFormat);
+ if (ulFormat != CFI_POINTER) {
+ unmorph_PM();
+ return 0;
+ }
+ WinOpenClipbrd(hab);
+ clip_open = 1;
+ ClipData = (char *) WinQueryClipbrdData(hab, CF_TEXT);
+ sz = strlen(ClipData);
+ if (!ClipData || !sz) {
+ get_clip_release();
+ return 0;
+ }
+ return ClipData;
+}
+
+void get_clip_release(void)
+{
+ if (!clip_open)
+ return;
+ WinCloseClipbrd(hab);
+ clip_open = 0;
+ unmorph_PM();
+}
+
+#else /* !( defined __EMX__ ) */
+
+# if !defined(WIN_EX) && defined(HAVE_POPEN)
+
+static FILE *paste_handle = 0;
+static char *paste_buf = NULL;
+
+void get_clip_release(void)
+{
+ if (paste_handle != 0)
+ pclose(paste_handle);
+ if (paste_buf)
+ FREE(paste_buf);
+}
+
+static int clip_grab(void)
+{
+ char *cmd = LYGetEnv("RL_PASTE_CMD");
+
+ if (paste_handle)
+ pclose(paste_handle);
+ if (!cmd)
+ return 0;
+
+ paste_handle = popen(cmd, TXT_R);
+ if (!paste_handle)
+ return 0;
+ return 1;
+}
+
+#define PASTE_BUFFER 1008
+#define CF_TEXT 0 /* Not used */
+
+char *get_clip_grab(void)
+{
+ int len;
+ unsigned size = PASTE_BUFFER;
+ int off = 0;
+
+ if (!clip_grab())
+ return NULL;
+ if (!paste_handle)
+ return NULL;
+ if (paste_buf)
+ FREE(paste_buf);
+ paste_buf = typeMallocn(char, PASTE_BUFFER);
+
+ while (1) {
+ len = (int) fread(paste_buf + off,
+ (size_t) 1,
+ (size_t) PASTE_BUFFER - 1,
+ paste_handle);
+ paste_buf[off + len] = '\0';
+ if (len < PASTE_BUFFER - 1)
+ break;
+ if (StrChr(paste_buf + off, '\r')
+ || StrChr(paste_buf + off, '\n'))
+ break;
+ paste_buf = typeRealloc(char, paste_buf, size += PASTE_BUFFER - 1);
+
+ off += len;
+ }
+ return paste_buf;
+}
+
+int put_clip(const char *s)
+{
+ char *cmd = LYGetEnv("RL_CLCOPY_CMD");
+ FILE *fh;
+ size_t l = strlen(s), res;
+
+ if (!cmd)
+ return -1;
+
+ fh = popen(cmd, TXT_W);
+ if (!fh)
+ return -1;
+ res = fwrite(s, (size_t) 1, l, fh);
+ if (pclose(fh) != 0 || res != l)
+ return -1;
+ return 0;
+}
+
+# endif /* !defined(WIN_EX) && defined(HAVE_POPEN) */
+
+#endif /* __EMX__ */
+
+/*
+ * Sleep for a number of milli-sec.
+ */
+void LYmsec_delay(unsigned msec)
+{
+#if defined(_WINDOWS)
+ Sleep(msec);
+
+#elif defined(HAVE_NAPMS)
+ napms((int) msec);
+
+#elif defined(DJGPP) || defined(HAVE_USLEEP)
+ usleep(1000 * msec);
+
+#else
+ struct timeval tv;
+ unsigned long usec = 1000UL * msec;
+
+ tv.tv_sec = usec / 1000000UL;
+ tv.tv_usec = usec % 1000000UL;
+ select(0, NULL, NULL, NULL, &tv);
+#endif
+}
+
+#if defined(WIN_EX) /* 1997/10/16 (Thu) 20:13:28 */
+
+int put_clip(const char *szBuffer)
+{
+ HANDLE hWnd;
+ HANDLE m_hLogData;
+ LPTSTR pLogData;
+ HANDLE hClip;
+ int len;
+
+ if (szBuffer == NULL)
+ return EOF;
+
+ len = (int) strlen(szBuffer);
+ if (len == 0)
+ return EOF;
+ else
+ len++;
+
+ m_hLogData = GlobalAlloc(GHND, len);
+ if (m_hLogData == NULL) {
+ return EOF;
+ }
+
+ hWnd = NULL;
+ if (!OpenClipboard(hWnd)) {
+ return EOF;
+ }
+ /* Remove the current Clipboard contents */
+ if (!EmptyClipboard()) {
+ GlobalFree(m_hLogData);
+ return EOF;
+ }
+
+ /* Lock the global memory while we write to it. */
+ pLogData = (LPTSTR) GlobalLock(m_hLogData);
+
+ lstrcpy((LPTSTR) pLogData, szBuffer);
+ GlobalUnlock(m_hLogData);
+
+ /* If there were any lines at all then copy them to clipboard. */
+ hClip = SetClipboardData(CF_TEXT, m_hLogData);
+ if (!hClip) {
+ /* If we couldn't clip the data then free the global handle. */
+ GlobalFree(m_hLogData);
+ }
+
+ CloseClipboard();
+ return 0;
+}
+
+static HANDLE m_hLogData;
+static int m_locked;
+
+/* get_clip_grab() returns a pointer to the string in the system area.
+ get_clip_release() should be called ASAP after this. */
+
+char *get_clip_grab()
+{
+ HANDLE hWnd;
+ LPTSTR pLogData;
+
+ hWnd = NULL;
+ if (!OpenClipboard(hWnd)) {
+ return 0;
+ }
+
+ m_hLogData = GetClipboardData(CF_TEXT);
+
+ if (m_hLogData == NULL) {
+ CloseClipboard();
+ m_locked = 0;
+ return 0;
+ }
+ pLogData = (LPTSTR) GlobalLock(m_hLogData);
+
+ m_locked = 1;
+ return pLogData;
+}
+
+void get_clip_release()
+{
+ if (!m_locked)
+ return;
+ GlobalUnlock(m_hLogData);
+ CloseClipboard();
+ m_locked = 0;
+}
+#endif /* WIN_EX */
+#endif /* CAN_CUT_AND_PASTE */
+
+#if defined(WIN_EX)
+
+#ifndef WSABASEERR
+#define WSABASEERR 10000
+#endif
+
+#ifdef ENABLE_IPV6
+#define WSOCK_NAME "ws2_32"
+#else
+#define WSOCK_NAME "wsock32"
+#endif
+
+/*
+ * Description: the windows32 version of perror()
+ *
+ * Returns: a pointer to a static error
+ *
+ * Notes/Dependencies: I got this from
+ * comp.os.ms-windows.programmer.win32
+ */
+char *w32_strerror(DWORD ercode)
+{
+/* __declspec(thread) necessary if you will use multiple threads */
+#if defined(__CYGWIN__) || defined(__MINGW32__)
+ static char msg_buff[256];
+
+#else
+ __declspec(thread) static char msg_buff[256];
+#endif
+ HMODULE hModule;
+ int i, msg_type;
+ unsigned char *p, *q, tmp_buff[256];
+ DWORD rc;
+
+ hModule = NULL;
+ msg_type = FORMAT_MESSAGE_FROM_SYSTEM;
+ /* Fill message buffer with a default message in
+ * case FormatMessage fails
+ */
+ wsprintf(msg_buff, "Error %ld", ercode);
+
+ /*
+ * Special code for winsock error handling.
+ */
+ if (ercode > WSABASEERR) {
+ hModule = GetModuleHandle(WSOCK_NAME);
+ if (hModule)
+ msg_type = FORMAT_MESSAGE_FROM_HMODULE;
+ }
+ /*
+ * message handling. If not found in module, retry from system.
+ */
+ rc = FormatMessage(msg_type, hModule, ercode, LANG_NEUTRAL,
+ msg_buff, sizeof(msg_buff), NULL);
+
+ if (rc == 0 && msg_type == FORMAT_MESSAGE_FROM_HMODULE) {
+ FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, ercode,
+ LANG_NEUTRAL, msg_buff, sizeof(msg_buff), NULL);
+ }
+
+ strcpy((char *) tmp_buff, msg_buff);
+ p = q = tmp_buff;
+ i = 0;
+ while (*p) {
+ if (!(*p == '\n' || *p == '\r'))
+ msg_buff[i++] = *p;
+ p++;
+ }
+ msg_buff[i] = '\0';
+
+ return msg_buff;
+}
+
+#endif
+
+#if defined(SYSLOG_REQUESTED_URLS)
+/*
+ * syslog() interface
+ */
+void LYOpenlog(const char *banner)
+{
+ if (syslog_requested_urls) {
+ CTRACE((tfp, "LYOpenlog(%s)\n", NONNULL(banner)));
+#if defined(DJGPP)
+ openlog("lynx", LOG_PID | LOG_NDELAY, LOG_LOCAL5);
+#else
+ openlog("lynx", LOG_PID, LOG_LOCAL5);
+#endif
+
+ if (banner) {
+ syslog(LOG_INFO, "Session start:%s", banner);
+ } else {
+ syslog(LOG_INFO, "Session start");
+ }
+ }
+}
+
+static BOOLEAN looks_like_password(char *first,
+ char *last)
+{
+ BOOLEAN result = FALSE;
+
+ while (first <= last) {
+ if (*first == '/'
+ || *first == ':') {
+ result = FALSE;
+ break;
+ }
+ result = TRUE;
+ first++;
+ }
+ return result;
+}
+
+void LYSyslog(char *arg)
+{
+ char *colon1;
+ char *colon2;
+ char *atsign;
+
+ if (syslog_requested_urls) {
+
+ CTRACE((tfp, "LYSyslog %s\n", arg));
+
+ if (is_url(arg)) { /* proto://user:password@host/path:port */
+ /* ^this colon */
+ if ((colon1 = StrChr(arg, ':')) != 0
+ && !StrNCmp(colon1, "://", 3)
+ && (colon2 = StrChr(colon1 + 3, ':')) != 0
+ && (atsign = StrChr(colon1, '@')) != 0
+ && (colon2 < atsign)
+ && looks_like_password(colon2 + 1, atsign - 1)) {
+ char *buf = NULL;
+
+ StrAllocCopy(buf, arg);
+ buf[colon2 - arg + 1] = 0;
+ StrAllocCat(buf, "******");
+ StrAllocCat(buf, atsign);
+ syslog(LOG_INFO | LOG_LOCAL5, "%s", buf);
+ CTRACE((tfp, "...alter %s\n", buf));
+ FREE(buf);
+ return;
+ }
+ }
+ syslog(LOG_INFO | LOG_LOCAL5, "%s", NONNULL(arg));
+ }
+}
+
+void LYCloselog(void)
+{
+ if (syslog_requested_urls) {
+ syslog(LOG_INFO, "Session over");
+ closelog();
+ }
+}
+
+#endif /* SYSLOG_REQUESTED_URLS */
+
+#if defined(WIN_EX) || defined(__CYGWIN__) /* 2000/03/07 (Tue) 17:17:46 */
+
+#define IS_SEP(p) ((p == '\\') || (p == '/') || (p == ':'))
+
+static char *black_list[] =
+{
+ "con",
+ "prn",
+ "clock$",
+ "config$",
+ NULL
+};
+
+static int is_device(char *fname)
+{
+ HANDLE fileHandle;
+ DWORD val;
+ int i;
+
+ i = 0;
+ while (black_list[i] != NULL) {
+ if (strcasecomp(fname, black_list[i]) == 0) {
+ return 1; /* device file */
+ }
+ i++;
+ }
+
+ fileHandle = CreateFile(fname, 0, 0, 0, OPEN_EXISTING, 0, 0);
+
+ if (fileHandle == INVALID_HANDLE_VALUE) {
+ return 0; /* normal file */
+ } else {
+ val = GetFileType(fileHandle);
+ switch (val) {
+ case 1:
+ val = 0;
+ break;
+ case 2:
+ val = 1; /* device file */
+ break;
+ default:
+ val = 0;
+ break;
+ }
+
+ CloseHandle(fileHandle);
+ }
+ return val;
+}
+
+static char *device_list[] =
+{
+ "con",
+ "nul",
+ "aux",
+ "prn",
+ NULL
+};
+
+int unsafe_filename(const char *fname)
+{
+ int i, len, sum;
+ char *cp;
+ char *save;
+
+ i = 0;
+ while (device_list[i] != NULL) {
+ if (strcasecomp(fname, device_list[i]) == 0) {
+ return 0; /* device file (open OK) */
+ }
+ i++;
+ }
+
+ save = cp = strdup(fname);
+
+ while (*cp) {
+ if (IS_SJIS_HI1(UCH(*cp)) || IS_SJIS_HI2(UCH(*cp)))
+ cp += 2; /* KANJI skip */
+ if (IS_SEP(*cp)) {
+ *cp = '\0';
+ }
+ cp++;
+ }
+
+ sum = 0;
+ cp = save;
+ len = (int) strlen(fname);
+ while (cp < (save + len)) {
+ if (*cp == '\0') {
+ cp++;
+ } else {
+ char *q;
+
+ q = StrChr(cp, '.');
+ if (q)
+ *q = '\0';
+ if (is_device(cp)) {
+ sum++;
+ break;
+ }
+ if (q)
+ cp = q + 1;
+ while (*cp)
+ cp++;
+ }
+ }
+ free(save);
+
+ return (sum != 0);
+}
+
+FILE *safe_fopen(const char *fname, const char *mode)
+{
+ if (unsafe_filename(fname)) {
+ return (FILE *) NULL;
+ } else {
+ return fopen(fname, mode);
+ }
+}
+
+#endif /* defined(WIN_EX) || defined(__CYGWIN__) */
diff --git a/src/LYUtils.h b/src/LYUtils.h
new file mode 100644
index 0000000..d15a816
--- /dev/null
+++ b/src/LYUtils.h
@@ -0,0 +1,577 @@
+/* $LynxId: LYUtils.h,v 1.100 2018/03/27 21:19:21 tom Exp $ */
+#ifndef LYUTILS_H
+#define LYUTILS_H
+
+#include <LYCharVals.h> /* S/390 -- gil -- 2149 */
+#include <LYKeymap.h>
+
+#ifndef HTLIST_H
+#include <HTList.h>
+#endif /* HTLIST_H */
+
+#ifndef HTSTREAM_H
+#include <HTStream.h>
+#endif /* HTSTREAM_H */
+
+#ifdef VMS
+#include <HTFTP.h>
+#include <HTVMSUtils.h>
+#endif /* VMS */
+
+#if defined(USE_DOS_DRIVES)
+#include <HTDOS.h>
+#endif
+
+#if defined(SYSLOG_REQUESTED_URLS)
+#include <syslog.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef VMS
+#define HTSYS_name(path) HTVMS_name("", path)
+#define HTSYS_purge(path) HTVMS_purge(path)
+#define HTSYS_remove(path) HTVMS_remove(path)
+#endif /* VMS */
+
+#if defined(USE_DOS_DRIVES)
+#define HTSYS_name(path) HTDOS_name(path)
+#endif
+
+#ifndef HTSYS_name
+#define HTSYS_name(path) path
+#endif
+
+#ifndef HTSYS_purge
+#define HTSYS_purge(path) /* nothing */
+#endif
+
+#ifndef HTSYS_remove
+#define HTSYS_remove(path) remove(path)
+#endif
+
+#define LYIsPipeCommand(s) ((s)[0] == '|')
+
+#ifdef VMS
+#define TTY_DEVICE "tt:"
+#define NUL_DEVICE "nl:"
+#define LYIsNullDevice(s) (!strncasecomp(s, "nl:", 3) || !strncasecomp(s, "/nl/", 4))
+#define LYSameFilename(a,b) (!strcasecomp(a,b))
+#define LYSameHostname(a,b) (!strcasecomp(a,b))
+#else
+#if defined(DOSPATH) || defined(__EMX__)
+#define TTY_DEVICE "con"
+#define NUL_DEVICE "nul"
+#define LYIsNullDevice(s) LYSameFilename(s,NUL_DEVICE)
+#define LYSameFilename(a,b) (!strcasecomp(a,b))
+#define LYSameHostname(a,b) (!strcasecomp(a,b))
+#else
+#if defined(__CYGWIN__)
+#define TTY_DEVICE "/dev/tty"
+#define NUL_DEVICE "/dev/null"
+#define LYIsNullDevice(s) LYSameFilename(s,NUL_DEVICE)
+#define LYSameFilename(a,b) (!strcasecomp(a,b))
+#define LYSameHostname(a,b) (!strcasecomp(a,b))
+#else
+#define TTY_DEVICE "/dev/tty"
+#define NUL_DEVICE "/dev/null"
+#define LYIsNullDevice(s) LYSameFilename(s,NUL_DEVICE)
+#define LYSameFilename(a,b) (!strcmp(a,b))
+#define LYSameHostname(a,b) (!strcmp(a,b))
+#endif /* __CYGWIN__ */
+#endif /* DOSPATH */
+#endif /* VMS */
+
+/* See definitions in src/LYCharVals.h. The hardcoded values...
+ This prohibits binding C-c and C-g. Maybe it is better to remove this? */
+#define LYCharIsINTERRUPT_HARD(ch) \
+ ((ch) == LYCharINTERRUPT1 || ch == LYCharINTERRUPT2)
+
+#define LYCharIsINTERRUPT(ch) \
+ (LYCharIsINTERRUPT_HARD(ch) || LKC_TO_LAC(keymap,ch) == LYK_INTERRUPT)
+
+#define LYCharIsINTERRUPT_NO_letter(ch) \
+ (LYCharIsINTERRUPT(ch) && !isprint(ch))
+
+#if defined(USE_DOS_DRIVES)
+#define PATH_SEPARATOR ";"
+#define FILE_SEPARATOR "\\"
+#define LYIsPathSep(ch) ((ch) == '/' || (ch) == '\\')
+#define LYIsDosDrive(s) (isalpha(UCH((s)[0])) && (s)[1] == ':')
+#else
+#define PATH_SEPARATOR ":"
+#define FILE_SEPARATOR "/"
+#define LYIsPathSep(ch) ((ch) == '/')
+#define LYIsDosDrive(s) FALSE /* really nothing */
+#endif
+
+#ifdef USE_ADDRLIST_PAGE
+#define LYIsListpageTitle(name) \
+ (!strcmp((name), LIST_PAGE_TITLE) || \
+ !strcmp((name), ADDRLIST_PAGE_TITLE))
+#else
+#define LYIsListpageTitle(name) \
+ (!strcmp((name), LIST_PAGE_TITLE))
+#endif
+
+#define LYIsTilde(ch) ((ch) == '~')
+#define LYIsHtmlSep(ch) ((ch) == '/')
+#define findPoundSelector(address) StrChr(address, '#')
+#define restorePoundSelector(pound) if ((pound) != NULL) *(pound) = '#'
+
+ extern BOOL strn_dash_equ(const char *p1, const char *p2, int len);
+ extern BOOLEAN LYCachedTemp(char *result, char **cached);
+ extern BOOLEAN LYCanDoHEAD(const char *address);
+ extern BOOLEAN LYCanReadFile(const char *name);
+ extern BOOLEAN LYCanWriteFile(const char *name);
+ extern BOOLEAN LYCloseInput(FILE *fp);
+ extern BOOLEAN LYCloseOutput(FILE *fp);
+ extern BOOLEAN LYFixCursesOnForAccess(const char *addr, const char *physical);
+ extern BOOLEAN LYPathOffHomeOK(char *fbuffer, size_t fbuffer_size);
+ extern BOOLEAN LYValidateFilename(bstring **result, bstring **given);
+ extern BOOLEAN LYisAbsPath(const char *path);
+ extern BOOLEAN LYisLocalAlias(const char *filename);
+ extern BOOLEAN LYisLocalFile(const char *filename);
+ extern BOOLEAN LYisLocalHost(const char *filename);
+ extern BOOLEAN LYisRootPath(const char *path);
+ extern BOOLEAN inlocaldomain(void);
+ extern FILE *InternalPageFP(char *filename, int reuse_flag);
+ extern FILE *LYAppendToTxtFile(const char *name);
+ extern FILE *LYNewBinFile(const char *name);
+ extern FILE *LYNewTxtFile(const char *name);
+ extern FILE *LYOpenScratch(char *result, const char *prefix);
+ extern FILE *LYOpenTemp(char *result, const char *suffix, const char *mode);
+ extern FILE *LYOpenTempRewrite(char *result, const char *suffix, const char *mode);
+ extern FILE *LYReopenTemp(char *name);
+ extern char *Current_Dir(char *pathname);
+ extern char *LYAbsOrHomePath(char **fname);
+ extern char *LYAddPathToSave(char *fname);
+ extern char *LYFindConfigFile(const char *nominal, const char *dftfile);
+ extern char *LYGetEnv(const char *name);
+ extern char *LYLastPathSep(const char *path);
+ extern char *LYPathLeaf(char *pathname);
+ extern char *LYTildeExpand(char **pathname, int embedded);
+ extern char *LYgetXDisplay(void);
+ extern char *strip_trailing_slash(char *my_dirname);
+ extern char *trimPoundSelector(char *address);
+ extern const char *Home_Dir(void);
+ extern const char *LYGetHiliteStr(int cur, int count);
+ extern const char *LYSysShell(void);
+ extern const char *index_to_restriction(unsigned inx);
+ extern const char *wwwName(const char *pathname);
+ extern int HTCheckForInterrupt(void);
+ extern int LYConsoleInputFD(int need_selectable);
+ extern int LYRenameFile(char *src, char *dst);
+ extern int LYCopyFile(char *src, char *dst);
+ extern int LYGetHilitePos(int cur, int count);
+ extern int LYRemoveTemp(char *name);
+ extern int LYReopenInput(void);
+ extern int LYSystem(char *command);
+ extern int LYValidateOutput(char *filename);
+ extern int find_restriction(const char *name, int len);
+ extern int number2arrows(int number);
+ extern size_t utf8_length(int utf_flag, const char *data);
+ extern time_t LYmktime(char *string, int absolute);
+ extern void BeginInternalPage(FILE *fp0, const char *Title, const char *HelpURL);
+ extern void EndInternalPage(FILE *fp0);
+ extern void HTAddSugFilename(char *fname);
+ extern void HTSugFilenames_free(void);
+ extern void LYAddHilite(int cur, char *text, int x);
+ extern void LYAddHtmlSep(char **path);
+ extern void LYAddHtmlSep0(char *path);
+ extern void LYAddLocalhostAlias(char *alias);
+ extern void LYAddPathSep(char **path);
+ extern void LYAddPathSep0(char *path);
+ extern void LYAddPathToHome(char *fbuffer, size_t fbuffer_size, const char *fname);
+ extern void LYCheckBibHost(void);
+ extern void LYCheckMail(void);
+ extern void LYCleanupTemp(void);
+ extern void LYCloseTemp(char *name);
+ extern void LYCloseTempFP(FILE *fp);
+ extern void LYConvertToURL(char **AllocatedString, int fixit);
+ extern void LYDoCSI(char *url, const char *comment, char **csi);
+ extern void LYEnsureAbsoluteURL(char **href, const char *name, int fixit);
+ extern void LYFakeZap(int set);
+ extern void LYFixCursesOn(const char *reason);
+ extern void LYFreeHilites(int first, int last);
+ extern void LYFreeStringList(HTList *list);
+ extern void LYLocalFileToURL(char **target, const char *source);
+ extern void LYLocalhostAliases_free(void);
+ extern void LYRenamedTemp(char *oldname, char *newname);
+ extern void LYSetHilite(int cur, const char *text);
+ extern void LYTrimHtmlSep(char *path);
+ extern void LYTrimPathSep(char *path);
+ extern void LYTrimRelFromAbsPath(char *path);
+ extern void LYhighlight(int flag, int cur, const char *target);
+ extern void LYmsec_delay(unsigned msec);
+ extern void LYsetXDisplay(char *new_display);
+ extern void WriteInternalTitle(FILE *fp0, const char *Title);
+ extern void WriteStreamTitle(HTStream *target, const char *Title);
+ extern void change_sug_filename(char *fname);
+ extern void convert_to_spaces(char *string, int condense);
+ extern void free_and_clear(char **obj);
+ extern void noviceline(int more_flag);
+ extern void parse_restrictions(const char *s);
+ extern void print_restrictions_to_fd(FILE *fp);
+ extern void remove_backslashes(char *buf);
+ extern void size_change(int sig);
+ extern void statusline(const char *text);
+ extern void toggle_novice_line(void);
+
+#if defined(MULTI_USER_UNIX)
+ extern BOOL IsOurFile(const char *name);
+#else
+#define IsOurFile(name) TRUE
+#endif
+
+#ifdef USE_ASCII_CTYPES
+ extern int ascii_tolower(int i);
+ extern int ascii_toupper(int i);
+ extern int ascii_isupper(int i);
+#endif
+
+#ifdef __CYGWIN__
+ extern int Cygwin_Shell(void);
+#endif
+
+#if defined(_WIN_CC) || defined(WIN_EX)
+ extern int exec_command(char *cmd, int wait_flag); /* xsystem.c */
+ extern char *quote_pathname(char *pathname);
+ extern int xsystem(char *cmd);
+#endif
+
+ /* Keeping track of User Interface Pages: */
+ typedef enum {
+ UIP_UNKNOWN = -1
+ ,UIP_HISTORY = 0
+ ,UIP_DOWNLOAD_OPTIONS
+ ,UIP_PRINT_OPTIONS
+ ,UIP_SHOWINFO
+ ,UIP_LIST_PAGE
+ ,UIP_VLINKS
+ ,UIP_LYNXCFG
+ ,UIP_OPTIONS_MENU
+ ,UIP_DIRED_MENU
+ ,UIP_PERMIT_OPTIONS
+ ,UIP_UPLOAD_OPTIONS
+ ,UIP_ADDRLIST_PAGE
+ ,UIP_CONFIG_DEF
+ ,UIP_TRACELOG
+ ,UIP_INSTALL
+ } UIP_t;
+
+#define UIP_P_FRAG 0x0001 /* flag: consider "url#frag" as matching "url" */
+
+ extern BOOL LYIsUIPage3(const char *url, UIP_t type, int flagparam);
+
+#define LYIsUIPage(url,type) LYIsUIPage3(url, type, UIP_P_FRAG)
+ extern void LYRegisterUIPage(const char *url, UIP_t type);
+
+#define LYUnRegisterUIPage(type) LYRegisterUIPage(NULL, type)
+ extern void LYUIPages_free(void);
+
+#ifdef CAN_CUT_AND_PASTE
+ extern int put_clip(const char *szBuffer);
+
+/* get_clip_grab() returns a pointer to the string in the system area.
+ get_clip_release() should be called ASAP after this. */
+ extern char *get_clip_grab(void);
+ extern void get_clip_release(void);
+
+# ifdef WIN_EX
+# define size_clip() 8192
+# else
+ extern int size_clip(void);
+
+# endif
+#endif
+
+#if defined(WIN_EX) /* 1997/10/16 (Thu) 20:13:28 */
+ extern char *HTDOS_short_name(const char *path);
+ extern char *w32_strerror(DWORD ercode);
+#endif
+
+#if defined(WIN_EX) || defined(__CYGWIN__) /* 2000/03/07 (Tue) 17:17:46 */
+ extern int unsafe_filename(const char *fname);
+ extern FILE *safe_fopen(const char *fname, const char *mode);
+#endif
+
+#ifdef VMS
+ extern void Define_VMSLogical(char *LogicalName, char *LogicalValue);
+#endif /* VMS */
+
+#if !defined(HAVE_PUTENV)
+ extern int putenv(const char *string);
+#endif /* HAVE_PUTENV */
+
+#if defined(MULTI_USER_UNIX)
+ extern void LYRelaxFilePermissions(const char *name);
+
+#else
+#define LYRelaxFilePermissions(name) /* nothing */
+#endif
+
+#if defined(_WINDOWS)
+ extern int win32_check_interrupt(void);
+
+#if (defined(__MINGW32__) && !defined(HAVE_SLEEP))
+#undef sleep
+ void sleep(unsigned sec);
+#endif
+#endif
+
+ /*
+ * Whether or not the status line must be shown.
+ */
+ extern BOOLEAN mustshow;
+
+#define _statusline(msg) mustshow = TRUE, statusline(msg)
+
+ /*
+ * For is_url().
+ *
+ * Universal document id types (see LYCheckForProxyURL)
+ */
+ typedef enum {
+ NOT_A_URL_TYPE = 0,
+ UNKNOWN_URL_TYPE = 1, /* must be nonzero */
+
+ HTTP_URL_TYPE,
+ FILE_URL_TYPE,
+ FTP_URL_TYPE,
+ NCFTP_URL_TYPE,
+ WAIS_URL_TYPE,
+ NEWS_URL_TYPE,
+ NNTP_URL_TYPE,
+ TELNET_URL_TYPE,
+ TN3270_URL_TYPE,
+ RLOGIN_URL_TYPE,
+ GOPHER_URL_TYPE,
+ HTML_GOPHER_URL_TYPE,
+ TELNET_GOPHER_URL_TYPE,
+ INDEX_GOPHER_URL_TYPE,
+ MAILTO_URL_TYPE,
+ BIBP_URL_TYPE,
+ FINGER_URL_TYPE,
+ CSO_URL_TYPE,
+ HTTPS_URL_TYPE,
+ SNEWS_URL_TYPE,
+ PROSPERO_URL_TYPE,
+ AFS_URL_TYPE,
+
+ DATA_URL_TYPE,
+
+ LYNXCGI_URL_TYPE,
+ LYNXEXEC_URL_TYPE,
+ LYNXPROG_URL_TYPE,
+
+ NEWSPOST_URL_TYPE,
+ NEWSREPLY_URL_TYPE,
+ SNEWSPOST_URL_TYPE,
+ SNEWSREPLY_URL_TYPE,
+
+ LYNXCACHE_URL_TYPE,
+ LYNXCFG_URL_TYPE,
+ LYNXCOMPILE_OPTS_URL_TYPE,
+ LYNXCOOKIE_URL_TYPE,
+ LYNXDIRED_URL_TYPE,
+ LYNXDOWNLOAD_URL_TYPE,
+ LYNXEDITMAP_URL_TYPE,
+ LYNXHIST_URL_TYPE,
+ LYNXIMGMAP_URL_TYPE,
+ LYNXKEYMAP_URL_TYPE,
+ LYNXMESSAGES_URL_TYPE,
+ LYNXOPTIONS_URL_TYPE,
+ LYNXPRINT_URL_TYPE,
+
+ PROXY_URL_TYPE
+
+ } UrlTypes;
+
+ extern UrlTypes LYCheckForProxyURL(char *filename);
+ extern UrlTypes is_url(char *filename);
+
+/* common URLs */
+#define STR_BIBP_URL "bibp:"
+#define LEN_BIBP_URL 5
+#define isBIBP_URL(addr) !strncasecomp(addr, STR_BIBP_URL, LEN_BIBP_URL)
+
+#define STR_CSO_URL "cso:"
+#define LEN_CSO_URL 4
+#define isCSO_URL(addr) !strncasecomp(addr, STR_CSO_URL, LEN_CSO_URL)
+
+#define STR_FILE_URL "file:"
+#define LEN_FILE_URL 5
+#define isFILE_URL(addr) ((*addr == 'f' || *addr == 'F') &&\
+ !strncasecomp(addr, STR_FILE_URL, LEN_FILE_URL))
+
+#define STR_FINGER_URL "finger:"
+#define LEN_FINGER_URL 7
+#define isFINGER_URL(addr) !strncasecomp(addr, STR_FINGER_URL, LEN_FINGER_URL)
+
+#define STR_FTP_URL "ftp:"
+#define LEN_FTP_URL 4
+#define isFTP_URL(addr) !strncasecomp(addr, STR_FTP_URL, LEN_FTP_URL)
+
+#define STR_GOPHER_URL "gopher:"
+#define LEN_GOPHER_URL 7
+#define isGOPHER_URL(addr) !strncasecomp(addr, STR_GOPHER_URL, LEN_GOPHER_URL)
+
+#define STR_HTTP_URL "http:"
+#define LEN_HTTP_URL 5
+#define isHTTP_URL(addr) !strncasecomp(addr, STR_HTTP_URL, LEN_HTTP_URL)
+
+#define STR_HTTPS_URL "https:"
+#define LEN_HTTPS_URL 6
+#define isHTTPS_URL(addr) !strncasecomp(addr, STR_HTTPS_URL, LEN_HTTPS_URL)
+
+#define STR_MAILTO_URL "mailto:"
+#define LEN_MAILTO_URL 7
+#define isMAILTO_URL(addr) !strncasecomp(addr, STR_MAILTO_URL, LEN_MAILTO_URL)
+
+#define STR_NEWS_URL "news:"
+#define LEN_NEWS_URL 5
+#define isNEWS_URL(addr) !strncasecomp(addr, STR_NEWS_URL, LEN_NEWS_URL)
+
+#define STR_NNTP_URL "nntp:"
+#define LEN_NNTP_URL 5
+#define isNNTP_URL(addr) !strncasecomp(addr, STR_NNTP_URL, LEN_NNTP_URL)
+
+#define STR_RLOGIN_URL "rlogin:"
+#define LEN_RLOGIN_URL 7
+#define isRLOGIN_URL(addr) !strncasecomp(addr, STR_RLOGIN_URL, LEN_RLOGIN_URL)
+
+#define STR_SNEWS_URL "snews:"
+#define LEN_SNEWS_URL 6
+#define isSNEWS_URL(addr) !strncasecomp(addr, STR_SNEWS_URL, LEN_SNEWS_URL)
+
+#define STR_TELNET_URL "telnet:"
+#define LEN_TELNET_URL 7
+#define isTELNET_URL(addr) !strncasecomp(addr, STR_TELNET_URL, LEN_TELNET_URL)
+
+#define STR_TN3270_URL "tn3270:"
+#define LEN_TN3270_URL 7
+#define isTN3270_URL(addr) !strncasecomp(addr, STR_TN3270_URL, LEN_TN3270_URL)
+
+#define STR_WAIS_URL "wais:"
+#define LEN_WAIS_URL 5
+#define isWAIS_URL(addr) !strncasecomp(addr, STR_WAIS_URL, LEN_WAIS_URL)
+
+/* internal URLs */
+#ifdef USE_CACHEJAR
+#define STR_LYNXCACHE "LYNXCACHE:"
+#define LEN_LYNXCACHE 10
+#define isLYNXCACHE(addr) !strncasecomp(addr, STR_LYNXCACHE, LEN_LYNXCACHE)
+#else
+#define isLYNXCACHE(addr) FALSE
+#endif
+
+#define STR_LYNXCFG "LYNXCFG:"
+#define LEN_LYNXCFG 8
+#define isLYNXCFG(addr) !strncasecomp(addr, STR_LYNXCFG, LEN_LYNXCFG)
+
+#define STR_LYNXCFLAGS "LYNXCOMPILEOPTS:"
+#define LEN_LYNXCFLAGS 16
+#define isLYNXCFLAGS(addr) !strncasecomp(addr, STR_LYNXCFLAGS, LEN_LYNXCFLAGS)
+
+#define STR_LYNXCGI "lynxcgi:"
+#define LEN_LYNXCGI 8
+#define isLYNXCGI(addr) ((*addr == 'l' || *addr == 'L') &&\
+ !strncasecomp(addr, STR_LYNXCGI, LEN_LYNXCGI))
+
+#define STR_LYNXCOOKIE "LYNXCOOKIE:"
+#define LEN_LYNXCOOKIE 11
+#define isLYNXCOOKIE(addr) !strncasecomp(addr, STR_LYNXCOOKIE, LEN_LYNXCOOKIE)
+
+#define STR_LYNXDIRED "LYNXDIRED:"
+#define LEN_LYNXDIRED 10
+#define isLYNXDIRED(addr) !strncasecomp(addr, STR_LYNXDIRED, LEN_LYNXDIRED)
+
+#define STR_LYNXEXEC "lynxexec:"
+#define LEN_LYNXEXEC 9
+#define isLYNXEXEC(addr) ((*addr == 'l' || *addr == 'L') &&\
+ !strncasecomp(addr, STR_LYNXEXEC, LEN_LYNXEXEC))
+
+#define STR_LYNXDOWNLOAD "LYNXDOWNLOAD:"
+#define LEN_LYNXDOWNLOAD 13
+#define isLYNXDOWNLOAD(addr) !strncasecomp(addr, STR_LYNXDOWNLOAD, LEN_LYNXDOWNLOAD)
+
+#define STR_LYNXEDITMAP "LYNXEDITMAP:"
+#define LEN_LYNXEDITMAP 11
+#define isLYNXEDITMAP(addr) !strncasecomp(addr, STR_LYNXEDITMAP, LEN_LYNXEDITMAP)
+
+#define STR_LYNXHIST "LYNXHIST:"
+#define LEN_LYNXHIST 9
+#define isLYNXHIST(addr) !strncasecomp(addr, STR_LYNXHIST, LEN_LYNXHIST)
+
+#define STR_LYNXKEYMAP "LYNXKEYMAP:"
+#define LEN_LYNXKEYMAP 11
+#define isLYNXKEYMAP(addr) !strncasecomp(addr, STR_LYNXKEYMAP, LEN_LYNXKEYMAP)
+
+#define STR_LYNXIMGMAP "LYNXIMGMAP:"
+#define LEN_LYNXIMGMAP 11
+#define isLYNXIMGMAP(addr) !strncasecomp(addr, STR_LYNXIMGMAP, LEN_LYNXIMGMAP)
+
+#define STR_LYNXMESSAGES "LYNXMESSAGES:"
+#define LEN_LYNXMESSAGES 13
+#define isLYNXMESSAGES(addr) !strncasecomp(addr, STR_LYNXMESSAGES, LEN_LYNXMESSAGES)
+
+#define STR_LYNXOPTIONS "LYNXOPTIONS:"
+#define LEN_LYNXOPTIONS 12
+#define isLYNXOPTIONS(addr) !strncasecomp(addr, STR_LYNXOPTIONS, LEN_LYNXOPTIONS)
+
+#define STR_LYNXPRINT "LYNXPRINT:"
+#define LEN_LYNXPRINT 10
+#define isLYNXPRINT(addr) !strncasecomp(addr, STR_LYNXPRINT, LEN_LYNXPRINT)
+
+#define STR_LYNXPROG "lynxprog:"
+#define LEN_LYNXPROG 9
+#define isLYNXPROG(addr) ((*addr == 'l' || *addr == 'L') &&\
+ !strncasecomp(addr, STR_LYNXPROG, LEN_LYNXPROG))
+
+#define LYNXOPTIONS_PAGE(s) STR_LYNXOPTIONS s
+/*
+ * For change_sug_filename().
+ */
+ extern HTList *sug_filenames;
+
+/*
+ * syslog() facility
+ */
+#if defined(SYSLOG_REQUESTED_URLS)
+ extern void LYOpenlog(const char *banner);
+ extern void LYSyslog(char *arg);
+ extern void LYCloselog(void);
+#endif /* SYSLOG_REQUESTED_URLS */
+
+#undef STREQ /* conflict with wais.h */
+
+/*
+ * Miscellaneous.
+ */
+#define STREQ(a,b) (strcmp(a,b) == 0)
+#define STRNEQ(a,b,c) (StrNCmp(a,b,c) == 0)
+
+#define HIDE_CHMOD 0600
+#define HIDE_UMASK 0077
+
+#if defined(DOSPATH) || defined(__CYGWIN__)
+#define TXT_R "rt"
+#define TXT_W "wt"
+#define TXT_A "at+"
+#else
+#define TXT_R "r"
+#define TXT_W "w"
+#define TXT_A "a+"
+#endif
+
+#define BIN_R "rb"
+#define BIN_W "wb"
+#define BIN_A "ab+"
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* LYUTILS_H */
diff --git a/src/LYVMSdef.h b/src/LYVMSdef.h
new file mode 100644
index 0000000..6fde3c3
--- /dev/null
+++ b/src/LYVMSdef.h
@@ -0,0 +1,18 @@
+
+#ifndef LYVMSDEF_H
+#define LYVMSDEF_H
+
+/*
+ * These are VMS system definitions which may not be in the headers
+ * of old VMS compilers and contain non-ANSI extended tokens that
+ * generate warnings by some Unix compilers while looking for the
+ * "#endif" which closes the outer "#ifdef VMS".
+ */
+#ifndef CLI$M_TRUSTED
+#define CLI$M_TRUSTED 64 /* May not be in the compiler's clidef.h */
+#endif /* !CLI$M_TRUSTED */
+#ifndef LIB$_INVARG
+#define LIB$_INVARG 1409588 /* May not be in the compiler's libdef.h */
+#endif /* !LIB$_INVARG */
+
+#endif /* LYVMSDEF_H */
diff --git a/src/LYebcdic.c b/src/LYebcdic.c
new file mode 100644
index 0000000..30c9822
--- /dev/null
+++ b/src/LYebcdic.c
@@ -0,0 +1,48 @@
+/*
+ * $LynxId: LYebcdic.c,v 1.1 2008/12/30 01:03:05 Paul.Gilmartin Exp $
+ */
+#include <HTUtils.h>
+
+#ifdef EBCDIC
+/* *INDENT-OFF* */
+const char un_IBM1047[ 256 ] = /* ETOA OEMVS311 */
+{
+0x00,0x01,0x02,0x03,0x9c,0x09,0x86,0x7f,0x97,0x8d,0x8e,0x0b,0x0c,0x0d,0x0e,0x0f,
+0x10,0x11,0x12,0x13,0x9d,0x0a,0x08,0x87,0x18,0x19,0x92,0x8f,0x1c,0x1d,0x1e,0x1f,
+0x80,0x81,0x82,0x83,0x84,0x85,0x17,0x1b,0x88,0x89,0x8a,0x8b,0x8c,0x05,0x06,0x07,
+0x90,0x91,0x16,0x93,0x94,0x95,0x96,0x04,0x98,0x99,0x9a,0x9b,0x14,0x15,0x9e,0x1a,
+0x20,0xa0,0xe2,0xe4,0xe0,0xe1,0xe3,0xe5,0xe7,0xf1,0xa2,0x2e,0x3c,0x28,0x2b,0x7c,
+0x26,0xe9,0xea,0xeb,0xe8,0xed,0xee,0xef,0xec,0xdf,0x21,0x24,0x2a,0x29,0x3b,0x5e,
+0x2d,0x2f,0xc2,0xc4,0xc0,0xc1,0xc3,0xc5,0xc7,0xd1,0xa6,0x2c,0x25,0x5f,0x3e,0x3f,
+0xf8,0xc9,0xca,0xcb,0xc8,0xcd,0xce,0xcf,0xcc,0x60,0x3a,0x23,0x40,0x27,0x3d,0x22,
+0xd8,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0xab,0xbb,0xf0,0xfd,0xfe,0xb1,
+0xb0,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,0x70,0x71,0x72,0xaa,0xba,0xe6,0xb8,0xc6,0xa4,
+0xb5,0x7e,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0xa1,0xbf,0xd0,0x5b,0xde,0xae,
+0xac,0xa3,0xa5,0xb7,0xa9,0xa7,0xb6,0xbc,0xbd,0xbe,0xdd,0xa8,0xaf,0x5d,0xb4,0xd7,
+0x7b,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0xad,0xf4,0xf6,0xf2,0xf3,0xf5,
+0x7d,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,0x50,0x51,0x52,0xb9,0xfb,0xfc,0xf9,0xfa,0xff,
+0x5c,0xf7,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0xb2,0xd4,0xd6,0xd2,0xd3,0xd5,
+0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0xb3,0xdb,0xdc,0xd9,0xda,0x9f
+} ;
+const unsigned char IBM1047[ 256 ] = /* ATOE OEMVS311 */
+{
+0x00,0x01,0x02,0x03,0x37,0x2d,0x2e,0x2f,0x16,0x05,0x15,0x0b,0x0c,0x0d,0x0e,0x0f,
+0x10,0x11,0x12,0x13,0x3c,0x3d,0x32,0x26,0x18,0x19,0x3f,0x27,0x1c,0x1d,0x1e,0x1f,
+0x40,0x5a,0x7f,0x7b,0x5b,0x6c,0x50,0x7d,0x4d,0x5d,0x5c,0x4e,0x6b,0x60,0x4b,0x61,
+0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0x7a,0x5e,0x4c,0x7e,0x6e,0x6f,
+0x7c,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,
+0xd7,0xd8,0xd9,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xad,0xe0,0xbd,0x5f,0x6d,
+0x79,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x91,0x92,0x93,0x94,0x95,0x96,
+0x97,0x98,0x99,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xc0,0x4f,0xd0,0xa1,0x07,
+0x20,0x21,0x22,0x23,0x24,0x25,0x06,0x17,0x28,0x29,0x2a,0x2b,0x2c,0x09,0x0a,0x1b,
+0x30,0x31,0x1a,0x33,0x34,0x35,0x36,0x08,0x38,0x39,0x3a,0x3b,0x04,0x14,0x3e,0xff,
+0x41,0xaa,0x4a,0xb1,0x9f,0xb2,0x6a,0xb5,0xbb,0xb4,0x9a,0x8a,0xb0,0xca,0xaf,0xbc,
+0x90,0x8f,0xea,0xfa,0xbe,0xa0,0xb6,0xb3,0x9d,0xda,0x9b,0x8b,0xb7,0xb8,0xb9,0xab,
+0x64,0x65,0x62,0x66,0x63,0x67,0x9e,0x68,0x74,0x71,0x72,0x73,0x78,0x75,0x76,0x77,
+0xac,0x69,0xed,0xee,0xeb,0xef,0xec,0xbf,0x80,0xfd,0xfe,0xfb,0xfc,0xba,0xae,0x59,
+0x44,0x45,0x42,0x46,0x43,0x47,0x9c,0x48,0x54,0x51,0x52,0x53,0x58,0x55,0x56,0x57,
+0x8c,0x49,0xcd,0xce,0xcb,0xcf,0xcc,0xe1,0x70,0xdd,0xde,0xdb,0xdc,0x8d,0x8e,0xdf
+} ;
+/* *INDENT-ON* */
+
+#endif /* EBCDIC */
diff --git a/src/LYexit.c b/src/LYexit.c
new file mode 100644
index 0000000..8b94048
--- /dev/null
+++ b/src/LYexit.c
@@ -0,0 +1,185 @@
+/*
+ * $LynxId: LYexit.c,v 1.38 2020/02/25 10:14:48 tom Exp $
+ *
+ * Copyright (c) 1994, University of Kansas, All Rights Reserved
+ * (most of this file was rewritten in 1996 and 2004).
+ */
+#include <HTUtils.h>
+#include <LYexit.h>
+#include <HTAlert.h>
+#ifndef VMS
+#include <LYGlobalDefs.h>
+#include <LYUtils.h>
+#include <LYSignal.h>
+#include <LYMainLoop.h>
+#endif /* !VMS */
+#include <LYStrings.h>
+#include <LYClean.h>
+
+/*
+ * Flag for outofmem macro. - FM
+ */
+BOOL LYOutOfMemory = FALSE;
+
+/*
+ * Stack of functions to call upon exit.
+ */
+static void (*callstack[ATEXITSIZE]) (void);
+static int topOfStack = 0;
+
+/*
+ * Capture "atexit()" calls for our own accounting.
+ */
+int LYatexit(void (*function) (void))
+{
+ int result = 0;
+
+ if (topOfStack >= ATEXITSIZE) {
+ CTRACE((tfp, "(LY)atexit: Too many functions, ignoring one!\n"));
+ result = -1;
+ } else {
+ int n;
+ BOOLEAN found = FALSE;
+
+ for (n = 0; n < topOfStack; ++n) {
+ if (callstack[n] == function) {
+ found = TRUE;
+ break;
+ }
+ }
+ if (!found) {
+ callstack[topOfStack++] = function;
+ }
+ }
+ return result;
+}
+
+/*
+ * Purpose: Call the functions registered with LYatexit
+ * Arguments: void
+ * Return Value: void
+ * Remarks/Portability/Dependencies/Restrictions:
+ * Revision History:
+ * 06-15-94 created Lynx 2-3-1 Garrett Arch Blythe
+ */
+static void LYCompleteExit(void)
+{
+ /*
+ * Just loop through registered functions. This is reentrant if more exits
+ * occur in the registered functions.
+ */
+ while (--topOfStack >= 0) {
+ callstack[topOfStack] ();
+ }
+}
+
+/*
+ * Purpose: Terminates program, reports memory not freed.
+ * Arguments: status Exit code.
+ * Return Value: void
+ * Remarks/Portability/Dependencies/Restrictions:
+ * Function calls stdlib.h exit
+ * Revision History:
+ * 06-15-94 created Lynx 2-3-1 Garrett Arch Blythe
+ */
+void LYexit(int status)
+{
+#ifndef VMS /* On VMS, the VMSexit() handler does these. - FM */
+#ifdef _WINDOWS
+ DeleteCriticalSection(&critSec_READ);
+
+ WSACleanup();
+#endif
+ if (LYOutOfMemory == TRUE) {
+ /*
+ * Ignore further interrupts. - FM
+ */
+#ifndef NOSIGHUP
+ (void) signal(SIGHUP, SIG_IGN);
+#endif /* NOSIGHUP */
+ (void) signal(SIGTERM, SIG_IGN);
+ (void) signal(SIGINT, SIG_IGN);
+#ifndef __linux__
+#ifdef SIGBUS
+ (void) signal(SIGBUS, SIG_IGN);
+#endif /* SIGBUS */
+#endif /* !__linux__ */
+ (void) signal(SIGSEGV, SIG_IGN);
+ (void) signal(SIGILL, SIG_IGN);
+
+ /*
+ * Flush all messages. - FM
+ */
+ fflush(stderr);
+ fflush(stdout);
+
+ /*
+ * Deal with curses, if on, and clean up. - FM
+ */
+ if (LYCursesON) {
+ LYSleepAlert();
+ }
+ cleanup_sig(0);
+#ifndef __linux__
+#ifdef SIGBUS
+ signal(SIGBUS, SIG_DFL);
+#endif /* SIGBUS */
+#endif /* !__linux__ */
+ signal(SIGSEGV, SIG_DFL);
+ signal(SIGILL, SIG_DFL);
+ }
+#endif /* !VMS */
+
+ /*
+ * Close syslog before doing atexit-cleanup, since it may use a string
+ * that would be freed there.
+ */
+#ifdef SYSLOG_REQUESTED_URLS
+ LYCloselog();
+#endif
+
+ /*
+ * Do functions registered with LYatexit. - GAB
+ */
+ LYCompleteExit();
+
+ LYCloseCmdLogfile();
+
+#ifdef exit
+/* Make sure we use stdlib exit and not LYexit. - GAB
+*/
+#undef exit
+#endif /* exit */
+
+ cleanup_files(); /* if someone starts with LYNXfoo: page */
+#ifndef VMS /* On VMS, the VMSexit() handler does these. - FM */
+ fflush(stderr);
+ if (LYOutOfMemory == TRUE) {
+ LYOutOfMemory = FALSE;
+ printf("\r\n%s\r\n\r\n", MEMORY_EXHAUSTED_ABORT);
+ fflush(stdout);
+ }
+ LYCloseTracelog();
+#endif /* !VMS */
+ show_alloc();
+
+#if defined(NCURSES_VERSION) && defined(LY_FIND_LEAKS)
+#if defined(HAVE_CURSES_EXIT)
+ curses_exit(status);
+#elif defined(HAVE__NC_FREE_AND_EXIT)
+ _nc_free_and_exit(status);
+#elif defined(HAVE__NC_FREEALL)
+ _nc_freeall();
+#endif
+#endif /* NCURSES_VERSION */
+
+ exit(status);
+}
+
+void outofmem(const char *fname,
+ const char *func)
+{
+ fprintf(stderr, "\n\n\n%s %s: %s\n", fname, func, MEMORY_EXHAUSTED_ABORTING);
+ LYOutOfMemory = TRUE;
+ LYexit(-1);
+}
diff --git a/src/LYmktime.c b/src/LYmktime.c
new file mode 100644
index 0000000..5cc1dc4
--- /dev/null
+++ b/src/LYmktime.c
@@ -0,0 +1,364 @@
+/* $LynxId: LYmktime.c,v 1.20 2019/08/28 22:54:45 tom Exp $ */
+
+#include <LYStrings.h>
+#include <LYUtils.h>
+
+#include <parsdate.h>
+
+#ifdef TEST_DRIVER
+
+int ascii_toupper(int i)
+{
+ if (123 > i && i > 96)
+ return (i - 32);
+ else
+ return i;
+}
+
+char *LYstrncpy(char *dst,
+ const char *src,
+ int n)
+{
+ char *val;
+ int len;
+
+ if (src == 0)
+ src = "";
+ len = strlen(src);
+
+ if (n < 0)
+ n = 0;
+
+ val = StrNCpy(dst, src, n);
+ if (len < n)
+ *(dst + len) = '\0';
+ else
+ *(dst + n) = '\0';
+ return val;
+}
+#define strcasecomp strcasecmp
+BOOLEAN WWW_TraceFlag = FALSE;
+FILE *TraceFP(void)
+{
+ return stderr;
+}
+#define USE_PARSDATE 0
+#else
+#define USE_PARSDATE 1
+#endif
+
+/*
+ * This function takes a string in the format
+ * "Mon, 01-Jan-96 13:45:35 GMT" or
+ * "Mon, 1 Jan 1996 13:45:35 GMT" or
+ * "dd-mm-yyyy"
+ * as an argument, and returns its conversion to clock format (seconds since
+ * 00:00:00 Jan 1 1970), or 0 if the string doesn't match the expected pattern.
+ * It also returns 0 if the time is in the past and the "absolute" argument is
+ * FALSE. It is intended for handling 'expires' strings in Version 0 cookies
+ * homologously to 'max-age' strings in Version 1 cookies, for which 0 is the
+ * minimum, and greater values are handled as '[max-age seconds] + time(NULL)'.
+ * If "absolute" is TRUE, we return the clock format value itself, but if
+ * anything goes wrong when parsing the expected patterns, we still return 0.
+ * - FM
+ */
+time_t LYmktime(char *string,
+ int absolute)
+{
+#if USE_PARSDATE
+ time_t result = 0;
+
+ if (non_empty(string)) {
+ CTRACE((tfp, "LYmktime: Parsing '%s'\n", string));
+ if ((result = parsedate(string, 0)) == ((time_t) -1))
+ result = 0;
+
+ if (!absolute) {
+ time_t now = time((time_t *) NULL);
+
+ if (result < now)
+ result = 0;
+ }
+ if (result != 0) {
+ CTRACE((tfp, "LYmktime: clock=%" PRI_time_t ", ctime=%s",
+ CAST_time_t (result),
+ ctime(&result)));
+ }
+ }
+ return result;
+#else
+ char *s;
+ time_t clock2;
+ int day, month, year, hour, minutes, seconds;
+ char *start;
+ char temp[8];
+
+ /*
+ * Make sure we have a string to parse. - FM
+ */
+ if (!non_empty(string))
+ return (0);
+ s = string;
+ CTRACE((tfp, "LYmktime: Parsing '%s'\n", s));
+
+ /*
+ * Skip any lead alphabetic "Day, " field and seek a numeric day field. -
+ * FM
+ */
+ while (*s != '\0' && !isdigit(UCH(*s)))
+ s++;
+ if (*s == '\0')
+ return (0);
+
+ /*
+ * Get the numeric day and convert to an integer. - FM
+ */
+ start = s;
+ while (*s != '\0' && isdigit(UCH(*s)))
+ s++;
+ if (*s == '\0' || (s - start) > 2)
+ return (0);
+ LYStrNCpy(temp, start, (s - start));
+ day = atoi(temp);
+ if (day < 1 || day > 31)
+ return (0);
+
+ /*
+ * Get the month string and convert to an integer. - FM
+ */
+ while (*s != '\0' && !isalnum(UCH(*s)))
+ s++;
+ if (*s == '\0')
+ return (0);
+ start = s;
+ while (*s != '\0' && isalnum(UCH(*s)))
+ s++;
+ if ((*s == '\0') ||
+ (s - start) < (isdigit(UCH(*(s - 1))) ? 2 : 3) ||
+ (s - start) > (isdigit(UCH(*(s - 1))) ? 2 : 9))
+ return (0);
+ LYStrNCpy(temp, start, (isdigit(UCH(*(s - 1))) ? 2 : 3));
+ switch (TOUPPER(temp[0])) {
+ case '0':
+ case '1':
+ month = atoi(temp);
+ if (month < 1 || month > 12) {
+ return (0);
+ }
+ break;
+ case 'A':
+ if (!strcasecomp(temp, "Apr")) {
+ month = 4;
+ } else if (!strcasecomp(temp, "Aug")) {
+ month = 8;
+ } else {
+ return (0);
+ }
+ break;
+ case 'D':
+ if (!strcasecomp(temp, "Dec")) {
+ month = 12;
+ } else {
+ return (0);
+ }
+ break;
+ case 'F':
+ if (!strcasecomp(temp, "Feb")) {
+ month = 2;
+ } else {
+ return (0);
+ }
+ break;
+ case 'J':
+ if (!strcasecomp(temp, "Jan")) {
+ month = 1;
+ } else if (!strcasecomp(temp, "Jun")) {
+ month = 6;
+ } else if (!strcasecomp(temp, "Jul")) {
+ month = 7;
+ } else {
+ return (0);
+ }
+ break;
+ case 'M':
+ if (!strcasecomp(temp, "Mar")) {
+ month = 3;
+ } else if (!strcasecomp(temp, "May")) {
+ month = 5;
+ } else {
+ return (0);
+ }
+ break;
+ case 'N':
+ if (!strcasecomp(temp, "Nov")) {
+ month = 11;
+ } else {
+ return (0);
+ }
+ break;
+ case 'O':
+ if (!strcasecomp(temp, "Oct")) {
+ month = 10;
+ } else {
+ return (0);
+ }
+ break;
+ case 'S':
+ if (!strcasecomp(temp, "Sep")) {
+ month = 9;
+ } else {
+ return (0);
+ }
+ break;
+ default:
+ return (0);
+ }
+
+ /*
+ * Get the numeric year string and convert to an integer. - FM
+ */
+ while (*s != '\0' && !isdigit(UCH(*s)))
+ s++;
+ if (*s == '\0')
+ return (0);
+ start = s;
+ while (*s != '\0' && isdigit(UCH(*s)))
+ s++;
+ if ((s - start) == 4) {
+ LYStrNCpy(temp, start, 4);
+ } else if ((s - start) == 2) {
+ /*
+ * Assume that received 2-digit dates >= 70 are 19xx; others
+ * are 20xx. Only matters when dealing with broken software
+ * (HTTP server or web page) which is not Y2K compliant. The
+ * line is drawn on a best-guess basis; it is impossible for
+ * this to be completely accurate because it depends on what
+ * the broken sender software intends. (This totally breaks
+ * in 2100 -- setting up the next crisis...) - BL
+ */
+ if (atoi(start) >= 70)
+ LYStrNCpy(temp, "19", 2);
+ else
+ LYStrNCpy(temp, "20", 2);
+ strncat(temp, start, 2);
+ temp[4] = '\0';
+ } else {
+ return (0);
+ }
+ year = atoi(temp);
+
+ /*
+ * Get the numeric hour string and convert to an integer. - FM
+ */
+ while (*s != '\0' && !isdigit(UCH(*s)))
+ s++;
+ if (*s == '\0') {
+ hour = 0;
+ minutes = 0;
+ seconds = 0;
+ } else {
+ start = s;
+ while (*s != '\0' && isdigit(UCH(*s)))
+ s++;
+ if (*s != ':' || (s - start) > 2)
+ return (0);
+ LYStrNCpy(temp, start, (s - start));
+ hour = atoi(temp);
+
+ /*
+ * Get the numeric minutes string and convert to an integer. - FM
+ */
+ while (*s != '\0' && !isdigit(UCH(*s)))
+ s++;
+ if (*s == '\0')
+ return (0);
+ start = s;
+ while (*s != '\0' && isdigit(UCH(*s)))
+ s++;
+ if (*s != ':' || (s - start) > 2)
+ return (0);
+ LYStrNCpy(temp, start, (s - start));
+ minutes = atoi(temp);
+
+ /*
+ * Get the numeric seconds string and convert to an integer. - FM
+ */
+ while (*s != '\0' && !isdigit(UCH(*s)))
+ s++;
+ if (*s == '\0')
+ return (0);
+ start = s;
+ while (*s != '\0' && isdigit(UCH(*s)))
+ s++;
+ if (*s == '\0' || (s - start) > 2)
+ return (0);
+ LYStrNCpy(temp, start, (s - start));
+ seconds = atoi(temp);
+ }
+
+ /*
+ * Convert to clock format (seconds since 00:00:00 Jan 1 1970), but then
+ * zero it if it's in the past and "absolute" is not TRUE. - FM
+ */
+ month -= 3;
+ if (month < 0) {
+ month += 12;
+ year--;
+ }
+ day += (year - 1968) * 1461 / 4;
+ day += ((((month * 153) + 2) / 5) - 672);
+ clock2 = (time_t) ((day * 60 * 60 * 24) +
+ (hour * 60 * 60) +
+ (minutes * 60) +
+ seconds);
+ if (absolute == FALSE && (long) (time((time_t *) 0) - clock2) >= 0)
+ clock2 = (time_t) 0;
+ if (clock2 > 0)
+ CTRACE((tfp, "LYmktime: clock=%" PRI_time_t ", ctime=%s",
+ CAST_time_t (clock2),
+ ctime(&clock2)));
+
+ return (clock2);
+#endif
+}
+
+#ifdef TEST_DRIVER
+static void test_mktime(char *source)
+{
+ time_t before = LYmktime(source, TRUE);
+ time_t after = parsedate(source, 0);
+
+ printf("TEST %s\n", source);
+ printf("\t%" PRI_time_t " %s", CAST_time_t (before), ctime(&before));
+ printf("\t%" PRI_time_t " %s", CAST_time_t (after), ctime(&after));
+
+ if (before != after)
+ printf("\t****\n");
+}
+
+int main(void)
+{
+ test_mktime("Mon, 01-Jan-96 13:45:35 GMT");
+ test_mktime("Mon, 1 Jan 1996 13:45:35 GMT");
+ test_mktime("31-12-1999");
+ test_mktime("Wed May 14 22:00:00 2008");
+ test_mktime("Sun, 29-Jun-2008 23:19:30 GMT");
+ test_mktime("Sun Jul 06 07:00:00 2008 GMT");
+ test_mktime("Sun Jul 06 07:00:00 2018 GMT");
+ test_mktime("Sun Jul 06 07:00:00 2028 GMT");
+ test_mktime("Tue Jan 01 07:00:00 2036 GMT");
+ test_mktime("Thu Jan 01 07:00:00 2037 GMT");
+ /* problems with 32-bits */
+ test_mktime("Fri Jan 01 07:00:00 2038 GMT");
+ test_mktime("Sun Jul 06 07:00:00 2038 GMT");
+ test_mktime("Mon, 22-Aug-2039 15:13:56 GMT");
+ test_mktime("Sat, 28 Aug 2066 18:41:53 -0400");
+ test_mktime("Fri, 28 Aug 2099 18:41:53 -0400");
+ test_mktime("Sat, 28 Aug 2100 18:41:53 -0400");
+ test_mktime("Sun Jul 06 07:00:00 2138 GMT");
+ test_mktime("Sat, 28 Aug 2150 18:41:53 -0400");
+ test_mktime("Sat, 28 Aug 2200 18:41:53 -0400");
+ printf("DONE!\n");
+ return 0;
+}
+#endif
diff --git a/src/LYrcFile.c b/src/LYrcFile.c
new file mode 100644
index 0000000..b8cef37
--- /dev/null
+++ b/src/LYrcFile.c
@@ -0,0 +1,1140 @@
+/* $LynxId: LYrcFile.c,v 1.107 2022/04/02 00:12:18 Paul.G.Fox Exp $ */
+#include <HTUtils.h>
+#include <HTFTP.h>
+#include <LYUtils.h>
+#include <LYrcFile.h>
+#include <LYStrings.h>
+#include <LYGlobalDefs.h>
+#include <LYCharSets.h>
+#include <LYBookmark.h>
+#include <LYCookie.h>
+#include <LYKeymap.h>
+#include <HTMLDTD.h>
+
+#include <LYLeaks.h>
+
+#define MSG_ENABLE_LYNXRC N_("Normally disabled. See ENABLE_LYNXRC in lynx.cfg\n")
+#define putBool(value) ((value) ? "on" : "off")
+/* *INDENT-OFF* */
+static Config_Enum tbl_DTD_recovery[] = {
+ { "true", TRUE },
+ { "false", FALSE },
+ { "on", TRUE },
+ { "off", FALSE },
+ { "sortasgml", TRUE },
+ { "tagsoup", FALSE },
+ { NULL, -1 },
+};
+
+static Config_Enum tbl_HTTP_protocol[] = {
+ { "1.0", HTTP_1_0 },
+ { "1.1", HTTP_1_1 },
+ { NULL, -1 },
+};
+
+static Config_Enum tbl_bad_html[] = {
+ { "ignore", BAD_HTML_IGNORE },
+ { "trace", BAD_HTML_TRACE },
+ { "message", BAD_HTML_MESSAGE },
+ { "warn", BAD_HTML_WARN },
+ { NULL, -1 }
+};
+
+#ifdef DIRED_SUPPORT
+static Config_Enum tbl_dir_list_style[] = {
+ { "FILES_FIRST", FILES_FIRST },
+ { "DIRECTORIES_FIRST", DIRS_FIRST },
+ { "MIXED_STYLE", MIXED_STYLE },
+ { NULL, MIXED_STYLE },
+};
+#ifdef LONG_LIST
+static Config_Enum tbl_dir_list_order[] = {
+ { "ORDER_BY_NAME", ORDER_BY_NAME },
+ { "ORDER_BY_TYPE", ORDER_BY_TYPE },
+ { "ORDER_BY_SIZE", ORDER_BY_SIZE },
+ { "ORDER_BY_DATE", ORDER_BY_DATE },
+ { "ORDER_BY_MODE", ORDER_BY_MODE },
+#ifndef NO_GROUPS
+ { "ORDER_BY_USER", ORDER_BY_USER },
+ { "ORDER_BY_GROUP", ORDER_BY_GROUP },
+#endif
+ { NULL, ORDER_BY_NAME },
+};
+#endif /* LONG_LIST */
+#endif /* DIRED_SUPPORT */
+
+static Config_Enum tbl_file_sort[] = {
+ { "BY_FILENAME", FILE_BY_NAME },
+ { "BY_TYPE", FILE_BY_TYPE },
+ { "BY_SIZE", FILE_BY_SIZE },
+ { "BY_DATE", FILE_BY_DATE },
+ { NULL, -1 },
+};
+
+#ifdef USE_IDN2
+static Config_Enum tbl_idna_mode[] = {
+ { "IDNA2003", LYidna2003 },
+ { "IDNA2008", LYidna2008 },
+ { "TR46", LYidnaTR46 },
+ { "Compatible", LYidnaCompat },
+ { NULL, -1 },
+};
+#endif
+
+Config_Enum tbl_keypad_mode[] = {
+ { "FIELDS_ARE_NUMBERED", FIELDS_ARE_NUMBERED },
+ { "LINKS_AND_FIELDS_ARE_NUMBERED", LINKS_AND_FIELDS_ARE_NUMBERED },
+ { "LINKS_ARE_NUMBERED", LINKS_ARE_NUMBERED },
+ { "LINKS_ARE_NOT_NUMBERED", NUMBERS_AS_ARROWS },
+ /* obsolete variations: */
+ { "LINKS_AND_FORM_FIELDS_ARE_NUMBERED", LINKS_AND_FIELDS_ARE_NUMBERED },
+ { "NUMBERS_AS_ARROWS", NUMBERS_AS_ARROWS },
+ { NULL, DEFAULT_KEYPAD_MODE }
+};
+
+Config_Enum tbl_multi_bookmarks[] = {
+ { "OFF", MBM_OFF },
+ { "STANDARD", MBM_STANDARD },
+ { "ON", MBM_STANDARD },
+ { "ADVANCED", MBM_ADVANCED },
+ { NULL, -1 }
+};
+
+Config_Enum tbl_preferred_content[] = {
+ { STR_BINARY, contentBINARY },
+ { STR_PLAINTEXT, contentTEXT },
+ { STR_HTML, contentHTML },
+ { NULL, -1 }
+};
+
+/* the names in this table are used as lowercase in HTTP.c */
+Config_Enum tbl_preferred_encoding[] = {
+ { "none", encodingNONE },
+#if defined(USE_ZLIB) || defined(GZIP_PATH)
+ { "gzip", encodingGZIP },
+ { "deflate", encodingDEFLATE },
+#endif
+#if defined(USE_ZLIB) || defined(COMPRESS_PATH)
+ { "compress", encodingCOMPRESS },
+#endif
+#if defined(USE_BZLIB) || defined(BZIP2_PATH)
+ { "bzip2", encodingBZIP2 },
+#endif
+#if defined(USE_BROTLI) || defined(BROTLI_PATH)
+ { "br", encodingBROTLI },
+#endif
+ { "all", encodingALL },
+ { NULL, -1 }
+};
+
+Config_Enum tbl_preferred_media[] = {
+ { "INTERNAL", mediaOpt1 },
+ { "CONFIGFILE", mediaOpt2 },
+ { "USER", mediaOpt3 },
+ { "SYSTEM", mediaOpt4 },
+ { "ALL", mediaALL },
+ { NULL, -1 }
+};
+
+static Config_Enum tbl_show_colors[] = {
+ { "default", SHOW_COLOR_UNKNOWN },
+ { "default", SHOW_COLOR_OFF },
+ { "default", SHOW_COLOR_ON },
+ { "on", SHOW_COLOR_UNKNOWN },
+ { "off", SHOW_COLOR_UNKNOWN },
+ { "never", SHOW_COLOR_NEVER },
+ { "always", SHOW_COLOR_ALWAYS },
+ { NULL, SHOW_COLOR_UNKNOWN }
+};
+
+Config_Enum tbl_transfer_rate[] = {
+ { "NONE", rateOFF },
+ { "KB", rateKB },
+ { "TRUE", rateKB },
+ { "BYTES", rateBYTES },
+ { "FALSE", rateBYTES },
+#ifdef USE_READPROGRESS
+ { "KB,ETA", rateEtaKB },
+ { "BYTES,ETA", rateEtaBYTES },
+ { "KB2,ETA", rateEtaKB2 },
+ { "BYTES2,ETA", rateEtaBYTES2 },
+#endif
+#ifdef USE_PROGRESSBAR
+ { "METER", rateBAR },
+ { "FALSE", rateBAR },
+#endif
+ { NULL, -1 },
+};
+
+Config_Enum tbl_user_mode[] = {
+ { "MINIMAL", MINIMAL_MODE },
+ { "ADVANCED", ADVANCED_MODE },
+ { "INTERMEDIATE", INTERMEDIATE_MODE },
+ { "NOVICE", NOVICE_MODE },
+ { NULL, NOVICE_MODE }
+};
+
+static Config_Enum tbl_visited_links[] = {
+ { "FIRST_REVERSED", VISITED_LINKS_AS_FIRST_V | VISITED_LINKS_REVERSE },
+ { "FIRST", VISITED_LINKS_AS_FIRST_V },
+ { "TREE", VISITED_LINKS_AS_TREE },
+ { "LAST_REVERSED", VISITED_LINKS_AS_LATEST | VISITED_LINKS_REVERSE },
+ { "LAST", VISITED_LINKS_AS_LATEST },
+ { NULL, DEFAULT_VISITED_LINKS }
+};
+
+Config_Enum tbl_cookie_version[] = {
+ { "RFC-2109", COOKIES_RFC_2109 },
+ { "RFC-2965", COOKIES_RFC_2965 },
+ { "RFC-6265", COOKIES_RFC_6265 },
+ { NULL, -1 }
+};
+
+Config_Enum tbl_force_prompt[] = {
+ { "prompt", FORCE_PROMPT_DFT },
+ { "yes", FORCE_PROMPT_YES },
+ { "no", FORCE_PROMPT_NO },
+ { NULL, -1 }
+};
+/* *INDENT-ON* */
+
+static BOOL getBool(char *src)
+{
+ return (BOOL) (!strncasecomp(src, "on", 2) || !strncasecomp(src, "true", 4));
+}
+
+const char *LYputEnum(Config_Enum * table, int value)
+{
+ while (table->name != 0) {
+ if (table->value == value) {
+ return table->name;
+ }
+ table++;
+ }
+ return "?";
+}
+
+BOOL LYgetEnum(Config_Enum * table, const char *name,
+ int *result)
+{
+ Config_Enum *found = 0;
+ unsigned len = (unsigned) strlen(name);
+ int match = 0;
+
+ if (len != 0) {
+ while (table->name != 0) {
+ if (!strncasecomp(table->name, name, (int) len)) {
+ found = table;
+ if (!strcasecomp(table->name, name)) {
+ match = 1;
+ break;
+ }
+ ++match;
+ }
+ table++;
+ }
+ if (match == 1) { /* if unambiguous */
+ *result = found->value;
+ return TRUE;
+ }
+ }
+ CTRACE((tfp, "LYgetEnum: no match found for \"%s\"\n", name));
+ return FALSE; /* no match */
+}
+
+/* these are for data that are normally not read/written from .lynxrc */
+#define PARSE_SET(n,v,h) {n, 1, CONF_BOOL, UNION_SET(v), 0, 0, 0, h}
+#define PARSE_ARY(n,v,t,h) {n, 1, CONF_ARRAY, UNION_INT(v), t, 0, 0, h}
+#define PARSE_ENU(n,v,t,h) {n, 1, CONF_ENUM, UNION_INT(v), 0, t, 0, h}
+#define PARSE_LIS(n,v,h) {n, 1, CONF_LIS, UNION_STR(v), 0, 0, 0, h}
+#define PARSE_STR(n,v,h) {n, 1, CONF_STR, UNION_STR(v), 0, 0, 0, h}
+#define PARSE_FUN(n,v,w,h) {n, 1, CONF_FUN, UNION_FUN(v), 0, 0, w, h}
+#define PARSE_MBM(n,h) {n, 1, CONF_MBM, UNION_DEF(0), 0, 0, 0, h}
+
+/* these are for data that are optionally read/written from .lynxrc */
+#define MAYBE_SET(n,v,h) {n, 0, CONF_BOOL, UNION_SET(v), 0, 0, 0, h}
+#define MAYBE_ARY(n,v,t,h) {n, 0, CONF_ARRAY, UNION_INT(v), t, 0, 0, h}
+#define MAYBE_ENU(n,v,t,h) {n, 0, CONF_ENUM, UNION_INT(v), 0, t, 0, h}
+#define MAYBE_LIS(n,v,h) {n, 0, CONF_LIS, UNION_STR(v), 0, 0, 0, h}
+#define MAYBE_STR(n,v,h) {n, 0, CONF_STR, UNION_STR(v), 0, 0, 0, h}
+#define MAYBE_FUN(n,v,w,h) {n, 0, CONF_FUN, UNION_FUN(v), 0, 0, w, h}
+#define MAYBE_MBM(n,h) {n, 0, CONF_MBM, UNION_DEF(0), 0, 0, 0, h}
+
+#define PARSE_NIL {NULL, 1, CONF_NIL, UNION_DEF(0), 0, 0, 0, 0}
+
+typedef enum {
+ CONF_NIL = 0
+ ,CONF_ARRAY
+ ,CONF_BOOL
+ ,CONF_FUN
+ ,CONF_INT
+ ,CONF_ENUM
+ ,CONF_LIS
+ ,CONF_MBM
+ ,CONF_STR
+} Conf_Types;
+
+typedef struct config_type {
+ const char *name;
+ int enabled; /* see lynx.cfg ENABLE_LYNXRC "off" lines */
+ Conf_Types type;
+ ParseData;
+ const char **strings;
+ Config_Enum *table;
+ void (*write_it) (FILE *fp, struct config_type *);
+ const char *note;
+} Config_Type;
+
+static int get_assume_charset(char *value)
+{
+ int i;
+
+ for (i = 0; i < LYNumCharsets; ++i) {
+ if (!strcasecomp(value, LYCharSet_UC[i].MIMEname)) {
+ UCLYhndl_for_unspec = i;
+ break;
+ }
+ }
+ return 0;
+}
+
+static void put_assume_charset(FILE *fp, struct config_type *tbl)
+{
+ int i;
+
+ for (i = 0; i < LYNumCharsets; ++i)
+ fprintf(fp, "# %s\n", LYCharSet_UC[i].MIMEname);
+ fprintf(fp, "%s=%s\n\n", tbl->name, LYCharSet_UC[UCLYhndl_for_unspec].MIMEname);
+}
+
+static int get_display_charset(char *value)
+{
+ int i = 0;
+
+ i = UCGetLYhndl_byAnyName(value); /* by MIME or full name */
+ if (i >= 0)
+ current_char_set = i;
+ return 0;
+}
+
+static void put_display_charset(FILE *fp, struct config_type *tbl)
+{
+ int i;
+
+ for (i = 0; LYchar_set_names[i]; i++)
+ fprintf(fp, "# %s\n", LYchar_set_names[i]);
+ fprintf(fp, "%s=%s\n\n", tbl->name, LYchar_set_names[current_char_set]);
+}
+
+static int get_editor(char *value)
+{
+ if (!system_editor)
+ StrAllocCopy(editor, value);
+ return 0;
+}
+
+static void put_editor(FILE *fp, struct config_type *tbl)
+{
+ fprintf(fp, "%s=%s\n\n", tbl->name, NonNull(editor));
+}
+
+int get_http_protocol(char *value)
+{
+ int found = HTprotocolLevel;
+
+ if (LYgetEnum(tbl_HTTP_protocol, value, &found)
+ && HTprotocolLevel != found) {
+ HTprotocolLevel = found;
+ }
+ return 0;
+}
+
+static void put_http_protocol(FILE *fp, struct config_type *tbl)
+{
+ fprintf(fp, "%s=%s\n\n", tbl->name, LYputEnum(tbl_HTTP_protocol, HTprotocolLevel));
+}
+
+int get_tagsoup(char *value)
+{
+ int found = Old_DTD;
+
+ if (LYgetEnum(tbl_DTD_recovery, value, &found)
+ && Old_DTD != found) {
+ Old_DTD = found;
+ HTSwitchDTD(!Old_DTD);
+ }
+ return 0;
+}
+
+static void put_tagsoup(FILE *fp, struct config_type *tbl)
+{
+ fprintf(fp, "%s=%s\n\n", tbl->name, LYputEnum(tbl_DTD_recovery, Old_DTD));
+}
+
+/* This table is searched ignoring case */
+/* *INDENT-OFF* */
+static Config_Type Config_Table [] =
+{
+ PARSE_SET(RC_ACCEPT_ALL_COOKIES, LYAcceptAllCookies, N_("\
+accept_all_cookies allows the user to tell Lynx to automatically\n\
+accept all cookies if desired. The default is \"FALSE\" which will\n\
+prompt for each cookie. Set accept_all_cookies to \"TRUE\" to accept\n\
+all cookies.\n\
+")),
+ MAYBE_FUN(RC_ASSUME_CHARSET, get_assume_charset, put_assume_charset, MSG_ENABLE_LYNXRC),
+#ifndef DISABLE_FTP
+ PARSE_STR(RC_ANONFTP_PASSWORD, anonftp_password, N_("\
+anonftp_password allows the user to tell Lynx to use the personal\n\
+email address as the password for anonymous ftp. If no value is given,\n\
+Lynx will use the personal email address. Set anonftp_password\n\
+to a different value if you choose.\n\
+")),
+#endif
+ MAYBE_ENU(RC_BAD_HTML, cfg_bad_html, tbl_bad_html,
+ MSG_ENABLE_LYNXRC),
+ PARSE_STR(RC_BOOKMARK_FILE, bookmark_page, N_("\
+bookmark_file specifies the name and location of the default bookmark\n\
+file into which the user can paste links for easy access at a later\n\
+date.\n\
+")),
+ PARSE_SET(RC_CASE_SENSITIVE_SEARCHING, LYcase_sensitive, N_("\
+If case_sensitive_searching is \"on\" then when the user invokes a search\n\
+using the 's' or '/' keys, the search performed will be case sensitive\n\
+instead of case INsensitive. The default is usually \"off\".\n\
+")),
+ PARSE_FUN(RC_CHARACTER_SET, get_display_charset, put_display_charset, N_("\
+The character_set definition controls the representation of 8 bit\n\
+characters for your terminal. If 8 bit characters do not show up\n\
+correctly on your screen you may try changing to a different 8 bit\n\
+set or using the 7 bit character approximations.\n\
+Current valid characters sets are:\n\
+")),
+ MAYBE_SET(RC_COLLAPSE_BR_TAGS, LYCollapseBRs, MSG_ENABLE_LYNXRC),
+ PARSE_LIS(RC_COOKIE_ACCEPT_DOMAINS, LYCookieAcceptDomains, N_("\
+cookie_accept_domains and cookie_reject_domains are comma-delimited\n\
+lists of domains from which Lynx should automatically accept or reject\n\
+all cookies. If a domain is specified in both options, rejection will\n\
+take precedence. The accept_all_cookies parameter will override any\n\
+settings made here.\n\
+")),
+#ifdef USE_PERSISTENT_COOKIES
+ PARSE_STR(RC_COOKIE_FILE, LYCookieFile, N_("\
+cookie_file specifies the file from which to read persistent cookies.\n\
+The default is ~/" FNAME_LYNX_COOKIES ".\n\
+")),
+#endif
+ PARSE_STR(RC_COOKIE_LOOSE_INVALID_DOMAINS, LYCookieLooseCheckDomains, N_("\
+cookie_loose_invalid_domains, cookie_strict_invalid_domains, and\n\
+cookie_query_invalid_domains are comma-delimited lists of which domains\n\
+should be subjected to varying degrees of validity checking. If a\n\
+domain is set to strict checking, strict conformance to RFC2109 will\n\
+be applied. A domain with loose checking will be allowed to set cookies\n\
+with an invalid path or domain attribute. All domains will default to\n\
+querying the user for an invalid path or domain.\n\
+")),
+ PARSE_STR(RC_COOKIE_QUERY_INVALID_DOMAINS, LYCookieQueryCheckDomains, NULL),
+ PARSE_LIS(RC_COOKIE_REJECT_DOMAINS, LYCookieRejectDomains, NULL),
+ PARSE_STR(RC_COOKIE_STRICT_INVALID_DOMAIN, LYCookieStrictCheckDomains, NULL),
+#ifdef DIRED_SUPPORT
+#ifdef LONG_LIST
+ PARSE_ENU(RC_DIR_LIST_ORDER, dir_list_order, tbl_dir_list_order, N_("\
+dir_list_order specifies the directory list order under DIRED_SUPPORT\n\
+(if implemented). The default is \"ORDER_BY_NAME\"\n\
+")),
+#endif
+ PARSE_ENU(RC_DIR_LIST_STYLE, dir_list_style, tbl_dir_list_style, N_("\
+dir_list_styles specifies the directory list style under DIRED_SUPPORT\n\
+(if implemented). The default is \"MIXED_STYLE\", which sorts both\n\
+files and directories together. \"FILES_FIRST\" lists files first and\n\
+\"DIRECTORIES_FIRST\" lists directories first.\n\
+")),
+#endif
+ MAYBE_STR(RC_DISPLAY, x_display, MSG_ENABLE_LYNXRC),
+ PARSE_SET(RC_EMACS_KEYS, emacs_keys, N_("\
+If emacs_keys is to \"on\" then the normal EMACS movement keys:\n\
+ ^N = down ^P = up\n\
+ ^B = left ^F = right\n\
+will be enabled.\n\
+")),
+ PARSE_FUN(RC_FILE_EDITOR, get_editor, put_editor, N_("\
+file_editor specifies the editor to be invoked when editing local files\n\
+or sending mail. If no editor is specified, then file editing is disabled\n\
+unless it is activated from the command line, and the built-in line editor\n\
+will be used for sending mail.\n\
+")),
+#ifndef DISABLE_FTP
+ PARSE_ENU(RC_FILE_SORTING_METHOD, HTfileSortMethod, tbl_file_sort, N_("\
+The file_sorting_method specifies which value to sort on when viewing\n\
+file lists such as FTP directories. The options are:\n\
+ BY_FILENAME -- sorts on the name of the file\n\
+ BY_TYPE -- sorts on the type of the file\n\
+ BY_SIZE -- sorts on the size of the file\n\
+ BY_DATE -- sorts on the date of the file\n\
+")),
+#endif
+ MAYBE_ENU(RC_FORCE_COOKIE_PROMPT, cookie_noprompt, tbl_force_prompt,
+ MSG_ENABLE_LYNXRC),
+ MAYBE_ENU(RC_COOKIE_VERSION, cookie_version, tbl_cookie_version,
+ MSG_ENABLE_LYNXRC),
+#ifdef USE_SSL
+ MAYBE_ENU(RC_FORCE_SSL_PROMPT, ssl_noprompt, tbl_force_prompt,
+ MSG_ENABLE_LYNXRC),
+#endif
+#ifndef DISABLE_FTP
+ MAYBE_SET(RC_FTP_PASSIVE, ftp_passive, MSG_ENABLE_LYNXRC),
+#endif
+ MAYBE_SET(RC_HTML5_CHARSETS, html5_charsets, MSG_ENABLE_LYNXRC),
+ MAYBE_FUN(RC_HTTP_PROTOCOL, get_http_protocol, put_http_protocol,
+ MSG_ENABLE_LYNXRC),
+#ifdef USE_IDN2
+ MAYBE_ENU(RC_IDNA_MODE, LYidnaMode, tbl_idna_mode,
+ MSG_ENABLE_LYNXRC),
+#endif
+#ifdef EXP_KEYBOARD_LAYOUT
+ PARSE_ARY(RC_KBLAYOUT, current_layout, LYKbLayoutNames, NULL),
+#endif
+ PARSE_ENU(RC_KEYPAD_MODE, keypad_mode, tbl_keypad_mode, NULL),
+ PARSE_ARY(RC_LINEEDIT_MODE, current_lineedit, LYEditorNames, N_("\
+lineedit_mode specifies the key binding used for inputting strings in\n\
+prompts and forms. If lineedit_mode is set to \"Default Binding\" then\n\
+the following control characters are used for moving and deleting:\n\
+\n\
+ Prev Next Enter = Accept input\n\
+ Move char: <- -> ^G = Cancel input\n\
+ Move word: ^P ^N ^U = Erase line\n\
+ Delete char: ^H ^R ^A = Beginning of line\n\
+ Delete word: ^B ^F ^E = End of line\n\
+\n\
+Current lineedit modes are:\n\
+")),
+#ifdef USE_LOCALE_CHARSET
+ MAYBE_SET(RC_LOCALE_CHARSET, LYLocaleCharset, MSG_ENABLE_LYNXRC),
+#endif
+ MAYBE_SET(RC_MAKE_PSEUDO_ALTS_FOR_INLINES, pseudo_inline_alts, MSG_ENABLE_LYNXRC),
+ MAYBE_SET(RC_MAKE_LINKS_FOR_ALL_IMAGES, clickable_images, MSG_ENABLE_LYNXRC),
+ PARSE_MBM(RC_MULTI_BOOKMARK, N_("\
+The following allow you to define sub-bookmark files and descriptions.\n\
+The format is multi_bookmark<capital_letter>=<filename>,<description>\n\
+Up to 26 bookmark files (for the English capital letters) are allowed.\n\
+We start with \"multi_bookmarkB\" since 'A' is the default (see above).\n\
+")),
+ PARSE_STR(RC_PERSONAL_MAIL_ADDRESS, personal_mail_address, N_("\
+personal_mail_address specifies your personal mail address. The\n\
+address will be sent during HTTP file transfers for authorization and\n\
+logging purposes, and for mailed comments.\n\
+If you do not want this information given out, set the NO_FROM_HEADER\n\
+to TRUE in lynx.cfg, or use the -nofrom command line switch. You also\n\
+could leave this field blank, but then you won't have it included in\n\
+your mailed comments.\n\
+")),
+ PARSE_STR(RC_PERSONAL_MAIL_NAME, personal_mail_name, N_("\
+personal_mail_name specifies your personal name, for mail. The\n\
+name is sent for mailed comments. Lynx will prompt for this,\n\
+showing the configured value as a default when sending mail.\n\
+This is not necessarily the same as a name provided as part of the\n\
+personal_mail_address.\n\
+Lynx does not save your changes to that default value as a side-effect\n\
+of sending email. To update the default value, you must use the options\n\
+menu, or modify this file directly.\n\
+")),
+ PARSE_STR(RC_PREFERRED_CHARSET, pref_charset, N_("\
+preferred_charset specifies the character set in MIME notation (e.g.,\n\
+ISO-8859-2, ISO-8859-5) which Lynx will indicate you prefer in requests\n\
+to http servers using an Accept-Charset header. The value should NOT\n\
+include ISO-8859-1 or US-ASCII, since those values are always assumed\n\
+by default. May be a comma-separated list.\n\
+If a file in that character set is available, the server will send it.\n\
+If no Accept-Charset header is present, the default is that any\n\
+character set is acceptable. If an Accept-Charset header is present,\n\
+and if the server cannot send a response which is acceptable\n\
+according to the Accept-Charset header, then the server SHOULD send\n\
+an error response, though the sending of an unacceptable response\n\
+is also allowed.\n\
+")),
+ MAYBE_ENU(RC_PREFERRED_CONTENT_TYPE, LYContentType, tbl_preferred_content,
+ MSG_ENABLE_LYNXRC),
+ MAYBE_ENU(RC_PREFERRED_ENCODING, LYAcceptEncoding, tbl_preferred_encoding,
+ MSG_ENABLE_LYNXRC),
+ PARSE_STR(RC_PREFERRED_LANGUAGE, language, N_("\
+preferred_language specifies the language in MIME notation (e.g., en,\n\
+fr, may be a comma-separated list in decreasing preference)\n\
+which Lynx will indicate you prefer in requests to http servers.\n\
+If a file in that language is available, the server will send it.\n\
+Otherwise, the server will send the file in its default language.\n\
+")),
+ MAYBE_ENU(RC_PREFERRED_MEDIA_TYPES, LYAcceptMedia, tbl_preferred_media,
+ MSG_ENABLE_LYNXRC),
+ MAYBE_SET(RC_RAW_MODE, LYRawMode, MSG_ENABLE_LYNXRC),
+#if defined(ENABLE_OPTS_CHANGE_EXEC) && (defined(EXEC_LINKS) || defined(EXEC_SCRIPTS))
+ PARSE_SET(RC_RUN_ALL_EXECUTION_LINKS, local_exec, N_("\
+If run_all_execution_links is set \"on\" then all local execution links\n\
+will be executed when they are selected.\n\
+\n\
+WARNING - This is potentially VERY dangerous. Since you may view\n\
+ information that is written by unknown and untrusted sources\n\
+ there exists the possibility that Trojan horse links could be\n\
+ written. Trojan horse links could be written to erase files\n\
+ or compromise security. This should only be set to \"on\" if\n\
+ you are viewing trusted source information.\n\
+")),
+ PARSE_SET(RC_RUN_EXECUTION_LINKS_LOCAL, local_exec_on_local_files, N_("\
+If run_execution_links_on_local_files is set \"on\" then all local\n\
+execution links that are found in LOCAL files will be executed when they\n\
+are selected. This is different from run_all_execution_links in that\n\
+only files that reside on the local system will have execution link\n\
+permissions.\n\
+\n\
+WARNING - This is potentially dangerous. Since you may view\n\
+ information that is written by unknown and untrusted sources\n\
+ there exists the possibility that Trojan horse links could be\n\
+ written. Trojan horse links could be written to erase files\n\
+ or compromise security. This should only be set to \"on\" if\n\
+ you are viewing trusted source information.\n\
+")),
+#endif
+#ifdef USE_SCROLLBAR
+ MAYBE_SET(RC_SCROLLBAR, LYShowScrollbar, MSG_ENABLE_LYNXRC),
+#endif
+ PARSE_SET(RC_SELECT_POPUPS, LYSelectPopups, N_("\
+select_popups specifies whether the OPTIONs in a SELECT block which\n\
+lacks a MULTIPLE attribute are presented as a vertical list of radio\n\
+buttons or via a popup menu. Note that if the MULTIPLE attribute is\n\
+present in the SELECT start tag, Lynx always will create a vertical list\n\
+of checkboxes for the OPTIONs. A value of \"on\" will set popup menus\n\
+as the default while a value of \"off\" will set use of radio boxes.\n\
+The default can be overridden via the -popup command line toggle.\n\
+")),
+ MAYBE_SET(RC_SEND_USERAGENT, LYSendUserAgent, MSG_ENABLE_LYNXRC),
+ MAYBE_SET(RC_SET_COOKIES, LYSetCookies, MSG_ENABLE_LYNXRC),
+ PARSE_ENU(RC_SHOW_COLOR, LYrcShowColor, tbl_show_colors, N_("\
+show_color specifies how to set the color mode at startup. A value of\n\
+\"never\" will force color mode off (treat the terminal as monochrome)\n\
+at startup even if the terminal appears to be color capable. A value of\n\
+\"always\" will force color mode on even if the terminal appears to be\n\
+monochrome, if this is supported by the library used to build lynx.\n\
+A value of \"default\" will yield the behavior of assuming\n\
+a monochrome terminal unless color capability is inferred at startup\n\
+based on the terminal type, or the -color command line switch is used, or\n\
+the COLORTERM environment variable is set. The default behavior always is\n\
+used in anonymous accounts or if the \"option_save\" restriction is set.\n\
+The effect of the saved value can be overridden via\n\
+the -color and -nocolor command line switches.\n\
+The mode set at startup can be changed via the \"show color\" option in\n\
+the 'o'ptions menu. If the option settings are saved, the \"on\" and\n\
+\"off\" \"show color\" settings will be treated as \"default\".\n\
+")),
+ PARSE_SET(RC_SHOW_CURSOR, LYShowCursor, N_("\
+show_cursor specifies whether to 'hide' the cursor to the right (and\n\
+bottom, if possible) of the screen, or to place it to the left of the\n\
+current link in documents, or current option in select popup windows.\n\
+Positioning the cursor to the left of the current link or option is\n\
+helpful for speech or braille interfaces, and when the terminal is\n\
+one which does not distinguish the current link based on highlighting\n\
+or color. A value of \"on\" will set positioning to the left as the\n\
+default while a value of \"off\" will set 'hiding' of the cursor.\n\
+The default can be overridden via the -show_cursor command line toggle.\n\
+")),
+ PARSE_SET(RC_SHOW_DOTFILES, show_dotfiles, N_("\
+show_dotfiles specifies that the directory listing should include\n\
+\"hidden\" (dot) files/directories. If set \"on\", this will be\n\
+honored only if enabled via userdefs.h and/or lynx.cfg, and not\n\
+restricted via a command line switch. If display of hidden files\n\
+is disabled, creation of such files via Lynx also is disabled.\n\
+")),
+#ifdef USE_READPROGRESS
+ MAYBE_ENU(RC_SHOW_KB_RATE, LYTransferRate, tbl_transfer_rate,
+ MSG_ENABLE_LYNXRC),
+#endif
+ PARSE_ENU(RC_SUB_BOOKMARKS, LYMultiBookmarks, tbl_multi_bookmarks, N_("\
+If sub_bookmarks is not turned \"off\", and multiple bookmarks have\n\
+been defined (see below), then all bookmark operations will first\n\
+prompt the user to select an active sub-bookmark file. If the default\n\
+Lynx bookmark_file is defined (see above), it will be used as the\n\
+default selection. When this option is set to \"advanced\", and the\n\
+user mode is advanced, the 'v'iew bookmark command will invoke a\n\
+statusline prompt instead of the menu seen in novice and intermediate\n\
+user modes. When this option is set to \"standard\", the menu will be\n\
+presented regardless of user mode.\n\
+")),
+ MAYBE_FUN(RC_TAGSOUP, get_tagsoup, put_tagsoup,
+ MSG_ENABLE_LYNXRC),
+ MAYBE_SET(RC_TRIM_BLANK_LINES, LYtrimBlankLines, MSG_ENABLE_LYNXRC),
+ MAYBE_SET(RC_UNDERLINE_LINKS, LYUnderlineLinks, MSG_ENABLE_LYNXRC),
+ PARSE_ENU(RC_USER_MODE, user_mode, tbl_user_mode, N_("\
+user_mode specifies the users level of knowledge with Lynx. The\n\
+default is \"NOVICE\" which displays two extra lines of help at the\n\
+bottom of the screen to aid the user in learning the basic Lynx\n\
+commands. Set user_mode to \"INTERMEDIATE\" to turn off the extra info.\n\
+Use \"ADVANCED\" to see the URL of the currently selected link at the\n\
+bottom of the screen.\n\
+")),
+ MAYBE_STR(RC_USERAGENT, LYUserAgent, MSG_ENABLE_LYNXRC),
+ PARSE_SET(RC_VERBOSE_IMAGES, verbose_img, N_("\
+If verbose_images is \"on\", lynx will print the name of the image\n\
+source file in place of [INLINE], [LINK] or [IMAGE]\n\
+See also VERBOSE_IMAGES in lynx.cfg\n\
+")),
+ PARSE_SET(RC_VI_KEYS, vi_keys, N_("\
+If vi_keys is set to \"on\", then the normal VI movement keys:\n\
+ j = down k = up\n\
+ h = left l = right\n\
+will be enabled. These keys are only lower case.\n\
+Capital 'H', 'J' and 'K will still activate help, jump shortcuts,\n\
+and the keymap display, respectively.\n\
+")),
+ PARSE_ENU(RC_VISITED_LINKS, Visited_Links_As, tbl_visited_links, N_("\
+The visited_links setting controls how Lynx organizes the information\n\
+in the Visited Links Page.\n\
+")),
+#ifdef USE_SESSIONS
+ MAYBE_SET(RC_AUTO_SESSION, LYAutoSession, MSG_ENABLE_LYNXRC),
+ MAYBE_STR(RC_SESSION_FILE, LYSessionFile, MSG_ENABLE_LYNXRC),
+#endif
+ MAYBE_SET(RC_NO_PAUSE, no_pause, MSG_ENABLE_LYNXRC),
+
+ PARSE_NIL
+};
+/* *INDENT-ON* */
+
+static Config_Type *lookup_config(const char *name)
+{
+ Config_Type *tbl = Config_Table;
+ char ch = (char) TOUPPER(*name);
+
+ while (tbl->name != 0) {
+ if (tbl->enabled) {
+ char ch1 = tbl->name[0];
+
+ if ((ch == TOUPPER(ch1))
+ && (0 == strcasecomp(name, tbl->name)))
+ break;
+ }
+
+ tbl++;
+ }
+ return tbl;
+}
+
+BOOL LYsetRcValue(const char *name, const char *param)
+{
+ char MBM_line[256];
+ char *notes;
+ int n;
+ Config_Type *tbl;
+ ParseUnionPtr q;
+ BOOL changed = TRUE;
+ char *value = NULL;
+ char *orig_value = NULL;
+
+ if (param == NULL)
+ param = "";
+ StrAllocCopy(value, param);
+ orig_value = value;
+ value = LYSkipBlanks(value);
+ CTRACE2(TRACE_CFG, (tfp, "LYrcFile %s:%s\n", name, value));
+
+ tbl = lookup_config(name);
+ if (tbl->name == 0) {
+ const char *special = RC_MULTI_BOOKMARK;
+
+ if (!strncasecomp(name, special, (int) strlen(special))) {
+ tbl = lookup_config(special);
+ }
+ /*
+ * lynx ignores unknown keywords.
+ * This includes known keywords where there is no ENABLE_LYNXRC.
+ */
+ if (tbl->name == 0) {
+ CTRACE((tfp, "LYrcFile: ignored %s=%s\n", name, value));
+ FREE(orig_value);
+ return FALSE;
+ }
+ }
+
+ q = ParseUnionOf(tbl);
+ switch (tbl->type) {
+ case CONF_BOOL:
+ if (q->set_value != 0)
+ *(q->set_value) = getBool(value);
+ break;
+
+ case CONF_FUN:
+ if (q->fun_value != 0)
+ (*(q->fun_value)) (value);
+ break;
+
+ case CONF_ARRAY:
+ for (n = 0; tbl->strings[n] != 0; ++n) {
+ if (!strcasecomp(value, tbl->strings[n])) {
+ *(q->int_value) = n;
+ break;
+ }
+ }
+ break;
+
+ case CONF_ENUM:
+ if (tbl->table != 0)
+ LYgetEnum(tbl->table, value, q->int_value);
+ break;
+
+ case CONF_INT:
+ if (q->int_value != 0) {
+ int ival;
+
+ if (1 == sscanf(value, "%d", &ival))
+ *(q->int_value) = ival;
+ }
+ break;
+
+ case CONF_LIS:
+ if (q->str_value != 0) {
+ if (*(q->str_value) != NULL)
+ StrAllocCat(*(q->str_value), ",");
+ StrAllocCat(*(q->str_value), value);
+ }
+ break;
+
+ case CONF_MBM:
+ for (n = 1; n <= MBM_V_MAXFILES; n++) {
+ sprintf(MBM_line, "multi_bookmark%c", UCH(LYindex2MBM(n)));
+
+ if (!strcasecomp(name, MBM_line)) {
+ if ((notes = StrChr(value, ',')) != 0) {
+ *notes++ = '\0';
+ LYTrimTrailing(value);
+ notes = LYSkipBlanks(notes);
+ } else {
+ notes = value + strlen(value);
+ }
+ StrAllocCopy(MBM_A_subbookmark[n], value);
+ StrAllocCopy(MBM_A_subdescript[n], notes);
+ break;
+ }
+ }
+ break;
+
+ case CONF_STR:
+ if (q->str_value != 0)
+ StrAllocCopy(*(q->str_value), value);
+ break;
+
+ default:
+ changed = FALSE;
+ break;
+ }
+ FREE(orig_value);
+
+ return changed;
+}
+
+/* Read and process user options. If the passed-in fp is NULL, open the
+ * regular user defaults file for reading, otherwise use fp which has to be a
+ * file open for reading. - kw
+ */
+void read_rc(FILE *fp)
+{
+ char *buffer = NULL;
+ char rcfile[LY_MAXPATH];
+
+ if (!fp) {
+ /*
+ * Make an RC file name, open it for reading.
+ */
+ LYAddPathToHome(rcfile, sizeof(rcfile), FNAME_LYNXRC);
+ if ((fp = fopen(rcfile, TXT_R)) == NULL) {
+ return;
+ }
+ CTRACE((tfp, "read_rc opened %s\n", rcfile));
+ } else {
+ CTRACE((tfp, "read_rc used passed-in stream\n"));
+ }
+
+ /*
+ * Process the entries.
+ */
+ while (LYSafeGets(&buffer, fp) != NULL) {
+ char *name, *value;
+
+ /* Most lines in the config file are comment lines. Weed them out
+ * now. Also, leading whitespace is ok, so trim it.
+ */
+ LYTrimTrailing(buffer);
+ name = LYSkipBlanks(buffer);
+ if (ispunct(UCH(*name)) || *name == '\0')
+ continue;
+
+ /*
+ * Parse the "name=value" strings.
+ */
+ if ((value = StrChr(name, '=')) == 0) {
+ CTRACE((tfp, "LYrcFile: missing '=' %s\n", name));
+ continue;
+ }
+ *value++ = '\0';
+ LYTrimTrailing(name);
+ LYsetRcValue(name, value);
+ }
+
+ LYCloseInput(fp);
+ LYConfigCookies(); /* update cookie settings, if any */
+
+#if defined(USE_SLANG) || defined(COLOR_CURSES)
+ /*
+ * We may override the commandline "-color" option with the .lynxrc file
+ */
+ switch (LYrcShowColor) {
+ case SHOW_COLOR_ALWAYS:
+ if (LYShowColor != SHOW_COLOR_NEVER)
+ LYShowColor = SHOW_COLOR_ALWAYS;
+ break;
+ case SHOW_COLOR_NEVER:
+ if (LYShowColor == SHOW_COLOR_ON)
+ LYShowColor = SHOW_COLOR_OFF;
+ break;
+ default:
+ /* don't override */
+ break;
+ }
+#endif
+ set_default_bookmark_page(bookmark_page);
+}
+
+/*
+ * Write a set of comments. Doing it this way avoids preprocessor problems
+ * with the leading '#', makes it simpler to use gettext.
+ */
+static void write_list(FILE *fp, const char *list)
+{
+ int first = TRUE;
+
+ while (*list != 0) {
+ int ch = *list++;
+
+ if (first) {
+ fputs("# ", fp);
+ first = FALSE;
+ }
+ if (ch == '\n') {
+ first = TRUE;
+ }
+ fputc(ch, fp);
+ }
+}
+
+/*
+ * This is too long for some compilers.
+ */
+static void explain_keypad_mode(FILE *fp)
+{
+ write_list(fp, gettext("\
+If keypad_mode is set to \"NUMBERS_AS_ARROWS\", then the numbers on\n\
+your keypad when the numlock is on will act as arrow keys:\n\
+ 8 = Up Arrow\n\
+ 4 = Left Arrow 6 = Right Arrow\n\
+ 2 = Down Arrow\n\
+and the corresponding keyboard numbers will act as arrow keys,\n\
+regardless of whether numlock is on.\n\
+"));
+ write_list(fp, gettext("\
+If keypad_mode is set to \"LINKS_ARE_NUMBERED\", then numbers will\n\
+appear next to each link and numbers are used to select links.\n\
+"));
+ write_list(fp, gettext("\
+If keypad_mode is set to \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\", then\n\
+numbers will appear next to each link and visible form input field.\n\
+Numbers are used to select links, or to move the \"current link\" to a\n\
+form input field or button. In addition, options in popup menus are\n\
+indexed so that the user may type an option number to select an option in\n\
+a popup menu, even if the option isn't visible on the screen. Reference\n\
+lists and output from the list command also enumerate form inputs.\n\
+"));
+ write_list(fp, gettext("\
+NOTE: Some fixed format documents may look disfigured when\n\
+\"LINKS_ARE_NUMBERED\" or \"LINKS_AND_FORM_FIELDS_ARE_NUMBERED\" are\n\
+enabled.\n\
+"));
+}
+
+/* Save user options. If the passed-in fp is NULL, open the regular user
+ * defaults file for writing, otherwise use fp which has to be a temp file open
+ * for writing. - kw
+ */
+int save_rc(FILE *fp)
+{
+ Config_Type *tbl = Config_Table;
+ char rcfile[LY_MAXPATH];
+ BOOLEAN is_tempfile = (BOOL) (fp != NULL);
+ int n;
+
+ if (!fp) {
+ /*
+ * Make a name.
+ */
+ LYAddPathToHome(rcfile, sizeof(rcfile), FNAME_LYNXRC);
+
+ /*
+ * Open the file for write.
+ */
+ if ((fp = LYNewTxtFile(rcfile)) == NULL) {
+ return FALSE;
+ }
+ }
+
+ write_list(fp, gettext("\
+Lynx User Defaults File\n\
+\n\
+"));
+
+ /*
+ * We have either the HTML options form, or the older menu, or both.
+ */
+#ifndef NO_OPTION_FORMS
+ write_list(fp, gettext("\
+This file contains options saved from the Lynx Options Screen (normally\n\
+with the 'o' key). To save options with that screen, you must select the\n\
+checkbox:\n\
+"));
+ fprintf(fp, "#\t%s\n", SAVE_OPTIONS);
+ fprintf(fp, "#\n");
+ write_list(fp, gettext("\
+You must then save the settings using the link on the line above the\n\
+checkbox:\n\
+"));
+ fprintf(fp, "#\t%s\n", ACCEPT_CHANGES);
+ fprintf(fp, "#\n");
+#ifndef NO_OPTION_MENU
+ write_list(fp, gettext("\
+You may also use the command-line option \"-forms_options\", which displays\n\
+the simpler Options Menu instead. Save options with that using the '>' key.\n\
+\n\
+"));
+#endif
+#else /* we only have old options-menu */
+ write_list(fp, gettext("\
+This file contains options saved from the Lynx Options Screen (normally\n\
+with the '>' key).\n\
+\n\
+"));
+#endif
+
+ write_list(fp, gettext("\
+There is normally no need to edit this file manually, since the defaults\n\
+here can be controlled from the Options Screen, and the next time options\n\
+are saved from the Options Screen this file will be completely rewritten.\n\
+You have been warned...\n\
+\n\
+If you are looking for the general configuration file - it is normally\n\
+called \"lynx.cfg\". It has different content and a different format.\n\
+It is not this file.\n\
+"));
+ fprintf(fp, "\n");
+
+ while (tbl->name != 0) {
+ ParseUnionPtr q = ParseUnionOf(tbl);
+
+ if (!tbl->enabled) {
+ tbl++;
+ continue;
+ }
+ if (tbl->note != NULL) {
+ write_list(fp, gettext(tbl->note));
+ } else if (tbl->table == tbl_keypad_mode) {
+ explain_keypad_mode(fp);
+ }
+
+ switch (tbl->type) {
+ case CONF_BOOL:
+ fprintf(fp, "%s=%s\n\n", tbl->name, putBool(*(q->set_value)));
+ break;
+
+ case CONF_FUN:
+ if (tbl->write_it != 0)
+ tbl->write_it(fp, tbl);
+ break;
+
+ case CONF_ARRAY:
+ for (n = 0; tbl->strings[n] != 0; ++n)
+ fprintf(fp, "# %s\n", tbl->strings[n]);
+ fprintf(fp, "%s=%s\n\n", tbl->name,
+ tbl->strings[*(q->int_value)]);
+ break;
+
+ case CONF_ENUM:
+ fprintf(fp, "%s=%s\n\n", tbl->name,
+ LYputEnum(tbl->table, *(q->int_value)));
+ break;
+
+ case CONF_INT:
+ fprintf(fp, "%s=%d\n\n", tbl->name, *(q->int_value));
+ break;
+
+ case CONF_MBM:
+ for (n = 1; n <= MBM_V_MAXFILES; n++) {
+ fprintf(fp, "multi_bookmark%c=", UCH(LYindex2MBM(n)));
+
+ fprintf(fp, "%s", NonNull(MBM_A_subbookmark[n]));
+ if (MBM_A_subdescript[n] != 0
+ && *MBM_A_subdescript[n] != 0)
+ fprintf(fp, ",%s", MBM_A_subdescript[n]);
+ fprintf(fp, "\n");
+ }
+ fprintf(fp, "\n");
+ break;
+
+ case CONF_LIS:
+ /* FALLTHRU */
+ case CONF_STR:
+ fprintf(fp, "%s=%s\n\n", tbl->name,
+ (q->str_value != 0 && *(q->str_value) != 0)
+ ? *(q->str_value)
+ : "");
+ break;
+
+ case CONF_NIL:
+ break;
+ }
+ tbl++;
+ }
+
+ /*
+ * Close the RC file.
+ */
+ if (is_tempfile) {
+ LYCloseTempFP(fp);
+ } else {
+ LYCloseOutput(fp);
+ HTSYS_purge(rcfile);
+ }
+
+ return TRUE;
+}
+
+/*
+ * Returns true if the given name would be saved in .lynxrc
+ */
+BOOL will_save_rc(const char *name)
+{
+ Config_Type *tbl = lookup_config(name);
+
+ return (BOOL) (tbl->name != 0);
+}
+
+int enable_lynxrc(char *value)
+{
+ Config_Type *tbl;
+ char *colon = StrChr(value, ':');
+
+ if (colon != 0) {
+ *colon++ = 0;
+ LYTrimLeading(value);
+ LYTrimTrailing(value);
+
+ for (tbl = Config_Table; tbl->name != 0; tbl++) {
+ if (!strcasecomp(value, tbl->name)) {
+ tbl->enabled = getBool(colon);
+ break;
+ }
+ }
+ }
+ return 0;
+}
diff --git a/src/LYrcFile.h b/src/LYrcFile.h
new file mode 100644
index 0000000..1285a21
--- /dev/null
+++ b/src/LYrcFile.h
@@ -0,0 +1,318 @@
+/*
+ * $LynxId: LYrcFile.h,v 1.59 2021/07/29 22:53:37 tom Exp $
+ */
+#ifndef LYRCFILE_H
+#define LYRCFILE_H
+
+#ifndef LYSTRUCTS_H
+#include <LYStructs.h>
+#endif /* LYSTRUCTS_H */
+
+/* configuration-variable names to share with LYReadCFG.c and LYOptions.c */
+#define RC_ACCEPT_ALL_COOKIES "accept_all_cookies"
+#define RC_ALERTSECS "alertsecs"
+#define RC_ALT_BLAT_MAIL "alt_blat_mail"
+#define RC_ALWAYS_RESUBMIT_POSTS "always_resubmit_posts"
+#define RC_ALWAYS_TRUSTED_EXEC "always_trusted_exec"
+#define RC_ANONFTP_PASSWORD "anonftp_password"
+#define RC_ASSUMED_COLOR "assumed_color"
+#define RC_ASSUMED_DOC_CHARSET_CHOICE "assumed_doc_charset_choice"
+#define RC_ASSUME_CHARSET "assume_charset"
+#define RC_ASSUME_LOCAL_CHARSET "assume_local_charset"
+#define RC_ASSUME_UNREC_CHARSET "assume_unrec_charset"
+#define RC_AUTO_SESSION "auto_session"
+#define RC_AUTO_UNCACHE_DIRLISTS "auto_uncache_dirlists"
+#define RC_BAD_HTML "bad_html"
+#define RC_BIBP_BIBHOST "bibp_bibhost"
+#define RC_BIBP_GLOBALSERVER "bibp_globalserver"
+#define RC_BLAT_MAIL "blat_mail"
+#define RC_BLOCK_MULTI_BOOKMARKS "block_multi_bookmarks"
+#define RC_BOLD_H1 "bold_h1"
+#define RC_BOLD_HEADERS "bold_headers"
+#define RC_BOLD_NAME_ANCHORS "bold_name_anchors"
+#define RC_BOOKMARK_FILE "bookmark_file"
+#define RC_BROKEN_FTP_EPSV "broken_ftp_epsv"
+#define RC_BROKEN_FTP_RETR "broken_ftp_retr"
+#define RC_BROTLI_PATH "brotli_path"
+#define RC_BZIP2_PATH "bzip2_path"
+#define RC_CASE_SENSITIVE_ALWAYS_ON "case_sensitive_always_on"
+#define RC_CASE_SENSITIVE_SEARCHING "case_sensitive_searching"
+#define RC_CHARACTER_SET "character_set"
+#define RC_CHARSETS_DIRECTORY "charsets_directory"
+#define RC_CHARSET_SWITCH_RULES "charset_switch_rules"
+#define RC_CHECKMAIL "checkmail"
+#define RC_CHMOD_PATH "chmod_path"
+#define RC_COLLAPSE_BR_TAGS "collapse_br_tags"
+#define RC_COLOR "color"
+#define RC_COLOR_STYLE "color_style"
+#define RC_COMPRESS_PATH "compress_path"
+#define RC_CONNECT_TIMEOUT "connect_timeout"
+#define RC_CONV_JISX0201KANA "conv_jisx0201kana"
+#define RC_COOKIE_ACCEPT_DOMAINS "cookie_accept_domains"
+#define RC_COOKIE_FILE "cookie_file"
+#define RC_COOKIE_LOOSE_INVALID_DOMAINS "cookie_loose_invalid_domains"
+#define RC_COOKIE_QUERY_INVALID_DOMAINS "cookie_query_invalid_domains"
+#define RC_COOKIE_REJECT_DOMAINS "cookie_reject_domains"
+#define RC_COOKIE_SAVE_FILE "cookie_save_file"
+#define RC_COOKIE_STRICT_INVALID_DOMAIN "cookie_strict_invalid_domains"
+#define RC_COOKIE_VERSION "cookie_version"
+#define RC_COPY_PATH "copy_path"
+#define RC_CSO_PROXY "cso_proxy"
+#define RC_CSWING_PATH "cswing_path"
+#define RC_DEFAULT_BOOKMARK_FILE "default_bookmark_file"
+#define RC_DEFAULT_CACHE_SIZE "default_cache_size"
+#define RC_DEFAULT_COLORS "default_colors"
+#define RC_DEFAULT_EDITOR "default_editor"
+#define RC_DEFAULT_INDEX_FILE "default_index_file"
+#define RC_DEFAULT_KEYPAD_MODE "default_keypad_mode"
+#define RC_DEFAULT_KEYPAD_MODE_NUMARO "default_keypad_mode_is_numbers_as_arrows"
+#define RC_DEFAULT_USER_MODE "default_user_mode"
+#define RC_DEFAULT_VIRTUAL_MEMORY_SIZE "default_virtual_memory_size"
+#define RC_DELAYSECS "delaysecs"
+#define RC_DIRED_MENU "dired_menu"
+#define RC_DIR_LIST_ORDER "dir_list_order"
+#define RC_DIR_LIST_STYLE "dir_list_style"
+#define RC_DISPLAY "display"
+#define RC_DISPLAY_CHARSET_CHOICE "display_charset_choice"
+#define RC_DONT_WRAP_PRE "dont_wrap_pre"
+#define RC_DOWNLOADER "downloader"
+#define RC_EMACS_KEYS "emacs_keys"
+#define RC_EMACS_KEYS_ALWAYS_ON "emacs_keys_always_on"
+#define RC_ENABLE_LYNXRC "enable_lynxrc"
+#define RC_ENABLE_SCROLLBACK "enable_scrollback"
+#define RC_EXTERNAL "external"
+#define RC_EXTERNAL_MENU "external_menu"
+#define RC_FILE_EDITOR "file_editor"
+#define RC_FILE_SORTING_METHOD "file_sorting_method"
+#define RC_FINGER_PROXY "finger_proxy"
+#define RC_FOCUS_WINDOW "focus_window"
+#define RC_FORCE_8BIT_TOUPPER "force_8bit_toupper"
+#define RC_FORCE_COOKIE_PROMPT "force_cookie_prompt"
+#define RC_FORCE_EMPTY_HREFLESS_A "force_empty_hrefless_a"
+#define RC_FORCE_HTML "force_html"
+#define RC_FORCE_SSL_COOKIES_SECURE "force_ssl_cookies_secure"
+#define RC_FORCE_SSL_PROMPT "force_ssl_prompt"
+#define RC_FORMS_OPTIONS "forms_options"
+#define RC_FTP_FORMAT "ftp_format"
+#define RC_FTP_PASSIVE "ftp_passive"
+#define RC_FTP_PROXY "ftp_proxy"
+#define RC_GLOBAL_EXTENSION_MAP "global_extension_map"
+#define RC_GLOBAL_MAILCAP "global_mailcap"
+#define RC_GOPHER_PROXY "gopher_proxy"
+#define RC_GOTOBUFFER "gotobuffer"
+#define RC_GUESS_SCHEME "guess_scheme"
+#define RC_GZIP_PATH "gzip_path"
+#define RC_HELPFILE "helpfile"
+#define RC_HIDDENLINKS "hiddenlinks"
+#define RC_HIDDEN_LINK_MARKER "hidden_link_marker"
+#define RC_HISTORICAL_COMMENTS "historical_comments"
+#define RC_HTML5_CHARSETS "html5_charsets"
+#define RC_HTMLSRC_ATTRNAME_XFORM "htmlsrc_attrname_xform"
+#define RC_HTMLSRC_TAGNAME_XFORM "htmlsrc_tagname_xform"
+#define RC_HTTPS_PROXY "https_proxy"
+#define RC_HTTP_PROTOCOL "http_protocol"
+#define RC_HTTP_PROXY "http_proxy"
+#define RC_IDNA_MODE "idna_mode"
+#define RC_INCLUDE "include"
+#define RC_INFLATE_PATH "inflate_path"
+#define RC_INFOSECS "infosecs"
+#define RC_INSTALL_PATH "install_path"
+#define RC_JUMPBUFFER "jumpbuffer"
+#define RC_JUMPFILE "jumpfile"
+#define RC_JUMP_PROMPT "jump_prompt"
+#define RC_JUSTIFY "justify"
+#define RC_JUSTIFY_MAX_VOID_PERCENT "justify_max_void_percent"
+#define RC_KBLAYOUT "kblayout"
+#define RC_KEYBOARD_LAYOUT "keyboard_layout"
+#define RC_KEYMAP "keymap"
+#define RC_KEYPAD_MODE "keypad_mode"
+#define RC_LEFTARROW_IN_TEXTFLD_PROMPT "leftarrow_in_textfield_prompt"
+#define RC_LINEEDIT_MODE "lineedit_mode"
+#define RC_LISTONLY "listonly"
+#define RC_LIST_DECODED "list_decoded"
+#define RC_LIST_FORMAT "list_format"
+#define RC_LIST_INLINE "list_inline"
+#define RC_LIST_NEWS_DATES "list_news_dates"
+#define RC_LIST_NEWS_NUMBERS "list_news_numbers"
+#define RC_LOCALE_CHARSET "locale_charset"
+#define RC_LOCALHOST "localhost"
+#define RC_LOCALHOST_ALIAS "localhost_alias"
+#define RC_LOCAL_DOMAIN "local_domain"
+#define RC_LOCAL_EXECUTION_LINKS_ALWAYS "local_execution_links_always_on"
+#define RC_LOCAL_EXECUTION_LINKS_LOCAL "local_execution_links_on_but_not_remote"
+#define RC_LYNXCGI_DOCUMENT_ROOT "lynxcgi_document_root"
+#define RC_LYNXCGI_ENVIRONMENT "lynxcgi_environment"
+#define RC_LYNX_HOST_NAME "lynx_host_name"
+#define RC_LYNX_SIG_FILE "lynx_sig_file"
+#define RC_MAIL_ADRS "mail_adrs"
+#define RC_MAIL_SYSTEM_ERROR_LOGGING "mail_system_error_logging"
+#define RC_MAKE_LINKS_FOR_ALL_IMAGES "make_links_for_all_images"
+#define RC_MAKE_PSEUDO_ALTS_FOR_INLINES "make_pseudo_alts_for_inlines"
+#define RC_MAX_COOKIES_BUFFER "max_cookies_buffer"
+#define RC_MAX_COOKIES_DOMAIN "max_cookies_domain"
+#define RC_MAX_COOKIES_GLOBAL "max_cookies_global"
+#define RC_MAX_URI_SIZE "max_uri_size"
+#define RC_MESSAGESECS "messagesecs"
+#define RC_MESSAGE_LANGUAGE "message_language"
+#define RC_MINIMAL_COMMENTS "minimal_comments"
+#define RC_MKDIR_PATH "mkdir_path"
+#define RC_MULTI_BOOKMARK "multi_bookmark"
+#define RC_MULTI_BOOKMARK_SUPPORT "multi_bookmark_support"
+#define RC_MV_PATH "mv_path"
+#define RC_NCR_IN_BOOKMARKS "ncr_in_bookmarks"
+#define RC_NESTED_TABLES "nested_tables"
+#define RC_NEWSPOST_PROXY "newspost_proxy"
+#define RC_NEWSREPLY_PROXY "newsreply_proxy"
+#define RC_NEWS_CHUNK_SIZE "news_chunk_size"
+#define RC_NEWS_MAX_CHUNK "news_max_chunk"
+#define RC_NEWS_POSTING "news_posting"
+#define RC_NEWS_PROXY "news_proxy"
+#define RC_NNTPSERVER "nntpserver"
+#define RC_NNTP_PROXY "nntp_proxy"
+#define RC_NONRESTARTING_SIGWINCH "nonrestarting_sigwinch"
+#define RC_NO_DOT_FILES "no_dot_files"
+#define RC_NO_FILE_REFERER "no_file_referer"
+#define RC_NO_FORCED_CORE_DUMP "no_forced_core_dump"
+#define RC_NO_FROM_HEADER "no_from_header"
+#define RC_NO_ISMAP_IF_USEMAP "no_ismap_if_usemap"
+#define RC_NO_MARGINS "no_margins"
+#define RC_NO_PAUSE "no_pause"
+#define RC_NO_PROXY "no_proxy"
+#define RC_NO_REFERER_HEADER "no_referer_header"
+#define RC_NO_TABLE_CENTER "no_table_center"
+#define RC_NO_TITLE "no_title"
+#define RC_NUMBER_FIELDS_ON_LEFT "number_fields_on_left"
+#define RC_NUMBER_LINKS_ON_LEFT "number_links_on_left"
+#define RC_OUTGOING_MAIL_CHARSET "outgoing_mail_charset"
+#define RC_PARTIAL "partial"
+#define RC_PARTIAL_THRES "partial_thres"
+#define RC_PERSISTENT_COOKIES "persistent_cookies"
+#define RC_PERSONAL_EXTENSION_MAP "personal_extension_map"
+#define RC_PERSONAL_MAILCAP "personal_mailcap"
+#define RC_PERSONAL_MAIL_ADDRESS "personal_mail_address"
+#define RC_PERSONAL_MAIL_NAME "personal_mail_name"
+#define RC_POSITIONABLE_EDITOR "positionable_editor"
+#define RC_PREFERRED_CHARSET "preferred_charset"
+#define RC_PREFERRED_CONTENT_TYPE "preferred_content_type"
+#define RC_PREFERRED_ENCODING "preferred_encoding"
+#define RC_PREFERRED_LANGUAGE "preferred_language"
+#define RC_PREFERRED_MEDIA_TYPES "preferred_media_types"
+#define RC_PREPEND_BASE_TO_SOURCE "prepend_base_to_source"
+#define RC_PREPEND_CHARSET_TO_SOURCE "prepend_charset_to_source"
+#define RC_PRETTYSRC "prettysrc"
+#define RC_PRETTYSRC_SPEC "prettysrc_spec"
+#define RC_PRETTYSRC_VIEW_NO_ANCHOR_NUM "prettysrc_view_no_anchor_numbering"
+#define RC_PRINTER "printer"
+#define RC_QUIT_DEFAULT_YES "quit_default_yes"
+#define RC_RAW_MODE "raw_mode"
+#define RC_READ_TIMEOUT "read_timeout"
+#define RC_REDIRECTION_LIMIT "redirection_limit"
+#define RC_REFERER_WITH_QUERY "referer_with_query"
+#define RC_REPLAYSECS "replaysecs"
+#define RC_REUSE_TEMPFILES "reuse_tempfiles"
+#define RC_RLOGIN_PATH "rlogin_path"
+#define RC_RMDIR_PATH "rmdir_path"
+#define RC_RM_PATH "rm_path"
+#define RC_RULE "rule"
+#define RC_RULESFILE "rulesfile"
+#define RC_RUN_ALL_EXECUTION_LINKS "run_all_execution_links"
+#define RC_RUN_EXECUTION_LINKS_LOCAL "run_execution_links_on_local_files"
+#define RC_SAVE_SPACE "save_space"
+#define RC_SCAN_FOR_BURIED_NEWS_REFS "scan_for_buried_news_refs"
+#define RC_SCREEN_SIZE "screen_size"
+#define RC_SCROLLBAR "scrollbar"
+#define RC_SCROLLBAR_ARROW "scrollbar_arrow"
+#define RC_SEEK_FRAG_AREA_IN_CUR "seek_frag_area_in_cur"
+#define RC_SEEK_FRAG_MAP_IN_CUR "seek_frag_map_in_cur"
+#define RC_SELECT_POPUPS "select_popups"
+#define RC_SEND_USERAGENT "send_useragent"
+#define RC_SESSION_FILE "session_file"
+#define RC_SESSION_LIMIT "session_limit"
+#define RC_SET_COOKIES "set_cookies"
+#define RC_SHORT_URL "short_url"
+#define RC_SHOW_COLOR "show_color"
+#define RC_SHOW_CURSOR "show_cursor"
+#define RC_SHOW_DOTFILES "show_dotfiles"
+#define RC_SHOW_KB_NAME "show_kb_name"
+#define RC_SHOW_KB_RATE "show_kb_rate"
+#define RC_SNEWSPOST_PROXY "snewspost_proxy"
+#define RC_SNEWSREPLY_PROXY "snewsreply_proxy"
+#define RC_SNEWS_PROXY "snews_proxy"
+#define RC_SOFT_DQUOTES "soft_dquotes"
+#define RC_SOURCE_CACHE "source_cache"
+#define RC_SOURCE_CACHE_FOR_ABORTED "source_cache_for_aborted"
+#define RC_SSL_CERT_FILE "ssl_cert_file"
+#define RC_SSL_CLIENT_CERT_FILE "ssl_client_cert_file"
+#define RC_SSL_CLIENT_KEY_FILE "ssl_client_key_file"
+#define RC_STARTFILE "startfile"
+#define RC_STATUS_BUFFER_SIZE "status_buffer_size"
+#define RC_STRIP_DOTDOT_URLS "strip_dotdot_urls"
+#define RC_SUBSTITUTE_UNDERSCORES "substitute_underscores"
+#define RC_SUB_BOOKMARKS "sub_bookmarks"
+#define RC_SUFFIX "suffix"
+#define RC_SUFFIX_ORDER "suffix_order"
+#define RC_SYSLOG_REQUESTED_URLS "syslog_requested_urls"
+#define RC_SYSLOG_TEXT "syslog_text"
+#define RC_SYSTEM_EDITOR "system_editor"
+#define RC_SYSTEM_MAIL "system_mail"
+#define RC_SYSTEM_MAIL_FLAGS "system_mail_flags"
+#define RC_TAGSOUP "tagsoup"
+#define RC_TAR_PATH "tar_path"
+#define RC_TELNET_PATH "telnet_path"
+#define RC_TEXTFIELDS_NEED_ACTIVATION "textfields_need_activation"
+#define RC_TIMEOUT "timeout"
+#define RC_TN3270_PATH "tn3270_path"
+#define RC_TOUCH_PATH "touch_path"
+#define RC_TRACK_INTERNAL_LINKS "track_internal_links"
+#define RC_TRIM_BLANK_LINES "trim_blank_lines"
+#define RC_TRIM_INPUT_FIELDS "trim_input_fields"
+#define RC_TRUSTED_EXEC "trusted_exec"
+#define RC_TRUSTED_LYNXCGI "trusted_lynxcgi"
+#define RC_UNCOMPRESS_PATH "uncompress_path"
+#define RC_UNDERLINE_LINKS "underline_links"
+#define RC_UNIQUE_URLS "unique_urls"
+#define RC_UNZIP_PATH "unzip_path"
+#define RC_UPDATE_TERM_TITLE "update_term_title"
+#define RC_UPLOADER "uploader"
+#define RC_URL_DOMAIN_PREFIXES "url_domain_prefixes"
+#define RC_URL_DOMAIN_SUFFIXES "url_domain_suffixes"
+#define RC_USERAGENT "useragent"
+#define RC_USER_MODE "user_mode"
+#define RC_USE_FIXED_RECORDS "use_fixed_records"
+#define RC_USE_MOUSE "use_mouse"
+#define RC_USE_SELECT_POPUPS "use_select_popups"
+#define RC_UUDECODE_PATH "uudecode_path"
+#define RC_VERBOSE_IMAGES "verbose_images"
+#define RC_VIEWER "viewer"
+#define RC_VISITED_LINKS "visited_links"
+#define RC_VI_KEYS "vi_keys"
+#define RC_VI_KEYS_ALWAYS_ON "vi_keys_always_on"
+#define RC_WAIS_PROXY "wais_proxy"
+#define RC_WAIT_VIEWER_TERMINATION "wait_viewer_termination"
+#define RC_WITH_BACKSPACES "with_backspaces"
+#define RC_XHTML_PARSING "xhtml_parsing"
+#define RC_XLOADIMAGE_COMMAND "xloadimage_command"
+#define RC_ZCAT_PATH "zcat_path"
+#define RC_ZIP_PATH "zip_path"
+
+extern Config_Enum tbl_cookie_version[];
+extern Config_Enum tbl_force_prompt[];
+extern Config_Enum tbl_keypad_mode[];
+extern Config_Enum tbl_multi_bookmarks[];
+extern Config_Enum tbl_preferred_content[];
+extern Config_Enum tbl_preferred_encoding[];
+extern Config_Enum tbl_preferred_media[];
+extern Config_Enum tbl_transfer_rate[];
+extern Config_Enum tbl_user_mode[];
+
+extern BOOL LYgetEnum(Config_Enum * table, const char *name, int *result);
+extern BOOL LYsetRcValue(const char *name, const char *param);
+extern BOOL will_save_rc(const char *name);
+extern const char *LYputEnum(Config_Enum * table, int value);
+extern int enable_lynxrc(char *value);
+extern int get_http_protocol(char *value);
+extern int get_tagsoup(char *value);
+extern int save_rc(FILE *);
+extern void read_rc(FILE *);
+
+#endif /* LYRCFILE_H */
diff --git a/src/TRSTable.c b/src/TRSTable.c
new file mode 100644
index 0000000..2a9461c
--- /dev/null
+++ b/src/TRSTable.c
@@ -0,0 +1,2017 @@
+/*
+ * $LynxId: TRSTable.c,v 1.39 2021/10/24 18:05:05 tom Exp $
+ * Simple table object
+ * ===================
+ * Authors
+ * KW Klaus Weide <kweide@enteract.com>
+ * History:
+ * 2 Jul 1999 KW Created.
+ */
+
+#include <HTUtils.h>
+#include <HTStyle.h> /* for HT_LEFT, HT_CENTER, HT_RIGHT */
+#include <LYCurses.h>
+#include <TRSTable.h>
+#include <LYGlobalDefs.h>
+
+#include <LYLeaks.h>
+
+#ifdef SAVE_TIME_NOT_SPACE
+#define CELLS_GROWBY 16
+#define ROWS_GROWBY 16
+#else
+#define CELLS_GROWBY 2
+#define ROWS_GROWBY 2
+#endif
+
+#ifdef USE_CURSES_PADS
+# define MAX_STBL_POS (LYwideLines ? MAX_COLS - 1 : LYcolLimit)
+#else
+# define MAX_STBL_POS (LYcolLimit)
+#endif
+
+/* must be different from HT_ALIGN_NONE and HT_LEFT, HT_CENTER etc.: */
+#define RESERVEDCELL (-2) /* cell's alignment field is overloaded, this
+ value means cell was reserved by ROWSPAN */
+#define EOCOLG (-2) /* sumcols' Line field isn't used for line info, this
+ special value means end of COLGROUP */
+#ifndef NO_AGGRESSIVE_NEWROW
+# define NO_AGGRESSIVE_NEWROW 0
+#endif
+
+typedef enum {
+ CS_invalid = -1, /* cell "before the first",
+ or empty lines after [ce]bc,
+ or TRST aborted */
+ CS__new = 0,
+ CS__0new, /* new, at BOL */
+ CS__0eb, /* starts at BOL, empty, break */
+ CS__eb, /* empty, break */
+ CS__0cb, /* starts at BOL, content, break */
+ CS__cb, /* content, break */
+ CS__0ef, /* starts at BOL, empty, finished */
+ CS__ef, /* empty, finished */
+ CS__0cf, /* starts at BOL, content, finished */
+ CS__cf, /* content, finished */
+ CS__ebc, /* empty, break, more content (maybe @BOL) */
+ CS__cbc /* content, break, more content (maybe @BOL) */
+} cellstate_t;
+
+typedef struct _STable_states {
+ cellstate_t prev_state; /* Contents type of the previous cell */
+ cellstate_t state; /* Contents type of the worked-on cell */
+ int lineno; /* Start line of the current cell */
+ int icell_core; /* -1 or the 1st cell with <BR></TD> on row */
+ int x_td; /* x start pos of the current cell or -1 */
+ int pending_len; /* For multiline cells, the length of
+ the part on the first line (if
+ state is CS__0?[ec]b) (??), or 0 */
+} STable_states;
+
+typedef struct _STable_cellinfo {
+ int cLine; /* lineno in doc (zero-based): -1 for
+ contentless cells (and cells we do
+ not want to measure and count?),
+ line-of-the-start otherwise. */
+ int pos; /* column where cell starts */
+ int len; /* number of character positions */
+ int colspan; /* number of columns to span */
+ int alignment; /* one of HT_LEFT, HT_CENTER, HT_RIGHT,
+ or RESERVEDCELL */
+} STable_cellinfo;
+
+enum ended_state {
+ ROW_not_ended,
+ ROW_ended_by_endtr,
+ ROW_ended_by_splitline
+};
+
+#define HAS_END_OF_CELL 1
+#define HAS_BEG_OF_CELL 2
+#define IS_CONTINUATION_OF_CELL 4
+#define OFFSET_IS_VALID 8
+#define OFFSET_IS_VALID_LAST_CELL 0x10
+#define BELIEVE_OFFSET 0x20
+
+typedef struct _STable_rowinfo {
+ /* Each row may be displayed on many display lines, but we fix up
+ positions of cells on this display line only: */
+ int Line; /* lineno in doc (zero-based) */
+ int ncells; /* number of table cells */
+
+ /* What is the meaning of this?! It is set if:
+ [search for def of fixed_line below]
+
+ a1) a non-last cell is not at BOL,
+ a2) a non-last cell has something on the first line,
+ b) a >=3-lines-cell not at BOL, the first row non-empty, the 2nd empty;
+ c) a multiline cell not at BOL, the first row non-empty, the rest empty;
+ d) a multiline cell not at BOL, the first row non-empty;
+ e) a singleline non-empty cell not at BOL;
+
+ Summary: have seen a cell which is one of:
+ (Notation: B: at BOL; L: last; E: the first row is non-empty)
+
+ bcde: !B && !E
+ a1: !L && !B
+ a2: !L && !E
+
+ Or: has at least two of !B, !L, !E, or: has at most one of B,L,E.
+
+ REMARK: If this variable is not set, but icell_core is, Line is
+ reset to the line of icell_core.
+ */
+ BOOL fixed_line; /* if we have a 'core' line of cells */
+ enum ended_state ended; /* if we saw </tr> etc */
+ int content; /* Whether contains end-of-cell etc */
+ int offset; /* >=0 after line break in a multiline cell */
+ int allocated; /* number of table cells allocated */
+ STable_cellinfo *cells;
+ int alignment; /* global align attribute for this row */
+} STable_rowinfo;
+
+struct _STable_info {
+#ifdef EXP_NESTED_TABLES
+ struct _STable_info *enclosing; /* The table which contain us */
+ struct _TextAnchor *enclosing_last_anchor_before_stbl;
+#endif
+ int startline; /* lineno where table starts (zero-based) */
+ int nrows; /* number of rows */
+ int ncols; /* number of rows */
+ int maxlen; /* sum of max. cell lengths of any row */
+ int maxpos; /* max. of max. cell pos's of any row */
+ int allocated_rows; /* number of rows allocated */
+ int allocated_sumcols; /* number of sumcols allocated */
+ int ncolinfo; /* number of COL info collected */
+ STable_cellinfo *sumcols; /* for summary (max len/pos) col info */
+ STable_rowinfo *rows;
+ STable_rowinfo rowspans2eog;
+ short alignment; /* global align attribute for this table */
+ short rowgroup_align; /* align default for current group of rows */
+ short pending_colgroup_align;
+ int pending_colgroup_next;
+ STable_states s;
+};
+
+/*
+ * Functions and structures in this source file keep track of positions.
+ * They don't know about the character data in those lines, or about
+ * the HText and HTLine structures. GridText.c doesn't know about our
+ * structures. It should stay that way.
+ *
+ * The basic idea: we let the code in HTML.c/GridText.c produce and format
+ * output "as usual", i.e. as without Simple Table support. We keep track
+ * of the positions in the generated output where cells and rows start (or
+ * end). If all goes well, that preliminary output (stored in HText/HTLine
+ * structures) can be fixed up when the TABLE end tag is processed, by just
+ * inserting spaces in the right places (and possibly changing alignment).
+ * If all goes not well, we already have a safe fallback.
+ *
+ * Note that positions passed to and from these functions should be
+ * in terms of screen positions, not just byte counts in a HTLine.data
+ * (cf. line->data vs. HText_TrueLineSize).
+ *
+ * Memory is allocated dynamically, so we can have tables of arbitrary
+ * length. On allocation error we just return and error indication
+ * instead of outofmem(), so caller can give up table tracking and maybe
+ * recover memory.
+ *
+ * Implemented:
+ * - ALIGN={left,right,center,justify} applied to individual table cells
+ * ("justify" is treated as "left")
+ * - Inheritance of horizontal alignment according to HTML 4.0
+ * - COLSPAN >1 (may work incorrectly for some tables?)
+ * - ROWSPAN >1 (reserving cells in following rows)
+ * - Line breaks at start of first cell or at end of last cell are treated
+ * as if they were not part of the cell and row. This allows us to
+ * cooperate with one way in which tables have been made friendly to
+ * browsers without any table support.
+ * Missing, but can be added:
+ * - Support for COLGROUP/COL
+ * - Tables wider than display. The limitation is not here but in GridText.c
+ * etc. If horizontal scrolling were implemented there, the mechanisms
+ * here could deal with wide tables (just change MAX_STBL_POS code).
+ * Missing, unlikely to add:
+ * - Support for non-LTR directionality. A general problem, support is
+ * lacking throughout the lynx code.
+ * - Support for most other table-related attributes. Most of them are
+ * for decorative purposes.
+ * Impossible or very unlikely (because it doesn't fit the model):
+ * - Any cell contents of more than one line, line breaks within cells.
+ * Anything that requires handling cell contents as paragraphs (block
+ * elements), like reflowing. Vertical alignment.
+ */
+static int Stbl_finishRowInTable(STable_info *me);
+
+static const char *cellstate_s(cellstate_t state)
+{
+ const char *result = "?";
+ /* *INDENT-OFF* */
+ switch (state) {
+ case CS_invalid: result = "CS_invalid"; break;
+ case CS__new: result = "CS__new"; break;
+ case CS__0new: result = "CS__0new"; break;
+ case CS__0eb: result = "CS__0eb"; break;
+ case CS__eb: result = "CS__eb"; break;
+ case CS__0cb: result = "CS__0cb"; break;
+ case CS__cb: result = "CS__cb"; break;
+ case CS__0ef: result = "CS__0ef"; break;
+ case CS__ef: result = "CS__ef"; break;
+ case CS__0cf: result = "CS__0cf"; break;
+ case CS__cf: result = "CS__cf"; break;
+ case CS__ebc: result = "CS__ebc"; break;
+ case CS__cbc: result = "CS__cbc"; break;
+ }
+ /* *INDENT-ON* */
+
+ return result;
+}
+
+struct _STable_info *Stbl_startTABLE(int alignment)
+{
+ STable_info *me = typecalloc(STable_info);
+
+ CTRACE2(TRACE_TRST,
+ (tfp, "TRST:Stbl_startTABLE(align=%d)\n", (int) alignment));
+ if (me) {
+ me->alignment = (short) alignment;
+ me->rowgroup_align = HT_ALIGN_NONE;
+ me->pending_colgroup_align = HT_ALIGN_NONE;
+ me->s.x_td = -1;
+ me->s.icell_core = -1;
+#ifdef EXP_NESTED_TABLES
+ if (nested_tables)
+ me->enclosing = 0;
+#endif
+ }
+ return me;
+}
+
+static void free_rowinfo(STable_rowinfo *me)
+{
+ if (me && me->allocated) {
+ FREE(me->cells);
+ }
+}
+
+void Stbl_free(STable_info *me)
+{
+ CTRACE2(TRACE_TRST,
+ (tfp, "TRST:Stbl_free()\n"));
+ if (me && me->allocated_rows && me->rows) {
+ int i;
+
+ for (i = 0; i < me->allocated_rows; i++)
+ free_rowinfo(me->rows + i);
+ FREE(me->rows);
+ }
+ free_rowinfo(&me->rowspans2eog);
+ if (me)
+ FREE(me->sumcols);
+ FREE(me);
+}
+
+/*
+ * Returns -1 on error, otherwise index of just-added table cell.
+ */
+static int Stbl_addCellToRow(STable_rowinfo *me, STable_cellinfo *colinfo, int ncolinfo,
+ STable_states *s,
+ int colspan,
+ int alignment,
+ int isheader,
+ int lineno,
+ int *ppos)
+{
+ STable_cellinfo *cells;
+ int i;
+ int last_colspan = me->ncells ?
+ me->cells[me->ncells - 1].colspan : 1;
+ cellstate_t newstate;
+ int ret;
+
+ CTRACE2(TRACE_TRST,
+ (tfp, "TRST:Stbl_addCellToRow, line=%d, pos=%d, colspan=%d\n",
+ lineno, *ppos, colspan));
+ CTRACE2(TRACE_TRST,
+ (tfp,
+ " ncells=%d, stateLine=%d, pending_len=%d, pstate=%s, state=%s\n",
+ me->ncells, s->lineno, s->pending_len,
+ cellstate_s(s->prev_state), cellstate_s(s->state)));
+ if (me->ncells == 0)
+ s->prev_state = CS_invalid;
+ else if (s->prev_state == CS_invalid ||
+ (s->state != CS__0new &&
+ s->state != CS__ef && s->state != CS__0ef))
+ s->prev_state = s->state;
+
+ if (me->ncells == 0 || *ppos == 0)
+ newstate = CS__0new;
+ else
+ newstate = CS__new;
+
+ if (me->ncells > 0 && s->pending_len > 0) {
+ if (s->prev_state != CS__cbc)
+ me->cells[me->ncells - 1].len = s->pending_len;
+ s->pending_len = 0;
+ }
+ s->x_td = *ppos;
+
+ if (lineno != s->lineno) {
+ if (!me->fixed_line) {
+ if (me->ncells == 0 || *ppos == 0) {
+ switch (s->prev_state) {
+ case CS_invalid:
+ case CS__0new:
+ case CS__0eb:
+ case CS__0cb:
+ case CS__0ef:
+ case CS__0cf:
+ if (me->ncells > 0)
+ for (i = me->ncells + last_colspan - 2;
+ i >= me->ncells - 1; i--) {
+ me->cells[i].pos = *ppos;
+ me->cells[i].cLine = lineno;
+ }
+ me->Line = lineno;
+ break;
+ case CS__new:
+ case CS__eb:
+ case CS__ef:
+ case CS__cf:
+ default:
+ break;
+ case CS__cb:
+ *ppos = me->cells[me->ncells - 1].pos +
+ me->cells[me->ncells - 1].len;
+ }
+ } else { /* last cell multiline, ncells != 0, pos != 0 */
+ switch (s->prev_state) {
+ case CS__0new:
+ case CS__0eb:
+ case CS__0ef:
+ /* Do not fail, but do not set fixed_line either */
+ break;
+ case CS__cb:
+ goto trace_and_fail;
+ case CS__cf:
+ goto trace_and_fail;
+ case CS__0cb:
+ case CS__0cf:
+ if (*ppos > me->cells[0].pos)
+ me->Line = lineno;
+ me->fixed_line = YES; /* type=a def of fixed_line i */
+ break;
+ case CS__new:
+ case CS__eb:
+ case CS__ef:
+ default:
+ me->fixed_line = YES; /* type=e def of fixed_line ii */
+ break;
+ case CS__cbc:
+ goto trace_and_fail;
+ }
+ }
+ }
+ if (me->fixed_line && lineno != me->Line) {
+ switch (s->prev_state) {
+ case CS__cb:
+ case CS__cf:
+ if (*ppos > 0)
+ goto trace_and_fail;
+ else
+ *ppos = me->cells[me->ncells - 1].pos /* == 0 */ +
+ me->cells[me->ncells - 1].len;
+ break;
+ case CS__0cf:
+ case CS__0cb:
+ if (*ppos == 0 || *ppos <= me->cells[0].pos)
+ *ppos = me->cells[me->ncells - 1].pos /* == 0 */ +
+ me->cells[me->ncells - 1].len;
+ break;
+ case CS__0new:
+ case CS__0ef:
+ case CS__0eb:
+ break;
+ case CS__new:
+ case CS__eb:
+ case CS__ef:
+ default:
+ *ppos = me->cells[me->ncells - 1].pos;
+ break;
+ case CS__cbc:
+ break;
+ case CS_invalid:
+ break;
+ }
+ }
+ s->lineno = lineno;
+ } else { /* lineno == s->lineno: */
+ switch (s->prev_state) {
+ case CS_invalid:
+ case CS__0new:
+ case CS__0eb: /* cannot happen */
+ case CS__0cb: /* cannot happen */
+ case CS__0ef:
+ case CS__0cf: /* ##302?? set icell_core? or only in finish? */
+ break;
+ case CS__eb: /* cannot happen */
+ case CS__cb: /* cannot happen */
+ case CS__ef:
+ break;
+ case CS__ebc: /* should have done smth in finish */
+ case CS__cbc: /* should have done smth in finish */
+ break;
+ case CS__new:
+ case CS__cf:
+ if (me->fixed_line && me->Line != lineno) {
+ goto trace_and_fail;
+ } else {
+ me->fixed_line = YES;
+ me->Line = lineno;
+ }
+ }
+ }
+
+ s->state = newstate;
+
+ if (me->ncells > 0 && me->cells[me->ncells - 1].colspan > 1) {
+ me->ncells += me->cells[me->ncells - 1].colspan - 1;
+ }
+ while (me->ncells < me->allocated &&
+ me->cells[me->ncells].alignment == RESERVEDCELL) {
+ me->ncells++;
+ }
+ {
+ int growby = 0;
+
+ while (me->ncells + colspan + 1 >= me->allocated + growby)
+ growby += CELLS_GROWBY;
+ if (growby) {
+ if (me->allocated == 0 && !me->cells) {
+ cells = typecallocn(STable_cellinfo, (unsigned) growby);
+ } else {
+ cells = typeRealloc(STable_cellinfo, me->cells,
+ (unsigned) (me->allocated + growby));
+
+ for (i = 0; cells && i < growby; i++) {
+ cells[me->allocated + i].alignment = HT_ALIGN_NONE;
+ }
+ }
+ if (cells) {
+ me->allocated += growby;
+ me->cells = cells;
+ } else {
+ goto trace_and_fail;
+ }
+ }
+ }
+
+ me->cells[me->ncells].cLine = lineno;
+ me->cells[me->ncells].pos = *ppos;
+ me->cells[me->ncells].len = -1;
+ me->cells[me->ncells].colspan = colspan;
+
+ if (alignment != HT_ALIGN_NONE)
+ me->cells[me->ncells].alignment = alignment;
+ else {
+ if (ncolinfo >= me->ncells + 1)
+ me->cells[me->ncells].alignment = colinfo[me->ncells].alignment;
+ else
+ me->cells[me->ncells].alignment = me->alignment;
+ if (me->cells[me->ncells].alignment == HT_ALIGN_NONE)
+ me->cells[me->ncells].alignment = me->alignment;
+ if (me->cells[me->ncells].alignment == HT_ALIGN_NONE)
+ me->cells[me->ncells].alignment = isheader ? HT_CENTER : HT_LEFT;
+ }
+ for (i = me->ncells + 1; i < me->ncells + colspan; i++) {
+ me->cells[i].cLine = lineno;
+ me->cells[i].pos = *ppos;
+ me->cells[i].len = -1;
+ me->cells[i].colspan = 0;
+ me->cells[i].alignment = HT_LEFT;
+ }
+ me->cells[me->ncells + colspan].pos = -1; /* not yet used */
+ me->ncells++;
+
+ ret = me->ncells - 1;
+ trace_and_return:
+ CTRACE2(TRACE_TRST,
+ (tfp, " => prev_state=%s, state=%s, ret=%d\n",
+ cellstate_s(s->prev_state), cellstate_s(s->state), ret));
+ return (ret);
+
+ trace_and_fail:
+ ret = -1;
+ goto trace_and_return;
+}
+
+/* returns -1 on error, 0 otherwise */
+/* assumes cells have already been allocated (but may need more) */
+static int Stbl_reserveCellsInRow(STable_rowinfo *me, int icell,
+ int colspan)
+{
+ STable_cellinfo *cells;
+ int i;
+ int growby = 1 + icell + colspan - me->allocated;
+
+ CTRACE2(TRACE_TRST,
+ (tfp,
+ "TRST:Stbl_reserveCellsInRow(icell=%d, colspan=%d) growby=%d\n",
+ icell, colspan, growby));
+ if (growby > 0) {
+ cells = typeRealloc(STable_cellinfo, me->cells,
+ (unsigned) (me->allocated + growby));
+
+ if (cells) {
+ for (i = 0; i < growby; i++) {
+ cells[me->allocated + i].alignment = HT_ALIGN_NONE;
+ }
+ me->allocated += growby;
+ me->cells = cells;
+ } else {
+ return -1;
+ }
+ }
+ for (i = icell; i < icell + colspan; i++) {
+ me->cells[i].cLine = -1;
+ me->cells[i].pos = -1;
+ me->cells[i].len = -1;
+ me->cells[i].colspan = 0;
+ me->cells[i].alignment = RESERVEDCELL;
+ }
+ me->cells[icell].colspan = colspan;
+ return 0;
+}
+
+/* Returns -1 on failure. */
+static int Stbl_finishCellInRow(STable_rowinfo *me, STable_states *s, int end_td,
+ int lineno,
+ int pos)
+{
+ STable_cellinfo *lastcell;
+ cellstate_t newstate = CS_invalid;
+ int multiline = NO, empty;
+ int ret;
+
+ CTRACE2(TRACE_TRST,
+ (tfp,
+ "TRST:Stbl_finishCellInRow line=%d pos=%d end_td=%d ncells=%d pnd_len=%d\n",
+ lineno, pos, (int) end_td, me->ncells, s->pending_len));
+
+ if (me->ncells <= 0)
+ return -1;
+ lastcell = me->cells + (me->ncells - 1);
+ multiline = (lineno != lastcell->cLine || lineno != s->lineno);
+ empty = multiline ? (pos == 0) : (pos <= s->x_td);
+
+ CTRACE2(TRACE_TRST,
+ (tfp,
+ " [lines: lastCell=%d state=%d multi=%d] empty=%d (prev)state=(%s) %s\n",
+ lastcell->cLine, s->lineno, multiline, empty,
+ cellstate_s(s->prev_state), cellstate_s(s->state)));
+
+ if (multiline) {
+ if ((end_td & TRST_ENDCELL_MASK) == TRST_ENDCELL_LINEBREAK) {
+ switch (s->state) {
+ case CS_invalid:
+ newstate = empty ? CS_invalid : CS__cbc;
+ break;
+ case CS__0new:
+ newstate = empty ? CS__0eb : CS__0cb;
+ break;
+ case CS__0eb:
+ newstate = empty ? CS__0eb : CS__ebc;
+ s->state = newstate;
+ if (empty) {
+ ret = (lastcell->len <= 0 ? 0 : lastcell->len);
+ } else {
+ ret = (lastcell->len <= 0 ? 0 : -1);
+ }
+ goto trace_and_return;
+ case CS__0cb:
+ if (!me->fixed_line) {
+ if (!empty) {
+ if (s->icell_core == -1)
+ me->Line = -1;
+ }
+ }
+ if (s->pending_len && empty) { /* First line non-empty */
+ if ((me->fixed_line && me->Line == lastcell->cLine) ||
+ s->icell_core == me->ncells - 1)
+ lastcell->len = s->pending_len;
+ s->pending_len = 0;
+ } /* @@@ for empty do smth. about ->Line / ->icell_core !! */
+ newstate = empty ? CS__0cb : CS__cbc; /* ##474_needs_len!=-1? */
+ break;
+ case CS__0ef:
+ case CS__0cf:
+ break;
+ case CS__new:
+ newstate = empty ? CS__eb : CS__cb;
+ break;
+ case CS__eb: /* ##484_set_pending_ret_0_if_empty? */
+ newstate = empty ? CS__eb : CS__ebc;
+ s->state = newstate;
+ if (empty) {
+ ret = (lastcell->len <= 0 ? 0 : lastcell->len);
+ } else {
+ ret = (lastcell->len <= 0 ? 0 : -1);
+ }
+ goto trace_and_return;
+ case CS__cb:
+ if (s->pending_len && empty) { /* ##496: */
+ lastcell->len = s->pending_len;
+ s->pending_len = 0;
+ } /* @@@ for empty do smth. about ->Line / ->icell_core !! */
+ ret = -1;
+ if (empty) {
+ if (!me->fixed_line) {
+ me->fixed_line = YES; /* type=b def of fixed_line i */
+ me->Line = lastcell->cLine; /* should've happened in break */
+ } else {
+ if (me->Line != lastcell->cLine)
+ goto trace_and_return;
+ }
+ newstate = CS__cb;
+ } else {
+ if (!me->fixed_line) {
+ me->fixed_line = YES; /* type=b def of fixed_line ii */
+ me->Line = lastcell->cLine; /* should've happened in break */
+ }
+ s->state = CS__cbc;
+ goto trace_and_return;
+ }
+ break;
+ case CS__ef:
+ ret = 0;
+ goto trace_and_return;
+ case CS__cf:
+ ret = lastcell->len; /* ##523_change_state? */
+ goto trace_and_return;
+ case CS__cbc:
+ if (!me->fixed_line) {
+ if (empty) {
+ if (s->icell_core == -1) /* ##528??: */
+ me->Line = lineno;
+ /* lastcell->Line = lineno; */
+ } else { /* !empty */
+ if (s->icell_core == -1)
+ me->Line = -1;
+ }
+ }
+ s->pending_len = 0;
+ newstate = empty ? CS_invalid : CS__cbc;
+ break;
+ default:
+ break;
+ }
+ } else { /* multiline cell, processing </TD>: */
+ s->x_td = -1;
+ switch (s->state) {
+ case CS_invalid:
+ /* ##540_return_-1_for_invalid_if_len!: */
+ if (!empty && lastcell->len > 0) {
+ newstate = CS__0cf;
+ s->state = newstate;
+ ret = -1;
+ goto trace_and_return;
+ }
+ /* ##541_set_len_0_Line_-1_sometimes: */
+ lastcell->len = 0;
+ lastcell->cLine = -1;
+ /* fall thru ##546 really fall thru??: */
+ newstate = empty ? CS_invalid : CS__cbc;
+ break;
+ case CS__0new:
+ newstate = empty ? CS__0ef : CS__0cf;
+ break;
+ case CS__0eb:
+ newstate = empty ? CS__0ef : CS__0cf; /* ebc?? */
+ s->state = newstate;
+ if (empty) {
+ ret = (lastcell->len <= 0 ? 0 : lastcell->len);
+ } else {
+ ret = (lastcell->len <= 0 ? 0 : -1);
+ }
+ goto trace_and_return;
+ case CS__0cb:
+ if (s->pending_len) {
+ if (empty)
+ lastcell->len = s->pending_len;
+ else
+ lastcell->len = 0;
+ s->pending_len = 0;
+ }
+ if (!me->fixed_line) {
+ if (empty) {
+ if (s->icell_core == -1)
+ /* first cell before <BR></TD> => the core cell */
+ s->icell_core = me->ncells - 1;
+ /* lastcell->cLine = lineno; */
+ } else { /* !empty */
+ if (s->icell_core == -1)
+ me->Line = -1;
+ }
+ }
+ if (s->pending_len && empty) {
+ lastcell->len = s->pending_len;
+ s->pending_len = 0;
+ } /* @@@ for empty do smth. about ->Line / ->icell_core !! */
+ newstate = empty ? CS__0cf : CS__cbc;
+ break;
+ case CS__0ef:
+ newstate = CS__0ef;
+ /* FALLTHRU */
+ case CS__0cf:
+ break;
+ case CS__new:
+ newstate = empty ? CS__ef : CS__cf;
+ break;
+ case CS__eb:
+ newstate = CS__ef;
+ s->state = newstate;
+ if (empty) {
+ ret = (lastcell->len <= 0 ? 0 : lastcell->len);
+ } else {
+ ret = (lastcell->len <= 0 ? 0 : -1);
+ }
+ goto trace_and_return;
+ case CS__cb:
+ if (s->pending_len && empty) {
+ lastcell->len = s->pending_len;
+ s->pending_len = 0;
+ }
+ ret = -1;
+ if (empty) {
+ if (!me->fixed_line) {
+ me->fixed_line = YES; /* type=c def of fixed_line */
+ me->Line = lastcell->cLine; /* should've happened in break */
+ } else {
+ if (me->Line != lastcell->cLine)
+ goto trace_and_return;
+ }
+ newstate = CS__cf;
+ } else {
+ goto trace_and_return;
+ }
+ break;
+ case CS__ef: /* ignored error */
+ case CS__cf: /* ignored error */
+ break;
+ case CS__ebc: /* ##540_handle_ebc: */
+ lastcell->len = 0;
+ if (!me->fixed_line) {
+ if (!empty) {
+ if (s->icell_core == -1)
+ lastcell->cLine = -1;
+ }
+ }
+ s->pending_len = 0;
+ newstate = empty ? CS_invalid : CS__cbc;
+ break;
+ case CS__cbc: /* ##586 */
+ lastcell->len = 0; /* ##613 */
+ ret = -1;
+ if (me->fixed_line && me->Line == lastcell->cLine)
+ goto trace_and_return;
+ if (!me->fixed_line) {
+ if (empty) {
+ if (s->icell_core == -1)
+ me->Line = lineno;
+ }
+ }
+ s->pending_len = 0; /* ##629 v */
+ newstate = empty ? CS_invalid : CS__cbc;
+ break;
+ }
+ }
+ } else { /* (!multiline) */
+ if ((end_td & TRST_ENDCELL_MASK) == TRST_ENDCELL_LINEBREAK) {
+ switch (s->state) {
+ case CS_invalid:
+ case CS__0new:
+ s->pending_len = empty ? 0 : pos - lastcell->pos;
+ newstate = empty ? CS__0eb : CS__0cb;
+ s->state = newstate;
+ ret = 0; /* or 0 for xlen to s->pending_len?? */
+ goto trace_and_return;
+ case CS__0eb: /* cannot happen */
+ newstate = CS__eb;
+ break;
+ case CS__0cb: /* cannot happen */
+ newstate = CS__cb;
+ break;
+ case CS__0ef:
+ case CS__0cf:
+ break;
+ case CS__new:
+ ret = -1;
+ if (!empty && s->prev_state == CS__cbc) /* ##609: */
+ goto trace_and_return;
+ if (!empty) {
+ if (!me->fixed_line) {
+ me->fixed_line = YES; /* type=d def of fixed_line */
+ me->Line = lineno;
+ } else {
+ if (me->Line != lineno)
+ goto trace_and_return;
+ }
+ }
+ newstate = empty ? CS__eb : CS__cb;
+ s->state = newstate;
+ if (!me->fixed_line) {
+ s->pending_len = empty ? 0 : pos - lastcell->pos;
+ ret = 0;
+ goto trace_and_return;
+ } else {
+ s->pending_len = 0;
+ lastcell->len = empty ? 0 : pos - lastcell->pos;
+ ret = lastcell->len;
+ goto trace_and_return;
+ }
+ case CS__eb: /* cannot happen */
+ newstate = empty ? CS__eb : CS__ebc;
+ break;
+ case CS__cb: /* cannot happen */
+ newstate = empty ? CS__cb : CS__cbc;
+ break;
+ case CS__ef:
+ ret = 0;
+ goto trace_and_return;
+ case CS__cf:
+ ret = lastcell->len;
+ goto trace_and_return;
+ case CS__cbc: /* ??? */
+ break;
+ default:
+ break;
+ }
+ } else { /* !multiline, processing </TD>: */
+ s->x_td = -1;
+ switch (s->state) {
+ case CS_invalid: /* ##691_no_lastcell_len_for_invalid: */
+ if (!(me->fixed_line && me->Line == lastcell->cLine))
+ lastcell->len = 0;
+ /* FALLTHRU */
+ case CS__0new:
+ newstate = empty ? CS__0ef : CS__0cf;
+ break; /* ##630 */
+ case CS__0eb:
+ newstate = CS__0ef;
+ break; /* ??? */
+ case CS__0cb:
+ newstate = empty ? CS__0cf : CS__cbc;
+ break; /* ??? */
+ case CS__0ef:
+ newstate = CS__0ef;
+ break; /* ??? */
+ case CS__0cf:
+ break; /* ??? */
+ case CS__new:
+ ret = -1;
+ if (!empty && s->prev_state == CS__cbc)
+ goto trace_and_return;
+ if (!empty) { /* ##642_set_fixed!: */
+ if (!me->fixed_line) {
+ me->fixed_line = YES; /* type=e def of fixed_line */
+ me->Line = lineno;
+ } else {
+ if (me->Line != lineno)
+ goto trace_and_return;
+ }
+ }
+ if (lastcell->len < 0)
+ lastcell->len = empty ? 0 : pos - lastcell->pos;
+ newstate = empty ? CS__ef : CS__cf;
+ s->state = newstate;
+ ret = ((me->fixed_line && lineno != me->Line)
+ ? -1 : lastcell->len);
+ goto trace_and_return;
+ case CS__eb:
+ newstate = empty ? CS__ef : CS__cf;
+ break; /* ??? */
+ case CS__cb:
+ newstate = CS__cf;
+ break; /* ??? */
+ case CS__ef: /* ignored error */
+ case CS__cf: /* ignored error */
+ default:
+ break;
+ }
+ lastcell->len = pos - lastcell->pos;
+ } /* if (!end_td) ... else */
+ } /* if (multiline) ... else */
+
+ s->state = newstate;
+ ret = lastcell->len;
+#ifdef EXP_NESTED_TABLES
+ if (nested_tables) {
+ if (ret == -1 && pos == 0)
+ ret = 0; /* XXXX Hack to allow trailing <P> in multiline cells. */
+ }
+#endif
+
+/* lastcell->len = pos - lastcell->pos; */
+ trace_and_return:
+ CTRACE2(TRACE_TRST,
+ (tfp, " => prev_state=%s, state=%s, return=%d\n",
+ cellstate_s(s->prev_state), cellstate_s(s->state), ret));
+ return ret;
+}
+
+/*
+ * Reserve cells, each of given colspan, in (rowspan-1) rows after the current
+ * row of rowspan>1. If rowspan==0, use special 'row' rowspans2eog to keep
+ * track of rowspans that are to remain in effect until the end of the row
+ * group (until next THEAD/TFOOT/TBODY) or table.
+ */
+static int Stbl_reserveCellsInTable(STable_info *me, int icell,
+ int colspan,
+ int rowspan)
+{
+ STable_rowinfo *rows, *row;
+ int growby;
+ int i;
+
+ if (colspan > TRST_MAXCOLSPAN) {
+ CTRACE2(TRACE_TRST,
+ (tfp,
+ "TRST:*** COLSPAN=%d is too large, ignored!\n",
+ colspan));
+ return -1;
+ }
+ if (rowspan > TRST_MAXROWSPAN) {
+ CTRACE2(TRACE_TRST,
+ (tfp,
+ "TRST:*** ROWSPAN=%d is too large, ignored!\n",
+ rowspan));
+ return -1;
+ }
+ if (me->nrows <= 0)
+ return -1; /* must already have at least one row */
+
+ CTRACE2(TRACE_TRST,
+ (tfp,
+ "TRST:Stbl_reserveCellsInTable(icell=%d, colspan=%d, rowspan=%d)\n",
+ icell, colspan, rowspan));
+ if (rowspan == 0) {
+ if (!me->rowspans2eog.cells) {
+ me->rowspans2eog.cells = typecallocn(STable_cellinfo,
+ (unsigned) HTMAX(1, icell + colspan));
+
+ if (!me->rowspans2eog.cells)
+ return 0; /* fail silently */
+ else
+ me->rowspans2eog.allocated = icell + colspan;
+ }
+ Stbl_reserveCellsInRow(&me->rowspans2eog, icell, colspan);
+ }
+
+ growby = me->nrows + rowspan - 1 - me->allocated_rows;
+ if (growby > 0) {
+ rows = typeRealloc(STable_rowinfo, me->rows,
+ (unsigned) (me->allocated_rows + growby));
+
+ if (!rows)
+ return 0; /* ignore silently, no free memory, may be recoverable */
+ for (i = 0; i < growby; i++) {
+ row = rows + me->allocated_rows + i;
+ row->allocated = 0;
+ row->offset = 0;
+ row->content = 0;
+ if (!me->rowspans2eog.allocated) {
+ row->cells = NULL;
+ } else {
+ row->cells = typecallocn(STable_cellinfo,
+ (unsigned) me->rowspans2eog.allocated);
+
+ if (row->cells) {
+ row->allocated = me->rowspans2eog.allocated;
+ memcpy(row->cells, me->rowspans2eog.cells,
+ ((unsigned) row->allocated * sizeof(STable_cellinfo)));
+ }
+ }
+ row->ncells = 0;
+ row->fixed_line = NO;
+ row->alignment = HT_ALIGN_NONE;
+ }
+ me->allocated_rows += growby;
+ me->rows = rows;
+ }
+ for (i = me->nrows;
+ i < (rowspan == 0 ? me->allocated_rows : me->nrows + rowspan - 1);
+ i++) {
+ if (!me->rows[i].allocated) {
+ me->rows[i].cells = typecallocn(STable_cellinfo,
+ (unsigned) HTMAX(1,
+ icell
+ + colspan));
+
+ if (!me->rows[i].cells)
+ return 0; /* fail silently */
+ else
+ me->rows[i].allocated = icell + colspan;
+ }
+ Stbl_reserveCellsInRow(me->rows + i, icell, colspan);
+ }
+ return 0;
+}
+
+/* Remove reserved cells in trailing rows that were added for rowspan,
+ * to be used when a THEAD/TFOOT/TBODY ends. */
+static void Stbl_cancelRowSpans(STable_info *me)
+{
+ int i;
+
+ CTRACE2(TRACE_TRST, (tfp, "TRST:Stbl_cancelRowSpans()"));
+ for (i = me->nrows; i < me->allocated_rows; i++) {
+ if (!me->rows[i].ncells) { /* should always be the case */
+ FREE(me->rows[i].cells);
+ me->rows[i].allocated = 0;
+ }
+ }
+ free_rowinfo(&me->rowspans2eog);
+ me->rowspans2eog.allocated = 0;
+}
+
+/*
+ * Returns -1 on error, otherwise index of just-added table row.
+ */
+int Stbl_addRowToTable(STable_info *me, int alignment,
+ int lineno)
+{
+ STable_rowinfo *rows, *row;
+ STable_states *s = &me->s;
+
+ CTRACE2(TRACE_TRST,
+ (tfp, "TRST:Stbl_addRowToTable(alignment=%d, lineno=%d)\n",
+ alignment, lineno));
+ if (me->nrows > 0 && me->rows[me->nrows - 1].ncells > 0) {
+ if (s->pending_len > 0)
+ me->rows[me->nrows - 1].cells[
+ me->rows[me->nrows - 1].ncells - 1
+ ].len =
+ s->pending_len;
+ s->pending_len = 0;
+ }
+ Stbl_finishRowInTable(me);
+ if (me->nrows > 0 && me->rows[me->nrows - 1].Line == lineno)
+ me->rows[me->nrows - 1].Line = -1;
+ s->pending_len = 0;
+ s->x_td = -1;
+
+ {
+ int i;
+ int growby = 0;
+
+ while (me->nrows + 2 >= me->allocated_rows + growby)
+ growby += ROWS_GROWBY;
+ if (growby) {
+ if (me->allocated_rows == 0 && !me->rows) {
+ rows = typecallocn(STable_rowinfo, (unsigned) growby);
+ } else {
+ rows = typeRealloc(STable_rowinfo, me->rows,
+ (unsigned) (me->allocated_rows + growby));
+
+ for (i = 0; rows && i < growby; i++) {
+ row = rows + me->allocated_rows + i;
+ if (!me->rowspans2eog.allocated) {
+ row->allocated = 0;
+ row->cells = NULL;
+ } else {
+ row->cells = typecallocn(STable_cellinfo,
+ (unsigned) me->rowspans2eog.allocated);
+
+ if (row->cells) {
+ row->allocated = me->rowspans2eog.allocated;
+ memcpy(row->cells, me->rowspans2eog.cells,
+ (unsigned) row->allocated * sizeof(STable_cellinfo));
+ } else {
+ FREE(rows);
+ break;
+ }
+ }
+ row->ncells = 0;
+ row->fixed_line = NO;
+ row->alignment = HT_ALIGN_NONE;
+ row->offset = 0;
+ row->content = 0;
+ }
+ }
+ if (rows) {
+ me->allocated_rows += growby;
+ me->rows = rows;
+ } else {
+ return -1;
+ }
+ }
+ }
+
+ me->rows[me->nrows].Line = lineno;
+ if (me->nrows == 0)
+ me->startline = lineno;
+ if (alignment != HT_ALIGN_NONE)
+ me->rows[me->nrows].alignment = alignment;
+ else
+ me->rows[me->nrows].alignment =
+ (me->rowgroup_align == HT_ALIGN_NONE) ?
+ me->alignment : me->rowgroup_align;
+ me->nrows++;
+ if (me->pending_colgroup_next > me->ncolinfo) {
+ me->ncolinfo = me->pending_colgroup_next;
+ me->pending_colgroup_next = 0;
+ }
+ me->rows[me->nrows].Line = -1; /* not yet used */
+ me->rows[me->nrows].ended = ROW_not_ended; /* No </tr> yet */
+ return (me->nrows - 1);
+}
+
+/*
+ * Returns -1 on error, otherwise current number of rows.
+ */
+static int Stbl_finishRowInTable(STable_info *me)
+{
+ STable_rowinfo *lastrow;
+ STable_states *s = &me->s;
+
+ CTRACE2(TRACE_TRST, (tfp, "TRST:Stbl_finishRowInTable()\n"));
+ if (!me->rows || !me->nrows)
+ return -1; /* no row started! */
+ lastrow = me->rows + (me->nrows - 1);
+ lastrow->ended = ROW_ended_by_endtr;
+ if (lastrow->ncells > 0) {
+ if (s->pending_len > 0)
+ lastrow->cells[lastrow->ncells - 1].len = s->pending_len;
+ s->pending_len = 0;
+ }
+ s->prev_state = s->state = CS_invalid;
+ s->lineno = -1;
+
+ if (s->icell_core >= 0 && !lastrow->fixed_line &&
+ lastrow->cells[s->icell_core].cLine >= 0)
+ lastrow->Line = lastrow->cells[s->icell_core].cLine;
+ s->icell_core = -1;
+ return (me->nrows);
+}
+
+static void update_sumcols0(STable_cellinfo *sumcols,
+ STable_rowinfo *lastrow,
+ int pos,
+ int len,
+ int icell,
+ int ispan,
+ int allocated_sumcols)
+{
+ int i;
+
+ if (len > 0) {
+ int sumpos = pos;
+ int prevsumpos = sumcols[icell + ispan].pos;
+ int advance;
+
+ if (ispan > 0) {
+ if (lastrow->cells[icell].pos + len > sumpos)
+ sumpos = lastrow->cells[icell].pos + len;
+ if (sumcols[icell + ispan - 1].pos +
+ sumcols[icell + ispan - 1].len >
+ sumpos)
+ sumpos = sumcols[icell + ispan - 1].pos +
+ sumcols[icell + ispan - 1].len;
+ }
+ advance = sumpos - prevsumpos;
+ if (advance > 0) {
+ for (i = icell + ispan; i < allocated_sumcols; i++) {
+ if (ispan > 0 && sumcols[i].colspan < -1) {
+ if (i + sumcols[i].colspan < icell + ispan) {
+ advance = sumpos - sumcols[i].pos;
+ if (i > 0)
+ advance = HTMAX(advance,
+ sumcols[i - 1].pos +
+ sumcols[i - 1].len
+ - (sumcols[i].pos));
+ if (advance <= 0)
+ break;
+ }
+ }
+ if (sumcols[i].pos >= 0)
+ sumcols[i].pos += advance;
+ else {
+ sumcols[i].pos = sumpos;
+ break;
+ }
+ }
+ }
+ }
+}
+
+static int get_remaining_colspan(STable_rowinfo *me,
+ STable_cellinfo *colinfo,
+ int ncolinfo,
+ int colspan,
+ int ncols_sofar)
+{
+ int i;
+ int last_colspan = (me->ncells
+ ? me->cells[me->ncells - 1].colspan
+ : 1);
+
+ if (ncolinfo == 0 || me->ncells + last_colspan > ncolinfo) {
+ colspan = HTMIN(TRST_MAXCOLSPAN,
+ ncols_sofar - (me->ncells + last_colspan - 1));
+ colspan = HTMAX(colspan, 0);
+ } else {
+ for (i = me->ncells + last_colspan - 1; i < ncolinfo - 1; i++)
+ if (colinfo[i].cLine == EOCOLG)
+ break;
+ colspan = i - (me->ncells + last_colspan - 2);
+ }
+ CTRACE2(TRACE_TRST,
+ (tfp, "TRST:get_remaining_colspan; colspan = %d\n",
+ colspan));
+ return colspan;
+}
+
+#ifdef EXP_NESTED_TABLES
+/* Returns -1 on failure, 1 if faking was performed, 0 if not needed. */
+static int Stbl_fakeFinishCellInTable(STable_info *me,
+ STable_rowinfo *lastrow,
+ int lineno,
+ int finishing) /* Processing finish or start */
+{
+ STable_states *s = &me->s;
+ int fake = 0;
+
+ switch (s->state) { /* We care only about trailing <BR> */
+ case CS_invalid:
+ case CS__0new:
+ case CS__0ef:
+ case CS__0cf:
+ case CS__new:
+ case CS__cbc:
+ case CS__ef:
+ case CS__cf:
+ default:
+ /* <BR></TD> may produce these (XXXX instead of CS__cbf?). But if
+ finishing==0, the caller already checked that we are on a
+ different line. */
+ if (finishing == 0)
+ fake = 1;
+ break; /* Either can't happen, or may be ignored */
+ case CS__eb:
+ case CS__0eb:
+ case CS__0cb:
+ case CS__cb:
+ fake = 1;
+ break;
+ }
+ if (fake) {
+ /* The previous action we did was putting a linebreak. Now we
+ want to put another one. Fake necessary
+ </TD></TR><TR><TD></TD><TD> (and possibly </TD>) instead. */
+ int ncells = lastrow->ncells;
+ int i;
+ int al = lastrow->alignment;
+ int cs = lastrow->cells[lastrow->ncells - 1].colspan;
+ int rs = 1; /* XXXX How to find rowspan? */
+ int ih = 0; /* XXXX How to find is_header? */
+ int end_td = (TRST_ENDCELL_ENDTD | TRST_FAKING_CELLS);
+ int need_reserved = 0;
+ int prev_reserved_last = -1;
+ STable_rowinfo *prev_row;
+ int prev_row_n2 = (int) (lastrow - me->rows);
+
+ CTRACE2(TRACE_TRST,
+ (tfp,
+ "TRST:Stbl_fakeFinishCellInTable(lineno=%d, finishing=%d) START FAKING\n",
+ lineno, finishing));
+
+ /* Although here we use pos=0, this may commit the previous
+ cell which had <BR> as a last element. This may overflow
+ the screen width, so the additional checks performed in
+ Stbl_finishCellInTable (comparing to Stbl_finishCellInRow)
+ are needed. */
+ if (finishing) {
+ /* Fake </TD> at BOL */
+ if (Stbl_finishCellInTable(me, end_td, lineno, 0, 0) < 0) {
+ return -1;
+ }
+ }
+
+ /* Fake </TR> at BOL */
+ /* Stbl_finishCellInTable(lineno, 0, 0); */
+ /* Needed? */
+
+ /* Fake <TR> at BOL */
+ if (Stbl_addRowToTable(me, al, lineno) < 0) {
+ return -1;
+ }
+ lastrow = me->rows + (me->nrows - 1);
+ lastrow->content = IS_CONTINUATION_OF_CELL;
+ for (i = 0; i < lastrow->allocated; i++) {
+ if (lastrow->cells[i].alignment == RESERVEDCELL) {
+ need_reserved = 1;
+ break;
+ }
+ }
+
+ prev_row = me->rows + prev_row_n2;
+ for (i = ncells; i < prev_row->allocated; i++) {
+ if (prev_row->cells[i].alignment == RESERVEDCELL)
+ prev_reserved_last = i;
+ }
+ if (need_reserved || prev_reserved_last >= 0) {
+ /* Oups, we are going to stomp over a line which somebody
+ cares about already, or the previous line had reserved
+ cells which were not skipped over.
+
+ Remember that STable_rowinfo is about logical (TR)
+ table lines, not displayed lines. We need to duplicate
+ the reservation structure when we fake new logical lines. */
+ int prev_row_n = (int) (prev_row - me->rows);
+ STable_rowinfo *rows = typeRealloc(STable_rowinfo, me->rows,
+ (unsigned) (me->allocated_rows
+ + 1));
+ int need_cells = prev_reserved_last + 1;
+ int n;
+
+ if (!rows)
+ return -1; /* ignore silently, no free memory, may be recoverable */
+
+ CTRACE2(TRACE_TRST,
+ (tfp, "TRST:Stbl_fakeFinishCellInTable REALLOC ROWSPAN\n"));
+ me->rows = rows;
+ lastrow = me->rows + (me->nrows - 1);
+ prev_row = me->rows + prev_row_n;
+ me->allocated_rows++;
+
+ /* Insert a duplicate row after lastrow */
+ for (n = me->allocated_rows - me->nrows - 1; n >= 0; --n)
+ lastrow[n + 1] = lastrow[n];
+
+ /* Ignore cells, they belong to the next row now */
+ lastrow->allocated = 0;
+ lastrow->cells = 0;
+ if (need_cells) {
+ lastrow->cells = typecallocn(STable_cellinfo, (unsigned) need_cells);
+
+ /* ignore silently, no free memory, may be recoverable */
+ if (!lastrow->cells) {
+ return -1;
+ }
+ lastrow->allocated = need_cells;
+ memcpy(lastrow->cells, prev_row->cells,
+ (unsigned) lastrow->allocated * sizeof(STable_cellinfo));
+
+ i = -1;
+ while (++i < ncells) {
+ /* Stbl_addCellToTable grants RESERVEDCELL, but we do not
+ want this action for fake cells.
+ XXX Maybe always fake RESERVEDCELL instead of explicitly
+ creating/destroying cells? */
+ if (lastrow->cells[i].alignment == RESERVEDCELL)
+ lastrow->cells[i].alignment = HT_LEFT;
+ }
+ }
+ }
+
+ /* Fake <TD></TD>...<TD> (and maybe a </TD>) at BOL. */
+ CTRACE2(TRACE_TRST,
+ (tfp, "TRST:Stbl_fakeFinishCellInTable FAKE %d elts%s\n",
+ ncells, (finishing ? ", last unfinished" : "")));
+ i = 0;
+ while (++i <= ncells) {
+ /* XXXX A lot of args may be wrong... */
+ if (Stbl_addCellToTable(me, (i == ncells ? cs : 1), rs, al,
+ ih, lineno, 0, 0) < 0) {
+ return -1;
+ }
+ lastrow->content &= ~HAS_BEG_OF_CELL; /* BEG_OF_CELL was fake */
+ /* We cannot run out of width here, so it is safe to not
+ call Stbl_finishCellInTable(), but Stbl_finishCellInRow. */
+ if (!finishing || (i != ncells)) {
+ if (Stbl_finishCellInRow(lastrow, s, end_td, lineno, 0) < 0) {
+ return -1;
+ }
+ }
+ }
+ CTRACE2(TRACE_TRST,
+ (tfp,
+ "TRST:Stbl_fakeFinishCellInTable(lineno=%d) FINISH FAKING\n",
+ lineno));
+ return 1;
+ }
+ return 0;
+}
+#endif
+
+/*
+ * Returns -1 on error, otherwise 0.
+ */
+int Stbl_addCellToTable(STable_info *me, int colspan,
+ int rowspan,
+ int alignment,
+ int isheader,
+ int lineno,
+ int offset_not_used_yet GCC_UNUSED,
+ int pos)
+{
+ STable_states *s = &me->s;
+ STable_rowinfo *lastrow;
+ STable_cellinfo *sumcols, *sumcol;
+ int i, icell, ncells, sumpos;
+
+ CTRACE2(TRACE_TRST,
+ (tfp,
+ "TRST:Stbl_addCellToTable(lineno=%d, pos=%d, isheader=%d, cs=%d, rs=%d, al=%d)\n",
+ lineno, pos, (int) isheader, colspan, rowspan, alignment));
+ if (!me->rows || !me->nrows)
+ return -1; /* no row started! */
+ /* ##850_fail_if_fail?? */
+ if (me->rows[me->nrows - 1].ended != ROW_not_ended) {
+ Stbl_addRowToTable(me, alignment, lineno);
+ }
+ Stbl_finishCellInTable(me, TRST_ENDCELL_ENDTD, lineno, 0, pos);
+ lastrow = me->rows + (me->nrows - 1);
+
+#ifdef EXP_NESTED_TABLES
+ if (nested_tables) {
+ /* If the last cell was finished by <BR></TD>, we need to fake an
+ appropriate amount of cells */
+ if (!NO_AGGRESSIVE_NEWROW && pos == 0 && lastrow->ncells > 0
+ && lastrow->cells[lastrow->ncells - 1].cLine != lineno) {
+ int rc;
+
+ rc = Stbl_fakeFinishCellInTable(me, lastrow, lineno, 0);
+
+ if (rc < 0)
+ return -1;
+ if (rc)
+ lastrow = me->rows + (me->nrows - 1);
+ }
+ }
+#endif
+ if (colspan == 0) {
+ colspan = get_remaining_colspan(lastrow, me->sumcols, me->ncolinfo,
+ colspan, me->ncols);
+ }
+ ncells = lastrow->ncells; /* remember what it was before adding cell. */
+ icell = Stbl_addCellToRow(lastrow, me->sumcols, me->ncolinfo, s,
+ colspan, alignment, isheader,
+ lineno, &pos);
+ if (icell < 0)
+ return icell;
+ if (me->nrows == 1 && me->startline < lastrow->Line)
+ me->startline = lastrow->Line;
+
+ if (rowspan != 1) {
+ Stbl_reserveCellsInTable(me, icell, colspan, rowspan);
+ /* me->rows may now have been realloc'd, make lastrow valid pointer */
+ lastrow = me->rows + (me->nrows - 1);
+ }
+ lastrow->content |= HAS_BEG_OF_CELL;
+
+ {
+ int growby = 0;
+
+ while (icell + colspan + 1 >= me->allocated_sumcols + growby)
+ growby += CELLS_GROWBY;
+ if (growby) {
+ if (me->allocated_sumcols == 0 && !me->sumcols) {
+ sumcols = typecallocn(STable_cellinfo, (unsigned) growby);
+ } else {
+ sumcols = typeRealloc(STable_cellinfo, me->sumcols,
+ (unsigned) (me->allocated_sumcols + growby));
+
+ for (i = 0; sumcols && i < growby; i++) {
+ sumcol = sumcols + me->allocated_sumcols + i;
+ sumcol->pos = sumcols[me->allocated_sumcols - 1].pos;
+ sumcol->len = 0;
+ sumcol->colspan = 0;
+ sumcol->cLine = 0;
+ sumcol->alignment = HT_ALIGN_NONE;
+ }
+ }
+ if (sumcols) {
+ me->allocated_sumcols += growby;
+ me->sumcols = sumcols;
+ } else {
+ return -1;
+ }
+ }
+ }
+ if (icell + 1 > me->ncols) {
+ me->ncols = icell + 1;
+ }
+ if (colspan > 1 && colspan + me->sumcols[icell + colspan].colspan > 0)
+ me->sumcols[icell + colspan].colspan = -colspan;
+ sumpos = pos;
+ if (ncells > 0)
+ sumpos += me->sumcols[ncells - 1].pos - lastrow->cells[ncells - 1].pos;
+ update_sumcols0(me->sumcols, lastrow, sumpos,
+ sumpos - me->sumcols[icell].pos,
+ icell, 0, me->allocated_sumcols);
+
+ me->maxpos = me->sumcols[me->allocated_sumcols - 1].pos;
+ if (me->maxpos > /* @@@ max. line length we can accept */ MAX_STBL_POS)
+ return -1;
+ return 0;
+}
+
+/*
+ * Returns -1 on error, otherwise 0.
+ */
+int Stbl_finishCellInTable(STable_info *me, int end_td,
+ int lineno,
+ int offset,
+ int pos)
+{
+ STable_states *s = &me->s;
+ STable_rowinfo *lastrow;
+ int len, xlen, icell;
+ int i;
+
+ CTRACE2(TRACE_TRST,
+ (tfp,
+ "TRST:Stbl_finishCellInTable(lineno=%d, pos=%d, off=%d, end_td=%d)\n",
+ lineno, pos, offset, (int) end_td));
+ if (me->nrows == 0)
+ return -1;
+ lastrow = me->rows + (me->nrows - 1);
+ icell = lastrow->ncells - 1;
+ if (icell < 0)
+ return icell;
+ if (s->x_td == -1) { /* Stray </TD> or just-in-case, as on </TR> */
+ if ((end_td & TRST_ENDCELL_MASK) == TRST_ENDCELL_LINEBREAK)
+ lastrow->ended = ROW_ended_by_splitline;
+ return 0;
+ }
+#ifdef EXP_NESTED_TABLES
+ if (nested_tables) {
+ if (!NO_AGGRESSIVE_NEWROW && !(end_td & TRST_FAKING_CELLS)) {
+ int rc;
+
+ rc = Stbl_fakeFinishCellInTable(me, lastrow, lineno, 1);
+
+ if (rc) {
+ if (rc < 0)
+ return -1;
+ lastrow = me->rows + (me->nrows - 1);
+ icell = lastrow->ncells - 1;
+ }
+ }
+ }
+#endif
+ len = Stbl_finishCellInRow(lastrow, s, end_td, lineno, pos);
+ if (len == -1) {
+ return len;
+ }
+ xlen = (len > 0) ? len : s->pending_len; /* ##890 use xlen if fixed_line?: */
+ if (lastrow->Line == lineno)
+ len = xlen;
+ if (lastrow->cells[icell].colspan > 1) {
+ /*
+ * @@@ This is all a too-complicated mess; do we need
+ * sumcols len at all, or is pos enough??
+ * Answer: sumcols len is at least used for center/right
+ * alignment, and should probably continue to be used there;
+ * all other uses are probably not necessary.
+ */
+ int spanlen = 0, spanlend = 0;
+
+ for (i = icell; i < icell + lastrow->cells[icell].colspan; i++) {
+ if (me->sumcols[i].len > 0) {
+ spanlen += me->sumcols[i].len;
+ if (i > icell)
+ spanlen++;
+ }
+ spanlend = HTMAX(spanlend,
+ me->sumcols[i + 1].pos - me->sumcols[icell].pos);
+ }
+ if (spanlend)
+ spanlend--;
+ if (spanlend > spanlen)
+ spanlen = spanlend;
+ /* @@@ could overcount? */
+ if (len > spanlen)
+ me->maxlen += (len - spanlen);
+ } else if (len > me->sumcols[icell].len) {
+ if (me->sumcols[icell + 1].colspan >= -1)
+ me->maxlen += (len - me->sumcols[icell].len);
+ me->sumcols[icell].len = len;
+ }
+
+ if (len > 0) {
+ update_sumcols0(me->sumcols, lastrow, pos, len,
+ icell, lastrow->cells[icell].colspan,
+ me->allocated_sumcols);
+ me->maxpos = me->sumcols[me->allocated_sumcols - 1].pos;
+ }
+
+ if ((end_td & TRST_ENDCELL_MASK) == TRST_ENDCELL_LINEBREAK) {
+ lastrow->ended = ROW_ended_by_splitline;
+ lastrow->content |= BELIEVE_OFFSET;
+ lastrow->offset = offset;
+ }
+#ifdef EXP_NESTED_TABLES /* maxlen may already include contribution of a cell in this column */
+ if (nested_tables) {
+ if (me->maxlen > MAX_STBL_POS) {
+ return -1;
+ }
+ } else
+#endif
+ {
+ if (me->maxlen + (xlen - len) > MAX_STBL_POS)
+ return -1;
+ }
+ if (me->maxpos > /* @@@ max. line length we can accept */ MAX_STBL_POS) {
+ return -1;
+ }
+
+ if (lineno != lastrow->Line) {
+ /* @@@ Do something here? Or is it taken care of in
+ Stbl_finishCellInRow ? */
+ }
+
+ return 0;
+}
+
+/*
+ * Returns -1 on error, otherwise 0.
+ */
+int Stbl_addColInfo(STable_info *me,
+ int colspan,
+ int alignment,
+ int isgroup)
+{
+ STable_cellinfo *sumcols, *sumcol;
+ int i, icolinfo;
+
+ CTRACE2(TRACE_TRST,
+ (tfp, "TRST:Stbl_addColInfo(cs=%d, al=%d, isgroup=%d)\n",
+ colspan, alignment, (int) isgroup));
+ if (isgroup) {
+ if (me->pending_colgroup_next > me->ncolinfo)
+ me->ncolinfo = me->pending_colgroup_next;
+ me->pending_colgroup_next = me->ncolinfo + colspan;
+ if (me->ncolinfo > 0)
+ me->sumcols[me->ncolinfo - 1].cLine = EOCOLG;
+ me->pending_colgroup_align = (short) alignment;
+ } else {
+ for (i = me->pending_colgroup_next - 1;
+ i >= me->ncolinfo + colspan; i--)
+ me->sumcols[i].alignment = HT_ALIGN_NONE;
+ me->pending_colgroup_next = me->ncolinfo + colspan;
+ }
+ icolinfo = me->ncolinfo;
+ if (!isgroup)
+ me->ncolinfo += colspan;
+
+ {
+ int growby = 0;
+
+ while (icolinfo + colspan + 1 >= me->allocated_sumcols + growby)
+ growby += CELLS_GROWBY;
+ if (growby) {
+ if (me->allocated_sumcols == 0) {
+ sumcols = typecallocn(STable_cellinfo, (unsigned) growby);
+ } else {
+ sumcols = typeRealloc(STable_cellinfo, me->sumcols,
+ (unsigned) (me->allocated_sumcols + growby));
+
+ for (i = 0; sumcols && i < growby; i++) {
+ sumcol = sumcols + me->allocated_sumcols + i;
+ sumcol->pos = sumcols[me->allocated_sumcols - 1].pos;
+ sumcol->len = 0;
+ sumcol->colspan = 0;
+ sumcol->cLine = 0;
+ }
+ }
+ if (sumcols) {
+ me->allocated_sumcols += growby;
+ me->sumcols = sumcols;
+ } else {
+ return -1;
+ }
+ }
+ }
+
+ if (alignment == HT_ALIGN_NONE)
+ alignment = me->pending_colgroup_align;
+ for (i = icolinfo; i < icolinfo + colspan; i++) {
+ me->sumcols[i].alignment = alignment;
+ }
+ return 0;
+}
+
+/*
+ * Returns -1 on error, otherwise 0.
+ */
+int Stbl_finishColGroup(STable_info *me)
+{
+ CTRACE2(TRACE_TRST, (tfp, "TRST:Stbl_finishColGroup()\n"));
+ if (me->pending_colgroup_next >= me->ncolinfo) {
+ me->ncolinfo = me->pending_colgroup_next;
+ if (me->ncolinfo > 0)
+ me->sumcols[me->ncolinfo - 1].cLine = EOCOLG;
+ }
+ me->pending_colgroup_next = 0;
+ me->pending_colgroup_align = HT_ALIGN_NONE;
+ return 0;
+}
+
+int Stbl_addRowGroup(STable_info *me, int alignment)
+{
+ CTRACE2(TRACE_TRST, (tfp, "TRST:Stbl_addRowGroup()\n"));
+ Stbl_cancelRowSpans(me);
+ me->rowgroup_align = (short) alignment;
+ return 0; /* that's all! */
+}
+
+int Stbl_finishTABLE(STable_info *me)
+{
+ STable_states *s = &me->s;
+ int i;
+ int curpos = 0;
+
+ CTRACE2(TRACE_TRST, (tfp, "TRST:Stbl_finishTABLE()\n"));
+ if (!me || me->nrows <= 0 || me->ncols <= 0) {
+ return -1;
+ }
+ if (me->nrows > 0 && me->rows[me->nrows - 1].ncells > 0) {
+ if (s->pending_len > 0)
+ me->rows[me->nrows - 1].cells[
+ me->rows[me->nrows - 1].ncells - 1
+ ].len = s->pending_len;
+ s->pending_len = 0;
+ }
+ Stbl_finishRowInTable(me);
+ /* take into account offsets on multi-line cells.
+ XXX We cannot do it honestly, since two cells on the same row may
+ participate in multi-line table entries, and we preserve only
+ one offset per row. This implementation may ignore
+ horizontal offsets for the last row of a multirow table entry. */
+ for (i = 0; i < me->nrows - 1; i++) {
+ int j = i + 1, leading = i, non_empty = 0;
+ STable_rowinfo *nextrow = me->rows + j;
+ int minoffset, have_offsets;
+ int foundcell = -1, max_width;
+
+ if ((nextrow->content & (IS_CONTINUATION_OF_CELL | HAS_BEG_OF_CELL | BELIEVE_OFFSET))
+ != (IS_CONTINUATION_OF_CELL | BELIEVE_OFFSET))
+ continue; /* Not a continuation line */
+ minoffset = nextrow[-1].offset; /* Line before first continuation */
+ CTRACE2(TRACE_TRST, (tfp,
+ "TRST:Stbl_finishTABLE, l=%d, offset=%d, ended=%u.\n",
+ i, nextrow[-1].offset, nextrow[-1].ended));
+
+ /* Find the common part of the requested offsets */
+ while (j < me->nrows
+ && ((nextrow->content &
+ (IS_CONTINUATION_OF_CELL
+ | HAS_BEG_OF_CELL
+ | BELIEVE_OFFSET))
+ == (IS_CONTINUATION_OF_CELL | BELIEVE_OFFSET))) {
+ if (minoffset > nextrow->offset)
+ minoffset = nextrow->offset;
+ CTRACE2(TRACE_TRST,
+ (tfp,
+ "TRST:Stbl_finishTABLE, l=%d, offset=%d, ended=%u.\n",
+ j, nextrow->offset, nextrow[-1].ended));
+ nextrow++;
+ j++;
+ }
+ i = j - 1; /* Continue after this line */
+ /* Cancel the common part of offsets */
+ j = leading; /* Restart */
+ nextrow = me->rows + j; /* Line before first continuation */
+ have_offsets = 0;
+ nextrow->content |= OFFSET_IS_VALID_LAST_CELL;
+ while (j <= i) { /* A continuation line */
+ nextrow->offset -= minoffset;
+ nextrow->content |= OFFSET_IS_VALID;
+ if (nextrow->offset)
+ have_offsets = 1;
+ nextrow++;
+ j++;
+ }
+ if (!have_offsets)
+ continue; /* No offsets to deal with */
+
+ /* Find the cell number */
+ foundcell = -1;
+ j = leading + 1; /* Restart */
+ nextrow = me->rows + j; /* First continuation line */
+ while (foundcell == -1 && j <= i) { /* A continuation line */
+ int curcell = -1;
+
+ while (foundcell == -1 && ++curcell < nextrow->ncells)
+ if (nextrow->cells[curcell].len)
+ foundcell = curcell, non_empty = j;
+ nextrow++;
+ j++;
+ }
+ if (foundcell == -1) /* Can it happen? */
+ continue;
+ /* Find the max width */
+ max_width = 0;
+ j = leading; /* Restart */
+ nextrow = me->rows + j; /* Include the pre-continuation line */
+ while (j <= i) { /* A continuation line */
+ if (nextrow->ncells > foundcell) {
+ int curwid = nextrow->cells[foundcell].len + nextrow->offset;
+
+ if (curwid > max_width)
+ max_width = curwid;
+ }
+ nextrow++;
+ j++;
+ }
+ /* Update the widths */
+ j = non_empty; /* Restart from the first nonempty */
+ nextrow = me->rows + j;
+ /* Register the increase of the width */
+ update_sumcols0(me->sumcols, me->rows + non_empty,
+ 0 /* width only */ , max_width,
+ foundcell, nextrow->cells[foundcell].colspan,
+ me->allocated_sumcols);
+ j = leading; /* Restart from pre-continuation */
+ nextrow = me->rows + j;
+ while (j <= i) { /* A continuation line */
+ if (nextrow->ncells > foundcell)
+ nextrow->cells[foundcell].len = max_width;
+ nextrow++;
+ j++;
+ }
+ } /* END of Offsets processing */
+
+ for (i = 0; i < me->ncols; i++) {
+ if (me->sumcols[i].pos < curpos) {
+ me->sumcols[i].pos = curpos;
+ } else {
+ curpos = me->sumcols[i].pos;
+ }
+ if (me->sumcols[i].len > 0) {
+ curpos += me->sumcols[i].len;
+ }
+ }
+ /* need to recheck curpos: though it is checked each time a cell
+ is added, sometimes the result is ignored, as in split_line(). */
+ return (curpos > MAX_STBL_POS ? -1 : me->ncols);
+}
+
+short Stbl_getAlignment(STable_info *me)
+{
+ return (short) (me ? me->alignment : HT_ALIGN_NONE);
+}
+
+static int get_fixup_positions(STable_rowinfo *me, int *oldpos,
+ int *newpos,
+ STable_cellinfo *sumcols)
+{
+ int i = 0, ip = 0;
+ int next_i, newlen;
+ int ninserts;
+
+ if (!me)
+ return -1;
+ while (i < me->ncells) {
+ int offset;
+
+ next_i = i + HTMAX(1, me->cells[i].colspan);
+ if (me->cells[i].cLine != me->Line) {
+ if (me->cells[i].cLine > me->Line)
+ break;
+ i = next_i;
+ continue;
+ }
+ oldpos[ip] = me->cells[i].pos;
+ if ((me->content & OFFSET_IS_VALID)
+ && (i == me->ncells - 1
+ || !((me->content & OFFSET_IS_VALID_LAST_CELL))))
+ offset = me->offset;
+ else
+ offset = 0;
+ newpos[ip] = sumcols[i].pos + offset;
+ if ((me->cells[i].alignment == HT_CENTER ||
+ me->cells[i].alignment == HT_RIGHT) &&
+ me->cells[i].len > 0) {
+ newlen = sumcols[next_i].pos - newpos[ip] - 1;
+ newlen = HTMAX(newlen, sumcols[i].len);
+ if (me->cells[i].len < newlen) {
+ if (me->cells[i].alignment == HT_RIGHT) {
+ newpos[ip] += newlen - me->cells[i].len;
+ } else {
+ newpos[ip] += (newlen - me->cells[i].len) / 2;
+ }
+ }
+ }
+ ip++;
+ i = next_i;
+ }
+ ninserts = ip;
+ return ninserts;
+}
+
+/*
+ * Returns -1 if we have no row for this lineno, or for other error,
+ * 0 or greater (number of oldpos/newpos pairs) if we have
+ * a table row.
+ */
+int Stbl_getFixupPositions(STable_info *me, int lineno,
+ int *oldpos,
+ int *newpos)
+{
+ STable_rowinfo *row;
+ int j;
+ int ninserts = -1;
+
+ if (!me || !me->nrows)
+ return -1;
+ for (j = 0; j < me->nrows; j++) {
+ row = me->rows + j;
+ if (row->Line == lineno) {
+ ninserts = get_fixup_positions(row, oldpos, newpos,
+ me->sumcols);
+ break;
+ }
+ }
+ return ninserts;
+}
+
+int Stbl_getStartLine(STable_info *me)
+{
+ if (!me)
+ return -1;
+ else
+ return me->startline;
+}
+
+#ifdef EXP_NESTED_TABLES
+
+int Stbl_getStartLineDeep(STable_info *me)
+{
+ if (!me)
+ return -1;
+ while (me->enclosing)
+ me = me->enclosing;
+ return me->startline;
+}
+
+void Stbl_update_enclosing(STable_info *me, int max_width,
+ int last_lineno)
+{
+ int l;
+
+ if (!me || !me->enclosing || !max_width)
+ return;
+ CTRACE2(TRACE_TRST,
+ (tfp, "TRST:Stbl_update_enclosing, width=%d, lines=%d...%d.\n",
+ max_width, me->startline, last_lineno));
+ for (l = me->startline; l <= last_lineno; l++) {
+ /* Fake <BR> in appropriate positions */
+ if (Stbl_finishCellInTable(me->enclosing,
+ TRST_ENDCELL_LINEBREAK,
+ l,
+ 0,
+ max_width) < 0) {
+ /* It is not handy to let the caller delete me->enclosing,
+ and it does not buy us anything. Do it directly. */
+ STable_info *stbl = me->enclosing;
+
+ CTRACE2(TRACE_TRST, (tfp,
+ "TRST:Stbl_update_enclosing: width too large, aborting enclosing\n"));
+ me->enclosing = 0;
+ while (stbl) {
+ STable_info *enclosing = stbl->enclosing;
+
+ Stbl_free(stbl);
+ stbl = enclosing;
+ }
+ break;
+ }
+ }
+ return;
+}
+
+void Stbl_set_enclosing(STable_info *me, STable_info *enclosing, struct _TextAnchor *enclosing_last_anchor_before_stbl)
+{
+ if (!me)
+ return;
+ me->enclosing = enclosing;
+ me->enclosing_last_anchor_before_stbl = enclosing_last_anchor_before_stbl;
+}
+
+STable_info *Stbl_get_enclosing(STable_info *me)
+{
+ if (!me)
+ return 0;
+ return me->enclosing;
+}
+
+struct _TextAnchor *Stbl_get_last_anchor_before(STable_info *me)
+{
+ if (!me)
+ return 0;
+ return me->enclosing_last_anchor_before_stbl;
+}
+#endif
diff --git a/src/TRSTable.h b/src/TRSTable.h
new file mode 100644
index 0000000..ffebf4a
--- /dev/null
+++ b/src/TRSTable.h
@@ -0,0 +1,50 @@
+/* $LynxId: TRSTable.h,v 1.16 2010/09/25 11:40:05 tom Exp $ */
+#ifndef TRSTABLE_H
+#define TRSTABLE_H
+
+#include <HTUtils.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+/* TRST_MAXCOLSPAN and TRST_MAXCOLSPAN are defined in userdefs.h */ typedef struct _STable_info STable_info;
+ extern STable_info *Stbl_startTABLE(int);
+ extern int Stbl_finishTABLE(STable_info *);
+ extern void Stbl_free(STable_info *);
+ extern int Stbl_addRowToTable(STable_info *, int, int);
+ extern int Stbl_addCellToTable(STable_info *, int, int, int, int, int,
+ int, int);
+ extern int Stbl_finishCellInTable(STable_info *, int, int, int, int);
+ extern int Stbl_addColInfo(STable_info *, int, int, int);
+ extern int Stbl_finishColGroup(STable_info *);
+ extern int Stbl_addRowGroup(STable_info *, int);
+
+#define TRST_ENDCELL_ENDTD 1
+#define TRST_ENDCELL_LINEBREAK 0
+#define TRST_ENDCELL_MASK 1
+#define TRST_FAKING_CELLS 2
+#define Stbl_lineBreak(stbl,l,off,pos) Stbl_finishCellInTable(stbl, TRST_ENDCELL_LINEBREAK, l, off, pos)
+
+ extern int Stbl_getStartLine(STable_info *);
+ extern int Stbl_getFixupPositions(STable_info *me, int lineno,
+ int *oldpos,
+ int *newpos);
+ extern short Stbl_getAlignment(STable_info *);
+
+#ifdef EXP_NESTED_TABLES
+ extern void Stbl_update_enclosing(STable_info *me, int max_width,
+ int last_lineno);
+ struct _TextAnchor;
+ extern void Stbl_set_enclosing(STable_info *me, STable_info *encl, struct _TextAnchor *last_anchor);
+ extern STable_info *Stbl_get_enclosing(STable_info *me);
+ extern struct _TextAnchor *Stbl_get_last_anchor_before(STable_info *me);
+ extern int Stbl_getStartLineDeep(STable_info *);
+
+#else
+#define Stbl_getStartLineDeep(t) Stbl_getStartLine(t)
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* TRSTABLE_H */
diff --git a/src/UCAuto.c b/src/UCAuto.c
new file mode 100644
index 0000000..2b17591
--- /dev/null
+++ b/src/UCAuto.c
@@ -0,0 +1,816 @@
+/*
+ * $LynxId: UCAuto.c,v 1.56 2021/06/09 22:29:43 tom Exp $
+ *
+ * This file contains code for changing the Linux console mode.
+ * Currently some names for font files are hardwired in here.
+ * You have to change this code if it needs accommodation for your
+ * system (or get the required files...).
+ *
+ * Depending on the Display Character Set switched to, and the previous
+ * one as far as it is known, system("setfont ...") and/or output of
+ * escape sequences to switch console mode are done. Curses will be
+ * temporarily suspended while that happens.
+ *
+ * NOTE that the setfont calls will also affect all other virtual consoles.
+ *
+ * Any ideas how to do this for other systems?
+ */
+
+#include <HTUtils.h>
+#include <LYUtils.h>
+
+#include <UCMap.h>
+#include <UCDefs.h>
+#include <UCAuto.h>
+#include <LYGlobalDefs.h>
+#include <LYStrings.h>
+#include <LYClean.h>
+#include <LYLeaks.h>
+#include <LYCharSets.h>
+
+#ifdef EXP_CHARTRANS_AUTOSWITCH
+
+#include <HTFile.h>
+#include <www_wait.h>
+
+#ifdef LINUX
+#include <sysexits.h> /* EX_DATAERR, etc. */
+#endif
+
+# ifdef CAN_SWITCH_DISPLAY_CHARSET
+char *charset_switch_rules;
+char *charsets_directory;
+int auto_other_display_charset = -1;
+int codepages[2];
+int real_charsets[2] =
+{-1, -1}; /* Non "auto-" charsets for the cps */
+int switch_display_charsets;
+
+# endif
+
+#ifdef HAVE_USE_LEGACY_CODING
+static int original_coding = 0;
+#endif
+
+# ifdef __EMX__
+/* If we "just include" <os2.h>, BOOLEAN conflicts. */
+# define BOOLEAN OS2_BOOLEAN /* This file doesn't use it, conflicts */
+# define INCL_VIO /* I want some Vio functions.. */
+# define INCL_DOSPROCESS /* TIB PIB. */
+# define INCL_DOSNLS /* DosQueryCp. */
+# include <os2.h> /* Misc stuff.. */
+# include <os2thunk.h> /* 32 bit to 16 bit pointer conv */
+# endif
+
+#ifdef LINUX
+typedef enum {
+ Is_Unset,
+ Is_Set,
+ Dunno,
+ Dont_Care
+} TGen_state_t;
+
+/*
+ * List the states the console has been set to via SCS (select character-set).
+ */
+typedef enum {
+ GN_Blat1, /* Latin-1 */
+ GN_Ucp437, /* PC -> PC */
+ GN_Kuser, /* user-defined */
+ GN_dunno,
+ GN_dontCare
+} TTransT_t;
+
+static char *T_font_fn = NULL; /* font filename */
+static char *T_umap_fn = NULL; /* unicode-map filename */
+
+#define NOOUTPUT "2>/dev/null >/dev/null"
+
+/*
+ * Return the configured path of the setfont/consolechars program.
+ */
+static const char *GetSetfontPath(void)
+{
+ return HTGetProgramPath(ppSETFONT);
+}
+
+/*
+ * setfont and consolechars have different options and available data.
+ */
+static BOOL isSetFont(void)
+{
+ const char *program = GetSetfontPath();
+ const char *slash = strrchr(program, '/');
+ const char *leaf = (slash ? slash + 1 : program);
+
+ return (BOOL) !strcmp(leaf, "setfont");
+}
+
+/*
+ * Here are the differences in options which affect lynx:
+ */
+#define setfont_u() (isSetFont() ? "-u " : "--sfm ")
+#define setfont_o() (isSetFont() ? "-o " : "--old-font-raw ")
+#define setfont_ou() (isSetFont() ? "-ou " : "--old-sfm ")
+#define console_font() (isSetFont() ? "" : "--font ")
+
+/*
+ * call_setfont - execute "setfont" command via system()
+ * returns: 0 ok (as far as we know)
+ * -1 error (assume font and umap are not loaded)
+ * 1 error with umap (assume font loaded but umap empty)
+ */
+static int call_setfont(const char *font,
+ const char *fnsuffix,
+ const char *umap)
+{
+ const char *program = GetSetfontPath();
+ char *T_setfont_cmd = NULL;
+ int rv;
+
+ /*
+ * console-data package has only a few unicode maps.
+ */
+ if (!isSetFont())
+ umap = 0;
+
+ if ((font && T_font_fn && !strcmp(font, T_font_fn))
+ && (umap && T_umap_fn && !strcmp(umap, T_umap_fn))) {
+ /*
+ * No need to repeat.
+ */
+ return 0;
+ }
+ if (font)
+ StrAllocCopy(T_font_fn, font);
+ if (umap)
+ StrAllocCopy(T_umap_fn, umap);
+
+ if (!*fnsuffix)
+ fnsuffix = "";
+
+ if (non_empty(umap) && non_empty(font)) {
+ HTSprintf0(&T_setfont_cmd, "%s %s%s%s %s%s %s",
+ program,
+ console_font(), font, fnsuffix,
+ setfont_u(), umap,
+ NOOUTPUT);
+ } else if (non_empty(font)) {
+ HTSprintf0(&T_setfont_cmd, "%s %s%s%s %s",
+ program,
+ console_font(), font, fnsuffix,
+ NOOUTPUT);
+ } else if (non_empty(umap)) {
+ HTSprintf0(&T_setfont_cmd, "%s %s%s %s",
+ program,
+ setfont_u(), umap,
+ NOOUTPUT);
+ }
+
+ if (T_setfont_cmd) {
+ CTRACE((tfp, "Changing font: '%s'\n", T_setfont_cmd));
+ rv = LYSystem(T_setfont_cmd);
+ FREE(T_setfont_cmd);
+ if (rv) {
+ CTRACE((tfp, "call_setfont: system returned %d (0x%x)!\n",
+ rv, (unsigned) rv));
+ if (rv == -1 || WIFSIGNALED(rv) || !WIFEXITED(rv)) {
+ return -1;
+ } else if ((WEXITSTATUS(rv) == EX_DATAERR ||
+ WEXITSTATUS(rv) == EX_NOINPUT) &&
+ non_empty(umap)) {
+ /*
+ * Check if the font was loaded ok but something was wrong with
+ * the umap file.
+ */
+ return 1;
+ } else {
+ return -1;
+ }
+ }
+ }
+ return 0;
+}
+
+static void write_esc(const char *p)
+{
+ int fd = open("/dev/tty", O_WRONLY);
+
+ if (fd >= 0) {
+ IGNORE_RC(write(fd, p, strlen(p)));
+ close(fd);
+ }
+}
+
+static int nonempty_file(const char *p)
+{
+ struct stat sb;
+
+ return (stat(p, &sb) == 0 &&
+ S_ISREG(sb.st_mode) &&
+ (sb.st_size != 0));
+}
+
+static BOOL on_console(void)
+{
+ if ((non_empty(x_display)) ||
+ LYgetXDisplay() != NULL) {
+ /*
+ * We won't do anything in an xterm. Better that way...
+ */
+ return FALSE;
+ }
+ return TRUE;
+}
+
+/*
+ * This is the thing that actually gets called from display_page().
+ */
+void UCChangeTerminalCodepage(int newcs,
+ LYUCcharset *p)
+{
+ const char *program = GetSetfontPath();
+ static int lastcs = -1;
+ static const char *lastname = NULL;
+ static TTransT_t lastTransT = GN_dunno;
+ static TGen_state_t lastUtf = Dunno;
+ static TGen_state_t lastHasUmap = Dunno;
+
+ static char *old_font = NULL;
+ static char *old_umap = NULL;
+
+ const char *name;
+ TTransT_t TransT = GN_dunno;
+ TGen_state_t Utf = Dunno;
+ TGen_state_t HasUmap = Dunno;
+
+ char *tmpbuf1 = NULL;
+ char *tmpbuf2 = NULL;
+ int status = 0;
+
+ if (!on_console())
+ return;
+
+#ifdef HAVE_USE_LEGACY_CODING
+ if (newcs < 0) {
+ use_legacy_coding(original_coding);
+ } else {
+ original_coding = use_legacy_coding(2);
+ }
+#endif
+
+ /*
+ * Restore the original character set.
+ */
+ if (newcs < 0 || p == 0) {
+ if (non_empty(old_font) &&
+ non_empty(old_umap)) {
+
+ if (nonempty_file(old_font)) {
+ if (nonempty_file(old_umap)) {
+ HTSprintf0(&tmpbuf1, "%s %s%s %s%s %s",
+ program,
+ console_font(), old_font,
+ setfont_u(), old_umap,
+ NOOUTPUT);
+ } else {
+ HTSprintf0(&tmpbuf1, "%s %s%s %s",
+ program,
+ console_font(), old_font,
+ NOOUTPUT);
+ }
+ CTRACE((tfp, "Restoring font: '%s'\n", tmpbuf1));
+ status = LYSystem(tmpbuf1);
+ if (status != 0) {
+ CTRACE((tfp, "...system returned %d (0x%x)\n", status,
+ (unsigned) status));
+ }
+ FREE(tmpbuf1);
+ }
+ }
+ if (newcs < 0 && p == 0) {
+ if (old_font) {
+ (void) LYRemoveTemp(old_font);
+ FREE(old_font);
+ }
+ if (old_umap) {
+ (void) LYRemoveTemp(old_umap);
+ FREE(old_umap);
+ }
+ if (status == 0) {
+ FREE(T_font_fn);
+ FREE(T_umap_fn);
+ }
+ }
+ return;
+ } else if (lastcs < 0 && old_umap == 0 && old_font == 0) {
+ FILE *fp1;
+ FILE *fp2 = NULL;
+
+ if ((old_font = typecallocn(char, LY_MAXPATH)) != 0)
+ old_umap = typecallocn(char, LY_MAXPATH);
+
+ if (old_font == NULL)
+ outofmem(__FILE__, "UCChangeTerminalCodepage");
+
+ if ((fp1 = LYOpenTemp(old_font, ".fnt", BIN_W)) != 0)
+ fp2 = LYOpenTemp(old_umap, ".uni", BIN_W);
+
+ if (fp1 && fp2) {
+ size_t nlen;
+ int rv;
+
+ HTSprintf0(&tmpbuf1, "%s %s%s %s%s %s",
+ program,
+ setfont_o(), old_font,
+ setfont_ou(), old_umap,
+ NOOUTPUT);
+
+ CTRACE((tfp, "Saving font: '%s'\n", tmpbuf1));
+ rv = LYSystem(tmpbuf1);
+ if (rv != 0) {
+ CTRACE((tfp, "...system returned %d (0x%x)\n", rv, (unsigned) rv));
+ }
+ FREE(tmpbuf1);
+ LYCloseTempFP(fp1);
+ LYCloseTempFP(fp2);
+
+ /* free up a few bytes */
+ if ((nlen = strlen(old_font) + 1) < LY_MAXPATH)
+ old_font = typeRealloc(char, old_font, nlen);
+
+ if ((nlen = strlen(old_umap) + 1) < LY_MAXPATH)
+ old_umap = typeRealloc(char, old_umap, nlen);
+ } else {
+ if (fp1)
+ (void) LYRemoveTemp(old_font);
+ FREE(old_font);
+ FREE(old_umap);
+ }
+ }
+
+ name = p->MIMEname;
+
+ /*
+ * Font sizes are currently hardwired here.
+ */
+#define SUFF1 ".f16"
+#define SUFF2 "-16.psf"
+#define SUFF3 "-8x16"
+#define SUFF4 "8x16"
+#define SUFF5 ".cp -16"
+#define SUFF6 "_8x16"
+
+ /* NOTE: `!!umap not in kbd!!' comments below means that the *.uni file
+ * is not found in kbd package. Reference Debian Package: kbd-data,
+ * Version: 0.96a-14. They should be located elsewhere or generated.
+ * Also some cpNNN fonts used below are not in the kbd-data. - kw
+ */
+
+ if (!StrNCmp(name, "iso-8859-1", 10) &&
+ (!name[10] || !isdigit(UCH(name[10])))) {
+ if ((lastHasUmap == Is_Set) && !strcmp(lastname, "cp850")) {
+ /*
+ * cp850 already contains all latin1 characters.
+ */
+ if (lastTransT != GN_Blat1) {
+ TransT = GN_Blat1;
+ }
+ } else {
+ /*
+ * "setfont lat1u-16.psf -u lat1u.uni"
+ */
+ status = call_setfont("lat1u", SUFF2, "lat1u.uni");
+ HasUmap = Is_Set;
+ if (lastTransT != GN_Blat1) {
+ TransT = GN_Blat1;
+ }
+ }
+ Utf = Is_Unset;
+ } else if (!strcmp(name, "iso-8859-2")) {
+ /*
+ * "setfont iso02.f16 -u iso02.uni"
+ */
+ status = call_setfont("iso02", SUFF1, "iso02.uni");
+ TransT = GN_Kuser;
+ HasUmap = Is_Set;
+ Utf = Is_Unset;
+ } else if (!strcmp(name, "iso-8859-15")) {
+ /*
+ * "setfont lat0-16.psf"
+ */
+ status = call_setfont("lat0", SUFF2, NULL);
+ TransT = GN_Blat1; /* bogus! */
+ HasUmap = Dunno; /* distributed lat0 files have bogus map data! */
+ Utf = Is_Unset;
+ } else if (!StrNCmp(name, "iso-8859-", 9)) {
+ if (strlen(name) <= 10 || !isdigit(UCH(name[10])))
+ HTSprintf0(&tmpbuf1, "iso0%s", &name[9]);
+ else
+ HTSprintf0(&tmpbuf1, "iso%s", &name[9]);
+ HTSprintf0(&tmpbuf2, "%s.uni", tmpbuf1);
+ /*
+ * "setfont iso0N.f16 -u iso0N.uni"
+ */
+ status = call_setfont(tmpbuf1, SUFF1, tmpbuf2);
+ FREE(tmpbuf1);
+ FREE(tmpbuf2);
+ TransT = GN_Kuser;
+ HasUmap = Is_Set;
+ Utf = Is_Unset;
+ } else if (!strcmp(name, "koi8-r")) {
+ /*
+ * "setfont koi8-8x16"
+ * !!umap not in kbd!!
+ */
+ status = call_setfont("koi8", SUFF3, "koi8r.uni");
+ TransT = GN_Kuser;
+ HasUmap = Is_Set;
+ Utf = Is_Unset;
+ } else if (!strcmp(name, "koi8-u")) {
+ /*
+ * "setfont koi8u_8x16"
+ * !!umap not in kbd!!
+ */
+ status = call_setfont("koi8u", SUFF6, "koi8u.uni");
+ TransT = GN_Kuser;
+ HasUmap = Is_Set;
+ Utf = Is_Unset;
+ } else if (!strcmp(name, "cp437")) {
+ /*
+ * "setfont default8x16 -u cp437.uni"
+ */
+ status = call_setfont("default", SUFF4, "cp437.uni");
+ if (lastTransT == GN_Kuser || lastTransT == GN_Ucp437)
+ TransT = GN_dontCare;
+ else
+ TransT = GN_Ucp437;
+ HasUmap = Is_Set;
+ Utf = Is_Unset;
+ } else if (!strcmp(name, "cp850")) {
+ /*
+ * "setfont cp850-8x16 -u cp850.uni"
+ * !!umap not in kbd!!
+ */
+ status = call_setfont("cp850", SUFF3, "cp850.uni");
+ TransT = GN_Kuser;
+ HasUmap = Is_Set;
+ Utf = Is_Unset;
+ } else if (!strcmp(name, "cp866") ||
+ !strcmp(name, "cp852") ||
+ !strcmp(name, "cp862")) { /* MS-Kermit has these files */
+ HTSprintf0(&tmpbuf2, "%s.uni", name);
+ /*
+ * "setfont cpNNN.f16"
+ * !!umap not in kbd!!
+ */
+ status = call_setfont(name, SUFF1, tmpbuf2);
+ FREE(tmpbuf2);
+ TransT = GN_Kuser;
+ HasUmap = Is_Set;
+ Utf = Is_Unset;
+ } else if (!strcmp(name, "cp737")) {
+ /*
+ * "setfont cp737.cp"
+ * !!umap not in kbd!!
+ */
+ if (isSetFont()) {
+ status = call_setfont("737", SUFF5, "cp737.uni");
+ } else {
+ status = call_setfont("greek", "", "cp737.uni");
+ }
+ TransT = GN_Kuser;
+ HasUmap = Is_Set;
+ Utf = Is_Unset;
+ } else if (!strcmp(name, "cp857")) {
+ status = call_setfont("cp857", SUFF3, "cp857.uni");
+ TransT = GN_Kuser;
+ HasUmap = Is_Set;
+ Utf = Is_Unset;
+ } else if (!strcmp(name, "x-transparent")) {
+ Utf = Dont_Care;
+ } else if (!strcmp(name, "us-ascii")) {
+ Utf = Dont_Care;
+ } else if (!StrNCmp(name, "mnem", 4)) {
+ Utf = Dont_Care;
+ }
+
+ if (status == 1)
+ HasUmap = Is_Unset;
+ else if (status < 0) {
+ if (HasUmap == Is_Set)
+ HasUmap = Dunno;
+ name = "unknown-8bit";
+ }
+
+ if (TransT != lastTransT) {
+ if (TransT == GN_Blat1) {
+ /*
+ * Switch Linux console to lat1 table.
+ */
+ write_esc("\033(B");
+ } else if (TransT == GN_Ucp437) {
+ /*
+ * Switch Linux console to 437 table?
+ */
+ write_esc("\033(U");
+ } else if (TransT == GN_Kuser) {
+ /*
+ * Switch Linux console to user table.
+ */
+ write_esc("\033(K");
+ }
+ if (TransT != GN_dunno && TransT != GN_dontCare) {
+ lastTransT = TransT;
+ }
+ }
+
+ if (HasUmap != Dont_Care && HasUmap != Dunno)
+ lastHasUmap = HasUmap;
+
+ if (p->enc == UCT_ENC_UTF8) {
+ if (lastUtf != Is_Set) {
+ Utf = Is_Set;
+ /*
+ * Turn Linux console UTF8 mode ON.
+ */
+ write_esc("\033%G");
+ lastUtf = Utf;
+ }
+ return;
+ } else if (lastUtf == Is_Set && Utf != Dont_Care) {
+ Utf = Is_Unset;
+ /*
+ * Turn Linux console UTF8 mode OFF.
+ */
+ write_esc("\033%@");
+ lastUtf = Utf;
+ }
+
+ if (Utf != Dont_Care && Utf != Dunno)
+ lastUtf = Utf;
+
+ lastcs = newcs;
+ lastname = name;
+}
+
+#else /* Not LINUX: */
+/*
+ * This is the thing that actually gets called from display_page().
+ */
+void UCChangeTerminalCodepage(int newcs,
+ LYUCcharset *p)
+{
+#ifdef __EMX__
+ int res = 0;
+
+#ifdef HAVE_USE_LEGACY_CODING
+ if (newcs < 0) {
+ use_legacy_coding(original_coding);
+ } else {
+ original_coding = use_legacy_coding(2);
+ }
+#endif
+
+ if (newcs < 0)
+ newcs = auto_display_charset;
+ res = Switch_Display_Charset(newcs, SWITCH_DISPLAY_CHARSET_REALLY);
+ CTRACE((tfp,
+ "UCChangeTerminalCodepage: Switch_Display_Charset(%d) returned %d\n",
+ newcs, res));
+#else
+ CTRACE((tfp, "UCChangeTerminalCodepage: Called, but not implemented!"));
+#endif
+}
+#endif /* LINUX */
+
+#ifdef CAN_SWITCH_DISPLAY_CHARSET
+
+int Find_Best_Display_Charset(int ord)
+{
+ const char *name = LYCharSet_UC[ord].MIMEname;
+ char *s = charset_switch_rules, *r;
+ char buf[160];
+ static int lowercase;
+ int n = strlen(name), source = 1;
+
+ if (!s || !n)
+ return ord;
+ if (!lowercase++)
+ LYLowerCase(charset_switch_rules);
+ while (1) {
+ while (*s && StrChr(" \t,", *s))
+ s++; /* Go to start of a name or ':' */
+ if (!*s && source)
+ return ord; /* OK to find nothing */
+ if (!*s) {
+ sprintf(buf,
+ gettext("No destination for '%.80s' in CHARSET_SWITCH_RULES"),
+ name);
+ HTInfoMsg(buf);
+ return ord;
+ }
+ if (*s == ':') {
+ /* Before the replacement name */
+ while (*s && StrChr(" \t:", *s))
+ s++; /* Go to the replacement */
+ /* At start of the replacement name */
+ r = s;
+ while (*s && !StrChr(" \t,:", *s))
+ s++; /* Skip the replacement */
+ if (source)
+ continue;
+ break;
+ }
+ /* At start of the source name */
+ if (source && !strncasecomp(name, s, n) && StrChr(" \t,", s[n])) { /* Found! */
+ source = 0;
+ s += n;
+ continue; /* Look for the replacement */
+ }
+ while (*s && !StrChr(" \t,:", *s))
+ s++; /* Skip the other source names */
+ }
+ /* Here r point to the replacement, s to the end of the replacement. */
+ if (s >= r + sizeof(buf)) {
+ HTInfoMsg(gettext("Charset name in CHARSET_SWITCH_RULES too long"));
+ return ord;
+ }
+ LYStrNCpy(buf, r, s - r);
+ n = UCGetLYhndl_byMIME(buf);
+ if (n < 0) {
+ sprintf(buf,
+ gettext("Unknown charset name '%.*s' in CHARSET_SWITCH_RULES"),
+ s - r, r);
+ HTInfoMsg(buf);
+ return ord;
+ }
+ return n;
+}
+
+# ifdef __EMX__
+/* Switch display for the best fit for LYCharSet_UC[ord].
+ If really is MAYBE, the switch is tentative only, another switch may happen
+ before the actual display.
+
+ Returns the charset we switched to. */
+static int _Switch_Display_Charset(int ord, enum switch_display_charset_t really)
+{
+ const char *name;
+ unsigned short cp;
+ static int font_loaded_for = -1, old_h, old_w;
+ int rc, ord1;
+ UCHAR msgbuf[MAXPATHLEN + 80];
+
+ CTRACE((tfp, "_Switch_Display_Charset(cp=%d, really=%d).\n", ord, really));
+ /* Do not trust current_char_set unless REALLY, we fake it if MAYBE! */
+ if (ord == current_char_set && really == SWITCH_DISPLAY_CHARSET_MAYBE)
+ return ord;
+ if (ord == auto_other_display_charset
+ || ord == auto_display_charset || ord == font_loaded_for) {
+ if (really == SWITCH_DISPLAY_CHARSET_MAYBE)
+ return ord; /* Report success, to avoid flicker, switch later */
+ } else /* Currently supports only koi8-r to cp866 translation */
+ ord = Find_Best_Display_Charset(ord);
+
+ /* Ignore sizechange unless the font is loaded */
+ if (ord != font_loaded_for && really == SWITCH_DISPLAY_CHARSET_RESIZE)
+ return ord;
+
+ if (ord == real_charsets[0] || ord == real_charsets[1]) {
+ ord1 = (ord == real_charsets[1]
+ ? auto_other_display_charset : auto_display_charset);
+ if (really == SWITCH_DISPLAY_CHARSET_MAYBE)
+ return ord; /* Can switch later, report success to avoid flicker */
+ } else
+ ord1 = ord;
+ if (ord == current_char_set && really == SWITCH_DISPLAY_CHARSET_MAYBE)
+ return ord;
+
+ name = LYCharSet_UC[ord1].MIMEname;
+ if (ord1 == auto_other_display_charset || ord1 == auto_display_charset) {
+ retry:
+ rc = VioSetCp(0, codepages[ord1 == auto_other_display_charset], 0);
+ if (rc == 0)
+ goto report;
+ err:
+ sprintf(msgbuf, gettext("Can't change to '%s': err=%#x=%d"), name, rc, rc);
+ HTInfoMsg(msgbuf);
+ return -1;
+ }
+
+ /* Not a "prepared" codepage. Need to load the user font. */
+ if (charsets_directory) {
+ TIB *tib; /* Can't load font in a windowed-VIO */
+ PIB *pib;
+ VIOFONTINFO f[2];
+ VIOFONTINFO *font;
+ UCHAR b[1 << 17];
+ UCHAR *buf = b;
+ UCHAR fnamebuf[MAXPATHLEN];
+ FILE *file;
+ APIRET rc;
+ long i, j;
+
+ /* 0 means a FS protected-mode session */
+ if (font_loaded_for == -1 /* Did not try it yet */
+ && (DosGetInfoBlocks(&tib, &pib) || pib->pib_ultype != 0)) {
+ ord = ord1 = auto_display_charset;
+ goto retry;
+ }
+ /* Should not cross 64K boundaries: */
+ font = f;
+ if (((((ULONG) (char *) f) + sizeof(*font)) & 0xFFFF) < sizeof(*font))
+ font++;
+ if (((ULONG) buf) & 0xFFFF)
+ buf += 0x10000 - (((ULONG) buf) & 0xFFFF);
+ font->cb = sizeof(*font); /* How large is this structure */
+ font->type = 0; /* Not the BIOS, the loaded font. */
+ font->cbData = 65535; /* How large is my buffer? */
+ font->pbData = _emx_32to16(buf); /* Wants an 16:16 pointer */
+
+ rc = VioGetFont(font, 0); /* Retrieve data for current font */
+ if (rc) {
+ sprintf(msgbuf,
+ gettext("Can't fetch current font info: err=%#x=%d"), rc, rc);
+ HTInfoMsg(msgbuf);
+ ord = ord1 = auto_display_charset;
+ goto retry;
+ }
+ if (ord1 == font_loaded_for
+ && old_h == font->cyCell && old_w == font->cxCell) {
+ /* The same as the previous font */
+ if ((rc = VioSetCp(0, -1, 0))) /* -1: User font */
+ goto err;
+ goto report;
+ }
+ sprintf(fnamebuf, "%s/%dx%d/%s.fnt",
+ charsets_directory, font->cyCell, font->cxCell, name);
+ file = fopen(fnamebuf, BIN_R);
+ if (!file) {
+ sprintf(msgbuf, gettext("Can't open font file '%s'"), fnamebuf);
+ HTInfoMsg(msgbuf);
+ ord = ord1 = auto_display_charset;
+ goto retry;
+ }
+ i = ftell(file);
+ fseek(file, 0, SEEK_END);
+ if (ftell(file) - i != font->cbData) {
+ fclose(file);
+ sprintf(msgbuf, gettext("Mismatch of size of font file '%s'"), fnamebuf);
+ HTAlert(msgbuf);
+ ord = ord1 = auto_display_charset;
+ goto retry;
+ }
+ fseek(file, i, SEEK_SET);
+ fread(buf, 1, font->cbData, file);
+ fclose(file);
+ rc = VioSetFont(font, 0); /* Put it all back.. */
+ if (rc) {
+ sprintf(msgbuf, gettext("Can't set font: err=%#x=%d"), rc, rc);
+ HTInfoMsg(msgbuf);
+ ord = ord1 = auto_display_charset;
+ font_loaded_for = -1;
+ goto retry;
+ }
+ font_loaded_for = ord1;
+ old_h = font->cyCell;
+ old_w = font->cxCell;
+ } else {
+ ord = ord1 = auto_display_charset;
+ goto retry;
+ }
+ report:
+ CTRACE((tfp, "Display font set to '%s'.\n", name));
+ return ord;
+}
+# endif /* __EMX__ */
+
+int Switch_Display_Charset(const int ord, const enum switch_display_charset_t really)
+{
+ int prev = current_char_set;
+ int res;
+ static int repeated;
+
+ if (!switch_display_charsets)
+ return 0;
+ res = _Switch_Display_Charset(ord, really);
+ if (res < 0 || prev == res) /* No change */
+ return 0;
+ /* Register the change */
+ current_char_set = res;
+ HTMLUseCharacterSet(current_char_set);
+ return 1;
+}
+#endif /* CAN_SWITCH_DISPLAY_CHARSET */
+
+#else /* EXP_CHARTRANS_AUTOSWITCH not defined: */
+/*
+ * This is the thing that actually gets called from display_page().
+ */
+void UCChangeTerminalCodepage(int newcs GCC_UNUSED,
+ LYUCcharset *p GCC_UNUSED)
+{
+ CTRACE((tfp, "UCChangeTerminalCodepage: Called, but not implemented!"));
+}
+#endif /* EXP_CHARTRANS_AUTOSWITCH */
diff --git a/src/UCAuto.h b/src/UCAuto.h
new file mode 100644
index 0000000..98d2243
--- /dev/null
+++ b/src/UCAuto.h
@@ -0,0 +1,14 @@
+#ifndef UCAUTO_H
+#define UCAUTO_H
+
+#include <UCDefs.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ extern void UCChangeTerminalCodepage(int newcs, LYUCcharset *p);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* UCAUTO_H */
diff --git a/src/UCAux.c b/src/UCAux.c
new file mode 100644
index 0000000..44495a6
--- /dev/null
+++ b/src/UCAux.c
@@ -0,0 +1,800 @@
+/*
+ * $LynxId: UCAux.c,v 1.58 2021/07/01 23:34:24 tom Exp $
+ */
+#include <HTUtils.h>
+
+#include <HTCJK.h>
+#include <UCMap.h>
+#include <UCDefs.h>
+#include <HTStream.h>
+#include <UCAux.h>
+#include <LYCharSets.h>
+#include <LYCurses.h>
+#include <LYStrings.h>
+
+BOOL UCCanUniTranslateFrom(int from)
+{
+ if (from < 0)
+ return NO;
+#ifndef USE_JAPANESEUTF8_SUPPORT
+ if (LYCharSet_UC[from].enc == UCT_ENC_CJK)
+ return NO;
+#endif
+ if (!strcmp(LYCharSet_UC[from].MIMEname, "x-transparent"))
+ return NO;
+
+ /* others YES */
+ return YES;
+}
+
+BOOL UCCanTranslateUniTo(int to)
+{
+ if (to < 0)
+ return NO;
+
+ return YES; /* well at least some characters... */
+}
+
+BOOL UCCanTranslateFromTo(int from,
+ int to)
+{
+ if (from == to)
+ return YES;
+ if (from < 0 || to < 0)
+ return NO;
+ if (from == LATIN1)
+ return UCCanTranslateUniTo(to);
+ if (to == LATIN1 || LYCharSet_UC[to].enc == UCT_ENC_UTF8)
+ return UCCanUniTranslateFrom(from);
+ {
+ const char *fromname = LYCharSet_UC[from].MIMEname;
+ const char *toname = LYCharSet_UC[to].MIMEname;
+
+ if (!strcmp(fromname, "x-transparent") ||
+ !strcmp(toname, "x-transparent")) {
+ return YES; /* ??? */
+ } else if (!strcmp(fromname, "us-ascii")) {
+ return YES;
+ }
+ if (LYCharSet_UC[from].enc == UCT_ENC_CJK) {
+ /*
+ * CJK mode may be off (i.e., !IS_CJK_TTY) because the current
+ * document is not CJK, but the check may be for capability in
+ * relation to another document, for which CJK mode might be turned
+ * on when retrieved. Thus, when the from charset is CJK, check if
+ * the to charset is CJK, and return NO or YES in relation to that.
+ * - FM
+ */
+ if (LYCharSet_UC[to].enc != UCT_ENC_CJK)
+ return NO;
+ if ((!strcmp(toname, "euc-jp") ||
+ !strcmp(toname, "shift_jis")) &&
+ (!strcmp(fromname, "euc-jp") ||
+ !strcmp(fromname, "shift_jis")))
+ return YES;
+ /*
+ * The euc-cn and euc-kr charsets were handled by the (from == to)
+ * above, so we need not check those. - FM
+ */
+ return NO;
+ }
+ }
+ return YES; /* others YES */
+}
+
+/*
+ * Returns YES if no translation necessary (because
+ * charsets are equal, are equivalent, etc.).
+ */
+BOOL UCNeedNotTranslate(int from,
+ int to)
+{
+ const char *fromname;
+ const char *toname;
+
+ if (from == to)
+ return YES;
+ if (from < 0)
+ return NO; /* ??? */
+ if (LYCharSet_UC[from].enc == UCT_ENC_7BIT) {
+ return YES; /* Only 7bit chars. */
+ }
+ fromname = LYCharSet_UC[from].MIMEname;
+ if (!strcmp(fromname, "x-transparent") ||
+ !strcmp(fromname, "us-ascii")) {
+ return YES;
+ }
+ if (to < 0)
+ return NO; /* ??? */
+ if (to == LATIN1) {
+ if (LYCharSet_UC[from].codepoints & (UCT_CP_SUBSETOF_LAT1))
+ return YES;
+ }
+ toname = LYCharSet_UC[to].MIMEname;
+ if (!strcmp(toname, "x-transparent")) {
+ return YES;
+ }
+ if (LYCharSet_UC[to].enc == UCT_ENC_UTF8) {
+ return NO;
+ }
+ if (from == LATIN1) {
+ if (LYCharSet_UC[from].codepoints & (UCT_CP_SUPERSETOF_LAT1))
+ return YES;
+ }
+ if (LYCharSet_UC[from].enc == UCT_ENC_CJK) {
+ if (!IS_CJK_TTY) /* Use that global flag, for now. */
+ return NO;
+ if (HTCJK == JAPANESE &&
+ (!strcmp(fromname, "euc-jp") ||
+ !strcmp(fromname, "shift_jis")))
+ return YES; /* translate internally by lynx, no unicode */
+ return NO; /* If not handled by (from == to) above. */
+ }
+ return NO;
+}
+
+/*
+ * The idea here is that any stage of the stream pipe which is interested
+ * in some charset dependent processing will call this function.
+ * Given input and output charsets, this function will set various flags
+ * in a UCTransParams structure that _suggest_ to the caller what to do.
+ *
+ * Should be called once when a stage starts processing text (and the
+ * input and output charsets are known), or whenever one of input or
+ * output charsets has changed (e.g., by SGML.c stage after HTML.c stage
+ * has processed a META tag).
+ * The global flags (LYRawMode, HTPassEightBitRaw etc.) are currently
+ * not taken into account here (except for HTCJK, somewhat), it's still
+ * up to the caller to do something about them. - KW
+ */
+void UCSetTransParams(UCTransParams * pT, int cs_in,
+ const LYUCcharset *p_in,
+ int cs_out,
+ const LYUCcharset *p_out)
+{
+ CTRACE((tfp, "UCSetTransParams: from %s(%d) to %s(%d)\n",
+ p_in->MIMEname, UCGetLYhndl_byMIME(p_in->MIMEname),
+ p_out->MIMEname, UCGetLYhndl_byMIME(p_out->MIMEname)));
+
+ /*
+ * Initialize this element to FALSE, and set it TRUE below if we're dealing
+ * with VISCII. - FM
+ */
+ pT->trans_C0_to_uni = FALSE;
+
+ /*
+ * The "transparent" display character set is a "super raw mode". - FM
+ */
+ pT->transp = (BOOL) (!strcmp(p_in->MIMEname, "x-transparent") ||
+ !strcmp(p_out->MIMEname, "x-transparent"));
+
+ /*
+ * UCS-2 is handled as a special case in SGML_write().
+ */
+ pT->ucs_mode = 0;
+
+ if (pT->transp) {
+ /*
+ * Set up the structure for "transparent". - FM
+ */
+ pT->do_cjk = FALSE;
+ pT->decode_utf8 = FALSE;
+ pT->output_utf8 = FALSE; /* We may, but won't know about it. - KW */
+ pT->do_8bitraw = TRUE;
+ pT->use_raw_char_in = TRUE;
+ pT->strip_raw_char_in = FALSE;
+ pT->pass_160_173_raw = TRUE;
+ pT->repl_translated_C0 = (BOOL) (p_out->enc == UCT_ENC_8BIT_C0);
+ pT->trans_C0_to_uni = (BOOL) (p_in->enc == UCT_ENC_8BIT_C0 ||
+ p_out->enc == UCT_ENC_8BIT_C0);
+ } else {
+ /*
+ * Initialize local flags. - FM
+ */
+ BOOL intm_ucs = FALSE;
+ BOOL use_ucs = FALSE;
+
+ /*
+ * Set this element if we want to treat the input as CJK. - FM
+ */
+ pT->do_cjk = (BOOL) ((p_in->enc == UCT_ENC_CJK) &&
+ (
+ IS_CJK_TTY
+#ifdef EXP_CHINESEUTF8_SUPPORT
+ || !strcmp(p_in->MIMEname, "euc-cn")
+ || !strcmp(p_in->MIMEname, "big5")
+ || !strcmp(p_in->MIMEname, "euc-kr")
+#endif
+ )
+ );
+ /*
+ * Set these elements based on whether we are dealing with UTF-8. - FM
+ */
+ pT->decode_utf8 = (BOOL) (p_in->enc == UCT_ENC_UTF8);
+ pT->output_utf8 = (BOOL) (p_out->enc == UCT_ENC_UTF8);
+ if (pT->do_cjk) {
+ /*
+ * Set up the structure for a CJK input with
+ * a CJK output (IS_CJK_TTY). - FM
+ */
+ pT->trans_to_uni = FALSE;
+#ifdef EXP_CHINESEUTF8_SUPPORT
+ if (!strcmp(p_in->MIMEname, "euc-cn") ||
+ !strcmp(p_in->MIMEname, "big5") ||
+ !strcmp(p_in->MIMEname, "euc-kr")) {
+ pT->trans_to_uni = (BOOL) UCCanUniTranslateFrom(cs_in);
+ }
+#endif
+ pT->do_8bitraw = FALSE;
+ pT->pass_160_173_raw = TRUE;
+ pT->use_raw_char_in = FALSE; /* Not used for CJK. - KW */
+ pT->repl_translated_C0 = FALSE;
+ pT->trans_from_uni = FALSE; /* Not used for CJK. - KW */
+ } else {
+ /*
+ * Set up for all other charset combinations. The intm_ucs flag is
+ * set TRUE if the input charset is iso-8859-1 or UTF-8, or largely
+ * equivalent to them, i.e., if we have UCS without having to do a
+ * table translation.
+ */
+ intm_ucs = (BOOL) (cs_in == LATIN1 || pT->decode_utf8 ||
+ (p_in->codepoints &
+ (UCT_CP_SUBSETOF_LAT1 | UCT_CP_SUBSETOF_UCS2)));
+ /*
+ * pT->trans_to_uni is set TRUE if we do not have that as input
+ * already, and we can translate to Unicode. Note that UTF-8
+ * always is converted to Unicode in functions that use the
+ * transformation structure, so it is treated as already Unicode
+ * here.
+ */
+ pT->trans_to_uni = (BOOL) (!intm_ucs &&
+ UCCanUniTranslateFrom(cs_in));
+ /*
+ * We set this if we are translating to Unicode and what normally
+ * are low value control characters in fact are encoding octets for
+ * the input charset (presently, this applies to VISCII). - FM
+ */
+ pT->trans_C0_to_uni = (BOOL) (pT->trans_to_uni &&
+ p_in->enc == UCT_ENC_8BIT_C0);
+ /*
+ * We set this, presently, for VISCII. - FM
+ */
+ pT->repl_translated_C0 = (BOOL) (p_out->enc == UCT_ENC_8BIT_C0);
+ /*
+ * Currently unused for any charset combination.
+ * Should always be FALSE
+ */
+ pT->strip_raw_char_in = FALSE;
+ /*
+ * use_ucs should be set TRUE if we have or will create Unicode
+ * values for input octets or UTF multibytes. - FM
+ */
+ use_ucs = (BOOL) (intm_ucs || pT->trans_to_uni);
+ /*
+ * This is set TRUE if use_ucs was set FALSE. It is complementary
+ * to the HTPassEightBitRaw flag, which is set TRUE or FALSE
+ * elsewhere based on the raw mode setting in relation to the
+ * current Display Character Set. - FM
+ */
+ pT->do_8bitraw = (BOOL) (!use_ucs);
+ /*
+ * This is set TRUE when 160 and 173 should not be treated as nbsp
+ * and shy, respectively. - FM
+ */
+ pT->pass_160_173_raw = (BOOL) (!use_ucs &&
+ !(p_in->like8859 & UCT_R_8859SPECL));
+ /*
+ * This is set when the input and output charsets match, and they
+ * are not ones which should go through a Unicode translation
+ * process anyway. - FM
+ */
+ pT->use_raw_char_in = (BOOL) (!pT->output_utf8 &&
+ cs_in == cs_out &&
+ !pT->trans_C0_to_uni);
+ /*
+ * This should be set TRUE when we expect to have done translation
+ * to Unicode or had the equivalent as input, can translate it to
+ * our output charset, and normally want to do so. The latter
+ * depends on the pT->do_8bitraw and pT->use_raw_char_in values set
+ * above, but also on HTPassEightBitRaw in any functions which use
+ * the transformation structure.. - FM
+ */
+ pT->trans_from_uni = (BOOL) (use_ucs && !pT->do_8bitraw &&
+ !pT->use_raw_char_in &&
+ UCCanTranslateUniTo(cs_out));
+ }
+ }
+ CTRACE((tfp, "UCSetTransParams (done):\n"));
+ CTRACE((tfp, " transp: %d\n", pT->transp));
+ CTRACE((tfp, " do_cjk: %d\n", pT->do_cjk));
+ CTRACE((tfp, " decode_utf8: %d\n", pT->decode_utf8));
+ CTRACE((tfp, " output_utf8: %d\n", pT->output_utf8));
+ CTRACE((tfp, " do_8bitraw: %d\n", pT->do_8bitraw));
+ CTRACE((tfp, " use_raw_char_in: %d\n", pT->use_raw_char_in));
+ CTRACE((tfp, " strip_raw_char_in: %d\n", pT->strip_raw_char_in));
+ CTRACE((tfp, " pass_160_173_raw: %d\n", pT->pass_160_173_raw));
+ CTRACE((tfp, " trans_to_uni: %d\n", pT->trans_to_uni));
+ CTRACE((tfp, " trans_C0_to_uni: %d\n", pT->trans_C0_to_uni));
+ CTRACE((tfp, " repl_translated_C0: %d\n", pT->repl_translated_C0));
+ CTRACE((tfp, " trans_from_uni: %d\n", pT->trans_from_uni));
+}
+
+/*
+ * This function initializes the transformation
+ * structure by setting all its elements to
+ * FALSE. - KW
+ */
+void UCTransParams_clear(UCTransParams * pT)
+{
+ pT->transp = FALSE;
+ pT->do_cjk = FALSE;
+ pT->decode_utf8 = FALSE;
+ pT->output_utf8 = FALSE;
+ pT->do_8bitraw = FALSE;
+ pT->use_raw_char_in = FALSE;
+ pT->strip_raw_char_in = FALSE;
+ pT->pass_160_173_raw = FALSE;
+ pT->trans_to_uni = FALSE;
+ pT->trans_C0_to_uni = FALSE;
+ pT->repl_translated_C0 = FALSE;
+ pT->trans_from_uni = FALSE;
+}
+
+/*
+ * If terminal is in UTF-8 mode, it probably cannot understand box drawing
+ * chars as the 8-bit (n)curses handles them. (This may also be true for other
+ * display character sets, but isn't currently checked.) In that case set the
+ * chars for horizontal and vertical drawing chars to displayable ASCII chars
+ * if '0' was requested. They'll stay as they are otherwise. -KW, TD
+ *
+ * If we're able to obtain a character set based on the locale settings,
+ * assume that the user has setup $TERM and the fonts already so line-drawing
+ * works.
+ */
+void UCSetBoxChars(int cset,
+ int *pvert_out,
+ int *phori_out,
+ int vert_in,
+ int hori_in)
+{
+ BOOL fix_lines = FALSE;
+
+ if (cset >= 0) {
+#ifndef WIDEC_CURSES
+ if (LYCharSet_UC[cset].enc == UCT_ENC_UTF8) {
+ fix_lines = TRUE;
+ }
+#endif
+ /*
+ * If we've identified a charset that works, require it.
+ * This is important if we have loaded a font, which would
+ * confuse curses.
+ */
+ /* US-ASCII vs Latin-1 is safe (usually) */
+ if ((cset == US_ASCII
+ || cset == LATIN1)
+ && (linedrawing_char_set == US_ASCII
+ || linedrawing_char_set == LATIN1)) {
+#if (defined(FANCY_CURSES) && defined(A_ALTCHARSET)) || defined(USE_SLANG)
+ vert_in = 0;
+ hori_in = 0;
+#else
+ ;
+#endif
+ }
+#ifdef EXP_CHARTRANS_AUTOSWITCH
+#if defined(NCURSES_VERSION) || defined(HAVE_TIGETSTR)
+ else {
+ static BOOL first = TRUE;
+ static int last_cset = -99;
+ static BOOL last_result = TRUE;
+ /* *INDENT-OFF* */
+ static struct {
+ int mapping;
+ UCode_t internal;
+ int external;
+ } table[] = {
+ { 'j', 0x2518, 0 }, /* BOX DRAWINGS LIGHT UP AND LEFT */
+ { 'k', 0x2510, 0 }, /* BOX DRAWINGS LIGHT DOWN AND LEFT */
+ { 'l', 0x250c, 0 }, /* BOX DRAWINGS LIGHT DOWN AND RIGHT */
+ { 'm', 0x2514, 0 }, /* BOX DRAWINGS LIGHT UP AND RIGHT */
+ { 'n', 0x253c, 0 }, /* BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL */
+ { 'q', 0x2500, 0 }, /* BOX DRAWINGS LIGHT HORIZONTAL */
+ { 't', 0x251c, 0 }, /* BOX DRAWINGS LIGHT VERTICAL AND RIGHT */
+ { 'u', 0x2524, 0 }, /* BOX DRAWINGS LIGHT VERTICAL AND LEFT */
+ { 'v', 0x2534, 0 }, /* BOX DRAWINGS LIGHT UP AND HORIZONTAL */
+ { 'w', 0x252c, 0 }, /* BOX DRAWINGS LIGHT DOWN AND HORIZONTAL */
+ { 'x', 0x2502, 0 }, /* BOX DRAWINGS LIGHT VERTICAL */
+ };
+ /* *INDENT-ON* */
+
+ unsigned n;
+
+ if (first) {
+ static char acsc_name[] = "acsc";
+ char *map = tigetstr(acsc_name);
+
+ if (map != 0) {
+ CTRACE((tfp, "build terminal line-drawing map\n"));
+ while (map[0] != 0 && map[1] != 0) {
+ for (n = 0; n < TABLESIZE(table); ++n) {
+ if (table[n].mapping == map[0]) {
+ table[n].external = UCH(map[1]);
+ CTRACE((tfp,
+ " map[%c] %#" PRI_UCode_t " -> %#x\n",
+ table[n].mapping,
+ CAST_UCode_t (table[n].internal),
+ (unsigned)table[n].external));
+ break;
+ }
+ }
+ map += 2;
+ }
+ }
+ first = FALSE;
+ }
+
+ if (cset == last_cset) {
+ fix_lines = last_result;
+ } else if (cset == UTF8_handle) {
+ last_result = FALSE;
+ last_cset = cset;
+ } else {
+ CTRACE((tfp, "check terminal line-drawing map\n"));
+ for (n = 0; n < TABLESIZE(table); ++n) {
+ int test = UCTransUniChar(table[n].internal, cset);
+
+ if (test != table[n].external) {
+ CTRACE((tfp,
+ "line-drawing map %c mismatch (have %#x, want %#x)\n",
+ table[n].mapping,
+ (unsigned) test,
+ (unsigned) table[n].external));
+ fix_lines = TRUE;
+ break;
+ }
+ }
+ last_result = fix_lines;
+ last_cset = cset;
+ }
+ }
+#else
+ else if (cset != linedrawing_char_set && linedrawing_char_set >= 0) {
+ fix_lines = TRUE;
+ }
+#endif
+#endif
+ }
+ if (fix_lines) {
+ if (!vert_in)
+ vert_in = '|';
+ if (!hori_in)
+ hori_in = '-';
+ }
+ *pvert_out = vert_in;
+ *phori_out = hori_in;
+}
+
+/*
+ * Given an output target HTStream* (can also be a HTStructured* via
+ * typecast), the target stream's put_character method, and a Unicode
+ * character, CPutUtf8_charstring() will either output the UTF8
+ * encoding of the Unicode and return YES, or do nothing and return
+ * NO (if conversion would be unnecessary or the Unicode character is
+ * considered invalid).
+ *
+ * [Could be used more generally, but is currently only used for &#nnnnn
+ * stuff - generation of UTF8 from 8-bit encoded charsets not yet done
+ * by SGML.c etc.]
+ */
+#define PUTC(ch) ((*myPutc)(target, (char)(ch)))
+#define PUTC2(ch) ((*myPutc)(target,(char)(0x80|(0x3f &(ch)))))
+
+BOOL UCPutUtf8_charstring(HTStream *target, putc_func_t *myPutc, UCode_t code)
+{
+ if (code < 128)
+ return NO; /* indicate to caller we didn't handle it */
+ else if (code < 0x800L) {
+ PUTC(0xc0 | (code >> 6));
+ PUTC2(code);
+ } else if (code < 0x10000L) {
+ PUTC(0xe0 | (code >> 12));
+ PUTC2(code >> 6);
+ PUTC2(code);
+ } else if (code < 0x200000L) {
+ PUTC(0xf0 | (code >> 18));
+ PUTC2(code >> 12);
+ PUTC2(code >> 6);
+ PUTC2(code);
+ } else if (code < 0x4000000L) {
+ PUTC(0xf8 | (code >> 24));
+ PUTC2(code >> 18);
+ PUTC2(code >> 12);
+ PUTC2(code >> 6);
+ PUTC2(code);
+ } else if (code <= 0x7fffffffL) {
+ PUTC(0xfc | (code >> 30));
+ PUTC2(code >> 24);
+ PUTC2(code >> 18);
+ PUTC2(code >> 12);
+ PUTC2(code >> 6);
+ PUTC2(code);
+ } else
+ return NO;
+ return YES;
+}
+
+/*
+ * This function converts a Unicode (UCode_t) value
+ * to a multibyte UTF-8 character, which is loaded
+ * into the buffer received as an argument. The
+ * buffer should be large enough to hold at least
+ * seven characters (but should be declared as 8
+ * to minimize byte alignment problems with some
+ * compilers). - FM
+ */
+BOOL UCConvertUniToUtf8(UCode_t code, char *buffer)
+{
+ char *ch = buffer;
+
+ if (!ch)
+ return NO;
+
+ if (code <= 0 || code > 0x7fffffffL) {
+ *ch = '\0';
+ return NO;
+ }
+
+ if (code < 0x800L) {
+ *ch++ = (char) (0xc0 | (code >> 6));
+ *ch++ = (char) (0x80 | (0x3f & (code)));
+ *ch = '\0';
+ } else if (code < 0x10000L) {
+ *ch++ = (char) (0xe0 | (code >> 12));
+ *ch++ = (char) (0x80 | (0x3f & (code >> 6)));
+ *ch++ = (char) (0x80 | (0x3f & (code)));
+ *ch = '\0';
+ } else if (code < 0x200000L) {
+ *ch++ = (char) (0xf0 | (code >> 18));
+ *ch++ = (char) (0x80 | (0x3f & (code >> 12)));
+ *ch++ = (char) (0x80 | (0x3f & (code >> 6)));
+ *ch++ = (char) (0x80 | (0x3f & (code)));
+ *ch = '\0';
+ } else if (code < 0x4000000L) {
+ *ch++ = (char) (0xf8 | (code >> 24));
+ *ch++ = (char) (0x80 | (0x3f & (code >> 18)));
+ *ch++ = (char) (0x80 | (0x3f & (code >> 12)));
+ *ch++ = (char) (0x80 | (0x3f & (code >> 6)));
+ *ch++ = (char) (0x80 | (0x3f & (code)));
+ *ch = '\0';
+ } else {
+ *ch++ = (char) (0xfc | (code >> 30));
+ *ch++ = (char) (0x80 | (0x3f & (code >> 24)));
+ *ch++ = (char) (0x80 | (0x3f & (code >> 18)));
+ *ch++ = (char) (0x80 | (0x3f & (code >> 12)));
+ *ch++ = (char) (0x80 | (0x3f & (code >> 6)));
+ *ch++ = (char) (0x80 | (0x3f & (code)));
+ *ch = '\0';
+ }
+ return YES;
+}
+
+/*
+ * Get UCS character code for one character from UTF-8 encoded string.
+ *
+ * On entry:
+ * *ppuni should point to beginning of UTF-8 encoding character
+ * On exit:
+ * *ppuni is advanced to point to the last byte of UTF-8 sequence,
+ * if there was a valid one; otherwise unchanged.
+ * returns the UCS value
+ * returns negative value on error (invalid UTF-8 sequence)
+ */
+UCode_t UCGetUniFromUtf8String(const char **ppuni)
+{
+ UCode_t uc_out = 0;
+ const char *p = *ppuni;
+ int utf_count, i;
+
+ if (!(**ppuni & 0x80))
+ return (UCode_t) **ppuni; /* ASCII range character */
+ else if (!(**ppuni & 0x40))
+ return (-1); /* not a valid UTF-8 start */
+ if ((*p & 0xe0) == 0xc0) {
+ utf_count = 1;
+ } else if ((*p & 0xf0) == 0xe0) {
+ utf_count = 2;
+ } else if ((*p & 0xf8) == 0xf0) {
+ utf_count = 3;
+ } else if ((*p & 0xfc) == 0xf8) {
+ utf_count = 4;
+ } else if ((*p & 0xfe) == 0xfc) {
+ utf_count = 5;
+ } else { /* garbage */
+ return (-1);
+ }
+ for (p = *ppuni, i = 0; i < utf_count; i++) {
+ if ((*(++p) & 0xc0) != 0x80)
+ return (-1);
+ }
+ p = *ppuni;
+ switch (utf_count) {
+ case 1:
+ uc_out = (((*p & 0x1f) << 6) |
+ (*(p + 1) & 0x3f));
+ break;
+ case 2:
+ uc_out = (((((*p & 0x0f) << 6) |
+ (*(p + 1) & 0x3f)) << 6) |
+ (*(p + 2) & 0x3f));
+ break;
+ case 3:
+ uc_out = (((((((*p & 0x07) << 6) |
+ (*(p + 1) & 0x3f)) << 6) |
+ (*(p + 2) & 0x3f)) << 6) |
+ (*(p + 3) & 0x3f));
+ break;
+ case 4:
+ uc_out = (((((((((*p & 0x03) << 6) |
+ (*(p + 1) & 0x3f)) << 6) |
+ (*(p + 2) & 0x3f)) << 6) |
+ (*(p + 3) & 0x3f)) << 6) |
+ (*(p + 4) & 0x3f));
+ break;
+ case 5:
+ uc_out = (((((((((((*p & 0x01) << 6) |
+ (*(p + 1) & 0x3f)) << 6) |
+ (*(p + 2) & 0x3f)) << 6) |
+ (*(p + 3) & 0x3f)) << 6) |
+ (*(p + 4) & 0x3f)) << 6) |
+ (*(p + 5) & 0x3f));
+ break;
+ }
+ *ppuni = p + utf_count;
+ return uc_out;
+}
+
+/*
+ * Combine UTF-8 into Unicode. Incomplete characters are either ignored, or
+ * returned as the UCS replacement character.
+ */
+dUTF8 HTDecodeUTF8(UTFDecodeState * me, int *c_in_out, UCode_t *result)
+{
+ dUTF8 rc = dUTF8_ok;
+ int c = *c_in_out;
+ unsigned uc = UCH(c);
+
+ if (TOASCII(uc) > 127) {
+ /*
+ * continue a multibyte character...
+ */
+ if (me->utf_count > 0 && (TOASCII(c) & 0xc0) == 0x80) {
+ if (me->utf_count <= 0) {
+ me->utf_char = UCS_REPL;
+ } else if (me->utf_count == 1) {
+ int limit = (int) (me->utf_buf_p - me->utf_buf) + 1;
+ int maybe = 0;
+
+ /*
+ * Check for overlong sequences (from comment in xterm):
+ * 1100000x 10xxxxxx
+ * 11100000 100xxxxx 10xxxxxx
+ * 11110000 1000xxxx 10xxxxxx 10xxxxxx
+ * 11111000 10000xxx 10xxxxxx 10xxxxxx 10xxxxxx
+ * 11111100 100000xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
+ */
+ switch (limit) {
+ case 2:
+ maybe = (UCH(me->utf_buf[0]) & 0xfe) == 0xc0;
+ break;
+ case 3:
+ maybe = ((UCH(me->utf_buf[0]) == 0xe0) &&
+ (UCH(me->utf_buf[1]) & 0xf0) == 0x80);
+ break;
+ case 4:
+ maybe = ((UCH(me->utf_buf[0]) == 0xf0) &&
+ (UCH(me->utf_buf[1]) & 0xf8) == 0x80);
+ break;
+ case 5:
+ maybe = ((UCH(me->utf_buf[0]) == 0xf8) &&
+ (UCH(me->utf_buf[1]) & 0xfd) == 0x80);
+ break;
+ }
+ if (maybe) {
+ while (limit-- > 2) {
+ if ((UCH(me->utf_buf[limit]) & 0xc0) != 0x80) {
+ maybe = 0;
+ break;
+ }
+ }
+ if (maybe) {
+ me->utf_char = UCS_REPL;
+ }
+ }
+ }
+ if (me->utf_char == UCS_REPL) {
+ rc = dUTF8_err;
+ } else if (me->utf_char || ((uc & 0x7f) >> (7 - me->utf_count))) {
+ me->utf_char = (me->utf_char << 6) | (TOASCII(c) & 0x3f);
+ if ((me->utf_char >= 0xd800 &&
+ me->utf_char <= 0xdfff) ||
+ (me->utf_char == 0xfffe) ||
+ (me->utf_char == UCS_HIDE)) {
+ me->utf_char = UCS_REPL;
+ rc = dUTF8_err;
+ }
+ } else {
+ me->utf_char = UCS_REPL;
+ rc = dUTF8_err;
+ }
+ me->utf_count--;
+ *(me->utf_buf_p) = (char) c;
+ (me->utf_buf_p)++;
+
+ if (me->utf_count == 0) {
+ *(me->utf_buf_p) = '\0';
+ *result = me->utf_char;
+ if (*result < 256) {
+ *c_in_out = UCH(*result & 0xff);
+ }
+ switch (*result) {
+ case 0x200e: /* left-to-right mark */
+ case 0x200f: /* right-to-left mark */
+ /* lynx does not use these */
+ *result = '\0';
+ break;
+ }
+ } else {
+ rc = dUTF8_more;
+ }
+ } else {
+ /*
+ * begin a multibyte character
+ */
+ rc = dUTF8_more;
+ me->utf_buf_p = me->utf_buf;
+ *(me->utf_buf_p) = (char) c;
+ (me->utf_buf_p)++;
+ if ((uc & 0xe0) == 0xc0) {
+ me->utf_count = 1;
+ me->utf_char = (uc & 0x1f);
+ } else if ((uc & 0xf0) == 0xe0) {
+ me->utf_count = 2;
+ me->utf_char = (uc & 0x0f);
+ } else if ((uc & 0xf8) == 0xf0) {
+ me->utf_count = 3;
+ me->utf_char = (uc & 0x07);
+ } else if ((uc & 0xfc) == 0xf8) {
+ me->utf_count = 4;
+ me->utf_char = (uc & 0x03);
+ } else if ((uc & 0xfe) == 0xfc) {
+ me->utf_count = 5;
+ me->utf_char = (uc & 0x01);
+ } else {
+ me->utf_count = 0;
+ me->utf_buf_p = me->utf_buf;
+ *(me->utf_buf_p) = '\0';
+ rc = dUTF8_err;
+ }
+ }
+ } else {
+ me->utf_count = 0;
+ me->utf_buf_p = me->utf_buf;
+ *(me->utf_buf_p) = '\0';
+ }
+
+#if 0
+ if (rc != dUTF8_ok) {
+ CTRACE((tfp, "UTF8 %#x ->%#x %s\n",
+ uc, UCH(*c_in_out),
+ (rc == dUTF8_err) ? "err" : "more"));
+ } else {
+ if (*result > 127) {
+ CTRACE((tfp, "UTF8 %#x == %#x\n", uc, (int) *result));
+ } else if (c != UCS_REPL && !isspace(c)) {
+ CTRACE((tfp, "CHAR %#x == %c (%#x)\n", uc, uc, (int) *result));
+ }
+ }
+#endif
+ return rc;
+}
diff --git a/src/UCdomap.c b/src/UCdomap.c
new file mode 100644
index 0000000..0ec239a
--- /dev/null
+++ b/src/UCdomap.c
@@ -0,0 +1,2524 @@
+/*
+ * $LynxId: UCdomap.c,v 1.111 2023/01/05 09:17:16 tom Exp $
+ *
+ * UCdomap.c
+ * =========
+ *
+ * This is a Lynx chartrans engine, its external calls are in UCMap.h
+ *
+ * Derived from code in the Linux kernel console driver.
+ *
+ * The GNU General Public License therefore applies, see the file
+ * COPYING in the top-level directory which should come with every Lynx
+ * distribution.
+ *
+ * [ original comment: - KW ]
+ *
+ * Mapping from internal code (such as Latin-1 or Unicode or IBM PC code)
+ * to font positions.
+ *
+ * aeb, 950210
+ */
+#include <HTUtils.h>
+#include <HTMLDTD.h>
+
+#include <LYGlobalDefs.h>
+#include <UCdomap.h>
+#include <UCMap.h>
+#include <UCAux.h>
+#include <UCDefs.h>
+#include <LYCharSets.h>
+#include <LYStrings.h>
+#include <LYUtils.h>
+
+#if defined(USE_LOCALE_CHARSET) && defined(HAVE_LANGINFO_CODESET)
+#include <langinfo.h>
+#endif
+
+#if defined(USE_JAPANESEUTF8_SUPPORT) || defined(EXP_CHINESEUTF8_SUPPORT)
+#include <iconv.h>
+#endif
+
+#include <LYLeaks.h>
+
+/*
+ * Include chartrans tables:
+ */
+#include <cp1250_uni.h> /* WinLatin2 (cp1250) */
+#include <cp1251_uni.h> /* WinCyrillic (cp1251) */
+#include <cp1252_uni.h> /* WinLatin1 (cp1252) */
+#include <cp1253_uni.h> /* WinGreek (cp1253) */
+#include <cp1255_uni.h> /* WinHebrew (cp1255) */
+#include <cp1256_uni.h> /* WinArabic (cp1256) */
+#include <cp1257_uni.h> /* WinBaltRim (cp1257) */
+#include <cp437_uni.h> /* DosLatinUS (cp437) */
+#include <cp737_uni.h> /* DosGreek (cp737) */
+#include <cp775_uni.h> /* DosBaltRim (cp775) */
+#include <cp850_uni.h> /* DosLatin1 (cp850) */
+#include <cp852_uni.h> /* DosLatin2 (cp852) */
+#include <cp857_uni.h> /* DosTurkish (cp857) */
+#include <cp862_uni.h> /* DosHebrew (cp862) */
+#include <cp864_uni.h> /* DosArabic (cp864) */
+#include <cp866_uni.h> /* DosCyrillic (cp866) */
+#include <cp869_uni.h> /* DosGreek2 (cp869) */
+#include <def7_uni.h> /* 7 bit approximations */
+#include <dmcs_uni.h> /* DEC Multinational */
+#include <hp_uni.h> /* HP Roman8 */
+#include <iso01_uni.h> /* ISO Latin 1 */
+#include <iso02_uni.h> /* ISO Latin 2 */
+#include <iso03_uni.h> /* ISO Latin 3 */
+#include <iso04_uni.h> /* ISO Latin 4 */
+#include <iso05_uni.h> /* ISO 8859-5 Cyrillic */
+#include <iso06_uni.h> /* ISO 8859-6 Arabic */
+#include <iso07_uni.h> /* ISO 8859-7 Greek */
+#include <iso08_uni.h> /* ISO 8859-8 Hebrew */
+#include <iso09_uni.h> /* ISO 8859-9 (Latin 5) */
+#include <iso10_uni.h> /* ISO 8859-10 */
+#include <iso13_uni.h> /* ISO 8859-13 (Latin 7) */
+#include <iso14_uni.h> /* ISO 8859-14 (Latin 8) */
+#include <iso15_uni.h> /* ISO 8859-15 (Latin 9) */
+#include <iso16_uni.h> /* ISO 8859-16 (Latin 10) */
+#include <koi8r_uni.h> /* KOI8-R Cyrillic */
+#include <mac_uni.h> /* Macintosh (8 bit) */
+#include <mnem2_suni.h> /* RFC 1345 Mnemonic */
+#include <next_uni.h> /* NeXT character set */
+#include <rfc_suni.h> /* RFC 1345 w/o Intro */
+/* #include <utf8_uni.h> */ /* UNICODE UTF 8 */
+#include <viscii_uni.h> /* Vietnamese (VISCII) */
+#include <cp866u_uni.h> /* Ukrainian Cyrillic (866) */
+#include <koi8u_uni.h> /* Ukrainian Cyrillic (koi8-u */
+#include <pt154_uni.h> /* Cyrillic-Asian (PT154) */
+
+#ifdef CAN_AUTODETECT_DISPLAY_CHARSET
+int auto_display_charset = -1;
+#endif
+
+static const char *UC_GNsetMIMEnames[4] =
+{
+ "iso-8859-1", "x-dec-graphics", "cp437", "x-transparent"
+};
+
+static int UC_GNhandles[4] =
+{
+ -1, -1, -1, -1
+};
+
+/*
+ * Some of the code below, and some of the comments, are left in for
+ * historical reasons. Not all those tables below are currently
+ * really needed (and what with all those hardwired codepoints),
+ * but let's keep them around for now. They may come in handy if we
+ * decide to make more extended use of the mechanisms (including e.g.
+ * for chars < 127...). - KW
+ */
+
+static u16 translations[][256] =
+{
+ /*
+ * 8-bit Latin-1 mapped to Unicode -- trivial mapping.
+ */
+ {
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007,
+ 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017,
+ 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
+ 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+ 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+ 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+ 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f,
+ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
+ 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
+ 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
+ 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7,
+ 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
+ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7,
+ 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf,
+ 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
+ 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
+ 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
+ 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
+ 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
+ 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
+ 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7,
+ 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff
+ },
+ /*
+ * VT100 graphics mapped to Unicode.
+ */
+ {
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007,
+ 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017,
+ 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
+ 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+ 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x00a0,
+ 0x25c6, 0x2592, 0x2409, 0x240c, 0x240d, 0x240a, 0x00b0, 0x00b1,
+ 0x2424, 0x240b, 0x2518, 0x2510, 0x250c, 0x2514, 0x253c, 0xf800,
+ 0xf801, 0x2500, 0xf803, 0xf804, 0x251c, 0x2524, 0x2534, 0x252c,
+ 0x2502, 0x2264, 0x2265, 0x03c0, 0x2260, 0x00a3, 0x00b7, 0x007f,
+ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
+ 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
+ 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
+ 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7,
+ 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
+ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7,
+ 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf,
+ 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
+ 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
+ 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
+ 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
+ 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
+ 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
+ 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7,
+ 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff
+ },
+ /*
+ * IBM Codepage 437 mapped to Unicode.
+ */
+ {
+ 0x0000, 0x263a, 0x263b, 0x2665, 0x2666, 0x2663, 0x2660, 0x2022,
+ 0x25d8, 0x25cb, 0x25d9, 0x2642, 0x2640, 0x266a, 0x266b, 0x263c,
+ 0x25ba, 0x25c4, 0x2195, 0x203c, 0x00b6, 0x00a7, 0x25ac, 0x21a8,
+ 0x2191, 0x2193, 0x2192, 0x2190, 0x221f, 0x2194, 0x25b2, 0x25bc,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
+ 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+ 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+ 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+ 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x2302,
+ 0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7,
+ 0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x00ec, 0x00c4, 0x00c5,
+ 0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00f2, 0x00fb, 0x00f9,
+ 0x00ff, 0x00d6, 0x00dc, 0x00a2, 0x00a3, 0x00a5, 0x20a7, 0x0192,
+ 0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x00aa, 0x00ba,
+ 0x00bf, 0x2310, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00bb,
+ 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556,
+ 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510,
+ 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f,
+ 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567,
+ 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b,
+ 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580,
+ 0x03b1, 0x00df, 0x0393, 0x03c0, 0x03a3, 0x03c3, 0x00b5, 0x03c4,
+ 0x03a6, 0x0398, 0x03a9, 0x03b4, 0x221e, 0x03c6, 0x03b5, 0x2229,
+ 0x2261, 0x00b1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00f7, 0x2248,
+ 0x00b0, 0x2219, 0x00b7, 0x221a, 0x207f, 0x00b2, 0x25a0, 0x00a0
+ },
+ /*
+ * User mapping -- default to codes for direct font mapping.
+ */
+ {
+ 0xf000, 0xf001, 0xf002, 0xf003, 0xf004, 0xf005, 0xf006, 0xf007,
+ 0xf008, 0xf009, 0xf00a, 0xf00b, 0xf00c, 0xf00d, 0xf00e, 0xf00f,
+ 0xf010, 0xf011, 0xf012, 0xf013, 0xf014, 0xf015, 0xf016, 0xf017,
+ 0xf018, 0xf019, 0xf01a, 0xf01b, 0xf01c, 0xf01d, 0xf01e, 0xf01f,
+ 0xf020, 0xf021, 0xf022, 0xf023, 0xf024, 0xf025, 0xf026, 0xf027,
+ 0xf028, 0xf029, 0xf02a, 0xf02b, 0xf02c, 0xf02d, 0xf02e, 0xf02f,
+ 0xf030, 0xf031, 0xf032, 0xf033, 0xf034, 0xf035, 0xf036, 0xf037,
+ 0xf038, 0xf039, 0xf03a, 0xf03b, 0xf03c, 0xf03d, 0xf03e, 0xf03f,
+ 0xf040, 0xf041, 0xf042, 0xf043, 0xf044, 0xf045, 0xf046, 0xf047,
+ 0xf048, 0xf049, 0xf04a, 0xf04b, 0xf04c, 0xf04d, 0xf04e, 0xf04f,
+ 0xf050, 0xf051, 0xf052, 0xf053, 0xf054, 0xf055, 0xf056, 0xf057,
+ 0xf058, 0xf059, 0xf05a, 0xf05b, 0xf05c, 0xf05d, 0xf05e, 0xf05f,
+ 0xf060, 0xf061, 0xf062, 0xf063, 0xf064, 0xf065, 0xf066, 0xf067,
+ 0xf068, 0xf069, 0xf06a, 0xf06b, 0xf06c, 0xf06d, 0xf06e, 0xf06f,
+ 0xf070, 0xf071, 0xf072, 0xf073, 0xf074, 0xf075, 0xf076, 0xf077,
+ 0xf078, 0xf079, 0xf07a, 0xf07b, 0xf07c, 0xf07d, 0xf07e, 0xf07f,
+ 0xf080, 0xf081, 0xf082, 0xf083, 0xf084, 0xf085, 0xf086, 0xf087,
+ 0xf088, 0xf089, 0xf08a, 0xf08b, 0xf08c, 0xf08d, 0xf08e, 0xf08f,
+ 0xf090, 0xf091, 0xf092, 0xf093, 0xf094, 0xf095, 0xf096, 0xf097,
+ 0xf098, 0xf099, 0xf09a, 0xf09b, 0xf09c, 0xf09d, 0xf09e, 0xf09f,
+ 0xf0a0, 0xf0a1, 0xf0a2, 0xf0a3, 0xf0a4, 0xf0a5, 0xf0a6, 0xf0a7,
+ 0xf0a8, 0xf0a9, 0xf0aa, 0xf0ab, 0xf0ac, 0xf0ad, 0xf0ae, 0xf0af,
+ 0xf0b0, 0xf0b1, 0xf0b2, 0xf0b3, 0xf0b4, 0xf0b5, 0xf0b6, 0xf0b7,
+ 0xf0b8, 0xf0b9, 0xf0ba, 0xf0bb, 0xf0bc, 0xf0bd, 0xf0be, 0xf0bf,
+ 0xf0c0, 0xf0c1, 0xf0c2, 0xf0c3, 0xf0c4, 0xf0c5, 0xf0c6, 0xf0c7,
+ 0xf0c8, 0xf0c9, 0xf0ca, 0xf0cb, 0xf0cc, 0xf0cd, 0xf0ce, 0xf0cf,
+ 0xf0d0, 0xf0d1, 0xf0d2, 0xf0d3, 0xf0d4, 0xf0d5, 0xf0d6, 0xf0d7,
+ 0xf0d8, 0xf0d9, 0xf0da, 0xf0db, 0xf0dc, 0xf0dd, 0xf0de, 0xf0df,
+ 0xf0e0, 0xf0e1, 0xf0e2, 0xf0e3, 0xf0e4, 0xf0e5, 0xf0e6, 0xf0e7,
+ 0xf0e8, 0xf0e9, 0xf0ea, 0xf0eb, 0xf0ec, 0xf0ed, 0xf0ee, 0xf0ef,
+ 0xf0f0, 0xf0f1, 0xf0f2, 0xf0f3, 0xf0f4, 0xf0f5, 0xf0f6, 0xf0f7,
+ 0xf0f8, 0xf0f9, 0xf0fa, 0xf0fb, 0xf0fc, 0xf0fd, 0xf0fe, 0xf0ff
+ }
+};
+static u16 *UC_translate = NULL;
+
+static struct UC_charset UCInfo[MAXCHARSETS];
+
+/*
+ * The standard kernel character-to-font mappings are not invertible
+ * -- this is just a best effort.
+ */
+#define MAX_GLYPH 512 /* Max possible glyph value */
+
+static unsigned char *inv_translate = NULL;
+static unsigned char inv_norm_transl[MAX_GLYPH];
+static unsigned char *inverse_translations[4] =
+{NULL, NULL, NULL, NULL};
+
+static void set_inverse_transl(int i);
+static u16 *set_translate(int m);
+static int UC_valid_UC_charset(int UC_charset_hndl);
+static void UC_con_set_trans(int UC_charset_in_hndl, int Gn, int update_flag);
+static int con_insert_unipair(unsigned unicode, unsigned fontpos, int fordefault);
+static int con_insert_unipair_str(unsigned unicode, const char *replace_str, int fordefault);
+static void con_clear_unimap(int fordefault);
+static void con_clear_unimap_str(int fordefault);
+static void con_set_default_unimap(void);
+static int UC_con_set_unimap(int UC_charset_out_hndl, int update_flag);
+static int UC_con_set_unimap_str(unsigned ct, struct unipair_str *list, int fordefault);
+static int conv_uni_to_pc(long ucs, int usedefault);
+static int conv_uni_to_str(char *outbuf, int buflen, UCode_t ucs, int usedefault);
+static void UCconsole_map_init(void);
+static int UC_MapGN(int UChndl, int update_flag);
+static int UC_FindGN_byMIME(const char *UC_MIMEcharset);
+static void UCreset_allocated_LYCharSets(void);
+static STRING2PTR UC_setup_LYCharSets_repl(int UC_charset_in_hndl, unsigned lowest8);
+static int UC_Register_with_LYCharSets(int s,
+ const char *UC_MIMEcharset,
+ const char *UC_LYNXcharset,
+ int lowest_eightbit);
+
+#ifdef LY_FIND_LEAKS
+static void UCfree_allocated_LYCharSets(void);
+static void UCcleanup_mem(void);
+#endif
+
+static int default_UChndl = -1;
+
+static void set_inverse_transl(int i)
+{
+ int j, glyph;
+ u16 *p = translations[i];
+ unsigned char *q = inverse_translations[i];
+
+ if (!q) {
+ /*
+ * Slightly messy to avoid calling kmalloc too early.
+ */
+ q = inverse_translations[i] = ((i == LAT1_MAP) ?
+ inv_norm_transl :
+ typeMallocn(unsigned char, MAX_GLYPH));
+
+ if (!q)
+ return;
+ }
+ for (j = 0; j < MAX_GLYPH; j++)
+ q[j] = 0;
+
+ for (j = 0; j < E_TABSZ; j++) {
+ glyph = conv_uni_to_pc((long) p[j], 0);
+ if (glyph >= 0 && glyph < MAX_GLYPH && q[glyph] < 32) {
+ /*
+ * Prefer '-' above SHY etc.
+ */
+ q[glyph] = UCH(j);
+ }
+ }
+}
+
+static u16 *set_translate(int m)
+{
+ if (!inverse_translations[m])
+ set_inverse_transl(m);
+ inv_translate = inverse_translations[m];
+ return translations[m];
+}
+
+static int UC_valid_UC_charset(int UC_charset_hndl)
+{
+ return (UC_charset_hndl >= 0 && UC_charset_hndl < UCNumCharsets);
+}
+
+static void UC_con_set_trans(int UC_charset_in_hndl,
+ int Gn,
+ int update_flag)
+{
+ int i, j;
+ const u16 *p;
+ u16 *ptrans;
+
+ if (!UC_valid_UC_charset(UC_charset_in_hndl)) {
+ CTRACE((tfp, "UC_con_set_trans: Invalid charset handle %d.\n",
+ UC_charset_in_hndl));
+ return;
+ }
+ ptrans = translations[Gn];
+ p = UCInfo[UC_charset_in_hndl].unitable;
+#if(0)
+ if (p == UC_current_unitable) { /* test whether pointers are equal */
+ return; /* nothing to be done */
+ }
+ /*
+ * The font is always 256 characters - so far.
+ */
+ con_clear_unimap();
+#endif
+ for (i = 0; i < 256; i++) {
+ if ((j = UCInfo[UC_charset_in_hndl].unicount[i])) {
+ ptrans[i] = *p;
+ for (; j; j--) {
+ p++;
+ }
+ } else {
+ ptrans[i] = UCS_REPL;
+ }
+ }
+ if (update_flag) {
+ set_inverse_transl(Gn); /* Update inverse translation for this one */
+ }
+}
+
+/*
+ * Unicode -> current font conversion
+ *
+ * A font has at most 512 chars, usually 256.
+ * But one font position may represent several Unicode chars.
+ * A hashtable is somewhat of a pain to deal with, so use a
+ * "paged table" instead. Simulation has shown the memory cost of
+ * this 3-level paged table scheme to be comparable to a hash table.
+ */
+static int hashtable_contents_valid = 0; /* Use ASCII-only mode for bootup */
+static int hashtable_str_contents_valid = 0;
+
+static u16 **uni_pagedir[32] =
+{
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
+};
+
+static char ***uni_pagedir_str[32] =
+{
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
+};
+
+static const u16 *UC_current_unitable = NULL;
+static struct unimapdesc_str *UC_current_unitable_str = NULL;
+
+/*
+ * Keep a second set of structures for the translation designated
+ * as "default" - kw
+ */
+static int unidefault_contents_valid = 0; /* Use ASCII-only mode for bootup */
+static int unidefault_str_contents_valid = 0;
+
+static u16 **unidefault_pagedir[32] =
+{
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
+};
+static char ***unidefault_pagedir_str[32] =
+{
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
+};
+
+static const u16 *UC_default_unitable = 0;
+static const struct unimapdesc_str *UC_default_unitable_str = 0;
+
+static int con_insert_unipair(unsigned unicode, unsigned fontpos, int fordefault)
+{
+ int i;
+ unsigned n;
+ u16 **p1, *p2;
+
+ if (fordefault)
+ p1 = unidefault_pagedir[n = unicode >> 11];
+ else
+ p1 = uni_pagedir[n = unicode >> 11];
+ if (!p1) {
+ if ((p1 = typecallocn(u16 *, 32)) == NULL)
+ return ucError;
+ if (fordefault)
+ unidefault_pagedir[n] = p1;
+ else
+ uni_pagedir[n] = p1;
+ }
+
+ if (!(p2 = p1[n = (unicode >> 6) & 0x1f])) {
+ p2 = p1[n] = (u16 *) malloc(64 * sizeof(u16));
+ if (!p2)
+ return ucError;
+
+ for (i = 0; i < 64; i++) {
+ p2[i] = UCS_HIDE; /* No glyph for this character (yet) */
+ }
+ }
+
+ p2[unicode & 0x3f] = (u16) fontpos;
+
+ return 0;
+}
+
+static int con_insert_unipair_str(unsigned unicode, const char *replace_str,
+ int fordefault)
+{
+ unsigned n;
+ char ***p1;
+ const char **p2;
+
+ if (fordefault)
+ p1 = unidefault_pagedir_str[n = unicode >> 11];
+ else
+ p1 = uni_pagedir_str[n = unicode >> 11];
+ if (!p1) {
+ if ((p1 = typecallocn(char **, 32)) == NULL)
+ return ucError;
+
+ if (fordefault)
+ unidefault_pagedir_str[n] = p1;
+ else
+ uni_pagedir_str[n] = p1;
+ }
+
+ n = ((unicode >> 6) & 0x1f);
+ if (!p1[n]) {
+ if ((p1[n] = typecallocn(char *, 64)) == NULL)
+ return ucError;
+ }
+ p2 = (const char **) p1[n];
+
+ p2[unicode & 0x3f] = replace_str;
+
+ return 0;
+}
+
+/*
+ * ui arg was a leftover, deleted. - KW
+ */
+static void con_clear_unimap(int fordefault)
+{
+ int i, j;
+ u16 **p1;
+
+ if (fordefault) {
+ for (i = 0; i < 32; i++) {
+ if ((p1 = unidefault_pagedir[i]) != NULL) {
+ for (j = 0; j < 32; j++) {
+ FREE(p1[j]);
+ }
+ FREE(p1);
+ }
+ unidefault_pagedir[i] = NULL;
+ }
+
+ unidefault_contents_valid = 1;
+ } else {
+ for (i = 0; i < 32; i++) {
+ if ((p1 = uni_pagedir[i]) != NULL) {
+ for (j = 0; j < 32; j++) {
+ FREE(p1[j]);
+ }
+ FREE(p1);
+ }
+ uni_pagedir[i] = NULL;
+ }
+
+ hashtable_contents_valid = 1;
+ }
+}
+
+static void con_clear_unimap_str(int fordefault)
+{
+ int i, j;
+ char ***p1;
+
+ if (fordefault) {
+ for (i = 0; i < 32; i++) {
+ if ((p1 = unidefault_pagedir_str[i]) != NULL) {
+ for (j = 0; j < 32; j++) {
+ FREE(p1[j]);
+ }
+ FREE(p1);
+ }
+ unidefault_pagedir_str[i] = NULL;
+ }
+
+ unidefault_str_contents_valid = 1; /* ??? probably no use... */
+ } else {
+ for (i = 0; i < 32; i++) {
+ if ((p1 = uni_pagedir_str[i]) != NULL) {
+ for (j = 0; j < 32; j++) {
+ FREE(p1[j]);
+ }
+ FREE(p1);
+ }
+ uni_pagedir_str[i] = NULL;
+ }
+
+ hashtable_str_contents_valid = 1; /* ??? probably no use... */
+ }
+}
+
+/*
+ * Loads the unimap for the hardware font, as defined in uni_hash.tbl.
+ * The representation used was the most compact I could come up
+ * with. This routine is executed at sys_setup time, and when the
+ * PIO_FONTRESET ioctl is called.
+ */
+static void con_set_default_unimap(void)
+{
+ int i, j;
+ const u16 *p;
+
+ /*
+ * The default font is always 256 characters.
+ */
+ con_clear_unimap(1);
+
+ p = dfont_unitable;
+ for (i = 0; i < 256; i++) {
+ for (j = dfont_unicount[i]; j; j--) {
+ con_insert_unipair(*(p++), (u16) i, 1);
+ }
+ }
+
+ UC_default_unitable = dfont_unitable;
+
+ con_clear_unimap_str(1);
+ UC_con_set_unimap_str(dfont_replacedesc.entry_ct, repl_map, 1);
+ UC_default_unitable_str = &dfont_replacedesc;
+}
+
+int UCNumCharsets = 0;
+
+int UCLYhndl_HTFile_for_unspec = -1;
+int UCLYhndl_HTFile_for_unrec = -1;
+int UCLYhndl_for_unspec = -1;
+int UCLYhndl_for_unrec = -1;
+
+/* easy to type, will initialize later */
+int LATIN1 = -1; /* UCGetLYhndl_byMIME("iso-8859-1") */
+int US_ASCII = -1; /* UCGetLYhndl_byMIME("us-ascii") */
+int UTF8_handle = -1; /* UCGetLYhndl_byMIME("utf-8") */
+int TRANSPARENT = -1; /* UCGetLYhndl_byMIME("x-transparent") */
+
+static int UC_con_set_unimap(int UC_charset_out_hndl,
+ int update_flag)
+{
+ int i, j;
+ const u16 *p;
+
+ if (!UC_valid_UC_charset(UC_charset_out_hndl)) {
+ CTRACE((tfp, "UC_con_set_unimap: Invalid charset handle %d.\n",
+ UC_charset_out_hndl));
+ return ucError;
+ }
+
+ p = UCInfo[UC_charset_out_hndl].unitable;
+ if (p == UC_current_unitable) { /* test whether pointers are equal */
+ return update_flag; /* nothing to be done */
+ }
+ UC_current_unitable = p;
+
+ /*
+ * The font is always 256 characters - so far.
+ */
+ con_clear_unimap(0);
+
+ for (i = 0; i < 256; i++) {
+ for (j = UCInfo[UC_charset_out_hndl].unicount[i]; j; j--) {
+ con_insert_unipair(*(p++), (u16) i, 0);
+ }
+ }
+
+ if (update_flag) {
+ for (i = 0; i <= 3; i++) {
+ set_inverse_transl(i); /* Update all inverse translations */
+ }
+ }
+
+ return 0;
+}
+
+static int UC_con_set_unimap_str(unsigned ct, struct unipair_str *list,
+ int fordefault)
+{
+ int err = 0, err1;
+
+ while (ct--) {
+ if ((err1 = con_insert_unipair_str(list->unicode,
+ list->replace_str,
+ fordefault)) != 0) {
+ err = err1;
+ }
+ list++;
+ }
+
+ /*
+ * No inverse translations for replacement strings!
+ */
+ if (!err) {
+ if (fordefault)
+ unidefault_str_contents_valid = 1;
+ else
+ hashtable_str_contents_valid = 1;
+ }
+
+ return err;
+}
+
+static int conv_uni_to_pc(long ucs,
+ int usedefault)
+{
+ int h;
+ u16 **p1, *p2;
+
+ /*
+ * Only 16-bit codes supported at this time.
+ */
+ if (ucs > 0xffff) {
+ /*
+ * U+FFFD: REPLACEMENT CHARACTER.
+ */
+ ucs = UCS_REPL;
+ } else if (ucs < 0x20 || ucs >= 0xfffe) {
+ /*
+ * Not a printable character.
+ */
+ return ucError;
+ } else if (ucs == 0xfeff || (ucs >= 0x200b && ucs <= 0x200f)) {
+ /*
+ * Zero-width space.
+ */
+ return ucZeroWidth;
+ } else if ((ucs & ~UNI_DIRECT_MASK) == UNI_DIRECT_BASE) {
+ /*
+ * UNI_DIRECT_BASE indicates the start of the region in the
+ * User Zone which always has a 1:1 mapping to the currently
+ * loaded font. The UNI_DIRECT_MASK indicates the bit span
+ * of the region.
+ */
+ return (ucs & UNI_DIRECT_MASK);
+ }
+
+ if (usedefault) {
+ if (!unidefault_contents_valid)
+ return ucInvalidHash;
+ p1 = unidefault_pagedir[ucs >> 11];
+ } else {
+ if (!hashtable_contents_valid)
+ return ucInvalidHash;
+ p1 = uni_pagedir[ucs >> 11];
+ }
+
+ if (p1 &&
+ (p2 = p1[(ucs >> 6) & 0x1f]) &&
+ (h = p2[ucs & 0x3f]) < MAX_GLYPH) {
+ return h;
+ }
+
+ /*
+ * Not found.
+ */
+ return ucNotFound;
+}
+
+/*
+ * Note: contents of outbuf is not changes for negative return value!
+ */
+static int conv_uni_to_str(char *outbuf,
+ int buflen,
+ UCode_t ucs,
+ int usedefault)
+{
+ char *h;
+ char ***p1, **p2;
+
+ /*
+ * Only 16-bit codes supported at this time.
+ */
+ if (ucs > 0xffff) {
+ /*
+ * U+FFFD: REPLACEMENT CHARACTER.
+ */
+ ucs = UCS_REPL;
+ /*
+ * Maybe the following two cases should be allowed here?? - KW
+ */
+ } else if (ucs < 0x20 || ucs >= 0xfffe) {
+ /*
+ * Not a printable character.
+ */
+ return ucError;
+ } else if (ucs == 0xfeff || (ucs >= 0x200b && ucs <= 0x200f)) {
+ /*
+ * Zero-width space.
+ */
+ return ucZeroWidth;
+ }
+
+ if (usedefault) {
+ if (!unidefault_str_contents_valid)
+ return ucInvalidHash;
+ p1 = unidefault_pagedir_str[ucs >> 11];
+ } else {
+ if (!hashtable_str_contents_valid)
+ return ucInvalidHash;
+ p1 = uni_pagedir_str[ucs >> 11];
+ }
+
+ if (p1 &&
+ (p2 = p1[(ucs >> 6) & 0x1f]) &&
+ (h = p2[ucs & 0x3f])) {
+ StrNCpy(outbuf, h, (buflen - 1));
+ return 1; /* ok ! */
+ }
+
+ /*
+ * Not found.
+ */
+ return ucNotFound;
+}
+
+int UCInitialized = 0;
+
+/*
+ * [ original comment: - KW ]
+ * This is called at sys_setup time, after memory and the console are
+ * initialized. It must be possible to call kmalloc(..., GFP_KERNEL)
+ * from this function, hence the call from sys_setup.
+ */
+static void UCconsole_map_init(void)
+{
+ con_set_default_unimap();
+ UCInitialized = 1;
+}
+
+/*
+ * OK now, finally, some stuff that is more specifically for Lynx: - KW
+ */
+int UCTransUniChar(UCode_t unicode,
+ int charset_out)
+{
+ int rc = 0;
+ int UChndl_out;
+ int isdefault, trydefault = 0;
+ const u16 *ut;
+
+ if ((UChndl_out = LYCharSet_UC[charset_out].UChndl) < 0) {
+ if (LYCharSet_UC[charset_out].codepage < 0) {
+ if (unicode < 128) {
+ rc = (int) unicode;
+ } else {
+ rc = LYCharSet_UC[charset_out].codepage;
+ }
+ return rc;
+ }
+ if ((UChndl_out = default_UChndl) < 0) {
+ return ucCannotOutput;
+ }
+ isdefault = 1;
+ } else {
+ isdefault = UCInfo[UChndl_out].replacedesc.isdefault;
+ trydefault = UCInfo[UChndl_out].replacedesc.trydefault;
+ }
+
+ if (!isdefault) {
+ ut = UCInfo[UChndl_out].unitable;
+ if (ut != UC_current_unitable) {
+ rc = UC_con_set_unimap(UChndl_out, 1);
+ if (rc < 0) {
+ return rc;
+ }
+ }
+ rc = conv_uni_to_pc(unicode, 0);
+ if (rc >= 0) {
+ return rc;
+ }
+ }
+ if (isdefault || trydefault) {
+ rc = conv_uni_to_pc(unicode, 1);
+ if (rc >= 0) {
+ return rc;
+ }
+ }
+ if (!isdefault && (rc == ucNotFound)) {
+ rc = conv_uni_to_pc(UCS_REPL, 0);
+ }
+ if ((isdefault || trydefault) && (rc == ucNotFound)) {
+ rc = conv_uni_to_pc(UCS_REPL, 1);
+ }
+ return rc;
+}
+
+/*
+ * Returns string length, or negative value for error.
+ */
+int UCTransUniCharStr(char *outbuf,
+ int buflen,
+ UCode_t unicode,
+ int charset_out,
+ int chk_single_flag)
+{
+ int rc = ucUnknown, src = 0;
+ int UChndl_out;
+ int isdefault, trydefault = 0;
+ struct unimapdesc_str *repl;
+ const u16 *ut;
+
+ if (buflen < 2)
+ return ucBufferTooSmall;
+
+ if ((UChndl_out = LYCharSet_UC[charset_out].UChndl) < 0) {
+ if (LYCharSet_UC[charset_out].codepage < 0)
+ return LYCharSet_UC[charset_out].codepage;
+ if ((UChndl_out = default_UChndl) < 0)
+ return ucCannotOutput;
+ isdefault = 1;
+ } else {
+ isdefault = UCInfo[UChndl_out].replacedesc.isdefault;
+ trydefault = UCInfo[UChndl_out].replacedesc.trydefault;
+ }
+
+ if (chk_single_flag) {
+ if (!isdefault) {
+ ut = UCInfo[UChndl_out].unitable;
+ if (ut != UC_current_unitable) {
+ src = UC_con_set_unimap(UChndl_out, 1);
+ if (src < 0) {
+ return src;
+ }
+ }
+ }
+ src = conv_uni_to_pc(unicode, isdefault);
+ if (src >= 32) {
+ outbuf[0] = (char) src;
+ outbuf[1] = '\0';
+ return 1;
+ }
+ }
+
+ repl = &(UCInfo[UChndl_out].replacedesc);
+ if (!isdefault) {
+ if (repl != UC_current_unitable_str) {
+ con_clear_unimap_str(0);
+ (void) UC_con_set_unimap_str(repl->entry_ct, repl->entries, 0);
+ UC_current_unitable_str = repl;
+ }
+ rc = conv_uni_to_str(outbuf, buflen, unicode, 0);
+ if (rc >= 0)
+ return (int) strlen(outbuf);
+ }
+ if (trydefault && chk_single_flag) {
+ src = conv_uni_to_pc(unicode, 1);
+ if (src >= 32) {
+ outbuf[0] = (char) src;
+ outbuf[1] = '\0';
+ return 1;
+ }
+ }
+ if (isdefault || trydefault) {
+#ifdef USE_JAPANESEUTF8_SUPPORT
+ if (LYCharSet_UC[charset_out].codepage == 0 &&
+ LYCharSet_UC[charset_out].codepoints == 0) {
+ iconv_t cd;
+ char str[3], *pin, *pout;
+ size_t inleft, outleft;
+ char *tocode = NULL;
+
+ str[0] = (char) (unicode >> 8);
+ str[1] = (char) (unicode & 0xFF);
+ str[2] = 0;
+ pin = str;
+ inleft = 2;
+ pout = outbuf;
+ outleft = (size_t) buflen;
+ /*
+ * Try TRANSLIT first, since it is an extension which can provide
+ * translations when there is no available exact translation to
+ * the target character set.
+ */
+ HTSprintf0(&tocode, "%s//TRANSLIT", LYCharSet_UC[charset_out].MIMEname);
+ cd = iconv_open(tocode, "UTF-16BE");
+ if (cd == (iconv_t) -1) {
+ /*
+ * Try again, without TRANSLIT
+ */
+ HTSprintf0(&tocode, "%s", LYCharSet_UC[charset_out].MIMEname);
+ cd = iconv_open(tocode, "UTF-16BE");
+
+ if (cd == (iconv_t) -1) {
+ CTRACE((tfp,
+ "Warning: Cannot transcode form charset %s to %s!\n",
+ "UTF-16BE", tocode));
+ }
+ }
+ FREE(tocode);
+
+ if (cd != (iconv_t) -1) {
+ rc = (int) iconv(cd, (ICONV_CONST char **) &pin, &inleft,
+ &pout, &outleft);
+ iconv_close(cd);
+ if ((pout - outbuf) == 3) {
+ CTRACE((tfp,
+ "It seems to be a JIS X 0201 code(%" PRI_UCode_t
+ "). Not supported.\n", CAST_UCode_t (unicode)));
+ pin = str;
+ inleft = 2;
+ pout = outbuf;
+ outleft = (size_t) buflen;
+ } else if (rc >= 0) {
+ *pout = '\0';
+ return (int) strlen(outbuf);
+ }
+ }
+ }
+#endif
+ rc = conv_uni_to_str(outbuf, buflen, unicode, 1);
+ if (rc >= 0)
+ return (int) strlen(outbuf);
+ }
+ if (rc == ucNotFound) {
+ if (!isdefault)
+ rc = conv_uni_to_str(outbuf, buflen, UCS_REPL, 0);
+ if ((rc == ucNotFound) && (isdefault || trydefault))
+ rc = conv_uni_to_str(outbuf, buflen, UCS_REPL, 1);
+ if (rc >= 0)
+ return (int) strlen(outbuf);
+ }
+ if (chk_single_flag && src == ucNotFound) {
+ if (!isdefault)
+ rc = conv_uni_to_pc(UCS_REPL, 0);
+ if ((rc == ucNotFound) && (isdefault || trydefault))
+ rc = conv_uni_to_pc(UCS_REPL, 1);
+ if (rc >= 32) {
+ outbuf[0] = (char) rc;
+ outbuf[1] = '\0';
+ return 1;
+ }
+ return rc;
+ }
+ return ucNotFound;
+}
+
+static int UC_lastautoGN = 0;
+
+static int UC_MapGN(int UChndl,
+ int update_flag)
+{
+ int i, Gn, found, lasthndl;
+
+ found = 0;
+ Gn = -1;
+ for (i = 0; i < 4 && Gn < 0; i++) {
+ if (UC_GNhandles[i] < 0) {
+ Gn = i;
+ } else if (UC_GNhandles[i] == UChndl) {
+ Gn = i;
+ found = 1;
+ }
+ }
+ if (found)
+ return Gn;
+ if (Gn >= 0) {
+ UCInfo[UChndl].GN = Gn;
+ UC_GNhandles[Gn] = UChndl;
+ } else {
+ if (UC_lastautoGN == GRAF_MAP) {
+ Gn = IBMPC_MAP;
+ } else {
+ Gn = GRAF_MAP;
+ }
+ UC_lastautoGN = Gn;
+ lasthndl = UC_GNhandles[Gn];
+ UCInfo[lasthndl].GN = -1;
+ UCInfo[UChndl].GN = Gn;
+ UC_GNhandles[Gn] = UChndl;
+ }
+ CTRACE((tfp, "UC_MapGN: Using %d <- %d (%s)\n",
+ Gn, UChndl, UCInfo[UChndl].MIMEname));
+ UC_con_set_trans(UChndl, Gn, update_flag);
+ return Gn;
+}
+
+int UCTransChar(int ch_in,
+ int charset_in,
+ int charset_out)
+{
+ UCode_t unicode;
+ int Gn;
+ int rc = ucNotFound;
+ int UChndl_in, UChndl_out;
+ int isdefault, trydefault = 0;
+ const u16 *ut;
+ int upd = 0;
+
+ if (charset_in == charset_out)
+ return UCH(ch_in);
+ if (charset_in < 0)
+ return ucCannotConvert;
+ if ((UChndl_in = LYCharSet_UC[charset_in].UChndl) < 0)
+ return ucCannotConvert;
+ if ((UChndl_out = LYCharSet_UC[charset_out].UChndl) < 0) {
+ if (LYCharSet_UC[charset_out].codepage < 0)
+ return LYCharSet_UC[charset_out].codepage;
+ if ((UChndl_out = default_UChndl) < 0)
+ return ucCannotOutput;
+ isdefault = 1;
+ } else {
+ isdefault = UCInfo[UChndl_out].replacedesc.isdefault;
+ trydefault = UCInfo[UChndl_out].replacedesc.trydefault;
+ }
+ if (!UCInfo[UChndl_in].num_uni)
+ return ucCannotConvert;
+ if ((Gn = UCInfo[UChndl_in].GN) < 0) {
+ Gn = UC_MapGN(UChndl_in, 0);
+ upd = 1;
+ }
+
+ ut = UCInfo[UChndl_out].unitable;
+ if (!isdefault) {
+ if (ut == UC_current_unitable) {
+ if (upd) {
+ set_inverse_transl(Gn);
+ }
+ } else {
+ rc = UC_con_set_unimap(UChndl_out, 1);
+ if (rc > 0) {
+ set_inverse_transl(Gn);
+ } else if (rc < 0) {
+ return rc;
+ }
+ }
+ }
+ UC_translate = set_translate(Gn);
+ unicode = UC_translate[UCH(ch_in)];
+ if (!isdefault) {
+ rc = conv_uni_to_pc(unicode, 0);
+ if (rc >= 0)
+ return rc;
+ }
+ if ((rc == ucNotFound) && (isdefault || trydefault)) {
+ rc = conv_uni_to_pc(unicode, 1);
+ }
+ if ((rc == ucNotFound) && !isdefault) {
+ rc = conv_uni_to_pc(UCS_REPL, 0);
+ }
+ if ((rc == ucNotFound) && (isdefault || trydefault)) {
+ rc = conv_uni_to_pc(UCS_REPL, 1);
+ }
+ return rc;
+}
+
+#if defined(USE_JAPANESEUTF8_SUPPORT) || defined(EXP_CHINESEUTF8_SUPPORT)
+UCode_t UCTransJPToUni(char *inbuf,
+ int buflen,
+ int charset_in)
+{
+ char outbuf[3], *pin, *pout;
+ size_t ilen, olen;
+ iconv_t cd;
+
+ pin = inbuf;
+ pout = outbuf;
+ ilen = 2;
+ olen = (size_t) buflen;
+
+ cd = iconv_open("UTF-16BE", LYCharSet_UC[charset_in].MIMEname);
+ (void) iconv(cd, (ICONV_CONST char **) &pin, &ilen, &pout, &olen);
+ iconv_close(cd);
+ if ((ilen == 0) && (olen == 0)) {
+ return (((unsigned char) outbuf[0]) << 8) + (unsigned char) outbuf[1];
+ }
+ return ucCannotConvert;
+}
+#endif
+
+/*
+ * Translate a character to Unicode. If additional bytes are needed, this
+ * returns ucNeedMore, based on its internal state. To reset the state,
+ * call this with charset_in < 0.
+ */
+UCode_t UCTransToUni(int ch_in,
+ int charset_in)
+{
+ static char buffer[10];
+ static unsigned inx = 0;
+
+ UCode_t unicode;
+ int Gn;
+ unsigned char ch_iu = UCH(ch_in);
+ int UChndl_in;
+
+ /*
+ * Reset saved-state.
+ */
+ if (charset_in < 0) {
+ inx = 0;
+ return ucCannotConvert;
+ } else if (charset_in == LATIN1) {
+ return ch_iu;
+ } else if (charset_in == UTF8_handle) {
+ if (is8bits(ch_iu)) {
+ unsigned need;
+ const char *ptr;
+
+ buffer[inx++] = (char) ch_iu;
+ buffer[inx] = '\0';
+ need = (unsigned) utf8_length(TRUE, buffer);
+ if (need && (need + 1) == inx) {
+ inx = 0;
+ ptr = buffer;
+ return UCGetUniFromUtf8String(&ptr);
+ } else if (inx < sizeof(buffer) - 1) {
+ return ucNeedMore;
+ } else {
+ inx = 0;
+ }
+ } else {
+ inx = 0;
+ }
+ }
+#ifdef USE_JAPANESEUTF8_SUPPORT
+ if ((strcmp(LYCharSet_UC[charset_in].MIMEname, "shift_jis") == 0) ||
+ (strcmp(LYCharSet_UC[charset_in].MIMEname, "euc-jp") == 0)) {
+ char obuffer[3], *pin, *pout;
+ size_t ilen, olen;
+ iconv_t cd;
+
+ pin = buffer;
+ pout = obuffer;
+ ilen = olen = 2;
+ if (strcmp(LYCharSet_UC[charset_in].MIMEname, "shift_jis") == 0) {
+ if (inx == 0) {
+ if (IS_SJIS_HI1(ch_iu) ||
+ IS_SJIS_HI2(ch_iu)) {
+ buffer[0] = (char) ch_in;
+ inx = 1;
+ return ucNeedMore;
+ } else if (IS_SJIS_X0201KANA(ch_iu)) {
+ buffer[0] = (char) ch_in;
+ buffer[1] = 0;
+ cd = iconv_open("UTF-16BE", "Shift_JIS");
+ ilen = 1;
+ (void) iconv(cd, (ICONV_CONST char **) &pin, &ilen, &pout, &olen);
+ iconv_close(cd);
+ if ((ilen == 0) && (olen == 0)) {
+ return (UCH(obuffer[0]) << 8) + UCH(obuffer[1]);
+ }
+ }
+ } else {
+ if (IS_SJIS_LO(ch_iu)) {
+ buffer[1] = (char) ch_in;
+ buffer[2] = 0;
+
+ cd = iconv_open("UTF-16BE", "Shift_JIS");
+ (void) iconv(cd, (ICONV_CONST char **) &pin, &ilen, &pout, &olen);
+ iconv_close(cd);
+ inx = 0;
+ if ((ilen == 0) && (olen == 0)) {
+ return (UCH(obuffer[0]) << 8) + UCH(obuffer[1]);
+ }
+ }
+ }
+ }
+ if (strcmp(LYCharSet_UC[charset_in].MIMEname, "euc-jp") == 0) {
+ if (inx == 0) {
+ if (IS_EUC_HI(ch_iu) || ch_iu == 0x8E) {
+ buffer[0] = (char) ch_in;
+ inx = 1;
+ return ucNeedMore;
+ }
+ } else {
+ if (IS_EUC_LOX(ch_iu)) {
+ buffer[1] = (char) ch_in;
+ buffer[2] = 0;
+
+ cd = iconv_open("UTF-16BE", "EUC-JP");
+ (void) iconv(cd, (ICONV_CONST char **) &pin, &ilen, &pout, &olen);
+ iconv_close(cd);
+ inx = 0;
+ if ((ilen == 0) && (olen == 0)) {
+ return (UCH(obuffer[0]) << 8) + UCH(obuffer[1]);
+ }
+ }
+ }
+ }
+ inx = 0;
+ }
+#endif
+ if (ch_iu < 128 && ch_iu >= 32)
+ return ch_iu;
+
+ if (ch_iu < 32 &&
+ LYCharSet_UC[charset_in].enc != UCT_ENC_8BIT_C0) {
+ /*
+ * Don't translate C0 chars except for specific charsets.
+ */
+ return ch_iu;
+ } else if ((UChndl_in = LYCharSet_UC[charset_in].UChndl) < 0) {
+ return ucCannotConvert;
+ } else if (!UCInfo[UChndl_in].num_uni) {
+ return ucCannotConvert;
+ }
+
+ if ((Gn = UCInfo[UChndl_in].GN) < 0) {
+ Gn = UC_MapGN(UChndl_in, 1);
+ }
+
+ UC_translate = set_translate(Gn);
+ unicode = UC_translate[ch_iu];
+
+ return unicode;
+}
+
+int UCReverseTransChar(int ch_out,
+ int charset_in,
+ int charset_out)
+{
+ int Gn;
+ int rc = ucError;
+ int UChndl_in, UChndl_out;
+ int isdefault;
+ int i_ch = UCH(ch_out);
+ const u16 *ut;
+
+ if (charset_in == charset_out)
+ return UCH(ch_out);
+ if (charset_in < 0)
+ return ucCannotConvert;
+ if ((UChndl_in = LYCharSet_UC[charset_in].UChndl) < 0)
+ return ucCannotConvert;
+ if (!UCInfo[UChndl_in].num_uni)
+ return ucCannotConvert;
+ if (charset_out < 0)
+ return ucCannotOutput;
+ if ((UChndl_out = LYCharSet_UC[charset_out].UChndl) < 0) {
+ if (LYCharSet_UC[charset_out].codepage < 0)
+ return LYCharSet_UC[charset_out].codepage;
+ if ((UChndl_out = default_UChndl) < 0)
+ return ucCannotOutput;
+ isdefault = 1;
+ } else {
+ isdefault = UCInfo[UChndl_out].replacedesc.isdefault;
+ }
+
+ if (!isdefault) {
+ /*
+ * Try to use the inverse table if charset_out is not equivalent
+ * to using just the default table. If it is, it should have
+ * just ASCII chars and trying to back-translate those should
+ * not give anything but themselves. - kw
+ */
+ ut = UCInfo[UChndl_out].unitable;
+ if (ut == UC_current_unitable) {
+ if ((Gn = UCInfo[UChndl_in].GN) < 0) {
+ Gn = UC_MapGN(UChndl_in, 1);
+ }
+ UC_translate = set_translate(Gn);
+ if (inv_translate)
+ rc = inv_translate[i_ch];
+ if (rc >= 32) {
+ return rc;
+ }
+ }
+ }
+ return UCTransChar(ch_out, charset_out, charset_in);
+}
+
+/*
+ * Returns string length, or negative value for error.
+ */
+int UCTransCharStr(char *outbuf,
+ int buflen,
+ int ch_in,
+ int charset_in,
+ int charset_out,
+ int chk_single_flag)
+{
+ UCode_t unicode;
+ int Gn;
+ int rc = ucUnknown, src = 0;
+ int UChndl_in, UChndl_out;
+ int isdefault, trydefault = 0;
+ struct unimapdesc_str *repl;
+ const u16 *ut;
+ int upd = 0;
+
+ if (buflen < 2)
+ return ucBufferTooSmall;
+ if (chk_single_flag && charset_in == charset_out) {
+ outbuf[0] = (char) ch_in;
+ outbuf[1] = '\0';
+ return 1;
+ }
+ if (charset_in < 0)
+ return ucCannotConvert;
+ if ((UChndl_in = LYCharSet_UC[charset_in].UChndl) < 0)
+ return ucCannotConvert;
+ if (!UCInfo[UChndl_in].num_uni)
+ return ucCannotConvert;
+ if ((UChndl_out = LYCharSet_UC[charset_out].UChndl) < 0) {
+ if (LYCharSet_UC[charset_out].codepage < 0)
+ return LYCharSet_UC[charset_out].codepage;
+ if ((UChndl_out = default_UChndl) < 0)
+ return ucCannotOutput;
+ isdefault = 1;
+ } else {
+ isdefault = UCInfo[UChndl_out].replacedesc.isdefault;
+ trydefault = UCInfo[UChndl_out].replacedesc.trydefault;
+ }
+ if ((Gn = UCInfo[UChndl_in].GN) < 0) {
+ Gn = UC_MapGN(UChndl_in, !chk_single_flag);
+ upd = chk_single_flag;
+ }
+
+ UC_translate = set_translate(Gn);
+ unicode = UC_translate[UCH(ch_in)];
+
+ if (chk_single_flag) {
+ if (!isdefault) {
+ ut = UCInfo[UChndl_out].unitable;
+ if (ut == UC_current_unitable) {
+ if (upd)
+ set_inverse_transl(Gn);
+ } else {
+ src = UC_con_set_unimap(UChndl_out, 1);
+ if (src > 0) {
+ set_inverse_transl(Gn);
+ } else if (src < 0) {
+ return src;
+ }
+ }
+ }
+ src = conv_uni_to_pc(unicode, isdefault);
+ if (src >= 32) {
+ outbuf[0] = (char) src;
+ outbuf[1] = '\0';
+ return 1;
+ }
+ }
+
+ repl = &(UCInfo[UChndl_out].replacedesc);
+ if (!isdefault) {
+ if (repl != UC_current_unitable_str) {
+ con_clear_unimap_str(0);
+ (void) UC_con_set_unimap_str(repl->entry_ct, repl->entries, 0);
+ UC_current_unitable_str = repl;
+ }
+ rc = conv_uni_to_str(outbuf, buflen, unicode, 0);
+ if (rc >= 0)
+ return (int) strlen(outbuf);
+ }
+ if (trydefault && chk_single_flag) {
+ src = conv_uni_to_pc(unicode, 1);
+ if (src >= 32) {
+ outbuf[0] = (char) src;
+ outbuf[1] = '\0';
+ return 1;
+ }
+ }
+ if (isdefault || trydefault) {
+ rc = conv_uni_to_str(outbuf, buflen, unicode, 1);
+ if (rc >= 0)
+ return (int) strlen(outbuf);
+ }
+ if (rc == ucNotFound) {
+ if (!isdefault)
+ rc = conv_uni_to_str(outbuf, buflen, UCS_REPL, 0);
+ if ((rc == ucNotFound) && (isdefault || trydefault))
+ rc = conv_uni_to_str(outbuf, buflen, UCS_REPL, 1);
+ if (rc >= 0)
+ return (int) strlen(outbuf);
+ }
+ if (chk_single_flag && src == ucNotFound) {
+ if (!isdefault)
+ rc = conv_uni_to_pc(UCS_REPL, 0);
+ if ((rc == ucNotFound) && (isdefault || trydefault))
+ rc = conv_uni_to_pc(UCS_REPL, 1);
+ if (rc >= 32) {
+ outbuf[0] = (char) rc;
+ outbuf[1] = '\0';
+ return 1;
+ } else if (rc <= 0) {
+ outbuf[0] = '\0';
+ return rc;
+ }
+ return rc;
+ }
+ return ucNotFound;
+}
+
+static int UC_FindGN_byMIME(const char *UC_MIMEcharset)
+{
+ int i;
+
+ for (i = 0; i < 4; i++) {
+ if (!strcmp(UC_MIMEcharset, UC_GNsetMIMEnames[i])) {
+ return i;
+ }
+ }
+ return ucError;
+}
+
+int UCGetRawUniMode_byLYhndl(int i)
+{
+ if (i < 0)
+ return 0;
+ return LYCharSet_UC[i].enc;
+}
+
+/*
+ * Construct a new charset name, given prefix and codepage. This introduces
+ * potentially unchecked recursion into UCGetLYhntl_byMIME if neither the "cp"
+ * nor "windows-" prefixes are configured, so we check it here.
+ */
+static int getLYhndl_byCP(const char *prefix,
+ const char *codepage)
+{
+ static int nested;
+ int result = ucError;
+
+ if (!nested++) {
+ char *cptmp = NULL;
+
+ StrAllocCopy(cptmp, prefix);
+ StrAllocCat(cptmp, codepage);
+ result = UCGetLYhndl_byMIME(cptmp);
+ FREE(cptmp);
+ }
+ nested--;
+ return result;
+}
+
+/*
+ * Get Lynx internal charset handler from MIME name,
+ * return -1 if we got NULL or did not recognize value.
+ * According to RFC, MIME headers should match case-insensitively.
+ */
+int UCGetLYhndl_byMIME(const char *value)
+{
+ int i;
+ int LYhndl = -1;
+
+ if (isEmpty(value)) {
+ CTRACE((tfp,
+ "UCGetLYhndl_byMIME: NULL argument instead of MIME name.\n"));
+ return ucError;
+ }
+
+ for (i = 0;
+ (i < MAXCHARSETS && i < LYNumCharsets &&
+ LYchar_set_names[i]); i++) {
+ if (LYCharSet_UC[i].MIMEname &&
+ !strcasecomp(value, LYCharSet_UC[i].MIMEname)) {
+ return i;
+ }
+ }
+
+ /*
+ * Not yet found, try synonyms. - FM
+ */
+#if !NO_CHARSET_utf_8
+ if (!strcasecomp(value, "unicode-1-1-utf-8") ||
+ !strcasecomp(value, "utf8")) {
+ /*
+ * Treat these as synonyms for the IANA registered name. - FM
+ */
+ return UCGetLYhndl_byMIME("utf-8");
+ }
+#endif
+ if (!strncasecomp(value, "iso", 3) && !StrNCmp(value + 3, "8859", 4)) {
+ return getLYhndl_byCP("iso-", value + 3);
+ }
+ if (!strcasecomp(value, "iso-8859-8-i") ||
+ !strcasecomp(value, "iso-8859-8-e")) {
+ return UCGetLYhndl_byMIME("iso-8859-8");
+ }
+#if !NO_CHARSET_euc_jp
+ if (!strcasecomp(value, "x-euc-jp") ||
+ !strcasecomp(value, "eucjp")) {
+ return UCGetLYhndl_byMIME("euc-jp");
+ }
+#endif
+#if !NO_CHARSET_shift_jis
+ if ((!strcasecomp(value, "x-shift-jis")) ||
+ (!strcasecomp(value, "x-sjis")) ||
+ (!strcasecomp(value, "pck"))) {
+ return UCGetLYhndl_byMIME("shift_jis");
+ }
+#endif
+#if !NO_CHARSET_euc_kr
+ if ((!strcasecomp(value, "iso-2022-kr")) ||
+ (!strcasecomp(value, "ks_c_5601-1987"))) {
+ return UCGetLYhndl_byMIME("euc-kr");
+ }
+#endif
+#if !NO_CHARSET_euc_cn
+ if (!strcasecomp(value, "gb2312") ||
+ !strncasecomp(value, "cn-gb", 5) ||
+ !strcasecomp(value, "iso-2022-cn")) {
+ return UCGetLYhndl_byMIME("euc-cn");
+ }
+#endif
+#if !NO_CHARSET_big5
+ if (!strcasecomp(value, "cn-big5")) {
+ return UCGetLYhndl_byMIME("big5");
+ }
+#endif
+#if !NO_CHARSET_macintosh
+ if (!strcasecomp(value, "x-mac-roman") ||
+ !strcasecomp(value, "mac-roman")) {
+ return UCGetLYhndl_byMIME("macintosh");
+ }
+#endif
+#if !NO_CHARSET_next
+ if (!strcasecomp(value, "x-next") ||
+ !strcasecomp(value, "nextstep") ||
+ !strcasecomp(value, "x-nextstep")) {
+ return UCGetLYhndl_byMIME("next");
+ }
+#endif
+#if !NO_CHARSET_windows_1252
+ if (!strcasecomp(value, "iso-8859-1-windows-3.1-latin-1") ||
+ !strcasecomp(value, "cp1252") ||
+ !strcasecomp(value, "cp-1252") ||
+ !strcasecomp(value, "ibm1252") ||
+ !strcasecomp(value, "iso-8859-1-windows-3.0-latin-1")) {
+ /*
+ * Treat these as synonyms for windows-1252, which is more
+ * commonly used than the IANA registered name. - FM
+ */
+ return UCGetLYhndl_byMIME("windows-1252");
+ }
+#endif
+#if !NO_CHARSET_windows_1251
+ if (!strcasecomp(value, "ansi-1251")) {
+ return UCGetLYhndl_byMIME("windows-1251");
+ }
+#endif
+#if !NO_CHARSET_windows_1250
+ if (!strcasecomp(value, "iso-8859-2-windows-latin-2") ||
+ !strcasecomp(value, "cp1250") ||
+ !strcasecomp(value, "cp-1250") ||
+ !strcasecomp(value, "ibm1250")) {
+ /*
+ * Treat these as synonyms for windows-1250. - FM
+ */
+ return UCGetLYhndl_byMIME("windows-1250");
+ }
+#endif
+ if ((!strncasecomp(value, "ibm", 3) ||
+ !strncasecomp(value, "cp-", 3)) &&
+ isdigit(UCH(value[3])) &&
+ isdigit(UCH(value[4])) &&
+ isdigit(UCH(value[5]))) {
+ /*
+ * For "ibmNNN<...>" or "cp-NNN", try "cpNNN<...>"
+ * if not yet found. - KW & FM
+ */
+ if ((LYhndl = getLYhndl_byCP("cp", value + 3)) >= 0)
+ return LYhndl;
+ /*
+ * Try windows-NNN<...> if not yet found. - FM
+ */
+ return getLYhndl_byCP("windows-", value + 3);
+ }
+ if (!strncasecomp(value, "windows-", 8) &&
+ isdigit(UCH(value[8])) &&
+ isdigit(UCH(value[9])) &&
+ isdigit(UCH(value[10]))) {
+ /*
+ * For "windows-NNN<...>", try "cpNNN<...>" - FM
+ */
+ return getLYhndl_byCP("cp", value + 8);
+ }
+#if !NO_CHARSET_koi8_r
+ if (!strcasecomp(value, "koi-8")) { /* accentsoft bugosity */
+ return UCGetLYhndl_byMIME("koi8-r");
+ }
+#endif
+ if (!strcasecomp(value, "ANSI_X3.4-1968")) {
+ return US_ASCII;
+ }
+ /* no more synonyms if come here... */
+
+ CTRACE((tfp, "UCGetLYhndl_byMIME: unrecognized MIME name \"%s\"\n", value));
+ return ucError; /* returns -1 if no charset found by that MIME name */
+}
+
+/*
+ * Function UC_setup_LYCharSets_repl() tries to set up a subtable in
+ * LYCharSets[] appropriate for this new charset, for compatibility with the
+ * "old method". Maybe not nice (maybe not even necessary any more), but it
+ * works (as far as it goes..).
+ *
+ * We try to be conservative and only allocate new memory for this if needed.
+ * If not needed, just point to SevenBitApproximations[i]. [Could do the same
+ * for ISO_Latin1[] if it's identical to that, but would make it even *more*
+ * messy than it already is...] This the only function in this file that knows,
+ * or cares, about the HTMLDTD or details of LYCharSets[] subtables (and
+ * therefore somewhat violates the idea that this file should be independent of
+ * those). As in other places, we rely on ISO_Latin1 being the *first* table
+ * in LYCharSets. - KW
+ */
+
+/*
+ * We need to remember which ones were allocated and which are static.
+ */
+static STRING2PTR remember_allocated_LYCharSets[MAXCHARSETS];
+
+static void UCreset_allocated_LYCharSets(void)
+{
+ int i = 0;
+
+ for (; i < MAXCHARSETS; i++) {
+ remember_allocated_LYCharSets[i] = NULL;
+ }
+}
+
+#ifdef LY_FIND_LEAKS
+static void UCfree_allocated_LYCharSets(void)
+{
+ int i = 0;
+
+ for (; i < MAXCHARSETS; i++) {
+ if (remember_allocated_LYCharSets[i] != NULL) {
+ FREE(remember_allocated_LYCharSets[i]);
+ }
+ }
+}
+#endif
+
+static STRING2PTR UC_setup_LYCharSets_repl(int UC_charset_in_hndl,
+ unsigned lowest8)
+{
+ STRING2PTR ISO_Latin1 = LYCharSets[0];
+ const char **p;
+ char **prepl;
+ const u16 *pp;
+ const char **tp;
+ const char *s7;
+ const char *s8;
+ size_t i;
+ int j, changed;
+ u16 k;
+ u8 *ti;
+
+ /*
+ * Create a temporary table for reverse lookup of latin1 codes:
+ */
+ if ((tp = typecallocn(const char *, 96)) == NULL)
+ return NULL;
+
+ if ((ti = typecallocn(u8, 96)) == NULL) {
+ FREE(tp);
+ return NULL;
+ }
+
+ pp = UCInfo[UC_charset_in_hndl].unitable;
+
+ /*
+ * Determine if we have any mapping of a Unicode in the range 160-255
+ * to an allowed code point > 0x80 in our new charset...
+ * Store any mappings found in ti[].
+ */
+ if (UCInfo[UC_charset_in_hndl].num_uni > 0) {
+ for (i = 0; i < 256; i++) {
+ if ((j = UCInfo[UC_charset_in_hndl].unicount[i])) {
+ if ((k = *pp) >= 160 && k < 256 && i >= lowest8) {
+ ti[k - 160] = UCH(i);
+ }
+ for (; j; j--) {
+ pp++;
+ }
+ }
+ }
+ } {
+ u16 ct;
+ struct unipair_str *list;
+
+ /*
+ * Determine if we have any mapping of a Unicode in the range
+ * 160-255 to a replacement string for our new charset...
+ * Store any mappings found in tp[].
+ */
+ ct = UCInfo[UC_charset_in_hndl].replacedesc.entry_ct;
+ list = UCInfo[UC_charset_in_hndl].replacedesc.entries;
+ while (ct--) {
+ if ((k = list->unicode) >= 160 && k < 256) {
+ tp[k - 160] = list->replace_str;
+ }
+ list++;
+ }
+ }
+ /*
+ * Now allocate a new table compatible with LYCharSets[]
+ * and with the HTMLDTD for entities.
+ * We don't know yet whether we'll keep it around.
+ */
+ prepl = (char **) malloc(HTML_dtd.number_of_entities * sizeof(char *));
+
+ if (!prepl) {
+ FREE(tp);
+ FREE(ti);
+ return 0;
+ }
+
+ p = (const char **) prepl;
+ changed = 0;
+ for (i = 0; i < HTML_dtd.number_of_entities; i++, p++) {
+ /*
+ * For each of those entities, we check what the "old method"
+ * ISO_Latin1[] mapping does with them. If it is nothing we
+ * want to use, just point to the SevenBitApproximations[] string.
+ */
+ s7 = SevenBitApproximations[i];
+ s8 = ISO_Latin1[i];
+ *p = s7;
+ if (s8 && UCH(*s8) >= 160 && s8[1] == '\0') {
+ /*
+ * We have an entity that is mapped to
+ * one valid eightbit latin1 char.
+ */
+ if (ti[UCH(*s8) - 160] >= UCH(lowest8) &&
+ !(UCH(s7[0]) == ti[UCH(*s8) - 160] &&
+ s7[1] == '\0')) {
+ /*
+ * ...which in turn is mapped, by our "new method",
+ * to another valid eightbit char for this new
+ * charset: either to itself...
+ */
+ if (ti[UCH(*s8) - 160] == UCH(*s8)) {
+ *p = s8;
+ } else {
+ /*
+ * make those 1-char strings
+ * into HTAtoms, so they will be cleaned up
+ * at exit... all for the sake of preventing
+ * memory leaks, sigh.
+ */
+ static char dummy[2]; /* one char dummy string */
+
+ dummy[0] = (char) ti[UCH(*s8) - 160];
+ *p = HTAtom_name(HTAtom_for(dummy));
+ }
+ changed = 1;
+ } else if (tp[UCH(*s8) - 160] &&
+ strcmp(s7, tp[UCH(*s8) - 160])) {
+ /*
+ * ...or which is mapped, by our "new method",
+ * to a replacement string for this new charset.
+ */
+ *p = tp[UCH(*s8) - 160];
+ changed = 1;
+ }
+ }
+ }
+ FREE(tp);
+ FREE(ti);
+ if (!changed) {
+ FREE(prepl);
+ return NULL;
+ }
+ return (STRING2PTR) prepl;
+}
+
+/*
+ * "New method" meets "Old method" ...
+ */
+static int UC_Register_with_LYCharSets(int s,
+ const char *UC_MIMEcharset,
+ const char *UC_LYNXcharset,
+ int lowest_eightbit)
+{
+ int i, LYhndl, found;
+ STRING2PTR repl;
+
+ LYhndl = -1;
+ if (LYNumCharsets == 0) {
+ /*
+ * Initialize here; so whoever changes
+ * LYCharSets.c doesn't have to count...
+ */
+ for (i = 0; (i < MAXCHARSETS) && LYchar_set_names[i]; i++) {
+ LYNumCharsets = i + 1;
+ }
+ }
+
+ /*
+ * Search by MIME name, (LYchar_set_names may differ...)
+ */
+ for (i = 0; i < MAXCHARSETS && LYchar_set_names[i] && LYhndl < 0; i++) {
+ if (LYCharSet_UC[i].MIMEname &&
+ !strcmp(UC_MIMEcharset, LYCharSet_UC[i].MIMEname)) {
+ LYhndl = i;
+ }
+ }
+
+ if (LYhndl < 0) { /* not found */
+ found = 0;
+ if (LYNumCharsets >= MAXCHARSETS) {
+ CTRACE((tfp,
+ "UC_Register_with_LYCharSets: Too many. Ignoring %s/%s.",
+ UC_MIMEcharset, UC_LYNXcharset));
+ return ucError;
+ }
+ /*
+ * Add to LYCharSets.c lists.
+ */
+ LYhndl = LYNumCharsets;
+ LYNumCharsets++;
+ LYlowest_eightbit[LYhndl] = 999;
+ LYCharSets[LYhndl] = SevenBitApproximations;
+ /*
+ * Hmm, try to be conservative here.
+ */
+ LYchar_set_names[LYhndl] = UC_LYNXcharset;
+ LYchar_set_names[LYhndl + 1] = NULL;
+ /*
+ * Terminating NULL may be looked for by Lynx code.
+ */
+ } else {
+ found = 1;
+ }
+ LYCharSet_UC[LYhndl].UChndl = s;
+ /*
+ * Can we just copy the pointer? Hope so...
+ */
+ LYCharSet_UC[LYhndl].MIMEname = UC_MIMEcharset;
+ LYCharSet_UC[LYhndl].enc = UCInfo[s].enc;
+ LYCharSet_UC[LYhndl].codepage = UCInfo[s].codepage;
+
+ /*
+ * @@@ We really SHOULD get more info from the table files,
+ * and set relevant flags in the LYCharSet_UC[] entry with
+ * that info... For now, let's try it without. - KW
+ */
+ if (lowest_eightbit < LYlowest_eightbit[LYhndl]) {
+ LYlowest_eightbit[LYhndl] = lowest_eightbit;
+ } else if (lowest_eightbit > LYlowest_eightbit[LYhndl]) {
+ UCInfo[s].lowest_eight = LYlowest_eightbit[LYhndl];
+ }
+
+ if (!found && LYhndl > 0) {
+ repl = UC_setup_LYCharSets_repl(s, (unsigned) UCInfo[s].lowest_eight);
+ if (repl) {
+ LYCharSets[LYhndl] = repl;
+ /*
+ * Remember to FREE at exit.
+ */
+ remember_allocated_LYCharSets[LYhndl] = repl;
+ }
+ }
+ return LYhndl;
+}
+
+/*
+ * This only sets up the structure - no initialization of the tables
+ * is done here yet.
+ */
+void UC_Charset_Setup(const char *UC_MIMEcharset,
+ const char *UC_LYNXcharset,
+ const u8 * unicount,
+ const u16 * unitable,
+ int nnuni,
+ struct unimapdesc_str replacedesc,
+ int lowest_eight,
+ int UC_rawuni,
+ int codepage)
+{
+ int s, Gn;
+ int i, status = 0, found;
+
+ /*
+ * Get (new?) slot.
+ */
+ found = -1;
+ for (i = 0; i < UCNumCharsets && found < 0; i++) {
+ if (!strcmp(UCInfo[i].MIMEname, UC_MIMEcharset)) {
+ found = i;
+ }
+ }
+ if (found >= 0) {
+ s = found;
+ } else {
+ if (UCNumCharsets >= MAXCHARSETS) {
+ CTRACE((tfp, "UC_Charset_Setup: Too many. Ignoring %s/%s.",
+ UC_MIMEcharset, UC_LYNXcharset));
+ return;
+ }
+ s = UCNumCharsets;
+ UCInfo[s].MIMEname = UC_MIMEcharset;
+ }
+ UCInfo[s].LYNXname = UC_LYNXcharset;
+ UCInfo[s].unicount = unicount;
+ UCInfo[s].unitable = unitable;
+ UCInfo[s].num_uni = nnuni;
+ UCInfo[s].replacedesc = replacedesc;
+ if (replacedesc.isdefault) {
+ default_UChndl = s;
+ }
+ Gn = UC_FindGN_byMIME(UC_MIMEcharset);
+ if (Gn >= 0)
+ UC_GNhandles[Gn] = s;
+ UCInfo[s].GN = Gn;
+ if (UC_rawuni == UCT_ENC_UTF8)
+ lowest_eight = 128; /* cheat here */
+ UCInfo[s].lowest_eight = lowest_eight;
+ UCInfo[s].enc = UC_rawuni;
+ UCInfo[s].codepage = codepage;
+ UCInfo[s].LYhndl = UC_Register_with_LYCharSets(s,
+ UC_MIMEcharset,
+ UC_LYNXcharset,
+ lowest_eight);
+ CTRACE2(TRACE_CFG, (tfp, "registered charset %d mime \"%s\" lynx \"%s\"\n",
+ s, UC_MIMEcharset, UC_LYNXcharset));
+ UCInfo[s].uc_status = status;
+ if (found < 0)
+ UCNumCharsets++;
+ return;
+}
+
+/*
+ * UC_NoUctb_Register_with_LYCharSets, UC_Charset_NoUctb_Setup -
+ * Alternative functions for adding character set info to the lists
+ * kept in LYCharSets.c.
+ *
+ * These are for character sets without any real tables of their own.
+ * We don't keep an entry in UCinfo[] for them.
+ */
+static int UC_NoUctb_Register_with_LYCharSets(const char *UC_MIMEcharset,
+ const char *UC_LYNXcharset,
+ int lowest_eightbit,
+ int UC_rawuni,
+ int codepage)
+{
+ int i, LYhndl = -1;
+
+ if (LYNumCharsets == 0) {
+ /*
+ * Initialize here; so whoever changes
+ * LYCharSets.c doesn't have to count...
+ */
+ for (i = 0; (i < MAXCHARSETS) && LYchar_set_names[i]; i++) {
+ LYNumCharsets = i + 1;
+ }
+ }
+
+ /*
+ * Search by MIME name, (LYchar_set_names may differ...)
+ * ignore if already present!
+ */
+ for (i = 0; i < MAXCHARSETS && LYchar_set_names[i] && LYhndl < 0; i++) {
+ if (LYCharSet_UC[i].MIMEname &&
+ !strcmp(UC_MIMEcharset, LYCharSet_UC[i].MIMEname)) {
+ return ucError;
+ }
+ }
+
+ /* not found */
+ if (LYNumCharsets >= MAXCHARSETS) {
+ CTRACE((tfp,
+ "UC_NoUctb_Register_with_LYCharSets: Too many. Ignoring %s/%s.",
+ UC_MIMEcharset, UC_LYNXcharset));
+ return ucError;
+ }
+ /*
+ * Add to LYCharSets.c lists.
+ */
+ LYhndl = LYNumCharsets;
+ LYNumCharsets++;
+ LYlowest_eightbit[LYhndl] = lowest_eightbit;
+ LYCharSets[LYhndl] = SevenBitApproximations;
+ LYchar_set_names[LYhndl] = UC_LYNXcharset;
+ LYchar_set_names[LYhndl + 1] = NULL;
+ /*
+ * Terminating NULL may be looked for by Lynx code.
+ */
+
+ LYCharSet_UC[LYhndl].UChndl = -1; /* no corresponding UChndl ! */
+ LYCharSet_UC[LYhndl].MIMEname = UC_MIMEcharset;
+ LYCharSet_UC[LYhndl].enc = UC_rawuni;
+ LYCharSet_UC[LYhndl].codepage = codepage;
+
+ /*
+ * @@@ We really SHOULD get more info from the table files,
+ * and set relevant flags in the LYCharSet_UC[] entry with
+ * that info... For now, let's try it without. - KW
+ */
+
+ return LYhndl;
+}
+
+/*
+ * A wrapper for the previous function.
+ */
+static void UC_Charset_NoUctb_Setup(const char *UC_MIMEcharset,
+ const char *UC_LYNXcharset,
+ int trydefault,
+ int lowest_eight,
+ int UC_rawuni,
+ int codepage)
+{
+ int i;
+
+ /*
+ * Ignore completely if already in slot.
+ */
+ for (i = 0; i < UCNumCharsets; i++) {
+ if (!strcmp(UCInfo[i].MIMEname, UC_MIMEcharset)) {
+ return;
+ }
+ }
+ if (UC_rawuni == UCT_ENC_UTF8)
+ lowest_eight = 128; /* cheat here */
+ /* 'codepage' doubles as a flag for 'do not try any table
+ * lookup, not even default' when negative. The value will
+ * be returned immediately by UCTrans* functions.
+ */
+ if (!trydefault && codepage == 0)
+ codepage = ucCannotOutput; /* if not already set; any negative should do. */
+ UC_NoUctb_Register_with_LYCharSets(UC_MIMEcharset,
+ UC_LYNXcharset,
+ lowest_eight,
+ UC_rawuni,
+ codepage);
+ return;
+}
+
+#ifdef LY_FIND_LEAKS
+static void UCcleanup_mem(void)
+{
+ int i;
+
+ UCfree_allocated_LYCharSets();
+ con_clear_unimap_str(0);
+ con_clear_unimap_str(1);
+ con_clear_unimap(0);
+ con_clear_unimap(1);
+ for (i = 1; i < 4; i++) { /* first one is static! */
+ FREE(inverse_translations[i]);
+ }
+}
+#endif /* LY_FIND_LEAKS */
+
+#ifdef EXP_CHARTRANS_AUTOSWITCH
+#ifdef CAN_AUTODETECT_DISPLAY_CHARSET
+# ifdef __EMX__
+static int CpOrdinal(const unsigned UCode_t cp, const int other)
+{
+ char lyName[80];
+ char myMimeName[80];
+ char *mimeName, *mName = NULL, *lName = NULL;
+ int s, i, exists = 0, ret;
+
+ CTRACE((tfp, "CpOrdinal(cp=%lu, other=%d).\n", cp, other));
+ sprintf(myMimeName, "auto%s-cp%lu", (other ? "2" : ""), cp);
+ mimeName = myMimeName + 5 + (other != 0);
+ sprintf(lyName, "AutoDetect%s (cp%lu)",
+ (other ? "-2" : ""), cp);
+ /* Find slot. */
+ s = -1;
+ for (i = 0; i < UCNumCharsets; i++) {
+ if (!strcmp(UCInfo[i].LYNXname, lyName))
+ return UCGetLYhndl_byMIME(myMimeName);
+ else if (!strcasecomp(UCInfo[i].MIMEname, mimeName))
+ s = i;
+ }
+ if (s < 0)
+ return ucError;
+ /* Store the "real" charset info */
+ real_charsets[other != 0] = UCGetLYhndl_byMIME(mimeName);
+ /* Duplicate the record. */
+ StrAllocCopy(mName, myMimeName);
+ StrAllocCopy(lName, lyName);
+ UC_Charset_Setup(mName, lName,
+ UCInfo[s].unicount, UCInfo[s].unitable,
+ UCInfo[s].num_uni, UCInfo[s].replacedesc,
+ UCInfo[s].lowest_eight, UCInfo[s].enc,
+ UCInfo[s].codepage);
+ ret = UCGetLYhndl_byMIME(myMimeName);
+ CTRACE((tfp, "Found %i.\n", ret));
+ return ret;
+}
+# endif /* __EMX__ */
+#endif /* CAN_AUTODETECT_DISPLAY_CHARSET */
+#endif /* EXP_CHARTRANS_AUTOSWITCH */
+
+void UCInit(void)
+{
+
+ UCreset_allocated_LYCharSets();
+#ifdef LY_FIND_LEAKS
+ atexit(UCcleanup_mem);
+#endif
+ UCconsole_map_init();
+
+ /*
+ * The order of charset names visible in Lynx Options menu correspond to
+ * the order of lines below, except the first two described in LYCharSet.c
+ *
+ * Entries whose comment is marked with *** are declared in UCdomap.h,
+ * others are based on the included tables - UCdomap.c, near the top.
+ */
+
+ UC_CHARSET_SETUP_iso_8859_1; /* ISO Latin 1 */
+ UC_CHARSET_SETUP_iso_8859_15; /* ISO 8859-15 (Latin 9) */
+ UC_CHARSET_SETUP_cp850; /* DosLatin1 (cp850) */
+ UC_CHARSET_SETUP_windows_1252; /* WinLatin1 (cp1252) */
+ UC_CHARSET_SETUP_cp437; /* DosLatinUS (cp437) */
+
+ UC_CHARSET_SETUP_dec_mcs; /* DEC Multinational */
+ UC_CHARSET_SETUP_macintosh; /* Macintosh (8 bit) */
+ UC_CHARSET_SETUP_next; /* NeXT character set */
+ UC_CHARSET_SETUP_hp_roman8; /* HP Roman8 */
+
+ UC_CHARSET_SETUP_euc_cn; /*** Chinese */
+ UC_CHARSET_SETUP_euc_jp; /*** Japanese (EUC_JP) */
+ UC_CHARSET_SETUP_shift_jis; /*** Japanese (Shift_JIS) */
+ UC_CHARSET_SETUP_euc_kr; /*** Korean */
+ UC_CHARSET_SETUP_big5; /*** Taipei (Big5) */
+
+ UC_CHARSET_SETUP_viscii; /* Vietnamese (VISCII) */
+ UC_CHARSET_SETUP; /* us-ascii */ /* 7 bit approximations */
+
+ UC_CHARSET_SETUP_x_transparent; /*** Transparent */
+
+ UC_CHARSET_SETUP_iso_8859_2; /* ISO Latin 2 */
+ UC_CHARSET_SETUP_cp852; /* DosLatin2 (cp852) */
+ UC_CHARSET_SETUP_windows_1250; /* WinLatin2 (cp1250) */
+
+ UC_CHARSET_SETUP_iso_8859_3; /* ISO Latin 3 */
+ UC_CHARSET_SETUP_iso_8859_4; /* ISO Latin 4 */
+ UC_CHARSET_SETUP_iso_8859_13; /* ISO 8859-13 Baltic Rim */
+ UC_CHARSET_SETUP_cp775; /* DosBaltRim (cp775) */
+ UC_CHARSET_SETUP_windows_1257; /* WinBaltRim (cp1257) */
+ UC_CHARSET_SETUP_iso_8859_5; /* ISO 8859-5 Cyrillic */
+ UC_CHARSET_SETUP_cp866; /* DosCyrillic (cp866) */
+ UC_CHARSET_SETUP_windows_1251; /* WinCyrillic (cp1251) */
+ UC_CHARSET_SETUP_koi8_r; /* KOI8-R Cyrillic */
+ UC_CHARSET_SETUP_iso_8859_6; /* ISO 8869-6 Arabic */
+ UC_CHARSET_SETUP_cp864; /* DosArabic (cp864) */
+ UC_CHARSET_SETUP_windows_1256; /* WinArabic (cp1256) */
+ UC_CHARSET_SETUP_iso_8859_14; /* ISO 8859-14 Celtic */
+ UC_CHARSET_SETUP_iso_8859_7; /* ISO 8859-7 Greek */
+ UC_CHARSET_SETUP_cp737; /* DosGreek (cp737) */
+ UC_CHARSET_SETUP_cp869; /* DosGreek2 (cp869) */
+ UC_CHARSET_SETUP_windows_1253; /* WinGreek (cp1253) */
+ UC_CHARSET_SETUP_iso_8859_8; /* ISO 8859-8 Hebrew */
+ UC_CHARSET_SETUP_cp862; /* DosHebrew (cp862) */
+ UC_CHARSET_SETUP_windows_1255; /* WinHebrew (cp1255) */
+ UC_CHARSET_SETUP_iso_8859_9; /* ISO 8859-9 (Latin 5) */
+ UC_CHARSET_SETUP_cp857; /* DosTurkish (cp857) */
+ UC_CHARSET_SETUP_iso_8859_10; /* ISO 8859-10 North European */
+ UC_CHARSET_SETUP_iso_8859_16; /* ISO 8859-16 (Latin 10) */
+
+ UC_CHARSET_SETUP_utf_8; /*** UNICODE UTF-8 */
+ UC_CHARSET_SETUP_mnemonic_ascii_0; /* RFC 1345 w/o Intro */
+ UC_CHARSET_SETUP_mnemonic; /* RFC 1345 Mnemonic */
+ UC_CHARSET_SETUP_cp866u; /* Ukrainian Cyrillic (866) */
+ UC_CHARSET_SETUP_koi8_u; /* Ukrainian Cyrillic (koi8-u) */
+ UC_CHARSET_SETUP_ptcp154; /* Cyrillic-Asian (PT154) */
+
+#ifdef EXP_CHARTRANS_AUTOSWITCH
+#ifdef CAN_AUTODETECT_DISPLAY_CHARSET
+# ifdef __EMX__
+ {
+ unsigned UCode_t lst[3];
+ unsigned UCode_t len, rc;
+
+ rc = DosQueryCp(sizeof(lst), lst, &len);
+ if (rc == 0) {
+ if (len >= 1)
+ auto_display_charset = CpOrdinal(lst[0], 0);
+# ifdef CAN_SWITCH_DISPLAY_CHARSET
+ if (len >= 3) {
+ codepages[0] = lst[0];
+ codepages[1] = (lst[0] == lst[1] ? lst[2] : lst[1]);
+ auto_other_display_charset = CpOrdinal(codepages[1], 1);
+ }
+# endif
+ } else {
+ CTRACE((tfp, "DosQueryCp() returned %#lx=%lu.\n", rc, rc));
+ }
+ }
+# endif
+#endif
+#endif
+
+/*
+ * To add synonyms for any charset name check function UCGetLYhndl_byMIME in
+ * this file.
+ */
+
+/* for coding/performance - easy to type: */
+ LATIN1 = UCGetLYhndl_byMIME("iso-8859-1");
+ US_ASCII = UCGetLYhndl_byMIME("us-ascii");
+ UTF8_handle = UCGetLYhndl_byMIME("utf-8");
+ TRANSPARENT = UCGetLYhndl_byMIME("x-transparent");
+}
+
+/*
+ * Safe variant of UCGetLYhndl_byMIME, with blind recovery from typo in user
+ * input: lynx.cfg, userdefs.h, command line switches.
+ */
+int safeUCGetLYhndl_byMIME(const char *value)
+{
+ int i = UCGetLYhndl_byMIME(value);
+
+ if (i == -1) { /* was user's typo or not yet recognized value */
+ i = LATIN1; /* error recovery? */
+ CTRACE((tfp, "safeUCGetLYhndl_byMIME: ISO-8859-1 assumed.\n"));
+ }
+
+ return (i);
+}
+
+#ifdef USE_LOCALE_CHARSET
+
+#if defined(USE_LOCALE_CHARSET) && !defined(HAVE_LANGINFO_CODESET)
+/*
+ * This is a quick-and-dirty emulator of the nl_langinfo(CODESET)
+ * function defined in the Single Unix Specification for those systems
+ * (FreeBSD, etc.) that don't have one yet. It behaves as if it had
+ * been called after setlocale(LC_CTYPE, ""), that is it looks at
+ * the locale environment variables.
+ *
+ * http://www.opengroup.org/onlinepubs/7908799/xsh/langinfo.h.html
+ *
+ * Please extend it as needed and suggest improvements to the author.
+ * This emulator will hopefully become redundant soon as
+ * nl_langinfo(CODESET) becomes more widely implemented.
+ *
+ * Since the proposed Li18nux encoding name registry is still not mature,
+ * the output follows the MIME registry where possible:
+ *
+ * http://www.iana.org/assignments/character-sets
+ *
+ * A possible autoconf test for the availability of nl_langinfo(CODESET)
+ * can be found in
+ *
+ * http://www.cl.cam.ac.uk/~mgk25/unicode.html#activate
+ *
+ * Markus.Kuhn@cl.cam.ac.uk -- 2002-03-11
+ * Permission to use, copy, modify, and distribute this software
+ * for any purpose and without fee is hereby granted. The author
+ * disclaims all warranties with regard to this software.
+ *
+ * Latest version:
+ *
+ * http://www.cl.cam.ac.uk/~mgk25/ucs/langinfo.c
+ */
+
+/*
+#include "langinfo.h"
+*/
+typedef int nl_item;
+
+#define CODESET 1
+
+#define C_CODESET "US-ASCII" /* Return this as the encoding of the
+ * C/POSIX locale. Could as well one day
+ * become "UTF-8". */
+
+#define digit(x) ((x) >= '0' && (x) <= '9')
+
+static char buf[16];
+
+static char *nl_langinfo(nl_item item)
+{
+ char *l, *p;
+
+ if (item != CODESET)
+ return NULL;
+
+ if (((l = LYGetEnv("LC_ALL")) != 0) ||
+ ((l = LYGetEnv("LC_CTYPE")) != 0) ||
+ ((l = LYGetEnv("LANG")) != 0)) {
+ /* check standardized locales */
+ if (!strcmp(l, "C") || !strcmp(l, "POSIX"))
+ return C_CODESET;
+ /* check for encoding name fragment */
+ if (strstr(l, "UTF") || strstr(l, "utf"))
+ return "UTF-8";
+ if ((p = strstr(l, "8859-"))) {
+ memcpy(buf, "ISO-8859-\0\0", 12);
+ p += 5;
+ if (digit(*p)) {
+ buf[9] = *p++;
+ if (digit(*p))
+ buf[10] = *p++;
+ return buf;
+ }
+ }
+ if (strstr(l, "KOI8-R"))
+ return "KOI8-R";
+ if (strstr(l, "KOI8-U"))
+ return "KOI8-U";
+ if (strstr(l, "620"))
+ return "TIS-620";
+ if (strstr(l, "2312"))
+ return "GB2312";
+ if (strstr(l, "HKSCS"))
+ return "Big5HKSCS"; /* no MIME charset */
+ if (strstr(l, "Big5") || strstr(l, "BIG5"))
+ return "Big5";
+ if (strstr(l, "GBK"))
+ return "GBK"; /* no MIME charset */
+ if (strstr(l, "18030"))
+ return "GB18030"; /* no MIME charset */
+ if (strstr(l, "Shift_JIS") || strstr(l, "SJIS"))
+ return "Shift_JIS";
+ /* check for conclusive modifier */
+ if (strstr(l, "euro"))
+ return "ISO-8859-15";
+ /* check for language (and perhaps country) codes */
+ if (strstr(l, "zh_TW"))
+ return "Big5";
+ if (strstr(l, "zh_HK"))
+ return "Big5HKSCS"; /* no MIME charset */
+ if (strstr(l, "zh"))
+ return "GB2312";
+ if (strstr(l, "ja"))
+ return "EUC-JP";
+ if (strstr(l, "ko"))
+ return "EUC-KR";
+ if (strstr(l, "ru"))
+ return "KOI8-R";
+ if (strstr(l, "uk"))
+ return "KOI8-U";
+ if (strstr(l, "pl") || strstr(l, "hr") ||
+ strstr(l, "hu") || strstr(l, "cs") ||
+ strstr(l, "sk") || strstr(l, "sl"))
+ return "ISO-8859-2";
+ if (strstr(l, "eo") || strstr(l, "mt"))
+ return "ISO-8859-3";
+ if (strstr(l, "el"))
+ return "ISO-8859-7";
+ if (strstr(l, "he"))
+ return "ISO-8859-8";
+ if (strstr(l, "tr"))
+ return "ISO-8859-9";
+ if (strstr(l, "th"))
+ return "TIS-620"; /* or ISO-8859-11 */
+ if (strstr(l, "lt"))
+ return "ISO-8859-13";
+ if (strstr(l, "cy"))
+ return "ISO-8859-14";
+ if (strstr(l, "ro"))
+ return "ISO-8859-2"; /* or ISO-8859-16 */
+ if (strstr(l, "am") || strstr(l, "vi"))
+ return "UTF-8";
+ /* Send me further rules if you like, but don't forget that we are
+ * *only* interested in locale naming conventions on platforms
+ * that do not already provide an nl_langinfo(CODESET) implementation. */
+ return "ISO-8859-1"; /* should perhaps be "UTF-8" instead */
+ }
+ return C_CODESET;
+}
+#endif /* defined(USE_LOCALE_CHARSET) && !defined(HAVE_LANGINFO_CODESET) */
+
+/*
+ * If LYLocaleCharset is true, use the current locale to lookup a MIME name
+ * that corresponds, and use that as the display charset. This feature is
+ * experimental because while nl_langinfo(CODESET) itself is standardized,
+ * the return values and their relationship to the locale value is not.
+ * GNU libiconv happens to give useful values, but other implementations are
+ * not guaranteed to do this.
+ *
+ * Not all Linux versions provide useful information. GNU libc 2.2 returns
+ * "ANSI_X3.4-1968"
+ * whether locale is POSIX or en_US.UTF-8.
+ *
+ * Another possible thing to investigate is the locale_charset() function
+ * provided in libiconv 1.5.1.
+ */
+void LYFindLocaleCharset(void)
+{
+ char *name;
+
+ CTRACE((tfp, "LYFindLocaleCharset(%d)\n", LYLocaleCharset));
+ name = nl_langinfo(CODESET);
+
+ if (name != 0) {
+ int value = UCGetLYhndl_byMIME(name);
+
+ if (value >= 0) {
+ linedrawing_char_set = value;
+ CTRACE((tfp, "Found name \"%s\" -> %d\n", name, value));
+ /*
+ * If no locale was set, we will get the POSIX character set, which
+ * in Lynx is treated as US-ASCII. However, Lynx's longstanding
+ * behavior has been to default to ISO-8859-1. So we treat that
+ * encoding specially. Otherwise, if LOCALE_CHARSET is set, then
+ * we will use the locale encoding -- unless overridden by the
+ * ASSUME_CHARSET value and/or command-line option.
+ */
+ if (LYLocaleCharset) {
+ CTRACE((tfp, "...prior LocaleCharset '%s'\n", NonNull(UCAssume_MIMEcharset)));
+ if (value == US_ASCII) {
+ CTRACE((tfp, "...prefer existing charset to ASCII\n"));
+ } else if (assumed_charset) {
+ CTRACE((tfp, "...already assumed-charset\n"));
+ } else {
+ current_char_set = linedrawing_char_set;
+ UCLYhndl_for_unspec = current_char_set;
+ StrAllocCopy(UCAssume_MIMEcharset, name);
+ CTRACE((tfp, "...using LocaleCharset '%s'\n", NonNull(UCAssume_MIMEcharset)));
+ }
+ }
+ } else {
+ CTRACE((tfp, "Cannot find a handle for MIME name \"%s\"\n", name));
+ }
+ } else {
+ CTRACE((tfp, "Cannot find a MIME name for locale\n"));
+ }
+}
+#endif /* USE_LOCALE_CHARSET */
+
+BOOL UCScanCode(UCode_t *target, const char *source, BOOL isHex)
+{
+ BOOL status = FALSE;
+ long lcode;
+ char *endptr;
+
+ errno = 0;
+ *target = 0;
+ lcode = strtol(source, &endptr, isHex ? 16 : 10);
+ if (lcode >= 0
+ && (endptr > source)
+#if defined(ERANGE) && defined(LONG_MAX) && defined(LONG_MIN)
+ && (errno != ERANGE || (lcode != LONG_MAX && lcode != LONG_MIN))
+#else
+ && (endptr - source) < (isHex ? 8 : 10)
+#endif
+ && (endptr != 0)
+ && (*endptr == '\0')) {
+ *target = (UCode_t) lcode;
+ status = TRUE;
+ }
+ return status;
+}
diff --git a/src/UCdomap.h b/src/UCdomap.h
new file mode 100644
index 0000000..1a2f00e
--- /dev/null
+++ b/src/UCdomap.h
@@ -0,0 +1,178 @@
+#ifndef UCDOMAP_H
+#define UCDOMAP_H
+
+#ifndef HTUTILS_H
+#include <HTUtils.h>
+#endif
+
+#ifndef ALL_CHARSETS
+#define ALL_CHARSETS 1
+#endif
+
+#include <UCkd.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * [old comments: - KW ]
+ * consolemap.h
+ *
+ * Interface between console.c, selection.c and UCmap.c
+ */
+#define LAT1_MAP 0
+#define GRAF_MAP 1
+#define IBMPC_MAP 2
+#define USER_MAP 3
+/*
+ * Some conventions I try to follow (loosely):
+ * [a-z]* only internal, names from linux driver code.
+ * UC_* to be only known internally.
+ * UC[A-Z]* to be exported to other parts of Lynx. -KW
+ */ extern void UC_Charset_Setup(const char *UC_MIMEcharset,
+ const char *UC_LYNXcharset,
+ const u8 * unicount,
+ const u16 * unitable,
+ int nnuni,
+ struct unimapdesc_str replacedesc,
+ int lowest_eight,
+ int UC_rawuni,
+ int codepage);
+
+ struct UC_charset {
+ const char *MIMEname;
+ const char *LYNXname;
+ const u8 *unicount;
+ const u16 *unitable;
+ int num_uni;
+ struct unimapdesc_str replacedesc;
+ int uc_status;
+ int LYhndl;
+ int GN;
+ int lowest_eight;
+ int enc;
+ int codepage; /* codepage number, used by OS/2 font-switching code */
+ };
+
+ extern int UCNumCharsets;
+ extern int UCInitialized;
+
+ extern void UCInit(void);
+
+/*
+ * INSTRUCTIONS for adding new character sets which do not have Unicode tables.
+ *
+ * Several #defines below are declarations for charsets which need no tables
+ * for mapping to Unicode - CJK multibytes, x-transparent, UTF8 - Lynx takes
+ * care of them internally.
+ *
+ * The declaration's format is kept in chrtrans/XXX_uni.h - keep this in mind
+ * when changing ucmaketbl.c, see also UC_Charset_Setup() above for details.
+ */
+
+ /*
+ * There is no strict correlation for the next five, since the transfer
+ * charset gets decoded into Display Char Set by the CJK code (separate from
+ * Unicode mechanism). For now we use the MIME name that describes what is
+ * output to the terminal. - KW
+ */
+
+/*----------------------------------------------------------------------------*/
+
+#ifndef NO_CHARSET_euc_cn
+#define NO_CHARSET_euc_cn !ALL_CHARSETS
+#endif
+
+#if NO_CHARSET_euc_cn
+#define UC_CHARSET_SETUP_euc_cn /* nothing */
+#else
+#define UC_CHARSET_SETUP_euc_cn UC_Charset_NoUctb_Setup("euc-cn","Chinese",\
+ 1, 128,UCT_ENC_CJK,0)
+#endif
+
+/*----------------------------------------------------------------------------*/
+
+#ifndef NO_CHARSET_euc_jp
+#define NO_CHARSET_euc_jp !ALL_CHARSETS
+#endif
+
+#if NO_CHARSET_euc_jp
+#define UC_CHARSET_SETUP_euc_jp /* nothing */
+#else
+#define UC_CHARSET_SETUP_euc_jp UC_Charset_NoUctb_Setup("euc-jp","Japanese (EUC-JP)",\
+ 1, 128,UCT_ENC_CJK,0)
+#endif
+
+/*----------------------------------------------------------------------------*/
+
+#ifndef NO_CHARSET_shift_jis
+#define NO_CHARSET_shift_jis !ALL_CHARSETS
+#endif
+
+#if NO_CHARSET_shift_jis
+#define UC_CHARSET_SETUP_shift_jis /* nothing */
+#else
+#define UC_CHARSET_SETUP_shift_jis UC_Charset_NoUctb_Setup("shift_jis","Japanese (Shift_JIS)",\
+ 1, 128,UCT_ENC_CJK,0)
+#endif
+
+/*----------------------------------------------------------------------------*/
+
+#ifndef NO_CHARSET_euc_kr
+#define NO_CHARSET_euc_kr !ALL_CHARSETS
+#endif
+
+#if NO_CHARSET_euc_kr
+#define UC_CHARSET_SETUP_euc_kr /* nothing */
+#else
+#define UC_CHARSET_SETUP_euc_kr UC_Charset_NoUctb_Setup("euc-kr","Korean",\
+ 1, 128,UCT_ENC_CJK,0)
+#endif
+
+/*----------------------------------------------------------------------------*/
+
+#ifndef NO_CHARSET_big5
+#define NO_CHARSET_big5 !ALL_CHARSETS
+#endif
+
+#if NO_CHARSET_big5
+#define UC_CHARSET_SETUP_big5 /* nothing */
+#else
+#define UC_CHARSET_SETUP_big5 UC_Charset_NoUctb_Setup("big5","Taipei (Big5)",\
+ 1, 128,UCT_ENC_CJK,0)
+#endif
+
+/*----------------------------------------------------------------------------*/
+
+ /*
+ * Placeholder for non-translation mode. - FM
+ */
+
+#ifndef NO_CHARSET_x_transparent
+#define NO_CHARSET_x_transparent !ALL_CHARSETS
+#endif
+
+#if NO_CHARSET_x_transparent
+#define UC_CHARSET_SETUP_x_transparent /* nothing */
+#else
+#define UC_CHARSET_SETUP_x_transparent UC_Charset_NoUctb_Setup("x-transparent","Transparent",\
+ 0, 128,UCT_ENC_8BIT,0)
+#endif
+
+/*----------------------------------------------------------------------------*/
+
+#ifndef NO_CHARSET_utf_8
+#define NO_CHARSET_utf_8 !ALL_CHARSETS
+#endif
+
+#if NO_CHARSET_utf_8
+#define UC_CHARSET_SETUP_utf_8 /* nothing */
+#else
+#define UC_CHARSET_SETUP_utf_8 UC_Charset_NoUctb_Setup("utf-8","UNICODE (UTF-8)",\
+ 0, 128,UCT_ENC_UTF8,-4)
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* UCDOMAP_H */
diff --git a/src/Xsystem.c b/src/Xsystem.c
new file mode 100644
index 0000000..cc6cdd8
--- /dev/null
+++ b/src/Xsystem.c
@@ -0,0 +1,589 @@
+/* $LynxId: Xsystem.c,v 1.29 2018/02/17 14:58:15 tom Exp $
+ * like system("cmd") but return with exit code of "cmd"
+ * for Turbo-C/MS-C/LSI-C
+ * This code is in the public domain.
+ *
+ * @Log: xsystem.c,v @
+ *
+ * Revision 1.14 1997/10/17 (Fri) 16:28:24 senshu
+ * *** for Win32 version ***
+ *
+ * Revision 1.13 1992/02/24 06:59:13 serow
+ * *** empty log message ***
+ *
+ * Revision 1.12 1991/04/09 08:48:20 serow
+ * ignore new line at command line tail
+ *
+ * Revision 1.11 1991/03/12 07:12:50 serow
+ * CMDLINE
+ *
+ * Revision 1.10 91/02/24 05:10:14 serow
+ * 2>&1
+ *
+ * Revision 1.9 91/02/22 07:01:17 serow
+ * NEAR for ms-c
+ *
+ */
+#include <LYUtils.h>
+#include <LYStrings.h>
+#include <LYGlobalDefs.h>
+
+#ifdef DOSPATH
+#include <io.h>
+#else
+extern char *mktemp(char *);
+#endif
+
+#ifndef USECMDLINE
+#define USECMDLINE 0
+#endif
+
+#ifndef TRUE
+#define TRUE 1
+#define FALSE 0
+#endif
+
+#define TABLESIZE(v) (sizeof(v)/sizeof(v[0]))
+
+#define STR_MAX 512 /* MAX command line */
+
+#define isk1(c) ((0x81 <= UCH(c) && UCH(c) <= 0x9F) || (0xE0 <= UCH(c) && UCH(c) <= 0xFC))
+#define isq(c) ((c) == '"')
+#define isspc(c) ((c) == ' ' || (c) == '\t')
+#define issep(c) (isspc(c) || (c) == '"' || (c) == '\'' || (c) == '<' || (c) == '>' || (c) == 0)
+#define issep2(c) (issep(c) || (c) == '.' || (c) == '\\' || (c) == '/')
+#define isdeg(c) ('0' <= (c) && (c) <= '9')
+
+#ifndef NEAR
+#define NEAR
+#endif
+
+#define SAVE_FD 10
+
+typedef struct _proc {
+ struct _proc *next;
+ char *line;
+ char *cmd;
+ char *arg;
+ char *inf;
+ int infmod;
+ char *outf;
+ int outfmod;
+ int ored[SAVE_FD];
+ int sred[SAVE_FD];
+} PRO;
+
+static PRO *p1 = 0;
+
+static char *NEAR xmalloc(size_t n)
+{
+ char *bp;
+
+ if ((bp = typecallocn(char, n)) == 0) {
+ write(2, "xsystem: Out of memory.!\n", 25);
+ exit_immediately(EXIT_FAILURE);
+ }
+ return bp;
+}
+
+static char *NEAR xrealloc(void *p, size_t n)
+{
+ char *bp;
+
+ if ((bp = realloc(p, n)) == (char *) 0) {
+ write(2, "xsystem: Out of memory!.\n", 25);
+ exit_immediately(EXIT_FAILURE);
+ }
+ return bp;
+}
+
+static int NEAR is_builtin_command(char *s)
+{
+ static char *cmdtab[] =
+ {
+ "dir", "type", "rem", "ren", "rename", "erase", "del",
+ "copy", "pause", "date", "time", "ver", "vol", "label",
+ "cd", "chdir", "md", "mkdir", "rd", "rmdir", "break",
+ "verify", "set", "prompt", "path", "exit", "ctty", "echo",
+ "if", "for", "cls", "goto", "shift"
+ ,"start" /* start is NT only */
+ };
+ int i, l, lc, count;
+
+ l = (int) strlen(s);
+ count = TABLESIZE(cmdtab);
+ count--;
+#ifdef WIN_EX
+ if (system_is_NT)
+ count++;
+#endif
+ for (i = 0; i < count; i++) {
+ if (strcasecomp(s, cmdtab[i]) == 0)
+ return 1;
+ lc = (int) strlen(cmdtab[i]);
+ if (lc < l && strncasecomp(s, cmdtab[i], lc) == 0 && issep2(s[lc]))
+ return 1;
+ }
+ return 0;
+}
+
+static int NEAR getswchar(void)
+{
+ int result;
+
+#ifdef __WIN32__
+ result = '/';
+#else
+ union REGS reg;
+
+ reg.x.ax = 0x3700;
+ intdos(&reg, &reg);
+ result = reg.h.dl;
+#endif
+ return result;
+}
+
+#define spawnl_rc(flag, rc) \
+ ((flag == P_WAIT) \
+ ? (int)(rc) \
+ : ((rc) == 0 ? -2 : 0))
+
+static int NEAR csystem(PRO * p, int flag)
+{
+ char *cmp;
+ char SW[3];
+ intptr_t rc;
+
+ if ((cmp = LYGetEnv("COMSPEC")) == 0)
+ return -2;
+ SW[0] = (char) getswchar();
+ SW[1] = 'c';
+ SW[2] = 0;
+ rc = spawnl(flag, cmp, cmp, SW, p->cmd, p->arg, (char *) 0);
+ return spawnl_rc(flag, rc);
+}
+
+static PRO *NEAR pars1c(char *s)
+{
+ PRO *pp;
+ char *fnp;
+ int ms, mi;
+ int fs, fi, inpf;
+ int q;
+
+ pp = (PRO *) xmalloc(sizeof(PRO));
+ for (q = 0; q < (int) TABLESIZE(pp->ored); q++)
+ pp->ored[q] = q;
+ while (isspc(*s))
+ s++;
+ pp->line = strdup(s);
+ pp->cmd = xmalloc(ms = 8);
+ mi = 0;
+ while (!issep(*s)) {
+ if (mi >= ms - 1)
+ pp->cmd = xrealloc(pp->cmd, ms += 8);
+ pp->cmd[mi++] = *s++;
+ }
+ pp->cmd[mi] = 0;
+ q = 0;
+ pp->arg = xmalloc(ms = 32);
+ if (isspc(*s))
+ s++;
+ mi = 0;
+ while (*s) {
+ if (mi >= ms - 1) {
+ pp->arg = xrealloc(pp->arg, ms += 32);
+ }
+ if (q == 0) {
+ inpf = 0;
+ if ((mi == 0 || isspc(s[-1])) &&
+ isdeg(s[0]) && s[1] == '>' &&
+ s[2] == '&' && isdeg(s[3])) {
+
+ pp->ored[s[0] & 15] = s[3] & 15;
+ s += 4;
+ continue;
+ } else if (s[0] == '<') {
+ if (pp->inf == 0) {
+ pp->infmod = O_RDONLY;
+ }
+ inpf = 1;
+ } else if (s[0] == '>' && s[1] == '>') {
+ if (pp->outf == 0) {
+ pp->outfmod = O_WRONLY | O_CREAT | O_APPEND;
+ }
+ s++;
+ } else if (s[0] == '>') {
+ if (pp->outf == 0) {
+ pp->outfmod = O_WRONLY | O_CREAT | O_TRUNC;
+ }
+ } else {
+ if (*s == '"')
+ q = !q;
+ pp->arg[mi++] = *s++;
+ continue;
+ }
+ fnp = xmalloc(fs = 16);
+ fi = 0;
+ s++;
+ while (isspc(*s))
+ s++;
+ while (!issep(*s)) {
+ if (fi >= fs - 1)
+ fnp = xrealloc(fnp, fs += 16);
+ fnp[fi++] = *s++;
+ }
+ fnp[fi] = 0;
+ if (inpf) {
+ if (pp->inf == 0)
+ pp->inf = fnp;
+ } else {
+ if (pp->outf == 0)
+ pp->outf = fnp;
+ }
+ } else if (s[0] == '"') {
+ q = !q;
+ pp->arg[mi++] = *s++;
+ } else {
+ pp->arg[mi++] = *s++;
+ }
+ }
+ pp->arg[mi] = 0;
+ return pp;
+}
+
+static PRO *NEAR pars(char *s)
+{
+ char *lb;
+ int li, ls, q;
+ int c;
+ PRO *pp = 0;
+
+ lb = xmalloc(ls = STR_MAX); /* about */
+ li = q = 0;
+ p1 = 0;
+
+ for (;;) {
+ c = *s++;
+ if (li >= ls - 2)
+ lb = xrealloc(lb, ls += STR_MAX);
+ if (isk1(c) && *s) {
+ lb[li++] = (char) c;
+ lb[li++] = *s++;
+ } else if ((!q && c == '|') || c == 0 || (c == '\n' && *s == 0)) {
+ lb[li++] = 0;
+ if (p1 == 0) {
+ pp = p1 = pars1c(lb);
+ } else {
+ pp->next = pars1c(lb);
+ pp = pp->next;
+ }
+ li = 0;
+ if (c == 0 || (c == '\n' && *s == 0))
+ break;
+ } else if (c == '"') {
+ q = !q;
+ lb[li++] = (char) c;
+ } else {
+ lb[li++] = (char) c;
+ }
+ }
+ free(lb);
+ return p1;
+}
+
+static int NEAR try3(char *cnm, PRO * p, int flag)
+{
+ char cmdb[STR_MAX];
+ int rc;
+ intptr_t rc2;
+
+ sprintf(cmdb, "%.*s.com", (int) sizeof(cmdb) - 5, cnm);
+ if ((rc = open(cmdb, O_RDONLY)) >= 0) {
+ close(rc);
+ rc2 = spawnl(flag, cmdb, cmdb, p->arg, (char *) 0);
+ return spawnl_rc(flag, rc2);
+ }
+ sprintf(cmdb, "%.*s.exe", (int) sizeof(cmdb) - 5, cnm);
+ if ((rc = open(cmdb, O_RDONLY)) >= 0) {
+ close(rc);
+ rc2 = spawnl(flag, cmdb, cmdb, p->arg, (char *) 0);
+ return spawnl_rc(flag, rc2);
+ }
+ sprintf(cmdb, "%.*s.bat", (int) sizeof(cmdb) - 5, cnm);
+ if ((rc = open(cmdb, O_RDONLY)) >= 0) {
+ close(rc);
+ return csystem(p, flag);
+ }
+ return -1;
+}
+
+static int NEAR prog_go(PRO * p, int flag)
+{
+ char *s;
+ char *extp = 0;
+ char cmdb[STR_MAX];
+ char *ep;
+ int rc, lc = 0, cmd_len;
+ intptr_t rc2;
+
+ cmd_len = (int) strlen(p->cmd);
+
+ s = p->cmd + cmd_len - 1;
+ while (cmd_len && (*s != '\\') && (*s != '/') && (*s != ':')) {
+ if (*s == '.')
+ extp = s;
+ cmd_len--;
+ s--;
+ }
+
+ if (is_builtin_command(p->cmd) || (extp && strcasecomp(extp, ".bat") == 0))
+ return csystem(p, flag);
+
+ if (s < p->cmd) { /* cmd has no PATH nor Drive */
+ ep = LYGetEnv("PATH");
+ LYStrNCpy(cmdb, p->cmd, sizeof(cmdb) - 1);
+ for (;;) {
+ if (extp) { /* has extension */
+ if ((rc = open(cmdb, O_RDONLY)) >= 0) {
+ close(rc);
+ rc2 = spawnl(flag, cmdb, cmdb, p->arg, (char *) 0);
+ rc = spawnl_rc(flag, rc2);
+ }
+ } else {
+ rc = try3(cmdb, p, flag);
+ }
+ if (rc >= 0)
+ return rc;
+
+ if (ep && *ep) {
+ int i;
+
+ for (i = 0; *ep != ';' && *ep != '\0'; ep++, i++)
+ lc = cmdb[i] = *ep;
+ if (*ep == ';')
+ ep++;
+ if (i > 0 && lc != ':' && lc != '\\' && lc != '/')
+ cmdb[i++] = '\\';
+ cmdb[i] = 0;
+ LYStrNCpy(cmdb + i, p->cmd, sizeof(cmdb) - 1 - i);
+ } else {
+ if (rc == -2)
+ return rc;
+ return -1;
+ }
+ }
+ } else { /* has PATH or Drive */
+ if (extp) { /* has extension */
+ if ((rc = open(p->cmd, O_RDONLY)) >= 0) {
+ close(rc);
+ rc2 = spawnl(flag, p->cmd, p->cmd, p->arg, (char *) 0);
+ return spawnl_rc(flag, rc2);
+ }
+ return -1;
+ } else {
+ return try3(p->cmd, p, flag);
+ }
+ }
+}
+
+static char *NEAR tmpf(char *tp)
+{
+ char tplate[STR_MAX];
+ char *ev;
+ int i;
+
+ if ((ev = LYGetEnv("TMP")) != 0) {
+ LYStrNCpy(tplate, ev, sizeof(tplate) - 2 - strlen(tp));
+ i = (int) strlen(ev);
+ if (i && ev[i - 1] != '\\' && ev[i - 1] != '/')
+ strcat(tplate, "\\");
+ } else {
+ tplate[0] = 0;
+ }
+ strcat(tplate, tp);
+ return strdup(mktemp(tplate));
+}
+
+static int NEAR redopen(char *fn, int md, int sfd)
+{
+ int rc;
+ int fd;
+
+ if ((fd = open(fn, md, 0666)) != -1) {
+ if (md & O_APPEND)
+ lseek(fd, 0L, SEEK_END);
+ rc = dup(sfd);
+ if (fd != sfd) {
+ dup2(fd, sfd);
+ close(fd);
+ }
+ return rc;
+ }
+ return -1;
+}
+
+static int NEAR redclose(int fd, int sfd)
+{
+ if (fd != -1) {
+ dup2(fd, sfd);
+ close(fd);
+ }
+ return -1;
+}
+
+static void NEAR redswitch(PRO * p)
+{
+ int d;
+
+ for (d = 0; d < (int) TABLESIZE(p->ored); d++) {
+ if (d != p->ored[d]) {
+ p->sred[d] = dup(d);
+ dup2(p->ored[d], d);
+ }
+ }
+}
+
+static void NEAR redunswitch(PRO * p)
+{
+ int d;
+
+ for (d = 0; d < (int) TABLESIZE(p->ored); d++) {
+ if (d != p->ored[d]) {
+ dup2(p->sred[d], d);
+ close(p->sred[d]);
+ }
+ }
+}
+
+int xsystem(char *cmd)
+{
+ PRO *p, *pn;
+ char *pof, *pif, *pxf;
+ int psstdin, psstdout;
+ int rdstdin, rdstdout;
+ int rc = 0;
+
+#if USECMDLINE
+ static char *cmdline = 0;
+#endif
+
+#ifdef SH_EX /* 1997/11/01 (Sat) 10:04:03 add by JH7AYN */
+ pif = cmd;
+ while (*pif++) {
+ if (*pif == '\r') {
+ *pif = '\0';
+ break;
+ } else if (*pif == '\n') {
+ *pif = '\0';
+ break;
+ }
+ }
+#endif
+
+ pof = pif = pxf = 0;
+ p = pars(cmd);
+ pof = tmpf("p1XXXXXX");
+ pif = tmpf("p2XXXXXX");
+ psstdin = psstdout = rdstdin = rdstdout = -1;
+ while (p) {
+#if USECMDLINE
+ if (!LYGetEnv("NOCMDLINE")) {
+ cmdline = xmalloc(strlen(p->cmd) + strlen(p->arg) + 10);
+ sprintf(cmdline, "CMDLINE=%s %s", p->cmd, p->arg);
+ putenv(cmdline);
+ }
+#endif
+ if (p->next)
+ psstdout = redopen(pof, O_WRONLY | O_CREAT | O_TRUNC, 1);
+ if (p->inf)
+ rdstdin = redopen(p->inf, p->infmod, 0);
+ if (p->outf)
+ rdstdout = redopen(p->outf, p->outfmod, 1);
+ redswitch(p);
+ rc = prog_go(p, P_WAIT);
+ redunswitch(p);
+ rdstdin = redclose(rdstdin, 0);
+ rdstdout = redclose(rdstdout, 1);
+ psstdout = redclose(psstdout, 1);
+ psstdin = redclose(psstdin, 0);
+ if ((p = p->next) != 0) {
+ pxf = pif;
+ pif = pof;
+ pof = pxf;
+ psstdin = redopen(pif, O_RDONLY, 0);
+ }
+ }
+ unlink(pif);
+ free(pif);
+ unlink(pof);
+ free(pof);
+ for (pn = p = p1; p; p = pn) {
+ pn = p->next;
+ if (p->line)
+ free(p->line);
+ if (p->cmd)
+ free(p->cmd);
+ if (p->arg)
+ free(p->arg);
+ if (p->inf)
+ free(p->inf);
+ if (p->outf)
+ free(p->outf);
+ free(p);
+ }
+ if (rc == -2)
+ return 127;
+ return rc < 0 ? 0xFF00 : rc;
+}
+
+int exec_command(char *cmd, int wait_flag)
+{
+ int rc;
+
+ PRO *p;
+ char *pif;
+ int cmd_str;
+
+ pif = cmd;
+ while (*pif == ' ')
+ pif++;
+
+ cmd = pif;
+ cmd_str = TRUE;
+
+ while (*pif++) {
+ if (*pif == '\r') {
+ *pif = '\0';
+ break;
+ } else if (*pif == '\n') {
+ *pif = '\0';
+ break;
+ } else if (cmd_str) {
+ if (*pif == '/')
+ *pif = '\\';
+ } else if (cmd_str) {
+ if (*pif == ' ')
+ cmd_str = FALSE;
+ }
+ }
+ p = pars(cmd);
+
+ if (wait_flag)
+ rc = prog_go(p, P_WAIT);
+ else
+ rc = prog_go(p, P_NOWAIT);
+
+ return rc;
+}
+
+#ifdef TEST
+void main()
+{
+ char line_buff[STR_MAX];
+
+ while (gets(line_buff)) {
+ printf("\nreturn %04X\n", xsystem(line_buff));
+ }
+}
+#endif /* TEST */
diff --git a/src/chrtrans/README.format b/src/chrtrans/README.format
new file mode 100644
index 0000000..7437b50
--- /dev/null
+++ b/src/chrtrans/README.format
@@ -0,0 +1,138 @@
+Some notes on the format of table files used here.
+(See README.tables for what to do with them.)
+
+The format is derived from stuff in the console driver of the
+Linux kernel (as are the guts of the chartrans machinery).
+THAT DOES NOT MEAN that anything here is Linux specific - it isn't.
+
+[Note that the format may change, this is still somewhat experimental.]
+
+There are four kinds of lines:
+
+Summary example:
+
+ # This line is a comment, the next line is a directive
+ O Brand new Charset!
+ 0x41 U+0041 U+0391
+ U+00cd:I'
+
+Description:
+
+a) comment lines start with a '#' character.
+ (trailing comments are allowed on some of the other lines, if in doubt
+ check the examples..)
+
+b) directives:
+ start with a keyword which may be abbreviated to one letter (first
+ letter must be capitalized), followed by space and a value.
+ Currently recognized:
+
+ OptionName
+ The name under which this should appear on the O)ptions screen
+ in the list for Display Character Set
+ MIMEName
+ The name for this charset in MIME syntax (one word with digits
+ and some other non-letters allowed, should be IANA registered)
+ Default
+ If "Y[es]" or "1", this is the default (fallback) translation table,
+ it will be used for Unicode -> 8bit (or 7bit) translation if no
+ translation is found in the specific table.
+ FallBack
+ Whether to use the default table if no translation is found in
+ this table. Normally fallback is used, "FallBack NO" or "FallBack 0"
+ disables it (actually, other values than "FallBack Y[es]" or
+ "FallBack 1" disable it).
+
+ RawOrEnc
+ a number which flags some special property (encoding) for this
+ charset [see utf8_uni.tbl for example, see UCDefs.h for details].
+
+ Codepage number (IBM specific)
+ used by OS/2 font-switching code.
+
+c) character translation definitions:
+ they look like
+
+ 0x41 U+0041 U+0391 ...
+
+ and are used for "forward" translation (mapping this charset to Unicode)
+ AS WELL AS "back" translation (mapping Unicodes to an 8-bit
+ [incl. 7-bit ASCII] code).
+
+ For the "forward" direction, only the first Unicode is used; for
+ "back" translation, all listed Unicodes are mapped to the byte (i.e.
+ code point) on the left.
+
+ The above example line would tell the chartrans mechanism:
+ "For this charset, code position 65 [hex 0x41] contains Unicode
+ U+0041 (LATIN CAPITAL LETTER A). For translation of Unicodes to
+ this charset, use byte value 65 [hex 0x41] for U+0041 (LATIN CAPITAL
+ LETTER A) as well as for U+0391 (GREEK CAPITAL LETTER ALPHA)."
+
+ [Note that for bytes in the ASCII range 0x00-0x7F, the forward translations
+ will (probably) not be used by Lynx. It doesn't hurt to list those,
+ too, for completeness.]
+
+ Some other forms are also accepted:
+
+ * Syntax accepted:
+ * <fontpos> <unicode> <unicode> ...
+ * <fontpos> <unicode range> <unicode range> ...
+ * <fontpos> idem
+ * <range> idem
+ * <range> <unicode range>
+ *
+ * where <unicode range> ::= <unicode>-<unicode>
+ * and <unicode> ::= U+<h><h><h><h>
+ * and <h> ::= <hexadecimal digit>
+ *
+ [Note that <fontpos> _without_ targets assumed notdefined,
+ so tables from ftp.unicode.org need no patching.]
+
+
+d) string replacement definitions:
+
+ They look like
+
+ U+00cd:I'
+
+ which would mean "Replace Unicode U+00cd (LATIN CAPITAL LETTER I WITH
+ ACUTE" with the string (consisting of two character) I' (if no other
+ translation is available)." Please note that replacement definitions
+ in certain charset table will override ones from the Default table.
+
+ Note that everything after the ':' is currently taken VERBATIM, so
+ careful with trailing blanks etc. Please use <C replace> syntax below
+ when you need trailing spaces.
+
+ * Syntax accepted:
+ * <unicode> :<replace>
+ * <unicode range> :<replace>
+ * <unicode> "<C replace>"
+ * <unicode range> "<C replace>"
+ *
+ * where <unicode range> ::= <unicode>-<unicode>
+ * and <unicode> ::= U+<h><h><h><h>
+ * and <h> ::= <hexadecimal digit>
+ * and <replace> any string not containing '\n' or '\0', taken verbatim
+ * and <C replace> any string, with backslash having the usual C meaning.
+
+Motivation:
+
+- It is an extension of the format already in use for Linux (kernel,
+ kbd package), those files can be used with some minimal editing.
+
+- It is easy to convert Unicode tables for other charsets, as they
+ are commonly found on ftp sites etc., to this format - the right
+ sed command should do 99% of the work.
+
+- The format is independent of details of other parts of the Lynx code,
+ unlike the "old" LYCharsets.c mechanism. The tables don't have to
+ be changed in synch when e.g., new entities are added to the entities.h.
+
+
+Note: the Default "7bit approximation" table can be used for
+case-insensitive search for non-ascii letters if no upper/lower case
+information provided by other means, e.g., locale. It is assumed that
+upper/lower case letters have their "7bit approximation" images
+in def7_uni.tbl matched case-insensitively.
diff --git a/src/chrtrans/README.tables b/src/chrtrans/README.tables
new file mode 100644
index 0000000..14431da
--- /dev/null
+++ b/src/chrtrans/README.tables
@@ -0,0 +1,76 @@
+The translation table files in this directory were collected from
+several sources (among them ftp://ftp.unicode.org, Linux kbd package,
+ftp://dkuug.dk/) and are believed to be correct in their mappings,
+but not checked in detail. The Unicode/UCS2 values
+for some of the RFC 1345 Mnemonic codes are out of date,
+a cleanup and update would be needed for serious use.
+[See also http://czyborra.com/charsets/iso8859.html for codepages survey.]
+
+These changes were made to all of the files used from ftp.unicode.org:
+
+ a) add the MIME name of the charset.
+ b) add a name for the display charset (used on Options screen)
+ c) add the codepage number
+ d) remove lines for control characters 0x00 to 0x1f, 0x7f to 0x9f.
+ e) comment-out ASCII lines 0x20 to 0x7f
+ f) use idem to represent the commented-out lines
+ g) change C-style 0xNNNN constants to Unicode-style U+NNNN.
+
+Other changes include
+
+ h) add code-points to several lines to provide Unicode equivalents
+ i) add extra mappings at the end of the files
+ j) comment-out other one-one mappings in the 0xa0-0xff range.
+
+More translation files can be easily provided (and new character entities
+added to entities.h), this set is just to test whether the system works
+in principle (and also how it behaves with incomplete data...)
+
+See the file README.format for a brief explanation of what's in the
+table files.
+
+The examples have names *_uni or *_suni with a .tbl suffix, but it
+doesn't really matter. The auxiliary program makeuctb (MAKE UniCode
+TaBle) is used to "compile" them into C header files, which can be
+included by UCdomap.c.
+
+Ideally, this should be taken care of by the Makefiles. On VMS, use
+build-chrtrans.com to compile and link makeuctb.exe and create the
+set of .h files from the current set of .tbl files. Thereafter, use
+build-header.com to update particular .h files.
+
+To make a new chartrans table available to Lynx (and thereby make a new
+charset known to Lynx) you currently have to manually edit UCdomap.c, in
+two places:
+
+a) Near the top, you will find a bunch of lines (some may be commented out)
+
+ #include "<fn>.h"
+
+Add or comment out as you wish. But it is probably safest to leave the
+commonly used ones, referring to "def7_uni.h" and "iso01_uni.h", in place.
+
+b) At the bottom, you will find a bunch of lines (again, some may be
+ commented out by default) of the form
+
+ UC_CHARSET_SETUP_<something>;
+
+which should correspond to the #include lines from a). Again,
+add or subtract as you wish (but preferably consistent with what you
+did under a)...) [The <something> is derived from the charset's MIME name.
+if in doubt, check the last lines of the corresponding ...uni.h file.]
+
+c) To let make automatically notice when you have changed one of the
+ table files, and automatically regenerate the *uni.h file(s),
+you also have to add any new tables to both src/Makefile *and*
+src/chrtrans/Makefile. Or, for auto-config, the equivalent files
+named makefile.in before running ./configure, or makefile after running
+./configure. (That may be inconvenient, but I didn't want to depend
+on features than not all makes may have.) Note that for recompiling
+Lynx, a `make clean' should not be necessary if you have *only* made
+changes to the files in src/chrtrans. On VMS, add entries for new
+tables to build-chrtrans.com, but you can update the particular file
+with build-header.com, then use the top directory's build.com and
+answer 'n' to it's prompts about whether to update the WWWlibrary
+and chrtrans modules.
+
diff --git a/src/chrtrans/UCkd.h b/src/chrtrans/UCkd.h
new file mode 100644
index 0000000..f2de902
--- /dev/null
+++ b/src/chrtrans/UCkd.h
@@ -0,0 +1,54 @@
+#ifndef _UC_KD_H
+#define _UC_KD_H
+
+/*
+ * NOTE: THE FOLLOWING #define MAY NEED ADJUSTMENT.
+ * u16 should be an unsigned type of 16 bit length (two octets).
+ * u8 should be an unsigned type of 8 bit length (one octet).
+ */
+#ifndef u16
+#define u16 unsigned short
+#endif /* u16 */
+
+#ifndef u8
+#define u8 unsigned char
+#endif /* u8 */
+
+typedef char scrnmap_t;
+
+#define E_TABSZ 256
+
+struct unipair {
+ u16 unicode;
+ u16 fontpos;
+};
+struct unipair_str {
+ u16 unicode;
+ const char *replace_str;
+};
+struct unimapdesc {
+ u16 entry_ct;
+ struct unipair *entries;
+};
+struct unimapdesc_str {
+ u16 entry_ct;
+ struct unipair_str *entries;
+ int isdefault;
+ int trydefault;
+};
+
+#define UNI_DIRECT_BASE 0xF000 /* start of Direct Font Region */
+#define UNI_DIRECT_MASK 0x01FF /* Direct Font Region bitmask */
+
+#define UC_MAXLEN_ID_APPEND 20
+#define UC_MAXLEN_MIMECSNAME 40
+#define UC_MAXLEN_LYNXCSNAME 40
+#define UC_LEN_LYNXCSNAME 20
+
+#undef EX_OK /* may be defined in system headers */
+#define EX_OK 0 /* successful termination */
+#define EX_USAGE 64 /* command line usage error */
+#define EX_DATAERR 65 /* data format error */
+#define EX_NOINPUT 66 /* cannot open input */
+
+#endif /* _UC_KD_H */
diff --git a/src/chrtrans/build-chrtrans.com b/src/chrtrans/build-chrtrans.com
new file mode 100644
index 0000000..edbba85
--- /dev/null
+++ b/src/chrtrans/build-chrtrans.com
@@ -0,0 +1,142 @@
+$ v0 = 0
+$ v = f$verify(v0)
+$! BUILD-CHRTRANS.COM
+$!
+$! Command file to build MAKEUCTB.EXE on VMS systems
+$! and then use it to create the chrtrans header files.
+$!
+$! 28-Jun-1997 F.Macrides macrides@sci.wfeb.edu
+$! Initial version, for Lynx v2.7.1+fotemods
+$!
+$ ON CONTROL_Y THEN GOTO CLEANUP
+$ ON ERROR THEN GOTO CLEANUP
+$ CHRproc = f$environment("PROCEDURE")
+$ CHRwhere = f$parse(CHRproc,,,"DEVICE") + f$parse(CHRproc,,,"DIRECTORY")
+$!
+$ if p1 .nes. ""
+$ then
+$ CHRcc_opts = "/DEBUG/NOOPT"
+$ CHRlink_opts = "/DEBUG"
+$ else
+$ CHRcc_opts = ""
+$ CHRlink_opts = ""
+$ endif
+$!
+$ Compile_makeuctb:
+$!================
+$ v1 = f$verify(1)
+$!
+$! Compile the Lynx [.SRC.CHRTRANS]makeuctb module.
+$!
+$ v1 = f$verify(v0)
+$ IF f$getsyi("ARCH_NAME") .eqs. "Alpha" .or. -
+ f$getsyi("ARCH_NAME") .eqs. "IA64" .or. -
+ f$trnlnm("VAXCMSG") .eqs. "DECC$MSG" .or. -
+ f$trnlnm("DECC$CC_DEFAULT") .eqs. "/DECC" .or. -
+ f$trnlnm("DECC$CC_DEFAULT") .eqs. "/VAXC"
+$ THEN
+$ CHRcompiler := "DECC"
+$ v1 = f$verify(1)
+$! DECC:
+$ cc := cc/decc/prefix=all /nomember 'CHRcc_opts'-
+ /INCLUDE=([],[-],[--],[--.WWW.Library.Implementation])
+$ v1 = f$verify(v0)
+$ ELSE
+$ IF f$search("gnu_cc:[000000]gcclib.olb") .nes. ""
+$ THEN
+$ CHRcompiler := "GNUC"
+$ v1 = f$verify(1)
+$! GNUC:
+$ cc := gcc 'CHRcc_opts'/INCLUDE=([],[-],[--],[--.WWW.Library.Implementation])
+$ v1 = f$verify(v0)
+$ ELSE
+$ CHRcompiler := "VAXC"
+$ v1 = f$verify(1)
+$! VAXC:
+$ cc := cc 'CHRcc_opts'/INCLUDE=([],[-],[--],[--.WWW.Library.Implementation])
+$ v1 = f$verify(v0)
+$ ENDIF
+$ ENDIF
+$!
+$ v1 = f$verify(1)
+$ cc makeuctb
+$ v1 = f$verify(v0)
+$!
+$ Link_makeuctb:
+$!=============
+$ v1 = f$verify(1)
+$!
+$! Link the Lynx [.SRC.CHRTRANS]makeuctb module.
+$!
+$ IF f$getsyi("ARCH_NAME") .eqs. "IA64"
+$ THEN
+$ optslibs=""
+$ ELSE
+$ optslibs=", sys$disk:[-]''CHRcompiler'.opt/opt"
+$ ENDIF
+$
+$ link/exe=makeuctb.exe'CHRlink_opts' makeuctb 'optslibs
+$ v1 = f$verify(v0)
+$!
+$ Create_headers:
+$!==============
+$ v1 = f$verify(1)
+$!
+$! Create the Lynx [.SRC.CHRTRANS] header files.
+$!
+$ makeuctb := $'CHRwhere'makeuctb
+$ makeuctb cp1250_uni.tbl
+$ makeuctb cp1251_uni.tbl
+$ makeuctb cp1252_uni.tbl
+$ makeuctb cp1253_uni.tbl
+$ makeuctb cp1255_uni.tbl
+$ makeuctb cp1256_uni.tbl
+$ makeuctb cp1257_uni.tbl
+$ makeuctb cp437_uni.tbl
+$ makeuctb cp737_uni.tbl
+$ makeuctb cp775_uni.tbl
+$ makeuctb cp850_uni.tbl
+$ makeuctb cp852_uni.tbl
+$ makeuctb cp857_uni.tbl
+$ makeuctb cp862_uni.tbl
+$ makeuctb cp864_uni.tbl
+$ makeuctb cp866_uni.tbl
+$ makeuctb cp866u_uni.tbl
+$ makeuctb cp869_uni.tbl
+$ makeuctb def7_uni.tbl
+$ makeuctb dmcs_uni.tbl
+$ makeuctb hp_uni.tbl
+$ makeuctb iso01_uni.tbl
+$ makeuctb iso02_uni.tbl
+$ makeuctb iso03_uni.tbl
+$ makeuctb iso04_uni.tbl
+$ makeuctb iso05_uni.tbl
+$ makeuctb iso06_uni.tbl
+$ makeuctb iso07_uni.tbl
+$ makeuctb iso08_uni.tbl
+$ makeuctb iso09_uni.tbl
+$ makeuctb iso10_uni.tbl
+$ makeuctb iso13_uni.tbl
+$ makeuctb iso14_uni.tbl
+$ makeuctb iso15_uni.tbl
+$ makeuctb iso16_uni.tbl
+$ makeuctb koi8r_uni.tbl
+$ makeuctb koi8u_uni.tbl
+$ makeuctb mac_uni.tbl
+$ makeuctb mnem_suni.tbl
+$ makeuctb mnem2_suni.tbl
+$ makeuctb mnem_suni.tbl
+$ makeuctb next_uni.tbl
+$ makeuctb pt154_uni.tbl
+$ makeuctb rfc_suni.tbl
+$ makeuctb utf8_uni.tbl
+$ makeuctb viscii_uni.tbl
+$ v1 = f$verify(v0)
+$ exit
+$!
+$ CLEANUP:
+$ v1 = f$verify(0)
+$ write sys$output "Default directory:"
+$ show default
+$ v1 = f$verify(v)
+$ exit
diff --git a/src/chrtrans/build-header.com b/src/chrtrans/build-header.com
new file mode 100644
index 0000000..ff8a6f5
--- /dev/null
+++ b/src/chrtrans/build-header.com
@@ -0,0 +1,37 @@
+$ v0 = 0
+$ v = f$verify(v0)
+$! BUILD-HEADER.COM
+$!
+$! Command file to use MAKEUCTB.EXE on VMS systems for creating
+$! a chrtrans header (foo.h) file from a table (foo.tbl) file.
+$! Use the file root as P1, e.g.:
+$!
+$! $ @build-header iso05_uni
+$!
+$! will create iso05_uni.h from iso05_uni.tbl.
+$!
+$! 28-Jun-1997 F.Macrides macrides@sci.wfeb.edu
+$! Initial version, for Lynx v2.7.1+fotemods
+$!
+$ ON CONTROL_Y THEN GOTO CLEANUP
+$ ON ERROR THEN GOTO CLEANUP
+$ CHRproc = f$environment("PROCEDURE")
+$ CHRwhere = f$parse(CHRproc,,,"DEVICE") + f$parse(CHRproc,,,"DIRECTORY")
+$!
+$ Create_header:
+$!=============
+$ v1 = f$verify(1)
+$!
+$! Create a Lynx [.SRC.CHRTRANS] header file.
+$!
+$ makeuctb := $'CHRwhere'makeuctb
+$ makeuctb 'P1'.tbl
+$ v1 = f$verify(v0)
+$ exit
+$!
+$ CLEANUP:
+$ v1 = f$verify(v0)
+$ write sys$output "Default directory:"
+$ show default
+$ v1 = f$verify(v)
+$ exit
diff --git a/src/chrtrans/caselower.h b/src/chrtrans/caselower.h
new file mode 100644
index 0000000..5894a3f
--- /dev/null
+++ b/src/chrtrans/caselower.h
@@ -0,0 +1,738 @@
+/*
+ Lynx uses this info for 8bit case-insensitive user search.
+
+ This table is generated from Unicode Character Database, Version 2.1.5
+ available from ftp.unicode.org, and looks as natural way to get case mapping
+ equivalents for unicodes. (well, too much characters the cost of 3 Kb only).
+ Few words from the original README.txt quoted:
+
+UNICODE 2.1 CHARACTER DATABASE
+
+Copyright (c) 1991-1998 Unicode, Inc.
+All Rights reserved.
+
+CASE MAPPINGS
+
+The case mapping is an informative, default mapping. Certain languages, such
+as Turkish, German, French, or Greek may have small deviations from the
+default mappings listed in the Unicode Character Database.
+
+ */
+
+#include <UCkd.h> /* typedef u16 */
+
+typedef struct {
+ u16 upper;
+ u16 lower;
+} unipair_case;
+
+static const unipair_case unicode_to_lower_case[] =
+/* *INDENT-OFF* */
+{
+ {0x0041, 0x0061}, /* LATIN CAPITAL LETTER A */
+ {0x0042, 0x0062}, /* LATIN CAPITAL LETTER B */
+ {0x0043, 0x0063}, /* LATIN CAPITAL LETTER C */
+ {0x0044, 0x0064}, /* LATIN CAPITAL LETTER D */
+ {0x0045, 0x0065}, /* LATIN CAPITAL LETTER E */
+ {0x0046, 0x0066}, /* LATIN CAPITAL LETTER F */
+ {0x0047, 0x0067}, /* LATIN CAPITAL LETTER G */
+ {0x0048, 0x0068}, /* LATIN CAPITAL LETTER H */
+ {0x0049, 0x0069}, /* LATIN CAPITAL LETTER I */
+ {0x004A, 0x006A}, /* LATIN CAPITAL LETTER J */
+ {0x004B, 0x006B}, /* LATIN CAPITAL LETTER K */
+ {0x004C, 0x006C}, /* LATIN CAPITAL LETTER L */
+ {0x004D, 0x006D}, /* LATIN CAPITAL LETTER M */
+ {0x004E, 0x006E}, /* LATIN CAPITAL LETTER N */
+ {0x004F, 0x006F}, /* LATIN CAPITAL LETTER O */
+ {0x0050, 0x0070}, /* LATIN CAPITAL LETTER P */
+ {0x0051, 0x0071}, /* LATIN CAPITAL LETTER Q */
+ {0x0052, 0x0072}, /* LATIN CAPITAL LETTER R */
+ {0x0053, 0x0073}, /* LATIN CAPITAL LETTER S */
+ {0x0054, 0x0074}, /* LATIN CAPITAL LETTER T */
+ {0x0055, 0x0075}, /* LATIN CAPITAL LETTER U */
+ {0x0056, 0x0076}, /* LATIN CAPITAL LETTER V */
+ {0x0057, 0x0077}, /* LATIN CAPITAL LETTER W */
+ {0x0058, 0x0078}, /* LATIN CAPITAL LETTER X */
+ {0x0059, 0x0079}, /* LATIN CAPITAL LETTER Y */
+ {0x005A, 0x007A}, /* LATIN CAPITAL LETTER Z */
+ {0x00C0, 0x00E0}, /* LATIN CAPITAL LETTER A WITH GRAVE */
+ {0x00C1, 0x00E1}, /* LATIN CAPITAL LETTER A WITH ACUTE */
+ {0x00C2, 0x00E2}, /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX */
+ {0x00C3, 0x00E3}, /* LATIN CAPITAL LETTER A WITH TILDE */
+ {0x00C4, 0x00E4}, /* LATIN CAPITAL LETTER A WITH DIAERESIS */
+ {0x00C5, 0x00E5}, /* LATIN CAPITAL LETTER A WITH RING ABOVE */
+ {0x00C6, 0x00E6}, /* LATIN CAPITAL LETTER AE */
+ {0x00C7, 0x00E7}, /* LATIN CAPITAL LETTER C WITH CEDILLA */
+ {0x00C8, 0x00E8}, /* LATIN CAPITAL LETTER E WITH GRAVE */
+ {0x00C9, 0x00E9}, /* LATIN CAPITAL LETTER E WITH ACUTE */
+ {0x00CA, 0x00EA}, /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX */
+ {0x00CB, 0x00EB}, /* LATIN CAPITAL LETTER E WITH DIAERESIS */
+ {0x00CC, 0x00EC}, /* LATIN CAPITAL LETTER I WITH GRAVE */
+ {0x00CD, 0x00ED}, /* LATIN CAPITAL LETTER I WITH ACUTE */
+ {0x00CE, 0x00EE}, /* LATIN CAPITAL LETTER I WITH CIRCUMFLEX */
+ {0x00CF, 0x00EF}, /* LATIN CAPITAL LETTER I WITH DIAERESIS */
+ {0x00D0, 0x00F0}, /* LATIN CAPITAL LETTER ETH */
+ {0x00D1, 0x00F1}, /* LATIN CAPITAL LETTER N WITH TILDE */
+ {0x00D2, 0x00F2}, /* LATIN CAPITAL LETTER O WITH GRAVE */
+ {0x00D3, 0x00F3}, /* LATIN CAPITAL LETTER O WITH ACUTE */
+ {0x00D4, 0x00F4}, /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX */
+ {0x00D5, 0x00F5}, /* LATIN CAPITAL LETTER O WITH TILDE */
+ {0x00D6, 0x00F6}, /* LATIN CAPITAL LETTER O WITH DIAERESIS */
+ {0x00D8, 0x00F8}, /* LATIN CAPITAL LETTER O WITH STROKE */
+ {0x00D9, 0x00F9}, /* LATIN CAPITAL LETTER U WITH GRAVE */
+ {0x00DA, 0x00FA}, /* LATIN CAPITAL LETTER U WITH ACUTE */
+ {0x00DB, 0x00FB}, /* LATIN CAPITAL LETTER U WITH CIRCUMFLEX */
+ {0x00DC, 0x00FC}, /* LATIN CAPITAL LETTER U WITH DIAERESIS */
+ {0x00DD, 0x00FD}, /* LATIN CAPITAL LETTER Y WITH ACUTE */
+ {0x00DE, 0x00FE}, /* LATIN CAPITAL LETTER THORN */
+ {0x0100, 0x0101}, /* LATIN CAPITAL LETTER A WITH MACRON */
+ {0x0102, 0x0103}, /* LATIN CAPITAL LETTER A WITH BREVE */
+ {0x0104, 0x0105}, /* LATIN CAPITAL LETTER A WITH OGONEK */
+ {0x0106, 0x0107}, /* LATIN CAPITAL LETTER C WITH ACUTE */
+ {0x0108, 0x0109}, /* LATIN CAPITAL LETTER C WITH CIRCUMFLEX */
+ {0x010A, 0x010B}, /* LATIN CAPITAL LETTER C WITH DOT ABOVE */
+ {0x010C, 0x010D}, /* LATIN CAPITAL LETTER C WITH CARON */
+ {0x010E, 0x010F}, /* LATIN CAPITAL LETTER D WITH CARON */
+ {0x0110, 0x0111}, /* LATIN CAPITAL LETTER D WITH STROKE */
+ {0x0112, 0x0113}, /* LATIN CAPITAL LETTER E WITH MACRON */
+ {0x0114, 0x0115}, /* LATIN CAPITAL LETTER E WITH BREVE */
+ {0x0116, 0x0117}, /* LATIN CAPITAL LETTER E WITH DOT ABOVE */
+ {0x0118, 0x0119}, /* LATIN CAPITAL LETTER E WITH OGONEK */
+ {0x011A, 0x011B}, /* LATIN CAPITAL LETTER E WITH CARON */
+ {0x011C, 0x011D}, /* LATIN CAPITAL LETTER G WITH CIRCUMFLEX */
+ {0x011E, 0x011F}, /* LATIN CAPITAL LETTER G WITH BREVE */
+ {0x0120, 0x0121}, /* LATIN CAPITAL LETTER G WITH DOT ABOVE */
+ {0x0122, 0x0123}, /* LATIN CAPITAL LETTER G WITH CEDILLA */
+ {0x0124, 0x0125}, /* LATIN CAPITAL LETTER H WITH CIRCUMFLEX */
+ {0x0126, 0x0127}, /* LATIN CAPITAL LETTER H WITH STROKE */
+ {0x0128, 0x0129}, /* LATIN CAPITAL LETTER I WITH TILDE */
+ {0x012A, 0x012B}, /* LATIN CAPITAL LETTER I WITH MACRON */
+ {0x012C, 0x012D}, /* LATIN CAPITAL LETTER I WITH BREVE */
+ {0x012E, 0x012F}, /* LATIN CAPITAL LETTER I WITH OGONEK */
+ {0x0130, 0x0069}, /* LATIN CAPITAL LETTER I WITH DOT ABOVE */
+ {0x0132, 0x0133}, /* LATIN CAPITAL LIGATURE IJ */
+ {0x0134, 0x0135}, /* LATIN CAPITAL LETTER J WITH CIRCUMFLEX */
+ {0x0136, 0x0137}, /* LATIN CAPITAL LETTER K WITH CEDILLA */
+ {0x0139, 0x013A}, /* LATIN CAPITAL LETTER L WITH ACUTE */
+ {0x013B, 0x013C}, /* LATIN CAPITAL LETTER L WITH CEDILLA */
+ {0x013D, 0x013E}, /* LATIN CAPITAL LETTER L WITH CARON */
+ {0x013F, 0x0140}, /* LATIN CAPITAL LETTER L WITH MIDDLE DOT */
+ {0x0141, 0x0142}, /* LATIN CAPITAL LETTER L WITH STROKE */
+ {0x0143, 0x0144}, /* LATIN CAPITAL LETTER N WITH ACUTE */
+ {0x0145, 0x0146}, /* LATIN CAPITAL LETTER N WITH CEDILLA */
+ {0x0147, 0x0148}, /* LATIN CAPITAL LETTER N WITH CARON */
+ {0x014A, 0x014B}, /* LATIN CAPITAL LETTER ENG */
+ {0x014C, 0x014D}, /* LATIN CAPITAL LETTER O WITH MACRON */
+ {0x014E, 0x014F}, /* LATIN CAPITAL LETTER O WITH BREVE */
+ {0x0150, 0x0151}, /* LATIN CAPITAL LETTER O WITH DOUBLE ACUTE */
+ {0x0152, 0x0153}, /* LATIN CAPITAL LIGATURE OE */
+ {0x0154, 0x0155}, /* LATIN CAPITAL LETTER R WITH ACUTE */
+ {0x0156, 0x0157}, /* LATIN CAPITAL LETTER R WITH CEDILLA */
+ {0x0158, 0x0159}, /* LATIN CAPITAL LETTER R WITH CARON */
+ {0x015A, 0x015B}, /* LATIN CAPITAL LETTER S WITH ACUTE */
+ {0x015C, 0x015D}, /* LATIN CAPITAL LETTER S WITH CIRCUMFLEX */
+ {0x015E, 0x015F}, /* LATIN CAPITAL LETTER S WITH CEDILLA */
+ {0x0160, 0x0161}, /* LATIN CAPITAL LETTER S WITH CARON */
+ {0x0162, 0x0163}, /* LATIN CAPITAL LETTER T WITH CEDILLA */
+ {0x0164, 0x0165}, /* LATIN CAPITAL LETTER T WITH CARON */
+ {0x0166, 0x0167}, /* LATIN CAPITAL LETTER T WITH STROKE */
+ {0x0168, 0x0169}, /* LATIN CAPITAL LETTER U WITH TILDE */
+ {0x016A, 0x016B}, /* LATIN CAPITAL LETTER U WITH MACRON */
+ {0x016C, 0x016D}, /* LATIN CAPITAL LETTER U WITH BREVE */
+ {0x016E, 0x016F}, /* LATIN CAPITAL LETTER U WITH RING ABOVE */
+ {0x0170, 0x0171}, /* LATIN CAPITAL LETTER U WITH DOUBLE ACUTE */
+ {0x0172, 0x0173}, /* LATIN CAPITAL LETTER U WITH OGONEK */
+ {0x0174, 0x0175}, /* LATIN CAPITAL LETTER W WITH CIRCUMFLEX */
+ {0x0176, 0x0177}, /* LATIN CAPITAL LETTER Y WITH CIRCUMFLEX */
+ {0x0178, 0x00FF}, /* LATIN CAPITAL LETTER Y WITH DIAERESIS */
+ {0x0179, 0x017A}, /* LATIN CAPITAL LETTER Z WITH ACUTE */
+ {0x017B, 0x017C}, /* LATIN CAPITAL LETTER Z WITH DOT ABOVE */
+ {0x017D, 0x017E}, /* LATIN CAPITAL LETTER Z WITH CARON */
+ {0x0181, 0x0253}, /* LATIN CAPITAL LETTER B WITH HOOK */
+ {0x0182, 0x0183}, /* LATIN CAPITAL LETTER B WITH TOPBAR */
+ {0x0184, 0x0185}, /* LATIN CAPITAL LETTER TONE SIX */
+ {0x0186, 0x0254}, /* LATIN CAPITAL LETTER OPEN O */
+ {0x0187, 0x0188}, /* LATIN CAPITAL LETTER C WITH HOOK */
+ {0x0189, 0x0256}, /* LATIN CAPITAL LETTER AFRICAN D */
+ {0x018A, 0x0257}, /* LATIN CAPITAL LETTER D WITH HOOK */
+ {0x018B, 0x018C}, /* LATIN CAPITAL LETTER D WITH TOPBAR */
+ {0x018E, 0x01DD}, /* LATIN CAPITAL LETTER REVERSED E */
+ {0x018F, 0x0259}, /* LATIN CAPITAL LETTER SCHWA */
+ {0x0190, 0x025B}, /* LATIN CAPITAL LETTER OPEN E */
+ {0x0191, 0x0192}, /* LATIN CAPITAL LETTER F WITH HOOK */
+ {0x0193, 0x0260}, /* LATIN CAPITAL LETTER G WITH HOOK */
+ {0x0194, 0x0263}, /* LATIN CAPITAL LETTER GAMMA */
+ {0x0196, 0x0269}, /* LATIN CAPITAL LETTER IOTA */
+ {0x0197, 0x0268}, /* LATIN CAPITAL LETTER I WITH STROKE */
+ {0x0198, 0x0199}, /* LATIN CAPITAL LETTER K WITH HOOK */
+ {0x019C, 0x026F}, /* LATIN CAPITAL LETTER TURNED M */
+ {0x019D, 0x0272}, /* LATIN CAPITAL LETTER N WITH LEFT HOOK */
+ {0x019F, 0x0275}, /* LATIN CAPITAL LETTER O WITH MIDDLE TILDE */
+ {0x01A0, 0x01A1}, /* LATIN CAPITAL LETTER O WITH HORN */
+ {0x01A2, 0x01A3}, /* LATIN CAPITAL LETTER OI */
+ {0x01A4, 0x01A5}, /* LATIN CAPITAL LETTER P WITH HOOK */
+ {0x01A7, 0x01A8}, /* LATIN CAPITAL LETTER TONE TWO */
+ {0x01A9, 0x0283}, /* LATIN CAPITAL LETTER ESH */
+ {0x01AC, 0x01AD}, /* LATIN CAPITAL LETTER T WITH HOOK */
+ {0x01AE, 0x0288}, /* LATIN CAPITAL LETTER T WITH RETROFLEX HOOK */
+ {0x01AF, 0x01B0}, /* LATIN CAPITAL LETTER U WITH HORN */
+ {0x01B1, 0x028A}, /* LATIN CAPITAL LETTER UPSILON */
+ {0x01B2, 0x028B}, /* LATIN CAPITAL LETTER V WITH HOOK */
+ {0x01B3, 0x01B4}, /* LATIN CAPITAL LETTER Y WITH HOOK */
+ {0x01B5, 0x01B6}, /* LATIN CAPITAL LETTER Z WITH STROKE */
+ {0x01B7, 0x0292}, /* LATIN CAPITAL LETTER EZH */
+ {0x01B8, 0x01B9}, /* LATIN CAPITAL LETTER EZH REVERSED */
+ {0x01BC, 0x01BD}, /* LATIN CAPITAL LETTER TONE FIVE */
+ {0x01C4, 0x01C6}, /* LATIN CAPITAL LETTER DZ WITH CARON */
+ {0x01C5, 0x01C6}, /* LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON */
+ {0x01C7, 0x01C9}, /* LATIN CAPITAL LETTER LJ */
+ {0x01C8, 0x01C9}, /* LATIN CAPITAL LETTER L WITH SMALL LETTER J */
+ {0x01CA, 0x01CC}, /* LATIN CAPITAL LETTER NJ */
+ {0x01CB, 0x01CC}, /* LATIN CAPITAL LETTER N WITH SMALL LETTER J */
+ {0x01CD, 0x01CE}, /* LATIN CAPITAL LETTER A WITH CARON */
+ {0x01CF, 0x01D0}, /* LATIN CAPITAL LETTER I WITH CARON */
+ {0x01D1, 0x01D2}, /* LATIN CAPITAL LETTER O WITH CARON */
+ {0x01D3, 0x01D4}, /* LATIN CAPITAL LETTER U WITH CARON */
+ {0x01D5, 0x01D6}, /* LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON */
+ {0x01D7, 0x01D8}, /* LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE */
+ {0x01D9, 0x01DA}, /* LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON */
+ {0x01DB, 0x01DC}, /* LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE */
+ {0x01DE, 0x01DF}, /* LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON */
+ {0x01E0, 0x01E1}, /* LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON */
+ {0x01E2, 0x01E3}, /* LATIN CAPITAL LETTER AE WITH MACRON */
+ {0x01E4, 0x01E5}, /* LATIN CAPITAL LETTER G WITH STROKE */
+ {0x01E6, 0x01E7}, /* LATIN CAPITAL LETTER G WITH CARON */
+ {0x01E8, 0x01E9}, /* LATIN CAPITAL LETTER K WITH CARON */
+ {0x01EA, 0x01EB}, /* LATIN CAPITAL LETTER O WITH OGONEK */
+ {0x01EC, 0x01ED}, /* LATIN CAPITAL LETTER O WITH OGONEK AND MACRON */
+ {0x01EE, 0x01EF}, /* LATIN CAPITAL LETTER EZH WITH CARON */
+ {0x01F1, 0x01F3}, /* LATIN CAPITAL LETTER DZ */
+ {0x01F2, 0x01F3}, /* LATIN CAPITAL LETTER D WITH SMALL LETTER Z */
+ {0x01F4, 0x01F5}, /* LATIN CAPITAL LETTER G WITH ACUTE */
+ {0x01FA, 0x01FB}, /* LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE */
+ {0x01FC, 0x01FD}, /* LATIN CAPITAL LETTER AE WITH ACUTE */
+ {0x01FE, 0x01FF}, /* LATIN CAPITAL LETTER O WITH STROKE AND ACUTE */
+ {0x0200, 0x0201}, /* LATIN CAPITAL LETTER A WITH DOUBLE GRAVE */
+ {0x0202, 0x0203}, /* LATIN CAPITAL LETTER A WITH INVERTED BREVE */
+ {0x0204, 0x0205}, /* LATIN CAPITAL LETTER E WITH DOUBLE GRAVE */
+ {0x0206, 0x0207}, /* LATIN CAPITAL LETTER E WITH INVERTED BREVE */
+ {0x0208, 0x0209}, /* LATIN CAPITAL LETTER I WITH DOUBLE GRAVE */
+ {0x020A, 0x020B}, /* LATIN CAPITAL LETTER I WITH INVERTED BREVE */
+ {0x020C, 0x020D}, /* LATIN CAPITAL LETTER O WITH DOUBLE GRAVE */
+ {0x020E, 0x020F}, /* LATIN CAPITAL LETTER O WITH INVERTED BREVE */
+ {0x0210, 0x0211}, /* LATIN CAPITAL LETTER R WITH DOUBLE GRAVE */
+ {0x0212, 0x0213}, /* LATIN CAPITAL LETTER R WITH INVERTED BREVE */
+ {0x0214, 0x0215}, /* LATIN CAPITAL LETTER U WITH DOUBLE GRAVE */
+ {0x0216, 0x0217}, /* LATIN CAPITAL LETTER U WITH INVERTED BREVE */
+ {0x0386, 0x03AC}, /* GREEK CAPITAL LETTER ALPHA WITH TONOS */
+ {0x0388, 0x03AD}, /* GREEK CAPITAL LETTER EPSILON WITH TONOS */
+ {0x0389, 0x03AE}, /* GREEK CAPITAL LETTER ETA WITH TONOS */
+ {0x038A, 0x03AF}, /* GREEK CAPITAL LETTER IOTA WITH TONOS */
+ {0x038C, 0x03CC}, /* GREEK CAPITAL LETTER OMICRON WITH TONOS */
+ {0x038E, 0x03CD}, /* GREEK CAPITAL LETTER UPSILON WITH TONOS */
+ {0x038F, 0x03CE}, /* GREEK CAPITAL LETTER OMEGA WITH TONOS */
+ {0x0391, 0x03B1}, /* GREEK CAPITAL LETTER ALPHA */
+ {0x0392, 0x03B2}, /* GREEK CAPITAL LETTER BETA */
+ {0x0393, 0x03B3}, /* GREEK CAPITAL LETTER GAMMA */
+ {0x0394, 0x03B4}, /* GREEK CAPITAL LETTER DELTA */
+ {0x0395, 0x03B5}, /* GREEK CAPITAL LETTER EPSILON */
+ {0x0396, 0x03B6}, /* GREEK CAPITAL LETTER ZETA */
+ {0x0397, 0x03B7}, /* GREEK CAPITAL LETTER ETA */
+ {0x0398, 0x03B8}, /* GREEK CAPITAL LETTER THETA */
+ {0x0399, 0x03B9}, /* GREEK CAPITAL LETTER IOTA */
+ {0x039A, 0x03BA}, /* GREEK CAPITAL LETTER KAPPA */
+ {0x039B, 0x03BB}, /* GREEK CAPITAL LETTER LAMDA */
+ {0x039C, 0x03BC}, /* GREEK CAPITAL LETTER MU */
+ {0x039D, 0x03BD}, /* GREEK CAPITAL LETTER NU */
+ {0x039E, 0x03BE}, /* GREEK CAPITAL LETTER XI */
+ {0x039F, 0x03BF}, /* GREEK CAPITAL LETTER OMICRON */
+ {0x03A0, 0x03C0}, /* GREEK CAPITAL LETTER PI */
+ {0x03A1, 0x03C1}, /* GREEK CAPITAL LETTER RHO */
+ {0x03A3, 0x03C3}, /* GREEK CAPITAL LETTER SIGMA */
+ {0x03A4, 0x03C4}, /* GREEK CAPITAL LETTER TAU */
+ {0x03A5, 0x03C5}, /* GREEK CAPITAL LETTER UPSILON */
+ {0x03A6, 0x03C6}, /* GREEK CAPITAL LETTER PHI */
+ {0x03A7, 0x03C7}, /* GREEK CAPITAL LETTER CHI */
+ {0x03A8, 0x03C8}, /* GREEK CAPITAL LETTER PSI */
+ {0x03A9, 0x03C9}, /* GREEK CAPITAL LETTER OMEGA */
+ {0x03AA, 0x03CA}, /* GREEK CAPITAL LETTER IOTA WITH DIALYTIKA */
+ {0x03AB, 0x03CB}, /* GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA */
+ {0x03E2, 0x03E3}, /* COPTIC CAPITAL LETTER SHEI */
+ {0x03E4, 0x03E5}, /* COPTIC CAPITAL LETTER FEI */
+ {0x03E6, 0x03E7}, /* COPTIC CAPITAL LETTER KHEI */
+ {0x03E8, 0x03E9}, /* COPTIC CAPITAL LETTER HORI */
+ {0x03EA, 0x03EB}, /* COPTIC CAPITAL LETTER GANGIA */
+ {0x03EC, 0x03ED}, /* COPTIC CAPITAL LETTER SHIMA */
+ {0x03EE, 0x03EF}, /* COPTIC CAPITAL LETTER DEI */
+ {0x0401, 0x0451}, /* CYRILLIC CAPITAL LETTER IO */
+ {0x0402, 0x0452}, /* CYRILLIC CAPITAL LETTER DJE */
+ {0x0403, 0x0453}, /* CYRILLIC CAPITAL LETTER GJE */
+ {0x0404, 0x0454}, /* CYRILLIC CAPITAL LETTER UKRAINIAN IE */
+ {0x0405, 0x0455}, /* CYRILLIC CAPITAL LETTER DZE */
+ {0x0406, 0x0456}, /* CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I */
+ {0x0407, 0x0457}, /* CYRILLIC CAPITAL LETTER YI */
+ {0x0408, 0x0458}, /* CYRILLIC CAPITAL LETTER JE */
+ {0x0409, 0x0459}, /* CYRILLIC CAPITAL LETTER LJE */
+ {0x040A, 0x045A}, /* CYRILLIC CAPITAL LETTER NJE */
+ {0x040B, 0x045B}, /* CYRILLIC CAPITAL LETTER TSHE */
+ {0x040C, 0x045C}, /* CYRILLIC CAPITAL LETTER KJE */
+ {0x040E, 0x045E}, /* CYRILLIC CAPITAL LETTER SHORT U */
+ {0x040F, 0x045F}, /* CYRILLIC CAPITAL LETTER DZHE */
+ {0x0410, 0x0430}, /* CYRILLIC CAPITAL LETTER A */
+ {0x0411, 0x0431}, /* CYRILLIC CAPITAL LETTER BE */
+ {0x0412, 0x0432}, /* CYRILLIC CAPITAL LETTER VE */
+ {0x0413, 0x0433}, /* CYRILLIC CAPITAL LETTER GHE */
+ {0x0414, 0x0434}, /* CYRILLIC CAPITAL LETTER DE */
+ {0x0415, 0x0435}, /* CYRILLIC CAPITAL LETTER IE */
+ {0x0416, 0x0436}, /* CYRILLIC CAPITAL LETTER ZHE */
+ {0x0417, 0x0437}, /* CYRILLIC CAPITAL LETTER ZE */
+ {0x0418, 0x0438}, /* CYRILLIC CAPITAL LETTER I */
+ {0x0419, 0x0439}, /* CYRILLIC CAPITAL LETTER SHORT I */
+ {0x041A, 0x043A}, /* CYRILLIC CAPITAL LETTER KA */
+ {0x041B, 0x043B}, /* CYRILLIC CAPITAL LETTER EL */
+ {0x041C, 0x043C}, /* CYRILLIC CAPITAL LETTER EM */
+ {0x041D, 0x043D}, /* CYRILLIC CAPITAL LETTER EN */
+ {0x041E, 0x043E}, /* CYRILLIC CAPITAL LETTER O */
+ {0x041F, 0x043F}, /* CYRILLIC CAPITAL LETTER PE */
+ {0x0420, 0x0440}, /* CYRILLIC CAPITAL LETTER ER */
+ {0x0421, 0x0441}, /* CYRILLIC CAPITAL LETTER ES */
+ {0x0422, 0x0442}, /* CYRILLIC CAPITAL LETTER TE */
+ {0x0423, 0x0443}, /* CYRILLIC CAPITAL LETTER U */
+ {0x0424, 0x0444}, /* CYRILLIC CAPITAL LETTER EF */
+ {0x0425, 0x0445}, /* CYRILLIC CAPITAL LETTER HA */
+ {0x0426, 0x0446}, /* CYRILLIC CAPITAL LETTER TSE */
+ {0x0427, 0x0447}, /* CYRILLIC CAPITAL LETTER CHE */
+ {0x0428, 0x0448}, /* CYRILLIC CAPITAL LETTER SHA */
+ {0x0429, 0x0449}, /* CYRILLIC CAPITAL LETTER SHCHA */
+ {0x042A, 0x044A}, /* CYRILLIC CAPITAL LETTER HARD SIGN */
+ {0x042B, 0x044B}, /* CYRILLIC CAPITAL LETTER YERU */
+ {0x042C, 0x044C}, /* CYRILLIC CAPITAL LETTER SOFT SIGN */
+ {0x042D, 0x044D}, /* CYRILLIC CAPITAL LETTER E */
+ {0x042E, 0x044E}, /* CYRILLIC CAPITAL LETTER YU */
+ {0x042F, 0x044F}, /* CYRILLIC CAPITAL LETTER YA */
+ {0x0460, 0x0461}, /* CYRILLIC CAPITAL LETTER OMEGA */
+ {0x0462, 0x0463}, /* CYRILLIC CAPITAL LETTER YAT */
+ {0x0464, 0x0465}, /* CYRILLIC CAPITAL LETTER IOTIFIED E */
+ {0x0466, 0x0467}, /* CYRILLIC CAPITAL LETTER LITTLE YUS */
+ {0x0468, 0x0469}, /* CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS */
+ {0x046A, 0x046B}, /* CYRILLIC CAPITAL LETTER BIG YUS */
+ {0x046C, 0x046D}, /* CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS */
+ {0x046E, 0x046F}, /* CYRILLIC CAPITAL LETTER KSI */
+ {0x0470, 0x0471}, /* CYRILLIC CAPITAL LETTER PSI */
+ {0x0472, 0x0473}, /* CYRILLIC CAPITAL LETTER FITA */
+ {0x0474, 0x0475}, /* CYRILLIC CAPITAL LETTER IZHITSA */
+ {0x0476, 0x0477}, /* CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT */
+ {0x0478, 0x0479}, /* CYRILLIC CAPITAL LETTER UK */
+ {0x047A, 0x047B}, /* CYRILLIC CAPITAL LETTER ROUND OMEGA */
+ {0x047C, 0x047D}, /* CYRILLIC CAPITAL LETTER OMEGA WITH TITLO */
+ {0x047E, 0x047F}, /* CYRILLIC CAPITAL LETTER OT */
+ {0x0480, 0x0481}, /* CYRILLIC CAPITAL LETTER KOPPA */
+ {0x0490, 0x0491}, /* CYRILLIC CAPITAL LETTER GHE WITH UPTURN */
+ {0x0492, 0x0493}, /* CYRILLIC CAPITAL LETTER GHE WITH STROKE */
+ {0x0494, 0x0495}, /* CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK */
+ {0x0496, 0x0497}, /* CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER */
+ {0x0498, 0x0499}, /* CYRILLIC CAPITAL LETTER ZE WITH DESCENDER */
+ {0x049A, 0x049B}, /* CYRILLIC CAPITAL LETTER KA WITH DESCENDER */
+ {0x049C, 0x049D}, /* CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE */
+ {0x049E, 0x049F}, /* CYRILLIC CAPITAL LETTER KA WITH STROKE */
+ {0x04A0, 0x04A1}, /* CYRILLIC CAPITAL LETTER BASHKIR KA */
+ {0x04A2, 0x04A3}, /* CYRILLIC CAPITAL LETTER EN WITH DESCENDER */
+ {0x04A4, 0x04A5}, /* CYRILLIC CAPITAL LIGATURE EN GHE */
+ {0x04A6, 0x04A7}, /* CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK */
+ {0x04A8, 0x04A9}, /* CYRILLIC CAPITAL LETTER ABKHASIAN HA */
+ {0x04AA, 0x04AB}, /* CYRILLIC CAPITAL LETTER ES WITH DESCENDER */
+ {0x04AC, 0x04AD}, /* CYRILLIC CAPITAL LETTER TE WITH DESCENDER */
+ {0x04AE, 0x04AF}, /* CYRILLIC CAPITAL LETTER STRAIGHT U */
+ {0x04B0, 0x04B1}, /* CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE */
+ {0x04B2, 0x04B3}, /* CYRILLIC CAPITAL LETTER HA WITH DESCENDER */
+ {0x04B4, 0x04B5}, /* CYRILLIC CAPITAL LIGATURE TE TSE */
+ {0x04B6, 0x04B7}, /* CYRILLIC CAPITAL LETTER CHE WITH DESCENDER */
+ {0x04B8, 0x04B9}, /* CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE */
+ {0x04BA, 0x04BB}, /* CYRILLIC CAPITAL LETTER SHHA */
+ {0x04BC, 0x04BD}, /* CYRILLIC CAPITAL LETTER ABKHASIAN CHE */
+ {0x04BE, 0x04BF}, /* CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER */
+ {0x04C1, 0x04C2}, /* CYRILLIC CAPITAL LETTER ZHE WITH BREVE */
+ {0x04C3, 0x04C4}, /* CYRILLIC CAPITAL LETTER KA WITH HOOK */
+ {0x04C7, 0x04C8}, /* CYRILLIC CAPITAL LETTER EN WITH HOOK */
+ {0x04CB, 0x04CC}, /* CYRILLIC CAPITAL LETTER KHAKASSIAN CHE */
+ {0x04D0, 0x04D1}, /* CYRILLIC CAPITAL LETTER A WITH BREVE */
+ {0x04D2, 0x04D3}, /* CYRILLIC CAPITAL LETTER A WITH DIAERESIS */
+ {0x04D4, 0x04D5}, /* CYRILLIC CAPITAL LIGATURE A IE */
+ {0x04D6, 0x04D7}, /* CYRILLIC CAPITAL LETTER IE WITH BREVE */
+ {0x04D8, 0x04D9}, /* CYRILLIC CAPITAL LETTER SCHWA */
+ {0x04DA, 0x04DB}, /* CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS */
+ {0x04DC, 0x04DD}, /* CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS */
+ {0x04DE, 0x04DF}, /* CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS */
+ {0x04E0, 0x04E1}, /* CYRILLIC CAPITAL LETTER ABKHASIAN DZE */
+ {0x04E2, 0x04E3}, /* CYRILLIC CAPITAL LETTER I WITH MACRON */
+ {0x04E4, 0x04E5}, /* CYRILLIC CAPITAL LETTER I WITH DIAERESIS */
+ {0x04E6, 0x04E7}, /* CYRILLIC CAPITAL LETTER O WITH DIAERESIS */
+ {0x04E8, 0x04E9}, /* CYRILLIC CAPITAL LETTER BARRED O */
+ {0x04EA, 0x04EB}, /* CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS */
+ {0x04EE, 0x04EF}, /* CYRILLIC CAPITAL LETTER U WITH MACRON */
+ {0x04F0, 0x04F1}, /* CYRILLIC CAPITAL LETTER U WITH DIAERESIS */
+ {0x04F2, 0x04F3}, /* CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE */
+ {0x04F4, 0x04F5}, /* CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS */
+ {0x04F8, 0x04F9}, /* CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS */
+ {0x0531, 0x0561}, /* ARMENIAN CAPITAL LETTER AYB */
+ {0x0532, 0x0562}, /* ARMENIAN CAPITAL LETTER BEN */
+ {0x0533, 0x0563}, /* ARMENIAN CAPITAL LETTER GIM */
+ {0x0534, 0x0564}, /* ARMENIAN CAPITAL LETTER DA */
+ {0x0535, 0x0565}, /* ARMENIAN CAPITAL LETTER ECH */
+ {0x0536, 0x0566}, /* ARMENIAN CAPITAL LETTER ZA */
+ {0x0537, 0x0567}, /* ARMENIAN CAPITAL LETTER EH */
+ {0x0538, 0x0568}, /* ARMENIAN CAPITAL LETTER ET */
+ {0x0539, 0x0569}, /* ARMENIAN CAPITAL LETTER TO */
+ {0x053A, 0x056A}, /* ARMENIAN CAPITAL LETTER ZHE */
+ {0x053B, 0x056B}, /* ARMENIAN CAPITAL LETTER INI */
+ {0x053C, 0x056C}, /* ARMENIAN CAPITAL LETTER LIWN */
+ {0x053D, 0x056D}, /* ARMENIAN CAPITAL LETTER XEH */
+ {0x053E, 0x056E}, /* ARMENIAN CAPITAL LETTER CA */
+ {0x053F, 0x056F}, /* ARMENIAN CAPITAL LETTER KEN */
+ {0x0540, 0x0570}, /* ARMENIAN CAPITAL LETTER HO */
+ {0x0541, 0x0571}, /* ARMENIAN CAPITAL LETTER JA */
+ {0x0542, 0x0572}, /* ARMENIAN CAPITAL LETTER GHAD */
+ {0x0543, 0x0573}, /* ARMENIAN CAPITAL LETTER CHEH */
+ {0x0544, 0x0574}, /* ARMENIAN CAPITAL LETTER MEN */
+ {0x0545, 0x0575}, /* ARMENIAN CAPITAL LETTER YI */
+ {0x0546, 0x0576}, /* ARMENIAN CAPITAL LETTER NOW */
+ {0x0547, 0x0577}, /* ARMENIAN CAPITAL LETTER SHA */
+ {0x0548, 0x0578}, /* ARMENIAN CAPITAL LETTER VO */
+ {0x0549, 0x0579}, /* ARMENIAN CAPITAL LETTER CHA */
+ {0x054A, 0x057A}, /* ARMENIAN CAPITAL LETTER PEH */
+ {0x054B, 0x057B}, /* ARMENIAN CAPITAL LETTER JHEH */
+ {0x054C, 0x057C}, /* ARMENIAN CAPITAL LETTER RA */
+ {0x054D, 0x057D}, /* ARMENIAN CAPITAL LETTER SEH */
+ {0x054E, 0x057E}, /* ARMENIAN CAPITAL LETTER VEW */
+ {0x054F, 0x057F}, /* ARMENIAN CAPITAL LETTER TIWN */
+ {0x0550, 0x0580}, /* ARMENIAN CAPITAL LETTER REH */
+ {0x0551, 0x0581}, /* ARMENIAN CAPITAL LETTER CO */
+ {0x0552, 0x0582}, /* ARMENIAN CAPITAL LETTER YIWN */
+ {0x0553, 0x0583}, /* ARMENIAN CAPITAL LETTER PIWR */
+ {0x0554, 0x0584}, /* ARMENIAN CAPITAL LETTER KEH */
+ {0x0555, 0x0585}, /* ARMENIAN CAPITAL LETTER OH */
+ {0x0556, 0x0586}, /* ARMENIAN CAPITAL LETTER FEH */
+ {0x10A0, 0x10D0}, /* GEORGIAN CAPITAL LETTER AN */
+ {0x10A1, 0x10D1}, /* GEORGIAN CAPITAL LETTER BAN */
+ {0x10A2, 0x10D2}, /* GEORGIAN CAPITAL LETTER GAN */
+ {0x10A3, 0x10D3}, /* GEORGIAN CAPITAL LETTER DON */
+ {0x10A4, 0x10D4}, /* GEORGIAN CAPITAL LETTER EN */
+ {0x10A5, 0x10D5}, /* GEORGIAN CAPITAL LETTER VIN */
+ {0x10A6, 0x10D6}, /* GEORGIAN CAPITAL LETTER ZEN */
+ {0x10A7, 0x10D7}, /* GEORGIAN CAPITAL LETTER TAN */
+ {0x10A8, 0x10D8}, /* GEORGIAN CAPITAL LETTER IN */
+ {0x10A9, 0x10D9}, /* GEORGIAN CAPITAL LETTER KAN */
+ {0x10AA, 0x10DA}, /* GEORGIAN CAPITAL LETTER LAS */
+ {0x10AB, 0x10DB}, /* GEORGIAN CAPITAL LETTER MAN */
+ {0x10AC, 0x10DC}, /* GEORGIAN CAPITAL LETTER NAR */
+ {0x10AD, 0x10DD}, /* GEORGIAN CAPITAL LETTER ON */
+ {0x10AE, 0x10DE}, /* GEORGIAN CAPITAL LETTER PAR */
+ {0x10AF, 0x10DF}, /* GEORGIAN CAPITAL LETTER ZHAR */
+ {0x10B0, 0x10E0}, /* GEORGIAN CAPITAL LETTER RAE */
+ {0x10B1, 0x10E1}, /* GEORGIAN CAPITAL LETTER SAN */
+ {0x10B2, 0x10E2}, /* GEORGIAN CAPITAL LETTER TAR */
+ {0x10B3, 0x10E3}, /* GEORGIAN CAPITAL LETTER UN */
+ {0x10B4, 0x10E4}, /* GEORGIAN CAPITAL LETTER PHAR */
+ {0x10B5, 0x10E5}, /* GEORGIAN CAPITAL LETTER KHAR */
+ {0x10B6, 0x10E6}, /* GEORGIAN CAPITAL LETTER GHAN */
+ {0x10B7, 0x10E7}, /* GEORGIAN CAPITAL LETTER QAR */
+ {0x10B8, 0x10E8}, /* GEORGIAN CAPITAL LETTER SHIN */
+ {0x10B9, 0x10E9}, /* GEORGIAN CAPITAL LETTER CHIN */
+ {0x10BA, 0x10EA}, /* GEORGIAN CAPITAL LETTER CAN */
+ {0x10BB, 0x10EB}, /* GEORGIAN CAPITAL LETTER JIL */
+ {0x10BC, 0x10EC}, /* GEORGIAN CAPITAL LETTER CIL */
+ {0x10BD, 0x10ED}, /* GEORGIAN CAPITAL LETTER CHAR */
+ {0x10BE, 0x10EE}, /* GEORGIAN CAPITAL LETTER XAN */
+ {0x10BF, 0x10EF}, /* GEORGIAN CAPITAL LETTER JHAN */
+ {0x10C0, 0x10F0}, /* GEORGIAN CAPITAL LETTER HAE */
+ {0x10C1, 0x10F1}, /* GEORGIAN CAPITAL LETTER HE */
+ {0x10C2, 0x10F2}, /* GEORGIAN CAPITAL LETTER HIE */
+ {0x10C3, 0x10F3}, /* GEORGIAN CAPITAL LETTER WE */
+ {0x10C4, 0x10F4}, /* GEORGIAN CAPITAL LETTER HAR */
+ {0x10C5, 0x10F5}, /* GEORGIAN CAPITAL LETTER HOE */
+ {0x1E00, 0x1E01}, /* LATIN CAPITAL LETTER A WITH RING BELOW */
+ {0x1E02, 0x1E03}, /* LATIN CAPITAL LETTER B WITH DOT ABOVE */
+ {0x1E04, 0x1E05}, /* LATIN CAPITAL LETTER B WITH DOT BELOW */
+ {0x1E06, 0x1E07}, /* LATIN CAPITAL LETTER B WITH LINE BELOW */
+ {0x1E08, 0x1E09}, /* LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE */
+ {0x1E0A, 0x1E0B}, /* LATIN CAPITAL LETTER D WITH DOT ABOVE */
+ {0x1E0C, 0x1E0D}, /* LATIN CAPITAL LETTER D WITH DOT BELOW */
+ {0x1E0E, 0x1E0F}, /* LATIN CAPITAL LETTER D WITH LINE BELOW */
+ {0x1E10, 0x1E11}, /* LATIN CAPITAL LETTER D WITH CEDILLA */
+ {0x1E12, 0x1E13}, /* LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW */
+ {0x1E14, 0x1E15}, /* LATIN CAPITAL LETTER E WITH MACRON AND GRAVE */
+ {0x1E16, 0x1E17}, /* LATIN CAPITAL LETTER E WITH MACRON AND ACUTE */
+ {0x1E18, 0x1E19}, /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW */
+ {0x1E1A, 0x1E1B}, /* LATIN CAPITAL LETTER E WITH TILDE BELOW */
+ {0x1E1C, 0x1E1D}, /* LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE */
+ {0x1E1E, 0x1E1F}, /* LATIN CAPITAL LETTER F WITH DOT ABOVE */
+ {0x1E20, 0x1E21}, /* LATIN CAPITAL LETTER G WITH MACRON */
+ {0x1E22, 0x1E23}, /* LATIN CAPITAL LETTER H WITH DOT ABOVE */
+ {0x1E24, 0x1E25}, /* LATIN CAPITAL LETTER H WITH DOT BELOW */
+ {0x1E26, 0x1E27}, /* LATIN CAPITAL LETTER H WITH DIAERESIS */
+ {0x1E28, 0x1E29}, /* LATIN CAPITAL LETTER H WITH CEDILLA */
+ {0x1E2A, 0x1E2B}, /* LATIN CAPITAL LETTER H WITH BREVE BELOW */
+ {0x1E2C, 0x1E2D}, /* LATIN CAPITAL LETTER I WITH TILDE BELOW */
+ {0x1E2E, 0x1E2F}, /* LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE */
+ {0x1E30, 0x1E31}, /* LATIN CAPITAL LETTER K WITH ACUTE */
+ {0x1E32, 0x1E33}, /* LATIN CAPITAL LETTER K WITH DOT BELOW */
+ {0x1E34, 0x1E35}, /* LATIN CAPITAL LETTER K WITH LINE BELOW */
+ {0x1E36, 0x1E37}, /* LATIN CAPITAL LETTER L WITH DOT BELOW */
+ {0x1E38, 0x1E39}, /* LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON */
+ {0x1E3A, 0x1E3B}, /* LATIN CAPITAL LETTER L WITH LINE BELOW */
+ {0x1E3C, 0x1E3D}, /* LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW */
+ {0x1E3E, 0x1E3F}, /* LATIN CAPITAL LETTER M WITH ACUTE */
+ {0x1E40, 0x1E41}, /* LATIN CAPITAL LETTER M WITH DOT ABOVE */
+ {0x1E42, 0x1E43}, /* LATIN CAPITAL LETTER M WITH DOT BELOW */
+ {0x1E44, 0x1E45}, /* LATIN CAPITAL LETTER N WITH DOT ABOVE */
+ {0x1E46, 0x1E47}, /* LATIN CAPITAL LETTER N WITH DOT BELOW */
+ {0x1E48, 0x1E49}, /* LATIN CAPITAL LETTER N WITH LINE BELOW */
+ {0x1E4A, 0x1E4B}, /* LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW */
+ {0x1E4C, 0x1E4D}, /* LATIN CAPITAL LETTER O WITH TILDE AND ACUTE */
+ {0x1E4E, 0x1E4F}, /* LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS */
+ {0x1E50, 0x1E51}, /* LATIN CAPITAL LETTER O WITH MACRON AND GRAVE */
+ {0x1E52, 0x1E53}, /* LATIN CAPITAL LETTER O WITH MACRON AND ACUTE */
+ {0x1E54, 0x1E55}, /* LATIN CAPITAL LETTER P WITH ACUTE */
+ {0x1E56, 0x1E57}, /* LATIN CAPITAL LETTER P WITH DOT ABOVE */
+ {0x1E58, 0x1E59}, /* LATIN CAPITAL LETTER R WITH DOT ABOVE */
+ {0x1E5A, 0x1E5B}, /* LATIN CAPITAL LETTER R WITH DOT BELOW */
+ {0x1E5C, 0x1E5D}, /* LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON */
+ {0x1E5E, 0x1E5F}, /* LATIN CAPITAL LETTER R WITH LINE BELOW */
+ {0x1E60, 0x1E61}, /* LATIN CAPITAL LETTER S WITH DOT ABOVE */
+ {0x1E62, 0x1E63}, /* LATIN CAPITAL LETTER S WITH DOT BELOW */
+ {0x1E64, 0x1E65}, /* LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE */
+ {0x1E66, 0x1E67}, /* LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE */
+ {0x1E68, 0x1E69}, /* LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE */
+ {0x1E6A, 0x1E6B}, /* LATIN CAPITAL LETTER T WITH DOT ABOVE */
+ {0x1E6C, 0x1E6D}, /* LATIN CAPITAL LETTER T WITH DOT BELOW */
+ {0x1E6E, 0x1E6F}, /* LATIN CAPITAL LETTER T WITH LINE BELOW */
+ {0x1E70, 0x1E71}, /* LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW */
+ {0x1E72, 0x1E73}, /* LATIN CAPITAL LETTER U WITH DIAERESIS BELOW */
+ {0x1E74, 0x1E75}, /* LATIN CAPITAL LETTER U WITH TILDE BELOW */
+ {0x1E76, 0x1E77}, /* LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW */
+ {0x1E78, 0x1E79}, /* LATIN CAPITAL LETTER U WITH TILDE AND ACUTE */
+ {0x1E7A, 0x1E7B}, /* LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS */
+ {0x1E7C, 0x1E7D}, /* LATIN CAPITAL LETTER V WITH TILDE */
+ {0x1E7E, 0x1E7F}, /* LATIN CAPITAL LETTER V WITH DOT BELOW */
+ {0x1E80, 0x1E81}, /* LATIN CAPITAL LETTER W WITH GRAVE */
+ {0x1E82, 0x1E83}, /* LATIN CAPITAL LETTER W WITH ACUTE */
+ {0x1E84, 0x1E85}, /* LATIN CAPITAL LETTER W WITH DIAERESIS */
+ {0x1E86, 0x1E87}, /* LATIN CAPITAL LETTER W WITH DOT ABOVE */
+ {0x1E88, 0x1E89}, /* LATIN CAPITAL LETTER W WITH DOT BELOW */
+ {0x1E8A, 0x1E8B}, /* LATIN CAPITAL LETTER X WITH DOT ABOVE */
+ {0x1E8C, 0x1E8D}, /* LATIN CAPITAL LETTER X WITH DIAERESIS */
+ {0x1E8E, 0x1E8F}, /* LATIN CAPITAL LETTER Y WITH DOT ABOVE */
+ {0x1E90, 0x1E91}, /* LATIN CAPITAL LETTER Z WITH CIRCUMFLEX */
+ {0x1E92, 0x1E93}, /* LATIN CAPITAL LETTER Z WITH DOT BELOW */
+ {0x1E94, 0x1E95}, /* LATIN CAPITAL LETTER Z WITH LINE BELOW */
+ {0x1EA0, 0x1EA1}, /* LATIN CAPITAL LETTER A WITH DOT BELOW */
+ {0x1EA2, 0x1EA3}, /* LATIN CAPITAL LETTER A WITH HOOK ABOVE */
+ {0x1EA4, 0x1EA5}, /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE */
+ {0x1EA6, 0x1EA7}, /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE */
+ {0x1EA8, 0x1EA9}, /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE */
+ {0x1EAA, 0x1EAB}, /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE */
+ {0x1EAC, 0x1EAD}, /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW */
+ {0x1EAE, 0x1EAF}, /* LATIN CAPITAL LETTER A WITH BREVE AND ACUTE */
+ {0x1EB0, 0x1EB1}, /* LATIN CAPITAL LETTER A WITH BREVE AND GRAVE */
+ {0x1EB2, 0x1EB3}, /* LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE */
+ {0x1EB4, 0x1EB5}, /* LATIN CAPITAL LETTER A WITH BREVE AND TILDE */
+ {0x1EB6, 0x1EB7}, /* LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW */
+ {0x1EB8, 0x1EB9}, /* LATIN CAPITAL LETTER E WITH DOT BELOW */
+ {0x1EBA, 0x1EBB}, /* LATIN CAPITAL LETTER E WITH HOOK ABOVE */
+ {0x1EBC, 0x1EBD}, /* LATIN CAPITAL LETTER E WITH TILDE */
+ {0x1EBE, 0x1EBF}, /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE */
+ {0x1EC0, 0x1EC1}, /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE */
+ {0x1EC2, 0x1EC3}, /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE */
+ {0x1EC4, 0x1EC5}, /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE */
+ {0x1EC6, 0x1EC7}, /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW */
+ {0x1EC8, 0x1EC9}, /* LATIN CAPITAL LETTER I WITH HOOK ABOVE */
+ {0x1ECA, 0x1ECB}, /* LATIN CAPITAL LETTER I WITH DOT BELOW */
+ {0x1ECC, 0x1ECD}, /* LATIN CAPITAL LETTER O WITH DOT BELOW */
+ {0x1ECE, 0x1ECF}, /* LATIN CAPITAL LETTER O WITH HOOK ABOVE */
+ {0x1ED0, 0x1ED1}, /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE */
+ {0x1ED2, 0x1ED3}, /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE */
+ {0x1ED4, 0x1ED5}, /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE */
+ {0x1ED6, 0x1ED7}, /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE */
+ {0x1ED8, 0x1ED9}, /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW */
+ {0x1EDA, 0x1EDB}, /* LATIN CAPITAL LETTER O WITH HORN AND ACUTE */
+ {0x1EDC, 0x1EDD}, /* LATIN CAPITAL LETTER O WITH HORN AND GRAVE */
+ {0x1EDE, 0x1EDF}, /* LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE */
+ {0x1EE0, 0x1EE1}, /* LATIN CAPITAL LETTER O WITH HORN AND TILDE */
+ {0x1EE2, 0x1EE3}, /* LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW */
+ {0x1EE4, 0x1EE5}, /* LATIN CAPITAL LETTER U WITH DOT BELOW */
+ {0x1EE6, 0x1EE7}, /* LATIN CAPITAL LETTER U WITH HOOK ABOVE */
+ {0x1EE8, 0x1EE9}, /* LATIN CAPITAL LETTER U WITH HORN AND ACUTE */
+ {0x1EEA, 0x1EEB}, /* LATIN CAPITAL LETTER U WITH HORN AND GRAVE */
+ {0x1EEC, 0x1EED}, /* LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE */
+ {0x1EEE, 0x1EEF}, /* LATIN CAPITAL LETTER U WITH HORN AND TILDE */
+ {0x1EF0, 0x1EF1}, /* LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW */
+ {0x1EF2, 0x1EF3}, /* LATIN CAPITAL LETTER Y WITH GRAVE */
+ {0x1EF4, 0x1EF5}, /* LATIN CAPITAL LETTER Y WITH DOT BELOW */
+ {0x1EF6, 0x1EF7}, /* LATIN CAPITAL LETTER Y WITH HOOK ABOVE */
+ {0x1EF8, 0x1EF9}, /* LATIN CAPITAL LETTER Y WITH TILDE */
+ {0x1F08, 0x1F00}, /* GREEK CAPITAL LETTER ALPHA WITH PSILI */
+ {0x1F09, 0x1F01}, /* GREEK CAPITAL LETTER ALPHA WITH DASIA */
+ {0x1F0A, 0x1F02}, /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA */
+ {0x1F0B, 0x1F03}, /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA */
+ {0x1F0C, 0x1F04}, /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA */
+ {0x1F0D, 0x1F05}, /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA */
+ {0x1F0E, 0x1F06}, /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI */
+ {0x1F0F, 0x1F07}, /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI */
+ {0x1F18, 0x1F10}, /* GREEK CAPITAL LETTER EPSILON WITH PSILI */
+ {0x1F19, 0x1F11}, /* GREEK CAPITAL LETTER EPSILON WITH DASIA */
+ {0x1F1A, 0x1F12}, /* GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA */
+ {0x1F1B, 0x1F13}, /* GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA */
+ {0x1F1C, 0x1F14}, /* GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA */
+ {0x1F1D, 0x1F15}, /* GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA */
+ {0x1F28, 0x1F20}, /* GREEK CAPITAL LETTER ETA WITH PSILI */
+ {0x1F29, 0x1F21}, /* GREEK CAPITAL LETTER ETA WITH DASIA */
+ {0x1F2A, 0x1F22}, /* GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA */
+ {0x1F2B, 0x1F23}, /* GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA */
+ {0x1F2C, 0x1F24}, /* GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA */
+ {0x1F2D, 0x1F25}, /* GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA */
+ {0x1F2E, 0x1F26}, /* GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI */
+ {0x1F2F, 0x1F27}, /* GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI */
+ {0x1F38, 0x1F30}, /* GREEK CAPITAL LETTER IOTA WITH PSILI */
+ {0x1F39, 0x1F31}, /* GREEK CAPITAL LETTER IOTA WITH DASIA */
+ {0x1F3A, 0x1F32}, /* GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA */
+ {0x1F3B, 0x1F33}, /* GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA */
+ {0x1F3C, 0x1F34}, /* GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA */
+ {0x1F3D, 0x1F35}, /* GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA */
+ {0x1F3E, 0x1F36}, /* GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI */
+ {0x1F3F, 0x1F37}, /* GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI */
+ {0x1F48, 0x1F40}, /* GREEK CAPITAL LETTER OMICRON WITH PSILI */
+ {0x1F49, 0x1F41}, /* GREEK CAPITAL LETTER OMICRON WITH DASIA */
+ {0x1F4A, 0x1F42}, /* GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA */
+ {0x1F4B, 0x1F43}, /* GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA */
+ {0x1F4C, 0x1F44}, /* GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA */
+ {0x1F4D, 0x1F45}, /* GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA */
+ {0x1F59, 0x1F51}, /* GREEK CAPITAL LETTER UPSILON WITH DASIA */
+ {0x1F5B, 0x1F53}, /* GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA */
+ {0x1F5D, 0x1F55}, /* GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA */
+ {0x1F5F, 0x1F57}, /* GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI */
+ {0x1F68, 0x1F60}, /* GREEK CAPITAL LETTER OMEGA WITH PSILI */
+ {0x1F69, 0x1F61}, /* GREEK CAPITAL LETTER OMEGA WITH DASIA */
+ {0x1F6A, 0x1F62}, /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA */
+ {0x1F6B, 0x1F63}, /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA */
+ {0x1F6C, 0x1F64}, /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA */
+ {0x1F6D, 0x1F65}, /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA */
+ {0x1F6E, 0x1F66}, /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI */
+ {0x1F6F, 0x1F67}, /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI */
+ {0x1F88, 0x1F80}, /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI */
+ {0x1F89, 0x1F81}, /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI */
+ {0x1F8A, 0x1F82}, /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI */
+ {0x1F8B, 0x1F83}, /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI */
+ {0x1F8C, 0x1F84}, /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI */
+ {0x1F8D, 0x1F85}, /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI */
+ {0x1F8E, 0x1F86}, /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI */
+ {0x1F8F, 0x1F87}, /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI */
+ {0x1F98, 0x1F90}, /* GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI */
+ {0x1F99, 0x1F91}, /* GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI */
+ {0x1F9A, 0x1F92}, /* GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI */
+ {0x1F9B, 0x1F93}, /* GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI */
+ {0x1F9C, 0x1F94}, /* GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI */
+ {0x1F9D, 0x1F95}, /* GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI */
+ {0x1F9E, 0x1F96}, /* GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI */
+ {0x1F9F, 0x1F97}, /* GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI */
+ {0x1FA8, 0x1FA0}, /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI */
+ {0x1FA9, 0x1FA1}, /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI */
+ {0x1FAA, 0x1FA2}, /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI */
+ {0x1FAB, 0x1FA3}, /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI */
+ {0x1FAC, 0x1FA4}, /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI */
+ {0x1FAD, 0x1FA5}, /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI */
+ {0x1FAE, 0x1FA6}, /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI */
+ {0x1FAF, 0x1FA7}, /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI */
+ {0x1FB8, 0x1FB0}, /* GREEK CAPITAL LETTER ALPHA WITH VRACHY */
+ {0x1FB9, 0x1FB1}, /* GREEK CAPITAL LETTER ALPHA WITH MACRON */
+ {0x1FBA, 0x1F70}, /* GREEK CAPITAL LETTER ALPHA WITH VARIA */
+ {0x1FBB, 0x1F71}, /* GREEK CAPITAL LETTER ALPHA WITH OXIA */
+ {0x1FBC, 0x1FB3}, /* GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI */
+ {0x1FC8, 0x1F72}, /* GREEK CAPITAL LETTER EPSILON WITH VARIA */
+ {0x1FC9, 0x1F73}, /* GREEK CAPITAL LETTER EPSILON WITH OXIA */
+ {0x1FCA, 0x1F74}, /* GREEK CAPITAL LETTER ETA WITH VARIA */
+ {0x1FCB, 0x1F75}, /* GREEK CAPITAL LETTER ETA WITH OXIA */
+ {0x1FCC, 0x1FC3}, /* GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI */
+ {0x1FD8, 0x1FD0}, /* GREEK CAPITAL LETTER IOTA WITH VRACHY */
+ {0x1FD9, 0x1FD1}, /* GREEK CAPITAL LETTER IOTA WITH MACRON */
+ {0x1FDA, 0x1F76}, /* GREEK CAPITAL LETTER IOTA WITH VARIA */
+ {0x1FDB, 0x1F77}, /* GREEK CAPITAL LETTER IOTA WITH OXIA */
+ {0x1FE8, 0x1FE0}, /* GREEK CAPITAL LETTER UPSILON WITH VRACHY */
+ {0x1FE9, 0x1FE1}, /* GREEK CAPITAL LETTER UPSILON WITH MACRON */
+ {0x1FEA, 0x1F7A}, /* GREEK CAPITAL LETTER UPSILON WITH VARIA */
+ {0x1FEB, 0x1F7B}, /* GREEK CAPITAL LETTER UPSILON WITH OXIA */
+ {0x1FEC, 0x1FE5}, /* GREEK CAPITAL LETTER RHO WITH DASIA */
+ {0x1FF8, 0x1F78}, /* GREEK CAPITAL LETTER OMICRON WITH VARIA */
+ {0x1FF9, 0x1F79}, /* GREEK CAPITAL LETTER OMICRON WITH OXIA */
+ {0x1FFA, 0x1F7C}, /* GREEK CAPITAL LETTER OMEGA WITH VARIA */
+ {0x1FFB, 0x1F7D}, /* GREEK CAPITAL LETTER OMEGA WITH OXIA */
+ {0x1FFC, 0x1FF3}, /* GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI */
+ {0x2160, 0x2170}, /* ROMAN NUMERAL ONE */
+ {0x2161, 0x2171}, /* ROMAN NUMERAL TWO */
+ {0x2162, 0x2172}, /* ROMAN NUMERAL THREE */
+ {0x2163, 0x2173}, /* ROMAN NUMERAL FOUR */
+ {0x2164, 0x2174}, /* ROMAN NUMERAL FIVE */
+ {0x2165, 0x2175}, /* ROMAN NUMERAL SIX */
+ {0x2166, 0x2176}, /* ROMAN NUMERAL SEVEN */
+ {0x2167, 0x2177}, /* ROMAN NUMERAL EIGHT */
+ {0x2168, 0x2178}, /* ROMAN NUMERAL NINE */
+ {0x2169, 0x2179}, /* ROMAN NUMERAL TEN */
+ {0x216A, 0x217A}, /* ROMAN NUMERAL ELEVEN */
+ {0x216B, 0x217B}, /* ROMAN NUMERAL TWELVE */
+ {0x216C, 0x217C}, /* ROMAN NUMERAL FIFTY */
+ {0x216D, 0x217D}, /* ROMAN NUMERAL ONE HUNDRED */
+ {0x216E, 0x217E}, /* ROMAN NUMERAL FIVE HUNDRED */
+ {0x216F, 0x217F}, /* ROMAN NUMERAL ONE THOUSAND */
+ {0x24B6, 0x24D0}, /* CIRCLED LATIN CAPITAL LETTER A */
+ {0x24B7, 0x24D1}, /* CIRCLED LATIN CAPITAL LETTER B */
+ {0x24B8, 0x24D2}, /* CIRCLED LATIN CAPITAL LETTER C */
+ {0x24B9, 0x24D3}, /* CIRCLED LATIN CAPITAL LETTER D */
+ {0x24BA, 0x24D4}, /* CIRCLED LATIN CAPITAL LETTER E */
+ {0x24BB, 0x24D5}, /* CIRCLED LATIN CAPITAL LETTER F */
+ {0x24BC, 0x24D6}, /* CIRCLED LATIN CAPITAL LETTER G */
+ {0x24BD, 0x24D7}, /* CIRCLED LATIN CAPITAL LETTER H */
+ {0x24BE, 0x24D8}, /* CIRCLED LATIN CAPITAL LETTER I */
+ {0x24BF, 0x24D9}, /* CIRCLED LATIN CAPITAL LETTER J */
+ {0x24C0, 0x24DA}, /* CIRCLED LATIN CAPITAL LETTER K */
+ {0x24C1, 0x24DB}, /* CIRCLED LATIN CAPITAL LETTER L */
+ {0x24C2, 0x24DC}, /* CIRCLED LATIN CAPITAL LETTER M */
+ {0x24C3, 0x24DD}, /* CIRCLED LATIN CAPITAL LETTER N */
+ {0x24C4, 0x24DE}, /* CIRCLED LATIN CAPITAL LETTER O */
+ {0x24C5, 0x24DF}, /* CIRCLED LATIN CAPITAL LETTER P */
+ {0x24C6, 0x24E0}, /* CIRCLED LATIN CAPITAL LETTER Q */
+ {0x24C7, 0x24E1}, /* CIRCLED LATIN CAPITAL LETTER R */
+ {0x24C8, 0x24E2}, /* CIRCLED LATIN CAPITAL LETTER S */
+ {0x24C9, 0x24E3}, /* CIRCLED LATIN CAPITAL LETTER T */
+ {0x24CA, 0x24E4}, /* CIRCLED LATIN CAPITAL LETTER U */
+ {0x24CB, 0x24E5}, /* CIRCLED LATIN CAPITAL LETTER V */
+ {0x24CC, 0x24E6}, /* CIRCLED LATIN CAPITAL LETTER W */
+ {0x24CD, 0x24E7}, /* CIRCLED LATIN CAPITAL LETTER X */
+ {0x24CE, 0x24E8}, /* CIRCLED LATIN CAPITAL LETTER Y */
+ {0x24CF, 0x24E9}, /* CIRCLED LATIN CAPITAL LETTER Z */
+ {0xFF21, 0xFF41}, /* FULLWIDTH LATIN CAPITAL LETTER A */
+ {0xFF22, 0xFF42}, /* FULLWIDTH LATIN CAPITAL LETTER B */
+ {0xFF23, 0xFF43}, /* FULLWIDTH LATIN CAPITAL LETTER C */
+ {0xFF24, 0xFF44}, /* FULLWIDTH LATIN CAPITAL LETTER D */
+ {0xFF25, 0xFF45}, /* FULLWIDTH LATIN CAPITAL LETTER E */
+ {0xFF26, 0xFF46}, /* FULLWIDTH LATIN CAPITAL LETTER F */
+ {0xFF27, 0xFF47}, /* FULLWIDTH LATIN CAPITAL LETTER G */
+ {0xFF28, 0xFF48}, /* FULLWIDTH LATIN CAPITAL LETTER H */
+ {0xFF29, 0xFF49}, /* FULLWIDTH LATIN CAPITAL LETTER I */
+ {0xFF2A, 0xFF4A}, /* FULLWIDTH LATIN CAPITAL LETTER J */
+ {0xFF2B, 0xFF4B}, /* FULLWIDTH LATIN CAPITAL LETTER K */
+ {0xFF2C, 0xFF4C}, /* FULLWIDTH LATIN CAPITAL LETTER L */
+ {0xFF2D, 0xFF4D}, /* FULLWIDTH LATIN CAPITAL LETTER M */
+ {0xFF2E, 0xFF4E}, /* FULLWIDTH LATIN CAPITAL LETTER N */
+ {0xFF2F, 0xFF4F}, /* FULLWIDTH LATIN CAPITAL LETTER O */
+ {0xFF30, 0xFF50}, /* FULLWIDTH LATIN CAPITAL LETTER P */
+ {0xFF31, 0xFF51}, /* FULLWIDTH LATIN CAPITAL LETTER Q */
+ {0xFF32, 0xFF52}, /* FULLWIDTH LATIN CAPITAL LETTER R */
+ {0xFF33, 0xFF53}, /* FULLWIDTH LATIN CAPITAL LETTER S */
+ {0xFF34, 0xFF54}, /* FULLWIDTH LATIN CAPITAL LETTER T */
+ {0xFF35, 0xFF55}, /* FULLWIDTH LATIN CAPITAL LETTER U */
+ {0xFF36, 0xFF56}, /* FULLWIDTH LATIN CAPITAL LETTER V */
+ {0xFF37, 0xFF57}, /* FULLWIDTH LATIN CAPITAL LETTER W */
+ {0xFF38, 0xFF58}, /* FULLWIDTH LATIN CAPITAL LETTER X */
+ {0xFF39, 0xFF59}, /* FULLWIDTH LATIN CAPITAL LETTER Y */
+ {0xFF3A, 0xFF5A} /* FULLWIDTH LATIN CAPITAL LETTER Z */
+};
+/* *INDENT-ON* */
diff --git a/src/chrtrans/cp1250_uni.tbl b/src/chrtrans/cp1250_uni.tbl
new file mode 100644
index 0000000..8a19d55
--- /dev/null
+++ b/src/chrtrans/cp1250_uni.tbl
@@ -0,0 +1,172 @@
+# This file has been modified for lynx (see README.tables)
+
+#The MIME name of this charset.
+Mwindows-1250
+
+#Name as a Display Charset (used on Options screen)
+OEastern European (windows-1250)
+
+#Codepage number
+C1250
+
+#
+# Name: cp1250 to Unicode table
+# Unicode version: 2.0
+# Table version: 2.01
+# Table format: Format A
+# Date: 04/15/98
+#
+# Contact: cpxlate@microsoft.com
+#
+# General notes: none
+#
+# Format: Three tab-separated columns
+# Column #1 is the cp1250 code (in hex)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 is the Unicode name (follows a comment sign, '#')
+#
+# The entries are in cp1250 order
+#
+##################
+# Lines with more than one Unicode (U+XXXX) value contain additional
+# replacement mappings added for lynx. - kw
+
+0x20-0x7e idem
+#
+0x80 U+20AC #EURO SIGN
+0x81 #UNDEFINED
+0x82 U+201A #SINGLE LOW-9 QUOTATION MARK
+0x83 #UNDEFINED
+0x84 U+201E #DOUBLE LOW-9 QUOTATION MARK
+0x85 U+2026 #HORIZONTAL ELLIPSIS
+0x86 U+2020 #DAGGER
+0x87 U+2021 #DOUBLE DAGGER
+0x88 #UNDEFINED
+0x89 U+2030 #PER MILLE SIGN
+0x8A U+0160 U+0428 #LATIN CAPITAL LETTER S WITH CARON
+0x8B U+2039 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+0x8C U+015A #LATIN CAPITAL LETTER S WITH ACUTE
+0x8D U+0164 #LATIN CAPITAL LETTER T WITH CARON
+0x8E U+017D U+0416 #LATIN CAPITAL LETTER Z WITH CARON
+0x8F U+0179 #LATIN CAPITAL LETTER Z WITH ACUTE
+0x90 #UNDEFINED
+0x91 U+2018 #LEFT SINGLE QUOTATION MARK
+0x92 U+2019 #RIGHT SINGLE QUOTATION MARK
+0x93 U+201C #LEFT DOUBLE QUOTATION MARK
+0x94 U+201D #RIGHT DOUBLE QUOTATION MARK
+0x95 U+2022 #BULLET
+0x96 U+2013 #EN DASH
+0x97 U+2014 #EM DASH
+0x98 #UNDEFINED
+0x99 U+2122 #TRADE MARK SIGN
+0x9A U+0161 U+0448 #LATIN SMALL LETTER S WITH CARON
+0x9B U+203A #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+0x9C U+015B #LATIN SMALL LETTER S WITH ACUTE
+0x9D U+0165 #LATIN SMALL LETTER T WITH CARON
+0x9E U+017E U+0436 #LATIN SMALL LETTER Z WITH CARON
+0x9F U+017A #LATIN SMALL LETTER Z WITH ACUTE
+0xA0 U+00A0 #NO-BREAK SPACE
+0xA1 U+02C7 U+030c #CARON
+0xA2 U+02D8 U+0306 #BREVE
+0xA3 U+0141 #LATIN CAPITAL LETTER L WITH STROKE
+0xA4 U+00A4 #CURRENCY SIGN
+0xA5 U+0104 #LATIN CAPITAL LETTER A WITH OGONEK
+0xA6 U+00A6 #BROKEN BAR
+0xA7 U+00A7 #SECTION SIGN
+0xA8 U+00A8 U+0308 #DIAERESIS
+0xA9 U+00A9 #COPYRIGHT SIGN
+0xAA U+015E #LATIN CAPITAL LETTER S WITH CEDILLA
+0xAB U+00AB #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xAC U+00AC #NOT SIGN
+0xAD U+00AD #SOFT HYPHEN
+0xAE U+00AE #REGISTERED SIGN
+0xAF U+017B #LATIN CAPITAL LETTER Z WITH DOT ABOVE
+0xB0 U+00B0 U+030a #DEGREE SIGN
+0xB1 U+00B1 #PLUS-MINUS SIGN
+0xB2 U+02DB U+0328 #OGONEK
+0xB3 U+0142 #LATIN SMALL LETTER L WITH STROKE
+0xB4 U+00B4 #ACUTE ACCENT
+0xB5 U+00B5 U+03bc #MICRO SIGN
+0xB6 U+00B6 #PILCROW SIGN
+0xB7 U+00B7 #MIDDLE DOT
+0xB8 U+00B8 U+0327 #CEDILLA
+0xB9 U+0105 #LATIN SMALL LETTER A WITH OGONEK
+0xBA U+015F #LATIN SMALL LETTER S WITH CEDILLA
+0xBB U+00BB #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xBC U+013D #LATIN CAPITAL LETTER L WITH CARON
+0xBD U+02DD U+030b #DOUBLE ACUTE ACCENT
+0xBE U+013E #LATIN SMALL LETTER L WITH CARON
+0xBF U+017C #LATIN SMALL LETTER Z WITH DOT ABOVE
+0xC0 U+0154 #LATIN CAPITAL LETTER R WITH ACUTE
+0xC1 U+00C1 #LATIN CAPITAL LETTER A WITH ACUTE
+0xC2 U+00C2 #LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0xC3 U+0102 #LATIN CAPITAL LETTER A WITH BREVE
+0xC4 U+00C4 #LATIN CAPITAL LETTER A WITH DIAERESIS
+0xC5 U+0139 #LATIN CAPITAL LETTER L WITH ACUTE
+0xC6 U+0106 #LATIN CAPITAL LETTER C WITH ACUTE
+0xC7 U+00C7 #LATIN CAPITAL LETTER C WITH CEDILLA
+0xC8 U+010C U+0427 # LATIN CAPITAL LETTER C WITH CARON
+0xC9 U+00C9 #LATIN CAPITAL LETTER E WITH ACUTE
+0xCA U+0118 #LATIN CAPITAL LETTER E WITH OGONEK
+0xCB U+00CB #LATIN CAPITAL LETTER E WITH DIAERESIS
+0xCC U+011A #LATIN CAPITAL LETTER E WITH CARON
+0xCD U+00CD #LATIN CAPITAL LETTER I WITH ACUTE
+0xCE U+00CE #LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0xCF U+010E #LATIN CAPITAL LETTER D WITH CARON
+0xD0 U+0110 #LATIN CAPITAL LETTER D WITH STROKE
+0xD1 U+0143 #LATIN CAPITAL LETTER N WITH ACUTE
+0xD2 U+0147 #LATIN CAPITAL LETTER N WITH CARON
+0xD3 U+00D3 #LATIN CAPITAL LETTER O WITH ACUTE
+0xD4 U+00D4 #LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0xD5 U+0150 #LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+0xD6 U+00D6 #LATIN CAPITAL LETTER O WITH DIAERESIS
+0xD7 U+00D7 #MULTIPLICATION SIGN
+0xD8 U+0158 #LATIN CAPITAL LETTER R WITH CARON
+0xD9 U+016E #LATIN CAPITAL LETTER U WITH RING ABOVE
+0xDA U+00DA #LATIN CAPITAL LETTER U WITH ACUTE
+0xDB U+0170 #LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+0xDC U+00DC #LATIN CAPITAL LETTER U WITH DIAERESIS
+0xDD U+00DD #LATIN CAPITAL LETTER Y WITH ACUTE
+0xDE U+0162 #LATIN CAPITAL LETTER T WITH CEDILLA
+0xDF U+00DF #LATIN SMALL LETTER SHARP S
+0xE0 U+0155 #LATIN SMALL LETTER R WITH ACUTE
+0xE1 U+00E1 #LATIN SMALL LETTER A WITH ACUTE
+0xE2 U+00E2 #LATIN SMALL LETTER A WITH CIRCUMFLEX
+0xE3 U+0103 #LATIN SMALL LETTER A WITH BREVE
+0xE4 U+00E4 #LATIN SMALL LETTER A WITH DIAERESIS
+0xE5 U+013A #LATIN SMALL LETTER L WITH ACUTE
+0xE6 U+0107 #LATIN SMALL LETTER C WITH ACUTE
+0xE7 U+00E7 #LATIN SMALL LETTER C WITH CEDILLA
+0xE8 U+010D U+02a7 U+0447 # LATIN SMALL LETTER C WITH CARON
+0xE9 U+00E9 #LATIN SMALL LETTER E WITH ACUTE
+0xEA U+0119 #LATIN SMALL LETTER E WITH OGONEK
+0xEB U+00EB #LATIN SMALL LETTER E WITH DIAERESIS
+0xEC U+011B #LATIN SMALL LETTER E WITH CARON
+0xED U+00ED #LATIN SMALL LETTER I WITH ACUTE
+0xEE U+00EE #LATIN SMALL LETTER I WITH CIRCUMFLEX
+0xEF U+010F #LATIN SMALL LETTER D WITH CARON
+0xF0 U+0111 #LATIN SMALL LETTER D WITH STROKE
+0xF1 U+0144 #LATIN SMALL LETTER N WITH ACUTE
+0xF2 U+0148 #LATIN SMALL LETTER N WITH CARON
+0xF3 U+00F3 #LATIN SMALL LETTER O WITH ACUTE
+0xF4 U+00F4 #LATIN SMALL LETTER O WITH CIRCUMFLEX
+0xF5 U+0151 #LATIN SMALL LETTER O WITH DOUBLE ACUTE
+0xF6 U+00F6 #LATIN SMALL LETTER O WITH DIAERESIS
+0xF7 U+00F7 #DIVISION SIGN
+0xF8 U+0159 #LATIN SMALL LETTER R WITH CARON
+0xF9 U+016F #LATIN SMALL LETTER U WITH RING ABOVE
+0xFA U+00FA #LATIN SMALL LETTER U WITH ACUTE
+0xFB U+0171 #LATIN SMALL LETTER U WITH DOUBLE ACUTE
+0xFC U+00FC #LATIN SMALL LETTER U WITH DIAERESIS
+0xFD U+00FD #LATIN SMALL LETTER Y WITH ACUTE
+0xFE U+0163 #LATIN SMALL LETTER T WITH CEDILLA
+0xFF U+02D9 U+0307 U+0387 #DOT ABOVE
+
+U+2218 " \260 " # RING OPERATOR
+U+2219 " \225 " # BULLET OPERATOR
+U+2297 "(\327)" # CIRCLED TIMES
+U+2299 "(\267)" # CIRCLED DOT OPERATOR
+U+229A "(\260)" # CIRCLED RING OPERATOR
+U+22A0 "[\327]" # SQUARED TIMES
+U+22A1 "[\267]" # SQUARED DOT OPERATOR
+U+22C5 " \267 " # DOT OPERATOR
diff --git a/src/chrtrans/cp1251_uni.tbl b/src/chrtrans/cp1251_uni.tbl
new file mode 100644
index 0000000..0d928f9
--- /dev/null
+++ b/src/chrtrans/cp1251_uni.tbl
@@ -0,0 +1,161 @@
+# This file has been modified for lynx (see README.tables)
+
+#The MIME name of this charset.
+Mwindows-1251
+
+#Name as a Display Charset (used on Options screen)
+OCyrillic (windows-1251)
+
+#Codepage number
+C1251
+
+#
+# Name: cp1251 to Unicode table
+# Unicode version: 2.0
+# Table version: 2.01
+# Table format: Format A
+# Date: 04/15/98
+#
+# Contact: cpxlate@microsoft.com
+#
+# General notes: none
+#
+# Format: Three tab-separated columns
+# Column #1 is the cp1251 code (in hex)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 is the Unicode name (follows a comment sign, '#')
+#
+# The entries are in cp1251 order
+#
+##################
+
+0x20-0x7e idem
+#
+0x80 U+0402 #CYRILLIC CAPITAL LETTER DJE
+0x81 U+0403 #CYRILLIC CAPITAL LETTER GJE
+0x82 U+201A #SINGLE LOW-9 QUOTATION MARK
+0x83 U+0453 #CYRILLIC SMALL LETTER GJE
+0x84 U+201E #DOUBLE LOW-9 QUOTATION MARK
+0x85 U+2026 #HORIZONTAL ELLIPSIS
+0x86 U+2020 #DAGGER
+0x87 U+2021 #DOUBLE DAGGER
+0x88 U+20AC #EURO SIGN
+0x89 U+2030 #PER MILLE SIGN
+0x8A U+0409 #CYRILLIC CAPITAL LETTER LJE
+0x8B U+2039 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+0x8C U+040A #CYRILLIC CAPITAL LETTER NJE
+0x8D U+040C #CYRILLIC CAPITAL LETTER KJE
+0x8E U+040B #CYRILLIC CAPITAL LETTER TSHE
+0x8F U+040F #CYRILLIC CAPITAL LETTER DZHE
+0x90 U+0452 #CYRILLIC SMALL LETTER DJE
+0x91 U+2018 #LEFT SINGLE QUOTATION MARK
+0x92 U+2019 #RIGHT SINGLE QUOTATION MARK
+0x93 U+201C #LEFT DOUBLE QUOTATION MARK
+0x94 U+201D #RIGHT DOUBLE QUOTATION MARK
+0x95 U+2022 #BULLET
+0x96 U+2013 #EN DASH
+0x97 U+2014 #EM DASH
+0x98 #UNDEFINED
+0x99 U+2122 #TRADE MARK SIGN
+0x9A U+0459 #CYRILLIC SMALL LETTER LJE
+0x9B U+203A #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+0x9C U+045A #CYRILLIC SMALL LETTER NJE
+0x9D U+045C #CYRILLIC SMALL LETTER KJE
+0x9E U+045B #CYRILLIC SMALL LETTER TSHE
+0x9F U+045F #CYRILLIC SMALL LETTER DZHE
+0xA0 U+00A0 #NO-BREAK SPACE
+0xA1 U+040E #CYRILLIC CAPITAL LETTER SHORT U
+0xA2 U+045E #CYRILLIC SMALL LETTER SHORT U
+0xA3 U+0408 #CYRILLIC CAPITAL LETTER JE
+0xA4 U+00A4 #CURRENCY SIGN
+0xA5 U+0490 #CYRILLIC CAPITAL LETTER GHE WITH UPTURN
+0xA6 U+00A6 #BROKEN BAR
+0xA7 U+00A7 #SECTION SIGN
+0xA8 U+0401 #CYRILLIC CAPITAL LETTER IO
+0xA9 U+00A9 #COPYRIGHT SIGN
+0xAA U+0404 #CYRILLIC CAPITAL LETTER UKRAINIAN IE
+0xAB U+00AB #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xAC U+00AC #NOT SIGN
+0xAD U+00AD #SOFT HYPHEN
+0xAE U+00AE #REGISTERED SIGN
+0xAF U+0407 #CYRILLIC CAPITAL LETTER YI
+0xB0 U+00B0 #DEGREE SIGN
+0xB1 U+00B1 #PLUS-MINUS SIGN
+0xB2 U+0406 #CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+0xB3 U+0456 #CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+0xB4 U+0491 #CYRILLIC SMALL LETTER GHE WITH UPTURN
+0xB5 U+00B5 #MICRO SIGN
+0xB6 U+00B6 #PILCROW SIGN
+0xB7 U+00B7 #MIDDLE DOT
+0xB8 U+0451 #CYRILLIC SMALL LETTER IO
+0xB9 U+2116 #NUMERO SIGN
+0xBA U+0454 #CYRILLIC SMALL LETTER UKRAINIAN IE
+0xBB U+00BB #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xBC U+0458 #CYRILLIC SMALL LETTER JE
+0xBD U+0405 #CYRILLIC CAPITAL LETTER DZE
+0xBE U+0455 #CYRILLIC SMALL LETTER DZE
+0xBF U+0457 #CYRILLIC SMALL LETTER YI
+0xC0 U+0410 #CYRILLIC CAPITAL LETTER A
+0xC1 U+0411 #CYRILLIC CAPITAL LETTER BE
+0xC2 U+0412 #CYRILLIC CAPITAL LETTER VE
+0xC3 U+0413 #CYRILLIC CAPITAL LETTER GHE
+0xC4 U+0414 #CYRILLIC CAPITAL LETTER DE
+0xC5 U+0415 #CYRILLIC CAPITAL LETTER IE
+0xC6 U+0416 #CYRILLIC CAPITAL LETTER ZHE
+0xC7 U+0417 #CYRILLIC CAPITAL LETTER ZE
+0xC8 U+0418 #CYRILLIC CAPITAL LETTER I
+0xC9 U+0419 #CYRILLIC CAPITAL LETTER SHORT I
+0xCA U+041A #CYRILLIC CAPITAL LETTER KA
+0xCB U+041B #CYRILLIC CAPITAL LETTER EL
+0xCC U+041C #CYRILLIC CAPITAL LETTER EM
+0xCD U+041D #CYRILLIC CAPITAL LETTER EN
+0xCE U+041E #CYRILLIC CAPITAL LETTER O
+0xCF U+041F #CYRILLIC CAPITAL LETTER PE
+0xD0 U+0420 #CYRILLIC CAPITAL LETTER ER
+0xD1 U+0421 #CYRILLIC CAPITAL LETTER ES
+0xD2 U+0422 #CYRILLIC CAPITAL LETTER TE
+0xD3 U+0423 #CYRILLIC CAPITAL LETTER U
+0xD4 U+0424 #CYRILLIC CAPITAL LETTER EF
+0xD5 U+0425 #CYRILLIC CAPITAL LETTER HA
+0xD6 U+0426 #CYRILLIC CAPITAL LETTER TSE
+0xD7 U+0427 #CYRILLIC CAPITAL LETTER CHE
+0xD8 U+0428 #CYRILLIC CAPITAL LETTER SHA
+0xD9 U+0429 #CYRILLIC CAPITAL LETTER SHCHA
+0xDA U+042A #CYRILLIC CAPITAL LETTER HARD SIGN
+0xDB U+042B #CYRILLIC CAPITAL LETTER YERU
+0xDC U+042C #CYRILLIC CAPITAL LETTER SOFT SIGN
+0xDD U+042D #CYRILLIC CAPITAL LETTER E
+0xDE U+042E #CYRILLIC CAPITAL LETTER YU
+0xDF U+042F #CYRILLIC CAPITAL LETTER YA
+0xE0 U+0430 #CYRILLIC SMALL LETTER A
+0xE1 U+0431 #CYRILLIC SMALL LETTER BE
+0xE2 U+0432 #CYRILLIC SMALL LETTER VE
+0xE3 U+0433 #CYRILLIC SMALL LETTER GHE
+0xE4 U+0434 #CYRILLIC SMALL LETTER DE
+0xE5 U+0435 #CYRILLIC SMALL LETTER IE
+0xE6 U+0436 #CYRILLIC SMALL LETTER ZHE
+0xE7 U+0437 #CYRILLIC SMALL LETTER ZE
+0xE8 U+0438 #CYRILLIC SMALL LETTER I
+0xE9 U+0439 #CYRILLIC SMALL LETTER SHORT I
+0xEA U+043A #CYRILLIC SMALL LETTER KA
+0xEB U+043B #CYRILLIC SMALL LETTER EL
+0xEC U+043C #CYRILLIC SMALL LETTER EM
+0xED U+043D #CYRILLIC SMALL LETTER EN
+0xEE U+043E #CYRILLIC SMALL LETTER O
+0xEF U+043F #CYRILLIC SMALL LETTER PE
+0xF0 U+0440 #CYRILLIC SMALL LETTER ER
+0xF1 U+0441 #CYRILLIC SMALL LETTER ES
+0xF2 U+0442 #CYRILLIC SMALL LETTER TE
+0xF3 U+0443 #CYRILLIC SMALL LETTER U
+0xF4 U+0444 #CYRILLIC SMALL LETTER EF
+0xF5 U+0445 #CYRILLIC SMALL LETTER HA
+0xF6 U+0446 #CYRILLIC SMALL LETTER TSE
+0xF7 U+0447 #CYRILLIC SMALL LETTER CHE
+0xF8 U+0448 #CYRILLIC SMALL LETTER SHA
+0xF9 U+0449 #CYRILLIC SMALL LETTER SHCHA
+0xFA U+044A #CYRILLIC SMALL LETTER HARD SIGN
+0xFB U+044B #CYRILLIC SMALL LETTER YERU
+0xFC U+044C #CYRILLIC SMALL LETTER SOFT SIGN
+0xFD U+044D #CYRILLIC SMALL LETTER E
+0xFE U+044E #CYRILLIC SMALL LETTER YU
+0xFF U+044F #CYRILLIC SMALL LETTER YA
diff --git a/src/chrtrans/cp1252_uni.tbl b/src/chrtrans/cp1252_uni.tbl
new file mode 100644
index 0000000..50ce967
--- /dev/null
+++ b/src/chrtrans/cp1252_uni.tbl
@@ -0,0 +1,177 @@
+# This file has been modified for lynx (see README.tables)
+
+#Shall this become the "default" translation?
+#There has to be exactly one table marked as "default".
+D0
+#
+#The MIME name of this charset.
+Mwindows-1252
+
+#Name as a Display Charset (used on Options screen)
+OWestern (windows-1252)
+
+#Codepage number
+C1252
+
+#
+# Name: cp1252 to Unicode table
+# Unicode version: 2.0
+# Table version: 2.01
+# Table format: Format A
+# Date: 04/15/98
+#
+# Contact: cpxlate@microsoft.com
+#
+# General notes: none
+#
+# Format: Three tab-separated columns
+# Column #1 is the cp1252 code (in hex)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 is the Unicode name (follows a comment sign, '#')
+#
+# The entries are in cp1252 order
+#
+##################
+# Lines with more than one Unicode (U+XXXX) value contain additional
+# replacement mappings added for lynx. - kw
+
+0x20-0x7e idem
+#
+0x80 U+20AC #EURO SIGN
+0x81 #UNDEFINED
+0x82 U+201A #SINGLE LOW-9 QUOTATION MARK
+0x83 U+0192 #LATIN SMALL LETTER F WITH HOOK
+0x84 U+201E #DOUBLE LOW-9 QUOTATION MARK
+0x85 U+2026 #HORIZONTAL ELLIPSIS
+0x86 U+2020 #DAGGER
+0x87 U+2021 #DOUBLE DAGGER
+0x88 U+02C6 U+0302 #MODIFIER LETTER CIRCUMFLEX ACCENT
+0x89 U+2030 #PER MILLE SIGN
+0x8A U+0160 #LATIN CAPITAL LETTER S WITH CARON
+0x8B U+2039 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+0x8C U+0152 #LATIN CAPITAL LIGATURE OE
+0x8D #UNDEFINED
+0x8E U+017D #LATIN CAPITAL LETTER Z WITH CARON
+0x8F #UNDEFINED
+0x90 #UNDEFINED
+0x91 U+2018 #LEFT SINGLE QUOTATION MARK
+0x92 U+2019 #RIGHT SINGLE QUOTATION MARK
+0x93 U+201C #LEFT DOUBLE QUOTATION MARK
+0x94 U+201D U+02dd U+030b #RIGHT DOUBLE QUOTATION MARK
+0x95 U+2022 #BULLET
+0x96 U+2013 #EN DASH
+0x97 U+2014 #EM DASH
+0x98 U+02DC #SMALL TILDE
+0x99 U+2122 #TRADE MARK SIGN
+0x9A U+0161 #LATIN SMALL LETTER S WITH CARON
+0x9B U+203A #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+0x9C U+0153 #LATIN SMALL LIGATURE OE
+0x9D #UNDEFINED
+0x9E U+017E #LATIN SMALL LETTER Z WITH CARON
+0x9F U+0178 #LATIN CAPITAL LETTER Y WITH DIAERESIS
+0xA0 U+00A0 #NO-BREAK SPACE
+0xA1 U+00A1 #INVERTED EXCLAMATION MARK
+0xA2 U+00A2 #CENT SIGN
+0xA3 U+00A3 #POUND SIGN
+0xA4 U+00A4 #CURRENCY SIGN
+0xA5 U+00A5 #YEN SIGN
+0xA6 U+00A6 #BROKEN BAR
+0xA7 U+00A7 #SECTION SIGN
+0xA8 U+00A8 U+0308 #DIAERESIS
+0xA9 U+00A9 #COPYRIGHT SIGN
+0xAA U+00AA #FEMININE ORDINAL INDICATOR
+0xAB U+00AB #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xAC U+00AC #NOT SIGN
+0xAD U+00AD #SOFT HYPHEN
+0xAE U+00AE #REGISTERED SIGN
+0xAF U+00AF U+0304 #MACRON
+0xB0 U+00B0 U+030a #DEGREE SIGN
+0xB1 U+00B1 #PLUS-MINUS SIGN
+0xB2 U+00B2 #SUPERSCRIPT TWO
+0xB3 U+00B3 #SUPERSCRIPT THREE
+0xB4 U+00B4 #ACUTE ACCENT
+0xB5 U+00B5 U+03bc #MICRO SIGN
+0xB6 U+00B6 #PILCROW SIGN
+0xB7 U+00B7 U+0307 U+0387 U+2027 #MIDDLE DOT
+0xB8 U+00B8 U+0327 #CEDILLA
+0xB9 U+00B9 #SUPERSCRIPT ONE
+0xBA U+00BA #MASCULINE ORDINAL INDICATOR
+0xBB U+00BB #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xBC U+00BC #VULGAR FRACTION ONE QUARTER
+0xBD U+00BD #VULGAR FRACTION ONE HALF
+0xBE U+00BE #VULGAR FRACTION THREE QUARTERS
+0xBF U+00BF #INVERTED QUESTION MARK
+0xC0 U+00C0 #LATIN CAPITAL LETTER A WITH GRAVE
+0xC1 U+00C1 #LATIN CAPITAL LETTER A WITH ACUTE
+0xC2 U+00C2 #LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0xC3 U+00C3 #LATIN CAPITAL LETTER A WITH TILDE
+0xC4 U+00C4 #LATIN CAPITAL LETTER A WITH DIAERESIS
+0xC5 U+00C5 #LATIN CAPITAL LETTER A WITH RING ABOVE
+0xC6 U+00C6 #LATIN CAPITAL LETTER AE
+0xC7 U+00C7 #LATIN CAPITAL LETTER C WITH CEDILLA
+0xC8 U+00C8 #LATIN CAPITAL LETTER E WITH GRAVE
+0xC9 U+00C9 #LATIN CAPITAL LETTER E WITH ACUTE
+0xCA U+00CA #LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+0xCB U+00CB #LATIN CAPITAL LETTER E WITH DIAERESIS
+0xCC U+00CC #LATIN CAPITAL LETTER I WITH GRAVE
+0xCD U+00CD #LATIN CAPITAL LETTER I WITH ACUTE
+0xCE U+00CE #LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0xCF U+00CF #LATIN CAPITAL LETTER I WITH DIAERESIS
+0xD0 U+00D0 #LATIN CAPITAL LETTER ETH
+0xD1 U+00D1 #LATIN CAPITAL LETTER N WITH TILDE
+0xD2 U+00D2 #LATIN CAPITAL LETTER O WITH GRAVE
+0xD3 U+00D3 #LATIN CAPITAL LETTER O WITH ACUTE
+0xD4 U+00D4 #LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0xD5 U+00D5 #LATIN CAPITAL LETTER O WITH TILDE
+0xD6 U+00D6 #LATIN CAPITAL LETTER O WITH DIAERESIS
+0xD7 U+00D7 #MULTIPLICATION SIGN
+0xD8 U+00D8 #LATIN CAPITAL LETTER O WITH STROKE
+0xD9 U+00D9 #LATIN CAPITAL LETTER U WITH GRAVE
+0xDA U+00DA #LATIN CAPITAL LETTER U WITH ACUTE
+0xDB U+00DB #LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+0xDC U+00DC #LATIN CAPITAL LETTER U WITH DIAERESIS
+0xDD U+00DD #LATIN CAPITAL LETTER Y WITH ACUTE
+0xDE U+00DE #LATIN CAPITAL LETTER THORN
+0xDF U+00DF #LATIN SMALL LETTER SHARP S
+0xE0 U+00E0 #LATIN SMALL LETTER A WITH GRAVE
+0xE1 U+00E1 #LATIN SMALL LETTER A WITH ACUTE
+0xE2 U+00E2 #LATIN SMALL LETTER A WITH CIRCUMFLEX
+0xE3 U+00E3 #LATIN SMALL LETTER A WITH TILDE
+0xE4 U+00E4 #LATIN SMALL LETTER A WITH DIAERESIS
+0xE5 U+00E5 #LATIN SMALL LETTER A WITH RING ABOVE
+0xE6 U+00E6 #LATIN SMALL LETTER AE
+0xE7 U+00E7 #LATIN SMALL LETTER C WITH CEDILLA
+0xE8 U+00E8 #LATIN SMALL LETTER E WITH GRAVE
+0xE9 U+00E9 #LATIN SMALL LETTER E WITH ACUTE
+0xEA U+00EA #LATIN SMALL LETTER E WITH CIRCUMFLEX
+0xEB U+00EB #LATIN SMALL LETTER E WITH DIAERESIS
+0xEC U+00EC #LATIN SMALL LETTER I WITH GRAVE
+0xED U+00ED #LATIN SMALL LETTER I WITH ACUTE
+0xEE U+00EE #LATIN SMALL LETTER I WITH CIRCUMFLEX
+0xEF U+00EF #LATIN SMALL LETTER I WITH DIAERESIS
+0xF0 U+00F0 #LATIN SMALL LETTER ETH
+0xF1 U+00F1 #LATIN SMALL LETTER N WITH TILDE
+0xF2 U+00F2 #LATIN SMALL LETTER O WITH GRAVE
+0xF3 U+00F3 #LATIN SMALL LETTER O WITH ACUTE
+0xF4 U+00F4 #LATIN SMALL LETTER O WITH CIRCUMFLEX
+0xF5 U+00F5 #LATIN SMALL LETTER O WITH TILDE
+0xF6 U+00F6 #LATIN SMALL LETTER O WITH DIAERESIS
+0xF7 U+00F7 #DIVISION SIGN
+0xF8 U+00F8 #LATIN SMALL LETTER O WITH STROKE
+0xF9 U+00F9 #LATIN SMALL LETTER U WITH GRAVE
+0xFA U+00FA #LATIN SMALL LETTER U WITH ACUTE
+0xFB U+00FB #LATIN SMALL LETTER U WITH CIRCUMFLEX
+0xFC U+00FC #LATIN SMALL LETTER U WITH DIAERESIS
+0xFD U+00FD #LATIN SMALL LETTER Y WITH ACUTE
+0xFE U+00FE #LATIN SMALL LETTER THORN
+0xFF U+00FF #LATIN SMALL LETTER Y WITH DIAERESIS
+
+U+2218 " \260 " # RING OPERATOR
+U+2219 " \225 " # BULLET OPERATOR
+U+221b " ROOT\263 "
+U+2297 "(\327)" # CIRCLED TIMES
+U+2299 "(\267)" # CIRCLED DOT OPERATOR
+U+229A "(\260)" # CIRCLED RING OPERATOR
+U+22A0 "[\327]" # SQUARED TIMES
+U+22A1 "[\267]" # SQUARED DOT OPERATOR
+U+22C5 " \267 " # DOT OPERATOR
diff --git a/src/chrtrans/cp1253_uni.tbl b/src/chrtrans/cp1253_uni.tbl
new file mode 100644
index 0000000..49523d4
--- /dev/null
+++ b/src/chrtrans/cp1253_uni.tbl
@@ -0,0 +1,161 @@
+# This file has been modified for lynx (see README.tables)
+
+#The MIME name of this charset.
+Mwindows-1253
+
+#Name as a Display Charset (used on Options screen)
+OGreek (windows-1253)
+
+#Codepage number
+C1253
+
+#
+# Name: cp1253 to Unicode table
+# Unicode version: 2.0
+# Table version: 2.01
+# Table format: Format A
+# Date: 04/15/98
+#
+# Contact: cpxlate@microsoft.com
+#
+# General notes: none
+#
+# Format: Three tab-separated columns
+# Column #1 is the cp1253 code (in hex)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 is the Unicode name (follows a comment sign, '#')
+#
+# The entries are in cp1253 order
+#
+##################
+
+0x20-0x7e idem
+#
+0x80 U+20AC #EURO SIGN
+0x81 #UNDEFINED
+0x82 U+201A #SINGLE LOW-9 QUOTATION MARK
+0x83 U+0192 #LATIN SMALL LETTER F WITH HOOK
+0x84 U+201E #DOUBLE LOW-9 QUOTATION MARK
+0x85 U+2026 #HORIZONTAL ELLIPSIS
+0x86 U+2020 #DAGGER
+0x87 U+2021 #DOUBLE DAGGER
+0x88 #UNDEFINED
+0x89 U+2030 #PER MILLE SIGN
+0x8A #UNDEFINED
+0x8B U+2039 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+0x8C #UNDEFINED
+0x8D #UNDEFINED
+0x8E #UNDEFINED
+0x8F #UNDEFINED
+0x90 #UNDEFINED
+0x91 U+2018 U+02bd #LEFT SINGLE QUOTATION MARK
+0x92 U+2019 U+02bc #RIGHT SINGLE QUOTATION MARK
+0x93 U+201C #LEFT DOUBLE QUOTATION MARK
+0x94 U+201D #RIGHT DOUBLE QUOTATION MARK
+0x95 U+2022 #BULLET
+0x96 U+2013 #EN DASH
+0x97 U+2014 #EM DASH
+0x98 #UNDEFINED
+0x99 U+2122 #TRADE MARK SIGN
+0x9A #UNDEFINED
+0x9B U+203A #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+0x9C #UNDEFINED
+0x9D #UNDEFINED
+0x9E #UNDEFINED
+0x9F #UNDEFINED
+0xA0 U+00A0 #NO-BREAK SPACE
+0xA1 U+0385 #GREEK DIALYTIKA TONOS
+0xA2 U+0386 #GREEK CAPITAL LETTER ALPHA WITH TONOS
+0xA3 U+00A3 #POUND SIGN
+0xA4 U+00A4 #CURRENCY SIGN
+0xA5 U+00A5 #YEN SIGN
+0xA6 U+00A6 #BROKEN BAR
+0xA7 U+00A7 #SECTION SIGN
+0xA8 U+00A8 #DIAERESIS
+0xA9 U+00A9 #COPYRIGHT SIGN
+0xAA #UNDEFINED
+0xAB U+00AB #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xAC U+00AC #NOT SIGN
+0xAD U+00AD #SOFT HYPHEN
+0xAE U+00AE #REGISTERED SIGN
+0xAF U+2015 #HORIZONTAL BAR
+0xB0 U+00B0 #DEGREE SIGN
+0xB1 U+00B1 #PLUS-MINUS SIGN
+0xB2 U+00B2 #SUPERSCRIPT TWO
+0xB3 U+00B3 #SUPERSCRIPT THREE
+0xB4 U+0384 #GREEK TONOS
+0xB5 U+00B5 #MICRO SIGN
+0xB6 U+00B6 #PILCROW SIGN
+0xB7 U+00B7 #MIDDLE DOT
+0xB8 U+0388 #GREEK CAPITAL LETTER EPSILON WITH TONOS
+0xB9 U+0389 #GREEK CAPITAL LETTER ETA WITH TONOS
+0xBA U+038A #GREEK CAPITAL LETTER IOTA WITH TONOS
+0xBB U+00BB #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xBC U+038C #GREEK CAPITAL LETTER OMICRON WITH TONOS
+0xBD U+00BD #VULGAR FRACTION ONE HALF
+0xBE U+038E #GREEK CAPITAL LETTER UPSILON WITH TONOS
+0xBF U+038F #GREEK CAPITAL LETTER OMEGA WITH TONOS
+0xC0 U+0390 #GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+0xC1 U+0391 #GREEK CAPITAL LETTER ALPHA
+0xC2 U+0392 #GREEK CAPITAL LETTER BETA
+0xC3 U+0393 #GREEK CAPITAL LETTER GAMMA
+0xC4 U+0394 #GREEK CAPITAL LETTER DELTA
+0xC5 U+0395 #GREEK CAPITAL LETTER EPSILON
+0xC6 U+0396 #GREEK CAPITAL LETTER ZETA
+0xC7 U+0397 #GREEK CAPITAL LETTER ETA
+0xC8 U+0398 #GREEK CAPITAL LETTER THETA
+0xC9 U+0399 #GREEK CAPITAL LETTER IOTA
+0xCA U+039A #GREEK CAPITAL LETTER KAPPA
+0xCB U+039B #GREEK CAPITAL LETTER LAMDA
+0xCC U+039C #GREEK CAPITAL LETTER MU
+0xCD U+039D #GREEK CAPITAL LETTER NU
+0xCE U+039E #GREEK CAPITAL LETTER XI
+0xCF U+039F #GREEK CAPITAL LETTER OMICRON
+0xD0 U+03A0 #GREEK CAPITAL LETTER PI
+0xD1 U+03A1 #GREEK CAPITAL LETTER RHO
+0xD2 #UNDEFINED
+0xD3 U+03A3 #GREEK CAPITAL LETTER SIGMA
+0xD4 U+03A4 #GREEK CAPITAL LETTER TAU
+0xD5 U+03A5 #GREEK CAPITAL LETTER UPSILON
+0xD6 U+03A6 #GREEK CAPITAL LETTER PHI
+0xD7 U+03A7 #GREEK CAPITAL LETTER CHI
+0xD8 U+03A8 #GREEK CAPITAL LETTER PSI
+0xD9 U+03A9 #GREEK CAPITAL LETTER OMEGA
+0xDA U+03AA #GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
+0xDB U+03AB #GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+0xDC U+03AC #GREEK SMALL LETTER ALPHA WITH TONOS
+0xDD U+03AD #GREEK SMALL LETTER EPSILON WITH TONOS
+0xDE U+03AE #GREEK SMALL LETTER ETA WITH TONOS
+0xDF U+03AF #GREEK SMALL LETTER IOTA WITH TONOS
+0xE0 U+03B0 #GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+0xE1 U+03B1 #GREEK SMALL LETTER ALPHA
+0xE2 U+03B2 #GREEK SMALL LETTER BETA
+0xE3 U+03B3 #GREEK SMALL LETTER GAMMA
+0xE4 U+03B4 #GREEK SMALL LETTER DELTA
+0xE5 U+03B5 #GREEK SMALL LETTER EPSILON
+0xE6 U+03B6 #GREEK SMALL LETTER ZETA
+0xE7 U+03B7 #GREEK SMALL LETTER ETA
+0xE8 U+03B8 #GREEK SMALL LETTER THETA
+0xE9 U+03B9 #GREEK SMALL LETTER IOTA
+0xEA U+03BA #GREEK SMALL LETTER KAPPA
+0xEB U+03BB #GREEK SMALL LETTER LAMDA
+0xEC U+03BC #GREEK SMALL LETTER MU
+0xED U+03BD #GREEK SMALL LETTER NU
+0xEE U+03BE #GREEK SMALL LETTER XI
+0xEF U+03BF #GREEK SMALL LETTER OMICRON
+0xF0 U+03C0 #GREEK SMALL LETTER PI
+0xF1 U+03C1 #GREEK SMALL LETTER RHO
+0xF2 U+03C2 #GREEK SMALL LETTER FINAL SIGMA
+0xF3 U+03C3 #GREEK SMALL LETTER SIGMA
+0xF4 U+03C4 #GREEK SMALL LETTER TAU
+0xF5 U+03C5 #GREEK SMALL LETTER UPSILON
+0xF6 U+03C6 #GREEK SMALL LETTER PHI
+0xF7 U+03C7 #GREEK SMALL LETTER CHI
+0xF8 U+03C8 #GREEK SMALL LETTER PSI
+0xF9 U+03C9 #GREEK SMALL LETTER OMEGA
+0xFA U+03CA #GREEK SMALL LETTER IOTA WITH DIALYTIKA
+0xFB U+03CB #GREEK SMALL LETTER UPSILON WITH DIALYTIKA
+0xFC U+03CC #GREEK SMALL LETTER OMICRON WITH TONOS
+0xFD U+03CD #GREEK SMALL LETTER UPSILON WITH TONOS
+0xFE U+03CE #GREEK SMALL LETTER OMEGA WITH TONOS
+0xFF #UNDEFINED
diff --git a/src/chrtrans/cp1255_uni.tbl b/src/chrtrans/cp1255_uni.tbl
new file mode 100644
index 0000000..3f0af9e
--- /dev/null
+++ b/src/chrtrans/cp1255_uni.tbl
@@ -0,0 +1,161 @@
+# This file has been modified for lynx (see README.tables)
+
+#The MIME name of this charset.
+Mwindows-1255
+
+#Name as a Display Charset (used on Options screen).
+OHebrew (windows-1255)
+
+#Codepage number
+C1255
+
+#
+# Name: cp1255 to Unicode table
+# Unicode version: 2.0
+# Table version: 2.01
+# Table format: Format A
+# Date: 04/15/98
+#
+# Contact: cpxlate@microsoft.com
+#
+# General notes: none
+#
+# Format: Three tab-separated columns
+# Column #1 is the cp1255 code (in hex)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 is the Unicode name (follows a comment sign, '#')
+#
+# The entries are in cp1255 order
+#
+##################
+
+0x20-0x7e idem
+#
+0x80 U+20AC #EURO SIGN
+0x81 #UNDEFINED
+0x82 U+201A #SINGLE LOW-9 QUOTATION MARK
+0x83 U+0192 #LATIN SMALL LETTER F WITH HOOK
+0x84 U+201E #DOUBLE LOW-9 QUOTATION MARK
+0x85 U+2026 #HORIZONTAL ELLIPSIS
+0x86 U+2020 #DAGGER
+0x87 U+2021 #DOUBLE DAGGER
+0x88 U+02C6 #MODIFIER LETTER CIRCUMFLEX ACCENT
+0x89 U+2030 #PER MILLE SIGN
+0x8A #UNDEFINED
+0x8B U+2039 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+0x8C #UNDEFINED
+0x8D #UNDEFINED
+0x8E #UNDEFINED
+0x8F #UNDEFINED
+0x90 #UNDEFINED
+0x91 U+2018 #LEFT SINGLE QUOTATION MARK
+0x92 U+2019 #RIGHT SINGLE QUOTATION MARK
+0x93 U+201C #LEFT DOUBLE QUOTATION MARK
+0x94 U+201D #RIGHT DOUBLE QUOTATION MARK
+0x95 U+2022 #BULLET
+0x96 U+2013 #EN DASH
+0x97 U+2014 #EM DASH
+0x98 U+02DC #SMALL TILDE
+0x99 U+2122 #TRADE MARK SIGN
+0x9A #UNDEFINED
+0x9B U+203A #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+0x9C #UNDEFINED
+0x9D #UNDEFINED
+0x9E #UNDEFINED
+0x9F #UNDEFINED
+0xA0 U+00A0 #NO-BREAK SPACE
+0xA1 U+00A1 #INVERTED EXCLAMATION MARK
+0xA2 U+00A2 #CENT SIGN
+0xA3 U+00A3 #POUND SIGN
+0xA4 U+20AA #NEW SHEQEL SIGN
+0xA5 U+00A5 #YEN SIGN
+0xA6 U+00A6 #BROKEN BAR
+0xA7 U+00A7 #SECTION SIGN
+0xA8 U+00A8 #DIAERESIS
+0xA9 U+00A9 #COPYRIGHT SIGN
+0xAA U+00D7 #MULTIPLICATION SIGN
+0xAB U+00AB #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xAC U+00AC #NOT SIGN
+0xAD U+00AD #SOFT HYPHEN
+0xAE U+00AE #REGISTERED SIGN
+0xAF U+00AF #MACRON
+0xB0 U+00B0 #DEGREE SIGN
+0xB1 U+00B1 #PLUS-MINUS SIGN
+0xB2 U+00B2 #SUPERSCRIPT TWO
+0xB3 U+00B3 #SUPERSCRIPT THREE
+0xB4 U+00B4 #ACUTE ACCENT
+0xB5 U+00B5 #MICRO SIGN
+0xB6 U+00B6 #PILCROW SIGN
+0xB7 U+00B7 #MIDDLE DOT
+0xB8 U+00B8 #CEDILLA
+0xB9 U+00B9 #SUPERSCRIPT ONE
+0xBA U+00F7 #DIVISION SIGN
+0xBB U+00BB #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xBC U+00BC #VULGAR FRACTION ONE QUARTER
+0xBD U+00BD #VULGAR FRACTION ONE HALF
+0xBE U+00BE #VULGAR FRACTION THREE QUARTERS
+0xBF U+00BF #INVERTED QUESTION MARK
+0xC0 U+05B0 #HEBREW POINT SHEVA
+0xC1 U+05B1 #HEBREW POINT HATAF SEGOL
+0xC2 U+05B2 #HEBREW POINT HATAF PATAH
+0xC3 U+05B3 #HEBREW POINT HATAF QAMATS
+0xC4 U+05B4 #HEBREW POINT HIRIQ
+0xC5 U+05B5 #HEBREW POINT TSERE
+0xC6 U+05B6 #HEBREW POINT SEGOL
+0xC7 U+05B7 #HEBREW POINT PATAH
+0xC8 U+05B8 #HEBREW POINT QAMATS
+0xC9 U+05B9 #HEBREW POINT HOLAM
+0xCA #UNDEFINED
+0xCB U+05BB #HEBREW POINT QUBUTS
+0xCC U+05BC #HEBREW POINT DAGESH OR MAPIQ
+0xCD U+05BD #HEBREW POINT METEG
+0xCE U+05BE #HEBREW PUNCTUATION MAQAF
+0xCF U+05BF #HEBREW POINT RAFE
+0xD0 U+05C0 #HEBREW PUNCTUATION PASEQ
+0xD1 U+05C1 #HEBREW POINT SHIN DOT
+0xD2 U+05C2 #HEBREW POINT SIN DOT
+0xD3 U+05C3 #HEBREW PUNCTUATION SOF PASUQ
+0xD4 U+05F0 #HEBREW LIGATURE YIDDISH DOUBLE VAV
+0xD5 U+05F1 #HEBREW LIGATURE YIDDISH VAV YOD
+0xD6 U+05F2 #HEBREW LIGATURE YIDDISH DOUBLE YOD
+0xD7 U+05F3 #HEBREW PUNCTUATION GERESH
+0xD8 U+05F4 #HEBREW PUNCTUATION GERSHAYIM
+0xD9 #UNDEFINED
+0xDA #UNDEFINED
+0xDB #UNDEFINED
+0xDC #UNDEFINED
+0xDD #UNDEFINED
+0xDE #UNDEFINED
+0xDF #UNDEFINED
+0xE0 U+05D0 #HEBREW LETTER ALEF
+0xE1 U+05D1 #HEBREW LETTER BET
+0xE2 U+05D2 #HEBREW LETTER GIMEL
+0xE3 U+05D3 #HEBREW LETTER DALET
+0xE4 U+05D4 #HEBREW LETTER HE
+0xE5 U+05D5 #HEBREW LETTER VAV
+0xE6 U+05D6 #HEBREW LETTER ZAYIN
+0xE7 U+05D7 #HEBREW LETTER HET
+0xE8 U+05D8 #HEBREW LETTER TET
+0xE9 U+05D9 #HEBREW LETTER YOD
+0xEA U+05DA #HEBREW LETTER FINAL KAF
+0xEB U+05DB #HEBREW LETTER KAF
+0xEC U+05DC #HEBREW LETTER LAMED
+0xED U+05DD #HEBREW LETTER FINAL MEM
+0xEE U+05DE #HEBREW LETTER MEM
+0xEF U+05DF #HEBREW LETTER FINAL NUN
+0xF0 U+05E0 #HEBREW LETTER NUN
+0xF1 U+05E1 #HEBREW LETTER SAMEKH
+0xF2 U+05E2 #HEBREW LETTER AYIN
+0xF3 U+05E3 #HEBREW LETTER FINAL PE
+0xF4 U+05E4 #HEBREW LETTER PE
+0xF5 U+05E5 #HEBREW LETTER FINAL TSADI
+0xF6 U+05E6 #HEBREW LETTER TSADI
+0xF7 U+05E7 #HEBREW LETTER QOF
+0xF8 U+05E8 #HEBREW LETTER RESH
+0xF9 U+05E9 #HEBREW LETTER SHIN
+0xFA U+05EA #HEBREW LETTER TAV
+0xFB #UNDEFINED
+0xFC #UNDEFINED
+0xFD U+200E #LEFT-TO-RIGHT MARK
+0xFE U+200F #RIGHT-TO-LEFT MARK
+0xFF #UNDEFINED
diff --git a/src/chrtrans/cp1256_uni.tbl b/src/chrtrans/cp1256_uni.tbl
new file mode 100644
index 0000000..1ab99c0
--- /dev/null
+++ b/src/chrtrans/cp1256_uni.tbl
@@ -0,0 +1,161 @@
+# This file has been modified for lynx (see README.tables)
+
+#The MIME name of this charset.
+Mwindows-1256
+
+#Name as a Display Charset (used on Options screen).
+OArabic (windows-1256)
+
+#Codepage number
+C1256
+
+#
+# Name: cp1256 to Unicode table
+# Unicode version: 2.1
+# Table version: 2.01
+# Table format: Format A
+# Date: 01/5/99
+#
+# Contact: cpxlate@microsoft.com
+#
+# General notes: none
+#
+# Format: Three tab-separated columns
+# Column #1 is the cp1256 code (in hex)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 is the Unicode name (follows a comment sign, '#')
+#
+# The entries are in cp1256 order
+#
+##################
+
+0x20-0x7e idem
+#
+0x80 U+20AC #EURO SIGN
+0x81 U+067E #ARABIC LETTER PEH
+0x82 U+201A #SINGLE LOW-9 QUOTATION MARK
+0x83 U+0192 #LATIN SMALL LETTER F WITH HOOK
+0x84 U+201E #DOUBLE LOW-9 QUOTATION MARK
+0x85 U+2026 #HORIZONTAL ELLIPSIS
+0x86 U+2020 #DAGGER
+0x87 U+2021 #DOUBLE DAGGER
+0x88 U+02C6 #MODIFIER LETTER CIRCUMFLEX ACCENT
+0x89 U+2030 #PER MILLE SIGN
+0x8A U+0679 #ARABIC LETTER TTEH
+0x8B U+2039 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+0x8C U+0152 #LATIN CAPITAL LIGATURE OE
+0x8D U+0686 #ARABIC LETTER TCHEH
+0x8E U+0698 #ARABIC LETTER JEH
+0x8F U+0688 #ARABIC LETTER DDAL
+0x90 U+06AF #ARABIC LETTER GAF
+0x91 U+2018 #LEFT SINGLE QUOTATION MARK
+0x92 U+2019 #RIGHT SINGLE QUOTATION MARK
+0x93 U+201C #LEFT DOUBLE QUOTATION MARK
+0x94 U+201D #RIGHT DOUBLE QUOTATION MARK
+0x95 U+2022 #BULLET
+0x96 U+2013 #EN DASH
+0x97 U+2014 #EM DASH
+0x98 U+06A9 #ARABIC LETTER KEHEH
+0x99 U+2122 #TRADE MARK SIGN
+0x9A U+0691 #ARABIC LETTER RREH
+0x9B U+203A #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+0x9C U+0153 #LATIN SMALL LIGATURE OE
+0x9D U+200C #ZERO WIDTH NON-JOINER
+0x9E U+200D #ZERO WIDTH JOINER
+0x9F U+06BA #ARABIC LETTER NOON GHUNNA
+0xA0 U+00A0 #NO-BREAK SPACE
+0xA1 U+060C #ARABIC COMMA
+0xA2 U+00A2 #CENT SIGN
+0xA3 U+00A3 #POUND SIGN
+0xA4 U+00A4 #CURRENCY SIGN
+0xA5 U+00A5 #YEN SIGN
+0xA6 U+00A6 #BROKEN BAR
+0xA7 U+00A7 #SECTION SIGN
+0xA8 U+00A8 #DIAERESIS
+0xA9 U+00A9 #COPYRIGHT SIGN
+0xAA U+06BE #ARABIC LETTER HEH DOACHASHMEE
+0xAB U+00AB #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xAC U+00AC #NOT SIGN
+0xAD U+00AD #SOFT HYPHEN
+0xAE U+00AE #REGISTERED SIGN
+0xAF U+00AF #MACRON
+0xB0 U+00B0 #DEGREE SIGN
+0xB1 U+00B1 #PLUS-MINUS SIGN
+0xB2 U+00B2 #SUPERSCRIPT TWO
+0xB3 U+00B3 #SUPERSCRIPT THREE
+0xB4 U+00B4 #ACUTE ACCENT
+0xB5 U+00B5 #MICRO SIGN
+0xB6 U+00B6 #PILCROW SIGN
+0xB7 U+00B7 #MIDDLE DOT
+0xB8 U+00B8 #CEDILLA
+0xB9 U+00B9 #SUPERSCRIPT ONE
+0xBA U+061B #ARABIC SEMICOLON
+0xBB U+00BB #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xBC U+00BC #VULGAR FRACTION ONE QUARTER
+0xBD U+00BD #VULGAR FRACTION ONE HALF
+0xBE U+00BE #VULGAR FRACTION THREE QUARTERS
+0xBF U+061F #ARABIC QUESTION MARK
+0xC0 U+06C1 #ARABIC LETTER HEH GOAL
+0xC1 U+0621 #ARABIC LETTER HAMZA
+0xC2 U+0622 #ARABIC LETTER ALEF WITH MADDA ABOVE
+0xC3 U+0623 #ARABIC LETTER ALEF WITH HAMZA ABOVE
+0xC4 U+0624 #ARABIC LETTER WAW WITH HAMZA ABOVE
+0xC5 U+0625 #ARABIC LETTER ALEF WITH HAMZA BELOW
+0xC6 U+0626 #ARABIC LETTER YEH WITH HAMZA ABOVE
+0xC7 U+0627 #ARABIC LETTER ALEF
+0xC8 U+0628 #ARABIC LETTER BEH
+0xC9 U+0629 #ARABIC LETTER TEH MARBUTA
+0xCA U+062A #ARABIC LETTER TEH
+0xCB U+062B #ARABIC LETTER THEH
+0xCC U+062C #ARABIC LETTER JEEM
+0xCD U+062D #ARABIC LETTER HAH
+0xCE U+062E #ARABIC LETTER KHAH
+0xCF U+062F #ARABIC LETTER DAL
+0xD0 U+0630 #ARABIC LETTER THAL
+0xD1 U+0631 #ARABIC LETTER REH
+0xD2 U+0632 #ARABIC LETTER ZAIN
+0xD3 U+0633 #ARABIC LETTER SEEN
+0xD4 U+0634 #ARABIC LETTER SHEEN
+0xD5 U+0635 #ARABIC LETTER SAD
+0xD6 U+0636 #ARABIC LETTER DAD
+0xD7 U+00D7 #MULTIPLICATION SIGN
+0xD8 U+0637 #ARABIC LETTER TAH
+0xD9 U+0638 #ARABIC LETTER ZAH
+0xDA U+0639 #ARABIC LETTER AIN
+0xDB U+063A #ARABIC LETTER GHAIN
+0xDC U+0640 #ARABIC TATWEEL
+0xDD U+0641 #ARABIC LETTER FEH
+0xDE U+0642 #ARABIC LETTER QAF
+0xDF U+0643 #ARABIC LETTER KAF
+0xE0 U+00E0 #LATIN SMALL LETTER A WITH GRAVE
+0xE1 U+0644 #ARABIC LETTER LAM
+0xE2 U+00E2 #LATIN SMALL LETTER A WITH CIRCUMFLEX
+0xE3 U+0645 #ARABIC LETTER MEEM
+0xE4 U+0646 #ARABIC LETTER NOON
+0xE5 U+0647 #ARABIC LETTER HEH
+0xE6 U+0648 #ARABIC LETTER WAW
+0xE7 U+00E7 #LATIN SMALL LETTER C WITH CEDILLA
+0xE8 U+00E8 #LATIN SMALL LETTER E WITH GRAVE
+0xE9 U+00E9 #LATIN SMALL LETTER E WITH ACUTE
+0xEA U+00EA #LATIN SMALL LETTER E WITH CIRCUMFLEX
+0xEB U+00EB #LATIN SMALL LETTER E WITH DIAERESIS
+0xEC U+0649 #ARABIC LETTER ALEF MAKSURA
+0xED U+064A #ARABIC LETTER YEH
+0xEE U+00EE #LATIN SMALL LETTER I WITH CIRCUMFLEX
+0xEF U+00EF #LATIN SMALL LETTER I WITH DIAERESIS
+0xF0 U+064B #ARABIC FATHATAN
+0xF1 U+064C #ARABIC DAMMATAN
+0xF2 U+064D #ARABIC KASRATAN
+0xF3 U+064E #ARABIC FATHA
+0xF4 U+00F4 #LATIN SMALL LETTER O WITH CIRCUMFLEX
+0xF5 U+064F #ARABIC DAMMA
+0xF6 U+0650 #ARABIC KASRA
+0xF7 U+00F7 #DIVISION SIGN
+0xF8 U+0651 #ARABIC SHADDA
+0xF9 U+00F9 #LATIN SMALL LETTER U WITH GRAVE
+0xFA U+0652 #ARABIC SUKUN
+0xFB U+00FB #LATIN SMALL LETTER U WITH CIRCUMFLEX
+0xFC U+00FC #LATIN SMALL LETTER U WITH DIAERESIS
+0xFD U+200E #LEFT-TO-RIGHT MARK
+0xFE U+200F #RIGHT-TO-LEFT MARK
+0xFF U+06D2 #ARABIC LETTER YEH BARREE
diff --git a/src/chrtrans/cp1257_uni.tbl b/src/chrtrans/cp1257_uni.tbl
new file mode 100644
index 0000000..6cd0081
--- /dev/null
+++ b/src/chrtrans/cp1257_uni.tbl
@@ -0,0 +1,162 @@
+# This file has been modified for lynx (see README.tables)
+
+#The MIME name of this charset.
+Mwindows-1257
+
+#Name as a Display Charset (used on Options screen)
+OBaltic Rim (windows-1257)
+
+#Codepage number
+C1257
+
+#
+# Name: cp1257 to Unicode table
+# Unicode version: 2.0
+# Table version: 2.01
+# Table format: Format A
+# Date: 04/15/98
+#
+# Contact: cpxlate@microsoft.com
+#
+# General notes: none
+#
+# Format: Three tab-separated columns
+# Column #1 is the cp1257 code (in hex)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 is the Unicode name (follows a comment sign, '#')
+#
+# The entries are in cp1257 order
+#
+##################
+
+0x20-0x7e idem
+#
+0x80 U+20AC #EURO SIGN
+0x81 #UNDEFINED
+0x82 U+201A #SINGLE LOW-9 QUOTATION MARK
+0x83 #UNDEFINED
+0x84 U+201E #DOUBLE LOW-9 QUOTATION MARK
+0x85 U+2026 #HORIZONTAL ELLIPSIS
+0x86 U+2020 #DAGGER
+0x87 U+2021 #DOUBLE DAGGER
+0x88 #UNDEFINED
+0x89 U+2030 #PER MILLE SIGN
+0x8A #UNDEFINED
+0x8B U+2039 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+0x8C #UNDEFINED
+0x8D U+00A8 #DIAERESIS
+0x8E U+02C7 #CARON
+0x8F U+00B8 #CEDILLA
+0x90 #UNDEFINED
+0x91 U+2018 #LEFT SINGLE QUOTATION MARK
+0x92 U+2019 #RIGHT SINGLE QUOTATION MARK
+0x93 U+201C #LEFT DOUBLE QUOTATION MARK
+0x94 U+201D #RIGHT DOUBLE QUOTATION MARK
+0x95 U+2022 #BULLET
+0x96 U+2013 #EN DASH
+0x97 U+2014 #EM DASH
+0x98 #UNDEFINED
+0x99 U+2122 #TRADE MARK SIGN
+0x9A #UNDEFINED
+0x9B U+203A #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+0x9C #UNDEFINED
+0x9D U+00AF #MACRON
+0x9E U+02DB #OGONEK
+0x9F #UNDEFINED
+0xA0 U+00A0 #NO-BREAK SPACE
+0xA1 #UNDEFINED
+0xA2 U+00A2 #CENT SIGN
+0xA3 U+00A3 #POUND SIGN
+0xA4 U+00A4 #CURRENCY SIGN
+0xA5 #UNDEFINED
+0xA6 U+00A6 #BROKEN BAR
+0xA7 U+00A7 #SECTION SIGN
+0xA8 U+00D8 #LATIN CAPITAL LETTER O WITH STROKE
+0xA9 U+00A9 #COPYRIGHT SIGN
+0xAA U+0156 #LATIN CAPITAL LETTER R WITH CEDILLA
+0xAB U+00AB #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xAC U+00AC #NOT SIGN
+0xAD U+00AD #SOFT HYPHEN
+0xAE U+00AE #REGISTERED SIGN
+0xAF U+00C6 #LATIN CAPITAL LETTER AE
+0xB0 U+00B0 #DEGREE SIGN
+0xB1 U+00B1 #PLUS-MINUS SIGN
+0xB2 U+00B2 #SUPERSCRIPT TWO
+0xB3 U+00B3 #SUPERSCRIPT THREE
+0xB4 U+00B4 #ACUTE ACCENT
+0xB5 U+00B5 #MICRO SIGN
+0xB6 U+00B6 #PILCROW SIGN
+0xB7 U+00B7 #MIDDLE DOT
+0xB8 U+00F8 #LATIN SMALL LETTER O WITH STROKE
+0xB9 U+00B9 #SUPERSCRIPT ONE
+0xBA U+0157 #LATIN SMALL LETTER R WITH CEDILLA
+0xBB U+00BB #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xBC U+00BC #VULGAR FRACTION ONE QUARTER
+0xBD U+00BD #VULGAR FRACTION ONE HALF
+0xBE U+00BE #VULGAR FRACTION THREE QUARTERS
+0xBF U+00E6 #LATIN SMALL LETTER AE
+0xC0 U+0104 #LATIN CAPITAL LETTER A WITH OGONEK
+0xC1 U+012E #LATIN CAPITAL LETTER I WITH OGONEK
+0xC2 U+0100 #LATIN CAPITAL LETTER A WITH MACRON
+0xC3 U+0106 #LATIN CAPITAL LETTER C WITH ACUTE
+0xC4 U+00C4 #LATIN CAPITAL LETTER A WITH DIAERESIS
+0xC5 U+00C5 #LATIN CAPITAL LETTER A WITH RING ABOVE
+0xC6 U+0118 #LATIN CAPITAL LETTER E WITH OGONEK
+0xC7 U+0112 #LATIN CAPITAL LETTER E WITH MACRON
+0xC8 U+010C #LATIN CAPITAL LETTER C WITH CARON
+0xC9 U+00C9 #LATIN CAPITAL LETTER E WITH ACUTE
+0xCA U+0179 #LATIN CAPITAL LETTER Z WITH ACUTE
+0xCB U+0116 #LATIN CAPITAL LETTER E WITH DOT ABOVE
+0xCC U+0122 #LATIN CAPITAL LETTER G WITH CEDILLA
+0xCD U+0136 #LATIN CAPITAL LETTER K WITH CEDILLA
+0xCE U+012A #LATIN CAPITAL LETTER I WITH MACRON
+0xCF U+013B #LATIN CAPITAL LETTER L WITH CEDILLA
+0xD0 U+0160 #LATIN CAPITAL LETTER S WITH CARON
+0xD1 U+0143 #LATIN CAPITAL LETTER N WITH ACUTE
+0xD2 U+0145 #LATIN CAPITAL LETTER N WITH CEDILLA
+0xD3 U+00D3 #LATIN CAPITAL LETTER O WITH ACUTE
+0xD4 U+014C #LATIN CAPITAL LETTER O WITH MACRON
+0xD5 U+00D5 #LATIN CAPITAL LETTER O WITH TILDE
+0xD6 U+00D6 #LATIN CAPITAL LETTER O WITH DIAERESIS
+0xD7 U+00D7 #MULTIPLICATION SIGN
+0xD8 U+0172 #LATIN CAPITAL LETTER U WITH OGONEK
+0xD9 U+0141 #LATIN CAPITAL LETTER L WITH STROKE
+0xDA U+015A #LATIN CAPITAL LETTER S WITH ACUTE
+0xDB U+016A #LATIN CAPITAL LETTER U WITH MACRON
+0xDC U+00DC #LATIN CAPITAL LETTER U WITH DIAERESIS
+0xDD U+017B #LATIN CAPITAL LETTER Z WITH DOT ABOVE
+0xDE U+017D #LATIN CAPITAL LETTER Z WITH CARON
+0xDF U+00DF #LATIN SMALL LETTER SHARP S
+0xE0 U+0105 #LATIN SMALL LETTER A WITH OGONEK
+0xE1 U+012F #LATIN SMALL LETTER I WITH OGONEK
+0xE2 U+0101 #LATIN SMALL LETTER A WITH MACRON
+0xE3 U+0107 #LATIN SMALL LETTER C WITH ACUTE
+0xE4 U+00E4 #LATIN SMALL LETTER A WITH DIAERESIS
+0xE5 U+00E5 #LATIN SMALL LETTER A WITH RING ABOVE
+0xE6 U+0119 #LATIN SMALL LETTER E WITH OGONEK
+0xE7 U+0113 #LATIN SMALL LETTER E WITH MACRON
+0xE8 U+010D #LATIN SMALL LETTER C WITH CARON
+0xE9 U+00E9 #LATIN SMALL LETTER E WITH ACUTE
+0xEA U+017A #LATIN SMALL LETTER Z WITH ACUTE
+0xEB U+0117 #LATIN SMALL LETTER E WITH DOT ABOVE
+0xEC U+0123 #LATIN SMALL LETTER G WITH CEDILLA
+0xED U+0137 #LATIN SMALL LETTER K WITH CEDILLA
+0xEE U+012B #LATIN SMALL LETTER I WITH MACRON
+0xEF U+013C #LATIN SMALL LETTER L WITH CEDILLA
+0xF0 U+0161 #LATIN SMALL LETTER S WITH CARON
+0xF1 U+0144 #LATIN SMALL LETTER N WITH ACUTE
+0xF2 U+0146 #LATIN SMALL LETTER N WITH CEDILLA
+0xF3 U+00F3 #LATIN SMALL LETTER O WITH ACUTE
+0xF4 U+014D #LATIN SMALL LETTER O WITH MACRON
+0xF5 U+00F5 #LATIN SMALL LETTER O WITH TILDE
+0xF6 U+00F6 #LATIN SMALL LETTER O WITH DIAERESIS
+0xF7 U+00F7 #DIVISION SIGN
+0xF8 U+0173 #LATIN SMALL LETTER U WITH OGONEK
+0xF9 U+0142 #LATIN SMALL LETTER L WITH STROKE
+0xFA U+015B #LATIN SMALL LETTER S WITH ACUTE
+0xFB U+016B #LATIN SMALL LETTER U WITH MACRON
+0xFC U+00FC #LATIN SMALL LETTER U WITH DIAERESIS
+0xFD U+017C #LATIN SMALL LETTER Z WITH DOT ABOVE
+0xFE U+017E #LATIN SMALL LETTER Z WITH CARON
+0xFF U+02D9 #DOT ABOVE
+
diff --git a/src/chrtrans/cp437_uni.tbl b/src/chrtrans/cp437_uni.tbl
new file mode 100644
index 0000000..4f45ce7
--- /dev/null
+++ b/src/chrtrans/cp437_uni.tbl
@@ -0,0 +1,181 @@
+# This file has been modified for lynx (see README.tables)
+
+#Shall this become the "default" translation?
+#There has to be exactly one table marked as "default".
+D0
+#
+#The MIME name of this charset.
+Mcp437
+
+#Name as a Display Charset (used on Options screen)
+OIBM PC US codepage (cp437)
+
+#Codepage number
+C437
+
+#
+# Name: cp437_DOSLatinUS to Unicode table
+# Unicode version: 2.0
+# Table version: 2.00
+# Table format: Format A
+# Date: 04/24/96
+# Authors: Lori Brownell <loribr@microsoft.com>
+# K.D. Chang <a-kchang@microsoft.com>
+# General notes: none
+#
+# Format: Three tab-separated columns
+# Column #1 is the cp437_DOSLatinUS code (in hex)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 is the Unicode name (follows a comment sign, '#')
+#
+# The entries are in cp437_DosLatinUS order
+#
+# Lines with more than one Unicode (U+XXXX) value contain additional
+# replacement mappings added for lynx. - kw
+#
+#######################################
+
+0x20-0x7f idem
+#
+0x80 U+00c7 #LATIN CAPITAL LETTER C WITH CEDILLA
+0x81 U+00fc U+03cb #LATIN SMALL LETTER U WITH DIAERESIS
+0x82 U+00e9 #LATIN SMALL LETTER E WITH ACUTE
+0x83 U+00e2 #LATIN SMALL LETTER A WITH CIRCUMFLEX
+0x84 U+00e4 #LATIN SMALL LETTER A WITH DIAERESIS
+0x85 U+00e0 #LATIN SMALL LETTER A WITH GRAVE
+0x86 U+00e5 #LATIN SMALL LETTER A WITH RING ABOVE
+0x87 U+00e7 #LATIN SMALL LETTER C WITH CEDILLA
+0x88 U+00ea #LATIN SMALL LETTER E WITH CIRCUMFLEX
+0x89 U+00eb #LATIN SMALL LETTER E WITH DIAERESIS
+0x8a U+00e8 #LATIN SMALL LETTER E WITH GRAVE
+0x8b U+00ef U+03ca #LATIN SMALL LETTER I WITH DIAERESIS
+0x8c U+00ee #LATIN SMALL LETTER I WITH CIRCUMFLEX
+0x8d U+00ec #LATIN SMALL LETTER I WITH GRAVE
+0x8e U+00c4 #LATIN CAPITAL LETTER A WITH DIAERESIS
+0x8f U+00c5 #LATIN CAPITAL LETTER A WITH RING ABOVE
+0x90 U+00c9 U+0388 #LATIN CAPITAL LETTER E WITH ACUTE
+0x91 U+00e6 #LATIN SMALL LIGATURE AE
+0x92 U+00c6 #LATIN CAPITAL LIGATURE AE
+0x93 U+00f4 #LATIN SMALL LETTER O WITH CIRCUMFLEX
+0x94 U+00f6 #LATIN SMALL LETTER O WITH DIAERESIS
+0x95 U+00f2 #LATIN SMALL LETTER O WITH GRAVE
+0x96 U+00fb #LATIN SMALL LETTER U WITH CIRCUMFLEX
+0x97 U+00f9 #LATIN SMALL LETTER U WITH GRAVE
+0x98 U+00ff #LATIN SMALL LETTER Y WITH DIAERESIS
+0x99 U+00d6 #LATIN CAPITAL LETTER O WITH DIAERESIS
+0x9a U+00dc U+03ab #LATIN CAPITAL LETTER U WITH DIAERESIS
+0x9b U+00a2 #CENT SIGN
+0x9c U+00a3 #POUND SIGN
+0x9d U+00a5 #YEN SIGN
+0x9e U+20a7 #PESETA SIGN
+0x9f U+0192 #LATIN SMALL LETTER F WITH HOOK
+0xa0 U+00e1 U+03ac #LATIN SMALL LETTER A WITH ACUTE
+0xa1 U+00ed U+03af #LATIN SMALL LETTER I WITH ACUTE
+0xa2 U+00f3 U+03cc #LATIN SMALL LETTER O WITH ACUTE
+0xa3 U+00fa U+03cd #LATIN SMALL LETTER U WITH ACUTE
+0xa4 U+00f1 #LATIN SMALL LETTER N WITH TILDE
+0xa5 U+00d1 #LATIN CAPITAL LETTER N WITH TILDE
+0xa6 U+00aa #FEMININE ORDINAL INDICATOR
+0xa7 U+00ba #MASCULINE ORDINAL INDICATOR
+0xa8 U+00bf #INVERTED QUESTION MARK
+0xa9 U+2310 #REVERSED NOT SIGN
+0xaa U+00ac #NOT SIGN
+0xab U+00bd #VULGAR FRACTION ONE HALF
+0xac U+00bc #VULGAR FRACTION ONE QUARTER
+0xad U+00a1 #INVERTED EXCLAMATION MARK
+0xae U+00ab #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xaf U+00bb #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xb0 U+2591 #LIGHT SHADE
+0xb1 U+2592 #MEDIUM SHADE
+0xb2 U+2593 #DARK SHADE
+0xb3 U+2502 #BOX DRAWINGS LIGHT VERTICAL
+0xb4 U+2524 #BOX DRAWINGS LIGHT VERTICAL AND LEFT
+0xb5 U+2561 #BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+0xb6 U+2562 #BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
+0xb7 U+2556 #BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
+0xb8 U+2555 #BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
+0xb9 U+2563 #BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+0xba U+2551 #BOX DRAWINGS DOUBLE VERTICAL
+0xbb U+2557 #BOX DRAWINGS DOUBLE DOWN AND LEFT
+0xbc U+255d #BOX DRAWINGS DOUBLE UP AND LEFT
+0xbd U+255c #BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
+0xbe U+255b #BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+0xbf U+2510 #BOX DRAWINGS LIGHT DOWN AND LEFT
+0xc0 U+2514 #BOX DRAWINGS LIGHT UP AND RIGHT
+0xc1 U+2534 #BOX DRAWINGS LIGHT UP AND HORIZONTAL
+0xc2 U+252c #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+0xc3 U+251c #BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+0xc4 U+2500 #BOX DRAWINGS LIGHT HORIZONTAL
+0xc5 U+253c #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+0xc6 U+255e #BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+0xc7 U+255f #BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+0xc8 U+255a #BOX DRAWINGS DOUBLE UP AND RIGHT
+0xc9 U+2554 #BOX DRAWINGS DOUBLE DOWN AND RIGHT
+0xca U+2569 #BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+0xcb U+2566 #BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+0xcc U+2560 #BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+0xcd U+2550 #BOX DRAWINGS DOUBLE HORIZONTAL
+0xce U+256c #BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+0xcf U+2567 #BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+0xd0 U+2568 #BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+0xd1 U+2564 #BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
+0xd2 U+2565 #BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
+0xd3 U+2559 #BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+0xd4 U+2558 #BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+0xd5 U+2552 #BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+0xd6 U+2553 #BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
+0xd7 U+256b #BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
+0xd8 U+256a #BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+0xd9 U+2518 #BOX DRAWINGS LIGHT UP AND LEFT
+0xda U+250c #BOX DRAWINGS LIGHT DOWN AND RIGHT
+0xdb U+2588 #FULL BLOCK
+0xdc U+2584 #LOWER HALF BLOCK
+0xdd U+258c #LEFT HALF BLOCK
+0xde U+2590 #RIGHT HALF BLOCK
+0xdf U+2580 #UPPER HALF BLOCK
+0xe0 U+03b1 #GREEK SMALL LETTER ALPHA
+0xe1 U+00df U+03b2 #LATIN SMALL LETTER SHARP S
+0xe2 U+0393 #GREEK CAPITAL LETTER GAMMA
+0xe3 U+03c0 #GREEK SMALL LETTER PI
+0xe4 U+03a3 U+2211 #GREEK CAPITAL LETTER SIGMA
+0xe5 U+03c3 #GREEK SMALL LETTER SIGMA
+0xe6 U+00b5 U+03bc #MICRO SIGN
+0xe7 U+03c4 #GREEK SMALL LETTER TAU
+0xe8 U+03a6 #GREEK CAPITAL LETTER PHI
+0xe9 U+0398 U+03b8 #GREEK CAPITAL LETTER THETA
+0xea U+03a9 U+2126 #GREEK CAPITAL LETTER OMEGA
+0xeb U+03b4 #GREEK SMALL LETTER DELTA
+0xec U+221e #INFINITY
+0xed U+03c6 U+00f8 #GREEK SMALL LETTER PHI
+0xee U+03b5 U+2208 U+220a #GREEK SMALL LETTER EPSILON
+0xef U+2229 #INTERSECTION
+0xf0 U+2261 #IDENTICAL TO
+0xf1 U+00b1 #PLUS-MINUS SIGN
+0xf2 U+2265 U+2267 #GREATER-THAN OR EQUAL TO
+0xf3 U+2264 U+2266 #LESS-THAN OR EQUAL TO
+0xf4 U+2320 U+0283 #TOP HALF INTEGRAL
+0xf5 U+2321 #BOTTOM HALF INTEGRAL
+0xf6 U+00f7 #DIVISION SIGN
+0xf7 U+2248 #ALMOST EQUAL TO
+0xf8 U+00b0 U+030a #DEGREE SIGN
+0xf9 U+2219 U+0307 U+0387 #BULLET OPERATOR
+0xfa U+00b7 U+2027 #MIDDLE DOT
+0xfb U+221a #SQUARE ROOT
+0xfc U+207f #SUPERSCRIPT LATIN SMALL LETTER N
+0xfd U+00b2 #SUPERSCRIPT TWO
+0xfe U+25a0 #BLACK SQUARE
+0xff U+00a0 #NO-BREAK SPACE
+
+U+03ad "\356'" #:î'
+U+03ae:h'
+U+03cd:u'
+U+03ce:w'
+
+U+2209 " !\356 "
+U+221b " 3\373"
+U+221c " 4\373"
+U+2262 " !\360"
+U+2299 "(\372)"
+U+229a "(\370)"
+U+22a1 "[\372]"
+U+02a7 "t\364"
diff --git a/src/chrtrans/cp737_uni.tbl b/src/chrtrans/cp737_uni.tbl
new file mode 100644
index 0000000..e57e261
--- /dev/null
+++ b/src/chrtrans/cp737_uni.tbl
@@ -0,0 +1,172 @@
+# This file has been modified for lynx (see README.tables)
+
+#The MIME name of this charset.
+Mcp737
+
+#Name as a Display Charset (used on Options screen)
+OGreek (cp737)
+
+#Codepage number
+C737
+
+#
+# Name: cp737_DOSGreek to Unicode table
+# Unicode version: 2.0
+# Table version: 2.00
+# Table format: Format A
+# Date: 04/24/96
+# Authors: Lori Brownell <loribr@microsoft.com>
+# K.D. Chang <a-kchang@microsoft.com>
+# General notes: none
+#
+# Format: Three tab-separated columns
+# Column #1 is the cp737_DOSGreek code (in hex)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 is the Unicode name (follows a comment sign, '#')
+#
+# The entries are in cp737_DOSGreek order
+#
+##################
+# Lines with more than one Unicode (U+XXXX) value contain additional
+# replacement mappings added for lynx. - kw
+
+0x20-0x7f idem
+#
+0x80 U+0391 #GREEK CAPITAL LETTER ALPHA
+0x81 U+0392 #GREEK CAPITAL LETTER BETA
+0x82 U+0393 #GREEK CAPITAL LETTER GAMMA
+0x83 U+0394 #GREEK CAPITAL LETTER DELTA
+0x84 U+0395 #GREEK CAPITAL LETTER EPSILON
+0x85 U+0396 #GREEK CAPITAL LETTER ZETA
+0x86 U+0397 #GREEK CAPITAL LETTER ETA
+0x87 U+0398 #GREEK CAPITAL LETTER THETA
+0x88 U+0399 #GREEK CAPITAL LETTER IOTA
+0x89 U+039a #GREEK CAPITAL LETTER KAPPA
+0x8a U+039b #GREEK CAPITAL LETTER LAMDA
+0x8b U+039c #GREEK CAPITAL LETTER MU
+0x8c U+039d #GREEK CAPITAL LETTER NU
+0x8d U+039e #GREEK CAPITAL LETTER XI
+0x8e U+039f #GREEK CAPITAL LETTER OMICRON
+0x8f U+03a0 #GREEK CAPITAL LETTER PI
+0x90 U+03a1 #GREEK CAPITAL LETTER RHO
+0x91 U+03a3 #GREEK CAPITAL LETTER SIGMA
+0x92 U+03a4 #GREEK CAPITAL LETTER TAU
+0x93 U+03a5 #GREEK CAPITAL LETTER UPSILON
+0x94 U+03a6 #GREEK CAPITAL LETTER PHI
+0x95 U+03a7 #GREEK CAPITAL LETTER CHI
+0x96 U+03a8 #GREEK CAPITAL LETTER PSI
+0x97 U+03a9 #GREEK CAPITAL LETTER OMEGA
+0x98 U+03b1 #GREEK SMALL LETTER ALPHA
+0x99 U+03b2 #GREEK SMALL LETTER BETA
+0x9a U+03b3 U+0263 #GREEK SMALL LETTER GAMMA
+0x9b U+03b4 #GREEK SMALL LETTER DELTA
+0x9c U+03b5 #GREEK SMALL LETTER EPSILON
+0x9d U+03b6 #GREEK SMALL LETTER ZETA
+0x9e U+03b7 #GREEK SMALL LETTER ETA
+0x9f U+03b8 #GREEK SMALL LETTER THETA
+0xa0 U+03b9 U+0131 #GREEK SMALL LETTER IOTA
+0xa1 U+03ba #GREEK SMALL LETTER KAPPA
+0xa2 U+03bb #GREEK SMALL LETTER LAMDA
+0xa3 U+03bc U+00b5 #GREEK SMALL LETTER MU
+0xa4 U+03bd #GREEK SMALL LETTER NU
+0xa5 U+03be #GREEK SMALL LETTER XI
+0xa6 U+03bf #GREEK SMALL LETTER OMICRON
+0xa7 U+03c0 #GREEK SMALL LETTER PI
+0xa8 U+03c1 #GREEK SMALL LETTER RHO
+0xa9 U+03c3 #GREEK SMALL LETTER SIGMA
+0xaa U+03c2 #GREEK SMALL LETTER FINAL SIGMA
+0xab U+03c4 #GREEK SMALL LETTER TAU
+0xac U+03c5 U+028a #GREEK SMALL LETTER UPSILON
+0xad U+03c6 #GREEK SMALL LETTER PHI
+0xae U+03c7 #GREEK SMALL LETTER CHI
+0xaf U+03c8 #GREEK SMALL LETTER PSI
+0xb0 U+2591 #LIGHT SHADE
+0xb1 U+2592 #MEDIUM SHADE
+0xb2 U+2593 #DARK SHADE
+0xb3 U+2502 #BOX DRAWINGS LIGHT VERTICAL
+0xb4 U+2524 #BOX DRAWINGS LIGHT VERTICAL AND LEFT
+0xb5 U+2561 #BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+0xb6 U+2562 #BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
+0xb7 U+2556 #BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
+0xb8 U+2555 #BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
+0xb9 U+2563 #BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+0xba U+2551 #BOX DRAWINGS DOUBLE VERTICAL
+0xbb U+2557 #BOX DRAWINGS DOUBLE DOWN AND LEFT
+0xbc U+255d #BOX DRAWINGS DOUBLE UP AND LEFT
+0xbd U+255c #BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
+0xbe U+255b #BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+0xbf U+2510 #BOX DRAWINGS LIGHT DOWN AND LEFT
+0xc0 U+2514 #BOX DRAWINGS LIGHT UP AND RIGHT
+0xc1 U+2534 #BOX DRAWINGS LIGHT UP AND HORIZONTAL
+0xc2 U+252c #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+0xc3 U+251c #BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+0xc4 U+2500 #BOX DRAWINGS LIGHT HORIZONTAL
+0xc5 U+253c #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+0xc6 U+255e #BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+0xc7 U+255f #BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+0xc8 U+255a #BOX DRAWINGS DOUBLE UP AND RIGHT
+0xc9 U+2554 #BOX DRAWINGS DOUBLE DOWN AND RIGHT
+0xca U+2569 #BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+0xcb U+2566 #BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+0xcc U+2560 #BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+0xcd U+2550 #BOX DRAWINGS DOUBLE HORIZONTAL
+0xce U+256c #BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+0xcf U+2567 #BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+0xd0 U+2568 #BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+0xd1 U+2564 #BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
+0xd2 U+2565 #BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
+0xd3 U+2559 #BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+0xd4 U+2558 #BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+0xd5 U+2552 #BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+0xd6 U+2553 #BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
+0xd7 U+256b #BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
+0xd8 U+256a #BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+0xd9 U+2518 #BOX DRAWINGS LIGHT UP AND LEFT
+0xda U+250c #BOX DRAWINGS LIGHT DOWN AND RIGHT
+0xdb U+2588 #FULL BLOCK
+0xdc U+2584 #LOWER HALF BLOCK
+0xdd U+258c #LEFT HALF BLOCK
+0xde U+2590 #RIGHT HALF BLOCK
+0xdf U+2580 #UPPER HALF BLOCK
+0xe0 U+03c9 #GREEK SMALL LETTER OMEGA
+0xe1 U+03ac #GREEK SMALL LETTER ALPHA WITH TONOS
+0xe2 U+03ad #GREEK SMALL LETTER EPSILON WITH TONOS
+0xe3 U+03ae #GREEK SMALL LETTER ETA WITH TONOS
+0xe4 U+03ca #GREEK SMALL LETTER IOTA WITH DIALYTIKA
+0xe5 U+03af #GREEK SMALL LETTER IOTA WITH TONOS
+0xe6 U+03cc #GREEK SMALL LETTER OMICRON WITH TONOS
+0xe7 U+03cd #GREEK SMALL LETTER UPSILON WITH TONOS
+0xe8 U+03cb U+00fc #GREEK SMALL LETTER UPSILON WITH DIALYTIKA
+0xe9 U+03ce #GREEK SMALL LETTER OMEGA WITH TONOS
+0xea U+0386 #GREEK CAPITAL LETTER ALPHA WITH TONOS
+0xeb U+0388 #GREEK CAPITAL LETTER EPSILON WITH TONOS
+0xec U+0389 #GREEK CAPITAL LETTER ETA WITH TONOS
+0xed U+038a #GREEK CAPITAL LETTER IOTA WITH TONOS
+0xee U+038c #GREEK CAPITAL LETTER OMICRON WITH TONOS
+0xef U+038e #GREEK CAPITAL LETTER UPSILON WITH TONOS
+0xf0 U+038f #GREEK CAPITAL LETTER OMEGA WITH TONOS
+0xf1 U+00b1 #PLUS-MINUS SIGN
+0xf2 U+2265 #GREATER-THAN OR EQUAL TO
+0xf3 U+2264 #LESS-THAN OR EQUAL TO
+0xf4 U+03aa #GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
+0xf5 U+03ab #GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+0xf6 U+00f7 #DIVISION SIGN
+0xf7 U+2248 #ALMOST EQUAL TO
+0xf8 U+00b0 #DEGREE SIGN
+0xf9 U+2219 U+0307 U+0387 #BULLET OPERATOR
+0xfa U+00b7 #MIDDLE DOT
+0xfb U+221a #SQUARE ROOT
+0xfc U+207f #SUPERSCRIPT LATIN SMALL LETTER N
+0xfd U+00b2 #SUPERSCRIPT TWO
+0xfe U+25a0 #BLACK SQUARE
+0xff U+00a0 #NO-BREAK SPACE
+
+U+2209 " !\234 "
+U+2218 " \370 " # RING OPERATOR
+U+221b " 3\373"
+U+221c " 4\373"
+U+2299 "(\372)"
+U+229a "(\370)"
+U+22a1 "[\372]"
+U+02a4 "d\235"
+U+2249 "!\367"
diff --git a/src/chrtrans/cp775_uni.tbl b/src/chrtrans/cp775_uni.tbl
new file mode 100644
index 0000000..26a3ff7
--- /dev/null
+++ b/src/chrtrans/cp775_uni.tbl
@@ -0,0 +1,159 @@
+# This file has been modified for lynx (see README.tables)
+
+#The MIME name of this charset.
+Mcp775
+
+#Name as a Display Charset (used on Options screen)
+OBaltic Rim (cp775)
+
+#Codepage number
+C775
+
+# Name: cp775_DOSBaltRim to Unicode table
+# Unicode version: 2.0
+# Table version: 2.00
+# Table format: Format A
+# Date: 04/24/96
+# Authors: Lori Brownell <loribr@microsoft.com>
+# K.D. Chang <a-kchang@microsoft.com>
+# General notes: none
+#
+# Format: Three tab-separated columns
+# Column #1 is the cp775_DOSBaltRim code (in hex)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 is the Unicode name (follows a comment sign, '#')
+#
+# The entries are in cp775_DOSBaltRim order
+#
+##################
+
+0x20-0x7e idem
+#
+0x80 U+0106 #LATIN CAPITAL LETTER C WITH ACUTE
+0x81 U+00fc #LATIN SMALL LETTER U WITH DIAERESIS
+0x82 U+00e9 #LATIN SMALL LETTER E WITH ACUTE
+0x83 U+0101 #LATIN SMALL LETTER A WITH MACRON
+0x84 U+00e4 #LATIN SMALL LETTER A WITH DIAERESIS
+0x85 U+0123 #LATIN SMALL LETTER G WITH CEDILLA
+0x86 U+00e5 #LATIN SMALL LETTER A WITH RING ABOVE
+0x87 U+0107 #LATIN SMALL LETTER C WITH ACUTE
+0x88 U+0142 #LATIN SMALL LETTER L WITH STROKE
+0x89 U+0113 #LATIN SMALL LETTER E WITH MACRON
+0x8a U+0156 #LATIN CAPITAL LETTER R WITH CEDILLA
+0x8b U+0157 #LATIN SMALL LETTER R WITH CEDILLA
+0x8c U+012b #LATIN SMALL LETTER I WITH MACRON
+0x8d U+0179 #LATIN CAPITAL LETTER Z WITH ACUTE
+0x8e U+00c4 #LATIN CAPITAL LETTER A WITH DIAERESIS
+0x8f U+00c5 #LATIN CAPITAL LETTER A WITH RING ABOVE
+0x90 U+00c9 #LATIN CAPITAL LETTER E WITH ACUTE
+0x91 U+00e6 #LATIN SMALL LIGATURE AE
+0x92 U+00c6 #LATIN CAPITAL LIGATURE AE
+0x93 U+014d #LATIN SMALL LETTER O WITH MACRON
+0x94 U+00f6 #LATIN SMALL LETTER O WITH DIAERESIS
+0x95 U+0122 #LATIN CAPITAL LETTER G WITH CEDILLA
+0x96 U+00a2 #CENT SIGN
+0x97 U+015a #LATIN CAPITAL LETTER S WITH ACUTE
+0x98 U+015b #LATIN SMALL LETTER S WITH ACUTE
+0x99 U+00d6 #LATIN CAPITAL LETTER O WITH DIAERESIS
+0x9a U+00dc #LATIN CAPITAL LETTER U WITH DIAERESIS
+0x9b U+00f8 #LATIN SMALL LETTER O WITH STROKE
+0x9c U+00a3 #POUND SIGN
+0x9d U+00d8 #LATIN CAPITAL LETTER O WITH STROKE
+0x9e U+00d7 #MULTIPLICATION SIGN
+0x9f U+00a4 #CURRENCY SIGN
+0xa0 U+0100 #LATIN CAPITAL LETTER A WITH MACRON
+0xa1 U+012a #LATIN CAPITAL LETTER I WITH MACRON
+0xa2 U+00f3 #LATIN SMALL LETTER O WITH ACUTE
+0xa3 U+017b #LATIN CAPITAL LETTER Z WITH DOT ABOVE
+0xa4 U+017c #LATIN SMALL LETTER Z WITH DOT ABOVE
+0xa5 U+017a #LATIN SMALL LETTER Z WITH ACUTE
+0xa6 U+201d #RIGHT DOUBLE QUOTATION MARK
+0xa7 U+00a6 #BROKEN BAR
+0xa8 U+00a9 #COPYRIGHT SIGN
+0xa9 U+00ae #REGISTERED SIGN
+0xaa U+00ac #NOT SIGN
+0xab U+00bd #VULGAR FRACTION ONE HALF
+0xac U+00bc #VULGAR FRACTION ONE QUARTER
+0xad U+0141 #LATIN CAPITAL LETTER L WITH STROKE
+0xae U+00ab #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xaf U+00bb #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xb0 U+2591 #LIGHT SHADE
+0xb1 U+2592 #MEDIUM SHADE
+0xb2 U+2593 #DARK SHADE
+0xb3 U+2502 #BOX DRAWINGS LIGHT VERTICAL
+0xb4 U+2524 #BOX DRAWINGS LIGHT VERTICAL AND LEFT
+0xb5 U+0104 #LATIN CAPITAL LETTER A WITH OGONEK
+0xb6 U+010c #LATIN CAPITAL LETTER C WITH CARON
+0xb7 U+0118 #LATIN CAPITAL LETTER E WITH OGONEK
+0xb8 U+0116 #LATIN CAPITAL LETTER E WITH DOT ABOVE
+0xb9 U+2563 #BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+0xba U+2551 #BOX DRAWINGS DOUBLE VERTICAL
+0xbb U+2557 #BOX DRAWINGS DOUBLE DOWN AND LEFT
+0xbc U+255d #BOX DRAWINGS DOUBLE UP AND LEFT
+0xbd U+012e #LATIN CAPITAL LETTER I WITH OGONEK
+0xbe U+0160 #LATIN CAPITAL LETTER S WITH CARON
+0xbf U+2510 #BOX DRAWINGS LIGHT DOWN AND LEFT
+0xc0 U+2514 #BOX DRAWINGS LIGHT UP AND RIGHT
+0xc1 U+2534 #BOX DRAWINGS LIGHT UP AND HORIZONTAL
+0xc2 U+252c #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+0xc3 U+251c #BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+0xc4 U+2500 #BOX DRAWINGS LIGHT HORIZONTAL
+0xc5 U+253c #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+0xc6 U+0172 #LATIN CAPITAL LETTER U WITH OGONEK
+0xc7 U+016a #LATIN CAPITAL LETTER U WITH MACRON
+0xc8 U+255a #BOX DRAWINGS DOUBLE UP AND RIGHT
+0xc9 U+2554 #BOX DRAWINGS DOUBLE DOWN AND RIGHT
+0xca U+2569 #BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+0xcb U+2566 #BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+0xcc U+2560 #BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+0xcd U+2550 #BOX DRAWINGS DOUBLE HORIZONTAL
+0xce U+256c #BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+0xcf U+017d #LATIN CAPITAL LETTER Z WITH CARON
+0xd0 U+0105 #LATIN SMALL LETTER A WITH OGONEK
+0xd1 U+010d #LATIN SMALL LETTER C WITH CARON
+0xd2 U+0119 #LATIN SMALL LETTER E WITH OGONEK
+0xd3 U+0117 #LATIN SMALL LETTER E WITH DOT ABOVE
+0xd4 U+012f #LATIN SMALL LETTER I WITH OGONEK
+0xd5 U+0161 #LATIN SMALL LETTER S WITH CARON
+0xd6 U+0173 #LATIN SMALL LETTER U WITH OGONEK
+0xd7 U+016b #LATIN SMALL LETTER U WITH MACRON
+0xd8 U+017e #LATIN SMALL LETTER Z WITH CARON
+0xd9 U+2518 #BOX DRAWINGS LIGHT UP AND LEFT
+0xda U+250c #BOX DRAWINGS LIGHT DOWN AND RIGHT
+0xdb U+2588 #FULL BLOCK
+0xdc U+2584 #LOWER HALF BLOCK
+0xdd U+258c #LEFT HALF BLOCK
+0xde U+2590 #RIGHT HALF BLOCK
+0xdf U+2580 #UPPER HALF BLOCK
+0xe0 U+00d3 #LATIN CAPITAL LETTER O WITH ACUTE
+0xe1 U+00df #LATIN SMALL LETTER SHARP S (GERMAN)
+0xe2 U+014c #LATIN CAPITAL LETTER O WITH MACRON
+0xe3 U+0143 #LATIN CAPITAL LETTER N WITH ACUTE
+0xe4 U+00f5 #LATIN SMALL LETTER O WITH TILDE
+0xe5 U+00d5 #LATIN CAPITAL LETTER O WITH TILDE
+0xe6 U+00b5 #MICRO SIGN
+0xe7 U+0144 #LATIN SMALL LETTER N WITH ACUTE
+0xe8 U+0136 #LATIN CAPITAL LETTER K WITH CEDILLA
+0xe9 U+0137 #LATIN SMALL LETTER K WITH CEDILLA
+0xea U+013b #LATIN CAPITAL LETTER L WITH CEDILLA
+0xeb U+013c #LATIN SMALL LETTER L WITH CEDILLA
+0xec U+0146 #LATIN SMALL LETTER N WITH CEDILLA
+0xed U+0112 #LATIN CAPITAL LETTER E WITH MACRON
+0xee U+0145 #LATIN CAPITAL LETTER N WITH CEDILLA
+0xef U+2019 #RIGHT SINGLE QUOTATION MARK
+0xf0 U+00ad #SOFT HYPHEN
+0xf1 U+00b1 #PLUS-MINUS SIGN
+0xf2 U+201c #LEFT DOUBLE QUOTATION MARK
+0xf3 U+00be #VULGAR FRACTION THREE QUARTERS
+0xf4 U+00b6 #PILCROW SIGN
+0xf5 U+00a7 #SECTION SIGN
+0xf6 U+00f7 #DIVISION SIGN
+0xf7 U+201e #DOUBLE LOW-9 QUOTATION MARK
+0xf8 U+00b0 #DEGREE SIGN
+0xf9 U+2219 #BULLET OPERATOR
+0xfa U+00b7 #MIDDLE DOT
+0xfb U+00b9 #SUPERSCRIPT ONE
+0xfc U+00b3 #SUPERSCRIPT THREE
+0xfd U+00b2 #SUPERSCRIPT TWO
+0xfe U+25a0 #BLACK SQUARE
+0xff U+00a0 #NO-BREAK SPACE
diff --git a/src/chrtrans/cp850_uni.tbl b/src/chrtrans/cp850_uni.tbl
new file mode 100644
index 0000000..9d05af2
--- /dev/null
+++ b/src/chrtrans/cp850_uni.tbl
@@ -0,0 +1,177 @@
+# This file has been modified for lynx (see README.tables)
+
+#Shall this become the "default" translation?
+#Meaning of that is currently unclear... It's different
+#from the default input or default output charset...
+#but there has to be exactly one table marked as "default".
+D0
+#
+#The MIME name of this charset.
+Mcp850
+
+#Name as a Display Charset (used on Options screen)
+OWestern (cp850)
+
+#Codepage number
+C850
+
+#
+# Name: cp850_DOSLatin1 to Unicode table
+# Unicode version: 2.0
+# Table version: 2.00
+# Table format: Format A
+# Date: 04/24/96
+# Authors: Lori Brownell <loribr@microsoft.com>
+# K.D. Chang <a-kchang@microsoft.com>
+# General notes: none
+#
+# Format: Three tab-separated columns
+# Column #1 is the cp850_DOSLatin1 code (in hex)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 is the Unicode name (follows a comment sign, '#')
+#
+# The entries are in cp850_DOSLatin1 order
+#
+##################
+# Lines with more than one Unicode (U+XXXX) value contain additional
+# replacement mappings added for lynx. - kw
+
+0x20-0x7e idem
+#
+0x80 U+00c7 #LATIN CAPITAL LETTER C WITH CEDILLA
+0x81 U+00fc U+03cb #LATIN SMALL LETTER U WITH DIAERESIS
+0x82 U+00e9 U+03ad #LATIN SMALL LETTER E WITH ACUTE
+0x83 U+00e2 #LATIN SMALL LETTER A WITH CIRCUMFLEX
+0x84 U+00e4 #LATIN SMALL LETTER A WITH DIAERESIS
+0x85 U+00e0 #LATIN SMALL LETTER A WITH GRAVE
+0x86 U+00e5 #LATIN SMALL LETTER A WITH RING ABOVE
+0x87 U+00e7 #LATIN SMALL LETTER C WITH CEDILLA
+0x88 U+00ea #LATIN SMALL LETTER E WITH CIRCUMFLEX
+0x89 U+00eb #LATIN SMALL LETTER E WITH DIAERESIS
+0x8a U+00e8 #LATIN SMALL LETTER E WITH GRAVE
+0x8b U+00ef U+03ca #LATIN SMALL LETTER I WITH DIAERESIS
+0x8c U+00ee #LATIN SMALL LETTER I WITH CIRCUMFLEX
+0x8d U+00ec #LATIN SMALL LETTER I WITH GRAVE
+0x8e U+00c4 #LATIN CAPITAL LETTER A WITH DIAERESIS
+0x8f U+00c5 #LATIN CAPITAL LETTER A WITH RING ABOVE
+0x90 U+00c9 U+0388 #LATIN CAPITAL LETTER E WITH ACUTE
+0x91 U+00e6 #LATIN SMALL LIGATURE AE
+0x92 U+00c6 #LATIN CAPITAL LIGATURE AE
+0x93 U+00f4 #LATIN SMALL LETTER O WITH CIRCUMFLEX
+0x94 U+00f6 #LATIN SMALL LETTER O WITH DIAERESIS
+0x95 U+00f2 #LATIN SMALL LETTER O WITH GRAVE
+0x96 U+00fb #LATIN SMALL LETTER U WITH CIRCUMFLEX
+0x97 U+00f9 #LATIN SMALL LETTER U WITH GRAVE
+0x98 U+00ff #LATIN SMALL LETTER Y WITH DIAERESIS
+0x99 U+00d6 #LATIN CAPITAL LETTER O WITH DIAERESIS
+0x9a U+00dc U+03ab #LATIN CAPITAL LETTER U WITH DIAERESIS
+0x9b U+00f8 #LATIN SMALL LETTER O WITH STROKE
+0x9c U+00a3 #POUND SIGN
+0x9d U+00d8 #LATIN CAPITAL LETTER O WITH STROKE
+0x9e U+00d7 #MULTIPLICATION SIGN
+0x9f U+0192 #LATIN SMALL LETTER F WITH HOOK
+0xa0 U+00e1 U+03ac #LATIN SMALL LETTER A WITH ACUTE
+0xa1 U+00ed U+03af #LATIN SMALL LETTER I WITH ACUTE
+0xa2 U+00f3 U+03cc #LATIN SMALL LETTER O WITH ACUTE
+0xa3 U+00fa U+03cd #LATIN SMALL LETTER U WITH ACUTE
+0xa4 U+00f1 #LATIN SMALL LETTER N WITH TILDE
+0xa5 U+00d1 #LATIN CAPITAL LETTER N WITH TILDE
+0xa6 U+00aa #FEMININE ORDINAL INDICATOR
+0xa7 U+00ba #MASCULINE ORDINAL INDICATOR
+0xa8 U+00bf #INVERTED QUESTION MARK
+0xa9 U+00ae #REGISTERED SIGN
+0xaa U+00ac #NOT SIGN
+0xab U+00bd #VULGAR FRACTION ONE HALF
+0xac U+00bc #VULGAR FRACTION ONE QUARTER
+0xad U+00a1 #INVERTED EXCLAMATION MARK
+0xae U+00ab #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xaf U+00bb #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xb0 U+2591 #LIGHT SHADE
+0xb1 U+2592 #MEDIUM SHADE
+0xb2 U+2593 #DARK SHADE
+0xb3 U+2502 #BOX DRAWINGS LIGHT VERTICAL
+0xb4 U+2524 #BOX DRAWINGS LIGHT VERTICAL AND LEFT
+0xb5 U+00c1 U+0386 #LATIN CAPITAL LETTER A WITH ACUTE
+0xb6 U+00c2 #LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0xb7 U+00c0 #LATIN CAPITAL LETTER A WITH GRAVE
+0xb8 U+00a9 #COPYRIGHT SIGN
+0xb9 U+2563 #BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+0xba U+2551 #BOX DRAWINGS DOUBLE VERTICAL
+0xbb U+2557 #BOX DRAWINGS DOUBLE DOWN AND LEFT
+0xbc U+255d #BOX DRAWINGS DOUBLE UP AND LEFT
+0xbd U+00a2 #CENT SIGN
+0xbe U+00a5 #YEN SIGN
+0xbf U+2510 #BOX DRAWINGS LIGHT DOWN AND LEFT
+0xc0 U+2514 #BOX DRAWINGS LIGHT UP AND RIGHT
+0xc1 U+2534 #BOX DRAWINGS LIGHT UP AND HORIZONTAL
+0xc2 U+252c #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+0xc3 U+251c #BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+0xc4 U+2500 #BOX DRAWINGS LIGHT HORIZONTAL
+0xc5 U+253c #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+0xc6 U+00e3 #LATIN SMALL LETTER A WITH TILDE
+0xc7 U+00c3 #LATIN CAPITAL LETTER A WITH TILDE
+0xc8 U+255a #BOX DRAWINGS DOUBLE UP AND RIGHT
+0xc9 U+2554 #BOX DRAWINGS DOUBLE DOWN AND RIGHT
+0xca U+2569 #BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+0xcb U+2566 #BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+0xcc U+2560 #BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+0xcd U+2550 #BOX DRAWINGS DOUBLE HORIZONTAL
+0xce U+256c #BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+0xcf U+00a4 #CURRENCY SIGN
+0xd0 U+00f0 #LATIN SMALL LETTER ETH
+0xd1 U+00d0 #LATIN CAPITAL LETTER ETH
+0xd2 U+00ca #LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+0xd3 U+00cb #LATIN CAPITAL LETTER E WITH DIAERESIS
+0xd4 U+00c8 #LATIN CAPITAL LETTER E WITH GRAVE
+0xd5 U+0131 U+03b9 #LATIN SMALL LETTER DOTLESS I
+0xd6 U+00cd U+038a #LATIN CAPITAL LETTER I WITH ACUTE
+0xd7 U+00ce #LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0xd8 U+00cf U+03aa #LATIN CAPITAL LETTER I WITH DIAERESIS
+0xd9 U+2518 #BOX DRAWINGS LIGHT UP AND LEFT
+0xda U+250c #BOX DRAWINGS LIGHT DOWN AND RIGHT
+0xdb U+2588 #FULL BLOCK
+0xdc U+2584 #LOWER HALF BLOCK
+0xdd U+00a6 #BROKEN BAR
+0xde U+00cc #LATIN CAPITAL LETTER I WITH GRAVE
+0xdf U+2580 #UPPER HALF BLOCK
+0xe0 U+00d3 U+038c #LATIN CAPITAL LETTER O WITH ACUTE
+0xe1 U+00df #LATIN SMALL LETTER SHARP S
+0xe2 U+00d4 #LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0xe3 U+00d2 #LATIN CAPITAL LETTER O WITH GRAVE
+0xe4 U+00f5 #LATIN SMALL LETTER O WITH TILDE
+0xe5 U+00d5 #LATIN CAPITAL LETTER O WITH TILDE
+0xe6 U+00b5 U+03bc #MICRO SIGN
+0xe7 U+00fe #LATIN SMALL LETTER THORN
+0xe8 U+00de #LATIN CAPITAL LETTER THORN
+0xe9 U+00da #LATIN CAPITAL LETTER U WITH ACUTE
+0xea U+00db #LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+0xeb U+00d9 #LATIN CAPITAL LETTER U WITH GRAVE
+0xec U+00fd #LATIN SMALL LETTER Y WITH ACUTE
+0xed U+00dd #LATIN CAPITAL LETTER Y WITH ACUTE
+0xee U+00af U+0304 #MACRON
+0xef U+00b4 U+0301 #ACUTE ACCENT
+0xf0 U+00ad #SOFT HYPHEN
+0xf1 U+00b1 #PLUS-MINUS SIGN
+0xf2 U+2017 U+0333 #DOUBLE LOW LINE
+0xf3 U+00be #VULGAR FRACTION THREE QUARTERS
+0xf4 U+00b6 #PILCROW SIGN
+0xf5 U+00a7 #SECTION SIGN
+0xf6 U+00f7 #DIVISION SIGN
+0xf7 U+00b8 U+0327 #CEDILLA
+0xf8 U+00b0 U+030a #DEGREE SIGN
+0xf9 U+00a8 U+0308 #DIAERESIS
+0xfa U+00b7 U+0307 U+0387 U+2027 #MIDDLE DOT
+0xfb U+00b9 #SUPERSCRIPT ONE
+0xfc U+00b3 #SUPERSCRIPT THREE
+0xfd U+00b2 #SUPERSCRIPT TWO
+0xfe U+25a0 #BLACK SQUARE
+0xff U+00a0 #NO-BREAK SPACE
+
+U+2218 " \370 " # RING OPERATOR
+U+221b " ROOT\374 "
+U+2297 "(\236)" # CIRCLED TIMES
+U+2299 "(\372)" # CIRCLED DOT OPERATOR
+U+229A "(\370)" # CIRCLED RING OPERATOR
+U+22A0 "[\236]" # SQUARED TIMES
+U+22A1 "[\372]" # SQUARED DOT OPERATOR
+U+22C5 " \372 " # DOT OPERATOR
diff --git a/src/chrtrans/cp852_uni.tbl b/src/chrtrans/cp852_uni.tbl
new file mode 100644
index 0000000..978cca4
--- /dev/null
+++ b/src/chrtrans/cp852_uni.tbl
@@ -0,0 +1,170 @@
+# This file has been modified for lynx (see README.tables)
+
+#The MIME name of this charset.
+Mcp852
+
+#Name as a Display Charset (used on Options screen)
+OEastern European (cp852)
+
+#Codepage number
+C852
+
+#
+# Name: cp852_DOSLatin2 to Unicode table
+# Unicode version: 2.0
+# Table version: 2.00
+# Table format: Format A
+# Date: 04/24/96
+# Authors: Lori Brownell <loribr@microsoft.com>
+# K.D. Chang <a-kchang@microsoft.com>
+# General notes: none
+#
+# Format: Three tab-separated columns
+# Column #1 is the cp852_DOSLatin2 code (in hex)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 is the Unicode name (follows a comment sign, '#')
+#
+# The entries are in cp852_DOSLatin2 order
+#
+##################
+# Lines with more than one Unicode (U+XXXX) value contain additional
+# replacement mappings added for lynx. - kw
+
+0x20-0x7e idem
+#
+0x80 U+00c7 #LATIN CAPITAL LETTER C WITH CEDILLA
+0x81 U+00fc U+03cb #LATIN SMALL LETTER U WITH DIAERESIS
+0x82 U+00e9 U+03ad #LATIN SMALL LETTER E WITH ACUTE
+0x83 U+00e2 #LATIN SMALL LETTER A WITH CIRCUMFLEX
+0x84 U+00e4 #LATIN SMALL LETTER A WITH DIAERESIS
+0x85 U+016f #LATIN SMALL LETTER U WITH RING ABOVE
+0x86 U+0107 #LATIN SMALL LETTER C WITH ACUTE
+0x87 U+00e7 #LATIN SMALL LETTER C WITH CEDILLA
+0x88 U+0142 #LATIN SMALL LETTER L WITH STROKE
+0x89 U+00eb #LATIN SMALL LETTER E WITH DIAERESIS
+0x8a U+0150 #LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+0x8b U+0151 #LATIN SMALL LETTER O WITH DOUBLE ACUTE
+0x8c U+00ee #LATIN SMALL LETTER I WITH CIRCUMFLEX
+0x8d U+0179 #LATIN CAPITAL LETTER Z WITH ACUTE
+0x8e U+00c4 #LATIN CAPITAL LETTER A WITH DIAERESIS
+0x8f U+0106 #LATIN CAPITAL LETTER C WITH ACUTE
+0x90 U+00c9 U+0388 #LATIN CAPITAL LETTER E WITH ACUTE
+0x91 U+0139 #LATIN CAPITAL LETTER L WITH ACUTE
+0x92 U+013a #LATIN SMALL LETTER L WITH ACUTE
+0x93 U+00f4 #LATIN SMALL LETTER O WITH CIRCUMFLEX
+0x94 U+00f6 #LATIN SMALL LETTER O WITH DIAERESIS
+0x95 U+013d #LATIN CAPITAL LETTER L WITH CARON
+0x96 U+013e #LATIN SMALL LETTER L WITH CARON
+0x97 U+015a #LATIN CAPITAL LETTER S WITH ACUTE
+0x98 U+015b #LATIN SMALL LETTER S WITH ACUTE
+0x99 U+00d6 #LATIN CAPITAL LETTER O WITH DIAERESIS
+0x9a U+00dc U+03ab #LATIN CAPITAL LETTER U WITH DIAERESIS
+0x9b U+0164 #LATIN CAPITAL LETTER T WITH CARON
+0x9c U+0165 #LATIN SMALL LETTER T WITH CARON
+0x9d U+0141 #LATIN CAPITAL LETTER L WITH STROKE
+0x9e U+00d7 #MULTIPLICATION SIGN
+0x9f U+010d U+02a7 U+0447 #LATIN SMALL LETTER C WITH CARON
+0xa0 U+00e1 U+03ac #LATIN SMALL LETTER A WITH ACUTE
+0xa1 U+00ed U+03af #LATIN SMALL LETTER I WITH ACUTE
+0xa2 U+00f3 U+03cc #LATIN SMALL LETTER O WITH ACUTE
+0xa3 U+00fa U+03cd #LATIN SMALL LETTER U WITH ACUTE
+0xa4 U+0104 #LATIN CAPITAL LETTER A WITH OGONEK
+0xa5 U+0105 #LATIN SMALL LETTER A WITH OGONEK
+0xa6 U+017d U+0416 #LATIN CAPITAL LETTER Z WITH CARON
+0xa7 U+017e U+0436 #LATIN SMALL LETTER Z WITH CARON
+0xa8 U+0118 #LATIN CAPITAL LETTER E WITH OGONEK
+0xa9 U+0119 #LATIN SMALL LETTER E WITH OGONEK
+0xaa U+00ac #NOT SIGN
+0xab U+017a #LATIN SMALL LETTER Z WITH ACUTE
+0xac U+010c U+0427 #LATIN CAPITAL LETTER C WITH CARON
+0xad U+015f #LATIN SMALL LETTER S WITH CEDILLA
+0xae U+00ab #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xaf U+00bb #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xb0 U+2591 #LIGHT SHADE
+0xb1 U+2592 #MEDIUM SHADE
+0xb2 U+2593 #DARK SHADE
+0xb3 U+2502 #BOX DRAWINGS LIGHT VERTICAL
+0xb4 U+2524 #BOX DRAWINGS LIGHT VERTICAL AND LEFT
+0xb5 U+00c1 U+0386 #LATIN CAPITAL LETTER A WITH ACUTE
+0xb6 U+00c2 #LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0xb7 U+011a #LATIN CAPITAL LETTER E WITH CARON
+0xb8 U+015e #LATIN CAPITAL LETTER S WITH CEDILLA
+0xb9 U+2563 #BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+0xba U+2551 #BOX DRAWINGS DOUBLE VERTICAL
+0xbb U+2557 #BOX DRAWINGS DOUBLE DOWN AND LEFT
+0xbc U+255d #BOX DRAWINGS DOUBLE UP AND LEFT
+0xbd U+017b #LATIN CAPITAL LETTER Z WITH DOT ABOVE
+0xbe U+017c #LATIN SMALL LETTER Z WITH DOT ABOVE
+0xbf U+2510 #BOX DRAWINGS LIGHT DOWN AND LEFT
+0xc0 U+2514 #BOX DRAWINGS LIGHT UP AND RIGHT
+0xc1 U+2534 #BOX DRAWINGS LIGHT UP AND HORIZONTAL
+0xc2 U+252c #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+0xc3 U+251c #BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+0xc4 U+2500 #BOX DRAWINGS LIGHT HORIZONTAL
+0xc5 U+253c #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+0xc6 U+0102 #LATIN CAPITAL LETTER A WITH BREVE
+0xc7 U+0103 #LATIN SMALL LETTER A WITH BREVE
+0xc8 U+255a #BOX DRAWINGS DOUBLE UP AND RIGHT
+0xc9 U+2554 #BOX DRAWINGS DOUBLE DOWN AND RIGHT
+0xca U+2569 #BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+0xcb U+2566 #BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+0xcc U+2560 #BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+0xcd U+2550 #BOX DRAWINGS DOUBLE HORIZONTAL
+0xce U+256c #BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+0xcf U+00a4 #CURRENCY SIGN
+0xd0 U+0111 #LATIN SMALL LETTER D WITH STROKE
+0xd1 U+0110 #LATIN CAPITAL LETTER D WITH STROKE
+0xd2 U+010e #LATIN CAPITAL LETTER D WITH CARON
+0xd3 U+00cb #LATIN CAPITAL LETTER E WITH DIAERESIS
+0xd4 U+010f #LATIN SMALL LETTER D WITH CARON
+0xd5 U+0147 #LATIN CAPITAL LETTER N WITH CARON
+0xd6 U+00cd U+038a #LATIN CAPITAL LETTER I WITH ACUTE
+0xd7 U+00ce #LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0xd8 U+011b #LATIN SMALL LETTER E WITH CARON
+0xd9 U+2518 #BOX DRAWINGS LIGHT UP AND LEFT
+0xda U+250c #BOX DRAWINGS LIGHT DOWN AND RIGHT
+0xdb U+2588 #FULL BLOCK
+0xdc U+2584 #LOWER HALF BLOCK
+0xdd U+0162 #LATIN CAPITAL LETTER T WITH CEDILLA
+0xde U+016e #LATIN CAPITAL LETTER U WITH RING ABOVE
+0xdf U+2580 #UPPER HALF BLOCK
+0xe0 U+00d3 U+038c #LATIN CAPITAL LETTER O WITH ACUTE
+0xe1 U+00df #LATIN SMALL LETTER SHARP S
+0xe2 U+00d4 #LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0xe3 U+0143 #LATIN CAPITAL LETTER N WITH ACUTE
+0xe4 U+0144 #LATIN SMALL LETTER N WITH ACUTE
+0xe5 U+0148 #LATIN SMALL LETTER N WITH CARON
+0xe6 U+0160 U+0428 #LATIN CAPITAL LETTER S WITH CARON
+0xe7 U+0161 U+0448 #LATIN SMALL LETTER S WITH CARON
+0xe8 U+0154 #LATIN CAPITAL LETTER R WITH ACUTE
+0xe9 U+00da #LATIN CAPITAL LETTER U WITH ACUTE
+0xea U+0155 #LATIN SMALL LETTER R WITH ACUTE
+0xeb U+0170 #LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+0xec U+00fd #LATIN SMALL LETTER Y WITH ACUTE
+0xed U+00dd #LATIN CAPITAL LETTER Y WITH ACUTE
+0xee U+0163 #LATIN SMALL LETTER T WITH CEDILLA
+0xef U+00b4 U+0301 #ACUTE ACCENT
+0xf0 U+00ad #SOFT HYPHEN
+0xf1 U+02dd U+030b #DOUBLE ACUTE ACCENT
+0xf2 U+02db U+0328 #OGONEK
+0xf3 U+02c7 U+030c #CARON
+0xf4 U+02d8 U+0306 #BREVE
+0xf5 U+00a7 #SECTION SIGN
+0xf6 U+00f7 #DIVISION SIGN
+0xf7 U+00b8 U+0327 #CEDILLA
+0xf8 U+00b0 U+030a #DEGREE SIGN
+0xf9 U+00a8 U+0308 #DIAERESIS
+0xfa U+02d9 U+0307 U+0387 #DOT ABOVE
+0xfb U+0171 #LATIN SMALL LETTER U WITH DOUBLE ACUTE
+0xfc U+0158 #LATIN CAPITAL LETTER R WITH CARON
+0xfd U+0159 #LATIN SMALL LETTER R WITH CARON
+0xfe U+25a0 #BLACK SQUARE
+0xff U+00a0 #NO-BREAK SPACE
+
+U+2218 " \370 " # RING OPERATOR
+U+2297 "(\236)" # CIRCLED TIMES
+U+2299 "(\372)" # CIRCLED DOT OPERATOR
+U+229A "(\370)" # CIRCLED RING OPERATOR
+U+22A0 "[\236]" # SQUARED TIMES
+U+22A1 "[\372]" # SQUARED DOT OPERATOR
+U+22C5 " \372 " # DOT OPERATOR
diff --git a/src/chrtrans/cp857_uni.tbl b/src/chrtrans/cp857_uni.tbl
new file mode 100644
index 0000000..bd30996
--- /dev/null
+++ b/src/chrtrans/cp857_uni.tbl
@@ -0,0 +1,159 @@
+# This file has been modified for lynx (see README.tables)
+
+#The MIME name of this charset.
+Mcp857
+
+#Name as a Display Charset (used on Options screen).
+OTurkish (cp857)
+
+#Codepage number
+C857
+
+# Name: cp857_DOSTurkish to Unicode table
+# Unicode version: 2.0
+# Table version: 2.00
+# Table format: Format A
+# Date: 04/24/96
+# Authors: Lori Brownell <loribr@microsoft.com>
+# K.D. Chang <a-kchang@microsoft.com>
+# General notes: none
+#
+# Format: Three tab-separated columns
+# Column #1 is the cp857_DOSTurkish code (in hex)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 is the Unicode name (follows a comment sign, '#')
+#
+# The entries are in cp857_DOSTurkish order
+#
+##################
+
+0x20-0x7f idem
+
+0x80 U+00c7 #LATIN CAPITAL LETTER C WITH CEDILLA
+0x81 U+00fc #LATIN SMALL LETTER U WITH DIAERESIS
+0x82 U+00e9 #LATIN SMALL LETTER E WITH ACUTE
+0x83 U+00e2 #LATIN SMALL LETTER A WITH CIRCUMFLEX
+0x84 U+00e4 #LATIN SMALL LETTER A WITH DIAERESIS
+0x85 U+00e0 #LATIN SMALL LETTER A WITH GRAVE
+0x86 U+00e5 #LATIN SMALL LETTER A WITH RING ABOVE
+0x87 U+00e7 #LATIN SMALL LETTER C WITH CEDILLA
+0x88 U+00ea #LATIN SMALL LETTER E WITH CIRCUMFLEX
+0x89 U+00eb #LATIN SMALL LETTER E WITH DIAERESIS
+0x8a U+00e8 #LATIN SMALL LETTER E WITH GRAVE
+0x8b U+00ef #LATIN SMALL LETTER I WITH DIAERESIS
+0x8c U+00ee #LATIN SMALL LETTER I WITH CIRCUMFLEX
+0x8d U+0131 #LATIN SMALL LETTER DOTLESS I
+0x8e U+00c4 #LATIN CAPITAL LETTER A WITH DIAERESIS
+0x8f U+00c5 #LATIN CAPITAL LETTER A WITH RING ABOVE
+0x90 U+00c9 #LATIN CAPITAL LETTER E WITH ACUTE
+0x91 U+00e6 #LATIN SMALL LIGATURE AE
+0x92 U+00c6 #LATIN CAPITAL LIGATURE AE
+0x93 U+00f4 #LATIN SMALL LETTER O WITH CIRCUMFLEX
+0x94 U+00f6 #LATIN SMALL LETTER O WITH DIAERESIS
+0x95 U+00f2 #LATIN SMALL LETTER O WITH GRAVE
+0x96 U+00fb #LATIN SMALL LETTER U WITH CIRCUMFLEX
+0x97 U+00f9 #LATIN SMALL LETTER U WITH GRAVE
+0x98 U+0130 #LATIN CAPITAL LETTER I WITH DOT ABOVE
+0x99 U+00d6 #LATIN CAPITAL LETTER O WITH DIAERESIS
+0x9a U+00dc #LATIN CAPITAL LETTER U WITH DIAERESIS
+0x9b U+00f8 #LATIN SMALL LETTER O WITH STROKE
+0x9c U+00a3 #POUND SIGN
+0x9d U+00d8 #LATIN CAPITAL LETTER O WITH STROKE
+0x9e U+015e #LATIN CAPITAL LETTER S WITH CEDILLA
+0x9f U+015f #LATIN SMALL LETTER S WITH CEDILLA
+0xa0 U+00e1 #LATIN SMALL LETTER A WITH ACUTE
+0xa1 U+00ed #LATIN SMALL LETTER I WITH ACUTE
+0xa2 U+00f3 #LATIN SMALL LETTER O WITH ACUTE
+0xa3 U+00fa #LATIN SMALL LETTER U WITH ACUTE
+0xa4 U+00f1 #LATIN SMALL LETTER N WITH TILDE
+0xa5 U+00d1 #LATIN CAPITAL LETTER N WITH TILDE
+0xa6 U+011e #LATIN CAPITAL LETTER G WITH BREVE
+0xa7 U+011f #LATIN SMALL LETTER G WITH BREVE
+0xa8 U+00bf #INVERTED QUESTION MARK
+0xa9 U+00ae #REGISTERED SIGN
+0xaa U+00ac #NOT SIGN
+0xab U+00bd #VULGAR FRACTION ONE HALF
+0xac U+00bc #VULGAR FRACTION ONE QUARTER
+0xad U+00a1 #INVERTED EXCLAMATION MARK
+0xae U+00ab #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xaf U+00bb #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xb0 U+2591 #LIGHT SHADE
+0xb1 U+2592 #MEDIUM SHADE
+0xb2 U+2593 #DARK SHADE
+0xb3 U+2502 #BOX DRAWINGS LIGHT VERTICAL
+0xb4 U+2524 #BOX DRAWINGS LIGHT VERTICAL AND LEFT
+0xb5 U+00c1 #LATIN CAPITAL LETTER A WITH ACUTE
+0xb6 U+00c2 #LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0xb7 U+00c0 #LATIN CAPITAL LETTER A WITH GRAVE
+0xb8 U+00a9 #COPYRIGHT SIGN
+0xb9 U+2563 #BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+0xba U+2551 #BOX DRAWINGS DOUBLE VERTICAL
+0xbb U+2557 #BOX DRAWINGS DOUBLE DOWN AND LEFT
+0xbc U+255d #BOX DRAWINGS DOUBLE UP AND LEFT
+0xbd U+00a2 #CENT SIGN
+0xbe U+00a5 #YEN SIGN
+0xbf U+2510 #BOX DRAWINGS LIGHT DOWN AND LEFT
+0xc0 U+2514 #BOX DRAWINGS LIGHT UP AND RIGHT
+0xc1 U+2534 #BOX DRAWINGS LIGHT UP AND HORIZONTAL
+0xc2 U+252c #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+0xc3 U+251c #BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+0xc4 U+2500 #BOX DRAWINGS LIGHT HORIZONTAL
+0xc5 U+253c #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+0xc6 U+00e3 #LATIN SMALL LETTER A WITH TILDE
+0xc7 U+00c3 #LATIN CAPITAL LETTER A WITH TILDE
+0xc8 U+255a #BOX DRAWINGS DOUBLE UP AND RIGHT
+0xc9 U+2554 #BOX DRAWINGS DOUBLE DOWN AND RIGHT
+0xca U+2569 #BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+0xcb U+2566 #BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+0xcc U+2560 #BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+0xcd U+2550 #BOX DRAWINGS DOUBLE HORIZONTAL
+0xce U+256c #BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+0xcf U+00a4 #CURRENCY SIGN
+0xd0 U+00ba #MASCULINE ORDINAL INDICATOR
+0xd1 U+00aa #FEMININE ORDINAL INDICATOR
+0xd2 U+00ca #LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+0xd3 U+00cb #LATIN CAPITAL LETTER E WITH DIAERESIS
+0xd4 U+00c8 #LATIN CAPITAL LETTER E WITH GRAVE
+0xd5 #UNDEFINED
+0xd6 U+00cd #LATIN CAPITAL LETTER I WITH ACUTE
+0xd7 U+00ce #LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0xd8 U+00cf #LATIN CAPITAL LETTER I WITH DIAERESIS
+0xd9 U+2518 #BOX DRAWINGS LIGHT UP AND LEFT
+0xda U+250c #BOX DRAWINGS LIGHT DOWN AND RIGHT
+0xdb U+2588 #FULL BLOCK
+0xdc U+2584 #LOWER HALF BLOCK
+0xdd U+00a6 #BROKEN BAR
+0xde U+00cc #LATIN CAPITAL LETTER I WITH GRAVE
+0xdf U+2580 #UPPER HALF BLOCK
+0xe0 U+00d3 #LATIN CAPITAL LETTER O WITH ACUTE
+0xe1 U+00df #LATIN SMALL LETTER SHARP S
+0xe2 U+00d4 #LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0xe3 U+00d2 #LATIN CAPITAL LETTER O WITH GRAVE
+0xe4 U+00f5 #LATIN SMALL LETTER O WITH TILDE
+0xe5 U+00d5 #LATIN CAPITAL LETTER O WITH TILDE
+0xe6 U+00b5 #MICRO SIGN
+0xe7 #UNDEFINED
+0xe8 U+00d7 #MULTIPLICATION SIGN
+0xe9 U+00da #LATIN CAPITAL LETTER U WITH ACUTE
+0xea U+00db #LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+0xeb U+00d9 #LATIN CAPITAL LETTER U WITH GRAVE
+0xec U+00ec #LATIN SMALL LETTER I WITH GRAVE
+0xed U+00ff #LATIN SMALL LETTER Y WITH DIAERESIS
+0xee U+00af #MACRON
+0xef U+00b4 #ACUTE ACCENT
+0xf0 U+00ad #SOFT HYPHEN
+0xf1 U+00b1 #PLUS-MINUS SIGN
+0xf2 #UNDEFINED
+0xf3 U+00be #VULGAR FRACTION THREE QUARTERS
+0xf4 U+00b6 #PILCROW SIGN
+0xf5 U+00a7 #SECTION SIGN
+0xf6 U+00f7 #DIVISION SIGN
+0xf7 U+00b8 #CEDILLA
+0xf8 U+00b0 #DEGREE SIGN
+0xf9 U+00a8 #DIAERESIS
+0xfa U+00b7 #MIDDLE DOT
+0xfb U+00b9 #SUPERSCRIPT ONE
+0xfc U+00b3 #SUPERSCRIPT THREE
+0xfd U+00b2 #SUPERSCRIPT TWO
+0xfe U+25a0 #BLACK SQUARE
+0xff U+00a0 #NO-BREAK SPACE
diff --git a/src/chrtrans/cp862_uni.tbl b/src/chrtrans/cp862_uni.tbl
new file mode 100644
index 0000000..ebf1222
--- /dev/null
+++ b/src/chrtrans/cp862_uni.tbl
@@ -0,0 +1,160 @@
+# This file has been modified for lynx (see README.tables)
+
+#The MIME name of this charset.
+Mcp862
+
+#Name as a Display Charset (used on Options screen).
+OHebrew (cp862)
+
+#Codepage number
+C862
+
+# Name: cp862_DOSHebrew to Unicode table
+# Unicode version: 2.0
+# Table version: 2.00
+# Table format: Format A
+# Date: 04/24/96
+# Authors: Lori Brownell <loribr@microsoft.com>
+# K.D. Chang <a-kchang@microsoft.com>
+# General notes: none
+#
+# Format: Three tab-separated columns
+# Column #1 is the cp862_DOSHebrew code (in hex)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 is the Unicode name (follows a comment sign, '#')
+#
+# The entries are in cp862_DOSHebrew order
+#
+##################
+
+0x20-0x7f idem
+#
+0x80 U+05d0 #HEBREW LETTER ALEF
+0x81 U+05d1 #HEBREW LETTER BET
+0x82 U+05d2 #HEBREW LETTER GIMEL
+0x83 U+05d3 #HEBREW LETTER DALET
+0x84 U+05d4 #HEBREW LETTER HE
+0x85 U+05d5 #HEBREW LETTER VAV
+0x86 U+05d6 #HEBREW LETTER ZAYIN
+0x87 U+05d7 #HEBREW LETTER HET
+0x88 U+05d8 #HEBREW LETTER TET
+0x89 U+05d9 #HEBREW LETTER YOD
+0x8a U+05da #HEBREW LETTER FINAL KAF
+0x8b U+05db #HEBREW LETTER KAF
+0x8c U+05dc #HEBREW LETTER LAMED
+0x8d U+05dd #HEBREW LETTER FINAL MEM
+0x8e U+05de #HEBREW LETTER MEM
+0x8f U+05df #HEBREW LETTER FINAL NUN
+0x90 U+05e0 #HEBREW LETTER NUN
+0x91 U+05e1 #HEBREW LETTER SAMEKH
+0x92 U+05e2 #HEBREW LETTER AYIN
+0x93 U+05e3 #HEBREW LETTER FINAL PE
+0x94 U+05e4 #HEBREW LETTER PE
+0x95 U+05e5 #HEBREW LETTER FINAL TSADI
+0x96 U+05e6 #HEBREW LETTER TSADI
+0x97 U+05e7 #HEBREW LETTER QOF
+0x98 U+05e8 #HEBREW LETTER RESH
+0x99 U+05e9 #HEBREW LETTER SHIN
+0x9a U+05ea #HEBREW LETTER TAV
+0x9b U+00a2 #CENT SIGN
+0x9c U+00a3 #POUND SIGN
+0x9d U+00a5 #YEN SIGN
+0x9e U+20a7 #PESETA SIGN
+0x9f U+0192 #LATIN SMALL LETTER F WITH HOOK
+0xa0 U+00e1 #LATIN SMALL LETTER A WITH ACUTE
+0xa1 U+00ed #LATIN SMALL LETTER I WITH ACUTE
+0xa2 U+00f3 #LATIN SMALL LETTER O WITH ACUTE
+0xa3 U+00fa #LATIN SMALL LETTER U WITH ACUTE
+0xa4 U+00f1 #LATIN SMALL LETTER N WITH TILDE
+0xa5 U+00d1 #LATIN CAPITAL LETTER N WITH TILDE
+0xa6 U+00aa #FEMININE ORDINAL INDICATOR
+0xa7 U+00ba #MASCULINE ORDINAL INDICATOR
+0xa8 U+00bf #INVERTED QUESTION MARK
+0xa9 U+2310 #REVERSED NOT SIGN
+0xaa U+00ac #NOT SIGN
+0xab U+00bd #VULGAR FRACTION ONE HALF
+0xac U+00bc #VULGAR FRACTION ONE QUARTER
+0xad U+00a1 #INVERTED EXCLAMATION MARK
+0xae U+00ab #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xaf U+00bb #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xb0 U+2591 #LIGHT SHADE
+0xb1 U+2592 #MEDIUM SHADE
+0xb2 U+2593 #DARK SHADE
+0xb3 U+2502 #BOX DRAWINGS LIGHT VERTICAL
+0xb4 U+2524 #BOX DRAWINGS LIGHT VERTICAL AND LEFT
+0xb5 U+2561 #BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+0xb6 U+2562 #BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
+0xb7 U+2556 #BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
+0xb8 U+2555 #BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
+0xb9 U+2563 #BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+0xba U+2551 #BOX DRAWINGS DOUBLE VERTICAL
+0xbb U+2557 #BOX DRAWINGS DOUBLE DOWN AND LEFT
+0xbc U+255d #BOX DRAWINGS DOUBLE UP AND LEFT
+0xbd U+255c #BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
+0xbe U+255b #BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+0xbf U+2510 #BOX DRAWINGS LIGHT DOWN AND LEFT
+0xc0 U+2514 #BOX DRAWINGS LIGHT UP AND RIGHT
+0xc1 U+2534 #BOX DRAWINGS LIGHT UP AND HORIZONTAL
+0xc2 U+252c #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+0xc3 U+251c #BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+0xc4 U+2500 #BOX DRAWINGS LIGHT HORIZONTAL
+0xc5 U+253c #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+0xc6 U+255e #BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+0xc7 U+255f #BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+0xc8 U+255a #BOX DRAWINGS DOUBLE UP AND RIGHT
+0xc9 U+2554 #BOX DRAWINGS DOUBLE DOWN AND RIGHT
+0xca U+2569 #BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+0xcb U+2566 #BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+0xcc U+2560 #BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+0xcd U+2550 #BOX DRAWINGS DOUBLE HORIZONTAL
+0xce U+256c #BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+0xcf U+2567 #BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+0xd0 U+2568 #BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+0xd1 U+2564 #BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
+0xd2 U+2565 #BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
+0xd3 U+2559 #BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+0xd4 U+2558 #BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+0xd5 U+2552 #BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+0xd6 U+2553 #BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
+0xd7 U+256b #BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
+0xd8 U+256a #BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+0xd9 U+2518 #BOX DRAWINGS LIGHT UP AND LEFT
+0xda U+250c #BOX DRAWINGS LIGHT DOWN AND RIGHT
+0xdb U+2588 #FULL BLOCK
+0xdc U+2584 #LOWER HALF BLOCK
+0xdd U+258c #LEFT HALF BLOCK
+0xde U+2590 #RIGHT HALF BLOCK
+0xdf U+2580 #UPPER HALF BLOCK
+0xe0 U+03b1 #GREEK SMALL LETTER ALPHA
+0xe1 U+00df #LATIN SMALL LETTER SHARP S (GERMAN)
+0xe2 U+0393 #GREEK CAPITAL LETTER GAMMA
+0xe3 U+03c0 #GREEK SMALL LETTER PI
+0xe4 U+03a3 #GREEK CAPITAL LETTER SIGMA
+0xe5 U+03c3 #GREEK SMALL LETTER SIGMA
+0xe6 U+00b5 #MICRO SIGN
+0xe7 U+03c4 #GREEK SMALL LETTER TAU
+0xe8 U+03a6 #GREEK CAPITAL LETTER PHI
+0xe9 U+0398 #GREEK CAPITAL LETTER THETA
+0xea U+03a9 #GREEK CAPITAL LETTER OMEGA
+0xeb U+03b4 #GREEK SMALL LETTER DELTA
+0xec U+221e #INFINITY
+0xed U+03c6 #GREEK SMALL LETTER PHI
+0xee U+03b5 #GREEK SMALL LETTER EPSILON
+0xef U+2229 #INTERSECTION
+0xf0 U+2261 #IDENTICAL TO
+0xf1 U+00b1 #PLUS-MINUS SIGN
+0xf2 U+2265 #GREATER-THAN OR EQUAL TO
+0xf3 U+2264 #LESS-THAN OR EQUAL TO
+0xf4 U+2320 #TOP HALF INTEGRAL
+0xf5 U+2321 #BOTTOM HALF INTEGRAL
+0xf6 U+00f7 #DIVISION SIGN
+0xf7 U+2248 #ALMOST EQUAL TO
+0xf8 U+00b0 #DEGREE SIGN
+0xf9 U+2219 #BULLET OPERATOR
+0xfa U+00b7 #MIDDLE DOT
+0xfb U+221a #SQUARE ROOT
+0xfc U+207f #SUPERSCRIPT LATIN SMALL LETTER N
+0xfd U+00b2 #SUPERSCRIPT TWO
+0xfe U+25a0 #BLACK SQUARE
+0xff U+00a0 #NO-BREAK SPACE
+
diff --git a/src/chrtrans/cp864_uni.tbl b/src/chrtrans/cp864_uni.tbl
new file mode 100644
index 0000000..6568577
--- /dev/null
+++ b/src/chrtrans/cp864_uni.tbl
@@ -0,0 +1,160 @@
+# This file has been modified for lynx (see README.tables)
+
+#The MIME name of this charset.
+Mcp864
+
+#Name as a Display Charset (used on Options screen).
+OArabic (cp864)
+
+#Codepage number
+C864
+
+# Name: cp864_DOSArabic to Unicode table
+# Unicode version: 2.0
+# Table version: 2.00
+# Table format: Format A
+# Date: 04/24/96
+# Authors: Lori Brownell <loribr@microsoft.com>
+# K.D. Chang <a-kchang@microsoft.com>
+# General notes: none
+#
+# Format: Three tab-separated columns
+# Column #1 is the cp864_DOSArabic code (in hex)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 is the Unicode name (follows a comment sign, '#')
+#
+# The entries are in cp864_DOSArabic order
+#
+##################
+
+0x20-0x7f idem
+#
+0x80 U+00b0 #DEGREE SIGN
+0x81 U+00b7 #MIDDLE DOT
+0x82 U+2219 #BULLET OPERATOR
+0x83 U+221a #SQUARE ROOT
+0x84 U+2592 #MEDIUM SHADE
+0x85 U+2500 #FORMS LIGHT HORIZONTAL
+0x86 U+2502 #FORMS LIGHT VERTICAL
+0x87 U+253c #FORMS LIGHT VERTICAL AND HORIZONTAL
+0x88 U+2524 #FORMS LIGHT VERTICAL AND LEFT
+0x89 U+252c #FORMS LIGHT DOWN AND HORIZONTAL
+0x8a U+251c #FORMS LIGHT VERTICAL AND RIGHT
+0x8b U+2534 #FORMS LIGHT UP AND HORIZONTAL
+0x8c U+2510 #FORMS LIGHT DOWN AND LEFT
+0x8d U+250c #FORMS LIGHT DOWN AND RIGHT
+0x8e U+2514 #FORMS LIGHT UP AND RIGHT
+0x8f U+2518 #FORMS LIGHT UP AND LEFT
+0x90 U+03b2 #GREEK SMALL BETA
+0x91 U+221e #INFINITY
+0x92 U+03c6 #GREEK SMALL PHI
+0x93 U+00b1 #PLUS-OR-MINUS SIGN
+0x94 U+00bd #FRACTION 1/2
+0x95 U+00bc #FRACTION 1/4
+0x96 U+2248 #ALMOST EQUAL TO
+0x97 U+00ab #LEFT POINTING GUILLEMET
+0x98 U+00bb #RIGHT POINTING GUILLEMET
+0x99 U+fef7 #ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM
+0x9a U+fef8 #ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM
+#0x9b #UNDEFINED
+#0x9c #UNDEFINED
+0x9d U+fefb #ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM
+0x9e U+fefc #ARABIC LIGATURE LAM WITH ALEF FINAL FORM
+#0x9f #UNDEFINED
+0xa0 U+00a0 #NON-BREAKING SPACE
+0xa1 U+00ad #SOFT HYPHEN
+0xa2 U+fe82 #ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM
+0xa3 U+00a3 #POUND SIGN
+0xa4 U+00a4 #CURRENCY SIGN
+0xa5 U+fe84 #ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM
+#0xa6 #UNDEFINED
+#0xa7 #UNDEFINED
+0xa8 U+fe8e #ARABIC LETTER ALEF FINAL FORM
+0xa9 U+fe8f #ARABIC LETTER BEH ISOLATED FORM
+0xaa U+fe95 #ARABIC LETTER TEH ISOLATED FORM
+0xab U+fe99 #ARABIC LETTER THEH ISOLATED FORM
+0xac U+060c #ARABIC COMMA
+0xad U+fe9d #ARABIC LETTER JEEM ISOLATED FORM
+0xae U+fea1 #ARABIC LETTER HAH ISOLATED FORM
+0xaf U+fea5 #ARABIC LETTER KHAH ISOLATED FORM
+0xb0 U+0660 #ARABIC-INDIC DIGIT ZERO
+0xb1 U+0661 #ARABIC-INDIC DIGIT ONE
+0xb2 U+0662 #ARABIC-INDIC DIGIT TWO
+0xb3 U+0663 #ARABIC-INDIC DIGIT THREE
+0xb4 U+0664 #ARABIC-INDIC DIGIT FOUR
+0xb5 U+0665 #ARABIC-INDIC DIGIT FIVE
+0xb6 U+0666 #ARABIC-INDIC DIGIT SIX
+0xb7 U+0667 #ARABIC-INDIC DIGIT SEVEN
+0xb8 U+0668 #ARABIC-INDIC DIGIT EIGHT
+0xb9 U+0669 #ARABIC-INDIC DIGIT NINE
+0xba U+fed1 #ARABIC LETTER FEH ISOLATED FORM
+0xbb U+061b #ARABIC SEMICOLON
+0xbc U+feb1 #ARABIC LETTER SEEN ISOLATED FORM
+0xbd U+feb5 #ARABIC LETTER SHEEN ISOLATED FORM
+0xbe U+feb9 #ARABIC LETTER SAD ISOLATED FORM
+0xbf U+061f #ARABIC QUESTION MARK
+0xc0 U+00a2 #CENT SIGN
+0xc1 U+fe80 #ARABIC LETTER HAMZA ISOLATED FORM
+0xc2 U+fe81 #ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM
+0xc3 U+fe83 #ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM
+0xc4 U+fe85 #ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM
+0xc5 U+feca #ARABIC LETTER AIN FINAL FORM
+0xc6 U+fe8b #ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM
+0xc7 U+fe8d #ARABIC LETTER ALEF ISOLATED FORM
+0xc8 U+fe91 #ARABIC LETTER BEH INITIAL FORM
+0xc9 U+fe93 #ARABIC LETTER TEH MARBUTA ISOLATED FORM
+0xca U+fe97 #ARABIC LETTER TEH INITIAL FORM
+0xcb U+fe9b #ARABIC LETTER THEH INITIAL FORM
+0xcc U+fe9f #ARABIC LETTER JEEM INITIAL FORM
+0xcd U+fea3 #ARABIC LETTER HAH INITIAL FORM
+0xce U+fea7 #ARABIC LETTER KHAH INITIAL FORM
+0xcf U+fea9 #ARABIC LETTER DAL ISOLATED FORM
+0xd0 U+feab #ARABIC LETTER THAL ISOLATED FORM
+0xd1 U+fead #ARABIC LETTER REH ISOLATED FORM
+0xd2 U+feaf #ARABIC LETTER ZAIN ISOLATED FORM
+0xd3 U+feb3 #ARABIC LETTER SEEN INITIAL FORM
+0xd4 U+feb7 #ARABIC LETTER SHEEN INITIAL FORM
+0xd5 U+febb #ARABIC LETTER SAD INITIAL FORM
+0xd6 U+febf #ARABIC LETTER DAD INITIAL FORM
+0xd7 U+fec1 #ARABIC LETTER TAH ISOLATED FORM
+0xd8 U+fec5 #ARABIC LETTER ZAH ISOLATED FORM
+0xd9 U+fecb #ARABIC LETTER AIN INITIAL FORM
+0xda U+fecf #ARABIC LETTER GHAIN INITIAL FORM
+0xdb U+00a6 #BROKEN VERTICAL BAR
+0xdc U+00ac #NOT SIGN
+0xdd U+00f7 #DIVISION SIGN
+0xde U+00d7 #MULTIPLICATION SIGN
+0xdf U+fec9 #ARABIC LETTER AIN ISOLATED FORM
+0xe0 U+0640 #ARABIC TATWEEL
+0xe1 U+fed3 #ARABIC LETTER FEH INITIAL FORM
+0xe2 U+fed7 #ARABIC LETTER QAF INITIAL FORM
+0xe3 U+fedb #ARABIC LETTER KAF INITIAL FORM
+0xe4 U+fedf #ARABIC LETTER LAM INITIAL FORM
+0xe5 U+fee3 #ARABIC LETTER MEEM INITIAL FORM
+0xe6 U+fee7 #ARABIC LETTER NOON INITIAL FORM
+0xe7 U+feeb #ARABIC LETTER HEH INITIAL FORM
+0xe8 U+feed #ARABIC LETTER WAW ISOLATED FORM
+0xe9 U+feef #ARABIC LETTER ALEF MAKSURA ISOLATED FORM
+0xea U+fef3 #ARABIC LETTER YEH INITIAL FORM
+0xeb U+febd #ARABIC LETTER DAD ISOLATED FORM
+0xec U+fecc #ARABIC LETTER AIN MEDIAL FORM
+0xed U+fece #ARABIC LETTER GHAIN FINAL FORM
+0xee U+fecd #ARABIC LETTER GHAIN ISOLATED FORM
+0xef U+fee1 #ARABIC LETTER MEEM ISOLATED FORM
+0xf0 U+fe7d #ARABIC SHADDA MEDIAL FORM
+0xf1 U+0651 #ARABIC SHADDAH
+0xf2 U+fee5 #ARABIC LETTER NOON ISOLATED FORM
+0xf3 U+fee9 #ARABIC LETTER HEH ISOLATED FORM
+0xf4 U+feec #ARABIC LETTER HEH MEDIAL FORM
+0xf5 U+fef0 #ARABIC LETTER ALEF MAKSURA FINAL FORM
+0xf6 U+fef2 #ARABIC LETTER YEH FINAL FORM
+0xf7 U+fed0 #ARABIC LETTER GHAIN MEDIAL FORM
+0xf8 U+fed5 #ARABIC LETTER QAF ISOLATED FORM
+0xf9 U+fef5 #ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM
+0xfa U+fef6 #ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM
+0xfb U+fedd #ARABIC LETTER LAM ISOLATED FORM
+0xfc U+fed9 #ARABIC LETTER KAF ISOLATED FORM
+0xfd U+fef1 #ARABIC LETTER YEH ISOLATED FORM
+0xfe U+25a0 #BLACK SQUARE
+#0xff #UNDEFINED
+
diff --git a/src/chrtrans/cp866_uni.tbl b/src/chrtrans/cp866_uni.tbl
new file mode 100644
index 0000000..029e025
--- /dev/null
+++ b/src/chrtrans/cp866_uni.tbl
@@ -0,0 +1,159 @@
+# This file has been modified for lynx (see README.tables)
+
+#The MIME name of this charset.
+Mcp866
+
+#Name as a Display Charset (used on Options screen)
+OCyrillic (cp866)
+
+#Codepage number
+C866
+
+#
+# Name: cp866_DOSCyrillicRussian to Unicode table
+# Unicode version: 2.0
+# Table version: 2.00
+# Table format: Format A
+# Date: 04/24/96
+# Authors: Lori Brownell <loribr@microsoft.com>
+# K.D. Chang <a-kchang@microsoft.com>
+# General notes: none
+#
+# Format: Three tab-separated columns
+# Column #1 is the cp866_DOSCyrillicRussian code (in hex)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 is the Unicode name (follows a comment sign, '#')
+#
+# The entries are in cp866_DOSCyrillicRussian order
+#
+0x20-0x7f idem
+#
+0x80 U+0410 #CYRILLIC CAPITAL LETTER A
+0x81 U+0411 #CYRILLIC CAPITAL LETTER BE
+0x82 U+0412 #CYRILLIC CAPITAL LETTER VE
+0x83 U+0413 #CYRILLIC CAPITAL LETTER GHE
+0x84 U+0414 #CYRILLIC CAPITAL LETTER DE
+0x85 U+0415 #CYRILLIC CAPITAL LETTER IE
+0x86 U+0416 #CYRILLIC CAPITAL LETTER ZHE
+0x87 U+0417 #CYRILLIC CAPITAL LETTER ZE
+0x88 U+0418 #CYRILLIC CAPITAL LETTER I
+0x89 U+0419 #CYRILLIC CAPITAL LETTER SHORT I
+0x8a U+041a #CYRILLIC CAPITAL LETTER KA
+0x8b U+041b #CYRILLIC CAPITAL LETTER EL
+0x8c U+041c #CYRILLIC CAPITAL LETTER EM
+0x8d U+041d #CYRILLIC CAPITAL LETTER EN
+0x8e U+041e #CYRILLIC CAPITAL LETTER O
+0x8f U+041f #CYRILLIC CAPITAL LETTER PE
+0x90 U+0420 #CYRILLIC CAPITAL LETTER ER
+0x91 U+0421 #CYRILLIC CAPITAL LETTER ES
+0x92 U+0422 #CYRILLIC CAPITAL LETTER TE
+0x93 U+0423 #CYRILLIC CAPITAL LETTER U
+0x94 U+0424 #CYRILLIC CAPITAL LETTER EF
+0x95 U+0425 #CYRILLIC CAPITAL LETTER HA
+0x96 U+0426 #CYRILLIC CAPITAL LETTER TSE
+0x97 U+0427 #CYRILLIC CAPITAL LETTER CHE
+0x98 U+0428 #CYRILLIC CAPITAL LETTER SHA
+0x99 U+0429 #CYRILLIC CAPITAL LETTER SHCHA
+0x9a U+042a #CYRILLIC CAPITAL LETTER HARD SIGN
+0x9b U+042b #CYRILLIC CAPITAL LETTER YERU
+0x9c U+042c #CYRILLIC CAPITAL LETTER SOFT SIGN
+0x9d U+042d #CYRILLIC CAPITAL LETTER E
+0x9e U+042e #CYRILLIC CAPITAL LETTER YU
+0x9f U+042f #CYRILLIC CAPITAL LETTER YA
+0xa0 U+0430 #CYRILLIC SMALL LETTER A
+0xa1 U+0431 #CYRILLIC SMALL LETTER BE
+0xa2 U+0432 #CYRILLIC SMALL LETTER VE
+0xa3 U+0433 #CYRILLIC SMALL LETTER GHE
+0xa4 U+0434 #CYRILLIC SMALL LETTER DE
+0xa5 U+0435 #CYRILLIC SMALL LETTER IE
+0xa6 U+0436 #CYRILLIC SMALL LETTER ZHE
+0xa7 U+0437 #CYRILLIC SMALL LETTER ZE
+0xa8 U+0438 #CYRILLIC SMALL LETTER I
+0xa9 U+0439 #CYRILLIC SMALL LETTER SHORT I
+0xaa U+043a #CYRILLIC SMALL LETTER KA
+0xab U+043b #CYRILLIC SMALL LETTER EL
+0xac U+043c #CYRILLIC SMALL LETTER EM
+0xad U+043d #CYRILLIC SMALL LETTER EN
+0xae U+043e #CYRILLIC SMALL LETTER O
+0xaf U+043f #CYRILLIC SMALL LETTER PE
+0xb0 U+2591 #LIGHT SHADE
+0xb1 U+2592 #MEDIUM SHADE
+0xb2 U+2593 #DARK SHADE
+0xb3 U+2502 #BOX DRAWINGS LIGHT VERTICAL
+0xb4 U+2524 #BOX DRAWINGS LIGHT VERTICAL AND LEFT
+0xb5 U+2561 #BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+0xb6 U+2562 #BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
+0xb7 U+2556 #BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
+0xb8 U+2555 #BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
+0xb9 U+2563 #BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+0xba U+2551 #BOX DRAWINGS DOUBLE VERTICAL
+0xbb U+2557 #BOX DRAWINGS DOUBLE DOWN AND LEFT
+0xbc U+255d #BOX DRAWINGS DOUBLE UP AND LEFT
+0xbd U+255c #BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
+0xbe U+255b #BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+0xbf U+2510 #BOX DRAWINGS LIGHT DOWN AND LEFT
+0xc0 U+2514 #BOX DRAWINGS LIGHT UP AND RIGHT
+0xc1 U+2534 #BOX DRAWINGS LIGHT UP AND HORIZONTAL
+0xc2 U+252c #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+0xc3 U+251c #BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+0xc4 U+2500 #BOX DRAWINGS LIGHT HORIZONTAL
+0xc5 U+253c #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+0xc6 U+255e #BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+0xc7 U+255f #BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+0xc8 U+255a #BOX DRAWINGS DOUBLE UP AND RIGHT
+0xc9 U+2554 #BOX DRAWINGS DOUBLE DOWN AND RIGHT
+0xca U+2569 #BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+0xcb U+2566 #BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+0xcc U+2560 #BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+0xcd U+2550 #BOX DRAWINGS DOUBLE HORIZONTAL
+0xce U+256c #BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+0xcf U+2567 #BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+0xd0 U+2568 #BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+0xd1 U+2564 #BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
+0xd2 U+2565 #BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
+0xd3 U+2559 #BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+0xd4 U+2558 #BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+0xd5 U+2552 #BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+0xd6 U+2553 #BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
+0xd7 U+256b #BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
+0xd8 U+256a #BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+0xd9 U+2518 #BOX DRAWINGS LIGHT UP AND LEFT
+0xda U+250c #BOX DRAWINGS LIGHT DOWN AND RIGHT
+0xdb U+2588 #FULL BLOCK
+0xdc U+2584 #LOWER HALF BLOCK
+0xdd U+258c #LEFT HALF BLOCK
+0xde U+2590 #RIGHT HALF BLOCK
+0xdf U+2580 #UPPER HALF BLOCK
+0xe0 U+0440 #CYRILLIC SMALL LETTER ER
+0xe1 U+0441 #CYRILLIC SMALL LETTER ES
+0xe2 U+0442 #CYRILLIC SMALL LETTER TE
+0xe3 U+0443 #CYRILLIC SMALL LETTER U
+0xe4 U+0444 #CYRILLIC SMALL LETTER EF
+0xe5 U+0445 #CYRILLIC SMALL LETTER HA
+0xe6 U+0446 #CYRILLIC SMALL LETTER TSE
+0xe7 U+0447 #CYRILLIC SMALL LETTER CHE
+0xe8 U+0448 #CYRILLIC SMALL LETTER SHA
+0xe9 U+0449 #CYRILLIC SMALL LETTER SHCHA
+0xea U+044a #CYRILLIC SMALL LETTER HARD SIGN
+0xeb U+044b #CYRILLIC SMALL LETTER YERU
+0xec U+044c #CYRILLIC SMALL LETTER SOFT SIGN
+0xed U+044d #CYRILLIC SMALL LETTER E
+0xee U+044e #CYRILLIC SMALL LETTER YU
+0xef U+044f #CYRILLIC SMALL LETTER YA
+0xf0 U+0401 #CYRILLIC CAPITAL LETTER IO
+0xf1 U+0451 #CYRILLIC SMALL LETTER IO
+0xf2 U+0404 #CYRILLIC CAPITAL LETTER UKRAINIAN IE
+0xf3 U+0454 #CYRILLIC SMALL LETTER UKRAINIAN IE
+0xf4 U+0407 #CYRILLIC CAPITAL LETTER YI
+0xf5 U+0457 #CYRILLIC SMALL LETTER YI
+0xf6 U+040e #CYRILLIC CAPITAL LETTER SHORT U
+0xf7 U+045e #CYRILLIC SMALL LETTER SHORT U
+0xf8 U+00b0 #DEGREE SIGN
+0xf9 U+2219 #BULLET OPERATOR
+0xfa U+00b7 #MIDDLE DOT
+0xfb U+221a #SQUARE ROOT
+0xfc U+2116 #NUMERO SIGN
+0xfd U+00a4 #CURRENCY SIGN
+0xfe U+25a0 #BLACK SQUARE
+0xff U+00a0 #NO-BREAK SPACE
+
diff --git a/src/chrtrans/cp866u_uni.tbl b/src/chrtrans/cp866u_uni.tbl
new file mode 100644
index 0000000..8d2dee0
--- /dev/null
+++ b/src/chrtrans/cp866u_uni.tbl
@@ -0,0 +1,157 @@
+# This file has been modified for lynx (see README.tables)
+
+#The MIME name of this charset.
+Mcp866u
+
+#Name as a Display Charset (used on Options screen)
+OUkrainian Cyrillic (cp866u)
+
+#Codepage number
+#?
+
+#
+# Name: cp866_DOSCyrillicUkrainian to Unicode table
+# Unicode version: 2.0
+# Table version: 2.00
+# Table format: Format A
+# General notes: based on Cyrillic (cp866) table,
+# have different mapping in 0xF2-0xF9 region.
+#
+# Format: Three tab-separated columns
+# Column #1 is the cp866_DOSCyrillicUkrainian code (in hex)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 is the Unicode name (follows a comment sign, '#')
+#
+# The entries are in cp866_DOSCyrillicUkrainian order
+#
+0x20-0x7f idem
+#
+0x80 U+0410 #CYRILLIC CAPITAL LETTER A
+0x81 U+0411 #CYRILLIC CAPITAL LETTER BE
+0x82 U+0412 #CYRILLIC CAPITAL LETTER VE
+0x83 U+0413 #CYRILLIC CAPITAL LETTER GHE
+0x84 U+0414 #CYRILLIC CAPITAL LETTER DE
+0x85 U+0415 #CYRILLIC CAPITAL LETTER IE
+0x86 U+0416 #CYRILLIC CAPITAL LETTER ZHE
+0x87 U+0417 #CYRILLIC CAPITAL LETTER ZE
+0x88 U+0418 #CYRILLIC CAPITAL LETTER I
+0x89 U+0419 #CYRILLIC CAPITAL LETTER SHORT I
+0x8a U+041a #CYRILLIC CAPITAL LETTER KA
+0x8b U+041b #CYRILLIC CAPITAL LETTER EL
+0x8c U+041c #CYRILLIC CAPITAL LETTER EM
+0x8d U+041d #CYRILLIC CAPITAL LETTER EN
+0x8e U+041e #CYRILLIC CAPITAL LETTER O
+0x8f U+041f #CYRILLIC CAPITAL LETTER PE
+0x90 U+0420 #CYRILLIC CAPITAL LETTER ER
+0x91 U+0421 #CYRILLIC CAPITAL LETTER ES
+0x92 U+0422 #CYRILLIC CAPITAL LETTER TE
+0x93 U+0423 #CYRILLIC CAPITAL LETTER U
+0x94 U+0424 #CYRILLIC CAPITAL LETTER EF
+0x95 U+0425 #CYRILLIC CAPITAL LETTER HA
+0x96 U+0426 #CYRILLIC CAPITAL LETTER TSE
+0x97 U+0427 #CYRILLIC CAPITAL LETTER CHE
+0x98 U+0428 #CYRILLIC CAPITAL LETTER SHA
+0x99 U+0429 #CYRILLIC CAPITAL LETTER SHCHA
+0x9a U+042a #CYRILLIC CAPITAL LETTER HARD SIGN
+0x9b U+042b #CYRILLIC CAPITAL LETTER YERU
+0x9c U+042c #CYRILLIC CAPITAL LETTER SOFT SIGN
+0x9d U+042d #CYRILLIC CAPITAL LETTER E
+0x9e U+042e #CYRILLIC CAPITAL LETTER YU
+0x9f U+042f #CYRILLIC CAPITAL LETTER YA
+0xa0 U+0430 #CYRILLIC SMALL LETTER A
+0xa1 U+0431 #CYRILLIC SMALL LETTER BE
+0xa2 U+0432 #CYRILLIC SMALL LETTER VE
+0xa3 U+0433 #CYRILLIC SMALL LETTER GHE
+0xa4 U+0434 #CYRILLIC SMALL LETTER DE
+0xa5 U+0435 #CYRILLIC SMALL LETTER IE
+0xa6 U+0436 #CYRILLIC SMALL LETTER ZHE
+0xa7 U+0437 #CYRILLIC SMALL LETTER ZE
+0xa8 U+0438 #CYRILLIC SMALL LETTER I
+0xa9 U+0439 #CYRILLIC SMALL LETTER SHORT I
+0xaa U+043a #CYRILLIC SMALL LETTER KA
+0xab U+043b #CYRILLIC SMALL LETTER EL
+0xac U+043c #CYRILLIC SMALL LETTER EM
+0xad U+043d #CYRILLIC SMALL LETTER EN
+0xae U+043e #CYRILLIC SMALL LETTER O
+0xaf U+043f #CYRILLIC SMALL LETTER PE
+0xb0 U+2591 #LIGHT SHADE
+0xb1 U+2592 #MEDIUM SHADE
+0xb2 U+2593 #DARK SHADE
+0xb3 U+2502 #BOX DRAWINGS LIGHT VERTICAL
+0xb4 U+2524 #BOX DRAWINGS LIGHT VERTICAL AND LEFT
+0xb5 U+2561 #BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+0xb6 U+2562 #BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
+0xb7 U+2556 #BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
+0xb8 U+2555 #BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
+0xb9 U+2563 #BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+0xba U+2551 #BOX DRAWINGS DOUBLE VERTICAL
+0xbb U+2557 #BOX DRAWINGS DOUBLE DOWN AND LEFT
+0xbc U+255d #BOX DRAWINGS DOUBLE UP AND LEFT
+0xbd U+255c #BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
+0xbe U+255b #BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+0xbf U+2510 #BOX DRAWINGS LIGHT DOWN AND LEFT
+0xc0 U+2514 #BOX DRAWINGS LIGHT UP AND RIGHT
+0xc1 U+2534 #BOX DRAWINGS LIGHT UP AND HORIZONTAL
+0xc2 U+252c #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+0xc3 U+251c #BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+0xc4 U+2500 #BOX DRAWINGS LIGHT HORIZONTAL
+0xc5 U+253c #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+0xc6 U+255e #BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+0xc7 U+255f #BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+0xc8 U+255a #BOX DRAWINGS DOUBLE UP AND RIGHT
+0xc9 U+2554 #BOX DRAWINGS DOUBLE DOWN AND RIGHT
+0xca U+2569 #BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+0xcb U+2566 #BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+0xcc U+2560 #BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+0xcd U+2550 #BOX DRAWINGS DOUBLE HORIZONTAL
+0xce U+256c #BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+0xcf U+2567 #BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+0xd0 U+2568 #BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+0xd1 U+2564 #BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
+0xd2 U+2565 #BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
+0xd3 U+2559 #BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+0xd4 U+2558 #BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+0xd5 U+2552 #BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+0xd6 U+2553 #BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
+0xd7 U+256b #BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
+0xd8 U+256a #BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+0xd9 U+2518 #BOX DRAWINGS LIGHT UP AND LEFT
+0xda U+250c #BOX DRAWINGS LIGHT DOWN AND RIGHT
+0xdb U+2588 #FULL BLOCK
+0xdc U+2584 #LOWER HALF BLOCK
+0xdd U+258c #LEFT HALF BLOCK
+0xde U+2590 #RIGHT HALF BLOCK
+0xdf U+2580 #UPPER HALF BLOCK
+0xe0 U+0440 #CYRILLIC SMALL LETTER ER
+0xe1 U+0441 #CYRILLIC SMALL LETTER ES
+0xe2 U+0442 #CYRILLIC SMALL LETTER TE
+0xe3 U+0443 #CYRILLIC SMALL LETTER U
+0xe4 U+0444 #CYRILLIC SMALL LETTER EF
+0xe5 U+0445 #CYRILLIC SMALL LETTER HA
+0xe6 U+0446 #CYRILLIC SMALL LETTER TSE
+0xe7 U+0447 #CYRILLIC SMALL LETTER CHE
+0xe8 U+0448 #CYRILLIC SMALL LETTER SHA
+0xe9 U+0449 #CYRILLIC SMALL LETTER SHCHA
+0xea U+044a #CYRILLIC SMALL LETTER HARD SIGN
+0xeb U+044b #CYRILLIC SMALL LETTER YERU
+0xec U+044c #CYRILLIC SMALL LETTER SOFT SIGN
+0xed U+044d #CYRILLIC SMALL LETTER E
+0xee U+044e #CYRILLIC SMALL LETTER YU
+0xef U+044f #CYRILLIC SMALL LETTER YA
+0xf0 U+0401 #CYRILLIC CAPITAL LETTER IO
+0xf1 U+0451 #CYRILLIC SMALL LETTER IO
+0xf2 U+0490 #CYRILLIC CAPITAL LETTER GHE WITH UPTURN
+0xf3 U+0491 #CYRILLIC SMALL LETTER GHE WITH UPTURN
+0xf4 U+0404 #CYRILLIC CAPITAL LETTER UKRAINIAN IE
+0xf5 U+0454 #CYRILLIC SMALL LETTER UKRAINIAN IE
+0xf6 U+0406 #CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+0xf7 U+0456 #CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+0xf8 U+0407 #CYRILLIC CAPITAL LETTER YI
+0xf9 U+0457 #CYRILLIC SMALL LETTER YI
+0xfa U+00b7 #MIDDLE DOT
+0xfb U+221a #SQUARE ROOT
+0xfc U+2116 #NUMERO SIGN
+0xfd U+00a4 #CURRENCY SIGN
+0xfe U+25a0 #BLACK SQUARE
+0xff U+00a0 #NO-BREAK SPACE
+
diff --git a/src/chrtrans/cp869_uni.tbl b/src/chrtrans/cp869_uni.tbl
new file mode 100644
index 0000000..d662b83
--- /dev/null
+++ b/src/chrtrans/cp869_uni.tbl
@@ -0,0 +1,160 @@
+# This file has been modified for lynx (see README.tables)
+
+#The MIME name of this charset.
+Mcp869
+
+#Name as a Display Charset (used on Options screen)
+OGreek2 (cp869)
+
+#Codepage number
+C869
+
+# Name: cp869_DOSGreek2 to Unicode table
+# Unicode version: 2.0
+# Table version: 2.00
+# Table format: Format A
+# Date: 04/24/96
+# Authors: Lori Brownell <loribr@microsoft.com>
+# K.D. Chang <a-kchang@microsoft.com>
+# General notes: none
+#
+# Format: Three tab-separated columns
+# Column #1 is the cp869_DOSGreek2 code (in hex)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 is the Unicode name (follows a comment sign, '#')
+#
+# The entries are in cp869_DOSGreek2 order
+#
+##################
+
+0x20-0x7f idem
+#
+#0x80 #UNDEFINED
+#0x81 #UNDEFINED
+#0x82 #UNDEFINED
+#0x83 #UNDEFINED
+#0x84 #UNDEFINED
+#0x85 #UNDEFINED
+0x86 U+0386 #GREEK CAPITAL LETTER ALPHA WITH TONOS
+#0x87 #UNDEFINED
+0x88 U+00b7 #MIDDLE DOT
+0x89 U+00ac #NOT SIGN
+0x8a U+00a6 #BROKEN BAR
+0x8b U+2018 U+02bd #LEFT SINGLE QUOTATION MARK
+0x8c U+2019 U+02bc #RIGHT SINGLE QUOTATION MARK
+0x8d U+0388 #GREEK CAPITAL LETTER EPSILON WITH TONOS
+0x8e U+2015 #HORIZONTAL BAR
+0x8f U+0389 #GREEK CAPITAL LETTER ETA WITH TONOS
+0x90 U+038a #GREEK CAPITAL LETTER IOTA WITH TONOS
+0x91 U+03aa #GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
+0x92 U+038c #GREEK CAPITAL LETTER OMICRON WITH TONOS
+#0x93 #UNDEFINED
+#0x94 #UNDEFINED
+0x95 U+038e #GREEK CAPITAL LETTER UPSILON WITH TONOS
+0x96 U+03ab #GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+0x97 U+00a9 #COPYRIGHT SIGN
+0x98 U+038f #GREEK CAPITAL LETTER OMEGA WITH TONOS
+0x99 U+00b2 #SUPERSCRIPT TWO
+0x9a U+00b3 #SUPERSCRIPT THREE
+0x9b U+03ac #GREEK SMALL LETTER ALPHA WITH TONOS
+0x9c U+00a3 #POUND SIGN
+0x9d U+03ad #GREEK SMALL LETTER EPSILON WITH TONOS
+0x9e U+03ae #GREEK SMALL LETTER ETA WITH TONOS
+0x9f U+03af #GREEK SMALL LETTER IOTA WITH TONOS
+0xa0 U+03ca #GREEK SMALL LETTER IOTA WITH DIALYTIKA
+0xa1 U+0390 #GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+0xa2 U+03cc #GREEK SMALL LETTER OMICRON WITH TONOS
+0xa3 U+03cd #GREEK SMALL LETTER UPSILON WITH TONOS
+0xa4 U+0391 #GREEK CAPITAL LETTER ALPHA
+0xa5 U+0392 #GREEK CAPITAL LETTER BETA
+0xa6 U+0393 #GREEK CAPITAL LETTER GAMMA
+0xa7 U+0394 #GREEK CAPITAL LETTER DELTA
+0xa8 U+0395 #GREEK CAPITAL LETTER EPSILON
+0xa9 U+0396 #GREEK CAPITAL LETTER ZETA
+0xaa U+0397 #GREEK CAPITAL LETTER ETA
+0xab U+00bd #VULGAR FRACTION ONE HALF
+0xac U+0398 #GREEK CAPITAL LETTER THETA
+0xad U+0399 #GREEK CAPITAL LETTER IOTA
+0xae U+00ab #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xaf U+00bb #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xb0 U+2591 #LIGHT SHADE
+0xb1 U+2592 #MEDIUM SHADE
+0xb2 U+2593 #DARK SHADE
+0xb3 U+2502 #BOX DRAWINGS LIGHT VERTICAL
+0xb4 U+2524 #BOX DRAWINGS LIGHT VERTICAL AND LEFT
+0xb5 U+039a #GREEK CAPITAL LETTER KAPPA
+0xb6 U+039b #GREEK CAPITAL LETTER LAMDA
+0xb7 U+039c #GREEK CAPITAL LETTER MU
+0xb8 U+039d #GREEK CAPITAL LETTER NU
+0xb9 U+2563 #BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+0xba U+2551 #BOX DRAWINGS DOUBLE VERTICAL
+0xbb U+2557 #BOX DRAWINGS DOUBLE DOWN AND LEFT
+0xbc U+255d #BOX DRAWINGS DOUBLE UP AND LEFT
+0xbd U+039e #GREEK CAPITAL LETTER XI
+0xbe U+039f #GREEK CAPITAL LETTER OMICRON
+0xbf U+2510 #BOX DRAWINGS LIGHT DOWN AND LEFT
+0xc0 U+2514 #BOX DRAWINGS LIGHT UP AND RIGHT
+0xc1 U+2534 #BOX DRAWINGS LIGHT UP AND HORIZONTAL
+0xc2 U+252c #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+0xc3 U+251c #BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+0xc4 U+2500 #BOX DRAWINGS LIGHT HORIZONTAL
+0xc5 U+253c #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+0xc6 U+03a0 #GREEK CAPITAL LETTER PI
+0xc7 U+03a1 #GREEK CAPITAL LETTER RHO
+0xc8 U+255a #BOX DRAWINGS DOUBLE UP AND RIGHT
+0xc9 U+2554 #BOX DRAWINGS DOUBLE DOWN AND RIGHT
+0xca U+2569 #BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+0xcb U+2566 #BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+0xcc U+2560 #BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+0xcd U+2550 #BOX DRAWINGS DOUBLE HORIZONTAL
+0xce U+256c #BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+0xcf U+03a3 #GREEK CAPITAL LETTER SIGMA
+0xd0 U+03a4 #GREEK CAPITAL LETTER TAU
+0xd1 U+03a5 #GREEK CAPITAL LETTER UPSILON
+0xd2 U+03a6 #GREEK CAPITAL LETTER PHI
+0xd3 U+03a7 #GREEK CAPITAL LETTER CHI
+0xd4 U+03a8 #GREEK CAPITAL LETTER PSI
+0xd5 U+03a9 #GREEK CAPITAL LETTER OMEGA
+0xd6 U+03b1 #GREEK SMALL LETTER ALPHA
+0xd7 U+03b2 #GREEK SMALL LETTER BETA
+0xd8 U+03b3 #GREEK SMALL LETTER GAMMA
+0xd9 U+2518 #BOX DRAWINGS LIGHT UP AND LEFT
+0xda U+250c #BOX DRAWINGS LIGHT DOWN AND RIGHT
+0xdb U+2588 #FULL BLOCK
+0xdc U+2584 #LOWER HALF BLOCK
+0xdd U+03b4 #GREEK SMALL LETTER DELTA
+0xde U+03b5 #GREEK SMALL LETTER EPSILON
+0xdf U+2580 #UPPER HALF BLOCK
+0xe0 U+03b6 #GREEK SMALL LETTER ZETA
+0xe1 U+03b7 #GREEK SMALL LETTER ETA
+0xe2 U+03b8 #GREEK SMALL LETTER THETA
+0xe3 U+03b9 #GREEK SMALL LETTER IOTA
+0xe4 U+03ba #GREEK SMALL LETTER KAPPA
+0xe5 U+03bb #GREEK SMALL LETTER LAMDA
+0xe6 U+03bc #GREEK SMALL LETTER MU
+0xe7 U+03bd #GREEK SMALL LETTER NU
+0xe8 U+03be #GREEK SMALL LETTER XI
+0xe9 U+03bf #GREEK SMALL LETTER OMICRON
+0xea U+03c0 #GREEK SMALL LETTER PI
+0xeb U+03c1 #GREEK SMALL LETTER RHO
+0xec U+03c3 #GREEK SMALL LETTER SIGMA
+0xed U+03c2 #GREEK SMALL LETTER FINAL SIGMA
+0xee U+03c4 #GREEK SMALL LETTER TAU
+0xef U+0384 #GREEK TONOS
+0xf0 U+00ad #SOFT HYPHEN
+0xf1 U+00b1 #PLUS-MINUS SIGN
+0xf2 U+03c5 #GREEK SMALL LETTER UPSILON
+0xf3 U+03c6 #GREEK SMALL LETTER PHI
+0xf4 U+03c7 #GREEK SMALL LETTER CHI
+0xf5 U+00a7 #SECTION SIGN
+0xf6 U+03c8 #GREEK SMALL LETTER PSI
+0xf7 U+0385 #GREEK DIALYTIKA TONOS
+0xf8 U+00b0 #DEGREE SIGN
+0xf9 U+00a8 #DIAERESIS
+0xfa U+03c9 #GREEK SMALL LETTER OMEGA
+0xfb U+03cb #GREEK SMALL LETTER UPSILON WITH DIALYTIKA
+0xfc U+03b0 #GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+0xfd U+03ce #GREEK SMALL LETTER OMEGA WITH TONOS
+0xfe U+25a0 #BLACK SQUARE
+0xff U+00a0 #NO-BREAK SPACE
+
diff --git a/src/chrtrans/def7_uni.tbl b/src/chrtrans/def7_uni.tbl
new file mode 100644
index 0000000..14b7ac4
--- /dev/null
+++ b/src/chrtrans/def7_uni.tbl
@@ -0,0 +1,2951 @@
+# $LynxId: def7_uni.tbl,v 1.33 2020/01/21 22:21:19 tom Exp $
+# Default 7bit replacements.
+#
+# This table is very important and should not be excluded from the distribution
+# since this is a default fallback for any 8bit user's "display character set"
+# which (nearly) of 256 chars and could not map a rich Unicode repertoire.
+#
+# Note: there are a few rare replacement strings with trailing spaces
+# which should be enclosed as C strings like "... " to make things obvious
+# (and doing that we should escape \ as \134 and escape " as \" or \042
+# but this is really rare).
+#
+
+#The MIME name of this charset.
+Mus-ascii
+
+# Like any other charset this may be selected as "display character set":
+#Name as a Display Charset (used on Options screen)
+O7 bit approximations (US-ASCII)
+
+# Shall this become the "default" translation table? YES!
+# There has to be exactly one table marked as "default".
+D1
+
+
+# us-ascii characters should not normally pass here,
+# they are always processed directly but let declare them here:
+0x20-0x7e idem
+
+
+# NO-BREAK SPACE,
+# should not happen (processed in the code):
+#U+00a0:NS
+U+00a1:!
+U+00a2:-c-
+U+00a3:-L-
+U+00a4:CUR
+U+00a5:YEN
+U+00a6:|
+U+00a7:S:
+U+00a8:"
+# COPYRIGHT SIGN:
+U+00a9:(c)
+U+00aa:-a
+U+00ab:<<
+U+00ac:NOT
+# SOFT HYPHEN,
+# should not happen (processed in the code):
+#U+00ad:-
+# REGISTERED SIGN:
+U+00ae:(R)
+U+00af:-
+U+00b0:DEG
+U+00b1:+-
+U+00b2:^2
+U+00b3:^3
+U+00b4:'
+# My -> u
+U+00b5:u
+U+00b6:P:
+U+00b7:.
+U+00b8:,
+U+00b9:^1
+U+00ba:-o
+U+00bb:>>
+U+00bc: 1/4
+U+00bd: 1/2
+U+00be: 3/4
+U+00bf:?
+0x41 U+00c0-U+00c3
+U+00c4 "Ae" # &Auml;, not the best choice for some languages.
+U+00c5:AA
+U+00c6:AE
+U+00c7:C,
+0x45 U+00c8-U+00cb
+0x49 U+00cc-U+00cf
+U+00d0:D-
+0x4e U+00d1
+0x4f U+00d2-U+00d5
+U+00d6 "Oe" # &Ouml;, not the best choice for some languages.
+U+00d7: *
+U+00d8:O/
+0x55 U+00d9-U+00db
+U+00dc "Ue" # &Uuml;, not the best choice for some languages.
+0x59 U+00dd
+U+00de:TH
+U+00df:ss
+U+00e0:`a
+0x61 U+00e1-U+00e3
+U+00e4 "ae" # &auml;, not the best choice for some languages.
+U+00e5:aa
+U+00e6:ae
+U+00e7:c,
+0x65 U+00e8-U+00eb
+U+00ec:`i
+0x69 U+00ed-U+00ef
+U+00f0:d-
+0x6e U+00f1
+0x6f U+00f2-U+00f5
+U+00f6 "oe" # &ouml;, not the best choice for some languages.
+U+00f7:-:
+U+00f8:o/
+0x75 U+00f9-U+00fb
+U+00fc "ue" # &uuml;, not the best choice for some languages.
+0x79 U+00fd
+U+00fe:th
+0x79 U+00ff
+# end of latin-1 repertoire
+0x41 U+0100 U+0102 U+0104 # A
+0x61 U+0101 U+0103 U+0105 # a
+0x43 U+0106 U+010a U+010c # C
+U+0108 "Ch"
+# The following line is an example for mapping several accented versions
+# of small letter 'c' to 'c':
+0x63 U+0107 U+010b U+010d # c
+U+0109 "ch"
+0x44 U+010e
+0x64 U+010f
+U+0110:D/
+U+0111:d/
+0x45 U+0112 U+0114 U+0116 U+0118 U+011a # E
+0x65 U+0113 U+0115 U+0117 U+0119 U+011b # e
+0x47 U+011e U+0120 U+0122 # G
+0x67 U+011f U+0121 U+0123 # g
+U+011C "Gh"
+U+011D "gh"
+U+0124 "Hh"
+U+0125" "hh"
+U+0126:H/
+0x48 U+0127 # LATIN SMALL LETTER H BAR -> H
+0x49 U+0128 U+012a U+012c U+012e U+0130 # I
+0x69 U+0129 U+012b U+012d U+012f U+0131 # i
+U+0132:IJ
+U+0133:ij
+U+0134 "Jh"
+U+0135 "jh"
+0x4b U+0136
+0x6b U+0137
+U+0138:kk
+0x4c U+0139 U+013b U+013d # L
+0x6c U+013a U+013c U+013e # l
+U+013f:L.
+U+0140:l.
+U+0141:L/
+U+0142:l/
+0x4e U+0143 U+0145 U+0147 # N
+0x6e U+0144 U+0146 U+0148 # n
+U+0149:'n
+U+014a:NG
+0x4e U+014B # LATIN SMALL LETTER ENG -> N
+0x4f U+014c U+014e # O
+0x6f U+014d U+014f # o
+U+0150:O"
+U+0151:o"
+U+0152:OE
+U+0153:oe
+0x52 U+0154 U+0156 U+0158 # R
+0x72 U+0155 U+0157 U+0159 # r
+0x53 U+015a U+015e U+0160 U+0218 # S
+0x73 U+015b U+015f U+0161 U+0219 # s
+U+015C "Sh"
+U+015d "sh"
+0x54 U+0162 U+0164 U+021a # T
+0x74 U+0163 U+0165 U+021b # t
+U+0166:T/
+U+0167:t/
+0x55 U+0168 U+016a U+016c U+016e U+0172 # U
+0x75 U+0169 U+016b U+016d U+016f U+0173 # u
+U+0170:U"
+U+0171:u"
+0x57 U+0174
+0x77 U+0175
+0x59 U+0176 U+0178
+0x79 U+0177
+0x5a U+0179 U+017b U+017d U+021d
+0x7a U+017a U+017c U+017e
+U+017f:s1
+U+0187:C2
+U+0188:c2
+U+0191:F2
+U+0192: f
+U+0198:K2
+U+0199:k2
+U+01a0:O9
+U+01a1:o9
+U+01a2:OI
+U+01a3:oi
+U+01a6:yr
+U+01af:U9
+U+01b0:u9
+U+01b5:Z/
+U+01b6:z/
+U+01b7:ED
+0x41 U+01cd
+0x61 U+01ce
+0x49 U+01cf
+0x69 U+01d0
+0x4f U+01d1
+0x6f U+01d2
+0x55 U+01d3
+0x75 U+01d4
+U+01d5:U:-
+U+01d6:u:-
+U+01d7:U:'
+U+01d8:u:'
+U+01d9:U:<
+U+01da:u:<
+U+01db:U:!
+U+01dc:u:!
+U+01de:A1
+U+01df:a1
+U+01e0:A7
+U+01e1:a7
+U+01e2:A3
+U+01e3:a3
+U+01e4:G/
+U+01e5:g/
+0x47 U+01e6
+0x67 U+01e7
+0x4b U+01e8
+0x6b U+01e9
+0x4f U+01ea
+0x6f U+01eb
+U+01ec:O1
+U+01ed:o1
+U+01ee:EZ
+U+01ef:ez
+0x6a U+01f0
+0x47 U+01f4
+0x67 U+01f5
+U+01fa:AA'
+U+01fb:aa'
+U+01fc:AE'
+U+01fd:ae'
+U+01fe:O/'
+U+01ff:o/'
+U+0200:A!!
+U+0201:a!!
+U+0202:A)
+U+0203:a)
+U+0204:E!!
+U+0205:e!!
+U+0206:E)
+U+0207:e)
+U+0208:I!!
+U+0209:i!!
+U+020a:I)
+U+020b:i)
+U+020c:O!!
+U+020d:o!!
+U+020e:O)
+U+020f:o)
+U+0210:R!!
+U+0211:r!!
+U+0212:R)
+U+0213:r)
+U+0214:U!!
+U+0215:u!!
+U+0216:U)
+U+0217:u)
+
+# IPA symbols, from
+# Linkname: FAQ: Representing IPA Phonetics in ASCII
+# URL: http://www.hpl.hp.com/personal/Evan_Kirshenbaum/IPA/faq.html
+# (corrected in Russian Cyrillic area).
+# (corrected in Greek area).
+#
+0x41 U+0251 # LATIN SMALL LETTER SCRIPT A -> A
+U+0252:A.
+U+0253:b`
+0x4f U+0254 # LATIN SMALL LETTER OPEN O -> O
+U+0256:d.
+U+0257:d`
+U+0258:@<umd>
+0x40 U+0259 # LATIN SMALL LETTER SCHWA -> @
+0x52 U+025A # LATIN SMALL LETTER SCHWA HOOK -> R
+0x45 U+025B # LATIN SMALL LETTER EPSILON -> E
+U+025c:V"
+U+025d:R<umd>
+U+025e:O"
+0x4a U+025F # LATIN SMALL LETTER DOTLESS J BAR -> J
+U+0260:g`
+0x67 U+0261 # LATIN SMALL LETTER SCRIPT G
+0x47 U+0262 # LATIN LETTER SMALL CAPITAL G
+0x51 U+0263 # LATIN SMALL LETTER GAMMA -> Q
+U+0264:o-
+U+0265:j<rnd>
+U+0266:h<?>
+U+0268:i"
+0x49 U+026A U+0269 # LATIN LETTER SMALL CAPITAL I, LATIN SMALL LETTER IOTA
+0x4c U+026B # LATIN SMALL LETTER L WITH MIDDLE TILDE
+0x4c U+026C # LATIN SMALL LETTER L BELT
+U+026d:l.
+U+026e:z<lat>
+U+026f:u-
+U+0270:j<vel>
+0x4d U+0271 # LATIN SMALL LETTER M HOOK
+U+0273:n.
+U+0274:n"
+U+0275:@.
+U+0276:&.
+0x55 U+0277 # LATIN SMALL LETTER CLOSED OMEGA -> U
+0x72 U+0279 # LATIN SMALL LETTER TURNED R -> r
+U+027a:*<lat>
+U+027b:r.
+U+027d:*.
+0x2a U+027E # LATIN SMALL LETTER FISHHOOK R -> *
+U+0280:r"
+0x52 U+0280 # LATIN LETTER SMALL CAPITAL R -> R
+U+0281:g"
+U+0282:s.
+0x53 U+0283 # LATIN SMALL LETTER ESH -> S
+U+0284:J`
+U+0287:t!
+U+0288:t.
+U+0289:u"
+0x55 U+028A # LATIN SMALL LETTER UPSILON -> U
+U+028b:r<lbd>
+0x56 U+028C # LATIN SMALL LETTER TURNED V -> V
+U+028d:w<vls>
+U+028e:l^
+U+028f:I.
+U+0290:z.
+U+0292:Z
+0x3f U+0294 # LATIN SMALL LETTER GLOTTAL STOP -> ?
+U+0295:H<vcd>
+U+0296:l!
+U+0297:c!
+U+0298:p!
+U+0299:b<trl>
+U+029b:G`
+0x6a U+029d # LATIN SMALL LETTER CROSSED-TAIL J
+U+029e:k!
+0x4c U+029F # LATIN LETTER SMALL CAPITAL L
+U+02a0:q`
+U+02a4:d3
+U+02a6:ts
+U+02a7:tS
+U+02b0:<h>
+U+02b1:<?>
+0x3b U+02b2 U+0321
+U+02b3:<r>
+U+02b7:<w>
+U+02bb:;S
+0x27 U+02bc
+0x27 U+02bd
+U+02c6:^
+U+02c7:'<
+U+02c8:|
+U+02c9:1-
+U+02cb:1!
+0x3a U+02d0
+U+02d1 ":\\"
+0x2b U+02d6
+0x2d U+02d7
+U+02d8:'(
+U+02d9:'.
+U+02da:'0
+U+02db:';
+U+02dc:~
+U+02dd:'"
+U+02e5:_T
+U+02e6:_H
+U+02e7:_M
+U+02e8:_L
+U+02e9:_B
+U+02ec:_v
+U+02ee:''
+0x60 U+0300
+0x27 U+0301
+0x5e U+0302
+0x7e U+0303 U+0334
+U+030b:''
+0x7c U+030d
+U+030e:||
+U+030f:``
+0x2e U+0322 U+0323
+U+0324:<?>
+U+0325:<o>
+0x2c U+0326 U+0327
+0x2d U+0329
+0x5b U+032a
+U+032b:<w>
+U+0334:<H>
+0x2f U+0337 U+0338
+U+0340:`
+U+0341:'
+U+0342:~
+U+0344:'%
+U+0345:j3
+U+0347:=
+U+0360:~~
+U+0374:'
+U+0375:,
+U+037a:j3
+U+037e:?%
+U+0384:'*
+U+0385:'%
+# Greek letters
+U+0386:A'
+U+0387:.*
+U+0388:E'
+U+0389:Y%
+U+038a:I'
+U+038c:O'
+U+038e:U%
+U+038f:W%
+U+0390:i3
+U+0391:A
+U+0392:B
+U+0393:G
+U+0394:D
+U+0395:E
+U+0396:Z
+U+0397:Y
+U+0398:TH
+U+0399:I
+U+039a:K
+U+039b:L
+U+039c:M
+U+039d:N
+U+039e:C
+U+039f:O
+U+03a0:P
+U+03a1:R
+U+03a3:S
+U+03a4:T
+U+03a5:U
+U+03a6:F
+U+03a7:X
+U+03a8:Q
+U+03a9:W*
+U+03aa:J
+U+03ab:V*
+U+03ac:a'
+U+03ad:e'
+U+03ae:y%
+U+03af:i'
+U+03b0:u3
+U+03b1:a
+U+03b2:b
+U+03b3:g
+U+03b4:d
+U+03b5:e
+U+03b6:z
+U+03b7:y
+U+03b8:th
+U+03b9:i
+U+03ba:k
+U+03bb:l
+U+03bc:m
+U+03bd:n
+U+03be:c
+U+03bf:o
+U+03c0:p
+U+03c1:r
+U+03c2:*s
+U+03c3:s
+U+03c4:t
+U+03c5:u
+U+03c6:f
+U+03c7:x
+U+03c8:q
+U+03c9:w
+U+03ca:j
+U+03cb:v*
+U+03cc:o'
+U+03cd:u%
+U+03ce:w%
+# Greek symbols
+U+03d0 "beta "
+U+03d1 "theta "
+U+03d2 "upsi "
+U+03d5 "phi "
+U+03d6 "pi "
+U+03d7:k.
+U+03da:T3
+U+03db:t3
+U+03dc:M3
+U+03dd:m3
+U+03de:K3
+U+03df:k3
+U+03e0:P3
+U+03e1:p3
+U+03f0 "kappa "
+U+03f1 "rho "
+U+03f3:J
+U+03f4:'%
+U+03f5:j3
+# Cyrillic capital letters
+U+0402:D%
+U+0403:G%
+U+0404:IE
+U+0405:DS
+U+0406:II
+U+0407:YI
+U+0408:J%
+U+0409:LJ
+U+040a:NJ
+U+040b:Ts
+U+040c:KJ
+U+040e:V%
+U+040f:DZ
+# Russian Cyrillic letters, transliterated
+U+0401:IO
+U+0410:A
+U+0411:B
+U+0412:V
+U+0413:G
+U+0414:D
+U+0415:E
+U+0416:ZH
+U+0417:Z
+U+0418:I
+U+0419:J
+U+041a:K
+U+041b:L
+U+041c:M
+U+041d:N
+U+041e:O
+U+041f:P
+U+0420:R
+U+0421:S
+U+0422:T
+U+0423:U
+U+0424:F
+U+0425:H
+U+0426:C
+U+0427:CH
+U+0428:SH
+U+0429:SCH
+U+042a:"
+U+042b:Y
+U+042c:'
+U+042d:`E
+U+042e:YU
+U+042f:YA
+U+0430:a
+U+0431:b
+U+0432:v
+U+0433:g
+U+0434:d
+U+0435:e
+U+0436:zh
+U+0437:z
+U+0438:i
+U+0439:j
+U+043a:k
+U+043b:l
+U+043c:m
+U+043d:n
+U+043e:o
+U+043f:p
+U+0440:r
+U+0441:s
+U+0442:t
+U+0443:u
+U+0444:f
+U+0445:h
+U+0446:c
+U+0447:ch
+U+0448:sh
+U+0449:sch
+U+044a:"
+U+044b:y
+U+044c:'
+U+044d:`e
+U+044e:yu
+U+044f:ya
+U+0451:io
+# end of Russian Cyrillic letters.
+# Cyrillic small letters (and some archaic)
+U+0452:d%
+U+0453:g%
+U+0454:ie
+U+0455:ds
+U+0456:ii
+U+0457:yi
+U+0458:j%
+U+0459:lj
+U+045a:nj
+U+045b:ts
+U+045c:kj
+U+045e:v%
+U+045f:dz
+U+0462:Y3
+U+0463:y3
+U+046a:O3
+U+046b:o3
+U+0472:F3
+U+0473:f3
+U+0474:V3
+U+0475:v3
+U+0480:C3
+U+0481:c3
+U+0490:G3
+U+0491:g3
+U+04d4:AE
+U+04d5:ae
+# These may make Yiddish slightly more readable, until we have
+# something better.
+
+0x69 U+05b4 # i
+0x61 U+05b7 # a
+0x6f U+05b8 # o
+0x75 U+05bc # u
+0x68 U+05bf # h
+0x3a U+05c2 # :
+
+0x76 U+05f0 # v
+U+05f1:oy
+U+05f2:ey
+
+# U+05d0:A+
+0x23 U+05d0 # '#'
+
+U+05d1:B+
+U+05d2:G+
+U+05d3:D+
+U+05d4:H+
+U+05d5:W+
+U+05d6:Z+
+U+05d7:X+
+U+05d8:Tj
+U+05d9:J+
+U+05da:K%
+U+05db:K+
+U+05dc:L+
+U+05dd:M%
+U+05de:M+
+U+05df:N%
+U+05e0:N+
+U+05e1:S+
+U+05e2:E+
+U+05e3:P%
+U+05e4:P+
+U+05e5:Zj
+U+05e6:ZJ
+U+05e7:Q+
+U+05e8:R+
+U+05e9:Sh
+U+05ea:T+
+
+U+060c:,+
+U+061b:;+
+U+061f:?+
+U+0621:H'
+U+0622:aM
+U+0623:aH
+U+0624:wH
+U+0625:ah
+U+0626:yH
+U+0627:a+
+U+0628:b+
+U+0629:tm
+U+062a:t+
+U+062b:tk
+U+062c:g+
+U+062d:hk
+U+062e:x+
+U+062f:d+
+U+0630:dk
+U+0631:r+
+U+0632:z+
+U+0633:s+
+U+0634:sn
+U+0635:c+
+U+0636:dd
+U+0637:tj
+U+0638:zH
+U+0639:e+
+U+063a:i+
+U+0640:++
+U+0641:f+
+U+0642:q+
+U+0643:k+
+U+0644:l+
+U+0645:m+
+U+0646:n+
+U+0647:h+
+U+0648:w+
+U+0649:j+
+U+064a:y+
+U+064b::+
+U+064c:"+
+U+064d:=+
+U+064e:/+
+U+064f:'+
+U+0650:1+
+U+0651:3+
+U+0652:0+
+U+0660:0a
+U+0661:1a
+U+0662:2a
+U+0663:3a
+U+0664:4a
+U+0665:5a
+U+0666:6a
+U+0667:7a
+U+0668:8a
+U+0669:9a
+U+0670:aS
+U+067e:p+
+U+0681:hH
+U+0686:tc
+U+0698:zj
+U+06a4:v+
+U+06af:gf
+U+06f0:0a
+U+06f1:1a
+U+06f2:2a
+U+06f3:3a
+U+06f4:4a
+U+06f5:5a
+U+06f6:6a
+U+06f7:7a
+U+06f8:8a
+U+06f9:9a
+
+# Replacement strings for Ethiopic characters
+U+1200:he
+U+1201:hu
+U+1202:hi
+U+1203:ha
+U+1204:hE
+0x68 U+1205 #:h
+U+1206:ho
+U+1208:le
+U+1209:lu
+U+120A:li
+U+120B:la
+U+120C:lE
+0x6c U+120D #:l
+U+120E:lo
+U+120F:lWa
+U+1210:He
+U+1211:Hu
+U+1212:Hi
+U+1213:Ha
+U+1214:HE
+0x48 U+1215 #:H
+U+1216:Ho
+U+1217:HWa
+U+1218:me
+U+1219:mu
+U+121A:mi
+U+121B:ma
+U+121C:mE
+0x6d U+121D #:m
+U+121E:mo
+U+121F:mWa
+U+1220:`se
+U+1221:`su
+U+1222:`si
+U+1223:`sa
+U+1224:`sE
+U+1225:`s
+U+1226:`so
+U+1227:`sWa
+U+1228:re
+U+1229:ru
+U+122A:ri
+U+122B:ra
+U+122C:rE
+0x72 U+122D #:r
+U+122E:ro
+U+122F:rWa
+U+1230:se
+U+1231:su
+U+1232:si
+U+1233:sa
+U+1234:sE
+0x73 U+1235 #:s
+U+1236:so
+U+1237:sWa
+U+1238:xe
+U+1239:xu
+U+123A:xi
+U+123B:xa
+U+123C:xE
+U+123D:xa
+U+123E:xo
+U+123F:xWa
+U+1240:qe
+U+1241:qu
+U+1242:qi
+U+1243:qa
+U+1244:qE
+0x71 U+1245 #:q
+U+1246:qo
+U+1248:qWe
+U+124A:qWi
+U+124B:qWa
+U+124C:qWE
+U+124D:qW
+U+1250:Qe
+U+1251:Qu
+U+1252:Qi
+U+1253:Qa
+U+1254:QE
+0x51 U+1255 #:Q
+U+1256:Qo
+U+1258:QWe
+U+125A:QWi
+U+125B:QWa
+U+125C:QWE
+U+125D:QW
+U+1260:be
+U+1261:bu
+U+1262:bi
+U+1263:ba
+U+1264:bE
+0x62 U+1265 #:b
+U+1266:bo
+U+1267:bWa
+U+1268:ve
+U+1269:vu
+U+126A:vi
+U+126B:va
+U+126C:vE
+0x76 U+126D #:v
+U+126E:vo
+U+126F:vWa
+U+1270:te
+U+1271:tu
+U+1272:ti
+U+1273:ta
+U+1274:tE
+0x74 U+1275 #:t
+U+1276:to
+U+1277:tWa
+U+1278:ce
+U+1279:cu
+U+127A:ci
+U+127B:ca
+U+127C:cE
+0x63 U+127D #:c
+U+127E:co
+U+127F:cWa
+U+1280:`he
+U+1281:`hu
+U+1282:`hi
+U+1283:`ha
+U+1284:`hE
+U+1285:`h
+U+1286:`ho
+U+1288:hWe
+U+128A:hWi
+U+128B:hWa
+U+128C:hWE
+U+128D:hW
+U+1290:na
+U+1291:nu
+U+1292:ni
+U+1293:na
+U+1294:nE
+0x6e U+1295 #:n
+U+1296:no
+U+1297:nWa
+U+1298:Ne
+U+1299:Nu
+U+129A:Ni
+U+129B:Na
+U+129C:NE
+0x4e U+129D #:N
+U+129E:No
+U+129F:NWa
+0x65 U+12A0 #:e
+0x75 U+12A1 #:u
+0x69 U+12A2 #:i
+0x61 U+12A3 #:a
+0x45 U+12A4 #:E
+0x49 U+12A5 #:I
+0x6f U+12A6 #:o
+U+12A7:e3
+U+12A8:ke
+U+12A9:ku
+U+12AA:ki
+U+12AB:ka
+U+12AC:kE
+0x6b U+12AD #:k
+U+12AE:ko
+U+12B0:kWe
+U+12B2:kWi
+U+12B3:kWa
+U+12B4:kWE
+U+12B5:kW
+U+12B8:Ke
+U+12B9:Ku
+U+12BA:Ki
+U+12BB:Ka
+U+12BC:KE
+0x4b U+12BD #:K
+U+12BE:Ko
+U+12C0:KWe
+U+12C2:KWi
+U+12C3:KWa
+U+12C4:KWE
+U+12C5:KW
+U+12C8:we
+U+12C9:wu
+U+12CA:wi
+U+12CB:wa
+U+12CC:wE
+0x77 U+12CD #:w
+U+12CE:wo
+U+12D0:`e
+U+12D1:`u
+U+12D2:`i
+U+12D3:`a
+U+12D4:`E
+U+12D5:`I
+U+12D6:`o
+U+12D8:ze
+U+12D9:zu
+U+12DA:zi
+U+12DB:za
+U+12DC:zE
+0x7a U+12DD #:z
+U+12DE:zo
+U+12DF:zWa
+U+12E0:Ze
+U+12E1:Zu
+U+12E2:Zi
+U+12E3:Za
+U+12E4:ZE
+0x5a U+12E5 #:Z
+U+12E6:Zo
+U+12E7:ZWa
+U+12E8:ye
+U+12E9:yu
+U+12EA:yi
+U+12EB:ya
+U+12EC:yE
+0x79 U+12ED #:y
+U+12EE:yo
+U+12EF:yWa
+U+12F0:de
+U+12F1:du
+U+12F2:di
+U+12F3:da
+U+12F4:dE
+0x64 U+12F5 #:d
+U+12F6:do
+U+12F7:dWa
+U+12F8:De
+U+12F9:Du
+U+12FA:Di
+U+12FB:Da
+U+12FC:DE
+0x44 U+12FD #:D
+U+12FE:Do
+U+12FF:DWa
+U+1300:je
+U+1301:ju
+U+1302:ji
+U+1303:ja
+U+1304:jE
+0x6a U+1305 #:j
+U+1306:jo
+U+1307:jWa
+U+1308:ga
+U+1309:gu
+U+130A:gi
+U+130B:ga
+U+130C:gE
+0x67 U+130D #:g
+U+130E:go
+U+1310:gWu
+U+1312:gWi
+U+1313:gWa
+U+1314:gWE
+U+1315:gW
+U+1318:Ge
+U+1319:Gu
+U+131A:Gi
+U+131B:Ga
+U+131C:GE
+0x47 U+131D #:G
+U+131E:Go
+U+131F:GWa
+U+1320:Te
+U+1321:Tu
+U+1322:Ti
+U+1323:Ta
+U+1324:TE
+0x54 U+1325 #:T
+U+1326:To
+U+1327:TWa
+U+1328:Ce
+U+1329:Ca
+U+132A:Cu
+U+132B:Ca
+U+132C:CE
+0x43 U+132D #:C
+U+132E:Co
+U+132F:CWa
+U+1330:Pe
+U+1331:Pu
+U+1332:Pi
+U+1333:Pa
+U+1334:PE
+0x50 U+1335 #:P
+U+1336:Po
+U+1337:PWa
+U+1338:SWe
+U+1339:SWu
+U+133A:SWi
+U+133B:SWa
+U+133C:SWE
+U+133D:SW
+U+133E:SWo
+U+133F:SWa
+U+1340:`Sa
+U+1341:`Su
+U+1342:`Si
+U+1343:`Sa
+U+1344:`SE
+U+1345:`S
+U+1346:`So
+U+1348:fa
+U+1349:fu
+U+134A:fi
+U+134B:fa
+U+134C:fE
+0x6f U+134D #:f
+U+134E:fo
+U+134F:fWa
+U+1350:pe
+U+1351:pu
+U+1352:pi
+U+1353:pa
+U+1354:pE
+0x70 U+1355 #:p
+U+1356:po
+U+1357:pWa
+U+1358:mYa
+U+1359:rYa
+U+135A:fYa
+# ETHIOPIC SPACE U+1360 mapped to ASCII space
+0x20 U+1360
+0x3a U+1361 #::
+U+1362:::
+0x2c U+1363 #:,
+U+1364:;
+U+1365:-:
+U+1366::-
+U+1367:`?
+U+1368::|:
+U+1369:`1
+U+136A:`2
+U+136B:`3
+U+136C:`4
+U+136D:`5
+U+136E:`6
+U+136F:`7
+U+1370:`8
+U+1371:`9
+U+1372:`10
+U+1373:`20
+U+1374:`30
+U+1375:`40
+U+1376:`50
+U+1377:`60
+U+1378:`70
+U+1379:`80
+U+137A:`90
+U+137B:`100
+U+137C:`10000
+
+
+U+1e00:A-0
+U+1e01:a-0
+U+1e02:B.
+U+1e03:b.
+U+1e04:B-.
+U+1e05:b-.
+U+1e06:B_
+U+1e07:b_
+U+1e08:C,'
+U+1e09:c,'
+U+1e0a:D.
+U+1e0b:d.
+U+1e0c:D-.
+U+1e0d:d-.
+U+1e0e:D_
+U+1e0f:d_
+U+1e10:D,
+U+1e11:d,
+U+1e12:D->
+U+1e13:d->
+U+1e14:E-!
+U+1e15:e-!
+U+1e16:E-'
+U+1e17:e-'
+U+1e18:E->
+U+1e19:e->
+U+1e1a:E-?
+U+1e1b:e-?
+U+1e1c:E,(
+U+1e1d:e,(
+U+1e1e:F.
+U+1e1f:f.
+U+1e20:G-
+U+1e21:g-
+U+1e22:H.
+U+1e23:h.
+U+1e24:H-.
+U+1e25:h-.
+U+1e26:H:
+U+1e27:h:
+U+1e28:H,
+U+1e29:h,
+U+1e2a:H-(
+U+1e2b:h-(
+U+1e2c:I-?
+U+1e2d:i-?
+U+1e2e:I:'
+U+1e2f:i:'
+U+1e30:K'
+U+1e31:k'
+U+1e32:K-.
+U+1e33:k-.
+U+1e34:K_
+U+1e35:k_
+U+1e36:L-.
+U+1e37:l-.
+U+1e38:L--.
+U+1e39:l--.
+U+1e3a:L_
+U+1e3b:l_
+U+1e3c:L->
+U+1e3d:l->
+U+1e3e:M'
+U+1e3f:m'
+U+1e40:M.
+U+1e41:m.
+U+1e42:M-.
+U+1e43:m-.
+U+1e44:N.
+U+1e45:n.
+U+1e46:N-.
+U+1e47:n-.
+U+1e48:N_
+U+1e49:n_
+U+1e4a:N->
+U+1e4b:n->
+U+1e4c:O?'
+U+1e4d:o?'
+U+1e4e:O?:
+U+1e4f:o?:
+U+1e50:O-!
+U+1e51:o-!
+U+1e52:O-'
+U+1e53:o-'
+U+1e54:P'
+U+1e55:p'
+U+1e56:P.
+U+1e57:p.
+U+1e58:R.
+U+1e59:r.
+U+1e5a:R-.
+U+1e5b:r-.
+U+1e5c:R--.
+U+1e5d:r--.
+U+1e5e:R_
+U+1e5f:r_
+U+1e60:S.
+U+1e61:s.
+U+1e62:S-.
+U+1e63:s-.
+U+1e64:S'.
+U+1e65:s'.
+U+1e66:S<.
+U+1e67:s<.
+U+1e68:S.-.
+U+1e69:s.-.
+U+1e6a:T.
+U+1e6b:t.
+U+1e6c:T-.
+U+1e6d:t-.
+U+1e6e:T_
+U+1e6f:t_
+U+1e70:T->
+U+1e71:t->
+U+1e72:U--:
+U+1e73:u--:
+U+1e74:U-?
+U+1e75:u-?
+U+1e76:U->
+U+1e77:u->
+U+1e78:U?'
+U+1e79:u?'
+U+1e7a:U-:
+U+1e7b:u-:
+U+1e7c:V?
+U+1e7d:v?
+U+1e7e:V-.
+U+1e7f:v-.
+U+1e80:W!
+U+1e81:w!
+U+1e82:W'
+U+1e83:w'
+U+1e84:W:
+U+1e85:w:
+U+1e86:W.
+U+1e87:w.
+U+1e88:W-.
+U+1e89:w-.
+U+1e8a:X.
+U+1e8b:x.
+U+1e8c:X:
+U+1e8d:x:
+U+1e8e:Y.
+U+1e8f:y.
+U+1e90:Z>
+U+1e91:z>
+U+1e92:Z-.
+U+1e93:z-.
+U+1e94:Z_
+U+1e95:z_
+U+1e96:h_
+U+1e97:t:
+U+1e98:w0
+U+1e99:y0
+U+1ea0:A-.
+U+1ea1:a-.
+U+1ea2:A2
+U+1ea3:a2
+U+1ea4:A>'
+U+1ea5:a>'
+U+1ea6:A>!
+U+1ea7:a>!
+U+1ea8:A>2
+U+1ea9:a>2
+U+1eaa:A>?
+U+1eab:a>?
+U+1eac:A>-.
+U+1ead:a>-.
+U+1eae:A('
+U+1eaf:a('
+U+1eb0:A(!
+U+1eb1:a(!
+U+1eb2:A(2
+U+1eb3:a(2
+U+1eb4:A(?
+U+1eb5:a(?
+U+1eb6:A(-.
+U+1eb7:a(-.
+U+1eb8:E-.
+U+1eb9:e-.
+U+1eba:E2
+U+1ebb:e2
+U+1ebc:E?
+U+1ebd:e?
+U+1ebe:E>'
+U+1ebf:e>'
+U+1ec0:E>!
+U+1ec1:e>!
+U+1ec2:E>2
+U+1ec3:e>2
+U+1ec4:E>?
+U+1ec5:e>?
+U+1ec6:E>-.
+U+1ec7:e>-.
+U+1ec8:I2
+U+1ec9:i2
+U+1eca:I-.
+U+1ecb:i-.
+U+1ecc:O-.
+U+1ecd:o-.
+U+1ece:O2
+U+1ecf:o2
+U+1ed0:O>'
+U+1ed1:o>'
+U+1ed2:O>!
+U+1ed3:o>!
+U+1ed4:O>2
+U+1ed5:o>2
+U+1ed6:O>?
+U+1ed7:o>?
+U+1ed8:O>-.
+U+1ed9:o>-.
+U+1eda:O9'
+U+1edb:o9'
+U+1edc:O9!
+U+1edd:o9!
+U+1ede:O92
+U+1edf:o92
+U+1ee0:O9?
+U+1ee1:o9?
+U+1ee2:O9-.
+U+1ee3:o9-.
+U+1ee4:U-.
+U+1ee5:u-.
+U+1ee6:U2
+U+1ee7:u2
+U+1ee8:U9'
+U+1ee9:u9'
+U+1eea:U9!
+U+1eeb:u9!
+U+1eec:U92
+U+1eed:u92
+U+1eee:U9?
+U+1eef:u9?
+U+1ef0:U9-.
+U+1ef1:u9-.
+U+1ef2:Y!
+U+1ef3:y!
+U+1ef4:Y-.
+U+1ef5:y-.
+U+1ef6:Y2
+U+1ef7:y2
+U+1ef8:Y?
+U+1ef9:y?
+0x61 U+1f00
+U+1f01:ha
+U+1f02:`a
+U+1f03:h`a
+U+1f04:a'
+U+1f05:ha'
+U+1f06:a~
+U+1f07:ha~
+0x41 U+1f08
+U+1f09:hA
+U+1f0a:`A
+U+1f0b:h`A
+U+1f0c:A'
+U+1f0d:hA'
+U+1f0e:A~
+U+1f0f:hA~
+U+1f11:he
+U+1f19:hE
+U+1f31:hi
+U+1f39:hI
+U+1f41:ho
+U+1f49:hO
+U+1f51:hu
+U+1f59:hU
+U+1fbf:,,
+U+1fc0:?*
+U+1fc1:?:
+U+1fcd:,!
+U+1fce:,'
+U+1fcf:?,
+U+1fdd:;!
+U+1fde:;'
+U+1fdf:?;
+U+1fe5:rh
+U+1fec:Rh
+U+1fed:!:
+U+1fef:!*
+U+1ffe:;;
+# General punctuation:
+0x20 U+2000 U+2002 U+2004-U+200A U+205F # spaces
+U+2001 " "
+U+2003 " "
+U+200e:(->)
+U+200f:(<-)
+U+200a:
+0x2d U+2010 U+2011 U+2013 U+2015 # hyphen-like
+U+2014 "--"
+U+2016:||
+U+2017:=2
+0x60 U+2018 # left single quotation mark <`>
+0x27 U+2019-U+201b # various single quotation marks <'>
+0x22 U+201c-U+201f # various double quotation marks <">
+U+2020:/-
+U+2021:/=
+U+2022 " o "
+U+2023 " > "
+0x2e U+2024
+U+2025:..
+U+2026:...
+U+2027:.
+U+2028 "\015"
+U+2029 "\015\012"
+
+# Don't want to see these:
+# POP DIRECTIONAL FORMATTING 202C
+U+202c:
+# LEFT-TO-RIGHT OVERRIDE 202D
+U+202d:
+
+U+202b ""
+U+202f ""
+U+2030: 0/00
+U+2031: 0/000
+U+2032:'
+U+2033:''
+U+2034:'''
+U+2035:`
+U+2036:``
+U+2037:```
+U+2038:^
+U+2039:<
+U+203a:>
+U+203b::X
+U+203c:!!
+U+203d:?!
+U+203e:'-
+U+2042:***
+U+2043 " - "
+U+2044:/
+U+2045:[-
+U+2046:-]
+U+2047:??
+U+2048:?!
+U+2049:!?
+U+204b:|P
+U+204e:*
+U+2051:**
+U+2052:./.
+U+2053:~
+U+2056 " .: "
+U+2057:''''
+U+2058 " .:. "
+U+2059 " :.: "
+U+205a " : "
+U+205b " .:. "
+U+205c ":+:"
+U+2044:/
+U+2047:??
+U+2048:?!
+U+2049:!?
+# end of General punctuation.
+U+2070:^0
+U+2074:^4
+U+2075:^5
+U+2076:^6
+U+2077:^7
+U+2078:^8
+U+2079:^9
+U+207a:^+
+U+207b:^-
+U+207c:^=
+U+207d:^(
+U+207e:^)
+U+207f:^n
+U+2080:_0
+U+2081:_1
+U+2082:_2
+U+2083:_3
+U+2084:_4
+U+2085:_5
+U+2086:_6
+U+2087:_7
+U+2088:_8
+U+2089:_9
+U+208a:_+
+U+208b:_-
+U+208c:_=
+U+208d:(
+U+208e:)
+# Old euro currency sign glyph:
+#U+20A0:CE
+U+20a1:C//
+U+20a2:Cr
+U+20a3:Ff
+U+20a4:Li
+U+20a5:m/
+U+20a6:N=
+U+20a7:Pt
+U+20a8:Rs
+U+20a9:W=
+U+20aa:rJ
+U+20ab:d_
+# New euro currency sign glyph:
+U+20AC:EUR
+U+20ad:K-
+U+20ae:T//
+U+20af:Dp
+U+20b1:P=
+U+20b2:G|
+U+20b3:A=
+U+20b5:C|
+U+2100:a/c
+U+2101:a/s
+U+2103:oC
+U+2104:CL
+U+2105:c/o
+U+2106:c/u
+U+2109:oF
+0x67 U+210a
+0x68 U+210e
+U+210f "\134hbar "
+U+2111:Im
+U+2113:l
+U+2116:No.
+U+2117:(P)
+U+2118:P
+U+211C:Re
+U+211e:Rx
+U+2120:(SM)
+U+2121:TEL
+# TRADE MARK SIGN:
+U+2122:(TM)
+U+2125:oz.
+U+2126:Ohm
+0x4b U+212A # Kelvin sign - K
+U+212b:Ang.
+U+212E:est.
+0x6f U+2134
+U+2135 "Aleph "
+U+2136 "Bet "
+U+2137 "Gimel "
+U+2138 "Dalet "
+U+213B: FAX
+U+2153: 1/3
+U+2154: 2/3
+U+2155: 1/5
+U+2156: 2/5
+U+2157: 3/5
+U+2158: 4/5
+U+2159: 1/6
+U+215a: 5/6
+U+215b: 1/8
+U+215c: 3/8
+U+215d: 5/8
+U+215e: 7/8
+U+215f: 1/
+U+2160:I
+U+2161:II
+U+2162:III
+U+2163:IV
+U+2164:V
+U+2165:VI
+U+2166:VII
+U+2167:VIII
+U+2168:IX
+U+2169:X
+U+216a:XI
+U+216b:XII
+U+216c:L
+U+216d:C
+U+216e:D
+U+216f:M
+U+2170:i
+U+2171:ii
+U+2172:iii
+U+2173:iv
+U+2174:v
+U+2175:vi
+U+2176:vii
+U+2177:viii
+U+2178:ix
+U+2179:x
+U+217a:xi
+U+217b:xii
+U+217c:l
+U+217d:c
+U+217e:d
+U+217f:m
+U+2180:1000RCD
+U+2181:5000R
+U+2182:10000R
+# Arrows
+U+2190:<-
+U+2191 "^|" # upwards arrow "-^"
+U+2192:->
+U+2193 "|v" # downwards arrow "-v"
+U+2194:<->
+U+2195 "^|v" # up down arrow "UD"
+U+2196:^\
+U+2197:/^
+U+2198:\v
+U+2199:v/
+U+219a:</-
+U+219b:-/>
+U+219c:<~
+U+219d:~>
+U+219e:<<-
+U+219f:^^|
+U+21a0:->>
+U+21a1:|vv
+U+21a2:<-<
+U+21a3:>->
+U+21a4:<-|
+U+21a5:^|_
+U+21a6:|->
+U+21a8 "^|v_" # up down arrow with base "UD-"
+U+21ad:<~>
+U+21ae:<-/->
+U+21af:Nv
+U+21b0:<^|
+U+21b1:|^>
+U+21b2:<v|
+U+21b3:|v>
+U+21b4:-v
+U+21B5:RET
+U+21ba:u<
+U+21bb:>u
+U+21bc:<-
+U+21bd:<-
+U+21be:^|
+U+21bf:^|
+U+21c0:->
+U+21c1:->
+U+21c2:|v
+U+21c3:|v
+U+21c4:<=>
+U+21c5:^||v
+U+21c6:<=>
+U+21c7:<<=
+U+21c8:^|^|
+U+21c9:=>>
+U+21ca:|v|v
+U+21cb:<=>
+U+21cc:<=>
+U+21cd:<=/=
+U+21ce:<=/=>
+U+21cf:=/=>
+U+21d0:<=
+U+21d1 "^||" # upwards double arrow "^^"
+U+21d2:=>
+U+21d3 "||v" # downwards double arrow "vv"
+U+21d4:<=>
+U+21d5:^||v
+U+21d6:^\\
+U+21d7://^
+U+21d8:\\v
+U+21d9:v//
+U+21da:<-=
+U+21db:=->
+U+21dc:<~
+U+21dd:~>
+U+21de:^|=|
+U+21df:|=|v
+U+21e0:<-
+U+21e1:^:
+U+21e2:->
+U+21e3::v
+U+21e4:|<-
+U+21e5:->|
+U+21e6:<-
+U+21e7:^|
+U+21e8:->
+U+21e9:|v
+U+21ea:^!
+U+21eb:^I
+U+21ec:^-I
+U+21ed:^|I
+U+21ee:^^|
+U+21ef:^^I
+U+21f0:|->
+U+21f2:\v_|
+U+21f3:^|v
+U+21f4:-o>
+U+21f5:|v^|
+U+21f6:=->>>
+U+21f7:<-|-
+U+21f8:-|->
+U+21f9:<-|->
+U+21fa:<-||-
+U+21fb:-||->
+U+21fc:<-||->
+U+21fd:<-
+U+21fe:->
+U+21ff:<->
+U+2200:FA
+U+2201:C
+U+2202:\partial
+U+2203:TE
+U+2204:TDNE
+U+2205:{}
+U+2206:Delta
+U+2207:Nabla
+U+2208:(-
+U+2209:!(-
+U+220a:(-
+U+220b:-)
+U+220c:!-)
+U+220d:-)
+U+220e " qed"
+U+220f:\prod
+U+2211:\sum
+U+2212:-
+U+2213:-/+
+U+2214:.+
+0x2f U+2215
+U+2216 " - "
+U+2217:*
+U+2218:Ob
+U+2219:sb
+U+221a " SQRT "
+U+221b " ROOT3 "
+U+221c " ROOT4 "
+U+221d:0(
+U+221e:infty
+U+221f:-L
+U+2220:-V
+U+2225:PP
+U+2226 " !PP "
+U+2227:AND
+U+2228:OR
+U+2229:(U
+U+222a:)U
+U+222b "\134int "
+U+222c "\134int\134int "
+U+222d "\134int\134int\134int "
+U+222e:Io
+U+2234:.:
+U+2235::.
+U+2236::R
+U+2237:::
+U+2238:.-
+U+2239:-:
+U+223c "?1" # Why not use "~" in this and following tilde-like characters? I'll assume someone more math-literate than I did this, and leave them alone.
+U+223e:CG
+U+2241:!~
+U+2242:-~
+U+2243:?-
+U+2244:!~-
+U+2245:?=
+U+2246:~!=
+U+2247:!~=
+# ALMOST EQUAL TO:
+U+2248:~=
+U+2249 " !~= "
+U+224b:~3
+U+224c:=?
+U+2250:=...
+U+2253:HI
+U+2254::=
+U+2255:=:
+U+2260:!=
+U+2261:=3
+U+2262 " !=3 "
+U+2263:=4
+U+2264:<=
+U+2265:>=
+U+2266:.LE.
+U+2267:.GE.
+U+2268:.LT.NOT.EQ.
+U+2269:.GT.NOT.EQ.
+U+226a:<<
+U+226b:>>
+U+226e:!<
+U+226f:!>
+U+2270:!<=
+U+2271:!>=
+U+2272:<~
+U+2273:>~
+U+2274:!<~
+U+2275:!>~
+U+2276 " <> "
+U+2277 " >< "
+U+2278 " !<> "
+U+2279 " !>< "
+U+2282:(C
+U+2283:)C
+U+2284 " !(C "
+U+2285 " !)C "
+U+2286:(_
+U+2287:)_
+U+2288:!(_
+U+2289:!)_
+U+228a:(!_
+U+228b:)!_
+U+228f:[
+U+2290:]
+U+2291:[_
+U+2292:]_
+U+2295 "(+)" # CIRCLED PLUS
+U+2296 "(-)" # CIRCLED MINUS
+U+2297 "(x)" # CIRCLED TIMES
+U+2298 "(/)" # CIRCLED DIVISION SLASH
+U+2299 "(.)" # CIRCLED DOT OPERATOR
+U+229A "(o)" # CIRCLED RING OPERATOR
+U+229B "(*)" # CIRCLED ASTERISK OPERATOR
+U+229C "(=)" # CIRCLED EQUALS
+U+229D "(-)" # CIRCLED DASH
+U+229E "[+]" # SQUARED PLUS
+U+229F "[-]" # SQUARED MINUS
+U+22A0 "[x]" # SQUARED TIMES
+U+22A1 "[.]" # SQUARED DOT OPERATOR
+U+22a5:-T
+U+22A7 " MODELS " # MODELS
+U+22A8 " TRUE " # TRUE
+U+22A9 " FORCES " # FORCES
+U+22AC " !PROVES " # DOES NOT PROVE
+U+22AD " NOT TRUE " # NOT TRUE
+U+22AE " !FORCES " # DOES NOT FORCE
+U+22B2 " NORMAL SUBGROUP OF "
+U+22B3 " CONTAINS AS NORMAL SUBGROUP "
+U+22B4 " NORMAL SUBGROUP OF OR EQUAL TO "
+U+22B5 " CONTAINS AS NORMAL SUBGROUP OR EQUAL TO "
+U+22B8 " MULTIMAP " # MULTIMAP
+U+22BA " INTERCALATE " # INTERCALATE
+U+22BB " XOR " # XOR
+U+22BC " NAND " # NAND
+U+22C5 " DOT " # DOT OPERATOR
+U+22c6 " STAR "
+U+22d6:<.
+U+22d7:>.
+U+22d8:<<<
+U+22d9:>>>
+U+22da:<=|>
+U+22db:>=|<
+U+22dc:=<
+U+22dd:=>
+U+22e2:![_
+U+22e3:!]_
+U+22e4:[!_
+U+22e5:]!_
+U+22e6:<!~
+U+22e7:>!~
+U+22ee::3
+U+22ef:.3
+U+2302:Eh
+U+2303:^
+U+2304:v
+U+2307:~~
+U+2308:<7
+U+2309:>7
+U+230a:7<
+U+230b:7>
+U+2310:NI
+U+2312:(A
+U+2315:TR
+U+2318:88
+U+231a:(-/)
+U+231b " >i< "
+U+2320:Iu
+U+2321:Il
+U+2322::(
+U+2323::)
+U+2324:|^|
+U+2325 " OPT "
+U+2326:[X>
+U+2327:[X]
+U+2328:[kbd]
+U+2329:</
+U+232a:/>
+U+232b:<X]
+U+2387 " ALT "
+U+2397:<-pp
+U+2398:pp->
+U+2399:[PrSc]
+U+239a:[ClSc]
+U+23ce " CR "
+U+23cf:_^_
+U+23da:GROUND
+U+2423:Vs
+U+2440:1h
+U+2441:3h
+U+2442:2h
+U+2443:4h
+U+2446:1j
+U+2447:2j
+U+2448:3j
+U+2449:4j
+U+2460:1-o
+U+2461:2-o
+U+2462:3-o
+U+2463:4-o
+U+2464:5-o
+U+2465:6-o
+U+2466:7-o
+U+2467:8-o
+U+2468:9-o
+U+2469:10-o
+U+246a:11-o
+U+246b:12-o
+U+246c:13-o
+U+246d:14-o
+U+246e:15-o
+U+246f:16-o
+U+2470:17-o
+U+2471:18-o
+U+2472:19-o
+U+2473:20-o
+U+2474:(1)
+U+2475:(2)
+U+2476:(3)
+U+2477:(4)
+U+2478:(5)
+U+2479:(6)
+U+247a:(7)
+U+247b:(8)
+U+247c:(9)
+U+247d:(10)
+U+247e:(11)
+U+247f:(12)
+U+2480:(13)
+U+2481:(14)
+U+2482:(15)
+U+2483:(16)
+U+2484:(17)
+U+2485:(18)
+U+2486:(19)
+U+2487:(20)
+U+2488:1.
+U+2489:2.
+U+248a:3.
+U+248b:4.
+U+248c:5.
+U+248d:6.
+U+248e:7.
+U+248f:8.
+U+2490:9.
+U+2491:10.
+U+2492:11.
+U+2493:12.
+U+2494:13.
+U+2495:14.
+U+2496:15.
+U+2497:16.
+U+2498:17.
+U+2499:18.
+U+249a:19.
+U+249b:20.
+U+249c:(a)
+U+249d:(b)
+U+249e:(c)
+U+249f:(d)
+U+24a0:(e)
+U+24a1:(f)
+U+24a2:(g)
+U+24a3:(h)
+U+24a4:(i)
+U+24a5:(j)
+U+24a6:(k)
+U+24a7:(l)
+U+24a8:(m)
+U+24a9:(n)
+U+24aa:(o)
+U+24ab:(p)
+U+24ac:(q)
+U+24ad:(r)
+U+24ae:(s)
+U+24af:(t)
+U+24b0:(u)
+U+24b1:(v)
+U+24b2:(w)
+U+24b3:(x)
+U+24b4:(y)
+U+24b5:(z)
+U+24b6:A-o
+U+24b7:B-o
+U+24b8:C-o
+U+24b9:D-o
+U+24ba:E-o
+U+24bb:F-o
+U+24bc:G-o
+U+24bd:H-o
+U+24be:I-o
+U+24bf:J-o
+U+24c0:K-o
+U+24c1:L-o
+U+24c2:M-o
+U+24c3:N-o
+U+24c4:O-o
+U+24c5:P-o
+U+24c6:Q-o
+U+24c7:R-o
+U+24c8:S-o
+U+24c9:T-o
+U+24ca:U-o
+U+24cb:V-o
+U+24cc:W-o
+U+24cd:X-o
+U+24ce:Y-o
+U+24cf:Z-o
+U+24d0:a-o
+U+24d1:b-o
+U+24d2:c-o
+U+24d3:d-o
+U+24d4:e-o
+U+24d5:f-o
+U+24d6:g-o
+U+24d7:h-o
+U+24d8:i-o
+U+24d9:j-o
+U+24da:k-o
+U+24db:l-o
+U+24dc:m-o
+U+24dd:n-o
+U+24de:o-o
+U+24df:p-o
+U+24e0:q-o
+U+24e1:r-o
+U+24e2:s-o
+U+24e3:t-o
+U+24e4:u-o
+U+24e5:v-o
+U+24e6:w-o
+U+24e7:x-o
+U+24e8:y-o
+U+24e9:z-o
+U+24ea:0-o
+U+2500:-
+U+2501:=
+U+2502:|
+U+2503:|
+U+2504:-
+U+2505:=
+U+2506:|
+U+2507:|
+U+2508:-
+U+2509:=
+U+250a:|
+U+250b:|
+0x2b U+250c-U+256c # box drawings, use +
+U+2571:/
+U+2572:\
+U+2580:TB
+U+2584:LB
+U+2588:FB
+U+258c:lB
+U+2590:RB
+U+2591:.S
+U+2592::S
+U+2593:?S
+U+25a0:fS
+U+25a1:OS
+U+25a2:RO
+U+25a3:Rr
+U+25a4:RF
+U+25a5:RY
+U+25a6:RH
+U+25a7:RZ
+U+25a8:RK
+U+25a9:RX
+U+25aa:sB
+U+25ac:SR
+U+25ad:Or
+U+25b2:^
+U+25b3:uT
+U+25b6:|>
+U+25b7:Tr
+U+25ba:|>
+U+25bc:v
+U+25bd:dT
+U+25c0:<|
+U+25c1:Tl
+U+25c4:<|
+U+25c6:Db
+U+25c7:Dw
+U+25ca:LZ
+U+25cb:0m
+U+25ce:0o
+U+25cf:0M
+U+25d0:0L
+U+25d1:0R
+U+25d8:Sn
+U+25d9:Ic
+U+25e2:Fd
+U+25e3:Bd
+U+25ef:Ci
+# Miscellaneous Symbols
+U+2600 "SU" # cf. U+263c
+U+2601:cOo
+U+2602:J
+U+2603:"8"
+U+2605:*
+U+2606:*
+U+2607:<v
+U+2608:Rv
+U+2609 "Sol" # cf. astrological symbols U+263c - U+2647, star-like U+2600
+U+260a:Asc.
+U+260b:Desc.
+U+260c:Conj.
+U+260d:Opp.
+U+260e:TEL
+U+260f:tel
+0x58 U+2611 U+2612 # checked ballot boxes -> x
+U+2613:X
+U+2614 "\"J\"" # umbrella with rain drops, quote marks are part of the symbol
+U+2615:Joe
+U+261a:<==
+U+261b:==>
+U+261c:<--
+U+261d:||^
+U+261e:-->
+U+261f:||v
+U+2620 "!X!" # or "POISON ", cf. U+2621
+U+2621 "!Z!" # previously "CAUTION " - or is it better to leave it spelled out in English?
+U+2622 "!R!" # or "RADIOACTIVE ", cf. U+2621
+U+2623 "!B!" # or "BIOHAZARD ", cf. U+2621
+U+2624 "2TS" # cf. U+2695
+U+2626:t
+U+2627:XP
+U+2628:t
+U+2629:+
+U+262a:(*
+U+262d:'\,)
+U+262e:(PEACE)
+U+262f:Pd
+U+2630:-HVN-
+U+2631:-LAK-
+U+2632:-FIR-
+U+2633:-THR-
+U+2634:-WND-
+U+2635:-WTR-
+U+2636:-MTN-
+U+2637:-RTH-
+U+2638:*
+U+2639::-(
+U+263a::-)
+U+263b:(-:
+U+263c "su" # previously "SU" - cf. U+2600, typical to have "dark" character in uppercase, eg. U+260e, U+260f
+U+263d "Lun1" # Luna, 1st quarter
+U+263e "Lun3" # Luna, 3rd quarter
+U+263f:Mer
+U+2640 "Ven" # previously "f." - this section labeled as astrological symbols
+U+2641 "Ter" # Terra, to go with other Latin names
+U+2642 "Mar" # previously "m." - this section labeled as astrological symbols
+U+2643:Jup
+U+2644:Sat
+U+2645:Ura
+U+2646:Nep
+U+2647:Plu
+U+2648 "Ari" # Standard astronomical abbreviation
+U+2649 "Tau"
+U+264a "Gem"
+U+264b "Cnc"
+U+264c "Leo"
+U+264d "Vir"
+U+264e "Lib"
+U+264f "Sco"
+U+2650 "Sgr"
+U+2651 "Cap"
+U+2652 "Aqr"
+U+2653 "Psc"
+U+2654 "k" # white chess king
+U+2655:q
+U+2656:r
+U+2657:b
+U+2658:n
+U+2659:p
+U+265a "K" # black chess king
+U+265b:Q
+U+265c:R
+U+265d:B
+U+265e:N
+U+265f:P
+U+2660 "cS" # black spade suit
+U+2661:ch
+U+2662:cd
+U+2663:cC
+U+2664:cs
+U+2665:cH
+U+2666:cD
+U+2667:cc
+#Musical symbols
+U+2669:d
+U+266a:d`
+U+266b:d-d
+U+266c:d=d
+U+266d:b
+U+266e:N
+U+266f:#
+U+2670:t
+U+2671:t
+#Recycling symbols
+U+2672:/_\
+U+2673:/1\
+U+2674:/2\
+U+2675:/3\
+U+2676:/4\
+U+2677:/5\
+U+2678:/6\
+U+2679:/7\
+U+267a:/_\
+U+267b:/_\
+U+267c:/P\
+U+267d:/p\
+U+267e:(oo)
+U+267f "oL" # wheelchair symbol
+U+2680:d1
+U+2681:d2
+U+2682:d3
+U+2683:d4
+U+2684:d5
+U+2685:d6
+U+2686:(.)
+U+2687:(:)
+U+2688:((.))
+U+2689:((:))
+U+2690 " f "
+U+2691 " F "
+U+2692:'X`
+U+2693 "+-)" # anchor (sideways)
+U+2694:,X,
+U+2695 "$" # cf. U+2624
+U+2696 "^T^" # scales of justice
+U+269a "}T{" # staff of Hermes
+U+269b ":*:" # atom symbol
+U+269c "}|{" # fleur-de-lis
+U+26a0 "!!!" # or "WARNING ", cf. U+2621
+U+26a1 "!V!" # or "VOLTAGE ", cf. U+2621
+U+26a2 "f.f." # two females, lesbian
+U+26a3 "m.m." # two males, homosexual
+U+26a4 "m.f." # male and female, bisexual
+U+26a5 "mf." # cf. U+26A4
+U+26a6 "xm." # transgendered male
+U+26a7 "xmf." # transgendered male/female
+U+26aa:o
+U+26ab:O
+U+26ac:o
+U+26ad:oo
+U+26ae:o|o
+U+26af:o-o
+U+26b0 "/b/" # buried/coffin
+U+26b1 "/c/" # cremated/urn
+U+26b2 "n." # cf. U+26a2 - U+26a7
+# Dingbats
+U+2702:8<
+U+2704:>8
+U+2706:(TEL)
+U+2708:+->-
+U+2709 "[v]" # envelope
+U+270c:mV,
+0x58 U+2713 U+2714 U+2717 U+2718 # check marks -> x
+U+2715: x
+U+2716: X
+U+2719:+
+U+271a:+
+U+271b:+
+U+271c:+
+U+271d:t
+U+271e:t
+U+271f:t
+U+2720:-X
+0x2a U+2721 U+272a U+272b U+272c U+272d U+272e U+272f U+2730 U+2731 U+2732 U+2733 U+2734 U+2735 U+2736 U+2737 U+2738 U+2739 U+273a U+273b U+273c U+273d
+0x2a U+2742 U+2743 U+2744 U+2745 U+2746 U+2747 U+2748 U+2749 U+274a U+274b
+U+2756:<x>
+U+2758:|
+U+2759:|
+U+275a:|
+U+275b:'
+U+275c:'
+U+275d:"
+U+275e:"
+U+2762:!
+U+2763:!
+U+2765:<3
+U+2768:(
+U+2769:)
+U+276a:(
+U+276b:)
+U+276c:<
+U+276d:>
+U+276e:<
+U+276f:>
+U+2770:<
+U+2771:>
+U+2772:[
+U+2773:]
+U+2774:{
+U+2775:}
+U+2776:((1))
+U+2777:((2))
+U+2778:((3))
+U+2779:((4))
+U+277a:((5))
+U+277b:((6))
+U+277c:((7))
+U+277d:((8))
+U+277e:((9))
+U+277f:((10))
+U+2780:(1)
+U+2781:(2)
+U+2782:(3)
+U+2783:(4)
+U+2784:(5)
+U+2785:(6)
+U+2786:(7)
+U+2787:(8)
+U+2788:(9)
+U+2789:(10)
+U+278a:((1))
+U+278b:((2))
+U+278c:((3))
+U+278d:((4))
+U+278e:((5))
+U+278f:((6))
+U+2790:((7))
+U+2791:((8))
+U+2792:((9))
+U+2793:((10))
+U+2794:->
+U+2798:\v
+U+2799:->
+U+279a:/^
+U+279b:->
+U+279c:->
+U+279d:->
+U+279e:->
+U+279f:->
+U+27a0:->
+U+27a1:->
+U+27a2:>
+U+27a3:>
+U+27a4:>
+U+27a5:->
+U+27a6:->
+U+27a7:->
+U+27a8:->
+U+27a9:->
+U+27aa:->
+U+27ab:->
+U+27ac:->
+U+27ad:->
+U+27ae:->
+U+27af:->
+U+27b0:->
+U+27b2:(->)
+U+27b3:>>->
+U+27b4:vv\v
+U+27b5:>>->
+U+27b6:^^/^
+U+27b7:vv\v
+U+27b8:>>->
+U+27b9:^^/^
+U+27ba:->
+U+27bb:->
+U+27bc:->
+U+27bd:->
+U+27be:->
+# Supplemental Arrows A
+U+27f0:^||||
+U+27f1:||||v
+U+27f2:vO
+U+27f3:Ov
+U+27f4:(+)>
+U+27f5:<---
+U+27f6:--->
+U+27f7:<--->
+U+27f8:<===
+U+27f9:===>
+U+27fa:<===>
+U+27fb:<---|
+U+27fc:|--->
+U+27fd:<===|
+U+27fe:|===>
+U+27ff:~~~>
+# Supplemental Arrows B
+U+2900:-|->>
+U+2901:-||->>
+U+2902:<=|=
+U+2903:=|=>
+U+2904:<=|=>
+U+2905:|->>
+U+2906:<=|
+U+2907:|=>
+U+2908:|-|v
+U+2909:^|-|
+U+290a:^|||
+U+290b:|||v
+U+290c:<- -
+U+290d:- ->
+U+290e:<- - -
+U+290f:- - ->
+U+2910:>- - ->
+U+2911:->
+U+2913:|v_
+U+2914:>-|->
+U+2915:>-||->
+U+2916:>->>
+U+2917:>-|->>
+U+2918:>-||->>
+U+2919:-<
+U+291a:>-
+U+291b:-<<
+U+291c:>>-
+U+291d:<><-
+U+291e:-><>
+U+291f:<><-|
+U+2920:|-><>
+U+2921:^\v
+U+2922:v/^
+U+2923:^\,
+U+2924:,/^
+U+2927:^X^
+U+292b:X
+U+292c:X
+U+292d:Xv^
+U+292e:X^v
+U+292f:X ^
+U+2930:X v
+U+2931:^X^
+U+2932:^X^
+U+2933:~>
+U+2934:-^
+U+2935:-v
+U+2938:)v
+U+2939:(v
+U+2945:->+
+U+2946:<-+
+U+2947:-x->
+U+2948:<-o->
+U+2949:^^|o
+U+294a:<->
+U+294b:<->
+U+294c:^|v
+U+294d:^|v
+U+294e:<->
+U+294f:^|v
+U+2950:<->
+U+2951:^|v
+U+2952:|<-
+U+2953:->|
+U+2955:|v_
+U+2956:|<-
+U+2957:->|
+U+2959:|v_
+U+295a:<-|
+U+295b:|->
+U+295c:^|_
+U+295e:<-|
+U+295f:|->
+U+2960:^|_
+U+2962:<=
+U+2963:^||
+U+2964:=>
+U+2965:||v
+U+2970:=)
+U+2a00 "(.)"
+U+2a01 "(+)"
+U+2a02 "(x)"
+U+2a09: *
+U+2a0c "\134int\134int\134int\134int "
+U+2a2f:x
+U+2a30:.x
+U+2a31:x_
+U+2a33:xx
+U+2a34:(x
+U+2a35:x)
+U+2a37:((x))
+U+2a38:(/)
+U+2a39:/+\
+U+2a3a:/-\
+U+2a3b:/x\
+U+2a74:::=
+U+2a75:==
+U+2a76:===
+U+2a77::=:
+#Miscellaneous Symbols and Arrows
+U+2b00:/^
+U+2b01:^\
+U+2b02:\v
+U+2b03:v/
+U+2b04:<->
+U+2b05:<-
+U+2b06:^|
+U+2b07:|v
+U+2b08:/^
+U+2b09:^\
+U+2b0a:\v
+U+2b0b:v/
+U+2b0c:<->
+U+2b0d:^|v
+U+2b0e:-v
+U+2b0f:-^
+U+2b10:v-
+U+2b11:^-
+# Supplemental punctuation
+U+2e0f:__
+U+2e1e:.~
+U+2e1f:~.
+U+2e28:((
+U+2e29:))
+U+2e2a ":."
+U+2e2b ".:"
+U+2e2c "::"
+U+2e2f:~
+# CJK area:
+0x20 U+3000 # ideographic space
+U+3001:,_
+U+3002:._
+U+3003:+"
+U+3004:JIS
+U+3005:*_
+U+3006:;_
+U+3007:0_
+U+300a:<+
+U+300b:>+
+U+300c:<'
+U+300d:>'
+U+300e:<"
+U+300f:>"
+U+3010:("
+U+3011:)"
+U+3012:=T
+U+3013:=_
+U+3014:('
+U+3015:)'
+U+3016:(I
+U+3017:)I
+U+301a:[[
+U+301b:]]
+U+301c:-?
+U+3020:=T:)
+0x20 U+303f
+U+3041:A5
+U+3042:a5
+U+3043:I5
+U+3044:i5
+U+3045:U5
+U+3046:u5
+U+3047:E5
+U+3048:e5
+U+3049:O5
+U+304a:o5
+U+304b:ka
+U+304c:ga
+U+304d:ki
+U+304e:gi
+U+304f:ku
+U+3050:gu
+U+3051:ke
+U+3052:ge
+U+3053:ko
+U+3054:go
+U+3055:sa
+U+3056:za
+U+3057:si
+U+3058:zi
+U+3059:su
+U+305a:zu
+U+305b:se
+U+305c:ze
+U+305d:so
+U+305e:zo
+U+305f:ta
+U+3060:da
+U+3061:ti
+U+3062:di
+U+3063:tU
+U+3064:tu
+U+3065:du
+U+3066:te
+U+3067:de
+U+3068:to
+U+3069:do
+U+306a:na
+U+306b:ni
+U+306c:nu
+U+306d:ne
+U+306e:no
+U+306f:ha
+U+3070:ba
+U+3071:pa
+U+3072:hi
+U+3073:bi
+U+3074:pi
+U+3075:hu
+U+3076:bu
+U+3077:pu
+U+3078:he
+U+3079:be
+U+307a:pe
+U+307b:ho
+U+307c:bo
+U+307d:po
+U+307e:ma
+U+307f:mi
+U+3080:mu
+U+3081:me
+U+3082:mo
+U+3083:yA
+U+3084:ya
+U+3085:yU
+U+3086:yu
+U+3087:yO
+U+3088:yo
+U+3089:ra
+U+308a:ri
+U+308b:ru
+U+308c:re
+U+308d:ro
+U+308e:wA
+U+308f:wa
+U+3090:wi
+U+3091:we
+U+3092:wo
+U+3093:n5
+U+3094:vu
+U+309b:"5
+U+309c:05
+U+309d:*5
+U+309e:+5
+U+30a1:a6
+U+30a2:A6
+U+30a3:i6
+U+30a4:I6
+U+30a5:u6
+U+30a6:U6
+U+30a7:e6
+U+30a8:E6
+U+30a9:o6
+U+30aa:O6
+U+30ab:Ka
+U+30ac:Ga
+U+30ad:Ki
+U+30ae:Gi
+U+30af:Ku
+U+30b0:Gu
+U+30b1:Ke
+U+30b2:Ge
+U+30b3:Ko
+U+30b4:Go
+U+30b5:Sa
+U+30b6:Za
+U+30b7:Si
+U+30b8:Zi
+U+30b9:Su
+U+30ba:Zu
+U+30bb:Se
+U+30bc:Ze
+U+30bd:So
+U+30be:Zo
+U+30bf:Ta
+U+30c0:Da
+U+30c1:Ti
+U+30c2:Di
+U+30c3:TU
+U+30c4:Tu
+U+30c5:Du
+U+30c6:Te
+U+30c7:De
+U+30c8:To
+U+30c9:Do
+U+30ca:Na
+U+30cb:Ni
+U+30cc:Nu
+U+30cd:Ne
+U+30ce:No
+U+30cf:Ha
+U+30d0:Ba
+U+30d1:Pa
+U+30d2:Hi
+U+30d3:Bi
+U+30d4:Pi
+U+30d5:Hu
+U+30d6:Bu
+U+30d7:Pu
+U+30d8:He
+U+30d9:Be
+U+30da:Pe
+U+30db:Ho
+U+30dc:Bo
+U+30dd:Po
+U+30de:Ma
+U+30df:Mi
+U+30e0:Mu
+U+30e1:Me
+U+30e2:Mo
+U+30e3:YA
+U+30e4:Ya
+U+30e5:YU
+U+30e6:Yu
+U+30e7:YO
+U+30e8:Yo
+U+30e9:Ra
+U+30ea:Ri
+U+30eb:Ru
+U+30ec:Re
+U+30ed:Ro
+U+30ee:WA
+U+30ef:Wa
+U+30f0:Wi
+U+30f1:We
+U+30f2:Wo
+U+30f3:N6
+U+30f4:Vu
+U+30f5:KA
+U+30f6:KE
+U+30f7:Va
+U+30f8:Vi
+U+30f9:Ve
+U+30fa:Vo
+U+30fb:.6
+U+30fc:-6
+U+30fd:*6
+U+30fe:+6
+U+3105:b4
+U+3106:p4
+U+3107:m4
+U+3108:f4
+U+3109:d4
+U+310a:t4
+U+310b:n4
+U+310c:l4
+U+310d:g4
+U+310e:k4
+U+310f:h4
+U+3110:j4
+U+3111:q4
+U+3112:x4
+U+3113:zh
+U+3114:ch
+U+3115:sh
+U+3116:r4
+U+3117:z4
+U+3118:c4
+U+3119:s4
+U+311a:a4
+U+311b:o4
+U+311c:e4
+U+311d:eh4
+U+311e:ai
+U+311f:ei
+U+3120:au
+U+3121:ou
+U+3122:an
+U+3123:en
+U+3124:aN
+U+3125:eN
+U+3126:er
+U+3127:i4
+U+3128:u4
+U+3129:iu
+U+312a:v4
+U+312b:nG
+U+312c:gn
+U+321c:(JU)
+U+3220:1c
+U+3221:2c
+U+3222:3c
+U+3223:4c
+U+3224:5c
+U+3225:6c
+U+3226:7c
+U+3227:8c
+U+3228:9c
+U+3229:10c
+U+327f:KSC
+U+33c2:am
+U+33d8:pm
+#
+#
+#There are four special ranges of characters that are represented only by
+#their start and end characters <...>
+#
+# The CJK Ideographs Area (U+4E00 - U+9FFF)
+# The Hangul Syllables Area (U+AC00 - U+D7A3)
+# The Surrogates Area (U+D800 - U+DFFF)
+# The Private Use Area (U+E000 - U+F8FF)
+#
+#
+U+fb00:ff
+U+fb01:fi
+U+fb02:fl
+U+fb03:ffi
+U+fb04:ffl
+U+fb05:St
+U+fb06:st
+U+fe7d:3+;
+U+fe82:aM.
+U+fe84:aH.
+U+fe88:ah.
+U+fe8d:a+-
+U+fe8e:a+.
+U+fe8f:b+-
+U+fe90:b+.
+U+fe91:b+,
+U+fe92:b+;
+U+fe93:tm-
+U+fe94:tm.
+U+fe95:t+-
+U+fe96:t+.
+U+fe97:t+,
+U+fe98:t+;
+U+fe99:tk-
+U+fe9a:tk.
+U+fe9b:tk,
+U+fe9c:tk;
+U+fe9d:g+-
+U+fe9e:g+.
+U+fe9f:g+,
+U+fea0:g+;
+U+fea1:hk-
+U+fea2:hk.
+U+fea3:hk,
+U+fea4:hk;
+U+fea5:x+-
+U+fea6:x+.
+U+fea7:x+,
+U+fea8:x+;
+U+fea9:d+-
+U+feaa:d+.
+U+feab:dk-
+U+feac:dk.
+U+fead:r+-
+U+feae:r+.
+U+feaf:z+-
+U+feb0:z+.
+U+feb1:s+-
+U+feb2:s+.
+U+feb3:s+,
+U+feb4:s+;
+U+feb5:sn-
+U+feb6:sn.
+U+feb7:sn,
+U+feb8:sn;
+U+feb9:c+-
+U+feba:c+.
+U+febb:c+,
+U+febc:c+;
+U+febd:dd-
+U+febe:dd.
+U+febf:dd,
+U+fec0:dd;
+U+fec1:tj-
+U+fec2:tj.
+U+fec3:tj,
+U+fec4:tj;
+U+fec5:zH-
+U+fec6:zH.
+U+fec7:zH,
+U+fec8:zH;
+U+fec9:e+-
+U+feca:e+.
+U+fecb:e+,
+U+fecc:e+;
+U+fecd:i+-
+U+fece:i+.
+U+fecf:i+,
+U+fed0:i+;
+U+fed1:f+-
+U+fed2:f+.
+U+fed3:f+,
+U+fed4:f+;
+U+fed5:q+-
+U+fed6:q+.
+U+fed7:q+,
+U+fed8:q+;
+U+fed9:k+-
+U+feda:k+.
+U+fedb:k+,
+U+fedc:k+;
+U+fedd:l+-
+U+fede:l+.
+U+fedf:l+,
+U+fee0:l+;
+U+fee1:m+-
+U+fee2:m+.
+U+fee3:m+,
+U+fee4:m+;
+U+fee5:n+-
+U+fee6:n+.
+U+fee7:n+,
+U+fee8:n+;
+U+fee9:h+-
+U+feea:h+.
+U+feeb:h+,
+U+feec:h+;
+U+feed:w+-
+U+feee:w+.
+U+feef:j+-
+U+fef0:j+.
+U+fef1:y+-
+U+fef2:y+.
+U+fef3:y+,
+U+fef4:y+;
+U+fef5:lM-
+U+fef6:lM.
+U+fef7:lH-
+U+fef8:lH.
+U+fef9:lh-
+U+fefa:lh.
+U+fefb:la-
+U+fefc:la.
+
+# the reverse byte-order-mark: zero-width non-break space
+U+feff ""
+
+0x21-0x7e U+ff01-U+ff5e
+0x2e U+ff61
+0x22 U+ff62 U+ff63
+0x2c U+ff64
+
+# Symbols for C0 and C1 control characters, in case they get through...
+U+0000:NUL
+U+0001:SH
+U+0002:SX
+U+0003:EX
+U+0004:ET
+U+0005:ENQ
+U+0006:AK
+U+0007:BL
+U+0008:BS
+U+0009:HT
+U+000a:LF
+U+000b:VT
+U+000c:FF
+U+000d:CR
+U+000e:SO
+U+000f:SI
+U+0010:DL
+U+0011:DC1
+U+0012:DC2
+U+0013:DC3
+U+0014:DC4
+U+0015:NAK
+U+0016:SYN
+U+0017:EB
+U+0018:CN
+U+0019:EM
+U+001a:SB
+U+001b:ESC
+U+001c:FS
+U+001d:GS
+U+001e:RS
+U+001f:US
+U+007f:DT
+# Most of these characters (80-9F) may be inflicted on us
+# by MS FrontPages which uses Unicode notation such as &#153;
+# but there are no assigned letters in Unicode 128-159 range.
+# It is assumed in the code that those codepoints are from windows-1252.
+#U+0080:PA
+#U+0081:HO
+#U+0082:BH
+#U+0083:NH
+#U+0084:IN
+#U+0085:NL
+U+0085 "\012"
+#U+0086:SA
+#U+0087:ES
+#U+0088:HS
+#U+0089:HJ
+#U+008a:VS
+#U+008b:PD
+#U+008c:PU
+#U+008d:RI
+#U+008e:SS2
+#U+008f:SS3
+#U+0090:DCS
+#U+0091:P1
+#U+0092:P2
+#U+0093:TS
+#U+0094:CC
+#U+0095:MW
+#U+0096:SG
+#U+0097:EG
+#U+0098:SS
+#U+0099:GC
+#U+009a:SC
+#U+009b:CSI
+#U+009c:ST
+#U+009d:OC
+#U+009e:PM
+#U+009f:AC
+
+# Let's try to show a question mark for character that cannot
+# be shown. U+fffd is used for invalid characters.
+# It works, but let's stick with UHHH representation. - FM
+#U+fffd "?"
diff --git a/src/chrtrans/dmcs_uni.tbl b/src/chrtrans/dmcs_uni.tbl
new file mode 100644
index 0000000..ab9edb2
--- /dev/null
+++ b/src/chrtrans/dmcs_uni.tbl
@@ -0,0 +1,233 @@
+#The MIME name of this charset.
+Mdec-mcs
+
+#Name as a Display Charset (used on Options screen)
+ODEC Multinational
+
+#
+# Name: DEC Multinational (dec-mcs) [to unicode]
+# Date: 29 October 1997
+# Author: Fote
+#
+# 1999-01-01 various corrections, verified against actual DEC VT220
+# Christian "naddy" Weisgerber <naddy@mips.rhein-neckar.de>
+#
+##################
+
+#0x20 U+0020 # SPACE
+#0x21 U+0021 # EXCLAMATION MARK
+#0x22 U+0022 # QUOTATION MARK
+#0x23 U+0023 # NUMBER SIGN
+#0x24 U+0024 # DOLLAR SIGN
+#0x25 U+0025 # PERCENT SIGN
+#0x26 U+0026 # AMPERSAND
+#0x27 U+0027 # APOSTROPHE
+#0x28 U+0028 # LEFT PARENTHESIS
+#0x29 U+0029 # RIGHT PARENTHESIS
+#0x2A U+002A # ASTERISK
+#0x2B U+002B # PLUS SIGN
+#0x2C U+002C # COMMA
+#0x2D U+002D # HYPHEN-MINUS
+#0x2E U+002E # FULL STOP
+#0x2F U+002F # SOLIDUS
+#0x30 U+0030 # DIGIT ZERO
+#0x31 U+0031 # DIGIT ONE
+#0x32 U+0032 # DIGIT TWO
+#0x33 U+0033 # DIGIT THREE
+#0x34 U+0034 # DIGIT FOUR
+#0x35 U+0035 # DIGIT FIVE
+#0x36 U+0036 # DIGIT SIX
+#0x37 U+0037 # DIGIT SEVEN
+#0x38 U+0038 # DIGIT EIGHT
+#0x39 U+0039 # DIGIT NINE
+#0x3A U+003A # COLON
+#0x3B U+003B # SEMICOLON
+#0x3C U+003C # LESS-THAN SIGN
+#0x3D U+003D # EQUALS SIGN
+#0x3E U+003E # GREATER-THAN SIGN
+#0x3F U+003F # QUESTION MARK
+#0x40 U+0040 # COMMERCIAL AT
+#0x41 U+0041 # LATIN CAPITAL LETTER A
+#0x42 U+0042 # LATIN CAPITAL LETTER B
+#0x43 U+0043 # LATIN CAPITAL LETTER C
+#0x44 U+0044 # LATIN CAPITAL LETTER D
+#0x45 U+0045 # LATIN CAPITAL LETTER E
+#0x46 U+0046 # LATIN CAPITAL LETTER F
+#0x47 U+0047 # LATIN CAPITAL LETTER G
+#0x48 U+0048 # LATIN CAPITAL LETTER H
+#0x49 U+0049 # LATIN CAPITAL LETTER I
+#0x4A U+004A # LATIN CAPITAL LETTER J
+#0x4B U+004B # LATIN CAPITAL LETTER K
+#0x4C U+004C # LATIN CAPITAL LETTER L
+#0x4D U+004D # LATIN CAPITAL LETTER M
+#0x4E U+004E # LATIN CAPITAL LETTER N
+#0x4F U+004F # LATIN CAPITAL LETTER O
+#0x50 U+0050 # LATIN CAPITAL LETTER P
+#0x51 U+0051 # LATIN CAPITAL LETTER Q
+#0x52 U+0052 # LATIN CAPITAL LETTER R
+#0x53 U+0053 # LATIN CAPITAL LETTER S
+#0x54 U+0054 # LATIN CAPITAL LETTER T
+#0x55 U+0055 # LATIN CAPITAL LETTER U
+#0x56 U+0056 # LATIN CAPITAL LETTER V
+#0x57 U+0057 # LATIN CAPITAL LETTER W
+#0x58 U+0058 # LATIN CAPITAL LETTER X
+#0x59 U+0059 # LATIN CAPITAL LETTER Y
+#0x5A U+005A # LATIN CAPITAL LETTER Z
+#0x5B U+005B # LEFT SQUARE BRACKET
+#0x5C U+005C # REVERSE SOLIDUS
+#0x5D U+005D # RIGHT SQUARE BRACKET
+#0x5E U+005E # CIRCUMFLEX ACCENT
+#0x5F U+005F # LOW LINE
+#0x60 U+0060 # GRAVE ACCENT
+#0x61 U+0061 # LATIN SMALL LETTER A
+#0x62 U+0062 # LATIN SMALL LETTER B
+#0x63 U+0063 # LATIN SMALL LETTER C
+#0x64 U+0064 # LATIN SMALL LETTER D
+#0x65 U+0065 # LATIN SMALL LETTER E
+#0x66 U+0066 # LATIN SMALL LETTER F
+#0x67 U+0067 # LATIN SMALL LETTER G
+#0x68 U+0068 # LATIN SMALL LETTER H
+#0x69 U+0069 # LATIN SMALL LETTER I
+#0x6A U+006A # LATIN SMALL LETTER J
+#0x6B U+006B # LATIN SMALL LETTER K
+#0x6C U+006C # LATIN SMALL LETTER L
+#0x6D U+006D # LATIN SMALL LETTER M
+#0x6E U+006E # LATIN SMALL LETTER N
+#0x6F U+006F # LATIN SMALL LETTER O
+#0x70 U+0070 # LATIN SMALL LETTER P
+#0x71 U+0071 # LATIN SMALL LETTER Q
+#0x72 U+0072 # LATIN SMALL LETTER R
+#0x73 U+0073 # LATIN SMALL LETTER S
+#0x74 U+0074 # LATIN SMALL LETTER T
+#0x75 U+0075 # LATIN SMALL LETTER U
+#0x76 U+0076 # LATIN SMALL LETTER V
+#0x77 U+0077 # LATIN SMALL LETTER W
+#0x78 U+0078 # LATIN SMALL LETTER X
+#0x79 U+0079 # LATIN SMALL LETTER Y
+#0x7A U+007A # LATIN SMALL LETTER Z
+#0x7B U+007B # LEFT CURLY BRACKET
+#0x7C U+007C # VERTICAL LINE
+#0x7D U+007D # RIGHT CURLY BRACKET
+#0x7E U+007E # TILDE
+#
+0x20-0x7E idem # ASCII
+
+0xA1 U+00A1 # inverted exclamation mark (&#161;) - iexcl
+0xA2 U+00A2 # cent sign (&#162;) - cent
+0xA3 U+00A3 # pound sign (&#163;) - pound
+0xA5 U+00A5 # yen sign (&#165;) - yen
+# broken vertical bar (&#166;) - brvbar, brkbar
+U+00A6:|
+0xA7 U+00A7 # section sign (&#167;) - sect
+0xA8 U+00A4 # currency sign (&#164;) - curren
+# spacing diaeresis (&#168;) - uml, die
+U+00A8:"
+0xA9 U+00A9 # copyright sign (&#169;) - copy
+0xAA U+00AA # feminine ordinal indicator (&#170;) - ordf
+0xAB U+00AB # angle quotation mark, left (&#171;) - laquo
+# negation sign (&#172); - not
+U+00AC:NOT
+# soft hyphen (&#173;) - shy
+#U+00AD
+# circled R registered sign (&#174;) - reg
+U+00AE:(R)
+# spacing macron (&#175;) - hibar, macr
+U+00AF:-
+0xB0 U+00B0 # degree sign (&#176;) - deg
+0xB1 U+00B1 # plus-or-minus sign (&#177;) - plusmn
+0xB2 U+00B2 # superscript 2 (&#178;) - sup2
+0xB3 U+00B3 # superscript 3 (&#179;) - sup3
+#spacing acute (&#180;) - acute
+U+00B4:'
+0xB5 U+00B5 # micro sign (&#181;) - micro
+0xB6 U+00B6 # paragraph sign (&#182;) - para
+0xB7 U+00B7 # middle dot (&#183;) - middot
+# spacing cedilla (&#184;) - cedil
+U+00B8:,
+0xB9 U+00B9 # superscript 1 (&#185;) - sup1
+0xBA U+00BA # masculine ordinal indicator (&#186;) - ordm
+0xBB U+00BB # angle quotation mark, right (&#187;) - raquo
+0xBC U+00BC # fraction 1/4 (&#188;) - frac14
+0xBD U+00BD # fraction 1/2 (&#189;) - frac12
+# fraction 3/4 (&#190;) - frac34
+U+00BE: 3/4
+0xBF U+00BF # inverted question mark (&#191;) - iquest
+0xC0 U+00C0 # capital A, grave accent (&#192;) - Agrave
+0xC1 U+00C1 # capital A, acute accent (&#193;) - Aacute
+0xC2 U+00C2 # capital A, circumflex accent (&#194;) - Acirc
+0xC3 U+00C3 # capital A, tilde (&#195;) - Atilde
+0xC4 U+00C4 # capital A, dieresis or umlaut mark (&#196;) - Auml
+0xC5 U+00C5 # capital A, ring (&#197;) - Aring
+0xC6 U+00C6 # capital AE diphthong (ligature) (&#198;) - AElig
+0xC7 U+00C7 # capital C, cedilla (&#199;) - Ccedil
+0xC8 U+00C8 # capital E, grave accent (&#200;) - Egrave
+0xC9 U+00C9 # capital E, acute accent (&#201;) - Eacute
+0xCA U+00CA # capital E, circumflex accent (&#202;) - Ecirc
+0xCB U+00CB # capital E, dieresis or umlaut mark (&#203;) - Euml
+0xCC U+00CC # capital I, grave accent (&#204;) - Igrave
+0xCD U+00CD # capital I, acute accent (&#205;) - Iacute
+0xCE U+00CE # capital I, circumflex accent (&#206;) - Icirc
+0xCF U+00CF # capital I, dieresis or umlaut mark (&#207;) - Iuml
+# capital Eth, Icelandic (&#208;) - ETH */
+U+00D0:DH
+# Dj # capital D with stroke - Dstrok
+0xD1 U+00D1 # capital N, tilde (&#209;) - Ntilde
+0xD2 U+00D2 # capital O, grave accent (&#210;) - Ograve
+0xD3 U+00D3 # capital O, acute accent (&#211;) - Oacute
+0xD4 U+00D4 # capital O, circumflex accent (&#212;) - Ocirc
+0xD5 U+00D5 # capital O, tilde (&#213;) - Otilde
+0xD6 U+00D6 # capital O, dieresis or umlaut mark (&#214;) - Ouml
+0xD7 U+0152 # capital OE ligature (&#338;) - OElig
+# multiplication sign (&#215;) - times
+U+00D7:*
+0xD8 U+00D8 # capital O, slash (&#216;) - Oslash
+0xD9 U+00D9 # capital U, grave accent (&#217;) - Ugrave
+0xDA U+00DA # capital U, acute accent (&#218;) - Uacute
+0xDB U+00DB # capital U, circumflex accent (&#219;) - Ucirc
+0xDC U+00DC # capital U, dieresis or umlaut mark (&#220;) - Uuml
+0xDD U+0178 # capital Y, dieresis or umlaut mark (&#376;) - Yuml
+# capital Y, acute accent (&#221;) - Yacute
+U+00DD:Y'
+# capital THORN, Icelandic (&#222;) - THORN */
+U+00DE:TH
+0xDF U+00DF # small sharp s, German (sz ligature) (&#223;) - szlig
+0xE0 U+00E0 # small a, grave accent (&#224;) - agrave
+0xE1 U+00E1 # small a, acute accent (&#225;) - aacute
+0xE2 U+00E2 # small a, circumflex accent (&#226;) - acirc
+0xE3 U+00E3 # small a, tilde (&#227;) - atilde
+0xE4 U+00E4 # small a, dieresis or umlaut mark (&#228;) - auml
+0xE5 U+00E5 # small a, ring (&#229;) - aring
+0xE6 U+00E6 # small ae diphthong (ligature) (&#230;) - aelig
+0xE7 U+00E7 # small c, cedilla (&#231;) - ccedil
+0xE8 U+00E8 # small e, grave accent (&#232;) - egrave
+0xE9 U+00E9 # small e, acute accent (&#233;) - eacute
+0xEA U+00EA # small e, circumflex accent (&#234;) - ecirc
+0xEB U+00EB # small e, dieresis or umlaut mark (&#235;) - euml
+0xEC U+00EC # small i, grave accent (&#236;) - igrave
+0xED U+00ED # small i, acute accent (&#237;) - iacute
+0xEE U+00EE # small i, circumflex accent (&#238;) - icirc
+0xEF U+00EF # small i, dieresis or umlaut mark (&#239;) - iuml
+# small eth, Icelandic (&#240;) - eth
+U+00F0:dh
+0xF1 U+00F1 # small n, tilde (&#241;) - ntilde
+0xF2 U+00F2 # small o, grave accent (&#242;) - ograve
+0xF3 U+00F3 # small o, acute accent (&#243;) - oacute
+0xF4 U+00F4 # small o, circumflex accent (&#244;) - ocirc
+0xF5 U+00F5 # small o, tilde (&#245;) - otilde
+0xF6 U+00F6 # small o, dieresis or umlaut mark (&#246;) - ouml
+0xF7 U+0153 # small oe ligature (&#339;) - oelig
+# division sign (&#247;) - divide
+U+00F7:/
+0xF8 U+00F8 # small o, slash (&#248;) - oslash
+0xF9 U+00F9 # small u, grave accent (&#249;) - ugrave
+0xFA U+00FA # small u, acute accent (&#250;) - uacute
+0xFB U+00FB # small u, circumflex accent (&#251;) - ucirc
+0xFC U+00FC # small u, dieresis or umlaut mark (&#252;) - uuml
+0xFD U+00FF # small y, dieresis or umlaut mark (&#255;) - yuml
+# small y, acute accent (&#253;) - yacute
+U+00FD:y'
+# small thorn, Icelandic (&#254;) - thorn
+U+00FE:th
+#
+# TRADE MARK SIGN
+U+2122:(TM)
diff --git a/src/chrtrans/entities.h b/src/chrtrans/entities.h
new file mode 100644
index 0000000..66f66ab
--- /dev/null
+++ b/src/chrtrans/entities.h
@@ -0,0 +1,1414 @@
+/*
+ * $LynxId: entities.h,v 1.6 2020/01/21 21:31:36 tom Exp $
+ *
+ * Entity Names to Unicode table
+ * -----------------------------
+ *
+ * This is a one-way mapping to Unicode so chartrans implementation
+ * now process character entities like &nbsp the similar way it handles
+ * the numeric entities like &#123.
+ * The only call to this structure is via HTMLGetEntityUCValue().
+ *
+
+Unlike the numeric entities &#234 which may be for any Unicode character, the
+character references should be defined within HTML standards to get a
+compatibility between browsers.
+
+Now we have a choice: use clean HTML4.0 entities list (and reject everything
+others), or use a relaxed list with lots of synonyms and new symbols found at
+
+ftp://ftp.unicode.org/Public/MAPPINGS/VENDORS/MISC/SGML.TXT
+
+We hold both: #define ENTITIES_HTML40_ONLY for strict version,
+otherwise relaxed.
+
+ */
+
+#include <UCkd.h> /* typedef u16 */
+typedef struct {
+ const char *name; /* sorted alphabetically (case-sensitive) */
+ u16 code;
+} UC_entity_info;
+
+static const UC_entity_info unicode_entities[] =
+/* *INDENT-OFF* */
+#ifdef ENTITIES_HTML40_ONLY
+/*********************************************************************
+
+ The full list of character references defined as part of HTML 4.0.
+ http://www.w3.org/TR/PR-html40/sgml/entities.html
+
+ Informal history:
+ * ISO Latin 1 entities for 160-255 range were introduced in HTML 2.0
+ * few important entities were added, including &lt, &gt, &amp.
+ * Greek letters and some math symbols were finally added in HTML 4.0
+
+ Totally 252 entries (Nov 1997 HTML 4.0 draft), it is 1:1 mapping.
+ Please do not add more unless a new HTML version will be released,
+ try the #else table for experiments and fun...
+
+****/
+{
+ {"AElig", 198}, /* latin capital letter AE = latin capital ligature AE, U+00C6 ISOlat1 */
+ {"Aacute", 193}, /* latin capital letter A with acute, U+00C1 ISOlat1 */
+ {"Acirc", 194}, /* latin capital letter A with circumflex, U+00C2 ISOlat1 */
+ {"Agrave", 192}, /* latin capital letter A with grave = latin capital letter A grave, U+00C0 ISOlat1 */
+ {"Alpha", 913}, /* greek capital letter alpha, U+0391 */
+ {"Aring", 197}, /* latin capital letter A with ring above = latin capital letter A ring, U+00C5 ISOlat1 */
+ {"Atilde", 195}, /* latin capital letter A with tilde, U+00C3 ISOlat1 */
+ {"Auml", 196}, /* latin capital letter A with diaeresis, U+00C4 ISOlat1 */
+ {"Beta", 914}, /* greek capital letter beta, U+0392 */
+ {"Ccedil", 199}, /* latin capital letter C with cedilla, U+00C7 ISOlat1 */
+ {"Chi", 935}, /* greek capital letter chi, U+03A7 */
+ {"Dagger", 8225}, /* double dagger, U+2021 ISOpub */
+ {"Delta", 916}, /* greek capital letter delta, U+0394 ISOgrk3 */
+ {"ETH", 208}, /* latin capital letter ETH, U+00D0 ISOlat1 */
+ {"Eacute", 201}, /* latin capital letter E with acute, U+00C9 ISOlat1 */
+ {"Ecirc", 202}, /* latin capital letter E with circumflex, U+00CA ISOlat1 */
+ {"Egrave", 200}, /* latin capital letter E with grave, U+00C8 ISOlat1 */
+ {"Epsilon", 917}, /* greek capital letter epsilon, U+0395 */
+ {"Eta", 919}, /* greek capital letter eta, U+0397 */
+ {"Euml", 203}, /* latin capital letter E with diaeresis, U+00CB ISOlat1 */
+ {"Gamma", 915}, /* greek capital letter gamma, U+0393 ISOgrk3 */
+ {"Iacute", 205}, /* latin capital letter I with acute, U+00CD ISOlat1 */
+ {"Icirc", 206}, /* latin capital letter I with circumflex, U+00CE ISOlat1 */
+ {"Igrave", 204}, /* latin capital letter I with grave, U+00CC ISOlat1 */
+ {"Iota", 921}, /* greek capital letter iota, U+0399 */
+ {"Iuml", 207}, /* latin capital letter I with diaeresis, U+00CF ISOlat1 */
+ {"Kappa", 922}, /* greek capital letter kappa, U+039A */
+ {"Lambda", 923}, /* greek capital letter lambda, U+039B ISOgrk3 */
+ {"Mu", 924}, /* greek capital letter mu, U+039C */
+ {"Ntilde", 209}, /* latin capital letter N with tilde, U+00D1 ISOlat1 */
+ {"Nu", 925}, /* greek capital letter nu, U+039D */
+ {"OElig", 338}, /* latin capital ligature OE, U+0152 ISOlat2 */
+ {"Oacute", 211}, /* latin capital letter O with acute, U+00D3 ISOlat1 */
+ {"Ocirc", 212}, /* latin capital letter O with circumflex, U+00D4 ISOlat1 */
+ {"Ograve", 210}, /* latin capital letter O with grave, U+00D2 ISOlat1 */
+ {"Omega", 937}, /* greek capital letter omega, U+03A9 ISOgrk3 */
+ {"Omicron", 927}, /* greek capital letter omicron, U+039F */
+ {"Oslash", 216}, /* latin capital letter O with stroke = latin capital letter O slash, U+00D8 ISOlat1 */
+ {"Otilde", 213}, /* latin capital letter O with tilde, U+00D5 ISOlat1 */
+ {"Ouml", 214}, /* latin capital letter O with diaeresis, U+00D6 ISOlat1 */
+ {"Phi", 934}, /* greek capital letter phi, U+03A6 ISOgrk3 */
+ {"Pi", 928}, /* greek capital letter pi, U+03A0 ISOgrk3 */
+ {"Prime", 8243}, /* double prime = seconds = inches, U+2033 ISOtech */
+ {"Psi", 936}, /* greek capital letter psi, U+03A8 ISOgrk3 */
+ {"Rho", 929}, /* greek capital letter rho, U+03A1 */
+ {"Scaron", 352}, /* latin capital letter S with caron, U+0160 ISOlat2 */
+/* there is no Sigmaf, and no U+03A2 character either */
+ {"Sigma", 931}, /* greek capital letter sigma, U+03A3 ISOgrk3 */
+ {"THORN", 222}, /* latin capital letter THORN, U+00DE ISOlat1 */
+ {"Tau", 932}, /* greek capital letter tau, U+03A4 */
+ {"Theta", 920}, /* greek capital letter theta, U+0398 ISOgrk3 */
+ {"Uacute", 218}, /* latin capital letter U with acute, U+00DA ISOlat1 */
+ {"Ucirc", 219}, /* latin capital letter U with circumflex, U+00DB ISOlat1 */
+ {"Ugrave", 217}, /* latin capital letter U with grave, U+00D9 ISOlat1 */
+ {"Upsilon", 933}, /* greek capital letter upsilon, U+03A5 ISOgrk3 */
+ {"Uuml", 220}, /* latin capital letter U with diaeresis, U+00DC ISOlat1 */
+ {"Xi", 926}, /* greek capital letter xi, U+039E ISOgrk3 */
+ {"Yacute", 221}, /* latin capital letter Y with acute, U+00DD ISOlat1 */
+ {"Yuml", 376}, /* latin capital letter Y with diaeresis, U+0178 ISOlat2 */
+ {"Zeta", 918}, /* greek capital letter zeta, U+0396 */
+ {"aacute", 225}, /* latin small letter a with acute, U+00E1 ISOlat1 */
+ {"acirc", 226}, /* latin small letter a with circumflex, U+00E2 ISOlat1 */
+ {"acute", 180}, /* acute accent = spacing acute, U+00B4 ISOdia */
+ {"aelig", 230}, /* latin small letter ae = latin small ligature ae, U+00E6 ISOlat1 */
+ {"agrave", 224}, /* latin small letter a with grave = latin small letter a grave, U+00E0 ISOlat1 */
+ {"alefsym", 8501}, /* alef symbol = first transfinite cardinal, U+2135 NEW */
+/* alef symbol is NOT the same as hebrew letter alef, U+05D0 although the same glyph could be used to depict both characters */
+ {"alpha", 945}, /* greek small letter alpha, U+03B1 ISOgrk3 */
+ {"amp", 38}, /* ampersand, U+0026 ISOnum */
+ {"and", 8743}, /* logical and = wedge, U+2227 ISOtech */
+ {"ang", 8736}, /* angle, U+2220 ISOamso */
+ {"aring", 229}, /* latin small letter a with ring above = latin small letter a ring, U+00E5 ISOlat1 */
+ {"asymp", 8776}, /* almost equal to = asymptotic to, U+2248 ISOamsr */
+ {"atilde", 227}, /* latin small letter a with tilde, U+00E3 ISOlat1 */
+ {"auml", 228}, /* latin small letter a with diaeresis, U+00E4 ISOlat1 */
+ {"bdquo", 8222}, /* double low-9 quotation mark, U+201E NEW */
+ {"beta", 946}, /* greek small letter beta, U+03B2 ISOgrk3 */
+ {"brvbar", 166}, /* broken bar = broken vertical bar, U+00A6 ISOnum */
+ {"bull", 8226}, /* bullet = black small circle, U+2022 ISOpub */
+/* bullet is NOT the same as bullet operator, U+2219 */
+ {"cap", 8745}, /* intersection = cap, U+2229 ISOtech */
+ {"ccedil", 231}, /* latin small letter c with cedilla, U+00E7 ISOlat1 */
+ {"cedil", 184}, /* cedilla = spacing cedilla, U+00B8 ISOdia */
+ {"cent", 162}, /* cent sign, U+00A2 ISOnum */
+ {"chi", 967}, /* greek small letter chi, U+03C7 ISOgrk3 */
+ {"circ", 710}, /* modifier letter circumflex accent, U+02C6 ISOpub */
+ {"clubs", 9827}, /* black club suit = shamrock, U+2663 ISOpub */
+ {"cong", 8773}, /* approximately equal to, U+2245 ISOtech */
+ {"copy", 169}, /* copyright sign, U+00A9 ISOnum */
+ {"crarr", 8629}, /* downwards arrow with corner leftwards = carriage return, U+21B5 NEW */
+ {"cup", 8746}, /* union = cup, U+222A ISOtech */
+ {"curren", 164}, /* currency sign, U+00A4 ISOnum */
+ {"dArr", 8659}, /* downwards double arrow, U+21D3 ISOamsa */
+ {"dagger", 8224}, /* dagger, U+2020 ISOpub */
+ {"darr", 8595}, /* downwards arrow, U+2193 ISOnum */
+ {"deg", 176}, /* degree sign, U+00B0 ISOnum */
+ {"delta", 948}, /* greek small letter delta, U+03B4 ISOgrk3 */
+ {"diams", 9830}, /* black diamond suit, U+2666 ISOpub */
+ {"divide", 247}, /* division sign, U+00F7 ISOnum */
+ {"eacute", 233}, /* latin small letter e with acute, U+00E9 ISOlat1 */
+ {"ecirc", 234}, /* latin small letter e with circumflex, U+00EA ISOlat1 */
+ {"egrave", 232}, /* latin small letter e with grave, U+00E8 ISOlat1 */
+ {"empty", 8709}, /* empty set = null set = diameter, U+2205 ISOamso */
+ {"emsp", 8195}, /* em space, U+2003 ISOpub */
+ {"ensp", 8194}, /* en space, U+2002 ISOpub */
+ {"epsilon", 949}, /* greek small letter epsilon, U+03B5 ISOgrk3 */
+ {"equiv", 8801}, /* identical to, U+2261 ISOtech */
+ {"eta", 951}, /* greek small letter eta, U+03B7 ISOgrk3 */
+ {"eth", 240}, /* latin small letter eth, U+00F0 ISOlat1 */
+ {"euml", 235}, /* latin small letter e with diaeresis, U+00EB ISOlat1 */
+ {"euro", 8364}, /* euro sign, U+20AC NEW */
+ {"exist", 8707}, /* there exists, U+2203 ISOtech */
+ {"fnof", 402}, /* latin small f with hook = function = florin, U+0192 ISOtech */
+ {"forall", 8704}, /* for all, U+2200 ISOtech */
+ {"frac12", 189}, /* vulgar fraction one half = fraction one half, U+00BD ISOnum */
+ {"frac14", 188}, /* vulgar fraction one quarter = fraction one quarter, U+00BC ISOnum */
+ {"frac34", 190}, /* vulgar fraction three quarters = fraction three quarters, U+00BE ISOnum */
+ {"frasl", 8260}, /* fraction slash, U+2044 NEW */
+ {"gamma", 947}, /* greek small letter gamma, U+03B3 ISOgrk3 */
+ {"ge", 8805}, /* greater-than or equal to, U+2265 ISOtech */
+ {"gt", 62}, /* greater-than sign, U+003E ISOnum */
+ {"hArr", 8660}, /* left right double arrow, U+21D4 ISOamsa */
+ {"harr", 8596}, /* left right arrow, U+2194 ISOamsa */
+ {"hearts", 9829}, /* black heart suit = valentine, U+2665 ISOpub */
+ {"hellip", 8230}, /* horizontal ellipsis = three dot leader, U+2026 ISOpub */
+ {"iacute", 237}, /* latin small letter i with acute, U+00ED ISOlat1 */
+ {"icirc", 238}, /* latin small letter i with circumflex, U+00EE ISOlat1 */
+ {"iexcl", 161}, /* inverted exclamation mark, U+00A1 ISOnum */
+ {"igrave", 236}, /* latin small letter i with grave, U+00EC ISOlat1 */
+ {"image", 8465}, /* blackletter capital I = imaginary part, U+2111 ISOamso */
+ {"infin", 8734}, /* infinity, U+221E ISOtech */
+ {"int", 8747}, /* integral, U+222B ISOtech */
+ {"iota", 953}, /* greek small letter iota, U+03B9 ISOgrk3 */
+ {"iquest", 191}, /* inverted question mark = turned question mark, U+00BF ISOnum */
+ {"isin", 8712}, /* element of, U+2208 ISOtech */
+ {"iuml", 239}, /* latin small letter i with diaeresis, U+00EF ISOlat1 */
+ {"kappa", 954}, /* greek small letter kappa, U+03BA ISOgrk3 */
+ {"lArr", 8656}, /* leftwards double arrow, U+21D0 ISOtech */
+/* Unicode does not say that lArr is the same as the 'is implied by' arrow
+ but also does not have any other character for that function. So ? lArr can
+ be used for 'is implied by' as ISOtech suggests */
+ {"lambda", 955}, /* greek small letter lambda, U+03BB ISOgrk3 */
+ {"lang", 9001}, /* left-pointing angle bracket = bra, U+2329 ISOtech */
+/* lang is NOT the same character as U+003C 'less than' or U+2039 'single left-pointing angle quotation mark' */
+ {"laquo", 171}, /* left-pointing double angle quotation mark = left pointing guillemet, U+00AB ISOnum */
+ {"larr", 8592}, /* leftwards arrow, U+2190 ISOnum */
+ {"lceil", 8968}, /* left ceiling = apl upstile, U+2308 ISOamsc */
+ {"ldquo", 8220}, /* left double quotation mark, U+201C ISOnum */
+ {"le", 8804}, /* less-than or equal to, U+2264 ISOtech */
+ {"lfloor", 8970}, /* left floor = apl downstile, U+230A ISOamsc */
+ {"lowast", 8727}, /* asterisk operator, U+2217 ISOtech */
+ {"loz", 9674}, /* lozenge, U+25CA ISOpub */
+ {"lrm", 8206}, /* left-to-right mark, U+200E NEW RFC 2070 */
+ {"lsaquo", 8249}, /* single left-pointing angle quotation mark, U+2039 ISO proposed */
+/* lsaquo is proposed but not yet ISO standardised */
+ {"lsquo", 8216}, /* left single quotation mark, U+2018 ISOnum */
+ {"lt", 60}, /* less-than sign, U+003C ISOnum */
+ {"macr", 175}, /* macron = spacing macron = overline = APL overbar, U+00AF ISOdia */
+ {"mdash", 8212}, /* em dash, U+2014 ISOpub */
+ {"micro", 181}, /* micro sign, U+00B5 ISOnum */
+ {"middot", 183}, /* middle dot = Georgian comma = Greek middle dot, U+00B7 ISOnum */
+ {"minus", 8722}, /* minus sign, U+2212 ISOtech */
+ {"mu", 956}, /* greek small letter mu, U+03BC ISOgrk3 */
+ {"nabla", 8711}, /* nabla = backward difference, U+2207 ISOtech */
+ {"nbsp", 160}, /* no-break space = non-breaking space, U+00A0 ISOnum */
+ {"ndash", 8211}, /* en dash, U+2013 ISOpub */
+ {"ne", 8800}, /* not equal to, U+2260 ISOtech */
+ {"ni", 8715}, /* contains as member, U+220B ISOtech */
+/* should there be a more memorable name than 'ni'? */
+ {"not", 172}, /* not sign = discretionary hyphen, U+00AC ISOnum */
+ {"notin", 8713}, /* not an element of, U+2209 ISOtech */
+ {"nsub", 8836}, /* not a subset of, U+2284 ISOamsn */
+ {"ntilde", 241}, /* latin small letter n with tilde, U+00F1 ISOlat1 */
+ {"nu", 957}, /* greek small letter nu, U+03BD ISOgrk3 */
+ {"oacute", 243}, /* latin small letter o with acute, U+00F3 ISOlat1 */
+ {"ocirc", 244}, /* latin small letter o with circumflex, U+00F4 ISOlat1 */
+ {"oelig", 339}, /* latin small ligature oe, U+0153 ISOlat2 */
+ {"ograve", 242}, /* latin small letter o with grave, U+00F2 ISOlat1 */
+ {"oline", 8254}, /* overline = spacing overscore, U+203E NEW */
+ {"omega", 969}, /* greek small letter omega, U+03C9 ISOgrk3 */
+ {"omicron", 959}, /* greek small letter omicron, U+03BF NEW */
+ {"oplus", 8853}, /* circled plus = direct sum, U+2295 ISOamsb */
+ {"or", 8744}, /* logical or = vee, U+2228 ISOtech */
+ {"ordf", 170}, /* feminine ordinal indicator, U+00AA ISOnum */
+ {"ordm", 186}, /* masculine ordinal indicator, U+00BA ISOnum */
+ {"oslash", 248}, /* latin small letter o with stroke, = latin small letter o slash, U+00F8 ISOlat1 */
+ {"otilde", 245}, /* latin small letter o with tilde, U+00F5 ISOlat1 */
+ {"otimes", 8855}, /* circled times = vector product, U+2297 ISOamsb */
+ {"ouml", 246}, /* latin small letter o with diaeresis, U+00F6 ISOlat1 */
+ {"para", 182}, /* pilcrow sign = paragraph sign, U+00B6 ISOnum */
+ {"part", 8706}, /* partial differential, U+2202 ISOtech */
+ {"permil", 8240}, /* per mille sign, U+2030 ISOtech */
+ {"perp", 8869}, /* up tack = orthogonal to = perpendicular, U+22A5 ISOtech */
+ {"phi", 966}, /* greek small letter phi, U+03C6 ISOgrk3 */
+ {"pi", 960}, /* greek small letter pi, U+03C0 ISOgrk3 */
+ {"piv", 982}, /* greek pi symbol, U+03D6 ISOgrk3 */
+ {"plusmn", 177}, /* plus-minus sign = plus-or-minus sign, U+00B1 ISOnum */
+ {"pound", 163}, /* pound sign, U+00A3 ISOnum */
+ {"prime", 8242}, /* prime = minutes = feet, U+2032 ISOtech */
+ {"prod", 8719}, /* n-ary product = product sign, U+220F ISOamsb */
+/* prod is NOT the same character as U+03A0 'greek capital letter pi' though the same glyph might be used for both */
+ {"prop", 8733}, /* proportional to, U+221D ISOtech */
+ {"psi", 968}, /* greek small letter psi, U+03C8 ISOgrk3 */
+ {"quot", 34}, /* quotation mark = APL quote, U+0022 ISOnum */
+ {"rArr", 8658}, /* rightwards double arrow, U+21D2 ISOtech */
+/* Unicode does not say this is the 'implies' character but does not have
+ another character with this function so ?
+ rArr can be used for 'implies' as ISOtech suggests */
+ {"radic", 8730}, /* square root = radical sign, U+221A ISOtech */
+ {"rang", 9002}, /* right-pointing angle bracket = ket, U+232A ISOtech */
+/* rang is NOT the same character as U+003E 'greater than' or U+203A 'single right-pointing angle quotation mark' */
+ {"raquo", 187}, /* right-pointing double angle quotation mark = right pointing guillemet, U+00BB ISOnum */
+ {"rarr", 8594}, /* rightwards arrow, U+2192 ISOnum */
+ {"rceil", 8969}, /* right ceiling, U+2309 ISOamsc */
+ {"rdquo", 8221}, /* right double quotation mark, U+201D ISOnum */
+ {"real", 8476}, /* blackletter capital R = real part symbol, U+211C ISOamso */
+ {"reg", 174}, /* registered sign = registered trade mark sign, U+00AE ISOnum */
+ {"rfloor", 8971}, /* right floor, U+230B ISOamsc */
+ {"rho", 961}, /* greek small letter rho, U+03C1 ISOgrk3 */
+ {"rlm", 8207}, /* right-to-left mark, U+200F NEW RFC 2070 */
+ {"rsaquo", 8250}, /* single right-pointing angle quotation mark, U+203A ISO proposed */
+/* rsaquo is proposed but not yet ISO standardised */
+ {"rsquo", 8217}, /* right single quotation mark, U+2019 ISOnum */
+ {"sbquo", 8218}, /* single low-9 quotation mark, U+201A NEW */
+ {"scaron", 353}, /* latin small letter s with caron, U+0161 ISOlat2 */
+ {"sdot", 8901}, /* dot operator, U+22C5 ISOamsb */
+/* dot operator is NOT the same character as U+00B7 middle dot */
+ {"sect", 167}, /* section sign, U+00A7 ISOnum */
+ {"shy", 173}, /* soft hyphen = discretionary hyphen, U+00AD ISOnum */
+ {"sigma", 963}, /* greek small letter sigma, U+03C3 ISOgrk3 */
+ {"sigmaf", 962}, /* greek small letter final sigma, U+03C2 ISOgrk3 */
+ {"sim", 8764}, /* tilde operator = varies with = similar to, U+223C ISOtech */
+/* tilde operator is NOT the same character as the tilde, U+007E, although the same glyph might be used to represent both */
+ {"spades", 9824}, /* black spade suit, U+2660 ISOpub */
+/* black here seems to mean filled as opposed to hollow */
+ {"sub", 8834}, /* subset of, U+2282 ISOtech */
+ {"sube", 8838}, /* subset of or equal to, U+2286 ISOtech */
+ {"sum", 8721}, /* n-ary sumation, U+2211 ISOamsb */
+/* sum is NOT the same character as U+03A3 'greek capital letter sigma' though the same glyph might be used for both */
+ {"sup", 8835}, /* superset of, U+2283 ISOtech */
+/* note that nsup, 'not a superset of, U+2283' is not covered by the Symbol
+ font encoding and is not included. Should it be, for symmetry?
+ It is in ISOamsn */
+ {"sup1", 185}, /* superscript one = superscript digit one, U+00B9 ISOnum */
+ {"sup2", 178}, /* superscript two = superscript digit two = squared, U+00B2 ISOnum */
+ {"sup3", 179}, /* superscript three = superscript digit three = cubed, U+00B3 ISOnum */
+ {"supe", 8839}, /* superset of or equal to, U+2287 ISOtech */
+ {"szlig", 223}, /* latin small letter sharp s = ess-zed, U+00DF ISOlat1 */
+ {"tau", 964}, /* greek small letter tau, U+03C4 ISOgrk3 */
+ {"there4", 8756}, /* therefore, U+2234 ISOtech */
+ {"theta", 952}, /* greek small letter theta, U+03B8 ISOgrk3 */
+ {"thetasym", 977}, /* greek small letter theta symbol, U+03D1 NEW */
+ {"thinsp", 8201}, /* thin space, U+2009 ISOpub */
+ {"thorn", 254}, /* latin small letter thorn with, U+00FE ISOlat1 */
+ {"tilde", 732}, /* small tilde, U+02DC ISOdia */
+ {"times", 215}, /* multiplication sign, U+00D7 ISOnum */
+ {"trade", 8482}, /* trade mark sign, U+2122 ISOnum */
+ {"uArr", 8657}, /* upwards double arrow, U+21D1 ISOamsa */
+ {"uacute", 250}, /* latin small letter u with acute, U+00FA ISOlat1 */
+ {"uarr", 8593}, /* upwards arrow, U+2191 ISOnum */
+ {"ucirc", 251}, /* latin small letter u with circumflex, U+00FB ISOlat1 */
+ {"ugrave", 249}, /* latin small letter u with grave, U+00F9 ISOlat1 */
+ {"uml", 168}, /* diaeresis = spacing diaeresis, U+00A8 ISOdia */
+ {"upsih", 978}, /* greek upsilon with hook symbol, U+03D2 NEW */
+ {"upsilon", 965}, /* greek small letter upsilon, U+03C5 ISOgrk3 */
+ {"uuml", 252}, /* latin small letter u with diaeresis, U+00FC ISOlat1 */
+ {"weierp", 8472}, /* script capital P = power set = Weierstrass p, U+2118 ISOamso */
+ {"xi", 958}, /* greek small letter xi, U+03BE ISOgrk3 */
+ {"yacute", 253}, /* latin small letter y with acute, U+00FD ISOlat1 */
+ {"yen", 165}, /* yen sign = yuan sign, U+00A5 ISOnum */
+ {"yuml", 255}, /* latin small letter y with diaeresis, U+00FF ISOlat1 */
+ {"zeta", 950}, /* greek small letter zeta, U+03B6 ISOgrk3 */
+ {"zwj", 8205}, /* zero width joiner, U+200D NEW RFC 2070 */
+ {"zwnj", 8204}, /* zero width non-joiner, U+200C NEW RFC 2070 */
+};
+
+#else /* not ENTITIES_HTML40_ONLY: */
+/***************************************************************************
+
+This table prepared from ftp://ftp.unicode.org/MAPPINGS/VENDORS/MISC/SGML.TXT
+original comment follows:
+
+
+# Author: John Cowan <cowan@ccil.org>
+# Date: 25 July 1997
+#
+# The following table maps SGML character entities from various
+# public sets (namely, ISOamsa, ISOamsb, ISOamsc, ISOamsn, ISOamso,
+# ISOamsr, ISObox, ISOcyr1, ISOcyr2, ISOdia, ISOgrk1, ISOgrk2,
+# ISOgrk3, ISOgrk4, ISOlat1, ISOlat2, ISOnum, ISOpub, ISOtech,
+# HTMLspecial, HTMLsymbol) to corresponding Unicode characters.
+#
+# The table has four tab-separated columns:
+# Column 1: SGML character entity name
+# Column 2: SGML public entity set
+# Column 3: Unicode 2.0 character code
+# Column 4: Unicode 2.0 character name (UPPER CASE)
+# Entries which don't have Unicode equivalents have "0x????"
+# in Column 3 and a lower case description (from the public entity
+# set DTD) in Column 4. The mapping is not reversible, because many
+# distinctions are unified away in Unicode, particularly between
+# mathematical symbols.
+
+
+ We just sort it and move column 2 away (line too long, sorry;
+ look at sgml.html in test/ directory for details).
+
+Changes:
+ * Add few (obsolete) synonyms for compatibility with Lynx/2.5 and up:
+ "brkbar" for "brvbar" 0x00A6
+ "emdash" for "mdash" 0x2014
+ "endash" for "ndash" 0x2013
+ "hibar" for "macr" 0x00AF
+ BTW, lots of synonyms found in this table, we shouldn't worry about...
+ Totally around 1000 entries.
+
+
+Modified by Jacob Poon <jacob.poon@utoronto.ca>
+
+This table is modified improve support of HTML 4.0 character entity references,
+including Euro symbol support ("euro" 0x20AC).
+
+Known issues:
+
+The original table includes two different definitions of &loz; reference.
+Since HTML 4.0 only uses U+25CA, the U+2727 definition is commented out,
+until there is a good reason to put it back in.
+
+"b.delta" mapping fixed (was 0x03B3 = small gamma).
+
+At the end of the table, there are several unnumbered, commented references.
+These are not defined in HTML 4.0, and will remain so until they are defined
+in future SGML/HTML standards.
+
+The support for obsolete references are for backwards compatibility only. New
+SGML/HTML documents should not depend on these references just because Lynx can
+display them.
+
+****/
+{
+ {"AElig", 0x00C6}, /* LATIN CAPITAL LETTER AE */
+ {"Aacgr", 0x0386}, /* GREEK CAPITAL LETTER ALPHA WITH TONOS */
+ {"Aacute", 0x00C1}, /* LATIN CAPITAL LETTER A WITH ACUTE */
+ {"Abreve", 0x0102}, /* LATIN CAPITAL LETTER A WITH BREVE */
+ {"Acirc", 0x00C2}, /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX */
+ {"Acy", 0x0410}, /* CYRILLIC CAPITAL LETTER A */
+ {"Agr", 0x0391}, /* GREEK CAPITAL LETTER ALPHA */
+ {"Agrave", 0x00C0}, /* LATIN CAPITAL LETTER A WITH GRAVE */
+ {"Alpha", 0x0391}, /* GREEK CAPITAL LETTER ALPHA */
+ {"Amacr", 0x0100}, /* LATIN CAPITAL LETTER A WITH MACRON */
+ {"Aogon", 0x0104}, /* LATIN CAPITAL LETTER A WITH OGONEK */
+ {"Aring", 0x00C5}, /* LATIN CAPITAL LETTER A WITH RING ABOVE */
+ {"Atilde", 0x00C3}, /* LATIN CAPITAL LETTER A WITH TILDE */
+ {"Auml", 0x00C4}, /* LATIN CAPITAL LETTER A WITH DIAERESIS */
+ {"Barwed", 0x2306}, /* PERSPECTIVE */
+ {"Bcy", 0x0411}, /* CYRILLIC CAPITAL LETTER BE */
+ {"Beta", 0x0392}, /* GREEK CAPITAL LETTER BETA */
+ {"Bgr", 0x0392}, /* GREEK CAPITAL LETTER BETA */
+ {"CHcy", 0x0427}, /* CYRILLIC CAPITAL LETTER CHE */
+ {"Cacute", 0x0106}, /* LATIN CAPITAL LETTER C WITH ACUTE */
+ {"Cap", 0x22D2}, /* DOUBLE INTERSECTION */
+ {"Ccaron", 0x010C}, /* LATIN CAPITAL LETTER C WITH CARON */
+ {"Ccedil", 0x00C7}, /* LATIN CAPITAL LETTER C WITH CEDILLA */
+ {"Ccirc", 0x0108}, /* LATIN CAPITAL LETTER C WITH CIRCUMFLEX */
+ {"Cdot", 0x010A}, /* LATIN CAPITAL LETTER C WITH DOT ABOVE */
+ {"Chi", 0x03A7}, /* GREEK CAPITAL LETTER CHI */
+ {"Cup", 0x22D3}, /* DOUBLE UNION */
+ {"DJcy", 0x0402}, /* CYRILLIC CAPITAL LETTER DJE */
+ {"DScy", 0x0405}, /* CYRILLIC CAPITAL LETTER DZE */
+ {"DZcy", 0x040F}, /* CYRILLIC CAPITAL LETTER DZHE */
+ {"Dagger", 0x2021}, /* DOUBLE DAGGER */
+ {"Dcaron", 0x010E}, /* LATIN CAPITAL LETTER D WITH CARON */
+ {"Dcy", 0x0414}, /* CYRILLIC CAPITAL LETTER DE */
+ {"Delta", 0x0394}, /* GREEK CAPITAL LETTER DELTA */
+ {"Dgr", 0x0394}, /* GREEK CAPITAL LETTER DELTA */
+ {"Dot", 0x00A8}, /* DIAERESIS */
+ {"DotDot", 0x20DC}, /* COMBINING FOUR DOTS ABOVE */
+ {"Dstrok", 0x0110}, /* LATIN CAPITAL LETTER D WITH STROKE */
+ {"EEacgr", 0x0389}, /* GREEK CAPITAL LETTER ETA WITH TONOS */
+ {"EEgr", 0x0397}, /* GREEK CAPITAL LETTER ETA */
+ {"ENG", 0x014A}, /* LATIN CAPITAL LETTER ENG */
+ {"ETH", 0x00D0}, /* LATIN CAPITAL LETTER ETH */
+ {"Eacgr", 0x0388}, /* GREEK CAPITAL LETTER EPSILON WITH TONOS */
+ {"Eacute", 0x00C9}, /* LATIN CAPITAL LETTER E WITH ACUTE */
+ {"Ecaron", 0x011A}, /* LATIN CAPITAL LETTER E WITH CARON */
+ {"Ecirc", 0x00CA}, /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX */
+ {"Ecy", 0x042D}, /* CYRILLIC CAPITAL LETTER E */
+ {"Edot", 0x0116}, /* LATIN CAPITAL LETTER E WITH DOT ABOVE */
+ {"Egr", 0x0395}, /* GREEK CAPITAL LETTER EPSILON */
+ {"Egrave", 0x00C8}, /* LATIN CAPITAL LETTER E WITH GRAVE */
+ {"Emacr", 0x0112}, /* LATIN CAPITAL LETTER E WITH MACRON */
+ {"Eogon", 0x0118}, /* LATIN CAPITAL LETTER E WITH OGONEK */
+ {"Epsilon", 0x0395}, /* GREEK CAPITAL LETTER EPSILON */
+ {"Eta", 0x0397}, /* GREEK CAPITAL LETTER ETA */
+ {"Euml", 0x00CB}, /* LATIN CAPITAL LETTER E WITH DIAERESIS */
+ {"Fcy", 0x0424}, /* CYRILLIC CAPITAL LETTER EF */
+ {"GJcy", 0x0403}, /* CYRILLIC CAPITAL LETTER GJE */
+ {"Gamma", 0x0393}, /* GREEK CAPITAL LETTER GAMMA */
+ {"Gbreve", 0x011E}, /* LATIN CAPITAL LETTER G WITH BREVE */
+ {"Gcedil", 0x0122}, /* LATIN CAPITAL LETTER G WITH CEDILLA */
+ {"Gcirc", 0x011C}, /* LATIN CAPITAL LETTER G WITH CIRCUMFLEX */
+ {"Gcy", 0x0413}, /* CYRILLIC CAPITAL LETTER GHE */
+ {"Gdot", 0x0120}, /* LATIN CAPITAL LETTER G WITH DOT ABOVE */
+ {"Gg", 0x22D9}, /* VERY MUCH GREATER-THAN */
+ {"Ggr", 0x0393}, /* GREEK CAPITAL LETTER GAMMA */
+ {"Gt", 0x226B}, /* MUCH GREATER-THAN */
+ {"HARDcy", 0x042A}, /* CYRILLIC CAPITAL LETTER HARD SIGN */
+ {"Hcirc", 0x0124}, /* LATIN CAPITAL LETTER H WITH CIRCUMFLEX */
+ {"Hstrok", 0x0126}, /* LATIN CAPITAL LETTER H WITH STROKE */
+ {"IEcy", 0x0415}, /* CYRILLIC CAPITAL LETTER IE */
+ {"IJlig", 0x0132}, /* LATIN CAPITAL LIGATURE IJ */
+ {"IOcy", 0x0401}, /* CYRILLIC CAPITAL LETTER IO */
+ {"Iacgr", 0x038A}, /* GREEK CAPITAL LETTER IOTA WITH TONOS */
+ {"Iacute", 0x00CD}, /* LATIN CAPITAL LETTER I WITH ACUTE */
+ {"Icirc", 0x00CE}, /* LATIN CAPITAL LETTER I WITH CIRCUMFLEX */
+ {"Icy", 0x0418}, /* CYRILLIC CAPITAL LETTER I */
+ {"Idigr", 0x03AA}, /* GREEK CAPITAL LETTER IOTA WITH DIALYTIKA */
+ {"Idot", 0x0130}, /* LATIN CAPITAL LETTER I WITH DOT ABOVE */
+ {"Igr", 0x0399}, /* GREEK CAPITAL LETTER IOTA */
+ {"Igrave", 0x00CC}, /* LATIN CAPITAL LETTER I WITH GRAVE */
+ {"Imacr", 0x012A}, /* LATIN CAPITAL LETTER I WITH MACRON */
+ {"Iogon", 0x012E}, /* LATIN CAPITAL LETTER I WITH OGONEK */
+ {"Iota", 0x0399}, /* GREEK CAPITAL LETTER IOTA */
+ {"Itilde", 0x0128}, /* LATIN CAPITAL LETTER I WITH TILDE */
+ {"Iukcy", 0x0406}, /* CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN*/
+ {"Iuml", 0x00CF}, /* LATIN CAPITAL LETTER I WITH DIAERESIS */
+ {"Jcirc", 0x0134}, /* LATIN CAPITAL LETTER J WITH CIRCUMFLEX */
+ {"Jcy", 0x0419}, /* CYRILLIC CAPITAL LETTER SHORT I */
+ {"Jsercy", 0x0408}, /* CYRILLIC CAPITAL LETTER JE */
+ {"Jukcy", 0x0404}, /* CYRILLIC CAPITAL LETTER UKRAINIAN IE */
+ {"KHcy", 0x0425}, /* CYRILLIC CAPITAL LETTER HA */
+ {"KHgr", 0x03A7}, /* GREEK CAPITAL LETTER CHI */
+ {"KJcy", 0x040C}, /* CYRILLIC CAPITAL LETTER KJE */
+ {"Kappa", 0x039A}, /* GREEK CAPITAL LETTER KAPPA */
+ {"Kcedil", 0x0136}, /* LATIN CAPITAL LETTER K WITH CEDILLA */
+ {"Kcy", 0x041A}, /* CYRILLIC CAPITAL LETTER KA */
+ {"Kgr", 0x039A}, /* GREEK CAPITAL LETTER KAPPA */
+ {"LJcy", 0x0409}, /* CYRILLIC CAPITAL LETTER LJE */
+ {"Lacute", 0x0139}, /* LATIN CAPITAL LETTER L WITH ACUTE */
+ {"Lambda", 0x039B}, /* GREEK CAPITAL LETTER LAMDA */
+ {"Larr", 0x219E}, /* LEFTWARDS TWO HEADED ARROW */
+ {"Lcaron", 0x013D}, /* LATIN CAPITAL LETTER L WITH CARON */
+ {"Lcedil", 0x013B}, /* LATIN CAPITAL LETTER L WITH CEDILLA */
+ {"Lcy", 0x041B}, /* CYRILLIC CAPITAL LETTER EL */
+ {"Lgr", 0x039B}, /* GREEK CAPITAL LETTER LAMDA */
+ {"Ll", 0x22D8}, /* VERY MUCH LESS-THAN */
+ {"Lmidot", 0x013F}, /* LATIN CAPITAL LETTER L WITH MIDDLE DOT */
+ {"Lstrok", 0x0141}, /* LATIN CAPITAL LETTER L WITH STROKE */
+ {"Lt", 0x226A}, /* MUCH LESS-THAN */
+ {"Mcy", 0x041C}, /* CYRILLIC CAPITAL LETTER EM */
+ {"Mgr", 0x039C}, /* GREEK CAPITAL LETTER MU */
+ {"Mu", 0x039C}, /* GREEK CAPITAL LETTER MU */
+ {"NJcy", 0x040A}, /* CYRILLIC CAPITAL LETTER NJE */
+ {"Nacute", 0x0143}, /* LATIN CAPITAL LETTER N WITH ACUTE */
+ {"Ncaron", 0x0147}, /* LATIN CAPITAL LETTER N WITH CARON */
+ {"Ncedil", 0x0145}, /* LATIN CAPITAL LETTER N WITH CEDILLA */
+ {"Ncy", 0x041D}, /* CYRILLIC CAPITAL LETTER EN */
+ {"Ngr", 0x039D}, /* GREEK CAPITAL LETTER NU */
+ {"Ntilde", 0x00D1}, /* LATIN CAPITAL LETTER N WITH TILDE */
+ {"Nu", 0x039D}, /* GREEK CAPITAL LETTER NU */
+ {"OElig", 0x0152}, /* LATIN CAPITAL LIGATURE OE */
+ {"OHacgr", 0x038F}, /* GREEK CAPITAL LETTER OMEGA WITH TONOS */
+ {"OHgr", 0x03A9}, /* GREEK CAPITAL LETTER OMEGA */
+ {"Oacgr", 0x038C}, /* GREEK CAPITAL LETTER OMICRON WITH TONOS */
+ {"Oacute", 0x00D3}, /* LATIN CAPITAL LETTER O WITH ACUTE */
+ {"Ocirc", 0x00D4}, /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX */
+ {"Ocy", 0x041E}, /* CYRILLIC CAPITAL LETTER O */
+ {"Odblac", 0x0150}, /* LATIN CAPITAL LETTER O WITH DOUBLE ACUTE */
+ {"Ogr", 0x039F}, /* GREEK CAPITAL LETTER OMICRON */
+ {"Ograve", 0x00D2}, /* LATIN CAPITAL LETTER O WITH GRAVE */
+ {"Omacr", 0x014C}, /* LATIN CAPITAL LETTER O WITH MACRON */
+ {"Omega", 0x03A9}, /* GREEK CAPITAL LETTER OMEGA */
+ {"Omicron", 0x039F}, /* GREEK CAPITAL LETTER OMICRON */
+ {"Oslash", 0x00D8}, /* LATIN CAPITAL LETTER O WITH STROKE */
+ {"Otilde", 0x00D5}, /* LATIN CAPITAL LETTER O WITH TILDE */
+ {"Ouml", 0x00D6}, /* LATIN CAPITAL LETTER O WITH DIAERESIS */
+ {"PHgr", 0x03A6}, /* GREEK CAPITAL LETTER PHI */
+ {"PSgr", 0x03A8}, /* GREEK CAPITAL LETTER PSI */
+ {"Pcy", 0x041F}, /* CYRILLIC CAPITAL LETTER PE */
+ {"Pgr", 0x03A0}, /* GREEK CAPITAL LETTER PI */
+ {"Phi", 0x03A6}, /* GREEK CAPITAL LETTER PHI */
+ {"Pi", 0x03A0}, /* GREEK CAPITAL LETTER PI */
+ {"Prime", 0x2033}, /* DOUBLE PRIME */
+ {"Psi", 0x03A8}, /* GREEK CAPITAL LETTER PSI */
+ {"Racute", 0x0154}, /* LATIN CAPITAL LETTER R WITH ACUTE */
+ {"Rarr", 0x21A0}, /* RIGHTWARDS TWO HEADED ARROW */
+ {"Rcaron", 0x0158}, /* LATIN CAPITAL LETTER R WITH CARON */
+ {"Rcedil", 0x0156}, /* LATIN CAPITAL LETTER R WITH CEDILLA */
+ {"Rcy", 0x0420}, /* CYRILLIC CAPITAL LETTER ER */
+ {"Rgr", 0x03A1}, /* GREEK CAPITAL LETTER RHO */
+ {"Rho", 0x03A1}, /* GREEK CAPITAL LETTER RHO */
+ {"SHCHcy", 0x0429}, /* CYRILLIC CAPITAL LETTER SHCHA */
+ {"SHcy", 0x0428}, /* CYRILLIC CAPITAL LETTER SHA */
+ {"SOFTcy", 0x042C}, /* CYRILLIC CAPITAL LETTER SOFT SIGN */
+ {"Sacute", 0x015A}, /* LATIN CAPITAL LETTER S WITH ACUTE */
+ {"Scaron", 0x0160}, /* LATIN CAPITAL LETTER S WITH CARON */
+ {"Scedil", 0x015E}, /* LATIN CAPITAL LETTER S WITH CEDILLA */
+ {"Scirc", 0x015C}, /* LATIN CAPITAL LETTER S WITH CIRCUMFLEX */
+ {"Scy", 0x0421}, /* CYRILLIC CAPITAL LETTER ES */
+ {"Sgr", 0x03A3}, /* GREEK CAPITAL LETTER SIGMA */
+ {"Sigma", 0x03A3}, /* GREEK CAPITAL LETTER SIGMA */
+ {"Sub", 0x22D0}, /* DOUBLE SUBSET */
+ {"Sup", 0x22D1}, /* DOUBLE SUPERSET */
+ {"THORN", 0x00DE}, /* LATIN CAPITAL LETTER THORN */
+ {"THgr", 0x0398}, /* GREEK CAPITAL LETTER THETA */
+ {"TSHcy", 0x040B}, /* CYRILLIC CAPITAL LETTER TSHE */
+ {"TScy", 0x0426}, /* CYRILLIC CAPITAL LETTER TSE */
+ {"Tau", 0x03A4}, /* GREEK CAPITAL LETTER TAU */
+ {"Tcaron", 0x0164}, /* LATIN CAPITAL LETTER T WITH CARON */
+ {"Tcedil", 0x0162}, /* LATIN CAPITAL LETTER T WITH CEDILLA */
+ {"Tcy", 0x0422}, /* CYRILLIC CAPITAL LETTER TE */
+ {"Tgr", 0x03A4}, /* GREEK CAPITAL LETTER TAU */
+ {"Theta", 0x0398}, /* GREEK CAPITAL LETTER THETA */
+ {"Tstrok", 0x0166}, /* LATIN CAPITAL LETTER T WITH STROKE */
+ {"Uacgr", 0x038E}, /* GREEK CAPITAL LETTER UPSILON WITH TONOS */
+ {"Uacute", 0x00DA}, /* LATIN CAPITAL LETTER U WITH ACUTE */
+ {"Ubrcy", 0x040E}, /* CYRILLIC CAPITAL LETTER SHORT U */
+ {"Ubreve", 0x016C}, /* LATIN CAPITAL LETTER U WITH BREVE */
+ {"Ucirc", 0x00DB}, /* LATIN CAPITAL LETTER U WITH CIRCUMFLEX */
+ {"Ucy", 0x0423}, /* CYRILLIC CAPITAL LETTER U */
+ {"Udblac", 0x0170}, /* LATIN CAPITAL LETTER U WITH DOUBLE ACUTE */
+ {"Udigr", 0x03AB}, /* GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA */
+ {"Ugr", 0x03A5}, /* GREEK CAPITAL LETTER UPSILON */
+ {"Ugrave", 0x00D9}, /* LATIN CAPITAL LETTER U WITH GRAVE */
+ {"Umacr", 0x016A}, /* LATIN CAPITAL LETTER U WITH MACRON */
+ {"Uogon", 0x0172}, /* LATIN CAPITAL LETTER U WITH OGONEK */
+ {"Upsi", 0x03A5}, /* GREEK CAPITAL LETTER UPSILON */
+ {"Upsilon", 0x03A5}, /* GREEK CAPITAL LETTER UPSILON */
+ {"Uring", 0x016E}, /* LATIN CAPITAL LETTER U WITH RING ABOVE */
+ {"Utilde", 0x0168}, /* LATIN CAPITAL LETTER U WITH TILDE */
+ {"Uuml", 0x00DC}, /* LATIN CAPITAL LETTER U WITH DIAERESIS */
+ {"Vcy", 0x0412}, /* CYRILLIC CAPITAL LETTER VE */
+ {"Vdash", 0x22A9}, /* FORCES */
+ {"Verbar", 0x2016}, /* DOUBLE VERTICAL LINE */
+ {"Vvdash", 0x22AA}, /* TRIPLE VERTICAL BAR RIGHT TURNSTILE */
+ {"Wcirc", 0x0174}, /* LATIN CAPITAL LETTER W WITH CIRCUMFLEX */
+ {"Xgr", 0x039E}, /* GREEK CAPITAL LETTER XI */
+ {"Xi", 0x039E}, /* GREEK CAPITAL LETTER XI */
+ {"YAcy", 0x042F}, /* CYRILLIC CAPITAL LETTER YA */
+ {"YIcy", 0x0407}, /* CYRILLIC CAPITAL LETTER YI */
+ {"YUcy", 0x042E}, /* CYRILLIC CAPITAL LETTER YU */
+ {"Yacute", 0x00DD}, /* LATIN CAPITAL LETTER Y WITH ACUTE */
+ {"Ycirc", 0x0176}, /* LATIN CAPITAL LETTER Y WITH CIRCUMFLEX */
+ {"Ycy", 0x042B}, /* CYRILLIC CAPITAL LETTER YERU */
+ {"Yuml", 0x0178}, /* LATIN CAPITAL LETTER Y WITH DIAERESIS */
+ {"ZHcy", 0x0416}, /* CYRILLIC CAPITAL LETTER ZHE */
+ {"Zacute", 0x0179}, /* LATIN CAPITAL LETTER Z WITH ACUTE */
+ {"Zcaron", 0x017D}, /* LATIN CAPITAL LETTER Z WITH CARON */
+ {"Zcy", 0x0417}, /* CYRILLIC CAPITAL LETTER ZE */
+ {"Zdot", 0x017B}, /* LATIN CAPITAL LETTER Z WITH DOT ABOVE */
+ {"Zeta", 0x0396}, /* GREEK CAPITAL LETTER ZETA */
+ {"Zgr", 0x0396}, /* GREEK CAPITAL LETTER ZETA */
+ {"aacgr", 0x03AC}, /* GREEK SMALL LETTER ALPHA WITH TONOS */
+ {"aacute", 0x00E1}, /* LATIN SMALL LETTER A WITH ACUTE */
+ {"abreve", 0x0103}, /* LATIN SMALL LETTER A WITH BREVE */
+ {"acirc", 0x00E2}, /* LATIN SMALL LETTER A WITH CIRCUMFLEX */
+ {"acute", 0x00B4}, /* ACUTE ACCENT */
+ {"acy", 0x0430}, /* CYRILLIC SMALL LETTER A */
+ {"aelig", 0x00E6}, /* LATIN SMALL LETTER AE */
+ {"agr", 0x03B1}, /* GREEK SMALL LETTER ALPHA */
+ {"agrave", 0x00E0}, /* LATIN SMALL LETTER A WITH GRAVE */
+ {"alefsym", 0x2135}, /* ALEF SYMBOL */
+ {"aleph", 0x2135}, /* ALEF SYMBOL */
+ {"alpha", 0x03B1}, /* GREEK SMALL LETTER ALPHA */
+ {"amacr", 0x0101}, /* LATIN SMALL LETTER A WITH MACRON */
+ {"amalg", 0x2210}, /* N-ARY COPRODUCT */
+ {"amp", 0x0026}, /* AMPERSAND */
+ {"and", 0x2227}, /* LOGICAL AND */
+ {"ang", 0x2220}, /* ANGLE */
+ {"ang90", 0x221F}, /* RIGHT ANGLE */
+ {"angmsd", 0x2221}, /* MEASURED ANGLE */
+ {"angsph", 0x2222}, /* SPHERICAL ANGLE */
+ {"angst", 0x212B}, /* ANGSTROM SIGN */
+ {"aogon", 0x0105}, /* LATIN SMALL LETTER A WITH OGONEK */
+ {"ap", 0x2248}, /* ALMOST EQUAL TO */
+ {"ape", 0x224A}, /* ALMOST EQUAL OR EQUAL TO */
+ {"apos", 0x02BC}, /* MODIFIER LETTER APOSTROPHE */
+ {"aring", 0x00E5}, /* LATIN SMALL LETTER A WITH RING ABOVE */
+ {"ast", 0x002A}, /* ASTERISK */
+ {"asymp", 0x2248}, /* ALMOST EQUAL TO */
+ {"atilde", 0x00E3}, /* LATIN SMALL LETTER A WITH TILDE */
+ {"auml", 0x00E4}, /* LATIN SMALL LETTER A WITH DIAERESIS */
+ {"b.Delta", 0x0394}, /* GREEK CAPITAL LETTER DELTA */
+ {"b.Gamma", 0x0393}, /* GREEK CAPITAL LETTER GAMMA */
+ {"b.Lambda", 0x039B}, /* GREEK CAPITAL LETTER LAMDA */
+ {"b.Omega", 0x03A9}, /* GREEK CAPITAL LETTER OMEGA */
+ {"b.Phi", 0x03A6}, /* GREEK CAPITAL LETTER PHI */
+ {"b.Pi", 0x03A0}, /* GREEK CAPITAL LETTER PI */
+ {"b.Psi", 0x03A8}, /* GREEK CAPITAL LETTER PSI */
+ {"b.Sigma", 0x03A3}, /* GREEK CAPITAL LETTER SIGMA */
+ {"b.Theta", 0x0398}, /* GREEK CAPITAL LETTER THETA */
+ {"b.Upsi", 0x03A5}, /* GREEK CAPITAL LETTER UPSILON */
+ {"b.Xi", 0x039E}, /* GREEK CAPITAL LETTER XI */
+ {"b.alpha", 0x03B1}, /* GREEK SMALL LETTER ALPHA */
+ {"b.beta", 0x03B2}, /* GREEK SMALL LETTER BETA */
+ {"b.chi", 0x03C7}, /* GREEK SMALL LETTER CHI */
+ {"b.delta", 0x03B4}, /* GREEK SMALL LETTER DELTA */
+ {"b.epsi", 0x03B5}, /* GREEK SMALL LETTER EPSILON */
+ {"b.epsis", 0x03B5}, /* GREEK SMALL LETTER EPSILON */
+ {"b.epsiv", 0x03B5}, /* GREEK SMALL LETTER EPSILON */
+ {"b.eta", 0x03B7}, /* GREEK SMALL LETTER ETA */
+ {"b.gamma", 0x03B3}, /* GREEK SMALL LETTER GAMMA */
+ {"b.gammad", 0x03DC}, /* GREEK LETTER DIGAMMA */
+ {"b.iota", 0x03B9}, /* GREEK SMALL LETTER IOTA */
+ {"b.kappa", 0x03BA}, /* GREEK SMALL LETTER KAPPA */
+ {"b.kappav", 0x03F0}, /* GREEK KAPPA SYMBOL */
+ {"b.lambda", 0x03BB}, /* GREEK SMALL LETTER LAMDA */
+ {"b.mu", 0x03BC}, /* GREEK SMALL LETTER MU */
+ {"b.nu", 0x03BD}, /* GREEK SMALL LETTER NU */
+ {"b.omega", 0x03CE}, /* GREEK SMALL LETTER OMEGA WITH TONOS */
+ {"b.phis", 0x03C6}, /* GREEK SMALL LETTER PHI */
+ {"b.phiv", 0x03D5}, /* GREEK PHI SYMBOL */
+ {"b.pi", 0x03C0}, /* GREEK SMALL LETTER PI */
+ {"b.piv", 0x03D6}, /* GREEK PI SYMBOL */
+ {"b.psi", 0x03C8}, /* GREEK SMALL LETTER PSI */
+ {"b.rho", 0x03C1}, /* GREEK SMALL LETTER RHO */
+ {"b.rhov", 0x03F1}, /* GREEK RHO SYMBOL */
+ {"b.sigma", 0x03C3}, /* GREEK SMALL LETTER SIGMA */
+ {"b.sigmav", 0x03C2}, /* GREEK SMALL LETTER FINAL SIGMA */
+ {"b.tau", 0x03C4}, /* GREEK SMALL LETTER TAU */
+ {"b.thetas", 0x03B8}, /* GREEK SMALL LETTER THETA */
+ {"b.thetav", 0x03D1}, /* GREEK THETA SYMBOL */
+ {"b.upsi", 0x03C5}, /* GREEK SMALL LETTER UPSILON */
+ {"b.xi", 0x03BE}, /* GREEK SMALL LETTER XI */
+ {"b.zeta", 0x03B6}, /* GREEK SMALL LETTER ZETA */
+ {"barwed", 0x22BC}, /* NAND */
+ {"bcong", 0x224C}, /* ALL EQUAL TO */
+ {"bcy", 0x0431}, /* CYRILLIC SMALL LETTER BE */
+ {"bdquo", 0x201E}, /* DOUBLE LOW-9 QUOTATION MARK */
+ {"becaus", 0x2235}, /* BECAUSE */
+ {"bepsi", 0x220D}, /* SMALL CONTAINS AS MEMBER */
+ {"bernou", 0x212C}, /* SCRIPT CAPITAL B */
+ {"beta", 0x03B2}, /* GREEK SMALL LETTER BETA */
+ {"beth", 0x2136}, /* BET SYMBOL */
+ {"bgr", 0x03B2}, /* GREEK SMALL LETTER BETA */
+ {"blank", 0x2423}, /* OPEN BOX */
+ {"blk12", 0x2592}, /* MEDIUM SHADE */
+ {"blk14", 0x2591}, /* LIGHT SHADE */
+ {"blk34", 0x2593}, /* DARK SHADE */
+ {"block", 0x2588}, /* FULL BLOCK */
+ {"bottom", 0x22A5}, /* UP TACK */
+ {"bowtie", 0x22C8}, /* BOWTIE */
+ {"boxDL", 0x2557}, /* BOX DRAWINGS DOUBLE DOWN AND LEFT */
+ {"boxDR", 0x2554}, /* BOX DRAWINGS DOUBLE DOWN AND RIGHT */
+ {"boxDl", 0x2556}, /* BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE */
+ {"boxDr", 0x2553}, /* BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE */
+ {"boxH", 0x2550}, /* BOX DRAWINGS DOUBLE HORIZONTAL */
+ {"boxHD", 0x2566}, /* BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL */
+ {"boxHU", 0x2569}, /* BOX DRAWINGS DOUBLE UP AND HORIZONTAL */
+ {"boxHd", 0x2564}, /* BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE*/
+ {"boxHu", 0x2567}, /* BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE */
+ {"boxUL", 0x255D}, /* BOX DRAWINGS DOUBLE UP AND LEFT */
+ {"boxUR", 0x255A}, /* BOX DRAWINGS DOUBLE UP AND RIGHT */
+ {"boxUl", 0x255C}, /* BOX DRAWINGS UP DOUBLE AND LEFT SINGLE */
+ {"boxUr", 0x2559}, /* BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE */
+ {"boxV", 0x2551}, /* BOX DRAWINGS DOUBLE VERTICAL */
+ {"boxVH", 0x256C}, /* BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL */
+ {"boxVL", 0x2563}, /* BOX DRAWINGS DOUBLE VERTICAL AND LEFT */
+ {"boxVR", 0x2560}, /* BOX DRAWINGS DOUBLE VERTICAL AND RIGHT */
+ {"boxVh", 0x256B}, /* BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SI*/
+ {"boxVl", 0x2562}, /* BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE */
+ {"boxVr", 0x255F}, /* BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE */
+ {"boxdL", 0x2555}, /* BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE */
+ {"boxdR", 0x2552}, /* BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE */
+ {"boxdl", 0x2510}, /* BOX DRAWINGS LIGHT DOWN AND LEFT */
+ {"boxdr", 0x250C}, /* BOX DRAWINGS LIGHT DOWN AND RIGHT */
+ {"boxh", 0x2500}, /* BOX DRAWINGS LIGHT HORIZONTAL */
+ {"boxhD", 0x2565}, /* BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE*/
+ {"boxhU", 0x2568}, /* BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE */
+ {"boxhd", 0x252C}, /* BOX DRAWINGS LIGHT DOWN AND HORIZONTAL */
+ {"boxhu", 0x2534}, /* BOX DRAWINGS LIGHT UP AND HORIZONTAL */
+ {"boxuL", 0x255B}, /* BOX DRAWINGS UP SINGLE AND LEFT DOUBLE */
+ {"boxuR", 0x2558}, /* BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE */
+ {"boxul", 0x2518}, /* BOX DRAWINGS LIGHT UP AND LEFT */
+ {"boxur", 0x2514}, /* BOX DRAWINGS LIGHT UP AND RIGHT */
+ {"boxv", 0x2502}, /* BOX DRAWINGS LIGHT VERTICAL */
+ {"boxvH", 0x256A}, /* BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DO*/
+ {"boxvL", 0x2561}, /* BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE */
+ {"boxvR", 0x255E}, /* BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE */
+ {"boxvh", 0x253C}, /* BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL */
+ {"boxvl", 0x2524}, /* BOX DRAWINGS LIGHT VERTICAL AND LEFT */
+ {"boxvr", 0x251C}, /* BOX DRAWINGS LIGHT VERTICAL AND RIGHT */
+ {"bprime", 0x2035}, /* REVERSED PRIME */
+ {"breve", 0x02D8}, /* BREVE */
+ {"brkbar", 0x00A6}, /* obsolete synonym for "brvbar" 0x00A6 */
+ {"brvbar", 0x00A6}, /* BROKEN BAR */
+ {"bsim", 0x223D}, /* REVERSED TILDE */
+ {"bsime", 0x22CD}, /* REVERSED TILDE EQUALS */
+ {"bsol", 0x005C}, /* REVERSE SOLIDUS */
+ {"bull", 0x2022}, /* BULLET */
+ {"bump", 0x224E}, /* GEOMETRICALLY EQUIVALENT TO */
+ {"bumpe", 0x224F}, /* DIFFERENCE BETWEEN */
+ {"cacute", 0x0107}, /* LATIN SMALL LETTER C WITH ACUTE */
+ {"cap", 0x2229}, /* INTERSECTION */
+ {"caret", 0x2041}, /* CARET INSERTION POINT */
+ {"caron", 0x02C7}, /* CARON */
+ {"ccaron", 0x010D}, /* LATIN SMALL LETTER C WITH CARON */
+ {"ccedil", 0x00E7}, /* LATIN SMALL LETTER C WITH CEDILLA */
+ {"ccirc", 0x0109}, /* LATIN SMALL LETTER C WITH CIRCUMFLEX */
+ {"cdot", 0x010B}, /* LATIN SMALL LETTER C WITH DOT ABOVE */
+ {"cedil", 0x00B8}, /* CEDILLA */
+ {"cent", 0x00A2}, /* CENT SIGN */
+ {"chcy", 0x0447}, /* CYRILLIC SMALL LETTER CHE */
+ {"check", 0x2713}, /* CHECK MARK */
+ {"chi", 0x03C7}, /* GREEK SMALL LETTER CHI */
+ {"cir", 0x25CB}, /* WHITE CIRCLE */
+ {"circ", 0x02C6}, /* MODIFIER LETTER CIRCUMFLEX ACCENT */
+ {"cire", 0x2257}, /* RING EQUAL TO */
+ {"clubs", 0x2663}, /* BLACK CLUB SUIT */
+ {"colon", 0x003A}, /* COLON */
+ {"colone", 0x2254}, /* COLON EQUALS */
+ {"comma", 0x002C}, /* COMMA */
+ {"commat", 0x0040}, /* COMMERCIAL AT */
+ {"comp", 0x2201}, /* COMPLEMENT */
+ {"compfn", 0x2218}, /* RING OPERATOR */
+ {"cong", 0x2245}, /* APPROXIMATELY EQUAL TO */
+ {"conint", 0x222E}, /* CONTOUR INTEGRAL */
+ {"coprod", 0x2210}, /* N-ARY COPRODUCT */
+ {"copy", 0x00A9}, /* COPYRIGHT SIGN */
+ {"copysr", 0x2117}, /* SOUND RECORDING COPYRIGHT */
+ {"crarr", 0x21B5}, /* DOWNWARDS ARROW WITH CORNER LEFTWARDS */
+ {"cross", 0x2717}, /* BALLOT X */
+ {"cuepr", 0x22DE}, /* EQUAL TO OR PRECEDES */
+ {"cuesc", 0x22DF}, /* EQUAL TO OR SUCCEEDS */
+ {"cularr", 0x21B6}, /* ANTICLOCKWISE TOP SEMICIRCLE ARROW */
+ {"cup", 0x222A}, /* UNION */
+ {"cupre", 0x227C}, /* PRECEDES OR EQUAL TO */
+ {"curarr", 0x21B7}, /* CLOCKWISE TOP SEMICIRCLE ARROW */
+ {"curren", 0x00A4}, /* CURRENCY SIGN */
+ {"cuvee", 0x22CE}, /* CURLY LOGICAL OR */
+ {"cuwed", 0x22CF}, /* CURLY LOGICAL AND */
+ {"dArr", 0x21D3}, /* DOWNWARDS DOUBLE ARROW */
+ {"dagger", 0x2020}, /* DAGGER */
+ {"daleth", 0x2138}, /* DALET SYMBOL */
+ {"darr", 0x2193}, /* DOWNWARDS ARROW */
+ {"darr2", 0x21CA}, /* DOWNWARDS PAIRED ARROWS */
+ {"dash", 0x2010}, /* HYPHEN */
+ {"dashv", 0x22A3}, /* LEFT TACK */
+ {"dblac", 0x02DD}, /* DOUBLE ACUTE ACCENT */
+ {"dcaron", 0x010F}, /* LATIN SMALL LETTER D WITH CARON */
+ {"dcy", 0x0434}, /* CYRILLIC SMALL LETTER DE */
+ {"deg", 0x00B0}, /* DEGREE SIGN */
+ {"delta", 0x03B4}, /* GREEK SMALL LETTER DELTA */
+ {"dgr", 0x03B4}, /* GREEK SMALL LETTER DELTA */
+ {"dharl", 0x21C3}, /* DOWNWARDS HARPOON WITH BARB LEFTWARDS */
+ {"dharr", 0x21C2}, /* DOWNWARDS HARPOON WITH BARB RIGHTWARDS */
+ {"diam", 0x22C4}, /* DIAMOND OPERATOR */
+ {"diams", 0x2666}, /* BLACK DIAMOND SUIT */
+ {"die", 0x00A8}, /* DIAERESIS */
+ {"divide", 0x00F7}, /* DIVISION SIGN */
+ {"divonx", 0x22C7}, /* DIVISION TIMES */
+ {"djcy", 0x0452}, /* CYRILLIC SMALL LETTER DJE */
+ {"dlarr", 0x2199}, /* SOUTH WEST ARROW */
+ {"dlcorn", 0x231E}, /* BOTTOM LEFT CORNER */
+ {"dlcrop", 0x230D}, /* BOTTOM LEFT CROP */
+ {"dollar", 0x0024}, /* DOLLAR SIGN */
+ {"dot", 0x02D9}, /* DOT ABOVE */
+ {"drarr", 0x2198}, /* SOUTH EAST ARROW */
+ {"drcorn", 0x231F}, /* BOTTOM RIGHT CORNER */
+ {"drcrop", 0x230C}, /* BOTTOM RIGHT CROP */
+ {"dscy", 0x0455}, /* CYRILLIC SMALL LETTER DZE */
+ {"dstrok", 0x0111}, /* LATIN SMALL LETTER D WITH STROKE */
+ {"dtri", 0x25BF}, /* WHITE DOWN-POINTING SMALL TRIANGLE */
+ {"dtrif", 0x25BE}, /* BLACK DOWN-POINTING SMALL TRIANGLE */
+ {"dzcy", 0x045F}, /* CYRILLIC SMALL LETTER DZHE */
+ {"eDot", 0x2251}, /* GEOMETRICALLY EQUAL TO */
+ {"eacgr", 0x03AD}, /* GREEK SMALL LETTER EPSILON WITH TONOS */
+ {"eacute", 0x00E9}, /* LATIN SMALL LETTER E WITH ACUTE */
+ {"ecaron", 0x011B}, /* LATIN SMALL LETTER E WITH CARON */
+ {"ecir", 0x2256}, /* RING IN EQUAL TO */
+ {"ecirc", 0x00EA}, /* LATIN SMALL LETTER E WITH CIRCUMFLEX */
+ {"ecolon", 0x2255}, /* EQUALS COLON */
+ {"ecy", 0x044D}, /* CYRILLIC SMALL LETTER E */
+ {"edot", 0x0117}, /* LATIN SMALL LETTER E WITH DOT ABOVE */
+ {"eeacgr", 0x03AE}, /* GREEK SMALL LETTER ETA WITH TONOS */
+ {"eegr", 0x03B7}, /* GREEK SMALL LETTER ETA */
+ {"efDot", 0x2252}, /* APPROXIMATELY EQUAL TO OR THE IMAGE OF */
+ {"egr", 0x03B5}, /* GREEK SMALL LETTER EPSILON */
+ {"egrave", 0x00E8}, /* LATIN SMALL LETTER E WITH GRAVE */
+ {"egs", 0x22DD}, /* EQUAL TO OR GREATER-THAN */
+ {"ell", 0x2113}, /* SCRIPT SMALL L */
+ {"els", 0x22DC}, /* EQUAL TO OR LESS-THAN */
+ {"emacr", 0x0113}, /* LATIN SMALL LETTER E WITH MACRON */
+ {"emdash", 0x2014}, /* obsolete synonym for "mdash" 0x2014 */
+ {"empty", 0x2205}, /* EMPTY SET */
+ {"emsp", 0x2003}, /* EM SPACE */
+ {"emsp13", 0x2004}, /* THREE-PER-EM SPACE */
+ {"emsp14", 0x2005}, /* FOUR-PER-EM SPACE */
+ {"endash", 0x2013}, /* obsolete synonym for "ndash" 0x2013 */
+ {"eng", 0x014B}, /* LATIN SMALL LETTER ENG */
+ {"ensp", 0x2002}, /* EN SPACE */
+ {"eogon", 0x0119}, /* LATIN SMALL LETTER E WITH OGONEK */
+ {"epsi", 0x03B5}, /* GREEK SMALL LETTER EPSILON */
+ {"epsilon", 0x03B5}, /* GREEK SMALL LETTER EPSILON */
+ {"epsis", 0x220A}, /* SMALL ELEMENT OF */
+ {"equals", 0x003D}, /* EQUALS SIGN */
+ {"equiv", 0x2261}, /* IDENTICAL TO */
+ {"erDot", 0x2253}, /* IMAGE OF OR APPROXIMATELY EQUAL TO */
+ {"esdot", 0x2250}, /* APPROACHES THE LIMIT */
+ {"eta", 0x03B7}, /* GREEK SMALL LETTER ETA */
+ {"eth", 0x00F0}, /* LATIN SMALL LETTER ETH */
+ {"euml", 0x00EB}, /* LATIN SMALL LETTER E WITH DIAERESIS */
+ {"euro", 0x20AC}, /* EURO SIGN */
+ {"excl", 0x0021}, /* EXCLAMATION MARK */
+ {"exist", 0x2203}, /* THERE EXISTS */
+ {"fcy", 0x0444}, /* CYRILLIC SMALL LETTER EF */
+ {"female", 0x2640}, /* FEMALE SIGN */
+ {"ffilig", 0xFB03}, /* LATIN SMALL LIGATURE FFI */
+ {"fflig", 0xFB00}, /* LATIN SMALL LIGATURE FF */
+ {"ffllig", 0xFB04}, /* LATIN SMALL LIGATURE FFL */
+ {"filig", 0xFB01}, /* LATIN SMALL LIGATURE FI */
+ {"flat", 0x266D}, /* MUSIC FLAT SIGN */
+ {"fllig", 0xFB02}, /* LATIN SMALL LIGATURE FL */
+ {"fnof", 0x0192}, /* LATIN SMALL LETTER F WITH HOOK */
+ {"forall", 0x2200}, /* FOR ALL */
+ {"fork", 0x22D4}, /* PITCHFORK */
+ {"frac12", 0x00BD}, /* VULGAR FRACTION ONE HALF */
+ {"frac13", 0x2153}, /* VULGAR FRACTION ONE THIRD */
+ {"frac14", 0x00BC}, /* VULGAR FRACTION ONE QUARTER */
+ {"frac15", 0x2155}, /* VULGAR FRACTION ONE FIFTH */
+ {"frac16", 0x2159}, /* VULGAR FRACTION ONE SIXTH */
+ {"frac18", 0x215B}, /* VULGAR FRACTION ONE EIGHTH */
+ {"frac23", 0x2154}, /* VULGAR FRACTION TWO THIRDS */
+ {"frac25", 0x2156}, /* VULGAR FRACTION TWO FIFTHS */
+ {"frac34", 0x00BE}, /* VULGAR FRACTION THREE QUARTERS */
+ {"frac35", 0x2157}, /* VULGAR FRACTION THREE FIFTHS */
+ {"frac38", 0x215C}, /* VULGAR FRACTION THREE EIGHTHS */
+ {"frac45", 0x2158}, /* VULGAR FRACTION FOUR FIFTHS */
+ {"frac56", 0x215A}, /* VULGAR FRACTION FIVE SIXTHS */
+ {"frac58", 0x215D}, /* VULGAR FRACTION FIVE EIGHTHS */
+ {"frac78", 0x215E}, /* VULGAR FRACTION SEVEN EIGHTHS */
+ {"frasl", 0x2044}, /* FRACTION SLASH */
+ {"frown", 0x2322}, /* FROWN */
+ {"gE", 0x2267}, /* GREATER-THAN OVER EQUAL TO */
+ {"gacute", 0x01F5}, /* LATIN SMALL LETTER G WITH ACUTE */
+ {"gamma", 0x03B3}, /* GREEK SMALL LETTER GAMMA */
+ {"gammad", 0x03DC}, /* GREEK LETTER DIGAMMA */
+ {"gbreve", 0x011F}, /* LATIN SMALL LETTER G WITH BREVE */
+ {"gcedil", 0x0123}, /* LATIN SMALL LETTER G WITH CEDILLA */
+ {"gcirc", 0x011D}, /* LATIN SMALL LETTER G WITH CIRCUMFLEX */
+ {"gcy", 0x0433}, /* CYRILLIC SMALL LETTER GHE */
+ {"gdot", 0x0121}, /* LATIN SMALL LETTER G WITH DOT ABOVE */
+ {"ge", 0x2265}, /* GREATER-THAN OR EQUAL TO */
+ {"gel", 0x22DB}, /* GREATER-THAN EQUAL TO OR LESS-THAN */
+ {"ges", 0x2265}, /* GREATER-THAN OR EQUAL TO */
+ {"ggr", 0x03B3}, /* GREEK SMALL LETTER GAMMA */
+ {"gimel", 0x2137}, /* GIMEL SYMBOL */
+ {"gjcy", 0x0453}, /* CYRILLIC SMALL LETTER GJE */
+ {"gl", 0x2277}, /* GREATER-THAN OR LESS-THAN */
+ {"gnE", 0x2269}, /* GREATER-THAN BUT NOT EQUAL TO */
+ {"gne", 0x2269}, /* GREATER-THAN BUT NOT EQUAL TO */
+ {"gnsim", 0x22E7}, /* GREATER-THAN BUT NOT EQUIVALENT TO */
+ {"grave", 0x0060}, /* GRAVE ACCENT */
+ {"gsdot", 0x22D7}, /* GREATER-THAN WITH DOT */
+ {"gsim", 0x2273}, /* GREATER-THAN OR EQUIVALENT TO */
+ {"gt", 0x003E}, /* GREATER-THAN SIGN */
+ {"gvnE", 0x2269}, /* GREATER-THAN BUT NOT EQUAL TO */
+ {"hArr", 0x21D4}, /* LEFT RIGHT DOUBLE ARROW */
+ {"hairsp", 0x200A}, /* HAIR SPACE */
+ {"half", 0x00BD}, /* VULGAR FRACTION ONE HALF */
+ {"hamilt", 0x210B}, /* SCRIPT CAPITAL H */
+ {"hardcy", 0x044A}, /* CYRILLIC SMALL LETTER HARD SIGN */
+ {"harr", 0x2194}, /* LEFT RIGHT ARROW */
+ {"harrw", 0x21AD}, /* LEFT RIGHT WAVE ARROW */
+ {"hcirc", 0x0125}, /* LATIN SMALL LETTER H WITH CIRCUMFLEX */
+ {"hearts", 0x2665}, /* BLACK HEART SUIT */
+ {"hellip", 0x2026}, /* HORIZONTAL ELLIPSIS */
+ {"hibar", 0x00AF}, /* obsolete synonym for "macr" 0x00AF */
+ {"horbar", 0x2015}, /* HORIZONTAL BAR */
+ {"hstrok", 0x0127}, /* LATIN SMALL LETTER H WITH STROKE */
+ {"hybull", 0x2043}, /* HYPHEN BULLET */
+ {"hyphen", 0x002D}, /* HYPHEN-MINUS */
+ {"iacgr", 0x03AF}, /* GREEK SMALL LETTER IOTA WITH TONOS */
+ {"iacute", 0x00ED}, /* LATIN SMALL LETTER I WITH ACUTE */
+ {"icirc", 0x00EE}, /* LATIN SMALL LETTER I WITH CIRCUMFLEX */
+ {"icy", 0x0438}, /* CYRILLIC SMALL LETTER I */
+ {"idiagr", 0x0390}, /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TON*/
+ {"idigr", 0x03CA}, /* GREEK SMALL LETTER IOTA WITH DIALYTIKA */
+ {"iecy", 0x0435}, /* CYRILLIC SMALL LETTER IE */
+ {"iexcl", 0x00A1}, /* INVERTED EXCLAMATION MARK */
+ {"iff", 0x21D4}, /* LEFT RIGHT DOUBLE ARROW */
+ {"igr", 0x03B9}, /* GREEK SMALL LETTER IOTA */
+ {"igrave", 0x00EC}, /* LATIN SMALL LETTER I WITH GRAVE */
+ {"ijlig", 0x0133}, /* LATIN SMALL LIGATURE IJ */
+ {"imacr", 0x012B}, /* LATIN SMALL LETTER I WITH MACRON */
+ {"image", 0x2111}, /* BLACK-LETTER CAPITAL I */
+ {"incare", 0x2105}, /* CARE OF */
+ {"infin", 0x221E}, /* INFINITY */
+ {"inodot", 0x0131}, /* LATIN SMALL LETTER DOTLESS I */
+ {"int", 0x222B}, /* INTEGRAL */
+ {"intcal", 0x22BA}, /* INTERCALATE */
+ {"iocy", 0x0451}, /* CYRILLIC SMALL LETTER IO */
+ {"iogon", 0x012F}, /* LATIN SMALL LETTER I WITH OGONEK */
+ {"iota", 0x03B9}, /* GREEK SMALL LETTER IOTA */
+ {"iquest", 0x00BF}, /* INVERTED QUESTION MARK */
+ {"isin", 0x2208}, /* ELEMENT OF */
+ {"itilde", 0x0129}, /* LATIN SMALL LETTER I WITH TILDE */
+ {"iukcy", 0x0456}, /* CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I*/
+ {"iuml", 0x00EF}, /* LATIN SMALL LETTER I WITH DIAERESIS */
+ {"jcirc", 0x0135}, /* LATIN SMALL LETTER J WITH CIRCUMFLEX */
+ {"jcy", 0x0439}, /* CYRILLIC SMALL LETTER SHORT I */
+ {"jsercy", 0x0458}, /* CYRILLIC SMALL LETTER JE */
+ {"jukcy", 0x0454}, /* CYRILLIC SMALL LETTER UKRAINIAN IE */
+ {"kappa", 0x03BA}, /* GREEK SMALL LETTER KAPPA */
+ {"kappav", 0x03F0}, /* GREEK KAPPA SYMBOL */
+ {"kcedil", 0x0137}, /* LATIN SMALL LETTER K WITH CEDILLA */
+ {"kcy", 0x043A}, /* CYRILLIC SMALL LETTER KA */
+ {"kgr", 0x03BA}, /* GREEK SMALL LETTER KAPPA */
+ {"kgreen", 0x0138}, /* LATIN SMALL LETTER KRA */
+ {"khcy", 0x0445}, /* CYRILLIC SMALL LETTER HA */
+ {"khgr", 0x03C7}, /* GREEK SMALL LETTER CHI */
+ {"kjcy", 0x045C}, /* CYRILLIC SMALL LETTER KJE */
+ {"lAarr", 0x21DA}, /* LEFTWARDS TRIPLE ARROW */
+ {"lArr", 0x21D0}, /* LEFTWARDS DOUBLE ARROW */
+ {"lE", 0x2266}, /* LESS-THAN OVER EQUAL TO */
+ {"lacute", 0x013A}, /* LATIN SMALL LETTER L WITH ACUTE */
+ {"lagran", 0x2112}, /* SCRIPT CAPITAL L */
+ {"lambda", 0x03BB}, /* GREEK SMALL LETTER LAMDA */
+ {"lang", 0x2329}, /* LEFT-POINTING ANGLE BRACKET */
+ {"laquo", 0x00AB}, /* LEFT-POINTING DOUBLE ANGLE QUOTATION MARK */
+ {"larr", 0x2190}, /* LEFTWARDS ARROW */
+ {"larr2", 0x21C7}, /* LEFTWARDS PAIRED ARROWS */
+ {"larrhk", 0x21A9}, /* LEFTWARDS ARROW WITH HOOK */
+ {"larrlp", 0x21AB}, /* LEFTWARDS ARROW WITH LOOP */
+ {"larrtl", 0x21A2}, /* LEFTWARDS ARROW WITH TAIL */
+ {"lcaron", 0x013E}, /* LATIN SMALL LETTER L WITH CARON */
+ {"lcedil", 0x013C}, /* LATIN SMALL LETTER L WITH CEDILLA */
+ {"lceil", 0x2308}, /* LEFT CEILING */
+ {"lcub", 0x007B}, /* LEFT CURLY BRACKET */
+ {"lcy", 0x043B}, /* CYRILLIC SMALL LETTER EL */
+ {"ldot", 0x22D6}, /* LESS-THAN WITH DOT */
+ {"ldquo", 0x201C}, /* LEFT DOUBLE QUOTATION MARK */
+ {"ldquor", 0x201E}, /* DOUBLE LOW-9 QUOTATION MARK */
+ {"le", 0x2264}, /* LESS-THAN OR EQUAL TO */
+ {"leg", 0x22DA}, /* LESS-THAN EQUAL TO OR GREATER-THAN */
+ {"les", 0x2264}, /* LESS-THAN OR EQUAL TO */
+ {"lfloor", 0x230A}, /* LEFT FLOOR */
+ {"lg", 0x2276}, /* LESS-THAN OR GREATER-THAN */
+ {"lgr", 0x03BB}, /* GREEK SMALL LETTER LAMDA */
+ {"lhard", 0x21BD}, /* LEFTWARDS HARPOON WITH BARB DOWNWARDS */
+ {"lharu", 0x21BC}, /* LEFTWARDS HARPOON WITH BARB UPWARDS */
+ {"lhblk", 0x2584}, /* LOWER HALF BLOCK */
+ {"ljcy", 0x0459}, /* CYRILLIC SMALL LETTER LJE */
+ {"lmidot", 0x0140}, /* LATIN SMALL LETTER L WITH MIDDLE DOT */
+ {"lnE", 0x2268}, /* LESS-THAN BUT NOT EQUAL TO */
+ {"lne", 0x2268}, /* LESS-THAN BUT NOT EQUAL TO */
+ {"lnsim", 0x22E6}, /* LESS-THAN BUT NOT EQUIVALENT TO */
+ {"lowast", 0x2217}, /* ASTERISK OPERATOR */
+ {"lowbar", 0x005F}, /* LOW LINE */
+ {"loz", 0x25CA}, /* LOZENGE */
+/*{"loz", 0x2727}, WHITE FOUR POINTED STAR */
+ /* Warning: Duplicated &loz; entry. HTML 4,0 defines it as U+25CA. */
+ {"lozf", 0x2726}, /* BLACK FOUR POINTED STAR */
+ {"lpar", 0x0028}, /* LEFT PARENTHESIS */
+ {"lrarr2", 0x21C6}, /* LEFTWARDS ARROW OVER RIGHTWARDS ARROW */
+ {"lrhar2", 0x21CB}, /* LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON */
+ {"lrm", 0x200E}, /* LEFT-TO-RIGHT MARK */
+ {"lsaquo", 0x2039}, /* SINGLE LEFT-POINTING ANGLE QUOTATION MARK */
+ {"lsh", 0x21B0}, /* UPWARDS ARROW WITH TIP LEFTWARDS */
+ {"lsim", 0x2272}, /* LESS-THAN OR EQUIVALENT TO */
+ {"lsqb", 0x005B}, /* LEFT SQUARE BRACKET */
+ {"lsquo", 0x2018}, /* LEFT SINGLE QUOTATION MARK */
+ {"lsquor", 0x201A}, /* SINGLE LOW-9 QUOTATION MARK */
+ {"lstrok", 0x0142}, /* LATIN SMALL LETTER L WITH STROKE */
+ {"lt", 0x003C}, /* LESS-THAN SIGN */
+ {"lthree", 0x22CB}, /* LEFT SEMIDIRECT PRODUCT */
+ {"ltimes", 0x22C9}, /* LEFT NORMAL FACTOR SEMIDIRECT PRODUCT */
+ {"ltri", 0x25C3}, /* WHITE LEFT-POINTING SMALL TRIANGLE */
+ {"ltrie", 0x22B4}, /* NORMAL SUBGROUP OF OR EQUAL TO */
+ {"ltrif", 0x25C2}, /* BLACK LEFT-POINTING SMALL TRIANGLE */
+ {"lvnE", 0x2268}, /* LESS-THAN BUT NOT EQUAL TO */
+ {"macr", 0x00AF}, /* MACRON */
+ {"male", 0x2642}, /* MALE SIGN */
+ {"malt", 0x2720}, /* MALTESE CROSS */
+ {"map", 0x21A6}, /* RIGHTWARDS ARROW FROM BAR */
+ {"marker", 0x25AE}, /* BLACK VERTICAL RECTANGLE */
+ {"mcy", 0x043C}, /* CYRILLIC SMALL LETTER EM */
+ {"mdash", 0x2014}, /* EM DASH */
+ {"mgr", 0x03BC}, /* GREEK SMALL LETTER MU */
+ {"micro", 0x00B5}, /* MICRO SIGN */
+ {"mid", 0x2223}, /* DIVIDES */
+ {"middot", 0x00B7}, /* MIDDLE DOT */
+ {"minus", 0x2212}, /* MINUS SIGN */
+ {"minusb", 0x229F}, /* SQUARED MINUS */
+ {"mldr", 0x2026}, /* HORIZONTAL ELLIPSIS */
+ {"mnplus", 0x2213}, /* MINUS-OR-PLUS SIGN */
+ {"models", 0x22A7}, /* MODELS */
+ {"mu", 0x03BC}, /* GREEK SMALL LETTER MU */
+ {"mumap", 0x22B8}, /* MULTIMAP */
+ {"nVDash", 0x22AF}, /* NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNS*/
+ {"nVdash", 0x22AE}, /* DOES NOT FORCE */
+ {"nabla", 0x2207}, /* NABLA */
+ {"nacute", 0x0144}, /* LATIN SMALL LETTER N WITH ACUTE */
+ {"nap", 0x2249}, /* NOT ALMOST EQUAL TO */
+ {"napos", 0x0149}, /* LATIN SMALL LETTER N PRECEDED BY APOSTROPHE */
+ {"natur", 0x266E}, /* MUSIC NATURAL SIGN */
+ {"nbsp", 0x00A0}, /* NO-BREAK SPACE */
+ {"ncaron", 0x0148}, /* LATIN SMALL LETTER N WITH CARON */
+ {"ncedil", 0x0146}, /* LATIN SMALL LETTER N WITH CEDILLA */
+ {"ncong", 0x2247}, /* NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO */
+ {"ncy", 0x043D}, /* CYRILLIC SMALL LETTER EN */
+ {"ndash", 0x2013}, /* EN DASH */
+ {"ne", 0x2260}, /* NOT EQUAL TO */
+ {"nearr", 0x2197}, /* NORTH EAST ARROW */
+ {"nequiv", 0x2262}, /* NOT IDENTICAL TO */
+ {"nexist", 0x2204}, /* THERE DOES NOT EXIST */
+ {"nge", 0x2271}, /* NEITHER GREATER-THAN NOR EQUAL TO */
+ {"nges", 0x2271}, /* NEITHER GREATER-THAN NOR EQUAL TO */
+ {"ngr", 0x03BD}, /* GREEK SMALL LETTER NU */
+ {"ngt", 0x226F}, /* NOT GREATER-THAN */
+ {"nhArr", 0x21CE}, /* LEFT RIGHT DOUBLE ARROW WITH STROKE */
+ {"nharr", 0x21AE}, /* LEFT RIGHT ARROW WITH STROKE */
+ {"ni", 0x220B}, /* CONTAINS AS MEMBER */
+ {"njcy", 0x045A}, /* CYRILLIC SMALL LETTER NJE */
+ {"nlArr", 0x21CD}, /* LEFTWARDS DOUBLE ARROW WITH STROKE */
+ {"nlarr", 0x219A}, /* LEFTWARDS ARROW WITH STROKE */
+ {"nldr", 0x2025}, /* TWO DOT LEADER */
+ {"nle", 0x2270}, /* NEITHER LESS-THAN NOR EQUAL TO */
+ {"nles", 0x2270}, /* NEITHER LESS-THAN NOR EQUAL TO */
+ {"nlt", 0x226E}, /* NOT LESS-THAN */
+ {"nltri", 0x22EA}, /* NOT NORMAL SUBGROUP OF */
+ {"nltrie", 0x22EC}, /* NOT NORMAL SUBGROUP OF OR EQUAL TO */
+ {"nmid", 0x2224}, /* DOES NOT DIVIDE */
+ {"not", 0x00AC}, /* NOT SIGN */
+ {"notin", 0x2209}, /* NOT AN ELEMENT OF */
+ {"npar", 0x2226}, /* NOT PARALLEL TO */
+ {"npr", 0x2280}, /* DOES NOT PRECEDE */
+ {"npre", 0x22E0}, /* DOES NOT PRECEDE OR EQUAL */
+ {"nrArr", 0x21CF}, /* RIGHTWARDS DOUBLE ARROW WITH STROKE */
+ {"nrarr", 0x219B}, /* RIGHTWARDS ARROW WITH STROKE */
+ {"nrtri", 0x22EB}, /* DOES NOT CONTAIN AS NORMAL SUBGROUP */
+ {"nrtrie", 0x22ED}, /* DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL */
+ {"nsc", 0x2281}, /* DOES NOT SUCCEED */
+ {"nsce", 0x22E1}, /* DOES NOT SUCCEED OR EQUAL */
+ {"nsim", 0x2241}, /* NOT TILDE */
+ {"nsime", 0x2244}, /* NOT ASYMPTOTICALLY EQUAL TO */
+ {"nspar", 0x2226}, /* NOT PARALLEL TO */
+ {"nsub", 0x2284}, /* NOT A SUBSET OF */
+ {"nsubE", 0x2288}, /* NEITHER A SUBSET OF NOR EQUAL TO */
+ {"nsube", 0x2288}, /* NEITHER A SUBSET OF NOR EQUAL TO */
+ {"nsup", 0x2285}, /* NOT A SUPERSET OF */
+ {"nsupE", 0x2289}, /* NEITHER A SUPERSET OF NOR EQUAL TO */
+ {"nsupe", 0x2289}, /* NEITHER A SUPERSET OF NOR EQUAL TO */
+ {"ntilde", 0x00F1}, /* LATIN SMALL LETTER N WITH TILDE */
+ {"nu", 0x03BD}, /* GREEK SMALL LETTER NU */
+ {"num", 0x0023}, /* NUMBER SIGN */
+ {"numero", 0x2116}, /* NUMERO SIGN */
+ {"numsp", 0x2007}, /* FIGURE SPACE */
+ {"nvDash", 0x22AD}, /* NOT TRUE */
+ {"nvdash", 0x22AC}, /* DOES NOT PROVE */
+ {"nwarr", 0x2196}, /* NORTH WEST ARROW */
+ {"oS", 0x24C8}, /* CIRCLED LATIN CAPITAL LETTER S */
+ {"oacgr", 0x03CC}, /* GREEK SMALL LETTER OMICRON WITH TONOS */
+ {"oacute", 0x00F3}, /* LATIN SMALL LETTER O WITH ACUTE */
+ {"oast", 0x229B}, /* CIRCLED ASTERISK OPERATOR */
+ {"ocir", 0x229A}, /* CIRCLED RING OPERATOR */
+ {"ocirc", 0x00F4}, /* LATIN SMALL LETTER O WITH CIRCUMFLEX */
+ {"ocy", 0x043E}, /* CYRILLIC SMALL LETTER O */
+ {"odash", 0x229D}, /* CIRCLED DASH */
+ {"odblac", 0x0151}, /* LATIN SMALL LETTER O WITH DOUBLE ACUTE */
+ {"odot", 0x2299}, /* CIRCLED DOT OPERATOR */
+ {"oelig", 0x0153}, /* LATIN SMALL LIGATURE OE */
+ {"ogon", 0x02DB}, /* OGONEK */
+ {"ogr", 0x03BF}, /* GREEK SMALL LETTER OMICRON */
+ {"ograve", 0x00F2}, /* LATIN SMALL LETTER O WITH GRAVE */
+ {"ohacgr", 0x03CE}, /* GREEK SMALL LETTER OMEGA WITH TONOS */
+ {"ohgr", 0x03C9}, /* GREEK SMALL LETTER OMEGA */
+ {"ohm", 0x2126}, /* OHM SIGN */
+ {"olarr", 0x21BA}, /* ANTICLOCKWISE OPEN CIRCLE ARROW */
+ {"oline", 0x203E}, /* OVERLINE */
+ {"omacr", 0x014D}, /* LATIN SMALL LETTER O WITH MACRON */
+ {"omega", 0x03C9}, /* GREEK SMALL LETTER OMEGA */
+ {"omicron", 0x03BF}, /* GREEK SMALL LETTER OMICRON */
+ {"ominus", 0x2296}, /* CIRCLED MINUS */
+ {"oplus", 0x2295}, /* CIRCLED PLUS */
+ {"or", 0x2228}, /* LOGICAL OR */
+ {"orarr", 0x21BB}, /* CLOCKWISE OPEN CIRCLE ARROW */
+ {"order", 0x2134}, /* SCRIPT SMALL O */
+ {"ordf", 0x00AA}, /* FEMININE ORDINAL INDICATOR */
+ {"ordm", 0x00BA}, /* MASCULINE ORDINAL INDICATOR */
+ {"oslash", 0x00F8}, /* LATIN SMALL LETTER O WITH STROKE */
+ {"osol", 0x2298}, /* CIRCLED DIVISION SLASH */
+ {"otilde", 0x00F5}, /* LATIN SMALL LETTER O WITH TILDE */
+ {"otimes", 0x2297}, /* CIRCLED TIMES */
+ {"ouml", 0x00F6}, /* LATIN SMALL LETTER O WITH DIAERESIS */
+ {"par", 0x2225}, /* PARALLEL TO */
+ {"para", 0x00B6}, /* PILCROW SIGN */
+ {"part", 0x2202}, /* PARTIAL DIFFERENTIAL */
+ {"pcy", 0x043F}, /* CYRILLIC SMALL LETTER PE */
+ {"percnt", 0x0025}, /* PERCENT SIGN */
+ {"period", 0x002E}, /* FULL STOP */
+ {"permil", 0x2030}, /* PER MILLE SIGN */
+ {"perp", 0x22A5}, /* UP TACK */
+ {"pgr", 0x03C0}, /* GREEK SMALL LETTER PI */
+ {"phgr", 0x03C6}, /* GREEK SMALL LETTER PHI */
+ {"phi", 0x03C6}, /* GREEK SMALL LETTER PHI */
+ {"phis", 0x03C6}, /* GREEK SMALL LETTER PHI */
+ {"phiv", 0x03D5}, /* GREEK PHI SYMBOL */
+ {"phmmat", 0x2133}, /* SCRIPT CAPITAL M */
+ {"phone", 0x260E}, /* BLACK TELEPHONE */
+ {"pi", 0x03C0}, /* GREEK SMALL LETTER PI */
+ {"piv", 0x03D6}, /* GREEK PI SYMBOL */
+ {"planck", 0x210F}, /* PLANCK CONSTANT OVER TWO PI */
+ {"plus", 0x002B}, /* PLUS SIGN */
+ {"plusb", 0x229E}, /* SQUARED PLUS */
+ {"plusdo", 0x2214}, /* DOT PLUS */
+ {"plusmn", 0x00B1}, /* PLUS-MINUS SIGN */
+ {"pound", 0x00A3}, /* POUND SIGN */
+ {"pr", 0x227A}, /* PRECEDES */
+ {"pre", 0x227C}, /* PRECEDES OR EQUAL TO */
+ {"prime", 0x2032}, /* PRIME */
+ {"prnsim", 0x22E8}, /* PRECEDES BUT NOT EQUIVALENT TO */
+ {"prod", 0x220F}, /* N-ARY PRODUCT */
+ {"prop", 0x221D}, /* PROPORTIONAL TO */
+ {"prsim", 0x227E}, /* PRECEDES OR EQUIVALENT TO */
+ {"psgr", 0x03C8}, /* GREEK SMALL LETTER PSI */
+ {"psi", 0x03C8}, /* GREEK SMALL LETTER PSI */
+ {"puncsp", 0x2008}, /* PUNCTUATION SPACE */
+ {"quest", 0x003F}, /* QUESTION MARK */
+ {"quot", 0x0022}, /* QUOTATION MARK */
+ {"rAarr", 0x21DB}, /* RIGHTWARDS TRIPLE ARROW */
+ {"rArr", 0x21D2}, /* RIGHTWARDS DOUBLE ARROW */
+ {"racute", 0x0155}, /* LATIN SMALL LETTER R WITH ACUTE */
+ {"radic", 0x221A}, /* SQUARE ROOT */
+ {"rang", 0x232A}, /* RIGHT-POINTING ANGLE BRACKET */
+ {"raquo", 0x00BB}, /* RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK */
+ {"rarr", 0x2192}, /* RIGHTWARDS ARROW */
+ {"rarr2", 0x21C9}, /* RIGHTWARDS PAIRED ARROWS */
+ {"rarrhk", 0x21AA}, /* RIGHTWARDS ARROW WITH HOOK */
+ {"rarrlp", 0x21AC}, /* RIGHTWARDS ARROW WITH LOOP */
+ {"rarrtl", 0x21A3}, /* RIGHTWARDS ARROW WITH TAIL */
+ {"rarrw", 0x219D}, /* RIGHTWARDS WAVE ARROW */
+ {"rcaron", 0x0159}, /* LATIN SMALL LETTER R WITH CARON */
+ {"rcedil", 0x0157}, /* LATIN SMALL LETTER R WITH CEDILLA */
+ {"rceil", 0x2309}, /* RIGHT CEILING */
+ {"rcub", 0x007D}, /* RIGHT CURLY BRACKET */
+ {"rcy", 0x0440}, /* CYRILLIC SMALL LETTER ER */
+ {"rdquo", 0x201D}, /* RIGHT DOUBLE QUOTATION MARK */
+ {"rdquor", 0x201C}, /* LEFT DOUBLE QUOTATION MARK */
+ {"real", 0x211C}, /* BLACK-LETTER CAPITAL R */
+ {"rect", 0x25AD}, /* WHITE RECTANGLE */
+ {"reg", 0x00AE}, /* REGISTERED SIGN */
+ {"rfloor", 0x230B}, /* RIGHT FLOOR */
+ {"rgr", 0x03C1}, /* GREEK SMALL LETTER RHO */
+ {"rhard", 0x21C1}, /* RIGHTWARDS HARPOON WITH BARB DOWNWARDS */
+ {"rharu", 0x21C0}, /* RIGHTWARDS HARPOON WITH BARB UPWARDS */
+ {"rho", 0x03C1}, /* GREEK SMALL LETTER RHO */
+ {"rhov", 0x03F1}, /* GREEK RHO SYMBOL */
+ {"ring", 0x02DA}, /* RING ABOVE */
+ {"rlarr2", 0x21C4}, /* RIGHTWARDS ARROW OVER LEFTWARDS ARROW */
+ {"rlhar2", 0x21CC}, /* RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON */
+ {"rlm", 0x200F}, /* RIGHT-TO-LEFT MARK */
+ {"rpar", 0x0029}, /* RIGHT PARENTHESIS */
+ {"rsaquo", 0x203A}, /* SINGLE RIGHT-POINTING ANGLE QUOTATION MARK */
+ {"rsh", 0x21B1}, /* UPWARDS ARROW WITH TIP RIGHTWARDS */
+ {"rsqb", 0x005D}, /* RIGHT SQUARE BRACKET */
+ {"rsquo", 0x2019}, /* RIGHT SINGLE QUOTATION MARK */
+ {"rsquor", 0x2018}, /* LEFT SINGLE QUOTATION MARK */
+ {"rthree", 0x22CC}, /* RIGHT SEMIDIRECT PRODUCT */
+ {"rtimes", 0x22CA}, /* RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT */
+ {"rtri", 0x25B9}, /* WHITE RIGHT-POINTING SMALL TRIANGLE */
+ {"rtrie", 0x22B5}, /* CONTAINS AS NORMAL SUBGROUP OR EQUAL TO */
+ {"rtrif", 0x25B8}, /* BLACK RIGHT-POINTING SMALL TRIANGLE */
+ {"rx", 0x211E}, /* PRESCRIPTION TAKE */
+ {"sacute", 0x015B}, /* LATIN SMALL LETTER S WITH ACUTE */
+ {"samalg", 0x2210}, /* N-ARY COPRODUCT */
+ {"sbquo", 0x201A}, /* SINGLE LOW-9 QUOTATION MARK */
+ {"sbsol", 0x005C}, /* REVERSE SOLIDUS */
+ {"sc", 0x227B}, /* SUCCEEDS */
+ {"scaron", 0x0161}, /* LATIN SMALL LETTER S WITH CARON */
+ {"sccue", 0x227D}, /* SUCCEEDS OR EQUAL TO */
+ {"sce", 0x227D}, /* SUCCEEDS OR EQUAL TO */
+ {"scedil", 0x015F}, /* LATIN SMALL LETTER S WITH CEDILLA */
+ {"scirc", 0x015D}, /* LATIN SMALL LETTER S WITH CIRCUMFLEX */
+ {"scnsim", 0x22E9}, /* SUCCEEDS BUT NOT EQUIVALENT TO */
+ {"scsim", 0x227F}, /* SUCCEEDS OR EQUIVALENT TO */
+ {"scy", 0x0441}, /* CYRILLIC SMALL LETTER ES */
+ {"sdot", 0x22C5}, /* DOT OPERATOR */
+ {"sdotb", 0x22A1}, /* SQUARED DOT OPERATOR */
+ {"sect", 0x00A7}, /* SECTION SIGN */
+ {"semi", 0x003B}, /* SEMICOLON */
+ {"setmn", 0x2216}, /* SET MINUS */
+ {"sext", 0x2736}, /* SIX POINTED BLACK STAR */
+ {"sfgr", 0x03C2}, /* GREEK SMALL LETTER FINAL SIGMA */
+ {"sfrown", 0x2322}, /* FROWN */
+ {"sgr", 0x03C3}, /* GREEK SMALL LETTER SIGMA */
+ {"sharp", 0x266F}, /* MUSIC SHARP SIGN */
+ {"shchcy", 0x0449}, /* CYRILLIC SMALL LETTER SHCHA */
+ {"shcy", 0x0448}, /* CYRILLIC SMALL LETTER SHA */
+ {"shy", 0x00AD}, /* SOFT HYPHEN */
+ {"sigma", 0x03C3}, /* GREEK SMALL LETTER SIGMA */
+ {"sigmaf", 0x03C2}, /* GREEK SMALL LETTER FINAL SIGMA */
+ {"sigmav", 0x03C2}, /* GREEK SMALL LETTER FINAL SIGMA */
+ {"sim", 0x223C}, /* TILDE OPERATOR */
+ {"sime", 0x2243}, /* ASYMPTOTICALLY EQUAL TO */
+ {"smile", 0x2323}, /* SMILE */
+ {"softcy", 0x044C}, /* CYRILLIC SMALL LETTER SOFT SIGN */
+ {"sol", 0x002F}, /* SOLIDUS */
+ {"spades", 0x2660}, /* BLACK SPADE SUIT */
+ {"spar", 0x2225}, /* PARALLEL TO */
+ {"sqcap", 0x2293}, /* SQUARE CAP */
+ {"sqcup", 0x2294}, /* SQUARE CUP */
+ {"sqsub", 0x228F}, /* SQUARE IMAGE OF */
+ {"sqsube", 0x2291}, /* SQUARE IMAGE OF OR EQUAL TO */
+ {"sqsup", 0x2290}, /* SQUARE ORIGINAL OF */
+ {"sqsupe", 0x2292}, /* SQUARE ORIGINAL OF OR EQUAL TO */
+ {"squ", 0x25A1}, /* WHITE SQUARE */
+ {"square", 0x25A1}, /* WHITE SQUARE */
+ {"squf", 0x25AA}, /* BLACK SMALL SQUARE */
+ {"ssetmn", 0x2216}, /* SET MINUS */
+ {"ssmile", 0x2323}, /* SMILE */
+ {"sstarf", 0x22C6}, /* STAR OPERATOR */
+ {"star", 0x2606}, /* WHITE STAR */
+ {"starf", 0x2605}, /* BLACK STAR */
+ {"sub", 0x2282}, /* SUBSET OF */
+ {"subE", 0x2286}, /* SUBSET OF OR EQUAL TO */
+ {"sube", 0x2286}, /* SUBSET OF OR EQUAL TO */
+ {"subnE", 0x228A}, /* SUBSET OF WITH NOT EQUAL TO */
+ {"subne", 0x228A}, /* SUBSET OF WITH NOT EQUAL TO */
+ {"sum", 0x2211}, /* N-ARY SUMMATION */
+ {"sung", 0x266A}, /* EIGHTH NOTE */
+ {"sup", 0x2283}, /* SUPERSET OF */
+ {"sup1", 0x00B9}, /* SUPERSCRIPT ONE */
+ {"sup2", 0x00B2}, /* SUPERSCRIPT TWO */
+ {"sup3", 0x00B3}, /* SUPERSCRIPT THREE */
+ {"supE", 0x2287}, /* SUPERSET OF OR EQUAL TO */
+ {"supe", 0x2287}, /* SUPERSET OF OR EQUAL TO */
+ {"supnE", 0x228B}, /* SUPERSET OF WITH NOT EQUAL TO */
+ {"supne", 0x228B}, /* SUPERSET OF WITH NOT EQUAL TO */
+ {"szlig", 0x00DF}, /* LATIN SMALL LETTER SHARP S */
+ {"target", 0x2316}, /* POSITION INDICATOR */
+ {"tau", 0x03C4}, /* GREEK SMALL LETTER TAU */
+ {"tcaron", 0x0165}, /* LATIN SMALL LETTER T WITH CARON */
+ {"tcedil", 0x0163}, /* LATIN SMALL LETTER T WITH CEDILLA */
+ {"tcy", 0x0442}, /* CYRILLIC SMALL LETTER TE */
+ {"tdot", 0x20DB}, /* COMBINING THREE DOTS ABOVE */
+ {"telrec", 0x2315}, /* TELEPHONE RECORDER */
+ {"tgr", 0x03C4}, /* GREEK SMALL LETTER TAU */
+ {"there4", 0x2234}, /* THEREFORE */
+ {"theta", 0x03B8}, /* GREEK SMALL LETTER THETA */
+ {"thetas", 0x03B8}, /* GREEK SMALL LETTER THETA */
+ {"thetasym", 0x03D1}, /* GREEK THETA SYMBOL */
+ {"thetav", 0x03D1}, /* GREEK THETA SYMBOL */
+ {"thgr", 0x03B8}, /* GREEK SMALL LETTER THETA */
+ {"thinsp", 0x2009}, /* THIN SPACE */
+ {"thkap", 0x2248}, /* ALMOST EQUAL TO */
+ {"thksim", 0x223C}, /* TILDE OPERATOR */
+ {"thorn", 0x00FE}, /* LATIN SMALL LETTER THORN */
+ {"tilde", 0x02DC}, /* SMALL TILDE */
+ {"times", 0x00D7}, /* MULTIPLICATION SIGN */
+ {"timesb", 0x22A0}, /* SQUARED TIMES */
+ {"top", 0x22A4}, /* DOWN TACK */
+ {"tprime", 0x2034}, /* TRIPLE PRIME */
+ {"trade", 0x2122}, /* TRADE MARK SIGN */
+ {"trie", 0x225C}, /* DELTA EQUAL TO */
+ {"tscy", 0x0446}, /* CYRILLIC SMALL LETTER TSE */
+ {"tshcy", 0x045B}, /* CYRILLIC SMALL LETTER TSHE */
+ {"tstrok", 0x0167}, /* LATIN SMALL LETTER T WITH STROKE */
+ {"twixt", 0x226C}, /* BETWEEN */
+ {"uArr", 0x21D1}, /* UPWARDS DOUBLE ARROW */
+ {"uacgr", 0x03CD}, /* GREEK SMALL LETTER UPSILON WITH TONOS */
+ {"uacute", 0x00FA}, /* LATIN SMALL LETTER U WITH ACUTE */
+ {"uarr", 0x2191}, /* UPWARDS ARROW */
+ {"uarr2", 0x21C8}, /* UPWARDS PAIRED ARROWS */
+ {"ubrcy", 0x045E}, /* CYRILLIC SMALL LETTER SHORT U */
+ {"ubreve", 0x016D}, /* LATIN SMALL LETTER U WITH BREVE */
+ {"ucirc", 0x00FB}, /* LATIN SMALL LETTER U WITH CIRCUMFLEX */
+ {"ucy", 0x0443}, /* CYRILLIC SMALL LETTER U */
+ {"udblac", 0x0171}, /* LATIN SMALL LETTER U WITH DOUBLE ACUTE */
+ {"udiagr", 0x03B0}, /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND */
+ {"udigr", 0x03CB}, /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA */
+ {"ugr", 0x03C5}, /* GREEK SMALL LETTER UPSILON */
+ {"ugrave", 0x00F9}, /* LATIN SMALL LETTER U WITH GRAVE */
+ {"uharl", 0x21BF}, /* UPWARDS HARPOON WITH BARB LEFTWARDS */
+ {"uharr", 0x21BE}, /* UPWARDS HARPOON WITH BARB RIGHTWARDS */
+ {"uhblk", 0x2580}, /* UPPER HALF BLOCK */
+ {"ulcorn", 0x231C}, /* TOP LEFT CORNER */
+ {"ulcrop", 0x230F}, /* TOP LEFT CROP */
+ {"umacr", 0x016B}, /* LATIN SMALL LETTER U WITH MACRON */
+ {"uml", 0x00A8}, /* DIAERESIS */
+ {"uogon", 0x0173}, /* LATIN SMALL LETTER U WITH OGONEK */
+ {"uplus", 0x228E}, /* MULTISET UNION */
+ {"upsi", 0x03C5}, /* GREEK SMALL LETTER UPSILON */
+ {"upsih", 0x03D2}, /* GREEK UPSILON WITH HOOK SYMBOL */
+ {"upsilon", 0x03C5}, /* GREEK SMALL LETTER UPSILON */
+ {"urcorn", 0x231D}, /* TOP RIGHT CORNER */
+ {"urcrop", 0x230E}, /* TOP RIGHT CROP */
+ {"uring", 0x016F}, /* LATIN SMALL LETTER U WITH RING ABOVE */
+ {"utilde", 0x0169}, /* LATIN SMALL LETTER U WITH TILDE */
+ {"utri", 0x25B5}, /* WHITE UP-POINTING SMALL TRIANGLE */
+ {"utrif", 0x25B4}, /* BLACK UP-POINTING SMALL TRIANGLE */
+ {"uuml", 0x00FC}, /* LATIN SMALL LETTER U WITH DIAERESIS */
+ {"vArr", 0x21D5}, /* UP DOWN DOUBLE ARROW */
+ {"vDash", 0x22A8}, /* TRUE */
+ {"varr", 0x2195}, /* UP DOWN ARROW */
+ {"vcy", 0x0432}, /* CYRILLIC SMALL LETTER VE */
+ {"vdash", 0x22A2}, /* RIGHT TACK */
+ {"veebar", 0x22BB}, /* XOR */
+ {"vellip", 0x22EE}, /* VERTICAL ELLIPSIS */
+ {"verbar", 0x007C}, /* VERTICAL LINE */
+ {"vltri", 0x22B2}, /* NORMAL SUBGROUP OF */
+ {"vprime", 0x2032}, /* PRIME */
+ {"vprop", 0x221D}, /* PROPORTIONAL TO */
+ {"vrtri", 0x22B3}, /* CONTAINS AS NORMAL SUBGROUP */
+ {"vsubnE", 0x228A}, /* SUBSET OF WITH NOT EQUAL TO */
+ {"vsubne", 0x228A}, /* SUBSET OF WITH NOT EQUAL TO */
+ {"vsupnE", 0x228B}, /* SUPERSET OF WITH NOT EQUAL TO */
+ {"vsupne", 0x228B}, /* SUPERSET OF WITH NOT EQUAL TO */
+ {"wcirc", 0x0175}, /* LATIN SMALL LETTER W WITH CIRCUMFLEX */
+ {"wedgeq", 0x2259}, /* ESTIMATES */
+ {"weierp", 0x2118}, /* SCRIPT CAPITAL P */
+ {"wreath", 0x2240}, /* WREATH PRODUCT */
+ {"xcirc", 0x25CB}, /* WHITE CIRCLE */
+ {"xdtri", 0x25BD}, /* WHITE DOWN-POINTING TRIANGLE */
+ {"xgr", 0x03BE}, /* GREEK SMALL LETTER XI */
+ {"xhArr", 0x2194}, /* LEFT RIGHT ARROW */
+ {"xharr", 0x2194}, /* LEFT RIGHT ARROW */
+ {"xi", 0x03BE}, /* GREEK SMALL LETTER XI */
+ {"xlArr", 0x21D0}, /* LEFTWARDS DOUBLE ARROW */
+ {"xrArr", 0x21D2}, /* RIGHTWARDS DOUBLE ARROW */
+ {"xutri", 0x25B3}, /* WHITE UP-POINTING TRIANGLE */
+ {"yacute", 0x00FD}, /* LATIN SMALL LETTER Y WITH ACUTE */
+ {"yacy", 0x044F}, /* CYRILLIC SMALL LETTER YA */
+ {"ycirc", 0x0177}, /* LATIN SMALL LETTER Y WITH CIRCUMFLEX */
+ {"ycy", 0x044B}, /* CYRILLIC SMALL LETTER YERU */
+ {"yen", 0x00A5}, /* YEN SIGN */
+ {"yicy", 0x0457}, /* CYRILLIC SMALL LETTER YI */
+ {"yucy", 0x044E}, /* CYRILLIC SMALL LETTER YU */
+ {"yuml", 0x00FF}, /* LATIN SMALL LETTER Y WITH DIAERESIS */
+ {"zacute", 0x017A}, /* LATIN SMALL LETTER Z WITH ACUTE */
+ {"zcaron", 0x017E}, /* LATIN SMALL LETTER Z WITH CARON */
+ {"zcy", 0x0437}, /* CYRILLIC SMALL LETTER ZE */
+ {"zdot", 0x017C}, /* LATIN SMALL LETTER Z WITH DOT ABOVE */
+ {"zeta", 0x03B6}, /* GREEK SMALL LETTER ZETA */
+ {"zgr", 0x03B6}, /* GREEK SMALL LETTER ZETA */
+ {"zhcy", 0x0436}, /* CYRILLIC SMALL LETTER ZHE */
+ {"zwj", 0x200D}, /* ZERO WIDTH JOINER */
+ {"zwnj", 0x200C}, /* ZERO WIDTH NON-JOINER */
+/* {"epsiv", 0x????}, variant epsilon # ISOgrk3 */
+/* {"fjlig", 0x????}, fj ligature # ISOpub */
+/* {"gEl", 0x????}, greater-than, double equals, less-than # ISOamsr */
+/* {"gap", 0x????}, greater-than, approximately equal to # ISOamsr */
+/* {"gnap", 0x????}, greater-than, not approximately equal t# ISOamsn */
+/* {"jnodot", 0x????}, latin small letter dotless j # ISOamso */
+/* {"lEg", 0x????}, less-than, double equals, greater-than # ISOamsr */
+/* {"lap", 0x????}, less-than, approximately equal to # ISOamsr */
+/* {"lnap", 0x????}, less-than, not approximately equal to # ISOamsn */
+/* {"lpargt", 0x????}, left parenthesis, greater-than # ISOamsc */
+/* {"ngE", 0x????}, not greater-than, double equals # ISOamsn */
+/* {"nlE", 0x????}, not less-than, double equals # ISOamsn */
+/* {"nsmid", 0x????}, nshortmid # ISOamsn */
+/* {"prap", 0x????}, precedes, approximately equal to # ISOamsr */
+/* {"prnE", 0x????}, precedes, not double equal # ISOamsn */
+/* {"prnap", 0x????}, precedes, not approximately equal to # ISOamsn */
+/* {"rpargt", 0x????}, right parenthesis, greater-than # ISOamsc */
+/* {"scap", 0x????}, succeeds, approximately equal to # ISOamsr */
+/* {"scnE", 0x????}, succeeds, not double equals # ISOamsn */
+/* {"scnap", 0x????}, succeeds, not approximately equal to # ISOamsn */
+/* {"smid", 0x????}, shortmid # ISOamsr */
+};
+
+#endif /* not ENTITIES_HTML40_ONLY */
+/* *INDENT-ON* */
diff --git a/src/chrtrans/hp_uni.tbl b/src/chrtrans/hp_uni.tbl
new file mode 100644
index 0000000..5802551
--- /dev/null
+++ b/src/chrtrans/hp_uni.tbl
@@ -0,0 +1,212 @@
+# The MIME name of this charset.
+Mhp-roman8
+
+# Name as a Display Charset (used on Options screen)
+OHP Roman8
+
+# This is not the default font!
+D0
+
+#
+# Name: HP Roman8 to Unicode
+# Date: 1999-01-09
+# Authors: Christian "naddy" Weisgerber <naddy@mips.rhein-neckar.de>
+# Mapping by Roman Czyborra,
+# <URL:http://czyborra.com/charsets/codepages.html#HP-Roman8>
+#
+
+0x20-0x7E idem # ASCII
+
+#0x20 U+0020 # SPACE
+#0x21 U+0021 # EXCLAMATION MARK
+#0x22 U+0022 # QUOTATION MARK
+#0x23 U+0023 # NUMBER SIGN
+#0x24 U+0024 # DOLLAR SIGN
+#0x25 U+0025 # PERCENT SIGN
+#0x26 U+0026 # AMPERSAND
+#0x27 U+0027 # APOSTROPHE
+#0x28 U+0028 # LEFT PARENTHESIS
+#0x29 U+0029 # RIGHT PARENTHESIS
+#0x2A U+002A # ASTERISK
+#0x2B U+002B # PLUS SIGN
+#0x2C U+002C # COMMA
+#0x2D U+002D # HYPHEN-MINUS
+#0x2E U+002E # FULL STOP
+#0x2F U+002F # SOLIDUS
+#0x30 U+0030 # DIGIT ZERO
+#0x31 U+0031 # DIGIT ONE
+#0x32 U+0032 # DIGIT TWO
+#0x33 U+0033 # DIGIT THREE
+#0x34 U+0034 # DIGIT FOUR
+#0x35 U+0035 # DIGIT FIVE
+#0x36 U+0036 # DIGIT SIX
+#0x37 U+0037 # DIGIT SEVEN
+#0x38 U+0038 # DIGIT EIGHT
+#0x39 U+0039 # DIGIT NINE
+#0x3A U+003A # COLON
+#0x3B U+003B # SEMICOLON
+#0x3C U+003C # LESS-THAN SIGN
+#0x3D U+003D # EQUALS SIGN
+#0x3E U+003E # GREATER-THAN SIGN
+#0x3F U+003F # QUESTION MARK
+#0x40 U+0040 # COMMERCIAL AT
+#0x41 U+0041 # LATIN CAPITAL LETTER A
+#0x42 U+0042 # LATIN CAPITAL LETTER B
+#0x43 U+0043 # LATIN CAPITAL LETTER C
+#0x44 U+0044 # LATIN CAPITAL LETTER D
+#0x45 U+0045 # LATIN CAPITAL LETTER E
+#0x46 U+0046 # LATIN CAPITAL LETTER F
+#0x47 U+0047 # LATIN CAPITAL LETTER G
+#0x48 U+0048 # LATIN CAPITAL LETTER H
+#0x49 U+0049 # LATIN CAPITAL LETTER I
+#0x4A U+004A # LATIN CAPITAL LETTER J
+#0x4B U+004B # LATIN CAPITAL LETTER K
+#0x4C U+004C # LATIN CAPITAL LETTER L
+#0x4D U+004D # LATIN CAPITAL LETTER M
+#0x4E U+004E # LATIN CAPITAL LETTER N
+#0x4F U+004F # LATIN CAPITAL LETTER O
+#0x50 U+0050 # LATIN CAPITAL LETTER P
+#0x51 U+0051 # LATIN CAPITAL LETTER Q
+#0x52 U+0052 # LATIN CAPITAL LETTER R
+#0x53 U+0053 # LATIN CAPITAL LETTER S
+#0x54 U+0054 # LATIN CAPITAL LETTER T
+#0x55 U+0055 # LATIN CAPITAL LETTER U
+#0x56 U+0056 # LATIN CAPITAL LETTER V
+#0x57 U+0057 # LATIN CAPITAL LETTER W
+#0x58 U+0058 # LATIN CAPITAL LETTER X
+#0x59 U+0059 # LATIN CAPITAL LETTER Y
+#0x5A U+005A # LATIN CAPITAL LETTER Z
+#0x5B U+005B # LEFT SQUARE BRACKET
+#0x5C U+005C # REVERSE SOLIDUS
+#0x5D U+005D # RIGHT SQUARE BRACKET
+#0x5E U+005E # CIRCUMFLEX ACCENT
+#0x5F U+005F # LOW LINE
+#0x60 U+0060 # GRAVE ACCENT
+#0x61 U+0061 # LATIN SMALL LETTER A
+#0x62 U+0062 # LATIN SMALL LETTER B
+#0x63 U+0063 # LATIN SMALL LETTER C
+#0x64 U+0064 # LATIN SMALL LETTER D
+#0x65 U+0065 # LATIN SMALL LETTER E
+#0x66 U+0066 # LATIN SMALL LETTER F
+#0x67 U+0067 # LATIN SMALL LETTER G
+#0x68 U+0068 # LATIN SMALL LETTER H
+#0x69 U+0069 # LATIN SMALL LETTER I
+#0x6A U+006A # LATIN SMALL LETTER J
+#0x6B U+006B # LATIN SMALL LETTER K
+#0x6C U+006C # LATIN SMALL LETTER L
+#0x6D U+006D # LATIN SMALL LETTER M
+#0x6E U+006E # LATIN SMALL LETTER N
+#0x6F U+006F # LATIN SMALL LETTER O
+#0x70 U+0070 # LATIN SMALL LETTER P
+#0x71 U+0071 # LATIN SMALL LETTER Q
+#0x72 U+0072 # LATIN SMALL LETTER R
+#0x73 U+0073 # LATIN SMALL LETTER S
+#0x74 U+0074 # LATIN SMALL LETTER T
+#0x75 U+0075 # LATIN SMALL LETTER U
+#0x76 U+0076 # LATIN SMALL LETTER V
+#0x77 U+0077 # LATIN SMALL LETTER W
+#0x78 U+0078 # LATIN SMALL LETTER X
+#0x79 U+0079 # LATIN SMALL LETTER Y
+#0x7A U+007A # LATIN SMALL LETTER Z
+#0x7B U+007B # LEFT CURLY BRACKET
+#0x7C U+007C # VERTICAL LINE
+#0x7D U+007D # RIGHT CURLY BRACKET
+#0x7E U+007E # TILDE
+
+0xA0 U+00A0 # NO-BREAK SPACE
+0xA1 U+00C0 # LATIN CAPITAL LETTER A WITH GRAVE
+0xA2 U+00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0xA3 U+00C8 # LATIN CAPITAL LETTER E WITH GRAVE
+0xA4 U+00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+0xA5 U+00CB # LATIN CAPITAL LETTER E WITH DIAERESIS
+0xA6 U+00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0xA7 U+00CF # LATIN CAPITAL LETTER I WITH DIAERESIS
+0xA8 U+00B4 # ACUTE ACCENT
+0xA9 U+02CB # MODIFIER LETTER GRAVE ACCENT
+0xAA U+02C6 # MODIFIER LETTER CIRCUMFLEX ACCENT
+0xAB U+00A8 # DIAERESIS
+0xAC U+02DC # SMALL TILDE
+0xAD U+00D9 # LATIN CAPITAL LETTER U WITH GRAVE
+0xAE U+00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+0xAF U+20A4 # LIRA SIGN
+0xB0 U+00AF # MACRON
+0xB1 U+00DD # LATIN CAPITAL LETTER Y WITH ACUTE
+0xB2 U+00FD # LATIN SMALL LETTER Y WITH ACUTE
+0xB3 U+00B0 # DEGREE SIGN
+0xB4 U+00C7 # LATIN CAPITAL LETTER C WITH CEDILLA
+0xB5 U+00E7 # LATIN SMALL LETTER C WITH CEDILLA
+0xB6 U+00D1 # LATIN CAPITAL LETTER N WITH TILDE
+0xB7 U+00F1 # LATIN SMALL LETTER N WITH TILDE
+0xB8 U+00A1 # INVERTED EXCLAMATION MARK
+0xB9 U+00BF # INVERTED QUESTION MARK
+0xBA U+00A4 # CURRENCY SIGN
+0xBB U+00A3 # POUND SIGN
+0xBC U+00A5 # YEN SIGN
+0xBD U+00A7 # SECTION SIGN
+0xBE U+0192 # LATIN SMALL LETTER F WITH HOOK
+0xBF U+00A2 # CENT SIGN
+0xC0 U+00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX
+0xC1 U+00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX
+0xC2 U+00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX
+0xC3 U+00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX
+0xC4 U+00E1 # LATIN SMALL LETTER A WITH ACUTE
+0xC5 U+00E9 # LATIN SMALL LETTER E WITH ACUTE
+0xC6 U+00F3 # LATIN SMALL LETTER O WITH ACUTE
+0xC7 U+00FA # LATIN SMALL LETTER U WITH ACUTE
+0xC8 U+00E0 # LATIN SMALL LETTER A WITH GRAVE
+0xC9 U+00E8 # LATIN SMALL LETTER E WITH GRAVE
+0xCA U+00F2 # LATIN SMALL LETTER O WITH GRAVE
+0xCB U+00F9 # LATIN SMALL LETTER U WITH GRAVE
+0xCC U+00E4 # LATIN SMALL LETTER A WITH DIAERESIS
+0xCD U+00EB # LATIN SMALL LETTER E WITH DIAERESIS
+0xCE U+00F6 # LATIN SMALL LETTER O WITH DIAERESIS
+0xCF U+00FC # LATIN SMALL LETTER U WITH DIAERESIS
+0xD0 U+00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE
+0xD1 U+00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX
+0xD2 U+00D8 # LATIN CAPITAL LETTER O WITH STROKE
+0xD3 U+00C6 # LATIN CAPITAL LETTER AE
+0xD4 U+00E5 # LATIN SMALL LETTER A WITH RING ABOVE
+0xD5 U+00ED # LATIN SMALL LETTER I WITH ACUTE
+0xD6 U+00F8 # LATIN SMALL LETTER O WITH STROKE
+0xD7 U+00E6 # LATIN SMALL LETTER AE
+0xD8 U+00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS
+0xD9 U+00EC # LATIN SMALL LETTER I WITH GRAVE
+0xDA U+00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS
+0xDB U+00DC # LATIN CAPITAL LETTER U WITH DIAERESIS
+0xDC U+00C9 # LATIN CAPITAL LETTER E WITH ACUTE
+0xDD U+00EF # LATIN SMALL LETTER I WITH DIAERESIS
+0xDE U+00DF # LATIN SMALL LETTER SHARP S
+0xDF U+00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0xE0 U+00C1 # LATIN CAPITAL LETTER A WITH ACUTE
+0xE1 U+00C3 # LATIN CAPITAL LETTER A WITH TILDE
+0xE2 U+00E3 # LATIN SMALL LETTER A WITH TILDE
+0xE3 U+00D0 # LATIN CAPITAL LETTER ETH
+0xE4 U+00F0 # LATIN SMALL LETTER ETH
+0xE5 U+00CD # LATIN CAPITAL LETTER I WITH ACUTE
+0xE6 U+00CC # LATIN CAPITAL LETTER I WITH GRAVE
+0xE7 U+00D3 # LATIN CAPITAL LETTER O WITH ACUTE
+0xE8 U+00D2 # LATIN CAPITAL LETTER O WITH GRAVE
+0xE9 U+00D5 # LATIN CAPITAL LETTER O WITH TILDE
+0xEA U+00F5 # LATIN SMALL LETTER O WITH TILDE
+0xEB U+0160 # LATIN CAPITAL LETTER S WITH CARON
+0xEC U+0161 # LATIN SMALL LETTER S WITH CARON
+0xED U+00DA # LATIN CAPITAL LETTER U WITH ACUTE
+0xEE U+0178 # LATIN CAPITAL LETTER Y WITH DIAERESIS
+0xEF U+00FF # LATIN SMALL LETTER Y WITH DIAERESIS
+0xF0 U+00DE # LATIN CAPITAL LETTER THORN
+0xF1 U+00FE # LATIN SMALL LETTER THORN
+0xF2 U+00B7 # MIDDLE DOT
+0xF3 U+00B5 # MICRO SIGN
+0xF4 U+00B6 # PILCROW SIGN
+0xF5 U+00BE # VULGAR FRACTION THREE QUARTERS
+0xF6 U+2014 # EM DASH
+0xF7 U+00BC # VULGAR FRACTION ONE QUARTER
+0xF8 U+00BD # VULGAR FRACTION ONE HALF
+0xF9 U+00AA # FEMININE ORDINAL INDICATOR
+0xFA U+00BA # MASCULINE ORDINAL INDICATOR
+0xFB U+00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xFC U+25A0 # BLACK SQUARE
+0xFD U+00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xFE U+00B1 # PLUS-MINUS SIGN
+
+## EOF ##
diff --git a/src/chrtrans/iso01_uni.tbl b/src/chrtrans/iso01_uni.tbl
new file mode 100644
index 0000000..95e705e
--- /dev/null
+++ b/src/chrtrans/iso01_uni.tbl
@@ -0,0 +1,334 @@
+# $LynxId: iso01_uni.tbl,v 1.11 2007/07/31 20:35:04 Tim.Larson Exp $
+# vile:tblmode:
+# This file has been modified for lynx (see README.tables)
+
+#Shall this become the "default" translation?
+#Meaning of that is currently not well defined. It is different
+#from the default input or default output charset...
+#but there has to be exactly one table marked as "default".
+D0
+#
+#The MIME name of this charset.
+Miso-8859-1
+
+#Name as a Display Charset (used on Options screen)
+OWestern (ISO-8859-1)
+
+#Codepage number
+C819
+
+#
+# Name: ISO/IEC 8859-1:1998 to Unicode
+# Unicode version: 3.0
+# Table version: 1.0
+# Table format: Format A
+# Date: 1999 July 27
+# Authors: Ken Whistler <kenw@sybase.com>
+#
+# Copyright (c) 1991-1999 Unicode, Inc. All Rights reserved.
+#
+# This file is provided as-is by Unicode, Inc. (The Unicode Consortium).
+# No claims are made as to fitness for any particular purpose. No
+# warranties of any kind are expressed or implied. The recipient
+# agrees to determine applicability of information provided. If this
+# file has been provided on optical media by Unicode, Inc., the sole
+# remedy for any claim will be exchange of defective media within 90
+# days of receipt.
+#
+# Unicode, Inc. hereby grants the right to freely use the information
+# supplied in this file in the creation of products supporting the
+# Unicode Standard, and to make copies of this file in any form for
+# internal or external distribution as long as this notice remains
+# attached.
+#
+# General notes:
+#
+# This table contains the data the Unicode Consortium has on how
+# ISO/IEC 8859-1:1998 characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the ISO/IEC 8859-1 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in ISO/IEC 8859-1 order.
+#
+# Version history
+# 1.0 version updates 0.1 version by adding mappings for all
+# control characters.
+#
+# Updated versions of this file may be found in:
+# <ftp://ftp.unicode.org/Public/MAPPINGS/>
+#
+# Any comments or problems, contact <errata@unicode.org>
+# Please note that <errata@unicode.org> is an archival address;
+# notices will be checked, but do not expect an immediate response.
+#
+# Lines with more than one Unicode (U+XXXX) value contain additional
+# replacement mappings added for lynx. - kw
+#
+0x20-0x7e idem
+0xa0-0xff idem # iso 8859-1 special: trivial mapping to Unicode
+#
+#0x20 U+0020 # SPACE
+#0x21 U+0021 # EXCLAMATION MARK
+#0x22 U+0022 # QUOTATION MARK
+#0x23 U+0023 # NUMBER SIGN
+#0x24 U+0024 # DOLLAR SIGN
+#0x25 U+0025 # PERCENT SIGN
+#0x26 U+0026 # AMPERSAND
+#0x27 U+0027 # APOSTROPHE
+#0x28 U+0028 # LEFT PARENTHESIS
+#0x29 U+0029 # RIGHT PARENTHESIS
+#0x2A U+002A # ASTERISK
+#0x2B U+002B # PLUS SIGN
+#0x2C U+002C # COMMA
+#0x2D U+002D # HYPHEN-MINUS
+#0x2E U+002E # FULL STOP
+#0x2F U+002F # SOLIDUS
+#0x30 U+0030 # DIGIT ZERO
+#0x31 U+0031 # DIGIT ONE
+#0x32 U+0032 # DIGIT TWO
+#0x33 U+0033 # DIGIT THREE
+#0x34 U+0034 # DIGIT FOUR
+#0x35 U+0035 # DIGIT FIVE
+#0x36 U+0036 # DIGIT SIX
+#0x37 U+0037 # DIGIT SEVEN
+#0x38 U+0038 # DIGIT EIGHT
+#0x39 U+0039 # DIGIT NINE
+#0x3A U+003A # COLON
+#0x3B U+003B # SEMICOLON
+#0x3C U+003C # LESS-THAN SIGN
+#0x3D U+003D # EQUALS SIGN
+#0x3E U+003E # GREATER-THAN SIGN
+#0x3F U+003F # QUESTION MARK
+#0x40 U+0040 # COMMERCIAL AT
+#0x41 U+0041 # LATIN CAPITAL LETTER A
+#0x42 U+0042 # LATIN CAPITAL LETTER B
+#0x43 U+0043 # LATIN CAPITAL LETTER C
+#0x44 U+0044 # LATIN CAPITAL LETTER D
+#0x45 U+0045 # LATIN CAPITAL LETTER E
+#0x46 U+0046 # LATIN CAPITAL LETTER F
+#0x47 U+0047 # LATIN CAPITAL LETTER G
+#0x48 U+0048 # LATIN CAPITAL LETTER H
+#0x49 U+0049 # LATIN CAPITAL LETTER I
+#0x4A U+004A # LATIN CAPITAL LETTER J
+#0x4B U+004B # LATIN CAPITAL LETTER K
+#0x4C U+004C # LATIN CAPITAL LETTER L
+#0x4D U+004D # LATIN CAPITAL LETTER M
+#0x4E U+004E # LATIN CAPITAL LETTER N
+#0x4F U+004F # LATIN CAPITAL LETTER O
+#0x50 U+0050 # LATIN CAPITAL LETTER P
+#0x51 U+0051 # LATIN CAPITAL LETTER Q
+#0x52 U+0052 # LATIN CAPITAL LETTER R
+#0x53 U+0053 # LATIN CAPITAL LETTER S
+#0x54 U+0054 # LATIN CAPITAL LETTER T
+#0x55 U+0055 # LATIN CAPITAL LETTER U
+#0x56 U+0056 # LATIN CAPITAL LETTER V
+#0x57 U+0057 # LATIN CAPITAL LETTER W
+#0x58 U+0058 # LATIN CAPITAL LETTER X
+#0x59 U+0059 # LATIN CAPITAL LETTER Y
+#0x5A U+005A # LATIN CAPITAL LETTER Z
+#0x5B U+005B # LEFT SQUARE BRACKET
+#0x5C U+005C # REVERSE SOLIDUS
+#0x5D U+005D # RIGHT SQUARE BRACKET
+#0x5E U+005E # CIRCUMFLEX ACCENT
+#0x5F U+005F # LOW LINE
+#0x60 U+0060 # GRAVE ACCENT
+#0x61 U+0061 # LATIN SMALL LETTER A
+#0x62 U+0062 # LATIN SMALL LETTER B
+#0x63 U+0063 # LATIN SMALL LETTER C
+#0x64 U+0064 # LATIN SMALL LETTER D
+#0x65 U+0065 # LATIN SMALL LETTER E
+#0x66 U+0066 # LATIN SMALL LETTER F
+#0x67 U+0067 # LATIN SMALL LETTER G
+#0x68 U+0068 # LATIN SMALL LETTER H
+#0x69 U+0069 # LATIN SMALL LETTER I
+#0x6A U+006A # LATIN SMALL LETTER J
+#0x6B U+006B # LATIN SMALL LETTER K
+#0x6C U+006C # LATIN SMALL LETTER L
+#0x6D U+006D # LATIN SMALL LETTER M
+#0x6E U+006E # LATIN SMALL LETTER N
+#0x6F U+006F # LATIN SMALL LETTER O
+#0x70 U+0070 # LATIN SMALL LETTER P
+#0x71 U+0071 # LATIN SMALL LETTER Q
+#0x72 U+0072 # LATIN SMALL LETTER R
+#0x73 U+0073 # LATIN SMALL LETTER S
+#0x74 U+0074 # LATIN SMALL LETTER T
+#0x75 U+0075 # LATIN SMALL LETTER U
+#0x76 U+0076 # LATIN SMALL LETTER V
+#0x77 U+0077 # LATIN SMALL LETTER W
+#0x78 U+0078 # LATIN SMALL LETTER X
+#0x79 U+0079 # LATIN SMALL LETTER Y
+#0x7A U+007A # LATIN SMALL LETTER Z
+#0x7B U+007B # LEFT CURLY BRACKET
+#0x7C U+007C # VERTICAL LINE
+#0x7D U+007D # RIGHT CURLY BRACKET
+#0x7E U+007E # TILDE
+0xA0 U+00A0 U+2007 # NO-BREAK SPACE
+#0xA1 U+00A1 # INVERTED EXCLAMATION MARK
+#0xA2 U+00A2 # CENT SIGN
+#0xA3 U+00A3 # POUND SIGN
+#0xA4 U+00A4 # CURRENCY SIGN
+#0xA5 U+00A5 # YEN SIGN
+#0xA6 U+00A6 # BROKEN BAR
+#0xA7 U+00A7 # SECTION SIGN
+0xA8 U+00A8 U+0308 # DIAERESIS
+#0xA9 U+00A9 # COPYRIGHT SIGN
+#0xAA U+00AA # FEMININE ORDINAL INDICATOR
+#0xAB U+00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+#0xAC U+00AC # NOT SIGN
+#0xAD U+00AD # SOFT HYPHEN
+#0xAE U+00AE # REGISTERED SIGN
+0xAF U+00AF U+0304 # MACRON
+0xB0 U+00B0 U+030a # DEGREE SIGN
+#0xB1 U+00B1 # PLUS-MINUS SIGN
+#0xB2 U+00B2 # SUPERSCRIPT TWO
+#0xB3 U+00B3 # SUPERSCRIPT THREE
+#0xB4 U+00B4 # ACUTE ACCENT
+0xB5 U+00B5 U+03bc # MICRO SIGN
+#0xB6 U+00B6 # PILCROW SIGN
+0xB7 U+00B7 U+0307 U+0387 U+2027 # MIDDLE DOT
+0xB8 U+00B8 U+0327 # CEDILLA
+#0xB9 U+00B9 # SUPERSCRIPT ONE
+#0xBA U+00BA # MASCULINE ORDINAL INDICATOR
+#0xBB U+00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+#0xBC U+00BC # VULGAR FRACTION ONE QUARTER
+#0xBD U+00BD # VULGAR FRACTION ONE HALF
+#0xBE U+00BE # VULGAR FRACTION THREE QUARTERS
+#0xBF U+00BF # INVERTED QUESTION MARK
+#0xC0 U+00C0 # LATIN CAPITAL LETTER A WITH GRAVE
+#0xC1 U+00C1 # LATIN CAPITAL LETTER A WITH ACUTE
+#0xC2 U+00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+#0xC3 U+00C3 # LATIN CAPITAL LETTER A WITH TILDE
+#0xC4 U+00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS
+#0xC5 U+00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE
+#0xC6 U+00C6 # LATIN CAPITAL LETTER AE
+#0xC7 U+00C7 # LATIN CAPITAL LETTER C WITH CEDILLA
+#0xC8 U+00C8 # LATIN CAPITAL LETTER E WITH GRAVE
+#0xC9 U+00C9 # LATIN CAPITAL LETTER E WITH ACUTE
+#0xCA U+00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+#0xCB U+00CB # LATIN CAPITAL LETTER E WITH DIAERESIS
+#0xCC U+00CC # LATIN CAPITAL LETTER I WITH GRAVE
+#0xCD U+00CD # LATIN CAPITAL LETTER I WITH ACUTE
+#0xCE U+00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+#0xCF U+00CF # LATIN CAPITAL LETTER I WITH DIAERESIS
+#0xD0 U+00D0 # LATIN CAPITAL LETTER ETH (Icelandic)
+#0xD1 U+00D1 # LATIN CAPITAL LETTER N WITH TILDE
+#0xD2 U+00D2 # LATIN CAPITAL LETTER O WITH GRAVE
+#0xD3 U+00D3 # LATIN CAPITAL LETTER O WITH ACUTE
+#0xD4 U+00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+#0xD5 U+00D5 # LATIN CAPITAL LETTER O WITH TILDE
+#0xD6 U+00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS
+#0xD7 U+00D7 # MULTIPLICATION SIGN
+#0xD8 U+00D8 # LATIN CAPITAL LETTER O WITH STROKE
+#0xD9 U+00D9 # LATIN CAPITAL LETTER U WITH GRAVE
+#0xDA U+00DA # LATIN CAPITAL LETTER U WITH ACUTE
+#0xDB U+00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+#0xDC U+00DC # LATIN CAPITAL LETTER U WITH DIAERESIS
+#0xDD U+00DD # LATIN CAPITAL LETTER Y WITH ACUTE
+#0xDE U+00DE # LATIN CAPITAL LETTER THORN (Icelandic)
+#0xDF U+00DF # LATIN SMALL LETTER SHARP S (German)
+#0xE0 U+00E0 # LATIN SMALL LETTER A WITH GRAVE
+#0xE1 U+00E1 # LATIN SMALL LETTER A WITH ACUTE
+#0xE2 U+00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX
+#0xE3 U+00E3 # LATIN SMALL LETTER A WITH TILDE
+#0xE4 U+00E4 # LATIN SMALL LETTER A WITH DIAERESIS
+#0xE5 U+00E5 # LATIN SMALL LETTER A WITH RING ABOVE
+#0xE6 U+00E6 # LATIN SMALL LETTER AE
+#0xE7 U+00E7 # LATIN SMALL LETTER C WITH CEDILLA
+#0xE8 U+00E8 # LATIN SMALL LETTER E WITH GRAVE
+#0xE9 U+00E9 # LATIN SMALL LETTER E WITH ACUTE
+#0xEA U+00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX
+#0xEB U+00EB # LATIN SMALL LETTER E WITH DIAERESIS
+#0xEC U+00EC # LATIN SMALL LETTER I WITH GRAVE
+#0xED U+00ED # LATIN SMALL LETTER I WITH ACUTE
+#0xEE U+00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX
+#0xEF U+00EF # LATIN SMALL LETTER I WITH DIAERESIS
+#0xF0 U+00F0 # LATIN SMALL LETTER ETH (Icelandic)
+#0xF1 U+00F1 # LATIN SMALL LETTER N WITH TILDE
+#0xF2 U+00F2 # LATIN SMALL LETTER O WITH GRAVE
+#0xF3 U+00F3 # LATIN SMALL LETTER O WITH ACUTE
+#0xF4 U+00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX
+#0xF5 U+00F5 # LATIN SMALL LETTER O WITH TILDE
+#0xF6 U+00F6 # LATIN SMALL LETTER O WITH DIAERESIS
+#0xF7 U+00F7 # DIVISION SIGN
+#0xF8 U+00F8 # LATIN SMALL LETTER O WITH STROKE
+#0xF9 U+00F9 # LATIN SMALL LETTER U WITH GRAVE
+#0xFA U+00FA # LATIN SMALL LETTER U WITH ACUTE
+#0xFB U+00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX
+#0xFC U+00FC # LATIN SMALL LETTER U WITH DIAERESIS
+#0xFD U+00FD # LATIN SMALL LETTER Y WITH ACUTE
+#0xFE U+00FE # LATIN SMALL LETTER THORN (Icelandic)
+#0xFF U+00FF # LATIN SMALL LETTER Y WITH DIAERESIS
+
+
+0xd0 U+0110 # Dstrok and ETH are nearly the same...
+
+U+219e "\253-"
+U+21a0 "-\273"
+U+21ab "<-\260"
+U+21ac "\260->"
+U+21b4 "\254v"
+U+21b8 "\257^\134"
+U+21c7 "\253="
+U+21c9 "=\273"
+U+21e0 "<\267\267"
+U+21e2 "\267\267>"
+U+21f1 "|\257^\134"
+U+21f6 "=-\273>"
+U+2218 " \260 " # RING OPERATOR
+U+221b " ROOT\263 "
+U+2297 "(\327)" # CIRCLED TIMES
+U+2299 "(\267)" # CIRCLED DOT OPERATOR
+U+229A "(\260)" # CIRCLED RING OPERATOR
+U+22A0 "[\327]" # SQUARED TIMES
+U+22A1 "[\267]" # SQUARED DOT OPERATOR
+U+22C5 " \267 " # DOT OPERATOR
+U+2603 "\2508\250"
+U+2609 "(\267)"
+U+2614 "\250J\250"
+U+262d "\264\134,)"
+U+266b "d\257d"
+U+2686 "(\267)"
+U+2688 "((\267))"
+U+2692 "\264X`"
+U+2694 ",\327,"
+U+2697 "\360"
+U+2698 "\316"
+U+2699 "\244"
+U+269b ":\244:"
+U+2701 "8\264"
+U+270c "mV\270"
+U+2721 "\244"
+U+273f "\244"
+U+2740 "\244"
+U+2741 "\244"
+U+2761 "\266"
+U+279f "\267->"
+U+27a0 "\267->"
+U+27a7 "\267>"
+U+2900 "-|-\273"
+U+2901 "-||-\273"
+U+2905 "|-\273"
+U+290c "<-\267"
+U+290d "\267->"
+U+290e "<-\267\267"
+U+290f "\267\267->"
+U+2910 ">\267\267-\273"
+U+2911 "\267\267>"
+U+2912 "\257^|"
+U+2916 ">-\273"
+U+2917 ">-|-\273"
+U+2918 ">-||-\273"
+U+291b "-\253"
+U+291c "\273-"
+U+2923 "^\134\270"
+U+2924 "\270/^"
+U+2942 "-><\267"
+U+2943 "<-\267>"
+U+2944 "\267><-"
+U+2954 "\257^|"
+U+2958 "\257^|"
+U+295d "\257|v"
+U+2961 "\257|v"
diff --git a/src/chrtrans/iso02_uni.tbl b/src/chrtrans/iso02_uni.tbl
new file mode 100644
index 0000000..fe3fc71
--- /dev/null
+++ b/src/chrtrans/iso02_uni.tbl
@@ -0,0 +1,265 @@
+# This file has been modified for lynx (see README.tables)
+
+#The MIME name of this charset.
+Miso-8859-2
+
+#Name as a Display Charset (used on Options screen)
+OEastern European (ISO-8859-2)
+
+#Codepage number
+C912
+
+#
+# Name: ISO 8859-2:1999 to Unicode
+# Unicode version: 3.0
+# Table version: 1.0
+# Table format: Format A
+# Date: 1999 July 27
+# Authors: Ken Whistler <kenw@sybase.com>
+#
+# Copyright (c) 1991-1999 Unicode, Inc. All Rights reserved.
+#
+# This file is provided as-is by Unicode, Inc. (The Unicode Consortium).
+# No claims are made as to fitness for any particular purpose. No
+# warranties of any kind are expressed or implied. The recipient
+# agrees to determine applicability of information provided. If this
+# file has been provided on optical media by Unicode, Inc., the sole
+# remedy for any claim will be exchange of defective media within 90
+# days of receipt.
+#
+# Unicode, Inc. hereby grants the right to freely use the information
+# supplied in this file in the creation of products supporting the
+# Unicode Standard, and to make copies of this file in any form for
+# internal or external distribution as long as this notice remains
+# attached.
+#
+# General notes:
+#
+# This table contains the data the Unicode Consortium has on how
+# ISO/IEC 8859-2:1999 characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the ISO/IEC 8859-2 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in ISO/IEC 8859-2 order.
+#
+# Version history
+# 1.0 version updates 0.1 version by adding mappings for all
+# control characters.
+#
+# Updated versions of this file may be found in:
+# <ftp://ftp.unicode.org/Public/MAPPINGS/>
+#
+# Any comments or problems, contact <errata@unicode.org>
+# Please note that <errata@unicode.org> is an archival address;
+# notices will be checked, but do not expect an immediate response.
+#
+# Lines with more than one Unicode (U+XXXX) value contain additional
+# replacement mappings added for lynx. - kw
+#
+0x20-0x7e idem
+#
+#0x20 U+0020 # SPACE
+#0x21 U+0021 # EXCLAMATION MARK
+#0x22 U+0022 # QUOTATION MARK
+#0x23 U+0023 # NUMBER SIGN
+#0x24 U+0024 # DOLLAR SIGN
+#0x25 U+0025 # PERCENT SIGN
+#0x26 U+0026 # AMPERSAND
+#0x27 U+0027 # APOSTROPHE
+#0x28 U+0028 # LEFT PARENTHESIS
+#0x29 U+0029 # RIGHT PARENTHESIS
+#0x2A U+002A # ASTERISK
+#0x2B U+002B # PLUS SIGN
+#0x2C U+002C # COMMA
+#0x2D U+002D # HYPHEN-MINUS
+#0x2E U+002E # FULL STOP
+#0x2F U+002F # SOLIDUS
+#0x30 U+0030 # DIGIT ZERO
+#0x31 U+0031 # DIGIT ONE
+#0x32 U+0032 # DIGIT TWO
+#0x33 U+0033 # DIGIT THREE
+#0x34 U+0034 # DIGIT FOUR
+#0x35 U+0035 # DIGIT FIVE
+#0x36 U+0036 # DIGIT SIX
+#0x37 U+0037 # DIGIT SEVEN
+#0x38 U+0038 # DIGIT EIGHT
+#0x39 U+0039 # DIGIT NINE
+#0x3A U+003A # COLON
+#0x3B U+003B # SEMICOLON
+#0x3C U+003C # LESS-THAN SIGN
+#0x3D U+003D # EQUALS SIGN
+#0x3E U+003E # GREATER-THAN SIGN
+#0x3F U+003F # QUESTION MARK
+#0x40 U+0040 # COMMERCIAL AT
+#0x41 U+0041 # LATIN CAPITAL LETTER A
+#0x42 U+0042 # LATIN CAPITAL LETTER B
+#0x43 U+0043 # LATIN CAPITAL LETTER C
+#0x44 U+0044 # LATIN CAPITAL LETTER D
+#0x45 U+0045 # LATIN CAPITAL LETTER E
+#0x46 U+0046 # LATIN CAPITAL LETTER F
+#0x47 U+0047 # LATIN CAPITAL LETTER G
+#0x48 U+0048 # LATIN CAPITAL LETTER H
+#0x49 U+0049 # LATIN CAPITAL LETTER I
+#0x4A U+004A # LATIN CAPITAL LETTER J
+#0x4B U+004B # LATIN CAPITAL LETTER K
+#0x4C U+004C # LATIN CAPITAL LETTER L
+#0x4D U+004D # LATIN CAPITAL LETTER M
+#0x4E U+004E # LATIN CAPITAL LETTER N
+#0x4F U+004F # LATIN CAPITAL LETTER O
+#0x50 U+0050 # LATIN CAPITAL LETTER P
+#0x51 U+0051 # LATIN CAPITAL LETTER Q
+#0x52 U+0052 # LATIN CAPITAL LETTER R
+#0x53 U+0053 # LATIN CAPITAL LETTER S
+#0x54 U+0054 # LATIN CAPITAL LETTER T
+#0x55 U+0055 # LATIN CAPITAL LETTER U
+#0x56 U+0056 # LATIN CAPITAL LETTER V
+#0x57 U+0057 # LATIN CAPITAL LETTER W
+#0x58 U+0058 # LATIN CAPITAL LETTER X
+#0x59 U+0059 # LATIN CAPITAL LETTER Y
+#0x5A U+005A # LATIN CAPITAL LETTER Z
+#0x5B U+005B # LEFT SQUARE BRACKET
+#0x5C U+005C # REVERSE SOLIDUS
+#0x5D U+005D # RIGHT SQUARE BRACKET
+#0x5E U+005E # CIRCUMFLEX ACCENT
+#0x5F U+005F # LOW LINE
+#0x60 U+0060 # GRAVE ACCENT
+#0x61 U+0061 # LATIN SMALL LETTER A
+#0x62 U+0062 # LATIN SMALL LETTER B
+#0x63 U+0063 # LATIN SMALL LETTER C
+#0x64 U+0064 # LATIN SMALL LETTER D
+#0x65 U+0065 # LATIN SMALL LETTER E
+#0x66 U+0066 # LATIN SMALL LETTER F
+#0x67 U+0067 # LATIN SMALL LETTER G
+#0x68 U+0068 # LATIN SMALL LETTER H
+#0x69 U+0069 # LATIN SMALL LETTER I
+#0x6A U+006A # LATIN SMALL LETTER J
+#0x6B U+006B # LATIN SMALL LETTER K
+#0x6C U+006C # LATIN SMALL LETTER L
+#0x6D U+006D # LATIN SMALL LETTER M
+#0x6E U+006E # LATIN SMALL LETTER N
+#0x6F U+006F # LATIN SMALL LETTER O
+#0x70 U+0070 # LATIN SMALL LETTER P
+#0x71 U+0071 # LATIN SMALL LETTER Q
+#0x72 U+0072 # LATIN SMALL LETTER R
+#0x73 U+0073 # LATIN SMALL LETTER S
+#0x74 U+0074 # LATIN SMALL LETTER T
+#0x75 U+0075 # LATIN SMALL LETTER U
+#0x76 U+0076 # LATIN SMALL LETTER V
+#0x77 U+0077 # LATIN SMALL LETTER W
+#0x78 U+0078 # LATIN SMALL LETTER X
+#0x79 U+0079 # LATIN SMALL LETTER Y
+#0x7A U+007A # LATIN SMALL LETTER Z
+#0x7B U+007B # LEFT CURLY BRACKET
+#0x7C U+007C # VERTICAL LINE
+#0x7D U+007D # RIGHT CURLY BRACKET
+#0x7E U+007E # TILDE
+0xA0 U+00A0 # NO-BREAK SPACE
+0xA1 U+0104 # LATIN CAPITAL LETTER A WITH OGONEK
+0xA2 U+02D8 U+0306 # BREVE
+0xA3 U+0141 # LATIN CAPITAL LETTER L WITH STROKE
+0xA4 U+00A4 # CURRENCY SIGN
+0xA5 U+013D # LATIN CAPITAL LETTER L WITH CARON
+0xA6 U+015A # LATIN CAPITAL LETTER S WITH ACUTE
+0xA7 U+00A7 # SECTION SIGN
+0xA8 U+00A8 U+0308 # DIAERESIS
+0xA9 U+0160 U+0428 # LATIN CAPITAL LETTER S WITH CARON
+0xAA U+015E # LATIN CAPITAL LETTER S WITH CEDILLA
+0xAB U+0164 # LATIN CAPITAL LETTER T WITH CARON
+0xAC U+0179 # LATIN CAPITAL LETTER Z WITH ACUTE
+0xAD U+00AD # SOFT HYPHEN
+0xAE U+017D U+0416 # LATIN CAPITAL LETTER Z WITH CARON
+0xAF U+017B # LATIN CAPITAL LETTER Z WITH DOT ABOVE
+0xB0 U+00B0 U+030a # DEGREE SIGN
+0xB1 U+0105 # LATIN SMALL LETTER A WITH OGONEK
+0xB2 U+02DB U+0328 # OGONEK
+0xB3 U+0142 # LATIN SMALL LETTER L WITH STROKE
+0xB4 U+00B4 # ACUTE ACCENT
+0xB5 U+013E # LATIN SMALL LETTER L WITH CARON
+0xB6 U+015B # LATIN SMALL LETTER S WITH ACUTE
+0xB7 U+02C7 U+030c # CARON
+0xB8 U+00B8 U+0327 # CEDILLA
+0xB9 U+0161 U+0448 # LATIN SMALL LETTER S WITH CARON
+0xBA U+015F # LATIN SMALL LETTER S WITH CEDILLA
+0xBB U+0165 # LATIN SMALL LETTER T WITH CARON
+0xBC U+017A # LATIN SMALL LETTER Z WITH ACUTE
+0xBD U+02DD U+030b # DOUBLE ACUTE ACCENT
+0xBE U+017E U+0436 # LATIN SMALL LETTER Z WITH CARON
+0xBF U+017C # LATIN SMALL LETTER Z WITH DOT ABOVE
+0xC0 U+0154 # LATIN CAPITAL LETTER R WITH ACUTE
+0xC1 U+00C1 # LATIN CAPITAL LETTER A WITH ACUTE
+0xC2 U+00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0xC3 U+0102 # LATIN CAPITAL LETTER A WITH BREVE
+0xC4 U+00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS
+0xC5 U+0139 # LATIN CAPITAL LETTER L WITH ACUTE
+0xC6 U+0106 # LATIN CAPITAL LETTER C WITH ACUTE
+0xC7 U+00C7 # LATIN CAPITAL LETTER C WITH CEDILLA
+0xC8 U+010C U+0427 # LATIN CAPITAL LETTER C WITH CARON
+0xC9 U+00C9 # LATIN CAPITAL LETTER E WITH ACUTE
+0xCA U+0118 # LATIN CAPITAL LETTER E WITH OGONEK
+0xCB U+00CB # LATIN CAPITAL LETTER E WITH DIAERESIS
+0xCC U+011A # LATIN CAPITAL LETTER E WITH CARON
+0xCD U+00CD # LATIN CAPITAL LETTER I WITH ACUTE
+0xCE U+00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0xCF U+010E # LATIN CAPITAL LETTER D WITH CARON
+0xD0 U+0110 # LATIN CAPITAL LETTER D WITH STROKE
+0xD1 U+0143 # LATIN CAPITAL LETTER N WITH ACUTE
+0xD2 U+0147 # LATIN CAPITAL LETTER N WITH CARON
+0xD3 U+00D3 # LATIN CAPITAL LETTER O WITH ACUTE
+0xD4 U+00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0xD5 U+0150 # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+0xD6 U+00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS
+0xD7 U+00D7 U+00b7 # MULTIPLICATION SIGN
+0xD8 U+0158 # LATIN CAPITAL LETTER R WITH CARON
+0xD9 U+016E # LATIN CAPITAL LETTER U WITH RING ABOVE
+0xDA U+00DA # LATIN CAPITAL LETTER U WITH ACUTE
+0xDB U+0170 # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+0xDC U+00DC # LATIN CAPITAL LETTER U WITH DIAERESIS
+0xDD U+00DD # LATIN CAPITAL LETTER Y WITH ACUTE
+0xDE U+0162 # LATIN CAPITAL LETTER T WITH CEDILLA
+0xDF U+00DF # LATIN SMALL LETTER SHARP S
+0xE0 U+0155 # LATIN SMALL LETTER R WITH ACUTE
+0xE1 U+00E1 # LATIN SMALL LETTER A WITH ACUTE
+0xE2 U+00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX
+0xE3 U+0103 # LATIN SMALL LETTER A WITH BREVE
+0xE4 U+00E4 # LATIN SMALL LETTER A WITH DIAERESIS
+0xE5 U+013A # LATIN SMALL LETTER L WITH ACUTE
+0xE6 U+0107 # LATIN SMALL LETTER C WITH ACUTE
+0xE7 U+00E7 # LATIN SMALL LETTER C WITH CEDILLA
+0xE8 U+010D U+02a7 U+0447 # LATIN SMALL LETTER C WITH CARON
+0xE9 U+00E9 # LATIN SMALL LETTER E WITH ACUTE
+0xEA U+0119 # LATIN SMALL LETTER E WITH OGONEK
+0xEB U+00EB # LATIN SMALL LETTER E WITH DIAERESIS
+0xEC U+011B # LATIN SMALL LETTER E WITH CARON
+0xED U+00ED # LATIN SMALL LETTER I WITH ACUTE
+0xEE U+00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX
+0xEF U+010F # LATIN SMALL LETTER D WITH CARON
+0xF0 U+0111 # LATIN SMALL LETTER D WITH STROKE
+0xF1 U+0144 # LATIN SMALL LETTER N WITH ACUTE
+0xF2 U+0148 # LATIN SMALL LETTER N WITH CARON
+0xF3 U+00F3 # LATIN SMALL LETTER O WITH ACUTE
+0xF4 U+00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX
+0xF5 U+0151 # LATIN SMALL LETTER O WITH DOUBLE ACUTE
+0xF6 U+00F6 # LATIN SMALL LETTER O WITH DIAERESIS
+0xF7 U+00F7 # DIVISION SIGN
+0xF8 U+0159 # LATIN SMALL LETTER R WITH CARON
+0xF9 U+016F # LATIN SMALL LETTER U WITH RING ABOVE
+0xFA U+00FA # LATIN SMALL LETTER U WITH ACUTE
+0xFB U+0171 # LATIN SMALL LETTER U WITH DOUBLE ACUTE
+0xFC U+00FC # LATIN SMALL LETTER U WITH DIAERESIS
+0xFD U+00FD # LATIN SMALL LETTER Y WITH ACUTE
+0xFE U+0163 # LATIN SMALL LETTER T WITH CEDILLA
+0xFF U+02D9 U+0307 U+0387 # DOT ABOVE
+
+
+0xd0 U+00d0 # Dstrok and ETH are nearly the same...
+
+U+2218 " \260 " # RING OPERATOR
+U+2297 "(\327)" # CIRCLED TIMES
+U+2299 "(\377)" # CIRCLED DOT OPERATOR
+U+229A "(\260)" # CIRCLED RING OPERATOR
+U+22A0 "[\327]" # SQUARED TIMES
+U+22A1 "[\377]" # SQUARED DOT OPERATOR
+U+22C5 " \377 " # DOT OPERATOR
diff --git a/src/chrtrans/iso03_uni.tbl b/src/chrtrans/iso03_uni.tbl
new file mode 100644
index 0000000..aafce8d
--- /dev/null
+++ b/src/chrtrans/iso03_uni.tbl
@@ -0,0 +1,255 @@
+# This file has been modified for lynx (see README.tables)
+
+#The MIME name of this charset.
+Miso-8859-3
+
+#Name as a Display Charset (used on Options screen)
+OLatin 3 (ISO-8859-3)
+
+#Codepage number
+C913
+
+#
+# Name: ISO/IEC 8859-3:1999 to Unicode
+# Unicode version: 3.0
+# Table version: 1.0
+# Table format: Format A
+# Date: 1999 July 27
+# Authors: Ken Whistler <kenw@sybase.com>
+#
+# Copyright (c) 1991-1999 Unicode, Inc. All Rights reserved.
+#
+# This file is provided as-is by Unicode, Inc. (The Unicode Consortium).
+# No claims are made as to fitness for any particular purpose. No
+# warranties of any kind are expressed or implied. The recipient
+# agrees to determine applicability of information provided. If this
+# file has been provided on optical media by Unicode, Inc., the sole
+# remedy for any claim will be exchange of defective media within 90
+# days of receipt.
+#
+# Unicode, Inc. hereby grants the right to freely use the information
+# supplied in this file in the creation of products supporting the
+# Unicode Standard, and to make copies of this file in any form for
+# internal or external distribution as long as this notice remains
+# attached.
+#
+# General notes:
+#
+# This table contains the data the Unicode Consortium has on how
+# ISO/IEC 8859-3:1999 characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the ISO/IEC 8859-3 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in ISO/IEC 8859-3 order.
+#
+# Version history
+# 1.0 version updates 0.1 version by adding mappings for all
+# control characters.
+#
+# Updated versions of this file may be found in:
+# <ftp://ftp.unicode.org/Public/MAPPINGS/>
+#
+# Any comments or problems, contact <errata@unicode.org>
+# Please note that <errata@unicode.org> is an archival address;
+# notices will be checked, but do not expect an immediate response.
+#
+0x20-0x7e idem
+#
+#0x20 U+0020 # SPACE
+#0x21 U+0021 # EXCLAMATION MARK
+#0x22 U+0022 # QUOTATION MARK
+#0x23 U+0023 # NUMBER SIGN
+#0x24 U+0024 # DOLLAR SIGN
+#0x25 U+0025 # PERCENT SIGN
+#0x26 U+0026 # AMPERSAND
+#0x27 U+0027 # APOSTROPHE
+#0x28 U+0028 # LEFT PARENTHESIS
+#0x29 U+0029 # RIGHT PARENTHESIS
+#0x2A U+002A # ASTERISK
+#0x2B U+002B # PLUS SIGN
+#0x2C U+002C # COMMA
+#0x2D U+002D # HYPHEN-MINUS
+#0x2E U+002E # FULL STOP
+#0x2F U+002F # SOLIDUS
+#0x30 U+0030 # DIGIT ZERO
+#0x31 U+0031 # DIGIT ONE
+#0x32 U+0032 # DIGIT TWO
+#0x33 U+0033 # DIGIT THREE
+#0x34 U+0034 # DIGIT FOUR
+#0x35 U+0035 # DIGIT FIVE
+#0x36 U+0036 # DIGIT SIX
+#0x37 U+0037 # DIGIT SEVEN
+#0x38 U+0038 # DIGIT EIGHT
+#0x39 U+0039 # DIGIT NINE
+#0x3A U+003A # COLON
+#0x3B U+003B # SEMICOLON
+#0x3C U+003C # LESS-THAN SIGN
+#0x3D U+003D # EQUALS SIGN
+#0x3E U+003E # GREATER-THAN SIGN
+#0x3F U+003F # QUESTION MARK
+#0x40 U+0040 # COMMERCIAL AT
+#0x41 U+0041 # LATIN CAPITAL LETTER A
+#0x42 U+0042 # LATIN CAPITAL LETTER B
+#0x43 U+0043 # LATIN CAPITAL LETTER C
+#0x44 U+0044 # LATIN CAPITAL LETTER D
+#0x45 U+0045 # LATIN CAPITAL LETTER E
+#0x46 U+0046 # LATIN CAPITAL LETTER F
+#0x47 U+0047 # LATIN CAPITAL LETTER G
+#0x48 U+0048 # LATIN CAPITAL LETTER H
+#0x49 U+0049 # LATIN CAPITAL LETTER I
+#0x4A U+004A # LATIN CAPITAL LETTER J
+#0x4B U+004B # LATIN CAPITAL LETTER K
+#0x4C U+004C # LATIN CAPITAL LETTER L
+#0x4D U+004D # LATIN CAPITAL LETTER M
+#0x4E U+004E # LATIN CAPITAL LETTER N
+#0x4F U+004F # LATIN CAPITAL LETTER O
+#0x50 U+0050 # LATIN CAPITAL LETTER P
+#0x51 U+0051 # LATIN CAPITAL LETTER Q
+#0x52 U+0052 # LATIN CAPITAL LETTER R
+#0x53 U+0053 # LATIN CAPITAL LETTER S
+#0x54 U+0054 # LATIN CAPITAL LETTER T
+#0x55 U+0055 # LATIN CAPITAL LETTER U
+#0x56 U+0056 # LATIN CAPITAL LETTER V
+#0x57 U+0057 # LATIN CAPITAL LETTER W
+#0x58 U+0058 # LATIN CAPITAL LETTER X
+#0x59 U+0059 # LATIN CAPITAL LETTER Y
+#0x5A U+005A # LATIN CAPITAL LETTER Z
+#0x5B U+005B # LEFT SQUARE BRACKET
+#0x5C U+005C # REVERSE SOLIDUS
+#0x5D U+005D # RIGHT SQUARE BRACKET
+#0x5E U+005E # CIRCUMFLEX ACCENT
+#0x5F U+005F # LOW LINE
+#0x60 U+0060 # GRAVE ACCENT
+#0x61 U+0061 # LATIN SMALL LETTER A
+#0x62 U+0062 # LATIN SMALL LETTER B
+#0x63 U+0063 # LATIN SMALL LETTER C
+#0x64 U+0064 # LATIN SMALL LETTER D
+#0x65 U+0065 # LATIN SMALL LETTER E
+#0x66 U+0066 # LATIN SMALL LETTER F
+#0x67 U+0067 # LATIN SMALL LETTER G
+#0x68 U+0068 # LATIN SMALL LETTER H
+#0x69 U+0069 # LATIN SMALL LETTER I
+#0x6A U+006A # LATIN SMALL LETTER J
+#0x6B U+006B # LATIN SMALL LETTER K
+#0x6C U+006C # LATIN SMALL LETTER L
+#0x6D U+006D # LATIN SMALL LETTER M
+#0x6E U+006E # LATIN SMALL LETTER N
+#0x6F U+006F # LATIN SMALL LETTER O
+#0x70 U+0070 # LATIN SMALL LETTER P
+#0x71 U+0071 # LATIN SMALL LETTER Q
+#0x72 U+0072 # LATIN SMALL LETTER R
+#0x73 U+0073 # LATIN SMALL LETTER S
+#0x74 U+0074 # LATIN SMALL LETTER T
+#0x75 U+0075 # LATIN SMALL LETTER U
+#0x76 U+0076 # LATIN SMALL LETTER V
+#0x77 U+0077 # LATIN SMALL LETTER W
+#0x78 U+0078 # LATIN SMALL LETTER X
+#0x79 U+0079 # LATIN SMALL LETTER Y
+#0x7A U+007A # LATIN SMALL LETTER Z
+#0x7B U+007B # LEFT CURLY BRACKET
+#0x7C U+007C # VERTICAL LINE
+#0x7D U+007D # RIGHT CURLY BRACKET
+#0x7E U+007E # TILDE
+0xA0 U+00A0 # NO-BREAK SPACE
+0xA1 U+0126 # LATIN CAPITAL LETTER H WITH STROKE
+0xA2 U+02D8 # BREVE
+0xA3 U+00A3 # POUND SIGN
+0xA4 U+00A4 # CURRENCY SIGN
+0xA6 U+0124 # LATIN CAPITAL LETTER H WITH CIRCUMFLEX
+0xA7 U+00A7 # SECTION SIGN
+0xA8 U+00A8 # DIAERESIS
+0xA9 U+0130 # LATIN CAPITAL LETTER I WITH DOT ABOVE
+0xAA U+015E # LATIN CAPITAL LETTER S WITH CEDILLA
+0xAB U+011E # LATIN CAPITAL LETTER G WITH BREVE
+0xAC U+0134 # LATIN CAPITAL LETTER J WITH CIRCUMFLEX
+0xAD U+00AD # SOFT HYPHEN
+0xAF U+017B # LATIN CAPITAL LETTER Z WITH DOT ABOVE
+0xB0 U+00B0 # DEGREE SIGN
+0xB1 U+0127 # LATIN SMALL LETTER H WITH STROKE
+0xB2 U+00B2 # SUPERSCRIPT TWO
+0xB3 U+00B3 # SUPERSCRIPT THREE
+0xB4 U+00B4 # ACUTE ACCENT
+0xB5 U+00B5 # MICRO SIGN
+0xB6 U+0125 # LATIN SMALL LETTER H WITH CIRCUMFLEX
+0xB7 U+00B7 # MIDDLE DOT
+0xB8 U+00B8 # CEDILLA
+0xB9 U+0131 # LATIN SMALL LETTER DOTLESS I
+0xBA U+015F # LATIN SMALL LETTER S WITH CEDILLA
+0xBB U+011F # LATIN SMALL LETTER G WITH BREVE
+0xBC U+0135 # LATIN SMALL LETTER J WITH CIRCUMFLEX
+0xBD U+00BD # VULGAR FRACTION ONE HALF
+0xBF U+017C # LATIN SMALL LETTER Z WITH DOT ABOVE
+0xC0 U+00C0 # LATIN CAPITAL LETTER A WITH GRAVE
+0xC1 U+00C1 # LATIN CAPITAL LETTER A WITH ACUTE
+0xC2 U+00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0xC4 U+00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS
+0xC5 U+010A # LATIN CAPITAL LETTER C WITH DOT ABOVE
+0xC6 U+0108 # LATIN CAPITAL LETTER C WITH CIRCUMFLEX
+0xC7 U+00C7 # LATIN CAPITAL LETTER C WITH CEDILLA
+0xC8 U+00C8 # LATIN CAPITAL LETTER E WITH GRAVE
+0xC9 U+00C9 # LATIN CAPITAL LETTER E WITH ACUTE
+0xCA U+00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+0xCB U+00CB # LATIN CAPITAL LETTER E WITH DIAERESIS
+0xCC U+00CC # LATIN CAPITAL LETTER I WITH GRAVE
+0xCD U+00CD # LATIN CAPITAL LETTER I WITH ACUTE
+0xCE U+00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0xCF U+00CF # LATIN CAPITAL LETTER I WITH DIAERESIS
+0xD1 U+00D1 # LATIN CAPITAL LETTER N WITH TILDE
+0xD2 U+00D2 # LATIN CAPITAL LETTER O WITH GRAVE
+0xD3 U+00D3 # LATIN CAPITAL LETTER O WITH ACUTE
+0xD4 U+00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0xD5 U+0120 # LATIN CAPITAL LETTER G WITH DOT ABOVE
+0xD6 U+00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS
+0xD7 U+00D7 # MULTIPLICATION SIGN
+0xD8 U+011C # LATIN CAPITAL LETTER G WITH CIRCUMFLEX
+0xD9 U+00D9 # LATIN CAPITAL LETTER U WITH GRAVE
+0xDA U+00DA # LATIN CAPITAL LETTER U WITH ACUTE
+0xDB U+00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+0xDC U+00DC # LATIN CAPITAL LETTER U WITH DIAERESIS
+0xDD U+016C # LATIN CAPITAL LETTER U WITH BREVE
+0xDE U+015C # LATIN CAPITAL LETTER S WITH CIRCUMFLEX
+0xDF U+00DF # LATIN SMALL LETTER SHARP S
+0xE0 U+00E0 # LATIN SMALL LETTER A WITH GRAVE
+0xE1 U+00E1 # LATIN SMALL LETTER A WITH ACUTE
+0xE2 U+00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX
+0xE4 U+00E4 # LATIN SMALL LETTER A WITH DIAERESIS
+0xE5 U+010B # LATIN SMALL LETTER C WITH DOT ABOVE
+0xE6 U+0109 # LATIN SMALL LETTER C WITH CIRCUMFLEX
+0xE7 U+00E7 # LATIN SMALL LETTER C WITH CEDILLA
+0xE8 U+00E8 # LATIN SMALL LETTER E WITH GRAVE
+0xE9 U+00E9 # LATIN SMALL LETTER E WITH ACUTE
+0xEA U+00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX
+0xEB U+00EB # LATIN SMALL LETTER E WITH DIAERESIS
+0xEC U+00EC # LATIN SMALL LETTER I WITH GRAVE
+0xED U+00ED # LATIN SMALL LETTER I WITH ACUTE
+0xEE U+00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX
+0xEF U+00EF # LATIN SMALL LETTER I WITH DIAERESIS
+0xF1 U+00F1 # LATIN SMALL LETTER N WITH TILDE
+0xF2 U+00F2 # LATIN SMALL LETTER O WITH GRAVE
+0xF3 U+00F3 # LATIN SMALL LETTER O WITH ACUTE
+0xF4 U+00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX
+0xF5 U+0121 # LATIN SMALL LETTER G WITH DOT ABOVE
+0xF6 U+00F6 # LATIN SMALL LETTER O WITH DIAERESIS
+0xF7 U+00F7 # DIVISION SIGN
+0xF8 U+011D # LATIN SMALL LETTER G WITH CIRCUMFLEX
+0xF9 U+00F9 # LATIN SMALL LETTER U WITH GRAVE
+0xFA U+00FA # LATIN SMALL LETTER U WITH ACUTE
+0xFB U+00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX
+0xFC U+00FC # LATIN SMALL LETTER U WITH DIAERESIS
+0xFD U+016D # LATIN SMALL LETTER U WITH BREVE
+0xFE U+015D # LATIN SMALL LETTER S WITH CIRCUMFLEX
+0xFF U+02D9 # DOT ABOVE
+
+
+# unassigned 8859-3 codepoints:
+# 0xa5 unused
+# 0xae unused
+# 0xbe unused
+# 0xc3 unused
+# 0xd0 unused
+# 0xe3 unused
+# 0xf0 unused
+
diff --git a/src/chrtrans/iso04_uni.tbl b/src/chrtrans/iso04_uni.tbl
new file mode 100644
index 0000000..a1c3ed0
--- /dev/null
+++ b/src/chrtrans/iso04_uni.tbl
@@ -0,0 +1,252 @@
+# This file has been modified for lynx (see README.tables)
+
+#The MIME name of this charset.
+Miso-8859-4
+
+#Name as a Display Charset (used on Options screen)
+OLatin 4 (ISO-8859-4)
+
+#Codepage number
+C914
+
+#
+# Name: ISO/IEC 8859-4:1998 to Unicode
+# Unicode version: 3.0
+# Table version: 1.0
+# Table format: Format A
+# Date: 1999 July 27
+# Authors: Ken Whistler <kenw@sybase.com>
+#
+# Copyright (c) 1991-1999 Unicode, Inc. All Rights reserved.
+#
+# This file is provided as-is by Unicode, Inc. (The Unicode Consortium).
+# No claims are made as to fitness for any particular purpose. No
+# warranties of any kind are expressed or implied. The recipient
+# agrees to determine applicability of information provided. If this
+# file has been provided on optical media by Unicode, Inc., the sole
+# remedy for any claim will be exchange of defective media within 90
+# days of receipt.
+#
+# Unicode, Inc. hereby grants the right to freely use the information
+# supplied in this file in the creation of products supporting the
+# Unicode Standard, and to make copies of this file in any form for
+# internal or external distribution as long as this notice remains
+# attached.
+#
+# General notes:
+#
+# This table contains the data the Unicode Consortium has on how
+# ISO/IEC 8859-4:1998 characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the ISO/IEC 8859-4 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in ISO/IEC 8859-4 order.
+#
+# Version history
+# 1.0 version updates 0.1 version by adding mappings for all
+# control characters.
+#
+# Updated versions of this file may be found in:
+# <ftp://ftp.unicode.org/Public/MAPPINGS/>
+#
+# Any comments or problems, contact <errata@unicode.org>
+# Please note that <errata@unicode.org> is an archival address;
+# notices will be checked, but do not expect an immediate response.
+#
+#0x20 U+0020 # SPACE
+#0x21 U+0021 # EXCLAMATION MARK
+#0x22 U+0022 # QUOTATION MARK
+#0x23 U+0023 # NUMBER SIGN
+#0x24 U+0024 # DOLLAR SIGN
+#0x25 U+0025 # PERCENT SIGN
+#0x26 U+0026 # AMPERSAND
+#0x27 U+0027 # APOSTROPHE
+#0x28 U+0028 # LEFT PARENTHESIS
+#0x29 U+0029 # RIGHT PARENTHESIS
+#0x2A U+002A # ASTERISK
+#0x2B U+002B # PLUS SIGN
+#0x2C U+002C # COMMA
+#0x2D U+002D # HYPHEN-MINUS
+#0x2E U+002E # FULL STOP
+#0x2F U+002F # SOLIDUS
+#0x30 U+0030 # DIGIT ZERO
+#0x31 U+0031 # DIGIT ONE
+#0x32 U+0032 # DIGIT TWO
+#0x33 U+0033 # DIGIT THREE
+#0x34 U+0034 # DIGIT FOUR
+#0x35 U+0035 # DIGIT FIVE
+#0x36 U+0036 # DIGIT SIX
+#0x37 U+0037 # DIGIT SEVEN
+#0x38 U+0038 # DIGIT EIGHT
+#0x39 U+0039 # DIGIT NINE
+#0x3A U+003A # COLON
+#0x3B U+003B # SEMICOLON
+#0x3C U+003C # LESS-THAN SIGN
+#0x3D U+003D # EQUALS SIGN
+#0x3E U+003E # GREATER-THAN SIGN
+#0x3F U+003F # QUESTION MARK
+#0x40 U+0040 # COMMERCIAL AT
+#0x41 U+0041 # LATIN CAPITAL LETTER A
+#0x42 U+0042 # LATIN CAPITAL LETTER B
+#0x43 U+0043 # LATIN CAPITAL LETTER C
+#0x44 U+0044 # LATIN CAPITAL LETTER D
+#0x45 U+0045 # LATIN CAPITAL LETTER E
+#0x46 U+0046 # LATIN CAPITAL LETTER F
+#0x47 U+0047 # LATIN CAPITAL LETTER G
+#0x48 U+0048 # LATIN CAPITAL LETTER H
+#0x49 U+0049 # LATIN CAPITAL LETTER I
+#0x4A U+004A # LATIN CAPITAL LETTER J
+#0x4B U+004B # LATIN CAPITAL LETTER K
+#0x4C U+004C # LATIN CAPITAL LETTER L
+#0x4D U+004D # LATIN CAPITAL LETTER M
+#0x4E U+004E # LATIN CAPITAL LETTER N
+#0x4F U+004F # LATIN CAPITAL LETTER O
+#0x50 U+0050 # LATIN CAPITAL LETTER P
+#0x51 U+0051 # LATIN CAPITAL LETTER Q
+#0x52 U+0052 # LATIN CAPITAL LETTER R
+#0x53 U+0053 # LATIN CAPITAL LETTER S
+#0x54 U+0054 # LATIN CAPITAL LETTER T
+#0x55 U+0055 # LATIN CAPITAL LETTER U
+#0x56 U+0056 # LATIN CAPITAL LETTER V
+#0x57 U+0057 # LATIN CAPITAL LETTER W
+#0x58 U+0058 # LATIN CAPITAL LETTER X
+#0x59 U+0059 # LATIN CAPITAL LETTER Y
+#0x5A U+005A # LATIN CAPITAL LETTER Z
+#0x5B U+005B # LEFT SQUARE BRACKET
+#0x5C U+005C # REVERSE SOLIDUS
+#0x5D U+005D # RIGHT SQUARE BRACKET
+#0x5E U+005E # CIRCUMFLEX ACCENT
+#0x5F U+005F # LOW LINE
+#0x60 U+0060 # GRAVE ACCENT
+#0x61 U+0061 # LATIN SMALL LETTER A
+#0x62 U+0062 # LATIN SMALL LETTER B
+#0x63 U+0063 # LATIN SMALL LETTER C
+#0x64 U+0064 # LATIN SMALL LETTER D
+#0x65 U+0065 # LATIN SMALL LETTER E
+#0x66 U+0066 # LATIN SMALL LETTER F
+#0x67 U+0067 # LATIN SMALL LETTER G
+#0x68 U+0068 # LATIN SMALL LETTER H
+#0x69 U+0069 # LATIN SMALL LETTER I
+#0x6A U+006A # LATIN SMALL LETTER J
+#0x6B U+006B # LATIN SMALL LETTER K
+#0x6C U+006C # LATIN SMALL LETTER L
+#0x6D U+006D # LATIN SMALL LETTER M
+#0x6E U+006E # LATIN SMALL LETTER N
+#0x6F U+006F # LATIN SMALL LETTER O
+#0x70 U+0070 # LATIN SMALL LETTER P
+#0x71 U+0071 # LATIN SMALL LETTER Q
+#0x72 U+0072 # LATIN SMALL LETTER R
+#0x73 U+0073 # LATIN SMALL LETTER S
+#0x74 U+0074 # LATIN SMALL LETTER T
+#0x75 U+0075 # LATIN SMALL LETTER U
+#0x76 U+0076 # LATIN SMALL LETTER V
+#0x77 U+0077 # LATIN SMALL LETTER W
+#0x78 U+0078 # LATIN SMALL LETTER X
+#0x79 U+0079 # LATIN SMALL LETTER Y
+#0x7A U+007A # LATIN SMALL LETTER Z
+#0x7B U+007B # LEFT CURLY BRACKET
+#0x7C U+007C # VERTICAL LINE
+#0x7D U+007D # RIGHT CURLY BRACKET
+#0x7E U+007E # TILDE
+0xA0 U+00A0 # NO-BREAK SPACE
+0xA1 U+0104 # LATIN CAPITAL LETTER A WITH OGONEK
+0xA2 U+0138 # LATIN SMALL LETTER KRA
+0xA3 U+0156 # LATIN CAPITAL LETTER R WITH CEDILLA
+0xA4 U+00A4 # CURRENCY SIGN
+0xA5 U+0128 # LATIN CAPITAL LETTER I WITH TILDE
+0xA6 U+013B # LATIN CAPITAL LETTER L WITH CEDILLA
+0xA7 U+00A7 # SECTION SIGN
+0xA8 U+00A8 # DIAERESIS
+0xA9 U+0160 # LATIN CAPITAL LETTER S WITH CARON
+0xAA U+0112 # LATIN CAPITAL LETTER E WITH MACRON
+0xAB U+0122 # LATIN CAPITAL LETTER G WITH CEDILLA
+0xAC U+0166 # LATIN CAPITAL LETTER T WITH STROKE
+0xAD U+00AD # SOFT HYPHEN
+0xAE U+017D # LATIN CAPITAL LETTER Z WITH CARON
+0xAF U+00AF # MACRON
+0xB0 U+00B0 # DEGREE SIGN
+0xB1 U+0105 # LATIN SMALL LETTER A WITH OGONEK
+0xB2 U+02DB # OGONEK
+0xB3 U+0157 # LATIN SMALL LETTER R WITH CEDILLA
+0xB4 U+00B4 # ACUTE ACCENT
+0xB5 U+0129 # LATIN SMALL LETTER I WITH TILDE
+0xB6 U+013C # LATIN SMALL LETTER L WITH CEDILLA
+0xB7 U+02C7 # CARON
+0xB8 U+00B8 # CEDILLA
+0xB9 U+0161 # LATIN SMALL LETTER S WITH CARON
+0xBA U+0113 # LATIN SMALL LETTER E WITH MACRON
+0xBB U+0123 # LATIN SMALL LETTER G WITH CEDILLA
+0xBC U+0167 # LATIN SMALL LETTER T WITH STROKE
+0xBD U+014A # LATIN CAPITAL LETTER ENG
+0xBE U+017E # LATIN SMALL LETTER Z WITH CARON
+0xBF U+014B # LATIN SMALL LETTER ENG
+0xC0 U+0100 # LATIN CAPITAL LETTER A WITH MACRON
+0xC1 U+00C1 # LATIN CAPITAL LETTER A WITH ACUTE
+0xC2 U+00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0xC3 U+00C3 # LATIN CAPITAL LETTER A WITH TILDE
+0xC4 U+00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS
+0xC5 U+00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE
+0xC6 U+00C6 # LATIN CAPITAL LETTER AE
+0xC7 U+012E # LATIN CAPITAL LETTER I WITH OGONEK
+0xC8 U+010C # LATIN CAPITAL LETTER C WITH CARON
+0xC9 U+00C9 # LATIN CAPITAL LETTER E WITH ACUTE
+0xCA U+0118 # LATIN CAPITAL LETTER E WITH OGONEK
+0xCB U+00CB # LATIN CAPITAL LETTER E WITH DIAERESIS
+0xCC U+0116 # LATIN CAPITAL LETTER E WITH DOT ABOVE
+0xCD U+00CD # LATIN CAPITAL LETTER I WITH ACUTE
+0xCE U+00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0xCF U+012A # LATIN CAPITAL LETTER I WITH MACRON
+0xD0 U+0110 # LATIN CAPITAL LETTER D WITH STROKE
+0xD1 U+0145 # LATIN CAPITAL LETTER N WITH CEDILLA
+0xD2 U+014C # LATIN CAPITAL LETTER O WITH MACRON
+0xD3 U+0136 # LATIN CAPITAL LETTER K WITH CEDILLA
+0xD4 U+00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0xD5 U+00D5 # LATIN CAPITAL LETTER O WITH TILDE
+0xD6 U+00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS
+0xD7 U+00D7 # MULTIPLICATION SIGN
+0xD8 U+00D8 # LATIN CAPITAL LETTER O WITH STROKE
+0xD9 U+0172 # LATIN CAPITAL LETTER U WITH OGONEK
+0xDA U+00DA # LATIN CAPITAL LETTER U WITH ACUTE
+0xDB U+00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+0xDC U+00DC # LATIN CAPITAL LETTER U WITH DIAERESIS
+0xDD U+0168 # LATIN CAPITAL LETTER U WITH TILDE
+0xDE U+016A # LATIN CAPITAL LETTER U WITH MACRON
+0xDF U+00DF # LATIN SMALL LETTER SHARP S
+0xE0 U+0101 # LATIN SMALL LETTER A WITH MACRON
+0xE1 U+00E1 # LATIN SMALL LETTER A WITH ACUTE
+0xE2 U+00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX
+0xE3 U+00E3 # LATIN SMALL LETTER A WITH TILDE
+0xE4 U+00E4 # LATIN SMALL LETTER A WITH DIAERESIS
+0xE5 U+00E5 # LATIN SMALL LETTER A WITH RING ABOVE
+0xE6 U+00E6 # LATIN SMALL LETTER AE
+0xE7 U+012F # LATIN SMALL LETTER I WITH OGONEK
+0xE8 U+010D # LATIN SMALL LETTER C WITH CARON
+0xE9 U+00E9 # LATIN SMALL LETTER E WITH ACUTE
+0xEA U+0119 # LATIN SMALL LETTER E WITH OGONEK
+0xEB U+00EB # LATIN SMALL LETTER E WITH DIAERESIS
+0xEC U+0117 # LATIN SMALL LETTER E WITH DOT ABOVE
+0xED U+00ED # LATIN SMALL LETTER I WITH ACUTE
+0xEE U+00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX
+0xEF U+012B # LATIN SMALL LETTER I WITH MACRON
+0xF0 U+0111 # LATIN SMALL LETTER D WITH STROKE
+0xF1 U+0146 # LATIN SMALL LETTER N WITH CEDILLA
+0xF2 U+014D # LATIN SMALL LETTER O WITH MACRON
+0xF3 U+0137 # LATIN SMALL LETTER K WITH CEDILLA
+0xF4 U+00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX
+0xF5 U+00F5 # LATIN SMALL LETTER O WITH TILDE
+0xF6 U+00F6 # LATIN SMALL LETTER O WITH DIAERESIS
+0xF7 U+00F7 # DIVISION SIGN
+0xF8 U+00F8 # LATIN SMALL LETTER O WITH STROKE
+0xF9 U+0173 # LATIN SMALL LETTER U WITH OGONEK
+0xFA U+00FA # LATIN SMALL LETTER U WITH ACUTE
+0xFB U+00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX
+0xFC U+00FC # LATIN SMALL LETTER U WITH DIAERESIS
+0xFD U+0169 # LATIN SMALL LETTER U WITH TILDE
+0xFE U+016B # LATIN SMALL LETTER U WITH MACRON
+0xFF U+02D9 # DOT ABOVE
+
+
+0xd0 U+00d0 # Dstrok and ETH are nearly the same...
diff --git a/src/chrtrans/iso05_uni.tbl b/src/chrtrans/iso05_uni.tbl
new file mode 100644
index 0000000..afbb213
--- /dev/null
+++ b/src/chrtrans/iso05_uni.tbl
@@ -0,0 +1,259 @@
+# This file has been modified for lynx (see README.tables)
+
+#The MIME name of this charset.
+Miso-8859-5
+
+#Name as a Display Charset (used on Options screen)
+OCyrillic (ISO-8859-5)
+
+#Codepage number
+C915
+
+#
+# Name: ISO 8859-5:1999 to Unicode
+# Unicode version: 3.0
+# Table version: 1.0
+# Table format: Format A
+# Date: 1999 July 27
+# Authors: Ken Whistler <kenw@sybase.com>
+#
+# Copyright (c) 1991-1999 Unicode, Inc. All Rights reserved.
+#
+# This file is provided as-is by Unicode, Inc. (The Unicode Consortium).
+# No claims are made as to fitness for any particular purpose. No
+# warranties of any kind are expressed or implied. The recipient
+# agrees to determine applicability of information provided. If this
+# file has been provided on optical media by Unicode, Inc., the sole
+# remedy for any claim will be exchange of defective media within 90
+# days of receipt.
+#
+# Unicode, Inc. hereby grants the right to freely use the information
+# supplied in this file in the creation of products supporting the
+# Unicode Standard, and to make copies of this file in any form for
+# internal or external distribution as long as this notice remains
+# attached.
+#
+# General notes:
+#
+# This table contains the data the Unicode Consortium has on how
+# ISO/IEC 8859-5:1999 characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the ISO/IEC 8859-5 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in ISO/IEC 8859-5 order.
+#
+# Version history
+# 1.0 version updates 0.1 version by adding mappings for all
+# control characters.
+#
+# Updated versions of this file may be found in:
+# <ftp://ftp.unicode.org/Public/MAPPINGS/>
+#
+# Any comments or problems, contact <errata@unicode.org>
+# Please note that <errata@unicode.org> is an archival address;
+# notices will be checked, but do not expect an immediate response.
+#
+# Lines with more than one Unicode (U+XXXX) value contain additional
+# replacement mappings added for lynx. - kw
+#
+0x20-0x7e idem
+#
+#0x20 U+0020 # SPACE
+#0x21 U+0021 # EXCLAMATION MARK
+#0x22 U+0022 # QUOTATION MARK
+#0x23 U+0023 # NUMBER SIGN
+#0x24 U+0024 # DOLLAR SIGN
+#0x25 U+0025 # PERCENT SIGN
+#0x26 U+0026 # AMPERSAND
+#0x27 U+0027 # APOSTROPHE
+#0x28 U+0028 # LEFT PARENTHESIS
+#0x29 U+0029 # RIGHT PARENTHESIS
+#0x2A U+002A # ASTERISK
+#0x2B U+002B # PLUS SIGN
+#0x2C U+002C # COMMA
+#0x2D U+002D # HYPHEN-MINUS
+#0x2E U+002E # FULL STOP
+#0x2F U+002F # SOLIDUS
+#0x30 U+0030 # DIGIT ZERO
+#0x31 U+0031 # DIGIT ONE
+#0x32 U+0032 # DIGIT TWO
+#0x33 U+0033 # DIGIT THREE
+#0x34 U+0034 # DIGIT FOUR
+#0x35 U+0035 # DIGIT FIVE
+#0x36 U+0036 # DIGIT SIX
+#0x37 U+0037 # DIGIT SEVEN
+#0x38 U+0038 # DIGIT EIGHT
+#0x39 U+0039 # DIGIT NINE
+#0x3A U+003A # COLON
+#0x3B U+003B # SEMICOLON
+#0x3C U+003C # LESS-THAN SIGN
+#0x3D U+003D # EQUALS SIGN
+#0x3E U+003E # GREATER-THAN SIGN
+#0x3F U+003F # QUESTION MARK
+#0x40 U+0040 # COMMERCIAL AT
+#0x41 U+0041 # LATIN CAPITAL LETTER A
+#0x42 U+0042 # LATIN CAPITAL LETTER B
+#0x43 U+0043 # LATIN CAPITAL LETTER C
+#0x44 U+0044 # LATIN CAPITAL LETTER D
+#0x45 U+0045 # LATIN CAPITAL LETTER E
+#0x46 U+0046 # LATIN CAPITAL LETTER F
+#0x47 U+0047 # LATIN CAPITAL LETTER G
+#0x48 U+0048 # LATIN CAPITAL LETTER H
+#0x49 U+0049 # LATIN CAPITAL LETTER I
+#0x4A U+004A # LATIN CAPITAL LETTER J
+#0x4B U+004B # LATIN CAPITAL LETTER K
+#0x4C U+004C # LATIN CAPITAL LETTER L
+#0x4D U+004D # LATIN CAPITAL LETTER M
+#0x4E U+004E # LATIN CAPITAL LETTER N
+#0x4F U+004F # LATIN CAPITAL LETTER O
+#0x50 U+0050 # LATIN CAPITAL LETTER P
+#0x51 U+0051 # LATIN CAPITAL LETTER Q
+#0x52 U+0052 # LATIN CAPITAL LETTER R
+#0x53 U+0053 # LATIN CAPITAL LETTER S
+#0x54 U+0054 # LATIN CAPITAL LETTER T
+#0x55 U+0055 # LATIN CAPITAL LETTER U
+#0x56 U+0056 # LATIN CAPITAL LETTER V
+#0x57 U+0057 # LATIN CAPITAL LETTER W
+#0x58 U+0058 # LATIN CAPITAL LETTER X
+#0x59 U+0059 # LATIN CAPITAL LETTER Y
+#0x5A U+005A # LATIN CAPITAL LETTER Z
+#0x5B U+005B # LEFT SQUARE BRACKET
+#0x5C U+005C # REVERSE SOLIDUS
+#0x5D U+005D # RIGHT SQUARE BRACKET
+#0x5E U+005E # CIRCUMFLEX ACCENT
+#0x5F U+005F # LOW LINE
+#0x60 U+0060 # GRAVE ACCENT
+#0x61 U+0061 # LATIN SMALL LETTER A
+#0x62 U+0062 # LATIN SMALL LETTER B
+#0x63 U+0063 # LATIN SMALL LETTER C
+#0x64 U+0064 # LATIN SMALL LETTER D
+#0x65 U+0065 # LATIN SMALL LETTER E
+#0x66 U+0066 # LATIN SMALL LETTER F
+#0x67 U+0067 # LATIN SMALL LETTER G
+#0x68 U+0068 # LATIN SMALL LETTER H
+#0x69 U+0069 # LATIN SMALL LETTER I
+#0x6A U+006A # LATIN SMALL LETTER J
+#0x6B U+006B # LATIN SMALL LETTER K
+#0x6C U+006C # LATIN SMALL LETTER L
+#0x6D U+006D # LATIN SMALL LETTER M
+#0x6E U+006E # LATIN SMALL LETTER N
+#0x6F U+006F # LATIN SMALL LETTER O
+#0x70 U+0070 # LATIN SMALL LETTER P
+#0x71 U+0071 # LATIN SMALL LETTER Q
+#0x72 U+0072 # LATIN SMALL LETTER R
+#0x73 U+0073 # LATIN SMALL LETTER S
+#0x74 U+0074 # LATIN SMALL LETTER T
+#0x75 U+0075 # LATIN SMALL LETTER U
+#0x76 U+0076 # LATIN SMALL LETTER V
+#0x77 U+0077 # LATIN SMALL LETTER W
+#0x78 U+0078 # LATIN SMALL LETTER X
+#0x79 U+0079 # LATIN SMALL LETTER Y
+#0x7A U+007A # LATIN SMALL LETTER Z
+#0x7B U+007B # LEFT CURLY BRACKET
+#0x7C U+007C # VERTICAL LINE
+#0x7D U+007D # RIGHT CURLY BRACKET
+#0x7E U+007E # TILDE
+0xA0 U+00A0 # NO-BREAK SPACE
+0xA1 U+0401 # CYRILLIC CAPITAL LETTER IO
+0xA2 U+0402 # CYRILLIC CAPITAL LETTER DJE
+0xA3 U+0403 # CYRILLIC CAPITAL LETTER GJE
+0xA4 U+0404 # CYRILLIC CAPITAL LETTER UKRAINIAN IE
+0xA5 U+0405 # CYRILLIC CAPITAL LETTER DZE
+0xA6 U+0406 U+0130 # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+0xA7 U+0407 U+03AA # CYRILLIC CAPITAL LETTER YI
+0xA8 U+0408 # CYRILLIC CAPITAL LETTER JE
+0xA9 U+0409 # CYRILLIC CAPITAL LETTER LJE
+0xAA U+040A # CYRILLIC CAPITAL LETTER NJE
+0xAB U+040B # CYRILLIC CAPITAL LETTER TSHE
+0xAC U+040C # CYRILLIC CAPITAL LETTER KJE
+0xAD U+00AD # SOFT HYPHEN
+0xAE U+040E # CYRILLIC CAPITAL LETTER SHORT U
+0xAF U+040F # CYRILLIC CAPITAL LETTER DZHE
+0xB0 U+0410 # CYRILLIC CAPITAL LETTER A
+0xB1 U+0411 # CYRILLIC CAPITAL LETTER BE
+0xB2 U+0412 # CYRILLIC CAPITAL LETTER VE
+0xB3 U+0413 U+0393 # CYRILLIC CAPITAL LETTER GHE
+0xB4 U+0414 # CYRILLIC CAPITAL LETTER DE
+0xB5 U+0415 # CYRILLIC CAPITAL LETTER IE
+0xB6 U+0416 U+017d # CYRILLIC CAPITAL LETTER ZHE
+0xB7 U+0417 # CYRILLIC CAPITAL LETTER ZE
+0xB8 U+0418 # CYRILLIC CAPITAL LETTER I
+0xB9 U+0419 # CYRILLIC CAPITAL LETTER SHORT I
+0xBA U+041A # CYRILLIC CAPITAL LETTER KA
+0xBB U+041B U+039b # CYRILLIC CAPITAL LETTER EL
+0xBC U+041C # CYRILLIC CAPITAL LETTER EM
+0xBD U+041D # CYRILLIC CAPITAL LETTER EN
+0xBE U+041E # CYRILLIC CAPITAL LETTER O
+0xBF U+041F U+03a0 # CYRILLIC CAPITAL LETTER PE
+0xC0 U+0420 # CYRILLIC CAPITAL LETTER ER
+0xC1 U+0421 # CYRILLIC CAPITAL LETTER ES
+0xC2 U+0422 # CYRILLIC CAPITAL LETTER TE
+0xC3 U+0423 # CYRILLIC CAPITAL LETTER U
+0xC4 U+0424 U+03a6 # CYRILLIC CAPITAL LETTER EF
+0xC5 U+0425 # CYRILLIC CAPITAL LETTER HA
+0xC6 U+0426 # CYRILLIC CAPITAL LETTER TSE
+0xC7 U+0427 U+010c # CYRILLIC CAPITAL LETTER CHE
+0xC8 U+0428 U+0160 # CYRILLIC CAPITAL LETTER SHA
+0xC9 U+0429 # CYRILLIC CAPITAL LETTER SHCHA
+0xCA U+042A # CYRILLIC CAPITAL LETTER HARD SIGN
+0xCB U+042B # CYRILLIC CAPITAL LETTER YERU
+0xCC U+042C # CYRILLIC CAPITAL LETTER SOFT SIGN
+0xCD U+042D # CYRILLIC CAPITAL LETTER E
+0xCE U+042E # CYRILLIC CAPITAL LETTER YU
+0xCF U+042F # CYRILLIC CAPITAL LETTER YA
+0xD0 U+0430 # CYRILLIC SMALL LETTER A
+0xD1 U+0431 # CYRILLIC SMALL LETTER BE
+0xD2 U+0432 # CYRILLIC SMALL LETTER VE
+0xD3 U+0433 # CYRILLIC SMALL LETTER GHE
+0xD4 U+0434 # CYRILLIC SMALL LETTER DE
+0xD5 U+0435 # CYRILLIC SMALL LETTER IE
+0xD6 U+0436 U+017e # CYRILLIC SMALL LETTER ZHE
+0xD7 U+0437 # CYRILLIC SMALL LETTER ZE
+0xD8 U+0438 # CYRILLIC SMALL LETTER I
+0xD9 U+0439 # CYRILLIC SMALL LETTER SHORT I
+0xDA U+043A # CYRILLIC SMALL LETTER KA
+0xDB U+043B U+03bb # CYRILLIC SMALL LETTER EL
+0xDC U+043C # CYRILLIC SMALL LETTER EM
+0xDD U+043D # CYRILLIC SMALL LETTER EN
+0xDE U+043E # CYRILLIC SMALL LETTER O
+0xDF U+043F U+03c0 # CYRILLIC SMALL LETTER PE
+0xE0 U+0440 # CYRILLIC SMALL LETTER ER
+0xE1 U+0441 # CYRILLIC SMALL LETTER ES
+0xE2 U+0442 # CYRILLIC SMALL LETTER TE
+0xE3 U+0443 # CYRILLIC SMALL LETTER U
+0xE4 U+0444 U+03c6 # CYRILLIC SMALL LETTER EF
+0xE5 U+0445 # CYRILLIC SMALL LETTER HA
+0xE6 U+0446 # CYRILLIC SMALL LETTER TSE
+0xE7 U+0447 U+010d # CYRILLIC SMALL LETTER CHE
+0xE8 U+0448 U+0161 # CYRILLIC SMALL LETTER SHA
+0xE9 U+0449 # CYRILLIC SMALL LETTER SHCHA
+0xEA U+044A # CYRILLIC SMALL LETTER HARD SIGN
+0xEB U+044B U+0131 # CYRILLIC SMALL LETTER YERU
+0xEC U+044C # CYRILLIC SMALL LETTER SOFT SIGN
+0xED U+044D # CYRILLIC SMALL LETTER E
+0xEE U+044E # CYRILLIC SMALL LETTER YU
+0xEF U+044F # CYRILLIC SMALL LETTER YA
+0xF0 U+2116 # NUMERO SIGN
+0xF1 U+0451 # CYRILLIC SMALL LETTER IO
+0xF2 U+0452 # CYRILLIC SMALL LETTER DJE
+0xF3 U+0453 # CYRILLIC SMALL LETTER GJE
+0xF4 U+0454 # CYRILLIC SMALL LETTER UKRAINIAN IE
+0xF5 U+0455 # CYRILLIC SMALL LETTER DZE
+0xF6 U+0456 # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+0xF7 U+0457 U+03CA # CYRILLIC SMALL LETTER YI
+0xF8 U+0458 # CYRILLIC SMALL LETTER JE
+0xF9 U+0459 # CYRILLIC SMALL LETTER LJE
+0xFA U+045A # CYRILLIC SMALL LETTER NJE
+0xFB U+045B # CYRILLIC SMALL LETTER TSHE
+0xFC U+045C # CYRILLIC SMALL LETTER KJE
+0xFD U+00A7 # SECTION SIGN
+0xFE U+045E # CYRILLIC SMALL LETTER SHORT U
+0xFF U+045F # CYRILLIC SMALL LETTER DZHE
+
+U+0400 "`\265"
+U+040d "`\270"
+U+0450 "`\325"
+U+045d "`\330"
diff --git a/src/chrtrans/iso06_uni.tbl b/src/chrtrans/iso06_uni.tbl
new file mode 100644
index 0000000..e4ef995
--- /dev/null
+++ b/src/chrtrans/iso06_uni.tbl
@@ -0,0 +1,208 @@
+# This file has been modified for lynx (see README.tables)
+
+#The MIME name of this charset.
+Miso-8859-6
+
+#Name as a Display Charset (used on Options screen).
+OArabic (ISO-8859-6)
+
+#Codepage number
+C1089
+
+#
+# Name: ISO 8859-6:1999 to Unicode
+# Unicode version: 3.0
+# Table version: 1.0
+# Table format: Format A
+# Date: 1999 July 27
+# Authors: Ken Whistler <kenw@sybase.com>
+#
+# Copyright (c) 1991-1999 Unicode, Inc. All Rights reserved.
+#
+# This file is provided as-is by Unicode, Inc. (The Unicode Consortium).
+# No claims are made as to fitness for any particular purpose. No
+# warranties of any kind are expressed or implied. The recipient
+# agrees to determine applicability of information provided. If this
+# file has been provided on optical media by Unicode, Inc., the sole
+# remedy for any claim will be exchange of defective media within 90
+# days of receipt.
+#
+# Unicode, Inc. hereby grants the right to freely use the information
+# supplied in this file in the creation of products supporting the
+# Unicode Standard, and to make copies of this file in any form for
+# internal or external distribution as long as this notice remains
+# attached.
+#
+# General notes:
+#
+# This table contains the data the Unicode Consortium has on how
+# ISO/IEC 8859-6:1999 characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the ISO/IEC 8859-6 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in ISO/IEC 8859-6 order.
+#
+# Version history
+# 1.0 version updates 0.1 version by adding mappings for all
+# control characters.
+# 0x30..0x39 remapped to the ASCII digits (U+0030..U+0039) instead
+# of the Arabic digits (U+0660..U+0669).
+#
+# Updated versions of this file may be found in:
+# <ftp://ftp.unicode.org/Public/MAPPINGS/>
+#
+# Any comments or problems, contact <errata@unicode.org>
+# Please note that <errata@unicode.org> is an archival address;
+# notices will be checked, but do not expect an immediate response.
+#
+0x20-0x7e idem
+#
+#0x20 U+0020 # SPACE
+#0x21 U+0021 # EXCLAMATION MARK
+#0x22 U+0022 # QUOTATION MARK
+#0x23 U+0023 # NUMBER SIGN
+#0x24 U+0024 # DOLLAR SIGN
+#0x25 U+0025 # PERCENT SIGN
+#0x26 U+0026 # AMPERSAND
+#0x27 U+0027 # APOSTROPHE
+#0x28 U+0028 # LEFT PARENTHESIS
+#0x29 U+0029 # RIGHT PARENTHESIS
+#0x2A U+002A # ASTERISK
+#0x2B U+002B # PLUS SIGN
+#0x2C U+002C # COMMA
+#0x2D U+002D # HYPHEN-MINUS
+#0x2E U+002E # FULL STOP
+#0x2F U+002F # SOLIDUS
+#0x30 U+0030 # DIGIT ZERO
+#0x31 U+0031 # DIGIT ONE
+#0x32 U+0032 # DIGIT TWO
+#0x33 U+0033 # DIGIT THREE
+#0x34 U+0034 # DIGIT FOUR
+#0x35 U+0035 # DIGIT FIVE
+#0x36 U+0036 # DIGIT SIX
+#0x37 U+0037 # DIGIT SEVEN
+#0x38 U+0038 # DIGIT EIGHT
+#0x39 U+0039 # DIGIT NINE
+#0x3A U+003A # COLON
+#0x3B U+003B # SEMICOLON
+#0x3C U+003C # LESS-THAN SIGN
+#0x3D U+003D # EQUALS SIGN
+#0x3E U+003E # GREATER-THAN SIGN
+#0x3F U+003F # QUESTION MARK
+#0x40 U+0040 # COMMERCIAL AT
+#0x41 U+0041 # LATIN CAPITAL LETTER A
+#0x42 U+0042 # LATIN CAPITAL LETTER B
+#0x43 U+0043 # LATIN CAPITAL LETTER C
+#0x44 U+0044 # LATIN CAPITAL LETTER D
+#0x45 U+0045 # LATIN CAPITAL LETTER E
+#0x46 U+0046 # LATIN CAPITAL LETTER F
+#0x47 U+0047 # LATIN CAPITAL LETTER G
+#0x48 U+0048 # LATIN CAPITAL LETTER H
+#0x49 U+0049 # LATIN CAPITAL LETTER I
+#0x4A U+004A # LATIN CAPITAL LETTER J
+#0x4B U+004B # LATIN CAPITAL LETTER K
+#0x4C U+004C # LATIN CAPITAL LETTER L
+#0x4D U+004D # LATIN CAPITAL LETTER M
+#0x4E U+004E # LATIN CAPITAL LETTER N
+#0x4F U+004F # LATIN CAPITAL LETTER O
+#0x50 U+0050 # LATIN CAPITAL LETTER P
+#0x51 U+0051 # LATIN CAPITAL LETTER Q
+#0x52 U+0052 # LATIN CAPITAL LETTER R
+#0x53 U+0053 # LATIN CAPITAL LETTER S
+#0x54 U+0054 # LATIN CAPITAL LETTER T
+#0x55 U+0055 # LATIN CAPITAL LETTER U
+#0x56 U+0056 # LATIN CAPITAL LETTER V
+#0x57 U+0057 # LATIN CAPITAL LETTER W
+#0x58 U+0058 # LATIN CAPITAL LETTER X
+#0x59 U+0059 # LATIN CAPITAL LETTER Y
+#0x5A U+005A # LATIN CAPITAL LETTER Z
+#0x5B U+005B # LEFT SQUARE BRACKET
+#0x5C U+005C # REVERSE SOLIDUS
+#0x5D U+005D # RIGHT SQUARE BRACKET
+#0x5E U+005E # CIRCUMFLEX ACCENT
+#0x5F U+005F # LOW LINE
+#0x60 U+0060 # GRAVE ACCENT
+#0x61 U+0061 # LATIN SMALL LETTER A
+#0x62 U+0062 # LATIN SMALL LETTER B
+#0x63 U+0063 # LATIN SMALL LETTER C
+#0x64 U+0064 # LATIN SMALL LETTER D
+#0x65 U+0065 # LATIN SMALL LETTER E
+#0x66 U+0066 # LATIN SMALL LETTER F
+#0x67 U+0067 # LATIN SMALL LETTER G
+#0x68 U+0068 # LATIN SMALL LETTER H
+#0x69 U+0069 # LATIN SMALL LETTER I
+#0x6A U+006A # LATIN SMALL LETTER J
+#0x6B U+006B # LATIN SMALL LETTER K
+#0x6C U+006C # LATIN SMALL LETTER L
+#0x6D U+006D # LATIN SMALL LETTER M
+#0x6E U+006E # LATIN SMALL LETTER N
+#0x6F U+006F # LATIN SMALL LETTER O
+#0x70 U+0070 # LATIN SMALL LETTER P
+#0x71 U+0071 # LATIN SMALL LETTER Q
+#0x72 U+0072 # LATIN SMALL LETTER R
+#0x73 U+0073 # LATIN SMALL LETTER S
+#0x74 U+0074 # LATIN SMALL LETTER T
+#0x75 U+0075 # LATIN SMALL LETTER U
+#0x76 U+0076 # LATIN SMALL LETTER V
+#0x77 U+0077 # LATIN SMALL LETTER W
+#0x78 U+0078 # LATIN SMALL LETTER X
+#0x79 U+0079 # LATIN SMALL LETTER Y
+#0x7A U+007A # LATIN SMALL LETTER Z
+#0x7B U+007B # LEFT CURLY BRACKET
+#0x7C U+007C # VERTICAL LINE
+#0x7D U+007D # RIGHT CURLY BRACKET
+#0x7E U+007E # TILDE
+0xA0 U+00A0 # NO-BREAK SPACE
+0xA4 U+00A4 # CURRENCY SIGN
+0xAC U+060C # ARABIC COMMA
+0xAD U+00AD # SOFT HYPHEN
+0xBB U+061B # ARABIC SEMICOLON
+0xBF U+061F # ARABIC QUESTION MARK
+0xC1 U+0621 # ARABIC LETTER HAMZA
+0xC2 U+0622 # ARABIC LETTER ALEF WITH MADDA ABOVE
+0xC3 U+0623 # ARABIC LETTER ALEF WITH HAMZA ABOVE
+0xC4 U+0624 # ARABIC LETTER WAW WITH HAMZA ABOVE
+0xC5 U+0625 # ARABIC LETTER ALEF WITH HAMZA BELOW
+0xC6 U+0626 # ARABIC LETTER YEH WITH HAMZA ABOVE
+0xC7 U+0627 # ARABIC LETTER ALEF
+0xC8 U+0628 # ARABIC LETTER BEH
+0xC9 U+0629 # ARABIC LETTER TEH MARBUTA
+0xCA U+062A # ARABIC LETTER TEH
+0xCB U+062B # ARABIC LETTER THEH
+0xCC U+062C # ARABIC LETTER JEEM
+0xCD U+062D # ARABIC LETTER HAH
+0xCE U+062E # ARABIC LETTER KHAH
+0xCF U+062F # ARABIC LETTER DAL
+0xD0 U+0630 # ARABIC LETTER THAL
+0xD1 U+0631 # ARABIC LETTER REH
+0xD2 U+0632 # ARABIC LETTER ZAIN
+0xD3 U+0633 # ARABIC LETTER SEEN
+0xD4 U+0634 # ARABIC LETTER SHEEN
+0xD5 U+0635 # ARABIC LETTER SAD
+0xD6 U+0636 # ARABIC LETTER DAD
+0xD7 U+0637 # ARABIC LETTER TAH
+0xD8 U+0638 # ARABIC LETTER ZAH
+0xD9 U+0639 # ARABIC LETTER AIN
+0xDA U+063A # ARABIC LETTER GHAIN
+0xE0 U+0640 # ARABIC TATWEEL
+0xE1 U+0641 # ARABIC LETTER FEH
+0xE2 U+0642 # ARABIC LETTER QAF
+0xE3 U+0643 # ARABIC LETTER KAF
+0xE4 U+0644 # ARABIC LETTER LAM
+0xE5 U+0645 # ARABIC LETTER MEEM
+0xE6 U+0646 # ARABIC LETTER NOON
+0xE7 U+0647 # ARABIC LETTER HEH
+0xE8 U+0648 # ARABIC LETTER WAW
+0xE9 U+0649 # ARABIC LETTER ALEF MAKSURA
+0xEA U+064A # ARABIC LETTER YEH
+0xEB U+064B # ARABIC FATHATAN
+0xEC U+064C # ARABIC DAMMATAN
+0xED U+064D # ARABIC KASRATAN
+0xEE U+064E # ARABIC FATHA
+0xEF U+064F # ARABIC DAMMA
+0xF0 U+0650 # ARABIC KASRA
+0xF1 U+0651 # ARABIC SHADDA
+0xF2 U+0652 # ARABIC SUKUN
diff --git a/src/chrtrans/iso07_uni.tbl b/src/chrtrans/iso07_uni.tbl
new file mode 100644
index 0000000..87372a9
--- /dev/null
+++ b/src/chrtrans/iso07_uni.tbl
@@ -0,0 +1,275 @@
+# This file has been modified for lynx (see README.tables)
+
+#The MIME name of this charset.
+Miso-8859-7
+
+#Name as a Display Charset (used on Options screen)
+OGreek (ISO-8859-7)
+
+#Codepage number
+C813
+
+#
+# Name: ISO 8859-7:2003 to Unicode
+# Unicode version: 4.0
+# Table version: 2.0
+# Table format: Format A
+# Date: 2003-Nov-12
+# Authors: Ken Whistler <kenw@sybase.com>
+#
+# Copyright (c) 1991-2003 Unicode, Inc. All Rights reserved.
+#
+# This file is provided as-is by Unicode, Inc. (The Unicode Consortium).
+# No claims are made as to fitness for any particular purpose. No
+# warranties of any kind are expressed or implied. The recipient
+# agrees to determine applicability of information provided. If this
+# file has been provided on optical media by Unicode, Inc., the sole
+# remedy for any claim will be exchange of defective media within 90
+# days of receipt.
+#
+# Unicode, Inc. hereby grants the right to freely use the information
+# supplied in this file in the creation of products supporting the
+# Unicode Standard, and to make copies of this file in any form for
+# internal or external distribution as long as this notice remains
+# attached.
+#
+# General notes:
+#
+# This table contains the data the Unicode Consortium has on how
+# ISO 8859-7:2003 characters map into Unicode.
+#
+# ISO 8859-7:1987 is equivalent to ISO-IR-126, ELOT 928,
+# and ECMA 118. ISO 8859-7:2003 adds two currency signs
+# and one other character not in the earlier standard.
+#
+# Format: Three tab-separated columns
+# Column #1 is the ISO 8859-7 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in ISO 8859-7 order.
+#
+# Version history
+# 1.0 version updates 0.1 version by adding mappings for all
+# control characters.
+# Remap 0xA1 to U+2018 (instead of 0x02BD) to match text of 8859-7
+# Remap 0xA2 to U+2019 (instead of 0x02BC) to match text of 8859-7
+#
+# 2.0 version updates 1.0 version by adding mappings for the
+# three newly added characters 0xA4, 0xA5, 0xAA.
+#
+# Updated versions of this file may be found in:
+# <http://www.unicode.org/Public/MAPPINGS/>
+#
+# Any comments or problems, contact the Unicode Consortium at:
+# <http://www.unicode.org/reporting.html>
+#
+# Lines with more than one Unicode (U+XXXX) value contain additional
+# replacement mappings added for lynx. - kw
+#
+0x20-0x7e idem
+#
+#0x20 U+0020 # SPACE
+#0x21 U+0021 # EXCLAMATION MARK
+#0x22 U+0022 # QUOTATION MARK
+#0x23 U+0023 # NUMBER SIGN
+#0x24 U+0024 # DOLLAR SIGN
+#0x25 U+0025 # PERCENT SIGN
+#0x26 U+0026 # AMPERSAND
+#0x27 U+0027 # APOSTROPHE
+#0x28 U+0028 # LEFT PARENTHESIS
+#0x29 U+0029 # RIGHT PARENTHESIS
+#0x2A U+002A # ASTERISK
+#0x2B U+002B # PLUS SIGN
+#0x2C U+002C # COMMA
+#0x2D U+002D # HYPHEN-MINUS
+#0x2E U+002E # FULL STOP
+#0x2F U+002F # SOLIDUS
+#0x30 U+0030 # DIGIT ZERO
+#0x31 U+0031 # DIGIT ONE
+#0x32 U+0032 # DIGIT TWO
+#0x33 U+0033 # DIGIT THREE
+#0x34 U+0034 # DIGIT FOUR
+#0x35 U+0035 # DIGIT FIVE
+#0x36 U+0036 # DIGIT SIX
+#0x37 U+0037 # DIGIT SEVEN
+#0x38 U+0038 # DIGIT EIGHT
+#0x39 U+0039 # DIGIT NINE
+#0x3A U+003A # COLON
+#0x3B U+003B # SEMICOLON
+#0x3C U+003C # LESS-THAN SIGN
+#0x3D U+003D # EQUALS SIGN
+#0x3E U+003E # GREATER-THAN SIGN
+#0x3F U+003F # QUESTION MARK
+#0x40 U+0040 # COMMERCIAL AT
+#0x41 U+0041 # LATIN CAPITAL LETTER A
+#0x42 U+0042 # LATIN CAPITAL LETTER B
+#0x43 U+0043 # LATIN CAPITAL LETTER C
+#0x44 U+0044 # LATIN CAPITAL LETTER D
+#0x45 U+0045 # LATIN CAPITAL LETTER E
+#0x46 U+0046 # LATIN CAPITAL LETTER F
+#0x47 U+0047 # LATIN CAPITAL LETTER G
+#0x48 U+0048 # LATIN CAPITAL LETTER H
+#0x49 U+0049 # LATIN CAPITAL LETTER I
+#0x4A U+004A # LATIN CAPITAL LETTER J
+#0x4B U+004B # LATIN CAPITAL LETTER K
+#0x4C U+004C # LATIN CAPITAL LETTER L
+#0x4D U+004D # LATIN CAPITAL LETTER M
+#0x4E U+004E # LATIN CAPITAL LETTER N
+#0x4F U+004F # LATIN CAPITAL LETTER O
+#0x50 U+0050 # LATIN CAPITAL LETTER P
+#0x51 U+0051 # LATIN CAPITAL LETTER Q
+#0x52 U+0052 # LATIN CAPITAL LETTER R
+#0x53 U+0053 # LATIN CAPITAL LETTER S
+#0x54 U+0054 # LATIN CAPITAL LETTER T
+#0x55 U+0055 # LATIN CAPITAL LETTER U
+#0x56 U+0056 # LATIN CAPITAL LETTER V
+#0x57 U+0057 # LATIN CAPITAL LETTER W
+#0x58 U+0058 # LATIN CAPITAL LETTER X
+#0x59 U+0059 # LATIN CAPITAL LETTER Y
+#0x5A U+005A # LATIN CAPITAL LETTER Z
+#0x5B U+005B # LEFT SQUARE BRACKET
+#0x5C U+005C # REVERSE SOLIDUS
+#0x5D U+005D # RIGHT SQUARE BRACKET
+#0x5E U+005E # CIRCUMFLEX ACCENT
+#0x5F U+005F # LOW LINE
+#0x60 U+0060 # GRAVE ACCENT
+#0x61 U+0061 # LATIN SMALL LETTER A
+#0x62 U+0062 # LATIN SMALL LETTER B
+#0x63 U+0063 # LATIN SMALL LETTER C
+#0x64 U+0064 # LATIN SMALL LETTER D
+#0x65 U+0065 # LATIN SMALL LETTER E
+#0x66 U+0066 # LATIN SMALL LETTER F
+#0x67 U+0067 # LATIN SMALL LETTER G
+#0x68 U+0068 # LATIN SMALL LETTER H
+#0x69 U+0069 # LATIN SMALL LETTER I
+#0x6A U+006A # LATIN SMALL LETTER J
+#0x6B U+006B # LATIN SMALL LETTER K
+#0x6C U+006C # LATIN SMALL LETTER L
+#0x6D U+006D # LATIN SMALL LETTER M
+#0x6E U+006E # LATIN SMALL LETTER N
+#0x6F U+006F # LATIN SMALL LETTER O
+#0x70 U+0070 # LATIN SMALL LETTER P
+#0x71 U+0071 # LATIN SMALL LETTER Q
+#0x72 U+0072 # LATIN SMALL LETTER R
+#0x73 U+0073 # LATIN SMALL LETTER S
+#0x74 U+0074 # LATIN SMALL LETTER T
+#0x75 U+0075 # LATIN SMALL LETTER U
+#0x76 U+0076 # LATIN SMALL LETTER V
+#0x77 U+0077 # LATIN SMALL LETTER W
+#0x78 U+0078 # LATIN SMALL LETTER X
+#0x79 U+0079 # LATIN SMALL LETTER Y
+#0x7A U+007A # LATIN SMALL LETTER Z
+#0x7B U+007B # LEFT CURLY BRACKET
+#0x7C U+007C # VERTICAL LINE
+#0x7D U+007D # RIGHT CURLY BRACKET
+#0x7E U+007E # TILDE
+0xA0 U+00A0 # NO-BREAK SPACE
+#
+# The following two changed in ISO 8859:1999
+#
+# Remap 0xA1 to U+2018 (instead of U+02BD)
+# Remap 0xA2 to U+2019 (instead of U+02BC)
+#
+# Keep the old ones as primary for now. Also added old U+037[12]
+# found in existing linux kbd files and in RFC 1345 for compatibility.
+# - kw 1999-10-29
+0xA1 U+02BD U+2018 U+0371 # MODIFIER LETTER REVERSED COMMA
+0xA2 U+02BC U+2019 U+0372 # MODIFIER LETTER APOSTROPHE
+0xA3 U+00A3 # POUND SIGN
+0xA4 U+20AC # EURO SIGN
+0xA5 U+20AF # DRACHMA SIGN
+0xA6 U+00A6 # BROKEN BAR
+0xA7 U+00A7 # SECTION SIGN
+0xA8 U+00A8 # DIAERESIS
+0xA9 U+00A9 # COPYRIGHT SIGN
+0xAA U+037A # GREEK YPOGEGRAMMENI
+0xAB U+00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xAC U+00AC # NOT SIGN
+0xAD U+00AD # SOFT HYPHEN
+0xAF U+2015 # HORIZONTAL BAR
+0xB0 U+00B0 # DEGREE SIGN
+0xB1 U+00B1 # PLUS-MINUS SIGN
+0xB2 U+00B2 # SUPERSCRIPT TWO
+0xB3 U+00B3 # SUPERSCRIPT THREE
+0xB4 U+0384 # GREEK TONOS
+0xB5 U+0385 # GREEK DIALYTIKA TONOS
+0xB6 U+0386 U+1fbb # GREEK CAPITAL LETTER ALPHA WITH TONOS
+0xB7 U+00B7 U+0307 U+0387 U+2027 # MIDDLE DOT
+0xB8 U+0388 U+1fc9 # GREEK CAPITAL LETTER EPSILON WITH TONOS
+0xB9 U+0389 U+1fcb # GREEK CAPITAL LETTER ETA WITH TONOS
+0xBA U+038A U+1fdb # GREEK CAPITAL LETTER IOTA WITH TONOS
+0xBB U+00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xBC U+038C U+1ff9 # GREEK CAPITAL LETTER OMICRON WITH TONOS
+0xBD U+00BD # VULGAR FRACTION ONE HALF
+0xBE U+038E U+1feb # GREEK CAPITAL LETTER UPSILON WITH TONOS
+0xBF U+038F U+1ffb # GREEK CAPITAL LETTER OMEGA WITH TONOS
+0xC0 U+0390 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+0xC1 U+0391 # GREEK CAPITAL LETTER ALPHA
+0xC2 U+0392 # GREEK CAPITAL LETTER BETA
+0xC3 U+0393 U+0413 # GREEK CAPITAL LETTER GAMMA
+0xC4 U+0394 # GREEK CAPITAL LETTER DELTA
+0xC5 U+0395 # GREEK CAPITAL LETTER EPSILON
+0xC6 U+0396 # GREEK CAPITAL LETTER ZETA
+0xC7 U+0397 # GREEK CAPITAL LETTER ETA
+0xC8 U+0398 # GREEK CAPITAL LETTER THETA
+0xC9 U+0399 # GREEK CAPITAL LETTER IOTA
+0xCA U+039A # GREEK CAPITAL LETTER KAPPA
+0xCB U+039B U+041b # GREEK CAPITAL LETTER LAMDA
+0xCC U+039C # GREEK CAPITAL LETTER MU
+0xCD U+039D # GREEK CAPITAL LETTER NU
+0xCE U+039E # GREEK CAPITAL LETTER XI
+0xCF U+039F # GREEK CAPITAL LETTER OMICRON
+0xD0 U+03A0 U+041f # GREEK CAPITAL LETTER PI
+0xD1 U+03A1 # GREEK CAPITAL LETTER RHO
+0xD3 U+03A3 # GREEK CAPITAL LETTER SIGMA
+0xD4 U+03A4 # GREEK CAPITAL LETTER TAU
+0xD5 U+03A5 # GREEK CAPITAL LETTER UPSILON
+0xD6 U+03A6 U+0424 # GREEK CAPITAL LETTER PHI
+0xD7 U+03A7 U+0425 # GREEK CAPITAL LETTER CHI
+0xD8 U+03A8 # GREEK CAPITAL LETTER PSI
+0xD9 U+03A9 # GREEK CAPITAL LETTER OMEGA
+0xDA U+03AA # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
+0xDB U+03AB # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+0xDC U+03AC U+1f71 # GREEK SMALL LETTER ALPHA WITH TONOS
+0xDD U+03AD U+1f73 # GREEK SMALL LETTER EPSILON WITH TONOS
+0xDE U+03AE U+1f75 # GREEK SMALL LETTER ETA WITH TONOS
+0xDF U+03AF U+1f77 # GREEK SMALL LETTER IOTA WITH TONOS
+0xE0 U+03B0 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+0xE1 U+03B1 # GREEK SMALL LETTER ALPHA
+0xE2 U+03B2 # GREEK SMALL LETTER BETA
+0xE3 U+03B3 U+0263 # GREEK SMALL LETTER GAMMA
+0xE4 U+03B4 U+00f0 # GREEK SMALL LETTER DELTA
+0xE5 U+03B5 # GREEK SMALL LETTER EPSILON
+0xE6 U+03B6 # GREEK SMALL LETTER ZETA
+0xE7 U+03B7 # GREEK SMALL LETTER ETA
+0xE8 U+03B8 # GREEK SMALL LETTER THETA
+0xE9 U+03B9 U+0131 # GREEK SMALL LETTER IOTA
+0xEA U+03BA # GREEK SMALL LETTER KAPPA
+0xEB U+03BB # GREEK SMALL LETTER LAMDA
+0xEC U+03BC U+00b5 # GREEK SMALL LETTER MU
+0xED U+03BD # GREEK SMALL LETTER NU
+0xEE U+03BE # GREEK SMALL LETTER XI
+0xEF U+03BF # GREEK SMALL LETTER OMICRON
+0xF0 U+03C0 # GREEK SMALL LETTER PI
+0xF1 U+03C1 # GREEK SMALL LETTER RHO
+0xF2 U+03C2 # GREEK SMALL LETTER FINAL SIGMA
+0xF3 U+03C3 # GREEK SMALL LETTER SIGMA
+0xF4 U+03C4 # GREEK SMALL LETTER TAU
+0xF5 U+03C5 U+028a # GREEK SMALL LETTER UPSILON
+0xF6 U+03C6 # GREEK SMALL LETTER PHI
+0xF7 U+03C7 # GREEK SMALL LETTER CHI
+0xF8 U+03C8 # GREEK SMALL LETTER PSI
+0xF9 U+03C9 # GREEK SMALL LETTER OMEGA
+0xFA U+03CA # GREEK SMALL LETTER IOTA WITH DIALYTIKA
+0xFB U+03CB U+00fc # GREEK SMALL LETTER UPSILON WITH DIALYTIKA
+0xFC U+03CC U+1f79 # GREEK SMALL LETTER OMICRON WITH TONOS
+0xFD U+03CD U+1f7b # GREEK SMALL LETTER UPSILON WITH TONOS
+0xFE U+03CE U+1f7d # GREEK SMALL LETTER OMEGA WITH TONOS
+
+U+2218 " \260 " # RING OPERATOR
+U+2209 " !\345 "
+U+221b " ROOT\263 "
+U+229A "(\260)" # CIRCLED RING OPERATOR
+U+02a4 "d\346"
+U+20af "\304\361\367"
diff --git a/src/chrtrans/iso08_uni.tbl b/src/chrtrans/iso08_uni.tbl
new file mode 100644
index 0000000..d162396
--- /dev/null
+++ b/src/chrtrans/iso08_uni.tbl
@@ -0,0 +1,229 @@
+# This file has been modified for lynx (see README.tables)
+
+#The MIME name of this charset.
+Miso-8859-8
+
+#Name as a Display Charset (used on Options screen).
+OHebrew (ISO-8859-8)
+
+#Codepage number
+C916
+
+#
+# Name: ISO/IEC 8859-8:1999 to Unicode
+# Unicode version: 3.0
+# Table version: 1.1
+# Table format: Format A
+# Date: 2000-Jan-03
+# Authors: Ken Whistler <kenw@sybase.com>
+#
+# Copyright (c) 1991-1999 Unicode, Inc. All Rights reserved.
+#
+# This file is provided as-is by Unicode, Inc. (The Unicode Consortium).
+# No claims are made as to fitness for any particular purpose. No
+# warranties of any kind are expressed or implied. The recipient
+# agrees to determine applicability of information provided. If this
+# file has been provided on optical media by Unicode, Inc., the sole
+# remedy for any claim will be exchange of defective media within 90
+# days of receipt.
+#
+# Unicode, Inc. hereby grants the right to freely use the information
+# supplied in this file in the creation of products supporting the
+# Unicode Standard, and to make copies of this file in any form for
+# internal or external distribution as long as this notice remains
+# attached.
+#
+# General notes:
+#
+# This table contains the data the Unicode Consortium has on how
+# ISO/IEC 8859-8:1999 characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the ISO/IEC 8859-8 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in ISO/IEC 8859-8 order.
+#
+# Version history
+# 1.0 version updates 0.1 version by adding mappings for all
+# control characters.
+# 1.1 version updates to the published 8859-8:1999, correcting
+# the mapping of 0xAF and adding mappings for LRM and RLM.
+#
+# Updated versions of this file may be found in:
+# <ftp://ftp.unicode.org/Public/MAPPINGS/>
+#
+# Any comments or problems, contact <errata@unicode.org>
+# Please note that <errata@unicode.org> is an archival address;
+# notices will be checked, but do not expect an immediate response.
+#
+0x20-0x7e idem
+#
+#0x20 U+0020 # SPACE
+#0x21 U+0021 # EXCLAMATION MARK
+#0x22 U+0022 # QUOTATION MARK
+#0x23 U+0023 # NUMBER SIGN
+#0x24 U+0024 # DOLLAR SIGN
+#0x25 U+0025 # PERCENT SIGN
+#0x26 U+0026 # AMPERSAND
+#0x27 U+0027 # APOSTROPHE
+#0x28 U+0028 # LEFT PARENTHESIS
+#0x29 U+0029 # RIGHT PARENTHESIS
+#0x2A U+002A # ASTERISK
+#0x2B U+002B # PLUS SIGN
+#0x2C U+002C # COMMA
+#0x2D U+002D # HYPHEN-MINUS
+#0x2E U+002E # FULL STOP
+#0x2F U+002F # SOLIDUS
+#0x30 U+0030 # DIGIT ZERO
+#0x31 U+0031 # DIGIT ONE
+#0x32 U+0032 # DIGIT TWO
+#0x33 U+0033 # DIGIT THREE
+#0x34 U+0034 # DIGIT FOUR
+#0x35 U+0035 # DIGIT FIVE
+#0x36 U+0036 # DIGIT SIX
+#0x37 U+0037 # DIGIT SEVEN
+#0x38 U+0038 # DIGIT EIGHT
+#0x39 U+0039 # DIGIT NINE
+#0x3A U+003A # COLON
+#0x3B U+003B # SEMICOLON
+#0x3C U+003C # LESS-THAN SIGN
+#0x3D U+003D # EQUALS SIGN
+#0x3E U+003E # GREATER-THAN SIGN
+#0x3F U+003F # QUESTION MARK
+#0x40 U+0040 # COMMERCIAL AT
+#0x41 U+0041 # LATIN CAPITAL LETTER A
+#0x42 U+0042 # LATIN CAPITAL LETTER B
+#0x43 U+0043 # LATIN CAPITAL LETTER C
+#0x44 U+0044 # LATIN CAPITAL LETTER D
+#0x45 U+0045 # LATIN CAPITAL LETTER E
+#0x46 U+0046 # LATIN CAPITAL LETTER F
+#0x47 U+0047 # LATIN CAPITAL LETTER G
+#0x48 U+0048 # LATIN CAPITAL LETTER H
+#0x49 U+0049 # LATIN CAPITAL LETTER I
+#0x4A U+004A # LATIN CAPITAL LETTER J
+#0x4B U+004B # LATIN CAPITAL LETTER K
+#0x4C U+004C # LATIN CAPITAL LETTER L
+#0x4D U+004D # LATIN CAPITAL LETTER M
+#0x4E U+004E # LATIN CAPITAL LETTER N
+#0x4F U+004F # LATIN CAPITAL LETTER O
+#0x50 U+0050 # LATIN CAPITAL LETTER P
+#0x51 U+0051 # LATIN CAPITAL LETTER Q
+#0x52 U+0052 # LATIN CAPITAL LETTER R
+#0x53 U+0053 # LATIN CAPITAL LETTER S
+#0x54 U+0054 # LATIN CAPITAL LETTER T
+#0x55 U+0055 # LATIN CAPITAL LETTER U
+#0x56 U+0056 # LATIN CAPITAL LETTER V
+#0x57 U+0057 # LATIN CAPITAL LETTER W
+#0x58 U+0058 # LATIN CAPITAL LETTER X
+#0x59 U+0059 # LATIN CAPITAL LETTER Y
+#0x5A U+005A # LATIN CAPITAL LETTER Z
+#0x5B U+005B # LEFT SQUARE BRACKET
+#0x5C U+005C # REVERSE SOLIDUS
+#0x5D U+005D # RIGHT SQUARE BRACKET
+#0x5E U+005E # CIRCUMFLEX ACCENT
+#0x5F U+005F # LOW LINE
+#0x60 U+0060 # GRAVE ACCENT
+#0x61 U+0061 # LATIN SMALL LETTER A
+#0x62 U+0062 # LATIN SMALL LETTER B
+#0x63 U+0063 # LATIN SMALL LETTER C
+#0x64 U+0064 # LATIN SMALL LETTER D
+#0x65 U+0065 # LATIN SMALL LETTER E
+#0x66 U+0066 # LATIN SMALL LETTER F
+#0x67 U+0067 # LATIN SMALL LETTER G
+#0x68 U+0068 # LATIN SMALL LETTER H
+#0x69 U+0069 # LATIN SMALL LETTER I
+#0x6A U+006A # LATIN SMALL LETTER J
+#0x6B U+006B # LATIN SMALL LETTER K
+#0x6C U+006C # LATIN SMALL LETTER L
+#0x6D U+006D # LATIN SMALL LETTER M
+#0x6E U+006E # LATIN SMALL LETTER N
+#0x6F U+006F # LATIN SMALL LETTER O
+#0x70 U+0070 # LATIN SMALL LETTER P
+#0x71 U+0071 # LATIN SMALL LETTER Q
+#0x72 U+0072 # LATIN SMALL LETTER R
+#0x73 U+0073 # LATIN SMALL LETTER S
+#0x74 U+0074 # LATIN SMALL LETTER T
+#0x75 U+0075 # LATIN SMALL LETTER U
+#0x76 U+0076 # LATIN SMALL LETTER V
+#0x77 U+0077 # LATIN SMALL LETTER W
+#0x78 U+0078 # LATIN SMALL LETTER X
+#0x79 U+0079 # LATIN SMALL LETTER Y
+#0x7A U+007A # LATIN SMALL LETTER Z
+#0x7B U+007B # LEFT CURLY BRACKET
+#0x7C U+007C # VERTICAL LINE
+#0x7D U+007D # RIGHT CURLY BRACKET
+#0x7E U+007E # TILDE
+0xA0 U+00A0 # NO-BREAK SPACE
+0xA2 U+00A2 # CENT SIGN
+0xA3 U+00A3 # POUND SIGN
+0xA4 U+00A4 # CURRENCY SIGN
+0xA5 U+00A5 # YEN SIGN
+0xA6 U+00A6 # BROKEN BAR
+0xA7 U+00A7 # SECTION SIGN
+0xA8 U+00A8 # DIAERESIS
+0xA9 U+00A9 # COPYRIGHT SIGN
+0xAA U+00D7 # MULTIPLICATION SIGN
+0xAB U+00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xAC U+00AC # NOT SIGN
+0xAD U+00AD # SOFT HYPHEN
+0xAE U+00AE # REGISTERED SIGN
+0xAF U+00AF # MACRON
+0xB0 U+00B0 # DEGREE SIGN
+0xB1 U+00B1 # PLUS-MINUS SIGN
+0xB2 U+00B2 # SUPERSCRIPT TWO
+0xB3 U+00B3 # SUPERSCRIPT THREE
+0xB4 U+00B4 # ACUTE ACCENT
+0xB5 U+00B5 # MICRO SIGN
+0xB6 U+00B6 # PILCROW SIGN
+0xB7 U+00B7 # MIDDLE DOT
+0xB8 U+00B8 # CEDILLA
+0xB9 U+00B9 # SUPERSCRIPT ONE
+0xBA U+00F7 # DIVISION SIGN
+0xBB U+00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xBC U+00BC # VULGAR FRACTION ONE QUARTER
+0xBD U+00BD # VULGAR FRACTION ONE HALF
+0xBE U+00BE # VULGAR FRACTION THREE QUARTERS
+0xDF U+2017 # DOUBLE LOW LINE
+0xE0 U+05D0 # HEBREW LETTER ALEF
+0xE1 U+05D1 # HEBREW LETTER BET
+0xE2 U+05D2 # HEBREW LETTER GIMEL
+0xE3 U+05D3 # HEBREW LETTER DALET
+0xE4 U+05D4 # HEBREW LETTER HE
+0xE5 U+05D5 # HEBREW LETTER VAV
+0xE6 U+05D6 # HEBREW LETTER ZAYIN
+0xE7 U+05D7 # HEBREW LETTER HET
+0xE8 U+05D8 # HEBREW LETTER TET
+0xE9 U+05D9 # HEBREW LETTER YOD
+0xEA U+05DA # HEBREW LETTER FINAL KAF
+0xEB U+05DB # HEBREW LETTER KAF
+0xEC U+05DC # HEBREW LETTER LAMED
+0xED U+05DD # HEBREW LETTER FINAL MEM
+0xEE U+05DE # HEBREW LETTER MEM
+0xEF U+05DF # HEBREW LETTER FINAL NUN
+0xF0 U+05E0 # HEBREW LETTER NUN
+0xF1 U+05E1 # HEBREW LETTER SAMEKH
+0xF2 U+05E2 # HEBREW LETTER AYIN
+0xF3 U+05E3 # HEBREW LETTER FINAL PE
+0xF4 U+05E4 # HEBREW LETTER PE
+0xF5 U+05E5 # HEBREW LETTER FINAL TSADI
+0xF6 U+05E6 # HEBREW LETTER TSADI
+0xF7 U+05E7 # HEBREW LETTER QOF
+0xF8 U+05E8 # HEBREW LETTER RESH
+0xF9 U+05E9 # HEBREW LETTER SHIN
+0xFA U+05EA # HEBREW LETTER TAV
+0xFD U+200E # LEFT-TO-RIGHT MARK
+0xFE U+200F # RIGHT-TO-LEFT MARK
+
+
+#Hebrew points - map to empty string
+U+05B0-U+05C2:
+
+#HEBREW LETTER DOUBLE VAV #U+05F0:åå
+U+05F0 "\345\345"
+#HEBREW LETTER VAV YOD #U+05F1:éå
+U+05F1 "\351\345"
+#HEBREW LETTER DOUBLE YOD #U+05F2:éé
+U+05F2 "\351\351"
+
diff --git a/src/chrtrans/iso09_uni.tbl b/src/chrtrans/iso09_uni.tbl
new file mode 100644
index 0000000..87afe48
--- /dev/null
+++ b/src/chrtrans/iso09_uni.tbl
@@ -0,0 +1,266 @@
+# This file has been modified for lynx (see README.tables)
+
+#The MIME name of this charset.
+Miso-8859-9
+
+#Name as a Display Charset (used on Options screen)
+OTurkish (ISO-8859-9)
+
+#Codepage number
+C920
+
+#
+# Name: ISO/IEC 8859-9:1999 to Unicode
+# Unicode version: 3.0
+# Table version: 1.0
+# Table format: Format A
+# Date: 1999 July 27
+# Authors: Ken Whistler <kenw@sybase.com>
+#
+# Copyright (c) 1991-1999 Unicode, Inc. All Rights reserved.
+#
+# This file is provided as-is by Unicode, Inc. (The Unicode Consortium).
+# No claims are made as to fitness for any particular purpose. No
+# warranties of any kind are expressed or implied. The recipient
+# agrees to determine applicability of information provided. If this
+# file has been provided on magnetic media by Unicode, Inc., the sole
+# remedy for any claim will be exchange of defective media within 90
+# days of receipt.
+#
+# Unicode, Inc. hereby grants the right to freely use the information
+# supplied in this file in the creation of products supporting the
+# Unicode Standard, and to make copies of this file in any form for
+# internal or external distribution as long as this notice remains
+# attached.
+#
+# General notes:
+#
+# This table contains the data the Unicode Consortium has on how
+# ISO/IEC 8859-9:1999 characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the ISO/IEC 8859-9 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in ISO/IEC 8859-9 order.
+#
+# ISO/IEC 8859-9 is also equivalent to ISO-IR-148.
+#
+# Version history
+# 1.0 version updates 0.1 version by adding mappings for all
+# control characters.
+#
+# Updated versions of this file may be found in:
+# <ftp://ftp.unicode.org/Public/MAPPINGS/>
+#
+# Any comments or problems, contact <errata@unicode.org>
+# Please note that <errata@unicode.org> is an archival address;
+# notices will be checked, but do not expect an immediate response.
+#
+# Lines with more than one Unicode (U+XXXX) value contain additional
+# replacement mappings added for lynx. - kw
+#
+0x20-0x7e idem
+0x49 U+042b
+#
+#0x20 U+0020 # SPACE
+#0x21 U+0021 # EXCLAMATION MARK
+#0x22 U+0022 # QUOTATION MARK
+#0x23 U+0023 # NUMBER SIGN
+#0x24 U+0024 # DOLLAR SIGN
+#0x25 U+0025 # PERCENT SIGN
+#0x26 U+0026 # AMPERSAND
+#0x27 U+0027 # APOSTROPHE
+#0x28 U+0028 # LEFT PARENTHESIS
+#0x29 U+0029 # RIGHT PARENTHESIS
+#0x2A U+002A # ASTERISK
+#0x2B U+002B # PLUS SIGN
+#0x2C U+002C # COMMA
+#0x2D U+002D # HYPHEN-MINUS
+#0x2E U+002E # FULL STOP
+#0x2F U+002F # SOLIDUS
+#0x30 U+0030 # DIGIT ZERO
+#0x31 U+0031 # DIGIT ONE
+#0x32 U+0032 # DIGIT TWO
+#0x33 U+0033 # DIGIT THREE
+#0x34 U+0034 # DIGIT FOUR
+#0x35 U+0035 # DIGIT FIVE
+#0x36 U+0036 # DIGIT SIX
+#0x37 U+0037 # DIGIT SEVEN
+#0x38 U+0038 # DIGIT EIGHT
+#0x39 U+0039 # DIGIT NINE
+#0x3A U+003A # COLON
+#0x3B U+003B # SEMICOLON
+#0x3C U+003C # LESS-THAN SIGN
+#0x3D U+003D # EQUALS SIGN
+#0x3E U+003E # GREATER-THAN SIGN
+#0x3F U+003F # QUESTION MARK
+#0x40 U+0040 # COMMERCIAL AT
+#0x41 U+0041 # LATIN CAPITAL LETTER A
+#0x42 U+0042 # LATIN CAPITAL LETTER B
+#0x43 U+0043 # LATIN CAPITAL LETTER C
+#0x44 U+0044 # LATIN CAPITAL LETTER D
+#0x45 U+0045 # LATIN CAPITAL LETTER E
+#0x46 U+0046 # LATIN CAPITAL LETTER F
+#0x47 U+0047 # LATIN CAPITAL LETTER G
+#0x48 U+0048 # LATIN CAPITAL LETTER H
+#0x49 U+0049 # LATIN CAPITAL LETTER I
+#0x4A U+004A # LATIN CAPITAL LETTER J
+#0x4B U+004B # LATIN CAPITAL LETTER K
+#0x4C U+004C # LATIN CAPITAL LETTER L
+#0x4D U+004D # LATIN CAPITAL LETTER M
+#0x4E U+004E # LATIN CAPITAL LETTER N
+#0x4F U+004F # LATIN CAPITAL LETTER O
+#0x50 U+0050 # LATIN CAPITAL LETTER P
+#0x51 U+0051 # LATIN CAPITAL LETTER Q
+#0x52 U+0052 # LATIN CAPITAL LETTER R
+#0x53 U+0053 # LATIN CAPITAL LETTER S
+#0x54 U+0054 # LATIN CAPITAL LETTER T
+#0x55 U+0055 # LATIN CAPITAL LETTER U
+#0x56 U+0056 # LATIN CAPITAL LETTER V
+#0x57 U+0057 # LATIN CAPITAL LETTER W
+#0x58 U+0058 # LATIN CAPITAL LETTER X
+#0x59 U+0059 # LATIN CAPITAL LETTER Y
+#0x5A U+005A # LATIN CAPITAL LETTER Z
+#0x5B U+005B # LEFT SQUARE BRACKET
+#0x5C U+005C # REVERSE SOLIDUS
+#0x5D U+005D # RIGHT SQUARE BRACKET
+#0x5E U+005E # CIRCUMFLEX ACCENT
+#0x5F U+005F # LOW LINE
+#0x60 U+0060 # GRAVE ACCENT
+#0x61 U+0061 # LATIN SMALL LETTER A
+#0x62 U+0062 # LATIN SMALL LETTER B
+#0x63 U+0063 # LATIN SMALL LETTER C
+#0x64 U+0064 # LATIN SMALL LETTER D
+#0x65 U+0065 # LATIN SMALL LETTER E
+#0x66 U+0066 # LATIN SMALL LETTER F
+#0x67 U+0067 # LATIN SMALL LETTER G
+#0x68 U+0068 # LATIN SMALL LETTER H
+#0x69 U+0069 # LATIN SMALL LETTER I
+#0x6A U+006A # LATIN SMALL LETTER J
+#0x6B U+006B # LATIN SMALL LETTER K
+#0x6C U+006C # LATIN SMALL LETTER L
+#0x6D U+006D # LATIN SMALL LETTER M
+#0x6E U+006E # LATIN SMALL LETTER N
+#0x6F U+006F # LATIN SMALL LETTER O
+#0x70 U+0070 # LATIN SMALL LETTER P
+#0x71 U+0071 # LATIN SMALL LETTER Q
+#0x72 U+0072 # LATIN SMALL LETTER R
+#0x73 U+0073 # LATIN SMALL LETTER S
+#0x74 U+0074 # LATIN SMALL LETTER T
+#0x75 U+0075 # LATIN SMALL LETTER U
+#0x76 U+0076 # LATIN SMALL LETTER V
+#0x77 U+0077 # LATIN SMALL LETTER W
+#0x78 U+0078 # LATIN SMALL LETTER X
+#0x79 U+0079 # LATIN SMALL LETTER Y
+#0x7A U+007A # LATIN SMALL LETTER Z
+#0x7B U+007B # LEFT CURLY BRACKET
+#0x7C U+007C # VERTICAL LINE
+#0x7D U+007D # RIGHT CURLY BRACKET
+#0x7E U+007E # TILDE
+0xA0 U+00A0 # NO-BREAK SPACE
+0xA1 U+00A1 # INVERTED EXCLAMATION MARK
+0xA2 U+00A2 # CENT SIGN
+0xA3 U+00A3 # POUND SIGN
+0xA4 U+00A4 # CURRENCY SIGN
+0xA5 U+00A5 # YEN SIGN
+0xA6 U+00A6 # BROKEN BAR
+0xA7 U+00A7 # SECTION SIGN
+0xA8 U+00A8 U+0308 # DIAERESIS
+0xA9 U+00A9 # COPYRIGHT SIGN
+0xAA U+00AA # FEMININE ORDINAL INDICATOR
+0xAB U+00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xAC U+00AC # NOT SIGN
+0xAD U+00AD # SOFT HYPHEN
+0xAE U+00AE # REGISTERED SIGN
+0xAF U+00AF U+0304 # MACRON
+0xB0 U+00B0 U+030a # DEGREE SIGN
+0xB1 U+00B1 # PLUS-MINUS SIGN
+0xB2 U+00B2 # SUPERSCRIPT TWO
+0xB3 U+00B3 # SUPERSCRIPT THREE
+0xB4 U+00B4 # ACUTE ACCENT
+0xB5 U+00B5 U+03bc # MICRO SIGN
+0xB6 U+00B6 # PILCROW SIGN
+0xB7 U+00B7 U+0307 U+0387 # MIDDLE DOT
+0xB8 U+00B8 U+0327 # CEDILLA
+0xB9 U+00B9 # SUPERSCRIPT ONE
+0xBA U+00BA # MASCULINE ORDINAL INDICATOR
+0xBB U+00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xBC U+00BC # VULGAR FRACTION ONE QUARTER
+0xBD U+00BD # VULGAR FRACTION ONE HALF
+0xBE U+00BE # VULGAR FRACTION THREE QUARTERS
+0xBF U+00BF # INVERTED QUESTION MARK
+0xC0 U+00C0 # LATIN CAPITAL LETTER A WITH GRAVE
+0xC1 U+00C1 # LATIN CAPITAL LETTER A WITH ACUTE
+0xC2 U+00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0xC3 U+00C3 # LATIN CAPITAL LETTER A WITH TILDE
+0xC4 U+00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS
+0xC5 U+00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE
+0xC6 U+00C6 # LATIN CAPITAL LETTER AE
+0xC7 U+00C7 # LATIN CAPITAL LETTER C WITH CEDILLA
+0xC8 U+00C8 # LATIN CAPITAL LETTER E WITH GRAVE
+0xC9 U+00C9 # LATIN CAPITAL LETTER E WITH ACUTE
+0xCA U+00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+0xCB U+00CB # LATIN CAPITAL LETTER E WITH DIAERESIS
+0xCC U+00CC # LATIN CAPITAL LETTER I WITH GRAVE
+0xCD U+00CD # LATIN CAPITAL LETTER I WITH ACUTE
+0xCE U+00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0xCF U+00CF # LATIN CAPITAL LETTER I WITH DIAERESIS
+0xD0 U+011E # LATIN CAPITAL LETTER G WITH BREVE
+0xD1 U+00D1 # LATIN CAPITAL LETTER N WITH TILDE
+0xD2 U+00D2 # LATIN CAPITAL LETTER O WITH GRAVE
+0xD3 U+00D3 # LATIN CAPITAL LETTER O WITH ACUTE
+0xD4 U+00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0xD5 U+00D5 # LATIN CAPITAL LETTER O WITH TILDE
+0xD6 U+00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS
+0xD7 U+00D7 # MULTIPLICATION SIGN
+0xD8 U+00D8 # LATIN CAPITAL LETTER O WITH STROKE
+0xD9 U+00D9 # LATIN CAPITAL LETTER U WITH GRAVE
+0xDA U+00DA # LATIN CAPITAL LETTER U WITH ACUTE
+0xDB U+00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+0xDC U+00DC # LATIN CAPITAL LETTER U WITH DIAERESIS
+0xDD U+0130 U+0418 U+0406 # LATIN CAPITAL LETTER I WITH DOT ABOVE
+0xDE U+015E U+0428 # LATIN CAPITAL LETTER S WITH CEDILLA
+0xDF U+00DF # LATIN SMALL LETTER SHARP S
+0xE0 U+00E0 # LATIN SMALL LETTER A WITH GRAVE
+0xE1 U+00E1 # LATIN SMALL LETTER A WITH ACUTE
+0xE2 U+00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX
+0xE3 U+00E3 # LATIN SMALL LETTER A WITH TILDE
+0xE4 U+00E4 # LATIN SMALL LETTER A WITH DIAERESIS
+0xE5 U+00E5 # LATIN SMALL LETTER A WITH RING ABOVE
+0xE6 U+00E6 # LATIN SMALL LETTER AE
+0xE7 U+00E7 # LATIN SMALL LETTER C WITH CEDILLA
+0xE8 U+00E8 # LATIN SMALL LETTER E WITH GRAVE
+0xE9 U+00E9 # LATIN SMALL LETTER E WITH ACUTE
+0xEA U+00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX
+0xEB U+00EB # LATIN SMALL LETTER E WITH DIAERESIS
+0xEC U+00EC # LATIN SMALL LETTER I WITH GRAVE
+0xED U+00ED # LATIN SMALL LETTER I WITH ACUTE
+0xEE U+00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX
+0xEF U+00EF # LATIN SMALL LETTER I WITH DIAERESIS
+0xF0 U+011F # LATIN SMALL LETTER G WITH BREVE
+0xF1 U+00F1 # LATIN SMALL LETTER N WITH TILDE
+0xF2 U+00F2 # LATIN SMALL LETTER O WITH GRAVE
+0xF3 U+00F3 # LATIN SMALL LETTER O WITH ACUTE
+0xF4 U+00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX
+0xF5 U+00F5 # LATIN SMALL LETTER O WITH TILDE
+0xF6 U+00F6 # LATIN SMALL LETTER O WITH DIAERESIS
+0xF7 U+00F7 # DIVISION SIGN
+0xF8 U+00F8 # LATIN SMALL LETTER O WITH STROKE
+0xF9 U+00F9 # LATIN SMALL LETTER U WITH GRAVE
+0xFA U+00FA # LATIN SMALL LETTER U WITH ACUTE
+0xFB U+00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX
+0xFC U+00FC # LATIN SMALL LETTER U WITH DIAERESIS
+0xFD U+0131 U+03b9 U+044b # LATIN SMALL LETTER DOTLESS I
+0xFE U+015F U+0448 # LATIN SMALL LETTER S WITH CEDILLA
+0xFF U+00FF # LATIN SMALL LETTER Y WITH DIAERESIS
+
+U+2218 " \260 " # RING OPERATOR
+U+221b " ROOT\263 "
+U+2297 "(\327)" # CIRCLED TIMES
+U+2299 "(\267)" # CIRCLED DOT OPERATOR
+U+229A "(\260)" # CIRCLED RING OPERATOR
+U+22A0 "[\327]" # SQUARED TIMES
+U+22A1 "[\267]" # SQUARED DOT OPERATOR
+U+22C5 " \267 " # DOT OPERATOR
diff --git a/src/chrtrans/iso10_uni.tbl b/src/chrtrans/iso10_uni.tbl
new file mode 100644
index 0000000..edd59e2
--- /dev/null
+++ b/src/chrtrans/iso10_uni.tbl
@@ -0,0 +1,153 @@
+#
+# Unicode mapping table for the fonts iso10.*
+# [use: unicode_start iso10.f16 iso10]
+#
+#This is not default font!
+D0
+
+#The MIME name of this charset.
+
+Miso-8859-10
+
+#Name as a Display Charset (used on Options screen)
+ONorth European (ISO-8859-10)
+
+# Name: ISO 8859-10 Latin 6 (1998) to Unicode
+# Date: 2005-12-15
+# Authors: Thomas E Dickey from
+# http://czyborra.com/charsets/iso8859.html
+# (ISO 8859 Alphabet Soup)
+
+0x20-0x7e idem
+
+0xA0 U+00A0 # NO-BREAK SPACE
+0xA1 U+0104 # LATIN CAPITAL LETTER A WITH OGONEK
+0xA2 U+0112 # LATIN CAPITAL LETTER E WITH MACRON
+0xA3 U+0122 # LATIN CAPITAL LETTER G WITH CEDILLA
+0xA4 U+012A # LATIN CAPITAL LETTER I WITH MACRON
+0xA5 U+0128 # LATIN CAPITAL LETTER I WITH TILDE
+0xA6 U+0136 # LATIN CAPITAL LETTER K WITH CEDILLA
+0xA7 U+00A7 # SECTION SIGN
+0xA8 U+013B # LATIN CAPITAL LETTER L WITH CEDILLA
+0xA9 U+0110 # LATIN CAPITAL LETTER D WITH STROKE
+0xAA U+0160 # LATIN CAPITAL LETTER S WITH CARON
+0xAB U+0166 # LATIN CAPITAL LETTER T WITH STROKE
+0xAC U+017D # LATIN CAPITAL LETTER Z WITH CARON
+0xAD U+00AD # SOFT HYPHEN
+0xAE U+016A # LATIN CAPITAL LETTER U WITH MACRON
+0xAF U+014A # LATIN CAPITAL LETTER ENG
+0xB0 U+00B0 # DEGREE SIGN
+0xB1 U+0105 # LATIN SMALL LETTER A WITH OGONEK
+0xB2 U+0113 # LATIN SMALL LETTER E WITH MACRON
+0xB3 U+0123 # LATIN SMALL LETTER G WITH CEDILLA
+0xB4 U+012B # LATIN SMALL LETTER I WITH MACRON
+0xB5 U+0129 # LATIN SMALL LETTER I WITH TILDE
+0xB6 U+0137 # LATIN SMALL LETTER K WITH CEDILLA
+0xB7 U+00B7 # MIDDLE DOT
+0xB8 U+013C # LATIN SMALL LETTER L WITH CEDILLA
+0xB9 U+0111 # LATIN SMALL LETTER D WITH STROKE
+0xBA U+0161 # LATIN SMALL LETTER S WITH CARON
+0xBB U+0167 # LATIN SMALL LETTER T WITH STROKE
+0xBC U+017E # LATIN SMALL LETTER Z WITH CARON
+0xBD U+2015 # HORIZONTAL BAR
+0xBE U+016B # LATIN SMALL LETTER U WITH MACRON
+0xBF U+014B # LATIN SMALL LETTER ENG
+0xC0 U+0100 # LATIN CAPITAL LETTER A WITH MACRON
+
+0xC1-0xC6 idem
+
+#0xC1 U+00C1 # LATIN CAPITAL LETTER A WITH ACUTE
+#0xC2 U+00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+#0xC3 U+00C3 # LATIN CAPITAL LETTER A WITH TILDE
+#0xC4 U+00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS
+#0xC5 U+00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE
+#0xC6 U+00C6 # LATIN CAPITAL LETTER AE
+
+0xC7 U+012E # LATIN CAPITAL LETTER I WITH OGONEK
+0xC8 U+010C # LATIN CAPITAL LETTER C WITH CARON
+0xC9 U+00C9 # LATIN CAPITAL LETTER E WITH ACUTE
+0xCA U+0118 # LATIN CAPITAL LETTER E WITH OGONEK
+0xCB U+00CB # LATIN CAPITAL LETTER E WITH DIAERESIS
+0xCC U+0116 # LATIN CAPITAL LETTER E WITH DOT ABOVE
+
+0xCD-0xD0 idem
+
+#0xCD U+00CD # LATIN CAPITAL LETTER I WITH ACUTE
+#0xCE U+00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+#0xCF U+00CF # LATIN CAPITAL LETTER I WITH DIAERESIS
+#0xD0 U+00D0 # LATIN CAPITAL LETTER ETH
+
+0xD1 U+0145 # LATIN CAPITAL LETTER N WITH CEDILLA
+0xD2 U+014C # LATIN CAPITAL LETTER O WITH MACRON
+
+0xD3-0xD6 idem
+
+#0xD3 U+00D3 # LATIN CAPITAL LETTER O WITH ACUTE
+#0xD4 U+00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+#0xD5 U+00D5 # LATIN CAPITAL LETTER O WITH TILDE
+#0xD6 U+00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS
+
+0xD7 U+0168 # LATIN CAPITAL LETTER U WITH TILDE
+0xD8 U+00D8 # LATIN CAPITAL LETTER O WITH STROKE
+0xD9 U+0172 # LATIN CAPITAL LETTER U WITH OGONEK
+
+0xDA-0xDE idem
+
+#0xDA U+00DA # LATIN CAPITAL LETTER U WITH ACUTE
+#0xDB U+00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+#0xDC U+00DC # LATIN CAPITAL LETTER U WITH DIAERESIS
+#0xDD U+00DD # LATIN CAPITAL LETTER Y WITH ACUTE
+#0xDE U+00DE # LATIN CAPITAL LETTER THORN
+
+0xDf U+00DF # LATIN SMALL LETTER SHARP S
+0xE0 U+0101 # LATIN SMALL LETTER A WITH MACRON
+
+0xE1-0xE6 idem
+
+#0xE1 U+00E1 # LATIN SMALL LETTER A WITH ACUTE
+#0xE2 U+00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX
+#0xE3 U+00E3 # LATIN SMALL LETTER A WITH TILDE
+#0xE4 U+00E4 # LATIN SMALL LETTER A WITH DIAERESIS
+#0xE5 U+00E5 # LATIN SMALL LETTER A WITH RING ABOVE
+#0xE6 U+00E6 # LATIN SMALL LETTER AE
+
+0xE7 U+012F # LATIN SMALL LETTER I WITH OGONEK
+0xE8 U+010D # LATIN SMALL LETTER C WITH CARON
+0xE9 U+00E9 # LATIN SMALL LETTER E WITH ACUTE
+0xEA U+0119 # LATIN SMALL LETTER E WITH OGONEK
+0xEB U+00EB # LATIN SMALL LETTER E WITH DIAERESIS
+0xEC U+0117 # LATIN SMALL LETTER E WITH DOT ABOVE
+
+0xED-0xF0 idem
+
+#0xED U+00ED # LATIN SMALL LETTER I WITH ACUTE
+#0xEE U+00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX
+#0xEF U+00EF # LATIN SMALL LETTER I WITH DIAERESIS
+#0xF0 U+00f0 # LATIN SMALL LETTER ETH
+
+0xF1 U+0146 # LATIN SMALL LETTER N WITH CEDILLA
+0xF2 U+014D # LATIN SMALL LETTER O WITH MACRON
+
+0xF3-0xF6 idem
+
+#0xF3 U+00F3 # LATIN SMALL LETTER O WITH ACUTE
+#0xF4 U+00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX
+#0xF5 U+00F5 # LATIN SMALL LETTER O WITH TILDE
+#0xF6 U+00F6 # LATIN SMALL LETTER O WITH DIAERESIS
+
+0xF7 U+0169 # LATIN SMALL LETTER U WITH TILDE
+0xF8 U+00F8 # LATIN SMALL LETTER O WITH STROKE
+0xF9 U+0173 # LATIN SMALL LETTER U WITH OGONEK
+
+0xFA-0xFE idem
+
+#0xFA U+00FA # LATIN SMALL LETTER U WITH ACUTE
+#0xFB U+00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX
+#0xFC U+00FC # LATIN SMALL LETTER U WITH DIAERESIS
+#0xFD U+00FD # LATIN SMALL LETTER Y WITH ACUTE
+#0xFE U+00FE # LATIN SMALL LETTER THORN
+
+0xFF U+0138 # LATIN SMALL LETTER KRA
+
+# TRADE MARK SIGN:
+U+2122:(TM)
diff --git a/src/chrtrans/iso13_uni.tbl b/src/chrtrans/iso13_uni.tbl
new file mode 100644
index 0000000..33e3b8f
--- /dev/null
+++ b/src/chrtrans/iso13_uni.tbl
@@ -0,0 +1,114 @@
+# The MIME name of this charset.
+Miso-8859-13
+
+# Name as a Display Charset (used on Options screen)
+OBaltic Rim (ISO-8859-13)
+
+# This is not the default font!
+D0
+
+#
+# Name: ISO 8859-13 Latin 7 (1998) to Unicode
+# Date: 2005-12-15
+# Authors: Thomas E Dickey from
+# http://czyborra.com/charsets/iso8859.html
+# (ISO 8859 Alphabet Soup)
+
+0x20-0x7E idem # ASCII
+
+0xA0 U+00A0 # NO-BREAK SPACE
+0xA1 U+201D # RIGHT DOUBLE QUOTATION MARK
+0xA2 U+00A2 # CENT SIGN
+0xA3 U+00A3 # POUND SIGN
+0xA4 U+00A4 # CURRENCY SIGN
+0xA5 U+201E # DOUBLE LOW-9 QUOTATION MARK
+0xA6 U+00A6 # BROKEN BAR
+0xA7 U+00A7 # SECTION SIGN
+0xA8 U+00D8 # LATIN CAPITAL LETTER O WITH STROKE
+0xA9 U+00A9 # COPYRIGHT SIGN
+0xAA U+0156 # LATIN CAPITAL LETTER R WITH CEDILLA
+0xAB U+00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xAC U+00AC # NOT SIGN
+0xAD U+00AD # SOFT HYPHEN
+0xAE U+00AE # REGISTERED SIGN
+0xAF U+00C6 # LATIN CAPITAL LETTER AE
+0xB0 U+00B0 # DEGREE SIGN
+0xB1 U+00B1 # PLUS-MINUS SIGN
+0xB2 U+00B2 # SUPERSCRIPT TWO
+0xB3 U+00B3 # SUPERSCRIPT THREE
+0xB4 U+201C # LEFT DOUBLE QUOTATION MARK
+0xB5 U+00B5 # MICRO SIGN
+0xB6 U+00B6 # PILCROW SIGN
+0xB7 U+00B7 # MIDDLE DOT
+0xB8 U+00F8 # LATIN SMALL LETTER O WITH STROKE
+0xB9 U+00B9 # SUPERSCRIPT ONE
+0xBA U+0157 # LATIN SMALL LETTER R WITH CEDILLA
+0xBB U+00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xBC U+00BC # VULGAR FRACTION ONE QUARTER
+0xBD U+00BD # VULGAR FRACTION ONE HALF
+0xBE U+00BE # VULGAR FRACTION THREE QUARTERS
+0xBF U+00E6 # LATIN SMALL LETTER AE
+0xC0 U+0104 # LATIN CAPITAL LETTER A WITH OGONEK
+0xC1 U+012E # LATIN CAPITAL LETTER I WITH OGONEK
+0xC2 U+0100 # LATIN CAPITAL LETTER A WITH MACRON
+0xC3 U+0106 # LATIN CAPITAL LETTER C WITH ACUTE
+0xC4 U+00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS
+0xC5 U+00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE
+0xC6 U+0118 # LATIN CAPITAL LETTER E WITH OGONEK
+0xC7 U+0112 # LATIN CAPITAL LETTER E WITH MACRON
+0xC8 U+010C # LATIN CAPITAL LETTER C WITH CARON
+0xC9 U+00C9 # LATIN CAPITAL LETTER E WITH ACUTE
+0xCA U+0179 # LATIN CAPITAL LETTER Z WITH ACUTE
+0xCB U+0116 # LATIN CAPITAL LETTER E WITH DOT ABOVE
+0xCC U+0122 # LATIN CAPITAL LETTER G WITH CEDILLA
+0xCD U+0136 # LATIN CAPITAL LETTER K WITH CEDILLA
+0xCE U+012A # LATIN CAPITAL LETTER I WITH MACRON
+0xCF U+013B # LATIN CAPITAL LETTER L WITH CEDILLA
+0xD0 U+0160 # LATIN CAPITAL LETTER S WITH CARON
+0xD1 U+0143 # LATIN CAPITAL LETTER N WITH ACUTE
+0xD2 U+0145 # LATIN CAPITAL LETTER N WITH CEDILLA
+0xD3 U+00D3 # LATIN CAPITAL LETTER O WITH ACUTE
+0xD4 U+014C # LATIN CAPITAL LETTER O WITH MACRON
+0xD5 U+00D5 # LATIN CAPITAL LETTER O WITH TILDE
+0xD6 U+00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS
+0xD7 U+00D7 # MULTIPLICATION SIGN
+0xD8 U+0172 # LATIN CAPITAL LETTER U WITH OGONEK
+0xD9 U+0141 # LATIN CAPITAL LETTER L WITH STROKE
+0xDA U+015A # LATIN CAPITAL LETTER S WITH ACUTE
+0xDB U+016A # LATIN CAPITAL LETTER U WITH MACRON
+0xDC U+00DC # LATIN CAPITAL LETTER U WITH DIAERESIS
+0xDD U+017B # LATIN CAPITAL LETTER Z WITH DOT ABOVE
+0xDE U+017D # LATIN CAPITAL LETTER Z WITH CARON
+0xDF U+00DF # LATIN SMALL LETTER SHARP S (German)
+0xE0 U+0105 # LATIN SMALL LETTER A WITH OGONEK
+0xE1 U+012F # LATIN SMALL LETTER I WITH OGONEK
+0xE2 U+0101 # LATIN SMALL LETTER A WITH MACRON
+0xE3 U+0107 # LATIN SMALL LETTER C WITH ACUTE
+0xE4 U+00E4 # LATIN SMALL LETTER A WITH DIAERESIS
+0xE5 U+00E5 # LATIN SMALL LETTER A WITH RING ABOVE
+0xE6 U+0119 # LATIN SMALL LETTER E WITH OGONEK
+0xE7 U+0113 # LATIN SMALL LETTER E WITH MACRON
+0xE8 U+010D # LATIN SMALL LETTER C WITH CARON
+0xE9 U+00E9 # LATIN SMALL LETTER E WITH ACUTE
+0xEA U+017A # LATIN SMALL LETTER Z WITH ACUTE
+0xEB U+0117 # LATIN SMALL LETTER E WITH DOT ABOVE
+0xEC U+0123 # LATIN SMALL LETTER G WITH CEDILLA
+0xED U+0137 # LATIN SMALL LETTER K WITH CEDILLA
+0xEE U+012B # LATIN SMALL LETTER I WITH MACRON
+0xEF U+013C # LATIN SMALL LETTER L WITH CEDILLA
+0xF0 U+0161 # LATIN SMALL LETTER S WITH CARON
+0xF1 U+0144 # LATIN SMALL LETTER N WITH ACUTE
+0xF2 U+0146 # LATIN SMALL LETTER N WITH CEDILLA
+0xF3 U+00F3 # LATIN SMALL LETTER O WITH ACUTE
+0xF4 U+014D # LATIN SMALL LETTER O WITH MACRON
+0xF5 U+00F5 # LATIN SMALL LETTER O WITH TILDE
+0xF6 U+00F6 # LATIN SMALL LETTER O WITH DIAERESIS
+0xF7 U+00F7 # DIVISION SIGN
+0xF8 U+0173 # LATIN SMALL LETTER U WITH OGONEK
+0xF9 U+0142 # LATIN SMALL LETTER L WITH STROKE
+0xFA U+015B # LATIN SMALL LETTER S WITH ACUTE
+0xFB U+016B # LATIN SMALL LETTER U WITH MACRON
+0xFC U+00FC # LATIN SMALL LETTER U WITH DIAERESIS
+0xFD U+017C # LATIN SMALL LETTER Z WITH DOT ABOVE
+0xFE U+017E # LATIN SMALL LETTER Z WITH CARON
+0xFF U+2019 # RIGHT SINGLE QUOTATION MARK
diff --git a/src/chrtrans/iso14_uni.tbl b/src/chrtrans/iso14_uni.tbl
new file mode 100644
index 0000000..630a946
--- /dev/null
+++ b/src/chrtrans/iso14_uni.tbl
@@ -0,0 +1,114 @@
+# The MIME name of this charset.
+Miso-8859-14
+
+# Name as a Display Charset (used on Options screen)
+OCeltic (ISO-8859-14)
+
+# This is not the default font!
+D0
+
+#
+# Name: ISO 8859-13 Latin 8 (1998) to Unicode
+# Date: 2005-12-15
+# Authors: Thomas E Dickey from
+# http://czyborra.com/charsets/iso8859.html
+# (ISO 8859 Alphabet Soup)
+
+0x20-0x7E idem # ASCII
+
+0xA0 U+00A0 # NO-BREAK SPACE
+0xA1 U+1E02 # LATIN CAPITAL LETTER B WITH DOT ABOVE
+0xA2 U+1E03 # LATIN SMALL LETTER B WITH DOT ABOVE
+0xA3 U+00A3 # POUND SIGN
+0xA4 U+010A # LATIN CAPITAL LETTER C WITH DOT ABOVE
+0xA5 U+010B # LATIN SMALL LETTER C WITH DOT ABOVE
+0xA6 U+1E0A # LATIN CAPITAL LETTER D WITH DOT ABOVE
+0xA7 U+00A7 # SECTION SIGN
+0xA8 U+1E80 # LATIN CAPITAL LETTER W WITH GRAVE
+0xA9 U+00A9 # COPYRIGHT SIGN
+0xAA U+1E82 # LATIN CAPITAL LETTER W WITH ACUTE
+0xAB U+1E0B # LATIN SMALL LETTER D WITH DOT ABOVE
+0xAC U+1EF2 # LATIN CAPITAL LETTER Y WITH GRAVE
+0xAD U+00AD # SOFT HYPHEN
+0xAE U+00AE # REGISTERED SIGN
+0xAF U+0178 # LATIN CAPITAL LETTER Y WITH DIAERESIS
+0xB0 U+1E1E # LATIN CAPITAL LETTER F WITH DOT ABOVE
+0xB1 U+1E1F # LATIN SMALL LETTER F WITH DOT ABOVE
+0xB2 U+0120 # LATIN CAPITAL LETTER G WITH DOT ABOVE
+0xB3 U+0121 # LATIN SMALL LETTER G WITH DOT ABOVE
+0xB4 U+1E40 # LATIN CAPITAL LETTER M WITH DOT ABOVE
+0xB5 U+1E41 # LATIN SMALL LETTER M WITH DOT ABOVE
+0xB6 U+00B6 # PILCROW SIGN
+0xB7 U+1E56 # LATIN CAPITAL LETTER P WITH DOT ABOVE
+0xB8 U+1E81 # LATIN SMALL LETTER W WITH GRAVE
+0xB9 U+1E57 # LATIN SMALL LETTER P WITH DOT ABOVE
+0xBA U+1E83 # LATIN SMALL LETTER W WITH ACUTE
+0xBB U+1E60 # LATIN CAPITAL LETTER S WITH DOT ABOVE
+0xBC U+1EF3 # LATIN SMALL LETTER Y WITH GRAVE
+0xBD U+1E84 # LATIN CAPITAL LETTER W WITH DIAERESIS
+0xBE U+1E85 # LATIN SMALL LETTER W WITH DIAERESIS
+0xBF U+1E61 # LATIN SMALL LETTER S WITH DOT ABOVE
+0xC0 U+00C0 # LATIN CAPITAL LETTER A WITH GRAVE
+0xC1 U+00C1 # LATIN CAPITAL LETTER A WITH ACUTE
+0xC2 U+00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0xC3 U+00C3 # LATIN CAPITAL LETTER A WITH TILDE
+0xC4 U+00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS
+0xC5 U+00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE
+0xC6 U+00C6 # LATIN CAPITAL LETTER AE
+0xC7 U+00C7 # LATIN CAPITAL LETTER C WITH CEDILLA
+0xC8 U+00C8 # LATIN CAPITAL LETTER E WITH GRAVE
+0xC9 U+00C9 # LATIN CAPITAL LETTER E WITH ACUTE
+0xCA U+00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+0xCB U+00CB # LATIN CAPITAL LETTER E WITH DIAERESIS
+0xCC U+00CC # LATIN CAPITAL LETTER I WITH GRAVE
+0xCD U+00CD # LATIN CAPITAL LETTER I WITH ACUTE
+0xCE U+00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0xCF U+00CF # LATIN CAPITAL LETTER I WITH DIAERESIS
+0xD0 U+0174 # LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+0xD1 U+00D1 # LATIN CAPITAL LETTER N WITH TILDE
+0xD2 U+00D2 # LATIN CAPITAL LETTER O WITH GRAVE
+0xD3 U+00D3 # LATIN CAPITAL LETTER O WITH ACUTE
+0xD4 U+00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0xD5 U+00D5 # LATIN CAPITAL LETTER O WITH TILDE
+0xD6 U+00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS
+0xD7 U+1E6A # LATIN CAPITAL LETTER T WITH DOT ABOVE
+0xD8 U+00D8 # LATIN CAPITAL LETTER O WITH STROKE
+0xD9 U+00D9 # LATIN CAPITAL LETTER U WITH GRAVE
+0xDA U+00DA # LATIN CAPITAL LETTER U WITH ACUTE
+0xDB U+00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+0xDC U+00DC # LATIN CAPITAL LETTER U WITH DIAERESIS
+0xDD U+00DD # LATIN CAPITAL LETTER Y WITH ACUTE
+0xDE U+0176 # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+0xDF U+00DF # LATIN SMALL LETTER SHARP S
+0xE0 U+00E0 # LATIN SMALL LETTER A WITH GRAVE
+0xE1 U+00E1 # LATIN SMALL LETTER A WITH ACUTE
+0xE2 U+00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX
+0xE3 U+00E3 # LATIN SMALL LETTER A WITH TILDE
+0xE4 U+00E4 # LATIN SMALL LETTER A WITH DIAERESIS
+0xE5 U+00E5 # LATIN SMALL LETTER A WITH RING ABOVE
+0xE6 U+00E6 # LATIN SMALL LETTER AE
+0xE7 U+00E7 # LATIN SMALL LETTER C WITH CEDILLA
+0xE8 U+00E8 # LATIN SMALL LETTER E WITH GRAVE
+0xE9 U+00E9 # LATIN SMALL LETTER E WITH ACUTE
+0xEA U+00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX
+0xEB U+00EB # LATIN SMALL LETTER E WITH DIAERESIS
+0xEC U+00EC # LATIN SMALL LETTER I WITH GRAVE
+0xED U+00ED # LATIN SMALL LETTER I WITH ACUTE
+0xEE U+00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX
+0xEF U+00EF # LATIN SMALL LETTER I WITH DIAERESIS
+0xF0 U+0175 # LATIN SMALL LETTER W WITH CIRCUMFLEX
+0xF1 U+00F1 # LATIN SMALL LETTER N WITH TILDE
+0xF2 U+00F2 # LATIN SMALL LETTER O WITH GRAVE
+0xF3 U+00F3 # LATIN SMALL LETTER O WITH ACUTE
+0xF4 U+00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX
+0xF5 U+00F5 # LATIN SMALL LETTER O WITH TILDE
+0xF6 U+00F6 # LATIN SMALL LETTER O WITH DIAERESIS
+0xF7 U+1E6B # LATIN SMALL LETTER T WITH DOT ABOVE
+0xF8 U+00F8 # LATIN SMALL LETTER O WITH STROKE
+0xF9 U+00F9 # LATIN SMALL LETTER U WITH GRAVE
+0xFA U+00FA # LATIN SMALL LETTER U WITH ACUTE
+0xFB U+00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX
+0xFC U+00FC # LATIN SMALL LETTER U WITH DIAERESIS
+0xFD U+00FD # LATIN SMALL LETTER Y WITH ACUTE
+0xFE U+0177 # LATIN SMALL LETTER Y WITH CIRCUMFLEX
+0xFF U+00FF # LATIN SMALL LETTER Y WITH DIAERESIS
diff --git a/src/chrtrans/iso15_uni.tbl b/src/chrtrans/iso15_uni.tbl
new file mode 100644
index 0000000..398affd
--- /dev/null
+++ b/src/chrtrans/iso15_uni.tbl
@@ -0,0 +1,216 @@
+# The MIME name of this charset.
+Miso-8859-15
+
+# Name as a Display Charset (used on Options screen)
+OWestern (ISO-8859-15)
+
+# This is not the default font!
+D0
+
+#Codepage number
+#?
+
+#
+# Name: ISO 8859-15 Latin 9 (1998) to Unicode
+# Date: 1999-01-01
+# Authors: Christian "naddy" Weisgerber <naddy@mips.rhein-neckar.de>
+#
+# Remarks: Latin 9 is identical to Latin 1 except for
+# code positions A4, A6, A8, B4, B8, BC, BD, BE
+
+0x20-0x7E idem # ASCII
+
+#0x20 U+0020 # SPACE
+#0x21 U+0021 # EXCLAMATION MARK
+#0x22 U+0022 # QUOTATION MARK
+#0x23 U+0023 # NUMBER SIGN
+#0x24 U+0024 # DOLLAR SIGN
+#0x25 U+0025 # PERCENT SIGN
+#0x26 U+0026 # AMPERSAND
+#0x27 U+0027 # APOSTROPHE
+#0x28 U+0028 # LEFT PARENTHESIS
+#0x29 U+0029 # RIGHT PARENTHESIS
+#0x2A U+002A # ASTERISK
+#0x2B U+002B # PLUS SIGN
+#0x2C U+002C # COMMA
+#0x2D U+002D # HYPHEN-MINUS
+#0x2E U+002E # FULL STOP
+#0x2F U+002F # SOLIDUS
+#0x30 U+0030 # DIGIT ZERO
+#0x31 U+0031 # DIGIT ONE
+#0x32 U+0032 # DIGIT TWO
+#0x33 U+0033 # DIGIT THREE
+#0x34 U+0034 # DIGIT FOUR
+#0x35 U+0035 # DIGIT FIVE
+#0x36 U+0036 # DIGIT SIX
+#0x37 U+0037 # DIGIT SEVEN
+#0x38 U+0038 # DIGIT EIGHT
+#0x39 U+0039 # DIGIT NINE
+#0x3A U+003A # COLON
+#0x3B U+003B # SEMICOLON
+#0x3C U+003C # LESS-THAN SIGN
+#0x3D U+003D # EQUALS SIGN
+#0x3E U+003E # GREATER-THAN SIGN
+#0x3F U+003F # QUESTION MARK
+#0x40 U+0040 # COMMERCIAL AT
+#0x41 U+0041 # LATIN CAPITAL LETTER A
+#0x42 U+0042 # LATIN CAPITAL LETTER B
+#0x43 U+0043 # LATIN CAPITAL LETTER C
+#0x44 U+0044 # LATIN CAPITAL LETTER D
+#0x45 U+0045 # LATIN CAPITAL LETTER E
+#0x46 U+0046 # LATIN CAPITAL LETTER F
+#0x47 U+0047 # LATIN CAPITAL LETTER G
+#0x48 U+0048 # LATIN CAPITAL LETTER H
+#0x49 U+0049 # LATIN CAPITAL LETTER I
+#0x4A U+004A # LATIN CAPITAL LETTER J
+#0x4B U+004B # LATIN CAPITAL LETTER K
+#0x4C U+004C # LATIN CAPITAL LETTER L
+#0x4D U+004D # LATIN CAPITAL LETTER M
+#0x4E U+004E # LATIN CAPITAL LETTER N
+#0x4F U+004F # LATIN CAPITAL LETTER O
+#0x50 U+0050 # LATIN CAPITAL LETTER P
+#0x51 U+0051 # LATIN CAPITAL LETTER Q
+#0x52 U+0052 # LATIN CAPITAL LETTER R
+#0x53 U+0053 # LATIN CAPITAL LETTER S
+#0x54 U+0054 # LATIN CAPITAL LETTER T
+#0x55 U+0055 # LATIN CAPITAL LETTER U
+#0x56 U+0056 # LATIN CAPITAL LETTER V
+#0x57 U+0057 # LATIN CAPITAL LETTER W
+#0x58 U+0058 # LATIN CAPITAL LETTER X
+#0x59 U+0059 # LATIN CAPITAL LETTER Y
+#0x5A U+005A # LATIN CAPITAL LETTER Z
+#0x5B U+005B # LEFT SQUARE BRACKET
+#0x5C U+005C # REVERSE SOLIDUS
+#0x5D U+005D # RIGHT SQUARE BRACKET
+#0x5E U+005E # CIRCUMFLEX ACCENT
+#0x5F U+005F # LOW LINE
+#0x60 U+0060 # GRAVE ACCENT
+#0x61 U+0061 # LATIN SMALL LETTER A
+#0x62 U+0062 # LATIN SMALL LETTER B
+#0x63 U+0063 # LATIN SMALL LETTER C
+#0x64 U+0064 # LATIN SMALL LETTER D
+#0x65 U+0065 # LATIN SMALL LETTER E
+#0x66 U+0066 # LATIN SMALL LETTER F
+#0x67 U+0067 # LATIN SMALL LETTER G
+#0x68 U+0068 # LATIN SMALL LETTER H
+#0x69 U+0069 # LATIN SMALL LETTER I
+#0x6A U+006A # LATIN SMALL LETTER J
+#0x6B U+006B # LATIN SMALL LETTER K
+#0x6C U+006C # LATIN SMALL LETTER L
+#0x6D U+006D # LATIN SMALL LETTER M
+#0x6E U+006E # LATIN SMALL LETTER N
+#0x6F U+006F # LATIN SMALL LETTER O
+#0x70 U+0070 # LATIN SMALL LETTER P
+#0x71 U+0071 # LATIN SMALL LETTER Q
+#0x72 U+0072 # LATIN SMALL LETTER R
+#0x73 U+0073 # LATIN SMALL LETTER S
+#0x74 U+0074 # LATIN SMALL LETTER T
+#0x75 U+0075 # LATIN SMALL LETTER U
+#0x76 U+0076 # LATIN SMALL LETTER V
+#0x77 U+0077 # LATIN SMALL LETTER W
+#0x78 U+0078 # LATIN SMALL LETTER X
+#0x79 U+0079 # LATIN SMALL LETTER Y
+#0x7A U+007A # LATIN SMALL LETTER Z
+#0x7B U+007B # LEFT CURLY BRACKET
+#0x7C U+007C # VERTICAL LINE
+#0x7D U+007D # RIGHT CURLY BRACKET
+#0x7E U+007E # TILDE
+
+0xA0 U+00A0 # NO-BREAK SPACE
+0xA1 U+00A1 # INVERTED EXCLAMATION MARK
+0xA2 U+00A2 # CENT SIGN
+0xA3 U+00A3 # POUND SIGN
+0xA4 U+20AC # EURO SIGN
+0xA5 U+00A5 # YEN SIGN
+0xA6 U+0160 # LATIN CAPITAL LETTER S WITH CARON
+0xA7 U+00A7 # SECTION SIGN
+0xA8 U+0161 # LATIN SMALL LETTER S WITH CARON
+0xA9 U+00A9 # COPYRIGHT SIGN
+0xAA U+00AA # FEMININE ORDINAL INDICATOR
+0xAB U+00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xAC U+00AC # NOT SIGN
+0xAD U+00AD # SOFT HYPHEN
+0xAE U+00AE # REGISTERED SIGN
+0xAF U+00AF # MACRON
+0xB0 U+00B0 # DEGREE SIGN
+0xB1 U+00B1 # PLUS-MINUS SIGN
+0xB2 U+00B2 # SUPERSCRIPT TWO
+0xB3 U+00B3 # SUPERSCRIPT THREE
+0xB4 U+017D # LATIN CAPITAL LETTER Z WITH CARON
+0xB5 U+00B5 # MICRO SIGN
+0xB6 U+00B6 # PILCROW SIGN
+0xB7 U+00B7 # MIDDLE DOT
+0xB8 U+017E # LATIN SMALL LETTER Z WITH CARON
+0xB9 U+00B9 # SUPERSCRIPT ONE
+0xBA U+00BA # MASCULINE ORDINAL INDICATOR
+0xBB U+00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xBC U+0152 # LATIN CAPITAL LIGATURE OE
+0xBD U+0153 # LATIN SMALL LIGATURE OE
+0xBE U+0178 # LATIN CAPITAL LETTER Y WITH DIAERESIS
+0xBF U+00BF # INVERTED QUESTION MARK
+0xC0 U+00C0 # LATIN CAPITAL LETTER A WITH GRAVE
+0xC1 U+00C1 # LATIN CAPITAL LETTER A WITH ACUTE
+0xC2 U+00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0xC3 U+00C3 # LATIN CAPITAL LETTER A WITH TILDE
+0xC4 U+00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS
+0xC5 U+00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE
+0xC6 U+00C6 # LATIN CAPITAL LETTER AE
+0xC7 U+00C7 # LATIN CAPITAL LETTER C WITH CEDILLA
+0xC8 U+00C8 # LATIN CAPITAL LETTER E WITH GRAVE
+0xC9 U+00C9 # LATIN CAPITAL LETTER E WITH ACUTE
+0xCA U+00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+0xCB U+00CB # LATIN CAPITAL LETTER E WITH DIAERESIS
+0xCC U+00CC # LATIN CAPITAL LETTER I WITH GRAVE
+0xCD U+00CD # LATIN CAPITAL LETTER I WITH ACUTE
+0xCE U+00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0xCF U+00CF # LATIN CAPITAL LETTER I WITH DIAERESIS
+0xD0 U+00D0 # LATIN CAPITAL LETTER ETH
+0xD1 U+00D1 # LATIN CAPITAL LETTER N WITH TILDE
+0xD2 U+00D2 # LATIN CAPITAL LETTER O WITH GRAVE
+0xD3 U+00D3 # LATIN CAPITAL LETTER O WITH ACUTE
+0xD4 U+00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0xD5 U+00D5 # LATIN CAPITAL LETTER O WITH TILDE
+0xD6 U+00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS
+0xD7 U+00D7 # MULTIPLICATION SIGN
+0xD8 U+00D8 # LATIN CAPITAL LETTER O WITH STROKE
+0xD9 U+00D9 # LATIN CAPITAL LETTER U WITH GRAVE
+0xDA U+00DA # LATIN CAPITAL LETTER U WITH ACUTE
+0xDB U+00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+0xDC U+00DC # LATIN CAPITAL LETTER U WITH DIAERESIS
+0xDD U+00DD # LATIN CAPITAL LETTER Y WITH ACUTE
+0xDE U+00DE # LATIN CAPITAL LETTER THORN
+0xDF U+00DF # LATIN SMALL LETTER SHARP S
+0xE0 U+00E0 # LATIN SMALL LETTER A WITH GRAVE
+0xE1 U+00E1 # LATIN SMALL LETTER A WITH ACUTE
+0xE2 U+00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX
+0xE3 U+00E3 # LATIN SMALL LETTER A WITH TILDE
+0xE4 U+00E4 # LATIN SMALL LETTER A WITH DIAERESIS
+0xE5 U+00E5 # LATIN SMALL LETTER A WITH RING ABOVE
+0xE6 U+00E6 # LATIN SMALL LETTER AE
+0xE7 U+00E7 # LATIN SMALL LETTER C WITH CEDILLA
+0xE8 U+00E8 # LATIN SMALL LETTER E WITH GRAVE
+0xE9 U+00E9 # LATIN SMALL LETTER E WITH ACUTE
+0xEA U+00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX
+0xEB U+00EB # LATIN SMALL LETTER E WITH DIAERESIS
+0xEC U+00EC # LATIN SMALL LETTER I WITH GRAVE
+0xED U+00ED # LATIN SMALL LETTER I WITH ACUTE
+0xEE U+00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX
+0xEF U+00EF # LATIN SMALL LETTER I WITH DIAERESIS
+0xF0 U+00F0 # LATIN SMALL LETTER ETH
+0xF1 U+00F1 # LATIN SMALL LETTER N WITH TILDE
+0xF2 U+00F2 # LATIN SMALL LETTER O WITH GRAVE
+0xF3 U+00F3 # LATIN SMALL LETTER O WITH ACUTE
+0xF4 U+00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX
+0xF5 U+00F5 # LATIN SMALL LETTER O WITH TILDE
+0xF6 U+00F6 # LATIN SMALL LETTER O WITH DIAERESIS
+0xF7 U+00F7 # DIVISION SIGN
+0xF8 U+00F8 # LATIN SMALL LETTER O WITH STROKE
+0xF9 U+00F9 # LATIN SMALL LETTER U WITH GRAVE
+0xFA U+00FA # LATIN SMALL LETTER U WITH ACUTE
+0xFB U+00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX
+0xFC U+00FC # LATIN SMALL LETTER U WITH DIAERESIS
+0xFD U+00FD # LATIN SMALL LETTER Y WITH ACUTE
+0xFE U+00FE # LATIN SMALL LETTER THORN
+0xFF U+00FF # LATIN SMALL LETTER Y WITH DIAERESIS
+
+## EOF ##
diff --git a/src/chrtrans/iso16_uni.tbl b/src/chrtrans/iso16_uni.tbl
new file mode 100644
index 0000000..e846b24
--- /dev/null
+++ b/src/chrtrans/iso16_uni.tbl
@@ -0,0 +1,120 @@
+#The MIME name of this charset.
+Miso-8859-16
+
+#Name as a Display Charset (used on Options screen)
+OLatin 10 (ISO-8859-16)
+
+# This is not the default font!
+D0
+
+#Codepage number
+#C28606
+
+#This table contains the data the Unicode Consortium has on how
+#ISO/IEC 8859-16:2001 characters map into Unicode.
+#
+#Format: Three tab-separated columns
+# Column #1 is the ISO/IEC 8859-16 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+#The entries are in ISO/IEC 8859-16 order.
+
+0x20-0x7E idem # ASCII
+
+0xA0 U+00A0 # NO-BREAK SPACE
+0xA1 U+0104 # LATIN CAPITAL LETTER A WITH OGONEK
+0xA2 U+0105 # LATIN SMALL LETTER A WITH OGONEK
+0xA3 U+0141 # LATIN CAPITAL LETTER L WITH STROKE
+0xA4 U+20AC # EURO SIGN
+0xA5 U+201E # DOUBLE LOW-9 QUOTATION MARK
+0xA6 U+0160 # LATIN CAPITAL LETTER S WITH CARON
+0xA7 U+00A7 # SECTION SIGN
+0xA8 U+0161 # LATIN SMALL LETTER S WITH CARON
+0xA9 U+00A9 # COPYRIGHT SIGN
+0xAA U+0218 # LATIN CAPITAL LETTER S WITH COMMA BELOW
+0xAB U+00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xAC U+0179 # LATIN CAPITAL LETTER Z WITH ACUTE
+0xAD U+00AD # SOFT HYPHEN
+0xAE U+017A # LATIN SMALL LETTER Z WITH ACUTE
+0xAF U+017B # LATIN CAPITAL LETTER Z WITH DOT ABOVE
+0xB0 U+00B0 # DEGREE SIGN
+0xB1 U+00B1 # PLUS-MINUS SIGN
+0xB2 U+010C # LATIN CAPITAL LETTER C WITH CARON
+0xB3 U+0142 # LATIN SMALL LETTER L WITH STROKE
+0xB4 U+017D # LATIN CAPITAL LETTER Z WITH CARON
+0xB5 U+201D # RIGHT DOUBLE QUOTATION MARK
+0xB6 U+00B6 # PILCROW SIGN
+0xB7 U+00B7 # MIDDLE DOT
+0xB8 U+017E # LATIN SMALL LETTER Z WITH CARON
+0xB9 U+010D # LATIN SMALL LETTER C WITH CARON
+0xBA U+0219 # LATIN SMALL LETTER S WITH COMMA BELOW
+0xBB U+00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xBC U+0152 # LATIN CAPITAL LIGATURE OE
+0xBD U+0153 # LATIN SMALL LIGATURE OE
+0xBE U+0178 # LATIN CAPITAL LETTER Y WITH DIAERESIS
+0xBF U+017C # LATIN SMALL LETTER Z WITH DOT ABOVE
+0xC0 U+00C0 # LATIN CAPITAL LETTER A WITH GRAVE
+0xC1 U+00C1 # LATIN CAPITAL LETTER A WITH ACUTE
+0xC2 U+00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0xC3 U+0102 # LATIN CAPITAL LETTER A WITH BREVE
+0xC4 U+00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS
+0xC5 U+0106 # LATIN CAPITAL LETTER C WITH ACUTE
+0xC6 U+00C6 # LATIN CAPITAL LETTER AE
+0xC7 U+00C7 # LATIN CAPITAL LETTER C WITH CEDILLA
+0xC8 U+00C8 # LATIN CAPITAL LETTER E WITH GRAVE
+0xC9 U+00C9 # LATIN CAPITAL LETTER E WITH ACUTE
+0xCA U+00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+0xCB U+00CB # LATIN CAPITAL LETTER E WITH DIAERESIS
+0xCC U+00CC # LATIN CAPITAL LETTER I WITH GRAVE
+0xCD U+00CD # LATIN CAPITAL LETTER I WITH ACUTE
+0xCE U+00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0xCF U+00CF # LATIN CAPITAL LETTER I WITH DIAERESIS
+0xD0 U+0110 # LATIN CAPITAL LETTER D WITH STROKE
+0xD1 U+0143 # LATIN CAPITAL LETTER N WITH ACUTE
+0xD2 U+00D2 # LATIN CAPITAL LETTER O WITH GRAVE
+0xD3 U+00D3 # LATIN CAPITAL LETTER O WITH ACUTE
+0xD4 U+00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0xD5 U+0150 # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+0xD6 U+00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS
+0xD7 U+015A # LATIN CAPITAL LETTER S WITH ACUTE
+0xD8 U+0170 # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+0xD9 U+00D9 # LATIN CAPITAL LETTER U WITH GRAVE
+0xDA U+00DA # LATIN CAPITAL LETTER U WITH ACUTE
+0xDB U+00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+0xDC U+00DC # LATIN CAPITAL LETTER U WITH DIAERESIS
+0xDD U+0118 # LATIN CAPITAL LETTER E WITH OGONEK
+0xDE U+021A # LATIN CAPITAL LETTER T WITH COMMA BELOW
+0xDF U+00DF # LATIN SMALL LETTER SHARP S
+0xE0 U+00E0 # LATIN SMALL LETTER A WITH GRAVE
+0xE1 U+00E1 # LATIN SMALL LETTER A WITH ACUTE
+0xE2 U+00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX
+0xE3 U+0103 # LATIN SMALL LETTER A WITH BREVE
+0xE4 U+00E4 # LATIN SMALL LETTER A WITH DIAERESIS
+0xE5 U+0107 # LATIN SMALL LETTER C WITH ACUTE
+0xE6 U+00E6 # LATIN SMALL LETTER AE
+0xE7 U+00E7 # LATIN SMALL LETTER C WITH CEDILLA
+0xE8 U+00E8 # LATIN SMALL LETTER E WITH GRAVE
+0xE9 U+00E9 # LATIN SMALL LETTER E WITH ACUTE
+0xEA U+00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX
+0xEB U+00EB # LATIN SMALL LETTER E WITH DIAERESIS
+0xEC U+00EC # LATIN SMALL LETTER I WITH GRAVE
+0xED U+00ED # LATIN SMALL LETTER I WITH ACUTE
+0xEE U+00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX
+0xEF U+00EF # LATIN SMALL LETTER I WITH DIAERESIS
+0xF0 U+0111 # LATIN SMALL LETTER D WITH STROKE
+0xF1 U+0144 # LATIN SMALL LETTER N WITH ACUTE
+0xF2 U+00F2 # LATIN SMALL LETTER O WITH GRAVE
+0xF3 U+00F3 # LATIN SMALL LETTER O WITH ACUTE
+0xF4 U+00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX
+0xF5 U+0151 # LATIN SMALL LETTER O WITH DOUBLE ACUTE
+0xF6 U+00F6 # LATIN SMALL LETTER O WITH DIAERESIS
+0xF7 U+015B # LATIN SMALL LETTER S WITH ACUTE
+0xF8 U+0171 # LATIN SMALL LETTER U WITH DOUBLE ACUTE
+0xF9 U+00F9 # LATIN SMALL LETTER U WITH GRAVE
+0xFA U+00FA # LATIN SMALL LETTER U WITH ACUTE
+0xFB U+00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX
+0xFC U+00FC # LATIN SMALL LETTER U WITH DIAERESIS
+0xFD U+0119 # LATIN SMALL LETTER E WITH OGONEK
+0xFE U+021B # LATIN SMALL LETTER T WITH COMMA BELOW
+0xFF U+00FF # LATIN SMALL LETTER Y WITH DIAERESIS
diff --git a/src/chrtrans/jcuken_kb.h b/src/chrtrans/jcuken_kb.h
new file mode 100644
index 0000000..5f42d26
--- /dev/null
+++ b/src/chrtrans/jcuken_kb.h
@@ -0,0 +1,22 @@
+static LYKbLayout_t kb_layout_jcuken[128] =
+{
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, /* 00..07 */
+ 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, /* 08..0F */
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, /* 10..17 */
+ 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, /* 18..1F */
+
+ 0x0020, 0x0021, 0x042D, 0x002F, 0x0024, 0x003A, 0x002E, 0x044D, /* 20..27 */
+ 0x003F, 0x0025, 0x003B, 0x002B, 0x0431, 0x002D, 0x044E, 0x0451, /* 28..2F */
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, /* 30..37 */
+ 0x0038, 0x0039, 0x0416, 0x0436, 0x0411, 0x003D, 0x042E, 0x0401, /* 38..3F */
+
+ 0x0022, 0x0424, 0x0418, 0x0421, 0x0412, 0x0423, 0x0410, 0x041F, /* 40..47 */
+ 0x0420, 0x0428, 0x041E, 0x041B, 0x0414, 0x042C, 0x0422, 0x0429, /* 48..4F */
+ 0x0417, 0x0419, 0x041A, 0x042B, 0x0415, 0x0413, 0x041C, 0x0426, /* 50..57 */
+ 0x0427, 0x041D, 0x042F, 0x0445, 0x005C, 0x044A, 0x002C, 0x005F, /* 58..5F */
+
+ 0x0029, 0x0444, 0x0438, 0x0441, 0x0432, 0x0443, 0x0430, 0x043F, /* 60..67 */
+ 0x0440, 0x0448, 0x043E, 0x043B, 0x0434, 0x044C, 0x0442, 0x0449, /* 68..6F */
+ 0x0437, 0x0439, 0x043A, 0x044B, 0x0435, 0x0433, 0x043C, 0x0446, /* 70..77 */
+ 0x0447, 0x043D, 0x044F, 0x0425, 0x007C, 0x042A, 0x0028, 0x007F /* 78..7F */
+};
diff --git a/src/chrtrans/koi8r_uni.tbl b/src/chrtrans/koi8r_uni.tbl
new file mode 100644
index 0000000..8bf4001
--- /dev/null
+++ b/src/chrtrans/koi8r_uni.tbl
@@ -0,0 +1,147 @@
+# Options screen name for this character set
+OCyrillic (KOI8-R)
+
+# MIME name for this charset
+Mkoi8-r
+
+#Codepage number
+C878
+
+0x20-0x7f idem
+# Based on a table received from "Glenn E. Thobe" <thobe@lafn.org>
+# (verified against RFC1489).
+#
+# Lines with more than one Unicode (U+XXXX) value contain additional
+# replacement mappings added for lynx. - kw
+#
+#hex unicode # description
+#--- U+---- # ---------------
+0x80 U+2500 # FORMS LIGHT HORIZONTAL
+0x81 U+2502 # FORMS LIGHT VERTICAL
+0x82 U+250C # FORMS LIGHT DOWN AND RIGHT
+0x83 U+2510 # FORMS LIGHT DOWN AND LEFT
+0x84 U+2514 # FORMS LIGHT UP AND RIGHT
+0x85 U+2518 # FORMS LIGHT UP AND LEFT
+0x86 U+251C # FORMS LIGHT VERTICAL AND RIGHT
+0x87 U+2524 # FORMS LIGHT VERTICAL AND LEFT
+0x88 U+252C # FORMS LIGHT DOWN AND HORIZONTAL
+0x89 U+2534 # FORMS LIGHT UP AND HORIZONTAL
+0x8A U+253C # FORMS LIGHT VERTICAL AND HORIZONTAL
+0x8B U+2580 # UPPER HALF BLOCK
+0x8C U+2584 # LOWER HALF BLOCK
+0x8D U+2588 # FULL BLOCK
+0x8E U+258C # LEFT HALF BLOCK
+0x8F U+2590 # RIGHT HALF BLOCK
+0x90 U+2591 # LIGHT SHADE
+0x91 U+2592 # MEDIUM SHADE
+0x92 U+2593 # DARK SHADE
+0x93 U+2320 # TOP HALF INTEGRAL
+0x94 U+25A0 # BLACK SMALL SQUARE
+0x95 U+2219 # BULLET OPERATOR
+0x96 U+221A # SQUARE ROOT
+0x97 U+2248 # ALMOST EQUAL TO
+0x98 U+2264 # LESS THAN OR EQUAL TO
+0x99 U+2265 # GREATER THAN OR EQUAL TO
+0x9A U+00A0 # NON-BREAKING SPACE
+0x9B U+2321 # BOTTOM HALF INTEGRAL
+0x9C U+00B0 # DEGREE SIGN
+0x9D U+00B2 # SUPERSCRIPT DIGIT TWO
+0x9E U+00B7 U+2027 # MIDDLE DOT
+0x9F U+00F7 # DIVISION SIGN
+0xA0 U+2550 # FORMS DOUBLE HORIZONTAL
+0xA1 U+2551 # FORMS DOUBLE VERTICAL
+0xA2 U+2552 # FORMS DOWN SINGLE AND RIGHT DOUBLE
+0xA3 U+0451 # SMA IO
+0xA4 U+2553 # FORMS DOWN DOUBLE AND RIGHT SINGLE
+0xA5 U+2554 # FORMS DOUBLE DOWN AND RIGHT
+0xA6 U+2555 # FORMS DOWN SINGLE AND LEFT DOUBLE
+0xA7 U+2556 # FORMS DOWN DOUBLE AND LEFT SINGLE
+0xA8 U+2557 # FORMS DOUBLE DOWN AND LEFT
+0xA9 U+2558 # FORMS UP SINGLE AND RIGHT DOUBLE
+0xAA U+2559 # FORMS UP DOUBLE AND RIGHT SINGLE
+0xAB U+255A # FORMS DOUBLE UP AND RIGHT
+0xAC U+255B # FORMS UP SINGLE AND LEFT DOUBLE
+0xAD U+255C # FORMS UP DOUBLE AND LEFT SINGLE
+0xAE U+255D # FORMS DOUBLE UP AND LEFT
+0xAF U+255E # FORMS VERTICAL SINGLE AND RIGHT DOUBLE
+0xB0 U+255F # FORMS VERTICAL DOUBLE AND RIGHT SINGLE
+0xB1 U+2560 # FORMS DOUBLE VERTICAL AND RIGHT
+0xB2 U+2561 # FORMS VERTICAL SINGLE AND LEFT DOUBLE
+0xB3 U+0401 # CAP IO
+0xB4 U+2562 # FORMS VERTICAL DOUBLE AND LEFT SINGLE
+0xB5 U+2563 # FORMS DOUBLE VERTICAL AND LEFT
+0xB6 U+2564 # FORMS DOWN SINGLE AND HORIZONTAL DOUBLE
+0xB7 U+2565 # FORMS DOWN DOUBLE AND HORIZONTAL SINGLE
+0xB8 U+2566 # FORMS DOUBLE DOWN AND HORIZONTAL
+0xB9 U+2567 # FORMS UP SINGLE AND HORIZONTAL DOUBLE
+0xBA U+2568 # FORMS UP DOUBLE AND HORIZONTAL SINGLE
+0xBB U+2569 # FORMS DOUBLE UP AND HORIZONTAL
+0xBC U+256A # FORMS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+0xBD U+256B # FORMS VERTICAL DOUBLE AND HORIZONTAL SINGLE
+0xBE U+256C # FORMS DOUBLE VERTICAL AND HORIZONTAL
+0xBF U+00A9 # COPYRIGHT SIGN
+0xC0 U+044E # SMA IU
+0xC1 U+0430 # SMA A
+0xC2 U+0431 # SMA BE
+0xC3 U+0446 # SMA TSE
+0xC4 U+0434 # SMA DE
+0xC5 U+0435 # SMA IE
+0xC6 U+0444 U+03c6 # SMA EF
+0xC7 U+0433 # SMA GE
+0xC8 U+0445 # SMA KHA
+0xC9 U+0438 # SMA II
+0xCA U+0439 # SMA SHORT II
+0xCB U+043A # SMA KA
+0xCC U+043B U+03bb # SMA EL
+0xCD U+043C # SMA EM
+0xCE U+043D # SMA EN
+0xCF U+043E # SMA O
+0xD0 U+043F U+03c0 # SMA PE
+0xD1 U+044F # SMA IA
+0xD2 U+0440 # SMA ER
+0xD3 U+0441 # SMA ES
+0xD4 U+0442 # SMA TE
+0xD5 U+0443 # SMA U
+0xD6 U+0436 U+017e # SMA ZHE
+0xD7 U+0432 # SMA VE
+0xD8 U+044C # SMA SOFT SIGN
+0xD9 U+044B U+0131 # SMA YERI
+0xDA U+0437 # SMA ZE
+0xDB U+0448 U+0161 # SMA SHA
+0xDC U+044D # SMA REVERSED E
+0xDD U+0449 # SMA SHCHA
+0xDE U+0447 U+010d # SMA CHE
+0xDF U+044A # SMA HARD SIGN
+0xE0 U+042E # CAP IU
+0xE1 U+0410 # CAP A
+0xE2 U+0411 # CAP BE
+0xE3 U+0426 # CAP TSE
+0xE4 U+0414 # CAP DE
+0xE5 U+0415 # CAP IE
+0xE6 U+0424 U+03a6 # CAP EF
+0xE7 U+0413 U+0393 # CAP GE
+0xE8 U+0425 # CAP KHA
+0xE9 U+0418 # CAP II
+0xEA U+0419 # CAP SHORT II
+0xEB U+041A # CAP KA
+0xEC U+041B U+039b # CAP EL
+0xED U+041C # CAP EM
+0xEE U+041D # CAP EN
+0xEF U+041E # CAP O
+0xF0 U+041F U+03a0 # CAP PE
+0xF1 U+042F # CAP IA
+0xF2 U+0420 # CAP ER
+0xF3 U+0421 # CAP ES
+0xF4 U+0422 # CAP TE
+0xF5 U+0423 # CAP U
+0xF6 U+0416 U+017d # CAP ZHE
+0xF7 U+0412 # CAP VE
+0xF8 U+042C # CAP SOFT SIGN
+0xF9 U+042B # CAP YERI
+0xFA U+0417 # CAP ZE
+0xFB U+0428 U+0160 # CAP SHA
+0xFC U+042D # CAP REVERSED E
+0xFD U+0429 # CAP SHCHA
+0xFE U+0427 U+010c # CAP CHE
+0xFF U+042A # CAP HARD SIGN
+
diff --git a/src/chrtrans/koi8u_uni.tbl b/src/chrtrans/koi8u_uni.tbl
new file mode 100644
index 0000000..2c13845
--- /dev/null
+++ b/src/chrtrans/koi8u_uni.tbl
@@ -0,0 +1,154 @@
+# Options screen name for this character set
+OUkrainian Cyrillic (KOI8-U)
+
+# MIME name for this charset
+Mkoi8-u
+
+#Codepage number
+#?
+
+0x20-0x7f idem
+# Based on a table received from "Denis V. Dmitrienko" <denis@null.net>
+# (verified against RFC2319).
+# KOI8-U home page: <http://www.net.ua/KOI8-U>
+#
+# Quoted from RFC2319:
+# The upper part of the KOI8-U Character Set contains all Russian
+# letters defined in KOI8-R and four Ukrainian letters (#164, #180 -
+# ukr. ie, #166, #182 - ukr. i, #167, #183 - ukr. yi, #173, #189 - ukr.
+# ghe with upturn) which locations are compliant with ISO-IR-111.
+#
+# BOX DRAWINGS elements in the other positions (that are not used by
+# Ukrainian letters) are the same as in KOI8-R character set.
+#
+#
+#hex unicode # description
+#--- U+---- # ---------------
+0x80 U+2500 # BOX DRAWINGS LIGHT HORIZONTAL
+0x81 U+2502 # BOX DRAWINGS LIGHT VERTICAL
+0x82 U+250C # BOX DRAWINGS LIGHT DOWN AND RIGHT
+0x83 U+2510 # BOX DRAWINGS LIGHT DOWN AND LEFT
+0x84 U+2514 # BOX DRAWINGS LIGHT UP AND RIGHT
+0x85 U+2518 # BOX DRAWINGS LIGHT UP AND LEFT
+0x86 U+251C # BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+0x87 U+2524 # BOX DRAWINGS LIGHT VERTICAL AND LEFT
+0x88 U+252C # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+0x89 U+2534 # BOX DRAWINGS LIGHT UP AND HORIZONTAL
+0x8A U+253C # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+0x8B U+2580 # UPPER HALF BLOCK
+0x8C U+2584 # LOWER HALF BLOCK
+0x8D U+2588 # FULL BLOCK
+0x8E U+258C # LEFT HALF BLOCK
+0x8F U+2590 # RIGHT HALF BLOCK
+0x90 U+2591 # LIGHT SHADE
+0x91 U+2592 # MEDIUM SHADE
+0x92 U+2593 # DARK SHADE
+0x93 U+2320 # TOP HALF INTEGRAL
+0x94 U+25A0 # BLACK SQUARE
+0x95 U+2219 # BULLET OPERATOR
+0x96 U+221A # SQUARE ROOT
+0x97 U+2248 # ALMOST EQUAL TO
+0x98 U+2264 # LESS THAN OR EQUAL TO
+0x99 U+2265 # GREATER THAN OR EQUAL TO
+0x9A U+00A0 # NO-BREAK SPACE
+0x9B U+2321 # BOTTOM HALF INTEGRAL
+0x9C U+00B0 # DEGREE SIGN
+0x9D U+00B2 # SUPERSCRIPT TWO
+0x9E U+00B7 # MIDDLE DOT
+0x9F U+00F7 # DIVISION SIGN
+0xA0 U+2550 # BOX DRAWINGS DOUBLE HORIZONTAL
+0xA1 U+2551 # BOX DRAWINGS DOUBLE VERTICAL
+0xA2 U+2552 # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+0xA3 U+0451 # CYRILLIC SMALL LETTER IO
+0xA4 U+0454 # CYRILLIC SMALL LETTER UKRAINIAN IE
+0xA5 U+2554 # BOX DRAWINGS DOUBLE DOWN AND RIGHT
+0xA6 U+0456 # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+0xA7 U+0457 # CYRILLIC SMALL LETTER YI (UKRAINIAN)
+0xA8 U+2557 # BOX DRAWINGS DOUBLE DOWN AND LEFT
+0xA9 U+2558 # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+0xAA U+2559 # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+0xAB U+255A # BOX DRAWINGS DOUBLE UP AND RIGHT
+0xAC U+255B # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+0xAD U+0491 # CYRILLIC SMALL LETTER GHE WITH UPTURN
+0xAE U+255D # BOX DRAWINGS DOUBLE UP AND LEFT
+0xAF U+255E # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+0xB0 U+255F # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+0xB1 U+2560 # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+0xB2 U+2561 # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+0xB3 U+0401 # CYRILLIC CAPITAL LETTER IO
+0xB4 U+0404 # CYRILLIC CAPITAL LETTER UKRAINIAN IE
+0xB5 U+2563 # BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+0xB6 U+0406 # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+0xB7 U+0407 # CYRILLIC CAPITAL LETTER YI (UKRAINIAN)
+0xB8 U+2566 # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+0xB9 U+2567 # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+0xBA U+2568 # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+0xBB U+2569 # BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+0xBC U+256A # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+0xBD U+0490 # CYRILLIC CAPITAL LETTER GHE WITH UPTURN
+0xBE U+256C # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+0xBF U+00A9 # COPYRIGHT SIGN
+0xC0 U+044E # CYRILLIC SMALL LETTER YU
+0xC1 U+0430 # CYRILLIC SMALL LETTER A
+0xC2 U+0431 # CYRILLIC SMALL LETTER BE
+0xC3 U+0446 # CYRILLIC SMALL LETTER TSE
+0xC4 U+0434 # CYRILLIC SMALL LETTER DE
+0xC5 U+0435 # CYRILLIC SMALL LETTER IE
+0xC6 U+0444 # CYRILLIC SMALL LETTER EF
+0xC7 U+0433 # CYRILLIC SMALL LETTER GHE
+0xC8 U+0445 # CYRILLIC SMALL LETTER KHA
+0xC9 U+0438 # CYRILLIC SMALL LETTER I
+0xCA U+0439 # CYRILLIC SMALL LETTER SHORT I
+0xCB U+043A # CYRILLIC SMALL LETTER KA
+0xCC U+043B # CYRILLIC SMALL LETTER EL
+0xCD U+043C # CYRILLIC SMALL LETTER EM
+0xCE U+043D # CYRILLIC SMALL LETTER EN
+0xCF U+043E # CYRILLIC SMALL LETTER O
+0xD0 U+043F # CYRILLIC SMALL LETTER PE
+0xD1 U+044F # CYRILLIC SMALL LETTER YA
+0xD2 U+0440 # CYRILLIC SMALL LETTER ER
+0xD3 U+0441 # CYRILLIC SMALL LETTER ES
+0xD4 U+0442 # CYRILLIC SMALL LETTER TE
+0xD5 U+0443 # CYRILLIC SMALL LETTER U
+0xD6 U+0436 # CYRILLIC SMALL LETTER ZHE
+0xD7 U+0432 # CYRILLIC SMALL LETTER VE
+0xD8 U+044C # CYRILLIC SMALL LETTER SOFT SIGN
+0xD9 U+044B # CYRILLIC SMALL LETTER YERU
+0xDA U+0437 # CYRILLIC SMALL LETTER ZE
+0xDB U+0448 # CYRILLIC SMALL LETTER SHA
+0xDC U+044D # CYRILLIC SMALL LETTER E
+0xDD U+0449 # CYRILLIC SMALL LETTER SHCHA
+0xDE U+0447 # CYRILLIC SMALL LETTER CHE
+0xDF U+044A # CYRILLIC SMALL LETTER HARD SIGN
+0xE0 U+042E # CYRILLIC CAPITAL LETTER YU
+0xE1 U+0410 # CYRILLIC CAPITAL LETTER A
+0xE2 U+0411 # CYRILLIC CAPITAL LETTER BE
+0xE3 U+0426 # CYRILLIC CAPITAL LETTER TSE
+0xE4 U+0414 # CYRILLIC CAPITAL LETTER DE
+0xE5 U+0415 # CYRILLIC CAPITAL LETTER IE
+0xE6 U+0424 # CYRILLIC CAPITAL LETTER EF
+0xE7 U+0413 # CYRILLIC CAPITAL LETTER GHE
+0xE8 U+0425 # CYRILLIC CAPITAL LETTER KHA
+0xE9 U+0418 # CYRILLIC CAPITAL LETTER I
+0xEA U+0419 # CYRILLIC CAPITAL LETTER SHORT I
+0xEB U+041A # CYRILLIC CAPITAL LETTER KA
+0xEC U+041B # CYRILLIC CAPITAL LETTER EL
+0xED U+041C # CYRILLIC CAPITAL LETTER EM
+0xEE U+041D # CYRILLIC CAPITAL LETTER EN
+0xEF U+041E # CYRILLIC CAPITAL LETTER O
+0xF0 U+041F # CYRILLIC CAPITAL LETTER PE
+0xF1 U+042F # CYRILLIC CAPITAL LETTER YA
+0xF2 U+0420 # CYRILLIC CAPITAL LETTER ER
+0xF3 U+0421 # CYRILLIC CAPITAL LETTER ES
+0xF4 U+0422 # CYRILLIC CAPITAL LETTER TE
+0xF5 U+0423 # CYRILLIC CAPITAL LETTER U
+0xF6 U+0416 # CYRILLIC CAPITAL LETTER ZHE
+0xF7 U+0412 # CYRILLIC CAPITAL LETTER VE
+0xF8 U+042C # CYRILLIC CAPITAL LETTER SOFT SIGN
+0xF9 U+042B # CYRILLIC CAPITAL LETTER YERU
+0xFA U+0417 # CYRILLIC CAPITAL LETTER ZE
+0xFB U+0428 # CYRILLIC CAPITAL LETTER SHA
+0xFC U+042D # CYRILLIC CAPITAL LETTER E
+0xFD U+0429 # CYRILLIC CAPITAL LETTER SHCHA
+0xFE U+0427 # CYRILLIC CAPITAL LETTER CHE
+0xFF U+042A # CYRILLIC CAPITAL LETTER HARD SIGN
diff --git a/src/chrtrans/mac_uni.tbl b/src/chrtrans/mac_uni.tbl
new file mode 100644
index 0000000..2564701
--- /dev/null
+++ b/src/chrtrans/mac_uni.tbl
@@ -0,0 +1,284 @@
+# This file has been modified for lynx (see README.tables)
+
+#The MIME name of this charset.
+Mmacintosh
+
+#Name as a Display Charset (used on Options screen)
+OMacintosh (8 bit)
+
+#
+# Name: cp10000_MacRoman to Unicode table
+# Unicode version: 2.0
+# Table version: 2.00
+# Table format: Format A
+# Date: 04/24/96
+# Authors: Lori Brownell <loribr@microsoft.com>
+# K.D. Chang <a-kchang@microsoft.com>
+# General notes: none
+#
+# Format: Three tab-separated columns
+# Column #1 is the cp10000_MacRoman code (in hex)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 is the Unicode name (follows a comment sign, '#')
+#
+# The entries are in cp10000_MacRoman order
+#
+# Lines with more than one Unicode (U+XXXX) value contain additional
+# replacement mappings added for lynx. - kw
+#
+0x20-0x7f idem
+#
+#0x20 U+0020 # SPACE
+#0x21 U+0021 # EXCLAMATION MARK
+#0x22 U+0022 # QUOTATION MARK
+#0x23 U+0023 # NUMBER SIGN
+#0x24 U+0024 # DOLLAR SIGN
+#0x25 U+0025 # PERCENT SIGN
+#0x26 U+0026 # AMPERSAND
+#0x27 U+0027 # APOSTROPHE
+#0x28 U+0028 # LEFT PARENTHESIS
+#0x29 U+0029 # RIGHT PARENTHESIS
+#0x2A U+002A # ASTERISK
+#0x2B U+002B # PLUS SIGN
+#0x2C U+002C # COMMA
+#0x2D U+002D # HYPHEN-MINUS
+#0x2E U+002E # FULL STOP
+#0x2F U+002F # SOLIDUS
+#0x30 U+0030 # DIGIT ZERO
+#0x31 U+0031 # DIGIT ONE
+#0x32 U+0032 # DIGIT TWO
+#0x33 U+0033 # DIGIT THREE
+#0x34 U+0034 # DIGIT FOUR
+#0x35 U+0035 # DIGIT FIVE
+#0x36 U+0036 # DIGIT SIX
+#0x37 U+0037 # DIGIT SEVEN
+#0x38 U+0038 # DIGIT EIGHT
+#0x39 U+0039 # DIGIT NINE
+#0x3A U+003A # COLON
+#0x3B U+003B # SEMICOLON
+#0x3C U+003C # LESS-THAN SIGN
+#0x3D U+003D # EQUALS SIGN
+#0x3E U+003E # GREATER-THAN SIGN
+#0x3F U+003F # QUESTION MARK
+#0x40 U+0040 # COMMERCIAL AT
+#0x41 U+0041 # LATIN CAPITAL LETTER A
+#0x42 U+0042 # LATIN CAPITAL LETTER B
+#0x43 U+0043 # LATIN CAPITAL LETTER C
+#0x44 U+0044 # LATIN CAPITAL LETTER D
+#0x45 U+0045 # LATIN CAPITAL LETTER E
+#0x46 U+0046 # LATIN CAPITAL LETTER F
+#0x47 U+0047 # LATIN CAPITAL LETTER G
+#0x48 U+0048 # LATIN CAPITAL LETTER H
+#0x49 U+0049 # LATIN CAPITAL LETTER I
+#0x4A U+004A # LATIN CAPITAL LETTER J
+#0x4B U+004B # LATIN CAPITAL LETTER K
+#0x4C U+004C # LATIN CAPITAL LETTER L
+#0x4D U+004D # LATIN CAPITAL LETTER M
+#0x4E U+004E # LATIN CAPITAL LETTER N
+#0x4F U+004F # LATIN CAPITAL LETTER O
+#0x50 U+0050 # LATIN CAPITAL LETTER P
+#0x51 U+0051 # LATIN CAPITAL LETTER Q
+#0x52 U+0052 # LATIN CAPITAL LETTER R
+#0x53 U+0053 # LATIN CAPITAL LETTER S
+#0x54 U+0054 # LATIN CAPITAL LETTER T
+#0x55 U+0055 # LATIN CAPITAL LETTER U
+#0x56 U+0056 # LATIN CAPITAL LETTER V
+#0x57 U+0057 # LATIN CAPITAL LETTER W
+#0x58 U+0058 # LATIN CAPITAL LETTER X
+#0x59 U+0059 # LATIN CAPITAL LETTER Y
+#0x5A U+005A # LATIN CAPITAL LETTER Z
+#0x5B U+005B # LEFT SQUARE BRACKET
+#0x5C U+005C # REVERSE SOLIDUS
+#0x5D U+005D # RIGHT SQUARE BRACKET
+#0x5E U+005E # CIRCUMFLEX ACCENT
+#0x5F U+005F # LOW LINE
+#0x60 U+0060 # GRAVE ACCENT
+#0x61 U+0061 # LATIN SMALL LETTER A
+#0x62 U+0062 # LATIN SMALL LETTER B
+#0x63 U+0063 # LATIN SMALL LETTER C
+#0x64 U+0064 # LATIN SMALL LETTER D
+#0x65 U+0065 # LATIN SMALL LETTER E
+#0x66 U+0066 # LATIN SMALL LETTER F
+#0x67 U+0067 # LATIN SMALL LETTER G
+#0x68 U+0068 # LATIN SMALL LETTER H
+#0x69 U+0069 # LATIN SMALL LETTER I
+#0x6A U+006A # LATIN SMALL LETTER J
+#0x6B U+006B # LATIN SMALL LETTER K
+#0x6C U+006C # LATIN SMALL LETTER L
+#0x6D U+006D # LATIN SMALL LETTER M
+#0x6E U+006E # LATIN SMALL LETTER N
+#0x6F U+006F # LATIN SMALL LETTER O
+#0x70 U+0070 # LATIN SMALL LETTER P
+#0x71 U+0071 # LATIN SMALL LETTER Q
+#0x72 U+0072 # LATIN SMALL LETTER R
+#0x73 U+0073 # LATIN SMALL LETTER S
+#0x74 U+0074 # LATIN SMALL LETTER T
+#0x75 U+0075 # LATIN SMALL LETTER U
+#0x76 U+0076 # LATIN SMALL LETTER V
+#0x77 U+0077 # LATIN SMALL LETTER W
+#0x78 U+0078 # LATIN SMALL LETTER X
+#0x79 U+0079 # LATIN SMALL LETTER Y
+#0x7A U+007A # LATIN SMALL LETTER Z
+#0x7B U+007B # LEFT CURLY BRACKET
+#0x7C U+007C # VERTICAL LINE
+#0x7D U+007D # RIGHT CURLY BRACKET
+#0x7E U+007E # TILDE
+0x80 U+00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS
+0x81 U+00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE
+0x82 U+00C7 # LATIN CAPITAL LETTER C WITH CEDILLA
+0x83 U+00C9 # LATIN CAPITAL LETTER E WITH ACUTE
+0x84 U+00D1 # LATIN CAPITAL LETTER N WITH TILDE
+0x85 U+00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS
+0x86 U+00DC # LATIN CAPITAL LETTER U WITH DIAERESIS
+0x87 U+00E1 # LATIN SMALL LETTER A WITH ACUTE
+0x88 U+00E0 # LATIN SMALL LETTER A WITH GRAVE
+0x89 U+00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX
+0x8A U+00E4 # LATIN SMALL LETTER A WITH DIAERESIS
+0x8B U+00E3 # LATIN SMALL LETTER A WITH TILDE
+0x8C U+00E5 # LATIN SMALL LETTER A WITH RING ABOVE
+0x8D U+00E7 # LATIN SMALL LETTER C WITH CEDILLA
+0x8E U+00E9 # LATIN SMALL LETTER E WITH ACUTE
+0x8F U+00E8 # LATIN SMALL LETTER E WITH GRAVE
+0x90 U+00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX
+0x91 U+00EB # LATIN SMALL LETTER E WITH DIAERESIS
+0x92 U+00ED # LATIN SMALL LETTER I WITH ACUTE
+0x93 U+00EC # LATIN SMALL LETTER I WITH GRAVE
+0x94 U+00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX
+0x95 U+00EF # LATIN SMALL LETTER I WITH DIAERESIS
+0x96 U+00F1 # LATIN SMALL LETTER N WITH TILDE
+0x97 U+00F3 # LATIN SMALL LETTER O WITH ACUTE
+0x98 U+00F2 # LATIN SMALL LETTER O WITH GRAVE
+0x99 U+00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX
+0x9A U+00F6 # LATIN SMALL LETTER O WITH DIAERESIS
+0x9B U+00F5 # LATIN SMALL LETTER O WITH TILDE
+0x9C U+00FA # LATIN SMALL LETTER U WITH ACUTE
+0x9D U+00F9 # LATIN SMALL LETTER U WITH GRAVE
+0x9E U+00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX
+0x9F U+00FC # LATIN SMALL LETTER U WITH DIAERESIS
+0xA0 U+2020 # DAGGER
+0xA1 U+00B0 # DEGREE SIGN
+0xA2 U+00A2 # CENT SIGN
+0xA3 U+00A3 # POUND SIGN
+0xA4 U+00A7 # SECTION SIGN
+0xA5 U+2022 # BULLET
+0xA6 U+00B6 # PILCROW SIGN
+0xA7 U+00DF # LATIN SMALL LETTER SHARP S
+0xA8 U+00AE # REGISTERED SIGN
+0xA9 U+00A9 # COPYRIGHT SIGN
+0xAA U+2122 # TRADE MARK SIGN
+0xAB U+00B4 # ACUTE ACCENT
+0xAC U+00A8 # DIAERESIS
+0xAD U+2260 # NOT EQUAL TO
+0xAE U+00C6 # LATIN CAPITAL LIGATURE AE
+0xAF U+00D8 # LATIN CAPITAL LETTER O WITH STROKE
+0xB0 U+221E # INFINITY
+0xB1 U+00B1 # PLUS-MINUS SIGN
+0xB2 U+2264 # LESS-THAN OR EQUAL TO
+0xB3 U+2265 # GREATER-THAN OR EQUAL TO
+0xB4 U+00A5 # YEN SIGN
+0xB5 U+00B5 # MICRO SIGN
+0xB6 U+2202 # PARTIAL DIFFERENTIAL
+0xB7 U+2211 # N-ARY SUMMATION
+0xB8 U+220F # N-ARY PRODUCT
+0xB9 U+03C0 # GREEK SMALL LETTER PI
+0xBA U+222B # INTEGRAL
+0xBB U+00AA # FEMININE ORDINAL INDICATOR
+0xBC U+00BA # MASCULINE ORDINAL INDICATOR
+0xBD U+2126 # OHM SIGN
+0xBE U+00E6 # LATIN SMALL LIGATURE AE
+0xBF U+00F8 # LATIN SMALL LETTER O WITH STROKE
+0xC0 U+00BF # INVERTED QUESTION MARK
+0xC1 U+00A1 # INVERTED EXCLAMATION MARK
+0xC2 U+00AC # NOT SIGN
+0xC3 U+221A # SQUARE ROOT
+0xC4 U+0192 # LATIN SMALL LETTER F WITH HOOK
+0xC5 U+2248 # ALMOST EQUAL TO
+0xC6 U+2206 # INCREMENT
+0xC7 U+00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xC8 U+00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xC9 U+2026 # HORIZONTAL ELLIPSIS
+0xCA U+00A0 # NO-BREAK SPACE
+0xCB U+00C0 # LATIN CAPITAL LETTER A WITH GRAVE
+0xCC U+00C3 # LATIN CAPITAL LETTER A WITH TILDE
+0xCD U+00D5 # LATIN CAPITAL LETTER O WITH TILDE
+0xCE U+0152 # LATIN CAPITAL LIGATURE OE
+0xCF U+0153 # LATIN SMALL LIGATURE OE
+0xD0 U+2013 # EN DASH
+0xD1 U+2014 # EM DASH
+0xD2 U+201C # LEFT DOUBLE QUOTATION MARK
+0xD3 U+201D # RIGHT DOUBLE QUOTATION MARK
+0xD4 U+2018 # LEFT SINGLE QUOTATION MARK
+0xD5 U+2019 # RIGHT SINGLE QUOTATION MARK
+0xD6 U+00F7 # DIVISION SIGN
+0xD7 U+25CA # LOZENGE
+0xD8 U+00FF # LATIN SMALL LETTER Y WITH DIAERESIS
+0xD9 U+0178 # LATIN CAPITAL LETTER Y WITH DIAERESIS
+0xDA U+2044 # FRACTION SLASH
+0xDB U+00A4 # CURRENCY SIGN
+0xDC U+2039 # SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+0xDD U+203A # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+0xDE U+FB01 # LATIN SMALL LIGATURE FI
+0xDF U+FB02 # LATIN SMALL LIGATURE FL
+0xE0 U+2021 # DOUBLE DAGGER
+0xE1 U+00B7 U+0307 U+0387 U+2027 # MIDDLE DOT
+0xE2 U+201A # SINGLE LOW-9 QUOTATION MARK
+0xE3 U+201E # DOUBLE LOW-9 QUOTATION MARK
+0xE4 U+2030 # PER MILLE SIGN
+0xE5 U+00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0xE6 U+00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+0xE7 U+00C1 # LATIN CAPITAL LETTER A WITH ACUTE
+0xE8 U+00CB # LATIN CAPITAL LETTER E WITH DIAERESIS
+0xE9 U+00C8 # LATIN CAPITAL LETTER E WITH GRAVE
+0xEA U+00CD # LATIN CAPITAL LETTER I WITH ACUTE
+0xEB U+00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0xEC U+00CF # LATIN CAPITAL LETTER I WITH DIAERESIS
+0xED U+00CC # LATIN CAPITAL LETTER I WITH GRAVE
+0xEE U+00D3 # LATIN CAPITAL LETTER O WITH ACUTE
+0xEF U+00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0xF0 # UNDEFINED
+0xF1 U+00D2 # LATIN CAPITAL LETTER O WITH GRAVE
+0xF2 U+00DA # LATIN CAPITAL LETTER U WITH ACUTE
+0xF3 U+00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+0xF4 U+00D9 # LATIN CAPITAL LETTER U WITH GRAVE
+0xF5 U+0131 # LATIN SMALL LETTER DOTLESS I
+0xF6 U+02C6 # MODIFIER LETTER CIRCUMFLEX ACCENT
+0xF7 U+02DC # SMALL TILDE
+0xF8 U+00AF # MACRON
+0xF9 U+02D8 # BREVE
+0xFA U+02D9 # DOT ABOVE
+0xFB U+02DA # RING ABOVE
+0xFC U+00B8 # CEDILLA
+0xFD U+02DD # DOUBLE ACUTE ACCENT
+0xFE U+02DB # OGONEK
+0xFF U+02C7 # CARON
+#
+# broken vertical bar (&#166;) - brvbar, brkbar
+U+00A6:|
+# superscript 3 (&#179;) - sup3
+U+00B3:^3
+# superscript 2 (&#178;) - sup2
+U+00B2:^2
+# superscript 1 (&#185;) - sup1
+U+00B9:^1
+# fraction 1/4 (&#188;) - frac14
+U+00BC: 1/4
+# fraction 1/2 (&#189;) - frac12
+U+00BD: 1/2
+# fraction 3/4 (&#190;) - frac34
+U+00BE: 3/4
+# capital Eth, Icelandic (&#208;) - ETH
+U+00D0:DH
+# Dj # capital D with stroke - Dstrok
+# capital Y, acute accent (&#221;) - Yacute
+U+00DD:Y'
+# capital THORN, Icelandic (&#222;) - THORN
+U+00DE:P
+# multiplication sign (&#215;) - times
+U+00D7:*
+# small eth, Icelandic (&#240;) - eth
+U+00F0:dh
+# small y, acute accent (&#253;) - yacute
+U+00FD:y'
+# small thorn, Icelandic (&#254;) - thorn
+U+00FE:p
+#
diff --git a/src/chrtrans/make-msc.bat b/src/chrtrans/make-msc.bat
new file mode 100644
index 0000000..81d615e
--- /dev/null
+++ b/src/chrtrans/make-msc.bat
@@ -0,0 +1,6 @@
+@rem $LynxId: make-msc.bat,v 1.6 2008/02/18 00:34:44 tom Exp $
+@echo off
+
+nmake -f makefile.msc %1 %2 %3 %4 %5 %6 %7 %8 %9
+
+if exist makeuctb.exe call makehdrs
diff --git a/src/chrtrans/makefile.bcb b/src/chrtrans/makefile.bcb
new file mode 100644
index 0000000..134a395
--- /dev/null
+++ b/src/chrtrans/makefile.bcb
@@ -0,0 +1,123 @@
+#
+# Borland C++ IDE generated makefile
+#
+# 1997/11/09 (Sun) 14:29:50
+#
+.AUTODEPEND
+
+
+#
+# Borland C++ tools
+#
+IMPLIB = Implib
+BCC32 = Bcc32 +BccW32.cfg
+TLINK32 = TLink32
+TLIB = TLib
+BRC32 = Brc32
+TASM32 = Tasm32
+#
+# macros
+#
+BCB = $(MAKEDIR)/..
+BCC_INC = $(BCB)/INCLUDE
+
+#
+# Options
+#
+
+INCLUDES = -I.;../..;../../WWW/LIBRARY/IMPLEMENTATION;$(BCC_INC)
+DEFS =-DNO_FILIO_H;NO_UNISTD_H;_WINDOWS;DOSPATH
+LNIEAT_dbmakeuctbdexe = -x
+
+#
+# Dependency List
+#
+Dep_char = .\makeuctb.exe
+
+char : BccW32.cfg $(Dep_char)
+ echo MakeNode
+
+Dep_dbmakeuctbdexe = .\makeuctb.obj
+
+.\makeuctb.exe : $(Dep_dbmakeuctbdexe)
+ $(BCC32) makeuctb.obj
+
+###
+.\makeuctb.obj : makeuctb.c
+ $(BCC32) -P- -c $(DEFS) $(INCLUDES) -o$@ makeuctb.c
+
+# Compiler configuration file
+BccW32.cfg :
+ Copy &&|
+-R
+-v
+-vi
+-H
+-H=lynx.csm
+-w-
+-A-
+-wcpt
+-wrpt
+-wrng
+-w-voi
+-w-ret
+-w-sus
+-w-dup
+-w-big
+-w-ext
+-w-zdi
+-w-bei
+-w-obi
+-w-ofp
+-w-eas
+-w-hid
+-w-ncf
+-w-ibc
+-w-dsz
+-w-nst
+-w-mpc
+-w-mpd
+-w-ntd
+-w-nvf
+-w-hch
+-w-inl
+-w-lin
+-w-lvc
+-w-pia
+-w-def
+-w-nod
+-w-pro
+-w-rvl
+-w-ccc
+-w-aus
+-w-par
+-w-rch
+-w-eff
+-w-ill
+-w-ias
+-w-msg
+-WC
+-Ot
+-d-
+-K
+-a-
+-w-stu
+-wbbf
+-w-dpu
+-wcln
+-wsig
+-wucp
+-g200
+-H-
+-v-
+| $@
+
+clean :
+ -del *_uni.h
+ -del *_suni.h
+ -del *.exe
+ -del *.map
+ -del *.obj
+ -del *.tds
+ -del BccW32.cfg
+ -del /f/s/q *.i
diff --git a/src/chrtrans/makefile.dos b/src/chrtrans/makefile.dos
new file mode 100644
index 0000000..9878637
--- /dev/null
+++ b/src/chrtrans/makefile.dos
@@ -0,0 +1,137 @@
+#
+# Makefile for the makeuctb and unicode tables
+# for use with DJGPP.
+#
+# Type make to build makeuctb and all character translation maps.
+# Type make fontmap to build makeuctb and translation map iso8859-1.
+# Type make makeuctb.exe to build makeuctb only.
+# Type make clean to remove makeuctb and character translation maps.
+# Type make distclean to remove makeuctb, character translation maps
+# and .bak files.
+#
+CFLAGS = $(MCFLAGS)
+
+CC = gcc
+MCFLAGS = -O2 -DDOSPATH \
+-I. \
+-I../../WWW/Library/Implementation \
+-I/djgpp/watt32/inc
+-I../..
+
+.SUFFIXES: .tbl
+#
+# This file contains the font map for the default (hardware) font
+#
+
+FONTMAP_INC = iso01_un.h
+
+TABLES= \
+ cp1250_uni.h \
+ cp1251_uni.h \
+ cp1252_uni.h \
+ cp1253_uni.h \
+ cp1255_uni.h \
+ cp1256_uni.h \
+ cp1257_uni.h \
+ cp437_uni.h \
+ cp737_uni.h \
+ cp775_uni.h \
+ cp850_uni.h \
+ cp852_uni.h \
+ cp857_uni.h \
+ cp862_uni.h \
+ cp864_uni.h \
+ cp866_uni.h \
+ cp866u_uni.h \
+ cp869_uni.h \
+ def7_uni.h \
+ dmcs_uni.h \
+ hp_uni.h \
+ iso01_uni.h \
+ iso02_uni.h \
+ iso03_uni.h \
+ iso04_uni.h \
+ iso05_uni.h \
+ iso06_uni.h \
+ iso07_uni.h \
+ iso08_uni.h \
+ iso09_uni.h \
+ iso10_uni.h \
+ iso13_uni.h \
+ iso14_uni.h \
+ iso15_uni.h \
+ iso16_uni.h \
+ koi8r_uni.h \
+ koi8u_uni.h \
+ mac_uni.h \
+ mnem2_suni.h \
+ mnem_suni.h \
+ next_uni.h \
+ pt154_uni.h \
+ rfc_suni.h \
+ utf8_uni.h \
+ viscii_uni.h
+
+default: $(TABLES)
+
+fontmap: $(FONTMAP_INC)
+
+makeuctb.exe: makeuctb.c UCkd.h
+ $(CC) $(CFLAGS) -o makeuctb.exe makeuctb.c
+ strip makeuctb.exe
+
+.tbl.h:
+ ./makeuctb $*.tbl
+
+cp1250_uni.h: cp1250_uni.tbl makeuctb.exe
+cp1251_uni.h: cp1251_uni.tbl makeuctb.exe
+cp1252_uni.h: cp1252_uni.tbl makeuctb.exe
+cp1253_uni.h: cp1253_uni.tbl makeuctb.exe
+cp1255_uni.h: cp1255_uni.tbl makeuctb.exe
+cp1256_uni.h: cp1256_uni.tbl makeuctb.exe
+cp1257_uni.h: cp1257_uni.tbl makeuctb.exe
+cp437_uni.h: cp437_uni.tbl makeuctb.exe
+cp737_uni.h: cp737_uni.tbl makeuctb.exe
+cp775_uni.h: cp775_uni.tbl makeuctb.exe
+cp850_uni.h: cp850_uni.tbl makeuctb.exe
+cp852_uni.h: cp852_uni.tbl makeuctb.exe
+cp857_uni.h: cp857_uni.tbl makeuctb.exe
+cp862_uni.h: cp862_uni.tbl makeuctb.exe
+cp864_uni.h: cp864_uni.tbl makeuctb.exe
+cp866_uni.h: cp866_uni.tbl makeuctb.exe
+cp866u_uni.h: cp866u_uni.tbl makeuctb.exe
+cp869_uni.h: cp869_uni.tbl makeuctb.exe
+def7_uni.h: def7_uni.tbl makeuctb.exe
+dmcs_uni.h: dmcs_uni.tbl makeuctb.exe
+hp_uni.h: hp_uni.tbl makeuctb.exe
+iso01_uni.h: iso01_uni.tbl makeuctb.exe
+iso02_uni.h: iso02_uni.tbl makeuctb.exe
+iso03_uni.h: iso03_uni.tbl makeuctb.exe
+iso04_uni.h: iso04_uni.tbl makeuctb.exe
+iso05_uni.h: iso05_uni.tbl makeuctb.exe
+iso06_uni.h: iso06_uni.tbl makeuctb.exe
+iso07_uni.h: iso07_uni.tbl makeuctb.exe
+iso08_uni.h: iso08_uni.tbl makeuctb.exe
+iso09_uni.h: iso09_uni.tbl makeuctb.exe
+iso10_uni.h: iso10_uni.tbl makeuctb.exe
+iso13_uni.h: iso13_uni.tbl makeuctb.exe
+iso14_uni.h: iso14_uni.tbl makeuctb.exe
+iso15_uni.h: iso15_uni.tbl makeuctb.exe
+iso16_uni.h: iso16_uni.tbl makeuctb.exe
+koi8r_uni.h: koi8r_uni.tbl makeuctb.exe
+koi8u_uni.h: koi8u_uni.tbl makeuctb.exe
+mac_uni.h: mac_uni.tbl makeuctb.exe
+mnem2_suni.h: mnem2_suni.tbl makeuctb.exe
+mnem_suni.h: mnem_suni.tbl makeuctb.exe
+next_uni.h: next_uni.tbl makeuctb.exe
+pt154_uni.h: pt154_uni.tbl makeuctb.exe
+rfc_suni.h: rfc_suni.tbl makeuctb.exe
+utf8_uni.h: utf8_uni.tbl makeuctb.exe
+viscii_uni.h: viscii_uni.tbl makeuctb.exe
+
+clean:
+ rm -f makeuctb.exe makeuctb *.o *un.h *u.h *c.h *i.h
+
+distclean: clean
+ -rm -f *.bak
+
diff --git a/src/chrtrans/makefile.in b/src/chrtrans/makefile.in
new file mode 100644
index 0000000..8eb4e58
--- /dev/null
+++ b/src/chrtrans/makefile.in
@@ -0,0 +1,201 @@
+# $LynxId: makefile.in,v 1.45 2021/03/14 17:14:26 emil Exp $
+#
+# Makefile for the makeuctb and unicode tables.
+#
+# This may not yet work for the general case.
+# Only some dependencies included.
+#
+SHELL = @CONFIG_SHELL@
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+datarootdir = @datarootdir@
+top_srcdir = @top_srcdir@
+srcdir = @srcdir@
+VPATH = $(srcdir)
+
+top_builddir = ../..
+
+CC = @CC@
+CPP = @CPP@
+CFLAGS = @CFLAGS@ @EXTRA_CPPFLAGS@
+CPPFLAGS = @CPPFLAGS@
+
+WWWINC = WWW/Library/Implementation
+
+SITE_DEFS = # FIXME: set in parent makefile
+
+BUILD_CC = @BUILD_CC@
+BUILD_CPP = @BUILD_CPP@
+BUILD_CFLAGS = @BUILD_CFLAGS@
+BUILD_CPPFLAGS = @BUILD_CPPFLAGS@ @DEFS@
+
+BUILD_LIBS = @BUILD_LIBS@
+BUILD_LDFLAGS = @BUILD_LDFLAGS@
+
+x = @EXEEXT@
+o = .@BUILD_OBJEXT@
+BUILD_EXEEXT = @BUILD_EXEEXT@
+
+CPP_OPTS = \
+ -I$(top_builddir) \
+ -I$(top_srcdir)/src \
+ -I$(top_srcdir)/src/chrtrans \
+ -I$(top_srcdir)/$(WWWINC) \
+ -I$(top_srcdir)/ \
+ $(SITE_DEFS) $(BUILD_CPPFLAGS)
+CC_OPTS = $(CPP_OPTS) $(BUILD_CFLAGS)
+
+LINT = @LINT@
+LINTOPTS = @LINT_OPTS@
+
+CTAGS = @CTAGS@
+
+#
+# This file contains the font map for the default (hardware) font
+#
+
+FONTMAP_INC = iso01_uni.h# default, if not set by recursive call
+
+### fastdep: $(FONTMAP_INC)
+
+MAKEUCTB = makeuctb$(BUILD_EXEEXT)
+
+TABLES= \
+ cp1250_uni.h \
+ cp1251_uni.h \
+ cp1252_uni.h \
+ cp1253_uni.h \
+ cp1255_uni.h \
+ cp1256_uni.h \
+ cp1257_uni.h \
+ cp437_uni.h \
+ cp737_uni.h \
+ cp775_uni.h \
+ cp850_uni.h \
+ cp852_uni.h \
+ cp857_uni.h \
+ cp862_uni.h \
+ cp864_uni.h \
+ cp866_uni.h \
+ cp866u_uni.h \
+ cp869_uni.h \
+ def7_uni.h \
+ dmcs_uni.h \
+ hp_uni.h \
+ iso01_uni.h \
+ iso02_uni.h \
+ iso03_uni.h \
+ iso04_uni.h \
+ iso05_uni.h \
+ iso06_uni.h \
+ iso07_uni.h \
+ iso08_uni.h \
+ iso09_uni.h \
+ iso10_uni.h \
+ iso13_uni.h \
+ iso14_uni.h \
+ iso15_uni.h \
+ iso16_uni.h \
+ koi8r_uni.h \
+ koi8u_uni.h \
+ mac_uni.h \
+ mnem2_suni.h \
+ mnem_suni.h \
+ next_uni.h \
+ next_uni.h \
+ pt154_uni.h \
+ rfc_suni.h \
+ utf8_uni.h \
+ viscii_uni.h
+
+default: $(FONTMAP_INC)
+
+all tables: $(TABLES)
+
+OBJS = makeuctb$o
+C_SRC = $(OBJS:$o=.c)
+
+$(MAKEUCTB) : $(OBJS)
+ $(BUILD_CC) $(CC_OPTS) $(BUILD_LDFLAGS) -o $@ $(OBJS) $(BUILD_LIBS)
+
+makeuctb$o : $(srcdir)/UCkd.h $(srcdir)/makeuctb.c
+
+.SUFFIXES : $o .tbl .i .h
+
+.c$o:
+ @RULE_CC@
+ @ECHO_CC@$(BUILD_CC) $(CC_OPTS) -c $(srcdir)/$*.c
+
+.c.i:
+ @RULE_CC@
+ @ECHO_CC@$(BUILD_CPP) $(CPP_OPTS) $(srcdir)/$*.c >$@
+
+.tbl.h:
+ ./$(MAKEUCTB) $(srcdir)/$*.tbl $*.h
+
+# table files listed here once again to get the make dependencies
+# right, in case makeuctb was recompiled.
+cp1250_uni.h: $(srcdir)/cp1250_uni.tbl $(MAKEUCTB)
+cp1251_uni.h: $(srcdir)/cp1251_uni.tbl $(MAKEUCTB)
+cp1252_uni.h: $(srcdir)/cp1252_uni.tbl $(MAKEUCTB)
+cp1253_uni.h: $(srcdir)/cp1253_uni.tbl $(MAKEUCTB)
+cp1255_uni.h: $(srcdir)/cp1255_uni.tbl $(MAKEUCTB)
+cp1256_uni.h: $(srcdir)/cp1256_uni.tbl $(MAKEUCTB)
+cp1257_uni.h: $(srcdir)/cp1257_uni.tbl $(MAKEUCTB)
+cp437_uni.h: $(srcdir)/cp437_uni.tbl $(MAKEUCTB)
+cp737_uni.h: $(srcdir)/cp737_uni.tbl $(MAKEUCTB)
+cp775_uni.h: $(srcdir)/cp775_uni.tbl $(MAKEUCTB)
+cp850_uni.h: $(srcdir)/cp850_uni.tbl $(MAKEUCTB)
+cp852_uni.h: $(srcdir)/cp852_uni.tbl $(MAKEUCTB)
+cp857_uni.h: $(srcdir)/cp857_uni.tbl $(MAKEUCTB)
+cp862_uni.h: $(srcdir)/cp862_uni.tbl $(MAKEUCTB)
+cp864_uni.h: $(srcdir)/cp864_uni.tbl $(MAKEUCTB)
+cp866_uni.h: $(srcdir)/cp866_uni.tbl $(MAKEUCTB)
+cp866u_uni.h: $(srcdir)/cp866u_uni.tbl $(MAKEUCTB)
+cp869_uni.h: $(srcdir)/cp869_uni.tbl $(MAKEUCTB)
+def7_uni.h: $(srcdir)/def7_uni.tbl $(MAKEUCTB)
+dmcs_uni.h: $(srcdir)/dmcs_uni.tbl $(MAKEUCTB)
+hp_uni.h: $(srcdir)/hp_uni.tbl $(MAKEUCTB)
+iso01_uni.h: $(srcdir)/iso01_uni.tbl $(MAKEUCTB)
+iso02_uni.h: $(srcdir)/iso02_uni.tbl $(MAKEUCTB)
+iso03_uni.h: $(srcdir)/iso03_uni.tbl $(MAKEUCTB)
+iso04_uni.h: $(srcdir)/iso04_uni.tbl $(MAKEUCTB)
+iso05_uni.h: $(srcdir)/iso05_uni.tbl $(MAKEUCTB)
+iso06_uni.h: $(srcdir)/iso06_uni.tbl $(MAKEUCTB)
+iso07_uni.h: $(srcdir)/iso07_uni.tbl $(MAKEUCTB)
+iso08_uni.h: $(srcdir)/iso08_uni.tbl $(MAKEUCTB)
+iso09_uni.h: $(srcdir)/iso09_uni.tbl $(MAKEUCTB)
+iso10_uni.h: $(srcdir)/iso10_uni.tbl $(MAKEUCTB)
+iso13_uni.h: $(srcdir)/iso13_uni.tbl $(MAKEUCTB)
+iso14_uni.h: $(srcdir)/iso14_uni.tbl $(MAKEUCTB)
+iso15_uni.h: $(srcdir)/iso15_uni.tbl $(MAKEUCTB)
+iso16_uni.h: $(srcdir)/iso16_uni.tbl $(MAKEUCTB)
+koi8r_uni.h: $(srcdir)/koi8r_uni.tbl $(MAKEUCTB)
+koi8u_uni.h: $(srcdir)/koi8u_uni.tbl $(MAKEUCTB)
+mac_uni.h: $(srcdir)/mac_uni.tbl $(MAKEUCTB)
+mnem2_suni.h: $(srcdir)/mnem2_suni.tbl $(MAKEUCTB)
+mnem_suni.h: $(srcdir)/mnem_suni.tbl $(MAKEUCTB)
+next_uni.h: $(srcdir)/next_uni.tbl $(MAKEUCTB)
+pt154_uni.h: $(srcdir)/pt154_uni.tbl $(MAKEUCTB)
+rfc_suni.h: $(srcdir)/rfc_suni.tbl $(MAKEUCTB)
+utf8_uni.h: $(srcdir)/utf8_uni.tbl $(MAKEUCTB)
+viscii_uni.h: $(srcdir)/viscii_uni.tbl $(MAKEUCTB)
+
+lint:
+ $(LINT) $(LINTOPTS) $(CPP_OPTS) $(C_SRC) 2>&1 |tee $(top_builddir)/lint.chrtrans
+
+tags:
+ $(CTAGS) *.[ch]
+
+clean:
+ rm -f $(MAKEUCTB) *$o *uni.h *uni2.h *.i
+
+distclean: clean
+ -rm -rf obsolete
+ rm -f core *.bak *.sav *~ *.h_old
+
+depend :
+ makedepend -fmakefile -- $(CPP_OPTS) -- $(C_SRC)
+
+# DO NOT DELETE THIS LINE -- make depend depends on it.
diff --git a/src/chrtrans/makefile.msc b/src/chrtrans/makefile.msc
new file mode 100644
index 0000000..8dd8ace
--- /dev/null
+++ b/src/chrtrans/makefile.msc
@@ -0,0 +1,139 @@
+#
+# Makefile for Microsoft Visual C++ 4.2 or later
+#
+
+CC = cl
+LD = link
+
+INCLUDES = /I "." /I ".." /I "..\.." /I "..\..\WWW\Library\Implementation" /I "..\..\lib"
+DEFS = /D "WIN32_LEAN_AND_MEAN" /D "NDEBUG" /D "__WIN32__" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "_WIN32" /D "NO_FILEIO_H" /D "NO_UNISTD_H" /D "_WINDOWS" /D "DOSPATH"
+CFLAGS = /nologo /MT /W3 /EHsc /O2 /c
+
+MACHINE = i386
+LDFLAGS = /nologo /subsystem:console /incremental:no /machine:$(MACHINE)
+LIBS = user32.lib wsock32.lib
+
+COMPILE = $(CC) $(CFLAGS) $(INCLUDES) $(DEFS)
+LINK = $(LD) $(LDFLAGS) /out:$@
+
+
+.SUFFIXES: .tbl
+#
+# This file contains the font map for the default (hardware) font
+#
+
+FONTMAP_INC = iso01_un.h
+
+TABLES= \
+ cp1250_uni.h \
+ cp1251_uni.h \
+ cp1252_uni.h \
+ cp1253_uni.h \
+ cp1255_uni.h \
+ cp1256_uni.h \
+ cp1257_uni.h \
+ cp437_uni.h \
+ cp737_uni.h \
+ cp775_uni.h \
+ cp850_uni.h \
+ cp852_uni.h \
+ cp857_uni.h \
+ cp862_uni.h \
+ cp864_uni.h \
+ cp866_uni.h \
+ cp866u_uni.h \
+ cp869_uni.h \
+ def7_uni.h \
+ dmcs_uni.h \
+ hp_uni.h \
+ iso01_uni.h \
+ iso02_uni.h \
+ iso03_uni.h \
+ iso04_uni.h \
+ iso05_uni.h \
+ iso06_uni.h \
+ iso07_uni.h \
+ iso08_uni.h \
+ iso09_uni.h \
+ iso10_uni.h \
+ iso13_uni.h \
+ iso14_uni.h \
+ iso15_uni.h \
+ iso16_uni.h \
+ koi8r_uni.h \
+ koi8u_uni.h \
+ mac_uni.h \
+ mnem2_suni.h \
+ mnem_suni.h \
+ next_uni.h \
+ pt154_uni.h \
+ rfc_suni.h \
+ utf8_uni.h \
+ viscii_uni.h
+
+default: $(TABLES)
+
+fontmap: $(FONTMAP_INC)
+
+makeuctb.exe : makeuctb.obj
+ $(LINK) makeuctb.obj $(LIBS)
+
+makeuctb.obj : makeuctb.c
+ $(COMPILE) makeuctb.c
+
+.tbl.h:
+ makeuctb $*.tbl
+
+cp1250_uni.h: cp1250_uni.tbl makeuctb.exe
+cp1251_uni.h: cp1251_uni.tbl makeuctb.exe
+cp1252_uni.h: cp1252_uni.tbl makeuctb.exe
+cp1253_uni.h: cp1253_uni.tbl makeuctb.exe
+cp1255_uni.h: cp1255_uni.tbl makeuctb.exe
+cp1256_uni.h: cp1256_uni.tbl makeuctb.exe
+cp1257_uni.h: cp1257_uni.tbl makeuctb.exe
+cp437_uni.h: cp437_uni.tbl makeuctb.exe
+cp737_uni.h: cp737_uni.tbl makeuctb.exe
+cp775_uni.h: cp775_uni.tbl makeuctb.exe
+cp850_uni.h: cp850_uni.tbl makeuctb.exe
+cp852_uni.h: cp852_uni.tbl makeuctb.exe
+cp857_uni.h: cp857_uni.tbl makeuctb.exe
+cp862_uni.h: cp862_uni.tbl makeuctb.exe
+cp864_uni.h: cp864_uni.tbl makeuctb.exe
+cp866_uni.h: cp866_uni.tbl makeuctb.exe
+cp866u_uni.h: cp866u_uni.tbl makeuctb.exe
+cp869_uni.h: cp869_uni.tbl makeuctb.exe
+def7_uni.h: def7_uni.tbl makeuctb.exe
+dmcs_uni.h: dmcs_uni.tbl makeuctb.exe
+hp_uni.h: hp_uni.tbl makeuctb.exe
+iso01_uni.h: iso01_uni.tbl makeuctb.exe
+iso02_uni.h: iso02_uni.tbl makeuctb.exe
+iso03_uni.h: iso03_uni.tbl makeuctb.exe
+iso04_uni.h: iso04_uni.tbl makeuctb.exe
+iso05_uni.h: iso05_uni.tbl makeuctb.exe
+iso06_uni.h: iso06_uni.tbl makeuctb.exe
+iso07_uni.h: iso07_uni.tbl makeuctb.exe
+iso08_uni.h: iso08_uni.tbl makeuctb.exe
+iso09_uni.h: iso09_uni.tbl makeuctb.exe
+iso10_uni.h: iso10_uni.tbl makeuctb.exe
+iso13_uni.h: iso13_uni.tbl makeuctb.exe
+iso14_uni.h: iso14_uni.tbl makeuctb.exe
+iso15_uni.h: iso15_uni.tbl makeuctb.exe
+iso16_uni.h: iso16_uni.tbl makeuctb.exe
+koi8r_uni.h: koi8r_uni.tbl makeuctb.exe
+koi8u_uni.h: koi8u_uni.tbl makeuctb.exe
+mac_uni.h: mac_uni.tbl makeuctb.exe
+mnem2_suni.h: mnem2_suni.tbl makeuctb.exe
+mnem_suni.h: mnem_suni.tbl makeuctb.exe
+next_uni.h: next_uni.tbl makeuctb.exe
+pt154_uni.h: pt154_uni.tbl makeuctb.exe
+rfc_suni.h: rfc_suni.tbl makeuctb.exe
+utf8_uni.h: utf8_uni.tbl makeuctb.exe
+viscii_uni.h: viscii_uni.tbl makeuctb.exe
+
+clean :
+ - erase *.obj
+ - erase *.exe
+ - for %%i in ( $(TABLES) ) do erase %%i
+
+distclean : clean
+ - erase *.bak
diff --git a/src/chrtrans/makehdrs.bat b/src/chrtrans/makehdrs.bat
new file mode 100644
index 0000000..a349897
--- /dev/null
+++ b/src/chrtrans/makehdrs.bat
@@ -0,0 +1,51 @@
+@rem $LynxId: makehdrs.bat,v 1.2 2021/03/14 17:14:26 emil Exp $
+@echo If .tbl files are added or removed you will need to hand edit
+@echo this batch file.
+@echo .
+@echo off
+
+makeuctb cp1250_uni.tbl
+makeuctb cp1251_uni.tbl
+makeuctb cp1252_uni.tbl
+makeuctb cp1253_uni.tbl
+makeuctb cp1255_uni.tbl
+makeuctb cp1256_uni.tbl
+makeuctb cp1257_uni.tbl
+makeuctb cp437_uni.tbl
+makeuctb cp737_uni.tbl
+makeuctb cp775_uni.tbl
+makeuctb cp850_uni.tbl
+makeuctb cp852_uni.tbl
+makeuctb cp857_uni.tbl
+makeuctb cp862_uni.tbl
+makeuctb cp864_uni.tbl
+makeuctb cp866_uni.tbl
+makeuctb cp866u_uni.tbl
+makeuctb cp869_uni.tbl
+makeuctb def7_uni.tbl
+makeuctb dmcs_uni.tbl
+makeuctb hp_uni.tbl
+makeuctb iso01_uni.tbl
+makeuctb iso02_uni.tbl
+makeuctb iso03_uni.tbl
+makeuctb iso04_uni.tbl
+makeuctb iso05_uni.tbl
+makeuctb iso06_uni.tbl
+makeuctb iso07_uni.tbl
+makeuctb iso08_uni.tbl
+makeuctb iso09_uni.tbl
+makeuctb iso10_uni.tbl
+makeuctb iso13_uni.tbl
+makeuctb iso14_uni.tbl
+makeuctb iso15_uni.tbl
+makeuctb iso16_uni.tbl
+makeuctb koi8r_uni.tbl
+makeuctb koi8u_uni.tbl
+makeuctb mac_uni.tbl
+makeuctb mnem2_suni.tbl
+makeuctb mnem_suni.tbl
+makeuctb next_uni.tbl
+makeuctb pt154_uni.tbl
+makeuctb rfc_suni.tbl
+makeuctb utf8_uni.tbl
+makeuctb viscii_uni.tbl
diff --git a/src/chrtrans/makeuctb.c b/src/chrtrans/makeuctb.c
new file mode 100644
index 0000000..29d43ee
--- /dev/null
+++ b/src/chrtrans/makeuctb.c
@@ -0,0 +1,914 @@
+/*
+ * $LynxId: makeuctb.c,v 1.52 2021/03/22 22:52:58 tom Exp $
+ *
+ * makeuctb.c, derived from conmakehash.c - kw
+ *
+ * Original comments from conmakehash.c:
+ *
+ * Create arrays for initializing the kernel folded tables (using a hash
+ * table turned out to be to limiting...) Unfortunately we can't simply
+ * preinitialize the tables at compile time since kfree() cannot accept
+ * memory not allocated by kmalloc(), and doing our own memory management
+ * just for this seems like massive overkill.
+ *
+ * Copyright (C) 1995 H. Peter Anvin
+ *
+ * This program is a part of the Linux kernel, and may be freely
+ * copied under the terms of the GNU General Public License (GPL),
+ * version 2, or at your option any later version.
+ */
+
+#ifndef HAVE_CONFIG_H
+/* override HTUtils.h fallbacks for cross-compiling */
+#undef HAVE_LSTAT
+#undef NO_FILIO_H
+#define HAVE_LSTAT 1
+#define NO_FILIO_H 1
+#endif
+
+#define DONT_USE_GETTEXT
+#define DONT_USE_SOCKS5
+#include <UCDefs.h>
+#include <UCkd.h>
+
+#ifdef LY_FIND_LEAKS /* CF_ARG_ENABLE(find-leaks) */
+#define FreeLeak(p) FREE(p)
+#else
+#define FreeLeak(p) /* nothing */
+#endif
+
+#define L_CURL '{'
+#define R_CURL '}'
+
+/*
+ * Don't try to use LYexit() since this is a standalone file.
+ */
+#ifdef exit
+#undef exit
+#endif /* exit */
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#define MAX_FONTLEN 256
+
+/*
+ * We don't deal with UCS4 here. - KW
+ */
+typedef u16 unicode;
+
+static FILE *chdr = 0;
+
+/*
+ * Since we may be writing the formatted file to stdout, ensure that we flush
+ * everything before leaving, since some old (and a few not-so-old) platforms
+ * do not properly implement POSIX 'exit()'.
+ */
+static GCC_NORETURN void done(int code);
+
+static void done(int code)
+{
+ if (chdr != 0) {
+ fflush(chdr);
+ fclose(chdr);
+ }
+ fflush(stderr);
+ exit(code);
+}
+
+static void usage(void)
+{
+ static const char *tbl[] =
+ {
+ "Usage: makeuctb [parameters]",
+ "",
+ "Utility to convert .tbl into .h files for Lynx compilation.",
+ "",
+ "Parameters (all are optional):",
+ " 1: the input file (normally {filename}.tbl, but \"-\" for stdin",
+ " 2: the output file (normally {filename}.tbl but \"-\" for stdout",
+ " 3: charset mime name",
+ " 4: charset display name"
+ };
+ unsigned n;
+
+ for (n = 0; n < TABLESIZE(tbl); n++) {
+ fprintf(stderr, "%s\n", tbl[n]);
+ };
+ done(EX_USAGE);
+}
+
+#ifdef USE_ASCII_CTYPES
+static int ascii_tolower(int i)
+{
+ if (91 > i && i > 64)
+ return (i + 32);
+ else
+ return i;
+}
+#endif
+
+/* copied from HTString.c, not everybody has strncasecmp */
+int strncasecomp(const char *a, const char *b, int n)
+{
+ const char *p;
+ const char *q;
+
+ for (p = a, q = b;; p++, q++) {
+ int diff;
+
+ if (p == (a + n))
+ return 0; /* Match up to n characters */
+ if (!(*p && *q))
+ return (*p - *q);
+ diff = TOLOWER(*p) - TOLOWER(*q);
+ if (diff)
+ return diff;
+ }
+ /*NOTREACHED */
+}
+
+static int getunicode(char **p0)
+{
+ char *p = *p0;
+
+ while (*p == ' ' || *p == '\t')
+ p++;
+
+ if (*p == '-') {
+ return -2;
+ } else if (*p != 'U' || p[1] != '+' ||
+ !isxdigit(UCH(p[2])) ||
+ !isxdigit(UCH(p[3])) ||
+ !isxdigit(UCH(p[4])) ||
+ !isxdigit(UCH(p[5])) ||
+ isxdigit(UCH(p[6]))) {
+ return -1;
+ }
+ *p0 = p + 6;
+ return (int) strtol((p + 2), 0, 16);
+}
+
+/*
+ * Massive overkill, but who cares?
+ */
+static unicode unitable[MAX_FONTLEN][255];
+static int unicount[MAX_FONTLEN];
+
+static struct unimapdesc_str themap_str =
+{0, NULL, 0, 0};
+
+static const char *tblname;
+static const char *hdrname;
+
+static int RawOrEnc = 0;
+static int Raw_found = 0; /* whether explicit R directive found */
+static int CodePage = 0;
+
+#define MAX_UNIPAIRS 4500
+
+static void addpair_str(char *str, int un)
+{
+ int i = 0;
+
+ if (un <= 0xfffe) {
+ if (!themap_str.entry_ct) {
+ /*
+ * Initialize the map for replacement strings.
+ */
+ themap_str.entries = (struct unipair_str *) calloc(MAX_UNIPAIRS,
+ sizeof(struct unipair_str));
+
+ if (!themap_str.entries) {
+ fprintf(stderr,
+ "%s: Out of memory\n", tblname);
+ done(EX_DATAERR);
+ }
+ } else {
+ /*
+ * Check that it isn't a duplicate.
+ */
+ for (i = 0; i < themap_str.entry_ct; i++) {
+ if (themap_str.entries[i].unicode == un) {
+ FreeLeak(themap_str.entries[i].replace_str);
+ themap_str.entries[i].replace_str = str;
+ return;
+ }
+ }
+ }
+
+ /*
+ * Add to list.
+ */
+ if (themap_str.entry_ct > MAX_UNIPAIRS - 1) {
+ fprintf(stderr,
+ "ERROR: Only %d unicode replacement strings permitted!\n",
+ MAX_UNIPAIRS);
+ done(EX_DATAERR);
+ }
+ FreeLeak(themap_str.entries[themap_str.entry_ct].replace_str);
+ themap_str.entries[themap_str.entry_ct].unicode = (u16) un;
+ themap_str.entries[themap_str.entry_ct].replace_str = str;
+ themap_str.entry_ct++;
+ }
+ /* otherwise: ignore */
+}
+
+static void addpair(int fp, int un)
+{
+ int i;
+
+ if (!Raw_found) { /* enc not (yet) explicitly given with 'R' */
+ if (fp >= 128) {
+ if (RawOrEnc != UCT_ENC_8BIT && RawOrEnc <= UCT_ENC_8859) {
+ if (fp < 160) { /* cannot be 8859 */
+ RawOrEnc = UCT_ENC_8BIT;
+ } else if (fp != 160 && fp != 173) {
+ RawOrEnc = UCT_ENC_8859; /* hmmm.. more tests needed? */
+ } else if (unicount[fp] == 0 && fp != un) {
+ /* first unicode for fp doesn't map to itself */
+ RawOrEnc = UCT_ENC_8BIT;
+ } else {
+ RawOrEnc = UCT_ENC_8859; /* hmmm.. more tests needed? */
+ }
+ }
+ }
+ }
+ if (un <= 0xfffe) {
+ /*
+ * Check that it isn't a duplicate.
+ */
+ for (i = 0; i < unicount[fp]; i++) {
+ if (unitable[fp][i] == un) {
+ return;
+ }
+ }
+
+ /*
+ * Add to list.
+ */
+ if (unicount[fp] > 254) {
+ fprintf(stderr, "ERROR: Only 255 unicodes/glyph permitted!\n");
+ done(EX_DATAERR);
+ }
+ unitable[fp][unicount[fp]] = (u16) un;
+ unicount[fp]++;
+ }
+ /* otherwise: ignore */
+}
+
+static char this_MIMEcharset[UC_MAXLEN_MIMECSNAME + 1];
+static char this_LYNXcharset[UC_MAXLEN_LYNXCSNAME + 1];
+static char id_append[UC_MAXLEN_ID_APPEND + 1] = "_";
+static int this_isDefaultMap = -1;
+static int useDefaultMap = 1;
+static int lowest_eight = 999;
+
+int main(int argc, char **argv)
+{
+ static const char *first_ifdefs[] =
+ {
+ "/*",
+ " * Compile-in this chunk of code unless we've turned it off specifically",
+ " * or in general (id=%s).",
+ " */",
+ "",
+ "#ifndef INCL_CHARSET%s",
+ "#define INCL_CHARSET%s 1",
+ "",
+ "/*ifdef NO_CHARSET*/",
+ "#ifdef NO_CHARSET",
+ "#undef NO_CHARSET",
+ "#endif",
+ "#define NO_CHARSET 0 /* force default to always be active */",
+ "",
+ "/*ifndef NO_CHARSET%s*/",
+ "#ifndef NO_CHARSET%s",
+ "",
+ "#if ALL_CHARSETS",
+ "#define NO_CHARSET%s 0",
+ "#else",
+ "#define NO_CHARSET%s 1",
+ "#endif",
+ "",
+ "#endif /* ndef(NO_CHARSET%s) */",
+ "",
+ "#if NO_CHARSET%s",
+ "#define UC_CHARSET_SETUP%s /*nothing*/",
+ "#else"
+ };
+ static const char *last_ifdefs[] =
+ {
+ "",
+ "#endif /* NO_CHARSET%s */",
+ "",
+ "#endif /* INCL_CHARSET%s */"
+ };
+
+ FILE *ctbl;
+ char buffer[65536];
+ char *outname = 0;
+ unsigned n;
+ int fontlen;
+ int i, nuni, nent;
+ int fp0 = 0, fp1 = 0, un0, un1;
+ char *p, *p1;
+ char *tbuf = NULL, ch;
+
+ if (argc < 2 || argc > 5) {
+ usage();
+ }
+
+ if (!strcmp(argv[1], "-")) {
+ ctbl = stdin;
+ tblname = "stdin";
+ } else {
+ ctbl = fopen(tblname = argv[1], "r");
+ if (!ctbl) {
+ perror(tblname);
+ done(EX_NOINPUT);
+ }
+ }
+
+ if (argc > 2) {
+ if (!strcmp(argv[2], "-")) {
+ chdr = stdout;
+ hdrname = "stdout";
+ } else {
+ hdrname = argv[2];
+ }
+ } else if (ctbl == stdin) {
+ chdr = stdout;
+ hdrname = "stdout";
+ } else if ((outname = (char *) malloc(strlen(tblname) + 3)) != 0) {
+ strcpy(outname, tblname);
+ hdrname = outname;
+ if ((p = strrchr(outname, '.')) == 0)
+ p = outname + strlen(outname);
+ strcpy(p, ".h");
+ } else {
+ perror("malloc");
+ done(EX_NOINPUT);
+ }
+
+ if (chdr == 0) {
+ chdr = fopen(hdrname, "w");
+ if (!chdr) {
+ perror(hdrname);
+ done(EX_NOINPUT);
+ }
+ }
+
+ /*
+ * For now we assume the default font is always 256 characters.
+ */
+ fontlen = 256;
+
+ /*
+ * Initialize table.
+ */
+ for (i = 0; i < fontlen; i++) {
+ unicount[i] = 0;
+ }
+
+ /*
+ * Now we comes to the tricky part. Parse the input table.
+ */
+ while (fgets(buffer, (int) sizeof(buffer), ctbl) != NULL) {
+ if ((p = StrChr(buffer, '\n')) != NULL) {
+ *p = '\0';
+ } else {
+ fprintf(stderr,
+ "%s: Warning: line too long or incomplete.\n",
+ tblname);
+ }
+
+ /*
+ * Syntax accepted:
+ * <fontpos> <unicode> <unicode> ...
+ * <fontpos> <unicode range> <unicode range> ...
+ * <fontpos> idem
+ * <range> idem
+ * <range> <unicode range>
+ * <unicode> :<replace>
+ * <unicode range> :<replace>
+ * <unicode> "<C replace>"
+ * <unicode range> "<C replace>"
+ *
+ * where <range> ::= <fontpos>-<fontpos>
+ * and <unicode> ::= U+<h><h><h><h>
+ * and <h> ::= <hexadecimal digit>
+ * and <replace> any string not containing '\n' or '\0'
+ * and <C replace> any string with C backslash escapes.
+ */
+ p = buffer;
+ while (*p == ' ' || *p == '\t') {
+ p++;
+ }
+ if (!(*p) || *p == '#') {
+ /*
+ * Skip comment or blank line.
+ */
+ continue;
+ }
+
+ switch (*p) {
+ /*
+ * Raw Unicode? I.e. needs some special
+ * processing. One digit code.
+ */
+ case 'R':
+ if (p[1] == 'a' || p[1] == 'A') {
+ buffer[sizeof(buffer) - 1] = '\0';
+ if (!strncasecomp(p, "RawOrEnc", 8)) {
+ p += 8;
+ }
+ }
+ p++;
+ while (*p == ' ' || *p == '\t') {
+ p++;
+ }
+ RawOrEnc = (int) strtol(p, 0, 10);
+ Raw_found = 1;
+ continue;
+
+ /*
+ * Is this the default table?
+ */
+ case 'D':
+ if (p[1] == 'e' || p[1] == 'E') {
+ buffer[sizeof(buffer) - 1] = '\0';
+ if (!strncasecomp(p, "Default", 7)) {
+ p += 7;
+ }
+ }
+ p++;
+ while (*p == ' ' || *p == '\t') {
+ p++;
+ }
+ this_isDefaultMap = (*p == '1' || TOLOWER(*p) == 'y');
+ continue;
+
+ /*
+ * Is this the default table?
+ */
+ case 'F':
+ if (p[1] == 'a' || p[1] == 'A') {
+ buffer[sizeof(buffer) - 1] = '\0';
+ if (!strncasecomp(p, "FallBack", 8)) {
+ p += 8;
+ }
+ }
+ p++;
+ while (*p == ' ' || *p == '\t') {
+ p++;
+ }
+ useDefaultMap = (*p == '1' || TOLOWER(*p) == 'y');
+ continue;
+
+ case 'M':
+ if (p[1] == 'i' || p[1] == 'I') {
+ buffer[sizeof(buffer) - 1] = '\0';
+ if (!strncasecomp(p, "MIMEName", 8)) {
+ p += 8;
+ }
+ }
+ p++;
+ while (*p == ' ' || *p == '\t') {
+ p++;
+ }
+ sscanf(p, "%40s", this_MIMEcharset);
+ continue;
+
+ /*
+ * Display charset name for options screen.
+ */
+ case 'O':
+ if (p[1] == 'p' || p[1] == 'P') {
+ buffer[sizeof(buffer) - 1] = '\0';
+ if (!strncasecomp(p, "OptionName", 10)) {
+ p += 10;
+ }
+ }
+ p++;
+ while (*p == ' ' || *p == '\t') {
+ p++;
+ }
+ for (i = 0; *p && i < UC_MAXLEN_LYNXCSNAME; p++, i++) {
+ this_LYNXcharset[i] = *p;
+ }
+ this_LYNXcharset[i] = '\0';
+ continue;
+
+ /*
+ * Codepage number. Three or four digit code.
+ */
+ case 'C':
+ if (p[1] == 'o' || p[1] == 'O') {
+ buffer[sizeof(buffer) - 1] = '\0';
+ if (!strncasecomp(p, "CodePage", 8)) {
+ p += 8;
+ }
+ }
+ p++;
+ while (*p == ' ' || *p == '\t') {
+ p++;
+ }
+ CodePage = (int) strtol(p, 0, 10);
+ continue;
+ }
+
+ if (*p == 'U') {
+ un0 = getunicode(&p);
+ if (un0 < 0) {
+ fprintf(stderr, "Bad input line: %s\n", buffer);
+ done(EX_DATAERR);
+ fprintf(stderr,
+ "%s: Bad Unicode range corresponding to font position range 0x%x-0x%x\n",
+ tblname, fp0, fp1);
+ done(EX_DATAERR);
+ }
+ un1 = un0;
+ while (*p == ' ' || *p == '\t') {
+ p++;
+ }
+ if (*p == '-') {
+ p++;
+ while (*p == ' ' || *p == '\t') {
+ p++;
+ }
+ un1 = getunicode(&p);
+ if (un1 < 0 || un1 < un0) {
+ fprintf(stderr,
+ "%s: Bad Unicode range U+%x-U+%x\n",
+ tblname, un0, un1);
+ fprintf(stderr, "Bad input line: %s\n", buffer);
+ done(EX_DATAERR);
+ }
+ while (*p == ' ' || *p == '\t') {
+ p++;
+ }
+ }
+
+ if (*p != ':' && *p != '"') {
+ fprintf(stderr, "No ':' or '\"' where expected: %s\n",
+ buffer);
+ continue;
+ }
+
+ /*
+ * Allocate a string large enough for the worst-case use in the
+ * loop using sprintf.
+ */
+ tbuf = (char *) malloc(5 * strlen(p));
+
+ if (!(p1 = tbuf)) {
+ fprintf(stderr, "%s: Out of memory\n", tblname);
+ done(EX_DATAERR);
+ }
+ if (*p == '"') {
+ /*
+ * Handle "<C replace>".
+ * Copy chars verbatim until first '"' not \-escaped or
+ * end of buffer.
+ */
+ int escaped = 0;
+
+ ch = 0;
+ for (++p; *p != '\0'; p++) {
+ ch = *p;
+ if (escaped) {
+ escaped = 0;
+ } else if (ch == '"') {
+ break;
+ } else if (ch == '\\') {
+ escaped = 1;
+ }
+ *p1++ = ch;
+ }
+ if (escaped || ch != '"') {
+ fprintf(stderr, "Warning: String not terminated: %s\n",
+ buffer);
+ if (escaped)
+ *p1++ = '\n';
+ }
+ } else {
+ /*
+ * We had ':'.
+ */
+ for (++p; *p != '\0'; p++, p1++) {
+ ch = *p;
+ if (UCH(ch) < 32 || ch == '\\' || ch == '\"' ||
+ UCH(ch) >= 127) {
+ sprintf(p1, "\\%.3o", UCH(ch));
+ p1 += 3;
+ } else {
+ *p1 = ch;
+ }
+ }
+ }
+ *p1 = '\0';
+ for (i = un0; i <= un1; i++) {
+ addpair_str(tbuf, i);
+ }
+ continue;
+ }
+
+ /*
+ * Input line (after skipping spaces) doesn't start with one
+ * of the specially recognized characters, so try to interpret
+ * it as starting with a fontpos.
+ */
+ fp0 = (int) strtol(p, &p1, 0);
+ if (p1 == p) {
+ fprintf(stderr, "Bad input line: %s\n", buffer);
+ done(EX_DATAERR);
+ }
+ p = p1;
+
+ while (*p == ' ' || *p == '\t') {
+ p++;
+ }
+ if (*p == '-') {
+ p++;
+ fp1 = (int) strtol(p, &p1, 0);
+ if (p1 == p) {
+ fprintf(stderr, "Bad input line: %s\n", buffer);
+ done(EX_DATAERR);
+ }
+ p = p1;
+ } else {
+ fp1 = 0;
+ }
+
+ if (fp0 < 0 || fp0 >= fontlen) {
+ fprintf(stderr,
+ "%s: Glyph number (0x%x) larger than font length\n",
+ tblname, fp0);
+ done(EX_DATAERR);
+ }
+ if (fp1 && (fp1 < fp0 || fp1 >= fontlen)) {
+ fprintf(stderr,
+ "%s: Bad end of range (0x%x)\n",
+ tblname, fp1);
+ done(EX_DATAERR);
+ }
+
+ if (fp1) {
+ /*
+ * We have a range; expect the word "idem"
+ * or a Unicode range of the same length.
+ */
+ while (*p == ' ' || *p == '\t') {
+ p++;
+ }
+ if (!StrNCmp(p, "idem", 4)) {
+ for (i = fp0; i <= fp1; i++) {
+ addpair(i, i);
+ }
+ p += 4;
+ } else {
+ un0 = getunicode(&p);
+ while (*p == ' ' || *p == '\t') {
+ p++;
+ }
+ if (*p != '-') {
+ fprintf(stderr,
+ "%s: Corresponding to a range of font positions,",
+ tblname);
+ fprintf(stderr,
+ " there should be a Unicode range.\n");
+ done(EX_DATAERR);
+ }
+ p++;
+ un1 = getunicode(&p);
+ if (un0 < 0 || un1 < 0) {
+ fprintf(stderr,
+ "%s: Bad Unicode range corresponding to font position range 0x%x-0x%x\n",
+ tblname, fp0, fp1);
+ done(EX_DATAERR);
+ }
+ if (un1 - un0 != fp1 - fp0) {
+ fprintf(stderr,
+ "%s: Unicode range U+%x-U+%x not of the same length",
+ tblname, un0, un1);
+ fprintf(stderr,
+ " as font position range 0x%x-0x%x\n",
+ fp0, fp1);
+ done(EX_DATAERR);
+ }
+ for (i = fp0; i <= fp1; i++) {
+ addpair(i, un0 - fp0 + i);
+ }
+ }
+ } else {
+ /*
+ * No range; expect a list of unicode values
+ * or unicode ranges for a single font position,
+ * or the word "idem"
+ */
+ while (*p == ' ' || *p == '\t') {
+ p++;
+ }
+ if (!StrNCmp(p, "idem", 4)) {
+ addpair(fp0, fp0);
+ p += 4;
+ }
+ while ((un0 = getunicode(&p)) >= 0) {
+ addpair(fp0, un0);
+ while (*p == ' ' || *p == '\t') {
+ p++;
+ }
+ if (*p == '-') {
+ p++;
+ un1 = getunicode(&p);
+ if (un1 < un0) {
+ fprintf(stderr,
+ "%s: Bad Unicode range 0x%x-0x%x\n",
+ tblname, un0, un1);
+ done(EX_DATAERR);
+ }
+ for (un0++; un0 <= un1; un0++) {
+ addpair(fp0, un0);
+ }
+ }
+ }
+ }
+ while (*p == ' ' || *p == '\t') {
+ p++;
+ }
+ if (*p && *p != '#') {
+ fprintf(stderr, "%s: trailing junk (%s) ignored\n", tblname, p);
+ }
+ }
+
+ /*
+ * Okay, we hit EOF, now output tables.
+ */
+ fclose(ctbl);
+
+ /*
+ * Compute total size of Unicode list.
+ */
+ nuni = 0;
+ for (i = 0; i < fontlen; i++) {
+ nuni += unicount[i];
+ }
+
+ if (argc > 3) {
+ StrNCpy(this_MIMEcharset, argv[3], UC_MAXLEN_MIMECSNAME);
+ } else if (this_MIMEcharset[0] == '\0') {
+ StrNCpy(this_MIMEcharset, tblname, UC_MAXLEN_MIMECSNAME);
+ if ((p = StrChr(this_MIMEcharset, '.')) != 0) {
+ *p = '\0';
+ }
+ }
+ for (p = this_MIMEcharset; *p; p++) {
+ *p = (char) TOLOWER(*p);
+ }
+ if (argc > 4) {
+ StrNCpy(this_LYNXcharset, argv[4], UC_MAXLEN_LYNXCSNAME);
+ } else if (this_LYNXcharset[0] == '\0') {
+ memcpy(this_LYNXcharset, this_MIMEcharset, UC_MAXLEN_LYNXCSNAME);
+ }
+
+ if (this_isDefaultMap == -1) {
+ this_isDefaultMap = !StrNCmp(this_MIMEcharset, "iso-8859-1", 10);
+ }
+ fprintf(stderr,
+ "makeuctb: %s: %stranslation map",
+ this_MIMEcharset, (this_isDefaultMap ? "default " : ""));
+ if (this_isDefaultMap == 1) {
+ *id_append = '\0';
+ } else {
+ for (i = 0, p = this_MIMEcharset;
+ *p && (i < UC_MAXLEN_ID_APPEND - 1);
+ p++, i++) {
+ id_append[i + 1] = (char) (isalnum(UCH(*p)) ? *p : '_');
+ }
+ id_append[i + 1] = '\0';
+ }
+ fprintf(stderr, " (%s).\n", id_append);
+
+ for (n = 0; n < TABLESIZE(first_ifdefs); n++) {
+ fprintf(chdr, first_ifdefs[n], id_append);
+ fprintf(chdr, "\n");
+ }
+
+ fprintf(chdr, "\n\
+/*\n\
+ * uni_hash.tbl\n\
+ *\n\
+ * Do not edit this file; it was automatically generated by\n\
+ *\n\
+ * %s %s\n\
+ *\n\
+ */\n\
+\n\
+static const u8 dfont_unicount%s[%d] = \n\
+%c\n\t", argv[0], argv[1], id_append, fontlen, L_CURL);
+
+ for (i = 0; i < fontlen; i++) {
+ if (i >= 128 && unicount[i] > 0 && i < lowest_eight) {
+ lowest_eight = i;
+ }
+ fprintf(chdr, "%3d", unicount[i]);
+ if (i == (fontlen - 1)) {
+ fprintf(chdr, "\n%c;\n", R_CURL);
+ } else if ((i % 8) == 7) {
+ fprintf(chdr, ",\n\t");
+ } else {
+ fprintf(chdr, ", ");
+ }
+ }
+
+ /*
+ * If lowest_eightbit is anything else but 999,
+ * this can't be 7-bit only.
+ */
+ if (lowest_eight != 999 && !RawOrEnc) {
+ RawOrEnc = UCT_ENC_8BIT;
+ }
+
+ if (nuni) {
+ fprintf(chdr, "\nstatic const u16 dfont_unitable%s[%d] = \n%c\n\t",
+ id_append, nuni, L_CURL);
+ } else {
+ fprintf(chdr,
+ "\nstatic const u16 dfont_unitable%s[1] = {0}; /* dummy */\n", id_append);
+ }
+
+ fp0 = 0;
+ nent = 0;
+ for (i = 0; i < nuni; i++) {
+ while (nent >= unicount[fp0]) {
+ fp0++;
+ nent = 0;
+ }
+ fprintf(chdr, "0x%04x", unitable[fp0][nent++]);
+ if (i == (nuni - 1)) {
+ fprintf(chdr, "\n%c;\n", R_CURL);
+ } else if ((i % 8) == 7) {
+ fprintf(chdr, ",\n\t");
+ } else {
+ fprintf(chdr, ", ");
+ }
+ }
+
+ if (themap_str.entry_ct) {
+ fprintf(chdr, "\n\
+static struct unipair_str repl_map%s[%d] = \n\
+%c\n\t", id_append, themap_str.entry_ct, L_CURL);
+ } else {
+ fprintf(chdr, "\n\
+/* static struct unipair_str repl_map%s[]; */\n", id_append);
+ }
+
+ for (i = 0; i < themap_str.entry_ct; i++) {
+ fprintf(chdr, "%c0x%x,\"%s\"%c",
+ L_CURL,
+ themap_str.entries[i].unicode,
+ themap_str.entries[i].replace_str,
+ R_CURL);
+ if (i == (themap_str.entry_ct - 1)) {
+ fprintf(chdr, "\n%c;\n", R_CURL);
+ } else if ((i % 4) == 3) {
+ fprintf(chdr, ",\n\t");
+ } else {
+ fprintf(chdr, ", ");
+ }
+ }
+ if (themap_str.entry_ct) {
+ fprintf(chdr, "\n\
+static const struct unimapdesc_str dfont_replacedesc%s = %c%d,repl_map%s,",
+ id_append, L_CURL, themap_str.entry_ct, id_append);
+ } else {
+ fprintf(chdr, "\n\
+static const struct unimapdesc_str dfont_replacedesc%s = %c0,NULL,", id_append, L_CURL);
+ }
+ fprintf(chdr, "%d,%d%c;\n",
+ this_isDefaultMap ? 1 : 0,
+ (useDefaultMap && !this_isDefaultMap) ? 1 : 0,
+ R_CURL);
+
+ fprintf(chdr, "#define UC_CHARSET_SETUP%s UC_Charset_Setup(\
+\"%s\",\\\n\"%s\",\\\n\
+dfont_unicount%s,dfont_unitable%s,%d,\\\n\
+dfont_replacedesc%s,%d,%d,%d)\n",
+ id_append, this_MIMEcharset, this_LYNXcharset,
+ id_append, id_append, nuni, id_append, lowest_eight, RawOrEnc, CodePage);
+
+ for (n = 0; n < TABLESIZE(last_ifdefs); n++) {
+ fprintf(chdr, last_ifdefs[n], id_append);
+ fprintf(chdr, "\n");
+ }
+
+ done(EX_OK);
+#ifdef LY_FIND_LEAKS /* CF_ARG_ENABLE(find-leaks) */
+ for (i = 0; i < themap_str.entry_ct; i++) {
+ FreeLeak(themap_str.entries[i].replace_str);
+ }
+#endif
+ return 0;
+}
diff --git a/src/chrtrans/makew32.bat b/src/chrtrans/makew32.bat
new file mode 100644
index 0000000..da47601
--- /dev/null
+++ b/src/chrtrans/makew32.bat
@@ -0,0 +1,13 @@
+@rem $LynxId: makew32.bat,v 1.6 2007/06/28 21:07:24 tom Exp $
+@echo off
+
+if "%1"=="" goto normal
+make -l -f makefile.bcb %1
+goto done
+
+:normal
+make -l -f makefile.bcb
+
+call makehdrs
+
+:done
diff --git a/src/chrtrans/mnem2_suni.tbl b/src/chrtrans/mnem2_suni.tbl
new file mode 100644
index 0000000..3fc122c
--- /dev/null
+++ b/src/chrtrans/mnem2_suni.tbl
@@ -0,0 +1,1865 @@
+#The MIME name of this charset.
+# (this file was renamed from mnemonic_suni.tbl)
+Mmnemonic
+
+#Name as a Display Charset (used on Options screen)
+O RFC 1345 Mnemonic
+
+# Don't fall back to default table for unicode -> 8bit
+Fallback NO
+
+# U+0020:&SP
+U+0021:!
+U+0022:"
+U+0023:&Nb
+U+0024:&DO
+U+0025:%
+U+0026:&&
+U+0027:'
+U+0028:(
+U+0029:)
+U+002a:*
+U+002b:+
+U+002c:,
+U+002d:-
+U+002e:.
+U+002f:/
+U+0030:0
+U+0031:1
+U+0032:2
+U+0033:3
+U+0034:4
+U+0035:5
+U+0036:6
+U+0037:7
+U+0038:8
+U+0039:9
+U+003a::
+U+003b:;
+U+003c:<
+U+003d:=
+U+003e:>
+U+003f:?
+U+0040:&At
+U+0041:A
+U+0042:B
+U+0043:C
+U+0044:D
+U+0045:E
+U+0046:F
+U+0047:G
+U+0048:H
+U+0049:I
+U+004a:J
+U+004b:K
+U+004c:L
+U+004d:M
+U+004e:N
+U+004f:O
+U+0050:P
+U+0051:Q
+U+0052:R
+U+0053:S
+U+0054:T
+U+0055:U
+U+0056:V
+U+0057:W
+U+0058:X
+U+0059:Y
+U+005a:Z
+U+005b:&<(
+U+005c:&//
+U+005d:&)>
+U+005e:&'>
+U+005f:_
+U+0060:&'!
+U+0061:a
+U+0062:b
+U+0063:c
+U+0064:d
+U+0065:e
+U+0066:f
+U+0067:g
+U+0068:h
+U+0069:i
+U+006a:j
+U+006b:k
+U+006c:l
+U+006d:m
+U+006e:n
+U+006f:o
+U+0070:p
+U+0071:q
+U+0072:r
+U+0073:s
+U+0074:t
+U+0075:u
+U+0076:v
+U+0077:w
+U+0078:x
+U+0079:y
+U+007a:z
+U+007b:&(!
+U+007c:&!!
+U+007d:&!)
+U+007e:&'?
+U+00a0:&NS
+U+00a1:&!I
+U+00a2:&Ct
+U+00a3:&Pd
+U+00a4:&Cu
+U+00a5:&Ye
+U+00a6:&BB
+U+00a7:&SE
+U+00a8:&':
+U+00a9:&Co
+U+00aa:&-a
+U+00ab:&<<
+U+00ac:&NO
+U+00ad:&--
+U+00ae:&Rg
+U+00af:&'m
+U+00b0:&DG
+U+00b1:&+-
+U+00b2:&2S
+U+00b3:&3S
+U+00b4:&''
+U+00b5:&My
+U+00b6:&PI
+U+00b7:&.M
+U+00b8:&',
+U+00b9:&1S
+U+00ba:&-o
+U+00bb:&>>
+U+00bc:&14
+U+00bd:&12
+U+00be:&34
+U+00bf:&?I
+U+00c0:&A!
+U+00c1:&A'
+U+00c2:&A>
+U+00c3:&A?
+U+00c4:&A:
+U+00c5:&AA
+U+00c6:&AE
+U+00c7:&C,
+U+00c8:&E!
+U+00c9:&E'
+U+00ca:&E>
+U+00cb:&E:
+U+00cc:&I!
+U+00cd:&I'
+U+00ce:&I>
+U+00cf:&I:
+U+00d0:&D-
+U+00d1:&N?
+U+00d2:&O!
+U+00d3:&O'
+U+00d4:&O>
+U+00d5:&O?
+U+00d6:&O:
+U+00d7:&*X
+U+00d8:&O/
+U+00d9:&U!
+U+00da:&U'
+U+00db:&U>
+U+00dc:&U:
+U+00dd:&Y'
+U+00de:&TH
+U+00df:&ss
+U+00e0:&a!
+U+00e1:&a'
+U+00e2:&a>
+U+00e3:&a?
+U+00e4:&a:
+U+00e5:&aa
+U+00e6:&ae
+U+00e7:&c,
+U+00e8:&e!
+U+00e9:&e'
+U+00ea:&e>
+U+00eb:&e:
+U+00ec:&i!
+U+00ed:&i'
+U+00ee:&i>
+U+00ef:&i:
+U+00f0:&d-
+U+00f1:&n?
+U+00f2:&o!
+U+00f3:&o'
+U+00f4:&o>
+U+00f5:&o?
+U+00f6:&o:
+U+00f7:&-:
+U+00f8:&o/
+U+00f9:&u!
+U+00fa:&u'
+U+00fb:&u>
+U+00fc:&u:
+U+00fd:&y'
+U+00fe:&th
+U+00ff:&y:
+U+0100:&A-
+U+0101:&a-
+U+0102:&A(
+U+0103:&a(
+U+0104:&A;
+U+0105:&a;
+U+0106:&C'
+U+0107:&c'
+U+0108:&C>
+U+0109:&c>
+U+010a:&C.
+U+010b:&c.
+U+010c:&C<
+U+010d:&c<
+U+010e:&D<
+U+010f:&d<
+U+0110:&D/
+U+0111:&d/
+U+0112:&E-
+U+0113:&e-
+U+0114:&E(
+U+0115:&e(
+U+0116:&E.
+U+0117:&e.
+U+0118:&E;
+U+0119:&e;
+U+011a:&E<
+U+011b:&e<
+U+011c:&G>
+U+011d:&g>
+U+011e:&G(
+U+011f:&g(
+U+0120:&G.
+U+0121:&g.
+U+0122:&G,
+U+0123:&g,
+U+0124:&H>
+U+0125:&h>
+U+0126:&H/
+U+0127:&h/
+U+0128:&I?
+U+0129:&i?
+U+012a:&I-
+U+012b:&i-
+U+012c:&I(
+U+012d:&i(
+U+012e:&I;
+U+012f:&i;
+U+0130:&I.
+U+0131:&i.
+U+0132:&IJ
+U+0133:&ij
+U+0134:&J>
+U+0135:&j>
+U+0136:&K,
+U+0137:&k,
+U+0138:&kk
+U+0139:&L'
+U+013a:&l'
+U+013b:&L,
+U+013c:&l,
+U+013d:&L<
+U+013e:&l<
+U+013f:&L.
+U+0140:&l.
+U+0141:&L/
+U+0142:&l/
+U+0143:&N'
+U+0144:&n'
+U+0145:&N,
+U+0146:&n,
+U+0147:&N<
+U+0148:&n<
+U+0149:&'n
+U+014a:&NG
+U+014b:&ng
+U+014c:&O-
+U+014d:&o-
+U+014e:&O(
+U+014f:&o(
+U+0150:&O"
+U+0151:&o"
+U+0152:&OE
+U+0153:&oe
+U+0154:&R'
+U+0155:&r'
+U+0156:&R,
+U+0157:&r,
+U+0158:&R<
+U+0159:&r<
+U+015a:&S'
+U+015b:&s'
+U+015c:&S>
+U+015d:&s>
+U+015e:&S,
+U+015f:&s,
+U+0160:&S<
+U+0161:&s<
+U+0162:&T,
+U+0163:&t,
+U+0164:&T<
+U+0165:&t<
+U+0166:&T/
+U+0167:&t/
+U+0168:&U?
+U+0169:&u?
+U+016a:&U-
+U+016b:&u-
+U+016c:&U(
+U+016d:&u(
+U+016e:&U0
+U+016f:&u0
+U+0170:&U"
+U+0171:&u"
+U+0172:&U;
+U+0173:&u;
+U+0174:&W>
+U+0175:&w>
+U+0176:&Y>
+U+0177:&y>
+U+0178:&Y:
+U+0179:&Z'
+U+017a:&z'
+U+017b:&Z.
+U+017c:&z.
+U+017d:&Z<
+U+017e:&z<
+U+01a0:&O9
+U+01a1:&o9
+U+01a2:&OI
+U+01a3:&oi
+U+01a6:&yr
+U+01af:&U9
+U+01b0:&u9
+U+01b5:&Z/
+U+01b6:&z/
+U+01b7:&ED
+U+01cd:&A<
+U+01ce:&a<
+U+01cf:&I<
+U+01d0:&i<
+U+01d1:&O<
+U+01d2:&o<
+U+01d3:&U<
+U+01d4:&u<
+U+01d5:&_U:-_
+U+01d6:&_u:-_
+U+01d7:&_U:'_
+U+01d8:&_u:'_
+U+01d9:&_U:<_
+U+01da:&_u:<_
+U+01db:&_U:!_
+U+01dc:&_u:!_
+U+01de:&A1
+U+01df:&a1
+U+01e0:&A7
+U+01e1:&a7
+U+01e2:&A3
+U+01e3:&a3
+U+01e4:&G/
+U+01e5:&g/
+U+01e6:&G<
+U+01e7:&g<
+U+01e8:&K<
+U+01e9:&k<
+U+01ea:&O;
+U+01eb:&o;
+U+01ec:&O1
+U+01ed:&o1
+U+01ee:&EZ
+U+01ef:&ez
+U+01f0:&j<
+U+01f4:&G'
+U+01f5:&g'
+U+01fa:&_AA'_
+U+01fb:&_aa'_
+U+01fc:&_AE'_
+U+01fd:&_ae'_
+U+01fe:&_O/'_
+U+01ff:&_o/'_
+U+02bf:&;S
+U+02c7:&'<
+U+02d8:&'(
+U+02d9:&'.
+U+02da:&'0
+U+02db:&';
+U+02dd:&'"
+U+0386:&A%
+U+0388:&E%
+U+0389:&Y%
+U+038a:&I%
+U+038c:&O%
+U+038e:&U%
+U+038f:&W%
+U+0390:&i3
+U+0391:&A*
+U+0392:&B*
+U+0393:&G*
+U+0394:&D*
+U+0395:&E*
+U+0396:&Z*
+U+0397:&Y*
+U+0398:&H*
+U+0399:&I*
+U+039a:&K*
+U+039b:&L*
+U+039c:&M*
+U+039d:&N*
+U+039e:&C*
+U+039f:&O*
+U+03a0:&P*
+U+03a1:&R*
+U+03a3:&S*
+U+03a4:&T*
+U+03a5:&U*
+U+03a6:&F*
+U+03a7:&X*
+U+03a8:&Q*
+U+03a9:&W*
+U+03aa:&J*
+U+03ab:&V*
+U+03ac:&a%
+U+03ad:&e%
+U+03ae:&y%
+U+03af:&i%
+U+03b0:&u3
+U+03b1:&a*
+U+03b2:&b*
+U+03b3:&g*
+U+03b4:&d*
+U+03b5:&e*
+U+03b6:&z*
+U+03b7:&y*
+U+03b8:&h*
+U+03b9:&i*
+U+03ba:&k*
+U+03bb:&l*
+U+03bc:&m*
+U+03bd:&n*
+U+03be:&c*
+U+03bf:&o*
+U+03c0:&p*
+U+03c1:&r*
+U+03c2:&*s
+U+03c3:&s*
+U+03c4:&t*
+U+03c5:&u*
+U+03c6:&f*
+U+03c7:&x*
+U+03c8:&q*
+U+03c9:&w*
+U+03ca:&j*
+U+03cb:&v*
+U+03cc:&o%
+U+03cd:&u%
+U+03ce:&w%
+U+03d8:&'G
+U+03d9:&,G
+U+03da:&T3
+U+03db:&t3
+U+03dc:&M3
+U+03dd:&m3
+U+03de:&K3
+U+03df:&k3
+U+03e0:&P3
+U+03e1:&p3
+U+03f4:&'%
+U+03f5:&j3
+U+0401:&IO
+U+0402:&D%
+U+0403:&G%
+U+0404:&IE
+U+0405:&DS
+U+0406:&II
+U+0407:&YI
+U+0408:&J%
+U+0409:&LJ
+U+040a:&NJ
+U+040b:&Ts
+U+040c:&KJ
+U+040e:&V%
+U+040f:&DZ
+U+0410:&A=
+U+0411:&B=
+U+0412:&V=
+U+0413:&G=
+U+0414:&D=
+U+0415:&E=
+U+0416:&Z%
+U+0417:&Z=
+U+0418:&I=
+U+0419:&J=
+U+041a:&K=
+U+041b:&L=
+U+041c:&M=
+U+041d:&N=
+U+041e:&O=
+U+041f:&P=
+U+0420:&R=
+U+0421:&S=
+U+0422:&T=
+U+0423:&U=
+U+0424:&F=
+U+0425:&H=
+U+0426:&C=
+U+0427:&C%
+U+0428:&S%
+U+0429:&Sc
+U+042a:&="
+U+042b:&Y=
+U+042c:&%"
+U+042d:&JE
+U+042e:&JU
+U+042f:&JA
+U+0430:&a=
+U+0431:&b=
+U+0432:&v=
+U+0433:&g=
+U+0434:&d=
+U+0435:&e=
+U+0436:&z%
+U+0437:&z=
+U+0438:&i=
+U+0439:&j=
+U+043a:&k=
+U+043b:&l=
+U+043c:&m=
+U+043d:&n=
+U+043e:&o=
+U+043f:&p=
+U+0440:&r=
+U+0441:&s=
+U+0442:&t=
+U+0443:&u=
+U+0444:&f=
+U+0445:&h=
+U+0446:&c=
+U+0447:&c%
+U+0448:&s%
+U+0449:&sc
+U+044a:&='
+U+044b:&y=
+U+044c:&%'
+U+044d:&je
+U+044e:&ju
+U+044f:&ja
+U+0451:&io
+U+0452:&d%
+U+0453:&g%
+U+0454:&ie
+U+0455:&ds
+U+0456:&ii
+U+0457:&yi
+U+0458:&j%
+U+0459:&lj
+U+045a:&nj
+U+045b:&ts
+U+045c:&kj
+U+045e:&v%
+U+045f:&dz
+U+0462:&Y3
+U+0463:&y3
+U+046a:&O3
+U+046b:&o3
+U+0472:&F3
+U+0473:&f3
+U+0474:&V3
+U+0475:&v3
+U+0480:&C3
+U+0481:&c3
+U+0490:&G3
+U+0491:&g3
+U+05d0:&A+
+U+05d1:&B+
+U+05d2:&G+
+U+05d3:&D+
+U+05d4:&H+
+U+05d5:&W+
+U+05d6:&Z+
+U+05d7:&X+
+U+05d8:&Tj
+U+05d9:&J+
+U+05da:&K%
+U+05db:&K+
+U+05dc:&L+
+U+05dd:&M%
+U+05de:&M+
+U+05df:&N%
+U+05e0:&N+
+U+05e1:&S+
+U+05e2:&E+
+U+05e3:&P%
+U+05e4:&P+
+U+05e5:&Zj
+U+05e6:&ZJ
+U+05e7:&Q+
+U+05e8:&R+
+U+05e9:&Sh
+U+05ea:&T+
+U+060c:&,+
+U+061b:&;+
+U+061f:&?+
+U+0621:&H'
+U+0622:&aM
+U+0623:&aH
+U+0624:&wH
+U+0625:&ah
+U+0626:&yH
+U+0627:&a+
+U+0628:&b+
+U+0629:&tm
+U+062a:&t+
+U+062b:&tk
+U+062c:&g+
+U+062d:&hk
+U+062e:&x+
+U+062f:&d+
+U+0630:&dk
+U+0631:&r+
+U+0632:&z+
+U+0633:&s+
+U+0634:&sn
+U+0635:&c+
+U+0636:&dd
+U+0637:&tj
+U+0638:&zH
+U+0639:&e+
+U+063a:&i+
+U+0640:&++
+U+0641:&f+
+U+0642:&q+
+U+0643:&k+
+U+0644:&l+
+U+0645:&m+
+U+0646:&n+
+U+0647:&h+
+U+0648:&w+
+U+0649:&j+
+U+064a:&y+
+U+064b:&:+
+U+064c:&"+
+U+064d:&=+
+U+064e:&/+
+U+064f:&'+
+U+0650:&1+
+U+0651:&3+
+U+0652:&0+
+U+0670:&aS
+U+067e:&p+
+U+06a4:&v+
+U+06af:&gf
+U+06f0:&0a
+U+06f1:&1a
+U+06f2:&2a
+U+06f3:&3a
+U+06f4:&4a
+U+06f5:&5a
+U+06f6:&6a
+U+06f7:&7a
+U+06f8:&8a
+U+06f9:&9a
+U+1e00:&_A-0_
+U+1e01:&_a-0_
+U+1e02:&B.
+U+1e03:&b.
+U+1e04:&_B-._
+U+1e05:&_b-._
+U+1e06:&B_
+U+1e07:&b_
+U+1e08:&_C,'_
+U+1e09:&_c,'_
+U+1e0a:&D.
+U+1e0b:&d.
+U+1e0c:&_D-._
+U+1e0d:&_d-._
+U+1e0e:&D_
+U+1e0f:&d_
+U+1e10:&D,
+U+1e11:&d,
+U+1e12:&_D->_
+U+1e13:&_d->_
+U+1e14:&_E-!_
+U+1e15:&_e-!_
+U+1e16:&_E-'_
+U+1e17:&_e-'_
+U+1e18:&_E->_
+U+1e19:&_e->_
+U+1e1a:&_E-?_
+U+1e1b:&_e-?_
+U+1e1c:&_E,(_
+U+1e1d:&_e,(_
+U+1e1e:&F.
+U+1e1f:&f.
+U+1e20:&G-
+U+1e21:&g-
+U+1e22:&H.
+U+1e23:&h.
+U+1e24:&_H-._
+U+1e25:&_h-._
+U+1e26:&H:
+U+1e27:&h:
+U+1e28:&H,
+U+1e29:&h,
+U+1e2a:&_H-(_
+U+1e2b:&_h-(_
+U+1e2c:&_I-?_
+U+1e2d:&_i-?_
+U+1e2e:&_I:'_
+U+1e2f:&_i:'_
+U+1e30:&K'
+U+1e31:&k'
+U+1e32:&_K-._
+U+1e33:&_k-._
+U+1e34:&K_
+U+1e35:&k_
+U+1e36:&_L-._
+U+1e37:&_l-._
+U+1e38:&_L--._
+U+1e39:&_l--._
+U+1e3a:&L_
+U+1e3b:&l_
+U+1e3c:&_L->_
+U+1e3d:&_l->_
+U+1e3e:&M'
+U+1e3f:&m'
+U+1e40:&M.
+U+1e41:&m.
+U+1e42:&_M-._
+U+1e43:&_m-._
+U+1e44:&N.
+U+1e45:&n.
+U+1e46:&_N-._
+U+1e47:&_n-._
+U+1e48:&N_
+U+1e49:&n_
+U+1e4a:&_N->_
+U+1e4b:&_N->_
+U+1e4c:&_O?'_
+U+1e4d:&_o?'_
+U+1e4e:&_O?:_
+U+1e4f:&_o?:_
+U+1e50:&_O-!_
+U+1e51:&_o-!_
+U+1e52:&_O-'_
+U+1e53:&_o-'_
+U+1e54:&P'
+U+1e55:&p'
+U+1e56:&P.
+U+1e57:&p.
+U+1e58:&R.
+U+1e59:&r.
+U+1e5a:&_R-._
+U+1e5b:&_r-._
+U+1e5c:&_R--._
+U+1e5d:&_r--._
+U+1e5e:&R_
+U+1e5f:&r_
+U+1e60:&S.
+U+1e61:&s.
+U+1e62:&_S-._
+U+1e63:&_s-._
+U+1e64:&_S'._
+U+1e65:&_s'._
+U+1e66:&_S<._
+U+1e67:&_s<._
+U+1e68:&_S.-._
+U+1e69:&_S.-._
+U+1e6a:&T.
+U+1e6b:&t.
+U+1e6c:&_T-._
+U+1e6d:&_t-._
+U+1e6e:&T_
+U+1e6f:&t_
+U+1e70:&_T->_
+U+1e71:&_t->_
+U+1e72:&_U--:_
+U+1e73:&_u--:_
+U+1e74:&_U-?_
+U+1e75:&_u-?_
+U+1e76:&_U->_
+U+1e77:&_u->_
+U+1e78:&_U?'_
+U+1e79:&_u?'_
+U+1e7a:&_U-:_
+U+1e7b:&_u-:_
+U+1e7c:&V?
+U+1e7d:&v?
+U+1e7e:&_V-._
+U+1e7f:&_v-._
+U+1e80:&W!
+U+1e81:&w!
+U+1e82:&W'
+U+1e83:&w'
+U+1e84:&W:
+U+1e85:&w:
+U+1e86:&W.
+U+1e87:&w.
+U+1e88:&_W-._
+U+1e89:&_w-._
+U+1e8a:&X.
+U+1e8b:&x.
+U+1e8c:&X:
+U+1e8d:&x:
+U+1e8e:&Y.
+U+1e8f:&y.
+U+1e90:&Z>
+U+1e91:&z>
+U+1e92:&_Z-._
+U+1e93:&_z-._
+U+1e94:&Z_
+U+1e95:&z_
+U+1e96:&h_
+U+1e97:&t:
+U+1e98:&w0
+U+1e99:&y0
+U+1ea0:&_A-._
+U+1ea1:&_a-._
+U+1ea2:&A2
+U+1ea3:&a2
+U+1ea4:&_A>'_
+U+1ea5:&_a>'_
+U+1ea6:&_A>!_
+U+1ea7:&_a>!_
+U+1ea8:&_A>2_
+U+1ea9:&_a>2_
+U+1eaa:&_A>?_
+U+1eab:&_a>?_
+U+1eac:&_A>-._
+U+1ead:&_a>-._
+U+1eae:&_A('_
+U+1eaf:&_a('_
+U+1eb0:&_A(!_
+U+1eb1:&_a(!_
+U+1eb2:&_A(2_
+U+1eb3:&_a(2_
+U+1eb4:&_A(?_
+U+1eb5:&_a(?_
+U+1eb6:&_A(-._
+U+1eb7:&_a(-._
+U+1eb8:&_E-._
+U+1eb9:&_e-._
+U+1eba:&E2
+U+1ebb:&e2
+U+1ebc:&E?
+U+1ebd:&e?
+U+1ebe:&_E>'_
+U+1ebf:&_e>'_
+U+1ec0:&_E>!_
+U+1ec1:&_e>!_
+U+1ec2:&_E>2_
+U+1ec3:&_e>2_
+U+1ec4:&_E>?_
+U+1ec5:&_e>?_
+U+1ec6:&_E>-._
+U+1ec7:&_e>-._
+U+1ec8:&I2
+U+1ec9:&i2
+U+1eca:&_I-._
+U+1ecb:&_i-._
+U+1ecc:&_O-._
+U+1ecd:&_o-._
+U+1ece:&O2
+U+1ecf:&o2
+U+1ed0:&_O>'_
+U+1ed1:&_o>'_
+U+1ed2:&_O>!_
+U+1ed3:&_o>!_
+U+1ed4:&_O>2_
+U+1ed5:&_o>2_
+U+1ed6:&_O>?_
+U+1ed7:&_o>?_
+U+1ed8:&_O>-._
+U+1ed9:&_o>-._
+U+1eda:&_O9'_
+U+1edb:&_o9'_
+U+1edc:&_O9!_
+U+1edd:&_o9!_
+U+1ede:&_O92_
+U+1edf:&_o92_
+U+1ee0:&_O9?_
+U+1ee1:&_o9?_
+U+1ee2:&_O9-._
+U+1ee3:&_o9-._
+U+1ee4:&_U-._
+U+1ee5:&_u-._
+U+1ee6:&U2
+U+1ee7:&u2
+U+1ee8:&_U9'_
+U+1ee9:&_u9'_
+U+1eea:&_U9!_
+U+1eeb:&_u9!_
+U+1eec:&_U92_
+U+1eed:&_u92_
+U+1eee:&_U9?_
+U+1eef:&_u9?_
+U+1ef0:&_U9-._
+U+1ef1:&_u9-._
+U+1ef2:&Y!
+U+1ef3:&y!
+U+1ef4:&_Y-._
+U+1ef5:&_y-._
+U+1ef6:&Y2
+U+1ef7:&y2
+U+1ef8:&Y?
+U+1ef9:&y?
+U+1f00:&;'
+U+1f01:&,'
+U+1f02:&;!
+U+1f03:&,!
+U+1f04:&?;
+U+1f05:&?,
+U+1f06:&!:
+U+1f07:&?:
+U+2002:&1N
+U+2003:&1M
+U+2004:&3M
+U+2005:&4M
+U+2006:&6M
+U+2009:&1T
+U+200a:&1H
+U+2010:&-1
+U+2013:&-N
+U+2014:&-M
+U+2015:&-3
+U+2016:&!2
+U+2017:&=2
+U+2018:&'6
+U+2019:&'9
+U+201a:&.9
+U+201b:&9'
+U+201c:&"6
+U+201d:&"9
+U+201e:&:9
+U+201f:&9"
+U+2020:&/-
+U+2021:&/=
+U+2025:&..
+U+2030:&%0
+U+2032:&1'
+U+2033:&2'
+U+2034:&3'
+U+2035:&1"
+U+2036:&2"
+U+2037:&3"
+U+2038:&Ca
+U+2039:&<1
+U+203a:&>1
+U+203b:&:X
+U+203c:&_!*2_
+U+203e:&'-
+U+2044:&/f
+U+2070:&0S
+U+2074:&4S
+U+2075:&5S
+U+2076:&6S
+U+2077:&7S
+U+2078:&8S
+U+2079:&9S
+U+207a:&+S
+U+207b:&-S
+U+207c:&=S
+U+207d:&(S
+U+207e:&)S
+U+207f:&nS
+U+2080:&0s
+U+2081:&1s
+U+2082:&2s
+U+2083:&3s
+U+2084:&4s
+U+2085:&5s
+U+2086:&6s
+U+2087:&7s
+U+2088:&8s
+U+2089:&9s
+U+208a:&+s
+U+208b:&-s
+U+208c:&=s
+U+208d:&(s
+U+208e:&)s
+U+20a4:&Li
+U+20a7:&Pt
+U+20a9:&W=
+U+2103:&oC
+U+2105:&co
+U+2109:&oF
+U+2116:&N0
+U+2117:&PO
+U+211e:&Rx
+U+2120:&SM
+U+2122:&TM
+U+2126:&Om
+U+212b:&AO
+U+2153:&13
+U+2154:&23
+U+2155:&15
+U+2156:&25
+U+2157:&35
+U+2158:&45
+U+2159:&16
+U+215a:&56
+U+215b:&18
+U+215c:&38
+U+215d:&58
+U+215e:&78
+U+2160:&1R
+U+2161:&2R
+U+2162:&3R
+U+2163:&4R
+U+2164:&5R
+U+2165:&6R
+U+2166:&7R
+U+2167:&8R
+U+2168:&9R
+U+2169:&aR
+U+216a:&bR
+U+216b:&cR
+U+216c:&_50R_
+U+216d:&_100R_
+U+216e:&_500R_
+U+216f:&_1000R_
+U+2170:&1r
+U+2171:&2r
+U+2172:&3r
+U+2173:&4r
+U+2174:&5r
+U+2175:&6r
+U+2176:&7r
+U+2177:&8r
+U+2178:&9r
+U+2179:&ar
+U+217a:&br
+U+217b:&cr
+U+217c:&_50r_
+U+217d:&_100r_
+U+217e:&_500r_
+U+217f:&_1000r_
+U+2180:&_1000RCD_
+U+2181:&_5000R_
+U+2182:&_10000R_
+U+2190:&<-
+U+2191:&-!
+U+2192:&->
+U+2193:&-v
+U+2194:&<>
+U+2195:&UD
+U+2196:&_<!!_
+U+2197:&_//>_
+U+2198:&_!!>_
+U+2199:&_<//_
+U+21d0:&<=
+U+21d2:&=>
+U+21d4:&==
+U+2200:&FA
+U+2202:&dP
+U+2203:&TE
+U+2205:&/0
+U+2206:&DE
+U+2207:&NB
+U+2208:&(-
+U+220b:&-)
+U+220f:&*P
+U+2211:&+Z
+U+2212:&-2
+U+2213:&-+
+U+2217:&*-
+U+2218:&Ob
+U+2219:&Sb
+U+221a:&RT
+U+221d:&0(
+U+221e:&00
+U+221f:&-L
+U+2220:&-V
+U+2225:&PP
+U+2227:&AN
+U+2228:&OR
+U+2229:&(U
+U+222a:&)U
+U+222b:&In
+U+222c:&DI
+U+222e:&Io
+U+2234:&.:
+U+2235:&:.
+U+2236:&:R
+U+2237:&::
+U+223c:&?1
+U+223e:&CG
+U+2243:&?-
+U+2245:&?=
+U+2248:&?2
+U+224c:&=?
+U+2253:&HI
+U+2260:&!=
+U+2261:&=3
+U+2264:&=<
+U+2265:&>=
+U+226a:&<*
+U+226b:&*>
+U+226e:&!<
+U+226f:&!>
+U+2282:&(C
+U+2283:&)C
+U+2286:&(_
+U+2287:&)_
+U+2299:&0.
+U+229a:&02
+U+22a5:&-T
+U+22c5:&.P
+U+22ee:&:3
+U+22ef:&.3
+U+2302:&Eh
+U+2308:&<7
+U+2309:&>7
+U+230a:&7<
+U+230b:&7>
+U+2310:&NI
+U+2312:&(A
+U+2315:&TR
+U+2320:&Iu
+U+2321:&Il
+U+2329:&</
+U+232a:&/>
+U+2423:&Vs
+U+2440:&1h
+U+2441:&3h
+U+2442:&2h
+U+2443:&4h
+U+2446:&1j
+U+2447:&2j
+U+2448:&3j
+U+2449:&4j
+U+2460:&_1-o_
+U+2461:&_2-o_
+U+2462:&_3-o_
+U+2463:&_4-o_
+U+2464:&_5-o_
+U+2465:&_6-o_
+U+2466:&_7-o_
+U+2467:&_8-o_
+U+2468:&_9-o_
+U+2469:&_10-o_
+U+246a:&_11-o_
+U+246b:&_12-o_
+U+246c:&_13-o_
+U+246d:&_14-o_
+U+246e:&_15-o_
+U+246f:&_16-o_
+U+2470:&_17-o_
+U+2471:&_18-o_
+U+2472:&_19-o_
+U+2473:&_20-o_
+U+2474:&_(1)_
+U+2475:&_(2)_
+U+2476:&_(3)_
+U+2477:&_(4)_
+U+2478:&_(5)_
+U+2479:&_(6)_
+U+247a:&_(7)_
+U+247b:&_(8)_
+U+247c:&_(9)_
+U+247d:&_(10)_
+U+247e:&_(11)_
+U+247f:&_(12)_
+U+2480:&_(13)_
+U+2481:&_(14)_
+U+2482:&_(15)_
+U+2483:&_(16)_
+U+2484:&_(17)_
+U+2485:&_(18)_
+U+2486:&_(19)_
+U+2487:&_(20)_
+U+2488:&1.
+U+2489:&2.
+U+248a:&3.
+U+248b:&4.
+U+248c:&5.
+U+248d:&6.
+U+248e:&7.
+U+248f:&8.
+U+2490:&9.
+U+2491:&_10._
+U+2492:&_11._
+U+2493:&_12._
+U+2494:&_13._
+U+2495:&_14._
+U+2496:&_15._
+U+2497:&_16._
+U+2498:&_17._
+U+2499:&_18._
+U+249a:&_19._
+U+249b:&_20._
+U+249c:&_(a)_
+U+249d:&_(b)_
+U+249e:&_(c)_
+U+249f:&_(d)_
+U+24a0:&_(e)_
+U+24a1:&_(f)_
+U+24a2:&_(g)_
+U+24a3:&_(h)_
+U+24a4:&_(i)_
+U+24a5:&_(j)_
+U+24a6:&_(k)_
+U+24a7:&_(l)_
+U+24a8:&_(m)_
+U+24a9:&_(n)_
+U+24aa:&_(o)_
+U+24ab:&_(p)_
+U+24ac:&_(q)_
+U+24ad:&_(r)_
+U+24ae:&_(s)_
+U+24af:&_(t)_
+U+24b0:&_(u)_
+U+24b1:&_(v)_
+U+24b2:&_(w)_
+U+24b3:&_(x)_
+U+24b4:&_(y)_
+U+24b5:&_(z)_
+U+24b6:&_A-o_
+U+24b7:&_B-o_
+U+24b8:&_C-o_
+U+24b9:&_D-o_
+U+24ba:&_E-o_
+U+24bb:&_F-o_
+U+24bc:&_G-o_
+U+24bd:&_H-o_
+U+24be:&_I-o_
+U+24bf:&_J-o_
+U+24c0:&_K-o_
+U+24c1:&_L-o_
+U+24c2:&_M-o_
+U+24c3:&_N-o_
+U+24c4:&_O-o_
+U+24c5:&_P-o_
+U+24c6:&_Q-o_
+U+24c7:&_R-o_
+U+24c8:&_S-o_
+U+24c9:&_T-o_
+U+24ca:&_U-o_
+U+24cb:&_V-o_
+U+24cc:&_W-o_
+U+24cd:&_X-o_
+U+24ce:&_Y-o_
+U+24cf:&_Z-o_
+U+24d0:&_a-o_
+U+24d1:&_b-o_
+U+24d2:&_c-o_
+U+24d3:&_d-o_
+U+24d4:&_e-o_
+U+24d5:&_f-o_
+U+24d6:&_g-o_
+U+24d7:&_h-o_
+U+24d8:&_i-o_
+U+24d9:&_j-o_
+U+24da:&_k-o_
+U+24db:&_l-o_
+U+24dc:&_m-o_
+U+24dd:&_n-o_
+U+24de:&_o-o_
+U+24df:&_p-o_
+U+24e0:&_q-o_
+U+24e1:&_r-o_
+U+24e2:&_s-o_
+U+24e3:&_t-o_
+U+24e4:&_u-o_
+U+24e5:&_v-o_
+U+24e6:&_w-o_
+U+24e7:&_x-o_
+U+24e8:&_y-o_
+U+24e9:&_z-o_
+U+24ea:&_0-o_
+U+2500:&hh
+U+2501:&HH
+U+2502:&vv
+U+2503:&VV
+U+2504:&3-
+U+2505:&3_
+U+2506:&3!
+U+2507:&3/
+U+2508:&4-
+U+2509:&4_
+U+250a:&4!
+U+250b:&4/
+U+250c:&dr
+U+250d:&dR
+U+250e:&Dr
+U+250f:&DR
+U+2510:&dl
+U+2511:&dL
+U+2512:&Dl
+U+2513:&LD
+U+2514:&ur
+U+2515:&uR
+U+2516:&Ur
+U+2517:&UR
+U+2518:&ul
+U+2519:&uL
+U+251a:&Ul
+U+251b:&UL
+U+251c:&vr
+U+251d:&vR
+U+251e:&_Udr_
+U+251f:&_uDr_
+U+2520:&Vr
+U+2521:&_UdR_
+U+2522:&_uDR_
+U+2523:&VR
+U+2524:&vl
+U+2525:&vL
+U+2526:&_Udl_
+U+2527:&_uDl_
+U+2528:&Vl
+U+2529:&_UdL_
+U+252a:&_uDL_
+U+252b:&VL
+U+252c:&dh
+U+252d:&_dLr_
+U+252e:&_dlR_
+U+252f:&dH
+U+2530:&Dh
+U+2531:&_DLr_
+U+2532:&_DlR_
+U+2533:&DH
+U+2534:&uh
+U+2535:&_uLr_
+U+2536:&_ulR_
+U+2537:&uH
+U+2538:&Uh
+U+2539:&_ULr_
+U+253a:&_UlR_
+U+253b:&UH
+U+253c:&vh
+U+253d:&_vLr_
+U+253e:&_vlR_
+U+253f:&vH
+U+2540:&_Udh_
+U+2541:&_uDh_
+U+2542:&Vh
+U+2543:&_UdLr_
+U+2544:&_UdlR_
+U+2545:&_uDLr_
+U+2546:&_uDlR_
+U+2547:&_UdH_
+U+2548:&_uDH_
+U+2549:&_VLr_
+U+254a:&_VlR_
+U+254b:&VH
+U+2571:&FD
+U+2572:&BD
+U+2580:&TB
+U+2584:&LB
+U+2588:&FB
+U+258c:&lB
+U+2590:&RB
+U+2591:&.S
+U+2592:&:S
+U+2593:&?S
+U+25a0:&fS
+U+25a1:&OS
+U+25a2:&RO
+U+25a3:&Rr
+U+25a4:&RF
+U+25a5:&RY
+U+25a6:&RH
+U+25a7:&RZ
+U+25a8:&RK
+U+25a9:&RX
+U+25aa:&sB
+U+25ac:&SR
+U+25ad:&Or
+U+25b2:&UT
+U+25b3:&uT
+U+25b6:&PR
+U+25b7:&Tr
+U+25bc:&Dt
+U+25bd:&dT
+U+25c0:&PL
+U+25c1:&Tl
+U+25c6:&Db
+U+25c7:&Dw
+U+25ca:&LZ
+U+25cb:&0m
+U+25ce:&0o
+U+25cf:&0M
+U+25d0:&0L
+U+25d1:&0R
+U+25d8:&Sn
+U+25d9:&Ic
+U+25e2:&Fd
+U+25e3:&Bd
+U+2605:&*2
+U+2606:&*1
+U+260e:&_TEL_
+U+260f:&_tel_
+U+261c:&<H
+U+261e:&>H
+U+263a:&0u
+U+263b:&0U
+U+263c:&SU
+U+2640:&Fm
+U+2642:&Ml
+U+2660:&cS
+U+2661:&cH
+U+2662:&cD
+U+2663:&cC
+U+2664:&_cS-_
+U+2665:&_cH-_
+U+2666:&_cD-_
+U+2667:&_cC-_
+U+2669:&Md
+U+266a:&M8
+U+266b:&M2
+U+266c:&_M16_
+U+266d:&Mb
+U+266e:&Mx
+U+266f:&MX
+U+2713:&OK
+U+2717:&XX
+U+2720:&-X
+U+3000:&IS
+U+3001:&,_
+U+3002:&._
+U+3003:&+"
+U+3004:&+_
+U+3005:&*_
+U+3006:&;_
+U+3007:&0_
+U+300a:&<+
+U+300b:&>+
+U+300c:&<'
+U+300d:&>'
+U+300e:&<"
+U+300f:&>"
+U+3010:&("
+U+3011:&)"
+U+3012:&=T
+U+3013:&=_
+U+3014:&('
+U+3015:&)'
+U+3016:&(I
+U+3017:&)I
+U+301c:&-?
+U+3020:&_=T:)_
+U+3041:&A5
+U+3042:&a5
+U+3043:&I5
+U+3044:&i5
+U+3045:&U5
+U+3046:&u5
+U+3047:&E5
+U+3048:&e5
+U+3049:&O5
+U+304a:&o5
+U+304b:&ka
+U+304c:&ga
+U+304d:&ki
+U+304e:&gi
+U+304f:&ku
+U+3050:&gu
+U+3051:&ke
+U+3052:&ge
+U+3053:&ko
+U+3054:&go
+U+3055:&sa
+U+3056:&za
+U+3057:&si
+U+3058:&zi
+U+3059:&su
+U+305a:&zu
+U+305b:&se
+U+305c:&ze
+U+305d:&so
+U+305e:&zo
+U+305f:&ta
+U+3060:&da
+U+3061:&ti
+U+3062:&di
+U+3063:&tU
+U+3064:&tu
+U+3065:&du
+U+3066:&te
+U+3067:&de
+U+3068:&to
+U+3069:&do
+U+306a:&na
+U+306b:&ni
+U+306c:&nu
+U+306d:&ne
+U+306e:&no
+U+306f:&ha
+U+3070:&ba
+U+3071:&pa
+U+3072:&hi
+U+3073:&bi
+U+3074:&pi
+U+3075:&hu
+U+3076:&bu
+U+3077:&pu
+U+3078:&he
+U+3079:&be
+U+307a:&pe
+U+307b:&ho
+U+307c:&bo
+U+307d:&po
+U+307e:&ma
+U+307f:&mi
+U+3080:&mu
+U+3081:&me
+U+3082:&mo
+U+3083:&yA
+U+3084:&ya
+U+3085:&yU
+U+3086:&yu
+U+3087:&yO
+U+3088:&yo
+U+3089:&ra
+U+308a:&ri
+U+308b:&ru
+U+308c:&re
+U+308d:&ro
+U+308e:&wA
+U+308f:&wa
+U+3090:&wi
+U+3091:&we
+U+3092:&wo
+U+3093:&n5
+U+3094:&vu
+U+309b:&"5
+U+309c:&05
+U+309d:&*5
+U+309e:&+5
+U+30a1:&a6
+U+30a2:&A6
+U+30a3:&i6
+U+30a4:&I6
+U+30a5:&u6
+U+30a6:&U6
+U+30a7:&e6
+U+30a8:&E6
+U+30a9:&o6
+U+30aa:&O6
+U+30ab:&Ka
+U+30ac:&Ga
+U+30ad:&Ki
+U+30ae:&Gi
+U+30af:&Ku
+U+30b0:&Gu
+U+30b1:&Ke
+U+30b2:&Ge
+U+30b3:&Ko
+U+30b4:&Go
+U+30b5:&Sa
+U+30b6:&Za
+U+30b7:&Si
+U+30b8:&Zi
+U+30b9:&Su
+U+30ba:&Zu
+U+30bb:&Se
+U+30bc:&Ze
+U+30bd:&So
+U+30be:&Zo
+U+30bf:&Ta
+U+30c0:&Da
+U+30c1:&Ti
+U+30c2:&Di
+U+30c3:&TU
+U+30c4:&Tu
+U+30c5:&Du
+U+30c6:&Te
+U+30c7:&De
+U+30c8:&To
+U+30c9:&Do
+U+30ca:&Na
+U+30cb:&Ni
+U+30cc:&Nu
+U+30cd:&Ne
+U+30ce:&No
+U+30cf:&Ha
+U+30d0:&Ba
+U+30d1:&Pa
+U+30d2:&Hi
+U+30d3:&Bi
+U+30d4:&Pi
+U+30d5:&Hu
+U+30d6:&Bu
+U+30d7:&Pu
+U+30d8:&He
+U+30d9:&Be
+U+30da:&Pe
+U+30db:&Ho
+U+30dc:&Bo
+U+30dd:&Po
+U+30de:&Ma
+U+30df:&Mi
+U+30e0:&Mu
+U+30e1:&Me
+U+30e2:&Mo
+U+30e3:&YA
+U+30e4:&Ya
+U+30e5:&YU
+U+30e6:&Yu
+U+30e7:&YO
+U+30e8:&Yo
+U+30e9:&Ra
+U+30ea:&Ri
+U+30eb:&Ru
+U+30ec:&Re
+U+30ed:&Ro
+U+30ee:&WA
+U+30ef:&Wa
+U+30f0:&Wi
+U+30f1:&We
+U+30f2:&Wo
+U+30f3:&N6
+U+30f4:&Vu
+U+30f5:&KA
+U+30f6:&KE
+U+30f7:&Va
+U+30f8:&Vi
+U+30f9:&Ve
+U+30fa:&Vo
+U+30fb:&.6
+U+30fc:&-6
+U+30fd:&*6
+U+30fe:&+6
+U+3105:&b4
+U+3106:&p4
+U+3107:&m4
+U+3108:&f4
+U+3109:&d4
+U+310a:&t4
+U+310b:&n4
+U+310c:&l4
+U+310d:&g4
+U+310e:&k4
+U+310f:&h4
+U+3110:&j4
+U+3111:&q4
+U+3112:&x4
+U+3113:&zh
+U+3114:&ch
+U+3115:&sh
+U+3116:&r4
+U+3117:&z4
+U+3118:&c4
+U+3119:&s4
+U+311a:&a4
+U+311b:&o4
+U+311c:&e4
+U+311d:&_eh4_
+U+311e:&ai
+U+311f:&ei
+U+3120:&au
+U+3121:&ou
+U+3122:&an
+U+3123:&en
+U+3124:&aN
+U+3125:&eN
+U+3126:&er
+U+3127:&i4
+U+3128:&u4
+U+3129:&iu
+U+312a:&v4
+U+312b:&nG
+U+312c:&gn
+U+321c:&_(JU)_
+U+3220:&1c
+U+3221:&2c
+U+3222:&3c
+U+3223:&4c
+U+3224:&5c
+U+3225:&6c
+U+3226:&7c
+U+3227:&8c
+U+3228:&9c
+U+3229:&_10c_
+U+327f:&_KSC_
+U+fb00:&ff
+U+fb01:&fi
+U+fb02:&fl
+U+fb03:&_ffi_
+U+fb04:&_ffl_
+U+fb05:&ft
+U+fb06:&st
+U+fe7d:&_3+;_
+U+fe82:&_aM._
+U+fe84:&_aH._
+U+fe8d:&_a+-_
+U+fe8e:&_a+._
+U+fe8f:&_b+-_
+U+fe90:&_b+,_
+U+fe91:&_b+;_
+U+fe92:&_b+._
+U+fe93:&_tm-_
+U+fe94:&_tm._
+U+fe95:&_t+-_
+U+fe96:&_t+,_
+U+fe97:&_t+;_
+U+fe98:&_t+._
+U+fe99:&_tk-_
+U+fe9a:&_tk,_
+U+fe9b:&_tk;_
+U+fe9c:&_tk._
+U+fe9d:&_g+-_
+U+fe9e:&_g+,_
+U+fe9f:&_g+;_
+U+fea0:&_g+._
+U+fea1:&_hk-_
+U+fea2:&_hk,_
+U+fea3:&_hk;_
+U+fea4:&_hk._
+U+fea5:&_x+-_
+U+fea6:&_x+,_
+U+fea7:&_x+;_
+U+fea8:&_x+._
+U+fea9:&_d+-_
+U+feaa:&_d+._
+U+feab:&_dk-_
+U+feac:&_dk._
+U+fead:&_r+-_
+U+feae:&_r+._
+U+feaf:&_z+-_
+U+feb0:&_z+._
+U+feb1:&_s+-_
+U+feb2:&_s+,_
+U+feb3:&_s+;_
+U+feb4:&_s+._
+U+feb5:&_sn-_
+U+feb6:&_sn,_
+U+feb7:&_sn;_
+U+feb8:&_sn._
+U+feb9:&_c+-_
+U+feba:&_c+,_
+U+febb:&_c+;_
+U+febc:&_c+._
+U+febd:&_dd-_
+U+febe:&_dd,_
+U+febf:&_dd;_
+U+fec0:&_dd._
+U+fec1:&_tj-_
+U+fec2:&_tj,_
+U+fec3:&_tj;_
+U+fec4:&_tj._
+U+fec5:&_zH-_
+U+fec6:&_zH,_
+U+fec7:&_zH;_
+U+fec8:&_zH._
+U+fec9:&_e+-_
+U+feca:&_e+,_
+U+fecb:&_e+;_
+U+fecc:&_e+._
+U+fecd:&_i+-_
+U+fece:&_i+,_
+U+fecf:&_i+;_
+U+fed0:&_i+._
+U+fed1:&_f+-_
+U+fed2:&_f+,_
+U+fed3:&_f+;_
+U+fed4:&_f+._
+U+fed5:&_q+-_
+U+fed6:&_q+,_
+U+fed7:&_q+;_
+U+fed8:&_q+._
+U+fed9:&_k+-_
+U+feda:&_k+,_
+U+fedb:&_k+;_
+U+fedc:&_k+._
+U+fedd:&_l+-_
+U+fede:&_l+,_
+U+fedf:&_l+;_
+U+fee0:&_l+._
+U+fee1:&_m+-_
+U+fee2:&_m+,_
+U+fee3:&_m+;_
+U+fee4:&_m+._
+U+fee5:&_n+-_
+U+fee6:&_n+,_
+U+fee7:&_n+;_
+U+fee8:&_n+._
+U+fee9:&_h+-_
+U+feea:&_h+,_
+U+feeb:&_h+;_
+U+feec:&_h+._
+U+feed:&_w+-_
+U+feee:&_w+._
+U+feef:&_j+-_
+U+fef0:&_j+._
+U+fef1:&_y+-_
+U+fef2:&_y+,_
+U+fef3:&_y+;_
+U+fef4:&_y+._
+U+fef5:&_lM-_
+U+fef6:&_lM._
+U+fef7:&_lH-_
+U+fef8:&_lH._
+U+fef9:&_lh-_
+U+fefa:&_lh._
+U+fefb:&_la-_
+U+fefc:&_la._
+U+0000:&NU
+U+0001:&SH
+U+0002:&SX
+U+0003:&EX
+U+0004:&ET
+U+0005:&EQ
+U+0006:&AK
+U+0007:&BL
+U+0008:&BS
+U+0009:&HT
+# U+000a:&LF
+U+000b:&VT
+U+000c:&FF
+U+000d:&CR
+U+000e:&SO
+U+000f:&SI
+U+0010:&DL
+U+0011:&D1
+U+0012:&D2
+U+0013:&D3
+U+0014:&D4
+U+0015:&NK
+U+0016:&SY
+U+0017:&EB
+U+0018:&CN
+U+0019:&EM
+U+001a:&SB
+U+001b:&EC
+U+001c:&FS
+U+001d:&GS
+U+001e:&RS
+U+001f:&US
+U+007f:&DT
+U+0080:&PA
+U+0081:&HO
+U+0082:&BH
+U+0083:&NH
+U+0084:&IN
+U+0085:&NL
+U+0086:&SA
+U+0087:&ES
+U+0088:&HS
+U+0089:&HJ
+U+008a:&VS
+U+008b:&PD
+U+008c:&PU
+U+008d:&RI
+U+008e:&S2
+U+008f:&S3
+U+0090:&DC
+U+0091:&P1
+U+0092:&P2
+U+0093:&TS
+U+0094:&CC
+U+0095:&MW
+U+0096:&SG
+U+0097:&EG
+U+0098:&SS
+U+0099:&GC
+U+009a:&SC
+U+009b:&CI
+U+009c:&ST
+U+009d:&OC
+U+009e:&PM
+U+009f:&AC
+# Characters in Private Use Area (e000-f8ff) do not have ussigned numbers
+# according Unicode 2.0
diff --git a/src/chrtrans/mnem_suni.tbl b/src/chrtrans/mnem_suni.tbl
new file mode 100644
index 0000000..02bd8ea
--- /dev/null
+++ b/src/chrtrans/mnem_suni.tbl
@@ -0,0 +1,1861 @@
+#The MIME name of this charset.
+Mmnem
+
+#Name as a Display Charset (used on Options screen)
+ORFC1345 Mnem
+
+# U+0020: SP
+U+0021:!
+U+0022:"
+U+0023: Nb
+U+0024: DO
+U+0025:%
+U+0026:&&
+U+0027:'
+U+0028:(
+U+0029:)
+U+002a:*
+U+002b:+
+U+002c:,
+U+002d:-
+U+002e:.
+U+002f:/
+U+0030:0
+U+0031:1
+U+0032:2
+U+0033:3
+U+0034:4
+U+0035:5
+U+0036:6
+U+0037:7
+U+0038:8
+U+0039:9
+U+003a::
+U+003b:;
+U+003c:<
+U+003d:=
+U+003e:>
+U+003f:?
+U+0040: At
+U+0041:A
+U+0042:B
+U+0043:C
+U+0044:D
+U+0045:E
+U+0046:F
+U+0047:G
+U+0048:H
+U+0049:I
+U+004a:J
+U+004b:K
+U+004c:L
+U+004d:M
+U+004e:N
+U+004f:O
+U+0050:P
+U+0051:Q
+U+0052:R
+U+0053:S
+U+0054:T
+U+0055:U
+U+0056:V
+U+0057:W
+U+0058:X
+U+0059:Y
+U+005a:Z
+U+005b: <(
+U+005c: //
+U+005d: )>
+U+005e: '>
+U+005f:_
+U+0060: '!
+U+0061:a
+U+0062:b
+U+0063:c
+U+0064:d
+U+0065:e
+U+0066:f
+U+0067:g
+U+0068:h
+U+0069:i
+U+006a:j
+U+006b:k
+U+006c:l
+U+006d:m
+U+006e:n
+U+006f:o
+U+0070:p
+U+0071:q
+U+0072:r
+U+0073:s
+U+0074:t
+U+0075:u
+U+0076:v
+U+0077:w
+U+0078:x
+U+0079:y
+U+007a:z
+U+007b: (!
+U+007c: !!
+U+007d: !)
+U+007e: '?
+U+00a0: NS
+U+00a1: !I
+U+00a2: Ct
+U+00a3: Pd
+U+00a4: Cu
+U+00a5: Ye
+U+00a6: BB
+U+00a7: SE
+U+00a8: ':
+U+00a9: Co
+U+00aa: -a
+U+00ab: <<
+U+00ac: NO
+U+00ad: --
+U+00ae: Rg
+U+00af: 'm
+U+00b0: DG
+U+00b1: +-
+U+00b2: 2S
+U+00b3: 3S
+U+00b4: ''
+U+00b5: My
+U+00b6: PI
+U+00b7: .M
+U+00b8: ',
+U+00b9: 1S
+U+00ba: -o
+U+00bb: >>
+U+00bc: 14
+U+00bd: 12
+U+00be: 34
+U+00bf: ?I
+U+00c0: A!
+U+00c1: A'
+U+00c2: A>
+U+00c3: A?
+U+00c4: A:
+U+00c5: AA
+U+00c6: AE
+U+00c7: C,
+U+00c8: E!
+U+00c9: E'
+U+00ca: E>
+U+00cb: E:
+U+00cc: I!
+U+00cd: I'
+U+00ce: I>
+U+00cf: I:
+U+00d0: D-
+U+00d1: N?
+U+00d2: O!
+U+00d3: O'
+U+00d4: O>
+U+00d5: O?
+U+00d6: O:
+U+00d7: *X
+U+00d8: O/
+U+00d9: U!
+U+00da: U'
+U+00db: U>
+U+00dc: U:
+U+00dd: Y'
+U+00de: TH
+U+00df: ss
+U+00e0: a!
+U+00e1: a'
+U+00e2: a>
+U+00e3: a?
+U+00e4: a:
+U+00e5: aa
+U+00e6: ae
+U+00e7: c,
+U+00e8: e!
+U+00e9: e'
+U+00ea: e>
+U+00eb: e:
+U+00ec: i!
+U+00ed: i'
+U+00ee: i>
+U+00ef: i:
+U+00f0: d-
+U+00f1: n?
+U+00f2: o!
+U+00f3: o'
+U+00f4: o>
+U+00f5: o?
+U+00f6: o:
+U+00f7: -:
+U+00f8: o/
+U+00f9: u!
+U+00fa: u'
+U+00fb: u>
+U+00fc: u:
+U+00fd: y'
+U+00fe: th
+U+00ff: y:
+U+0100: A-
+U+0101: a-
+U+0102: A(
+U+0103: a(
+U+0104: A;
+U+0105: a;
+U+0106: C'
+U+0107: c'
+U+0108: C>
+U+0109: c>
+U+010a: C.
+U+010b: c.
+U+010c: C<
+U+010d: c<
+U+010e: D<
+U+010f: d<
+U+0110: D/
+U+0111: d/
+U+0112: E-
+U+0113: e-
+U+0114: E(
+U+0115: e(
+U+0116: E.
+U+0117: e.
+U+0118: E;
+U+0119: e;
+U+011a: E<
+U+011b: e<
+U+011c: G>
+U+011d: g>
+U+011e: G(
+U+011f: g(
+U+0120: G.
+U+0121: g.
+U+0122: G,
+U+0123: g,
+U+0124: H>
+U+0125: h>
+U+0126: H/
+U+0127: h/
+U+0128: I?
+U+0129: i?
+U+012a: I-
+U+012b: i-
+U+012c: I(
+U+012d: i(
+U+012e: I;
+U+012f: i;
+U+0130: I.
+U+0131: i.
+U+0132: IJ
+U+0133: ij
+U+0134: J>
+U+0135: j>
+U+0136: K,
+U+0137: k,
+U+0138: kk
+U+0139: L'
+U+013a: l'
+U+013b: L,
+U+013c: l,
+U+013d: L<
+U+013e: l<
+U+013f: L.
+U+0140: l.
+U+0141: L/
+U+0142: l/
+U+0143: N'
+U+0144: n'
+U+0145: N,
+U+0146: n,
+U+0147: N<
+U+0148: n<
+U+0149: 'n
+U+014a: NG
+U+014b: ng
+U+014c: O-
+U+014d: o-
+U+014e: O(
+U+014f: o(
+U+0150: O"
+U+0151: o"
+U+0152: OE
+U+0153: oe
+U+0154: R'
+U+0155: r'
+U+0156: R,
+U+0157: r,
+U+0158: R<
+U+0159: r<
+U+015a: S'
+U+015b: s'
+U+015c: S>
+U+015d: s>
+U+015e: S,
+U+015f: s,
+U+0160: S<
+U+0161: s<
+U+0162: T,
+U+0163: t,
+U+0164: T<
+U+0165: t<
+U+0166: T/
+U+0167: t/
+U+0168: U?
+U+0169: u?
+U+016a: U-
+U+016b: u-
+U+016c: U(
+U+016d: u(
+U+016e: U0
+U+016f: u0
+U+0170: U"
+U+0171: u"
+U+0172: U;
+U+0173: u;
+U+0174: W>
+U+0175: w>
+U+0176: Y>
+U+0177: y>
+U+0178: Y:
+U+0179: Z'
+U+017a: z'
+U+017b: Z.
+U+017c: z.
+U+017d: Z<
+U+017e: z<
+U+01a0: O9
+U+01a1: o9
+U+01a2: OI
+U+01a3: oi
+U+01a6: yr
+U+01af: U9
+U+01b0: u9
+U+01b5: Z/
+U+01b6: z/
+U+01b7: ED
+U+01cd: A<
+U+01ce: a<
+U+01cf: I<
+U+01d0: i<
+U+01d1: O<
+U+01d2: o<
+U+01d3: U<
+U+01d4: u<
+U+01d5: _U:-_
+U+01d6: _u:-_
+U+01d7: _U:'_
+U+01d8: _u:'_
+U+01d9: _U:<_
+U+01da: _u:<_
+U+01db: _U:!_
+U+01dc: _u:!_
+U+01de: A1
+U+01df: a1
+U+01e0: A7
+U+01e1: a7
+U+01e2: A3
+U+01e3: a3
+U+01e4: G/
+U+01e5: g/
+U+01e6: G<
+U+01e7: g<
+U+01e8: K<
+U+01e9: k<
+U+01ea: O;
+U+01eb: o;
+U+01ec: O1
+U+01ed: o1
+U+01ee: EZ
+U+01ef: ez
+U+01f0: j<
+U+01f4: G'
+U+01f5: g'
+U+01fa: _AA'_
+U+01fb: _aa'_
+U+01fc: _AE'_
+U+01fd: _ae'_
+U+01fe: _O/'_
+U+01ff: _o/'_
+U+02bf: ;S
+U+02c7: '<
+U+02d8: '(
+U+02d9: '.
+U+02da: '0
+U+02db: ';
+U+02dd: '"
+U+0386: A%
+U+0388: E%
+U+0389: Y%
+U+038a: I%
+U+038c: O%
+U+038e: U%
+U+038f: W%
+U+0390: i3
+U+0391: A*
+U+0392: B*
+U+0393: G*
+U+0394: D*
+U+0395: E*
+U+0396: Z*
+U+0397: Y*
+U+0398: H*
+U+0399: I*
+U+039a: K*
+U+039b: L*
+U+039c: M*
+U+039d: N*
+U+039e: C*
+U+039f: O*
+U+03a0: P*
+U+03a1: R*
+U+03a3: S*
+U+03a4: T*
+U+03a5: U*
+U+03a6: F*
+U+03a7: X*
+U+03a8: Q*
+U+03a9: W*
+U+03aa: J*
+U+03ab: V*
+U+03ac: a%
+U+03ad: e%
+U+03ae: y%
+U+03af: i%
+U+03b0: u3
+U+03b1: a*
+U+03b2: b*
+U+03b3: g*
+U+03b4: d*
+U+03b5: e*
+U+03b6: z*
+U+03b7: y*
+U+03b8: h*
+U+03b9: i*
+U+03ba: k*
+U+03bb: l*
+U+03bc: m*
+U+03bd: n*
+U+03be: c*
+U+03bf: o*
+U+03c0: p*
+U+03c1: r*
+U+03c2: *s
+U+03c3: s*
+U+03c4: t*
+U+03c5: u*
+U+03c6: f*
+U+03c7: x*
+U+03c8: q*
+U+03c9: w*
+U+03ca: j*
+U+03cb: v*
+U+03cc: o%
+U+03cd: u%
+U+03ce: w%
+U+03d8: 'G
+U+03d9: ,G
+U+03da: T3
+U+03db: t3
+U+03dc: M3
+U+03dd: m3
+U+03de: K3
+U+03df: k3
+U+03e0: P3
+U+03e1: p3
+U+03f4: '%
+U+03f5: j3
+U+0401: IO
+U+0402: D%
+U+0403: G%
+U+0404: IE
+U+0405: DS
+U+0406: II
+U+0407: YI
+U+0408: J%
+U+0409: LJ
+U+040a: NJ
+U+040b: Ts
+U+040c: KJ
+U+040e: V%
+U+040f: DZ
+U+0410: A=
+U+0411: B=
+U+0412: V=
+U+0413: G=
+U+0414: D=
+U+0415: E=
+U+0416: Z%
+U+0417: Z=
+U+0418: I=
+U+0419: J=
+U+041a: K=
+U+041b: L=
+U+041c: M=
+U+041d: N=
+U+041e: O=
+U+041f: P=
+U+0420: R=
+U+0421: S=
+U+0422: T=
+U+0423: U=
+U+0424: F=
+U+0425: H=
+U+0426: C=
+U+0427: C%
+U+0428: S%
+U+0429: Sc
+U+042a: ="
+U+042b: Y=
+U+042c: %"
+U+042d: JE
+U+042e: JU
+U+042f: JA
+U+0430: a=
+U+0431: b=
+U+0432: v=
+U+0433: g=
+U+0434: d=
+U+0435: e=
+U+0436: z%
+U+0437: z=
+U+0438: i=
+U+0439: j=
+U+043a: k=
+U+043b: l=
+U+043c: m=
+U+043d: n=
+U+043e: o=
+U+043f: p=
+U+0440: r=
+U+0441: s=
+U+0442: t=
+U+0443: u=
+U+0444: f=
+U+0445: h=
+U+0446: c=
+U+0447: c%
+U+0448: s%
+U+0449: sc
+U+044a: ='
+U+044b: y=
+U+044c: %'
+U+044d: je
+U+044e: ju
+U+044f: ja
+U+0451: io
+U+0452: d%
+U+0453: g%
+U+0454: ie
+U+0455: ds
+U+0456: ii
+U+0457: yi
+U+0458: j%
+U+0459: lj
+U+045a: nj
+U+045b: ts
+U+045c: kj
+U+045e: v%
+U+045f: dz
+U+0462: Y3
+U+0463: y3
+U+046a: O3
+U+046b: o3
+U+0472: F3
+U+0473: f3
+U+0474: V3
+U+0475: v3
+U+0480: C3
+U+0481: c3
+U+0490: G3
+U+0491: g3
+U+05d0: A+
+U+05d1: B+
+U+05d2: G+
+U+05d3: D+
+U+05d4: H+
+U+05d5: W+
+U+05d6: Z+
+U+05d7: X+
+U+05d8: Tj
+U+05d9: J+
+U+05da: K%
+U+05db: K+
+U+05dc: L+
+U+05dd: M%
+U+05de: M+
+U+05df: N%
+U+05e0: N+
+U+05e1: S+
+U+05e2: E+
+U+05e3: P%
+U+05e4: P+
+U+05e5: Zj
+U+05e6: ZJ
+U+05e7: Q+
+U+05e8: R+
+U+05e9: Sh
+U+05ea: T+
+U+060c: ,+
+U+061b: ;+
+U+061f: ?+
+U+0621: H'
+U+0622: aM
+U+0623: aH
+U+0624: wH
+U+0625: ah
+U+0626: yH
+U+0627: a+
+U+0628: b+
+U+0629: tm
+U+062a: t+
+U+062b: tk
+U+062c: g+
+U+062d: hk
+U+062e: x+
+U+062f: d+
+U+0630: dk
+U+0631: r+
+U+0632: z+
+U+0633: s+
+U+0634: sn
+U+0635: c+
+U+0636: dd
+U+0637: tj
+U+0638: zH
+U+0639: e+
+U+063a: i+
+U+0640: ++
+U+0641: f+
+U+0642: q+
+U+0643: k+
+U+0644: l+
+U+0645: m+
+U+0646: n+
+U+0647: h+
+U+0648: w+
+U+0649: j+
+U+064a: y+
+U+064b: :+
+U+064c: "+
+U+064d: =+
+U+064e: /+
+U+064f: '+
+U+0650: 1+
+U+0651: 3+
+U+0652: 0+
+U+0670: aS
+U+067e: p+
+U+06a4: v+
+U+06af: gf
+U+06f0: 0a
+U+06f1: 1a
+U+06f2: 2a
+U+06f3: 3a
+U+06f4: 4a
+U+06f5: 5a
+U+06f6: 6a
+U+06f7: 7a
+U+06f8: 8a
+U+06f9: 9a
+U+1e00: _A-0_
+U+1e01: _a-0_
+U+1e02: B.
+U+1e03: b.
+U+1e04: _B-._
+U+1e05: _b-._
+U+1e06: B_
+U+1e07: b_
+U+1e08: _C,'_
+U+1e09: _c,'_
+U+1e0a: D.
+U+1e0b: d.
+U+1e0c: _D-._
+U+1e0d: _d-._
+U+1e0e: D_
+U+1e0f: d_
+U+1e10: D,
+U+1e11: d,
+U+1e12: _D->_
+U+1e13: _d->_
+U+1e14: _E-!_
+U+1e15: _e-!_
+U+1e16: _E-'_
+U+1e17: _e-'_
+U+1e18: _E->_
+U+1e19: _e->_
+U+1e1a: _E-?_
+U+1e1b: _e-?_
+U+1e1c: _E,(_
+U+1e1d: _e,(_
+U+1e1e: F.
+U+1e1f: f.
+U+1e20: G-
+U+1e21: g-
+U+1e22: H.
+U+1e23: h.
+U+1e24: _H-._
+U+1e25: _h-._
+U+1e26: H:
+U+1e27: h:
+U+1e28: H,
+U+1e29: h,
+U+1e2a: _H-(_
+U+1e2b: _h-(_
+U+1e2c: _I-?_
+U+1e2d: _i-?_
+U+1e2e: _I:'_
+U+1e2f: _i:'_
+U+1e30: K'
+U+1e31: k'
+U+1e32: _K-._
+U+1e33: _k-._
+U+1e34: K_
+U+1e35: k_
+U+1e36: _L-._
+U+1e37: _l-._
+U+1e38: _L--._
+U+1e39: _l--._
+U+1e3a: L_
+U+1e3b: l_
+U+1e3c: _L->_
+U+1e3d: _l->_
+U+1e3e: M'
+U+1e3f: m'
+U+1e40: M.
+U+1e41: m.
+U+1e42: _M-._
+U+1e43: _m-._
+U+1e44: N.
+U+1e45: n.
+U+1e46: _N-._
+U+1e47: _n-._
+U+1e48: N_
+U+1e49: n_
+U+1e4a: _N->_
+U+1e4b: _N->_
+U+1e4c: _O?'_
+U+1e4d: _o?'_
+U+1e4e: _O?:_
+U+1e4f: _o?:_
+U+1e50: _O-!_
+U+1e51: _o-!_
+U+1e52: _O-'_
+U+1e53: _o-'_
+U+1e54: P'
+U+1e55: p'
+U+1e56: P.
+U+1e57: p.
+U+1e58: R.
+U+1e59: r.
+U+1e5a: _R-._
+U+1e5b: _r-._
+U+1e5c: _R--._
+U+1e5d: _r--._
+U+1e5e: R_
+U+1e5f: r_
+U+1e60: S.
+U+1e61: s.
+U+1e62: _S-._
+U+1e63: _s-._
+U+1e64: _S'._
+U+1e65: _s'._
+U+1e66: _S<._
+U+1e67: _s<._
+U+1e68: _S.-._
+U+1e69: _S.-._
+U+1e6a: T.
+U+1e6b: t.
+U+1e6c: _T-._
+U+1e6d: _t-._
+U+1e6e: T_
+U+1e6f: t_
+U+1e70: _T->_
+U+1e71: _t->_
+U+1e72: _U--:_
+U+1e73: _u--:_
+U+1e74: _U-?_
+U+1e75: _u-?_
+U+1e76: _U->_
+U+1e77: _u->_
+U+1e78: _U?'_
+U+1e79: _u?'_
+U+1e7a: _U-:_
+U+1e7b: _u-:_
+U+1e7c: V?
+U+1e7d: v?
+U+1e7e: _V-._
+U+1e7f: _v-._
+U+1e80: W!
+U+1e81: w!
+U+1e82: W'
+U+1e83: w'
+U+1e84: W:
+U+1e85: w:
+U+1e86: W.
+U+1e87: w.
+U+1e88: _W-._
+U+1e89: _w-._
+U+1e8a: X.
+U+1e8b: x.
+U+1e8c: X:
+U+1e8d: x:
+U+1e8e: Y.
+U+1e8f: y.
+U+1e90: Z>
+U+1e91: z>
+U+1e92: _Z-._
+U+1e93: _z-._
+U+1e94: Z_
+U+1e95: z_
+U+1e96: h_
+U+1e97: t:
+U+1e98: w0
+U+1e99: y0
+U+1ea0: _A-._
+U+1ea1: _a-._
+U+1ea2: A2
+U+1ea3: a2
+U+1ea4: _A>'_
+U+1ea5: _a>'_
+U+1ea6: _A>!_
+U+1ea7: _a>!_
+U+1ea8: _A>2_
+U+1ea9: _a>2_
+U+1eaa: _A>?_
+U+1eab: _a>?_
+U+1eac: _A>-._
+U+1ead: _a>-._
+U+1eae: _A('_
+U+1eaf: _a('_
+U+1eb0: _A(!_
+U+1eb1: _a(!_
+U+1eb2: _A(2_
+U+1eb3: _a(2_
+U+1eb4: _A(?_
+U+1eb5: _a(?_
+U+1eb6: _A(-._
+U+1eb7: _a(-._
+U+1eb8: _E-._
+U+1eb9: _e-._
+U+1eba: E2
+U+1ebb: e2
+U+1ebc: E?
+U+1ebd: e?
+U+1ebe: _E>'_
+U+1ebf: _e>'_
+U+1ec0: _E>!_
+U+1ec1: _e>!_
+U+1ec2: _E>2_
+U+1ec3: _e>2_
+U+1ec4: _E>?_
+U+1ec5: _e>?_
+U+1ec6: _E>-._
+U+1ec7: _e>-._
+U+1ec8: I2
+U+1ec9: i2
+U+1eca: _I-._
+U+1ecb: _i-._
+U+1ecc: _O-._
+U+1ecd: _o-._
+U+1ece: O2
+U+1ecf: o2
+U+1ed0: _O>'_
+U+1ed1: _o>'_
+U+1ed2: _O>!_
+U+1ed3: _o>!_
+U+1ed4: _O>2_
+U+1ed5: _o>2_
+U+1ed6: _O>?_
+U+1ed7: _o>?_
+U+1ed8: _O>-._
+U+1ed9: _o>-._
+U+1eda: _O9'_
+U+1edb: _o9'_
+U+1edc: _O9!_
+U+1edd: _o9!_
+U+1ede: _O92_
+U+1edf: _o92_
+U+1ee0: _O9?_
+U+1ee1: _o9?_
+U+1ee2: _O9-._
+U+1ee3: _o9-._
+U+1ee4: _U-._
+U+1ee5: _u-._
+U+1ee6: U2
+U+1ee7: u2
+U+1ee8: _U9'_
+U+1ee9: _u9'_
+U+1eea: _U9!_
+U+1eeb: _u9!_
+U+1eec: _U92_
+U+1eed: _u92_
+U+1eee: _U9?_
+U+1eef: _u9?_
+U+1ef0: _U9-._
+U+1ef1: _u9-._
+U+1ef2: Y!
+U+1ef3: y!
+U+1ef4: _Y-._
+U+1ef5: _y-._
+U+1ef6: Y2
+U+1ef7: y2
+U+1ef8: Y?
+U+1ef9: y?
+U+1f00: ;'
+U+1f01: ,'
+U+1f02: ;!
+U+1f03: ,!
+U+1f04: ?;
+U+1f05: ?,
+U+1f06: !:
+U+1f07: ?:
+U+2002: 1N
+U+2003: 1M
+U+2004: 3M
+U+2005: 4M
+U+2006: 6M
+U+2009: 1T
+U+200a: 1H
+U+2010: -1
+U+2013: -N
+U+2014: -M
+U+2015: -3
+U+2016: !2
+U+2017: =2
+U+2018: '6
+U+2019: '9
+U+201a: .9
+U+201b: 9'
+U+201c: "6
+U+201d: "9
+U+201e: :9
+U+201f: 9"
+U+2020: /-
+U+2021: /=
+U+2025: ..
+U+2030: %0
+U+2032: 1'
+U+2033: 2'
+U+2034: 3'
+U+2035: 1"
+U+2036: 2"
+U+2037: 3"
+U+2038: Ca
+U+2039: <1
+U+203a: >1
+U+203b: :X
+U+203c: _!*2_
+U+203e: '-
+U+2044: /f
+U+2070: 0S
+U+2074: 4S
+U+2075: 5S
+U+2076: 6S
+U+2077: 7S
+U+2078: 8S
+U+2079: 9S
+U+207a: +S
+U+207b: -S
+U+207c: =S
+U+207d: (S
+U+207e: )S
+U+207f: nS
+U+2080: 0s
+U+2081: 1s
+U+2082: 2s
+U+2083: 3s
+U+2084: 4s
+U+2085: 5s
+U+2086: 6s
+U+2087: 7s
+U+2088: 8s
+U+2089: 9s
+U+208a: +s
+U+208b: -s
+U+208c: =s
+U+208d: (s
+U+208e: )s
+U+20a4: Li
+U+20a7: Pt
+U+20a9: W=
+U+2103: oC
+U+2105: co
+U+2109: oF
+U+2116: N0
+U+2117: PO
+U+211e: Rx
+U+2120: SM
+U+2122: TM
+U+2126: Om
+U+212b: AO
+U+2153: 13
+U+2154: 23
+U+2155: 15
+U+2156: 25
+U+2157: 35
+U+2158: 45
+U+2159: 16
+U+215a: 56
+U+215b: 18
+U+215c: 38
+U+215d: 58
+U+215e: 78
+U+2160: 1R
+U+2161: 2R
+U+2162: 3R
+U+2163: 4R
+U+2164: 5R
+U+2165: 6R
+U+2166: 7R
+U+2167: 8R
+U+2168: 9R
+U+2169: aR
+U+216a: bR
+U+216b: cR
+U+216c: _50R_
+U+216d: _100R_
+U+216e: _500R_
+U+216f: _1000R_
+U+2170: 1r
+U+2171: 2r
+U+2172: 3r
+U+2173: 4r
+U+2174: 5r
+U+2175: 6r
+U+2176: 7r
+U+2177: 8r
+U+2178: 9r
+U+2179: ar
+U+217a: br
+U+217b: cr
+U+217c: _50r_
+U+217d: _100r_
+U+217e: _500r_
+U+217f: _1000r_
+U+2180: _1000RCD_
+U+2181: _5000R_
+U+2182: _10000R_
+U+2190: <-
+U+2191: -!
+U+2192: ->
+U+2193: -v
+U+2194: <>
+U+2195: UD
+U+2196: _<!!_
+U+2197: _//>_
+U+2198: _!!>_
+U+2199: _<//_
+U+21d0: <=
+U+21d2: =>
+U+21d4: ==
+U+2200: FA
+U+2202: dP
+U+2203: TE
+U+2205: /0
+U+2206: DE
+U+2207: NB
+U+2208: (-
+U+220b: -)
+U+220f: *P
+U+2211: +Z
+U+2212: -2
+U+2213: -+
+U+2217: *-
+U+2218: Ob
+U+2219: Sb
+U+221a: RT
+U+221d: 0(
+U+221e: 00
+U+221f: -L
+U+2220: -V
+U+2225: PP
+U+2227: AN
+U+2228: OR
+U+2229: (U
+U+222a: )U
+U+222b: In
+U+222c: DI
+U+222e: Io
+U+2234: .:
+U+2235: :.
+U+2236: :R
+U+2237: ::
+U+223c: ?1
+U+223e: CG
+U+2243: ?-
+U+2245: ?=
+U+2248: ?2
+U+224c: =?
+U+2253: HI
+U+2260: !=
+U+2261: =3
+U+2264: =<
+U+2265: >=
+U+226a: <*
+U+226b: *>
+U+226e: !<
+U+226f: !>
+U+2282: (C
+U+2283: )C
+U+2286: (_
+U+2287: )_
+U+2299: 0.
+U+229a: 02
+U+22a5: -T
+U+22c5: .P
+U+22ee: :3
+U+22ef: .3
+U+2302: Eh
+U+2308: <7
+U+2309: >7
+U+230a: 7<
+U+230b: 7>
+U+2310: NI
+U+2312: (A
+U+2315: TR
+U+2320: Iu
+U+2321: Il
+U+2329: </
+U+232a: />
+U+2423: Vs
+U+2440: 1h
+U+2441: 3h
+U+2442: 2h
+U+2443: 4h
+U+2446: 1j
+U+2447: 2j
+U+2448: 3j
+U+2449: 4j
+U+2460: _1-o_
+U+2461: _2-o_
+U+2462: _3-o_
+U+2463: _4-o_
+U+2464: _5-o_
+U+2465: _6-o_
+U+2466: _7-o_
+U+2467: _8-o_
+U+2468: _9-o_
+U+2469: _10-o_
+U+246a: _11-o_
+U+246b: _12-o_
+U+246c: _13-o_
+U+246d: _14-o_
+U+246e: _15-o_
+U+246f: _16-o_
+U+2470: _17-o_
+U+2471: _18-o_
+U+2472: _19-o_
+U+2473: _20-o_
+U+2474: _(1)_
+U+2475: _(2)_
+U+2476: _(3)_
+U+2477: _(4)_
+U+2478: _(5)_
+U+2479: _(6)_
+U+247a: _(7)_
+U+247b: _(8)_
+U+247c: _(9)_
+U+247d: _(10)_
+U+247e: _(11)_
+U+247f: _(12)_
+U+2480: _(13)_
+U+2481: _(14)_
+U+2482: _(15)_
+U+2483: _(16)_
+U+2484: _(17)_
+U+2485: _(18)_
+U+2486: _(19)_
+U+2487: _(20)_
+U+2488: 1.
+U+2489: 2.
+U+248a: 3.
+U+248b: 4.
+U+248c: 5.
+U+248d: 6.
+U+248e: 7.
+U+248f: 8.
+U+2490: 9.
+U+2491: _10._
+U+2492: _11._
+U+2493: _12._
+U+2494: _13._
+U+2495: _14._
+U+2496: _15._
+U+2497: _16._
+U+2498: _17._
+U+2499: _18._
+U+249a: _19._
+U+249b: _20._
+U+249c: _(a)_
+U+249d: _(b)_
+U+249e: _(c)_
+U+249f: _(d)_
+U+24a0: _(e)_
+U+24a1: _(f)_
+U+24a2: _(g)_
+U+24a3: _(h)_
+U+24a4: _(i)_
+U+24a5: _(j)_
+U+24a6: _(k)_
+U+24a7: _(l)_
+U+24a8: _(m)_
+U+24a9: _(n)_
+U+24aa: _(o)_
+U+24ab: _(p)_
+U+24ac: _(q)_
+U+24ad: _(r)_
+U+24ae: _(s)_
+U+24af: _(t)_
+U+24b0: _(u)_
+U+24b1: _(v)_
+U+24b2: _(w)_
+U+24b3: _(x)_
+U+24b4: _(y)_
+U+24b5: _(z)_
+U+24b6: _A-o_
+U+24b7: _B-o_
+U+24b8: _C-o_
+U+24b9: _D-o_
+U+24ba: _E-o_
+U+24bb: _F-o_
+U+24bc: _G-o_
+U+24bd: _H-o_
+U+24be: _I-o_
+U+24bf: _J-o_
+U+24c0: _K-o_
+U+24c1: _L-o_
+U+24c2: _M-o_
+U+24c3: _N-o_
+U+24c4: _O-o_
+U+24c5: _P-o_
+U+24c6: _Q-o_
+U+24c7: _R-o_
+U+24c8: _S-o_
+U+24c9: _T-o_
+U+24ca: _U-o_
+U+24cb: _V-o_
+U+24cc: _W-o_
+U+24cd: _X-o_
+U+24ce: _Y-o_
+U+24cf: _Z-o_
+U+24d0: _a-o_
+U+24d1: _b-o_
+U+24d2: _c-o_
+U+24d3: _d-o_
+U+24d4: _e-o_
+U+24d5: _f-o_
+U+24d6: _g-o_
+U+24d7: _h-o_
+U+24d8: _i-o_
+U+24d9: _j-o_
+U+24da: _k-o_
+U+24db: _l-o_
+U+24dc: _m-o_
+U+24dd: _n-o_
+U+24de: _o-o_
+U+24df: _p-o_
+U+24e0: _q-o_
+U+24e1: _r-o_
+U+24e2: _s-o_
+U+24e3: _t-o_
+U+24e4: _u-o_
+U+24e5: _v-o_
+U+24e6: _w-o_
+U+24e7: _x-o_
+U+24e8: _y-o_
+U+24e9: _z-o_
+U+24ea: _0-o_
+U+2500: hh
+U+2501: HH
+U+2502: vv
+U+2503: VV
+U+2504: 3-
+U+2505: 3_
+U+2506: 3!
+U+2507: 3/
+U+2508: 4-
+U+2509: 4_
+U+250a: 4!
+U+250b: 4/
+U+250c: dr
+U+250d: dR
+U+250e: Dr
+U+250f: DR
+U+2510: dl
+U+2511: dL
+U+2512: Dl
+U+2513: LD
+U+2514: ur
+U+2515: uR
+U+2516: Ur
+U+2517: UR
+U+2518: ul
+U+2519: uL
+U+251a: Ul
+U+251b: UL
+U+251c: vr
+U+251d: vR
+U+251e: _Udr_
+U+251f: _uDr_
+U+2520: Vr
+U+2521: _UdR_
+U+2522: _uDR_
+U+2523: VR
+U+2524: vl
+U+2525: vL
+U+2526: _Udl_
+U+2527: _uDl_
+U+2528: Vl
+U+2529: _UdL_
+U+252a: _uDL_
+U+252b: VL
+U+252c: dh
+U+252d: _dLr_
+U+252e: _dlR_
+U+252f: dH
+U+2530: Dh
+U+2531: _DLr_
+U+2532: _DlR_
+U+2533: DH
+U+2534: uh
+U+2535: _uLr_
+U+2536: _ulR_
+U+2537: uH
+U+2538: Uh
+U+2539: _ULr_
+U+253a: _UlR_
+U+253b: UH
+U+253c: vh
+U+253d: _vLr_
+U+253e: _vlR_
+U+253f: vH
+U+2540: _Udh_
+U+2541: _uDh_
+U+2542: Vh
+U+2543: _UdLr_
+U+2544: _UdlR_
+U+2545: _uDLr_
+U+2546: _uDlR_
+U+2547: _UdH_
+U+2548: _uDH_
+U+2549: _VLr_
+U+254a: _VlR_
+U+254b: VH
+U+2571: FD
+U+2572: BD
+U+2580: TB
+U+2584: LB
+U+2588: FB
+U+258c: lB
+U+2590: RB
+U+2591: .S
+U+2592: :S
+U+2593: ?S
+U+25a0: fS
+U+25a1: OS
+U+25a2: RO
+U+25a3: Rr
+U+25a4: RF
+U+25a5: RY
+U+25a6: RH
+U+25a7: RZ
+U+25a8: RK
+U+25a9: RX
+U+25aa: sB
+U+25ac: SR
+U+25ad: Or
+U+25b2: UT
+U+25b3: uT
+U+25b6: PR
+U+25b7: Tr
+U+25bc: Dt
+U+25bd: dT
+U+25c0: PL
+U+25c1: Tl
+U+25c6: Db
+U+25c7: Dw
+U+25ca: LZ
+U+25cb: 0m
+U+25ce: 0o
+U+25cf: 0M
+U+25d0: 0L
+U+25d1: 0R
+U+25d8: Sn
+U+25d9: Ic
+U+25e2: Fd
+U+25e3: Bd
+U+2605: *2
+U+2606: *1
+U+260e: _TEL_
+U+260f: _tel_
+U+261c: <H
+U+261e: >H
+U+263a: 0u
+U+263b: 0U
+U+263c: SU
+U+2640: Fm
+U+2642: Ml
+U+2660: cS
+U+2661: cH
+U+2662: cD
+U+2663: cC
+U+2664: _cS-_
+U+2665: _cH-_
+U+2666: _cD-_
+U+2667: _cC-_
+U+2669: Md
+U+266a: M8
+U+266b: M2
+U+266c: _M16_
+U+266d: Mb
+U+266e: Mx
+U+266f: MX
+U+2713: OK
+U+2717: XX
+U+2720: -X
+U+3000: IS
+U+3001: ,_
+U+3002: ._
+U+3003: +"
+U+3004: +_
+U+3005: *_
+U+3006: ;_
+U+3007: 0_
+U+300a: <+
+U+300b: >+
+U+300c: <'
+U+300d: >'
+U+300e: <"
+U+300f: >"
+U+3010: ("
+U+3011: )"
+U+3012: =T
+U+3013: =_
+U+3014: ('
+U+3015: )'
+U+3016: (I
+U+3017: )I
+U+301c: -?
+U+3020: _=T:)_
+U+3041: A5
+U+3042: a5
+U+3043: I5
+U+3044: i5
+U+3045: U5
+U+3046: u5
+U+3047: E5
+U+3048: e5
+U+3049: O5
+U+304a: o5
+U+304b: ka
+U+304c: ga
+U+304d: ki
+U+304e: gi
+U+304f: ku
+U+3050: gu
+U+3051: ke
+U+3052: ge
+U+3053: ko
+U+3054: go
+U+3055: sa
+U+3056: za
+U+3057: si
+U+3058: zi
+U+3059: su
+U+305a: zu
+U+305b: se
+U+305c: ze
+U+305d: so
+U+305e: zo
+U+305f: ta
+U+3060: da
+U+3061: ti
+U+3062: di
+U+3063: tU
+U+3064: tu
+U+3065: du
+U+3066: te
+U+3067: de
+U+3068: to
+U+3069: do
+U+306a: na
+U+306b: ni
+U+306c: nu
+U+306d: ne
+U+306e: no
+U+306f: ha
+U+3070: ba
+U+3071: pa
+U+3072: hi
+U+3073: bi
+U+3074: pi
+U+3075: hu
+U+3076: bu
+U+3077: pu
+U+3078: he
+U+3079: be
+U+307a: pe
+U+307b: ho
+U+307c: bo
+U+307d: po
+U+307e: ma
+U+307f: mi
+U+3080: mu
+U+3081: me
+U+3082: mo
+U+3083: yA
+U+3084: ya
+U+3085: yU
+U+3086: yu
+U+3087: yO
+U+3088: yo
+U+3089: ra
+U+308a: ri
+U+308b: ru
+U+308c: re
+U+308d: ro
+U+308e: wA
+U+308f: wa
+U+3090: wi
+U+3091: we
+U+3092: wo
+U+3093: n5
+U+3094: vu
+U+309b: "5
+U+309c: 05
+U+309d: *5
+U+309e: +5
+U+30a1: a6
+U+30a2: A6
+U+30a3: i6
+U+30a4: I6
+U+30a5: u6
+U+30a6: U6
+U+30a7: e6
+U+30a8: E6
+U+30a9: o6
+U+30aa: O6
+U+30ab: Ka
+U+30ac: Ga
+U+30ad: Ki
+U+30ae: Gi
+U+30af: Ku
+U+30b0: Gu
+U+30b1: Ke
+U+30b2: Ge
+U+30b3: Ko
+U+30b4: Go
+U+30b5: Sa
+U+30b6: Za
+U+30b7: Si
+U+30b8: Zi
+U+30b9: Su
+U+30ba: Zu
+U+30bb: Se
+U+30bc: Ze
+U+30bd: So
+U+30be: Zo
+U+30bf: Ta
+U+30c0: Da
+U+30c1: Ti
+U+30c2: Di
+U+30c3: TU
+U+30c4: Tu
+U+30c5: Du
+U+30c6: Te
+U+30c7: De
+U+30c8: To
+U+30c9: Do
+U+30ca: Na
+U+30cb: Ni
+U+30cc: Nu
+U+30cd: Ne
+U+30ce: No
+U+30cf: Ha
+U+30d0: Ba
+U+30d1: Pa
+U+30d2: Hi
+U+30d3: Bi
+U+30d4: Pi
+U+30d5: Hu
+U+30d6: Bu
+U+30d7: Pu
+U+30d8: He
+U+30d9: Be
+U+30da: Pe
+U+30db: Ho
+U+30dc: Bo
+U+30dd: Po
+U+30de: Ma
+U+30df: Mi
+U+30e0: Mu
+U+30e1: Me
+U+30e2: Mo
+U+30e3: YA
+U+30e4: Ya
+U+30e5: YU
+U+30e6: Yu
+U+30e7: YO
+U+30e8: Yo
+U+30e9: Ra
+U+30ea: Ri
+U+30eb: Ru
+U+30ec: Re
+U+30ed: Ro
+U+30ee: WA
+U+30ef: Wa
+U+30f0: Wi
+U+30f1: We
+U+30f2: Wo
+U+30f3: N6
+U+30f4: Vu
+U+30f5: KA
+U+30f6: KE
+U+30f7: Va
+U+30f8: Vi
+U+30f9: Ve
+U+30fa: Vo
+U+30fb: .6
+U+30fc: -6
+U+30fd: *6
+U+30fe: +6
+U+3105: b4
+U+3106: p4
+U+3107: m4
+U+3108: f4
+U+3109: d4
+U+310a: t4
+U+310b: n4
+U+310c: l4
+U+310d: g4
+U+310e: k4
+U+310f: h4
+U+3110: j4
+U+3111: q4
+U+3112: x4
+U+3113: zh
+U+3114: ch
+U+3115: sh
+U+3116: r4
+U+3117: z4
+U+3118: c4
+U+3119: s4
+U+311a: a4
+U+311b: o4
+U+311c: e4
+U+311d: _eh4_
+U+311e: ai
+U+311f: ei
+U+3120: au
+U+3121: ou
+U+3122: an
+U+3123: en
+U+3124: aN
+U+3125: eN
+U+3126: er
+U+3127: i4
+U+3128: u4
+U+3129: iu
+U+312a: v4
+U+312b: nG
+U+312c: gn
+U+321c: _(JU)_
+U+3220: 1c
+U+3221: 2c
+U+3222: 3c
+U+3223: 4c
+U+3224: 5c
+U+3225: 6c
+U+3226: 7c
+U+3227: 8c
+U+3228: 9c
+U+3229: _10c_
+U+327f: _KSC_
+U+fb00: ff
+U+fb01: fi
+U+fb02: fl
+U+fb03: _ffi_
+U+fb04: _ffl_
+U+fb05: ft
+U+fb06: st
+U+fe7d: _3+;_
+U+fe82: _aM._
+U+fe84: _aH._
+U+fe8d: _a+-_
+U+fe8e: _a+._
+U+fe8f: _b+-_
+U+fe90: _b+,_
+U+fe91: _b+;_
+U+fe92: _b+._
+U+fe93: _tm-_
+U+fe94: _tm._
+U+fe95: _t+-_
+U+fe96: _t+,_
+U+fe97: _t+;_
+U+fe98: _t+._
+U+fe99: _tk-_
+U+fe9a: _tk,_
+U+fe9b: _tk;_
+U+fe9c: _tk._
+U+fe9d: _g+-_
+U+fe9e: _g+,_
+U+fe9f: _g+;_
+U+fea0: _g+._
+U+fea1: _hk-_
+U+fea2: _hk,_
+U+fea3: _hk;_
+U+fea4: _hk._
+U+fea5: _x+-_
+U+fea6: _x+,_
+U+fea7: _x+;_
+U+fea8: _x+._
+U+fea9: _d+-_
+U+feaa: _d+._
+U+feab: _dk-_
+U+feac: _dk._
+U+fead: _r+-_
+U+feae: _r+._
+U+feaf: _z+-_
+U+feb0: _z+._
+U+feb1: _s+-_
+U+feb2: _s+,_
+U+feb3: _s+;_
+U+feb4: _s+._
+U+feb5: _sn-_
+U+feb6: _sn,_
+U+feb7: _sn;_
+U+feb8: _sn._
+U+feb9: _c+-_
+U+feba: _c+,_
+U+febb: _c+;_
+U+febc: _c+._
+U+febd: _dd-_
+U+febe: _dd,_
+U+febf: _dd;_
+U+fec0: _dd._
+U+fec1: _tj-_
+U+fec2: _tj,_
+U+fec3: _tj;_
+U+fec4: _tj._
+U+fec5: _zH-_
+U+fec6: _zH,_
+U+fec7: _zH;_
+U+fec8: _zH._
+U+fec9: _e+-_
+U+feca: _e+,_
+U+fecb: _e+;_
+U+fecc: _e+._
+U+fecd: _i+-_
+U+fece: _i+,_
+U+fecf: _i+;_
+U+fed0: _i+._
+U+fed1: _f+-_
+U+fed2: _f+,_
+U+fed3: _f+;_
+U+fed4: _f+._
+U+fed5: _q+-_
+U+fed6: _q+,_
+U+fed7: _q+;_
+U+fed8: _q+._
+U+fed9: _k+-_
+U+feda: _k+,_
+U+fedb: _k+;_
+U+fedc: _k+._
+U+fedd: _l+-_
+U+fede: _l+,_
+U+fedf: _l+;_
+U+fee0: _l+._
+U+fee1: _m+-_
+U+fee2: _m+,_
+U+fee3: _m+;_
+U+fee4: _m+._
+U+fee5: _n+-_
+U+fee6: _n+,_
+U+fee7: _n+;_
+U+fee8: _n+._
+U+fee9: _h+-_
+U+feea: _h+,_
+U+feeb: _h+;_
+U+feec: _h+._
+U+feed: _w+-_
+U+feee: _w+._
+U+feef: _j+-_
+U+fef0: _j+._
+U+fef1: _y+-_
+U+fef2: _y+,_
+U+fef3: _y+;_
+U+fef4: _y+._
+U+fef5: _lM-_
+U+fef6: _lM._
+U+fef7: _lH-_
+U+fef8: _lH._
+U+fef9: _lh-_
+U+fefa: _lh._
+U+fefb: _la-_
+U+fefc: _la._
+U+0000: NU
+U+0001: SH
+U+0002: SX
+U+0003: EX
+U+0004: ET
+U+0005: EQ
+U+0006: AK
+U+0007: BL
+U+0008: BS
+U+0009: HT
+# U+000a: LF
+U+000b: VT
+U+000c: FF
+U+000d: CR
+U+000e: SO
+U+000f: SI
+U+0010: DL
+U+0011: D1
+U+0012: D2
+U+0013: D3
+U+0014: D4
+U+0015: NK
+U+0016: SY
+U+0017: EB
+U+0018: CN
+U+0019: EM
+U+001a: SB
+U+001b: EC
+U+001c: FS
+U+001d: GS
+U+001e: RS
+U+001f: US
+U+007f: DT
+U+0080: PA
+U+0081: HO
+U+0082: BH
+U+0083: NH
+U+0084: IN
+U+0085: NL
+U+0086: SA
+U+0087: ES
+U+0088: HS
+U+0089: HJ
+U+008a: VS
+U+008b: PD
+U+008c: PU
+U+008d: RI
+U+008e: S2
+U+008f: S3
+U+0090: DC
+U+0091: P1
+U+0092: P2
+U+0093: TS
+U+0094: CC
+U+0095: MW
+U+0096: SG
+U+0097: EG
+U+0098: SS
+U+0099: GC
+U+009a: SC
+U+009b: CI
+U+009c: ST
+U+009d: OC
+U+009e: PM
+U+009f: AC
+# Characters in Private Use Area (e000-f8ff) do not have ussigned numbers
+# according Unicode 2.0
diff --git a/src/chrtrans/next_uni.tbl b/src/chrtrans/next_uni.tbl
new file mode 100644
index 0000000..a76ae34
--- /dev/null
+++ b/src/chrtrans/next_uni.tbl
@@ -0,0 +1,185 @@
+# This file has been modified for lynx (see README.tables)
+
+#The MIME name of this charset.
+Mnext
+
+#Name as a Display Charset (used on Options screen)
+ONeXT character set
+
+#
+# Name: NextStep Encoding to Unicode
+# Unicode version: 1.1
+# Table version: 0.1
+# Table format: Format A
+# Date: 1999 September 23
+# Authors: Rick McGowan
+#
+# Copyright (c) 1991-1999 Unicode, Inc. All Rights reserved.
+#
+# This file is provided as-is by Unicode, Inc. (The Unicode Consortium).
+# No claims are made as to fitness for any particular purpose. No
+# warranties of any kind are expressed or implied. The recipient
+# agrees to determine applicability of information provided. If this
+# file has been provided on optical media by Unicode, Inc., the sole
+# remedy for any claim will be exchange of defective media within 90
+# days of receipt.
+#
+# Unicode, Inc. hereby grants the right to freely use the information
+# supplied in this file in the creation of products supporting the
+# Unicode Standard, and to make copies of this file in any form for
+# internal or external distribution as long as this notice remains
+# attached.
+#
+# General notes:
+#
+# This table contains the data the Unicode Consortium has on how
+# NextStep Encoding characters map into Unicode. Since the first
+# 128 characters (0x0 - 0x7f) are identical to ASCII and Unicode,
+# this table only maps the NextStep range from 0x80 - 0xFF.
+#
+# This file is provided for historical reference only and pertains
+# to NextStep and OpenStep products shipped prior to the acquisition
+# of NeXT by Apple Computer, Inc. See http://www.apple.com for
+# further information.
+#
+# Format: Three tab-separated columns
+# Column #1 is the NextStep code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 NextStep name, Unicode name (follows a comment sign, '#')
+#
+# The entries are in NextStep order
+#
+# Any comments or problems, contact info@unicode.org
+#
+#
+0x20-0x7f idem
+#
+0x80 U+00a0 # NO-BREAK SPACE
+0x81 U+00c0 # LATIN CAPITAL LETTER A WITH GRAVE
+0x82 U+00c1 # LATIN CAPITAL LETTER A WITH ACUTE
+0x83 U+00c2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0x84 U+00c3 # LATIN CAPITAL LETTER A WITH TILDE
+0x85 U+00c4 # LATIN CAPITAL LETTER A WITH DIAERESIS
+0x86 U+00c5 # LATIN CAPITAL LETTER A WITH RING
+0x87 U+00c7 # LATIN CAPITAL LETTER C WITH CEDILLA
+0x88 U+00c8 # LATIN CAPITAL LETTER E WITH GRAVE
+0x89 U+00c9 # LATIN CAPITAL LETTER E WITH ACUTE
+0x8a U+00ca # LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+0x8b U+00cb # LATIN CAPITAL LETTER E WITH DIAERESIS
+0x8c U+00cc # LATIN CAPITAL LETTER I WITH GRAVE
+0x8d U+00cd # LATIN CAPITAL LETTER I WITH ACUTE
+0x8e U+00ce # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0x8f U+00cf # LATIN CAPITAL LETTER I WITH DIAERESIS
+0x90 U+00d0 # LATIN CAPITAL LETTER ETH
+0x91 U+00d1 # LATIN CAPITAL LETTER N WITH TILDE
+0x92 U+00d2 # LATIN CAPITAL LETTER O WITH GRAVE
+0x93 U+00d3 # LATIN CAPITAL LETTER O WITH ACUTE
+0x94 U+00d4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0x95 U+00d5 # LATIN CAPITAL LETTER O WITH TILDE
+0x96 U+00d6 # LATIN CAPITAL LETTER O WITH DIAERESIS
+0x97 U+00d9 # LATIN CAPITAL LETTER U WITH GRAVE
+0x98 U+00da # LATIN CAPITAL LETTER U WITH ACUTE
+0x99 U+00db # LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+0x9a U+00dc # LATIN CAPITAL LETTER U WITH DIAERESIS
+0x9b U+00dd # LATIN CAPITAL LETTER Y WITH ACUTE
+0x9c U+00de # LATIN CAPITAL LETTER THORN
+0x9d U+00b5 # MICRO SIGN
+0x9e U+00d7 # MULTIPLICATION SIGN
+0x9f U+00f7 # DIVISION SIGN
+0xa0 U+00a9 # COPYRIGHT SIGN
+0xa1 U+00a1 # INVERTED EXCLAMATION MARK
+0xa2 U+00a2 # CENT SIGN
+0xa3 U+00a3 # POUND SIGN
+0xa4 U+2044 # FRACTION SLASH
+0xa5 U+00a5 # YEN SIGN
+0xa6 U+0192 # LATIN SMALL LETTER F WITH HOOK
+0xa7 U+00a7 # SECTION SIGN
+0xa8 U+00a4 # CURRENCY SIGN
+0xa9 U+2019 # RIGHT SINGLE QUOTATION MARK
+0xaa U+201c # LEFT DOUBLE QUOTATION MARK
+0xab U+00ab # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xac U+2039 # SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+0xad U+203a # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+0xae U+fb01 # LATIN SMALL LIGATURE FI
+0xaf U+fb02 # LATIN SMALL LIGATURE FL
+0xb0 U+00ae # REGISTERED SIGN
+0xb1 U+2013 # EN DASH
+0xb2 U+2020 # DAGGER
+0xb3 U+2021 # DOUBLE DAGGER
+0xb4 U+00b7 # MIDDLE DOT
+0xb5 U+00a6 # BROKEN BAR
+0xb6 U+00b6 # PILCROW SIGN
+0xb7 U+2022 # BULLET
+0xb8 U+201a # SINGLE LOW-9 QUOTATION MARK
+0xb9 U+201e # DOUBLE LOW-9 QUOTATION MARK
+0xba U+201d # RIGHT DOUBLE QUOTATION MARK
+0xbb U+00bb # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xbc U+2026 # HORIZONTAL ELLIPSIS
+0xbd U+2030 # PER MILLE SIGN
+0xbe U+00ac # NOT SIGN
+0xbf U+00bf # INVERTED QUESTION MARK
+0xc0 U+00b9 # SUPERSCRIPT ONE
+0xc1 U+02cb # MODIFIER LETTER GRAVE ACCENT
+0xc2 U+00b4 # ACUTE ACCENT
+0xc3 U+02c6 # MODIFIER LETTER CIRCUMFLEX ACCENT
+0xc4 U+02dc # SMALL TILDE
+0xc5 U+00af # MACRON
+0xc6 U+02d8 # BREVE
+0xc7 U+02d9 # DOT ABOVE
+0xc8 U+00a8 # DIAERESIS
+0xc9 U+00b2 # SUPERSCRIPT TWO
+0xca U+02da # RING ABOVE
+0xcb U+00b8 # CEDILLA
+0xcc U+00b3 # SUPERSCRIPT THREE
+0xcd U+02dd # DOUBLE ACUTE ACCENT
+0xce U+02db # OGONEK
+0xcf U+02c7 # CARON
+0xd0 U+2014 # EM DASH
+0xd1 U+00b1 # PLUS-MINUS SIGN
+0xd2 U+00bc # VULGAR FRACTION ONE QUARTER
+0xd3 U+00bd # VULGAR FRACTION ONE HALF
+0xd4 U+00be # VULGAR FRACTION THREE QUARTERS
+0xd5 U+00e0 # LATIN SMALL LETTER A WITH GRAVE
+0xd6 U+00e1 # LATIN SMALL LETTER A WITH ACUTE
+0xd7 U+00e2 # LATIN SMALL LETTER A WITH CIRCUMFLEX
+0xd8 U+00e3 # LATIN SMALL LETTER A WITH TILDE
+0xd9 U+00e4 # LATIN SMALL LETTER A WITH DIAERESIS
+0xda U+00e5 # LATIN SMALL LETTER A WITH RING ABOVE
+0xdb U+00e7 # LATIN SMALL LETTER C WITH CEDILLA
+0xdc U+00e8 # LATIN SMALL LETTER E WITH GRAVE
+0xdd U+00e9 # LATIN SMALL LETTER E WITH ACUTE
+0xde U+00ea # LATIN SMALL LETTER E WITH CIRCUMFLEX
+0xdf U+00eb # LATIN SMALL LETTER E WITH DIAERESIS
+0xe0 U+00ec # LATIN SMALL LETTER I WITH GRAVE
+0xe1 U+00c6 # LATIN CAPITAL LETTER AE
+0xe2 U+00ed # LATIN SMALL LETTER I WITH ACUTE
+0xe3 U+00aa # FEMININE ORDINAL INDICATOR
+0xe4 U+00ee # LATIN SMALL LETTER I WITH CIRCUMFLEX
+0xe5 U+00ef # LATIN SMALL LETTER I WITH DIAERESIS
+0xe6 U+00f0 # LATIN SMALL LETTER ETH
+0xe7 U+00f1 # LATIN SMALL LETTER N WITH TILDE
+0xe8 U+0141 # LATIN CAPITAL LETTER L WITH STROKE
+0xe9 U+00d8 # LATIN CAPITAL LETTER O WITH STROKE
+0xea U+0152 # LATIN CAPITAL LIGATURE OE
+0xeb U+00ba # MASCULINE ORDINAL INDICATOR
+0xec U+00f2 # LATIN SMALL LETTER O WITH GRAVE
+0xed U+00f3 # LATIN SMALL LETTER O WITH ACUTE
+0xee U+00f4 # LATIN SMALL LETTER O WITH CIRCUMFLEX
+0xef U+00f5 # LATIN SMALL LETTER O WITH TILDE
+0xf0 U+00f6 # LATIN SMALL LETTER O WITH DIAERESIS
+0xf1 U+00e6 # LATIN SMALL LETTER AE
+0xf2 U+00f9 # LATIN SMALL LETTER U WITH GRAVE
+0xf3 U+00fa # LATIN SMALL LETTER U WITH ACUTE
+0xf4 U+00fb # LATIN SMALL LETTER U WITH CIRCUMFLEX
+0xf5 U+0131 # LATIN SMALL LETTER DOTLESS I
+0xf6 U+00fc # LATIN SMALL LETTER U WITH DIAERESIS
+0xf7 U+00fd # LATIN SMALL LETTER Y WITH ACUTE
+0xf8 U+0142 # LATIN SMALL LETTER L WITH STROKE
+0xf9 U+00f8 # LATIN SMALL LETTER O WITH STROKE
+0xfa U+0153 # LATIN SMALL LIGATURE OE
+0xfb U+00df # LATIN SMALL LETTER SHARP S
+0xfc U+00fe # LATIN SMALL LETTER THORN
+0xfd U+00ff # LATIN SMALL LETTER Y WITH DIAERESIS
+#0xfe U+fffd # .notdef, REPLACEMENT CHARACTER
+#0xff U+fffd # .notdef, REPLACEMENT CHARACTER
+
diff --git a/src/chrtrans/pt154_uni.tbl b/src/chrtrans/pt154_uni.tbl
new file mode 100644
index 0000000..0bacb52
--- /dev/null
+++ b/src/chrtrans/pt154_uni.tbl
@@ -0,0 +1,174 @@
+Mptcp154
+#
+OCyrillic-Asian (PT154)
+#
+C1540
+
+#####
+#
+# Charset aliases:
+# csPTCP154
+# PT154
+# CP154
+# Cyrillic-Asian
+#
+# Suitability for use in MIME text:
+# Yes
+#
+# ISO 10646 equivalency table:
+# Format: Three tab-separated columns
+# Column #1 is the Paratype CP154 code (in hex)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 is the Unicode name (follows a comment sign, '#')
+#
+# The entries are in Paratype CP154 order
+#
+#####
+
+0x20-0x7e idem
+#
+0x80 U+0496 # CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER
+0x81 U+0492 # CYRILLIC CAPITAL LETTER GHE WITH STROKE
+0x82 U+04EE # CYRILLIC CAPITAL LETTER U WITH MACRON
+0x83 U+0493 # CYRILLIC SMALL LETTER GHE WITH STROKE
+0x84 U+201E # DOUBLE LOW-9 QUOTATION MARK
+0x85 U+2026 # HORIZONTAL ELLIPSIS
+0x86 U+04B6 # CYRILLIC CAPITAL LETTER CHE WITH DESCENDER
+0x87 U+04AE # CYRILLIC CAPITAL LETTER STRAIGHT U
+0x88 U+04B2 # CYRILLIC CAPITAL LETTER HA WITH DESCENDER
+0x89 U+04AF # CYRILLIC SMALL LETTER STRAIGHT U
+0x8a U+04A0 # CYRILLIC CAPITAL LETTER BASHKIR KA
+0x8b U+04E2 # CYRILLIC CAPITAL LETTER I WITH MACRON
+0x8c U+04A2 # CYRILLIC CAPITAL LETTER EN WITH DESCENDER
+0x8d U+049A # CYRILLIC CAPITAL LETTER KA WITH DESCENDER
+0x8e U+04BA # CYRILLIC CAPITAL LETTER SHHA
+0x8f U+04B8 # CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE
+0x90 U+0497 # CYRILLIC SMALL LETTER ZHE WITH DESCENDER
+0x91 U+2018 # LEFT SINGLE QUOTATION MARK
+0x92 U+2019 # RIGHT SINGLE QUOTATION MARK
+0x93 U+201C # LEFT DOUBLE QUOTATION MARK
+0x94 U+201D # RIGHT DOUBLE QUOTATION MARK
+0x95 U+2022 # BULLET
+0x96 U+2013 # EN DASH
+0x97 U+2014 # EM DASH
+0x98 U+04B3 # CYRILLIC SMALL LETTER HA WITH DESCENDER
+0x99 U+04B7 # CYRILLIC SMALL LETTER CHE WITH DESCENDER
+0x9a U+04A1 # CYRILLIC SMALL LETTER BASHKIR KA
+0x9b U+04E3 # CYRILLIC SMALL LETTER I WITH MACRON
+0x9c U+04A3 # CYRILLIC SMALL LETTER EN WITH DESCENDER
+0x9d U+049B # CYRILLIC SMALL LETTER KA WITH DESCENDER
+0x9e U+04BB # CYRILLIC SMALL LETTER SHHA
+0x9f U+04B9 # CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE
+0xa0 U+00A0 # NO-BREAK SPACE
+0xa1 U+040E # CYRILLIC CAPITAL LETTER SHORT U (Byelorussian)
+0xa2 U+045E # CYRILLIC SMALL LETTER SHORT U (Byelorussian)
+0xa3 U+0408 # CYRILLIC CAPITAL LETTER JE
+0xa4 U+04E8 # CYRILLIC CAPITAL LETTER BARRED O
+0xa5 U+0498 # CYRILLIC CAPITAL LETTER ZE WITH DESCENDER
+0xa6 U+04B0 # CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE
+0xa7 U+00A7 # SECTION SIGN
+0xa8 U+0401 # CYRILLIC CAPITAL LETTER IO
+0xa9 U+00A9 # COPYRIGHT SIGN
+0xaa U+04D8 # CYRILLIC CAPITAL LETTER SCHWA
+0xab U+00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xac U+00AC # NOT SIGN
+0xad U+04EF # CYRILLIC SMALL LETTER U WITH MACRON
+0xae U+00AE # REGISTERED SIGN
+0xaf U+049C # CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE
+0xb0 U+00B0 # DEGREE SIGN
+0xb1 U+04B1 # CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE
+0xb2 U+0406 # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+0xb3 U+0456 # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+0xb4 U+0499 # CYRILLIC SMALL LETTER ZE WITH DESCENDER
+0xb5 U+04E9 # CYRILLIC SMALL LETTER BARRED O
+0xb6 U+00B6 # PILCROW SIGN
+0xb7 U+00B7 # MIDDLE DOT
+0xb8 U+0451 # CYRILLIC SMALL LETTER IO
+0xb9 U+2116 # NUMERO SIGN
+0xba U+04D9 # CYRILLIC SMALL LETTER SCHWA
+0xbb U+00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xbc U+0458 # CYRILLIC SMALL LETTER JE
+0xbd U+04AA # CYRILLIC CAPITAL LETTER ES WITH DESCENDER
+0xbe U+04AB # CYRILLIC SMALL LETTER ES WITH DESCENDER
+0xbf U+049D # CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE
+0xc0 U+0410 # CYRILLIC CAPITAL LETTER A
+0xc1 U+0411 # CYRILLIC CAPITAL LETTER BE
+0xc2 U+0412 # CYRILLIC CAPITAL LETTER VE
+0xc3 U+0413 # CYRILLIC CAPITAL LETTER GHE
+0xc4 U+0414 # CYRILLIC CAPITAL LETTER DE
+0xc5 U+0415 # CYRILLIC CAPITAL LETTER IE
+0xc6 U+0416 # CYRILLIC CAPITAL LETTER ZHE
+0xc7 U+0417 # CYRILLIC CAPITAL LETTER ZE
+0xc8 U+0418 # CYRILLIC CAPITAL LETTER I
+0xc9 U+0419 # CYRILLIC CAPITAL LETTER SHORT I
+0xca U+041A # CYRILLIC CAPITAL LETTER KA
+0xcb U+041B # CYRILLIC CAPITAL LETTER EL
+0xcc U+041C # CYRILLIC CAPITAL LETTER EM
+0xcd U+041D # CYRILLIC CAPITAL LETTER EN
+0xce U+041E # CYRILLIC CAPITAL LETTER O
+0xcf U+041F # CYRILLIC CAPITAL LETTER PE
+0xd0 U+0420 # CYRILLIC CAPITAL LETTER ER
+0xd1 U+0421 # CYRILLIC CAPITAL LETTER ES
+0xd2 U+0422 # CYRILLIC CAPITAL LETTER TE
+0xd3 U+0423 # CYRILLIC CAPITAL LETTER U
+0xd4 U+0424 # CYRILLIC CAPITAL LETTER EF
+0xd5 U+0425 # CYRILLIC CAPITAL LETTER HA
+0xd6 U+0426 # CYRILLIC CAPITAL LETTER TSE
+0xd7 U+0427 # CYRILLIC CAPITAL LETTER CHE
+0xd8 U+0428 # CYRILLIC CAPITAL LETTER SHA
+0xd9 U+0429 # CYRILLIC CAPITAL LETTER SHCHA
+0xda U+042A # CYRILLIC CAPITAL LETTER HARD SIGN
+0xdb U+042B # CYRILLIC CAPITAL LETTER YERU
+0xdc U+042C # CYRILLIC CAPITAL LETTER SOFT SIGN
+0xdd U+042D # CYRILLIC CAPITAL LETTER E
+0xde U+042E # CYRILLIC CAPITAL LETTER YU
+0xdf U+042F # CYRILLIC CAPITAL LETTER YA
+0xe0 U+0430 # CYRILLIC SMALL LETTER A
+0xe1 U+0431 # CYRILLIC SMALL LETTER BE
+0xe2 U+0432 # CYRILLIC SMALL LETTER VE
+0xe3 U+0433 # CYRILLIC SMALL LETTER GHE
+0xe4 U+0434 # CYRILLIC SMALL LETTER DE
+0xe5 U+0435 # CYRILLIC SMALL LETTER IE
+0xe6 U+0436 # CYRILLIC SMALL LETTER ZHE
+0xe7 U+0437 # CYRILLIC SMALL LETTER ZE
+0xe8 U+0438 # CYRILLIC SMALL LETTER I
+0xe9 U+0439 # CYRILLIC SMALL LETTER SHORT I
+0xea U+043A # CYRILLIC SMALL LETTER KA
+0xeb U+043B # CYRILLIC SMALL LETTER EL
+0xec U+043C # CYRILLIC SMALL LETTER EM
+0xed U+043D # CYRILLIC SMALL LETTER EN
+0xee U+043E # CYRILLIC SMALL LETTER O
+0xef U+043F # CYRILLIC SMALL LETTER PE
+0xf0 U+0440 # CYRILLIC SMALL LETTER ER
+0xf1 U+0441 # CYRILLIC SMALL LETTER ES
+0xf2 U+0442 # CYRILLIC SMALL LETTER TE
+0xf3 U+0443 # CYRILLIC SMALL LETTER U
+0xf4 U+0444 # CYRILLIC SMALL LETTER EF
+0xf5 U+0445 # CYRILLIC SMALL LETTER HA
+0xf6 U+0446 # CYRILLIC SMALL LETTER TSE
+0xf7 U+0447 # CYRILLIC SMALL LETTER CHE
+0xf8 U+0448 # CYRILLIC SMALL LETTER SHA
+0xf9 U+0449 # CYRILLIC SMALL LETTER SHCHA
+0xfa U+044A # CYRILLIC SMALL LETTER HARD SIGN
+0xfb U+044B # CYRILLIC SMALL LETTER YERU
+0xfc U+044C # CYRILLIC SMALL LETTER SOFT SIGN
+0xfd U+044D # CYRILLIC SMALL LETTER E
+0xfe U+044E # CYRILLIC SMALL LETTER YU
+0xff U+044F # CYRILLIC SMALL LETTER YA
+
+#####
+#
+# Additional information:
+# This charset based on CP1251 with added asian cyrillic symbols.
+#
+# Person & email address to contact for further information:
+# Alexander Uskov
+# InternetDataCenter of KazakhTelecom.
+# e-mail: auskov@idc.kz
+#
+# Intended usage:
+# COMMON
+#
+# (record created 2002-09-27)
+#
+#####
diff --git a/src/chrtrans/rfc_suni.tbl b/src/chrtrans/rfc_suni.tbl
new file mode 100644
index 0000000..65fa17e
--- /dev/null
+++ b/src/chrtrans/rfc_suni.tbl
@@ -0,0 +1,1958 @@
+# Generated from the mnemonic file found under ftp://dkuug.dk/i18n/
+# then hand-tweaked
+# perl -n -e \
+# 'if (s|<([^ \t]+)>\s+<U([\dA-Z]{4})>\s.*$|U+\L\2\E:\1|) {s|/?(.)|\1|g&&print}'\
+# mnemonic,ds
+
+#The MIME name of this charset.
+Mmnemonic+ascii+0
+
+#Name as a Display Charset (used on Options screen)
+ORFC 1345 w/o Intro
+
+# Don't fall back to default table for unicode -> 8bit
+Fallback NO
+
+U+0020:SP
+U+0021:!
+U+0022:"
+U+0023:Nb
+U+0024:DO
+U+0025:%
+U+0026:&
+U+0027:'
+U+0028:(
+U+0029:)
+U+002a:*
+U+002b:+
+U+002c:,
+U+002d:-
+U+002e:.
+U+002f:/
+U+0030:0
+U+0031:1
+U+0032:2
+U+0033:3
+U+0034:4
+U+0035:5
+U+0036:6
+U+0037:7
+U+0038:8
+U+0039:9
+U+003a::
+U+003b:;
+U+003c:<
+U+003d:=
+U+003e:>
+U+003f:?
+U+0040:At
+U+0041:A
+U+0042:B
+U+0043:C
+U+0044:D
+U+0045:E
+U+0046:F
+U+0047:G
+U+0048:H
+U+0049:I
+U+004a:J
+U+004b:K
+U+004c:L
+U+004d:M
+U+004e:N
+U+004f:O
+U+0050:P
+U+0051:Q
+U+0052:R
+U+0053:S
+U+0054:T
+U+0055:U
+U+0056:V
+U+0057:W
+U+0058:X
+U+0059:Y
+U+005a:Z
+U+005b:<(
+U+005c://
+U+005d:)>
+U+005e:'>
+U+005f:_
+U+0060:'!
+U+0061:a
+U+0062:b
+U+0063:c
+U+0064:d
+U+0065:e
+U+0066:f
+U+0067:g
+U+0068:h
+U+0069:i
+U+006a:j
+U+006b:k
+U+006c:l
+U+006d:m
+U+006e:n
+U+006f:o
+U+0070:p
+U+0071:q
+U+0072:r
+U+0073:s
+U+0074:t
+U+0075:u
+U+0076:v
+U+0077:w
+U+0078:x
+U+0079:y
+U+007a:z
+U+007b:(!
+U+007c:!!
+U+007d:!)
+U+007e:'?
+U+00a0:NS
+U+00a1:!I
+U+00a2:Ct
+U+00a3:Pd
+U+00a4:Cu
+U+00a5:Ye
+U+00a6:BB
+U+00a7:SE
+U+00a8:':
+U+00a9:Co
+U+00aa:-a
+U+00ab:<<
+U+00ac:NO
+U+00ad:--
+U+00ae:Rg
+U+00af:'m
+U+00b0:DG
+U+00b1:+-
+U+00b2:2S
+U+00b3:3S
+U+00b4:''
+U+00b5:My
+U+00b6:PI
+U+00b7:.M
+U+00b8:',
+U+00b9:1S
+U+00ba:-o
+U+00bb:>>
+U+00bc:14
+U+00bd:12
+U+00be:34
+U+00bf:?I
+U+00c0:A!
+U+00c1:A'
+U+00c2:A>
+U+00c3:A?
+U+00c4:A:
+U+00c5:AA
+U+00c6:AE
+U+00c7:C,
+U+00c8:E!
+U+00c9:E'
+U+00ca:E>
+U+00cb:E:
+U+00cc:I!
+U+00cd:I'
+U+00ce:I>
+U+00cf:I:
+U+00d0:D-
+U+00d1:N?
+U+00d2:O!
+U+00d3:O'
+U+00d4:O>
+U+00d5:O?
+U+00d6:O:
+U+00d7:*X
+U+00d8:O/
+U+00d9:U!
+U+00da:U'
+U+00db:U>
+U+00dc:U:
+U+00dd:Y'
+U+00de:TH
+U+00df:ss
+U+00e0:a!
+U+00e1:a'
+U+00e2:a>
+U+00e3:a?
+U+00e4:a:
+U+00e5:aa
+U+00e6:ae
+U+00e7:c,
+U+00e8:e!
+U+00e9:e'
+U+00ea:e>
+U+00eb:e:
+U+00ec:i!
+U+00ed:i'
+U+00ee:i>
+U+00ef:i:
+U+00f0:d-
+U+00f1:n?
+U+00f2:o!
+U+00f3:o'
+U+00f4:o>
+U+00f5:o?
+U+00f6:o:
+U+00f7:-:
+U+00f8:o/
+U+00f9:u!
+U+00fa:u'
+U+00fb:u>
+U+00fc:u:
+U+00fd:y'
+U+00fe:th
+U+00ff:y:
+U+0100:A-
+U+0101:a-
+U+0102:A(
+U+0103:a(
+U+0104:A;
+U+0105:a;
+U+0106:C'
+U+0107:c'
+U+0108:C>
+U+0109:c>
+U+010a:C.
+U+010b:c.
+U+010c:C<
+U+010d:c<
+U+010e:D<
+U+010f:d<
+U+0110:D/
+U+0111:d/
+U+0112:E-
+U+0113:e-
+U+0114:E(
+U+0115:e(
+U+0116:E.
+U+0117:e.
+U+0118:E;
+U+0119:e;
+U+011a:E<
+U+011b:e<
+U+011c:G>
+U+011d:g>
+U+011e:G(
+U+011f:g(
+U+0120:G.
+U+0121:g.
+U+0122:G,
+U+0123:g,
+U+0124:H>
+U+0125:h>
+U+0126:H/
+U+0127:h/
+U+0128:I?
+U+0129:i?
+U+012a:I-
+U+012b:i-
+U+012c:I(
+U+012d:i(
+U+012e:I;
+U+012f:i;
+U+0130:I.
+U+0131:i.
+U+0132:IJ
+U+0133:ij
+U+0134:J>
+U+0135:j>
+U+0136:K,
+U+0137:k,
+U+0138:kk
+U+0139:L'
+U+013a:l'
+U+013b:L,
+U+013c:l,
+U+013d:L<
+U+013e:l<
+U+013f:L.
+U+0140:l.
+U+0141:L/
+U+0142:l/
+U+0143:N'
+U+0144:n'
+U+0145:N,
+U+0146:n,
+U+0147:N<
+U+0148:n<
+U+0149:'n
+U+014a:NG
+U+014b:ng
+U+014c:O-
+U+014d:o-
+U+014e:O(
+U+014f:o(
+U+0150:O"
+U+0151:o"
+U+0152:OE
+U+0153:oe
+U+0154:R'
+U+0155:r'
+U+0156:R,
+U+0157:r,
+U+0158:R<
+U+0159:r<
+U+015a:S'
+U+015b:s'
+U+015c:S>
+U+015d:s>
+U+015e:S,
+U+015f:s,
+U+0160:S<
+U+0161:s<
+U+0162:T,
+U+0163:t,
+U+0164:T<
+U+0165:t<
+U+0166:T/
+U+0167:t/
+U+0168:U?
+U+0169:u?
+U+016a:U-
+U+016b:u-
+U+016c:U(
+U+016d:u(
+U+016e:U0
+U+016f:u0
+U+0170:U"
+U+0171:u"
+U+0172:U;
+U+0173:u;
+U+0174:W>
+U+0175:w>
+U+0176:Y>
+U+0177:y>
+U+0178:Y:
+U+0179:Z'
+U+017a:z'
+U+017b:Z.
+U+017c:z.
+U+017d:Z<
+U+017e:z<
+U+017f:s1
+U+0187:C2
+U+0188:c2
+U+0191:F2
+U+0192:f2
+U+0198:K2
+U+0199:k2
+U+01a0:O9
+U+01a1:o9
+U+01a2:OI
+U+01a3:oi
+U+01a6:yr
+U+01af:U9
+U+01b0:u9
+U+01b5:Z/
+U+01b6:z/
+U+01b7:ED
+U+01cd:A<
+U+01ce:a<
+U+01cf:I<
+U+01d0:i<
+U+01d1:O<
+U+01d2:o<
+U+01d3:U<
+U+01d4:u<
+U+01d5:U:-
+U+01d6:u:-
+U+01d7:U:'
+U+01d8:u:'
+U+01d9:U:<
+U+01da:u:<
+U+01db:U:!
+U+01dc:u:!
+U+01de:A1
+U+01df:a1
+U+01e0:A7
+U+01e1:a7
+U+01e2:A3
+U+01e3:a3
+U+01e4:G/
+U+01e5:g/
+U+01e6:G<
+U+01e7:g<
+U+01e8:K<
+U+01e9:k<
+U+01ea:O;
+U+01eb:o;
+U+01ec:O1
+U+01ed:o1
+U+01ee:EZ
+U+01ef:ez
+U+01f0:j<
+U+01f4:G'
+U+01f5:g'
+U+01fa:AA'
+U+01fb:aa'
+U+01fc:AE'
+U+01fd:ae'
+U+01fe:O/'
+U+01ff:o/'
+U+0200:A!!
+U+0201:a!!
+U+0202:A)
+U+0203:a)
+U+0204:E!!
+U+0205:e!!
+U+0206:E)
+U+0207:e)
+U+0208:I!!
+U+0209:i!!
+U+020a:I)
+U+020b:i)
+U+020c:O!!
+U+020d:o!!
+U+020e:O)
+U+020f:o)
+U+0210:R!!
+U+0211:r!!
+U+0212:R)
+U+0213:r)
+U+0214:U!!
+U+0215:u!!
+U+0216:U)
+U+0217:u)
+U+0292:ed
+U+02bb:;S
+U+02c6:1>
+U+02c7:'<
+U+02c9:1-
+U+02cb:1!
+U+02d8:'(
+U+02d9:'.
+U+02da:'0
+U+02db:';
+U+02dc:1?
+U+02dd:'"
+U+0374:'G
+U+0375:,G
+U+037a:j3
+U+037e:?%
+U+0384:'*
+U+0385:'%
+U+0386:A%
+U+0387:.*
+U+0388:E%
+U+0389:Y%
+U+038a:I%
+U+038c:O%
+U+038e:U%
+U+038f:W%
+U+0390:i3
+U+0391:A*
+U+0392:B*
+U+0393:G*
+U+0394:D*
+U+0395:E*
+U+0396:Z*
+U+0397:Y*
+U+0398:H*
+U+0399:I*
+U+039a:K*
+U+039b:L*
+U+039c:M*
+U+039d:N*
+U+039e:C*
+U+039f:O*
+U+03a0:P*
+U+03a1:R*
+U+03a3:S*
+U+03a4:T*
+U+03a5:U*
+U+03a6:F*
+U+03a7:X*
+U+03a8:Q*
+U+03a9:W*
+U+03aa:J*
+U+03ab:V*
+U+03ac:a%
+U+03ad:e%
+U+03ae:y%
+U+03af:i%
+U+03b0:u3
+U+03b1:a*
+U+03b2:b*
+U+03b3:g*
+U+03b4:d*
+U+03b5:e*
+U+03b6:z*
+U+03b7:y*
+U+03b8:h*
+U+03b9:i*
+U+03ba:k*
+U+03bb:l*
+U+03bc:m*
+U+03bd:n*
+U+03be:c*
+U+03bf:o*
+U+03c0:p*
+U+03c1:r*
+U+03c2:*s
+U+03c3:s*
+U+03c4:t*
+U+03c5:u*
+U+03c6:f*
+U+03c7:x*
+U+03c8:q*
+U+03c9:w*
+U+03ca:j*
+U+03cb:v*
+U+03cc:o%
+U+03cd:u%
+U+03ce:w%
+U+03d0:b3
+U+03da:T3
+U+03db:t3
+U+03dc:M3
+U+03dd:m3
+U+03de:K3
+U+03df:k3
+U+03e0:P3
+U+03e1:p3
+U+0401:IO
+U+0402:D%
+U+0403:G%
+U+0404:IE
+U+0405:DS
+U+0406:II
+U+0407:YI
+U+0408:J%
+U+0409:LJ
+U+040a:NJ
+U+040b:Ts
+U+040c:KJ
+U+040e:V%
+U+040f:DZ
+U+0410:A=
+U+0411:B=
+U+0412:V=
+U+0413:G=
+U+0414:D=
+U+0415:E=
+U+0416:Z%
+U+0417:Z=
+U+0418:I=
+U+0419:J=
+U+041a:K=
+U+041b:L=
+U+041c:M=
+U+041d:N=
+U+041e:O=
+U+041f:P=
+U+0420:R=
+U+0421:S=
+U+0422:T=
+U+0423:U=
+U+0424:F=
+U+0425:H=
+U+0426:C=
+U+0427:C%
+U+0428:S%
+U+0429:Sc
+U+042a:="
+U+042b:Y=
+U+042c:%"
+U+042d:JE
+U+042e:JU
+U+042f:JA
+U+0430:a=
+U+0431:b=
+U+0432:v=
+U+0433:g=
+U+0434:d=
+U+0435:e=
+U+0436:z%
+U+0437:z=
+U+0438:i=
+U+0439:j=
+U+043a:k=
+U+043b:l=
+U+043c:m=
+U+043d:n=
+U+043e:o=
+U+043f:p=
+U+0440:r=
+U+0441:s=
+U+0442:t=
+U+0443:u=
+U+0444:f=
+U+0445:h=
+U+0446:c=
+U+0447:c%
+U+0448:s%
+U+0449:sc
+U+044a:='
+U+044b:y=
+U+044c:%'
+U+044d:je
+U+044e:ju
+U+044f:ja
+U+0451:io
+U+0452:d%
+U+0453:g%
+U+0454:ie
+U+0455:ds
+U+0456:ii
+U+0457:yi
+U+0458:j%
+U+0459:lj
+U+045a:nj
+U+045b:ts
+U+045c:kj
+U+045e:v%
+U+045f:dz
+U+0462:Y3
+U+0463:y3
+U+046a:O3
+U+046b:o3
+U+0472:F3
+U+0473:f3
+U+0474:V3
+U+0475:v3
+U+0480:C3
+U+0481:c3
+U+0490:G3
+U+0491:g3
+U+05d0:A+
+U+05d1:B+
+U+05d2:G+
+U+05d3:D+
+U+05d4:H+
+U+05d5:W+
+U+05d6:Z+
+U+05d7:X+
+U+05d8:Tj
+U+05d9:J+
+U+05da:K%
+U+05db:K+
+U+05dc:L+
+U+05dd:M%
+U+05de:M+
+U+05df:N%
+U+05e0:N+
+U+05e1:S+
+U+05e2:E+
+U+05e3:P%
+U+05e4:P+
+U+05e5:Zj
+U+05e6:ZJ
+U+05e7:Q+
+U+05e8:R+
+U+05e9:Sh
+U+05ea:T+
+U+060c:,+
+U+061b:;+
+U+061f:?+
+U+0621:H'
+U+0622:aM
+U+0623:aH
+U+0624:wH
+U+0625:ah
+U+0626:yH
+U+0627:a+
+U+0628:b+
+U+0629:tm
+U+062a:t+
+U+062b:tk
+U+062c:g+
+U+062d:hk
+U+062e:x+
+U+062f:d+
+U+0630:dk
+U+0631:r+
+U+0632:z+
+U+0633:s+
+U+0634:sn
+U+0635:c+
+U+0636:dd
+U+0637:tj
+U+0638:zH
+U+0639:e+
+U+063a:i+
+U+0640:++
+U+0641:f+
+U+0642:q+
+U+0643:k+
+U+0644:l+
+U+0645:m+
+U+0646:n+
+U+0647:h+
+U+0648:w+
+U+0649:j+
+U+064a:y+
+U+064b::+
+U+064c:"+
+U+064d:=+
+U+064e:/+
+U+064f:'+
+U+0650:1+
+U+0651:3+
+U+0652:0+
+U+0660:0a
+U+0661:1a
+U+0662:2a
+U+0663:3a
+U+0664:4a
+U+0665:5a
+U+0666:6a
+U+0667:7a
+U+0668:8a
+U+0669:9a
+U+0670:aS
+U+067e:p+
+U+0681:hH
+U+0686:tc
+U+0698:zj
+U+06a4:v+
+U+06af:gf
+U+1e00:A-0
+U+1e01:a-0
+U+1e02:B.
+U+1e03:b.
+U+1e04:B-.
+U+1e05:b-.
+U+1e06:B_
+U+1e07:b_
+U+1e08:C,'
+U+1e09:c,'
+U+1e0a:D.
+U+1e0b:d.
+U+1e0c:D-.
+U+1e0d:d-.
+U+1e0e:D_
+U+1e0f:d_
+U+1e10:D,
+U+1e11:d,
+U+1e12:D->
+U+1e13:d->
+U+1e14:E-!
+U+1e15:e-!
+U+1e16:E-'
+U+1e17:e-'
+U+1e18:E->
+U+1e19:e->
+U+1e1a:E-?
+U+1e1b:e-?
+U+1e1c:E,(
+U+1e1d:e,(
+U+1e1e:F.
+U+1e1f:f.
+U+1e20:G-
+U+1e21:g-
+U+1e22:H.
+U+1e23:h.
+U+1e24:H-.
+U+1e25:h-.
+U+1e26:H:
+U+1e27:h:
+U+1e28:H,
+U+1e29:h,
+U+1e2a:H-(
+U+1e2b:h-(
+U+1e2c:I-?
+U+1e2d:i-?
+U+1e2e:I:'
+U+1e2f:i:'
+U+1e30:K'
+U+1e31:k'
+U+1e32:K-.
+U+1e33:k-.
+U+1e34:K_
+U+1e35:k_
+U+1e36:L-.
+U+1e37:l-.
+U+1e38:L--.
+U+1e39:l--.
+U+1e3a:L_
+U+1e3b:l_
+U+1e3c:L->
+U+1e3d:l->
+U+1e3e:M'
+U+1e3f:m'
+U+1e40:M.
+U+1e41:m.
+U+1e42:M-.
+U+1e43:m-.
+U+1e44:N.
+U+1e45:n.
+U+1e46:N-.
+U+1e47:n-.
+U+1e48:N_
+U+1e49:n_
+U+1e4a:N->
+U+1e4b:n->
+U+1e4c:O?'
+U+1e4d:o?'
+U+1e4e:O?:
+U+1e4f:o?:
+U+1e50:O-!
+U+1e51:o-!
+U+1e52:O-'
+U+1e53:o-'
+U+1e54:P'
+U+1e55:p'
+U+1e56:P.
+U+1e57:p.
+U+1e58:R.
+U+1e59:r.
+U+1e5a:R-.
+U+1e5b:r-.
+U+1e5c:R--.
+U+1e5d:r--.
+U+1e5e:R_
+U+1e5f:r_
+U+1e60:S.
+U+1e61:s.
+U+1e62:S-.
+U+1e63:s-.
+U+1e64:S'.
+U+1e65:s'.
+U+1e66:S<.
+U+1e67:s<.
+U+1e68:S.-.
+U+1e69:s.-.
+U+1e6a:T.
+U+1e6b:t.
+U+1e6c:T-.
+U+1e6d:t-.
+U+1e6e:T_
+U+1e6f:t_
+U+1e70:T->
+U+1e71:t->
+U+1e72:U--:
+U+1e73:u--:
+U+1e74:U-?
+U+1e75:u-?
+U+1e76:U->
+U+1e77:u->
+U+1e78:U?'
+U+1e79:u?'
+U+1e7a:U-:
+U+1e7b:u-:
+U+1e7c:V?
+U+1e7d:v?
+U+1e7e:V-.
+U+1e7f:v-.
+U+1e80:W!
+U+1e81:w!
+U+1e82:W'
+U+1e83:w'
+U+1e84:W:
+U+1e85:w:
+U+1e86:W.
+U+1e87:w.
+U+1e88:W-.
+U+1e89:w-.
+U+1e8a:X.
+U+1e8b:x.
+U+1e8c:X:
+U+1e8d:x:
+U+1e8e:Y.
+U+1e8f:y.
+U+1e90:Z>
+U+1e91:z>
+U+1e92:Z-.
+U+1e93:z-.
+U+1e94:Z_
+U+1e95:z_
+U+1e96:h_
+U+1e97:t:
+U+1e98:w0
+U+1e99:y0
+U+1ea0:A-.
+U+1ea1:a-.
+U+1ea2:A2
+U+1ea3:a2
+U+1ea4:A>'
+U+1ea5:a>'
+U+1ea6:A>!
+U+1ea7:a>!
+U+1ea8:A>2
+U+1ea9:a>2
+U+1eaa:A>?
+U+1eab:a>?
+U+1eac:A>-.
+U+1ead:a>-.
+U+1eae:A('
+U+1eaf:a('
+U+1eb0:A(!
+U+1eb1:a(!
+U+1eb2:A(2
+U+1eb3:a(2
+U+1eb4:A(?
+U+1eb5:a(?
+U+1eb6:A(-.
+U+1eb7:a(-.
+U+1eb8:E-.
+U+1eb9:e-.
+U+1eba:E2
+U+1ebb:e2
+U+1ebc:E?
+U+1ebd:e?
+U+1ebe:E>'
+U+1ebf:e>'
+U+1ec0:E>!
+U+1ec1:e>!
+U+1ec2:E>2
+U+1ec3:e>2
+U+1ec4:E>?
+U+1ec5:e>?
+U+1ec6:E>-.
+U+1ec7:e>-.
+U+1ec8:I2
+U+1ec9:i2
+U+1eca:I-.
+U+1ecb:i-.
+U+1ecc:O-.
+U+1ecd:o-.
+U+1ece:O2
+U+1ecf:o2
+U+1ed0:O>'
+U+1ed1:o>'
+U+1ed2:O>!
+U+1ed3:o>!
+U+1ed4:O>2
+U+1ed5:o>2
+U+1ed6:O>?
+U+1ed7:o>?
+U+1ed8:O>-.
+U+1ed9:o>-.
+U+1eda:O9'
+U+1edb:o9'
+U+1edc:O9!
+U+1edd:o9!
+U+1ede:O92
+U+1edf:o92
+U+1ee0:O9?
+U+1ee1:o9?
+U+1ee2:O9-.
+U+1ee3:o9-.
+U+1ee4:U-.
+U+1ee5:u-.
+U+1ee6:U2
+U+1ee7:u2
+U+1ee8:U9'
+U+1ee9:u9'
+U+1eea:U9!
+U+1eeb:u9!
+U+1eec:U92
+U+1eed:u92
+U+1eee:U9?
+U+1eef:u9?
+U+1ef0:U9-.
+U+1ef1:u9-.
+U+1ef2:Y!
+U+1ef3:y!
+U+1ef4:Y-.
+U+1ef5:y-.
+U+1ef6:Y2
+U+1ef7:y2
+U+1ef8:Y?
+U+1ef9:y?
+U+1fbf:,,
+U+1fc0:?*
+U+1fc1:?:
+U+1fcd:,!
+U+1fce:,'
+U+1fcf:?,
+U+1fdd:;!
+U+1fde:;'
+U+1fdf:?;
+U+1fed:!:
+U+1fef:!*
+U+1ffe:;;
+U+2002:1N
+U+2003:1M
+U+2004:3M
+U+2005:4M
+U+2006:6M
+U+200e:LR
+U+200f:RL
+U+2009:1T
+U+200a:1H
+U+2010:-1
+U+2013:-N
+U+2014:-M
+U+2015:-3
+U+2016:!2
+U+2017:=2
+U+2018:'6
+U+2019:'9
+U+201a:.9
+U+201b:9'
+U+201c:"6
+U+201d:"9
+U+201e::9
+U+201f:9"
+U+2020:/-
+U+2021:/=
+U+2022:Sb
+U+2025:..
+U+2026:.3
+U+2030:%0
+U+2032:1'
+U+2033:2'
+U+2034:3'
+U+2035:1"
+U+2036:2"
+U+2037:3"
+U+2038:Ca
+U+2039:<1
+U+203a:>1
+U+203b::X
+U+203c:!*2
+U+203e:'-
+U+2044:/f
+U+2070:0S
+U+2074:4S
+U+2075:5S
+U+2076:6S
+U+2077:7S
+U+2078:8S
+U+2079:9S
+U+207a:+S
+U+207b:-S
+U+207c:=S
+U+207d:(S
+U+207e:)S
+U+207f:nS
+U+2080:0s
+U+2081:1s
+U+2082:2s
+U+2083:3s
+U+2084:4s
+U+2085:5s
+U+2086:6s
+U+2087:7s
+U+2088:8s
+U+2089:9s
+U+208a:+s
+U+208b:-s
+U+208c:=s
+U+208d:(s
+U+208e:)s
+U+20a3:Ff
+U+20a4:Li
+U+20a7:Pt
+U+20a9:W=
+U+2103:oC
+U+2105:co
+U+2109:oF
+U+2116:N0
+U+2117:PO
+U+211e:Rx
+U+2120:SM
+U+2122:TM
+U+2126:Om
+U+212b:AO
+U+2153:13
+U+2154:23
+U+2155:15
+U+2156:25
+U+2157:35
+U+2158:45
+U+2159:16
+U+215a:56
+U+215b:18
+U+215c:38
+U+215d:58
+U+215e:78
+U+2160:1R
+U+2161:2R
+U+2162:3R
+U+2163:4R
+U+2164:5R
+U+2165:6R
+U+2166:7R
+U+2167:8R
+U+2168:9R
+U+2169:aR
+U+216a:bR
+U+216b:cR
+U+216c:50R
+U+216d:100R
+U+216e:500R
+U+216f:1000R
+U+2170:1r
+U+2171:2r
+U+2172:3r
+U+2173:4r
+U+2174:5r
+U+2175:6r
+U+2176:7r
+U+2177:8r
+U+2178:9r
+U+2179:ar
+U+217a:br
+U+217b:cr
+U+217c:50r
+U+217d:100r
+U+217e:500r
+U+217f:1000r
+U+2180:1000RCD
+U+2181:5000R
+U+2182:10000R
+U+2190:<-
+U+2191:-!
+U+2192:->
+U+2193:-v
+U+2194:<>
+U+2195:UD
+U+2196:<!!
+U+2197://>
+U+2198:!!>
+U+2199:<//
+U+21a8:UD-
+U+21c0:>V
+U+21d0:<=
+U+21d2:=>
+U+21d4:==
+U+2200:FA
+U+2202:dP
+U+2203:TE
+U+2205:/0
+U+2206:DE
+U+2207:NB
+U+2208:(-
+U+220b:-)
+U+220f:*P
+U+2211:+Z
+U+2212:-2
+U+2213:-+
+U+2214:.+
+U+2217:*-
+U+2218:Ob
+U+2219:sb
+U+221a:RT
+U+221d:0(
+U+221e:00
+U+221f:-L
+U+2220:-V
+U+2225:PP
+U+2227:AN
+U+2228:OR
+U+2229:(U
+U+222a:)U
+U+222b:In
+U+222c:DI
+U+222e:Io
+U+2234:.:
+U+2235::.
+U+2236::R
+U+2237:::
+U+223c:?1
+U+223e:CG
+U+2243:?-
+U+2245:?=
+U+2248:?2
+U+224c:=?
+U+2253:HI
+U+2260:!=
+U+2261:=3
+U+2264:=<
+U+2265:>=
+U+226a:<*
+U+226b:*>
+U+226e:!<
+U+226f:!>
+U+2282:(C
+U+2283:)C
+U+2286:(_
+U+2287:)_
+U+2299:0.
+U+229a:02
+U+22a5:-T
+U+22c5:.P
+U+22ee::3
+U+2302:Eh
+U+2308:<7
+U+2309:>7
+U+230a:7<
+U+230b:7>
+U+2310:NI
+U+2312:(A
+U+2315:TR
+U+2318:88
+U+2320:Iu
+U+2321:Il
+U+2329:</
+U+232a:/>
+U+2423:Vs
+U+2440:1h
+U+2441:3h
+U+2442:2h
+U+2443:4h
+U+2446:1j
+U+2447:2j
+U+2448:3j
+U+2449:4j
+U+2460:1-o
+U+2461:2-o
+U+2462:3-o
+U+2463:4-o
+U+2464:5-o
+U+2465:6-o
+U+2466:7-o
+U+2467:8-o
+U+2468:9-o
+U+2469:10-o
+U+246a:11-o
+U+246b:12-o
+U+246c:13-o
+U+246d:14-o
+U+246e:15-o
+U+246f:16-o
+U+2470:17-o
+U+2471:18-o
+U+2472:19-o
+U+2473:20-o
+U+2474:(1)
+U+2475:(2)
+U+2476:(3)
+U+2477:(4)
+U+2478:(5)
+U+2479:(6)
+U+247a:(7)
+U+247b:(8)
+U+247c:(9)
+U+247d:(10)
+U+247e:(11)
+U+247f:(12)
+U+2480:(13)
+U+2481:(14)
+U+2482:(15)
+U+2483:(16)
+U+2484:(17)
+U+2485:(18)
+U+2486:(19)
+U+2487:(20)
+U+2488:1.
+U+2489:2.
+U+248a:3.
+U+248b:4.
+U+248c:5.
+U+248d:6.
+U+248e:7.
+U+248f:8.
+U+2490:9.
+U+2491:10.
+U+2492:11.
+U+2493:12.
+U+2494:13.
+U+2495:14.
+U+2496:15.
+U+2497:16.
+U+2498:17.
+U+2499:18.
+U+249a:19.
+U+249b:20.
+U+249c:(a)
+U+249d:(b)
+U+249e:(c)
+U+249f:(d)
+U+24a0:(e)
+U+24a1:(f)
+U+24a2:(g)
+U+24a3:(h)
+U+24a4:(i)
+U+24a5:(j)
+U+24a6:(k)
+U+24a7:(l)
+U+24a8:(m)
+U+24a9:(n)
+U+24aa:(o)
+U+24ab:(p)
+U+24ac:(q)
+U+24ad:(r)
+U+24ae:(s)
+U+24af:(t)
+U+24b0:(u)
+U+24b1:(v)
+U+24b2:(w)
+U+24b3:(x)
+U+24b4:(y)
+U+24b5:(z)
+U+24b6:A-o
+U+24b7:B-o
+U+24b8:C-o
+U+24b9:D-o
+U+24ba:E-o
+U+24bb:F-o
+U+24bc:G-o
+U+24bd:H-o
+U+24be:I-o
+U+24bf:J-o
+U+24c0:K-o
+U+24c1:L-o
+U+24c2:M-o
+U+24c3:N-o
+U+24c4:O-o
+U+24c5:P-o
+U+24c6:Q-o
+U+24c7:R-o
+U+24c8:S-o
+U+24c9:T-o
+U+24ca:U-o
+U+24cb:V-o
+U+24cc:W-o
+U+24cd:X-o
+U+24ce:Y-o
+U+24cf:Z-o
+U+24d0:a-o
+U+24d1:b-o
+U+24d2:c-o
+U+24d3:d-o
+U+24d4:e-o
+U+24d5:f-o
+U+24d6:g-o
+U+24d7:h-o
+U+24d8:i-o
+U+24d9:j-o
+U+24da:k-o
+U+24db:l-o
+U+24dc:m-o
+U+24dd:n-o
+U+24de:o-o
+U+24df:p-o
+U+24e0:q-o
+U+24e1:r-o
+U+24e2:s-o
+U+24e3:t-o
+U+24e4:u-o
+U+24e5:v-o
+U+24e6:w-o
+U+24e7:x-o
+U+24e8:y-o
+U+24e9:z-o
+U+24ea:0-o
+U+2500:hh
+U+2501:HH-
+U+2502:vv
+U+2503:VV-
+U+2504:3-
+U+2505:3_
+U+2506:3!
+U+2507:3/
+U+2508:4-
+U+2509:4_
+U+250a:4!
+U+250b:4/
+U+250c:dr
+U+250d:dR-
+U+250e:Dr-
+U+250f:DR-
+U+2510:dl
+U+2511:dL-
+U+2512:Dl-
+U+2513:LD-
+U+2514:ur
+U+2515:uR-
+U+2516:Ur-
+U+2517:UR-
+U+2518:ul
+U+2519:uL-
+U+251a:Ul-
+U+251b:UL-
+U+251c:vr
+U+251d:vR-
+U+251e:Udr
+U+251f:uDr
+U+2520:Vr-
+U+2521:UdR
+U+2522:uDR
+U+2523:VR-
+U+2524:vl
+U+2525:vL-
+U+2526:Udl
+U+2527:uDl
+U+2528:Vl-
+U+2529:UdL
+U+252a:uDL
+U+252b:VL-
+U+252c:dh
+U+252d:dLr
+U+252e:dlR
+U+252f:dH-
+U+2530:Dh-
+U+2531:DLr
+U+2532:DlR
+U+2533:DH-
+U+2534:uh
+U+2535:uLr
+U+2536:ulR
+U+2537:uH-
+U+2538:Uh-
+U+2539:ULr
+U+253a:UlR
+U+253b:UH-
+U+253c:vh
+U+253d:vLr
+U+253e:vlR
+U+253f:vH-
+U+2540:Udh
+U+2541:uDh
+U+2542:Vh-
+U+2543:UdLr
+U+2544:UdlR
+U+2545:uDLr
+U+2546:uDlR
+U+2547:UdH
+U+2548:uDH
+U+2549:VLr
+U+254a:VlR
+U+254b:VH-
+U+2550:HH
+U+2551:VV
+U+2552:dR
+U+2553:Dr
+U+2554:DR
+U+2555:dL
+U+2556:Dl
+U+2557:LD
+U+2558:uR
+U+2559:Ur
+U+255a:UR
+U+255b:uL
+U+255c:Ul
+U+255d:UL
+U+255e:vR
+U+255f:Vr
+U+2560:VR
+U+2561:vL
+U+2562:Vl
+U+2563:VL
+U+2564:dH
+U+2565:Dh
+U+2566:DH
+U+2567:uH
+U+2568:Uh
+U+2569:UH
+U+256a:vH
+U+256b:Vh
+U+256c:VH
+U+2571:FD
+U+2572:BD
+U+2580:TB
+U+2584:LB
+U+2588:FB
+U+258c:lB
+U+2590:RB
+U+2591:.S
+U+2592::S
+U+2593:?S
+U+25a0:fS
+U+25a1:OS
+U+25a2:RO
+U+25a3:Rr
+U+25a4:RF
+U+25a5:RY
+U+25a6:RH
+U+25a7:RZ
+U+25a8:RK
+U+25a9:RX
+U+25aa:sB
+U+25ac:SR
+U+25ad:Or
+U+25b2:UT
+U+25b3:uT
+U+25b7:Tr
+U+25ba:PR
+U+25bc:Dt
+U+25bd:dT
+U+25c1:Tl
+U+25c4:PL
+U+25c6:Db
+U+25c7:Dw
+U+25ca:LZ
+U+25cb:0m
+U+25ce:0o
+U+25cf:0M
+U+25d0:0L
+U+25d1:0R
+U+25d8:Sn
+U+25d9:Ic
+U+25e2:Fd
+U+25e3:Bd
+U+25ef:Ci
+U+2605:*2
+U+2606:*1
+U+260e:TEL
+U+260f:tel
+U+261c:<H
+U+261e:>H
+U+263a:0u
+U+263b:0U
+U+263c:SU
+U+2640:Fm
+U+2642:Ml
+U+2660:cS
+U+2661:cH
+U+2662:cD
+U+2663:cC
+U+2664:cS-
+U+2665:cH-
+U+2666:cD-
+U+2667:cC-
+U+2669:Md
+U+266a:M8
+U+266b:M2
+U+266c:M16
+U+266d:Mb
+U+266e:Mx
+U+266f:MX
+U+2713:OK
+U+2717:XX
+U+2720:-X
+U+3000:IS
+U+3001:,_
+U+3002:._
+U+3003:+"
+U+3004:JIS
+U+3005:*_
+U+3006:;_
+U+3007:0_
+U+300a:<+
+U+300b:>+
+U+300c:<'
+U+300d:>'
+U+300e:<"
+U+300f:>"
+U+3010:("
+U+3011:)"
+U+3012:=T
+U+3013:=_
+U+3014:('
+U+3015:)'
+U+3016:(I
+U+3017:)I
+U+301c:-?
+U+3020:=T:)
+U+3041:A5
+U+3042:a5
+U+3043:I5
+U+3044:i5
+U+3045:U5
+U+3046:u5
+U+3047:E5
+U+3048:e5
+U+3049:O5
+U+304a:o5
+U+304b:ka
+U+304c:ga
+U+304d:ki
+U+304e:gi
+U+304f:ku
+U+3050:gu
+U+3051:ke
+U+3052:ge
+U+3053:ko
+U+3054:go
+U+3055:sa
+U+3056:za
+U+3057:si
+U+3058:zi
+U+3059:su
+U+305a:zu
+U+305b:se
+U+305c:ze
+U+305d:so
+U+305e:zo
+U+305f:ta
+U+3060:da
+U+3061:ti
+U+3062:di
+U+3063:tU
+U+3064:tu
+U+3065:du
+U+3066:te
+U+3067:de
+U+3068:to
+U+3069:do
+U+306a:na
+U+306b:ni
+U+306c:nu
+U+306d:ne
+U+306e:no
+U+306f:ha
+U+3070:ba
+U+3071:pa
+U+3072:hi
+U+3073:bi
+U+3074:pi
+U+3075:hu
+U+3076:bu
+U+3077:pu
+U+3078:he
+U+3079:be
+U+307a:pe
+U+307b:ho
+U+307c:bo
+U+307d:po
+U+307e:ma
+U+307f:mi
+U+3080:mu
+U+3081:me
+U+3082:mo
+U+3083:yA
+U+3084:ya
+U+3085:yU
+U+3086:yu
+U+3087:yO
+U+3088:yo
+U+3089:ra
+U+308a:ri
+U+308b:ru
+U+308c:re
+U+308d:ro
+U+308e:wA
+U+308f:wa
+U+3090:wi
+U+3091:we
+U+3092:wo
+U+3093:n5
+U+3094:vu
+U+309b:"5
+U+309c:05
+U+309d:*5
+U+309e:+5
+U+30a1:a6
+U+30a2:A6
+U+30a3:i6
+U+30a4:I6
+U+30a5:u6
+U+30a6:U6
+U+30a7:e6
+U+30a8:E6
+U+30a9:o6
+U+30aa:O6
+U+30ab:Ka
+U+30ac:Ga
+U+30ad:Ki
+U+30ae:Gi
+U+30af:Ku
+U+30b0:Gu
+U+30b1:Ke
+U+30b2:Ge
+U+30b3:Ko
+U+30b4:Go
+U+30b5:Sa
+U+30b6:Za
+U+30b7:Si
+U+30b8:Zi
+U+30b9:Su
+U+30ba:Zu
+U+30bb:Se
+U+30bc:Ze
+U+30bd:So
+U+30be:Zo
+U+30bf:Ta
+U+30c0:Da
+U+30c1:Ti
+U+30c2:Di
+U+30c3:TU
+U+30c4:Tu
+U+30c5:Du
+U+30c6:Te
+U+30c7:De
+U+30c8:To
+U+30c9:Do
+U+30ca:Na
+U+30cb:Ni
+U+30cc:Nu
+U+30cd:Ne
+U+30ce:No
+U+30cf:Ha
+U+30d0:Ba
+U+30d1:Pa
+U+30d2:Hi
+U+30d3:Bi
+U+30d4:Pi
+U+30d5:Hu
+U+30d6:Bu
+U+30d7:Pu
+U+30d8:He
+U+30d9:Be
+U+30da:Pe
+U+30db:Ho
+U+30dc:Bo
+U+30dd:Po
+U+30de:Ma
+U+30df:Mi
+U+30e0:Mu
+U+30e1:Me
+U+30e2:Mo
+U+30e3:YA
+U+30e4:Ya
+U+30e5:YU
+U+30e6:Yu
+U+30e7:YO
+U+30e8:Yo
+U+30e9:Ra
+U+30ea:Ri
+U+30eb:Ru
+U+30ec:Re
+U+30ed:Ro
+U+30ee:WA
+U+30ef:Wa
+U+30f0:Wi
+U+30f1:We
+U+30f2:Wo
+U+30f3:N6
+U+30f4:Vu
+U+30f5:KA
+U+30f6:KE
+U+30f7:Va
+U+30f8:Vi
+U+30f9:Ve
+U+30fa:Vo
+U+30fb:.6
+U+30fc:-6
+U+30fd:*6
+U+30fe:+6
+U+3105:b4
+U+3106:p4
+U+3107:m4
+U+3108:f4
+U+3109:d4
+U+310a:t4
+U+310b:n4
+U+310c:l4
+U+310d:g4
+U+310e:k4
+U+310f:h4
+U+3110:j4
+U+3111:q4
+U+3112:x4
+U+3113:zh
+U+3114:ch
+U+3115:sh
+U+3116:r4
+U+3117:z4
+U+3118:c4
+U+3119:s4
+U+311a:a4
+U+311b:o4
+U+311c:e4
+U+311d:eh4
+U+311e:ai
+U+311f:ei
+U+3120:au
+U+3121:ou
+U+3122:an
+U+3123:en
+U+3124:aN
+U+3125:eN
+U+3126:er
+U+3127:i4
+U+3128:u4
+U+3129:iu
+U+312a:v4
+U+312b:nG
+U+312c:gn
+U+321c:(JU)
+U+3220:1c
+U+3221:2c
+U+3222:3c
+U+3223:4c
+U+3224:5c
+U+3225:6c
+U+3226:7c
+U+3227:8c
+U+3228:9c
+U+3229:10c
+U+327f:KSC
+U+33c2:am
+U+33d8:pm
+U+fb00:ff
+U+fb01:fi
+U+fb02:fl
+U+fb03:ffi
+U+fb04:ffl
+U+fb05:St
+U+fb06:st
+U+fe7d:3+;
+U+fe82:aM.
+U+fe84:aH.
+U+fe88:ah.
+U+fe8d:a+-
+U+fe8e:a+.
+U+fe8f:b+-
+U+fe90:b+.
+U+fe91:b+,
+U+fe92:b+;
+U+fe93:tm-
+U+fe94:tm.
+U+fe95:t+-
+U+fe96:t+.
+U+fe97:t+,
+U+fe98:t+;
+U+fe99:tk-
+U+fe9a:tk.
+U+fe9b:tk,
+U+fe9c:tk;
+U+fe9d:g+-
+U+fe9e:g+.
+U+fe9f:g+,
+U+fea0:g+;
+U+fea1:hk-
+U+fea2:hk.
+U+fea3:hk,
+U+fea4:hk;
+U+fea5:x+-
+U+fea6:x+.
+U+fea7:x+,
+U+fea8:x+;
+U+fea9:d+-
+U+feaa:d+.
+U+feab:dk-
+U+feac:dk.
+U+fead:r+-
+U+feae:r+.
+U+feaf:z+-
+U+feb0:z+.
+U+feb1:s+-
+U+feb2:s+.
+U+feb3:s+,
+U+feb4:s+;
+U+feb5:sn-
+U+feb6:sn.
+U+feb7:sn,
+U+feb8:sn;
+U+feb9:c+-
+U+feba:c+.
+U+febb:c+,
+U+febc:c+;
+U+febd:dd-
+U+febe:dd.
+U+febf:dd,
+U+fec0:dd;
+U+fec1:tj-
+U+fec2:tj.
+U+fec3:tj,
+U+fec4:tj;
+U+fec5:zH-
+U+fec6:zH.
+U+fec7:zH,
+U+fec8:zH;
+U+fec9:e+-
+U+feca:e+.
+U+fecb:e+,
+U+fecc:e+;
+U+fecd:i+-
+U+fece:i+.
+U+fecf:i+,
+U+fed0:i+;
+U+fed1:f+-
+U+fed2:f+.
+U+fed3:f+,
+U+fed4:f+;
+U+fed5:q+-
+U+fed6:q+.
+U+fed7:q+,
+U+fed8:q+;
+U+fed9:k+-
+U+feda:k+.
+U+fedb:k+,
+U+fedc:k+;
+U+fedd:l+-
+U+fede:l+.
+U+fedf:l+,
+U+fee0:l+;
+U+fee1:m+-
+U+fee2:m+.
+U+fee3:m+,
+U+fee4:m+;
+U+fee5:n+-
+U+fee6:n+.
+U+fee7:n+,
+U+fee8:n+;
+U+fee9:h+-
+U+feea:h+.
+U+feeb:h+,
+U+feec:h+;
+U+feed:w+-
+U+feee:w+.
+U+feef:j+-
+U+fef0:j+.
+U+fef1:y+-
+U+fef2:y+.
+U+fef3:y+,
+U+fef4:y+;
+U+fef5:lM-
+U+fef6:lM.
+U+fef7:lH-
+U+fef8:lH.
+U+fef9:lh-
+U+fefa:lh.
+U+fefb:la-
+U+fefc:la.
+U+0000:NU
+U+0001:SH
+U+0002:SX
+U+0003:EX
+U+0004:ET
+U+0005:EQ
+U+0006:AK
+U+0007:BL
+U+0008:BS
+U+0009:HT
+U+000a:LF
+U+000b:VT
+U+000c:FF
+U+000d:CR
+U+000e:SO
+U+000f:SI
+U+0010:DL
+U+0011:D1
+U+0012:D2
+U+0013:D3
+U+0014:D4
+U+0015:NK
+U+0016:SY
+U+0017:EB
+U+0018:CN
+U+0019:EM
+U+001a:SB
+U+001b:EC
+U+001c:FS
+U+001d:GS
+U+001e:RS
+U+001f:US
+U+007f:DT
+U+0080:PA
+U+0081:HO
+U+0082:BH
+U+0083:NH
+U+0084:IN
+U+0085:NL
+U+0086:SA
+U+0087:ES
+U+0088:HS
+U+0089:HJ
+U+008a:VS
+U+008b:PD
+U+008c:PU
+U+008d:RI
+U+008e:S2
+U+008f:S3
+U+0090:DC
+U+0091:P1
+U+0092:P2
+U+0093:TS
+U+0094:CC
+U+0095:MW
+U+0096:SG
+U+0097:EG
+U+0098:SS
+U+0099:GC
+U+009a:SC
+U+009b:CI
+U+009c:ST
+U+009d:OC
+U+009e:PM
+U+009f:AC
+# Characters in Private Use Area (e000-f8ff) do not have ussigned numbers
+# according Unicode 2.0
diff --git a/src/chrtrans/rot13_kb.h b/src/chrtrans/rot13_kb.h
new file mode 100644
index 0000000..1df5f32
--- /dev/null
+++ b/src/chrtrans/rot13_kb.h
@@ -0,0 +1,22 @@
+static LYKbLayout_t kb_layout_rot13[128] =
+{
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, /* 00..07 */
+ 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, /* 08..0F */
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, /* 10..17 */
+ 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, /* 18..1F */
+
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, /* 20..27 */
+ 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, /* 28..2F */
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, /* 30..37 */
+ 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, /* 38..3F */
+
+ 0x0000, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, /* 40..48 */
+ 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x0041, 0x0042, /* 40..4F */
+ 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, /* 50..58 */
+ 0x004b, 0x004c, 0x004d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 50..5F */
+
+ 0x0000, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, /* 60..68 */
+ 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x0061, 0x0062, /* 60..6F */
+ 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, /* 70..78 */
+ 0x006b, 0x006c, 0x006d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 /* 70..7F */
+};
diff --git a/src/chrtrans/utf8_uni.tbl b/src/chrtrans/utf8_uni.tbl
new file mode 100644
index 0000000..88ad492
--- /dev/null
+++ b/src/chrtrans/utf8_uni.tbl
@@ -0,0 +1,35 @@
+#
+# This one is not really much of a "translation table", it mostly just
+# tells Lynx that "utf-8" is Unicode/UCS2 encoded in UTF8. Note that
+# "unicode-1-1-utf-8" and "utf8" are treated as synonyms.
+#
+#The MIME name of this charset.
+Mutf-8
+
+#Name as a Display Charset (used on Options screen)
+OUNICODE (UTF-8)
+
+# Some kind of raw Unicode?
+# Use 6 for for really "raw" 16bit UCS-2, 7 for UTF-8, ...
+
+# most of these codes currently don't make much sense in a *.tbl file,
+# but for completeness (from UCDefs.h):
+# #define UCT_ENC_7BIT 0
+# #define UCT_ENC_8BIT 1
+# #define UCT_ENC_8859 2
+# #define UCT_ENC_8BIT_C0 3
+# #define UCT_ENC_MAYBE2022 4
+# #define UCT_ENC_CJK 5
+# #define UCT_ENC_16BIT 6
+# #define UCT_ENC_UTF8 7
+
+R 7
+
+#Shall this become the "default" translation?
+#There has to be exactly one table marked as "default".
+Default NO
+
+# Don't fall back to default table for unicode -> 8bit
+Fallback NO
+
+0x20-0x7f idem
diff --git a/src/chrtrans/viscii_uni.tbl b/src/chrtrans/viscii_uni.tbl
new file mode 100644
index 0000000..617f1e1
--- /dev/null
+++ b/src/chrtrans/viscii_uni.tbl
@@ -0,0 +1,300 @@
+#
+# Unicode mapping table for VISCII 1.1 fonts and charset=viscii,
+# described in RFC 1456.
+# See also <URL:http://www.trichlor.org/vietstd/report/rep92.htm>,
+# also for testing.
+# The 6 characters encoded in the C0 control region should not
+# be passed through to the terminal but be mapped to VIQR strings.
+# THe two changed mappings of MacVISCII are recognized in documents.
+
+# [convert with makeuctb]
+#
+#The MIME name of this charset.
+Mviscii
+
+#Name as a Display Charset (used on Options screen).
+OVietnamese (VISCII)
+
+# Special 'enc' flag to signal that some C0 characters are used.
+# Tables with R3 should properly map the allowed C0 control chars!
+#
+# most of these codes currently don't make much sense in a *.tbl file,
+# but for completeness (from UCDefs.h):
+# #define UCT_ENC_7BIT 0
+# #define UCT_ENC_8BIT 1
+# #define UCT_ENC_8859 2
+# #define UCT_ENC_8BIT_C0 3
+# #define UCT_ENC_MAYBE2022 4
+# #define UCT_ENC_CJK 5
+# #define UCT_ENC_16BIT 6
+# #define UCT_ENC_UTF8 7
+
+R 3
+
+#0x00 U+0000
+#0x01 U+0001
+#0x03 U+0003
+#0x04 U+0004
+#0x07 U+0007
+#0x08 U+0008
+0x09 U+0009
+0x0a U+000a
+#0x0b U+000b
+0x0c U+000c
+U+000c " "
+0x0d U+000d
+#0x0e U+000e
+#0x0f U+000f
+#0x10 U+0010
+#0x11 U+0011
+#0x12 U+0012
+#0x13 U+0013
+#0x15 U+0015
+#0x16 U+0016
+#0x17 U+0017
+#0x18 U+0018
+0x1a U+001a
+U+001a:^Z
+#0x1b U+001b
+#0x1c U+001c
+#0x1d U+001d
+#0x1f U+001f
+#0x20 U+0020
+#0x21 U+0021
+#0x22 U+0022
+#0x23 U+0023
+#0x24 U+0024
+#0x25 U+0025
+#0x26 U+0026
+#0x27 U+0027
+#0x28 U+0028
+#0x29 U+0029
+#0x2a U+002a
+#0x2b U+002b
+#0x2c U+002c
+#0x2d U+002d
+#0x2e U+002e
+#0x2f U+002f
+#0x30 U+0030
+#0x31 U+0031
+#0x32 U+0032
+#0x33 U+0033
+#0x34 U+0034
+#0x35 U+0035
+#0x36 U+0036
+#0x37 U+0037
+#0x38 U+0038
+#0x39 U+0039
+#0x3a U+003a
+#0x3b U+003b
+#0x3c U+003c
+#0x3d U+003d
+#0x3e U+003e
+#0x3f U+003f
+#0x40 U+0040
+#0x41 U+0041
+#0x42 U+0042
+#0x43 U+0043
+#0x44 U+0044
+#0x45 U+0045
+#0x46 U+0046
+#0x47 U+0047
+#0x48 U+0048
+#0x49 U+0049
+#0x4a U+004a
+#0x4b U+004b
+#0x4c U+004c
+#0x4d U+004d
+#0x4e U+004e
+#0x4f U+004f
+#0x50 U+0050
+#0x51 U+0051
+#0x52 U+0052
+#0x53 U+0053
+#0x54 U+0054
+#0x55 U+0055
+#0x56 U+0056
+#0x57 U+0057
+#0x58 U+0058
+#0x59 U+0059
+#0x5a U+005a
+#0x5b U+005b
+#0x5c U+005c
+#0x5d U+005d
+#0x5e U+005e
+#0x5f U+005f
+#0x60 U+0060
+#0x61 U+0061
+#0x62 U+0062
+#0x63 U+0063
+#0x64 U+0064
+#0x65 U+0065
+#0x66 U+0066
+#0x67 U+0067
+#0x68 U+0068
+#0x69 U+0069
+#0x6a U+006a
+#0x6b U+006b
+#0x6c U+006c
+#0x6d U+006d
+#0x6e U+006e
+#0x6f U+006f
+#0x70 U+0070
+#0x71 U+0071
+#0x72 U+0072
+#0x73 U+0073
+#0x74 U+0074
+#0x75 U+0075
+#0x76 U+0076
+#0x77 U+0077
+#0x78 U+0078
+#0x79 U+0079
+#0x7a U+007a
+#0x7b U+007b
+#0x7c U+007c
+#0x7d U+007d
+#0x7e U+007e
+#0x7f U+007f
+0xc0 U+00c0
+0xc1 U+00c1
+0xc2 U+00c2
+0xc3 U+00c3
+0xc8 U+00c8
+0xc9 U+00c9
+0xca U+00ca
+0xcc U+00cc
+0xcd U+00cd
+0xd2 U+00d2
+0xd3 U+00d3
+0xd4 U+00d4
+0xa0 U+00d5
+0xd9 U+00d9
+0xda U+00da
+0xdd U+00dd
+0xe0 U+00e0
+0xe1 U+00e1
+0xe2 U+00e2
+0xe3 U+00e3
+0xe8 U+00e8
+0xe9 U+00e9
+0xea U+00ea
+0xec U+00ec
+0xed U+00ed
+0xf2 U+00f2
+0xf3 U+00f3
+0xf4 U+00f4
+0xf5 U+00f5
+0xf9 U+00f9
+0xfa U+00fa
+0xfd U+00fd
+0xc5 U+0102
+0xe5 U+0103
+0xd0 U+0110
+0xf0 U+0111 U+00f0 # "edh" is similar enough to map it here
+0xce U+0128
+0xee U+0129
+0x9d U+0168
+0xfb U+0169
+0xb4 U+01a0
+0xbd U+01a1
+0xbf U+01af
+0xdf U+01b0
+0x80 U+1ea0
+0xd5 U+1ea1
+0xc4 U+1ea2
+0xe4 U+1ea3
+0x84 U+1ea4
+0xa4 U+1ea5
+0x85 U+1ea6
+0xa5 U+1ea7
+0x86 U+1ea8
+0xa6 U+1ea9
+0x06 U+1eaa
+U+1eaa "\302~" # A with circumflex (same code as in iso-8859-1) and tilde
+0xe7 U+1eab
+0x87 U+1eac
+0xa7 U+1ead
+0x81 U+1eae
+0xa1 U+1eaf
+0x82 U+1eb0
+0xa2 U+1eb1
+0x02 U+1eb2
+U+1eb2:A(?
+0xc6 U+1eb3
+0x05 U+1eb4
+U+1eb4:A(~
+0xc7 U+1eb5
+0x83 U+1eb6
+0xa3 U+1eb7
+0x89 U+1eb8
+0xa9 U+1eb9
+0xcb U+1eba
+0xeb U+1ebb
+0x88 U+1ebc
+0xa8 U+1ebd
+0x8a U+1ebe
+0xaa U+1ebf
+0x8b U+1ec0
+0xab U+1ec1
+0x8c U+1ec2
+0xac U+1ec3
+0x8d U+1ec4
+0xad U+1ec5
+0x8e U+1ec6
+0xae U+1ec7
+0x9b U+1ec8
+0xef U+1ec9
+0x98 U+1eca
+0xb8 U+1ecb
+0x9a U+1ecc
+0xf7 U+1ecd
+0x99 U+1ece
+0xf6 U+1ecf
+0x8f U+1ed0
+0xaf U+1ed1
+0x90 U+1ed2
+0xb0 U+1ed3
+0x91 U+1ed4
+0xb1 U+1ed5
+0x92 U+1ed6
+0xb2 U+1ed7
+0x93 U+1ed8
+0xb5 U+1ed9
+0x95 U+1eda
+0xbe U+1edb
+0x96 U+1edc
+0xb6 U+1edd
+0x97 U+1ede
+0xb7 U+1edf
+0xb3 U+1ee0
+0xde U+1ee1
+0x94 U+1ee2
+0xfe U+1ee3
+0x9e U+1ee4
+0xf8 U+1ee5
+0x9c U+1ee6
+0xfc U+1ee7
+0xba U+1ee8
+0xd1 U+1ee9
+0xbb U+1eea
+0xd7 U+1eeb
+0xbc U+1eec
+0xd8 U+1eed
+0xff U+1eee
+0xe6 U+1eef
+0xb9 U+1ef0
+0xf1 U+1ef1
+0x9f U+1ef2
+0xcf U+1ef3
+0x18 U+1ef4 # MacVISCII
+0x1e U+1ef4
+U+1ef4:Y.
+0xdc U+1ef5
+0x17 U+1ef6 # MacVISCII
+0x14 U+1ef6
+U+1ef6:Y?
+0xd6 U+1ef7
+0x19 U+1ef8
+U+1ef8:Y~
+0xdb U+1ef9
+
diff --git a/src/chrtrans/yawerty_kb.h b/src/chrtrans/yawerty_kb.h
new file mode 100644
index 0000000..8301c81
--- /dev/null
+++ b/src/chrtrans/yawerty_kb.h
@@ -0,0 +1,22 @@
+static LYKbLayout_t kb_layout_yawerty[128] =
+{
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, /* 00..07 */
+ 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, /* 08..0F */
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, /* 10..17 */
+ 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, /* 18..1F */
+
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, /* 20..27 */
+ 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, /* 28..2F */
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, /* 30..37 */
+ 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, /* 38..3F */
+
+ 0x042e, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413, /* 40..47 */
+ 0x0425, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, /* 48..4F */
+ 0x041f, 0x042f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412, /* 50..57 */
+ 0x042c, 0x042b, 0x0417, 0x0448, 0x044d, 0x0449, 0x0447, 0x044a, /* 58..5F */
+
+ 0x044e, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433, /* 60..67 */
+ 0x0445, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, /* 68..6F */
+ 0x043f, 0x044f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432, /* 70..77 */
+ 0x044c, 0x044b, 0x0437, 0x0428, 0x042d, 0x0429, 0x0427, 0x0000 /* 78..7F */
+};
diff --git a/src/cmu_tcp.opt b/src/cmu_tcp.opt
new file mode 100644
index 0000000..24e43fe
--- /dev/null
+++ b/src/cmu_tcp.opt
@@ -0,0 +1 @@
+cmuip_root:[syslib]libcmu/library
diff --git a/src/decc.opt b/src/decc.opt
new file mode 100644
index 0000000..670a21b
--- /dev/null
+++ b/src/decc.opt
@@ -0,0 +1,2 @@
+sys$library:vaxcrtl/library
+sys$library:vaxccurse/library
diff --git a/src/descrip.mms b/src/descrip.mms
new file mode 100644
index 0000000..6b22b78
--- /dev/null
+++ b/src/descrip.mms
@@ -0,0 +1,172 @@
+! $LynxId: descrip.mms,v 1.12 2008/06/30 23:50:22 tom Exp $
+!
+! Make LYNX hypertext browser under VMS
+! =====================================
+!
+! NOTE: Use [.SRC.CHRTRANS]BUILD-CHRTRANS.COM to create the
+! chrtrans header files before using this descrip.mms.
+!
+! History:
+! 1/1/93 creation at KU (Lou montulli@ukanaix.cc.ukans.edu).
+! 4/12/93 (seb@lns61.tn.cornell.edu)
+! modified to support either UCX or MULTINET
+! 12/2/93 modified to support Lynx rewrite
+! 12/13/93 (macrides@sci.wfeb.edu)
+! Added conditional compilations for VAXC vs. DECC
+! (dependencies not yet specified; this is just a
+! "starter", should anyone want to do it well).
+! 10/31/94 RLD Updated for Lynx v2.3.4-VMS, supporting OpenCMU
+! and TCPWare
+! 11/11/94 RLD Updated for Lynx v2.3.5-VMS
+! 11/18/94 FM Updated for SOCKETSHR/NETLIB
+! 12/07/94 FM Updated for DECC/VAX, VAXC/VAX and DECC/AXP
+! 05/03/95 FM Include /NoMember for DECC (not the default on AXP, and
+! the code assumes byte alignment).
+! 06/14/95 FM Added LYList.
+! 07/26/95 FM Separated transport (TOPT) and compiler (COPT) option files.
+! 07/29/95 FM Added support for GNUC.
+! 02/29/96 FM Added LYMap.
+! 06/28/97 FM Added UCAuto, UCAux, and UCdomap.
+! 15 Sep 06 (TD) Cleanup...
+!
+! Instructions:
+! Use the correct command line for your TCP/IP implementation:
+!
+! $ MMS for VAXC - MultiNet
+! $ MMS /Macro = (MULTINET=1) for VAXC - MultiNet
+! $ MMS /Macro = (WIN_TCP=1) for VAXC - Wollongong TCP/IP
+! $ MMS /Macro = (UCX=1) for VAXC - UCX
+! $ MMS /Macro = (CMU_TCP=1) for VAXC - OpenCMU TCP/IP
+! $ MMS /Macro = (SOCKETSHR_TCP=1) for VAXC - SOCKETSHR/NETLIB
+! $ MMS /Macro = (TCPWARE=1) for VAXC - TCPWare TCP/IP
+! $ MMS /Macro = (DECNET=1) for VAXC - socket emulation over DECnet
+!
+! $ MMS /Macro = (MULTINET=1, DEC_C=1) for DECC - MultiNet
+! $ MMS /Macro = (WIN_TCP=1, DEC_C=1) for DECC - Wollongong TCP/IP
+! $ MMS /Macro = (UCX=1, DEC_C=1) for DECC - UCX
+! $ MMS /Macro = (CMU_TCP=1, DEC_C=1) for DECC - OpenCMU TCP/IP
+! $ MMS /Macro = (SOCKETSHR_TCP=1,DEC_C=1) for DECC - SOCKETSHR/NETLIB
+! $ MMS /Macro = (TCPWARE=1, DEC_C=1) for DECC - OpenCMU TCP/IP
+! $ MMS /Macro = (DECNET=1, DEC_C=1) for DECC - socket emulation over DECnet
+!
+! $ MMS /Macro = (MULTINET=1, GNU_C=1) for GNUC - MultiNet
+! $ MMS /Macro = (WIN_TCP=1, GNU_C=1) for GNUC - Wollongong TCP/IP
+! $ MMS /Macro = (UCX=1, GNU_C=1) for GNUC - UCX
+! $ MMS /Macro = (CMU_TCP=1, GNU_C=1) for GNUC - OpenCMU TCP/IP
+! $ MMS /Macro = (SOCKETSHR_TCP=1,GNU_C=1) for GNUC - SOCKETSHR/NETLIB
+! $ MMS /Macro = (TCPWARE=1, GNU_C=1) for GNUC - OpenCMU TCP/IP
+! $ MMS /Macro = (DECNET=1, GNU_C=1) for GNUC - socket emulation over DECnet
+
+OBJS = DefaultStyle.obj, GridText.obj, HTAlert.obj, HTFWriter.obj, -
+ HTInit.obj, HTML.obj, LYBookmark.obj, LYCgi.obj, LYCharSets.obj, -
+ LYCharUtils.obj, LYClean.obj, LYCookie.obj, LYCurses.obj, -
+ LYDownload.obj, LYEdit.obj, LYEditmap.obj, LYForms.obj, -
+ LYGetFile.obj, LYHistory.obj, LYJump.obj, LYKeymap.obj, -
+ LYLeaks.obj, LYList.obj, LYMail.obj, LYMain.obj, LYMainLoop.obj, -
+ LYMap.obj, LYNews.obj, LYOptions.obj, LYPrint.obj, LYReadCFG.obj, -
+ LYSearch.obj, LYShowInfo.obj, LYStrings.obj, LYTraversal.obj, -
+ LYUpload.obj, LYUtils.obj, LYexit.obj, LYrcFile.obj, TRSTable.obj, -
+ LYmktime.obj, UCAuto.obj, UCAux.obj, UCdomap.obj, parsdate.obj
+
+.ifdef SLANG
+SCREEN_DEF = USE_SLANG
+SCREEN_INC = , SLANG_INC
+SCREEN_LIB = , SLANG_LIB:slang.olb/lib
+.else
+.ifdef DEC_C
+SCREEN_DEF = __VMS_CURSES
+.endif
+.endif
+
+.ifdef DEC_C
+COMPILER = DECC
+MODEL_DEF = _DECC_V4_SOURCE
+.else
+MODEL_DEF =
+.ifdef GNU_C
+COMPILER = GNUC
+CC = gcc
+.else
+COMPILER = VAXC
+.endif
+.endif
+
+.ifdef WIN_TCP
+NETWORK_DEF = WIN_TCP
+NETWORK_OPT = WIN_TCP
+.else
+.ifdef CMU_TCP
+NETWORK_DEF = CMU_TCP
+NETWORK_OPT = CMU_TCP
+.else
+.ifdef SOCKETSHR_TCP
+NETWORK_DEF = SOCKETSHR_TCP
+NETWORK_OPT = SOCKETSHR_TCP
+.else
+.ifdef UCX
+NETWORK_DEF = UCX
+.ifdef DEC_C
+NETWORK_OPT = UCXSHR
+.else
+NETWORK_OPT = UCXOLB
+.endif
+.else
+.ifdef TCPWARE
+NETWORK_DEF = TCPWARE,UCX
+.ifdef DEC_C
+NETWORK_OPT = TCPWARESHR
+.else
+NETWORK_OPT = TCPWAREOLB
+.endif
+.else
+.ifdef DECnet
+NETWORK_DEF = DECNET
+NETWORK_OPT = DECNET
+.else ! Default to MultiNet
+NETWORK_DEF = MULTINET,__SOCKET_TYPEDEFS
+NETWORK_OPT = MULTINET
+.endif ! DECnet
+.endif ! TCPWARE
+.endif ! UCX
+.endif ! SOCKETSHR_TCP
+.endif ! CMU_TCP
+.endif ! WIN_TCP
+
+COMPILER_DEF = $(MODEL_DEF),$(NETWORK_DEF),$(SCREEN_DEF)
+
+.ifdef DEC_C
+MY_CFLAGS = /decc/Prefix=All/NoMember/Define=(ACCESS_AUTH,$(COMPILER_DEF))
+.else
+MY_CFLAGS = /Define = (ACCESS_AUTH, $(COMPILER_DEF))
+.endif
+
+.if "$(MMS_ARCHNAME)" .eq "IA64"
+TOPT =
+COPT =
+.else
+TOPT = ,sys$disk:[]$(NETWORK_OPT).opt/opt
+COPT = ,sys$disk:[]$(COMPILER).opt/opt
+.endif
+
+WWWLIB = [-.WWW.Library.Implementation]WWWLib.olb
+CFLAGS = $(MY_CFLAGS) $(CFLAGS)/Include=([], [-], [.chrtrans], [-.WWW.Library.Implementation]$(SCREEN_INC))
+
+
+lynx : lynx.exe
+ @ Continue
+
+HDRS = [.chrtrans]iso01_uni.h
+
+lynx.exe : $(HDRS) $(OBJS) $(WWWLIB)
+ $(LINK) /Executable = Lynx.exe $(OBJS), $(WWWLIB)/lib $(SCREEN_LIB) $(TOPT) $(COPT)
+
+$(HDRS) :
+ set default [.chrtrans]
+ @build-chrtrans
+ set default [-]
+
+clean :
+ - Set Protection = (Owner:RWED) *.*;-1
+ - Purge /NoLog /NoConfirm
+ - Delete /NoConfirm /NoLog *.obj;*
+ - Delete /NoConfirm /NoLog *.exe;*
diff --git a/src/gnuc.opt b/src/gnuc.opt
new file mode 100644
index 0000000..0fe5159
--- /dev/null
+++ b/src/gnuc.opt
@@ -0,0 +1,3 @@
+gnu_cc:[000000]gcclib/library
+sys$share:vaxcrtl/share
+sys$library:vaxccurse/library
diff --git a/src/makefile.dos b/src/makefile.dos
new file mode 100644
index 0000000..5409676
--- /dev/null
+++ b/src/makefile.dos
@@ -0,0 +1,115 @@
+# $LynxId: makefile.dos,v 1.33 2011/05/28 13:07:55 tom Exp $
+
+OBJS= UCdomap.o UCAux.o UCAuto.o \
+LYClean.o LYShowInfo.o LYEdit.o LYStrings.o \
+LYMail.o HTAlert.o GridText.o LYGetFile.o \
+LYMain.o LYMainLoop.o LYCurses.o LYBookmark.o LYmktime.o LYUtils.o \
+LYOptions.o LYReadCFG.o LYSearch.o LYHistory.o LYSession.o \
+LYForms.o LYPrint.o LYrcFile.o LYDownload.o LYNews.o LYKeymap.o \
+HTML.o HTFWriter.o HTInit.o DefaultStyle.o LYLocal.o LYUpload.o \
+LYLeaks.o LYexit.o LYJump.o LYList.o LYCgi.o LYTraversal.o \
+LYEditmap.o LYCharSets.o LYCharUtils.o LYMap.o LYCookie.o LYExtern.o \
+LYStyle.o LYHash.o LYPrettySrc.o TRSTable.o parsdate.o
+
+CFLAGS= -O2 $(MCFLAGS) $(INTLFLAGS) -I. -I..
+
+# comment this line to suppress DIRED support
+DIRED_DEFS = \
+ -DDIRED_SUPPORT \
+ -DOK_UUDECODE \
+ -DOK_TAR \
+ -DOK_GZIP \
+ -DOK_ZIP \
+ -DOK_OVERRIDE
+
+# Use this option to enable optional and *experimental* color style.
+#ENABLE_COLOR_STYLE = -DUSE_COLOR_STYLE
+
+CC = gcc
+
+MCFLAGS = \
+ $(DIRED_DEFS) \
+ $(ENABLE_COLOR_STYLE) \
+ -DACCESS_AUTH \
+ -DCOLOR_CURSES \
+ -DDISP_PARTIAL \
+ -DDOSPATH \
+ -DUSE_ADDRLIST_PAGE \
+ -DUSE_ALT_BINDINGS \
+ -DEXP_NESTED_TABLES \
+ -DUSE_PERSISTENT_COOKIES \
+ -DFANCY_CURSES \
+ -DNOUSERS \
+ -DNO_CUSERID \
+ -DNO_TTYTYPE \
+ -DNO_UTMP \
+ -DPDCURSES \
+ -DUSE_SOURCE_CACHE \
+ -DUSE_EXTERNALS \
+ -DUSE_FILE_UPLOAD \
+ -DUSE_PRETTYSRC \
+ -DUSE_ZLIB \
+ $(SSLFLAGS) \
+ $(SSLINC) \
+ -I./chrtrans \
+ -I../WWW/Library/Implementation \
+ -I/djgpp/pdcur26 \
+ -I/djgpp/watt32/inc
+
+WWWLIB = \
+ ../WWW/Library/djgpp/libwww.a \
+ /djgpp/pdcur26/lib/pdcurses.a
+
+LIBS= -L/djgpp/watt32/lib -lwatt -lz -lwmemu
+
+# Uncomment the following to enable Internationalization.
+#INTLFLAGS = -DHAVE_GETTEXT -DHAVE_LIBINTL_H
+#INTLLIBS= -lintl -liconv
+
+# Uncomment the following to enable SSL.
+#SSLFLAGS = -DUSE_SSL
+#SSLLIB = -lssl -lcrypto
+#SSLINC = -I/djgpp/include/openssl
+
+all: lynx
+
+lynx: message $(OBJS) $(WWWLIB)
+ @echo "Linking and creating Lynx executable"
+ $(CC) $(CFLAGS) -o lynx.exe $(OBJS) $(WWWLIB) $(SSLLIB) $(LIBS) $(INTLLIBS)
+ @echo "Welcome to Lynx!"
+
+message:
+ @echo "Compiling Lynx sources"
+
+dbg: $(OBJS) $(WWWLIB)
+ @echo "Making Lynx code"
+ $(CC) -g $(OBJS) $(CFLAGS) $(WWWLIB) $(LIBS)
+
+lint:
+ lint *.c > ../lint.out
+
+clean:
+ rm -f lynx.exe core *.[ob]
+
+DefaultStyle.o: ../userdefs.h
+HTFWriter.o: ../userdefs.h
+LYBookmark.o: ../userdefs.h
+LYCharSets.o: ../userdefs.h
+LYCharUtils.o: ../userdefs.h
+LYCookie.o: ../userdefs.h
+LYDownload.o: ../userdefs.h
+LYEditmap.o: ../userdefs.h
+LYExtern.o: ../userdefs.h
+LYGetFile.o: ../userdefs.h
+LYHistory.o: ../userdefs.h
+LYKeymap.o: ../userdefs.h
+LYMain.o: ../userdefs.h
+LYMainLoop.o: ../userdefs.h
+LYOptions.o: ../userdefs.h
+LYReadCFG.o: ../userdefs.h
+LYShowInfo.o: ../userdefs.h
+LYStrings.o: ../userdefs.h
+LYTraversal.o: ../userdefs.h
+LYUtils.o: ../userdefs.h
+LYmktime.o: ../userdefs.h
+parsdate.o: ../userdefs.h
diff --git a/src/makefile.dsl b/src/makefile.dsl
new file mode 100644
index 0000000..64024f7
--- /dev/null
+++ b/src/makefile.dsl
@@ -0,0 +1,105 @@
+# $LynxId: makefile.dsl,v 1.19 2008/06/30 23:53:42 tom Exp $
+
+OBJS= UCdomap.o UCAux.o UCAuto.o \
+LYClean.o LYShowInfo.o LYEdit.o LYStrings.o \
+LYMail.o HTAlert.o GridText.o LYGetFile.o \
+LYMain.o LYMainLoop.o LYCurses.o LYBookmark.o LYmktime.o LYUtils.o \
+LYOptions.o LYReadCFG.o LYSearch.o LYHistory.o LYSession.o \
+LYForms.o LYPrint.o LYrcFile.o LYDownload.o LYNews.o LYKeymap.o \
+HTML.o HTFWriter.o HTInit.o DefaultStyle.o LYLocal.o LYUpload.o \
+LYLeaks.o LYexit.o LYJump.o LYList.o LYCgi.o LYTraversal.o \
+LYEditmap.o LYCharSets.o LYCharUtils.o LYMap.o LYCookie.o LYExtern.o \
+LYStyle.o LYHash.o LYPrettySrc.o TRSTable.o parsdate.o
+
+CFLAGS= -O2 $(MCFLAGS) $(INTLFLAGS) -I. -I.. $(SLANGINC)
+
+# comment this line to suppress DIRED support
+DIRED_DEFS = \
+ -DDIRED_SUPPORT \
+ -DOK_UUDECODE \
+ -DOK_TAR \
+ -DOK_GZIP \
+ -DOK_ZIP \
+ -DOK_OVERRIDE
+
+CC = gcc
+
+MCFLAGS = \
+ $(DIRED_DEFS) \
+ -DACCESS_AUTH \
+ -DDISP_PARTIAL \
+ -DDJGPP_KEYHANDLER \
+ -DDOSPATH \
+ -DHAVE_POPEN \
+ -DNOUSERS \
+ -DNO_CUSERID \
+ -DNO_TTYTYPE \
+ -DNO_UTMP \
+ -DUSE_EXTERNALS \
+ -DUSE_PRETTYSRC \
+ -DUSE_SLANG \
+ -DUSE_SOURCE_CACHE \
+ -DUSE_ZLIB \
+ $(SSLFLAGS) \
+ $(SSLINC) \
+ -I./chrtrans \
+ -I../WWW/Library/Implementation \
+ -I/dev/env/DJDIR/watt32/inc
+
+WWWLIB = \
+ ../WWW/Library/djgpp/libwww.a \
+ /dev/env/DJDIR/watt32/lib/libwatt.a
+
+LIBS= $(SLANGLIB) -lslang $(SSLLIB) -lz $(INTLLIBS)
+
+# Uncomment the following to enable Internationalization.
+#INTLFLAGS = -DHAVE_GETTEXT -DHAVE_LIBINTL_H
+#INTLLIBS= -lintl -liconv
+
+# Uncomment the following to enable SSL.
+#SSLFLAGS = -DUSE_SSL
+#SSLLIB = -lssl -lcrypto
+#SSLINC = -I/dev/env/DJDIR/include/openssl
+
+all: lynx.exe
+
+lynx.exe: message $(OBJS) $(WWWLIB)
+ @echo "Linking and creating Lynx executable"
+ $(CC) $(CFLAGS) -o lynx.exe $(OBJS) $(WWWLIB) $(LIBS)
+ @echo "Welcome to Lynx!"
+
+message:
+ @echo "Compiling Lynx sources"
+
+dbg: $(OBJS) $(WWWLIB)
+ @echo "Making Lynx code"
+ $(CC) -g $(OBJS) $(CFLAGS) $(WWWLIB) $(LIBS)
+
+lint:
+ lint *.c > ../lint.out
+
+clean:
+ rm -f lynx.exe core *.[ob]
+
+DefaultStyle.o: ../userdefs.h
+HTFWriter.o: ../userdefs.h
+LYBookmark.o: ../userdefs.h
+LYCharSets.o: ../userdefs.h
+LYCharUtils.o: ../userdefs.h
+LYCookie.o: ../userdefs.h
+LYDownload.o: ../userdefs.h
+LYEditmap.o: ../userdefs.h
+LYExtern.o: ../userdefs.h
+LYGetFile.o: ../userdefs.h
+LYHistory.o: ../userdefs.h
+LYKeymap.o: ../userdefs.h
+LYMain.o: ../userdefs.h
+LYMainLoop.o: ../userdefs.h
+LYOptions.o: ../userdefs.h
+LYReadCFG.o: ../userdefs.h
+LYShowInfo.o: ../userdefs.h
+LYStrings.o: ../userdefs.h
+LYTraversal.o: ../userdefs.h
+LYUtils.o: ../userdefs.h
+LYmktime.o: ../userdefs.h
+parsdate.o: ../userdefs.h
diff --git a/src/makefile.in b/src/makefile.in
new file mode 100644
index 0000000..5246226
--- /dev/null
+++ b/src/makefile.in
@@ -0,0 +1,242 @@
+# $LynxId: makefile.in,v 1.77 2021/02/28 15:56:53 tom Exp $
+# template-makefile for Lynx src directory
+
+SHELL = @CONFIG_SHELL@
+CDPATH = .
+
+@SET_MAKE@
+prefix = @prefix@
+datarootdir = @datarootdir@
+exec_prefix = @exec_prefix@
+top_srcdir = @top_srcdir@
+srcdir = @srcdir@
+VPATH = .:$(srcdir)
+
+top_builddir = ..
+
+# see po/makefile
+localedir = @NLS_DATADIR@/locale
+
+# Symbols which the configure script can set in each makefile:
+CC = @CC@
+CPP = @CPP@
+CFLAGS = @CFLAGS@ @EXTRA_CPPFLAGS@
+DEFS = @DEFS@
+CHARSET_DEFS = @CHARSET_DEFS@
+CPPFLAGS = @CPPFLAGS@
+
+x = @EXEEXT@
+o = .@OBJEXT@
+
+BUILD_CC = @BUILD_CC@
+BUILD_CPP = @BUILD_CPP@
+BUILD_CFLAGS = @BUILD_CFLAGS@
+BUILD_CPPFLAGS = @BUILD_CPPFLAGS@ @DEFS@
+BUILD_EXEEXT = @BUILD_EXEEXT@
+BUILD_LDFLAGS = @BUILD_LDFLAGS@
+BUILD_LIBS = @BUILD_LIBS@
+
+MAKE_RECUR = $(MAKE) @cf_cv_makeflags@ DESTDIR="$(DESTDIR)" CC="$(CC)"
+
+YACC = @YACC@
+WINDRES = @WINDRES@
+
+LIBS = @LIBS@ $(RESOLVLIB) $(WAISLIB) $(SITE_LIBS)
+LDFLAGS = @EXTRA_LDFLAGS@ @LDFLAGS@
+
+# Symbols inherited from the top-level makefile
+RESOLVLIB = # FIXME: set in parent makefile
+SITE_DEFS = # FIXME: set in parent makefile
+SITE_LIBS = # FIXME: set in parent makefile
+WAISLIB = # FIXME: set in parent makefile
+
+WWWINC = WWW/Library/Implementation
+WWWLIB = $(top_builddir)/WWW/Library/Implementation/libwww.a
+
+INTLLIB = @INTLLIBS@
+INTLDIR_CPPFLAGS= @INTLDIR_CPPFLAGS@-I$(top_srcdir)/intl
+
+CPP_OPTS = $(DEFS) $(CHARSET_DEFS) \
+ -DLOCALEDIR=\"$(localedir)\" \
+ -I. \
+ -I$(top_builddir) \
+ -Ichrtrans \
+ -I$(srcdir)/chrtrans \
+ -I$(top_srcdir) \
+ -I$(top_srcdir)/src \
+ -I$(top_srcdir)/$(WWWINC) \
+ $(INTLDIR_CPPFLAGS) $(SITE_DEFS) $(CPPFLAGS)
+CC_OPTS = $(CFLAGS) $(CPP_OPTS)
+
+LINT = @LINT@
+LINTOPTS =
+
+CTAGS = @CTAGS@
+
+COMPRESS_PROG =@COMPRESS_PROG@
+COMPRESS_EXT =@COMPRESS_EXT@
+
+CHARTRANS_OBJS = UCdomap$o UCAux$o UCAuto$o
+OBJS = \
+ LYebcdic$o \
+ LYClean$o LYShowInfo$o LYEdit$o LYStrings$o LYMail$o \
+ HTAlert$o GridText$o LYGetFile$o LYMain$o LYMainLoop$o \
+ LYCurses$o LYBookmark$o LYmktime$o LYUtils$o LYOptions$o \
+ LYReadCFG$o LYSearch$o LYHistory$o LYForms$o LYPrint$o \
+ LYrcFile$o LYDownload$o LYNews$o LYKeymap$o HTML$o \
+ HTFWriter$o HTInit$o DefaultStyle$o LYUpload$o \
+ LYLeaks$o LYexit$o LYJump$o LYList$o LYCgi$o \
+ LYTraversal$o LYEditmap$o LYCharSets$o LYCharUtils$o \
+ LYMap$o LYCookie$o LYStyle$o LYHash$o LYPrettySrc$o \
+ TRSTable$o parsdate$o $(CHARTRANS_OBJS) @EXTRA_OBJS@ @LIBOBJS@
+
+C_SRC = $(OBJS:$o=.c)
+
+all: lynx$x
+
+.SUFFIXES : $o .i
+
+# yacc builds .c in target directory, not $(srcdir)
+.c$o:
+ @RULE_CC@
+ @ECHO_CC@$(CC) $(CC_OPTS) -c $<
+
+.c.i:
+ @RULE_CC@
+ @ECHO_CC@$(CPP) $(CPP_OPTS) $< >$@
+
+lynx$x: message $(top_builddir)/LYHelp.h $(OBJS) $(WWWLIB)
+ @echo "Linking and creating Lynx executable"
+ $(CC) $(CC_OPTS) $(LDFLAGS) -o $@ $(OBJS) $(WWWLIB) $(LIBS) $(INTLLIB)
+ @echo "Copying Lynx executable into top-level directory"
+ rm -f $(top_builddir)/$@
+ cp $@ $(top_builddir)/
+ @echo "Welcome to Lynx!"
+
+message:
+ @echo "Compiling Lynx sources"
+
+do_chartrans_stuff:
+ -( cd chrtrans && $(MAKE_RECUR) \
+ SITE_DEFS="$(SITE_DEFS)" \
+ BUILD_CFLAGS="$(BUILD_CFLAGS)" \
+ BUILD_CPPFLAGS="$(BUILD_CPPFLAGS)" \
+ BUILD_LDFLAGS="$(BUILD_LDFLAGS)" \
+ BUILD_LIBS="$(BUILD_LIBS)" \
+ BUILD_CC="$(BUILD_CC)" tables )
+
+lint:
+ $(LINT) $(LINTOPTS) $(CPP_OPTS) $(C_SRC) 2>&1 |tee $(top_builddir)/lint.lynx
+
+clean:
+ rm -f lynx$x core *.core *.leaks *.i *$o *.bak tags TAGS test_*
+ ( cd chrtrans && $(MAKE_RECUR) clean )
+
+tags:
+ $(CTAGS) *.[ch]
+
+distclean: clean
+
+CMN=$(top_srcdir)/WWW/Library/Implementation/
+
+GridText$o : $(top_srcdir)/userdefs.h
+HTFWriter$o : $(top_srcdir)/userdefs.h
+HTInit$o : $(top_srcdir)/userdefs.h
+LYCharSets$o : $(top_srcdir)/userdefs.h
+LYGetFile$o : $(top_srcdir)/userdefs.h
+LYKeymap$o : $(top_srcdir)/userdefs.h
+LYLeaks$o : $(CMN)LYLeaks.h $(CMN)HTString.h
+LYMail$o : $(top_srcdir)/userdefs.h
+LYMain$o : $(top_srcdir)/userdefs.h $(top_builddir)/lynx_cfg.h
+LYMainLoop$o : $(top_srcdir)/userdefs.h
+LYOptions$o : $(top_srcdir)/userdefs.h
+LYReadCFG$o : $(top_srcdir)/userdefs.h
+LYShowInfo$o : $(top_builddir)/cfg_defs.h
+LYTraversal$o : $(top_srcdir)/userdefs.h
+LYUtils$o : $(top_srcdir)/userdefs.h
+LYmktime$o : $(top_srcdir)/userdefs.h
+LYrcFile$o : $(top_srcdir)/userdefs.h
+
+LYIcon$o: LYIcon.rc
+ $(WINDRES) -i LYIcon.rc -o LYIcon$o -O coff
+
+CHRTR= chrtrans/
+
+TABLES= \
+ $(CHRTR)cp1250_uni.h \
+ $(CHRTR)cp1251_uni.h \
+ $(CHRTR)cp1252_uni.h \
+ $(CHRTR)cp1253_uni.h \
+ $(CHRTR)cp1255_uni.h \
+ $(CHRTR)cp1256_uni.h \
+ $(CHRTR)cp1257_uni.h \
+ $(CHRTR)cp437_uni.h \
+ $(CHRTR)cp737_uni.h \
+ $(CHRTR)cp775_uni.h \
+ $(CHRTR)cp850_uni.h \
+ $(CHRTR)cp852_uni.h \
+ $(CHRTR)cp857_uni.h \
+ $(CHRTR)cp862_uni.h \
+ $(CHRTR)cp864_uni.h \
+ $(CHRTR)cp866_uni.h \
+ $(CHRTR)cp866u_uni.h \
+ $(CHRTR)cp869_uni.h \
+ $(CHRTR)def7_uni.h \
+ $(CHRTR)dmcs_uni.h \
+ $(CHRTR)hp_uni.h \
+ $(CHRTR)iso01_uni.h \
+ $(CHRTR)iso02_uni.h \
+ $(CHRTR)iso03_uni.h \
+ $(CHRTR)iso04_uni.h \
+ $(CHRTR)iso05_uni.h \
+ $(CHRTR)iso06_uni.h \
+ $(CHRTR)iso07_uni.h \
+ $(CHRTR)iso08_uni.h \
+ $(CHRTR)iso09_uni.h \
+ $(CHRTR)iso10_uni.h \
+ $(CHRTR)iso13_uni.h \
+ $(CHRTR)iso14_uni.h \
+ $(CHRTR)iso15_uni.h \
+ $(CHRTR)koi8r_uni.h \
+ $(CHRTR)koi8u_uni.h \
+ $(CHRTR)mac_uni.h \
+ $(CHRTR)mnem2_suni.h \
+ $(CHRTR)mnem_suni.h \
+ $(CHRTR)next_uni.h \
+ $(CHRTR)pt154_uni.h \
+ $(CHRTR)rfc_suni.h \
+ $(CHRTR)utf8_uni.h \
+ $(CHRTR)viscii_uni.h
+
+$(TABLES):
+ -( cd chrtrans && $(MAKE_RECUR) tables )
+
+UCdomap$o : UCdomap.c \
+ chrtrans/UCkd.h \
+ chrtrans/makeuctb$(BUILD_EXEEXT) \
+ chrtrans/makeuctb.c \
+ UCdomap.h $(CMN)UCMap.h $(TABLES) $(top_srcdir)/userdefs.h
+
+chrtrans/makeuctb$(BUILD_EXEEXT):
+ ( cd chrtrans && $(MAKE_RECUR) makeuctb$(BUILD_EXEEXT) )
+
+UCAux$o : UCAux.c $(CMN)UCAux.h $(CMN)UCDefs.h
+LYCookie$o : $(top_srcdir)/userdefs.h
+
+test_mktime.o: $(srcdir)/LYmktime.c
+ $(CC) -o $@ $(CC_OPTS) -DTEST_DRIVER -c $(srcdir)/LYmktime.c
+
+# test-driver for LYmktime
+test_mktime: test_mktime.o parsdate.o LYebcdic.o
+ $(CC) -o $@ $(CC_OPTS) test_mktime.o parsdate.o LYebcdic.o
+
+# update generated source (may be in ".", or srcdir)
+parsdate.c : $(srcdir)/parsdate.y
+ $(YACC) $(srcdir)/parsdate.y
+ -rm -f $@
+ mv y.tab.c $@
+
+depend : $(TABLES)
+ makedepend -fmakefile -- $(CC_OPTS) -- $(C_SRC)
+
+# DO NOT DELETE THIS LINE -- make depend depends on it.
diff --git a/src/makefile.wsl b/src/makefile.wsl
new file mode 100644
index 0000000..5890ec3
--- /dev/null
+++ b/src/makefile.wsl
@@ -0,0 +1,68 @@
+# $LynxId: makefile.wsl,v 1.15 2008/06/30 23:53:42 tom Exp $
+
+OBJS= UCdomap.o UCAux.o UCAuto.o \
+LYClean.o LYShowInfo.o LYEdit.o LYStrings.o \
+LYMail.o HTAlert.o GridText.o LYGetFile.o \
+LYMain.o LYMainLoop.o LYCurses.o LYBookmark.o LYmktime.o LYUtils.o \
+LYOptions.o LYReadCFG.o LYSearch.o LYHistory.o LYSession.o \
+LYForms.o LYPrint.o LYrcFile.o LYDownload.o LYNews.o LYKeymap.o \
+HTML.o HTFWriter.o HTInit.o DefaultStyle.o LYLocal.o LYUpload.o \
+LYLeaks.o LYexit.o LYJump.o LYList.o LYCgi.o LYTraversal.o \
+LYEditmap.o LYCharSets.o LYCharUtils.o LYMap.o LYCookie.o LYExtern.o \
+LYStyle.o LYHash.o LYPrettySrc.o TRSTable.o parsdate.o
+
+CFLAGS= -O1 $(MCFLAGS) -I. -I.. $(SLANGINC)
+
+CC = gcc
+MCFLAGS = -DDISP_PARTIAL -DUSE_ZLIB -DUSE_EXTERNALS \
+-DUSE_SOURCE_CACHE -DUSE_PRETTYSRC \
+-DUSE_SLANG -DACCESS_AUTH -DNO_CUSERID \
+-DNOUSERS -DDOSPATH -DNO_TTYTYPE -DNO_UTMP -I../WWW/library/implement -I../djgpp/tcplib/include \
+-I./chrtrans -I../djgpp/tcplib/include/tcp
+WWWLIB = ../WWW/library/djgpp/libwww.a ../djgpp/tcplib/obj/libtcp.a
+LIBS= -lslang -lz
+CHRTR= ./chrtrans/
+
+all: lynx.exe
+
+lynx.exe: message $(OBJS) $(WWWLIB)
+ @echo "Linking and creating Lynx executable"
+ $(CC) $(CFLAGS) -o lynx.exe $(OBJS) $(WWWLIB) $(SLANGLIB) $(LIBS)
+ @echo "Welcome to Lynx!"
+
+message:
+ @echo "Compiling Lynx sources"
+
+dbg: $(OBJS) $(WWWLIB)
+ @echo "Making Lynx code"
+ $(CC) $(OBJS) $(CFLAGS) $(WWWLIB) $(SLANGLIB) $(LIBS)
+
+lint:
+ lint *.c > ../lint.out
+
+clean:
+ rm -f lynx.exe core *.[ob]
+
+DefaultStyle.o: ../userdefs.h
+HTFWriter.o: ../userdefs.h
+LYBookmark.o: ../userdefs.h
+LYCharSets.o: ../userdefs.h
+LYCharUtils.o: ../userdefs.h
+LYCookie.o: ../userdefs.h
+LYDownload.o: ../userdefs.h
+LYEditmap.o: ../userdefs.h
+LYExtern.o: ../userdefs.h
+LYGetFile.o: ../userdefs.h
+LYHistory.o: ../userdefs.h
+LYKeymap.o: ../userdefs.h
+LYMain.o: ../userdefs.h
+LYMainLoop.o: ../userdefs.h
+LYOptions.o: ../userdefs.h
+LYReadCFG.o: ../userdefs.h
+LYReadCFG.o: ../userdefs.h
+LYShowInfo.o: ../userdefs.h
+LYStrings.o: ../userdefs.h
+LYTraversal.o: ../userdefs.h
+LYUtils.o: ../userdefs.h
+LYmktime.o: ../userdefs.h
+parsdate.o: ../userdefs.h
diff --git a/src/mktime.c b/src/mktime.c
new file mode 100644
index 0000000..961f6b4
--- /dev/null
+++ b/src/mktime.c
@@ -0,0 +1,71 @@
+/*
+ * mktime.c -- converts a struct tm into a time_t
+ *
+ * Copyright (C) 1997 Free Software Foundation, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2, or (at your option) any later
+ * version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc., 59
+ * Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+/* Written by Philippe De Muyter <phdm@macqel.be>. */
+
+#include <time.h>
+
+static time_t mkgmtime(register struct tm *t)
+{
+ register short month, year;
+ register time_t result;
+ static int m_to_d[12] =
+ {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
+
+ month = t->tm_mon;
+ year = t->tm_year + month / 12 + 1900;
+ month %= 12;
+ if (month < 0) {
+ year -= 1;
+ month += 12;
+ }
+ result = (year - 1970) * 365 + m_to_d[month];
+ if (month <= 1)
+ year -= 1;
+ result += (year - 1968) / 4;
+ result -= (year - 1900) / 100;
+ result += (year - 1600) / 400;
+ result += t->tm_mday;
+ result -= 1;
+ result *= 24;
+ result += t->tm_hour;
+ result *= 60;
+ result += t->tm_min;
+ result *= 60;
+ result += t->tm_sec;
+ return (result);
+}
+
+/*
+ * mktime -- convert tm struct to time_t
+ * if tm_isdst >= 0 use it, else compute it
+ */
+
+time_t mktime(struct tm * t)
+{
+ time_t result;
+
+ tzset();
+ result = mkgmtime(t) + timezone;
+ if (t->tm_isdst > 0
+ || (t->tm_isdst < 0 && localtime(&result)->tm_isdst))
+ result -= 3600;
+ return (result);
+}
diff --git a/src/multinet.opt b/src/multinet.opt
new file mode 100644
index 0000000..97b420f
--- /dev/null
+++ b/src/multinet.opt
@@ -0,0 +1 @@
+multinet:multinet_socket_library/share
diff --git a/src/multinet_ucx.opt b/src/multinet_ucx.opt
new file mode 100644
index 0000000..51bac45
--- /dev/null
+++ b/src/multinet_ucx.opt
@@ -0,0 +1 @@
+multinet_root:[multinet.library]ucx$ipc/LIBRARY
diff --git a/src/parsdate.c b/src/parsdate.c
new file mode 100644
index 0000000..396f996
--- /dev/null
+++ b/src/parsdate.c
@@ -0,0 +1,2425 @@
+/* original parser id follows */
+/* yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93" */
+/* (use YYMAJOR/YYMINOR for ifdefs dependent on parser version) */
+
+#define YYBYACC 1
+#define YYMAJOR 2
+#define YYMINOR 0
+#define YYPATCH 20220128
+
+#define YYEMPTY (-1)
+#define yyclearin (yychar = YYEMPTY)
+#define yyerrok (yyerrflag = 0)
+#define YYRECOVERING() (yyerrflag != 0)
+#define YYENOMEM (-2)
+#define YYEOF 0
+#undef YYBTYACC
+#define YYBTYACC 0
+#define YYDEBUGSTR YYPREFIX "debug"
+#define YYPREFIX "yy"
+
+#define YYPURE 0
+
+#line 2 "./parsdate.y"
+
+#include <LYLeaks.h>
+
+/*
+ * $LynxId: parsdate.c,v 1.30 2022/03/12 12:54:09 tom Exp $
+ *
+ * This module is adapted and extended from tin, to use for LYmktime().
+ *
+ * Project : tin - a Usenet reader
+ * Module : parsedate.y
+ * Author : S. Bellovin, R. $alz, J. Berets, P. Eggert
+ * Created : 1990-08-01
+ * Updated : 2019-08-28 (by Thomas Dickey, for Lynx)
+ * Notes : This grammar has 8 shift/reduce conflicts.
+ *
+ * Originally written by Steven M. Bellovin <smb@research.att.com>
+ * while at the University of North Carolina at Chapel Hill.
+ * Later tweaked by a couple of people on Usenet. Completely
+ * overhauled by Rich $alz <rsalz@osf.org> and Jim Berets
+ * <jberets@bbn.com> in August, 1990.
+ *
+ * Further revised (removed obsolete constructs and cleaned up
+ * timezone names) in August, 1991, by Rich.
+ * Paul Eggert <eggert@twinsun.com> helped in September 1992.
+ * Roland Rosenfeld added MET DST code in April 1994.
+ *
+ * Revision : 1.13
+ * Copyright : This code is in the public domain and has no copyright.
+ */
+
+/* SUPPRESS 530 */ /* Empty body for statement */
+/* SUPPRESS 593 on yyerrlab */ /* Label was not used */
+/* SUPPRESS 593 on yynewstate */ /* Label was not used */
+/* SUPPRESS 595 on yypvt */ /* Automatic variable may be used before set */
+
+#undef alloca /* conflicting def may be set by yacc */
+#include <parsdate.h>
+
+/*
+** Get the number of elements in a fixed-size array, or a pointer just
+** past the end of it.
+*/
+#define ENDOF(array) (&array[ARRAY_SIZE(array)])
+
+#ifdef EBCDIC
+#define TO_ASCII(c) TOASCII(c)
+#define TO_LOCAL(c) FROMASCII(c)
+#else
+#define TO_ASCII(c) (c)
+#define TO_LOCAL(c) (c)
+#endif
+
+#define IS7BIT(x) ((unsigned) TO_ASCII(x) < 128)
+#define CTYPE(isXXXXX, c) (IS7BIT(c) && isXXXXX(((unsigned char)c)))
+
+typedef char *PD_STRING;
+
+extern int date_parse(void);
+
+#define yyparse date_parse
+#define yylex date_lex
+#define yyerror date_error
+
+#define BAD_TIME ((time_t)-1)
+#define isBadTime(n) ((n) != 0 && (((n) == BAD_TIME) || !((n) > 0)))
+
+ /* See the LeapYears table in Convert. */
+#define EPOCH 1970
+#define END_OF_TIME 2200
+
+ /* Constants for general time calculations. */
+#define DST_OFFSET 1
+#define SECSPERDAY (24L * 60L * 60L)
+ /* Readability for TABLE stuff. */
+#define HOUR(x) (x * 60)
+
+#define LPAREN '('
+#define RPAREN ')'
+
+/*
+** Daylight-savings mode: on, off, or not yet known.
+*/
+typedef enum _DSTMODE {
+ DSTon, DSToff, DSTmaybe
+} DSTMODE;
+
+/*
+** Meridian: am, pm, or 24-hour style.
+*/
+typedef enum _MERIDIAN {
+ MERam, MERpm, MER24
+} MERIDIAN;
+
+/*
+** Global variables. We could get rid of most of them by using a yacc
+** union, but this is more efficient. (This routine predates the
+** yacc %union construct.)
+*/
+static char *yyInput;
+static DSTMODE yyDSTmode;
+static int yyHaveDate;
+static int yyHaveRel;
+static int yyHaveTime;
+static time_t yyTimezone;
+static time_t yyDay;
+static time_t yyHour;
+static time_t yyMinutes;
+static time_t yyMonth;
+static time_t yySeconds;
+static time_t yyYear;
+static MERIDIAN yyMeridian;
+static time_t yyRelMonth;
+static time_t yyRelSeconds;
+
+static time_t ToSeconds(time_t, time_t, time_t, MERIDIAN);
+static time_t Convert(time_t, time_t, time_t, time_t, time_t, time_t,
+ MERIDIAN, DSTMODE);
+static time_t DSTcorrect(time_t, time_t);
+static time_t RelativeMonth(time_t, time_t);
+static int LookupWord(char *, int);
+static int date_lex(void);
+static int GetTimeInfo(TIMEINFO * Now);
+
+/*
+ * The 'date_error()' function is declared here to work around a defect in
+ * bison 1.22, which redefines 'const' further down in this file, making it
+ * impossible to put a prototype here, and the function later. We're using
+ * 'const' on the parameter to quiet gcc's -Wwrite-strings warning.
+ */
+/*ARGSUSED*/
+static void date_error(const char GCC_UNUSED *s)
+{
+ /*NOTREACHED */
+}
+
+#ifdef YYSTYPE
+#undef YYSTYPE_IS_DECLARED
+#define YYSTYPE_IS_DECLARED 1
+#endif
+#ifndef YYSTYPE_IS_DECLARED
+#define YYSTYPE_IS_DECLARED 1
+#line 139 "./parsdate.y"
+typedef union YYSTYPE {
+ time_t Number;
+ enum _MERIDIAN Meridian;
+} YYSTYPE;
+#endif /* !YYSTYPE_IS_DECLARED */
+#line 172 "y.tab.c"
+
+/* compatibility with bison */
+#ifdef YYPARSE_PARAM
+/* compatibility with FreeBSD */
+# ifdef YYPARSE_PARAM_TYPE
+# define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM)
+# else
+# define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM)
+# endif
+#else
+# define YYPARSE_DECL() yyparse(void)
+#endif
+
+/* Parameters sent to lex. */
+#ifdef YYLEX_PARAM
+# define YYLEX_DECL() yylex(void *YYLEX_PARAM)
+# define YYLEX yylex(YYLEX_PARAM)
+#else
+# define YYLEX_DECL() yylex(void)
+# define YYLEX yylex()
+#endif
+
+#if !(defined(yylex) || defined(YYSTATE))
+int YYLEX_DECL();
+#endif
+
+/* Parameters sent to yyerror. */
+#ifndef YYERROR_DECL
+#define YYERROR_DECL() yyerror(const char *s)
+#endif
+#ifndef YYERROR_CALL
+#define YYERROR_CALL(msg) yyerror(msg)
+#endif
+
+extern int YYPARSE_DECL();
+
+#define tDAY 257
+#define tDAYZONE 258
+#define tMERIDIAN 259
+#define tMONTH 260
+#define tMONTH_UNIT 261
+#define tSEC_UNIT 262
+#define tSNUMBER 263
+#define tUNUMBER 264
+#define tZONE 265
+#define tDST 266
+#define YYERRCODE 256
+typedef int YYINT;
+static const YYINT yylhs[] = { -1,
+ 0, 0, 4, 4, 4, 4, 4, 4, 5, 5,
+ 5, 5, 5, 2, 2, 2, 2, 2, 1, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 7, 8,
+ 8, 8, 8, 3, 3,
+};
+static const YYINT yylen[] = { 2,
+ 0, 2, 1, 2, 1, 1, 2, 1, 2, 4,
+ 4, 6, 6, 1, 1, 2, 2, 1, 1, 3,
+ 5, 2, 4, 2, 3, 5, 6, 3, 9, 2,
+ 2, 2, 2, 0, 1,
+};
+static const YYINT yydefred[] = { 1,
+ 0, 0, 0, 0, 0, 2, 0, 5, 0, 8,
+ 0, 0, 0, 32, 30, 35, 0, 33, 31, 0,
+ 0, 0, 9, 0, 19, 0, 18, 4, 7, 0,
+ 0, 0, 25, 28, 0, 0, 16, 17, 0, 0,
+ 0, 23, 0, 11, 10, 0, 0, 26, 0, 0,
+ 21, 0, 27, 13, 12, 0, 0, 29,
+};
+#if defined(YYDESTRUCT_CALL) || defined(YYSTYPE_TOSTRING)
+static const YYINT yystos[] = { 0,
+ 268, 257, 260, 263, 264, 272, 273, 274, 275, 276,
+ 260, 44, 264, 261, 262, 259, 260, 261, 262, 263,
+ 58, 47, 271, 258, 263, 265, 269, 270, 270, 264,
+ 264, 44, 264, 263, 264, 264, 266, 269, 264, 260,
+ 45, 264, 58, 269, 271, 47, 58, 264, 260, 264,
+ 264, 264, 263, 269, 271, 58, 264, 264,
+};
+#endif /* YYDESTRUCT_CALL || YYSTYPE_TOSTRING */
+static const YYINT yydgoto[] = { 1,
+ 27, 28, 23, 6, 7, 8, 9, 10,
+};
+static const YYINT yysindex[] = { 0,
+ -240, -41, -256, -227, -45, 0, -251, 0, -251, 0,
+ -254, -249, -22, 0, 0, 0, -237, 0, 0, -235,
+ -228, -226, 0, -236, 0, -224, 0, 0, 0, -223,
+ -39, -222, 0, 0, -58, -7, 0, 0, -15, -220,
+ -215, 0, -218, 0, 0, -217, -216, 0, -214, -234,
+ 0, -8, 0, 0, 0, -213, -212, 0,
+};
+static const YYINT yyrindex[] = { 0,
+ 0, 0, 0, 0, 5, 0, 26, 0, 31, 0,
+ 0, 0, 11, 0, 0, 0, 37, 0, 0, 0,
+ 0, 0, 0, 16, 0, 32, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 21, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+#if YYBTYACC
+static const YYINT yycindex[] = { 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+#endif
+static const YYINT yygindex[] = { 0,
+ -17, 44, -31, 0, 0, 0, 0, 0,
+};
+#define YYTABLESIZE 300
+static const YYINT yytable[] = { 43,
+ 34, 22, 12, 45, 34, 41, 24, 13, 38, 30,
+ 22, 25, 21, 26, 31, 15, 2, 44, 55, 3,
+ 20, 32, 4, 5, 16, 3, 33, 34, 25, 37,
+ 6, 14, 54, 14, 15, 35, 24, 36, 25, 46,
+ 39, 42, 47, 48, 49, 50, 51, 52, 53, 56,
+ 57, 58, 29, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 16, 0, 0, 0, 25, 0, 0, 0, 0, 0,
+ 0, 0, 0, 16, 17, 18, 19, 20, 11, 0,
+ 40, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 34, 34, 0,
+ 34, 34, 34, 0, 34, 34, 0, 22, 34, 34,
+ 22, 0, 15, 22, 22, 15, 0, 20, 15, 15,
+ 20, 0, 3, 20, 20, 3, 0, 6, 14, 3,
+ 6, 14, 0, 24, 6, 14, 24, 0, 0, 24,
+};
+static const YYINT yycheck[] = { 58,
+ 0, 47, 44, 35, 0, 45, 258, 264, 26, 264,
+ 0, 263, 58, 265, 264, 0, 257, 35, 50, 260,
+ 0, 44, 263, 264, 259, 0, 264, 263, 263, 266,
+ 0, 0, 50, 261, 262, 264, 0, 264, 263, 47,
+ 264, 264, 58, 264, 260, 264, 264, 264, 263, 58,
+ 264, 264, 9, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 259, -1, -1, -1, 263, -1, -1, -1, -1, -1,
+ -1, -1, -1, 259, 260, 261, 262, 263, 260, -1,
+ 260, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 257, 258, -1,
+ 260, 257, 258, -1, 264, 265, -1, 257, 264, 265,
+ 260, -1, 257, 263, 264, 260, -1, 257, 263, 264,
+ 260, -1, 257, 263, 264, 260, -1, 257, 257, 264,
+ 260, 260, -1, 257, 264, 264, 260, -1, -1, 263,
+};
+#if YYBTYACC
+static const YYINT yyctable[] = { -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1,
+};
+#endif
+#define YYFINAL 1
+#ifndef YYDEBUG
+#define YYDEBUG 0
+#endif
+#define YYMAXTOKEN 266
+#define YYUNDFTOKEN 277
+#define YYTRANSLATE(a) ((a) > YYMAXTOKEN ? YYUNDFTOKEN : (a))
+#if YYDEBUG
+static const char *const yyname[] = {
+
+"$end",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,"','","'-'",0,"'/'",0,0,0,0,0,0,0,0,0,0,"':'",0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"error","tDAY","tDAYZONE",
+"tMERIDIAN","tMONTH","tMONTH_UNIT","tSEC_UNIT","tSNUMBER","tUNUMBER","tZONE",
+"tDST","$accept","spec","numzone","zone","o_merid","item","time","date","both",
+"rel","illegal-symbol",
+};
+static const char *const yyrule[] = {
+"$accept : spec",
+"spec :",
+"spec : spec item",
+"item : time",
+"item : time zone",
+"item : date",
+"item : both",
+"item : both zone",
+"item : rel",
+"time : tUNUMBER o_merid",
+"time : tUNUMBER ':' tUNUMBER o_merid",
+"time : tUNUMBER ':' tUNUMBER numzone",
+"time : tUNUMBER ':' tUNUMBER ':' tUNUMBER o_merid",
+"time : tUNUMBER ':' tUNUMBER ':' tUNUMBER numzone",
+"zone : tZONE",
+"zone : tDAYZONE",
+"zone : tDAYZONE tDST",
+"zone : tZONE numzone",
+"zone : numzone",
+"numzone : tSNUMBER",
+"date : tUNUMBER '/' tUNUMBER",
+"date : tUNUMBER '/' tUNUMBER '/' tUNUMBER",
+"date : tMONTH tUNUMBER",
+"date : tMONTH tUNUMBER ',' tUNUMBER",
+"date : tUNUMBER tMONTH",
+"date : tUNUMBER tMONTH tUNUMBER",
+"date : tDAY ',' tUNUMBER tMONTH tUNUMBER",
+"date : tDAY ',' tUNUMBER '-' tMONTH tSNUMBER",
+"date : tUNUMBER tSNUMBER tSNUMBER",
+"both : tDAY tMONTH tUNUMBER tUNUMBER ':' tUNUMBER ':' tUNUMBER tUNUMBER",
+"rel : tSNUMBER tSEC_UNIT",
+"rel : tUNUMBER tSEC_UNIT",
+"rel : tSNUMBER tMONTH_UNIT",
+"rel : tUNUMBER tMONTH_UNIT",
+"o_merid :",
+"o_merid : tMERIDIAN",
+
+};
+#endif
+
+#if YYDEBUG
+int yydebug;
+#endif
+
+int yyerrflag;
+int yychar;
+YYSTYPE yyval;
+YYSTYPE yylval;
+int yynerrs;
+
+#if defined(YYLTYPE) || defined(YYLTYPE_IS_DECLARED)
+YYLTYPE yyloc; /* position returned by actions */
+YYLTYPE yylloc; /* position from the lexer */
+#endif
+
+#if defined(YYLTYPE) || defined(YYLTYPE_IS_DECLARED)
+#ifndef YYLLOC_DEFAULT
+#define YYLLOC_DEFAULT(loc, rhs, n) \
+do \
+{ \
+ if (n == 0) \
+ { \
+ (loc).first_line = YYRHSLOC(rhs, 0).last_line; \
+ (loc).first_column = YYRHSLOC(rhs, 0).last_column; \
+ (loc).last_line = YYRHSLOC(rhs, 0).last_line; \
+ (loc).last_column = YYRHSLOC(rhs, 0).last_column; \
+ } \
+ else \
+ { \
+ (loc).first_line = YYRHSLOC(rhs, 1).first_line; \
+ (loc).first_column = YYRHSLOC(rhs, 1).first_column; \
+ (loc).last_line = YYRHSLOC(rhs, n).last_line; \
+ (loc).last_column = YYRHSLOC(rhs, n).last_column; \
+ } \
+} while (0)
+#endif /* YYLLOC_DEFAULT */
+#endif /* defined(YYLTYPE) || defined(YYLTYPE_IS_DECLARED) */
+#if YYBTYACC
+
+#ifndef YYLVQUEUEGROWTH
+#define YYLVQUEUEGROWTH 32
+#endif
+#endif /* YYBTYACC */
+
+/* define the initial stack-sizes */
+#ifdef YYSTACKSIZE
+#undef YYMAXDEPTH
+#define YYMAXDEPTH YYSTACKSIZE
+#else
+#ifdef YYMAXDEPTH
+#define YYSTACKSIZE YYMAXDEPTH
+#else
+#define YYSTACKSIZE 10000
+#define YYMAXDEPTH 10000
+#endif
+#endif
+
+#ifndef YYINITSTACKSIZE
+#define YYINITSTACKSIZE 200
+#endif
+
+typedef struct {
+ unsigned stacksize;
+ YYINT *s_base;
+ YYINT *s_mark;
+ YYINT *s_last;
+ YYSTYPE *l_base;
+ YYSTYPE *l_mark;
+#if defined(YYLTYPE) || defined(YYLTYPE_IS_DECLARED)
+ YYLTYPE *p_base;
+ YYLTYPE *p_mark;
+#endif
+} YYSTACKDATA;
+#if YYBTYACC
+
+struct YYParseState_s
+{
+ struct YYParseState_s *save; /* Previously saved parser state */
+ YYSTACKDATA yystack; /* saved parser stack */
+ int state; /* saved parser state */
+ int errflag; /* saved error recovery status */
+ int lexeme; /* saved index of the conflict lexeme in the lexical queue */
+ YYINT ctry; /* saved index in yyctable[] for this conflict */
+};
+typedef struct YYParseState_s YYParseState;
+#endif /* YYBTYACC */
+/* variables for the parser stack */
+static YYSTACKDATA yystack;
+#if YYBTYACC
+
+/* Current parser state */
+static YYParseState *yyps = 0;
+
+/* yypath != NULL: do the full parse, starting at *yypath parser state. */
+static YYParseState *yypath = 0;
+
+/* Base of the lexical value queue */
+static YYSTYPE *yylvals = 0;
+
+/* Current position at lexical value queue */
+static YYSTYPE *yylvp = 0;
+
+/* End position of lexical value queue */
+static YYSTYPE *yylve = 0;
+
+/* The last allocated position at the lexical value queue */
+static YYSTYPE *yylvlim = 0;
+
+#if defined(YYLTYPE) || defined(YYLTYPE_IS_DECLARED)
+/* Base of the lexical position queue */
+static YYLTYPE *yylpsns = 0;
+
+/* Current position at lexical position queue */
+static YYLTYPE *yylpp = 0;
+
+/* End position of lexical position queue */
+static YYLTYPE *yylpe = 0;
+
+/* The last allocated position at the lexical position queue */
+static YYLTYPE *yylplim = 0;
+#endif
+
+/* Current position at lexical token queue */
+static YYINT *yylexp = 0;
+
+static YYINT *yylexemes = 0;
+#endif /* YYBTYACC */
+#line 361 "./parsdate.y"
+
+
+/*
+** An entry in the lexical lookup table.
+*/
+/* *INDENT-OFF* */
+typedef struct _TABLE {
+ const char *name;
+ int type;
+ time_t value;
+} TABLE;
+
+/* Month and day table. */
+static const TABLE MonthDayTable[] = {
+ { "january", tMONTH, 1 },
+ { "february", tMONTH, 2 },
+ { "march", tMONTH, 3 },
+ { "april", tMONTH, 4 },
+ { "may", tMONTH, 5 },
+ { "june", tMONTH, 6 },
+ { "july", tMONTH, 7 },
+ { "august", tMONTH, 8 },
+ { "september", tMONTH, 9 },
+ { "october", tMONTH, 10 },
+ { "november", tMONTH, 11 },
+ { "december", tMONTH, 12 },
+ /* The value of the day isn't used... */
+ { "sunday", tDAY, 0 },
+ { "monday", tDAY, 0 },
+ { "tuesday", tDAY, 0 },
+ { "wednesday", tDAY, 0 },
+ { "thursday", tDAY, 0 },
+ { "friday", tDAY, 0 },
+ { "saturday", tDAY, 0 },
+};
+
+/* Time units table. */
+static const TABLE UnitsTable[] = {
+ { "year", tMONTH_UNIT, 12 },
+ { "month", tMONTH_UNIT, 1 },
+ { "week", tSEC_UNIT, 7 * 24 * 60 * 60 },
+ { "day", tSEC_UNIT, 1 * 24 * 60 * 60 },
+ { "hour", tSEC_UNIT, 60 * 60 },
+ { "minute", tSEC_UNIT, 60 },
+ { "min", tSEC_UNIT, 60 },
+ { "second", tSEC_UNIT, 1 },
+ { "sec", tSEC_UNIT, 1 },
+};
+
+/* Timezone table. */
+static const TABLE TimezoneTable[] = {
+ { "gmt", tZONE, HOUR( 0) }, /* Greenwich Mean */
+ { "ut", tZONE, HOUR( 0) }, /* Universal */
+ { "utc", tZONE, HOUR( 0) }, /* Universal Coordinated */
+ { "cut", tZONE, HOUR( 0) }, /* Coordinated Universal */
+ { "z", tZONE, HOUR( 0) }, /* Greenwich Mean */
+ { "wet", tZONE, HOUR( 0) }, /* Western European */
+ { "bst", tDAYZONE, HOUR( 0) }, /* British Summer */
+ { "nst", tZONE, HOUR(3)+30 }, /* Newfoundland Standard */
+ { "ndt", tDAYZONE, HOUR(3)+30 }, /* Newfoundland Daylight */
+ { "ast", tZONE, HOUR( 4) }, /* Atlantic Standard */
+ { "adt", tDAYZONE, HOUR( 4) }, /* Atlantic Daylight */
+ { "est", tZONE, HOUR( 5) }, /* Eastern Standard */
+ { "edt", tDAYZONE, HOUR( 5) }, /* Eastern Daylight */
+ { "cst", tZONE, HOUR( 6) }, /* Central Standard */
+ { "cdt", tDAYZONE, HOUR( 6) }, /* Central Daylight */
+ { "mst", tZONE, HOUR( 7) }, /* Mountain Standard */
+ { "mdt", tDAYZONE, HOUR( 7) }, /* Mountain Daylight */
+ { "pst", tZONE, HOUR( 8) }, /* Pacific Standard */
+ { "pdt", tDAYZONE, HOUR( 8) }, /* Pacific Daylight */
+ { "yst", tZONE, HOUR( 9) }, /* Yukon Standard */
+ { "ydt", tDAYZONE, HOUR( 9) }, /* Yukon Daylight */
+ { "akst", tZONE, HOUR( 9) }, /* Alaska Standard */
+ { "akdt", tDAYZONE, HOUR( 9) }, /* Alaska Daylight */
+ { "hst", tZONE, HOUR(10) }, /* Hawaii Standard */
+ { "hast", tZONE, HOUR(10) }, /* Hawaii-Aleutian Standard */
+ { "hadt", tDAYZONE, HOUR(10) }, /* Hawaii-Aleutian Daylight */
+ { "ces", tDAYZONE, -HOUR(1) }, /* Central European Summer */
+ { "cest", tDAYZONE, -HOUR(1) }, /* Central European Summer */
+ { "mez", tZONE, -HOUR(1) }, /* Middle European */
+ { "mezt", tDAYZONE, -HOUR(1) }, /* Middle European Summer */
+ { "cet", tZONE, -HOUR(1) }, /* Central European */
+ { "met", tZONE, -HOUR(1) }, /* Middle European */
+/* Additional aliases for MET / MET DST *************************************/
+ { "mez", tZONE, -HOUR(1) }, /* Middle European */
+ { "mewt", tZONE, -HOUR(1) }, /* Middle European Winter */
+ { "mest", tDAYZONE, -HOUR(1) }, /* Middle European Summer */
+ { "mes", tDAYZONE, -HOUR(1) }, /* Middle European Summer */
+ { "mesz", tDAYZONE, -HOUR(1) }, /* Middle European Summer */
+ { "msz", tDAYZONE, -HOUR(1) }, /* Middle European Summer */
+ { "metdst", tDAYZONE, -HOUR(1) }, /* Middle European Summer */
+/****************************************************************************/
+ { "eet", tZONE, -HOUR(2) }, /* Eastern Europe */
+ { "msk", tZONE, -HOUR(3) }, /* Moscow Winter */
+ { "msd", tDAYZONE, -HOUR(3) }, /* Moscow Summer */
+ { "wast", tZONE, -HOUR(8) }, /* West Australian Standard */
+ { "wadt", tDAYZONE, -HOUR(8) }, /* West Australian Daylight */
+ { "hkt", tZONE, -HOUR(8) }, /* Hong Kong */
+ { "cct", tZONE, -HOUR(8) }, /* China Coast */
+ { "jst", tZONE, -HOUR(9) }, /* Japan Standard */
+ { "kst", tZONE, -HOUR(9) }, /* Korean Standard */
+ { "kdt", tZONE, -HOUR(9) }, /* Korean Daylight */
+ { "cast", tZONE, -(HOUR(9)+30) }, /* Central Australian Standard */
+ { "cadt", tDAYZONE, -(HOUR(9)+30) }, /* Central Australian Daylight */
+ { "east", tZONE, -HOUR(10) }, /* Eastern Australian Standard */
+ { "eadt", tDAYZONE, -HOUR(10) }, /* Eastern Australian Daylight */
+ { "nzst", tZONE, -HOUR(12) }, /* New Zealand Standard */
+ { "nzdt", tDAYZONE, -HOUR(12) }, /* New Zealand Daylight */
+
+ /* For completeness we include the following entries. */
+#if 0
+
+ /* Duplicate names. Either they conflict with a zone listed above
+ * (which is either more likely to be seen or just been in circulation
+ * longer), or they conflict with another zone in this section and
+ * we could not reasonably choose one over the other. */
+ { "fst", tZONE, HOUR( 2) }, /* Fernando De Noronha Standard */
+ { "fdt", tDAYZONE, HOUR( 2) }, /* Fernando De Noronha Daylight */
+ { "bst", tZONE, HOUR( 3) }, /* Brazil Standard */
+ { "est", tZONE, HOUR( 3) }, /* Eastern Standard (Brazil) */
+ { "edt", tDAYZONE, HOUR( 3) }, /* Eastern Daylight (Brazil) */
+ { "wst", tZONE, HOUR( 4) }, /* Western Standard (Brazil) */
+ { "wdt", tDAYZONE, HOUR( 4) }, /* Western Daylight (Brazil) */
+ { "cst", tZONE, HOUR( 5) }, /* Chile Standard */
+ { "cdt", tDAYZONE, HOUR( 5) }, /* Chile Daylight */
+ { "ast", tZONE, HOUR( 5) }, /* Acre Standard */
+ { "adt", tDAYZONE, HOUR( 5) }, /* Acre Daylight */
+ { "cst", tZONE, HOUR( 5) }, /* Cuba Standard */
+ { "cdt", tDAYZONE, HOUR( 5) }, /* Cuba Daylight */
+ { "est", tZONE, HOUR( 6) }, /* Easter Island Standard */
+ { "edt", tDAYZONE, HOUR( 6) }, /* Easter Island Daylight */
+ { "sst", tZONE, HOUR(11) }, /* Samoa Standard */
+ { "ist", tZONE, -HOUR(2) }, /* Israel Standard */
+ { "idt", tDAYZONE, -HOUR(2) }, /* Israel Daylight */
+ { "idt", tDAYZONE, -(HOUR(3)+30) }, /* Iran Daylight */
+ { "ist", tZONE, -(HOUR(3)+30) }, /* Iran Standard */
+ { "cst", tZONE, -HOUR(8) }, /* China Standard */
+ { "cdt", tDAYZONE, -HOUR(8) }, /* China Daylight */
+ { "sst", tZONE, -HOUR(8) }, /* Singapore Standard */
+
+ /* Dubious (e.g., not in Olson's TIMEZONE package) or obsolete. */
+ { "gst", tZONE, HOUR( 3) }, /* Greenland Standard */
+ { "wat", tZONE, -HOUR(1) }, /* West Africa */
+ { "at", tZONE, HOUR( 2) }, /* Azores */
+ { "gst", tZONE, -HOUR(10) }, /* Guam Standard */
+ { "nft", tZONE, HOUR(3)+30 }, /* Newfoundland */
+ { "idlw", tZONE, HOUR(12) }, /* International Date Line West */
+ { "mewt", tZONE, -HOUR(1) }, /* Middle European Winter */
+ { "mest", tDAYZONE, -HOUR(1) }, /* Middle European Summer */
+ { "swt", tZONE, -HOUR(1) }, /* Swedish Winter */
+ { "sst", tDAYZONE, -HOUR(1) }, /* Swedish Summer */
+ { "fwt", tZONE, -HOUR(1) }, /* French Winter */
+ { "fst", tDAYZONE, -HOUR(1) }, /* French Summer */
+ { "bt", tZONE, -HOUR(3) }, /* Baghdad */
+ { "it", tZONE, -(HOUR(3)+30) }, /* Iran */
+ { "zp4", tZONE, -HOUR(4) }, /* USSR Zone 3 */
+ { "zp5", tZONE, -HOUR(5) }, /* USSR Zone 4 */
+ { "ist", tZONE, -(HOUR(5)+30) }, /* Indian Standard */
+ { "zp6", tZONE, -HOUR(6) }, /* USSR Zone 5 */
+ { "nst", tZONE, -HOUR(7) }, /* North Sumatra */
+ { "sst", tZONE, -HOUR(7) }, /* South Sumatra */
+ { "jt", tZONE, -(HOUR(7)+30) }, /* Java (3pm in Cronusland!) */
+ { "nzt", tZONE, -HOUR(12) }, /* New Zealand */
+ { "idle", tZONE, -HOUR(12) }, /* International Date Line East */
+ { "cat", tZONE, HOUR(10) }, /* -- expired 1967 */
+ { "nt", tZONE, HOUR(11) }, /* -- expired 1967 */
+ { "ahst", tZONE, HOUR(10) }, /* -- expired 1983 */
+ { "hdt", tDAYZONE, HOUR(10) }, /* -- expired 1986 */
+#endif /* 0 */
+};
+/* *INDENT-ON* */
+
+static time_t ToSeconds(time_t Hours, time_t Minutes, time_t Seconds, MERIDIAN Meridian)
+{
+ if (isBadTime(Minutes) || Minutes > 59 || isBadTime(Seconds) || Seconds > 61)
+ return BAD_TIME;
+ if (Meridian == MER24) {
+ if (isBadTime(Hours) || Hours > 23)
+ return BAD_TIME;
+ } else {
+ if (Hours < 1 || Hours > 12)
+ return BAD_TIME;
+ if (Hours == 12)
+ Hours = 0;
+ if (Meridian == MERpm)
+ Hours += 12;
+ }
+ return (Hours * 60L + Minutes) * 60L + Seconds;
+}
+
+static time_t Convert(time_t Month, time_t Day, time_t Year, time_t Hours,
+ time_t Minutes, time_t Seconds, MERIDIAN Meridian,
+ DSTMODE dst)
+{
+ static const int DaysNormal[13] =
+ {
+ 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
+ };
+ static const int DaysLeap[13] =
+ {
+ 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
+ };
+ /* *INDENT-OFF* */
+ static const int LeapYears[] =
+ {
+ 1972, 1976, 1980, 1984, 1988, 1992, 1996,
+ 2000, 2004, 2008, 2012, 2016, 2020, 2024, 2028, 2032, 2036,
+ 2040, 2044, 2048, 2052, 2056, 2060, 2064, 2068, 2072, 2076,
+ 2080, 2084, 2088, 2092, 2096, /***/ 2104, 2108, 2112, 2116,
+ 2120, 2124, 2128, 2132, 2136, 2140, 2144, 2148, 2152, 2156,
+ 2160, 2164, 2168, 2172, 2176, 2180, 2184, 2188, 2192, 2196,
+ };
+ /* *INDENT-ON* */
+
+ const int *yp;
+ const int *mp;
+ int i;
+ time_t Julian;
+ time_t tod;
+
+ if (isBadTime(Year))
+ Year = -Year;
+ if (Year < 70)
+ Year += 2000;
+ if (Year < 100)
+ Year += 1900;
+ if (Year < EPOCH)
+ Year += 100;
+ for (mp = DaysNormal, yp = LeapYears; yp < ENDOF(LeapYears); yp++)
+ if (Year == *yp) {
+ mp = DaysLeap;
+ break;
+ }
+ if (Year < EPOCH || Year > END_OF_TIME
+ || Month < 1 || Month > 12
+ /* NOSTRICT */
+ /* conversion from long may lose accuracy */
+ || Day < 1 || Day > mp[(int) Month]) {
+ return BAD_TIME;
+ }
+
+ Julian = Day - 1 + (Year - EPOCH) * 365;
+ for (yp = LeapYears; yp < ENDOF(LeapYears); yp++, Julian++) {
+ if (Year <= *yp)
+ break;
+ }
+ for (i = 1; i < Month; i++)
+ Julian += *++mp;
+ Julian *= SECSPERDAY;
+ Julian += yyTimezone * 60L;
+ tod = ToSeconds(Hours, Minutes, Seconds, Meridian);
+ if (isBadTime(tod)) {
+ return BAD_TIME;
+ }
+ Julian += tod;
+ tod = Julian;
+ if (dst == DSTon) {
+ Julian -= DST_OFFSET * 60 * 60;
+ } else if (dst == DSTmaybe) {
+ struct tm *tm = localtime(&tod);
+
+ if (tm != NULL) {
+ if (tm->tm_isdst)
+ Julian -= DST_OFFSET * 60 * 60;
+ } else {
+ Julian = BAD_TIME;
+ }
+ }
+ return Julian;
+}
+
+static time_t DSTcorrect(time_t Start, time_t Future)
+{
+ struct tm *tm;
+ time_t StartDay;
+ time_t FutureDay;
+
+ if ((tm = localtime(&Start)) == NULL)
+ return BAD_TIME;
+ StartDay = (tm->tm_hour + 1) % 24;
+
+ if ((tm = localtime(&Future)) == NULL)
+ return BAD_TIME;
+ FutureDay = (tm->tm_hour + 1) % 24;
+
+ return (Future - Start) + (StartDay - FutureDay) * DST_OFFSET * 60 * 60;
+}
+
+static time_t RelativeMonth(time_t Start, time_t RelMonth)
+{
+ struct tm *tm;
+ time_t Month;
+ time_t Year;
+
+ if ((tm = localtime(&Start)) == NULL)
+ return BAD_TIME;
+
+ Month = 12 * tm->tm_year + tm->tm_mon + RelMonth;
+ Year = Month / 12 + 1900;
+ Month = Month % 12 + 1;
+ return DSTcorrect(Start,
+ Convert(Month, (time_t) tm->tm_mday, Year,
+ (time_t) tm->tm_hour, (time_t) tm->tm_min,
+ (time_t) tm->tm_sec,
+ MER24, DSTmaybe));
+}
+
+static int LookupWord(char *buff,
+ int length)
+{
+ char *p;
+ const char *q;
+ const TABLE *tp;
+ int c;
+
+ p = buff;
+ c = p[0];
+
+ /* See if we have an abbreviation for a month. */
+ if (length == 3 || (length == 4 && p[3] == '.')) {
+ for (tp = MonthDayTable; tp < ENDOF(MonthDayTable); tp++) {
+ q = tp->name;
+ if (c == q[0] && p[1] == q[1] && p[2] == q[2]) {
+ yylval.Number = tp->value;
+ return tp->type;
+ }
+ }
+ } else {
+ for (tp = MonthDayTable; tp < ENDOF(MonthDayTable); tp++) {
+ if (c == tp->name[0] && strcmp(p, tp->name) == 0) {
+ yylval.Number = tp->value;
+ return tp->type;
+ }
+ }
+ }
+
+ /* Try for a timezone. */
+ for (tp = TimezoneTable; tp < ENDOF(TimezoneTable); tp++) {
+ if (c == tp->name[0] && p[1] == tp->name[1]
+ && strcmp(p, tp->name) == 0) {
+ yylval.Number = tp->value;
+ return tp->type;
+ }
+ }
+
+ if (strcmp(buff, "dst") == 0)
+ return tDST;
+
+ /* Try the units table. */
+ for (tp = UnitsTable; tp < ENDOF(UnitsTable); tp++) {
+ if (c == tp->name[0] && strcmp(p, tp->name) == 0) {
+ yylval.Number = tp->value;
+ return tp->type;
+ }
+ }
+
+ /* Strip off any plural and try the units table again. */
+ if (--length > 0 && p[length] == 's') {
+ p[length] = '\0';
+ for (tp = UnitsTable; tp < ENDOF(UnitsTable); tp++) {
+ if (c == tp->name[0] && strcmp(p, tp->name) == 0) {
+ p[length] = 's';
+ yylval.Number = tp->value;
+ return tp->type;
+ }
+ }
+ p[length] = 's';
+ }
+ length++;
+
+ /* Drop out any periods. */
+ for (p = buff, q = (PD_STRING) buff; *q; q++) {
+ if (*q != '.')
+ *p++ = *q;
+ }
+ *p = '\0';
+
+ /* Try the meridians. */
+ if (buff[1] == 'm' && buff[2] == '\0') {
+ if (buff[0] == 'a') {
+ yylval.Meridian = MERam;
+ return tMERIDIAN;
+ }
+ if (buff[0] == 'p') {
+ yylval.Meridian = MERpm;
+ return tMERIDIAN;
+ }
+ }
+
+ /* If we saw any periods, try the timezones again. */
+ if (p - buff != length) {
+ c = buff[0];
+ for (p = buff, tp = TimezoneTable; tp < ENDOF(TimezoneTable); tp++) {
+ if (c == tp->name[0] && p[1] == tp->name[1]
+ && strcmp(p, tp->name) == 0) {
+ yylval.Number = tp->value;
+ return tp->type;
+ }
+ }
+ }
+
+ /* Unknown word -- assume GMT timezone. */
+ yylval.Number = 0;
+ return tZONE;
+}
+
+/*
+ * This returns characters as-is (the ones that are not part of some token),
+ * and codes greater than 256 (the token values).
+ *
+ * yacc generates tables that may use the character value. In particular,
+ * byacc's yycheck[] table contains integer values for the expected codes from
+ * this function, which (unless byacc is run locally) are ASCII codes.
+ *
+ * The TO_LOCAL() function assumes its input is in ASCII, and the output is
+ * whatever native encoding is used on the machine, e.g., EBCDIC.
+ *
+ * The TO_ASCII() function is the inverse of TO_LOCAL().
+ */
+static int date_lex(void)
+{
+ int c;
+ char *p;
+ char buff[20];
+ int sign;
+ int i;
+ int nesting;
+
+ /* Get first character after the whitespace. */
+ for (;;) {
+ while (CTYPE(isspace, *yyInput))
+ yyInput++;
+ c = *yyInput;
+
+ /* Ignore RFC 822 comments, typically time zone names. */
+ if (c != LPAREN)
+ break;
+ for (nesting = 1;
+ (c = *++yyInput) != RPAREN || --nesting;
+ ) {
+ if (c == LPAREN) {
+ nesting++;
+ } else if (!IS7BIT(c) || c == '\0' || c == '\r'
+ || (c == '\\'
+ && ((c = *++yyInput) == '\0'
+ || !IS7BIT(c)))) {
+ /* Lexical error: bad comment. */
+ return '?';
+ }
+ }
+ yyInput++;
+ }
+
+ /* A number? */
+ if (CTYPE(isdigit, c) || c == '-' || c == '+') {
+ if (c == '-' || c == '+') {
+ sign = c == '-' ? -1 : 1;
+ yyInput++;
+ if (!CTYPE(isdigit, *yyInput)) {
+ /* Return the isolated plus or minus sign. */
+ --yyInput;
+ return *yyInput++;
+ }
+ } else {
+ sign = 0;
+ }
+ for (p = buff;
+ (c = *yyInput++) != '\0' && CTYPE(isdigit, c);
+ ) {
+ if (p < &buff[sizeof buff - 1])
+ *p++ = (char) c;
+ }
+ *p = '\0';
+ i = atoi(buff);
+
+ yyInput--;
+ yylval.Number = sign < 0 ? -i : i;
+ return sign ? tSNUMBER : tUNUMBER;
+ }
+
+ /* A word? */
+ if (CTYPE(isalpha, c)) {
+ for (p = buff;
+ (c = *yyInput++) == '.' || CTYPE(isalpha, c);
+ ) {
+ if (p < &buff[sizeof buff - 1])
+ *p++ = (char) (CTYPE(isupper, c) ? tolower(c) : c);
+ }
+ *p = '\0';
+ yyInput--;
+ return LookupWord(buff, (int) (p - buff));
+ }
+
+ return *yyInput++;
+}
+
+static int GetTimeInfo(TIMEINFO * Now)
+{
+ static time_t LastTime;
+ static long LastTzone;
+ struct tm *tm;
+
+#if defined(HAVE_GETTIMEOFDAY)
+ struct timeval tv;
+#endif /* defined(HAVE_GETTIMEOFDAY) */
+#if defined(DONT_HAVE_TM_GMTOFF)
+ struct tm local;
+ struct tm gmt;
+#endif /* !defined(DONT_HAVE_TM_GMTOFF) */
+
+ /* Get the basic time. */
+ memset(Now, 0, sizeof(TIMEINFO));
+#if defined(HAVE_GETTIMEOFDAY)
+ if (gettimeofday(&tv, (struct timezone *) NULL) == -1)
+ return -1;
+ Now->time = tv.tv_sec;
+ Now->usec = tv.tv_usec;
+#else
+ /* Can't check for -1 since that might be a time, I guess. */
+ (void) time(&Now->time);
+ Now->usec = 0;
+#endif /* defined(HAVE_GETTIMEOFDAY) */
+
+ /* Now get the timezone if it's been an hour since the last time. */
+ if (Now->time - LastTime > 60 * 60) {
+ LastTime = Now->time;
+ if ((tm = localtime(&Now->time)) == NULL)
+ return -1;
+#if defined(DONT_HAVE_TM_GMTOFF)
+ /* To get the timezone, compare localtime with GMT. */
+ local = *tm;
+ if ((tm = gmtime(&Now->time)) == NULL)
+ return -1;
+ gmt = *tm;
+
+ /* Assume we are never more than 24 hours away. */
+ LastTzone = gmt.tm_yday - local.tm_yday;
+ if (LastTzone > 1)
+ LastTzone = -24;
+ else if (LastTzone < -1)
+ LastTzone = 24;
+ else
+ LastTzone *= 24;
+
+ /* Scale in the hours and minutes; ignore seconds. */
+ LastTzone += gmt.tm_hour - local.tm_hour;
+ LastTzone *= 60;
+ LastTzone += gmt.tm_min - local.tm_min;
+#else
+ LastTzone = (0 - tm->tm_gmtoff) / 60;
+#endif /* defined(DONT_HAVE_TM_GMTOFF) */
+ }
+ Now->tzone = LastTzone;
+ return 0;
+}
+
+#if defined(YYBYACC) && defined(YYPURE) && defined(LY_FIND_LEAKS)
+#undef YYPURE
+#define YYPURE 1
+static void yyfreestack(YYSTACKDATA *);
+static void parsedate_leaks(void)
+{
+ yyfreestack(&yystack);
+}
+#endif
+
+time_t parsedate(char *p,
+ TIMEINFO * now)
+{
+ struct tm *tm;
+ TIMEINFO ti;
+ time_t Start;
+
+#if defined(YYBYACC) && defined(YYPURE) && defined(LY_FIND_LEAKS)
+ static int initialized;
+
+ if (!initialized) {
+ initialized = 1;
+ atexit(parsedate_leaks);
+ }
+#endif
+
+ yyInput = p;
+ if (now == NULL) {
+ now = &ti;
+ (void) GetTimeInfo(&ti);
+ }
+
+ if ((tm = localtime(&now->time)) == NULL)
+ return BAD_TIME;
+
+ /* *INDENT-EQLS* */
+ yyYear = tm->tm_year + 1900;
+ yyMonth = tm->tm_mon + 1;
+ yyDay = tm->tm_mday;
+ yyTimezone = now->tzone;
+ if (tm->tm_isdst) /* Correct timezone offset for DST */
+ yyTimezone += DST_OFFSET * 60;
+ yyDSTmode = DSTmaybe;
+ yyHour = 0;
+ yyMinutes = 0;
+ yySeconds = 0;
+ yyMeridian = MER24;
+ yyRelSeconds = 0;
+ yyRelMonth = 0;
+ yyHaveDate = 0;
+ yyHaveRel = 0;
+ yyHaveTime = 0;
+
+ if (date_parse() || yyHaveTime > 1 || yyHaveDate > 1)
+ return BAD_TIME;
+
+ if (yyHaveDate || yyHaveTime) {
+ Start = Convert(yyMonth, yyDay, yyYear, yyHour, yyMinutes, yySeconds,
+ yyMeridian, yyDSTmode);
+ if (isBadTime(Start))
+ return BAD_TIME;
+ } else {
+ Start = now->time;
+ if (!yyHaveRel)
+ Start -= (tm->tm_hour * 60L + tm->tm_min) * 60L + tm->tm_sec;
+ }
+
+ Start += yyRelSeconds;
+ if (yyRelMonth)
+ Start += RelativeMonth(Start, yyRelMonth);
+
+ /* Have to do *something* with a legitimate -1 so it's distinguishable
+ * from the error return value. (Alternately could set errno on error.) */
+ return (Start == BAD_TIME) ? 0 : Start;
+}
+#line 1203 "y.tab.c"
+
+/* For use in generated program */
+#define yydepth (int)(yystack.s_mark - yystack.s_base)
+#if YYBTYACC
+#define yytrial (yyps->save)
+#endif /* YYBTYACC */
+
+#if YYDEBUG
+#include <stdio.h> /* needed for printf */
+#endif
+
+#include <stdlib.h> /* needed for malloc, etc */
+#include <string.h> /* needed for memset */
+
+/* allocate initial stack or double stack size, up to YYMAXDEPTH */
+static int yygrowstack(YYSTACKDATA *data)
+{
+ int i;
+ unsigned newsize;
+ YYINT *newss;
+ YYSTYPE *newvs;
+#if defined(YYLTYPE) || defined(YYLTYPE_IS_DECLARED)
+ YYLTYPE *newps;
+#endif
+
+ if ((newsize = data->stacksize) == 0)
+ newsize = YYINITSTACKSIZE;
+ else if (newsize >= YYMAXDEPTH)
+ return YYENOMEM;
+ else if ((newsize *= 2) > YYMAXDEPTH)
+ newsize = YYMAXDEPTH;
+
+ i = (int) (data->s_mark - data->s_base);
+ newss = (YYINT *)realloc(data->s_base, newsize * sizeof(*newss));
+ if (newss == 0)
+ return YYENOMEM;
+
+ data->s_base = newss;
+ data->s_mark = newss + i;
+
+ newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs));
+ if (newvs == 0)
+ return YYENOMEM;
+
+ data->l_base = newvs;
+ data->l_mark = newvs + i;
+
+#if defined(YYLTYPE) || defined(YYLTYPE_IS_DECLARED)
+ newps = (YYLTYPE *)realloc(data->p_base, newsize * sizeof(*newps));
+ if (newps == 0)
+ return YYENOMEM;
+
+ data->p_base = newps;
+ data->p_mark = newps + i;
+#endif
+
+ data->stacksize = newsize;
+ data->s_last = data->s_base + newsize - 1;
+
+#if YYDEBUG
+ if (yydebug)
+ fprintf(stderr, "%sdebug: stack size increased to %d\n", YYPREFIX, newsize);
+#endif
+ return 0;
+}
+
+#if YYPURE || defined(YY_NO_LEAKS)
+static void yyfreestack(YYSTACKDATA *data)
+{
+ free(data->s_base);
+ free(data->l_base);
+#if defined(YYLTYPE) || defined(YYLTYPE_IS_DECLARED)
+ free(data->p_base);
+#endif
+ memset(data, 0, sizeof(*data));
+}
+#else
+#define yyfreestack(data) /* nothing */
+#endif /* YYPURE || defined(YY_NO_LEAKS) */
+#if YYBTYACC
+
+static YYParseState *
+yyNewState(unsigned size)
+{
+ YYParseState *p = (YYParseState *) malloc(sizeof(YYParseState));
+ if (p == NULL) return NULL;
+
+ p->yystack.stacksize = size;
+ if (size == 0)
+ {
+ p->yystack.s_base = NULL;
+ p->yystack.l_base = NULL;
+#if defined(YYLTYPE) || defined(YYLTYPE_IS_DECLARED)
+ p->yystack.p_base = NULL;
+#endif
+ return p;
+ }
+ p->yystack.s_base = (YYINT *) malloc(size * sizeof(YYINT));
+ if (p->yystack.s_base == NULL) return NULL;
+ p->yystack.l_base = (YYSTYPE *) malloc(size * sizeof(YYSTYPE));
+ if (p->yystack.l_base == NULL) return NULL;
+ memset(p->yystack.l_base, 0, size * sizeof(YYSTYPE));
+#if defined(YYLTYPE) || defined(YYLTYPE_IS_DECLARED)
+ p->yystack.p_base = (YYLTYPE *) malloc(size * sizeof(YYLTYPE));
+ if (p->yystack.p_base == NULL) return NULL;
+ memset(p->yystack.p_base, 0, size * sizeof(YYLTYPE));
+#endif
+
+ return p;
+}
+
+static void
+yyFreeState(YYParseState *p)
+{
+ yyfreestack(&p->yystack);
+ free(p);
+}
+#endif /* YYBTYACC */
+
+#define YYABORT goto yyabort
+#define YYREJECT goto yyabort
+#define YYACCEPT goto yyaccept
+#define YYERROR goto yyerrlab
+#if YYBTYACC
+#define YYVALID do { if (yyps->save) goto yyvalid; } while(0)
+#define YYVALID_NESTED do { if (yyps->save && \
+ yyps->save->save == 0) goto yyvalid; } while(0)
+#endif /* YYBTYACC */
+
+int
+YYPARSE_DECL()
+{
+ int yym, yyn, yystate, yyresult;
+#if YYBTYACC
+ int yynewerrflag;
+ YYParseState *yyerrctx = NULL;
+#endif /* YYBTYACC */
+#if defined(YYLTYPE) || defined(YYLTYPE_IS_DECLARED)
+ YYLTYPE yyerror_loc_range[3]; /* position of error start/end (0 unused) */
+#endif
+#if YYDEBUG
+ const char *yys;
+
+ if ((yys = getenv("YYDEBUG")) != 0)
+ {
+ yyn = *yys;
+ if (yyn >= '0' && yyn <= '9')
+ yydebug = yyn - '0';
+ }
+ if (yydebug)
+ fprintf(stderr, "%sdebug[<# of symbols on state stack>]\n", YYPREFIX);
+#endif
+#if defined(YYLTYPE) || defined(YYLTYPE_IS_DECLARED)
+ memset(yyerror_loc_range, 0, sizeof(yyerror_loc_range));
+#endif
+
+#if YYBTYACC
+ yyps = yyNewState(0); if (yyps == 0) goto yyenomem;
+ yyps->save = 0;
+#endif /* YYBTYACC */
+ yym = 0;
+ /* yyn is set below */
+ yynerrs = 0;
+ yyerrflag = 0;
+ yychar = YYEMPTY;
+ yystate = 0;
+
+#if YYPURE
+ memset(&yystack, 0, sizeof(yystack));
+#endif
+
+ if (yystack.s_base == NULL && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
+ yystack.s_mark = yystack.s_base;
+ yystack.l_mark = yystack.l_base;
+#if defined(YYLTYPE) || defined(YYLTYPE_IS_DECLARED)
+ yystack.p_mark = yystack.p_base;
+#endif
+ yystate = 0;
+ *yystack.s_mark = 0;
+
+yyloop:
+ if ((yyn = yydefred[yystate]) != 0) goto yyreduce;
+ if (yychar < 0)
+ {
+#if YYBTYACC
+ do {
+ if (yylvp < yylve)
+ {
+ /* we're currently re-reading tokens */
+ yylval = *yylvp++;
+#if defined(YYLTYPE) || defined(YYLTYPE_IS_DECLARED)
+ yylloc = *yylpp++;
+#endif
+ yychar = *yylexp++;
+ break;
+ }
+ if (yyps->save)
+ {
+ /* in trial mode; save scanner results for future parse attempts */
+ if (yylvp == yylvlim)
+ { /* Enlarge lexical value queue */
+ size_t p = (size_t) (yylvp - yylvals);
+ size_t s = (size_t) (yylvlim - yylvals);
+
+ s += YYLVQUEUEGROWTH;
+ if ((yylexemes = (YYINT *)realloc(yylexemes, s * sizeof(YYINT))) == NULL) goto yyenomem;
+ if ((yylvals = (YYSTYPE *)realloc(yylvals, s * sizeof(YYSTYPE))) == NULL) goto yyenomem;
+#if defined(YYLTYPE) || defined(YYLTYPE_IS_DECLARED)
+ if ((yylpsns = (YYLTYPE *)realloc(yylpsns, s * sizeof(YYLTYPE))) == NULL) goto yyenomem;
+#endif
+ yylvp = yylve = yylvals + p;
+ yylvlim = yylvals + s;
+#if defined(YYLTYPE) || defined(YYLTYPE_IS_DECLARED)
+ yylpp = yylpe = yylpsns + p;
+ yylplim = yylpsns + s;
+#endif
+ yylexp = yylexemes + p;
+ }
+ *yylexp = (YYINT) YYLEX;
+ *yylvp++ = yylval;
+ yylve++;
+#if defined(YYLTYPE) || defined(YYLTYPE_IS_DECLARED)
+ *yylpp++ = yylloc;
+ yylpe++;
+#endif
+ yychar = *yylexp++;
+ break;
+ }
+ /* normal operation, no conflict encountered */
+#endif /* YYBTYACC */
+ yychar = YYLEX;
+#if YYBTYACC
+ } while (0);
+#endif /* YYBTYACC */
+ if (yychar < 0) yychar = YYEOF;
+#if YYDEBUG
+ if (yydebug)
+ {
+ if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
+ fprintf(stderr, "%s[%d]: state %d, reading token %d (%s)",
+ YYDEBUGSTR, yydepth, yystate, yychar, yys);
+#ifdef YYSTYPE_TOSTRING
+#if YYBTYACC
+ if (!yytrial)
+#endif /* YYBTYACC */
+ fprintf(stderr, " <%s>", YYSTYPE_TOSTRING(yychar, yylval));
+#endif
+ fputc('\n', stderr);
+ }
+#endif
+ }
+#if YYBTYACC
+
+ /* Do we have a conflict? */
+ if (((yyn = yycindex[yystate]) != 0) && (yyn += yychar) >= 0 &&
+ yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar)
+ {
+ YYINT ctry;
+
+ if (yypath)
+ {
+ YYParseState *save;
+#if YYDEBUG
+ if (yydebug)
+ fprintf(stderr, "%s[%d]: CONFLICT in state %d: following successful trial parse\n",
+ YYDEBUGSTR, yydepth, yystate);
+#endif
+ /* Switch to the next conflict context */
+ save = yypath;
+ yypath = save->save;
+ save->save = NULL;
+ ctry = save->ctry;
+ if (save->state != yystate) YYABORT;
+ yyFreeState(save);
+
+ }
+ else
+ {
+
+ /* Unresolved conflict - start/continue trial parse */
+ YYParseState *save;
+#if YYDEBUG
+ if (yydebug)
+ {
+ fprintf(stderr, "%s[%d]: CONFLICT in state %d. ", YYDEBUGSTR, yydepth, yystate);
+ if (yyps->save)
+ fputs("ALREADY in conflict, continuing trial parse.\n", stderr);
+ else
+ fputs("Starting trial parse.\n", stderr);
+ }
+#endif
+ save = yyNewState((unsigned)(yystack.s_mark - yystack.s_base + 1));
+ if (save == NULL) goto yyenomem;
+ save->save = yyps->save;
+ save->state = yystate;
+ save->errflag = yyerrflag;
+ save->yystack.s_mark = save->yystack.s_base + (yystack.s_mark - yystack.s_base);
+ memcpy (save->yystack.s_base, yystack.s_base, (size_t) (yystack.s_mark - yystack.s_base + 1) * sizeof(YYINT));
+ save->yystack.l_mark = save->yystack.l_base + (yystack.l_mark - yystack.l_base);
+ memcpy (save->yystack.l_base, yystack.l_base, (size_t) (yystack.l_mark - yystack.l_base + 1) * sizeof(YYSTYPE));
+#if defined(YYLTYPE) || defined(YYLTYPE_IS_DECLARED)
+ save->yystack.p_mark = save->yystack.p_base + (yystack.p_mark - yystack.p_base);
+ memcpy (save->yystack.p_base, yystack.p_base, (size_t) (yystack.p_mark - yystack.p_base + 1) * sizeof(YYLTYPE));
+#endif
+ ctry = yytable[yyn];
+ if (yyctable[ctry] == -1)
+ {
+#if YYDEBUG
+ if (yydebug && yychar >= YYEOF)
+ fprintf(stderr, "%s[%d]: backtracking 1 token\n", YYDEBUGSTR, yydepth);
+#endif
+ ctry++;
+ }
+ save->ctry = ctry;
+ if (yyps->save == NULL)
+ {
+ /* If this is a first conflict in the stack, start saving lexemes */
+ if (!yylexemes)
+ {
+ yylexemes = (YYINT *) malloc((YYLVQUEUEGROWTH) * sizeof(YYINT));
+ if (yylexemes == NULL) goto yyenomem;
+ yylvals = (YYSTYPE *) malloc((YYLVQUEUEGROWTH) * sizeof(YYSTYPE));
+ if (yylvals == NULL) goto yyenomem;
+ yylvlim = yylvals + YYLVQUEUEGROWTH;
+#if defined(YYLTYPE) || defined(YYLTYPE_IS_DECLARED)
+ yylpsns = (YYLTYPE *) malloc((YYLVQUEUEGROWTH) * sizeof(YYLTYPE));
+ if (yylpsns == NULL) goto yyenomem;
+ yylplim = yylpsns + YYLVQUEUEGROWTH;
+#endif
+ }
+ if (yylvp == yylve)
+ {
+ yylvp = yylve = yylvals;
+#if defined(YYLTYPE) || defined(YYLTYPE_IS_DECLARED)
+ yylpp = yylpe = yylpsns;
+#endif
+ yylexp = yylexemes;
+ if (yychar >= YYEOF)
+ {
+ *yylve++ = yylval;
+#if defined(YYLTYPE) || defined(YYLTYPE_IS_DECLARED)
+ *yylpe++ = yylloc;
+#endif
+ *yylexp = (YYINT) yychar;
+ yychar = YYEMPTY;
+ }
+ }
+ }
+ if (yychar >= YYEOF)
+ {
+ yylvp--;
+#if defined(YYLTYPE) || defined(YYLTYPE_IS_DECLARED)
+ yylpp--;
+#endif
+ yylexp--;
+ yychar = YYEMPTY;
+ }
+ save->lexeme = (int) (yylvp - yylvals);
+ yyps->save = save;
+ }
+ if (yytable[yyn] == ctry)
+ {
+#if YYDEBUG
+ if (yydebug)
+ fprintf(stderr, "%s[%d]: state %d, shifting to state %d\n",
+ YYDEBUGSTR, yydepth, yystate, yyctable[ctry]);
+#endif
+ if (yychar < 0)
+ {
+ yylvp++;
+#if defined(YYLTYPE) || defined(YYLTYPE_IS_DECLARED)
+ yylpp++;
+#endif
+ yylexp++;
+ }
+ if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM)
+ goto yyoverflow;
+ yystate = yyctable[ctry];
+ *++yystack.s_mark = (YYINT) yystate;
+ *++yystack.l_mark = yylval;
+#if defined(YYLTYPE) || defined(YYLTYPE_IS_DECLARED)
+ *++yystack.p_mark = yylloc;
+#endif
+ yychar = YYEMPTY;
+ if (yyerrflag > 0) --yyerrflag;
+ goto yyloop;
+ }
+ else
+ {
+ yyn = yyctable[ctry];
+ goto yyreduce;
+ }
+ } /* End of code dealing with conflicts */
+#endif /* YYBTYACC */
+ if (((yyn = yysindex[yystate]) != 0) && (yyn += yychar) >= 0 &&
+ yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar)
+ {
+#if YYDEBUG
+ if (yydebug)
+ fprintf(stderr, "%s[%d]: state %d, shifting to state %d\n",
+ YYDEBUGSTR, yydepth, yystate, yytable[yyn]);
+#endif
+ if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
+ yystate = yytable[yyn];
+ *++yystack.s_mark = yytable[yyn];
+ *++yystack.l_mark = yylval;
+#if defined(YYLTYPE) || defined(YYLTYPE_IS_DECLARED)
+ *++yystack.p_mark = yylloc;
+#endif
+ yychar = YYEMPTY;
+ if (yyerrflag > 0) --yyerrflag;
+ goto yyloop;
+ }
+ if (((yyn = yyrindex[yystate]) != 0) && (yyn += yychar) >= 0 &&
+ yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar)
+ {
+ yyn = yytable[yyn];
+ goto yyreduce;
+ }
+ if (yyerrflag != 0) goto yyinrecovery;
+#if YYBTYACC
+
+ yynewerrflag = 1;
+ goto yyerrhandler;
+ goto yyerrlab; /* redundant goto avoids 'unused label' warning */
+
+yyerrlab:
+ /* explicit YYERROR from an action -- pop the rhs of the rule reduced
+ * before looking for error recovery */
+ yystack.s_mark -= yym;
+ yystate = *yystack.s_mark;
+ yystack.l_mark -= yym;
+#if defined(YYLTYPE) || defined(YYLTYPE_IS_DECLARED)
+ yystack.p_mark -= yym;
+#endif
+
+ yynewerrflag = 0;
+yyerrhandler:
+ while (yyps->save)
+ {
+ int ctry;
+ YYParseState *save = yyps->save;
+#if YYDEBUG
+ if (yydebug)
+ fprintf(stderr, "%s[%d]: ERROR in state %d, CONFLICT BACKTRACKING to state %d, %d tokens\n",
+ YYDEBUGSTR, yydepth, yystate, yyps->save->state,
+ (int)(yylvp - yylvals - yyps->save->lexeme));
+#endif
+ /* Memorize most forward-looking error state in case it's really an error. */
+ if (yyerrctx == NULL || yyerrctx->lexeme < yylvp - yylvals)
+ {
+ /* Free old saved error context state */
+ if (yyerrctx) yyFreeState(yyerrctx);
+ /* Create and fill out new saved error context state */
+ yyerrctx = yyNewState((unsigned)(yystack.s_mark - yystack.s_base + 1));
+ if (yyerrctx == NULL) goto yyenomem;
+ yyerrctx->save = yyps->save;
+ yyerrctx->state = yystate;
+ yyerrctx->errflag = yyerrflag;
+ yyerrctx->yystack.s_mark = yyerrctx->yystack.s_base + (yystack.s_mark - yystack.s_base);
+ memcpy (yyerrctx->yystack.s_base, yystack.s_base, (size_t) (yystack.s_mark - yystack.s_base + 1) * sizeof(YYINT));
+ yyerrctx->yystack.l_mark = yyerrctx->yystack.l_base + (yystack.l_mark - yystack.l_base);
+ memcpy (yyerrctx->yystack.l_base, yystack.l_base, (size_t) (yystack.l_mark - yystack.l_base + 1) * sizeof(YYSTYPE));
+#if defined(YYLTYPE) || defined(YYLTYPE_IS_DECLARED)
+ yyerrctx->yystack.p_mark = yyerrctx->yystack.p_base + (yystack.p_mark - yystack.p_base);
+ memcpy (yyerrctx->yystack.p_base, yystack.p_base, (size_t) (yystack.p_mark - yystack.p_base + 1) * sizeof(YYLTYPE));
+#endif
+ yyerrctx->lexeme = (int) (yylvp - yylvals);
+ }
+ yylvp = yylvals + save->lexeme;
+#if defined(YYLTYPE) || defined(YYLTYPE_IS_DECLARED)
+ yylpp = yylpsns + save->lexeme;
+#endif
+ yylexp = yylexemes + save->lexeme;
+ yychar = YYEMPTY;
+ yystack.s_mark = yystack.s_base + (save->yystack.s_mark - save->yystack.s_base);
+ memcpy (yystack.s_base, save->yystack.s_base, (size_t) (yystack.s_mark - yystack.s_base + 1) * sizeof(YYINT));
+ yystack.l_mark = yystack.l_base + (save->yystack.l_mark - save->yystack.l_base);
+ memcpy (yystack.l_base, save->yystack.l_base, (size_t) (yystack.l_mark - yystack.l_base + 1) * sizeof(YYSTYPE));
+#if defined(YYLTYPE) || defined(YYLTYPE_IS_DECLARED)
+ yystack.p_mark = yystack.p_base + (save->yystack.p_mark - save->yystack.p_base);
+ memcpy (yystack.p_base, save->yystack.p_base, (size_t) (yystack.p_mark - yystack.p_base + 1) * sizeof(YYLTYPE));
+#endif
+ ctry = ++save->ctry;
+ yystate = save->state;
+ /* We tried shift, try reduce now */
+ if ((yyn = yyctable[ctry]) >= 0) goto yyreduce;
+ yyps->save = save->save;
+ save->save = NULL;
+ yyFreeState(save);
+
+ /* Nothing left on the stack -- error */
+ if (!yyps->save)
+ {
+#if YYDEBUG
+ if (yydebug)
+ fprintf(stderr, "%sdebug[%d,trial]: trial parse FAILED, entering ERROR mode\n",
+ YYPREFIX, yydepth);
+#endif
+ /* Restore state as it was in the most forward-advanced error */
+ yylvp = yylvals + yyerrctx->lexeme;
+#if defined(YYLTYPE) || defined(YYLTYPE_IS_DECLARED)
+ yylpp = yylpsns + yyerrctx->lexeme;
+#endif
+ yylexp = yylexemes + yyerrctx->lexeme;
+ yychar = yylexp[-1];
+ yylval = yylvp[-1];
+#if defined(YYLTYPE) || defined(YYLTYPE_IS_DECLARED)
+ yylloc = yylpp[-1];
+#endif
+ yystack.s_mark = yystack.s_base + (yyerrctx->yystack.s_mark - yyerrctx->yystack.s_base);
+ memcpy (yystack.s_base, yyerrctx->yystack.s_base, (size_t) (yystack.s_mark - yystack.s_base + 1) * sizeof(YYINT));
+ yystack.l_mark = yystack.l_base + (yyerrctx->yystack.l_mark - yyerrctx->yystack.l_base);
+ memcpy (yystack.l_base, yyerrctx->yystack.l_base, (size_t) (yystack.l_mark - yystack.l_base + 1) * sizeof(YYSTYPE));
+#if defined(YYLTYPE) || defined(YYLTYPE_IS_DECLARED)
+ yystack.p_mark = yystack.p_base + (yyerrctx->yystack.p_mark - yyerrctx->yystack.p_base);
+ memcpy (yystack.p_base, yyerrctx->yystack.p_base, (size_t) (yystack.p_mark - yystack.p_base + 1) * sizeof(YYLTYPE));
+#endif
+ yystate = yyerrctx->state;
+ yyFreeState(yyerrctx);
+ yyerrctx = NULL;
+ }
+ yynewerrflag = 1;
+ }
+ if (yynewerrflag == 0) goto yyinrecovery;
+#endif /* YYBTYACC */
+
+ YYERROR_CALL("syntax error");
+#if defined(YYLTYPE) || defined(YYLTYPE_IS_DECLARED)
+ yyerror_loc_range[1] = yylloc; /* lookahead position is error start position */
+#endif
+
+#if !YYBTYACC
+ goto yyerrlab; /* redundant goto avoids 'unused label' warning */
+yyerrlab:
+#endif
+ ++yynerrs;
+
+yyinrecovery:
+ if (yyerrflag < 3)
+ {
+ yyerrflag = 3;
+ for (;;)
+ {
+ if (((yyn = yysindex[*yystack.s_mark]) != 0) && (yyn += YYERRCODE) >= 0 &&
+ yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) YYERRCODE)
+ {
+#if YYDEBUG
+ if (yydebug)
+ fprintf(stderr, "%s[%d]: state %d, error recovery shifting to state %d\n",
+ YYDEBUGSTR, yydepth, *yystack.s_mark, yytable[yyn]);
+#endif
+ if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
+ yystate = yytable[yyn];
+ *++yystack.s_mark = yytable[yyn];
+ *++yystack.l_mark = yylval;
+#if defined(YYLTYPE) || defined(YYLTYPE_IS_DECLARED)
+ /* lookahead position is error end position */
+ yyerror_loc_range[2] = yylloc;
+ YYLLOC_DEFAULT(yyloc, yyerror_loc_range, 2); /* position of error span */
+ *++yystack.p_mark = yyloc;
+#endif
+ goto yyloop;
+ }
+ else
+ {
+#if YYDEBUG
+ if (yydebug)
+ fprintf(stderr, "%s[%d]: error recovery discarding state %d\n",
+ YYDEBUGSTR, yydepth, *yystack.s_mark);
+#endif
+ if (yystack.s_mark <= yystack.s_base) goto yyabort;
+#if defined(YYLTYPE) || defined(YYLTYPE_IS_DECLARED)
+ /* the current TOS position is the error start position */
+ yyerror_loc_range[1] = *yystack.p_mark;
+#endif
+#if defined(YYDESTRUCT_CALL)
+#if YYBTYACC
+ if (!yytrial)
+#endif /* YYBTYACC */
+#if defined(YYLTYPE) || defined(YYLTYPE_IS_DECLARED)
+ YYDESTRUCT_CALL("error: discarding state",
+ yystos[*yystack.s_mark], yystack.l_mark, yystack.p_mark);
+#else
+ YYDESTRUCT_CALL("error: discarding state",
+ yystos[*yystack.s_mark], yystack.l_mark);
+#endif /* defined(YYLTYPE) || defined(YYLTYPE_IS_DECLARED) */
+#endif /* defined(YYDESTRUCT_CALL) */
+ --yystack.s_mark;
+ --yystack.l_mark;
+#if defined(YYLTYPE) || defined(YYLTYPE_IS_DECLARED)
+ --yystack.p_mark;
+#endif
+ }
+ }
+ }
+ else
+ {
+ if (yychar == YYEOF) goto yyabort;
+#if YYDEBUG
+ if (yydebug)
+ {
+ if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
+ fprintf(stderr, "%s[%d]: state %d, error recovery discarding token %d (%s)\n",
+ YYDEBUGSTR, yydepth, yystate, yychar, yys);
+ }
+#endif
+#if defined(YYDESTRUCT_CALL)
+#if YYBTYACC
+ if (!yytrial)
+#endif /* YYBTYACC */
+#if defined(YYLTYPE) || defined(YYLTYPE_IS_DECLARED)
+ YYDESTRUCT_CALL("error: discarding token", yychar, &yylval, &yylloc);
+#else
+ YYDESTRUCT_CALL("error: discarding token", yychar, &yylval);
+#endif /* defined(YYLTYPE) || defined(YYLTYPE_IS_DECLARED) */
+#endif /* defined(YYDESTRUCT_CALL) */
+ yychar = YYEMPTY;
+ goto yyloop;
+ }
+
+yyreduce:
+ yym = yylen[yyn];
+#if YYDEBUG
+ if (yydebug)
+ {
+ fprintf(stderr, "%s[%d]: state %d, reducing by rule %d (%s)",
+ YYDEBUGSTR, yydepth, yystate, yyn, yyrule[yyn]);
+#ifdef YYSTYPE_TOSTRING
+#if YYBTYACC
+ if (!yytrial)
+#endif /* YYBTYACC */
+ if (yym > 0)
+ {
+ int i;
+ fputc('<', stderr);
+ for (i = yym; i > 0; i--)
+ {
+ if (i != yym) fputs(", ", stderr);
+ fputs(YYSTYPE_TOSTRING(yystos[yystack.s_mark[1-i]],
+ yystack.l_mark[1-i]), stderr);
+ }
+ fputc('>', stderr);
+ }
+#endif
+ fputc('\n', stderr);
+ }
+#endif
+ if (yym > 0)
+ yyval = yystack.l_mark[1-yym];
+ else
+ memset(&yyval, 0, sizeof yyval);
+#if defined(YYLTYPE) || defined(YYLTYPE_IS_DECLARED)
+
+ /* Perform position reduction */
+ memset(&yyloc, 0, sizeof(yyloc));
+#if YYBTYACC
+ if (!yytrial)
+#endif /* YYBTYACC */
+ {
+ YYLLOC_DEFAULT(yyloc, &yystack.p_mark[-yym], yym);
+ /* just in case YYERROR is invoked within the action, save
+ the start of the rhs as the error start position */
+ yyerror_loc_range[1] = yystack.p_mark[1-yym];
+ }
+#endif
+
+ switch (yyn)
+ {
+case 3:
+#line 157 "./parsdate.y"
+ {
+ yyHaveTime++;
+#if defined(lint)
+ /* I am compulsive about lint natterings... */
+ if (yyHaveTime == -1) {
+ YYERROR;
+ }
+#endif /* defined(lint) */
+ }
+#line 1884 "y.tab.c"
+break;
+case 4:
+#line 166 "./parsdate.y"
+ {
+ yyHaveTime++;
+ yyTimezone = yystack.l_mark[0].Number;
+ }
+#line 1892 "y.tab.c"
+break;
+case 5:
+#line 170 "./parsdate.y"
+ {
+ yyHaveDate++;
+ }
+#line 1899 "y.tab.c"
+break;
+case 6:
+#line 173 "./parsdate.y"
+ {
+ yyHaveDate++;
+ yyHaveTime++;
+ }
+#line 1907 "y.tab.c"
+break;
+case 7:
+#line 177 "./parsdate.y"
+ {
+ yyHaveDate++;
+ yyHaveTime++;
+ yyTimezone = yystack.l_mark[0].Number;
+ }
+#line 1916 "y.tab.c"
+break;
+case 8:
+#line 182 "./parsdate.y"
+ {
+ yyHaveRel = 1;
+ }
+#line 1923 "y.tab.c"
+break;
+case 9:
+#line 187 "./parsdate.y"
+ {
+ if (yystack.l_mark[-1].Number < 100) {
+ yyHour = yystack.l_mark[-1].Number;
+ yyMinutes = 0;
+ }
+ else {
+ yyHour = yystack.l_mark[-1].Number / 100;
+ yyMinutes = yystack.l_mark[-1].Number % 100;
+ }
+ yySeconds = 0;
+ yyMeridian = yystack.l_mark[0].Meridian;
+ }
+#line 1939 "y.tab.c"
+break;
+case 10:
+#line 199 "./parsdate.y"
+ {
+ yyHour = yystack.l_mark[-3].Number;
+ yyMinutes = yystack.l_mark[-1].Number;
+ yySeconds = 0;
+ yyMeridian = yystack.l_mark[0].Meridian;
+ }
+#line 1949 "y.tab.c"
+break;
+case 11:
+#line 205 "./parsdate.y"
+ {
+ yyHour = yystack.l_mark[-3].Number;
+ yyMinutes = yystack.l_mark[-1].Number;
+ yyTimezone = yystack.l_mark[0].Number;
+ yyMeridian = MER24;
+ yyDSTmode = DSToff;
+ }
+#line 1960 "y.tab.c"
+break;
+case 12:
+#line 212 "./parsdate.y"
+ {
+ yyHour = yystack.l_mark[-5].Number;
+ yyMinutes = yystack.l_mark[-3].Number;
+ yySeconds = yystack.l_mark[-1].Number;
+ yyMeridian = yystack.l_mark[0].Meridian;
+ }
+#line 1970 "y.tab.c"
+break;
+case 13:
+#line 218 "./parsdate.y"
+ {
+ yyHour = yystack.l_mark[-5].Number;
+ yyMinutes = yystack.l_mark[-3].Number;
+ yySeconds = yystack.l_mark[-1].Number;
+ yyTimezone = yystack.l_mark[0].Number;
+ yyMeridian = MER24;
+ yyDSTmode = DSToff;
+ }
+#line 1982 "y.tab.c"
+break;
+case 14:
+#line 228 "./parsdate.y"
+ {
+ yyval.Number = yystack.l_mark[0].Number;
+ yyDSTmode = DSToff;
+ }
+#line 1990 "y.tab.c"
+break;
+case 15:
+#line 232 "./parsdate.y"
+ {
+ yyval.Number = yystack.l_mark[0].Number;
+ yyDSTmode = DSTon;
+ }
+#line 1998 "y.tab.c"
+break;
+case 16:
+#line 236 "./parsdate.y"
+ {
+ yyTimezone = yystack.l_mark[-1].Number;
+ yyDSTmode = DSTon;
+ }
+#line 2006 "y.tab.c"
+break;
+case 17:
+#line 240 "./parsdate.y"
+ {
+ /* Only allow "GMT+300" and "GMT-0800" */
+ if (yystack.l_mark[-1].Number != 0) {
+ YYABORT;
+ }
+ yyval.Number = yystack.l_mark[0].Number;
+ yyDSTmode = DSToff;
+ }
+#line 2018 "y.tab.c"
+break;
+case 18:
+#line 248 "./parsdate.y"
+ {
+ yyval.Number = yystack.l_mark[0].Number;
+ yyDSTmode = DSToff;
+ }
+#line 2026 "y.tab.c"
+break;
+case 19:
+#line 254 "./parsdate.y"
+ {
+ int i;
+
+ /* Unix and GMT and numeric timezones -- a little confusing. */
+ if ((int)yystack.l_mark[0].Number < 0) {
+ /* Don't work with negative modulus. */
+ yystack.l_mark[0].Number = -(int)yystack.l_mark[0].Number;
+ if (yystack.l_mark[0].Number > 9999 || (i = (int) (yystack.l_mark[0].Number % 100)) >= 60) {
+ YYABORT;
+ }
+ yyval.Number = (yystack.l_mark[0].Number / 100) * 60 + i;
+ }
+ else {
+ if (yystack.l_mark[0].Number > 9999 || (i = (int) (yystack.l_mark[0].Number % 100)) >= 60) {
+ YYABORT;
+ }
+ yyval.Number = -((yystack.l_mark[0].Number / 100) * 60 + i);
+ }
+ }
+#line 2049 "y.tab.c"
+break;
+case 20:
+#line 275 "./parsdate.y"
+ {
+ yyMonth = yystack.l_mark[-2].Number;
+ yyDay = yystack.l_mark[0].Number;
+ }
+#line 2057 "y.tab.c"
+break;
+case 21:
+#line 279 "./parsdate.y"
+ {
+ if (yystack.l_mark[-4].Number > 100) {
+ yyYear = yystack.l_mark[-4].Number;
+ yyMonth = yystack.l_mark[-2].Number;
+ yyDay = yystack.l_mark[0].Number;
+ }
+ else {
+ yyMonth = yystack.l_mark[-4].Number;
+ yyDay = yystack.l_mark[-2].Number;
+ yyYear = yystack.l_mark[0].Number;
+ }
+ }
+#line 2073 "y.tab.c"
+break;
+case 22:
+#line 291 "./parsdate.y"
+ {
+ yyMonth = yystack.l_mark[-1].Number;
+ yyDay = yystack.l_mark[0].Number;
+ }
+#line 2081 "y.tab.c"
+break;
+case 23:
+#line 295 "./parsdate.y"
+ {
+ yyMonth = yystack.l_mark[-3].Number;
+ yyDay = yystack.l_mark[-2].Number;
+ yyYear = yystack.l_mark[0].Number;
+ }
+#line 2090 "y.tab.c"
+break;
+case 24:
+#line 300 "./parsdate.y"
+ {
+ yyDay = yystack.l_mark[-1].Number;
+ yyMonth = yystack.l_mark[0].Number;
+ }
+#line 2098 "y.tab.c"
+break;
+case 25:
+#line 304 "./parsdate.y"
+ {
+ yyDay = yystack.l_mark[-2].Number;
+ yyMonth = yystack.l_mark[-1].Number;
+ yyYear = yystack.l_mark[0].Number;
+ }
+#line 2107 "y.tab.c"
+break;
+case 26:
+#line 309 "./parsdate.y"
+ {
+ yyDay = yystack.l_mark[-2].Number;
+ yyMonth = yystack.l_mark[-1].Number;
+ yyYear = yystack.l_mark[0].Number;
+ }
+#line 2116 "y.tab.c"
+break;
+case 27:
+#line 314 "./parsdate.y"
+ {
+ yyDay = yystack.l_mark[-3].Number;
+ yyMonth = yystack.l_mark[-1].Number;
+ yyYear = -yystack.l_mark[0].Number;
+ }
+#line 2125 "y.tab.c"
+break;
+case 28:
+#line 319 "./parsdate.y"
+ {
+ yyDay = yystack.l_mark[-2].Number;
+ yyMonth = -yystack.l_mark[-1].Number;
+ yyYear = -yystack.l_mark[0].Number;
+ yyDSTmode = DSToff; /* assume midnight if no time given */
+ yyTimezone = 0; /* Lynx assumes GMT for this format */
+ }
+#line 2136 "y.tab.c"
+break;
+case 29:
+#line 328 "./parsdate.y"
+ {
+ yyMonth = yystack.l_mark[-7].Number;
+ yyDay = yystack.l_mark[-6].Number;
+ yyYear = yystack.l_mark[0].Number;
+ yyHour = yystack.l_mark[-5].Number;
+ yyMinutes = yystack.l_mark[-3].Number;
+ yySeconds = yystack.l_mark[-1].Number;
+ }
+#line 2148 "y.tab.c"
+break;
+case 30:
+#line 338 "./parsdate.y"
+ {
+ yyRelSeconds += yystack.l_mark[-1].Number * yystack.l_mark[0].Number;
+ }
+#line 2155 "y.tab.c"
+break;
+case 31:
+#line 341 "./parsdate.y"
+ {
+ yyRelSeconds += yystack.l_mark[-1].Number * yystack.l_mark[0].Number;
+ }
+#line 2162 "y.tab.c"
+break;
+case 32:
+#line 344 "./parsdate.y"
+ {
+ yyRelMonth += yystack.l_mark[-1].Number * yystack.l_mark[0].Number;
+ }
+#line 2169 "y.tab.c"
+break;
+case 33:
+#line 347 "./parsdate.y"
+ {
+ yyRelMonth += yystack.l_mark[-1].Number * yystack.l_mark[0].Number;
+ }
+#line 2176 "y.tab.c"
+break;
+case 34:
+#line 352 "./parsdate.y"
+ {
+ yyval.Meridian = MER24;
+ }
+#line 2183 "y.tab.c"
+break;
+case 35:
+#line 355 "./parsdate.y"
+ {
+ yyval.Meridian = yystack.l_mark[0].Meridian;
+ }
+#line 2190 "y.tab.c"
+break;
+#line 2192 "y.tab.c"
+ default:
+ break;
+ }
+ yystack.s_mark -= yym;
+ yystate = *yystack.s_mark;
+ yystack.l_mark -= yym;
+#if defined(YYLTYPE) || defined(YYLTYPE_IS_DECLARED)
+ yystack.p_mark -= yym;
+#endif
+ yym = yylhs[yyn];
+ if (yystate == 0 && yym == 0)
+ {
+#if YYDEBUG
+ if (yydebug)
+ {
+ fprintf(stderr, "%s[%d]: after reduction, ", YYDEBUGSTR, yydepth);
+#ifdef YYSTYPE_TOSTRING
+#if YYBTYACC
+ if (!yytrial)
+#endif /* YYBTYACC */
+ fprintf(stderr, "result is <%s>, ", YYSTYPE_TOSTRING(yystos[YYFINAL], yyval));
+#endif
+ fprintf(stderr, "shifting from state 0 to final state %d\n", YYFINAL);
+ }
+#endif
+ yystate = YYFINAL;
+ *++yystack.s_mark = YYFINAL;
+ *++yystack.l_mark = yyval;
+#if defined(YYLTYPE) || defined(YYLTYPE_IS_DECLARED)
+ *++yystack.p_mark = yyloc;
+#endif
+ if (yychar < 0)
+ {
+#if YYBTYACC
+ do {
+ if (yylvp < yylve)
+ {
+ /* we're currently re-reading tokens */
+ yylval = *yylvp++;
+#if defined(YYLTYPE) || defined(YYLTYPE_IS_DECLARED)
+ yylloc = *yylpp++;
+#endif
+ yychar = *yylexp++;
+ break;
+ }
+ if (yyps->save)
+ {
+ /* in trial mode; save scanner results for future parse attempts */
+ if (yylvp == yylvlim)
+ { /* Enlarge lexical value queue */
+ size_t p = (size_t) (yylvp - yylvals);
+ size_t s = (size_t) (yylvlim - yylvals);
+
+ s += YYLVQUEUEGROWTH;
+ if ((yylexemes = (YYINT *)realloc(yylexemes, s * sizeof(YYINT))) == NULL)
+ goto yyenomem;
+ if ((yylvals = (YYSTYPE *)realloc(yylvals, s * sizeof(YYSTYPE))) == NULL)
+ goto yyenomem;
+#if defined(YYLTYPE) || defined(YYLTYPE_IS_DECLARED)
+ if ((yylpsns = (YYLTYPE *)realloc(yylpsns, s * sizeof(YYLTYPE))) == NULL)
+ goto yyenomem;
+#endif
+ yylvp = yylve = yylvals + p;
+ yylvlim = yylvals + s;
+#if defined(YYLTYPE) || defined(YYLTYPE_IS_DECLARED)
+ yylpp = yylpe = yylpsns + p;
+ yylplim = yylpsns + s;
+#endif
+ yylexp = yylexemes + p;
+ }
+ *yylexp = (YYINT) YYLEX;
+ *yylvp++ = yylval;
+ yylve++;
+#if defined(YYLTYPE) || defined(YYLTYPE_IS_DECLARED)
+ *yylpp++ = yylloc;
+ yylpe++;
+#endif
+ yychar = *yylexp++;
+ break;
+ }
+ /* normal operation, no conflict encountered */
+#endif /* YYBTYACC */
+ yychar = YYLEX;
+#if YYBTYACC
+ } while (0);
+#endif /* YYBTYACC */
+ if (yychar < 0) yychar = YYEOF;
+#if YYDEBUG
+ if (yydebug)
+ {
+ if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
+ fprintf(stderr, "%s[%d]: state %d, reading token %d (%s)\n",
+ YYDEBUGSTR, yydepth, YYFINAL, yychar, yys);
+ }
+#endif
+ }
+ if (yychar == YYEOF) goto yyaccept;
+ goto yyloop;
+ }
+ if (((yyn = yygindex[yym]) != 0) && (yyn += yystate) >= 0 &&
+ yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yystate)
+ yystate = yytable[yyn];
+ else
+ yystate = yydgoto[yym];
+#if YYDEBUG
+ if (yydebug)
+ {
+ fprintf(stderr, "%s[%d]: after reduction, ", YYDEBUGSTR, yydepth);
+#ifdef YYSTYPE_TOSTRING
+#if YYBTYACC
+ if (!yytrial)
+#endif /* YYBTYACC */
+ fprintf(stderr, "result is <%s>, ", YYSTYPE_TOSTRING(yystos[yystate], yyval));
+#endif
+ fprintf(stderr, "shifting from state %d to state %d\n", *yystack.s_mark, yystate);
+ }
+#endif
+ if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
+ *++yystack.s_mark = (YYINT) yystate;
+ *++yystack.l_mark = yyval;
+#if defined(YYLTYPE) || defined(YYLTYPE_IS_DECLARED)
+ *++yystack.p_mark = yyloc;
+#endif
+ goto yyloop;
+#if YYBTYACC
+
+ /* Reduction declares that this path is valid. Set yypath and do a full parse */
+yyvalid:
+ if (yypath) YYABORT;
+ while (yyps->save)
+ {
+ YYParseState *save = yyps->save;
+ yyps->save = save->save;
+ save->save = yypath;
+ yypath = save;
+ }
+#if YYDEBUG
+ if (yydebug)
+ fprintf(stderr, "%s[%d]: state %d, CONFLICT trial successful, backtracking to state %d, %d tokens\n",
+ YYDEBUGSTR, yydepth, yystate, yypath->state, (int)(yylvp - yylvals - yypath->lexeme));
+#endif
+ if (yyerrctx)
+ {
+ yyFreeState(yyerrctx);
+ yyerrctx = NULL;
+ }
+ yylvp = yylvals + yypath->lexeme;
+#if defined(YYLTYPE) || defined(YYLTYPE_IS_DECLARED)
+ yylpp = yylpsns + yypath->lexeme;
+#endif
+ yylexp = yylexemes + yypath->lexeme;
+ yychar = YYEMPTY;
+ yystack.s_mark = yystack.s_base + (yypath->yystack.s_mark - yypath->yystack.s_base);
+ memcpy (yystack.s_base, yypath->yystack.s_base, (size_t) (yystack.s_mark - yystack.s_base + 1) * sizeof(YYINT));
+ yystack.l_mark = yystack.l_base + (yypath->yystack.l_mark - yypath->yystack.l_base);
+ memcpy (yystack.l_base, yypath->yystack.l_base, (size_t) (yystack.l_mark - yystack.l_base + 1) * sizeof(YYSTYPE));
+#if defined(YYLTYPE) || defined(YYLTYPE_IS_DECLARED)
+ yystack.p_mark = yystack.p_base + (yypath->yystack.p_mark - yypath->yystack.p_base);
+ memcpy (yystack.p_base, yypath->yystack.p_base, (size_t) (yystack.p_mark - yystack.p_base + 1) * sizeof(YYLTYPE));
+#endif
+ yystate = yypath->state;
+ goto yyloop;
+#endif /* YYBTYACC */
+
+yyoverflow:
+ YYERROR_CALL("yacc stack overflow");
+#if YYBTYACC
+ goto yyabort_nomem;
+yyenomem:
+ YYERROR_CALL("memory exhausted");
+yyabort_nomem:
+#endif /* YYBTYACC */
+ yyresult = 2;
+ goto yyreturn;
+
+yyabort:
+ yyresult = 1;
+ goto yyreturn;
+
+yyaccept:
+#if YYBTYACC
+ if (yyps->save) goto yyvalid;
+#endif /* YYBTYACC */
+ yyresult = 0;
+
+yyreturn:
+#if defined(YYDESTRUCT_CALL)
+ if (yychar != YYEOF && yychar != YYEMPTY)
+#if defined(YYLTYPE) || defined(YYLTYPE_IS_DECLARED)
+ YYDESTRUCT_CALL("cleanup: discarding token", yychar, &yylval, &yylloc);
+#else
+ YYDESTRUCT_CALL("cleanup: discarding token", yychar, &yylval);
+#endif /* defined(YYLTYPE) || defined(YYLTYPE_IS_DECLARED) */
+
+ {
+ YYSTYPE *pv;
+#if defined(YYLTYPE) || defined(YYLTYPE_IS_DECLARED)
+ YYLTYPE *pp;
+
+ for (pv = yystack.l_base, pp = yystack.p_base; pv <= yystack.l_mark; ++pv, ++pp)
+ YYDESTRUCT_CALL("cleanup: discarding state",
+ yystos[*(yystack.s_base + (pv - yystack.l_base))], pv, pp);
+#else
+ for (pv = yystack.l_base; pv <= yystack.l_mark; ++pv)
+ YYDESTRUCT_CALL("cleanup: discarding state",
+ yystos[*(yystack.s_base + (pv - yystack.l_base))], pv);
+#endif /* defined(YYLTYPE) || defined(YYLTYPE_IS_DECLARED) */
+ }
+#endif /* defined(YYDESTRUCT_CALL) */
+
+#if YYBTYACC
+ if (yyerrctx)
+ {
+ yyFreeState(yyerrctx);
+ yyerrctx = NULL;
+ }
+ while (yyps)
+ {
+ YYParseState *save = yyps;
+ yyps = save->save;
+ save->save = NULL;
+ yyFreeState(save);
+ }
+ while (yypath)
+ {
+ YYParseState *save = yypath;
+ yypath = save->save;
+ save->save = NULL;
+ yyFreeState(save);
+ }
+#endif /* YYBTYACC */
+ yyfreestack(&yystack);
+ return (yyresult);
+}
diff --git a/src/parsdate.h b/src/parsdate.h
new file mode 100644
index 0000000..9853f50
--- /dev/null
+++ b/src/parsdate.h
@@ -0,0 +1,21 @@
+/* $LynxId: parsdate.h,v 1.2 2010/10/31 17:56:22 tom Exp $ */
+#ifndef PARSDATE_H
+#define PARSDATE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include <LYUtils.h>
+#define ARRAY_SIZE(array) ((int) (sizeof(array) / sizeof(array[0])))
+ typedef struct _TIMEINFO {
+ time_t time;
+ long usec;
+ long tzone;
+ } TIMEINFO;
+
+ extern time_t parsedate(char *p, TIMEINFO * now);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* PARSDATE_H */
diff --git a/src/parsdate.y b/src/parsdate.y
new file mode 100644
index 0000000..d665514
--- /dev/null
+++ b/src/parsdate.y
@@ -0,0 +1,991 @@
+%{
+
+#include <LYLeaks.h>
+
+/*
+ * $LynxId: parsdate.y,v 1.31 2021/06/08 23:01:28 tom Exp $
+ *
+ * This module is adapted and extended from tin, to use for LYmktime().
+ *
+ * Project : tin - a Usenet reader
+ * Module : parsedate.y
+ * Author : S. Bellovin, R. $alz, J. Berets, P. Eggert
+ * Created : 1990-08-01
+ * Updated : 2019-08-28 (by Thomas Dickey, for Lynx)
+ * Notes : This grammar has 8 shift/reduce conflicts.
+ *
+ * Originally written by Steven M. Bellovin <smb@research.att.com>
+ * while at the University of North Carolina at Chapel Hill.
+ * Later tweaked by a couple of people on Usenet. Completely
+ * overhauled by Rich $alz <rsalz@osf.org> and Jim Berets
+ * <jberets@bbn.com> in August, 1990.
+ *
+ * Further revised (removed obsolete constructs and cleaned up
+ * timezone names) in August, 1991, by Rich.
+ * Paul Eggert <eggert@twinsun.com> helped in September 1992.
+ * Roland Rosenfeld added MET DST code in April 1994.
+ *
+ * Revision : 1.13
+ * Copyright : This code is in the public domain and has no copyright.
+ */
+
+/* SUPPRESS 530 */ /* Empty body for statement */
+/* SUPPRESS 593 on yyerrlab */ /* Label was not used */
+/* SUPPRESS 593 on yynewstate */ /* Label was not used */
+/* SUPPRESS 595 on yypvt */ /* Automatic variable may be used before set */
+
+#undef alloca /* conflicting def may be set by yacc */
+#include <parsdate.h>
+
+/*
+** Get the number of elements in a fixed-size array, or a pointer just
+** past the end of it.
+*/
+#define ENDOF(array) (&array[ARRAY_SIZE(array)])
+
+#ifdef EBCDIC
+#define TO_ASCII(c) TOASCII(c)
+#define TO_LOCAL(c) FROMASCII(c)
+#else
+#define TO_ASCII(c) (c)
+#define TO_LOCAL(c) (c)
+#endif
+
+#define IS7BIT(x) ((unsigned) TO_ASCII(x) < 128)
+#define CTYPE(isXXXXX, c) (IS7BIT(c) && isXXXXX(((unsigned char)c)))
+
+typedef char *PD_STRING;
+
+extern int date_parse(void);
+
+#define yyparse date_parse
+#define yylex date_lex
+#define yyerror date_error
+
+#define BAD_TIME ((time_t)-1)
+#define isBadTime(n) ((n) != 0 && (((n) == BAD_TIME) || !((n) > 0)))
+
+ /* See the LeapYears table in Convert. */
+#define EPOCH 1970
+#define END_OF_TIME 2200
+
+ /* Constants for general time calculations. */
+#define DST_OFFSET 1
+#define SECSPERDAY (24L * 60L * 60L)
+ /* Readability for TABLE stuff. */
+#define HOUR(x) (x * 60)
+
+#define LPAREN '('
+#define RPAREN ')'
+
+/*
+** Daylight-savings mode: on, off, or not yet known.
+*/
+typedef enum _DSTMODE {
+ DSTon, DSToff, DSTmaybe
+} DSTMODE;
+
+/*
+** Meridian: am, pm, or 24-hour style.
+*/
+typedef enum _MERIDIAN {
+ MERam, MERpm, MER24
+} MERIDIAN;
+
+/*
+** Global variables. We could get rid of most of them by using a yacc
+** union, but this is more efficient. (This routine predates the
+** yacc %union construct.)
+*/
+static char *yyInput;
+static DSTMODE yyDSTmode;
+static int yyHaveDate;
+static int yyHaveRel;
+static int yyHaveTime;
+static time_t yyTimezone;
+static time_t yyDay;
+static time_t yyHour;
+static time_t yyMinutes;
+static time_t yyMonth;
+static time_t yySeconds;
+static time_t yyYear;
+static MERIDIAN yyMeridian;
+static time_t yyRelMonth;
+static time_t yyRelSeconds;
+
+static time_t ToSeconds(time_t, time_t, time_t, MERIDIAN);
+static time_t Convert(time_t, time_t, time_t, time_t, time_t, time_t,
+ MERIDIAN, DSTMODE);
+static time_t DSTcorrect(time_t, time_t);
+static time_t RelativeMonth(time_t, time_t);
+static int LookupWord(char *, int);
+static int date_lex(void);
+static int GetTimeInfo(TIMEINFO * Now);
+
+/*
+ * The 'date_error()' function is declared here to work around a defect in
+ * bison 1.22, which redefines 'const' further down in this file, making it
+ * impossible to put a prototype here, and the function later. We're using
+ * 'const' on the parameter to quiet gcc's -Wwrite-strings warning.
+ */
+/*ARGSUSED*/
+static void date_error(const char GCC_UNUSED *s)
+{
+ /*NOTREACHED */
+}
+
+%}
+
+%union {
+ time_t Number;
+ enum _MERIDIAN Meridian;
+}
+
+%token tDAY tDAYZONE tMERIDIAN tMONTH tMONTH_UNIT tSEC_UNIT tSNUMBER
+%token tUNUMBER tZONE tDST
+
+%type <Number> tDAYZONE tMONTH tMONTH_UNIT tSEC_UNIT
+%type <Number> tSNUMBER tUNUMBER tZONE numzone zone
+%type <Meridian> tMERIDIAN o_merid
+
+%%
+
+spec : /* NULL */
+ | spec item
+ ;
+
+item : time {
+ yyHaveTime++;
+#if defined(lint)
+ /* I am compulsive about lint natterings... */
+ if (yyHaveTime == -1) {
+ YYERROR;
+ }
+#endif /* defined(lint) */
+ }
+ | time zone {
+ yyHaveTime++;
+ yyTimezone = $2;
+ }
+ | date {
+ yyHaveDate++;
+ }
+ | both {
+ yyHaveDate++;
+ yyHaveTime++;
+ }
+ | both zone {
+ yyHaveDate++;
+ yyHaveTime++;
+ yyTimezone = $2;
+ }
+ | rel {
+ yyHaveRel = 1;
+ }
+ ;
+
+time : tUNUMBER o_merid {
+ if ($1 < 100) {
+ yyHour = $1;
+ yyMinutes = 0;
+ }
+ else {
+ yyHour = $1 / 100;
+ yyMinutes = $1 % 100;
+ }
+ yySeconds = 0;
+ yyMeridian = $2;
+ }
+ | tUNUMBER ':' tUNUMBER o_merid {
+ yyHour = $1;
+ yyMinutes = $3;
+ yySeconds = 0;
+ yyMeridian = $4;
+ }
+ | tUNUMBER ':' tUNUMBER numzone {
+ yyHour = $1;
+ yyMinutes = $3;
+ yyTimezone = $4;
+ yyMeridian = MER24;
+ yyDSTmode = DSToff;
+ }
+ | tUNUMBER ':' tUNUMBER ':' tUNUMBER o_merid {
+ yyHour = $1;
+ yyMinutes = $3;
+ yySeconds = $5;
+ yyMeridian = $6;
+ }
+ | tUNUMBER ':' tUNUMBER ':' tUNUMBER numzone {
+ yyHour = $1;
+ yyMinutes = $3;
+ yySeconds = $5;
+ yyTimezone = $6;
+ yyMeridian = MER24;
+ yyDSTmode = DSToff;
+ }
+ ;
+
+zone : tZONE {
+ $$ = $1;
+ yyDSTmode = DSToff;
+ }
+ | tDAYZONE {
+ $$ = $1;
+ yyDSTmode = DSTon;
+ }
+ | tDAYZONE tDST {
+ yyTimezone = $1;
+ yyDSTmode = DSTon;
+ }
+ | tZONE numzone {
+ /* Only allow "GMT+300" and "GMT-0800" */
+ if ($1 != 0) {
+ YYABORT;
+ }
+ $$ = $2;
+ yyDSTmode = DSToff;
+ }
+ | numzone {
+ $$ = $1;
+ yyDSTmode = DSToff;
+ }
+ ;
+
+numzone : tSNUMBER {
+ int i;
+
+ /* Unix and GMT and numeric timezones -- a little confusing. */
+ if ((int)$1 < 0) {
+ /* Don't work with negative modulus. */
+ $1 = -(int)$1;
+ if ($1 > 9999 || (i = (int) ($1 % 100)) >= 60) {
+ YYABORT;
+ }
+ $$ = ($1 / 100) * 60 + i;
+ }
+ else {
+ if ($1 > 9999 || (i = (int) ($1 % 100)) >= 60) {
+ YYABORT;
+ }
+ $$ = -(($1 / 100) * 60 + i);
+ }
+ }
+ ;
+
+date : tUNUMBER '/' tUNUMBER {
+ yyMonth = $1;
+ yyDay = $3;
+ }
+ | tUNUMBER '/' tUNUMBER '/' tUNUMBER {
+ if ($1 > 100) {
+ yyYear = $1;
+ yyMonth = $3;
+ yyDay = $5;
+ }
+ else {
+ yyMonth = $1;
+ yyDay = $3;
+ yyYear = $5;
+ }
+ }
+ | tMONTH tUNUMBER {
+ yyMonth = $1;
+ yyDay = $2;
+ }
+ | tMONTH tUNUMBER ',' tUNUMBER {
+ yyMonth = $1;
+ yyDay = $2;
+ yyYear = $4;
+ }
+ | tUNUMBER tMONTH {
+ yyDay = $1;
+ yyMonth = $2;
+ }
+ | tUNUMBER tMONTH tUNUMBER {
+ yyDay = $1;
+ yyMonth = $2;
+ yyYear = $3;
+ }
+ | tDAY ',' tUNUMBER tMONTH tUNUMBER {
+ yyDay = $3;
+ yyMonth = $4;
+ yyYear = $5;
+ }
+ | tDAY ',' tUNUMBER '-' tMONTH tSNUMBER {
+ yyDay = $3;
+ yyMonth = $5;
+ yyYear = -$6;
+ }
+ | tUNUMBER tSNUMBER tSNUMBER {
+ yyDay = $1;
+ yyMonth = -$2;
+ yyYear = -$3;
+ yyDSTmode = DSToff; /* assume midnight if no time given */
+ yyTimezone = 0; /* Lynx assumes GMT for this format */
+ }
+ ;
+
+both : tDAY tMONTH tUNUMBER tUNUMBER ':' tUNUMBER ':' tUNUMBER tUNUMBER {
+ yyMonth = $2;
+ yyDay = $3;
+ yyYear = $9;
+ yyHour = $4;
+ yyMinutes = $6;
+ yySeconds = $8;
+ }
+ ;
+
+rel : tSNUMBER tSEC_UNIT {
+ yyRelSeconds += $1 * $2;
+ }
+ | tUNUMBER tSEC_UNIT {
+ yyRelSeconds += $1 * $2;
+ }
+ | tSNUMBER tMONTH_UNIT {
+ yyRelMonth += $1 * $2;
+ }
+ | tUNUMBER tMONTH_UNIT {
+ yyRelMonth += $1 * $2;
+ }
+ ;
+
+o_merid : /* NULL */ {
+ $$ = MER24;
+ }
+ | tMERIDIAN {
+ $$ = $1;
+ }
+ ;
+
+%%
+
+
+/*
+** An entry in the lexical lookup table.
+*/
+/* *INDENT-OFF* */
+typedef struct _TABLE {
+ const char *name;
+ int type;
+ time_t value;
+} TABLE;
+
+/* Month and day table. */
+static const TABLE MonthDayTable[] = {
+ { "january", tMONTH, 1 },
+ { "february", tMONTH, 2 },
+ { "march", tMONTH, 3 },
+ { "april", tMONTH, 4 },
+ { "may", tMONTH, 5 },
+ { "june", tMONTH, 6 },
+ { "july", tMONTH, 7 },
+ { "august", tMONTH, 8 },
+ { "september", tMONTH, 9 },
+ { "october", tMONTH, 10 },
+ { "november", tMONTH, 11 },
+ { "december", tMONTH, 12 },
+ /* The value of the day isn't used... */
+ { "sunday", tDAY, 0 },
+ { "monday", tDAY, 0 },
+ { "tuesday", tDAY, 0 },
+ { "wednesday", tDAY, 0 },
+ { "thursday", tDAY, 0 },
+ { "friday", tDAY, 0 },
+ { "saturday", tDAY, 0 },
+};
+
+/* Time units table. */
+static const TABLE UnitsTable[] = {
+ { "year", tMONTH_UNIT, 12 },
+ { "month", tMONTH_UNIT, 1 },
+ { "week", tSEC_UNIT, 7 * 24 * 60 * 60 },
+ { "day", tSEC_UNIT, 1 * 24 * 60 * 60 },
+ { "hour", tSEC_UNIT, 60 * 60 },
+ { "minute", tSEC_UNIT, 60 },
+ { "min", tSEC_UNIT, 60 },
+ { "second", tSEC_UNIT, 1 },
+ { "sec", tSEC_UNIT, 1 },
+};
+
+/* Timezone table. */
+static const TABLE TimezoneTable[] = {
+ { "gmt", tZONE, HOUR( 0) }, /* Greenwich Mean */
+ { "ut", tZONE, HOUR( 0) }, /* Universal */
+ { "utc", tZONE, HOUR( 0) }, /* Universal Coordinated */
+ { "cut", tZONE, HOUR( 0) }, /* Coordinated Universal */
+ { "z", tZONE, HOUR( 0) }, /* Greenwich Mean */
+ { "wet", tZONE, HOUR( 0) }, /* Western European */
+ { "bst", tDAYZONE, HOUR( 0) }, /* British Summer */
+ { "nst", tZONE, HOUR(3)+30 }, /* Newfoundland Standard */
+ { "ndt", tDAYZONE, HOUR(3)+30 }, /* Newfoundland Daylight */
+ { "ast", tZONE, HOUR( 4) }, /* Atlantic Standard */
+ { "adt", tDAYZONE, HOUR( 4) }, /* Atlantic Daylight */
+ { "est", tZONE, HOUR( 5) }, /* Eastern Standard */
+ { "edt", tDAYZONE, HOUR( 5) }, /* Eastern Daylight */
+ { "cst", tZONE, HOUR( 6) }, /* Central Standard */
+ { "cdt", tDAYZONE, HOUR( 6) }, /* Central Daylight */
+ { "mst", tZONE, HOUR( 7) }, /* Mountain Standard */
+ { "mdt", tDAYZONE, HOUR( 7) }, /* Mountain Daylight */
+ { "pst", tZONE, HOUR( 8) }, /* Pacific Standard */
+ { "pdt", tDAYZONE, HOUR( 8) }, /* Pacific Daylight */
+ { "yst", tZONE, HOUR( 9) }, /* Yukon Standard */
+ { "ydt", tDAYZONE, HOUR( 9) }, /* Yukon Daylight */
+ { "akst", tZONE, HOUR( 9) }, /* Alaska Standard */
+ { "akdt", tDAYZONE, HOUR( 9) }, /* Alaska Daylight */
+ { "hst", tZONE, HOUR(10) }, /* Hawaii Standard */
+ { "hast", tZONE, HOUR(10) }, /* Hawaii-Aleutian Standard */
+ { "hadt", tDAYZONE, HOUR(10) }, /* Hawaii-Aleutian Daylight */
+ { "ces", tDAYZONE, -HOUR(1) }, /* Central European Summer */
+ { "cest", tDAYZONE, -HOUR(1) }, /* Central European Summer */
+ { "mez", tZONE, -HOUR(1) }, /* Middle European */
+ { "mezt", tDAYZONE, -HOUR(1) }, /* Middle European Summer */
+ { "cet", tZONE, -HOUR(1) }, /* Central European */
+ { "met", tZONE, -HOUR(1) }, /* Middle European */
+/* Additional aliases for MET / MET DST *************************************/
+ { "mez", tZONE, -HOUR(1) }, /* Middle European */
+ { "mewt", tZONE, -HOUR(1) }, /* Middle European Winter */
+ { "mest", tDAYZONE, -HOUR(1) }, /* Middle European Summer */
+ { "mes", tDAYZONE, -HOUR(1) }, /* Middle European Summer */
+ { "mesz", tDAYZONE, -HOUR(1) }, /* Middle European Summer */
+ { "msz", tDAYZONE, -HOUR(1) }, /* Middle European Summer */
+ { "metdst", tDAYZONE, -HOUR(1) }, /* Middle European Summer */
+/****************************************************************************/
+ { "eet", tZONE, -HOUR(2) }, /* Eastern Europe */
+ { "msk", tZONE, -HOUR(3) }, /* Moscow Winter */
+ { "msd", tDAYZONE, -HOUR(3) }, /* Moscow Summer */
+ { "wast", tZONE, -HOUR(8) }, /* West Australian Standard */
+ { "wadt", tDAYZONE, -HOUR(8) }, /* West Australian Daylight */
+ { "hkt", tZONE, -HOUR(8) }, /* Hong Kong */
+ { "cct", tZONE, -HOUR(8) }, /* China Coast */
+ { "jst", tZONE, -HOUR(9) }, /* Japan Standard */
+ { "kst", tZONE, -HOUR(9) }, /* Korean Standard */
+ { "kdt", tZONE, -HOUR(9) }, /* Korean Daylight */
+ { "cast", tZONE, -(HOUR(9)+30) }, /* Central Australian Standard */
+ { "cadt", tDAYZONE, -(HOUR(9)+30) }, /* Central Australian Daylight */
+ { "east", tZONE, -HOUR(10) }, /* Eastern Australian Standard */
+ { "eadt", tDAYZONE, -HOUR(10) }, /* Eastern Australian Daylight */
+ { "nzst", tZONE, -HOUR(12) }, /* New Zealand Standard */
+ { "nzdt", tDAYZONE, -HOUR(12) }, /* New Zealand Daylight */
+
+ /* For completeness we include the following entries. */
+#if 0
+
+ /* Duplicate names. Either they conflict with a zone listed above
+ * (which is either more likely to be seen or just been in circulation
+ * longer), or they conflict with another zone in this section and
+ * we could not reasonably choose one over the other. */
+ { "fst", tZONE, HOUR( 2) }, /* Fernando De Noronha Standard */
+ { "fdt", tDAYZONE, HOUR( 2) }, /* Fernando De Noronha Daylight */
+ { "bst", tZONE, HOUR( 3) }, /* Brazil Standard */
+ { "est", tZONE, HOUR( 3) }, /* Eastern Standard (Brazil) */
+ { "edt", tDAYZONE, HOUR( 3) }, /* Eastern Daylight (Brazil) */
+ { "wst", tZONE, HOUR( 4) }, /* Western Standard (Brazil) */
+ { "wdt", tDAYZONE, HOUR( 4) }, /* Western Daylight (Brazil) */
+ { "cst", tZONE, HOUR( 5) }, /* Chile Standard */
+ { "cdt", tDAYZONE, HOUR( 5) }, /* Chile Daylight */
+ { "ast", tZONE, HOUR( 5) }, /* Acre Standard */
+ { "adt", tDAYZONE, HOUR( 5) }, /* Acre Daylight */
+ { "cst", tZONE, HOUR( 5) }, /* Cuba Standard */
+ { "cdt", tDAYZONE, HOUR( 5) }, /* Cuba Daylight */
+ { "est", tZONE, HOUR( 6) }, /* Easter Island Standard */
+ { "edt", tDAYZONE, HOUR( 6) }, /* Easter Island Daylight */
+ { "sst", tZONE, HOUR(11) }, /* Samoa Standard */
+ { "ist", tZONE, -HOUR(2) }, /* Israel Standard */
+ { "idt", tDAYZONE, -HOUR(2) }, /* Israel Daylight */
+ { "idt", tDAYZONE, -(HOUR(3)+30) }, /* Iran Daylight */
+ { "ist", tZONE, -(HOUR(3)+30) }, /* Iran Standard */
+ { "cst", tZONE, -HOUR(8) }, /* China Standard */
+ { "cdt", tDAYZONE, -HOUR(8) }, /* China Daylight */
+ { "sst", tZONE, -HOUR(8) }, /* Singapore Standard */
+
+ /* Dubious (e.g., not in Olson's TIMEZONE package) or obsolete. */
+ { "gst", tZONE, HOUR( 3) }, /* Greenland Standard */
+ { "wat", tZONE, -HOUR(1) }, /* West Africa */
+ { "at", tZONE, HOUR( 2) }, /* Azores */
+ { "gst", tZONE, -HOUR(10) }, /* Guam Standard */
+ { "nft", tZONE, HOUR(3)+30 }, /* Newfoundland */
+ { "idlw", tZONE, HOUR(12) }, /* International Date Line West */
+ { "mewt", tZONE, -HOUR(1) }, /* Middle European Winter */
+ { "mest", tDAYZONE, -HOUR(1) }, /* Middle European Summer */
+ { "swt", tZONE, -HOUR(1) }, /* Swedish Winter */
+ { "sst", tDAYZONE, -HOUR(1) }, /* Swedish Summer */
+ { "fwt", tZONE, -HOUR(1) }, /* French Winter */
+ { "fst", tDAYZONE, -HOUR(1) }, /* French Summer */
+ { "bt", tZONE, -HOUR(3) }, /* Baghdad */
+ { "it", tZONE, -(HOUR(3)+30) }, /* Iran */
+ { "zp4", tZONE, -HOUR(4) }, /* USSR Zone 3 */
+ { "zp5", tZONE, -HOUR(5) }, /* USSR Zone 4 */
+ { "ist", tZONE, -(HOUR(5)+30) }, /* Indian Standard */
+ { "zp6", tZONE, -HOUR(6) }, /* USSR Zone 5 */
+ { "nst", tZONE, -HOUR(7) }, /* North Sumatra */
+ { "sst", tZONE, -HOUR(7) }, /* South Sumatra */
+ { "jt", tZONE, -(HOUR(7)+30) }, /* Java (3pm in Cronusland!) */
+ { "nzt", tZONE, -HOUR(12) }, /* New Zealand */
+ { "idle", tZONE, -HOUR(12) }, /* International Date Line East */
+ { "cat", tZONE, HOUR(10) }, /* -- expired 1967 */
+ { "nt", tZONE, HOUR(11) }, /* -- expired 1967 */
+ { "ahst", tZONE, HOUR(10) }, /* -- expired 1983 */
+ { "hdt", tDAYZONE, HOUR(10) }, /* -- expired 1986 */
+#endif /* 0 */
+};
+/* *INDENT-ON* */
+
+static time_t ToSeconds(time_t Hours, time_t Minutes, time_t Seconds, MERIDIAN Meridian)
+{
+ if (isBadTime(Minutes) || Minutes > 59 || isBadTime(Seconds) || Seconds > 61)
+ return BAD_TIME;
+ if (Meridian == MER24) {
+ if (isBadTime(Hours) || Hours > 23)
+ return BAD_TIME;
+ } else {
+ if (Hours < 1 || Hours > 12)
+ return BAD_TIME;
+ if (Hours == 12)
+ Hours = 0;
+ if (Meridian == MERpm)
+ Hours += 12;
+ }
+ return (Hours * 60L + Minutes) * 60L + Seconds;
+}
+
+static time_t Convert(time_t Month, time_t Day, time_t Year, time_t Hours,
+ time_t Minutes, time_t Seconds, MERIDIAN Meridian,
+ DSTMODE dst)
+{
+ static const int DaysNormal[13] =
+ {
+ 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
+ };
+ static const int DaysLeap[13] =
+ {
+ 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
+ };
+ /* *INDENT-OFF* */
+ static const int LeapYears[] =
+ {
+ 1972, 1976, 1980, 1984, 1988, 1992, 1996,
+ 2000, 2004, 2008, 2012, 2016, 2020, 2024, 2028, 2032, 2036,
+ 2040, 2044, 2048, 2052, 2056, 2060, 2064, 2068, 2072, 2076,
+ 2080, 2084, 2088, 2092, 2096, /***/ 2104, 2108, 2112, 2116,
+ 2120, 2124, 2128, 2132, 2136, 2140, 2144, 2148, 2152, 2156,
+ 2160, 2164, 2168, 2172, 2176, 2180, 2184, 2188, 2192, 2196,
+ };
+ /* *INDENT-ON* */
+
+ const int *yp;
+ const int *mp;
+ int i;
+ time_t Julian;
+ time_t tod;
+
+ if (isBadTime(Year))
+ Year = -Year;
+ if (Year < 70)
+ Year += 2000;
+ if (Year < 100)
+ Year += 1900;
+ if (Year < EPOCH)
+ Year += 100;
+ for (mp = DaysNormal, yp = LeapYears; yp < ENDOF(LeapYears); yp++)
+ if (Year == *yp) {
+ mp = DaysLeap;
+ break;
+ }
+ if (Year < EPOCH || Year > END_OF_TIME
+ || Month < 1 || Month > 12
+ /* NOSTRICT */
+ /* conversion from long may lose accuracy */
+ || Day < 1 || Day > mp[(int) Month]) {
+ return BAD_TIME;
+ }
+
+ Julian = Day - 1 + (Year - EPOCH) * 365;
+ for (yp = LeapYears; yp < ENDOF(LeapYears); yp++, Julian++) {
+ if (Year <= *yp)
+ break;
+ }
+ for (i = 1; i < Month; i++)
+ Julian += *++mp;
+ Julian *= SECSPERDAY;
+ Julian += yyTimezone * 60L;
+ tod = ToSeconds(Hours, Minutes, Seconds, Meridian);
+ if (isBadTime(tod)) {
+ return BAD_TIME;
+ }
+ Julian += tod;
+ tod = Julian;
+ if (dst == DSTon) {
+ Julian -= DST_OFFSET * 60 * 60;
+ } else if (dst == DSTmaybe) {
+ struct tm *tm = localtime(&tod);
+
+ if (tm != NULL) {
+ if (tm->tm_isdst)
+ Julian -= DST_OFFSET * 60 * 60;
+ } else {
+ Julian = BAD_TIME;
+ }
+ }
+ return Julian;
+}
+
+static time_t DSTcorrect(time_t Start, time_t Future)
+{
+ struct tm *tm;
+ time_t StartDay;
+ time_t FutureDay;
+
+ if ((tm = localtime(&Start)) == NULL)
+ return BAD_TIME;
+ StartDay = (tm->tm_hour + 1) % 24;
+
+ if ((tm = localtime(&Future)) == NULL)
+ return BAD_TIME;
+ FutureDay = (tm->tm_hour + 1) % 24;
+
+ return (Future - Start) + (StartDay - FutureDay) * DST_OFFSET * 60 * 60;
+}
+
+static time_t RelativeMonth(time_t Start, time_t RelMonth)
+{
+ struct tm *tm;
+ time_t Month;
+ time_t Year;
+
+ if ((tm = localtime(&Start)) == NULL)
+ return BAD_TIME;
+
+ Month = 12 * tm->tm_year + tm->tm_mon + RelMonth;
+ Year = Month / 12 + 1900;
+ Month = Month % 12 + 1;
+ return DSTcorrect(Start,
+ Convert(Month, (time_t) tm->tm_mday, Year,
+ (time_t) tm->tm_hour, (time_t) tm->tm_min,
+ (time_t) tm->tm_sec,
+ MER24, DSTmaybe));
+}
+
+static int LookupWord(char *buff,
+ int length)
+{
+ char *p;
+ const char *q;
+ const TABLE *tp;
+ int c;
+
+ p = buff;
+ c = p[0];
+
+ /* See if we have an abbreviation for a month. */
+ if (length == 3 || (length == 4 && p[3] == '.')) {
+ for (tp = MonthDayTable; tp < ENDOF(MonthDayTable); tp++) {
+ q = tp->name;
+ if (c == q[0] && p[1] == q[1] && p[2] == q[2]) {
+ yylval.Number = tp->value;
+ return tp->type;
+ }
+ }
+ } else {
+ for (tp = MonthDayTable; tp < ENDOF(MonthDayTable); tp++) {
+ if (c == tp->name[0] && strcmp(p, tp->name) == 0) {
+ yylval.Number = tp->value;
+ return tp->type;
+ }
+ }
+ }
+
+ /* Try for a timezone. */
+ for (tp = TimezoneTable; tp < ENDOF(TimezoneTable); tp++) {
+ if (c == tp->name[0] && p[1] == tp->name[1]
+ && strcmp(p, tp->name) == 0) {
+ yylval.Number = tp->value;
+ return tp->type;
+ }
+ }
+
+ if (strcmp(buff, "dst") == 0)
+ return tDST;
+
+ /* Try the units table. */
+ for (tp = UnitsTable; tp < ENDOF(UnitsTable); tp++) {
+ if (c == tp->name[0] && strcmp(p, tp->name) == 0) {
+ yylval.Number = tp->value;
+ return tp->type;
+ }
+ }
+
+ /* Strip off any plural and try the units table again. */
+ if (--length > 0 && p[length] == 's') {
+ p[length] = '\0';
+ for (tp = UnitsTable; tp < ENDOF(UnitsTable); tp++) {
+ if (c == tp->name[0] && strcmp(p, tp->name) == 0) {
+ p[length] = 's';
+ yylval.Number = tp->value;
+ return tp->type;
+ }
+ }
+ p[length] = 's';
+ }
+ length++;
+
+ /* Drop out any periods. */
+ for (p = buff, q = (PD_STRING) buff; *q; q++) {
+ if (*q != '.')
+ *p++ = *q;
+ }
+ *p = '\0';
+
+ /* Try the meridians. */
+ if (buff[1] == 'm' && buff[2] == '\0') {
+ if (buff[0] == 'a') {
+ yylval.Meridian = MERam;
+ return tMERIDIAN;
+ }
+ if (buff[0] == 'p') {
+ yylval.Meridian = MERpm;
+ return tMERIDIAN;
+ }
+ }
+
+ /* If we saw any periods, try the timezones again. */
+ if (p - buff != length) {
+ c = buff[0];
+ for (p = buff, tp = TimezoneTable; tp < ENDOF(TimezoneTable); tp++) {
+ if (c == tp->name[0] && p[1] == tp->name[1]
+ && strcmp(p, tp->name) == 0) {
+ yylval.Number = tp->value;
+ return tp->type;
+ }
+ }
+ }
+
+ /* Unknown word -- assume GMT timezone. */
+ yylval.Number = 0;
+ return tZONE;
+}
+
+/*
+ * This returns characters as-is (the ones that are not part of some token),
+ * and codes greater than 256 (the token values).
+ *
+ * yacc generates tables that may use the character value. In particular,
+ * byacc's yycheck[] table contains integer values for the expected codes from
+ * this function, which (unless byacc is run locally) are ASCII codes.
+ *
+ * The TO_LOCAL() function assumes its input is in ASCII, and the output is
+ * whatever native encoding is used on the machine, e.g., EBCDIC.
+ *
+ * The TO_ASCII() function is the inverse of TO_LOCAL().
+ */
+static int date_lex(void)
+{
+ int c;
+ char *p;
+ char buff[20];
+ int sign;
+ int i;
+ int nesting;
+
+ /* Get first character after the whitespace. */
+ for (;;) {
+ while (CTYPE(isspace, *yyInput))
+ yyInput++;
+ c = *yyInput;
+
+ /* Ignore RFC 822 comments, typically time zone names. */
+ if (c != LPAREN)
+ break;
+ for (nesting = 1;
+ (c = *++yyInput) != RPAREN || --nesting;
+ ) {
+ if (c == LPAREN) {
+ nesting++;
+ } else if (!IS7BIT(c) || c == '\0' || c == '\r'
+ || (c == '\\'
+ && ((c = *++yyInput) == '\0'
+ || !IS7BIT(c)))) {
+ /* Lexical error: bad comment. */
+ return '?';
+ }
+ }
+ yyInput++;
+ }
+
+ /* A number? */
+ if (CTYPE(isdigit, c) || c == '-' || c == '+') {
+ if (c == '-' || c == '+') {
+ sign = c == '-' ? -1 : 1;
+ yyInput++;
+ if (!CTYPE(isdigit, *yyInput)) {
+ /* Return the isolated plus or minus sign. */
+ --yyInput;
+ return *yyInput++;
+ }
+ } else {
+ sign = 0;
+ }
+ for (p = buff;
+ (c = *yyInput++) != '\0' && CTYPE(isdigit, c);
+ ) {
+ if (p < &buff[sizeof buff - 1])
+ *p++ = (char) c;
+ }
+ *p = '\0';
+ i = atoi(buff);
+
+ yyInput--;
+ yylval.Number = sign < 0 ? -i : i;
+ return sign ? tSNUMBER : tUNUMBER;
+ }
+
+ /* A word? */
+ if (CTYPE(isalpha, c)) {
+ for (p = buff;
+ (c = *yyInput++) == '.' || CTYPE(isalpha, c);
+ ) {
+ if (p < &buff[sizeof buff - 1])
+ *p++ = (char) (CTYPE(isupper, c) ? tolower(c) : c);
+ }
+ *p = '\0';
+ yyInput--;
+ return LookupWord(buff, (int) (p - buff));
+ }
+
+ return *yyInput++;
+}
+
+static int GetTimeInfo(TIMEINFO * Now)
+{
+ static time_t LastTime;
+ static long LastTzone;
+ struct tm *tm;
+
+#if defined(HAVE_GETTIMEOFDAY)
+ struct timeval tv;
+#endif /* defined(HAVE_GETTIMEOFDAY) */
+#if defined(DONT_HAVE_TM_GMTOFF)
+ struct tm local;
+ struct tm gmt;
+#endif /* !defined(DONT_HAVE_TM_GMTOFF) */
+
+ /* Get the basic time. */
+ memset(Now, 0, sizeof(TIMEINFO));
+#if defined(HAVE_GETTIMEOFDAY)
+ if (gettimeofday(&tv, (struct timezone *) NULL) == -1)
+ return -1;
+ Now->time = tv.tv_sec;
+ Now->usec = tv.tv_usec;
+#else
+ /* Can't check for -1 since that might be a time, I guess. */
+ (void) time(&Now->time);
+ Now->usec = 0;
+#endif /* defined(HAVE_GETTIMEOFDAY) */
+
+ /* Now get the timezone if it's been an hour since the last time. */
+ if (Now->time - LastTime > 60 * 60) {
+ LastTime = Now->time;
+ if ((tm = localtime(&Now->time)) == NULL)
+ return -1;
+#if defined(DONT_HAVE_TM_GMTOFF)
+ /* To get the timezone, compare localtime with GMT. */
+ local = *tm;
+ if ((tm = gmtime(&Now->time)) == NULL)
+ return -1;
+ gmt = *tm;
+
+ /* Assume we are never more than 24 hours away. */
+ LastTzone = gmt.tm_yday - local.tm_yday;
+ if (LastTzone > 1)
+ LastTzone = -24;
+ else if (LastTzone < -1)
+ LastTzone = 24;
+ else
+ LastTzone *= 24;
+
+ /* Scale in the hours and minutes; ignore seconds. */
+ LastTzone += gmt.tm_hour - local.tm_hour;
+ LastTzone *= 60;
+ LastTzone += gmt.tm_min - local.tm_min;
+#else
+ LastTzone = (0 - tm->tm_gmtoff) / 60;
+#endif /* defined(DONT_HAVE_TM_GMTOFF) */
+ }
+ Now->tzone = LastTzone;
+ return 0;
+}
+
+#if defined(YYBYACC) && defined(YYPURE) && defined(LY_FIND_LEAKS)
+#undef YYPURE
+#define YYPURE 1
+static void yyfreestack(YYSTACKDATA *);
+static void parsedate_leaks(void)
+{
+ yyfreestack(&yystack);
+}
+#endif
+
+time_t parsedate(char *p,
+ TIMEINFO * now)
+{
+ struct tm *tm;
+ TIMEINFO ti;
+ time_t Start;
+
+#if defined(YYBYACC) && defined(YYPURE) && defined(LY_FIND_LEAKS)
+ static int initialized;
+
+ if (!initialized) {
+ initialized = 1;
+ atexit(parsedate_leaks);
+ }
+#endif
+
+ yyInput = p;
+ if (now == NULL) {
+ now = &ti;
+ (void) GetTimeInfo(&ti);
+ }
+
+ if ((tm = localtime(&now->time)) == NULL)
+ return BAD_TIME;
+
+ /* *INDENT-EQLS* */
+ yyYear = tm->tm_year + 1900;
+ yyMonth = tm->tm_mon + 1;
+ yyDay = tm->tm_mday;
+ yyTimezone = now->tzone;
+ if (tm->tm_isdst) /* Correct timezone offset for DST */
+ yyTimezone += DST_OFFSET * 60;
+ yyDSTmode = DSTmaybe;
+ yyHour = 0;
+ yyMinutes = 0;
+ yySeconds = 0;
+ yyMeridian = MER24;
+ yyRelSeconds = 0;
+ yyRelMonth = 0;
+ yyHaveDate = 0;
+ yyHaveRel = 0;
+ yyHaveTime = 0;
+
+ if (date_parse() || yyHaveTime > 1 || yyHaveDate > 1)
+ return BAD_TIME;
+
+ if (yyHaveDate || yyHaveTime) {
+ Start = Convert(yyMonth, yyDay, yyYear, yyHour, yyMinutes, yySeconds,
+ yyMeridian, yyDSTmode);
+ if (isBadTime(Start))
+ return BAD_TIME;
+ } else {
+ Start = now->time;
+ if (!yyHaveRel)
+ Start -= (tm->tm_hour * 60L + tm->tm_min) * 60L + tm->tm_sec;
+ }
+
+ Start += yyRelSeconds;
+ if (yyRelMonth)
+ Start += RelativeMonth(Start, yyRelMonth);
+
+ /* Have to do *something* with a legitimate -1 so it's distinguishable
+ * from the error return value. (Alternately could set errno on error.) */
+ return (Start == BAD_TIME) ? 0 : Start;
+}
diff --git a/src/socketshr_tcp.opt b/src/socketshr_tcp.opt
new file mode 100644
index 0000000..f6e3131
--- /dev/null
+++ b/src/socketshr_tcp.opt
@@ -0,0 +1 @@
+socketshr/share
diff --git a/src/strstr.c b/src/strstr.c
new file mode 100644
index 0000000..7dcd7d5
--- /dev/null
+++ b/src/strstr.c
@@ -0,0 +1,60 @@
+/*
+ * strstr.c -- return the offset of one string within another.
+ *
+ * Copyright (C) 1997 Free Software Foundation, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2, or (at your option) any later
+ * version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc., 59
+ * Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+/* Written by Philippe De Muyter <phdm@macqel.be>. */
+
+/*
+ * NAME
+ *
+ * strstr -- locate first occurrence of a substring
+ *
+ * SYNOPSIS
+ *
+ * char *strstr (char *s1, char *s2)
+ *
+ * DESCRIPTION
+ *
+ * Locates the first occurrence in the string pointed to by S1 of the string
+ * pointed to by S2. Returns a pointer to the substring found, or a NULL
+ * pointer if not found. If S2 points to a string with zero length, the
+ * function returns S1.
+ *
+ * BUGS
+ *
+ */
+
+char *strstr(char *buf, char *sub)
+{
+ register char *bp;
+ register char *sp;
+
+ if (!*sub)
+ return buf;
+ while (*buf) {
+ bp = buf;
+ sp = sub;
+ do {
+ if (!*sp)
+ return buf;
+ } while (*bp++ == *sp++);
+ buf += 1;
+ }
+ return 0;
+}
diff --git a/src/structdump.h b/src/structdump.h
new file mode 100644
index 0000000..78e25db
--- /dev/null
+++ b/src/structdump.h
@@ -0,0 +1,164 @@
+/*
+ *
+ * Some macros to dump out formatted struct's via the trace file. -KED
+ *
+ */
+#ifndef STRUCTDUMP_H
+#define STRUCTDUMP_H
+
+/* usage: DUMPSTRUCT_LINK(link_ptr, "message"); */
+#define DUMPSTRUCT_LINK(L,X) \
+if ((L)) { \
+CTRACE((tfp, "\n" \
+ "KED: link_ptr=%p sizeof=%d ["X"]\n" \
+ "link struct {\n" \
+ " *lname=%p\n" \
+ " lname=|%s|\n" \
+ " *target=%p\n" \
+ " target=|%s|\n" \
+ " *hightext=%p\n" \
+ " hightext=|%s|\n" \
+ " *hightext2=%p\n" \
+ " hightext2=|%s|\n" \
+ " hightext2_offset=%d\n" \
+ " inUnderline=%1x\n" \
+ " lx=%d\n" \
+ " ly=%d\n" \
+ " type=%d\n" \
+ " anchor_number=%d\n" \
+ " anchor_line_num=%d\n" \
+ " *form=%p\n" \
+ "}\n", \
+ (L), sizeof(*((L))), \
+ (L)->lname, (L)->lname, (L)->target, (L)->target, \
+ (L)->l_hightext, (L)->l_hightext, \
+ (L)->l_hightext2, (L)->l_hightext2, \
+ (L)->l_hightext2_offset, \
+ (L)->inUnderline, (L)->lx, (L)->ly, \
+ (L)->type, (L)->anchor_number, (L)->anchor_line_num, (L)->form)); \
+}else{ \
+CTRACE((tfp, "\n" \
+ "KED: link_ptr=0x00000000 (NULL) ["X"]\n")); \
+} \
+CTRACE_FLUSH(tfp);
+
+/* usage: DUMPSTRUCT_ANCHOR(anchor_ptr, "message"); */
+#define DUMPSTRUCT_ANCHOR(A,X) \
+if ((A)) { \
+CTRACE((tfp, "\n" \
+ "KED: anchor_ptr=%p sizeof=%lu ["X"]\n" \
+ "TextAnchor struct {\n" \
+ " *next=%p\n" \
+ " *prev=%p\n" \
+ " number=%d\n" \
+ " line_pos=%d\n" \
+ " extent=%d\n" \
+ " line_num=%d\n" \
+ " link_type=%d\n" \
+ " *input_field=%p\n" \
+ " input_field=|%s|\n" \
+ " show_anchor=%1x\n" \
+ " inUnderline=%1x\n" \
+ " expansion_anch=%1x\n" \
+ " *anchor=%p\n" \
+ "}\n", \
+ (A), (unsigned long) sizeof(*((A))), \
+ (A)->next, (A)->prev, \
+ (A)->number, (A)->line_pos, \
+ (A)->extent, (A)->line_num, \
+ (A)->link_type, \
+ (A)->input_field, \
+ (A)->input_field ? NonNull((A)->input_field->name) : "", \
+ (A)->show_anchor, \
+ (A)->inUnderline, (A)->expansion_anch, (A)->anchor)); \
+}else{ \
+CTRACE((tfp, "\n" \
+ "KED: anchor_ptr=0x00000000 (NULL) ["X"]\n")); \
+} \
+CTRACE_FLUSH(tfp);
+
+/* usage: DUMPSTRUCT_FORM(forminfo_ptr, "message"); */
+#define DUMPSTRUCT_FORMINFO(F,X) \
+if ((F)) { \
+CTRACE((tfp, "\n" \
+ "KED: forminfo_ptr=%p sizeof=%lu ["X"]\n" \
+ "FormInfo struct {\n" \
+ " *name=%p\n" \
+ " name=|%s|\n" \
+ " number=%d\n" \
+ " type=%d\n" \
+ " *value=%p\n" \
+ " value=|%s|\n" \
+ " *orig_value=%p\n" \
+ " orig_value=|%s|\n" \
+ " size=%d\n" \
+ " maxlength=%lu\n" \
+ " group=%d\n" \
+ " num_value=%d\n" \
+ " hrange=%d\n" \
+ " lrange=%d\n" \
+ " *select_list=%p\n" \
+ " submit_action=|%s|\n" \
+ " submit_method=%d\n" \
+ " submit_enctype=|%s|\n" \
+ " submit_title=|%s|\n" \
+ " no_cache=%1x\n" \
+ " cp_submit_value=|%s|\n" \
+ "orig_submit_value=|%s|\n" \
+ " size_l=%d\n" \
+ " disabled=%d\n" \
+ " readonly=%d\n" \
+ " name_cs=%d\n" \
+ " value_cs=%d\n" \
+ " accept_cs=|%s|\n" \
+ "}\n", \
+ (F), (unsigned long) sizeof(*((F))), \
+ (F)->name, NonNull((F)->name), \
+ (F)->number, (F)->type, \
+ (F)->value, NonNull((F)->value), \
+ (F)->orig_value, NonNull((F)->orig_value), \
+ (F)->size, (unsigned long) (F)->maxlength, \
+ (F)->group, (F)->num_value, \
+ (F)->hrange, (F)->lrange, (F)->select_list, \
+ NonNull((F)->submit_action), \
+ (F)->submit_method, \
+ NonNull((F)->submit_enctype), \
+ NonNull((F)->submit_title), \
+ (F)->no_cache, \
+ NonNull((F)->cp_submit_value), \
+ NonNull((F)->orig_submit_value), \
+ (F)->size_l, (F)->disabled, (F)->readonly, (F)->name_cs, (F)->value_cs, \
+ NonNull((F)->accept_cs))); \
+} else { \
+CTRACE((tfp, "\n" \
+ "KED: forminfo_ptr=0x00000000 (NULL) ["X"]\n")); \
+} \
+CTRACE_FLUSH(tfp);
+
+/* usage: DUMPSTRUCT_LINE(htline_ptr, "message"); */
+#define DUMPSTRUCT_LINE(L,X) \
+if ((L)) { \
+CTRACE((tfp, "\n" \
+ "KED: htline_ptr=%p sizeof=%d ["X"]\n" \
+ "HTLine struct {\n" \
+ " *next=%p\n" \
+ " *prev=%p\n" \
+ " offset=%d\n" \
+ " size=%d\n" \
+ " split_after=%1x\n" \
+ " bullet=%1x\n" \
+ "expansion_line=%1x\n" \
+ "w/o U_C_S def\n" \
+ " data[]=%p\n" \
+ " data=|%s|\n" \
+ "}\n", \
+ (L), sizeof(*((L))), \
+ (L)->next, (L)->prev, (L)->offset, (L)->size, (L)->split_after, \
+ (L)->bullet, (L)->expansion_line, (L)->data, (L)->data)); \
+}else{ \
+CTRACE((tfp, "\n" \
+ "KED: htline_ptr=0x00000000 (NULL) ["X"]\n")); \
+} \
+CTRACE_FLUSH(tfp);
+
+#endif /* STRUCTDUMP_H */
diff --git a/src/tcpipolb.opt b/src/tcpipolb.opt
new file mode 100644
index 0000000..9c87cc8
--- /dev/null
+++ b/src/tcpipolb.opt
@@ -0,0 +1 @@
+tcpip$library:tcpip$lib/library
diff --git a/src/tcpipshr.opt b/src/tcpipshr.opt
new file mode 100644
index 0000000..729be9f
--- /dev/null
+++ b/src/tcpipshr.opt
@@ -0,0 +1 @@
+tcpip$ipc_shr/share
diff --git a/src/tcpwareolb.opt b/src/tcpwareolb.opt
new file mode 100644
index 0000000..045d770
--- /dev/null
+++ b/src/tcpwareolb.opt
@@ -0,0 +1 @@
+tcpware:ucx$ipc/library
diff --git a/src/tcpwareshr.opt b/src/tcpwareshr.opt
new file mode 100644
index 0000000..e34f846
--- /dev/null
+++ b/src/tcpwareshr.opt
@@ -0,0 +1 @@
+tcpware:ucx$ipc_shr.exe/share
diff --git a/src/tidy_tls.c b/src/tidy_tls.c
new file mode 100644
index 0000000..b0288fb
--- /dev/null
+++ b/src/tidy_tls.c
@@ -0,0 +1,707 @@
+/*
+ * $LynxId: tidy_tls.c,v 1.41 2020/03/03 11:46:07 Gisle.Vanem Exp $
+ * Copyright 2008-2019,2020 Thomas E. Dickey
+ * with fix Copyright 2008 by Thomas Viehmann
+ *
+ * Required libraries:
+ * libgnutls
+ * libcrypt
+ */
+#include <HTUtils.h>
+#include <tidy_tls.h>
+
+#include <gnutls/x509.h>
+#ifdef HAVE_GNUTLS_RND
+#include <gnutls/crypto.h>
+#else
+#include <gcrypt.h>
+#endif
+#include <libtasn1.h> /* ASN1_SUCCESS,etc */
+#include <string.h>
+
+#define typeCalloc(type) (type *) calloc(1, sizeof(type))
+
+static int last_error = 0;
+
+/* ugly, but hey, we could just use a more sane api, too */
+#define GetDnByOID(target, oid, thewhat) \
+ len = sizeof(target); \
+ if (! thewhat) \
+ gnutls_x509_crt_get_dn_by_oid(xcert, oid, 0, 0, target, &len); \
+ else \
+ gnutls_x509_crt_get_issuer_dn_by_oid(xcert, oid, 0, 0, target, &len)
+
+/* thewhat: which DN to get 0 = subject, 1 = issuer */
+static int ExtractCertificate(const gnutls_datum_t *cert, X509_NAME * result, int thewhat)
+{
+ gnutls_x509_crt_t xcert;
+ int rc;
+ size_t len;
+
+ if ((rc = gnutls_x509_crt_init(&xcert)) >= 0) {
+ if ((rc = gnutls_x509_crt_import(xcert, cert, GNUTLS_X509_FMT_DER)) >= 0) {
+ GetDnByOID(result->country,
+ GNUTLS_OID_X520_COUNTRY_NAME, thewhat);
+ GetDnByOID(result->organization,
+ GNUTLS_OID_X520_ORGANIZATION_NAME, thewhat);
+ GetDnByOID(result->organizational_unit_name,
+ GNUTLS_OID_X520_ORGANIZATIONAL_UNIT_NAME, thewhat);
+ GetDnByOID(result->common_name,
+ GNUTLS_OID_X520_COMMON_NAME, thewhat);
+ GetDnByOID(result->locality_name,
+ GNUTLS_OID_X520_LOCALITY_NAME, thewhat);
+ GetDnByOID(result->state_or_province_name,
+ GNUTLS_OID_X520_STATE_OR_PROVINCE_NAME, thewhat);
+ GetDnByOID(result->email,
+ GNUTLS_OID_PKCS9_EMAIL, thewhat);
+ rc = 0;
+ }
+ gnutls_x509_crt_deinit(xcert);
+ }
+ return rc;
+}
+
+/*
+ * (stub)
+ * ERR_error_string() generates a human-readable string representing the
+ * error code 'e', and places it at 'buffer', which must be at least 120 bytes
+ * long. If 'buffer' is NULL, the error string is placed in a static buffer.
+ */
+const char *ERR_error_string(unsigned long e, char *buffer)
+{
+ (void) buffer;
+ return gnutls_strerror((int) -e);
+}
+
+/*
+ * (stub)
+ * Return the earliest error code from the thread's error queue and remove the
+ * entry.
+ */
+unsigned long ERR_get_error(void)
+{
+ unsigned long rc;
+
+ rc = (unsigned long) (-last_error);
+ last_error = 0;
+
+ return rc;
+}
+
+/*
+ * Put 'num' cryptographically strong pseudo-random bytes into 'buffer'.
+ */
+int RAND_bytes(unsigned char *buffer, int num)
+{
+ int rc;
+
+#ifdef HAVE_GNUTLS_RND
+ rc = gnutls_rnd(GNUTLS_RND_KEY, buffer, (size_t) num);
+#else
+ gcry_randomize(buffer, num, GCRY_VERY_STRONG_RANDOM);
+ rc = 1;
+#endif
+ return rc;
+}
+
+/*
+ * (stub)
+ * Generate a default path for the random seed file. 'buffer' points to a
+ * buffer of size 'len' in which to store the filename.
+ */
+const char *RAND_file_name(char *buffer, size_t len)
+{
+ (void) buffer;
+ (void) len;
+ return "";
+}
+
+/*
+ * (stub)
+ * Read a number of bytes from file 'name' and adds them to the PRNG. If
+ * 'maxbytes' is non-negative, up to to 'maxbytes' are read; if 'maxbytes' is
+ * -1, the complete file is read.
+ */
+int RAND_load_file(const char *name, long maxbytes)
+{
+ (void) name;
+ return (int) maxbytes;
+}
+
+/*
+ * (stub)
+ * Mix the 'num' bytes at 'buffer' into the PRNG state.
+ */
+void RAND_seed(const void *buffer, int num)
+{
+ (void) buffer;
+ (void) num;
+}
+
+/*
+ * (stub)
+ * Return 1 if the PRNG has been seeded with enough data, 0 otherwise.
+ */
+int RAND_status(void)
+{
+ return 1;
+}
+
+/*
+ * (stub)
+ * Write a number of random bytes (currently 1024) to file 'name' which can be
+ * used to initialize the PRNG by calling RAND_load_file() in a later session.
+ */
+int RAND_write_file(const char *name)
+{
+ (void) name;
+ return 0;
+}
+
+/*
+ * Return the number of secret bits used for cipher. If 'bits' is not NULL, it
+ * contains the number of bits processed by the chosen algorithm. If cipher is
+ * NULL, 0 is returned.
+ */
+int SSL_CIPHER_get_bits(SSL_CIPHER * cipher, int *bits)
+{
+ int result = 0;
+
+ if (cipher) {
+ result = (8 * (int) gnutls_cipher_get_key_size(cipher->encrypts));
+ }
+
+ if (bits)
+ *bits = result;
+
+ return result;
+}
+
+/*
+ * Return a pointer to the name of 'cipher'. If 'cipher' is NULL the constant
+ * value "NONE" is returned.
+ */
+const char *SSL_CIPHER_get_name(SSL_CIPHER * cipher)
+{
+ const char *result = "NONE";
+
+ if (cipher) {
+ result = gnutls_cipher_suite_get_name(cipher->key_xchg,
+ cipher->encrypts,
+ cipher->msg_code);
+ }
+ return result;
+}
+
+/*
+ * Return the protocol version for cipher, currently "SSLv2", "SSLv3", or
+ * "TLSv1". If cipher is NULL, "(NONE)" is returned.
+ */
+const char *SSL_CIPHER_get_version(SSL_CIPHER * cipher)
+{
+ const char *result = "NONE";
+
+ if (cipher) {
+ if ((result = gnutls_protocol_get_name(cipher->protocol)) == 0)
+ result = "unknown";
+ }
+ return result;
+}
+
+/*
+ * Free an allocated SSL_CTX object.
+ */
+void SSL_CTX_free(SSL_CTX * ctx)
+{
+ free(ctx->method);
+ free(ctx);
+}
+
+/*
+ * Create a new SSL_CTX object as framework for TLS/SSL enabled functions.
+ */
+SSL_CTX *SSL_CTX_new(SSL_METHOD * method)
+{
+ SSL_CTX *ctx;
+
+ if ((ctx = typeCalloc(SSL_CTX)) != 0) {
+ ctx->method = method;
+ }
+
+ return ctx;
+}
+
+/*
+ * See SSL_CTX_load_verify_locations() - this sets the paths for that and
+ * SSL_CTX_set_verify() to their default values. GNU TLS does not have a
+ * comparable feature (stub).
+ */
+int SSL_CTX_set_default_verify_paths(SSL_CTX * ctx)
+{
+ (void) ctx;
+ return 0;
+}
+
+/*
+ * SSL_CTX_set_options() adds the options set via bitmask in options to
+ * ctx. Options already set before are not cleared.
+ */
+unsigned long SSL_CTX_set_options(SSL_CTX * ctx, unsigned long options)
+{
+ ctx->options |= options;
+ return ctx->options;
+}
+
+/*
+ * Set peer certificate verification parameters.
+ */
+void SSL_CTX_set_verify(SSL_CTX * ctx, int verify_mode,
+ int (*verify_callback) (int, X509_STORE_CTX *))
+{
+ ctx->verify_mode = verify_mode;
+ ctx->verify_callback = verify_callback;
+}
+
+#ifdef HAVE_GNUTLS_PROTOCOL_SET_PRIORITY
+static void RemoveProtocol(SSL * ssl, int protocol)
+{
+ int j, k;
+ int changed = 0;
+ int *protocols = ssl->ctx->method->priority.protocol;
+
+ for (j = k = 0; j < GNUTLS_MAX_ALGORITHM_NUM;) {
+ if (protocols[k] == protocol) {
+ if (++k >= GNUTLS_MAX_ALGORITHM_NUM)
+ break;
+ changed = 1;
+ } else {
+ protocols[j++] = protocols[k++];
+ }
+ }
+
+ if (changed) {
+ gnutls_protocol_set_priority(ssl->gnutls_state, protocols);
+ }
+}
+#endif
+
+/*
+ * Initiate the TLS/SSL handshake with an TLS/SSL server.
+ */
+int SSL_connect(SSL * ssl)
+{
+ X509_STORE_CTX *store;
+ int rc;
+ gnutls_alert_description_t alert;
+ const char *aname;
+
+ if (ssl->options & SSL_OP_NO_TLSv1) {
+#ifdef HAVE_GNUTLS_PROTOCOL_SET_PRIORITY
+ RemoveProtocol(ssl, GNUTLS_TLS1);
+#else
+ gnutls_priority_set_direct(ssl->gnutls_state, "NORMAL:-VERS-TLS1.0", NULL);
+#endif
+ }
+
+ while ((rc = gnutls_handshake(ssl->gnutls_state)) < 0 &&
+ !gnutls_error_is_fatal(rc)) {
+ if (rc == GNUTLS_E_WARNING_ALERT_RECEIVED) {
+ alert = gnutls_alert_get(ssl->gnutls_state);
+ aname = gnutls_alert_get_name(alert);
+ CTRACE((tfp, "SSL Alert: %s\n", NonNull(aname)));
+ switch (gnutls_alert_get(ssl->gnutls_state)) {
+ case GNUTLS_A_UNRECOGNIZED_NAME:
+ continue; /* ignore */
+ default:
+ break;
+ }
+ break; /* treat all other alerts as fatal */
+ }
+ }
+ ssl->last_error = rc;
+
+ if (rc < 0) {
+ last_error = rc;
+ return 0;
+ }
+
+ store = typeCalloc(X509_STORE_CTX);
+ if (store == 0)
+ outofmem(__FILE__, "SSL_connect");
+
+ store->ssl = ssl;
+ store->cert_list = SSL_get_peer_certificate(ssl);
+
+ if (ssl->verify_callback) {
+ ssl->verify_callback(1, store);
+ }
+ ssl->state = SSL_ST_OK;
+
+ free(store);
+
+ /* FIXME: deal with error from callback */
+
+ return 1;
+}
+
+/*
+ * Free an allocated SSL structure.
+ */
+void SSL_free(SSL * ssl)
+{
+ gnutls_certificate_free_credentials(ssl->gnutls_cred);
+ gnutls_deinit(ssl->gnutls_state);
+ free(ssl);
+}
+
+/*
+ * Get SSL_CIPHER data of a connection.
+ */
+SSL_CIPHER *SSL_get_current_cipher(SSL * ssl)
+{
+ SSL_CIPHER *result = 0;
+
+ if (ssl) {
+ result = &(ssl->ciphersuite);
+
+ result->protocol = gnutls_protocol_get_version(ssl->gnutls_state);
+ result->encrypts = gnutls_cipher_get(ssl->gnutls_state);
+ result->key_xchg = gnutls_kx_get(ssl->gnutls_state);
+ result->msg_code = gnutls_mac_get(ssl->gnutls_state);
+ result->cert = gnutls_certificate_type_get(ssl->gnutls_state);
+#if !defined(_GNUTLS_GCC_VERSION) || (_GNUTLS_GCC_VERSION < 30100)
+ result->compress = gnutls_compression_get(ssl->gnutls_state);
+#else
+ result->compress = GNUTLS_COMP_UNKNOWN;
+#endif
+ }
+
+ return result;
+}
+
+/*
+ * Get the X509 certificate of the peer.
+ */
+const X509 *SSL_get_peer_certificate(SSL * ssl)
+{
+ const gnutls_datum_t *result;
+ unsigned list_size = 0;
+
+ result =
+ (const gnutls_datum_t *) gnutls_certificate_get_peers(ssl->gnutls_state,
+ &list_size);
+
+ return (const X509 *) result;
+}
+
+/*
+ * Initialize SSL library by registering algorithms.
+ */
+int SSL_library_init(void)
+{
+ gnutls_global_init();
+ return 1;
+}
+
+/*
+ * (stub)
+ * OpenSSL uses this to prepare for ERR_get_error() calls.
+ */
+void SSL_load_error_strings(void)
+{
+}
+
+/*
+ * Create a new SSL structure for a connection.
+ */
+SSL *SSL_new(SSL_CTX * ctx)
+{
+ SSL *ssl;
+ int rc;
+
+ if ((ssl = typeCalloc(SSL)) != 0) {
+
+ rc = gnutls_certificate_allocate_credentials(&ssl->gnutls_cred);
+ if (rc < 0) {
+ last_error = rc;
+ free(ssl);
+ ssl = 0;
+ } else {
+ ssl->ctx = ctx;
+
+ gnutls_init(&ssl->gnutls_state, ctx->method->connend);
+ gnutls_set_default_priority(ssl->gnutls_state);
+
+ gnutls_credentials_set(ssl->gnutls_state, GNUTLS_CRD_CERTIFICATE,
+ ssl->gnutls_cred);
+ if (ctx->certfile)
+ gnutls_certificate_set_x509_trust_file(ssl->gnutls_cred,
+ ctx->certfile,
+ ctx->certfile_type);
+ if (ctx->client_keyfile)
+ gnutls_certificate_set_x509_key_file(ssl->gnutls_cred,
+ ctx->client_certfile,
+ ctx->client_keyfile,
+ ctx->client_keyfile_type);
+ ssl->verify_mode = ctx->verify_mode;
+ ssl->verify_callback = ctx->verify_callback;
+
+ ssl->options = ctx->options;
+
+ ssl->rfd = (gnutls_transport_ptr_t) (-1);
+ ssl->wfd = (gnutls_transport_ptr_t) (-1);
+ ssl->bytes_sent = 0;
+ ssl->sendbuffer = 0;
+ }
+ }
+
+ return ssl;
+}
+
+/*
+ * Read 'length' bytes into 'buffer' from the given SSL connection.
+ * Returns the number of bytes read, or zero on error.
+ */
+int SSL_read(SSL * ssl, void *buffer, int length)
+{
+ int rc;
+
+ do {
+ rc = (int) gnutls_record_recv(ssl->gnutls_state, buffer, (size_t) length);
+ }
+ while ((rc == GNUTLS_E_AGAIN) || (rc == GNUTLS_E_INTERRUPTED));
+
+ if (rc < 0 && gnutls_error_is_fatal(rc) == 0) {
+ if (rc == GNUTLS_E_REHANDSHAKE) {
+ (void) gnutls_handshake(ssl->gnutls_state);
+ do {
+ rc = (int) gnutls_record_send(ssl->gnutls_state,
+ ssl->sendbuffer,
+ (size_t) ssl->bytes_sent);
+ }
+ while ((rc == GNUTLS_E_AGAIN) || (rc == GNUTLS_E_INTERRUPTED));
+ do {
+ rc = (int) gnutls_record_recv(ssl->gnutls_state,
+ buffer,
+ (size_t) length);
+ }
+ while ((rc == GNUTLS_E_AGAIN) || (rc == GNUTLS_E_INTERRUPTED));
+ }
+ }
+
+ ssl->last_error = rc;
+
+ if (rc < 0) {
+ last_error = rc;
+ rc = 0;
+ }
+
+ return rc;
+}
+
+#ifdef _WINDOWS
+static int Lynx_gtls_push(void *s, const void *buf, size_t len)
+{
+ return NETWRITE((SOCKET) s, buf, len);
+}
+
+/* This calls 'recv()' in a thread for every GnuTls pull. Maybe too much overhead?
+ */
+static int Lynx_gtls_pull(void *s, void *buf, size_t len)
+{
+ return NETREAD((SOCKET) s, buf, len);
+}
+#endif
+
+/*
+ * Connect the SSL object with a file descriptor.
+ * This always returns 1 (success) since GNU TLS does not check for errors.
+ */
+int SSL_set_fd(SSL * ssl, int fd)
+{
+#ifdef _WINDOWS
+ /* register callback functions to send and receive data. */
+ gnutls_transport_set_push_function(ssl->gnutls_state, Lynx_gtls_push);
+ gnutls_transport_set_pull_function(ssl->gnutls_state, Lynx_gtls_pull);
+#endif
+
+ gnutls_transport_set_ptr(ssl->gnutls_state,
+ (gnutls_transport_ptr_t) (intptr_t) (fd));
+ return 1;
+}
+
+/*
+ * Write 'length' bytes from 'buffer' to the given SSL connection.
+ */
+int SSL_write(SSL * ssl, const void *buffer, int length)
+{
+ int rc;
+
+ do {
+ rc = (int) gnutls_record_send(ssl->gnutls_state, buffer, (size_t) length);
+ }
+ while ((rc == GNUTLS_E_AGAIN) || (rc == GNUTLS_E_INTERRUPTED));
+ ssl->last_error = rc;
+
+ if (rc < 0) {
+ last_error = rc;
+ rc = 0;
+ } else {
+ size_t need = (size_t) rc;
+
+ free(ssl->sendbuffer);
+ ssl->sendbuffer = malloc(need);
+ ssl->bytes_sent = need;
+ }
+
+ return rc;
+}
+
+/*
+ * Return method-data for SSL version 3, with the option of rollback to SSL
+ * version 2.
+ */
+SSL_METHOD *SSLv23_client_method(void)
+{
+ SSL_METHOD *m;
+
+ if ((m = typeCalloc(SSL_METHOD)) != 0) {
+ int n;
+
+ /*
+ * List the protocols in decreasing order of priority.
+ */
+ n = 0;
+#if GNUTLS_VERSION_NUMBER >= 0x030000
+ m->priority.protocol[n++] = GNUTLS_SSL3;
+ m->priority.protocol[n++] = GNUTLS_TLS1_2;
+#endif
+ m->priority.protocol[n++] = GNUTLS_TLS1_1;
+ m->priority.protocol[n++] = GNUTLS_TLS1_0;
+ m->priority.protocol[n] = 0;
+
+ /*
+ * List the cipher algorithms in decreasing order of priority.
+ */
+ n = 0;
+#if GNUTLS_VERSION_NUMBER >= 0x030000
+ m->priority.encrypts[n++] = GNUTLS_CIPHER_AES_256_GCM;
+ m->priority.encrypts[n++] = GNUTLS_CIPHER_AES_128_GCM;
+#endif
+ m->priority.encrypts[n++] = GNUTLS_CIPHER_AES_256_CBC;
+ m->priority.encrypts[n++] = GNUTLS_CIPHER_AES_128_CBC;
+ m->priority.encrypts[n++] = GNUTLS_CIPHER_CAMELLIA_256_CBC;
+ m->priority.encrypts[n++] = GNUTLS_CIPHER_CAMELLIA_128_CBC;
+ m->priority.encrypts[n++] = GNUTLS_CIPHER_3DES_CBC;
+ m->priority.encrypts[n] = 0;
+
+ /*
+ * List the compression algorithms in decreasing order of priority.
+ */
+ n = 0;
+ m->priority.compress[n++] = GNUTLS_COMP_NULL;
+ m->priority.compress[n] = 0;
+
+ /*
+ * List the key exchange algorithms in decreasing order of priority.
+ */
+ n = 0;
+ m->priority.key_xchg[n++] = GNUTLS_KX_DHE_RSA;
+ m->priority.key_xchg[n++] = GNUTLS_KX_RSA;
+ m->priority.key_xchg[n++] = GNUTLS_KX_DHE_DSS;
+ m->priority.key_xchg[n] = 0;
+
+ /*
+ * List message authentication code (MAC) algorithms in decreasing
+ * order of priority to specify via gnutls_mac_set_priority().
+ */
+ n = 0;
+ m->priority.msg_code[n++] = GNUTLS_MAC_SHA1;
+ m->priority.msg_code[n++] = GNUTLS_MAC_MD5;
+ m->priority.msg_code[n] = 0;
+
+ /*
+ * For gnutls_init, says we're a client.
+ */
+ m->connend = GNUTLS_CLIENT;
+ }
+
+ return m;
+}
+
+static int add_name(char *target, int len, const char *tag, const char *data)
+{
+ if (*data != '\0') {
+ int need = (int) strlen(tag) + 2;
+
+ target += strlen(target);
+ if (need < len) {
+ strcat(target, "/");
+ strcat(target, tag);
+ strcat(target, "=");
+ len -= need;
+ target += need;
+ }
+ need = (int) strlen(data);
+ if (need >= len - 1)
+ need = len - 1;
+ strncat(target, data, (size_t) need)[need] = '\0';
+ }
+ return len;
+}
+#define ADD_NAME(tag, data) len = add_name(target, len, tag, data);
+
+/*
+ * Convert the X509 name 'source' to a string in the given buffer 'target',
+ * whose length is 'len'. Return a pointer to the buffer.
+ */
+char *X509_NAME_oneline(X509_NAME * source, char *target, int len)
+{
+ if (target && (len > 0)) {
+ *target = '\0';
+ if (source) {
+ ADD_NAME("C", source->country);
+ ADD_NAME("ST", source->state_or_province_name);
+ ADD_NAME("L", source->locality_name);
+ ADD_NAME("O", source->organization);
+ ADD_NAME("OU", source->organizational_unit_name);
+ ADD_NAME("CN", source->common_name);
+ ADD_NAME("Email", source->email);
+ }
+ }
+ return target;
+}
+
+/*
+ * Extract the certificate's issuer-name data.
+ */
+X509_NAME *X509_get_issuer_name(const X509 * cert)
+{
+ static X509_NAME *result;
+
+ free(result);
+ if ((result = typeCalloc(X509_NAME)) != 0) {
+ if (ExtractCertificate(cert, result, 1) < 0) {
+ free(result);
+ result = 0;
+ }
+ }
+ return result;
+}
+
+/*
+ * Extract the certificate's subject-name data.
+ */
+X509_NAME *X509_get_subject_name(const X509 * cert)
+{
+ static X509_NAME *result;
+
+ free(result);
+ if ((result = typeCalloc(X509_NAME)) != 0) {
+ if (ExtractCertificate(cert, result, 0) < 0) {
+ free(result);
+ result = 0;
+ }
+ }
+ return result;
+}
diff --git a/src/ucxolb.opt b/src/ucxolb.opt
new file mode 100644
index 0000000..2c7cb54
--- /dev/null
+++ b/src/ucxolb.opt
@@ -0,0 +1 @@
+sys$library:ucx$ipc/library
diff --git a/src/ucxshr.opt b/src/ucxshr.opt
new file mode 100644
index 0000000..ba84be0
--- /dev/null
+++ b/src/ucxshr.opt
@@ -0,0 +1 @@
+sys$share:ucx$ipc_shr/share
diff --git a/src/vaxc.opt b/src/vaxc.opt
new file mode 100644
index 0000000..fbb523b
--- /dev/null
+++ b/src/vaxc.opt
@@ -0,0 +1,2 @@
+sys$share:vaxcrtl/share
+sys$library:vaxccurse/library
diff --git a/src/wcwidth.c b/src/wcwidth.c
new file mode 100644
index 0000000..ea46336
--- /dev/null
+++ b/src/wcwidth.c
@@ -0,0 +1,709 @@
+/* $XTermId: wcwidth.c,v 1.42 2018/12/04 10:13:14 tom Exp $ */
+
+/* $XFree86: xc/programs/xterm/wcwidth.c,v 1.9 2006/06/19 00:36:52 dickey Exp $ */
+
+/*
+ * Copyright 2002-2017,2018 by Thomas E. Dickey
+ *
+ * All Rights Reserved
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name(s) of the above copyright
+ * holders shall not be used in advertising or otherwise to promote the
+ * sale, use or other dealings in this Software without prior written
+ * authorization.
+ *-----------------------------------------------------------------------------
+ * This is an updated version of Markus Kuhn's implementation of wcwidth.
+ *
+ * Originally added to xterm in 2000 (patch #141), there were a couple of
+ * updates from Kuhn until 2005 (patch #202), renaming entrypoints and applying
+ * data from Unicode.org (e.g., 3.2, 4.0, 4.1.0). The Unicode data is
+ * transformed into tables in this file by a script "uniset" written by Kuhn.
+ *
+ * While Kuhn implemented the original CJK variant, it was unused by xterm
+ * until Jungshik Shin used it in 2002 to implement the -cjk_width command-line
+ * option.
+ *
+ * Kuhn added a check for the vertical forms block (double-width) in 2007;
+ * other updates were derived from the Unicode.org data (release 5.0).
+ *
+ * Since then, additional updates have been made:
+ * + data-type fixes
+ * + new Unicode releases (6.2.0, 9.0.0),
+ * + additional special symbol blocks have been added to the special cases.
+ * + soft-hyphen behavior has been made configurable.
+ * + added table shows when a character is not part of Unicode.
+ *
+ * Kuhn's original header follows giving the design information:
+ *-----------------------------------------------------------------------------
+ * This is an implementation of wcwidth() and wcswidth() (defined in
+ * IEEE Std 1002.1-2001) for Unicode.
+ *
+ * http://www.opengroup.org/onlinepubs/007904975/functions/wcwidth.html
+ * http://www.opengroup.org/onlinepubs/007904975/functions/wcswidth.html
+ *
+ * In fixed-width output devices, Latin characters all occupy a single
+ * "cell" position of equal width, whereas ideographic CJK characters
+ * occupy two such cells. Interoperability between terminal-line
+ * applications and (teletype-style) character terminals using the
+ * UTF-8 encoding requires agreement on which character should advance
+ * the cursor by how many cell positions. No established formal
+ * standards exist at present on which Unicode character shall occupy
+ * how many cell positions on character terminals. These routines are
+ * a first attempt of defining such behavior based on simple rules
+ * applied to data provided by the Unicode Consortium.
+ *
+ * For some graphical characters, the Unicode standard explicitly
+ * defines a character-cell width via the definition of the East Asian
+ * FullWidth (F), Wide (W), Half-width (H), and Narrow (Na) classes.
+ * In all these cases, there is no ambiguity about which width a
+ * terminal shall use. For characters in the East Asian Ambiguous (A)
+ * class, the width choice depends purely on a preference of backward
+ * compatibility with either historic CJK or Western practice.
+ * Choosing single-width for these characters is easy to justify as
+ * the appropriate long-term solution, as the CJK practice of
+ * displaying these characters as double-width comes from historic
+ * implementation simplicity (8-bit encoded characters were displayed
+ * single-width and 16-bit ones double-width, even for Greek,
+ * Cyrillic, etc.) and not any typographic considerations.
+ *
+ * Much less clear is the choice of width for the Not East Asian
+ * (Neutral) class. Existing practice does not dictate a width for any
+ * of these characters. It would nevertheless make sense
+ * typographically to allocate two character cells to characters such
+ * as for instance EM SPACE or VOLUME INTEGRAL, which cannot be
+ * represented adequately with a single-width glyph. The following
+ * routines at present merely assign a single-cell width to all
+ * neutral characters, in the interest of simplicity. This is not
+ * entirely satisfactory and should be reconsidered before
+ * establishing a formal standard in this area. At the moment, the
+ * decision which Not East Asian (Neutral) characters should be
+ * represented by double-width glyphs cannot yet be answered by
+ * applying a simple rule from the Unicode database content. Setting
+ * up a proper standard for the behavior of UTF-8 character terminals
+ * will require a careful analysis not only of each Unicode character,
+ * but also of each presentation form, something the author of these
+ * routines has avoided to do so far.
+ *
+ * http://www.unicode.org/unicode/reports/tr11/
+ *
+ * Markus Kuhn -- 2007-05-25 (Unicode 5.0)
+ *
+ * Permission to use, copy, modify, and distribute this software
+ * for any purpose and without fee is hereby granted. The author
+ * disclaims all warranties with regard to this software.
+ *
+ * Latest version: http://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c
+ */
+
+#include <wcwidth.h>
+
+struct interval {
+ unsigned long first;
+ unsigned long last;
+};
+
+static int use_latin1 = 1;
+
+/* auxiliary function for binary search in interval table */
+static int bisearch(unsigned long ucs, const struct interval *table, int max) {
+
+ if (ucs >= table[0].first && ucs <= table[max].last) {
+ int min = 0;
+
+ while (max >= min) {
+ int mid;
+
+ mid = (min + max) / 2;
+ if (ucs > table[mid].last)
+ min = mid + 1;
+ else if (ucs < table[mid].first)
+ max = mid - 1;
+ else
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+/*
+ * Provide a way to change the behavior of soft-hyphen.
+ */
+void
+mk_wcwidth_init(int mode)
+{
+ use_latin1 = (mode == 0);
+}
+
+/* The following two functions define the column width of an ISO 10646
+ * character as follows:
+ *
+ * - The null character (U+0000) has a column width of 0.
+ *
+ * - Other C0/C1 control characters and DEL will lead to a return
+ * value of -1.
+ *
+ * - Non-spacing and enclosing combining characters (general
+ * category code Mn or Me in the Unicode database) have a
+ * column width of 0.
+ *
+ * - A few spacing combining marks have a column width of 0.
+ *
+ * - SOFT HYPHEN (U+00AD) has a column width of 1 in Latin-1, 0 in Unicode.
+ * An initialization function is used to switch between the two.
+ *
+ * - Other format characters (general category code Cf in the Unicode
+ * database) and ZERO WIDTH SPACE (U+200B) have a column width of 0.
+ *
+ * - Hangul Jamo medial vowels and final consonants (U+1160-U+11FF)
+ * have a column width of 0.
+ *
+ * - Spacing characters in the East Asian Wide (W) or East Asian
+ * Full-width (F) category as defined in Unicode Technical
+ * Report #11 have a column width of 2. In that report, some codes
+ * were unassigned. Characters in these blocks use a column width of 1:
+ * 4DC0..4DFF; Yijing Hexagram Symbols
+ * A960..A97F; Hangul Jamo Extended-A
+ *
+ * - All remaining characters (including all printable
+ * ISO 8859-1 and WGL4 characters, Unicode control characters,
+ * etc.) have a column width of 1.
+ *
+ * - Codes which do not correspond to a Unicode character have a column
+ * width of -1.
+ *
+ * This implementation assumes that wchar_t characters are encoded
+ * in ISO 10646.
+ */
+
+int mk_wcwidth(wchar_t ucs)
+{
+ unsigned long cmp = (unsigned long) ucs;
+
+ /* sorted list of non-overlapping intervals of non-spacing characters */
+ /* generated by
+ * uniset +cat=Me +cat=Mn +cat=Cf -00AD +1160-11FF +200B c
+ */
+ static const struct interval combining[] = {
+ { 0x0300, 0x036F }, { 0x0483, 0x0489 }, { 0x0591, 0x05BD },
+ { 0x05BF, 0x05BF }, { 0x05C1, 0x05C2 }, { 0x05C4, 0x05C5 },
+ { 0x05C7, 0x05C7 }, { 0x0600, 0x0605 }, { 0x0610, 0x061A },
+ { 0x061C, 0x061C }, { 0x064B, 0x065F }, { 0x0670, 0x0670 },
+ { 0x06D6, 0x06DD }, { 0x06DF, 0x06E4 }, { 0x06E7, 0x06E8 },
+ { 0x06EA, 0x06ED }, { 0x070F, 0x070F }, { 0x0711, 0x0711 },
+ { 0x0730, 0x074A }, { 0x07A6, 0x07B0 }, { 0x07EB, 0x07F3 },
+ { 0x0816, 0x0819 }, { 0x081B, 0x0823 }, { 0x0825, 0x0827 },
+ { 0x0829, 0x082D }, { 0x0859, 0x085B }, { 0x08D4, 0x0902 },
+ { 0x093A, 0x093A }, { 0x093C, 0x093C }, { 0x0941, 0x0948 },
+ { 0x094D, 0x094D }, { 0x0951, 0x0957 }, { 0x0962, 0x0963 },
+ { 0x0981, 0x0981 }, { 0x09BC, 0x09BC }, { 0x09C1, 0x09C4 },
+ { 0x09CD, 0x09CD }, { 0x09E2, 0x09E3 }, { 0x0A01, 0x0A02 },
+ { 0x0A3C, 0x0A3C }, { 0x0A41, 0x0A42 }, { 0x0A47, 0x0A48 },
+ { 0x0A4B, 0x0A4D }, { 0x0A51, 0x0A51 }, { 0x0A70, 0x0A71 },
+ { 0x0A75, 0x0A75 }, { 0x0A81, 0x0A82 }, { 0x0ABC, 0x0ABC },
+ { 0x0AC1, 0x0AC5 }, { 0x0AC7, 0x0AC8 }, { 0x0ACD, 0x0ACD },
+ { 0x0AE2, 0x0AE3 }, { 0x0AFA, 0x0AFF }, { 0x0B01, 0x0B01 },
+ { 0x0B3C, 0x0B3C }, { 0x0B3F, 0x0B3F }, { 0x0B41, 0x0B44 },
+ { 0x0B4D, 0x0B4D }, { 0x0B56, 0x0B56 }, { 0x0B62, 0x0B63 },
+ { 0x0B82, 0x0B82 }, { 0x0BC0, 0x0BC0 }, { 0x0BCD, 0x0BCD },
+ { 0x0C00, 0x0C00 }, { 0x0C3E, 0x0C40 }, { 0x0C46, 0x0C48 },
+ { 0x0C4A, 0x0C4D }, { 0x0C55, 0x0C56 }, { 0x0C62, 0x0C63 },
+ { 0x0C81, 0x0C81 }, { 0x0CBC, 0x0CBC }, { 0x0CBF, 0x0CBF },
+ { 0x0CC6, 0x0CC6 }, { 0x0CCC, 0x0CCD }, { 0x0CE2, 0x0CE3 },
+ { 0x0D00, 0x0D01 }, { 0x0D3B, 0x0D3C }, { 0x0D41, 0x0D44 },
+ { 0x0D4D, 0x0D4D }, { 0x0D62, 0x0D63 }, { 0x0DCA, 0x0DCA },
+ { 0x0DD2, 0x0DD4 }, { 0x0DD6, 0x0DD6 }, { 0x0E31, 0x0E31 },
+ { 0x0E34, 0x0E3A }, { 0x0E47, 0x0E4E }, { 0x0EB1, 0x0EB1 },
+ { 0x0EB4, 0x0EB9 }, { 0x0EBB, 0x0EBC }, { 0x0EC8, 0x0ECD },
+ { 0x0F18, 0x0F19 }, { 0x0F35, 0x0F35 }, { 0x0F37, 0x0F37 },
+ { 0x0F39, 0x0F39 }, { 0x0F71, 0x0F7E }, { 0x0F80, 0x0F84 },
+ { 0x0F86, 0x0F87 }, { 0x0F8D, 0x0F97 }, { 0x0F99, 0x0FBC },
+ { 0x0FC6, 0x0FC6 }, { 0x102D, 0x1030 }, { 0x1032, 0x1037 },
+ { 0x1039, 0x103A }, { 0x103D, 0x103E }, { 0x1058, 0x1059 },
+ { 0x105E, 0x1060 }, { 0x1071, 0x1074 }, { 0x1082, 0x1082 },
+ { 0x1085, 0x1086 }, { 0x108D, 0x108D }, { 0x109D, 0x109D },
+ { 0x1160, 0x11FF }, { 0x135D, 0x135F }, { 0x1712, 0x1714 },
+ { 0x1732, 0x1734 }, { 0x1752, 0x1753 }, { 0x1772, 0x1773 },
+ { 0x17B4, 0x17B5 }, { 0x17B7, 0x17BD }, { 0x17C6, 0x17C6 },
+ { 0x17C9, 0x17D3 }, { 0x17DD, 0x17DD }, { 0x180B, 0x180E },
+ { 0x1885, 0x1886 }, { 0x18A9, 0x18A9 }, { 0x1920, 0x1922 },
+ { 0x1927, 0x192B }, { 0x1932, 0x1932 }, { 0x1939, 0x193B },
+ { 0x1A17, 0x1A18 }, { 0x1A1B, 0x1A1B }, { 0x1A56, 0x1A56 },
+ { 0x1A58, 0x1A5E }, { 0x1A60, 0x1A60 }, { 0x1A62, 0x1A62 },
+ { 0x1A65, 0x1A6C }, { 0x1A73, 0x1A7C }, { 0x1A7F, 0x1A7F },
+ { 0x1AB0, 0x1ABE }, { 0x1B00, 0x1B03 }, { 0x1B34, 0x1B34 },
+ { 0x1B36, 0x1B3A }, { 0x1B3C, 0x1B3C }, { 0x1B42, 0x1B42 },
+ { 0x1B6B, 0x1B73 }, { 0x1B80, 0x1B81 }, { 0x1BA2, 0x1BA5 },
+ { 0x1BA8, 0x1BA9 }, { 0x1BAB, 0x1BAD }, { 0x1BE6, 0x1BE6 },
+ { 0x1BE8, 0x1BE9 }, { 0x1BED, 0x1BED }, { 0x1BEF, 0x1BF1 },
+ { 0x1C2C, 0x1C33 }, { 0x1C36, 0x1C37 }, { 0x1CD0, 0x1CD2 },
+ { 0x1CD4, 0x1CE0 }, { 0x1CE2, 0x1CE8 }, { 0x1CED, 0x1CED },
+ { 0x1CF4, 0x1CF4 }, { 0x1CF8, 0x1CF9 }, { 0x1DC0, 0x1DF9 },
+ { 0x1DFB, 0x1DFF }, { 0x200B, 0x200F }, { 0x202A, 0x202E },
+ { 0x2060, 0x2064 }, { 0x2066, 0x206F }, { 0x20D0, 0x20F0 },
+ { 0x2CEF, 0x2CF1 }, { 0x2D7F, 0x2D7F }, { 0x2DE0, 0x2DFF },
+ { 0x302A, 0x302F }, { 0x3099, 0x309A }, { 0xA66F, 0xA672 },
+ { 0xA674, 0xA67D }, { 0xA69E, 0xA69F }, { 0xA6F0, 0xA6F1 },
+ { 0xA802, 0xA802 }, { 0xA806, 0xA806 }, { 0xA80B, 0xA80B },
+ { 0xA825, 0xA826 }, { 0xA8C4, 0xA8C5 }, { 0xA8E0, 0xA8F1 },
+ { 0xA926, 0xA92D }, { 0xA947, 0xA951 }, { 0xA980, 0xA982 },
+ { 0xA9B3, 0xA9B3 }, { 0xA9B6, 0xA9B9 }, { 0xA9BC, 0xA9BC },
+ { 0xA9E5, 0xA9E5 }, { 0xAA29, 0xAA2E }, { 0xAA31, 0xAA32 },
+ { 0xAA35, 0xAA36 }, { 0xAA43, 0xAA43 }, { 0xAA4C, 0xAA4C },
+ { 0xAA7C, 0xAA7C }, { 0xAAB0, 0xAAB0 }, { 0xAAB2, 0xAAB4 },
+ { 0xAAB7, 0xAAB8 }, { 0xAABE, 0xAABF }, { 0xAAC1, 0xAAC1 },
+ { 0xAAEC, 0xAAED }, { 0xAAF6, 0xAAF6 }, { 0xABE5, 0xABE5 },
+ { 0xABE8, 0xABE8 }, { 0xABED, 0xABED }, { 0xFB1E, 0xFB1E },
+ { 0xFE00, 0xFE0F }, { 0xFE20, 0xFE2F }, { 0xFEFF, 0xFEFF },
+ { 0xFFF9, 0xFFFB }, { 0x101FD, 0x101FD }, { 0x102E0, 0x102E0 },
+ { 0x10376, 0x1037A }, { 0x10A01, 0x10A03 }, { 0x10A05, 0x10A06 },
+ { 0x10A0C, 0x10A0F }, { 0x10A38, 0x10A3A }, { 0x10A3F, 0x10A3F },
+ { 0x10AE5, 0x10AE6 }, { 0x11001, 0x11001 }, { 0x11038, 0x11046 },
+ { 0x1107F, 0x11081 }, { 0x110B3, 0x110B6 }, { 0x110B9, 0x110BA },
+ { 0x110BD, 0x110BD }, { 0x11100, 0x11102 }, { 0x11127, 0x1112B },
+ { 0x1112D, 0x11134 }, { 0x11173, 0x11173 }, { 0x11180, 0x11181 },
+ { 0x111B6, 0x111BE }, { 0x111CA, 0x111CC }, { 0x1122F, 0x11231 },
+ { 0x11234, 0x11234 }, { 0x11236, 0x11237 }, { 0x1123E, 0x1123E },
+ { 0x112DF, 0x112DF }, { 0x112E3, 0x112EA }, { 0x11300, 0x11301 },
+ { 0x1133C, 0x1133C }, { 0x11340, 0x11340 }, { 0x11366, 0x1136C },
+ { 0x11370, 0x11374 }, { 0x11438, 0x1143F }, { 0x11442, 0x11444 },
+ { 0x11446, 0x11446 }, { 0x114B3, 0x114B8 }, { 0x114BA, 0x114BA },
+ { 0x114BF, 0x114C0 }, { 0x114C2, 0x114C3 }, { 0x115B2, 0x115B5 },
+ { 0x115BC, 0x115BD }, { 0x115BF, 0x115C0 }, { 0x115DC, 0x115DD },
+ { 0x11633, 0x1163A }, { 0x1163D, 0x1163D }, { 0x1163F, 0x11640 },
+ { 0x116AB, 0x116AB }, { 0x116AD, 0x116AD }, { 0x116B0, 0x116B5 },
+ { 0x116B7, 0x116B7 }, { 0x1171D, 0x1171F }, { 0x11722, 0x11725 },
+ { 0x11727, 0x1172B }, { 0x11A01, 0x11A06 }, { 0x11A09, 0x11A0A },
+ { 0x11A33, 0x11A38 }, { 0x11A3B, 0x11A3E }, { 0x11A47, 0x11A47 },
+ { 0x11A51, 0x11A56 }, { 0x11A59, 0x11A5B }, { 0x11A8A, 0x11A96 },
+ { 0x11A98, 0x11A99 }, { 0x11C30, 0x11C36 }, { 0x11C38, 0x11C3D },
+ { 0x11C3F, 0x11C3F }, { 0x11C92, 0x11CA7 }, { 0x11CAA, 0x11CB0 },
+ { 0x11CB2, 0x11CB3 }, { 0x11CB5, 0x11CB6 }, { 0x11D31, 0x11D36 },
+ { 0x11D3A, 0x11D3A }, { 0x11D3C, 0x11D3D }, { 0x11D3F, 0x11D45 },
+ { 0x11D47, 0x11D47 }, { 0x16AF0, 0x16AF4 }, { 0x16B30, 0x16B36 },
+ { 0x16F8F, 0x16F92 }, { 0x1BC9D, 0x1BC9E }, { 0x1BCA0, 0x1BCA3 },
+ { 0x1D167, 0x1D169 }, { 0x1D173, 0x1D182 }, { 0x1D185, 0x1D18B },
+ { 0x1D1AA, 0x1D1AD }, { 0x1D242, 0x1D244 }, { 0x1DA00, 0x1DA36 },
+ { 0x1DA3B, 0x1DA6C }, { 0x1DA75, 0x1DA75 }, { 0x1DA84, 0x1DA84 },
+ { 0x1DA9B, 0x1DA9F }, { 0x1DAA1, 0x1DAAF }, { 0x1E000, 0x1E006 },
+ { 0x1E008, 0x1E018 }, { 0x1E01B, 0x1E021 }, { 0x1E023, 0x1E024 },
+ { 0x1E026, 0x1E02A }, { 0x1E8D0, 0x1E8D6 }, { 0x1E944, 0x1E94A },
+ { 0xE0001, 0xE0001 }, { 0xE0020, 0xE007F }, { 0xE0100, 0xE01EF }
+ };
+
+ /* sorted list of non-overlapping intervals of non-characters */
+ /* generated by
+ * uniset +0000..DFFF -4e00..9fd5 +F900..10FFFD unknown +2028..2029 c
+ */
+ static const struct interval unknowns[] = {
+ { 0x0378, 0x0379 }, { 0x0380, 0x0383 }, { 0x038B, 0x038B },
+ { 0x038D, 0x038D }, { 0x03A2, 0x03A2 }, { 0x0530, 0x0530 },
+ { 0x0557, 0x0558 }, { 0x0560, 0x0560 }, { 0x0588, 0x0588 },
+ { 0x058B, 0x058C }, { 0x0590, 0x0590 }, { 0x05C8, 0x05CF },
+ { 0x05EB, 0x05EF }, { 0x05F5, 0x05FF }, { 0x061D, 0x061D },
+ { 0x070E, 0x070E }, { 0x074B, 0x074C }, { 0x07B2, 0x07BF },
+ { 0x07FB, 0x07FF }, { 0x082E, 0x082F }, { 0x083F, 0x083F },
+ { 0x085C, 0x085D }, { 0x085F, 0x085F }, { 0x086B, 0x089F },
+ { 0x08B5, 0x08B5 }, { 0x08BE, 0x08D3 }, { 0x0984, 0x0984 },
+ { 0x098D, 0x098E }, { 0x0991, 0x0992 }, { 0x09A9, 0x09A9 },
+ { 0x09B1, 0x09B1 }, { 0x09B3, 0x09B5 }, { 0x09BA, 0x09BB },
+ { 0x09C5, 0x09C6 }, { 0x09C9, 0x09CA }, { 0x09CF, 0x09D6 },
+ { 0x09D8, 0x09DB }, { 0x09DE, 0x09DE }, { 0x09E4, 0x09E5 },
+ { 0x09FE, 0x0A00 }, { 0x0A04, 0x0A04 }, { 0x0A0B, 0x0A0E },
+ { 0x0A11, 0x0A12 }, { 0x0A29, 0x0A29 }, { 0x0A31, 0x0A31 },
+ { 0x0A34, 0x0A34 }, { 0x0A37, 0x0A37 }, { 0x0A3A, 0x0A3B },
+ { 0x0A3D, 0x0A3D }, { 0x0A43, 0x0A46 }, { 0x0A49, 0x0A4A },
+ { 0x0A4E, 0x0A50 }, { 0x0A52, 0x0A58 }, { 0x0A5D, 0x0A5D },
+ { 0x0A5F, 0x0A65 }, { 0x0A76, 0x0A80 }, { 0x0A84, 0x0A84 },
+ { 0x0A8E, 0x0A8E }, { 0x0A92, 0x0A92 }, { 0x0AA9, 0x0AA9 },
+ { 0x0AB1, 0x0AB1 }, { 0x0AB4, 0x0AB4 }, { 0x0ABA, 0x0ABB },
+ { 0x0AC6, 0x0AC6 }, { 0x0ACA, 0x0ACA }, { 0x0ACE, 0x0ACF },
+ { 0x0AD1, 0x0ADF }, { 0x0AE4, 0x0AE5 }, { 0x0AF2, 0x0AF8 },
+ { 0x0B00, 0x0B00 }, { 0x0B04, 0x0B04 }, { 0x0B0D, 0x0B0E },
+ { 0x0B11, 0x0B12 }, { 0x0B29, 0x0B29 }, { 0x0B31, 0x0B31 },
+ { 0x0B34, 0x0B34 }, { 0x0B3A, 0x0B3B }, { 0x0B45, 0x0B46 },
+ { 0x0B49, 0x0B4A }, { 0x0B4E, 0x0B55 }, { 0x0B58, 0x0B5B },
+ { 0x0B5E, 0x0B5E }, { 0x0B64, 0x0B65 }, { 0x0B78, 0x0B81 },
+ { 0x0B84, 0x0B84 }, { 0x0B8B, 0x0B8D }, { 0x0B91, 0x0B91 },
+ { 0x0B96, 0x0B98 }, { 0x0B9B, 0x0B9B }, { 0x0B9D, 0x0B9D },
+ { 0x0BA0, 0x0BA2 }, { 0x0BA5, 0x0BA7 }, { 0x0BAB, 0x0BAD },
+ { 0x0BBA, 0x0BBD }, { 0x0BC3, 0x0BC5 }, { 0x0BC9, 0x0BC9 },
+ { 0x0BCE, 0x0BCF }, { 0x0BD1, 0x0BD6 }, { 0x0BD8, 0x0BE5 },
+ { 0x0BFB, 0x0BFF }, { 0x0C04, 0x0C04 }, { 0x0C0D, 0x0C0D },
+ { 0x0C11, 0x0C11 }, { 0x0C29, 0x0C29 }, { 0x0C3A, 0x0C3C },
+ { 0x0C45, 0x0C45 }, { 0x0C49, 0x0C49 }, { 0x0C4E, 0x0C54 },
+ { 0x0C57, 0x0C57 }, { 0x0C5B, 0x0C5F }, { 0x0C64, 0x0C65 },
+ { 0x0C70, 0x0C77 }, { 0x0C84, 0x0C84 }, { 0x0C8D, 0x0C8D },
+ { 0x0C91, 0x0C91 }, { 0x0CA9, 0x0CA9 }, { 0x0CB4, 0x0CB4 },
+ { 0x0CBA, 0x0CBB }, { 0x0CC5, 0x0CC5 }, { 0x0CC9, 0x0CC9 },
+ { 0x0CCE, 0x0CD4 }, { 0x0CD7, 0x0CDD }, { 0x0CDF, 0x0CDF },
+ { 0x0CE4, 0x0CE5 }, { 0x0CF0, 0x0CF0 }, { 0x0CF3, 0x0CFF },
+ { 0x0D04, 0x0D04 }, { 0x0D0D, 0x0D0D }, { 0x0D11, 0x0D11 },
+ { 0x0D45, 0x0D45 }, { 0x0D49, 0x0D49 }, { 0x0D50, 0x0D53 },
+ { 0x0D64, 0x0D65 }, { 0x0D80, 0x0D81 }, { 0x0D84, 0x0D84 },
+ { 0x0D97, 0x0D99 }, { 0x0DB2, 0x0DB2 }, { 0x0DBC, 0x0DBC },
+ { 0x0DBE, 0x0DBF }, { 0x0DC7, 0x0DC9 }, { 0x0DCB, 0x0DCE },
+ { 0x0DD5, 0x0DD5 }, { 0x0DD7, 0x0DD7 }, { 0x0DE0, 0x0DE5 },
+ { 0x0DF0, 0x0DF1 }, { 0x0DF5, 0x0E00 }, { 0x0E3B, 0x0E3E },
+ { 0x0E5C, 0x0E80 }, { 0x0E83, 0x0E83 }, { 0x0E85, 0x0E86 },
+ { 0x0E89, 0x0E89 }, { 0x0E8B, 0x0E8C }, { 0x0E8E, 0x0E93 },
+ { 0x0E98, 0x0E98 }, { 0x0EA0, 0x0EA0 }, { 0x0EA4, 0x0EA4 },
+ { 0x0EA6, 0x0EA6 }, { 0x0EA8, 0x0EA9 }, { 0x0EAC, 0x0EAC },
+ { 0x0EBA, 0x0EBA }, { 0x0EBE, 0x0EBF }, { 0x0EC5, 0x0EC5 },
+ { 0x0EC7, 0x0EC7 }, { 0x0ECE, 0x0ECF }, { 0x0EDA, 0x0EDB },
+ { 0x0EE0, 0x0EFF }, { 0x0F48, 0x0F48 }, { 0x0F6D, 0x0F70 },
+ { 0x0F98, 0x0F98 }, { 0x0FBD, 0x0FBD }, { 0x0FCD, 0x0FCD },
+ { 0x0FDB, 0x0FFF }, { 0x10C6, 0x10C6 }, { 0x10C8, 0x10CC },
+ { 0x10CE, 0x10CF }, { 0x1249, 0x1249 }, { 0x124E, 0x124F },
+ { 0x1257, 0x1257 }, { 0x1259, 0x1259 }, { 0x125E, 0x125F },
+ { 0x1289, 0x1289 }, { 0x128E, 0x128F }, { 0x12B1, 0x12B1 },
+ { 0x12B6, 0x12B7 }, { 0x12BF, 0x12BF }, { 0x12C1, 0x12C1 },
+ { 0x12C6, 0x12C7 }, { 0x12D7, 0x12D7 }, { 0x1311, 0x1311 },
+ { 0x1316, 0x1317 }, { 0x135B, 0x135C }, { 0x137D, 0x137F },
+ { 0x139A, 0x139F }, { 0x13F6, 0x13F7 }, { 0x13FE, 0x13FF },
+ { 0x169D, 0x169F }, { 0x16F9, 0x16FF }, { 0x170D, 0x170D },
+ { 0x1715, 0x171F }, { 0x1737, 0x173F }, { 0x1754, 0x175F },
+ { 0x176D, 0x176D }, { 0x1771, 0x1771 }, { 0x1774, 0x177F },
+ { 0x17DE, 0x17DF }, { 0x17EA, 0x17EF }, { 0x17FA, 0x17FF },
+ { 0x180F, 0x180F }, { 0x181A, 0x181F }, { 0x1878, 0x187F },
+ { 0x18AB, 0x18AF }, { 0x18F6, 0x18FF }, { 0x191F, 0x191F },
+ { 0x192C, 0x192F }, { 0x193C, 0x193F }, { 0x1941, 0x1943 },
+ { 0x196E, 0x196F }, { 0x1975, 0x197F }, { 0x19AC, 0x19AF },
+ { 0x19CA, 0x19CF }, { 0x19DB, 0x19DD }, { 0x1A1C, 0x1A1D },
+ { 0x1A5F, 0x1A5F }, { 0x1A7D, 0x1A7E }, { 0x1A8A, 0x1A8F },
+ { 0x1A9A, 0x1A9F }, { 0x1AAE, 0x1AAF }, { 0x1ABF, 0x1AFF },
+ { 0x1B4C, 0x1B4F }, { 0x1B7D, 0x1B7F }, { 0x1BF4, 0x1BFB },
+ { 0x1C38, 0x1C3A }, { 0x1C4A, 0x1C4C }, { 0x1C89, 0x1CBF },
+ { 0x1CC8, 0x1CCF }, { 0x1CFA, 0x1CFF }, { 0x1DFA, 0x1DFA },
+ { 0x1F16, 0x1F17 }, { 0x1F1E, 0x1F1F }, { 0x1F46, 0x1F47 },
+ { 0x1F4E, 0x1F4F }, { 0x1F58, 0x1F58 }, { 0x1F5A, 0x1F5A },
+ { 0x1F5C, 0x1F5C }, { 0x1F5E, 0x1F5E }, { 0x1F7E, 0x1F7F },
+ { 0x1FB5, 0x1FB5 }, { 0x1FC5, 0x1FC5 }, { 0x1FD4, 0x1FD5 },
+ { 0x1FDC, 0x1FDC }, { 0x1FF0, 0x1FF1 }, { 0x1FF5, 0x1FF5 },
+ { 0x1FFF, 0x1FFF }, { 0x2028, 0x2029 }, { 0x2065, 0x2065 },
+ { 0x2072, 0x2073 }, { 0x208F, 0x208F }, { 0x209D, 0x209F },
+ { 0x20C0, 0x20CF }, { 0x20F1, 0x20FF }, { 0x218C, 0x218F },
+ { 0x2427, 0x243F }, { 0x244B, 0x245F }, { 0x2B74, 0x2B75 },
+ { 0x2B96, 0x2B97 }, { 0x2BBA, 0x2BBC }, { 0x2BC9, 0x2BC9 },
+ { 0x2BD3, 0x2BEB }, { 0x2BF0, 0x2BFF }, { 0x2C2F, 0x2C2F },
+ { 0x2C5F, 0x2C5F }, { 0x2CF4, 0x2CF8 }, { 0x2D26, 0x2D26 },
+ { 0x2D28, 0x2D2C }, { 0x2D2E, 0x2D2F }, { 0x2D68, 0x2D6E },
+ { 0x2D71, 0x2D7E }, { 0x2D97, 0x2D9F }, { 0x2DA7, 0x2DA7 },
+ { 0x2DAF, 0x2DAF }, { 0x2DB7, 0x2DB7 }, { 0x2DBF, 0x2DBF },
+ { 0x2DC7, 0x2DC7 }, { 0x2DCF, 0x2DCF }, { 0x2DD7, 0x2DD7 },
+ { 0x2DDF, 0x2DDF }, { 0x2E4A, 0x2E7F }, { 0x2E9A, 0x2E9A },
+ { 0x2EF4, 0x2EFF }, { 0x2FD6, 0x2FEF }, { 0x2FFC, 0x2FFF },
+ { 0x3040, 0x3040 }, { 0x3097, 0x3098 }, { 0x3100, 0x3104 },
+ { 0x312F, 0x3130 }, { 0x318F, 0x318F }, { 0x31BB, 0x31BF },
+ { 0x31E4, 0x31EF }, { 0x321F, 0x321F }, { 0x32FF, 0x32FF },
+ { 0x4DB6, 0x4DBF }, { 0x9FD6, 0x9FFF }, { 0xA48D, 0xA48F },
+ { 0xA4C7, 0xA4CF }, { 0xA62C, 0xA63F }, { 0xA6F8, 0xA6FF },
+ { 0xA7AF, 0xA7AF }, { 0xA7B8, 0xA7F6 }, { 0xA82C, 0xA82F },
+ { 0xA83A, 0xA83F }, { 0xA878, 0xA87F }, { 0xA8C6, 0xA8CD },
+ { 0xA8DA, 0xA8DF }, { 0xA8FE, 0xA8FF }, { 0xA954, 0xA95E },
+ { 0xA97D, 0xA97F }, { 0xA9CE, 0xA9CE }, { 0xA9DA, 0xA9DD },
+ { 0xA9FF, 0xA9FF }, { 0xAA37, 0xAA3F }, { 0xAA4E, 0xAA4F },
+ { 0xAA5A, 0xAA5B }, { 0xAAC3, 0xAADA }, { 0xAAF7, 0xAB00 },
+ { 0xAB07, 0xAB08 }, { 0xAB0F, 0xAB10 }, { 0xAB17, 0xAB1F },
+ { 0xAB27, 0xAB27 }, { 0xAB2F, 0xAB2F }, { 0xAB66, 0xAB6F },
+ { 0xABEE, 0xABEF }, { 0xABFA, 0xABFF }, { 0xD7A4, 0xD7AF },
+ { 0xD7C7, 0xD7CA }, { 0xD7FC, 0xDFFF }, { 0xFA6E, 0xFA6F },
+ { 0xFADA, 0xFAFF }, { 0xFB07, 0xFB12 }, { 0xFB18, 0xFB1C },
+ { 0xFB37, 0xFB37 }, { 0xFB3D, 0xFB3D }, { 0xFB3F, 0xFB3F },
+ { 0xFB42, 0xFB42 }, { 0xFB45, 0xFB45 }, { 0xFBC2, 0xFBD2 },
+ { 0xFD40, 0xFD4F }, { 0xFD90, 0xFD91 }, { 0xFDC8, 0xFDEF },
+ { 0xFDFE, 0xFDFF }, { 0xFE1A, 0xFE1F }, { 0xFE53, 0xFE53 },
+ { 0xFE67, 0xFE67 }, { 0xFE6C, 0xFE6F }, { 0xFE75, 0xFE75 },
+ { 0xFEFD, 0xFEFE }, { 0xFF00, 0xFF00 }, { 0xFFBF, 0xFFC1 },
+ { 0xFFC8, 0xFFC9 }, { 0xFFD0, 0xFFD1 }, { 0xFFD8, 0xFFD9 },
+ { 0xFFDD, 0xFFDF }, { 0xFFE7, 0xFFE7 }, { 0xFFEF, 0xFFF8 },
+ { 0xFFFE, 0xFFFF }, { 0x1000C, 0x1000C }, { 0x10027, 0x10027 },
+ { 0x1003B, 0x1003B }, { 0x1003E, 0x1003E }, { 0x1004E, 0x1004F },
+ { 0x1005E, 0x1007F }, { 0x100FB, 0x100FF }, { 0x10103, 0x10106 },
+ { 0x10134, 0x10136 }, { 0x1018F, 0x1018F }, { 0x1019C, 0x1019F },
+ { 0x101A1, 0x101CF }, { 0x101FE, 0x1027F }, { 0x1029D, 0x1029F },
+ { 0x102D1, 0x102DF }, { 0x102FC, 0x102FF }, { 0x10324, 0x1032C },
+ { 0x1034B, 0x1034F }, { 0x1037B, 0x1037F }, { 0x1039E, 0x1039E },
+ { 0x103C4, 0x103C7 }, { 0x103D6, 0x103FF }, { 0x1049E, 0x1049F },
+ { 0x104AA, 0x104AF }, { 0x104D4, 0x104D7 }, { 0x104FC, 0x104FF },
+ { 0x10528, 0x1052F }, { 0x10564, 0x1056E }, { 0x10570, 0x105FF },
+ { 0x10737, 0x1073F }, { 0x10756, 0x1075F }, { 0x10768, 0x107FF },
+ { 0x10806, 0x10807 }, { 0x10809, 0x10809 }, { 0x10836, 0x10836 },
+ { 0x10839, 0x1083B }, { 0x1083D, 0x1083E }, { 0x10856, 0x10856 },
+ { 0x1089F, 0x108A6 }, { 0x108B0, 0x108DF }, { 0x108F3, 0x108F3 },
+ { 0x108F6, 0x108FA }, { 0x1091C, 0x1091E }, { 0x1093A, 0x1093E },
+ { 0x10940, 0x1097F }, { 0x109B8, 0x109BB }, { 0x109D0, 0x109D1 },
+ { 0x10A04, 0x10A04 }, { 0x10A07, 0x10A0B }, { 0x10A14, 0x10A14 },
+ { 0x10A18, 0x10A18 }, { 0x10A34, 0x10A37 }, { 0x10A3B, 0x10A3E },
+ { 0x10A48, 0x10A4F }, { 0x10A59, 0x10A5F }, { 0x10AA0, 0x10ABF },
+ { 0x10AE7, 0x10AEA }, { 0x10AF7, 0x10AFF }, { 0x10B36, 0x10B38 },
+ { 0x10B56, 0x10B57 }, { 0x10B73, 0x10B77 }, { 0x10B92, 0x10B98 },
+ { 0x10B9D, 0x10BA8 }, { 0x10BB0, 0x10BFF }, { 0x10C49, 0x10C7F },
+ { 0x10CB3, 0x10CBF }, { 0x10CF3, 0x10CF9 }, { 0x10D00, 0x10E5F },
+ { 0x10E7F, 0x10FFF }, { 0x1104E, 0x11051 }, { 0x11070, 0x1107E },
+ { 0x110C2, 0x110CF }, { 0x110E9, 0x110EF }, { 0x110FA, 0x110FF },
+ { 0x11135, 0x11135 }, { 0x11144, 0x1114F }, { 0x11177, 0x1117F },
+ { 0x111CE, 0x111CF }, { 0x111E0, 0x111E0 }, { 0x111F5, 0x111FF },
+ { 0x11212, 0x11212 }, { 0x1123F, 0x1127F }, { 0x11287, 0x11287 },
+ { 0x11289, 0x11289 }, { 0x1128E, 0x1128E }, { 0x1129E, 0x1129E },
+ { 0x112AA, 0x112AF }, { 0x112EB, 0x112EF }, { 0x112FA, 0x112FF },
+ { 0x11304, 0x11304 }, { 0x1130D, 0x1130E }, { 0x11311, 0x11312 },
+ { 0x11329, 0x11329 }, { 0x11331, 0x11331 }, { 0x11334, 0x11334 },
+ { 0x1133A, 0x1133B }, { 0x11345, 0x11346 }, { 0x11349, 0x1134A },
+ { 0x1134E, 0x1134F }, { 0x11351, 0x11356 }, { 0x11358, 0x1135C },
+ { 0x11364, 0x11365 }, { 0x1136D, 0x1136F }, { 0x11375, 0x113FF },
+ { 0x1145A, 0x1145A }, { 0x1145C, 0x1145C }, { 0x1145E, 0x1147F },
+ { 0x114C8, 0x114CF }, { 0x114DA, 0x1157F }, { 0x115B6, 0x115B7 },
+ { 0x115DE, 0x115FF }, { 0x11645, 0x1164F }, { 0x1165A, 0x1165F },
+ { 0x1166D, 0x1167F }, { 0x116B8, 0x116BF }, { 0x116CA, 0x116FF },
+ { 0x1171A, 0x1171C }, { 0x1172C, 0x1172F }, { 0x11740, 0x1189F },
+ { 0x118F3, 0x118FE }, { 0x11900, 0x119FF }, { 0x11A48, 0x11A4F },
+ { 0x11A84, 0x11A85 }, { 0x11A9D, 0x11A9D }, { 0x11AA3, 0x11ABF },
+ { 0x11AF9, 0x11BFF }, { 0x11C09, 0x11C09 }, { 0x11C37, 0x11C37 },
+ { 0x11C46, 0x11C4F }, { 0x11C6D, 0x11C6F }, { 0x11C90, 0x11C91 },
+ { 0x11CA8, 0x11CA8 }, { 0x11CB7, 0x11CFF }, { 0x11D07, 0x11D07 },
+ { 0x11D0A, 0x11D0A }, { 0x11D37, 0x11D39 }, { 0x11D3B, 0x11D3B },
+ { 0x11D3E, 0x11D3E }, { 0x11D48, 0x11D4F }, { 0x11D5A, 0x11FFF },
+ { 0x1239A, 0x123FF }, { 0x1246F, 0x1246F }, { 0x12475, 0x1247F },
+ { 0x12544, 0x12FFF }, { 0x1342F, 0x143FF }, { 0x14647, 0x167FF },
+ { 0x16A39, 0x16A3F }, { 0x16A5F, 0x16A5F }, { 0x16A6A, 0x16A6D },
+ { 0x16A70, 0x16ACF }, { 0x16AEE, 0x16AEF }, { 0x16AF6, 0x16AFF },
+ { 0x16B46, 0x16B4F }, { 0x16B5A, 0x16B5A }, { 0x16B62, 0x16B62 },
+ { 0x16B78, 0x16B7C }, { 0x16B90, 0x16EFF }, { 0x16F45, 0x16F4F },
+ { 0x16F7F, 0x16F8E }, { 0x16FA0, 0x16FDF }, { 0x16FE2, 0x187FF },
+ { 0x18AF3, 0x1AFFF }, { 0x1B11F, 0x1B16F }, { 0x1B2FC, 0x1BBFF },
+ { 0x1BC6B, 0x1BC6F }, { 0x1BC7D, 0x1BC7F }, { 0x1BC89, 0x1BC8F },
+ { 0x1BC9A, 0x1BC9B }, { 0x1BCA4, 0x1CFFF }, { 0x1D0F6, 0x1D0FF },
+ { 0x1D127, 0x1D128 }, { 0x1D1E9, 0x1D1FF }, { 0x1D246, 0x1D2FF },
+ { 0x1D357, 0x1D35F }, { 0x1D372, 0x1D3FF }, { 0x1D455, 0x1D455 },
+ { 0x1D49D, 0x1D49D }, { 0x1D4A0, 0x1D4A1 }, { 0x1D4A3, 0x1D4A4 },
+ { 0x1D4A7, 0x1D4A8 }, { 0x1D4AD, 0x1D4AD }, { 0x1D4BA, 0x1D4BA },
+ { 0x1D4BC, 0x1D4BC }, { 0x1D4C4, 0x1D4C4 }, { 0x1D506, 0x1D506 },
+ { 0x1D50B, 0x1D50C }, { 0x1D515, 0x1D515 }, { 0x1D51D, 0x1D51D },
+ { 0x1D53A, 0x1D53A }, { 0x1D53F, 0x1D53F }, { 0x1D545, 0x1D545 },
+ { 0x1D547, 0x1D549 }, { 0x1D551, 0x1D551 }, { 0x1D6A6, 0x1D6A7 },
+ { 0x1D7CC, 0x1D7CD }, { 0x1DA8C, 0x1DA9A }, { 0x1DAA0, 0x1DAA0 },
+ { 0x1DAB0, 0x1DFFF }, { 0x1E007, 0x1E007 }, { 0x1E019, 0x1E01A },
+ { 0x1E022, 0x1E022 }, { 0x1E025, 0x1E025 }, { 0x1E02B, 0x1E7FF },
+ { 0x1E8C5, 0x1E8C6 }, { 0x1E8D7, 0x1E8FF }, { 0x1E94B, 0x1E94F },
+ { 0x1E95A, 0x1E95D }, { 0x1E960, 0x1EDFF }, { 0x1EE04, 0x1EE04 },
+ { 0x1EE20, 0x1EE20 }, { 0x1EE23, 0x1EE23 }, { 0x1EE25, 0x1EE26 },
+ { 0x1EE28, 0x1EE28 }, { 0x1EE33, 0x1EE33 }, { 0x1EE38, 0x1EE38 },
+ { 0x1EE3A, 0x1EE3A }, { 0x1EE3C, 0x1EE41 }, { 0x1EE43, 0x1EE46 },
+ { 0x1EE48, 0x1EE48 }, { 0x1EE4A, 0x1EE4A }, { 0x1EE4C, 0x1EE4C },
+ { 0x1EE50, 0x1EE50 }, { 0x1EE53, 0x1EE53 }, { 0x1EE55, 0x1EE56 },
+ { 0x1EE58, 0x1EE58 }, { 0x1EE5A, 0x1EE5A }, { 0x1EE5C, 0x1EE5C },
+ { 0x1EE5E, 0x1EE5E }, { 0x1EE60, 0x1EE60 }, { 0x1EE63, 0x1EE63 },
+ { 0x1EE65, 0x1EE66 }, { 0x1EE6B, 0x1EE6B }, { 0x1EE73, 0x1EE73 },
+ { 0x1EE78, 0x1EE78 }, { 0x1EE7D, 0x1EE7D }, { 0x1EE7F, 0x1EE7F },
+ { 0x1EE8A, 0x1EE8A }, { 0x1EE9C, 0x1EEA0 }, { 0x1EEA4, 0x1EEA4 },
+ { 0x1EEAA, 0x1EEAA }, { 0x1EEBC, 0x1EEEF }, { 0x1EEF2, 0x1EFFF },
+ { 0x1F02C, 0x1F02F }, { 0x1F094, 0x1F09F }, { 0x1F0AF, 0x1F0B0 },
+ { 0x1F0C0, 0x1F0C0 }, { 0x1F0D0, 0x1F0D0 }, { 0x1F0F6, 0x1F0FF },
+ { 0x1F10D, 0x1F10F }, { 0x1F12F, 0x1F12F }, { 0x1F16C, 0x1F16F },
+ { 0x1F1AD, 0x1F1E5 }, { 0x1F203, 0x1F20F }, { 0x1F23C, 0x1F23F },
+ { 0x1F249, 0x1F24F }, { 0x1F252, 0x1F25F }, { 0x1F266, 0x1F2FF },
+ { 0x1F6D5, 0x1F6DF }, { 0x1F6ED, 0x1F6EF }, { 0x1F6F9, 0x1F6FF },
+ { 0x1F774, 0x1F77F }, { 0x1F7D5, 0x1F7FF }, { 0x1F80C, 0x1F80F },
+ { 0x1F848, 0x1F84F }, { 0x1F85A, 0x1F85F }, { 0x1F888, 0x1F88F },
+ { 0x1F8AE, 0x1F8FF }, { 0x1F90C, 0x1F90F }, { 0x1F93F, 0x1F93F },
+ { 0x1F94D, 0x1F94F }, { 0x1F96C, 0x1F97F }, { 0x1F998, 0x1F9BF },
+ { 0x1F9C1, 0x1F9CF }, { 0x1F9E7, 0x1FFFF }, { 0x2A6D7, 0x2F7FF },
+ { 0x2FA1E, 0xE0000 }, { 0xE0002, 0xE001F }, { 0xE0080, 0xE00FF },
+ { 0xE01F0, 0x10FFFD }
+ };
+
+ int result;
+
+#define Lookup(cmp, table) \
+ bisearch(cmp, table, \
+ (int) (sizeof(table) / sizeof(struct interval) - 1))
+
+ /* test for 8-bit control characters */
+ if (cmp == 0) {
+ result = 0;
+ } else if (cmp < 32 || (cmp >= 0x7f && cmp < 0xa0)) {
+ result = -1;
+ } else if (cmp == 0xad) {
+ result = use_latin1;
+ } else if (Lookup(cmp, combining)) {
+ /* binary search in table of non-spacing characters */
+ result = 0;
+ } else {
+ /* if we arrive here, cmp is not a combining or C0/C1 control character */
+ result = 1;
+
+ if (cmp >= 0x1100 &&
+ (cmp <= 0x115f || /* Hangul Jamo init. consonants */
+ cmp == 0x2329 ||
+ cmp == 0x232a ||
+ (cmp >= 0x2e80 && cmp <= 0x4dbf &&
+ cmp != 0x303f) || /* CJK ... Yi */
+ (cmp >= 0x4e00 && cmp <= 0xa4cf) || /* CJK Unified Ideographs, Yi */
+ (cmp >= 0xa960 && cmp <= 0xa97f) || /* Hangul Jamo Extended-A */
+ (cmp >= 0xac00 && cmp <= 0xd7a3) || /* Hangul Syllables */
+ (cmp >= 0xf900 && cmp <= 0xfaff) || /* CJK Compatibility Ideographs */
+ (cmp >= 0xfe10 && cmp <= 0xfe19) || /* Vertical forms */
+ (cmp >= 0xfe30 && cmp <= 0xfe6f) || /* CJK Compatibility Forms */
+ (cmp >= 0xff00 && cmp <= 0xff60) || /* Fullwidth Forms */
+ (cmp >= 0xffe0 && cmp <= 0xffe6) ||
+ (cmp >= 0x20000 && cmp <= 0x2fffd) ||
+ (cmp >= 0x30000 && cmp <= 0x3fffd))) {
+ result = 2;
+ }
+ if (cmp >= unknowns[0].first && Lookup(cmp, unknowns)) {
+ result = -1;
+ }
+ }
+ return result;
+}
+
+
+int mk_wcswidth(const wchar_t *pwcs, size_t n)
+{
+ int width = 0;
+
+ for (;*pwcs && n-- > 0; pwcs++) {
+ int w;
+
+ if ((w = mk_wcwidth(*pwcs)) < 0)
+ return -1;
+ else
+ width += w;
+ }
+
+ return width;
+}
+
+
+/*
+ * The following functions are the same as mk_wcwidth() and
+ * mk_wcwidth_cjk(), except that spacing characters in the East Asian
+ * Ambiguous (A) category as defined in Unicode Technical Report #11
+ * have a column width of 2. This variant might be useful for users of
+ * CJK legacy encodings who want to migrate to UCS without changing
+ * the traditional terminal character-width behaviour. It is not
+ * otherwise recommended for general use.
+ */
+int mk_wcwidth_cjk(wchar_t ucs)
+{
+ /* sorted list of non-overlapping intervals of East Asian Ambiguous
+ * characters, generated by
+ *
+ * uniset +WIDTH-A -cat=Me -cat=Mn -cat=Cf \
+ * +E000..F8FF \
+ * +F0000..FFFFD \
+ * +100000..10FFFD c
+ *
+ * "WIDTH-A" is a file extracted from EastAsianWidth.txt by selecting
+ * only those with width "A", and omitting:
+ *
+ * 0xAD
+ * all lines with "COMBINING"
+ *
+ * (uniset does not recognize the range expressions in WIDTH-A).
+ */
+ static const struct interval ambiguous[] = {
+ { 0x00A1, 0x00A1 }, { 0x00A4, 0x00A4 }, { 0x00A7, 0x00A8 },
+ { 0x00AA, 0x00AA }, { 0x00AE, 0x00AE }, { 0x00B0, 0x00B4 },
+ { 0x00B6, 0x00BA }, { 0x00BC, 0x00BF }, { 0x00C6, 0x00C6 },
+ { 0x00D0, 0x00D0 }, { 0x00D7, 0x00D8 }, { 0x00DE, 0x00E1 },
+ { 0x00E6, 0x00E6 }, { 0x00E8, 0x00EA }, { 0x00EC, 0x00ED },
+ { 0x00F0, 0x00F0 }, { 0x00F2, 0x00F3 }, { 0x00F7, 0x00FA },
+ { 0x00FC, 0x00FC }, { 0x00FE, 0x00FE }, { 0x0101, 0x0101 },
+ { 0x0111, 0x0111 }, { 0x0113, 0x0113 }, { 0x011B, 0x011B },
+ { 0x0126, 0x0127 }, { 0x012B, 0x012B }, { 0x0131, 0x0133 },
+ { 0x0138, 0x0138 }, { 0x013F, 0x0142 }, { 0x0144, 0x0144 },
+ { 0x0148, 0x014B }, { 0x014D, 0x014D }, { 0x0152, 0x0153 },
+ { 0x0166, 0x0167 }, { 0x016B, 0x016B }, { 0x01CE, 0x01CE },
+ { 0x01D0, 0x01D0 }, { 0x01D2, 0x01D2 }, { 0x01D4, 0x01D4 },
+ { 0x01D6, 0x01D6 }, { 0x01D8, 0x01D8 }, { 0x01DA, 0x01DA },
+ { 0x01DC, 0x01DC }, { 0x0251, 0x0251 }, { 0x0261, 0x0261 },
+ { 0x02C4, 0x02C4 }, { 0x02C7, 0x02C7 }, { 0x02C9, 0x02CB },
+ { 0x02CD, 0x02CD }, { 0x02D0, 0x02D0 }, { 0x02D8, 0x02DB },
+ { 0x02DD, 0x02DD }, { 0x02DF, 0x02DF }, { 0x0391, 0x03A1 },
+ { 0x03A3, 0x03A9 }, { 0x03B1, 0x03C1 }, { 0x03C3, 0x03C9 },
+ { 0x0401, 0x0401 }, { 0x0410, 0x044F }, { 0x0451, 0x0451 },
+ { 0x2010, 0x2010 }, { 0x2013, 0x2016 }, { 0x2018, 0x2019 },
+ { 0x201C, 0x201D }, { 0x2020, 0x2022 }, { 0x2024, 0x2027 },
+ { 0x2030, 0x2030 }, { 0x2032, 0x2033 }, { 0x2035, 0x2035 },
+ { 0x203B, 0x203B }, { 0x203E, 0x203E }, { 0x2074, 0x2074 },
+ { 0x207F, 0x207F }, { 0x2081, 0x2084 }, { 0x20AC, 0x20AC },
+ { 0x2103, 0x2103 }, { 0x2105, 0x2105 }, { 0x2109, 0x2109 },
+ { 0x2113, 0x2113 }, { 0x2116, 0x2116 }, { 0x2121, 0x2122 },
+ { 0x2126, 0x2126 }, { 0x212B, 0x212B }, { 0x2153, 0x2154 },
+ { 0x215B, 0x215E }, { 0x2160, 0x216B }, { 0x2170, 0x2179 },
+ { 0x2189, 0x2189 }, { 0x2190, 0x2199 }, { 0x21B8, 0x21B9 },
+ { 0x21D2, 0x21D2 }, { 0x21D4, 0x21D4 }, { 0x21E7, 0x21E7 },
+ { 0x2200, 0x2200 }, { 0x2202, 0x2203 }, { 0x2207, 0x2208 },
+ { 0x220B, 0x220B }, { 0x220F, 0x220F }, { 0x2211, 0x2211 },
+ { 0x2215, 0x2215 }, { 0x221A, 0x221A }, { 0x221D, 0x2220 },
+ { 0x2223, 0x2223 }, { 0x2225, 0x2225 }, { 0x2227, 0x222C },
+ { 0x222E, 0x222E }, { 0x2234, 0x2237 }, { 0x223C, 0x223D },
+ { 0x2248, 0x2248 }, { 0x224C, 0x224C }, { 0x2252, 0x2252 },
+ { 0x2260, 0x2261 }, { 0x2264, 0x2267 }, { 0x226A, 0x226B },
+ { 0x226E, 0x226F }, { 0x2282, 0x2283 }, { 0x2286, 0x2287 },
+ { 0x2295, 0x2295 }, { 0x2299, 0x2299 }, { 0x22A5, 0x22A5 },
+ { 0x22BF, 0x22BF }, { 0x2312, 0x2312 }, { 0x2460, 0x24E9 },
+ { 0x24EB, 0x254B }, { 0x2550, 0x2573 }, { 0x2580, 0x258F },
+ { 0x2592, 0x2595 }, { 0x25A0, 0x25A1 }, { 0x25A3, 0x25A9 },
+ { 0x25B2, 0x25B3 }, { 0x25B6, 0x25B7 }, { 0x25BC, 0x25BD },
+ { 0x25C0, 0x25C1 }, { 0x25C6, 0x25C8 }, { 0x25CB, 0x25CB },
+ { 0x25CE, 0x25D1 }, { 0x25E2, 0x25E5 }, { 0x25EF, 0x25EF },
+ { 0x2605, 0x2606 }, { 0x2609, 0x2609 }, { 0x260E, 0x260F },
+ { 0x261C, 0x261C }, { 0x261E, 0x261E }, { 0x2640, 0x2640 },
+ { 0x2642, 0x2642 }, { 0x2660, 0x2661 }, { 0x2663, 0x2665 },
+ { 0x2667, 0x266A }, { 0x266C, 0x266D }, { 0x266F, 0x266F },
+ { 0x269E, 0x269F }, { 0x26BF, 0x26BF }, { 0x26C6, 0x26CD },
+ { 0x26CF, 0x26D3 }, { 0x26D5, 0x26E1 }, { 0x26E3, 0x26E3 },
+ { 0x26E8, 0x26E9 }, { 0x26EB, 0x26F1 }, { 0x26F4, 0x26F4 },
+ { 0x26F6, 0x26F9 }, { 0x26FB, 0x26FC }, { 0x26FE, 0x26FF },
+ { 0x273D, 0x273D }, { 0x2776, 0x277F }, { 0x2B56, 0x2B59 },
+ { 0x3248, 0x324F }, { 0xE000, 0xF8FF }, { 0xFFFD, 0xFFFD },
+ { 0x1F100, 0x1F10A }, { 0x1F110, 0x1F12D }, { 0x1F130, 0x1F169 },
+ { 0x1F170, 0x1F18D }, { 0x1F18F, 0x1F190 }, { 0x1F19B, 0x1F1AC },
+ { 0xF0000, 0xFFFFD }, { 0x100000, 0x10FFFD }
+ };
+
+ /* binary search in table of non-spacing characters */
+ if (Lookup((unsigned long) ucs, ambiguous))
+ return 2;
+
+ return mk_wcwidth(ucs);
+}
+
+
+int mk_wcswidth_cjk(const wchar_t *pwcs, size_t n)
+{
+ int width = 0;
+
+ for (;*pwcs && n-- > 0; pwcs++) {
+ int w;
+
+ if ((w = mk_wcwidth_cjk(*pwcs)) < 0)
+ return -1;
+ else
+ width += w;
+ }
+
+ return width;
+}
diff --git a/src/wcwidth.h b/src/wcwidth.h
new file mode 100644
index 0000000..dde7c89
--- /dev/null
+++ b/src/wcwidth.h
@@ -0,0 +1,47 @@
+/* $XTermId: wcwidth.h,v 1.14 2017/06/18 17:56:35 tom Exp $ */
+
+/* $XFree86: xc/programs/xterm/wcwidth.h,v 1.5 2005/05/03 00:38:25 dickey Exp $ */
+
+/*
+ * Copyright 2000-2005,2017 by Thomas E. Dickey
+ *
+ * All Rights Reserved
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name(s) of the above copyright
+ * holders shall not be used in advertising or otherwise to promote the
+ * sale, use or other dealings in this Software without prior written
+ * authorization.
+ */
+#ifndef included_wcwidth_h
+#define included_wcwidth_h 1
+
+#include <stddef.h>
+
+extern void mk_wcwidth_init(int mode);
+
+extern int mk_wcswidth(const wchar_t * pwcs, size_t n);
+extern int mk_wcswidth_cjk(const wchar_t * pwcs, size_t n);
+extern int mk_wcwidth(wchar_t ucs);
+extern int mk_wcwidth_cjk(wchar_t ucs);
+extern int wcswidth_cjk(const wchar_t * pwcs, size_t n);
+
+#endif /* included_wcwidth_h */
diff --git a/src/win_tcp.opt b/src/win_tcp.opt
new file mode 100644
index 0000000..7fcb9fd
--- /dev/null
+++ b/src/win_tcp.opt
@@ -0,0 +1 @@
+twg$tcp:[netdist.lib]twglib/library
diff --git a/test/ALT88592.html b/test/ALT88592.html
new file mode 100644
index 0000000..419e699
--- /dev/null
+++ b/test/ALT88592.html
@@ -0,0 +1,171 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<HTML>
+<HEAD>
+<TITLE>Character table modified and enhanced for iso8859-2 - ALT test</TITLE>
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-2">
+<LINK REV="made" HREF="mailto:lynx-dev@nongnu.org">
+<LINK REV="owner" HREF="http://mail.gnu.org/mailman/listinfo/lynx-dev/">
+<!-- A BASE tag for the SRC attributes of dummy images.
+ They should be inaccessible so that the ALT text will be shown in graphical browsers.
+ Use file: to save network resources. -->
+<BASE HREF="file://localhost/this.path.intentionally.invalid/">
+</HEAD>
+
+<BODY>
+
+<H1 ALIGN=center>iso8859-2 plus table - ALT test</H1>
+
+<PRE>
+Description Code Entity name
+=================================== ============ ==============
+quotation mark <IMG SRC=X ALT=" &amp;#34; --> &#34; &amp;quot; --> &quot;">
+ampersand <IMG SRC=X ALT=" &amp;#38; --> &#38; &amp;amp; --> &amp;">
+less-than sign <IMG SRC=X ALT=" &amp;#60; --> &#60; &amp;lt; --> &lt;">
+greater-than sign <IMG SRC=X ALT=" &amp;#62; --> &#62; &amp;gt; --> &gt;">
+
+Description Char Code Entity name
+=================================== ==== ============ ==============
+non-breaking space <IMG SRC=X ALT="   &amp;#160; --> &#160; &amp;nbsp; --> &nbsp;">
+capital A, ogonek <IMG SRC=X ALT=" ¡ &amp;#260; --> &#260; &amp;Aogon; --> &Aogon;">
+breve <IMG SRC=X ALT=" {¢} {&amp;#728;}-->{&#728;} {&amp;breve;} -->{&breve;}">
+capital L, stroke <IMG SRC=X ALT=" £ &amp;#321; --> &#321; &amp;Lstrok; --> &Lstrok;">
+general currency sign <IMG SRC=X ALT=" ¤ &amp;#164; --> &#164; &amp;curren; --> &curren;">
+capital L, caron <IMG SRC=X ALT=" ¥ &amp;#317; --> &#317; &amp;Lcaron; --> &Lcaron;">
+capital S, acute accent <IMG SRC=X ALT=" ¦ &amp;#346; --> &#346; &amp;Sacute; --> &Sacute;">
+section sign <IMG SRC=X ALT=" § &amp;#167; --> &#167; &amp;sect; --> &sect;">
+umlaut (dieresis) <IMG SRC=X ALT=" ¨ &amp;#168; --> &#168; &amp;uml; --> &uml;">
+ <IMG SRC=X ALT=" &amp;die; --> &die;">
+capital S, caron <IMG SRC=X ALT=" © &amp;#352; --> &#352; &amp;Scaron; --> &Scaron;">
+capital S, cedilla <IMG SRC=X ALT=" ª &amp;#350; --> &#350; &amp;Scedil; --> &Scedil;">
+capital T, caron <IMG SRC=X ALT=" « &amp;#356; --> &#356; &amp;Tcaron; --> &Tcaron;">
+capital Z, acute accent <IMG SRC=X ALT=" ¬ &amp;#377; --> &#377; &amp;Zacute; --> &Zacute;">
+soft hyphen <IMG SRC=X ALT=" [­] [&amp;#173;]-->[&#173;] [&amp;shy;] -->[&shy;]">
+capital Z, caron <IMG SRC=X ALT=" ® &amp;#381; --> &#381; &amp;Zcaron; --> &Zcaron;">
+capital Z, dot above <IMG SRC=X ALT=" ¯ &amp;#379; --> &#379; &amp;Zdot; --> &Zdot;">
+degree sign <IMG SRC=X ALT=" ° &amp;#176; --> &#176; &amp;deg; --> &deg;">
+small a, ogonek <IMG SRC=X ALT=" ± &amp;#261; --> &#261; &amp;aogon; --> &aogon;">
+ogonek <IMG SRC=X ALT=" {²} {&amp;#731;}-->{&#731;} {&amp;ogon;} -->{&ogon;}">
+small l, stroke <IMG SRC=X ALT=" ³ &amp;#322; --> &#322; &amp;lstrok; --> &lstrok;">
+acute accent <IMG SRC=X ALT=" ´ &amp;#180; --> &#180; &amp;acute; --> &acute;">
+small l, caron <IMG SRC=X ALT=" µ &amp;#318; --> &#318; &amp;lcaron; --> &lcaron;">
+small s, acute accent <IMG SRC=X ALT=" ¶ &amp;#347; --> &#347; &amp;sacute; --> &sacute;">
+caron <IMG SRC=X ALT=" {·} {&amp;#711;}-->{&#711;} {&amp;caron;} -->{&caron;}">
+cedilla <IMG SRC=X ALT=" ¸ &amp;#184; --> &#184; &amp;cedil; --> &cedil;">
+small s, caron <IMG SRC=X ALT=" ¹ &amp;#353; --> &#353; &amp;scaron; --> &scaron;">
+small s, cedilla <IMG SRC=X ALT=" º &amp;#351; --> &#351; &amp;scedil; --> &scedil;">
+small t, caron <IMG SRC=X ALT=" » &amp;#357; --> &#357; &amp;tcaron; --> &tcaron;">
+small z, acute accent <IMG SRC=X ALT=" ¼ &amp;#378; --> &#378; &amp;zacute; --> &zacute;">
+double acute accent <IMG SRC=X ALT=" {½} {&amp;#733;}-->{&#733;} {&amp;dblac;} -->{&dblac;}">
+small z, caron <IMG SRC=X ALT=" ¾ &amp;#382; --> &#382; &amp;zcaron; --> &zcaron;">
+small z, dot above <IMG SRC=X ALT=" ¿ &amp;#380; --> &#380; &amp;zdot; --> &zdot; ">
+capital R, acute accent <IMG SRC=X ALT=" À &amp;#340; --> &#340; &amp;Racute; --> &Racute;">
+capital A, acute accent <IMG SRC=X ALT=" Á &amp;#193; --> &#193; &amp;Aacute; --> &Aacute;">
+capital A, circumflex accent <IMG SRC=X ALT=" Â &amp;#194; --> &#194; &amp;Acirc; --> &Acirc;">
+capital A, breve <IMG SRC=X ALT=" Ã &amp;#258; --> &#258; &amp;Abreve; --> &Abreve;">
+capital A, dieresis or umlaut mark <IMG SRC=X ALT=" Ä &amp;#196; --> &#196; &amp;Auml; --> &Auml;">
+capital L, acute accent <IMG SRC=X ALT=" Å &amp;#313; --> &#313; &amp;Lacute; --> &Lacute;">
+capital C, acute accent <IMG SRC=X ALT=" Æ &amp;#262; --> &#262; &amp;Cacute; --> &Cacute;">
+capital C, cedilla <IMG SRC=X ALT=" Ç &amp;#199; --> &#199; &amp;Ccedil; --> &Ccedil;">
+capital C, caron <IMG SRC=X ALT=" È &amp;#268; --> &#268; &amp;Ccaron; --> &Ccaron;">
+capital E, acute accent <IMG SRC=X ALT=" É &amp;#201; --> &#201; &amp;Eacute; --> &Eacute;">
+capital E, ogonek <IMG SRC=X ALT=" Ê &amp;#280; --> &#280; &amp;Eogon; --> &Eogon;">
+capital E, dieresis or umlaut mark <IMG SRC=X ALT=" Ë &amp;#203; --> &#203; &amp;Euml; --> &Euml;">
+capital E, caron <IMG SRC=X ALT=" Ì &amp;#282; --> &#282; &amp;Ecaron; --> &Ecaron;">
+capital I, acute accent <IMG SRC=X ALT=" Í &amp;#205; --> &#205; &amp;Iacute; --> &Iacute;">
+capital I, circumflex accent <IMG SRC=X ALT=" Î &amp;#206; --> &#206; &amp;Icirc; --> &Icirc;">
+capital D, caron <IMG SRC=X ALT=" Ï &amp;#270; --> &#270; &amp;Dcaron; --> &Dcaron;">
+capital D, stroke <IMG SRC=X ALT=" Ð &amp;#272; --> &#272; &amp;Dstrok; --> &Dstrok;">
+capital Eth, Icelandic <IMG SRC=X ALT=" N/A &amp;#208; --> &#208; &amp;ETH; --> &ETH;">
+capital N, acute accent <IMG SRC=X ALT=" Ñ &amp;#323; --> &#323; &amp;Nacute; --> &Nacute;">
+capital N, caron <IMG SRC=X ALT=" Ò &amp;#327; --> &#327; &amp;Ncaron; --> &Ncaron;">
+capital O, acute accent <IMG SRC=X ALT=" Ó &amp;#211; --> &#211; &amp;Oacute; --> &Oacute;">
+capital O, circumflex accent <IMG SRC=X ALT=" Ô &amp;#212; --> &#212; &amp;Ocirc; --> &Ocirc;">
+capital O, double acute accent <IMG SRC=X ALT=" Õ &amp;#368; --> &#368; &amp;Odblac; --> &Odblac;">
+capital O, dieresis or umlaut mark <IMG SRC=X ALT=" Ö &amp;#214; --> &#214; &amp;Ouml; --> &Ouml;">
+multiply sign <IMG SRC=X ALT=" × &amp;#215; --> &#215; &amp;times; --> &times;">
+capital R, caron <IMG SRC=X ALT=" Ø &amp;#344; --> &#344; &amp;Rcaron; --> &Rcaron;">
+capital U, ring <IMG SRC=X ALT=" Ù &amp;#366; --> &#366; &amp;Uring; --> &Uring;">
+capital U, acute accent <IMG SRC=X ALT=" Ú &amp;#218; --> &#218; &amp;Uacute; --> &Uacute;">
+capital U, double acute accent <IMG SRC=X ALT=" Û &amp;#368; --> &#368; &amp;Udblac; --> &Udblac;">
+capital U, dieresis or umlaut mark <IMG SRC=X ALT=" Ü &amp;#220; --> &#220; &amp;Uuml; --> &Uuml;">
+capital Y, acute accent <IMG SRC=X ALT=" Ý &amp;#221; --> &#221; &amp;Yacute; --> &Yacute;">
+capital T, cedilla <IMG SRC=X ALT=" Þ &amp;#354; --> &#354; &amp;Tcedil; --> &Tcedil;">
+small sharp s, German (sz ligature) <IMG SRC=X ALT=" ß &amp;#223; --> &#223; &amp;szlig; --> &szlig;">
+small r, acute accent <IMG SRC=X ALT=" à &amp;#341; --> &#341; &amp;racute; --> &racute;">
+small a, acute accent <IMG SRC=X ALT=" á &amp;#225; --> &#225; &amp;aacute; --> &aacute;">
+small a, circumflex accent <IMG SRC=X ALT=" â &amp;#226; --> &#226; &amp;acirc; --> &acirc;">
+small a, breve <IMG SRC=X ALT=" ã &amp;#259; --> &#259; &amp;abreve; --> &abreve;">
+small a, dieresis or umlaut mark <IMG SRC=X ALT=" ä &amp;#228; --> &#228; &amp;auml; --> &auml;">
+small l, acute accent <IMG SRC=X ALT=" å &amp;#314; --> &#314; &amp;lacute; --> &lacute;">
+small c, acute accent <IMG SRC=X ALT=" æ &amp;#263; --> &#263; &amp;cacute; --> &cacute;">
+small c, cedilla <IMG SRC=X ALT=" ç &amp;#231; --> &#231; &amp;ccedil; --> &ccedil;">
+small c, caron <IMG SRC=X ALT=" è &amp;#269; --> &#269; &amp;ccaron; --> &ccaron;">
+small e, acute accent <IMG SRC=X ALT=" é &amp;#233; --> &#233; &amp;eacute; --> &eacute;">
+small e, ogonek <IMG SRC=X ALT=" ê &amp;#281; --> &#281; &amp;eogon; --> &eogon;">
+small e, dieresis or umlaut mark <IMG SRC=X ALT=" ë &amp;#235; --> &#235; &amp;euml; --> &euml;">
+small e, caron <IMG SRC=X ALT=" ì &amp;#283; --> &#283; &amp;ecaron; --> &ecaron;">
+small i, acute accent <IMG SRC=X ALT=" í &amp;#237; --> &#237; &amp;iacute; --> &iacute;">
+small i, circumflex accent <IMG SRC=X ALT=" î &amp;#238; --> &#238; &amp;icirc; --> &icirc;">
+small d, caron <IMG SRC=X ALT=" ï &amp;#271; --> &#271; &amp;dcaron; --> &dcaron;">
+small d, stroke <IMG SRC=X ALT=" ð &amp;#273; --> &#273; &amp;dstrok; --> &dstrok;">
+small eth, Icelandic <IMG SRC=X ALT=" N/A &amp;#240; --> &#240; &amp;eth; --> &eth;">
+small n, acute accent <IMG SRC=X ALT=" ñ &amp;#324; --> &#324; &amp;nacute; --> &nacute;">
+small n, caron <IMG SRC=X ALT=" ò &amp;#328; --> &#328; &amp;ncaron; --> &ncaron;">
+small o, acute accent <IMG SRC=X ALT=" ó &amp;#243; --> &#243; &amp;oacute; --> &oacute;">
+small o, circumflex accent <IMG SRC=X ALT=" ô &amp;#244; --> &#244; &amp;ocirc; --> &ocirc;">
+small o, double acute accent <IMG SRC=X ALT=" õ &amp;#369; --> &#369; &amp;odblac; --> &odblac;">
+small o, dieresis or umlaut mark <IMG SRC=X ALT=" ö &amp;#246; --> &#246; &amp;ouml; --> &ouml;">
+division sign <IMG SRC=X ALT=" ÷ &amp;#247; --> &#247; &amp;divide; --> &divide;">
+small r, caron <IMG SRC=X ALT=" ø &amp;#345; --> &#345; &amp;rcaron; --> &rcaron;">
+small u, ring <IMG SRC=X ALT=" ù &amp;#367; --> &#367; &amp;uring; --> &uring;">
+small u, acute accent <IMG SRC=X ALT=" ú &amp;#250; --> &#250; &amp;uacute; --> &uacute;">
+small u, double acute accent <IMG SRC=X ALT=" û &amp;#369; --> &#369; &amp;udblac; --> &udblac;">
+small u, dieresis or umlaut mark <IMG SRC=X ALT=" ü &amp;#252; --> &#252; &amp;uuml; --> &uuml;">
+small y, acute accent <IMG SRC=X ALT=" ý &amp;#253; --> &#253; &amp;yacute; --> &yacute;">
+small t, cedilla <IMG SRC=X ALT=" þ &amp;#355; --> &#355; &amp;tcedil; --> &tcedil;">
+dot above <IMG SRC=X ALT=" {ÿ} {&amp;#729;}-->{&#729;} {&amp;dot;} -->{&dot;}">
+
+Some other characters of interest Char Code Entity name
+=================================== ==== ============ ==============
+capital AE diphthong (ligature) <IMG SRC=X ALT=" N/A &amp;#198; --> &#198; &amp;AElig; --> &AElig;">
+small ae diphthong (ligature) <IMG SRC=X ALT=" N/A &amp;#230; --> &#230; &amp;aelig; --> &aelig;">
+capital OE ligature <IMG SRC=X ALT=" N/A {&amp;#338;}-->{&#338;} {&amp;OElig;} -->{&OElig;}">
+small oe ligature <IMG SRC=X ALT=" N/A {&amp;#339;}-->{&#339;} {&amp;oelig;} -->{&oelig;}">
+copyright <IMG SRC=X ALT=" N/A &amp;#169; --> &#169; &amp;copy; --> &copy;">
+registered trademark <IMG SRC=X ALT=" N/A &amp;#174; --> &#174; &amp;reg; --> &reg;">
+trademark sign <IMG SRC=X ALT=" N/A &amp;#8482;--> &#8482; &amp;trade; --> &trade;">
+em space <IMG SRC=X ALT=" N/A [&amp;#8195;]->[&#8195;] [&amp;emsp;] -->[&emsp;]">
+en space <IMG SRC=X ALT=" N/A [&amp;#8194;]->[&#8194;] [&amp;ensp;] -->[&ensp;]">
+1/3-em space <IMG SRC=X ALT=" N/A [&amp;#8196;]->[&#8196;] [&amp;emsp13;] -->[&emsp13;]">
+1/4-em space <IMG SRC=X ALT=" N/A [&amp;#8197;]->[&#8197;] [&amp;emsp14;] -->[&emsp14;]">
+thin space <IMG SRC=X ALT=" N/A [&amp;#8201;]->[&#8201;] [&amp;thinsp;]-->[&thinsp;]">
+hair space <IMG SRC=X ALT=" N/A [&amp;#8202;]->[&#8202;] [&amp;hairsp;]-->[&hairsp;]">
+em dash <IMG SRC=X ALT=" N/A [&amp;#8212;]->[&#8212;] [&amp;mdash;] -->[&mdash;]">
+en dash <IMG SRC=X ALT=" N/A [&amp;#8211;]->[&#8211;] [&amp;ndash;] -->[&ndash;]">
+
+</PRE><!-- </PRE> no HotJava preBeta hackx - kw -->
+<!-- second /PRE is a hack for HotJava 1.0 preBeta 1 -->
+<HR>
+<P>
+Characters not found in ISO-8859-2 have "N/A" in the <TT>Char</TT> column.
+Some characters for which I could not find entity names in either
+<A HREF="http://www.internic.net/rfc/rfc2070.txt">RFC 2070</A>
+or the
+<A HREF="ftp://www.ucc.ie/pub/sgml/">ISOlat1, ISOlat2, ISOnum, ISOpub and ISOtech</A>
+sets (the ones included by Peter Flynn's
+<A HREF="http://www.ucc.ie/doc/www/html/dtds/htmlpro.html">HTML Pro DTD</A>)
+are shown enclosed in <TT>{</TT>braces<TT>}</TT>.
+</P>
+<P>
+See Martin Ramsch's original
+<A CHARSET="iso-8859-1" HREF="https://web.archive.org/web/19970119160651/http://www.uni-passau.de:80/~ramsch/iso8859-1.html">ISO-8859-1 Table</A>
+for related info and links, and for some notes on entity names.
+This file is mostly just an adaptation of his table
+to the ISO-8859-2 character set.
+
+<HR>
+
+<ADDRESS>kweide@tezcat.com 1997-03-09</ADDRESS>
+
+</BODY>
+</HTML>
diff --git a/test/ISO_LATIN1_test.html b/test/ISO_LATIN1_test.html
new file mode 100644
index 0000000..d767978
--- /dev/null
+++ b/test/ISO_LATIN1_test.html
@@ -0,0 +1,83 @@
+<!DOCTYPE html public "-//IETF//DTD HTML 3.0//EN">
+<html>
+<head>
+<title>Test of minimal ISO LATIN1 character set</title>
+<link rev="made" href="mailto:lynx-dev@nongnu.org">
+</head>
+
+<body>
+<h1>minimal ISO LATIN1 text entities</h1>
+<ul>
+ <li>"&AElig;", /* capital AE diphthong (ligature) */
+ <li>"&Aacute;", /* capital A, acute accent */
+ <li>"&Acirc;", /* capital A, circumflex accent */
+ <li>"&Agrave;", /* capital A, grave accent */
+ <li>"&Aring;", /* capital A, ring */
+ <li>"&Atilde;", /* capital A, tilde */
+ <li>"&Auml;", /* capital A, dieresis or umlaut mark */
+ <li>"&Ccedil;", /* capital C, cedilla */
+ <li>"&ETH;", /* capital Eth, Icelandic */
+ <li>"&Eacute;", /* capital E, acute accent */
+ <li>"&Ecirc;", /* capital E, circumflex accent */
+ <li>"&Egrave;", /* capital E, grave accent */
+ <li>"&Euml;", /* capital E, dieresis or umlaut mark */
+ <li>"&Iacute;", /* capital I, acute accent */
+ <li>"&Icirc;", /* capital I, circumflex accent */
+ <li>"&Igrave;", /* capital I, grave accent */
+ <li>"&Iuml;", /* capital I, dieresis or umlaut mark */
+ <li>"&Ntilde;", /* capital N, tilde */
+ <li>"&Oacute;", /* capital O, acute accent */
+ <li>"&Ocirc;", /* capital O, circumflex accent */
+ <li>"&Ograve;", /* capital O, grave accent */
+ <li>"&Oslash;", /* capital O, slash */
+ <li>"&Otilde;", /* capital O, tilde */
+ <li>"&Ouml;", /* capital O, dieresis or umlaut mark */
+ <li>"&THORN;", /* capital THORN, Icelandic */
+ <li>"&Uacute;", /* capital U, acute accent */
+ <li>"&Ucirc;", /* capital U, circumflex accent */
+ <li>"&Ugrave;", /* capital U, grave accent */
+ <li>"&Uuml;", /* capital U, dieresis or umlaut mark */
+ <li>"&Yacute;", /* capital Y, acute accent */
+ <li>"&aacute;", /* small a, acute accent */
+ <li>"&acirc;", /* small a, circumflex accent */
+ <li>"&aelig;", /* small ae diphthong (ligature) */
+ <li>"&agrave;", /* small a, grave accent */
+ <li>"&amp;", /* ampersand */
+ <li>"&aring;", /* small a, ring */
+ <li>"&atilde;", /* small a, tilde */
+ <li>"&auml;", /* small a, dieresis or umlaut mark */
+ <li>"&ccedil;", /* small c, cedilla */
+ <li>"&eacute;", /* small e, acute accent */
+ <li>"&ecirc;", /* small e, circumflex accent */
+ <li>"&egrave;", /* small e, grave accent */
+ <li>"&emsp;", /* emsp, em space - not collapsed */
+ <li>"&ensp;", /* ensp, en space - not collapsed */
+ <li>"&eth;", /* small eth, Icelandic */
+ <li>"&euml;", /* small e, dieresis or umlaut mark */
+ <li>"&gt;", /* greater than */
+ <li>"&iacute;", /* small i, acute accent */
+ <li>"&icirc;", /* small i, circumflex accent */
+ <li>"&igrave;", /* small i, grave accent */
+ <li>"&iuml;", /* small i, dieresis or umlaut mark */
+ <li>"&lt;", /* less than */
+ <li>"&nbsp;", /* nbsp, non breaking space */
+ <li>"&ntilde;", /* small n, tilde */
+ <li>"&oacute;", /* small o, acute accent */
+ <li>"&ocirc;", /* small o, circumflex accent */
+ <li>"&ograve;", /* small o, grave accent */
+ <li>"&oslash;", /* small o, slash */
+ <li>"&otilde;", /* small o, tilde */
+ <li>"&ouml;", /* small o, dieresis or umlaut mark */
+ <li>"&quot;", /* quote, '"' */
+ <li>"&szlig;", /* small sharp s, German (sz ligature) */
+ <li>"&thorn;", /* small thorn, Icelandic */
+ <li>"&uacute;", /* small u, acute accent */
+ <li>"&ucirc;", /* small u, circumflex accent */
+ <li>"&ugrave;", /* small u, grave accent */
+ <li>"&uuml;", /* small u, dieresis or umlaut mark */
+ <li>"&yacute;", /* small y, acute accent */
+ <li>"&yuml;", /* small y, dieresis or umlaut mark */
+</ul>
+
+</body>
+</html>
diff --git a/test/README.txt b/test/README.txt
new file mode 100644
index 0000000..21419f2
--- /dev/null
+++ b/test/README.txt
@@ -0,0 +1,8 @@
+ISO_LATIN1_test.html and iso-8859-1.html are for testing the translation of
+HTML entities with the character sets that are selectable via the 'o'ptions
+menu.
+
+TestComment.html and tabtest.html are for testing comment and TAB handling.
+
+Any other files in this directory do not represent a test suite. They
+are used during program testing to track down odd and mysterious bugs.
diff --git a/test/TestComment.html b/test/TestComment.html
new file mode 100644
index 0000000..873169f
--- /dev/null
+++ b/test/TestComment.html
@@ -0,0 +1,50 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0 Level 2//EN">
+<html>
+<head>
+<title>HTML Comment Parser Test</title>
+<link rev="made" href="mailto:pg@sweng.stortek.com">
+<base href="http://nyx10.cs.du.edu:8001/~pgilmart/TestComment.html">
+</head>
+
+<body>
+<P> Test of the HTML/SGML comment syntax, as given in the W3 HTML Spec:
+<a
+href="http://www.w3.org/hypertext/WWW/MarkUp/html-spec/html-spec_3.html#SEC15">
+Comments</a>
+
+<P>See especially, the footnote:
+<a
+href="http://www.w3.org/hypertext/WWW/MarkUp/html-spec/html-spec_foot.html#FOOT10"
+>(10)</a>
+
+<P>
+Co-vary the LYK_MINIMAL and LYK_HISTORICAL command key toggles (use the
+'k'eymap command to see their key bindings) to establish Valid, Minimal
+or Historical comment parsing, and toggle trace mode on (Ctrl-T), to see
+how comment parsing is affected.
+
+<P>Case 01 through Case 14 should appear
+as short separate paragraphs with the case numbers aligned vertically.
+Some noise characters may appear to the right as a byproduct of code present
+for error recovery, but there should be no noise before each case number.
+
+<P> Case <!-- trivial --> | 01 | Trivial
+<P> Case <!-- extra hyphens and spaces -- -- -- > | 02 | Hyphens and Spaces
+<P> Case <!-- extra < < < --> | 03 | Extra LT --> --> -->
+<P> Case <!-- balanced < < < > > > --> | 04 | Balanced
+<P> Case <!-- extra > -- --> > still in comment --> | 05 | Extra GT
+<P> Case <!-- stuff between -- and > -- still in comment --> | 06 | Stuff Inside
+<P> Case <!-- Extra <!-- -- Second Comment --> | 07 | Extra Open --> -->
+<P> Case <!-- New Line between --
+ -- Second Comment --
+ > | 08 | New line
+<P> Case <!---> degenerate --> | 09 | Degenerate <P> Case <!----> | 10 | Empty
+<P> Case <!-- perverse <!--> | 11 | Perverse --> --> -->
+<P> Case <!-- Comment -- -- and a half > this is still in comment -- > | 12 | Multiple Comments --> --> -->
+<P> Case <!> | 13 | Zero Comments
+<P> Case <!-- < >
+< > Still in comment --> | 14 | Last
+
+<P>&lt;<STRONG>Tests completed!</STRONG>&gt;
+</body>
+</html>
diff --git a/test/X b/test/X
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/test/X
diff --git a/test/bad-html.html b/test/bad-html.html
new file mode 100644
index 0000000..8c0b9dc
--- /dev/null
+++ b/test/bad-html.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html PUBLIC "-//IETF//DTD HTML 3.0//EN">
+<HTML>
+<HEAD>
+<TITLE>Examples of "Bad HTML" per Lynx</TITLE>
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
+<LINK REV="made" HREF="mailto:lynx-dev@nongnu.org">
+<LINK REV="owner" HREF="http://mail.gnu.org/mailman/listinfo/lynx-dev/">
+</HEAD>
+
+<BODY>
+<h2>Unterminated TEXTAREA</h2>
+<form action="http://localhost/cgi-bin/bogus-parms" method="get">
+<textarea name="50cols" cols="50" rows=3>
+This is not empty.
+</textarea>
+<br>
+<textarea name="50percent" cols="50%" rows=3>
+This seems to have a button.
+<button>Button 1</button>
+</textarea>
+<hr>
+<input type="submit" value="Submit this form">
+<br>
+<input type="reset" value="Reset this form">
+</form>
+
+<h2>Unterminated SELECT</h2>
+<select>
+<option>first option</option>
+<option>second option</option>
+<option>third option</option>
+</notselect>
+<br>
+<select>
+<option>first option</option>
+<option>second option</option>
+<option>third option</option>
+</select>
+
+<h2>OPTION not within SELECT</h2>
+<option>third option</option>
+
+<h2>TEXTAREA ending without starting</h2>
+</textarea>
+
+</BODY>
diff --git a/test/c1.html b/test/c1.html
new file mode 100644
index 0000000..6ec70aa
--- /dev/null
+++ b/test/c1.html
@@ -0,0 +1,63 @@
+<!DOCTYPE html PUBLIC "-//IETF//DTD HTML 3.0//EN">
+<HTML>
+<HEAD>
+<TITLE>Test of invalid NCRs 128-159</TITLE>
+</HEAD>
+<BODY><H2>Test of invalid NCRs 128-159</H2>
+<P>
+Authoring tools on MS Windows, in particular MS FrontPage ("WYSIWYG" HTML editor),
+generate invalid <DFN>Numerical Character References</DFN> for characters
+commonly found in positions 128...159 (0x80...0x9f) in Windows fonts. Although
+these are valid codepoints for <em>windows-1252</em> (and other
+windows-xxxx) charsets, valid NCRs always refer to the document character set
+in the SGML sense, not to the character encoding scheme (or charset). For HTML,
+the SGML document character set is fixed, it is always a subset of Unicode
+(or ISO 10646). In Unicode and its iso-8859-1 subset, values 128...159 are
+C1 control characters, they must not appear in HTML. Valid NCRs for the
+intended characters use Unicode values greater than 256.
+<p>
+Lynx tries to interpret some of the invalid codes, by assuming that they are
+windows-1252 codepoints.
+<PRE>
+
+You may want to press '\' to view the source of this test.
+
+<em>Code invalid NCR <!-- --> <tab id=c>valid NCR, description</em>
+<em> normal in ALT <a id=table></a> </em>
+
+0x80 &#x80; <IMG SRC=X ALT="&#x80;"> <tab to=c>&#x20AC; #EURO SIGN
+0x81 &#x81; <IMG SRC=X ALT="&#x81;"> <!--&#x0081;--> #NOT USED
+0x82 &#x82; <IMG SRC=X ALT="&#x82;"> <tab to=c>&#x201a; #SINGLE LOW-9 QUOTATION MARK
+0x83 &#x83; <IMG SRC=X ALT="&#x83;"> <tab to=c>&#x0192; #LATIN SMALL LETTER F WITH HOOK
+0x84 &#x84; <IMG SRC=X ALT="&#x84;"> <tab to=c>&#x201e; #DOUBLE LOW-9 QUOTATION MARK
+0x85 &#x85; <IMG SRC=X ALT="&#x85;"> <tab to=c>&#x2026; #HORIZONTAL ELLIPSIS
+0x86 &#x86; <IMG SRC=X ALT="&#x86;"> <tab to=c>&#x2020; #DAGGER
+0x87 &#x87; <IMG SRC=X ALT="&#x87;"> <tab to=c>&#x2021; #DOUBLE DAGGER
+0x88 &#x88; <IMG SRC=X ALT="&#x88;"> <tab to=c>&#x02c6; #MODIFIER LETTER CIRCUMFLEX ACCENT
+0x89 &#x89; <IMG SRC=X ALT="&#x89;"> <tab to=c>&#x2030; #PER MILLE SIGN
+0x8a &#x8a; <IMG SRC=X ALT="&#x8a;"> <tab to=c>&#x0160; #LATIN CAPITAL LETTER S WITH CARON
+0x8b &#x8b; <IMG SRC=X ALT="&#x8b;"> <tab to=c>&#x2039; #SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+0x8c &#x8c; <IMG SRC=X ALT="&#x8c;"> <tab to=c>&#x0152; #LATIN CAPITAL LIGATURE OE
+0x8d &#x8d; <IMG SRC=X ALT="&#x8d;"> <!--&#x008d;--> #NOT USED
+0x8e &#x8e; <IMG SRC=X ALT="&#x8e;"> <!--&#x008e;--> #NOT USED
+0x8f &#x8f; <IMG SRC=X ALT="&#x8f;"> <!--&#x008f;--> #NOT USED
+0x90 &#x90; <IMG SRC=X ALT="&#x90;"> <!--&#x0090;--> #NOT USED
+0x91 &#x91; <IMG SRC=X ALT="&#x91;"> <tab to=c>&#x2018; #LEFT SINGLE QUOTATION MARK
+0x92 &#x92; <IMG SRC=X ALT="&#x92;"> <tab to=c>&#x2019; #RIGHT SINGLE QUOTATION MARK
+0x93 &#x93; <IMG SRC=X ALT="&#x93;"> <tab to=c>&#x201c; #LEFT DOUBLE QUOTATION MARK
+0x94 &#x94; <IMG SRC=X ALT="&#x94;"> <tab to=c>&#x201d; #RIGHT DOUBLE QUOTATION MARK
+0x95 &#x95; <IMG SRC=X ALT="&#x95;"> <tab to=c>&#x2022; #BULLET
+0x96 &#x96; <IMG SRC=X ALT="&#x96;"> <tab to=c>&#x2013; #EN DASH
+0x97 &#x97; <IMG SRC=X ALT="&#x97;"> <tab to=c>&#x2014; #EM DASH
+0x98 &#x98; <IMG SRC=X ALT="&#x98;"> <tab to=c>&#x02dc; #SMALL TILDE
+0x99 &#x99; <IMG SRC=X ALT="&#x99;"> <tab to=c>&#x2122; #TRADE MARK SIGN
+0x9a &#x9a; <IMG SRC=X ALT="&#x9a;"> <tab to=c>&#x0161; #LATIN SMALL LETTER S WITH CARON
+0x9b &#x9b; <IMG SRC=X ALT="&#x9b;"> <tab to=c>&#x203a; #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+0x9c &#x9c; <IMG SRC=X ALT="&#x9c;"> <tab to=c>&#x0153; #LATIN SMALL LIGATURE OE
+0x9d &#x9d; <IMG SRC=X ALT="&#x9d;"> <!--&#x009d;--> #NOT USED
+0x9e &#x9e; <IMG SRC=X ALT="&#x9e;"> <!--&#x009e;--> #NOT USED
+0x9f &#x9f; <IMG SRC=X ALT="&#x9f;"> <tab to=c>&#x0178; #LATIN CAPITAL LETTER Y WITH DIAERESIS
+
+</PRE>
+</BODY>
+</HTML>
diff --git a/test/circle.html b/test/circle.html
new file mode 100644
index 0000000..dedf305
--- /dev/null
+++ b/test/circle.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+
+<html>
+<head>
+ <meta name="generator" content=
+ "HTML Tidy for Linux (vers 25 March 2009), see www.w3.org">
+
+ <title>Test ImageMap - circle</title>
+</head>
+
+<body>
+ <p>CIRCLE</p>
+</body>
+</html>
diff --git a/test/cp-1252.html b/test/cp-1252.html
new file mode 100644
index 0000000..387c92a
--- /dev/null
+++ b/test/cp-1252.html
@@ -0,0 +1,178 @@
+<!DOCTYPE html PUBLIC "-//IETF//DTD HTML 3.0//EN">
+<HTML>
+<HEAD>
+<TITLE>Character table for cp-1252</TITLE>
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=cp-1252">
+<LINK REV="made" HREF="mailto:lynx-dev@nongnu.org">
+<LINK REV="owner" HREF="http://mail.gnu.org/mailman/listinfo/lynx-dev/">
+<LINK REL="sibling" HREF="iso-8859-1.html" TITLE="iso-8859-1 test">
+<LINK REL="sibling" HREF="ALT88592.html" TITLE="iso-8859-2 ALT test">
+</HEAD>
+
+<BODY>
+
+<H1 ALIGN=center>cp-1252 table</H1>
+
+<PRE>
+Description Code Entity name
+=================================== ============ ==============
+quotation mark &amp;#34; --> &#34; &amp;quot; --> &quot;
+ampersand &amp;#38; --> &#38; &amp;amp; --> &amp;
+less-than sign &amp;#60; --> &#60; &amp;lt; --> &lt;
+greater-than sign &amp;#62; --> &#62; &amp;gt; --> &gt;
+
+Description Char Code Entity name
+=================================== ==== ============ ==============
+euro sign € &amp;128; --> &#128;
+single low-9 quotation mark ‚ &amp;130; --> &#130;
+latin small letter f with hook ƒ &amp;131; --> &#131;
+double low-9 quotation mark „ &amp;132; --> &#132;
+horizontal ellipsis … &amp;133; --> &#133;
+dagger † &amp;134; --> &#134;
+double dagger ‡ &amp;135; --> &#135;
+modifier letter circumflex accent ˆ &amp;136; --> &#136;
+per mille sign ‰ &amp;137; --> &#137;
+latin capital letter s with caron Š &amp;138; --> &#138;
+single left-pointing angle quote mark ‹ &amp;139; --> &#139;
+latin capital ligature oe Œ &amp;140; --> &#140;
+latin capital letter z with caron Ž &amp;142; --> &#142;
+
+left single quotation mark ‘ &amp;145; --> &#145;
+right single quotation mark ’ &amp;146; --> &#146;
+left double quotation mark “ &amp;147; --> &#147;
+right double quotation mark ” &amp;148; --> &#148;
+bullet • &amp;149; --> &#149;
+en dash – &amp;150; --> &#150;
+em dash — &amp;151; --> &#151;
+small tilde ˜ &amp;152; --> &#152;
+trade mark sign ™ &amp;153; --> &#153;
+latin small letter s with caron š &amp;154; --> &#154;
+single right-pointing angle quote mark › &amp;155; --> &#155;
+latin small ligature oe œ &amp;156; --> &#156;
+latin small letter z with caron ž &amp;158; --> &#158;
+latin capital letter y with diaeresis Ÿ &amp;159; --> &#159;
+
+non-breaking space   &amp;#160; --> &#160; &amp;nbsp; --> &nbsp;
+inverted exclamation ¡ &amp;#161; --> &#161; &amp;iexcl; --> &iexcl;
+cent sign ¢ &amp;#162; --> &#162; &amp;cent; --> &cent;
+pound sterling £ &amp;#163; --> &#163; &amp;pound; --> &pound;
+general currency sign ¤ &amp;#164; --> &#164; &amp;curren; --> &curren;
+yen sign ¥ &amp;#165; --> &#165; &amp;yen; --> &yen;
+broken vertical bar ¦ &amp;#166; --> &#166; &amp;brvbar; --> &brvbar;
+section sign § &amp;#167; --> &#167; &amp;sect; --> &sect;
+umlaut (dieresis) ¨ &amp;#168; --> &#168; &amp;uml; --> &uml;
+copyright © &amp;#169; --> &#169; &amp;copy; --> &copy;
+feminine ordinal ª &amp;#170; --> &#170; &amp;ordf; --> &ordf;
+left angle quote, guillemotleft « &amp;#171; --> &#171; &amp;laquo; --> &laquo;
+not sign ¬ &amp;#172; --> &#172; &amp;not; --> &not;
+soft hyphen ­ &amp;#173; --> &#173; &amp;shy; --> &shy;
+registered trademark ® &amp;#174; --> &#174; &amp;reg; --> &reg;
+macron accent ¯ &amp;#175; --> &#175; &amp;macr; --> &macr;
+
+degree sign ° &amp;#176; --> &#176; &amp;deg; --> &deg;
+plus or minus ± &amp;#177; --> &#177; &amp;plusmn; --> &plusmn;
+superscript two ² &amp;#178; --> &#178; &amp;sup2; --> &sup2;
+superscript three ³ &amp;#179; --> &#179; &amp;sup3; --> &sup3;
+acute accent ´ &amp;#180; --> &#180; &amp;acute; --> &acute;
+micro sign µ &amp;#181; --> &#181; &amp;micro; --> &micro;
+paragraph sign ¶ &amp;#182; --> &#182; &amp;para; --> &para;
+middle dot · &amp;#183; --> &#183; &amp;middot; --> &middot;
+cedilla ¸ &amp;#184; --> &#184; &amp;cedil; --> &cedil;
+superscript one ¹ &amp;#185; --> &#185; &amp;sup1; --> &sup1;
+masculine ordinal º &amp;#186; --> &#186; &amp;ordm; --> &ordm;
+right angle quote, guillemotright » &amp;#187; --> &#187; &amp;raquo; --> &raquo;
+vulgar fraction one-quarter ¼ &amp;#188; --> &#188; &amp;frac14; --> &frac14;
+vulgar fraction one-half ½ &amp;#189; --> &#189; &amp;frac12; --> &frac12;
+vulgar fraction three-fourths ¾ &amp;#190; --> &#190; &amp;frac34; --> &frac34;
+inverted question mark ¿ &amp;#191; --> &#191; &amp;iquest; --> &iquest;
+
+latin capital letter a with grave À &amp;#192; --> &#192; &amp;Agrave; --> &Agrave;
+latin capital letter a with acute Á &amp;#193; --> &#193; &amp;Aacute; --> &Aacute;
+latin capital letter a with circumflex  &amp;#194; --> &#194; &amp;Acirc; --> &Acirc;
+latin capital letter a with tilde à &amp;#195; --> &#195; &amp;Atilde; --> &Atilde;
+latin capital letter a with diaeresis Ä &amp;#196; --> &#196; &amp;Auml; --> &Auml;
+latin capital letter a with ring above Å &amp;#197; --> &#197; &amp;Aring; --> &Aring;
+latin capital letter ae Æ &amp;#198; --> &#198; &amp;AElig; --> &AElig;
+latin capital letter c with cedilla Ç &amp;#199; --> &#199; &amp;Ccedil; --> &Ccedil;
+latin capital letter e with grave È &amp;#200; --> &#200; &amp;Egrave; --> &Egrave;
+latin capital letter e with acute É &amp;#201; --> &#201; &amp;Eacute; --> &Eacute;
+latin capital letter e with circumflex Ê &amp;#202; --> &#202; &amp;Ecirc; --> &Ecirc;
+latin capital letter e with diaeresis Ë &amp;#203; --> &#203; &amp;Euml; --> &Euml;
+latin capital letter i with grave Ì &amp;#204; --> &#204; &amp;Igrave; --> &Igrave;
+latin capital letter i with acute Í &amp;#205; --> &#205; &amp;Iacute; --> &Iacute;
+latin capital letter i with circumflex Î &amp;#206; --> &#206; &amp;Icirc; --> &Icirc;
+latin capital letter i with diaeresis Ï &amp;#207; --> &#207; &amp;Iuml; --> &Iuml;
+
+latin capital letter eth Ð &amp;#208; --> &#208; &amp;ETH; --> &ETH;
+latin capital letter n with tilde Ñ &amp;#209; --> &#209; &amp;Ntilde; --> &Ntilde;
+latin capital letter o with grave Ò &amp;#210; --> &#210; &amp;Ograve; --> &Ograve;
+latin capital letter o with acute Ó &amp;#211; --> &#211; &amp;Oacute; --> &Oacute;
+latin capital letter o with circumflex Ô &amp;#212; --> &#212; &amp;Ocirc; --> &Ocirc;
+latin capital letter o with tilde Õ &amp;#213; --> &#213; &amp;Otilde; --> &Otilde;
+latin capital letter o with diaeresis Ö &amp;#214; --> &#214; &amp;Ouml; --> &Ouml;
+multiplication sign × &amp;#215; --> &#215; &amp;times; --> &times;
+latin capital letter o with stroke Ø &amp;#216; --> &#216; &amp;Oslash; --> &Oslash;
+latin capital letter u with grave Ù &amp;#217; --> &#217; &amp;Ugrave; --> &Ugrave;
+latin capital letter u with acute Ú &amp;#218; --> &#218; &amp;Uacute; --> &Uacute;
+latin capital letter u with circumflex Û &amp;#219; --> &#219; &amp;Ucirc; --> &Ucirc;
+latin capital letter u with diaeresis Ü &amp;#220; --> &#220; &amp;Uuml; --> &Uuml;
+latin capital letter y with acute Ý &amp;#221; --> &#221; &amp;Yacute; --> &Yacute;
+latin capital letter thorn Þ &amp;#222; --> &#222; &amp;THORN; --> &THORN;
+latin small letter sharp s ß &amp;#223; --> &#223; &amp;szlig; --> &szlig;
+
+latin small letter a with grave à &amp;#224; --> &#224; &amp;agrave; --> &agrave;
+latin small letter a with acute á &amp;#225; --> &#225; &amp;aacute; --> &aacute;
+latin small letter a with circumflex â &amp;#226; --> &#226; &amp;acirc; --> &acirc;
+latin small letter a with tilde ã &amp;#227; --> &#227; &amp;atilde; --> &atilde;
+latin small letter a with diaeresis ä &amp;#228; --> &#228; &amp;auml; --> &auml;
+latin small letter a with ring above å &amp;#229; --> &#229; &amp;aring; --> &aring;
+latin small letter ae æ &amp;#230; --> &#230; &amp;aelig; --> &aelig;
+latin small letter c with cedilla ç &amp;#231; --> &#231; &amp;ccedil; --> &ccedil;
+latin small letter e with grave è &amp;#232; --> &#232; &amp;egrave; --> &egrave;
+latin small letter e with acute é &amp;#233; --> &#233; &amp;eacute; --> &eacute;
+latin small letter e with circumflex ê &amp;#234; --> &#234; &amp;ecirc; --> &ecirc;
+latin small letter e with diaeresis ë &amp;#235; --> &#235; &amp;euml; --> &euml;
+latin small letter i with grave ì &amp;#236; --> &#236; &amp;igrave; --> &igrave;
+latin small letter i with acute í &amp;#237; --> &#237; &amp;iacute; --> &iacute;
+latin small letter i with circumflex î &amp;#238; --> &#238; &amp;icirc; --> &icirc;
+latin small letter i with diaeresis ï &amp;#239; --> &#239; &amp;iuml; --> &iuml;
+
+latin small letter eth ð &amp;#240; --> &#240; &amp;eth; --> &eth;
+latin small letter n with tilde ñ &amp;#241; --> &#241; &amp;ntilde; --> &ntilde;
+latin small letter o with grave ò &amp;#242; --> &#242; &amp;ograve; --> &ograve;
+latin small letter o with acute ó &amp;#243; --> &#243; &amp;oacute; --> &oacute;
+latin small letter o with circumflex ô &amp;#244; --> &#244; &amp;ocirc; --> &ocirc;
+latin small letter o with tilde õ &amp;#245; --> &#245; &amp;otilde; --> &otilde;
+latin small letter o with diaeresis ö &amp;#246; --> &#246; &amp;ouml; --> &ouml;
+division sign ÷ &amp;#247; --> &#247; &amp;divide; --> &divide;
+latin small letter o with stroke ø &amp;#248; --> &#248; &amp;oslash; --> &oslash;
+latin small letter u with grave ù &amp;#249; --> &#249; &amp;ugrave; --> &ugrave;
+latin small letter u with acute ú &amp;#250; --> &#250; &amp;uacute; --> &uacute;
+latin small letter u with circumflex û &amp;#251; --> &#251; &amp;ucirc; --> &ucirc;
+latin small letter u with diaeresis ü &amp;#252; --> &#252; &amp;uuml; --> &uuml;
+latin small letter y with acute ý &amp;#253; --> &#253; &amp;yacute; --> &yacute;
+latin small letter thorn þ &amp;#254; --> &#254; &amp;thorn; --> &thorn;
+latin small letter y with diaeresis {ÿ} {&amp;#255;}-->{&#255;} {&amp;yuml;} -->{&yuml;}
+
+Some other characters of interest Char Code Entity name
+=================================== ==== ============ ==============
+capital AE diphthong (ligature) N/A &amp;#198; --> &#198; &amp;AElig; --> &AElig;
+small ae diphthong (ligature) N/A &amp;#230; --> &#230; &amp;aelig; --> &aelig;
+capital OE ligature N/A {&amp;#338;}-->{&#338;} {&amp;OElig;} -->{&OElig;}
+small oe ligature N/A {&amp;#339;}-->{&#339;} {&amp;oelig;} -->{&oelig;}
+copyright N/A &amp;#169; --> &#169; &amp;copy; --> &copy;
+registered trademark N/A &amp;#174; --> &#174; &amp;reg; --> &reg;
+trademark sign N/A &amp;#8482;--> &#8482; &amp;trade; --> &trade;
+em space N/A [&amp;#8195;]->[&#8195;] [&amp;emsp;] -->[&emsp;]
+en space N/A [&amp;#8194;]->[&#8194;] [&amp;ensp;] -->[&ensp;]
+1/3-em space N/A [&amp;#8196;]->[&#8196;] [&amp;emsp13;] -->[&emsp13;]
+1/4-em space N/A [&amp;#8197;]->[&#8197;] [&amp;emsp14;] -->[&emsp14;]
+thin space N/A [&amp;#8201;]->[&#8201;] [&amp;thinsp;]-->[&thinsp;]
+hair space N/A [&amp;#8202;]->[&#8202;] [&amp;hairsp;]-->[&hairsp;]
+em dash N/A [&amp;#8212;]->[&#8212;] [&amp;mdash;] -->[&mdash;]
+en dash N/A [&amp;#8211;]->[&#8211;] [&amp;ndash;] -->[&ndash;]
+
+</PRE>
+
+</BODY>
+</HTML>
diff --git a/test/cp-1252a.html b/test/cp-1252a.html
new file mode 100644
index 0000000..99800a3
--- /dev/null
+++ b/test/cp-1252a.html
@@ -0,0 +1,183 @@
+<!DOCTYPE html PUBLIC "-//IETF//DTD HTML 3.0//EN">
+<HTML>
+<HEAD>
+<TITLE>Character table for cp-1252</TITLE>
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=cp-1252">
+<LINK REV="made" HREF="mailto:lynx-dev@nongnu.org">
+<LINK REV="owner" HREF="http://mail.gnu.org/mailman/listinfo/lynx-dev/">
+<LINK REL="sibling" HREF="iso-8859-1.html" TITLE="iso-8859-1 test">
+<LINK REL="sibling" HREF="ALT88592.html" TITLE="iso-8859-2 ALT test">
+</HEAD>
+
+<BODY>
+
+<H1 ALIGN=center>cp-1252 table</H1>
+
+<PRE>
+Description Code Entity name
+=================================== ============ ==============
+quotation mark &amp;#34; --> &#34; &amp;quot; --> &quot;
+ampersand &amp;#38; --> &#38; &amp;amp; --> &amp;
+less-than sign &amp;#60; --> &#60; &amp;lt; --> &lt;
+greater-than sign &amp;#62; --> &#62; &amp;gt; --> &gt;
+
+Description Char Code Entity name
+=================================== ==== ============ ==============
+euro sign € &amp;128; --> &#128;
+undefined &amp;129; --> &#129;
+single low-9 quotation mark ‚ &amp;130; --> &#130;
+latin small letter f with hook ƒ &amp;131; --> &#131;
+double low-9 quotation mark „ &amp;132; --> &#132;
+horizontal ellipsis … &amp;133; --> &#133;
+dagger † &amp;134; --> &#134;
+double dagger ‡ &amp;135; --> &#135;
+modifier letter circumflex accent ˆ &amp;136; --> &#136;
+per mille sign ‰ &amp;137; --> &#137;
+latin capital letter s with caron Š &amp;138; --> &#138;
+single left-pointing angle quote mark ‹ &amp;139; --> &#139;
+latin capital ligature oe Œ &amp;140; --> &#140;
+undefined &amp;141; --> &#141;
+latin capital letter z with caron Ž &amp;142; --> &#142;
+undefined &amp;143; --> &#143;
+
+undefined &amp;144; --> &#144;
+left single quotation mark ‘ &amp;145; --> &#145;
+right single quotation mark ’ &amp;146; --> &#146;
+left double quotation mark “ &amp;147; --> &#147;
+right double quotation mark ” &amp;148; --> &#148;
+bullet • &amp;149; --> &#149;
+en dash – &amp;150; --> &#150;
+em dash — &amp;151; --> &#151;
+small tilde ˜ &amp;152; --> &#152;
+trade mark sign ™ &amp;153; --> &#153;
+latin small letter s with caron š &amp;154; --> &#154;
+single right-pointing angle quote mark › &amp;155; --> &#155;
+latin small ligature oe œ &amp;156; --> &#156;
+undefined &amp;157; --> &#157;
+latin small letter z with caron ž &amp;158; --> &#158;
+latin capital letter y with diaeresis Ÿ &amp;159; --> &#159;
+
+non-breaking space   &amp;#160; --> &#160; &amp;nbsp; --> &nbsp;
+inverted exclamation ¡ &amp;#161; --> &#161; &amp;iexcl; --> &iexcl;
+cent sign ¢ &amp;#162; --> &#162; &amp;cent; --> &cent;
+pound sterling £ &amp;#163; --> &#163; &amp;pound; --> &pound;
+general currency sign ¤ &amp;#164; --> &#164; &amp;curren; --> &curren;
+yen sign ¥ &amp;#165; --> &#165; &amp;yen; --> &yen;
+broken vertical bar ¦ &amp;#166; --> &#166; &amp;brvbar; --> &brvbar;
+section sign § &amp;#167; --> &#167; &amp;sect; --> &sect;
+umlaut (dieresis) ¨ &amp;#168; --> &#168; &amp;uml; --> &uml;
+copyright © &amp;#169; --> &#169; &amp;copy; --> &copy;
+feminine ordinal ª &amp;#170; --> &#170; &amp;ordf; --> &ordf;
+left angle quote, guillemotleft « &amp;#171; --> &#171; &amp;laquo; --> &laquo;
+not sign ¬ &amp;#172; --> &#172; &amp;not; --> &not;
+soft hyphen ­ &amp;#173; --> &#173; &amp;shy; --> &shy;
+registered trademark ® &amp;#174; --> &#174; &amp;reg; --> &reg;
+macron accent ¯ &amp;#175; --> &#175; &amp;macr; --> &macr;
+
+degree sign ° &amp;#176; --> &#176; &amp;deg; --> &deg;
+plus or minus ± &amp;#177; --> &#177; &amp;plusmn; --> &plusmn;
+superscript two ² &amp;#178; --> &#178; &amp;sup2; --> &sup2;
+superscript three ³ &amp;#179; --> &#179; &amp;sup3; --> &sup3;
+acute accent ´ &amp;#180; --> &#180; &amp;acute; --> &acute;
+micro sign µ &amp;#181; --> &#181; &amp;micro; --> &micro;
+paragraph sign ¶ &amp;#182; --> &#182; &amp;para; --> &para;
+middle dot · &amp;#183; --> &#183; &amp;middot; --> &middot;
+cedilla ¸ &amp;#184; --> &#184; &amp;cedil; --> &cedil;
+superscript one ¹ &amp;#185; --> &#185; &amp;sup1; --> &sup1;
+masculine ordinal º &amp;#186; --> &#186; &amp;ordm; --> &ordm;
+right angle quote, guillemotright » &amp;#187; --> &#187; &amp;raquo; --> &raquo;
+vulgar fraction one-quarter ¼ &amp;#188; --> &#188; &amp;frac14; --> &frac14;
+vulgar fraction one-half ½ &amp;#189; --> &#189; &amp;frac12; --> &frac12;
+vulgar fraction three-fourths ¾ &amp;#190; --> &#190; &amp;frac34; --> &frac34;
+inverted question mark ¿ &amp;#191; --> &#191; &amp;iquest; --> &iquest;
+
+latin capital letter a with grave À &amp;#192; --> &#192; &amp;Agrave; --> &Agrave;
+latin capital letter a with acute Á &amp;#193; --> &#193; &amp;Aacute; --> &Aacute;
+latin capital letter a with circumflex  &amp;#194; --> &#194; &amp;Acirc; --> &Acirc;
+latin capital letter a with tilde à &amp;#195; --> &#195; &amp;Atilde; --> &Atilde;
+latin capital letter a with diaeresis Ä &amp;#196; --> &#196; &amp;Auml; --> &Auml;
+latin capital letter a with ring above Å &amp;#197; --> &#197; &amp;Aring; --> &Aring;
+latin capital letter ae Æ &amp;#198; --> &#198; &amp;AElig; --> &AElig;
+latin capital letter c with cedilla Ç &amp;#199; --> &#199; &amp;Ccedil; --> &Ccedil;
+latin capital letter e with grave È &amp;#200; --> &#200; &amp;Egrave; --> &Egrave;
+latin capital letter e with acute É &amp;#201; --> &#201; &amp;Eacute; --> &Eacute;
+latin capital letter e with circumflex Ê &amp;#202; --> &#202; &amp;Ecirc; --> &Ecirc;
+latin capital letter e with diaeresis Ë &amp;#203; --> &#203; &amp;Euml; --> &Euml;
+latin capital letter i with grave Ì &amp;#204; --> &#204; &amp;Igrave; --> &Igrave;
+latin capital letter i with acute Í &amp;#205; --> &#205; &amp;Iacute; --> &Iacute;
+latin capital letter i with circumflex Î &amp;#206; --> &#206; &amp;Icirc; --> &Icirc;
+latin capital letter i with diaeresis Ï &amp;#207; --> &#207; &amp;Iuml; --> &Iuml;
+
+latin capital letter eth Ð &amp;#208; --> &#208; &amp;ETH; --> &ETH;
+latin capital letter n with tilde Ñ &amp;#209; --> &#209; &amp;Ntilde; --> &Ntilde;
+latin capital letter o with grave Ò &amp;#210; --> &#210; &amp;Ograve; --> &Ograve;
+latin capital letter o with acute Ó &amp;#211; --> &#211; &amp;Oacute; --> &Oacute;
+latin capital letter o with circumflex Ô &amp;#212; --> &#212; &amp;Ocirc; --> &Ocirc;
+latin capital letter o with tilde Õ &amp;#213; --> &#213; &amp;Otilde; --> &Otilde;
+latin capital letter o with diaeresis Ö &amp;#214; --> &#214; &amp;Ouml; --> &Ouml;
+multiplication sign × &amp;#215; --> &#215; &amp;times; --> &times;
+latin capital letter o with stroke Ø &amp;#216; --> &#216; &amp;Oslash; --> &Oslash;
+latin capital letter u with grave Ù &amp;#217; --> &#217; &amp;Ugrave; --> &Ugrave;
+latin capital letter u with acute Ú &amp;#218; --> &#218; &amp;Uacute; --> &Uacute;
+latin capital letter u with circumflex Û &amp;#219; --> &#219; &amp;Ucirc; --> &Ucirc;
+latin capital letter u with diaeresis Ü &amp;#220; --> &#220; &amp;Uuml; --> &Uuml;
+latin capital letter y with acute Ý &amp;#221; --> &#221; &amp;Yacute; --> &Yacute;
+latin capital letter thorn Þ &amp;#222; --> &#222; &amp;THORN; --> &THORN;
+latin small letter sharp s ß &amp;#223; --> &#223; &amp;szlig; --> &szlig;
+
+latin small letter a with grave à &amp;#224; --> &#224; &amp;agrave; --> &agrave;
+latin small letter a with acute á &amp;#225; --> &#225; &amp;aacute; --> &aacute;
+latin small letter a with circumflex â &amp;#226; --> &#226; &amp;acirc; --> &acirc;
+latin small letter a with tilde ã &amp;#227; --> &#227; &amp;atilde; --> &atilde;
+latin small letter a with diaeresis ä &amp;#228; --> &#228; &amp;auml; --> &auml;
+latin small letter a with ring above å &amp;#229; --> &#229; &amp;aring; --> &aring;
+latin small letter ae æ &amp;#230; --> &#230; &amp;aelig; --> &aelig;
+latin small letter c with cedilla ç &amp;#231; --> &#231; &amp;ccedil; --> &ccedil;
+latin small letter e with grave è &amp;#232; --> &#232; &amp;egrave; --> &egrave;
+latin small letter e with acute é &amp;#233; --> &#233; &amp;eacute; --> &eacute;
+latin small letter e with circumflex ê &amp;#234; --> &#234; &amp;ecirc; --> &ecirc;
+latin small letter e with diaeresis ë &amp;#235; --> &#235; &amp;euml; --> &euml;
+latin small letter i with grave ì &amp;#236; --> &#236; &amp;igrave; --> &igrave;
+latin small letter i with acute í &amp;#237; --> &#237; &amp;iacute; --> &iacute;
+latin small letter i with circumflex î &amp;#238; --> &#238; &amp;icirc; --> &icirc;
+latin small letter i with diaeresis ï &amp;#239; --> &#239; &amp;iuml; --> &iuml;
+
+latin small letter eth ð &amp;#240; --> &#240; &amp;eth; --> &eth;
+latin small letter n with tilde ñ &amp;#241; --> &#241; &amp;ntilde; --> &ntilde;
+latin small letter o with grave ò &amp;#242; --> &#242; &amp;ograve; --> &ograve;
+latin small letter o with acute ó &amp;#243; --> &#243; &amp;oacute; --> &oacute;
+latin small letter o with circumflex ô &amp;#244; --> &#244; &amp;ocirc; --> &ocirc;
+latin small letter o with tilde õ &amp;#245; --> &#245; &amp;otilde; --> &otilde;
+latin small letter o with diaeresis ö &amp;#246; --> &#246; &amp;ouml; --> &ouml;
+division sign ÷ &amp;#247; --> &#247; &amp;divide; --> &divide;
+latin small letter o with stroke ø &amp;#248; --> &#248; &amp;oslash; --> &oslash;
+latin small letter u with grave ù &amp;#249; --> &#249; &amp;ugrave; --> &ugrave;
+latin small letter u with acute ú &amp;#250; --> &#250; &amp;uacute; --> &uacute;
+latin small letter u with circumflex û &amp;#251; --> &#251; &amp;ucirc; --> &ucirc;
+latin small letter u with diaeresis ü &amp;#252; --> &#252; &amp;uuml; --> &uuml;
+latin small letter y with acute ý &amp;#253; --> &#253; &amp;yacute; --> &yacute;
+latin small letter thorn þ &amp;#254; --> &#254; &amp;thorn; --> &thorn;
+latin small letter y with diaeresis {ÿ} {&amp;#255;}-->{&#255;} {&amp;yuml;} -->{&yuml;}
+
+Some other characters of interest Char Code Entity name
+=================================== ==== ============ ==============
+capital AE diphthong (ligature) N/A &amp;#198; --> &#198; &amp;AElig; --> &AElig;
+small ae diphthong (ligature) N/A &amp;#230; --> &#230; &amp;aelig; --> &aelig;
+capital OE ligature N/A {&amp;#338;}-->{&#338;} {&amp;OElig;} -->{&OElig;}
+small oe ligature N/A {&amp;#339;}-->{&#339;} {&amp;oelig;} -->{&oelig;}
+copyright N/A &amp;#169; --> &#169; &amp;copy; --> &copy;
+registered trademark N/A &amp;#174; --> &#174; &amp;reg; --> &reg;
+trademark sign N/A &amp;#8482;--> &#8482; &amp;trade; --> &trade;
+em space N/A [&amp;#8195;]->[&#8195;] [&amp;emsp;] -->[&emsp;]
+en space N/A [&amp;#8194;]->[&#8194;] [&amp;ensp;] -->[&ensp;]
+1/3-em space N/A [&amp;#8196;]->[&#8196;] [&amp;emsp13;] -->[&emsp13;]
+1/4-em space N/A [&amp;#8197;]->[&#8197;] [&amp;emsp14;] -->[&emsp14;]
+thin space N/A [&amp;#8201;]->[&#8201;] [&amp;thinsp;]-->[&thinsp;]
+hair space N/A [&amp;#8202;]->[&#8202;] [&amp;hairsp;]-->[&hairsp;]
+em dash N/A [&amp;#8212;]->[&#8212;] [&amp;mdash;] -->[&mdash;]
+en dash N/A [&amp;#8211;]->[&#8211;] [&amp;ndash;] -->[&ndash;]
+
+</PRE>
+
+</BODY>
+</HTML>
diff --git a/test/idna-tr46.html b/test/idna-tr46.html
new file mode 100644
index 0000000..e67f287
--- /dev/null
+++ b/test/idna-tr46.html
@@ -0,0 +1,54 @@
+<!DOCTYPE HTML>
+<!--
+ https://unicode.org/reports/tr46/
+-->
+<html lang="en">
+<head>
+<title>Sample URLs from TR-46</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+</head>
+
+<body>
+<p>Samples from <em>Table 1. Deviation Characters</em></p>
+<ul>
+<li>
+<p>
+<a href="http://fa&#223;.de">test</a>
+fa&#223;.de
+</p>
+<ul>
+<li>2003: xn--bcher-kva.de</li>
+<li>2008: xn--bcher-kva.de</li>
+</ul>
+</li>
+<li>
+<p><a href="http://&#946;&#972;&#955;&#959;&#962;.com">test</a>
+&#946;&#972;&#955;&#959;&#962;.com
+</p>
+<ul>
+<li>2003: http://xn--nxasmq6b.com</li>
+<li>2008: http://xn--nxasmm1c.com</li>
+</ul>
+</li>
+<li>
+<p>
+<a href="http://&#3521;&#3530;&#8205;&#3515;&#3539;.com">test</a>
+&#3521;&#3530;&#8205;&#3515;&#3539;.com
+</p>
+<ul>
+<li>2003: http://xn--10cl1a0b.com</li>
+<li>2008: http://xn--10cl1a0b660p.com/</li>
+</ul>
+</li>
+<li>
+<p><a href="http://&#1606;&#1575;&#1605;&#1607;&#8204;&#1575;&#1740;.com">test</a>
+&#1606;&#1575;&#1605;&#1607;&#8204;&#1575;&#1740;.com
+</p>
+<ul>
+<li>2003: http://xn--mgba3gch31f.com/</li>
+<li>2008: http://xn--mgba3gch31f060k.com/</li>
+</ul>
+</li>
+</ul>
+</body>
+</html>
diff --git a/test/image.jpg b/test/image.jpg
new file mode 100644
index 0000000..5c102b8
--- /dev/null
+++ b/test/image.jpg
Binary files differ
diff --git a/test/iso-8859-1.html b/test/iso-8859-1.html
new file mode 100644
index 0000000..b9349fa
--- /dev/null
+++ b/test/iso-8859-1.html
@@ -0,0 +1,241 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!-- X-URL: http://www.ramsch.org/martin/uni/fmi-hp/iso8859-1.html -->
+<!-- Date: Tue, 28 Dec 2004 20:24:09 GMT -->
+<!-- Last-Modified: Mon, 15 May 2000 09:37:37 GMT -->
+<HTML>
+<HEAD>
+<TITLE>Martin Ramsch - iso8859-1 table</TITLE>
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
+<BASE HREF="http://www.ramsch.org/martin/uni/fmi-hp/iso8859-1.html">
+</HEAD>
+
+<BODY>
+
+<H1 ALIGN=center>iso8859-1 table</H1>
+
+<PRE>
+Description Code Entity name
+=================================== ============ ==============
+quotation mark &amp;#34; --> &#34; &amp;quot; --> &quot;
+ampersand &amp;#38; --> &#38; &amp;amp; --> &amp;
+less-than sign &amp;#60; --> &#60; &amp;lt; --> &lt;
+greater-than sign &amp;#62; --> &#62; &amp;gt; --> &gt;
+
+Description Char Code Entity name
+=================================== ==== ============ ==============
+non-breaking space   &amp;#160; --> &#160; &amp;nbsp; --> &nbsp;
+inverted exclamation ¡ &amp;#161; --> &#161; &amp;iexcl; --> &iexcl;
+cent sign ¢ &amp;#162; --> &#162; &amp;cent; --> &cent;
+pound sterling £ &amp;#163; --> &#163; &amp;pound; --> &pound;
+general currency sign ¤ &amp;#164; --> &#164; &amp;curren; --> &curren;
+yen sign ¥ &amp;#165; --> &#165; &amp;yen; --> &yen;
+broken vertical bar ¦ &amp;#166; --> &#166; &amp;brvbar; --> &brvbar;
+ Non-standard &amp;brkbar; --> &brkbar;
+section sign § &amp;#167; --> &#167; &amp;sect; --> &sect;
+umlaut (dieresis) ¨ &amp;#168; --> &#168; &amp;uml; --> &uml;
+ Non-standard &amp;die; --> &die;
+copyright © &amp;#169; --> &#169; &amp;copy; --> &copy;
+feminine ordinal ª &amp;#170; --> &#170; &amp;ordf; --> &ordf;
+left angle quote, guillemotleft « &amp;#171; --> &#171; &amp;laquo; --> &laquo;
+not sign ¬ &amp;#172; --> &#172; &amp;not; --> &not;
+soft hyphen ­ &amp;#173; --> &#173; &amp;shy; --> &shy;
+registered trademark ® &amp;#174; --> &#174; &amp;reg; --> &reg;
+macron accent ¯ &amp;#175; --> &#175; &amp;macr; --> &macr;
+ Non-standard &amp;hibar; --> &hibar;
+degree sign ° &amp;#176; --> &#176; &amp;deg; --> &deg;
+plus or minus ± &amp;#177; --> &#177; &amp;plusmn; --> &plusmn;
+superscript two ² &amp;#178; --> &#178; &amp;sup2; --> &sup2;
+superscript three ³ &amp;#179; --> &#179; &amp;sup3; --> &sup3;
+acute accent ´ &amp;#180; --> &#180; &amp;acute; --> &acute;
+micro sign µ &amp;#181; --> &#181; &amp;micro; --> &micro;
+paragraph sign ¶ &amp;#182; --> &#182; &amp;para; --> &para;
+middle dot · &amp;#183; --> &#183; &amp;middot; --> &middot;
+cedilla ¸ &amp;#184; --> &#184; &amp;cedil; --> &cedil;
+superscript one ¹ &amp;#185; --> &#185; &amp;sup1; --> &sup1;
+masculine ordinal º &amp;#186; --> &#186; &amp;ordm; --> &ordm;
+right angle quote, guillemotright » &amp;#187; --> &#187; &amp;raquo; --> &raquo;
+fraction one-fourth ¼ &amp;#188; --> &#188; &amp;frac14; --> &frac14;
+fraction one-half ½ &amp;#189; --> &#189; &amp;frac12; --> &frac12;
+fraction three-fourths ¾ &amp;#190; --> &#190; &amp;frac34; --> &frac34;
+inverted question mark ¿ &amp;#191; --> &#191; &amp;iquest; --> &iquest;
+capital A, grave accent À &amp;#192; --> &#192; &amp;Agrave; --> &Agrave;
+capital A, acute accent Á &amp;#193; --> &#193; &amp;Aacute; --> &Aacute;
+capital A, circumflex accent  &amp;#194; --> &#194; &amp;Acirc; --> &Acirc;
+capital A, tilde à &amp;#195; --> &#195; &amp;Atilde; --> &Atilde;
+capital A, dieresis or umlaut mark Ä &amp;#196; --> &#196; &amp;Auml; --> &Auml;
+capital A, ring Å &amp;#197; --> &#197; &amp;Aring; --> &Aring;
+capital AE diphthong (ligature) Æ &amp;#198; --> &#198; &amp;AElig; --> &AElig;
+capital C, cedilla Ç &amp;#199; --> &#199; &amp;Ccedil; --> &Ccedil;
+capital E, grave accent È &amp;#200; --> &#200; &amp;Egrave; --> &Egrave;
+capital E, acute accent É &amp;#201; --> &#201; &amp;Eacute; --> &Eacute;
+capital E, circumflex accent Ê &amp;#202; --> &#202; &amp;Ecirc; --> &Ecirc;
+capital E, dieresis or umlaut mark Ë &amp;#203; --> &#203; &amp;Euml; --> &Euml;
+capital I, grave accent Ì &amp;#204; --> &#204; &amp;Igrave; --> &Igrave;
+capital I, acute accent Í &amp;#205; --> &#205; &amp;Iacute; --> &Iacute;
+capital I, circumflex accent Î &amp;#206; --> &#206; &amp;Icirc; --> &Icirc;
+capital I, dieresis or umlaut mark Ï &amp;#207; --> &#207; &amp;Iuml; --> &Iuml;
+capital Eth, Icelandic Ð &amp;#208; --> &#208; &amp;ETH; --> &ETH;
+ Non-standard &amp;Dstrok; --> &Dstrok;
+capital N, tilde Ñ &amp;#209; --> &#209; &amp;Ntilde; --> &Ntilde;
+capital O, grave accent Ò &amp;#210; --> &#210; &amp;Ograve; --> &Ograve;
+capital O, acute accent Ó &amp;#211; --> &#211; &amp;Oacute; --> &Oacute;
+capital O, circumflex accent Ô &amp;#212; --> &#212; &amp;Ocirc; --> &Ocirc;
+capital O, tilde Õ &amp;#213; --> &#213; &amp;Otilde; --> &Otilde;
+capital O, dieresis or umlaut mark Ö &amp;#214; --> &#214; &amp;Ouml; --> &Ouml;
+multiply sign × &amp;#215; --> &#215; &amp;times; --> &times;
+capital O, slash Ø &amp;#216; --> &#216; &amp;Oslash; --> &Oslash;
+capital U, grave accent Ù &amp;#217; --> &#217; &amp;Ugrave; --> &Ugrave;
+capital U, acute accent Ú &amp;#218; --> &#218; &amp;Uacute; --> &Uacute;
+capital U, circumflex accent Û &amp;#219; --> &#219; &amp;Ucirc; --> &Ucirc;
+capital U, dieresis or umlaut mark Ü &amp;#220; --> &#220; &amp;Uuml; --> &Uuml;
+capital Y, acute accent Ý &amp;#221; --> &#221; &amp;Yacute; --> &Yacute;
+capital THORN, Icelandic Þ &amp;#222; --> &#222; &amp;THORN; --> &THORN;
+small sharp s, German (sz ligature) ß &amp;#223; --> &#223; &amp;szlig; --> &szlig;
+small a, grave accent à &amp;#224; --> &#224; &amp;agrave; --> &agrave;
+small a, acute accent á &amp;#225; --> &#225; &amp;aacute; --> &aacute;
+small a, circumflex accent â &amp;#226; --> &#226; &amp;acirc; --> &acirc;
+small a, tilde ã &amp;#227; --> &#227; &amp;atilde; --> &atilde;
+small a, dieresis or umlaut mark ä &amp;#228; --> &#228; &amp;auml; --> &auml;
+small a, ring å &amp;#229; --> &#229; &amp;aring; --> &aring;
+small ae diphthong (ligature) æ &amp;#230; --> &#230; &amp;aelig; --> &aelig;
+small c, cedilla ç &amp;#231; --> &#231; &amp;ccedil; --> &ccedil;
+small e, grave accent è &amp;#232; --> &#232; &amp;egrave; --> &egrave;
+small e, acute accent é &amp;#233; --> &#233; &amp;eacute; --> &eacute;
+small e, circumflex accent ê &amp;#234; --> &#234; &amp;ecirc; --> &ecirc;
+small e, dieresis or umlaut mark ë &amp;#235; --> &#235; &amp;euml; --> &euml;
+small i, grave accent ì &amp;#236; --> &#236; &amp;igrave; --> &igrave;
+small i, acute accent í &amp;#237; --> &#237; &amp;iacute; --> &iacute;
+small i, circumflex accent î &amp;#238; --> &#238; &amp;icirc; --> &icirc;
+small i, dieresis or umlaut mark ï &amp;#239; --> &#239; &amp;iuml; --> &iuml;
+small eth, Icelandic ð &amp;#240; --> &#240; &amp;eth; --> &eth;
+small n, tilde ñ &amp;#241; --> &#241; &amp;ntilde; --> &ntilde;
+small o, grave accent ò &amp;#242; --> &#242; &amp;ograve; --> &ograve;
+small o, acute accent ó &amp;#243; --> &#243; &amp;oacute; --> &oacute;
+small o, circumflex accent ô &amp;#244; --> &#244; &amp;ocirc; --> &ocirc;
+small o, tilde õ &amp;#245; --> &#245; &amp;otilde; --> &otilde;
+small o, dieresis or umlaut mark ö &amp;#246; --> &#246; &amp;ouml; --> &ouml;
+division sign ÷ &amp;#247; --> &#247; &amp;divide; --> &divide;
+small o, slash ø &amp;#248; --> &#248; &amp;oslash; --> &oslash;
+small u, grave accent ù &amp;#249; --> &#249; &amp;ugrave; --> &ugrave;
+small u, acute accent ú &amp;#250; --> &#250; &amp;uacute; --> &uacute;
+small u, circumflex accent û &amp;#251; --> &#251; &amp;ucirc; --> &ucirc;
+small u, dieresis or umlaut mark ü &amp;#252; --> &#252; &amp;uuml; --> &uuml;
+small y, acute accent ý &amp;#253; --> &#253; &amp;yacute; --> &yacute;
+small thorn, Icelandic þ &amp;#254; --> &#254; &amp;thorn; --> &thorn;
+small y, dieresis or umlaut mark ÿ &amp;#255; --> &#255; &amp;yuml; --> &yuml;
+</PRE>
+<!-- removed: second /PRE, a hack for HotJava 1.0 preBeta 1 -->
+<HR>
+
+<STRONG>How to read</STRONG> this table. The columns are
+<DL COMPACT>
+<DT>1st:<DD>textual <EM>description</EM> of the character
+<DT>2nd:<DD>character inserted directly into the HTML page as <EM>one
+ byte</EM>
+<DT>3rd:<DD>character written as <EM>numeric HTML entity</EM>, in the
+ format:<BR>"how it looks literally" <CODE>--&gt;</CODE>
+ "what your browser does with it"
+<DT>4th:<DD>character written as <EM>symbolic HTML entity</EM>, in the
+ format:<BR>"how it looks literally" <CODE>--&gt;</CODE>
+ "what your browser does with it"
+</DL>
+
+So for example, if you see something like "<CODE>&amp;divide; -->
+&amp;divide;</CODE>" in the 4th column, this means your browser
+doesn't know about the entity name "divide" and just puts it
+literally.
+
+<P>
+<STRONG>This table</STRONG> grew out of an overview of the "ISO
+Latin-1 Character Set" overview related to the Hyper-G Text Format
+(<A HREF="http://www.hyperwave.de/HTFdoc">HTF</A>).
+
+The entity names <CODE>&amp;brkbar;</CODE> and <CODE>&amp;Dstrok;</CODE>
+seem to be unique to HTF.
+
+The entity name <CODE>&amp;hibar;</CODE> has been supported by X Mosaic
+but seems to be replaced with <CODE>&amp;macr;</CODE>.
+
+The entity names <CODE>&amp;uml;</CODE> and <CODE>&amp;die;</CODE> should
+be equivalent.
+
+<P><STRONG>The standards stuff:</STRONG>
+The
+<A HREF="http://www.w3.org/hypertext/WWW/MarkUp/html-spec/">HTML 2.0 Standard</A>
+includes a section on
+<A HREF="http://www.w3.org/hypertext/WWW/MarkUp/html-spec/html-spec_9.html#SEC99">Character Entity Sets</A>
+and an overview on the
+<A HREF="http://www.w3.org/hypertext/WWW/MarkUp/html-spec/html-spec_13.html#SEC106">HTML Coded Character Set</A>
+(The entity names are derived from <A HREF="http://www.ucc.ie/info/net/isolat1.html">ISO 8879</A>).
+<BR>
+
+Or have a look at the
+<A HREF="http://www.w3.org/hypertext/WWW/MarkUp/html3/latin1.html">Latin-1 Character Entities</A>
+as listed in an draft for the
+<A HREF="http://www.w3.org/hypertext/WWW/MarkUp/html3/CoverPage.html">HTML 3.0 specification</A>.
+<BR>
+
+The
+<A HREF="http://www.w3.org/hypertext/WWW/MarkUp/HTMLPlus/htmlplus_59.html">Appendix II</A>
+of CERN's
+<A HREF="http://www.w3.org/hypertext/WWW/MarkUp/HTMLPlus/htmlplus_1.html">HTML+ Discussion Document</A>
+contains a
+<A HREF="http://www.w3.org/hypertext/WWW/MarkUp/HTMLPlus/htmlplus_table.ps">table</A>
+(in PostScript format) of the proposed character entities for HTML+ and their
+corresponding character codes for Unicode and the Adobe Latin-1 &amp; Symbol
+character sets.
+<P>
+
+<STRONG>Please note</STRONG> that there is nothing wrong with using
+characters of ISO Latin-1 above 127: the normal transmission protocol
+for the WWW,
+<A HREF="http://www.w3.org/pub/WWW/Protocols/rfc1945/rfc1945">HTTP/1.0</A>,
+uses the 8bit ISO latin-1 as default encoding.
+(Thanks to Roman
+Czyborra for pointing this out!)
+<P>
+
+<STRONG>Other information:</STRONG>
+<UL>
+
+<LI><STRONG>Kevin J. Brewer</STRONG> has done two very good pages on the subject:
+ <UL>
+ <LI><A HREF="http://www.bbsinc.com/iso8859.html">ASCII - ISO 8859-1 (Latin-1) with HTML 3.0 Entities Table</A> and
+ <LI><A HREF="http://www.bbsinc.com/iso8879.html">ISO 8879 Entities Gopher Menu</A>
+ </UL>
+
+<LI>The excellent overview on the series of
+ <A HREF="http://czyborra.com/charsets/iso8859.html">ISO 8859
+ character sets</A> compiled by Roman Czyborra.
+
+<LI>Also have a look on Alan Flavell's page of
+ <A HREF="http://ppewww.ph.gla.ac.uk/%7Eflavell/iso8859/iso8859-pointers.html">pointers
+ to information about ISO8859</A>. It's written very well!
+
+<LI>Maybe also of interest to you is the
+ <A HREF="ftp://ftp.vlsivie.tuwien.ac.at/pub/8bit/FAQ-ISO-8859-1">ISO
+ 8859-1 FAQ</A> by Michael Gschwind
+ (<A HREF="mailto:mike@vlsivie.tuwien.ac.at">mike@vlsivie.tuwien.ac.at</A>),
+ part of his page on
+ <A HREF="http://www.vlsivie.tuwien.ac.at/mike/i18n.html">Internationalization</A>.
+
+<LI>For users of X11R5 on SunOS systems: the
+ <A HREF="Compose.txt">table over the compose combinations</A>
+ (also coded <A HREF="Compose.html">with entities</A> where possible).
+ It's taken from the MIT X sources in
+ <CODE>server/ddx/sun/Compose.list</CODE>.
+
+<LI>Finally you could have a look at
+ <A HREF="ftp://ds.internic.net/rfc/rfc1345.txt">RFC 1345:
+ Character Mnemonics &amp; Character Sets</A>
+ by K. Simonsen (06/11/92, 103 pages, approx. 240 kbyte).
+
+</UL>
+
+
+<HR>
+
+<ADDRESS><A HREF="http://ramsch.home.pages.de/">Martin Ramsch</A>, 16.02.1994, 07.01.1996, 01.07.1996, 1998-10-09, 2000-05-15</ADDRESS>
+
+</BODY>
+</HTML>
diff --git a/test/iso-8859-1a.html b/test/iso-8859-1a.html
new file mode 100644
index 0000000..972329d
--- /dev/null
+++ b/test/iso-8859-1a.html
@@ -0,0 +1,275 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!-- X-URL: http://www.ramsch.org/martin/uni/fmi-hp/iso8859-1.html -->
+<!-- Date: Tue, 28 Dec 2004 20:24:09 GMT -->
+<!-- Last-Modified: Mon, 15 May 2000 09:37:37 GMT -->
+<HTML>
+<HEAD>
+<TITLE>Martin Ramsch - iso8859-1 table</TITLE>
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
+<BASE HREF="http://www.ramsch.org/martin/uni/fmi-hp/iso8859-1.html">
+</HEAD>
+
+<BODY>
+
+<H1 ALIGN=center>iso8859-1 table, with cp-1252</H1>
+
+<PRE>
+Description Code Entity name
+=================================== ============ ==============
+quotation mark &amp;#34; --> &#34; &amp;quot; --> &quot;
+ampersand &amp;#38; --> &#38; &amp;amp; --> &amp;
+less-than sign &amp;#60; --> &#60; &amp;lt; --> &lt;
+greater-than sign &amp;#62; --> &#62; &amp;gt; --> &gt;
+
+Description Char Code Entity name
+=================================== ==== ============ ==============
+euro sign € &amp;128; --> &#128;
+undefined &amp;129; --> &#129;
+single low-9 quotation mark ‚ &amp;130; --> &#130;
+latin small letter f with hook ƒ &amp;131; --> &#131;
+double low-9 quotation mark „ &amp;132; --> &#132;
+horizontal ellipsis … &amp;133; --> &#133;
+dagger † &amp;134; --> &#134;
+double dagger ‡ &amp;135; --> &#135;
+modifier letter circumflex accent ˆ &amp;136; --> &#136;
+per mille sign ‰ &amp;137; --> &#137;
+latin capital letter s with caron Š &amp;138; --> &#138;
+single left-pointing angle quote mark ‹ &amp;139; --> &#139;
+latin capital ligature oe Œ &amp;140; --> &#140;
+undefined &amp;141; --> &#141;
+latin capital letter z with caron Ž &amp;142; --> &#142;
+undefined &amp;143; --> &#143;
+
+undefined &amp;144; --> &#144;
+left single quotation mark ‘ &amp;145; --> &#145;
+right single quotation mark ’ &amp;146; --> &#146;
+left double quotation mark “ &amp;147; --> &#147;
+right double quotation mark ” &amp;148; --> &#148;
+bullet • &amp;149; --> &#149;
+en dash – &amp;150; --> &#150;
+em dash — &amp;151; --> &#151;
+small tilde ˜ &amp;152; --> &#152;
+trade mark sign ™ &amp;153; --> &#153;
+latin small letter s with caron š &amp;154; --> &#154;
+single right-pointing angle quote mark › &amp;155; --> &#155;
+latin small ligature oe œ &amp;156; --> &#156;
+undefined &amp;157; --> &#157;
+latin small letter z with caron ž &amp;158; --> &#158;
+latin capital letter y with diaeresis Ÿ &amp;159; --> &#159;
+
+non-breaking space   &amp;#160; --> &#160; &amp;nbsp; --> &nbsp;
+inverted exclamation ¡ &amp;#161; --> &#161; &amp;iexcl; --> &iexcl;
+cent sign ¢ &amp;#162; --> &#162; &amp;cent; --> &cent;
+pound sterling £ &amp;#163; --> &#163; &amp;pound; --> &pound;
+general currency sign ¤ &amp;#164; --> &#164; &amp;curren; --> &curren;
+yen sign ¥ &amp;#165; --> &#165; &amp;yen; --> &yen;
+broken vertical bar ¦ &amp;#166; --> &#166; &amp;brvbar; --> &brvbar;
+ Non-standard &amp;brkbar; --> &brkbar;
+section sign § &amp;#167; --> &#167; &amp;sect; --> &sect;
+umlaut (dieresis) ¨ &amp;#168; --> &#168; &amp;uml; --> &uml;
+ Non-standard &amp;die; --> &die;
+copyright © &amp;#169; --> &#169; &amp;copy; --> &copy;
+feminine ordinal ª &amp;#170; --> &#170; &amp;ordf; --> &ordf;
+left angle quote, guillemotleft « &amp;#171; --> &#171; &amp;laquo; --> &laquo;
+not sign ¬ &amp;#172; --> &#172; &amp;not; --> &not;
+soft hyphen ­ &amp;#173; --> &#173; &amp;shy; --> &shy;
+registered trademark ® &amp;#174; --> &#174; &amp;reg; --> &reg;
+macron accent ¯ &amp;#175; --> &#175; &amp;macr; --> &macr;
+ Non-standard &amp;hibar; --> &hibar;
+degree sign ° &amp;#176; --> &#176; &amp;deg; --> &deg;
+plus or minus ± &amp;#177; --> &#177; &amp;plusmn; --> &plusmn;
+superscript two ² &amp;#178; --> &#178; &amp;sup2; --> &sup2;
+superscript three ³ &amp;#179; --> &#179; &amp;sup3; --> &sup3;
+acute accent ´ &amp;#180; --> &#180; &amp;acute; --> &acute;
+micro sign µ &amp;#181; --> &#181; &amp;micro; --> &micro;
+paragraph sign ¶ &amp;#182; --> &#182; &amp;para; --> &para;
+middle dot · &amp;#183; --> &#183; &amp;middot; --> &middot;
+cedilla ¸ &amp;#184; --> &#184; &amp;cedil; --> &cedil;
+superscript one ¹ &amp;#185; --> &#185; &amp;sup1; --> &sup1;
+masculine ordinal º &amp;#186; --> &#186; &amp;ordm; --> &ordm;
+right angle quote, guillemotright » &amp;#187; --> &#187; &amp;raquo; --> &raquo;
+fraction one-fourth ¼ &amp;#188; --> &#188; &amp;frac14; --> &frac14;
+fraction one-half ½ &amp;#189; --> &#189; &amp;frac12; --> &frac12;
+fraction three-fourths ¾ &amp;#190; --> &#190; &amp;frac34; --> &frac34;
+inverted question mark ¿ &amp;#191; --> &#191; &amp;iquest; --> &iquest;
+capital A, grave accent À &amp;#192; --> &#192; &amp;Agrave; --> &Agrave;
+capital A, acute accent Á &amp;#193; --> &#193; &amp;Aacute; --> &Aacute;
+capital A, circumflex accent  &amp;#194; --> &#194; &amp;Acirc; --> &Acirc;
+capital A, tilde à &amp;#195; --> &#195; &amp;Atilde; --> &Atilde;
+capital A, dieresis or umlaut mark Ä &amp;#196; --> &#196; &amp;Auml; --> &Auml;
+capital A, ring Å &amp;#197; --> &#197; &amp;Aring; --> &Aring;
+capital AE diphthong (ligature) Æ &amp;#198; --> &#198; &amp;AElig; --> &AElig;
+capital C, cedilla Ç &amp;#199; --> &#199; &amp;Ccedil; --> &Ccedil;
+capital E, grave accent È &amp;#200; --> &#200; &amp;Egrave; --> &Egrave;
+capital E, acute accent É &amp;#201; --> &#201; &amp;Eacute; --> &Eacute;
+capital E, circumflex accent Ê &amp;#202; --> &#202; &amp;Ecirc; --> &Ecirc;
+capital E, dieresis or umlaut mark Ë &amp;#203; --> &#203; &amp;Euml; --> &Euml;
+capital I, grave accent Ì &amp;#204; --> &#204; &amp;Igrave; --> &Igrave;
+capital I, acute accent Í &amp;#205; --> &#205; &amp;Iacute; --> &Iacute;
+capital I, circumflex accent Î &amp;#206; --> &#206; &amp;Icirc; --> &Icirc;
+capital I, dieresis or umlaut mark Ï &amp;#207; --> &#207; &amp;Iuml; --> &Iuml;
+capital Eth, Icelandic Ð &amp;#208; --> &#208; &amp;ETH; --> &ETH;
+ Non-standard &amp;Dstrok; --> &Dstrok;
+capital N, tilde Ñ &amp;#209; --> &#209; &amp;Ntilde; --> &Ntilde;
+capital O, grave accent Ò &amp;#210; --> &#210; &amp;Ograve; --> &Ograve;
+capital O, acute accent Ó &amp;#211; --> &#211; &amp;Oacute; --> &Oacute;
+capital O, circumflex accent Ô &amp;#212; --> &#212; &amp;Ocirc; --> &Ocirc;
+capital O, tilde Õ &amp;#213; --> &#213; &amp;Otilde; --> &Otilde;
+capital O, dieresis or umlaut mark Ö &amp;#214; --> &#214; &amp;Ouml; --> &Ouml;
+multiply sign × &amp;#215; --> &#215; &amp;times; --> &times;
+capital O, slash Ø &amp;#216; --> &#216; &amp;Oslash; --> &Oslash;
+capital U, grave accent Ù &amp;#217; --> &#217; &amp;Ugrave; --> &Ugrave;
+capital U, acute accent Ú &amp;#218; --> &#218; &amp;Uacute; --> &Uacute;
+capital U, circumflex accent Û &amp;#219; --> &#219; &amp;Ucirc; --> &Ucirc;
+capital U, dieresis or umlaut mark Ü &amp;#220; --> &#220; &amp;Uuml; --> &Uuml;
+capital Y, acute accent Ý &amp;#221; --> &#221; &amp;Yacute; --> &Yacute;
+capital THORN, Icelandic Þ &amp;#222; --> &#222; &amp;THORN; --> &THORN;
+small sharp s, German (sz ligature) ß &amp;#223; --> &#223; &amp;szlig; --> &szlig;
+small a, grave accent à &amp;#224; --> &#224; &amp;agrave; --> &agrave;
+small a, acute accent á &amp;#225; --> &#225; &amp;aacute; --> &aacute;
+small a, circumflex accent â &amp;#226; --> &#226; &amp;acirc; --> &acirc;
+small a, tilde ã &amp;#227; --> &#227; &amp;atilde; --> &atilde;
+small a, dieresis or umlaut mark ä &amp;#228; --> &#228; &amp;auml; --> &auml;
+small a, ring å &amp;#229; --> &#229; &amp;aring; --> &aring;
+small ae diphthong (ligature) æ &amp;#230; --> &#230; &amp;aelig; --> &aelig;
+small c, cedilla ç &amp;#231; --> &#231; &amp;ccedil; --> &ccedil;
+small e, grave accent è &amp;#232; --> &#232; &amp;egrave; --> &egrave;
+small e, acute accent é &amp;#233; --> &#233; &amp;eacute; --> &eacute;
+small e, circumflex accent ê &amp;#234; --> &#234; &amp;ecirc; --> &ecirc;
+small e, dieresis or umlaut mark ë &amp;#235; --> &#235; &amp;euml; --> &euml;
+small i, grave accent ì &amp;#236; --> &#236; &amp;igrave; --> &igrave;
+small i, acute accent í &amp;#237; --> &#237; &amp;iacute; --> &iacute;
+small i, circumflex accent î &amp;#238; --> &#238; &amp;icirc; --> &icirc;
+small i, dieresis or umlaut mark ï &amp;#239; --> &#239; &amp;iuml; --> &iuml;
+small eth, Icelandic ð &amp;#240; --> &#240; &amp;eth; --> &eth;
+small n, tilde ñ &amp;#241; --> &#241; &amp;ntilde; --> &ntilde;
+small o, grave accent ò &amp;#242; --> &#242; &amp;ograve; --> &ograve;
+small o, acute accent ó &amp;#243; --> &#243; &amp;oacute; --> &oacute;
+small o, circumflex accent ô &amp;#244; --> &#244; &amp;ocirc; --> &ocirc;
+small o, tilde õ &amp;#245; --> &#245; &amp;otilde; --> &otilde;
+small o, dieresis or umlaut mark ö &amp;#246; --> &#246; &amp;ouml; --> &ouml;
+division sign ÷ &amp;#247; --> &#247; &amp;divide; --> &divide;
+small o, slash ø &amp;#248; --> &#248; &amp;oslash; --> &oslash;
+small u, grave accent ù &amp;#249; --> &#249; &amp;ugrave; --> &ugrave;
+small u, acute accent ú &amp;#250; --> &#250; &amp;uacute; --> &uacute;
+small u, circumflex accent û &amp;#251; --> &#251; &amp;ucirc; --> &ucirc;
+small u, dieresis or umlaut mark ü &amp;#252; --> &#252; &amp;uuml; --> &uuml;
+small y, acute accent ý &amp;#253; --> &#253; &amp;yacute; --> &yacute;
+small thorn, Icelandic þ &amp;#254; --> &#254; &amp;thorn; --> &thorn;
+small y, dieresis or umlaut mark ÿ &amp;#255; --> &#255; &amp;yuml; --> &yuml;
+</PRE>
+<!-- removed: second /PRE, a hack for HotJava 1.0 preBeta 1 -->
+<HR>
+
+<STRONG>How to read</STRONG> this table. The columns are
+<DL COMPACT>
+<DT>1st:<DD>textual <EM>description</EM> of the character
+<DT>2nd:<DD>character inserted directly into the HTML page as <EM>one
+ byte</EM>
+<DT>3rd:<DD>character written as <EM>numeric HTML entity</EM>, in the
+ format:<BR>"how it looks literally" <CODE>--&gt;</CODE>
+ "what your browser does with it"
+<DT>4th:<DD>character written as <EM>symbolic HTML entity</EM>, in the
+ format:<BR>"how it looks literally" <CODE>--&gt;</CODE>
+ "what your browser does with it"
+</DL>
+
+So for example, if you see something like "<CODE>&amp;divide; -->
+&amp;divide;</CODE>" in the 4th column, this means your browser
+doesn't know about the entity name "divide" and just puts it
+literally.
+
+<P>
+<STRONG>This table</STRONG> grew out of an overview of the "ISO
+Latin-1 Character Set" overview related to the Hyper-G Text Format
+(<A HREF="http://www.hyperwave.de/HTFdoc">HTF</A>).
+
+The entity names <CODE>&amp;brkbar;</CODE> and <CODE>&amp;Dstrok;</CODE>
+seem to be unique to HTF.
+
+The entity name <CODE>&amp;hibar;</CODE> has been supported by X Mosaic
+but seems to be replaced with <CODE>&amp;macr;</CODE>.
+
+The entity names <CODE>&amp;uml;</CODE> and <CODE>&amp;die;</CODE> should
+be equivalent.
+
+<P><STRONG>The standards stuff:</STRONG>
+The
+<A HREF="http://www.w3.org/hypertext/WWW/MarkUp/html-spec/">HTML 2.0 Standard</A>
+includes a section on
+<A HREF="http://www.w3.org/hypertext/WWW/MarkUp/html-spec/html-spec_9.html#SEC99">Character Entity Sets</A>
+and an overview on the
+<A HREF="http://www.w3.org/hypertext/WWW/MarkUp/html-spec/html-spec_13.html#SEC106">HTML Coded Character Set</A>
+(The entity names are derived from <A HREF="http://www.ucc.ie/info/net/isolat1.html">ISO 8879</A>).
+<BR>
+
+Or have a look at the
+<A HREF="http://www.w3.org/hypertext/WWW/MarkUp/html3/latin1.html">Latin-1 Character Entities</A>
+as listed in an draft for the
+<A HREF="http://www.w3.org/hypertext/WWW/MarkUp/html3/CoverPage.html">HTML 3.0 specification</A>.
+<BR>
+
+The
+<A HREF="http://www.w3.org/hypertext/WWW/MarkUp/HTMLPlus/htmlplus_59.html">Appendix II</A>
+of CERN's
+<A HREF="http://www.w3.org/hypertext/WWW/MarkUp/HTMLPlus/htmlplus_1.html">HTML+ Discussion Document</A>
+contains a
+<A HREF="http://www.w3.org/hypertext/WWW/MarkUp/HTMLPlus/htmlplus_table.ps">table</A>
+(in PostScript format) of the proposed character entities for HTML+ and their
+corresponding character codes for Unicode and the Adobe Latin-1 &amp; Symbol
+character sets.
+<P>
+
+<STRONG>Please note</STRONG> that there is nothing wrong with using
+characters of ISO Latin-1 above 127: the normal transmission protocol
+for the WWW,
+<A HREF="http://www.w3.org/pub/WWW/Protocols/rfc1945/rfc1945">HTTP/1.0</A>,
+uses the 8bit ISO latin-1 as default encoding.
+(Thanks to Roman
+Czyborra for pointing this out!)
+<P>
+
+<STRONG>Other information:</STRONG>
+<UL>
+
+<LI><STRONG>Kevin J. Brewer</STRONG> has done two very good pages on the subject:
+ <UL>
+ <LI><A HREF="http://www.bbsinc.com/iso8859.html">ASCII - ISO 8859-1 (Latin-1) with HTML 3.0 Entities Table</A> and
+ <LI><A HREF="http://www.bbsinc.com/iso8879.html">ISO 8879 Entities Gopher Menu</A>
+ </UL>
+
+<LI>The excellent overview on the series of
+ <A HREF="http://czyborra.com/charsets/iso8859.html">ISO 8859
+ character sets</A> compiled by Roman Czyborra.
+
+<LI>Also have a look on Alan Flavell's page of
+ <A HREF="http://ppewww.ph.gla.ac.uk/%7Eflavell/iso8859/iso8859-pointers.html">pointers
+ to information about ISO8859</A>. It's written very well!
+
+<LI>Maybe also of interest to you is the
+ <A HREF="ftp://ftp.vlsivie.tuwien.ac.at/pub/8bit/FAQ-ISO-8859-1">ISO
+ 8859-1 FAQ</A> by Michael Gschwind
+ (<A HREF="mailto:mike@vlsivie.tuwien.ac.at">mike@vlsivie.tuwien.ac.at</A>),
+ part of his page on
+ <A HREF="http://www.vlsivie.tuwien.ac.at/mike/i18n.html">Internationalization</A>.
+
+<LI>For users of X11R5 on SunOS systems: the
+ <A HREF="Compose.txt">table over the compose combinations</A>
+ (also coded <A HREF="Compose.html">with entities</A> where possible).
+ It's taken from the MIT X sources in
+ <CODE>server/ddx/sun/Compose.list</CODE>.
+
+<LI>Finally you could have a look at
+ <A HREF="ftp://ds.internic.net/rfc/rfc1345.txt">RFC 1345:
+ Character Mnemonics &amp; Character Sets</A>
+ by K. Simonsen (06/11/92, 103 pages, approx. 240 kbyte).
+
+</UL>
+
+
+<HR>
+
+<ADDRESS><A HREF="http://ramsch.home.pages.de/">Martin Ramsch</A>, 16.02.1994, 07.01.1996, 01.07.1996, 1998-10-09, 2000-05-15</ADDRESS>
+
+</BODY>
+</HTML>
diff --git a/test/iso-8859-2.html b/test/iso-8859-2.html
new file mode 100644
index 0000000..39380e3
--- /dev/null
+++ b/test/iso-8859-2.html
@@ -0,0 +1,174 @@
+<!DOCTYPE html PUBLIC "-//IETF//DTD HTML 3.0//EN">
+<!-- X-URL: http://www.uni-passau.de/~ramsch/iso8859-1.html -->
+<HTML>
+<HEAD>
+<TITLE>Martin Ramsch's character table modified and enhanced for iso8859-2</TITLE>
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-2">
+<LINK REV="made" HREF="mailto:lynx-dev@nongnu.org">
+<LINK REV="owner" HREF="http://mail.gnu.org/mailman/listinfo/lynx-dev/">
+<LINK REL="sibling" HREF="iso-8859-1.html" TITLE="iso-8859-1 test">
+<LINK REL="sibling" HREF="ALT88592.html" TITLE="iso-8859-2 ALT test">
+</HEAD>
+
+<BODY>
+
+<H1 ALIGN=center>iso8859-2 plus table</H1>
+
+<PRE>
+Description Code Entity name
+=================================== ============ ==============
+quotation mark &amp;#34; --> &#34; &amp;quot; --> &quot;
+ampersand &amp;#38; --> &#38; &amp;amp; --> &amp;
+less-than sign &amp;#60; --> &#60; &amp;lt; --> &lt;
+greater-than sign &amp;#62; --> &#62; &amp;gt; --> &gt;
+
+Description Char Code Entity name
+=================================== ==== ============ ==============
+non-breaking space   &amp;#160; --> &#160; &amp;nbsp; --> &nbsp;
+capital A, ogonek ¡ &amp;#260; --> &#260; &amp;Aogon; --> &Aogon;
+breve {¢} {&amp;#728;}-->{&#728;} {&amp;breve;} -->{&breve;}
+capital L, stroke £ &amp;#321; --> &#321; &amp;Lstrok; --> &Lstrok;
+general currency sign ¤ &amp;#164; --> &#164; &amp;curren; --> &curren;
+capital L, caron ¥ &amp;#317; --> &#317; &amp;Lcaron; --> &Lcaron;
+capital S, acute accent ¦ &amp;#346; --> &#346; &amp;Sacute; --> &Sacute;
+section sign § &amp;#167; --> &#167; &amp;sect; --> &sect;
+umlaut (dieresis) ¨ &amp;#168; --> &#168; &amp;uml; --> &uml;
+ &amp;die; --> &die;
+capital S, caron © &amp;#352; --> &#352; &amp;Scaron; --> &Scaron;
+capital S, cedilla ª &amp;#350; --> &#350; &amp;Scedil; --> &Scedil;
+capital T, caron « &amp;#356; --> &#356; &amp;Tcaron; --> &Tcaron;
+capital Z, acute accent ¬ &amp;#377; --> &#377; &amp;Zacute; --> &Zacute;
+soft hyphen [­] [&amp;#173;]-->[&#173;] [&amp;shy;] -->[&shy;]
+capital Z, caron ® &amp;#381; --> &#381; &amp;Zcaron; --> &Zcaron;
+capital Z, dot above ¯ &amp;#379; --> &#379; &amp;Zdot; --> &Zdot;
+degree sign ° &amp;#176; --> &#176; &amp;deg; --> &deg;
+small a, ogonek ± &amp;#261; --> &#261; &amp;aogon; --> &aogon;
+ogonek {²} {&amp;#731;}-->{&#731;} {&amp;ogon;} -->{&ogon;}
+small l, stroke ³ &amp;#322; --> &#322; &amp;lstrok; --> &lstrok;
+acute accent ´ &amp;#180; --> &#180; &amp;acute; --> &acute;
+small l, caron µ &amp;#318; --> &#318; &amp;lcaron; --> &lcaron;
+small s, acute accent ¶ &amp;#347; --> &#347; &amp;sacute; --> &sacute;
+caron {·} {&amp;#711;}-->{&#711;} {&amp;caron;} -->{&caron;}
+cedilla ¸ &amp;#184; --> &#184; &amp;cedil; --> &cedil;
+small s, caron ¹ &amp;#353; --> &#353; &amp;scaron; --> &scaron;
+small s, cedilla º &amp;#351; --> &#351; &amp;scedil; --> &scedil;
+small t, caron » &amp;#357; --> &#357; &amp;tcaron; --> &tcaron;
+small z, acute accent ¼ &amp;#378; --> &#378; &amp;zacute; --> &zacute;
+double acute accent {½} {&amp;#733;}-->{&#733;} {&amp;dblac;} -->{&dblac;}
+small z, caron ¾ &amp;#382; --> &#382; &amp;zcaron; --> &zcaron;
+small z, dot above ¿ &amp;#380; --> &#380; &amp;zdot; --> &zdot;
+capital R, acute accent À &amp;#340; --> &#340; &amp;Racute; --> &Racute;
+capital A, acute accent Á &amp;#193; --> &#193; &amp;Aacute; --> &Aacute;
+capital A, circumflex accent  &amp;#194; --> &#194; &amp;Acirc; --> &Acirc;
+capital A, breve à &amp;#258; --> &#258; &amp;Abreve; --> &Abreve;
+capital A, dieresis or umlaut mark Ä &amp;#196; --> &#196; &amp;Auml; --> &Auml;
+capital L, acute accent Å &amp;#313; --> &#313; &amp;Lacute; --> &Lacute;
+capital C, acute accent Æ &amp;#262; --> &#262; &amp;Cacute; --> &Cacute;
+capital C, cedilla Ç &amp;#199; --> &#199; &amp;Ccedil; --> &Ccedil;
+capital C, caron È &amp;#268; --> &#268; &amp;Ccaron; --> &Ccaron;
+capital E, acute accent É &amp;#201; --> &#201; &amp;Eacute; --> &Eacute;
+capital E, ogonek Ê &amp;#280; --> &#280; &amp;Eogon; --> &Eogon;
+capital E, dieresis or umlaut mark Ë &amp;#203; --> &#203; &amp;Euml; --> &Euml;
+capital E, caron Ì &amp;#282; --> &#282; &amp;Ecaron; --> &Ecaron;
+capital I, acute accent Í &amp;#205; --> &#205; &amp;Iacute; --> &Iacute;
+capital I, circumflex accent Î &amp;#206; --> &#206; &amp;Icirc; --> &Icirc;
+capital D, caron Ï &amp;#270; --> &#270; &amp;Dcaron; --> &Dcaron;
+capital D, stroke Ð &amp;#272; --> &#272; &amp;Dstrok; --> &Dstrok;
+capital Eth, Icelandic N/A &amp;#208; --> &#208; &amp;ETH; --> &ETH;
+capital N, acute accent Ñ &amp;#323; --> &#323; &amp;Nacute; --> &Nacute;
+capital N, caron Ò &amp;#327; --> &#327; &amp;Ncaron; --> &Ncaron;
+capital O, acute accent Ó &amp;#211; --> &#211; &amp;Oacute; --> &Oacute;
+capital O, circumflex accent Ô &amp;#212; --> &#212; &amp;Ocirc; --> &Ocirc;
+capital O, double acute accent Õ &amp;#368; --> &#368; &amp;Odblac; --> &Odblac;
+capital O, dieresis or umlaut mark Ö &amp;#214; --> &#214; &amp;Ouml; --> &Ouml;
+multiply sign × &amp;#215; --> &#215; &amp;times; --> &times;
+capital R, caron Ø &amp;#344; --> &#344; &amp;Rcaron; --> &Rcaron;
+capital U, ring Ù &amp;#366; --> &#366; &amp;Uring; --> &Uring;
+capital U, acute accent Ú &amp;#218; --> &#218; &amp;Uacute; --> &Uacute;
+capital U, double acute accent Û &amp;#368; --> &#368; &amp;Udblac; --> &Udblac;
+capital U, dieresis or umlaut mark Ü &amp;#220; --> &#220; &amp;Uuml; --> &Uuml;
+capital Y, acute accent Ý &amp;#221; --> &#221; &amp;Yacute; --> &Yacute;
+capital T, cedilla Þ &amp;#354; --> &#354; &amp;Tcedil; --> &Tcedil;
+small sharp s, German (sz ligature) ß &amp;#223; --> &#223; &amp;szlig; --> &szlig;
+small r, acute accent à &amp;#341; --> &#341; &amp;racute; --> &racute;
+small a, acute accent á &amp;#225; --> &#225; &amp;aacute; --> &aacute;
+small a, circumflex accent â &amp;#226; --> &#226; &amp;acirc; --> &acirc;
+small a, breve ã &amp;#259; --> &#259; &amp;abreve; --> &abreve;
+small a, dieresis or umlaut mark ä &amp;#228; --> &#228; &amp;auml; --> &auml;
+small l, acute accent å &amp;#314; --> &#314; &amp;lacute; --> &lacute;
+small c, acute accent æ &amp;#263; --> &#263; &amp;cacute; --> &cacute;
+small c, cedilla ç &amp;#231; --> &#231; &amp;ccedil; --> &ccedil;
+small c, caron è &amp;#269; --> &#269; &amp;ccaron; --> &ccaron;
+small e, acute accent é &amp;#233; --> &#233; &amp;eacute; --> &eacute;
+small e, ogonek ê &amp;#281; --> &#281; &amp;eogon; --> &eogon;
+small e, dieresis or umlaut mark ë &amp;#235; --> &#235; &amp;euml; --> &euml;
+small e, caron ì &amp;#283; --> &#283; &amp;ecaron; --> &ecaron;
+small i, acute accent í &amp;#237; --> &#237; &amp;iacute; --> &iacute;
+small i, circumflex accent î &amp;#238; --> &#238; &amp;icirc; --> &icirc;
+small d, caron ï &amp;#271; --> &#271; &amp;dcaron; --> &dcaron;
+small d, stroke ð &amp;#273; --> &#273; &amp;dstrok; --> &dstrok;
+small eth, Icelandic N/A &amp;#240; --> &#240; &amp;eth; --> &eth;
+small n, acute accent ñ &amp;#324; --> &#324; &amp;nacute; --> &nacute;
+small n, caron ò &amp;#328; --> &#328; &amp;ncaron; --> &ncaron;
+small o, acute accent ó &amp;#243; --> &#243; &amp;oacute; --> &oacute;
+small o, circumflex accent ô &amp;#244; --> &#244; &amp;ocirc; --> &ocirc;
+small o, double acute accent õ &amp;#369; --> &#369; &amp;odblac; --> &odblac;
+small o, dieresis or umlaut mark ö &amp;#246; --> &#246; &amp;ouml; --> &ouml;
+division sign ÷ &amp;#247; --> &#247; &amp;divide; --> &divide;
+small r, caron ø &amp;#345; --> &#345; &amp;rcaron; --> &rcaron;
+small u, ring ù &amp;#367; --> &#367; &amp;uring; --> &uring;
+small u, acute accent ú &amp;#250; --> &#250; &amp;uacute; --> &uacute;
+small u, double acute accent û &amp;#369; --> &#369; &amp;udblac; --> &udblac;
+small u, dieresis or umlaut mark ü &amp;#252; --> &#252; &amp;uuml; --> &uuml;
+small y, acute accent ý &amp;#253; --> &#253; &amp;yacute; --> &yacute;
+small t, cedilla þ &amp;#355; --> &#355; &amp;tcedil; --> &tcedil;
+dot above {ÿ} {&amp;#729;}-->{&#729;} {&amp;dot;} -->{&dot;}
+
+Some other characters of interest Char Code Entity name
+=================================== ==== ============ ==============
+capital AE diphthong (ligature) N/A &amp;#198; --> &#198; &amp;AElig; --> &AElig;
+small ae diphthong (ligature) N/A &amp;#230; --> &#230; &amp;aelig; --> &aelig;
+capital OE ligature N/A {&amp;#338;}-->{&#338;} {&amp;OElig;} -->{&OElig;}
+small oe ligature N/A {&amp;#339;}-->{&#339;} {&amp;oelig;} -->{&oelig;}
+copyright N/A &amp;#169; --> &#169; &amp;copy; --> &copy;
+registered trademark N/A &amp;#174; --> &#174; &amp;reg; --> &reg;
+trademark sign N/A &amp;#8482;--> &#8482; &amp;trade; --> &trade;
+em space N/A [&amp;#8195;]->[&#8195;] [&amp;emsp;] -->[&emsp;]
+en space N/A [&amp;#8194;]->[&#8194;] [&amp;ensp;] -->[&ensp;]
+1/3-em space N/A [&amp;#8196;]->[&#8196;] [&amp;emsp13;] -->[&emsp13;]
+1/4-em space N/A [&amp;#8197;]->[&#8197;] [&amp;emsp14;] -->[&emsp14;]
+thin space N/A [&amp;#8201;]->[&#8201;] [&amp;thinsp;]-->[&thinsp;]
+hair space N/A [&amp;#8202;]->[&#8202;] [&amp;hairsp;]-->[&hairsp;]
+em dash N/A [&amp;#8212;]->[&#8212;] [&amp;mdash;] -->[&mdash;]
+en dash N/A [&amp;#8211;]->[&#8211;] [&amp;ndash;] -->[&ndash;]
+
+</PRE><!-- </PRE> no HotJava preBeta hackx - kw -->
+<!-- second /PRE is a hack for HotJava 1.0 preBeta 1 -->
+<HR>
+<P>
+Characters not found in ISO-8859-2 have "N/A" in the <TT>Char</TT> column.
+Some characters for which I could not find entity names in either
+<A HREF="http://www.internic.net/rfc/rfc2070.txt">RFC 2070</A>
+or the
+<A HREF="ftp://www.ucc.ie/pub/sgml/">ISOlat1, ISOlat2, ISOnum, ISOpub and ISOtech</A>
+sets (the ones included by Peter Flynn's
+<A HREF="http://www.ucc.ie/doc/www/html/dtds/htmlpro.html">HTML Pro DTD</A>)
+are shown enclosed in <TT>{</TT>braces<TT>}</TT>.
+</P>
+<P>
+There also is a variation of this table which tests
+<A HREF="ALT88592.html">ISO-8859-2 characters and entities in ALT attributes</A>.
+</P>
+<P>
+See Martin Ramsch's original
+<A CHARSET="iso-8859-1" HREF="https://web.archive.org/web/19970119160651/http://www.uni-passau.de:80/~ramsch/iso8859-1.html">ISO-8859-1 Table</A>
+for related info and links, and for some notes on entity names.
+This file is mostly just an adaptation of his table
+to the ISO-8859-2 character set.
+</P>
+<HR>
+
+<ADDRESS>kweide@tezcat.com 1997-03-09</ADDRESS>
+
+</BODY>
+</HTML>
diff --git a/test/iso-8859-2a.html b/test/iso-8859-2a.html
new file mode 100644
index 0000000..062b1a5
--- /dev/null
+++ b/test/iso-8859-2a.html
@@ -0,0 +1,208 @@
+<!DOCTYPE html PUBLIC "-//IETF//DTD HTML 3.0//EN">
+<!-- X-URL: http://www.uni-passau.de/~ramsch/iso8859-1.html -->
+<HTML>
+<HEAD>
+<TITLE>Martin Ramsch's character table modified and enhanced for iso8859-2</TITLE>
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-2">
+<LINK REV="made" HREF="mailto:lynx-dev@nongnu.org">
+<LINK REV="owner" HREF="http://mail.gnu.org/mailman/listinfo/lynx-dev/">
+<LINK REL="sibling" HREF="iso-8859-1.html" TITLE="iso-8859-1 test">
+<LINK REL="sibling" HREF="ALT88592.html" TITLE="iso-8859-2 ALT test">
+</HEAD>
+
+<BODY>
+
+<H1 ALIGN=center>iso8859-2 plus table, and cp-1252</H1>
+
+<PRE>
+Description Code Entity name
+=================================== ============ ==============
+quotation mark &amp;#34; --> &#34; &amp;quot; --> &quot;
+ampersand &amp;#38; --> &#38; &amp;amp; --> &amp;
+less-than sign &amp;#60; --> &#60; &amp;lt; --> &lt;
+greater-than sign &amp;#62; --> &#62; &amp;gt; --> &gt;
+
+Description Char Code Entity name
+=================================== ==== ============ ==============
+euro sign € &amp;128; --> &#128;
+undefined &amp;129; --> &#129;
+single low-9 quotation mark ‚ &amp;130; --> &#130;
+latin small letter f with hook ƒ &amp;131; --> &#131;
+double low-9 quotation mark „ &amp;132; --> &#132;
+horizontal ellipsis … &amp;133; --> &#133;
+dagger † &amp;134; --> &#134;
+double dagger ‡ &amp;135; --> &#135;
+modifier letter circumflex accent ˆ &amp;136; --> &#136;
+per mille sign ‰ &amp;137; --> &#137;
+latin capital letter s with caron Š &amp;138; --> &#138;
+single left-pointing angle quote mark ‹ &amp;139; --> &#139;
+latin capital ligature oe Œ &amp;140; --> &#140;
+undefined &amp;141; --> &#141;
+latin capital letter z with caron Ž &amp;142; --> &#142;
+undefined &amp;143; --> &#143;
+
+undefined &amp;144; --> &#144;
+left single quotation mark ‘ &amp;145; --> &#145;
+right single quotation mark ’ &amp;146; --> &#146;
+left double quotation mark “ &amp;147; --> &#147;
+right double quotation mark ” &amp;148; --> &#148;
+bullet • &amp;149; --> &#149;
+en dash – &amp;150; --> &#150;
+em dash — &amp;151; --> &#151;
+small tilde ˜ &amp;152; --> &#152;
+trade mark sign ™ &amp;153; --> &#153;
+latin small letter s with caron š &amp;154; --> &#154;
+single right-pointing angle quote mark › &amp;155; --> &#155;
+latin small ligature oe œ &amp;156; --> &#156;
+undefined &amp;157; --> &#157;
+latin small letter z with caron ž &amp;158; --> &#158;
+latin capital letter y with diaeresis Ÿ &amp;159; --> &#159;
+
+non-breaking space   &amp;#160; --> &#160; &amp;nbsp; --> &nbsp;
+capital A, ogonek ¡ &amp;#260; --> &#260; &amp;Aogon; --> &Aogon;
+breve {¢} {&amp;#728;}-->{&#728;} {&amp;breve;} -->{&breve;}
+capital L, stroke £ &amp;#321; --> &#321; &amp;Lstrok; --> &Lstrok;
+general currency sign ¤ &amp;#164; --> &#164; &amp;curren; --> &curren;
+capital L, caron ¥ &amp;#317; --> &#317; &amp;Lcaron; --> &Lcaron;
+capital S, acute accent ¦ &amp;#346; --> &#346; &amp;Sacute; --> &Sacute;
+section sign § &amp;#167; --> &#167; &amp;sect; --> &sect;
+umlaut (dieresis) ¨ &amp;#168; --> &#168; &amp;uml; --> &uml;
+ &amp;die; --> &die;
+capital S, caron © &amp;#352; --> &#352; &amp;Scaron; --> &Scaron;
+capital S, cedilla ª &amp;#350; --> &#350; &amp;Scedil; --> &Scedil;
+capital T, caron « &amp;#356; --> &#356; &amp;Tcaron; --> &Tcaron;
+capital Z, acute accent ¬ &amp;#377; --> &#377; &amp;Zacute; --> &Zacute;
+soft hyphen [­] [&amp;#173;]-->[&#173;] [&amp;shy;] -->[&shy;]
+capital Z, caron ® &amp;#381; --> &#381; &amp;Zcaron; --> &Zcaron;
+capital Z, dot above ¯ &amp;#379; --> &#379; &amp;Zdot; --> &Zdot;
+degree sign ° &amp;#176; --> &#176; &amp;deg; --> &deg;
+small a, ogonek ± &amp;#261; --> &#261; &amp;aogon; --> &aogon;
+ogonek {²} {&amp;#731;}-->{&#731;} {&amp;ogon;} -->{&ogon;}
+small l, stroke ³ &amp;#322; --> &#322; &amp;lstrok; --> &lstrok;
+acute accent ´ &amp;#180; --> &#180; &amp;acute; --> &acute;
+small l, caron µ &amp;#318; --> &#318; &amp;lcaron; --> &lcaron;
+small s, acute accent ¶ &amp;#347; --> &#347; &amp;sacute; --> &sacute;
+caron {·} {&amp;#711;}-->{&#711;} {&amp;caron;} -->{&caron;}
+cedilla ¸ &amp;#184; --> &#184; &amp;cedil; --> &cedil;
+small s, caron ¹ &amp;#353; --> &#353; &amp;scaron; --> &scaron;
+small s, cedilla º &amp;#351; --> &#351; &amp;scedil; --> &scedil;
+small t, caron » &amp;#357; --> &#357; &amp;tcaron; --> &tcaron;
+small z, acute accent ¼ &amp;#378; --> &#378; &amp;zacute; --> &zacute;
+double acute accent {½} {&amp;#733;}-->{&#733;} {&amp;dblac;} -->{&dblac;}
+small z, caron ¾ &amp;#382; --> &#382; &amp;zcaron; --> &zcaron;
+small z, dot above ¿ &amp;#380; --> &#380; &amp;zdot; --> &zdot;
+capital R, acute accent À &amp;#340; --> &#340; &amp;Racute; --> &Racute;
+capital A, acute accent Á &amp;#193; --> &#193; &amp;Aacute; --> &Aacute;
+capital A, circumflex accent  &amp;#194; --> &#194; &amp;Acirc; --> &Acirc;
+capital A, breve à &amp;#258; --> &#258; &amp;Abreve; --> &Abreve;
+capital A, dieresis or umlaut mark Ä &amp;#196; --> &#196; &amp;Auml; --> &Auml;
+capital L, acute accent Å &amp;#313; --> &#313; &amp;Lacute; --> &Lacute;
+capital C, acute accent Æ &amp;#262; --> &#262; &amp;Cacute; --> &Cacute;
+capital C, cedilla Ç &amp;#199; --> &#199; &amp;Ccedil; --> &Ccedil;
+capital C, caron È &amp;#268; --> &#268; &amp;Ccaron; --> &Ccaron;
+capital E, acute accent É &amp;#201; --> &#201; &amp;Eacute; --> &Eacute;
+capital E, ogonek Ê &amp;#280; --> &#280; &amp;Eogon; --> &Eogon;
+capital E, dieresis or umlaut mark Ë &amp;#203; --> &#203; &amp;Euml; --> &Euml;
+capital E, caron Ì &amp;#282; --> &#282; &amp;Ecaron; --> &Ecaron;
+capital I, acute accent Í &amp;#205; --> &#205; &amp;Iacute; --> &Iacute;
+capital I, circumflex accent Î &amp;#206; --> &#206; &amp;Icirc; --> &Icirc;
+capital D, caron Ï &amp;#270; --> &#270; &amp;Dcaron; --> &Dcaron;
+capital D, stroke Ð &amp;#272; --> &#272; &amp;Dstrok; --> &Dstrok;
+capital Eth, Icelandic N/A &amp;#208; --> &#208; &amp;ETH; --> &ETH;
+capital N, acute accent Ñ &amp;#323; --> &#323; &amp;Nacute; --> &Nacute;
+capital N, caron Ò &amp;#327; --> &#327; &amp;Ncaron; --> &Ncaron;
+capital O, acute accent Ó &amp;#211; --> &#211; &amp;Oacute; --> &Oacute;
+capital O, circumflex accent Ô &amp;#212; --> &#212; &amp;Ocirc; --> &Ocirc;
+capital O, double acute accent Õ &amp;#368; --> &#368; &amp;Odblac; --> &Odblac;
+capital O, dieresis or umlaut mark Ö &amp;#214; --> &#214; &amp;Ouml; --> &Ouml;
+multiply sign × &amp;#215; --> &#215; &amp;times; --> &times;
+capital R, caron Ø &amp;#344; --> &#344; &amp;Rcaron; --> &Rcaron;
+capital U, ring Ù &amp;#366; --> &#366; &amp;Uring; --> &Uring;
+capital U, acute accent Ú &amp;#218; --> &#218; &amp;Uacute; --> &Uacute;
+capital U, double acute accent Û &amp;#368; --> &#368; &amp;Udblac; --> &Udblac;
+capital U, dieresis or umlaut mark Ü &amp;#220; --> &#220; &amp;Uuml; --> &Uuml;
+capital Y, acute accent Ý &amp;#221; --> &#221; &amp;Yacute; --> &Yacute;
+capital T, cedilla Þ &amp;#354; --> &#354; &amp;Tcedil; --> &Tcedil;
+small sharp s, German (sz ligature) ß &amp;#223; --> &#223; &amp;szlig; --> &szlig;
+small r, acute accent à &amp;#341; --> &#341; &amp;racute; --> &racute;
+small a, acute accent á &amp;#225; --> &#225; &amp;aacute; --> &aacute;
+small a, circumflex accent â &amp;#226; --> &#226; &amp;acirc; --> &acirc;
+small a, breve ã &amp;#259; --> &#259; &amp;abreve; --> &abreve;
+small a, dieresis or umlaut mark ä &amp;#228; --> &#228; &amp;auml; --> &auml;
+small l, acute accent å &amp;#314; --> &#314; &amp;lacute; --> &lacute;
+small c, acute accent æ &amp;#263; --> &#263; &amp;cacute; --> &cacute;
+small c, cedilla ç &amp;#231; --> &#231; &amp;ccedil; --> &ccedil;
+small c, caron è &amp;#269; --> &#269; &amp;ccaron; --> &ccaron;
+small e, acute accent é &amp;#233; --> &#233; &amp;eacute; --> &eacute;
+small e, ogonek ê &amp;#281; --> &#281; &amp;eogon; --> &eogon;
+small e, dieresis or umlaut mark ë &amp;#235; --> &#235; &amp;euml; --> &euml;
+small e, caron ì &amp;#283; --> &#283; &amp;ecaron; --> &ecaron;
+small i, acute accent í &amp;#237; --> &#237; &amp;iacute; --> &iacute;
+small i, circumflex accent î &amp;#238; --> &#238; &amp;icirc; --> &icirc;
+small d, caron ï &amp;#271; --> &#271; &amp;dcaron; --> &dcaron;
+small d, stroke ð &amp;#273; --> &#273; &amp;dstrok; --> &dstrok;
+small eth, Icelandic N/A &amp;#240; --> &#240; &amp;eth; --> &eth;
+small n, acute accent ñ &amp;#324; --> &#324; &amp;nacute; --> &nacute;
+small n, caron ò &amp;#328; --> &#328; &amp;ncaron; --> &ncaron;
+small o, acute accent ó &amp;#243; --> &#243; &amp;oacute; --> &oacute;
+small o, circumflex accent ô &amp;#244; --> &#244; &amp;ocirc; --> &ocirc;
+small o, double acute accent õ &amp;#369; --> &#369; &amp;odblac; --> &odblac;
+small o, dieresis or umlaut mark ö &amp;#246; --> &#246; &amp;ouml; --> &ouml;
+division sign ÷ &amp;#247; --> &#247; &amp;divide; --> &divide;
+small r, caron ø &amp;#345; --> &#345; &amp;rcaron; --> &rcaron;
+small u, ring ù &amp;#367; --> &#367; &amp;uring; --> &uring;
+small u, acute accent ú &amp;#250; --> &#250; &amp;uacute; --> &uacute;
+small u, double acute accent û &amp;#369; --> &#369; &amp;udblac; --> &udblac;
+small u, dieresis or umlaut mark ü &amp;#252; --> &#252; &amp;uuml; --> &uuml;
+small y, acute accent ý &amp;#253; --> &#253; &amp;yacute; --> &yacute;
+small t, cedilla þ &amp;#355; --> &#355; &amp;tcedil; --> &tcedil;
+dot above {ÿ} {&amp;#729;}-->{&#729;} {&amp;dot;} -->{&dot;}
+
+Some other characters of interest Char Code Entity name
+=================================== ==== ============ ==============
+capital AE diphthong (ligature) N/A &amp;#198; --> &#198; &amp;AElig; --> &AElig;
+small ae diphthong (ligature) N/A &amp;#230; --> &#230; &amp;aelig; --> &aelig;
+capital OE ligature N/A {&amp;#338;}-->{&#338;} {&amp;OElig;} -->{&OElig;}
+small oe ligature N/A {&amp;#339;}-->{&#339;} {&amp;oelig;} -->{&oelig;}
+copyright N/A &amp;#169; --> &#169; &amp;copy; --> &copy;
+registered trademark N/A &amp;#174; --> &#174; &amp;reg; --> &reg;
+trademark sign N/A &amp;#8482;--> &#8482; &amp;trade; --> &trade;
+em space N/A [&amp;#8195;]->[&#8195;] [&amp;emsp;] -->[&emsp;]
+en space N/A [&amp;#8194;]->[&#8194;] [&amp;ensp;] -->[&ensp;]
+1/3-em space N/A [&amp;#8196;]->[&#8196;] [&amp;emsp13;] -->[&emsp13;]
+1/4-em space N/A [&amp;#8197;]->[&#8197;] [&amp;emsp14;] -->[&emsp14;]
+thin space N/A [&amp;#8201;]->[&#8201;] [&amp;thinsp;]-->[&thinsp;]
+hair space N/A [&amp;#8202;]->[&#8202;] [&amp;hairsp;]-->[&hairsp;]
+em dash N/A [&amp;#8212;]->[&#8212;] [&amp;mdash;] -->[&mdash;]
+en dash N/A [&amp;#8211;]->[&#8211;] [&amp;ndash;] -->[&ndash;]
+
+</PRE><!-- </PRE> no HotJava preBeta hackx - kw -->
+<!-- second /PRE is a hack for HotJava 1.0 preBeta 1 -->
+<HR>
+<P>
+Characters not found in ISO-8859-2 have "N/A" in the <TT>Char</TT> column.
+Some characters for which I could not find entity names in either
+<A HREF="http://www.internic.net/rfc/rfc2070.txt">RFC 2070</A>
+or the
+<A HREF="ftp://www.ucc.ie/pub/sgml/">ISOlat1, ISOlat2, ISOnum, ISOpub and ISOtech</A>
+sets (the ones included by Peter Flynn's
+<A HREF="http://www.ucc.ie/doc/www/html/dtds/htmlpro.html">HTML Pro DTD</A>)
+are shown enclosed in <TT>{</TT>braces<TT>}</TT>.
+</P>
+<P>
+There also is a variation of this table which tests
+<A HREF="ALT88592.html">ISO-8859-2 characters and entities in ALT attributes</A>.
+</P>
+<P>
+See Martin Ramsch's original
+<A CHARSET="iso-8859-1" HREF="https://web.archive.org/web/19970119160651/http://www.uni-passau.de:80/~ramsch/iso8859-1.html">ISO-8859-1 Table</A>
+for related info and links, and for some notes on entity names.
+This file is mostly just an adaptation of his table
+to the ISO-8859-2 character set.
+</P>
+<HR>
+
+<ADDRESS>kweide@tezcat.com 1997-03-09</ADDRESS>
+
+</BODY>
+</HTML>
diff --git a/test/koi8-r.html b/test/koi8-r.html
new file mode 100644
index 0000000..d679219
--- /dev/null
+++ b/test/koi8-r.html
@@ -0,0 +1,321 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<HTML>
+<HEAD>
+<TITLE>Test of the KOI8-R symbols</TITLE>
+</HEAD>
+<BODY>
+<PRE>
+
+ This table prepared from KOI8-R.TXT available at ftp.unicode.org
+
+ ftp://ftp.unicode.org/MAPPINGS/VENDORS/MISC/KOI8-R.TXT
+ (if doing ftp, try cd Public/MAPPINGS/VENDORS/MISC)
+
+
+original comment:
+
+#
+# Name: KOI8-R (RFC1489) to Unicode
+# Unicode version: 3.0
+# Table version: 1.0
+# Table format: Format A
+# Date: 18 August 1999
+# Authors: Helmut Richter &lt;richter@lrz.de&gt;
+#
+# Copyright (c) 1991-1999 Unicode, Inc. All Rights reserved.
+#
+# This file is provided as-is by Unicode, Inc. (The Unicode Consortium).
+# No claims are made as to fitness for any particular purpose. No
+# warranties of any kind are expressed or implied. The recipient
+# agrees to determine applicability of information provided. If this
+# file has been provided on optical media by Unicode, Inc., the sole
+# remedy for any claim will be exchange of defective media within 90
+# days of receipt.
+#
+# Unicode, Inc. hereby grants the right to freely use the information
+# supplied in this file in the creation of products supporting the
+# Unicode Standard, and to make copies of this file in any form for
+# internal or external distribution as long as this notice remains
+# attached.
+#
+# General notes:
+#
+# This table contains the data the Unicode Consortium has on how
+# KOI8-R characters map into Unicode. The underlying document is the
+# mapping described in RFC 1489. No statements are made as to whether
+# this mapping is the same as the mapping defined as "Code Page 878"
+# with some vendors.
+#
+# Format: Three tab-separated columns
+# Column #1 is the KOI8-R code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in KOI8-R order.
+#
+# Version history
+# 1.0 version: created.
+#
+# Any comments or problems, contact &lt;errata@unicode.org&gt;
+# Please note that &lt;errata@unicode.org&gt; is an archival address;
+# notices will be checked, but do not expect an immediate response.
+#
+0x00 0x0000 "&#x0000" # NULL
+0x01 0x0001 "&#x0001" # START OF HEADING
+0x02 0x0002 "&#x0002" # START OF TEXT
+0x03 0x0003 "&#x0003" # END OF TEXT
+0x04 0x0004 "&#x0004" # END OF TRANSMISSION
+0x05 0x0005 "&#x0005" # ENQUIRY
+0x06 0x0006 "&#x0006" # ACKNOWLEDGE
+0x07 0x0007 "&#x0007" # BELL
+0x08 0x0008 "&#x0008" # BACKSPACE
+0x09 0x0009 "&#x0009" # HORIZONTAL TABULATION
+0x0A 0x000A "&#x000A" # LINE FEED
+0x0B 0x000B "&#x000B" # VERTICAL TABULATION
+0x0C 0x000C "&#x000C" # FORM FEED
+0x0D 0x000D "&#x000D" # CARRIAGE RETURN
+0x0E 0x000E "&#x000E" # SHIFT OUT
+0x0F 0x000F "&#x000F" # SHIFT IN
+0x10 0x0010 "&#x0010" # DATA LINK ESCAPE
+0x11 0x0011 "&#x0011" # DEVICE CONTROL ONE
+0x12 0x0012 "&#x0012" # DEVICE CONTROL TWO
+0x13 0x0013 "&#x0013" # DEVICE CONTROL THREE
+0x14 0x0014 "&#x0014" # DEVICE CONTROL FOUR
+0x15 0x0015 "&#x0015" # NEGATIVE ACKNOWLEDGE
+0x16 0x0016 "&#x0016" # SYNCHRONOUS IDLE
+0x17 0x0017 "&#x0017" # END OF TRANSMISSION BLOCK
+0x18 0x0018 "&#x0018" # CANCEL
+0x19 0x0019 "&#x0019" # END OF MEDIUM
+0x1A 0x001A "&#x001A" # SUBSTITUTE
+0x1B 0x001B "&#x001B" # ESCAPE
+0x1C 0x001C "&#x001C" # FILE SEPARATOR
+0x1D 0x001D "&#x001D" # GROUP SEPARATOR
+0x1E 0x001E "&#x001E" # RECORD SEPARATOR
+0x1F 0x001F "&#x001F" # UNIT SEPARATOR
+0x20 0x0020 "&#x0020" # SPACE
+0x21 0x0021 "&#x0021" # EXCLAMATION MARK
+0x22 0x0022 "&#x0022" # QUOTATION MARK
+0x23 0x0023 "&#x0023" # NUMBER SIGN
+0x24 0x0024 "&#x0024" # DOLLAR SIGN
+0x25 0x0025 "&#x0025" # PERCENT SIGN
+0x26 0x0026 "&#x0026" # AMPERSAND
+0x27 0x0027 "&#x0027" # APOSTROPHE
+0x28 0x0028 "&#x0028" # LEFT PARENTHESIS
+0x29 0x0029 "&#x0029" # RIGHT PARENTHESIS
+0x2A 0x002A "&#x002A" # ASTERISK
+0x2B 0x002B "&#x002B" # PLUS SIGN
+0x2C 0x002C "&#x002C" # COMMA
+0x2D 0x002D "&#x002D" # HYPHEN-MINUS
+0x2E 0x002E "&#x002E" # FULL STOP
+0x2F 0x002F "&#x002F" # SOLIDUS
+0x30 0x0030 "&#x0030" # DIGIT ZERO
+0x31 0x0031 "&#x0031" # DIGIT ONE
+0x32 0x0032 "&#x0032" # DIGIT TWO
+0x33 0x0033 "&#x0033" # DIGIT THREE
+0x34 0x0034 "&#x0034" # DIGIT FOUR
+0x35 0x0035 "&#x0035" # DIGIT FIVE
+0x36 0x0036 "&#x0036" # DIGIT SIX
+0x37 0x0037 "&#x0037" # DIGIT SEVEN
+0x38 0x0038 "&#x0038" # DIGIT EIGHT
+0x39 0x0039 "&#x0039" # DIGIT NINE
+0x3A 0x003A "&#x003A" # COLON
+0x3B 0x003B "&#x003B" # SEMICOLON
+0x3C 0x003C "&#x003C" # LESS-THAN SIGN
+0x3D 0x003D "&#x003D" # EQUALS SIGN
+0x3E 0x003E "&#x003E" # GREATER-THAN SIGN
+0x3F 0x003F "&#x003F" # QUESTION MARK
+0x40 0x0040 "&#x0040" # COMMERCIAL AT
+0x41 0x0041 "&#x0041" # LATIN CAPITAL LETTER A
+0x42 0x0042 "&#x0042" # LATIN CAPITAL LETTER B
+0x43 0x0043 "&#x0043" # LATIN CAPITAL LETTER C
+0x44 0x0044 "&#x0044" # LATIN CAPITAL LETTER D
+0x45 0x0045 "&#x0045" # LATIN CAPITAL LETTER E
+0x46 0x0046 "&#x0046" # LATIN CAPITAL LETTER F
+0x47 0x0047 "&#x0047" # LATIN CAPITAL LETTER G
+0x48 0x0048 "&#x0048" # LATIN CAPITAL LETTER H
+0x49 0x0049 "&#x0049" # LATIN CAPITAL LETTER I
+0x4A 0x004A "&#x004A" # LATIN CAPITAL LETTER J
+0x4B 0x004B "&#x004B" # LATIN CAPITAL LETTER K
+0x4C 0x004C "&#x004C" # LATIN CAPITAL LETTER L
+0x4D 0x004D "&#x004D" # LATIN CAPITAL LETTER M
+0x4E 0x004E "&#x004E" # LATIN CAPITAL LETTER N
+0x4F 0x004F "&#x004F" # LATIN CAPITAL LETTER O
+0x50 0x0050 "&#x0050" # LATIN CAPITAL LETTER P
+0x51 0x0051 "&#x0051" # LATIN CAPITAL LETTER Q
+0x52 0x0052 "&#x0052" # LATIN CAPITAL LETTER R
+0x53 0x0053 "&#x0053" # LATIN CAPITAL LETTER S
+0x54 0x0054 "&#x0054" # LATIN CAPITAL LETTER T
+0x55 0x0055 "&#x0055" # LATIN CAPITAL LETTER U
+0x56 0x0056 "&#x0056" # LATIN CAPITAL LETTER V
+0x57 0x0057 "&#x0057" # LATIN CAPITAL LETTER W
+0x58 0x0058 "&#x0058" # LATIN CAPITAL LETTER X
+0x59 0x0059 "&#x0059" # LATIN CAPITAL LETTER Y
+0x5A 0x005A "&#x005A" # LATIN CAPITAL LETTER Z
+0x5B 0x005B "&#x005B" # LEFT SQUARE BRACKET
+0x5C 0x005C "&#x005C" # REVERSE SOLIDUS
+0x5D 0x005D "&#x005D" # RIGHT SQUARE BRACKET
+0x5E 0x005E "&#x005E" # CIRCUMFLEX ACCENT
+0x5F 0x005F "&#x005F" # LOW LINE
+0x60 0x0060 "&#x0060" # GRAVE ACCENT
+0x61 0x0061 "&#x0061" # LATIN SMALL LETTER A
+0x62 0x0062 "&#x0062" # LATIN SMALL LETTER B
+0x63 0x0063 "&#x0063" # LATIN SMALL LETTER C
+0x64 0x0064 "&#x0064" # LATIN SMALL LETTER D
+0x65 0x0065 "&#x0065" # LATIN SMALL LETTER E
+0x66 0x0066 "&#x0066" # LATIN SMALL LETTER F
+0x67 0x0067 "&#x0067" # LATIN SMALL LETTER G
+0x68 0x0068 "&#x0068" # LATIN SMALL LETTER H
+0x69 0x0069 "&#x0069" # LATIN SMALL LETTER I
+0x6A 0x006A "&#x006A" # LATIN SMALL LETTER J
+0x6B 0x006B "&#x006B" # LATIN SMALL LETTER K
+0x6C 0x006C "&#x006C" # LATIN SMALL LETTER L
+0x6D 0x006D "&#x006D" # LATIN SMALL LETTER M
+0x6E 0x006E "&#x006E" # LATIN SMALL LETTER N
+0x6F 0x006F "&#x006F" # LATIN SMALL LETTER O
+0x70 0x0070 "&#x0070" # LATIN SMALL LETTER P
+0x71 0x0071 "&#x0071" # LATIN SMALL LETTER Q
+0x72 0x0072 "&#x0072" # LATIN SMALL LETTER R
+0x73 0x0073 "&#x0073" # LATIN SMALL LETTER S
+0x74 0x0074 "&#x0074" # LATIN SMALL LETTER T
+0x75 0x0075 "&#x0075" # LATIN SMALL LETTER U
+0x76 0x0076 "&#x0076" # LATIN SMALL LETTER V
+0x77 0x0077 "&#x0077" # LATIN SMALL LETTER W
+0x78 0x0078 "&#x0078" # LATIN SMALL LETTER X
+0x79 0x0079 "&#x0079" # LATIN SMALL LETTER Y
+0x7A 0x007A "&#x007A" # LATIN SMALL LETTER Z
+0x7B 0x007B "&#x007B" # LEFT CURLY BRACKET
+0x7C 0x007C "&#x007C" # VERTICAL LINE
+0x7D 0x007D "&#x007D" # RIGHT CURLY BRACKET
+0x7E 0x007E "&#x007E" # TILDE
+0x7F 0x007F "&#x007F" # DELETE
+0x80 0x2500 "&#x2500" # BOX DRAWINGS LIGHT HORIZONTAL
+0x81 0x2502 "&#x2502" # BOX DRAWINGS LIGHT VERTICAL
+0x82 0x250C "&#x250C" # BOX DRAWINGS LIGHT DOWN AND RIGHT
+0x83 0x2510 "&#x2510" # BOX DRAWINGS LIGHT DOWN AND LEFT
+0x84 0x2514 "&#x2514" # BOX DRAWINGS LIGHT UP AND RIGHT
+0x85 0x2518 "&#x2518" # BOX DRAWINGS LIGHT UP AND LEFT
+0x86 0x251C "&#x251C" # BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+0x87 0x2524 "&#x2524" # BOX DRAWINGS LIGHT VERTICAL AND LEFT
+0x88 0x252C "&#x252C" # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+0x89 0x2534 "&#x2534" # BOX DRAWINGS LIGHT UP AND HORIZONTAL
+0x8A 0x253C "&#x253C" # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+0x8B 0x2580 "&#x2580" # UPPER HALF BLOCK
+0x8C 0x2584 "&#x2584" # LOWER HALF BLOCK
+0x8D 0x2588 "&#x2588" # FULL BLOCK
+0x8E 0x258C "&#x258C" # LEFT HALF BLOCK
+0x8F 0x2590 "&#x2590" # RIGHT HALF BLOCK
+0x90 0x2591 "&#x2591" # LIGHT SHADE
+0x91 0x2592 "&#x2592" # MEDIUM SHADE
+0x92 0x2593 "&#x2593" # DARK SHADE
+0x93 0x2320 "&#x2320" # TOP HALF INTEGRAL
+0x94 0x25A0 "&#x25A0" # BLACK SQUARE
+0x95 0x2219 "&#x2219" # BULLET OPERATOR
+0x96 0x221A "&#x221A" # SQUARE ROOT
+0x97 0x2248 "&#x2248" # ALMOST EQUAL TO
+0x98 0x2264 "&#x2264" # LESS-THAN OR EQUAL TO
+0x99 0x2265 "&#x2265" # GREATER-THAN OR EQUAL TO
+0x9A 0x00A0 "&#x00A0" # NO-BREAK SPACE
+0x9B 0x2321 "&#x2321" # BOTTOM HALF INTEGRAL
+0x9C 0x00B0 "&#x00B0" # DEGREE SIGN
+0x9D 0x00B2 "&#x00B2" # SUPERSCRIPT TWO
+0x9E 0x00B7 "&#x00B7" # MIDDLE DOT
+0x9F 0x00F7 "&#x00F7" # DIVISION SIGN
+0xA0 0x2550 "&#x2550" # BOX DRAWINGS DOUBLE HORIZONTAL
+0xA1 0x2551 "&#x2551" # BOX DRAWINGS DOUBLE VERTICAL
+0xA2 0x2552 "&#x2552" # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+0xA3 0x0451 "&#x0451" # CYRILLIC SMALL LETTER IO
+0xA4 0x2553 "&#x2553" # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
+0xA5 0x2554 "&#x2554" # BOX DRAWINGS DOUBLE DOWN AND RIGHT
+0xA6 0x2555 "&#x2555" # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
+0xA7 0x2556 "&#x2556" # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
+0xA8 0x2557 "&#x2557" # BOX DRAWINGS DOUBLE DOWN AND LEFT
+0xA9 0x2558 "&#x2558" # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+0xAA 0x2559 "&#x2559" # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+0xAB 0x255A "&#x255A" # BOX DRAWINGS DOUBLE UP AND RIGHT
+0xAC 0x255B "&#x255B" # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+0xAD 0x255C "&#x255C" # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
+0xAE 0x255D "&#x255D" # BOX DRAWINGS DOUBLE UP AND LEFT
+0xAF 0x255E "&#x255E" # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+0xB0 0x255F "&#x255F" # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+0xB1 0x2560 "&#x2560" # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+0xB2 0x2561 "&#x2561" # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+0xB3 0x0401 "&#x0401" # CYRILLIC CAPITAL LETTER IO
+0xB4 0x2562 "&#x2562" # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
+0xB5 0x2563 "&#x2563" # BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+0xB6 0x2564 "&#x2564" # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
+0xB7 0x2565 "&#x2565" # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
+0xB8 0x2566 "&#x2566" # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+0xB9 0x2567 "&#x2567" # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+0xBA 0x2568 "&#x2568" # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+0xBB 0x2569 "&#x2569" # BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+0xBC 0x256A "&#x256A" # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+0xBD 0x256B "&#x256B" # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
+0xBE 0x256C "&#x256C" # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+0xBF 0x00A9 "&#x00A9" # COPYRIGHT SIGN
+0xC0 0x044E "&#x044E" # CYRILLIC SMALL LETTER YU
+0xC1 0x0430 "&#x0430" # CYRILLIC SMALL LETTER A
+0xC2 0x0431 "&#x0431" # CYRILLIC SMALL LETTER BE
+0xC3 0x0446 "&#x0446" # CYRILLIC SMALL LETTER TSE
+0xC4 0x0434 "&#x0434" # CYRILLIC SMALL LETTER DE
+0xC5 0x0435 "&#x0435" # CYRILLIC SMALL LETTER IE
+0xC6 0x0444 "&#x0444" # CYRILLIC SMALL LETTER EF
+0xC7 0x0433 "&#x0433" # CYRILLIC SMALL LETTER GHE
+0xC8 0x0445 "&#x0445" # CYRILLIC SMALL LETTER HA
+0xC9 0x0438 "&#x0438" # CYRILLIC SMALL LETTER I
+0xCA 0x0439 "&#x0439" # CYRILLIC SMALL LETTER SHORT I
+0xCB 0x043A "&#x043A" # CYRILLIC SMALL LETTER KA
+0xCC 0x043B "&#x043B" # CYRILLIC SMALL LETTER EL
+0xCD 0x043C "&#x043C" # CYRILLIC SMALL LETTER EM
+0xCE 0x043D "&#x043D" # CYRILLIC SMALL LETTER EN
+0xCF 0x043E "&#x043E" # CYRILLIC SMALL LETTER O
+0xD0 0x043F "&#x043F" # CYRILLIC SMALL LETTER PE
+0xD1 0x044F "&#x044F" # CYRILLIC SMALL LETTER YA
+0xD2 0x0440 "&#x0440" # CYRILLIC SMALL LETTER ER
+0xD3 0x0441 "&#x0441" # CYRILLIC SMALL LETTER ES
+0xD4 0x0442 "&#x0442" # CYRILLIC SMALL LETTER TE
+0xD5 0x0443 "&#x0443" # CYRILLIC SMALL LETTER U
+0xD6 0x0436 "&#x0436" # CYRILLIC SMALL LETTER ZHE
+0xD7 0x0432 "&#x0432" # CYRILLIC SMALL LETTER VE
+0xD8 0x044C "&#x044C" # CYRILLIC SMALL LETTER SOFT SIGN
+0xD9 0x044B "&#x044B" # CYRILLIC SMALL LETTER YERU
+0xDA 0x0437 "&#x0437" # CYRILLIC SMALL LETTER ZE
+0xDB 0x0448 "&#x0448" # CYRILLIC SMALL LETTER SHA
+0xDC 0x044D "&#x044D" # CYRILLIC SMALL LETTER E
+0xDD 0x0449 "&#x0449" # CYRILLIC SMALL LETTER SHCHA
+0xDE 0x0447 "&#x0447" # CYRILLIC SMALL LETTER CHE
+0xDF 0x044A "&#x044A" # CYRILLIC SMALL LETTER HARD SIGN
+0xE0 0x042E "&#x042E" # CYRILLIC CAPITAL LETTER YU
+0xE1 0x0410 "&#x0410" # CYRILLIC CAPITAL LETTER A
+0xE2 0x0411 "&#x0411" # CYRILLIC CAPITAL LETTER BE
+0xE3 0x0426 "&#x0426" # CYRILLIC CAPITAL LETTER TSE
+0xE4 0x0414 "&#x0414" # CYRILLIC CAPITAL LETTER DE
+0xE5 0x0415 "&#x0415" # CYRILLIC CAPITAL LETTER IE
+0xE6 0x0424 "&#x0424" # CYRILLIC CAPITAL LETTER EF
+0xE7 0x0413 "&#x0413" # CYRILLIC CAPITAL LETTER GHE
+0xE8 0x0425 "&#x0425" # CYRILLIC CAPITAL LETTER HA
+0xE9 0x0418 "&#x0418" # CYRILLIC CAPITAL LETTER I
+0xEA 0x0419 "&#x0419" # CYRILLIC CAPITAL LETTER SHORT I
+0xEB 0x041A "&#x041A" # CYRILLIC CAPITAL LETTER KA
+0xEC 0x041B "&#x041B" # CYRILLIC CAPITAL LETTER EL
+0xED 0x041C "&#x041C" # CYRILLIC CAPITAL LETTER EM
+0xEE 0x041D "&#x041D" # CYRILLIC CAPITAL LETTER EN
+0xEF 0x041E "&#x041E" # CYRILLIC CAPITAL LETTER O
+0xF0 0x041F "&#x041F" # CYRILLIC CAPITAL LETTER PE
+0xF1 0x042F "&#x042F" # CYRILLIC CAPITAL LETTER YA
+0xF2 0x0420 "&#x0420" # CYRILLIC CAPITAL LETTER ER
+0xF3 0x0421 "&#x0421" # CYRILLIC CAPITAL LETTER ES
+0xF4 0x0422 "&#x0422" # CYRILLIC CAPITAL LETTER TE
+0xF5 0x0423 "&#x0423" # CYRILLIC CAPITAL LETTER U
+0xF6 0x0416 "&#x0416" # CYRILLIC CAPITAL LETTER ZHE
+0xF7 0x0412 "&#x0412" # CYRILLIC CAPITAL LETTER VE
+0xF8 0x042C "&#x042C" # CYRILLIC CAPITAL LETTER SOFT SIGN
+0xF9 0x042B "&#x042B" # CYRILLIC CAPITAL LETTER YERU
+0xFA 0x0417 "&#x0417" # CYRILLIC CAPITAL LETTER ZE
+0xFB 0x0428 "&#x0428" # CYRILLIC CAPITAL LETTER SHA
+0xFC 0x042D "&#x042D" # CYRILLIC CAPITAL LETTER E
+0xFD 0x0429 "&#x0429" # CYRILLIC CAPITAL LETTER SHCHA
+0xFE 0x0427 "&#x0427" # CYRILLIC CAPITAL LETTER CHE
+0xFF 0x042A "&#x042A" # CYRILLIC CAPITAL LETTER HARD SIGN
+</PRE>
+</BODY>
+</HTML>
diff --git a/test/nobody b/test/nobody
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/test/nobody
diff --git a/test/quickbrown.html b/test/quickbrown.html
new file mode 100644
index 0000000..e320722
--- /dev/null
+++ b/test/quickbrown.html
@@ -0,0 +1,103 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<HTML>
+<HEAD>
+<TITLE>Markus Kuhn's quick-brown-fox UTF-8 demo</TITLE>
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
+<LINK REV="made" HREF="mailto:dickey@invisible-island.net">
+</HEAD>
+
+<BODY>
+<pre>
+Sentences that contain all letters commonly used in a language
+--------------------------------------------------------------
+
+Markus Kuhn &lt;mkuhn@acm.org&gt; -- 1998-11-30
+
+This file was UTF-8 encoded.
+
+
+German (de)
+-----------
+
+ Falsches &#xdc;ben von Xylophonmusik qu&#xe4;lt jeden gr&#xf6;&#xdf;eren Zwerg
+ (= Wrongful practicing of xylophone music tortures every larger dwarf)
+
+ Zw&#xf6;lf Boxk&#xe4;mpfer jagten Eva quer &#xfc;ber den Sylter Deich
+ (= Twelve boxing fighters hunted Eva across the dike of Sylt)
+
+ Heiz&#xf6;lr&#xfc;cksto&#xdf;abd&#xe4;mpfung
+ (= fuel oil recoil absorber) (jqvwxy missing, but all non-ASCII letters in one word)
+
+English (en)
+------------
+
+ The quick brown fox jumps over the lazy dog
+
+French (fr)
+-----------
+
+ Portez ce vieux whisky au juge blond qui fume sur son &#xee;le int&#xe9;rieure, &#xe0;
+ c&#xf4;t&#xe9; de l'alc&#xf4;ve ovo&#xef;de, o&#xf9; les b&#xfb;ches se consument dans l'&#xe2;tre, ce qui lui
+ permet de penser &#xe0; la c&#xe6;nogen&#xe8;se de l'&#xea;tre dont il est question dans la
+ cause ambigu&#xeb; entendue &#xe0; Mo&#xff;, dans un capharna&#xfc;m qui, pense-t-il, diminue
+ &#xe7;&#xe0; et l&#xe0; la qualit&#xe9; de son &#x153;uvre.
+
+ l'&#xee;le exigu&#xeb;
+ O&#xf9; l'ob&#xe8;se jury m&#xfb;r
+ F&#xea;te l'ha&#xef; volap&#xfc;k,
+ &#xc2;ne ex a&#xe9;quo au whist,
+ &#xd4;tez ce v&#x153;u d&#xe9;&#xe7;u.
+
+ Le c&#x153;ur d&#xe9;&#xe7;u mais l'&#xe2;me plut&#xf4;t na&#xef;ve, Lou&#xff;s r&#xea;va de crapa&#xfc;ter en
+ cano&#xeb; au del&#xe0; des &#xee;les, pr&#xe8;s du m&#xe4;lstr&#xf6;m o&#xf9; br&#xfb;lent les nov&#xe6;.
+
+Irish Gaelic (ga)
+-----------------
+
+ D'fhuascail &#xcd;osa, &#xda;rmhac na h&#xd3;ighe Beannaithe, p&#xf3;r &#xc9;ava agus &#xc1;dhaimh
+
+Icelandic (is)
+--------------
+
+ K&#xe6;mi n&#xfd; &#xf6;xi h&#xe9;r ykist &#xfe;j&#xf3;fum n&#xfa; b&#xe6;&#xf0;i v&#xed;l og &#xe1;drepa
+
+ S&#xe6;v&#xf6;r gr&#xe9;t &#xe1;&#xf0;an &#xfe;v&#xed; &#xfa;lpan var &#xf3;n&#xfd;t
+ (some ASCII letters missing)
+
+Hebrew (iw)
+-----------
+
+ &#x5d3;&#x5d2; &#x5e1;&#x5e7;&#x5e8;&#x5df; &#x5e9;&#x5d8; &#x5d1;&#x5d9;&#x5dd; &#x5de;&#x5d0;&#x5d5;&#x5db;&#x5d6;&#x5d1; &#x5d5;&#x5dc;&#x5e4;&#x5ea;&#x5e2; &#x5de;&#x5e6;&#x5d0; &#x5dc;&#x5d5; &#x5d7;&#x5d1;&#x5e8;&#x5d4; &#x5d0;&#x5d9;&#x5da; &#x5d4;&#x5e7;&#x5dc;&#x5d9;&#x5d8;&#x5d4;?
+
+Polish (pl)
+-----------
+
+ Pchn&#x105;&#x107; w t&#x119; &#x142;&#xf3;d&#x17a; je&#x17c;a lub o&#x15b;m skrzy&#x144; fig
+
+Russian (ru)
+------------
+
+ &#x412; &#x447;&#x430;&#x449;&#x430;&#x445; &#x44e;&#x433;&#x430; &#x436;&#x438;&#x43b; &#x431;&#x44b; &#x446;&#x438;&#x442;&#x440;&#x443;&#x441;? &#x414;&#x430;, &#x43d;&#x43e; &#x444;&#x430;&#x43b;&#x44c;&#x448;&#x438;&#x432;&#x44b;&#x439; &#x44d;&#x43a;&#x437;&#x435;&#x43c;&#x43f;&#x43b;&#x44f;&#x440;!
+ (= Would a citrus live in the bushes of south? Yes, but a only a fake!)
+
+
+Please let me know if you find others! Special thanks to the people
+from all over the world who contributed these sentences.
+
+</pre>
+See also:
+<ul>
+<li><a href="http://www.columbia.edu/kermit/utf8.html"
+ >http://www.columbia.edu/kermit/utf8.html</a>
+<li><a href="http://www.kernel.org/"
+ >http://www.kernel.org/</a>
+<li><a href="http://www.unicode.org/"
+ >http://www.unicode.org/</a>
+<br>and
+<li><a href="http://www.cl.cam.ac.uk/~mgk25/ucs/examples/TeX.txt"
+ >http://www.cl.cam.ac.uk/~mgk25/ucs/examples/TeX.txt</a>
+<li><a href="http://www.cl.cam.ac.uk/~mgk25/ucs/wgl4.txt"
+ >http://www.cl.cam.ac.uk/~mgk25/ucs/wgl4.txt</a>
+</ul>
+</BODY>
+</HTML>
diff --git a/test/raw8bit.html b/test/raw8bit.html
new file mode 100644
index 0000000..f0d0eeb
--- /dev/null
+++ b/test/raw8bit.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//IETF//DTD HTML 3.0//EN">
+<HTML>
+<HEAD>
+<TITLE> Test of raw 8-bit symbols </TITLE>
+<!-- you may uncomment the next line
+and set the document's charset directly via META tag -->
+<!--META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1"-->
+</HEAD>
+<BODY>
+<PRE>
+This is a test of translation 8-bit letters for different pairs of
+document's charset (assumed charset) and display charset,
+both can be reached from 'O'ptions menu.
+
+This page (obviously) corresponds to text/html mode
+but you may test text/plain just by pressing '\'
+Try also: '@' for ``raw mode'' and '=' for Information Page.
+
+
+ 0 1 2 3 4 5 6 7 8 9 A B C D E F
+20 ! " # $ % & ' ( ) * + , - . /
+30 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+40 @ A B C D E F G H I J K L M N O
+50 P Q R S T U V W X Y Z [ \ ] ^ _
+60 ` a b c d e f g h i j k l m n o
+70 p q r s t u v w x y z { | } ~ 
+80 € ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ž
+90 ‘ ’ “ ” • – — ˜ ™ š › œ ž Ÿ
+A0   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯
+B0 ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿
+C0 À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï
+D0 Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß
+E0 à á â ã ä å æ ç è é ê ë ì í î ï
+F0 ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ
+
+</PRE>
+</BODY>
+</HTML>
diff --git a/test/sgml.html b/test/sgml.html
new file mode 100644
index 0000000..9442534
--- /dev/null
+++ b/test/sgml.html
@@ -0,0 +1,1081 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<HTML>
+<HEAD>
+<TITLE>Test of some Unicode symbols enclosed as SGML entity names</TITLE>
+</HEAD>
+<BODY>
+<PRE>
+
+ This table prepared from SGML.TXT available at ftp.unicode.org
+
+ ftp://ftp.unicode.org/MAPPINGS/VENDORS/MISC/SGML.TXT
+ (if doing ftp, try cd Public/MAPPINGS/VENDORS/MISC)
+
+
+original comment:
+
+# Author: John Cowan &lt;cowan@ccil.org&gt;
+# Date: 25 July 1997
+#
+# The following table maps SGML character entities from various
+# public sets (namely, ISOamsa, ISOamsb, ISOamsc, ISOamsn, ISOamso,
+# ISOamsr, ISObox, ISOcyr1, ISOcyr2, ISOdia, ISOgrk1, ISOgrk2,
+# ISOgrk3, ISOgrk4, ISOlat1, ISOlat2, ISOnum, ISOpub, ISOtech,
+# HTMLspecial, HTMLsymbol) to corresponding Unicode characters.
+#
+# The table has four tab-separated columns:
+# Column 1: SGML character entity name
+# Column 2: SGML public entity set
+# Column 3: Unicode 2.0 character code
+# Column 4: Unicode 2.0 character name (UPPER CASE)
+# Entries which don't have Unicode equivalents have "0x????"
+# in Column 3 and a lower case description (from the public entity
+# set DTD) in Column 4. The mapping is not reversible, because many
+# distinctions are unified away in Unicode, particularly between
+# mathematical symbols.
+#
+# The table is sorted case-blind by SGML character entity name.
+#
+# The contents of this table are drawn from various sources, and
+# are in the public domain.
+#
+<!-- Changes:
++ {"euro", 0x20AC}, /* EURO SIGN */
+ {"loz", 0x25CA}, /* LOZENGE */
+! /* {"loz", 0x2727}, WHITE FOUR POINTED STAR */
+! /* Warning: Duplicated &loz; entry. HTML 4,0 defines it as U+25CA. */
+- {"b.delta", 0x03B3}, /* GREEK SMALL LETTER GAMMA */
++ {"b.delta", 0x03B4}, /* GREEK SMALL LETTER DELTA */
+
+-->
+
+This test illuminates SGML character entities implementation in your browser.
+We sort the entities according to unicode numbers.
+You should see visible character if your display character set supports it
+or some substitution string picked up from src/chrtrans/def7_uni.tbl.
+If you see &amp;somename; - this name is not implemented yet,
+you may search for &amp;. (Sorry, ISOgrk4 which holds a dot in its name
+seems to be nonvisible for most browsers. Keep in mind that
+this table is much wider than in the HTML 4.0 draft).
+ Leonid Pauzner.
+
+
+0x0021 &excl; ISOnum # EXCLAMATION MARK
+0x0022 &quot; ISOnum # QUOTATION MARK
+0x0023 &num; ISOnum # NUMBER SIGN
+0x0024 &dollar; ISOnum # DOLLAR SIGN
+0x0025 &percnt; ISOnum # PERCENT SIGN
+0x0026 &amp; ISOnum # AMPERSAND
+0x0028 &lpar; ISOnum # LEFT PARENTHESIS
+0x0029 &rpar; ISOnum # RIGHT PARENTHESIS
+0x002A &ast; ISOnum # ASTERISK
+0x002B &plus; ISOnum # PLUS SIGN
+0x002C &comma; ISOnum # COMMA
+0x002D &hyphen; ISOnum # HYPHEN-MINUS
+0x002E &period; ISOnum # FULL STOP
+0x002F &sol; ISOnum # SOLIDUS
+0x003A &colon; ISOnum # COLON
+0x003B &semi; ISOnum # SEMICOLON
+0x003C &lt; ISOnum # LESS-THAN SIGN
+0x003D &equals; ISOnum # EQUALS SIGN
+0x003E &gt; ISOnum # GREATER-THAN SIGN
+0x003F &quest; ISOnum # QUESTION MARK
+0x0040 &commat; ISOnum # COMMERCIAL AT
+0x005B &lsqb; ISOnum # LEFT SQUARE BRACKET
+0x005C &bsol; ISOnum # REVERSE SOLIDUS
+0x005C &sbsol; ISOamso # REVERSE SOLIDUS
+0x005D &rsqb; ISOnum # RIGHT SQUARE BRACKET
+0x005F &lowbar; ISOnum # LOW LINE
+0x0060 &grave; ISOdia # GRAVE ACCENT
+0x007B &lcub; ISOnum # LEFT CURLY BRACKET
+0x007C &verbar; ISOnum # VERTICAL LINE
+0x007D &rcub; ISOnum # RIGHT CURLY BRACKET
+0x00A0 &nbsp; ISOnum # NO-BREAK SPACE
+0x00A1 &iexcl; ISOnum # INVERTED EXCLAMATION MARK
+0x00A2 &cent; ISOnum # CENT SIGN
+0x00A3 &pound; ISOnum # POUND SIGN
+0x00A4 &curren; ISOnum # CURRENCY SIGN
+0x00A5 &yen; ISOnum # YEN SIGN
+0x00A6 &brvbar; ISOnum # BROKEN BAR
+0x00A7 &sect; ISOnum # SECTION SIGN
+0x00A8 &Dot; ISOtech # DIAERESIS
+0x00A8 &die; ISOdia # DIAERESIS
+0x00A8 &uml; ISOdia # DIAERESIS
+0x00A9 &copy; ISOnum # COPYRIGHT SIGN
+0x00AA &ordf; ISOnum # FEMININE ORDINAL INDICATOR
+0x00AB &laquo; ISOnum # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0x00AC &not; ISOnum # NOT SIGN
+0x00AD &shy; ISOnum # SOFT HYPHEN
+0x00AE &reg; ISOnum # REGISTERED SIGN
+0x00AF &macr; ISOdia # MACRON
+0x00B0 &deg; ISOnum # DEGREE SIGN
+0x00B1 &plusmn; ISOnum # PLUS-MINUS SIGN
+0x00B2 &sup2; ISOnum # SUPERSCRIPT TWO
+0x00B3 &sup3; ISOnum # SUPERSCRIPT THREE
+0x00B4 &acute; ISOdia # ACUTE ACCENT
+0x00B5 &micro; ISOnum # MICRO SIGN
+0x00B6 &para; ISOnum # PILCROW SIGN
+0x00B7 &middot; ISOnum # MIDDLE DOT
+0x00B8 &cedil; ISOdia # CEDILLA
+0x00B9 &sup1; ISOnum # SUPERSCRIPT ONE
+0x00BA &ordm; ISOnum # MASCULINE ORDINAL INDICATOR
+0x00BB &raquo; ISOnum # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0x00BC &frac14; ISOnum # VULGAR FRACTION ONE QUARTER
+0x00BD &frac12; ISOnum # VULGAR FRACTION ONE HALF
+0x00BD &half; ISOnum # VULGAR FRACTION ONE HALF
+0x00BE &frac34; ISOnum # VULGAR FRACTION THREE QUARTERS
+0x00BF &iquest; ISOnum # INVERTED QUESTION MARK
+0x00C0 &Agrave; ISOlat1 # LATIN CAPITAL LETTER A WITH GRAVE
+0x00C1 &Aacute; ISOlat1 # LATIN CAPITAL LETTER A WITH ACUTE
+0x00C2 &Acirc; ISOlat1 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0x00C3 &Atilde; ISOlat1 # LATIN CAPITAL LETTER A WITH TILDE
+0x00C4 &Auml; ISOlat1 # LATIN CAPITAL LETTER A WITH DIAERESIS
+0x00C5 &Aring; ISOlat1 # LATIN CAPITAL LETTER A WITH RING ABOVE
+0x00C6 &AElig; ISOlat1 # LATIN CAPITAL LETTER AE
+0x00C7 &Ccedil; ISOlat1 # LATIN CAPITAL LETTER C WITH CEDILLA
+0x00C8 &Egrave; ISOlat1 # LATIN CAPITAL LETTER E WITH GRAVE
+0x00C9 &Eacute; ISOlat1 # LATIN CAPITAL LETTER E WITH ACUTE
+0x00CA &Ecirc; ISOlat1 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+0x00CB &Euml; ISOlat1 # LATIN CAPITAL LETTER E WITH DIAERESIS
+0x00CC &Igrave; ISOlat1 # LATIN CAPITAL LETTER I WITH GRAVE
+0x00CD &Iacute; ISOlat1 # LATIN CAPITAL LETTER I WITH ACUTE
+0x00CE &Icirc; ISOlat1 # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0x00CF &Iuml; ISOlat1 # LATIN CAPITAL LETTER I WITH DIAERESIS
+0x00D0 &ETH; ISOlat1 # LATIN CAPITAL LETTER ETH
+0x00D1 &Ntilde; ISOlat1 # LATIN CAPITAL LETTER N WITH TILDE
+0x00D2 &Ograve; ISOlat1 # LATIN CAPITAL LETTER O WITH GRAVE
+0x00D3 &Oacute; ISOlat1 # LATIN CAPITAL LETTER O WITH ACUTE
+0x00D4 &Ocirc; ISOlat1 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0x00D5 &Otilde; ISOlat1 # LATIN CAPITAL LETTER O WITH TILDE
+0x00D6 &Ouml; ISOlat1 # LATIN CAPITAL LETTER O WITH DIAERESIS
+0x00D7 &times; ISOnum # MULTIPLICATION SIGN
+0x00D8 &Oslash; ISOlat1 # LATIN CAPITAL LETTER O WITH STROKE
+0x00D9 &Ugrave; ISOlat1 # LATIN CAPITAL LETTER U WITH GRAVE
+0x00DA &Uacute; ISOlat1 # LATIN CAPITAL LETTER U WITH ACUTE
+0x00DB &Ucirc; ISOlat1 # LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+0x00DC &Uuml; ISOlat1 # LATIN CAPITAL LETTER U WITH DIAERESIS
+0x00DD &Yacute; ISOlat1 # LATIN CAPITAL LETTER Y WITH ACUTE
+0x00DE &THORN; ISOlat1 # LATIN CAPITAL LETTER THORN
+0x00DF &szlig; ISOlat1 # LATIN SMALL LETTER SHARP S
+0x00E0 &agrave; ISOlat1 # LATIN SMALL LETTER A WITH GRAVE
+0x00E1 &aacute; ISOlat1 # LATIN SMALL LETTER A WITH ACUTE
+0x00E2 &acirc; ISOlat1 # LATIN SMALL LETTER A WITH CIRCUMFLEX
+0x00E3 &atilde; ISOlat1 # LATIN SMALL LETTER A WITH TILDE
+0x00E4 &auml; ISOlat1 # LATIN SMALL LETTER A WITH DIAERESIS
+0x00E5 &aring; ISOlat1 # LATIN SMALL LETTER A WITH RING ABOVE
+0x00E6 &aelig; ISOlat1 # LATIN SMALL LETTER AE
+0x00E7 &ccedil; ISOlat1 # LATIN SMALL LETTER C WITH CEDILLA
+0x00E8 &egrave; ISOlat1 # LATIN SMALL LETTER E WITH GRAVE
+0x00E9 &eacute; ISOlat1 # LATIN SMALL LETTER E WITH ACUTE
+0x00EA &ecirc; ISOlat1 # LATIN SMALL LETTER E WITH CIRCUMFLEX
+0x00EB &euml; ISOlat1 # LATIN SMALL LETTER E WITH DIAERESIS
+0x00EC &igrave; ISOlat1 # LATIN SMALL LETTER I WITH GRAVE
+0x00ED &iacute; ISOlat1 # LATIN SMALL LETTER I WITH ACUTE
+0x00EE &icirc; ISOlat1 # LATIN SMALL LETTER I WITH CIRCUMFLEX
+0x00EF &iuml; ISOlat1 # LATIN SMALL LETTER I WITH DIAERESIS
+0x00F0 &eth; ISOlat1 # LATIN SMALL LETTER ETH
+0x00F1 &ntilde; ISOlat1 # LATIN SMALL LETTER N WITH TILDE
+0x00F2 &ograve; ISOlat1 # LATIN SMALL LETTER O WITH GRAVE
+0x00F3 &oacute; ISOlat1 # LATIN SMALL LETTER O WITH ACUTE
+0x00F4 &ocirc; ISOlat1 # LATIN SMALL LETTER O WITH CIRCUMFLEX
+0x00F5 &otilde; ISOlat1 # LATIN SMALL LETTER O WITH TILDE
+0x00F6 &ouml; ISOlat1 # LATIN SMALL LETTER O WITH DIAERESIS
+0x00F7 &divide; ISOnum # DIVISION SIGN
+0x00F8 &oslash; ISOlat1 # LATIN SMALL LETTER O WITH STROKE
+0x00F9 &ugrave; ISOlat1 # LATIN SMALL LETTER U WITH GRAVE
+0x00FA &uacute; ISOlat1 # LATIN SMALL LETTER U WITH ACUTE
+0x00FB &ucirc; ISOlat1 # LATIN SMALL LETTER U WITH CIRCUMFLEX
+0x00FC &uuml; ISOlat1 # LATIN SMALL LETTER U WITH DIAERESIS
+0x00FD &yacute; ISOlat1 # LATIN SMALL LETTER Y WITH ACUTE
+0x00FE &thorn; ISOlat1 # LATIN SMALL LETTER THORN
+0x00FF &yuml; ISOlat1 # LATIN SMALL LETTER Y WITH DIAERESIS
+0x0100 &Amacr; ISOlat2 # LATIN CAPITAL LETTER A WITH MACRON
+0x0101 &amacr; ISOlat2 # LATIN SMALL LETTER A WITH MACRON
+0x0102 &Abreve; ISOlat2 # LATIN CAPITAL LETTER A WITH BREVE
+0x0103 &abreve; ISOlat2 # LATIN SMALL LETTER A WITH BREVE
+0x0104 &Aogon; ISOlat2 # LATIN CAPITAL LETTER A WITH OGONEK
+0x0105 &aogon; ISOlat2 # LATIN SMALL LETTER A WITH OGONEK
+0x0106 &Cacute; ISOlat2 # LATIN CAPITAL LETTER C WITH ACUTE
+0x0107 &cacute; ISOlat2 # LATIN SMALL LETTER C WITH ACUTE
+0x0108 &Ccirc; ISOlat2 # LATIN CAPITAL LETTER C WITH CIRCUMFLEX
+0x0109 &ccirc; ISOlat2 # LATIN SMALL LETTER C WITH CIRCUMFLEX
+0x010A &Cdot; ISOlat2 # LATIN CAPITAL LETTER C WITH DOT ABOVE
+0x010B &cdot; ISOlat2 # LATIN SMALL LETTER C WITH DOT ABOVE
+0x010C &Ccaron; ISOlat2 # LATIN CAPITAL LETTER C WITH CARON
+0x010D &ccaron; ISOlat2 # LATIN SMALL LETTER C WITH CARON
+0x010E &Dcaron; ISOlat2 # LATIN CAPITAL LETTER D WITH CARON
+0x010F &dcaron; ISOlat2 # LATIN SMALL LETTER D WITH CARON
+0x0110 &Dstrok; ISOlat2 # LATIN CAPITAL LETTER D WITH STROKE
+0x0111 &dstrok; ISOlat2 # LATIN SMALL LETTER D WITH STROKE
+0x0112 &Emacr; ISOlat2 # LATIN CAPITAL LETTER E WITH MACRON
+0x0113 &emacr; ISOlat2 # LATIN SMALL LETTER E WITH MACRON
+0x0116 &Edot; ISOlat2 # LATIN CAPITAL LETTER E WITH DOT ABOVE
+0x0117 &edot; ISOlat2 # LATIN SMALL LETTER E WITH DOT ABOVE
+0x0118 &Eogon; ISOlat2 # LATIN CAPITAL LETTER E WITH OGONEK
+0x0119 &eogon; ISOlat2 # LATIN SMALL LETTER E WITH OGONEK
+0x011A &Ecaron; ISOlat2 # LATIN CAPITAL LETTER E WITH CARON
+0x011B &ecaron; ISOlat2 # LATIN SMALL LETTER E WITH CARON
+0x011C &Gcirc; ISOlat2 # LATIN CAPITAL LETTER G WITH CIRCUMFLEX
+0x011D &gcirc; ISOlat2 # LATIN SMALL LETTER G WITH CIRCUMFLEX
+0x011E &Gbreve; ISOlat2 # LATIN CAPITAL LETTER G WITH BREVE
+0x011F &gbreve; ISOlat2 # LATIN SMALL LETTER G WITH BREVE
+0x0120 &Gdot; ISOlat2 # LATIN CAPITAL LETTER G WITH DOT ABOVE
+0x0121 &gdot; ISOlat2 # LATIN SMALL LETTER G WITH DOT ABOVE
+0x0122 &Gcedil; ISOlat2 # LATIN CAPITAL LETTER G WITH CEDILLA
+0x0123 &gcedil; ISOlat2 # LATIN SMALL LETTER G WITH CEDILLA
+0x0124 &Hcirc; ISOlat2 # LATIN CAPITAL LETTER H WITH CIRCUMFLEX
+0x0125 &hcirc; ISOlat2 # LATIN SMALL LETTER H WITH CIRCUMFLEX
+0x0126 &Hstrok; ISOlat2 # LATIN CAPITAL LETTER H WITH STROKE
+0x0127 &hstrok; ISOlat2 # LATIN SMALL LETTER H WITH STROKE
+0x0128 &Itilde; ISOlat2 # LATIN CAPITAL LETTER I WITH TILDE
+0x0129 &itilde; ISOlat2 # LATIN SMALL LETTER I WITH TILDE
+0x012A &Imacr; ISOlat2 # LATIN CAPITAL LETTER I WITH MACRON
+0x012B &imacr; ISOlat2 # LATIN SMALL LETTER I WITH MACRON
+0x012E &Iogon; ISOlat2 # LATIN CAPITAL LETTER I WITH OGONEK
+0x012F &iogon; ISOlat2 # LATIN SMALL LETTER I WITH OGONEK
+0x0130 &Idot; ISOlat2 # LATIN CAPITAL LETTER I WITH DOT ABOVE
+0x0131 &inodot; ISOamso # LATIN SMALL LETTER DOTLESS I
+0x0131 &inodot; ISOlat2 # LATIN SMALL LETTER DOTLESS I
+0x0132 &IJlig; ISOlat2 # LATIN CAPITAL LIGATURE IJ
+0x0133 &ijlig; ISOlat2 # LATIN SMALL LIGATURE IJ
+0x0134 &Jcirc; ISOlat2 # LATIN CAPITAL LETTER J WITH CIRCUMFLEX
+0x0135 &jcirc; ISOlat2 # LATIN SMALL LETTER J WITH CIRCUMFLEX
+0x0136 &Kcedil; ISOlat2 # LATIN CAPITAL LETTER K WITH CEDILLA
+0x0137 &kcedil; ISOlat2 # LATIN SMALL LETTER K WITH CEDILLA
+0x0138 &kgreen; ISOlat2 # LATIN SMALL LETTER KRA
+0x0139 &Lacute; ISOlat2 # LATIN CAPITAL LETTER L WITH ACUTE
+0x013A &lacute; ISOlat2 # LATIN SMALL LETTER L WITH ACUTE
+0x013B &Lcedil; ISOlat2 # LATIN CAPITAL LETTER L WITH CEDILLA
+0x013C &lcedil; ISOlat2 # LATIN SMALL LETTER L WITH CEDILLA
+0x013D &Lcaron; ISOlat2 # LATIN CAPITAL LETTER L WITH CARON
+0x013E &lcaron; ISOlat2 # LATIN SMALL LETTER L WITH CARON
+0x013F &Lmidot; ISOlat2 # LATIN CAPITAL LETTER L WITH MIDDLE DOT
+0x0140 &lmidot; ISOlat2 # LATIN SMALL LETTER L WITH MIDDLE DOT
+0x0141 &Lstrok; ISOlat2 # LATIN CAPITAL LETTER L WITH STROKE
+0x0142 &lstrok; ISOlat2 # LATIN SMALL LETTER L WITH STROKE
+0x0143 &Nacute; ISOlat2 # LATIN CAPITAL LETTER N WITH ACUTE
+0x0144 &nacute; ISOlat2 # LATIN SMALL LETTER N WITH ACUTE
+0x0145 &Ncedil; ISOlat2 # LATIN CAPITAL LETTER N WITH CEDILLA
+0x0146 &ncedil; ISOlat2 # LATIN SMALL LETTER N WITH CEDILLA
+0x0147 &Ncaron; ISOlat2 # LATIN CAPITAL LETTER N WITH CARON
+0x0148 &ncaron; ISOlat2 # LATIN SMALL LETTER N WITH CARON
+0x0149 &napos; ISOlat2 # LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
+0x014A &ENG; ISOlat2 # LATIN CAPITAL LETTER ENG
+0x014B &eng; ISOlat2 # LATIN SMALL LETTER ENG
+0x014C &Omacr; ISOlat2 # LATIN CAPITAL LETTER O WITH MACRON
+0x014D &omacr; ISOlat2 # LATIN SMALL LETTER O WITH MACRON
+0x0150 &Odblac; ISOlat2 # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+0x0151 &odblac; ISOlat2 # LATIN SMALL LETTER O WITH DOUBLE ACUTE
+0x0152 &OElig; ISOlat2 # LATIN CAPITAL LIGATURE OE
+0x0153 &oelig; ISOlat2 # LATIN SMALL LIGATURE OE
+0x0154 &Racute; ISOlat2 # LATIN CAPITAL LETTER R WITH ACUTE
+0x0155 &racute; ISOlat2 # LATIN SMALL LETTER R WITH ACUTE
+0x0156 &Rcedil; ISOlat2 # LATIN CAPITAL LETTER R WITH CEDILLA
+0x0157 &rcedil; ISOlat2 # LATIN SMALL LETTER R WITH CEDILLA
+0x0158 &Rcaron; ISOlat2 # LATIN CAPITAL LETTER R WITH CARON
+0x0159 &rcaron; ISOlat2 # LATIN SMALL LETTER R WITH CARON
+0x015A &Sacute; ISOlat2 # LATIN CAPITAL LETTER S WITH ACUTE
+0x015B &sacute; ISOlat2 # LATIN SMALL LETTER S WITH ACUTE
+0x015C &Scirc; ISOlat2 # LATIN CAPITAL LETTER S WITH CIRCUMFLEX
+0x015D &scirc; ISOlat2 # LATIN SMALL LETTER S WITH CIRCUMFLEX
+0x015E &Scedil; ISOlat2 # LATIN CAPITAL LETTER S WITH CEDILLA
+0x015F &scedil; ISOlat2 # LATIN SMALL LETTER S WITH CEDILLA
+0x0160 &Scaron; ISOlat2 # LATIN CAPITAL LETTER S WITH CARON
+0x0161 &scaron; ISOlat2 # LATIN SMALL LETTER S WITH CARON
+0x0162 &Tcedil; ISOlat2 # LATIN CAPITAL LETTER T WITH CEDILLA
+0x0163 &tcedil; ISOlat2 # LATIN SMALL LETTER T WITH CEDILLA
+0x0164 &Tcaron; ISOlat2 # LATIN CAPITAL LETTER T WITH CARON
+0x0165 &tcaron; ISOlat2 # LATIN SMALL LETTER T WITH CARON
+0x0166 &Tstrok; ISOlat2 # LATIN CAPITAL LETTER T WITH STROKE
+0x0167 &tstrok; ISOlat2 # LATIN SMALL LETTER T WITH STROKE
+0x0168 &Utilde; ISOlat2 # LATIN CAPITAL LETTER U WITH TILDE
+0x0169 &utilde; ISOlat2 # LATIN SMALL LETTER U WITH TILDE
+0x016A &Umacr; ISOlat2 # LATIN CAPITAL LETTER U WITH MACRON
+0x016B &umacr; ISOlat2 # LATIN SMALL LETTER U WITH MACRON
+0x016C &Ubreve; ISOlat2 # LATIN CAPITAL LETTER U WITH BREVE
+0x016D &ubreve; ISOlat2 # LATIN SMALL LETTER U WITH BREVE
+0x016E &Uring; ISOlat2 # LATIN CAPITAL LETTER U WITH RING ABOVE
+0x016F &uring; ISOlat2 # LATIN SMALL LETTER U WITH RING ABOVE
+0x0170 &Udblac; ISOlat2 # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+0x0171 &udblac; ISOlat2 # LATIN SMALL LETTER U WITH DOUBLE ACUTE
+0x0172 &Uogon; ISOlat2 # LATIN CAPITAL LETTER U WITH OGONEK
+0x0173 &uogon; ISOlat2 # LATIN SMALL LETTER U WITH OGONEK
+0x0174 &Wcirc; ISOlat2 # LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+0x0175 &wcirc; ISOlat2 # LATIN SMALL LETTER W WITH CIRCUMFLEX
+0x0176 &Ycirc; ISOlat2 # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+0x0177 &ycirc; ISOlat2 # LATIN SMALL LETTER Y WITH CIRCUMFLEX
+0x0178 &Yuml; ISOlat2 # LATIN CAPITAL LETTER Y WITH DIAERESIS
+0x0179 &Zacute; ISOlat2 # LATIN CAPITAL LETTER Z WITH ACUTE
+0x017A &zacute; ISOlat2 # LATIN SMALL LETTER Z WITH ACUTE
+0x017B &Zdot; ISOlat2 # LATIN CAPITAL LETTER Z WITH DOT ABOVE
+0x017C &zdot; ISOlat2 # LATIN SMALL LETTER Z WITH DOT ABOVE
+0x017D &Zcaron; ISOlat2 # LATIN CAPITAL LETTER Z WITH CARON
+0x017E &zcaron; ISOlat2 # LATIN SMALL LETTER Z WITH CARON
+0x0192 &fnof; ISOtech # LATIN SMALL LETTER F WITH HOOK
+0x01F5 &gacute; ISOlat2 # LATIN SMALL LETTER G WITH ACUTE
+0x02BC &apos; ISOnum # MODIFIER LETTER APOSTROPHE
+0x02C6 &circ; ISOdia # MODIFIER LETTER CIRCUMFLEX ACCENT
+0x02C7 &caron; ISOdia # CARON
+0x02D8 &breve; ISOdia # BREVE
+0x02D9 &dot; ISOdia # DOT ABOVE
+0x02DA &ring; ISOdia # RING ABOVE
+0x02DB &ogon; ISOdia # OGONEK
+0x02DC &tilde; ISOdia # SMALL TILDE
+0x02DD &dblac; ISOdia # DOUBLE ACUTE ACCENT
+0x0386 &Aacgr; ISOgrk2 # GREEK CAPITAL LETTER ALPHA WITH TONOS
+0x0388 &Eacgr; ISOgrk2 # GREEK CAPITAL LETTER EPSILON WITH TONOS
+0x0389 &EEacgr; ISOgrk2 # GREEK CAPITAL LETTER ETA WITH TONOS
+0x038A &Iacgr; ISOgrk2 # GREEK CAPITAL LETTER IOTA WITH TONOS
+0x038C &Oacgr; ISOgrk2 # GREEK CAPITAL LETTER OMICRON WITH TONOS
+0x038E &Uacgr; ISOgrk2 # GREEK CAPITAL LETTER UPSILON WITH TONOS
+0x038F &OHacgr; ISOgrk2 # GREEK CAPITAL LETTER OMEGA WITH TONOS
+0x0390 &idiagr; ISOgrk2 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+0x0391 &Agr; ISOgrk1 # GREEK CAPITAL LETTER ALPHA
+0x0391 &Alpha; HTMLsymbol # GREEK CAPITAL LETTER ALPHA
+0x0392 &Beta; HTMLsymbol # GREEK CAPITAL LETTER BETA
+0x0392 &Bgr; ISOgrk1 # GREEK CAPITAL LETTER BETA
+0x0393 &Gamma; ISOgrk3 # GREEK CAPITAL LETTER GAMMA
+0x0393 &Ggr; ISOgrk1 # GREEK CAPITAL LETTER GAMMA
+0x0393 &b.Gamma; ISOgrk4 # GREEK CAPITAL LETTER GAMMA
+0x0394 &Delta; ISOgrk3 # GREEK CAPITAL LETTER DELTA
+0x0394 &Dgr; ISOgrk1 # GREEK CAPITAL LETTER DELTA
+0x0394 &b.Delta; ISOgrk4 # GREEK CAPITAL LETTER DELTA
+0x0395 &Egr; ISOgrk1 # GREEK CAPITAL LETTER EPSILON
+0x0395 &Epsilon; HTMLsymbol # GREEK CAPITAL LETTER EPSILON
+0x0396 &Zeta; HTMLsymbol # GREEK CAPITAL LETTER ZETA
+0x0396 &Zgr; ISOgrk1 # GREEK CAPITAL LETTER ZETA
+0x0397 &EEgr; ISOgrk1 # GREEK CAPITAL LETTER ETA
+0x0397 &Eta; HTMLsymbol # GREEK CAPITAL LETTER ETA
+0x0398 &THgr; ISOgrk1 # GREEK CAPITAL LETTER THETA
+0x0398 &Theta; ISOgrk3 # GREEK CAPITAL LETTER THETA
+0x0398 &b.Theta; ISOgrk4 # GREEK CAPITAL LETTER THETA
+0x0399 &Igr; ISOgrk1 # GREEK CAPITAL LETTER IOTA
+0x0399 &Iota; HTMLsymbol # GREEK CAPITAL LETTER IOTA
+0x039A &Kappa; HTMLsymbol # GREEK CAPITAL LETTER KAPPA
+0x039A &Kgr; ISOgrk1 # GREEK CAPITAL LETTER KAPPA
+0x039B &Lambda; ISOgrk3 # GREEK CAPITAL LETTER LAMDA
+0x039B &Lgr; ISOgrk1 # GREEK CAPITAL LETTER LAMDA
+0x039B &b.Lambda; ISOgrk4 # GREEK CAPITAL LETTER LAMDA
+0x039C &Mgr; ISOgrk1 # GREEK CAPITAL LETTER MU
+0x039C &Mu; HTMLsymbol # GREEK CAPITAL LETTER MU
+0x039D &Ngr; ISOgrk1 # GREEK CAPITAL LETTER NU
+0x039D &Nu; HTMLsymbol # GREEK CAPITAL LETTER NU
+0x039E &Xgr; ISOgrk1 # GREEK CAPITAL LETTER XI
+0x039E &Xi; ISOgrk3 # GREEK CAPITAL LETTER XI
+0x039E &b.Xi; ISOgrk4 # GREEK CAPITAL LETTER XI
+0x039F &Ogr; ISOgrk1 # GREEK CAPITAL LETTER OMICRON
+0x039F &Omicron; HTMLsymbol # GREEK CAPITAL LETTER OMICRON
+0x03A0 &Pgr; ISOgrk1 # GREEK CAPITAL LETTER PI
+0x03A0 &Pi; ISOgrk3 # GREEK CAPITAL LETTER PI
+0x03A0 &b.Pi; ISOgrk4 # GREEK CAPITAL LETTER PI
+0x03A1 &Rgr; ISOgrk1 # GREEK CAPITAL LETTER RHO
+0x03A1 &Rho; HTMLsymbol # GREEK CAPITAL LETTER RHO
+0x03A3 &Sgr; ISOgrk1 # GREEK CAPITAL LETTER SIGMA
+0x03A3 &Sigma; ISOgrk3 # GREEK CAPITAL LETTER SIGMA
+0x03A3 &b.Sigma; ISOgrk4 # GREEK CAPITAL LETTER SIGMA
+0x03A4 &Tau; HTMLsymbol # GREEK CAPITAL LETTER TAU
+0x03A4 &Tgr; ISOgrk1 # GREEK CAPITAL LETTER TAU
+0x03A5 &Ugr; ISOgrk1 # GREEK CAPITAL LETTER UPSILON
+0x03A5 &Upsi; ISOgrk3 # GREEK CAPITAL LETTER UPSILON
+0x03A5 &Upsilon; HTMLsymbol # GREEK CAPITAL LETTER UPSILON
+0x03A5 &b.Upsi; ISOgrk4 # GREEK CAPITAL LETTER UPSILON
+0x03A6 &PHgr; ISOgrk1 # GREEK CAPITAL LETTER PHI
+0x03A6 &Phi; ISOgrk3 # GREEK CAPITAL LETTER PHI
+0x03A6 &b.Phi; ISOgrk4 # GREEK CAPITAL LETTER PHI
+0x03A7 &Chi; HTMLsymbol # GREEK CAPITAL LETTER CHI
+0x03A7 &KHgr; ISOgrk1 # GREEK CAPITAL LETTER CHI
+0x03A8 &PSgr; ISOgrk1 # GREEK CAPITAL LETTER PSI
+0x03A8 &Psi; ISOgrk3 # GREEK CAPITAL LETTER PSI
+0x03A8 &b.Psi; ISOgrk4 # GREEK CAPITAL LETTER PSI
+0x03A9 &OHgr; ISOgrk1 # GREEK CAPITAL LETTER OMEGA
+0x03A9 &Omega; ISOgrk3 # GREEK CAPITAL LETTER OMEGA
+0x03A9 &b.Omega; ISOgrk4 # GREEK CAPITAL LETTER OMEGA
+0x03AA &Idigr; ISOgrk2 # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
+0x03AB &Udigr; ISOgrk2 # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+0x03AC &aacgr; ISOgrk2 # GREEK SMALL LETTER ALPHA WITH TONOS
+0x03AD &eacgr; ISOgrk2 # GREEK SMALL LETTER EPSILON WITH TONOS
+0x03AE &eeacgr; ISOgrk2 # GREEK SMALL LETTER ETA WITH TONOS
+0x03AF &iacgr; ISOgrk2 # GREEK SMALL LETTER IOTA WITH TONOS
+0x03B0 &udiagr; ISOgrk2 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND
+0x03B1 &agr; ISOgrk1 # GREEK SMALL LETTER ALPHA
+0x03B1 &alpha; ISOgrk3 # GREEK SMALL LETTER ALPHA
+0x03B1 &b.alpha; ISOgrk4 # GREEK SMALL LETTER ALPHA
+0x03B2 &b.beta; ISOgrk4 # GREEK SMALL LETTER BETA
+0x03B2 &beta; ISOgrk3 # GREEK SMALL LETTER BETA
+0x03B2 &bgr; ISOgrk1 # GREEK SMALL LETTER BETA
+0x03B3 &b.gamma; ISOgrk4 # GREEK SMALL LETTER GAMMA
+0x03B3 &gamma; ISOgrk3 # GREEK SMALL LETTER GAMMA
+0x03B3 &ggr; ISOgrk1 # GREEK SMALL LETTER GAMMA
+0x03B4 &b.delta; ISOgrk4 # GREEK SMALL LETTER DELTA
+0x03B4 &delta; ISOgrk3 # GREEK SMALL LETTER DELTA
+0x03B4 &dgr; ISOgrk1 # GREEK SMALL LETTER DELTA
+0x03B5 &b.epsi; ISOgrk4 # GREEK SMALL LETTER EPSILON
+0x03B5 &b.epsis; ISOgrk4 # GREEK SMALL LETTER EPSILON
+0x03B5 &b.epsiv; ISOgrk4 # GREEK SMALL LETTER EPSILON
+0x03B5 &egr; ISOgrk1 # GREEK SMALL LETTER EPSILON
+0x03B5 &epsi; ISOgrk3 # GREEK SMALL LETTER EPSILON
+0x03B5 &epsilon; HTMLsymbol # GREEK SMALL LETTER EPSILON
+0x03B6 &b.zeta; ISOgrk4 # GREEK SMALL LETTER ZETA
+0x03B6 &zeta; ISOgrk3 # GREEK SMALL LETTER ZETA
+0x03B6 &zgr; ISOgrk1 # GREEK SMALL LETTER ZETA
+0x03B7 &b.eta; ISOgrk4 # GREEK SMALL LETTER ETA
+0x03B7 &eegr; ISOgrk1 # GREEK SMALL LETTER ETA
+0x03B7 &eta; ISOgrk3 # GREEK SMALL LETTER ETA
+0x03B8 &b.thetas; ISOgrk4 # GREEK SMALL LETTER THETA
+0x03B8 &theta; HTMLsymbol # GREEK SMALL LETTER THETA
+0x03B8 &thetas; ISOgrk3 # GREEK SMALL LETTER THETA
+0x03B8 &thgr; ISOgrk1 # GREEK SMALL LETTER THETA
+0x03B9 &b.iota; ISOgrk4 # GREEK SMALL LETTER IOTA
+0x03B9 &igr; ISOgrk1 # GREEK SMALL LETTER IOTA
+0x03B9 &iota; ISOgrk3 # GREEK SMALL LETTER IOTA
+0x03BA &b.kappa; ISOgrk4 # GREEK SMALL LETTER KAPPA
+0x03BA &kappa; ISOgrk3 # GREEK SMALL LETTER KAPPA
+0x03BA &kgr; ISOgrk1 # GREEK SMALL LETTER KAPPA
+0x03BB &b.lambda; ISOgrk4 # GREEK SMALL LETTER LAMDA
+0x03BB &lambda; ISOgrk3 # GREEK SMALL LETTER LAMDA
+0x03BB &lgr; ISOgrk1 # GREEK SMALL LETTER LAMDA
+0x03BC &b.mu; ISOgrk4 # GREEK SMALL LETTER MU
+0x03BC &mgr; ISOgrk1 # GREEK SMALL LETTER MU
+0x03BC &mu; ISOgrk3 # GREEK SMALL LETTER MU
+0x03BD &b.nu; ISOgrk4 # GREEK SMALL LETTER NU
+0x03BD &ngr; ISOgrk1 # GREEK SMALL LETTER NU
+0x03BD &nu; ISOgrk3 # GREEK SMALL LETTER NU
+0x03BE &b.xi; ISOgrk4 # GREEK SMALL LETTER XI
+0x03BE &xgr; ISOgrk1 # GREEK SMALL LETTER XI
+0x03BE &xi; ISOgrk3 # GREEK SMALL LETTER XI
+0x03BF &ogr; ISOgrk1 # GREEK SMALL LETTER OMICRON
+0x03BF &omicron; HTMLsymbol # GREEK SMALL LETTER OMICRON
+0x03C0 &b.pi; ISOgrk4 # GREEK SMALL LETTER PI
+0x03C0 &pgr; ISOgrk1 # GREEK SMALL LETTER PI
+0x03C0 &pi; ISOgrk3 # GREEK SMALL LETTER PI
+0x03C1 &b.rho; ISOgrk4 # GREEK SMALL LETTER RHO
+0x03C1 &rgr; ISOgrk1 # GREEK SMALL LETTER RHO
+0x03C1 &rho; ISOgrk3 # GREEK SMALL LETTER RHO
+0x03C2 &b.sigmav; ISOgrk4 # GREEK SMALL LETTER FINAL SIGMA
+0x03C2 &sfgr; ISOgrk1 # GREEK SMALL LETTER FINAL SIGMA
+0x03C2 &sigmaf; HTMLsymbol # GREEK SMALL LETTER FINAL SIGMA
+0x03C2 &sigmav; ISOgrk3 # GREEK SMALL LETTER FINAL SIGMA
+0x03C3 &b.sigma; ISOgrk4 # GREEK SMALL LETTER SIGMA
+0x03C3 &sgr; ISOgrk1 # GREEK SMALL LETTER SIGMA
+0x03C3 &sigma; ISOgrk3 # GREEK SMALL LETTER SIGMA
+0x03C4 &b.tau; ISOgrk4 # GREEK SMALL LETTER TAU
+0x03C4 &tau; ISOgrk3 # GREEK SMALL LETTER TAU
+0x03C4 &tgr; ISOgrk1 # GREEK SMALL LETTER TAU
+0x03C5 &b.upsi; ISOgrk4 # GREEK SMALL LETTER UPSILON
+0x03C5 &ugr; ISOgrk1 # GREEK SMALL LETTER UPSILON
+0x03C5 &upsi; ISOgrk3 # GREEK SMALL LETTER UPSILON
+0x03C5 &upsilon; HTMLsymbol # GREEK SMALL LETTER UPSILON
+0x03C6 &b.phis; ISOgrk4 # GREEK SMALL LETTER PHI
+0x03C6 &phgr; ISOgrk1 # GREEK SMALL LETTER PHI
+0x03C6 &phi; HTMLsymbol # GREEK SMALL LETTER PHI
+0x03C6 &phis; ISOgrk3 # GREEK SMALL LETTER PHI
+0x03C7 &b.chi; ISOgrk4 # GREEK SMALL LETTER CHI
+0x03C7 &chi; ISOgrk3 # GREEK SMALL LETTER CHI
+0x03C7 &khgr; ISOgrk1 # GREEK SMALL LETTER CHI
+0x03C8 &b.psi; ISOgrk4 # GREEK SMALL LETTER PSI
+0x03C8 &psgr; ISOgrk1 # GREEK SMALL LETTER PSI
+0x03C8 &psi; ISOgrk3 # GREEK SMALL LETTER PSI
+0x03C9 &ohgr; ISOgrk1 # GREEK SMALL LETTER OMEGA
+0x03C9 &omega; ISOgrk3 # GREEK SMALL LETTER OMEGA
+0x03CA &idigr; ISOgrk2 # GREEK SMALL LETTER IOTA WITH DIALYTIKA
+0x03CB &udigr; ISOgrk2 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA
+0x03CC &oacgr; ISOgrk2 # GREEK SMALL LETTER OMICRON WITH TONOS
+0x03CD &uacgr; ISOgrk2 # GREEK SMALL LETTER UPSILON WITH TONOS
+0x03CE &b.omega; ISOgrk4 # GREEK SMALL LETTER OMEGA WITH TONOS
+0x03CE &ohacgr; ISOgrk2 # GREEK SMALL LETTER OMEGA WITH TONOS
+0x03D1 &b.thetav; ISOgrk4 # GREEK THETA SYMBOL
+0x03D1 &thetasym; HTMLsymbol # GREEK THETA SYMBOL
+0x03D1 &thetav; ISOgrk3 # GREEK THETA SYMBOL
+0x03D2 &upsih; HTMLsymbol # GREEK UPSILON WITH HOOK SYMBOL
+0x03D5 &b.phiv; ISOgrk4 # GREEK PHI SYMBOL
+0x03D5 &phiv; ISOgrk3 # GREEK PHI SYMBOL
+0x03D6 &b.piv; ISOgrk4 # GREEK PI SYMBOL
+0x03D6 &piv; ISOgrk3 # GREEK PI SYMBOL
+0x03DC &b.gammad; ISOgrk4 # GREEK LETTER DIGAMMA
+0x03DC &gammad; ISOgrk3 # GREEK LETTER DIGAMMA
+0x03F0 &b.kappav; ISOgrk4 # GREEK KAPPA SYMBOL
+0x03F0 &kappav; ISOgrk3 # GREEK KAPPA SYMBOL
+0x03F1 &b.rhov; ISOgrk4 # GREEK RHO SYMBOL
+0x03F1 &rhov; ISOgrk3 # GREEK RHO SYMBOL
+0x0401 &IOcy; ISOcyr1 # CYRILLIC CAPITAL LETTER IO
+0x0402 &DJcy; ISOcyr2 # CYRILLIC CAPITAL LETTER DJE
+0x0403 &GJcy; ISOcyr2 # CYRILLIC CAPITAL LETTER GJE
+0x0404 &Jukcy; ISOcyr2 # CYRILLIC CAPITAL LETTER UKRAINIAN IE
+0x0405 &DScy; ISOcyr2 # CYRILLIC CAPITAL LETTER DZE
+0x0406 &Iukcy; ISOcyr2 # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+0x0407 &YIcy; ISOcyr2 # CYRILLIC CAPITAL LETTER YI
+0x0408 &Jsercy; ISOcyr2 # CYRILLIC CAPITAL LETTER JE
+0x0409 &LJcy; ISOcyr2 # CYRILLIC CAPITAL LETTER LJE
+0x040A &NJcy; ISOcyr2 # CYRILLIC CAPITAL LETTER NJE
+0x040B &TSHcy; ISOcyr2 # CYRILLIC CAPITAL LETTER TSHE
+0x040C &KJcy; ISOcyr2 # CYRILLIC CAPITAL LETTER KJE
+0x040E &Ubrcy; ISOcyr2 # CYRILLIC CAPITAL LETTER SHORT U
+0x040F &DZcy; ISOcyr2 # CYRILLIC CAPITAL LETTER DZHE
+0x0410 &Acy; ISOcyr1 # CYRILLIC CAPITAL LETTER A
+0x0411 &Bcy; ISOcyr1 # CYRILLIC CAPITAL LETTER BE
+0x0412 &Vcy; ISOcyr1 # CYRILLIC CAPITAL LETTER VE
+0x0413 &Gcy; ISOcyr1 # CYRILLIC CAPITAL LETTER GHE
+0x0414 &Dcy; ISOcyr1 # CYRILLIC CAPITAL LETTER DE
+0x0415 &IEcy; ISOcyr1 # CYRILLIC CAPITAL LETTER IE
+0x0416 &ZHcy; ISOcyr1 # CYRILLIC CAPITAL LETTER ZHE
+0x0417 &Zcy; ISOcyr1 # CYRILLIC CAPITAL LETTER ZE
+0x0418 &Icy; ISOcyr1 # CYRILLIC CAPITAL LETTER I
+0x0419 &Jcy; ISOcyr1 # CYRILLIC CAPITAL LETTER SHORT I
+0x041A &Kcy; ISOcyr1 # CYRILLIC CAPITAL LETTER KA
+0x041B &Lcy; ISOcyr1 # CYRILLIC CAPITAL LETTER EL
+0x041C &Mcy; ISOcyr1 # CYRILLIC CAPITAL LETTER EM
+0x041D &Ncy; ISOcyr1 # CYRILLIC CAPITAL LETTER EN
+0x041E &Ocy; ISOcyr1 # CYRILLIC CAPITAL LETTER O
+0x041F &Pcy; ISOcyr1 # CYRILLIC CAPITAL LETTER PE
+0x0420 &Rcy; ISOcyr1 # CYRILLIC CAPITAL LETTER ER
+0x0421 &Scy; ISOcyr1 # CYRILLIC CAPITAL LETTER ES
+0x0422 &Tcy; ISOcyr1 # CYRILLIC CAPITAL LETTER TE
+0x0423 &Ucy; ISOcyr1 # CYRILLIC CAPITAL LETTER U
+0x0424 &Fcy; ISOcyr1 # CYRILLIC CAPITAL LETTER EF
+0x0425 &KHcy; ISOcyr1 # CYRILLIC CAPITAL LETTER HA
+0x0426 &TScy; ISOcyr1 # CYRILLIC CAPITAL LETTER TSE
+0x0427 &CHcy; ISOcyr1 # CYRILLIC CAPITAL LETTER CHE
+0x0428 &SHcy; ISOcyr1 # CYRILLIC CAPITAL LETTER SHA
+0x0429 &SHCHcy; ISOcyr1 # CYRILLIC CAPITAL LETTER SHCHA
+0x042A &HARDcy; ISOcyr1 # CYRILLIC CAPITAL LETTER HARD SIGN
+0x042B &Ycy; ISOcyr1 # CYRILLIC CAPITAL LETTER YERU
+0x042C &SOFTcy; ISOcyr1 # CYRILLIC CAPITAL LETTER SOFT SIGN
+0x042D &Ecy; ISOcyr1 # CYRILLIC CAPITAL LETTER E
+0x042E &YUcy; ISOcyr1 # CYRILLIC CAPITAL LETTER YU
+0x042F &YAcy; ISOcyr1 # CYRILLIC CAPITAL LETTER YA
+0x0430 &acy; ISOcyr1 # CYRILLIC SMALL LETTER A
+0x0431 &bcy; ISOcyr1 # CYRILLIC SMALL LETTER BE
+0x0432 &vcy; ISOcyr1 # CYRILLIC SMALL LETTER VE
+0x0433 &gcy; ISOcyr1 # CYRILLIC SMALL LETTER GHE
+0x0434 &dcy; ISOcyr1 # CYRILLIC SMALL LETTER DE
+0x0435 &iecy; ISOcyr1 # CYRILLIC SMALL LETTER IE
+0x0436 &zhcy; ISOcyr1 # CYRILLIC SMALL LETTER ZHE
+0x0437 &zcy; ISOcyr1 # CYRILLIC SMALL LETTER ZE
+0x0438 &icy; ISOcyr1 # CYRILLIC SMALL LETTER I
+0x0439 &jcy; ISOcyr1 # CYRILLIC SMALL LETTER SHORT I
+0x043A &kcy; ISOcyr1 # CYRILLIC SMALL LETTER KA
+0x043B &lcy; ISOcyr1 # CYRILLIC SMALL LETTER EL
+0x043C &mcy; ISOcyr1 # CYRILLIC SMALL LETTER EM
+0x043D &ncy; ISOcyr1 # CYRILLIC SMALL LETTER EN
+0x043E &ocy; ISOcyr1 # CYRILLIC SMALL LETTER O
+0x043F &pcy; ISOcyr1 # CYRILLIC SMALL LETTER PE
+0x0440 &rcy; ISOcyr1 # CYRILLIC SMALL LETTER ER
+0x0441 &scy; ISOcyr1 # CYRILLIC SMALL LETTER ES
+0x0442 &tcy; ISOcyr1 # CYRILLIC SMALL LETTER TE
+0x0443 &ucy; ISOcyr1 # CYRILLIC SMALL LETTER U
+0x0444 &fcy; ISOcyr1 # CYRILLIC SMALL LETTER EF
+0x0445 &khcy; ISOcyr1 # CYRILLIC SMALL LETTER HA
+0x0446 &tscy; ISOcyr1 # CYRILLIC SMALL LETTER TSE
+0x0447 &chcy; ISOcyr1 # CYRILLIC SMALL LETTER CHE
+0x0448 &shcy; ISOcyr1 # CYRILLIC SMALL LETTER SHA
+0x0449 &shchcy; ISOcyr1 # CYRILLIC SMALL LETTER SHCHA
+0x044A &hardcy; ISOcyr1 # CYRILLIC SMALL LETTER HARD SIGN
+0x044B &ycy; ISOcyr1 # CYRILLIC SMALL LETTER YERU
+0x044C &softcy; ISOcyr1 # CYRILLIC SMALL LETTER SOFT SIGN
+0x044D &ecy; ISOcyr1 # CYRILLIC SMALL LETTER E
+0x044E &yucy; ISOcyr1 # CYRILLIC SMALL LETTER YU
+0x044F &yacy; ISOcyr1 # CYRILLIC SMALL LETTER YA
+0x0451 &iocy; ISOcyr1 # CYRILLIC SMALL LETTER IO
+0x0452 &djcy; ISOcyr2 # CYRILLIC SMALL LETTER DJE
+0x0453 &gjcy; ISOcyr2 # CYRILLIC SMALL LETTER GJE
+0x0454 &jukcy; ISOcyr2 # CYRILLIC SMALL LETTER UKRAINIAN IE
+0x0455 &dscy; ISOcyr2 # CYRILLIC SMALL LETTER DZE
+0x0456 &iukcy; ISOcyr2 # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+0x0457 &yicy; ISOcyr2 # CYRILLIC SMALL LETTER YI
+0x0458 &jsercy; ISOcyr2 # CYRILLIC SMALL LETTER JE
+0x0459 &ljcy; ISOcyr2 # CYRILLIC SMALL LETTER LJE
+0x045A &njcy; ISOcyr2 # CYRILLIC SMALL LETTER NJE
+0x045B &tshcy; ISOcyr2 # CYRILLIC SMALL LETTER TSHE
+0x045C &kjcy; ISOcyr2 # CYRILLIC SMALL LETTER KJE
+0x045E &ubrcy; ISOcyr2 # CYRILLIC SMALL LETTER SHORT U
+0x045F &dzcy; ISOcyr2 # CYRILLIC SMALL LETTER DZHE
+0x2002 &ensp; ISOpub # EN SPACE
+0x2003 &emsp; ISOpub # EM SPACE
+0x2004 &emsp13; ISOpub # THREE-PER-EM SPACE
+0x2005 &emsp14; ISOpub # FOUR-PER-EM SPACE
+0x2007 &numsp; ISOpub # FIGURE SPACE
+0x2008 &puncsp; ISOpub # PUNCTUATION SPACE
+0x2009 &thinsp; ISOpub # THIN SPACE
+0x200A &hairsp; ISOpub # HAIR SPACE
+0x200C &zwnj; HTMLspecial # ZERO WIDTH NON-JOINER
+0x200D &zwj; HTMLspecial # ZERO WIDTH JOINER
+0x200E &lrm; HTMLspecial # LEFT-TO-RIGHT MARK
+0x200F &rlm; HTMLspecial # RIGHT-TO-LEFT MARK
+0x2010 &dash; ISOpub # HYPHEN
+0x2013 &ndash; ISOpub # EN DASH
+0x2014 &mdash; ISOpub # EM DASH
+0x2015 &horbar; ISOnum # HORIZONTAL BAR
+0x2016 &Verbar; ISOtech # DOUBLE VERTICAL LINE
+0x2018 &lsquo; ISOnum # LEFT SINGLE QUOTATION MARK
+0x2018 &rsquor; ISOpub # LEFT SINGLE QUOTATION MARK
+0x2019 &rsquo; ISOnum # RIGHT SINGLE QUOTATION MARK
+0x201A &lsquor; ISOpub # SINGLE LOW-9 QUOTATION MARK
+0x201A &sbquo; HTMLspecial # SINGLE LOW-9 QUOTATION MARK
+0x201C &ldquo; ISOnum # LEFT DOUBLE QUOTATION MARK
+0x201C &rdquor; ISOpub # LEFT DOUBLE QUOTATION MARK
+0x201D &rdquo; ISOnum # RIGHT DOUBLE QUOTATION MARK
+0x201E &bdquo; HTMLspecial # DOUBLE LOW-9 QUOTATION MARK
+0x201E &ldquor; ISOpub # DOUBLE LOW-9 QUOTATION MARK
+0x2020 &dagger; ISOpub # DAGGER
+0x2021 &Dagger; ISOpub # DOUBLE DAGGER
+0x2022 &bull; ISOpub # BULLET
+0x2025 &nldr; ISOpub # TWO DOT LEADER
+0x2026 &hellip; ISOpub # HORIZONTAL ELLIPSIS
+0x2026 &mldr; ISOpub # HORIZONTAL ELLIPSIS
+0x2030 &permil; ISOtech # PER MILLE SIGN
+0x2032 &prime; ISOtech # PRIME
+0x2032 &vprime; ISOamso # PRIME
+0x2033 &Prime; ISOtech # DOUBLE PRIME
+0x2034 &tprime; ISOtech # TRIPLE PRIME
+0x2035 &bprime; ISOamso # REVERSED PRIME
+0x2039 &lsaquo; HTMLspecial # SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+0x203A &rsaquo; HTMLspecial # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+0x203E &oline; HTMLsymbol # OVERLINE
+0x2041 &caret; ISOpub # CARET INSERTION POINT
+0x2043 &hybull; ISOpub # HYPHEN BULLET
+0x2044 &frasl; HTMLsymbol # FRACTION SLASH
+0x20AC &euro; new # EURO SIGN
+0x20DB &tdot; ISOtech # COMBINING THREE DOTS ABOVE
+0x20DC &DotDot; ISOtech # COMBINING FOUR DOTS ABOVE
+0x2105 &incare; ISOpub # CARE OF
+0x210B &hamilt; ISOtech # SCRIPT CAPITAL H
+0x210F &planck; ISOamso # PLANCK CONSTANT OVER TWO PI
+0x2111 &image; ISOamso # BLACK-LETTER CAPITAL I
+0x2112 &lagran; ISOtech # SCRIPT CAPITAL L
+0x2113 &ell; ISOamso # SCRIPT SMALL L
+0x2116 &numero; ISOcyr1 # NUMERO SIGN
+0x2117 &copysr; ISOpub # SOUND RECORDING COPYRIGHT
+0x2118 &weierp; ISOamso # SCRIPT CAPITAL P
+0x211C &real; ISOamso # BLACK-LETTER CAPITAL R
+0x211E &rx; ISOpub # PRESCRIPTION TAKE
+0x2122 &trade; ISOnum # TRADE MARK SIGN
+0x2126 &ohm; ISOnum # OHM SIGN
+0x212B &angst; ISOtech # ANGSTROM SIGN
+0x212C &bernou; ISOtech # SCRIPT CAPITAL B
+0x2133 &phmmat; ISOtech # SCRIPT CAPITAL M
+0x2134 &order; ISOtech # SCRIPT SMALL O
+0x2135 &alefsym; HTMLsymbol # ALEF SYMBOL
+0x2135 &aleph; ISOtech # ALEF SYMBOL
+0x2136 &beth; ISOamso # BET SYMBOL
+0x2137 &gimel; ISOamso # GIMEL SYMBOL
+0x2138 &daleth; ISOamso # DALET SYMBOL
+0x2153 &frac13; ISOpub # VULGAR FRACTION ONE THIRD
+0x2154 &frac23; ISOpub # VULGAR FRACTION TWO THIRDS
+0x2155 &frac15; ISOpub # VULGAR FRACTION ONE FIFTH
+0x2156 &frac25; ISOpub # VULGAR FRACTION TWO FIFTHS
+0x2157 &frac35; ISOpub # VULGAR FRACTION THREE FIFTHS
+0x2158 &frac45; ISOpub # VULGAR FRACTION FOUR FIFTHS
+0x2159 &frac16; ISOpub # VULGAR FRACTION ONE SIXTH
+0x215A &frac56; ISOpub # VULGAR FRACTION FIVE SIXTHS
+0x215B &frac18; ISOnum # VULGAR FRACTION ONE EIGHTH
+0x215C &frac38; ISOnum # VULGAR FRACTION THREE EIGHTHS
+0x215D &frac58; ISOnum # VULGAR FRACTION FIVE EIGHTHS
+0x215E &frac78; ISOnum # VULGAR FRACTION SEVEN EIGHTHS
+0x2190 &larr; ISOnum # LEFTWARDS ARROW
+0x2191 &uarr; ISOnum # UPWARDS ARROW
+0x2192 &rarr; ISOnum # RIGHTWARDS ARROW
+0x2193 &darr; ISOnum # DOWNWARDS ARROW
+0x2194 &harr; ISOamsa # LEFT RIGHT ARROW
+0x2194 &xhArr; ISOamsa # LEFT RIGHT ARROW
+0x2194 &xharr; ISOamsa # LEFT RIGHT ARROW
+0x2195 &varr; ISOamsa # UP DOWN ARROW
+0x2196 &nwarr; ISOamsa # NORTH WEST ARROW
+0x2197 &nearr; ISOamsa # NORTH EAST ARROW
+0x2198 &drarr; ISOamsa # SOUTH EAST ARROW
+0x2199 &dlarr; ISOamsa # SOUTH WEST ARROW
+0x219A &nlarr; ISOamsa # LEFTWARDS ARROW WITH STROKE
+0x219B &nrarr; ISOamsa # RIGHTWARDS ARROW WITH STROKE
+0x219D &rarrw; ISOamsa # RIGHTWARDS WAVE ARROW
+0x219E &Larr; ISOamsa # LEFTWARDS TWO HEADED ARROW
+0x21A0 &Rarr; ISOamsa # RIGHTWARDS TWO HEADED ARROW
+0x21A2 &larrtl; ISOamsa # LEFTWARDS ARROW WITH TAIL
+0x21A3 &rarrtl; ISOamsa # RIGHTWARDS ARROW WITH TAIL
+0x21A6 &map; ISOamsa # RIGHTWARDS ARROW FROM BAR
+0x21A9 &larrhk; ISOamsa # LEFTWARDS ARROW WITH HOOK
+0x21AA &rarrhk; ISOamsa # RIGHTWARDS ARROW WITH HOOK
+0x21AB &larrlp; ISOamsa # LEFTWARDS ARROW WITH LOOP
+0x21AC &rarrlp; ISOamsa # RIGHTWARDS ARROW WITH LOOP
+0x21AD &harrw; ISOamsa # LEFT RIGHT WAVE ARROW
+0x21AE &nharr; ISOamsa # LEFT RIGHT ARROW WITH STROKE
+0x21B0 &lsh; ISOamsa # UPWARDS ARROW WITH TIP LEFTWARDS
+0x21B1 &rsh; ISOamsa # UPWARDS ARROW WITH TIP RIGHTWARDS
+0x21B5 &crarr; HTMLsymbol # DOWNWARDS ARROW WITH CORNER LEFTWARDS
+0x21B6 &cularr; ISOamsa # ANTICLOCKWISE TOP SEMICIRCLE ARROW
+0x21B7 &curarr; ISOamsa # CLOCKWISE TOP SEMICIRCLE ARROW
+0x21BA &olarr; ISOamsa # ANTICLOCKWISE OPEN CIRCLE ARROW
+0x21BB &orarr; ISOamsa # CLOCKWISE OPEN CIRCLE ARROW
+0x21BC &lharu; ISOamsa # LEFTWARDS HARPOON WITH BARB UPWARDS
+0x21BD &lhard; ISOamsa # LEFTWARDS HARPOON WITH BARB DOWNWARDS
+0x21BE &uharr; ISOamsa # UPWARDS HARPOON WITH BARB RIGHTWARDS
+0x21BF &uharl; ISOamsa # UPWARDS HARPOON WITH BARB LEFTWARDS
+0x21C0 &rharu; ISOamsa # RIGHTWARDS HARPOON WITH BARB UPWARDS
+0x21C1 &rhard; ISOamsa # RIGHTWARDS HARPOON WITH BARB DOWNWARDS
+0x21C2 &dharr; ISOamsa # DOWNWARDS HARPOON WITH BARB RIGHTWARDS
+0x21C3 &dharl; ISOamsa # DOWNWARDS HARPOON WITH BARB LEFTWARDS
+0x21C4 &rlarr2; ISOamsa # RIGHTWARDS ARROW OVER LEFTWARDS ARROW
+0x21C6 &lrarr2; ISOamsa # LEFTWARDS ARROW OVER RIGHTWARDS ARROW
+0x21C7 &larr2; ISOamsa # LEFTWARDS PAIRED ARROWS
+0x21C8 &uarr2; ISOamsa # UPWARDS PAIRED ARROWS
+0x21C9 &rarr2; ISOamsa # RIGHTWARDS PAIRED ARROWS
+0x21CA &darr2; ISOamsa # DOWNWARDS PAIRED ARROWS
+0x21CB &lrhar2; ISOamsa # LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
+0x21CC &rlhar2; ISOamsa # RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
+0x21CD &nlArr; ISOamsa # LEFTWARDS DOUBLE ARROW WITH STROKE
+0x21CE &nhArr; ISOamsa # LEFT RIGHT DOUBLE ARROW WITH STROKE
+0x21CF &nrArr; ISOamsa # RIGHTWARDS DOUBLE ARROW WITH STROKE
+0x21D0 &lArr; ISOtech # LEFTWARDS DOUBLE ARROW
+0x21D0 &xlArr; ISOamsa # LEFTWARDS DOUBLE ARROW
+0x21D1 &uArr; ISOamsa # UPWARDS DOUBLE ARROW
+0x21D2 &rArr; ISOtech # RIGHTWARDS DOUBLE ARROW
+0x21D2 &xrArr; ISOamsa # RIGHTWARDS DOUBLE ARROW
+0x21D3 &dArr; ISOamsa # DOWNWARDS DOUBLE ARROW
+0x21D4 &hArr; ISOamsa # LEFT RIGHT DOUBLE ARROW
+0x21D4 &iff; ISOtech # LEFT RIGHT DOUBLE ARROW
+0x21D5 &vArr; ISOamsa # UP DOWN DOUBLE ARROW
+0x21DA &lAarr; ISOamsa # LEFTWARDS TRIPLE ARROW
+0x21DB &rAarr; ISOamsa # RIGHTWARDS TRIPLE ARROW
+0x2200 &forall; ISOtech # FOR ALL
+0x2201 &comp; ISOamso # COMPLEMENT
+0x2202 &part; ISOtech # PARTIAL DIFFERENTIAL
+0x2203 &exist; ISOtech # THERE EXISTS
+0x2204 &nexist; ISOamso # THERE DOES NOT EXIST
+0x2205 &empty; ISOamso # EMPTY SET
+0x2207 &nabla; ISOtech # NABLA
+0x2208 &isin; ISOtech # ELEMENT OF
+0x2209 &notin; ISOtech # NOT AN ELEMENT OF
+0x220A &epsis; ISOgrk3 # SMALL ELEMENT OF
+0x220B &ni; ISOtech # CONTAINS AS MEMBER
+0x220D &bepsi; ISOamsr # SMALL CONTAINS AS MEMBER
+0x220F &prod; ISOamsb # N-ARY PRODUCT
+0x2210 &amalg; ISOamsb # N-ARY COPRODUCT
+0x2210 &coprod; ISOamsb # N-ARY COPRODUCT
+0x2210 &samalg; ISOamsr # N-ARY COPRODUCT
+0x2211 &sum; ISOamsb # N-ARY SUMMATION
+0x2212 &minus; ISOtech # MINUS SIGN
+0x2213 &mnplus; ISOtech # MINUS-OR-PLUS SIGN
+0x2214 &plusdo; ISOamsb # DOT PLUS
+0x2216 &setmn; ISOamsb # SET MINUS
+0x2216 &ssetmn; ISOamsb # SET MINUS
+0x2217 &lowast; ISOtech # ASTERISK OPERATOR
+0x2218 &compfn; ISOtech # RING OPERATOR
+0x221A &radic; ISOtech # SQUARE ROOT
+0x221D &prop; ISOtech # PROPORTIONAL TO
+0x221D &vprop; ISOamsr # PROPORTIONAL TO
+0x221E &infin; ISOtech # INFINITY
+0x221F &ang90; ISOtech # RIGHT ANGLE
+0x2220 &ang; ISOamso # ANGLE
+0x2221 &angmsd; ISOamso # MEASURED ANGLE
+0x2222 &angsph; ISOtech # SPHERICAL ANGLE
+0x2223 &mid; ISOamsr # DIVIDES
+0x2224 &nmid; ISOamsn # DOES NOT DIVIDE
+0x2225 &par; ISOtech # PARALLEL TO
+0x2225 &spar; ISOamsr # PARALLEL TO
+0x2226 &npar; ISOamsn # NOT PARALLEL TO
+0x2226 &nspar; ISOamsn # NOT PARALLEL TO
+0x2227 &and; ISOtech # LOGICAL AND
+0x2228 &or; ISOtech # LOGICAL OR
+0x2229 &cap; ISOtech # INTERSECTION
+0x222A &cup; ISOtech # UNION
+0x222B &int; ISOtech # INTEGRAL
+0x222E &conint; ISOtech # CONTOUR INTEGRAL
+0x2234 &there4; ISOtech # THEREFORE
+0x2235 &becaus; ISOtech # BECAUSE
+0x223C &sim; ISOtech # TILDE OPERATOR
+0x223C &thksim; ISOamsr # TILDE OPERATOR
+0x223D &bsim; ISOamsr # REVERSED TILDE
+0x2240 &wreath; ISOamsb # WREATH PRODUCT
+0x2241 &nsim; ISOamsn # NOT TILDE
+0x2243 &sime; ISOtech # ASYMPTOTICALLY EQUAL TO
+0x2244 &nsime; ISOamsn # NOT ASYMPTOTICALLY EQUAL TO
+0x2245 &cong; ISOtech # APPROXIMATELY EQUAL TO
+0x2247 &ncong; ISOamsn # NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO
+0x2248 &ap; ISOtech # ALMOST EQUAL TO
+0x2248 &asymp; ISOamsr # ALMOST EQUAL TO
+0x2248 &thkap; ISOamsr # ALMOST EQUAL TO
+0x2249 &nap; ISOamsn # NOT ALMOST EQUAL TO
+0x224A &ape; ISOamsr # ALMOST EQUAL OR EQUAL TO
+0x224C &bcong; ISOamsr # ALL EQUAL TO
+0x224E &bump; ISOamsr # GEOMETRICALLY EQUIVALENT TO
+0x224F &bumpe; ISOamsr # DIFFERENCE BETWEEN
+0x2250 &esdot; ISOamsr # APPROACHES THE LIMIT
+0x2251 &eDot; ISOamsr # GEOMETRICALLY EQUAL TO
+0x2252 &efDot; ISOamsr # APPROXIMATELY EQUAL TO OR THE IMAGE OF
+0x2253 &erDot; ISOamsr # IMAGE OF OR APPROXIMATELY EQUAL TO
+0x2254 &colone; ISOamsr # COLON EQUALS
+0x2255 &ecolon; ISOamsr # EQUALS COLON
+0x2256 &ecir; ISOamsr # RING IN EQUAL TO
+0x2257 &cire; ISOamsr # RING EQUAL TO
+0x2259 &wedgeq; ISOtech # ESTIMATES
+0x225C &trie; ISOamsr # DELTA EQUAL TO
+0x2260 &ne; ISOtech # NOT EQUAL TO
+0x2261 &equiv; ISOtech # IDENTICAL TO
+0x2262 &nequiv; ISOamsn # NOT IDENTICAL TO
+0x2264 &le; ISOtech # LESS-THAN OR EQUAL TO
+0x2264 &les; ISOamsr # LESS-THAN OR EQUAL TO
+0x2265 &ge; ISOtech # GREATER-THAN OR EQUAL TO
+0x2265 &ges; ISOamsr # GREATER-THAN OR EQUAL TO
+0x2266 &lE; ISOamsr # LESS-THAN OVER EQUAL TO
+0x2267 &gE; ISOamsr # GREATER-THAN OVER EQUAL TO
+0x2268 &lnE; ISOamsn # LESS-THAN BUT NOT EQUAL TO
+0x2268 &lne; ISOamsn # LESS-THAN BUT NOT EQUAL TO
+0x2268 &lvnE; ISOamsn # LESS-THAN BUT NOT EQUAL TO
+0x2269 &gnE; ISOamsn # GREATER-THAN BUT NOT EQUAL TO
+0x2269 &gne; ISOamsn # GREATER-THAN BUT NOT EQUAL TO
+0x2269 &gvnE; ISOamsn # GREATER-THAN BUT NOT EQUAL TO
+0x226A &Lt; ISOamsr # MUCH LESS-THAN
+0x226B &Gt; ISOamsr # MUCH GREATER-THAN
+0x226C &twixt; ISOamsr # BETWEEN
+0x226E &nlt; ISOamsn # NOT LESS-THAN
+0x226F &ngt; ISOamsn # NOT GREATER-THAN
+0x2270 &nle; ISOamsn # NEITHER LESS-THAN NOR EQUAL TO
+0x2270 &nles; ISOamsn # NEITHER LESS-THAN NOR EQUAL TO
+0x2271 &nge; ISOamsn # NEITHER GREATER-THAN NOR EQUAL TO
+0x2271 &nges; ISOamsn # NEITHER GREATER-THAN NOR EQUAL TO
+0x2272 &lsim; ISOamsr # LESS-THAN OR EQUIVALENT TO
+0x2273 &gsim; ISOamsr # GREATER-THAN OR EQUIVALENT TO
+0x2276 &lg; ISOamsr # LESS-THAN OR GREATER-THAN
+0x2277 &gl; ISOamsr # GREATER-THAN OR LESS-THAN
+0x227A &pr; ISOamsr # PRECEDES
+0x227B &sc; ISOamsr # SUCCEEDS
+0x227C &cupre; ISOamsr # PRECEDES OR EQUAL TO
+0x227C &pre; ISOamsr # PRECEDES OR EQUAL TO
+0x227D &sccue; ISOamsr # SUCCEEDS OR EQUAL TO
+0x227D &sce; ISOamsr # SUCCEEDS OR EQUAL TO
+0x227E &prsim; ISOamsr # PRECEDES OR EQUIVALENT TO
+0x227F &scsim; ISOamsr # SUCCEEDS OR EQUIVALENT TO
+0x2280 &npr; ISOamsn # DOES NOT PRECEDE
+0x2281 &nsc; ISOamsn # DOES NOT SUCCEED
+0x2282 &sub; ISOtech # SUBSET OF
+0x2283 &sup; ISOtech # SUPERSET OF
+0x2284 &nsub; ISOamsn # NOT A SUBSET OF
+0x2285 &nsup; ISOamsn # NOT A SUPERSET OF
+0x2286 &subE; ISOamsr # SUBSET OF OR EQUAL TO
+0x2286 &sube; ISOtech # SUBSET OF OR EQUAL TO
+0x2287 &supE; ISOamsr # SUPERSET OF OR EQUAL TO
+0x2287 &supe; ISOtech # SUPERSET OF OR EQUAL TO
+0x2288 &nsubE; ISOamsn # NEITHER A SUBSET OF NOR EQUAL TO
+0x2288 &nsube; ISOamsn # NEITHER A SUBSET OF NOR EQUAL TO
+0x2289 &nsupE; ISOamsn # NEITHER A SUPERSET OF NOR EQUAL TO
+0x2289 &nsupe; ISOamsn # NEITHER A SUPERSET OF NOR EQUAL TO
+0x228A &subnE; ISOamsn # SUBSET OF WITH NOT EQUAL TO
+0x228A &subne; ISOamsn # SUBSET OF WITH NOT EQUAL TO
+0x228A &vsubnE; ISOamsn # SUBSET OF WITH NOT EQUAL TO
+0x228A &vsubne; ISOamsn # SUBSET OF WITH NOT EQUAL TO
+0x228B &supnE; ISOamsn # SUPERSET OF WITH NOT EQUAL TO
+0x228B &supne; ISOamsn # SUPERSET OF WITH NOT EQUAL TO
+0x228B &vsupnE; ISOamsn # SUPERSET OF WITH NOT EQUAL TO
+0x228B &vsupne; ISOamsn # SUPERSET OF WITH NOT EQUAL TO
+0x228E &uplus; ISOamsb # MULTISET UNION
+0x228F &sqsub; ISOamsr # SQUARE IMAGE OF
+0x2290 &sqsup; ISOamsr # SQUARE ORIGINAL OF
+0x2291 &sqsube; ISOamsr # SQUARE IMAGE OF OR EQUAL TO
+0x2292 &sqsupe; ISOamsr # SQUARE ORIGINAL OF OR EQUAL TO
+0x2293 &sqcap; ISOamsb # SQUARE CAP
+0x2294 &sqcup; ISOamsb # SQUARE CUP
+0x2295 &oplus; ISOamsb # CIRCLED PLUS
+0x2296 &ominus; ISOamsb # CIRCLED MINUS
+0x2297 &otimes; ISOamsb # CIRCLED TIMES
+0x2298 &osol; ISOamsb # CIRCLED DIVISION SLASH
+0x2299 &odot; ISOamsb # CIRCLED DOT OPERATOR
+0x229A &ocir; ISOamsb # CIRCLED RING OPERATOR
+0x229B &oast; ISOamsb # CIRCLED ASTERISK OPERATOR
+0x229D &odash; ISOamsb # CIRCLED DASH
+0x229E &plusb; ISOamsb # SQUARED PLUS
+0x229F &minusb; ISOamsb # SQUARED MINUS
+0x22A0 &timesb; ISOamsb # SQUARED TIMES
+0x22A1 &sdotb; ISOamsb # SQUARED DOT OPERATOR
+0x22A2 &vdash; ISOamsr # RIGHT TACK
+0x22A3 &dashv; ISOamsr # LEFT TACK
+0x22A4 &top; ISOamsb # DOWN TACK
+0x22A5 &bottom; ISOtech # UP TACK
+0x22A5 &perp; ISOtech # UP TACK
+0x22A7 &models; ISOamsr # MODELS
+0x22A8 &vDash; ISOamsr # TRUE
+0x22A9 &Vdash; ISOamsr # FORCES
+0x22AA &Vvdash; ISOamsr # TRIPLE VERTICAL BAR RIGHT TURNSTILE
+0x22AC &nvdash; ISOamsn # DOES NOT PROVE
+0x22AD &nvDash; ISOamsn # NOT TRUE
+0x22AE &nVdash; ISOamsn # DOES NOT FORCE
+0x22AF &nVDash; ISOamsn # NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT
+0x22B2 &vltri; ISOamsr # NORMAL SUBGROUP OF
+0x22B3 &vrtri; ISOamsr # CONTAINS AS NORMAL SUBGROUP
+0x22B4 &ltrie; ISOamsr # NORMAL SUBGROUP OF OR EQUAL TO
+0x22B5 &rtrie; ISOamsr # CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
+0x22B8 &mumap; ISOamsa # MULTIMAP
+0x22BA &intcal; ISOamsb # INTERCALATE
+0x22BB &veebar; ISOamsr # XOR
+0x22BC &barwed; ISOamsb # NAND
+0x22C4 &diam; ISOamsb # DIAMOND OPERATOR
+0x22C5 &sdot; ISOamsb # DOT OPERATOR
+0x22C6 &sstarf; ISOamsb # STAR OPERATOR
+0x22C7 &divonx; ISOamsb # DIVISION TIMES
+0x22C8 &bowtie; ISOamsr # BOWTIE
+0x22C9 &ltimes; ISOamsb # LEFT NORMAL FACTOR SEMIDIRECT PRODUCT
+0x22CA &rtimes; ISOamsb # RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT
+0x22CB &lthree; ISOamsb # LEFT SEMIDIRECT PRODUCT
+0x22CC &rthree; ISOamsb # RIGHT SEMIDIRECT PRODUCT
+0x22CD &bsime; ISOamsr # REVERSED TILDE EQUALS
+0x22CE &cuvee; ISOamsb # CURLY LOGICAL OR
+0x22CF &cuwed; ISOamsb # CURLY LOGICAL AND
+0x22D0 &Sub; ISOamsr # DOUBLE SUBSET
+0x22D1 &Sup; ISOamsr # DOUBLE SUPERSET
+0x22D2 &Cap; ISOamsb # DOUBLE INTERSECTION
+0x22D3 &Cup; ISOamsb # DOUBLE UNION
+0x22D4 &fork; ISOamsr # PITCHFORK
+0x22D6 &ldot; ISOamsr # LESS-THAN WITH DOT
+0x22D7 &gsdot; ISOamsr # GREATER-THAN WITH DOT
+0x22D8 &Ll; ISOamsr # VERY MUCH LESS-THAN
+0x22D9 &Gg; ISOamsr # VERY MUCH GREATER-THAN
+0x22DA &leg; ISOamsr # LESS-THAN EQUAL TO OR GREATER-THAN
+0x22DB &gel; ISOamsr # GREATER-THAN EQUAL TO OR LESS-THAN
+0x22DC &els; ISOamsr # EQUAL TO OR LESS-THAN
+0x22DD &egs; ISOamsr # EQUAL TO OR GREATER-THAN
+0x22DE &cuepr; ISOamsr # EQUAL TO OR PRECEDES
+0x22DF &cuesc; ISOamsr # EQUAL TO OR SUCCEEDS
+0x22E0 &npre; ISOamsn # DOES NOT PRECEDE OR EQUAL
+0x22E1 &nsce; ISOamsn # DOES NOT SUCCEED OR EQUAL
+0x22E6 &lnsim; ISOamsn # LESS-THAN BUT NOT EQUIVALENT TO
+0x22E7 &gnsim; ISOamsn # GREATER-THAN BUT NOT EQUIVALENT TO
+0x22E8 &prnsim; ISOamsn # PRECEDES BUT NOT EQUIVALENT TO
+0x22E9 &scnsim; ISOamsn # SUCCEEDS BUT NOT EQUIVALENT TO
+0x22EA &nltri; ISOamsn # NOT NORMAL SUBGROUP OF
+0x22EB &nrtri; ISOamsn # DOES NOT CONTAIN AS NORMAL SUBGROUP
+0x22EC &nltrie; ISOamsn # NOT NORMAL SUBGROUP OF OR EQUAL TO
+0x22ED &nrtrie; ISOamsn # DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
+0x22EE &vellip; ISOpub # VERTICAL ELLIPSIS
+0x2306 &Barwed; ISOamsb # PERSPECTIVE
+0x2308 &lceil; ISOamsc # LEFT CEILING
+0x2309 &rceil; ISOamsc # RIGHT CEILING
+0x230A &lfloor; ISOamsc # LEFT FLOOR
+0x230B &rfloor; ISOamsc # RIGHT FLOOR
+0x230C &drcrop; ISOpub # BOTTOM RIGHT CROP
+0x230D &dlcrop; ISOpub # BOTTOM LEFT CROP
+0x230E &urcrop; ISOpub # TOP RIGHT CROP
+0x230F &ulcrop; ISOpub # TOP LEFT CROP
+0x2315 &telrec; ISOpub # TELEPHONE RECORDER
+0x2316 &target; ISOpub # POSITION INDICATOR
+0x231C &ulcorn; ISOamsc # TOP LEFT CORNER
+0x231D &urcorn; ISOamsc # TOP RIGHT CORNER
+0x231E &dlcorn; ISOamsc # BOTTOM LEFT CORNER
+0x231F &drcorn; ISOamsc # BOTTOM RIGHT CORNER
+0x2322 &frown; ISOamsr # FROWN
+0x2322 &sfrown; ISOamsr # FROWN
+0x2323 &smile; ISOamsr # SMILE
+0x2323 &ssmile; ISOamsr # SMILE
+0x2329 &lang; ISOtech # LEFT-POINTING ANGLE BRACKET
+0x232A &rang; ISOtech # RIGHT-POINTING ANGLE BRACKET
+0x2423 &blank; ISOpub # OPEN BOX
+0x24C8 &oS; ISOamso # CIRCLED LATIN CAPITAL LETTER S
+0x2500 &boxh; ISObox # BOX DRAWINGS LIGHT HORIZONTAL
+0x2502 &boxv; ISObox # BOX DRAWINGS LIGHT VERTICAL
+0x250C &boxdr; ISObox # BOX DRAWINGS LIGHT DOWN AND RIGHT
+0x2510 &boxdl; ISObox # BOX DRAWINGS LIGHT DOWN AND LEFT
+0x2514 &boxur; ISObox # BOX DRAWINGS LIGHT UP AND RIGHT
+0x2518 &boxul; ISObox # BOX DRAWINGS LIGHT UP AND LEFT
+0x251C &boxvr; ISObox # BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+0x2524 &boxvl; ISObox # BOX DRAWINGS LIGHT VERTICAL AND LEFT
+0x252C &boxhd; ISObox # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+0x2534 &boxhu; ISObox # BOX DRAWINGS LIGHT UP AND HORIZONTAL
+0x253C &boxvh; ISObox # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+0x2550 &boxH; ISObox # BOX DRAWINGS DOUBLE HORIZONTAL
+0x2551 &boxV; ISObox # BOX DRAWINGS DOUBLE VERTICAL
+0x2552 &boxdR; ISObox # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+0x2553 &boxDr; ISObox # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
+0x2554 &boxDR; ISObox # BOX DRAWINGS DOUBLE DOWN AND RIGHT
+0x2555 &boxdL; ISObox # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
+0x2556 &boxDl; ISObox # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
+0x2557 &boxDL; ISObox # BOX DRAWINGS DOUBLE DOWN AND LEFT
+0x2558 &boxuR; ISObox # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+0x2559 &boxUr; ISObox # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+0x255A &boxUR; ISObox # BOX DRAWINGS DOUBLE UP AND RIGHT
+0x255B &boxuL; ISObox # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+0x255C &boxUl; ISObox # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
+0x255D &boxUL; ISObox # BOX DRAWINGS DOUBLE UP AND LEFT
+0x255E &boxvR; ISObox # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+0x255F &boxVr; ISObox # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+0x2560 &boxVR; ISObox # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+0x2561 &boxvL; ISObox # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+0x2562 &boxVl; ISObox # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
+0x2563 &boxVL; ISObox # BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+0x2564 &boxHd; ISObox # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
+0x2565 &boxhD; ISObox # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
+0x2566 &boxHD; ISObox # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+0x2567 &boxHu; ISObox # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+0x2568 &boxhU; ISObox # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+0x2569 &boxHU; ISObox # BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+0x256A &boxvH; ISObox # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+0x256B &boxVh; ISObox # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
+0x256C &boxVH; ISObox # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+0x2580 &uhblk; ISOpub # UPPER HALF BLOCK
+0x2584 &lhblk; ISOpub # LOWER HALF BLOCK
+0x2588 &block; ISOpub # FULL BLOCK
+0x2591 &blk14; ISOpub # LIGHT SHADE
+0x2592 &blk12; ISOpub # MEDIUM SHADE
+0x2593 &blk34; ISOpub # DARK SHADE
+0x25A1 &squ; ISOpub # WHITE SQUARE
+0x25A1 &square; ISOtech # WHITE SQUARE
+0x25AA &squf; ISOpub # BLACK SMALL SQUARE
+0x25AD &rect; ISOpub # WHITE RECTANGLE
+0x25AE &marker; ISOpub # BLACK VERTICAL RECTANGLE
+0x25B3 &xutri; ISOamsb # WHITE UP-POINTING TRIANGLE
+0x25B4 &utrif; ISOpub # BLACK UP-POINTING SMALL TRIANGLE
+0x25B5 &utri; ISOpub # WHITE UP-POINTING SMALL TRIANGLE
+0x25B8 &rtrif; ISOpub # BLACK RIGHT-POINTING SMALL TRIANGLE
+0x25B9 &rtri; ISOpub # WHITE RIGHT-POINTING SMALL TRIANGLE
+0x25BD &xdtri; ISOamsb # WHITE DOWN-POINTING TRIANGLE
+0x25BE &dtrif; ISOpub # BLACK DOWN-POINTING SMALL TRIANGLE
+0x25BF &dtri; ISOpub # WHITE DOWN-POINTING SMALL TRIANGLE
+0x25C2 &ltrif; ISOpub # BLACK LEFT-POINTING SMALL TRIANGLE
+0x25C3 &ltri; ISOpub # WHITE LEFT-POINTING SMALL TRIANGLE
+0x25CA &loz; ISOpub # LOZENGE
+0x25CB &cir; ISOpub # WHITE CIRCLE
+0x25CB &xcirc; ISOamsb # WHITE CIRCLE
+0x2605 &starf; ISOpub # BLACK STAR
+0x2606 &star; ISOpub # WHITE STAR
+0x260E &phone; ISOpub # BLACK TELEPHONE
+0x2640 &female; ISOpub # FEMALE SIGN
+0x2642 &male; ISOpub # MALE SIGN
+0x2660 &spades; ISOpub # BLACK SPADE SUIT
+0x2663 &clubs; ISOpub # BLACK CLUB SUIT
+0x2665 &hearts; ISOpub # BLACK HEART SUIT
+0x2666 &diams; ISOpub # BLACK DIAMOND SUIT
+0x266A &sung; ISOnum # EIGHTH NOTE
+0x266D &flat; ISOpub # MUSIC FLAT SIGN
+0x266E &natur; ISOpub # MUSIC NATURAL SIGN
+0x266F &sharp; ISOpub # MUSIC SHARP SIGN
+0x2713 &check; ISOpub # CHECK MARK
+0x2717 &cross; ISOpub # BALLOT X
+0x2720 &malt; ISOpub # MALTESE CROSS
+0x2726 &lozf; ISOpub # BLACK FOUR POINTED STAR
+<!-- 0x2727 &loz; ISOpub # WHITE FOUR POINTED STAR -->
+0x2736 &sext; ISOpub # SIX POINTED BLACK STAR
+0x???? &epsiv; ISOgrk3 # variant epsilon
+0x???? &fjlig; ISOpub # fj ligature
+0x???? &gEl; ISOamsr # greater-than, double equals, less-than
+0x???? &gap; ISOamsr # greater-than, approximately equal to
+0x???? &gnap; ISOamsn # greater-than, not approximately equal to
+0x???? &jnodot; ISOamso # latin small letter dotless j
+0x???? &lEg; ISOamsr # less-than, double equals, greater-than
+0x???? &lap; ISOamsr # less-than, approximately equal to
+0x???? &lnap; ISOamsn # less-than, not approximately equal to
+0x???? &lpargt; ISOamsc # left parenthesis, greater-than
+0x???? &ngE; ISOamsn # not greater-than, double equals
+0x???? &nlE; ISOamsn # not less-than, double equals
+0x???? &nsmid; ISOamsn # nshortmid
+0x???? &prap; ISOamsr # precedes, approximately equal to
+0x???? &prnE; ISOamsn # precedes, not double equal
+0x???? &prnap; ISOamsn # precedes, not approximately equal to
+0x???? &rpargt; ISOamsc # right parenthesis, greater-than
+0x???? &scap; ISOamsr # succeeds, approximately equal to
+0x???? &scnE; ISOamsn # succeeds, not double equals
+0x???? &scnap; ISOamsn # succeeds, not approximately equal to
+0x???? &smid; ISOamsr # shortmid
+0xFB00 &fflig; ISOpub # LATIN SMALL LIGATURE FF
+0xFB01 &filig; ISOpub # LATIN SMALL LIGATURE FI
+0xFB02 &fllig; ISOpub # LATIN SMALL LIGATURE FL
+0xFB03 &ffilig; ISOpub # LATIN SMALL LIGATURE FFI
+0xFB04 &ffllig; ISOpub # LATIN SMALL LIGATURE FFL
+
+</PRE>
+</BODY>
+</HTML>
diff --git a/test/spaces.html b/test/spaces.html
new file mode 100644
index 0000000..d527a19
--- /dev/null
+++ b/test/spaces.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//IETF//DTD HTML 3.0//EN">
+<HTML>
+<HEAD>
+<TITLE> Test of some symbols </TITLE>
+</HEAD>
+<BODY>
+<!-- Multiple spaces are normally collapsed unless we are in a <PRE> mode
+or use "special" spaces like &nbsp; or &emsp; - try playing around this page
+by adding more spaces inside brackets or using <PRE>.
+-->
+<!-- PRE -->
+
+You may press '\' to view the source of this test<br>
+<em>UNICODE NCR alt-NCR named alt-named</em><br>
+<p>
+0x2000 [&#x2000;] <IMG SRC=X ALT="[&#x2000;]"> # EN QUAD<br>
+0x2001 [&#x2001;] <IMG SRC=X ALT="[&#x2001;]"> # EM QUAD<br>
+0x2002 [&#x2002;] <IMG SRC=X ALT="[&#x2002;]"> [&ensp;] <IMG SRC=X ALT="[&ensp;]"> # EN SPACE<br>
+0x2003 [&#x2003;] <IMG SRC=X ALT="[&#x2003;]"> [&emsp;] <IMG SRC=X ALT="[&emsp;]"> # EM SPACE<br>
+0x2004 [&#x2004;] <IMG SRC=X ALT="[&#x2004;]"> [&emsp13;] <IMG SRC=X ALT="[&emsp13;]"> # THREE-PER-EM SPACE<br>
+0x2005 [&#x2005;] <IMG SRC=X ALT="[&#x2005;]"> [&emsp14;] <IMG SRC=X ALT="[&emsp14;]"> # FOUR-PER-EM SPACE<br>
+0x2007 [&#x2007;] <IMG SRC=X ALT="[&#x2007;]"> [&numsp;] <IMG SRC=X ALT="[&numsp;]"> # FIGURE SPACE<br>
+0x2008 [&#x2008;] <IMG SRC=X ALT="[&#x2008;]"> [&puncsp;] <IMG SRC=X ALT="[&puncsp;]"> # PUNCTUATION SPACE<br>
+0x2009 [&#x2009;] <IMG SRC=X ALT="[&#x2009;]"> [&thinsp;] <IMG SRC=X ALT="[&thinsp;]"> # THIN SPACE<br>
+0x200A [&#x200A;] <IMG SRC=X ALT="[&#x200A;]"> [&hairsp;] <IMG SRC=X ALT="[&hairsp;]"> # HAIR SPACE<br>
+0x200C [&#x200C;] <IMG SRC=X ALT="[&#x200C;]"> [&zwnj;] <IMG SRC=X ALT="[&zwnj;]"> # ZERO WIDTH NON-JOINER<br>
+0x200D [&#x200D;] <IMG SRC=X ALT="[&#x200D;]"> [&zwj;] <IMG SRC=X ALT="[&zwj;]"> # ZERO WIDTH JOINER<br>
+0x200E [&#x200E;] <IMG SRC=X ALT="[&#x200E;]"> [&lrm;] <IMG SRC=X ALT="[&lrm;]"> # LEFT-TO-RIGHT MARK<br>
+0x200F [&#x200F;] <IMG SRC=X ALT="[&#x200F;]"> [&rlm;] <IMG SRC=X ALT="[&rlm;]"> # RIGHT-TO-LEFT MARK<br>
+0x2010 [&#x2010;] <IMG SRC=X ALT="[&#x2010;]"> [&dash;] <IMG SRC=X ALT="[&dash;]"> # HYPHEN<br>
+0x2013 [&#x2013;] <IMG SRC=X ALT="[&#x2013;]"> [&ndash;] <IMG SRC=X ALT="[&ndash;]"> # EN DASH<br>
+0x2014 [&#x2014;] <IMG SRC=X ALT="[&#x2014;]"> [&mdash;] <IMG SRC=X ALT="[&mdash;]"> # EM DASH<br>
+
+
+</PRE>
+</BODY>
+</HTML>
diff --git a/test/special_urls.html b/test/special_urls.html
new file mode 100644
index 0000000..c9d3506
--- /dev/null
+++ b/test/special_urls.html
@@ -0,0 +1,22 @@
+<html>
+<head>
+<title>Lynx Special URLs</title>
+<link rev="made" href="mailto:WebMaster@foo.blah.dom">
+</head>
+<body>
+<h1>Lynx Special URLs</h1>
+<dl compact>
+<dd>LYNXCFG:<a href="LYNXCFG:">LYNXCFG (ok)</a>
+<dd>LYNXCOMPILEOPTS:<a href="LYNXCOMPILEOPTS:">LYNXCOMPILEOPTS (ok)</a>
+<dd>LYNXCOOKIE:<a href="LYNXCOOKIE:">LYNXCOOKIE is not allowed</a>
+<dd>LYNXDIRED:<a href="LYNXDIRED:">LYNXDIRED is not allowed</a>
+<dd>LYNXDOWNLOAD:<a href="LYNXDOWNLOAD:">LYNXDOWNLOAD is not allowed</a>
+<dd>LYNXHIST:<a href="LYNXHIST:">LYNXHIST is not allowed</a>
+<dd>LYNXIMGMAP:<a href="LYNXIMGMAP:">LYNXIMGMAP is not allowed</a>
+<dd>LYNXKEYMAP:<a href="LYNXKEYMAP:">LYNXKEYMAP (ok)</a>
+<dd>LYNXMESSAGES:<a href="LYNXMESSAGES:">LYNXMESSAGES (ok)</a>
+<dd>LYNXOPTIONS:<a href="LYNXOPTIONS:">LYNXOPTIONS (ok)</a>
+<dd>LYNXPRINT:<a href="LYNXPRINT:">LYNXPRINT is not allowed</a>
+</dl>
+</body>
+</html>
diff --git a/test/square.html b/test/square.html
new file mode 100644
index 0000000..c840328
--- /dev/null
+++ b/test/square.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+
+<html>
+<head>
+ <meta name="generator" content=
+ "HTML Tidy for Linux (vers 25 March 2009), see www.w3.org">
+
+ <title>Test ImageMap - square</title>
+</head>
+
+<body>
+ <p>SQUARE</p>
+</body>
+</html>
diff --git a/test/tabtest.html b/test/tabtest.html
new file mode 100644
index 0000000..45184a8
--- /dev/null
+++ b/test/tabtest.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3O//DTD W3 HTML 3.0//EN">
+<html>
+<head>
+<title>Tests of TAB element.</title>
+<link rev="made" href="mailto:lynx-dev@nongnu.org">
+</head>
+
+<body>
+<h1>Tests of TAB element.</h1>
+
+<TAB INDENT="16" ID="t0"><em>Normal Style:</em><br>
+One<TAB INDENT="26" ID="t1">Two<TAB INDENT="44" ID="t2">Three
+<TAB INDENT="62" ID="t3">Four<TAB INDENT="80" ID="t4">Five
+<TAB INDENT="98" ID="t5">Six<TAB INDENT="116" ID="t6">Seven
+<TAB INDENT="132" ID="t7">Eight<br>
+1.<TAB TO="t1">2.<TAB TO="t2">3.<TAB TO="t3">4.<TAB TO="t4">5.
+<TAB TO="t5">6.<TAB TO="t6">7.<TAB TO="t7">8.<br>
+i.<TAB TO="t1">ii.<TAB TO="t2">iii.<TAB TO="t3">iv.<TAB TO="t4">v.
+<TAB TO="t5">vi.<TAB TO="t6">vii.<TAB TO="t7">viii.
+
+<p><pre><TAB TO="t0"><em>In PRE block:</em>
+One<TAB TO="t1">Two<TAB TO="t3">Three<TAB TO="t5">Four<TAB TO="t7">Five
+1.<TAB TO="t1">2.<TAB TO="t3">3.<TAB TO="t5">4.<TAB TO="t7">5.
+i.<TAB TO="t1">ii.<TAB TO="t3">iii.<TAB TO="t5">iv.<TAB TO="t7">v.
+</pre>
+
+<bq>
+<TAB TO="t0"><em>In BQ block:</em><br>
+One<TAB TO="t2">Two<TAB TO="t4">Three<TAB TO="t6">Four<br>
+1.<TAB TO="t2">2.<TAB TO="t4">3.<TAB TO="t6">4.<br>
+i.<TAB TO="t2">ii.<TAB TO="t4">iii.<TAB TO="t6">iv.
+</bq>
+
+<p><b>noct<TAB ID="tn">ambulant</b> - walking at night<br>
+<TAB TO="tn">(from Latin: <i>nox noctis</i> night + <i>ambulare</i> walk)
+<pre>|<TAB INDENT="78">|<TAB INDENT="156">|
+0<TAB INDENT="76">80<TAB INDENT="152">158</pre>
+</body>
+</html>
diff --git a/test/tags.html b/test/tags.html
new file mode 100644
index 0000000..3f405ec
--- /dev/null
+++ b/test/tags.html
@@ -0,0 +1,219 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<HTML>
+<HEAD>
+<TITLE>Tags to Test Color-Style</TITLE>
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
+<link href="nobody" rev="made">
+</HEAD>
+
+<BODY alink="green" bgcolor="yellow">
+<!-- ====================================================================== -->
+<br>
+<h1>Content of an H1 Tag</h1>
+Text after an H1 Tag.
+<p>Paragraph after an H1 Tag.
+<br>
+<h2>Content of an H2 Tag</h2>
+Text after an H2 Tag.
+<p>Paragraph after an H2 Tag.
+<br>
+<h3>Content of an H3 Tag</h3>
+Text after an H3 Tag.
+<p>Paragraph after an H3 Tag.
+<br>
+<h4>Content of an H4 Tag</h4>
+Text after an H4 Tag.
+<p>Paragraph after an H4 Tag.
+<br>
+<h5>Content of an H5 Tag</h5>
+Text after an H5 Tag.
+<p>Paragraph after an H5 Tag.
+<br>
+<h6>Content of an H6 Tag</h6>
+Text after an H6 Tag.
+<p>Paragraph after an H6 Tag.
+<!-- ====================================================================== -->
+This is an <a href="#imagemap">"a"</a> tag.
+<br>
+This is an <address>"address"</address> tag.
+<br>
+This is a <b>"b"</b> tag.
+<br>
+This is a <big>"big"</big> tag.
+<br>
+Before quote, <blockquote>this is a "blockquote"</blockquote>, after quote.
+<br>
+This is a <center>"center"</center> tag.
+<br>
+This is a <cite>"cite"</cite> tag.
+<br>
+This is a <code>"code"</code> tag.
+<br>
+This is a <div>div</div> tag.
+<br>
+This is an <em>"em"</em> tag.
+<br>
+This is a <font>"font"</font> tag.
+<!-- ====================================================================== -->
+<br>
+This is an <hr>"hr"<hr> tag.
+<br>
+This is an <i>"i"</i> tag.
+<br>
+This is an <iframe>"iframe"</iframe> tag.
+<br>
+This is an <img alt="img" src="image.jpg"> tag.
+<br>
+This is an <label>"label"</label> tag.
+<br>
+map: normal: lightgray: blue
+<br>
+<pre>
+This is
+pre-formatted
+text (three lines, with pre's on preceding/following lines).
+</pre>
+<br>
+This is a <q>"q"</q>tag.
+<br>
+This is a <samp>"samp"</samp> tag.
+<br>
+This is a <small>"small"</small> tag.
+<br>
+This is a <strong>"strong"</strong> tag.
+<br>
+This is a <sub>"sub"</sub> tag.
+<br>
+This is a <sup>"sup"</sup> tag.
+<br>
+This is a <tt>"tt"</tt> tag.
+<br>
+This is a <var>"var"</var> tag.
+<!-- ====================================================================== -->
+<h1>Forms</h1>
+<hr>
+<form action="http://localhost/cgi-bin/bogus-parms" method="get">
+First: <input type="text" name="First" size=20>
+Last: <input type="text" name="Last" size=20>
+Description: <textarea rows=3 cols=40>
+contents of textarea
+</textarea>
+<hr>
+<input type="submit" value="Submit this form">
+<br>
+<input type="reset" value="Reset this form">
+</form>
+
+<h1 align="left">Another form</h1>
+<hr>
+<form action="http://localhost/cgi-bin/bogus-parms" method="get">
+<hr>
+<input type="checkbox" value="first">first
+<br><input type="checkbox" value="second">second
+<br><input type="checkbox" value="third">third
+<br><input type="checkbox" value="">empty
+<hr>
+<input type="submit" value="done">done
+</form>
+
+<h1 align="right">Another form</h1>
+<hr>
+<form action="http://localhost/cgi-bin/bogus-parms" method="get">
+<select>
+<option>first option</option>
+<option>second option</option>
+<option>third option</option>
+</select>
+<hr>
+<input type="submit" value="Submit this form">
+<br>
+<input type="reset" value="Reset this form">
+</form>
+<!-- ====================================================================== -->
+<table border=2 summary="unquoted table">
+<caption>Unquoted Table</caption>
+<tr>
+<td>First:</td>
+<td>the first row</td>
+<td>short</td>
+<td>last</td></tr>
+<tr>
+<td>Second:</td>
+<td>the second row</td>
+<td>very long string</td>
+<td>lower-right</td></tr>
+</table>
+<!-- ====================================================================== -->
+<blockquote><table border=2 summary="quoted table">
+<caption>Quoted Table</caption>
+<tr>
+<td>First:</td>
+<td>the first row</td>
+<td>very long string</td>
+<td>last</td></tr>
+<tr>
+<td>Second:</td>
+<td>the second row</td>
+<td>short</td>
+<td>lower-right</td></tr>
+</table></blockquote>
+<!-- ====================================================================== -->
+<br>
+<h1>An image map</h1>
+<map name="IMAGEMAP">
+<area alt="Square" shape="rect" coords="18,18,82,80" href="square.html">
+<area alt="Circle" shape="circle" coords="127,48,31" href="circle.html">
+<area alt="Triangle" shape="poly" coords="232,78,303,78,263,14,232,76"
+ href="triangle.html">
+ </map>
+<!-- ====================================================================== -->
+<br>
+<h1>Definition List</h1>
+This is an definition list:
+<dl>
+<dt>the first dt
+<dd>the first dd
+<dt>the second dt
+<dd>the second dd
+<dl>
+<dt>the first dt
+<dd>the first dd
+<dt>the second dt
+<dd>the second dd
+<dt>the third dt
+<dd>the third dd
+</dl>
+<dt>the third dt
+<dd>the third dd
+</dl>
+<!-- ====================================================================== -->
+<br>
+<h1>Unordered List</h1>
+This is an unordered list:
+<ul>
+<li>first item
+<li>second item
+<ul>
+<li>first item
+<li>second item
+<li>third item
+</ul>
+<li>third item
+</ul>
+<!-- ====================================================================== -->
+<br>
+<h1>Ordered List</h1>
+This is an ordered list:
+<ol>
+<li>first item
+<li>second item
+<ol>
+<li>first item
+<li>second item
+<li>third item
+</ol>
+<li>third item
+</ol>
+
+</BODY>
+</HTML>
diff --git a/test/test-styles.html b/test/test-styles.html
new file mode 100644
index 0000000..728c288
--- /dev/null
+++ b/test/test-styles.html
@@ -0,0 +1,106 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<HTML>
+<HEAD>
+<TITLE>Test Color-Styles</TITLE>
+</HEAD>
+<BODY>
+<h1>Heading 1</h1>
+<h2>Heading 2</h2>
+<h3>Heading 3</h3>
+<h4>Heading 4</h4>
+<h5>Heading 5</h5>
+<h6>Heading 6</h6>
+
+<h1>Heading 1 - Ordinary Text</h1>
+<h2><a name="fontlike_text">Heading 2 - <b>Fontlike</b> Text</a></h2>
+<!-- STYLE,BR,TAB -->
+This is <b>b (bold)</b>.
+<br>
+This is <big>big</big>.
+<br>
+This is <blink>blink</blink>.
+<br>
+This is <i>i (italicized)</i>.
+<br>
+This is <small>small</small>.
+<br>
+This is <strike>strike</strike>.
+<br>
+This is <tt>tt (typewriter)</tt>.
+<br>
+This is <u>u (underlined)</u>.
+
+<h2><a name="emphasized_text">Heading 2 - <em>Emphasized</em> Text</a></h2>
+This is <cite>cite (citation)</cite>.
+<br>
+This is <code>code</code>.
+<br>
+This is <del>del</del>.
+<br>
+This is <dfn>dfn (definition)</dfn>.
+<br>
+This is <em>emphasized</em>.
+<br>
+This is <ins>ins</ins>.
+<br>
+This is <kbd>kbd (keyboard)</kbd>.
+<br>
+This is <q>q (quoted)</q>.
+<br>
+This is <samp>samp (sample)</samp>.
+<br>
+This is <span>span</span>.
+<br>
+This is <strong>strong</strong>.
+<br>
+This is <var>var</var>.
+
+<h1>Heading 1 - Ordinary Links</h1>
+<a href="#fontlike_text">This is a link</a> to fontlike text.
+<br>
+<a href="#emphasized_text">This is a link</a> to emphasized text.
+
+<h1>Heading 1 - Emphasized Links</h1>
+<h2><a name="fontlike_links">Heading 2 - <b>Fontlike</b> Links</a></h2>
+<br>
+This is <a href="#fontlike_text"><b>b (bold)</b> link</a>.
+<br>
+This is <a href="#fontlike_text"><big>big</big> link</a>.
+<br>
+This is <a href="#fontlike_text"><blink>blink</blink> link</a>.
+<br>
+This is <a href="#fontlike_text"><i>i (italicized)</i> link</a>.
+<br>
+This is <a href="#fontlike_text"><small>small</small> link</a>.
+<br>
+This is <a href="#fontlike_text"><strike>strike</strike> link</a>.
+<br>
+This is <a href="#fontlike_text"><tt>tt (typewriter)</tt> link</a>.
+<br>
+This is <a href="#fontlike_text"><u>u (underlined)</u> link</a>.
+
+<h2><a name="emphasized_links">Heading 2 - <b>Emphasized</b> Links</a></h2>
+This is <a href="#emphasized_text"><cite>cite (citation)</cite> link</a>.
+<br>
+This is <a href="#emphasized_text"><code>code</code> link</a>.
+<br>
+This is <a href="#emphasized_text"><del>del</del> link</a>.
+<br>
+This is <a href="#emphasized_text"><dfn>dfn (definition)</dfn> link</a>.
+<br>
+This is <a href="#emphasized_text"><em>emphasized</em> link</a>.
+<br>
+This is <a href="#emphasized_text"><ins>ins</ins> link</a>.
+<br>
+This is <a href="#emphasized_text"><kbd>kbd (keyboard)</kbd> link</a>.
+<br>
+This is <a href="#emphasized_text"><q>q (quoted)</q> link</a>.
+<br>
+This is <a href="#emphasized_text"><samp>samp (sample)</samp> link</a>.
+<br>
+This is <a href="#emphasized_text"><span>span</span> link</a>.
+<br>
+This is <a href="#emphasized_text"><strong>strong</strong> link</a>.
+<br>
+This is <a href="#emphasized_text"><var>var</var> link</a>.
+</BODY>
diff --git a/test/triangle.html b/test/triangle.html
new file mode 100644
index 0000000..abea6c7
--- /dev/null
+++ b/test/triangle.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+
+<html>
+<head>
+ <meta name="generator" content=
+ "HTML Tidy for Linux (vers 25 March 2009), see www.w3.org">
+
+ <title>Test ImageMap - triangle</title>
+</head>
+
+<body>
+ <p>TRIANGLE</p>
+</body>
+</html>
diff --git a/test/unicode.html b/test/unicode.html
new file mode 100644
index 0000000..7abcd1a
--- /dev/null
+++ b/test/unicode.html
@@ -0,0 +1,915 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<HTML>
+<HEAD>
+<TITLE>Test of some Unicode symbols in numeric character reference form</TITLE>
+</HEAD>
+<BODY>
+<PRE>
+
+ This table prepared from SGML.TXT available at ftp.unicode.org
+
+ ftp://ftp.unicode.org/MAPPINGS/VENDORS/MISC/SGML.TXT
+ (if doing ftp, try cd Public/MAPPINGS/VENDORS/MISC)
+
+
+original comment:
+
+# Author: John Cowan &lt;cowan@ccil.org&gt;
+# Date: 25 July 1997
+#
+# The following table maps SGML character entities from various
+# public sets (namely, ISOamsa, ISOamsb, ISOamsc, ISOamsn, ISOamso,
+# ISOamsr, ISObox, ISOcyr1, ISOcyr2, ISOdia, ISOgrk1, ISOgrk2,
+# ISOgrk3, ISOgrk4, ISOlat1, ISOlat2, ISOnum, ISOpub, ISOtech,
+# HTMLspecial, HTMLsymbol) to corresponding Unicode characters.
+#
+# The table has four tab-separated columns:
+# Column 1: SGML character entity name
+# Column 2: SGML public entity set
+# Column 3: Unicode 2.0 character code
+# Column 4: Unicode 2.0 character name (UPPER CASE)
+# Entries which don't have Unicode equivalents have "0x????"
+# in Column 3 and a lower case description (from the public entity
+# set DTD) in Column 4. The mapping is not reversible, because many
+# distinctions are unified away in Unicode, particularly between
+# mathematical symbols.
+#
+# The table is sorted case-blind by SGML character entity name.
+#
+# The contents of this table are drawn from various sources, and
+# are in the public domain.
+#
+<!-- Changes:
++ {"euro", 0x20AC}, /* EURO SIGN */
+
+-->
+
+This test is illuminated Unicode numeric entities like &amp;#x22AB;
+We sort the entities according to unicode numbers.
+You should see visible characters if your display character set support them
+or some substitution string picked up from src/chrtrans/def7_uni.tbl
+
+If you see something like &amp;#x34D2; - this number unknown to def7_uni.tbl
+or the internal browser's implementation is broken.
+ Leonid Pauzner.
+
+
+
+
+0x0021 &#x0021; # EXCLAMATION MARK
+0x0022 &#x0022; # QUOTATION MARK
+0x0023 &#x0023; # NUMBER SIGN
+0x0024 &#x0024; # DOLLAR SIGN
+0x0025 &#x0025; # PERCENT SIGN
+0x0026 &#x0026; # AMPERSAND
+0x0028 &#x0028; # LEFT PARENTHESIS
+0x0029 &#x0029; # RIGHT PARENTHESIS
+0x002A &#x002A; # ASTERISK
+0x002B &#x002B; # PLUS SIGN
+0x002C &#x002C; # COMMA
+0x002D &#x002D; # HYPHEN-MINUS
+0x002E &#x002E; # FULL STOP
+0x002F &#x002F; # SOLIDUS
+0x003A &#x003A; # COLON
+0x003B &#x003B; # SEMICOLON
+0x003C &#x003C; # LESS-THAN SIGN
+0x003D &#x003D; # EQUALS SIGN
+0x003E &#x003E; # GREATER-THAN SIGN
+0x003F &#x003F; # QUESTION MARK
+0x0040 &#x0040; # COMMERCIAL AT
+0x005B &#x005B; # LEFT SQUARE BRACKET
+0x005C &#x005C; # REVERSE SOLIDUS
+0x005C &#x005C; # REVERSE SOLIDUS
+0x005D &#x005D; # RIGHT SQUARE BRACKET
+0x005F &#x005F; # LOW LINE
+0x0060 &#x0060; # GRAVE ACCENT
+0x007B &#x007B; # LEFT CURLY BRACKET
+0x007C &#x007C; # VERTICAL LINE
+0x007D &#x007D; # RIGHT CURLY BRACKET
+0x00A0 &#x00A0; # NO-BREAK SPACE
+0x00A1 &#x00A1; # INVERTED EXCLAMATION MARK
+0x00A2 &#x00A2; # CENT SIGN
+0x00A3 &#x00A3; # POUND SIGN
+0x00A4 &#x00A4; # CURRENCY SIGN
+0x00A5 &#x00A5; # YEN SIGN
+0x00A6 &#x00A6; # BROKEN BAR
+0x00A7 &#x00A7; # SECTION SIGN
+0x00A8 &#x00A8; # DIAERESIS
+0x00A9 &#x00A9; # COPYRIGHT SIGN
+0x00AA &#x00AA; # FEMININE ORDINAL INDICATOR
+0x00AB &#x00AB; # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0x00AC &#x00AC; # NOT SIGN
+0x00AD &#x00AD; # SOFT HYPHEN
+0x00AE &#x00AE; # REGISTERED SIGN
+0x00AF &#x00AF; # MACRON
+0x00B0 &#x00B0; # DEGREE SIGN
+0x00B1 &#x00B1; # PLUS-MINUS SIGN
+0x00B2 &#x00B2; # SUPERSCRIPT TWO
+0x00B3 &#x00B3; # SUPERSCRIPT THREE
+0x00B4 &#x00B4; # ACUTE ACCENT
+0x00B5 &#x00B5; # MICRO SIGN
+0x00B6 &#x00B6; # PILCROW SIGN
+0x00B7 &#x00B7; # MIDDLE DOT
+0x00B8 &#x00B8; # CEDILLA
+0x00B9 &#x00B9; # SUPERSCRIPT ONE
+0x00BA &#x00BA; # MASCULINE ORDINAL INDICATOR
+0x00BB &#x00BB; # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0x00BC &#x00BC; # VULGAR FRACTION ONE QUARTER
+0x00BD &#x00BD; # VULGAR FRACTION ONE HALF
+0x00BE &#x00BE; # VULGAR FRACTION THREE QUARTERS
+0x00BF &#x00BF; # INVERTED QUESTION MARK
+0x00C0 &#x00C0; # LATIN CAPITAL LETTER A WITH GRAVE
+0x00C1 &#x00C1; # LATIN CAPITAL LETTER A WITH ACUTE
+0x00C2 &#x00C2; # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0x00C3 &#x00C3; # LATIN CAPITAL LETTER A WITH TILDE
+0x00C4 &#x00C4; # LATIN CAPITAL LETTER A WITH DIAERESIS
+0x00C5 &#x00C5; # LATIN CAPITAL LETTER A WITH RING ABOVE
+0x00C6 &#x00C6; # LATIN CAPITAL LETTER AE
+0x00C7 &#x00C7; # LATIN CAPITAL LETTER C WITH CEDILLA
+0x00C8 &#x00C8; # LATIN CAPITAL LETTER E WITH GRAVE
+0x00C9 &#x00C9; # LATIN CAPITAL LETTER E WITH ACUTE
+0x00CA &#x00CA; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+0x00CB &#x00CB; # LATIN CAPITAL LETTER E WITH DIAERESIS
+0x00CC &#x00CC; # LATIN CAPITAL LETTER I WITH GRAVE
+0x00CD &#x00CD; # LATIN CAPITAL LETTER I WITH ACUTE
+0x00CE &#x00CE; # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0x00CF &#x00CF; # LATIN CAPITAL LETTER I WITH DIAERESIS
+0x00D0 &#x00D0; # LATIN CAPITAL LETTER ETH
+0x00D1 &#x00D1; # LATIN CAPITAL LETTER N WITH TILDE
+0x00D2 &#x00D2; # LATIN CAPITAL LETTER O WITH GRAVE
+0x00D3 &#x00D3; # LATIN CAPITAL LETTER O WITH ACUTE
+0x00D4 &#x00D4; # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0x00D5 &#x00D5; # LATIN CAPITAL LETTER O WITH TILDE
+0x00D6 &#x00D6; # LATIN CAPITAL LETTER O WITH DIAERESIS
+0x00D7 &#x00D7; # MULTIPLICATION SIGN
+0x00D8 &#x00D8; # LATIN CAPITAL LETTER O WITH STROKE
+0x00D9 &#x00D9; # LATIN CAPITAL LETTER U WITH GRAVE
+0x00DA &#x00DA; # LATIN CAPITAL LETTER U WITH ACUTE
+0x00DB &#x00DB; # LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+0x00DC &#x00DC; # LATIN CAPITAL LETTER U WITH DIAERESIS
+0x00DD &#x00DD; # LATIN CAPITAL LETTER Y WITH ACUTE
+0x00DE &#x00DE; # LATIN CAPITAL LETTER THORN
+0x00DF &#x00DF; # LATIN SMALL LETTER SHARP S
+0x00E0 &#x00E0; # LATIN SMALL LETTER A WITH GRAVE
+0x00E1 &#x00E1; # LATIN SMALL LETTER A WITH ACUTE
+0x00E2 &#x00E2; # LATIN SMALL LETTER A WITH CIRCUMFLEX
+0x00E3 &#x00E3; # LATIN SMALL LETTER A WITH TILDE
+0x00E4 &#x00E4; # LATIN SMALL LETTER A WITH DIAERESIS
+0x00E5 &#x00E5; # LATIN SMALL LETTER A WITH RING ABOVE
+0x00E6 &#x00E6; # LATIN SMALL LETTER AE
+0x00E7 &#x00E7; # LATIN SMALL LETTER C WITH CEDILLA
+0x00E8 &#x00E8; # LATIN SMALL LETTER E WITH GRAVE
+0x00E9 &#x00E9; # LATIN SMALL LETTER E WITH ACUTE
+0x00EA &#x00EA; # LATIN SMALL LETTER E WITH CIRCUMFLEX
+0x00EB &#x00EB; # LATIN SMALL LETTER E WITH DIAERESIS
+0x00EC &#x00EC; # LATIN SMALL LETTER I WITH GRAVE
+0x00ED &#x00ED; # LATIN SMALL LETTER I WITH ACUTE
+0x00EE &#x00EE; # LATIN SMALL LETTER I WITH CIRCUMFLEX
+0x00EF &#x00EF; # LATIN SMALL LETTER I WITH DIAERESIS
+0x00F0 &#x00F0; # LATIN SMALL LETTER ETH
+0x00F1 &#x00F1; # LATIN SMALL LETTER N WITH TILDE
+0x00F2 &#x00F2; # LATIN SMALL LETTER O WITH GRAVE
+0x00F3 &#x00F3; # LATIN SMALL LETTER O WITH ACUTE
+0x00F4 &#x00F4; # LATIN SMALL LETTER O WITH CIRCUMFLEX
+0x00F5 &#x00F5; # LATIN SMALL LETTER O WITH TILDE
+0x00F6 &#x00F6; # LATIN SMALL LETTER O WITH DIAERESIS
+0x00F7 &#x00F7; # DIVISION SIGN
+0x00F8 &#x00F8; # LATIN SMALL LETTER O WITH STROKE
+0x00F9 &#x00F9; # LATIN SMALL LETTER U WITH GRAVE
+0x00FA &#x00FA; # LATIN SMALL LETTER U WITH ACUTE
+0x00FB &#x00FB; # LATIN SMALL LETTER U WITH CIRCUMFLEX
+0x00FC &#x00FC; # LATIN SMALL LETTER U WITH DIAERESIS
+0x00FD &#x00FD; # LATIN SMALL LETTER Y WITH ACUTE
+0x00FE &#x00FE; # LATIN SMALL LETTER THORN
+0x00FF &#x00FF; # LATIN SMALL LETTER Y WITH DIAERESIS
+0x0100 &#x0100; # LATIN CAPITAL LETTER A WITH MACRON
+0x0101 &#x0101; # LATIN SMALL LETTER A WITH MACRON
+0x0102 &#x0102; # LATIN CAPITAL LETTER A WITH BREVE
+0x0103 &#x0103; # LATIN SMALL LETTER A WITH BREVE
+0x0104 &#x0104; # LATIN CAPITAL LETTER A WITH OGONEK
+0x0105 &#x0105; # LATIN SMALL LETTER A WITH OGONEK
+0x0106 &#x0106; # LATIN CAPITAL LETTER C WITH ACUTE
+0x0107 &#x0107; # LATIN SMALL LETTER C WITH ACUTE
+0x0108 &#x0108; # LATIN CAPITAL LETTER C WITH CIRCUMFLEX
+0x0109 &#x0109; # LATIN SMALL LETTER C WITH CIRCUMFLEX
+0x010A &#x010A; # LATIN CAPITAL LETTER C WITH DOT ABOVE
+0x010B &#x010B; # LATIN SMALL LETTER C WITH DOT ABOVE
+0x010C &#x010C; # LATIN CAPITAL LETTER C WITH CARON
+0x010D &#x010D; # LATIN SMALL LETTER C WITH CARON
+0x010E &#x010E; # LATIN CAPITAL LETTER D WITH CARON
+0x010F &#x010F; # LATIN SMALL LETTER D WITH CARON
+0x0110 &#x0110; # LATIN CAPITAL LETTER D WITH STROKE
+0x0111 &#x0111; # LATIN SMALL LETTER D WITH STROKE
+0x0112 &#x0112; # LATIN CAPITAL LETTER E WITH MACRON
+0x0113 &#x0113; # LATIN SMALL LETTER E WITH MACRON
+0x0116 &#x0116; # LATIN CAPITAL LETTER E WITH DOT ABOVE
+0x0117 &#x0117; # LATIN SMALL LETTER E WITH DOT ABOVE
+0x0118 &#x0118; # LATIN CAPITAL LETTER E WITH OGONEK
+0x0119 &#x0119; # LATIN SMALL LETTER E WITH OGONEK
+0x011A &#x011A; # LATIN CAPITAL LETTER E WITH CARON
+0x011B &#x011B; # LATIN SMALL LETTER E WITH CARON
+0x011C &#x011C; # LATIN CAPITAL LETTER G WITH CIRCUMFLEX
+0x011D &#x011D; # LATIN SMALL LETTER G WITH CIRCUMFLEX
+0x011E &#x011E; # LATIN CAPITAL LETTER G WITH BREVE
+0x011F &#x011F; # LATIN SMALL LETTER G WITH BREVE
+0x0120 &#x0120; # LATIN CAPITAL LETTER G WITH DOT ABOVE
+0x0121 &#x0121; # LATIN SMALL LETTER G WITH DOT ABOVE
+0x0122 &#x0122; # LATIN CAPITAL LETTER G WITH CEDILLA
+0x0123 &#x0123; # LATIN SMALL LETTER G WITH CEDILLA
+0x0124 &#x0124; # LATIN CAPITAL LETTER H WITH CIRCUMFLEX
+0x0125 &#x0125; # LATIN SMALL LETTER H WITH CIRCUMFLEX
+0x0126 &#x0126; # LATIN CAPITAL LETTER H WITH STROKE
+0x0127 &#x0127; # LATIN SMALL LETTER H WITH STROKE
+0x0128 &#x0128; # LATIN CAPITAL LETTER I WITH TILDE
+0x0129 &#x0129; # LATIN SMALL LETTER I WITH TILDE
+0x012A &#x012A; # LATIN CAPITAL LETTER I WITH MACRON
+0x012B &#x012B; # LATIN SMALL LETTER I WITH MACRON
+0x012E &#x012E; # LATIN CAPITAL LETTER I WITH OGONEK
+0x012F &#x012F; # LATIN SMALL LETTER I WITH OGONEK
+0x0130 &#x0130; # LATIN CAPITAL LETTER I WITH DOT ABOVE
+0x0131 &#x0131; # LATIN SMALL LETTER DOTLESS I
+0x0131 &#x0131; # LATIN SMALL LETTER DOTLESS I
+0x0132 &#x0132; # LATIN CAPITAL LIGATURE IJ
+0x0133 &#x0133; # LATIN SMALL LIGATURE IJ
+0x0134 &#x0134; # LATIN CAPITAL LETTER J WITH CIRCUMFLEX
+0x0135 &#x0135; # LATIN SMALL LETTER J WITH CIRCUMFLEX
+0x0136 &#x0136; # LATIN CAPITAL LETTER K WITH CEDILLA
+0x0137 &#x0137; # LATIN SMALL LETTER K WITH CEDILLA
+0x0138 &#x0138; # LATIN SMALL LETTER KRA
+0x0139 &#x0139; # LATIN CAPITAL LETTER L WITH ACUTE
+0x013A &#x013A; # LATIN SMALL LETTER L WITH ACUTE
+0x013B &#x013B; # LATIN CAPITAL LETTER L WITH CEDILLA
+0x013C &#x013C; # LATIN SMALL LETTER L WITH CEDILLA
+0x013D &#x013D; # LATIN CAPITAL LETTER L WITH CARON
+0x013E &#x013E; # LATIN SMALL LETTER L WITH CARON
+0x013F &#x013F; # LATIN CAPITAL LETTER L WITH MIDDLE DOT
+0x0140 &#x0140; # LATIN SMALL LETTER L WITH MIDDLE DOT
+0x0141 &#x0141; # LATIN CAPITAL LETTER L WITH STROKE
+0x0142 &#x0142; # LATIN SMALL LETTER L WITH STROKE
+0x0143 &#x0143; # LATIN CAPITAL LETTER N WITH ACUTE
+0x0144 &#x0144; # LATIN SMALL LETTER N WITH ACUTE
+0x0145 &#x0145; # LATIN CAPITAL LETTER N WITH CEDILLA
+0x0146 &#x0146; # LATIN SMALL LETTER N WITH CEDILLA
+0x0147 &#x0147; # LATIN CAPITAL LETTER N WITH CARON
+0x0148 &#x0148; # LATIN SMALL LETTER N WITH CARON
+0x0149 &#x0149; # LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
+0x014A &#x014A; # LATIN CAPITAL LETTER ENG
+0x014B &#x014B; # LATIN SMALL LETTER ENG
+0x014C &#x014C; # LATIN CAPITAL LETTER O WITH MACRON
+0x014D &#x014D; # LATIN SMALL LETTER O WITH MACRON
+0x0150 &#x0150; # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+0x0151 &#x0151; # LATIN SMALL LETTER O WITH DOUBLE ACUTE
+0x0152 &#x0152; # LATIN CAPITAL LIGATURE OE
+0x0153 &#x0153; # LATIN SMALL LIGATURE OE
+0x0154 &#x0154; # LATIN CAPITAL LETTER R WITH ACUTE
+0x0155 &#x0155; # LATIN SMALL LETTER R WITH ACUTE
+0x0156 &#x0156; # LATIN CAPITAL LETTER R WITH CEDILLA
+0x0157 &#x0157; # LATIN SMALL LETTER R WITH CEDILLA
+0x0158 &#x0158; # LATIN CAPITAL LETTER R WITH CARON
+0x0159 &#x0159; # LATIN SMALL LETTER R WITH CARON
+0x015A &#x015A; # LATIN CAPITAL LETTER S WITH ACUTE
+0x015B &#x015B; # LATIN SMALL LETTER S WITH ACUTE
+0x015C &#x015C; # LATIN CAPITAL LETTER S WITH CIRCUMFLEX
+0x015D &#x015D; # LATIN SMALL LETTER S WITH CIRCUMFLEX
+0x015E &#x015E; # LATIN CAPITAL LETTER S WITH CEDILLA
+0x015F &#x015F; # LATIN SMALL LETTER S WITH CEDILLA
+0x0160 &#x0160; # LATIN CAPITAL LETTER S WITH CARON
+0x0161 &#x0161; # LATIN SMALL LETTER S WITH CARON
+0x0162 &#x0162; # LATIN CAPITAL LETTER T WITH CEDILLA
+0x0163 &#x0163; # LATIN SMALL LETTER T WITH CEDILLA
+0x0164 &#x0164; # LATIN CAPITAL LETTER T WITH CARON
+0x0165 &#x0165; # LATIN SMALL LETTER T WITH CARON
+0x0166 &#x0166; # LATIN CAPITAL LETTER T WITH STROKE
+0x0167 &#x0167; # LATIN SMALL LETTER T WITH STROKE
+0x0168 &#x0168; # LATIN CAPITAL LETTER U WITH TILDE
+0x0169 &#x0169; # LATIN SMALL LETTER U WITH TILDE
+0x016A &#x016A; # LATIN CAPITAL LETTER U WITH MACRON
+0x016B &#x016B; # LATIN SMALL LETTER U WITH MACRON
+0x016C &#x016C; # LATIN CAPITAL LETTER U WITH BREVE
+0x016D &#x016D; # LATIN SMALL LETTER U WITH BREVE
+0x016E &#x016E; # LATIN CAPITAL LETTER U WITH RING ABOVE
+0x016F &#x016F; # LATIN SMALL LETTER U WITH RING ABOVE
+0x0170 &#x0170; # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+0x0171 &#x0171; # LATIN SMALL LETTER U WITH DOUBLE ACUTE
+0x0172 &#x0172; # LATIN CAPITAL LETTER U WITH OGONEK
+0x0173 &#x0173; # LATIN SMALL LETTER U WITH OGONEK
+0x0174 &#x0174; # LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+0x0175 &#x0175; # LATIN SMALL LETTER W WITH CIRCUMFLEX
+0x0176 &#x0176; # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+0x0177 &#x0177; # LATIN SMALL LETTER Y WITH CIRCUMFLEX
+0x0178 &#x0178; # LATIN CAPITAL LETTER Y WITH DIAERESIS
+0x0179 &#x0179; # LATIN CAPITAL LETTER Z WITH ACUTE
+0x017A &#x017A; # LATIN SMALL LETTER Z WITH ACUTE
+0x017B &#x017B; # LATIN CAPITAL LETTER Z WITH DOT ABOVE
+0x017C &#x017C; # LATIN SMALL LETTER Z WITH DOT ABOVE
+0x017D &#x017D; # LATIN CAPITAL LETTER Z WITH CARON
+0x017E &#x017E; # LATIN SMALL LETTER Z WITH CARON
+0x0192 &#x0192; # LATIN SMALL LETTER F WITH HOOK
+0x01F5 &#x01F5; # LATIN SMALL LETTER G WITH ACUTE
+0x02BC &#x02BC; # MODIFIER LETTER APOSTROPHE
+0x02C6 &#x02C6; # MODIFIER LETTER CIRCUMFLEX ACCENT
+0x02C7 &#x02C7; # CARON
+0x02D8 &#x02D8; # BREVE
+0x02D9 &#x02D9; # DOT ABOVE
+0x02DA &#x02DA; # RING ABOVE
+0x02DB &#x02DB; # OGONEK
+0x02DC &#x02DC; # SMALL TILDE
+0x02DD &#x02DD; # DOUBLE ACUTE ACCENT
+0x0386 &#x0386; # GREEK CAPITAL LETTER ALPHA WITH TONOS
+0x0388 &#x0388; # GREEK CAPITAL LETTER EPSILON WITH TONOS
+0x0389 &#x0389; # GREEK CAPITAL LETTER ETA WITH TONOS
+0x038A &#x038A; # GREEK CAPITAL LETTER IOTA WITH TONOS
+0x038C &#x038C; # GREEK CAPITAL LETTER OMICRON WITH TONOS
+0x038E &#x038E; # GREEK CAPITAL LETTER UPSILON WITH TONOS
+0x038F &#x038F; # GREEK CAPITAL LETTER OMEGA WITH TONOS
+0x0390 &#x0390; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+0x0391 &#x0391; # GREEK CAPITAL LETTER ALPHA
+0x0392 &#x0392; # GREEK CAPITAL LETTER BETA
+0x0393 &#x0393; # GREEK CAPITAL LETTER GAMMA
+0x0394 &#x0394; # GREEK CAPITAL LETTER DELTA
+0x0395 &#x0395; # GREEK CAPITAL LETTER EPSILON
+0x0396 &#x0396; # GREEK CAPITAL LETTER ZETA
+0x0397 &#x0397; # GREEK CAPITAL LETTER ETA
+0x0398 &#x0398; # GREEK CAPITAL LETTER THETA
+0x0399 &#x0399; # GREEK CAPITAL LETTER IOTA
+0x039A &#x039A; # GREEK CAPITAL LETTER KAPPA
+0x039B &#x039B; # GREEK CAPITAL LETTER LAMDA
+0x039C &#x039C; # GREEK CAPITAL LETTER MU
+0x039D &#x039D; # GREEK CAPITAL LETTER NU
+0x039E &#x039E; # GREEK CAPITAL LETTER XI
+0x039F &#x039F; # GREEK CAPITAL LETTER OMICRON
+0x03A0 &#x03A0; # GREEK CAPITAL LETTER PI
+0x03A1 &#x03A1; # GREEK CAPITAL LETTER RHO
+0x03A3 &#x03A3; # GREEK CAPITAL LETTER SIGMA
+0x03A4 &#x03A4; # GREEK CAPITAL LETTER TAU
+0x03A5 &#x03A5; # GREEK CAPITAL LETTER UPSILON
+0x03A6 &#x03A6; # GREEK CAPITAL LETTER PHI
+0x03A7 &#x03A7; # GREEK CAPITAL LETTER CHI
+0x03A8 &#x03A8; # GREEK CAPITAL LETTER PSI
+0x03A9 &#x03A9; # GREEK CAPITAL LETTER OMEGA
+0x03AA &#x03AA; # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
+0x03AB &#x03AB; # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+0x03AC &#x03AC; # GREEK SMALL LETTER ALPHA WITH TONOS
+0x03AD &#x03AD; # GREEK SMALL LETTER EPSILON WITH TONOS
+0x03AE &#x03AE; # GREEK SMALL LETTER ETA WITH TONOS
+0x03AF &#x03AF; # GREEK SMALL LETTER IOTA WITH TONOS
+0x03B0 &#x03B0; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+0x03B1 &#x03B1; # GREEK SMALL LETTER ALPHA
+0x03B2 &#x03B2; # GREEK SMALL LETTER BETA
+0x03B3 &#x03B3; # GREEK SMALL LETTER GAMMA
+0x03B4 &#x03B4; # GREEK SMALL LETTER DELTA
+0x03B5 &#x03B5; # GREEK SMALL LETTER EPSILON
+0x03B6 &#x03B6; # GREEK SMALL LETTER ZETA
+0x03B7 &#x03B7; # GREEK SMALL LETTER ETA
+0x03B8 &#x03B8; # GREEK SMALL LETTER THETA
+0x03B9 &#x03B9; # GREEK SMALL LETTER IOTA
+0x03BA &#x03BA; # GREEK SMALL LETTER KAPPA
+0x03BB &#x03BB; # GREEK SMALL LETTER LAMDA
+0x03BC &#x03BC; # GREEK SMALL LETTER MU
+0x03BD &#x03BD; # GREEK SMALL LETTER NU
+0x03BE &#x03BE; # GREEK SMALL LETTER XI
+0x03BF &#x03BF; # GREEK SMALL LETTER OMICRON
+0x03C0 &#x03C0; # GREEK SMALL LETTER PI
+0x03C1 &#x03C1; # GREEK SMALL LETTER RHO
+0x03C2 &#x03C2; # GREEK SMALL LETTER FINAL SIGMA
+0x03C3 &#x03C3; # GREEK SMALL LETTER SIGMA
+0x03C4 &#x03C4; # GREEK SMALL LETTER TAU
+0x03C5 &#x03C5; # GREEK SMALL LETTER UPSILON
+0x03C6 &#x03C6; # GREEK SMALL LETTER PHI
+0x03C7 &#x03C7; # GREEK SMALL LETTER CHI
+0x03C8 &#x03C8; # GREEK SMALL LETTER PSI
+0x03C9 &#x03C9; # GREEK SMALL LETTER OMEGA
+0x03CA &#x03CA; # GREEK SMALL LETTER IOTA WITH DIALYTIKA
+0x03CB &#x03CB; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA
+0x03CC &#x03CC; # GREEK SMALL LETTER OMICRON WITH TONOS
+0x03CE &#x03CE; # GREEK SMALL LETTER OMEGA WITH TONOS
+0x03D1 &#x03D1; # GREEK THETA SYMBOL
+0x03D2 &#x03D2; # GREEK UPSILON WITH HOOK SYMBOL
+0x03D5 &#x03D5; # GREEK PHI SYMBOL
+0x03D6 &#x03D6; # GREEK PI SYMBOL
+0x03DC &#x03DC; # GREEK LETTER DIGAMMA
+0x03F0 &#x03F0; # GREEK KAPPA SYMBOL
+0x03F1 &#x03F1; # GREEK RHO SYMBOL
+0x0401 &#x0401; # CYRILLIC CAPITAL LETTER IO
+0x0402 &#x0402; # CYRILLIC CAPITAL LETTER DJE
+0x0403 &#x0403; # CYRILLIC CAPITAL LETTER GJE
+0x0404 &#x0404; # CYRILLIC CAPITAL LETTER UKRAINIAN IE
+0x0405 &#x0405; # CYRILLIC CAPITAL LETTER DZE
+0x0406 &#x0406; # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+0x0407 &#x0407; # CYRILLIC CAPITAL LETTER YI
+0x0408 &#x0408; # CYRILLIC CAPITAL LETTER JE
+0x0409 &#x0409; # CYRILLIC CAPITAL LETTER LJE
+0x040A &#x040A; # CYRILLIC CAPITAL LETTER NJE
+0x040B &#x040B; # CYRILLIC CAPITAL LETTER TSHE
+0x040C &#x040C; # CYRILLIC CAPITAL LETTER KJE
+0x040E &#x040E; # CYRILLIC CAPITAL LETTER SHORT U
+0x040F &#x040F; # CYRILLIC CAPITAL LETTER DZHE
+0x0410 &#x0410; # CYRILLIC CAPITAL LETTER A
+0x0411 &#x0411; # CYRILLIC CAPITAL LETTER BE
+0x0412 &#x0412; # CYRILLIC CAPITAL LETTER VE
+0x0413 &#x0413; # CYRILLIC CAPITAL LETTER GHE
+0x0414 &#x0414; # CYRILLIC CAPITAL LETTER DE
+0x0415 &#x0415; # CYRILLIC CAPITAL LETTER IE
+0x0416 &#x0416; # CYRILLIC CAPITAL LETTER ZHE
+0x0417 &#x0417; # CYRILLIC CAPITAL LETTER ZE
+0x0418 &#x0418; # CYRILLIC CAPITAL LETTER I
+0x0419 &#x0419; # CYRILLIC CAPITAL LETTER SHORT I
+0x041A &#x041A; # CYRILLIC CAPITAL LETTER KA
+0x041B &#x041B; # CYRILLIC CAPITAL LETTER EL
+0x041C &#x041C; # CYRILLIC CAPITAL LETTER EM
+0x041D &#x041D; # CYRILLIC CAPITAL LETTER EN
+0x041E &#x041E; # CYRILLIC CAPITAL LETTER O
+0x041F &#x041F; # CYRILLIC CAPITAL LETTER PE
+0x0420 &#x0420; # CYRILLIC CAPITAL LETTER ER
+0x0421 &#x0421; # CYRILLIC CAPITAL LETTER ES
+0x0422 &#x0422; # CYRILLIC CAPITAL LETTER TE
+0x0423 &#x0423; # CYRILLIC CAPITAL LETTER U
+0x0424 &#x0424; # CYRILLIC CAPITAL LETTER EF
+0x0425 &#x0425; # CYRILLIC CAPITAL LETTER HA
+0x0426 &#x0426; # CYRILLIC CAPITAL LETTER TSE
+0x0427 &#x0427; # CYRILLIC CAPITAL LETTER CHE
+0x0428 &#x0428; # CYRILLIC CAPITAL LETTER SHA
+0x0429 &#x0429; # CYRILLIC CAPITAL LETTER SHCHA
+0x042A &#x042A; # CYRILLIC CAPITAL LETTER HARD SIGN
+0x042B &#x042B; # CYRILLIC CAPITAL LETTER YERU
+0x042C &#x042C; # CYRILLIC CAPITAL LETTER SOFT SIGN
+0x042D &#x042D; # CYRILLIC CAPITAL LETTER E
+0x042E &#x042E; # CYRILLIC CAPITAL LETTER YU
+0x042F &#x042F; # CYRILLIC CAPITAL LETTER YA
+0x0430 &#x0430; # CYRILLIC SMALL LETTER A
+0x0431 &#x0431; # CYRILLIC SMALL LETTER BE
+0x0432 &#x0432; # CYRILLIC SMALL LETTER VE
+0x0433 &#x0433; # CYRILLIC SMALL LETTER GHE
+0x0434 &#x0434; # CYRILLIC SMALL LETTER DE
+0x0435 &#x0435; # CYRILLIC SMALL LETTER IE
+0x0436 &#x0436; # CYRILLIC SMALL LETTER ZHE
+0x0437 &#x0437; # CYRILLIC SMALL LETTER ZE
+0x0438 &#x0438; # CYRILLIC SMALL LETTER I
+0x0439 &#x0439; # CYRILLIC SMALL LETTER SHORT I
+0x043A &#x043A; # CYRILLIC SMALL LETTER KA
+0x043B &#x043B; # CYRILLIC SMALL LETTER EL
+0x043C &#x043C; # CYRILLIC SMALL LETTER EM
+0x043D &#x043D; # CYRILLIC SMALL LETTER EN
+0x043E &#x043E; # CYRILLIC SMALL LETTER O
+0x043F &#x043F; # CYRILLIC SMALL LETTER PE
+0x0440 &#x0440; # CYRILLIC SMALL LETTER ER
+0x0441 &#x0441; # CYRILLIC SMALL LETTER ES
+0x0442 &#x0442; # CYRILLIC SMALL LETTER TE
+0x0443 &#x0443; # CYRILLIC SMALL LETTER U
+0x0444 &#x0444; # CYRILLIC SMALL LETTER EF
+0x0445 &#x0445; # CYRILLIC SMALL LETTER HA
+0x0446 &#x0446; # CYRILLIC SMALL LETTER TSE
+0x0447 &#x0447; # CYRILLIC SMALL LETTER CHE
+0x0448 &#x0448; # CYRILLIC SMALL LETTER SHA
+0x0449 &#x0449; # CYRILLIC SMALL LETTER SHCHA
+0x044A &#x044A; # CYRILLIC SMALL LETTER HARD SIGN
+0x044B &#x044B; # CYRILLIC SMALL LETTER YERU
+0x044C &#x044C; # CYRILLIC SMALL LETTER SOFT SIGN
+0x044D &#x044D; # CYRILLIC SMALL LETTER E
+0x044E &#x044E; # CYRILLIC SMALL LETTER YU
+0x044F &#x044F; # CYRILLIC SMALL LETTER YA
+0x0451 &#x0451; # CYRILLIC SMALL LETTER IO
+0x0452 &#x0452; # CYRILLIC SMALL LETTER DJE
+0x0453 &#x0453; # CYRILLIC SMALL LETTER GJE
+0x0454 &#x0454; # CYRILLIC SMALL LETTER UKRAINIAN IE
+0x0455 &#x0455; # CYRILLIC SMALL LETTER DZE
+0x0456 &#x0456; # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+0x0457 &#x0457; # CYRILLIC SMALL LETTER YI
+0x0458 &#x0458; # CYRILLIC SMALL LETTER JE
+0x0459 &#x0459; # CYRILLIC SMALL LETTER LJE
+0x045A &#x045A; # CYRILLIC SMALL LETTER NJE
+0x045B &#x045B; # CYRILLIC SMALL LETTER TSHE
+0x045C &#x045C; # CYRILLIC SMALL LETTER KJE
+0x045E &#x045E; # CYRILLIC SMALL LETTER SHORT U
+0x045F &#x045F; # CYRILLIC SMALL LETTER DZHE
+0x2002 &#x2002; # EN SPACE
+0x2003 &#x2003; # EM SPACE
+0x2004 &#x2004; # THREE-PER-EM SPACE
+0x2005 &#x2005; # FOUR-PER-EM SPACE
+0x2007 &#x2007; # FIGURE SPACE
+0x2008 &#x2008; # PUNCTUATION SPACE
+0x2009 &#x2009; # THIN SPACE
+0x200A &#x200A; # HAIR SPACE
+0x200C &#x200C; # ZERO WIDTH NON-JOINER
+0x200D &#x200D; # ZERO WIDTH JOINER
+0x200E &#x200E; # LEFT-TO-RIGHT MARK
+0x200F &#x200F; # RIGHT-TO-LEFT MARK
+0x2010 &#x2010; # HYPHEN
+0x2013 &#x2013; # EN DASH
+0x2014 &#x2014; # EM DASH
+0x2015 &#x2015; # HORIZONTAL BAR
+0x2016 &#x2016; # DOUBLE VERTICAL LINE
+0x2018 &#x2018; # LEFT SINGLE QUOTATION MARK
+0x2018 &#x2018; # LEFT SINGLE QUOTATION MARK
+0x2019 &#x2019; # RIGHT SINGLE QUOTATION MARK
+0x201A &#x201A; # SINGLE LOW-9 QUOTATION MARK
+0x201A &#x201A; # SINGLE LOW-9 QUOTATION MARK
+0x201C &#x201C; # LEFT DOUBLE QUOTATION MARK
+0x201C &#x201C; # LEFT DOUBLE QUOTATION MARK
+0x201D &#x201D; # RIGHT DOUBLE QUOTATION MARK
+0x201E &#x201E; # DOUBLE LOW-9 QUOTATION MARK
+0x201E &#x201E; # DOUBLE LOW-9 QUOTATION MARK
+0x2020 &#x2020; # DAGGER
+0x2021 &#x2021; # DOUBLE DAGGER
+0x2022 &#x2022; # BULLET
+0x2025 &#x2025; # TWO DOT LEADER
+0x2026 &#x2026; # HORIZONTAL ELLIPSIS
+0x2026 &#x2026; # HORIZONTAL ELLIPSIS
+0x2030 &#x2030; # PER MILLE SIGN
+0x2032 &#x2032; # PRIME
+0x2032 &#x2032; # PRIME
+0x2033 &#x2033; # DOUBLE PRIME
+0x2034 &#x2034; # TRIPLE PRIME
+0x2035 &#x2035; # REVERSED PRIME
+0x2039 &#x2039; # SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+0x203A &#x203A; # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+0x203E &#x203E; # OVERLINE
+0x2041 &#x2041; # CARET INSERTION POINT
+0x2043 &#x2043; # HYPHEN BULLET
+0x2044 &#x2044; # FRACTION SLASH
+0x20AC &#x20AC; # EURO SIGN
+0x20DB &#x20DB; # COMBINING THREE DOTS ABOVE
+0x20DC &#x20DC; # COMBINING FOUR DOTS ABOVE
+0x2105 &#x2105; # CARE OF
+0x210B &#x210B; # SCRIPT CAPITAL H
+0x210F &#x210F; # PLANCK CONSTANT OVER TWO PI
+0x2111 &#x2111; # BLACK-LETTER CAPITAL I
+0x2112 &#x2112; # SCRIPT CAPITAL L
+0x2113 &#x2113; # SCRIPT SMALL L
+0x2116 &#x2116; # NUMERO SIGN
+0x2117 &#x2117; # SOUND RECORDING COPYRIGHT
+0x2118 &#x2118; # SCRIPT CAPITAL P
+0x211C &#x211C; # BLACK-LETTER CAPITAL R
+0x211E &#x211E; # PRESCRIPTION TAKE
+0x2122 &#x2122; # TRADE MARK SIGN
+0x2126 &#x2126; # OHM SIGN
+0x212B &#x212B; # ANGSTROM SIGN
+0x212C &#x212C; # SCRIPT CAPITAL B
+0x2133 &#x2133; # SCRIPT CAPITAL M
+0x2134 &#x2134; # SCRIPT SMALL O
+0x2135 &#x2135; # ALEF SYMBOL
+0x2135 &#x2135; # ALEF SYMBOL
+0x2136 &#x2136; # BET SYMBOL
+0x2137 &#x2137; # GIMEL SYMBOL
+0x2138 &#x2138; # DALET SYMBOL
+0x2153 &#x2153; # VULGAR FRACTION ONE THIRD
+0x2154 &#x2154; # VULGAR FRACTION TWO THIRDS
+0x2155 &#x2155; # VULGAR FRACTION ONE FIFTH
+0x2156 &#x2156; # VULGAR FRACTION TWO FIFTHS
+0x2157 &#x2157; # VULGAR FRACTION THREE FIFTHS
+0x2158 &#x2158; # VULGAR FRACTION FOUR FIFTHS
+0x2159 &#x2159; # VULGAR FRACTION ONE SIXTH
+0x215A &#x215A; # VULGAR FRACTION FIVE SIXTHS
+0x215B &#x215B; # VULGAR FRACTION ONE EIGHTH
+0x215C &#x215C; # VULGAR FRACTION THREE EIGHTHS
+0x215D &#x215D; # VULGAR FRACTION FIVE EIGHTHS
+0x215E &#x215E; # VULGAR FRACTION SEVEN EIGHTHS
+0x2190 &#x2190; # LEFTWARDS ARROW
+0x2191 &#x2191; # UPWARDS ARROW
+0x2192 &#x2192; # RIGHTWARDS ARROW
+0x2193 &#x2193; # DOWNWARDS ARROW
+0x2194 &#x2194; # LEFT RIGHT ARROW
+0x2195 &#x2195; # UP DOWN ARROW
+0x2196 &#x2196; # NORTH WEST ARROW
+0x2197 &#x2197; # NORTH EAST ARROW
+0x2198 &#x2198; # SOUTH EAST ARROW
+0x2199 &#x2199; # SOUTH WEST ARROW
+0x219A &#x219A; # LEFTWARDS ARROW WITH STROKE
+0x219B &#x219B; # RIGHTWARDS ARROW WITH STROKE
+0x219D &#x219D; # RIGHTWARDS WAVE ARROW
+0x219E &#x219E; # LEFTWARDS TWO HEADED ARROW
+0x21A0 &#x21A0; # RIGHTWARDS TWO HEADED ARROW
+0x21A2 &#x21A2; # LEFTWARDS ARROW WITH TAIL
+0x21A3 &#x21A3; # RIGHTWARDS ARROW WITH TAIL
+0x21A6 &#x21A6; # RIGHTWARDS ARROW FROM BAR
+0x21A9 &#x21A9; # LEFTWARDS ARROW WITH HOOK
+0x21AA &#x21AA; # RIGHTWARDS ARROW WITH HOOK
+0x21AB &#x21AB; # LEFTWARDS ARROW WITH LOOP
+0x21AC &#x21AC; # RIGHTWARDS ARROW WITH LOOP
+0x21AD &#x21AD; # LEFT RIGHT WAVE ARROW
+0x21AE &#x21AE; # LEFT RIGHT ARROW WITH STROKE
+0x21B0 &#x21B0; # UPWARDS ARROW WITH TIP LEFTWARDS
+0x21B1 &#x21B1; # UPWARDS ARROW WITH TIP RIGHTWARDS
+0x21B5 &#x21B5; # DOWNWARDS ARROW WITH CORNER LEFTWARDS
+0x21B6 &#x21B6; # ANTICLOCKWISE TOP SEMICIRCLE ARROW
+0x21B7 &#x21B7; # CLOCKWISE TOP SEMICIRCLE ARROW
+0x21BA &#x21BA; # ANTICLOCKWISE OPEN CIRCLE ARROW
+0x21BB &#x21BB; # CLOCKWISE OPEN CIRCLE ARROW
+0x21BC &#x21BC; # LEFTWARDS HARPOON WITH BARB UPWARDS
+0x21BD &#x21BD; # LEFTWARDS HARPOON WITH BARB DOWNWARDS
+0x21BE &#x21BE; # UPWARDS HARPOON WITH BARB RIGHTWARDS
+0x21BF &#x21BF; # UPWARDS HARPOON WITH BARB LEFTWARDS
+0x21C0 &#x21C0; # RIGHTWARDS HARPOON WITH BARB UPWARDS
+0x21C1 &#x21C1; # RIGHTWARDS HARPOON WITH BARB DOWNWARDS
+0x21C2 &#x21C2; # DOWNWARDS HARPOON WITH BARB RIGHTWARDS
+0x21C3 &#x21C3; # DOWNWARDS HARPOON WITH BARB LEFTWARDS
+0x21C4 &#x21C4; # RIGHTWARDS ARROW OVER LEFTWARDS ARROW
+0x21C6 &#x21C6; # LEFTWARDS ARROW OVER RIGHTWARDS ARROW
+0x21C7 &#x21C7; # LEFTWARDS PAIRED ARROWS
+0x21C8 &#x21C8; # UPWARDS PAIRED ARROWS
+0x21C9 &#x21C9; # RIGHTWARDS PAIRED ARROWS
+0x21CA &#x21CA; # DOWNWARDS PAIRED ARROWS
+0x21CB &#x21CB; # LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
+0x21CC &#x21CC; # RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
+0x21CD &#x21CD; # LEFTWARDS DOUBLE ARROW WITH STROKE
+0x21CE &#x21CE; # LEFT RIGHT DOUBLE ARROW WITH STROKE
+0x21CF &#x21CF; # RIGHTWARDS DOUBLE ARROW WITH STROKE
+0x21D0 &#x21D0; # LEFTWARDS DOUBLE ARROW
+0x21D1 &#x21D1; # UPWARDS DOUBLE ARROW
+0x21D2 &#x21D2; # RIGHTWARDS DOUBLE ARROW
+0x21D3 &#x21D3; # DOWNWARDS DOUBLE ARROW
+0x21D4 &#x21D4; # LEFT RIGHT DOUBLE ARROW
+0x21D5 &#x21D5; # UP DOWN DOUBLE ARROW
+0x21DA &#x21DA; # LEFTWARDS TRIPLE ARROW
+0x21DB &#x21DB; # RIGHTWARDS TRIPLE ARROW
+0x2200 &#x2200; # FOR ALL
+0x2201 &#x2201; # COMPLEMENT
+0x2202 &#x2202; # PARTIAL DIFFERENTIAL
+0x2203 &#x2203; # THERE EXISTS
+0x2204 &#x2204; # THERE DOES NOT EXIST
+0x2205 &#x2205; # EMPTY SET
+0x2207 &#x2207; # NABLA
+0x2208 &#x2208; # ELEMENT OF
+0x2209 &#x2209; # NOT AN ELEMENT OF
+0x220A &#x220A; # SMALL ELEMENT OF
+0x220B &#x220B; # CONTAINS AS MEMBER
+0x220D &#x220D; # SMALL CONTAINS AS MEMBER
+0x220F &#x220F; # N-ARY PRODUCT
+0x2210 &#x2210; # N-ARY COPRODUCT
+0x2211 &#x2211; # N-ARY SUMMATION
+0x2212 &#x2212; # MINUS SIGN
+0x2213 &#x2213; # MINUS-OR-PLUS SIGN
+0x2214 &#x2214; # DOT PLUS
+0x2216 &#x2216; # SET MINUS
+0x2217 &#x2217; # ASTERISK OPERATOR
+0x2218 &#x2218; # RING OPERATOR
+0x221A &#x221A; # SQUARE ROOT
+0x221D &#x221D; # PROPORTIONAL TO
+0x221E &#x221E; # INFINITY
+0x221F &#x221F; # RIGHT ANGLE
+0x2220 &#x2220; # ANGLE
+0x2221 &#x2221; # MEASURED ANGLE
+0x2222 &#x2222; # SPHERICAL ANGLE
+0x2223 &#x2223; # DIVIDES
+0x2224 &#x2224; # DOES NOT DIVIDE
+0x2225 &#x2225; # PARALLEL TO
+0x2226 &#x2226; # NOT PARALLEL TO
+0x2227 &#x2227; # LOGICAL AND
+0x2228 &#x2228; # LOGICAL OR
+0x2229 &#x2229; # INTERSECTION
+0x222A &#x222A; # UNION
+0x222B &#x222B; # INTEGRAL
+0x222E &#x222E; # CONTOUR INTEGRAL
+0x2234 &#x2234; # THEREFORE
+0x2235 &#x2235; # BECAUSE
+0x223C &#x223C; # TILDE OPERATOR
+0x223D &#x223D; # REVERSED TILDE
+0x2240 &#x2240; # WREATH PRODUCT
+0x2241 &#x2241; # NOT TILDE
+0x2243 &#x2243; # ASYMPTOTICALLY EQUAL TO
+0x2244 &#x2244; # NOT ASYMPTOTICALLY EQUAL TO
+0x2245 &#x2245; # APPROXIMATELY EQUAL TO
+0x2247 &#x2247; # NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO
+0x2248 &#x2248; # ALMOST EQUAL TO
+0x2249 &#x2249; # NOT ALMOST EQUAL TO
+0x224A &#x224A; # ALMOST EQUAL OR EQUAL TO
+0x224C &#x224C; # ALL EQUAL TO
+0x224E &#x224E; # GEOMETRICALLY EQUIVALENT TO
+0x224F &#x224F; # DIFFERENCE BETWEEN
+0x2250 &#x2250; # APPROACHES THE LIMIT
+0x2251 &#x2251; # GEOMETRICALLY EQUAL TO
+0x2252 &#x2252; # APPROXIMATELY EQUAL TO OR THE IMAGE OF
+0x2253 &#x2253; # IMAGE OF OR APPROXIMATELY EQUAL TO
+0x2254 &#x2254; # COLON EQUALS
+0x2255 &#x2255; # EQUALS COLON
+0x2256 &#x2256; # RING IN EQUAL TO
+0x2257 &#x2257; # RING EQUAL TO
+0x2259 &#x2259; # ESTIMATES
+0x225C &#x225C; # DELTA EQUAL TO
+0x2260 &#x2260; # NOT EQUAL TO
+0x2261 &#x2261; # IDENTICAL TO
+0x2262 &#x2262; # NOT IDENTICAL TO
+0x2264 &#x2264; # LESS-THAN OR EQUAL TO
+0x2265 &#x2265; # GREATER-THAN OR EQUAL TO
+0x2266 &#x2266; # LESS-THAN OVER EQUAL TO
+0x2267 &#x2267; # GREATER-THAN OVER EQUAL TO
+0x2268 &#x2268; # LESS-THAN BUT NOT EQUAL TO
+0x2269 &#x2269; # GREATER-THAN BUT NOT EQUAL TO
+0x226A &#x226A; # MUCH LESS-THAN
+0x226B &#x226B; # MUCH GREATER-THAN
+0x226C &#x226C; # BETWEEN
+0x226E &#x226E; # NOT LESS-THAN
+0x226F &#x226F; # NOT GREATER-THAN
+0x2270 &#x2270; # NEITHER LESS-THAN NOR EQUAL TO
+0x2271 &#x2271; # NEITHER GREATER-THAN NOR EQUAL TO
+0x2272 &#x2272; # LESS-THAN OR EQUIVALENT TO
+0x2273 &#x2273; # GREATER-THAN OR EQUIVALENT TO
+0x2276 &#x2276; # LESS-THAN OR GREATER-THAN
+0x2277 &#x2277; # GREATER-THAN OR LESS-THAN
+0x227A &#x227A; # PRECEDES
+0x227B &#x227B; # SUCCEEDS
+0x227C &#x227C; # PRECEDES OR EQUAL TO
+0x227D &#x227D; # SUCCEEDS OR EQUAL TO
+0x227E &#x227E; # PRECEDES OR EQUIVALENT TO
+0x227F &#x227F; # SUCCEEDS OR EQUIVALENT TO
+0x2280 &#x2280; # DOES NOT PRECEDE
+0x2281 &#x2281; # DOES NOT SUCCEED
+0x2282 &#x2282; # SUBSET OF
+0x2283 &#x2283; # SUPERSET OF
+0x2284 &#x2284; # NOT A SUBSET OF
+0x2285 &#x2285; # NOT A SUPERSET OF
+0x2286 &#x2286; # SUBSET OF OR EQUAL TO
+0x2287 &#x2287; # SUPERSET OF OR EQUAL TO
+0x2288 &#x2288; # NEITHER A SUBSET OF NOR EQUAL TO
+0x2289 &#x2289; # NEITHER A SUPERSET OF NOR EQUAL TO
+0x228A &#x228A; # SUBSET OF WITH NOT EQUAL TO
+0x228B &#x228B; # SUPERSET OF WITH NOT EQUAL TO
+0x228E &#x228E; # MULTISET UNION
+0x228F &#x228F; # SQUARE IMAGE OF
+0x2290 &#x2290; # SQUARE ORIGINAL OF
+0x2291 &#x2291; # SQUARE IMAGE OF OR EQUAL TO
+0x2292 &#x2292; # SQUARE ORIGINAL OF OR EQUAL TO
+0x2293 &#x2293; # SQUARE CAP
+0x2294 &#x2294; # SQUARE CUP
+0x2295 &#x2295; # CIRCLED PLUS
+0x2296 &#x2296; # CIRCLED MINUS
+0x2297 &#x2297; # CIRCLED TIMES
+0x2298 &#x2298; # CIRCLED DIVISION SLASH
+0x2299 &#x2299; # CIRCLED DOT OPERATOR
+0x229A &#x229A; # CIRCLED RING OPERATOR
+0x229B &#x229B; # CIRCLED ASTERISK OPERATOR
+0x229D &#x229D; # CIRCLED DASH
+0x229E &#x229E; # SQUARED PLUS
+0x229F &#x229F; # SQUARED MINUS
+0x22A0 &#x22A0; # SQUARED TIMES
+0x22A1 &#x22A1; # SQUARED DOT OPERATOR
+0x22A2 &#x22A2; # RIGHT TACK
+0x22A3 &#x22A3; # LEFT TACK
+0x22A4 &#x22A4; # DOWN TACK
+0x22A5 &#x22A5; # UP TACK
+0x22A7 &#x22A7; # MODELS
+0x22A8 &#x22A8; # TRUE
+0x22A9 &#x22A9; # FORCES
+0x22AA &#x22AA; # TRIPLE VERTICAL BAR RIGHT TURNSTILE
+0x22AC &#x22AC; # DOES NOT PROVE
+0x22AD &#x22AD; # NOT TRUE
+0x22AE &#x22AE; # DOES NOT FORCE
+0x22AF &#x22AF; # NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+0x22B2 &#x22B2; # NORMAL SUBGROUP OF
+0x22B3 &#x22B3; # CONTAINS AS NORMAL SUBGROUP
+0x22B4 &#x22B4; # NORMAL SUBGROUP OF OR EQUAL TO
+0x22B5 &#x22B5; # CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
+0x22B8 &#x22B8; # MULTIMAP
+0x22BA &#x22BA; # INTERCALATE
+0x22BB &#x22BB; # XOR
+0x22BC &#x22BC; # NAND
+0x22C4 &#x22C4; # DIAMOND OPERATOR
+0x22C5 &#x22C5; # DOT OPERATOR
+0x22C6 &#x22C6; # STAR OPERATOR
+0x22C7 &#x22C7; # DIVISION TIMES
+0x22C8 &#x22C8; # BOWTIE
+0x22C9 &#x22C9; # LEFT NORMAL FACTOR SEMIDIRECT PRODUCT
+0x22CA &#x22CA; # RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT
+0x22CB &#x22CB; # LEFT SEMIDIRECT PRODUCT
+0x22CC &#x22CC; # RIGHT SEMIDIRECT PRODUCT
+0x22CD &#x22CD; # REVERSED TILDE EQUALS
+0x22CE &#x22CE; # CURLY LOGICAL OR
+0x22CF &#x22CF; # CURLY LOGICAL AND
+0x22D0 &#x22D0; # DOUBLE SUBSET
+0x22D1 &#x22D1; # DOUBLE SUPERSET
+0x22D2 &#x22D2; # DOUBLE INTERSECTION
+0x22D3 &#x22D3; # DOUBLE UNION
+0x22D4 &#x22D4; # PITCHFORK
+0x22D6 &#x22D6; # LESS-THAN WITH DOT
+0x22D7 &#x22D7; # GREATER-THAN WITH DOT
+0x22D8 &#x22D8; # VERY MUCH LESS-THAN
+0x22D9 &#x22D9; # VERY MUCH GREATER-THAN
+0x22DA &#x22DA; # LESS-THAN EQUAL TO OR GREATER-THAN
+0x22DB &#x22DB; # GREATER-THAN EQUAL TO OR LESS-THAN
+0x22DC &#x22DC; # EQUAL TO OR LESS-THAN
+0x22DD &#x22DD; # EQUAL TO OR GREATER-THAN
+0x22DE &#x22DE; # EQUAL TO OR PRECEDES
+0x22DF &#x22DF; # EQUAL TO OR SUCCEEDS
+0x22E0 &#x22E0; # DOES NOT PRECEDE OR EQUAL
+0x22E1 &#x22E1; # DOES NOT SUCCEED OR EQUAL
+0x22E6 &#x22E6; # LESS-THAN BUT NOT EQUIVALENT TO
+0x22E7 &#x22E7; # GREATER-THAN BUT NOT EQUIVALENT TO
+0x22E8 &#x22E8; # PRECEDES BUT NOT EQUIVALENT TO
+0x22E9 &#x22E9; # SUCCEEDS BUT NOT EQUIVALENT TO
+0x22EA &#x22EA; # NOT NORMAL SUBGROUP OF
+0x22EB &#x22EB; # DOES NOT CONTAIN AS NORMAL SUBGROUP
+0x22EC &#x22EC; # NOT NORMAL SUBGROUP OF OR EQUAL TO
+0x22ED &#x22ED; # DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
+0x22EE &#x22EE; # VERTICAL ELLIPSIS
+0x2306 &#x2306; # PERSPECTIVE
+0x2308 &#x2308; # LEFT CEILING
+0x2309 &#x2309; # RIGHT CEILING
+0x230A &#x230A; # LEFT FLOOR
+0x230B &#x230B; # RIGHT FLOOR
+0x230C &#x230C; # BOTTOM RIGHT CROP
+0x230D &#x230D; # BOTTOM LEFT CROP
+0x230E &#x230E; # TOP RIGHT CROP
+0x230F &#x230F; # TOP LEFT CROP
+0x2315 &#x2315; # TELEPHONE RECORDER
+0x2316 &#x2316; # POSITION INDICATOR
+0x231C &#x231C; # TOP LEFT CORNER
+0x231D &#x231D; # TOP RIGHT CORNER
+0x231E &#x231E; # BOTTOM LEFT CORNER
+0x231F &#x231F; # BOTTOM RIGHT CORNER
+0x2322 &#x2322; # FROWN
+0x2323 &#x2323; # SMILE
+0x2329 &#x2329; # LEFT-POINTING ANGLE BRACKET
+0x232A &#x232A; # RIGHT-POINTING ANGLE BRACKET
+0x2423 &#x2423; # OPEN BOX
+0x24C8 &#x24C8; # CIRCLED LATIN CAPITAL LETTER S
+0x2500 &#x2500; # BOX DRAWINGS LIGHT HORIZONTAL
+0x2502 &#x2502; # BOX DRAWINGS LIGHT VERTICAL
+0x250C &#x250C; # BOX DRAWINGS LIGHT DOWN AND RIGHT
+0x2510 &#x2510; # BOX DRAWINGS LIGHT DOWN AND LEFT
+0x2514 &#x2514; # BOX DRAWINGS LIGHT UP AND RIGHT
+0x2518 &#x2518; # BOX DRAWINGS LIGHT UP AND LEFT
+0x251C &#x251C; # BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+0x2524 &#x2524; # BOX DRAWINGS LIGHT VERTICAL AND LEFT
+0x252C &#x252C; # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+0x2534 &#x2534; # BOX DRAWINGS LIGHT UP AND HORIZONTAL
+0x253C &#x253C; # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+0x2550 &#x2550; # BOX DRAWINGS DOUBLE HORIZONTAL
+0x2551 &#x2551; # BOX DRAWINGS DOUBLE VERTICAL
+0x2552 &#x2552; # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+0x2553 &#x2553; # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
+0x2554 &#x2554; # BOX DRAWINGS DOUBLE DOWN AND RIGHT
+0x2555 &#x2555; # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
+0x2556 &#x2556; # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
+0x2557 &#x2557; # BOX DRAWINGS DOUBLE DOWN AND LEFT
+0x2558 &#x2558; # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+0x2559 &#x2559; # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+0x255A &#x255A; # BOX DRAWINGS DOUBLE UP AND RIGHT
+0x255B &#x255B; # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+0x255C &#x255C; # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
+0x255D &#x255D; # BOX DRAWINGS DOUBLE UP AND LEFT
+0x255E &#x255E; # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+0x255F &#x255F; # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+0x2560 &#x2560; # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+0x2561 &#x2561; # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+0x2562 &#x2562; # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
+0x2563 &#x2563; # BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+0x2564 &#x2564; # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
+0x2565 &#x2565; # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
+0x2566 &#x2566; # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+0x2567 &#x2567; # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+0x2568 &#x2568; # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+0x2569 &#x2569; # BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+0x256A &#x256A; # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+0x256B &#x256B; # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
+0x256C &#x256C; # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+0x2580 &#x2580; # UPPER HALF BLOCK
+0x2584 &#x2584; # LOWER HALF BLOCK
+0x2588 &#x2588; # FULL BLOCK
+0x2591 &#x2591; # LIGHT SHADE
+0x2592 &#x2592; # MEDIUM SHADE
+0x2593 &#x2593; # DARK SHADE
+0x25A1 &#x25A1; # WHITE SQUARE
+0x25AA &#x25AA; # BLACK SMALL SQUARE
+0x25AD &#x25AD; # WHITE RECTANGLE
+0x25AE &#x25AE; # BLACK VERTICAL RECTANGLE
+0x25B3 &#x25B3; # WHITE UP-POINTING TRIANGLE
+0x25B4 &#x25B4; # BLACK UP-POINTING SMALL TRIANGLE
+0x25B5 &#x25B5; # WHITE UP-POINTING SMALL TRIANGLE
+0x25B8 &#x25B8; # BLACK RIGHT-POINTING SMALL TRIANGLE
+0x25B9 &#x25B9; # WHITE RIGHT-POINTING SMALL TRIANGLE
+0x25BD &#x25BD; # WHITE DOWN-POINTING TRIANGLE
+0x25BE &#x25BE; # BLACK DOWN-POINTING SMALL TRIANGLE
+0x25BF &#x25BF; # WHITE DOWN-POINTING SMALL TRIANGLE
+0x25C2 &#x25C2; # BLACK LEFT-POINTING SMALL TRIANGLE
+0x25C3 &#x25C3; # WHITE LEFT-POINTING SMALL TRIANGLE
+0x25CA &#x25CA; # LOZENGE
+0x25CB &#x25CB; # WHITE CIRCLE
+0x2605 &#x2605; # BLACK STAR
+0x2606 &#x2606; # WHITE STAR
+0x260E &#x260E; # BLACK TELEPHONE
+0x2640 &#x2640; # FEMALE SIGN
+0x2642 &#x2642; # MALE SIGN
+0x2660 &#x2660; # BLACK SPADE SUIT
+0x2663 &#x2663; # BLACK CLUB SUIT
+0x2665 &#x2665; # BLACK HEART SUIT
+0x2666 &#x2666; # BLACK DIAMOND SUIT
+0x266A &#x266A; # EIGHTH NOTE
+0x266D &#x266D; # MUSIC FLAT SIGN
+0x266E &#x266E; # MUSIC NATURAL SIGN
+0x266F &#x266F; # MUSIC SHARP SIGN
+0x2713 &#x2713; # CHECK MARK
+0x2717 &#x2717; # BALLOT X
+0x2720 &#x2720; # MALTESE CROSS
+0x2726 &#x2726; # BLACK FOUR POINTED STAR
+0x2727 &#x2727; # WHITE FOUR POINTED STAR
+0x2736 &#x2736; # SIX POINTED BLACK STAR
+0xFB00 &#xFB00; # LATIN SMALL LIGATURE FF
+0xFB01 &#xFB01; # LATIN SMALL LIGATURE FI
+0xFB02 &#xFB02; # LATIN SMALL LIGATURE FL
+0xFB03 &#xFB03; # LATIN SMALL LIGATURE FFI
+0xFB04 &#xFB04; # LATIN SMALL LIGATURE FFL
+
+
+</PRE>
+</BODY>
+</HTML>
diff --git a/test/utf-8-demo.html b/test/utf-8-demo.html
new file mode 100644
index 0000000..d792903
--- /dev/null
+++ b/test/utf-8-demo.html
@@ -0,0 +1,216 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<HTML>
+<HEAD>
+<TITLE>Markus Kuhn's UTF-8 demo</TITLE>
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
+<LINK REV="made" HREF="mailto:dickey@invisible-island.net">
+</HEAD>
+
+<BODY>
+<pre>
+UTF-8 encoded sample plain-text file
+&#x203e;&#x203e;&#x203e;&#x203e;&#x203e;&#x203e;&#x203e;&#x203e;&#x203e;&#x203e;&#x203e;&#x203e;&#x203e;&#x203e;&#x203e;&#x203e;&#x203e;&#x203e;&#x203e;&#x203e;&#x203e;&#x203e;&#x203e;&#x203e;&#x203e;&#x203e;&#x203e;&#x203e;&#x203e;&#x203e;&#x203e;&#x203e;&#x203e;&#x203e;&#x203e;&#x203e;
+
+Markus Kuhn [&#x2c8;ma&#x2b3;k&#x28a;s ku&#x2d0;n] &lt;mkuhn@acm.org&gt; &#x2014; 1999-08-20
+
+
+The ASCII compatible UTF-8 encoding of ISO 10646 and Unicode
+plain-text files is defined in RFC 2279 and in ISO 10646-1 Annex R.
+
+
+Using Unicode/UTF-8, you can write in emails and source code things such as
+
+Mathematics and Sciences:
+
+ &#x222e; E&#x22c5;da = Q, n &#x2192; &#x221e;, &#x2211; f(i) = &#x220f; g(i), &#x2200;x&#x2208;&#x211d;: &#x2308;x&#x2309; = &#x2212;&#x230a;&#x2212;x&#x230b;, &#x3b1; &#x2227; &#xac;&#x3b2; = &#xac;(&#xac;&#x3b1; &#x2228; &#x3b2;),
+
+ &#x2115; &#x2286; &#x2115;&#x2080; &#x2282; &#x2124; &#x2282; &#x211a; &#x2282; &#x211d; &#x2282; &#x2102;, &#x22a5; &lt; a &#x2260; b &#x2261; c &#x2264; d &#x226a; &#x22a4; &#x21d2; (A &#x21d4; B),
+
+ 2H&#x2082; + O&#x2082; &#x21cc; 2H&#x2082;O, R = 4.7 k&#x3a9;, &#x2300; 200 mm
+
+Linguistics and dictionaries:
+
+ &#xf0;i &#x131;nt&#x259;&#x2c8;n&#xe6;&#x283;&#x259;n&#x259;l f&#x259;&#x2c8;n&#x25b;t&#x131;k &#x259;so&#x28a;si&#x2c8;e&#x131;&#x283;n
+ Y [&#x2c8;&#x28f;psil&#x254;n], Yen [j&#x25b;n], Yoga [&#x2c8;jo&#x2d0;g&#x251;]
+
+APL:
+
+ ((V&#x2373;V)=&#x2373;&#x2374;V)/V&#x2190;,V &#x2337;&#x2190;&#x2373;&#x2192;&#x2374;&#x2206;&#x2207;&#x2283;&#x203e;&#x234e;&#x2355;&#x2308;
+
+Nicer typography in plain text files:
+
+ &#x2554;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2557;
+ &#x2551; &#x2551;
+ &#x2551; &#x2022; &#x2018;single&#x2019; and &#x201c;double&#x201d; quotes &#x2551;
+ &#x2551; &#x2551;
+ &#x2551; &#x2022; Curly apostrophes: &#x201c;We&#x2019;ve been here&#x201d; &#x2551;
+ &#x2551; &#x2551;
+ &#x2551; &#x2022; Latin-1 apostrophe and accents: '&#xb4;` &#x2551;
+ &#x2551; &#x2551;
+ &#x2551; &#x2022; &#x201a;deutsche&#x2018; &#x201e;Anf&#xfc;hrungszeichen&#x201c; &#x2551;
+ &#x2551; &#x2551;
+ &#x2551; &#x2022; &#x2020;, &#x2021;, &#x2030;, &#x2022;, 3&#x2013;4, &#x2014;, &#x2212;5/+5, &#x2122;, &#x2026; &#x2551;
+ &#x2551; &#x2551;
+ &#x2551; &#x2022; ASCII safety test: 1lI|, 0OD, 8B &#x2551;
+ &#x2551; &#x256d;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x256e; &#x2551;
+ &#x2551; &#x2022; the euro symbol: &#x2502; &#x20ac; 14.95 &#x2502; &#x2551;
+ &#x2551; &#x2570;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x256f; &#x2551;
+ &#x255a;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x255d;
+
+Greek (in Polytonic):
+
+ The Greek anthem:
+
+ &#x3a3;&#x1f72; &#x3b3;&#x3bd;&#x3c9;&#x3c1;&#x1f77;&#x3b6;&#x3c9; &#x1f00;&#x3c0;&#x1f78; &#x3c4;&#x1f74;&#x3bd; &#x3ba;&#x1f79;&#x3c8;&#x3b7;
+ &#x3c4;&#x3bf;&#x1fe6; &#x3c3;&#x3c0;&#x3b1;&#x3b8;&#x3b9;&#x3bf;&#x1fe6; &#x3c4;&#x1f74;&#x3bd; &#x3c4;&#x3c1;&#x3bf;&#x3bc;&#x3b5;&#x3c1;&#x1f75;,
+ &#x3c3;&#x1f72; &#x3b3;&#x3bd;&#x3c9;&#x3c1;&#x1f77;&#x3b6;&#x3c9; &#x1f00;&#x3c0;&#x1f78; &#x3c4;&#x1f74;&#x3bd; &#x1f44;&#x3c8;&#x3b7;
+ &#x3c0;&#x3bf;&#x1f7a; &#x3bc;&#x1f72; &#x3b2;&#x1f77;&#x3b1; &#x3bc;&#x3b5;&#x3c4;&#x3c1;&#x1f71;&#x3b5;&#x3b9; &#x3c4;&#x1f74; &#x3b3;&#x1fc6;.
+
+ &#x1fbf;&#x391;&#x3c0;&#x1fbf; &#x3c4;&#x1f70; &#x3ba;&#x1f79;&#x3ba;&#x3ba;&#x3b1;&#x3bb;&#x3b1; &#x3b2;&#x3b3;&#x3b1;&#x3bb;&#x3bc;&#x1f73;&#x3bd;&#x3b7;
+ &#x3c4;&#x1ff6;&#x3bd; &#x1ffe;&#x395;&#x3bb;&#x3bb;&#x1f75;&#x3bd;&#x3c9;&#x3bd; &#x3c4;&#x1f70; &#x1f31;&#x3b5;&#x3c1;&#x1f71;
+ &#x3ba;&#x3b1;&#x1f76; &#x3c3;&#x1f70;&#x3bd; &#x3c0;&#x3c1;&#x1ff6;&#x3c4;&#x3b1; &#x1f00;&#x3bd;&#x3b4;&#x3c1;&#x3b5;&#x3b9;&#x3c9;&#x3bc;&#x1f73;&#x3bd;&#x3b7;
+ &#x3c7;&#x3b1;&#x1fd6;&#x3c1;&#x3b5;, &#x1f66; &#x3c7;&#x3b1;&#x1fd6;&#x3c1;&#x3b5;, &#x1fbf;&#x395;&#x3bb;&#x3b5;&#x3c5;&#x3b8;&#x3b5;&#x3c1;&#x3b9;&#x1f71;!
+
+ From a speech of Demosthenes in the 4th century BC:
+
+ &#x39f;&#x1f50;&#x3c7;&#x1f76; &#x3c4;&#x3b1;&#x1f50;&#x3c4;&#x1f70; &#x3c0;&#x3b1;&#x3c1;&#x1f77;&#x3c3;&#x3c4;&#x3b1;&#x3c4;&#x3b1;&#x1f77; &#x3bc;&#x3bf;&#x3b9; &#x3b3;&#x3b9;&#x3b3;&#x3bd;&#x1f7d;&#x3c3;&#x3ba;&#x3b5;&#x3b9;&#x3bd;, &#x1f66; &#x1f04;&#x3bd;&#x3b4;&#x3c1;&#x3b5;&#x3c2; &#x1fbf;&#x391;&#x3b8;&#x3b7;&#x3bd;&#x3b1;&#x1fd6;&#x3bf;&#x3b9;,
+ &#x1f45;&#x3c4;&#x3b1;&#x3bd; &#x3c4;&#x1fbf; &#x3b5;&#x1f30;&#x3c2; &#x3c4;&#x1f70; &#x3c0;&#x3c1;&#x1f71;&#x3b3;&#x3bc;&#x3b1;&#x3c4;&#x3b1; &#x1f00;&#x3c0;&#x3bf;&#x3b2;&#x3bb;&#x1f73;&#x3c8;&#x3c9; &#x3ba;&#x3b1;&#x1f76; &#x1f45;&#x3c4;&#x3b1;&#x3bd; &#x3c0;&#x3c1;&#x1f78;&#x3c2; &#x3c4;&#x3bf;&#x1f7a;&#x3c2;
+ &#x3bb;&#x1f79;&#x3b3;&#x3bf;&#x3c5;&#x3c2; &#x3bf;&#x1f53;&#x3c2; &#x1f00;&#x3ba;&#x3bf;&#x1f7b;&#x3c9;&#x387; &#x3c4;&#x3bf;&#x1f7a;&#x3c2; &#x3bc;&#x1f72;&#x3bd; &#x3b3;&#x1f70;&#x3c1; &#x3bb;&#x1f79;&#x3b3;&#x3bf;&#x3c5;&#x3c2; &#x3c0;&#x3b5;&#x3c1;&#x1f76; &#x3c4;&#x3bf;&#x1fe6;
+ &#x3c4;&#x3b9;&#x3bc;&#x3c9;&#x3c1;&#x1f75;&#x3c3;&#x3b1;&#x3c3;&#x3b8;&#x3b1;&#x3b9; &#x3a6;&#x1f77;&#x3bb;&#x3b9;&#x3c0;&#x3c0;&#x3bf;&#x3bd; &#x1f41;&#x3c1;&#x1ff6; &#x3b3;&#x3b9;&#x3b3;&#x3bd;&#x3bf;&#x3bc;&#x1f73;&#x3bd;&#x3bf;&#x3c5;&#x3c2;, &#x3c4;&#x1f70; &#x3b4;&#x1f72; &#x3c0;&#x3c1;&#x1f71;&#x3b3;&#x3bc;&#x3b1;&#x3c4;&#x1fbf;
+ &#x3b5;&#x1f30;&#x3c2; &#x3c4;&#x3bf;&#x1fe6;&#x3c4;&#x3bf; &#x3c0;&#x3c1;&#x3bf;&#x1f75;&#x3ba;&#x3bf;&#x3bd;&#x3c4;&#x3b1;, &#x1f65;&#x3c3;&#x3b8;&#x1fbf; &#x1f45;&#x3c0;&#x3c9;&#x3c2; &#x3bc;&#x1f74; &#x3c0;&#x3b5;&#x3b9;&#x3c3;&#x1f79;&#x3bc;&#x3b5;&#x3b8;&#x1fbf; &#x3b1;&#x1f50;&#x3c4;&#x3bf;&#x1f76;
+ &#x3c0;&#x3c1;&#x1f79;&#x3c4;&#x3b5;&#x3c1;&#x3bf;&#x3bd; &#x3ba;&#x3b1;&#x3ba;&#x1ff6;&#x3c2; &#x3c3;&#x3ba;&#x1f73;&#x3c8;&#x3b1;&#x3c3;&#x3b8;&#x3b1;&#x3b9; &#x3b4;&#x1f73;&#x3bf;&#x3bd;. &#x3bf;&#x1f50;&#x3b4;&#x1f73;&#x3bd; &#x3bf;&#x1f56;&#x3bd; &#x1f04;&#x3bb;&#x3bb;&#x3bf; &#x3bc;&#x3bf;&#x3b9; &#x3b4;&#x3bf;&#x3ba;&#x3bf;&#x1fe6;&#x3c3;&#x3b9;&#x3bd;
+ &#x3bf;&#x1f31; &#x3c4;&#x1f70; &#x3c4;&#x3bf;&#x3b9;&#x3b1;&#x1fe6;&#x3c4;&#x3b1; &#x3bb;&#x1f73;&#x3b3;&#x3bf;&#x3bd;&#x3c4;&#x3b5;&#x3c2; &#x1f22; &#x3c4;&#x1f74;&#x3bd; &#x1f51;&#x3c0;&#x1f79;&#x3b8;&#x3b5;&#x3c3;&#x3b9;&#x3bd;, &#x3c0;&#x3b5;&#x3c1;&#x1f76; &#x1f27;&#x3c2; &#x3b2;&#x3bf;&#x3c5;&#x3bb;&#x3b5;&#x1f7b;&#x3b5;&#x3c3;&#x3b8;&#x3b1;&#x3b9;,
+ &#x3bf;&#x1f50;&#x3c7;&#x1f76; &#x3c4;&#x1f74;&#x3bd; &#x3bf;&#x1f56;&#x3c3;&#x3b1;&#x3bd; &#x3c0;&#x3b1;&#x3c1;&#x3b9;&#x3c3;&#x3c4;&#x1f71;&#x3bd;&#x3c4;&#x3b5;&#x3c2; &#x1f51;&#x3bc;&#x1fd6;&#x3bd; &#x1f01;&#x3bc;&#x3b1;&#x3c1;&#x3c4;&#x1f71;&#x3bd;&#x3b5;&#x3b9;&#x3bd;. &#x1f10;&#x3b3;&#x1f7c; &#x3b4;&#x1f73;, &#x1f45;&#x3c4;&#x3b9; &#x3bc;&#x1f73;&#x3bd;
+ &#x3c0;&#x3bf;&#x3c4;&#x1fbf; &#x1f10;&#x3be;&#x1fc6;&#x3bd; &#x3c4;&#x1fc7; &#x3c0;&#x1f79;&#x3bb;&#x3b5;&#x3b9; &#x3ba;&#x3b1;&#x1f76; &#x3c4;&#x1f70; &#x3b1;&#x1f51;&#x3c4;&#x1fc6;&#x3c2; &#x1f14;&#x3c7;&#x3b5;&#x3b9;&#x3bd; &#x1f00;&#x3c3;&#x3c6;&#x3b1;&#x3bb;&#x1ff6;&#x3c2; &#x3ba;&#x3b1;&#x1f76; &#x3a6;&#x1f77;&#x3bb;&#x3b9;&#x3c0;&#x3c0;&#x3bf;&#x3bd;
+ &#x3c4;&#x3b9;&#x3bc;&#x3c9;&#x3c1;&#x1f75;&#x3c3;&#x3b1;&#x3c3;&#x3b8;&#x3b1;&#x3b9;, &#x3ba;&#x3b1;&#x1f76; &#x3bc;&#x1f71;&#x3bb;&#x1fbf; &#x1f00;&#x3ba;&#x3c1;&#x3b9;&#x3b2;&#x1ff6;&#x3c2; &#x3bf;&#x1f36;&#x3b4;&#x3b1;&#x387; &#x1f10;&#x3c0;&#x1fbf; &#x1f10;&#x3bc;&#x3bf;&#x1fe6; &#x3b3;&#x1f71;&#x3c1;, &#x3bf;&#x1f50; &#x3c0;&#x1f71;&#x3bb;&#x3b1;&#x3b9;
+ &#x3b3;&#x1f73;&#x3b3;&#x3bf;&#x3bd;&#x3b5;&#x3bd; &#x3c4;&#x3b1;&#x1fe6;&#x3c4;&#x1fbf; &#x1f00;&#x3bc;&#x3c6;&#x1f79;&#x3c4;&#x3b5;&#x3c1;&#x3b1;&#x387; &#x3bd;&#x1fe6;&#x3bd; &#x3bc;&#x1f73;&#x3bd;&#x3c4;&#x3bf;&#x3b9; &#x3c0;&#x1f73;&#x3c0;&#x3b5;&#x3b9;&#x3c3;&#x3bc;&#x3b1;&#x3b9; &#x3c4;&#x3bf;&#x1fe6;&#x3b8;&#x1fbf; &#x1f31;&#x3ba;&#x3b1;&#x3bd;&#x1f78;&#x3bd;
+ &#x3c0;&#x3c1;&#x3bf;&#x3bb;&#x3b1;&#x3b2;&#x3b5;&#x1fd6;&#x3bd; &#x1f21;&#x3bc;&#x1fd6;&#x3bd; &#x3b5;&#x1f36;&#x3bd;&#x3b1;&#x3b9; &#x3c4;&#x1f74;&#x3bd; &#x3c0;&#x3c1;&#x1f7d;&#x3c4;&#x3b7;&#x3bd;, &#x1f45;&#x3c0;&#x3c9;&#x3c2; &#x3c4;&#x3bf;&#x1f7a;&#x3c2; &#x3c3;&#x3c5;&#x3bc;&#x3bc;&#x1f71;&#x3c7;&#x3bf;&#x3c5;&#x3c2;
+ &#x3c3;&#x1f7d;&#x3c3;&#x3bf;&#x3bc;&#x3b5;&#x3bd;. &#x1f10;&#x1f70;&#x3bd; &#x3b3;&#x1f70;&#x3c1; &#x3c4;&#x3bf;&#x1fe6;&#x3c4;&#x3bf; &#x3b2;&#x3b5;&#x3b2;&#x3b1;&#x1f77;&#x3c9;&#x3c2; &#x1f51;&#x3c0;&#x1f71;&#x3c1;&#x3be;&#x1fc3;, &#x3c4;&#x1f79;&#x3c4;&#x3b5; &#x3ba;&#x3b1;&#x1f76; &#x3c0;&#x3b5;&#x3c1;&#x1f76; &#x3c4;&#x3bf;&#x1fe6;
+ &#x3c4;&#x1f77;&#x3bd;&#x3b1; &#x3c4;&#x3b9;&#x3bc;&#x3c9;&#x3c1;&#x1f75;&#x3c3;&#x3b5;&#x3c4;&#x3b1;&#x1f77; &#x3c4;&#x3b9;&#x3c2; &#x3ba;&#x3b1;&#x1f76; &#x1f43;&#x3bd; &#x3c4;&#x3c1;&#x1f79;&#x3c0;&#x3bf;&#x3bd; &#x1f10;&#x3be;&#x1f73;&#x3c3;&#x3c4;&#x3b1;&#x3b9; &#x3c3;&#x3ba;&#x3bf;&#x3c0;&#x3b5;&#x1fd6;&#x3bd;&#x387; &#x3c0;&#x3c1;&#x1f76;&#x3bd; &#x3b4;&#x1f72;
+ &#x3c4;&#x1f74;&#x3bd; &#x1f00;&#x3c1;&#x3c7;&#x1f74;&#x3bd; &#x1f40;&#x3c1;&#x3b8;&#x1ff6;&#x3c2; &#x1f51;&#x3c0;&#x3bf;&#x3b8;&#x1f73;&#x3c3;&#x3b8;&#x3b1;&#x3b9;, &#x3bc;&#x1f71;&#x3c4;&#x3b1;&#x3b9;&#x3bf;&#x3bd; &#x1f21;&#x3b3;&#x3bf;&#x1fe6;&#x3bc;&#x3b1;&#x3b9; &#x3c0;&#x3b5;&#x3c1;&#x1f76; &#x3c4;&#x1fc6;&#x3c2;
+ &#x3c4;&#x3b5;&#x3bb;&#x3b5;&#x3c5;&#x3c4;&#x1fc6;&#x3c2; &#x1f41;&#x3bd;&#x3c4;&#x3b9;&#x3bd;&#x3bf;&#x1fe6;&#x3bd; &#x3c0;&#x3bf;&#x3b9;&#x3b5;&#x1fd6;&#x3c3;&#x3b8;&#x3b1;&#x3b9; &#x3bb;&#x1f79;&#x3b3;&#x3bf;&#x3bd;.
+
+ &#x394;&#x3b7;&#x3bc;&#x3bf;&#x3c3;&#x3b8;&#x1f73;&#x3bd;&#x3bf;&#x3c5;&#x3c2;, &#x393;&#x1ffd; &#x1fbf;&#x39f;&#x3bb;&#x3c5;&#x3bd;&#x3b8;&#x3b9;&#x3b1;&#x3ba;&#x1f78;&#x3c2;
+
+Georgian:
+
+ From a Unicode conference invitation:
+
+ &#x10d2;&#x10d7;&#x10ee;&#x10dd;&#x10d5;&#x10d7; &#x10d0;&#x10ee;&#x10da;&#x10d0;&#x10d5;&#x10d4; &#x10d2;&#x10d0;&#x10d8;&#x10d0;&#x10e0;&#x10dd;&#x10d7; &#x10e0;&#x10d4;&#x10d2;&#x10d8;&#x10e1;&#x10e2;&#x10e0;&#x10d0;&#x10ea;&#x10d8;&#x10d0; Unicode-&#x10d8;&#x10e1; &#x10db;&#x10d4;&#x10d0;&#x10d7;&#x10d4; &#x10e1;&#x10d0;&#x10d4;&#x10e0;&#x10d7;&#x10d0;&#x10e8;&#x10dd;&#x10e0;&#x10d8;&#x10e1;&#x10dd;
+ &#x10d9;&#x10dd;&#x10dc;&#x10e4;&#x10d4;&#x10e0;&#x10d4;&#x10dc;&#x10ea;&#x10d8;&#x10d0;&#x10d6;&#x10d4; &#x10d3;&#x10d0;&#x10e1;&#x10d0;&#x10e1;&#x10ec;&#x10e0;&#x10d4;&#x10d1;&#x10d0;&#x10d3;, &#x10e0;&#x10dd;&#x10db;&#x10d4;&#x10da;&#x10d8;&#x10ea; &#x10d2;&#x10d0;&#x10d8;&#x10db;&#x10d0;&#x10e0;&#x10d7;&#x10d4;&#x10d1;&#x10d0; 10-12 &#x10db;&#x10d0;&#x10e0;&#x10e2;&#x10e1;,
+ &#x10e5;. &#x10db;&#x10d0;&#x10d8;&#x10dc;&#x10ea;&#x10e8;&#x10d8;, &#x10d2;&#x10d4;&#x10e0;&#x10db;&#x10d0;&#x10dc;&#x10d8;&#x10d0;&#x10e8;&#x10d8;. &#x10d9;&#x10dd;&#x10dc;&#x10e4;&#x10d4;&#x10e0;&#x10d4;&#x10dc;&#x10ea;&#x10d8;&#x10d0; &#x10e8;&#x10d4;&#x10f0;&#x10d9;&#x10e0;&#x10d4;&#x10d1;&#x10e1; &#x10d4;&#x10e0;&#x10d7;&#x10d0;&#x10d3; &#x10db;&#x10e1;&#x10dd;&#x10e4;&#x10da;&#x10d8;&#x10dd;&#x10e1;
+ &#x10d4;&#x10e5;&#x10e1;&#x10de;&#x10d4;&#x10e0;&#x10e2;&#x10d4;&#x10d1;&#x10e1; &#x10d8;&#x10e1;&#x10d4;&#x10d7; &#x10d3;&#x10d0;&#x10e0;&#x10d2;&#x10d4;&#x10d1;&#x10e8;&#x10d8; &#x10e0;&#x10dd;&#x10d2;&#x10dd;&#x10e0;&#x10d8;&#x10ea;&#x10d0;&#x10d0; &#x10d8;&#x10dc;&#x10e2;&#x10d4;&#x10e0;&#x10dc;&#x10d4;&#x10e2;&#x10d8; &#x10d3;&#x10d0; Unicode-&#x10d8;,
+ &#x10d8;&#x10dc;&#x10e2;&#x10d4;&#x10e0;&#x10dc;&#x10d0;&#x10ea;&#x10d8;&#x10dd;&#x10dc;&#x10d0;&#x10da;&#x10d8;&#x10d6;&#x10d0;&#x10ea;&#x10d8;&#x10d0; &#x10d3;&#x10d0; &#x10da;&#x10dd;&#x10d9;&#x10d0;&#x10da;&#x10d8;&#x10d6;&#x10d0;&#x10ea;&#x10d8;&#x10d0;, Unicode-&#x10d8;&#x10e1; &#x10d2;&#x10d0;&#x10db;&#x10dd;&#x10e7;&#x10d4;&#x10dc;&#x10d4;&#x10d1;&#x10d0;
+ &#x10dd;&#x10de;&#x10d4;&#x10e0;&#x10d0;&#x10ea;&#x10d8;&#x10e3;&#x10da; &#x10e1;&#x10d8;&#x10e1;&#x10e2;&#x10d4;&#x10db;&#x10d4;&#x10d1;&#x10e1;&#x10d0;, &#x10d3;&#x10d0; &#x10d2;&#x10d0;&#x10db;&#x10dd;&#x10e7;&#x10d4;&#x10dc;&#x10d4;&#x10d1;&#x10d8;&#x10d7; &#x10de;&#x10e0;&#x10dd;&#x10d2;&#x10e0;&#x10d0;&#x10db;&#x10d4;&#x10d1;&#x10e8;&#x10d8;, &#x10e8;&#x10e0;&#x10d8;&#x10e4;&#x10e2;&#x10d4;&#x10d1;&#x10e8;&#x10d8;,
+ &#x10e2;&#x10d4;&#x10e5;&#x10e1;&#x10e2;&#x10d4;&#x10d1;&#x10d8;&#x10e1; &#x10d3;&#x10d0;&#x10db;&#x10e3;&#x10e8;&#x10d0;&#x10d5;&#x10d4;&#x10d1;&#x10d0;&#x10e1;&#x10d0; &#x10d3;&#x10d0; &#x10db;&#x10e0;&#x10d0;&#x10d5;&#x10d0;&#x10da;&#x10d4;&#x10dc;&#x10dd;&#x10d5;&#x10d0;&#x10dc; &#x10d9;&#x10dd;&#x10db;&#x10de;&#x10d8;&#x10e3;&#x10e2;&#x10d4;&#x10e0;&#x10e3;&#x10da; &#x10e1;&#x10d8;&#x10e1;&#x10e2;&#x10d4;&#x10db;&#x10d4;&#x10d1;&#x10e8;&#x10d8;.
+
+Russian:
+
+ From a Unicode conference invitation:
+
+ &#x417;&#x430;&#x440;&#x435;&#x433;&#x438;&#x441;&#x442;&#x440;&#x438;&#x440;&#x443;&#x439;&#x442;&#x435;&#x441;&#x44c; &#x441;&#x435;&#x439;&#x447;&#x430;&#x441; &#x43d;&#x430; &#x414;&#x435;&#x441;&#x44f;&#x442;&#x443;&#x44e; &#x41c;&#x435;&#x436;&#x434;&#x443;&#x43d;&#x430;&#x440;&#x43e;&#x434;&#x43d;&#x443;&#x44e; &#x41a;&#x43e;&#x43d;&#x444;&#x435;&#x440;&#x435;&#x43d;&#x446;&#x438;&#x44e; &#x43f;&#x43e;
+ Unicode, &#x43a;&#x43e;&#x442;&#x43e;&#x440;&#x430;&#x44f; &#x441;&#x43e;&#x441;&#x442;&#x43e;&#x438;&#x442;&#x441;&#x44f; 10-12 &#x43c;&#x430;&#x440;&#x442;&#x430; 1997 &#x433;&#x43e;&#x434;&#x430; &#x432; &#x41c;&#x430;&#x439;&#x43d;&#x446;&#x435; &#x432; &#x413;&#x435;&#x440;&#x43c;&#x430;&#x43d;&#x438;&#x438;.
+ &#x41a;&#x43e;&#x43d;&#x444;&#x435;&#x440;&#x435;&#x43d;&#x446;&#x438;&#x44f; &#x441;&#x43e;&#x431;&#x435;&#x440;&#x435;&#x442; &#x448;&#x438;&#x440;&#x43e;&#x43a;&#x438;&#x439; &#x43a;&#x440;&#x443;&#x433; &#x44d;&#x43a;&#x441;&#x43f;&#x435;&#x440;&#x442;&#x43e;&#x432; &#x43f;&#x43e; &#x432;&#x43e;&#x43f;&#x440;&#x43e;&#x441;&#x430;&#x43c; &#x433;&#x43b;&#x43e;&#x431;&#x430;&#x43b;&#x44c;&#x43d;&#x43e;&#x433;&#x43e;
+ &#x418;&#x43d;&#x442;&#x435;&#x440;&#x43d;&#x435;&#x442;&#x430; &#x438; Unicode, &#x43b;&#x43e;&#x43a;&#x430;&#x43b;&#x438;&#x437;&#x430;&#x446;&#x438;&#x438; &#x438; &#x438;&#x43d;&#x442;&#x435;&#x440;&#x43d;&#x430;&#x446;&#x438;&#x43e;&#x43d;&#x430;&#x43b;&#x438;&#x437;&#x430;&#x446;&#x438;&#x438;, &#x432;&#x43e;&#x43f;&#x43b;&#x43e;&#x449;&#x435;&#x43d;&#x438;&#x44e; &#x438;
+ &#x43f;&#x440;&#x438;&#x43c;&#x435;&#x43d;&#x435;&#x43d;&#x438;&#x44e; Unicode &#x432; &#x440;&#x430;&#x437;&#x43b;&#x438;&#x447;&#x43d;&#x44b;&#x445; &#x43e;&#x43f;&#x435;&#x440;&#x430;&#x446;&#x438;&#x43e;&#x43d;&#x43d;&#x44b;&#x445; &#x441;&#x438;&#x441;&#x442;&#x435;&#x43c;&#x430;&#x445; &#x438; &#x43f;&#x440;&#x43e;&#x433;&#x440;&#x430;&#x43c;&#x43c;&#x43d;&#x44b;&#x445;
+ &#x43f;&#x440;&#x438;&#x43b;&#x43e;&#x436;&#x435;&#x43d;&#x438;&#x44f;&#x445;, &#x448;&#x440;&#x438;&#x444;&#x442;&#x430;&#x445;, &#x432;&#x435;&#x440;&#x441;&#x442;&#x43a;&#x435; &#x438; &#x43c;&#x43d;&#x43e;&#x433;&#x43e;&#x44f;&#x437;&#x44b;&#x447;&#x43d;&#x44b;&#x445; &#x43a;&#x43e;&#x43c;&#x43f;&#x44c;&#x44e;&#x442;&#x435;&#x440;&#x43d;&#x44b;&#x445; &#x441;&#x438;&#x441;&#x442;&#x435;&#x43c;&#x430;&#x445;.
+
+Thai (UCS Level 2):
+
+ Excerpt from a poetry on The Romance of The Three Kingdoms (a Chinese
+ classic 'San Gua'):
+
+ [----------------------------|------------------------]
+ &#xe4f; &#xe41;&#xe1c;&#xe48;&#xe19;&#xe14;&#xe34;&#xe19;&#xe2e;&#xe31;&#xe48;&#xe19;&#xe40;&#xe2a;&#xe37;&#xe48;&#xe2d;&#xe21;&#xe42;&#xe17;&#xe23;&#xe21;&#xe41;&#xe2a;&#xe19;&#xe2a;&#xe31;&#xe07;&#xe40;&#xe27;&#xe0a; &#xe1e;&#xe23;&#xe30;&#xe1b;&#xe01;&#xe40;&#xe01;&#xe28;&#xe01;&#xe2d;&#xe07;&#xe1a;&#xe39;&#xe4a;&#xe01;&#xe39;&#xe49;&#xe02;&#xe36;&#xe49;&#xe19;&#xe43;&#xe2b;&#xe21;&#xe48;
+ &#xe2a;&#xe34;&#xe1a;&#xe2a;&#xe2d;&#xe07;&#xe01;&#xe29;&#xe31;&#xe15;&#xe23;&#xe34;&#xe22;&#xe4c;&#xe01;&#xe48;&#xe2d;&#xe19;&#xe2b;&#xe19;&#xe49;&#xe32;&#xe41;&#xe25;&#xe16;&#xe31;&#xe14;&#xe44;&#xe1b; &#xe2a;&#xe2d;&#xe07;&#xe2d;&#xe07;&#xe04;&#xe4c;&#xe44;&#xe0b;&#xe23;&#xe49;&#xe42;&#xe07;&#xe48;&#xe40;&#xe02;&#xe25;&#xe32;&#xe40;&#xe1a;&#xe32;&#xe1b;&#xe31;&#xe0d;&#xe0d;&#xe32;
+ &#xe17;&#xe23;&#xe07;&#xe19;&#xe31;&#xe1a;&#xe16;&#xe37;&#xe2d;&#xe02;&#xe31;&#xe19;&#xe17;&#xe35;&#xe40;&#xe1b;&#xe47;&#xe19;&#xe17;&#xe35;&#xe48;&#xe1e;&#xe36;&#xe48;&#xe07; &#xe1a;&#xe49;&#xe32;&#xe19;&#xe40;&#xe21;&#xe37;&#xe2d;&#xe07;&#xe08;&#xe36;&#xe07;&#xe27;&#xe34;&#xe1b;&#xe23;&#xe34;&#xe15;&#xe40;&#xe1b;&#xe47;&#xe19;&#xe19;&#xe31;&#xe01;&#xe2b;&#xe19;&#xe32;
+ &#xe42;&#xe2e;&#xe08;&#xe34;&#xe4b;&#xe19;&#xe40;&#xe23;&#xe35;&#xe22;&#xe01;&#xe17;&#xe31;&#xe1e;&#xe17;&#xe31;&#xe48;&#xe27;&#xe2b;&#xe31;&#xe27;&#xe40;&#xe21;&#xe37;&#xe2d;&#xe07;&#xe21;&#xe32; &#xe2b;&#xe21;&#xe32;&#xe22;&#xe08;&#xe30;&#xe06;&#xe48;&#xe32;&#xe21;&#xe14;&#xe0a;&#xe31;&#xe48;&#xe27;&#xe15;&#xe31;&#xe27;&#xe2a;&#xe33;&#xe04;&#xe31;&#xe0d;
+ &#xe40;&#xe2b;&#xe21;&#xe37;&#xe2d;&#xe19;&#xe02;&#xe31;&#xe1a;&#xe44;&#xe2a;&#xe44;&#xe25;&#xe48;&#xe40;&#xe2a;&#xe37;&#xe2d;&#xe08;&#xe32;&#xe01;&#xe40;&#xe04;&#xe2b;&#xe32; &#xe23;&#xe31;&#xe1a;&#xe2b;&#xe21;&#xe32;&#xe1b;&#xe48;&#xe32;&#xe40;&#xe02;&#xe49;&#xe32;&#xe21;&#xe32;&#xe40;&#xe25;&#xe22;&#xe2d;&#xe32;&#xe2a;&#xe31;&#xe0d;
+ &#xe1d;&#xe48;&#xe32;&#xe22;&#xe2d;&#xe49;&#xe2d;&#xe07;&#xe2d;&#xe38;&#xe49;&#xe19;&#xe22;&#xe38;&#xe41;&#xe22;&#xe01;&#xe43;&#xe2b;&#xe49;&#xe41;&#xe15;&#xe01;&#xe01;&#xe31;&#xe19; &#xe43;&#xe0a;&#xe49;&#xe2a;&#xe32;&#xe27;&#xe19;&#xe31;&#xe49;&#xe19;&#xe40;&#xe1b;&#xe47;&#xe19;&#xe0a;&#xe19;&#xe27;&#xe19;&#xe0a;&#xe37;&#xe48;&#xe19;&#xe0a;&#xe27;&#xe19;&#xe43;&#xe08;
+ &#xe1e;&#xe25;&#xe31;&#xe19;&#xe25;&#xe34;&#xe09;&#xe38;&#xe22;&#xe01;&#xe38;&#xe22;&#xe01;&#xe35;&#xe01;&#xe25;&#xe31;&#xe1a;&#xe01;&#xe48;&#xe2d;&#xe40;&#xe2b;&#xe15;&#xe38; &#xe0a;&#xe48;&#xe32;&#xe07;&#xe2d;&#xe32;&#xe40;&#xe1e;&#xe28;&#xe08;&#xe23;&#xe34;&#xe07;&#xe2b;&#xe19;&#xe32;&#xe1f;&#xe49;&#xe32;&#xe23;&#xe49;&#xe2d;&#xe07;&#xe44;&#xe2b;&#xe49;
+ &#xe15;&#xe49;&#xe2d;&#xe07;&#xe23;&#xe1a;&#xe23;&#xe32;&#xe06;&#xe48;&#xe32;&#xe1f;&#xe31;&#xe19;&#xe08;&#xe19;&#xe1a;&#xe23;&#xe23;&#xe25;&#xe31;&#xe22; &#xe24;&#xe45;&#xe2b;&#xe32;&#xe43;&#xe04;&#xe23;&#xe04;&#xe49;&#xe33;&#xe0a;&#xe39;&#xe01;&#xe39;&#xe49;&#xe1a;&#xe23;&#xe23;&#xe25;&#xe31;&#xe07;&#xe01;&#xe4c; &#xe2f;
+
+ (The above is a two-column text. If combining characters are handled
+ correctly, the lines of the second column should be aligned with the
+ | character above.)
+
+Ethiopian:
+
+ Proverbs in the Amharic language:
+
+ &#x1230;&#x121b;&#x12ed; &#x12a0;&#x12ed;&#x1273;&#x1228;&#x1235; &#x1295;&#x1309;&#x1225; &#x12a0;&#x12ed;&#x12a8;&#x1230;&#x1235;&#x1362;
+ &#x1265;&#x120b; &#x12ab;&#x1208;&#x129d; &#x12a5;&#x1295;&#x12f0;&#x12a0;&#x1263;&#x1274; &#x1260;&#x1246;&#x1218;&#x1320;&#x129d;&#x1362;
+ &#x130c;&#x1325; &#x12eb;&#x1208;&#x1264;&#x1271; &#x1241;&#x121d;&#x1325;&#x1293; &#x1290;&#x12cd;&#x1362;
+ &#x12f0;&#x1200; &#x1260;&#x1215;&#x120d;&#x1219; &#x1245;&#x1264; &#x1263;&#x12ed;&#x1320;&#x1323; &#x1295;&#x1323;&#x1275; &#x1260;&#x1308;&#x12f0;&#x1208;&#x12cd;&#x1362;
+ &#x12e8;&#x12a0;&#x134d; &#x12c8;&#x1208;&#x121d;&#x1273; &#x1260;&#x1245;&#x1264; &#x12a0;&#x12ed;&#x1273;&#x123d;&#x121d;&#x1362;
+ &#x12a0;&#x12ed;&#x1325; &#x1260;&#x1260;&#x120b; &#x12f3;&#x12cb; &#x1270;&#x1218;&#x1273;&#x1362;
+ &#x1232;&#x1270;&#x1228;&#x1309;&#x1219; &#x12ed;&#x12f0;&#x1228;&#x130d;&#x1219;&#x1362;
+ &#x1240;&#x1235; &#x1260;&#x1240;&#x1235;&#x1365; &#x12d5;&#x1295;&#x1241;&#x120b;&#x120d; &#x1260;&#x12a5;&#x130d;&#x1229; &#x12ed;&#x1204;&#x12f3;&#x120d;&#x1362;
+ &#x12f5;&#x122d; &#x1262;&#x12eb;&#x1265;&#x122d; &#x12a0;&#x1295;&#x1260;&#x1233; &#x12eb;&#x1235;&#x122d;&#x1362;
+ &#x1230;&#x12cd; &#x12a5;&#x1295;&#x12f0;&#x1264;&#x1271; &#x12a5;&#x1295;&#x1305; &#x12a5;&#x1295;&#x12f0; &#x1309;&#x1228;&#x1264;&#x1271; &#x12a0;&#x12ed;&#x1270;&#x12f3;&#x12f0;&#x122d;&#x121d;&#x1362;
+ &#x12a5;&#x130d;&#x12dc;&#x122d; &#x12e8;&#x12a8;&#x1348;&#x1270;&#x12cd;&#x1295; &#x1309;&#x122e;&#x122e; &#x1233;&#x12ed;&#x12d8;&#x130b;&#x12cd; &#x12a0;&#x12ed;&#x12f5;&#x122d;&#x121d;&#x1362;
+ &#x12e8;&#x130e;&#x1228;&#x1264;&#x1275; &#x120c;&#x1263;&#x1365; &#x1262;&#x12eb;&#x12e9;&#x1275; &#x12ed;&#x1235;&#x1245; &#x1263;&#x12eb;&#x12e9;&#x1275; &#x12eb;&#x1320;&#x120d;&#x1245;&#x1362;
+ &#x1225;&#x122b; &#x12a8;&#x1218;&#x134d;&#x1273;&#x1275; &#x120d;&#x1304;&#x1295; &#x120b;&#x134b;&#x1273;&#x1275;&#x1362;
+ &#x12d3;&#x1263;&#x12ed; &#x121b;&#x12f0;&#x122a;&#x12eb; &#x12e8;&#x1208;&#x12cd;&#x1365; &#x130d;&#x1295;&#x12f5; &#x12ed;&#x12de; &#x12ed;&#x12de;&#x122b;&#x120d;&#x1362;
+ &#x12e8;&#x12a5;&#x1235;&#x120b;&#x121d; &#x12a0;&#x1308;&#x1229; &#x1218;&#x12ab; &#x12e8;&#x12a0;&#x121e;&#x122b; &#x12a0;&#x1308;&#x1229; &#x12cb;&#x122d;&#x12ab;&#x1362;
+ &#x1270;&#x1295;&#x130b;&#x120e; &#x1262;&#x1270;&#x1349; &#x1270;&#x1218;&#x120d;&#x1236; &#x1263;&#x1349;&#x1362;
+ &#x12c8;&#x12f3;&#x1305;&#x1205; &#x121b;&#x122d; &#x1262;&#x1206;&#x1295; &#x1328;&#x122d;&#x1235;&#x1205; &#x12a0;&#x1275;&#x120b;&#x1230;&#x12cd;&#x1362;
+ &#x12a5;&#x130d;&#x122d;&#x1205;&#x1295; &#x1260;&#x134d;&#x122b;&#x123d;&#x1205; &#x120d;&#x12ad; &#x12d8;&#x122d;&#x130b;&#x1362;
+
+Runes:
+
+ &#x16bb;&#x16d6; &#x16b3;&#x16b9;&#x16ab;&#x16a6; &#x16a6;&#x16ab;&#x16cf; &#x16bb;&#x16d6; &#x16d2;&#x16a2;&#x16de;&#x16d6; &#x16a9;&#x16be; &#x16a6;&#x16ab;&#x16d7; &#x16da;&#x16aa;&#x16be;&#x16de;&#x16d6; &#x16be;&#x16a9;&#x16b1;&#x16a6;&#x16b9;&#x16d6;&#x16aa;&#x16b1;&#x16de;&#x16a2;&#x16d7; &#x16b9;&#x16c1;&#x16a6; &#x16a6;&#x16aa; &#x16b9;&#x16d6;&#x16e5;&#x16ab;
+
+ (Old English, which transcribed into Latin reads 'He cwaeth that he
+ bude thaem lande northweardum with tha Westsae.' and means 'He said
+ that he lived in the northern land near the Western Sea.')
+
+Braille:
+
+ &#x284c;&#x2801;&#x2827;&#x2811; &#x283c;&#x2801;&#x2812; &#x284d;&#x281c;&#x2807;&#x2811;&#x2839;&#x2830;&#x280e; &#x2863;&#x2815;&#x280c;
+
+ &#x284d;&#x281c;&#x2807;&#x2811;&#x2839; &#x283a;&#x2801;&#x280e; &#x2819;&#x2811;&#x2801;&#x2819;&#x2812; &#x281e;&#x2815; &#x2803;&#x2811;&#x281b;&#x2814; &#x283a;&#x280a;&#x2839;&#x2832; &#x2879;&#x283b;&#x2811; &#x280a;&#x280e; &#x281d;&#x2815; &#x2819;&#x2833;&#x2803;&#x281e;
+ &#x2831;&#x2801;&#x281e;&#x2811;&#x2827;&#x283b; &#x2801;&#x2803;&#x2833;&#x281e; &#x2839;&#x2801;&#x281e;&#x2832; &#x2879;&#x2811; &#x2817;&#x2811;&#x281b;&#x280a;&#x280c;&#x283b; &#x2815;&#x280b; &#x2819;&#x280a;&#x280e; &#x2803;&#x2825;&#x2817;&#x280a;&#x2801;&#x2807; &#x283a;&#x2801;&#x280e;
+ &#x280e;&#x280a;&#x281b;&#x281d;&#x282b; &#x2803;&#x2839; &#x2839;&#x2811; &#x280a;&#x2807;&#x283b;&#x281b;&#x2839;&#x280d;&#x2801;&#x281d;&#x2802; &#x2839;&#x2811; &#x280a;&#x2807;&#x283b;&#x2805;&#x2802; &#x2839;&#x2811; &#x2825;&#x281d;&#x2819;&#x283b;&#x281e;&#x2801;&#x2805;&#x283b;&#x2802;
+ &#x2801;&#x281d;&#x2819; &#x2839;&#x2811; &#x2821;&#x280a;&#x2811;&#x280b; &#x280d;&#x2833;&#x2817;&#x281d;&#x283b;&#x2832; &#x284e;&#x280a;&#x2817;&#x2815;&#x2815;&#x281b;&#x2811; &#x280e;&#x280a;&#x281b;&#x281d;&#x282b; &#x280a;&#x281e;&#x2832; &#x2841;&#x281d;&#x2819;
+ &#x284e;&#x280a;&#x2817;&#x2815;&#x2815;&#x281b;&#x2811;&#x2830;&#x280e; &#x281d;&#x2801;&#x280d;&#x2811; &#x283a;&#x2801;&#x280e; &#x281b;&#x2815;&#x2815;&#x2819; &#x2825;&#x280f;&#x2815;&#x281d; &#x2830;&#x2861;&#x2801;&#x281d;&#x281b;&#x2811;&#x2802; &#x280b;&#x2815;&#x2817; &#x2801;&#x281d;&#x2839;&#x2839;&#x2814;&#x281b; &#x2819;&#x2811;
+ &#x2821;&#x2815;&#x280e;&#x2811; &#x281e;&#x2815; &#x280f;&#x2825;&#x281e; &#x2819;&#x280a;&#x280e; &#x2819;&#x2801;&#x281d;&#x2819; &#x281e;&#x2815;&#x2832;
+
+ &#x2855;&#x2807;&#x2819; &#x284d;&#x281c;&#x2807;&#x2811;&#x2839; &#x283a;&#x2801;&#x280e; &#x2801;&#x280e; &#x2819;&#x2811;&#x2801;&#x2819; &#x2801;&#x280e; &#x2801; &#x2819;&#x2815;&#x2815;&#x2817;&#x2824;&#x281d;&#x2801;&#x280a;&#x2807;&#x2832;
+
+ &#x284d;&#x2814;&#x2819;&#x2816; &#x284a; &#x2819;&#x2815;&#x281d;&#x2830;&#x281e; &#x280d;&#x2811;&#x2801;&#x281d; &#x281e;&#x2815; &#x280e;&#x2801;&#x2839; &#x2839;&#x2801;&#x281e; &#x284a; &#x2805;&#x281d;&#x282a;&#x2802; &#x2815;&#x280b; &#x280d;&#x2839;
+ &#x282a;&#x281d; &#x2805;&#x281d;&#x282a;&#x2807;&#x282b;&#x281b;&#x2811;&#x2802; &#x2831;&#x2801;&#x281e; &#x2839;&#x283b;&#x2811; &#x280a;&#x280e; &#x280f;&#x281c;&#x281e;&#x280a;&#x280a;&#x2825;&#x2807;&#x281c;&#x2807;&#x2839; &#x2819;&#x2811;&#x2801;&#x2819; &#x2801;&#x2803;&#x2833;&#x281e;
+ &#x2801; &#x2819;&#x2815;&#x2815;&#x2817;&#x2824;&#x281d;&#x2801;&#x280a;&#x2807;&#x2832; &#x284a; &#x280d;&#x280a;&#x2823;&#x281e; &#x2819;&#x2801;&#x2827;&#x2811; &#x2803;&#x2811;&#x2832; &#x2814;&#x280a;&#x2807;&#x2814;&#x282b;&#x2802; &#x280d;&#x2839;&#x280e;&#x2811;&#x2807;&#x280b;&#x2802; &#x281e;&#x2815;
+ &#x2817;&#x2811;&#x281b;&#x281c;&#x2819; &#x2801; &#x280a;&#x2815;&#x280b;&#x280b;&#x2814;&#x2824;&#x281d;&#x2801;&#x280a;&#x2807; &#x2801;&#x280e; &#x2839;&#x2811; &#x2819;&#x2811;&#x2801;&#x2819;&#x2811;&#x280c; &#x280f;&#x280a;&#x2811;&#x280a;&#x2811; &#x2815;&#x280b; &#x280a;&#x2817;&#x2815;&#x281d;&#x280d;&#x2815;&#x281d;&#x281b;&#x283b;&#x2839;
+ &#x2814; &#x2839;&#x2811; &#x281e;&#x2817;&#x2801;&#x2819;&#x2811;&#x2832; &#x2843;&#x2825;&#x281e; &#x2839;&#x2811; &#x283a;&#x280a;&#x280e;&#x2819;&#x2815;&#x280d; &#x2815;&#x280b; &#x2833;&#x2817; &#x2801;&#x281d;&#x280a;&#x2811;&#x280c;&#x2815;&#x2817;&#x280e;
+ &#x280a;&#x280e; &#x2814; &#x2839;&#x2811; &#x280e;&#x280a;&#x280d;&#x280a;&#x2807;&#x2811;&#x2806; &#x2801;&#x281d;&#x2819; &#x280d;&#x2839; &#x2825;&#x281d;&#x2819;&#x2801;&#x2807;&#x2807;&#x282a;&#x282b; &#x2819;&#x2801;&#x281d;&#x2819;&#x280e;
+ &#x2829;&#x2801;&#x2807;&#x2807; &#x281d;&#x2815;&#x281e; &#x2819;&#x280a;&#x280c;&#x2825;&#x2817;&#x2803; &#x280a;&#x281e;&#x2802; &#x2815;&#x2817; &#x2839;&#x2811; &#x284a;&#x2833;&#x281d;&#x281e;&#x2817;&#x2839;&#x2830;&#x280e; &#x2819;&#x2815;&#x281d;&#x2811; &#x280b;&#x2815;&#x2817;&#x2832; &#x2879;&#x2833;
+ &#x283a;&#x280a;&#x2807;&#x2807; &#x2839;&#x283b;&#x2811;&#x280b;&#x2815;&#x2817;&#x2811; &#x280f;&#x283b;&#x280d;&#x280a;&#x281e; &#x280d;&#x2811; &#x281e;&#x2815; &#x2817;&#x2811;&#x280f;&#x2811;&#x2801;&#x281e;&#x2802; &#x2811;&#x280d;&#x280f;&#x2819;&#x2801;&#x281e;&#x280a;&#x280a;&#x2801;&#x2807;&#x2807;&#x2839;&#x2802; &#x2839;&#x2801;&#x281e;
+ &#x284d;&#x281c;&#x2807;&#x2811;&#x2839; &#x283a;&#x2801;&#x280e; &#x2801;&#x280e; &#x2819;&#x2811;&#x2801;&#x2819; &#x2801;&#x280e; &#x2801; &#x2819;&#x2815;&#x2815;&#x2817;&#x2824;&#x281d;&#x2801;&#x280a;&#x2807;&#x2832;
+
+ (The first couple of paragraphs of "A Christmas Carol" by Dickens)
+
+Compact font selection example text:
+
+ ABCDEFGHIJKLMNOPQRSTUVWXYZ /0123456789
+ abcdefghijklmnopqrstuvwxyz &#xa3;&#xa9;&#xb5;&#xc0;&#xc6;&#xd6;&#xde;&#xdf;&#xe9;&#xf6;&#xff;
+ &#x2013;&#x2014;&#x2018;&#x201c;&#x201d;&#x201e;&#x2020;&#x2022;&#x2026;&#x2030;&#x2122;&#x153;&#x160;&#x178;&#x17e;&#x20ac; &#x391;&#x392;&#x393;&#x394;&#x3a9;&#x3b1;&#x3b2;&#x3b3;&#x3b4;&#x3c9; &#x410;&#x411;&#x412;&#x413;&#x414;&#x430;&#x431;&#x432;&#x433;&#x434;
+ &#x2200;&#x2202;&#x2208;&#x211d;&#x2227;&#x222a;&#x2261;&#x221e; &#x2191;&#x2197;&#x21a8;&#x21bb;&#x21e3; &#x2510;&#x253c;&#x2554;&#x2558;&#x2591;&#x25ba;&#x263a;&#x2640; &#xfb01;&#xfffd;&#x2440;&#x2082;&#x1f20;&#x1e02;&#x4e5;&#x1e84;&#x250;&#x2d0;&#x234e;&#x5d0;&#x531;&#x10d0;
+
+Greetings in various languages:
+
+ Hello world, &#x39a;&#x3b1;&#x3bb;&#x3b7;&#x3bc;&#x1f73;&#x3c1;&#x3b1; &#x3ba;&#x1f79;&#x3c3;&#x3bc;&#x3b5;, &#x30b3;&#x30f3;&#x30cb;&#x30c1;&#x30cf;
+
+Box drawing alignment tests: &#x2588;
+ &#x2589;
+ &#x2554;&#x2550;&#x2550;&#x2566;&#x2550;&#x2550;&#x2557; &#x250c;&#x2500;&#x2500;&#x252c;&#x2500;&#x2500;&#x2510; &#x256d;&#x2500;&#x2500;&#x252c;&#x2500;&#x2500;&#x256e; &#x256d;&#x2500;&#x2500;&#x252c;&#x2500;&#x2500;&#x256e; &#x250f;&#x2501;&#x2501;&#x2533;&#x2501;&#x2501;&#x2513; &#x250e;&#x2512;&#x250f;&#x2511; &#x2577; &#x257b; &#x250f;&#x252f;&#x2513; &#x250c;&#x2530;&#x2510; &#x258a; &#x2571;&#x2572;&#x2571;&#x2572;&#x2573;&#x2573;&#x2573;
+ &#x2551;&#x250c;&#x2500;&#x2568;&#x2500;&#x2510;&#x2551; &#x2502;&#x2554;&#x2550;&#x2567;&#x2550;&#x2557;&#x2502; &#x2502;&#x2552;&#x2550;&#x256a;&#x2550;&#x2555;&#x2502; &#x2502;&#x2553;&#x2500;&#x2541;&#x2500;&#x2556;&#x2502; &#x2503;&#x250c;&#x2500;&#x2542;&#x2500;&#x2510;&#x2503; &#x2517;&#x2543;&#x2544;&#x2519; &#x2576;&#x253c;&#x2574;&#x257a;&#x254b;&#x2578;&#x2520;&#x253c;&#x2528; &#x251d;&#x254b;&#x2525; &#x258b; &#x2572;&#x2571;&#x2572;&#x2571;&#x2573;&#x2573;&#x2573;
+ &#x2551;&#x2502;&#x2572; &#x2571;&#x2502;&#x2551; &#x2502;&#x2551; &#x2551;&#x2502; &#x2502;&#x2502; &#x2502; &#x2502;&#x2502; &#x2502;&#x2551; &#x2503; &#x2551;&#x2502; &#x2503;&#x2502; &#x257f; &#x2502;&#x2503; &#x250d;&#x2545;&#x2546;&#x2513; &#x2575; &#x2579; &#x2517;&#x2537;&#x251b; &#x2514;&#x2538;&#x2518; &#x258c; &#x2571;&#x2572;&#x2571;&#x2572;&#x2573;&#x2573;&#x2573;
+ &#x2560;&#x2561; &#x2573; &#x255e;&#x2563; &#x251c;&#x2562; &#x255f;&#x2524; &#x251c;&#x253c;&#x2500;&#x253c;&#x2500;&#x253c;&#x2524; &#x251c;&#x256b;&#x2500;&#x2542;&#x2500;&#x256b;&#x2524; &#x2523;&#x253f;&#x257e;&#x253c;&#x257c;&#x253f;&#x252b; &#x2515;&#x251b;&#x2516;&#x251a; &#x250c;&#x2504;&#x2504;&#x2510; &#x254e; &#x250f;&#x2505;&#x2505;&#x2513; &#x250b; &#x258d; &#x2572;&#x2571;&#x2572;&#x2571;&#x2573;&#x2573;&#x2573;
+ &#x2551;&#x2502;&#x2571; &#x2572;&#x2502;&#x2551; &#x2502;&#x2551; &#x2551;&#x2502; &#x2502;&#x2502; &#x2502; &#x2502;&#x2502; &#x2502;&#x2551; &#x2503; &#x2551;&#x2502; &#x2503;&#x2502; &#x257d; &#x2502;&#x2503; &#x2591;&#x2591;&#x2592;&#x2592;&#x2593;&#x2593;&#x2588;&#x2588; &#x250a; &#x2506; &#x254e; &#x254f; &#x2507; &#x250b; &#x258e;
+ &#x2551;&#x2514;&#x2500;&#x2565;&#x2500;&#x2518;&#x2551; &#x2502;&#x255a;&#x2550;&#x2564;&#x2550;&#x255d;&#x2502; &#x2502;&#x2558;&#x2550;&#x256a;&#x2550;&#x255b;&#x2502; &#x2502;&#x2559;&#x2500;&#x2540;&#x2500;&#x255c;&#x2502; &#x2503;&#x2514;&#x2500;&#x2542;&#x2500;&#x2518;&#x2503; &#x2591;&#x2591;&#x2592;&#x2592;&#x2593;&#x2593;&#x2588;&#x2588; &#x250a; &#x2506; &#x254e; &#x254f; &#x2507; &#x250b; &#x258f;
+ &#x255a;&#x2550;&#x2550;&#x2569;&#x2550;&#x2550;&#x255d; &#x2514;&#x2500;&#x2500;&#x2534;&#x2500;&#x2500;&#x2518; &#x2570;&#x2500;&#x2500;&#x2534;&#x2500;&#x2500;&#x256f; &#x2570;&#x2500;&#x2500;&#x2534;&#x2500;&#x2500;&#x256f; &#x2517;&#x2501;&#x2501;&#x253b;&#x2501;&#x2501;&#x251b; &#x2514;&#x254c;&#x254c;&#x2518; &#x254e; &#x2517;&#x254d;&#x254d;&#x251b; &#x250b; &#x2581;&#x2582;&#x2583;&#x2584;&#x2585;&#x2586;&#x2587;&#x2588;
+
+</pre>
+</BODY>
+</HTML>
diff --git a/userdefs.h b/userdefs.h
new file mode 100644
index 0000000..4e0d3d2
--- /dev/null
+++ b/userdefs.h
@@ -0,0 +1,1882 @@
+/*
+ * $LynxId: userdefs.h,v 1.367 2023/01/03 00:17:33 tom Exp $
+ *
+ * Lynx - Hypertext navigation system
+ *
+ * Copyright 1996-2022,2023 Thomas E. Dickey and Lynx Developers Group
+ * Note: GNU General Public License is not a copyright.
+ *
+ * (c) Copyright 1992, 1993, 1994 University of Kansas
+ * 1995, 1996: GNU General Public License
+ */
+
+/*******************************************************************
+ * There are four sections to this document:
+ * Section 1. Things you MUST verify. Unix platforms use a configure
+ * script to provide sensible default values. If your site
+ * has special requirements, that may not be sufficient.
+ * For non-Unix platforms (e.g., VMS), there is no
+ * configure script, so the defaults here are more
+ * critical.
+ * Section 1a) VMS specific things
+ * Section 1b) non-VMS specific things
+ * Section 1c) ALL Platforms
+ *
+ * Section 2. Things you should probably check!
+ *
+ * Section 3. Things you should only change after you have a good
+ * understanding of the program!
+ *
+ * Section 4. Things you MUST check only if you plan to use Lynx in
+ * an anonymous account (allow public access to Lynx)!
+ *
+ */
+
+#ifndef USERDEFS_H
+#define USERDEFS_H
+
+/*******************************************************************
+ * Insure definition of NOT_ASCII, etc. precedes use below.
+ */
+#ifndef HTUTILS_H
+#include <HTUtils.h>
+#endif
+
+#ifdef HAVE_CONFIG_H
+#include <lynx_cfg.h>
+#endif
+
+/*******************************************************************
+ * Things you must change
+ * Section 1.
+ */
+
+/*******************************************************************
+ * Things you must change - VMS specific
+ * Section 1a).
+ */
+#ifdef VMS
+/**************************
+ * TEMP_SPACE is where Lynx temporary cache files will be placed.
+ * Temporary files are removed automatically as long as nothing
+ * goes terribly wrong :) If you include "$USER" in the definition
+ * (e.g., "device:[dir.$USER]"), Lynx will replace the "$USER" with
+ * the username of the account which invoked the Lynx image. Such
+ * directories should already exist, and have protections/ACLs set
+ * so that only the appropriate user(s) will have read/write access.
+ * On VMS, "sys$scratch:" defaults to "sys$login:" if it has not been
+ * defined externally, or you can use "sys$login:" explicitly here.
+ * If the path has SHELL syntax and includes a tilde (e.g, "~/lynxtmp"),
+ * Lynx will replace the tilde with the full path for the user's home
+ * and convert the result to VMS syntax.
+ * The definition here can be overridden at run time by defining a
+ * "LYNX_TEMP_SPACE" VMS logical.
+ */
+#define TEMP_SPACE "sys$scratch:"
+
+/**************************
+ * LYNX_CFG_FILE is the location and name of the default lynx
+ * global configuration file. It is sought and processed at
+ * startup of Lynx, followed by a seek and processing of a
+ * personal RC file (.lynxrc in the user's HOME directory,
+ * created if the user saves values in the 'o'ptions menu).
+ * You also can define the location and name of the global
+ * configuration file via a VMS logical, "LYNX_CFG", which
+ * will override the "LYNX_CFG_FILE" definition here. SYS$LOGIN:
+ * can be used as the device in either or both definitions if
+ * you want lynx.cfg treated as a personal configuration file.
+ * You also can use Unix syntax with a '~' for a subdirectory
+ * of the login directory, (e.g., ~/lynx/lynx.cfg).
+ * The -cfg command line switch will override these definitions.
+ * You can pass the compilation default via build.com or descrip.mms.
+ *
+ * Note that some implementations of telnet allow passing of
+ * environment variables, which might be used by unscrupulous
+ * people to modify the environment in anonymous accounts. When
+ * making Lynx and Web access publicly available via anonymous
+ * accounts intended to run Lynx captively, be sure the wrapper
+ * uses the -cfg switch and specifies the startfile, rather than
+ * relying on the LYNX_CFG, LYNX_CFG_FILE, or WWW_HOME variables.
+ *
+ * Note that any SUFFIX or VIEWER mappings in the configuration
+ * file will be overridden by any suffix or viewer mappings
+ * that are established as defaults in src/HTInit.c. You can
+ * override the src/HTInit.c defaults via the mime.types and
+ * mailcap files (see the examples in the samples directory).
+ */
+#ifndef LYNX_CFG_FILE
+#define LYNX_CFG_FILE "Lynx_Dir:lynx.cfg"
+#endif /* LYNX_CFG_FILE */
+
+#ifndef LYNX_CFG_PATH
+#define LYNX_CFG_PATH "Lynx_Dir"
+#endif /* LYNX_CFG_PATH */
+
+/**************************
+ * The EXTENSION_MAP file allows you to map file suffixes to
+ * mime types.
+ * The file locations defined here can be overridden in lynx.cfg.
+ * Mappings in these global and personal files override any SUFFIX
+ * definitions in lynx.cfg and built-in defaults from src/HTInit.c.
+ */
+#define GLOBAL_EXTENSION_MAP "Lynx_Dir:mime.types"
+#define PERSONAL_EXTENSION_MAP "mime.types"
+
+/**************************
+ * The MAILCAP file allows you to map file MIME types to
+ * external viewers.
+ * The file locations defined here can be overridden in lynx.cfg.
+ * Mappings in these global and personal files override any VIEWER
+ * definitions in lynx.cfg and built-in defaults from src/HTInit.c.
+ */
+#define GLOBAL_MAILCAP "Lynx_Dir:mailcap"
+#define PERSONAL_MAILCAP ".mailcap"
+
+/**************************
+ * XLOADIMAGE_COMMAND will be used as a default in src/HTInit.c
+ * for viewing image content types when the DECW$DISPLAY logical
+ * is set. Make it the foreign command for your system's X image
+ * viewer (commonly, "xv"). It can be anything that will handle GIF,
+ * TIFF and other popular image formats. Freeware ports of xv for
+ * VMS are available in the ftp://ftp.wku.edu/vms/unsupported and
+ * http://www.openvms.digital.com/cd/XV310A/ subdirectories. You
+ * must also have a "%s" for the filename. The default defined
+ * here can be overridden in lynx.cfg, or via the global or personal
+ * mailcap files.
+ * Make this NULL if you don't have such a viewer or don't want to
+ * use any default viewers for image types.
+ */
+#define XLOADIMAGE_COMMAND "xv %s"
+
+/**************************
+ * SYSTEM_MAIL must be defined here to your mail sending command,
+ * and SYSTEM_MAIL_FLAGS to appropriate qualifiers. They can be
+ * changed in lynx.cfg.
+ *
+ * The mail command will be spawned as a subprocess of lynx
+ * and used to send the email, with headers specified in a
+ * temporary file for PMDF. If you define SYSTEM_MAIL to the
+ * "generic" MAIL utility for VMS, headers cannot be specified
+ * via a header file (and thus may not be included), and the
+ * subject line will be specified by use of the /subject="SUBJECT"
+ * qualifier.
+ *
+ * If your mailer uses another syntax, some hacking of the
+ * mailform(), mailmsg() and reply_by_mail() functions in
+ * LYMail.c, and printfile() function in LYPrint.c, may be
+ * required.
+ */
+#define SYSTEM_MAIL "PMDF SEND"
+#define SYSTEM_MAIL_FLAGS "/headers"
+/* #define SYSTEM_MAIL "MAIL" */
+/* #define SYSTEM_MAIL_FLAGS "" */
+
+/*************************
+ * Below is the argument for an sprintf command that will add
+ * "IN%""ADDRESS""" to the Internet mail address given by the user.
+ * It is structured for PMDF's IN%"INTERNET_ADDRESS" scheme. The %s
+ * is replaced with the address given by the user. If you are using
+ * a different Internet mail transport, change the IN appropriately
+ * (e.g., to SMTP, MX, or WINS), here or in lynx.cfg.
+ */
+#define MAIL_ADRS "\"IN%%\"\"%s\"\"\""
+
+/*********************************
+ * On VMS, CSwing (an XTree emulation for VTxxx terminals) is intended for
+ * use as the Directory/File Manager (sources, objects, or executables are
+ * available from ftp://narnia.memst.edu/). CSWING_PATH should be defined
+ * here or in lynx.cfg to your foreign command for CSwing, with any
+ * regulatory switches you want included. If not defined, or defined as
+ * a zero-length string ("") or "none" (case-insensitive), the support
+ * will be disabled. It will also be disabled if the -nobrowse or
+ * -selective switches are used, or if the file_url restriction is set.
+ *
+ * When enabled, the DIRED_MENU command (normally 'f' or 'F') will invoke
+ * CSwing, normally with the current default directory as an argument to
+ * position the user on that node of the directory tree. However, if the
+ * current document is a local directory listing, or a local file and not
+ * one of the temporary menu or list files, the associated directory will
+ * be passed as an argument, to position the user on that node of the tree.
+ */
+/* #define CSWING_PATH "swing" */
+
+/*********************************
+ * If USE_FIXED_RECORDS is set to TRUE here and/or in lynx.cfg, Lynx will
+ * convert 'd'ownloaded binary files to FIXED 512 record format before saving
+ * them to disk or acting on a DOWNLOADER option. If set to FALSE, the
+ * headers of such files will indicate that they are Stream_LF with Implied
+ * Carriage Control, which is incorrect, and can cause downloading software
+ * to get confused and unhappy. If you do set it FALSE, you can use the
+ * FIXED512.COM command file, which is included in this distribution, to do
+ * the conversion externally.
+ */
+#define USE_FIXED_RECORDS TRUE /* convert binaries to FIXED 512 */
+
+/********************************
+ * If NO_ANONYMOUS_EMAIL is defined, Lynx will not offer to insert X-From
+ * and X_Personal_Name lines in the body of email messages. On VMS, the
+ * actual From and Personal Name (if defined for the account) headers always
+ * are those of the account running the Lynx image. If the account is not
+ * the one to which the recipient should reply, you can indicate the alternate
+ * address and personal name via the X-From and X_Personal_Name entries, but
+ * the recipient must explicitly send the reply to the X_From address, rather
+ * than using the VMS REPLY command (which will use the actual From address).
+ *
+ * This symbol constant might be defined on Unix for security reasons that
+ * don't apply on VMS. There is no security reason for defining this on VMS,
+ * but if you have no anonymous accounts (i.e., the From always will point to
+ * the actual user's email address, you can define it to avoid the bother of
+ * X-From and X_Personal_Name offers.
+ */
+/*#define NO_ANONYMOUS_EMAIL TRUE */
+
+/**************************
+ * LYNX_LSS_FILE is the location and name of the default lynx
+ * character style sheet file. It is sought and processed at
+ * startup of Lynx only if experimental character style code has
+ * been compiled in, otherwise it will be ignored. Note that use
+ * of the character style option is _experimental_ AND _unsupported_.
+ * There is no documentation other than a sample lynx.lss file in
+ * the samples subdirectory. This code probably won't even work on
+ * VMS. You can define the location and name of this file via an
+ * environment variable, "lynx_lss", which will override the definition
+ * here. You can use '~' to refer to the user's home directory. The
+ * -lss command line switch will override these definitions.
+ */
+#ifndef LYNX_LSS_FILE
+#define LYNX_LSS_FILE "Lynx_Dir:lynx.lss"
+#endif /* LYNX_LSS_FILE */
+
+/*
+ * FTP_FORMAT uses the same codes as LIST_FORMAT, but applies to files shown
+ * in an ftp listing.
+ */
+#define FTP_FORMAT "%d %-16.16t %a %K"
+
+/*******************************************************************
+ * Things you must change - non-VMS specific
+ * Section 1b).
+ */
+#else /* non-VMS: UNIX etc. */
+
+/**************************
+ * NOTE: This variable is set by the configure script; editing changes will
+ * be ignored.
+ *
+ * LYNX_CFG_FILE is the location and name of the default lynx
+ * global configuration file. It is sought and processed at
+ * startup of Lynx, followed by a seek and processing of a
+ * personal RC file (.lynxrc in the user's HOME directory,
+ * created if the user saves values in the 'o'ptions menu).
+ * You also can define the location and name of the global
+ * configuration file via an environment variable, "LYNX_CFG",
+ * which will override the "LYNX_CFG_FILE" definition here.
+ * You can use '~' in either or both definitions if you want
+ * lynx.cfg treated as a personal configuration file. The
+ * -cfg command line switch will override these definitions.
+ * You can pass the compilation default via the Makefile.
+ *
+ * If you are building Lynx using the configure script, you should specify
+ * the default location of the configuration file via that script, since it
+ * also generates the makefile and install-cfg rules.
+ *
+ * Note that many implementations of telnetd allow passing of
+ * environment variables, which might be used by unscrupulous
+ * people to modify the environment in anonymous accounts. When
+ * making Lynx and Web access publicly available via anonymous
+ * accounts intended to run Lynx captively, be sure the wrapper
+ * uses the -cfg switch and specifies the startfile, rather than
+ * relying on the LYNX_CFG, LYNX_CFG_FILE, or WWW_HOME variables.
+ *
+ * Note that any SUFFIX or VIEWER mappings in the configuration
+ * file will be overridden by any suffix or viewer mappings
+ * that are established as defaults in src/HTInit.c. You can
+ * override the src/HTInit.c defaults via the mime.types and
+ * mailcap files (see the examples in the samples directory).
+ */
+#ifndef HAVE_CONFIG_H
+#ifndef LYNX_CFG_FILE
+#ifdef DOSPATH
+#define LYNX_CFG_PATH "."
+#define LYNX_CFG_FILE "./lynx.cfg"
+#else
+#define LYNX_CFG_PATH "/usr/local/lib"
+#define LYNX_CFG_FILE "/usr/local/lib/lynx.cfg"
+#endif /* DOSPATH */
+#endif /* LYNX_CFG_FILE */
+#endif /* HAVE_CONFIG_H */
+
+#ifndef MIME_LIBDIR
+#define MIME_LIBDIR "/etc/"
+#endif
+
+/**************************
+ * The EXTENSION_MAP file allows you to map file suffixes to
+ * mime types.
+ * The file locations defined here can be overridden in lynx.cfg.
+ * Mappings in these global and personal files override any SUFFIX
+ * definitions in lynx.cfg and built-in defaults from src/HTInit.c.
+ */
+#define GLOBAL_EXTENSION_MAP MIME_LIBDIR "mime.types"
+#define PERSONAL_EXTENSION_MAP "~/.mime.types"
+
+/**************************
+ * The MAILCAP file allows you to map file MIME types to
+ * external viewers.
+ * The file locations defined here can be overridden in lynx.cfg.
+ * Mappings in these global and personal files override any VIEWER
+ * definitions in lynx.cfg and built-in defaults from src/HTInit.c.
+ */
+#define GLOBAL_MAILCAP MIME_LIBDIR "mailcap"
+#define PERSONAL_MAILCAP "~/.mailcap"
+
+/**************************
+ * XLOADIMAGE_COMMAND will be used as a default in src/HTInit.c for
+ * viewing image content types when the DISPLAY environment variable
+ * is set. Make it the full path and name of the xli (also known as
+ * xloadimage or xview) command, or other image viewer. It can be
+ * anything that will handle GIF, TIFF and other popular image formats
+ * (xli does). The freeware distribution of xli is available in the
+ * ftp://ftp.x.org/contrib/ subdirectory. The shareware, xv, also is
+ * suitable. You must also have a "%s" for the filename; "&" for
+ * background is optional. The default defined here can be overridden
+ * in lynx.cfg, or via the global or personal mailcap files.
+ * Make this NULL if you don't have such a viewer or don't want to
+ * use any default viewers for image types. Note that open is used as
+ * the default for NeXT, instead of the XLOADIMAGE_COMMAND definition.
+ */
+#define XLOADIMAGE_COMMAND "xli %s &"
+
+/**************************
+ * For UNIX systems, SYSTEM_MAIL and SYSTEM_MAIL_FLAGS are set by the
+ * configure-script.
+ */
+
+/**************************
+ * A place to put temporary files, it is almost always in "/tmp/"
+ * for UNIX systems. If you include "$USER" in the definition
+ * (e.g., "/tmp/$USER"), Lynx will replace the "$USER" with the
+ * username of the account which invoked the Lynx image. Such
+ * directories should already exist, and have protections/ACLs set
+ * so that only the appropriate user(s) will have read/write access.
+ * If the path includes a tilde (e.g, "~" or "~/lynxtmp"), Lynx will
+ * replace the tilde with the full path for the user's home.
+ * The definition here can be overridden at run time by setting a
+ * "LYNX_TEMP_SPACE" environment variable, or (if that is not set)
+ * the "TMPDIR" (unix), or "TEMP" or "TMP" (Windows,DOS,OS/2)
+ * variable.
+ */
+#define TEMP_SPACE "/tmp/"
+
+/********************************
+ * Comment this line out to disable code that implements command logging
+ * and scripting.
+ */
+#define USE_CMD_LOGGING 1
+
+/********************************
+ * Comment this line out to disable code that randomizes the names given to
+ * temporary files.
+ */
+#define USE_RAND_TEMPNAME 1
+
+/********************************
+ * Comment this line out to let the user enter his/her email address
+ * when sending a message. There should be no need to do this unless
+ * your mailer agent does not put in the From: field for you. (If your
+ * mailer agent does not automatically put in the From: field, you should
+ * upgrade, because anonymous mail makes it far too easy for a user to
+ * spoof someone else's email address.)
+ */
+/*#define NO_ANONYMOUS_EMAIL TRUE */
+
+/********************************
+ * LIST_FORMAT defines the display for local files when LONG_LIST
+ * is defined in the Makefile. The default set here can be changed
+ * in lynx.cfg.
+ *
+ * The percent items in the list are interpreted as follows:
+ *
+ * %p Unix-style permission bits
+ * %l link count
+ * %o owner of file
+ * %g group of file
+ * %d date of last modification
+ * %a anchor pointing to file or directory
+ * %A as above but don't show symbolic links
+ * %t type of file (description derived from MIME type)
+ * %T MIME type as known by Lynx (from mime.types or default)
+ * %k size of file in Kilobytes
+ * %K as above but omit size for directories
+ * %s size of file in bytes
+ *
+ * Anything between the percent and the letter is passed on to sprintf.
+ * A double percent yields a literal percent on output. Other characters
+ * are passed through literally.
+ *
+ * If you want only the filename: " %a"
+ *
+ * If you want a brief output: " %4K %-12.12d %a"
+ *
+ * For the Unix "ls -l" format: " %p %4l %-8.8o %-8.8g %7s %-12.12d %a"
+ */
+#ifdef DOSPATH
+#define LIST_FORMAT " %4K %-12.12d %a"
+#else
+#define LIST_FORMAT " %p %4l %-8.8o %-8.8g %7s %-12.12d %a"
+#endif
+
+/*
+ * FTP_FORMAT uses the same codes as LIST_FORMAT, but applies to files shown
+ * in an ftp listing.
+ */
+#define FTP_FORMAT "%d %-16.16t %a %K"
+
+/*
+ * If NO_FORCED_CORE_DUMP is set to TRUE, Lynx will not force
+ * core dumps via abort() calls on fatal errors or assert()
+ * calls to check potentially fatal errors. The default defined
+ * here can be changed in lynx.cfg, and the compilation or
+ * configuration default can be toggled via the -core command
+ * line switch.
+ */
+#define NO_FORCED_CORE_DUMP FALSE
+
+/**************************
+ * LYNX_LSS_FILE is the location and name of the default lynx
+ * character style sheet file. It is sought and processed at
+ * startup of Lynx only if experimental character style code
+ * has been compiled in, otherwise it will be ignored. Note
+ * that use of the character style option is _experimental_ AND
+ * _unsupported_. There is no documentation other than a sample
+ * lynx.lss file in the samples subdirectory. You also can
+ * define the location and name of this file via environment
+ * variables "LYNX_LSS" or "lynx_lss" which will override the
+ * "LYNX_LSS_FILE" definition here. You can use '~' in either or
+ * both definitions to refer to the user's home directory. The
+ * -lss command line switch will override these definitions.
+ */
+#ifndef LYNX_LSS_FILE
+#ifdef DOSPATH
+#define LYNX_LSS_FILE "lynx.lss"
+#else
+#define LYNX_LSS_FILE "/usr/local/lib/lynx.lss"
+#endif
+#endif /* LYNX_LSS_FILE */
+
+#endif /* VMS OR UNIX */
+
+/*************************************************************
+ * Section 1c) Every platform must change or verify these
+ *
+ */
+
+/*****************************
+ * STARTFILE is the default starting URL if none is specified
+ * on the command line or via a WWW_HOME environment variable;
+ * Lynx will refuse to start without a starting URL of some kind.
+ * STARTFILE can be remote, e.g., http://www.w3.org/default.html ,
+ * or local, e.g., file://localhost/PATH_TO/FILENAME ,
+ * where PATH_TO is replaced with the complete path to FILENAME
+ * using Unix shell syntax and including the device on VMS.
+ *
+ * Normally we expect you will connect to a remote site, e.g., the Lynx starting
+ * site:
+ */
+#ifndef HOMEPAGE_URL
+#define HOMEPAGE_URL "https://lynx.invisible-island.net/"
+#endif
+#define STARTFILE HOMEPAGE_URL
+/*
+ * As an alternative, you may want to use a local URL. A good choice for this
+ * is the user's home directory:
+ *#define STARTFILE "file://localhost/~/"
+ *
+ * Your choice of STARTFILE should reflect your site's needs, and be a URL that
+ * you can connect to reliably. Otherwise users will become confused and think
+ * that they cannot run Lynx.
+ */
+
+/*****************************
+ * HELPFILE must be defined as a URL and must have a
+ * complete path if local:
+ * file://localhost/PATH_TO/lynx_help/lynx_help_main.html
+ * Replace PATH_TO with the path to the lynx_help subdirectory
+ * for this distribution (use SHELL syntax including the device
+ * on VMS systems).
+ * The default HELPFILE is:
+ * https://lynx.invisible-island.net/lynx_help/lynx_help_main.html
+ * This should be changed here or in lynx.cfg to the local path.
+ * The definition here can be overridden at run time by defining a
+ * "LYNX_HELPFILE" environment variable.
+ */
+#define HELPFILE "https://lynx.invisible-island.net/lynx_help/lynx_help_main.html"
+/* #define HELPFILE "file://localhost/PATH_TO/lynx_help/lynx_help_main.html" */
+
+/*****************************
+ * DEFAULT_INDEX_FILE is the default file retrieved when the
+ * user presses the 'I' key when viewing any document.
+ * An index to your CWIS can be placed here or a document containing
+ * pointers to lots of interesting places on the web.
+ */
+#define DEFAULT_INDEX_FILE "http://scout.wisc.edu/"
+
+/*****************************
+ * If USE_TRACE_LOG is set FALSE, then when TRACE mode is invoked the
+ * syserr messages will not be directed to a log file named Lynx.trace
+ * in the account's HOME directory. The default defined here can be
+ * toggled via the -tlog command line switch. Also, it is set FALSE
+ * automatically when Lynx is executed in an anonymous or validation
+ * account (if indicated via the -anonymous or -validate command line
+ * switches, or via the check for the ANONYMOUS_USER, defined below).
+ * When FALSE, the TRACE_LOG command (normally ';') cannot be used to
+ * examine the Lynx Trace Log during the current session. If left
+ * TRUE, but you wish to use command line piping of stderr to a file
+ * you specify, include the -tlog toggle on the command line. Note
+ * that once TRACE mode is turned on during a session and stderr is
+ * directed to the log, all stderr messages will continue going to
+ * the log, even if TRACE mode is turned off via the TOGGLE_TRACE
+ * (Control-T) command.
+ */
+#define USE_TRACE_LOG TRUE
+
+/*******************************
+ * If GOTOBUFFER is set to TRUE here or in lynx.cfg the last entered
+ * goto URL, if any, will be offered as a default for reuse or editing
+ * when the 'g'oto command is entered. All previously used goto URLs
+ * can be accessed for reuse or editing via a circular buffer invoked
+ * with the Up-Arrow or Down-Arrow keys after entering the 'g'oto
+ * command, whether or not a default is offered.
+ */
+#define GOTOBUFFER FALSE
+
+/*****************************
+ * If FTP_PASSIVE is set to TRUE here or in lynx.cfg, ftp transfers will
+ * be done in passive mode.
+ * Note: if passive transfers fail, lynx falls back to active mode, and
+ * vice versa if active transfers fail at first.
+ */
+#define FTP_PASSIVE TRUE
+
+/*****************************
+ * JUMPFILE is the default local file checked for shortcut URLs when
+ * the user presses the 'J' (JUMP) key. The user will be prompted for
+ * a shortcut entry (analogously to 'g'oto), and can enter one
+ * or use '?' for a list of the shortcuts with associated links to
+ * their actual URLs. See the sample jumps files in the samples
+ * subdirectory. Make sure your jumps file includes a '?' shortcut
+ * for a file://localhost URL to itself:
+ *
+ * <dt>?<dd><a href="file://localhost/path/jumps.html">This Shortcut List</a>
+ *
+ * If not defined here or in lynx.cfg, the JUMP command will invoke
+ * the NO_JUMPFILE status line message (see LYMessages_en.h). The prompt
+ * associated with the default jumps file is defined as JUMP_PROMPT in
+ * LYMessages_en.h and can be modified in lynx.cfg. Additional, alternate
+ * jumps files can be defined and mapped to keystrokes, and alternate
+ * prompts can be set for them, in lynx.cfg, but at least one default
+ * jumps file and associated prompt should be established before adding
+ * others.
+ *
+ * On VMS, use Unix SHELL syntax (including a lead slash) to define it.
+ *
+ * Do not include "file://localhost" in the definition.
+ */
+/* #define JUMPFILE "/Lynx_Dir/jumps.html" */
+
+/*******************************
+ * If JUMPBUFFER is set to TRUE here or in lynx.cfg the last entered
+ * jump shortcut, if any, will be offered as a default for reuse or
+ * editing when the JUMP command is entered. All previously used
+ * shortcuts can be accessed for reuse or editing via a circular buffer
+ * invoked with the Up-Arrow or Down-Arrow keys after entering the JUMP
+ * command, whether or not a default is offered. If you have multiple
+ * jumps files and corresponding key mappings, each will have its own
+ * circular buffer.
+ */
+#define JUMPBUFFER FALSE
+
+/********************************
+ * If PERMIT_GOTO_FROM_JUMP is defined, then a : or / in a jump target
+ * will be treated as a full or partial URL (to be resolved versus the
+ * startfile), and will be handled analogously to a 'g'oto command.
+ * Such "random URLs" will be entered in the circular buffer for goto
+ * URLs, not the buffer for jump targets (shortcuts). If the target
+ * is the single character ':', it will be treated equivalently to an
+ * Up-Arrow or Down-Arrow following a 'g'oto command, for accessing the
+ * circular buffer of goto URLs.
+ */
+/* #define PERMIT_GOTO_FROM_JUMP */
+
+/*****************************
+ * If LYNX_HOST_NAME is defined here and/or in lynx.cfg, it will be
+ * treated as an alias for the local host name in checks for URLs on
+ * the local host (e.g., when the -localhost switch is set), and this
+ * host name, "localhost", and HTHostName (the fully qualified domain
+ * name of the system on which Lynx is running) will all be passed as
+ * local. A different definition in lynx.cfg will override this one.
+ */
+/* #define LYNX_HOST_NAME "localhost" */
+
+/*********************
+ * LOCAL_DOMAIN is used for a tail match with the ut_host element of
+ * the utmp or utmpx structure on systems with utmp capabilities, to
+ * determine if a user is local to your campus or organization when
+ * handling -restrictions=inside_foo or outside_foo settings for ftp,
+ * news, telnet/tn3270 and rlogin URLs. An "inside" user is assumed
+ * if your system does not have utmp capabilities. CHANGE THIS here
+ * or in lynx.cfg.
+ */
+#define LOCAL_DOMAIN "localdomain"
+
+/********************************
+* The DEFAULT_CACHE_SIZE specifies the number of WWW documents to be
+* cached in memory at one time.
+*
+* This so-called cache size (actually, number) may be modified in lynx.cfg
+* and or with the command line argument -cache=NUMBER The minimum allowed
+* value is 2, for the current document and at least one to fetch, and there
+* is no absolute maximum number of cached documents. On Unix, and VMS not
+* compiled with VAXC, whenever the number is exceeded the least recently
+* displayed document will be removed from memory.
+*
+* On VMS compiled with VAXC, the DEFAULT_VIRTUAL_MEMORY_SIZE specifies the
+* amount (bytes) of virtual memory that can be allocated and not yet be freed
+* before previous documents are removed from memory. If the values for both
+* the DEFAULT_CACHE_SIZE and DEFAULT_VIRTUAL_MEMORY_SIZE are exceeded, then
+* least recently displayed documents will be freed until one or the other
+* value is no longer exceeded. The value can be modified in lynx.cfg.
+*
+* The Unix and VMS but not VAXC implementations use the C library malloc's
+* and calloc's for memory allocation, and procedures for taking the actual
+* amount of cache into account still need to be developed. They use only
+* the DEFAULT_CACHE_SIZE value, and that specifies the absolute maximum
+* number of documents to cache (rather than the maximum number only if
+* DEFAULT_VIRTUAL_MEMORY_SIZE has been exceeded, as with VAXC/VAX).
+*/
+#define DEFAULT_CACHE_SIZE 10
+
+#if defined(VMS) && defined(VAXC) && !defined(__DECC)
+#define DEFAULT_VIRTUAL_MEMORY_SIZE 512000
+#endif /* VMS && VAXC && !__DECC */
+
+/********************************
+ * If ALWAYS_RESUBMIT_POSTS is set TRUE, Lynx always will resubmit forms
+ * with method POST, dumping any cache from a previous submission of the
+ * form, including when the document returned by that form is sought with
+ * the PREV_DOC command or via the history list. Lynx always resubmits
+ * forms with method POST when a submit button or a submitting text input
+ * is activated, but normally retrieves the previously returned document
+ * if it had links which you activated, and then go back with the PREV_DOC
+ * command or via the history list.
+ *
+ * The default defined here can be changed in lynx.cfg, and can be toggled
+ * via the -resubmit_posts command line switch.
+ */
+#define ALWAYS_RESUBMIT_POSTS FALSE
+
+/********************************
+ * CHARACTER_SET defines the default character set, i.e., that assumed
+ * to be installed on the user's terminal. It determines which characters
+ * or strings will be used to represent 8-bit character entities within
+ * HTML. New character sets may be defined as explained in the README
+ * files of the src/chrtrans directory in the Lynx source code distribution.
+ * For Asian (CJK) character sets, it also determines how Kanji code will
+ * be handled. The default defined here can be changed in lynx.cfg, and
+ * via the 'o'ptions menu. The 'o'ptions menu setting will be stored in
+ * the user's RC file whenever those settings are saved, and thereafter
+ * will be used as the default. Also see lynx.cfg for information about
+ * the -raw switch and LYK_RAW_TOGGLE command.
+ *
+ * Since Lynx now supports a wide range of platforms it may be useful
+ * to note that cpXXX codepages used by IBM PC compatible computers,
+ * and windows-xxxx used by native MS-Windows apps.
+ *
+ * Recognized character sets include:
+ *
+ * string for 'O'ptions Menu MIME name
+ * =========================== =========
+ * 7 bit approximations (US-ASCII) us-ascii
+ * Western (ISO-8859-1) iso-8859-1
+ * Western (cp850) cp850
+ * Western (windows-1252) windows-1252
+ * IBM PC US codepage (cp437) cp437
+ * DEC Multinational dec-mcs
+ * Macintosh (8 bit) macintosh
+ * NeXT character set next
+ * HP Roman8 hp-roman8
+ * Chinese euc-cn
+ * Japanese (EUC-JP) euc-jp
+ * Japanese (Shift_JIS) shift_jis
+ * Korean euc-kr
+ * Taipei (Big5) big5
+ * Vietnamese (VISCII) viscii
+ * Eastern European (ISO-8859-2) iso-8859-2
+ * Eastern European (cp852) cp852
+ * Eastern European (windows-1250) windows-1250
+ * Latin 3 (ISO-8859-3) iso-8859-3
+ * Latin 4 (ISO-8859-4) iso-8859-4
+ * Baltic Rim (cp775) cp775
+ * Baltic Rim (windows-1257) windows-1257
+ * Cyrillic (ISO-8859-5) iso-8859-5
+ * Cyrillic (cp866) cp866
+ * Cyrillic (windows-1251) windows-1251
+ * Cyrillic (KOI8-R) koi8-r
+ * Arabic (ISO-8859-6) iso-8859-6
+ * Arabic (cp864) cp864
+ * Arabic (windows-1256) windows-1256
+ * Greek (ISO-8859-7) iso-8859-7
+ * Greek (cp737) cp737
+ * Greek2 (cp869) cp869
+ * Greek (windows-1253) windows-1253
+ * Hebrew (ISO-8859-8) iso-8859-8
+ * Hebrew (cp862) cp862
+ * Hebrew (windows-1255) windows-1255
+ * Turkish (ISO-8859-9) iso-8859-9
+ * ISO-8859-10 iso-8859-10
+ * Ukrainian Cyrillic (cp866u) cp866u
+ * Ukrainian Cyrillic (KOI8-U) koi8-u
+ * UNICODE (UTF-8) utf-8
+ * RFC 1345 w/o Intro mnemonic+ascii+0
+ * RFC 1345 Mnemonic mnemonic
+ * Transparent x-transparent
+ */
+#define CHARACTER_SET "iso-8859-1"
+
+/*****************************
+ * PREFERRED_LANGUAGE is the language in MIME notation (e.g., "en",
+ * "fr") which will be indicated by Lynx in its Accept-Language headers
+ * as the preferred language. If available, the document will be
+ * transmitted in that language. This definition can be overridden via
+ * lynx.cfg. Users also can change it via the 'o'ptions menu and save
+ * that preference in their RC file. This may be a comma-separated list
+ * of languages in decreasing preference.
+ */
+#define PREFERRED_LANGUAGE "en"
+
+/*****************************
+ * PREFERRED_CHARSET specifies the character set in MIME notation (e.g.,
+ * "ISO-8859-2", "ISO-8859-5") which Lynx will indicate you prefer in
+ * requests to http servers using an Accept-Charsets header.
+ * This definition can be overridden via lynx.cfg. Users also can change it
+ * via the 'o'ptions menu and save that preference in their RC file.
+ * The value should NOT include "ISO-8859-1" or "US-ASCII", since those
+ * values are always assumed by default.
+ * If a file in that character set is available, the server will send it.
+ * If no Accept-Charset header is present, the default is that any
+ * character set is acceptable. If an Accept-Charset header is present,
+ * and if the server cannot send a response which is acceptable
+ * according to the Accept-Charset header, then the server SHOULD send
+ * an error response with the 406 (not acceptable) status code, though
+ * the sending of an unacceptable response is also allowed. (RFC2068)
+ */
+#define PREFERRED_CHARSET ""
+
+/*****************************
+* If MULTI_BOOKMARK_SUPPORT is set to MBM_STANDARD or MBM_ADVANCED, and
+* BLOCK_MULTI_BOOKMARKS (see below) is FALSE, and sub-bookmarks exist, all
+* bookmark operations will first prompt the user to select an active
+* sub-bookmark file or the default bookmark file. MBM_OFF is the default so
+* that one (the default) bookmark file will be available initially. The
+* default set here can be overridden in lynx.cfg. The user can turn on
+* multiple bookmark support via the 'o'ptions menu, and can save that choice as
+* the startup default via the .lynxrc file. When on, the setting can be
+* STANDARD or ADVANCED. If support is set to the latter, and the user mode
+* also is ADVANCED, the VIEW_BOOKMARK command will invoke a status line prompt
+* at which the user can enter the letter token (A - Z) of the desired bookmark,
+* or '=' to get a menu of available bookmark files. The menu always is
+* presented in NOVICE or INTERMEDIATE mode, or if the support is set to
+* STANDARD. No prompting or menu display occurs if only one (the startup
+* default) bookmark file has been defined (define additional ones via the
+* 'o'ptions menu). The startup default, however set, can be overridden on the
+* command line via the -restrictions=multibook or the -anonymous or -validate
+* switches.
+*/
+#ifndef MULTI_BOOKMARK_SUPPORT
+#define MULTI_BOOKMARK_SUPPORT MBM_OFF
+#endif /* MULTI_BOOKMARK_SUPPORT */
+
+/*****************************
+* If BLOCK_MULTI_BOOKMARKS is set TRUE, multiple bookmark support will
+* be forced off, and cannot be toggled on via the 'o'ptions menu. This
+* compilation setting can be overridden via lynx.cfg.
+*/
+#ifndef BLOCK_MULTI_BOOKMARKS
+#define BLOCK_MULTI_BOOKMARKS FALSE
+#endif /* BLOCK_MULTI_BOOKMARKS */
+
+/********************************
+ * URL_DOMAIN_PREFIXES and URL_DOMAIN_SUFFIXES are strings which will be
+ * prepended (together with a scheme://) and appended to the first element
+ * of command line or 'g'oto arguments which are not complete URLs and
+ * cannot be opened as a local file (file://localhost/string). Both
+ * can be comma-separated lists. Each prefix must end with a dot, each
+ * suffix must begin with a dot, and either may contain other dots (e.g.,
+ * .co.jp). The default lists are defined here, and can be changed
+ * in lynx.cfg. Each prefix will be used with each suffix, in order,
+ * until a valid Internet host is created, based on a successful DNS
+ * lookup (e.g., foo will be tested as www.foo.com and then www.foo.edu
+ * etc.). The first element can include a :port and/or /path which will
+ * be restored with the expanded host (e.g., wfbr:8002/dir/lynx will
+ * become http://www.wfbr.edu:8002/dir/lynx). The prefixes will not be
+ * used if the first element ends in a dot (or has a dot before the
+ * :port or /path), and similarly the suffixes will not be used if the
+ * the first element begins with a dot (e.g., .nyu.edu will become
+ * http://www.nyu.edu without testing www.nyu.com). Lynx will try to
+ * guess the scheme based on the first field of the expanded host name,
+ * and use "http://" as the default (e.g., gopher.wfbr.edu or gopher.wfbr.
+ * will be made gopher://gopher.wfbr.edu).
+ */
+#define URL_DOMAIN_PREFIXES "www."
+#define URL_DOMAIN_SUFFIXES ".com,.edu,.net,.org"
+
+/********************************
+ * If LIST_NEWS_NUMBERS is set TRUE, Lynx will use an ordered list
+ * and include the numbers of articles in news listings, instead of
+ * using an unordered list.
+ *
+ * The default defined here can be changed in lynx.cfg.
+ */
+#define LIST_NEWS_NUMBERS FALSE
+
+/********************************
+ * If LIST_NEWS_DATES is set TRUE, Lynx will include the dates of
+ * articles in news listings. The dates always are included in the
+ * articles, themselves.
+ *
+ * The default defined here can be changed in lynx.cfg.
+ */
+#define LIST_NEWS_DATES FALSE
+
+/*************************
+ * Set NEWS_POSTING to FALSE if you do not want to support posting to
+ * news groups via Lynx. If left TRUE, Lynx will use its news gateway to
+ * post new messages or followups to news groups, using the URL schemes
+ * described in the "Supported URL" section of the online 'h'elp. The
+ * posts will be attempted via the nntp server specified in the URL, or
+ * if none was specified, via the NNTPSERVER configuration or environment
+ * variable. Links with these URLs for posting or sending followups are
+ * created by the news gateway when reading group listings or articles
+ * from nntp servers if the server indicates that it permits posting.
+ * The setting here can be changed in lynx.cfg.
+ */
+#define NEWS_POSTING TRUE
+
+/*************************
+ * Define LYNX_SIG_FILE to the name of a file containing a signature which
+ * can be appended to email messages and news postings or followups. The
+ * user will be prompted whether to append it. It is sought in the home
+ * directory. If it is in a subdirectory, begin it with a dot-slash
+ * (e.g., ./lynx/.lynxsig). The definition here can be changed in lynx.cfg.
+ */
+#define LYNX_SIG_FILE ".lynxsig"
+
+/********************************
+ * BIBP_GLOBAL_SERVER is the default global server for bibp: links, used
+ * when a local bibhost or document-specified citehost is unavailable.
+ */
+#define BIBP_GLOBAL_SERVER "http://usin.org/"
+
+/********************************
+ * If USE_SELECT_POPUPS is set FALSE, Lynx will present a vertical list
+ * of radio buttons for the OPTIONs in SELECT blocks which lack the
+ * MULTIPLE attribute, instead of using a popup menu. Note that if
+ * the MULTIPLE attribute is present in the SELECT start tag, Lynx
+ * always will create a vertical list of checkboxes for the OPTIONs.
+ *
+ * The default defined here can be changed in lynx.cfg. It can be
+ * set and saved via the 'o'ptions menu to override the compilation
+ * and configuration defaults, and the default always can be toggled
+ * via the -popup command line switch.
+ */
+#define USE_SELECT_POPUPS TRUE
+
+/********************************
+ * If COLLAPSE_BR_TAGS is set FALSE, Lynx will not collapse serial
+ * BR tags. If set TRUE, two or more concurrent BRs will be collapsed
+ * into a single blank line. Note that the valid way to insert extra
+ * blank lines in HTML is via a PRE block with only newlines in the
+ * block.
+ *
+ * The default defined here can be changed in lynx.cfg.
+ */
+#define COLLAPSE_BR_TAGS TRUE
+
+/********************************
+ * If SET_COOKIES is set FALSE, Lynx will ignore Set-Cookie headers
+ * in http server replies.
+ *
+ * The default defined here can be changed in lynx.cfg, and can be toggled
+ * via the -cookies command line switch.
+ */
+#define SET_COOKIES TRUE
+
+/********************************
+ * If SEND_USERAGENT is set FALSE, Lynx will not send a user-agent string.
+ * You can override this in the 'O'ptions menu.
+ */
+#define SEND_USERAGENT TRUE
+
+/*******************************
+ * If ACCEPT_ALL_COOKIES is set TRUE, and SET_COOKIES is TRUE, Lynx will
+ * accept all cookies.
+ *
+ * The default defined here can be changed in lynx.cfg, and .lynxrc, or
+ * toggled via the -accept_all_cookies command line switch.
+ */
+#define ACCEPT_ALL_COOKIES FALSE
+
+/****************************************************************
+ * Section 2. Things that you probably want to change or review
+ *
+ */
+
+/*****************************
+ * The following three definitions set the number of seconds for
+ * pauses following status line messages that would otherwise be
+ * replaced immediately, and are more important than the unpaused
+ * progress messages. Those set by INFOSECS are also basically
+ * progress messages (e.g., that a prompted input has been canceled)
+ * and should have the shortest pause. Those set by MESSAGESECS are
+ * informational (e.g., that a function is disabled) and should have
+ * a pause of intermediate duration. Those set by ALERTSECS typically
+ * report a serious problem and should be paused long enough to read
+ * whenever they appear (typically unexpectedly). The default values
+ * defined here can be modified via lynx.cfg, should longer pauses be
+ * desired for braille-based access to Lynx.
+ */
+#define INFOSECS 1
+#define MESSAGESECS 2
+#define ALERTSECS 3
+
+#define DEBUGSECS 0
+#define REPLAYSECS 0
+
+/******************************
+ * SHOW_COLOR controls whether the program displays in color by default.
+ */
+#ifdef COLOR_CURSES
+#define SHOW_COLOR TRUE
+#else
+#define SHOW_COLOR FALSE
+#endif
+
+/******************************
+ * SHOW_CURSOR controls whether or not the cursor is hidden or appears
+ * over the current link, or current option in select popup windows.
+ * Showing the cursor is handy if you are a sighted user with a poor
+ * terminal that can't do bold and reverse video at the same time or
+ * at all. It also can be useful to blind users, as an alternative
+ * or supplement to setting LINKS_AND_FIELDS_ARE_NUMBERED or
+ * LINKS_ARE_NUMBERED.
+ *
+ * The default defined here can be changed in lynx.cfg. It can be
+ * set and saved via the 'o'ptions menu to override the compilation
+ * and configuration defaults, and the default always can be toggled
+ * via the -show_cursor command line switch.
+ */
+#define SHOW_CURSOR FALSE
+
+/******************************
+* UNDERLINE_LINKS controls whether links are underlined by default, or shown
+* in bold. Normally this default is set from the configure script.
+*/
+#ifndef HAVE_CONFIG_H
+#define UNDERLINE_LINKS FALSE
+#endif
+
+/******************************
+* VERBOSE_IMAGES controls whether or not Lynx replaces the [LINK], [INLINE]
+* and [IMAGE] comments (for images without ALT) with filenames of these
+* images. This is extremely useful because now we can determine immediately
+* what images are just decorations (button.gif, line.gif) and what images are
+* important.
+*
+* The default defined here can be changed in lynx.cfg.
+*/
+#define VERBOSE_IMAGES TRUE
+
+/******************************
+ * BOXVERT and BOXHORI control the layout of popup menus. Set to 0 if your
+ * curses supports line-drawing characters, set to '*' or any other character
+ * to not use line-drawing (e.g., '|' for vertical and '-' for horizontal).
+ */
+#ifndef HAVE_CONFIG_H
+#ifdef DOSPATH
+#define BOXVERT 0
+#define BOXHORI 0
+#else
+#define BOXVERT '|'
+/* #define BOXVERT 0 */
+#define BOXHORI '-'
+/* #define BOXHORI 0 */
+#endif /* DOSPATH */
+#endif /* !HAVE_CONFIG_H */
+
+/******************************
+ * LY_UMLAUT controls the 7-bit expansion of characters with dieresis or
+ * umlaut. If defined, a digraph is displayed, e.g., auml --> ae
+ * Otherwise, a single character is displayed, e.g., auml --> a
+ * Note that this is currently not supported with the chartrans code,
+ * or rather it doesn't have an effect if translations for a display
+ * character set are taken from one of the *.tbl files in src/chrtrans.
+ * One would have to modify the corresponding *.tbl file to change the
+ # 7-bit replacements for these characters.
+ */
+#define LY_UMLAUT
+
+/*******************************
+ * Execution links/scripts configuration.
+ *
+ * Execution links and scripts allow you to run
+ * local programs by activating links within Lynx.
+ *
+ * An execution link is of the form:
+ *
+ * lynxexec:<COMMAND>
+ * or:
+ * lynxexec://<COMMAND>
+ * or:
+ * lynxprog:<COMMAND>
+ * or:
+ * lynxprog://<COMMAND>
+ *
+ * where <COMMAND> is a command that Lynx will run when the link is
+ * activated. The double-slash should be included if the command begins
+ * with an '@', as for executing VMS command files. Otherwise, the double-
+ * slash can be omitted.
+ * Use lynxexec for commands or scripts that generate a screen output which
+ * should be held via a prompt to press <return> before returning to Lynx
+ * for display of the current document.
+ * Use lynxprog for programs such as mail which do not require a pause before
+ * Lynx restores the display of the current document.
+ *
+ * Execution scripts take the form of a standard
+ * URL. Extension mapping or MIME typing is used
+ * to decide if the file is a script and should be
+ * executed. The current extensions are:
+ * .csh, .ksh, and .sh on UNIX systems and .com on
+ * VMS systems. Any time a file of this type is
+ * accessed Lynx will look at the user's options
+ * settings to decide if the script can be executed.
+ * Current options include: Only exec files that
+ * reside on the local machine and are referenced
+ * with a "file://localhost" URL, All execution
+ * off, and all execution on.
+ *
+ * The following definitions will add execution
+ * capabilities to Lynx. You may define none, one
+ * or both.
+ *
+ * I strongly recommend that you define neither one
+ * of these since execution links/scripts can represent
+ * very serious security risk to your system and its
+ * users. If you do define these I suggest that
+ * you only allow users to execute files/scripts
+ * that reside on your local machine.
+ *
+ * YOU HAVE BEEN WARNED!
+ *
+ * Note: if you are enabling execution scripts you should
+ * also see src/HTInit.c to verify/change the execution
+ * script extensions and/or commands.
+ */
+/* #define EXEC_LINKS */
+/* #define EXEC_SCRIPTS */
+
+#if defined(EXEC_LINKS) || defined(EXEC_SCRIPTS)
+
+/**********
+ * if ENABLE_OPTS_CHANGE_EXEC is defined, the user will be able to change
+ * the execution status within the Options Menu.
+ */
+/* #define ENABLE_OPTS_CHANGE_EXEC */
+
+/**********
+ * if NEVER_ALLOW_REMOTE_EXEC is defined,
+ * local execution of scripts or lynxexec & lynxprog URLs will be implemented
+ * only from HTML files that were accessed via a "file://localhost/" URL
+ * and the Options Menu for "Local executions links" will allow toggling
+ * only between "ALWAYS OFF" and "FOR LOCAL FILES ONLY".
+ */
+/* #define NEVER_ALLOW_REMOTE_EXEC */
+
+/*****************************
+ * These are for executable shell scripts and links.
+ * Set to FALSE unless you really know what you're
+ * doing.
+ *
+ * This only applies if you are compiling with EXEC_LINKS or
+ * EXEC_SCRIPTS defined.
+ *
+ * The first two settings:
+ * LOCAL_EXECUTION_LINKS_ALWAYS_ON
+ * LOCAL_EXECUTION_LINKS_ON_BUT_NOT_REMOTE
+ * specify the DEFAULT settings of the users execution link
+ * options (they can also be overridden in lynx.cfg), but
+ * the user may still change those options.
+ * If you do not wish the user to be able to change the
+ * execution link settings you may wish to use the command line option:
+ * -restrictions=exec_frozen
+ *
+ * LOCAL_EXECUTION_LINKS_ALWAYS_ON will be FALSE
+ * if NEVER_ALLOW_REMOTE_EXEC has been defined.
+ *
+ * if LOCAL_EXECUTION_LINKS_ALWAYS_OFF_FOR_ANONYMOUS is true,
+ * all execution links will be disabled when the -anonymous
+ * command-line option is used. Anonymous users are not allowed
+ * to change the execution options from within the Lynx Options Menu,
+ * so you might be able to use this option to enable execution links
+ * and set LOCAL_EXECUTION_LINKS_ON_BUT_NOT_REMOTE to TRUE
+ * to give anonymous execution-link capability without compromising
+ * your system (see comments about TRUSTED_EXEC rules in lynx.cfg ).
+ */
+
+#define LOCAL_EXECUTION_LINKS_ALWAYS_ON FALSE
+#define LOCAL_EXECUTION_LINKS_ON_BUT_NOT_REMOTE FALSE
+#define LOCAL_EXECUTION_LINKS_ALWAYS_OFF_FOR_ANONYMOUS FALSE
+
+#endif /* defined(EXEC_LINKS) || defined(EXEC_SCRIPTS) */
+
+/**********
+ * *** This is for those -- e.g. DOS users -- who do not have configure;
+ * *** others should use the configure switch --enable-lynxcgi-links .
+ *
+ * UNIX:
+ * =====
+ * CGI script support. Defining LYNXCGI_LINKS allows you to use the
+ *
+ * lynxcgi:path
+ *
+ * URL which allows lynx to access a cgi script directly without the need for
+ * a http daemon. Redirection is not supported but just about everything
+ * else is. If the path is not an executable file then the URL is
+ * rewritten as file://localhost and passed to the file loader. This means
+ * that if your http:html files are currently set up to use relative
+ * addressing, you should be able to fire up your main page with lynxcgi:path
+ * and everything should work as if you were talking to the http daemon.
+ *
+ * Note that TRUSTED_LYNXCGI directives must be defined in your lynx.cfg file
+ * if you wish to place restrictions on source documents and/or paths for
+ * lynxcgi links.
+ *
+ * The cgi scripts are called with a fork()/execve() sequence so you don't
+ * have to worry about people trying to abuse the code. :-)
+ *
+ * George Lindholm (George.Lindholm@ubc.ca)
+ *
+ * VMS:
+ * ====
+ * The lynxcgi scheme, if enabled, yields an informational message regardless
+ * of the path, and use of the freeware OSU DECthreads server as a local
+ * script server is recommended instead of lynxcgi URLs. Uncomment the
+ * following line to define LYNXCGI_LINKS, and when running Lynx, enter
+ * lynxcgi:advice as a G)oto URL for more information and links to the
+ * OSU server distribution.
+ */
+#ifndef HAVE_CONFIG_H
+/* #define LYNXCGI_LINKS */
+#endif
+
+/*********************************
+ * MAIL_SYSTEM_ERROR_LOGGING will send a message to the owner of
+ * the information if there is one, every time
+ * that a document cannot be accessed!
+ * This is just the default, it can be changed in lynx.cfg, and error
+ * logging can be turned off with the -nolog command line option.
+ *
+ * NOTE: This can generate A LOT of mail, be warned.
+ */
+#define MAIL_SYSTEM_ERROR_LOGGING FALSE /*mail a message for every error? */
+
+/*********************************
+ * If a document cannot be accessed, and MAIL_SYSTEM_ERROR_LOGGING
+ * is on and would send a message to the owner of the information,
+ * but no owner is known, then the message will be sent to ALERTMAIL
+ * instead - if it is defined as a non-empty email address.
+ *
+ * NOTE: This can generate A REAL LOT of mail, be warned!!!
+ */
+/* #define ALERTMAIL "webmaster@localhost" */ /*error recipient if no owner */
+
+/*********************************
+ * If CHECKMAIL is set to TRUE, the user will be informed (via a status line
+ * message) about the existence of any unread mail at startup of Lynx, and
+ * will get status line messages if subsequent new mail arrives. If a jumps
+ * file with a lynxprog URL for invoking mail is available, or your html
+ * pages include an mail launch file URL, the user thereby can access mail
+ * and read the messages.
+ * This is just the default, it can be changed in lynx.cfg. The checks and
+ * status line reports will not be performed if Lynx has been invoked with
+ * the -restrictions=mail switch.
+ *
+ * VMS USERS !!!
+ * New mail is normally broadcast as it arrives, via "unsolicited screen
+ * broadcasts", which can be "wiped" from the Lynx display via the Ctrl-W
+ * command. You may prefer to disable the broadcasts and use CHECKMAIL
+ * instead (e.g., in a public account which will be used by people who
+ * are ignorant about VMS).
+ */
+#define CHECKMAIL FALSE /* report unread and new mail messages */
+
+/*********************************
+ * Vi or Emacs movement keys. These are defaults,
+ * which can be changed in lynx.cfg , the Options Menu or .lynxrc .
+ */
+#define VI_KEYS_ALWAYS_ON FALSE /* familiar h j k l */
+#define EMACS_KEYS_ALWAYS_ON FALSE /* familiar ^N ^P ^F ^B */
+
+/*********************************
+ * DEFAULT_KEYPAD_MODE may be set to NUMBERS_AS_ARROWS
+ * or LINKS_ARE_NUMBERED
+ * or LINKS_AND_FIELDS_ARE_NUMBERED
+ * to specify whether numbers (e.g. [10]) appear before all links,
+ * allowing immediate access by entering the number on the keyboard,
+ * or numbers on the numeric key-pad work like arrows;
+ * the 3rd option causes form fields also to be preceded by numbers.
+ * The first two options (but not the last) can be changed in lynx.cfg
+ * and all three can be changed via the Options Menu.
+ */
+#define DEFAULT_KEYPAD_MODE NUMBERS_AS_ARROWS
+
+/********************************
+ * If PREVENT_KEYBOARD_WRAPAROUND is defined, using the keyboard to
+ * move past the end (or beginning) of a page results in a warning.
+ * Otherwise, such motions cause the cursor to wrap from bottom to top
+ * (or top to bottom) of page. Note that for pages which fit
+ * completely on one screen, wraparound always occurs, so this only
+ * affects multi-screen pages.
+ */
+#define PREVENT_KEYBOARD_WRAPAROUND
+
+/********************************
+ * The default search.
+ * This is a default that can be overridden in lynx.cfg or by the user!
+ */
+#define CASE_SENSITIVE_ALWAYS_ON FALSE /* case sensitive user search */
+
+/********************************
+ * If NO_DOT_FILES is set TRUE here or in lynx.cfg, the user will not be
+ * allowed to specify files beginning with a dot in reply to output filename
+ * prompts, and files beginning with a dot (e.g., file://localhost/foo/.lynxrc)
+ * will not be included in the directory browser's listings. The setting here
+ * will be overridden by the setting in lynx.cfg. If FALSE, you can force it
+ * to be treated as TRUE via -restrictions=dotfiles (or -anonymous, which sets
+ * this and most other restrictions).
+ *
+ * If it is FALSE at startup of Lynx, the user can regulate it via the
+ * 'o'ptions menu, and may save the preference in the RC file.
+ */
+#define NO_DOT_FILES TRUE /* disallow access to dot files */
+
+/********************************
+ * If MAKE_LINKS_FOR_ALL_IMAGES is TRUE, all images will be given links
+ * which can be ACTIVATEd. For inlines, the ALT or pseudo-ALT ("[INLINE]")
+ * strings will be links for the resolved SRC rather than just text. For
+ * ISMAP or other graphic links, the ALT or pseudo-ALT ("[ISMAP]" or "[LINK]")
+ * strings will have '-' and a link labeled "[IMAGE]" for the resolved SRC
+ * appended. See also VERBOSE_IMAGES flag.
+ *
+ * The default defined here can be changed in lynx.cfg, and the user can
+ * use LYK_IMAGE_TOGGLE to toggle the feature on or off at run time.
+ *
+ * The default also can be toggled via an "-image_links" command line switch.
+ */
+#define MAKE_LINKS_FOR_ALL_IMAGES FALSE /* inlines cast to links */
+
+/********************************
+ * If MAKE_PSEUDO_ALTS_FOR_INLINES is FALSE, inline images which do not
+ * specify an ALT string will not have "[INLINE]" inserted as a pseudo-ALT,
+ * i.e., they'll be treated as having ALT="". If MAKE_LINKS_FOR_ALL_IMAGES
+ * is defined or toggled to TRUE, however, the pseudo-ALTs will be created
+ * for inlines, so that they can be used as links to the SRCs.
+ * See also VERBOSE_IMAGES flag.
+ *
+ * The default defined here can be changed in lynx.cfg, and the user can
+ * use LYK_INLINE_TOGGLE to toggle the feature on or off at run time.
+ *
+ * The default also can be toggled via a "-pseudo_inlines" command line
+ * switch.
+ */
+#define MAKE_PSEUDO_ALTS_FOR_INLINES TRUE /* Use "[INLINE]" pseudo-ALTs */
+
+/********************************
+ * If SUBSTITUTE_UNDERSCORES is TRUE, the _underline_ format will be used
+ * for emphasis tags in dumps.
+ *
+ * The default defined here can be changed in lynx.cfg, and the user can
+ * toggle the default via a "-underscore" command line switch.
+ */
+#define SUBSTITUTE_UNDERSCORES FALSE /* Use _underline_ format in dumps */
+
+/********************************
+ * If QUIT_DEFAULT_YES is defined as TRUE then when the QUIT command
+ * is entered, any response other than n or N will confirm. Define it
+ * as FALSE if you prefer the more conservative action of requiring an
+ * explicit Y or y to confirm. The default defined here can be changed
+ * in lynx.cfg.
+ */
+#define QUIT_DEFAULT_YES TRUE
+
+/********************************
+ * If TEXT_SUBMIT_CONFIRM_WANTED is defined (to anything), the user will be
+ * prompted for confirmation before Lynx submits a form with only one input
+ * field (of type text) to the server, after the user has pressed <return>
+ * or <enter> on the field. Since the is no other way such as a "submit"
+ * button to submit, normally the form gets submitted automatically in this
+ * case, but some users may find this surprising and expect <return> to just
+ * move to the next link as for other text entry fields.
+ */
+/* #define TEXT_SUBMIT_CONFIRM_WANTED */
+
+/********************************
+ * If TEXTFIELDS_MAY_NEED_ACTIVATION is defined (to anything),
+ * the option TEXTFIELDS_NEED_ACTIVATION in lynx.cfg or the command
+ * line option -tna can be used to require explicit activation
+ * before text input fields can be changed with the built-in line
+ * editor.
+ */
+
+#define TEXTFIELDS_MAY_NEED_ACTIVATION
+
+/********************************
+ * The following three definitions control some aspects of extended
+ * textarea handling. TEXTAREA_EXPAND_SIZE is the number of new empty
+ * lines that get appended at the end of a textarea by a GROWTEXTAREA
+ * key. If TEXTAREA_AUTOGROW is defined (to anything), <return> or
+ * <enter> in the last line of a textarea automatically extends the
+ * area by adding a new line. If TEXTAREA_AUTOEXTEDIT is defined (to
+ * anything), a key mapped to DWIMEDIT will invoke the external editor
+ * like EDITTEXTAREA when used in a text input field. Comment those
+ * last two definitions out to disable the corresponding behavior.
+ * See under KEYMAP in lynx.cfg for mapping keys to GROWTEXTAREA or
+ * DWIMEDIT actions.
+ */
+#define TEXTAREA_EXPAND_SIZE 5
+#define TEXTAREA_AUTOGROW
+#define TEXTAREA_AUTOEXTEDIT
+
+/********************************
+ * If BUILTIN_SUFFIX_MAPS is defined (to anything), default mappings
+ * for file extensions (aka suffixes) will be compiled in (see
+ * src/HTInit.c). By removing the definition, the default mappings
+ * are suppressed except for a few very basic ones for text/html.
+ * See GLOBAL_EXTENSION_MAP, PERSONAL_EXTENSION_MAP above and SUFFIX,
+ * SUFFIX_ORDER in lynx.cfg for other ways to map file extensions.
+ */
+
+#define BUILTIN_SUFFIX_MAPS
+
+/********************************
+ * These definitions specify files created or used in conjunction
+ * with traversals. See CRAWL.ANNOUNCE for more information.
+ */
+#define TRAVERSE_FILE "traverse.dat"
+#define TRAVERSE_FOUND_FILE "traverse2.dat"
+#define TRAVERSE_REJECT_FILE "reject.dat"
+#define TRAVERSE_ERRORS "traverse.errors"
+
+/****************************************************************
+ * The LYMessages_en.h header defines default, English strings
+ * used in status line prompts, messages, and warnings during
+ * program execution. See the comments in LYMessages_en.h for
+ * information on translating or customizing them for your site.
+ */
+#ifndef LYMESSAGES_EN_H
+#include <LYMessages_en.h>
+#endif /* !LYMESSAGES_EN_H */
+
+/****************************************************************
+ * DEFAULT_VISITED_LINKS may be set to one or more of
+ * VISITED_LINKS_AS_FIRST_V
+ * VISITED_LINKS_AS_TREE
+ * VISITED_LINKS_AS_LATEST
+ * VISITED_LINKS_REVERSE
+ * to change the organization of the Visited Links page.
+ *
+ * (Not all combinations are meaningful; see src/LYrcFile.c for a list
+ * in the visited_links_tbl table).
+ */
+#define DEFAULT_VISITED_LINKS (VISITED_LINKS_AS_LATEST | VISITED_LINKS_REVERSE)
+
+/****************************************************************
+ * If USE_CACHEJAR is set to TRUE the user will be able to view,
+ * access and delete cached documents in current lynx session.
+ */
+#ifndef USE_CACHEJAR
+/* #define USE_CACHEJAR TRUE */
+#endif
+
+/****************************************************************
+ * If USE_SESSIONS is set to TRUE the user will be able to save,
+ * resume and in general manipulate with lynx sessions.
+ */
+#ifndef USE_SESSIONS
+/* #define USE_SESSIONS TRUE */
+#endif
+
+#define MAX_SESSIONS 10000
+
+/*
+ * If USE_SESSIONS is TRUE you may tune it fine how it will work:
+ */
+#define GOTOURL_IN_SESSION /* Allow to save goto url */
+#define GOTOURL_OUT_SESSION /* Allow to restore goto url */
+#define HISTORY_IN_SESSION /* Allow to save history */
+#define HISTORY_OUT_SESSION /* Allow to restore history */
+#define SEARCH_IN_SESSION /* Allow to save search string */
+#define SEARCH_OUT_SESSION /* Allow to restore search string */
+#define VLINK_IN_SESSION /* Allow to save visited link */
+#define VLINK_OUT_SESSION /* Allow to restore visited link */
+
+/****************************************************************
+ * The STATUSBUFSIZE defines how many entries will be stored in
+ * cyclic buffer of statusline messages. This is specially useful
+ * for users who use lynx on a terminal with more than 40 lines.
+ */
+/* #define STATUSBUFSIZE 90 */
+
+/****************************************************************
+ * If USE_PROGRESSBAR is TRUE the user will be able to set
+ * download progress as odometer(thermometer) display, ie:
+ *
+ * 80% IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
+ *
+ */
+/* #define USE_PROGRESSBAR TRUE */
+
+/****************************************************************
+ * Section 3. Things that you should not change until you
+ * have a good knowledge of the program
+ */
+
+#define LYNX_NAME "Lynx"
+/* The strange-looking comments on the next line tell PRCS to replace
+ * the version definition with the Project Version on checkout. Just
+ * ignore it. - kw */
+/* $Format: "#define LYNX_VERSION \"$ProjectVersion$\""$ */
+#define LYNX_VERSION "2.9.0dev.12"
+#define LYNX_WWW_HOME "https://lynx.invisible-island.net/"
+#define LYNX_WWW_DIST "https://lynx.invisible-island.net/current/"
+/* $Format: "#define LYNX_DATE \"$ProjectDate$\""$ */
+#define LYNX_DATE "Mon, 02 Jan 2023 18:47:08 -0500"
+#define LYNX_DATE_OFF 5 /* truncate the automatically-generated date */
+#define LYNX_DATE_LEN 11 /* truncate the automatically-generated date */
+
+#ifdef UNICODE
+#define W32_STRING(s) L##s
+#else
+#define W32_STRING(s) s
+#endif
+
+/* default, for generated files such as bookmarks */
+#define LYNX_DOCTYPE "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n"
+
+/* registry-key for Windows installer */
+#define LYNX_SUBKEY W32_STRING("Software\\Lynx")
+
+#define LINESIZE 1024 /* max length of line to read from file */
+#define MAXLINKS 1024 /* max links on one screen */
+
+#ifndef SEARCH_GOAL_LINE
+#define SEARCH_GOAL_LINE 4 /* try to position search target there */
+#endif
+
+#define MAXCHARSETS 60 /* max character sets supported */
+#define TRST_MAXROWSPAN 200 /* max rowspan accepted by TRST code */
+#define TRST_MAXCOLSPAN 200 /* max colspan and COL/COLGROUP span accepted */
+#define MAX_TABLE_ROWS 200 /* max rows for tables */
+#define MAX_TABLE_COLS 200 /* max cols for tables */
+#define SAVE_TIME_NOT_SPACE /* minimize number of some malloc calls */
+
+/* Win32 may support more, but old win16 helper apps may not. */
+#if defined(__DJGPP__) || defined(_WINDOWS)
+#define FNAMES_8_3
+#endif
+
+#ifdef FNAMES_8_3
+#define HTML_SUFFIX ".htm"
+#else
+#define HTML_SUFFIX ".html"
+#endif
+
+#ifndef FNAME_LYNXRC
+#ifdef FNAMES_8_3
+#define FNAME_LYNXRC "lynx.rc"
+#else
+#define FNAME_LYNXRC ".lynxrc"
+#endif /* FNAMES_8_3 */
+#endif
+
+#ifndef FNAME_LYNX_COOKIES
+#ifdef FNAMES_8_3
+#define FNAME_LYNX_COOKIES "cookies"
+#else
+#define FNAME_LYNX_COOKIES ".lynx_cookies"
+#endif /* FNAMES_8_3 */
+#endif
+
+#ifndef FNAME_LYNX_TRACE
+#ifdef FNAMES_8_3
+#define FNAME_LYNX_TRACE "LY-TRACE.LOG"
+#else
+#define FNAME_LYNX_TRACE "Lynx.trace"
+#endif /* FNAMES_8_3 */
+#endif
+
+#ifndef BLAT_MAIL
+#define BLAT_MAIL "blat"
+#endif
+
+#ifndef ALTBLAT_MAIL
+#define ALTBLAT_MAIL "blatj"
+#endif
+
+#define BIN_SUFFIX ".bin"
+#define TEXT_SUFFIX ".txt"
+
+#ifdef VMS
+/*
+** Use the VMS port of gzip for uncompressing both .Z and .gz files.
+*/
+#define UNCOMPRESS_PATH "gzip -d"
+#define COPY_PATH "copy/nolog/noconf"
+#define GZIP_PATH "gzip"
+#define BZIP2_PATH "bzip2"
+#define TELNET_PATH "telnet"
+#define TN3270_PATH "tn3270"
+#define RLOGIN_PATH "rlogin"
+
+#else
+
+#ifdef DOSPATH
+
+/*
+ * Define this to setup feature that uses directory of lynx.exe to locate
+ * associated configuration files.
+#define USE_PROGRAM_DIR 1
+ */
+
+#ifdef _WINDOWS
+
+#ifndef USE_BLAT_MAILER
+#define USE_BLAT_MAILER 1
+#endif
+
+#ifndef LYNX_CFG_PATH
+#define LYNX_CFG_PATH "."
+#endif
+
+#else
+/* have to define something... */
+#undef SYSTEM_MAIL
+#define SYSTEM_MAIL "sendmail"
+#define SYSTEM_MAIL_FLAGS "-t -oi"
+#endif /* _WINDOWS */
+
+/*
+** The following executables may be used at run time. Unless you change
+** the definitions to include the full directories, they will be sought
+** from your PATH at run-time; they should be available as "cp.exe",
+** "mv.exe" and so on. To get those programs look for GNU-port stuff
+** elsewhere.
+** Currently, if compiled with -DUSE_ZLIB and without -DDIRED_SUPPORT
+** (default), the following from the list below are required:
+** MV_PATH (mv.exe) - for bookmark handling (DEL_BOOKMARK command)
+** UNCOMPRESS_PATH - for automatic decompression of files in Unix
+** compress format
+** TELNET_PATH, TN3270_PATH, RLOGIN_PATH - for access to "telnet:",
+** "tn3270:", and "rlogin:" URLs.
+** If they are not defined right, the corresponding operations may fail
+** in unexpected and obscure ways!
+**
+** WINDOWS/DOS
+** ===========
+*/
+#ifndef HAVE_CONFIG_H
+#define COMPRESS_PATH "compress"
+#define UNCOMPRESS_PATH "uncompress"
+#define UUDECODE_PATH "uudecode"
+#define ZCAT_PATH "zcat"
+#define GZIP_PATH "gzip"
+#define BZIP2_PATH "bzip2"
+#define MV_PATH "mv"
+#define INSTALL_PATH "install"
+#define TAR_PATH "tar"
+#define ZIP_PATH "zip"
+#define UNZIP_PATH "unzip"
+#define RM_PATH "rm"
+#define TELNET_PATH "telnet"
+#define TN3270_PATH "tn3270"
+#define RLOGIN_PATH "rlogin"
+
+/* see src/LYLocal.c for these */
+#define TAR_UP_OPTIONS "-cf"
+#define TAR_DOWN_OPTIONS "-xf"
+#define TAR_PIPE_OPTIONS "-"
+#define TAR_FILE_OPTIONS ""
+
+/*
+ * These are not used:
+ * #define COPY_PATH "cp"
+ * #define CHMOD_PATH "chmod"
+ * #define MKDIR_PATH "mkdir"
+ * #define TOUCH_PATH "touch"
+ */
+#endif /* HAVE_CONFIG_H */
+
+#else /* Unix */
+ /* Standard locations are defined via the configure script. When
+ * helper applications are in your home directory or other nonstandard
+ * locations, you probably will have to preset the path to them with
+ * environment variables (see INSTALLATION, Section II-1d).
+ */
+#endif /* DOSPATH */
+#endif /* VMS */
+
+/*****************************
+ * I have not ported multibyte support for EBCDIC. In fact, some multibyte
+ * code in LYLowerCase() crashes on EBCDIC strings. -- gil
+ */
+#if ! defined(NOT_ASCII)
+/*****************************
+ * SUPPORT_MULTIBYTE_EDIT provides better support of CJK characters to
+ * Lynx's Line Editor. JIS X0201 Kana is partially supported. The
+ * reason why I didn't support it fully is I think supporting it is not
+ * required so much and I don't have an environment to test it. - TH
+ */
+#define SUPPORT_MULTIBYTE_EDIT
+#endif /* ! defined(NOT_ASCII) */
+
+/*****************************
+ * SUPPORT_CHDIR provides CD command (bound to 'C' by default). It allows
+ * changing directory to arbitrary location (if OS allows them). If dired is
+ * enabled, user will be able to visit any directory and view any file allowed
+ * according to file permissions or ACLs.
+ */
+#define SUPPORT_CHDIR
+
+/*****************************
+ * MARK_HIDDEN_LINKS controls whether hidden links are shown with the title
+ * set by the HIDDEN_LINK_MARKER string in lynx.cfg
+ */
+#define MARK_HIDDEN_LINKS
+
+/*****************************
+ * USE_TH_JP_AUTO_DETECT and KANJI_CODE_OVERRIDE are the macros
+ * for Japanese. - TH
+ */
+/*****************************
+ * USE_TH_JP_AUTO_DETECT enables a new Japanese charset detection routine.
+ * With the old detection strategy, Lynx always thought a document was
+ * written in mixture of three kanji codes (JIS, EUC and SJIS). The new
+ * strategy is for Lynx to first assume the document is written in one code
+ * or JIS + one other kanji code (JIS, EUC, SJIS, EUC+JIS and SJIS+JIS).
+ * The first assumption is usually correct, but if the assumption is wrong,
+ * Lynx falls back to the old assumption of the three kanji codes mixed.
+ */
+#define USE_TH_JP_AUTO_DETECT
+
+/*****************************
+ * Uncomment the following line to enable the kanji code override routine.
+ * The code can be changed by pressing ^L. More precisely, this allows
+ * the user to override the assumption about the kanji code for the document
+ * which Lynx has made on the basis of a META tag and HTTP response.
+ */
+/*#define KANJI_CODE_OVERRIDE */
+
+/**************************
+ * SSL_CERT_FILE contains valid SSL CA certificates. Set this to a string
+ * to provide a runtime default value.
+ */
+#define SSL_CERT_FILE NULL
+
+/****************************************************************
+ * Section 4. Things you MUST check only if you plan to use Lynx
+ * in an anonymous account (allow public access to Lynx).
+ * This section may be skipped by those people building
+ * Lynx for private use only.
+ *
+ */
+
+/*****************************
+ * Enter the name of your anonymous account if you have one
+ * as ANONYMOUS_USER. UNIX systems will use a cuserid
+ * or get_login call to determine if the current user is
+ * the ANONYMOUS_USER. VMS systems will use getenv("USER").
+ *
+ * You may use the "-anonymous" option for multiple accounts,
+ * or for precautionary reasons in the anonymous account, as well.
+ *
+ * Specify privileges for the anonymous account below.
+ *
+ * It is very important to have this correctly defined or include
+ * the "-anonymous" command line option for invocation of Lynx
+ * in an anonymous account! If you do not you will be putting
+ * yourself at GREAT security risk!
+ */
+#define ANONYMOUS_USER ""
+
+/*******************************
+ * In the following four pairs of defines,
+ * INSIDE_DOMAIN means users connecting from inside your local domain,
+ * OUTSIDE_DOMAIN means users connecting from outside your local domain.
+ *
+ * set to FALSE if you don't want users of your anonymous
+ * account to be able to telnet back out
+ */
+#define CAN_ANONYMOUS_INSIDE_DOMAIN_TELNET TRUE
+#define CAN_ANONYMOUS_OUTSIDE_DOMAIN_TELNET FALSE
+
+/*******************************
+ * set to FALSE if you don't want users of your anonymous
+ * account to be able to use ftp
+ */
+#define CAN_ANONYMOUS_INSIDE_DOMAIN_FTP TRUE
+#define CAN_ANONYMOUS_OUTSIDE_DOMAIN_FTP FALSE
+
+/*******************************
+ * set to FALSE if you don't want users of your anonymous
+ * account to be able to use rlogin
+ */
+#define CAN_ANONYMOUS_INSIDE_DOMAIN_RLOGIN TRUE
+#define CAN_ANONYMOUS_OUTSIDE_DOMAIN_RLOGIN FALSE
+
+/*******************************
+ * set to FALSE if you don't want users of your anonymous
+ * account to be able to read news OR post news articles.
+ * These flags apply to "news", "nntp", "newspost", and "newsreply"
+ * URLs, but not to "snews", "snewspost", or "snewsreply"
+ * in case they are supported.
+ */
+#define CAN_ANONYMOUS_INSIDE_DOMAIN_READ_NEWS TRUE
+#define CAN_ANONYMOUS_OUTSIDE_DOMAIN_READ_NEWS FALSE
+
+/*******************************
+ * set to FALSE if you don't want users of your anonymous
+ * account to be able to goto random URLs. (The 'g' command)
+ */
+#define CAN_ANONYMOUS_GOTO TRUE
+
+/*******************************
+ * set to FALSE if you don't want users of your anonymous
+ * account to be able to goto particular URLs.
+ */
+#define CAN_ANONYMOUS_GOTO_BIBP TRUE /* BIBP maps to HTTP */
+#define CAN_ANONYMOUS_GOTO_CSO FALSE
+#define CAN_ANONYMOUS_GOTO_FILE FALSE
+#define CAN_ANONYMOUS_GOTO_FINGER TRUE
+#define CAN_ANONYMOUS_GOTO_FTP FALSE
+#define CAN_ANONYMOUS_GOTO_GOPHER FALSE
+#define CAN_ANONYMOUS_GOTO_HTTP TRUE
+#define CAN_ANONYMOUS_GOTO_HTTPS FALSE
+#define CAN_ANONYMOUS_GOTO_LYNXCGI FALSE
+#define CAN_ANONYMOUS_GOTO_LYNXEXEC FALSE
+#define CAN_ANONYMOUS_GOTO_LYNXPROG FALSE
+#define CAN_ANONYMOUS_GOTO_MAILTO TRUE
+#define CAN_ANONYMOUS_GOTO_NEWS FALSE
+#define CAN_ANONYMOUS_GOTO_NNTP FALSE
+#define CAN_ANONYMOUS_GOTO_RLOGIN FALSE
+#define CAN_ANONYMOUS_GOTO_SNEWS FALSE
+#define CAN_ANONYMOUS_GOTO_TELNET FALSE
+#define CAN_ANONYMOUS_GOTO_TN3270 FALSE
+#define CAN_ANONYMOUS_GOTO_WAIS TRUE
+
+/*******************************
+ * set to FALSE if you don't want users of your anonymous
+ * account to be able to specify a port in 'g'oto commands
+ * for telnet URLs.
+ */
+#define CAN_ANONYMOUS_GOTO_TELNET_PORT FALSE
+
+/*******************************
+ * set to FALSE if you don't want users of your anonymous
+ * account to be able to jump to URLs (The 'J' command)
+ * via the shortcut entries in your JUMPFILE.
+ */
+#define CAN_ANONYMOUS_JUMP FALSE
+
+/*******************************
+ * set to FALSE if you don't want users of your anonymous
+ * account to be able to mail
+ */
+#define CAN_ANONYMOUS_MAIL TRUE
+
+/*******************************
+ * set to FALSE if you don't want users of your anonymous
+ * account to be able to print
+ */
+#define CAN_ANONYMOUS_PRINT FALSE
+
+/*******************************
+ * set to FALSE if users with anonymous restrictions should
+ * not be able to view configuration file (lynx.cfg) info
+ * via special LYNXCFG: links. (This does not control access
+ * to lynx.cfg as a normal file, e.g., through a "file:" URL,
+ * if other restrictions allow that.)
+ */
+#define CAN_ANONYMOUS_VIEW_LYNXCFG_INFO FALSE
+
+/*******************************
+ * set to FALSE if users with anonymous restrictions should
+ * not be able to view extended configuration file (lynx.cfg)
+ * info @@@ or perform special config info functions (reloading
+ * at run-time) via special LYNXCFG: links @@@. This only applies
+ * if the lynxcfg_info" restriction controlled by the previous
+ * item is not in effect and if Lynx has been compiled without
+ * NO_CONFIG_INFO defined (--disable-config-info wasn't used
+ * if Lynx was built with the autoconf configure script).
+ * The extended info may include details on configuration file
+ * names and location and links for reading the files, as well
+ * as information on nesting of included configuration files.
+ */
+#define CAN_ANONYMOUS_VIEW_LYNXCFG_EXTENDED_INFO FALSE
+
+/*******************************
+ * set to FALSE if users with anonymous restrictions should
+ * not be able to view information on compile time configuration
+ * via special LYNXCOMPILEOPTS: links. This only applies
+ * if the autoconf configure script was used to build Lynx
+ * AND --disable-config-info wasn't used, otherwise this
+ * special URL scheme isn't recognized anyway.
+ */
+#define CAN_ANONYMOUS_VIEW_COMPILEOPTS_INFO FALSE
+
+/*******************************
+ * set to FALSE if you don't want users of your anonymous
+ * account to be able to 'g'oto special URLs for showing
+ * configuration info (LYNXCFG: and LYNXCOMPILEOPTS:) if
+ * they are otherwise allowed.
+ */
+#define CAN_ANONYMOUS_GOTO_CONFIGINFO FALSE
+
+/*****************************
+ * Be sure you have read about and set defines above in Sections
+ * 1, 2 and 3 that could affect Lynx in an anonymous account,
+ * especially LOCAL_EXECUTION_LINKS_ALWAYS_OFF_FOR_ANONYMOUS.
+ *
+ * This ends the section specific to anonymous accounts.
+ */
+
+/*****************************
+ * These can be uncommented to get more detail when debugging changes to
+ * the color-style and layout logic.
+ */
+/*#define DEBUG_APPCH 1*/
+/*#define DEBUG_STYLE 1*/
+
+#ifdef DEBUG_STYLE
+#define CTRACE_STYLE(p) CTRACE2(TRACE_STYLE, p)
+#else
+#define CTRACE_STYLE(p) /* nothing */
+#endif
+
+/* #define DEBUG_SPLITLINE */
+
+#ifdef DEBUG_SPLITLINE
+#define CTRACE_SPLITLINE(p) CTRACE(p)
+#else
+#define CTRACE_SPLITLINE(p) /*nothing */
+#endif
+
+#endif /* USERDEFS_H */